ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vY29yZXNpZ2h0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vY29yZXNpZ2h0LnR4dAppbmRleCBkNGEzNTJiLi4xODM4NmFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2NvcmVzaWdodC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jb3Jlc2lnaHQudHh0CkBAIC0zOSw2ICszOSw4IEBACiAKIAkJLSBTeXN0ZW0gVHJhY2UgTWFjcm9jZWxsOgogCQkJImFybSxjb3Jlc2lnaHQtc3RtIiwgImFybSxwcmltZWNlbGwiOyBbMV0KKwkJLSBUcmlnZ2VyIEdlbmVyYXRpb24gVW5pdDoKKwkJCSAiYXJtLHByaW1lY2VsbCI7CiAKIAkqIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyCiAJICBzZXQocykgb2YgdGhlIGNvbXBvbmVudC4KQEAgLTg2LDYgKzg4LDE2IEBACiAKIAkqIHFjb20sZHVtbXktc2luazogQ29uZmlndXJlIHRoZSBkZXZpY2UgYXMgc2luay4KIAorKiBBZGRpdGlvbmFsIHJlcXVpcmVkIHByb3BlcnR5IGZvciBjb3Jlc2lnaHQtdGd1IGRldmljZXM6CisJKiB0Z3Utc3RlcHM6IG11c3QgYmUgcHJlc2VudC4gSW5kaWNhdGVzIG51bWJlciBvZiBzdGVwcyBzdXBwb3J0ZWQKKwkgIGJ5IHRoZSBUR1UuCisJKiB0Z3UtY29uZGl0aW9uczogbXVzdCBiZSBwcmVzZW50LiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb25kaXRpb25zCisJICBzdXBwb3J0ZWQgYnkgdGhlIFRHVS4KKwkqIHRndS1yZWdzOiBtdXN0IGJlIHByZXNlbnQuIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHJlZ3Mgc3VwcG9ydGVkCisJICBieSB0aGUgVEdVLgorCSogdGd1LXRpbWVyLWNvdW50ZXJzOiBtdXN0IGJlIHByZXNlbnQuIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHRpbWVycyBhbmQKKwkgIGNvdW50ZXJzIGF2YWlsYWJsZSBpbiB0aGUgVEdVIHRvIGRvIGEgY29tcGFyaXNpb24uCisKICogT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgYWxsIGNvbXBvbmVudHM6CiAJKiByZWctbmFtZXM6IG5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCByZWcgcHJvcGVydHkgdmFsdWUuCiAKQEAgLTM4OCw3ICs0MDAsNyBAQAogCQl9OwogCX07CiAKLTQuIENUSXMKKzUuIENUSXMKIAljdGkwOiBjdGlANjAxMDAwMCB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiLCAiYXJtLHByaW1lY2VsbCI7CiAJCXJlZyA9IDwweDYwMTAwMDAgMHgxMDAwPjsKQEAgLTQwMCw1ICs0MTIsMjEgQEAKIAkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOwogCX07CiAKKzYuIFRHVXMKKwlpcGNiX3RndTogdGd1QDZiMGMwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5OTk+OworCQlyZWcgPSA8MHgwNkIwQzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidGd1LWJhc2UiOworCQl0Z3Utc3RlcHMgPSA8Mz47CisJCXRndS1jb25kaXRpb25zID0gPDQ+OworCQl0Z3UtcmVncyA9IDw0PjsKKwkJdGd1LXRpbWVyLWNvdW50ZXJzID0gPDg+OworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10Z3UtaXBjYiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKIFsxXS4gVGhlcmUgaXMgY3VycmVudGx5IHR3byB2ZXJzaW9uIG9mIFNUTTogU1RNMzIgYW5kIFNUTTUwMC4gIEJvdGgKIGhhdmUgdGhlIHNhbWUgSFcgaW50ZXJmYWNlIGFuZCBhcyBzdWNoIGRvbid0IG5lZWQgYW4gZXhwbGljaXQgYmluZGluZyBuYW1lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tc20vaW1lbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9pbWVtLnR4dAppbmRleCBlYWE3MTQ2Yi4uNDQwNjI4ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tc20vaW1lbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tc20vaW1lbS50eHQKQEAgLTQ2LDYgKzQ2LDEyIEBACiAtY29tcGF0aWJsZTogInFjb20sbXNtLWltZW0tcmVzdGFydF9yZWFzb24KIC1yZWc6IHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgb2YgcmVzdGFydF9yZWFzb24gcmVnaW9uIGluIGltZW0KIAorRG93bmxvYWQgTW9kZSBUeXBlOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorUmVxdWlyZWQgcHJvcGVydGllczoKKy1jb21wYXRpYmxlOiAicWNvbSxtc20taW1lbS1kbG9hZC10eXBlIgorLXJlZzogc3RhcnQgYWRkcmVzcyBhbmQgc2l6ZSBvZiBkbG9hZCB0eXBlIHJlZ2lvbiBpbiBpbWVtCisKIERvd25sb2FkIE1vZGU6CiAtLS0tLS0tLS0tLS0tLQogUmVxdWlyZWQgcHJvcGVydGllczoKQEAgLTY3LDYgKzczLDExIEBACiBNZW1vcnkgcmVnaW9uIHVzZWQgdG8gc3RvcmUgVVNCIFBJRCBhbmQgc2VyaWFsIG51bWJlcnMgdG8gYmUgdXNlZCBieQogYm9vdGxvYWRlciBpbiBkb3dubG9hZCBtb2RlLgogCitTU1IgTWluaWR1bXAgT2Zmc2V0CistLS0tLS0tLS0tLS0tLS0tLS0tCistQ29tcGF0aWJsZTogInFjb20sbXNtLWltZW0tbWluaWR1bXAiCistcmVnOiBzdGFydCBhZGRyZXNzIGFuZCBzaXplIG9mIHNzciBpbWVtIHJlZ2lvbgorCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLWNvbXBhdGlibGU6ICJxY29tLG1zbS1pbWVtLWRpYWctZGxvYWQiCiAtcmVnOiBzdGFydCBhZGRyZXNzIGFuZCBzaXplIG9mIFVTQiBEaWFnIGRvd25sb2FkIG1vZGUgcmVnaW9uIGluIGltZW0KQEAgLTExNSw0ICsxMjYsOSBAQAogCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1pbWVtLWVtZXJnZW5jeV9kb3dubG9hZF9tb2RlIjsKIAkJCXJlZyA9IDwweGZlMCAxMj47CiAJCX07CisKKwkJc3NfbWR1bXBAYjg4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taW1lbS1taW5pZHVtcCI7CisJCQlyZWcgPSA8MHhiODggMjg+OworCQl9OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9qdGFnLW1tLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbXNtL2p0YWctbW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTdkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9qdGFnLW1tLnR4dApAQCAtMCwwICsxLDMyIEBACisqIEpUQUctTU0KKworVGhlIGp0YWctbW0gZW50cnkgc3BlY2lmaWVzIHRoZSBtZW1vcnkgbWFwcGVkIGFkZHJlc3NlcyBmb3IgdGhlIGRlYnVnIGFuZCBFVE0KK3JlZ2lzdGVycy4gVGhlIGp0YWctbW0gZHJpdmVyIHVzZXMgdGhlc2UgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgcmVnaXN0ZXJzCit1c2luZyBtZW1vcnkgbWFwcGVkIGFjY2VzcyBkdXJpbmcgcG93ZXIgY29sbGFwc2Ugc28gYXMgdG8gcmV0YWluIHRoZWlyIHN0YXRlCithY3Jvc3MgcG93ZXIgY29sbGFwc2UuIFRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgY3AxNCBhY2Nlc3MgdG8gdGhlIHJlZ2lzdGVycworaXMgbm90IHBlcm1pdHRlZC4KKworUmVxdWlyZWQgUHJvcGVydGllczoKK2NvbXBhdGlibGU6IGNvbXBvbmVudCBuYW1lIHVzZWQgZm9yIGRyaXZlciBtYXRjaGluZywgc2hvdWxkIGJlOgorCSJxY29tLGp0YWctbW0iCQktIGZvciBqdGFnLW1tIGRldmljZQorCSJxY29tLGp0YWd2OC1tbSIJLSBmb3IganRhZ3Y4LW1tIGRldmljZSBzdXBwb3J0aW5nIEFSTXY4IHRhcmdldHMKKworCXJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldAorCXJlZy1uYW1lczogc2hvdWxkIGJlICJldG0tYmFzZSIgZm9yIGV0bSByZWdpc3RlciBzZXQgYW5kICJkZWJ1Zy1iYXNlIgorCQkgICBmb3IgZGVidWcgcmVnaXN0ZXIgc2V0LgorCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHU6IHNwZWNpZmllcyBwaGFuZGxlIGZvciB0aGUgY3B1IGFzc29jaWF0ZWQKKwkJCQkgICB3aXRoIHRoZSBqdGFnLW1tIGRldmljZQorCXFjb20sc2ktZW5hYmxlIDogYm9vbGVhbiwgaW5kaWNhdGluZyBldG0gc2F2ZSBhbmQgcmVzdG9yZSBpcworCQkJIHN1cHBvcnRlZCB2aWEgc3lzdGVtIGluc3RydWN0aW9ucworCXFjb20sc2F2ZS1yZXN0b3JlLWRpc2FibGUgOiBib29sZWFuLCB0byBkaXNhYmxlIGV0bSBzYXZlIGFuZCByZXN0b3JlCisJCQkJICAgIGZ1bmN0aW9uYWxpdHkKKworRXhhbXBsZToKK2p0YWdfbW06IGp0YWdtbUBmYzMzMjAwMCB7CisJY29tcGF0aWJsZSA9ICJxY29tLGp0YWctbW0iOworCXJlZyA9IDwweGZjMzMyMDAwIDB4MTAwMD4sCisJCTwweGZjMzMzMDAwIDB4MTAwMD47CisJcmVnLW5hbWVzID0gImV0bS1iYXNlIiwiZGVidWctYmFzZSI7CisKKwlxY29tLGNvcmVzaWdodC1qdGFnbW0tY3B1ID0gPCZDUFUwPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9tc20udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tc20vbXNtLnR4dAppbmRleCA3NmI2MTQxLi43NjViNWU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9tc20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbXNtL21zbS50eHQKQEAgLTkyLDYgKzkyLDEyIEBACiAtIFNETTY3MAogICBjb21wYXRpYmxlID0gInFjb20sc2RtNjcwIgogCistIFFDUzYwNQorICBjb21wYXRpYmxlID0gInFjb20scWNzNjA1IgorCistIFNEQTY3MAorICBjb21wYXRpYmxlID0gInFjb20sc2RhNjcwIgorCiAtIE1TTTg5NTIKICAgY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NTIiCiAKQEAgLTI3MCw5ICsyNzYsMTYgQEAKIGNvbXBhdGlibGUgPSAicWNvbSxzZG04NDUtbXRwIgogY29tcGF0aWJsZSA9ICJxY29tLHNkbTg0NS1xcmQiCiBjb21wYXRpYmxlID0gInFjb20sc2RtODQ1LXF2ciIKK2NvbXBhdGlibGUgPSAicWNvbSxzZGE4NDUtY2RwIgorY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NS1tdHAiCitjb21wYXRpYmxlID0gInFjb20sc2RhODQ1LXFyZCIKIGNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtcnVtaSIKIGNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtY2RwIgogY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiCitjb21wYXRpYmxlID0gInFjb20scWNzNjA1LWNkcCIKK2NvbXBhdGlibGUgPSAicWNvbSxxY3M2MDUtbXRwIgorY29tcGF0aWJsZSA9ICJxY29tLHNkYTY3MC1jZHAiCitjb21wYXRpYmxlID0gInFjb20sc2RhNjcwLW10cCIKIGNvbXBhdGlibGUgPSAicWNvbSxtc204OTUyLXJ1bWkiCiBjb21wYXRpYmxlID0gInFjb20sbXNtODk1Mi1zaW0iCiBjb21wYXRpYmxlID0gInFjb20sbXNtODk1Mi1xcmQiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9tc21fYnVzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbXNtL21zbV9idXMudHh0CmluZGV4IGIzZjM0MzEuLjBkOTU1ZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbXNtL21zbV9idXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbXNtL21zbV9idXMudHh0CkBAIC0xMzksNiArMTM5LDcgQEAKIAkJCXRoZSBjb21tYW5kIERCIGRyaXZlci4KIHFjb20sZHJ2LWlkOgkJVGhlIERSViBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIFJTQywgdXNlZCB0byBkaWZmZXJlbnRpYXRlCiAJCQliZXR3ZWVuIFJTQ1Mgb3duZWQgYnkgZGlmZmVyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMuCitxY29tLGRlZmVyLWluaXQtcW9zOglGbGFnIHRvIGZvcmNlIGRlZmVyIGluaXRpYWwgUW9TIGNvbmZpZ3VyYXRpb24gYXQgcHJvYmUgdGltZS4KIAogCiBFeGFtcGxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2MudHh0CmluZGV4IDMxM2U1MGYuLmRhZjhhNTM5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2MudHh0CkBAIC0yLDcgKzIsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzIDoKLS0gY29tcGF0aWJsZSA6IHNoYWxsIGNvbnRhaW4gInFjb20sY2FtX2NjLXNkbTg0NSIgb3IgInFjb20sY2FtX2NjLXNkbTg0NS12MiIKKy0gY29tcGF0aWJsZSA6IHNoYWxsIGNvbnRhaW4gInFjb20sY2FtX2NjLXNkbTg0NSIsICJxY29tLGNhbV9jYy1zZG04NDUtdjIiIG9yCisJICAgICAgICJxY29tLGNhbV9jYy1zZG02NzAiCiAtIHJlZyA6IHNoYWxsIGNvbnRhaW4gYmFzZSByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAtIHJlZy1uYW1lczogbmFtZXMgb2YgcmVnaXN0ZXJzIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgogCSAgICAgdGhlIHJlZyBwcm9wZXJ0eS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2MudHh0CmluZGV4IDg3YWYwZjYuLmQxNjljMzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLnR4dApAQCAtMiw3ICsyLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllcyA6Ci0tIGNvbXBhdGlibGUgOiBzaGFsbCBjb250YWluICJxY29tLGRpc3BjYy1zZG04NDUiIG9yICJxY29tLGRpc3BjYy1zZG04NDUtdjIiLgorLSBjb21wYXRpYmxlIDogc2hhbGwgY29udGFpbiAicWNvbSxkaXNwY2Mtc2RtODQ1IiwgInFjb20sZGlzcGNjLXNkbTg0NS12MiIgb3IKKwkgICAgICAgInFjb20sZGlzcGNjLXNkbTY3MCIuCiAtIHJlZyA6IHNoYWxsIGNvbnRhaW4gYmFzZSByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoLgogLSByZWctbmFtZXM6IG5hbWVzIG9mIHJlZ2lzdGVycyBsaXN0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaW4KIAkgICAgIHRoZSByZWcgcHJvcGVydHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLnR4dAppbmRleCBjMjgwYjkyLi41MzhmYjZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdjYy50eHQKQEAgLTE4LDYgKzE4LDcgQEAKIAkJCSJxY29tLGdjYy1tZG05NjE1IgogCQkJInFjb20sZ2NjLXNkbTg0NSIKIAkJCSJxY29tLGdjYy1zZG04NDUtdjIiCisJCQkicWNvbSxnY2Mtc2RtNjcwIgogCQkJInFjb20sZGVidWdjYy1zZG04NDUiCiAKIC0gcmVnIDogc2hhbGwgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdwdWNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdwdWNjLnR4dAppbmRleCAxMjY3NmI3Li5hYTkwYmM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxncHVjYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZ3B1Y2MudHh0CkBAIC03LDYgKzcsOCBAQAogCQkicWNvbSxncHVjYy1zZG04NDUtdjIiLAogCQkicWNvbSxnZnhjYy1zZG04NDUiLAogCQkicWNvbSxnZnhjYy1zZG04NDUtdjIiCisJCSJxY29tLGdwdWNjLXNkbTY3MCIsCisJCSJxY29tLGdmeGNjLXNkbTY3MCIKIAogLSByZWcgOiBzaGFsbCBjb250YWluIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBzaXplLgogLSAjY2xvY2stY2VsbHMgOiBzaGFsbCBjb250YWluIDEuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLHJwbWgudHh0CmluZGV4IGM4MWE0NTQuLjlhZDcyNjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLHJwbWgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLHJwbWgudHh0CkBAIC0yLDcgKzIsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzIDoKLS0gY29tcGF0aWJsZSA6IG11c3QgYmUgInFjb20scnBtaC1jbGstc2RtODQ1IgorLSBjb21wYXRpYmxlIDogc2hhbGwgY29udGFpbiAicWNvbSxycG1oLWNsay1zZG04NDUiIG9yICJxY29tLHJwbWgtY2xrLXNkbTY3MCIKKwogLSAjY2xvY2stY2VsbHMgOiBtdXN0IGNvbnRhaW4gMQogLSBtYm94ZXMgOiBsaXN0IG9mIFJQTWggbWFpbGJveCBwaGFuZGxlIGFuZCBjaGFubmVsIGlkZW50aWZpZXIgdHVwbGVzLgogLSBtYm94LW5hbWVzIDogbGlzdCBvZiBuYW1lcyB0byBpZGVudGlmeSB0aGUgUlBNaCBtYWlsYm94ZXMgdXNlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLHZpZGVvY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sdmlkZW9jYy50eHQKaW5kZXggNmJkMGYwYi4uOWI1M2M2NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sdmlkZW9jYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sdmlkZW9jYy50eHQKQEAgLTIsOCArMiw4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFJlcXVpcmVkIHByb3BlcnRpZXMgOgotLSBjb21wYXRpYmxlIDogc2hhbGwgY29udGFpbiAicWNvbSx2aWRlb19jYy1zZG04NDUiIG9yCi0JICAgICAgICJxY29tLHZpZGVvX2NjLXNkbTg0NS12MiIuCistIGNvbXBhdGlibGUgOiBzaGFsbCBjb250YWluICJxY29tLHZpZGVvX2NjLXNkbTg0NSIsICJxY29tLHZpZGVvX2NjLXNkbTg0NS12MiIKKwkgICAgICAgb3IgInFjb20sdmlkZW9fY2Mtc2RtNjcwIi4KIC0gcmVnIDogc2hhbGwgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGguCiAtIHJlZy1uYW1lczogbmFtZXMgb2YgcmVnaXN0ZXJzIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgogCSAgICAgdGhlIHJlZyBwcm9wZXJ0eS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kaXNwbGF5L21zbS9zZGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKaW5kZXggZGQ2NjhjYi4uMjc4MjQyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvbXNtL3NkZS50eHQKQEAgLTEzNSw2ICsxMzUsMTggQEAKIAkJCQlwb3dlciBjb2xsYXBzZSBmZWF0dXJlIGF2YWlsYWJsZSBvciBub3QuCiAtIHFjb20sc2RlLWhhcy1taXhlci1nYzoJQm9vbGVhbiBwcm9wZXJ0eSB0byBpbmRpY2F0ZSBpZiBtaXhlciBoYXMgZ2FtbWEgY29ycmVjdGlvbgogCQkJCWZlYXR1cmUgYXZhaWxhYmxlIG9yIG5vdC4KKy0gcWNvbSxzZGUtaGFzLWRlc3Qtc2NhbGVyOiAJQm9vbGVhbiBwcm9wZXJ0eSB0byBpbmRpY2F0ZSBpZiBkZXN0aW5hdGlvbiBzY2FsZXIKKwkJCQlmZWF0dXJlIGlzIGF2YWlsYWJsZSBvciBub3QuCistIHFjb20sc2RlLW1heC1kZXN0LXNjYWxlci1pbnB1dC1saW5ld2lkdGg6IEEgdTMyIHZhbHVlIGluZGljYXRlcyB0aGUKKwkJCQltYXhpbXVtIGlucHV0IGxpbmUgd2lkdGggdG8gZGVzdGluYXRpb24gc2NhbGVyLgorLSBxY29tLHNkZS1tYXgtZGVzdC1zY2FsZXItb3V0cHV0LWxpbmV3aWR0aDogQSB1MzIgdmFsdWUgaW5kaWNhdGVzIHRoZQorCQkJCW1heGltdW0gb3V0cHV0IGxpbmUgd2lkdGggb2YgZGVzdGluYXRpb24gc2NhbGVyLgorLSBxY29tLHNkZS1kZXN0LXNjYWxlci10b3Atb2ZmOiBBIHUzMiB2YWx1ZSBwcm92aWRlcyB0aGUKKwkJCQlvZmZzZXQgZnJvbSBtZHAgYmFzZSB0byBkZXN0aW5hdGlvbiBzY2FsZXIgYmxvY2suCistIHFjb20sc2RlLWRlc3Qtc2NhbGVyLXRvcC1zaXplOiBBIHUzMiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGFkZHJlc3MgcmFuZ2UgZm9yIGRzIHRvcAorLSBxY29tLHNkZS1kZXN0LXNjYWxlci1vZmY6IAlBcnJheSBvZiB1MzIgb2Zmc2V0cyBpbmRpY2F0ZSB0aGUgcXNlZWQzIHNjYWxlciBibG9ja3MKKwkJCQlvZmZzZXQgZnJvbSBkZXN0aW5hdGlvbiBzY2FsZXIgdG9wIG9mZnNldC4KKy0gcWNvbSxzZGUtZGVzdC1zY2FsZXItc2l6ZTogICAgQSB1MzIgdmFsdWUgaW5kaWNhdGVzIHRoZSBhZGRyZXNzIHJhbmdlIGZvciBlYWNoIHNjYWxlciBibG9jawogLSBxY29tLHNkZS1zc3BwLWNsay1jdHJsOglBcnJheSBvZiBvZmZzZXRzIGRlc2NyaWJpbmcgY2xrIGNvbnRyb2wKIAkJCQlvZmZzZXRzIGZvciBkeW5hbWljIGNsb2NrIGdhdGluZy4gMXN0IHZhbHVlCiAJCQkJaW4gdGhlIGFycmF5IHJlcHJlc2VudHMgb2Zmc2V0IG9mIHRoZSBjb250cm9sCkBAIC0yODEsNiArMjkzLDE4IEBACiAJCQkJY29yZSBpYiBjYWxjdWxhdGlvbi4KIC0gcWNvbSxzZGUtY29yZS1jbGstZmY6CQlBIHN0cmluZyBlbnRyeSBpbmRpY2F0aW5nIHRoZSBmdWRnZSBmYWN0b3IgZm9yCiAJCQkJY29yZSBjbG9jayBjYWxjdWxhdGlvbi4KKy0gcWNvbSxzZGUtbWluLWNvcmUtaWIta2JwczoJVGhpcyB1MzIgdmFsdWUgaW5kaWNhdGVzIHRoZSBtaW5pbXVtIG1ub2MgaWIKKwkJCQl2b3RlIGluIEticHMgdGhhdCBjYW4gYmUgcmVkdWNlZCB3aXRob3V0IGhpdHRpbmcgdW5kZXJmbG93LgorCQkJCUJXIGNhbGN1bGF0aW9uIGxvZ2ljIHdpbGwgY2hvb3NlIHRoZSBJQiBiYW5kd2lkdGggcmVxdWlyZW1lbnQKKwkJCQliYXNlZCBvbiB1c2VjYXNlIGlmIHRoaXMgZmxvb3IgdmFsdWUgaXMgbm90IGRlZmluZWQuCistIHFjb20sc2RlLW1pbi1sbGNjLWliLWticHM6CVRoaXMgdTMyIHZhbHVlIGluZGljYXRlcyB0aGUgbWluaW11bSBsbGNjIGliCisJCQkJdm90ZSBpbiBLYnBzIHRoYXQgY2FuIGJlIHJlZHVjZWQgd2l0aG91dCBoaXR0aW5nIHVuZGVyZmxvdy4KKwkJCQlCVyBjYWxjdWxhdGlvbiBsb2dpYyB3aWxsIGNob29zZSB0aGUgSUIgYmFuZHdpZHRoIHJlcXVpcmVtZW50CisJCQkJYmFzZWQgb24gdXNlY2FzZSBpZiB0aGlzIGZsb29yIHZhbHVlIGlzIG5vdCBkZWZpbmVkLgorLSBxY29tLHNkZS1taW4tZHJhbS1pYi1rYnBzOglUaGlzIHUzMiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1pbmltdW0gZHJhbSBpYgorCQkJCXZvdGUgaW4gS2JwcyB0aGF0IGNhbiBiZSByZWR1Y2VkIHdpdGhvdXQgaGl0dGluZyB1bmRlcmZsb3cuCisJCQkJQlcgY2FsY3VsYXRpb24gbG9naWMgd2lsbCBjaG9vc2UgdGhlIElCIGJhbmR3aWR0aCByZXF1aXJlbWVudAorCQkJCWJhc2VkIG9uIHVzZWNhc2UgaWYgdGhpcyBmbG9vciB2YWx1ZSBpcyBub3QgZGVmaW5lZC4KIC0gcWNvbSxzZGUtY29tcC1yYXRpby1ydDoJQSBzdHJpbmcgZW50cnkgaW5kaWNhdGluZyB0aGUgY29tcHJlc3Npb24gcmF0aW8KIAkJCQlmb3IgZWFjaCBzdXBwb3J0ZWQgY29tcHJlc3NlZCBmb3JtYXQgb24gcmVhbHRpbWUgaW50ZXJmYWNlLgogCQkJCVRoZSBzdHJpbmcgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgb2YKQEAgLTM0Miw2ICszNjYsNyBAQAogCQkJCWNvbnRyb2wgcmVnaXN0ZXIuIE51bWJlciBvZiBvZmZzZXRzIGRlZmluZWQgc2hvdWxkCiAJCQkJbWF0Y2ggdGhlIG51bWJlciBvZiB4aW4taWRzIGRlZmluZWQgaW4KIAkJCQlwcm9wZXJ0eTogcWNvbSxzZGUtaW5saW5lLXJvdC14aW4KKy0gI3Bvd2VyLWRvbWFpbi1jZWxsczoJCU51bWJlciBvZiBjZWxscyBpbiBhIHBvd2VyLWRvbWFpbiBzcGVjaWZpZXIgYW5kIHNob3VsZCBjb250YWluIDAuCiAKIEJ1cyBTY2FsaW5nIFN1Ym5vZGVzOgogLSBxY29tLHNkZS1yZWctYnVzOgkJUHJvcGVydHkgdG8gcHJvdmlkZSBCdXMgc2NhbGluZyBmb3IgcmVnaXN0ZXIgYWNjZXNzIGZvcgpAQCAtNDIyLDYgKzQ0Nyw3IEBACiAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAgICAgI2ludGVycnVwdC1jZWxscyA9IDwxPjsKICAgICBpb21tdXMgPSA8Jm1kcF9zbW11IDA+OworICAgICNwb3dlci1kb21haW4tY2VsbHMgPSA8MD47CiAKICAgICBxY29tLHNkZS1vZmYgPSA8MHgxMDAwPjsKICAgICBxY29tLHNkZS1jdGwtb2ZmID0gPDB4MDAwMDIwMDAgMHgwMDAwMjIwMCAweDAwMDAyNDAwCkBAIC00MzIsNiArNDU4LDggQEAKICAgICBxY29tLHNkZS1kc3BwLW9mZiA9IDwweDAwMDU1MDAwIDB4MDAwNTcwMDA+OwogICAgIHFjb20sc2RlLWRzcHAtYWQtb2ZmID0gPDB4MjQwMDAgMHgyMjgwMD47CiAgICAgcWNvbSxzZGUtZHNwcC1hZC12ZXJzaW9uID0gPDB4MDAwMzAwMDA+OworICAgIHFjb20sc2RlLWRlc3Qtc2NhbGVyLXRvcC1vZmYgPSA8MHgwMDA2MTAwMD47CisgICAgcWNvbSxzZGUtZGVzdC1zY2FsZXItb2ZmID0gPDB4ODAwIDB4MTAwMD47CiAgICAgcWNvbSxzZGUtd2Itb2ZmID0gPDB4MDAwNjYwMDA+OwogICAgIHFjb20sc2RlLXdiLXhpbi1pZCA9IDw2PjsKICAgICBxY29tLHNkZS1pbnRmLW9mZiA9IDwweDAwMDZiMDAwIDB4MDAwNmI4MDAKQEAgLTQ5Myw2ICs1MjEsOCBAQAogICAgIHFjb20sc2RlLWNkbS1zaXplID0gPDB4MTAwPjsKICAgICBxY29tLHNkZS1wcC1zaXplID0gPDB4MTAwPjsKICAgICBxY29tLHNkZS13Yi1zaXplID0gPDB4MTAwPjsKKyAgICBxY29tLHNkZS1kZXN0LXNjYWxlci10b3Atc2l6ZSA9IDwweGM+OworICAgIHFjb20sc2RlLWRlc3Qtc2NhbGVyLXNpemUgPSA8MHg4MDA+OwogICAgIHFjb20sc2RlLWxlbiA9IDwweDEwMD47CiAgICAgcWNvbSxzZGUtd2ItbGluZXdpZHRoID0gPDI1NjA+OwogICAgIHFjb20sc2RlLXNzcHAtc2NhbGUtc2l6ZSA9IDwweDEwMD47CkBAIC01MDIsNiArNTMyLDkgQEAKICAgICBxY29tLHNkZS1oaWdoZXN0LWJhbmstYml0ID0gPDE1PjsKICAgICBxY29tLHNkZS1oYXMtbWl4ZXItZ2M7CiAgICAgcWNvbSxzZGUtaGFzLWlkbGUtcGM7CisgICAgcWNvbSxzZGUtaGFzLWRlc3Qtc2NhbGVyOworICAgIHFjb20sc2RlLW1heC1kZXN0LXNjYWxlci1pbnB1dC1saW5ld2lkdGggPSA8MjA0OD47CisgICAgcWNvbSxzZGUtbWF4LWRlc3Qtc2NhbGVyLW91dHB1dC1saW5ld2lkdGggPSA8MjU2MD47CiAgICAgcWNvbSxzZGUtc3NwcC1tYXgtcmVjdHMgPSA8MSAxIDEgMQogCQkJCTEgMSAxIDEKIAkJCQkxIDEKQEAgLTU3Miw2ICs2MDUsOSBAQAogCiAgICAgcWNvbSxzZGUtY29yZS1pYi1mZiA9ICIxLjEiOwogICAgIHFjb20sc2RlLWNvcmUtY2xrLWZmID0gIjEuMCI7CisgICAgcWNvbSxzZGUtbWluLWNvcmUtaWIta2JwcyA9IDwyNDAwMDAwPjsKKyAgICBxY29tLHNkZS1taW4tbGxjYy1pYi1rYnBzID0gPDgwMDAwMD47CisgICAgcWNvbSxzZGUtbWluLWRyYW0taWIta2JwcyA9IDw4MDAwMDA+OwogICAgIHFjb20sc2RlLWNvbXAtcmF0aW8tcnQgPSAiTlYxMi81LzEvMS4xIEFCMjQvNS8xLzEuMiBYQjI0LzUvMS8xLjMiOwogICAgIHFjb20sc2RlLWNvbXAtcmF0aW8tbnJ0ID0gIk5WMTIvNS8xLzEuMSBBQjI0LzUvMS8xLjIgWEIyNC81LzEvMS4zIjsKICAgICBxY29tLHNkZS11bmRlcnNpemVkLXByZWZpbGwtbGluZXMgPSA8ND47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3Fjb20tc3BzLWRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3Fjb20tc3BzLWRtYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjODcyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcWNvbS1zcHMtZG1hLnR4dApAQCAtMCwwICsxLDQyIEBACisqIFF1YWxjb21tIHRlY2hub2xvZ2llcyBpbmMsIERNQSBlbmdpbmUgZHJpdmVyIGZvciBCQU0gKEJ1cyBBY2Nlc3MgTWFuYWdlcikuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAicWNvbSxzcHMtZG1hIi4KKy0gcmVnOiBTaG91bGQgY29udGFpbiBETUEgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGguIFRoaXMgc2hvdWxkIGluY2x1ZGUKKyAgYWxsIG9mIHRoZSBwZXItY2hhbm5lbCByZWdpc3RlcnMuCistIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBCQU0gaW50ZXJydXB0IG51bWJlci4KKy0gcWNvbSxzdW1taW5nLXRocmVzaG9sZDogIFNob3VsZCBjb250YWluIHRoZSBCQU0gZXZlbnQgdGhyZXNob2xkIG9mCisgIHRoZSBzdW0gb2YgZGVzY3JpcHRvcnMnIHNpemVzIGluIGJ5dGVzLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLG1hbmFnZWQtbG9jYWxseSA6IFVzZSB3aGVuIEJBTSBnbG9iYWwgZGV2aWNlIGNvbnRyb2wgaXMgbWFuYWdlZCBsb2NhbGx5CisgIGJ5IHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzb3IuCisKK0V4YW1wbGU6CisKKwlkbWFfYmxzcDE6IHFjb20sc3BzLWRtYUBmOTkwNDAwMCB7IC8qIEJMU1AxICovCisJCSNkbWEtY2VsbHMgPSA8ND47CisJCWNvbXBhdGlibGUgPSAicWNvbSxzcHMtZG1hIjsKKwkJcmVnID0gPDB4Zjk5MDQwMDAgMHgxOTAwMD47CisJCWludGVycnVwdHMgPSA8MCAyMzggMD47CisJCXFjb20sc3VtbWluZy10aHJlc2hvbGQgPSA8MTA+OworCX07CisKK0RNQSBjbGllbnRzIGNvbm5lY3RlZCB0byB0aGUgcWNvbS1zcHMtZG1hIERNQSBjb250cm9sbGVyIG11c3QgdXNlIHRoZSBmb3JtYXQKK2Rlc2NyaWJlZCBpbiB0aGUgZG1hLnR4dCBmaWxlLCB1c2luZyBhIGZpdmUtY2VsbCBzcGVjaWZpZXIgZm9yIGVhY2ggY2hhbm5lbCwKK2EgcGhhbmRsZSBwbHVzIGZvdXIgaW50ZWdlciBjZWxscywgYXMgc2hvd24gYmVsb3c6CisKK2RtYXMgPSA8W3BoYW5kbGUgb2YgdGhlIGRtYSBjb250cm9sbGVyXSBbcGlwZSBpbmRleF0gW251bWJlciBvZiBkZXNjcmlwdG9yc10KKwkJCQlbc3BzX2Nvbm5lY3QgZmxhZ3NdIFtzcHNfcmVnaXN0ZXJfZXZlbnQgZmxhZ3NdPjsKKworRXhhbXBsZToKKworaTJjXzI6IGkyY0BmOTkyNDAwMCB7IC8qIEJMU1AxIFFVUDIgKi8KKwkuCisJLgorCS4KKwkvKiAgICAgPCZwaGFuZGxlIHBpcGUtaWR4IG4tZGVzY3MgY29ubmVjdC1mbGFncyBldmVudC1mbGFncz4gKi8KKwlkbWFzID0gPCZkbWFfYmxzcDEgMTQgMzIgMHgyMDAwMDAyMCAweDIwPiwKKwkgICAgICAgPCZkbWFfYmxzcDEgMTUgNjQgMHgyMDAwMDAyMCAweDIwPjsKKwlkbWEtbmFtZXMgPSAidHgiLCAicngiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcWNvbV9ncGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9xY29tX2dwaS50eHQKaW5kZXggM2IzYjcxMy4uZjFiNGE0MjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcWNvbV9ncGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcWNvbV9ncGkudHh0CkBAIC0xMiwxMyArMTIsMTIgQEAKIC0gI2RtYS1jZWxscwogICBVc2FnZTogcmVxdWlyZWQKICAgVmFsdWUgdHlwZTogPHUzMj4KLSAgRGVmaW5pdGlvbjogTnVtYmVyIG9mIHBhcmFtZXRlcnMgY2xpZW50IHdpbGwgcHJvdmlkZS4gIE11c3QgYmUgc2V0IHRvIDYuCi0JMXN0IHBhcmFtZXRlcjogZ3BpaSBpbmRleAotCTJuZCBwYXJhbWV0ZXI6IGNoYW5uZWwgaW5kZXgKLQkzcmQgcGFyYW1ldGVyOiBzZXJpYWwgZW5naW5lIGluZGV4Ci0JNHRoIHBhcmFtZXRlcjogYnVzIHByb3RvY29sLCAxIGZvciBTUEksIDIgZm9yIFVBUlQsIDMgZm9yIEkyQwotCTV0aCBwYXJhbWV0ZXI6IGNoYW5uZWwgcmluZyBsZW5ndGggaW4gdHJhbnNmZXIgcmluZyBlbGVtZW50cwotCTZ0aCBwYXJhbWV0ZXI6IGV2ZW50IHByb2Nlc3NpbmcgcHJpb3JpdHksIHNldCB0byAwIGZvciBsb3dlc3QgbGF0ZW5jeQorICBEZWZpbml0aW9uOiBOdW1iZXIgb2YgcGFyYW1ldGVycyBjbGllbnQgd2lsbCBwcm92aWRlLiAgTXVzdCBiZSBzZXQgdG8gNS4KKwkxc3QgcGFyYW1ldGVyOiBjaGFubmVsIGluZGV4LCAwIGZvciBUWCwgMSBmb3IgUlgKKwkybmQgcGFyYW1ldGVyOiBzZXJpYWwgZW5naW5lIGluZGV4CisJM3JkIHBhcmFtZXRlcjogYnVzIHByb3RvY29sLCAxIGZvciBTUEksIDIgZm9yIFVBUlQsIDMgZm9yIEkyQworCTR0aCBwYXJhbWV0ZXI6IGNoYW5uZWwgcmluZyBsZW5ndGggaW4gdHJhbnNmZXIgcmluZyBlbGVtZW50cworCTV0aCBwYXJhbWV0ZXI6IGV2ZW50IHByb2Nlc3NpbmcgcHJpb3JpdHksIHNldCB0byAwIGZvciBsb3dlc3QgbGF0ZW5jeQogCiAtIGNvbXBhdGlibGUKICAgVXNhZ2U6IHJlcXVpcmVkCkBAIC02NCwxMSArNjMsMjcgQEAKIAlmb3IgdGhlIGNvbnRyb2xsZXIuICBGb3IgbW9yZSBkZXRhaWwgcGxlYXNlIGNoZWNrIGJpbmRpbmcKIAlkb2N1bWVudGF0aW9uIGFybSxzbW11LnR4dAogCistIHFjb20sc21tdS1jZmcKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDx1MzI+CisgIERlZmluaXRpb246IERldGVybWluZSB3aGV0aGVyIEdQSSBkcml2ZXIgcmVxdWlyZSB0byBjb25maWd1cmUgU01NVSB0aGF0CisJc2l0cyBiZWhpbmQgR1BJIGNvbnRyb2xsZXIuCisJQml0IG1hc2s6CisJQklUKDApIDogQXR0YWNoIGFkZHJlc3MgbWFwcGluZyB0byBlbmRwb2ludCBkZXZpY2UKKwlCSVQoMSkgOiBTZXQgU01NVSBhdHRyaWJ1dGUgUzFfQllQQVNTCisJQklUKDIpIDogU2V0IFNNTVUgYXR0cmlidXRlIEZBU1QKKwlCSVQoMykgOiBTZXQgU01NVSBhdHRyaWJ1dGUgQVRPTUlDCisKKy0gcWNvbSxpb3ZhLXJhbmdlCisgIFVzYWdlOiByZXF1aXJlZCBpZiBTTU1VIFMxIHRyYW5zbGF0aW9uIGlzIGVuYWJsZWQKKyAgVmFsdWUgdHlwZTogQXJyYXkgb2YgPHU2ND4KKyAgRGVmaW5pdGlvbjogUGFpciBvZiB2YWx1ZXMgZGVzY3JpYmluZyBpb3ZhIGJhc2UgYW5kIHNpemUgdG8gYWxsb2NhdGUuCisKID09PT09PT09CiBFeGFtcGxlOgogPT09PT09PT0KIGdwaV9kbWEwOiBxY29tLGdwaS1kbWFAMHg4MDAwMDAgewotCSNkbWEtY2VsbHMgPSA8Nj47CisJI2RtYS1jZWxscyA9IDw1PjsKIAljb21wYXRpYmxlID0gInFjb20sZ3BpLWRtYSI7CiAJcmVnID0gPDB4ODAwMDAwIDB4NjAwMDA+OwogCXJlZy1uYW1lcyA9ICJncGktdG9wIjsKQEAgLTgwLDUgKzk1LDcgQEAKIAlxY29tLGdwaWktbWFzayA9IDwweGZhPjsKIAlxY29tLGV2LWZhY3RvciA9IDwyPjsKIAlpb21tdXMgPSA8JmFwcHNfc21tdSAweDAwMTYgMHgwPjsKKwlxY29tLHNtbXUtY2ZnID0gPDB4MT4KKwlxY29tLGlvdmEtcmFuZ2UgPSA8MHgwIDB4MTAwMDAwIDB4MCAweDEwMDAwMD47CiAJc3RhdHVzID0gIm9rIjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZHJtL21zbS9zZGUtZHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RybS9tc20vc2RlLWRwLnR4dAppbmRleCBlNDZmZDVjLi5hZGEyZWFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZHJtL21zbS9zZGUtZHAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kcm0vbXNtL3NkZS1kcC50eHQKQEAgLTEwLDYgKzEwLDcgQEAKIAkJCSJkcF9tbXNzX2NjIiAtIERpc3BsYXkgQ2xvY2sgQ29udHJvbCBtZW1vcnkgcmVnaW9uLgogCQkJInFmcHJvbV9waHlzaWNhbCIgLSBRRlBST00gUGh5cyBtZW1vcnkgcmVnaW9uLgogCQkJImRwX3BsbCIgLSBVU0IzIERQIGNvbWJvIFBMTCBtZW1vcnkgcmVnaW9uLgorCQkJInVzYjNfZHBfY29tIiAtIFVTQjMgRFAgUEhZIGNvbWJvIG1lbW9yeSByZWdpb24uCiAJCQkiaGRjcF9waHlzaWNhbCIgLSBEUCBIRENQIG1lbW9yeSByZWdpb24uCiAtIGNlbGwtaW5kZXg6ICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UuCiAtIGNsb2NrczogICAgICAgICAgICAgICBDbG9ja3MgcmVxdWlyZWQgZm9yIERpc3BsYXkgUG9ydCBvcGVyYXRpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3B1L2FkcmVuby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3B1L2FkcmVuby50eHQKaW5kZXggNzBmMTE0OC4uYjE4ZDU3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwdS9hZHJlbm8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncHUvYWRyZW5vLnR4dApAQCAtOTMsNiArOTMsNyBAQAogLSBxY29tLGNoaXBpZDoJCSAgIElmIGl0IGV4aXN0cyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gcmVwbGFjZQogCQkJICAgdGhlIGNoaXAgaWRlbnRpZmljYXRpb24gcmVhZCBmcm9tIHRoZSBHUFUgaGFyZHdhcmUuCiAJCQkgICBUaGlzIGlzIHVzZWQgdG8gb3ZlcnJpZGUgZmF1bHR5IGhhcmR3YXJlIHJlYWRpbmdzLgorLSBxY29tLGRpc2FibGUtd2FrZS1vbi10b3VjaDogICBCb29sZWFuLiBEaXNhYmxlcyB0aGUgR1BVIHBvd2VyIHVwIG9uIGEgdG91Y2ggaW5wdXQgZXZlbnQuCiAtIHFjb20sZGlzYWJsZS1idXN5LXRpbWUtYnVyc3Q6CiAJCQkJQm9vbGVhbi4gRGlzYWJsZXMgdGhlIGJ1c3kgdGltZSBidXJzdCB0byBhdm9pZCBzd2l0Y2hpbmcKIAkJCQlvZiBwb3dlciBsZXZlbCBmb3IgbGFyZ2UgZnJhbWVzIGJhc2VkIG9uIHRoZSBidXN5IHRpbWUgbGltaXQuCkBAIC0yMTAsMTkgKzIxMSwyMiBAQAogCQkJCWFuZCBwYWdldGFibGUgd2Fsay4KIC0gY2FjaGUtc2xpY2VzOgkJCXBoYW5kbGUgdG8gdGhlIHN5c3RlbSBMTEMgZHJpdmVyLCBjYWNoZSBzbGljZSBpbmRleC4KIAorCitHUFUgY29yZXNpZ2h0IGluZm86CiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIGFzIGNvbGxlY3RpbmcgZGF0YSB2aWEgY29yZXNpZ2h0IG1pZ2h0CiBub3QgYmUgc3VwcG9ydGVkIGZvciBldmVyeSBjaGlwc2V0LiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgY29yZXNpZ2h0CiBwcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCBpbjoKIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jb3Jlc2lnaHQvY29yZXNpZ2h0LnR4dAogCi0tIGNvcmVzaWdodC1pZCAgICAgICAgICAgVW5pcXVlIGludGVnZXIgaWRlbnRpZmllciBmb3IgdGhlIGJ1cy4KLS0gY29yZXNpZ2h0LW5hbWUgICAgICAgICBVbmlxdWUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUgYnVzLgotLSBjb3Jlc2lnaHQtbnItaW5wb3J0cyAgIE51bWJlciBvZiBpbnB1dCBwb3J0cyBvbiB0aGUgYnVzLgotLSBjb3Jlc2lnaHQtb3V0cG9ydHMgICAgIExpc3Qgb2Ygb3V0cHV0IHBvcnQgbnVtYmVycyBvbiB0aGUgYnVzLgotLSBjb3Jlc2lnaHQtY2hpbGQtbGlzdCAgIExpc3Qgb2YgcGhhbmRsZXMgcG9pbnRpbmcgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMKKy0gcWNvbSxncHUtY29yZXNpZ2h0czoJIENvbnRhaW5lciBmb3Igc2V0cyBvZiBHUFUgY29yZXNpZ2h0IHNvdXJjZXMuCistIGNvcmVzaWdodC1pZDogICAgICAgICAgVW5pcXVlIGludGVnZXIgaWRlbnRpZmllciBmb3IgdGhlIGJ1cy4KKy0gY29yZXNpZ2h0LW5hbWU6ICAgICAgICBVbmlxdWUgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUgYnVzLgorLSBjb3Jlc2lnaHQtbnItaW5wb3J0czogIE51bWJlciBvZiBpbnB1dCBwb3J0cyBvbiB0aGUgYnVzLgorLSBjb3Jlc2lnaHQtb3V0cG9ydHM6ICAgIExpc3Qgb2Ygb3V0cHV0IHBvcnQgbnVtYmVycyBvbiB0aGUgYnVzLgorLSBjb3Jlc2lnaHQtY2hpbGQtbGlzdDogIExpc3Qgb2YgcGhhbmRsZXMgcG9pbnRpbmcgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuCi0tIGNvcmVzaWdodC1jaGlsZC1wb3J0cyAgTGlzdCBvZiBpbnB1dCBwb3J0IG51bWJlcnMgb2YgdGhlIGNoaWxkcmVuLgotLSBjb3Jlc2lnaHQtYXRpZCAgICAgICAgIFRoZSB1bmlxdWUgQVRJRCB2YWx1ZSBvZiB0aGUgY29yZXNpZ2h0IGRldmljZQorLSBjb3Jlc2lnaHQtY2hpbGQtcG9ydHM6IExpc3Qgb2YgaW5wdXQgcG9ydCBudW1iZXJzIG9mIHRoZSBjaGlsZHJlbi4KKy0gY29yZXNpZ2h0LWF0aWQ6ICAgICAgICBUaGUgdW5pcXVlIEFUSUQgdmFsdWUgb2YgdGhlIGNvcmVzaWdodCBkZXZpY2UKIAogRXhhbXBsZSBvZiBBMzMwIEdQVSBpbiBNU004OTE2OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1tc20tdjIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbXNtLXYyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNhYmIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbXNtLXYyLnR4dApAQCAtMCwwICsxLDU1IEBACitRdWFsY29tbSBJMkMgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHJlZ2lvbiBmb3IgdGhlIGRldmljZSBuYW1lZCBpbgorCXJlZy1uYW1lcyBhbmQgaGFzIHRoZSBzYW1lIGluZGV4LgorIC0gcmVnLW5hbWVzIDogUmVnaXN0ZXIgcmVnaW9uIG5hbWUocykgcmVmZXJlbmNlZCBpbiByZWcgYWJvdmUKKwkicXVwX3BoeXNfYWRkciIgOiBQaHlzaWNhbCBhZGRyZXNzIG9mIFFVUCByZWdpc3RlciBzcGFjZS4KKyAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInFjb20saTJjLW1zbS12MiIKKyAtIGludGVycnVwdHMgOiBJbnRlcnJ1cHQgbnVtYmVyIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIGVudHJ5IHdpdGggdGhlIHNhbWUKKwlpbmRleCBpbiBpbnRlcnJ1cHQtbmFtZXMuCisgLSBpbnRlcnJ1cHQtbmFtZXM6IFFVUCBjb3JlIGludGVycnVwdCBuYW1lKHMpIHJlZmVyZW5jZWQgaW4gaW50ZXJydXB0cyBhYm92ZQorCSJxdXBfaXJxIiA6IFFVUCBpbnRlcnJ1cHQgdXNlZCBieSB0aGUgY29udHJvbGxlci4KKyAtIGRtYXMgOiBETUEgZW5naW5lIEFQSSdzIHBhcmFtZXRlcnMgZm9yIGJsc3AuCisJPFtwaGFuZGxlIG9mIHRoZSBkbWEgY29udHJvbGxlcl0gW3BpcGUgaW5kZXhdIFtudW1iZXIgb2YgZGVzY3JpcHRvcnNdCisJCQkJW3Nwc19jb25uZWN0IGZsYWdzXSBbc3BzX3JlZ2lzdGVyX2V2ZW50IGZsYWdzXT47CisgLSBkbWEtbmFtZXMgOiAgZG1hIGNoYW5uZWwgbmFtZXMuCisgLSBxY29tLGNsay1mcmVxLW91dCA6IERlc2lyZWQgSTJDIGJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHoKKyAtIHFjb20sY2xrLWZyZXEtaW4gIDogU3VwcGxpZWQgY29yZSBjbG9jayBmcmVxdWVuY3kgaW4gSHouCisKK1JlcXVpcmVkIGFsaWFzOgorIC0gVGhlIGRlc2lyZWQgYnVzLW51bWJlciBpcyBzcGVjaWZpZWQgYnkgYW4gYWxpYXMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKwknaTJje259JyB3aGVyZSBuIGlzIHRoZSBidXMgbnVtYmVyLgorCitPcHRpb25hbCBwcm9wZXJ0eToKKyAtIHFjb20sbm9pc2UtcmpjdC1zY2wgOiBudW1iZXIgb2YgbG93IHNhbXBsZXMgb24gY2xvY2sgbGluZSB0byBjb25zaWRlciBpdCBsb3cuCisJV2hlbiBtaXNzaW5nIGRlZmF1bHQgdG8gMC4KKyAtIHFjb20sbm9pc2UtcmpjdC1zZGEgOiBudW1iZXIgb2YgbG93IHNhbXBsZXMgb24gZGF0YSAgbGluZSB0byBjb25zaWRlciBpdCBsb3cuCisJV2hlbiBtaXNzaW5nIGRlZmF1bHQgdG8gMC4KKyAtIHFjb20sZGlzYWJsZS1kbWEgOiBkaXNhYmxlcyBETUEgdHJhbnNmZXIgbW9kZS4KKyAtIHFjb20sbWFzdGVyLWlkIDogTWFzdGVyLXBvcnQgdmFsdWUgdXNlZCBvbiB2b3RpbmcgZm9yIHRoZSBjbG9jayBwYXRoLgorIC0gcWNvbSxoaWdoLXRpbWUtY2xrLWRpdiA6IGhpZ2ggdGltZSBkaXZpZGVyIHZhbHVlIHRvIGNvbmZpZ3VyZSBjbGstY3RsCisJcmVnaXN0ZXIuIFdoZW4gbWlzc2luZywgZGVmYXVsdCB0byB0aGUgdmFsdWUgZ2l2ZW4gaW4gZHJpdmVyLgorIC0gcWNvbSxmcy1jbGstZGl2OiBmcyBkaXZpZGVyIHZhbHVlIHRvIGNvbmZpZ3VyZSBjbGstY3RsIHJlZ2lzdGVyLiBXaGVuCisJbWlzc2luZywgZGVmYXVsdCB0byB0aGUgdmFsdWUgZ2l2ZW4gaW4gZHJpdmVyLgorCitFeGFtcGxlOgorCWFsaWFzZXMgeworCQlpMmMxMCA9ICZpMmNfMTA7CisJfTsKKworCWkyY18xMDogaTJjQGY5OTY2MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGkyYy1tc20tdjIiOworCQlyZWctbmFtZXMgPSAicXVwX3BoeXNfYWRkciIsICJkbWFfcGh5c19hZGRyIjsKKwkJcmVnID0gPDB4Zjk5NjYwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gInF1cF9pcnEiOworCQlpbnRlcnJ1cHRzID0gPDAgMTA0IDA+OworCQlkbWFzID0gPCZkbWFfYmxzcDEgMTQgMzIgMHgyMDAwMDAyMCAweDIwPiwKKwkJCTwmZG1hX2Jsc3AxIDE1IDY0IDB4MjAwMDAwMjAgMHgyMD47CisJCWRtYS1uYW1lcyA9ICJ0eCIsICJyeCI7CisJCXFjb20sY2xrLWZyZXEtb3V0ID0gPDEwMDAwMD47CisJCXFjb20sY2xrLWZyZXEtaW4gID0gPDI0MDAwMDAwPjsKKwkJcWNvbSxub2lzZS1yamN0LXNjbCA9IDwwPjsKKwkJcWNvbSxub2lzZS1yamN0LXNkYSA9IDwwPjsKKworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdHBzNjUyMTgtcHdyYnV0dG9uLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90cHM2NTIxOC1wd3JidXR0b24udHh0CmluZGV4IDNlNWI5NzkuLjg2ODJhYjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90cHM2NTIxOC1wd3JidXR0b24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90cHM2NTIxOC1wd3JidXR0b24udHh0CkBAIC04LDggKzgsOSBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJ0aSx0cHM2NTIxNy1wd3JidXR0b24iIG9yICJ0aSx0cHM2NTIxOC1wd3JidXR0b24iCiAKLVJlcXVpcmVkIHByb3BlcnRpZXMgZm9yIFRQUzY1MjE4OgorUmVxdWlyZWQgcHJvcGVydGllczoKIC0gaW50ZXJydXB0czogc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisgICAtIDwyPjogRm9yIGNvbnRyb2xsZXJzIGNvbXBhdGlibGUgd2l0aCB0cHM2NTIxNwogICAgLSA8MyBJUlFfVFlQRV9FREdFX0JPVEg+OiBGb3IgY29udHJvbGxlcnMgY29tcGF0aWJsZSB3aXRoIHRwczY1MjE4CiAKIEV4YW1wbGVzOgpAQCAtMTcsNiArMTgsNyBAQAogJnRwcyB7CiAJdHBzNjUyMTctcHdyYnV0dG9uIHsKIAkJY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxNy1wd3JidXR0b24iOworCQlpbnRlcnJ1cHRzID0gPDI+OwogCX07CiB9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW9tbXUvYXJtLHNtbXUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lvbW11L2FybSxzbW11LnR4dAppbmRleCBhMDE0ZGFjLi5kMmU2MzVhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW9tbXUvYXJtLHNtbXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pb21tdS9hcm0sc21tdS50eHQKQEAgLTk2LDEwICs5NiwxMyBAQAogCQkgIHJldGVudGlvbi4gTm8gY2FjaGUgaW52YWxpZGF0aW9uIG9wZXJhdGlvbnMgaW52b2x2aW5nIGFzaWQKIAkJICBtYXkgYmUgdXNlZC4KIAotLSBxY29tLGFjdGxyOgotCQkgIEFuIGFycmF5IG9mIDxzaWQgbWFzayBhY3Rsci1zZXR0aW5nPi4KLQkJICBBbnkgc2lkIFggZm9yIHdoaWNoIFgmfm1hc2s9PXNpZCB3aWxsIGJlIHByb2dyYW1tZWQgd2l0aCB0aGUKLQkJICBnaXZlbiBhY3Rsci1zZXR0aW5nLgorLSBxY29tLGRpc2FibGUtYXRvczoKKwkJICBTb21lIGhhcmR3YXJlIG1heSBub3QgaGF2ZSBmdWxsIHN1cHBvcnQgZm9yIGF0b3MgZGVidWdnaW5nCisJCSAgaW4gdGFuZGVtIHdpdGggb3RoZXIgZmVhdHVyZXMgbGlrZSBwb3dlciBjb2xsYXBzZS4KKworLSBxY29tLG1tdTUwMC1lcnJhdGEtMToKKwkJICBBbiBhcnJheSBvZiA8c2lkIG1hc2s+LgorCQkgIEluZGljYXRlcyB0aGUgU0lEcyBmb3Igd2hpY2ggdGhlIHdvcmthcm91bmQgaXMgcmVxdWlyZWQuCiAKIC0gcWNvbSxkZWZlcnJlZC1yZWd1bGF0b3ItZGlzYWJsZS1kZWxheSA6IFRoZSB0aW1lIGRlbGF5IGZvciBkZWZlcnJlZCByZWd1bGF0b3IKICAgICAgICAgICAgICAgICAgIGRpc2FibGUgaW4gbXMuIEluIGNhc2Ugb2YgdW5tYXAgY2FsbCwgcmVndWxhdG9yIGlzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1lZXByb20udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS1jYW0tZWVwcm9tLnR4dAppbmRleCA5MzNhZDg1Li44M2E1OGRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1lZXByb20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLWVlcHJvbS50eHQKQEAgLTI3OCw2ICsyNzgsNDYgQEAKICAgVmFsdWUgdHlwZTogPHUzMj4KICAgRGVmaW5pdGlvbjogc2hvdWxkIHNwZWNpZnkgdGhlIHBvd2VyIG9uIHNlcXVlbmNlIGRlbGF5IHRpbWUgaW4gbXMuCiAKKy0gc3Bpb3AtcmVhZAorICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogdGhpcyBhcnJheSBwcm92aWRlcyBTUEkgcmVhZCBvcGVyYXRpb24gcmVsYXRlZCBkYXRhLgorCistIHNwaW9wLXJlYWRzZXEKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDx1MzI+CisgIERlZmluaXRpb246IHRoaXMgYXJyYXkgcHJvdmlkZXMgU1BJIHJlYWQgc2VxdWVuY2Ugb3BlcmF0aW9uIHJlYWx0ZWQgZGF0YS4KKworLSBzcGlvcC1xdWVyeWlkCisgIFVzYWdlOiByZXF1aXJlZAorICBWYWx1ZSB0eXBlOiA8dTMyPgorICBEZWZpbml0aW9uOiB0aGlzIGFycmF5IHByb3ZpZGVzIFNQSSBxdWVyeSBlZXByb20gaWQgb3BlcmF0aW9uIHJlbGF0ZWQgZGF0YS4KKworLSBzcGlvcC1wcHJvZzoKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDx1MzI+CisgIERlZmluaXRpb246IHRoaXMgYXJyYXkgcHJvdmlkZXMgU1BJIHBhZ2UgcHJvZ3JhbSBvcGVyYXRpb24gcmVsYXRlZCBkYXRhLgorCistIHNwaW9wLXdlbmFibGUKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDx1MzI+CisgIERlZmluaXRpb246IHRoaXMgYXJyYXkgcHJvdmlkZXMgU1BJIHdyaXRlIGVuYWJsZSBvcGVyYXRpb24gcmVsYXRlZCBkYXRhLgorCistIHNwaW9wLXJlYWRzdAorICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogdGhpcyBhcnJheSBwcm92aWRlcyBTUEkgcmVhZCBkZXN0aW5hdGlvbiBvcGVyYXRpb24gcmVsYXRlZCBkYXRhLgorCistIHNwaW9wLWVyYXNlCisgIFVzYWdlOiByZXF1aXJlZAorICBWYWx1ZSB0eXBlOiA8dTMyPgorICBEZWZpbml0aW9uOiB0aGlzIGFycmF5IHByb3ZpZGVzIFNQSSBlcmFzZSBvcGVyYXRpb24gcmVsYXRlZCBkYXRhLgorCistIGVlcHJvbS1pZHgKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDx1MzI+CisgIERlZmluaXRpb246IHRoaXMgYXJyYXkgcHJvdmlkZXMgZWVwcm9tIGlkIHJlYWx0ZWQgZGF0YS4KKwogLSB4eHh4LXN1cHBseQogICBVc2FnZTogcmVxdWlyZWQKICAgVmFsdWUgdHlwZTogPHBoYW5kbGU+CkBAIC0zODUsNiArNDI1LDEwIEBACiAJCWNlbGwtaW5kZXggPSA8MD47CiAJCXJlZyA9IDwweDA+OwogCQlxY29tLGVlcHJvbS1uYW1lID0gIm1zbV9lZXByb20iOworCQllZXByb20taWQwID0gPDB4RjggMHgxNT47CisJCWVlcHJvbS1pZDEgPSA8MHhFRiAweDE1PjsKKwkJZWVwcm9tLWlkMiA9IDwweEMyIDB4MzY+OworCQllZXByb20taWQzID0gPDB4QzggMHgxNT47CiAJCWNvbXBhdGlibGUgPSAicWNvbSxlZXByb20iOwogCQlxY29tLHNsYXZlLWFkZHIgPSA8MHg2MD47CiAJCXFjb20sbnVtLWJsb2NrcyA9IDwyPjsKQEAgLTQwMCw2ICs0NDQsMTMgQEAKIAkJcWNvbSxjbW0tZGF0YS1jb21wcmVzc2VkOwogCQlxY29tLGNtbS1kYXRhLW9mZnNldCA9IDwwPjsKIAkJcWNvbSxjbW0tZGF0YS1zaXplID0gPDA+OworCQlzcGlvcC1yZWFkID0gPDB4MDMgMyAwIDAgMD47CisJCXNwaW9wLXJlYWRzZXEgPSA8MHgwMyAzIDAgMCAwPjsKKwkJc3Bpb3AtcXVlcnlpZCA9IDwweDkwIDMgMCAwIDA+OworCQlzcGlvcC1wcHJvZyA9IDwweDAyIDMgMCAzIDEwMD47CisJCXNwaW9wLXdlbmFibGUgPSA8MHgwNiAwIDAgMCAwPjsKKwkJc3Bpb3AtcmVhZHN0ID0gPDB4MDUgMCAwIDAgMD47CisJCXNwaW9wLWVyYXNlID0gPDB4MjAgMyAwIDEwIDEwMD47CiAJCXFjb20sY2FtLXBvd2VyLXNlcS10eXBlID0gInNlbnNvcl92cmVnIiwKIAkJCSJzZW5zb3JfdnJlZyIsICJzZW5zb3JfY2xrIiwKIAkJCSJzZW5zb3JfZ3BpbyIsICJzZW5zb3JfZ3BpbyI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1mZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1mZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NTFmNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLWZkLnR4dApAQCAtMCwwICsxLDE0OSBAQAorKiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gTVNNIENhbWVyYSBGRAorCitUaGUgTVNNIGNhbWVyYSBGYWNlIERldGVjdGlvbiBkZXZpY2UgcHJvdmlkZXMgZGVwZW5kZW5jeSBkZWZpbml0aW9ucworZm9yIGVuYWJsaW5nIENhbWVyYSBGRCBIVy4gTVNNIGNhbWVyYSBGRCBpcyBpbXBsZW1lbnRlZCBpbiBtdWx0aXBsZQorZGV2aWNlIG5vZGVzLiBUaGUgcm9vdCBGRCBkZXZpY2Ugbm9kZSBoYXMgcHJvcGVydGllcyBkZWZpbmVkIHRvIGhpbnQKK3RoZSBkcml2ZXIgYWJvdXQgdGhlIEZEIEhXIG5vZGVzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHByb2JlIHNlcXVlbmNlLgorRWFjaCBub2RlIGhhcyBtdWx0aXBsZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIGludGVycnVwdHMsIGNsb2NrcyBhbmQKK3JlZ3VsYXRvcnMuCisKKz09PT09PT09PT09PT09PT09PT09PT09CitSZXF1aXJlZCBOb2RlIFN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT0KK0ZEIHJvb3QgaW50ZXJmYWNlIG5vZGUgdGFrZXMgY2FyZSBvZiB0aGUgaGFuZGxpbmcgRmFjZSBEZXRlY3Rpb24gaGlnaCBsZXZlbAorZHJpdmVyIGhhbmRsaW5nIGFuZCBjb250cm9scyB1bmRlcmx5aW5nIEZEIGhhcmR3YXJlIHByZXNlbnQuCisKKy0gY29tcGF0aWJsZQorICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHN0cmluZz4KKyAgRGVmaW5pdGlvbjogU2hvdWxkIGJlICJxY29tLGNhbS1mZCIuCisKKy0gY29tcGF0LWh3LW5hbWUKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IFNob3VsZCBiZSAicWNvbSxmZCIuCisKKy0gbnVtLWZkCisgIFVzYWdlOiByZXF1aXJlZAorICBWYWx1ZSB0eXBlOiA8dTMyPgorICBEZWZpbml0aW9uOiBOdW1iZXIgb2Ygc3VwcG9ydGVkIEZEIEhXIGJsb2Nrcy4KKworRXhhbXBsZToKKwlxY29tLGNhbS1mZCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjYW0tZmQiOworCQljb21wYXQtaHctbmFtZSA9ICJxY29tLGZkIjsKKwkJbnVtLWZkID0gPDE+OworCX07CisKKz09PT09PT09PT09PT09PT09PT09PT09CitSZXF1aXJlZCBOb2RlIFN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT0KK0ZEIE5vZGUgcHJvdmlkZXMgaW50ZXJmYWNlIGZvciBGYWNlIERldGVjdGlvbiBoYXJkd2FyZSBkcml2ZXIKK2Fib3V0IHRoZSBkZXZpY2UgcmVnaXN0ZXIgbWFwLCBpbnRlcnJ1cHQgbWFwLCBjbG9ja3MsIHJlZ3VsYXRvcnMuCisKKy0gY2VsbC1pbmRleAorICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogTm9kZSBpbnN0YW5jZSBudW1iZXIuCisKKy0gY29tcGF0aWJsZQorICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHN0cmluZz4KKyAgRGVmaW5pdGlvbjogU2hvdWxkIGJlICJxY29tLGZkNDEiLgorCistIHJlZy1uYW1lcworICBVc2FnZTogb3B0aW9uYWwKKyAgVmFsdWUgdHlwZTogPHN0cmluZz4KKyAgRGVmaW5pdGlvbjogTmFtZSBvZiB0aGUgcmVnaXN0ZXIgcmVzb3VyY2VzLgorCistIHJlZworICBVc2FnZTogb3B0aW9uYWwKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogUmVnaXN0ZXIgdmFsdWVzLgorCistIHJlZy1jYW0tYmFzZQorICBVc2FnZTogb3B0aW9uYWwKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogT2Zmc2V0IG9mIHRoZSByZWdpc3RlciBzcGFjZSBjb21wYXJlZCB0bworICAgICAgICAgICAgICB0byBDYW1lcmEgYmFzZSByZWdpc3RlciBzcGFjZS4KKworLSBpbnRlcnJ1cHQtbmFtZXMKKyAgVXNhZ2U6IG9wdGlvbmFsCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IE5hbWUgb2YgdGhlIGludGVycnVwdC4KKworLSBpbnRlcnJ1cHRzCisgIFVzYWdlOiBvcHRpb25hbAorICBWYWx1ZSB0eXBlOiA8dTMyPgorICBEZWZpbml0aW9uOiBJbnRlcnJ1cHQgbGluZSBhc3NvY2lhdGVkIHdpdGggRkQgSFcuCisKKy0gcmVndWxhdG9yLW5hbWVzCisgIFVzYWdlOiByZXF1aXJlZAorICBWYWx1ZSB0eXBlOiA8c3RyaW5nPgorICBEZWZpbml0aW9uOiBOYW1lIG9mIHRoZSByZWd1bGF0b3IgcmVzb3VyY2VzIGZvciBGRCBIVy4KKworLSBjYW1zcy12ZGQtc3VwcGx5CisgIFVzYWdlOiByZXF1aXJlZAorICBWYWx1ZSB0eXBlOiA8cGhhbmRsZT4KKyAgRGVmaW5pdGlvbjogUmVndWxhdG9yIHJlZmVyZW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYW1lcyBsaXN0ZWQKKyAgICAgICAgICAgICAgaW4gInJlZ3VsYXRvci1uYW1lcyIuCisKKy0gY2xvY2stbmFtZXMKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IExpc3Qgb2YgY2xvY2sgbmFtZXMgcmVxdWlyZWQgZm9yIEZEIEhXLgorCistIGNsb2NrcworICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHBoYW5kbGU+CisgIERlZmluaXRpb246IExpc3Qgb2YgY2xvY2tzIHJlcXVpcmVkIGZvciBGRCBIVy4KKworLSBjbG9jay1yYXRlcworICBVc2FnZTogcmVxdWlyZWQKKyAgVmFsdWUgdHlwZTogPHUzMj4KKyAgRGVmaW5pdGlvbjogTGlzdCBvZiBjbG9ja3MgcmF0ZXMuCisKKy0gc3JjLWNsb2NrLW5hbWUKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IFNvdXJjZSBjbG9jayBuYW1lLgorCistIGNsb2NrLWNudGwtbGV2ZWwKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IExpc3Qgb2Ygc3RyaW5ncyBjb3JyZXNwb25kcyBjbG9jay1yYXRlcyBsZXZlbHMuCisgIFN1cHBvcnRlZCBzdHJpbmdzOiBtaW5zdnMsIGxvd3N2cywgc3ZzLCBzdnNfbDEsIG5vbWluYWwsIHR1cmJvLgorCitFeGFtcGxlczoKKwljYW1fZmQ6IHFjb20sZmRAYWM1YTAwMCB7CisJCWNlbGwtaW5kZXggPSA8MD47CisJCWNvbXBhdGlibGUgPSAicWNvbSxmZDQxIjsKKwkJcmVnLW5hbWVzID0gImZkX2NvcmUiLCAiZmRfd3JhcHBlciI7CisJCXJlZyA9IDwweGFjNWEwMDAgMHgxMDAwPiwKKwkJCTwweGFjNWIwMDAgMHg0MDA+OworCQlyZWctY2FtLWJhc2UgPSA8MHg1YTAwMCAweDViMDAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImZkIjsKKwkJaW50ZXJydXB0cyA9IDwwIDQ2MiAwPjsKKwkJcmVndWxhdG9yLW5hbWVzID0gImNhbXNzLXZkZCI7CisJCWNhbXNzLXZkZC1zdXBwbHkgPSA8JnRpdGFuX3RvcF9nZHNjPjsKKwkJY2xvY2stbmFtZXMgPSAiZ2NjX2FoYl9jbGsiLAorCQkJImdjY19heGlfY2xrIiwKKwkJCSJzb2NfYWhiX2NsayIsCisJCQkiY3Bhc19haGJfY2xrIiwKKwkJCSJjYW1ub2NfYXhpX2NsayIsCisJCQkiZmRfY29yZV9jbGtfc3JjIiwKKwkJCSJmZF9jb3JlX2NsayIsCisJCQkiZmRfY29yZV91YXJfY2xrIjsKKwkJY2xvY2tzID0gPCZjbG9ja19nY2MgR0NDX0NBTUVSQV9BSEJfQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19DQU1FUkFfQVhJX0NMSz4sCisJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19TT0NfQUhCX0NMSz4sCisJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19DUEFTX0FIQl9DTEs+LAorCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQ0FNTk9DX0FYSV9DTEs+LAorCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfRkRfQ09SRV9DTEtfU1JDPiwKKwkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0ZEX0NPUkVfQ0xLPiwKKwkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0ZEX0NPUkVfVUFSX0NMSz47CisJCXNyYy1jbG9jay1uYW1lID0gImZkX2NvcmVfY2xrX3NyYyI7CisJCWNsb2NrLWNudGwtbGV2ZWwgPSAic3ZzIjsKKwkJY2xvY2stcmF0ZXMgPSA8MCAwIDAgMCAwIDQwMDAwMDAwMCAwIDA+OworCX07CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLWljcC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1pY3AudHh0CmluZGV4IDBjNjNjN2UuLjM2ZGFkMWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLWljcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS1jYW0taWNwLnR4dApAQCAtMTA1LDYgKzEwNSwxMSBAQAogICBWYWx1ZSB0eXBlOiA8c3RyaW5nPgogICBEZWZpbml0aW9uOiBMaXN0IG9mIGNsb2NrIG5hbWVzIHJlcXVpcmVkIGZvciBDRE0gSFcuCiAKKy0gc3JjLWNsb2NrLW5hbWUKKyAgVXNhZ2U6IHJlcXVpcmVkCisgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgIERlZmluaXRpb246IFNvdXJjZSBjbG9jayBuYW1lLgorCiAtIGNsb2NrcwogICBVc2FnZTogcmVxdWlyZWQKICAgVmFsdWUgdHlwZTogPHBoYW5kbGU+CkBAIC0xMTQsNyArMTE5LDcgQEAKICAgVXNhZ2U6IHJlcXVpcmVkCiAgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CiAgIERlZmluaXRpb246IExpc3Qgb2Ygc3RyaW5ncyBjb3JyZXNwb25kcyBjbG9jay1yYXRlcyBsZXZlbHMuCi0gIFN1cHBvcnRlZCBzdHJpbmdzOiBtaW5zdnMsIGxvd3N2cywgc3ZzLCBzdnNfbDEsIG5vbWluYWwsIHR1cmJvLgorICBTdXBwb3J0ZWQgc3RyaW5nczogbG93c3ZzLCBzdnMsIHN2c19sMSwgbm9taW5hbCwgdHVyYm8uCiAKIC0gY2xvY2stcmF0ZXMKICAgVXNhZ2U6IHJlcXVpcmVkCkBAIC0xNzYsMTQgKzE4MSwyMCBAQAogCQkiaXBlXzBfYXhpX2NsayIsCiAJCSJpcGVfMF9jbGsiLAogCQkiaXBlXzBfY2xrX3NyYyI7CisJc3JjLWNsb2NrLW5hbWUgPSAiaXBlXzBfY2xrX3NyYyI7CiAJY2xvY2tzID0gPCZjbG9ja19jYW1jYyBDQU1fQ0NfSVBFXzBfQUhCX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMF9BUkVHX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMF9BWElfQ0xLPiwKIAkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8wX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMF9DTEtfU1JDPjsKIAotCWNsb2NrLXJhdGVzID0gPDgwMDAwMDAwIDQwMDAwMDAwMCAwIDAgNjAwMDAwMDAwPjsKLQljbG9jay1jbnRsLWxldmVsID0gInR1cmJvIjsKKwljbG9jay1yYXRlcyA9IDwwIDAgMCAwIDI0MDAwMDAwMD4sCisJCTwwIDAgMCAwIDQwNDAwMDAwMD4sCisJCTwwIDAgMCAwIDQ4MDAwMDAwMD4sCisJCTwwIDAgMCAwIDUzODAwMDAwMD4sCisJCTwwIDAgMCAwIDYwMDAwMDAwMD47CisJY2xvY2stY250bC1sZXZlbCA9ICJsb3dzdnMiLCAic3ZzIiwKKwkJInN2c19sMSIsICJub21pbmFsIiwgInR1cmJvIjsKIH07CiAKIHFjb20saXBlMSB7CkBAIC0xOTYsMTQgKzIwNywyMCBAQAogCQkiaXBlXzFfYXhpX2NsayIsCiAJCSJpcGVfMV9jbGsiLAogCQkiaXBlXzFfY2xrX3NyYyI7CisJc3JjLWNsb2NrLW5hbWUgPSAiaXBlXzFfY2xrX3NyYyI7CiAJY2xvY2tzID0gPCZjbG9ja19jYW1jYyBDQU1fQ0NfSVBFXzFfQUhCX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMV9BUkVHX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMV9BWElfQ0xLPiwKIAkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8xX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMV9DTEtfU1JDPjsKIAotCWNsb2NrLXJhdGVzID0gPDgwMDAwMDAwIDQwMDAwMDAwMCAwIDAgNjAwMDAwMDAwPjsKLQljbG9jay1jbnRsLWxldmVsID0gInR1cmJvIjsKKwljbG9jay1yYXRlcyA9IDwwIDAgMCAwIDI0MDAwMDAwMD4sCisJCTwwIDAgMCAwIDQwNDAwMDAwMD4sCisJCTwwIDAgMCAwIDQ4MDAwMDAwMD4sCisJCTwwIDAgMCAwIDUzODAwMDAwMD4sCisJCTwwIDAgMCAwIDYwMDAwMDAwMD47CisJY2xvY2stY250bC1sZXZlbCA9ICJsb3dzdnMiLCAic3ZzIiwKKwkJInN2c19sMSIsICJub21pbmFsIiwgInR1cmJvIjsKIH07CiAKIGJwczogcWNvbSxicHMgewpAQCAtMjE2LDEzICsyMzMsMTkgQEAKIAkJImJwc19heGlfY2xrIiwKIAkJImJwc19jbGsiLAogCQkiYnBzX2Nsa19zcmMiOworCXNyYy1jbG9jay1uYW1lID0gImJwc19jbGtfc3JjIjsKIAljbG9ja3MgPSA8JmNsb2NrX2NhbWNjIENBTV9DQ19CUFNfQUhCX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19CUFNfQVJFR19DTEs+LAogCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQlBTX0FYSV9DTEs+LAogCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQlBTX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19CUFNfQ0xLX1NSQz47CiAKLQljbG9jay1yYXRlcyA9IDw4MDAwMDAwMCA0MDAwMDAwMDAgMCAwIDYwMDAwMDAwMD47Ci0JY2xvY2stY250bC1sZXZlbCA9ICJ0dXJibyI7CisJY2xvY2stcmF0ZXMgPSA8MCAwIDAgMCAyMDAwMDAwMDA+LAorCQk8MCAwIDAgMCA0MDQwMDAwMDA+LAorCQk8MCAwIDAgMCA0ODAwMDAwMDA+LAorCQk8MCAwIDAgMCA2MDAwMDAwMDA+LAorCQk8MCAwIDAgMCA2MDAwMDAwMDA+OworCWNsb2NrLWNudGwtbGV2ZWwgPSAibG93c3ZzIiwgInN2cyIsCisJCSJzdnNfbDEiLCAibm9taW5hbCIsICJ0dXJibyI7CiB9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLWNhbS1zbW11LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLXNtbXUudHh0CmluZGV4IDcyZTJhYjQuLjcyOGM1ZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLXNtbXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tY2FtLXNtbXUudHh0CkBAIC01Niw2ICs1NiwxMSBAQAogICBWYWx1ZSB0eXBlOiA8c3RyaW5nPgogICBEZWZpbml0aW9uOiBTaG91bGQgc3BlY2lmeSBhIHN0cmluZyBsYWJlbCB0byBpZGVudGlmeSB0aGUgY29udGV4dCBiYW5rLgogCistIHFjb20sc2VjdXJlLWNiCisgIFVzYWdlOiBvcHRpb25hbAorICBWYWx1ZSB0eXBlOiBib29sZWFuCisgIERlZmluaXRpb246IFNwZWNpZmllcyBpZiB0aGUgY29udGV4dCBiYW5rIGlzIGEgc2VjdXJlIGNvbnRleHQgYmFuay4KKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBUaGlyZCBMZXZlbCBOb2RlIC0gQ0FNIFNNTVUgbWVtb3J5IG1hcCBkZXZpY2UKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS1zZGUtcm90YXRvci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLXNkZS1yb3RhdG9yLnR4dAppbmRleCA0NjY0OWFmLi5kYjM0MDQ3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLXNkZS1yb3RhdG9yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLXNkZS1yb3RhdG9yLnR4dApAQCAtMTIzLDYgKzEyMyw3IEBACiAJCQkJc3dpenpsZSBjb25maWd1cmF0aW9uIHZhbHVlLgogLSBxY29tLHJvdC1yZWctYnVzOgkJUHJvcGVydHkgdG8gcHJvdmlkZSBCdXMgc2NhbGluZyBmb3IgcmVnaXN0ZXIKIAkJCQlhY2Nlc3MgZm9yIHJvdGF0b3IgYmxvY2tzLgorLSBwb3dlci1kb21haW5zOgkJQSBwaGFuZGxlIHRvIHJlc3BlY3RpdmUgcG93ZXIgZG9tYWluIG5vZGUuCiAKIFN1Ym5vZGUgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZToJCUNvbXBhdGlibGUgbmFtZSB1c2VkIGluIHNtbXUgdjIuCkBAIC0xNTAsNiArMTUxLDggQEAKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbWRzc19tZHA+OwogCQlpbnRlcnJ1cHRzID0gPDIgMD47CiAKKwkJcG93ZXItZG9tYWlucyA9IDwmbWRzc19tZHA+OworCiAJCXFjb20sbWRzcy1tZHAtcmVnLW9mZnNldCA9IDwweDAwMDAxMDAwPjsKIAogCQlyb3QtdmRkLXN1cHBseSA9IDwmZ2RzY19tZHNzPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tdmlkYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVkaWEvdmlkZW8vbXNtLXZpZGMudHh0CmluZGV4IGQ2MTYwNmEuLmYwNTQ5Y2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZWRpYS92aWRlby9tc20tdmlkYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lZGlhL3ZpZGVvL21zbS12aWRjLnR4dApAQCAtNyw5ICs3LDExIEBACiAtIGNvbXBhdGlibGUgOiBvbmUgb2Y6CiAJLSAicWNvbSxtc20tdmlkYyIKICAgICAgICAgLSAicWNvbSxzZG04NDUtdmlkYyIgOiBJbnZva2VzIGRyaXZlciBzcGVjaWZpYyBkYXRhIGZvciBTRE04NDUuCisgICAgICAgIC0gInFjb20sc2RtNjcwLXZpZGMiIDogSW52b2tlcyBkcml2ZXIgc3BlY2lmaWMgZGF0YSBmb3IgU0RNNjcwLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSByZWcgOiBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorLSBza3UtaW5kZXggOiBza3UgdmVyc2lvbiBvZiB0aGUgaGFyZHdhcmUuCiAtIGludGVycnVwdHMgOiBzaG91bGQgY29udGFpbiB0aGUgdmlkYyBpbnRlcnJ1cHQuCiAtIHFjb20scmVnLXByZXNldHMgOiBsaXN0IG9mIG9mZnNldC12YWx1ZSBwYWlycyBmb3IgcmVnaXN0ZXJzIHRvIGJlIHdyaXR0ZW4uCiAgIFRoZSBvZmZzZXRzIGFyZSBmcm9tIHRoZSBiYXNlIG9mZnNldCBzcGVjaWZpZWQgaW4gJ3JlZycuIFRoaXMgaXMgbWFpbmx5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLW1zbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLW1zbS50eHQKaW5kZXggMjRjNzVlMi4uZDMwOThiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zZGhjaS1tc20udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktbXNtLnR4dApAQCAtODUsNiArODUsNyBAQAogCSAgT24gY2VydGFpbiBjaGlwc2V0cywgY29taW5nIG91dCBvZiB0aGUgQ1ggUG93ZXIgQ29sbGFwc2UgZXZlbnQsIHRoZSBTRENDIHJlZ2lzdGVycwogCSAgY29udGVudHMgd2lsbCBub3QgYmUgcmV0YWluZWQuIEl0IGlzIHNvZnR3YXJlIHJlc3BvbnNpYmlsaXR5IHRvIHJlc3RvcmUgdGhlCiAJICBTRENDIHJlZ2lzdGVycyBiZWZvcmUgcmVzdW1pbmcgdG8gbm9ybWFsIG9wZXJhdGlvbi4KKwktIHFjb20sZm9yY2Utc2RoYzEtcHJvYmU6IEZvcmNlIHByb2Jpbmcgc2RoYzEgZXZlbiBpZiBpdCBpcyBub3QgdGhlIGJvb3QgZGV2aWNlLgogCiBJbiB0aGUgZm9sbG93aW5nLCA8c3VwcGx5PiBjYW4gYmUgdmRkIChmbGFzaCBjb3JlIHZvbHRhZ2UpIG9yIHZkZC1pbyAoSS9PIHZvbHRhZ2UpLgogCS0gcWNvbSw8c3VwcGx5Pi1hbHdheXMtb24gLSBzcGVjaWZpZXMgd2hldGhlciBzdXBwbHkgc2hvdWxkIGJlIGtlcHQgIm9uIiBhbHdheXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL21zbV9wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvbXNtX3BjaWUudHh0CmluZGV4IGZjMDE5YmQuLjJhNTA5NmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvbXNtX3BjaWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvbXNtX3BjaWUudHh0CkBAIC03MCwxMyArNzAsMTIgQEAKICAgLSBxY29tLGNvbW1vbi1jbGstZW46IEVuYWJsZXMgdGhlIGNvbW1vbiBjbG9jayBjb25maWd1cmF0aW9uIGZvciB0aGUgZW5kcG9pbnQuCiAgIC0gcWNvbSxjbGstcG93ZXItbWFuYWdlLWVuOiBFbmFibGVzIHRoZSBjbG9jayBwb3dlciBtYW5hZ2VtZW50IGZvciB0aGUKICAgICBlbmRwb2ludC4KKyAgLSBxY29tLG1heC1saW5rLXNwZWVkOiBNYXggR2VuIHNwZWVkIFJvb3QgY29tcGxleCBzdXBwb3J0cy4KICAgLSBxY29tLG4tZnRzOiBUaGUgbnVtYmVyIG9mIGZhc3QgdHJhaW5pbmcgc2VxdWVuY2VzIHNlbnQgd2hlbiB0aGUgbGluayBzdGF0ZQogICAgIGlzIGNoYW5nZWQgZnJvbSBMMHMgdG8gTDAuCiAgIC0gcWNvbSxwY2llLXBoeS12ZXI6IHZlcnNpb24gb2YgUENJZSBQSFkuCiAgIC0gcWNvbSxwaHktc2VxdWVuY2U6IFRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSB0byBicmluZyB1cCB0aGUgUENJZSBQSFkuCiAgICAgU2hvdWxkIGJlIHNwZWNpZmllZCBpbiBncm91cHMgKG9mZnNldCwgdmFsdWUsIGRlbGF5KS4KLSAgLSBxY29tLHBvcnQtcGh5LXNlcXVlbmNlOiBUaGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgdG8gYnJpbmcgdXAgdGhlCi0gICAgUENJZSBwb3J0IFBIWS4KICAgICBTaG91bGQgYmUgc3BlY2lmaWVkIGluIGdyb3VwcyAob2Zmc2V0LCB2YWx1ZSwgZGVsYXkpLgogICAtIHFjb20sdXNlLTE5cDJtaHotYXV4LWNsazogVGhlIGZyZXF1ZW5jeSBvZiBQQ0llIEFVWCBjbG9jayBpcyAxOS4yTUh6LgogICAtIHFjb20sYm9vdC1vcHRpb246IEJpdHMgdGhhdCBhbHRlciBQQ0llIGJ1cyBkcml2ZXIgYm9vdCBzZXF1ZW5jZS4KQEAgLTkxLDcgKzkwLDYgQEAKICAgLSBpb21tdXM6IHRoZSBwaGFuZGxlIGFuZCBzdHJlYW0gSURzIGZvciB0aGUgU01NVSB1c2VkIGJ5IHRoaXMgcm9vdAogICAgIGNvbXBsZXguIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gc2VwYXJhdGUgbm9kZXMgZnJvbSB0aGUgbWFpbiByb290CiAgICAgY29tcGxleCBub2RlcywgYW5kIGlzIHRoZSBvbmx5IHByb3BlcnR5IG5lZWRlZCBpbiB0aGF0IGNhc2UuCi0gIC0gcWNvbSxjb21tb24tcGh5OiBUaGVyZSBpcyBhIGNvbW1vbiBwaHkgZm9yIGFsbCB0aGUgUm9vdCBDb21wbGV4ZXMuCiAgIC0gcWNvbSxzbW11LWV4aXN0OiBQQ0llIHVzZXMgYSBTTU1VLgogICAtIHFjb20sc21tdS1zaWQtYmFzZTogVGhlIGJhc2UgU01NVSBTSUQgdGhhdCBQQ0llIGJ1cyBkcml2ZXIgd2lsbCB1c2UgdG8gY2FsY3VsYXRlCiAgICAgYW5kIGFzc2lnbiBmb3IgZWFjaCBlbmRwb2ludC4KQEAgLTk5LDYgKzk3LDcgQEAKICAgICBzdGFibGUgYWZ0ZXIgcG93ZXIgb24sIGJlZm9yZSBkZS1hc3NlcnQgdGhlIFBFUlNUIHRvIHRoZSBlbmRwb2ludC4KICAgLSBxY29tLHdyLWhhbHQtc2l6ZTogV2l0aCBiYXNlIDIsIHRoaXMgZXhwb25lbnQgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUKICAgICBkYXRhIHRoYXQgUENJZSBjb3JlIHdpbGwgaGFsdCBvbiBmb3IgZWFjaCB3cml0ZSB0cmFuc2FjdGlvbi4KKyAgLSBxY29tLHNsdi1hZGRyLXNwYWNlLXNpemU6IFRoZSBtZW1vcnkgc3BhY2Ugc2l6ZSBvZiBQQ0llIFJvb3QgQ29tcGxleC4KICAgLSBxY29tLGNwbC10aW1lb3V0OiBDb21wbGV0aW9uIHRpbWVvdXQgdmFsdWUuIFRoaXMgdmFsdWUgc3BlY2lmaWVzIHRoZSB0aW1lIHJhbmdlCiAgICAgd2hpY2ggdGhlIHJvb3QgY29tcGxleCB3aWxsIHNlbmQgb3V0IGEgY29tcGxldGlvbiBwYWNrZXQgaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UKICAgICBmcm9tIHRoZSBlbmRwb2ludC4KQEAgLTIxNCwxMyArMjEzLDYgQEAKIAkJCQkJMHgxNWMgMHgwNiAweDAwCiAJCQkJCTB4MDkwIDB4MDEgMHgwMAogCQkJCQkweDgwOCAweDAzIDB4MDA+OwotCQlxY29tLHBvcnQtcGh5LXNlcXVlbmNlID0gPDB4ODA0IDB4MDEgMHgwMAotCQkJCQkweDAzNCAweDE0IDB4MDAKLQkJCQkJMHgxMzggMHgzMCAweDAwCi0JCQkJCTB4MDQ4IDB4MGYgMHgwMAotCQkJCQkweDE1YyAweDA2IDB4MDAKLQkJCQkJMHgwOTAgMHgwMSAweDAwCi0JCQkJCTB4ODA4IDB4MDMgMHgwMD47CiAJCXBlcnN0LWdwaW8gPSA8Jm1zbWdwaW8gNzAgMD47CiAJCXdha2UtZ3BpbyA9IDwmbXNtZ3BpbyA2OSAwPjsKIAkJY2xrcmVxLWdwaW8gPSA8Jm1zbWdwaW8gNjggMD47CkBAIC0yNjUsNiArMjU3LDcgQEAKIAkJcWNvbSxsMS1zdXBwb3J0ZWQ7CiAJCXFjb20sbDFzcy1zdXBwb3J0ZWQ7CiAJCXFjb20sYXV4LWNsay1zeW5jOworCQlxY29tLG1heC1saW5rLXNwZWVkID0gPDB4Mj47CiAJCXFjb20sbi1mdHMgPSA8MHg1MD47CiAJCXFjb20scGNpZS1waHktdmVyID0gPDE+OwogCQlxY29tLGJvb3Qtb3B0aW9uID0gPDB4MT47CkBAIC0yNzIsMTEgKzI2NSwxMSBAQAogCQlxY29tLG1zaS1naWNtLWJhc2UgPSA8MHgxNjA+OwogCQlxY29tLGV4dC1yZWYtY2xrOwogCQlxY29tLHRscC1yZC1zaXplID0gPDB4NT47Ci0JCXFjb20sY29tbW9uLXBoeTsKIAkJcWNvbSxzbW11LWV4aXN0OwogCQlxY29tLHNtbXUtc2lkLWJhc2UgPSA8MHgxNDgwPjsKIAkJcWNvbSxlcC1sYXRlbmN5ID0gPDEwMD47CiAJCXFjb20sd3ItaGFsdC1zaXplID0gPDB4YT47IC8qIDFLQiAqLworCQlxY29tLHNsdi1hZGRyLXNwYWNlLXNpemUgPSA8MHgxMDAwMDAwPjsgLyogMTZNQiAqLwogCQlxY29tLGNwbC10aW1lb3V0ID0gPDB4Mj47CiAKIAkJaW9tbXVzID0gPCZhbm9jMF9zbW11PjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waWwvcGlsLXE2djUtbXNzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waWwvcGlsLXE2djUtbXNzLnR4dAppbmRleCBiYzg0NGRlLi44NWIwZmU5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGlsL3BpbC1xNnY1LW1zcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbC9waWwtcTZ2NS1tc3MudHh0CkBAIC02Nyw2ICs2Nyw5IEBACiAJCQkgIHNlcnZpY2UuCiAtIHFjb20sc3lzbW9uLWlkOglwbGF0Zm9ybSBkZXZpY2UgaWQgdGhhdCBzeXNtb24gaXMgcHJvYmVkIHdpdGggZm9yIHRoZSBzdWJzeXN0ZW0uCiAtIHFjb20sb3ZlcnJpZGUtYWNjOiBCb29sZWFuLSBQcmVzZW50IGlmIHdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgQUNDIHNldHRpbmdzCistIHFjb20sbXNzX3BkY19vZmZzZXQ6IEludGVnZXItIE1hbmRhdG9yeSBpZiBQREMgcmVnaXN0ZXIgaXMgc3BlY2lmaWVkLiBJdCBpcworCQkJCXVzZWQgdG8gc3BlY2lmeSB3aGljaCBiaXQgaW4gdGhlIFBEQyByZWdpc3RlcgorCQkJCWNvcnJlc3BvbmRzIHRvIHRoZSBtb2RlbS4KIC0gcWNvbSxhaGItY2xrLXZvdGU6IEJvb2xlYW4tIFByZXNlbnQgaWYgd2UgbmVlZCB0byByZW1vdmUgdGhlIHZvdGUgZm9yIHRoZSBtc3NfY2ZnX2FoYgogCQkgICAgIGNsb2NrIGFmdGVyIHRoZSBtb2RlbSBib290cyB1cAogLSBxY29tLHBub2MtY2xrLXZvdGU6IEJvb2xlYW4tIFByZXNlbnQgaWYgdGhlIG1vZGVtIG5lZWRzIHRoZSBQTk9DIGJ1cyB0byBiZQpAQCAtOTAsNiArOTMsNyBAQAogCQkgICAgd29yZGxpbmUgY2xhbXAsIGFuZCBjb21waWxlciBtZW1vcnkgY2xhbXAgZHVyaW5nIE1TUyByZXN0YXJ0LgogLSBxY29tLHFkc3A2djU2LTEtMTA6IEJvb2xlYW4tIFByZXNlbnQgaWYgdGhlIHFkc3AgdmVyc2lvbiBpcyB2NTYgMS4xMAogLSBxY29tLG92ZXJyaWRlLWFjYy0xOiBPdmVycmlkZSB0aGUgZGVmYXVsdCBBQ0Mgc2V0dGluZ3Mgd2l0aCB0aGlzIHZhbHVlIGlmIHByZXNlbnQuCistIHFjb20sbWluaWR1bXAtaWQ6IFVuaXF1ZSBpZCBmb3IgZWFjaCBzdWJzeXN0ZW0KIAogT25lIGNoaWxkIG5vZGUgdG8gcmVwcmVzZW50IHRoZSBNQkEgaW1hZ2UgbWF5IGJlIHNwZWNpZmllZCwgd2hlbiB0aGUgTUJBIGltYWdlCiBuZWVkcyB0byBiZSBsb2FkZWQgaW4gYSBzcGVjaWZpY2FsbHkgY2FydmVkIG91dCBtZW1vcnkgcmVnaW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTUzLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxtc204OTUzLXBpbmN0cmwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmYxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLG1zbTg5NTMtcGluY3RybC50eHQKQEAgLTAsMCArMSwyMTAgQEAKK1F1YWxjb21tIE1TTTg5NTMgVExNTSBibG9jaworCitUaGlzIGJpbmRpbmcgZGVzY3JpYmVzIHRoZSBUb3AgTGV2ZWwgTW9kZSBNdWx0aXBsZXhlciBibG9jayBmb3VuZCBpbiB0aGUKK01TTTg5NTMgcGxhdGZvcm0uCisKKy0gY29tcGF0aWJsZToKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IG11c3QgYmUgInFjb20sbXNtODk1My1waW5jdHJsIgorCistIHJlZzoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IHRoZSBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIFRMTU0gcmVnaXN0ZXIgc3BhY2UuCisKKy0gaW50ZXJydXB0czoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IHNob3VsZCBzcGVjaWZ5IHRoZSBUTE1NIHN1bW1hcnkgSVJRLgorCistIGludGVycnVwdC1jb250cm9sbGVyOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxub25lPgorCURlZmluaXRpb246IGlkZW50aWZpZXMgdGhpcyBub2RlIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyCisKKy0gI2ludGVycnVwdC1jZWxsczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IG11c3QgYmUgMi4gU3BlY2lmeWluZyB0aGUgcGluIG51bWJlciBhbmQgZmxhZ3MsIGFzIGRlZmluZWQKKwkJICAgIGluIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEuaD4KKworLSBncGlvLWNvbnRyb2xsZXI6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPG5vbmU+CisJRGVmaW5pdGlvbjogaWRlbnRpZmllcyB0aGlzIG5vZGUgYXMgYSBncGlvIGNvbnRyb2xsZXIKKworLSAjZ3Bpby1jZWxsczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IG11c3QgYmUgMi4gU3BlY2lmeWluZyB0aGUgcGluIG51bWJlciBhbmQgZmxhZ3MsIGFzIGRlZmluZWQKKwkJICAgIGluIDxkdC1iaW5kaW5ncy9ncGlvL2dwaW8uaD4KKworUGxlYXNlIHJlZmVyIHRvIC4uL2dwaW8vZ3Bpby50eHQgYW5kIC4uL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0IGZvcgorYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIEdQSU8gYW5kIGludGVycnVwdCBiaW5kaW5ncy4KKworUGxlYXNlIHJlZmVyIHRvIHBpbmN0cmwtYmluZGluZ3MudHh0IGluIHRoaXMgZGlyZWN0b3J5IGZvciBkZXRhaWxzIG9mIHRoZQorY29tbW9uIHBpbmN0cmwgYmluZGluZ3MgdXNlZCBieSBjbGllbnQgZGV2aWNlcywgaW5jbHVkaW5nIHRoZSBtZWFuaW5nIG9mIHRoZQorcGhyYXNlICJwaW4gY29uZmlndXJhdGlvbiBub2RlIi4KKworVGhlIHBpbiBjb25maWd1cmF0aW9uIG5vZGVzIGFjdCBhcyBhIGNvbnRhaW5lciBmb3IgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgorc3Vibm9kZXMuIEVhY2ggb2YgdGhlc2Ugc3Vibm9kZXMgcmVwcmVzZW50cyBzb21lIGRlc2lyZWQgY29uZmlndXJhdGlvbiBmb3IgYQorcGluLCBhIGdyb3VwLCBvciBhIGxpc3Qgb2YgcGlucyBvciBncm91cHMuIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gaW5jbHVkZSB0aGUKK211eCBmdW5jdGlvbiB0byBzZWxlY3Qgb24gdGhvc2UgcGluKHMpL2dyb3VwKHMpLCBhbmQgdmFyaW91cyBwaW4gY29uZmlndXJhdGlvbgorcGFyYW1ldGVycywgc3VjaCBhcyBwdWxsLXVwLCBkcml2ZSBzdHJlbmd0aCwgZXRjLgorCisKK1BJTiBDT05GSUdVUkFUSU9OIE5PREVTOgorCitUaGUgbmFtZSBvZiBlYWNoIHN1Ym5vZGUgaXMgbm90IGltcG9ydGFudDsgYWxsIHN1Ym5vZGVzIHNob3VsZCBiZSBlbnVtZXJhdGVkCithbmQgcHJvY2Vzc2VkIHB1cmVseSBiYXNlZCBvbiB0aGVpciBjb250ZW50LgorCitFYWNoIHN1Ym5vZGUgb25seSBhZmZlY3RzIHRob3NlIHBhcmFtZXRlcnMgdGhhdCBhcmUgZXhwbGljaXRseSBsaXN0ZWQuIEluCitvdGhlciB3b3JkcywgYSBzdWJub2RlIHRoYXQgbGlzdHMgYSBtdXggZnVuY3Rpb24gYnV0IG5vIHBpbiBjb25maWd1cmF0aW9uCitwYXJhbWV0ZXJzIGltcGxpZXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgYW55IHBpbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCitTaW1pbGFybHksIGEgcGluIHN1Ym5vZGUgdGhhdCBkZXNjcmliZXMgYSBwdWxsdXAgcGFyYW1ldGVyIGltcGxpZXMgbm8KK2luZm9ybWF0aW9uIGFib3V0IGUuZy4gdGhlIG11eCBmdW5jdGlvbi4KKworCitUaGUgZm9sbG93aW5nIGdlbmVyaWMgcHJvcGVydGllcyBhcyBkZWZpbmVkIGluIHBpbmN0cmwtYmluZGluZ3MudHh0IGFyZSB2YWxpZAordG8gc3BlY2lmeSBpbiBhIHBpbiBjb25maWd1cmF0aW9uIHN1Ym5vZGU6CisKKy0gcGluczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nLWFycmF5PgorCURlZmluaXRpb246IExpc3Qgb2YgZ3BpbyBwaW5zIGFmZmVjdGVkIGJ5IHRoZSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbgorCQkgICAgdGhpcyBzdWJub2RlLgorCQkgICAgVmFsaWQgcGlucyBhcmU6CisJCSAgICBncGlvMC1ncGlvMTQxLAorCQkgICAgc2RjMV9jbGssCisJCSAgICBzZGMxX2NtZCwKKwkJICAgIHNkYzFfZGF0YSwKKwkJICAgIHNkYzFfcmNsaywKKwkJICAgIHNkYzJfY2xrLAorCQkgICAgc2RjMl9jbWQsCisJCSAgICBzZGMyX2RhdGEsCisJCSAgICBxZHNkX2NtZCwKKwkJICAgIHFkc2RfZGF0YTAsCisJCSAgICBxZHNkX2RhdGExLAorCQkgICAgcWRzZF9kYXRhMiwKKwkJICAgIHFkc2RfZGF0YTMKKworLSBmdW5jdGlvbjoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IFNwZWNpZnkgdGhlIGFsdGVybmF0aXZlIGZ1bmN0aW9uIHRvIGJlIGNvbmZpZ3VyZWQgZm9yIHRoZQorCQkgICAgc3BlY2lmaWVkIHBpbnMuIEZ1bmN0aW9ucyBhcmUgb25seSB2YWxpZCBmb3IgZ3BpbyBwaW5zLgorCQkgICAgVmFsaWQgdmFsdWVzIGFyZToKKwlncGlvLCBibHNwX3NwaTEsIHNtYl9pbnQsIGFkc3BfZXh0LCBwcm5nX3Jvc2MsIGJsc3BfaTJjMSwKKwlxZHNzX2N0aV90cmlnX291dF9iMCwgcWRzc19jdGlfdHJpZ19vdXRfYTEsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwKKwlsZG9fdXBkYXRlLCBkYWNfY2FsaWIwLCBsZG9fZW4sIGJsc3BfaTJjMiwgZ2NjX2dwMV9jbGtfYiwKKwlhdGVzdF9ncHNhZGNfZHRlc3QwX25hdGl2ZSwgYmxzcF9zcGkzLCBxZHNzX3RyYWNlZGF0YV9iLAorCXB3cl9tb2RlbV9lbmFibGVkX2IsIGJsc3BfaTJjMywgZ2NjX2dwMl9jbGtfYiwgZ2NjX2dwM19jbGtfYiwgaGFsbF9pbnQsCisJYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBwd3JfbmF2X2VuYWJsZWRfYiwgZGFjX2NhbGliMSwgY2FwX2ludCwKKwlwd3JfY3J5cHRvX2VuYWJsZWRfYiwgZGFjX2NhbGliMiwgYmxzcF9pMmM0LCBuZmNfZGlzYWJsZSwgYmxzcF9zcGk1LAorCWJsc3BfdWFydDUsIHFkc3NfdHJhY2VjbGtfYSwgYXRlc3RfYmJyeDEsIG5mY19pcnEsIG1fdm9jLAorCXFkc3NfY3RpX3RyaWdfaW5fYTAsIGF0ZXN0X2JicngwLCBibHNwX2kyYzUsIHFkc3NfdHJhY2VjdGxfYSwKKwlhdGVzdF9ncHNhZGNfZHRlc3QxX25hdGl2ZSwgcWRzc190cmFjZWRhdGFfYSwgYmxzcF9zcGk2LCBibHNwX3VhcnQ2LAorCXFkc3NfdHJhY2VjdGxfYiwgZGFjX2NhbGliMTUsIHFkc3NfY3RpX3RyaWdfaW5fYjAsIGRhY19jYWxpYjE2LCBibHNwX2kyYzYsCisJcWRzc190cmFjZWNsa19iLCBhdGVzdF93bGFuMCwgYXRlc3Rfd2xhbjEsIG1kcF92c3luYywgcHJpX21pMnNfbWNsa19hLAorCXNlY19taTJzX21jbGtfYSwgcWRzc19jdGlfdHJpZ19vdXRfYjEsIGNhbV9tY2xrLCBkYWNfY2FsaWIzLCBjY2lfaTJjLAorCXB3cl9tb2RlbV9lbmFibGVkX2EsIGRhY19jYWxpYjQsIGRhY19jYWxpYjE5LCBmbGFzaF9zdHJvYmUsIGNjaV90aW1lcjAsCisJY2NpX3RpbWVyMSwgY2FtX2lycSwgY2NpX3RpbWVyMiwgYmxzcDFfc3BpLCBwd3JfbmF2X2VuYWJsZWRfYSwgb2lzX3N5bmMsCisJY2NpX3RpbWVyMywgY2NpX3RpbWVyNCwgYmxzcDNfc3BpLCBxZHNzX2N0aV90cmlnX291dF9hMCwgZGFjX2NhbGliNywKKwlhY2NlbF9pbnQsIGdjY19ncDFfY2xrX2EsIGRhY19jYWxpYjgsIGFsc3BfaW50LCBnY2NfZ3AyX2Nsa19hLCBkYWNfY2FsaWI5LAorCW1hZ19pbnQsIGdjY19ncDNfY2xrX2EsIHB3cl9jcnlwdG9fZW5hYmxlZF9hLCBjY2lfYXN5bmMsIGNhbTFfc3RhbmRieSwKKwlkYWNfY2FsaWI1LCBjYW0xX3JzdCwgZGFjX2NhbGliNiwgZGFjX2NhbGliMTAsIGd5cm9faW50LCBkYWNfY2FsaWIxMSwKKwlwcmVzc3VyZV9pbnQsIGRhY19jYWxpYjEyLCBibHNwNl9zcGksIGRhY19jYWxpYjEzLCBmcF9pbnQsCisJcWRzc19jdGlfdHJpZ19pbl9iMSwgZGFjX2NhbGliMTQsIHVpbV9iYXR0LCBjYW0wX2xkbywgc2Rfd3JpdGUsIHVpbTFfZGF0YSwKKwl1aW0xX2NsaywgdWltMV9yZXNldCwgdWltMV9wcmVzZW50LCB1aW0yX2RhdGEsIHVpbTJfY2xrLCB1aW0yX3Jlc2V0LAorCXVpbTJfcHJlc2VudCwgdHNfeHZkZCwgbWlwaV9kc2kwLCBuZmNfZHdsLCB1c19ldXJvLCBhdGVzdF9jaGFyMywgZGJnX291dCwKKwliaW1jX2R0ZTAsIHRzX3Jlc291dCwgdHNfc2FtcGxlLCBzZWNfbWkyc19tY2xrX2IsIHByaV9taTJzLCBjb2RlY19yZXNldCwKKwljZGNfcGRtMCwgYXRlc3RfY2hhcjEsIGViaV9jZGMsIGRhY19jYWxpYjE3LCB1c19lbWl0dGVyLCBhdGVzdF9jaGFyMCwKKwlwcmlfbWkyc19tY2xrX2IsIGxwYXNzX3NsaW1idXMsIGxwYXNzX3NsaW1idXMwLCBscGFzc19zbGltYnVzMSwgY29kZWNfaW50MSwKKwljb2RlY19pbnQyLCB3Y3NzX2J0LCBhdGVzdF9jaGFyMiwgZWJpX2NoMCwgd2Nzc193bGFuMiwgd2Nzc193bGFuMSwKKwl3Y3NzX3dsYW4wLCB3Y3NzX3dsYW4sIHdjc3NfZm0sIGV4dF9scGFzcywgbXNzX2x0ZSwga2V5X3ZvbHAsIHBiczAsCisJY3JpX3RybmcwLCBrZXlfc25hcHNob3QsIHBiczEsIGNyaV90cm5nMSwga2V5X2ZvY3VzLCBwYnMyLCBjcmlfdHJuZywKKwlnY2NfdGxtbSwga2V5X2hvbWUsIHB3cl9kb3duLCBkbWljMF9jbGssIGJsc3A3X3NwaSwgaGRtaV9pbnQsIGRtaWMwX2RhdGEsCisJcWRzc19jdGlfdHJpZ19pbl9hMSwgcHJpX21pMnNfd3MsIHdzYV9pbywgd3NhX2VuLCBibHNwX3NwaTgsIHdzYV9pcnEsCisJYmxzcF9pMmM4LCBnY2NfcGxsdGVzdCwgbmF2X3Bwc19pbl9hLCBwYV9pbmRpY2F0b3IsIG5hdl9wcHNfaW5fYiwgbmF2X3BwcywKKwltb2RlbV90c3luYywgbmF2X3RzeW5jLCBzc2JpX3d0cjEsIGdzbTFfdHgsIGRhY19jYWxpYjE4LCBnc20wX3R4LAorCWF0ZXN0X2NoYXIsIGF0ZXN0X3RzZW5zLCBiaW1jX2R0ZTEsIGRhY19jYWxpYjIwLCBjYW0yX3JzdCwgZGRyX2Jpc3QsCisJZGFjX2NhbGliMjEsIGNhbTJfc3RhbmRieSwgZGFjX2NhbGliMjIsIGNhbTNfcnN0LCBkYWNfY2FsaWIyMywKKwljYW0zX3N0YW5kYnksIGRhY19jYWxpYjI0LCBzZGNhcmRfZGV0LCBkYWNfY2FsaWIyNSwgY2FtMV9sZG8sIHNlY19taTJzLAorCWJsc3Bfc3BpNywgYmxzcF9pMmM3LCBzc19zd2l0Y2gsIHRzZW5zX21heAorCistIGJpYXMtZGlzYWJsZToKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgc2hvdWxkIGJlIGNvbmZpZ3VlZCBhcyBubyBwdWxsLgorCistIGJpYXMtcHVsbC1kb3duOgorCVVzYWdlOiBvcHRpb25hbAorCVZhbHVlIHR5cGU6IDxub25lPgorCURlZmluaXRpb246IFRoZSBzcGVjaWZpZWQgcGlucyBzaG91bGQgYmUgY29uZmlndWVkIGFzIHB1bGwgZG93bi4KKworLSBiaWFzLXB1bGwtdXA6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPG5vbmU+CisJRGVmaW5pdGlvbjogVGhlIHNwZWNpZmllZCBwaW5zIHNob3VsZCBiZSBjb25maWd1ZWQgYXMgcHVsbCB1cC4KKworLSBvdXRwdXQtaGlnaDoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gb3V0cHV0IG1vZGUsIGRyaXZlbgorCQkgICAgaGlnaC4KKwkJICAgIE5vdCB2YWxpZCBmb3Igc2RjIHBpbnMuCisKKy0gb3V0cHV0LWxvdzoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8bm9uZT4KKwlEZWZpbml0aW9uOiBUaGUgc3BlY2lmaWVkIHBpbnMgYXJlIGNvbmZpZ3VyZWQgaW4gb3V0cHV0IG1vZGUsIGRyaXZlbgorCQkgICAgbG93LgorCQkgICAgTm90IHZhbGlkIGZvciBzZGMgcGlucy4KKworLSBkcml2ZS1zdHJlbmd0aDoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IFNlbGVjdHMgdGhlIGRyaXZlIHN0cmVuZ3RoIGZvciB0aGUgc3BlY2lmaWVkIHBpbnMsIGluIG1BLgorCQkgICAgVmFsaWQgdmFsdWVzIGFyZTogMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCBhbmQgMTYKKworRXhhbXBsZToKKworCXRsbW06IHBpbmN0cmxAMTAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc204OTUzLXBpbmN0cmwiOworCQlyZWcgPSA8MHgxMDAwMDAwIDB4MzAwMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDIwOCAwPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisKKwkJcG14LXVhcnRjb25zb2xlIHsKKwkJCXVhcnRfY29uc29sZV9hY3RpdmU6IHVhcnRfY29uc29sZV9hY3RpdmUgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzQiLCAiZ3BpbzUiOworCQkJCQlmdW5jdGlvbiA9ICJibHNwX3VhcnQyIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNCIsICJncGlvNSI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLWRpc2FibGU7CisJCQkJfTsKKwkJCX07CisKKwkJCXVhcnRfY29uc29sZV9zbGVlcDogdWFydF9jb25zb2xlX3NsZWVwIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW80IiwgImdwaW81IjsKKwkJCQkJZnVuY3Rpb24gPSAiYmxzcF91YXJ0MiI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzQiLCAiZ3BpbzUiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJfTsKKwkJCX07CisKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxzZG04NDUtcGluY3RybCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20sc2RtODQ1LXBpbmN0cmwKaW5kZXggOWMyNjM3NC4uN2U3NWQyYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxzZG04NDUtcGluY3RybAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHNkbTg0NS1waW5jdHJsCkBAIC02LDcgKzYsNyBAQAogLSBjb21wYXRpYmxlOgogCVVzYWdlOiByZXF1aXJlZAogCVZhbHVlIHR5cGU6IDxzdHJpbmc+Ci0JRGVmaW5pdGlvbjogbXVzdCBiZSAicWNvbSxzZG04NDUtcGluY3RybCIKKwlEZWZpbml0aW9uOiBtdXN0IGJlICJxY29tLHNkbTg0NS1waW5jdHJsIiBvciAicWNvbSxzZG04NDUtcGluY3RybC12MiIKIAogLSByZWc6CiAJVXNhZ2U6IHJlcXVpcmVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGxhdGZvcm0vbXNtL3FwbnAtcmV2aWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BsYXRmb3JtL21zbS9xcG5wLXJldmlkLnR4dAppbmRleCBiYWJjNDUyLi5kZDE0ODkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGxhdGZvcm0vbXNtL3FwbnAtcmV2aWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wbGF0Zm9ybS9tc20vcXBucC1yZXZpZC50eHQKQEAgLTksNiArOSw4IEBACiBPcHRpb25hbCBwcm9wZXJ0eToKIC0gcWNvbSxmYWItaWQtdmFsaWQ6IFVzZSB0aGlzIHByb3BlcnR5IHdoZW4gc3VwcG9ydCB0byByZWFkIEZhYgogCWlkZW50aWZpY2F0aW9uIGZyb20gUkVWIElEIHBlcmlwaGVyYWwgaXMgYXZhaWxhYmxlLgorLSBxY29tLHRwLXJldi12YWxpZDogVXNlIHRoaXMgcHJvcGVydHkgd2hlbiBzdXBwb3J0IHRvIHJlYWQgVFAKKwlyZXZpc2lvbiBpZGVudGlmaWNhdGlvbiBmcm9tIFJFViBJRCBwZXJpcGhlcmFsLgogCiBFeGFtcGxlOgogCXFjb20scmV2aWRAMTAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbS9xcG5wLWZnLWdlbjMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtZmctZ2VuMy50eHQKaW5kZXggZDBkODc4Yi4uZDIwNWIwYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtZmctZ2VuMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtZmctZ2VuMy50eHQKQEAgLTI3MSw2ICsyNzEsMTQgQEAKIAlEZWZpbml0aW9uOiBBIGJvb2xlYW4gcHJvcGVydHkgdGhhdCB3aGVuIGRlZmluZWQgaG9sZHMgU09DIGF0IDEwMCUgd2hlbgogCQkgICAgdGhlIGJhdHRlcnkgaXMgZnVsbC4KIAorLSBxY29tLGxpbmVhcml6ZS1zb2MKKwlVc2FnZTogICAgICBvcHRpb25hbAorCVZhbHVlIHR5cGU6IDxlbXB0eT4KKwlEZWZpbml0aW9uOiBBIGJvb2xlYW4gcHJvcGVydHkgdGhhdCB3aGVuIGRlZmluZWQgbGluZWFyaXplcyBTT0Mgd2hlbgorCQkgICAgdGhlIFNPQyBkcm9wcyBhZnRlciBjaGFyZ2UgdGVybWluYXRpb24gbW9ub3RvbmljYWxseSB0bworCQkgICAgaW1wcm92ZSB0aGUgdXNlciBleHBlcmllbmNlLiBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBpZgorCQkgICAgInFjb20saG9sZC1zb2Mtd2hpbGUtZnVsbCIgaXMgc3BlY2lmaWVkLgorCiAtIHFjb20sa2ktY29lZmYtc29jLWRpc2NoZwogCVVzYWdlOiAgICAgIG9wdGlvbmFsCiAJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KQEAgLTMwMSw2ICszMDksMTMgQEAKIAkJICAgIGlzIHNwZWNpZmllZCB0byBtYWtlIGl0IGZ1bGx5IGZ1bmN0aW9uYWwuIFZhbHVlIGhhcyBubwogCQkgICAgdW5pdC4gQWxsb3dlZCByYW5nZSBpcyAwIHRvIDYyMjAwIGluIG1pY3JvIHVuaXRzLgogCistIHFjb20sa2ktY29lZmYtZnVsbC1kaXNjaGcKKwlVc2FnZToJICAgIG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPHUzMj4KKwlEZWZpbml0aW9uOiBLaSBjb2VmZmljaWVudCBmdWxsIFNPQyB2YWx1ZSB0aGF0IHdpbGwgYmUgYXBwbGllZCBkdXJpbmcKKwkJICAgIGRpc2NoYXJnaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCBhIHZhbHVlIG9mIDAgd2lsbCBiZSBzZXQuCisJCSAgICBBbGxvd2VkIHJhbmdlIGlzIGZyb20gMjQ1IHRvIDYyMjU2LgorCiAtIHFjb20sZmctcmNvbm4tbW9obXMKIAlVc2FnZTogICAgICBvcHRpb25hbAogCVZhbHVlIHR5cGU6IDx1MzI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1xbm92by50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1xbm92by50eHQKaW5kZXggOTZiN2RkNS4uOGYzNWU1NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtcW5vdm8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbS9xcG5wLXFub3ZvLnR4dApAQCAtMjAsNiArMjAsNyBAQAogT3B0aW9uYWwgUHJvcGVydGllczoKIC0gcWNvbSxleHRlcm5hbC1yc2Vuc2U6CQlUbyBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBwbGF0Zm9ybSB1c2VzIGV4dGVybmFsIG9yCiAJCQkJaW50ZXJuYWwgcnNlbnNlIGZvciBtZWFzdXJpbmcgYmF0dGVyeSBjdXJyZW50LgorLSBxY29tLGVuYWJsZS1mb3ItZGM6CQlUbyBlbmFibGUgcW5vdm8gZm9yIGRjIGNoYXJnaW5nIHBhdGguCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzh4LWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzOHgtY2hhcmdlci50eHQKaW5kZXggOTJlZjIzYy4uZmQyNzI5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzOHgtY2hhcmdlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzOHgtY2hhcmdlci50eHQKQEAgLTQzLDYgKzQzLDEzIEBACiAgIERlZmluaXRpb246IEJvb2xlYW4gZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhcmdlciBzaG91bGQgbm90IGRyYXcKIAkgICAgICBjdXJyZW50IGZyb20gYW55IG9mIGl0cyBpbnB1dCBzb3VyY2VzIChVU0IsIERDKS4KIAorLSBxY29tLHVzZS1leHRjb24KKyAgVXNhZ2U6ICAgICAgb3B0aW9uYWwKKyAgVmFsdWUgdHlwZTogPGVtcHR5PgorICBEZWZpbml0aW9uOiBCb29sZWFuIGZsYWcgd2hpY2ggc3BlY2lmeSB0aGF0IHNtYjEzOHggd2lsbCBhY3QgYXMgbWFpbiBjaGFyZ2VyCisJICAgICAgdG8gZG8gZXh0Y29uIFVTQiBjYWxscy4gSWYgbm90IGRlZmluZWQsIG90aGVyIGNoYXJnZXIgZHJpdmVyIGNhbgorCSAgICAgIGFjdCBhcyBtYWluIGNoYXJnZXIgdG8gZG8gZXh0Y29uIFVTQiBjYWxscy4KKwogLSBxY29tLGZjYy1tYXgtdWEKICAgVXNhZ2U6ICAgICAgb3B0aW9uYWwKICAgVmFsdWUgdHlwZTogPHUzMj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHBzNjUyMTdfY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIudHh0CmluZGV4IDk4ZDEzMWEuLmExMTA3MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHBzNjUyMTdfY2hhcmdlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLnR4dApAQCAtMiwxMSArMiwxNiBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogLWNvbXBhdGlibGU6ICJ0aSx0cHM2NTIxNy1jaGFyZ2VyIgorLWludGVycnVwdHM6IFRQUzY1MjE3IGludGVycnVwdCBudW1iZXJzIGZvciB0aGUgQUMgYW5kIFVTQiBjaGFyZ2VyIGlucHV0IGNoYW5nZS4KKyAgICAgICAgICAgICBTaG91bGQgYmUgPDA+IGZvciB0aGUgVVNCIGNoYXJnZXIgYW5kIDwxPiBmb3IgdGhlIEFDIGFkYXB0ZXIuCistaW50ZXJydXB0LW5hbWVzOiBTaG91bGQgYmUgIlVTQiIgYW5kICJBQyIKIAogVGhpcyBub2RlIGlzIGEgc3Vibm9kZSBvZiB0aGUgdHBzNjUyMTcgUE1JQy4KIAogRXhhbXBsZToKIAogCXRwczY1MjE3LWNoYXJnZXIgewotCQljb21wYXRpYmxlID0gInRpLHRwczY1MDkwLWNoYXJnZXIiOworCQljb21wYXRpYmxlID0gInRpLHRwczY1MjE3LWNoYXJnZXIiOworCQlpbnRlcnJ1cHRzID0gPDA+LCA8MT47CisJCWludGVycnVwdC1uYW1lcyA9ICJVU0IiLCAiQUMiOwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL21zbV9zZXJpYWxfaHMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9tc21fc2VyaWFsX2hzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFiZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9tc21fc2VyaWFsX2hzLnR4dApAQCAtMCwwICsxLDEyMSBAQAorKiBRdWFsY29tbSBNU00gSFNVQVJUCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOgorCS0gInFjb20sbXNtLWhzdWFydC12MTQiIHRvIGJlIHVzZWQgZm9yIFVBUlRETSBDb3JlIHYxLjQKKy0gcmVnIDogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgYm90aCB0aGUgZGV2aWNlLAorCXVhcnQgY29yZSBhbmQgYmFtIGNvcmUKKy0gcmVnLW5hbWVzIDoKKwktICJjb3JlX21lbSIgdG8gYmUgdXNlZCBhcyBuYW1lIG9mIHRoZSB1YXJ0IGNvcmUKKwktICJiYW1fbWVtIiB0byBiZSB1c2VkIGFzIG5hbWUgb2YgdGhlIGJhbSBjb3JlCistIGludGVycnVwdHMgOiBpbnRlcnJ1cHRzIGZvciBib3RoIHRoZSBkZXZpY2UsdWFydCBjb3JlIGFuZCBiYW0gY29yZQorLSBpbnRlcnJ1cHQtbmFtZXMgOgorCS0gImNvcmVfaXJxIiB0byBiZSB1c2VkIGFzIHVhcnQgaXJxCisJLSAiYmFtIGlycSIgdG8gYmUgdXNlZCBhcyBiYW0gaXJxCistICNpbnRlcnJ1cHQtY2VsbHM6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4gaW50ZXJydXB0CisJCXNvdXJjZS4gVGhlIHR5cGUgc2hhbGwgYmUgYSA8dTMyPiBhbmQgdGhlIHZhbHVlIHNoYWxsIGJlIDEKKy0gI2FkZHJlc3MtY2VsbHM6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4gYWRkcmVzcy4KKwkJVGhlIHR5cGUgc2hhbGwgYmUgPHUzMj4gYW5kIHRoZSB2YWx1ZSBzaGFsbCBiZSAwCistIGludGVycnVwdC1wYXJlbnQgPSBJdCBpcyBuZWVkZWQgZm9yIGludGVycnVwdCBtYXBwaW5nCistIGJhbS10eC1lcC1waXBlLWluZGV4IDogQkFNIFRYIEVuZHBvaW50IFBpcGUgSW5kZXggZm9yIEhTVUFSVAorLSBiYW0tcngtZXAtcGlwZS1pbmRleCA6IEJBTSBSWCBFbmRwb2ludCBQaXBlIEluZGV4IGZvciBIU1VBUlQKKworQkxTUCBoYXMgYSBzdGF0aWMgcGlwZSBhbGxvY2F0aW9uIGFuZCBhc3N1bWVzIGEgcGFpci1waXBlIGZvciBlYWNoIHVhcnQgY29yZS4KK1BpcGVzIFsyKmkgOiAyKmkrMV0gYXJlIGFsbG9jYXRlZCBmb3IgVUFSVCBjb3JlcyB3aGVyZSBpID0gWzAgOiA1XS4KK0hlbmNlLCBNaW5pbXVtIGFuZCBNYXhpbXVtIHBlcm1pdHRlZCB2YWx1ZSBvZiBlbmRwb2ludCBwaXBlIGluZGV4IHRvIGJlIHVzZWQKK3dpdGggdWFydCBjb3JlIGlzIDAgYW5kIDExIHJlc3BlY3RpdmVseS4KKworVGhlcmUgaXMgb25lIEhTVUFSVCBibG9jayB1c2VkIGluIE1TTSBkZXZpY2VzLAorInFjb20sbXNtLWhzdWFydC12MTQiLiBUaGUgbXNtLXNlcmlhbC1ocyBkcml2ZXIgaXMKK2FibGUgdG8gaGFuZGxlIHRoaXMsIGFuZCBtYXRjaGVzIGFnYWluc3QgdGhlICJxY29tLG1zbS1oc3VhcnQtdjE0IgorYXMgdGhlIGNvbXBhdGliaWxpdHkuCisKK1RoZSByZWdpc3RlcnMgZm9yIHRoZSAicWNvbSxtc20taHN1YXJ0LXYxNCIgZGV2aWNlIG5lZWQgdG8gc3BlY2lmeSBib3RoCityZWdpc3RlciBibG9ja3MgLSB1YXJ0IGNvcmUgYW5kIGJhbSBjb3JlLgorCitFeGFtcGxlOgorCisJdWFydDc6IHVhcnRAZjk5NWQwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWhzdWFydC12MTQiOworCQlyZWcgPSA8MHhmOTk1ZDAwMCAweDEwMDA+LAorCQkgICAgICA8MHhmOTk0NDAwMCAweDUwMDA+OworCQlyZWctbmFtZXMgPSAiY29yZV9tZW0iLCAiYmFtX21lbSI7CisJCWludGVycnVwdC1uYW1lcyA9ICJjb3JlX2lycSIsICJiYW1faXJxIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnVhcnQ3PjsKKwkJaW50ZXJydXB0cyA9IDwwIDE+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlpbnRlcnJ1cHQtbWFwID0gPDAgJmludGMgMCAxMTMgMAorCQkJCTEgJmludGMgMCAyMzkgMD4KKwkJcWNvbSxiYW0tdHgtZXAtcGlwZS1pbmRleCA9IDwwPjsKKwkJcWNvbSxiYW0tcngtZXAtcGlwZS1pbmRleCA9IDwxPjsKKwl9OworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLDxncGlvLW5hbWU+LWdwaW8gOiBoYW5kbGUgdG8gdGhlIEdQSU8gbm9kZSwgc2VlICJncGlvcyBwcm9wZXJ0eSIgaW4KK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8udHh0LgorImdwaW8tbmFtZSIgY2FuIGJlICJ0eCIsICJyeCIsICJjdHMiIGFuZCAicmZyIiBiYXNlZCBvbiBudW1iZXIgb2YgVUFSVCBHUElPcworbmVlZCB0byBjb25maWd1cmVkLgorR3BpbydzIGFyZSBvcHRpb25hbCBpZiBpdCBpcyByZXF1aXJlZCB0byBiZSBub3QgY29uZmlndXJlZCBieSBVQVJUIGRyaXZlciBvcgorY2FzZSB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIGNvbm5lY3RlZCBhbmQgd2Ugd2FudCB0byB1c2UgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZQorZm9yIHVhcnQuCistIHFjb20sIHdha2V1cF9pcnEgOiBVQVJUIFJYIEdQSU8gSVJRIGxpbmUgdG8gYmUgY29uZmlndXJlZCBhcyB3YWtldXAgc291cmNlLgorLSBxY29tLGluamVjdC1yeC1vbi13YWtldXAgOiBpbmplY3Rfcnhfb25fd2FrZXVwIGVuYWJsZXMgZmVhdHVyZSB3aGVyZSBvbgorcmVjZWl2aW5nIGludGVycnVwdCB3aXRoIFVBUlQgUlggR1BJTyBJUlEgbGluZSAoaS5lLiBhYm92ZSB3YWtldXBfaXJxIHByb3BlcnR5KSwKK0hTVUFSVCBkcml2ZXIgaW5qZWN0cyBwcm92aWRlZCBjaGFyYWN0ZXIgd2l0aCBwcm9wZXJ0eSByeF90b19pbmplY3QuCistIHFjb20sIHJ4LWNoYXItdG8taW5qZWN0IDogVGhlIGNoYXJhY3RlciB0byBiZSBpbnNlcnRlZCBvbiB3YWtldXAuCistIHFjb20sIG5vLXN1c3BlbmQtZGVsYXkgOiBUaGlzIGRlY2lkZXMgc3lzdGVtIHRvIGdvIHRvIHN1c3BlbmQgaW1tZWRpYXRlbHkKK29yIG5vdAorCistIFJlZmVyIHRvICJEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21zbS9tc21fYnVzLnR4dCIgZm9yCitiZWxvdyBvcHRpb25hbCBwcm9wZXJ0aWVzOgorICAgIC0gcWNvbSxtc21fYnVzLG5hbWUKKyAgICAtIHFjb20sbXNtX2J1cyxudW1fY2FzZXMKKyAgICAtIHFjb20sbXNtX2J1cyxhY3RpdmVfb25seQorICAgIC0gcWNvbSxtc21fYnVzLG51bV9wYXRocworICAgIC0gcWNvbSxtc21fYnVzLHZlY3RvcnMKKworQWxpYXNlcyA6CitBbiBhbGlhcyBtYXkgYmUgb3B0aW9uYWxseSB1c2VkIHRvIGJpbmQgdGhlIFVBUlQgZGV2aWNlIHRvIGEgVFRZIGRldmljZQorKHR0eUhTPGFsaWFzX251bT4pIHdpdGggYSBnaXZlbiBhbGlhcyBudW1iZXIuIEFsaWFzZXMgYXJlIG9mIHRoZSBmb3JtCit1YXJ0PG4+IHdoZXJlIDxuPiBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgYWxpYXMgbnVtYmVyIHRvIHVzZS4KK09uIHN5c3RlbXMgd2l0aCBtdWx0aXBsZSBVQVJUIGRldmljZXMgcHJlc2VudCwgYW4gYWxpYXMgbWF5IG9wdGlvbmFsbHkgYmUKK2RlZmluZWQgZm9yIHN1Y2ggZGV2aWNlcy4gVGhlIGFsaWFzIHZhbHVlIHNob3VsZCBiZSBmcm9tIDAgdG8gMjU1LgorCitFeGFtcGxlOgorCisJYWxpYXNlcyB7CisJCXVhcnQ0ID0gJnVhcnQ3OyAvLyBUaGlzIGRldmljZSB3aWxsIGJlIGVudW1lcmF0ZWQgYXMgdHR5SFM0CisJfTsKKworCXVhcnQ3OiB1YXJ0QGY5OTVkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1oc3VhcnQtdjE0IgorCQlyZWcgPSA8MHgxOWM0MDAwMCAweDEwMDAiPiwKKwkJICAgICAgPDB4Zjk5NDQwMDAgMHg1MDAwPjsKKwkJcmVnLW5hbWVzID0gImNvcmVfbWVtIiwgImJhbV9tZW0iOworCQlpbnRlcnJ1cHQtbmFtZXMgPSAiY29yZV9pcnEiLCAiYmFtX2lycSIsICJ3YWtldXBfaXJxIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnVhcnQ3PjsKKwkJaW50ZXJydXB0cyA9IDwwIDEgMj47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGZmZmZmZmZmPjsKKwkJaW50ZXJydXB0LW1hcCA9IDwwICZpbnRjIDAgMTEzIDAKKwkJCQkxICZpbnRjIDAgMjM5IDAKKwkJCQkyICZtc21ncGlvIDQyIDA+OworCQlxY29tLHR4LWdwaW8gPSA8Jm1zbWdwaW8gNDEgMHgwMD47CisJCXFjb20scngtZ3BpbyA9IDwmbXNtZ3BpbyA0MiAweDAwPjsKKwkJcWNvbSxjdHMtZ3BpbyA9IDwmbXNtZ3BpbyA0MyAweDAwPjsKKwkJcWNvbSxyZnItZ3BpbyA9IDwmbXNtZ3BpbyA0NCAweDAwPjsKKwkJcWNvbSxpbmplY3Qtcngtb24td2FrZXVwID0gPDE+OworCQlxY29tLHJ4LWNoYXItdG8taW5qZWN0ID0gPDB4RkQ+OworCisJCXFjb20sYmFtLXR4LWVwLXBpcGUtaW5kZXggPSA8MD47CisJCXFjb20sYmFtLXJ4LWVwLXBpcGUtaW5kZXggPSA8MT47CisKKwkJcWNvbSxtc20tYnVzLG5hbWUgPSAidWFydDciOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDI+OworCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDE+OworCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCQk8ODQgNTEyIDAgMD4sCisJCQkJPDg0IDUxMiA1MDAgODAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvYy9xY29tL3Fjb20sbXNtLWV1ZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL3Fjb20vcWNvbSxtc20tZXVkLnR4dAppbmRleCA4MDA1MDhhLi40NWUzMDljIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL3Fjb20vcWNvbSxtc20tZXVkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL3Fjb20vcWNvbSxtc20tZXVkLnR4dApAQCAtMTAsNiArMTAsMTAgQEAKICAtIGludGVycnVwdHM6ICBJbnRlcnJ1cHQgbnVtYmVyCiAgLSByZWc6IFNob3VsZCBiZSBhZGRyZXNzIGFuZCBzaXplIG9mIEVVRCByZWdpc3RlciBzcGFjZQogIC0gcmVnLW5hbWVzOiBTaG91bGQgYmUgImV1ZF9iYXNlIgorIC0gY2xvY2tzOiBhIGxpc3Qgb2YgcGhhbmRsZXMgdG8gdGhlIFBIWSBjbG9ja3MuIFVzZSBhcyBwZXIKKyAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKKyAtIGNsb2NrLW5hbWVzOiBOYW1lcyBvZiB0aGUgY2xvY2tzIGluIDEtMSBjb3JyZXNwb25kZW5jZSB3aXRoCisgICB0aGUgImNsb2NrcyIgcHJvcGVydHkuCiAKIERyaXZlciBub3RpZmllcyBjbGllbnRzIHZpYSBleHRjb24gZm9yIFZCVVMgc3Bvb2YgYXR0YWNoL2RldGFjaAogYW5kIGNoYXJnZXIgZW5hYmxlL2Rpc2FibGUgZXZlbnRzLiBDbGllbnRzIHJlZ2lzdGVyZWQgZm9yIHRoZXNlCkBAIC0yMyw2ICsyNyw4IEBACiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA0OTIgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCXJlZyA9IDwweDg4ZTAwMDAgMHg0MDAwPjsKIAkJcmVnLW5hbWVzID0gImV1ZF9iYXNlIjsKKwkJY2xvY2tzID0gPCZjbG9ja19nY2MgR0NDX1VTQl9QSFlfQ0ZHX0FIQjJQSFlfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY2ZnX2FoYl9jbGsiOwogCX07CiAKIEFuIGV4YW1wbGUgZm9yIEVVRCBleHRjb24gY2xpZW50OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20tYXVkaW8tZGV2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLWF1ZGlvLWRldi50eHQKaW5kZXggNGQwNWU1MC4uNTdhMjI3ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20tYXVkaW8tZGV2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbS1hdWRpby1kZXYudHh0CkBAIC0yNDU5LDYgKzI0NTksMTAgQEAKIAkJNi1wb2xlLWphY2sgOiBKYWNrIG9uIHRoZSBoYXJkd2FyZSBpcyA2LXBvbGUuCiAtIGNsb2NrLW5hbWVzIDogY2xvY2sgbmFtZSBkZWZpbmVkIGZvciBleHRlcm5hbCBjbG9jay4KIC0gY2xvY2tzIDogZXh0ZXJuYWwgY2xvY2sgZGVmaW5lZCBmb3IgY29kZWMgY2xvY2suCistIHFjb20sbXNtLW1iaGMtaHMtbWljLW1heC10aHJlc2hvbGQtbXYgOiBoZWFkc2V0IGRldGVjdGlvbiB0aHJlc2hvbGQuIFdoZW4gbWljYmlhcyBpcworCQkJCQkgIG5vdCBzZXQgdG8gMi43diwgbmVlZCBzY2FsZSBpbiBkcml2ZXIuCistIHFjb20sbXNtLW1iaGMtaHMtbWljLW1pbi10aHJlc2hvbGQtbXYgOiBoZWFkaHBvbmUgZGV0ZWN0aW9uIHRocmVzaG9sZC4gV2hlbiBtaWNiaWFzIGlzCisJCQkJCSAgbm90IHNldCB0byAyLjd2LCBuZWVkIHNjYWxlIGluIGRyaXZlci4KIC0gcWNvbSxocGgtZW4xLWdwaW8gOiBHUElPIHRvIGVuYWJsZSBIaUZpIGFtcGxpZmllcnMuCiAtIHFjb20saHBoLWVuMC1ncGlvIDogR1BJTyB0byBlbmFibGUgSGlGaSBhdWRpbyByb3V0ZSB0byBoZWFkc2V0LgogLSBxY29tLHdzYS1tYXgtZGV2cyA6IE1heGltdW0gbnVtYmVyIG9mIFdTQTg4MXggZGV2aWNlcyBwcmVzZW50IGluIHRoZSB0YXJnZXQKQEAgLTI1MTYsNiArMjUyMCw4IEBACiAKIAkJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwwPjsKIAkJcWNvbSxtc20tbWJoYy1nbmQtc3doID0gPDA+OworCQlxY29tLG1zbS1tYmhjLWhzLW1pYy1tYXgtdGhyZXNob2xkLW12ID0gPDE3MDA+OworCQlxY29tLG1zbS1tYmhjLWhzLW1pYy1taW4tdGhyZXNob2xkLW12ID0gPDUwPjsKIAkJcWNvbSxocGgtZW4wLWdwaW8gPSA8JnRhdmlsX2hwaF9lbjA+OwogCQlxY29tLGhwaC1lbjEtZ3BpbyA9IDwmdGF2aWxfaHBoX2VuMT47CiAJCXFjb20sdGF2aWwtbWNsay1jbGstZnJlcSA9IDw5NjAwMDAwPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpX3FzZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9xc2QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZGYwODIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaV9xc2QudHh0CkBAIC0wLDAgKzEsMTA2IEBACitRdWFsY29tbSBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAicWNvbSxzcGktcXVwLXYyIi4KKy0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHJlZ2lvbnMgZm9yIHRoZSBkZXZpY2UKKy0gcmVnLW5hbWVzIDogUmVnaXN0ZXIgcmVnaW9uIG5hbWVzIHJlZmVyZW5jZWQgaW4gcmVnIGFib3ZlLgorCVJlcXVpcmVkIHJlZ2lzdGVyIHJlc291cmNlIGVudHJpZXMgYXJlOgorCSJzcGlfcGh5c2ljYWwiIDogUGh5c2ljYWwgYWRkcmVzcyBvZiBjb250cm9sbGVyIHJlZ2lzdGVyIGJsb2Nrcy4KKy0gaW50ZXJydXB0cyA6IEludGVycnVwdCBudW1iZXJzIHVzZWQgYnkgdGhpcyBjb250cm9sbGVyCistIGludGVycnVwdC1uYW1lcyA6IEludGVycnVwdCByZXNvdXJjZSBuYW1lcyByZWZlcmVuY2VkIGluIGludGVycnVwdHMgYWJvdmUuCisJUmVxdWlyZWQgaW50ZXJydXB0IHJlc291cmNlIGVudHJpZXMgYXJlOgorCSJzcGlfaXJxIiA6IFFVUC1jb3JlIGludGVycnVwdC4KKy0gc3BpLW1heC1mcmVxdWVuY3kgOiBTcGVjaWZpZXMgbWF4aW11bSBTUEkgY2xvY2sgZnJlcXVlbmN5LCBVbml0cyAtIEh6LgorCitSZXF1aXJlZCBhbGlhczoKKy0gVGhlIGRlc2lyZWQgYnVzLW51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGFuIGFsaWFzIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQKKwknc3Bpe259JyB3aGVyZSBuIGlzIHRoZSBidXMgbnVtYmVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBxY29tLGdwaW8tbW9zaSA6IEdQSU8gcGluIG51bWJlciBvZiB0aGUgTU9TSSBidXMgbGluZS4KKy0gcWNvbSxncGlvLW1pc28gOiBHUElPIHBpbiBudW1iZXIgb2YgdGhlIE1JU08gYnVzIGxpbmUuCistIHFjb20sZ3Bpby1jbGsgIDogR1BJTyBwaW4gbnVtYmVyIG9mIHRoZSBDTEsgIGJ1cyBsaW5lLgorLSBxY29tLGdwaW8tY3MwICA6IEdQSU8gcGluIG51bWJlciBvZiB0aGUgY2hpcHNlbGVjdDAgYnVzIGxpbmUuCistIHFjb20sZ3Bpby1jczEgIDogR1BJTyBwaW4gbnVtYmVyIG9mIHRoZSBjaGlwc2VsZWN0MSBidXMgbGluZS4KKy0gcWNvbSxncGlvLWNzMiAgOiBHUElPIHBpbiBudW1iZXIgb2YgdGhlIGNoaXBzZWxlY3QyIGJ1cyBsaW5lLgorLSBxY29tLGdwaW8tY3MzICA6IEdQSU8gcGluIG51bWJlciBvZiB0aGUgY2hpcHNlbGVjdDMgYnVzIGxpbmUuCistIHFjb20saW5maW5pdGUtbW9kZTogV2hlbiBtaXNzaW5nIG9yIHNldCB0byB6ZXJvLCBRVVAgdXNlcyBpbmZpbml0ZS1tb2RlLiBXaGVuCisgIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiBtYXhpbXVtIHRyYW5zZmVyCisgIGxlbmd0aC4KKyAtIHFjb20sYWN0aXZlLW9ubHkgOiBWb3RlIGZvciBjb3JlIGNsb2NrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3NvciBnb2VzCisgIHRvIGFjdGl2ZSBzdGF0ZSBhbmQgcmVtb3ZlIHRoYXQgdm90ZSB3aGVuIGl0IGdvZXMgdG8gaWRsZSBzdGF0ZS4gVGhpcyBmbGFnIG1heQorICBpbXByb3ZlIHNlcnZpY2UgdGltZSBvZiBmaXJzdCBzcGkgcmVxdWVzdCBhdCB0aGUgZXhwZW5zZSBvZiBwb3dlciBjb25zdW1wdGlvbi4KKyAgV2hlbiB0aGlzIGVudHJ5IGlzIG5vdCBwcmVzZW50LCB2b3RpbmcgaXMgZG9uZSBieSB0aGUgcnVudGltZS1wbSBjYWxsYmFja3MuCisgLSBxY29tLG1hc3Rlci1pZCA6IE1hc3RlciBlbmRwb2ludCBudW1iZXIgdXNlZCBmb3Igdm90aW5nIG9uIGNsb2NrcyB1c2luZyB0aGUKKyAgYnVzLXNjYWxpbmcgZHJpdmVyLgorIC0gcWNvbSxydC1wcmlvcml0eSA6IHdoZXRoZXIgc3BpIG1lc3NhZ2UgcXVldWUgaXMgc2V0IHRvIHJ1biBhcyBhIHJlYWx0aW1lIHRhc2suCisgIFdpdGggdGhpcyBzcGkgdHJhbnNhY3Rpb24gbWVzc2FnZSBwdW1wIHdpdGggaGlnaCAocmVhbHRpbWUpIHByaW9yaXR5IHRvIHJlZHVjZQorICB0aGUgdHJhbnNmZXIgbGF0ZW5jeSBvbiB0aGUgYnVzIGJ5IG1pbmltaXNpbmcgdGhlIGRlbGF5IGJldHdlZW4gYSB0cmFuc2ZlciByZXF1ZXN0CisgLSBxY29tLHNoYXJlZCA6IHdoZXRoZXIgdGhpcyBxdXAgaXMgc2hhcmVkIHdpdGggb3RoZXIgZWUncworCitPcHRpb25hbCBwcm9wZXJ0aWVzIHdoaWNoIGFyZSByZXF1aXJlZCBmb3Igc3VwcG9ydCBvZiBCQU0tbW9kZToKKy0gcWNvbSx2ZXItcmVnLWV4aXN0cyA6IEJvb2xlYW4uIFdoZW4gcHJlc2VudCwgYWxsb3dzIGRyaXZlciB0byB2ZXJpZnkgaWYgSFcKKyAgdmVyc2lvbiBzdXBwb3J0IGxhdGVzdCBmZWF0dXJlcyAoZS5nLiBCQU0pIGFuZCB0aGVuIGVuYWJsZSB0aGVtLiBTaG91bGQgYmUKKyAgcmVtb3ZlZCBmb3IgbGVnYWN5IEhXLgorLSBxY29tLHVzZS1iYW0gOiBCb29sZWFuLiBXaGVuIHByZXNlbnQsIGVuYWJsZXMgQkFNLW1vZGUuCistIHFjb20sdXNlLXBpbmN0cmwgOiBCb29sZWFuLiBXaGVuIHByZXNlbnQsIGVuYWJsZXMgcGluY3RybCBmcmFtZSB3b3JrIHRvIGNvbmZpZ3VyZSBHUElPJ3MKKyAgaW5zdGVhZCBvZiBleGlzdGluZyBncGlvIG11eCBoZW5jZSBncGlvIGVudHJpZXMgYXJlIG5vIG1vcmUgcmVxdWlyZWQgaWYgcHJlc2VudC4KKy0gcGluY3RybC1uYW1lcyA6IFByb3BlcnR5IG11c3QgY29udGFpbiAic3BpX2RlZmF1bHQiIGFuZCAic3BpX3NsZWVwIiBpZgorICBwaW5jdHJsIGlzIHRvIGJlIHVzZWQuCisgIGluc3RlYWQgb2YgZXhpc3RpbmcgZ3BpbyBtdXggaGVuY2UgZ3BpbyBlbnRyaWVzIGFyZSBubyBtb3JlIHJlcXVpcmVkIGlmIHByZXNlbnQuCistIHFjb20sYmFtLWNvbnN1bWVyLXBpcGUtaW5kZXggOiBCQU0gY29uc3VtZXItcGlwZSBpbmRleC4KKy0gcWNvbSxiYW0tcHJvZHVjZXItcGlwZS1pbmRleCA6IEJBTSBwcm9kdWNlci1waXBlIGluZGV4LgorLSByZWctbmFtZXMgOiByZWdpc3RlciByZWdpb24gbmFtZXMgcmVmZXJlbmNlZCBpbiByZWcuCisJUmVxdWlyZWQgcmVnaXN0ZXIgcmVzb3VyY2UgZm9yIEJBTSBhcmU6CisJInNwaV9iYW1fcGh5c2ljYWwiIDogUGh5c2ljYWwgYWRkcmVzcyBvZiBCQU0gZm9yIHRoaXMgY29udHJvbGxlci4KKy0gaW50ZXJydXB0LW5hbWVzIDogaW50ZXJydXB0IHJlc291cmNlIG5hbWVzIHJlZmVyZW5jZWQgaW4gaW50ZXJydXB0cy4KKwlSZXF1aXJlZCBpbnRlcnJ1cHQgcmVzb3VyY2UgZnJvbSBCQU0gYXJlOgorCSJzcGlfYmFtX2lycSIgOiBCQU0gaW50ZXJydXB0IHVzZWQgYnkgdGhlIGNvbnRyb2xsZXIuCisKK09wdGlvbmFsIFNQSSBzbGF2ZSBub2RlcyBtdXN0IGJlIGNoaWxkcmVuIG9mIHRoZSBTUEkgbWFzdGVyIG5vZGUgYW5kIGNvbnRhaW4KK3RoZSBmb2xsb3dpbmcgcHJvcGVydGllcy4KKy0gcmVnOiAocmVxdWlyZWQpIGNoaXAtc2VsZWN0IGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKy0gY29tcGF0aWJsZSA6IChyZXF1aXJlZCkgTmFtZSBvZiBTUEkgZGV2aWNlIGZvbGxvd2luZyBnZW5lcmljIG5hbWVzLgorLSBzcGktbWF4LWZyZXF1ZW5jeSA6IChyZXF1aXJlZCkgTWF4aW11bSBTUEkgY2xvY2tpbmcgc3BlZWQgb2YgZGV2aWNlIGluIEh6CistIGludGVycnVwdHMgOiAocmVjb21tZW5kZWQpIFNob3VsZCBjb250YWluIHRoZSBTUEkgc2xhdmUgaW50ZXJydXB0IG51bWJlcgorICBlbmNvZGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuCistIGludGVycnVwdC1wYXJlbnQgOiAocmVjb21tZW5kZWQpIFRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgdGhhdCBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZS4KKy0gc3BpLWNwb2wgOiAob3B0aW9uYWwpIEVtcHR5IHByb3BlcnR5IGluZGljYXRpbmcgZGV2aWNlIHJlcXVpcmVzIGludmVyc2UKKyAgY2xvY2sgcG9sYXJpdHkgKENQT0wpIG1vZGUKKy0gc3BpLWNwaGEgOiAob3B0aW9uYWwpIEVtcHR5IHByb3BlcnR5IGluZGljYXRpbmcgZGV2aWNlIHJlcXVpcmVzIHNoaWZ0ZWQKKyAgY2xvY2sgcGhhc2UgKENQSEEpIG1vZGUKKy0gc3BpLWNzLWhpZ2ggOiAob3B0aW9uYWwpIEVtcHR5IHByb3BlcnR5IGluZGljYXRpbmcgZGV2aWNlIHJlcXVpcmVzCisgIGNoaXAgc2VsZWN0IGFjdGl2ZSBoaWdoCisKK0V4YW1wbGU6CisJYWxpYXNlcyB7CisJCXNwaTAgPSAmc3BpXzA7CisJfTsKKworCXNwaV8wOiBzcGlAZjk5MjMwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sc3BpLXF1cC12MiI7CisKKwkJcmVnLW5hbWVzID0gInNwaV9waHlzaWNhbCIsICJzcGlfYmFtX3BoeXNpY2FsIjsKKwkJcmVnID0gPDB4Zjk5MjMwMDAgMHgxMDAwPiwKKwkJCTwweGY5OTA0MDAwIDB4MTAwMDA+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAic3BpX2lycSIsICJzcGlfYmFtX2lycSI7CisJCWludGVycnVwdHMgPSA8MCA5NSAwPiwgPDAgMjM4IDA+OworCisJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlxY29tLGdwaW8tbW9zaSA9IDwmbXNtZ3BpbyAwIDA+OworCQlxY29tLGdwaW8tbWlzbyA9IDwmbXNtZ3BpbyAxIDA+OworCQlxY29tLGdwaW8tY2xrICA9IDwmbXNtZ3BpbyAzIDA+OworCQlxY29tLGdwaW8tY3MyICA9IDwmbXNtZ3BpbyA5IDA+OworCisJCXFjb20saW5maW5pdGUtbW9kZSA9IDwwPjsKKwkJcWNvbSx1c2UtYmFtOworCQlxY29tLHVzZS1waW5jdHJsOworCQlxY29tLGJhbS1jb25zdW1lci1waXBlLWluZGV4ID0gPDEyPjsKKwkJcWNvbSxiYW0tcHJvZHVjZXItcGlwZS1pbmRleCA9IDwxMz47CisJCXFjb20sdmVyLXJlZy1leGlzdHM7CisJCXFjb20sbWFzdGVyLWlkID0gPDg2PjsKKwkJcWNvbSxydC1wcmlvcml0eTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvcWNvbSxzcG1pLXBtaWMtYXJiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcG1pL3Fjb20sc3BtaS1wbWljLWFyYi50eHQKaW5kZXggYmVmOTE5My4uYzUwZDY3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwbWkvcWNvbSxzcG1pLXBtaWMtYXJiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9xY29tLHNwbWktcG1pYy1hcmIudHh0CkBAIC00Miw2ICs0MiwxMSBAQAogICAgIGNlbGwgNDogaW50ZXJydXB0IGZsYWdzIGluZGljYXRpbmcgbGV2ZWwtc2Vuc2UgaW5mb3JtYXRpb24sIGFzIGRlZmluZWQgaW4KICAgICAgICAgICAgIGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2lycS5oCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHFjb20sZW5hYmxlLWFoYi1idXMtd29ya2Fyb3VuZCA6IEJvb2xlYW4gZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgQUhCIGJ1cworCQkJCSAgIHdvcmthcm91bmQgc2VxdWVuY2Ugc2hvdWxkIGJlIHVzZWQgZm9yIFNQTUkKKwkJCQkgICB3cml0ZSB0cmFuc2FjdGlvbnMgdG8gYXZvaWQgY29ycnVwdGlvbgorCiBFeGFtcGxlIFYxIFBNSUMtQXJiaXRlcjoKIAogCXNwbWkgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwvdGhlcm1hbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dAppbmRleCAxMjNhNjViLi43OTRkMjc5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dApAQCAtMTg3LDYgKzE4NywxMCBAQAogCQkJMjAwMG1XLCB3aGlsZSBvbiBhIDEwJycgdGFibGV0IGlzIGFyb3VuZAogCQkJNDUwMG1XLgogCistIGRpc2FibGUtdGhlcm1hbC16b25lOiBEaXNhYmxlIHRoZSB0aGVybWFsIHpvbmUgbW9uaXRvcmluZyBieSBkZWZhdWx0LiBUaGVzZQorICBUeXBlOmJvb2wJCXRoZXJtYWwgem9uZXMgd2lsbCBiZSBlbmFibGVkIGJ5IHVzZXJzcGFjZSBkYWVtb25zCisJCQliYXNlZCBvbiB1c2VjYXNlLgorCiAtIHRyYWNrcy1sb3c6CQlJbmRpY2F0ZXMgdGhhdCB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIHRyYWNrcyB0aGUgbG93CiAgIFR5cGU6IGJvb2wJCXRocmVzaG9sZHMsIHNvIHRoZSBnb3Zlcm5vcnMgbWF5IG1pdGlnYXRlIGJ5IGVuc3VyaW5nCiAJCQl0aW1pbmcgY2xvc3VyZXMgYW5kIG90aGVyIGxvdyB0ZW1wZXJhdHVyZSBvcGVyYXRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91ZnMvdWZzaGNkLXBsdGZybS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdWZzL3Vmc2hjZC1wbHRmcm0udHh0CmluZGV4IDQ5MDFmYTAuLmMzZTJjYWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91ZnMvdWZzaGNkLXBsdGZybS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Vmcy91ZnNoY2QtcGx0ZnJtLnR4dApAQCAtMjMsNiArMjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoICJwaHlzIiBhdHRyaWJ1dGUsIHByb3ZpZGVzIHBoYW5kbGUgdG8gVUZTIFBIWSBub2RlCiAtIHZkZC1oYmEtc3VwcGx5ICAgICAgICA6IHBoYW5kbGUgdG8gVUZTIGhvc3QgY29udHJvbGxlciBzdXBwbHkgcmVndWxhdG9yIG5vZGUKIC0gdmNjLXN1cHBseSAgICAgICAgICAgIDogcGhhbmRsZSB0byBWQ0Mgc3VwcGx5IHJlZ3VsYXRvciBub2RlCistIHZjYy12b2x0YWdlLWxldmVsICAgICA6IHNwZWNpZmllcyB2b2x0YWdlIGxldmVscyBmb3IgVkNDIHN1cHBseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIHNwZWNpZmllZCBpbiBwYWlycyAobWluLCBtYXgpLCB1bml0cyB1Vi4KIC0gdmNjcS1zdXBwbHkgICAgICAgICAgIDogcGhhbmRsZSB0byBWQ0NRIHN1cHBseSByZWd1bGF0b3Igbm9kZQogLSB2Y2NxMi1zdXBwbHkgICAgICAgICAgOiBwaGFuZGxlIHRvIFZDQ1EyIHN1cHBseSByZWd1bGF0b3Igbm9kZQogLSB2Y2Mtc3VwcGx5LTFwOCAgICAgICAgOiBGb3IgZW1iZWRkZWQgVUZTIGRldmljZXMsIHZhbGlkIFZDQyByYW5nZSBpcyAxLjctMS45NVYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CmluZGV4IDYwOWQ4NTMuLjY4MzhhZmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtNTgsNiArNTgsNyBAQAogCWdhdGluZy4gRGVmYXVsdCBpdCBpcyBlbmFibGVkLgogIC0gc25wcyx4aGNpLWltb2QtdmFsdWU6IEludGVycnVwdCBtb2RlcmF0aW9uIGludGVydmFsIGZvciBob3N0IG1vZGUKIAkoaW4gaW5jcmVtZW50cyBvZiAyNTBuc2VjKS4KKyAtIHVzYi1jb3JlLWlkOiBEaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGRpZmZlcmVudCBjb250cm9sbGVycyBwcmVzZW50IG9uIGEgZGV2aWNlLgogCiBUaGlzIGlzIHVzdWFsbHkgYSBzdWJub2RlIHRvIERXQzMgZ2x1ZSB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXNtLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL21zbS1waHkudHh0CmluZGV4IDYxMDlmYWQuLmQyM2NiNDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvbXNtLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9tc20tcGh5LnR4dApAQCAtMTU5LDYgKzE1OSw3IEBACiAgICAiZWZ1c2VfYWRkciI6IEVGVVNFIGFkZHJlc3MgdG8gcmVhZCBhbmQgdXBkYXRlIGFuYWxvZyB0dW5lIHBhcmFtZXRlci4KICAgICJlbXVfcGh5X2Jhc2UiIDogcGh5IGJhc2UgYWRkcmVzcyB1c2VkIGZvciBwcm9ncmFtbWluZyBlbXVsYXRpb24gdGFyZ2V0IHBoeS4KICAgICJyZWZfY2xrX2FkZHIiIDogcmVmX2NsayBiY3IgYWRkcmVzcyB1c2VkIGZvciBvbi9vZmYgcmVmX2NsayBiZWZvcmUgcmVzZXQuCisgICAiZXVkX2Jhc2UiIDogRVVEIGRldmljZSByZWdpc3RlciBhZGRyZXNzIHNwYWNlIHRvIHVzZSBFVUQgcGV0IGZ1bmN0aW9uYWxpdHkuCiAgLSBjbG9ja3M6IGEgbGlzdCBvZiBwaGFuZGxlcyB0byB0aGUgUEhZIGNsb2Nrcy4gVXNlIGFzIHBlcgogICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAogIC0gY2xvY2stbmFtZXM6IE5hbWVzIG9mIHRoZSBjbG9ja3MgaW4gMS0xIGNvcnJlc3BvbmRlbmNlIHdpdGggdGhlICJjbG9ja3MiCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDU4OTQzMzEuLjY2NTEwNGQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogVkVSU0lPTiA9IDQKIFBBVENITEVWRUwgPSA5Ci1TVUJMRVZFTCA9IDQwCitTVUJMRVZFTCA9IDUxCiBFWFRSQVZFUlNJT04gPQogTkFNRSA9IFJvYXJpbmcgTGlvbnVzCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdHlwZXMuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdHlwZXMuaAppbmRleCA0Y2I0YjZkLi4wYmM2NmUxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC0xLDYgKzEsNiBAQAogI2lmbmRlZiBfQUxQSEFfVFlQRVNfSAogI2RlZmluZSBfQUxQSEFfVFlQRVNfSAogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KKyNpbmNsdWRlIDx1YXBpL2FzbS90eXBlcy5oPgogCiAjZW5kaWYgLyogX0FMUEhBX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS90eXBlcy5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3R5cGVzLmgKaW5kZXggOWZkM2NkNC4uOGQxMDI0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3R5cGVzLmgKQEAgLTksOCArOSwxOCBAQAogICogbmVlZCB0byBiZSBjYXJlZnVsIHRvIGF2b2lkIGEgbmFtZSBjbGFzaGVzLgogICovCiAKLSNpZm5kZWYgX19LRVJORUxfXworLyoKKyAqIFRoaXMgaXMgaGVyZSBiZWNhdXNlIHdlIHVzZWQgdG8gdXNlIGw2NCBmb3IgYWxwaGEKKyAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIGltcGFjdCB1c2VyIG1vZGUgd2l0aCBvdXIgY2hhbmdlIHRvIGxsNjQKKyAqIGluIHRoZSBrZXJuZWwuCisgKgorICogSG93ZXZlciwgc29tZSB1c2VyIHByb2dyYW1zIGFyZSBmaW5lIHdpdGggdGhpcy4gIFRoZXkgY2FuCisgKiBmbGFnIF9fU0FORV9VU0VSU1BBQ0VfVFlQRVNfXyB0byBnZXQgaW50LWxsNjQuaCBoZXJlLgorICovCisjaWYgIWRlZmluZWQoX19TQU5FX1VTRVJTUEFDRV9UWVBFU19fKSAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ludC1sNjQuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KICNlbmRpZgogCiAjZW5kaWYgLyogX1VBUElfQUxQSEFfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2NhY2hlLmgKaW5kZXggYjM0MTBmZi4uNGZkNjI3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC04OSw3ICs4OSw5IEBACiAjZGVmaW5lIEFSQ19SRUdfU0xDX0ZMVVNICTB4OTA0CiAjZGVmaW5lIEFSQ19SRUdfU0xDX0lOVkFMSURBVEUJMHg5MDUKICNkZWZpbmUgQVJDX1JFR19TTENfUkdOX1NUQVJUCTB4OTE0CisjZGVmaW5lIEFSQ19SRUdfU0xDX1JHTl9TVEFSVDEJMHg5MTUKICNkZWZpbmUgQVJDX1JFR19TTENfUkdOX0VORAkweDkxNgorI2RlZmluZSBBUkNfUkVHX1NMQ19SR05fRU5EMQkweDkxNwogCiAvKiBCaXQgdmFsIGluIFNMQ19DT05UUk9MICovCiAjZGVmaW5lIFNMQ19DVFJMX0lNCQkweDA0MApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL21jaXAuYyBiL2FyY2gvYXJjL2tlcm5lbC9tY2lwLmMKaW5kZXggZjM5MTQyYS4uYmUxMzFiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL21jaXAuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvbWNpcC5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vaXJxZmxhZ3MtYXJjdjIuaD4KICNpbmNsdWRlIDxhc20vbWNpcC5oPgpAQCAtMjIxLDEwICsyMjIsMTMgQEAKIHN0YXRpYyB2b2lkIGlkdV9jYXNjYWRlX2lzcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJc3RydWN0IGlycV9kb21haW4gKmlkdV9kb21haW4gPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY29yZV9jaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJaXJxX2h3X251bWJlcl90IGNvcmVfaHdpcnEgPSBpcnFkX3RvX2h3aXJxKGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKSk7CiAJaXJxX2h3X251bWJlcl90IGlkdV9od2lycSA9IGNvcmVfaHdpcnEgLSBpZHVfZmlyc3RfaHdpcnE7CiAKKwljaGFpbmVkX2lycV9lbnRlcihjb3JlX2NoaXAsIGRlc2MpOwogCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfZmluZF9tYXBwaW5nKGlkdV9kb21haW4sIGlkdV9od2lycSkpOworCWNoYWluZWRfaXJxX2V4aXQoY29yZV9jaGlwLCBkZXNjKTsKIH0KIAogc3RhdGljIGludCBpZHVfaXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IHZpcnEsIGlycV9od19udW1iZXJfdCBod2lycSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL21tL2NhY2hlLmMgYi9hcmNoL2FyYy9tbS9jYWNoZS5jCmluZGV4IDgxNDc1ODMuLmJiZGZlYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL21tL2NhY2hlLmMKKysrIGIvYXJjaC9hcmMvbW0vY2FjaGUuYwpAQCAtNTYyLDYgKzU2Miw3IEBACiAJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBjdHJsOworCXBoeXNfYWRkcl90IGVuZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CiAKQEAgLTU5MSw4ICs1OTIsMTYgQEAKIAkgKiBFTkQgbmVlZHMgdG8gYmUgc2V0dXAgYmVmb3JlIFNUQVJUIChsYXR0ZXIgdHJpZ2dlcnMgdGhlIG9wZXJhdGlvbikKIAkgKiBFTkQgY2FuJ3QgYmUgc2FtZSBhcyBTVEFSVCwgc28gYWRkIChsMl9saW5lX3N6IC0gMSkgdG8gc3oKIAkgKi8KLQl3cml0ZV9hdXhfcmVnKEFSQ19SRUdfU0xDX1JHTl9FTkQsIChwYWRkciArIHN6ICsgbDJfbGluZV9zeiAtIDEpKTsKLQl3cml0ZV9hdXhfcmVnKEFSQ19SRUdfU0xDX1JHTl9TVEFSVCwgcGFkZHIpOworCWVuZCA9IHBhZGRyICsgc3ogKyBsMl9saW5lX3N6IC0gMTsKKwlpZiAoaXNfcGFlNDBfZW5hYmxlZCgpKQorCQl3cml0ZV9hdXhfcmVnKEFSQ19SRUdfU0xDX1JHTl9FTkQxLCB1cHBlcl8zMl9iaXRzKGVuZCkpOworCisJd3JpdGVfYXV4X3JlZyhBUkNfUkVHX1NMQ19SR05fRU5ELCBsb3dlcl8zMl9iaXRzKGVuZCkpOworCisJaWYgKGlzX3BhZTQwX2VuYWJsZWQoKSkKKwkJd3JpdGVfYXV4X3JlZyhBUkNfUkVHX1NMQ19SR05fU1RBUlQxLCB1cHBlcl8zMl9iaXRzKHBhZGRyKSk7CisKKwl3cml0ZV9hdXhfcmVnKEFSQ19SRUdfU0xDX1JHTl9TVEFSVCwgbG93ZXJfMzJfYml0cyhwYWRkcikpOwogCiAJd2hpbGUgKHJlYWRfYXV4X3JlZyhBUkNfUkVHX1NMQ19DVFJMKSAmIFNMQ19DVFJMX0JVU1kpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm0vS2NvbmZpZy5kZWJ1ZwppbmRleCBjZjYxYjgwLi45Y2U2YjdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYXJtL0tjb25maWcuZGVidWcKQEAgLTYyLDYgKzYyLDEwIEBACiAJICAgICAgOCAtIFNJR1NFR1YgZmF1bHRzCiAJICAgICAxNiAtIFNJR0JVUyBmYXVsdHMKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfREVCVUdfUEFHRUFMTE9DCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gRk9SQ0VfUEFHRVMKKwogY29uZmlnIEZPUkNFX1BBR0VTCiAJYm9vbCAiRm9yY2UgbG93bWVtIHRvIGJlIG1hcHBlZCB3aXRoIDRLIHBhZ2VzIgogICAgICAgICBoZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hbTU3eHgtaWRrLWNvbW1vbi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW01N3h4LWlkay1jb21tb24uZHRzaQppbmRleCAwM2NlYzYyLi5kYjg1OGZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hbTU3eHgtaWRrLWNvbW1vbi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNTd4eC1pZGstY29tbW9uLmR0c2kKQEAgLTI5NCw3ICsyOTQsNyBAQAogfTsKIAogJnVzYjIgewotCWRyX21vZGUgPSAib3RnIjsKKwlkcl9tb2RlID0gInBlcmlwaGVyYWwiOwogfTsKIAogJm1tYzIgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYXJtYWRhLTM4OC1ncC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEtMzg4LWdwLmR0cwppbmRleCA4OTVmYTZjLi41NjM5MDFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEtMzg4LWdwLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEtMzg4LWdwLmR0cwpAQCAtNzUsNyArNzUsNyBAQAogCQkJCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQkJCQlwaW5jdHJsLTAgPSA8JnBjYTBfcGlucz47CiAJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8wPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxOCBJUlFfVFlQRV9FREdFX0ZBTExJTkc+OworCQkJCQlpbnRlcnJ1cHRzID0gPDE4IElSUV9UWVBFX0xFVkVMX0xPVz47CiAJCQkJCWdwaW8tY29udHJvbGxlcjsKIAkJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CiAJCQkJCWludGVycnVwdC1jb250cm9sbGVyOwpAQCAtODcsNyArODcsNyBAQAogCQkJCQljb21wYXRpYmxlID0gIm54cCxwY2E5NTU1IjsKIAkJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzA+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDE4IElSUV9UWVBFX0VER0VfRkFMTElORz47CisJCQkJCWludGVycnVwdHMgPSA8MTggSVJRX1RZUEVfTEVWRUxfTE9XPjsKIAkJCQkJZ3Bpby1jb250cm9sbGVyOwogCQkJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1uOTAwLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW45MDAuZHRzCmluZGV4IDg3Y2E1MGIuLjRkNDQ4ZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW45MDAuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW45MDAuZHRzCkBAIC03MzQsNiArNzM0LDggQEAKIAl2bW1jX2F1eC1zdXBwbHkgPSA8JnZzaW0+OwogCWJ1cy13aWR0aCA9IDw4PjsKIAlub24tcmVtb3ZhYmxlOworCW5vLXNkaW87CisJbm8tc2Q7CiB9OwogCiAmbW1jMyB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9xY29tL3BteHBvb3J3aWxscy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS9wbXhwb29yd2lsbHMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RmMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS9wbXhwb29yd2lsbHMuZHRzaQpAQCAtMCwwICsxLDYyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NwbWkvc3BtaS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2lycS5oPgorCismc3BtaV9idXMgeworCXFjb20scG14cG9vcndpbGxzQDAgeworCQljb21wYXRpYmxlID0gInFjb20sc3BtaS1wbWljIjsKKwkJcmVnID0gPDB4MCBTUE1JX1VTSUQ+OworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJcG14cG9vcndpbGxzX3JldmlkOiBxY29tLHJldmlkQDEwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20scXBucC1yZXZpZCI7CisJCQlyZWcgPSA8MHgxMDAgMHgxMDA+OworCQl9OworCisJCXFjb20scG93ZXItb25AODAwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxxcG5wLXBvd2VyLW9uIjsKKwkJCXJlZyA9IDwweDgwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDggMHgwIElSUV9UWVBFX05PTkU+LAorCQkJCSAgICAgPDB4MCAweDggMHgxIElSUV9UWVBFX05PTkU+LAorCQkJCSAgICAgPDB4MCAweDggMHg0IElSUV9UWVBFX05PTkU+LAorCQkJCSAgICAgPDB4MCAweDggMHg1IElSUV9UWVBFX05PTkU+OworCQkJaW50ZXJydXB0LW5hbWVzID0gImtwZHB3ciIsICJyZXNpbiIsCisJCQkJCSJyZXNpbi1iYXJrIiwgImtwZHB3ci1yZXNpbi1iYXJrIjsKKwkJCXFjb20scG9uLWRiYy1kZWxheSA9IDwxNTYyNT47CisJCQlxY29tLGtwZHB3ci1zdy1kZWJvdW5jZTsKKwkJCXFjb20sc3lzdGVtLXJlc2V0OworCQkJcWNvbSxzdG9yZS1oYXJkLXJlc2V0LXJlYXNvbjsKKworCQkJcWNvbSxwb25fMSB7CisJCQkJcWNvbSxwb24tdHlwZSA9IDwwPjsKKwkJCQlxY29tLHB1bGwtdXAgPSA8MT47CisJCQkJbGludXgsY29kZSA9IDwxMTY+OworCQkJfTsKKworCQkJcWNvbSxwb25fMiB7CisJCQkJcWNvbSxwb24tdHlwZSA9IDwxPjsKKwkJCQlxY29tLHB1bGwtdXAgPSA8MT47CisJCQkJbGludXgsY29kZSA9IDwxMTQ+OworCQkJfTsKKwkJfTsKKwl9OworCisJcWNvbSxwbXhwb29yd2lsbHNAMSB7CisJCWNvbXBhdGlibGUgPSJxY29tLHNwbWktcG1pYyI7CisJCXJlZyA9IDwweDEgU1BNSV9VU0lEPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS9zZHhwb29yd2lsbHMtc21wMnAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20vc2R4cG9vcndpbGxzLXNtcDJwLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZDZmNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20vc2R4cG9vcndpbGxzLXNtcDJwLmR0c2kKQEAgLTAsMCArMSwxMDkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCismc29jIHsKKwlxY29tLHNtcDJwLW1vZGVtQDE3ODExMDA4IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNtcDJwIjsKKwkJcmVnID0gPDB4MTc4MTEwMDggMHg0PjsKKwkJcWNvbSxyZW1vdGUtcGlkID0gPDE+OworCQlxY29tLGlycS1iaXRtYXNrID0gPDB4NDAwMD47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMTMgSVJRX1RZUEVfRURHRV9SSVNJTkc+OworCX07CisKKwlzbXAycGdwaW9fc21wMnBfMTVfaW46IHFjb20sc21wMnBncGlvLXNtcDJwLTE1LWluIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNtcDJwZ3BpbyI7CisJCXFjb20sZW50cnktbmFtZSA9ICJzbXAycCI7CisJCXFjb20scmVtb3RlLXBpZCA9IDwxNT47CisJCXFjb20saXMtaW5ib3VuZDsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJfTsKKworCXFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMTVfaW4geworCQljb21wYXRpYmxlID0gInFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMTVfaW4iOworCQlncGlvcyA9IDwmc21wMnBncGlvX3NtcDJwXzE1X2luIDAgMD47CisJfTsKKworCXNtcDJwZ3Bpb19zbXAycF8xNV9vdXQ6IHFjb20sc21wMnBncGlvLXNtcDJwLTE1LW91dCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzbXAycGdwaW8iOworCQlxY29tLGVudHJ5LW5hbWUgPSAic21wMnAiOworCQlxY29tLHJlbW90ZS1waWQgPSA8MTU+OworCQlncGlvLWNvbnRyb2xsZXI7CisJCSNncGlvLWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwl9OworCisJcWNvbSxzbXAycGdwaW9fdGVzdF9zbXAycF8xNV9vdXQgeworCQljb21wYXRpYmxlID0gInFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMTVfb3V0IjsKKwkJZ3Bpb3MgPSA8JnNtcDJwZ3Bpb19zbXAycF8xNV9vdXQgMCAwPjsKKwl9OworCisJc21wMnBncGlvX3NtcDJwXzFfaW46IHFjb20sc21wMnBncGlvLXNtcDJwLTEtaW4geworCQljb21wYXRpYmxlID0gInFjb20sc21wMnBncGlvIjsKKwkJcWNvbSxlbnRyeS1uYW1lID0gInNtcDJwIjsKKwkJcWNvbSxyZW1vdGUtcGlkID0gPDE+OworCQlxY29tLGlzLWluYm91bmQ7CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCX07CisKKwlxY29tLHNtcDJwZ3Bpb190ZXN0X3NtcDJwXzFfaW4geworCQljb21wYXRpYmxlID0gInFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMV9pbiI7CisJCWdwaW9zID0gPCZzbXAycGdwaW9fc21wMnBfMV9pbiAwIDA+OworCX07CisKKwlzbXAycGdwaW9fc21wMnBfMV9vdXQ6IHFjb20sc21wMnBncGlvLXNtcDJwLTEtb3V0IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNtcDJwZ3BpbyI7CisJCXFjb20sZW50cnktbmFtZSA9ICJzbXAycCI7CisJCXFjb20scmVtb3RlLXBpZCA9IDwxPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJfTsKKworCXFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMV9vdXQgeworCQljb21wYXRpYmxlID0gInFjb20sc21wMnBncGlvX3Rlc3Rfc21wMnBfMV9vdXQiOworCQlncGlvcyA9IDwmc21wMnBncGlvX3NtcDJwXzFfb3V0IDAgMD47CisJfTsKKworCS8qIHNzciAtIGluYm91bmQgZW50cnkgZnJvbSBtc3MgKi8KKwlzbXAycGdwaW9fc3NyX3NtcDJwXzFfaW46IHFjb20sc21wMnBncGlvLXNzci1zbXAycC0xLWluIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNtcDJwZ3BpbyI7CisJCXFjb20sZW50cnktbmFtZSA9ICJzbGF2ZS1rZXJuZWwiOworCQlxY29tLHJlbW90ZS1waWQgPSA8MT47CisJCXFjb20saXMtaW5ib3VuZDsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJfTsKKworCS8qIHNzciAtIG91dGJvdW5kIGVudHJ5IHRvIG1zcyAqLworCXNtcDJwZ3Bpb19zc3Jfc21wMnBfMV9vdXQ6IHFjb20sc21wMnBncGlvLXNzci1zbXAycC0xLW91dCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzbXAycGdwaW8iOworCQlxY29tLGVudHJ5LW5hbWUgPSAibWFzdGVyLWtlcm5lbCI7CisJCXFjb20scmVtb3RlLXBpZCA9IDwxPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJfTsKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20vc2R4cG9vcndpbGxzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9xY29tL3NkeHBvb3J3aWxscy5kdHNpCmluZGV4IGU4ZDhmOWEuLmQ1MzhlZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3Fjb20vc2R4cG9vcndpbGxzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcWNvbS9zZHhwb29yd2lsbHMuZHRzaQpAQCAtMzQsNiArMzQsMTMgQEAKIAkJCXJlZyA9IDwweDhmZDAwMDAwIDB4MzAwMDAwPjsKIAkJCWxhYmVsID0gInBlcmlwaGVyYWwyX21lbSI7CiAJCX07CisKKwkJbXNzX21lbTogbXNzX3JlZ2lvbkA4NzgwMDAwMCB7CisJCQljb21wYXRpYmxlID0gInJlbW92ZWQtZG1hLXBvb2wiOworCQkJbm8tbWFwOworCQkJcmVnID0gPDB4ODc4MDAwMDAgMHg4MDAwMDAwPjsKKwkJCWxhYmVsID0gIm1zc19tZW0iOworCQl9OwogCX07CiAKIAljcHVzIHsKQEAgLTE3NSw2ICsxODIsMTEgQEAKIAkJc3RhdHVzID0gIm9rIjsKIAl9OwogCisJcWNvbSxzcHMgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtX3Nwc180ayI7CisJCXFjb20scGlwZS1hdHRyLWVlOworCX07CisKIAlnZHNjX3BjaWU6IHFjb20sZ2RzY0AxMzcwMDQgewogCQljb21wYXRpYmxlID0gInFjb20sZ2RzYyI7CiAJCXJlZ3VsYXRvci1uYW1lID0gImdkc2NfcGNpZSI7CkBAIC0zMTksNyArMzMxLDEzNCBAQAogCQkjaW50ZXJydXB0LWNlbGxzID0gPDQ+OwogCQljZWxsLWluZGV4ID0gPDA+OwogCX07CisKKwlxY29tLGlwYy1zcGlubG9ja0AxZjQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGlwYy1zcGlubG9jay1zZnBiIjsKKwkJcmVnID0gPDB4MWY0MDAwMCAweDgwMDA+OworCQlxY29tLG51bS1sb2NrcyA9IDw4PjsKKwl9OworCisJcWNvbSxzbWVtQDhmZTQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNtZW0iOworCQlyZWcgPSA8MHg4ZmU0MDAwMCAweGMwMDAwPiwKKwkJCTwweDE3ODExMDA4IDB4ND4sCisJCQk8MHgxZmQ0MDAwIDB4OD47CisJCXJlZy1uYW1lcyA9ICJzbWVtIiwgImlycS1yZWctYmFzZSIsCisJCQkic21lbV90YXJnX2luZm9fcmVnIjsKKwkJcWNvbSxtcHUtZW5hYmxlZDsKKwl9OworCisJcWNvbSxnbGluay1zbWVtLW5hdGl2ZS14cHJ0LW1vZGVtQDhmZTQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGdsaW5rLXNtZW0tbmF0aXZlLXhwcnQiOworCQlyZWcgPSA8MHg4ZmU0MDAwMCAweGMwMDAwPiwKKwkJCTwweDE3ODExMDA4IDB4ND47CisJCXJlZy1uYW1lcyA9ICJzbWVtIiwgImlycS1yZWctYmFzZSI7CisJCXFjb20saXJxLW1hc2sgPSA8MHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExMSBJUlFfVFlQRV9FREdFX1JJU0lORz47CisJCWxhYmVsID0gIm1wc3MiOworCX07CisKKwlxY29tLGlwY19yb3V0ZXIgeworCQljb21wYXRpYmxlID0gInFjb20saXBjX3JvdXRlciI7CisJCXFjb20sbm9kZS1pZCA9IDwxPjsKKwl9OworCisJcWNvbSxpcGNfcm91dGVyX21vZGVtX3hwcnQgeworCQljb21wYXRpYmxlID0gInFjb20saXBjX3JvdXRlcl9nbGlua194cHJ0IjsKKwkJcWNvbSxjaC1uYW1lID0gIklQQ1JUUiI7CisJCXFjb20seHBydC1yZW1vdGUgPSAibXBzcyI7CisJCXFjb20sZ2xpbmsteHBydCA9ICJzbWVtIjsKKwkJcWNvbSx4cHJ0LWxpbmtpZCA9IDwxPjsKKwkJcWNvbSx4cHJ0LXZlcnNpb24gPSA8MT47CisJCXFjb20sZnJhZ21lbnRlZC1kYXRhOworCX07CisKKwlxY29tLGdsaW5rX3BrdCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxnbGlua3BrdCI7CisKKwkJcWNvbSxnbGlua3BrdC1hdC1tZG0wIHsKKwkJCXFjb20sZ2xpbmtwa3QtdHJhbnNwb3J0ID0gInNtZW0iOworCQkJcWNvbSxnbGlua3BrdC1lZGdlID0gIm1wc3MiOworCQkJcWNvbSxnbGlua3BrdC1jaC1uYW1lID0gIkRTIjsKKwkJCXFjb20sZ2xpbmtwa3QtZGV2LW5hbWUgPSAiYXRfbWRtMCI7CisJCX07CisKKwkJcWNvbSxnbGlua3BrdC1sb29wYmFja19jbnRsIHsKKwkJCXFjb20sZ2xpbmtwa3QtdHJhbnNwb3J0ID0gImxsb29wIjsKKwkJCXFjb20sZ2xpbmtwa3QtZWRnZSA9ICJsb2NhbCI7CisJCQlxY29tLGdsaW5rcGt0LWNoLW5hbWUgPSAiTE9DQUxfTE9PUEJBQ0tfQ0xOVCI7CisJCQlxY29tLGdsaW5rcGt0LWRldi1uYW1lID0gImdsaW5rX3BrdF9sb29wYmFja19jdHJsIjsKKwkJfTsKKworCQlxY29tLGdsaW5rcGt0LWxvb3BiYWNrX2RhdGEgeworCQkJcWNvbSxnbGlua3BrdC10cmFuc3BvcnQgPSAibGxvb3AiOworCQkJcWNvbSxnbGlua3BrdC1lZGdlID0gImxvY2FsIjsKKwkJCXFjb20sZ2xpbmtwa3QtY2gtbmFtZSA9ICJnbGlua19wa3RfbGxvb3BfQ0xOVCI7CisJCQlxY29tLGdsaW5rcGt0LWRldi1uYW1lID0gImdsaW5rX3BrdF9sb29wYmFjayI7CisJCX07CisKKwkJcWNvbSxnbGlua3BrdC1kYXRhNDAtY250bCB7CisJCQlxY29tLGdsaW5rcGt0LXRyYW5zcG9ydCA9ICJzbWVtIjsKKwkJCXFjb20sZ2xpbmtwa3QtZWRnZSA9ICJtcHNzIjsKKwkJCXFjb20sZ2xpbmtwa3QtY2gtbmFtZSA9ICJEQVRBNDBfQ05UTCI7CisJCQlxY29tLGdsaW5rcGt0LWRldi1uYW1lID0gInNtZGNudGw4IjsKKwkJfTsKKworCQlxY29tLGdsaW5rcGt0LWRhdGExIHsKKwkJCXFjb20sZ2xpbmtwa3QtdHJhbnNwb3J0ID0gInNtZW0iOworCQkJcWNvbSxnbGlua3BrdC1lZGdlID0gIm1wc3MiOworCQkJcWNvbSxnbGlua3BrdC1jaC1uYW1lID0gIkRBVEExIjsKKwkJCXFjb20sZ2xpbmtwa3QtZGV2LW5hbWUgPSAic21kNyI7CisJCX07CisKKwkJcWNvbSxnbGlua3BrdC1kYXRhNCB7CisJCQlxY29tLGdsaW5rcGt0LXRyYW5zcG9ydCA9ICJzbWVtIjsKKwkJCXFjb20sZ2xpbmtwa3QtZWRnZSA9ICJtcHNzIjsKKwkJCXFjb20sZ2xpbmtwa3QtY2gtbmFtZSA9ICJEQVRBNCI7CisJCQlxY29tLGdsaW5rcGt0LWRldi1uYW1lID0gInNtZDgiOworCQl9OworCisJCXFjb20sZ2xpbmtwa3QtZGF0YTExIHsKKwkJCXFjb20sZ2xpbmtwa3QtdHJhbnNwb3J0ID0gInNtZW0iOworCQkJcWNvbSxnbGlua3BrdC1lZGdlID0gIm1wc3MiOworCQkJcWNvbSxnbGlua3BrdC1jaC1uYW1lID0gIkRBVEExMSI7CisJCQlxY29tLGdsaW5rcGt0LWRldi1uYW1lID0gInNtZDExIjsKKwkJfTsKKwl9OworCisJcGlsX21vZGVtOiBxY29tLG1zc0A0MDgwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBpbC10ei1nZW5lcmljIjsKKwkJcmVnID0gPDB4NDA4MDAwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MCAyNTAgMT47CisKKwkJY2xvY2tzID0gPCZjbG9ja19ycG1oIFJQTUhfQ1hPX0NMSz47CisJCWNsb2NrLW5hbWVzID0gInhvIjsKKwkJcWNvbSxwcm94eS1jbG9jay1uYW1lcyA9ICJ4byI7CisKKwkJdmRkX2N4LXN1cHBseSA9IDwmcG14cG9vcndpbGxzX3M1X2xldmVsPjsKKwkJcWNvbSxwcm94eS1yZWctbmFtZXMgPSAidmRkX2N4IjsKKworCQlxY29tLHBhcy1pZCA9IDwwPjsKKwkJcWNvbSxzbWVtLWlkID0gPDQyMT47CisJCXFjb20scHJveHktdGltZW91dC1tcyA9IDwxMDAwMD47CisJCXFjb20sc3lzbW9uLWlkID0gPDA+OworCQlxY29tLHNzY3RsLWluc3RhbmNlLWlkID0gPDB4MTI+OworCQlxY29tLGZpcm13YXJlLW5hbWUgPSAibW9kZW0iOworCQltZW1vcnktcmVnaW9uID0gPCZtc3NfbWVtPjsKKwkJc3RhdHVzID0gIm9rIjsKKworCQkvKiBHUElPIGlucHV0cyBmcm9tIG1zcyAqLworCQlxY29tLGdwaW8tZXJyLWZhdGFsID0gPCZzbXAycGdwaW9fc3NyX3NtcDJwXzFfaW4gMCAwPjsKKwkJcWNvbSxncGlvLWVyci1yZWFkeSA9IDwmc21wMnBncGlvX3Nzcl9zbXAycF8xX2luIDEgMD47CisJCXFjb20sZ3Bpby1wcm94eS11bnZvdGUgPSA8JnNtcDJwZ3Bpb19zc3Jfc21wMnBfMV9pbiAyIDA+OworCQlxY29tLGdwaW8tc3RvcC1hY2sgPSA8JnNtcDJwZ3Bpb19zc3Jfc21wMnBfMV9pbiAzIDA+OworCisJCS8qIEdQSU8gb3V0cHV0IHRvIG1zcyAqLworCQlxY29tLGdwaW8tZm9yY2Utc3RvcCA9IDwmc21wMnBncGlvX3Nzcl9zbXAycF8xX291dCAwIDA+OworCX07CiB9OwogCisjaW5jbHVkZSAicG14cG9vcndpbGxzLmR0c2kiCiAjaW5jbHVkZSAic2R4cG9vcndpbGxzLXJlZ3VsYXRvci5kdHNpIgorI2luY2x1ZGUgInNkeHBvb3J3aWxscy1zbXAycC5kdHNpIgogI2luY2x1ZGUgInNkeHBvb3J3aWxscy11c2IuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC1vbGludXhpbm8tbGltZTItZW1tYy5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAtb2xpbnV4aW5vLWxpbWUyLWVtbWMuZHRzCmluZGV4IDVlYTQ5MTUuLjEwZDMwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC1vbGludXhpbm8tbGltZTItZW1tYy5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLW9saW51eGluby1saW1lMi1lbW1jLmR0cwpAQCAtNTYsNyArNTYsNyBAQAogfTsKIAogJnBpbyB7Ci0JbW1jMl9waW5zX25yc3Q6IG1tYzJAMCB7CisJbW1jMl9waW5zX25yc3Q6IG1tYzItcnN0LXBpbiB7CiAJCWFsbHdpbm5lcixwaW5zID0gIlBDMTYiOwogCQlhbGx3aW5uZXIsZnVuY3Rpb24gPSAiZ3Bpb19vdXQiOwogCQlhbGx3aW5uZXIsZHJpdmUgPSA8U1VONElfUElOQ1RSTF8xMF9NQT47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90YW5nbzQtdmFudGFnZS0xMTcyLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RhbmdvNC12YW50YWdlLTExNzIuZHRzCmluZGV4IDRjYWI2NGMuLmUzYTUxZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RhbmdvNC12YW50YWdlLTExNzIuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RhbmdvNC12YW50YWdlLTExNzIuZHRzCkBAIC0yMSw3ICsyMSw3IEBACiB9OwogCiAmZXRoMCB7Ci0JcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paSI7CisJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CiAJcGh5LWhhbmRsZSA9IDwmZXRoMF9waHk+OwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKaW5kZXggYmM0YmZlMC4uNjBkM2ZlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCkBAIC04Niw5ICs4Niw5IEBACiBDT05GSUdfTkVURklMVEVSPXkKIENPTkZJR19ORl9DT05OVFJBQ0s9bQogQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFM9eQotQ09ORklHX05GX0NUX1BST1RPX0RDQ1A9bQotQ09ORklHX05GX0NUX1BST1RPX1NDVFA9bQotQ09ORklHX05GX0NUX1BST1RPX1VEUExJVEU9bQorQ09ORklHX05GX0NUX1BST1RPX0RDQ1A9eQorQ09ORklHX05GX0NUX1BST1RPX1NDVFA9eQorQ09ORklHX05GX0NUX1BST1RPX1VEUExJVEU9eQogQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9bQogQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQogQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPW0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2R4cG9vcndpbGxzLXBlcmZfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zZHhwb29yd2lsbHMtcGVyZl9kZWZjb25maWcKaW5kZXggNjJkMjg3YS4uMjc2NWUyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zZHhwb29yd2lsbHMtcGVyZl9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9zZHhwb29yd2lsbHMtcGVyZl9kZWZjb25maWcKQEAgLTE5NSwxMCArMTk1LDExIEBACiBDT05GSUdfSU5QVVRfR1BJTz1tCiBDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfTVNNX0hTPXkKK0NPTkZJR19ESUFHX0NIQVI9eQogQ09ORklHX0hXX1JBTkRPTT15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ0hBUkRFVj15Ci1DT05GSUdfU09VTkRXSVJFPXkKIENPTkZJR19TUEk9eQogQ09ORklHX1NQSV9RVVA9eQogQ09ORklHX1NQSV9TUElERVY9bQpAQCAtMjc3LDEzICsyNzgsMTkgQEAKIENPTkZJR19TUFNfU1VQUE9SVF9ORFBfQkFNPXkKIENPTkZJR19VU0JfQkFNPXkKIENPTkZJR19SRU1PVEVfU1BJTkxPQ0tfTVNNPXkKK0NPTkZJR19NQUlMQk9YPXkKIENPTkZJR19RQ09NX1NDTT15CiBDT05GSUdfTVNNX0JPT1RfU1RBVFM9eQogQ09ORklHX01TTV9TTUVNPXkKK0NPTkZJR19NU01fR0xJTks9eQorQ09ORklHX01TTV9HTElOS19MT09QQkFDS19TRVJWRVI9eQorQ09ORklHX01TTV9HTElOS19TTUVNX05BVElWRV9YUFJUPXkKIENPTkZJR19UUkFDRVJfUEtUPXkKIENPTkZJR19NU01fU01QMlA9eQogQ09ORklHX01TTV9TTVAyUF9URVNUPXkKK0NPTkZJR19NU01fSVBDX1JPVVRFUl9HTElOS19YUFJUPXkKIENPTkZJR19NU01fUU1JX0lOVEVSRkFDRT15CitDT05GSUdfTVNNX0dMSU5LX1BLVD15CiBDT05GSUdfTVNNX1NVQlNZU1RFTV9SRVNUQVJUPXkKIENPTkZJR19NU01fUElMPXkKIENPTkZJR19NU01fUElMX1NTUl9HRU5FUklDPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvc2R4cG9vcndpbGxzX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2R4cG9vcndpbGxzX2RlZmNvbmZpZwppbmRleCBmM2IwMDI0NC4uMTA2MjE3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9zZHhwb29yd2lsbHNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mvc2R4cG9vcndpbGxzX2RlZmNvbmZpZwpAQCAtMTg5LDExICsxODksMTQgQEAKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfTVNNPXkKIENPTkZJR19TRVJJQUxfTVNNX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9NU01fSFM9eQorQ09ORklHX0RJQUdfQ0hBUj15CiBDT05GSUdfSFdfUkFORE9NPXkKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19DSEFSREVWPXkKLUNPTkZJR19TT1VORFdJUkU9eQorQ09ORklHX0kyQ19NU01fVjI9eQogQ09ORklHX1NQST15CitDT05GSUdfU1BJX1FVUD15CiBDT05GSUdfU1BJX1NQSURFVj1tCiBDT05GSUdfU0xJTUJVUz15CiBDT05GSUdfUElOQ1RSTF9TRFhQT09SV0lMTFM9eQpAQCAtMjAzLDYgKzIwNiw3IEBACiBDT05GSUdfUE9XRVJfU1VQUExZPXkKIENPTkZJR19USEVSTUFMPXkKIENPTkZJR19USEVSTUFMX1RTRU5TPXkKK0NPTkZJR19NRkRfU1lTQ09OPXkKIENPTkZJR19NU01fQ0RDX1BJTkNUUkw9eQogQ09ORklHX01TTV9DRENfU1VQUExZPXkKIENPTkZJR19SRUdVTEFUT1I9eQpAQCAtMjYwLDYgKzI2NCw3IEBACiBDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX0RNQURFVklDRVM9eQorQ09ORklHX1FDT01fU1BTX0RNQT15CiBDT05GSUdfVUlPPXkKIENPTkZJR19TVEFHSU5HPXkKIENPTkZJR19HU0k9eQpAQCAtMjcwLDEzICsyNzUsMjAgQEAKIENPTkZJR19JUEFfVVQ9eQogQ09ORklHX1NQUz15CiBDT05GSUdfU1BTX1NVUFBPUlRfTkRQX0JBTT15Ci1DT05GSUdfSFdTUElOTE9DS19RQ09NPXkKLUNPTkZJR19RQ09NX1NNRU09eQotQ09ORklHX1FDT01fU01EPXkKK0NPTkZJR19SRU1PVEVfU1BJTkxPQ0tfTVNNPXkKK0NPTkZJR19NQUlMQk9YPXkKIENPTkZJR19RQ09NX1NDTT15CiBDT05GSUdfTVNNX0JPT1RfU1RBVFM9eQorQ09ORklHX01TTV9TTUVNPXkKK0NPTkZJR19NU01fR0xJTks9eQorQ09ORklHX01TTV9HTElOS19MT09QQkFDS19TRVJWRVI9eQorQ09ORklHX01TTV9HTElOS19TTUVNX05BVElWRV9YUFJUPXkKIENPTkZJR19UUkFDRVJfUEtUPXkKK0NPTkZJR19NU01fU01QMlA9eQorQ09ORklHX01TTV9TTVAyUF9URVNUPXkKK0NPTkZJR19NU01fSVBDX1JPVVRFUl9HTElOS19YUFJUPXkKIENPTkZJR19NU01fUU1JX0lOVEVSRkFDRT15CitDT05GSUdfTVNNX0dMSU5LX1BLVD15CiBDT05GSUdfTVNNX1NVQlNZU1RFTV9SRVNUQVJUPXkKIENPTkZJR19NU01fUElMPXkKIENPTkZJR19NU01fUElMX1NTUl9HRU5FUklDPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXggYmZlMmEyZi4uMjJiNzMxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZnRyYWNlLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZnRyYWNlLmgKQEAgLTU0LDYgKzU0LDI0IEBACiAKICNkZWZpbmUgZnRyYWNlX3JldHVybl9hZGRyZXNzKG4pIHJldHVybl9hZGRyZXNzKG4pCiAKKyNkZWZpbmUgQVJDSF9IQVNfU1lTQ0FMTF9NQVRDSF9TWU1fTkFNRQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXJjaF9zeXNjYWxsX21hdGNoX3N5bV9uYW1lKGNvbnN0IGNoYXIgKnN5bSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKCFzdHJjbXAoc3ltLCAic3lzX21tYXAyIikpCisJCXN5bSA9ICJzeXNfbW1hcF9wZ29mZiI7CisJZWxzZSBpZiAoIXN0cmNtcChzeW0sICJzeXNfc3RhdGZzNjRfd3JhcHBlciIpKQorCQlzeW0gPSAic3lzX3N0YXRmczY0IjsKKwllbHNlIGlmICghc3RyY21wKHN5bSwgInN5c19mc3RhdGZzNjRfd3JhcHBlciIpKQorCQlzeW0gPSAic3lzX2ZzdGF0ZnM2NCI7CisJZWxzZSBpZiAoIXN0cmNtcChzeW0sICJzeXNfYXJtX2ZhZHZpc2U2NF82NCIpKQorCQlzeW0gPSAic3lzX2ZhZHZpc2U2NF82NCI7CisKKwkvKiBJZ25vcmUgY2FzZSBzaW5jZSBzeW0gbWF5IHN0YXJ0IHdpdGggIlN5UyIgaW5zdGVhZCBvZiAic3lzIiAqLworCXJldHVybiAhc3RyY2FzZWNtcChzeW0sIG5hbWUpOworfQorCiAjZW5kaWYgLyogaWZuZGVmIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX0FTTV9BUk1fRlRSQUNFICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vbW11LmMgYi9hcmNoL2FybS9rdm0vbW11LmMKaW5kZXggMzMyY2UzYi4uMjIwNmUwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL21tdS5jCisrKyBiL2FyY2gvYXJtL2t2bS9tbXUuYwpAQCAtODI5LDIyICs4MjksMjIgQEAKICAqIFdhbGtzIHRoZSBsZXZlbC0xIHBhZ2UgdGFibGUgcG9pbnRlZCB0byBieSBrdm0tPmFyY2gucGdkIGFuZCBmcmVlcyBhbGwKICAqIHVuZGVybHlpbmcgbGV2ZWwtMiBhbmQgbGV2ZWwtMyB0YWJsZXMgYmVmb3JlIGZyZWVpbmcgdGhlIGFjdHVhbCBsZXZlbC0xIHRhYmxlCiAgKiBhbmQgc2V0dGluZyB0aGUgc3RydWN0IHBvaW50ZXIgdG8gTlVMTC4KLSAqCi0gKiBOb3RlIHdlIGRvbid0IG5lZWQgbG9ja2luZyBoZXJlIGFzIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgVk0gaXMKLSAqIGRlc3Ryb3llZCwgd2hpY2ggY2FuIG9ubHkgYmUgZG9uZSBvbmNlLgogICovCiB2b2lkIGt2bV9mcmVlX3N0YWdlMl9wZ2Qoc3RydWN0IGt2bSAqa3ZtKQogewotCWlmIChrdm0tPmFyY2gucGdkID09IE5VTEwpCi0JCXJldHVybjsKKwl2b2lkICpwZ2QgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKLQl1bm1hcF9zdGFnZTJfcmFuZ2Uoa3ZtLCAwLCBLVk1fUEhZU19TSVpFKTsKKwlpZiAoa3ZtLT5hcmNoLnBnZCkgeworCQl1bm1hcF9zdGFnZTJfcmFuZ2Uoa3ZtLCAwLCBLVk1fUEhZU19TSVpFKTsKKwkJcGdkID0gUkVBRF9PTkNFKGt2bS0+YXJjaC5wZ2QpOworCQlrdm0tPmFyY2gucGdkID0gTlVMTDsKKwl9CiAJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCiAJLyogRnJlZSB0aGUgSFcgcGdkLCBvbmUgcGFnZSBhdCBhIHRpbWUgKi8KLQlmcmVlX3BhZ2VzX2V4YWN0KGt2bS0+YXJjaC5wZ2QsIFMyX1BHRF9TSVpFKTsKLQlrdm0tPmFyY2gucGdkID0gTlVMTDsKKwlpZiAocGdkKQorCQlmcmVlX3BhZ2VzX2V4YWN0KHBnZCwgUzJfUEdEX1NJWkUpOwogfQogCiBzdGF0aWMgcHVkX3QgKnN0YWdlMl9nZXRfcHVkKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hlICpjYWNoZSwKQEAgLTE2NjQsMTIgKzE2NjQsMTYgQEAKIAogaW50IGt2bV9hZ2VfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CisJaWYgKCFrdm0tPmFyY2gucGdkKQorCQlyZXR1cm4gMDsKIAl0cmFjZV9rdm1fYWdlX2h2YShzdGFydCwgZW5kKTsKIAlyZXR1cm4gaGFuZGxlX2h2YV90b19ncGEoa3ZtLCBzdGFydCwgZW5kLCBrdm1fYWdlX2h2YV9oYW5kbGVyLCBOVUxMKTsKIH0KIAogaW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSkKIHsKKwlpZiAoIWt2bS0+YXJjaC5wZ2QpCisJCXJldHVybiAwOwogCXRyYWNlX2t2bV90ZXN0X2FnZV9odmEoaHZhKTsKIAlyZXR1cm4gaGFuZGxlX2h2YV90b19ncGEoa3ZtLCBodmEsIGh2YSwga3ZtX3Rlc3RfYWdlX2h2YV9oYW5kbGVyLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKaW5kZXggMTA1MmIyOS4uYjVjMTcxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKQEAgLTc5MCwxNCArNzkwLDE0IEBACiAJaW50IHJldCA9IDA7CiAJY2hhciBuYW1lW01PRF9DTEtfTUFYX05BTUVfTEVOXTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kY2tbXSA9ICJfbW9kX2NrIjsKIAotCS8qICs3IG1hZ2ljIGNvbWVzIGZyb20gJ19tb2RfY2snIHN1ZmZpeCAqLwotCWlmIChzdHJsZW4ob2gtPm5hbWUpICsgNyA+IE1PRF9DTEtfTUFYX05BTUVfTEVOKQorCWlmIChzdHJsZW4ob2gtPm5hbWUpID49IE1PRF9DTEtfTUFYX05BTUVfTEVOIC0gc3RybGVuKG1vZGNrKSkKIAkJcHJfd2FybigiJXM6IHdhcm5pbmc6IGNyb3BwaW5nIG5hbWUgZm9yICVzXG4iLCBfX2Z1bmNfXywKIAkJCW9oLT5uYW1lKTsKIAotCXN0cm5jcHkobmFtZSwgb2gtPm5hbWUsIE1PRF9DTEtfTUFYX05BTUVfTEVOIC0gNyk7Ci0Jc3RyY2F0KG5hbWUsICJfbW9kX2NrIik7CisJc3RybGNweShuYW1lLCBvaC0+bmFtZSwgTU9EX0NMS19NQVhfTkFNRV9MRU4gLSBzdHJsZW4obW9kY2spKTsKKwlzdHJsY2F0KG5hbWUsIG1vZGNrLCBNT0RfQ0xLX01BWF9OQU1FX0xFTik7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsIG5hbWUpOwogCWlmICghSVNfRVJSKGNsaykpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2ZhdWx0LmMgYi9hcmNoL2FybS9tbS9mYXVsdC5jCmluZGV4IGFlYzc0YmYuLmE5ZWY1NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9hcm0vbW0vZmF1bHQuYwpAQCAtMzE0LDggKzMxNCwxMSBAQAogCSAqIHNpZ25hbCBmaXJzdC4gV2UgZG8gbm90IG5lZWQgdG8gcmVsZWFzZSB0aGUgbW1hcF9zZW0gYmVjYXVzZQogCSAqIGl0IHdvdWxkIGFscmVhZHkgYmUgcmVsZWFzZWQgaW4gX19sb2NrX3BhZ2Vfb3JfcmV0cnkgaW4KIAkgKiBtbS9maWxlbWFwLmMuICovCi0JaWYgKChmYXVsdCAmIFZNX0ZBVUxUX1JFVFJZKSAmJiBmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwlpZiAoKGZhdWx0ICYgVk1fRkFVTFRfUkVUUlkpICYmIGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQkJZ290byBub19jb250ZXh0OwogCQlyZXR1cm4gMDsKKwl9CiAKIAkvKgogCSAqIE1ham9yL21pbm9yIHBhZ2UgZmF1bHQgYWNjb3VudGluZyBpcyBvbmx5IGRvbmUgb24gdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wYWdlYXR0ci5jIGIvYXJjaC9hcm0vbW0vcGFnZWF0dHIuYwppbmRleCAwYjI2YTg0Li40N2IxZjQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL2FybS9tbS9wYWdlYXR0ci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC05NywzICs5NywxOSBAQAogCQkJCQlfX3BncHJvdCgwKSwKIAkJCQkJX19wZ3Byb3QoTF9QVEVfWE4pKTsKIH0KKworI2lmZGVmIENPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQwordm9pZCBfX2tlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybjsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmIChlbmFibGUpCisJCXNldF9tZW1vcnlfcncoYWRkciwgbnVtcGFnZXMpOworCWVsc2UKKwkJc2V0X21lbW9yeV9ybyhhZGRyLCBudW1wYWdlcyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMgYi9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zCmluZGV4IGY5NmZiYTYuLmUxNDU0ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnLnBsYXRmb3JtcwpAQCAtMTM5LDYgKzEzOSwxNSBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTRE02NzAgY2hpcHNldC4gSWYgeW91IGRvIG5vdAogCSAgd2lzaCB0byBidWlsZCBhIGtlcm5lbCB0aGF0IHJ1bnMgb24gdGhpcyBjaGlwc2V0LCBzYXkgJ04nIGhlcmUuCiAKK2NvbmZpZyBBUkNIX01TTTg5NTMKKwlib29sICJFbmFibGUgU3VwcG9ydCBmb3IgUXVhbGNvbW0gVGVjaG5vbG9naWVzIEluYy4gTVNNODk1MyIKKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTQorCXNlbGVjdCBDT01NT05fQ0xLX1FDT00KKwlzZWxlY3QgUUNPTV9HRFNDCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNU004OTUzIGNoaXBzZXQuIElmIHlvdSBkbyBub3QKKwkgIHdpc2ggdG8gYnVpbGQgYSBrZXJuZWwgdGhhdCBydW5zIG9uIHRoaXMgY2hpcHNldCwgc2F5ICdOJyBoZXJlLgorCiBjb25maWcgQVJDSF9ST0NLQ0hJUAogCWJvb2wgIlJvY2tjaGlwIFBsYXRmb3JtcyIKIAlzZWxlY3QgQVJDSF9IQVNfUkVTRVRfQ09OVFJPTExFUgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9tYXJ2ZWxsL2FybWFkYS0zN3h4LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLTM3eHguZHRzaQppbmRleCA0OWE1ZDhjLi42OGU2Zjg4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLTM3eHguZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLTM3eHguZHRzaQpAQCAtMTcwLDYgKzE3MCw3IEBACiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJcmVnID0gPDB4MWQwMDAwMCAweDEwMDAwPiwgLyogR0lDRCAqLwogCQkJCSAgICAgIDwweDFkNDAwMDAgMHg0MDAwMD47IC8qIEdJQ1IgKi8KKwkJCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgOSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCX07CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9NYWtlZmlsZSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9NYWtlZmlsZQppbmRleCBiMzdjMzc3Li5hZWZkYjUyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL01ha2VmaWxlCkBAIC04LDI3ICs4LDU0IEBACiAJCXNkbTg0NS1tdHAtb3ZlcmxheS5kdGJvIFwKIAkJc2RtODQ1LXFyZC1vdmVybGF5LmR0Ym8gXAogCQlzZG04NDUtcXZyLW92ZXJsYXkuZHRibyBcCi0JCXNkbTg0NS12Mi1jZHAtb3ZlcmxheS5kdGJvIFwKLQkJc2RtODQ1LXYyLW10cC1vdmVybGF5LmR0Ym8gXAotCQlzZG04NDUtdjItcXJkLW92ZXJsYXkuZHRibyBcCiAJCXNkbTg0NS00ay1wYW5lbC1tdHAtb3ZlcmxheS5kdGJvIFwKIAkJc2RtODQ1LTRrLXBhbmVsLWNkcC1vdmVybGF5LmR0Ym8gXAogCQlzZG04NDUtNGstcGFuZWwtcXJkLW92ZXJsYXkuZHRibyBcCi0JCXNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAtb3ZlcmxheS5kdGJvIFwKLQkJc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC1vdmVybGF5LmR0Ym8KKwkJc2RtODQ1LXYyLWNkcC1vdmVybGF5LmR0Ym8gXAorCQlzZG04NDUtdjItbXRwLW92ZXJsYXkuZHRibyBcCisJCXNkbTg0NS12Mi1xcmQtb3ZlcmxheS5kdGJvIFwKKwkJc2RtODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZG04NDUtdjItNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTg0NS12Mi00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvIFwKKwkJc2RhODQ1LWNkcC1vdmVybGF5LmR0Ym8gXAorCQlzZGE4NDUtbXRwLW92ZXJsYXkuZHRibyBcCisJCXNkYTg0NS1xcmQtb3ZlcmxheS5kdGJvIFwKKwkJc2RhODQ1LTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZGE4NDUtNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkYTg0NS00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvIFwKKwkJc2RhODQ1LXYyLWNkcC1vdmVybGF5LmR0Ym8gXAorCQlzZGE4NDUtdjItbXRwLW92ZXJsYXkuZHRibyBcCisJCXNkYTg0NS12Mi1xcmQtb3ZlcmxheS5kdGJvIFwKKwkJc2RhODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZGE4NDUtdjItNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkYTg0NS12Mi00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvCiAKIHNkbTg0NS1jZHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LmR0Ygogc2RtODQ1LW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUuZHRiCiBzZG04NDUtcXJkLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS5kdGIKK3NkbTg0NS1xdnItb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LXYyLmR0Ygogc2RtODQ1LXF2ci1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUuZHRiCi1zZG04NDUtdjItY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS12Mi5kdGIKLXNkbTg0NS12Mi1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LXYyLmR0Ygotc2RtODQ1LXYyLXFyZC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUtdjIuZHRiCiBzZG04NDUtNGstcGFuZWwtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS5kdGIKIHNkbTg0NS00ay1wYW5lbC1jZHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LmR0Ygogc2RtODQ1LTRrLXBhbmVsLXFyZC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUuZHRiCi1zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC5kdGIKLXNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LWludGVycG9zZXItc2RtNjcwLmR0Ygorc2RtODQ1LXYyLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUtdjIuZHRiCitzZG04NDUtdjItbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS12Mi5kdGIKK3NkbTg0NS12Mi1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LXYyLmR0Ygorc2RtODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG04NDUtdjIuZHRiCitzZG04NDUtdjItNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTg0NS12Mi5kdGIKK3NkbTg0NS12Mi00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtODQ1LXYyLmR0Ygorc2RhODQ1LWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE4NDUuZHRiCitzZGE4NDUtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkYTg0NS5kdGIKK3NkYTg0NS1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RhODQ1LmR0Ygorc2RhODQ1LTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE4NDUuZHRiCitzZGE4NDUtNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkYTg0NS5kdGIKK3NkYTg0NS00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RhODQ1LmR0Ygorc2RhODQ1LXYyLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE4NDUtdjIuZHRiCitzZGE4NDUtdjItbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkYTg0NS12Mi5kdGIKK3NkYTg0NS12Mi1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RhODQ1LXYyLmR0Ygorc2RhODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE4NDUtdjIuZHRiCitzZGE4NDUtdjItNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkYTg0NS12Mi5kdGIKK3NkYTg0NS12Mi00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RhODQ1LXYyLmR0YgogZWxzZQogZHRiLSQoQ09ORklHX0FSQ0hfU0RNODQ1KSArPSBzZG04NDUtc2ltLmR0YiBcCiAJc2RtODQ1LXJ1bWkuZHRiIFwKQEAgLTUwLDE0ICs3Nyw4NSBAQAogaWZlcSAoJChDT05GSUdfQlVJTERfQVJNNjRfRFRfT1ZFUkxBWSkseSkKIAlkdGJvLSQoQ09ORklHX0FSQ0hfU0RNNjcwKSArPSBcCiAJCXNkbTY3MC1jZHAtb3ZlcmxheS5kdGJvIFwKLQkJc2RtNjcwLW10cC1vdmVybGF5LmR0Ym8KKwkJc2RtNjcwLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtcnVtaS1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtcG02NjBhLWNkcC1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtcG02NjBhLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtZXh0ZXJuYWwtY29kZWMtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTY3MC1leHRlcm5hbC1jb2RlYy1tdHAtb3ZlcmxheS5kdGJvIFwKKwkJc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAtb3ZlcmxheS5kdGJvIFwKKwkJc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAtb3ZlcmxheS5kdGJvIFwKKwkJc2RtNjcwLXVzYmMtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTY3MC11c2JjLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtdXNiYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTY3MC11c2JjLXBtNjYwYS1tdHAtb3ZlcmxheS5kdGJvIFwKKwkJc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0Ym8gXAorCQlzZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAtb3ZlcmxheS5kdGJvIFwKKwkJc2RhNjcwLWNkcC1vdmVybGF5LmR0Ym8gXAorCQlzZGE2NzAtbXRwLW92ZXJsYXkuZHRibyBcCisJCXNkYTY3MC1wbTY2MGEtY2RwLW92ZXJsYXkuZHRibyBcCisJCXNkYTY3MC1wbTY2MGEtbXRwLW92ZXJsYXkuZHRibyBcCisJCXFjczYwNS1jZHAtb3ZlcmxheS5kdGJvIFwKKwkJcWNzNjA1LW10cC1vdmVybGF5LmR0Ym8gXAorCQlxY3M2MDUtZXh0ZXJuYWwtY29kZWMtbXRwLW92ZXJsYXkuZHRibwogCiBzZG02NzAtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKIHNkbTY3MC1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLXJ1bWktb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLXBtNjYwYS1jZHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLXBtNjYwYS1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLWV4dGVybmFsLWNvZGVjLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG02NzAuZHRiCitzZG02NzAtZXh0ZXJuYWwtY29kZWMtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKK3NkbTY3MC1leHRlcm5hbC1jb2RlYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKK3NkbTY3MC1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKK3NkbTY3MC11c2JjLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG02NzAuZHRiCitzZG02NzAtdXNiYy1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLXVzYmMtcG02NjBhLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG02NzAuZHRiCitzZG02NzAtdXNiYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKK3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG02NzAuZHRiCitzZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RtNjcwLmR0Ygorc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZG02NzAuZHRiCitzZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHNkbTY3MC5kdGIKK3NkYTY3MC1jZHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gc2RhNjcwLmR0Ygorc2RhNjcwLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE2NzAuZHRiCitzZGE2NzAtcG02NjBhLWNkcC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE2NzAuZHRiCitzZGE2NzAtcG02NjBhLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBzZGE2NzAuZHRiCitxY3M2MDUtY2RwLW92ZXJsYXkuZHRiby1iYXNlIDo9IHFjczYwNS5kdGIKK3FjczYwNS1tdHAtb3ZlcmxheS5kdGJvLWJhc2UgOj0gcWNzNjA1LmR0YgorcWNzNjA1LWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0Ym8tYmFzZSA6PSBxY3M2MDUuZHRiCisKIGVsc2UKIGR0Yi0kKENPTkZJR19BUkNIX1NETTY3MCkgKz0gc2RtNjcwLXJ1bWkuZHRiIFwKIAlzZG02NzAtbXRwLmR0YiBcCi0Jc2RtNjcwLWNkcC5kdGIKKwlzZG02NzAtY2RwLmR0YiBcCisJc2RtNjcwLXBtNjYwYS1tdHAuZHRiIFwKKwlzZG02NzAtcG02NjBhLWNkcC5kdGIgXAorCXNkbTY3MC1leHRlcm5hbC1jb2RlYy1jZHAuZHRiIFwKKwlzZG02NzAtZXh0ZXJuYWwtY29kZWMtbXRwLmR0YiBcCisJc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAuZHRiIFwKKwlzZG02NzAtZXh0ZXJuYWwtY29kZWMtcG02NjBhLW10cC5kdGIgXAorCXNkbTY3MC11c2JjLWNkcC5kdGIgXAorCXNkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC5kdGIgXAorCXNkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLW10cC5kdGIgXAorCXNkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAuZHRiIFwKKwlzZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLmR0YiBcCisJc2RtNjcwLXVzYmMtbXRwLmR0YiBcCisJc2RtNjcwLXVzYmMtcG02NjBhLWNkcC5kdGIgXAorCXNkbTY3MC11c2JjLXBtNjYwYS1tdHAuZHRiIFwKKwlzZGE2NzAtbXRwLmR0YiBcCisJc2RhNjcwLWNkcC5kdGIgXAorCXNkYTY3MC1wbTY2MGEtbXRwLmR0YiBcCisJc2RhNjcwLXBtNjYwYS1jZHAuZHRiIFwKKwlxY3M2MDUtbXRwLmR0YiBcCisJcWNzNjA1LWNkcC5kdGIgXAorCXFjczYwNS1leHRlcm5hbC1jb2RlYy1tdHAuZHRiCitlbmRpZgorCitpZmVxICgkKENPTkZJR19CVUlMRF9BUk02NF9EVF9PVkVSTEFZKSx5KQorZWxzZQorZHRiLSQoQ09ORklHX0FSQ0hfTVNNODk1MykgKz0gbXNtODk1My1tdHAuZHRiCiBlbmRpZgogCiBhbHdheXMJCTo9ICQoZHRiLXkpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHNjLXdxeGdhLWNtZC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWRzYy13cXhnYS1jbWQuZHRzaQppbmRleCAwY2ExMTc1Li4wZTYwYTBjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHNjLXdxeGdhLWNtZC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9kc2ktcGFuZWwtbnQzNTU5Ny10cnVseS1kc2Mtd3F4Z2EtY21kLmR0c2kKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWQgODEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWUgMDAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWYgMDEKLQkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMzEKKwkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMTEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNjggMDMKIAkJCQkJLyogQ01EMl9QNCAqLwogCQkJCQkxNSAwMSAwMCAwMCAwMCAwMCAwMiBmZiAyNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWRzYy13cXhnYS12aWRlby5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWRzYy13cXhnYS12aWRlby5kdHNpCmluZGV4IGFjOGE5NTYuLjJjNTQ1MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9kc2ktcGFuZWwtbnQzNTU5Ny10cnVseS1kc2Mtd3F4Z2EtdmlkZW8uZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHNjLXdxeGdhLXZpZGVvLmR0c2kKQEAgLTc0LDcgKzc0LDcgQEAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWQgODEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWUgMDAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNWYgMDEKLQkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMzEKKwkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMTEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNjggMDMKIAkJCQkJLyogQ01EMl9QNCAqLwogCQkJCQkxNSAwMSAwMCAwMCAwMCAwMCAwMiBmZiAyNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWR1YWxtaXBpLXdxeGdhLWNtZC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWR1YWxtaXBpLXdxeGdhLWNtZC5kdHNpCmluZGV4IDg3Y2FiYWUuLjViNWZiYjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9kc2ktcGFuZWwtbnQzNTU5Ny10cnVseS1kdWFsbWlwaS13cXhnYS1jbWQuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHVhbG1pcGktd3F4Z2EtY21kLmR0c2kKQEAgLTg5LDcgKzg5LDcgQEAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUQgODEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUUgMDAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUYgMDEKLQkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMzEKKwkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMTEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNjggMDMKIAkJCQkJLyogQ01EMl9QNCAqLwogCQkJCQkxNSAwMSAwMCAwMCAwMCAwMCAwMiBmZiAyNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2RzaS1wYW5lbC1udDM1NTk3LXRydWx5LWR1YWxtaXBpLXdxeGdhLXZpZGVvLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHVhbG1pcGktd3F4Z2EtdmlkZW8uZHRzaQppbmRleCAwZDBlN2Y3Li45NWUwZTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHVhbG1pcGktd3F4Z2EtdmlkZW8uZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHVhbG1pcGktd3F4Z2EtdmlkZW8uZHRzaQpAQCAtMjksNyArMjksNiBAQAogCQlxY29tLG1kc3MtZHNpLWxhbmUtMS1zdGF0ZTsKIAkJcWNvbSxtZHNzLWRzaS1sYW5lLTItc3RhdGU7CiAJCXFjb20sbWRzcy1kc2ktbGFuZS0zLXN0YXRlOwotCQlxY29tLGNtZC1zeW5jLXdhaXQtYnJvYWRjYXN0OwogCQlxY29tLG1kc3MtZHNpLWRtYS10cmlnZ2VyID0gInRyaWdnZXJfc3ciOwogCQlxY29tLG1kc3MtZHNpLW1kcC10cmlnZ2VyID0gIm5vbmUiOwogCQlxY29tLG1kc3MtZHNpLXJlc2V0LXNlcXVlbmNlID0gPDEgMjA+LCA8MCAyMD4sIDwxIDUwPjsKQEAgLTc2LDcgKzc1LDcgQEAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUQgODEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUUgMDAKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNUYgMDEKLQkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMzEKKwkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNzIgMTEKIAkJCQkJMTUgMDEgMDAgMDAgMDAgMDAgMDIgNjggMDMKIAkJCQkJLyogQ01EMl9QNCAqLwogCQkJCQkxNSAwMSAwMCAwMCAwMCAwMCAwMiBGRiAyNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2ZnLWdlbjMtYmF0dGVyeWRhdGEtYXNjZW50LTM0NTBtYWguZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9mZy1nZW4zLWJhdHRlcnlkYXRhLWFzY2VudC0zNDUwbWFoLmR0c2kKaW5kZXggYzdjZWNiYy4uNzcwNWQwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL2ZnLWdlbjMtYmF0dGVyeWRhdGEtYXNjZW50LTM0NTBtYWguZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vZmctZ2VuMy1iYXR0ZXJ5ZGF0YS1hc2NlbnQtMzQ1MG1haC5kdHNpCkBAIC0xMSw3MSArMTEsNzEgQEAKICAqLwogCiBxY29tLGFzY2VudF8zNDUwbWFoIHsKLQkvKiBBc2NlbnRfd2l0aF9jb25uZWN0b3JfMzQ1MG1BaF9hdmVyYWdlZF9NYXN0ZXJTbGF2ZV9KYW42dGgyMDE3ICovCisJLyogQXNjZW50X3dDb25uX0FnaW5nXzM0NTBtQWhfYXZlcmFnZWRfTWFzdGVyU2xhdmVfSnVsMTF0aDIwMTcgKi8KIAlxY29tLG1heC12b2x0YWdlLXV2ID0gPDQzNTAwMDA+OwogCXFjb20sZmctY2MtY3YtdGhyZXNob2xkLW12ID0gPDQzNDA+OwogCXFjb20sZmFzdGNoZy1jdXJyZW50LW1hID0gPDM0NTA+OwogCXFjb20sYmF0dC1pZC1rb2htID0gPDYwPjsKIAlxY29tLGJhdHRlcnktYmV0YSA9IDwzNDM1PjsKLQlxY29tLGJhdHRlcnktdHlwZSA9ICJhc2NlbnRfMzQ1MG1haF9hdmVyYWdlZF9tYXN0ZXJzbGF2ZV9qYW42dGgyMDE3IjsKLQlxY29tLGNoZWNrc3VtID0gPDB4OTZBQz47Ci0JcWNvbSxndWktdmVyc2lvbiA9ICJQTUk4OTk4R1VJIC0gMi4wLjAuNTQiOworCXFjb20sYmF0dGVyeS10eXBlID0gImFzY2VudF8zNDUwbWFoX2F2ZXJhZ2VkX21hc3RlcnNsYXZlX2p1bDExdGgyMDE3IjsKKwlxY29tLGNoZWNrc3VtID0gPDB4N0MzMz47CisJcWNvbSxndWktdmVyc2lvbiA9ICJQTUk4OTk4R1VJIC0gMi4wLjAuNTgiOwogCXFjb20sZmctcHJvZmlsZS1kYXRhID0gWwotCQkgOUMgMUYgODUgMDUKLQkJIDgyIDBBIDczIEZDCi0JCSAyQiAxRCA3MiBFQQotCQkgRUUgMDMgNjYgMEMKLQkJIEM4IDE3IEY0IDIyCi0JCSBFMCA0NSAxRiA1MgotCQkgNUMgMDAgMDAgMDAKLQkJIDEwIDAwIDAwIDAwCi0JCSAwMCAwMCA0QSBDNAotCQkgQzcgQkMgNDggQzIKLQkJIDBGIDAwIDA4IDAwCi0JCSBFMSBEQSA1RCBFRAotCQkgOEQgRkQgQjIgRjMKLQkJIDk2IEUyIEE3IDEyCi0JCSA3RSBGNCAwRSAzQgotCQkgMjQgMDYgMDkgMjAKLQkJIDI3IDAwIDE0IDAwCi0JCSA4MyAxRiBFRSAwNQotCQkgMUYgMEEgNDUgRkQKLQkJIDZCIDFEIDUzIEU1Ci0JCSBFQyAwQiAzMSAxNAotCQkgNDQgMTggNDkgMjMKLQkJIDE4IDQ1IEE2IDUzCi0JCSA1NSAwMCAwMCAwMAotCQkgMEUgMDAgMDAgMDAKLQkJIDAwIDAwIDYxIENDCi0JCSBCNyBDMyAwRiBCQwotCQkgMEYgMDAgMDAgMDAKLQkJIDkyIDAwIDVEIEVECi0JCSBFMyAwNiBFMCAwMAotCQkgNzUgRkQgOUMgMDMKLQkJIDQ3IERCIEIzIDIyCi0JCSBDQiAzMyBDQyBGRgotCQkgMDcgMTAgMDAgMDAKLQkJIDk5IDBEIDk5IDQ1Ci0JCSAwRiAwMCA0MCAwMAotCQkgQUIgMDEgMEEgRkEKLQkJIEZGIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCi0JCSAwMCAwMCAwMCAwMAotCQkgMDAgMDAgMDAgMDAKLQkJIDAwIDAwIDAwIDAwCisJCThGIDFGIDk0IDA1CisJCTczIDBBIDRBIDA2CisJCTI3IDFEIDIxIEVBCisJCTE2IDBBIDNCIDBDCisJCTA3IDE4IDk3IDIyCisJCUE1IDNDIEVDIDRBCisJCTVDIDAwIDAwIDAwCisJCTEwIDAwIDAwIDAwCisJCTAwIDAwIDkyIEJDCisJCUNEIEJEIDAyIEI0CisJCTExIDAwIDA4IDAwCisJCTY5IERBIEFEIDA3CisJCTRCIEZEIDE5IEZBCisJCTFEIDBDIEIwIDBDCisJCUVCIEYzIDc4IDNCCisJCTI0IDA2IDA5IDIwCisJCTI3IDAwIDE0IDAwCisJCTdFIDFGIEYyIDA1CisJCTE5IDBBIDU1IEZECisJCTZDIDFEIEM2IEVECisJCTFBIDEyIEZGIDFECisJCTZGIDE4IEVCIDIyCisJCUI5IDQ1IDZGIDUyCisJCTU1IDAwIDAwIDAwCisJCTBFIDAwIDAwIDAwCisJCTAwIDAwIEExIEQ1CisJCTM0IEJBIEEwIENBCisJCTBGIDAwIDAwIDAwCisJCTkzIDAwIEFEIDA3CisJCThEIEZEIEY2IDAwCisJCUJBIDBEIDVDIDA0CisJCUIzIEZDIEY0IDFCCisJCUMzIDMzIENDIEZGCisJCTA3IDEwIDAwIDAwCisJCUE0IDBEIDk5IDQ1CisJCTBGIDAwIDQwIDAwCisJCUE0IDAxIDBBIEZBCisJCUZGIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCisJCTAwIDAwIDAwIDAwCiAJXTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtLWFybS1zbW11LXNkbTg0NS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbS1hcm0tc21tdS1zZG04NDUuZHRzaQppbmRleCA1ZGUwZTQ0Li5hNDhmYmEwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtLWFybS1zbW11LXNkbTg0NS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc20tYXJtLXNtbXUtc2RtODQ1LmR0c2kKQEAgLTIxLDYgKzIxLDcgQEAKIAkJI2lvbW11LWNlbGxzID0gPDE+OwogCQlxY29tLGR5bmFtaWM7CiAJCXFjb20sdXNlLTMtbHZsLXRhYmxlczsKKwkJcWNvbSxkaXNhYmxlLWF0b3M7CiAJCSNnbG9iYWwtaW50ZXJydXB0cyA9IDwyPjsKIAkJcWNvbSxyZWd1bGF0b3ItbmFtZXMgPSAidmRkIjsKIAkJdmRkLXN1cHBseSA9IDwmZ3B1X2N4X2dkc2M+OwpAQCAtNjIsNiArNjMsNyBAQAogCQlxY29tLHNraXAtaW5pdDsKIAkJcWNvbSx1c2UtMy1sdmwtdGFibGVzOwogCQlxY29tLG5vLWFzaWQtcmV0ZW50aW9uOworCQlxY29tLGRpc2FibGUtYXRvczsKIAkJI2dsb2JhbC1pbnRlcnJ1cHRzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CkBAIC0zNTMsNCArMzU1LDcgQEAKIAkJCTwweDE0MDAgMHgzZmYgMHgzPiwKIAkJCTwweDE4MDAgMHgzZmYgMHgzPiwKIAkJCTwweDFjMDAgMHgzZmYgMHgzPjsKKworCXFjb20sbW11NTAwLWVycmF0YS0xID0JPDB4ODAwIDB4M2ZmPiwKKwkJCQk8MHhjMDAgMHgzZmY+OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc20tYXVkaW8tbHBhc3MuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc20tYXVkaW8tbHBhc3MuZHRzaQppbmRleCAwZDJmOWU4Li4yZmQxYmM0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtLWF1ZGlvLWxwYXNzLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbS1hdWRpby1scGFzcy5kdHNpCkBAIC0zNTMsNiArMzUzLDIwIEBACiAJCXFjb20sbXNtLWNwdWRhaS1hZmUtY2xrLXZlciA9IDwyPjsKIAl9OwogCisJZGFpX3F1aW5fYXV4cGNtOiBxY29tLG1zbS1xdWluLWF1eHBjbSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tYXV4cGNtLWRldiI7CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tbW9kZSA9IDwwPiwgPDA+OworCQlxY29tLG1zbS1jcHVkYWktYXV4cGNtLXN5bmMgPSA8MT4sIDwxPjsKKwkJcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1mcmFtZSA9IDw1PiwgPDQ+OworCQlxY29tLG1zbS1jcHVkYWktYXV4cGNtLXF1YW50ID0gPDI+LCA8Mj47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tbnVtLXNsb3RzID0gPDE+LCA8MT47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tc2xvdC1tYXBwaW5nID0gPDE+LCA8MT47CisJCXFjb20sbXNtLWNwdWRhaS1hdXhwY20tZGF0YSA9IDwwPiwgPDA+OworCQlxY29tLG1zbS1jcHVkYWktYXV4cGNtLXBjbS1jbGstcmF0ZSA9IDwyMDQ4MDAwPiwgPDIwNDgwMDA+OworCQlxY29tLG1zbS1hdXhwY20taW50ZXJmYWNlID0gInF1aW5hcnkiOworCQlxY29tLG1zbS1jcHVkYWktYWZlLWNsay12ZXIgPSA8Mj47CisJfTsKKwogCWhkbWlfZGJhOiBxY29tLG1zbS1oZG1pLWRiYS1jb2RlYy1yeCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taGRtaS1kYmEtY29kZWMtcngiOwogCQlxY29tLGRiYS1icmlkZ2UtY2hpcCA9ICJhZHY3NTMzIjsKQEAgLTUyMiw0ICs1MzYsNDIgQEAKIAkJCXFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1hbGlnbiA9IDwwPjsKIAkJfTsKIAl9OworCisJcWNvbSxtc20tZGFpLXRkbS1xdWluLXJ4IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktdGRtIjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1pZCA9IDwzNzE4ND47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtbnVtLXBvcnRzID0gPDE+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWdyb3VwLXBvcnQtaWQgPSA8MzY5Mjg+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWNsay1yYXRlID0gPDE1MzYwMDA+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWNsay1pbnRlcm5hbCA9IDwxPjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLW1vZGUgPSA8MT47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tc3luYy1zcmMgPSA8MT47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1vdXQgPSA8MD47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0taW52ZXJ0LXN5bmMgPSA8MT47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tZGF0YS1kZWxheSA9IDwxPjsKKwkJZGFpX3F1aW5fdGRtX3J4XzA6IHFjb20sbXNtLWRhaS1xNi10ZG0tcXVpbi1yeC0wIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXE2LXRkbSI7CisJCQlxY29tLG1zbS1jcHVkYWktdGRtLWRldi1pZCA9IDwzNjkyOD47CisJCQlxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtYWxpZ24gPSA8MD47CisJCX07CisJfTsKKworCXFjb20sbXNtLWRhaS10ZG0tcXVpbi10eCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXRkbSI7CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtaWQgPSA8MzcxODU+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWdyb3VwLW51bS1wb3J0cyA9IDwxPjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1wb3J0LWlkID0gPDM2OTI5PjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstcmF0ZSA9IDwxNTM2MDAwPjsKKwkJcWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstaW50ZXJuYWwgPSA8MT47CisJCXFjb20sbXNtLWNwdWRhaS10ZG0tc3luYy1tb2RlID0gPDE+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtc3JjID0gPDE+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtb3V0ID0gPDA+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jID0gPDE+OworCQlxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtZGVsYXkgPSA8MT47CisJCWRhaV9xdWluX3RkbV90eF8wOiBxY29tLG1zbS1kYWktcTYtdGRtLXF1aW4tdHgtMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi10ZG0iOworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1kZXYtaWQgPSA8MzY5Mjk+OworCQkJcWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLWFsaWduID0gPDA+OworCQl9OworCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbTg5NTMtY3B1LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My1jcHUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc4ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbTg5NTMtY3B1LmR0c2kKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvIHsKKwlwc2NpIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHNjaS0xLjAiOworCQltZXRob2QgPSAic21jIjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY3B1LW1hcCB7CisJCQljbHVzdGVyMCB7CisJCQkJY29yZTAgeworCQkJCQljcHUgPSA8JkNQVTA+OworCQkJCX07CisJCQkJY29yZTEgeworCQkJCQljcHUgPSA8JkNQVTE+OworCQkJCX07CisJCQkJY29yZTIgeworCQkJCQljcHUgPSA8JkNQVTI+OworCQkJCX07CisJCQkJY29yZTMgeworCQkJCQljcHUgPSA8JkNQVTM+OworCQkJCX07CisJCQl9OworCisJCQljbHVzdGVyMSB7CisJCQkJY29yZTAgeworCQkJCQljcHUgPSA8JkNQVTQ+OworCQkJCX07CisJCQkJY29yZTEgeworCQkJCQljcHUgPSA8JkNQVTU+OworCQkJCX07CisJCQkJY29yZTIgeworCQkJCQljcHUgPSA8JkNQVTY+OworCQkJCX07CisJCQkJY29yZTMgeworCQkJCQljcHUgPSA8JkNQVTc+OworCQkJCX07CisJCQl9OworCQl9OworCisJCUNQVTA6IGNwdUAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTUzIiwiYXJtLGFybXY4IjsKKwkJCXJlZyA9IDwweDA+OworCQkJZW5hYmxlLW1ldGhvZCA9ICJwc2NpIjsKKwkJCWVmZmljaWVuY3kgPSA8MTAyND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwyXzA6IGwyLWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgY2FjaGUtbGV2ZWwgPSA8Mj47CisJCQkgICAgICAvKiBBNTMgTDIgZHVtcCBub3Qgc3VwcG9ydGVkICovCisJCQkgICAgICBxY29tLGR1bXAtc2l6ZSA9IDwweDA+OworCQkJfTsKKwkJCUwxX0lfMDogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzA6IGwxLWRjYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CisJCQl9OworCQl9OworCisJCUNQVTE6IGNwdUAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTUzIiwiYXJtLGFybXY4IjsKKwkJCWVuYWJsZS1tZXRob2QgPSAicHNjaSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCWVmZmljaWVuY3kgPSA8MTAyND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwxX0lfMTogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzE6IGwxLWRjYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CisJCQl9OworCQl9OworCisJCUNQVTI6IGNwdUAyIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTUzIiwiYXJtLGFybXY4IjsKKwkJCWVuYWJsZS1tZXRob2QgPSAicHNjaSI7CisJCQlyZWcgPSA8MHgyPjsKKwkJCWVmZmljaWVuY3kgPSA8MTAyND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwxX0lfMjogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzI6IGwxLWRjYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CisJCQl9OworCQl9OworCisJCUNQVTM6IGNwdUAzIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTUzIiwiYXJtLGFybXY4IjsKKwkJCWVuYWJsZS1tZXRob2QgPSAicHNjaSI7CisJCQlyZWcgPSA8MHgzPjsKKwkJCWVmZmljaWVuY3kgPSA8MTAyND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwxX0lfMzogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzM6IGwxLWRjYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CisJCQl9OworCQl9OworCisJCUNQVTQ6IGNwdUAxMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hNTMiLCJhcm0sYXJtdjgiOworCQkJZW5hYmxlLW1ldGhvZCA9ICJwc2NpIjsKKwkJCXJlZyA9IDwweDEwMD47CisJCQllZmZpY2llbmN5ID0gPDExMjY+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CisJCQlMMl8xOiBsMi1jYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIGNhY2hlLWxldmVsID0gPDI+OworCQkJICAgICAgLyogQTUzIEwyIGR1bXAgbm90IHN1cHBvcnRlZCAqLworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHgwPjsKKwkJCX07CisJCQlMMV9JXzEwMDogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzEwMDogbDEtZGNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg5MDAwPjsKKwkJCX07CisJCX07CisKKwkJQ1BVNTogY3B1QDEwMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE1MyIsImFybSxhcm12OCI7CisJCQllbmFibGUtbWV0aG9kID0gInBzY2kiOworCQkJcmVnID0gPDB4MTAxPjsKKwkJCWVmZmljaWVuY3kgPSA8MTEyNj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwxX0lfMTAxOiBsMS1pY2FjaGUgeworCQkJICAgICAgY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CisJCQkgICAgICBxY29tLGR1bXAtc2l6ZSA9IDwweDg4MDA+OworCQkJfTsKKwkJCUwxX0RfMTAxOiBsMS1kY2FjaGUgeworCQkJICAgICAgY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CisJCQkgICAgICBxY29tLGR1bXAtc2l6ZSA9IDwweDkwMDA+OworCQkJfTsKKwkJfTsKKworCQlDUFU2OiBjcHVAMTAyIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTUzIiwiYXJtLGFybXY4IjsKKwkJCWVuYWJsZS1tZXRob2QgPSAicHNjaSI7CisJCQlyZWcgPSA8MHgxMDI+OworCQkJZWZmaWNpZW5jeSA9IDwxMTI2PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDFfSV8xMDI6IGwxLWljYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4ODgwMD47CisJCQl9OworCQkJTDFfRF8xMDI6IGwxLWRjYWNoZSB7CisJCQkgICAgICBjb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKKwkJCSAgICAgIHFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CisJCQl9OworCQl9OworCisJCUNQVTc6IGNwdUAxMDMgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hNTMiLCJhcm0sYXJtdjgiOworCQkJZW5hYmxlLW1ldGhvZCA9ICJwc2NpIjsKKwkJCXJlZyA9IDwweDEwMz47CisJCQllZmZpY2llbmN5ID0gPDExMjY+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CisJCQlMMV9JXzEwMzogbDEtaWNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg4ODAwPjsKKwkJCX07CisJCQlMMV9EXzEwMzogbDEtZGNhY2hlIHsKKwkJCSAgICAgIGNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOworCQkJICAgICAgcWNvbSxkdW1wLXNpemUgPSA8MHg5MDAwPjsKKwkJCX07CisJCX07CisJfTsKK307CisKKyZzb2MgeworCWNwdXNzX2R1bXAgeworCQljb21wYXRpYmxlID0gInFjb20sY3B1c3MtZHVtcCI7CisJCXFjb20sbDJfZHVtcDAgeworCQkJLyogTDIgY2FjaGUgZHVtcCBmb3IgQTUzIGNsdXN0ZXIgKi8KKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMl8wPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweEMwPjsKKwkJfTsKKwkJcWNvbSxsMl9kdW1wMSB7CisJCQkvKiBMMiBjYWNoZSBkdW1wIGZvciBBNTMgY2x1c3RlciAqLworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwyXzE+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4QzE+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUwIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4NjA+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUxIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzE+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4NjE+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUyIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzI+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4NjI+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUzIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzM+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4NjM+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUxMDAgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0lfMTAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDY0PjsKKwkJfTsKKwkJcWNvbSxsMV9pX2NhY2hlMTAxIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzEwMT47CisJCQlxY29tLGR1bXAtaWQgPSA8MHg2NT47CisJCX07CisJCXFjb20sbDFfaV9jYWNoZTEwMiB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfSV8xMDI+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4NjY+OworCQl9OworCQlxY29tLGwxX2lfY2FjaGUxMDMgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0lfMTAzPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDY3PjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMCB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8wPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDgwPjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMSB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8xPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDgxPjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMiB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8yPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDgyPjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMyB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8zPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDgzPjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMTAwIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9EXzEwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHg4ND47CisJCX07CisJCXFjb20sbDFfZF9jYWNoZTEwMSB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8xMDE+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4ODU+OworCQl9OworCQlxY29tLGwxX2RfY2FjaGUxMDIgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0RfMTAyPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDg2PjsKKwkJfTsKKwkJcWNvbSxsMV9kX2NhY2hlMTAzIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9EXzEwMz47CisJCQlxY29tLGR1bXAtaWQgPSA8MHg4Nz47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My1tdHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbTg5NTMtbXRwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThiMGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbTg5NTMtbXRwLmR0cwpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisKKyNpbmNsdWRlICJtc204OTUzLmR0c2kiCisjaW5jbHVkZSAibXNtODk1My1tdHAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIE1TTTg5NTMgKyBQTUk4OTUwIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NTMtbXRwIiwgInFjb20sbXNtODk1MyIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZD0gPDggMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDEwMDE2IDB4MDEwMDExIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaCBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc204OTUzLW10cC5kdHNpCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBpbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My1tdHAuZHRzaQppbmRleCBiYzFjZDllLi4yNDNhYWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL21zbTg5NTMtbXRwLmR0c2kKQEAgLTEsNCArMSw1IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC04LDE1ICs5LDEwIEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KLSNpZm5kZWYgX19EU1BfREVCVUdfSF8KLSNkZWZpbmUgX19EU1BfREVCVUdfSF8KIAotdHlwZWRlZiBpbnQgKCpkc3Bfc3RhdGVfY2IpKGludCBzdGF0ZSk7Ci1pbnQgZHNwX2RlYnVnX3JlZ2lzdGVyKGRzcF9zdGF0ZV9jYiBwdHIpOwotCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSEVEICAgICAgICAgMHgwCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSF9EVU1QX0RPTkUgMHgxCi0KLSNlbmRpZgorJmJsc3AxX3VhcnQwIHsKKwlzdGF0dXMgPSAib2siOworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZ1YXJ0X2NvbnNvbGVfYWN0aXZlPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My1waW5jdHJsLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My1waW5jdHJsLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhZGEzOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc204OTUzLXBpbmN0cmwuZHRzaQpAQCAtMCwwICsxLDE1MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCismc29jIHsKKwl0bG1tOiBwaW5jdHJsQDEwMDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtODk1My1waW5jdHJsIjsKKwkJcmVnID0gPDB4MTAwMDAwMCAweDMwMDAwMD47CisJCWludGVycnVwdHMgPSA8MCAyMDggMD47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCisJCXBteC11YXJ0Y29uc29sZSB7CisJCQl1YXJ0X2NvbnNvbGVfYWN0aXZlOiB1YXJ0X2NvbnNvbGVfYWN0aXZlIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW80IiwgImdwaW81IjsKKwkJCQkJZnVuY3Rpb24gPSAiYmxzcF91YXJ0MiI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzQiLCAiZ3BpbzUiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1kaXNhYmxlOworCQkJCX07CisJCQl9OworCisJCQl1YXJ0X2NvbnNvbGVfc2xlZXA6IHVhcnRfY29uc29sZV9zbGVlcCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNCIsICJncGlvNSI7CisJCQkJCWZ1bmN0aW9uID0gImJsc3BfdWFydDIiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW80IiwgImdwaW81IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtcHVsbC1kb3duOworCQkJCX07CisJCQl9OworCisJCX07CisJCWNjaSB7CisJCQljY2kwX2FjdGl2ZTogY2NpMF9hY3RpdmUgeworCQkJCS8qIGNjaTAgYWN0aXZlIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJCXBpbnMgPSAiZ3BpbzI5IiwgImdwaW8zMCI7CisJCQkJCWZ1bmN0aW9uID0gImNjaV9pMmMiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8yOSIsICJncGlvMzAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQl9OworCQkJfTsKKworCQkJY2NpMF9zdXNwZW5kOiBjY2kwX3N1c3BlbmQgeworCQkJCS8qIGNjaTAgc3VzcGVuZGVkIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJCXBpbnMgPSAiZ3BpbzI5IiwgImdwaW8zMCI7CisJCQkJCWZ1bmN0aW9uID0gImNjaV9pMmMiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8yOSIsICJncGlvMzAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQl9OworCQkJfTsKKworCQkJY2NpMV9hY3RpdmU6IGNjaTFfYWN0aXZlIHsKKwkJCQkvKiBjY2kxIGFjdGl2ZSBzdGF0ZSAqLworCQkJCW11eCB7CisJCQkJCS8qIENMSywgREFUQSAqLworCQkJCQlwaW5zID0gImdwaW8zMSIsICJncGlvMzIiOworCQkJCQlmdW5jdGlvbiA9ICJjY2lfaTJjIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMzEiLCAiZ3BpbzMyIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJfTsKKwkJCX07CisKKwkJCWNjaTFfc3VzcGVuZDogY2NpMV9zdXNwZW5kIHsKKwkJCQkvKiBjY2kxIHN1c3BlbmRlZCBzdGF0ZSAqLworCQkJCW11eCB7CisJCQkJCS8qIENMSywgREFUQSAqLworCQkJCQlwaW5zID0gImdwaW8zMSIsICJncGlvMzIiOworCQkJCQlmdW5jdGlvbiA9ICJjY2lfaTJjIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMzEiLCAiZ3BpbzMyIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJLypzZW5zb3JzICovCisJCWNhbV9zZW5zb3JfbWNsazBfZGVmYXVsdDogY2FtX3NlbnNvcl9tY2xrMF9kZWZhdWx0IHsKKwkJCS8qIE1DTEswICovCisJCQltdXggeworCQkJCS8qIENMSywgREFUQSAqLworCQkJCXBpbnMgPSAiZ3BpbzI2IjsKKwkJCQlmdW5jdGlvbiA9ICJjYW1fbWNsayI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzI2IjsKKwkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX21jbGswX3NsZWVwOiBjYW1fc2Vuc29yX21jbGswX3NsZWVwIHsKKwkJCS8qIE1DTEswICovCisJCQltdXggeworCQkJCS8qIENMSywgREFUQSAqLworCQkJCXBpbnMgPSAiZ3BpbzI2IjsKKwkJCQlmdW5jdGlvbiA9ICJjYW1fbWNsayI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzI2IjsKKwkJCQliaWFzLXB1bGwtZG93bjsgLyogUFVMTCBET1dOICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCX07CisJCX07CisKKwkJY2FtX3NlbnNvcl9yZWFyX2RlZmF1bHQ6IGNhbV9zZW5zb3JfcmVhcl9kZWZhdWx0IHsKKwkJCS8qIFJFU0VULCBTVEFOREJZICovCisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzQwIiwgImdwaW8zOSI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzQwIiwiZ3BpbzM5IjsKKwkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX3JlYXJfc2xlZXA6IGNhbV9zZW5zb3JfcmVhcl9zbGVlcCB7CisJCQkvKiBSRVNFVCwgU1RBTkRCWSAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW80MCIsImdwaW8zOSI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzQwIiwiZ3BpbzM5IjsKKwkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX3JlYXJfdmFuYTogY2FtX3NlbnNvcl9yZWFyX3ZkaWcgeworCQkJLyogVkRJRyAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8xMzQiOworCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJfTsKKworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gImdwaW8xMzQiOworCQkJCWJpYXMtZGlzYWJsZTsgLyogTm8gUFVMTCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCWNhbV9zZW5zb3JfcmVhcl92YW5hX3NsZWVwOiBjYW1fc2Vuc29yX3JlYXJfdmRpZ19zbGVlcCB7CisJCQkvKiBWRElHICovCisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzEzNCI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzEzNCI7CisJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCX07CisJCX07CisKKwkJY2FtX3NlbnNvcl9tY2xrMV9kZWZhdWx0OiBjYW1fc2Vuc29yX21jbGsxX2RlZmF1bHQgeworCQkJLyogTUNMSzEgKi8KKwkJCW11eCB7CisJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJcGlucyA9ICJncGlvMjciOworCQkJCWZ1bmN0aW9uID0gImNhbV9tY2xrIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMjciOworCQkJCWJpYXMtZGlzYWJsZTsgLyogTm8gUFVMTCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCWNhbV9zZW5zb3JfbWNsazFfc2xlZXA6IGNhbV9zZW5zb3JfbWNsazFfc2xlZXAgeworCQkJLyogTUNMSzEgKi8KKwkJCW11eCB7CisJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJcGlucyA9ICJncGlvMjciOworCQkJCWZ1bmN0aW9uID0gImNhbV9tY2xrIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMjciOworCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBQVUxMIERPV04gKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX2Zyb250X2RlZmF1bHQ6IGNhbV9zZW5zb3JfZnJvbnRfZGVmYXVsdCB7CisJCQkvKiBSRVNFVCwgU1RBTkRCWSAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8xMzEiLCJncGlvMTMyIjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMTMxIiwiZ3BpbzEzMiI7CisJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCX07CisJCX07CisKKwkJY2FtX3NlbnNvcl9mcm9udF9zbGVlcDogY2FtX3NlbnNvcl9mcm9udF9zbGVlcCB7CisJCQkvKiBSRVNFVCwgU1RBTkRCWSAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8xMzEiLCJncGlvMTMyIjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMTMxIiwiZ3BpbzEzMiI7CisJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCX07CisJCX07CisKKwkJY2FtX3NlbnNvcl9tY2xrMl9kZWZhdWx0OiBjYW1fc2Vuc29yX21jbGsyX2RlZmF1bHQgeworCQkJLyogTUNMSzIgKi8KKwkJCW11eCB7CisJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJcGlucyA9ICJncGlvMjgiOworCQkJCWZ1bmN0aW9uID0gImNhbV9tY2xrIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMjgiOworCQkJCWJpYXMtZGlzYWJsZTsgLyogTm8gUFVMTCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCWNhbV9zZW5zb3JfbWNsazJfc2xlZXA6IGNhbV9zZW5zb3JfbWNsazJfc2xlZXAgeworCQkJLyogTUNMSzIgKi8KKwkJCW11eCB7CisJCQkJLyogQ0xLLCBEQVRBICovCisJCQkJcGlucyA9ICJncGlvMjgiOworCQkJCWZ1bmN0aW9uID0gImNhbV9tY2xrIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMjgiOworCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBQVUxMIERPV04gKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX2Zyb250MV9kZWZhdWx0OiBjYW1fc2Vuc29yX2Zyb250MV9kZWZhdWx0IHsKKwkJCS8qIFJFU0VULCBTVEFOREJZICovCisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzEyOSIsICJncGlvMTMwIjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMTI5IiwgImdwaW8xMzAiOworCQkJCWJpYXMtZGlzYWJsZTsgLyogTm8gUFVMTCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCWNhbV9zZW5zb3JfZnJvbnQxX3NsZWVwOiBjYW1fc2Vuc29yX2Zyb250MV9zbGVlcCB7CisJCQkvKiBSRVNFVCwgU1RBTkRCWSAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8xMjkiLCAiZ3BpbzEzMCI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzEyOSIsICJncGlvMTMwIjsKKwkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQlwbXhfYWR2NzUzM19pbnQ6IHBteF9hZHY3NTMzX2ludCB7CisJCQlhZHY3NTMzX2ludF9hY3RpdmU6IGFkdjc1MzNfaW50X2FjdGl2ZSB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTAiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKworCQkJYWR2NzUzM19pbnRfc3VzcGVuZDogYWR2NzUzM19pbnRfc3VzcGVuZCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTAiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKworCQl9OworCisJCXBteF9tZHNzOiBwbXhfbWRzcyB7CisJCQltZHNzX2RzaV9hY3RpdmU6IG1kc3NfZHNpX2FjdGl2ZSB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjEiLCAiZ3BpbzU5IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzYxIiwgImdwaW81OSI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAvKiA4IG1BICovCisJCQkJCWJpYXMtZGlzYWJsZSA9IDwwPjsgLyogbm8gcHVsbCAqLworCQkJCQlvdXRwdXQtaGlnaDsKKwkJCQl9OworCQkJfTsKKworCQkJbWRzc19kc2lfc3VzcGVuZDogbWRzc19kc2lfc3VzcGVuZCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjEiLCAiZ3BpbzU5IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzYxIiwgImdwaW81OSI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlwbXhfbWRzc190ZSB7CisJCQltZHNzX3RlX2FjdGl2ZTogbWRzc190ZV9hY3RpdmUgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzI0IjsKKwkJCQkJZnVuY3Rpb24gPSAibWRwX3ZzeW5jIjsKKwkJCQl9OworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzI0IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDggbUEgKi8KKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biovCisJCQkJfTsKKwkJCX07CisKKwkJCW1kc3NfdGVfc3VzcGVuZDogbWRzc190ZV9zdXNwZW5kIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8yNCI7CisJCQkJCWZ1bmN0aW9uID0gIm1kcF92c3luYyI7CisJCQkJfTsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8yNCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQloc3VhcnRfYWN0aXZlOiBkZWZhdWx0IHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvMTIiLCAiZ3BpbzEzIiwgImdwaW8xNCIsICJncGlvMTUiOworCQkJCWZ1bmN0aW9uID0gImJsc3BfdWFydDQiOworCQkJfTsKKworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gImdwaW8xMiIsICJncGlvMTMiLCAiZ3BpbzE0IiwgImdwaW8xNSI7CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTY+OworCQkJCWJpYXMtZGlzYWJsZTsKKwkJCX07CisJCX07CisKKwkJaHN1YXJ0X3NsZWVwOiBzbGVlcCB7CisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzEyIiwgImdwaW8xMyIsICJncGlvMTQiLCAiZ3BpbzE1IjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMTIiLCAiZ3BpbzEzIiwgImdwaW8xNCIsICJncGlvMTUiOworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCWJpYXMtZGlzYWJsZTsKKwkJCX07CisJCX07CisKKwkJLyogU0RDIHBpbiB0eXBlICovCisJCXNkYzFfY2xrX29uOiBzZGMxX2Nsa19vbiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMV9jbGsiOworCQkJCWJpYXMtZGlzYWJsZTsJCS8qIE5PIHB1bGwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47CS8qIDE2IE1BICovCisJCQl9OworCQl9OworCisJCXNkYzFfY2xrX29mZjogc2RjMV9jbGtfb2ZmIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMxX2NsayI7CisJCQkJYmlhcy1kaXNhYmxlOwkJLyogTk8gcHVsbCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OwkvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCXNkYzFfY21kX29uOiBzZGMxX2NtZF9vbiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMV9jbWQiOworCQkJCWJpYXMtcHVsbC11cDsJCS8qIHB1bGwgdXAgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxMD47CS8qIDEwIE1BICovCisJCQl9OworCQl9OworCisJCXNkYzFfY21kX29mZjogc2RjMV9jbWRfb2ZmIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMxX2NtZCI7CisJCQkJbnVtLWdycC1waW5zID0gPDE+OworCQkJCWJpYXMtcHVsbC11cDsJCS8qIHB1bGwgdXAgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsJLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQlzZGMxX2RhdGFfb246IHNkYzFfZGF0YV9vbiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMV9kYXRhIjsKKwkJCQliaWFzLXB1bGwtdXA7CQkvKiBwdWxsIHVwICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTA+OwkvKiAxMCBNQSAqLworCQkJfTsKKwkJfTsKKworCQlzZGMxX2RhdGFfb2ZmOiBzZGMxX2RhdGFfb2ZmIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMxX2RhdGEiOworCQkJCWJpYXMtcHVsbC11cDsJCS8qIHB1bGwgdXAgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsJLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQlzZGMxX3JjbGtfb246IHNkYzFfcmNsa19vbiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMV9yY2xrIjsKKwkJCQliaWFzLXB1bGwtZG93bjsgLyogcHVsbCBkb3duICovCisJCQl9OworCQl9OworCisJCXNkYzFfcmNsa19vZmY6IHNkYzFfcmNsa19vZmYgeworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gInNkYzFfcmNsayI7CisJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJfTsKKwkJfTsKKworCQlzZGMyX2Nsa19vbjogc2RjMl9jbGtfb24geworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gInNkYzJfY2xrIjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47IC8qIDE2IE1BICovCisJCQkJYmlhcy1kaXNhYmxlOyAvKiBOTyBwdWxsICovCisJCQl9OworCQl9OworCisJCXNkYzJfY2xrX29mZjogc2RjMl9jbGtfb2ZmIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMyX2NsayI7CisJCQkJYmlhcy1kaXNhYmxlOyAvKiBOTyBwdWxsICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCX07CisJCX07CisKKwkJc2RjMl9jbWRfb246IHNkYzJfY21kX29uIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMyX2NtZCI7CisJCQkJYmlhcy1wdWxsLXVwOyAvKiBwdWxsIHVwICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTA+OyAvKiAxMCBNQSAqLworCQkJfTsKKwkJfTsKKworCQlzZGMyX2NtZF9vZmY6IHNkYzJfY21kX29mZiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMl9jbWQiOworCQkJCWJpYXMtcHVsbC11cDsgLyogcHVsbCB1cCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCXNkYzJfZGF0YV9vbjogc2RjMl9kYXRhX29uIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMyX2RhdGEiOworCQkJCWJpYXMtcHVsbC11cDsgLyogcHVsbCB1cCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDEwPjsgLyogMTAgTUEgKi8KKwkJCX07CisJCX07CisKKwkJc2RjMl9kYXRhX29mZjogc2RjMl9kYXRhX29mZiB7CisJCQljb25maWcgeworCQkJCXBpbnMgPSAic2RjMl9kYXRhIjsKKwkJCQliaWFzLXB1bGwtdXA7IC8qIHB1bGwgdXAgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQlzZGMyX2NkX29uOiBjZF9vbiB7CisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzEzMyI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzEzMyI7CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJYmlhcy1wdWxsLXVwOworCQkJfTsKKwkJfTsKKworCQlzZGMyX2NkX29mZjogY2Rfb2ZmIHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvMTMzIjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvMTMzIjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQliaWFzLWRpc2FibGU7CisJCQl9OworCQl9OworCisJCWkyY18yIHsKKwkJCWkyY18yX2FjdGl2ZTogaTJjXzJfYWN0aXZlIHsKKwkJCQkvKiBhY3RpdmUgc3RhdGUgKi8KKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82IiwgImdwaW83IjsKKwkJCQkJZnVuY3Rpb24gPSAiYmxzcF9pMmMyIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNiIsICJncGlvNyI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLWRpc2FibGU7CisJCQkJfTsKKwkJCX07CisKKwkJCWkyY18yX3NsZWVwOiBpMmNfMl9zbGVlcCB7CisJCQkJLyogc3VzcGVuZGVkIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNiIsICJncGlvNyI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82IiwgImdwaW83IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlpMmNfMyB7CisJCQlpMmNfM19hY3RpdmU6IGkyY18zX2FjdGl2ZSB7CisJCQkJLyogYWN0aXZlIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMTAiLCAiZ3BpbzExIjsKKwkJCQkJZnVuY3Rpb24gPSAiYmxzcF9pMmMzIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAiLCAiZ3BpbzExIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKworCQkJaTJjXzNfc2xlZXA6IGkyY18zX3NsZWVwIHsKKwkJCQkvKiBzdXNwZW5kZWQgc3RhdGUgKi8KKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8xMCIsICJncGlvMTEiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAiLCAiZ3BpbzExIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlpMmNfNSB7CisJCQlpMmNfNV9hY3RpdmU6IGkyY181X2FjdGl2ZSB7CisJCQkJLyogYWN0aXZlIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMTgiLCAiZ3BpbzE5IjsKKwkJCQkJZnVuY3Rpb24gPSAiYmxzcF9pMmM1IjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTgiLCAiZ3BpbzE5IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKworCQkJaTJjXzVfc2xlZXA6IGkyY181X3NsZWVwIHsKKwkJCQkvKiBzdXNwZW5kZWQgc3RhdGUgKi8KKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8xOCIsICJncGlvMTkiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTgiLCAiZ3BpbzE5IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlwbXhfcmRfbmZjX2ludCB7CisJCQkvKnFjb20scGlucyA9IDwmZ3AgMTc+OyovCisJCQlwaW5zID0gImdwaW8xNyI7CisJCQlxY29tLHBpbi1mdW5jID0gPDA+OworCQkJcWNvbSxudW0tZ3JwLXBpbnMgPSA8MT47CisJCQlsYWJlbCA9ICJwbXhfbmZjX2ludCI7CisKKwkJCW5mY19pbnRfYWN0aXZlOiBhY3RpdmUgeworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDY+OworCQkJCWJpYXMtcHVsbC11cDsKKwkJCX07CisKKwkJCW5mY19pbnRfc3VzcGVuZDogc3VzcGVuZCB7CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Nj47CisJCQkJYmlhcy1wdWxsLXVwOworCQkJfTsKKwkJfTsKKworCQlwbXhfbmZjX3Jlc2V0IHsKKwkJCS8qcWNvbSxwaW5zID0gPCZncCAxNj47Ki8KKwkJCXBpbnMgPSAiZ3BpbzE2IjsKKwkJCXFjb20scGluLWZ1bmMgPSA8MD47CisJCQlxY29tLG51bS1ncnAtcGlucyA9IDwxPjsKKwkJCWxhYmVsID0gInBteF9uZmNfZGlzYWJsZSI7CisKKwkJCW5mY19kaXNhYmxlX2FjdGl2ZTogYWN0aXZlIHsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDw2PjsKKwkJCQliaWFzLXB1bGwtdXA7CisJCQl9OworCisJCQluZmNfZGlzYWJsZV9zdXNwZW5kOiBzdXNwZW5kIHsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDw2PjsKKwkJCQliaWFzLWRpc2FibGU7CisJCQl9OworCQl9OworCisJCXdjbnNzX3BtdXhfNXdpcmUgeworCQkJLyogQWN0aXZlIGNvbmZpZ3VyYXRpb24gb2YgYnVzIHBpbnMgKi8KKwkJCXdjbnNzX2RlZmF1bHQ6IHdjbnNzX2RlZmF1bHQgeworCQkJCXdjc3Nfd2xhbjIgeworCQkJCQlwaW5zID0gImdwaW83NiI7CisJCQkJCWZ1bmN0aW9uID0gIndjc3Nfd2xhbjIiOworCQkJCX07CisJCQkJd2Nzc193bGFuMSB7CisJCQkJCXBpbnMgPSAiZ3Bpbzc3IjsKKwkJCQkJZnVuY3Rpb24gPSAid2Nzc193bGFuMSI7CisJCQkJfTsKKwkJCQl3Y3NzX3dsYW4wIHsKKwkJCQkJcGlucyA9ICJncGlvNzgiOworCQkJCQlmdW5jdGlvbiA9ICJ3Y3NzX3dsYW4wIjsKKwkJCQl9OworCQkJCXdjc3Nfd2xhbiB7CisJCQkJCXBpbnMgPSAiZ3Bpbzc5IiwgImdwaW84MCI7CisJCQkJCWZ1bmN0aW9uID0gIndjc3Nfd2xhbiI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3Bpbzc2IiwgImdwaW83NyIsCisJCQkJCQkiZ3Bpbzc4IiwgImdwaW83OSIsCisJCQkJCQkiZ3BpbzgwIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Nj47IC8qIDYgTUEgKi8KKwkJCQkJYmlhcy1wdWxsLXVwOyAvKiBQVUxMIFVQICovCisJCQkJfTsKKwkJCX07CisKKwkJCXdjbnNzX3NsZWVwOiB3Y25zc19zbGVlcCB7CisJCQkJd2Nzc193bGFuMiB7CisJCQkJCXBpbnMgPSAiZ3Bpbzc2IjsKKwkJCQkJZnVuY3Rpb24gPSAid2Nzc193bGFuMiI7CisJCQkJfTsKKwkJCQl3Y3NzX3dsYW4xIHsKKwkJCQkJcGlucyA9ICJncGlvNzciOworCQkJCQlmdW5jdGlvbiA9ICJ3Y3NzX3dsYW4xIjsKKwkJCQl9OworCQkJCXdjc3Nfd2xhbjAgeworCQkJCQlwaW5zID0gImdwaW83OCI7CisJCQkJCWZ1bmN0aW9uID0gIndjc3Nfd2xhbjAiOworCQkJCX07CisJCQkJd2Nzc193bGFuIHsKKwkJCQkJcGlucyA9ICJncGlvNzkiLCAiZ3BpbzgwIjsKKwkJCQkJZnVuY3Rpb24gPSAid2Nzc193bGFuIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNzYiLCAiZ3Bpbzc3IiwKKwkJCQkJCSJncGlvNzgiLCAiZ3Bpbzc5IiwKKwkJCQkJCSJncGlvODAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCQliaWFzLXB1bGwtZG93bjsgLyogUFVMTCBEb3duICovCisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJd2Nuc3NfcG11eF9ncGlvOiB3Y25zc19wbXV4X2dwaW8geworCQkJd2Nuc3NfZ3Bpb19kZWZhdWx0OiB3Y25zc19ncGlvX2RlZmF1bHQgeworCQkJCS8qIEFjdGl2ZSBjb25maWd1cmF0aW9uIG9mIGJ1cyBwaW5zICovCisJCQkJbXV4IHsKKwkJCQkJLyogVXNlcyBnZW5lcmFsIHB1cnBvc2UgcGlucyAqLworCQkJCQlwaW5zID0gImdwaW83NiIsICJncGlvNzciLAorCQkJCQkiZ3Bpbzc4IiwgImdwaW83OSIsCisJCQkJCSJncGlvODAiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNzYiLCAiZ3Bpbzc3IiwKKwkJCQkJCSJncGlvNzgiLCAiZ3Bpbzc5IiwKKwkJCQkJCSJncGlvODAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw2PjsgLyogNiBNQSAqLworCQkJCQliaWFzLXB1bGwtdXA7IC8qIFBVTEwgVVAgKi8KKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQl3Y2Q5eHh4X2ludHIgeworCQkJd2NkX2ludHJfZGVmYXVsdDogd2NkX2ludHJfZGVmYXVsdHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW83MyI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW83MyI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJaW5wdXQtZW5hYmxlOworCQkJCX07CisJCQl9OworCQl9OworCisJCWNkY19yZXNldF9jdHJsIHsKKwkJCWNkY19yZXNldF9zbGVlcDogY2RjX3Jlc2V0X3NsZWVwIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82NyI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNjciOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47CisJCQkJCWJpYXMtZGlzYWJsZTsKKwkJCQkJb3V0cHV0LWxvdzsKKwkJCQl9OworCQkJfTsKKwkJCWNkY19yZXNldF9hY3RpdmU6Y2RjX3Jlc2V0X2FjdGl2ZSB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjciOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzY3IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTY+OworCQkJCQliaWFzLXB1bGwtZG93bjsKKwkJCQkJb3V0cHV0LWhpZ2g7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJY2RjX21jbGsyX3BpbiB7CisJCQljZGNfbWNsazJfc2xlZXA6IGNkY19tY2xrMl9zbGVlcCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjYiOworCQkJCQlmdW5jdGlvbiA9ICJwcmlfbWkycyI7CisJCQkJfTsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82NiI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAgICAgICAvKiBQVUxMIERPV04gKi8KKwkJCQl9OworCQkJfTsKKwkJCWNkY19tY2xrMl9hY3RpdmU6IGNkY19tY2xrMl9hY3RpdmUgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzY2IjsKKwkJCQkJZnVuY3Rpb24gPSAicHJpX21pMnMiOworCQkJCX07CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNjYiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsgLyogOCBtQSAqLworCQkJCQliaWFzLWRpc2FibGU7ICAgICAgICAgLyogTk8gUFVMTCAqLworCQkJCX07CisJCQl9OworCQl9OworCisJCWNkYy1wZG0tMi1saW5lcyB7CisJCQljZGNfcGRtX2xpbmVzXzJfYWN0OiBwZG1fbGluZXNfMl9vbiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNzAiLCAiZ3BpbzcxIiwgImdwaW83MiI7CisJCQkJCWZ1bmN0aW9uID0gImNkY19wZG0wIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNzAiLCAiZ3BpbzcxIiwgImdwaW83MiI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OworCQkJCX07CisJCQl9OworCisJCQljZGNfcGRtX2xpbmVzXzJfc3VzOiBwZG1fbGluZXNfMl9vZmYgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzcwIiwgImdwaW83MSIsICJncGlvNzIiOworCQkJCQlmdW5jdGlvbiA9ICJjZGNfcGRtMCI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzcwIiwgImdwaW83MSIsICJncGlvNzIiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1kaXNhYmxlOworCQkJCX07CisJCQl9OworCQl9OworCisJCWNkYy1wZG0tbGluZXMgeworCQkJY2RjX3BkbV9saW5lc19hY3Q6IHBkbV9saW5lc19vbiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjkiLCAiZ3BpbzczIiwgImdwaW83NCI7CisJCQkJCWZ1bmN0aW9uID0gImNkY19wZG0wIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNjkiLCAiZ3BpbzczIiwgImdwaW83NCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OworCQkJCX07CisJCQl9OworCQkJY2RjX3BkbV9saW5lc19zdXM6IHBkbV9saW5lc19vZmYgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzY5IiwgImdwaW83MyIsICJncGlvNzQiOworCQkJCQlmdW5jdGlvbiA9ICJjZGNfcGRtMCI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzY5IiwgImdwaW83MyIsICJncGlvNzQiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1kaXNhYmxlOworCQkJCX07CisJCQl9OworCQl9OworCisJCWNkYy1wZG0tY29tcC1saW5lcyB7CisJCQljZGNfcGRtX2NvbXBfbGluZXNfYWN0OiBwZG1fY29tcF9saW5lc19vbiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjciLCAiZ3BpbzY4IjsKKwkJCQkJZnVuY3Rpb24gPSAiY2RjX3BkbTAiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82NyIsICJncGlvNjgiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsKKwkJCQl9OworCQkJfTsKKworCQkJY2RjX3BkbV9jb21wX2xpbmVzX3N1czogcGRtX2NvbXBfbGluZXNfb2ZmIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82NyIsICJncGlvNjgiOworCQkJCQlmdW5jdGlvbiA9ICJjZGNfcGRtMCI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzY3IiwgImdwaW82OCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLWRpc2FibGU7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJY3Jvc3MtY29ubi1kZXQgeworCQkJY3Jvc3NfY29ubl9kZXRfYWN0OiBsaW5lc19vbiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjMiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNjMiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsKKwkJCQkJb3V0cHV0LWxvdzsKKwkJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJfTsKKwkJCX07CisKKwkJCWNyb3NzX2Nvbm5fZGV0X3N1czogbGluZXNfb2ZmIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82MyI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82MyI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLXB1bGwtZG93bjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQkvKiBXU0EgVkkgc2Vuc2UgKi8KKwkJd3NhLXZpIHsKKwkJCXdzYV92aV9vbjogd3NhX3ZpX29uIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW85NCIsICJncGlvOTUiOworCQkJCQlmdW5jdGlvbiA9ICJ3c2FfaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW85NCIsICJncGlvOTUiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsgLyogOCBNQSAqLworCQkJCQliaWFzLWRpc2FibGU7IC8qIE5PIHB1bGwgKi8KKwkJCQl9OworCQkJfTsKKworCQkJd3NhX3ZpX29mZjogd3NhX3ZpX29mZiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTQiLCAiZ3Bpbzk1IjsKKwkJCQkJZnVuY3Rpb24gPSAid3NhX2lvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTQiLCAiZ3Bpbzk1IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJLyogV1NBIFJlc2V0ICovCisJCXdzYV9yZXNldCB7CisJCQl3c2FfcmVzZXRfb246IHdzYV9yZXNldF9vbiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTYiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTYiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCQlvdXRwdXQtaGlnaDsKKwkJCQl9OworCQkJfTsKKworCQkJd3NhX3Jlc2V0X29mZjogd3NhX3Jlc2V0X29mZiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTYiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTYiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCQlvdXRwdXQtbG93OworCQkJCX07CisJCQl9OworCQl9OworCisJCS8qIFdTQSBDTEsgKi8KKwkJd3NhX2NsayB7CisJCQl3c2FfY2xrX29uOiB3c2FfY2xrX29uIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8yNSI7CisJCQkJCWZ1bmN0aW9uID0gInByaV9taTJzX21jbGtfYSI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzI1IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQkJb3V0cHV0LWhpZ2g7CisJCQkJfTsKKwkJCX07CisKKwkJCXdzYV9jbGtfb2ZmOiB3c2FfY2xrX29mZiB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMjUiOworCQkJCQlmdW5jdGlvbiA9ICJwcmlfbWkyc19tY2xrX2EiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8yNSI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQkJCW91dHB1dC1sb3c7CisJCQkJCWJpYXMtcHVsbC1kb3duOworCQkJCX07CisJCQl9OworCQl9OworCisJCXByaS10bG1tLWxpbmVzIHsKKwkJCXByaV90bG1tX2xpbmVzX2FjdDogcHJpX3RsbW1fbGluZXNfYWN0IHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW85MSIsICJncGlvOTMiOworCQkJCQlmdW5jdGlvbiA9ICJwcmlfbWkycyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzkxIiwgImdwaW85MyI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OworCQkJCX07CisJCQl9OworCisJCQlwcmlfdGxtbV9saW5lc19zdXM6IHByaV90bG1tX2xpbmVzX3N1cyB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTEiLCAiZ3BpbzkzIjsKKwkJCQkJZnVuY3Rpb24gPSAicHJpX21pMnMiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW85MSIsICJncGlvOTMiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcHJpLXRsbW0td3MtbGluZXMgeworCQkJcHJpX3RsbW1fd3NfYWN0OiBwcmlfdGxtbV93c19hY3QgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzkyIjsKKwkJCQkJZnVuY3Rpb24gPSAicHJpX21pMnNfd3MiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW85MiI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OworCQkJCX07CisJCQl9OworCisJCQlwcmlfdGxtbV93c19zdXM6IHByaV90bG1tX3dzX3N1cyB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTIiOworCQkJCQlmdW5jdGlvbiA9ICJwcmlfbWkyc193cyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzkyIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtcHVsbC1kb3duOworCQkJCX07CisJCQl9OworCQl9OworCisJCXNwaTMgeworCQkJc3BpM19kZWZhdWx0OiBzcGkzX2RlZmF1bHQgeworCQkJCS8qIGFjdGl2ZSBzdGF0ZSAqLworCQkJCW11eCB7CisJCQkJCS8qIE1PU0ksIE1JU08sIENMSyAqLworCQkJCQlwaW5zID0gImdwaW84IiwgImdwaW85IiwgImdwaW8xMSI7CisJCQkJCWZ1bmN0aW9uID0gImJsc3Bfc3BpMyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzExIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTI+OyAvKiAxMiBNQSAqLworCQkJCQliaWFzLWRpc2FibGUgPSA8MD47IC8qIE5vIFBVTEwgKi8KKwkJCQl9OworCQkJfTsKKworCQkJc3BpM19zbGVlcDogc3BpM19zbGVlcCB7CisJCQkJLyogc3VzcGVuZGVkIHN0YXRlICovCisJCQkJbXV4IHsKKwkJCQkJLyogTU9TSSwgTUlTTywgQ0xLICovCisJCQkJCXBpbnMgPSAiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzExIjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzExIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIFBVTEwgRG93biAqLworCQkJCX07CisJCQl9OworCisJCQlzcGkzX2NzMF9hY3RpdmU6IGNzMF9hY3RpdmUgeworCQkJCS8qIENTICovCisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMTAiOworCQkJCQlmdW5jdGlvbiA9ICJibHNwX3NwaTMiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8xMCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLWRpc2FibGUgPSA8MD47CisJCQkJfTsKKwkJCX07CisKKwkJCXNwaTNfY3MwX3NsZWVwOiBjczBfc2xlZXAgeworCQkJCS8qIENTICovCisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMTAiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1kaXNhYmxlID0gPDA+OworCQkJCX07CisJCQl9OworCQl9OworCisJCS8qIGFkZCBwaW5ncnAgZm9yIHRvdWNoc2NyZWVuICovCisJCXBteF90c19pbnRfYWN0aXZlIHsKKwkJCXRzX2ludF9hY3RpdmU6IHRzX2ludF9hY3RpdmUgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzY1IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzY1IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47CisJCQkJCWJpYXMtcHVsbC11cDsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlwbXhfdHNfaW50X3N1c3BlbmQgeworCQkJdHNfaW50X3N1c3BlbmQ6IHRzX2ludF9zdXNwZW5kIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82NSI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82NSI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLXB1bGwtZG93bjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlwbXhfdHNfcmVzZXRfYWN0aXZlIHsKKwkJCXRzX3Jlc2V0X2FjdGl2ZTogdHNfcmVzZXRfYWN0aXZlIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW82NCI7CisJCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW82NCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OworCQkJCQliaWFzLXB1bGwtdXA7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcG14X3RzX3Jlc2V0X3N1c3BlbmQgeworCQkJdHNfcmVzZXRfc3VzcGVuZDogdHNfcmVzZXRfc3VzcGVuZCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjQiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNjQiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcG14X3RzX3JlbGVhc2UgeworCQkJdHNfcmVsZWFzZTogdHNfcmVsZWFzZSB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNjUiLCAiZ3BpbzY0IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzY1IiwgImdwaW82NCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLXB1bGwtZG93bjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQl0bG1tX2dwaW9fa2V5IHsKKwkJCWdwaW9fa2V5X2FjdGl2ZTogZ3Bpb19rZXlfYWN0aXZlIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW84NSIsICJncGlvODYiLCAiZ3Bpbzg3IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3Bpbzg1IiwgImdwaW84NiIsICJncGlvODciOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLXVwOworCQkJCX07CisJCQl9OworCisJCQlncGlvX2tleV9zdXNwZW5kOiBncGlvX2tleV9zdXNwZW5kIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW84NSIsICJncGlvODYiLCAiZ3Bpbzg3IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3Bpbzg1IiwgImdwaW84NiIsICJncGlvODciOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLXVwOworCQkJCX07CisJCQl9OworCQl9OworCQlwbXhfcWRzZF9jbGsgeworCQkJcWRzZF9jbGtfc2RjYXJkOiBjbGtfc2RjYXJkIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfY2xrIjsKKwkJCQkJYmlhcy1kaXNhYmxlOy8qIE5PIHB1bGwgKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTY+OyAvKiAxNiBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9jbGtfdHJhY2U6IGNsa190cmFjZSB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2NsayI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfY2xrX3N3ZHRyYzogY2xrX3N3ZHRyYyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2NsayI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfY2xrX3NwbWk6IGNsa19zcG1pIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfY2xrIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQl9OworCisJCXBteF9xZHNkX2NtZCB7CisJCQlxZHNkX2NtZF9zZGNhcmQ6IGNtZF9zZGNhcmQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9jbWQiOworCQkJCQliaWFzLXB1bGwtZG93bjsgLyogcHVsbCBkb3duICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAvKiA4IE1BICovCisJCQkJfTsKKwkJCX07CisJCQlxZHNkX2NtZF90cmFjZTogY21kX3RyYWNlIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfY21kIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9jbWRfc3dkdWFydDogY21kX3VhcnQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9jbWQiOworCQkJCQliaWFzLXB1bGwtdXA7IC8qIHB1bGwgdXAgKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfY21kX3N3ZHRyYzogY21kX3N3ZHRyYyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2NtZCI7CisJCQkJCWJpYXMtcHVsbC11cDsgLyogcHVsbCB1cCAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9jbWRfanRhZzogY21kX2p0YWcgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9jbWQiOworCQkJCQliaWFzLWRpc2FibGU7IC8qIE5PIHB1bGwgKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfY21kX3NwbWk6IGNtZF9zcG1pIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfY21kIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxMD47IC8qIDEwIE1BICovCisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcG14X3Fkc2RfZGF0YTAgeworCQkJcWRzZF9kYXRhMF9zZGNhcmQ6IGRhdGEwX3NkY2FyZCB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEwIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsgLyogOCBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9kYXRhMF90cmFjZTogZGF0YTBfdHJhY2UgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMCI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTBfc3dkdWFydDogZGF0YTBfdWFydCB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEwIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9kYXRhMF9zd2R0cmM6IGRhdGEwX3N3ZHRyYyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEwIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9kYXRhMF9qdGFnOiBkYXRhMF9qdGFnIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfZGF0YTAiOworCQkJCQliaWFzLXB1bGwtdXA7IC8qIHB1bGwgdXAgKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTBfc3BtaTogZGF0YTBfc3BtaSB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEwIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQl9OworCisJCXBteF9xZHNkX2RhdGExIHsKKwkJCXFkc2RfZGF0YTFfc2RjYXJkOiBkYXRhMV9zZGNhcmQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMSI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTFfdHJhY2U6IGRhdGExX3RyYWNlIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfZGF0YTEiOworCQkJCQliaWFzLXB1bGwtZG93bjsgLyogcHVsbCBkb3duICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAvKiA4IE1BICovCisJCQkJfTsKKwkJCX07CisJCQlxZHNkX2RhdGExX3N3ZHVhcnQ6IGRhdGExX3VhcnQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMSI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTFfc3dkdHJjOiBkYXRhMV9zd2R0cmMgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMSI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTFfanRhZzogZGF0YTFfanRhZyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGExIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCX07CisJCQl9OworCQl9OworCisJCXBteF9xZHNkX2RhdGEyIHsKKwkJCXFkc2RfZGF0YTJfc2RjYXJkOiBkYXRhMl9zZGNhcmQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMiI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTJfdHJhY2U6IGRhdGEyX3RyYWNlIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfZGF0YTIiOworCQkJCQliaWFzLXB1bGwtZG93bjsgLyogcHVsbCBkb3duICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAvKiA4IE1BICovCisJCQkJfTsKKwkJCX07CisJCQlxZHNkX2RhdGEyX3N3ZHVhcnQ6IGRhdGEyX3VhcnQgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMiI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTJfc3dkdHJjOiBkYXRhMl9zd2R0cmMgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMiI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTJfanRhZzogZGF0YTJfanRhZyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEyIjsKKwkJCQkJYmlhcy1wdWxsLXVwOyAvKiBwdWxsIHVwICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAvKiA4IE1BICovCisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcG14X3Fkc2RfZGF0YTMgeworCQkJcWRzZF9kYXRhM19zZGNhcmQ6IGRhdGEzX3NkY2FyZCB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEzIjsKKwkJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsgLyogOCBNQSAqLworCQkJCX07CisJCQl9OworCQkJcWRzZF9kYXRhM190cmFjZTogZGF0YTNfdHJhY2UgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMyI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTNfc3dkdWFydDogZGF0YTNfdWFydCB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEzIjsKKwkJCQkJYmlhcy1wdWxsLXVwOyAvKiBwdWxsIHVwICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQkJfTsKKwkJCX07CisJCQlxZHNkX2RhdGEzX3N3ZHRyYzogZGF0YTNfc3dkdHJjIHsKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gInFkc2RfZGF0YTMiOworCQkJCQliaWFzLXB1bGwtdXA7IC8qIHB1bGwgdXAgKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJCXFkc2RfZGF0YTNfanRhZzogZGF0YTNfanRhZyB7CisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJxZHNkX2RhdGEzIjsKKwkJCQkJYmlhcy1wdWxsLXVwOyAvKiBwdWxsIHVwICovCisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQkJfTsKKwkJCX07CisJCQlxZHNkX2RhdGEzX3NwbWk6IGRhdGEzX3NwbWkgeworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAicWRzZF9kYXRhMyI7CisJCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47IC8qIDggTUEgKi8KKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQl0eXBlY19zc211eF9jb25maWc6IHR5cGVjX3NzbXV4X2NvbmZpZyB7CisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzEzOSI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzEzOSI7CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJYmlhcy1kaXNhYmxlOworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9tc204OTUzLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxN2FjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vbXNtODk1My5kdHNpCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgInNrZWxldG9uNjQuZHRzaSIKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9ncGlvL2dwaW8uaD4KKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIE1TTSA4OTUzIjsKKwljb21wYXRpYmxlID0gInFjb20sbXNtODk1MyI7CisJcWNvbSxtc20taWQgPSA8MjkzIDB4MD47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJzY2hlZF9lbmFibGVfaG1wPTEgc2NoZWRfZW5hYmxlX3Bvd2VyX2F3YXJlPTEiOworCX07CisKKwlyZXNlcnZlZC1tZW1vcnkgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCXJhbmdlczsKKworCQlvdGhlcl9leHRfbWVtOiBvdGhlcl9leHRfcmVnaW9uQDAgeworCQkJY29tcGF0aWJsZSA9ICJyZW1vdmVkLWRtYS1wb29sIjsKKwkJCW5vLW1hcDsKKwkJCXJlZyA9IDwweDAgMHg4NWIwMDAwMCAweDAgMHhkMDAwMDA+OworCQl9OworCisJCW1vZGVtX21lbTogbW9kZW1fcmVnaW9uQDAgeworCQkJY29tcGF0aWJsZSA9ICJyZW1vdmVkLWRtYS1wb29sIjsKKwkJCW5vLW1hcC1maXh1cDsKKwkJCXJlZyA9IDwweDAgMHg4NmMwMDAwMCAweDAgMHg2YTAwMDAwPjsKKwkJfTsKKworCQlhZHNwX2Z3X21lbTogYWRzcF9md19yZWdpb25AMCB7CisJCQljb21wYXRpYmxlID0gInJlbW92ZWQtZG1hLXBvb2wiOworCQkJbm8tbWFwOworCQkJcmVnID0gPDB4MCAweDhkNjAwMDAwIDB4MCAweDExMDAwMDA+OworCQl9OworCisJCXdjbnNzX2Z3X21lbTogd2Nuc3NfZndfcmVnaW9uQDAgeworCQkJY29tcGF0aWJsZSA9ICJyZW1vdmVkLWRtYS1wb29sIjsKKwkJCW5vLW1hcDsKKwkJCXJlZyA9IDwweDAgMHg4ZTcwMDAwMCAweDAgMHg3MDAwMDA+OworCQl9OworCisJCXZlbnVzX21lbTogdmVudXNfcmVnaW9uQDAgeworCQkJY29tcGF0aWJsZSA9ICJzaGFyZWQtZG1hLXBvb2wiOworCQkJcmV1c2FibGU7CisJCQlhbGxvYy1yYW5nZXMgPSA8MHgwIDB4ODAwMDAwMDAgMHgwIDB4MTAwMDAwMDA+OworCQkJYWxpZ25tZW50ID0gPDAgMHg0MDAwMDA+OworCQkJc2l6ZSA9IDwwIDB4MDgwMDAwMD47CisJCX07CisKKwkJc2VjdXJlX21lbTogc2VjdXJlX3JlZ2lvbkAwIHsKKwkJCWNvbXBhdGlibGUgPSAic2hhcmVkLWRtYS1wb29sIjsKKwkJCXJldXNhYmxlOworCQkJYWxpZ25tZW50ID0gPDAgMHg0MDAwMDA+OworCQkJc2l6ZSA9IDwwIDB4MDk4MDAwMDA+OworCQl9OworCisJCXFzZWVjb21fbWVtOiBxc2VlY29tX3JlZ2lvbkAwIHsKKwkJCWNvbXBhdGlibGUgPSAic2hhcmVkLWRtYS1wb29sIjsKKwkJCXJldXNhYmxlOworCQkJYWxpZ25tZW50ID0gPDAgMHg0MDAwMDA+OworCQkJc2l6ZSA9IDwwIDB4MTAwMDAwMD47CisJCX07CisKKwkJYWRzcF9tZW06IGFkc3BfcmVnaW9uQDAgeworCQkJY29tcGF0aWJsZSA9ICJzaGFyZWQtZG1hLXBvb2wiOworCQkJcmV1c2FibGU7CisJCQlzaXplID0gPDAgMHg0MDAwMDA+OworCQl9OworCisJCWRmcHNfZGF0YV9tZW06IGRmcHNfZGF0YV9tZW1AOTAwMDAwMDAgeworCQkgICAgICAgcmVnID0gPDAgMHg5MDAwMDAwMCAwIDB4MTAwMD47CisJCSAgICAgICBsYWJlbCA9ICJkZnBzX2RhdGFfbWVtIjsKKwkJfTsKKworCQljb250X3NwbGFzaF9tZW06IHNwbGFzaF9yZWdpb25AMHg5MDAwMTAwMCB7CisJCQlyZWcgPSA8MHgwIDB4OTAwMDEwMDAgMHgwIDB4MTNmZjAwMD47CisJCQlsYWJlbCA9ICJjb250X3NwbGFzaF9tZW0iOworCQl9OworCisJCWdwdV9tZW06IGdwdV9yZWdpb25AMCB7CisJCQljb21wYXRpYmxlID0gInNoYXJlZC1kbWEtcG9vbCI7CisJCQlyZXVzYWJsZTsKKwkJCWFsbG9jLXJhbmdlcyA9IDwweDAgMHg4MDAwMDAwMCAweDAgMHgxMDAwMDAwMD47CisJCQlhbGlnbm1lbnQgPSA8MCAweDQwMDAwMD47CisJCQlzaXplID0gPDAgMHg4MDAwMDA+OworCQl9OworCX07CisKKwlhbGlhc2VzIHsKKwkJLyogc21kdHR5IGRldmljZXMgKi8KKwkJc2RoYzEgPSAmc2RoY18xOyAvKiBTREMxIGVNTUMgc2xvdCAqLworCQlzZGhjMiA9ICZzZGhjXzI7IC8qIFNEQzIgZm9yIFNEIGNhcmQgKi8KKwl9OworCisJc29jOiBzb2MgeyB9OworCit9OworCisjaW5jbHVkZSAibXNtODk1My1waW5jdHJsLmR0c2kiCisjaW5jbHVkZSAibXNtODk1My1jcHUuZHRzaSIKKworCismc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlyYW5nZXMgPSA8MCAwIDAgMHhmZmZmZmZmZj47CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKworCWFwY19hcG06IGFwbUBiMTExMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NTMtYXBtIjsKKwkJcmVnID0gPDB4YjExMTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAicG0tYXBjYy1nbGIiOworCQlxY29tLGFwbS1wb3N0LWhhbHQtZGVsYXkgPSA8MHgyPjsKKwkJcWNvbSxhcG0taGFsdC1jbGstZGVsYXkgPSA8MHgxMT47CisJCXFjb20sYXBtLXJlc3VtZS1jbGstZGVsYXkgPSA8MHgxMD47CisJCXFjb20sYXBtLXNlbC1zd2l0Y2gtZGVsYXkgPSA8MHgwMT47CisJfTsKKworCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQGIwMDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLXFnaWMyIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCXJlZyA9IDwweDBiMDAwMDAwIDB4MTAwMD4sCisJCSAgICAgIDwweDBiMDAyMDAwIDB4MTAwMD47CisJfTsKKworCXFjb20sbXNtLWdsYWRpYXRvckBiMWMwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1nbGFkaWF0b3IiOworCQlyZWcgPSA8MHgwYjFjMDAwMCAweDQwMDA+OworCQlyZWctbmFtZXMgPSAiZ2xhZGlhdG9yX2Jhc2UiOworCQlpbnRlcnJ1cHRzID0gPDAgMjIgMD47CisJfTsKKworCXRpbWVyIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOworCQlpbnRlcnJ1cHRzID0gPDEgMiAweGZmMDg+LAorCQkJICAgICA8MSAzIDB4ZmYwOD4sCisJCQkgICAgIDwxIDQgMHhmZjA4PiwKKwkJCSAgICAgPDEgMSAweGZmMDg+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MTkyMDAwMDA+OworCX07CisKKwl0aW1lckBiMTIwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyYW5nZXM7CisJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY3LXRpbWVyLW1lbSI7CisJCXJlZyA9IDwweGIxMjAwMDAgMHgxMDAwPjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDE5MjAwMDAwPjsKKworCQlmcmFtZUBiMTIxMDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8MCA4IDB4ND4sCisJCQkJICAgICA8MCA3IDB4ND47CisJCQlyZWcgPSA8MHhiMTIxMDAwIDB4MTAwMD4sCisJCQkgICAgICA8MHhiMTIyMDAwIDB4MTAwMD47CisJCX07CisKKwkJZnJhbWVAYjEyMzAwMCB7CisJCQlmcmFtZS1udW1iZXIgPSA8MT47CisJCQlpbnRlcnJ1cHRzID0gPDAgOSAweDQ+OworCQkJcmVnID0gPDB4YjEyMzAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlmcmFtZUBiMTI0MDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDwyPjsKKwkJCWludGVycnVwdHMgPSA8MCAxMCAweDQ+OworCQkJcmVnID0gPDB4YjEyNDAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlmcmFtZUBiMTI1MDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDwzPjsKKwkJCWludGVycnVwdHMgPSA8MCAxMSAweDQ+OworCQkJcmVnID0gPDB4YjEyNTAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlmcmFtZUBiMTI2MDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDw0PjsKKwkJCWludGVycnVwdHMgPSA8MCAxMiAweDQ+OworCQkJcmVnID0gPDB4YjEyNjAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlmcmFtZUBiMTI3MDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDw1PjsKKwkJCWludGVycnVwdHMgPSA8MCAxMyAweDQ+OworCQkJcmVnID0gPDB4YjEyNzAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKworCQlmcmFtZUBiMTI4MDAwIHsKKwkJCWZyYW1lLW51bWJlciA9IDw2PjsKKwkJCWludGVycnVwdHMgPSA8MCAxNCAweDQ+OworCQkJcmVnID0gPDB4YjEyODAwMCAweDEwMDA+OworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwl9OworCXFjb20scm10ZnNfc2hhcmVkbWVtQDAwMDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNoYXJlZG1lbS11aW8iOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTgwMDAwPjsKKwkJcmVnLW5hbWVzID0gInJtdGZzIjsKKwkJcWNvbSxjbGllbnQtaWQgPSA8MHgwMDAwMDAwMT47CisJfTsKKworCXJlc3RhcnRANGFiMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBzaG9sZCI7CisJCXJlZyA9IDwweDRhYjAwMCAweDQ+LAorCQkJPDB4MTkzZDEwMCAweDQ+OworCQlyZWctbmFtZXMgPSAicHNob2xkLWJhc2UiLCAidGNzci1ib290LW1pc2MtZGV0ZWN0IjsKKwl9OworCisJcWNvbSxtcG0yLXNsZWVwLWNvdW50ZXJANGEzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1wbTItc2xlZXAtY291bnRlciI7CisJCXJlZyA9IDwweDRhMzAwMCAweDEwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MzI3Njg+OworCX07CisKKwljcHUtcG11IHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtcG11djMiOworCQlpbnRlcnJ1cHRzID0gPDEgNyAweGZmMDA+OworCX07CisKKwlxY29tLHNwcyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc21fc3BzXzRrIjsKKwkJcWNvbSxwaXBlLWF0dHItZWU7CisJfTsKKworCWJsc3AxX3VhcnQwOiBzZXJpYWxANzhhZjAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdWFydGRtLXYxLjQiLCAicWNvbSxtc20tdWFydGRtIjsKKwkJcmVnID0gPDB4NzhhZjAwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8MCAxMDcgMD47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKworCWRtYV9ibHNwMTogcWNvbSxzcHMtZG1hQDc4ODQwMDAgeyAvKiBCTFNQMSAqLworCQkjZG1hLWNlbGxzID0gPDQ+OworCQljb21wYXRpYmxlID0gInFjb20sc3BzLWRtYSI7CisJCXJlZyA9IDwweDc4ODQwMDAgMHgxZjAwMD47CisJCWludGVycnVwdHMgPSA8MCAyMzggMD47CisJCXFjb20sc3VtbWluZy10aHJlc2hvbGQgPSA8MTA+OworCX07CisKKwlkbWFfYmxzcDI6IHFjb20sc3BzLWRtYUA3YWM0MDAwIHsgLyogQkxTUDIgKi8KKwkJI2RtYS1jZWxscyA9IDw0PjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNwcy1kbWEiOworCQlyZWcgPSA8MHg3YWM0MDAwIDB4MWYwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgMjM5IDA+OworCQlxY29tLHN1bW1pbmctdGhyZXNob2xkID0gPDEwPjsKKwl9OworCisJc2xpbV9tc206IHNsaW1AYzE0MDAwMHsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNsaW0tbmdkIjsKKwkJcmVnID0gPDB4YzE0MDAwMCAweDJjMDAwPiwKKwkJICAgICAgPDB4YzEwNDAwMCAweDJhMDAwPjsKKwkJcmVnLW5hbWVzID0gInNsaW1idXNfcGh5c2ljYWwiLCAic2xpbWJ1c19iYW1fcGh5c2ljYWwiOworCQlpbnRlcnJ1cHRzID0gPDAgMTYzIDA+LCA8MCAxODAgMD47CisJCWludGVycnVwdC1uYW1lcyA9ICJzbGltYnVzX2lycSIsICJzbGltYnVzX2JhbV9pcnEiOworCQlxY29tLGFwcHMtY2gtcGlwZXMgPSA8MHg2MDAwMDA+OworCQlxY29tLGVhLXBjID0gPDB4MjAwPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJY3B1Ync6IHFjb20sY3B1YncgeworCQljb21wYXRpYmxlID0gInFjb20sZGV2YnciOworCQlnb3Zlcm5vciA9ICJjcHVmcmVxIjsKKwkJcWNvbSxzcmMtZHN0LXBvcnRzID0gPDEgNTEyPjsKKwkJcWNvbSxhY3RpdmUtb25seTsKKwkJcWNvbSxidy10YmwgPQorCQkJPCAgIDc2OSAvKiAgMTAwLjggTUh6ICovID4sCisJCQk8ICAxNjExIC8qICAyMTEuMiBNSHogKi8gPiwgICAgIC8qTG93IFNWUyovCisJCQk8ICAyMTI0IC8qICAyNzguNCBNSHogKi8gPiwKKwkJCTwgIDI5MjkgLyogIDM4NCAgIE1IeiAqLyA+LAorCQkJPCAgMzIyMSAvKiAgNDIyLjQgTUh6ICovID4sCS8qIFNWUyAqLworCQkJPCAgNDI0OCAvKiAgNTU2LjggTUh6ICovID4sCisJCQk8ICA1MTI2IC8qICA2NzIgICBNSHogKi8gPiwKKwkJCTwgIDU4NTkgLyogIDc2OCAgIE1IeiAqLyA+LCAgICAgLyogU1ZTKyAgKi8KKwkJCTwgIDYxNTIgLyogIDgwNi40IE1IeiAqLyA+LAorCQkJPCAgNjQ0NSAvKiAgODQ0LjggTUh6ICovID4sICAgICAvKiBOT00gICAqLworCQkJPCAgNzEwNCAvKiAgOTMxLjIgTUh6ICovID47ICAgICAvKiBUVVJCTyAqLworCX07CisKKwltaW5jcHVidzogcWNvbSxtaW5jcHVidyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkZXZidyI7CisJCWdvdmVybm9yID0gImNwdWZyZXEiOworCQlxY29tLHNyYy1kc3QtcG9ydHMgPSA8MSA1MTI+OworCQlxY29tLGFjdGl2ZS1vbmx5OworCQlxY29tLGJ3LXRibCA9CisJCQk8ICAgNzY5IC8qICAxMDAuOCBNSHogKi8gPiwKKwkJCTwgIDE2MTEgLyogIDIxMS4yIE1IeiAqLyA+LCAgICAgLypMb3cgU1ZTKi8KKwkJCTwgIDIxMjQgLyogIDI3OC40IE1IeiAqLyA+LAorCQkJPCAgMjkyOSAvKiAgMzg0ICAgTUh6ICovID4sCisJCQk8ICAzMjIxIC8qICA0MjIuNCBNSHogKi8gPiwJLyogU1ZTICovCisJCQk8ICA0MjQ4IC8qICA1NTYuOCBNSHogKi8gPiwKKwkJCTwgIDUxMjYgLyogIDY3MiAgIE1IeiAqLyA+LAorCQkJPCAgNTg1OSAvKiAgNzY4ICAgTUh6ICovID4sICAgICAvKiBTVlMrICAqLworCQkJPCAgNjE1MiAvKiAgODA2LjQgTUh6ICovID4sCisJCQk8ICA2NDQ1IC8qICA4NDQuOCBNSHogKi8gPiwgICAgIC8qIE5PTSAgICovCisJCQk8ICA3MTA0IC8qICA5MzEuMiBNSHogKi8gPjsgICAgIC8qIFRVUkJPICovCisJfTsKKworCXFjb20sY3B1LWJ3bW9uIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGJpbWMtYndtb24yIjsKKwkJcmVnID0gPDB4NDA4MDAwIDB4MzAwPiwgPDB4NDAxMDAwIDB4MjAwPjsKKwkJcmVnLW5hbWVzID0gImJhc2UiLCAiZ2xvYmFsX2Jhc2UiOworCQlpbnRlcnJ1cHRzID0gPDAgMTgzIDQ+OworCQlxY29tLG1wb3J0ID0gPDA+OworCQlxY29tLHRhcmdldC1kZXYgPSA8JmNwdWJ3PjsKKwl9OworCisJZGV2ZnJlcS1jcHVmcmVxIHsKKwkJY3B1YnctY3B1ZnJlcSB7CisJCXRhcmdldC1kZXYgPSA8JmNwdWJ3PjsKKwkJY3B1LXRvLWRldi1tYXAgPQorCQkJIDwgIDY1MjgwMCAgMTYxMT4sCisJCQkgPCAxMDM2ODAwICAzMjIxPiwKKwkJCSA8IDE0MDE2MDAgIDU4NTk+LAorCQkJIDwgMTY4OTYwMCAgNjQ0NT4sCisJCQkgPCAxODA0ODAwICA3MTA0PiwKKwkJCSA8IDE5NTg0MDAgIDcxMDQ+LAorCQkJIDwgMjIwODAwMCAgNzEwND47CisJCX07CisKKwkJbWluY3B1YnctY3B1ZnJlcSB7CisJCQl0YXJnZXQtZGV2ID0gPCZtaW5jcHVidz47CisJCQljcHUtdG8tZGV2LW1hcCA9CisJCQkJPCAgNjUyODAwIDE2MTEgPiwKKwkJCQk8IDE0MDE2MDAgMzIyMSA+LAorCQkJCTwgMjIwODAwMCA1ODU5ID47CisJCX07CisJfTsKKworCXFjb20saXBjLXNwaW5sb2NrQDE5MDUwMDAgeworCQljb21wYXRpYmxlID0gInFjb20saXBjLXNwaW5sb2NrLXNmcGIiOworCQlyZWcgPSA8MHgxOTA1MDAwIDB4ODAwMD47CisJCXFjb20sbnVtLWxvY2tzID0gPDg+OworCX07CisKKwlxY29tLHNtZW1AODYzMDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sc21lbSI7CisJCXJlZyA9IDwweDg2MzAwMDAwIDB4MTAwMDAwPiwKKwkJCTwweDBiMDExMDA4IDB4ND4sCisJCQk8MHg2MDAwMCAweDgwMDA+LAorCQkJPDB4MTkzZDAwMCAweDg+OworCQlyZWctbmFtZXMgPSAic21lbSIsICJpcnEtcmVnLWJhc2UiLAorCQkJCSJhdXgtbWVtMSIsICJzbWVtX3RhcmdfaW5mb19yZWciOworCQlxY29tLG1wdS1lbmFibGVkOworCisJCXFjb20sc21kLW1vZGVtIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzbWQiOworCQkJcWNvbSxzbWQtZWRnZSA9IDwwPjsKKwkJCXFjb20sc21kLWlycS1vZmZzZXQgPSA8MHgwPjsKKwkJCXFjb20sc21kLWlycS1iaXRtYXNrID0gPDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMjUgMT47CisJCQlsYWJlbCA9ICJtb2RlbSI7CisJCQlxY29tLG5vdC1sb2FkYWJsZTsKKwkJfTsKKworCQlxY29tLHNtc20tbW9kZW0geworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtc20iOworCQkJcWNvbSxzbXNtLWVkZ2UgPSA8MD47CisJCQlxY29tLHNtc20taXJxLW9mZnNldCA9IDwweDA+OworCQkJcWNvbSxzbXNtLWlycS1iaXRtYXNrID0gPDB4MjAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMjYgMT47CisJCX07CisKKwkJcWNvbSxzbWQtd2Nuc3MgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtZCI7CisJCQlxY29tLHNtZC1lZGdlID0gPDY+OworCQkJcWNvbSxzbWQtaXJxLW9mZnNldCA9IDwweDA+OworCQkJcWNvbSxzbWQtaXJxLWJpdG1hc2sgPSA8MHgyMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMTQyIDE+OworCQkJbGFiZWwgPSAid2Nuc3MiOworCQl9OworCisJCXFjb20sc21zbS13Y25zcyB7CisJCQljb21wYXRpYmxlID0gInFjb20sc21zbSI7CisJCQlxY29tLHNtc20tZWRnZSA9IDw2PjsKKwkJCXFjb20sc21zbS1pcnEtb2Zmc2V0ID0gPDB4MD47CisJCQlxY29tLHNtc20taXJxLWJpdG1hc2sgPSA8MHg4MDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMTQ0IDE+OworCQl9OworCisJCXFjb20sc21kLWFkc3AgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtZCI7CisJCQlxY29tLHNtZC1lZGdlID0gPDE+OworCQkJcWNvbSxzbWQtaXJxLW9mZnNldCA9IDwweDA+OworCQkJcWNvbSxzbWQtaXJxLWJpdG1hc2sgPSA8MHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwwIDI4OSAxPjsKKwkJCWxhYmVsID0gImFkc3AiOworCQl9OworCisJCXFjb20sc21zbS1hZHNwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzbXNtIjsKKwkJCXFjb20sc21zbS1lZGdlID0gPDE+OworCQkJcWNvbSxzbXNtLWlycS1vZmZzZXQgPSA8MHgwPjsKKwkJCXFjb20sc21zbS1pcnEtYml0bWFzayA9IDwweDIwMD47CisJCQlpbnRlcnJ1cHRzID0gPDAgMjkwIDE+OworCQl9OworCisJCXFjb20sc21kLXJwbSB7CisJCQljb21wYXRpYmxlID0gInFjb20sc21kIjsKKwkJCXFjb20sc21kLWVkZ2UgPSA8MTU+OworCQkJcWNvbSxzbWQtaXJxLW9mZnNldCA9IDwweDA+OworCQkJcWNvbSxzbWQtaXJxLWJpdG1hc2sgPSA8MHgxPjsKKwkJCWludGVycnVwdHMgPSA8MCAxNjggMT47CisJCQlsYWJlbCA9ICJycG0iOworCQkJcWNvbSxpcnEtbm8tc3VzcGVuZDsKKwkJCXFjb20sbm90LWxvYWRhYmxlOworCQl9OworCX07CisKKwlxY29tLHdkdEBiMDE3MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS13YXRjaGRvZyI7CisJCXJlZyA9IDwweGIwMTcwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gIndkdC1iYXNlIjsKKwkJaW50ZXJydXB0cyA9IDwwIDMgMD4sIDwwIDQgMD47CisJCXFjb20sYmFyay10aW1lID0gPDExMDAwPjsKKwkJcWNvbSxwZXQtdGltZSA9IDwxMDAwMD47CisJCXFjb20saXBpLXBpbmc7CisJCXFjb20sd2FrZXVwLWVuYWJsZTsKKwl9OworCisJcWNvbSxjaGQgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZS1oYW5nLWRldGVjdCI7CisJCXFjb20sdGhyZXNob2xkLWFyciA9IDwweGIxODgwYjAgMHhiMTk4MGIwIDB4YjFhODBiMAorCQkJMHhiMWI4MGIwIDB4YjA4ODBiMCAweGIwOTgwYjAgMHhiMGE4MGIwIDB4YjBiODBiMD47CisJCXFjb20sY29uZmlnLWFyciA9IDwweGIxODgwYjggMHhiMTk4MGI4IDB4YjFhODBiOAorCQkJMHhiMWI4MGI4IDB4YjA4ODBiOCAweGIwOTgwYjggMHhiMGE4MGI4IDB4YjBiODBiOD47CisJfTsKKworCXFjb20sbXNtLXJ0YiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tcnRiIjsKKwkJcWNvbSxydGItc2l6ZSA9IDwweDEwMDAwMD47CisJfTsKKworCXFjb20sbXNtLWltZW1AODYwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taW1lbSI7CisJCXJlZyA9IDwweDA4NjAwMDAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAgMHgwODYwMDAwMCAweDEwMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJbWVtX2R1bXBfdGFibGVAMTAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1pbWVtLW1lbV9kdW1wX3RhYmxlIjsKKwkJCXJlZyA9IDwweDEwIDg+OworCQl9OworCisJCXJlc3RhcnRfcmVhc29uQDY1YyB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWltZW0tcmVzdGFydF9yZWFzb24iOworCQkJcmVnID0gPDB4NjVjIDQ+OworCQl9OworCisJCWJvb3Rfc3RhdHNANmIwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taW1lbS1ib290X3N0YXRzIjsKKwkJCXJlZyA9IDwweDZiMCAzMj47CisJCX07CisKKwkJIHBpbEA5NGMgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1pbWVtLXBpbCI7CisJCQlyZWcgPSA8MHg5NGMgMjAwPjsKKworCQl9OworCX07CisKKwlxY29tLG1lbXNoYXJlIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1lbXNoYXJlIjsKKworCQlxY29tLGNsaWVudF8xIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtZW1zaGFyZS1wZXJpcGhlcmFsIjsKKwkJCXFjb20scGVyaXBoZXJhbC1zaXplID0gPDB4MjAwMDAwPjsKKwkJCXFjb20sY2xpZW50LWlkID0gPDA+OworCQkJcWNvbSxhbGxvY2F0ZS1ib290LXRpbWU7CisJCQlsYWJlbCA9ICJtb2RlbSI7CisJCX07CisKKwkJcWNvbSxjbGllbnRfMiB7CisJCQljb21wYXRpYmxlID0gInFjb20sbWVtc2hhcmUtcGVyaXBoZXJhbCI7CisJCQlxY29tLHBlcmlwaGVyYWwtc2l6ZSA9IDwweDMwMDAwMD47CisJCQlxY29tLGNsaWVudC1pZCA9IDwyPjsKKwkJCWxhYmVsID0gIm1vZGVtIjsKKwkJfTsKKworCQltZW1fY2xpZW50XzNfc2l6ZTogcWNvbSxjbGllbnRfMyB7CisJCQljb21wYXRpYmxlID0gInFjb20sbWVtc2hhcmUtcGVyaXBoZXJhbCI7CisJCQlxY29tLHBlcmlwaGVyYWwtc2l6ZSA9IDwweDA+OworCQkJcWNvbSxjbGllbnQtaWQgPSA8MT47CisJCQlsYWJlbCA9ICJtb2RlbSI7CisJCX07CisJfTsKKwkJc2RjYzFfaWNlOiBzZGNjMWljZUA3ODAzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGljZSI7CisJCXJlZyA9IDwweDc4MDMwMDAgMHg4MDAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gInNkY2NfaWNlX25vbnNlY19sZXZlbF9pcnEiLAorCQkJCSAgInNkY2NfaWNlX3NlY19sZXZlbF9pcnEiOworCQlpbnRlcnJ1cHRzID0gPDAgMzEyIDA+LCA8MCAzMTMgMD47CisJCXFjb20sZW5hYmxlLWljZS1jbGs7CisJCXFjb20sb3AtZnJlcS1oeiA9IDwyNzAwMDAwMDA+LCA8MD4sIDwwPiwgPDA+OworCQlxY29tLG1zbS1idXMsbmFtZSA9ICJzZGNjX2ljZV9ub2MiOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDI+OworCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDE+OworCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCTw3OCA1MTIgMCAwPiwgICAgLyogTm8gdm90ZSAqLworCQkJPDc4IDUxMiAxMDAwIDA+OyAvKiBNYXguIGJhbmR3aWR0aCAqLworCQlxY29tLGJ1cy12ZWN0b3ItbmFtZXMgPSAiTUlOIiwgIk1BWCI7CisJCXFjb20saW5zdGFuY2UtdHlwZSA9ICJzZGNjIjsKKwl9OworCisJc2RoY18xOiBzZGhjaUA3ODI0OTAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNkaGNpLW1zbSI7CisJCXJlZyA9IDwweDc4MjQ5MDAgMHg1MDA+LCA8MHg3ODI0MDAwIDB4ODAwPiwgPDB4NzgyNGUwMCAweDIwMD47CisJCXJlZy1uYW1lcyA9ICJoY19tZW0iLCAiY29yZV9tZW0iLCAiY21kcV9tZW0iOworCisJCWludGVycnVwdHMgPSA8MCAxMjMgMD4sIDwwIDEzOCAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImhjX2lycSIsICJwd3JfaXJxIjsKKworCQlzZGhjLW1zbS1jcnlwdG8gPSA8JnNkY2MxX2ljZT47CisJCXFjb20sYnVzLXdpZHRoID0gPDg+OworCisJCXFjb20sZGV2ZnJlcSxmcmVxLXRhYmxlID0gPDUwMDAwMDAwIDIwMDAwMDAwMD47CisKKwkJcWNvbSxwbS1xb3MtaXJxLXR5cGUgPSAiYWZmaW5lX2lycSI7CisJCXFjb20scG0tcW9zLWlycS1sYXRlbmN5ID0gPDIgMjEzPjsKKworCQlxY29tLHBtLXFvcy1jcHUtZ3JvdXBzID0gPDB4MGYgMHhmMD47CisJCXFjb20scG0tcW9zLWNtZHEtbGF0ZW5jeS11cyA9IDwyIDIxMz4sIDwyIDIxMz47CisKKwkJcWNvbSxwbS1xb3MtbGVnYWN5LWxhdGVuY3ktdXMgPSA8MiAyMTM+LCA8MiAyMTM+OworCisJCXFjb20sbXNtLWJ1cyxuYW1lID0gInNkaGMxIjsKKwkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDw5PjsKKwkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwxPjsKKwkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9IDw3OCA1MTIgMCAwPiwgLyogTm8gdm90ZSAqLworCQkJPDc4IDUxMiAxMDQ2IDMyMDA+LCAgICAvKiA0MDAgS0IvcyovCisJCQk8NzggNTEyIDUyMjg2IDE2MDAwMD4sIC8qIDIwIE1CL3MgKi8KKwkJCTw3OCA1MTIgNjUzNjAgMjAwMDAwPiwgLyogMjUgTUIvcyAqLworCQkJPDc4IDUxMiAxMzA3MTggNDAwMDAwPiwgLyogNTAgTUIvcyAqLworCQkJPDc4IDUxMiAxMzA3MTggNDAwMDAwPiwgLyogMTAwIE1CL3MgKi8KKwkJCTw3OCA1MTIgMjYxNDM4IDgwMDAwMD4sIC8qIDIwMCBNQi9zICovCisJCQk8NzggNTEyIDI2MTQzOCA4MDAwMDA+LCAvKiA0MDAgTUIvcyAqLworCQkJPDc4IDUxMiAxMzM4NTYyIDQwOTYwMDA+OyAvKiBNYXguIGJhbmR3aWR0aCAqLworCQlxY29tLGJ1cy1idy12ZWN0b3JzLWJwcyA9IDwwIDQwMDAwMCAyMDAwMDAwMCAyNTAwMDAwMCA1MDAwMDAwMAorCQkJMTAwMDAwMDAwIDIwMDAwMDAwMCA0MDAwMDAwMDAgNDI5NDk2NzI5NT47CisKKwkJcWNvbSxpY2UtY2xrLXJhdGVzID0gPDI3MDAwMDAwMCAxNjAwMDAwMDA+OworCQlxY29tLGxhcmdlLWFkZHJlc3MtYnVzOworCisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKworCXNkaGNfMjogc2RoY2lANzg2NDkwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzZGhjaS1tc20iOworCQlyZWcgPSA8MHg3ODY0OTAwIDB4NTAwPiwgPDB4Nzg2NDAwMCAweDgwMD47CisJCXJlZy1uYW1lcyA9ICJoY19tZW0iLCAiY29yZV9tZW0iOworCisJCWludGVycnVwdHMgPSA8MCAxMjUgMD4sIDwwIDIyMSAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImhjX2lycSIsICJwd3JfaXJxIjsKKworCQlxY29tLGJ1cy13aWR0aCA9IDw0PjsKKworCQlxY29tLHBtLXFvcy1pcnEtdHlwZSA9ICJhZmZpbmVfaXJxIjsKKwkJcWNvbSxwbS1xb3MtaXJxLWxhdGVuY3kgPSA8MiAyMTM+OworCisJCXFjb20scG0tcW9zLWNwdS1ncm91cHMgPSA8MHgwZiAweGYwPjsKKwkJcWNvbSxwbS1xb3MtbGVnYWN5LWxhdGVuY3ktdXMgPSA8MiAyMTM+LCA8MiAyMTM+OworCisJCXFjb20sZGV2ZnJlcSxmcmVxLXRhYmxlID0gPDUwMDAwMDAwIDIwMDAwMDAwMD47CisKKwkJcWNvbSxtc20tYnVzLG5hbWUgPSAic2RoYzIiOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDg+OworCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDE+OworCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0gPDgxIDUxMiAwIDA+LCAvKiBObyB2b3RlICovCisJCQk8ODEgNTEyIDEwNDYgMzIwMD4sICAgIC8qIDQwMCBLQi9zKi8KKwkJCTw4MSA1MTIgNTIyODYgMTYwMDAwPiwgLyogMjAgTUIvcyAqLworCQkJPDgxIDUxMiA2NTM2MCAyMDAwMDA+LCAvKiAyNSBNQi9zICovCisJCQk8ODEgNTEyIDEzMDcxOCA0MDAwMDA+LCAvKiA1MCBNQi9zICovCisJCQk8ODEgNTEyIDI2MTQzOCA4MDAwMDA+LCAvKiAxMDAgTUIvcyAqLworCQkJPDgxIDUxMiAyNjE0MzggODAwMDAwPiwgLyogMjAwIE1CL3MgKi8KKwkJCTw4MSA1MTIgMTMzODU2MiA0MDk2MDAwPjsgLyogTWF4LiBiYW5kd2lkdGggKi8KKwkJcWNvbSxidXMtYnctdmVjdG9ycy1icHMgPSA8MCA0MDAwMDAgMjAwMDAwMDAgMjUwMDAwMDAgNTAwMDAwMDAKKwkJCTEwMDAwMDAwMCAyMDAwMDAwMDAgNDI5NDk2NzI5NT47CisKKwkJcWNvbSxsYXJnZS1hZGRyZXNzLWJ1czsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG02NjAuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTY2MC5kdHNpCmluZGV4IDVmMjNiOTEuLjFmZGIzZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTY2MC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTY2MC5kdHNpCkBAIC0xMiw5ICsxMiwxMCBAQAogCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3Mvc3BtaS9zcG1pLmg+CiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaXJxLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLmg+CiAKICZzcG1pX2J1cyB7Ci0JcWNvbSxwbTY2MEAwIHsKKwlwbTY2MF8wOiBxY29tLHBtNjYwQDAgewogCQljb21wYXRpYmxlID0icWNvbSxzcG1pLXBtaWMiOwogCQlyZWcgPSA8MHgwIFNQTUlfVVNJRD47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwpAQCAtNTgsMTAwICs1OSwzMyBAQAogCQkJfTsKIAkJfTsKIAotCQlxY29tLHRlbXAtYWxhcm1AMjQwMCB7CisJCXBtNjYwX3R6OiBxY29tLHRlbXAtYWxhcm1AMjQwMCB7CiAJCQljb21wYXRpYmxlID0gInFjb20scXBucC10ZW1wLWFsYXJtIjsKIAkJCXJlZyA9IDwweDI0MDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDwweDAgMHgyNCAweDAgSVJRX1RZUEVfRURHRV9SSVNJTkc+OwogCQkJbGFiZWwgPSAicG02NjBfdHoiOwogCQkJcWNvbSxjaGFubmVsLW51bSA9IDw2PjsKIAkJCXFjb20sdGVtcF9hbGFybS12YWRjID0gPCZwbTY2MF92YWRjPjsKKwkJCSN0aGVybWFsLXNlbnNvci1jZWxscyA9IDwwPjsKIAkJfTsKIAotCQlwbTY2MF9ncGlvczogZ3Bpb3MgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtcGluIjsKKwkJcG02NjBfZ3Bpb3M6IHBpbmN0cmxAYzAwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sc3BtaS1ncGlvIjsKKwkJCXJlZyA9IDwweGMwMDAgMHhkMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHhjMSAwIElSUV9UWVBFX05PTkU+LAorCQkJCQk8MHgwIDB4YzIgMCBJUlFfVFlQRV9OT05FPiwKKwkJCQkJPDB4MCAweGMzIDAgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDAgMHhjOCAwIElSUV9UWVBFX05PTkU+LAorCQkJCQk8MHgwIDB4Y2EgMCBJUlFfVFlQRV9OT05FPiwKKwkJCQkJPDB4MCAweGNiIDAgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDAgMHhjYyAwIElSUV9UWVBFX05PTkU+OworCQkJaW50ZXJydXB0LW5hbWVzID0gInBtNjYwX2dwaW8yIiwgInBtNjYwX2dwaW8zIiwKKwkJCQkJInBtNjYwX2dwaW80IiwgInBtNjYwX2dwaW85IiwKKwkJCQkJInBtNjYwX2dwaW8xMSIsICJwbTY2MF9ncGlvMTIiLAorCQkJCQkicG02NjBfZ3BpbzEzIjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWxhYmVsID0gInBtNjYwLWdwaW8iOwotCi0JCQlncGlvQGMwMDAgewotCQkJCXJlZyA9IDwweGMwMDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDwxPjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjMTAwIHsKLQkJCQlyZWcgPSA8MHhjMTAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8Mj47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzIwMCB7Ci0JCQkJcmVnID0gPDB4YzIwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDM+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGMzMDAgewotCQkJCXJlZyA9IDwweGMzMDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDw0PjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjNDAwIHsKLQkJCQlyZWcgPSA8MHhjNDAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8NT47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzUwMCB7Ci0JCQkJcmVnID0gPDB4YzUwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDY+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGM2MDAgewotCQkJCXJlZyA9IDwweGM2MDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDw3PjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjNzAwIHsKLQkJCQlyZWcgPSA8MHhjNzAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8OD47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzgwMCB7Ci0JCQkJcmVnID0gPDB4YzgwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDk+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGM5MDAgewotCQkJCXJlZyA9IDwweGM5MDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDwxMD47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AY2EwMCB7Ci0JCQkJcmVnID0gPDB4Y2EwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDExPjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjYjAwIHsKLQkJCQlyZWcgPSA8MHhjYjAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8MTI+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGNjMDAgewotCQkJCXJlZyA9IDwweGNjMDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDwxMz47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07CisJCQlxY29tLGdwaW9zLWRpc2FsbG93ZWQgPSA8MSA1IDYgNyA4IDEwPjsKIAkJfTsKIAogCQlwbTY2MF9jb2luY2VsbDogcWNvbSxjb2luY2VsbEAyODAwIHsKQEAgLTMxMywxNDkgKzI0NywxMiBAQAogCQkJfTsKIAkJfTsKIAotCQlwbTY2MF9jaGFyZ2VyOiBxY29tLHFwbnAtc21iMiB7Ci0JCQljb21wYXRpYmxlID0gInFjb20scXBucC1zbWIyIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0KLQkJCXFjb20scG1pYy1yZXZpZCA9IDwmcG02NjBfcmV2aWQ+OwotCi0JCQlpby1jaGFubmVscyA9IDwmcG02NjBfcnJhZGMgOD4sCi0JCQkJICAgICAgPCZwbTY2MF9ycmFkYyAxMD4sCi0JCQkJICAgICAgPCZwbTY2MF9ycmFkYyAzPiwKLQkJCQkgICAgICA8JnBtNjYwX3JyYWRjIDQ+OwotCQkJaW8tY2hhbm5lbC1uYW1lcyA9ICJjaGFyZ2VyX3RlbXAiLAotCQkJCQkgICAiY2hhcmdlcl90ZW1wX21heCIsCi0JCQkJCSAgICJ1c2Jpbl9pIiwKLQkJCQkJICAgInVzYmluX3YiOwotCi0JCQlxY29tLHdpcG93ZXItbWF4LXV3ID0gPDUwMDAwMDA+OwotCi0JCQkvKiBFbmFibGUgYWZ0ZXIgdGhlIHF1c2JfcGh5MCBkZXZpY2Ugbm9kZSBpcyBhZGRlZCAqLwotCQkJLyogZHBkbS1zdXBwbHkgPSA8JnF1c2JfcGh5MD47ICovCi0KLQkJCXFjb20sdGhlcm1hbC1taXRpZ2F0aW9uCi0JCQkJCT0gPDMwMDAwMDAgMjUwMDAwMCAyMDAwMDAwIDE1MDAwMDAKLQkJCQkJCTEwMDAwMDAgNTAwMDAwPjsKLQotCQkJcWNvbSxjaGdyQDEwMDAgewotCQkJCXJlZyA9IDwweDEwMDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPQotCQkJCQk8MHgwIDB4MTAgMHgwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKLQkJCQkJPDB4MCAweDEwIDB4MSBJUlFfVFlQRV9FREdFX1JJU0lORz4sCi0JCQkJCTwweDAgMHgxMCAweDIgSVJRX1RZUEVfRURHRV9SSVNJTkc+LAotCQkJCQk8MHgwIDB4MTAgMHgzIElSUV9UWVBFX0VER0VfUklTSU5HPiwKLQkJCQkJPDB4MCAweDEwIDB4NCBJUlFfVFlQRV9FREdFX1JJU0lORz47Ci0KLQkJCQlpbnRlcnJ1cHQtbmFtZXMgPSAiY2hnLWVycm9yIiwKLQkJCQkJCSAgImNoZy1zdGF0ZS1jaGFuZ2UiLAotCQkJCQkJICAic3RlcC1jaGctc3RhdGUtY2hhbmdlIiwKLQkJCQkJCSAgInN0ZXAtY2hnLXNvYy11cGRhdGUtZmFpbCIsCi0JCQkJCQkgICJzdGVwLWNoZy1zb2MtdXBkYXRlLXJlcXVlc3QiOwotCQkJfTsKLQotCQkJcWNvbSxvdGdAMTEwMCB7Ci0JCQkJcmVnID0gPDB4MTEwMCAweDEwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwweDAgMHgxMSAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4MTEgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCSAgICAgPDB4MCAweDExIDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQkgICAgIDwweDAgMHgxMSAweDMgSVJRX1RZUEVfRURHRV9CT1RIPjsKLQotCQkJCWludGVycnVwdC1uYW1lcyA9ICJvdGctZmFpbCIsCi0JCQkJCQkgICJvdGctb3ZlcmN1cnJlbnQiLAotCQkJCQkJICAib3RnLW9jLWRpcy1zdy1zdHMiLAotCQkJCQkJICAidGVzdG1vZGUtY2hhbmdlLWRldGVjdCI7Ci0JCQl9OwotCi0JCQlxY29tLGJhdC1pZkAxMjAwIHsKLQkJCQlyZWcgPSA8MHgxMjAwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0KLQkJCQkJPDB4MCAweDEyIDB4MCBJUlFfVFlQRV9FREdFX1JJU0lORz4sCi0JCQkJCTwweDAgMHgxMiAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDEyIDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQk8MHgwIDB4MTIgMHgzIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxMiAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDEyIDB4NSBJUlFfVFlQRV9FREdFX0JPVEg+OwotCi0JCQkJaW50ZXJydXB0LW5hbWVzID0gImJhdC10ZW1wIiwKLQkJCQkJCSAgImJhdC1vY3AiLAotCQkJCQkJICAiYmF0LW92IiwKLQkJCQkJCSAgImJhdC1sb3ciLAotCQkJCQkJICAiYmF0LXRoZXJtLW9yLWlkLW1pc3NpbmciLAotCQkJCQkJICAiYmF0LXRlcm1pbmFsLW1pc3NpbmciOwotCQkJfTsKLQotCQkJcWNvbSx1c2ItY2hncHRoQDEzMDAgewotCQkJCXJlZyA9IDwweDEzMDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPQotCQkJCQk8MHgwIDB4MTMgMHgwIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxMyAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDEzIDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQk8MHgwIDB4MTMgMHgzIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxMyAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDEzIDB4NSBJUlFfVFlQRV9FREdFX1JJU0lORz4sCi0JCQkJCTwweDAgMHgxMyAweDYgSVJRX1RZUEVfRURHRV9SSVNJTkc+LAotCQkJCQk8MHgwIDB4MTMgMHg3IElSUV9UWVBFX0VER0VfUklTSU5HPjsKLQotCQkJCWludGVycnVwdC1uYW1lcyA9ICJ1c2Jpbi1jb2xsYXBzZSIsCi0JCQkJCQkgICJ1c2Jpbi1sdC0zcDZ2IiwKLQkJCQkJCSAgInVzYmluLXV2IiwKLQkJCQkJCSAgInVzYmluLW92IiwKLQkJCQkJCSAgInVzYmluLXBsdWdpbiIsCi0JCQkJCQkgICJ1c2Jpbi1zcmMtY2hhbmdlIiwKLQkJCQkJCSAgInVzYmluLWljbC1jaGFuZ2UiLAotCQkJCQkJICAidHlwZS1jLWNoYW5nZSI7Ci0JCQl9OwotCi0JCQlxY29tLGRjLWNoZ3B0aEAxNDAwIHsKLQkJCQlyZWcgPSA8MHgxNDAwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0KLQkJCQkJPDB4MCAweDE0IDB4MCBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQk8MHgwIDB4MTQgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxNCAweDIgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDE0IDB4MyBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQk8MHgwIDB4MTQgMHg0IElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxNCAweDUgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDE0IDB4NiBJUlFfVFlQRV9FREdFX1JJU0lORz47Ci0KLQkJCQlpbnRlcnJ1cHQtbmFtZXMgPSAiZGNpbi1jb2xsYXBzZSIsCi0JCQkJCQkgICJkY2luLWx0LTNwNnYiLAotCQkJCQkJICAiZGNpbi11diIsCi0JCQkJCQkgICJkY2luLW92IiwKLQkJCQkJCSAgImRjaW4tcGx1Z2luIiwKLQkJCQkJCSAgImRpdjItZW4tZGciLAotCQkJCQkJICAiZGNpbi1pY2wtY2hhbmdlIjsKLQkJCX07Ci0KLQkJCXFjb20sY2hnci1taXNjQDE2MDAgewotCQkJCXJlZyA9IDwweDE2MDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPQotCQkJCQk8MHgwIDB4MTYgMHgwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKLQkJCQkJPDB4MCAweDE2IDB4MSBJUlFfVFlQRV9FREdFX1JJU0lORz4sCi0JCQkJCTwweDAgMHgxNiAweDIgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDE2IDB4MyBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQk8MHgwIDB4MTYgMHg0IElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCTwweDAgMHgxNiAweDUgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJPDB4MCAweDE2IDB4NiBJUlFfVFlQRV9FREdFX0ZBTExJTkc+LAotCQkJCQk8MHgwIDB4MTYgMHg3IElSUV9UWVBFX0VER0VfQk9USD47Ci0KLQkJCQlpbnRlcnJ1cHQtbmFtZXMgPSAid2RvZy1zbmFybCIsCi0JCQkJCQkgICJ3ZG9nLWJhcmsiLAotCQkJCQkJICAiYWljbC1mYWlsIiwKLQkJCQkJCSAgImFpY2wtZG9uZSIsCi0JCQkJCQkgICJoaWdoLWR1dHktY3ljbGUiLAotCQkJCQkJICAiaW5wdXQtY3VycmVudC1saW1pdGluZyIsCi0JCQkJCQkgICJ0ZW1wZXJhdHVyZS1jaGFuZ2UiLAotCQkJCQkJICAic3dpdGNoZXItcG93ZXItb2siOwotCQkJfTsKLQkJfTsKLQogCQlwbTY2MF9wZHBoeTogcWNvbSx1c2ItcGRwaHlAMTcwMCB7CiAJCQljb21wYXRpYmxlID0gInFjb20scXBucC1wZHBoeSI7CiAJCQlyZWcgPSA8MHgxNzAwIDB4MTAwPjsKIAkJCXZkZC1wZHBoeS1zdXBwbHkgPSA8JnBtNjYwbF9sNz47Ci0JCQl2YnVzLXN1cHBseSA9IDwmc21iMl92YnVzPjsKLQkJCXZjb25uLXN1cHBseSA9IDwmc21iMl92Y29ubj47CisJCQl2YnVzLXN1cHBseSA9IDwwPjsKKwkJCXZjb25uLXN1cHBseSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MHgwIDB4MTcgMHgwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKIAkJCQkgICAgIDwweDAgMHgxNyAweDEgSVJRX1RZUEVfRURHRV9SSVNJTkc+LAogCQkJCSAgICAgPDB4MCAweDE3IDB4MiBJUlFfVFlQRV9FREdFX1JJU0lORz4sCkBAIC01NTYsMTIzICszNTMsMzEgQEAKIAkJCX07CiAJCX07CiAKLQkJcG02NjBfcnJhZGM6IHJyYWRjQDQ1MDAgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLHJyYWRjIjsKLQkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OwotCQkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MF9yZXZpZD47Ci0JCX07Ci0KLQkJcG02NjBfZmc6IHFwbnAsZmcgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLGZnLWdlbjMiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCXFjb20scG1pYy1yZXZpZCA9IDwmcG02NjBfcmV2aWQ+OwotCQkJaW8tY2hhbm5lbHMgPSA8JnBtNjYwX3JyYWRjIDA+LAotCQkJCSAgICAgIDwmcG02NjBfcnJhZGMgNz47Ci0JCQlpby1jaGFubmVsLW5hbWVzID0gInJyYWRjX2JhdHRfaWQiLAotCQkJCQkgICAicnJhZGNfZGllX3RlbXAiOwotCQkJcWNvbSxycmFkYy1iYXNlID0gPDB4NDUwMD47Ci0JCQlxY29tLGZnLWVzci10aW1lci1hd2FrZSA9IDw5NiA5Nj47Ci0JCQlxY29tLGZnLWVzci10aW1lci1hc2xlZXAgPSA8MjU2IDI1Nj47Ci0JCQlxY29tLGZnLWVzci10aW1lci1jaGFyZ2luZyA9IDwwIDk2PjsKLQkJCXFjb20sY3ljbGUtY291bnRlci1lbjsKLQkJCXN0YXR1cyA9ICJva2F5IjsKLQotCQkJcWNvbSxmZy1iYXR0LXNvY0A0MDAwIHsKLQkJCQlzdGF0dXMgPSAib2theSI7Ci0JCQkJcmVnID0gPDB4NDAwMCAweDEwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwweDAgMHg0MCAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4NDAgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCSAgICAgPDB4MCAweDQwIDB4MgotCQkJCQkJCUlSUV9UWVBFX0VER0VfUklTSU5HPiwKLQkJCQkJICAgICA8MHgwIDB4NDAgMHgzCi0JCQkJCQkJSVJRX1RZUEVfRURHRV9SSVNJTkc+LAotCQkJCQkgICAgIDwweDAgMHg0MCAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4NDAgMHg1Ci0JCQkJCQkJSVJRX1RZUEVfRURHRV9SSVNJTkc+LAotCQkJCQkgICAgIDwweDAgMHg0MCAweDYgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4NDAgMHg3IElSUV9UWVBFX0VER0VfQk9USD47Ci0JCQkJaW50ZXJydXB0LW5hbWVzID0gInNvYy11cGRhdGUiLAotCQkJCQkJICAic29jLXJlYWR5IiwKLQkJCQkJCSAgImJzb2MtZGVsdGEiLAotCQkJCQkJICAibXNvYy1kZWx0YSIsCi0JCQkJCQkgICJtc29jLWxvdyIsCi0JCQkJCQkgICJtc29jLWVtcHR5IiwKLQkJCQkJCSAgIm1zb2MtaGlnaCIsCi0JCQkJCQkgICJtc29jLWZ1bGwiOwotCQkJfTsKLQotCQkJcWNvbSxmZy1iYXR0LWluZm9ANDEwMCB7Ci0JCQkJc3RhdHVzID0gIm9rYXkiOwotCQkJCXJlZyA9IDwweDQxMDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPSA8MHgwIDB4NDEgMHgwIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCSAgICAgPDB4MCAweDQxIDB4MSBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQkgICAgIDwweDAgMHg0MSAweDIgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4NDEgMHgzIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCSAgICAgPDB4MCAweDQxIDB4NiBJUlFfVFlQRV9FREdFX0JPVEg+OwotCQkJCWludGVycnVwdC1uYW1lcyA9ICJ2YmF0dC1wcmVkLWRlbHRhIiwKLQkJCQkJCSAgInZiYXR0LWxvdyIsCi0JCQkJCQkgICJlc3ItZGVsdGEiLAotCQkJCQkJICAiYmF0dC1taXNzaW5nIiwKLQkJCQkJCSAgImJhdHQtdGVtcC1kZWx0YSI7Ci0JCQl9OwotCi0JCQlxY29tLGZnLW1lbWlmQDQ0MDAgewotCQkJCXN0YXR1cyA9ICJva2F5IjsKLQkJCQlyZWcgPSA8MHg0NDAwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDQ0IDB4MCBJUlFfVFlQRV9FREdFX0JPVEg+LAotCQkJCQkgICAgIDwweDAgMHg0NCAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKLQkJCQkJICAgICA8MHgwIDB4NDQgMHgyIElSUV9UWVBFX0VER0VfQk9USD47Ci0JCQkJaW50ZXJydXB0LW5hbWVzID0gImltYS1yZHkiLAotCQkJCQkJICAibWVtLXhjcCIsCi0JCQkJCQkgICJkbWEtZ3JhbnQiOwotCQkJfTsKLQkJfTsKLQotCQliY2xANDIwMCB7CisJCWJjbF9zZW5zb3I6IGJjbEA0MjAwIHsKIAkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tYmNsLWxtaCI7CiAJCQlyZWcgPSA8MHg0MjAwIDB4ZmY+LAogCQkJCTwweDQzMDAgMHhmZj47CiAJCQlyZWctbmFtZXMgPSAiZmdfdXNlcl9hZGMiLAogCQkJCQkiZmdfbG1oIjsKIAkJCWludGVycnVwdHMgPSA8MHgwIDB4NDIgMHgwIElSUV9UWVBFX05PTkU+LAotCQkJCQk8MHgwIDB4NDIgMHgyIElSUV9UWVBFX05PTkU+OwotCQkJaW50ZXJydXB0LW5hbWVzID0gImJjbC1oaWdoLWliYXQtaW50IiwKLQkJCQkJImJjbC1sb3ctdmJhdC1pbnQiOwotCQkJcWNvbSx2YmF0LXBvbGxpbmctZGVsYXktbXMgPSA8MTAwPjsKLQkJCXFjb20saWJhdC1wb2xsaW5nLWRlbGF5LW1zID0gPDEwMD47CisJCQkJCTwweDAgMHg0MiAweDEgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDAgMHg0MiAweDIgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDAgMHg0MiAweDMgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDAgMHg0MiAweDQgSVJRX1RZUEVfTk9ORT47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAiYmNsLWhpZ2gtaWJhdCIsCisJCQkJCQkiYmNsLXZlcnktaGlnaC1pYmF0IiwKKwkJCQkJCSJiY2wtbG93LXZiYXQiLAorCQkJCQkJImJjbC12ZXJ5LWxvdy12YmF0IiwKKwkJCQkJCSJiY2wtY3JpdC1sb3ctdmJhdCI7CisJCQkjdGhlcm1hbC1zZW5zb3ItY2VsbHMgPSA8MT47CiAJCX07CiAJfTsKIAotCXFjb20scG02NjBAMSB7CisJcG02NjBfMTogcWNvbSxwbTY2MEAxIHsKIAkJY29tcGF0aWJsZSA9InFjb20sc3BtaS1wbWljIjsKIAkJcmVnID0gPDB4MSBTUE1JX1VTSUQ+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJcG02NjBfaGFwdGljczogcWNvbSxoYXB0aWNzQGMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtaGFwdGljcyI7Ci0JCQlyZWcgPSA8MHhjMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MHgxIDB4YzAgMHgwIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJICAgICA8MHgxIDB4YzAgMHgxIElSUV9UWVBFX0VER0VfQk9USD47Ci0JCQlpbnRlcnJ1cHQtbmFtZXMgPSAiaGFwLXNjLWlycSIsICJoYXAtcGxheS1pcnEiOwotCQkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MF9yZXZpZD47Ci0JCQlxY29tLHBtaWMtbWlzYyA9IDwmcG02NjBfbWlzYz47Ci0JCQlxY29tLG1pc2MtY2xrLXRyaW0tZXJyb3ItcmVnID0gPDB4ZjM+OwotCQkJcWNvbSxhY3R1YXRvci10eXBlID0gPDA+OwotCQkJcWNvbSxwbGF5LW1vZGUgPSAiZGlyZWN0IjsKLQkJCXFjb20sdm1heC1tdiA9IDwzMjAwPjsKLQkJCXFjb20saWxpbS1tYSA9IDw4MDA+OwotCQkJcWNvbSxzYy1kYmMtY3ljbGVzID0gPDg+OwotCQkJcWNvbSx3YXZlLXBsYXktcmF0ZS11cyA9IDw2NjY3PjsKLQkJCXFjb20sZW4tYnJha2U7Ci0JCQlxY29tLGxyYS1oaWdoLXogPSAib3B0MCI7Ci0JCQlxY29tLGxyYS1hdXRvLXJlcy1tb2RlID0gInF3ZCI7Ci0JCQlxY29tLGxyYS1yZXMtY2FsLXBlcmlvZCA9IDw0PjsKLQkJfTsKIAl9OwogfTsKIApAQCAtNzUxLDQgKzQ1NiwyNDMgQEAKIAkJCX07CiAJCX07CiAJfTsKKworCWliYXQtaGlnaCB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJzdGVwX3dpc2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JmJjbF9zZW5zb3IgMD47CisKKwkJdHJpcHMgeworCQkJaWJhdC1oaWdoIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw0MjAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDIwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWliYXQtdmhpZ2ggeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAic3RlcF93aXNlIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZiY2xfc2Vuc29yIDE+OworCisJCXRyaXBzIHsKKwkJCWliYXQtdmhpZ2ggeworCQkJCXRlbXBlcmF0dXJlID0gPDQzMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJdmJhdF9hZGMgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MTAwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2NhcCI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmYmNsX3NlbnNvciAyPjsKKwkJdHJhY2tzLWxvdzsKKworCQl0cmlwcyB7CisJCQlwbTY2MF92YmF0X2FkYzogdmJhdC1hZGMgeworCQkJCXRlbXBlcmF0dXJlID0gPDMzMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCXZiYXRfbWFwNiB7CisJCQkJdHJpcCA9IDwmcG02NjBfdmJhdF9hZGM+OworCQkJCWNvb2xpbmctZGV2aWNlID0KKwkJCQkJPCZDUFU2IFRIRVJNQUxfTUFYX0xJTUlUCisJCQkJCQlUSEVSTUFMX01BWF9MSU1JVD47CisJCQl9OworCQkJdmJhdF9tYXA3IHsKKwkJCQl0cmlwID0gPCZwbTY2MF92YmF0X2FkYz47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTcgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCX07CisJfTsKKworCXZiYXRfbG93IHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfY2FwIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZiY2xfc2Vuc29yIDM+OworCQl0cmFja3MtbG93OworCisJCXRyaXBzIHsKKwkJCXZiYXQtbG93IHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwzMTAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwl2YmF0X3Rvb19sb3cgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19jYXAiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JmJjbF9zZW5zb3IgND47CisJCXRyYWNrcy1sb3c7CisKKwkJdHJpcHMgeworCQkJdmJhdC10b28tbG93IHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwyOTAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlzb2MgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MTAwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2NhcCI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmYmNsX3NlbnNvciA1PjsKKwkJdHJhY2tzLWxvdzsKKworCQl0cmlwcyB7CisJCQlwbTY2MF9sb3dfc29jOiBsb3ctc29jIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMD47CisJCQkJaHlzdGVyZXNpcyA9IDwwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCXNvY19tYXA2IHsKKwkJCQl0cmlwID0gPCZwbTY2MF9sb3dfc29jPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVNiBUSEVSTUFMX01BWF9MSU1JVAorCQkJCQkJVEhFUk1BTF9NQVhfTElNSVQ+OworCQkJfTsKKwkJCXNvY19tYXA3IHsKKwkJCQl0cmlwID0gPCZwbTY2MF9sb3dfc29jPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVNyBUSEVSTUFMX01BWF9MSU1JVAorCQkJCQkJVEhFUk1BTF9NQVhfTElNSVQ+OworCQkJfTsKKwkJfTsKKwl9OworCisJcG02NjBfdGVtcF9hbGFybTogcG02NjBfdHogeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAic3RlcF93aXNlIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZwbTY2MF90ej47CisKKwkJdHJpcHMgeworCQkJcG02NjBfdHJpcDA6IHBtNjYwLXRyaXAwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCQlwbTY2MF90cmlwMTogcG02NjAtdHJpcDEgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJCXBtNjYwX3RyaXAyOiBwbTY2MC10cmlwMiB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTQ1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDA+OworCQkJCXR5cGUgPSAiY3JpdGljYWwiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCXRyaXAwX2NwdTAgeworCQkJCXRyaXAgPSA8JnBtNjYwX3RyaXAwPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVMCAoVEhFUk1BTF9NQVhfTElNSVQtMSkKKwkJCQkJCShUSEVSTUFMX01BWF9MSU1JVC0xKT47CisJCQl9OworCQkJdHJpcDBfY3B1MSB7CisJCQkJdHJpcCA9IDwmcG02NjBfdHJpcDA+OworCQkJCWNvb2xpbmctZGV2aWNlID0KKwkJCQkJPCZDUFUxIChUSEVSTUFMX01BWF9MSU1JVC0xKQorCQkJCQkJKFRIRVJNQUxfTUFYX0xJTUlULTEpPjsKKwkJCX07CisJCQl0cmlwMF9jcHUyIHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMD47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTIgKFRIRVJNQUxfTUFYX0xJTUlULTEpCisJCQkJCQkoVEhFUk1BTF9NQVhfTElNSVQtMSk+OworCQkJfTsKKwkJCXRyaXAwX2NwdTMgeworCQkJCXRyaXAgPSA8JnBtNjYwX3RyaXAwPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVMyAoVEhFUk1BTF9NQVhfTElNSVQtMSkKKwkJCQkJCShUSEVSTUFMX01BWF9MSU1JVC0xKT47CisJCQl9OworCQkJdHJpcDBfY3B1NCB7CisJCQkJdHJpcCA9IDwmcG02NjBfdHJpcDA+OworCQkJCWNvb2xpbmctZGV2aWNlID0KKwkJCQkJPCZDUFU0IChUSEVSTUFMX01BWF9MSU1JVC0xKQorCQkJCQkJKFRIRVJNQUxfTUFYX0xJTUlULTEpPjsKKwkJCX07CisJCQl0cmlwMF9jcHU1IHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMD47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTUgKFRIRVJNQUxfTUFYX0xJTUlULTEpCisJCQkJCQkoVEhFUk1BTF9NQVhfTElNSVQtMSk+OworCQkJfTsKKwkJCXRyaXAwX2NwdTYgeworCQkJCXRyaXAgPSA8JnBtNjYwX3RyaXAwPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVNiAoVEhFUk1BTF9NQVhfTElNSVQtMSkKKwkJCQkJCShUSEVSTUFMX01BWF9MSU1JVC0xKT47CisJCQl9OworCQkJdHJpcDBfY3B1NyB7CisJCQkJdHJpcCA9IDwmcG02NjBfdHJpcDA+OworCQkJCWNvb2xpbmctZGV2aWNlID0KKwkJCQkJPCZDUFU3IChUSEVSTUFMX01BWF9MSU1JVC0xKQorCQkJCQkJKFRIRVJNQUxfTUFYX0xJTUlULTEpPjsKKwkJCX07CisJCQl0cmlwMV9jcHUxIHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTEgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHUyIHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTIgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHUzIHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTMgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHU0IHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTQgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHU1IHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTUgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHU2IHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTYgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCQl0cmlwMV9jcHU3IHsKKwkJCQl0cmlwID0gPCZwbTY2MF90cmlwMT47CisJCQkJY29vbGluZy1kZXZpY2UgPQorCQkJCQk8JkNQVTcgVEhFUk1BTF9NQVhfTElNSVQKKwkJCQkJCVRIRVJNQUxfTUFYX0xJTUlUPjsKKwkJCX07CisJCX07CisJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG02NjBsLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG02NjBsLmR0c2kKaW5kZXggMDc1ZWFlZjIuLmFhZjVkMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTY2MGwuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG02NjBsLmR0c2kKQEAgLTM5LDkzICszOSwzNSBAQAogCQkJCTxQT05fUE9XRVJfT0ZGX1NIVVRET1dOPjsKIAkJfTsKIAotCQlxY29tLHRlbXAtYWxhcm1AMjQwMCB7CisJCXBtNjYwbF90ejogcWNvbSx0ZW1wLWFsYXJtQDI0MDAgewogCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtdGVtcC1hbGFybSI7CiAJCQlyZWcgPSA8MHgyNDAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8MHgyIDB4MjQgMHgwIElSUV9UWVBFX0VER0VfUklTSU5HPjsKIAkJCWxhYmVsID0gInBtNjYwbF90eiI7CisJCQkjdGhlcm1hbC1zZW5zb3ItY2VsbHMgPSA8MD47CiAJCX07CiAKLQkJcG02NjBsX2dwaW9zOiBncGlvcyB7Ci0JCQljb21wYXRpYmxlID0gInFjb20scXBucC1waW4iOworCQlwbTY2MGxfZ3Bpb3M6IHBpbmN0cmxAYzAwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sc3BtaS1ncGlvIjsKKwkJCXJlZyA9IDwweGMwMDAgMHhjMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDIgMHhjMCAwIElSUV9UWVBFX05PTkU+LAorCQkJCQk8MHgyIDB4YzIgMCBJUlFfVFlQRV9OT05FPiwKKwkJCQkJPDB4MiAweGMzIDAgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDIgMHhjNCAwIElSUV9UWVBFX05PTkU+LAorCQkJCQk8MHgyIDB4YzUgMCBJUlFfVFlQRV9OT05FPiwKKwkJCQkJPDB4MiAweGM2IDAgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDIgMHhjNyAwIElSUV9UWVBFX05PTkU+LAorCQkJCQk8MHgyIDB4YzggMCBJUlFfVFlQRV9OT05FPiwKKwkJCQkJPDB4MiAweGNhIDAgSVJRX1RZUEVfTk9ORT4sCisJCQkJCTwweDIgMHhjYiAwIElSUV9UWVBFX05PTkU+OworCQkJaW50ZXJydXB0LW5hbWVzID0gInBtNjYwbF9ncGlvMSIsICJwbTY2MGxfZ3BpbzMiLAorCQkJCQkicG02NjBsX2dwaW80IiwgInBtNjYwbF9ncGlvNSIsCisJCQkJCSJwbTY2MGxfZ3BpbzYiLCAicG02NjBsX2dwaW83IiwKKwkJCQkJInBtNjYwbF9ncGlvOCIsICJwbTY2MGxfZ3BpbzkiLAorCQkJCQkicG02NjBsX2dwaW8xMSIsICJwbTY2MGxfZ3BpbzEyIjsKIAkJCWdwaW8tY29udHJvbGxlcjsKIAkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWxhYmVsID0gInBtNjYwbC1ncGlvIjsKLQotCQkJZ3Bpb0BjMDAwIHsKLQkJCQlyZWcgPSA8MHhjMDAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8MT47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzEwMCB7Ci0JCQkJcmVnID0gPDB4YzEwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDI+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGMyMDAgewotCQkJCXJlZyA9IDwweGMyMDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDwzPjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjMzAwIHsKLQkJCQlyZWcgPSA8MHhjMzAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8ND47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzQwMCB7Ci0JCQkJcmVnID0gPDB4YzQwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDU+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGM1MDAgewotCQkJCXJlZyA9IDwweGM1MDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDw2PjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjNjAwIHsKLQkJCQlyZWcgPSA8MHhjNjAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8Nz47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AYzcwMCB7Ci0JCQkJcmVnID0gPDB4YzcwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDg+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGM4MDAgewotCQkJCXJlZyA9IDwweGM4MDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDw5PjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQotCQkJZ3Bpb0BjOTAwIHsKLQkJCQlyZWcgPSA8MHhjOTAwIDB4MTAwPjsKLQkJCQlxY29tLHBpbi1udW0gPSA8MTA+OwotCQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCQl9OwotCi0JCQlncGlvQGNhMDAgewotCQkJCXJlZyA9IDwweGNhMDAgMHgxMDA+OwotCQkJCXFjb20scGluLW51bSA9IDwxMT47Ci0JCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJCX07Ci0KLQkJCWdwaW9AY2IwMCB7Ci0JCQkJcmVnID0gPDB4Y2IwMCAweDEwMD47Ci0JCQkJcWNvbSxwaW4tbnVtID0gPDEyPjsKLQkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCQkJfTsKLQorCQkJcWNvbSxncGlvcy1kaXNhbGxvd2VkID0gPDIgMTA+OwogCQl9OwogCX07CiAKQEAgLTI0NCwzNSArMTg2LDYgQEAKIAkJCX07CiAJCX07CiAKLQkJcG02NjBsX3dsZWQ6IHFjb20sbGVkc0BkODAwIHsKLQkJCWNvbXBhdGlibGUgPSAicWNvbSxxcG5wLXdsZWQiOwotCQkJcmVnID0gPDB4ZDgwMCAweDEwMD4sCi0JCQkJPDB4ZDkwMCAweDEwMD47Ci0JCQlyZWctbmFtZXMgPSAicXBucC13bGVkLWN0cmwtYmFzZSIsCi0JCQkJCSJxcG5wLXdsZWQtc2luay1iYXNlIjsKLQkJCWludGVycnVwdHMgPSA8MHgzIDB4ZDggMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKLQkJCWludGVycnVwdC1uYW1lcyA9ICJvdnAtaXJxIjsKLQkJCWxpbnV4LG5hbWUgPSAid2xlZCI7Ci0JCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiYmtsLXRyaWdnZXIiOwotCQkJcWNvbSxmZGJrLW91dHB1dCA9ICJhdXRvIjsKLQkJCXFjb20sdnJlZi11diA9IDwxMjc1MDA+OwotCQkJcWNvbSxzd2l0Y2gtZnJlcS1raHogPSA8ODAwPjsKLQkJCXFjb20sb3ZwLW12ID0gPDI5NjAwPjsKLQkJCXFjb20saWxpbS1tYSA9IDw5NzA+OwotCQkJcWNvbSxib29zdC1kdXR5LW5zID0gPDI2PjsKLQkJCXFjb20sbW9kLWZyZXEta2h6ID0gPDk2MDA+OwotCQkJcWNvbSxkaW0tbW9kZSA9ICJoeWJyaWQiOwotCQkJcWNvbSxoeWItdGhyZXMgPSA8NjI1PjsKLQkJCXFjb20sc3luYy1kbHktdXMgPSA8ODAwPjsKLQkJCXFjb20sZnMtY3Vyci11YSA9IDwyNTAwMD47Ci0JCQlxY29tLGNvbnMtc3luYy13cml0ZS1kZWxheS11cyA9IDwxMDAwPjsKLQkJCXFjb20sbGVkLXN0cmluZ3MtbGlzdCA9IFswMCAwMSAwMl07Ci0JCQlxY29tLGxvb3AtYXV0by1nbS1lbjsKLQkJCXFjb20scG1pYy1yZXZpZCA9IDwmcG02NjBsX3JldmlkPjsKLQkJCXFjb20sYXV0by1jYWxpYnJhdGlvbi1lbmFibGU7Ci0JCQlzdGF0dXMgPSAib2siOwotCQl9OwotCiAJCWZsYXNoX2xlZDogcWNvbSxsZWRzQGQzMDAgewogCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtZmxhc2gtbGVkLXYyIjsKIAkJCXJlZyA9IDwweGQzMDAgMHgxMDA+OwpAQCAtMzgxLDg4ICsyOTQsMzAgQEAKIAkJCQlxY29tLGRlZmF1bHQtbGVkLXRyaWdnZXIgPSAic3dpdGNoMV90cmlnZ2VyIjsKIAkJCX07CiAJCX07CisJfTsKK307CiAKLQkJcG02NjBsX2xjZGI6IHFwbnAtbGNkYkBlYzAwIHsKLQkJCWNvbXBhdGlibGUgPSAicWNvbSxxcG5wLWxjZGItcmVndWxhdG9yIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQlyZWcgPSA8MHhlYzAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MHgzIDB4ZWMgMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKLQkJCWludGVycnVwdC1uYW1lcyA9ICJzYy1pcnEiOworJnRoZXJtYWxfem9uZXMgeworCXBtNjYwbF90eiB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZwbTY2MGxfdHo+OwogCi0JCQlxY29tLHBtaWMtcmV2aWQgPSA8JnBtNjYwbF9yZXZpZD47Ci0KLQkJCWxjZGJfbGRvX3ZyZWc6IGxkbyB7Ci0JCQkJbGFiZWwgPSAibGRvIjsKLQkJCQlyZWd1bGF0b3ItbmFtZSA9ICJsY2RiX2xkbyI7Ci0JCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwMD47Ci0JCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NjAwMDAwMD47CisJCXRyaXBzIHsKKwkJCXBtNjYwbF90cmlwMDogcG02NjBsLXRyaXAwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKIAkJCX07Ci0KLQkJCWxjZGJfbmNwX3ZyZWc6IG5jcCB7Ci0JCQkJbGFiZWwgPSAibmNwIjsKLQkJCQlyZWd1bGF0b3ItbmFtZSA9ICJsY2RiX25jcCI7Ci0JCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwMD47Ci0JCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NjAwMDAwMD47CisJCQkgcG02NjBsX3RyaXAxOiBwbTY2MGwtdHJpcDEgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOwogCQkJfTsKLQkJfTsKLQotCQlwbTY2MGFfb2xlZGI6IHFwbnAtb2xlZGJAZTAwMCB7Ci0JCSAgICAgICBjb21wYXRpYmxlID0gInFjb20scXBucC1vbGVkYi1yZWd1bGF0b3IiOwotCQkgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKLQkJICAgICAgIHFjb20scG1pYy1yZXZpZCA9IDwmcG02NjBsX3JldmlkPjsKLQkJICAgICAgIHJlZyA9IDwweGUwMDAgMHgxMDA+OwotCQkgICAgICAgcWNvbSxwYnMtY2xpZW50ID0gPCZwbTY2MGxfcGJzPjsKLQotCQkgICAgICAgbGFiZWwgPSAib2xlZGIiOwotCQkgICAgICAgcmVndWxhdG9yLW5hbWUgPSAicmVndWxhdG9yLW9sZWRiIjsKLQkJICAgICAgIHJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDUwMDAwMDA+OwotCQkgICAgICAgcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8ODEwMDAwMD47Ci0KLQkJICAgICAgIHFjb20sc3dpcmUtY29udHJvbDsKLQkJICAgICAgIHFjb20sZXh0LXBpbi1jb250cm9sOwotCQkgICAgICAgc3RhdHVzID0gImRpc2FibGVkIjsKLQkJfTsKLQotCQlwbTY2MGFfbGFiaWJiOiBxcG5wLWxhYmliYi1yZWd1bGF0b3IgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtbGFiaWJiLXJlZ3VsYXRvciI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MGxfcmV2aWQ+OwotCQkJcWNvbSxzd2lyZS1jb250cm9sOwotCQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQotCQkJaWJiX3JlZ3VsYXRvcjogcWNvbSxpYmJAZGMwMCB7Ci0JCQkJcmVnID0gPDB4ZGMwMCAweDEwMD47Ci0JCQkJcmVnLW5hbWVzID0gImliYl9yZWciOwotCQkJCXJlZ3VsYXRvci1uYW1lID0gImliYl9yZWciOwotCi0JCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwMD47Ci0JCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NjMwMDAwMD47Ci0KLQkJCQlxY29tLHFwbnAtaWJiLW1pbi12b2x0YWdlID0gPDE0MDAwMDA+OwotCQkJCXFjb20scXBucC1pYmItc3RlcC1zaXplID0gPDEwMDAwMD47Ci0JCQkJcWNvbSxxcG5wLWliYi1zbGV3LXJhdGUgPSA8MjAwMDAwMD47Ci0JCQkJcWNvbSxxcG5wLWliYi1pbml0LXZvbHRhZ2UgPSA8NDAwMDAwMD47Ci0JCQkJcWNvbSxxcG5wLWliYi1pbml0LWFtb2xlZC12b2x0YWdlID0gPDQwMDAwMDA+OwotCQkJfTsKLQotCQkJbGFiX3JlZ3VsYXRvcjogcWNvbSxsYWJAZGUwMCB7Ci0JCQkJcmVnID0gPDB4ZGUwMCAweDEwMD47Ci0JCQkJcmVnLW5hbWVzID0gImxhYiI7Ci0JCQkJcmVndWxhdG9yLW5hbWUgPSAibGFiX3JlZyI7Ci0KLQkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw0NjAwMDAwPjsKLQkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw2MTAwMDAwPjsKLQotCQkJCXFjb20scXBucC1sYWItbWluLXZvbHRhZ2UgPSA8NDYwMDAwMD47Ci0JCQkJcWNvbSxxcG5wLWxhYi1zdGVwLXNpemUgPSA8MTAwMDAwPjsKLQkJCQlxY29tLHFwbnAtbGFiLXNsZXctcmF0ZSA9IDw1MDAwPjsKLQkJCQlxY29tLHFwbnAtbGFiLWluaXQtdm9sdGFnZSA9IDw0NjAwMDAwPjsKLQkJCQlxY29tLHFwbnAtbGFiLWluaXQtYW1vbGVkLXZvbHRhZ2UgPSA8NDYwMDAwMD47Ci0KLQkJCQlxY29tLG5vdGlmeS1sYWItdnJlZy1vay1zdHM7CisJCQkgcG02NjBsX3RyaXAyOiBwbTY2MGwtdHJpcDIgeworCQkJCXRlbXBlcmF0dXJlID0gPDE0NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwwPjsKKwkJCQl0eXBlID0gImNyaXRpY2FsIjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTg5OTguZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbTg5OTguZHRzaQppbmRleCA0NTAyOTVlLi4wMTNhYzQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG04OTk4LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3BtODk5OC5kdHNpCkBAIC0xOTIsNiArMTkyLDMzIEBACiAJCQlxY29tLGZhc3QtYXZnLXNldHVwID0gPDA+OwogCQkJI3RoZXJtYWwtc2Vuc29yLWNlbGxzID0gPDE+OwogCQl9OworCisJCXBtODk5OF9kaXZfY2xrMTogcWNvbSxjbGtkaXZANWIwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20scXBucC1jbGtkaXYiOworCQkJcmVnID0gPDB4NWIwMCAweDEwMD47CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQlxY29tLGN4by1mcmVxID0gPDE5MjAwMDAwPjsKKwkJCXFjb20sY2xrZGl2LWlkID0gPDE+OworCQkJcWNvbSxjbGtkaXYtaW5pdC1mcmVxID0gPDE5MjAwMDAwPjsKKwkJfTsKKworCQlwbTg5OThfZGl2X2NsazI6IHFjb20sY2xrZGl2QDVjMDAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtY2xrZGl2IjsKKwkJCXJlZyA9IDwweDVjMDAgMHgxMDA+OworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJcWNvbSxjeG8tZnJlcSA9IDwxOTIwMDAwMD47CisJCQlxY29tLGNsa2Rpdi1pZCA9IDwyPjsKKwkJCXFjb20sY2xrZGl2LWluaXQtZnJlcSA9IDwxOTIwMDAwMD47CisJCX07CisKKwkJcG04OTk4X2Rpdl9jbGszOiBxY29tLGNsa2RpdkA1ZDAwIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxxcG5wLWNsa2RpdiI7CisJCQlyZWcgPSA8MHg1ZDAwIDB4MTAwPjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJCXFjb20sY3hvLWZyZXEgPSA8MTkyMDAwMDA+OworCQkJcWNvbSxjbGtkaXYtaWQgPSA8Mz47CisJCQlxY29tLGNsa2Rpdi1pbml0LWZyZXEgPSA8MTkyMDAwMDA+OworCQl9OwogCX07CiAKIAlxY29tLHBtODk5OEAxIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbWk4OTk4LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcG1pODk5OC5kdHNpCmluZGV4IGE4YjgyNmEuLjFlZTZkNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9wbWk4OTk4LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3BtaTg5OTguZHRzaQpAQCAtMzI4LDcgKzMyOCw4IEBACiAJCQkJcmVnID0gPDB4NDQwMCAweDEwMD47CiAJCQkJaW50ZXJydXB0cyA9IDwweDIgMHg0NCAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKIAkJCQkJICAgICA8MHgyIDB4NDQgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCi0JCQkJCSAgICAgPDB4MiAweDQ0IDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+OworCQkJCQkgICAgIDwweDIgMHg0NCAweDIKKwkJCQkJCQlJUlFfVFlQRV9FREdFX1JJU0lORz47CiAJCQkJaW50ZXJydXB0LW5hbWVzID0gImltYS1yZHkiLAogCQkJCQkJICAibWVtLXhjcCIsCiAJCQkJCQkgICJkbWEtZ3JhbnQiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTdhMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBRQ1M2MDUgUE02NjAgKyBQTTY2MEwgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20scWNzNjA1LWNkcCIsICJxY29tLHFjczYwNSIsICJxY29tLGNkcCI7CisJcWNvbSxtc20taWQgPSA8MzQ3IDB4MD47CisJcWNvbSxib2FyZC1pZCA9IDwxIDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWNkcC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzOGE1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUtY2RwLmR0cwpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJxY3M2MDUuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBRQ1M2MDUgUE02NjAgKyBQTTY2MEwgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20scWNzNjA1LWNkcCIsICJxY29tLHFjczYwNSIsICJxY29tLGNkcCI7CisJcWNvbSxib2FyZC1pZCA9IDwxIDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUtZXh0ZXJuYWwtY29kZWMtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDM5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFFDUzYwNSBQTTY2MCArIFBNNjYwTCBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHFjczYwNS1tdHAiLCAicWNvbSxxY3M2MDUiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDM0NyAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS1leHRlcm5hbC1jb2RlYy1tdHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS1leHRlcm5hbC1jb2RlYy1tdHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYzNmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LWV4dGVybmFsLWNvZGVjLW10cC5kdHMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAicWNzNjA1LmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gUUNTNjA1IFBNNjYwICsgUE02NjBMIEV4dC4gQXVkaW8gQ29kZWMgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20scWNzNjA1LW10cCIsICJxY29tLHFjczYwNSIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZCA9IDw4IDE+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjc0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFFDUzYwNSBQTTY2MCArIFBNNjYwTCBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxxY3M2MDUtbXRwIiwgInFjb20scWNzNjA1IiwgInFjb20sbXRwIjsKKwlxY29tLG1zbS1pZCA9IDwzNDcgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDggMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMTAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDEwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDEwMTFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUtbXRwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzdiMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS1tdHAuZHRzCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKworI2luY2x1ZGUgInFjczYwNS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFFDUzYwNSBQTTY2MCArIFBNNjYwTCBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxxY3M2MDUtbXRwIiwgInFjb20scWNzNjA1IiwgInFjb20sbXRwIjsKKwlxY29tLGJvYXJkLWlkID0gPDggMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMTAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDEwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDEwMTFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5oIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS5kdHMKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIHNvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5oCmNvcHkgdG8gYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS5kdHMKaW5kZXggOGEwMjMyZS4uMjhjNDE3ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS5kdHMKQEAgLTcsMTQgKzcsMTYgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2lmbmRlZiBfX0FVRElPX0VYVF9DTEtfVVBfSF8KLSNkZWZpbmUgX19BVURJT19FWFRfQ0xLX1VQX0hfCisvZHRzLXYxLzsKIAotaW50IGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1faW5pdCh2b2lkKTsKLXZvaWQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpOworI2luY2x1ZGUgInFjczYwNS5kdHNpIgogCi0jZW5kaWYKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBRQ1M2MDUgU29DIjsKKwljb21wYXRpYmxlID0gInFjb20scWNzNjA1IjsKKwlxY29tLGJvYXJkLWlkID0gPDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmggYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vcWNzNjA1LmR0c2kKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIHNvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5oCmNvcHkgdG8gYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3FjczYwNS5kdHNpCmluZGV4IDhhMDIzMmUuLjEyZGE2NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5oCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9xY3M2MDUuZHRzaQpAQCAtNywxNCArNywxMyBAQAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaWZuZGVmIF9fQVVESU9fRVhUX0NMS19VUF9IXwotI2RlZmluZSBfX0FVRElPX0VYVF9DTEtfVVBfSF8KKyNpbmNsdWRlICJzZGE2NzAuZHRzaSIKIAotaW50IGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1faW5pdCh2b2lkKTsKLXZvaWQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpOwotCi0jZW5kaWYKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBRQ1M2MDUiOworCXFjb20sbXNtLWlkID0gPDM0NyAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtY2RwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1jZHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxZWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtY2RwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBNjcwIFBNNjYwICsgUE02NjBMIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTY3MC1jZHAiLCAicWNvbSxzZGE2NzAiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDMzNyAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1jZHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1jZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjM0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLWNkcC5kdHMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAic2RhNjcwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBNjcwIFBNNjYwICsgUE02NjBMIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTY3MC1jZHAiLCAicWNvbSxzZGE2NzAiLCAicWNvbSxjZHAiOworCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1tdHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLW10cC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhlOGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTREE2NzAgUE02NjAgKyBQTTY2MEwgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhNjcwLW10cCIsICJxY29tLHNkYTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxtc20taWQgPSA8MzM3IDB4MD47CisJcWNvbSxib2FyZC1pZCA9IDw4IDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLW10cC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLW10cC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyM2I0NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtbXRwLmR0cwpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZGE2NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTREE2NzAgUE02NjAgKyBQTTY2MEwgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhNjcwLW10cCIsICJxY29tLHNkYTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZCA9IDw4IDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLWNkcC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQTY3MCBQTTY2MCArIFBNNjYwQSBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE2NzAtY2RwIiwgInFjb20sc2RhNjcwIiwgInFjb20sY2RwIjsKKwlxY29tLG1zbS1pZCA9IDwzMzcgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLXBtNjYwYS1jZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYmYyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLXBtNjYwYS1jZHAuZHRzCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKworI2luY2x1ZGUgInNkYTY3MC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQTY3MCBQTTY2MCArIFBNNjYwQSBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE2NzAtY2RwIiwgInFjb20sc2RhNjcwIiwgInFjb20sY2RwIjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLW10cC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU1YjExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBNjcwIFBNNjYwICsgUE02NjBBIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTY3MC1tdHAiLCAicWNvbSxzZGE2NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNyAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC1wbTY2MGEtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLW10cC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNmFhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAtcG02NjBhLW10cC5kdHMKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAic2RhNjcwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBNjcwIFBNNjYwICsgUE02NjBBIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTY3MC1tdHAiLCAicWNvbSxzZGE2NzAiLCAicWNvbSxtdHAiOworCXFjb20sYm9hcmQtaWQgPSA8OCAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmggYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLmR0cwpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLmR0cwppbmRleCA4YTAyMzJlLi44ODUyZTMwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuaAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLmR0cwpAQCAtNywxNCArNywxNiBAQAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaWZuZGVmIF9fQVVESU9fRVhUX0NMS19VUF9IXwotI2RlZmluZSBfX0FVRElPX0VYVF9DTEtfVVBfSF8KKy9kdHMtdjEvOwogCi1pbnQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9pbml0KHZvaWQpOwotdm9pZCBhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2V4aXQodm9pZCk7CisjaW5jbHVkZSAic2RhNjcwLmR0c2kiCiAKLSNlbmRpZgorLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQTY3MCBTb0MiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE2NzAiOworCXFjb20sYm9hcmQtaWQgPSA8MCAwPjsKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuaCBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE2NzAuZHRzaQpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhNjcwLmR0c2kKaW5kZXggOGEwMjMyZS4uZDE5YWFjMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTY3MC5kdHNpCkBAIC03LDE0ICs3LDEzIEBACiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpZm5kZWYgX19BVURJT19FWFRfQ0xLX1VQX0hfCi0jZGVmaW5lIF9fQVVESU9fRVhUX0NMS19VUF9IXworI2luY2x1ZGUgInNkbTY3MC5kdHNpIgogCi1pbnQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9pbml0KHZvaWQpOwotdm9pZCBhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2V4aXQodm9pZCk7Ci0KLSNlbmRpZgorLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQTY3MCI7CisJcWNvbSxtc20taWQgPSA8MzM3IDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS00ay1wYW5lbC1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LTRrLXBhbmVsLWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBhNTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS00ay1wYW5lbC1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWNkcC5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1jZHAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gc2RhODQ1IDRLIERpc3BsYXkgUGFuZWwgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhODQ1LWNkcCIsICJxY29tLHNkYTg0NSIsICJxY29tLGNkcCI7CisJcWNvbSxtc20taWQgPSA8MzQxIDB4MTAwMDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAxPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJm1kc3NfbWRwIHsKKwljb25uZWN0b3JzID0gPCZzZGVfcnNjYyAmc2RlX3diPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlb19kaXNwbGF5IHsKKwlxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LTRrLXBhbmVsLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtNGstcGFuZWwtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZmIyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LTRrLXBhbmVsLW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIHNkYTg0NSA0SyBEaXNwbGF5IFBhbmVsIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NS1tdHAiLCAicWNvbSxzZGE4NDUiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDM0MSAweDEwMDAwPjsKKwlxY29tLGJvYXJkLWlkID0gPDggMT47Cit9OworCismZHNpX250MzU1OTdfdHJ1bHlfZHNjX2NtZF9kaXNwbGF5IHsKKwkvZGVsZXRlLXByb3BlcnR5LyBxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CisKKyZtZHNzX21kcCB7CisJY29ubmVjdG9ycyA9IDwmc2RlX3JzY2MgJnNkZV93YiAmc2RlX2RwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlb19kaXNwbGF5IHsKKwlxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LTRrLXBhbmVsLXFyZC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtNGstcGFuZWwtcXJkLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmZlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LTRrLXBhbmVsLXFyZC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtcXJkLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LXFyZC1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBzZGE4NDUgNEsgRGlzcGxheSBQYW5lbCBRUkQiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE4NDUtcXJkIiwgInFjb20sc2RhODQ1IiwgInFjb20scXJkIjsKKwlxY29tLG1zbS1pZCA9IDwzNDEgMHgxMDAwMD47CisJcWNvbSxib2FyZC1pZCA9IDwxMSAxPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW8geworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gImR1YWxfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNTIgMD47CisJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA2IDA+OworCXFjb20sbWRzcy1kc2ktcGFuZWwtb3JpZW50YXRpb24gPSAiMTgwIjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47CisJcWNvbSxtZHNzLWRzaS1wYW5lbC1vcmllbnRhdGlvbiA9ICIxODAiOworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW9fZGlzcGxheSB7CisJcWNvbSxkc2ktZGlzcGxheS1hY3RpdmU7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ0MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWNkcC1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBzZGE4NDUgdjEgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhODQ1LWNkcCIsICJxY29tLHNkYTg0NSIsICJxY29tLGNkcCI7CisJcWNvbSxtc20taWQgPSA8MzQxIDB4MTAwMDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNThlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDMyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIHNkYTg0NSB2MSBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE4NDUtbXRwIiwgInFjb20sc2RhODQ1IiwgInFjb20sbXRwIjsKKwlxY29tLG1zbS1pZCA9IDwzNDEgMHgxMDAwMD47CisJcWNvbSxib2FyZC1pZCA9IDw4IDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtcXJkLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS1xcmQtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzY2RhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtcXJkLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTg0NS1zZGUtZGlzcGxheS5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1xcmQuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtcXJkLWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIHNkYTg0NSB2MSBRUkQiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG04NDUtcXJkIiwgInFjb20sc2RtODQ1IiwgInFjb20scXJkIjsKKwlxY29tLG1zbS1pZCA9IDwzNDEgMHgxMDAwMD47CisJcWNvbSxib2FyZC1pZCA9IDwxMSAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLTRrLXBhbmVsLWNkcC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItNGstcGFuZWwtY2RwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzQ0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLTRrLXBhbmVsLWNkcC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWNkcC1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBzZGE4NDUgdjIgNEsgRGlzcGxheSBQYW5lbCBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE4NDUtY2RwIiwgInFjb20sc2RhODQ1IiwgInFjb20sY2RwIjsKKwlxY29tLG1zbS1pZCA9IDwzNDEgMHgyMDAwMD47CisJcWNvbSxib2FyZC1pZCA9IDwxIDE+OworfTsKKworJmRzaV9udDM1NTk3X3RydWx5X2RzY19jbWRfZGlzcGxheSB7CisJL2RlbGV0ZS1wcm9wZXJ0eS8gcWNvbSxkc2ktZGlzcGxheS1hY3RpdmU7Cit9OworCismbWRzc19tZHAgeworCWNvbm5lY3RvcnMgPSA8JnNkZV9yc2NjICZzZGVfd2I+OworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW8geworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gImR1YWxfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNTIgMD47CisJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA2IDA+OworfTsKKworJmRzaV9zaGFycF80a19kc2NfY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvX2Rpc3BsYXkgeworCXFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItNGstcGFuZWwtbXRwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi00ay1wYW5lbC1tdHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMTBkMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItNGstcGFuZWwtbXRwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsNjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTg0NS1zZGUtZGlzcGxheS5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gc2RhODQ1IHYyIDRLIERpc3BsYXkgUGFuZWwgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhODQ1LW10cCIsICJxY29tLHNkYTg0NSIsICJxY29tLG10cCI7CisJcWNvbSxtc20taWQgPSA8MzQxIDB4MjAwMDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAxPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJm1kc3NfbWRwIHsKKwljb25uZWN0b3JzID0gPCZzZGVfcnNjYyAmc2RlX3diICZzZGVfZHA+OworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW8geworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gImR1YWxfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNTIgMD47CisJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA2IDA+OworfTsKKworJmRzaV9zaGFycF80a19kc2NfY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvX2Rpc3BsYXkgeworCXFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItNGstcGFuZWwtcXJkLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi00ay1wYW5lbC1xcmQtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2MWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItNGstcGFuZWwtcXJkLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsNjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTg0NS1zZGUtZGlzcGxheS5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1xcmQuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtcXJkLWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIHNkYTg0NSB2MiA0SyBEaXNwbGF5IFBhbmVsIFFSRCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NS1xcmQiLCAicWNvbSxzZGE4NDUiLCAicWNvbSxxcmQiOworCXFjb20sbXNtLWlkID0gPDM0MSAweDIwMDAwPjsKKwlxY29tLGJvYXJkLWlkID0gPDExIDE+OworfTsKKworJmRzaV9udDM1NTk3X3RydWx5X2RzY19jbWRfZGlzcGxheSB7CisJL2RlbGV0ZS1wcm9wZXJ0eS8gcWNvbSxkc2ktZGlzcGxheS1hY3RpdmU7Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlbyB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47CisJcWNvbSxtZHNzLWRzaS1wYW5lbC1vcmllbnRhdGlvbiA9ICIxODAiOworfTsKKworJmRzaV9zaGFycF80a19kc2NfY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKKwlxY29tLG1kc3MtZHNpLXBhbmVsLW9yaWVudGF0aW9uID0gIjE4MCI7Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlb19kaXNwbGF5IHsKKwlxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLWNkcC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItY2RwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTY2YzBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWNkcC5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1jZHAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gc2RhODQ1IHYyIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NS1jZHAiLCAicWNvbSxzZGE4NDUiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDM0MSAweDIwMDAwPjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi1tdHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLW10cC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQyMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LW10cC5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBzZGE4NDUgdjIgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RhODQ1LW10cCIsICJxY29tLHNkYTg0NSIsICJxY29tLG10cCI7CisJcWNvbSxtc20taWQgPSA8MzQxIDB4MjAwMDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLXFyZC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjItcXJkLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZGExYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLXFyZC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LXFyZC5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1xcmQtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBODQ1IHYyIFFSRCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NS1xcmQiLCAicWNvbSxzZGE4NDUiLCAicWNvbSxxcmQiOworCXFjb20sbXNtLWlkID0gPDM0MSAweDIwMDAwPjsKKwlxY29tLGJvYXJkLWlkID0gPDExIDA+OworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaCBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjIuZHRzCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBpbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLmR0cwppbmRleCBiYzFjZDllLi4zOGFiNWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi5kdHMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC04LDE1ICs4LDE0IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KLSNpZm5kZWYgX19EU1BfREVCVUdfSF8KLSNkZWZpbmUgX19EU1BfREVCVUdfSF8KIAotdHlwZWRlZiBpbnQgKCpkc3Bfc3RhdGVfY2IpKGludCBzdGF0ZSk7Ci1pbnQgZHNwX2RlYnVnX3JlZ2lzdGVyKGRzcF9zdGF0ZV9jYiBwdHIpOworL2R0cy12MS87CiAKLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIRUQgICAgICAgICAweDAKLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIX0RVTVBfRE9ORSAweDEKKyNpbmNsdWRlICJzZGE4NDUtdjIuZHRzaSIKIAotI2VuZGlmCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RBODQ1IHYyIFNvQyI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkYTg0NSI7CisJcWNvbSxib2FyZC1pZCA9IDwwIDA+OworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaCBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUtdjIuZHRzaQpzaW1pbGFyaXR5IGluZGV4IDYxJQpjb3B5IGZyb20gaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCmNvcHkgdG8gYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS12Mi5kdHNpCmluZGV4IGJjMWNkOWUuLmRmMWYwZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LXYyLmR0c2kKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC04LDE1ICs4LDExIEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KLSNpZm5kZWYgX19EU1BfREVCVUdfSF8KLSNkZWZpbmUgX19EU1BfREVCVUdfSF8KIAotdHlwZWRlZiBpbnQgKCpkc3Bfc3RhdGVfY2IpKGludCBzdGF0ZSk7Ci1pbnQgZHNwX2RlYnVnX3JlZ2lzdGVyKGRzcF9zdGF0ZV9jYiBwdHIpOworI2luY2x1ZGUgInNkbTg0NS12Mi5kdHNpIgogCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSEVEICAgICAgICAgMHgwCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSF9EVU1QX0RPTkUgMHgxCi0KLSNlbmRpZgorLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQSA4NDUgVjIiOworCXFjb20sbXNtLWlkID0gPDM0MSAweDIwMDAwPjsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmggYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LmR0cwpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCmNvcHkgdG8gYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS5kdHMKaW5kZXggYmMxY2Q5ZS4uNjk4Mzg4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUuZHRzCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtOCwxNSArOCwxNCBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgogICovCi0jaWZuZGVmIF9fRFNQX0RFQlVHX0hfCi0jZGVmaW5lIF9fRFNQX0RFQlVHX0hfCiAKLXR5cGVkZWYgaW50ICgqZHNwX3N0YXRlX2NiKShpbnQgc3RhdGUpOwotaW50IGRzcF9kZWJ1Z19yZWdpc3Rlcihkc3Bfc3RhdGVfY2IgcHRyKTsKKy9kdHMtdjEvOwogCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSEVEICAgICAgICAgMHgwCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSF9EVU1QX0RPTkUgMHgxCisjaW5jbHVkZSAic2RhODQ1LmR0c2kiCiAKLSNlbmRpZgorLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNEQTg0NSB2MSBTb0MiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZGE4NDUiOworCXFjb20sYm9hcmQtaWQgPSA8MCAwPjsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmggYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RhODQ1LmR0c2kKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGluY2x1ZGUvbGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaApjb3B5IHRvIGFyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZGE4NDUuZHRzaQppbmRleCBiYzFjZDllLi5hYTliNzMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkYTg0NS5kdHNpCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtOCwxNSArOCwxMSBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgogICovCi0jaWZuZGVmIF9fRFNQX0RFQlVHX0hfCi0jZGVmaW5lIF9fRFNQX0RFQlVHX0hfCiAKLXR5cGVkZWYgaW50ICgqZHNwX3N0YXRlX2NiKShpbnQgc3RhdGUpOwotaW50IGRzcF9kZWJ1Z19yZWdpc3Rlcihkc3Bfc3RhdGVfY2IgcHRyKTsKKyNpbmNsdWRlICJzZG04NDUuZHRzaSIKIAotI2RlZmluZSBEU1BfU1RBVEVfQ1JBU0hFRCAgICAgICAgIDB4MAotI2RlZmluZSBEU1BfU1RBVEVfQ1JBU0hfRFVNUF9ET05FIDB4MQotCi0jZW5kaWYKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTREEgODQ1IjsKKwlxY29tLG1zbS1pZCA9IDwzNDEgMHgxMDAwMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmI4MTQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlICJzZG02NzAtd2NkLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLXdzYTg4MXguZHRzaSIKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGF1ZGlvLWV4dC1jbGsuaD4KKworJnRhdmlsX3NuZCB7CisJcWNvbSxtc20tbWkycy1tYXN0ZXIgPSA8MT4sIDwxPiwgPDE+LCA8MT4sIDwxPjsKKwlxY29tLGF1ZGlvLXJvdXRpbmcgPQorCQkiQUlGNCBWSSIsICJNQ0xLIiwKKwkJIlJYX0JJQVMiLCAiTUNMSyIsCisJCSJNQURJTlBVVCIsICJNQ0xLIiwKKwkJImhpZmkgYW1wIiwgIkxJTkVPVVQxIiwKKwkJImhpZmkgYW1wIiwgIkxJTkVPVVQyIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTMiIsCisJCSJNSUMgQklBUzIiLCAiSGVhZHNldCBNaWMiLAorCQkiQU1JQzMiLCAiTUlDIEJJQVMyIiwKKwkJIk1JQyBCSUFTMiIsICJBTkNSaWdodCBIZWFkc2V0IE1pYyIsCisJCSJBTUlDNCIsICJNSUMgQklBUzIiLAorCQkiTUlDIEJJQVMyIiwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiLAorCQkiQU1JQzUiLCAiTUlDIEJJQVMzIiwKKwkJIk1JQyBCSUFTMyIsICJIYW5kc2V0IE1pYyIsCisJCSJETUlDMCIsICJNSUMgQklBUzEiLAorCQkiTUlDIEJJQVMxIiwgIkRpZ2l0YWwgTWljMCIsCisJCSJETUlDMSIsICJNSUMgQklBUzEiLAorCQkiTUlDIEJJQVMxIiwgIkRpZ2l0YWwgTWljMSIsCisJCSJETUlDMiIsICJNSUMgQklBUzMiLAorCQkiTUlDIEJJQVMzIiwgIkRpZ2l0YWwgTWljMiIsCisJCSJETUlDMyIsICJNSUMgQklBUzMiLAorCQkiTUlDIEJJQVMzIiwgIkRpZ2l0YWwgTWljMyIsCisJCSJETUlDNCIsICJNSUMgQklBUzQiLAorCQkiTUlDIEJJQVM0IiwgIkRpZ2l0YWwgTWljNCIsCisJCSJETUlDNSIsICJNSUMgQklBUzQiLAorCQkiTUlDIEJJQVM0IiwgIkRpZ2l0YWwgTWljNSIsCisJCSJTcGtyTGVmdCBJTiIsICJTUEsxIE9VVCIsCisJCSJTcGtyUmlnaHQgSU4iLCAiU1BLMiBPVVQiOworCisJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwxPjsKKwlxY29tLG1zbS1tYmhjLWduZC1zd2ggPSA8MT47CisJcWNvbSxocGgtZW4wLWdwaW8gPSA8JnRhdmlsX2hwaF9lbjA+OworCXFjb20saHBoLWVuMS1ncGlvID0gPCZ0YXZpbF9ocGhfZW4xPjsKKwlxY29tLG1zbS1tY2xrLWZyZXEgPSA8OTYwMDAwMD47CisJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47CisJYXNvYy1jb2RlYy1uYW1lcyA9ICJtc20tc3R1Yi1jb2RlYy4xIjsKKwlxY29tLHdzYS1tYXgtZGV2cyA9IDwyPjsKKwlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzAyMTE+LCA8JndzYTg4MXhfMDIxMj4sCisJCTwmd3NhODgxeF8wMjEzPiwgPCZ3c2E4ODF4XzAyMTQ+OworCXFjb20sd3NhLWF1eC1kZXYtcHJlZml4ID0gIlNwa3JMZWZ0IiwgIlNwa3JSaWdodCIsCisJCSJTcGtyTGVmdCIsICJTcGtyUmlnaHQiOworfTsKKworJmludF9jb2RlYyB7CisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIlJYX0JJQVMiLCAiSU5UX01DTEswIiwKKwkJIlNQS19SWF9CSUFTIiwgIklOVF9NQ0xLMCIsCisJCSJJTlRfTERPX0giLCAiSU5UX01DTEswIiwKKwkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIkhhbmRzZXQgTWljIiwKKwkJIk1JQyBCSUFTIEV4dGVybmFsMiIsICJIZWFkc2V0IE1pYyIsCisJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJTZWNvbmRhcnkgTWljIiwKKwkJIkFNSUMxIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTIEV4dGVybmFsMiIsCisJCSJBTUlDMyIsICJNSUMgQklBUyBFeHRlcm5hbCIsCisJCSJETUlDMSIsICJNSUMgQklBUyBFeHRlcm5hbCIsCisJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMgRXh0ZXJuYWwiLAorCQkiTUlDIEJJQVMgRXh0ZXJuYWwiLCAiRGlnaXRhbCBNaWMyIiwKKwkJIkRNSUMzIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKKwkJIk1JQyBCSUFTIEV4dGVybmFsIiwgIkRpZ2l0YWwgTWljMyIsCisJCSJETUlDNCIsICJNSUMgQklBUyBFeHRlcm5hbCIsCisJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAorCQkiU3BrckxlZnQgSU4iLCAiU1BLMSBPVVQiLAorCQkiU3BrclJpZ2h0IElOIiwgIlNQSzIgT1VUIiwKKwkJIlBETV9JTl9SWDEiLCAiUERNX09VVF9SWDEiLAorCQkiUERNX0lOX1JYMiIsICJQRE1fT1VUX1JYMiIsCisJCSJQRE1fSU5fUlgzIiwgIlBETV9PVVRfUlgzIiwKKwkJIkFEQzFfSU4iLCAiQURDMV9PVVQiLAorCQkiQURDMl9JTiIsICJBREMyX09VVCIsCisJCSJBREMzX0lOIiwgIkFEQzNfT1VUIjsKKworCXFjb20sbXNtLW1pMnMtbWFzdGVyID0gPDE+LCA8MT4sIDwxPiwgPDE+LCA8MT47CisJcWNvbSxtc20tbWNsay1mcmVxID0gPDk2MDAwMDA+OworCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MT47CisJcWNvbSxtc20tbWJoYy1nbmQtc3doID0gPDE+OworCXFjb20sbXNtLW1pY2JpYXMyLWV4dC1jYXA7CisJcWNvbSxtc20taHMtbWljYmlhcy10eXBlID0gImV4dGVybmFsIjsKKwlxY29tLGNkYy1wZG0tZ3Bpb3MgPSA8JmNkY19wZG1fZ3Bpb3M+OworCXFjb20sY2RjLWNvbXAtZ3Bpb3MgPSA8JmNkY19jb21wX2dwaW9zPjsKKwlxY29tLGNkYy1kbWljLWdwaW9zID0gPCZjZGNfZG1pY19ncGlvcz47CisKKwlhc29jLWNvZGVjID0gPCZzdHViX2NvZGVjPiwgPCZtc21fZGlnaXRhbF9jb2RlYz4sCisJCSAgICAgPCZwbWljX2FuYWxvZ19jb2RlYz4sIDwmbXNtX3Nkd19jb2RlYz47CisJYXNvYy1jb2RlYy1uYW1lcyA9ICJtc20tc3R1Yi1jb2RlYy4xIiwgIm1zbS1kaWctY29kZWMiLAorCQkJICAgImFuYWxvZy1jb2RlYyIsICJtc21fc2R3X2NvZGVjIjsKKworCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OworCXFjb20sd3NhLWRldnMgPSA8JndzYTg4MXhfMjExX2VuPiwgPCZ3c2E4ODF4XzIxMl9lbj4sCisJCQk8JndzYTg4MXhfMjEzX2VuPiwgPCZ3c2E4ODF4XzIxNF9lbj47CisJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrckxlZnQiLCAiU3BrclJpZ2h0IiwKKwkJCQkgICJTcGtyTGVmdCIsICJTcGtyUmlnaHQiOworfTsKKworJnNvYyB7CisJd2NkX3VzYmNfYW5hbG9nX2VuMV9ncGlvOiBtc21fY2RjX3BpbmN0cmxfdXNiY19hdWRpb19lbjEgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKKwkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7CisJCXBpbmN0cmwtMCA9IDwmd2NkX3VzYmNfYW5hbG9nX2VuMV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JndjZF91c2JjX2FuYWxvZ19lbjFfaWRsZT47CisJfTsKKworCWNkY19wZG1fZ3Bpb3M6IGNkY19wZG1fcGluY3RybCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOworCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKKwkJcGluY3RybC0wID0gPCZjZGNfcGRtX2Nsa19hY3RpdmUgJmNkY19wZG1fc3luY19hY3RpdmUKKwkJCSAgICAgJmNkY19wZG1fcngwX2FjdGl2ZSAmY2RjX3BkbV9yeDFfMl9hY3RpdmUKKwkJCSAgICAgJmNkY19wZG1fMl9ncGlvc19hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JmNkY19wZG1fY2xrX3NsZWVwICZjZGNfcGRtX3N5bmNfc2xlZXAKKwkJCSAgICAgJmNkY19wZG1fcngwX3NsZWVwICZjZGNfcGRtX3J4MV8yX3NsZWVwCisJCQkgICAgICZjZGNfcGRtXzJfZ3Bpb3Nfc2xlZXA+OworCQlxY29tLGxwaS1ncGlvczsKKwl9OworCisJY2RjX2NvbXBfZ3Bpb3M6IGNkY19jb21wX3BpbmN0cmwgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKKwkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7CisJCXBpbmN0cmwtMCA9IDwmY2RjX3J4MF9jb21wX2FjdGl2ZSAmY2RjX3J4MV9jb21wX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmY2RjX3J4MF9jb21wX3NsZWVwICZjZGNfcngxX2NvbXBfc2xlZXA+OworCQlxY29tLGxwaS1ncGlvczsKKwl9OworCisJY2RjX2RtaWNfZ3Bpb3M6IGNkY19kbWljX3BpbmN0cmwgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKKwkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7CisJCXBpbmN0cmwtMCA9IDwmY2RjX2RtaWMxMl9ncGlvc19hY3RpdmUKKwkJCSAgICAgJmNkY19kbWljMzRfZ3Bpb3NfYWN0aXZlPjsKKwkJcGluY3RybC0xID0gPCZjZGNfZG1pYzEyX2dwaW9zX3NsZWVwCisJCQkgICAgICZjZGNfZG1pYzM0X2dwaW9zX3NsZWVwPjsKKwkJcWNvbSxscGktZ3Bpb3M7CisJfTsKKworCWNkY19zZHdfZ3Bpb3M6IHNkd19jbGtfZGF0YV9waW5jdHJsIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jZGMtcGluY3RybCI7CisJCXBpbmN0cmwtbmFtZXMgPSAiYXVkX2FjdGl2ZSIsICJhdWRfc2xlZXAiOworCQlwaW5jdHJsLTAgPSA8JnNkd19jbGtfYWN0aXZlICZzZHdfZGF0YV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNkd19jbGtfc2xlZXAgJnNkd19kYXRhX3NsZWVwPjsKKwl9OworCisJd3NhX3Nwa3JfZW4xOiB3c2Ffc3Brcl9lbjFfcGluY3RybCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOworCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKKwkJcGluY3RybC0wID0gPCZzcGtyXzFfc2Rfbl9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNwa3JfMV9zZF9uX3NsZWVwPjsKKwl9OworCisJd3NhX3Nwa3JfZW4yOiB3c2Ffc3Brcl9lbjJfcGluY3RybCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOworCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKKwkJcGluY3RybC0wID0gPCZzcGtyXzJfc2Rfbl9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNwa3JfMl9zZF9uX3NsZWVwPjsKKwl9OworCisJbXNtX3Nkd19jb2RlYzogbXNtLXNkdy1jb2RlY0A2MmVjMTAwMCB7CisJCXN0YXR1cyA9ICJva2F5IjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1zZHctY29kZWMiOworCQlyZWcgPSA8MHg2MmVjMTAwMCAweDA+OworCQlpbnRlcnJ1cHRzID0gPDAgODggMD47CisJCWludGVycnVwdC1uYW1lcyA9ICJzd3JfbWFzdGVyX2lycSI7CisJCXFjb20sY2RjLXNkdy1ncGlvcyA9IDwmY2RjX3Nkd19ncGlvcz47CisKKwkJc3dyX21hc3RlciB7CisJCQljb21wYXRpYmxlID0gInFjb20sc3dyLXdjZCI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQl3c2E4ODF4XzIxMV9lbjogd3NhODgxeF9lbkAyMDE3MDIxMSB7CisJCQkJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgiOworCQkJCXJlZyA9IDwweDAgMHgyMDE3MDIxMT47CisJCQkJcWNvbSxzcGtyLXNkLW4tbm9kZSA9IDwmd3NhX3Nwa3JfZW4xPjsKKwkJCX07CisKKwkJCXdzYTg4MXhfMjEyX2VuOiB3c2E4ODF4X2VuQDIwMTcwMjEyIHsKKwkJCQljb21wYXRpYmxlID0gInFjb20sd3NhODgxeCI7CisJCQkJcmVnID0gPDB4MCAweDIwMTcwMjEyPjsKKwkJCQlxY29tLHNwa3Itc2Qtbi1ub2RlID0gPCZ3c2Ffc3Brcl9lbjI+OworCQkJfTsKKworCQkJd3NhODgxeF8yMTNfZW46IHdzYTg4MXhfZW5AMjExNzAyMTMgeworCQkJCWNvbXBhdGlibGUgPSAicWNvbSx3c2E4ODF4IjsKKwkJCQlyZWcgPSA8MHgwIDB4MjExNzAyMTM+OworCQkJCXFjb20sc3Brci1zZC1uLW5vZGUgPSA8JndzYV9zcGtyX2VuMT47CisJCQl9OworCisJCQl3c2E4ODF4XzIxNF9lbjogd3NhODgxeF9lbkAyMTE3MDIxNCB7CisJCQkJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgiOworCQkJCXJlZyA9IDwweDAgMHgyMTE3MDIxND47CisJCQkJcWNvbSxzcGtyLXNkLW4tbm9kZSA9IDwmd3NhX3Nwa3JfZW4yPjsKKwkJCX07CisJCX07CisJfTsKKworCXdjZDl4eHhfaW50Yzogd2NkOXh4eC1pcnEgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQljb21wYXRpYmxlID0gInFjb20sd2NkOXh4eC1pcnEiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmdGxtbT47CisJCXFjb20sZ3Bpby1jb25uZWN0ID0gPCZ0bG1tIDgwIDA+OworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JndjZF9pbnRyX2RlZmF1bHQ+OworCX07CisKKwljbG9ja19hdWRpb19sbmJiOiBhdWRpb19leHRfY2xrX2xuYmIgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQljb21wYXRpYmxlID0gInFjb20sYXVkaW8tcmVmLWNsayI7CisJCWNsb2NrLW5hbWVzID0gIm9zcl9jbGsiOworCQljbG9ja3MgPSA8JmNsb2NrX3JwbWggUlBNSF9MTl9CQl9DTEsyPjsKKwkJcWNvbSxub2RlX2hhc19ycG1fY2xvY2s7CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwl9OworCisJd2NkX3JzdF9ncGlvOiBtc21fY2RjX3BpbmN0cmxANjQgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKKwkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7CisJCXBpbmN0cmwtMCA9IDwmbHBpX2NkY19yZXNldF9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JmxwaV9jZGNfcmVzZXRfc2xlZXA+OworCQlxY29tLGxwaS1ncGlvczsKKwl9OworCisJd2RzcF9tZ3I6IHFjb20sd2NkLWRzcC1tZ3IgeworCQljb21wYXRpYmxlID0gInFjb20sd2NkLWRzcC1tZ3IiOworCQlxY29tLHdkc3AtY29tcG9uZW50cyA9IDwmd2NkOTM0eF9jZGMgMD4sCisJCQkJICAgICAgIDwmd2NkX3NwaV8wIDE+LAorCQkJCSAgICAgICA8JmdsaW5rX3NwaV94cHJ0X3dkc3AgMj47CisJCQkJCXFjb20saW1nLWZpbGVuYW1lID0gImNwZV85MzQwIjsKKwl9OworCisJd2RzcF9nbGluazogcWNvbSx3Y2QtZHNwLWdsaW5rIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjZC1kc3AtZ2xpbmsiOworCX07Cit9OworCismc2xpbV9hdWQgeworCXdjZDkzNHhfY2RjOiB0YXZpbF9jb2RlYyB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCWNvbXBhdGlibGUgPSAicWNvbSx0YXZpbC1zbGltLXBnZCI7CisJCWVsZW1lbnRhbC1hZGRyID0gWzAwIDAxIDUwIDAyIDE3IDAyXTsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3Y2Q5eHh4X2ludGM+OworCQlpbnRlcnJ1cHRzID0gPDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYKKwkJCSAgICAgIDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5CisJCQkgICAgICAzMCAzMT47CisKKwkJcWNvbSx3Y2QtcnN0LWdwaW8tbm9kZSA9IDwmd2NkX3JzdF9ncGlvPjsKKworCQljbG9jay1uYW1lcyA9ICJ3Y2RfY2xrIjsKKwkJY2xvY2tzID0gPCZjbG9ja19hdWRpb19sbmJiIEFVRElPX1BNSUNfTE5CQl9DTEs+OworCisJCWNkYy12ZGQtbWljLWJpYXMtc3VwcGx5ID0gPCZwbTY2MGxfYm9iPjsKKwkJcWNvbSxjZGMtdmRkLW1pYy1iaWFzLXZvbHRhZ2UgPSA8MzMxMjAwMCAzMzEyMDAwPjsKKwkJcWNvbSxjZGMtdmRkLW1pYy1iaWFzLWN1cnJlbnQgPSA8MzA0MDA+OworCisJCXFjb20sY2RjLXN0YXRpYy1zdXBwbGllcyA9ICJjZGMtdmRkLW1pYy1iaWFzIjsKKworCQlxY29tLGNkYy1taWNiaWFzMS1tdiA9IDwxODAwPjsKKwkJcWNvbSxjZGMtbWljYmlhczItbXYgPSA8MTgwMD47CisJCXFjb20sY2RjLW1pY2JpYXMzLW12ID0gPDE4MDA+OworCQlxY29tLGNkYy1taWNiaWFzNC1tdiA9IDwxODAwPjsKKworCQlxY29tLGNkYy1tY2xrLWNsay1yYXRlID0gPDk2MDAwMDA+OworCQlxY29tLGNkYy1zbGltLWlmZCA9ICJ0YXZpbC1zbGltLWlmZCI7CisJCXFjb20sY2RjLXNsaW0taWZkLWVsZW1lbnRhbC1hZGRyID0gWzAwIDAwIDUwIDAyIDE3IDAyXTsKKwkJcWNvbSxjZGMtZG1pYy1zYW1wbGUtcmF0ZSA9IDw0ODAwMDAwPjsKKwkJcWNvbSxjZGMtbWFkLWRtaWMtcmF0ZSA9IDw2MDAwMDA+OworCisJCXFjb20sd2RzcC1jbXBudC1kZXYtbmFtZSA9ICJ0YXZpbF9jb2RlYyI7CisKKwkJd2NkX3NwaV8wOiB3Y2Rfc3BpIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSx3Y2Qtc3BpLXYyIjsKKwkJCXFjb20sbWFzdGVyLWJ1cy1udW0gPSA8MD47CisJCQlxY29tLGNoaXAtc2VsZWN0ID0gPDA+OworCQkJcWNvbSxtYXgtZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJCXFjb20sbWVtLWJhc2UtYWRkciA9IDwweDEwMDAwMD47CisJCX07CisJfTsKK307CisKKyZwbTY2MGxfMyB7CisJcG1pY19hbmFsb2dfY29kZWM6IGFuYWxvZy1jb2RlY0BmMDAwIHsKKwkJc3RhdHVzID0gIm9rYXkiOworCQljb21wYXRpYmxlID0gInFjb20scG1pYy1hbmFsb2ctY29kZWMiOworCQlyZWcgPSA8MHhmMDAwIDB4MjAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZzcG1pX2J1cz47CisJCWludGVycnVwdHMgPSA8MHgzIDB4ZjAgMHgwIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHgxIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHgyIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHgzIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHg0IElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHg1IElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHg2IElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjAgMHg3IElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHgwIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHgxIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHgyIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHgzIElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHg0IElSUV9UWVBFX05PTkU+LAorCQkJICAgICA8MHgzIDB4ZjEgMHg1IElSUV9UWVBFX05PTkU+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAic3BrX2NucF9pbnQiLAorCQkJCSAgICJzcGtfY2xpcF9pbnQiLAorCQkJCSAgICJzcGtfb2NwX2ludCIsCisJCQkJICAgImluc19yZW1fZGV0MSIsCisJCQkJICAgImJ1dF9yZWxfZGV0IiwKKwkJCQkgICAiYnV0X3ByZXNzX2RldCIsCisJCQkJICAgImluc19yZW1fZGV0IiwKKwkJCQkgICAibWJoY19pbnQiLAorCQkJCSAgICJlYXJfb2NwX2ludCIsCisJCQkJICAgImhwaHJfb2NwX2ludCIsCisJCQkJICAgImhwaGxfb2NwX2RldCIsCisJCQkJICAgImVhcl9jbnBfaW50IiwKKwkJCQkgICAiaHBocl9jbnBfaW50IiwKKwkJCQkgICAiaHBobF9jbnBfaW50IjsKKworCQljZGMtdmRkYS1jcC1zdXBwbHkgPSA8JnBtNjYwX3M0PjsKKwkJcWNvbSxjZGMtdmRkYS1jcC12b2x0YWdlID0gPDE5MDAwMDAgMjA1MDAwMD47CisJCXFjb20sY2RjLXZkZGEtY3AtY3VycmVudCA9IDw1MDAwMD47CisKKwkJY2RjLXZkZC1wYS1zdXBwbHkgPSA8JnBtNjYwX3M0PjsKKwkJcWNvbSxjZGMtdmRkLXBhLXZvbHRhZ2UgPSA8MjA0MDAwMCAyMDQwMDAwPjsKKwkJcWNvbSxjZGMtdmRkLXBhLWN1cnJlbnQgPSA8MjYwMDAwPjsKKworCQljZGMtdmRkLW1pYy1iaWFzLXN1cHBseSA9IDwmcG02NjBsX2w3PjsKKwkJcWNvbSxjZGMtdmRkLW1pYy1iaWFzLXZvbHRhZ2UgPSA8MzA4ODAwMCAzMDg4MDAwPjsKKwkJcWNvbSxjZGMtdmRkLW1pYy1iaWFzLWN1cnJlbnQgPSA8NTAwMD47CisKKwkJcWNvbSxjZGMtbWNsay1jbGstcmF0ZSA9IDw5NjAwMDAwPjsKKworCQlxY29tLGNkYy1zdGF0aWMtc3VwcGxpZXMgPSAiY2RjLXZkZGEtY3AiLAorCQkJCQkgICAiY2RjLXZkZC1wYSI7CisKKwkJcWNvbSxjZGMtb24tZGVtYW5kLXN1cHBsaWVzID0gImNkYy12ZGQtbWljLWJpYXMiOworCisJCS8qCisJCSAqIE5vdCBtYXJraW5nIGFkZHJlc3MgQCBhcyBkcml2ZXIgc2VhcmNoZXMgdGhpcyBjaGlsZAorCQkgKiB3aXRoIG5hbWUgbXNtLWRpZy1jb2RlYworCQkgKi8KKwkJbXNtX2RpZ2l0YWxfY29kZWM6IG1zbS1kaWctY29kZWMgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kaWdpdGFsLWNvZGVjIjsKKwkJCXJlZyA9IDwweDYyZWMwMDAwIDB4MD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWF1ZGlvLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWF1ZGlvLmR0c2kKaW5kZXggM2JkMDM1MC4uZWY5MmNkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1hdWRpby5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtYXVkaW8uZHRzaQpAQCAtMzksNDIgKzM5LDYgQEAKIAkJcWNvbSx3Y24tYnRmbTsKIAkJcWNvbSxtaTJzLWF1ZGlvLWludGY7CiAJCXFjb20sYXV4cGNtLWF1ZGlvLWludGY7Ci0JCXFjb20sbXNtLW1pMnMtbWFzdGVyID0gPDE+LCA8MT4sIDwxPiwgPDE+OwotCQlxY29tLGF1ZGlvLXJvdXRpbmcgPQotCQkJIkFJRjQgVkkiLCAiTUNMSyIsCi0JCQkiUlhfQklBUyIsICJNQ0xLIiwKLQkJCSJNQURJTlBVVCIsICJNQ0xLIiwKLQkJCSJoaWZpIGFtcCIsICJMSU5FT1VUMSIsCi0JCQkiaGlmaSBhbXAiLCAiTElORU9VVDIiLAotCQkJIkFNSUMyIiwgIk1JQyBCSUFTMiIsCi0JCQkiTUlDIEJJQVMyIiwgIkhlYWRzZXQgTWljIiwKLQkJCSJBTUlDMyIsICJNSUMgQklBUzIiLAotCQkJIk1JQyBCSUFTMiIsICJBTkNSaWdodCBIZWFkc2V0IE1pYyIsCi0JCQkiQU1JQzQiLCAiTUlDIEJJQVMyIiwKLQkJCSJNSUMgQklBUzIiLCAiQU5DTGVmdCBIZWFkc2V0IE1pYyIsCi0JCQkiQU1JQzUiLCAiTUlDIEJJQVMzIiwKLQkJCSJNSUMgQklBUzMiLCAiSGFuZHNldCBNaWMiLAotCQkJIkRNSUMwIiwgIk1JQyBCSUFTMSIsCi0JCQkiTUlDIEJJQVMxIiwgIkRpZ2l0YWwgTWljMCIsCi0JCQkiRE1JQzEiLCAiTUlDIEJJQVMxIiwKLQkJCSJNSUMgQklBUzEiLCAiRGlnaXRhbCBNaWMxIiwKLQkJCSJETUlDMiIsICJNSUMgQklBUzMiLAotCQkJIk1JQyBCSUFTMyIsICJEaWdpdGFsIE1pYzIiLAotCQkJIkRNSUMzIiwgIk1JQyBCSUFTMyIsCi0JCQkiTUlDIEJJQVMzIiwgIkRpZ2l0YWwgTWljMyIsCi0JCQkiRE1JQzQiLCAiTUlDIEJJQVM0IiwKLQkJCSJNSUMgQklBUzQiLCAiRGlnaXRhbCBNaWM0IiwKLQkJCSJETUlDNSIsICJNSUMgQklBUzQiLAotCQkJIk1JQyBCSUFTNCIsICJEaWdpdGFsIE1pYzUiLAotCQkJIlNwa3JMZWZ0IElOIiwgIlNQSzEgT1VUIiwKLQkJCSJTcGtyUmlnaHQgSU4iLCAiU1BLMiBPVVQiOwotCi0JCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MT47Ci0JCXFjb20sbXNtLW1iaGMtZ25kLXN3aCA9IDwxPjsKLQkJcWNvbSxocGgtZW4wLWdwaW8gPSA8JnRhdmlsX2hwaF9lbjA+OwotCQlxY29tLGhwaC1lbjEtZ3BpbyA9IDwmdGF2aWxfaHBoX2VuMT47Ci0JCXFjb20sbXNtLW1jbGstZnJlcSA9IDw5NjAwMDAwPjsKLQkJcWNvbSx1c2JjLWFuYWxvZy1lbjFfZ3BpbyA9IDwmd2NkX3VzYmNfYW5hbG9nX2VuMV9ncGlvPjsKIAkJYXNvYy1wbGF0Zm9ybSA9IDwmcGNtMD4sIDwmcGNtMT4sIDwmcGNtMj4sIDwmdm9pcD4sIDwmdm9pY2U+LAogCQkJPCZsb29wYmFjaz4sIDwmY29tcHJlc3M+LCA8Jmhvc3RsZXNzPiwKIAkJCTwmYWZlPiwgPCZsc20+LCA8JnJvdXRpbmc+LCA8JmNwZT4sIDwmY29tcHI+LApAQCAtODcsOSArNTEsMTAgQEAKIAkJCSJtc20tcGNtLXJvdXRpbmciLCAibXNtLWNwZS1sc20iLAogCQkJIm1zbS1jb21wci1kc3AiLCAibXNtLXBjbS1kc3Atbm9pcnEiOwogCQlhc29jLWNwdSA9IDwmZGFpX21pMnMwPiwgPCZkYWlfbWkyczE+LAotCQkJPCZkYWlfbWkyczI+LCA8JmRhaV9taTJzMz4sCisJCQk8JmRhaV9taTJzMj4sIDwmZGFpX21pMnMzPiwgPCZkYWlfbWkyczQ+LAogCQkJPCZkYWlfcHJpX2F1eHBjbT4sIDwmZGFpX3NlY19hdXhwY20+LAogCQkJPCZkYWlfdGVydF9hdXhwY20+LCA8JmRhaV9xdWF0X2F1eHBjbT4sCisJCQk8JmRhaV9xdWluX2F1eHBjbT4sCiAJCQk8JnNiXzBfcng+LCA8JnNiXzBfdHg+LCA8JnNiXzFfcng+LCA8JnNiXzFfdHg+LAogCQkJPCZzYl8yX3J4PiwgPCZzYl8yX3R4PiwgPCZzYl8zX3J4PiwgPCZzYl8zX3R4PiwKIAkJCTwmc2JfNF9yeD4sIDwmc2JfNF90eD4sIDwmc2JfNV9yeD4sIDwmc2JfNV90eD4sCkBAIC0xMDMsMTEgKzY4LDE0IEBACiAJCQk8JmRhaV9wcmlfdGRtX3J4XzA+LCA8JmRhaV9wcmlfdGRtX3R4XzA+LAogCQkJPCZkYWlfc2VjX3RkbV9yeF8wPiwgPCZkYWlfc2VjX3RkbV90eF8wPiwKIAkJCTwmZGFpX3RlcnRfdGRtX3J4XzA+LCA8JmRhaV90ZXJ0X3RkbV90eF8wPiwKLQkJCTwmZGFpX3F1YXRfdGRtX3J4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8wPjsKKwkJCTwmZGFpX3F1YXRfdGRtX3J4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8wPiwKKwkJCTwmZGFpX3F1aW5fdGRtX3J4XzA+LCA8JmRhaV9xdWluX3RkbV90eF8wPjsKIAkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1taTJzLjAiLCAibXNtLWRhaS1xNi1taTJzLjEiLAogCQkJIm1zbS1kYWktcTYtbWkycy4yIiwgIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJCSJtc20tZGFpLXE2LW1pMnMuNSIsCiAJCQkibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKIAkJCSJtc20tZGFpLXE2LWF1eHBjbS4zIiwgIm1zbS1kYWktcTYtYXV4cGNtLjQiLAorCQkJIm1zbS1kYWktcTYtYXV4cGNtLjUiLAogCQkJIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwgIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKIAkJCSJtc20tZGFpLXE2LWRldi4xNjM4NiIsICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCiAJCQkibXNtLWRhaS1xNi1kZXYuMTYzODgiLCAibXNtLWRhaS1xNi1kZXYuMTYzODkiLApAQCAtMTI1LDU5ICs5MywxNyBAQAogCQkJIm1zbS1kYWktcTYtdGRtLjM2ODY0IiwgIm1zbS1kYWktcTYtdGRtLjM2ODY1IiwKIAkJCSJtc20tZGFpLXE2LXRkbS4zNjg4MCIsICJtc20tZGFpLXE2LXRkbS4zNjg4MSIsCiAJCQkibXNtLWRhaS1xNi10ZG0uMzY4OTYiLCAibXNtLWRhaS1xNi10ZG0uMzY4OTciLAotCQkJIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwgIm1zbS1kYWktcTYtdGRtLjM2OTEzIjsKLQkJYXNvYy1jb2RlYyA9IDwmc3R1Yl9jb2RlYz47Ci0JCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSI7Ci0JCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OwotCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzAyMTE+LCA8JndzYTg4MXhfMDIxMj4sCi0JCQkJPCZ3c2E4ODF4XzAyMTM+LCA8JndzYTg4MXhfMDIxND47Ci0JCXFjb20sd3NhLWF1eC1kZXYtcHJlZml4ID0gIlNwa3JMZWZ0IiwgIlNwa3JSaWdodCIsCi0JCQkJCSJTcGtyTGVmdCIsICJTcGtyUmlnaHQiOworCQkJIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwgIm1zbS1kYWktcTYtdGRtLjM2OTEzIiwKKwkJCSJtc20tZGFpLXE2LXRkbS4zNjkyOCIsICJtc20tZGFpLXE2LXRkbS4zNjkyOSI7CiAJfTsKIAotaW50X2NvZGVjOiBzb3VuZCB7CisJaW50X2NvZGVjOiBzb3VuZCB7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAkJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1hc29jLXNuZCI7Ci0JCXFjb20sbW9kZWwgPSAic2RtNjcwLXNuZC1jYXJkIjsKKwkJcWNvbSxtb2RlbCA9ICJzZG02NzAtc25kLWNhcmQtbXRwIjsKIAkJcWNvbSx3Y24tYnRmbTsKIAkJcWNvbSxtaTJzLWF1ZGlvLWludGY7CiAJCXFjb20sYXV4cGNtLWF1ZGlvLWludGY7Ci0JCXFjb20sbXNtLW1pMnMtbWFzdGVyID0gPDE+LCA8MT4sIDwxPiwgPDE+OwotCQlxY29tLG1zbS1tY2xrLWZyZXEgPSA8OTYwMDAwMD47Ci0JCXFjb20sbXNtLW1iaGMtaHBobC1zd2ggPSA8MT47Ci0JCXFjb20sbXNtLW1iaGMtZ25kLXN3aCA9IDwxPjsKLQkJcWNvbSxtc20tbWljYmlhczItZXh0LWNhcDsKLQkJcWNvbSxtc20taHMtbWljYmlhcy10eXBlID0gImV4dGVybmFsIjsKLQkJcWNvbSxjZGMtcGRtLWdwaW9zID0gPCZjZGNfcGRtX2dwaW9zPjsKLQkJcWNvbSxjZGMtY29tcC1ncGlvcyA9IDwmY2RjX2NvbXBfZ3Bpb3M+OwotCQlxY29tLGNkYy1kbWljLWdwaW9zID0gPCZjZGNfZG1pY19ncGlvcz47Ci0JCXFjb20sYXVkaW8tcm91dGluZyA9Ci0JCQkiUlhfQklBUyIsICJJTlRfTUNMSzAiLAotCQkJIlNQS19SWF9CSUFTIiwgIklOVF9NQ0xLMCIsCi0JCQkiSU5UX0xET19IIiwgIklOVF9NQ0xLMCIsCi0JCQkiTUlDIEJJQVMgRXh0ZXJuYWwiLCAiSGFuZHNldCBNaWMiLAotCQkJIk1JQyBCSUFTIEV4dGVybmFsMiIsICJIZWFkc2V0IE1pYyIsCi0JCQkiTUlDIEJJQVMgRXh0ZXJuYWwiLCAiU2Vjb25kYXJ5IE1pYyIsCi0JCQkiQU1JQzEiLCAiTUlDIEJJQVMgRXh0ZXJuYWwiLAotCQkJIkFNSUMyIiwgIk1JQyBCSUFTIEV4dGVybmFsMiIsCi0JCQkiQU1JQzMiLCAiTUlDIEJJQVMgRXh0ZXJuYWwiLAotCQkJIkRNSUMxIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKLQkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzEiLAotCQkJIkRNSUMyIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKLQkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzIiLAotCQkJIkRNSUMzIiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKLQkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzMiLAotCQkJIkRNSUM0IiwgIk1JQyBCSUFTIEV4dGVybmFsIiwKLQkJCSJNSUMgQklBUyBFeHRlcm5hbCIsICJEaWdpdGFsIE1pYzQiLAotCQkJIlNwa3JMZWZ0IElOIiwgIlNQSzEgT1VUIiwKLQkJCSJTcGtyUmlnaHQgSU4iLCAiU1BLMiBPVVQiLAotCQkJIlBETV9JTl9SWDEiLCAiUERNX09VVF9SWDEiLAotCQkJIlBETV9JTl9SWDIiLCAiUERNX09VVF9SWDIiLAotCQkJIlBETV9JTl9SWDMiLCAiUERNX09VVF9SWDMiLAotCQkJIkFEQzFfSU4iLCAiQURDMV9PVVQiLAotCQkJIkFEQzJfSU4iLCAiQURDMl9PVVQiLAotCQkJIkFEQzNfSU4iLCAiQURDM19PVVQiOwotCiAJCWFzb2MtcGxhdGZvcm0gPSA8JnBjbTA+LCA8JnBjbTE+LCA8JnBjbTI+LCA8JnZvaXA+LCA8JnZvaWNlPiwKIAkJCTwmbG9vcGJhY2s+LCA8JmNvbXByZXNzPiwgPCZob3N0bGVzcz4sCiAJCQk8JmFmZT4sIDwmbHNtPiwgPCZyb3V0aW5nPiwgPCZjb21wcj4sCkBAIC0xOTAsMTIgKzExNiwxMyBAQAogCQkJIm1zbS1wY20tcm91dGluZyIsICJtc20tY29tcHItZHNwIiwKIAkJCSJtc20tcGNtLWRzcC1ub2lycSI7CiAJCWFzb2MtY3B1ID0gPCZkYWlfbWkyczA+LCA8JmRhaV9taTJzMT4sCi0JCQk8JmRhaV9taTJzMj4sIDwmZGFpX21pMnMzPiwKKwkJCTwmZGFpX21pMnMyPiwgPCZkYWlfbWkyczM+LCA8JmRhaV9taTJzND4sCiAJCQk8JmRhaV9pbnRfbWkyczA+LCA8JmRhaV9pbnRfbWkyczE+LAogCQkJPCZkYWlfaW50X21pMnMyPiwgPCZkYWlfaW50X21pMnMzPiwKIAkJCTwmZGFpX2ludF9taTJzND4sIDwmZGFpX2ludF9taTJzNT4sCiAJCQk8JmRhaV9wcmlfYXV4cGNtPiwgPCZkYWlfc2VjX2F1eHBjbT4sCiAJCQk8JmRhaV90ZXJ0X2F1eHBjbT4sIDwmZGFpX3F1YXRfYXV4cGNtPiwKKwkJCTwmZGFpX3F1aW5fYXV4cGNtPiwKIAkJCTwmYWZlX3BjbV9yeD4sIDwmYWZlX3BjbV90eD4sIDwmYWZlX3Byb3h5X3J4PiwKIAkJCTwmYWZlX3Byb3h5X3R4PiwgPCZpbmNhbGxfcmVjb3JkX3J4PiwKIAkJCTwmaW5jYWxsX3JlY29yZF90eD4sIDwmaW5jYWxsX211c2ljX3J4PiwKQEAgLTIwNSwxNCArMTMyLDE3IEBACiAJCQk8JmRhaV9wcmlfdGRtX3J4XzA+LCA8JmRhaV9wcmlfdGRtX3R4XzA+LAogCQkJPCZkYWlfc2VjX3RkbV9yeF8wPiwgPCZkYWlfc2VjX3RkbV90eF8wPiwKIAkJCTwmZGFpX3RlcnRfdGRtX3J4XzA+LCA8JmRhaV90ZXJ0X3RkbV90eF8wPiwKLQkJCTwmZGFpX3F1YXRfdGRtX3J4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8wPjsKKwkJCTwmZGFpX3F1YXRfdGRtX3J4XzA+LCA8JmRhaV9xdWF0X3RkbV90eF8wPiwKKwkJCTwmZGFpX3F1aW5fdGRtX3J4XzA+LCA8JmRhaV9xdWluX3RkbV90eF8wPjsKIAkJYXNvYy1jcHUtbmFtZXMgPSAibXNtLWRhaS1xNi1taTJzLjAiLCAibXNtLWRhaS1xNi1taTJzLjEiLAogCQkJIm1zbS1kYWktcTYtbWkycy4yIiwgIm1zbS1kYWktcTYtbWkycy4zIiwKKwkJCSJtc20tZGFpLXE2LW1pMnMuNSIsCiAJCQkibXNtLWRhaS1xNi1taTJzLjciLCAibXNtLWRhaS1xNi1taTJzLjgiLAogCQkJIm1zbS1kYWktcTYtbWkycy45IiwgIm1zbS1kYWktcTYtbWkycy4xMCIsCiAJCQkibXNtLWRhaS1xNi1taTJzLjExIiwgIm1zbS1kYWktcTYtbWkycy4xMiIsCiAJCQkibXNtLWRhaS1xNi1hdXhwY20uMSIsICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKIAkJCSJtc20tZGFpLXE2LWF1eHBjbS4zIiwgIm1zbS1kYWktcTYtYXV4cGNtLjQiLAorCQkJIm1zbS1kYWktcTYtYXV4cGNtLjUiLAogCQkJIm1zbS1kYWktcTYtZGV2LjIyNCIsICJtc20tZGFpLXE2LWRldi4yMjUiLAogCQkJIm1zbS1kYWktcTYtZGV2LjI0MSIsICJtc20tZGFpLXE2LWRldi4yNDAiLAogCQkJIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwgIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKQEAgLTIyMywxMzYgKzE1Myw4IEBACiAJCQkibXNtLWRhaS1xNi10ZG0uMzY4NjQiLCAibXNtLWRhaS1xNi10ZG0uMzY4NjUiLAogCQkJIm1zbS1kYWktcTYtdGRtLjM2ODgwIiwgIm1zbS1kYWktcTYtdGRtLjM2ODgxIiwKIAkJCSJtc20tZGFpLXE2LXRkbS4zNjg5NiIsICJtc20tZGFpLXE2LXRkbS4zNjg5NyIsCi0JCQkibXNtLWRhaS1xNi10ZG0uMzY5MTIiLCAibXNtLWRhaS1xNi10ZG0uMzY5MTMiOwotCQlhc29jLWNvZGVjID0gPCZzdHViX2NvZGVjPiwgPCZtc21fZGlnaXRhbF9jb2RlYz4sCi0JCQkJPCZwbWljX2FuYWxvZ19jb2RlYz4sIDwmbXNtX3Nkd19jb2RlYz47Ci0JCWFzb2MtY29kZWMtbmFtZXMgPSAibXNtLXN0dWItY29kZWMuMSIsICJtc20tZGlnLWNvZGVjIiwKLQkJCQkiYW5hbG9nLWNvZGVjIiwgIm1zbV9zZHdfY29kZWMiOwotCi0JCXFjb20sd3NhLW1heC1kZXZzID0gPDI+OwotCQlxY29tLHdzYS1kZXZzID0gPCZ3c2E4ODF4XzIxMV9lbj4sIDwmd3NhODgxeF8yMTJfZW4+LAotCQkJCTwmd3NhODgxeF8yMTNfZW4+LCA8JndzYTg4MXhfMjE0X2VuPjsKLQkJcWNvbSx3c2EtYXV4LWRldi1wcmVmaXggPSAiU3BrckxlZnQiLCAiU3BrclJpZ2h0IiwKLQkJCQkJIlNwa3JMZWZ0IiwgIlNwa3JSaWdodCI7Ci0JfTsKLQotCWNkY19wZG1fZ3Bpb3M6IGNkY19wZG1fcGluY3RybCB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOwotCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKLQkJcGluY3RybC0wID0gPCZjZGNfcGRtX2Nsa19hY3RpdmUgJmNkY19wZG1fc3luY19hY3RpdmUKLQkJCSAgICAgJmNkY19wZG1fcngwX2FjdGl2ZSAmY2RjX3BkbV9yeDFfMl9hY3RpdmUKLQkJCSAgICAgJmNkY19wZG1fMl9ncGlvc19hY3RpdmU+OwotCQlwaW5jdHJsLTEgPSA8JmNkY19wZG1fY2xrX3NsZWVwICZjZGNfcGRtX3N5bmNfc2xlZXAKLQkJCSAgICAgJmNkY19wZG1fcngwX3NsZWVwICZjZGNfcGRtX3J4MV8yX3NsZWVwCi0JCQkgICAgICZjZGNfcGRtXzJfZ3Bpb3Nfc2xlZXA+OwotCQlxY29tLGxwaS1ncGlvczsKLQl9OwotCi0JY2RjX2NvbXBfZ3Bpb3M6IGNkY19jb21wX3BpbmN0cmwgewotCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKLQkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7Ci0JCXBpbmN0cmwtMCA9IDwmY2RjX3J4MF9jb21wX2FjdGl2ZSAmY2RjX3J4MV9jb21wX2FjdGl2ZT47Ci0JCXBpbmN0cmwtMSA9IDwmY2RjX3J4MF9jb21wX3NsZWVwICZjZGNfcngxX2NvbXBfc2xlZXA+OwotCQlxY29tLGxwaS1ncGlvczsKLQl9OwotCi0JY2RjX2RtaWNfZ3Bpb3M6IGNkY19kbWljX3BpbmN0cmwgewotCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKLQkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7Ci0JCXBpbmN0cmwtMCA9IDwmY2RjX2RtaWMxMl9ncGlvc19hY3RpdmUKLQkJCQkmY2RjX2RtaWMzNF9ncGlvc19hY3RpdmU+OwotCQlwaW5jdHJsLTEgPSA8JmNkY19kbWljMTJfZ3Bpb3Nfc2xlZXAKLQkJCQkmY2RjX2RtaWMzNF9ncGlvc19zbGVlcD47Ci0JCXFjb20sbHBpLWdwaW9zOwotCX07Ci0KLQljZGNfc2R3X2dwaW9zOiBzZHdfY2xrX2RhdGFfcGluY3RybCB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOwotCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKLQkJcGluY3RybC0wID0gPCZzZHdfY2xrX2FjdGl2ZSAmc2R3X2RhdGFfYWN0aXZlPjsKLQkJcGluY3RybC0xID0gPCZzZHdfY2xrX3NsZWVwICZzZHdfZGF0YV9zbGVlcD47Ci0JfTsKLQotCXdzYV9zcGtyX2VuMTogd3NhX3Nwa3JfZW4xX3BpbmN0cmwgewotCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKLQkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7Ci0JCXBpbmN0cmwtMCA9IDwmc3Brcl8xX3NkX25fYWN0aXZlPjsKLQkJcGluY3RybC0xID0gPCZzcGtyXzFfc2Rfbl9zbGVlcD47Ci0JfTsKLQotCXdzYV9zcGtyX2VuMjogd3NhX3Nwa3JfZW4yX3BpbmN0cmwgewotCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKLQkJcGluY3RybC1uYW1lcyA9ICJhdWRfYWN0aXZlIiwgImF1ZF9zbGVlcCI7Ci0JCXBpbmN0cmwtMCA9IDwmc3Brcl8yX3NkX25fYWN0aXZlPjsKLQkJcGluY3RybC0xID0gPCZzcGtyXzJfc2Rfbl9zbGVlcD47Ci0JfTsKLQotCW1zbV9zZHdfY29kZWM6IG1zbS1zZHctY29kZWNANjJlYzEwMDAgewotCQlzdGF0dXMgPSAib2theSI7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxtc20tc2R3LWNvZGVjIjsKLQkJcmVnID0gPDB4NjJlYzEwMDAgMHgwPjsKLQkJaW50ZXJydXB0cyA9IDwwIDE2MSAwPjsKLQkJaW50ZXJydXB0LW5hbWVzID0gInN3cl9tYXN0ZXJfaXJxIjsKLQkJcWNvbSxjZGMtc2R3LWdwaW9zID0gPCZjZGNfc2R3X2dwaW9zPjsKLQotCQlzd3JfbWFzdGVyIHsKLQkJCWNvbXBhdGlibGUgPSAicWNvbSxzd3Itd2NkIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJCXdzYTg4MXhfMjExX2VuOiB3c2E4ODF4X2VuQDIwMTcwMjExIHsKLQkJCQljb21wYXRpYmxlID0gInFjb20sd3NhODgxeCI7Ci0JCQkJcmVnID0gPDB4MCAweDIwMTcwMjExPjsKLQkJCQlxY29tLHNwa3Itc2Qtbi1ub2RlID0gPCZ3c2Ffc3Brcl9lbjE+OwotCQkJfTsKLQotCQkJd3NhODgxeF8yMTJfZW46IHdzYTg4MXhfZW5AMjAxNzAyMTIgewotCQkJCWNvbXBhdGlibGUgPSAicWNvbSx3c2E4ODF4IjsKLQkJCQlyZWcgPSA8MHgwIDB4MjAxNzAyMTI+OwotCQkJCXFjb20sc3Brci1zZC1uLW5vZGUgPSA8JndzYV9zcGtyX2VuMj47Ci0JCQl9OwotCi0JCQl3c2E4ODF4XzIxM19lbjogd3NhODgxeF9lbkAyMTE3MDIxMyB7Ci0JCQkJY29tcGF0aWJsZSA9ICJxY29tLHdzYTg4MXgiOwotCQkJCXJlZyA9IDwweDAgMHgyMTE3MDIxMz47Ci0JCQkJcWNvbSxzcGtyLXNkLW4tbm9kZSA9IDwmd3NhX3Nwa3JfZW4xPjsKLQkJCX07Ci0KLQkJCXdzYTg4MXhfMjE0X2VuOiB3c2E4ODF4X2VuQDIxMTcwMjE0IHsKLQkJCQljb21wYXRpYmxlID0gInFjb20sd3NhODgxeCI7Ci0JCQkJcmVnID0gPDB4MCAweDIxMTcwMjE0PjsKLQkJCQlxY29tLHNwa3Itc2Qtbi1ub2RlID0gPCZ3c2Ffc3Brcl9lbjI+OwotCQkJfTsKLQkJfTsKLQl9OwotCi0Jd2NkOXh4eF9pbnRjOiB3Y2Q5eHh4LWlycSB7Ci0JCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSx3Y2Q5eHh4LWlycSI7Ci0JCWludGVycnVwdC1jb250cm9sbGVyOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ0bG1tPjsKLQkJcWNvbSxncGlvLWNvbm5lY3QgPSA8JnRsbW0gODAgMD47Ci0JCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Ci0JCXBpbmN0cmwtMCA9IDwmd2NkX2ludHJfZGVmYXVsdD47Ci0JfTsKLQotCWNsb2NrX2F1ZGlvX2xuYmI6IGF1ZGlvX2V4dF9jbGtfbG5iYiB7Ci0JCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxhdWRpby1yZWYtY2xrIjsKLQkJY2xvY2stbmFtZXMgPSAib3NyX2NsayI7Ci0JCWNsb2NrcyA9IDwmY2xvY2tfcnBtaCBSUE1IX0xOX0JCX0NMSzI+OwotCQlxY29tLG5vZGVfaGFzX3JwbV9jbG9jazsKLQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCX07Ci0KLQl3Y2RfcnN0X2dwaW86IG1zbV9jZGNfcGluY3RybEA2NCB7Ci0JCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwiOwotCQlwaW5jdHJsLW5hbWVzID0gImF1ZF9hY3RpdmUiLCAiYXVkX3NsZWVwIjsKLQkJcGluY3RybC0wID0gPCZscGlfY2RjX3Jlc2V0X2FjdGl2ZT47Ci0JCXBpbmN0cmwtMSA9IDwmbHBpX2NkY19yZXNldF9zbGVlcD47Ci0JCXFjb20sbHBpLWdwaW9zOworCQkJIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwgIm1zbS1kYWktcTYtdGRtLjM2OTEzIiwKKwkJCSJtc20tZGFpLXE2LXRkbS4zNjkyOCIsICJtc20tZGFpLXE2LXRkbS4zNjkyOSI7CiAJfTsKIAogCWNwZTogcWNvbSxtc20tY3BlLWxzbSB7CkBAIC0zNjMsMTggKzE2NSw2IEBACiAJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY3BlLWxzbSI7CiAJCXFjb20sbXNtLWNwZS1sc20taWQgPSA8Mz47CiAJfTsKLQotCXdkc3BfbWdyOiBxY29tLHdjZC1kc3AtbWdyIHsKLQkJY29tcGF0aWJsZSA9ICJxY29tLHdjZC1kc3AtbWdyIjsKLQkJcWNvbSx3ZHNwLWNvbXBvbmVudHMgPSA8JndjZDkzNHhfY2RjIDA+LAotCQkJCSAgICAgICA8JndjZF9zcGlfMCAxPiwKLQkJCQkgICAgICAgPCZnbGlua19zcGlfeHBydF93ZHNwIDI+OwotCQlxY29tLGltZy1maWxlbmFtZSA9ICJjcGVfOTM0MCI7Ci0JfTsKLQotCXdkc3BfZ2xpbms6IHFjb20sd2NkLWRzcC1nbGluayB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLWdsaW5rIjsKLQl9OwogfTsKIAogJnNsaW1fYXVkIHsKQEAgLTM4NCw1NiArMTc0LDYgQEAKIAkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktc2xpbSI7CiAJCWVsZW1lbnRhbC1hZGRyID0gW2ZmIGZmIGZmIGZlIDE3IDAyXTsKIAl9OwotCi0Jd2NkOTM0eF9jZGM6IHRhdmlsX2NvZGVjIHsKLQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQkJY29tcGF0aWJsZSA9ICJxY29tLHRhdmlsLXNsaW0tcGdkIjsKLQkJZWxlbWVudGFsLWFkZHIgPSBbMDAgMDEgNTAgMDIgMTcgMDJdOwotCi0JCWludGVycnVwdC1wYXJlbnQgPSA8JndjZDl4eHhfaW50Yz47Ci0JCWludGVycnVwdHMgPSA8MCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNgotCQkJICAgICAgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkKLQkJCSAgICAgIDMwIDMxPjsKLQotCQlxY29tLHdjZC1yc3QtZ3Bpby1ub2RlID0gPCZ3Y2RfcnN0X2dwaW8+OwotCi0JCWNsb2NrLW5hbWVzID0gIndjZF9jbGsiOwotCQljbG9ja3MgPSA8JmNsb2NrX2F1ZGlvX2xuYmIgQVVESU9fUE1JQ19MTkJCX0NMSz47Ci0KLQkJY2RjLXZkZC1taWMtYmlhcy1zdXBwbHkgPSA8JnBtNjYwbF9ib2I+OwotCQlxY29tLGNkYy12ZGQtbWljLWJpYXMtdm9sdGFnZSA9IDwzMzAwMDAwIDMzMDAwMDA+OwotCQlxY29tLGNkYy12ZGQtbWljLWJpYXMtY3VycmVudCA9IDwzMDQwMD47Ci0KLQkJcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzID0gImNkYy12ZGQtbWljLWJpYXMiOwotCi0JCXFjb20sY2RjLW1pY2JpYXMxLW12ID0gPDE4MDA+OwotCQlxY29tLGNkYy1taWNiaWFzMi1tdiA9IDwxODAwPjsKLQkJcWNvbSxjZGMtbWljYmlhczMtbXYgPSA8MTgwMD47Ci0JCXFjb20sY2RjLW1pY2JpYXM0LW12ID0gPDE4MDA+OwotCi0JCXFjb20sY2RjLW1jbGstY2xrLXJhdGUgPSA8OTYwMDAwMD47Ci0JCXFjb20sY2RjLXNsaW0taWZkID0gInRhdmlsLXNsaW0taWZkIjsKLQkJcWNvbSxjZGMtc2xpbS1pZmQtZWxlbWVudGFsLWFkZHIgPSBbMDAgMDAgNTAgMDIgMTcgMDJdOwotCQlxY29tLGNkYy1kbWljLXNhbXBsZS1yYXRlID0gPDQ4MDAwMDA+OwotCQlxY29tLGNkYy1tYWQtZG1pYy1yYXRlID0gPDYwMDAwMD47Ci0KLQkJcWNvbSx3ZHNwLWNtcG50LWRldi1uYW1lID0gInRhdmlsX2NvZGVjIjsKLQotCQl3Y2Rfc3BpXzA6IHdjZF9zcGkgewotCQkJY29tcGF0aWJsZSA9ICJxY29tLHdjZC1zcGktdjIiOwotCQkJcWNvbSxtYXN0ZXItYnVzLW51bSA9IDw4PjsKLQkJCXFjb20sY2hpcC1zZWxlY3QgPSA8MD47Ci0JCQlxY29tLG1heC1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OwotCQkJcWNvbSxtZW0tYmFzZS1hZGRyID0gPDB4MTAwMDAwPjsKLQkJfTsKLQotCQl3Y2RfdXNiY19hbmFsb2dfZW4xX2dwaW86IG1zbV9jZGNfcGluY3RybF91c2JjX2F1ZGlvX2VuMSB7Ci0JCQljb21wYXRpYmxlID0gInFjb20sbXNtLWNkYy1waW5jdHJsIjsKLQkJCXBpbmN0cmwtbmFtZXMgPSAiYXVkX2FjdGl2ZSIsICJhdWRfc2xlZXAiOwotCQkJcGluY3RybC0wID0gPCZ3Y2RfdXNiY19hbmFsb2dfZW4xX2FjdGl2ZT47Ci0JCQlwaW5jdHJsLTEgPSA8JndjZF91c2JjX2FuYWxvZ19lbjFfaWRsZT47Ci0JCX07Ci0JfTsKIH07CiAKICZtc21fZGFpX21pMnMgewpAQCAtNDg2LDgzICsyMjYsMyBAQAogCQlxY29tLG1zbS1taTJzLXR4LWxpbmVzID0gPDM+OwogCX07CiB9OwotCi0mcG02NjBsXzMgewotCXBtaWNfYW5hbG9nX2NvZGVjOiBhbmFsb2ctY29kZWNAZjAwMCB7Ci0JCXN0YXR1cyA9ICJva2F5IjsKLQkJY29tcGF0aWJsZSA9ICJxY29tLHBtaWMtYW5hbG9nLWNvZGVjIjsKLQkJcmVnID0gPDB4ZjAwMCAweDIwMD47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc3BtaV9idXM+OwotCQlpbnRlcnJ1cHRzID0gPDB4MyAweGYwIDB4MCBJUlFfVFlQRV9OT05FPiwKLQkJCQk8MHgzIDB4ZjAgMHgxIElSUV9UWVBFX05PTkU+LAotCQkJCTwweDMgMHhmMCAweDIgSVJRX1RZUEVfTk9ORT4sCi0JCQkJPDB4MyAweGYwIDB4MyBJUlFfVFlQRV9OT05FPiwKLQkJCQk8MHgzIDB4ZjAgMHg0IElSUV9UWVBFX05PTkU+LAotCQkJCTwweDMgMHhmMCAweDUgSVJRX1RZUEVfTk9ORT4sCi0JCQkJPDB4MyAweGYwIDB4NiBJUlFfVFlQRV9OT05FPiwKLQkJCQk8MHgzIDB4ZjAgMHg3IElSUV9UWVBFX05PTkU+LAotCQkJCTwweDMgMHhmMSAweDAgSVJRX1RZUEVfTk9ORT4sCi0JCQkJPDB4MyAweGYxIDB4MSBJUlFfVFlQRV9OT05FPiwKLQkJCQk8MHgzIDB4ZjEgMHgyIElSUV9UWVBFX05PTkU+LAotCQkJCTwweDMgMHhmMSAweDMgSVJRX1RZUEVfTk9ORT4sCi0JCQkJPDB4MyAweGYxIDB4NCBJUlFfVFlQRV9OT05FPiwKLQkJCQk8MHgzIDB4ZjEgMHg1IElSUV9UWVBFX05PTkU+OwotCQlpbnRlcnJ1cHQtbmFtZXMgPSAic3BrX2NucF9pbnQiLAotCQkJCSAgInNwa19jbGlwX2ludCIsCi0JCQkJICAic3BrX29jcF9pbnQiLAotCQkJCSAgImluc19yZW1fZGV0MSIsCi0JCQkJICAiYnV0X3JlbF9kZXQiLAotCQkJCSAgImJ1dF9wcmVzc19kZXQiLAotCQkJCSAgImluc19yZW1fZGV0IiwKLQkJCQkgICJtYmhjX2ludCIsCi0JCQkJICAiZWFyX29jcF9pbnQiLAotCQkJCSAgImhwaHJfb2NwX2ludCIsCi0JCQkJICAiaHBobF9vY3BfZGV0IiwKLQkJCQkgICJlYXJfY25wX2ludCIsCi0JCQkJICAiaHBocl9jbnBfaW50IiwKLQkJCQkgICJocGhsX2NucF9pbnQiOwotCi0KLQkJY2RjLXZkZGEtY3Atc3VwcGx5ID0gPCZwbTY2MF9zND47Ci0JCXFjb20sY2RjLXZkZGEtY3Atdm9sdGFnZSA9IDwxOTAwMDAwIDIwNTAwMDA+OwotCQlxY29tLGNkYy12ZGRhLWNwLWN1cnJlbnQgPSA8NTAwMDA+OwotCi0JCWNkYy12ZGQtcGEtc3VwcGx5ID0gPCZwbTY2MF9zND47Ci0JCXFjb20sY2RjLXZkZC1wYS12b2x0YWdlID0gPDIwNDAwMDAgMjA0MDAwMD47Ci0JCXFjb20sY2RjLXZkZC1wYS1jdXJyZW50ID0gPDI2MDAwMD47Ci0KLQkJY2RjLXZkZC1taWMtYmlhcy1zdXBwbHkgPSA8JnBtNjYwbF9sNz47Ci0JCXFjb20sY2RjLXZkZC1taWMtYmlhcy12b2x0YWdlID0gPDMwODgwMDAgMzA4ODAwMD47Ci0JCXFjb20sY2RjLXZkZC1taWMtYmlhcy1jdXJyZW50ID0gPDUwMDA+OwotCi0JCXFjb20sY2RjLW1jbGstY2xrLXJhdGUgPSA8OTYwMDAwMD47Ci0KLQkJcWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzID0gImNkYy12ZGRhLWNwIiwKLQkJCQkJICAgImNkYy12ZGQtcGEiOwotCi0JCXFjb20sY2RjLW9uLWRlbWFuZC1zdXBwbGllcyA9ICJjZGMtdmRkLW1pYy1iaWFzIjsKLQotCQkvKgotCQkgKiBOb3QgbWFya2luZyBhZGRyZXNzIEAgYXMgZHJpdmVyIHNlYXJjaGVzIHRoaXMgY2hpbGQKLQkJICogd2l0aCBuYW1lIG1zbS1kaWctY29kZWMKLQkJICovCi0JCW1zbV9kaWdpdGFsX2NvZGVjOiBtc20tZGlnLWNvZGVjIHsKLQkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZGlnaXRhbC1jb2RlYyI7Ci0JCQlyZWcgPSA8MHg2MmVjMDAwMCAweDA+OwotCQl9OwotCX07Ci19OwotCi0mcG02NjBfZ3Bpb3MgewotCWdwaW9AYzIwMCB7Ci0JCXN0YXR1cyA9ICJvayI7Ci0JCXFjb20sbW9kZSA9IDwxPjsKLQkJcWNvbSxwdWxsID0gPDQ+OwotCQlxY29tLHZpbi1zZWwgPSA8MD47Ci0JCXFjb20sc3JjLXNlbCA9IDwyPjsKLQkJcWNvbSxtYXN0ZXItZW4gPSA8MT47Ci0JCXFjb20sb3V0LXN0cmVuZ3RoID0gPDI+OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1idXMuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtYnVzLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0OTE0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtYnVzLmR0c2kKQEAgLTAsMCArMSwxODczIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL21zbS9tc20tYnVzLWlkcy5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3NvYy9xY29tLHRjcy1tYm94Lmg+CisKKyZzb2MgeworCWFkX2hvY19idXM6IGFkLWhvYy1idXMgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWJ1cy1kZXZpY2UiOworCQlyZWcgPSA8MHgwMTZFMDAwMCAweDQwMDAwPiwKKwkJCTwweDE3MDAwMDAgMHg0MDAwMD4sCisJCQk8MHgxNTAwMDAwIDB4NDAwMDA+LAorCQkJPDB4MTRFMDAwMCAweDQwMDAwPiwKKwkJCTwweDE3OTAwMDAwIDB4NDAwMDA+LAorCQkJPDB4MTM4MDAwMCAweDQwMDAwPiwKKwkJCTwweDEzODAwMDAgMHg0MDAwMD4sCisJCQk8MHgxNzQwMDAwIDB4NDAwMDA+LAorCQkJPDB4MTYyMDAwMCAweDQwMDAwPiwKKwkJCTwweDE2MjAwMDAgMHg0MDAwMD4sCisJCQk8MHgxNjIwMDAwIDB4NDAwMDA+OworCisJCXJlZy1uYW1lcyA9ICJhZ2dyZTFfbm9jLWJhc2UiLCAiYWdncmUyX25vYy1iYXNlIiwKKwkJCSJjb25maWdfbm9jLWJhc2UiLCAiZGNfbm9jLWJhc2UiLAorCQkJImdsYWRpYXRvcl9ub2MtYmFzZSIsICJtY192aXJ0LWJhc2UiLCAibWVtX25vYy1iYXNlIiwKKwkJCSJtbXNzX25vYy1iYXNlIiwgInN5c3RlbV9ub2MtYmFzZSIsICJpcGFfdmlydC1iYXNlIiwKKwkJCSJjYW1ub2NfdmlydC1iYXNlIjsKKworCQltYm94LW5hbWVzID0gImFwcHNfcnNjIiwgImRpc3BfcnNjIjsKKwkJbWJveGVzID0gPCZhcHBzX3JzYyAwICZkaXNwX3JzYyAwPjsKKworCS8qUlNDcyovCisJCXJzY19hcHBzOiByc2MtYXBwcyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfUlNDX0FQUFM+OworCQkJbGFiZWwgPSAiYXBwc19yc2MiOworCQkJcWNvbSxyc2MtZGV2OworCQkJcWNvbSxyZXFfc3RhdGUgPSA8Mj47CisJCX07CisKKwkJcnNjX2Rpc3A6IHJzYy1kaXNwIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19SU0NfRElTUD47CisJCQlsYWJlbCA9ICJkaXNwX3JzYyI7CisJCQlxY29tLHJzYy1kZXY7CisJCQlxY29tLHJlcV9zdGF0ZSA9IDwzPjsKKwkJfTsKKworCS8qQkNNcyovCisJCWJjbV9hY3Y6IGJjbS1hY3YgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9BQ1Y+OworCQkJbGFiZWwgPSAiQUNWIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiQUNWIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9hbGM6IGJjbS1hbGMgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9BTEM+OworCQkJbGFiZWwgPSAiQUxDIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiQUxDIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tYzA6IGJjbS1tYzAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NQzA+OworCQkJbGFiZWwgPSAiTUMwIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTUMwIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zaDA6IGJjbS1zaDAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TSDA+OworCQkJbGFiZWwgPSAiU0gwIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0gwIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTA6IGJjbS1tbTAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NTTA+OworCQkJbGFiZWwgPSAiTU0wIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTU0wIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zaDE6IGJjbS1zaDEgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TSDE+OworCQkJbGFiZWwgPSAiU0gxIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0gxIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTE6IGJjbS1tbTEgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NTTE+OworCQkJbGFiZWwgPSAiTU0xIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTU0xIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zaDI6IGJjbS1zaDIgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TSDI+OworCQkJbGFiZWwgPSAiU0gyIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0gyIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTI6IGJjbS1tbTIgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NTTI+OworCQkJbGFiZWwgPSAiTU0yIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTU0yIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zaDM6IGJjbS1zaDMgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TSDM+OworCQkJbGFiZWwgPSAiU0gzIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0gzIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTM6IGJjbS1tbTMgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NTTM+OworCQkJbGFiZWwgPSAiTU0zIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTU0zIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zaDU6IGJjbS1zaDUgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TSDU+OworCQkJbGFiZWwgPSAiU0g1IjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0g1IjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zbjA6IGJjbS1zbjAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TTjA+OworCQkJbGFiZWwgPSAiU04wIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU04wIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9jZTA6IGJjbS1jZTAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9DRTA+OworCQkJbGFiZWwgPSAiQ0UwIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiQ0UwIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9pcDA6IGJjbS1pcDAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9JUDA+OworCQkJbGFiZWwgPSAiSVAwIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiSVAwIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9jbjA6IGJjbS1jbjAgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9DTjA+OworCQkJbGFiZWwgPSAiQ04wIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiQ04wIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9xdXAwOiBiY20tcXVwMCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1FVUDA+OworCQkJbGFiZWwgPSAiUVVQMCI7CisJCQlxY29tLGJjbS1uYW1lID0gIlFVUDAiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuMTogYmNtLXNuMSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOMT47CisJCQlsYWJlbCA9ICJTTjEiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjEiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuMjogYmNtLXNuMiB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOMj47CisJCQlsYWJlbCA9ICJTTjIiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjIiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuMzogYmNtLXNuMyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOMz47CisJCQlsYWJlbCA9ICJTTjMiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjMiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuNDogYmNtLXNuNCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOND47CisJCQlsYWJlbCA9ICJTTjQiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjQiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuNTogYmNtLXNuNSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NONT47CisJCQlsYWJlbCA9ICJTTjUiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjUiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuODogYmNtLXNuOCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOOD47CisJCQlsYWJlbCA9ICJTTjgiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjgiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX3NuMTA6IGJjbS1zbjEwIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19CQ01fU04xMD47CisJCQlsYWJlbCA9ICJTTjEwIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU04xMCI7CisJCQlxY29tLHJzY3MgPSA8JnJzY19hcHBzPjsKKwkJCXFjb20sYmNtLWRldjsKKwkJfTsKKworCQliY21fc24xMTogYmNtLXNuMTEgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9TTjExPjsKKwkJCWxhYmVsID0gIlNOMTEiOworCQkJcWNvbSxiY20tbmFtZSA9ICJTTjExIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2FwcHM+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9zbjEzOiBiY20tc24xMyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NOMTM+OworCQkJbGFiZWwgPSAiU04xMyI7CisJCQlxY29tLGJjbS1uYW1lID0gIlNOMTMiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfYXBwcz47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX21jMF9kaXNwbGF5OiBiY20tbWMwX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NQzBfRElTUExBWT47CisJCQlsYWJlbCA9ICJNQzBfRElTUExBWSI7CisJCQlxY29tLGJjbS1uYW1lID0gIk1DMCI7CisJCQlxY29tLHJzY3MgPSA8JnJzY19kaXNwPjsKKwkJCXFjb20sYmNtLWRldjsKKwkJfTsKKworCQliY21fc2gwX2Rpc3BsYXk6IGJjbS1zaDBfZGlzcGxheSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX1NIMF9ESVNQTEFZPjsKKwkJCWxhYmVsID0gIlNIMF9ESVNQTEFZIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiU0gwIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2Rpc3A+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTBfZGlzcGxheTogYmNtLW1tMF9kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19CQ01fTU0wX0RJU1BMQVk+OworCQkJbGFiZWwgPSAiTU0wX0RJU1BMQVkiOworCQkJcWNvbSxiY20tbmFtZSA9ICJNTTAiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfZGlzcD47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKwkJYmNtX21tMV9kaXNwbGF5OiBiY20tbW0xX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0JDTV9NTTFfRElTUExBWT47CisJCQlsYWJlbCA9ICJNTTFfRElTUExBWSI7CisJCQlxY29tLGJjbS1uYW1lID0gIk1NMSI7CisJCQlxY29tLHJzY3MgPSA8JnJzY19kaXNwPjsKKwkJCXFjb20sYmNtLWRldjsKKwkJfTsKKworCQliY21fbW0yX2Rpc3BsYXk6IGJjbS1tbTJfZGlzcGxheSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQkNNX01NMl9ESVNQTEFZPjsKKwkJCWxhYmVsID0gIk1NMl9ESVNQTEFZIjsKKwkJCXFjb20sYmNtLW5hbWUgPSAiTU0yIjsKKwkJCXFjb20scnNjcyA9IDwmcnNjX2Rpc3A+OworCQkJcWNvbSxiY20tZGV2OworCQl9OworCisJCWJjbV9tbTNfZGlzcGxheTogYmNtLW1tM19kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19CQ01fTU0zX0RJU1BMQVk+OworCQkJbGFiZWwgPSAiTU0zX0RJU1BMQVkiOworCQkJcWNvbSxiY20tbmFtZSA9ICJNTTMiOworCQkJcWNvbSxyc2NzID0gPCZyc2NfZGlzcD47CisJCQlxY29tLGJjbS1kZXY7CisJCX07CisKKworCQkvKkJ1c2VzKi8KKwkJZmFiX2FnZ3JlMV9ub2M6IGZhYi1hZ2dyZTFfbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19GQUJfQTFfTk9DPjsKKwkJCWxhYmVsID0gImZhYi1hZ2dyZTFfbm9jIjsKKwkJCXFjb20sZmFiLWRldjsKKwkJCXFjb20sYmFzZS1uYW1lID0gImFnZ3JlMV9ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8NDA5Nj47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDE2Mzg0PjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQlxY29tLGJ1cy10eXBlID0gPDE+OworCQkJY2xvY2tzID0gPD47CisJCX07CisKKwkJZmFiX2FnZ3JlMl9ub2M6IGZhYi1hZ2dyZTJfbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19GQUJfQTJfTk9DPjsKKwkJCWxhYmVsID0gImZhYi1hZ2dyZTJfbm9jIjsKKwkJCXFjb20sZmFiLWRldjsKKwkJCXFjb20sYmFzZS1uYW1lID0gImFnZ3JlMl9ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8MjA0OD47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDEyMjg4PjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQlxY29tLGJ1cy10eXBlID0gPDE+OworCQkJY2xvY2tzID0gPD47CisJCX07CisKKwkJZmFiX2NhbW5vY192aXJ0OiBmYWItY2Ftbm9jX3ZpcnQgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9DQU1OT0NfVklSVD47CisJCQlsYWJlbCA9ICJmYWItY2Ftbm9jX3ZpcnQiOworCQkJcWNvbSxmYWItZGV2OworCQkJcWNvbSxiYXNlLW5hbWUgPSAiY2Ftbm9jX3ZpcnQtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8MD47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDA+OworCQkJcWNvbSxieXBhc3MtcW9zLXByZzsKKwkJCWNsb2NrcyA9IDw+OworCQl9OworCisJCWZhYl9jb25maWdfbm9jOiBmYWItY29uZmlnX25vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfRkFCX0NPTkZJR19OT0M+OworCQkJbGFiZWwgPSAiZmFiLWNvbmZpZ19ub2MiOworCQkJcWNvbSxmYWItZGV2OworCQkJcWNvbSxiYXNlLW5hbWUgPSAiY29uZmlnX25vYy1iYXNlIjsKKwkJCXFjb20scW9zLW9mZiA9IDwwPjsKKwkJCXFjb20sYmFzZS1vZmZzZXQgPSA8MD47CisJCQlxY29tLGJ5cGFzcy1xb3MtcHJnOworCQkJcWNvbSxidXMtdHlwZSA9IDwxPjsKKwkJCWNsb2NrcyA9IDw+OworCQl9OworCisJCWZhYl9kY19ub2M6IGZhYi1kY19ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9EQ19OT0M+OworCQkJbGFiZWwgPSAiZmFiLWRjX25vYyI7CisJCQlxY29tLGZhYi1kZXY7CisJCQlxY29tLGJhc2UtbmFtZSA9ICJkY19ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8MD47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDA+OworCQkJcWNvbSxieXBhc3MtcW9zLXByZzsKKwkJCXFjb20sYnVzLXR5cGUgPSA8MT47CisJCQljbG9ja3MgPSA8PjsKKwkJfTsKKworCQlmYWJfZ2xhZGlhdG9yX25vYzogZmFiLWdsYWRpYXRvcl9ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9HTk9DPjsKKwkJCWxhYmVsID0gImZhYi1nbGFkaWF0b3Jfbm9jIjsKKwkJCXFjb20sZmFiLWRldjsKKwkJCXFjb20sYmFzZS1uYW1lID0gImdsYWRpYXRvcl9ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8MD47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDA+OworCQkJcWNvbSxieXBhc3MtcW9zLXByZzsKKwkJCXFjb20sYnVzLXR5cGUgPSA8MT47CisJCQljbG9ja3MgPSA8PjsKKwkJfTsKKworCQlmYWJfaXBhX3ZpcnQ6IGZhYi1pcGFfdmlydCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfRkFCX0lQQV9WSVJUPjsKKwkJCWxhYmVsID0gImZhYi1pcGFfdmlydCI7CisJCQlxY29tLGZhYi1kZXY7CisJCQlxY29tLGJhc2UtbmFtZSA9ICJpcGFfdmlydC1iYXNlIjsKKwkJCXFjb20scW9zLW9mZiA9IDwwPjsKKwkJCXFjb20sYmFzZS1vZmZzZXQgPSA8MD47CisJCQlxY29tLGJ5cGFzcy1xb3MtcHJnOworCQkJY2xvY2tzID0gPD47CisJCX07CisKKwkJZmFiX21jX3ZpcnQ6IGZhYi1tY192aXJ0IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19GQUJfTUNfVklSVD47CisJCQlsYWJlbCA9ICJmYWItbWNfdmlydCI7CisJCQlxY29tLGZhYi1kZXY7CisJCQlxY29tLGJhc2UtbmFtZSA9ICJtY192aXJ0LWJhc2UiOworCQkJcWNvbSxxb3Mtb2ZmID0gPDA+OworCQkJcWNvbSxiYXNlLW9mZnNldCA9IDwwPjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQljbG9ja3MgPSA8PjsKKwkJfTsKKworCQlmYWJfbWVtX25vYzogZmFiLW1lbV9ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9NRU1fTk9DPjsKKwkJCWxhYmVsID0gImZhYi1tZW1fbm9jIjsKKwkJCXFjb20sZmFiLWRldjsKKwkJCXFjb20sYmFzZS1uYW1lID0gIm1lbV9ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8NDA5Nj47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDY1NTM2PjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQlxY29tLGJ1cy10eXBlID0gPDE+OworCQkJY2xvY2tzID0gPD47CisJCX07CisKKwkJZmFiX21tc3Nfbm9jOiBmYWItbW1zc19ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9NTVNTX05PQz47CisJCQlsYWJlbCA9ICJmYWItbW1zc19ub2MiOworCQkJcWNvbSxmYWItZGV2OworCQkJcWNvbSxiYXNlLW5hbWUgPSAibW1zc19ub2MtYmFzZSI7CisJCQlxY29tLHFvcy1vZmYgPSA8NDA5Nj47CisJCQlxY29tLGJhc2Utb2Zmc2V0ID0gPDM2ODY0PjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQlxY29tLGJ1cy10eXBlID0gPDE+OworCQkJY2xvY2tzID0gPD47CisJCX07CisKKwkJZmFiX3N5c3RlbV9ub2M6IGZhYi1zeXN0ZW1fbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19GQUJfU1lTX05PQz47CisJCQlsYWJlbCA9ICJmYWItc3lzdGVtX25vYyI7CisJCQlxY29tLGZhYi1kZXY7CisJCQlxY29tLGJhc2UtbmFtZSA9ICJzeXN0ZW1fbm9jLWJhc2UiOworCQkJcWNvbSxxb3Mtb2ZmID0gPDQwOTY+OworCQkJcWNvbSxiYXNlLW9mZnNldCA9IDwzNjg2ND47CisJCQlxY29tLGJ5cGFzcy1xb3MtcHJnOworCQkJcWNvbSxidXMtdHlwZSA9IDwxPjsKKwkJCWNsb2NrcyA9IDw+OworCQl9OworCisJCWZhYl9tY192aXJ0X2Rpc3BsYXk6IGZhYi1tY192aXJ0X2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9NQ19WSVJUX0RJU1BMQVk+OworCQkJbGFiZWwgPSAiZmFiLW1jX3ZpcnRfZGlzcGxheSI7CisJCQlxY29tLGZhYi1kZXY7CisJCQlxY29tLGJhc2UtbmFtZSA9ICJtY192aXJ0LWJhc2UiOworCQkJcWNvbSxxb3Mtb2ZmID0gPDA+OworCQkJcWNvbSxiYXNlLW9mZnNldCA9IDwwPjsKKwkJCXFjb20sYnlwYXNzLXFvcy1wcmc7CisJCQljbG9ja3MgPSA8PjsKKwkJfTsKKworCQlmYWJfbWVtX25vY19kaXNwbGF5OiBmYWItbWVtX25vY19kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19GQUJfTUVNX05PQ19ESVNQTEFZPjsKKwkJCWxhYmVsID0gImZhYi1tZW1fbm9jX2Rpc3BsYXkiOworCQkJcWNvbSxmYWItZGV2OworCQkJcWNvbSxiYXNlLW5hbWUgPSAibWVtX25vYy1iYXNlIjsKKwkJCXFjb20scW9zLW9mZiA9IDw0MDk2PjsKKwkJCXFjb20sYmFzZS1vZmZzZXQgPSA8NjU1MzY+OworCQkJcWNvbSxieXBhc3MtcW9zLXByZzsKKwkJCXFjb20sYnVzLXR5cGUgPSA8MT47CisJCQljbG9ja3MgPSA8PjsKKwkJfTsKKworCQlmYWJfbW1zc19ub2NfZGlzcGxheTogZmFiLW1tc3Nfbm9jX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ZBQl9NTVNTX05PQ19ESVNQTEFZPjsKKwkJCWxhYmVsID0gImZhYi1tbXNzX25vY19kaXNwbGF5IjsKKwkJCXFjb20sZmFiLWRldjsKKwkJCXFjb20sYmFzZS1uYW1lID0gIm1tc3Nfbm9jLWJhc2UiOworCQkJcWNvbSxxb3Mtb2ZmID0gPDQwOTY+OworCQkJcWNvbSxiYXNlLW9mZnNldCA9IDwzNjg2ND47CisJCQlxY29tLGJ5cGFzcy1xb3MtcHJnOworCQkJcWNvbSxidXMtdHlwZSA9IDwxPjsKKwkJCWNsb2NrcyA9IDw+OworCQl9OworCisKKwkJLypNYXN0ZXJzKi8KKworCQltYXNfcWhtX2Exbm9jX2NmZzogbWFzLXFobS1hMW5vYy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9BMU5PQ19DRkc+OworCQkJbGFiZWwgPSAibWFzLXFobS1hMW5vYy1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3NydmNfYWdncmUxX25vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9hZ2dyZTFfbm9jPjsKKwkJfTsKKworCQltYXNfcWhtX3F1cDE6IG1hcy1xaG0tcXVwMSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0JMU1BfMT47CisJCQlsYWJlbCA9ICJtYXMtcWhtLXF1cDEiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwxNj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2Exbm9jX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUxX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9xdXAwPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCX07CisKKwkJbWFzX3FobV90c2lmOiBtYXMtcWhtLXRzaWYgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9UU0lGPjsKKwkJCWxhYmVsID0gIm1hcy1xaG0tdHNpZiI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2Exbm9jX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUxX25vYz47CisJCX07CisKKwkJbWFzX3htX2VtbWM6IG1hcy14bS1lbW1jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfRU1NQz47CisJCQlsYWJlbCA9ICJtYXMteG0tZW1tYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDM+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMW5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMV9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJfTsKKworCQltYXNfeG1fc2RjMjogbWFzLXhtLXNkYzIgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9TRENDXzI+OworCQkJbGFiZWwgPSAibWFzLXhtLXNkYzIiOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfYTFub2Nfc25vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9hZ2dyZTFfbm9jPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MT47CisJCX07CisKKwkJbWFzX3htX3NkYzQ6IG1hcy14bS1zZGM0IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfU0RDQ180PjsKKwkJCWxhYmVsID0gIm1hcy14bS1zZGM0IjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8Mj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2Exbm9jX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUxX25vYz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDE+OworCQl9OworCisJCW1hc194bV91ZnNfbWVtOiBtYXMteG0tdWZzLW1lbSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1VGU19NRU0+OworCQkJbGFiZWwgPSAibWFzLXhtLXVmcy1tZW0iOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw0PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfYTFub2Nfc25vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9hZ2dyZTFfbm9jPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8Mj47CisJCX07CisKKwkJbWFzX3FobV9hMm5vY19jZmc6IG1hcy1xaG0tYTJub2MtY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQTJOT0NfQ0ZHPjsKKwkJCWxhYmVsID0gIm1hcy1xaG0tYTJub2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9zcnZjX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUyX25vYz47CisJCX07CisKKwkJbWFzX3FobV9xZHNzX2JhbTogbWFzLXFobS1xZHNzLWJhbSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1FEU1NfQkFNPjsKKwkJCWxhYmVsID0gIm1hcy1xaG0tcWRzcy1iYW0iOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwxNz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2Eybm9jX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUyX25vYz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQl9OworCisJCW1hc19xaG1fcXVwMjogbWFzLXFobS1xdXAyIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQkxTUF8yPjsKKwkJCWxhYmVsID0gIm1hcy1xaG0tcXVwMiI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDA+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMm5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fcXVwMD47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQl9OworCisJCW1hc19xbm1fY25vYzogbWFzLXFubS1jbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ05PQ19BMk5PQz47CisJCQlsYWJlbCA9ICJtYXMtcW5tLWNub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwyPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfYTJub2Nfc25vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9hZ2dyZTJfbm9jPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MT47CisJCX07CisKKwkJbWFzX3F4bV9jcnlwdG86IG1hcy1xeG0tY3J5cHRvIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ1JZUFRPX0NPUkVfMD47CisJCQlsYWJlbCA9ICJtYXMtcXhtLWNyeXB0byI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDQ+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMm5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY2UwPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8Mj47CisJCX07CisKKwkJbWFzX3F4bV9pcGE6IG1hcy1xeG0taXBhIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfSVBBPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0taXBhIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8Nj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2Eybm9jX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUyX25vYz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDI+OworCQl9OworCisJCW1hc194bV9xZHNzX2V0cjogbWFzLXhtLXFkc3MtZXRyIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfUURTU19FVFI+OworCQkJbGFiZWwgPSAibWFzLXhtLXFkc3MtZXRyIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8MTY+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMm5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwyPjsKKwkJfTsKKworCQltYXNfeG1fdXNiM18wOiBtYXMteG0tdXNiMy0wIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfVVNCMz47CisJCQlsYWJlbCA9ICJtYXMteG0tdXNiMy0wIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8MjI+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMm5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwyPjsKKwkJfTsKKworCQltYXNfcXhtX2NhbW5vY19oZjBfdW5jb21wOiBtYXMtcXhtLWNhbW5vYy1oZjAtdW5jb21wIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ0FNTk9DX0hGMF9VTkNPTVA+OworCQkJbGFiZWwgPSAibWFzLXF4bS1jYW1ub2MtaGYwLXVuY29tcCI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19jYW1ub2NfdW5jb21wPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NhbW5vY192aXJ0PjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tMT47CisJCX07CisKKwkJbWFzX3F4bV9jYW1ub2NfaGYxX3VuY29tcDogbWFzLXF4bS1jYW1ub2MtaGYxLXVuY29tcCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0NBTU5PQ19IRjFfVU5DT01QPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0tY2Ftbm9jLWhmMS11bmNvbXAiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfY2Ftbm9jX3VuY29tcD47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jYW1ub2NfdmlydD47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTE+OworCQl9OworCisJCW1hc19xeG1fY2Ftbm9jX3NmX3VuY29tcDogbWFzLXF4bS1jYW1ub2Mtc2YtdW5jb21wIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ0FNTk9DX1NGX1VOQ09NUD47CisJCQlsYWJlbCA9ICJtYXMtcXhtLWNhbW5vYy1zZi11bmNvbXAiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfY2Ftbm9jX3VuY29tcD47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jYW1ub2NfdmlydD47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTE+OworCQl9OworCisJCW1hc19xaG1fc3BkbTogbWFzLXFobS1zcGRtIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfU1BETT47CisJCQlsYWJlbCA9ICJtYXMtcWhtLXNwZG0iOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19jbm9jX2Eybm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQltYXNfcWhtX3RpYzogbWFzLXFobS10aWMgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9USUM+OworCQkJbGFiZWwgPSAibWFzLXFobS10aWMiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Foc190bG1tX3NvdXRoCisJCQkJJnNsdl9xaHNfY2FtZXJhX2NmZyAmc2x2X3Foc19zZGM0CisJCQkJJnNsdl9xaHNfc2RjMiAmc2x2X3Foc19tbm9jX2NmZworCQkJCSZzbHZfcWhzX3Vmc19tZW1fY2ZnICZzbHZfcWhzX2dsbQorCQkJCSZzbHZfcWhzX3BkbSAmc2x2X3Foc19hMl9ub2NfY2ZnCisJCQkJJnNsdl9xaHNfcWRzc19jZmcgJnNsdl9xaHNfZGlzcGxheV9jZmcKKwkJCQkmc2x2X3Foc190Y3NyICZzbHZfcWhzX2RjY19jZmcKKwkJCQkmc2x2X3Foc19kZHJzc19jZmcgJnNsdl9xbnNfY25vY19hMm5vYworCQkJCSZzbHZfcWhzX3Nub2NfY2ZnICZzbHZfcWhzX3BoeV9yZWZnZW5fc291dGgKKwkJCQkmc2x2X3Foc19ncHVzc19jZmcgJnNsdl9xaHNfdmVudXNfY2ZnCisJCQkJJnNsdl9xaHNfdHNpZiAmc2x2X3Foc19jb21wdXRlX2RzcF9jZmcKKwkJCQkmc2x2X3Foc19hb3AgJnNsdl9xaHNfcXVwdjNfbm9ydGgKKwkJCQkmc2x2X3NydmNfY25vYyAmc2x2X3Foc191c2IzXzAKKwkJCQkmc2x2X3Foc19pcGEgJnNsdl9xaHNfY3ByX2N4CisJCQkJJnNsdl9xaHNfYTFfbm9jX2NmZyAmc2x2X3Foc19hb3NzCisJCQkJJnNsdl9xaHNfcHJuZyAmc2x2X3Foc192c2Vuc2VfY3RybF9jZmcKKwkJCQkmc2x2X3Foc19xdXB2M19zb3V0aCAmc2x2X3Foc19zcGRtCisJCQkJJnNsdl9xaHNfY3J5cHRvMF9jZmcgJnNsdl9xaHNfcGltZW1fY2ZnCisJCQkJJnNsdl9xaHNfdGxtbV9ub3J0aCAmc2x2X3Foc19jbGtfY3RsCisJCQkJJnNsdl9xaHNfaW1lbV9jZmc+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCW1hc19xbm1fc25vYzogbWFzLXFubS1zbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTk9DX0NOT0NfTUFTPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tc25vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcWhzX3RsbW1fc291dGgKKwkJCQkmc2x2X3Foc19jYW1lcmFfY2ZnICZzbHZfcWhzX3NkYzQKKwkJCQkmc2x2X3Foc19zZGMyICZzbHZfcWhzX21ub2NfY2ZnCisJCQkJJnNsdl9xaHNfdWZzX21lbV9jZmcgJnNsdl9xaHNfZ2xtCisJCQkJJnNsdl9xaHNfcGRtICZzbHZfcWhzX2EyX25vY19jZmcKKwkJCQkmc2x2X3Foc19xZHNzX2NmZyAmc2x2X3Foc19kaXNwbGF5X2NmZworCQkJCSZzbHZfcWhzX3Rjc3IgJnNsdl9xaHNfZGNjX2NmZworCQkJCSZzbHZfcWhzX2RkcnNzX2NmZyAmc2x2X3Foc19zbm9jX2NmZworCQkJCSZzbHZfcWhzX3BoeV9yZWZnZW5fc291dGggJnNsdl9xaHNfZ3B1c3NfY2ZnCisJCQkJJnNsdl9xaHNfdmVudXNfY2ZnICZzbHZfcWhzX3RzaWYKKwkJCQkmc2x2X3Foc19jb21wdXRlX2RzcF9jZmcgJnNsdl9xaHNfYW9wCisJCQkJJnNsdl9xaHNfcXVwdjNfbm9ydGggJnNsdl9zcnZjX2Nub2MKKwkJCQkmc2x2X3Foc191c2IzXzAgJnNsdl9xaHNfaXBhCisJCQkJJnNsdl9xaHNfY3ByX2N4ICZzbHZfcWhzX2ExX25vY19jZmcKKwkJCQkmc2x2X3Foc19hb3NzICZzbHZfcWhzX3BybmcKKwkJCQkmc2x2X3Foc192c2Vuc2VfY3RybF9jZmcgJnNsdl9xaHNfcXVwdjNfc291dGgKKwkJCQkmc2x2X3Foc19zcGRtICZzbHZfcWhzX2NyeXB0bzBfY2ZnCisJCQkJJnNsdl9xaHNfcGltZW1fY2ZnICZzbHZfcWhzX3RsbW1fbm9ydGgKKwkJCQkmc2x2X3Foc19jbGtfY3RsICZzbHZfcWhzX2ltZW1fY2ZnPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQltYXNfeG1fcWRzc19kYXA6IG1hcy14bS1xZHNzLWRhcCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1FEU1NfREFQPjsKKwkJCWxhYmVsID0gIm1hcy14bS1xZHNzLWRhcCI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcWhzX3RsbW1fc291dGgKKwkJCQkmc2x2X3Foc19jYW1lcmFfY2ZnCisJCQkJJnNsdl9xaHNfc2RjNAorCQkJCSZzbHZfcWhzX3NkYzIgJnNsdl9xaHNfbW5vY19jZmcKKwkJCQkmc2x2X3Foc191ZnNfbWVtX2NmZyAmc2x2X3Foc19nbG0KKwkJCQkmc2x2X3Foc19wZG0gJnNsdl9xaHNfYTJfbm9jX2NmZworCQkJCSZzbHZfcWhzX3Fkc3NfY2ZnICZzbHZfcWhzX2Rpc3BsYXlfY2ZnCisJCQkJJnNsdl9xaHNfdGNzciAmc2x2X3Foc19kY2NfY2ZnCisJCQkJJnNsdl9xaHNfZGRyc3NfY2ZnICZzbHZfcW5zX2Nub2NfYTJub2MKKwkJCQkmc2x2X3Foc19zbm9jX2NmZyAmc2x2X3Foc19waHlfcmVmZ2VuX3NvdXRoCisJCQkJJnNsdl9xaHNfZ3B1c3NfY2ZnICZzbHZfcWhzX3ZlbnVzX2NmZworCQkJCSZzbHZfcWhzX3RzaWYgJnNsdl9xaHNfY29tcHV0ZV9kc3BfY2ZnCisJCQkJJnNsdl9xaHNfYW9wICZzbHZfcWhzX3F1cHYzX25vcnRoCisJCQkJJnNsdl9zcnZjX2Nub2MgJnNsdl9xaHNfdXNiM18wCisJCQkJJnNsdl9xaHNfaXBhICZzbHZfcWhzX2Nwcl9jeAorCQkJCSZzbHZfcWhzX2ExX25vY19jZmcgJnNsdl9xaHNfYW9zcworCQkJCSZzbHZfcWhzX3BybmcgJnNsdl9xaHNfdnNlbnNlX2N0cmxfY2ZnCisJCQkJJnNsdl9xaHNfcXVwdjNfc291dGggJnNsdl9xaHNfc3BkbQorCQkJCSZzbHZfcWhzX2NyeXB0bzBfY2ZnICZzbHZfcWhzX3BpbWVtX2NmZworCQkJCSZzbHZfcWhzX3RsbW1fbm9ydGggJnNsdl9xaHNfY2xrX2N0bAorCQkJCSZzbHZfcWhzX2ltZW1fY2ZnPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQltYXNfcWhtX2Nub2M6IG1hcy1xaG0tY25vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0NOT0NfRENfTk9DPjsKKwkJCWxhYmVsID0gIm1hcy1xaG0tY25vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcWhzX21lbW5vYyAmc2x2X3Foc19sbGNjPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2RjX25vYz47CisJCX07CisKKwkJbWFzX2FjbV9sMzogbWFzLWFjbS1sMyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0FNUFNTX00wPjsKKwkJCWxhYmVsID0gIm1hcy1hY20tbDMiOworCQkJcWNvbSxidXN3aWR0aCA9IDwxNj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9zcnZjX2dub2MKKwkJCQkmc2x2X3Fuc19nbGFkaWF0b3Jfc29kdiAmc2x2X3Fuc19nbm9jX21lbW5vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9nbGFkaWF0b3Jfbm9jPjsKKwkJfTsKKworCQltYXNfcG1fZ25vY19jZmc6IG1hcy1wbS1nbm9jLWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0dOT0NfQ0ZHPjsKKwkJCWxhYmVsID0gIm1hcy1wbS1nbm9jLWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfc3J2Y19nbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2dsYWRpYXRvcl9ub2M+OworCQl9OworCisJCW1hc19pcGFfY29yZV9tYXN0ZXI6IG1hcy1pcGEtY29yZS1tYXN0ZXIgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9JUEFfQ09SRT47CisJCQlsYWJlbCA9ICJtYXMtaXBhLWNvcmUtbWFzdGVyIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9pcGFfY29yZV9zbGF2ZT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9pcGFfdmlydD47CisJCX07CisKKwkJbWFzX2xsY2NfbWM6IG1hcy1sbGNjLW1jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfTExDQz47CisJCQlsYWJlbCA9ICJtYXMtbGxjYy1tYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8Mj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfZWJpPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21jX3ZpcnQ+OworCQl9OworCisJCW1hc19hY21fdGN1OiBtYXMtYWNtLXRjdSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1RDVV8wPjsKKwkJCWxhYmVsID0gIm1hcy1hY20tdGN1IjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8MD47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2FwcHNfaW8gJnNsdl9xbnNfbGxjYworCQkJCSZzbHZfcW5zX21lbW5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc2gzPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8Nj47CisJCX07CisKKwkJbWFzX3FobV9tZW1ub2NfY2ZnOiBtYXMtcWhtLW1lbW5vYy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9NRU1fTk9DX0NGRz47CisJCQlsYWJlbCA9ICJtYXMtcWhtLW1lbW5vYy1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3NydmNfbWVtbm9jCisJCQkJJnNsdl9xaHNfbWRzcF9tc19tcHVfY2ZnPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQl9OworCisJCW1hc19xbm1fYXBwczogbWFzLXFubS1hcHBzIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfR05PQ19NRU1fTk9DPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tYXBwcyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDI+OworCQkJcWNvbSxxcG9ydCA9IDwyIDM+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19sbGNjPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc2g1PjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCX07CisKKwkJbWFzX3FubV9tbm9jX2hmOiBtYXMtcW5tLW1ub2MtaGYgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9NTk9DX0hGX01FTV9OT0M+OworCQkJbGFiZWwgPSAibWFzLXFubS1tbm9jLWhmIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MzI+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8Mj47CisJCQlxY29tLHFwb3J0ID0gPDQgNT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX2xsY2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbWVtX25vYz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQkJcWNvbSxmb3J3YXJkaW5nOworCQl9OworCisJCW1hc19xbm1fbW5vY19zZjogbWFzLXFubS1tbm9jLXNmIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfTU5PQ19TRl9NRU1fTk9DPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tbW5vYy1zZiI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw3PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfYXBwc19pbworCQkJCSAmc2x2X3Fuc19sbGNjICZzbHZfcW5zX21lbW5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJCXFjb20sZm9yd2FyZGluZzsKKwkJfTsKKworCQltYXNfcW5tX3Nub2NfZ2M6IG1hcy1xbm0tc25vYy1nYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1NOT0NfR0NfTUVNX05PQz47CisJCQlsYWJlbCA9ICJtYXMtcW5tLXNub2MtZ2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw4PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfbGxjYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tZW1fbm9jPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCQlxY29tLGZvcndhcmRpbmc7CisJCX07CisKKwkJbWFzX3FubV9zbm9jX3NmOiBtYXMtcW5tLXNub2Mtc2YgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9TTk9DX1NGX01FTV9OT0M+OworCQkJbGFiZWwgPSAibWFzLXFubS1zbm9jLXNmIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MTY+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDk+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hcHBzX2lvICZzbHZfcW5zX2xsY2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbWVtX25vYz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQkJcWNvbSxmb3J3YXJkaW5nOworCQl9OworCisJCW1hc19xeG1fZ3B1OiBtYXMtcXhtLWdwdSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0dSQVBISUNTXzNEPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0tZ3B1IjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MzI+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8Mj47CisJCQlxY29tLHFwb3J0ID0gPDEwIDExPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfYXBwc19pbworCQkJCSAmc2x2X3Fuc19sbGNjICZzbHZfcW5zX21lbW5vY19zbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJfTsKKworCQltYXNfcWhtX21ub2NfY2ZnOiBtYXMtcWhtLW1ub2MtY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ05PQ19NTk9DX0NGRz47CisJCQlsYWJlbCA9ICJtYXMtcWhtLW1ub2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9zcnZjX21ub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2M+OworCQl9OworCisJCW1hc19xeG1fY2Ftbm9jX2hmMDogbWFzLXF4bS1jYW1ub2MtaGYwIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQ0FNTk9DX0hGMD47CisJCQlsYWJlbCA9ICJtYXMtcXhtLWNhbW5vYy1oZjAiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8MT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX21lbV9ub2NfaGY+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fbW0xPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCQlxY29tLGZvcndhcmRpbmc7CisJCX07CisKKwkJbWFzX3F4bV9jYW1ub2NfaGYxOiBtYXMtcXhtLWNhbW5vYy1oZjEgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9DQU1OT0NfSEYxPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0tY2Ftbm9jLWhmMSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwyPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfbWVtX25vY19oZj47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tbXNzX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTE+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJCXFjb20sZm9yd2FyZGluZzsKKwkJfTsKKworCQltYXNfcXhtX2NhbW5vY19zZjogbWFzLXF4bS1jYW1ub2Mtc2YgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9DQU1OT0NfU0Y+OworCQkJbGFiZWwgPSAibWFzLXF4bS1jYW1ub2Mtc2YiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8MD47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zMl9tZW1fbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tMz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQkJcWNvbSxmb3J3YXJkaW5nOworCQl9OworCisJCW1hc19xeG1fbWRwMDogbWFzLXF4bS1tZHAwIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfTURQX1BPUlQwPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0tbWRwMCI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDwzPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfbWVtX25vY19oZj47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tbXNzX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTE+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJCXFjb20sZm9yd2FyZGluZzsKKwkJfTsKKworCQltYXNfcXhtX21kcDE6IG1hcy1xeG0tbWRwMSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX01EUF9QT1JUMT47CisJCQlsYWJlbCA9ICJtYXMtcXhtLW1kcDEiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8ND47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX21lbV9ub2NfaGY+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fbW0xPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCQlxY29tLGZvcndhcmRpbmc7CisJCX07CisKKwkJbWFzX3F4bV9yb3Q6IG1hcy1xeG0tcm90IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfUk9UQVRPUj47CisJCQlsYWJlbCA9ICJtYXMtcXhtLXJvdCI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw1PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnMyX21lbV9ub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fbW0zPjsKKwkJCXFjb20sYXAtb3duZWQ7CisJCQlxY29tLHByaW8gPSA8MD47CisJCQlxY29tLGZvcndhcmRpbmc7CisJCX07CisKKwkJbWFzX3F4bV92ZW51czA6IG1hcy1xeG0tdmVudXMwIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfVklERU9fUDA+OworCQkJbGFiZWwgPSAibWFzLXF4bS12ZW51czAiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8Nj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zMl9tZW1fbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tMz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQkJcWNvbSxmb3J3YXJkaW5nOworCQl9OworCisJCW1hc19xeG1fdmVudXMxOiBtYXMtcXhtLXZlbnVzMSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1ZJREVPX1AxPjsKKwkJCWxhYmVsID0gIm1hcy1xeG0tdmVudXMxIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MzI+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDc+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3FuczJfbWVtX25vYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tbXNzX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTM+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwwPjsKKwkJCXFjb20sZm9yd2FyZGluZzsKKwkJfTsKKworCQltYXNfcXhtX3ZlbnVzX2FybTk6IG1hcy1xeG0tdmVudXMtYXJtOSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX1ZJREVPX1BST0M+OworCQkJbGFiZWwgPSAibWFzLXF4bS12ZW51cy1hcm05IjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8OD47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zMl9tZW1fbm9jPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tMz47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDA+OworCQkJcWNvbSxmb3J3YXJkaW5nOworCQl9OworCisJCW1hc19xaG1fc25vY19jZmc6IG1hcy1xaG0tc25vYy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9TTk9DX0NGRz47CisJCQlsYWJlbCA9ICJtYXMtcWhtLXNub2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9zcnZjX3Nub2M+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCX07CisKKwkJbWFzX3FubV9hZ2dyZTFfbm9jOiBtYXMtcW5tLWFnZ3JlMS1ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0ExTk9DX1NOT0NfTUFTPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tYWdncmUxLW5vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDE2PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3F4c19waW1lbQorCQkJCSAmc2x2X3Fuc19tZW1ub2Nfc2YgJnNsdl9xeHNfaW1lbQorCQkJCSAmc2x2X3Foc19hcHNzICZzbHZfcW5zX2Nub2MKKwkJCQkgJnNsdl94c19xZHNzX3N0bT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NuOD47CisJCX07CisKKwkJbWFzX3FubV9hZ2dyZTJfbm9jOiBtYXMtcW5tLWFnZ3JlMi1ub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0EyTk9DX1NOT0NfTUFTPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tYWdncmUyLW5vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDE2PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3F4c19waW1lbQorCQkJCSZzbHZfcW5zX21lbW5vY19zZiAmc2x2X3F4c19pbWVtCisJCQkJJnNsdl9xaHNfYXBzcyAmc2x2X3Fuc19jbm9jCisJCQkJJnNsdl94c19zeXNfdGN1X2NmZyAmc2x2X3hzX3Fkc3Nfc3RtPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX3N5c3RlbV9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc24xMD47CisJCX07CisKKwkJbWFzX3FubV9nbGFkaWF0b3Jfc29kdjogbWFzLXFubS1nbGFkaWF0b3Itc29kdiB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfTUFTVEVSX0dOT0NfU05PQz47CisJCQlsYWJlbCA9ICJtYXMtcW5tLWdsYWRpYXRvci1zb2R2IjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xeHNfcGltZW0KKwkJCQkmc2x2X3F4c19pbWVtICZzbHZfcWhzX2Fwc3MKKwkJCQkmc2x2X3Fuc19jbm9jICZzbHZfeHNfc3lzX3RjdV9jZmcKKwkJCQkmc2x2X3hzX3Fkc3Nfc3RtPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX3N5c3RlbV9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc24xMT47CisJCX07CisKKwkJbWFzX3FubV9tZW1ub2M6IG1hcy1xbm0tbWVtbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfTUVNX05PQ19TTk9DPjsKKwkJCWxhYmVsID0gIm1hcy1xbm0tbWVtbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xeHNfaW1lbQorCQkJCSZzbHZfcWhzX2Fwc3MgJnNsdl9xeHNfcGltZW0KKwkJCQkmc2x2X3Fuc19jbm9jICZzbHZfeHNfcWRzc19zdG0+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjEzPjsKKwkJfTsKKworCQltYXNfcXhtX3BpbWVtOiBtYXMtcXhtLXBpbWVtIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfUElNRU0+OworCQkJbGFiZWwgPSAibWFzLXF4bS1waW1lbSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDM+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3F4c19pbWVtICZzbHZfcW5zX21lbW5vY19nYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NuND47CisJCQlxY29tLGFwLW93bmVkOworCQkJcWNvbSxwcmlvID0gPDI+OworCQl9OworCisJCW1hc194bV9naWM6IG1hcy14bS1naWMgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9HSUM+OworCQkJbGFiZWwgPSAibWFzLXhtLWdpYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLHFwb3J0ID0gPDA+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3F4c19pbWVtICZzbHZfcW5zX21lbW5vY19nYz47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NuMTE+OworCQkJcWNvbSxhcC1vd25lZDsKKwkJCXFjb20scHJpbyA9IDwxPjsKKwkJfTsKKworCQltYXNfYWxjOiBtYXMtYWxjIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfQUxDPjsKKwkJCWxhYmVsID0gIm1hcy1hbGMiOworCQkJcWNvbSxidXN3aWR0aCA9IDwxPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbWNfdmlydD47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9hbGM+OworCQl9OworCisJCW1hc19sbGNjX21jX2Rpc3BsYXk6IG1hcy1sbGNjLW1jX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9MTENDX0RJU1BMQVk+OworCQkJbGFiZWwgPSAibWFzLWxsY2MtbWNfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8Mj47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfZWJpX2Rpc3BsYXk+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbWNfdmlydF9kaXNwbGF5PjsKKwkJfTsKKworCQltYXNfcW5tX21ub2NfaGZfZGlzcGxheTogbWFzLXFubS1tbm9jLWhmX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9NTk9DX0hGX01FTV9OT0NfRElTUExBWT47CisJCQlsYWJlbCA9ICJtYXMtcW5tLW1ub2MtaGZfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDI+OworCQkJcWNvbSxxcG9ydCA9IDw0IDU+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19sbGNjX2Rpc3BsYXk+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbWVtX25vY19kaXNwbGF5PjsKKwkJfTsKKworCQltYXNfcW5tX21ub2Nfc2ZfZGlzcGxheTogbWFzLXFubS1tbm9jLXNmX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9NTk9DX1NGX01FTV9OT0NfRElTUExBWT47CisJCQlsYWJlbCA9ICJtYXMtcW5tLW1ub2Mtc2ZfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw3PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfbGxjY19kaXNwbGF5PjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2NfZGlzcGxheT47CisJCX07CisKKwkJbWFzX3F4bV9tZHAwX2Rpc3BsYXk6IG1hcy1xeG0tbWRwMF9kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19NQVNURVJfTURQX1BPUlQwX0RJU1BMQVk+OworCQkJbGFiZWwgPSAibWFzLXF4bS1tZHAwX2Rpc3BsYXkiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20scXBvcnQgPSA8Mz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZzbHZfcW5zX21lbV9ub2NfaGZfZGlzcGxheT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tbXNzX25vY19kaXNwbGF5PjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tMV9kaXNwbGF5PjsKKwkJfTsKKworCQltYXNfcXhtX21kcDFfZGlzcGxheTogbWFzLXF4bS1tZHAxX2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9NRFBfUE9SVDFfRElTUExBWT47CisJCQlsYWJlbCA9ICJtYXMtcXhtLW1kcDFfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw0PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnNfbWVtX25vY19oZl9kaXNwbGF5PjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jX2Rpc3BsYXk+OworCQkJcWNvbSxiY21zID0gPCZiY21fbW0xX2Rpc3BsYXk+OworCQl9OworCisJCW1hc19xeG1fcm90X2Rpc3BsYXk6IG1hcy1xeG0tcm90X2Rpc3BsYXkgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX01BU1RFUl9ST1RBVE9SX0RJU1BMQVk+OworCQkJbGFiZWwgPSAibWFzLXF4bS1yb3RfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxxcG9ydCA9IDw1PjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8JnNsdl9xbnMyX21lbV9ub2NfZGlzcGxheT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tbXNzX25vY19kaXNwbGF5PjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX21tM19kaXNwbGF5PjsKKwkJfTsKKworCQkvKkludGVybmFsIG5vZGVzKi8KKworCQkvKlNsYXZlcyovCisKKwkJc2x2X3Fuc19hMW5vY19zbm9jOnNsdi1xbnMtYTFub2Mtc25vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfQTFOT0NfU05PQ19TTFY+OworCQkJbGFiZWwgPSAic2x2LXFucy1hMW5vYy1zbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MTY+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9hZ2dyZTFfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fYWdncmUxX25vYz47CisJCX07CisKKwkJc2x2X3NydmNfYWdncmUxX25vYzpzbHYtc3J2Yy1hZ2dyZTEtbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9TRVJWSUNFX0ExTk9DPjsKKwkJCWxhYmVsID0gInNsdi1zcnZjLWFnZ3JlMS1ub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUxX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjg+OworCQl9OworCisJCXNsdl9xbnNfYTJub2Nfc25vYzpzbHYtcW5zLWEybm9jLXNub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX0EyTk9DX1NOT0NfU0xWPjsKKwkJCWxhYmVsID0gInNsdi1xbnMtYTJub2Mtc25vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDE2PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfYWdncmUyX25vYz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfcW5tX2FnZ3JlMl9ub2M+OworCQl9OworCisJCXNsdl9zcnZjX2FnZ3JlMl9ub2M6c2x2LXNydmMtYWdncmUyLW5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfU0VSVklDRV9BMk5PQz47CisJCQlsYWJlbCA9ICJzbHYtc3J2Yy1hZ2dyZTItbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc24xMD47CisJCX07CisKKwkJc2x2X3Fuc19jYW1ub2NfdW5jb21wOnNsdi1xbnMtY2Ftbm9jLXVuY29tcCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQ0FNTk9DX1VOQ09NUD47CisJCQlsYWJlbCA9ICJzbHYtcW5zLWNhbW5vYy11bmNvbXAiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NhbW5vY192aXJ0PjsKKwkJfTsKKworCQlzbHZfcWhzX2ExX25vY19jZmc6c2x2LXFocy1hMS1ub2MtY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9BMU5PQ19DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1hMS1ub2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FobV9hMW5vY19jZmc+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2EyX25vY19jZmc6c2x2LXFocy1hMi1ub2MtY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9BMk5PQ19DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1hMi1ub2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FobV9hMm5vY19jZmc+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2FvcDpzbHYtcWhzLWFvcCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQU9QPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtYW9wIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2Fvc3M6c2x2LXFocy1hb3NzIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9BT1NTPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtYW9zcyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19jYW1lcmFfY2ZnOnNsdi1xaHMtY2FtZXJhLWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQ0FNRVJBX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWNhbWVyYS1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfY2xrX2N0bDpzbHYtcWhzLWNsay1jdGwgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0NMS19DVEw+OworCQkJbGFiZWwgPSAic2x2LXFocy1jbGstY3RsIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2NvbXB1dGVfZHNwX2NmZzpzbHYtcWhzLWNvbXB1dGUtZHNwLWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQ0RTUF9DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1jb21wdXRlLWRzcC1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfY3ByX2N4OnNsdi1xaHMtY3ByLWN4IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9SQkNQUl9DWF9DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1jcHItY3giOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfY3J5cHRvMF9jZmc6c2x2LXFocy1jcnlwdG8wLWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQ1JZUFRPXzBfQ0ZHPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtY3J5cHRvMC1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfZGNjX2NmZzpzbHYtcWhzLWRjYy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0RDQ19DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1kY2MtY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FobV9jbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19kZHJzc19jZmc6c2x2LXFocy1kZHJzcy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0NOT0NfRERSU1M+OworCQkJbGFiZWwgPSAic2x2LXFocy1kZHJzcy1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfZGlzcGxheV9jZmc6c2x2LXFocy1kaXNwbGF5LWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfRElTUExBWV9DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1kaXNwbGF5LWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19nbG06c2x2LXFocy1nbG0geworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0dMTT47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWdsbSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19ncHVzc19jZmc6c2x2LXFocy1ncHVzcy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0dSQVBISUNTXzNEX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWdwdXNzLWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19pbWVtX2NmZzpzbHYtcWhzLWltZW0tY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9JTUVNX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWltZW0tY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2lwYTpzbHYtcWhzLWlwYSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfSVBBX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWlwYSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19tbm9jX2NmZzpzbHYtcWhzLW1ub2MtY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9DTk9DX01OT0NfQ0ZHPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtbW5vYy1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfcWhtX21ub2NfY2ZnPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19wZG06c2x2LXFocy1wZG0geworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1BETT47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXBkbSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc19waHlfcmVmZ2VuX3NvdXRoOnNsdi1xaHMtcGh5LXJlZmdlbi1zb3V0aCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfU09VVEhfUEhZX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXBoeS1yZWZnZW4tc291dGgiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfcGltZW1fY2ZnOnNsdi1xaHMtcGltZW0tY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9QSU1FTV9DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1waW1lbS1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfcHJuZzpzbHYtcWhzLXBybmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1BSTkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1wcm5nIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX3Fkc3NfY2ZnOnNsdi1xaHMtcWRzcy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1FEU1NfQ0ZHPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtcWRzcy1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfcXVwdjNfbm9ydGg6c2x2LXFocy1xdXB2My1ub3J0aCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQkxTUF8yPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtcXVwdjMtbm9ydGgiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfcXVwdjNfc291dGg6c2x2LXFocy1xdXB2My1zb3V0aCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQkxTUF8xPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtcXVwdjMtc291dGgiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfc2RjMjpzbHYtcWhzLXNkYzIgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1NEQ0NfMj47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXNkYzIiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfc2RjNDpzbHYtcWhzLXNkYzQgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1NEQ0NfND47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXNkYzQiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfc25vY19jZmc6c2x2LXFocy1zbm9jLWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfU05PQ19DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1zbm9jLWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xaG1fc25vY19jZmc+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX3NwZG06c2x2LXFocy1zcGRtIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9TUERNX1dSQVBQRVI+OworCQkJbGFiZWwgPSAic2x2LXFocy1zcGRtIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX3Rjc3I6c2x2LXFocy10Y3NyIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9UQ1NSPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtdGNzciI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc190bG1tX25vcnRoOnNsdi1xaHMtdGxtbS1ub3J0aCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfVExNTV9OT1JUSD47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXRsbW0tbm9ydGgiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9jbjA+OworCQl9OworCisJCXNsdl9xaHNfdGxtbV9zb3V0aDpzbHYtcWhzLXRsbW0tc291dGggeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1RMTU1fU09VVEg+OworCQkJbGFiZWwgPSAic2x2LXFocy10bG1tLXNvdXRoIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX3RzaWY6c2x2LXFocy10c2lmIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9UU0lGPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtdHNpZiI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc191ZnNfbWVtX2NmZzpzbHYtcWhzLXVmcy1tZW0tY2ZnIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9VRlNfTUVNX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXVmcy1tZW0tY2ZnIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX3VzYjNfMDpzbHYtcWhzLXVzYjMtMCB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfVVNCMz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXVzYjMtMCI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc192ZW51c19jZmc6c2x2LXFocy12ZW51cy1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1ZFTlVTX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXZlbnVzLWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Foc192c2Vuc2VfY3RybF9jZmc6c2x2LXFocy12c2Vuc2UtY3RybC1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1ZTRU5TRV9DVFJMX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLXZzZW5zZS1jdHJsLWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9jb25maWdfbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX2NuMD47CisJCX07CisKKwkJc2x2X3Fuc19jbm9jX2Eybm9jOnNsdi1xbnMtY25vYy1hMm5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfQ05PQ19BMk5PQz47CisJCQlsYWJlbCA9ICJzbHYtcW5zLWNub2MtYTJub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfY29uZmlnX25vYz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfcW5tX2Nub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfc3J2Y19jbm9jOnNsdi1zcnZjLWNub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1NFUlZJQ0VfQ05PQz47CisJCQlsYWJlbCA9ICJzbHYtc3J2Yy1jbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2NvbmZpZ19ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fY24wPjsKKwkJfTsKKworCQlzbHZfcWhzX2xsY2M6c2x2LXFocy1sbGNjIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9MTENDX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLWxsY2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfZGNfbm9jPjsKKwkJfTsKKworCQlzbHZfcWhzX21lbW5vYzpzbHYtcWhzLW1lbW5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfTUVNX05PQ19DRkc+OworCQkJbGFiZWwgPSAic2x2LXFocy1tZW1ub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfZGNfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xaG1fbWVtbm9jX2NmZz47CisJCX07CisKKwkJc2x2X3Fuc19nbGFkaWF0b3Jfc29kdjpzbHYtcW5zLWdsYWRpYXRvci1zb2R2IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9HTk9DX1NOT0M+OworCQkJbGFiZWwgPSAic2x2LXFucy1nbGFkaWF0b3Itc29kdiI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9nbGFkaWF0b3Jfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fZ2xhZGlhdG9yX3NvZHY+OworCQl9OworCisJCXNsdl9xbnNfZ25vY19tZW1ub2M6c2x2LXFucy1nbm9jLW1lbW5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfR05PQ19NRU1fTk9DPjsKKwkJCWxhYmVsID0gInNsdi1xbnMtZ25vYy1tZW1ub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwyPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2dsYWRpYXRvcl9ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FubV9hcHBzPjsKKwkJfTsKKworCQlzbHZfc3J2Y19nbm9jOnNsdi1zcnZjLWdub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1NFUlZJQ0VfR05PQz47CisJCQlsYWJlbCA9ICJzbHYtc3J2Yy1nbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2dsYWRpYXRvcl9ub2M+OworCQl9OworCisJCXNsdl9pcGFfY29yZV9zbGF2ZTpzbHYtaXBhLWNvcmUtc2xhdmUgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0lQQV9DT1JFPjsKKwkJCWxhYmVsID0gInNsdi1pcGEtY29yZS1zbGF2ZSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9pcGFfdmlydD47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9pcDA+OworCQl9OworCisJCXNsdl9lYmk6c2x2LWViaSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfRUJJX0NIMD47CisJCQlsYWJlbCA9ICJzbHYtZWJpIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwyPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21jX3ZpcnQ+OworCQkJcWNvbSxiY21zID0gPCZiY21fbWMwPiwgPCZiY21fYWN2PjsKKwkJfTsKKworCQlzbHZfcWhzX21kc3BfbXNfbXB1X2NmZzpzbHYtcWhzLW1kc3AtbXMtbXB1LWNmZyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfTVNTX1BST0NfTVNfTVBVX0NGRz47CisJCQlsYWJlbCA9ICJzbHYtcWhzLW1kc3AtbXMtbXB1LWNmZyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tZW1fbm9jPjsKKwkJfTsKKworCQlzbHZfcW5zX2FwcHNfaW86c2x2LXFucy1hcHBzLWlvIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9NRU1fTk9DX0dOT0M+OworCQkJbGFiZWwgPSAic2x2LXFucy1hcHBzLWlvIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MzI+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tZW1fbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NoMT47CisJCX07CisKKwkJc2x2X3Fuc19sbGNjOnNsdi1xbnMtbGxjYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfTExDQz47CisJCQlsYWJlbCA9ICJzbHYtcW5zLWxsY2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDwxNj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwyPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX2xsY2NfbWM+OworCQkJcWNvbSxiY21zID0gPCZiY21fc2gwPjsKKwkJfTsKKworCQlzbHZfcW5zX21lbW5vY19zbm9jOnNsdi1xbnMtbWVtbm9jLXNub2MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX01FTV9OT0NfU05PQz47CisJCQlsYWJlbCA9ICJzbHYtcW5zLW1lbW5vYy1zbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8OD47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FubV9tZW1ub2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc2gyPjsKKwkJfTsKKworCQlzbHZfc3J2Y19tZW1ub2M6c2x2LXNydmMtbWVtbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9TRVJWSUNFX01FTV9OT0M+OworCQkJbGFiZWwgPSAic2x2LXNydmMtbWVtbm9jIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8ND47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OworCQl9OworCisJCXNsdl9xbnMyX21lbV9ub2M6c2x2LXFuczItbWVtLW5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfTU5PQ19TRl9NRU1fTk9DPjsKKwkJCWxhYmVsID0gInNsdi1xbnMyLW1lbS1ub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fbW5vY19zZj47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTI+OworCQl9OworCisJCXNsdl9xbnNfbWVtX25vY19oZjpzbHYtcW5zLW1lbS1ub2MtaGYgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX01OT0NfSEZfTUVNX05PQz47CisJCQlsYWJlbCA9ICJzbHYtcW5zLW1lbS1ub2MtaGYiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwyPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fbW5vY19oZj47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTA+OworCQl9OworCisJCXNsdl9zcnZjX21ub2M6c2x2LXNydmMtbW5vYyB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfU0VSVklDRV9NTk9DPjsKKwkJCWxhYmVsID0gInNsdi1zcnZjLW1ub2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2M+OworCQl9OworCisJCXNsdl9xaHNfYXBzczpzbHYtcWhzLWFwc3MgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX0FQUFNTPjsKKwkJCWxhYmVsID0gInNsdi1xaHMtYXBzcyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJfTsKKworCQlzbHZfcW5zX2Nub2M6c2x2LXFucy1jbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTk9DX0NOT0NfU0xWPjsKKwkJCWxhYmVsID0gInNsdi1xbnMtY25vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fc25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjM+OworCQl9OworCisJCXNsdl9xbnNfbWVtbm9jX2djOnNsdi1xbnMtbWVtbm9jLWdjIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9TTk9DX01FTV9OT0NfR0M+OworCQkJbGFiZWwgPSAic2x2LXFucy1tZW1ub2MtZ2MiOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfcW5tX3Nub2NfZ2M+OworCQkJcWNvbSxiY21zID0gPCZiY21fc24yPjsKKwkJfTsKKworCQlzbHZfcW5zX21lbW5vY19zZjpzbHYtcW5zLW1lbW5vYy1zZiB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfU05PQ19NRU1fTk9DX1NGPjsKKwkJCWxhYmVsID0gInNsdi1xbnMtbWVtbm9jLXNmIjsKKwkJCXFjb20sYnVzd2lkdGggPSA8MTY+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sY29ubmVjdGlvbnMgPSA8Jm1hc19xbm1fc25vY19zZj47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjA+OworCQl9OworCisJCXNsdl9xeHNfaW1lbTpzbHYtcXhzLWltZW0geworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX09DSU1FTT47CisJCQlsYWJlbCA9ICJzbHYtcXhzLWltZW0iOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjE+OworCQl9OworCisJCXNsdl9xeHNfcGltZW06c2x2LXF4cy1waW1lbSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfUElNRU0+OworCQkJbGFiZWwgPSAic2x2LXF4cy1waW1lbSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDg+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NuND47CisJCX07CisKKwkJc2x2X3NydmNfc25vYzpzbHYtc3J2Yy1zbm9jIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9TRVJWSUNFX1NOT0M+OworCQkJbGFiZWwgPSAic2x2LXNydmMtc25vYyI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8MT47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9zeXN0ZW1fbm9jPjsKKwkJfTsKKworCQlzbHZfeHNfcWRzc19zdG06c2x2LXhzLXFkc3Mtc3RtIHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9RRFNTX1NUTT47CisJCQlsYWJlbCA9ICJzbHYteHMtcWRzcy1zdG0iOworCQkJcWNvbSxidXN3aWR0aCA9IDw0PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9zbjU+OworCQl9OworCisJCXNsdl94c19zeXNfdGN1X2NmZzpzbHYteHMtc3lzLXRjdS1jZmcgeworCQkJY2VsbC1pZCA9IDxNU01fQlVTX1NMQVZFX1RDVT47CisJCQlsYWJlbCA9ICJzbHYteHMtc3lzLXRjdS1jZmciOworCQkJcWNvbSxidXN3aWR0aCA9IDw4PjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDE+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfc3lzdGVtX25vYz47CisJCX07CisKKwkJc2x2X2ViaV9kaXNwbGF5OnNsdi1lYmlfZGlzcGxheSB7CisJCQljZWxsLWlkID0gPE1TTV9CVVNfU0xBVkVfRUJJX0NIMF9ESVNQTEFZPjsKKwkJCWxhYmVsID0gInNsdi1lYmlfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDQ+OworCQkJcWNvbSxhZ2ctcG9ydHMgPSA8Mj47CisJCQlxY29tLGJ1cy1kZXYgPSA8JmZhYl9tY192aXJ0X2Rpc3BsYXk+OworCQkJcWNvbSxiY21zID0gPCZiY21fbWMwX2Rpc3BsYXk+OworCQl9OworCisJCXNsdl9xbnNfbGxjY19kaXNwbGF5OnNsdi1xbnMtbGxjY19kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9MTENDX0RJU1BMQVk+OworCQkJbGFiZWwgPSAic2x2LXFucy1sbGNjX2Rpc3BsYXkiOworCQkJcWNvbSxidXN3aWR0aCA9IDwxNj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwyPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2NfZGlzcGxheT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfbGxjY19tY19kaXNwbGF5PjsKKwkJCXFjb20sYmNtcyA9IDwmYmNtX3NoMF9kaXNwbGF5PjsKKwkJfTsKKworCQlzbHZfcW5zMl9tZW1fbm9jX2Rpc3BsYXk6c2x2LXFuczItbWVtLW5vY19kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9NTk9DX1NGX01FTV9OT0NfRElTUExBWT47CisJCQlsYWJlbCA9ICJzbHYtcW5zMi1tZW0tbm9jX2Rpc3BsYXkiOworCQkJcWNvbSxidXN3aWR0aCA9IDwzMj47CisJCQlxY29tLGFnZy1wb3J0cyA9IDwxPjsKKwkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21tc3Nfbm9jX2Rpc3BsYXk+OworCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmbWFzX3FubV9tbm9jX3NmX2Rpc3BsYXk+OworCQkJcWNvbSxiY21zID0gPCZiY21fbW0yX2Rpc3BsYXk+OworCQl9OworCisJCXNsdl9xbnNfbWVtX25vY19oZl9kaXNwbGF5OnNsdi1xbnMtbWVtLW5vYy1oZl9kaXNwbGF5IHsKKwkJCWNlbGwtaWQgPSA8TVNNX0JVU19TTEFWRV9NTk9DX0hGX01FTV9OT0NfRElTUExBWT47CisJCQlsYWJlbCA9ICJzbHYtcW5zLW1lbS1ub2MtaGZfZGlzcGxheSI7CisJCQlxY29tLGJ1c3dpZHRoID0gPDMyPjsKKwkJCXFjb20sYWdnLXBvcnRzID0gPDI+OworCQkJcWNvbSxidXMtZGV2ID0gPCZmYWJfbW1zc19ub2NfZGlzcGxheT47CisJCQlxY29tLGNvbm5lY3Rpb25zID0gPCZtYXNfcW5tX21ub2NfaGZfZGlzcGxheT47CisJCQlxY29tLGJjbXMgPSA8JmJjbV9tbTBfZGlzcGxheT47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWNkcC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLW92ZXJsYXkuZHRzCmluZGV4IGYwYzgyMGYuLjJiNWVkMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLW92ZXJsYXkuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLW92ZXJsYXkuZHRzCkBAIC0yMCwxMSArMjAsMTUgQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CiAKICNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKIAogLyB7Ci0JbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBDRFAiOworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEwgQ0RQIjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWNkcCIsICJxY29tLHNkbTY3MCIsICJxY29tLGNkcCI7CiAJcWNvbSxtc20taWQgPSA8MzM2IDB4MD47CiAJcWNvbSxib2FyZC1pZCA9IDwxIDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLmR0cwppbmRleCA3ZTU5NDdiLi41YTFiOTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWNkcC5kdHMKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1jZHAuZHRzCkBAIC0xNSw5ICsxNSwxMyBAQAogCiAjaW5jbHVkZSAic2RtNjcwLmR0c2kiCiAjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kiCiAKIC8gewotCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgQ0RQIjsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBMIENEUCI7CiAJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOwogCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1jZHAuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY2RwLmR0c2kKaW5kZXggMGNmNDhhMy4uZmEwNjc3OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1jZHAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWNkcC5kdHNpCkBAIC0xMCw2ICsxMCwzNiBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvZ3Bpby9ncGlvLmg+CisjaW5jbHVkZSAic2RtNjcwLXBtaWMtb3ZlcmxheS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1zZGUtZGlzcGxheS5kdHNpIgorCismdWZzcGh5X21lbSB7CisJY29tcGF0aWJsZSA9ICJxY29tLHVmcy1waHktcW1wLXYzIjsKKworCXZkZGEtcGh5LXN1cHBseSA9IDwmcG02NjBsX2wxPjsgLyogMC44OHYgKi8KKwl2ZGRhLXBsbC1zdXBwbHkgPSA8JnBtNjYwX2wxPjsgLyogMS4ydiAqLworCXZkZGEtcGh5LW1heC1taWNyb2FtcCA9IDw2MjkwMD47CisJdmRkYS1wbGwtbWF4LW1pY3JvYW1wID0gPDE4MzAwPjsKKworCXN0YXR1cyA9ICJvayI7Cit9OworCismdWZzaGNfbWVtIHsKKwl2ZGQtaGJhLXN1cHBseSA9IDwmdWZzX3BoeV9nZHNjPjsKKwl2ZGQtaGJhLWZpeGVkLXJlZ3VsYXRvcjsKKwl2Y2Mtc3VwcGx5ID0gPCZwbTY2MGxfbDQ+OworCXZjYy12b2x0YWdlLWxldmVsID0gPDI5NjAwMDAgMjk2MDAwMD47CisJdmNjcTItc3VwcGx5ID0gPCZwbTY2MF9sOD47CisJdmNjLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OworCXZjY3EyLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OworCisJcWNvbSx2ZGRwLXJlZi1jbGstc3VwcGx5ID0gPCZwbTY2MF9sMT47CisJcWNvbSx2ZGRwLXJlZi1jbGstbWF4LW1pY3JvYW1wID0gPDEwMD47CisKKwlzdGF0dXMgPSAib2siOworfTsKKwogJnF1cHYzX3NlOV8ydWFydCB7CiAJc3RhdHVzID0gImRpc2FibGVkIjsKIH07CkBAIC0zMywzICs2MywxODUgQEAKICZxdXB2M19zZTZfNHVhcnQgewogCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiB9OworCismc2RoY18xIHsKKwl2ZGQtc3VwcGx5ID0gPCZwbTY2MGxfbDQ+OworCXFjb20sdmRkLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk2MDAwMCAyOTYwMDAwPjsKKwlxY29tLHZkZC1jdXJyZW50LWxldmVsID0gPDIwMCA1NzAwMDA+OworCisJdmRkLWlvLXN1cHBseSA9IDwmcG02NjBfbDg+OworCXFjb20sdmRkLWlvLWFsd2F5cy1vbjsKKwlxY29tLHZkZC1pby1scG0tc3VwOworCXFjb20sdmRkLWlvLXZvbHRhZ2UtbGV2ZWwgPSA8MTgwMDAwMCAxODAwMDAwPjsKKwlxY29tLHZkZC1pby1jdXJyZW50LWxldmVsID0gPDIwMCAzMjUwMDA+OworCisJcGluY3RybC1uYW1lcyA9ICJhY3RpdmUiLCAic2xlZXAiOworCXBpbmN0cmwtMCA9IDwmc2RjMV9jbGtfb24gICZzZGMxX2NtZF9vbiAmc2RjMV9kYXRhX29uICZzZGMxX3JjbGtfb24+OworCXBpbmN0cmwtMSA9IDwmc2RjMV9jbGtfb2ZmICZzZGMxX2NtZF9vZmYgJnNkYzFfZGF0YV9vZmYgJnNkYzFfcmNsa19vZmY+OworCisJc3RhdHVzID0gIm9rIjsKK307CisKKyZzZGhjXzIgeworCXZkZC1zdXBwbHkgPSA8JnBtNjYwbF9sNT47CisJcWNvbSx2ZGQtdm9sdGFnZS1sZXZlbCA9IDwyOTYwMDAwIDI5NjAwMDA+OworCXFjb20sdmRkLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDgwMDAwMD47CisKKwl2ZGQtaW8tc3VwcGx5ID0gPCZwbTY2MGxfbDI+OworCXFjb20sdmRkLWlvLXZvbHRhZ2UtbGV2ZWwgPSA8MTgwMDAwMCAyOTYwMDAwPjsKKwlxY29tLHZkZC1pby1jdXJyZW50LWxldmVsID0gPDIwMCAyMjAwMD47CisKKwlwaW5jdHJsLW5hbWVzID0gImFjdGl2ZSIsICJzbGVlcCI7CisJcGluY3RybC0wID0gPCZzZGMyX2Nsa19vbiAmc2RjMl9jbWRfb24gJnNkYzJfZGF0YV9vbiAmc2RjMl9jZF9vbj47CisJcGluY3RybC0xID0gPCZzZGMyX2Nsa19vZmYgJnNkYzJfY21kX29mZiAmc2RjMl9kYXRhX29mZiAmc2RjMl9jZF9vZmY+OworCisJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmc2RoY18yPjsKKwlpbnRlcnJ1cHRzID0gPDAgMSAyPjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCWludGVycnVwdC1tYXAtbWFzayA9IDwweGZmZmZmZmZmPjsKKwlpbnRlcnJ1cHQtbWFwID0gPDAgJmludGMgMCAwIDIwNCAwCisJCQkxICZpbnRjIDAgMCAyMjIgMAorCQkJMiAmdGxtbSA5NiAwPjsKKwlpbnRlcnJ1cHQtbmFtZXMgPSAiaGNfaXJxIiwgInB3cl9pcnEiLCAic3RhdHVzX2lycSI7CisJY2QtZ3Bpb3MgPSA8JnRsbW0gOTYgMHgxPjsKKworCXN0YXR1cyA9ICJvayI7Cit9OworCismcG02NjBfY2hhcmdlciB7CisJcWNvbSxiYXR0ZXJ5bGVzcy1wbGF0Zm9ybTsKK307CisKKyZzb2MgeworCWdwaW9fa2V5cyB7CisJCWNvbXBhdGlibGUgPSAiZ3Bpby1rZXlzIjsKKwkJbGFiZWwgPSAiZ3Bpby1rZXlzIjsKKworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JmtleV9jYW1fc25hcHNob3RfZGVmYXVsdAorCQkJICAgICAma2V5X2NhbV9mb2N1c19kZWZhdWx0CisJCQkgICAgICZrZXlfdm9sX3VwX2RlZmF1bHQ+OworCisJCWNhbV9zbmFwc2hvdCB7CisJCQlsYWJlbCA9ICJjYW1fc25hcHNob3QiOworCQkJZ3Bpb3MgPSA8JnRsbW0gOTEgMD47CisJCQlsaW51eCxpbnB1dC10eXBlID0gPDE+OworCQkJbGludXgsY29kZSA9IDw3NjY+OworCQkJZ3Bpby1rZXksd2FrZXVwOworCQkJZGVib3VuY2UtaW50ZXJ2YWwgPSA8MTU+OworCQkJbGludXgsY2FuLWRpc2FibGU7CisJCX07CisKKwkJY2FtX2ZvY3VzIHsKKwkJCWxhYmVsID0gImNhbV9mb2N1cyI7CisJCQlncGlvcyA9IDwmdGxtbSA5MiAwPjsKKwkJCWxpbnV4LGlucHV0LXR5cGUgPSA8MT47CisJCQlsaW51eCxjb2RlID0gPDUyOD47CisJCQlncGlvLWtleSx3YWtldXA7CisJCQlkZWJvdW5jZS1pbnRlcnZhbCA9IDwxNT47CisJCQlsaW51eCxjYW4tZGlzYWJsZTsKKwkJfTsKKworCQl2b2xfdXAgeworCQkJbGFiZWwgPSAidm9sdW1lX3VwIjsKKwkJCWdwaW9zID0gPCZwbTY2MGxfZ3Bpb3MgNyBHUElPX0FDVElWRV9MT1c+OworCQkJbGludXgsaW5wdXQtdHlwZSA9IDwxPjsKKwkJCWxpbnV4LGNvZGUgPSA8MTE1PjsKKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJCWRlYm91bmNlLWludGVydmFsID0gPDE1PjsKKwkJCWxpbnV4LGNhbi1kaXNhYmxlOworCQl9OworCX07Cit9OworCismZHNpX2R1YWxfbnQzNTU5N190cnVseV92aWRlbyB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA3NiAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47Cit9OworCismZHNpX2R1YWxfbnQzNTU5N190cnVseV9jbWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gImR1YWxfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNzYgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfdmlkZW8geworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gInNpbmdsZV9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA3NiAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47Cit9OworCismZHNpX250MzU1OTdfdHJ1bHlfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAic2luZ2xlX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDc2IDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47Cit9OworCismZHNpX3NpbV92aWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9kdWFsX3NpbV92aWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9zaW1fY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKK307CisKKyZkc2lfZHVhbF9zaW1fY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKK307CisKKyZkc2lfc2ltX2RzY18zNzVfY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKK307CisKKyZkc2lfZHVhbF9zaW1fZHNjXzM3NV9jbWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9kdWFsX250MzU1OTdfdHJ1bHlfdmlkZW8geworCXFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJnBtNjYwbF93bGVkIHsKKwlzdGF0dXMgPSAib2theSI7CisJcWNvbSxsZWQtc3RyaW5ncy1saXN0ID0gWzAxIDAyXTsKK307CisKKyZtZHNzX21kcCB7CisJI2Nvb2xpbmctY2VsbHMgPSA8Mj47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1jb3Jlc2lnaHQuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY29yZXNpZ2h0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3OWQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtY29yZXNpZ2h0LmR0c2kKQEAgLTAsMCArMSwxODg3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyZzb2MgeworCisJcmVwbGljYXRvcl9xZHNzOiByZXBsaWNhdG9yQDYwNDYwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5MDk+OworCisJCXJlZyA9IDwweDYwNDYwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gInJlcGxpY2F0b3ItYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXJlcGxpY2F0b3IiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnRzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXBvcnRAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXJlcGxpY2F0b3Jfb3V0X3RtY19ldHI6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmdG1jX2V0cl9pbl9yZXBsaWNhdG9yPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAxIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcmVwbGljYXRvcl9pbl90bWNfZXRmOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRtY19ldGZfb3V0X3JlcGxpY2F0b3I+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwl0bWNfZXRyOiB0bWNANjA0ODAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2MT47CisKKwkJcmVnID0gPDB4NjA0ODAwMCAweDEwMDA+LAorCQkgICAgICA8MHg2MDY0MDAwIDB4MTUwMDA+OworCQlyZWctbmFtZXMgPSAidG1jLWJhc2UiLCAiYmFtLWJhc2UiOworCisJCWFybSxidWZmZXItc2l6ZSA9IDwweDQwMDAwMD47CisJCWFybSxzZy1lbmFibGU7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRtYy1ldHIiOworCQljb3Jlc2lnaHQtY3RpcyA9IDwmY3RpMCAmY3RpOD47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQl0bWNfZXRyX2luX3JlcGxpY2F0b3I6IGVuZHBvaW50IHsKKwkJCQlzbGF2ZS1tb2RlOworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmcmVwbGljYXRvcl9vdXRfdG1jX2V0cj47CisJCQl9OworCQl9OworCX07CisKKwl0bWNfZXRmOiB0bWNANjA0NzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2MT47CisKKwkJcmVnID0gPDB4NjA0NzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidG1jLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10bWMtZXRmIjsKKwkJY29yZXNpZ2h0LWN0aXMgPSA8JmN0aTAgJmN0aTg+OworCQlhcm0sZGVmYXVsdC1zaW5rOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnRzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXBvcnRAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXRtY19ldGZfb3V0X3JlcGxpY2F0b3I6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmcmVwbGljYXRvcl9pbl90bWNfZXRmPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAxIHsKKwkJCQlyZWcgPSA8MT47CisJCQkJdG1jX2V0Zl9pbl9mdW5uZWxfbWVyZzogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZmdW5uZWxfbWVyZ19vdXRfdG1jX2V0Zj47CisJCQkJfTsKKwkJCX07CisJCX07CisKKwl9OworCisJZnVubmVsX21lcmc6IGZ1bm5lbEA2MDQ1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTA4PjsKKworCQlyZWcgPSA8MHg2MDQ1MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJmdW5uZWwtYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWZ1bm5lbC1tZXJnIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfbWVyZ19vdXRfdG1jX2V0ZjogZW5kcG9pbnQgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZ0bWNfZXRmX2luX2Z1bm5lbF9tZXJnPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAxIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX21lcmdfaW5fZnVubmVsX2luMDogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZmdW5uZWxfaW4wX291dF9mdW5uZWxfbWVyZz47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMiB7CisJCQkJcmVnID0gPDE+OworCQkJCWZ1bm5lbF9tZXJnX2luX2Z1bm5lbF9pbjE6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX2luMV9vdXRfZnVubmVsX21lcmc+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDMgeworCQkJCXJlZyA9IDwyPjsKKwkJCQlmdW5uZWxfbWVyZ19pbl9mdW5uZWxfaW4yOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmZ1bm5lbF9pbjJfb3V0X2Z1bm5lbF9tZXJnPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJc3RtOiBzdG1ANjAwMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Mj47CisKKwkJcmVnID0gPDB4NjAwMjAwMCAweDEwMDA+LAorCQkgICAgICA8MHgxNjI4MDAwMCAweDE4MDAwMD47CisJCXJlZy1uYW1lcyA9ICJzdG0tYmFzZSIsICJzdG0tc3RpbXVsdXMtYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXN0bSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQlzdG1fb3V0X2Z1bm5lbF9pbjA6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmZ1bm5lbF9pbjBfaW5fc3RtPjsKKwkJCX07CisJCX07CisKKwl9OworCisJaHdldmVudDogaHdldmVudEAweDAxNDA2NmYwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1od2V2ZW50IjsKKwkJcmVnID0gPDB4MTQwNjZmMCAweDQ+LAorCQkgICAgICA8MHgxNDE2NmYwIDB4ND4sCisJCSAgICAgIDwweDE0MDYwMzggMHg0PiwKKwkJICAgICAgPDB4MTQxNjAzOCAweDQ+OworCQlyZWctbmFtZXMgPSAiZGRyLWNoMC1jZmciLCAiZGRyLWNoMjMtY2ZnIiwgImRkci1jaDAtY3RybCIsCisJCQkgICAgImRkci1jaDIzLWN0cmwiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1od2V2ZW50IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3NyOiBjc3JANjAwMTAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxjb3Jlc2lnaHQtY3NyIjsKKwkJcmVnID0gPDB4NjAwMTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3NyLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jc3IiOworCisJCXFjb20sYmxrLXNpemUgPSA8MT47CisJfTsKKworCWZ1bm5lbF9pbjA6IGZ1bm5lbEAweDYwNDEwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5MDg+OworCisJCXJlZyA9IDwweDYwNDEwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImZ1bm5lbC1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZnVubmVsLWluMCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX2luMF9vdXRfZnVubmVsX21lcmc6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX21lcmdfaW5fZnVubmVsX2luMD47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDY+OworCQkJCWZ1bm5lbF9pbjBfaW5fZnVubmVsX3FhdGI6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX3FhdGJfb3V0X2Z1bm5lbF9pbjA+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDIgeworCQkJCXJlZyA9IDw3PjsKKwkJCQlmdW5uZWxfaW4wX2luX3N0bTogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnN0bV9vdXRfZnVubmVsX2luMD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKKworCWZ1bm5lbF9pbjE6IGZ1bm5lbEAweDYwNDIwMDAgeworCQkgY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTA4PjsKKworCQlyZWcgPSA8MHg2MDQyMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJmdW5uZWwtYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWZ1bm5lbC1pbjEiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX2luMV9vdXRfZnVubmVsX21lcmc6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICA8JmZ1bm5lbF9tZXJnX2luX2Z1bm5lbF9pbjE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwzPjsKKwkJCQlmdW5uZWxfaW4xX2luX2Z1bm5lbF9tb2RlbTogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkgIDwmZnVubmVsX21vZGVtX291dF9mdW5uZWxfaW4xPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJZnVubmVsX2luMjogZnVubmVsQDB4NjA0MzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4NjA0MzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtaW4yIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfaW4yX291dF9mdW5uZWxfbWVyZzogZW5kcG9pbnQgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkgIDwmZnVubmVsX21lcmdfaW5fZnVubmVsX2luMj47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDA+OworCQkJCWZ1bm5lbF9pbjJfaW5fbW9kZW1fZXRtMDogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkgIDwmbW9kZW1fZXRtMF9vdXRfZnVubmVsX2luMj47CisJCQkJfTsKKworCQkJfTsKKworCQkJcG9ydEAyIHsKKwkJCQlyZWcgPSA8NT47CisJCQkJZnVubmVsX2luMl9pbl9mdW5uZWxfYXBzc19tZXJnOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgPCZmdW5uZWxfYXBzc19tZXJnX291dF9mdW5uZWxfaW4yPjsKKwkJCQl9OworCQkJfTsKKworCQl9OworCX07CisKKwl0cGRhOiB0cGRhQDYwMDQwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5Njk+OworCQlyZWcgPSA8MHg2MDA0MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0cGRhLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10cGRhIjsKKworCQlxY29tLHRwZGEtYXRpZCA9IDw2NT47CisJCXFjb20sYmMtZWxlbS1zaXplID0gPDEwIDMyPiwKKwkJCQkgICAgPDEzIDMyPjsKKwkJcWNvbSx0Yy1lbGVtLXNpemUgPSA8MTMgMzI+OworCQlxY29tLGRzYi1lbGVtLXNpemUgPSA8MCAzMj4sCisJCQkJICAgICA8MiAzMj4sCisJCQkJICAgICA8MyAzMj4sCisJCQkJICAgICA8NSAzMj4sCisJCQkJICAgICA8NiAzMj4sCisJCQkJICAgICA8MTAgMzI+LAorCQkJCSAgICAgPDExIDMyPiwKKwkJCQkgICAgIDwxMyAzMj47CisJCXFjb20sY21iLWVsZW0tc2l6ZSA9IDwzIDY0PiwKKwkJCQkgICAgIDw3IDY0PiwKKwkJCQkgICAgIDwxMyA2ND47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCXBvcnRAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXRwZGFfb3V0X2Z1bm5lbF9xYXRiOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmZ1bm5lbF9xYXRiX2luX3RwZGE+OworCQkJCX07CisKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDA+OworCQkJCXRwZGFfaW5fdHBkbV9jZW50ZXI6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmdHBkbV9jZW50ZXJfb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDIgeworCQkJCXJlZyA9IDwyPjsKKwkJCQl0cGRhX2luX2Z1bm5lbF9kbF9tbTogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZmdW5uZWxfZGxfbW1fb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDMgeworCQkJCXJlZyA9IDwzPjsKKwkJCQl0cGRhX2luX2Z1bm5lbF9kZHJfMDogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZmdW5uZWxfZGRyXzBfb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDQgeworCQkJCXJlZyA9IDw2PjsKKwkJCQl0cGRhX2luX2Z1bm5lbF90dXJpbmc6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX3R1cmluZ19vdXRfdHBkYT47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRANSB7CisJCQkJcmVnID0gPDc+OworCQkJCXRwZGFfaW5fdHBkbV92c2Vuc2U6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmdHBkbV92c2Vuc2Vfb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDYgeworCQkJCXJlZyA9IDwxMD47CisJCQkJdHBkYV9pbl90cGRtX3FtOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRwZG1fcW1fb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDcgeworCQkJCXJlZyA9IDwxMT47CisJCQkJdHBkYV9pbl90cGRtX25vcnRoOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRwZG1fbm9ydGhfb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDggeworCQkJCXJlZyA9IDwxMz47CisJCQkJdHBkYV9pbl90cGRtX3BpbWVtOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRwZG1fcGltZW1fb3V0X3RwZGE+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwlmdW5uZWxfbW9kZW06IGZ1bm5lbEA2ODMyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTA4PjsKKworCQlyZWcgPSA8MHg2ODMyMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJmdW5uZWwtYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWZ1bm5lbC1tb2RlbSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX21vZGVtX291dF9mdW5uZWxfaW4xOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JmZ1bm5lbF9pbjFfaW5fZnVubmVsX21vZGVtPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAxIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX21vZGVtX2luX3RwZGFfbW9kZW06IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmdHBkYV9tb2RlbV9vdXRfZnVubmVsX21vZGVtPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkYV9tb2RlbTogdHBkYUA2ODMxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY5PjsKKwkJcmVnID0gPDB4NjgzMTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkYS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkYS1tb2RlbSI7CisKKwkJcWNvbSx0cGRhLWF0aWQgPSA8Njc+OworCQlxY29tLGRzYi1lbGVtLXNpemUgPSA8MCAzMj47CisJCXFjb20sY21iLWVsZW0tc2l6ZSA9IDwwIDY0PjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJdHBkYV9tb2RlbV9vdXRfZnVubmVsX21vZGVtOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmZ1bm5lbF9tb2RlbV9pbl90cGRhX21vZGVtPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAxIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJdHBkYV9tb2RlbV9pbl90cGRtX21vZGVtOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRwZG1fbW9kZW1fb3V0X3RwZGFfbW9kZW0+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwl0cGRtX21vZGVtOiB0cGRtQDY4MzAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5Njg+OworCQlyZWcgPSA8MHg2ODMwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0cGRtLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10cGRtLW1vZGVtIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0IHsKKwkJCXRwZG1fbW9kZW1fb3V0X3RwZGFfbW9kZW06IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnRwZGFfbW9kZW1faW5fdHBkbV9tb2RlbT47CisJCQl9OworCQl9OworCX07CisKKwl0cGRtX2NlbnRlcjogdHBkbUA2YzI4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY4PjsKKwkJcmVnID0gPDB4NmMyODAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkbS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkbS1jZW50ZXIiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnQgeworCQkJdHBkbV9jZW50ZXJfb3V0X3RwZGE6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnRwZGFfaW5fdHBkbV9jZW50ZXI+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV9ub3J0aDogdHBkbUA2YTI0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY4PjsKKwkJcmVnID0gPDB4NmEyNDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkbS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkbS1ub3J0aCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQl0cGRtX25vcnRoX291dF90cGRhOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZ0cGRhX2luX3RwZG1fbm9ydGg+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV9xbTogdHBkbUA2OWQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY4PjsKKwkJcmVnID0gPDB4NjlkMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkbS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkbS1xbSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQl0cGRtX3FtX291dF90cGRhOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZ0cGRhX2luX3RwZG1fcW0+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkYV9hcHNzOiB0cGRhQDc4NjIwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5Njk+OworCQlyZWcgPSA8MHg3ODYyMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0cGRhLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10cGRhLWFwc3MiOworCisJCXFjb20sdHBkYS1hdGlkID0gPDY2PjsKKwkJcWNvbSxkc2ItZWxlbS1zaXplID0gPDAgMzI+OworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnRzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQl0cGRhX2Fwc3Nfb3V0X2Z1bm5lbF9hcHNzX21lcmc6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgICAgIDwmZnVubmVsX2Fwc3NfbWVyZ19pbl90cGRhX2Fwc3M+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwwPjsKKwkJCQl0cGRhX2Fwc3NfaW5fdHBkbV9hcHNzOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JnRwZG1fYXBzc19vdXRfdHBkYV9hcHNzPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV9hcHNzOiB0cGRtQDc4NjAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5Njg+OworCQlyZWcgPSA8MHg3ODYwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0cGRtLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10cGRtLWFwc3MiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnQgeworCQkJdHBkbV9hcHNzX291dF90cGRhX2Fwc3M6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnRwZGFfYXBzc19pbl90cGRtX2Fwc3M+OworCQkJfTsKKwkJfTsKKwl9OworCisJZnVubmVsX2RsX21tOiBmdW5uZWxANmMwYjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4NmMwYjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtZGwtbW0iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnRzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXBvcnRAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCWZ1bm5lbF9kbF9tbV9vdXRfdHBkYTogZW5kcG9pbnQgeworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkgICAgPCZ0cGRhX2luX2Z1bm5lbF9kbF9tbT47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDE+OworCQkJCWZ1bm5lbF9kbF9tbV9pbl90cGRtX21tOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JnRwZG1fbW1fb3V0X2Z1bm5lbF9kbF9tbT47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKKworCXRwZG1fbW06IHRwZG1ANmMwODAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2OD47CisJCXJlZyA9IDwweDZjMDgwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gInRwZG0tYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRwZG0tbW0iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnQgeworCQkJdHBkbV9tbV9vdXRfZnVubmVsX2RsX21tOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZmdW5uZWxfZGxfbW1faW5fdHBkbV9tbT47CisJCQl9OworCQl9OworCX07CisKKwlmdW5uZWxfdHVyaW5nOiBmdW5uZWxANjg2MTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4Njg2MTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtdHVyaW5nIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfdHVyaW5nX291dF90cGRhOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JnRwZGFfaW5fZnVubmVsX3R1cmluZz47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDA+OworCQkJCWZ1bm5lbF90dXJpbmdfaW5fdHBkbV90dXJpbmc6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmdHBkbV90dXJpbmdfb3V0X2Z1bm5lbF90dXJpbmc+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDIgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlmdW5uZWxfdHVyaW5nX2luX3R1cmluZ19ldG0wOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JnR1cmluZ19ldG0wX291dF9mdW5uZWxfdHVyaW5nPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV90dXJpbmc6IHRwZG1ANjg2MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2OD47CisJCXJlZyA9IDwweDY4NjAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gInRwZG0tYmFzZSI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRwZG0tdHVyaW5nIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0IHsKKwkJCXRwZG1fdHVyaW5nX291dF9mdW5uZWxfdHVyaW5nOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkgICAgPCZmdW5uZWxfdHVyaW5nX2luX3RwZG1fdHVyaW5nPjsKKwkJCX07CisJCX07CisJfTsKKworCWZ1bm5lbF9kZHJfMDogZnVubmVsQDY5ZTIwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5MDg+OworCisJCXJlZyA9IDwweDY5ZTIwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImZ1bm5lbC1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZnVubmVsLWRkci0wIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfZGRyXzBfb3V0X3RwZGE6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmdHBkYV9pbl9mdW5uZWxfZGRyXzA+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfZGRyXzBfaW5fdHBkbV9kZHI6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmdHBkbV9kZHJfb3V0X2Z1bm5lbF9kZHJfMD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKKworCXRwZG1fZGRyOiB0cGRtQDY5ZTAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5Njg+OworCQlyZWcgPSA8MHg2OWUwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0cGRtLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC10cGRtLWRkciI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQl0cGRtX2Rkcl9vdXRfZnVubmVsX2Rkcl8wOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZmdW5uZWxfZGRyXzBfaW5fdHBkbV9kZHI+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV9waW1lbTogdHBkbUA2ODUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY4PjsKKwkJcmVnID0gPDB4Njg1MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkbS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkbS1waW1lbSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQl0cGRtX3BpbWVtX291dF90cGRhOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZ0cGRhX2luX3RwZG1fcGltZW0+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkbV92c2Vuc2U6IHRwZG1ANjg0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2OD47CisJCXJlZyA9IDwweDY4NDAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gInRwZG0tYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRwZG0tdnNlbnNlIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0eworCQkJdHBkbV92c2Vuc2Vfb3V0X3RwZGE6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnRwZGFfaW5fdHBkbV92c2Vuc2U+OworCQkJfTsKKwkJfTsKKwl9OworCisJdHBkYV9vbGM6IHRwZGFANzgzMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2OT47CisJCXJlZyA9IDwweDc4MzIwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gInRwZGEtYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRwZGEtb2xjIjsKKworCQlxY29tLHRwZGEtYXRpZCA9IDw2OT47CisJCXFjb20sY21iLWVsZW0tc2l6ZSA9IDwwIDY0PjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJdHBkYV9vbGNfb3V0X2Z1bm5lbF9hcHNzX21lcmc6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX2Fwc3NfbWVyZ19pbl90cGRhX29sYz47CisJCQkJfTsKKwkJCX07CisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwwPjsKKwkJCQl0cGRhX29sY19pbl90cGRtX29sYzogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZ0cGRtX29sY19vdXRfdHBkYV9vbGM+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwl0cGRtX29sYzogdHBkbUA3ODMwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY4PjsKKwkJcmVnID0gPDB4NzgzMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAidHBkbS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHBkbS1vbGMiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnR7CisJCQl0cGRtX29sY19vdXRfdHBkYV9vbGM6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JnRwZGFfb2xjX2luX3RwZG1fb2xjPjsKKwkJCX07CisJCX07CisJfTsKKworCWZ1bm5lbF9xYXRiOiBmdW5uZWxANjAwNTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4NjAwNTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtcWF0YiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX3FhdGJfb3V0X2Z1bm5lbF9pbjA6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZnVubmVsX2luMF9pbl9mdW5uZWxfcWF0Yj47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDA+OworCQkJCWZ1bm5lbF9xYXRiX2luX3RwZGE6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmdHBkYV9vdXRfZnVubmVsX3FhdGI+OworCQkJCX07CisJCQl9OworCQl9OworCX07CisKKwljdGkwX2RkcjA6IGN0aUA2OWUxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjllMTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLWRkcjAiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX2RkcjE6IGN0aUA2OWU0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjllNDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLWRkcjEiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkxX2RkcjE6IGN0aUA2OWU1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjllNTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxLWRkcjEiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX2RsbW06IGN0aUA2YzA5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NmMwOTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLWRsbW0iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkxX2RsbW06IGN0aUA2YzBhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NmMwYTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxLWRsbW0iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX2RsY3Q6IGN0aUA2YzI5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NmMyOTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLWRsY3QiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkxX2RsY3Q6IGN0aUA2YzJhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NmMyYTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxLWRsY3QiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX3djc3M6IGN0aUA2OWE0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDY5YTQwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMC13Y3NzIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpMV93Y3NzOiBjdGlANjlhNTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2OWE1MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEtd2NzcyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aTJfd2NzczogY3RpQDY5YTYwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4NjlhNjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkyLXdjc3MiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfbXNzX3E2OiBjdGlANjgzYjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2ODNiMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1tc3MtcTYiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfdHVyaW5nOiBjdGlANjg2NzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2ODY3MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS10dXJpbmciOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkyX3NzY19zZGM6IGN0aUA2YjEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDZiMTAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMi1zc2Nfc2RjIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpMV9zc2M6IGN0aUA2YjExMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDZiMTEwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMS1zc2MiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX3NzY19xNjogY3RpQDZiMWIwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4NmIxYjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLXNzYy1xNiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aV9zc2Nfbm9jOiBjdGlANmIxZTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2YjFlMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1zc2Mtbm9jIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpNl9zc2Nfbm9jOiBjdGlANmIxZjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2YjFmMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTYtc3NjLW5vYyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aTBfc3dhbzogY3RpQDZiMDQwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4NmIwNDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLXN3YW8iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkxX3N3YW86IGN0aUA2YjA1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDZiMDUwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMS1zd2FvIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpMl9zd2FvOiBjdGlANmIwNjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2YjA2MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTItc3dhbyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aTNfc3dhbzogY3RpQDZiMDcwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4NmIwNzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkzLXN3YW8iOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfYW9wX20zOiBjdGlANmIyMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg2YjIxMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1hb3AtbTMiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfdGl0YW46IGN0aUA2YzEzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDZjMTMwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLXRpdGFuIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpX3ZlbnVzX2FybTk6IGN0aUA2YzIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDZjMjAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLXZlbnVzLWFybTkiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwX2Fwc3M6IGN0aUA3OGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sY29yZXNpZ2h0LWN0aSI7CisJCXJlZyA9IDwweDc4ZTAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMC1hcHNzIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpMV9hcHNzOiBjdGlANzhmMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLGNvcmVzaWdodC1jdGkiOworCQlyZWcgPSA8MHg3OGYwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEtYXBzcyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aTJfYXBzczogY3RpQDc5MDAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxjb3Jlc2lnaHQtY3RpIjsKKwkJcmVnID0gPDB4NzkwMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkyLWFwc3MiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkwOiBjdGlANjAxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDYwMTAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTogY3RpQDYwMTEwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg2MDExMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJfTsKKworCWN0aTI6IGN0aUA2MDEyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxMjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkyIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCX07CisKKwljdGkzOiBjdGlANjAxMzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDYwMTMwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpMyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpNDogY3RpQDYwMTQwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg2MDE0MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTQiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJfTsKKworCWN0aTU6IGN0aUA2MDE1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxNTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk1IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCX07CisKKwljdGk2OiBjdGlANjAxNjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDYwMTYwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpNiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpNzogY3RpQDYwMTcwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg2MDE3MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTciOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJfTsKKworCWN0aTg6IGN0aUA2MDE4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxODAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGk4IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCX07CisKKwljdGk5OiBjdGlANjAxOTAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDYwMTkwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpOSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTA6IGN0aUA2MDFhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxYTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxMCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTE6IGN0aUA2MDFiMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxYjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxMSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTI6IGN0aUA2MDFjMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxYzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxMiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTM6IGN0aUA2MDFkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxZDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxMyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTQ6IGN0aUA2MDFlMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxZTAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxNCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpMTU6IGN0aUA2MDFmMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NjAxZjAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkxNSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpX2NwdTA6IGN0aUA3MDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NzAyMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MCI7CisJCWNwdSA9IDwmQ1BVMD47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwl9OworCisJY3RpX2NwdTE6IGN0aUA3MTIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NzEyMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1MSI7CisJCWNwdSA9IDwmQ1BVMT47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aV9jcHUyOiBjdGlANzIyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDcyMjAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTIiOworCQljcHUgPSA8JkNQVTI+OworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfY3B1MzogY3RpQDczMjAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg3MzIwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1jcHUzIjsKKwkJY3B1ID0gPCZDUFUzPjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpX2NwdTQ6IGN0aUA3NDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NzQyMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1NCI7CisJCWNwdSA9IDwmQ1BVND47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aV9jcHU1OiBjdGlANzUyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDc1MjAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLWNwdTUiOworCQljcHUgPSA8JkNQVTU+OworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGlfY3B1NjogY3RpQDc2MjAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg3NjIwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1jcHU2IjsKKwkJY3B1ID0gPCZDUFU2PjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpX2NwdTc6IGN0aUA3NzIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NzcyMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktY3B1NyI7CisJCWNwdSA9IDwmQ1BVNz47CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCXR1cmluZ19ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1yZW1vdGUtZXRtIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtdHVyaW5nLWV0bTAiOworCQlxY29tLGluc3QtaWQgPSA8MTM+OworCisJCXBvcnR7CisJCQl0dXJpbmdfZXRtMF9vdXRfZnVubmVsX3R1cmluZzogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCTwmZnVubmVsX3R1cmluZ19pbl90dXJpbmdfZXRtMD47CisJCQl9OworCQl9OworCX07CisKKwltb2RlbV9ldG0wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1yZW1vdGUtZXRtIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtbW9kZW0tZXRtMCI7CisJCXFjb20saW5zdC1pZCA9IDwyPjsKKworCQlwb3J0IHsKKwkJCW1vZGVtX2V0bTBfb3V0X2Z1bm5lbF9pbjI6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQk8JmZ1bm5lbF9pbjJfaW5fbW9kZW1fZXRtMD47CisJCQl9OworCQl9OworCX07CisKKwlmdW5uZWxfYXBzc19tZXJnOiBmdW5uZWxANzgxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4NzgxMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtYXBzcy1tZXJnIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfYXBzc19tZXJnX291dF9mdW5uZWxfaW4yOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JmZ1bm5lbF9pbjJfaW5fZnVubmVsX2Fwc3NfbWVyZz47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMSB7CisJCQkJcmVnID0gPDA+OworCQkJCWZ1bm5lbF9hcHNzX21lcmdfaW5fZnVubmVsX2Fwc3M6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmZnVubmVsX2Fwc3Nfb3V0X2Z1bm5lbF9hcHNzX21lcmc+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDIgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlmdW5uZWxfYXBzc19tZXJnX2luX3RwZGFfb2xjOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgICA8JnRwZGFfb2xjX291dF9mdW5uZWxfYXBzc19tZXJnPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAzIHsKKwkJCQlyZWcgPSA8Mz47CisJCQkJZnVubmVsX2Fwc3NfbWVyZ19pbl90cGRhX2Fwc3M6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmdHBkYV9hcHNzX291dF9mdW5uZWxfYXBzc19tZXJnPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJZXRtMDogZXRtQDcwNDAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwYmI5NWQ+OworCisJCXJlZyA9IDwweDcwNDAwMDAgMHgxMDAwPjsKKwkJY3B1ID0gPCZDUFUwPjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZXRtMCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQlldG0wX291dF9mdW5uZWxfYXBzczogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmZnVubmVsX2Fwc3NfaW5fZXRtMD47CisJCQl9OworCQl9OworCX07CisKKwlldG0xOiBldG1ANzE0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDBiYjk1ZD47CisKKwkJcmVnID0gPDB4NzE0MDAwMCAweDEwMDA+OworCQljcHUgPSA8JkNQVTE+OworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ldG0xIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0IHsKKwkJCWV0bTFfb3V0X2Z1bm5lbF9hcHNzOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZmdW5uZWxfYXBzc19pbl9ldG0xPjsKKwkJCX07CisJCX07CisJfTsKKworCWV0bTI6IGV0bUA3MjQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMGJiOTVkPjsKKworCQlyZWcgPSA8MHg3MjQwMDAwIDB4MTAwMD47CisJCWNwdSA9IDwmQ1BVMj47CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWV0bTIiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnQgeworCQkJZXRtMl9vdXRfZnVubmVsX2Fwc3M6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmZ1bm5lbF9hcHNzX2luX2V0bTI+OworCQkJfTsKKwkJfTsKKwl9OworCisJZXRtMzogZXRtQDczNDAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwYmI5NWQ+OworCisJCXJlZyA9IDwweDczNDAwMDAgMHgxMDAwPjsKKwkJY3B1ID0gPCZDUFUzPjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZXRtMyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQlldG0zX291dF9mdW5uZWxfYXBzczogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmZnVubmVsX2Fwc3NfaW5fZXRtMz47CisJCQl9OworCQl9OworCX07CisKKwlldG00OiBldG1ANzQ0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDBiYjk1ZD47CisKKwkJcmVnID0gPDB4NzQ0MDAwMCAweDEwMDA+OworCQljcHUgPSA8JkNQVTQ+OworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ldG00IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0IHsKKwkJCWV0bTRfb3V0X2Z1bm5lbF9hcHNzOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZmdW5uZWxfYXBzc19pbl9ldG00PjsKKwkJCX07CisJCX07CisJfTsKKworCWV0bTU6IGV0bUA3NTQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMGJiOTVkPjsKKworCQlyZWcgPSA8MHg3NTQwMDAwIDB4MTAwMD47CisJCWNwdSA9IDwmQ1BVNT47CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWV0bTUiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCisJCXBvcnQgeworCQkJZXRtNV9vdXRfZnVubmVsX2Fwc3M6IGVuZHBvaW50IHsKKwkJCQlyZW1vdGUtZW5kcG9pbnQgPSA8JmZ1bm5lbF9hcHNzX2luX2V0bTU+OworCQkJfTsKKwkJfTsKKwl9OworCisJZXRtNjogZXRtQDc2NDAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwYmI5NWQ+OworCisJCXJlZyA9IDwweDc2NDAwMDAgMHgxMDAwPjsKKwkJY3B1ID0gPCZDUFU2PjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZXRtNiI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydCB7CisJCQlldG02X291dF9mdW5uZWxfYXBzczogZW5kcG9pbnQgeworCQkJCXJlbW90ZS1lbmRwb2ludCA9IDwmZnVubmVsX2Fwc3NfaW5fZXRtNj47CisJCQl9OworCQl9OworCX07CisKKwlldG03OiBldG1ANzc0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDBiYjk1ZD47CisKKwkJcmVnID0gPDB4Nzc0MDAwMCAweDEwMDA+OworCQljcHUgPSA8JkNQVTc+OworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1ldG03IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0IHsKKwkJCWV0bTdfb3V0X2Z1bm5lbF9hcHNzOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0gPCZmdW5uZWxfYXBzc19pbl9ldG03PjsKKwkJCX07CisJCX07CisJfTsKKworCWZ1bm5lbF9hcHNzOiBmdW5uZWxANzgwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4NzgwMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtYXBzcyI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJZnVubmVsX2Fwc3Nfb3V0X2Z1bm5lbF9hcHNzX21lcmc6IGVuZHBvaW50IHsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICAgIDwmZnVubmVsX2Fwc3NfbWVyZ19pbl9mdW5uZWxfYXBzcz47CisJCQkJfTsKKwkJCX07CisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfYXBzc19pbl9ldG0wOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmV0bTBfb3V0X2Z1bm5lbF9hcHNzPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAyIHsKKwkJCQlyZWcgPSA8MT47CisJCQkJZnVubmVsX2Fwc3NfaW5fZXRtMTogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZldG0xX291dF9mdW5uZWxfYXBzcz47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRAMyB7CisJCQkJcmVnID0gPDI+OworCQkJCWZ1bm5lbF9hcHNzX2luX2V0bTI6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZXRtMl9vdXRfZnVubmVsX2Fwc3M+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDQgeworCQkJCXJlZyA9IDwzPjsKKwkJCQlmdW5uZWxfYXBzc19pbl9ldG0zOiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmV0bTNfb3V0X2Z1bm5lbF9hcHNzPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEA1IHsKKwkJCQlyZWcgPSA8ND47CisJCQkJZnVubmVsX2Fwc3NfaW5fZXRtNDogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZldG00X291dF9mdW5uZWxfYXBzcz47CisJCQkJfTsKKwkJCX07CisKKwkJCXBvcnRANiB7CisJCQkJcmVnID0gPDU+OworCQkJCWZ1bm5lbF9hcHNzX2luX2V0bTU6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmZXRtNV9vdXRfZnVubmVsX2Fwc3M+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDcgeworCQkJCXJlZyA9IDw2PjsKKwkJCQlmdW5uZWxfYXBzc19pbl9ldG02OiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQk8JmV0bTZfb3V0X2Z1bm5lbF9hcHNzPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEA4IHsKKwkJCQlyZWcgPSA8Nz47CisJCQkJZnVubmVsX2Fwc3NfaW5fZXRtNzogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkJPCZldG03X291dF9mdW5uZWxfYXBzcz47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuaCBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0LWNkYy11c2JjLWF1ZGlvLmR0c2kKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKcmVuYW1lIHRvIGFyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0LWNkYy11c2JjLWF1ZGlvLmR0c2kKaW5kZXggOGEwMjMyZS4uY2QxMTNiMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hdWRpby1leHQtY2xrLXVwLmgKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHQtY2RjLXVzYmMtYXVkaW8uZHRzaQpAQCAtNywxNCArNywxMSBAQAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaWZuZGVmIF9fQVVESU9fRVhUX0NMS19VUF9IXwotI2RlZmluZSBfX0FVRElPX0VYVF9DTEtfVVBfSF8KLQotaW50IGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1faW5pdCh2b2lkKTsKLXZvaWQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpOwotCi0jZW5kaWYKKyZ0YXZpbF9zbmQgeworCXFjb20sbXNtLW1iaGMtdXNiYy1hdWRpby1zdXBwb3J0ZWQgPSA8MT47CisJcWNvbSx1c2JjLWFuYWxvZy1lbjEtZ3BpbyA9IDwmd2NkX3VzYmNfYW5hbG9nX2VuMV9ncGlvPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dC1jb2RlYy1hdWRpby1vdmVybGF5LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dC1jb2RlYy1hdWRpby1vdmVybGF5LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1Y2Y0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0LWNvZGVjLWF1ZGlvLW92ZXJsYXkuZHRzaQpAQCAtMCwwICsxLDk2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlICJzZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCismcG1pY19hbmFsb2dfY29kZWMgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismbXNtX3Nkd19jb2RlYyB7CisJc3RhdHVzID0gImRpc2FibGVkIjsKK307CisKKyZjZGNfcGRtX2dwaW9zIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKKworJmNkY19jb21wX2dwaW9zIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKKworJmNkY19kbWljX2dwaW9zIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKKworJmNkY19zZHdfZ3Bpb3MgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismd3NhX3Nwa3JfZW4xIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKKworJndzYV9zcGtyX2VuMiB7CisJc3RhdHVzID0gImRpc2FibGVkIjsKK307CisKKyZxdXB2M19zZThfc3BpIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismc29jIHsKKwl3Y2RfYnVja192cmVnX2dwaW86IG1zbV9jZGNfcGluY3RybEA5NCB7CisJCXN0YXR1cyA9ICJva2F5IjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jZGMtcGluY3RybCI7CisJCXBpbmN0cmwtbmFtZXMgPSAiYXVkX2FjdGl2ZSIsICJhdWRfc2xlZXAiOworCQlwaW5jdHJsLTAgPSA8JndjZF9idWNrX3ZzZWxfZGVmYXVsdD47CisJCXBpbmN0cmwtMSA9IDwmd2NkX2J1Y2tfdnNlbF9kZWZhdWx0PjsKKwl9OworfTsKKworJndjZDl4eHhfaW50YyB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKworJndkc3BfbWdyIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2RzcF9nbGluayB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKworJnNsaW1fYXVkIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismZGFpX3NsaW0geworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ3Y2Q5MzR4X2NkYyB7CisJc3RhdHVzID0gIm9rYXkiOworCXFjb20saGFzLWJ1Y2stdnNlbC1ncGlvOworCXFjb20sYnVjay12c2VsLWdwaW8tbm9kZSA9IDwmd2NkX2J1Y2tfdnJlZ19ncGlvPjsKK307CisKKyZjbG9ja19hdWRpb19sbmJiIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2NkX3JzdF9ncGlvIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2NkOXh4eF9pbnRjIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE4NTgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwTCBFeHQuIEF1ZGlvIENvZGVjIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1jZHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1jZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODdkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLWNkcC5kdHMKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dGVybmFsLWNvZGVjLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE0gNjcwIFBNNjYwICsgUE02NjBMIEV4dC4gQXVkaW8gQ29kZWMgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWNkcCIsICJxY29tLHNkbTY3MCIsICJxY29tLGNkcCI7CisJcWNvbSxib2FyZC1pZCA9IDwxIDE+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0ZXJuYWwtY29kZWMtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MDIwOWNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwTCBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1tdHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1tdHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWMxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLW10cC5kdHMKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dGVybmFsLWNvZGVjLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE0gNjcwIFBNNjYwICsgUE02NjBMIEV4dC4gQXVkaW8gQ29kZWMgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLW10cCIsICJxY29tLHNkbTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZCA9IDw4IDE+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhNjA2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBBIEV4dC4gQXVkaW8gQ29kZWMgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWNkcCIsICJxY29tLHNkbTY3MCIsICJxY29tLGNkcCI7CisJcWNvbSxtc20taWQgPSA8MzM2IDB4MD47CisJcWNvbSxib2FyZC1pZCA9IDwxIDE+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDAwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAwMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAyMDAxYSAweDAgMHgwPjsKK307CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGQxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1jZHAuZHRzCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAic2RtNjcwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNIDY3MCBQTTY2MCArIFBNNjYwQSBFeHQuIEF1ZGlvIENvZGVjIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sYm9hcmQtaWQgPSA8MSAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwQSBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0ZXJuYWwtY29kZWMtcG02NjBhLW10cC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlYWRkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAuZHRzCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAic2RtNjcwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNIDY3MCBQTTY2MCArIFBNNjYwQSBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sYm9hcmQtaWQgPSA8OCAxPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpCnNpbWlsYXJpdHkgaW5kZXggNjIlCmNvcHkgZnJvbSBpbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWV4dGVybmFsLWNvZGVjLmR0c2kKaW5kZXggYmMxY2Q5ZS4uZGJjYzZiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaQpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTgsMTUgKzgsMjIgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKICAqLwotI2lmbmRlZiBfX0RTUF9ERUJVR19IXwotI2RlZmluZSBfX0RTUF9ERUJVR19IXwogCi10eXBlZGVmIGludCAoKmRzcF9zdGF0ZV9jYikoaW50IHN0YXRlKTsKLWludCBkc3BfZGVidWdfcmVnaXN0ZXIoZHNwX3N0YXRlX2NiIHB0cik7CisjaW5jbHVkZSAic2RtNjcwLWV4dC1jb2RlYy1hdWRpby1vdmVybGF5LmR0c2kiCiAKLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIRUQgICAgICAgICAweDAKLSNkZWZpbmUgRFNQX1NUQVRFX0NSQVNIX0RVTVBfRE9ORSAweDEKKyZpbnRfY29kZWMgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OwogCi0jZW5kaWYKKyZ0YXZpbF9zbmQgeworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZzbGltX2F1ZCB7CisJc3RhdHVzID0gIm9rYXkiOworfTsKKworJmRhaV9zbGltIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1ncHUuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZ3B1LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZWUwYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtZ3B1LmR0c2kKQEAgLTAsMCArMSwzMTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCismc29jIHsKKworCXBpbF9ncHU6IHFjb20sa2dzbC1oeXAgeworCQljb21wYXRpYmxlID0gInFjb20scGlsLXR6LWdlbmVyaWMiOworCQlxY29tLHBhcy1pZCA9IDwxMz47CisJCXFjb20sZmlybXdhcmUtbmFtZSA9ICJhNjE1X3phcCI7CisJfTsKKworCW1zbV9idXM6IHFjb20sa2dzbC1idXNtb257CisJCWxhYmVsID0gImtnc2wtYnVzbW9uIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGtnc2wtYnVzbW9uIjsKKwl9OworCisJZ3B1Ync6IHFjb20sZ3B1YncgeworCQljb21wYXRpYmxlID0gInFjb20sZGV2YnciOworCQlnb3Zlcm5vciA9ICJid192YmlmIjsKKwkJcWNvbSxzcmMtZHN0LXBvcnRzID0gPDI2IDUxMj47CisJCXFjb20sYnctdGJsID0KKwkJCTwgICAgIDAgLyogIG9mZiAgICAgKi8gPiwKKwkJCTwgICAzODEgLyogIDEwMCAgTUh6ICovID4sCisJCQk8ICAgNzYyIC8qICAyMDAgIE1IeiAqLyA+LAorCQkJPCAgMTE0NCAvKiAgMzAwICBNSHogKi8gPiwKKwkJCTwgIDE3MjAgLyogIDQ1MSAgTUh6ICovID4sCisJCQk8ICAyMDg2IC8qICA1NDcgIE1IeiAqLyA+LAorCQkJPCAgMjU5NyAvKiAgNjgxICBNSHogKi8gPiwKKwkJCTwgIDMxNDcgLyogIDgyNSAgTUh6ICovID4sCisJCQk8ICAzODc5IC8qICAxMDE3IE1IeiAqLyA+LAorCQkJPCAgNTE2MSAvKiAgMTM1MyBNSHogKi8gPiwKKwkJCTwgIDU5MzEgLyogIDE1NTUgTUh6ICovID4sCisJCQk8ICA2ODgxIC8qICAxODA0IE1IeiAqLyA+OworCX07CisKKwltc21fZ3B1OiBxY29tLGtnc2wtM2QwQDUwMDAwMDAgeworCQlsYWJlbCA9ICJrZ3NsLTNkMCI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxrZ3NsLTNkMCIsICJxY29tLGtnc2wtM2QiOworCQlzdGF0dXMgPSAib2siOworCQlyZWcgPSA8MHg1MDAwMDAwIDB4NDAwMDA+OworCQlyZWctbmFtZXMgPSAia2dzbF8zZDBfcmVnX21lbW9yeSI7CisJCWludGVycnVwdHMgPSA8MCAzMDAgMD47CisJCWludGVycnVwdC1uYW1lcyA9ICJrZ3NsXzNkMF9pcnEiOworCQlxY29tLGlkID0gPDA+OworCisJCXFjb20sY2hpcGlkID0gPDB4MDYwMTA1MDA+OworCisJCXFjb20saW5pdGlhbC1wd3JsZXZlbCA9IDwzPjsKKworCQlxY29tLGdwdS1xdWlyay1oZmktdXNlLXJlZzsKKworCQkvKiA8SFovMTI+ICovCisJCXFjb20saWRsZS10aW1lb3V0ID0gPDgwPjsKKwkJcWNvbSxuby1uYXA7CisKKwkJcWNvbSxoaWdoZXN0LWJhbmstYml0ID0gPDE0PjsKKworCQlxY29tLG1pbi1hY2Nlc3MtbGVuZ3RoID0gPDMyPjsKKworCQlxY29tLHVid2MtbW9kZSA9IDwyPjsKKworCQkvKiBzaXplIGluIGJ5dGVzICovCisJCXFjb20sc25hcHNob3Qtc2l6ZSA9IDwxMDQ4NTc2PjsKKworCQkvKiBiYXNlIGFkZHIsIHNpemUgKi8KKwkJcWNvbSxncHUtcWRzcy1zdG0gPSA8MHgxNjFjMDAwMCAweDQwMDAwPjsKKwkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CisKKwkJY2xvY2tzID0gPCZjbG9ja19nZnggR1BVX0NDX0dYX0dGWDNEX0NMSz4sCisJCQk8JmNsb2NrX2dwdWNjIEdQVV9DQ19DWE9fQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19ERFJTU19HUFVfQVhJX0NMSz4sCisJCQk8JmNsb2NrX2djYyBHQ0NfR1BVX01FTU5PQ19HRlhfQ0xLPiwKKwkJCTwmY2xvY2tfZ3B1Y2MgR1BVX0NDX0NYX0dNVV9DTEs+LAorCQkJPCZjbG9ja19ncHVjYyBHUFVfQ0NfQUhCX0NMSz47CisKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiLCAicmJibXRpbWVyX2NsayIsICJtZW1fY2xrIiwKKwkJCQkibWVtX2lmYWNlX2NsayIsICJnbXVfY2xrIiwgImFoYl9jbGsiOworCisJCS8qIEJ1cyBTY2FsZSBTZXR0aW5ncyAqLworCQlxY29tLGdwdWJ3LWRldiA9IDwmZ3B1Ync+OworCQlxY29tLGJ1cy1jb250cm9sOworCQlxY29tLG1zbS1idXMsbmFtZSA9ICJncnAzZCI7CisJCXFjb20sYnVzLXdpZHRoID0gPDMyPjsKKwkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDwxMj47CisJCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8MT47CisJCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQorCQkJCTwyNiA1MTIgMCAwPiwKKwkJCQk8MjYgNTEyIDAgNDAwMDAwPiwgICAgIC8qICAxIGJ1cz0xMDAgICovCisJCQkJPDI2IDUxMiAwIDgwMDAwMD4sICAgICAvKiAgMiBidXM9MjAwICAqLworCQkJCTwyNiA1MTIgMCAxMjAwMDAwPiwgICAgLyogIDMgYnVzPTMwMCAgKi8KKwkJCQk8MjYgNTEyIDAgMTgwNDAwMD4sICAgIC8qICA0IGJ1cz00NTEgICovCisJCQkJPDI2IDUxMiAwIDIxODgwMDA+LCAgICAvKiAgNSBidXM9NTQ3ICAqLworCQkJCTwyNiA1MTIgMCAyNzI0MDAwPiwgICAgLyogIDYgYnVzPTY4MSAgKi8KKwkJCQk8MjYgNTEyIDAgMzMwMDAwMD4sICAgIC8qICA3IGJ1cz04MjUgICovCisJCQkJPDI2IDUxMiAwIDQwNjgwMDA+LCAgICAvKiAgOCBidXM9MTAxNyAqLworCQkJCTwyNiA1MTIgMCA1NDEyMDAwPiwgICAgLyogIDkgYnVzPTEzNTMgKi8KKwkJCQk8MjYgNTEyIDAgNjIyMDAwMD4sICAgIC8qIDEwIGJ1cz0xNTU1ICovCisJCQkJPDI2IDUxMiAwIDcyMTYwMDA+OyAgICAvKiAxMSBidXM9MTgwNCAqLworCisJCS8qIEdEU0MgcmVndWxhdG9yIG5hbWVzICovCisJCXJlZ3VsYXRvci1uYW1lcyA9ICJ2ZGRjeCIsICJ2ZGQiOworCQkvKiBHRFNDIG94aWxpIHJlZ3VsYXRvcnMgKi8KKwkJdmRkY3gtc3VwcGx5ID0gPCZncHVfY3hfZ2RzYz47CisJCXZkZC1zdXBwbHkgPSA8JmdwdV9neF9nZHNjPjsKKworCQkvKiBHUFUgcmVsYXRlZCBsbGMgc2xpY2VzICovCisJCWNhY2hlLXNsaWNlLW5hbWVzID0gImdwdSIsICJncHVodHciOworCQljYWNoZS1zbGljZXMgPSA8JmxsY2MgMTI+LCA8JmxsY2MgMTE+OworCisJCS8qIENQVSBsYXRlbmN5IHBhcmFtZXRlciAqLworCQlxY29tLHBtLXFvcy1hY3RpdmUtbGF0ZW5jeSA9IDw2NjA+OworCQlxY29tLHBtLXFvcy13YWtldXAtbGF0ZW5jeSA9IDw0NjA+OworCisJCS8qIEVuYWJsZSBjb250ZXh0IGF3YXJlIGZyZXEuIHNjYWxpbmcgKi8KKwkJcWNvbSxlbmFibGUtY2EtanVtcDsKKwkJLyogQ29udGV4dCBhd2FyZSBqdW1wIGJ1c3kgcGVuYWx0eSBpbiB1cyAqLworCQlxY29tLGNhLWJ1c3ktcGVuYWx0eSA9IDwxMjAwMD47CisJCS8qIENvbnRleHQgYXdhcmUganVtcCB0YXJnZXQgcG93ZXIgbGV2ZWwgKi8KKwkJcWNvbSxjYS10YXJnZXQtcHdybGV2ZWwgPSA8MT47CisKKwkJLyogR1BVIE1lbXBvb2xzICovCisJCXFjb20sZ3B1LW1lbXBvb2xzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gInFjb20sZ3B1LW1lbXBvb2xzIjsKKworCQkJLyogNEsgUGFnZSBQb29sIGNvbmZpZ3VyYXRpb24gKi8KKwkJCXFjb20sZ3B1LW1lbXBvb2xAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXFjb20sbWVtcG9vbC1wYWdlLXNpemUgPSA8NDA5Nj47CisJCQkJcWNvbSxtZW1wb29sLWFsbG9jYXRlOworCQkJfTsKKwkJCS8qIDhLIFBhZ2UgUG9vbCBjb25maWd1cmF0aW9uICovCisJCQlxY29tLGdwdS1tZW1wb29sQDEgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlxY29tLG1lbXBvb2wtcGFnZS1zaXplID0gPDgxOTI+OworCQkJCXFjb20sbWVtcG9vbC1hbGxvY2F0ZTsKKwkJCX07CisJCQkvKiA2NEsgUGFnZSBQb29sIGNvbmZpZ3VyYXRpb24gKi8KKwkJCXFjb20sZ3B1LW1lbXBvb2xAMiB7CisJCQkJcmVnID0gPDI+OworCQkJCXFjb20sbWVtcG9vbC1wYWdlLXNpemUgPSA8NjU1MzY+OworCQkJCXFjb20sbWVtcG9vbC1yZXNlcnZlZCA9IDwyNTY+OworCQkJfTsKKwkJCS8qIDFNIFBhZ2UgUG9vbCBjb25maWd1cmF0aW9uICovCisJCQlxY29tLGdwdS1tZW1wb29sQDMgeworCQkJCXJlZyA9IDwzPjsKKwkJCQlxY29tLG1lbXBvb2wtcGFnZS1zaXplID0gPDEwNDg1NzY+OworCQkJCXFjb20sbWVtcG9vbC1yZXNlcnZlZCA9IDwzMj47CisJCQl9OworCQl9OworCisJCS8qIFBvd2VyIGxldmVscyAqLworCQlxY29tLGdwdS1wd3JsZXZlbHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJY29tcGF0aWJsZSA9ICJxY29tLGdwdS1wd3JsZXZlbHMiOworCisJCQkvKiBTVlNfTDEgKi8KKwkJCXFjb20sZ3B1LXB3cmxldmVsQDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlxY29tLGdwdS1mcmVxID0gPDQzMDAwMDAwMD47CisJCQkJcWNvbSxidXMtZnJlcSA9IDwxMT47CisJCQkJcWNvbSxidXMtbWluID0gPDg+OworCQkJCXFjb20sYnVzLW1heCA9IDwxMT47CisJCQl9OworCisJCQkvKiBTVlMgKi8KKwkJCXFjb20sZ3B1LXB3cmxldmVsQDEgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlxY29tLGdwdS1mcmVxID0gPDM1NTAwMDAwMD47CisJCQkJcWNvbSxidXMtZnJlcSA9IDw4PjsKKwkJCQlxY29tLGJ1cy1taW4gPSA8NT47CisJCQkJcWNvbSxidXMtbWF4ID0gPDk+OworCQkJfTsKKworCQkJLyogTE9XIFNWUyAqLworCQkJcWNvbSxncHUtcHdybGV2ZWxAMiB7CisJCQkJcmVnID0gPDI+OworCQkJCXFjb20sZ3B1LWZyZXEgPSA8MjY3MDAwMDAwPjsKKwkJCQlxY29tLGJ1cy1mcmVxID0gPDY+OworCQkJCXFjb20sYnVzLW1pbiA9IDw0PjsKKwkJCQlxY29tLGJ1cy1tYXggPSA8OD47CisJCQl9OworCisJCQkvKiBNSU4gU1ZTICovCisJCQlxY29tLGdwdS1wd3JsZXZlbEAzIHsKKwkJCQlyZWcgPSA8Mz47CisJCQkJcWNvbSxncHUtZnJlcSA9IDwxODAwMDAwMDA+OworCQkJCXFjb20sYnVzLWZyZXEgPSA8ND47CisJCQkJcWNvbSxidXMtbWluID0gPDM+OworCQkJCXFjb20sYnVzLW1heCA9IDw0PjsKKwkJCX07CisKKwkJCS8qIFhPICovCisJCQlxY29tLGdwdS1wd3JsZXZlbEA0IHsKKwkJCQlyZWcgPSA8ND47CisJCQkJcWNvbSxncHUtZnJlcSA9IDwwPjsKKwkJCQlxY29tLGJ1cy1mcmVxID0gPDA+OworCQkJCXFjb20sYnVzLW1pbiA9IDwwPjsKKwkJCQlxY29tLGJ1cy1tYXggPSA8MD47CisJCQl9OworCQl9OworCisJfTsKKworCWtnc2xfbXNtX2lvbW11OiBxY29tLGtnc2wtaW9tbXUgeworCQljb21wYXRpYmxlID0gInFjb20sa2dzbC1zbW11LXYyIjsKKworCQlyZWcgPSA8MHgwNTA0MDAwMCAweDEwMDAwPjsKKwkJcWNvbSxwcm90ZWN0ID0gPDB4NDAwMDAgMHgxMDAwMD47CisJCXFjb20sbWljcm8tbW11LWNvbnRyb2wgPSA8MHg2MDAwPjsKKworCQljbG9ja3MgPTwmY2xvY2tfZ2NjIEdDQ19HUFVfQ0ZHX0FIQl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX0REUlNTX0dQVV9BWElfQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19HUFVfTUVNTk9DX0dGWF9DTEs+OworCisJCWNsb2NrLW5hbWVzID0gImlmYWNlX2NsayIsICJtZW1fY2xrIiwgIm1lbV9pZmFjZV9jbGsiOworCisJCXFjb20sc2VjdXJlX2FsaWduX21hc2sgPSA8MHhmZmY+OworCQlxY29tLHJldGVudGlvbjsKKwkJcWNvbSxoeXBfc2VjdXJlX2FsbG9jOworCisJCWdmeDNkX3VzZXI6IGdmeDNkX3VzZXIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtbXUta2dzbC1jYiI7CisJCQlsYWJlbCA9ICJnZngzZF91c2VyIjsKKwkJCWlvbW11cyA9IDwma2dzbF9zbW11IDA+OworCQkJcWNvbSxncHUtb2Zmc2V0ID0gPDB4NDgwMDA+OworCQl9OworCisJCWdmeDNkX3NlY3VyZTogZ2Z4M2Rfc2VjdXJlIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzbW11LWtnc2wtY2IiOworCQkJaW9tbXVzID0gPCZrZ3NsX3NtbXUgMj47CisJCX07CisJfTsKKworCWdtdTogcWNvbSxnbXUgeworCQlsYWJlbCA9ICJrZ3NsLWdtdSI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxncHUtZ211IjsKKworCQlyZWcgPQorCQkJPDB4NTA2YTAwMCAweDMxMDAwPiwKKwkJCTwweGIyMDAwMDAgMHgzMDAwMDA+LAorCQkJPDB4YzIwMDAwMCAweDEwMDAwPjsKKwkJcmVnLW5hbWVzID0KKwkJCSJrZ3NsX2dtdV9yZWciLAorCQkJImtnc2xfZ211X3BkY19yZWciLAorCQkJImtnc2xfZ211X2Nwcl9yZWciOworCisJCWludGVycnVwdHMgPSA8MCAzMDQgMD4sIDwwIDMwNSAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImtnc2xfaGZpX2lycSIsICJrZ3NsX2dtdV9pcnEiOworCisJCXFjb20sbXNtLWJ1cyxuYW1lID0gImNub2MiOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDI+OworCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDE+OworCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCTwyNiAxMDAzNiAwIDA+LCAgICAgIC8qIENOT0Mgb2ZmICovCisJCQk8MjYgMTAwMzYgMCAxMDA+OyAgICAvKiBDTk9DIG9uICAqLworCisJCXJlZ3VsYXRvci1uYW1lcyA9ICJ2ZGRjeCIsICJ2ZGQiOworCQl2ZGRjeC1zdXBwbHkgPSA8JmdwdV9jeF9nZHNjPjsKKwkJdmRkLXN1cHBseSA9IDwmZ3B1X2d4X2dkc2M+OworCisKKwkJY2xvY2tzID0gPCZjbG9ja19ncHVjYyBHUFVfQ0NfQ1hfR01VX0NMSz4sCisJCQkJPCZjbG9ja19ncHVjYyBHUFVfQ0NfQ1hPX0NMSz4sCisJCQkJPCZjbG9ja19nY2MgR0NDX0REUlNTX0dQVV9BWElfQ0xLPiwKKwkJCQk8JmNsb2NrX2djYyBHQ0NfR1BVX01FTU5PQ19HRlhfQ0xLPiwKKwkJCQk8JmNsb2NrX2dwdWNjIEdQVV9DQ19BSEJfQ0xLPjsKKworCQljbG9jay1uYW1lcyA9ICJnbXVfY2xrIiwgImN4b19jbGsiLCAiYXhpX2NsayIsCisJCQkJIm1lbW5vY19jbGsiLCAiYWhiX2NsayI7CisKKwkJcWNvbSxnbXUtcHdybGV2ZWxzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxnbXUtcHdybGV2ZWxzIjsKKworCQkJcWNvbSxnbXUtcHdybGV2ZWxAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXFjb20sZ211LWZyZXEgPSA8MjAwMDAwMDAwPjsKKwkJCX07CisKKwkJCXFjb20sZ211LXB3cmxldmVsQDEgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlxY29tLGdtdS1mcmVxID0gPDA+OworCQkJfTsKKwkJfTsKKworCQlnbXVfdXNlcjogZ211X3VzZXIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtbXUtZ211LXVzZXItY2IiOworCQkJaW9tbXVzID0gPCZrZ3NsX3NtbXUgND47CisJCX07CisKKwkJZ211X2tlcm5lbDogZ211X2tlcm5lbCB7CisJCQljb21wYXRpYmxlID0gInFjb20sc21tdS1nbXUta2VybmVsLWNiIjsKKwkJCWlvbW11cyA9IDwma2dzbF9zbW11IDU+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1pbnQtY2RjLXVzYmMtYXVkaW8tb3ZlcmxheS5kdHNpCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBpbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKY29weSB0byBhcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kKaW5kZXggYmMxY2Q5ZS4uZGYxMGU3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtaW50LWNkYy11c2JjLWF1ZGlvLW92ZXJsYXkuZHRzaQpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTgsMTUgKzgsMTAgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKICAqLwotI2lmbmRlZiBfX0RTUF9ERUJVR19IXwotI2RlZmluZSBfX0RTUF9ERUJVR19IXworI2luY2x1ZGUgInNkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kiCiAKLXR5cGVkZWYgaW50ICgqZHNwX3N0YXRlX2NiKShpbnQgc3RhdGUpOwotaW50IGRzcF9kZWJ1Z19yZWdpc3Rlcihkc3Bfc3RhdGVfY2IgcHRyKTsKLQotI2RlZmluZSBEU1BfU1RBVEVfQ1JBU0hFRCAgICAgICAgIDB4MAotI2RlZmluZSBEU1BfU1RBVEVfQ1JBU0hfRFVNUF9ET05FIDB4MQotCi0jZW5kaWYKKyZpbnRfY29kZWMgeworCXFjb20sbXNtLW1iaGMtdXNiYy1hdWRpby1zdXBwb3J0ZWQgPSA8MT47CisJcWNvbSx1c2JjLWFuYWxvZy1lbjEtZ3BpbyA9IDwmd2NkX3VzYmNfYW5hbG9nX2VuMV9ncGlvPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLW92ZXJsYXkuZHRzCmluZGV4IGM4NTM3YmMuLmFjMjU0ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLW92ZXJsYXkuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLW92ZXJsYXkuZHRzCkBAIC0yMCwxMCArMjAsMTQgQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CiAKICNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKIAogLyB7Ci0JbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBNVFAiOworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEwgTVRQIjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLW10cCIsICJxY29tLHNkbTY3MCIsICJxY29tLG10cCI7CiAJcWNvbSxtc20taWQgPSA8MzM2IDB4MD47CiAJcWNvbSxib2FyZC1pZCA9IDw4IDA+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLW10cC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLW10cC5kdHMKaW5kZXggMWRlNDBiNy4uMTI0MWEyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1tdHAuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLmR0cwpAQCAtMTUsOSArMTUsMTMgQEAKIAogI2luY2x1ZGUgInNkbTY3MC5kdHNpIgogI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpIgogCiAvIHsKLQltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIE1UUCI7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwTCBNVFAiOwogCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtbXRwIiwgInFjb20sc2RtNjcwIiwgInFjb20sbXRwIjsKIAlxY29tLGJvYXJkLWlkID0gPDggMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMTAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDEwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDEwMTFhIDB4MCAweDA+OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLW10cC5kdHNpCmluZGV4IDBjZjQ4YTMuLjQ2NjA2MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtbXRwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1tdHAuZHRzaQpAQCAtMTAsNiArMTAsMzYgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2dwaW8vZ3Bpby5oPgorI2luY2x1ZGUgInNkbTY3MC1wbWljLW92ZXJsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtc2RlLWRpc3BsYXkuZHRzaSIKKworJnVmc3BoeV9tZW0geworCWNvbXBhdGlibGUgPSAicWNvbSx1ZnMtcGh5LXFtcC12MyI7CisKKwl2ZGRhLXBoeS1zdXBwbHkgPSA8JnBtNjYwbF9sMT47IC8qIDAuODh2ICovCisJdmRkYS1wbGwtc3VwcGx5ID0gPCZwbTY2MF9sMT47IC8qIDEuMnYgKi8KKwl2ZGRhLXBoeS1tYXgtbWljcm9hbXAgPSA8NjI5MDA+OworCXZkZGEtcGxsLW1heC1taWNyb2FtcCA9IDwxODMwMD47CisKKwlzdGF0dXMgPSAib2siOworfTsKKworJnVmc2hjX21lbSB7CisJdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19waHlfZ2RzYz47CisJdmRkLWhiYS1maXhlZC1yZWd1bGF0b3I7CisJdmNjLXN1cHBseSA9IDwmcG02NjBsX2w0PjsKKwl2Y2Mtdm9sdGFnZS1sZXZlbCA9IDwyOTYwMDAwIDI5NjAwMDA+OworCXZjY3EyLXN1cHBseSA9IDwmcG02NjBfbDg+OworCXZjYy1tYXgtbWljcm9hbXAgPSA8NjAwMDAwPjsKKwl2Y2NxMi1tYXgtbWljcm9hbXAgPSA8NjAwMDAwPjsKKworCXFjb20sdmRkcC1yZWYtY2xrLXN1cHBseSA9IDwmcG02NjBfbDE+OworCXFjb20sdmRkcC1yZWYtY2xrLW1heC1taWNyb2FtcCA9IDwxMDA+OworCisJc3RhdHVzID0gIm9rIjsKK307CisKICZxdXB2M19zZTlfMnVhcnQgewogCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiB9OwpAQCAtMzMsMyArNjMsMTk0IEBACiAmcXVwdjNfc2U2XzR1YXJ0IHsKIAlzdGF0dXMgPSAiZGlzYWJsZWQiOwogfTsKKworJnNkaGNfMSB7CisJdmRkLXN1cHBseSA9IDwmcG02NjBsX2w0PjsKKwlxY29tLHZkZC12b2x0YWdlLWxldmVsID0gPDI5NjAwMDAgMjk2MDAwMD47CisJcWNvbSx2ZGQtY3VycmVudC1sZXZlbCA9IDwyMDAgNTcwMDAwPjsKKworCXZkZC1pby1zdXBwbHkgPSA8JnBtNjYwX2w4PjsKKwlxY29tLHZkZC1pby1hbHdheXMtb247CisJcWNvbSx2ZGQtaW8tbHBtLXN1cDsKKwlxY29tLHZkZC1pby12b2x0YWdlLWxldmVsID0gPDE4MDAwMDAgMTgwMDAwMD47CisJcWNvbSx2ZGQtaW8tY3VycmVudC1sZXZlbCA9IDwyMDAgMzI1MDAwPjsKKworCXBpbmN0cmwtbmFtZXMgPSAiYWN0aXZlIiwgInNsZWVwIjsKKwlwaW5jdHJsLTAgPSA8JnNkYzFfY2xrX29uICAmc2RjMV9jbWRfb24gJnNkYzFfZGF0YV9vbiAmc2RjMV9yY2xrX29uPjsKKwlwaW5jdHJsLTEgPSA8JnNkYzFfY2xrX29mZiAmc2RjMV9jbWRfb2ZmICZzZGMxX2RhdGFfb2ZmICZzZGMxX3JjbGtfb2ZmPjsKKworCXN0YXR1cyA9ICJvayI7Cit9OworCismc2RoY18yIHsKKwl2ZGQtc3VwcGx5ID0gPCZwbTY2MGxfbDU+OworCXFjb20sdmRkLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk2MDAwMCAyOTYwMDAwPjsKKwlxY29tLHZkZC1jdXJyZW50LWxldmVsID0gPDIwMCA4MDAwMDA+OworCisJdmRkLWlvLXN1cHBseSA9IDwmcG02NjBsX2wyPjsKKwlxY29tLHZkZC1pby12b2x0YWdlLWxldmVsID0gPDE4MDAwMDAgMjk2MDAwMD47CisJcWNvbSx2ZGQtaW8tY3VycmVudC1sZXZlbCA9IDwyMDAgMjIwMDA+OworCisJcGluY3RybC1uYW1lcyA9ICJhY3RpdmUiLCAic2xlZXAiOworCXBpbmN0cmwtMCA9IDwmc2RjMl9jbGtfb24gJnNkYzJfY21kX29uICZzZGMyX2RhdGFfb24gJnNkYzJfY2Rfb24+OworCXBpbmN0cmwtMSA9IDwmc2RjMl9jbGtfb2ZmICZzZGMyX2NtZF9vZmYgJnNkYzJfZGF0YV9vZmYgJnNkYzJfY2Rfb2ZmPjsKKworCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCWludGVycnVwdC1wYXJlbnQgPSA8JnNkaGNfMj47CisJaW50ZXJydXB0cyA9IDwwIDEgMj47CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmZmZmZmZmZj47CisJaW50ZXJydXB0LW1hcCA9IDwwICZpbnRjIDAgMCAyMDQgMAorCQkJMSAmaW50YyAwIDAgMjIyIDAKKwkJCTIgJnRsbW0gOTYgMD47CisJaW50ZXJydXB0LW5hbWVzID0gImhjX2lycSIsICJwd3JfaXJxIiwgInN0YXR1c19pcnEiOworCWNkLWdwaW9zID0gPCZ0bG1tIDk2IDB4MT47CisKKwlzdGF0dXMgPSAib2siOworfTsKKworJnZlbmRvciB7CisJbXRwX2JhdHRlcnlkYXRhOiBxY29tLGJhdHRlcnktZGF0YSB7CisJCXFjb20sYmF0dC1pZC1yYW5nZS1wY3QgPSA8MTU+OworCQkjaW5jbHVkZSAiZmctZ2VuMy1iYXR0ZXJ5ZGF0YS1pdGVjaC0zMDAwbWFoLmR0c2kiCisJCSNpbmNsdWRlICJmZy1nZW4zLWJhdHRlcnlkYXRhLWFzY2VudC0zNDUwbWFoLmR0c2kiCisJCSNpbmNsdWRlICJmZy1nZW4zLWJhdHRlcnlkYXRhLWRlbW8tNjAwMG1haC5kdHNpIgorCX07Cit9OworCismcG02NjBfZmcgeworCXFjb20sYmF0dGVyeS1kYXRhID0gPCZtdHBfYmF0dGVyeWRhdGE+OworfTsKKworJnNvYyB7CisJZ3Bpb19rZXlzIHsKKwkJY29tcGF0aWJsZSA9ICJncGlvLWtleXMiOworCQlsYWJlbCA9ICJncGlvLWtleXMiOworCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwma2V5X2NhbV9zbmFwc2hvdF9kZWZhdWx0CisJCQkgICAgICZrZXlfY2FtX2ZvY3VzX2RlZmF1bHQKKwkJCSAgICAgJmtleV92b2xfdXBfZGVmYXVsdD47CisKKwkJY2FtX3NuYXBzaG90IHsKKwkJCWxhYmVsID0gImNhbV9zbmFwc2hvdCI7CisJCQlncGlvcyA9IDwmdGxtbSA5MSAwPjsKKwkJCWxpbnV4LGlucHV0LXR5cGUgPSA8MT47CisJCQlsaW51eCxjb2RlID0gPDc2Nj47CisJCQlncGlvLWtleSx3YWtldXA7CisJCQlkZWJvdW5jZS1pbnRlcnZhbCA9IDwxNT47CisJCQlsaW51eCxjYW4tZGlzYWJsZTsKKwkJfTsKKworCQljYW1fZm9jdXMgeworCQkJbGFiZWwgPSAiY2FtX2ZvY3VzIjsKKwkJCWdwaW9zID0gPCZ0bG1tIDkyIDA+OworCQkJbGludXgsaW5wdXQtdHlwZSA9IDwxPjsKKwkJCWxpbnV4LGNvZGUgPSA8NTI4PjsKKwkJCWdwaW8ta2V5LHdha2V1cDsKKwkJCWRlYm91bmNlLWludGVydmFsID0gPDE1PjsKKwkJCWxpbnV4LGNhbi1kaXNhYmxlOworCQl9OworCisJCXZvbF91cCB7CisJCQlsYWJlbCA9ICJ2b2x1bWVfdXAiOworCQkJZ3Bpb3MgPSA8JnBtNjYwbF9ncGlvcyA3IEdQSU9fQUNUSVZFX0xPVz47CisJCQlsaW51eCxpbnB1dC10eXBlID0gPDE+OworCQkJbGludXgsY29kZSA9IDwxMTU+OworCQkJZ3Bpby1rZXksd2FrZXVwOworCQkJZGVib3VuY2UtaW50ZXJ2YWwgPSA8MTU+OworCQkJbGludXgsY2FuLWRpc2FibGU7CisJCX07CisJfTsKK307CisKKyZkc2lfZHVhbF9udDM1NTk3X3RydWx5X3ZpZGVvIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDc2IDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKK307CisKKyZkc2lfZHVhbF9udDM1NTk3X3RydWx5X2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA3NiAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47CisJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworfTsKKworJmRzaV9udDM1NTk3X3RydWx5X2RzY192aWRlbyB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAic2luZ2xlX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDc2IDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJzaW5nbGVfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNzYgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKK307CisKKyZkc2lfc2ltX3ZpZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47Cit9OworCismZHNpX2R1YWxfc2ltX3ZpZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47Cit9OworCismZHNpX3NpbV9jbWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9kdWFsX3NpbV9jbWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9zaW1fZHNjXzM3NV9jbWQgeworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworfTsKKworJmRzaV9kdWFsX3NpbV9kc2NfMzc1X2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47Cit9OworCismZHNpX2R1YWxfbnQzNTU5N190cnVseV92aWRlbyB7CisJcWNvbSxkc2ktZGlzcGxheS1hY3RpdmU7Cit9OworCismcG02NjBsX3dsZWQgeworCXN0YXR1cyA9ICJva2F5IjsKKwlxY29tLGxlZC1zdHJpbmdzLWxpc3QgPSBbMDEgMDJdOworfTsKKworJm1kc3NfbWRwIHsKKwkjY29vbGluZy1jZWxscyA9IDwyPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBpbmN0cmwuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcGluY3RybC5kdHNpCmluZGV4IDczZGYyNTMuLjE3NzgxM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcGluY3RybC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcGluY3RybC5kdHNpCkBAIC0xMTk2LDYgKzExOTYsMjAgQEAKIAkJCX07CiAJCX07CiAKKwkJc2RjMV9yY2xrX29uOiBzZGMxX3JjbGtfb24geworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gInNkYzFfcmNsayI7CisJCQkJYmlhcy1wdWxsLWRvd247IC8qIHB1bGwgZG93biAqLworCQkJfTsKKwkJfTsKKworCQlzZGMxX3JjbGtfb2ZmOiBzZGMxX3JjbGtfb2ZmIHsKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJzZGMxX3JjbGsiOworCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBwdWxsIGRvd24gKi8KKwkJCX07CisJCX07CisKIAkJc2RjMl9jbGtfb246IHNkYzJfY2xrX29uIHsKIAkJCWNvbmZpZyB7CiAJCQkJcGlucyA9ICJzZGMyX2NsayI7CkBAIC0xMjQ0LDYgKzEyNTgsMzIgQEAKIAkJCX07CiAJCX07CiAKKwkJc2RjMl9jZF9vbjogY2Rfb24geworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW85NiI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3Bpbzk2IjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQliaWFzLXB1bGwtdXA7CisJCQl9OworCQl9OworCisJCXNkYzJfY2Rfb2ZmOiBjZF9vZmYgeworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW85NiI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3Bpbzk2IjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQliaWFzLWRpc2FibGU7CisJCQl9OworCQl9OworCiAJCS8qIFVTQiBDIGFuYWxvZyBjb25maWd1cmF0aW9uICovCiAJCXdjZF91c2JjX2FuYWxvZ19lbjEgewogCQkJd2NkX3VzYmNfYW5hbG9nX2VuMV9pZGxlOiB3Y2RfdXNiY19hbmFfZW4xX2lkbGUgewpAQCAtMTM5Miw2ICsxNDMyLDIyIEBACiAJCQl9OwogCQl9OwogCisJCXdjZF9idWNrX3ZzZWwgeworCQkJd2NkX2J1Y2tfdnNlbF9kZWZhdWx0OiB3Y2RfYnVja192c2VsX2RlZmF1bHR7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvOTQiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvOTQiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDw4PjsgLyogOCBtQSAqLworCQkJCQliaWFzLXB1bGwtZG93bjsgLyogcHVsbCBkb3duICovCisJCQkJCW91dHB1dC1oaWdoOworCQkJCX07CisJCQl9OworCQl9OworCiAJCXdjZF9nbmRfbWljX3N3YXAgewogCQkJd2NkX2duZF9taWNfc3dhcF9pZGxlOiB3Y2RfZ25kX21pY19zd2FwX2lkbGUgewogCQkJCW11eCB7CkBAIC0xNDM3LDUgKzE0OTMsMTQ1IEBACiAJCQkJfTsKIAkJCX07CiAJCX07CisKKwkJLyogUGluY3RybCBzZXR0aW5nIGZvciBDQU1FUkEgR1BJTyBrZXkgKi8KKwkJa2V5X2NhbV9zbmFwc2hvdCB7CisJCQlrZXlfY2FtX3NuYXBzaG90X2RlZmF1bHQ6IGtleV9jYW1fc25hcHNob3RfZGVmYXVsdCB7CisJCQkJcGlucyA9ICJncGlvOTEiOworCQkJCWZ1bmN0aW9uID0gIm5vcm1hbCI7CisJCQkJaW5wdXQtZW5hYmxlOworCQkJCWJpYXMtcHVsbC11cDsKKwkJCQlwb3dlci1zb3VyY2UgPSA8MD47CisJCQl9OworCQl9OworCisJCWtleV9jYW1fZm9jdXMgeworCQkJa2V5X2NhbV9mb2N1c19kZWZhdWx0OiBrZXlfY2FtX2ZvY3VzX2RlZmF1bHQgeworCQkJCXBpbnMgPSAiZ3BpbzkyIjsKKwkJCQlmdW5jdGlvbiA9ICJub3JtYWwiOworCQkJCWlucHV0LWVuYWJsZTsKKwkJCQliaWFzLXB1bGwtdXA7CisJCQkJcG93ZXItc291cmNlID0gPDA+OworCQkJfTsKKwkJfTsKKworCQlwbXhfc2RlOiBwbXhfc2RlIHsKKwkJCXNkZV9kc2lfYWN0aXZlOiBzZGVfZHNpX2FjdGl2ZSB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvNzUiLCAiZ3Bpbzc2IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3Bpbzc1IiwgImdwaW83NiI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDg+OyAgIC8qIDggbUEgKi8KKwkJCQkJYmlhcy1kaXNhYmxlID0gPDA+OyAgIC8qIG5vIHB1bGwgKi8KKwkJCQl9OworCQkJfTsKKwkJCXNkZV9kc2lfc3VzcGVuZDogc2RlX2RzaV9zdXNwZW5kIHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW83NSIsICJncGlvNzYiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvNzUiLCAiZ3Bpbzc2IjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47ICAgLyogMiBtQSAqLworCQkJCQliaWFzLXB1bGwtZG93bjsgICAgICAgICAvKiBQVUxMIERPV04gKi8KKwkJCQl9OworCQkJfTsKKwkJfTsKKworCQlwbXhfc2RlX3RlIHsKKwkJCXNkZV90ZV9hY3RpdmU6IHNkZV90ZV9hY3RpdmUgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzEwIjsKKwkJCQkJZnVuY3Rpb24gPSAibWRwX3ZzeW5jIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgICAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAgICAgICAgIC8qIFBVTEwgRE9XTiAqLworCQkJCX07CisJCQl9OworCisJCQlzZGVfdGVfc3VzcGVuZDogc2RlX3RlX3N1c3BlbmQgeworCQkJCW11eCB7CisJCQkJCXBpbnMgPSAiZ3BpbzEwIjsKKwkJCQkJZnVuY3Rpb24gPSAibWRwX3ZzeW5jIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgICAvKiAyIG1BICovCisJCQkJCWJpYXMtcHVsbC1kb3duOyAgICAgICAgIC8qIFBVTEwgRE9XTiAqLworCQkJCX07CisJCQl9OworCQl9OworCisJCXNkZV9kcF9hdXhfYWN0aXZlOiBzZGVfZHBfYXV4X2FjdGl2ZSB7CisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzQwIiwgImdwaW81MCI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzQwIiwgImdwaW81MCI7CisJCQkJYmlhcy1kaXNhYmxlID0gPDA+OyAvKiBubyBwdWxsICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8OD47CisJCQl9OworCQl9OworCisJCXNkZV9kcF9hdXhfc3VzcGVuZDogc2RlX2RwX2F1eF9zdXNwZW5kIHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvNDAiLCAiZ3BpbzUwIjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvNDAiLCAiZ3BpbzUwIjsKKwkJCQliaWFzLXB1bGwtZG93bjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCX07CisJCX07CisKKwkJc2RlX2RwX3VzYnBsdWdfY2NfYWN0aXZlOiBzZGVfZHBfdXNicGx1Z19jY19hY3RpdmUgeworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8zOCI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzM4IjsKKwkJCQliaWFzLWRpc2FibGU7CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8MTY+OworCQkJfTsKKwkJfTsKKworCQlzZGVfZHBfdXNicGx1Z19jY19zdXNwZW5kOiBzZGVfZHBfdXNicGx1Z19jY19zdXNwZW5kIHsKKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvMzgiOworCQkJCWZ1bmN0aW9uID0gImdwaW8iOworCQkJfTsKKworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gImdwaW8zOCI7CisJCQkJYmlhcy1wdWxsLWRvd247CisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQl9OworCQl9OworCX07Cit9OworCismcG02NjBsX2dwaW9zIHsKKwlrZXlfdm9sX3VwIHsKKwkJa2V5X3ZvbF91cF9kZWZhdWx0OiBrZXlfdm9sX3VwX2RlZmF1bHQgeworCQkJcGlucyA9ICJncGlvNyI7CisJCQlmdW5jdGlvbiA9ICJub3JtYWwiOworCQkJaW5wdXQtZW5hYmxlOworCQkJYmlhcy1wdWxsLXVwOworCQkJcG93ZXItc291cmNlID0gPDA+OworCQl9OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtY2RwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtY2RwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjc3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBBIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBtNjYwYS1jZHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtY2RwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY1ZTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtY2RwLmR0cwpAQCAtMCwwICsxLDI4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKworI2luY2x1ZGUgInNkbTY3MC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBBIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sYm9hcmQtaWQgPSA8MSAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTA2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBtNjYwYS1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBBIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAwPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1wbTY2MGEtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcG02NjBhLW10cC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmNDhhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcG02NjBhLW10cC5kdHMKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAicG02NjBhLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwQSBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtbXRwIiwgInFjb20sc2RtNjcwIiwgInFjb20sbXRwIjsKKwlxY29tLGJvYXJkLWlkID0gPDggMD47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcG1pYy1vdmVybGF5LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBtaWMtb3ZlcmxheS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmJlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXBtaWMtb3ZlcmxheS5kdHNpCkBAIC0wLDAgKzEsMzgxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworJnBtNjYwXzB7CisJcG02NjBfY2hhcmdlcjogcWNvbSxxcG5wLXNtYjIgeworCQljb21wYXRpYmxlID0gInFjb20scXBucC1zbWIyIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQkjY29vbGluZy1jZWxscyA9IDwyPjsKKworCQlxY29tLHBtaWMtcmV2aWQgPSA8JnBtNjYwX3JldmlkPjsKKworCQlpby1jaGFubmVscyA9IDwmcG02NjBfcnJhZGMgOD4sCisJCQkgICAgICA8JnBtNjYwX3JyYWRjIDEwPiwKKwkJCSAgICAgIDwmcG02NjBfcnJhZGMgMz4sCisJCQkgICAgICA8JnBtNjYwX3JyYWRjIDQ+OworCQlpby1jaGFubmVsLW5hbWVzID0gImNoYXJnZXJfdGVtcCIsCisJCQkJICAgImNoYXJnZXJfdGVtcF9tYXgiLAorCQkJCSAgICJ1c2Jpbl9pIiwKKwkJCQkgICAidXNiaW5fdiI7CisKKwkJcWNvbSx3aXBvd2VyLW1heC11dyA9IDw1MDAwMDAwPjsKKworCQkvKiBFbmFibGUgYWZ0ZXIgdGhlIHF1c2JfcGh5MCBkZXZpY2Ugbm9kZSBpcyBhZGRlZCAqLworCQkvKiBkcGRtLXN1cHBseSA9IDwmcXVzYl9waHkwPjsgKi8KKworCQlxY29tLHRoZXJtYWwtbWl0aWdhdGlvbgorCQkJCT0gPDMwMDAwMDAgMjUwMDAwMCAyMDAwMDAwIDE1MDAwMDAKKwkJCQkJMTAwMDAwMCA1MDAwMDA+OworCisJCXFjb20sY2hnckAxMDAwIHsKKwkJCXJlZyA9IDwweDEwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9CisJCQkJPDB4MCAweDEwIDB4MCBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEwIDB4MSBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEwIDB4MiBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEwIDB4MyBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEwIDB4NCBJUlFfVFlQRV9FREdFX1JJU0lORz47CisKKwkJCWludGVycnVwdC1uYW1lcyA9ICJjaGctZXJyb3IiLAorCQkJCQkgICJjaGctc3RhdGUtY2hhbmdlIiwKKwkJCQkJICAic3RlcC1jaGctc3RhdGUtY2hhbmdlIiwKKwkJCQkJICAic3RlcC1jaGctc29jLXVwZGF0ZS1mYWlsIiwKKwkJCQkJICAic3RlcC1jaGctc29jLXVwZGF0ZS1yZXF1ZXN0IjsKKwkJfTsKKworCQlxY29tLG90Z0AxMTAwIHsKKwkJCXJlZyA9IDwweDExMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHgxMSAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHgxMSAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHgxMSAweDIgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHgxMSAweDMgSVJRX1RZUEVfRURHRV9CT1RIPjsKKworCQkJaW50ZXJydXB0LW5hbWVzID0gIm90Zy1mYWlsIiwKKwkJCQkJICAib3RnLW92ZXJjdXJyZW50IiwKKwkJCQkJICAib3RnLW9jLWRpcy1zdy1zdHMiLAorCQkJCQkgICJ0ZXN0bW9kZS1jaGFuZ2UtZGV0ZWN0IjsKKwkJfTsKKworCQlxY29tLGJhdC1pZkAxMjAwIHsKKwkJCXJlZyA9IDwweDEyMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9CisJCQkJPDB4MCAweDEyIDB4MCBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEyIDB4MSBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxMiAweDIgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTIgMHgzIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDEyIDB4NCBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxMiAweDUgSVJRX1RZUEVfRURHRV9CT1RIPjsKKworCQkJaW50ZXJydXB0LW5hbWVzID0gImJhdC10ZW1wIiwKKwkJCQkJICAiYmF0LW9jcCIsCisJCQkJCSAgImJhdC1vdiIsCisJCQkJCSAgImJhdC1sb3ciLAorCQkJCQkgICJiYXQtdGhlcm0tb3ItaWQtbWlzc2luZyIsCisJCQkJCSAgImJhdC10ZXJtaW5hbC1taXNzaW5nIjsKKwkJfTsKKworCQlxY29tLHVzYi1jaGdwdGhAMTMwMCB7CisJCQlyZWcgPSA8MHgxMzAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPQorCQkJCTwweDAgMHgxMyAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTMgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDEzIDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxMyAweDMgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTMgMHg0IElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDEzIDB4NSBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEzIDB4NiBJUlFfVFlQRV9FREdFX1JJU0lORz4sCisJCQkJPDB4MCAweDEzIDB4NyBJUlFfVFlQRV9FREdFX1JJU0lORz47CisKKwkJCWludGVycnVwdC1uYW1lcyA9ICJ1c2Jpbi1jb2xsYXBzZSIsCisJCQkJCSAgInVzYmluLWx0LTNwNnYiLAorCQkJCQkgICJ1c2Jpbi11diIsCisJCQkJCSAgInVzYmluLW92IiwKKwkJCQkJICAidXNiaW4tcGx1Z2luIiwKKwkJCQkJICAidXNiaW4tc3JjLWNoYW5nZSIsCisJCQkJCSAgInVzYmluLWljbC1jaGFuZ2UiLAorCQkJCQkgICJ0eXBlLWMtY2hhbmdlIjsKKwkJfTsKKworCQlxY29tLGRjLWNoZ3B0aEAxNDAwIHsKKwkJCXJlZyA9IDwweDE0MDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9CisJCQkJPDB4MCAweDE0IDB4MCBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxNCAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTQgMHgyIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDE0IDB4MyBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxNCAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTQgMHg1IElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDE0IDB4NiBJUlFfVFlQRV9FREdFX1JJU0lORz47CisKKwkJCWludGVycnVwdC1uYW1lcyA9ICJkY2luLWNvbGxhcHNlIiwKKwkJCQkJICAiZGNpbi1sdC0zcDZ2IiwKKwkJCQkJICAiZGNpbi11diIsCisJCQkJCSAgImRjaW4tb3YiLAorCQkJCQkgICJkY2luLXBsdWdpbiIsCisJCQkJCSAgImRpdjItZW4tZGciLAorCQkJCQkgICJkY2luLWljbC1jaGFuZ2UiOworCQl9OworCisJCXFjb20sY2hnci1taXNjQDE2MDAgeworCQkJcmVnID0gPDB4MTYwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0KKwkJCQk8MHgwIDB4MTYgMHgwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCQk8MHgwIDB4MTYgMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCQk8MHgwIDB4MTYgMHgyIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDE2IDB4MyBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCTwweDAgMHgxNiAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQk8MHgwIDB4MTYgMHg1IElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJPDB4MCAweDE2IDB4NiBJUlFfVFlQRV9FREdFX0ZBTExJTkc+LAorCQkJCTwweDAgMHgxNiAweDcgSVJRX1RZUEVfRURHRV9CT1RIPjsKKworCQkJaW50ZXJydXB0LW5hbWVzID0gIndkb2ctc25hcmwiLAorCQkJCQkgICJ3ZG9nLWJhcmsiLAorCQkJCQkgICJhaWNsLWZhaWwiLAorCQkJCQkgICJhaWNsLWRvbmUiLAorCQkJCQkgICJoaWdoLWR1dHktY3ljbGUiLAorCQkJCQkgICJpbnB1dC1jdXJyZW50LWxpbWl0aW5nIiwKKwkJCQkJICAidGVtcGVyYXR1cmUtY2hhbmdlIiwKKwkJCQkJICAic3dpdGNoZXItcG93ZXItb2siOworCQl9OworCQlzbWIyX3ZidXM6IHFjb20sc21iMi12YnVzIHsKKwkJCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmJ1cyI7CisJCX07CisKKwkJc21iMl92Y29ubjogcWNvbSxzbWIyLXZjb25uIHsKKwkJCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmNvbm4iOworCQl9OworCX07CisKKwlwbTY2MF9ycmFkYzogcnJhZGNANDUwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxycmFkYyI7CisJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OworCQlxY29tLHBtaWMtcmV2aWQgPSA8JnBtNjYwX3JldmlkPjsKKwl9OworCisJcG02NjBfZmc6IHFwbnAsZmcgeworCQljb21wYXRpYmxlID0gInFjb20sZmctZ2VuMyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MF9yZXZpZD47CisJCWlvLWNoYW5uZWxzID0gPCZwbTY2MF9ycmFkYyAwPiwKKwkJCSAgICAgIDwmcG02NjBfcnJhZGMgNz47CisJCWlvLWNoYW5uZWwtbmFtZXMgPSAicnJhZGNfYmF0dF9pZCIsCisJCQkJICAgInJyYWRjX2RpZV90ZW1wIjsKKwkJcWNvbSxycmFkYy1iYXNlID0gPDB4NDUwMD47CisJCXFjb20sZmctZXNyLXRpbWVyLWF3YWtlID0gPDk2IDk2PjsKKwkJcWNvbSxmZy1lc3ItdGltZXItYXNsZWVwID0gPDI1NiAyNTY+OworCQlxY29tLGZnLWVzci10aW1lci1jaGFyZ2luZyA9IDwwIDk2PjsKKwkJcWNvbSxjeWNsZS1jb3VudGVyLWVuOworCQlzdGF0dXMgPSAib2theSI7CisKKwkJcWNvbSxmZy1iYXR0LXNvY0A0MDAwIHsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJCXJlZyA9IDwweDQwMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHg0MCAweDAgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDEgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDIKKwkJCQkJCUlSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDMKKwkJCQkJCUlSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDQgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDUKKwkJCQkJCUlSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDYgSVJRX1RZUEVfRURHRV9CT1RIPiwKKwkJCQkgICAgIDwweDAgMHg0MCAweDcgSVJRX1RZUEVfRURHRV9CT1RIPjsKKwkJCWludGVycnVwdC1uYW1lcyA9ICJzb2MtdXBkYXRlIiwKKwkJCQkJICAic29jLXJlYWR5IiwKKwkJCQkJICAiYnNvYy1kZWx0YSIsCisJCQkJCSAgIm1zb2MtZGVsdGEiLAorCQkJCQkgICJtc29jLWxvdyIsCisJCQkJCSAgIm1zb2MtZW1wdHkiLAorCQkJCQkgICJtc29jLWhpZ2giLAorCQkJCQkgICJtc29jLWZ1bGwiOworCQl9OworCisJCXFjb20sZmctYmF0dC1pbmZvQDQxMDAgeworCQkJc3RhdHVzID0gIm9rYXkiOworCQkJcmVnID0gPDB4NDEwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDQxIDB4MCBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCSAgICAgPDB4MCAweDQxIDB4MSBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCSAgICAgPDB4MCAweDQxIDB4MiBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCSAgICAgPDB4MCAweDQxIDB4MyBJUlFfVFlQRV9FREdFX0JPVEg+LAorCQkJCSAgICAgPDB4MCAweDQxIDB4NiBJUlFfVFlQRV9FREdFX0JPVEg+OworCQkJaW50ZXJydXB0LW5hbWVzID0gInZiYXR0LXByZWQtZGVsdGEiLAorCQkJCQkgICJ2YmF0dC1sb3ciLAorCQkJCQkgICJlc3ItZGVsdGEiLAorCQkJCQkgICJiYXR0LW1pc3NpbmciLAorCQkJCQkgICJiYXR0LXRlbXAtZGVsdGEiOworCQl9OworCisJCXFjb20sZmctbWVtaWZANDQwMCB7CisJCQlzdGF0dXMgPSAib2theSI7CisJCQlyZWcgPSA8MHg0NDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4NDQgMHgwIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJICAgICA8MHgwIDB4NDQgMHgxIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkJICAgICA8MHgwIDB4NDQgMHgyIElSUV9UWVBFX0VER0VfQk9USD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAiaW1hLXJkeSIsCisJCQkJCSAgIm1lbS14Y3AiLAorCQkJCQkgICJkbWEtZ3JhbnQiOworCQl9OworCX07Cit9OworCismcG02NjBfMSB7CisJcG02NjBfaGFwdGljczogcWNvbSxoYXB0aWNzQGMwMDAgeworCQljb21wYXRpYmxlID0gInFjb20scXBucC1oYXB0aWNzIjsKKwkJcmVnID0gPDB4YzAwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MHgxIDB4YzAgMHgwIElSUV9UWVBFX0VER0VfQk9USD4sCisJCQkgICAgIDwweDEgMHhjMCAweDEgSVJRX1RZUEVfRURHRV9CT1RIPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImhhcC1zYy1pcnEiLCAiaGFwLXBsYXktaXJxIjsKKwkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MF9yZXZpZD47CisJCXFjb20scG1pYy1taXNjID0gPCZwbTY2MF9taXNjPjsKKwkJcWNvbSxtaXNjLWNsay10cmltLWVycm9yLXJlZyA9IDwweGYzPjsKKwkJcWNvbSxhY3R1YXRvci10eXBlID0gPDA+OworCQlxY29tLHBsYXktbW9kZSA9ICJkaXJlY3QiOworCQlxY29tLHZtYXgtbXYgPSA8MzIwMD47CisJCXFjb20saWxpbS1tYSA9IDw4MDA+OworCQlxY29tLHNjLWRiYy1jeWNsZXMgPSA8OD47CisJCXFjb20sd2F2ZS1wbGF5LXJhdGUtdXMgPSA8NjY2Nz47CisJCXFjb20sZW4tYnJha2U7CisJCXFjb20sbHJhLWhpZ2gteiA9ICJvcHQwIjsKKwkJcWNvbSxscmEtYXV0by1yZXMtbW9kZSA9ICJxd2QiOworCQlxY29tLGxyYS1yZXMtY2FsLXBlcmlvZCA9IDw0PjsKKwl9OworfTsKKworJnBtNjYwbF8zIHsKKwlwbTY2MGxfd2xlZDogcWNvbSxsZWRzQGQ4MDAgeworCQljb21wYXRpYmxlID0gInFjb20scXBucC13bGVkIjsKKwkJcmVnID0gPDB4ZDgwMCAweDEwMD4sCisJCQk8MHhkOTAwIDB4MTAwPjsKKwkJcmVnLW5hbWVzID0gInFwbnAtd2xlZC1jdHJsLWJhc2UiLAorCQkJCSJxcG5wLXdsZWQtc2luay1iYXNlIjsKKwkJaW50ZXJydXB0cyA9IDwweDMgMHhkOCAweDEgSVJRX1RZUEVfRURHRV9SSVNJTkc+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAib3ZwLWlycSI7CisJCWxpbnV4LG5hbWUgPSAid2xlZCI7CisJCWxpbnV4LGRlZmF1bHQtdHJpZ2dlciA9ICJia2wtdHJpZ2dlciI7CisJCXFjb20sZmRiay1vdXRwdXQgPSAiYXV0byI7CisJCXFjb20sdnJlZi11diA9IDwxMjc1MDA+OworCQlxY29tLHN3aXRjaC1mcmVxLWtoeiA9IDw4MDA+OworCQlxY29tLG92cC1tdiA9IDwyOTYwMD47CisJCXFjb20saWxpbS1tYSA9IDw5NzA+OworCQlxY29tLGJvb3N0LWR1dHktbnMgPSA8MjY+OworCQlxY29tLG1vZC1mcmVxLWtoeiA9IDw5NjAwPjsKKwkJcWNvbSxkaW0tbW9kZSA9ICJoeWJyaWQiOworCQlxY29tLGh5Yi10aHJlcyA9IDw2MjU+OworCQlxY29tLHN5bmMtZGx5LXVzID0gPDgwMD47CisJCXFjb20sZnMtY3Vyci11YSA9IDwyNTAwMD47CisJCXFjb20sY29ucy1zeW5jLXdyaXRlLWRlbGF5LXVzID0gPDEwMDA+OworCQlxY29tLGxlZC1zdHJpbmdzLWxpc3QgPSBbMDAgMDEgMDJdOworCQlxY29tLGxvb3AtYXV0by1nbS1lbjsKKwkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MGxfcmV2aWQ+OworCQlxY29tLGF1dG8tY2FsaWJyYXRpb24tZW5hYmxlOworCQlzdGF0dXMgPSAib2siOworCX07CisKKwlwbTY2MGxfbGNkYjogcXBucC1sY2RiQGVjMDAgeworCQljb21wYXRpYmxlID0gInFjb20scXBucC1sY2RiLXJlZ3VsYXRvciI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ZWMwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MHgzIDB4ZWMgMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gInNjLWlycSI7CisKKwkJcWNvbSxwbWljLXJldmlkID0gPCZwbTY2MGxfcmV2aWQ+OworCisJCWxjZGJfbGRvX3ZyZWc6IGxkbyB7CisJCQlsYWJlbCA9ICJsZG8iOworCQkJcmVndWxhdG9yLW5hbWUgPSAibGNkYl9sZG8iOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw2MDAwMDAwPjsKKwkJfTsKKworCQlsY2RiX25jcF92cmVnOiBuY3AgeworCQkJbGFiZWwgPSAibmNwIjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gImxjZGJfbmNwIjsKKwkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDQwMDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8NjAwMDAwMD47CisJCX07CisJfTsKKworCXBtNjYwYV9vbGVkYjogcXBucC1vbGVkYkBlMDAwIHsKKwkgICAgICAgY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtb2xlZGItcmVndWxhdG9yIjsKKwkgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJICAgICAgICNzaXplLWNlbGxzID0gPDE+OworCSAgICAgICBxY29tLHBtaWMtcmV2aWQgPSA8JnBtNjYwbF9yZXZpZD47CisJICAgICAgIHJlZyA9IDwweGUwMDAgMHgxMDA+OworCSAgICAgICBxY29tLHBicy1jbGllbnQgPSA8JnBtNjYwbF9wYnM+OworCisJICAgICAgIGxhYmVsID0gIm9sZWRiIjsKKwkgICAgICAgcmVndWxhdG9yLW5hbWUgPSAicmVndWxhdG9yLW9sZWRiIjsKKwkgICAgICAgcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NTAwMDAwMD47CisJICAgICAgIHJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDgxMDAwMDA+OworCisJICAgICAgIHFjb20sc3dpcmUtY29udHJvbDsKKwkgICAgICAgcWNvbSxleHQtcGluLWNvbnRyb2w7CisJICAgICAgIHN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKworCXBtNjYwYV9sYWJpYmI6IHFwbnAtbGFiaWJiLXJlZ3VsYXRvciB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxxcG5wLWxhYmliYi1yZWd1bGF0b3IiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXFjb20scG1pYy1yZXZpZCA9IDwmcG02NjBsX3JldmlkPjsKKwkJcWNvbSxzd2lyZS1jb250cm9sOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCWliYl9yZWd1bGF0b3I6IHFjb20saWJiQGRjMDAgeworCQkJcmVnID0gPDB4ZGMwMCAweDEwMD47CisJCQlyZWctbmFtZXMgPSAiaWJiX3JlZyI7CisJCQlyZWd1bGF0b3ItbmFtZSA9ICJpYmJfcmVnIjsKKworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8NDAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw2MzAwMDAwPjsKKworCQkJcWNvbSxxcG5wLWliYi1taW4tdm9sdGFnZSA9IDwxNDAwMDAwPjsKKwkJCXFjb20scXBucC1pYmItc3RlcC1zaXplID0gPDEwMDAwMD47CisJCQlxY29tLHFwbnAtaWJiLXNsZXctcmF0ZSA9IDwyMDAwMDAwPjsKKwkJCXFjb20scXBucC1pYmItaW5pdC12b2x0YWdlID0gPDQwMDAwMDA+OworCQkJcWNvbSxxcG5wLWliYi1pbml0LWFtb2xlZC12b2x0YWdlID0gPDQwMDAwMDA+OworCQl9OworCisJCWxhYl9yZWd1bGF0b3I6IHFjb20sbGFiQGRlMDAgeworCQkJcmVnID0gPDB4ZGUwMCAweDEwMD47CisJCQlyZWctbmFtZXMgPSAibGFiIjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gImxhYl9yZWciOworCisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw0NjAwMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDYxMDAwMDA+OworCisJCQlxY29tLHFwbnAtbGFiLW1pbi12b2x0YWdlID0gPDQ2MDAwMDA+OworCQkJcWNvbSxxcG5wLWxhYi1zdGVwLXNpemUgPSA8MTAwMDAwPjsKKwkJCXFjb20scXBucC1sYWItc2xldy1yYXRlID0gPDUwMDA+OworCQkJcWNvbSxxcG5wLWxhYi1pbml0LXZvbHRhZ2UgPSA8NDYwMDAwMD47CisJCQlxY29tLHFwbnAtbGFiLWluaXQtYW1vbGVkLXZvbHRhZ2UgPSA8NDYwMDAwMD47CisKKwkJCXFjb20sbm90aWZ5LWxhYi12cmVnLW9rLXN0czsKKwkJfTsKKwl9OworfTsKKworJnBtNjYwX3BkcGh5IHsKKwl2YnVzLXN1cHBseSA9IDwmc21iMl92YnVzPjsKKwl2Y29ubi1zdXBwbHkgPSA8JnNtYjJfdmNvbm4+OworfTsKKworJnVzYjAgeworCWV4dGNvbiA9IDwmcG02NjBfcGRwaHk+LCA8JnBtNjYwX3BkcGh5PiwgPDA+IC8qIDwmZXVkPiAqLzsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJlZ3VsYXRvci5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1yZWd1bGF0b3IuZHRzaQppbmRleCAwYThjNDlmLi4yNGI4ZGQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJlZ3VsYXRvci5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcmVndWxhdG9yLmR0c2kKQEAgLTk2LDYgKzk2LDE0IEBACiAJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OwogCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfTUFYPjsKIAkJfTsKKworCQlteF9jZGV2OiBteC1jZGV2LWx2bCB7CisJCQljb21wYXRpYmxlID0gInFjb20scmVndWxhdG9yLWNvb2xpbmctZGV2aWNlIjsKKwkJCXJlZ3VsYXRvci1jZGV2LXN1cHBseSA9IDwmcG02NjBsX3MxX2xldmVsPjsKKwkJCXJlZ3VsYXRvci1sZXZlbHMgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfTk9NCisJCQkJCVJQTUhfUkVHVUxBVE9SX0xFVkVMX09GRj47CisJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKKwkJfTsKIAl9OwogCiAJLyogcG02NjBsIFMyIC0gVkREX0dGWCBzdXBwbHkgKi8KQEAgLTEzNyw2ICsxNDUsMTMgQEAKIAkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX01BWD47CiAJCQlxY29tLG1pbi1kcm9wb3V0LXZvbHRhZ2UtbGV2ZWwgPSA8KC0xKT47CiAJCX07CisKKwkJY3hfY2RldjogcmVndWxhdG9yLWNkZXYgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHJwbWgtcmVnLWNkZXYiOworCQkJbWJveGVzID0gPCZxbXBfYW9wIDA+OworCQkJcWNvbSxyZWctcmVzb3VyY2UtbmFtZSA9ICJjeCI7CisJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKKwkJfTsKIAl9OwogCiAJcnBtaC1yZWd1bGF0b3ItbGRvYTEgewpAQCAtNjI3LDE0ICs2NDIsMTQgQEAKIAkJCXFjb20saW5pdC12b2x0YWdlID0gPDMzMTIwMDA+OwogCQl9OwogCX07Ci19OwogCi0mcG02NjBfY2hhcmdlciB7Ci0Jc21iMl92YnVzOiBxY29tLHNtYjItdmJ1cyB7Ci0JCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmJ1cyI7Ci0JfTsKLQotCXNtYjJfdmNvbm46IHFjb20sc21iMi12Y29ubiB7Ci0JCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmNvbm4iOworCXJlZmdlbjogcmVmZ2VuLXJlZ3VsYXRvckBmZjEwMDAgeworCQljb21wYXRpYmxlID0gInFjb20scmVmZ2VuLXJlZ3VsYXRvciI7CisJCXJlZyA9IDwweGZmMTAwMCAweDYwPjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicmVmZ2VuIjsKKwkJcmVndWxhdG9yLWVuYWJsZS1yYW1wLWRlbGF5ID0gPDU+OworCQlwcm94eS1zdXBwbHkgPSA8JnJlZmdlbj47CisJCXFjb20scHJveHktY29uc3VtZXItZW5hYmxlOworCQlyZWd1bGF0b3ItYWx3YXlzLW9uOwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1ydW1pLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1ydW1pLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjRkODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJ1bWktb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisjaW5jbHVkZSAic2RtNjcwLXJ1bWkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBSVU1JIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLXJ1bWkiLCAicWNvbSxzZG02NzAiLCAicWNvbSxydW1pIjsKKwlxY29tLG1zbS1pZCA9IDwzMzYgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDE1IDA+OworfTsKKworJnNvYyB7CisJd2RvZzogcWNvbSx3ZHRAMTc5ODAwMDB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJ1bWkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1ydW1pLmR0cwppbmRleCA2MjAxNDg4Li5lMTM3NzA1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJ1bWkuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcnVtaS5kdHMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgInNkbTY3MC5kdHNpIgogI2luY2x1ZGUgInNkbTY3MC1ydW1pLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUlVNSSI7CiAJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1ydW1pIiwgInFjb20sc2RtNjcwIiwgInFjb20scnVtaSI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXJ1bWkuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcnVtaS5kdHNpCmluZGV4IGYyZjQxZmQuLmE1MGQ5YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcnVtaS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtcnVtaS5kdHNpCkBAIC0xMCwxOCArMTAsNTAgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotL3sKLQlhbGlhc2VzIHsKLQkJc2VyaWFsMCA9ICZxdXB2M19zZTEwXzJ1YXJ0OwotCQlzZXJpYWwxID0gJnF1cHYzX3NlOV8ydWFydDsKLQkJc3BpMCA9ICZxdXB2M19zZThfc3BpOwotCQlpMmMwID0gJnF1cHYzX3NlMTBfaTJjOwotCQlpMmMxID0gJnF1cHYzX3NlM19pMmM7Ci0JCWhzdWFydDAgPSAmcXVwdjNfc2U2XzR1YXJ0OwotCX07CisjaW5jbHVkZSAic2RtNjcwLXBtaWMtb3ZlcmxheS5kdHNpIgogCismc29jIHsKKwkvKiBEZWxldGUgYWxsIHJlZ3VsYXRvcnMgKi8KKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLXNtcGE0OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3Itc21wYTY7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1teGx2bDsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLW1vZGVtbHZsOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItY3hsdmw7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9hMTsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2EyOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTM7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9hNTsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2E2OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTc7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9hODsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2E5OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTEwOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTExOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTEyOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTEzOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTE0OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTE1OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTE2OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTE3OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYTE5OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYjE7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9iMjsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2IzOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYjQ7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9iNTsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2I2OworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItbGRvYjc7CisJL2RlbGV0ZS1ub2RlLyBycG1oLXJlZ3VsYXRvci1sZG9iODsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxjeGx2bDsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxteGx2bDsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWxkb2EyODsKKwkvZGVsZXRlLW5vZGUvIHJwbWgtcmVndWxhdG9yLWJvYmIxOworCS9kZWxldGUtbm9kZS8gcnBtaC1yZWd1bGF0b3ItZ2Z4bHZsOworCS9kZWxldGUtbm9kZS8gdGhlcm1hbC16b25lczsKIH07CiAKKyNpbmNsdWRlICJzZG02NzAtc3R1Yi1yZWd1bGF0b3IuZHRzaSIKKwogJnF1cHYzX3NlOV8ydWFydCB7CiAJc3RhdHVzID0gImRpc2FibGVkIjsKIH07CkBAIC05Niw1ICsxMjgsOTEgQEAKIAlxY29tLGNsay1yYXRlcyA9IDw0MDAwMDAgMjAwMDAwMDAgMjUwMDAwMDAgNTAwMDAwMDA+OwogCXFjb20sYnVzLXNwZWVkLW1vZGUgPSAiSFMyMDBfMXA4diIsICJERFJfMXA4diI7CiAKKwkvZGVsZXRlLXByb3BlcnR5L3Fjb20sZGV2ZnJlcSxmcmVxLXRhYmxlOworCiAJc3RhdHVzID0gIm9rIjsKIH07CisKKyZzZGhjXzIgeworCXZkZC1zdXBwbHkgPSA8JnBtNjYwbF9sNT47CisJcWNvbSx2ZGQtdm9sdGFnZS1sZXZlbCA9IDwyOTYwMDAwIDI5NjAwMDA+OworCXFjb20sdmRkLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDgwMDAwMD47CisKKwl2ZGQtaW8tc3VwcGx5ID0gPCZwbTY2MGxfbDI+OworCXFjb20sdmRkLWlvLXZvbHRhZ2UtbGV2ZWwgPSA8MTgwMDAwMCAyOTYwMDAwPjsKKwlxY29tLHZkZC1pby1jdXJyZW50LWxldmVsID0gPDIwMCAyMjAwMD47CisKKwlwaW5jdHJsLW5hbWVzID0gImFjdGl2ZSIsICJzbGVlcCI7CisJcGluY3RybC0wID0gPCZzZGMyX2Nsa19vbiAgJnNkYzJfY21kX29uICZzZGMyX2RhdGFfb24+OworCXBpbmN0cmwtMSA9IDwmc2RjMl9jbGtfb2ZmICZzZGMyX2NtZF9vZmYgJnNkYzJfZGF0YV9vZmY+OworCisJcWNvbSxjbGstcmF0ZXMgPSA8NDAwMDAwIDIwMDAwMDAwIDI1MDAwMDAwIDUwMDAwMDAwPjsKKwlxY29tLGJ1cy1zcGVlZC1tb2RlID0gIlNEUjEyIiwgIlNEUjI1IiwgIlNEUjUwIjsKKworCS9kZWxldGUtcHJvcGVydHkvcWNvbSxkZXZmcmVxLGZyZXEtdGFibGU7CisKKwlzdGF0dXMgPSAib2siOworfTsKKworJnVzYjAgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sdXNiLWRibTsKKwkvZGVsZXRlLXByb3BlcnR5LyBleHRjb247CisJcWNvbSxjaGFyZ2luZy1kaXNhYmxlZDsKKwlkd2MzQGE2MDAwMDAgeworCQltYXhpbXVtLXNwZWVkID0gImhpZ2gtc3BlZWQiOworCQl1c2ItcGh5ID0gPCZxdXNiX3BoeTA+LCA8JnVzYl9ub3BfcGh5PjsKKwl9OworfTsKKworJnF1c2JfcGh5MCB7CisJcmVnID0gPDB4MDg4ZTIwMDAgMHg0PiwKKwkJPDB4MGE3MjAwMDAgMHg5NTAwPjsKKwlyZWctbmFtZXMgPSAicXVzYl9waHlfYmFzZSIsCisJCSJlbXVfcGh5X2Jhc2UiOworCXFjb20sZW11bGF0aW9uOworCXFjb20sZW11LWluaXQtc2VxID0gPDB4MTkgMHgxNDA0CisJCQkJMHgyMCAweDE0MTQKKwkJCQkweDc5IDB4MTQxMAorCQkJCTB4MDAgMHgxNDE4CisJCQkJMHg5OSAweDE0MDQKKwkJCQkweDA0IDB4MTQwOAorCQkJCTB4ZDkgMHgxNDA0PjsKKworCXFjb20sZW11LWRjbS1yZXNldC1zZXEgPSA8MHg1IDB4MTQgICAgICAvKiAweDEgMHgxNCBmb3IgRTEuMiAqLworCQkJCTB4MTAwMDAwIDB4MjAKKwkJCQkweDAgMHgyMAorCQkJCTB4MWEwIDB4MjAgICAgLyogMHgyMjAgMHgyMCBmb3IgRTEuMiAqLworCQkJCTB4ODAgMHgyOD47Cit9OworCismdXNiX3FtcF9kcF9waHkgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismbWRzc19tZHAgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismc2RlX3JzY2MgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismbWRzc19yb3RhdG9yIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKKworJm1kc3NfZHNpMCB7CisJc3RhdHVzID0gImRpc2FibGVkIjsKK307CisKKyZtZHNzX2RzaTEgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OworCismbWRzc19kc2lfcGh5MCB7CisJc3RhdHVzID0gImRpc2FibGVkIjsKK307CisKKyZtZHNzX2RzaV9waHkxIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtc2RlLWRpc3BsYXkuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtc2RlLWRpc3BsYXkuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlkOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1zZGUtZGlzcGxheS5kdHNpCkBAIC0wLDAgKzEsNTk3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImRzaS1wYW5lbC1zaW0tdmlkZW8uZHRzaSIKKyNpbmNsdWRlICJkc2ktcGFuZWwtc2ltLWNtZC5kdHNpIgorI2luY2x1ZGUgImRzaS1wYW5lbC1zaW0tZHNjMzc1LWNtZC5kdHNpIgorI2luY2x1ZGUgImRzaS1wYW5lbC1zaW0tZHVhbG1pcGktdmlkZW8uZHRzaSIKKyNpbmNsdWRlICJkc2ktcGFuZWwtc2ltLWR1YWxtaXBpLWNtZC5kdHNpIgorI2luY2x1ZGUgImRzaS1wYW5lbC1zaW0tZHVhbG1pcGktZHNjMzc1LWNtZC5kdHNpIgorI2luY2x1ZGUgImRzaS1wYW5lbC1udDM1NTk3LXRydWx5LWR1YWxtaXBpLXdxeGdhLXZpZGVvLmR0c2kiCisjaW5jbHVkZSAiZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHVhbG1pcGktd3F4Z2EtY21kLmR0c2kiCisjaW5jbHVkZSAiZHNpLXBhbmVsLW50MzU1OTctdHJ1bHktZHNjLXdxeGdhLWNtZC5kdHNpIgorI2luY2x1ZGUgImRzaS1wYW5lbC1udDM1NTk3LXRydWx5LWRzYy13cXhnYS12aWRlby5kdHNpIgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL21kc3MtMTBubS1wbGwtY2xrLmg+CisKKyZzb2MgeworCWRzaV9wYW5lbF9wd3Jfc3VwcGx5OiBkc2lfcGFuZWxfcHdyX3N1cHBseSB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlxY29tLHBhbmVsLXN1cHBseS1lbnRyeUAwIHsKKwkJCXJlZyA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LW5hbWUgPSAidmRkaW8iOworCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8MTgwMDAwMD47CisJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwxODAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDYyMDAwPjsKKwkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDw4MD47CisJCQlxY29tLHN1cHBseS1wb3N0LW9uLXNsZWVwID0gPDIwPjsKKwkJfTsKKworCQlxY29tLHBhbmVsLXN1cHBseS1lbnRyeUAxIHsKKwkJCXJlZyA9IDwxPjsKKwkJCXFjb20sc3VwcGx5LW5hbWUgPSAibGFiIjsKKwkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDQ2MDAwMDA+OworCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8NjAwMDAwMD47CisJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwxMDAwMDA+OworCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDEwMD47CisJCX07CisKKwkJcWNvbSxwYW5lbC1zdXBwbHktZW50cnlAMiB7CisJCQlyZWcgPSA8Mj47CisJCQlxY29tLHN1cHBseS1uYW1lID0gImliYiI7CisJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDw0NjAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDYwMDAwMDA+OworCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MTAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwxMDA+OworCQkJcWNvbSxzdXBwbHktcG9zdC1vbi1zbGVlcCA9IDwyMD47CisJCX07CisJfTsKKworCWRzaV9wYW5lbF9wd3Jfc3VwcGx5X25vX2xhYmliYjogZHNpX3BhbmVsX3B3cl9zdXBwbHlfbm9fbGFiaWJiIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXFjb20scGFuZWwtc3VwcGx5LWVudHJ5QDAgeworCQkJcmVnID0gPDA+OworCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRpbyI7CisJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwxODAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDE4MDAwMDA+OworCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8NjIwMDA+OworCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDgwPjsKKwkJCXFjb20sc3VwcGx5LXBvc3Qtb24tc2xlZXAgPSA8MjA+OworCQl9OworCX07CisKKwlkc2lfcGFuZWxfcHdyX3N1cHBseV92ZGRfbm9fbGFiaWJiOiBkc2lfcGFuZWxfcHdyX3N1cHBseV92ZGRfbm9fbGFiaWJiIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXFjb20scGFuZWwtc3VwcGx5LWVudHJ5QDAgeworCQkJcmVnID0gPDA+OworCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRpbyI7CisJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwxODAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDE4MDAwMDA+OworCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8NjIwMDA+OworCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDgwPjsKKwkJCXFjb20sc3VwcGx5LXBvc3Qtb24tc2xlZXAgPSA8MjA+OworCQl9OworCisJCXFjb20scGFuZWwtc3VwcGx5LWVudHJ5QDEgeworCQkJcmVnID0gPDE+OworCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGQiOworCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8MzAwMDAwMD47CisJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwzMDAwMDAwPjsKKwkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDg1NzAwMD47CisJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCQlxY29tLHN1cHBseS1wb3N0LW9uLXNsZWVwID0gPDA+OworCQl9OworCX07CisKKwlkc2lfZHVhbF9udDM1NTk3X3RydWx5X3ZpZGVvX2Rpc3BsYXk6IHFjb20sZHNpLWRpc3BsYXlAMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkc2ktZGlzcGxheSI7CisJCWxhYmVsID0gImRzaV9kdWFsX250MzU1OTdfdHJ1bHlfdmlkZW9fZGlzcGxheSI7CisJCXFjb20sZGlzcGxheS10eXBlID0gInByaW1hcnkiOworCisJCXFjb20sZHNpLWN0cmwgPSA8Jm1kc3NfZHNpMCAmbWRzc19kc2kxPjsKKwkJcWNvbSxkc2ktcGh5ID0gPCZtZHNzX2RzaV9waHkwICZtZHNzX2RzaV9waHkxPjsKKwkJY2xvY2tzID0gPCZtZHNzX2RzaTBfcGxsIEJZVEVDTEtfTVVYXzBfQ0xLPiwKKwkJCTwmbWRzc19kc2kwX3BsbCBQQ0xLX01VWF8wX0NMSz47CisJCWNsb2NrLW5hbWVzID0gInNyY19ieXRlX2NsayIsICJzcmNfcGl4ZWxfY2xrIjsKKworCQlwaW5jdHJsLW5hbWVzID0gInBhbmVsX2FjdGl2ZSIsICJwYW5lbF9zdXNwZW5kIjsKKwkJcGluY3RybC0wID0gPCZzZGVfZHNpX2FjdGl2ZSAmc2RlX3RlX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmc2RlX2RzaV9zdXNwZW5kICZzZGVfdGVfc3VzcGVuZD47CisJCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKKwkJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNzYgMD47CisKKwkJcWNvbSxkc2ktcGFuZWwgPSA8JmRzaV9kdWFsX250MzU1OTdfdHJ1bHlfdmlkZW8+OworCQl2ZGRpby1zdXBwbHkgPSA8JnBtNjYwX2wxMT47CisJCWxhYi1zdXBwbHkgPSA8JmxjZGJfbGRvX3ZyZWc+OworCQlpYmItc3VwcGx5ID0gPCZsY2RiX25jcF92cmVnPjsKKwl9OworCisJZHNpX2R1YWxfbnQzNTU5N190cnVseV9jbWRfZGlzcGxheTogcWNvbSxkc2ktZGlzcGxheUAxIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1kaXNwbGF5IjsKKwkJbGFiZWwgPSAiZHNpX2R1YWxfbnQzNTU5N190cnVseV9jbWRfZGlzcGxheSI7CisJCXFjb20sZGlzcGxheS10eXBlID0gInByaW1hcnkiOworCisJCXFjb20sZHNpLWN0cmwgPSA8Jm1kc3NfZHNpMCAmbWRzc19kc2kxPjsKKwkJcWNvbSxkc2ktcGh5ID0gPCZtZHNzX2RzaV9waHkwICZtZHNzX2RzaV9waHkxPjsKKwkJY2xvY2tzID0gPCZtZHNzX2RzaTBfcGxsIEJZVEVDTEtfTVVYXzBfQ0xLPiwKKwkJCTwmbWRzc19kc2kwX3BsbCBQQ0xLX01VWF8wX0NMSz47CisJCWNsb2NrLW5hbWVzID0gInNyY19ieXRlX2NsayIsICJzcmNfcGl4ZWxfY2xrIjsKKworCQlwaW5jdHJsLW5hbWVzID0gInBhbmVsX2FjdGl2ZSIsICJwYW5lbF9zdXNwZW5kIjsKKwkJcGluY3RybC0wID0gPCZzZGVfZHNpX2FjdGl2ZSAmc2RlX3RlX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmc2RlX2RzaV9zdXNwZW5kICZzZGVfdGVfc3VzcGVuZD47CisJCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwkJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDc1IDA+OworCQlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA3NiAwPjsKKworCQlxY29tLGRzaS1wYW5lbCA9IDwmZHNpX2R1YWxfbnQzNTU5N190cnVseV9jbWQ+OworCQl2ZGRpby1zdXBwbHkgPSA8JnBtNjYwX2wxMT47CisJCWxhYi1zdXBwbHkgPSA8JmxjZGJfbGRvX3ZyZWc+OworCQlpYmItc3VwcGx5ID0gPCZsY2RiX25jcF92cmVnPjsKKwl9OworCisJZHNpX250MzU1OTdfdHJ1bHlfZHNjX2NtZF9kaXNwbGF5OiBxY29tLGRzaS1kaXNwbGF5QDIgeworCQljb21wYXRpYmxlID0gInFjb20sZHNpLWRpc3BsYXkiOworCQlsYWJlbCA9ICJkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkiOworCQlxY29tLGRpc3BsYXktdHlwZSA9ICJwcmltYXJ5IjsKKworCQlxY29tLGRzaS1jdHJsID0gPCZtZHNzX2RzaTE+OworCQlxY29tLGRzaS1waHkgPSA8Jm1kc3NfZHNpX3BoeTE+OworCQljbG9ja3MgPSA8Jm1kc3NfZHNpMV9wbGwgQllURUNMS19NVVhfMV9DTEs+LAorCQkJPCZtZHNzX2RzaTFfcGxsIFBDTEtfTVVYXzFfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAic3JjX2J5dGVfY2xrIiwgInNyY19waXhlbF9jbGsiOworCisJCXBpbmN0cmwtbmFtZXMgPSAicGFuZWxfYWN0aXZlIiwgInBhbmVsX3N1c3BlbmQiOworCQlwaW5jdHJsLTAgPSA8JnNkZV9kc2lfYWN0aXZlICZzZGVfdGVfYWN0aXZlPjsKKwkJcGluY3RybC0xID0gPCZzZGVfZHNpX3N1c3BlbmQgJnNkZV90ZV9zdXNwZW5kPjsKKwkJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworCQlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNzUgMD47CisJCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDc2IDA+OworCisJCXFjb20sZHNpLXBhbmVsID0gPCZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kPjsKKwkJdmRkaW8tc3VwcGx5ID0gPCZwbTY2MF9sMTE+OworCQlsYWItc3VwcGx5ID0gPCZsY2RiX2xkb192cmVnPjsKKwkJaWJiLXN1cHBseSA9IDwmbGNkYl9uY3BfdnJlZz47CisJfTsKKworCWRzaV9udDM1NTk3X3RydWx5X2RzY192aWRlb19kaXNwbGF5OiBxY29tLGRzaS1kaXNwbGF5QDMgeworCQljb21wYXRpYmxlID0gInFjb20sZHNpLWRpc3BsYXkiOworCQlsYWJlbCA9ICJkc2lfbnQzNTU5N190cnVseV9kc2NfdmlkZW9fZGlzcGxheSI7CisJCXFjb20sZGlzcGxheS10eXBlID0gInByaW1hcnkiOworCisJCXFjb20sZHNpLWN0cmwgPSA8Jm1kc3NfZHNpMT47CisJCXFjb20sZHNpLXBoeSA9IDwmbWRzc19kc2lfcGh5MT47CisJCWNsb2NrcyA9IDwmbWRzc19kc2kxX3BsbCBCWVRFQ0xLX01VWF8xX0NMSz4sCisJCQk8Jm1kc3NfZHNpMV9wbGwgUENMS19NVVhfMV9DTEs+OworCQljbG9jay1uYW1lcyA9ICJzcmNfYnl0ZV9jbGsiLCAic3JjX3BpeGVsX2NsayI7CisKKwkJcGluY3RybC1uYW1lcyA9ICJwYW5lbF9hY3RpdmUiLCAicGFuZWxfc3VzcGVuZCI7CisJCXBpbmN0cmwtMCA9IDwmc2RlX2RzaV9hY3RpdmUgJnNkZV90ZV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNkZV9kc2lfc3VzcGVuZCAmc2RlX3RlX3N1c3BlbmQ+OworCQlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA3NSAwPjsKKwkJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNzYgMD47CisKKwkJcWNvbSxkc2ktcGFuZWwgPSA8JmRzaV9udDM1NTk3X3RydWx5X2RzY192aWRlbz47CisJCXZkZGlvLXN1cHBseSA9IDwmcG02NjBfbDExPjsKKwkJbGFiLXN1cHBseSA9IDwmbGNkYl9sZG9fdnJlZz47CisJCWliYi1zdXBwbHkgPSA8JmxjZGJfbmNwX3ZyZWc+OworCX07CisKKwlkc2lfc2ltX3ZpZF9kaXNwbGF5OiBxY29tLGRzaS1kaXNwbGF5QDQgeworCQljb21wYXRpYmxlID0gInFjb20sZHNpLWRpc3BsYXkiOworCQlsYWJlbCA9ICJkc2lfc2ltX3ZpZF9kaXNwbGF5IjsKKwkJcWNvbSxkaXNwbGF5LXR5cGUgPSAicHJpbWFyeSI7CisKKwkJcWNvbSxkc2ktY3RybCA9IDwmbWRzc19kc2kwPjsKKwkJcWNvbSxkc2ktcGh5ID0gPCZtZHNzX2RzaV9waHkwPjsKKwkJY2xvY2tzID0gPCZtZHNzX2RzaTBfcGxsIEJZVEVDTEtfTVVYXzBfQ0xLPiwKKwkJCTwmbWRzc19kc2kwX3BsbCBQQ0xLX01VWF8wX0NMSz47CisJCWNsb2NrLW5hbWVzID0gInNyY19ieXRlX2NsayIsICJzcmNfcGl4ZWxfY2xrIjsKKworCQlwaW5jdHJsLW5hbWVzID0gInBhbmVsX2FjdGl2ZSIsICJwYW5lbF9zdXNwZW5kIjsKKwkJcGluY3RybC0wID0gPCZzZGVfZHNpX2FjdGl2ZSAmc2RlX3RlX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmc2RlX2RzaV9zdXNwZW5kICZzZGVfdGVfc3VzcGVuZD47CisKKwkJcWNvbSxkc2ktcGFuZWwgPSA8JmRzaV9zaW1fdmlkPjsKKwl9OworCisJZHNpX2R1YWxfc2ltX3ZpZF9kaXNwbGF5OiBxY29tLGRzaS1kaXNwbGF5QDUgeworCQljb21wYXRpYmxlID0gInFjb20sZHNpLWRpc3BsYXkiOworCQlsYWJlbCA9ICJkc2lfZHVhbF9zaW1fdmlkX2Rpc3BsYXkiOworCQlxY29tLGRpc3BsYXktdHlwZSA9ICJwcmltYXJ5IjsKKworCQlxY29tLGRzaS1jdHJsID0gPCZtZHNzX2RzaTAgJm1kc3NfZHNpMT47CisJCXFjb20sZHNpLXBoeSA9IDwmbWRzc19kc2lfcGh5MCAmbWRzc19kc2lfcGh5MT47CisJCWNsb2NrcyA9IDwmbWRzc19kc2kwX3BsbCBCWVRFQ0xLX01VWF8wX0NMSz4sCisJCQk8Jm1kc3NfZHNpMF9wbGwgUENMS19NVVhfMF9DTEs+OworCQljbG9jay1uYW1lcyA9ICJzcmNfYnl0ZV9jbGsiLCAic3JjX3BpeGVsX2NsayI7CisKKwkJcGluY3RybC1uYW1lcyA9ICJwYW5lbF9hY3RpdmUiLCAicGFuZWxfc3VzcGVuZCI7CisJCXBpbmN0cmwtMCA9IDwmc2RlX2RzaV9hY3RpdmUgJnNkZV90ZV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNkZV9kc2lfc3VzcGVuZCAmc2RlX3RlX3N1c3BlbmQ+OworCisJCXFjb20sZHNpLXBhbmVsID0gPCZkc2lfZHVhbF9zaW1fdmlkPjsKKwl9OworCisJZHNpX3NpbV9jbWRfZGlzcGxheTogcWNvbSxkc2ktZGlzcGxheUA2IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1kaXNwbGF5IjsKKwkJbGFiZWwgPSAiZHNpX3NpbV9jbWRfZGlzcGxheSI7CisJCXFjb20sZGlzcGxheS10eXBlID0gInByaW1hcnkiOworCisJCXFjb20sZHNpLWN0cmwgPSA8Jm1kc3NfZHNpMD47CisJCXFjb20sZHNpLXBoeSA9IDwmbWRzc19kc2lfcGh5MD47CisJCWNsb2NrcyA9IDwmbWRzc19kc2kwX3BsbCBCWVRFQ0xLX01VWF8wX0NMSz4sCisJCQk8Jm1kc3NfZHNpMF9wbGwgUENMS19NVVhfMF9DTEs+OworCQljbG9jay1uYW1lcyA9ICJzcmNfYnl0ZV9jbGsiLCAic3JjX3BpeGVsX2NsayI7CisKKwkJcGluY3RybC1uYW1lcyA9ICJwYW5lbF9hY3RpdmUiLCAicGFuZWxfc3VzcGVuZCI7CisJCXBpbmN0cmwtMCA9IDwmc2RlX2RzaV9hY3RpdmUgJnNkZV90ZV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNkZV9kc2lfc3VzcGVuZCAmc2RlX3RlX3N1c3BlbmQ+OworCisJCXFjb20sZHNpLXBhbmVsID0gPCZkc2lfc2ltX2NtZD47CisJfTsKKworCWRzaV9kdWFsX3NpbV9jbWRfZGlzcGxheTogcWNvbSxkc2ktZGlzcGxheUA3IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1kaXNwbGF5IjsKKwkJbGFiZWwgPSAiZHNpX2R1YWxfc2ltX2NtZF9kaXNwbGF5IjsKKwkJcWNvbSxkaXNwbGF5LXR5cGUgPSAicHJpbWFyeSI7CisKKwkJcWNvbSxkc2ktY3RybCA9IDwmbWRzc19kc2kwICZtZHNzX2RzaTE+OworCQlxY29tLGRzaS1waHkgPSA8Jm1kc3NfZHNpX3BoeTAgJm1kc3NfZHNpX3BoeTE+OworCQljbG9ja3MgPSA8Jm1kc3NfZHNpMF9wbGwgQllURUNMS19NVVhfMF9DTEs+LAorCQkJPCZtZHNzX2RzaTBfcGxsIFBDTEtfTVVYXzBfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAic3JjX2J5dGVfY2xrIiwgInNyY19waXhlbF9jbGsiOworCisJCXBpbmN0cmwtbmFtZXMgPSAicGFuZWxfYWN0aXZlIiwgInBhbmVsX3N1c3BlbmQiOworCQlwaW5jdHJsLTAgPSA8JnNkZV9kc2lfYWN0aXZlICZzZGVfdGVfYWN0aXZlPjsKKwkJcGluY3RybC0xID0gPCZzZGVfZHNpX3N1c3BlbmQgJnNkZV90ZV9zdXNwZW5kPjsKKworCQlxY29tLGRzaS1wYW5lbCA9IDwmZHNpX2R1YWxfc2ltX2NtZD47CisJfTsKKworCWRzaV9zaW1fZHNjXzM3NV9jbWRfZGlzcGxheTogcWNvbSxkc2ktZGlzcGxheUA4IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1kaXNwbGF5IjsKKwkJbGFiZWwgPSAiZHNpX3NpbV9kc2NfMzc1X2NtZF9kaXNwbGF5IjsKKwkJcWNvbSxkaXNwbGF5LXR5cGUgPSAicHJpbWFyeSI7CisKKwkJcWNvbSxkc2ktY3RybCA9IDwmbWRzc19kc2kwPjsKKwkJcWNvbSxkc2ktcGh5ID0gPCZtZHNzX2RzaV9waHkwPjsKKwkJY2xvY2tzID0gPCZtZHNzX2RzaTBfcGxsIEJZVEVDTEtfTVVYXzBfQ0xLPiwKKwkJCTwmbWRzc19kc2kwX3BsbCBQQ0xLX01VWF8wX0NMSz47CisJCWNsb2NrLW5hbWVzID0gInNyY19ieXRlX2NsayIsICJzcmNfcGl4ZWxfY2xrIjsKKworCQlwaW5jdHJsLW5hbWVzID0gInBhbmVsX2FjdGl2ZSIsICJwYW5lbF9zdXNwZW5kIjsKKwkJcGluY3RybC0wID0gPCZzZGVfZHNpX2FjdGl2ZSAmc2RlX3RlX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmc2RlX2RzaV9zdXNwZW5kICZzZGVfdGVfc3VzcGVuZD47CisKKwkJcWNvbSxkc2ktcGFuZWwgPSA8JmRzaV9zaW1fZHNjXzM3NV9jbWQ+OworCX07CisKKwlkc2lfZHVhbF9zaW1fZHNjXzM3NV9jbWRfZGlzcGxheTogcWNvbSxkc2ktZGlzcGxheUA5IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1kaXNwbGF5IjsKKwkJbGFiZWwgPSAiZHNpX2R1YWxfc2ltX2RzY18zNzVfY21kX2Rpc3BsYXkiOworCQlxY29tLGRpc3BsYXktdHlwZSA9ICJwcmltYXJ5IjsKKworCQlxY29tLGRzaS1jdHJsID0gPCZtZHNzX2RzaTAgJm1kc3NfZHNpMT47CisJCXFjb20sZHNpLXBoeSA9IDwmbWRzc19kc2lfcGh5MCAmbWRzc19kc2lfcGh5MT47CisJCWNsb2NrcyA9IDwmbWRzc19kc2kwX3BsbCBCWVRFQ0xLX01VWF8wX0NMSz4sCisJCQk8Jm1kc3NfZHNpMF9wbGwgUENMS19NVVhfMF9DTEs+OworCQljbG9jay1uYW1lcyA9ICJzcmNfYnl0ZV9jbGsiLCAic3JjX3BpeGVsX2NsayI7CisKKwkJcGluY3RybC1uYW1lcyA9ICJwYW5lbF9hY3RpdmUiLCAicGFuZWxfc3VzcGVuZCI7CisJCXBpbmN0cmwtMCA9IDwmc2RlX2RzaV9hY3RpdmUgJnNkZV90ZV9hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JnNkZV9kc2lfc3VzcGVuZCAmc2RlX3RlX3N1c3BlbmQ+OworCisJCXFjb20sZHNpLXBhbmVsID0gPCZkc2lfZHVhbF9zaW1fZHNjXzM3NV9jbWQ+OworCX07CisKKwlzZGVfd2I6IHFjb20sd2ItZGlzcGxheUAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdiLWRpc3BsYXkiOworCQljZWxsLWluZGV4ID0gPDA+OworCQlsYWJlbCA9ICJ3Yl9kaXNwbGF5IjsKKwl9OworCisJZXh0X2Rpc3A6IHFjb20sbXNtLWV4dC1kaXNwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1leHQtZGlzcCI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJZXh0X2Rpc3BfYXVkaW9fY29kZWM6IHFjb20sbXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiOworCQl9OworCX07CisKKwlzZGVfZHA6IHFjb20sZHBfZGlzcGxheUAweworCQljZWxsLWluZGV4ID0gPDA+OworCQljb21wYXRpYmxlID0gInFjb20sZHAtZGlzcGxheSI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisKKwkJZ2RzYy1zdXBwbHkgPSA8Jm1kc3NfY29yZV9nZHNjPjsKKwkJdmRkYS0xcDItc3VwcGx5ID0gPCZwbTY2MF9sMT47CisJCXZkZGEtMHA5LXN1cHBseSA9IDwmcG02NjBsX2wxPjsKKworCQlyZWcgPQk8MHhhZTkwMDAwIDB4YTg0PiwKKwkJCTwweDg4ZWFhMDAgMHgyMDA+LAorCQkJPDB4ODhlYTIwMCAweDIwMD4sCisJCQk8MHg4OGVhNjAwIDB4MjAwPiwKKwkJCTwweGFmMDIwMDAgMHgxYTA+LAorCQkJPDB4NzgwMDAwIDB4NjIxYz4sCisJCQk8MHg4OGVhMDMwIDB4MTA+LAorCQkJPDB4MGFlZTEwMDAgMHgwMzQ+OworCQlyZWctbmFtZXMgPSAiZHBfY3RybCIsICJkcF9waHkiLCAiZHBfbG5fdHgwIiwgImRwX2xuX3R4MSIsCisJCQkiZHBfbW1zc19jYyIsICJxZnByb21fcGh5c2ljYWwiLCAiZHBfcGxsIiwKKwkJCSJoZGNwX3BoeXNpY2FsIjsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtZHNzX21kcD47CisJCWludGVycnVwdHMgPSA8MTIgMD47CisKKwkJY2xvY2tzID0gIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9BVVhfQ0xLPiwKKwkJCSA8JmNsb2NrX3JwbWggUlBNSF9DWE9fQ0xLPiwKKwkJCSA8JmNsb2NrX2djYyBHQ0NfVVNCM19QUklNX0NMS1JFRl9DTEs+LAorCQkJIDwmY2xvY2tfZ2NjIEdDQ19VU0JfUEhZX0NGR19BSEIyUEhZX0NMSz4sCisJCQkgPCZjbG9ja19nY2MgR0NDX1VTQjNfUFJJTV9QSFlfUElQRV9DTEs+LAorCQkJIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9MSU5LX0NMSz4sCisJCQkgPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0RQX0xJTktfSU5URl9DTEs+LAorCQkJIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9QSVhFTF9DTEs+LAorCQkJIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9DUllQVE9fQ0xLPiwKKwkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfUElYRUxfQ0xLX1NSQz4sCisJCQkgPCZtZHNzX2RwX3BsbCBEUF9WQ09fRElWSURFRF9DTEtfU1JDX01VWD47CisJCWNsb2NrLW5hbWVzID0gImNvcmVfYXV4X2NsayIsICJjb3JlX3VzYl9yZWZfY2xrX3NyYyIsCisJCQkiY29yZV91c2JfcmVmX2NsayIsICJjb3JlX3VzYl9jZmdfYWhiX2NsayIsCisJCQkiY29yZV91c2JfcGlwZV9jbGsiLCAiY3RybF9saW5rX2NsayIsCisJCQkiY3RybF9saW5rX2lmYWNlX2NsayIsICJjdHJsX3BpeGVsX2NsayIsCisJCQkiY3J5cHRvX2NsayIsICJwaXhlbF9jbGtfcmNnIiwgInBpeGVsX3BhcmVudCI7CisKKwkJcWNvbSxkcC11c2JwZC1kZXRlY3Rpb24gPSA8JnBtNjYwX3BkcGh5PjsKKwkJcWNvbSxleHQtZGlzcCA9IDwmZXh0X2Rpc3A+OworCisJCXFjb20sYXV4LWNmZzAtc2V0dGluZ3MgPSBbMjAgMDBdOworCQlxY29tLGF1eC1jZmcxLXNldHRpbmdzID0gWzI0IDEzIDIzIDFkXTsKKwkJcWNvbSxhdXgtY2ZnMi1zZXR0aW5ncyA9IFsyOCAyNF07CisJCXFjb20sYXV4LWNmZzMtc2V0dGluZ3MgPSBbMmMgMDBdOworCQlxY29tLGF1eC1jZmc0LXNldHRpbmdzID0gWzMwIDBhXTsKKwkJcWNvbSxhdXgtY2ZnNS1zZXR0aW5ncyA9IFszNCAyNl07CisJCXFjb20sYXV4LWNmZzYtc2V0dGluZ3MgPSBbMzggMGFdOworCQlxY29tLGF1eC1jZmc3LXNldHRpbmdzID0gWzNjIDAzXTsKKwkJcWNvbSxhdXgtY2ZnOC1zZXR0aW5ncyA9IFs0MCBiYl07CisJCXFjb20sYXV4LWNmZzktc2V0dGluZ3MgPSBbNDQgMDNdOworCisJCXFjb20sbWF4LXBjbGstZnJlcXVlbmN5LWtoeiA9IDw2NzUwMDA+OworCisJCXFjb20sY29yZS1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlxY29tLGNvcmUtc3VwcGx5LWVudHJ5QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1uYW1lID0gImdkc2MiOworCQkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDA+OworCQkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDA+OworCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDA+OworCQkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwwPjsKKwkJCX07CisJCX07CisKKwkJcWNvbSxjdHJsLXN1cHBseS1lbnRyaWVzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXFjb20sY3RybC1zdXBwbHktZW50cnlAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXFjb20sc3VwcGx5LW5hbWUgPSAidmRkYS0xcDIiOworCQkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDEyMDAwMDA+OworCQkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDEyMDAwMDA+OworCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDIxODAwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8ND47CisJCQl9OworCQl9OworCisJCXFjb20scGh5LXN1cHBseS1lbnRyaWVzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXFjb20scGh5LXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRhLTBwOSI7CisJCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8ODgwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDw4ODAwMDA+OworCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDM2MDAwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MzI+OworCQkJfTsKKwkJfTsKKwl9OworfTsKKworJnNkZV9kcCB7CisJc3RhdHVzID0gImRpc2FibGVkIjsKKwlwaW5jdHJsLW5hbWVzID0gIm1kc3NfZHBfYWN0aXZlIiwgIm1kc3NfZHBfc2xlZXAiOworCXBpbmN0cmwtMCA9IDwmc2RlX2RwX2F1eF9hY3RpdmUgJnNkZV9kcF91c2JwbHVnX2NjX2FjdGl2ZT47CisJcGluY3RybC0xID0gPCZzZGVfZHBfYXV4X3N1c3BlbmQgJnNkZV9kcF91c2JwbHVnX2NjX3N1c3BlbmQ+OworCXFjb20sYXV4LWVuLWdwaW8gPSA8JnRsbW0gNTAgMD47CisJcWNvbSxhdXgtc2VsLWdwaW8gPSA8JnRsbW0gNDAgMD47CisJcWNvbSx1c2JwbHVnLWNjLWdwaW8gPSA8JnRsbW0gMzggMD47Cit9OworCismbWRzc19tZHAgeworCWNvbm5lY3RvcnMgPSA8JnNkZV9yc2NjICZzZGVfd2I+OworfTsKKworJmRzaV9kdWFsX250MzU1OTdfdHJ1bHlfdmlkZW8geworCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBEPjsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDJEPjsKKwlxY29tLG1kc3MtZHNpLWRpc3BsYXktdGltaW5ncyB7CisJCXRpbWluZ0AweworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxYyAwNyAwNyAyMyAyMSAwNworCQkJCTA3IDA1IDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwyIDAgMj4sCisJCQkJCQk8MSAwIDI+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCX07Cit9OworCismZHNpX2R1YWxfbnQzNTU5N190cnVseV9jbWQgeworCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBEPjsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDJEPjsKKwlxY29tLG1kc3MtZHNpLWRpc3BsYXktdGltaW5ncyB7CisJCXRpbWluZ0AweworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxYyAwNyAwNyAyMyAyMSAwNworCQkJCTA3IDA1IDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwyIDAgMj4sCisJCQkJCQk8MSAwIDI+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCX07Cit9OworCismZHNpX250MzU1OTdfdHJ1bHlfZHNjX2NtZCB7CisJcWNvbSxtZHNzLWRzaS10LWNsay1wb3N0ID0gPDB4MGI+OworCXFjb20sbWRzcy1kc2ktdC1jbGstcHJlID0gPDB4MjM+OworCXFjb20sbWRzcy1kc2ktZGlzcGxheS10aW1pbmdzIHsKKwkJdGltaW5nQDB7CisJCQlxY29tLG1kc3MtZHNpLXBhbmVsLXBoeS10aW1pbmdzID0gWzAwIDE1IDA1IDA1IDIwIDFmIDA1CisJCQkJMDUgMDMgMDMgMDQgMDBdOworCQkJcWNvbSxkaXNwbGF5LXRvcG9sb2d5ID0gPDEgMSAxPiwKKwkJCQkJCTwyIDIgMT4sIC8qIGRzYyBtZXJnZSAqLworCQkJCQkJPDIgMSAxPjsgLyogM2QgbXV4ICovCisJCQlxY29tLGRlZmF1bHQtdG9wb2xvZ3ktaW5kZXggPSA8MT47CisJCX07CisJfTsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfdmlkZW8geworCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBiPjsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDIzPjsKKwlxY29tLG1kc3MtZHNpLWRpc3BsYXktdGltaW5ncyB7CisJCXRpbWluZ0AweworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxNSAwNSAwNSAyMCAxZiAwNQorCQkJCTA0IDAzIDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwxIDEgMT4sCisJCQkJCQk8MiAyIDE+LCAvKiBkc2MgbWVyZ2UgKi8KKwkJCQkJCTwyIDEgMT47IC8qIDNkIG11eCAqLworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDE+OworCQl9OworCX07Cit9OworCismZHNpX3NpbV92aWQgeworCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBkPjsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDJkPjsKKwlxY29tLG1kc3MtZHNpLWRpc3BsYXktdGltaW5ncyB7CisJCXRpbWluZ0AweworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxYyAwNyAwNyAyMyAyMSAwNworCQkJCTA3IDA1IDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwxIDAgMT4sCisJCQkJCQk8MiAwIDE+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCX07Cit9OworCismZHNpX2R1YWxfc2ltX3ZpZCB7CisJcWNvbSxtZHNzLWRzaS10LWNsay1wb3N0ID0gPDB4MGQ+OworCXFjb20sbWRzcy1kc2ktdC1jbGstcHJlID0gPDB4MmQ+OworCXFjb20sbWRzcy1kc2ktZGlzcGxheS10aW1pbmdzIHsKKwkJdGltaW5nQDB7CisJCQlxY29tLG1kc3MtZHNpLXBhbmVsLXBoeS10aW1pbmdzID0gWzAwIDFjIDA3IDA3IDIzIDIxIDA3CisJCQkJMDcgMDUgMDMgMDQgMDBdOworCQkJcWNvbSxkaXNwbGF5LXRvcG9sb2d5ID0gPDIgMCAyPiwKKwkJCQkJCTwxIDAgMj47CisJCQlxY29tLGRlZmF1bHQtdG9wb2xvZ3ktaW5kZXggPSA8MD47CisJCX07CisJfTsKK307CisKKyZkc2lfc2ltX2NtZCB7CisJcWNvbSxtZHNzLWRzaS10LWNsay1wb3N0ID0gPDB4MGQ+OworCXFjb20sbWRzcy1kc2ktdC1jbGstcHJlID0gPDB4MmQ+OworCXFjb20sbWRzcy1kc2ktZGlzcGxheS10aW1pbmdzIHsKKwkJdGltaW5nQDB7CisJCQlxY29tLG1kc3MtZHNpLXBhbmVsLXBoeS10aW1pbmdzID0gWzAwIDFjIDA3IDA3IDIzIDIxIDA3CisJCQkJMDcgMDUgMDMgMDQgMDBdOworCQkJcWNvbSxkaXNwbGF5LXRvcG9sb2d5ID0gPDEgMCAxPiwKKwkJCQkJCTwyIDAgMT47CisJCQlxY29tLGRlZmF1bHQtdG9wb2xvZ3ktaW5kZXggPSA8MD47CisJCX07CisJfTsKK307CisKKyZkc2lfZHVhbF9zaW1fY21kIHsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXBvc3QgPSA8MHgwZD47CisJcWNvbSxtZHNzLWRzaS10LWNsay1wcmUgPSA8MHgyZD47CisJcWNvbSxtZHNzLWRzaS1kaXNwbGF5LXRpbWluZ3MgeworCQl0aW1pbmdAMHsKKwkJCXFjb20sbWRzcy1kc2ktcGFuZWwtcGh5LXRpbWluZ3MgPSBbMDAgMjQgMDkgMDkgMjYgMjQgMDkKKwkJCQkwOSAwNiAwMyAwNCAwMF07CisJCQlxY29tLGRpc3BsYXktdG9wb2xvZ3kgPSA8MiAwIDI+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCQl0aW1pbmdAMXsKKwkJCXFjb20sbWRzcy1kc2ktcGFuZWwtcGh5LXRpbWluZ3MgPSBbMDAgMWMgMDcgMDcgMjMgMjEgMDcKKwkJCQkwNyAwNSAwMyAwNCAwMF07CisJCQlxY29tLGRpc3BsYXktdG9wb2xvZ3kgPSA8MiAwIDI+LAorCQkJCQkJPDEgMCAyPjsKKwkJCXFjb20sZGVmYXVsdC10b3BvbG9neS1pbmRleCA9IDwwPjsKKwkJfTsKKwkJdGltaW5nQDJ7CisJCQlxY29tLG1kc3MtZHNpLXBhbmVsLXBoeS10aW1pbmdzID0gWzAwIDE4IDA2IDA2IDIxIDIwIDA2CisJCQkJMDYgMDQgMDMgMDQgMDBdOworCQkJcWNvbSxkaXNwbGF5LXRvcG9sb2d5ID0gPDIgMCAyPjsKKwkJCXFjb20sZGVmYXVsdC10b3BvbG9neS1pbmRleCA9IDwwPjsKKwkJfTsKKwl9OworfTsKKworJmRzaV9zaW1fZHNjXzM3NV9jbWQgeworCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBkPjsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDJkPjsKKwlxY29tLG1kc3MtZHNpLWRpc3BsYXktdGltaW5ncyB7CisJCXRpbWluZ0AwIHsgLyogMTA4MHAgKi8KKwkJCXFjb20sbWRzcy1kc2ktcGFuZWwtcGh5LXRpbWluZ3MgPSBbMDAgMUEgMDYgMDYgMjIgMjAgMDcKKwkJCQkwNyAwNCAwMyAwNCAwMF07CisJCQlxY29tLGRpc3BsYXktdG9wb2xvZ3kgPSA8MSAxIDE+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCQl0aW1pbmdAMSB7IC8qIHFoZCAqLworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxNSAwNSAwNSAyMCAxZiAwNQorCQkJCTA1IDAzIDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwxIDEgMT4sCisJCQkJCQk8MiAyIDE+LCAvKiBkc2MgbWVyZ2UgKi8KKwkJCQkJCTwyIDEgMT47IC8qIDNkIG11eCAqLworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCX07Cit9OworCismZHNpX2R1YWxfc2ltX2RzY18zNzVfY21kIHsKKwlxY29tLG1kc3MtZHNpLXQtY2xrLXBvc3QgPSA8MHgwZD47CisJcWNvbSxtZHNzLWRzaS10LWNsay1wcmUgPSA8MHgyZD47CisJcWNvbSxtZHNzLWRzaS1kaXNwbGF5LXRpbWluZ3MgeworCQl0aW1pbmdAMCB7IC8qIHFoZCAqLworCQkJcWNvbSxtZHNzLWRzaS1wYW5lbC1waHktdGltaW5ncyA9IFswMCAxYyAwNyAwNyAyMyAyMSAwNworCQkJCTA3IDA1IDAzIDA0IDAwXTsKKwkJCXFjb20sZGlzcGxheS10b3BvbG9neSA9IDwyIDIgMj47CisJCQlxY29tLGRlZmF1bHQtdG9wb2xvZ3ktaW5kZXggPSA8MD47CisJCX07CisJCXRpbWluZ0AxIHsgLyogNGsgKi8KKwkJCXFjb20sbWRzcy1kc2ktcGFuZWwtcGh5LXRpbWluZ3MgPSBbMDAgMTggMDYgMDYgMjEgMjAgMDYKKwkJCQkwNiAwNCAwMyAwNCAwMF07CisJCQlxY29tLGRpc3BsYXktdG9wb2xvZ3kgPSA8MiAyIDI+OworCQkJcWNvbSxkZWZhdWx0LXRvcG9sb2d5LWluZGV4ID0gPDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1zZGUtcGxsLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXNkZS1wbGwuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU1ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1zZGUtcGxsLmR0c2kKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCismc29jIHsKKwltZHNzX2RzaTBfcGxsOiBxY29tLG1kc3NfZHNpX3BsbEBhZTk0YTAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1kc3NfZHNpX3BsbF8xMG5tIjsKKwkJbGFiZWwgPSAiTURTUyBEU0kgMCBQTEwiOworCQljZWxsLWluZGV4ID0gPDA+OworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCXJlZyA9IDwweGFlOTRhMDAgMHgxZTA+LAorCQkgICAgICA8MHhhZTk0NDAwIDB4ODAwPiwKKwkJICAgICAgPDB4YWYwMzAwMCAweDg+OworCQlyZWctbmFtZXMgPSAicGxsX2Jhc2UiLCAicGh5X2Jhc2UiLCAiZ2RzY19iYXNlIjsKKwkJY2xvY2tzID0gPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0FIQl9DTEs+OworCQljbG9jay1uYW1lcyA9ICJpZmFjZV9jbGsiOworCQljbG9jay1yYXRlID0gPDA+OworCQlnZHNjLXN1cHBseSA9IDwmbWRzc19jb3JlX2dkc2M+OworCQlxY29tLHBsYXRmb3JtLXN1cHBseS1lbnRyaWVzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlxY29tLHBsYXRmb3JtLXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJnZHNjIjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCQl9OworCQl9OworCX07CisKKwltZHNzX2RzaTFfcGxsOiBxY29tLG1kc3NfZHNpX3BsbEBhZTk2YTAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1kc3NfZHNpX3BsbF8xMG5tIjsKKwkJbGFiZWwgPSAiTURTUyBEU0kgMSBQTEwiOworCQljZWxsLWluZGV4ID0gPDE+OworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCXJlZyA9IDwweGFlOTZhMDAgMHgxZTA+LAorCQkgICAgICA8MHhhZTk2NDAwIDB4ODAwPiwKKwkJICAgICAgPDB4YWYwMzAwMCAweDg+OworCQlyZWctbmFtZXMgPSAicGxsX2Jhc2UiLCAicGh5X2Jhc2UiLCAiZ2RzY19iYXNlIjsKKwkJY2xvY2tzID0gPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0FIQl9DTEs+OworCQljbG9jay1uYW1lcyA9ICJpZmFjZV9jbGsiOworCQljbG9jay1yYXRlID0gPDA+OworCQlnZHNjLXN1cHBseSA9IDwmbWRzc19jb3JlX2dkc2M+OworCQlxY29tLHBsYXRmb3JtLXN1cHBseS1lbnRyaWVzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQlxY29tLHBsYXRmb3JtLXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJnZHNjIjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCQl9OworCQl9OworCX07CisKKwltZHNzX2RwX3BsbDogcWNvbSxtZHNzX2RwX3BsbEA4OGVhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1kc3NfZHBfcGxsXzEwbm0iOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlsYWJlbCA9ICJNRFNTIERQIFBMTCI7CisJCWNlbGwtaW5kZXggPSA8MD47CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKworCQlyZWcgPSA8MHgwODhlYTAwMCAweDIwMD4sCisJCSAgICAgIDwweDA4OGVhYTAwIDB4MjAwPiwKKwkJICAgICAgPDB4MDg4ZWEyMDAgMHgyMDA+LAorCQkgICAgICA8MHgwODhlYTYwMCAweDIwMD4sCisJCSAgICAgIDwweGFmMDMwMDAgMHg4PjsKKwkJcmVnLW5hbWVzID0gInBsbF9iYXNlIiwgInBoeV9iYXNlIiwgImxuX3R4MF9iYXNlIiwKKwkJCSJsbl90eDFfYmFzZSIsICJnZHNjX2Jhc2UiOworCisJCWdkc2Mtc3VwcGx5ID0gPCZtZHNzX2NvcmVfZ2RzYz47CisKKwkJY2xvY2tzID0gPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0FIQl9DTEs+LAorCQkJIDwmY2xvY2tfcnBtaCBSUE1IX0NYT19DTEs+LAorCQkJIDwmY2xvY2tfZ2NjIEdDQ19VU0IzX1BSSU1fQ0xLUkVGX0NMSz4sCisJCQkgPCZjbG9ja19nY2MgR0NDX1VTQl9QSFlfQ0ZHX0FIQjJQSFlfQ0xLPiwKKwkJCSA8JmNsb2NrX2djYyBHQ0NfVVNCM19QUklNX1BIWV9QSVBFX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImlmYWNlX2NsayIsICJyZWZfY2xrX3NyYyIsICJyZWZfY2xrIiwKKwkJCSJjZmdfYWhiX2NsayIsICJwaXBlX2NsayI7CisJCWNsb2NrLXJhdGUgPSA8MD47CisKKwkJcWNvbSxwbGF0Zm9ybS1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlxY29tLHBsYXRmb3JtLXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJnZHNjIjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCQl9OworCisJCX07CisJfTsKKworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtc2RlLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXNkZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzBhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXNkZS5kdHNpCkBAIC0wLDAgKzEsNTMyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworJnNvYyB7CisJbWRzc19tZHA6IHFjb20sbWRzc19tZHBAYWUwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzZGUta21zIjsKKwkJcmVnID0gPDB4MGFlMDAwMDAgMHg4MWQ0MD4sCisJCSAgICAgIDwweDBhZWIwMDAwIDB4MjAwOD4sCisJCSAgICAgIDwweDBhZWFjMDAwIDB4ZjA+OworCQlyZWctbmFtZXMgPSAibWRwX3BoeXMiLAorCQkJInZiaWZfcGh5cyIsCisJCQkicmVnZG1hX3BoeXMiOworCisJCWNsb2NrcyA9CisJCQk8JmNsb2NrX2djYyBHQ0NfRElTUF9BSEJfQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19ESVNQX0FYSV9DTEs+LAorCQkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0FIQl9DTEs+LAorCQkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0FYSV9DTEs+LAorCQkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX01EUF9DTEs+LAorCQkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX1ZTWU5DX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImdjY19pZmFjZSIsICJnY2NfYnVzIiwgImlmYWNlX2NsayIsCisJCQkJImJ1c19jbGsiLCAiY29yZV9jbGsiLCAidnN5bmNfY2xrIjsKKwkJY2xvY2stcmF0ZSA9IDwwIDAgMCAwIDMwMDAwMDAwMCAxOTIwMDAwMCAwPjsKKwkJY2xvY2stbWF4LXJhdGUgPSA8MCAwIDAgMCA0MTI1MDAwMDAgMTkyMDAwMDAgMD47CisKKwkJc2RlLXZkZC1zdXBwbHkgPSA8Jm1kc3NfY29yZV9nZHNjPjsKKworCQkvKiBpbnRlcnJ1cHQgY29uZmlnICovCisJCWludGVycnVwdC1wYXJlbnQgPSA8JnBkYz47CisJCWludGVycnVwdHMgPSA8MCA4MyAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWlvbW11cyA9IDwmYXBwc19zbW11IDB4ODgwIDB4OD4sCisJCQk8JmFwcHNfc21tdSAweGM4MCAweDg+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkvKiBodyBibG9ja3MgKi8KKwkJcWNvbSxzZGUtb2ZmID0gPDB4MTAwMD47CisJCXFjb20sc2RlLWxlbiA9IDwweDQ1Qz47CisKKwkJcWNvbSxzZGUtY3RsLW9mZiA9IDwweDIwMDAgMHgyMjAwIDB4MjQwMAorCQkJCSAgICAgMHgyNjAwIDB4MjgwMD47CisJCXFjb20sc2RlLWN0bC1zaXplID0gPDB4RTQ+OworCisJCXFjb20sc2RlLW1peGVyLW9mZiA9IDwweDQ1MDAwIDB4NDYwMDAgMHg0NzAwMAorCQkJCSAgICAgIDB4NDgwMDAgMHg0OTAwMCAweDRhMDAwPjsKKwkJcWNvbSxzZGUtbWl4ZXItc2l6ZSA9IDwweDMyMD47CisKKwkJcWNvbSxzZGUtZHNwcC10b3Atb2ZmID0gPDB4MTMwMD47CisJCXFjb20sc2RlLWRzcHAtdG9wLXNpemUgPSA8MHhjPjsKKworCQlxY29tLHNkZS1kc3BwLW9mZiA9IDwweDU1MDAwIDB4NTcwMDA+OworCQlxY29tLHNkZS1kc3BwLXNpemUgPSA8MHgxN2UwPjsKKworCQlxY29tLHNkZS13Yi1vZmYgPSA8MHg2NjAwMD47CisJCXFjb20sc2RlLXdiLXNpemUgPSA8MHgyYzg+OworCQlxY29tLHNkZS13Yi14aW4taWQgPSA8Nj47CisJCXFjb20sc2RlLXdiLWlkID0gPDI+OworCQlxY29tLHNkZS13Yi1jbGstY3RybCA9IDwweDNiOCAyND47CisKKwkJcWNvbSxzZGUtaW50Zi1vZmYgPSA8MHg2YjAwMCAweDZiODAwCisJCQkJCTB4NmMwMDAgMHg2YzgwMD47CisJCXFjb20sc2RlLWludGYtc2l6ZSA9IDwweDI4MD47CisKKwkJcWNvbSxzZGUtaW50Zi10eXBlID0gImRwIiwgImRzaSIsICJkc2kiLCAiZHAiOworCQlxY29tLHNkZS1wcC1vZmYgPSA8MHg3MTAwMCAweDcxODAwCisJCQkJCSAgMHg3MjAwMCAweDcyODAwIDB4NzMwMDA+OworCQlxY29tLHNkZS1wcC1zbGF2ZSA9IDwweDAgMHgwIDB4MCAweDAgMHgxPjsKKwkJcWNvbSxzZGUtcHAtc2l6ZSA9IDwweGQ0PjsKKworCQlxY29tLHNkZS10ZTItb2ZmID0gPDB4MjAwMCAweDIwMDAgMHgwIDB4MCAweDA+OworCQlxY29tLHNkZS1jZG0tb2ZmID0gPDB4N2EyMDA+OworCQlxY29tLHNkZS1jZG0tc2l6ZSA9IDwweDIyND47CisKKwkJcWNvbSxzZGUtZHNjLW9mZiA9IDwweDgxMDAwIDB4ODE0MDA+OworCQlxY29tLHNkZS1kc2Mtc2l6ZSA9IDwweDE0MD47CisKKwkJcWNvbSxzZGUtZGl0aGVyLW9mZiA9IDwweDMwZTAgMHgzMGUwIDB4MzBlMCAweDMwZTAgMHgwPjsKKwkJcWNvbSxzZGUtZGl0aGVyLXZlcnNpb24gPSA8MHgwMDAxMDAwMD47CisJCXFjb20sc2RlLWRpdGhlci1zaXplID0gPDB4MjA+OworCisJCXFjb20sc2RlLXNzcHAtdHlwZSA9ICJ2aWciLCAidmlnIiwKKwkJCQkJImRtYSIsICJkbWEiLCAiZG1hIjsKKworCQlxY29tLHNkZS1zc3BwLW9mZiA9IDwweDUwMDAgMHg3MDAwIDB4MjUwMDAgMHgyNzAwMCAweDI5MDAwPjsKKwkJcWNvbSxzZGUtc3NwcC1zcmMtc2l6ZSA9IDwweDFjOD47CisKKwkJcWNvbSxzZGUtc3NwcC14aW4taWQgPSA8MCA0IDEgNSA5PjsKKwkJcWNvbSxzZGUtc3NwcC1leGNsLXJlY3QgPSA8MSAxIDEgMSAxPjsKKwkJcWNvbSxzZGUtc3NwcC1zbWFydC1kbWEtcHJpb3JpdHkgPSA8NCA1IDEgMiAzPjsKKwkJcWNvbSxzZGUtc21hcnQtZG1hLXJldiA9ICJzbWFydF9kbWFfdjIiOworCisJCXFjb20sc2RlLW1peGVyLXBhaXItbWFzayA9IDwyIDEgNiAwIDAgMz47CisKKwkJcWNvbSxzZGUtbWl4ZXItYmxlbmQtb3Atb2ZmID0gPDB4MjAgMHgzOCAweDUwIDB4NjggMHg4MCAweDk4CisJCQkJCQkweGIwIDB4YzggMHhlMCAweGY4IDB4MTEwPjsKKworCQkvKiBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byAibWRwX3BoeXMgKyBxY29tLHNkZS1vZmYgKi8KKwkJcWNvbSxzZGUtc3NwcC1jbGstY3RybCA9CisJCQkJPDB4MmFjIDA+LCA8MHgyYjQgMD4sCisJCQkJIDwweDJhYyA4PiwgPDB4MmI0IDg+LCA8MHgyYmMgOD47CisJCXFjb20sc2RlLXNzcHAtY3NjLW9mZiA9IDwweDFhMDA+OworCQlxY29tLHNkZS1jc2MtdHlwZSA9ICJjc2MtMTBiaXQiOworCQlxY29tLHNkZS1xc2VlZC10eXBlID0gInFzZWVkdjMiOworCQlxY29tLHNkZS1zc3BwLXFzZWVkLW9mZiA9IDwweGEwMD47CisJCXFjb20sc2RlLW1peGVyLWxpbmV3aWR0aCA9IDwyNTYwPjsKKwkJcWNvbSxzZGUtc3NwcC1saW5ld2lkdGggPSA8MjU2MD47CisJCXFjb20sc2RlLXdiLWxpbmV3aWR0aCA9IDw0MDk2PjsKKwkJcWNvbSxzZGUtbWl4ZXItYmxlbmRzdGFnZXMgPSA8MHhiPjsKKwkJcWNvbSxzZGUtaGlnaGVzdC1iYW5rLWJpdCA9IDwweDE+OworCQlxY29tLHNkZS11YndjLXZlcnNpb24gPSA8MHgyMDA+OworCQlxY29tLHNkZS1wYW5pYy1wZXItcGlwZTsKKwkJcWNvbSxzZGUtaGFzLWNkcDsKKwkJcWNvbSxzZGUtaGFzLXNyYy1zcGxpdDsKKwkJcWNvbSxzZGUtaGFzLWRpbS1sYXllcjsKKwkJcWNvbSxzZGUtaGFzLWlkbGUtcGM7CisJCXFjb20sc2RlLW1heC1idy1sb3cta2JwcyA9IDw5NjAwMDAwPjsKKwkJcWNvbSxzZGUtbWF4LWJ3LWhpZ2gta2JwcyA9IDw5NjAwMDAwPjsKKwkJcWNvbSxzZGUtZHJhbS1jaGFubmVscyA9IDwyPjsKKwkJcWNvbSxzZGUtbnVtLW5ydC1wYXRocyA9IDwwPjsKKwkJcWNvbSxzZGUtZHNwcC1hZC12ZXJzaW9uID0gPDB4MDAwNDAwMDA+OworCQlxY29tLHNkZS1kc3BwLWFkLW9mZiA9IDwweDI4MDAwIDB4MjcwMDA+OworCisJCXFjb20sc2RlLXZiaWYtb2ZmID0gPDA+OworCQlxY29tLHNkZS12YmlmLXNpemUgPSA8MHgxMDQwPjsKKwkJcWNvbSxzZGUtdmJpZi1pZCA9IDwwPjsKKwkJcWNvbSxzZGUtdmJpZi1tZW10eXBlLTAgPSA8MyAzIDMgMyAzIDMgMyAzPjsKKwkJcWNvbSxzZGUtdmJpZi1tZW10eXBlLTEgPSA8MyAzIDMgMyAzIDM+OworCisJCXFjb20sc2RlLXZiaWYtcW9zLXJ0LXJlbWFwID0gPDMgMyA0IDQgNSA1IDYgNj47CisJCXFjb20sc2RlLXZiaWYtcW9zLW5ydC1yZW1hcCA9IDwzIDMgMyAzIDMgMyAzIDM+OworCisJCXFjb20sc2RlLWRhbmdlci1sdXQgPSA8MHgwMDAwMDAwZiAweDAwMDBmZmZmIDB4MDAwMDAwMDAKKwkJCTB4MDAwMDAwMDA+OworCQlxY29tLHNkZS1zYWZlLWx1dCA9IDwweGZmZmMgMHhmZjAwIDB4ZmZmZiAweGZmZmY+OworCQlxY29tLHNkZS1xb3MtbHV0LWxpbmVhciA9CisJCQk8NCAweDAwMDAwMDAwIDB4MDAwMDAzNTc+LAorCQkJPDUgMHgwMDAwMDAwMCAweDAwMDAzMzU3PiwKKwkJCTw2IDB4MDAwMDAwMDAgMHgwMDAyMzM1Nz4sCisJCQk8NyAweDAwMDAwMDAwIDB4MDAyMjMzNTc+LAorCQkJPDggMHgwMDAwMDAwMCAweDAyMjIzMzU3PiwKKwkJCTw5IDB4MDAwMDAwMDAgMHgyMjIyMzM1Nz4sCisJCQk8MTAgMHgwMDAwMDAwMiAweDIyMjIzMzU3PiwKKwkJCTwxMSAweDAwMDAwMDIyIDB4MjIyMjMzNTc+LAorCQkJPDEyIDB4MDAwMDAyMjIgMHgyMjIyMzM1Nz4sCisJCQk8MTMgMHgwMDAwMjIyMiAweDIyMjIzMzU3PiwKKwkJCTwxNCAweDAwMDEyMjIyIDB4MjIyMjMzNTc+LAorCQkJPDAgMHgwMDExMjIyMiAweDIyMjIzMzU3PjsKKwkJcWNvbSxzZGUtcW9zLWx1dC1tYWNyb3RpbGUgPQorCQkJPDEwIDB4MDAwMDAwMDMgMHg0NDU1NjY3Nz4sCisJCQk8MTEgMHgwMDAwMDAzMyAweDQ0NTU2Njc3PiwKKwkJCTwxMiAweDAwMDAwMjMzIDB4NDQ1NTY2Nzc+LAorCQkJPDEzIDB4MDAwMDIyMzMgMHg0NDU1NjY3Nz4sCisJCQk8MTQgMHgwMDAxMjIzMyAweDQ0NTU2Njc3PiwKKwkJCTwwIDB4MDAxMTIyMzMgMHg0NDU1NjY3Nz47CisJCXFjb20sc2RlLXFvcy1sdXQtbnJ0ID0KKwkJCTwwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMD47CisJCXFjb20sc2RlLXFvcy1sdXQtY3diID0KKwkJCTwwIDB4NzUzMDAwMDAgMHgwMDAwMDAwMD47CisKKwkJcWNvbSxzZGUtY2RwLXNldHRpbmcgPSA8MSAxPiwgPDEgMD47CisKKwkJcWNvbSxzZGUtaW5saW5lLXJvdGF0b3IgPSA8Jm1kc3Nfcm90YXRvciAwPjsKKwkJcWNvbSxzZGUtaW5saW5lLXJvdC14aW4gPSA8MTAgMTE+OworCQlxY29tLHNkZS1pbmxpbmUtcm90LXhpbi10eXBlID0gInNzcHAiLCAid2IiOworCisJCS8qIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvICJtZHBfcGh5cyArIHFjb20sc2RlLW9mZiAqLworCQlxY29tLHNkZS1pbmxpbmUtcm90LWNsay1jdHJsID0gPDB4MmJjIDB4OD4sIDwweDJiYyAweGM+OworCisJCXFjb20sc2RlLXJlZy1kbWEtb2ZmID0gPDA+OworCQlxY29tLHNkZS1yZWctZG1hLXZlcnNpb24gPSA8MHgxPjsKKwkJcWNvbSxzZGUtcmVnLWRtYS10cmlnZ2VyLW9mZiA9IDwweDExOWM+OworCisJCXFjb20sc2RlLXNzcHAtdmlnLWJsb2NrcyB7CisJCQlxY29tLHNkZS12aWctY3NjLW9mZiA9IDwweDFhMDA+OworCQkJcWNvbSxzZGUtdmlnLXFzZWVkLW9mZiA9IDwweGEwMD47CisJCQlxY29tLHNkZS12aWctcXNlZWQtc2l6ZSA9IDwweGEwPjsKKwkJfTsKKworCQlxY29tLHNkZS1kc3BwLWJsb2NrcyB7CisJCQlxY29tLHNkZS1kc3BwLWlnYyA9IDwweDAgMHgwMDAzMDAwMT47CisJCQlxY29tLHNkZS1kc3BwLXZsdXQgPSA8MHhhMDAgMHgwMDAxMDAwOD47CisJCQlxY29tLHNkZS1kc3BwLWdhbXV0ID0gPDB4MTAwMCAweDAwMDQwMDAwPjsKKwkJCXFjb20sc2RlLWRzcHAtcGNjID0gPDB4MTcwMCAweDAwMDQwMDAwPjsKKwkJCXFjb20sc2RlLWRzcHAtZ2MgPSA8MHgxN2MwIDB4MDAwMTAwMDg+OworCQl9OworCisJCXFjb20scGxhdGZvcm0tc3VwcGx5LWVudHJpZXMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcWNvbSxwbGF0Zm9ybS1zdXBwbHktZW50cnlAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXFjb20sc3VwcGx5LW5hbWUgPSAic2RlLXZkZCI7CisJCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDA+OworCQkJfTsKKwkJfTsKKworCQlzbW11X3NkZV9zZWM6IHFjb20sc21tdV9zZGVfc2VjX2NiIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzbW11X3NkZV9zZWMiOworCQkJaW9tbXVzID0gPCZhcHBzX3NtbXUgMHg4ODEgMHg4PiwKKwkJCSAgICAgICA8JmFwcHNfc21tdSAweGM4MSAweDg+OworCQl9OworCisJCS8qIGRhdGEgYW5kIHJlZyBidXMgc2NhbGUgc2V0dGluZ3MgKi8KKwkJcWNvbSxzZGUtZGF0YS1idXMgeworCQkJcWNvbSxtc20tYnVzLG5hbWUgPSAibWRzc19zZGVfbW5vYyI7CisJCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDM+OworCQkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwyPjsKKwkJCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQorCQkJICAgIDwyMiA3NzMgMCAwPiwgPDIzIDc3MyAwIDA+LAorCQkJICAgIDwyMiA3NzMgMCA2NDAwMDAwPiwgPDIzIDc3MyAwIDY0MDAwMDA+LAorCQkJICAgIDwyMiA3NzMgMCA2NDAwMDAwPiwgPDIzIDc3MyAwIDY0MDAwMDA+OworCQl9OworCisJCXFjb20sc2RlLWxsY2MtYnVzIHsKKwkJCXFjb20sbXNtLWJ1cyxuYW1lID0gIm1kc3Nfc2RlX2xsY2MiOworCQkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDwzPjsKKwkJCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8MT47CisJCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCSAgICA8MTMyIDc3MCAwIDA+LAorCQkJICAgIDwxMzIgNzcwIDAgNjQwMDAwMD4sCisJCQkgICAgPDEzMiA3NzAgMCA2NDAwMDAwPjsKKwkJfTsKKworCQlxY29tLHNkZS1lYmktYnVzIHsKKwkJCXFjb20sbXNtLWJ1cyxuYW1lID0gIm1kc3Nfc2RlX2ViaSI7CisJCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDM+OworCQkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwxPjsKKwkJCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQorCQkJICAgIDwxMjkgNTEyIDAgMD4sCisJCQkgICAgPDEyOSA1MTIgMCA2NDAwMDAwPiwKKwkJCSAgICA8MTI5IDUxMiAwIDY0MDAwMDA+OworCQl9OworCisJCXFjb20sc2RlLXJlZy1idXMgeworCQkJcWNvbSxtc20tYnVzLG5hbWUgPSAibWRzc19yZWciOworCQkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDw0PjsKKwkJCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8MT47CisJCQlxY29tLG1zbS1idXMsYWN0aXZlLW9ubHk7CisJCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCQk8MSA1OTAgMCAwPiwKKwkJCQk8MSA1OTAgMCA3NjgwMD4sCisJCQkJPDEgNTkwIDAgMTUwMDAwPiwKKwkJCQk8MSA1OTAgMCAzMDAwMDA+OworCQl9OworCX07CisKKwlzZGVfcnNjYzogcWNvbSxzZGVfcnNjY0BhZjIwMDAwIHsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNkZS1yc2MiOworCQlyZWcgPSA8MHhhZjIwMDAwIDB4MWM0ND4sCisJCQk8MHhhZjMwMDAwIDB4M2ZkND47CisJCXJlZy1uYW1lcyA9ICJkcnYiLCAid3JhcHBlciI7CisJCXFjb20sc2RlLXJzYy12ZXJzaW9uID0gPDE+OworCisJCXZkZC1zdXBwbHkgPSA8Jm1kc3NfY29yZV9nZHNjPjsKKwkJY2xvY2tzID0gPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX1JTQ0NfVlNZTkNfQ0xLPiwKKwkJCTwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19SU0NDX0FIQl9DTEs+OworCQljbG9jay1uYW1lcyA9ICJ2c3luY19jbGsiLCAiaWZhY2VfY2xrIjsKKwkJY2xvY2stcmF0ZSA9IDwwIDA+OworCisJCXFjb20sc2RlLWRyYW0tY2hhbm5lbHMgPSA8Mj47CisKKwkJbWJveGVzID0gPCZkaXNwX3JzYyAwPjsKKwkJbWJveC1uYW1lcyA9ICJkaXNwX3JzYyI7CisKKwkJLyogZGF0YSBhbmQgcmVnIGJ1cyBzY2FsZSBzZXR0aW5ncyAqLworCQlxY29tLHNkZS1kYXRhLWJ1cyB7CisJCQlxY29tLG1zbS1idXMsbmFtZSA9ICJkaXNwX3JzY19tbm9jIjsKKwkJCXFjb20sbXNtLWJ1cyxhY3RpdmUtb25seTsKKwkJCXFjb20sbXNtLWJ1cyxudW0tY2FzZXMgPSA8Mz47CisJCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDI+OworCQkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9CisJCQkgICAgPDIwMDAzIDIwNTE1IDAgMD4sIDwyMDAwNCAyMDUxNSAwIDA+LAorCQkJICAgIDwyMDAwMyAyMDUxNSAwIDY0MDAwMDA+LCA8MjAwMDQgMjA1MTUgMCA2NDAwMDAwPiwKKwkJCSAgICA8MjAwMDMgMjA1MTUgMCA2NDAwMDAwPiwgPDIwMDA0IDIwNTE1IDAgNjQwMDAwMD47CisJCX07CisKKwkJcWNvbSxzZGUtbGxjYy1idXMgeworCQkJcWNvbSxtc20tYnVzLG5hbWUgPSAiZGlzcF9yc2NfbGxjYyI7CisJCQlxY29tLG1zbS1idXMsYWN0aXZlLW9ubHk7CisJCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDM+OworCQkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwxPjsKKwkJCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQorCQkJICAgIDwyMDAwMSAyMDUxMyAwIDA+LAorCQkJICAgIDwyMDAwMSAyMDUxMyAwIDY0MDAwMDA+LAorCQkJICAgIDwyMDAwMSAyMDUxMyAwIDY0MDAwMDA+OworCQl9OworCisJCXFjb20sc2RlLWViaS1idXMgeworCQkJcWNvbSxtc20tYnVzLG5hbWUgPSAiZGlzcF9yc2NfZWJpIjsKKwkJCXFjb20sbXNtLWJ1cyxhY3RpdmUtb25seTsKKwkJCXFjb20sbXNtLWJ1cyxudW0tY2FzZXMgPSA8Mz47CisJCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDE+OworCQkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9CisJCQkgICAgPDIwMDAwIDIwNTEyIDAgMD4sCisJCQkgICAgPDIwMDAwIDIwNTEyIDAgNjQwMDAwMD4sCisJCQkgICAgPDIwMDAwIDIwNTEyIDAgNjQwMDAwMD47CisJCX07CisJfTsKKworCW1kc3Nfcm90YXRvcjogcWNvbSxtZHNzX3JvdGF0b3JAYWUwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzZGVfcm90YXRvciI7CisJCXJlZyA9IDwweDBhZTAwMDAwIDB4YWMwMDA+LAorCQkgICAgICA8MHgwYWViODAwMCAweDMwMDA+OworCQlyZWctbmFtZXMgPSAibWRwX3BoeXMiLAorCQkJInJvdF92YmlmX3BoeXMiOworCisJCSNsaXN0LWNlbGxzID0gPDE+OworCisJCXFjb20sbWRzcy1yb3QtbW9kZSA9IDwxPjsKKwkJcWNvbSxtZHNzLWhpZ2hlc3QtYmFuay1iaXQgPSA8MHgxPjsKKworCQkvKiBCdXMgU2NhbGUgU2V0dGluZ3MgKi8KKwkJcWNvbSxtc20tYnVzLG5hbWUgPSAibWRzc19yb3RhdG9yIjsKKwkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDwzPjsKKwkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwxPjsKKwkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9CisJCQk8MjUgNTEyIDAgMD4sCisJCQk8MjUgNTEyIDAgNjQwMDAwMD4sCisJCQk8MjUgNTEyIDAgNjQwMDAwMD47CisKKwkJcm90LXZkZC1zdXBwbHkgPSA8Jm1kc3NfY29yZV9nZHNjPjsKKwkJcWNvbSxzdXBwbHktbmFtZXMgPSAicm90LXZkZCI7CisKKwkJY2xvY2tzID0KKwkJCTwmY2xvY2tfZ2NjIEdDQ19ESVNQX0FIQl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX0RJU1BfQVhJX0NMSz4sCisJCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfQUhCX0NMSz4sCisJCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfUk9UX0NMSz4sCisJCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfQVhJX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImdjY19pZmFjZSIsICJnY2NfYnVzIiwKKwkJCSJpZmFjZV9jbGsiLCAicm90X2NsayIsICJheGlfY2xrIjsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtZHNzX21kcD47CisJCWludGVycnVwdHMgPSA8MiAwPjsKKworCQkvKiBPZmZsaW5lIHJvdGF0b3IgUW9TIHNldHRpbmcgKi8KKwkJcWNvbSxtZHNzLXJvdC12YmlmLXFvcy1zZXR0aW5nID0gPDMgMyAzIDMgMyAzIDMgMz47CisJCXFjb20sbWRzcy1yb3QtdmJpZi1tZW10eXBlID0gPDMgMz47CisJCXFjb20sbWRzcy1yb3QtY2RwLXNldHRpbmcgPSA8MSAxPjsKKwkJcWNvbSxtZHNzLXJvdC1xb3MtbHV0ID0gPDB4MCAweDAgMHgwIDB4MD47CisJCXFjb20sbWRzcy1yb3QtZGFuZ2VyLWx1dCA9IDwweDAgMHgwPjsKKwkJcWNvbSxtZHNzLXJvdC1zYWZlLWx1dCA9IDwweDAwMDBmZmZmIDB4MDAwMGZmZmY+OworCisJCS8qIElubGluZSByb3RhdG9yIFFvUyBTZXR0aW5nICovCisJCS8qIHNldHRpbmcgZGVmYXVsdCByZWdpc3RlciB2YWx1ZXMgZm9yIFJEIC0gcW9zL2Rhbmdlci9zYWZlICovCisJCXFjb20sbWRzcy1pbmxpbmUtcm90LXFvcy1sdXQgPSA8MHg0NDU1NjY3NyAweDAwMTEyMjMzCisJCQkJCQkJMHg0NDU1NjY3NyAweDAwMTEyMjMzPjsKKwkJcWNvbSxtZHNzLWlubGluZS1yb3QtZGFuZ2VyLWx1dCA9IDwweDAwNTVhYWZmIDB4MDAwMGZmZmY+OworCQlxY29tLG1kc3MtaW5saW5lLXJvdC1zYWZlLWx1dCA9IDwweDAwMDBmMDAwIDB4MDAwMGZmMDA+OworCisJCXFjb20sbWRzcy1kZWZhdWx0LW90LXJkLWxpbWl0ID0gPDMyPjsKKwkJcWNvbSxtZHNzLWRlZmF1bHQtb3Qtd3ItbGltaXQgPSA8MzI+OworCisJCXFjb20sbWRzcy1zYnVmLWhlYWRyb29tID0gPDIwPjsKKworCQljYWNoZS1zbGljZS1uYW1lcyA9ICJyb3RhdG9yIjsKKwkJY2FjaGUtc2xpY2VzID0gPCZsbGNjIDQ+OworCisJCS8qIHJlZyBidXMgc2NhbGUgc2V0dGluZ3MgKi8KKwkJcm90X3JlZzogcWNvbSxyb3QtcmVnLWJ1cyB7CisJCQlxY29tLG1zbS1idXMsbmFtZSA9ICJtZHNzX3JvdF9yZWciOworCQkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDwyPjsKKwkJCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8MT47CisJCQlxY29tLG1zbS1idXMsYWN0aXZlLW9ubHk7CisJCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCQk8MSA1OTAgMCAwPiwKKwkJCQk8MSA1OTAgMCA3NjgwMD47CisJCX07CisKKwkJc21tdV9yb3RfdW5zZWM6IHFjb20sc21tdV9yb3RfdW5zZWNfY2IgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHNtbXVfc2RlX3JvdF91bnNlYyI7CisJCQlpb21tdXMgPSA8JmFwcHNfc21tdSAweDEwOTAgMHgwPjsKKwkJfTsKKworCQlzbW11X3JvdF9zZWM6IHFjb20sc21tdV9yb3Rfc2VjX2NiIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxzbW11X3NkZV9yb3Rfc2VjIjsKKwkJCWlvbW11cyA9IDwmYXBwc19zbW11IDB4MTA5MSAweDA+OworCQl9OworCX07CisKKwltZHNzX2RzaTA6IHFjb20sbWRzc19kc2lfY3RybDBAYWU5NDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkc2ktY3RybC1ody12Mi4yIjsKKwkJbGFiZWwgPSAiZHNpLWN0cmwtMCI7CisJCWNlbGwtaW5kZXggPSA8MD47CisJCXJlZyA9ICAgPDB4YWU5NDAwMCAweDQwMD4sCisJCQk8MHhhZjA4MDAwIDB4ND47CisJCXJlZy1uYW1lcyA9ICJkc2lfY3RybCIsICJkaXNwX2NjX2Jhc2UiOworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtZHNzX21kcD47CisJCWludGVycnVwdHMgPSA8NCAwPjsKKwkJdmRkYS0xcDItc3VwcGx5ID0gPCZwbTY2MF9sMT47CisJCWNsb2NrcyA9IDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19CWVRFMF9DTEs+LAorCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfQllURTBfQ0xLX1NSQz4sCisJCTwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19CWVRFMF9JTlRGX0NMSz4sCisJCTwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19QQ0xLMF9DTEs+LAorCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfUENMSzBfQ0xLX1NSQz4sCisJCTwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19FU0MwX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImJ5dGVfY2xrIiwgImJ5dGVfY2xrX3JjZyIsICJieXRlX2ludGZfY2xrIiwKKwkJCQkJInBpeGVsX2NsayIsICJwaXhlbF9jbGtfcmNnIiwKKwkJCQkJImVzY19jbGsiOworCisJCXFjb20sY3RybC1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlxY29tLGN0cmwtc3VwcGx5LWVudHJ5QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1uYW1lID0gInZkZGEtMXAyIjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwxMjAwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwxMjAwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwyMTgwMD47CisJCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDQ+OworCQkJfTsKKwkJfTsKKwl9OworCisJbWRzc19kc2kxOiBxY29tLG1kc3NfZHNpX2N0cmwxQGFlOTYwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZHNpLWN0cmwtaHctdjIuMiI7CisJCWxhYmVsID0gImRzaS1jdHJsLTEiOworCQljZWxsLWluZGV4ID0gPDE+OworCQlyZWcgPSAgIDwweGFlOTYwMDAgMHg0MDA+LAorCQkJPDB4YWYwODAwMCAweDQ+OworCQlyZWctbmFtZXMgPSAiZHNpX2N0cmwiLCAiZGlzcF9jY19iYXNlIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbWRzc19tZHA+OworCQlpbnRlcnJ1cHRzID0gPDUgMD47CisJCXZkZGEtMXAyLXN1cHBseSA9IDwmcG02NjBfbDE+OworCQljbG9ja3MgPSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfQllURTFfQ0xLPiwKKwkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0JZVEUxX0NMS19TUkM+LAorCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfQllURTFfSU5URl9DTEs+LAorCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfUENMSzFfQ0xLPiwKKwkJPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX1BDTEsxX0NMS19TUkM+LAorCQk8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRVNDMV9DTEs+OworCQljbG9jay1uYW1lcyA9ICJieXRlX2NsayIsICJieXRlX2Nsa19yY2ciLCAiYnl0ZV9pbnRmX2NsayIsCisJCQkJInBpeGVsX2NsayIsICJwaXhlbF9jbGtfcmNnIiwgImVzY19jbGsiOworCQlxY29tLGN0cmwtc3VwcGx5LWVudHJpZXMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcWNvbSxjdHJsLXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRhLTFwMiI7CisJCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8MTIwMDAwMD47CisJCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8MTIwMDAwMD47CisJCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MjE4MDA+OworCQkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDw0PjsKKwkJCX07CisJCX07CisJfTsKKworCW1kc3NfZHNpX3BoeTA6IHFjb20sbWRzc19kc2lfcGh5MEBhZTk0NDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRzaS1waHktdjMuMCI7CisJCWxhYmVsID0gImRzaS1waHktMCI7CisJCWNlbGwtaW5kZXggPSA8MD47CisJCXJlZyA9IDwweGFlOTQ0MDAgMHg3YzA+OworCQlyZWctbmFtZXMgPSAiZHNpX3BoeSI7CisJCWdkc2Mtc3VwcGx5ID0gPCZtZHNzX2NvcmVfZ2RzYz47CisJCXZkZGEtMHA5LXN1cHBseSA9IDwmcG02NjBsX2wxPjsKKwkJcWNvbSxwbGF0Zm9ybS1zdHJlbmd0aC1jdHJsID0gWzU1IDAzCisJCQkJCQk1NSAwMworCQkJCQkJNTUgMDMKKwkJCQkJCTU1IDAzCisJCQkJCQk1NSAwMF07CisJCXFjb20scGxhdGZvcm0tbGFuZS1jb25maWcgPSBbMDAgMDAgMDAgMDAKKwkJCQkJCTAwIDAwIDAwIDAwCisJCQkJCQkwMCAwMCAwMCAwMAorCQkJCQkJMDAgMDAgMDAgMDAKKwkJCQkJCTAwIDAwIDAwIDgwXTsKKwkJcWNvbSxwbGF0Zm9ybS1yZWd1bGF0b3Itc2V0dGluZ3MgPSBbMWQgMWQgMWQgMWQgMWRdOworCQlxY29tLHBoeS1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJcWNvbSxwaHktc3VwcGx5LWVudHJ5QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1uYW1lID0gInZkZGEtMHA5IjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDw4ODAwMDA+OworCQkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDg4MDAwMD47CisJCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MzYwMDA+OworCQkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwzMj47CisJCQl9OworCQl9OworCX07CisKKwltZHNzX2RzaV9waHkxOiBxY29tLG1kc3NfZHNpX3BoeTBAYWU5NjQwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkc2ktcGh5LXYzLjAiOworCQlsYWJlbCA9ICJkc2ktcGh5LTEiOworCQljZWxsLWluZGV4ID0gPDE+OworCQlyZWcgPSA8MHhhZTk2NDAwIDB4N2MwPjsKKwkJcmVnLW5hbWVzID0gImRzaV9waHkiOworCQlnZHNjLXN1cHBseSA9IDwmbWRzc19jb3JlX2dkc2M+OworCQl2ZGRhLTBwOS1zdXBwbHkgPSA8JnBtNjYwbF9sMT47CisJCXFjb20scGxhdGZvcm0tc3RyZW5ndGgtY3RybCA9IFs1NSAwMworCQkJCQkJNTUgMDMKKwkJCQkJCTU1IDAzCisJCQkJCQk1NSAwMworCQkJCQkJNTUgMDBdOworCQlxY29tLHBsYXRmb3JtLXJlZ3VsYXRvci1zZXR0aW5ncyA9IFsxZCAxZCAxZCAxZCAxZF07CisJCXFjb20scGxhdGZvcm0tbGFuZS1jb25maWcgPSBbMDAgMDAgMDAgMDAKKwkJCQkJCTAwIDAwIDAwIDAwCisJCQkJCQkwMCAwMCAwMCAwMAorCQkJCQkJMDAgMDAgMDAgMDAKKwkJCQkJCTAwIDAwIDAwIDgwXTsKKwkJcWNvbSxwaHktc3VwcGx5LWVudHJpZXMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCXFjb20scGh5LXN1cHBseS1lbnRyeUAwIHsKKwkJCQlyZWcgPSA8MD47CisJCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRhLTBwOSI7CisJCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8ODgwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDw4ODAwMDA+OworCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDM2MDAwPjsKKwkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MzI+OworCQkJfTsKKwkJfTsKKwl9OworCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1zdHViLXJlZ3VsYXRvci5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC1zdHViLXJlZ3VsYXRvci5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZGM0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXN0dWItcmVndWxhdG9yLmR0c2kKQEAgLTAsMCArMSwzNDIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SICBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZWd1bGF0b3IvcWNvbSxycG1oLXJlZ3VsYXRvci5oPgorCisvKiBTdHViIHJlZ3VsYXRvcnMgKi8KKworLyB7CisJcG02NjBfczQ6IHJlZ3VsYXRvci1wbTY2MC1zNCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX3M0IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjA0MDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDIwNDAwMDA+OworCX07CisKKwkvKiBwbTY2MCBTNSAtIFZERF9NT0RFTSBzdXBwbHkgKi8KKwlwbTY2MF9zNV9sZXZlbDogcmVndWxhdG9yLXBtNjYwLXM1IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfczVfbGV2ZWwiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwlwbTY2MF9zNjogcmVndWxhdG9yLXBtNjYwLXM2IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfczYiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMzUyMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTM1MjAwMD47CisJfTsKKworCS8qIHBtNjYwbCBTMSAtIFZERF9NWCBzdXBwbHkgKi8KKwlwbTY2MGxfczFfbGV2ZWw6IHJlZ3VsYXRvci1wbTY2MGwtczEgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfczFfbGV2ZWwiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwlwbTY2MGxfczFfZmxvb3JfbGV2ZWw6IHJlZ3VsYXRvci1wbTY2MGwtczEtZmxvb3ItbGV2ZWwgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfczFfZmxvb3JfbGV2ZWwiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwlwbTY2MGxfczFfbGV2ZWxfYW86IHJlZ3VsYXRvci1wbTY2MGwtczEtbGV2ZWwtYW8geworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfczFfbGV2ZWxfYW8iOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwkvKiBwbTY2MGwgUzIgLSBWRERfR0ZYIHN1cHBseSAqLworCXBtNjYwbF9zMl9sZXZlbDogcmVndWxhdG9yLXBtNjYwbC1zMiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwbF9zMl9sZXZlbCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX09GRj47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX01BWD47CisJfTsKKworCS8qIHBtNjYwbCBTMyArIFM0IC0gVkREX0NYIHN1cHBseSAqLworCXBtNjYwbF9zM19sZXZlbDogcmVndWxhdG9yLXBtNjYwbC1zMy1sZXZlbCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwbF9zM19sZXZlbCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX09GRj47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX01BWD47CisJfTsKKworCXBtNjYwbF9zM19mbG9vcl9sZXZlbDogcmVndWxhdG9yLXBtNjYwbC1zMy1mbG9vci1sZXZlbCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwbF9zM19mbG9vcl9sZXZlbCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX09GRj47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX01BWD47CisJfTsKKworCXBtNjYwbF9zM19sZXZlbF9hbzogcmVndWxhdG9yLXBtNjYwbC1zMy1sZXZlbC1hbyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX3MzX2xldmVsX2FvIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfT0ZGPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfTUFYPjsKKwl9OworCisJcG02NjBfbDE6IHJlZ3VsYXRvci1wbTY2MC1sMSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2wxIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMjAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTI1MDAwMD47CisJfTsKKworCXBtNjYwX2wyOiByZWd1bGF0b3ItcG02NjAtbDIgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MF9sMiI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTAwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEwMDAwMDA+OworCX07CisKKwlwbTY2MF9sMzogcmVndWxhdG9yLXBtNjYwLWwzIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDMiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMDAwMDAwPjsKKwl9OworCisJcG02NjBfbDU6IHJlZ3VsYXRvci1wbTY2MC1sNSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2w1IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCX07CisKKwlwbTY2MF9sNjogcmVndWxhdG9yLXBtNjYwLWw2IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDYiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEzMDQwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMzA0MDAwPjsKKwl9OworCisJcG02NjBfbDc6IHJlZ3VsYXRvci1wbTY2MC1sNyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2w3IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMjAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTIwMDAwMD47CisJfTsKKworCXBtNjYwX2w4OiByZWd1bGF0b3ItcG02NjAtbDggeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MF9sOCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4MDAwMDA+OworCX07CisKKwlwbTY2MF9sOTogcmVndWxhdG9yLXBtNjYwLWw5IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDkiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwl9OworCisJcG02NjBfbDEwOiByZWd1bGF0b3ItcG02NjAtbDEwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDEwIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJfTsKKworCXBtNjYwX2wxMTogcmVndWxhdG9yLXBtNjYwLWwxMSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2wxMSI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4MDAwMDA+OworCX07CisKKwlwbTY2MF9sMTI6IHJlZ3VsYXRvci1wbTY2MC1sMTIgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MF9sMTIiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwl9OworCisJcG02NjBfbDEzOiByZWd1bGF0b3ItcG02NjAtbDEzIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDEzIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJfTsKKworCXBtNjYwX2wxNDogcmVndWxhdG9yLXBtNjYwLWwxNCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2wxNCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4MDAwMDA+OworCX07CisKKwlwbTY2MF9sMTU6IHJlZ3VsYXRvci1wbTY2MC1sMTUgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MF9sMTUiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwyOTUwMDAwPjsKKwl9OworCisJcG02NjBfbDE2OiByZWd1bGF0b3ItcG02NjAtbDE2IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBfbDE2IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwyNzAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjcwMDAwMD47CisJfTsKKworCXBtNjYwX2wxNzogcmVndWxhdG9yLXBtNjYwLWwxNyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwX2wxNyI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI5NTAwMDA+OworCX07CisKKwlwbTY2MF9sMTk6IHJlZ3VsYXRvci1wbTY2MC1sMTkgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MF9sMTkiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDMzMTIwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzEyMDAwPjsKKwl9OworCisJcG02NjBsX2wxOiByZWd1bGF0b3ItcG02NjBsLWwxIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBsX2wxIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4ODAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDw5MDAwMDA+OworCX07CisKKwlwbTY2MGxfbDI6IHJlZ3VsYXRvci1wbTY2MGwtbDIgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDIiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDw1MDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI5NjAwMDA+OworCX07CisKKwlwbTY2MGxfbDM6IHJlZ3VsYXRvci1wbTY2MGwtbDMgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDMiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDI4NTAwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMDA4MDAwPjsKKwl9OworCisJcG02NjBsX2w0OiByZWd1bGF0b3ItcG02NjBsLWw0IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBsX2w0IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwyOTYwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8Mjk2MDAwMD47CisJfTsKKworCXBtNjYwbF9sNTogcmVndWxhdG9yLXBtNjYwbC1sNSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwbF9sNSI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8Mjk2MDAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI5NjAwMDA+OworCX07CisKKwlwbTY2MGxfbDY6IHJlZ3VsYXRvci1wbTY2MGwtbDYgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDYiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDw1MDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MzAwODAwMD47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMzMDAwMDA+OworCX07CisKKwlwbTY2MGxfbDc6IHJlZ3VsYXRvci1wbTY2MGwtbDcgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDciOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDMwODgwMDA+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMTAwMDAwPjsKKwl9OworCisJcG02NjBsX2w4OiByZWd1bGF0b3ItcG02NjBsLWw4IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBsX2w4IjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMxMjAwMD47CisJfTsKKworCS8qIHBtNjYwbCBMOSA9IFZERF9MUElfQ1ggc3VwcGx5ICovCisJcG02NjBsX2w5X2xldmVsOiByZWd1bGF0b3ItcG02NjBsLWw5LWxldmVsIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBsX2w5X2xldmVsIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwlwbTY2MGxfbDlfZmxvb3JfbGV2ZWw6IHJlZ3VsYXRvci1wbTY2MGwtbDktZmxvb3ItbGV2ZWwgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDlfZmxvb3JfbGV2ZWwiOworCQlxY29tLGhwbS1taW4tbG9hZCA9IDwxMDAwMD47CisJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX09GRj47CisJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPFJQTUhfUkVHVUxBVE9SX0xFVkVMX01BWD47CisJfTsKKworCS8qIHBtNjYwbCBMMTAgPSBWRERfTFBJX01YIHN1cHBseSAqLworCXBtNjYwbF9sMTBfbGV2ZWw6IHJlZ3VsYXRvci1wbTY2MGwtbDEwLWxldmVsIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHN0dWItcmVndWxhdG9yIjsKKwkJcmVndWxhdG9yLW5hbWUgPSAicG02NjBsX2wxMF9sZXZlbCI7CisJCXFjb20saHBtLW1pbi1sb2FkID0gPDEwMDAwPjsKKwkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfT0ZGPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8UlBNSF9SRUdVTEFUT1JfTEVWRUxfTUFYPjsKKwl9OworCisJcG02NjBsX2wxMF9mbG9vcl9sZXZlbDogcmVndWxhdG9yLXBtNjYwbC1sMTAtZmxvb3ItbGV2ZWwgeworCQljb21wYXRpYmxlID0gInFjb20sc3R1Yi1yZWd1bGF0b3IiOworCQlyZWd1bGF0b3ItbmFtZSA9ICJwbTY2MGxfbDEwX2Zsb29yX2xldmVsIjsKKwkJcWNvbSxocG0tbWluLWxvYWQgPSA8MTAwMDA+OworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9PRkY+OworCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVg+OworCX07CisKKwlwbTY2MGxfYm9iOiByZWd1bGF0b3ItcG02NjBsLWJvYiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzdHViLXJlZ3VsYXRvciI7CisJCXJlZ3VsYXRvci1uYW1lID0gInBtNjYwbF9ib2IiOworCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMzEyMDAwPjsKKwkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMxMjAwMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXRoZXJtYWwuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdGhlcm1hbC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTkzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXRoZXJtYWwuZHRzaQpAQCAtMCwwICsxLDE1MDcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLmg+CisKKyZjbG9ja19jcHVjYyB7CisJbG1oX2RjdnMwOiBxY29tLGxpbWl0cy1kY3ZzQDAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLWh3LWxpbWl0cyI7CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAzMiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJcWNvbSxhZmZpbml0eSA9IDwwPjsKKwkJI3RoZXJtYWwtc2Vuc29yLWNlbGxzID0gPDA+OworCX07CisKKwlsbWhfZGN2czE6IHFjb20sbGltaXRzLWRjdnNAMSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taHctbGltaXRzIjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDMzIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlxY29tLGFmZmluaXR5ID0gPDE+OworCQkjdGhlcm1hbC1zZW5zb3ItY2VsbHMgPSA8MD47CisJfTsKK307CisKKyZzb2MgeworCXFtaS10bWQtZGV2aWNlcyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxxbWlfY29vbGluZ19kZXZpY2VzIjsKKworCQltb2RlbSB7CisJCQlxY29tLGluc3RhbmNlLWlkID0gPDB4MD47CisKKwkJCW1vZGVtX3BhOiBtb2RlbV9wYSB7CisJCQkJcWNvbSxxbWktZGV2LW5hbWUgPSAicGEiOworCQkJCSNjb29saW5nLWNlbGxzID0gPDI+OworCQkJfTsKKworCQkJbW9kZW1fcHJvYzogbW9kZW1fcHJvYyB7CisJCQkJcWNvbSxxbWktZGV2LW5hbWUgPSAibW9kZW0iOworCQkJCSNjb29saW5nLWNlbGxzID0gPDI+OworCQkJfTsKKworCQkJbW9kZW1fY3VycmVudDogbW9kZW1fY3VycmVudCB7CisJCQkJcWNvbSxxbWktZGV2LW5hbWUgPSAibW9kZW1fY3VycmVudCI7CisJCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CisJCQl9OworCisJCQltb2RlbV92ZGQ6IG1vZGVtX3ZkZCB7CisJCQkJcWNvbSxxbWktZGV2LW5hbWUgPSAiY3B1dl9yZXN0cmljdGlvbl9jb2xkIjsKKwkJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKKwkJCX07CisJCX07CisKKwkJYWRzcCB7CisJCQlxY29tLGluc3RhbmNlLWlkID0gPDB4MT47CisKKwkJCWFkc3BfdmRkOiBhZHNwX3ZkZCB7CisJCQkJcWNvbSxxbWktZGV2LW5hbWUgPSAiY3B1dl9yZXN0cmljdGlvbl9jb2xkIjsKKwkJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKKwkJCX07CisJCX07CisKKwkJY2RzcCB7CisJCQlxY29tLGluc3RhbmNlLWlkID0gPDB4NDM+OworCisJCQljZHNwX3ZkZDogY2RzcF92ZGQgeworCQkJCXFjb20scW1pLWRldi1uYW1lID0gImNwdXZfcmVzdHJpY3Rpb25fY29sZCI7CisJCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CisJCQl9OworCQl9OworCX07Cit9OworCismdGhlcm1hbF96b25lcyB7CisJYW9zczAtdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAwPjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1MC1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAxPjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1MS1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAyPjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1Mi1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAzPjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1My1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA0PjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1NC1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA1PjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1NS1zaWx2ZXItdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA2PjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJa3J5by1sMy0wLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgNz47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWtyeW8tbDMtMS11c3IgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDg+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwljcHUwLWdvbGQtdXNyIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA5PjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZzAgeworCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1MS1nb2xkLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMTA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlncHUwLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMTE+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlncHUxLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMTI+OworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlhb3NzMS11c3IgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwltZG0tZHNwLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgMT47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWRkci11c3IgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDI+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwl3bGFuLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgMz47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWNvbXB1dGUtaHZ4LXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgND47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWNhbWVyYS11c3IgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDU+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0cmlwcyB7CisJCQlhY3RpdmUtY29uZmlnMCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwltbXNzLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgNj47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCW1kbS1jb3JlLXVzciB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgNz47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7CisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCWdwdS12aXJ0LW1heC1zdGVwIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDEwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwxMDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInN0ZXBfd2lzZSI7CisJCXRyaXBzIHsKKwkJCWdwdV90cmlwMDogZ3B1LXRyaXAwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw5NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDwwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWdwdV9jZGV2MCB7CisJCQkJdHJpcCA9IDwmZ3B1X3RyaXAwPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmbXNtX2dwdSBUSEVSTUFMX05PX0xJTUlUCisJCQkJCQlUSEVSTUFMX05PX0xJTUlUPjsKKwkJCX07CisJCX07CisJfTsKKworCWhleGEtc2lsdi1tYXgtc3RlcCB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJzdGVwX3dpc2UiOworCQl0cmlwcyB7CisJCQlzaWx2ZXItdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8MTIwMDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlkdWFsLWdvbGQtbWF4LXN0ZXAgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAic3RlcF93aXNlIjsKKwkJdHJpcHMgeworCQkJZ29sZC10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDwxMjAwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJfTsKKworCXBvcC1tZW0tc3RlcCB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwxMD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDI+OworCQl0aGVybWFsLWdvdmVybm9yID0gInN0ZXBfd2lzZSI7CisJCXRyaXBzIHsKKwkJCXBvcF90cmlwOiBwb3AtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8OTUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQlwb3BfY2RldjYgeworCQkJCXRyaXAgPSA8JnBvcF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9CisJCQkJCTwmQ1BVNiBUSEVSTUFMX05PX0xJTUlUCisJCQkJCQkoVEhFUk1BTF9NQVhfTElNSVQtMSk+OworCQkJfTsKKwkJCXBvcF9jZGV2NyB7CisJCQkJdHJpcCA9IDwmcG9wX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0KKwkJCQkJPCZDUFU3IFRIRVJNQUxfTk9fTElNSVQKKwkJCQkJCShUSEVSTUFMX01BWF9MSU1JVC0xKT47CisJCQl9OworCQl9OworCX07CisKKwlhb3NzMC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAwPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJYW9zczBfdHJpcDogYW9zczAtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDw1MDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWNwdTBfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjeF9jZGV2IDAgMD47CisJCQl9OworCQkJbXhfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmYWRzcF92ZGQgMCAwPjsKKwkJCX07CisJCQljZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWNwdTAtc2lsdmVyLWxvd2YgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19mbG9vciI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDE+OworCQl0cmFja3MtbG93OworCQl0cmlwcyB7CisJCQljcHUwX3RyaXA6IGNwdTAtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDw1MDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWNwdTBfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTAgNCA0PjsKKwkJCX07CisJCQljcHU2X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjeF9jZGV2IDAgMD47CisJCQl9OworCQkJbXhfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm14X2NkZXYgMCAwPjsKKwkJCX07CisJCQltb2RlbV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1MF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1MF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmYWRzcF92ZGQgMCAwPjsKKwkJCX07CisJCQljZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1MS1zaWx2ZXItbG93ZiB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2Zsb29yIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMj47CisJCXRyYWNrcy1sb3c7CisJCXRyaXBzIHsKKwkJCWNwdTFfdHJpcDogY3B1MS10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1MV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1MV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUxX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUxX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwljcHUyLXNpbHZlci1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAzPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJY3B1Ml90cmlwOiBjcHUyLXRyaXAgeworCQkJCXRlbXBlcmF0dXJlID0gPDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8NTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQljcHUwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1Ml90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1Ml90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY3hfY2RldiAwIDA+OworCQkJfTsKKwkJCW14X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTJfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTJfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmFkc3BfdmRkIDAgMD47CisJCQl9OworCQkJY2RzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1Ml90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWNwdTMtc2lsdmVyLWxvd2YgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19mbG9vciI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDQ+OworCQl0cmFja3MtbG93OworCQl0cmlwcyB7CisJCQljcHUzX3RyaXA6IGNwdTMtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDw1MDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWNwdTBfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTNfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTAgNCA0PjsKKwkJCX07CisJCQljcHU2X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUzX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUzX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjeF9jZGV2IDAgMD47CisJCQl9OworCQkJbXhfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTNfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm14X2NkZXYgMCAwPjsKKwkJCX07CisJCQltb2RlbV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1M190cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1M190cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmYWRzcF92ZGQgMCAwPjsKKwkJCX07CisJCQljZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHUzX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJfTsKKwl9OworCisJY3B1NC1zaWx2ZXItbG93ZiB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2Zsb29yIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgNT47CisJCXRyYWNrcy1sb3c7CisJCXRyaXBzIHsKKwkJCWNwdTRfdHJpcDogY3B1NC10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1NF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTRfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTRfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1NF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHU0X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHU0X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTRfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwljcHU1LXNpbHZlci1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA2PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJY3B1NV90cmlwOiBjcHU1LXRyaXAgeworCQkJCXRlbXBlcmF0dXJlID0gPDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8NTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQljcHUwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHU1X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1NV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1NV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY3hfY2RldiAwIDA+OworCQkJfTsKKwkJCW14X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHU1X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTVfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdTVfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmFkc3BfdmRkIDAgMD47CisJCQl9OworCQkJY2RzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1NV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWtyeW8tbDMtMC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA3PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJbDNfMF90cmlwOiBsMy0wLXRyaXAgeworCQkJCXRlbXBlcmF0dXJlID0gPDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8NTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQljcHUwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZsM18wX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY3hfY2RldiAwIDA+OworCQkJfTsKKwkJCW14X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZsM18wX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmwzXzBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmwzXzBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmFkc3BfdmRkIDAgMD47CisJCQl9OworCQkJY2RzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWtyeW8tbDMtMS1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA4PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJbDNfMV90cmlwOiBsMy0xLXRyaXAgeworCQkJCXRlbXBlcmF0dXJlID0gPDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8NTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQljcHUwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZsM18xX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY3hfY2RldiAwIDA+OworCQkJfTsKKwkJCW14X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZsM18xX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmwzXzFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmwzXzFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmFkc3BfdmRkIDAgMD47CisJCQl9OworCQkJY2RzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbDNfMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWNwdTAtZ29sZC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA5PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJY3B1ZzBfdHJpcDogY3B1ZzAtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDw1MDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWNwdTBfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdWcwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1ZzBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdWcwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjeF9jZGV2IDAgMD47CisJCQl9OworCQkJbXhfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdWcwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdWcwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmYWRzcF92ZGQgMCAwPjsKKwkJCX07CisJCQljZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWNwdTEtZ29sZC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAxMD47CisJCXRyYWNrcy1sb3c7CisJCXRyaXBzIHsKKwkJCWNwdWcxX3RyaXA6IGNwdWcxLXRyaXAgeworCQkJCXRlbXBlcmF0dXJlID0gPDUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8NTAwMD47CisJCQkJdHlwZSA9ICJwYXNzaXZlIjsKKwkJCX07CisJCX07CisJCWNvb2xpbmctbWFwcyB7CisJCQljcHUwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNwdWcxX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY3hfY2RldiAwIDA+OworCQkJfTsKKwkJCW14X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjcHVnMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1ZzFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmFkc3BfdmRkIDAgMD47CisJCQl9OworCQkJY2RzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY3B1ZzFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwlncHUwLWxvd2YgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19mbG9vciI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDExPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJZ3B1MF90cmlwX2w6IGdwdTAtdHJpcCB7CisJCQkJdGVtcGVyYXR1cmUgPSA8NTAwMD47CisJCQkJaHlzdGVyZXNpcyA9IDw1MDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwkJY29vbGluZy1tYXBzIHsKKwkJCWNwdTBfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTBfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTBfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZ3B1MF90cmlwX2w+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjeF9jZGV2IDAgMD47CisJCQl9OworCQkJbXhfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTBfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZncHUwX3RyaXBfbD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTBfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmYWRzcF92ZGQgMCAwPjsKKwkJCX07CisJCQljZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZncHUwX3RyaXBfbD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwlncHUxLWxvd2YgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19mbG9vciI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDEyPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJZ3B1MV90cmlwX2w6IGdwdTEtdHJpcF9sIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZ3B1MV90cmlwX2w+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZ3B1MV90cmlwX2w+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZncHUxX3RyaXBfbD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZ3B1MV90cmlwX2w+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTFfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZ3B1MV90cmlwX2w+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmdwdTFfdHJpcF9sPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWFvc3MxLWxvd2YgeworCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47CisJCXBvbGxpbmctZGVsYXkgPSA8MD47CisJCXRoZXJtYWwtZ292ZXJub3IgPSAibG93X2xpbWl0c19mbG9vciI7CisJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDA+OworCQl0cmFja3MtbG93OworCQl0cmlwcyB7CisJCQlhb3NzMV90cmlwOiBhb3NzMS10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTAgNCA0PjsKKwkJCX07CisJCQljcHU2X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVNiA5IDk+OworCQkJfTsKKwkJCWdwdV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczBfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1zbV9ncHUgMSAxPjsKKwkJCX07CisJCQljeF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm14X2NkZXYgMCAwPjsKKwkJCX07CisJCQltb2RlbV92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmYW9zczFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8Jm1vZGVtX3ZkZCAwIDA+OworCQkJfTsKKwkJCWFkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MxX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MxX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZjZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJfTsKKwl9OworCisJbWRtLWRzcC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMSAxPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJZHNwX3RyaXA6IGRzcC10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZHNwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZHNwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZkc3BfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZHNwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmRzcF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZHNwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmRzcF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWRkci1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMSAyPjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJZGRyX3RyaXA6IGRkci10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZGRyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZGRyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZkZHJfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZGRyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmRkcl90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmZGRyX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmRkcl90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCXdsYW4tbG93ZiB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2Zsb29yIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgMz47CisJCXRyYWNrcy1sb3c7CisJCXRyaXBzIHsKKwkJCXdsYW5fdHJpcDogd2xhbi10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmd2xhbl90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JndsYW5fdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JndsYW5fdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmd2xhbl90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZ3bGFuX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZ3bGFuX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JndsYW5fdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwljb21wdXRlLWh2eC1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMSA0PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJaHZ4X3RyaXA6IGh2eC10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmaHZ4X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmaHZ4X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZodnhfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmaHZ4X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jmh2eF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmaHZ4X3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jmh2eF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWNhbWVyYS1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMSA1PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJY2FtZXJhX3RyaXA6IGNhbWVyYS10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY2FtZXJhX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY2FtZXJhX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZjYW1lcmFfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY2FtZXJhX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNhbWVyYV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmY2FtZXJhX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmNhbWVyYV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCW1tc3MtbG93ZiB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJsb3dfbGltaXRzX2Zsb29yIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgNj47CisJCXRyYWNrcy1sb3c7CisJCXRyaXBzIHsKKwkJCW1tc3NfdHJpcDogbW1zcy10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbW1zc190cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmQ1BVMCA0IDQ+OworCQkJfTsKKwkJCWNwdTZfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jm1tc3NfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JkNQVTYgOSA5PjsKKwkJCX07CisJCQlncHVfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8JmFvc3MwX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtc21fZ3B1IDEgMT47CisJCQl9OworCQkJY3hfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jm1tc3NfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbW1zc190cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXhfY2RldiAwIDA+OworCQkJfTsKKwkJCW1vZGVtX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZtbXNzX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZtb2RlbV92ZGQgMCAwPjsKKwkJCX07CisJCQlhZHNwX3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZtbXNzX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jm1tc3NfdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmNkc3BfdmRkIDAgMD47CisJCQl9OworCQl9OworCX07CisKKwltZG0tY29yZS1sb3dmIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gImxvd19saW1pdHNfZmxvb3IiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMSA3PjsKKwkJdHJhY2tzLWxvdzsKKwkJdHJpcHMgeworCQkJbWRtX3RyaXA6IG1kbS10cmlwIHsKKwkJCQl0ZW1wZXJhdHVyZSA9IDw1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDUwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCQljb29saW5nLW1hcHMgeworCQkJY3B1MF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbWRtX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFUwIDQgND47CisJCQl9OworCQkJY3B1Nl92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbWRtX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZDUFU2IDkgOT47CisJCQl9OworCQkJZ3B1X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZhb3NzMF90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbXNtX2dwdSAxIDE+OworCQkJfTsKKwkJCWN4X3ZkZF9jZGV2IHsKKwkJCQl0cmlwID0gPCZtZG1fdHJpcD47CisJCQkJY29vbGluZy1kZXZpY2UgPSA8JmN4X2NkZXYgMCAwPjsKKwkJCX07CisJCQlteF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbWRtX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZteF9jZGV2IDAgMD47CisJCQl9OworCQkJbW9kZW1fdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jm1kbV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmbW9kZW1fdmRkIDAgMD47CisJCQl9OworCQkJYWRzcF92ZGRfY2RldiB7CisJCQkJdHJpcCA9IDwmbWRtX3RyaXA+OworCQkJCWNvb2xpbmctZGV2aWNlID0gPCZhZHNwX3ZkZCAwIDA+OworCQkJfTsKKwkJCWNkc3BfdmRkX2NkZXYgeworCQkJCXRyaXAgPSA8Jm1kbV90cmlwPjsKKwkJCQljb29saW5nLWRldmljZSA9IDwmY2RzcF92ZGQgMCAwPjsKKwkJCX07CisJCX07CisJfTsKKworCWxtaC1kY3ZzLTAxIHsKKwkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OworCQlwb2xsaW5nLWRlbGF5ID0gPDA+OworCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOworCQl0aGVybWFsLXNlbnNvcnMgPSA8JmxtaF9kY3ZzMT47CisKKwkJdHJpcHMgeworCQkJYWN0aXZlLWNvbmZpZyB7CisJCQkJdGVtcGVyYXR1cmUgPSA8OTUwMDA+OworCQkJCWh5c3RlcmVzaXMgPSA8MzAwMDA+OworCQkJCXR5cGUgPSAicGFzc2l2ZSI7CisJCQl9OworCQl9OworCX07CisKKwlsbWgtZGN2cy0wMCB7CisJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKKwkJcG9sbGluZy1kZWxheSA9IDwwPjsKKwkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKKwkJdGhlcm1hbC1zZW5zb3JzID0gPCZsbWhfZGN2czA+OworCisJCXRyaXBzIHsKKwkJCWFjdGl2ZS1jb25maWcgeworCQkJCXRlbXBlcmF0dXJlID0gPDk1MDAwPjsKKwkJCQloeXN0ZXJlc2lzID0gPDMwMDAwPjsKKwkJCQl0eXBlID0gInBhc3NpdmUiOworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjllMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYi5kdHNpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgInNkbTg0NS11c2IuZHRzaSIKKworJnNvYyB7CisJL2RlbGV0ZS1ub2RlLyBzc3VzYkBhODAwMDAwOworCS9kZWxldGUtbm9kZS8gcXVzYkA4OGUzMDAwOworCS9kZWxldGUtbm9kZS8gc3NwaHlAODhlYjAwMDsKKwkvZGVsZXRlLW5vZGUvIHVzYl9hdWRpb19xbWlfZGV2OworCXVzYl9hdWRpb19xbWlfZGV2IHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHVzYi1hdWRpby1xbWktZGV2IjsKKwkJaW9tbXVzID0gPCZhcHBzX3NtbXUgMHgxODBmIDB4MD47CisJCXFjb20sdXNiLWF1ZGlvLXN0cmVhbS1pZCA9IDwweGY+OworCQlxY29tLHVzYi1hdWRpby1pbnRyLW51bSA9IDwyPjsKKwl9OworfTsKKworJnVzYjAgeworCS9kZWxldGUtcHJvcGVydHkvIGlvbW11czsKKwkvZGVsZXRlLXByb3BlcnR5LyBxY29tLHNtbXUtczEtYnlwYXNzOworCWV4dGNvbiA9IDwwPiwgPDA+LCA8MD4gLyogPCZldWQ+ICovOworfTsKKworJnF1c2JfcGh5MCB7CisJdmRkLXN1cHBseSA9IDwmcG02NjBsX2wxPjsKKwl2ZGRhMTgtc3VwcGx5ID0gPCZwbTY2MF9sMTA+OworCXZkZGEzMy1zdXBwbHkgPSA8JnBtNjYwbF9sNz47Cit9OworCismdXNiX3FtcF9kcF9waHkgeworCXZkZC1zdXBwbHkgPSA8JnBtNjYwbF9sMT47IC8qIDAuODh2ICovCisJY29yZS1zdXBwbHkgPSA8JnBtNjYwX2wxPjsgLyogMS4ydiAqLworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtY2RwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTFkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtY2RwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEwsIFVTQi1DIEF1ZGlvLCBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtY2RwIiwgInFjb20sc2RtNjcwIiwgInFjb20sY2RwIjsKKwlxY29tLG1zbS1pZCA9IDwzMzYgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMj47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMTAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDEwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDEwMTFhIDB4MCAweDA+OworfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtY2RwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE4NDIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWNkcC5kdHMKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBMLCBVU0ItQyBBdWRpbywgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWNkcCIsICJxY29tLHNkbTY3MCIsICJxY29tLGNkcCI7CisJcWNvbSxib2FyZC1pZCA9IDwxIDI+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtY2RwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJhYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDM0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHQtY2RjLXVzYmMtYXVkaW8uZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCtQTTY2MEwsIFVTQi1DIEF1ZGlvLCBFeHQuIEF1ZGlvIENvZGVjIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAzPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtY2RwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUzMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLWNkcC5kdHMKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dGVybmFsLWNvZGVjLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dC1jZGMtdXNiYy1hdWRpby5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNIDY3MCBQTTY2MCtQTTY2MEwsIFVTQi1DIEF1ZGlvLCBFeHQuIEF1ZGlvIENvZGVjIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sYm9hcmQtaWQgPSA8MSAzPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1tdHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYTE4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0LWNkYy11c2JjLWF1ZGlvLmR0c2kiCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwK1BNNjYwTCwgVVNCLUMgQXVkaW8sIEV4dC4gQXVkaW8gQ29kZWMgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLW10cCIsICJxY29tLHNkbTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxtc20taWQgPSA8MzM2IDB4MD47CisJcWNvbSxib2FyZC1pZCA9IDw4IDM+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1tdHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTk4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtbXRwLmR0cwpAQCAtMCwwICsxLDI4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKworI2luY2x1ZGUgInNkbTY3MC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0LWNkYy11c2JjLWF1ZGlvLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE0gNjcwIFBNNjYwK1BNNjYwTCwgVVNCLUMgQXVkaW8sIEV4dC4gQXVkaW8gQ29kZWMgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLW10cCIsICJxY29tLHNkbTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZCA9IDw4IDM+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDEwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAxMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAxMDExYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGIwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLWNkcC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHQtY2RjLXVzYmMtYXVkaW8uZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCtQTTY2MEEsIFVTQi1DIEF1ZGlvLCBFeHQuIEF1ZGlvIENvZGVjIENEUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1jZHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxjZHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAzPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLWNkcC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NDFlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtY2RwLmR0cwpAQCAtMCwwICsxLDI5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKworI2luY2x1ZGUgInNkbTY3MC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1jZHAuZHRzaSIKKyNpbmNsdWRlICJwbTY2MGEuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0ZXJuYWwtY29kZWMuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtZXh0LWNkYy11c2JjLWF1ZGlvLmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE0gNjcwIFBNNjYwK1BNNjYwQSwgVVNCLUMgQXVkaW8sIEV4dC4gQXVkaW8gQ29kZWMgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWNkcCIsICJxY29tLHNkbTY3MCIsICJxY29tLGNkcCI7CisJcWNvbSxib2FyZC1pZCA9IDwxIDM+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDAwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAwMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAyMDAxYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1leHRlcm5hbC1jb2RlYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTZmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHRlcm5hbC1jb2RlYy5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1leHQtY2RjLXVzYmMtYXVkaW8uZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCtQTTY2MEEsIFVTQi1DIEF1ZGlvLCBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAzPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLWV4dGVybmFsLWNvZGVjLXBtNjYwYS1tdHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDY4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtZXh0ZXJuYWwtY29kZWMtcG02NjBhLW10cC5kdHMKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAicG02NjBhLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dGVybmFsLWNvZGVjLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWV4dC1jZGMtdXNiYy1hdWRpby5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNIDY3MCBQTTY2MCtQTTY2MEEsIFVTQi1DIEF1ZGlvLCBFeHQuIEF1ZGlvIENvZGVjIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sYm9hcmQtaWQgPSA8OCAzPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAwMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMDAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMjAwMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1tdHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1YzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1tdHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy9kdHMtdjEvOworL3BsdWdpbi87CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGNhbWNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZGlzcGNjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20scnBtaC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgInNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtaW50LWNkYy11c2JjLWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTY3MCBQTTY2MCArIFBNNjYwTCwgVVNCLUMgQXVkaW8sIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1tdHAiLCAicWNvbSxzZG02NzAiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMzNiAweDA+OworCXFjb20sYm9hcmQtaWQgPSA8OCAyPjsKKwlxY29tLHBtaWMtaWQgPSA8MHgwMDAxMDAxYiAweDAxMDEwMTFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMTAyMDAxYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDIwMTAxMWEgMHgwIDB4MD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLW10cC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtbXRwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQ5NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLW10cC5kdHMKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEwsIFVTQi1DIEF1ZGlvLCBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtbXRwIiwgInFjb20sc2RtNjcwIiwgInFjb20sbXRwIjsKKwlxY29tLGJvYXJkLWlkID0gPDggMj47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMTAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDEwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDEwMTFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLXBtNjYwYS1jZHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyNmQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtY2RwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAicG02NjBhLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEEsIFVTQi1DIEF1ZGlvLCBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtY2RwIiwgInFjb20sc2RtNjcwIiwgInFjb20sY2RwIjsKKwlxY29tLG1zbS1pZCA9IDwzMzYgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMj47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLXBtNjYwYS1jZHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLXBtNjYwYS1jZHAuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzFiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXVzYmMtcG02NjBhLWNkcC5kdHMKQEAgLTAsMCArMSwyOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisKKyNpbmNsdWRlICJzZG02NzAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAicG02NjBhLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEEsIFVTQi1DIEF1ZGlvLCBDRFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtY2RwIiwgInFjb20sc2RtNjcwIiwgInFjb20sY2RwIjsKKwlxY29tLGJvYXJkLWlkID0gPDEgMj47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLXBtNjYwYS1tdHAtb3ZlcmxheS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2NWNkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtbXRwLW92ZXJsYXkuZHRzCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG02NzAtbXRwLmR0c2kiCisjaW5jbHVkZSAicG02NjBhLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWludC1jZGMtdXNiYy1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE02NzAgUE02NjAgKyBQTTY2MEEsIFVTQi1DIEF1ZGlvLCBNVFAiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtbXRwIiwgInFjb20sc2RtNjcwIiwgInFjb20sbXRwIjsKKwlxY29tLG1zbS1pZCA9IDwzMzYgMHgwPjsKKwlxY29tLGJvYXJkLWlkID0gPDggMj47CisJcWNvbSxwbWljLWlkID0gPDB4MDAwMTAwMWIgMHgwMDAxMDExYSAweDAgMHgwPiwKKwkJICAgICAgIDwweDAwMDEwMDFiIDB4MDAwMjAwMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAyMDIwMDFhIDB4MCAweDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtbXRwLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdXNiYy1wbTY2MGEtbXRwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg4NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC11c2JjLXBtNjYwYS1tdHAuZHRzCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKy9kdHMtdjEvOworCisjaW5jbHVkZSAic2RtNjcwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLW10cC5kdHNpIgorI2luY2x1ZGUgInBtNjYwYS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1pbnQtY2RjLXVzYmMtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIFBNNjYwICsgUE02NjBBLCBVU0ItQyBBdWRpbywgTVRQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtNjcwLW10cCIsICJxY29tLHNkbTY3MCIsICJxY29tLG10cCI7CisJcWNvbSxib2FyZC1pZCA9IDw4IDI+OworCXFjb20scG1pYy1pZCA9IDwweDAwMDEwMDFiIDB4MDAwMTAxMWEgMHgwIDB4MD4sCisJCSAgICAgICA8MHgwMDAxMDAxYiAweDAwMDIwMDFhIDB4MCAweDA+LAorCQkgICAgICAgPDB4MDAwMTAwMWIgMHgwMjAyMDAxYSAweDAgMHgwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXZpZGMuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAtdmlkYy5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGY5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLXZpZGMuZHRzaQpAQCAtMCwwICsxLDIxNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvbXNtL21zbS1idXMtaWRzLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSx2aWRlb2NjLXNkbTg0NS5oPgorCismc29jIHsKKwltc21fdmlkYzA6IHFjb20sdmlkYzAgeworCQljb21wYXRpYmxlID0gInFjb20sbXNtLXZpZGMiLCAicWNvbSxzZG02NzAtdmlkYyI7CisJCXN0YXR1cyA9ICJvayI7CisJCXNrdS1pbmRleCA9IDwwPjsKKwkJcmVnID0gPDB4YWEwMDAwMCAweDIwMDAwMD47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisKKwkJLyogU3VwcGx5ICovCisJCXZlbnVzLXN1cHBseSA9IDwmdmVudXNfZ2RzYz47CisJCXZlbnVzLWNvcmUwLXN1cHBseSA9IDwmdmNvZGVjMF9nZHNjPjsKKwkJdmVudXMtY29yZTEtc3VwcGx5ID0gPCZ2Y29kZWMxX2dkc2M+OworCisJCS8qIENsb2NrcyAqLworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayIsICJpZmFjZV9jbGsiLCAiYnVzX2NsayIsCisJCQkiY29yZTBfY2xrIiwgImNvcmUwX2J1c19jbGsiLAorCQkJImNvcmUxX2NsayIsICJjb3JlMV9idXNfY2xrIjsKKwkJY2xvY2tzID0gPCZjbG9ja192aWRlb2NjIFZJREVPX0NDX1ZFTlVTX0NUTF9DT1JFX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkVOVVNfQUhCX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkVOVVNfQ1RMX0FYSV9DTEs+LAorCQkJPCZjbG9ja192aWRlb2NjIFZJREVPX0NDX1ZDT0RFQzBfQ09SRV9DTEs+LAorCQkJPCZjbG9ja192aWRlb2NjIFZJREVPX0NDX1ZDT0RFQzBfQVhJX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkNPREVDMV9DT1JFX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkNPREVDMV9BWElfQ0xLPjsKKwkJcWNvbSxwcm94eS1jbG9jay1uYW1lcyA9ICJjb3JlX2NsayIsICJpZmFjZV9jbGsiLAorCQkJImJ1c19jbGsiLCAiY29yZTBfY2xrIiwgImNvcmUwX2J1c19jbGsiLAorCQkJImNvcmUxX2NsayIsICJjb3JlMV9idXNfY2xrIjsKKwkJcWNvbSxjbG9jay1jb25maWdzID0gPDB4MSAweDAgMHgwIDB4MSAweDAgMHgxIDB4MD47CisJCXFjb20sYWxsb3dlZC1jbG9jay1yYXRlcyA9IDwxMDAwMDAwMDAgMjAwMDAwMDAwIDMyMDAwMDAwMAorCQkJMzgwMDAwMDAwIDQ0NDAwMDAwMCA1MzMwMDAwMDA+OworCisJCS8qIEJ1c2VzICovCisJCWJ1c19jbm9jIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdmlkYyxidXMiOworCQkJbGFiZWwgPSAiY25vYyI7CisJCQlxY29tLGJ1cy1tYXN0ZXIgPSA8TVNNX0JVU19NQVNURVJfQU1QU1NfTTA+OworCQkJcWNvbSxidXMtc2xhdmUgPSA8TVNNX0JVU19TTEFWRV9WRU5VU19DRkc+OworCQkJcWNvbSxidXMtZ292ZXJub3IgPSAicGVyZm9ybWFuY2UiOworCQkJcWNvbSxidXMtcmFuZ2Uta2JwcyA9IDwxMDAwIDEwMDA+OworCQl9OworCisJCXZlbnVzX2J1c19kZHIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGJ1cyI7CisJCQlsYWJlbCA9ICJ2ZW51cy1kZHIiOworCQkJcWNvbSxidXMtbWFzdGVyID0gPE1TTV9CVVNfTUFTVEVSX1ZJREVPX1AwPjsKKwkJCXFjb20sYnVzLXNsYXZlID0gPE1TTV9CVVNfU0xBVkVfRUJJX0NIMD47CisJCQlxY29tLGJ1cy1nb3Zlcm5vciA9ICJtc20tdmlkYy1kZHIiOworCQkJcWNvbSxidXMtcmFuZ2Uta2JwcyA9IDwxMDAwIDMzODgwMDA+OworCQl9OworCQlhcm05X2J1c19kZHIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGJ1cyI7CisJCQlsYWJlbCA9ICJ2ZW51cy1hcm05LWRkciI7CisJCQlxY29tLGJ1cy1tYXN0ZXIgPSA8TVNNX0JVU19NQVNURVJfVklERU9fUDA+OworCQkJcWNvbSxidXMtc2xhdmUgPSA8TVNNX0JVU19TTEFWRV9FQklfQ0gwPjsKKwkJCXFjb20sYnVzLWdvdmVybm9yID0gInBlcmZvcm1hbmNlIjsKKwkJCXFjb20sYnVzLXJhbmdlLWticHMgPSA8MTAwMCAxMDAwPjsKKwkJfTsKKworCQkvKiBNTVVzICovCisJCW5vbl9zZWN1cmVfY2IgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGNvbnRleHQtYmFuayI7CisJCQlsYWJlbCA9ICJ2ZW51c19ucyI7CisJCQlpb21tdXMgPQorCQkJCTwmYXBwc19zbW11IDB4MTBhMCAweDg+LAorCQkJCTwmYXBwc19zbW11IDB4MTBiMCAweDA+OworCQkJYnVmZmVyLXR5cGVzID0gPDB4ZmZmPjsKKwkJCXZpcnR1YWwtYWRkci1wb29sID0gPDB4NzA4MDAwMDAgMHg2ZjgwMDAwMD47CisJCX07CisKKwkJc2VjdXJlX2JpdHN0cmVhbV9jYiB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLXZpZGMsY29udGV4dC1iYW5rIjsKKwkJCWxhYmVsID0gInZlbnVzX3NlY19iaXRzdHJlYW0iOworCQkJaW9tbXVzID0KKwkJCQk8JmFwcHNfc21tdSAweDEwYTEgMHg4PiwKKwkJCQk8JmFwcHNfc21tdSAweDEwYTUgMHg4PjsKKwkJCWJ1ZmZlci10eXBlcyA9IDwweDI0MT47CisJCQl2aXJ0dWFsLWFkZHItcG9vbCA9IDwweDRiMDAwMDAwIDB4MjU4MDAwMDA+OworCQkJcWNvbSxzZWN1cmUtY29udGV4dC1iYW5rOworCQl9OworCisJCXNlY3VyZV9waXhlbF9jYiB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLXZpZGMsY29udGV4dC1iYW5rIjsKKwkJCWxhYmVsID0gInZlbnVzX3NlY19waXhlbCI7CisJCQlpb21tdXMgPQorCQkJCTwmYXBwc19zbW11IDB4MTBhMyAweDg+OworCQkJYnVmZmVyLXR5cGVzID0gPDB4MTA2PjsKKwkJCXZpcnR1YWwtYWRkci1wb29sID0gPDB4MjU4MDAwMDAgMHgyNTgwMDAwMD47CisJCQlxY29tLHNlY3VyZS1jb250ZXh0LWJhbms7CisJCX07CisKKwkJc2VjdXJlX25vbl9waXhlbF9jYiB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLXZpZGMsY29udGV4dC1iYW5rIjsKKwkJCWxhYmVsID0gInZlbnVzX3NlY19ub25fcGl4ZWwiOworCQkJaW9tbXVzID0KKwkJCQk8JmFwcHNfc21tdSAweDEwYTQgMHg4PiwKKwkJCQk8JmFwcHNfc21tdSAweDEwYjQgMHgwPjsKKwkJCWJ1ZmZlci10eXBlcyA9IDwweDQ4MD47CisJCQl2aXJ0dWFsLWFkZHItcG9vbCA9IDwweDEwMDAwMDAgMHgyNDgwMDAwMD47CisJCQlxY29tLHNlY3VyZS1jb250ZXh0LWJhbms7CisJCX07CisJfTsKKworCW1zbV92aWRjMTogcWNvbSx2aWRjMSB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdmlkYyIsICJxY29tLHNkbTY3MC12aWRjIjsKKwkJc3RhdHVzID0gIm9rIjsKKwkJc2t1LWluZGV4ID0gPDE+OworCQlyZWcgPSA8MHhhYTAwMDAwIDB4MjAwMDAwPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE3NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKworCQkvKiBTdXBwbHkgKi8KKwkJdmVudXMtc3VwcGx5ID0gPCZ2ZW51c19nZHNjPjsKKwkJdmVudXMtY29yZTAtc3VwcGx5ID0gPCZ2Y29kZWMwX2dkc2M+OworCisJCS8qIENsb2NrcyAqLworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayIsICJpZmFjZV9jbGsiLCAiYnVzX2NsayIsCisJCQkiY29yZTBfY2xrIiwgImNvcmUwX2J1c19jbGsiOworCQljbG9ja3MgPSA8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkVOVVNfQ1RMX0NPUkVfQ0xLPiwKKwkJCTwmY2xvY2tfdmlkZW9jYyBWSURFT19DQ19WRU5VU19BSEJfQ0xLPiwKKwkJCTwmY2xvY2tfdmlkZW9jYyBWSURFT19DQ19WRU5VU19DVExfQVhJX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkNPREVDMF9DT1JFX0NMSz4sCisJCQk8JmNsb2NrX3ZpZGVvY2MgVklERU9fQ0NfVkNPREVDMF9BWElfQ0xLPjsKKwkJcWNvbSxwcm94eS1jbG9jay1uYW1lcyA9ICJjb3JlX2NsayIsICJpZmFjZV9jbGsiLAorCQkJImJ1c19jbGsiLCAiY29yZTBfY2xrIiwgImNvcmUwX2J1c19jbGsiOworCQlxY29tLGNsb2NrLWNvbmZpZ3MgPSA8MHgxIDB4MCAweDAgMHgxIDB4MD47CisJCXFjb20sYWxsb3dlZC1jbG9jay1yYXRlcyA9IDwxMDAwMDAwMDAgMjAwMDAwMDAwIDMyMDAwMDAwMAorCQkJMzY0ODAwMDAwPjsKKworCQkvKiBCdXNlcyAqLworCQlidXNfY25vYyB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLXZpZGMsYnVzIjsKKwkJCWxhYmVsID0gImNub2MiOworCQkJcWNvbSxidXMtbWFzdGVyID0gPE1TTV9CVVNfTUFTVEVSX0FNUFNTX00wPjsKKwkJCXFjb20sYnVzLXNsYXZlID0gPE1TTV9CVVNfU0xBVkVfVkVOVVNfQ0ZHPjsKKwkJCXFjb20sYnVzLWdvdmVybm9yID0gInBlcmZvcm1hbmNlIjsKKwkJCXFjb20sYnVzLXJhbmdlLWticHMgPSA8MTAwMCAxMDAwPjsKKwkJfTsKKworCQl2ZW51c19idXNfZGRyIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdmlkYyxidXMiOworCQkJbGFiZWwgPSAidmVudXMtZGRyIjsKKwkJCXFjb20sYnVzLW1hc3RlciA9IDxNU01fQlVTX01BU1RFUl9WSURFT19QMD47CisJCQlxY29tLGJ1cy1zbGF2ZSA9IDxNU01fQlVTX1NMQVZFX0VCSV9DSDA+OworCQkJcWNvbSxidXMtZ292ZXJub3IgPSAibXNtLXZpZGMtZGRyIjsKKwkJCXFjb20sYnVzLXJhbmdlLWticHMgPSA8MTAwMCAyMTI4MDAwPjsKKwkJfTsKKwkJYXJtOV9idXNfZGRyIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdmlkYyxidXMiOworCQkJbGFiZWwgPSAidmVudXMtYXJtOS1kZHIiOworCQkJcWNvbSxidXMtbWFzdGVyID0gPE1TTV9CVVNfTUFTVEVSX1ZJREVPX1AwPjsKKwkJCXFjb20sYnVzLXNsYXZlID0gPE1TTV9CVVNfU0xBVkVfRUJJX0NIMD47CisJCQlxY29tLGJ1cy1nb3Zlcm5vciA9ICJwZXJmb3JtYW5jZSI7CisJCQlxY29tLGJ1cy1yYW5nZS1rYnBzID0gPDEwMDAgMTAwMD47CisJCX07CisKKwkJLyogTU1VcyAqLworCQlub25fc2VjdXJlX2NiIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tdmlkYyxjb250ZXh0LWJhbmsiOworCQkJbGFiZWwgPSAidmVudXNfbnMiOworCQkJaW9tbXVzID0KKwkJCQk8JmFwcHNfc21tdSAweDEwYTAgMHg4PiwKKwkJCQk8JmFwcHNfc21tdSAweDEwYjAgMHgwPjsKKwkJCWJ1ZmZlci10eXBlcyA9IDwweGZmZj47CisJCQl2aXJ0dWFsLWFkZHItcG9vbCA9IDwweDcwODAwMDAwIDB4NmY4MDAwMDA+OworCQl9OworCisJCXNlY3VyZV9iaXRzdHJlYW1fY2IgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGNvbnRleHQtYmFuayI7CisJCQlsYWJlbCA9ICJ2ZW51c19zZWNfYml0c3RyZWFtIjsKKwkJCWlvbW11cyA9CisJCQkJPCZhcHBzX3NtbXUgMHgxMGExIDB4OD4sCisJCQkJPCZhcHBzX3NtbXUgMHgxMGE1IDB4OD47CisJCQlidWZmZXItdHlwZXMgPSA8MHgyNDE+OworCQkJdmlydHVhbC1hZGRyLXBvb2wgPSA8MHg0YjAwMDAwMCAweDI1ODAwMDAwPjsKKwkJCXFjb20sc2VjdXJlLWNvbnRleHQtYmFuazsKKwkJfTsKKworCQlzZWN1cmVfcGl4ZWxfY2IgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGNvbnRleHQtYmFuayI7CisJCQlsYWJlbCA9ICJ2ZW51c19zZWNfcGl4ZWwiOworCQkJaW9tbXVzID0KKwkJCQk8JmFwcHNfc21tdSAweDEwYTMgMHg4PjsKKwkJCWJ1ZmZlci10eXBlcyA9IDwweDEwNj47CisJCQl2aXJ0dWFsLWFkZHItcG9vbCA9IDwweDI1ODAwMDAwIDB4MjU4MDAwMDA+OworCQkJcWNvbSxzZWN1cmUtY29udGV4dC1iYW5rOworCQl9OworCisJCXNlY3VyZV9ub25fcGl4ZWxfY2IgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS12aWRjLGNvbnRleHQtYmFuayI7CisJCQlsYWJlbCA9ICJ2ZW51c19zZWNfbm9uX3BpeGVsIjsKKwkJCWlvbW11cyA9CisJCQkJPCZhcHBzX3NtbXUgMHgxMGE0IDB4OD4sCisJCQkJPCZhcHBzX3NtbXUgMHgxMGI0IDB4MD47CisJCQlidWZmZXItdHlwZXMgPSA8MHg0ODA+OworCQkJdmlydHVhbC1hZGRyLXBvb2wgPSA8MHgxMDAwMDAwIDB4MjQ4MDAwMDA+OworCQkJcWNvbSxzZWN1cmUtY29udGV4dC1iYW5rOworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTY3MC5kdHNpCmluZGV4IDQyYzA3MmIuLmI1MjdmM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG02NzAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtNjcwLmR0c2kKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9yZWd1bGF0b3IvcWNvbSxycG1oLXJlZ3VsYXRvci5oPgogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sYW9wLXFtcC5oPgogCisjZGVmaW5lIE1IWl9UT19NQlBTKG1oeiwgdykgKChtaHogKiAxMDAwMDAwICogdykgLyAoMTAyNCAqIDEwMjQpKQorCiAvIHsKIAltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNNjcwIjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtNjcwIjsKQEAgLTMyLDkgKzM0LDcgQEAKIAlhbGlhc2VzIHsKIAkJdWZzaGMxID0gJnVmc2hjX21lbTsgLyogRW1iZWRkZWQgVUZTIHNsb3QgKi8KIAkJc2RoYzEgPSAmc2RoY18xOyAvKiBTREMxIGVNTUMgc2xvdCAqLwotCX07Ci0KLQlhbGlhc2VzIHsKKwkJc2RoYzIgPSAmc2RoY18yOyAvKiBTREMyIFNEIENhcmQgc2xvdCAqLwogCQlzZXJpYWwwID0gJnF1cHYzX3NlMTJfMnVhcnQ7CiAJCXNwaTAgPSAmcXVwdjNfc2U4X3NwaTsKIAkJaTJjMCA9ICZxdXB2M19zZTEwX2kyYzsKQEAgLTQyLDYgKzQyLDEwIEBACiAJCWhzdWFydDAgPSAmcXVwdjNfc2U2XzR1YXJ0OwogCX07CiAKKwljaG9zZW4geworCQlib290YXJncyA9ICJyY3VwZGF0ZS5yY3VfZXhwZWRpdGVkPTEgY29yZV9jdGxfZGlzYWJsZV9jcHVtYXNrPTYtNyI7CisJfTsKKwogCWNwdXMgewogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJI3NpemUtY2VsbHMgPSA8MD47CkBAIC01NSw2ICs1OSw5IEBACiAJCQljYWNoZS1zaXplID0gPDB4ODAwMD47CiAJCQljcHUtcmVsZWFzZS1hZGRyID0gPDB4MCAweDkwMDAwMDAwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJc2NoZWQtZW5lcmd5LWNvc3RzID0gPCZDUFVfQ09TVF8wICZDTFVTVEVSX0NPU1RfMD47CisJCQlxY29tLGxtaC1kY3ZzID0gPCZsbWhfZGN2czA+OworCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CiAJCQlMMl8wOiBsMi1jYWNoZSB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJY2FjaGUtc2l6ZSA9IDwweDIwMDAwPjsKQEAgLTc0LDYgKzgxLDkgQEAKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDkwMDA+OwogCQkJfTsKKwkJCUwxX1RMQl8wOiBsMS10bGIgeworCQkJCXFjb20sZHVtcC1zaXplID0gPDB4MzAwMD47CisJCQl9OwogCQl9OwogCiAJCUNQVTE6IGNwdUAxMDAgewpAQCAtODUsNiArOTUsOSBAQAogCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwogCQkJY3B1LXJlbGVhc2UtYWRkciA9IDwweDAgMHg5MDAwMDAwMD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xMDA+OworCQkJc2NoZWQtZW5lcmd5LWNvc3RzID0gPCZDUFVfQ09TVF8wICZDTFVTVEVSX0NPU1RfMD47CisJCQlxY29tLGxtaC1kY3ZzID0gPCZsbWhfZGN2czA+OworCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CiAJCQlMMl8xMDA6IGwyLWNhY2hlIHsKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQljYWNoZS1zaXplID0gPDB4MjAwMDA+OwpAQCAtOTksNiArMTEyLDkgQEAKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDkwMDA+OwogCQkJfTsKKwkJCUwxX1RMQl8xMDA6IGwxLXRsYiB7CisJCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgzMDAwPjsKKwkJCX07CiAJCX07CiAKIAkJQ1BVMjogY3B1QDIwMCB7CkBAIC0xMTAsNiArMTI2LDkgQEAKIAkJCWNhY2hlLXNpemUgPSA8MHg4MDAwPjsKIAkJCWNwdS1yZWxlYXNlLWFkZHIgPSA8MHgwIDB4OTAwMDAwMDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMjAwPjsKKwkJCXNjaGVkLWVuZXJneS1jb3N0cyA9IDwmQ1BVX0NPU1RfMCAmQ0xVU1RFUl9DT1NUXzA+OworCQkJcWNvbSxsbWgtZGN2cyA9IDwmbG1oX2RjdnMwPjsKKwkJCSNjb29saW5nLWNlbGxzID0gPDI+OwogCQkJTDJfMjAwOiBsMi1jYWNoZSB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJY2FjaGUtc2l6ZSA9IDwweDIwMDAwPjsKQEAgLTEyNCw2ICsxNDMsOSBAQAogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOwogCQkJCXFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CiAJCQl9OworCQkJTDFfVExCXzIwMDogbDEtdGxiIHsKKwkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDMwMDA+OworCQkJfTsKIAkJfTsKIAogCQlDUFUzOiBjcHVAMzAwIHsKQEAgLTEzNSw2ICsxNTcsOSBAQAogCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwogCQkJY3B1LXJlbGVhc2UtYWRkciA9IDwweDAgMHg5MDAwMDAwMD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zMDA+OworCQkJc2NoZWQtZW5lcmd5LWNvc3RzID0gPCZDUFVfQ09TVF8wICZDTFVTVEVSX0NPU1RfMD47CisJCQlxY29tLGxtaC1kY3ZzID0gPCZsbWhfZGN2czA+OworCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CiAJCQlMMl8zMDA6IGwyLWNhY2hlIHsKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQljYWNoZS1zaXplID0gPDB4MjAwMDA+OwpAQCAtMTQ5LDYgKzE3NCw5IEBACiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJcWNvbSxkdW1wLXNpemUgPSA8MHg5MDAwPjsKIAkJCX07CisJCQlMMV9UTEJfMzAwOiBsMS10bGIgeworCQkJCXFjb20sZHVtcC1zaXplID0gPDB4MzAwMD47CisJCQl9OwogCQl9OwogCiAJCUNQVTQ6IGNwdUA0MDAgewpAQCAtMTYwLDYgKzE4OCw5IEBACiAJCQljYWNoZS1zaXplID0gPDB4ODAwMD47CiAJCQljcHUtcmVsZWFzZS1hZGRyID0gPDB4MCAweDkwMDAwMDAwPjsKIAkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzQwMD47CisJCQlzY2hlZC1lbmVyZ3ktY29zdHMgPSA8JkNQVV9DT1NUXzAgJkNMVVNURVJfQ09TVF8wPjsKKwkJCXFjb20sbG1oLWRjdnMgPSA8JmxtaF9kY3ZzMD47CisJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKIAkJCUwyXzQwMDogbDItY2FjaGUgewogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOwogCQkJCWNhY2hlLXNpemUgPSA8MHgyMDAwMD47CkBAIC0xNzQsNiArMjA1LDkgQEAKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDkwMDA+OwogCQkJfTsKKwkJCUwxX1RMQl80MDA6IGwxLXRsYiB7CisJCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgzMDAwPjsKKwkJCX07CiAJCX07CiAKIAkJQ1BVNTogY3B1QDUwMCB7CkBAIC0xODUsNiArMjE5LDkgQEAKIAkJCWNhY2hlLXNpemUgPSA8MHg4MDAwPjsKIAkJCWNwdS1yZWxlYXNlLWFkZHIgPSA8MHgwIDB4OTAwMDAwMDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNTAwPjsKKwkJCXNjaGVkLWVuZXJneS1jb3N0cyA9IDwmQ1BVX0NPU1RfMCAmQ0xVU1RFUl9DT1NUXzA+OworCQkJcWNvbSxsbWgtZGN2cyA9IDwmbG1oX2RjdnMwPjsKKwkJCSNjb29saW5nLWNlbGxzID0gPDI+OwogCQkJTDJfNTAwOiBsMi1jYWNoZSB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJY2FjaGUtc2l6ZSA9IDwweDIwMDAwPjsKQEAgLTE5OSw2ICsyMzYsOSBAQAogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOwogCQkJCXFjb20sZHVtcC1zaXplID0gPDB4OTAwMD47CiAJCQl9OworCQkJTDFfVExCXzUwMDogbDEtdGxiIHsKKwkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDMwMDA+OworCQkJfTsKIAkJfTsKIAogCQlDUFU2OiBjcHVANjAwIHsKQEAgLTIxMCw2ICsyNTAsOSBAQAogCQkJY2FjaGUtc2l6ZSA9IDwweDEwMDAwPjsKIAkJCWNwdS1yZWxlYXNlLWFkZHIgPSA8MHgwIDB4OTAwMDAwMDA+OwogCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNjAwPjsKKwkJCXNjaGVkLWVuZXJneS1jb3N0cyA9IDwmQ1BVX0NPU1RfMSAmQ0xVU1RFUl9DT1NUXzE+OworCQkJcWNvbSxsbWgtZGN2cyA9IDwmbG1oX2RjdnMxPjsKKwkJCSNjb29saW5nLWNlbGxzID0gPDI+OwogCQkJTDJfNjAwOiBsMi1jYWNoZSB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsKQEAgLTIyNCw2ICsyNjcsOSBAQAogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFyY2gtY2FjaGUiOwogCQkJCXFjb20sZHVtcC1zaXplID0gPDB4MTIwMDA+OwogCQkJfTsKKwkJCUwxX1RMQl82MDA6IGwxLXRsYiB7CisJCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgzYzAwMD47CisJCQl9OwogCQl9OwogCiAJCUNQVTc6IGNwdUA3MDAgewpAQCAtMjM1LDYgKzI4MSw5IEBACiAJCQljYWNoZS1zaXplID0gPDB4MTAwMDA+OwogCQkJY3B1LXJlbGVhc2UtYWRkciA9IDwweDAgMHg5MDAwMDAwMD47CiAJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl83MDA+OworCQkJc2NoZWQtZW5lcmd5LWNvc3RzID0gPCZDUFVfQ09TVF8xICZDTFVTVEVSX0NPU1RfMT47CisJCQlxY29tLGxtaC1kY3ZzID0gPCZsbWhfZGN2czE+OworCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CiAJCQlMMl83MDA6IGwyLWNhY2hlIHsKIAkJCQljb21wYXRpYmxlID0gImFybSxhcmNoLWNhY2hlIjsKIAkJCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OwpAQCAtMjQ5LDYgKzI5OCw5IEBACiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJjaC1jYWNoZSI7CiAJCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMjAwMD47CiAJCQl9OworCQkJTDFfVExCXzcwMDogbDEtdGxiIHsKKwkJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDNjMDAwPjsKKwkJCX07CiAJCX07CiAKIAkJY3B1LW1hcCB7CkBAIC0yODksNiArMzQxLDEyOSBAQAogCQl9OwogCX07CiAKKwllbmVyZ3lfY29zdHM6IGVuZXJneS1jb3N0cyB7CisJCWNvbXBhdGlibGUgPSAic2NoZWQtZW5lcmd5IjsKKworCQlDUFVfQ09TVF8wOiBjb3JlLWNvc3QwIHsKKwkJCWJ1c3ktY29zdC1kYXRhID0gPAorCQkJCSAzMDAwMDAgICAgMTQKKwkJCQkgNDAzMjAwICAgIDE4CisJCQkJIDQ4MDAwMCAgICAyMQorCQkJCSA1NzYwMDAgICAgMjUKKwkJCQkgNjUyODAwICAgIDI3CisJCQkJIDc0ODgwMCAgICAzMQorCQkJCSA4MjU2MDAgICAgNDAKKwkJCQkgOTAyNDAwICAgIDQzCisJCQkJIDk3OTIwMCAgICA0NgorCQkJCTEwNTYwMDAgICAgNTAKKwkJCQkxMTMyODAwICAgIDUzCisJCQkJMTIyODgwMCAgICA1NworCQkJCTEzMjQ4MDAgICAgODQKKwkJCQkxNDIwODAwICAgIDkwCisJCQkJMTUxNjgwMCAgICA5NgorCQkJCTE2MTI4MDAgICAxMTQKKwkJCQkxNjg5NjAwICAgMTM1CisJCQkJMTc2NjQwMCAgIDE0MQorCQkJPjsKKwkJCWlkbGUtY29zdC1kYXRhID0gPAorCQkJCTEyIDEwIDggNgorCQkJPjsKKwkJfTsKKwkJQ1BVX0NPU1RfMTogY29yZS1jb3N0MSB7CisJCQlidXN5LWNvc3QtZGF0YSA9IDwKKwkJCQkgMzAwMDAwICAgIDI1NgorCQkJCSA0MDMyMDAgICAgMjcxCisJCQkJIDQ4MDAwMCAgICAyODIKKwkJCQkgNTc2MDAwICAgIDI5NgorCQkJCSA2NTI4MDAgICAgMzA3CisJCQkJIDc0ODgwMCAgICAzMjEKKwkJCQkgODI1NjAwICAgIDMzMgorCQkJCSA5MDI0MDAgICAgMzY5CisJCQkJIDk3OTIwMCAgICAzODIKKwkJCQkxMDU2MDAwICAgIDM5NQorCQkJCTExMzI4MDAgICAgNDA4CisJCQkJMTIwOTYwMCAgICA0MjEKKwkJCQkxMjg2NDAwICAgIDQzNAorCQkJCTEzNjMyMDAgICAgNDQ4CisJCQkJMTQ1OTIwMCAgICA1NjcKKwkJCQkxNTM2MDAwICAgIDU4NgorCQkJCTE2MTI4MDAgICAgNjA0CisJCQkJMTY4OTYwMCAgICA2MjIKKwkJCQkxNzY2NDAwICAgIDY0MQorCQkJCTE4NDMyMDAgICAgNjU5CisJCQkJMTkyMDAwMCAgICA2NzgKKwkJCQkxOTk2ODAwICAgIDY5NgorCQkJCTIwOTI4MDAgICAgODc2CisJCQkJMjE2OTYwMCAgICA5MDAKKwkJCQkyMjQ2NDAwICAgIDkyNAorCQkJCTIzMjMyMDAgICAgOTQ4CisJCQkJMjQwMDAwMCAgIDExNzAKKwkJCT47CisJCQlpZGxlLWNvc3QtZGF0YSA9IDwKKwkJCQkxMDAgODAgNjAgNDAKKwkJCT47CisJCX07CisJCUNMVVNURVJfQ09TVF8wOiBjbHVzdGVyLWNvc3QwIHsKKwkJCWJ1c3ktY29zdC1kYXRhID0gPAorCQkJCSAzMDAwMDAgICAgNQorCQkJCSA0MDMyMDAgICAgNworCQkJCSA0ODAwMDAgICAgNworCQkJCSA1NzYwMDAgICAgNworCQkJCSA2NTI4MDAgICAgOAorCQkJCSA3NDg4MDAgICAgOAorCQkJCSA4MjU2MDAgICAgOQorCQkJCSA5MDI0MDAgICAgOQorCQkJCSA5NzkyMDAgICAgOQorCQkJCTEwNTYwMDAgICAxMAorCQkJCTExMzI4MDAgICAxMAorCQkJCTEyMjg4MDAgICAxMAorCQkJCTEzMjQ4MDAgICAxMworCQkJCTE0MjA4MDAgICAxNAorCQkJCTE1MTY4MDAgICAxNQorCQkJCTE2MTI4MDAgICAxNgorCQkJCTE2ODk2MDAgICAxOQorCQkJCTE3NjY0MDAgICAxOQorCQkJPjsKKwkJCWlkbGUtY29zdC1kYXRhID0gPAorCQkJCTQgMyAyIDEKKwkJCT47CisJCX07CisJCUNMVVNURVJfQ09TVF8xOiBjbHVzdGVyLWNvc3QxIHsKKwkJCWJ1c3ktY29zdC1kYXRhID0gPAorCQkJCSAzMDAwMDAgICAgMjUKKwkJCQkgNDAzMjAwICAgIDI3CisJCQkJIDQ4MDAwMCAgICAyOAorCQkJCSA1NzYwMDAgICAgMjkKKwkJCQkgNjUyODAwICAgIDMwCisJCQkJIDc0ODgwMCAgICAzMgorCQkJCSA4MjU2MDAgICAgMzMKKwkJCQkgOTAyNDAwICAgIDM2CisJCQkJIDk3OTIwMCAgICAzOAorCQkJCTEwNTYwMDAgICAgMzkKKwkJCQkxMTMyODAwICAgIDQwCisJCQkJMTIwOTYwMCAgICA0MgorCQkJCTEyODY0MDAgICAgNDMKKwkJCQkxMzYzMjAwICAgIDQ0CisJCQkJMTQ1OTIwMCAgICA1NgorCQkJCTE1MzYwMDAgICAgNTgKKwkJCQkxNjEyODAwICAgIDYwCisJCQkJMTY4OTYwMCAgICA2MgorCQkJCTE3NjY0MDAgICAgNjQKKwkJCQkxODQzMjAwICAgIDY1CisJCQkJMTkyMDAwMCAgICA2NworCQkJCTE5OTY4MDAgICAgNjkKKwkJCQkyMDkyODAwICAgIDg3CisJCQkJMjE2OTYwMCAgICA5MAorCQkJCTIyNDY0MDAgICAgOTIKKwkJCQkyMzIzMjAwICAgIDk0CisJCQkJMjQwMDAwMCAgIDExNworCQkJPjsKKwkJCWlkbGUtY29zdC1kYXRhID0gPAorCQkJCTQgMyAyIDEKKwkJCT47CisJCX07CisJfTsKKwogCXBzY2kgewogCQljb21wYXRpYmxlID0gImFybSxwc2NpLTEuMCI7CiAJCW1ldGhvZCA9ICJzbWMiOwpAQCAtMzY3LDI0ICs1NDIsNiBAQAogCQkJcmVnID0gPDAgMHg5M2QwMDAwMCAwIDB4MWUwMDAwMD47CiAJCX07CiAKLQkJcGlsX2lwYV9md19tZW06IHBpbF9pcGFfZndfcmVnaW9uQDk1YjAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAicmVtb3ZlZC1kbWEtcG9vbCI7Ci0JCQluby1tYXA7Ci0JCQlyZWcgPSA8MCAweDk1YjAwMDAwIDAgMHgxMDAwMD47Ci0JCX07Ci0KLQkJcGlsX2lwYV9nc2lfbWVtOiBwaWxfaXBhX2dzaV9yZWdpb25AOTViMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJyZW1vdmVkLWRtYS1wb29sIjsKLQkJCW5vLW1hcDsKLQkJCXJlZyA9IDwwIDB4OTViMTAwMDAgMCAweDUwMDA+OwotCQl9OwotCi0JCXBpbF9ncHVfbWVtOiBwaWxfZ3B1X3JlZ2lvbkA5NWIxNTAwMCB7Ci0JCQljb21wYXRpYmxlID0gInJlbW92ZWQtZG1hLXBvb2wiOwotCQkJbm8tbWFwOwotCQkJcmVnID0gPDAgMHg5NWIxNTAwMCAwIDB4MTAwMD47Ci0JCX07Ci0KIAkJYWRzcF9tZW06IGFkc3BfcmVnaW9uIHsKIAkJCWNvbXBhdGlibGUgPSAic2hhcmVkLWRtYS1wb29sIjsKIAkJCWFsbG9jLXJhbmdlcyA9IDwwIDB4MDAwMDAwMDAgMCAweGZmZmZmZmZmPjsKQEAgLTQxNyw2ICs1NzQsMTIgQEAKIAkJCXNpemUgPSA8MCAweDVjMDAwMDA+OwogCQl9OwogCisJCWR1bXBfbWVtOiBtZW1fZHVtcF9yZWdpb24geworCQkJY29tcGF0aWJsZSA9ICJzaGFyZWQtZG1hLXBvb2wiOworCQkJcmV1c2FibGU7CisJCQlzaXplID0gPDAgMHgyNDAwMDAwPjsKKwkJfTsKKwogCQkvKiBnbG9iYWwgYXV0b2NvbmZpZ3VyZWQgcmVnaW9uIGZvciBjb250aWd1b3VzIGFsbG9jYXRpb25zICovCiAJCWxpbnV4LGNtYSB7CiAJCQljb21wYXRpYmxlID0gInNoYXJlZC1kbWEtcG9vbCI7CkBAIC00MzUsMTIgKzU5OCwxMDggQEAKIAogI2luY2x1ZGUgInNkbTY3MC1xdXB2My5kdHNpIgogCisjaW5jbHVkZSAic2RtNjcwLWNvcmVzaWdodC5kdHNpIgorCisjaW5jbHVkZSAic2RtNjcwLXZpZGMuZHRzaSIKKworI2luY2x1ZGUgInNkbTY3MC1zZGUtcGxsLmR0c2kiCisKKyNpbmNsdWRlICJzZG02NzAtc2RlLmR0c2kiCisKICZzb2MgewogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwogCXJhbmdlcyA9IDwwIDAgMCAweGZmZmZmZmZmPjsKIAljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwogCisJanRhZ19tbTA6IGp0YWdtbUA3MDQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGp0YWd2OC1tbSI7CisJCXJlZyA9IDwweDcwNDAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImV0bS1iYXNlIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImNvcmVfY2xrIjsKKworCQlxY29tLGNvcmVzaWdodC1qdGFnbW0tY3B1ID0gPCZDUFUwPjsKKwl9OworCisJanRhZ19tbTE6IGp0YWdtbUA3MTQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGp0YWd2OC1tbSI7CisJCXJlZyA9IDwweDcxNDAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImV0bS1iYXNlIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImNvcmVfY2xrIjsKKworCQlxb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTE+OworCX07CisKKwlqdGFnX21tMjoganRhZ21tQDcyNDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4NzI0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTI+OworCX07CisKKwlqdGFnX21tMzoganRhZ21tQDczNDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4NzM0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTM+OworCX07CisKKwlqdGFnX21tNDoganRhZ21tQDc0NDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4NzQ0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTQ+OworCX07CisKKwlqdGFnX21tNToganRhZ21tQDc1NDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4NzU0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTU+OworCX07CisKKwlqdGFnX21tNjoganRhZ21tQDc2NDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4NzY0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTY+OworCX07CisKKwlqdGFnX21tNzoganRhZ21tQDc3NDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sanRhZ3Y4LW1tIjsKKwkJcmVnID0gPDB4Nzc0MDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZXRtLWJhc2UiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiY29yZV9jbGsiOworCisJCXFjb20sY29yZXNpZ2h0LWp0YWdtbS1jcHUgPSA8JkNQVTc+OworCX07CisKIAlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckAxN2EwMDAwMCB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGdpYy12MyI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CkBAIC00NjcsMzAyICs3MjYsMTYgQEAKIAkJcWNvbSxwaXBlLWF0dHItZWU7CiAJfTsKIAotCXRoZXJtYWxfem9uZXM6IHRoZXJtYWwtem9uZXMgewotCQlhb3NzMC11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7Ci0JCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAwPjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJY3B1MC1zaWx2ZXItdXNyIHsKLQkJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKLQkJCXBvbGxpbmctZGVsYXkgPSA8MD47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMT47Ci0JCQl0cmlwcyB7Ci0JCQkJYWN0aXZlLWNvbmZpZzAgewotCQkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OwotCQkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OwotCQkJCQl0eXBlID0gInBhc3NpdmUiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWNwdTEtc2lsdmVyLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDI+OwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQljcHUyLXNpbHZlci11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7Ci0JCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCAzPjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJY3B1My1zaWx2ZXItdXNyIHsKLQkJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKLQkJCXBvbGxpbmctZGVsYXkgPSA8MD47Ci0JCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA0PjsKLQkJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7Ci0JCQl0cmlwcyB7Ci0JCQkJYWN0aXZlLWNvbmZpZzAgewotCQkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OwotCQkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OwotCQkJCQl0eXBlID0gInBhc3NpdmUiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWNwdTQtc2lsdmVyLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgNT47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQljcHU1LXNpbHZlci11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDY+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJa3J5by1sMy0wLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgNz47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlrcnlvLWwzLTEtdXNyIHsKLQkJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKLQkJCXBvbGxpbmctZGVsYXkgPSA8MD47Ci0JCQl0aGVybWFsLXNlbnNvcnMgPSA8JnRzZW5zMCA4PjsKLQkJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7Ci0JCQl0cmlwcyB7Ci0JCQkJYWN0aXZlLWNvbmZpZzAgewotCQkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OwotCQkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OwotCQkJCQl0eXBlID0gInBhc3NpdmUiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWNwdTAtZ29sZC11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDk+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJY3B1MS1nb2xkLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMTA+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJZ3B1MC11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMwIDExPjsKLQkJCXRoZXJtYWwtZ292ZXJub3IgPSAidXNlcl9zcGFjZSI7Ci0JCQl0cmlwcyB7Ci0JCQkJYWN0aXZlLWNvbmZpZzAgewotCQkJCQl0ZW1wZXJhdHVyZSA9IDwxMjUwMDA+OwotCQkJCQloeXN0ZXJlc2lzID0gPDEwMDA+OwotCQkJCQl0eXBlID0gInBhc3NpdmUiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWdwdTEtdXNyIHsKLQkJCXBvbGxpbmctZGVsYXktcGFzc2l2ZSA9IDwwPjsKLQkJCXBvbGxpbmctZGVsYXkgPSA8MD47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczAgMTI+OwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlhb3NzMS11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDA+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJbWRtLWRzcC11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDE+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJZGRyLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgMj47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQl3bGFuLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgMz47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQljb21wdXRlLWh2eC11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDQ+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJY2FtZXJhLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgNT47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQltbXNzLXVzciB7Ci0JCQlwb2xsaW5nLWRlbGF5LXBhc3NpdmUgPSA8MD47Ci0JCQlwb2xsaW5nLWRlbGF5ID0gPDA+OwotCQkJdGhlcm1hbC1zZW5zb3JzID0gPCZ0c2VuczEgNj47Ci0JCQl0aGVybWFsLWdvdmVybm9yID0gInVzZXJfc3BhY2UiOwotCQkJdHJpcHMgewotCQkJCWFjdGl2ZS1jb25maWcwIHsKLQkJCQkJdGVtcGVyYXR1cmUgPSA8MTI1MDAwPjsKLQkJCQkJaHlzdGVyZXNpcyA9IDwxMDAwPjsKLQkJCQkJdHlwZSA9ICJwYXNzaXZlIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQltZG0tY29yZS11c3IgewotCQkJcG9sbGluZy1kZWxheS1wYXNzaXZlID0gPDA+OwotCQkJcG9sbGluZy1kZWxheSA9IDwwPjsKLQkJCXRoZXJtYWwtc2Vuc29ycyA9IDwmdHNlbnMxIDc+OwotCQkJdGhlcm1hbC1nb3Zlcm5vciA9ICJ1c2VyX3NwYWNlIjsKLQkJCXRyaXBzIHsKLQkJCQlhY3RpdmUtY29uZmlnMCB7Ci0JCQkJCXRlbXBlcmF0dXJlID0gPDEyNTAwMD47Ci0JCQkJCWh5c3RlcmVzaXMgPSA8MTAwMD47Ci0JCQkJCXR5cGUgPSAicGFzc2l2ZSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07CisJcWNvbSxxYnQxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHFidDEwMDAiOworCQljbG9jay1uYW1lcyA9ICJjb3JlIiwgImlmYWNlIjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDI1MDAwMDAwPjsKKwkJcWNvbSxpcGMtZ3BpbyA9IDwmdGxtbSAxMjEgMD47CisJCXFjb20sZmluZ2VyLWRldGVjdC1ncGlvID0gPCZ0bG1tIDEyMiAwPjsKIAl9OwogCisJdGhlcm1hbF96b25lczogdGhlcm1hbC16b25lcyB7fTsKKwogCXRzZW5zMDogdHNlbnNAYzIyMjAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSx0c2VuczI0eHgiOwogCQlyZWcgPSA8MHhjMjIyMDAwIDB4ND4sCkBAIC04NTgsNTMgKzgzMSw5MCBAQAogCX07CiAKIAljbG9ja19ycG1oOiBxY29tLHJwbWhjbGsgewotCQljb21wYXRpYmxlID0gInFjb20sZHVtbXljYyI7Ci0JCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJycG1oX2Nsb2NrcyI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxycG1oLWNsay1zZG02NzAiOwogCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCW1ib3hlcyA9IDwmYXBwc19yc2MgMD47CisJCW1ib3gtbmFtZXMgPSAiYXBwcyI7CiAJfTsKIAogCWNsb2NrX2djYzogcWNvbSxnY2NAMTAwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJxY29tLGR1bW15Y2MiOwotCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiZ2NjX2Nsb2NrcyI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxnY2Mtc2RtNjcwIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDEwMDAwMCAweDFmMDAwMD47CisJCXJlZy1uYW1lcyA9ICJjY19iYXNlIjsKKwkJdmRkX2N4LXN1cHBseSA9IDwmcG02NjBsX3MzX2xldmVsPjsKKwkJdmRkX2N4X2FvLXN1cHBseSA9IDwmcG02NjBsX3MzX2xldmVsX2FvPjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OwogCQkjcmVzZXQtY2VsbHMgPSA8MT47CiAJfTsKIAogCWNsb2NrX3ZpZGVvY2M6IHFjb20sdmlkZW9jY0BhYjAwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJxY29tLGR1bW15Y2MiOwotCQljbG9jay1vdXRwdXQtbmFtZXMgPSAidmlkZW9jY19jbG9ja3MiOworCQljb21wYXRpYmxlID0gInFjb20sdmlkZW9fY2Mtc2RtNjcwIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweGFiMDAwMDAgMHgxMDAwMD47CisJCXJlZy1uYW1lcyA9ICJjY19iYXNlIjsKKwkJdmRkX2N4LXN1cHBseSA9IDwmcG02NjBsX3MzX2xldmVsPjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OwogCQkjcmVzZXQtY2VsbHMgPSA8MT47CiAJfTsKIAogCWNsb2NrX2NhbWNjOiBxY29tLGNhbWNjQGFkMDAwMDAgewotCQljb21wYXRpYmxlID0gInFjb20sZHVtbXljYyI7Ci0JCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjYW1jY19jbG9ja3MiOworCQljb21wYXRpYmxlID0gInFjb20sY2FtX2NjLXNkbTY3MCIsICJzeXNjb24iOworCQlyZWcgPSA8MHhhZDAwMDAwIDB4MTAwMDA+OworCQlyZWctbmFtZXMgPSAiY2NfYmFzZSI7CisJCXZkZF9jeC1zdXBwbHkgPSA8JnBtNjYwbF9zM19sZXZlbD47CisJCXZkZF9teC1zdXBwbHkgPSA8JnBtNjYwbF9zMV9sZXZlbD47CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKIAkJI3Jlc2V0LWNlbGxzID0gPDE+OwogCX07CiAKIAljbG9ja19kaXNwY2M6IHFjb20sZGlzcGNjQGFmMDAwMDAgewotCQljb21wYXRpYmxlID0gInFjb20sZHVtbXljYyI7Ci0JCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJkaXNwY2NfY2xvY2tzIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRpc3BjYy1zZG02NzAiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4YWYwMDAwMCAweDEwMDAwPjsKKwkJcmVnLW5hbWVzID0gImNjX2Jhc2UiOworCQl2ZGRfY3gtc3VwcGx5ID0gPCZwbTY2MGxfczNfbGV2ZWw+OwogCQkjY2xvY2stY2VsbHMgPSA8MT47CiAJCSNyZXNldC1jZWxscyA9IDwxPjsKIAl9OwogCiAJY2xvY2tfZ3B1Y2M6IHFjb20sZ3B1Y2NANTA5MDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxkdW1teWNjIjsKLQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImdwdWNjX2Nsb2NrcyI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxncHVjYy1zZG02NzAiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4NTA5MDAwMCAweDkwMDA+OworCQlyZWctbmFtZXMgPSAiY2NfYmFzZSI7CisJCXZkZF9jeC1zdXBwbHkgPSA8JnBtNjYwbF9zM19sZXZlbD47CisJCXZkZF9teC1zdXBwbHkgPSA8JnBtNjYwbF9zMV9sZXZlbD47CisJCXFjb20sZ3B1X2NjX2dtdV9jbGtfc3JjLW9wcC1oYW5kbGUgPSA8JmdtdT47CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKIAkJI3Jlc2V0LWNlbGxzID0gPDE+OwogCX07CiAKIAljbG9ja19nZng6IHFjb20sZ2Z4Y2NANTA5MDAwMCAgewotCQljb21wYXRpYmxlID0gInFjb20sZHVtbXljYyI7Ci0JCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJnZnhjY19jbG9ja3MiOworCQljb21wYXRpYmxlID0gInFjb20sZ2Z4Y2Mtc2RtNjcwIjsKKwkJcmVnID0gPDB4NTA5MDAwMCAweDkwMDA+OworCQlyZWctbmFtZXMgPSAiY2NfYmFzZSI7CisJCXZkZF9nZngtc3VwcGx5ID0gPCZwbTY2MGxfczJfbGV2ZWw+OworCQlxY29tLGdwdV9jY19neF9nZngzZF9jbGtfc3JjLW9wcC1oYW5kbGUgPSA8Jm1zbV9ncHU+OwogCQkjY2xvY2stY2VsbHMgPSA8MT47CiAJCSNyZXNldC1jZWxscyA9IDwxPjsKIAl9OwogCisJY3B1Y2NfZGVidWc6IHN5c2NvbkAxNzk3MDAxOCB7CisJCWNvbXBhdGlibGUgPSAic3lzY29uIjsKKwkJcmVnID0gPDB4MTc5NzAwMTggMHg0PjsKKwl9OworCisJY2xvY2tfZGVidWc6IHFjb20sY2MtZGVidWcgeworCQljb21wYXRpYmxlID0gInFjb20sZGVidWdjYy1zZG04NDUiOworCQlxY29tLGNjLWNvdW50ID0gPDU+OworCQlxY29tLGdjYyA9IDwmY2xvY2tfZ2NjPjsKKwkJcWNvbSx2aWRlb2NjID0gPCZjbG9ja192aWRlb2NjPjsKKwkJcWNvbSxjYW1jYyA9IDwmY2xvY2tfY2FtY2M+OworCQlxY29tLGRpc3BjYyA9IDwmY2xvY2tfZGlzcGNjPjsKKwkJcWNvbSxncHVjYyA9IDwmY2xvY2tfZ3B1Y2M+OworCQlxY29tLGNwdWNjID0gPCZjcHVjY19kZWJ1Zz47CisJCWNsb2NrLW5hbWVzID0gInhvX2Nsa19zcmMiOworCQljbG9ja3MgPSA8JmNsb2NrX3JwbWggUlBNSF9DWE9fQ0xLPjsKKwkJI2Nsb2NrLWNlbGxzID0gPDE+OworCX07CisKIAljbG9ja19jcHVjYzogcWNvbSxjcHVjYyB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxkdW1teWNjIjsKIAkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNwdWNjX2Nsb2NrcyI7CkBAIC05MTMsNyArOTIzLDcgQEAKIAl9OwogCiAJY2xvY2tfYW9wOiBxY29tLGFvcGNsayB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxhb3AtcW1wLWNsay12MiI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxhb3AtcW1wLWNsay12MSI7CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKIAkJbWJveGVzID0gPCZxbXBfYW9wIDA+OwogCQltYm94LW5hbWVzID0gInFkc3NfY2xrIjsKQEAgLTkzMCw2ICs5NDAsMTYgQEAKIAkJcWNvbSxhcHBzLWNoLXBpcGVzID0gPDB4NzgwMDAwPjsKIAkJcWNvbSxlYS1wYyA9IDwweDI5MD47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCXFjb20saW9tbXUtczEtYnlwYXNzOworCisJCWlvbW11X3NsaW1fYXVkX2N0cmxfY2I6IHFjb20saW9tbXVfc2xpbV9jdHJsX2NiIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxpb21tdS1zbGltLWN0cmwtY2IiOworCQkJaW9tbXVzID0gPCZhcHBzX3NtbXUgMHgxODI2IDB4MD4sCisJCQkJIDwmYXBwc19zbW11IDB4MTgyZCAweDA+LAorCQkJCSA8JmFwcHNfc21tdSAweDE4MmUgMHgxPiwKKwkJCQkgPCZhcHBzX3NtbXUgMHgxODMwIDB4MT47CisJCX07CisKIAl9OwogCiAJc2xpbV9xY2E6IHNsaW1ANjJlNDAwMDAgewpAQCAtOTQxLDYgKzk2MSwxMyBAQAogCQlpbnRlcnJ1cHRzID0gPDAgMjkxIDA+LCA8MCAyOTIgMD47CiAJCWludGVycnVwdC1uYW1lcyA9ICJzbGltYnVzX2lycSIsICJzbGltYnVzX2JhbV9pcnEiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlxY29tLGlvbW11LXMxLWJ5cGFzczsKKworCQlpb21tdV9zbGltX3FjYV9jdHJsX2NiOiBxY29tLGlvbW11X3NsaW1fY3RybF9jYiB7CisJCQljb21wYXRpYmxlID0gInFjb20saW9tbXUtc2xpbS1jdHJsLWNiIjsKKwkJCWlvbW11cyA9IDwmYXBwc19zbW11IDB4MTgzMyAweDA+OworCQl9OworCiAJfTsKIAogCXdkb2c6IHFjb20sd2R0QDE3OTgwMDAwewpAQCAtOTg1LDYgKzEwMTIsMTYgQEAKIAkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20taW1lbS1rYXNscl9vZmZzZXQiOwogCQkJcmVnID0gPDB4NmQwIDEyPjsKIAkJfTsKKworCQlib290X3N0YXRzQDZiMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWltZW0tYm9vdF9zdGF0cyI7CisJCQlyZWcgPSA8MHg2YjAgMHgyMD47CisJCX07CisKKwkJZGlhZ19kbG9hZEBjOCB7CisJCQljb21wYXRpYmxlID0gInFjb20sbXNtLWltZW0tZGlhZy1kbG9hZCI7CisJCQlyZWcgPSA8MHhjOCAweGM4PjsKKwkJfTsKIAl9OwogCiAJZ3BpX2RtYTA6IHFjb20sZ3BpLWRtYUAweDgwMDAwMCB7CkBAIC0xMDI1LDMxICsxMDYyLDMxIEBACiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfSV8wPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDYwPjsKIAkJfTsKLQkJcWNvbSxsMV9pX2NhY2hlMSB7CisJCXFjb20sbDFfaV9jYWNoZTEwMCB7CiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfSV8xMDA+OwogCQkJcWNvbSxkdW1wLWlkID0gPDB4NjE+OwogCQl9OwotCQlxY29tLGwxX2lfY2FjaGUyIHsKKwkJcWNvbSxsMV9pX2NhY2hlMjAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzIwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg2Mj47CiAJCX07Ci0JCXFjb20sbDFfaV9jYWNoZTMgeworCQlxY29tLGwxX2lfY2FjaGUzMDAgewogCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0lfMzAwPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDYzPjsKIAkJfTsKLQkJcWNvbSxsMV9pX2NhY2hlMTAwIHsKKwkJcWNvbSxsMV9pX2NhY2hlNDAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzQwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg2ND47CiAJCX07Ci0JCXFjb20sbDFfaV9jYWNoZTEwMSB7CisJCXFjb20sbDFfaV9jYWNoZTUwMCB7CiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfSV81MDA+OwogCQkJcWNvbSxkdW1wLWlkID0gPDB4NjU+OwogCQl9OwotCQlxY29tLGwxX2lfY2FjaGUxMDIgeworCQlxY29tLGwxX2lfY2FjaGU2MDAgewogCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0lfNjAwPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDY2PjsKIAkJfTsKLQkJcWNvbSxsMV9pX2NhY2hlMTAzIHsKKwkJcWNvbSxsMV9pX2NhY2hlNzAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9JXzcwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg2Nz47CiAJCX07CkBAIC0xMDU3LDMxICsxMDk0LDMxIEBACiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8wPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDgwPjsKIAkJfTsKLQkJcWNvbSxsMV9kX2NhY2hlMSB7CisJCXFjb20sbDFfZF9jYWNoZTEwMCB7CiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF8xMDA+OwogCQkJcWNvbSxkdW1wLWlkID0gPDB4ODE+OwogCQl9OwotCQlxY29tLGwxX2RfY2FjaGUyIHsKKwkJcWNvbSxsMV9kX2NhY2hlMjAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9EXzIwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg4Mj47CiAJCX07Ci0JCXFjb20sbDFfZF9jYWNoZTMgeworCQlxY29tLGwxX2RfY2FjaGUzMDAgewogCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0RfMzAwPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDgzPjsKIAkJfTsKLQkJcWNvbSxsMV9kX2NhY2hlMTAwIHsKKwkJcWNvbSxsMV9kX2NhY2hlNDAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9EXzQwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg4ND47CiAJCX07Ci0JCXFjb20sbDFfZF9jYWNoZTEwMSB7CisJCXFjb20sbDFfZF9jYWNoZTUwMCB7CiAJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfRF81MDA+OwogCQkJcWNvbSxkdW1wLWlkID0gPDB4ODU+OwogCQl9OwotCQlxY29tLGwxX2RfY2FjaGUxMDIgeworCQlxY29tLGwxX2RfY2FjaGU2MDAgewogCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX0RfNjAwPjsKIAkJCXFjb20sZHVtcC1pZCA9IDwweDg2PjsKIAkJfTsKLQkJcWNvbSxsMV9kX2NhY2hlMTAzIHsKKwkJcWNvbSxsMV9kX2NhY2hlNzAwIHsKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9EXzcwMD47CiAJCQlxY29tLGR1bXAtaWQgPSA8MHg4Nz47CiAJCX07CkBAIC0xMDkzLDYgKzExMzAsOTMgQEAKIAkJCXFjb20sZHVtcC1ub2RlID0gPCZMTENDXzI+OwogCQkJcWNvbSxkdW1wLWlkID0gPDB4MTQxPjsKIAkJfTsKKwkJcWNvbSxsMV90bGJfZHVtcDAgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX1RMQl8wPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDIwPjsKKwkJfTsKKwkJcWNvbSxsMV90bGJfZHVtcDEwMCB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfVExCXzEwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHgyMT47CisJCX07CisJCXFjb20sbDFfdGxiX2R1bXAyMDAgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX1RMQl8yMDA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4MjI+OworCQl9OworCQlxY29tLGwxX3RsYl9kdW1wMzAwIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9UTEJfMzAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDIzPjsKKwkJfTsKKwkJcWNvbSxsMV90bGJfZHVtcDQwMCB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfVExCXzQwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHgyND47CisJCX07CisJCXFjb20sbDFfdGxiX2R1bXA1MDAgeworCQkJcWNvbSxkdW1wLW5vZGUgPSA8JkwxX1RMQl81MDA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4MjU+OworCQl9OworCQlxY29tLGwxX3RsYl9kdW1wNjAwIHsKKwkJCXFjb20sZHVtcC1ub2RlID0gPCZMMV9UTEJfNjAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDI2PjsKKwkJfTsKKwkJcWNvbSxsMV90bGJfZHVtcDcwMCB7CisJCQlxY29tLGR1bXAtbm9kZSA9IDwmTDFfVExCXzcwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHgyNz47CisJCX07CisJfTsKKworCW1lbV9kdW1wIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1lbS1kdW1wIjsKKwkJbWVtb3J5LXJlZ2lvbiA9IDwmZHVtcF9tZW0+OworCisJCXJwbWhfZHVtcCB7CisJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDIwMDAwMDA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4ZWM+OworCQl9OworCisJCXJwbV9zd19kdW1wIHsKKwkJCXFjb20sZHVtcC1zaXplID0gPDB4MjgwMDA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4ZWE+OworCQl9OworCisJCXBtaWNfZHVtcCB7CisJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDEwMDAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweGU0PjsKKwkJfTsKKworCQl0bWNfZXRmX2R1bXAgeworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMDAwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHhmMD47CisJCX07CisKKwkJdG1jX2V0Zl9zd2FvX2R1bXAgeworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHg4NDAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweGYxPjsKKwkJfTsKKworCQl0bWNfZXRyX3JlZ19kdW1wIHsKKwkJCXFjb20sZHVtcC1zaXplID0gPDB4MTAwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHgxMDA+OworCQl9OworCisJCXRtY19ldGZfcmVnX2R1bXAgeworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMDAwPjsKKwkJCXFjb20sZHVtcC1pZCA9IDwweDEwMT47CisJCX07CisKKwkJdG1jX2V0Zl9zd2FvX3JlZ19kdW1wIHsKKwkJCXFjb20sZHVtcC1zaXplID0gPDB4MTAwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHgxMDI+OworCQl9OworCisJCW1pc2NfZGF0YV9kdW1wIHsKKwkJCXFjb20sZHVtcC1zaXplID0gPDB4MTAwMD47CisJCQlxY29tLGR1bXAtaWQgPSA8MHhlOD47CisJCX07CisKKwkJcG93ZXJfcmVnc19kYXRhX2R1bXAgeworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMDAwMDA+OworCQkJcWNvbSxkdW1wLWlkID0gPDB4ZWQ+OworCQl9OwogCX07CiAKIAlrcnlvM3h4LWVycCB7CkBAIC0xMzU3LDYgKzE0ODEsMTUgQEAKIAkJaW50ZXJydXB0cyA9IDwwIDE3IDA+OwogCX07CiAKKwlldWQ6IHFjb20sbXNtLWV1ZEA4OGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1ldWQiOworCQlpbnRlcnJ1cHQtbmFtZXMgPSAiZXVkX2lycSI7CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSA0OTIgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCXJlZyA9IDwweDg4ZTAwMDAgMHgyMDAwPjsKKwkJcmVnLW5hbWVzID0gImV1ZF9iYXNlIjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCiAJcWNvbSxsbGNjQDExMDAwMDAgewogCQljb21wYXRpYmxlID0gInFjb20sbGxjYy1jb3JlIiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKIAkJcmVnID0gPDB4MTEwMDAwMCAweDI1MDAwMD47CkBAIC0xNDMxLDYgKzE1NjQsOCBAQAogCQlyZWcgPSA8MHgxMGEyMDAwIDB4MTAwMD4sCiAJCSAgICAgIDwweDEwYWUwMDAgMHgyMDAwPjsKIAkJcmVnLW5hbWVzID0gImRjYy1iYXNlIiwgImRjYy1yYW0tYmFzZSI7CisKKwkJZGNjLXJhbS1vZmZzZXQgPSA8MHg2MDAwPjsKIAl9OwogCiAJc3BtaV9idXM6IHFjb20sc3BtaUBjNDQwMDAwIHsKQEAgLTE1MDcsNiArMTY0Miw0NCBAQAogCQkJPDAgMD4sCiAJCQk8MCAwPjsKIAorCQlxY29tLG1zbS1idXMsbmFtZSA9ICJ1ZnNoY19tZW0iOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDEyPjsKKwkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwyPjsKKwkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9CisJCS8qCisJCSAqIER1cmluZyBIUyBHMyBVRlMgcnVucyBhdCBub21pbmFsIHZvbHRhZ2UgY29ybmVyLCB2b3RlCisJCSAqIGhpZ2hlciBiYW5kd2lkdGggdG8gcHVzaCBvdGhlciBidXNlcyBpbiB0aGUgZGF0YSBwYXRoCisJCSAqIHRvIHJ1biBhdCBub21pbmFsIHRvIGFjaGlldmUgbWF4IHRocm91Z2hwdXQuCisJCSAqIDRHQnBzIHB1c2hlcyBCSU1DIHRvIHJ1biBhdCBub21pbmFsLgorCQkgKiAyMDBNQnBzIHB1c2hlcyBDTk9DIHRvIHJ1biBhdCBub21pbmFsLgorCQkgKiBWb3RlIGZvciBoYWxmIG9mIHRoaXMgYmFuZHdpZHRoIGZvciBIUyBHMyAxLWxhbmUuCisJCSAqIEZvciBtYXggYmFuZHdpZHRoLCB2b3RlIGhpZ2ggZW5vdWdoIHRvIHB1c2ggdGhlIGJ1c2VzCisJCSAqIHRvIHJ1biBpbiB0dXJibyB2b2x0YWdlIGNvcm5lci4KKwkJICovCisJCTwxMjMgNTEyIDAgMD4sIDwxIDc1NyAwIDA+LCAgICAgICAgICAvKiBObyB2b3RlICovCisJCTwxMjMgNTEyIDkyMiAwPiwgPDEgNzU3IDEwMDAgMD4sICAgICAvKiBQV00gRzEgKi8KKwkJPDEyMyA1MTIgMTg0NCAwPiwgPDEgNzU3IDEwMDAgMD4sICAgIC8qIFBXTSBHMiAqLworCQk8MTIzIDUxMiAzNjg4IDA+LCA8MSA3NTcgMTAwMCAwPiwgICAgLyogUFdNIEczICovCisJCTwxMjMgNTEyIDczNzYgMD4sIDwxIDc1NyAxMDAwIDA+LCAgICAvKiBQV00gRzQgKi8KKwkJPDEyMyA1MTIgMTI3Nzk2IDA+LCA8MSA3NTcgMTAwMCAwPiwgIC8qIEhTIEcxIFJBICovCisJCTwxMjMgNTEyIDI1NTU5MSAwPiwgPDEgNzU3IDEwMDAgMD4sICAvKiBIUyBHMiBSQSAqLworCQk8MTIzIDUxMiAyMDk3MTUyIDA+LCA8MSA3NTcgMTAyNDAwIDA+LCAgLyogSFMgRzMgUkEgKi8KKwkJPDEyMyA1MTIgMTQ5NDIyIDA+LCA8MSA3NTcgMTAwMCAwPiwgIC8qIEhTIEcxIFJCICovCisJCTwxMjMgNTEyIDI5ODE4OSAwPiwgPDEgNzU3IDEwMDAgMD4sICAvKiBIUyBHMiBSQiAqLworCQk8MTIzIDUxMiAyMDk3MTUyIDA+LCA8MSA3NTcgMTAyNDAwIDA+LCAgLyogSFMgRzMgUkIgKi8KKwkJPDEyMyA1MTIgNzY0MzEzNiAwPiwgPDEgNzU3IDMwNzIwMCAwPjsgLyogTWF4LiBiYW5kd2lkdGggKi8KKworCQlxY29tLGJ1cy12ZWN0b3ItbmFtZXMgPSAiTUlOIiwKKwkJIlBXTV9HMV9MMSIsICJQV01fRzJfTDEiLCAiUFdNX0czX0wxIiwgIlBXTV9HNF9MMSIsCisJCSJIU19SQV9HMV9MMSIsICJIU19SQV9HMl9MMSIsICJIU19SQV9HM19MMSIsCisJCSJIU19SQl9HMV9MMSIsICJIU19SQl9HMl9MMSIsICJIU19SQl9HM19MMSIsCisJCSJNQVgiOworCisJCS8qIFBNIFFvUyAqLworCQlxY29tLHBtLXFvcy1jcHUtZ3JvdXBzID0gPDB4M2YgMHhDMD47CisJCXFjb20scG0tcW9zLWNwdS1ncm91cC1sYXRlbmN5LXVzID0gPDcwIDcwPjsKKwkJcWNvbSxwbS1xb3MtZGVmYXVsdC1jcHUgPSA8MD47CisKIAkJcmVzZXRzID0gPCZjbG9ja19nY2MgR0NDX1VGU19QSFlfQkNSPjsKIAkJcmVzZXQtbmFtZXMgPSAiY29yZV9yZXNldCI7CiAKQEAgLTE1NDUsNiArMTcxOCwxMyBAQAogCQlzdGF0dXMgPSAib2siOwogCX07CiAKKwlxY29tLHJtdGZzX3NoYXJlZG1lbUAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHNoYXJlZG1lbS11aW8iOworCQlyZWcgPSA8MHgwIDB4MjAwMDAwPjsKKwkJcmVnLW5hbWVzID0gInJtdGZzIjsKKwkJcWNvbSxjbGllbnQtaWQgPSA8MHgwMDAwMDAwMT47CisJfTsKKwogCXFjb20scm1uZXQtaXBhIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLHJtbmV0LWlwYTMiOwogCQlxY29tLHJtbmV0LWlwYS1zc3I7CkBAIC0xNTg1LDE3ICsxNzY1LDE3IEBACiAJCQk8OTAgNTEyIDgwMDAwIDY0MDAwMD4sCiAJCQk8OTAgNTg1IDgwMDAwIDY0MDAwMD4sCiAJCQk8MSA2NzYgODAwMDAgODAwMDA+LAotCQkJPDE0MyA3NzcgMCAxNTAwMDA+LAorCQkJPDE0MyA3NzcgMCAxNTA+LCAvKiBJQiBkZWZpbmVkIGZvciBJUEEgY2xrIGluIE1IeiovCiAJCS8qIE5PTUlOQUwgKi8KIAkJCTw5MCA1MTIgMjA2MDAwIDk2MDAwMD4sCiAJCQk8OTAgNTg1IDIwNjAwMCA5NjAwMDA+LAogCQkJPDEgNjc2IDIwNjAwMCAxNjAwMDA+LAotCQkJPDE0MyA3NzcgMCAzMDAwMDA+LAorCQkJPDE0MyA3NzcgMCAzMDA+LCAvKiBJQiBkZWZpbmVkIGZvciBJUEEgY2xrIGluIE1IeiovCiAJCS8qIFRVUkJPICovCiAJCQk8OTAgNTEyIDIwNjAwMCAzNjAwMDAwPiwKIAkJCTw5MCA1ODUgMjA2MDAwIDM2MDAwMDA+LAogCQkJPDEgNjc2IDIwNjAwMCAzMDAwMDA+LAotCQkJPDE0MyA3NzcgMCAzNTUzMzM+OworCQkJPDE0MyA3NzcgMCAzNTU+OyAvKiBJQiBkZWZpbmVkIGZvciBJUEEgY2xrIGluIE1IeiovCiAJCXFjb20sYnVzLXZlY3Rvci1uYW1lcyA9ICJNSU4iLCAiU1ZTIiwgIk5PTUlOQUwiLCAiVFVSQk8iOwogCiAJCS8qIElQQSBSQU0gbW1hcCAqLwpAQCAtMTc1MCw2ICsxOTMwLDcgQEAKIAkJcWNvbSxzc2N0bC1pbnN0YW5jZS1pZCA9IDwweDEyPjsKIAkJcWNvbSxvdmVycmlkZS1hY2M7CiAJCXFjb20scWRzcDZ2NjUtMS0wOworCQlxY29tLG1zc19wZGNfb2Zmc2V0ID0gPDg+OwogCQlzdGF0dXMgPSAib2siOwogCQltZW1vcnktcmVnaW9uID0gPCZwaWxfbW9kZW1fbWVtPjsKIAkJcWNvbSxtZW0tcHJvdGVjdC1pZCA9IDwweEY+OwpAQCAtMTgzOCw5ICsyMDE5LDU4IEBACiAJCXFjb20sYnVzLXdpZHRoID0gPDg+OwogCQlxY29tLGxhcmdlLWFkZHJlc3MtYnVzOwogCisJCXFjb20sY2xrLXJhdGVzID0gPDQwMDAwMCAyMDAwMDAwMCAyNTAwMDAwMCA1MDAwMDAwMCAxMDAwMDAwMDAKKwkJCQkJCTE5MjAwMDAwMCAzODQwMDAwMDA+OworCQlxY29tLGJ1cy1zcGVlZC1tb2RlID0gIkhTNDAwXzFwOHYiLCAiSFMyMDBfMXA4diIsICJERFJfMXA4diI7CisKKwkJcWNvbSxkZXZmcmVxLGZyZXEtdGFibGUgPSA8NTAwMDAwMDAgMjAwMDAwMDAwPjsKKworCQlxY29tLG1zbS1idXMsbmFtZSA9ICJzZGhjMSI7CisJCXFjb20sbXNtLWJ1cyxudW0tY2FzZXMgPSA8OT47CisJCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8Mj47CisJCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQorCQkJLyogTm8gdm90ZSAqLworCQkJPDc4IDUxMiAwIDA+LCA8MSA2MDYgMCAwPiwKKwkJCS8qIDQwMCBLQi9zKi8KKwkJCTw3OCA1MTIgMTA0NiAxNjAwPiwKKwkJCTwxIDYwNiAxNjAwIDE2MDA+LAorCQkJLyogMjAgTUIvcyAqLworCQkJPDc4IDUxMiA1MjI4NiA4MDAwMD4sCisJCQk8MSA2MDYgODAwMDAgODAwMDA+LAorCQkJLyogMjUgTUIvcyAqLworCQkJPDc4IDUxMiA2NTM2MCAxMDAwMDA+LAorCQkJPDEgNjA2IDEwMDAwMCAxMDAwMDA+LAorCQkJLyogNTAgTUIvcyAqLworCQkJPDc4IDUxMiAxMzA3MTggMjAwMDAwPiwKKwkJCTwxIDYwNiAxMzMzMjAgMTMzMzIwPiwKKwkJCS8qIDEwMCBNQi9zICovCisJCQk8NzggNTEyIDEzMDcxOCAyMDAwMDA+LAorCQkJPDEgNjA2IDE1MDAwMCAxNTAwMDA+LAorCQkJLyogMjAwIE1CL3MgKi8KKwkJCTw3OCA1MTIgMjYxNDM4IDQwMDAwMD4sCisJCQk8MSA2MDYgMzAwMDAwIDMwMDAwMD4sCisJCQkvKiA0MDAgTUIvcyAqLworCQkJPDc4IDUxMiAyNjE0MzggNDAwMDAwPiwKKwkJCTwxIDYwNiAzMDAwMDAgMzAwMDAwPiwKKwkJCS8qIE1heC4gYmFuZHdpZHRoICovCisJCQk8NzggNTEyIDEzMzg1NjIgNDA5NjAwMD4sCisJCQk8MSA2MDYgMTMzODU2MiA0MDk2MDAwPjsKKwkJcWNvbSxidXMtYnctdmVjdG9ycy1icHMgPSA8MCA0MDAwMDAgMjAwMDAwMDAgMjUwMDAwMDAgNTAwMDAwMDAKKwkJCTEwMDAwMDAwMCAyMDAwMDAwMDAgNDAwMDAwMDAwIDQyOTQ5NjcyOTU+OworCisJCS8qIFBNIFFvUyAqLworCQlxY29tLHBtLXFvcy1pcnEtdHlwZSA9ICJhZmZpbmVfaXJxIjsKKwkJcWNvbSxwbS1xb3MtaXJxLWxhdGVuY3kgPSA8NzAgNzA+OworCQlxY29tLHBtLXFvcy1jcHUtZ3JvdXBzID0gPDB4M2YgMHhjMD47CisJCXFjb20scG0tcW9zLWNtZHEtbGF0ZW5jeS11cyA9IDw3MCA3MD4sIDw3MCA3MD47CisJCXFjb20scG0tcW9zLWxlZ2FjeS1sYXRlbmN5LXVzID0gPDcwIDcwPiwgPDcwIDcwPjsKKwogCQljbG9ja3MgPSA8JmNsb2NrX2djYyBHQ0NfU0RDQzFfQUhCX0NMSz4sCi0JCQk8JmNsb2NrX2djYyBHQ0NfU0RDQzFfQVBQU19DTEs+OwotCQljbG9jay1uYW1lcyA9ICJpZmFjZV9jbGsiLCAiY29yZV9jbGsiOworCQkJPCZjbG9ja19nY2MgR0NDX1NEQ0MxX0FQUFNfQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19TRENDMV9JQ0VfQ09SRV9DTEs+OworCQljbG9jay1uYW1lcyA9ICJpZmFjZV9jbGsiLCAiY29yZV9jbGsiLCAiaWNlX2NvcmVfY2xrIjsKKworCQlxY29tLGljZS1jbGstcmF0ZXMgPSA8MzAwMDAwMDAwIDc1MDAwMDAwPjsKIAogCQlxY29tLG5vbnJlbW92YWJsZTsKIApAQCAtMTg0OCw2ICsyMDc4LDY3IEBACiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIAorCXNkaGNfMjogc2RoY2lAODgwNDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxzZGhjaS1tc20tdjUiOworCQlyZWcgPSA8MHg4ODA0MDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJoY19tZW0iOworCisJCWludGVycnVwdHMgPSA8MCAyMDQgMD4sIDwwIDIyMiAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImhjX2lycSIsICJwd3JfaXJxIjsKKworCQlxY29tLGJ1cy13aWR0aCA9IDw0PjsKKwkJcWNvbSxsYXJnZS1hZGRyZXNzLWJ1czsKKworCQlxY29tLGNsay1yYXRlcyA9IDw0MDAwMDAgMjAwMDAwMDAgMjUwMDAwMDAKKwkJCQkJNTAwMDAwMDAgMTAwMDAwMDAwIDIwMTUwMDAwMD47CisJCXFjb20sYnVzLXNwZWVkLW1vZGUgPSAiU0RSMTIiLCAiU0RSMjUiLCAiU0RSNTAiLCAiRERSNTAiLAorCQkJCSAgICAgICJTRFIxMDQiOworCisJCXFjb20sZGV2ZnJlcSxmcmVxLXRhYmxlID0gPDUwMDAwMDAwIDIwMTUwMDAwMD47CisKKwkJcWNvbSxtc20tYnVzLG5hbWUgPSAic2RoYzIiOworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDg+OworCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDI+OworCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KKwkJCS8qIE5vIHZvdGUgKi8KKwkJCTw4MSA1MTIgMCAwPiwgPDEgNjA4IDAgMD4sCisJCQkvKiA0MDAgS0IvcyovCisJCQk8ODEgNTEyIDEwNDYgMTYwMD4sCisJCQk8MSA2MDggMTYwMCAxNjAwPiwKKwkJCS8qIDIwIE1CL3MgKi8KKwkJCTw4MSA1MTIgNTIyODYgODAwMDA+LAorCQkJPDEgNjA4IDgwMDAwIDgwMDAwPiwKKwkJCS8qIDI1IE1CL3MgKi8KKwkJCTw4MSA1MTIgNjUzNjAgMTAwMDAwPiwKKwkJCTwxIDYwOCAxMDAwMDAgMTAwMDAwPiwKKwkJCS8qIDUwIE1CL3MgKi8KKwkJCTw4MSA1MTIgMTMwNzE4IDIwMDAwMD4sCisJCQk8MSA2MDggMTMzMzIwIDEzMzMyMD4sCisJCQkvKiAxMDAgTUIvcyAqLworCQkJPDgxIDUxMiAyNjE0MzggMjAwMDAwPiwKKwkJCTwxIDYwOCAxNTAwMDAgMTUwMDAwPiwKKwkJCS8qIDIwMCBNQi9zICovCisJCQk8ODEgNTEyIDI2MTQzOCA0MDAwMDA+LAorCQkJPDEgNjA4IDMwMDAwMCAzMDAwMDA+LAorCQkJLyogTWF4LiBiYW5kd2lkdGggKi8KKwkJCTw4MSA1MTIgMTMzODU2MiA0MDk2MDAwPiwKKwkJCTwxIDYwOCAxMzM4NTYyIDQwOTYwMDA+OworCQlxY29tLGJ1cy1idy12ZWN0b3JzLWJwcyA9IDwwIDQwMDAwMCAyMDAwMDAwMCAyNTAwMDAwMCA1MDAwMDAwMAorCQkJMTAwMDAwMDAwIDIwMDAwMDAwMCA0Mjk0OTY3Mjk1PjsKKworCQkvKiBQTSBRb1MgKi8KKwkJcWNvbSxwbS1xb3MtaXJxLXR5cGUgPSAiYWZmaW5lX2lycSI7CisJCXFjb20scG0tcW9zLWlycS1sYXRlbmN5ID0gPDcwIDcwPjsKKwkJcWNvbSxwbS1xb3MtY3B1LWdyb3VwcyA9IDwweDNmIDB4YzA+OworCQlxY29tLHBtLXFvcy1sZWdhY3ktbGF0ZW5jeS11cyA9IDw3MCA3MD4sIDw3MCA3MD47CisKKwkJY2xvY2tzID0gPCZjbG9ja19nY2MgR0NDX1NEQ0MyX0FIQl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1NEQ0MyX0FQUFNfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiaWZhY2VfY2xrIiwgImNvcmVfY2xrIjsKKworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKIAlxY29tLG1zbS1jZHNwLWxvYWRlciB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxjZHNwLWxvYWRlciI7CiAJCXFjb20scHJvYy1pbWctdG8tbG9hZCA9ICJjZHNwIjsKQEAgLTE5MzAsOCArMjIyMSwyMTMgQEAKIAkJCWRtYS1jb2hlcmVudDsKIAkJfTsKIAl9OworCisJcWNvbSxpY25zc0AxODgwMDAwMCB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxpY25zcyI7CisJCXJlZyA9IDwweDE4ODAwMDAwIDB4ODAwMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDQxNCAwIC8qIENFMCAqLyA+LAorCQkJICAgICA8MCA0MTUgMCAvKiBDRTEgKi8gPiwKKwkJCSAgICAgPDAgNDE2IDAgLyogQ0UyICovID4sCisJCQkgICAgIDwwIDQxNyAwIC8qIENFMyAqLyA+LAorCQkJICAgICA8MCA0MTggMCAvKiBDRTQgKi8gPiwKKwkJCSAgICAgPDAgNDE5IDAgLyogQ0U1ICovID4sCisJCQkgICAgIDwwIDQyMCAwIC8qIENFNiAqLyA+LAorCQkJICAgICA8MCA0MjEgMCAvKiBDRTcgKi8gPiwKKwkJCSAgICAgPDAgNDIyIDAgLyogQ0U4ICovID4sCisJCQkgICAgIDwwIDQyMyAwIC8qIENFOSAqLyA+LAorCQkJICAgICA8MCA0MjQgMCAvKiBDRTEwICovID4sCisJCQkgICAgIDwwIDQyNSAwIC8qIENFMTEgKi8gPjsKKwkJcWNvbSx3bGFuLW1zYS1tZW1vcnkgPSA8MHgxMDAwMDA+OworCQlxY29tLHNtbXUtczEtYnlwYXNzOworCX07CisKKwljcHVidzogcWNvbSxjcHVidyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkZXZidyI7CisJCWdvdmVybm9yID0gInBlcmZvcm1hbmNlIjsKKwkJcWNvbSxzcmMtZHN0LXBvcnRzID0KKwkJCTxNU01fQlVTX01BU1RFUl9BTVBTU19NMCBNU01fQlVTX1NMQVZFX0VCSV9DSDA+OworCQlxY29tLGFjdGl2ZS1vbmx5OworCQlxY29tLGJ3LXRibCA9CisJCQk8IE1IWl9UT19NQlBTKCAxMDAsIDQpID4sIC8qIDM4MSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCAyMDAsIDQpID4sIC8qIDc2MiBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCAzMDAsIDQpID4sIC8qIDExNDQgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNDUxLCA0KSA+LCAvKiAxNzIwIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDU0NywgNCkgPiwgLyogMjA4NiBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA2ODEsIDQpID4sIC8qIDI1OTcgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNzY4LCA0KSA+LCAvKiAyOTI5IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTAxNywgNCkgPiwgLyogMzg3OSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDEzNTMsIDQpID4sIC8qIDUxNjEgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxNTU1LCA0KSA+LCAvKiA1OTMxIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTgwNCwgNCkgPjsgLyogNjg4MSBNQi9zICovCisJfTsKKworCWJ3bW9uOiBxY29tLGNwdS1id21vbiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxiaW1jLWJ3bW9uNCI7CisJCXJlZyA9IDwweDE0MzY0MDAgMHgzMDA+LCA8MHgxNDM2MzAwIDB4MjAwPjsKKwkJcmVnLW5hbWVzID0gImJhc2UiLCAiZ2xvYmFsX2Jhc2UiOworCQlpbnRlcnJ1cHRzID0gPDAgNTgxIDQ+OworCQlxY29tLG1wb3J0ID0gPDA+OworCQlxY29tLGh3LXRpbWVyLWh6ID0gPDE5MjAwMDAwPjsKKwkJcWNvbSx0YXJnZXQtZGV2ID0gPCZjcHVidz47CisJfTsKKworCW1lbWxhdF9jcHUwOiBxY29tLG1lbWxhdC1jcHUwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRldmJ3IjsKKwkJZ292ZXJub3IgPSAicG93ZXJzYXZlIjsKKwkJcWNvbSxzcmMtZHN0LXBvcnRzID0gPDEgNTEyPjsKKwkJcWNvbSxhY3RpdmUtb25seTsKKwkJcWNvbSxidy10YmwgPQorCQkJPCBNSFpfVE9fTUJQUyggMTAwLCA0KSA+LCAvKiAzODEgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggMjAwLCA0KSA+LCAvKiA3NjIgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggMzAwLCA0KSA+LCAvKiAxMTQ0IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDQ1MSwgNCkgPiwgLyogMTcyMCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA1NDcsIDQpID4sIC8qIDIwODYgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNjgxLCA0KSA+LCAvKiAyNTk3IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDc2OCwgNCkgPiwgLyogMjkyOSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDEwMTcsIDQpID4sIC8qIDM4NzkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMzUzLCA0KSA+LCAvKiA1MTYxIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTU1NSwgNCkgPiwgLyogNTkzMSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE4MDQsIDQpID47IC8qIDY4ODEgTUIvcyAqLworCX07CisKKwltZW1sYXRfY3B1NDogcWNvbSxtZW1sYXQtY3B1NCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkZXZidyI7CisJCWdvdmVybm9yID0gInBvd2Vyc2F2ZSI7CisJCXFjb20sc3JjLWRzdC1wb3J0cyA9IDwxIDUxMj47CisJCXFjb20sYWN0aXZlLW9ubHk7CisJCXN0YXR1cyA9ICJvayI7CisJCXFjb20sYnctdGJsID0KKwkJCTwgTUhaX1RPX01CUFMoIDEwMCwgNCkgPiwgLyogMzgxIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDIwMCwgNCkgPiwgLyogNzYyIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDMwMCwgNCkgPiwgLyogMTE0NCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA0NTEsIDQpID4sIC8qIDE3MjAgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNTQ3LCA0KSA+LCAvKiAyMDg2IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDY4MSwgNCkgPiwgLyogMjU5NyBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA3NjgsIDQpID4sIC8qIDI5MjkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LCAvKiAzODc5IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTM1MywgNCkgPiwgLyogNTE2MSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE1NTUsIDQpID4sIC8qIDU5MzEgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxODA0LCA0KSA+OyAvKiA2ODgxIE1CL3MgKi8KKwl9OworCisJZGV2ZnJlcV9tZW1sYXRfMDogcWNvbSxjcHUwLW1lbWxhdC1tb24geworCQljb21wYXRpYmxlID0gInFjb20sYXJtLW1lbWxhdC1tb24iOworCQlxY29tLGNwdWxpc3QgPSA8JkNQVTAgJkNQVTEgJkNQVTIgJkNQVTM+OworCQlxY29tLHRhcmdldC1kZXYgPSA8Jm1lbWxhdF9jcHUwPjsKKwkJcWNvbSxjYWNoZW1pc3MtZXYgPSA8MHgyND47CisJCXFjb20sY29yZS1kZXYtdGFibGUgPQorCQkJPCAgNzQ4ODAwIE1IWl9UT19NQlBTKCAzMDAsIDQpID4sCisJCQk8ICA5OTg0MDAgTUhaX1RPX01CUFMoIDQ1MSwgNCkgPiwKKwkJCTwgMTIwOTYwMCBNSFpfVE9fTUJQUyggNTQ3LCA0KSA+LAorCQkJPCAxNDk3NjAwIE1IWl9UT19NQlBTKCA3NjgsIDQpID4sCisJCQk8IDE3MjgwMDAgTUhaX1RPX01CUFMoMTAxNywgNCkgPjsKKwl9OworCisJZGV2ZnJlcV9tZW1sYXRfNDogcWNvbSxjcHU0LW1lbWxhdC1tb24geworCQljb21wYXRpYmxlID0gInFjb20sYXJtLW1lbWxhdC1tb24iOworCQlxY29tLGNwdWxpc3QgPSA8JkNQVTQgJkNQVTUgJkNQVTYgJkNQVTc+OworCQlxY29tLHRhcmdldC1kZXYgPSA8Jm1lbWxhdF9jcHU0PjsKKwkJcWNvbSxjYWNoZW1pc3MtZXYgPSA8MHgyND47CisJCXFjb20sY29yZS1kZXYtdGFibGUgPQorCQkJPCAgNzg3MjAwIE1IWl9UT19NQlBTKCAzMDAsIDQpID4sCisJCQk8IDExMTM2MDAgTUhaX1RPX01CUFMoIDU0NywgNCkgPiwKKwkJCTwgMTM0NDAwMCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LAorCQkJPCAxOTAwODAwIE1IWl9UT19NQlBTKDE1NTUsIDQpID4sCisJCQk8IDI0Mzg0MDAgTUhaX1RPX01CUFMoMTgwNCwgNCkgPjsKKwl9OworCisJbDNfY3B1MDogcWNvbSxsMy1jcHUwIHsKKwkJY29tcGF0aWJsZSA9ICJkZXZmcmVxLXNpbXBsZS1kZXYiOworCQljbG9jay1uYW1lcyA9ICJkZXZmcmVxX2NsayI7CisJCWNsb2NrcyA9IDwmY2xvY2tfY3B1Y2MgTDNfQ0xVU1RFUjBfVk9URV9DTEs+OworCQlnb3Zlcm5vciA9ICJwZXJmb3JtYW5jZSI7CisJfTsKKworCWwzX2NwdTQ6IHFjb20sbDMtY3B1NCB7CisJCWNvbXBhdGlibGUgPSAiZGV2ZnJlcS1zaW1wbGUtZGV2IjsKKwkJY2xvY2stbmFtZXMgPSAiZGV2ZnJlcV9jbGsiOworCQljbG9ja3MgPSA8JmNsb2NrX2NwdWNjIEwzX0NMVVNURVIxX1ZPVEVfQ0xLPjsKKwkJZ292ZXJub3IgPSAicGVyZm9ybWFuY2UiOworCX07CisKKwlkZXZmcmVxX2wzbGF0XzA6IHFjb20sY3B1MC1sM2xhdC1tb24geworCQljb21wYXRpYmxlID0gInFjb20sYXJtLW1lbWxhdC1tb24iOworCQlxY29tLGNwdWxpc3QgPSA8JkNQVTAgJkNQVTEgJkNQVTIgJkNQVTM+OworCQlxY29tLHRhcmdldC1kZXYgPSA8JmwzX2NwdTA+OworCQlxY29tLGNhY2hlbWlzcy1ldiA9IDwweDE3PjsKKwkJcWNvbSxjb3JlLWRldi10YWJsZSA9CisJCQk8ICA3NDg4MDAgIDU2NjQwMDAwMCA+LAorCQkJPCAgOTk4NDAwICA3ODcyMDAwMDAgPiwKKwkJCTwgMTIwOTY2MCAgOTQwODAwMDAwID4sCisJCQk8IDE0OTc2MDAgMTE5MDQwMDAwMCA+LAorCQkJPCAxNjEyODAwIDEzODI0MDAwMDAgPiwKKwkJCTwgMTcyODAwMCAxNDQwMDAwMDAwID47CisJfTsKKworCWRldmZyZXFfbDNsYXRfNDogcWNvbSxjcHU0LWwzbGF0LW1vbiB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxhcm0tbWVtbGF0LW1vbiI7CisJCXFjb20sY3B1bGlzdCA9IDwmQ1BVNCAmQ1BVNSAmQ1BVNiAmQ1BVNz47CisJCXFjb20sdGFyZ2V0LWRldiA9IDwmbDNfY3B1ND47CisJCXFjb20sY2FjaGVtaXNzLWV2ID0gPDB4MTc+OworCQlxY29tLGNvcmUtZGV2LXRhYmxlID0KKwkJCTwgMTExMzYwMCAgNTY2NDAwMDAwID4sCisJCQk8IDEzNDQwMDAgIDc4NzIwMDAwMCA+LAorCQkJPCAxNzI4MDAwICA5NDA4MDAwMDAgPiwKKwkJCTwgMTkwMDgwMCAxMTkwNDAwMDAwID4sCisJCQk8IDI0Mzg0MDAgMTQ0MDAwMDAwMCA+OworCX07CisKKwltaW5jcHVidzogcWNvbSxtaW5jcHVidyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxkZXZidyI7CisJCWdvdmVybm9yID0gInBvd2Vyc2F2ZSI7CisJCXFjb20sc3JjLWRzdC1wb3J0cyA9IDwxIDUxMj47CisJCXFjb20sYWN0aXZlLW9ubHk7CisJCXFjb20sYnctdGJsID0KKwkJCTwgTUhaX1RPX01CUFMoIDEwMCwgNCkgPiwgLyogMzgxIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDIwMCwgNCkgPiwgLyogNzYyIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDMwMCwgNCkgPiwgLyogMTE0NCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA0NTEsIDQpID4sIC8qIDE3MjAgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNTQ3LCA0KSA+LCAvKiAyMDg2IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDY4MSwgNCkgPiwgLyogMjU5NyBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA3NjgsIDQpID4sIC8qIDI5MjkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LCAvKiAzODc5IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTM1MywgNCkgPiwgLyogNTE2MSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE1NTUsIDQpID4sIC8qIDU5MzEgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxODA0LCA0KSA+OyAvKiA2ODgxIE1CL3MgKi8KKwl9OworCisJZGV2ZnJlcS1jcHVmcmVxIHsKKwkJbWluY3B1YnctY3B1ZnJlcSB7CisJCQl0YXJnZXQtZGV2ID0gPCZtaW5jcHVidz47CisJCQljcHUtdG8tZGV2LW1hcC0wID0KKwkJCQk8ICA3NDg4MDAgTUhaX1RPX01CUFMoIDMwMCwgNCkgPiwKKwkJCQk8IDEyMDk2MDAgTUhaX1RPX01CUFMoIDQ1MSwgNCkgPiwKKwkJCQk8IDE2MTIwMDAgTUhaX1RPX01CUFMoIDU0NywgNCkgPiwKKwkJCQk8IDE3MjgwMDAgTUhaX1RPX01CUFMoIDc2OCwgNCkgPjsKKwkJCWNwdS10by1kZXYtbWFwLTQgPQorCQkJCTwgMTExMzYwMCBNSFpfVE9fTUJQUyggMzAwLCA0KSA+LAorCQkJCTwgMTM0NDAwMCBNSFpfVE9fTUJQUyggNTQ3LCA0KSA+LAorCQkJCTwgMTcyODAwMCBNSFpfVE9fTUJQUyggNzY4LCA0KSA+LAorCQkJCTwgMTkwMDgwMCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LAorCQkJCTwgMjQzODQwMCBNSFpfVE9fTUJQUygxODA0LCA0KSA+OworCQl9OworCX07CisKKwlncHVfZ3hfZG9tYWluX2FkZHI6IHN5c2NvbkAweDUwOTE1MDggeworCQljb21wYXRpYmxlID0gInN5c2NvbiI7CisJCXJlZyA9IDwweDUwOTE1MDggMHg0PjsKKwl9OworCisJZ3B1X2d4X3N3X3Jlc2V0OiBzeXNjb25AMHg1MDkxMDA4IHsKKwkJY29tcGF0aWJsZSA9ICJzeXNjb24iOworCQlyZWcgPSA8MHg1MDkxMDA4IDB4ND47CisJfTsKIH07CiAKKyNpbmNsdWRlICJwbTY2MC5kdHNpIgorI2luY2x1ZGUgInBtNjYwbC5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC1yZWd1bGF0b3IuZHRzaSIKICNpbmNsdWRlICJzZG02NzAtcGluY3RybC5kdHNpIgogI2luY2x1ZGUgIm1zbS1hcm0tc21tdS1zZG02NzAuZHRzaSIKICNpbmNsdWRlICJtc20tZ2RzYy1zZG04NDUuZHRzaSIKQEAgLTIwMDYsNiArMjUwMiw5IEBACiAJY2xvY2tzID0gPCZjbG9ja19nZnggR1BVX0NDX0dYX0dGWDNEX0NMS19TUkM+OwogCXFjb20sZm9yY2UtZW5hYmxlLXJvb3QtY2xrOwogCXBhcmVudC1zdXBwbHkgPSA8JnBtNjYwbF9zMl9sZXZlbD47CisJZG9tYWluLWFkZHIgPSA8JmdwdV9neF9kb21haW5fYWRkcj47CisJc3ctcmVzZXQgPSA8JmdwdV9neF9zd19yZXNldD47CisJcWNvbSxyZXNldC1hb24tbG9naWM7CiAJc3RhdHVzID0gIm9rIjsKIH07CiAKQEAgLTIwMjMsNyArMjUyMiw0MCBAQAogCXN0YXR1cyA9ICJvayI7CiB9OwogCi0jaW5jbHVkZSAicG02NjAuZHRzaSIKLSNpbmNsdWRlICJwbTY2MGwuZHRzaSIKLSNpbmNsdWRlICJzZG02NzAtcmVndWxhdG9yLmR0c2kiCismbWRzc19kc2kwIHsKKwlxY29tLGNvcmUtc3VwcGx5LWVudHJpZXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJcWNvbSxjb3JlLXN1cHBseS1lbnRyeUAwIHsKKwkJCXJlZyA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LW5hbWUgPSAicmVmZ2VuIjsKKwkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDA+OworCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8MD47CisJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwwPjsKKwkJfTsKKwl9OworfTsKKworJm1kc3NfZHNpMSB7CisJcWNvbSxjb3JlLXN1cHBseS1lbnRyaWVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXFjb20sY29yZS1zdXBwbHktZW50cnlAMCB7CisJCQlyZWcgPSA8MD47CisJCQlxY29tLHN1cHBseS1uYW1lID0gInJlZmdlbiI7CisJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDA+OworCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MD47CisJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCX07CisJfTsKK307CisKICNpbmNsdWRlICJzZG02NzAtYXVkaW8uZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtdXNiLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWdwdS5kdHNpIgorI2luY2x1ZGUgInNkbTY3MC10aGVybWFsLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWJ1cy5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1hdWRpby1vdmVybGF5LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaQppbmRleCA5YmQxZDU0Li45ZDQ4NWI1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaQpAQCAtNDcsNiArNDcsOCBAQAogCiAJcWNvbSxtc20tbWJoYy1ocGhsLXN3aCA9IDwxPjsKIAlxY29tLG1zbS1tYmhjLWduZC1zd2ggPSA8MT47CisJcWNvbSxtc20tbWJoYy1ocy1taWMtbWF4LXRocmVzaG9sZC1tdiA9IDwxNzAwPjsKKwlxY29tLG1zbS1tYmhjLWhzLW1pYy1taW4tdGhyZXNob2xkLW12ID0gPDUwPjsKIAlxY29tLGhwaC1lbjAtZ3BpbyA9IDwmdGF2aWxfaHBoX2VuMD47CiAJcWNvbSxocGgtZW4xLWdwaW8gPSA8JnRhdmlsX2hwaF9lbjE+OwogCXFjb20sdGF2aWwtbWNsay1jbGstZnJlcSA9IDw5NjAwMDAwPjsKQEAgLTE3NSw3ICsxNzcsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJxY29tLHdjZC1zcGktdjIiOwogCQkJcWNvbSxtYXN0ZXItYnVzLW51bSA9IDwwPjsKIAkJCXFjb20sY2hpcC1zZWxlY3QgPSA8MD47Ci0JCQlxY29tLG1heC1mcmVxdWVuY3kgPSA8OTYwMDAwMD47CisJCQlxY29tLG1heC1mcmVxdWVuY3kgPSA8MjQwMDAwMDA+OwogCQkJcWNvbSxtZW0tYmFzZS1hZGRyID0gPDB4MTAwMDAwPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1idXMuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtYnVzLmR0c2kKaW5kZXggNWZiYjFkYi4uY2Y3Y2NhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1idXMuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWJ1cy5kdHNpCkBAIC02NDUsNyArNjQ1LDEwIEBACiAJCQlxY29tLHFwb3J0ID0gPDI+OwogCQkJcWNvbSxjb25uZWN0aW9ucyA9IDwmc2x2X3Fuc19hMm5vY19zbm9jPjsKIAkJCXFjb20sYnVzLWRldiA9IDwmZmFiX2FnZ3JlMl9ub2M+OworCQkJcWNvbSxhcC1vd25lZDsKIAkJCXFjb20scHJpbyA9IDwyPjsKKwkJCXFjb20sZGVmZXItaW5pdC1xb3M7CisJCQlxY29tLG5vZGUtcW9zLWJjbXMgPSA8NzAzNSAwIDE+OwogCQl9OwogCiAJCW1hc194bV9wY2llM18xOiBtYXMteG0tcGNpZTMtMSB7CkBAIC05MDAsNyArOTAzLDcgQEAKIAkJCXFjb20sYnVzLWRldiA9IDwmZmFiX21lbV9ub2M+OwogCQkJcWNvbSxiY21zID0gPCZiY21fc2gzPjsKIAkJCXFjb20sYXAtb3duZWQ7Ci0JCQlxY29tLHByaW8gPSA8Nj47CisJCQlxY29tLHByaW8gPSA8Nz47CiAJCX07CiAKIAkJbWFzX3FobV9tZW1ub2NfY2ZnOiBtYXMtcWhtLW1lbW5vYy1jZmcgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEtc2Vuc29yLWNkcC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEtc2Vuc29yLWNkcC5kdHNpCmluZGV4IDlkNzk5Y2IuLjA0NDE4ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY2FtZXJhLXNlbnNvci1jZHAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWNhbWVyYS1zZW5zb3ItY2RwLmR0c2kKQEAgLTExMSw3ICsxMTEsNyBAQAogCQlyZ2x0ci1taW4tdm9sdGFnZSA9IDwyODAwMDAwPjsKIAkJcmdsdHItbWF4LXZvbHRhZ2UgPSA8MjgwMDAwMD47CiAJCXJnbHRyLWxvYWQtY3VycmVudCA9IDwwPjsKLQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJc3RhdHVzID0gIm9rIjsKIAl9OwogCiAJZWVwcm9tX3JlYXI6IHFjb20sZWVwcm9tQDAgewpAQCAtMzc2LDQgKzM3Niw0NyBAQAogCQljbG9jay1jbnRsLWxldmVsID0gInR1cmJvIjsKIAkJY2xvY2stcmF0ZXMgPSA8MjQwMDAwMDA+OwogCX07CisKKwlxY29tLGNhbS1zZW5zb3JAMyB7CisJCWNlbGwtaW5kZXggPSA8Mz47CisJCWNvbXBhdGlibGUgPSAicWNvbSxjYW0tc2Vuc29yIjsKKwkJcmVnID0gPDB4MDM+OworCQljc2lwaHktc2QtaW5kZXggPSA8Mz47CisJCXNlbnNvci1wb3NpdGlvbi1yb2xsID0gPDI3MD47CisJCXNlbnNvci1wb3NpdGlvbi1waXRjaCA9IDwwPjsKKwkJc2Vuc29yLXBvc2l0aW9uLXlhdyA9IDwwPjsKKwkJY2FtX3Zpby1zdXBwbHkgPSA8JnBtODk5OF9sdnMxPjsKKwkJY2FtX3ZhbmEtc3VwcGx5ID0gPCZwbWk4OTk4X2JvYj47CisJCWNhbV92ZGlnLXN1cHBseSA9IDwmY2FtZXJhX2xkbz47CisJCWNhbV9jbGstc3VwcGx5ID0gPCZ0aXRhbl90b3BfZ2RzYz47CisJCXJlZ3VsYXRvci1uYW1lcyA9ICJjYW1fdmlvIiwgImNhbV92YW5hIiwgImNhbV92ZGlnIiwKKwkJCSJjYW1fY2xrIjsKKwkJcmdsdHItY250cmwtc3VwcG9ydDsKKwkJcmdsdHItbWluLXZvbHRhZ2UgPSA8MCAzMzEyMDAwIDEwNTAwMDAgMD47CisJCXJnbHRyLW1heC12b2x0YWdlID0gPDAgMzYwMDAwMCAxMDUwMDAwIDA+OworCQlyZ2x0ci1sb2FkLWN1cnJlbnQgPSA8MCA4MDAwMCAxMDUwMDAgMD47CisJCWdwaW8tbm8tbXV4ID0gPDA+OworCQlwaW5jdHJsLW5hbWVzID0gImNhbV9kZWZhdWx0IiwgImNhbV9zdXNwZW5kIjsKKwkJcGluY3RybC0wID0gPCZjYW1fc2Vuc29yX21jbGszX2FjdGl2ZQorCQkJCSAmY2FtX3NlbnNvcl9pcmlzX2FjdGl2ZT47CisJCXBpbmN0cmwtMSA9IDwmY2FtX3NlbnNvcl9tY2xrM19zdXNwZW5kCisJCQkJICZjYW1fc2Vuc29yX2lyaXNfc3VzcGVuZD47CisJCWdwaW9zID0gPCZ0bG1tIDE2IDA+LAorCQkJPCZ0bG1tIDkgMD4sCisJCQk8JnRsbW0gOCAwPjsKKwkJZ3Bpby1yZXNldCA9IDwxPjsKKwkJZ3Bpby12YW5hID0gPDI+OworCQlncGlvLXJlcS10YmwtbnVtID0gPDAgMSAyPjsKKwkJZ3Bpby1yZXEtdGJsLWZsYWdzID0gPDEgMCAwPjsKKwkJZ3Bpby1yZXEtdGJsLWxhYmVsID0gIkNBTUlGX01DTEszIiwKKwkJCQkJIkNBTV9SRVNFVDMiLAorCQkJCQkiQ0FNX1ZBTkExIjsKKwkJc2Vuc29yLW1vZGUgPSA8MD47CisJCWNjaS1tYXN0ZXIgPSA8MT47CisJCXN0YXR1cyA9ICJvayI7CisJCWNsb2NrcyA9IDwmY2xvY2tfY2FtY2MgQ0FNX0NDX01DTEszX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImNhbV9jbGsiOworCQljbG9jay1jbnRsLWxldmVsID0gInR1cmJvIjsKKwkJY2xvY2stcmF0ZXMgPSA8MjQwMDAwMDA+OworCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEtc2Vuc29yLW10cC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEtc2Vuc29yLW10cC5kdHNpCmluZGV4IGYxODEzN2MuLjkwODhmYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY2FtZXJhLXNlbnNvci1tdHAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWNhbWVyYS1zZW5zb3ItbXRwLmR0c2kKQEAgLTExMSw3ICsxMTEsNyBAQAogCQlyZ2x0ci1taW4tdm9sdGFnZSA9IDwyODAwMDAwPjsKIAkJcmdsdHItbWF4LXZvbHRhZ2UgPSA8MjgwMDAwMD47CiAJCXJnbHRyLWxvYWQtY3VycmVudCA9IDwwPjsKLQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJc3RhdHVzID0gIm9rIjsKIAl9OwogCiAJZWVwcm9tX3JlYXI6IHFjb20sZWVwcm9tQDAgewpAQCAtMzc2LDQgKzM3Niw0NyBAQAogCQljbG9jay1jbnRsLWxldmVsID0gInR1cmJvIjsKIAkJY2xvY2stcmF0ZXMgPSA8MjQwMDAwMDA+OwogCX07CisJcWNvbSxjYW0tc2Vuc29yQDMgeworCQljZWxsLWluZGV4ID0gPDM+OworCQljb21wYXRpYmxlID0gInFjb20sY2FtLXNlbnNvciI7CisJCXJlZyA9IDwweDAzPjsKKwkJY3NpcGh5LXNkLWluZGV4ID0gPDM+OworCQlzZW5zb3ItcG9zaXRpb24tcm9sbCA9IDwyNzA+OworCQlzZW5zb3ItcG9zaXRpb24tcGl0Y2ggPSA8MD47CisJCXNlbnNvci1wb3NpdGlvbi15YXcgPSA8MD47CisJCWNhbV92aW8tc3VwcGx5ID0gPCZwbTg5OThfbHZzMT47CisJCWNhbV92YW5hLXN1cHBseSA9IDwmcG1pODk5OF9ib2I+OworCQljYW1fdmRpZy1zdXBwbHkgPSA8JmNhbWVyYV9sZG8+OworCQljYW1fY2xrLXN1cHBseSA9IDwmdGl0YW5fdG9wX2dkc2M+OworCQlyZWd1bGF0b3ItbmFtZXMgPSAiY2FtX3ZpbyIsICJjYW1fdmFuYSIsICJjYW1fdmRpZyIsCisJCQkiY2FtX2NsayI7CisJCXJnbHRyLWNudHJsLXN1cHBvcnQ7CisJCXJnbHRyLW1pbi12b2x0YWdlID0gPDAgMzMxMjAwMCAxMDUwMDAwIDA+OworCQlyZ2x0ci1tYXgtdm9sdGFnZSA9IDwwIDM2MDAwMDAgMTA1MDAwMCAwPjsKKwkJcmdsdHItbG9hZC1jdXJyZW50ID0gPDAgODAwMDAgMTA1MDAwIDA+OworCQlncGlvLW5vLW11eCA9IDwwPjsKKwkJcGluY3RybC1uYW1lcyA9ICJjYW1fZGVmYXVsdCIsICJjYW1fc3VzcGVuZCI7CisJCXBpbmN0cmwtMCA9IDwmY2FtX3NlbnNvcl9tY2xrM19hY3RpdmUKKwkJCQkgJmNhbV9zZW5zb3JfaXJpc19hY3RpdmU+OworCQlwaW5jdHJsLTEgPSA8JmNhbV9zZW5zb3JfbWNsazNfc3VzcGVuZAorCQkJCSAmY2FtX3NlbnNvcl9pcmlzX3N1c3BlbmQ+OworCQlncGlvcyA9IDwmdGxtbSAxNiAwPiwKKwkJCTwmdGxtbSA5IDA+LAorCQkJPCZ0bG1tIDggMD47CisJCWdwaW8tcmVzZXQgPSA8MT47CisJCWdwaW8tdmFuYSA9IDwyPjsKKwkJZ3Bpby1yZXEtdGJsLW51bSA9IDwwIDEgMj47CisJCWdwaW8tcmVxLXRibC1mbGFncyA9IDwxIDAgMD47CisJCWdwaW8tcmVxLXRibC1sYWJlbCA9ICJDQU1JRl9NQ0xLMyIsCisJCQkJCSJDQU1fUkVTRVQzIiwKKwkJCQkJIkNBTV9WQU5BMSI7CisJCXNlbnNvci1tb2RlID0gPDA+OworCQljY2ktbWFzdGVyID0gPDE+OworCQlzdGF0dXMgPSAib2siOworCQljbG9ja3MgPSA8JmNsb2NrX2NhbWNjIENBTV9DQ19NQ0xLM19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjYW1fY2xrIjsKKwkJY2xvY2stY250bC1sZXZlbCA9ICJ0dXJibyI7CisJCWNsb2NrLXJhdGVzID0gPDI0MDAwMDAwPjsKKwl9OworCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY2FtZXJhLmR0c2kKaW5kZXggZjU0Y2JkYy4uN2M5NDgyYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jYW1lcmEuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWNhbWVyYS5kdHNpCkBAIC0zMjUsMTEgKzMyNSwxNyBAQAogCiAJCW1zbV9jYW1fc21tdV9zZWN1cmUgewogCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1jYW0tc21tdS1jYiI7Ci0JCQlpb21tdXMgPSA8JmFwcHNfc21tdSAweDEwMDEgMHgwPjsKIAkJCWxhYmVsID0gImNhbS1zZWN1cmUiOwotCQkJY2FtX3NlY3VyZV9pb3ZhX21lbV9tYXA6IGlvdmEtbWVtLW1hcCB7Ci0JCQkJLyogU2VjdXJlIElPIHJlZ2lvbiBpcyBhcHByb3hpbWF0ZWx5IDMuNCBHQiAqLworCQkJcWNvbSxzZWN1cmUtY2I7CisJCX07CisKKwkJbXNtX2NhbV9zbW11X2ZkIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2FtLXNtbXUtY2IiOworCQkJaW9tbXVzID0gPCZhcHBzX3NtbXUgMHgxMDcwIDB4MD47CisJCQlsYWJlbCA9ICJmZCI7CisJCQlmZF9pb3ZhX21lbV9tYXA6IGlvdmEtbWVtLW1hcCB7CiAJCQkJaW92YS1tZW0tcmVnaW9uLWlvIHsKKwkJCQkJLyogSU8gcmVnaW9uIGlzIGFwcHJveGltYXRlbHkgMy40IEdCICovCiAJCQkJCWlvdmEtcmVnaW9uLW5hbWUgPSAiaW8iOwogCQkJCQlpb3ZhLXJlZ2lvbi1zdGFydCA9IDwweDc0MDAwMDA+OwogCQkJCQlpb3ZhLXJlZ2lvbi1sZW4gPSA8MHhkOGMwMDAwMD47CkBAIC04MTEsNyArODE3LDYgQEAKIAkJCSJzb2NfYWhiX2NsayIsCiAJCQkiY3Bhc19haGJfY2xrIiwKIAkJCSJjYW1ub2NfYXhpX2NsayIsCi0JCQkiaWNwX2FwYl9jbGsiLAogCQkJImljcF9jbGsiLAogCQkJImljcF9jbGtfc3JjIjsKIAkJY2xvY2tzID0gPCZjbG9ja19nY2MgR0NDX0NBTUVSQV9BSEJfQ0xLPiwKQEAgLTgyMCwxMSArODI1LDEwIEBACiAJCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfU09DX0FIQl9DTEs+LAogCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0NQQVNfQUhCX0NMSz4sCiAJCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQ0FNTk9DX0FYSV9DTEs+LAotCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lDUF9BUEJfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JQ1BfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JQ1BfQ0xLX1NSQz47CiAKLQkJY2xvY2stcmF0ZXMgPSA8MCAwIDQwMDAwMDAwMCAwIDAgMCAwIDAgNjAwMDAwMDAwPjsKKwkJY2xvY2stcmF0ZXMgPSA8MCAwIDQwMDAwMDAwMCAwIDAgMCAwIDYwMDAwMDAwMD47CiAJCWNsb2NrLWNudGwtbGV2ZWwgPSAidHVyYm8iOwogCQlmd19uYW1lID0gIkNBTUVSQV9JQ1AuZWxmIjsKIAkJc3RhdHVzID0gIm9rIjsKQEAgLTg0MCwxNCArODQ0LDIwIEBACiAJCQkiaXBlXzBfYXhpX2NsayIsCiAJCQkiaXBlXzBfY2xrIiwKIAkJCSJpcGVfMF9jbGtfc3JjIjsKKwkJc3JjLWNsb2NrLW5hbWUgPSAiaXBlXzBfY2xrX3NyYyI7CiAJCWNsb2NrcyA9IDwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8wX0FIQl9DTEs+LAogCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8wX0FSRUdfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMF9BWElfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMF9DTEs+LAogCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8wX0NMS19TUkM+OwogCi0JCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgNjAwMDAwMDAwPjsKLQkJY2xvY2stY250bC1sZXZlbCA9ICJ0dXJibyI7CisJCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgMjQwMDAwMDAwPiwKKwkJCTwwIDAgMCAwIDQwNDAwMDAwMD4sCisJCQk8MCAwIDAgMCA0ODAwMDAwMDA+LAorCQkJPDAgMCAwIDAgNTM4MDAwMDAwPiwKKwkJCTwwIDAgMCAwIDYwMDAwMDAwMD47CisJCWNsb2NrLWNudGwtbGV2ZWwgPSAibG93c3ZzIiwgInN2cyIsCisJCQkic3ZzX2wxIiwgIm5vbWluYWwiLCAidHVyYm8iOwogCQlzdGF0dXMgPSAib2siOwogCX07CiAKQEAgLTg2MSwxNCArODcxLDIwIEBACiAJCQkiaXBlXzFfYXhpX2NsayIsCiAJCQkiaXBlXzFfY2xrIiwKIAkJCSJpcGVfMV9jbGtfc3JjIjsKKwkJc3JjLWNsb2NrLW5hbWUgPSAiaXBlXzFfY2xrX3NyYyI7CiAJCWNsb2NrcyA9IDwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8xX0FIQl9DTEs+LAogCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8xX0FSRUdfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMV9BWElfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19JUEVfMV9DTEs+LAogCQkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0lQRV8xX0NMS19TUkM+OwogCi0JCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgNjAwMDAwMDAwPjsKLQkJY2xvY2stY250bC1sZXZlbCA9ICJ0dXJibyI7CisJCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgMjQwMDAwMDAwPiwKKwkJCTwwIDAgMCAwIDQwNDAwMDAwMD4sCisJCQk8MCAwIDAgMCA0ODAwMDAwMDA+LAorCQkJPDAgMCAwIDAgNTM4MDAwMDAwPiwKKwkJCTwwIDAgMCAwIDYwMDAwMDAwMD47CisJCWNsb2NrLWNudGwtbGV2ZWwgPSAibG93c3ZzIiwgInN2cyIsCisJCQkic3ZzX2wxIiwgIm5vbWluYWwiLCAidHVyYm8iOwogCQlzdGF0dXMgPSAib2siOwogCX07CiAKQEAgLTg4MiwxNCArODk4LDIwIEBACiAJCQkiYnBzX2F4aV9jbGsiLAogCQkJImJwc19jbGsiLAogCQkJImJwc19jbGtfc3JjIjsKKwkJc3JjLWNsb2NrLW5hbWUgPSAiYnBzX2Nsa19zcmMiOwogCQljbG9ja3MgPSA8JmNsb2NrX2NhbWNjIENBTV9DQ19CUFNfQUhCX0NMSz4sCiAJCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQlBTX0FSRUdfQ0xLPiwKIAkJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19CUFNfQVhJX0NMSz4sCiAJCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQlBTX0NMSz4sCiAJCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQlBTX0NMS19TUkM+OwogCi0JCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgNjAwMDAwMDAwPjsKLQkJY2xvY2stY250bC1sZXZlbCA9ICJ0dXJibyI7CisJCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgMjAwMDAwMDAwPiwKKwkJCTwwIDAgMCAwIDQwNDAwMDAwMD4sCisJCQk8MCAwIDAgMCA0ODAwMDAwMDA+LAorCQkJPDAgMCAwIDAgNjAwMDAwMDAwPiwKKwkJCTwwIDAgMCAwIDYwMDAwMDAwMD47CisJCWNsb2NrLWNudGwtbGV2ZWwgPSAibG93c3ZzIiwgInN2cyIsCisJCQkic3ZzX2wxIiwgIm5vbWluYWwiLCAidHVyYm8iOwogCQlzdGF0dXMgPSAib2siOwogCX07CiAKQEAgLTk2NCw0ICs5ODYsNDMgQEAKIAkJc3RhdHVzID0gIm9rIjsKIAl9OwogCisJcWNvbSxjYW0tZmQgeworCQljb21wYXRpYmxlID0gInFjb20sY2FtLWZkIjsKKwkJY29tcGF0LWh3LW5hbWUgPSAicWNvbSxmZCI7CisJCW51bS1mZCA9IDwxPjsKKwkJc3RhdHVzID0gIm9rIjsKKwl9OworCisJY2FtX2ZkOiBxY29tLGZkQGFjNWEwMDAgeworCQljZWxsLWluZGV4ID0gPDA+OworCQljb21wYXRpYmxlID0gInFjb20sZmQ0MSI7CisJCXJlZy1uYW1lcyA9ICJmZF9jb3JlIiwgImZkX3dyYXBwZXIiOworCQlyZWcgPSA8MHhhYzVhMDAwIDB4MTAwMD4sCisJCQk8MHhhYzViMDAwIDB4NDAwPjsKKwkJcmVnLWNhbS1iYXNlID0gPDB4NWEwMDAgMHg1YjAwMD47CisJCWludGVycnVwdC1uYW1lcyA9ICJmZCI7CisJCWludGVycnVwdHMgPSA8MCA0NjIgMD47CisJCXJlZ3VsYXRvci1uYW1lcyA9ICJjYW1zcy12ZGQiOworCQljYW1zcy12ZGQtc3VwcGx5ID0gPCZ0aXRhbl90b3BfZ2RzYz47CisJCWNsb2NrLW5hbWVzID0gImdjY19haGJfY2xrIiwKKwkJCSJnY2NfYXhpX2NsayIsCisJCQkic29jX2FoYl9jbGsiLAorCQkJImNwYXNfYWhiX2NsayIsCisJCQkiY2Ftbm9jX2F4aV9jbGsiLAorCQkJImZkX2NvcmVfY2xrX3NyYyIsCisJCQkiZmRfY29yZV9jbGsiLAorCQkJImZkX2NvcmVfdWFyX2NsayI7CisJCWNsb2NrcyA9IDwmY2xvY2tfZ2NjIEdDQ19DQU1FUkFfQUhCX0NMSz4sCisJCQk8JmNsb2NrX2djYyBHQ0NfQ0FNRVJBX0FYSV9DTEs+LAorCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfU09DX0FIQl9DTEs+LAorCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfQ1BBU19BSEJfQ0xLPiwKKwkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0NBTU5PQ19BWElfQ0xLPiwKKwkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX0ZEX0NPUkVfQ0xLX1NSQz4sCisJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19GRF9DT1JFX0NMSz4sCisJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19GRF9DT1JFX1VBUl9DTEs+OworCQlzcmMtY2xvY2stbmFtZSA9ICJmZF9jb3JlX2Nsa19zcmMiOworCQljbG9jay1jbnRsLWxldmVsID0gInN2cyI7CisJCWNsb2NrLXJhdGVzID0gPDAgMCAwIDAgMCA0MDAwMDAwMDAgMCAwPjsKKwkJc3RhdHVzID0gIm9rIjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY2RwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWNkcC5kdHNpCmluZGV4IGRkZGYxZmIuLjgxY2UxZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY2RwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jZHAuZHRzaQpAQCAtMTEwLDYgKzExMCw3IEBACiAJdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19waHlfZ2RzYz47CiAJdmRkLWhiYS1maXhlZC1yZWd1bGF0b3I7CiAJdmNjLXN1cHBseSA9IDwmcG04OTk4X2wyMD47CisJdmNjLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk1MDAwMCAyOTYwMDAwPjsKIAl2Y2NxMi1zdXBwbHkgPSA8JnBtODk5OF9zND47CiAJdmNjLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwogCXZjY3EyLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwpAQCAtMTIwLDQ0ICsxMjEsNiBAQAogCXN0YXR1cyA9ICJvayI7CiB9OwogCi0mZXh0Y29uX3N0b3JhZ2VfY2QgewotCWdwaW8gPSA8JnRsbW0gMTI2IEdQSU9fQUNUSVZFX0xPVz47Ci0JZGVib3VuY2UtbXMgPSA8MjAwPjsKLQlpcnEtZmxhZ3MgPSA8SVJRX1RZUEVfRURHRV9CT1RIPjsKLQotCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Ci0JcGluY3RybC0wID0gPCZzdG9yYWdlX2NkPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCi0mdWZzcGh5X2NhcmQgewotCWNvbXBhdGlibGUgPSAicWNvbSx1ZnMtcGh5LXFtcC12MyI7Ci0KLQl2ZGRhLXBoeS1zdXBwbHkgPSA8JnBtODk5OF9sMT47IC8qIDAuODh2ICovCi0JdmRkYS1wbGwtc3VwcGx5ID0gPCZwbTg5OThfbDI2PjsgLyogMS4ydiAqLwotCXZkZGEtcGh5LW1heC1taWNyb2FtcCA9IDw2MjkwMD47Ci0JdmRkYS1wbGwtbWF4LW1pY3JvYW1wID0gPDE4MzAwPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCi0mdWZzaGNfY2FyZCB7Ci0JdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19jYXJkX2dkc2M+OwotCXZkZC1oYmEtZml4ZWQtcmVndWxhdG9yOwotCXZjYy1zdXBwbHkgPSA8JnBtODk5OF9sMjE+OwotCXZjY3EyLXN1cHBseSA9IDwmcG04OTk4X3M0PjsKLQl2Y2MtbWF4LW1pY3JvYW1wID0gPDMwMDAwMD47Ci0JdmNjcTItbWF4LW1pY3JvYW1wID0gPDMwMDAwMD47Ci0KLQlxY29tLHZkZHAtcmVmLWNsay1zdXBwbHkgPSA8JnBtODk5OF9sMj47Ci0JcWNvbSx2ZGRwLXJlZi1jbGstbWF4LW1pY3JvYW1wID0gPDEwMD47Ci0KLQlleHRjb24gPSA8JmV4dGNvbl9zdG9yYWdlX2NkPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCiAmc2RoY18yIHsKIAl2ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDIxPjsKIAlxY29tLHZkZC12b2x0YWdlLWxldmVsID0gPDI5NTAwMDAgMjk2MDAwMD47CkBAIC0xNjgsMTAgKzEzMSwxMCBAQAogCXFjb20sdmRkLWlvLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDIyMDAwPjsKIAogCXBpbmN0cmwtbmFtZXMgPSAiYWN0aXZlIiwgInNsZWVwIjsKLQlwaW5jdHJsLTAgPSA8JnNkYzJfY2xrX29uICAmc2RjMl9jbWRfb24gJnNkYzJfZGF0YV9vbj47Ci0JcGluY3RybC0xID0gPCZzZGMyX2Nsa19vZmYgJnNkYzJfY21kX29mZiAmc2RjMl9kYXRhX29mZj47CisJcGluY3RybC0wID0gPCZzZGMyX2Nsa19vbiAgJnNkYzJfY21kX29uICZzZGMyX2RhdGFfb24gJnN0b3JhZ2VfY2Q+OworCXBpbmN0cmwtMSA9IDwmc2RjMl9jbGtfb2ZmICZzZGMyX2NtZF9vZmYgJnNkYzJfZGF0YV9vZmYgJnN0b3JhZ2VfY2Q+OwogCi0JZXh0Y29uID0gPCZleHRjb25fc3RvcmFnZV9jZD47CisJY2QtZ3Bpb3MgPSA8JnRsbW0gMTI2IEdQSU9fQUNUSVZFX0xPVz47CiAKIAlzdGF0dXMgPSAib2siOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY29yZXNpZ2h0LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWNvcmVzaWdodC5kdHNpCmluZGV4IGMxZmNiNjIuLmE2MWQ5NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtY29yZXNpZ2h0LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1jb3Jlc2lnaHQuZHRzaQpAQCAtMTIsNiArMTIsMTYgQEAKIAogJnNvYyB7CiAKKwljc3I6IGNzckA2MDAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGNvcmVzaWdodC1jc3IiOworCQlyZWcgPSA8MHg2MDAxMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjc3ItYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWNzciI7CisKKwkJcWNvbSxibGstc2l6ZSA9IDwxPjsKKwl9OworCiAJcmVwbGljYXRvcl9xZHNzOiByZXBsaWNhdG9yQDYwNDYwMDAgewogCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOwogCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5MDk+OwpAQCAtMjcxLDYgKzI4MSw5IEBACiAJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKIAkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOwogCisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAyNzAgSVJRX1RZUEVfRURHRV9SSVNJTkc+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAiYnl0ZS1jbnRyLWlycSI7CisKIAkJcG9ydCB7CiAJCQl0bWNfZXRyX2luX3JlcGxpY2F0b3I6IGVuZHBvaW50IHsKIAkJCQlzbGF2ZS1tb2RlOwpAQCAtMzk3LDE2ICs0MTAsNiBAQAogCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CiAJfTsKIAotCWNzcjogY3NyQDYwMDEwMDAgewotCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LWNzciI7Ci0JCXJlZyA9IDwweDYwMDEwMDAgMHgxMDAwPjsKLQkJcmVnLW5hbWVzID0gImNzci1iYXNlIjsKLQotCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3NyIjsKLQotCQlxY29tLGJsay1zaXplID0gPDE+OwotCX07Ci0KIAlmdW5uZWxfaW4wOiBmdW5uZWxAMHg2MDQxMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKIAkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTA4PjsKQEAgLTUyMiw2ICs1MjUsNTggQEAKIAkJCQl9OwogCQkJfTsKIAorCQkJcG9ydEA1IHsKKwkJCQlyZWcgPSA8Nj47CisJCQkJZnVubmVsX2luMl9pbl9mdW5uZWxfZ2Z4OiBlbmRwb2ludCB7CisJCQkJCXNsYXZlLW1vZGU7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgPCZmdW5uZWxfZ2Z4X291dF9mdW5uZWxfaW4yPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworCisJZnVubmVsX2dmeDogZnVubmVsQDB4Njk0MzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjkwOD47CisKKwkJcmVnID0gPDB4Njk0MzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZnVubmVsLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1mdW5uZWwtZ2Z4IjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKworCQlwb3J0cyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlwb3J0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfZ2Z4X291dF9mdW5uZWxfaW4yOiBlbmRwb2ludCB7CisJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCSAgPCZmdW5uZWxfaW4yX2luX2Z1bm5lbF9nZng+OworCQkJCX07CisJCQl9OworCisJCQlwb3J0QDEgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlmdW5uZWxfaW4yX2luX2dmeDogZW5kcG9pbnQgeworCQkJCQlzbGF2ZS1tb2RlOworCQkJCQlyZW1vdGUtZW5kcG9pbnQgPQorCQkJCQkgIDwmZ2Z4X291dF9mdW5uZWxfaW4yPjsKKwkJCQl9OworCQkJfTsKKworCQkJcG9ydEAyIHsKKwkJCQlyZWcgPSA8MT47CisJCQkJZnVubmVsX2luMl9pbl9nZnhfY3g6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJICA8JmdmeF9jeF9vdXRfZnVubmVsX2luMj47CisJCQkJfTsKKwkJCX07CiAJCX07CiAJfTsKIApAQCAtMTQzMCw2ICsxNDg1LDE1IEBACiAJCQkJCQk8JnRwZGFfc3Bzc19vdXRfZnVubmVsX3Nwc3M+OwogCQkJCX07CiAJCQl9OworCisJCQlwb3J0QDIgeworCQkJCXJlZyA9IDwxPjsKKwkJCQlmdW5uZWxfc3Bzc19pbl9zcHNzX2V0bTA6IGVuZHBvaW50IHsKKwkJCQkJc2xhdmUtbW9kZTsKKwkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCTwmc3Bzc19ldG0wX291dF9mdW5uZWxfc3Bzcz47CisJCQkJfTsKKwkJCX07CiAJCX07CiAJfTsKIApAQCAtMTQ5Miw3ICsxNTU2LDcgQEAKIAkJcmVnID0gPDB4NjllMTAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOwogCi0JCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGkwLWRkcjAiOworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLUREUl9ETF8wX0NUSSI7CiAKIAkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OwogCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CkBAIC0xNTA0LDcgKzE1NjgsNyBAQAogCQlyZWcgPSA8MHg2OWU0MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAtZGRyMSI7CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktRERSX0RMXzFfQ1RJMCI7CiAKIAkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OwogCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CkBAIC0xNTE2LDcgKzE1ODAsNyBAQAogCQlyZWcgPSA8MHg2OWU1MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEtZGRyMSI7CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktRERSX0RMXzFfQ1RJMSI7CiAKIAkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OwogCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CkBAIC0xNTI4LDcgKzE1OTIsNyBAQAogCQlyZWcgPSA8MHg2YzA5MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAtZGxtbSI7CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktRExNTV9DVEkwIjsKIAogCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CiAJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKQEAgLTE1NDAsNyArMTYwNCw0MyBAQAogCQlyZWcgPSA8MHg2YzBhMDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTEtZGxtbSI7CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktRExNTV9DVEkxIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJY3RpMF9hcHNzOiBjdGlANzhlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk2Nj47CisJCXJlZyA9IDwweDc4ZTAwMDAgMHgxMDAwPjsKKwkJcmVnLW5hbWVzID0gImN0aS1iYXNlIjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtY3RpLUFQU1NfQ1RJMCI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJhcGJfcGNsayI7CisJfTsKKworCWN0aTFfYXBzczogY3RpQDc4ZjAwMDAgeworCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5NjY+OworCQlyZWcgPSA8MHg3OGYwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aS1BUFNTX0NUSTEiOworCisJCWNsb2NrcyA9IDwmY2xvY2tfYW9wIFFEU1NfQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCX07CisKKwljdGkyX2Fwc3M6IGN0aUA3OTAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJYXJtLHByaW1lY2VsbC1wZXJpcGhpZCA9IDwweDAwMDNiOTY2PjsKKwkJcmVnID0gPDB4NzkwMDAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiY3RpLWJhc2UiOworCisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktQVBTU19DVEkyIjsKIAogCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CiAJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKQEAgLTE4NjgsNyArMTk2OCwyMyBAQAogCQlyZWcgPSA8MHg2YjA0MDAwIDB4MTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjdGktYmFzZSI7CiAKLQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWN0aTAtc3dhbyI7CisJCWNvcmVzaWdodC1uYW1lID0gImNvcmVzaWdodC1jdGktU1dBT19DVEkwIjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CisJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKKwl9OworCisJIGlwY2JfdGd1OiB0Z3VANmIwYzAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCWFybSxwcmltZWNlbGwtcGVyaXBoaWQgPSA8MHgwMDAzYjk5OT47CisJCXJlZyA9IDwweDA2QjBDMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJ0Z3UtYmFzZSI7CisJCXRndS1zdGVwcyA9IDwzPjsKKwkJdGd1LWNvbmRpdGlvbnMgPSA8ND47CisJCXRndS1yZWdzID0gPDQ+OworCQl0Z3UtdGltZXItY291bnRlcnMgPSA8OD47CisKKwkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LXRndS1pcGNiIjsKIAogCQljbG9ja3MgPSA8JmNsb2NrX2FvcCBRRFNTX0NMSz47CiAJCWNsb2NrLW5hbWVzID0gImFwYl9wY2xrIjsKQEAgLTE5MzEsNiArMjA0NywyMCBAQAogCQl9OwogCX07CiAKKwlzcHNzX2V0bTAgeworCQljb21wYXRpYmxlID0gInFjb20sY29yZXNpZ2h0LWR1bW15IjsKKworCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtc3Bzcy1ldG0wIjsKKworCQlxY29tLGR1bW15LXNvdXJjZTsKKwkJcG9ydCB7CisJCQlzcHNzX2V0bTBfb3V0X2Z1bm5lbF9zcHNzOiBlbmRwb2ludCB7CisJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJPCZmdW5uZWxfc3Bzc19pbl9zcHNzX2V0bTA+OworCQkJfTsKKwkJfTsKKwl9OworCiAJZnVubmVsX2Fwc3NfbWVyZzogZnVubmVsQDc4MTAwMDAgewogCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOwogCQlhcm0scHJpbWVjZWxsLXBlcmlwaGlkID0gPDB4MDAwM2I5MDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1ncHUuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtZ3B1LmR0c2kKaW5kZXggMTlkNjllOS4uMTFiNmE0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1ncHUuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWdwdS5kdHNpCkBAIC03NSw2ICs3NSw4IEBACiAJCXFjb20sdHNlbnMtbmFtZSA9ICJ0c2Vuc190el9zZW5zb3IxMiI7CiAJCSNjb29saW5nLWNlbGxzID0gPDI+OwogCisJCXFjb20scG0tcW9zLWFjdGl2ZS1sYXRlbmN5ID0gPDQ2MD47CisKIAkJY2xvY2tzID0gPCZjbG9ja19nZnggR1BVX0NDX0dYX0dGWDNEX0NMSz4sCiAJCQk8JmNsb2NrX2dwdWNjIEdQVV9DQ19DWE9fQ0xLPiwKIAkJCTwmY2xvY2tfZ2NjIEdDQ19ERFJTU19HUFVfQVhJX0NMSz4sCkBAIC0xMjAsNiArMTIyLDM2IEBACiAJCWNhY2hlLXNsaWNlLW5hbWVzID0gImdwdSIsICJncHVodHciOwogCQljYWNoZS1zbGljZXMgPSA8JmxsY2MgMTI+LCA8JmxsY2MgMTE+OwogCisJCXFjb20sZ3B1LWNvcmVzaWdodHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxncHUtY29yZXNpZ2h0IjsKKworCQkJcWNvbSxncHUtY29yZXNpZ2h0QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQljb3Jlc2lnaHQtbmFtZSA9ICJjb3Jlc2lnaHQtZ2Z4IjsKKwkJCQljb3Jlc2lnaHQtYXRpZCA9IDw1MD47CisJCQkJcG9ydCB7CisJCQkJCWdmeF9vdXRfZnVubmVsX2luMjogZW5kcG9pbnQgeworCQkJCQkJcmVtb3RlLWVuZHBvaW50ID0KKwkJCQkJCSAgPCZmdW5uZWxfaW4yX2luX2dmeD47CisJCQkJCX07CisJCQkJfTsKKwkJCX07CisKKwkJCXFjb20sZ3B1LWNvcmVzaWdodEAxIHsKKwkJCQlyZWcgPSA8MT47CisJCQkJY29yZXNpZ2h0LW5hbWUgPSAiY29yZXNpZ2h0LWdmeC1jeCI7CisJCQkJY29yZXNpZ2h0LWF0aWQgPSA8NTE+OworCQkJCXBvcnQgeworCQkJCQlnZnhfY3hfb3V0X2Z1bm5lbF9pbjI6IGVuZHBvaW50IHsKKwkJCQkJCXJlbW90ZS1lbmRwb2ludCA9CisJCQkJCQkgIDwmZnVubmVsX2luMl9pbl9nZnhfY3g+OworCQkJCQl9OworCQkJCX07CisJCQl9OworCQl9OworCiAJCS8qIEdQVSBNZW1wb29scyAqLwogCQlxY29tLGdwdS1tZW1wb29scyB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKQEAgLTI2NCwxNCArMjk2LDggQEAKIAkJbGFiZWwgPSAia2dzbC1nbXUiOwogCQljb21wYXRpYmxlID0gInFjb20sZ3B1LWdtdSI7CiAKLQkJcmVnID0KLQkJCTwweDUwNmEwMDAgMHgzMTAwMD4sCi0JCQk8MHhiMjAwMDAwIDB4MzAwMDAwPiwKLQkJCTwweGMyMDAwMDAgMHgxMDAwMD47Ci0JCXJlZy1uYW1lcyA9Ci0JCQkia2dzbF9nbXVfcmVnIiwKLQkJCSJrZ3NsX2dtdV9wZGNfcmVnIiwKLQkJCSJrZ3NsX2dtdV9jcHJfcmVnIjsKKwkJcmVnID0gPDB4NTA2YTAwMCAweDMwMDAwPiwgPDB4YjIwMDAwMCAweDMwMDAwMD47CisJCXJlZy1uYW1lcyA9ICJrZ3NsX2dtdV9yZWciLCAia2dzbF9nbXVfcGRjX3JlZyI7CiAKIAkJaW50ZXJydXB0cyA9IDwwIDMwNCAwPiwgPDAgMzA1IDA+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAia2dzbF9oZmlfaXJxIiwgImtnc2xfZ211X2lycSI7CkBAIC0zMDMsOSArMzI5LDEwIEBACiAKIAkJCWNvbXBhdGlibGUgPSAicWNvbSxnbXUtcHdybGV2ZWxzIjsKIAorCQkJLyogR01VIHBvd2VyIGxldmVscyBtdXN0IGdvIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QgKi8KIAkJCXFjb20sZ211LXB3cmxldmVsQDAgewogCQkJCXJlZyA9IDwwPjsKLQkJCQlxY29tLGdtdS1mcmVxID0gPDQwMDAwMDAwMD47CisJCQkJcWNvbSxnbXUtZnJlcSA9IDwwPjsKIAkJCX07CiAKIAkJCXFjb20sZ211LXB3cmxldmVsQDEgewpAQCAtMzE1LDcgKzM0Miw3IEBACiAKIAkJCXFjb20sZ211LXB3cmxldmVsQDIgewogCQkJCXJlZyA9IDwyPjsKLQkJCQlxY29tLGdtdS1mcmVxID0gPDA+OworCQkJCXFjb20sZ211LWZyZXEgPSA8NDAwMDAwMDAwPjsKIAkJCX07CiAJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1wbTY2MC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXBtNjYwLmR0c2kKaW5kZXggY2FjNWJjMC4uY2M2MDlhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXBtNjYwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXBtNjYwLmR0c2kKQEAgLTg0LDE3ICs4NCw2IEBACiAJL2RlbGV0ZS1wcm9wZXJ0eS8gcWNvbSx2ZGRwLXJlZi1jbGstc3VwcGx5OwogfTsKIAotJnVmc3BoeV9jYXJkIHsKLQkvZGVsZXRlLXByb3BlcnR5LyB2ZGRhLXBoeS1zdXBwbHk7Ci0JL2RlbGV0ZS1wcm9wZXJ0eS8gdmRkYS1wbGwtc3VwcGx5OwotfTsKLQotJnVmc2hjX2NhcmQgewotCS9kZWxldGUtcHJvcGVydHkvIHZjYy1zdXBwbHk7Ci0JL2RlbGV0ZS1wcm9wZXJ0eS8gdmNjcTItc3VwcGx5OwotCS9kZWxldGUtcHJvcGVydHkvIHFjb20sdmRkcC1yZWYtY2xrLXN1cHBseTsKLX07Ci0KICZzZGhjXzIgewogCS9kZWxldGUtcHJvcGVydHkvIHZkZC1zdXBwbHk7CiAJL2RlbGV0ZS1wcm9wZXJ0eS8gdmRkLWlvLXN1cHBseTsKQEAgLTEyOSw2ICsxMTgsMTIgQEAKIAkvZGVsZXRlLXByb3BlcnR5LyB2cmVnLWN4LXN1cHBseTsKIH07CiAKKyZwY2llMSB7CisJL2RlbGV0ZS1wcm9wZXJ0eS8gdnJlZy0xLjgtc3VwcGx5OworCS9kZWxldGUtcHJvcGVydHkvIHZyZWctMC45LXN1cHBseTsKKwkvZGVsZXRlLXByb3BlcnR5LyB2cmVnLWN4LXN1cHBseTsKK307CisKICZjYW1fY3NpcGh5MCB7CiAJL2RlbGV0ZS1wcm9wZXJ0eS8gbWlwaS1jc2ktdmRkLXN1cHBseTsKIH07CkBAIC0xODgsNiArMTgzLDEyIEBACiAJCS9kZWxldGUtcHJvcGVydHkvIGNhbV92aW8tc3VwcGx5OwogCQkvZGVsZXRlLXByb3BlcnR5LyBjYW1fdmFuYS1zdXBwbHk7CiAJfTsKKworCXFjb20sY2FtLXNlbnNvckAzIHsKKwkJL2RlbGV0ZS1wcm9wZXJ0eS8gY2FtX3Zpby1zdXBwbHk7CisJCS9kZWxldGUtcHJvcGVydHkvIGNhbV92YW5hLXN1cHBseTsKKwl9OworCiB9OwogCiAmY2xvY2tfZ2NjIHsKQEAgLTIxMCwxMSArMjExLDExIEBACiAKICZjbG9ja19ncHVjYyB7CiAJL2RlbGV0ZS1wcm9wZXJ0eS8gdmRkX2N4LXN1cHBseTsKKwkvZGVsZXRlLXByb3BlcnR5LyB2ZGRfbXgtc3VwcGx5OwogfTsKIAogJmNsb2NrX2dmeCB7CiAJL2RlbGV0ZS1wcm9wZXJ0eS8gdmRkX2dmeC1zdXBwbHk7Ci0JL2RlbGV0ZS1wcm9wZXJ0eS8gdmRkX214LXN1cHBseTsKIH07CiAKICZwaWxfbW9kZW0gewpAQCAtMzgzLDYgKzM4NCw3IEBACiAjaW5jbHVkZSAicG02NjAuZHRzaSIKICNpbmNsdWRlICJwbTY2MGwuZHRzaSIKICNpbmNsdWRlICJzZG02NzAtcmVndWxhdG9yLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLXBtaWMtb3ZlcmxheS5kdHNpIgogCiAmc29jIHsKIAkvZGVsZXRlLW5vZGUvIHRoZXJtYWwtem9uZXM7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtYXVkaW8tb3ZlcmxheS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmQ1MjAxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworJnBtNjYwbF8zIHsKKwkvZGVsZXRlLW5vZGUvYW5hbG9nLWNvZGVjOworfTsKKworJnNvYyB7CisJL2RlbGV0ZS1ub2RlL21zbS1zZHctY29kZWNANjJlYzEwMDA7CisJL2RlbGV0ZS1ub2RlL2NkY19wZG1fcGluY3RybDsKKwkvZGVsZXRlLW5vZGUvd3NhX3Nwa3JfZW4xX3BpbmN0cmw7CisJL2RlbGV0ZS1ub2RlL3dzYV9zcGtyX2VuMl9waW5jdHJsOworCS9kZWxldGUtbm9kZS9zZHdfY2xrX2RhdGFfcGluY3RybDsKK307CisKKyZxdXB2M19zZThfc3BpIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2NkOXh4eF9pbnRjIHsKKwlzdGF0dXMgPSAib2theSI7CisJcWNvbSxncGlvLWNvbm5lY3QgPSA8JnRsbW0gNTQgMD47Cit9OworCismd2RzcF9tZ3IgeworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZ3ZHNwX2dsaW5rIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2NkOTM0eF9jZGMgeworCXN0YXR1cyA9ICJva2F5IjsKK307CisKKyZjbG9ja19hdWRpb19sbmJiIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismd2NkX3JzdF9ncGlvIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1hdWRpby5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1hdWRpby5kdHNpCmluZGV4IGY4NjFjYTMuLjg4ODkyZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtYXVkaW8uZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLWF1ZGlvLmR0c2kKQEAgLTEwLDQ0ICsxMCwxNyBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSAic2RtNjcwLWF1ZGlvLmR0c2kiCiAKICZtc21fYXVkaW9faW9uIHsKIAlpb21tdXMgPSA8JmFwcHNfc21tdSAweDE4MjEgMHgwPjsKIAlxY29tLHNtbXUtc2lkLW1hc2sgPSAvYml0cy8gNjQgPDB4Zj47CiB9OwogCi0mcXVwdjNfc2U4X3NwaSB7Ci0Jc3RhdHVzID0gIm9rYXkiOwotfTsKLQotJnBtNjYwbF8zIHsKLQkvZGVsZXRlLW5vZGUvYW5hbG9nLWNvZGVjOwotfTsKLQogJnNvYyB7Ci0JL2RlbGV0ZS1ub2RlL21zbS1zZHctY29kZWNANjJlYzEwMDA7CiAJL2RlbGV0ZS1ub2RlL3NvdW5kOwotCS9kZWxldGUtbm9kZS9jZGNfcGRtX3BpbmN0cmw7Ci0JL2RlbGV0ZS1ub2RlL3dzYV9zcGtyX2VuMV9waW5jdHJsOwotCS9kZWxldGUtbm9kZS93c2Ffc3Brcl9lbjJfcGluY3RybDsKLQkvZGVsZXRlLW5vZGUvc2R3X2Nsa19kYXRhX3BpbmN0cmw7CiB9OwogCi0mbXNtX2F1ZGlvX2lvbiB7Ci0JaW9tbXVzID0gPCZhcHBzX3NtbXUgMHgxODIxIDB4MD47Ci19OwotCi0md2NkOXh4eF9pbnRjIHsKLQlzdGF0dXMgPSAib2theSI7Ci0JcWNvbSxncGlvLWNvbm5lY3QgPSA8JnRsbW0gNTQgMD47Ci19OwotCi0md2RzcF9tZ3IgewotCXN0YXR1cyA9ICJva2F5IjsKLX07Ci0KLSZ3ZHNwX2dsaW5rIHsKKyZ0YXZpbF9zbmQgewogCXN0YXR1cyA9ICJva2F5IjsKIH07CiAKQEAgLTU4LDI0ICszMSwzIEBACiAmZGFpX3NsaW0gewogCXN0YXR1cyA9ICJva2F5IjsKIH07Ci0KLSZ3Y2Q5MzR4X2NkYyB7Ci0Jc3RhdHVzID0gIm9rYXkiOwotfTsKLQotJmNsb2NrX2F1ZGlvX2xuYmIgewotCXN0YXR1cyA9ICJva2F5IjsKLX07Ci0KLSZ3Y2RfcnN0X2dwaW8gewotCXN0YXR1cyA9ICJva2F5IjsKLX07Ci0KLSZ3Y2Q5eHh4X2ludGMgewotCXN0YXR1cyA9ICJva2F5IjsKLX07Ci0KLSZ0YXZpbF9zbmQgewotCXN0YXR1cyA9ICJva2F5IjsKLX07Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtY2RwLW92ZXJsYXkuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAtb3ZlcmxheS5kdHMKaW5kZXggZGE1OWJjZi4uOWQ2MTMyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAtb3ZlcmxheS5kdHMKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAtb3ZlcmxheS5kdHMKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgInNkbTg0NS1zZGUtZGlzcGxheS5kdHNpIgogI2luY2x1ZGUgInNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAuZHRzaSIKLQorI2luY2x1ZGUgInNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1hdWRpby1vdmVybGF5LmR0c2kiCiAvIHsKIAltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNODQ1IHYxIEludGVycG9zZXIgU0RNNjcwIENEUCI7CiAJY29tcGF0aWJsZSA9ICJxY29tLHNkbTg0NS1jZHAiLCAicWNvbSxzZG04NDUiLCAicWNvbSxjZHAiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAuZHRzCmluZGV4IGViYjVlOGYuLjU5Nzc3M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtY2RwLmR0cworKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLWNkcC5kdHMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlICJzZG04NDUtaW50ZXJwb3Nlci1zZG02NzAuZHRzaSIKICNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKICNpbmNsdWRlICJzZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtY2RwLmR0c2kiCisjaW5jbHVkZSAic2RtNjcwLWF1ZGlvLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWludGVycG9zZXItc2RtNjcwLWF1ZGlvLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBNU00gc2RtODQ1IHYxIEludGVycG9zZXIgU0RNNjcwIENEUCI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLWNkcC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1jZHAuZHRzaQppbmRleCBhZDE1NjE1Li4xMjY1ZDJhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLWNkcC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtY2RwLmR0c2kKQEAgLTEyLDQgKzEyLDI4IEBACiAKICNpbmNsdWRlICJzZG04NDUtY2RwLmR0c2kiCiAjaW5jbHVkZSAic2RtODQ1LWludGVycG9zZXItcG02NjAuZHRzaSIKLSNpbmNsdWRlICJzZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtYXVkaW8uZHRzaSIKKworJnNvYyB7CisJL2RlbGV0ZS1ub2RlLyBzc3VzYkBhODAwMDAwOworCS9kZWxldGUtbm9kZS8gcXVzYkA4OGUzMDAwOworCS9kZWxldGUtbm9kZS8gc3NwaHlAODhlYjAwMDsKK307CisKKyZ1c2IwIHsKKwlleHRjb24gPSA8JnBtNjYwX3BkcGh5PiwgPCZwbTY2MF9wZHBoeT4sIDwwPiAvKiA8JmV1ZD4gKi87Cit9OworCismcXVzYl9waHkwIHsKKwl2ZGQtc3VwcGx5ID0gPCZwbTY2MGxfbDE+OworCXZkZGExOC1zdXBwbHkgPSA8JnBtNjYwX2wxMD47CisJdmRkYTMzLXN1cHBseSA9IDwmcG02NjBsX2w3PjsKK307CisKKyZ1c2JfcW1wX2RwX3BoeSB7CisJdmRkLXN1cHBseSA9IDwmcG02NjBsX2wxPjsgLyogMC44OHYgKi8KKwljb3JlLXN1cHBseSA9IDwmcG02NjBfbDE+OyAvKiAxLjJ2ICovCit9OworCismcGNpZTAgeworCXN0YXR1cyA9ICJkaXNhYmxlZCI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1tdHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC1vdmVybGF5LmR0cwppbmRleCAzY2ExNWI5Li4xNjkwMTc0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC1vdmVybGF5LmR0cworKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC1vdmVybGF5LmR0cwpAQCAtMjEsNyArMjEsNyBAQAogCiAjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCiAjaW5jbHVkZSAic2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC5kdHNpIgotCisjaW5jbHVkZSAic2RtODQ1LWludGVycG9zZXItc2RtNjcwLWF1ZGlvLW92ZXJsYXkuZHRzaSIKIC8gewogCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE04NDUgdjEgSW50ZXJwb3NlciBTRE02NzAgTVRQIjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtODQ1LW10cCIsICJxY29tLHNkbTg0NSIsICJxY29tLG10cCI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC5kdHMKaW5kZXggMzk2NjRmMS4uNTI4NjlkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1tdHAuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtbXRwLmR0cwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgInNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC5kdHNpIgogI2luY2x1ZGUgInNkbTg0NS1zZGUtZGlzcGxheS5kdHNpIgogI2luY2x1ZGUgInNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1tdHAuZHRzaSIKKyNpbmNsdWRlICJzZG02NzAtYXVkaW8uZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtYXVkaW8uZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIE1TTSBzZG04NDUgdjEgSW50ZXJwb3NlciBTRE02NzAgTVRQIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtbXRwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LWludGVycG9zZXItc2RtNjcwLW10cC5kdHNpCmluZGV4IGM3MDk3NzAuLjlkNzIyZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtaW50ZXJwb3Nlci1zZG02NzAtbXRwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1tdHAuZHRzaQpAQCAtMTIsOCArMTIsMzMgQEAKIAogI2luY2x1ZGUgInNkbTg0NS1tdHAuZHRzaSIKICNpbmNsdWRlICJzZG04NDUtaW50ZXJwb3Nlci1wbTY2MC5kdHNpIgotI2luY2x1ZGUgInNkbTg0NS1pbnRlcnBvc2VyLXNkbTY3MC1hdWRpby5kdHNpIgogCiAmcXVwdjNfc2UxMF9pMmMgewogCS9kZWxldGUtbm9kZS8gcWNvbSxzbWIxMzU1QDg7CisJL2RlbGV0ZS1ub2RlLyBxY29tLHNtYjEzNTVAYzsKK307CisKKyZzb2MgeworCS9kZWxldGUtbm9kZS8gc3N1c2JAYTgwMDAwMDsKKwkvZGVsZXRlLW5vZGUvIHF1c2JAODhlMzAwMDsKKwkvZGVsZXRlLW5vZGUvIHNzcGh5QDg4ZWIwMDA7Cit9OworCismdXNiMCB7CisJZXh0Y29uID0gPCZwbTY2MF9wZHBoeT4sIDwmcG02NjBfcGRwaHk+LCA8MD4gLyogPCZldWQ+ICovOworfTsKKworJnF1c2JfcGh5MCB7CisJdmRkLXN1cHBseSA9IDwmcG02NjBsX2wxPjsKKwl2ZGRhMTgtc3VwcGx5ID0gPCZwbTY2MF9sMTA+OworCXZkZGEzMy1zdXBwbHkgPSA8JnBtNjYwbF9sNz47Cit9OworCismdXNiX3FtcF9kcF9waHkgeworCXZkZC1zdXBwbHkgPSA8JnBtNjYwbF9sMT47IC8qIDAuODh2ICovCisJY29yZS1zdXBwbHkgPSA8JnBtNjYwX2wxPjsgLyogMS4ydiAqLworfTsKKworJnBjaWUwIHsKKwlzdGF0dXMgPSAiZGlzYWJsZWQiOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtbXRwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LW10cC5kdHNpCmluZGV4IDNkNThkYzEuLmYwZDE2ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtbXRwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1tdHAuZHRzaQpAQCAtMTk4LDYgKzE5OCw3IEBACiAJdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19waHlfZ2RzYz47CiAJdmRkLWhiYS1maXhlZC1yZWd1bGF0b3I7CiAJdmNjLXN1cHBseSA9IDwmcG04OTk4X2wyMD47CisJdmNjLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk1MDAwMCAyOTYwMDAwPjsKIAl2Y2NxMi1zdXBwbHkgPSA8JnBtODk5OF9zND47CiAJdmNjLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwogCXZjY3EyLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwpAQCAtMjA4LDQ0ICsyMDksNiBAQAogCXN0YXR1cyA9ICJvayI7CiB9OwogCi0mZXh0Y29uX3N0b3JhZ2VfY2QgewotCWdwaW8gPSA8JnRsbW0gMTI2IEdQSU9fQUNUSVZFX0xPVz47Ci0JZGVib3VuY2UtbXMgPSA8MjAwPjsKLQlpcnEtZmxhZ3MgPSA8SVJRX1RZUEVfRURHRV9CT1RIPjsKLQotCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Ci0JcGluY3RybC0wID0gPCZzdG9yYWdlX2NkPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCi0mdWZzcGh5X2NhcmQgewotCWNvbXBhdGlibGUgPSAicWNvbSx1ZnMtcGh5LXFtcC12MyI7Ci0KLQl2ZGRhLXBoeS1zdXBwbHkgPSA8JnBtODk5OF9sMT47IC8qIDAuODh2ICovCi0JdmRkYS1wbGwtc3VwcGx5ID0gPCZwbTg5OThfbDI2PjsgLyogMS4ydiAqLwotCXZkZGEtcGh5LW1heC1taWNyb2FtcCA9IDw2MjkwMD47Ci0JdmRkYS1wbGwtbWF4LW1pY3JvYW1wID0gPDE4MzAwPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCi0mdWZzaGNfY2FyZCB7Ci0JdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19jYXJkX2dkc2M+OwotCXZkZC1oYmEtZml4ZWQtcmVndWxhdG9yOwotCXZjYy1zdXBwbHkgPSA8JnBtODk5OF9sMjE+OwotCXZjY3EyLXN1cHBseSA9IDwmcG04OTk4X3M0PjsKLQl2Y2MtbWF4LW1pY3JvYW1wID0gPDMwMDAwMD47Ci0JdmNjcTItbWF4LW1pY3JvYW1wID0gPDMwMDAwMD47Ci0KLQlxY29tLHZkZHAtcmVmLWNsay1zdXBwbHkgPSA8JnBtODk5OF9sMj47Ci0JcWNvbSx2ZGRwLXJlZi1jbGstbWF4LW1pY3JvYW1wID0gPDEwMD47Ci0KLQlleHRjb24gPSA8JmV4dGNvbl9zdG9yYWdlX2NkPjsKLQotCXN0YXR1cyA9ICJvayI7Ci19OwotCiAmc2RoY18yIHsKIAl2ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDIxPjsKIAlxY29tLHZkZC12b2x0YWdlLWxldmVsID0gPDI5NTAwMDAgMjk2MDAwMD47CkBAIC0yNTYsMTAgKzIxOSwxMCBAQAogCXFjb20sdmRkLWlvLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDIyMDAwPjsKIAogCXBpbmN0cmwtbmFtZXMgPSAiYWN0aXZlIiwgInNsZWVwIjsKLQlwaW5jdHJsLTAgPSA8JnNkYzJfY2xrX29uICAmc2RjMl9jbWRfb24gJnNkYzJfZGF0YV9vbj47Ci0JcGluY3RybC0xID0gPCZzZGMyX2Nsa19vZmYgJnNkYzJfY21kX29mZiAmc2RjMl9kYXRhX29mZj47CisJcGluY3RybC0wID0gPCZzZGMyX2Nsa19vbiAgJnNkYzJfY21kX29uICZzZGMyX2RhdGFfb24gJnN0b3JhZ2VfY2Q+OworCXBpbmN0cmwtMSA9IDwmc2RjMl9jbGtfb2ZmICZzZGMyX2NtZF9vZmYgJnNkYzJfZGF0YV9vZmYgJnN0b3JhZ2VfY2Q+OwogCi0JZXh0Y29uID0gPCZleHRjb25fc3RvcmFnZV9jZD47CisJY2QtZ3Bpb3MgPSA8JnRsbW0gMTI2IEdQSU9fQUNUSVZFX0xPVz47CiAKIAlzdGF0dXMgPSAib2siOwogfTsKQEAgLTI5MSw3ICsyNTQsMTEgQEAKIAlxY29tLGJhdHRlcnktZGF0YSA9IDwmbXRwX2JhdHRlcnlkYXRhPjsKIH07CiAKLSZzbWIxMzU1X2NoYXJnZXIgeworJnNtYjEzNTVfY2hhcmdlcl8wIHsKKwlzdGF0dXMgPSAib2siOworfTsKKworJnNtYjEzNTVfY2hhcmdlcl8xIHsKIAlzdGF0dXMgPSAib2siOwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1wY2llLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXBjaWUuZHRzaQppbmRleCBjN2E0ZDdkLi4zMjJjNWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXBjaWUuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXBjaWUuZHRzaQpAQCAtMTE4LDEwICsxMTgsOSBAQAogCQkJCQkweDA2OCAweDE2IDB4MAogCQkJCQkweDA3MCAweDM2IDB4MAogCQkJCQkweDE4NCAweDAxIDB4MAotCQkJCQkweDE1YyAweDE2IDB4MAogCQkJCQkweDEzOCAweDMzIDB4MAogCQkJCQkweDAzYyAweDAyIDB4MAotCQkJCQkweDA0MCAweDA3IDB4MAorCQkJCQkweDA0MCAweDA2IDB4MAogCQkJCQkweDA4MCAweDA0IDB4MAogCQkJCQkweDBkYyAweDAwIDB4MAogCQkJCQkweDBkOCAweDNmIDB4MApAQCAtMTM4LDcgKzEzNyw3IEBACiAJCQkJCTB4MjYwIDB4MTAgMHgwCiAJCQkJCTB4MjhjIDB4MDYgMHgwCiAJCQkJCTB4NTA0IDB4MDMgMHgwCi0JCQkJCTB4NTAwIDB4MWMgMHgwCisJCQkJCTB4NTAwIDB4MTAgMHgwCiAJCQkJCTB4NTBjIDB4MTQgMHgwCiAJCQkJCTB4NGQ0IDB4MGUgMHgwCiAJCQkJCTB4NGQ4IDB4MDQgMHgwCkBAIC0xNTUsNyArMTU0LDcgQEAKIAkJCQkJMHg0M2MgMHg0MCAweDAKIAkJCQkJMHg4NTQgMHgwNCAweDAKIAkJCQkJMHg2MmMgMHg1MiAweDAKLQkJCQkJMHg2NTQgMHg1MCAweDAKKwkJCQkJMHg2NTQgMHgxMCAweDAKIAkJCQkJMHg2NWMgMHgxYSAweDAKIAkJCQkJMHg2NjAgMHgwNiAweDAKIAkJCQkJMHg4YzggMHg4MyAweDAKQEAgLTE3MCw3ICsxNjksNyBAQAogCQkJCQkweDlhOCAweDAwIDB4MAogCQkJCQkweDhhNCAweDAxIDB4MAogCQkJCQkweDhhOCAweDczIDB4MAotCQkJCQkweDlkOCAweGFhIDB4MAorCQkJCQkweDlkOCAweGJiIDB4MAogCQkJCQkweDliMCAweDAzIDB4MAogCQkJCQkweGEwYyAweDBkIDB4MAogCQkJCQkweDg2YyAweDAwIDB4MApAQCAtMjY2LDQgKzI2NSwzMzcgQEAKIAkJcmVzZXQtbmFtZXMgPSAicGNpZV8wX2NvcmVfcmVzZXQiLAogCQkJCSJwY2llXzBfcGh5X3Jlc2V0IjsKIAl9OworCisJcGNpZTE6IHFjb20scGNpZUAweDFjMDgwMDAgeworCQljb21wYXRpYmxlID0gInFjb20scGNpLW1zbSI7CisJCWNlbGwtaW5kZXggPSA8MT47CisKKwkJcmVnID0gPDB4MWMwODAwMCAweDIwMDA+LAorCQkgICAgICA8MHgxYzBhMDAwIDB4MjAwMD4sCisJCSAgICAgIDwweDQwMDAwMDAwIDB4ZjFkPiwKKwkJICAgICAgPDB4NDAwMDBmMjAgMHhhOD4sCisJCSAgICAgIDwweDQwMTAwMDAwIDB4MTAwMDAwPiwKKwkJICAgICAgPDB4NDAyMDAwMDAgMHgxMDAwMDA+LAorCQkgICAgICA8MHg0MDMwMDAwMCAweDFmZDAwMDAwPjsKKworCQlyZWctbmFtZXMgPSAicGFyZiIsICJwaHkiLCAiZG1fY29yZSIsICJlbGJpIiwKKwkJCQkiY29uZiIsICJpbyIsICJiYXJzIjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCXJhbmdlcyA9IDwweDAxMDAwMDAwIDB4MCAweDQwMjAwMDAwIDB4NDAyMDAwMDAgMHgwIDB4MTAwMDAwPiwKKwkJCTwweDAyMDAwMDAwIDB4MCAweDQwMzAwMDAwIDB4NDAzMDAwMDAgMHgwIDB4MWZkMDAwMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwY2llMT47CisJCWludGVycnVwdHMgPSA8MCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOQorCQkJCTIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1CisJCQkJMzYgMzc+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MCAwIDAgMHhmZmZmZmZmZj47CisJCWludGVycnVwdC1tYXAgPSA8MCAwIDAgMCAmaW50YyAwIDMwNyAwCisJCQkJMCAwIDAgMSAmaW50YyAwIDQzNCAwCisJCQkJMCAwIDAgMiAmaW50YyAwIDQzNSAwCisJCQkJMCAwIDAgMyAmaW50YyAwIDQzOCAwCisJCQkJMCAwIDAgNCAmaW50YyAwIDQzOSAwCisJCQkJMCAwIDAgNSAmaW50YyAwIDMwNiAwCisJCQkJMCAwIDAgNiAmaW50YyAwIDcwNCAwCisJCQkJMCAwIDAgNyAmaW50YyAwIDcwNSAwCisJCQkJMCAwIDAgOCAmaW50YyAwIDcwNiAwCisJCQkJMCAwIDAgOSAmaW50YyAwIDcwNyAwCisJCQkJMCAwIDAgMTAgJmludGMgMCA3MDggMAorCQkJCTAgMCAwIDExICZpbnRjIDAgNzA5IDAKKwkJCQkwIDAgMCAxMiAmaW50YyAwIDcxMCAwCisJCQkJMCAwIDAgMTMgJmludGMgMCA3MTEgMAorCQkJCTAgMCAwIDE0ICZpbnRjIDAgNzEyIDAKKwkJCQkwIDAgMCAxNSAmaW50YyAwIDcxMyAwCisJCQkJMCAwIDAgMTYgJmludGMgMCA3MTQgMAorCQkJCTAgMCAwIDE3ICZpbnRjIDAgNzE1IDAKKwkJCQkwIDAgMCAxOCAmaW50YyAwIDcxNiAwCisJCQkJMCAwIDAgMTkgJmludGMgMCA3MTcgMAorCQkJCTAgMCAwIDIwICZpbnRjIDAgNzE4IDAKKwkJCQkwIDAgMCAyMSAmaW50YyAwIDcxOSAwCisJCQkJMCAwIDAgMjIgJmludGMgMCA3MjAgMAorCQkJCTAgMCAwIDIzICZpbnRjIDAgNzIxIDAKKwkJCQkwIDAgMCAyNCAmaW50YyAwIDcyMiAwCisJCQkJMCAwIDAgMjUgJmludGMgMCA3MjMgMAorCQkJCTAgMCAwIDI2ICZpbnRjIDAgNzI0IDAKKwkJCQkwIDAgMCAyNyAmaW50YyAwIDcyNSAwCisJCQkJMCAwIDAgMjggJmludGMgMCA3MjYgMAorCQkJCTAgMCAwIDI5ICZpbnRjIDAgNzI3IDAKKwkJCQkwIDAgMCAzMCAmaW50YyAwIDcyOCAwCisJCQkJMCAwIDAgMzEgJmludGMgMCA3MjkgMAorCQkJCTAgMCAwIDMyICZpbnRjIDAgNzMwIDAKKwkJCQkwIDAgMCAzMyAmaW50YyAwIDczMSAwCisJCQkJMCAwIDAgMzQgJmludGMgMCA3MzIgMAorCQkJCTAgMCAwIDM1ICZpbnRjIDAgNzMzIDAKKwkJCQkwIDAgMCAzNiAmaW50YyAwIDczNCAwCisJCQkJMCAwIDAgMzcgJmludGMgMCA3MzUgMD47CisKKwkJaW50ZXJydXB0LW5hbWVzID0gImludF9tc2kiLCAiaW50X2EiLCAiaW50X2IiLCAiaW50X2MiLAorCQkJCSJpbnRfZCIsICJpbnRfZ2xvYmFsX2ludCIsCisJCQkJIm1zaV8wIiwgIm1zaV8xIiwgIm1zaV8yIiwgIm1zaV8zIiwKKwkJCQkibXNpXzQiLCAibXNpXzUiLCAibXNpXzYiLCAibXNpXzciLAorCQkJCSJtc2lfOCIsICJtc2lfOSIsICJtc2lfMTAiLCAibXNpXzExIiwKKwkJCQkibXNpXzEyIiwgIm1zaV8xMyIsICJtc2lfMTQiLCAibXNpXzE1IiwKKwkJCQkibXNpXzE2IiwgIm1zaV8xNyIsICJtc2lfMTgiLCAibXNpXzE5IiwKKwkJCQkibXNpXzIwIiwgIm1zaV8yMSIsICJtc2lfMjIiLCAibXNpXzIzIiwKKwkJCQkibXNpXzI0IiwgIm1zaV8yNSIsICJtc2lfMjYiLCAibXNpXzI3IiwKKwkJCQkibXNpXzI4IiwgIm1zaV8yOSIsICJtc2lfMzAiLCAibXNpXzMxIjsKKworCQlxY29tLHBoeS1zZXF1ZW5jZSA9IDwweDE4MDQgMHgwMyAweDAKKwkJCQkJMHgwMGRjIDB4MjcgMHgwCisJCQkJCTB4MDAxNCAweDAxIDB4MAorCQkJCQkweDAwMjAgMHgzMSAweDAKKwkJCQkJMHgwMDI0IDB4MDEgMHgwCisJCQkJCTB4MDAyOCAweGRlIDB4MAorCQkJCQkweDAwMmMgMHgwNyAweDAKKwkJCQkJMHgwMDM0IDB4NGMgMHgwCisJCQkJCTB4MDAzOCAweDA2IDB4MAorCQkJCQkweDAwNTQgMHgxOCAweDAKKwkJCQkJMHgwMDU4IDB4YjAgMHgwCisJCQkJCTB4MDA2YyAweDhjIDB4MAorCQkJCQkweDAwNzAgMHgyMCAweDAKKwkJCQkJMHgwMDc4IDB4MTQgMHgwCisJCQkJCTB4MDA3YyAweDM0IDB4MAorCQkJCQkweDAwYjQgMHgwNiAweDAKKwkJCQkJMHgwMGI4IDB4MDYgMHgwCisJCQkJCTB4MDBjMCAweDE2IDB4MAorCQkJCQkweDAwYzQgMHgxNiAweDAKKwkJCQkJMHgwMGNjIDB4MzYgMHgwCisJCQkJCTB4MDBkMCAweDM2IDB4MAorCQkJCQkweDAwZjAgMHgwNSAweDAKKwkJCQkJMHgwMGY4IDB4NDIgMHgwCisJCQkJCTB4MDEwMCAweDgyIDB4MAorCQkJCQkweDAxMDggMHg2OCAweDAKKwkJCQkJMHgwMTFjIDB4NTUgMHgwCisJCQkJCTB4MDEyMCAweDU1IDB4MAorCQkJCQkweDAxMjQgMHgwMyAweDAKKwkJCQkJMHgwMTI4IDB4YWIgMHgwCisJCQkJCTB4MDEyYyAweGFhIDB4MAorCQkJCQkweDAxMzAgMHgwMiAweDAKKwkJCQkJMHgwMTUwIDB4M2YgMHgwCisJCQkJCTB4MDE1OCAweDNmIDB4MAorCQkJCQkweDAxNzggMHgxMCAweDAKKwkJCQkJMHgwMWNjIDB4MDQgMHgwCisJCQkJCTB4MDFkMCAweDMwIDB4MAorCQkJCQkweDAxZTAgMHgwNCAweDAKKwkJCQkJMHgwMWU4IDB4NzMgMHgwCisJCQkJCTB4MDFmMCAweDFjIDB4MAorCQkJCQkweDAxZmMgMHgxNSAweDAKKwkJCQkJMHgwMjFjIDB4MDQgMHgwCisJCQkJCTB4MDIyNCAweDAxIDB4MAorCQkJCQkweDAyMjggMHgyMiAweDAKKwkJCQkJMHgwMjJjIDB4MDAgMHgwCisJCQkJCTB4MDA5OCAweDA1IDB4MAorCQkJCQkweDA4MGMgMHgwMCAweDAKKwkJCQkJMHgwODE4IDB4MGQgMHgwCisJCQkJCTB4MDg2MCAweDAxIDB4MAorCQkJCQkweDA4NjQgMHgzYSAweDAKKwkJCQkJMHgwODdjIDB4MmYgMHgwCisJCQkJCTB4MDhjMCAweDA5IDB4MAorCQkJCQkweDA4YzQgMHgwOSAweDAKKwkJCQkJMHgwOGM4IDB4MWEgMHgwCisJCQkJCTB4MDhkMCAweDAxIDB4MAorCQkJCQkweDA4ZDQgMHgwNyAweDAKKwkJCQkJMHgwOGQ4IDB4MzEgMHgwCisJCQkJCTB4MDhkYyAweDMxIDB4MAorCQkJCQkweDA4ZTAgMHgwMyAweDAKKwkJCQkJMHgwOGZjIDB4MDIgMHgwCisJCQkJCTB4MDkwMCAweDAxIDB4MAorCQkJCQkweDA5MDggMHgxMiAweDAKKwkJCQkJMHgwOTE0IDB4MjUgMHgwCisJCQkJCTB4MDkxOCAweDAwIDB4MAorCQkJCQkweDA5MWMgMHgwNSAweDAKKwkJCQkJMHgwOTIwIDB4MDEgMHgwCisJCQkJCTB4MDkyNCAweDI2IDB4MAorCQkJCQkweDA5MjggMHgxMiAweDAKKwkJCQkJMHgwOTMwIDB4MDQgMHgwCisJCQkJCTB4MDkzNCAweDA0IDB4MAorCQkJCQkweDA5MzggMHgwOSAweDAKKwkJCQkJMHgwOTU0IDB4MTUgMHgwCisJCQkJCTB4MDk2MCAweDMyIDB4MAorCQkJCQkweDA5NjggMHg3ZiAweDAKKwkJCQkJMHgwOTZjIDB4MDcgMHgwCisJCQkJCTB4MDk3OCAweDA0IDB4MAorCQkJCQkweDA5ODAgMHg3MCAweDAKKwkJCQkJMHgwOTg0IDB4OGIgMHgwCisJCQkJCTB4MDk4OCAweDA4IDB4MAorCQkJCQkweDA5OGMgMHgwOSAweDAKKwkJCQkJMHgwOTkwIDB4MDMgMHgwCisJCQkJCTB4MDk5NCAweDA0IDB4MAorCQkJCQkweDA5OTggMHgwMiAweDAKKwkJCQkJMHgwOTljIDB4MGMgMHgwCisJCQkJCTB4MDlhNCAweDAyIDB4MAorCQkJCQkweDA5YzAgMHg1YyAweDAKKwkJCQkJMHgwOWM0IDB4M2UgMHgwCisJCQkJCTB4MDljOCAweDNmIDB4MAorCQkJCQkweDBhMzAgMHgwMSAweDAKKwkJCQkJMHgwYTM0IDB4YTAgMHgwCisJCQkJCTB4MGEzOCAweDA4IDB4MAorCQkJCQkweDBhYTQgMHgwMSAweDAKKwkJCQkJMHgwYWFjIDB4YzMgMHgwCisJCQkJCTB4MGFiMCAweDAwIDB4MAorCQkJCQkweDBhYjggMHg4YyAweDAKKwkJCQkJMHgwYWMwIDB4N2YgMHgwCisJCQkJCTB4MGFjNCAweDJhIDB4MAorCQkJCQkweDA4MTAgMHgwYyAweDAKKwkJCQkJMHgwODE0IDB4MDAgMHgwCisJCQkJCTB4MGFjYyAweDA0IDB4MAorCQkJCQkweDA5M2MgMHgyMCAweDAKKwkJCQkJMHgxMDBjIDB4MDAgMHgwCisJCQkJCTB4MTAxOCAweDBkIDB4MAorCQkJCQkweDEwNjAgMHgwMSAweDAKKwkJCQkJMHgxMDY0IDB4M2EgMHgwCisJCQkJCTB4MTA3YyAweDJmIDB4MAorCQkJCQkweDEwYzAgMHgwOSAweDAKKwkJCQkJMHgxMGM0IDB4MDkgMHgwCisJCQkJCTB4MTBjOCAweDFhIDB4MAorCQkJCQkweDEwZDAgMHgwMSAweDAKKwkJCQkJMHgxMGQ0IDB4MDcgMHgwCisJCQkJCTB4MTBkOCAweDMxIDB4MAorCQkJCQkweDEwZGMgMHgzMSAweDAKKwkJCQkJMHgxMGUwIDB4MDMgMHgwCisJCQkJCTB4MTBmYyAweDAyIDB4MAorCQkJCQkweDExMDAgMHgwMSAweDAKKwkJCQkJMHgxMTA4IDB4MTIgMHgwCisJCQkJCTB4MTExNCAweDI1IDB4MAorCQkJCQkweDExMTggMHgwMCAweDAKKwkJCQkJMHgxMTFjIDB4MDUgMHgwCisJCQkJCTB4MTEyMCAweDAxIDB4MAorCQkJCQkweDExMjQgMHgyNiAweDAKKwkJCQkJMHgxMTI4IDB4MTIgMHgwCisJCQkJCTB4MTEzMCAweDA0IDB4MAorCQkJCQkweDExMzQgMHgwNCAweDAKKwkJCQkJMHgxMTM4IDB4MDkgMHgwCisJCQkJCTB4MTE1NCAweDE1IDB4MAorCQkJCQkweDExNjAgMHgzMiAweDAKKwkJCQkJMHgxMTY4IDB4N2YgMHgwCisJCQkJCTB4MTE2YyAweDA3IDB4MAorCQkJCQkweDExNzggMHgwNCAweDAKKwkJCQkJMHgxMTgwIDB4NzAgMHgwCisJCQkJCTB4MTE4NCAweDhiIDB4MAorCQkJCQkweDExODggMHgwOCAweDAKKwkJCQkJMHgxMThjIDB4MDkgMHgwCisJCQkJCTB4MTE5MCAweDAzIDB4MAorCQkJCQkweDExOTQgMHgwNCAweDAKKwkJCQkJMHgxMTk4IDB4MDIgMHgwCisJCQkJCTB4MTE5YyAweDBjIDB4MAorCQkJCQkweDExYTQgMHgwMiAweDAKKwkJCQkJMHgxMWMwIDB4NWMgMHgwCisJCQkJCTB4MTFjNCAweDNlIDB4MAorCQkJCQkweDExYzggMHgzZiAweDAKKwkJCQkJMHgxMjMwIDB4MDEgMHgwCisJCQkJCTB4MTIzNCAweGEwIDB4MAorCQkJCQkweDEyMzggMHgwOCAweDAKKwkJCQkJMHgxMmE0IDB4MDEgMHgwCisJCQkJCTB4MTJhYyAweGMzIDB4MAorCQkJCQkweDEyYjAgMHgwMCAweDAKKwkJCQkJMHgxMmI4IDB4OGMgMHgwCisJCQkJCTB4MTJjMCAweDdmIDB4MAorCQkJCQkweDEyYzQgMHgyYSAweDAKKwkJCQkJMHgxMDEwIDB4MGMgMHgwCisJCQkJCTB4MTAxNCAweDAwIDB4MAorCQkJCQkweDEyY2MgMHgwNCAweDAKKwkJCQkJMHgxMTNjIDB4MjAgMHgwCisJCQkJCTB4MTk1YyAweDNmIDB4MAorCQkJCQkweDE5NzQgMHg1OCAweDAKKwkJCQkJMHgxOTZjIDB4OWYgMHgwCisJCQkJCTB4MTgyYyAweDE5IDB4MAorCQkJCQkweDE4NDAgMHgwNyAweDAKKwkJCQkJMHgxODU0IDB4MTcgMHgwCisJCQkJCTB4MTg2OCAweDA5IDB4MAorCQkJCQkweDE4MDAgMHgwMCAweDAKKwkJCQkJMHgwYWE4IDB4MDEgMHgwCisJCQkJCTB4MTJhOCAweDAxIDB4MAorCQkJCQkweDE4MDggMHgwMSAweDA+OworCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmcGNpZTFfY2xrcmVxX2RlZmF1bHQKKwkJCSZwY2llMV9wZXJzdF9kZWZhdWx0CisJCQkmcGNpZTFfd2FrZV9kZWZhdWx0PjsKKworCQlwZXJzdC1ncGlvID0gPCZ0bG1tIDEwMiAwPjsKKwkJd2FrZS1ncGlvID0gPCZ0bG1tIDEwNCAwPjsKKworCQlnZHNjLXZkZC1zdXBwbHkgPSA8JnBjaWVfMV9nZHNjPjsKKwkJdnJlZy0xLjgtc3VwcGx5ID0gPCZwbTg5OThfbDI2PjsKKwkJdnJlZy0wLjktc3VwcGx5ID0gPCZwbTg5OThfbDE+OworCQl2cmVnLWN4LXN1cHBseSA9IDwmcG04OTk4X3M5X2xldmVsPjsKKworCQlxY29tLHZyZWctMS44LXZvbHRhZ2UtbGV2ZWwgPSA8MTIwMDAwMCAxMjAwMDAwIDI0MDAwPjsKKwkJcWNvbSx2cmVnLTAuOS12b2x0YWdlLWxldmVsID0gPDg4MDAwMCA4ODAwMDAgMjQwMDA+OworCQlxY29tLHZyZWctY3gtdm9sdGFnZS1sZXZlbCA9IDxSUE1IX1JFR1VMQVRPUl9MRVZFTF9NQVgKKwkJCQkJCVJQTUhfUkVHVUxBVE9SX0xFVkVMX05PTSAwPjsKKworCQlxY29tLGwxLXN1cHBvcnRlZDsKKwkJcWNvbSxsMXNzLXN1cHBvcnRlZDsKKwkJcWNvbSxhdXgtY2xrLXN5bmM7CisKKwkJcWNvbSxlcC1sYXRlbmN5ID0gPDEwPjsKKworCQlxY29tLHNsdi1hZGRyLXNwYWNlLXNpemUgPSA8MHgyMDAwMDAwMD47CisKKwkJcWNvbSxib290LW9wdGlvbiA9IDwweDE+OworCisJCWxpbnV4LHBjaS1kb21haW4gPSA8MT47CisKKwkJcWNvbSxtc2ktZ2ljbS1hZGRyID0gPDB4MTdhMDAwNDA+OworCQlxY29tLG1zaS1naWNtLWJhc2UgPSA8MHgyZTA+OworCisJCXFjb20sbWF4LWxpbmstc3BlZWQgPSA8MHgzPjsKKworCQlxY29tLHVzZS0xOXAybWh6LWF1eC1jbGs7CisKKwkJcWNvbSxzbW11LXNpZC1iYXNlID0gPDB4MWMwMD47CisKKwkJaW9tbXUtbWFwID0gPDB4MTAwICZhcHBzX3NtbXUgMHgxYzAxIDB4MT4sCisJCQk8MHgyMDAgJmFwcHNfc21tdSAweDFjMDIgMHgxPiwKKwkJCTwweDMwMCAmYXBwc19zbW11IDB4MWMwMyAweDE+LAorCQkJPDB4NDAwICZhcHBzX3NtbXUgMHgxYzA0IDB4MT4sCisJCQk8MHg1MDAgJmFwcHNfc21tdSAweDFjMDUgMHgxPiwKKwkJCTwweDYwMCAmYXBwc19zbW11IDB4MWMwNiAweDE+LAorCQkJPDB4NzAwICZhcHBzX3NtbXUgMHgxYzA3IDB4MT4sCisJCQk8MHg4MDAgJmFwcHNfc21tdSAweDFjMDggMHgxPiwKKwkJCTwweDkwMCAmYXBwc19zbW11IDB4MWMwOSAweDE+LAorCQkJPDB4YTAwICZhcHBzX3NtbXUgMHgxYzBhIDB4MT4sCisJCQk8MHhiMDAgJmFwcHNfc21tdSAweDFjMGIgMHgxPiwKKwkJCTwweGMwMCAmYXBwc19zbW11IDB4MWMwYyAweDE+LAorCQkJPDB4ZDAwICZhcHBzX3NtbXUgMHgxYzBkIDB4MT4sCisJCQk8MHhlMDAgJmFwcHNfc21tdSAweDFjMGUgMHgxPiwKKwkJCTwweGYwMCAmYXBwc19zbW11IDB4MWMwZiAweDE+OworCisJCXFjb20sbXNtLWJ1cyxuYW1lID0gInBjaWUxIjsKKwkJcWNvbSxtc20tYnVzLG51bS1jYXNlcyA9IDwyPjsKKwkJcWNvbSxtc20tYnVzLG51bS1wYXRocyA9IDwxPjsKKwkJcWNvbSxtc20tYnVzLHZlY3RvcnMtS0JwcyA9CisJCQkJPDEwMCA1MTIgMCAwPiwKKwkJCQk8MTAwIDUxMiA1MDAgODAwPjsKKworCQljbG9ja3MgPSA8JmNsb2NrX2djYyBHQ0NfUENJRV8xX1BJUEVfQ0xLPiwKKwkJCTwmY2xvY2tfcnBtaCBSUE1IX0NYT19DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfMV9BVVhfQ0xLPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19QQ0lFXzFfQ0ZHX0FIQl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfMV9NU1RSX0FYSV9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfMV9TTFZfQVhJX0NMSz4sCisJCQk8JmNsb2NrX2djYyBHQ0NfUENJRV8xX0NMS1JFRl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfMV9TTFZfUTJBX0FYSV9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX0FHR1JFX05PQ19QQ0lFX1RCVV9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfUEhZX1JFRkdFTl9DTEs+LAorCQkJPCZjbG9ja19nY2MgR0NDX1BDSUVfUEhZX0FVWF9DTEs+OworCisJCWNsb2NrLW5hbWVzID0gInBjaWVfMV9waXBlX2NsayIsICJwY2llXzFfcmVmX2Nsa19zcmMiLAorCQkJCSJwY2llXzFfYXV4X2NsayIsICJwY2llXzFfY2ZnX2FoYl9jbGsiLAorCQkJCSJwY2llXzFfbXN0cl9heGlfY2xrIiwgInBjaWVfMV9zbHZfYXhpX2NsayIsCisJCQkJInBjaWVfMV9sZG8iLCAicGNpZV8xX3Nsdl9xMmFfYXhpX2NsayIsCisJCQkJInBjaWVfdGJ1X2NsayIsICJwY2llX3BoeV9yZWZnZW5fY2xrIiwKKwkJCQkicGNpZV9waHlfYXV4X2NsayI7CisKKwkJbWF4LWNsb2NrLWZyZXF1ZW5jeS1oeiA9IDwwPiwgPDA+LCA8MTkyMDAwMDA+LCA8MD4sIDwwPiwKKwkJCQkJPDA+LCA8MD4sIDwwPiwgPDA+LCA8MTAwMDAwMDAwPiwgPDA+OworCisJCXJlc2V0cyA9IDwmY2xvY2tfZ2NjIEdDQ19QQ0lFXzFfQkNSPiwKKwkJCTwmY2xvY2tfZ2NjIEdDQ19QQ0lFXzFfUEhZX0JDUj47CisKKwkJcmVzZXQtbmFtZXMgPSAicGNpZV8xX2NvcmVfcmVzZXQiLAorCQkJCSJwY2llXzFfcGh5X3Jlc2V0IjsKKwl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcGluY3RybC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1waW5jdHJsLmR0c2kKaW5kZXggM2UyNzI5Ny4uYTAyMDdlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1waW5jdHJsLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1waW5jdHJsLmR0c2kKQEAgLTIxMCw2ICsyMTAsNDcgQEAKIAkJCQljb25maWcgewogCQkJCQlwaW5zID0gImdwaW8zNyI7CiAJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OworCQkJCQliaWFzLXB1bGwtdXA7CisJCQkJfTsKKwkJCX07CisJCX07CisKKwkJcGNpZTEgeworCQkJcGNpZTFfY2xrcmVxX2RlZmF1bHQ6IHBjaWUxX2Nsa3JlcV9kZWZhdWx0IHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8xMDMiOworCQkJCQlmdW5jdGlvbiA9ICJwY2lfZTEiOworCQkJCX07CisKKwkJCQljb25maWcgeworCQkJCQlwaW5zID0gImdwaW8xMDMiOworCQkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsKKwkJCQkJYmlhcy1wdWxsLXVwOworCQkJCX07CisJCQl9OworCisJCQlwY2llMV9wZXJzdF9kZWZhdWx0OiBwY2llMV9wZXJzdF9kZWZhdWx0IHsKKwkJCQltdXggeworCQkJCQlwaW5zID0gImdwaW8xMDIiOworCQkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCQl9OworCisJCQkJY29uZmlnIHsKKwkJCQkJcGlucyA9ICJncGlvMTAyIjsKKwkJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47CisJCQkJCWJpYXMtcHVsbC1kb3duOworCQkJCX07CisJCQl9OworCisJCQlwY2llMV93YWtlX2RlZmF1bHQ6IHBjaWUxX3dha2VfZGVmYXVsdCB7CisJCQkJbXV4IHsKKwkJCQkJcGlucyA9ICJncGlvMTA0IjsKKwkJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQkJfTsKKworCQkJCWNvbmZpZyB7CisJCQkJCXBpbnMgPSAiZ3BpbzEwNCI7CisJCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OwogCQkJCQliaWFzLXB1bGwtZG93bjsKIAkJCQl9OwogCQkJfTsKQEAgLTI3NTMsNiArMjc5NCw3IEBACiAJCQkJcGlucyA9ICJncGlvODAiLCJncGlvNzkiOwogCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBQVUxMIERPV04gKi8KIAkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCW91dHB1dC1sb3c7CiAJCQl9OwogCQl9OwogCkBAIC0yNzg0LDYgKzI4MjYsMzUgQEAKIAkJCX07CiAJCX07CiAKKwkJY2FtX3NlbnNvcl9tY2xrM19hY3RpdmU6IGNhbV9zZW5zb3JfbWNsazNfYWN0aXZlIHsKKwkJCS8qIE1DTEszICovCisJCQltdXggeworCQkJCXBpbnMgPSAiZ3BpbzE2IjsKKwkJCQlmdW5jdGlvbiA9ICJjYW1fbWNsayI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzE2IjsKKwkJCQliaWFzLWRpc2FibGU7IC8qIE5vIFBVTEwgKi8KKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJfTsKKwkJfTsKKworCQljYW1fc2Vuc29yX21jbGszX3N1c3BlbmQ6IGNhbV9zZW5zb3JfbWNsazNfc3VzcGVuZCB7CisJCQkvKiBNQ0xLMyAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW8xNiI7CisJCQkJZnVuY3Rpb24gPSAiY2FtX21jbGsiOworCQkJfTsKKworCQkJY29uZmlnIHsKKwkJCQlwaW5zID0gImdwaW8xNiI7CisJCQkJYmlhcy1wdWxsLWRvd247IC8qIFBVTEwgRE9XTiAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisKIAkJY2FtX3NlbnNvcl9mcm9udF9hY3RpdmU6IGNhbV9zZW5zb3JfZnJvbnRfYWN0aXZlIHsKIAkJCS8qIFJFU0VUICBBVkREX0xETyovCiAJCQltdXggewpAQCAtMjgwOSw5ICsyODgwLDQwIEBACiAJCQkJcGlucyA9ICJncGlvMjgiOwogCQkJCWJpYXMtcHVsbC1kb3duOyAvKiBQVUxMIERPV04gKi8KIAkJCQlkcml2ZS1zdHJlbmd0aCA9IDwyPjsgLyogMiBNQSAqLworCQkJCW91dHB1dC1sb3c7CiAJCQl9OwogCQl9OwogCisJCWNhbV9zZW5zb3JfaXJpc19hY3RpdmU6IGNhbV9zZW5zb3JfaXJpc19hY3RpdmUgeworCQkJLyogUkVTRVQgIEFWRERfTERPKi8KKwkJCW11eCB7CisJCQkJcGlucyA9ICJncGlvOSIsICJncGlvOCI7CisJCQkJZnVuY3Rpb24gPSAiZ3BpbyI7CisJCQl9OworCisJCQljb25maWcgeworCQkJCXBpbnMgPSAiZ3BpbzkiLCAiZ3BpbzgiOworCQkJCWJpYXMtZGlzYWJsZTsgLyogTm8gUFVMTCAqLworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDI+OyAvKiAyIE1BICovCisJCQl9OworCQl9OworCisJCWNhbV9zZW5zb3JfaXJpc19zdXNwZW5kOiBjYW1fc2Vuc29yX2lyaXNfc3VzcGVuZCB7CisJCQkvKiBSRVNFVCAqLworCQkJbXV4IHsKKwkJCQlwaW5zID0gImdwaW85IjsKKwkJCQlmdW5jdGlvbiA9ICJncGlvIjsKKwkJCX07CisKKwkJCWNvbmZpZyB7CisJCQkJcGlucyA9ICJncGlvOSI7CisJCQkJYmlhcy1kaXNhYmxlOyAvKiBObyBQVUxMICovCisJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQlvdXRwdXQtbG93OworCQkJfTsKKwkJfTsKKworCiAJCWNhbV9zZW5zb3JfbWNsazJfYWN0aXZlOiBjYW1fc2Vuc29yX21jbGsyX2FjdGl2ZSB7CiAJCQkvKiBNQ0xLMSAqLwogCQkJbXV4IHsKQEAgLTI4NjYsNiArMjk2OCw3IEBACiAJCQkJcGlucyA9ICJncGlvOSIsImdwaW84IjsKIAkJCQliaWFzLXB1bGwtZG93bjsgLyogUFVMTCBET1dOICovCiAJCQkJZHJpdmUtc3RyZW5ndGggPSA8Mj47IC8qIDIgTUEgKi8KKwkJCQlvdXRwdXQtbG93OwogCQkJfTsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1wbWljLW92ZXJsYXkuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcG1pYy1vdmVybGF5LmR0c2kKaW5kZXggMDAwZDY1ZTcuLjJhYzMxM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcG1pYy1vdmVybGF5LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1wbWljLW92ZXJsYXkuZHRzaQpAQCAtMzIsNiArMzIsOSBAQAogCXNtYjJfdmNvbm46IHFjb20sc21iMi12Y29ubiB7CiAJCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmNvbm4iOwogCX07CisJc21iMl92YnVzOiBxY29tLHNtYjItdmJ1cyB7CisJCXJlZ3VsYXRvci1uYW1lID0gInNtYjItdmJ1cyI7CisJfTsKIH07CiAKICZ1c2IwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXJkLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXFyZC5kdHNpCmluZGV4IDYxMjJlZWUuLjZkYWUwNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXJkLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xcmQuZHRzaQpAQCAtODgsNyArODgsMTEgQEAKIAlxY29tLGZnLWJtZC1lbi1kZWxheS1tcyA9IDwzMDA+OwogfTsKIAotJnNtYjEzNTVfY2hhcmdlciB7Cismc21iMTM1NV9jaGFyZ2VyXzAgeworCXN0YXR1cyA9ICJvayI7Cit9OworCismc21iMTM1NV9jaGFyZ2VyXzEgewogCXN0YXR1cyA9ICJvayI7CiB9OwogCkBAIC0xMTEsNiArMTE1LDcgQEAKIAl2ZGQtaGJhLXN1cHBseSA9IDwmdWZzX3BoeV9nZHNjPjsKIAl2ZGQtaGJhLWZpeGVkLXJlZ3VsYXRvcjsKIAl2Y2Mtc3VwcGx5ID0gPCZwbTg5OThfbDIwPjsKKwl2Y2Mtdm9sdGFnZS1sZXZlbCA9IDwyOTUwMDAwIDI5NjAwMDA+OwogCXZjY3EyLXN1cHBseSA9IDwmcG04OTk4X3M0PjsKIAl2Y2MtbWF4LW1pY3JvYW1wID0gPDYwMDAwMD47CiAJdmNjcTItbWF4LW1pY3JvYW1wID0gPDYwMDAwMD47CkBAIC0xMjEsNDQgKzEyNiw2IEBACiAJc3RhdHVzID0gIm9rIjsKIH07CiAKLSZleHRjb25fc3RvcmFnZV9jZCB7Ci0JZ3BpbyA9IDwmdGxtbSAxMjYgR1BJT19BQ1RJVkVfTE9XPjsKLQlkZWJvdW5jZS1tcyA9IDwyMDA+OwotCWlycS1mbGFncyA9IDxJUlFfVFlQRV9FREdFX0JPVEg+OwotCi0JcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKLQlwaW5jdHJsLTAgPSA8JnN0b3JhZ2VfY2Q+OwotCi0Jc3RhdHVzID0gIm9rIjsKLX07Ci0KLSZ1ZnNwaHlfY2FyZCB7Ci0JY29tcGF0aWJsZSA9ICJxY29tLHVmcy1waHktcW1wLXYzIjsKLQotCXZkZGEtcGh5LXN1cHBseSA9IDwmcG04OTk4X2wxPjsgLyogMC44OHYgKi8KLQl2ZGRhLXBsbC1zdXBwbHkgPSA8JnBtODk5OF9sMjY+OyAvKiAxLjJ2ICovCi0JdmRkYS1waHktbWF4LW1pY3JvYW1wID0gPDYyOTAwPjsKLQl2ZGRhLXBsbC1tYXgtbWljcm9hbXAgPSA8MTgzMDA+OwotCi0Jc3RhdHVzID0gIm9rIjsKLX07Ci0KLSZ1ZnNoY19jYXJkIHsKLQl2ZGQtaGJhLXN1cHBseSA9IDwmdWZzX2NhcmRfZ2RzYz47Ci0JdmRkLWhiYS1maXhlZC1yZWd1bGF0b3I7Ci0JdmNjLXN1cHBseSA9IDwmcG04OTk4X2wyMT47Ci0JdmNjcTItc3VwcGx5ID0gPCZwbTg5OThfczQ+OwotCXZjYy1tYXgtbWljcm9hbXAgPSA8MzAwMDAwPjsKLQl2Y2NxMi1tYXgtbWljcm9hbXAgPSA8MzAwMDAwPjsKLQotCXFjb20sdmRkcC1yZWYtY2xrLXN1cHBseSA9IDwmcG04OTk4X2wyPjsKLQlxY29tLHZkZHAtcmVmLWNsay1tYXgtbWljcm9hbXAgPSA8MTAwPjsKLQotCWV4dGNvbiA9IDwmZXh0Y29uX3N0b3JhZ2VfY2Q+OwotCi0Jc3RhdHVzID0gIm9rIjsKLX07Ci0KICZzZGhjXzIgewogCXZkZC1zdXBwbHkgPSA8JnBtODk5OF9sMjE+OwogCXFjb20sdmRkLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk1MDAwMCAyOTYwMDAwPjsKQEAgLTE2OSwxMCArMTM2LDEwIEBACiAJcWNvbSx2ZGQtaW8tY3VycmVudC1sZXZlbCA9IDwyMDAgMjIwMDA+OwogCiAJcGluY3RybC1uYW1lcyA9ICJhY3RpdmUiLCAic2xlZXAiOwotCXBpbmN0cmwtMCA9IDwmc2RjMl9jbGtfb24gICZzZGMyX2NtZF9vbiAmc2RjMl9kYXRhX29uPjsKLQlwaW5jdHJsLTEgPSA8JnNkYzJfY2xrX29mZiAmc2RjMl9jbWRfb2ZmICZzZGMyX2RhdGFfb2ZmPjsKKwlwaW5jdHJsLTAgPSA8JnNkYzJfY2xrX29uICAmc2RjMl9jbWRfb24gJnNkYzJfZGF0YV9vbiAmc3RvcmFnZV9jZD47CisJcGluY3RybC0xID0gPCZzZGMyX2Nsa19vZmYgJnNkYzJfY21kX29mZiAmc2RjMl9kYXRhX29mZiAmc3RvcmFnZV9jZD47CiAKLQlleHRjb24gPSA8JmV4dGNvbl9zdG9yYWdlX2NkPjsKKwljZC1ncGlvcyA9IDwmdGxtbSAxMjYgR1BJT19BQ1RJVkVfTE9XPjsKIAogCXN0YXR1cyA9ICJvayI7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xdXB2My5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xdXB2My5kdHNpCmluZGV4IDFmYTZlMjYuLmE4MDVlMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXVwdjMuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF1cHYzLmR0c2kKQEAgLTIyMSw2ICsyMjEsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjAxIDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCAwIDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgMCAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTI0MCw2ICsyNDMsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjAyIDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCAxIDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgMSAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTI1OSw2ICsyNjUsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjAzIDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCAyIDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgMiAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTI3OCw2ICsyODcsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjA0IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCAzIDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgMyAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTI5Nyw2ICszMDksOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjA1IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCA0IDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgNCAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTMxNiw2ICszMzEsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjA2IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCA1IDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgNSAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTMzNSw2ICszNTMsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjA3IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCA2IDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgNiAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTM1NCw2ICszNzUsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNjA4IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18wPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTAgMCA3IDEgNjQgMD4sCisJCQk8JmdwaV9kbWEwIDEgNyAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTU2MSw2ICs1ODUsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzUzIDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCAwIDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgMCAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTU4MCw2ICs2MDcsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU0IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCAxIDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgMSAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTU5OSw2ICs2MjksOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU1IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCAyIDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgMiAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTYxOCw2ICs2NTEsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU2IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCAzIDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgMyAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTYzNyw2ICs2NzMsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU3IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCA0IDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgNCAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTY1Niw2ICs2OTUsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU4IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCA1IDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgNSAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTY3NSw2ICs3MTcsOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzU5IDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCA2IDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgNiAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKQEAgLTY5NCw2ICs3MzksOSBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMzYwIDA+OwogCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJCXFjb20sd3JhcHBlci1jb3JlID0gPCZxdXB2M18xPjsKKwkJZG1hcyA9IDwmZ3BpX2RtYTEgMCA3IDEgNjQgMD4sCisJCQk8JmdwaV9kbWExIDEgNyAxIDY0IDA+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xdnItb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF2ci1vdmVybGF5LmR0cwppbmRleCBhNDcyMTlkLi4yZmFjOWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF2ci1vdmVybGF5LmR0cworKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF2ci1vdmVybGF5LmR0cwpAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgInNkbTg0NS1xdnIuZHRzaSIKIAogLyB7Ci0JbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIFNETTg0NSB2MSBRVlIiOworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBTRE04NDUgdjIgUVZSIjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtODQ1LXF2ciIsICJxY29tLHNkbTg0NSIsICJxY29tLHF2ciI7Ci0JcWNvbSxtc20taWQgPSA8MzIxIDB4MTAwMDA+OworCXFjb20sbXNtLWlkID0gPDMyMSAweDIwMDAwPjsKIAlxY29tLGJvYXJkLWlkID0gPDB4MDEwMDBCIDB4MjA+OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXZyLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXZyLmR0cwppbmRleCBmMzQ0ODAzLi5jMDZiODA2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF2ci5kdHMKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xdnIuZHRzCkBAIC0xMyw3ICsxMyw3IEBACiAKIC9kdHMtdjEvOwogCi0jaW5jbHVkZSAic2RtODQ1LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LXYyLmR0c2kiCiAjaW5jbHVkZSAic2RtODQ1LXF2ci5kdHNpIgogCiAvIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXZyLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXF2ci5kdHNpCmluZGV4IDZlYTkyZWUuLmQ4OTcyMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcXZyLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1xdnIuZHRzaQpAQCAtOSwzICs5LDExMSBAQAogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLworCisjaW5jbHVkZSAic2RtODQ1LXBtaWMtb3ZlcmxheS5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1waW5jdHJsLW92ZXJsYXkuZHRzaSIKKyNpbmNsdWRlICJzbWIxMzU1LmR0c2kiCisKKyZwbWk4OTk4X3BkcGh5IHsKKwl2YnVzLXN1cHBseSA9IDwmc21iMl92YnVzPjsKK307CisKKyZwbWk4OTk4X2ZnIHsKKwlxY29tLGZnLWJtZC1lbi1kZWxheS1tcyA9IDwzMDA+OworfTsKKworJnF1cHYzX3NlMTBfaTJjIHsKKwlzdGF0dXMgPSAib2siOworfTsKKworJnNtYjEzNTVfY2hhcmdlcl8wIHsKKwlzdGF0dXMgPSAib2siOworfTsKKworJnNtYjEzNTVfY2hhcmdlcl8xIHsKKwlzdGF0dXMgPSAib2siOworfTsKKworJnNvYyB7CisJcWNvbSxxYnQxMDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OworCisJZ3Bpb19rZXlzIHsKKwkJY29tcGF0aWJsZSA9ICJncGlvLWtleXMiOworCQlsYWJlbCA9ICJncGlvLWtleXMiOworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JmtleV92b2xfdXBfZGVmYXVsdAorCQkJICAgICAma2V5X2hvbWVfZGVmYXVsdD47CisKKwkJdm9sX3VwIHsKKwkJCWxhYmVsID0gInZvbHVtZV91cCI7CisJCQlncGlvcyA9IDwmcG04OTk4X2dwaW9zIDYgR1BJT19BQ1RJVkVfTE9XPjsKKwkJCWxpbnV4LGlucHV0LXR5cGUgPSA8MT47CisJCQlsaW51eCxjb2RlID0gPDExNT47CisJCQlncGlvLWtleSx3YWtldXA7CisJCQlkZWJvdW5jZS1pbnRlcnZhbCA9IDwxNT47CisJCQlsaW51eCxjYW4tZGlzYWJsZTsKKwkJfTsKKworCQlob21lIHsKKwkJCWxhYmVsID0gImhvbWUiOworCQkJZ3Bpb3MgPSA8JnBtODk5OF9ncGlvcyA1IEdQSU9fQUNUSVZFX0xPVz47CisJCQlsaW51eCxpbnB1dC10eXBlID0gPDE+OworCQkJbGludXgsY29kZSA9IDwxMDI+OworCQkJZ3Bpby1rZXksd2FrZXVwOworCQkJZGVib3VuY2UtaW50ZXJ2YWwgPSA8MTU+OworCQkJbGludXgsY2FuLWRpc2FibGU7CisJCX07CisJfTsKK307CisKKyZwbWk4OTk4X2hhcHRpY3MgeworCXFjb20sdm1heC1tdiA9IDwxODAwPjsKKwlxY29tLHdhdmUtcGxheS1yYXRlLXVzID0gPDQyNTU+OworCXFjb20sbHJhLWF1dG8tbW9kZTsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCismdWZzcGh5X21lbSB7CisJY29tcGF0aWJsZSA9ICJxY29tLHVmcy1waHktcW1wLXYzIjsKKworCXZkZGEtcGh5LXN1cHBseSA9IDwmcG04OTk4X2wxPjsgLyogMC44OHYgKi8KKwl2ZGRhLXBsbC1zdXBwbHkgPSA8JnBtODk5OF9sMjY+OyAvKiAxLjJ2ICovCisJdmRkYS1waHktbWF4LW1pY3JvYW1wID0gPDYyOTAwPjsKKwl2ZGRhLXBsbC1tYXgtbWljcm9hbXAgPSA8MTgzMDA+OworCisJc3RhdHVzID0gIm9rIjsKK307CisKKyZ1ZnNoY19tZW0geworCXZkZC1oYmEtc3VwcGx5ID0gPCZ1ZnNfcGh5X2dkc2M+OworCXZkZC1oYmEtZml4ZWQtcmVndWxhdG9yOworCXZjYy1zdXBwbHkgPSA8JnBtODk5OF9sMjA+OworCXZjY3EyLXN1cHBseSA9IDwmcG04OTk4X3M0PjsKKwl2Y2MtbWF4LW1pY3JvYW1wID0gPDYwMDAwMD47CisJdmNjcTItbWF4LW1pY3JvYW1wID0gPDYwMDAwMD47CisKKwlxY29tLHZkZHAtcmVmLWNsay1zdXBwbHkgPSA8JnBtODk5OF9sMj47CisJcWNvbSx2ZGRwLXJlZi1jbGstbWF4LW1pY3JvYW1wID0gPDEwMD47CisKKwlzdGF0dXMgPSAib2siOworfTsKKworJnNkaGNfMiB7CisJdmRkLXN1cHBseSA9IDwmcG04OTk4X2wyMT47CisJcWNvbSx2ZGQtdm9sdGFnZS1sZXZlbCA9IDwyOTUwMDAwIDI5NjAwMDA+OworCXFjb20sdmRkLWN1cnJlbnQtbGV2ZWwgPSA8MjAwIDgwMDAwMD47CisKKwl2ZGQtaW8tc3VwcGx5ID0gPCZwbTg5OThfbDEzPjsKKwlxY29tLHZkZC1pby12b2x0YWdlLWxldmVsID0gPDE4MDgwMDAgMjk2MDAwMD47CisJcWNvbSx2ZGQtaW8tY3VycmVudC1sZXZlbCA9IDwyMDAgMjIwMDA+OworCisJcGluY3RybC1uYW1lcyA9ICJhY3RpdmUiLCAic2xlZXAiOworCXBpbmN0cmwtMCA9IDwmc2RjMl9jbGtfb24gICZzZGMyX2NtZF9vbiAmc3RvcmFnZV9jZD47CisJcGluY3RybC0xID0gPCZzZGMyX2Nsa19vZmYgJnNkYzJfY21kX29mZiAmc3RvcmFnZV9jZD47CisKKwljZC1ncGlvcyA9IDwmdGxtbSAxMjYgR1BJT19BQ1RJVkVfSElHSD47CisKKwlzdGF0dXMgPSAib2siOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcmVndWxhdG9yLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXJlZ3VsYXRvci5kdHNpCmluZGV4IGY1MGRmNDcuLmQyMmMyOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcmVndWxhdG9yLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1yZWd1bGF0b3IuZHRzaQpAQCAtMTM4OSwxMiArMTM4OSwyNCBAQAogCQljb21wYXRpYmxlID0gInFjb20scnBtaC12cm0tcmVndWxhdG9yIjsKIAkJbWJveGVzID0gPCZhcHBzX3JzYyAwPjsKIAkJcWNvbSxyZXNvdXJjZS1uYW1lID0gImJvYmIxIjsKKwkJcWNvbSxzZW5kLWRlZmF1bHRzOworCiAJCXBtaTg5OThfYm9iOiByZWd1bGF0b3ItYm9iIHsKIAkJCXJlZ3VsYXRvci1uYW1lID0gInBtaTg5OThfYm9iIjsKIAkJCXFjb20sc2V0ID0gPFJQTUhfUkVHVUxBVE9SX1NFVF9BTEw+OwogCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MzMxMjAwMD47CiAJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzNjAwMDAwPjsKIAkJCXFjb20saW5pdC12b2x0YWdlID0gPDMzMTIwMDA+OworCQkJcWNvbSxpbml0LW1vZGUgPSA8UlBNSF9SRUdVTEFUT1JfTU9ERV9CT0JfUEFTUz47CisJCX07CisKKwkJcG1pODk5OF9ib2JfYW86IHJlZ3VsYXRvci1ib2ItYW8geworCQkJcmVndWxhdG9yLW5hbWUgPSAicG1pODk5OF9ib2JfYW8iOworCQkJcWNvbSxzZXQgPSA8UlBNSF9SRUdVTEFUT1JfU0VUX0FDVElWRT47CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMzEyMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDM2MDAwMDA+OworCQkJcWNvbSxpbml0LXZvbHRhZ2UgPSA8MzMxMjAwMD47CisJCQlxY29tLGluaXQtbW9kZSA9IDxSUE1IX1JFR1VMQVRPUl9NT0RFX0JPQl9BVVRPPjsKIAkJfTsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXJ1bWkuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcnVtaS5kdHNpCmluZGV4IGU3ZmQ4YTAuLmQ2MDdmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcnVtaS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtcnVtaS5kdHNpCkBAIC0zMyw2ICszMyw3IEBACiAJdmRkLWhiYS1zdXBwbHkgPSA8JnVmc19waHlfZ2RzYz47CiAJdmRkLWhiYS1maXhlZC1yZWd1bGF0b3I7CiAJdmNjLXN1cHBseSA9IDwmcG04OTk4X2wyMD47CisJdmNjLXZvbHRhZ2UtbGV2ZWwgPSA8Mjk1MDAwMCAyOTYwMDAwPjsKIAl2Y2NxMi1zdXBwbHkgPSA8JnBtODk5OF9zND47CiAJdmNjLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwogCXZjY3EyLW1heC1taWNyb2FtcCA9IDw2MDAwMDA+OwpAQCAtMTM5LDM3ICsxNDAsNiBAQAogCXFjb20sY3ByLWlnbm9yZS1pbnZhbGlkLWZ1c2VzOwogfTsKIAotJnVmc3BoeV9jYXJkIHsKLQljb21wYXRpYmxlID0gInFjb20sdWZzLXBoeS1xcmJ0Yy1zZG04NDUiOwotCi0JdmRkYS1waHktc3VwcGx5ID0gPCZwbTg5OThfbDE+OyAvKiAwLjg4diAqLwotCXZkZGEtcGxsLXN1cHBseSA9IDwmcG04OTk4X2wyNj47IC8qIDEuMnYgKi8KLQl2ZGRhLXBoeS1tYXgtbWljcm9hbXAgPSA8NjI5MDA+OwotCXZkZGEtcGxsLW1heC1taWNyb2FtcCA9IDwxODMwMD47Ci0KLQlzdGF0dXMgPSAib2siOwotfTsKLQotJnVmc2hjX2NhcmQgewotCWxpbWl0LXR4LWhzLWdlYXIgPSA8MT47Ci0JbGltaXQtcngtaHMtZ2VhciA9IDwxPjsKLQotCXZkZC1oYmEtc3VwcGx5ID0gPCZ1ZnNfY2FyZF9nZHNjPjsKLQl2ZGQtaGJhLWZpeGVkLXJlZ3VsYXRvcjsKLQl2Y2Mtc3VwcGx5ID0gPCZwbTg5OThfbDIxPjsKLQl2Y2NxMi1zdXBwbHkgPSA8JnBtODk5OF9zND47Ci0JdmNjLW1heC1taWNyb2FtcCA9IDwzMDAwMDA+OwotCXZjY3EyLW1heC1taWNyb2FtcCA9IDwzMDAwMDA+OwotCi0JcWNvbSx2ZGRwLXJlZi1jbGstc3VwcGx5ID0gPCZwbTg5OThfbDI+OwotCXFjb20sdmRkcC1yZWYtY2xrLW1heC1taWNyb2FtcCA9IDwxMDA+OwotCi0JcWNvbSxkaXNhYmxlLWxwbTsKLQlycG0tbGV2ZWwgPSA8MD47Ci0Jc3BtLWxldmVsID0gPDA+OwotCXN0YXR1cyA9ICJvayI7Ci19OwotCiAmcG1pODk5OF9jaGFyZ2VyIHsKIAlxY29tLHN1c3BlbmQtaW5wdXQ7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1zZGUtZGlzcGxheS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1zZGUtZGlzcGxheS5kdHNpCmluZGV4IGRiM2QyM2MuLjQzMzdkYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtc2RlLWRpc3BsYXkuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kKQEAgLTQxNCwxMDggKzQxNCwxMiBAQAogCQkJY29tcGF0aWJsZSA9ICJxY29tLG1zbS1leHQtZGlzcC1hdWRpby1jb2RlYy1yeCI7CiAJCX07CiAJfTsKLQotCXNkZV9kcDogcWNvbSxkcF9kaXNwbGF5QDB7Ci0JCWNlbGwtaW5kZXggPSA8MD47Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxkcC1kaXNwbGF5IjsKLQotCQlnZHNjLXN1cHBseSA9IDwmbWRzc19jb3JlX2dkc2M+OwotCQl2ZGRhLTFwMi1zdXBwbHkgPSA8JnBtODk5OF9sMjY+OwotCQl2ZGRhLTBwOS1zdXBwbHkgPSA8JnBtODk5OF9sMT47Ci0KLQkJcmVnID0JPDB4YWU5MDAwMCAweGE4ND4sCi0JCQk8MHg4OGVhYTAwIDB4MjAwPiwKLQkJCTwweDg4ZWEyMDAgMHgyMDA+LAotCQkJPDB4ODhlYTYwMCAweDIwMD4sCi0JCQk8MHhhZjAyMDAwIDB4MWEwPiwKLQkJCTwweDc4MDAwMCAweDYyMWM+LAotCQkJPDB4ODhlYTAzMCAweDEwPiwKLQkJCTwweDBhZWUxMDAwIDB4MDM0PjsKLQkJcmVnLW5hbWVzID0gImRwX2N0cmwiLCAiZHBfcGh5IiwgImRwX2xuX3R4MCIsICJkcF9sbl90eDEiLAotCQkJImRwX21tc3NfY2MiLCAicWZwcm9tX3BoeXNpY2FsIiwgImRwX3BsbCIsCi0JCQkiaGRjcF9waHlzaWNhbCI7Ci0KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbWRzc19tZHA+OwotCQlpbnRlcnJ1cHRzID0gPDEyIDA+OwotCi0JCWNsb2NrcyA9ICA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfQVVYX0NMSz4sCi0JCQkgPCZjbG9ja19ycG1oIFJQTUhfQ1hPX0NMSz4sCi0JCQkgPCZjbG9ja19nY2MgR0NDX1VTQjNfUFJJTV9DTEtSRUZfQ0xLPiwKLQkJCSA8JmNsb2NrX2djYyBHQ0NfVVNCX1BIWV9DRkdfQUhCMlBIWV9DTEs+LAotCQkJIDwmY2xvY2tfZ2NjIEdDQ19VU0IzX1BSSU1fUEhZX1BJUEVfQ0xLPiwKLQkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfTElOS19DTEs+LAotCQkJIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9MSU5LX0lOVEZfQ0xLPiwKLQkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfUElYRUxfQ0xLPiwKLQkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfQ1JZUFRPX0NMSz4sCi0JCQkgPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0RQX1BJWEVMX0NMS19TUkM+LAotCQkJIDwmbWRzc19kcF9wbGwgRFBfVkNPX0RJVklERURfQ0xLX1NSQ19NVVg+OwotCQljbG9jay1uYW1lcyA9ICJjb3JlX2F1eF9jbGsiLCAiY29yZV91c2JfcmVmX2Nsa19zcmMiLAotCQkJImNvcmVfdXNiX3JlZl9jbGsiLCAiY29yZV91c2JfY2ZnX2FoYl9jbGsiLAotCQkJImNvcmVfdXNiX3BpcGVfY2xrIiwgImN0cmxfbGlua19jbGsiLAotCQkJImN0cmxfbGlua19pZmFjZV9jbGsiLCAiY3RybF9waXhlbF9jbGsiLAotCQkJImNyeXB0b19jbGsiLCAicGl4ZWxfY2xrX3JjZyIsICJwaXhlbF9wYXJlbnQiOwotCi0JCXFjb20sZHAtdXNicGQtZGV0ZWN0aW9uID0gPCZwbWk4OTk4X3BkcGh5PjsKLQkJcWNvbSxleHQtZGlzcCA9IDwmZXh0X2Rpc3A+OwotCi0JCXFjb20sYXV4LWNmZzAtc2V0dGluZ3MgPSBbMjAgMDBdOwotCQlxY29tLGF1eC1jZmcxLXNldHRpbmdzID0gWzI0IDEzIDIzIDFkXTsKLQkJcWNvbSxhdXgtY2ZnMi1zZXR0aW5ncyA9IFsyOCAyNF07Ci0JCXFjb20sYXV4LWNmZzMtc2V0dGluZ3MgPSBbMmMgMDBdOwotCQlxY29tLGF1eC1jZmc0LXNldHRpbmdzID0gWzMwIDBhXTsKLQkJcWNvbSxhdXgtY2ZnNS1zZXR0aW5ncyA9IFszNCAyNl07Ci0JCXFjb20sYXV4LWNmZzYtc2V0dGluZ3MgPSBbMzggMGFdOwotCQlxY29tLGF1eC1jZmc3LXNldHRpbmdzID0gWzNjIDAzXTsKLQkJcWNvbSxhdXgtY2ZnOC1zZXR0aW5ncyA9IFs0MCBiYl07Ci0JCXFjb20sYXV4LWNmZzktc2V0dGluZ3MgPSBbNDQgMDNdOwotCi0JCXFjb20sbWF4LXBjbGstZnJlcXVlbmN5LWtoeiA9IDw1NzYwMDA+OwotCi0JCXFjb20sY29yZS1zdXBwbHktZW50cmllcyB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCQlxY29tLGNvcmUtc3VwcGx5LWVudHJ5QDAgewotCQkJCXJlZyA9IDwwPjsKLQkJCQlxY29tLHN1cHBseS1uYW1lID0gImdkc2MiOwotCQkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDA+OwotCQkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDA+OwotCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDA+OwotCQkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwwPjsKLQkJCX07Ci0JCX07Ci0KLQkJcWNvbSxjdHJsLXN1cHBseS1lbnRyaWVzIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJCXFjb20sY3RybC1zdXBwbHktZW50cnlAMCB7Ci0JCQkJcmVnID0gPDA+OwotCQkJCXFjb20sc3VwcGx5LW5hbWUgPSAidmRkYS0xcDIiOwotCQkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDEyMDAwMDA+OwotCQkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDEyMDAwMDA+OwotCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDIxODAwPjsKLQkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8ND47Ci0JCQl9OwotCQl9OwotCi0JCXFjb20scGh5LXN1cHBseS1lbnRyaWVzIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJCXFjb20scGh5LXN1cHBseS1lbnRyeUAwIHsKLQkJCQlyZWcgPSA8MD47Ci0JCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJ2ZGRhLTBwOSI7Ci0JCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8ODgwMDAwPjsKLQkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDw4ODAwMDA+OwotCQkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDM2MDAwPjsKLQkJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MzI+OwotCQkJfTsKLQkJfTsKLQl9OwogfTsKIAogJnNkZV9kcCB7CisJcWNvbSxkcC11c2JwZC1kZXRlY3Rpb24gPSA8JnBtaTg5OThfcGRwaHk+OworCXFjb20sZXh0LWRpc3AgPSA8JmV4dF9kaXNwPjsKKwogCXBpbmN0cmwtbmFtZXMgPSAibWRzc19kcF9hY3RpdmUiLCAibWRzc19kcF9zbGVlcCI7CiAJcGluY3RybC0wID0gPCZzZGVfZHBfYXV4X2FjdGl2ZSAmc2RlX2RwX3VzYnBsdWdfY2NfYWN0aXZlPjsKIAlwaW5jdHJsLTEgPSA8JnNkZV9kcF9hdXhfc3VzcGVuZCAmc2RlX2RwX3VzYnBsdWdfY2Nfc3VzcGVuZD47CkBAIC01MzEsNiArNDM1LDExIEBACiAmZHNpX2R1YWxfbnQzNTU5N190cnVseV92aWRlbyB7CiAJcWNvbSxtZHNzLWRzaS10LWNsay1wb3N0ID0gPDB4MEQ+OwogCXFjb20sbWRzcy1kc2ktdC1jbGstcHJlID0gPDB4MkQ+OworCXFjb20sbWRzcy1kc2ktbWluLXJlZnJlc2gtcmF0ZSA9IDw1Mz47CisJcWNvbSxtZHNzLWRzaS1tYXgtcmVmcmVzaC1yYXRlID0gPDYwPjsKKwlxY29tLG1kc3MtZHNpLXBhbi1lbmFibGUtZHluYW1pYy1mcHM7CisJcWNvbSxtZHNzLWRzaS1wYW4tZnBzLXVwZGF0ZSA9CisJCSJkZnBzX2ltbWVkaWF0ZV9wb3JjaF9tb2RlX3ZmcCI7CiAJcWNvbSxtZHNzLWRzaS1kaXNwbGF5LXRpbWluZ3MgewogCQl0aW1pbmdAMHsKIAkJCXFjb20sbWRzcy1kc2ktcGFuZWwtcGh5LXRpbWluZ3MgPSBbMDAgMWMgMDcgMDcgMjMgMjEgMDcKQEAgLTU3NCw2ICs0ODMsMTEgQEAKICZkc2lfbnQzNTU5N190cnVseV9kc2NfdmlkZW8gewogCXFjb20sbWRzcy1kc2ktdC1jbGstcG9zdCA9IDwweDBiPjsKIAlxY29tLG1kc3MtZHNpLXQtY2xrLXByZSA9IDwweDIzPjsKKwlxY29tLG1kc3MtZHNpLW1pbi1yZWZyZXNoLXJhdGUgPSA8NTM+OworCXFjb20sbWRzcy1kc2ktbWF4LXJlZnJlc2gtcmF0ZSA9IDw2MD47CisJcWNvbSxtZHNzLWRzaS1wYW4tZW5hYmxlLWR5bmFtaWMtZnBzOworCXFjb20sbWRzcy1kc2ktcGFuLWZwcy11cGRhdGUgPQorCQkiZGZwc19pbW1lZGlhdGVfcG9yY2hfbW9kZV92ZnAiOwogCXFjb20sbWRzcy1kc2ktZGlzcGxheS10aW1pbmdzIHsKIAkJdGltaW5nQDB7CiAJCQlxY29tLG1kc3MtZHNpLXBhbmVsLXBoeS10aW1pbmdzID0gWzAwIDE1IDA1IDA1IDIwIDFmIDA1CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXNkZS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS1zZGUuZHRzaQppbmRleCAxMjE1NjVlLi5lN2E5NDZjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXNkZS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtc2RlLmR0c2kKQEAgLTksMTQgKzksMTcgQEAKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tZHNzLTEwbm0tcGxsLWNsay5oPgogCiAmc29jIHsKIAltZHNzX21kcDogcWNvbSxtZHNzX21kcEBhZTAwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLHNkZS1rbXMiOwogCQlyZWcgPSA8MHgwYWUwMDAwMCAweDgxZDQwPiwKLQkJICAgICAgPDB4MGFlYjAwMDAgMHgyMDA4PjsKKwkJICAgICAgPDB4MGFlYjAwMDAgMHgyMDA4PiwKKwkJICAgICAgPDB4MGFlYWMwMDAgMHhmMD47CiAJCXJlZy1uYW1lcyA9ICJtZHBfcGh5cyIsCi0JCQkidmJpZl9waHlzIjsKKwkJCSJ2YmlmX3BoeXMiLAorCQkJInJlZ2RtYV9waHlzIjsKIAogCQljbG9ja3MgPQogCQkJPCZjbG9ja19nY2MgR0NDX0RJU1BfQUhCX0NMSz4sCkBAIC00Myw2ICs0Niw4IEBACiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAorCQkjcG93ZXItZG9tYWluLWNlbGxzID0gPDA+OworCiAJCS8qIGh3IGJsb2NrcyAqLwogCQlxY29tLHNkZS1vZmYgPSA8MHgxMDAwPjsKIAkJcWNvbSxzZGUtbGVuID0gPDB4NDVDPjsKQEAgLTYxLDYgKzY2LDExIEBACiAJCXFjb20sc2RlLWRzcHAtb2ZmID0gPDB4NTUwMDAgMHg1NzAwMCAweDU5MDAwIDB4NWIwMDA+OwogCQlxY29tLHNkZS1kc3BwLXNpemUgPSA8MHgxN2UwPjsKIAorCQlxY29tLHNkZS1kZXN0LXNjYWxlci10b3Atb2ZmID0gPDB4MDAwNjEwMDA+OworCQlxY29tLHNkZS1kZXN0LXNjYWxlci10b3Atc2l6ZSA9IDwweGM+OworCQlxY29tLHNkZS1kZXN0LXNjYWxlci1vZmYgPSA8MHg4MDAgMHgxMDAwPjsKKwkJcWNvbSxzZGUtZGVzdC1zY2FsZXItc2l6ZSA9IDwweDgwMD47CisKIAkJcWNvbSxzZGUtd2Itb2ZmID0gPDB4NjYwMDA+OwogCQlxY29tLHNkZS13Yi1zaXplID0gPDB4MmM4PjsKIAkJcWNvbSxzZGUtd2IteGluLWlkID0gPDY+OwpAQCAtMTI2LDggKzEzNiwxNCBAQAogCQlxY29tLHNkZS1oYXMtc3JjLXNwbGl0OwogCQlxY29tLHNkZS1oYXMtZGltLWxheWVyOwogCQlxY29tLHNkZS1oYXMtaWRsZS1wYzsKLQkJcWNvbSxzZGUtbWF4LWJ3LWxvdy1rYnBzID0gPDk2MDAwMDA+OwotCQlxY29tLHNkZS1tYXgtYnctaGlnaC1rYnBzID0gPDk2MDAwMDA+OworCQlxY29tLHNkZS1oYXMtZGVzdC1zY2FsZXI7CisJCXFjb20sc2RlLW1heC1kZXN0LXNjYWxlci1pbnB1dC1saW5ld2lkdGggPSA8MjA0OD47CisJCXFjb20sc2RlLW1heC1kZXN0LXNjYWxlci1vdXRwdXQtbGluZXdpZHRoID0gPDI1NjA+OworCQlxY29tLHNkZS1tYXgtYnctbG93LWticHMgPSA8NjgwMDAwMD47CisJCXFjb20sc2RlLW1heC1idy1oaWdoLWticHMgPSA8NjgwMDAwMD47CisJCXFjb20sc2RlLW1pbi1jb3JlLWliLWticHMgPSA8MjQwMDAwMD47CisJCXFjb20sc2RlLW1pbi1sbGNjLWliLWticHMgPSA8ODAwMDAwPjsKKwkJcWNvbSxzZGUtbWluLWRyYW0taWIta2JwcyA9IDw4MDAwMDA+OwogCQlxY29tLHNkZS1kcmFtLWNoYW5uZWxzID0gPDI+OwogCQlxY29tLHNkZS1udW0tbnJ0LXBhdGhzID0gPDA+OwogCQlxY29tLHNkZS1kc3BwLWFkLXZlcnNpb24gPSA8MHgwMDA0MDAwMD47CkBAIC0xNzksNiArMTk1LDkgQEAKIAkJLyogb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gIm1kcF9waHlzICsgcWNvbSxzZGUtb2ZmICovCiAJCXFjb20sc2RlLWlubGluZS1yb3QtY2xrLWN0cmwgPSA8MHgyYmMgMHg4PiwgPDB4MmJjIDB4Yz47CiAKKwkJcWNvbSxzZGUtcmVnLWRtYS1vZmYgPSA8MD47CisJCXFjb20sc2RlLXJlZy1kbWEtdmVyc2lvbiA9IDwweDE+OworCQlxY29tLHNkZS1yZWctZG1hLXRyaWdnZXItb2ZmID0gPDB4MTE5Yz47CiAKIAkJcWNvbSxzZGUtc3NwcC12aWctYmxvY2tzIHsKIAkJCXFjb20sc2RlLXZpZy1jc2Mtb2ZmID0gPDB4MWEwMD47CkBAIC0xOTIsNiArMjExLDcgQEAKIAkJCXFjb20sc2RlLWRzcHAtZ2FtdXQgPSA8MHgxMDAwIDB4MDAwNDAwMDA+OwogCQkJcWNvbSxzZGUtZHNwcC1wY2MgPSA8MHgxNzAwIDB4MDAwNDAwMDA+OwogCQkJcWNvbSxzZGUtZHNwcC1nYyA9IDwweDE3YzAgMHgwMDAxMDAwOD47CisJCQlxY29tLHNkZS1kc3BwLWhpc3QgPSA8MHg4MDAgMHgwMDAxMDAwNz47CiAJCX07CiAKIAkJcWNvbSxwbGF0Zm9ybS1zdXBwbHktZW50cmllcyB7CkBAIC0zNDgsNiArMzY4LDggQEAKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbWRzc19tZHA+OwogCQlpbnRlcnJ1cHRzID0gPDIgMD47CiAKKwkJcG93ZXItZG9tYWlucyA9IDwmbWRzc19tZHA+OworCiAJCS8qIE9mZmxpbmUgcm90YXRvciBRb1Mgc2V0dGluZyAqLwogCQlxY29tLG1kc3Mtcm90LXZiaWYtcW9zLXNldHRpbmcgPSA8MyAzIDMgMyAzIDMgMyAzPjsKIAkJcWNvbSxtZHNzLXJvdC12YmlmLW1lbXR5cGUgPSA8MyAzPjsKQEAgLTUyNyw0ICs1NDksODYgQEAKIAkJfTsKIAl9OwogCisJc2RlX2RwOiBxY29tLGRwX2Rpc3BsYXlAMHsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGRwLWRpc3BsYXkiOworCisJCWdkc2Mtc3VwcGx5ID0gPCZtZHNzX2NvcmVfZ2RzYz47CisJCXZkZGEtMXAyLXN1cHBseSA9IDwmcG04OTk4X2wyNj47CisJCXZkZGEtMHA5LXN1cHBseSA9IDwmcG04OTk4X2wxPjsKKworCQlyZWcgPQk8MHhhZTkwMDAwIDB4YTg0PiwKKwkJCTwweDg4ZWFhMDAgMHgyMDA+LAorCQkJPDB4ODhlYTIwMCAweDIwMD4sCisJCQk8MHg4OGVhNjAwIDB4MjAwPiwKKwkJCTwweGFmMDIwMDAgMHgxYTA+LAorCQkJPDB4NzgwMDAwIDB4NjIxYz4sCisJCQk8MHg4OGVhMDMwIDB4MTA+LAorCQkJPDB4ODhlODAwMCAweDIwPiwKKwkJCTwweDBhZWUxMDAwIDB4MDM0PjsKKwkJcmVnLW5hbWVzID0gImRwX2N0cmwiLCAiZHBfcGh5IiwgImRwX2xuX3R4MCIsICJkcF9sbl90eDEiLAorCQkJImRwX21tc3NfY2MiLCAicWZwcm9tX3BoeXNpY2FsIiwgImRwX3BsbCIsCisJCQkidXNiM19kcF9jb20iLCAiaGRjcF9waHlzaWNhbCI7CisKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbWRzc19tZHA+OworCQlpbnRlcnJ1cHRzID0gPDEyIDA+OworCisJCWNsb2NrcyA9ICA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfQVVYX0NMSz4sCisJCQkgPCZjbG9ja19ycG1oIFJQTUhfQ1hPX0NMSz4sCisJCQkgPCZjbG9ja19nY2MgR0NDX1VTQjNfUFJJTV9DTEtSRUZfQ0xLPiwKKwkJCSA8JmNsb2NrX2djYyBHQ0NfVVNCX1BIWV9DRkdfQUhCMlBIWV9DTEs+LAorCQkJIDwmY2xvY2tfZ2NjIEdDQ19VU0IzX1BSSU1fUEhZX1BJUEVfQ0xLPiwKKwkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfTElOS19DTEs+LAorCQkJIDwmY2xvY2tfZGlzcGNjIERJU1BfQ0NfTURTU19EUF9MSU5LX0lOVEZfQ0xLPiwKKwkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfUElYRUxfQ0xLPiwKKwkJCSA8JmNsb2NrX2Rpc3BjYyBESVNQX0NDX01EU1NfRFBfQ1JZUFRPX0NMSz4sCisJCQkgPCZjbG9ja19kaXNwY2MgRElTUF9DQ19NRFNTX0RQX1BJWEVMX0NMS19TUkM+LAorCQkJIDwmbWRzc19kcF9wbGwgRFBfVkNPX0RJVklERURfQ0xLX1NSQ19NVVg+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2F1eF9jbGsiLCAiY29yZV91c2JfcmVmX2Nsa19zcmMiLAorCQkJImNvcmVfdXNiX3JlZl9jbGsiLCAiY29yZV91c2JfY2ZnX2FoYl9jbGsiLAorCQkJImNvcmVfdXNiX3BpcGVfY2xrIiwgImN0cmxfbGlua19jbGsiLAorCQkJImN0cmxfbGlua19pZmFjZV9jbGsiLCAiY3RybF9waXhlbF9jbGsiLAorCQkJImNyeXB0b19jbGsiLCAicGl4ZWxfY2xrX3JjZyIsICJwaXhlbF9wYXJlbnQiOworCisJCXFjb20sYXV4LWNmZzAtc2V0dGluZ3MgPSBbMjAgMDBdOworCQlxY29tLGF1eC1jZmcxLXNldHRpbmdzID0gWzI0IDEzIDIzIDFkXTsKKwkJcWNvbSxhdXgtY2ZnMi1zZXR0aW5ncyA9IFsyOCAyNF07CisJCXFjb20sYXV4LWNmZzMtc2V0dGluZ3MgPSBbMmMgMDBdOworCQlxY29tLGF1eC1jZmc0LXNldHRpbmdzID0gWzMwIDBhXTsKKwkJcWNvbSxhdXgtY2ZnNS1zZXR0aW5ncyA9IFszNCAyNl07CisJCXFjb20sYXV4LWNmZzYtc2V0dGluZ3MgPSBbMzggMGFdOworCQlxY29tLGF1eC1jZmc3LXNldHRpbmdzID0gWzNjIDAzXTsKKwkJcWNvbSxhdXgtY2ZnOC1zZXR0aW5ncyA9IFs0MCBiYl07CisJCXFjb20sYXV4LWNmZzktc2V0dGluZ3MgPSBbNDQgMDNdOworCisJCXFjb20sbWF4LXBjbGstZnJlcXVlbmN5LWtoeiA9IDw2NzUwMDA+OworCisJCXFjb20sY3RybC1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlxY29tLGN0cmwtc3VwcGx5LWVudHJ5QDAgeworCQkJCXJlZyA9IDwwPjsKKwkJCQlxY29tLHN1cHBseS1uYW1lID0gInZkZGEtMXAyIjsKKwkJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwxMjAwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwxMjAwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwyMTgwMD47CisJCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDQ+OworCQkJfTsKKwkJfTsKKworCQlxY29tLHBoeS1zdXBwbHktZW50cmllcyB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlxY29tLHBoeS1zdXBwbHktZW50cnlAMCB7CisJCQkJcmVnID0gPDA+OworCQkJCXFjb20sc3VwcGx5LW5hbWUgPSAidmRkYS0wcDkiOworCQkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDg4MDAwMD47CisJCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8ODgwMDAwPjsKKwkJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwzNjAwMD47CisJCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDMyPjsKKwkJCX07CisJCX07CisJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXVzYi5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS11c2IuZHRzaQppbmRleCAxNmQwOTg4Li4wOWY0ZWZhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXVzYi5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdXNiLmR0c2kKQEAgLTc4LDYgKzc4LDcgQEAKIAkJCXNucHMsZGlzYWJsZS1jbGstZ2F0aW5nOwogCQkJc25wcyxoYXMtbHBtLWVycmF0dW07CiAJCQlzbnBzLGhpcmQtdGhyZXNob2xkID0gL2JpdHMvIDggPDB4MTA+OworCQkJdXNiLWNvcmUtaWQgPSA8MD47CiAJCX07CiAKIAkJcWNvbSx1c2JiYW1AYTcwNDAwMCB7CkBAIC0xMTYsOCArMTE3LDkgQEAKIAlxdXNiX3BoeTA6IHF1c2JAODhlMjAwMCB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxxdXNiMnBoeS12MiI7CiAJCXJlZyA9IDwweDA4OGUyMDAwIDB4NDAwPiwKLQkJCTwweDAwNzgwMWU4IDB4ND47Ci0JCXJlZy1uYW1lcyA9ICJxdXNiX3BoeV9iYXNlIiwgImVmdXNlX2FkZHIiOworCQkJPDB4MDA3ODAxZTggMHg0PiwKKwkJCTwweDA4OGUwMDAwIDB4MjAwMD47CisJCXJlZy1uYW1lcyA9ICJxdXNiX3BoeV9iYXNlIiwgImVmdXNlX2FkZHIiLCAiZXVkX2Jhc2UiOwogCiAJCXFjb20sZWZ1c2UtYml0LXBvcyA9IDwyNT47CiAJCXFjb20sZWZ1c2UtbnVtLWJpdHMgPSA8Mz47CkBAIC0zODUsNiArMzg3LDcgQEAKIAkJCXNucHMsZGlzYWJsZS1jbGstZ2F0aW5nOwogCQkJc25wcyxoYXMtbHBtLWVycmF0dW07CiAJCQlzbnBzLGhpcmQtdGhyZXNob2xkID0gL2JpdHMvIDggPDB4MTA+OworCQkJdXNiLWNvcmUtaWQgPSA8MT47CiAJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS12Mi00ay1wYW5lbC1jZHAtb3ZlcmxheS5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLTRrLXBhbmVsLWNkcC1vdmVybGF5LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNlOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS12Mi00ay1wYW5lbC1jZHAtb3ZlcmxheS5kdHMKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworL2R0cy12MS87CisvcGx1Z2luLzsKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sY2FtY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxkaXNwY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxycG1oLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgorCisjaW5jbHVkZSAic2RtODQ1LXNkZS1kaXNwbGF5LmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWNkcC5kdHNpIgorI2luY2x1ZGUgInNkbTg0NS1jZHAtYXVkaW8tb3ZlcmxheS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gc2RtODQ1IHYyIDRLIERpc3BsYXkgUGFuZWwgQ0RQIjsKKwljb21wYXRpYmxlID0gInFjb20sc2RtODQ1LWNkcCIsICJxY29tLHNkbTg0NSIsICJxY29tLGNkcCI7CisJcWNvbSxtc20taWQgPSA8MzIxIDB4MjAwMDA+OworCXFjb20sYm9hcmQtaWQgPSA8MSAxPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJm1kc3NfbWRwIHsKKwljb25uZWN0b3JzID0gPCZzZGVfcnNjYyAmc2RlX3diPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlb19kaXNwbGF5IHsKKwlxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdjItNGstcGFuZWwtbXRwLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmM1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLTRrLXBhbmVsLW10cC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDY2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtbXRwLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LWF1ZGlvLW92ZXJsYXkuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIHNkbTg0NSB2MiA0SyBEaXNwbGF5IFBhbmVsIE1UUCI7CisJY29tcGF0aWJsZSA9ICJxY29tLHNkbTg0NS1tdHAiLCAicWNvbSxzZG04NDUiLCAicWNvbSxtdHAiOworCXFjb20sbXNtLWlkID0gPDMyMSAweDIwMDAwPjsKKwlxY29tLGJvYXJkLWlkID0gPDggMT47Cit9OworCismZHNpX250MzU1OTdfdHJ1bHlfZHNjX2NtZF9kaXNwbGF5IHsKKwkvZGVsZXRlLXByb3BlcnR5LyBxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CisKKyZtZHNzX21kcCB7CisJY29ubmVjdG9ycyA9IDwmc2RlX3JzY2MgJnNkZV93YiAmc2RlX2RwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX3ZpZGVvIHsKKwlxY29tLHBhbmVsLXN1cHBseS1lbnRyaWVzID0gPCZkc2lfcGFuZWxfcHdyX3N1cHBseT47CisJcWNvbSxtZHNzLWRzaS1ibC1wbWljLWNvbnRyb2wtdHlwZSA9ICJibF9jdHJsX3dsZWQiOworCXFjb20sbWRzcy1kc2ktYmwtbWluLWxldmVsID0gPDE+OworCXFjb20sbWRzcy1kc2ktYmwtbWF4LWxldmVsID0gPDQwOTU+OworCXFjb20sbWRzcy1kc2ktbW9kZS1zZWwtZ3Bpby1zdGF0ZSA9ICJkdWFsX3BvcnQiOworCXFjb20scGFuZWwtbW9kZS1ncGlvID0gPCZ0bG1tIDUyIDA+OworCXFjb20scGxhdGZvcm0tdGUtZ3BpbyA9IDwmdGxtbSAxMCAwPjsKKwlxY29tLHBsYXRmb3JtLXJlc2V0LWdwaW8gPSA8JnRsbW0gNiAwPjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47Cit9OworCismZHNpX3NoYXJwXzRrX2RzY192aWRlb19kaXNwbGF5IHsKKwlxY29tLGRzaS1kaXNwbGF5LWFjdGl2ZTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLTRrLXBhbmVsLXFyZC1vdmVybGF5LmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdjItNGstcGFuZWwtcXJkLW92ZXJsYXkuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGMxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLTRrLXBhbmVsLXFyZC1vdmVybGF5LmR0cwpAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisvZHRzLXYxLzsKKy9wbHVnaW4vOworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxjYW1jYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLGRpc3BjYy1zZG04NDUuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9xY29tLHJwbWguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9hcm0tZ2ljLmg+CisKKyNpbmNsdWRlICJzZG04NDUtc2RlLWRpc3BsYXkuZHRzaSIKKyNpbmNsdWRlICJzZG04NDUtcXJkLmR0c2kiCisjaW5jbHVkZSAic2RtODQ1LXFyZC1hdWRpby1vdmVybGF5LmR0c2kiCisKKy8geworCW1vZGVsID0gIlF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBzZG04NDUgdjIgNEsgRGlzcGxheSBQYW5lbCBRUkQiOworCWNvbXBhdGlibGUgPSAicWNvbSxzZG04NDUtcXJkIiwgInFjb20sc2RtODQ1IiwgInFjb20scXJkIjsKKwlxY29tLG1zbS1pZCA9IDwzMjEgMHgyMDAwMD47CisJcWNvbSxib2FyZC1pZCA9IDwxMSAxPjsKK307CisKKyZkc2lfbnQzNTU5N190cnVseV9kc2NfY21kX2Rpc3BsYXkgeworCS9kZWxldGUtcHJvcGVydHkvIHFjb20sZHNpLWRpc3BsYXktYWN0aXZlOworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW8geworCXFjb20scGFuZWwtc3VwcGx5LWVudHJpZXMgPSA8JmRzaV9wYW5lbF9wd3Jfc3VwcGx5PjsKKwlxY29tLG1kc3MtZHNpLWJsLXBtaWMtY29udHJvbC10eXBlID0gImJsX2N0cmxfd2xlZCI7CisJcWNvbSxtZHNzLWRzaS1ibC1taW4tbGV2ZWwgPSA8MT47CisJcWNvbSxtZHNzLWRzaS1ibC1tYXgtbGV2ZWwgPSA8NDA5NT47CisJcWNvbSxtZHNzLWRzaS1tb2RlLXNlbC1ncGlvLXN0YXRlID0gImR1YWxfcG9ydCI7CisJcWNvbSxwYW5lbC1tb2RlLWdwaW8gPSA8JnRsbW0gNTIgMD47CisJcWNvbSxwbGF0Zm9ybS10ZS1ncGlvID0gPCZ0bG1tIDEwIDA+OworCXFjb20scGxhdGZvcm0tcmVzZXQtZ3BpbyA9IDwmdGxtbSA2IDA+OworCXFjb20sbWRzcy1kc2ktcGFuZWwtb3JpZW50YXRpb24gPSAiMTgwIjsKK307CisKKyZkc2lfc2hhcnBfNGtfZHNjX2NtZCB7CisJcWNvbSxwYW5lbC1zdXBwbHktZW50cmllcyA9IDwmZHNpX3BhbmVsX3B3cl9zdXBwbHk+OworCXFjb20sbWRzcy1kc2ktYmwtcG1pYy1jb250cm9sLXR5cGUgPSAiYmxfY3RybF93bGVkIjsKKwlxY29tLG1kc3MtZHNpLWJsLW1pbi1sZXZlbCA9IDwxPjsKKwlxY29tLG1kc3MtZHNpLWJsLW1heC1sZXZlbCA9IDw0MDk1PjsKKwlxY29tLG1kc3MtZHNpLW1vZGUtc2VsLWdwaW8tc3RhdGUgPSAiZHVhbF9wb3J0IjsKKwlxY29tLHBhbmVsLW1vZGUtZ3BpbyA9IDwmdGxtbSA1MiAwPjsKKwlxY29tLHBsYXRmb3JtLXRlLWdwaW8gPSA8JnRsbW0gMTAgMD47CisJcWNvbSxwbGF0Zm9ybS1yZXNldC1ncGlvID0gPCZ0bG1tIDYgMD47CisJcWNvbSxtZHNzLWRzaS1wYW5lbC1vcmllbnRhdGlvbiA9ICIxODAiOworfTsKKworJmRzaV9zaGFycF80a19kc2NfdmlkZW9fZGlzcGxheSB7CisJcWNvbSxkc2ktZGlzcGxheS1hY3RpdmU7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS12Mi1jYW1lcmEuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdjItY2FtZXJhLmR0c2kKaW5kZXggYzQyYTdiZS4uMGI2ZTI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS12Mi1jYW1lcmEuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLWNhbWVyYS5kdHNpCkBAIC0yNCw4ICsyNCw3IEBACiAJCWdkc2NyLXN1cHBseSA9IDwmdGl0YW5fdG9wX2dkc2M+OwogCQlyZWZnZW4tc3VwcGx5ID0gPCZyZWZnZW4+OwogCQljc2ktdmRkLXZvbHRhZ2UgPSA8MTIwMDAwMD47Ci0JCW1pcGktY3NpLXZkZC1zdXBwbHkgPSA8JnBtODk5OF9sMjY+OwotCQltaXBpLWRzaS12ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDE+OworCQltaXBpLWNzaS12ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDE+OwogCQljbG9ja3MgPSA8JmNsb2NrX2NhbWNjIENBTV9DQ19DQU1OT0NfQVhJX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19TT0NfQUhCX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19TTE9XX0FIQl9DTEtfU1JDPiwKQEAgLTYwLDggKzU5LDcgQEAKIAkJZ2RzY3Itc3VwcGx5ID0gPCZ0aXRhbl90b3BfZ2RzYz47CiAJCXJlZmdlbi1zdXBwbHkgPSA8JnJlZmdlbj47CiAJCWNzaS12ZGQtdm9sdGFnZSA9IDwxMjAwMDAwPjsKLQkJbWlwaS1jc2ktdmRkLXN1cHBseSA9IDwmcG04OTk4X2wyNj47Ci0JCW1pcGktZHNpLXZkZC1zdXBwbHkgPSA8JnBtODk5OF9sMT47CisJCW1pcGktY3NpLXZkZC1zdXBwbHkgPSA8JnBtODk5OF9sMT47CiAJCWNsb2NrcyA9IDwmY2xvY2tfY2FtY2MgQ0FNX0NDX0NBTU5PQ19BWElfQ0xLPiwKIAkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX1NPQ19BSEJfQ0xLPiwKIAkJCTwmY2xvY2tfY2FtY2MgQ0FNX0NDX1NMT1dfQUhCX0NMS19TUkM+LApAQCAtOTcsOCArOTUsNyBAQAogCQlnZHNjci1zdXBwbHkgPSA8JnRpdGFuX3RvcF9nZHNjPjsKIAkJcmVmZ2VuLXN1cHBseSA9IDwmcmVmZ2VuPjsKIAkJY3NpLXZkZC12b2x0YWdlID0gPDEyMDAwMDA+OwotCQltaXBpLWNzaS12ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDI2PjsKLQkJbWlwaS1kc2ktdmRkLXN1cHBseSA9IDwmcG04OTk4X2wxPjsKKwkJbWlwaS1jc2ktdmRkLXN1cHBseSA9IDwmcG04OTk4X2wxPjsKIAkJY2xvY2tzID0gPCZjbG9ja19jYW1jYyBDQU1fQ0NfQ0FNTk9DX0FYSV9DTEs+LAogCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfU09DX0FIQl9DTEs+LAogCQkJPCZjbG9ja19jYW1jYyBDQU1fQ0NfU0xPV19BSEJfQ0xLX1NSQz4sCkBAIC0xMjQsNyArMTIxLDcgQEAKIAljYW1fY3NpcGh5MzogcWNvbSxjc2lwaHlAYWM2ODAwMCB7CiAJCWNlbGwtaW5kZXggPSA8Mz47CiAJCWNvbXBhdGlibGUgPSAicWNvbSxjc2lwaHktdjEuMCIsICJxY29tLGNzaXBoeSI7Ci0JCXJlZyA9IDwweGFjNjcwMDAgMHgxMDAwPjsKKwkJcmVnID0gPDB4YWM2ODAwMCAweDEwMDA+OwogCQlyZWctbmFtZXMgPSAiY3NpcGh5IjsKIAkJcmVnLWNhbS1iYXNlID0gPDB4NjgwMDA+OwogCQlpbnRlcnJ1cHRzID0gPDAgNDQ4IDA+OwpAQCAtMTMzLDggKzEzMCw3IEBACiAJCWdkc2NyLXN1cHBseSA9IDwmdGl0YW5fdG9wX2dkc2M+OwogCQlyZWZnZW4tc3VwcGx5ID0gPCZyZWZnZW4+OwogCQljc2ktdmRkLXZvbHRhZ2UgPSA8MTIwMDAwMD47Ci0JCW1pcGktY3NpLXZkZC1zdXBwbHkgPSA8JnBtODk5OF9sMjY+OwotCQltaXBpLWRzaS12ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDE+OworCQltaXBpLWNzaS12ZGQtc3VwcGx5ID0gPCZwbTg5OThfbDE+OwogCQljbG9ja3MgPSA8JmNsb2NrX2NhbWNjIENBTV9DQ19DQU1OT0NfQVhJX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19TT0NfQUhCX0NMSz4sCiAJCQk8JmNsb2NrX2NhbWNjIENBTV9DQ19TTE9XX0FIQl9DTEtfU1JDPiwKQEAgLTI0MywxOCArMjM5LDggQEAKIAogCQltc21fY2FtX3NtbXVfc2VjdXJlIHsKIAkJCWNvbXBhdGlibGUgPSAicWNvbSxtc20tY2FtLXNtbXUtY2IiOwotCQkJaW9tbXVzID0gPCZhcHBzX3NtbXUgMHgxMDAxIDB4MD47CiAJCQlsYWJlbCA9ICJjYW0tc2VjdXJlIjsKLQkJCWNhbV9zZWN1cmVfaW92YV9tZW1fbWFwOiBpb3ZhLW1lbS1tYXAgewotCQkJCS8qIFNlY3VyZSBJTyByZWdpb24gaXMgYXBwcm94aW1hdGVseSAzLjQgR0IgKi8KLQkJCQlpb3ZhLW1lbS1yZWdpb24taW8gewotCQkJCQlpb3ZhLXJlZ2lvbi1uYW1lID0gImlvIjsKLQkJCQkJaW92YS1yZWdpb24tc3RhcnQgPSA8MHg3NDAwMDAwPjsKLQkJCQkJaW92YS1yZWdpb24tbGVuID0gPDB4ZDhjMDAwMDA+OwotCQkJCQlpb3ZhLXJlZ2lvbi1pZCA9IDwweDM+OwotCQkJCQlzdGF0dXMgPSAib2siOwotCQkJCX07Ci0JCQl9OworCQkJcWNvbSxzZWN1cmUtY2I7CiAJCX07CiAJfTsKIApAQCAtMzI5LDE0ICszMTUsMTQgQEAKIAkJCSJ0dXJibyIsICJ0dXJibyI7CiAJCWNsaWVudC1pZC1iYXNlZDsKIAkJY2xpZW50LW5hbWVzID0KLQkJCSJjc2lwaHkwIiwgImNzaXBoeTEiLCAiY3NpcGh5MiIsICJjY2kwIiwKKwkJCSJjc2lwaHkwIiwgImNzaXBoeTEiLCAiY3NpcGh5MiIsICJjc2lwaHkzIiwgImNjaTAiLAogCQkJImNzaWQwIiwgImNzaWQxIiwgImNzaWQyIiwKIAkJCSJpZmUwIiwgImlmZTEiLCAiaWZlMiIsICJpcGUwIiwKIAkJCSJpcGUxIiwgImNhbS1jZG0taW50ZjAiLCAiY3Bhcy1jZG0wIiwgImJwczAiLAogCQkJImljcDAiLCAianBlZy1kbWEwIiwgImpwZWctZW5jMCIsICJmZDAiOwogCQljbGllbnQtYXhpLXBvcnQtbmFtZXMgPQotCQkJImNhbV9oZl8xIiwgImNhbV9oZl8yIiwgImNhbV9oZl8yIiwgImNhbV9zZl8xIiwKLQkJCSJjYW1faGZfMSIsICJjYW1faGZfMiIsICJjYW1faGZfMiIsCisJCQkiY2FtX2hmXzEiLCAiY2FtX2hmXzIiLCAiY2FtX2hmXzIiLCAiY2FtX2hmXzIiLAorCQkJImNhbV9zZl8xIiwgImNhbV9oZl8xIiwgImNhbV9oZl8yIiwgImNhbV9oZl8yIiwKIAkJCSJjYW1faGZfMSIsICJjYW1faGZfMiIsICJjYW1faGZfMiIsICJjYW1fc2ZfMSIsCiAJCQkiY2FtX3NmXzEiLCAiY2FtX3NmXzEiLCAiY2FtX3NmXzEiLCAiY2FtX3NmXzEiLAogCQkJImNhbV9zZl8xIiwgImNhbV9zZl8xIiwgImNhbV9zZl8xIiwgImNhbV9zZl8xIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdjIuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUtdjIuZHRzaQppbmRleCBhMGI2OTQ1Li42Yzg1ZGFmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LXYyLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS12Mi5kdHNpCkBAIC0yNSw2ICsyNSwxMCBAQAogL2RlbGV0ZS1ub2RlLyAmYXBjMF9jcHI7CiAvZGVsZXRlLW5vZGUvICZhcGMxX2NwcjsKIAorJnRsbW0geworCWNvbXBhdGlibGUgPSAicWNvbSxzZG04NDUtcGluY3RybC12MiI7Cit9OworCiAmc29jIHsKIAkvKiBDUFIgY29udHJvbGxlciByZWd1bGF0b3JzICovCiAJYXBjMF9jcHI6IGNwcmgtY3RybEAxN2RjMDAwMCB7CkBAIC01Nyw3ICs2MSw3IEBACiAJCXFjb20sY3ByLXNhdy11c2UtdW5pdC1tVjsKIAogCQlxY29tLHNhdy1hdnMtY3RybCA9IDwweDEwMUMwMzE+OwotCQlxY29tLHNhdy1hdnMtbGltaXQgPSA8MHgzQjgwM0I4PjsKKwkJcWNvbSxzYXctYXZzLWxpbWl0ID0gPDB4M0U4MDNFOD47CiAKIAkJcWNvbSxjcHItZW5hYmxlOwogCQlxY29tLGNwci1ody1jbG9zZWQtbG9vcDsKQEAgLTY5LDcgKzczLDcgQEAKIAkJCSJBUFNTX1NJTFZFUl9DUFJIX1NUQVRVU18xIiwKIAkJCSJTSUxWRVJfU0FXNF9QTUlDX1NUUyI7CiAKLQkJcWNvbSxjcHItYWdpbmctcmVmLXZvbHRhZ2UgPSA8OTUyMDAwPjsKKwkJcWNvbSxjcHItYWdpbmctcmVmLXZvbHRhZ2UgPSA8MTAwMDAwMD47CiAJCXZkZC1zdXBwbHkgPSA8JnBtODk5OF9zMTM+OwogCiAJCXRocmVhZEAwIHsKQEAgLTg1LDkgKzg5LDkgQEAKIAkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxOD47CiAKIAkJCQlxY29tLGNwci1mdXNlLWNvcm5lcnMgPSA8ND47Ci0JCQkJcWNvbSxjcHItZnVzZS1jb21ib3MgPSA8MTY+OwotCQkJCXFjb20sY3ByLXNwZWVkLWJpbnMgPSA8Mj47Ci0JCQkJcWNvbSxjcHItc3BlZWQtYmluLWNvcm5lcnMgPSA8MTggMTg+OworCQkJCXFjb20sY3ByLWZ1c2UtY29tYm9zID0gPDI0PjsKKwkJCQlxY29tLGNwci1zcGVlZC1iaW5zID0gPDM+OworCQkJCXFjb20sY3ByLXNwZWVkLWJpbi1jb3JuZXJzID0gPDE4IDE4IDE4PjsKIAkJCQlxY29tLGNwci1jb3JuZXJzID0gPDE4PjsKIAogCQkJCXFjb20sY3ByLWNvcm5lci1mbWF4LW1hcCA9IDw2IDEyIDE1IDE4PjsKQEAgLTEzMywxMCArMTM3LDYyIEBACiAJCQkJCSAxOTUwIDI2MzI+OwogCiAJCQkJcWNvbSxjcHItb3Blbi1sb29wLXZvbHRhZ2UtZnVzZS1hZGp1c3RtZW50ID0KLQkJCQkJPCAgICAgMCAgICAgIDAgIDEyMDAwICAxMjAwMD47CisJCQkJCS8qIFNwZWVkIGJpbiAwICovCisJCQkJCTwgICAgICAwICAgICAgICAwICAgIDEyMDAwICAgIDEyMDAwPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTMwMDApPiwKKwkJCQkJLyogU3BlZWQgYmluIDEgKi8KKwkJCQkJPCAgICAgIDAgICAgICAgIDAgICAgMTIwMDAgICAgMTIwMDA+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtMzAwMCk+LAorCQkJCQkvKiBTcGVlZCBiaW4gMiAqLworCQkJCQk8ICAgICAgMCAgICAgICAgMCAgICAxMjAwMCAgICAxMjAwMD4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC0zMDAwKT47CiAKIAkJCQlxY29tLGNwci1jbG9zZWQtbG9vcC12b2x0YWdlLWZ1c2UtYWRqdXN0bWVudCA9Ci0JCQkJCTwgICAgIDAgICAgICAwICAxMjAwMCAgMTAwMDA+OworCQkJCQkvKiBTcGVlZCBiaW4gMCAqLworCQkJCQk8ICAgICAgMCAgICAgICAgMCAgICAxMjAwMCAgICAxMDAwMD4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCTwoLTE1MDAwKSAoLTE1MDAwKSAgKC0zMDAwKSAgKC01MDAwKT4sCisJCQkJCS8qIFNwZWVkIGJpbiAxICovCisJCQkJCTwgICAgICAwICAgICAgICAwICAgIDEyMDAwICAgIDEwMDAwPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJPCgtMTUwMDApICgtMTUwMDApICAoLTMwMDApICAoLTUwMDApPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KKwkJCQkJPCAgICAgIDAgICAgICAgIDAgICAgMTIwMDAgICAgMTAwMDA+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+LAorCQkJCQk8KC0xNTAwMCkgKC0xNTAwMCkgICgtMzAwMCkgICgtNTAwMCk+OwogCiAJCQkJcWNvbSxhbGxvdy12b2x0YWdlLWludGVycG9sYXRpb247CiAJCQkJcWNvbSxhbGxvdy1xdW90aWVudC1pbnRlcnBvbGF0aW9uOwpAQCAtMTQ5LDYgKzIwNSw4IEBACiAJCQkJCS8qIFNwZWVkIGJpbiAwICovCiAJCQkJCTwwIDEgMSAxIDEgMSAxIDE+LAogCQkJCQkvKiBTcGVlZCBiaW4gMSAqLworCQkJCQk8MCAxIDEgMSAxIDEgMSAxPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KIAkJCQkJPDAgMSAxIDEgMSAxIDEgMT47CiAJCQkJcWNvbSxhbGxvdy1hZ2luZy1vcGVuLWxvb3Atdm9sdGFnZS1hZGp1c3RtZW50ID0KIAkJCQkJPDE+OwpAQCAtMTY4LDE5ICsyMjYsMjMgQEAKIAkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxNT47CiAKIAkJCQlxY29tLGNwci1mdXNlLWNvcm5lcnMgPSA8ND47Ci0JCQkJcWNvbSxjcHItZnVzZS1jb21ib3MgPSA8MTY+OwotCQkJCXFjb20sY3ByLXNwZWVkLWJpbnMgPSA8Mj47Ci0JCQkJcWNvbSxjcHItc3BlZWQtYmluLWNvcm5lcnMgPSA8MTQgMTU+OworCQkJCXFjb20sY3ByLWZ1c2UtY29tYm9zID0gPDI0PjsKKwkJCQlxY29tLGNwci1zcGVlZC1iaW5zID0gPDM+OworCQkJCXFjb20sY3ByLXNwZWVkLWJpbi1jb3JuZXJzID0gPDE0IDE1IDE1PjsKIAkJCQlxY29tLGNwci1jb3JuZXJzID0KIAkJCQkJLyogU3BlZWQgYmluIDAgKi8KIAkJCQkJPDE0IDE0IDE0IDE0IDE0IDE0IDE0IDE0PiwKIAkJCQkJLyogU3BlZWQgYmluIDEgKi8KKwkJCQkJPDE1IDE1IDE1IDE1IDE1IDE1IDE1IDE1PiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KIAkJCQkJPDE1IDE1IDE1IDE1IDE1IDE1IDE1IDE1PjsKIAogCQkJCXFjb20sY3ByLWNvcm5lci1mbWF4LW1hcCA9CiAJCQkJCS8qIFNwZWVkIGJpbiAwICovCiAJCQkJCTw0IDggMTEgMTQ+LAogCQkJCQkvKiBTcGVlZCBiaW4gMSAqLworCQkJCQk8NCA4IDExIDE1PiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KIAkJCQkJPDQgOCAxMSAxNT47CiAKIAkJCQlxY29tLGNwci12b2x0YWdlLWNlaWxpbmcgPQpAQCAtMTkyLDYgKzI1NCwxMSBAQAogCQkJCQk8ODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAKIAkJCQkJIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwCiAJCQkJCSA4MjgwMDAgIDkzMjAwMCAgOTMyMDAwIDEwMDAwMDAKKwkJCQkJMTAwMDAwMD4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTw4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMAorCQkJCQkgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAKKwkJCQkJIDgyODAwMCAgOTMyMDAwICA5MzIwMDAgMTAwMDAwMAogCQkJCQkxMDAwMDAwPjsKIAogCQkJCXFjb20sY3ByLXZvbHRhZ2UtZmxvb3IgPQpAQCAtMjAzLDYgKzI3MCwxMSBAQAogCQkJCQk8NTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKIAkJCQkJIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwCiAJCQkJCSA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKKwkJCQkJIDU2ODAwMD4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTw1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMAorCQkJCQkgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKKwkJCQkJIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMAogCQkJCQkgNTY4MDAwPjsKIAogCQkJCXFjb20sY3ByLWZsb29yLXRvLWNlaWxpbmctbWF4LXJhbmdlID0KQEAgLTIxMyw2ICsyODUsMTAgQEAKIAkJCQkJLyogU3BlZWQgYmluIDEgKi8KIAkJCQkJPDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMAogCQkJCQkgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwCisJCQkJCSAzMjAwMCAgMzIwMDAgIDMyMDAwICA0MDAwMCAgNDAwMDA+LAorCQkJCQkvKiBTcGVlZCBiaW4gMiAqLworCQkJCQk8MzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwCisJCQkJCSAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAKIAkJCQkJIDMyMDAwICAzMjAwMCAgMzIwMDAgIDQwMDAwICA0MDAwMD47CiAKIAkJCQlxY29tLGNvcm5lci1mcmVxdWVuY2llcyA9CkBAIC0yMjcsNiArMzAzLDEyIEBACiAJCQkJCSA1NzYwMDAwMDAgIDY1MjgwMDAwMCAgNzQ4ODAwMDAwCiAJCQkJCSA4NDQ4MDAwMDAgIDk0MDgwMDAwMCAxMDM2ODAwMDAwCiAJCQkJCTExMzI4MDAwMDAgMTIwOTYwMDAwMCAxMzA1NjAwMDAwCisJCQkJCTE0MDE2MDAwMDAgMTQ5NzYwMDAwMCAxNTkzNjAwMDAwPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KKwkJCQkJPDMwMDAwMDAwMCAgNDAzMjAwMDAwICA0ODAwMDAwMDAKKwkJCQkJIDU3NjAwMDAwMCAgNjUyODAwMDAwICA3NDg4MDAwMDAKKwkJCQkJIDg0NDgwMDAwMCAgOTQwODAwMDAwIDEwMzY4MDAwMDAKKwkJCQkJMTEzMjgwMDAwMCAxMjA5NjAwMDAwIDEzMDU2MDAwMDAKIAkJCQkJMTQwMTYwMDAwMCAxNDk3NjAwMDAwIDE1OTM2MDAwMDA+OwogCiAJCQkJcWNvbSxjcHItcm8tc2NhbGluZy1mYWN0b3IgPQpAQCAtMjQ0LDIyICszMjYsNzYgQEAKIAkJCQkJIDI1MDEgMjA5NT47CiAKIAkJCQlxY29tLGNwci1vcGVuLWxvb3Atdm9sdGFnZS1mdXNlLWFkanVzdG1lbnQgPQotCQkJCQk8ICA4MDAwICAxNjAwMCAgMTYwMDAgIDEyMDAwPjsKKwkJCQkJLyogU3BlZWQgYmluIDAgKi8KKwkJCQkJPCAgIDgwMDAgICAgMTYwMDAgICAgMTYwMDAgICAgMTIwMDA+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtNzAwMCkgICAgMTAwMCAgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQkvKiBTcGVlZCBiaW4gMSAqLworCQkJCQk8ICAgODAwMCAgICAxNjAwMCAgICAxNjAwMCAgICAxMjAwMD4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC03MDAwKSAgICAxMDAwICAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTwgICA4MDAwICAgIDE2MDAwICAgIDE2MDAwICAgIDEyMDAwPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTcwMDApICAgIDEwMDAgICAgIDEwMDAgICAoLTMwMDApPjsKIAogCQkJCXFjb20sY3ByLWNsb3NlZC1sb29wLXZvbHRhZ2UtZnVzZS1hZGp1c3RtZW50ID0KLQkJCQkJPCAgNjAwMCAgMTQwMDAgIDE2MDAwICAxMjAwMD47CisJCQkJCS8qIFNwZWVkIGJpbiAwICovCisJCQkJCTwgICA2MDAwICAgIDE0MDAwICAgIDE2MDAwICAgIDEyMDAwPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJPCAoLTkwMDApICAoLTEwMDApICAgIDEwMDAgICAoLTMwMDApPiwKKwkJCQkJLyogU3BlZWQgYmluIDEgKi8KKwkJCQkJPCAgIDYwMDAgICAgMTQwMDAgICAgMTYwMDAgICAgMTIwMDA+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQk8ICgtOTAwMCkgICgtMTAwMCkgICAgMTAwMCAgICgtMzAwMCk+LAorCQkJCQkvKiBTcGVlZCBiaW4gMiAqLworCQkJCQk8ICAgNjAwMCAgICAxNDAwMCAgICAxNjAwMCAgICAxMjAwMD4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT4sCisJCQkJCTwgKC05MDAwKSAgKC0xMDAwKSAgICAxMDAwICAgKC0zMDAwKT47CiAKIAkJCQlxY29tLGFsbG93LXZvbHRhZ2UtaW50ZXJwb2xhdGlvbjsKIAkJCQlxY29tLGFsbG93LXF1b3RpZW50LWludGVycG9sYXRpb247CiAJCQkJcWNvbSxjcHItc2NhbGVkLW9wZW4tbG9vcC12b2x0YWdlLWFzLWNlaWxpbmc7CiAKIAkJCQlxY29tLGNwci1hZ2luZy1tYXgtdm9sdGFnZS1hZGp1c3RtZW50ID0gPDE1MDAwPjsKLQkJCQlxY29tLGNwci1hZ2luZy1yZWYtY29ybmVyID0gPDE0PjsKKwkJCQlxY29tLGNwci1hZ2luZy1yZWYtY29ybmVyID0gPDE0IDE1IDE1PjsKIAkJCQlxY29tLGNwci1hZ2luZy1yby1zY2FsaW5nLWZhY3RvciA9IDwxNjIwPjsKIAkJCQlxY29tLGFsbG93LWFnaW5nLXZvbHRhZ2UtYWRqdXN0bWVudCA9CiAJCQkJCS8qIFNwZWVkIGJpbiAwICovCiAJCQkJCTwwIDEgMSAxIDEgMSAxIDE+LAogCQkJCQkvKiBTcGVlZCBiaW4gMSAqLworCQkJCQk8MCAxIDEgMSAxIDEgMSAxPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KIAkJCQkJPDAgMSAxIDEgMSAxIDEgMT47CiAJCQkJcWNvbSxhbGxvdy1hZ2luZy1vcGVuLWxvb3Atdm9sdGFnZS1hZGp1c3RtZW50ID0KIAkJCQkJPDE+OwpAQCAtMzAyLDcgKzQzOCw3IEBACiAJCXFjb20sY3ByLXNhdy11c2UtdW5pdC1tVjsKIAogCQlxY29tLHNhdy1hdnMtY3RybCA9IDwweDEwMUMwMzE+OwotCQlxY29tLHNhdy1hdnMtbGltaXQgPSA8MHg0NzAwNDcwPjsKKwkJcWNvbSxzYXctYXZzLWxpbWl0ID0gPDB4NDg4MDQ4OD47CiAKIAkJcWNvbSxjcHItZW5hYmxlOwogCQlxY29tLGNwci1ody1jbG9zZWQtbG9vcDsKQEAgLTMxMiw3ICs0NDgsNyBAQAogCQlxY29tLGNwci1wYW5pYy1yZWctbmFtZS1saXN0ID0KIAkJCSJBUFNTX0dPTERfQ1BSSF9TVEFUVVNfMCIsICJHT0xEX1NBVzRfUE1JQ19TVFMiOwogCi0JCXFjb20sY3ByLWFnaW5nLXJlZi12b2x0YWdlID0gPDExMzYwMDA+OworCQlxY29tLGNwci1hZ2luZy1yZWYtdm9sdGFnZSA9IDwxMTYwMDAwPjsKIAkJdmRkLXN1cHBseSA9IDwmcG04OTk4X3MxMj47CiAKIAkJdGhyZWFkQDAgewpAQCAtMzI1LDIzICs0NjEsMjcgQEAKIAkJCWFwYzFfcGVyZmNsX3ZyZWc6IHJlZ3VsYXRvciB7CiAJCQkJcmVndWxhdG9yLW5hbWUgPSAiYXBjMV9wZXJmY2xfY29ybmVyIjsKIAkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxPjsKLQkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMz47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzU+OwogCiAJCQkJcWNvbSxjcHItZnVzZS1jb3JuZXJzID0gPDU+OwotCQkJCXFjb20sY3ByLWZ1c2UtY29tYm9zID0gPDE2PjsKLQkJCQlxY29tLGNwci1zcGVlZC1iaW5zID0gPDI+OwotCQkJCXFjb20sY3ByLXNwZWVkLWJpbi1jb3JuZXJzID0gPDI4IDMxPjsKKwkJCQlxY29tLGNwci1mdXNlLWNvbWJvcyA9IDwyND47CisJCQkJcWNvbSxjcHItc3BlZWQtYmlucyA9IDwzPjsKKwkJCQlxY29tLGNwci1zcGVlZC1iaW4tY29ybmVycyA9IDwyOCAzMSAzMz47CiAJCQkJcWNvbSxjcHItY29ybmVycyA9CiAJCQkJCS8qIFNwZWVkIGJpbiAwICovCiAJCQkJCTwyOCAyOCAyOCAyOCAyOCAyOCAyOCAyOD4sCiAJCQkJCS8qIFNwZWVkIGJpbiAxICovCi0JCQkJCTwzMSAzMSAzMSAzMSAzMSAzMSAzMSAzMT47CisJCQkJCTwzMSAzMSAzMSAzMSAzMSAzMSAzMSAzMT4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTwzMyAzMyAzMyAzMyAzMyAzMyAzMyAzMz47CiAKIAkJCQlxY29tLGNwci1jb3JuZXItZm1heC1tYXAgPQogCQkJCQkvKiBTcGVlZCBiaW4gMCAqLwogCQkJCQk8NyAxNCAyMiAyNyAyOD4sCiAJCQkJCS8qIFNwZWVkIGJpbiAxICovCi0JCQkJCTw3IDE0IDIyIDI3IDMxPjsKKwkJCQkJPDcgMTQgMjIgMjcgMzE+LAorCQkJCQkvKiBTcGVlZCBiaW4gMiAqLworCQkJCQk8NyAxNCAyMiAzMCAzMz47CiAKIAkJCQlxY29tLGNwci12b2x0YWdlLWNlaWxpbmcgPQogCQkJCQkvKiBTcGVlZCBiaW4gMCAqLwpAQCAtMzUwLDE1ICs0OTAsMjMgQEAKIAkJCQkJIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwCiAJCQkJCSA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA5MzIwMDAgIDkzMjAwMAogCQkJCQkgOTMyMDAwICA5MzIwMDAgMTEwNDAwMCAxMTA0MDAwIDExMDQwMDAKLQkJCQkJMTEwNDAwMCAxMTM2MDAwIDExMzYwMDA+LAorCQkJCQkxMTA0MDAwIDExNjAwMDAgMTE2MDAwMD4sCiAJCQkJCS8qIFNwZWVkIGJpbiAxICovCiAJCQkJCTw4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMAogCQkJCQkgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAKIAkJCQkJIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwCiAJCQkJCSA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA5MzIwMDAgIDkzMjAwMAogCQkJCQkgOTMyMDAwICA5MzIwMDAgMTEwNDAwMCAxMTA0MDAwIDExMDQwMDAKLQkJCQkJMTEwNDAwMCAxMTM2MDAwIDExMzYwMDAgMTEzNjAwMCAxMTM2MDAwCi0JCQkJCTExMzYwMDA+OworCQkJCQkxMTA0MDAwIDExNjAwMDAgMTE2MDAwMCAxMTYwMDAwIDExNjAwMDAKKwkJCQkJMTE2MDAwMD4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTw4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMAorCQkJCQkgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA4MjgwMDAKKwkJCQkJIDgyODAwMCAgODI4MDAwICA4MjgwMDAgIDgyODAwMCAgODI4MDAwCisJCQkJCSA4MjgwMDAgIDgyODAwMCAgODI4MDAwICA5MzIwMDAgIDkzMjAwMAorCQkJCQkgOTMyMDAwICA5MzIwMDAgMTEwNDAwMCAxMTA0MDAwIDExMDQwMDAKKwkJCQkJMTEwNDAwMCAxMTYwMDAwIDExNjAwMDAgMTE2MDAwMCAxMTYwMDAwCisJCQkJCTExNjAwMDAgMTE2MDAwMCAxMTYwMDAwPjsKIAogCQkJCXFjb20sY3ByLXZvbHRhZ2UtZmxvb3IgPQogCQkJCQkvKiBTcGVlZCBiaW4gMCAqLwpAQCAtMzc1LDcgKzUyMywxNSBAQAogCQkJCQkgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKIAkJCQkJIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwCiAJCQkJCSA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMAotCQkJCQkgNTY4MDAwPjsKKwkJCQkJIDU2ODAwMD4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTw1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMAorCQkJCQkgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKKwkJCQkJIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwCisJCQkJCSA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMAorCQkJCQkgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAKKwkJCQkJIDU2ODAwMCAgNTY4MDAwICA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwCisJCQkJCSA1NjgwMDAgIDU2ODAwMCAgNTY4MDAwPjsKIAogCQkJCXFjb20sY3ByLWZsb29yLXRvLWNlaWxpbmctbWF4LXJhbmdlID0KIAkJCQkJLyogU3BlZWQgYmluIDAgKi8KQEAgLTM5Miw3ICs1NDgsMTUgQEAKIAkJCQkJIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMAogCQkJCQkgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwCiAJCQkJCSAzMjAwMCAgMzIwMDAgIDQwMDAwICA0MDAwMCAgNDAwMDAKLQkJCQkJIDQwMDAwPjsKKwkJCQkJIDQwMDAwPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KKwkJCQkJPDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMAorCQkJCQkgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwCisJCQkJCSAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAKKwkJCQkJIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwICAzMjAwMAorCQkJCQkgMzIwMDAgIDMyMDAwICAzMjAwMCAgMzIwMDAgIDMyMDAwCisJCQkJCSAzMjAwMCAgMzIwMDAgIDQwMDAwICA0MDAwMCAgNDAwMDAKKwkJCQkJIDQwMDAwICA0MDAwMCAgNDAwMDA+OwogCiAJCQkJcWNvbSxjb3JuZXItZnJlcXVlbmNpZXMgPQogCQkJCQkvKiBTcGVlZCBiaW4gMCAqLwpAQCAtNDE3LDcgKzU4MSwxOSBAQAogCQkJCQkxOTk2ODAwMDAwIDIwOTI4MDAwMDAgMjE2OTYwMDAwMAogCQkJCQkyMjQ2NDAwMDAwIDIzMjMyMDAwMDAgMjQwMDAwMDAwMAogCQkJCQkyNDc2ODAwMDAwIDI1NTM2MDAwMDAgMjY0OTYwMDAwMAotCQkJCQkyNzA3MjAwMDAwPjsKKwkJCQkJMjcwNzIwMDAwMD4sCisJCQkJCS8qIFNwZWVkIGJpbiAyICovCisJCQkJCTwzMDAwMDAwMDAgIDQwMzIwMDAwMCAgNDgwMDAwMDAwCisJCQkJCSA1NzYwMDAwMDAgIDY1MjgwMDAwMCAgNzQ4ODAwMDAwCisJCQkJCSA4MjU2MDAwMDAgIDkwMjQwMDAwMCAgOTc5MjAwMDAwCisJCQkJCTEwNTYwMDAwMDAgMTEzMjgwMDAwMCAxMjA5NjAwMDAwCisJCQkJCTEyODY0MDAwMDAgMTM2MzIwMDAwMCAxNDU5MjAwMDAwCisJCQkJCTE1MzYwMDAwMDAgMTYxMjgwMDAwMCAxNjg5NjAwMDAwCisJCQkJCTE3NjY0MDAwMDAgMTg0MzIwMDAwMCAxOTIwMDAwMDAwCisJCQkJCTE5OTY4MDAwMDAgMjA5MjgwMDAwMCAyMTY5NjAwMDAwCisJCQkJCTIyNDY0MDAwMDAgMjMyMzIwMDAwMCAyNDAwMDAwMDAwCisJCQkJCTI0NzY4MDAwMDAgMjU1MzYwMDAwMCAyNjQ5NjAwMDAwCisJCQkJCTI3MDcyMDAwMDAgMjcyNjQwMDAwMCAyNzQ1NjAwMDAwPjsKIAogCQkJCXFjb20sY3ByLXJvLXNjYWxpbmctZmFjdG9yID0KIAkJCQkJPDI4NTcgMzA1NiAyODI4IDI5NTIgMjY5OSAyNzk2IDI0NDcKQEAgLTQzNywyOCArNjEzLDc2IEBACiAJCQkJCSAyMDAzIDE2NzU+OwogCiAJCQkJcWNvbSxjcHItb3Blbi1sb29wLXZvbHRhZ2UtZnVzZS1hZGp1c3RtZW50ID0KLQkJCQkJLyogU3BlZWQgYmluIDAgKi8KLQkJCQkJPCAgODAwMCAgIDgwMDAgICA4MDAwICAgICAgMCAgICAgIDA+LAotCQkJCQkvKiBTcGVlZCBiaW4gMSAqLwotCQkJCQk8ICA4MDAwICAgODAwMCAgIDgwMDAgICAgICAwICAxNjAwMD47CisJCQkJIC8qIFNwZWVkIGJpbiAwICovCisJCQkJIDwgICA4MDAwICAgICA4MDAwICAgICA4MDAwICAgICAgICAwICAgICAgICAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICgtMTUwMDApPiwKKwkJCQkgLyogU3BlZWQgYmluIDEgKi8KKwkJCQkgPCAgIDgwMDAgICAgIDgwMDAgICAgIDgwMDAgICAgICAgIDAgICAgMTYwMDA+LAorCQkJCSA8ICgtNzAwMCkgICgtNzAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC03MDAwKSAgKC03MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtNzAwMCkgICgtNzAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC03MDAwKSAgKC03MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtNzAwMCkgICgtNzAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIC8qIFNwZWVkIGJpbiAyICovCisJCQkJIDwgICA4MDAwICAgICA4MDAwICAgICA4MDAwICAgICAgICAwICAgIDE2MDAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtNzAwMCkgICgtNzAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC03MDAwKSAgKC03MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtNzAwMCkgICgtNzAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC03MDAwKSAgKC03MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTcwMDApICAoLTcwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+OwogCiAJCQkJcWNvbSxjcHItY2xvc2VkLWxvb3Atdm9sdGFnZS1mdXNlLWFkanVzdG1lbnQgPQotCQkJCQkvKiBTcGVlZCBiaW4gMCAqLwotCQkJCQk8ICA2MDAwICAgNjAwMCAgIDgwMDAgICAgICAwICAgICAgMD4sCi0JCQkJCS8qIFNwZWVkIGJpbiAxICovCi0JCQkJCTwgIDYwMDAgICA2MDAwICAgODAwMCAgICAgIDAgIDE2MDAwPjsKKwkJCQkgLyogU3BlZWQgYmluIDAgKi8KKwkJCQkgPCAgIDYwMDAgICAgIDYwMDAgICAgIDgwMDAgICAgICAgIDAgICAgICAgIDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgKC0xNTAwMCk+LAorCQkJCSAvKiBTcGVlZCBiaW4gMSAqLworCQkJCSA8ICAgNjAwMCAgICAgNjAwMCAgICAgODAwMCAgICAgICAgMCAgICAxNjAwMD4sCisJCQkJIDwgKC05MDAwKSAgKC05MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTkwMDApICAoLTkwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC05MDAwKSAgKC05MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTkwMDApICAoLTkwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC05MDAwKSAgKC05MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgLyogU3BlZWQgYmluIDIgKi8KKwkJCQkgPCAgIDYwMDAgICAgIDYwMDAgICAgIDgwMDAgICAgICAgIDAgICAgMTYwMDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC05MDAwKSAgKC05MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTkwMDApICAoLTkwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD4sCisJCQkJIDwgKC05MDAwKSAgKC05MDAwKSAgKC03MDAwKSAoLTE1MDAwKSAgICAxMDAwPiwKKwkJCQkgPCAoLTkwMDApICAoLTkwMDApICAoLTcwMDApICgtMTUwMDApICAgIDEwMDA+LAorCQkJCSA8ICgtOTAwMCkgICgtOTAwMCkgICgtNzAwMCkgKC0xNTAwMCkgICAgMTAwMD47CiAKIAkJCQlxY29tLGFsbG93LXZvbHRhZ2UtaW50ZXJwb2xhdGlvbjsKIAkJCQlxY29tLGFsbG93LXF1b3RpZW50LWludGVycG9sYXRpb247CiAJCQkJcWNvbSxjcHItc2NhbGVkLW9wZW4tbG9vcC12b2x0YWdlLWFzLWNlaWxpbmc7CiAKIAkJCQlxY29tLGNwci1hZ2luZy1tYXgtdm9sdGFnZS1hZGp1c3RtZW50ID0gPDE1MDAwPjsKLQkJCQlxY29tLGNwci1hZ2luZy1yZWYtY29ybmVyID0gPDI3IDMxPjsKKwkJCQlxY29tLGNwci1hZ2luZy1yZWYtY29ybmVyID0gPDI3IDMxIDMzPjsKIAkJCQlxY29tLGNwci1hZ2luZy1yby1zY2FsaW5nLWZhY3RvciA9IDwxNzAwPjsKIAkJCQlxY29tLGFsbG93LWFnaW5nLXZvbHRhZ2UtYWRqdXN0bWVudCA9CiAJCQkJCS8qIFNwZWVkIGJpbiAwICovCiAJCQkJCTwwIDEgMSAxIDEgMSAxIDE+LAogCQkJCQkvKiBTcGVlZCBiaW4gMSAqLworCQkJCQk8MCAxIDEgMSAxIDEgMSAxPiwKKwkJCQkJLyogU3BlZWQgYmluIDIgKi8KIAkJCQkJPDAgMSAxIDEgMSAxIDEgMT47CiAJCQkJcWNvbSxhbGxvdy1hZ2luZy1vcGVuLWxvb3Atdm9sdGFnZS1hZGp1c3RtZW50ID0KIAkJCQkJPDE+OwpAQCAtNDc3LDYgKzcwMSwyMiBAQAogCX07CiB9OwogCismcGlsX21vZGVtIHsKKwlxY29tLG1zc19wZGNfb2Zmc2V0ID0gPDk+OworfTsKKworLyogVkREX0FQQzAgKi8KKyZwbTg5OThfczEzIHsKKwlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw1NjgwMDA+OworCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEwMDAwMDA+OworfTsKKworLyogVkREX0FQQzEgKi8KKyZwbTg5OThfczEyIHsKKwlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw1NjgwMDA+OworCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDExNjAwMDA+OworfTsKKwogJmNsb2NrX2NwdWNjIHsKIAljb21wYXRpYmxlID0gInFjb20sY2xrLWNwdS1vc20tdjIiOwogCkBAIC01MTcsNiArNzU3LDIzIEBACiAJCTwgIDE0OTc2MDAwMDAgMHg0MDNjMGQ0ZSAweDAwMDAzZTNlIDB4MiAxNCA+LAogCQk8ICAxNTkzNjAwMDAwIDB4NDAzYzBlNTMgMHgwMDAwNDI0MiAweDIgMTUgPjsKIAorCXFjb20sbDMtc3BlZWRiaW4yLXYwID0KKwkJPCAgIDMwMDAwMDAwMCAweDAwMGMwMDBmIDB4MDAwMDIwMjAgMHgxIDEgPiwKKwkJPCAgIDQwMzIwMDAwMCAweDUwMGMwMTE1IDB4MDAwMDIwMjAgMHgxIDIgPiwKKwkJPCAgIDQ4MDAwMDAwMCAweDUwMTQwMjE5IDB4MDAwMDIwMjAgMHgxIDMgPiwKKwkJPCAgIDU3NjAwMDAwMCAweDUwMTQwMzFlIDB4MDAwMDIwMjAgMHgxIDQgPiwKKwkJPCAgIDY1MjgwMDAwMCAweDQwMWMwNDIyIDB4MDAwMDIwMjAgMHgxIDUgPiwKKwkJPCAgIDc0ODgwMDAwMCAweDQwMWMwNTI3IDB4MDAwMDIwMjAgMHgxIDYgPiwKKwkJPCAgIDg0NDgwMDAwMCAweDQwMjQwNjJjIDB4MDAwMDIzMjMgMHgyIDcgPiwKKwkJPCAgIDk0MDgwMDAwMCAweDQwMjQwNzMxIDB4MDAwMDI3MjcgMHgyIDggPiwKKwkJPCAgMTAzNjgwMDAwMCAweDQwMjQwODM2IDB4MDAwMDJiMmIgMHgyIDkgPiwKKwkJPCAgMTEzMjgwMDAwMCAweDQwMmMwOTNiIDB4MDAwMDJmMmYgMHgyIDEwID4sCisJCTwgIDEyMDk2MDAwMDAgMHg0MDJjMGEzZiAweDAwMDAzMjMyIDB4MiAxMSA+LAorCQk8ICAxMzA1NjAwMDAwIDB4NDAzNDBiNDQgMHgwMDAwMzYzNiAweDIgMTIgPiwKKwkJPCAgMTQwMTYwMDAwMCAweDQwMzQwYzQ5IDB4MDAwMDNhM2EgMHgyIDEzID4sCisJCTwgIDE0OTc2MDAwMDAgMHg0MDNjMGQ0ZSAweDAwMDAzZTNlIDB4MiAxNCA+LAorCQk8ICAxNTkzNjAwMDAwIDB4NDAzYzBlNTMgMHgwMDAwNDI0MiAweDIgMTUgPjsKKwogCXFjb20scHdyY2wtc3BlZWRiaW4wLXYwID0KIAkJPCAgIDMwMDAwMDAwMCAweDAwMGMwMDBmIDB4MDAwMDIwMjAgMHgxIDEgPiwKIAkJPCAgIDQwMzIwMDAwMCAweDUwMGMwMTE1IDB4MDAwMDIwMjAgMHgxIDIgPiwKQEAgLTU1Nyw2ICs4MTQsMjYgQEAKIAkJPCAgMTY4OTYwMDAwMCAweDQwNDQxMDU4IDB4MDAwMDQ2NDYgMHgyIDE3ID4sCiAJCTwgIDE3NjY0MDAwMDAgMHg0MDQ0MTE1YyAweDAwMDA0YTRhIDB4MiAxOCA+OwogCisJcWNvbSxwd3JjbC1zcGVlZGJpbjItdjAgPQorCQk8ICAgMzAwMDAwMDAwIDB4MDAwYzAwMGYgMHgwMDAwMjAyMCAweDEgMSA+LAorCQk8ICAgNDAzMjAwMDAwIDB4NTAwYzAxMTUgMHgwMDAwMjAyMCAweDEgMiA+LAorCQk8ICAgNDgwMDAwMDAwIDB4NTAxNDAyMTkgMHgwMDAwMjAyMCAweDEgMyA+LAorCQk8ICAgNTc2MDAwMDAwIDB4NTAxNDAzMWUgMHgwMDAwMjAyMCAweDEgNCA+LAorCQk8ICAgNjUyODAwMDAwIDB4NDAxYzA0MjIgMHgwMDAwMjAyMCAweDEgNSA+LAorCQk8ICAgNzQ4ODAwMDAwIDB4NDAxYzA1MjcgMHgwMDAwMjAyMCAweDEgNiA+LAorCQk8ICAgODI1NjAwMDAwIDB4NDAxYzA2MmIgMHgwMDAwMjIyMiAweDEgNyA+LAorCQk8ICAgOTAyNDAwMDAwIDB4NDAyNDA3MmYgMHgwMDAwMjYyNiAweDEgOCA+LAorCQk8ICAgOTc5MjAwMDAwIDB4NDAyNDA4MzMgMHgwMDAwMjkyOSAweDEgOSA+LAorCQk8ICAxMDU2MDAwMDAwIDB4NDAyYzA5MzcgMHgwMDAwMmMyYyAweDIgMTAgPiwKKwkJPCAgMTEzMjgwMDAwMCAweDQwMmMwYTNiIDB4MDAwMDJmMmYgMHgyIDExID4sCisJCTwgIDEyMjg4MDAwMDAgMHg0MDJjMGI0MCAweDAwMDAzMzMzIDB4MiAxMiA+LAorCQk8ICAxMzI0ODAwMDAwIDB4NDAzNDBjNDUgMHgwMDAwMzczNyAweDIgMTMgPiwKKwkJPCAgMTQyMDgwMDAwMCAweDQwMzQwZDRhIDB4MDAwMDNiM2IgMHgyIDE0ID4sCisJCTwgIDE1MTY4MDAwMDAgMHg0MDNjMGU0ZiAweDAwMDAzZjNmIDB4MiAxNSA+LAorCQk8ICAxNjEyODAwMDAwIDB4NDAzYzBmNTQgMHgwMDAwNDM0MyAweDIgMTYgPiwKKwkJPCAgMTY4OTYwMDAwMCAweDQwNDQxMDU4IDB4MDAwMDQ2NDYgMHgyIDE3ID4sCisJCTwgIDE3NjY0MDAwMDAgMHg0MDQ0MTE1YyAweDAwMDA0YTRhIDB4MiAxOCA+OworCiAJcWNvbSxwZXJmY2wtc3BlZWRiaW4wLXYwID0KIAkJPCAgIDMwMDAwMDAwMCAweDAwMGMwMDBmIDB4MDAwMDIwMjAgMHgxIDEgPiwKIAkJPCAgIDQwMzIwMDAwMCAweDUwMGMwMTE1IDB4MDAwMDIwMjAgMHgxIDIgPiwKQEAgLTYxOSwyNiArODk2LDI4MyBAQAogCQk8ICAyNjQ5NjAwMDAwIDB4NDA1NDFkOGEgMHgwMDAwNmU2ZSAweDIgMzAgPiwKIAkJPCAgMjc0NTYwMDAwMCAweDQwNTExZThmIDB4MDAwMDcyNzIgMHgyIDMxID47CiAKKwlxY29tLHBlcmZjbC1zcGVlZGJpbjItdjAgPQorCQk8ICAgMzAwMDAwMDAwIDB4MDAwYzAwMGYgMHgwMDAwMjAyMCAweDEgMSA+LAorCQk8ICAgNDAzMjAwMDAwIDB4NTAwYzAxMTUgMHgwMDAwMjAyMCAweDEgMiA+LAorCQk8ICAgNDgwMDAwMDAwIDB4NTAxNDAyMTkgMHgwMDAwMjAyMCAweDEgMyA+LAorCQk8ICAgNTc2MDAwMDAwIDB4NTAxNDAzMWUgMHgwMDAwMjAyMCAweDEgNCA+LAorCQk8ICAgNjUyODAwMDAwIDB4NDAxYzA0MjIgMHgwMDAwMjAyMCAweDEgNSA+LAorCQk8ICAgNzQ4ODAwMDAwIDB4NDAxYzA1MjcgMHgwMDAwMjAyMCAweDEgNiA+LAorCQk8ICAgODI1NjAwMDAwIDB4NDAxYzA2MmIgMHgwMDAwMjIyMiAweDEgNyA+LAorCQk8ICAgOTAyNDAwMDAwIDB4NDAyNDA3MmYgMHgwMDAwMjYyNiAweDEgOCA+LAorCQk8ICAgOTc5MjAwMDAwIDB4NDAyNDA4MzMgMHgwMDAwMjkyOSAweDEgOSA+LAorCQk8ICAxMDU2MDAwMDAwIDB4NDAyYzA5MzcgMHgwMDAwMmMyYyAweDEgMTAgPiwKKwkJPCAgMTEzMjgwMDAwMCAweDQwMmMwYTNiIDB4MDAwMDJmMmYgMHgxIDExID4sCisJCTwgIDEyMDk2MDAwMDAgMHg0MDJjMGIzZiAweDAwMDAzMjMyIDB4MiAxMiA+LAorCQk8ICAxMjg2NDAwMDAwIDB4NDAzNDBjNDMgMHgwMDAwMzYzNiAweDIgMTMgPiwKKwkJPCAgMTM2MzIwMDAwMCAweDQwMzQwZDQ3IDB4MDAwMDM5MzkgMHgyIDE0ID4sCisJCTwgIDE0NTkyMDAwMDAgMHg0MDNjMGU0YyAweDAwMDAzZDNkIDB4MiAxNSA+LAorCQk8ICAxNTM2MDAwMDAwIDB4NDAzYzBmNTAgMHgwMDAwNDA0MCAweDIgMTYgPiwKKwkJPCAgMTYxMjgwMDAwMCAweDQwM2MxMDU0IDB4MDAwMDQzNDMgMHgyIDE3ID4sCisJCTwgIDE2ODk2MDAwMDAgMHg0MDQ0MTE1OCAweDAwMDA0NjQ2IDB4MiAxOCA+LAorCQk8ICAxNzY2NDAwMDAwIDB4NDA0NDEyNWMgMHgwMDAwNGE0YSAweDIgMTkgPiwKKwkJPCAgMTg0MzIwMDAwMCAweDQwNDQxMzYwIDB4MDAwMDRkNGQgMHgyIDIwID4sCisJCTwgIDE5MjAwMDAwMDAgMHg0MDRjMTQ2NCAweDAwMDA1MDUwIDB4MiAyMSA+LAorCQk8ICAxOTk2ODAwMDAwIDB4NDA0YzE1NjggMHgwMDAwNTM1MyAweDIgMjIgPiwKKwkJPCAgMjA5MjgwMDAwMCAweDQwNTQxNjZkIDB4MDAwMDU3NTcgMHgyIDIzID4sCisJCTwgIDIxNjk2MDAwMDAgMHg0MDU0MTc3MSAweDAwMDA1YTVhIDB4MiAyNCA+LAorCQk8ICAyMjQ2NDAwMDAwIDB4NDA1NDE4NzUgMHgwMDAwNWU1ZSAweDIgMjUgPiwKKwkJPCAgMjMyMzIwMDAwMCAweDQwNTQxOTc5IDB4MDAwMDYxNjEgMHgyIDI2ID4sCisJCTwgIDI0MDAwMDAwMDAgMHg0MDU0MWE3ZCAweDAwMDA2NDY0IDB4MiAyNyA+LAorCQk8ICAyNDc2ODAwMDAwIDB4NDA1NDFiODEgMHgwMDAwNjc2NyAweDIgMjggPiwKKwkJPCAgMjU1MzYwMDAwMCAweDQwNTQxYzg1IDB4MDAwMDZhNmEgMHgyIDI5ID4sCisJCTwgIDI2NDk2MDAwMDAgMHg0MDU0MWQ4YSAweDAwMDA2ZTZlIDB4MiAzMCA+LAorCQk8ICAyNzA3MjAwMDAwIDB4NDA1MTFlOGQgMHgwMDAwNzE3MSAweDIgMzAgPiwKKwkJPCAgMjc2NDgwMDAwMCAweDQwNTExZjkwIDB4MDAwMDczNzMgMHgyIDMxID4sCisJCTwgIDI3ODQwMDAwMDAgMHg0MDUxMjA5MSAweDAwMDA3NDc0IDB4MiAzMiA+LAorCQk8ICAyODAzMjAwMDAwIDB4NDA1MTIxOTIgMHgwMDAwNzU3NSAweDIgMzMgPjsKKwogCXFjb20sbDMtbWVtYWNjLWxldmVsLXZjLWJpbjAgPSA8OCAxMz47CiAJcWNvbSxsMy1tZW1hY2MtbGV2ZWwtdmMtYmluMSA9IDw4IDEzPjsKKwlxY29tLGwzLW1lbWFjYy1sZXZlbC12Yy1iaW4yID0gPDggMTM+OwogCiAJcWNvbSxwd3JjbC1tZW1hY2MtbGV2ZWwtdmMtYmluMCA9IDwxMiAxNj47CiAJcWNvbSxwd3JjbC1tZW1hY2MtbGV2ZWwtdmMtYmluMSA9IDwxMiAxNj47CisJcWNvbSxwd3JjbC1tZW1hY2MtbGV2ZWwtdmMtYmluMiA9IDwxMiAxNj47CiAKIAlxY29tLHBlcmZjbC1tZW1hY2MtbGV2ZWwtdmMtYmluMCA9IDwxNCAyMj47CiAJcWNvbSxwZXJmY2wtbWVtYWNjLWxldmVsLXZjLWJpbjEgPSA8MTQgMjI+OworCXFjb20scGVyZmNsLW1lbWFjYy1sZXZlbC12Yy1iaW4yID0gPDE0IDIyPjsKK307CisKKyZwY2llMSB7CisJcWNvbSxwaHktc2VxdWVuY2UgPSA8MHgxODA0IDB4MDMgMHgwCisJCQkJMHgwMGRjIDB4MjcgMHgwCisJCQkJMHgwMDE0IDB4MDEgMHgwCisJCQkJMHgwMDIwIDB4MzEgMHgwCisJCQkJMHgwMDI0IDB4MDEgMHgwCisJCQkJMHgwMDI4IDB4ZGUgMHgwCisJCQkJMHgwMDJjIDB4MDcgMHgwCisJCQkJMHgwMDM0IDB4NGMgMHgwCisJCQkJMHgwMDM4IDB4MDYgMHgwCisJCQkJMHgwMDU0IDB4MTggMHgwCisJCQkJMHgwMDU4IDB4YjAgMHgwCisJCQkJMHgwMDZjIDB4OGMgMHgwCisJCQkJMHgwMDcwIDB4MjAgMHgwCisJCQkJMHgwMDc4IDB4MTQgMHgwCisJCQkJMHgwMDdjIDB4MzQgMHgwCisJCQkJMHgwMGI0IDB4MDYgMHgwCisJCQkJMHgwMGI4IDB4MDYgMHgwCisJCQkJMHgwMGMwIDB4MTYgMHgwCisJCQkJMHgwMGM0IDB4MTYgMHgwCisJCQkJMHgwMGNjIDB4MzYgMHgwCisJCQkJMHgwMGQwIDB4MzYgMHgwCisJCQkJMHgwMGYwIDB4MDUgMHgwCisJCQkJMHgwMGY4IDB4NDIgMHgwCisJCQkJMHgwMTAwIDB4ODIgMHgwCisJCQkJMHgwMTA4IDB4NjggMHgwCisJCQkJMHgwMTFjIDB4NTUgMHgwCisJCQkJMHgwMTIwIDB4NTUgMHgwCisJCQkJMHgwMTI0IDB4MDMgMHgwCisJCQkJMHgwMTI4IDB4YWIgMHgwCisJCQkJMHgwMTJjIDB4YWEgMHgwCisJCQkJMHgwMTMwIDB4MDIgMHgwCisJCQkJMHgwMTUwIDB4M2YgMHgwCisJCQkJMHgwMTU4IDB4M2YgMHgwCisJCQkJMHgwMTc4IDB4MTAgMHgwCisJCQkJMHgwMWNjIDB4MDQgMHgwCisJCQkJMHgwMWQwIDB4MzAgMHgwCisJCQkJMHgwMWUwIDB4MDQgMHgwCisJCQkJMHgwMWU4IDB4NzMgMHgwCisJCQkJMHgwMWYwIDB4MWMgMHgwCisJCQkJMHgwMWZjIDB4MTUgMHgwCisJCQkJMHgwMjFjIDB4MDQgMHgwCisJCQkJMHgwMjI0IDB4MDEgMHgwCisJCQkJMHgwMjI4IDB4MjIgMHgwCisJCQkJMHgwMjJjIDB4MDAgMHgwCisJCQkJMHgwMDk4IDB4MDUgMHgwCisJCQkJMHgwODBjIDB4MDAgMHgwCisJCQkJMHgwODE4IDB4MGQgMHgwCisJCQkJMHgwODYwIDB4MDEgMHgwCisJCQkJMHgwODY0IDB4M2EgMHgwCisJCQkJMHgwODdjIDB4MmYgMHgwCisJCQkJMHgwOGMwIDB4MDkgMHgwCisJCQkJMHgwOGM0IDB4MDkgMHgwCisJCQkJMHgwOGM4IDB4MWEgMHgwCisJCQkJMHgwOGQwIDB4MDEgMHgwCisJCQkJMHgwOGQ0IDB4MDcgMHgwCisJCQkJMHgwOGQ4IDB4MzEgMHgwCisJCQkJMHgwOGRjIDB4MzEgMHgwCisJCQkJMHgwOGUwIDB4MDMgMHgwCisJCQkJMHgwOGZjIDB4MDIgMHgwCisJCQkJMHgwOTAwIDB4MDEgMHgwCisJCQkJMHgwOTA4IDB4MTIgMHgwCisJCQkJMHgwOTE0IDB4MjUgMHgwCisJCQkJMHgwOTE4IDB4MDAgMHgwCisJCQkJMHgwOTFjIDB4MDUgMHgwCisJCQkJMHgwOTIwIDB4MDEgMHgwCisJCQkJMHgwOTI0IDB4MjYgMHgwCisJCQkJMHgwOTI4IDB4MTIgMHgwCisJCQkJMHgwOTMwIDB4MDQgMHgwCisJCQkJMHgwOTM0IDB4MDQgMHgwCisJCQkJMHgwOTM4IDB4MDkgMHgwCisJCQkJMHgwOTU0IDB4MTUgMHgwCisJCQkJMHgwOTYwIDB4MzIgMHgwCisJCQkJMHgwOTY4IDB4N2YgMHgwCisJCQkJMHgwOTZjIDB4MDcgMHgwCisJCQkJMHgwOTc4IDB4MDQgMHgwCisJCQkJMHgwOTgwIDB4NzAgMHgwCisJCQkJMHgwOTg0IDB4OGIgMHgwCisJCQkJMHgwOTg4IDB4MDggMHgwCisJCQkJMHgwOThjIDB4MDkgMHgwCisJCQkJMHgwOTkwIDB4MDMgMHgwCisJCQkJMHgwOTk0IDB4MDQgMHgwCisJCQkJMHgwOTk4IDB4MDIgMHgwCisJCQkJMHgwOTljIDB4MGMgMHgwCisJCQkJMHgwOWE0IDB4MDIgMHgwCisJCQkJMHgwOWMwIDB4NWMgMHgwCisJCQkJMHgwOWM0IDB4M2UgMHgwCisJCQkJMHgwOWM4IDB4M2YgMHgwCisJCQkJMHgwYTMwIDB4MDEgMHgwCisJCQkJMHgwYTM0IDB4YTAgMHgwCisJCQkJMHgwYTM4IDB4MDggMHgwCisJCQkJMHgwYWE0IDB4MDEgMHgwCisJCQkJMHgwYWFjIDB4YzMgMHgwCisJCQkJMHgwYWIwIDB4MDAgMHgwCisJCQkJMHgwYWI4IDB4OGMgMHgwCisJCQkJMHgwYWMwIDB4N2YgMHgwCisJCQkJMHgwYWM0IDB4MmEgMHgwCisJCQkJMHgwODEwIDB4MGMgMHgwCisJCQkJMHgwODE0IDB4MDAgMHgwCisJCQkJMHgwYWNjIDB4MDQgMHgwCisJCQkJMHgwOTNjIDB4MjAgMHgwCisJCQkJMHgxMDBjIDB4MDAgMHgwCisJCQkJMHgxMDE4IDB4MGQgMHgwCisJCQkJMHgxMDYwIDB4MDEgMHgwCisJCQkJMHgxMDY0IDB4M2EgMHgwCisJCQkJMHgxMDdjIDB4MmYgMHgwCisJCQkJMHgxMGMwIDB4MDkgMHgwCisJCQkJMHgxMGM0IDB4MDkgMHgwCisJCQkJMHgxMGM4IDB4MWEgMHgwCisJCQkJMHgxMGQwIDB4MDEgMHgwCisJCQkJMHgxMGQ0IDB4MDcgMHgwCisJCQkJMHgxMGQ4IDB4MzEgMHgwCisJCQkJMHgxMGRjIDB4MzEgMHgwCisJCQkJMHgxMGUwIDB4MDMgMHgwCisJCQkJMHgxMGZjIDB4MDIgMHgwCisJCQkJMHgxMTAwIDB4MDEgMHgwCisJCQkJMHgxMTA4IDB4MTIgMHgwCisJCQkJMHgxMTE0IDB4MjUgMHgwCisJCQkJMHgxMTE4IDB4MDAgMHgwCisJCQkJMHgxMTFjIDB4MDUgMHgwCisJCQkJMHgxMTIwIDB4MDEgMHgwCisJCQkJMHgxMTI0IDB4MjYgMHgwCisJCQkJMHgxMTI4IDB4MTIgMHgwCisJCQkJMHgxMTMwIDB4MDQgMHgwCisJCQkJMHgxMTM0IDB4MDQgMHgwCisJCQkJMHgxMTM4IDB4MDkgMHgwCisJCQkJMHgxMTU0IDB4MTUgMHgwCisJCQkJMHgxMTYwIDB4MzIgMHgwCisJCQkJMHgxMTY4IDB4N2YgMHgwCisJCQkJMHgxMTZjIDB4MDcgMHgwCisJCQkJMHgxMTc4IDB4MDQgMHgwCisJCQkJMHgxMTgwIDB4NzAgMHgwCisJCQkJMHgxMTg0IDB4OGIgMHgwCisJCQkJMHgxMTg4IDB4MDggMHgwCisJCQkJMHgxMThjIDB4MDkgMHgwCisJCQkJMHgxMTkwIDB4MDMgMHgwCisJCQkJMHgxMTk0IDB4MDQgMHgwCisJCQkJMHgxMTk4IDB4MDIgMHgwCisJCQkJMHgxMTljIDB4MGMgMHgwCisJCQkJMHgxMWE0IDB4MDIgMHgwCisJCQkJMHgxMWMwIDB4NWMgMHgwCisJCQkJMHgxMWM0IDB4M2UgMHgwCisJCQkJMHgxMWM4IDB4M2YgMHgwCisJCQkJMHgxMjMwIDB4MDEgMHgwCisJCQkJMHgxMjM0IDB4YTAgMHgwCisJCQkJMHgxMjM4IDB4MDggMHgwCisJCQkJMHgxMmE0IDB4MDEgMHgwCisJCQkJMHgxMmFjIDB4YzMgMHgwCisJCQkJMHgxMmIwIDB4MDAgMHgwCisJCQkJMHgxMmI4IDB4OGMgMHgwCisJCQkJMHgxMmMwIDB4N2YgMHgwCisJCQkJMHgxMmM0IDB4MmEgMHgwCisJCQkJMHgxMDEwIDB4MGMgMHgwCisJCQkJMHgxMDE0IDB4MGYgMHgwCisJCQkJMHgxMmNjIDB4MDQgMHgwCisJCQkJMHgxMTNjIDB4MjAgMHgwCisJCQkJMHgxOTVjIDB4M2YgMHgwCisJCQkJMHgxOTc0IDB4NTAgMHgwCisJCQkJMHgxOTZjIDB4OWYgMHgwCisJCQkJMHgxODJjIDB4MTkgMHgwCisJCQkJMHgxODQwIDB4MDcgMHgwCisJCQkJMHgxODU0IDB4MTcgMHgwCisJCQkJMHgxODY4IDB4MDkgMHgwCisJCQkJMHgxODAwIDB4MDAgMHgwCisJCQkJMHgwYWE4IDB4MDEgMHgwCisJCQkJMHgxMmE4IDB4MDEgMHgwCisJCQkJMHgxODA4IDB4MDEgMHgwPjsKK307CisKKyZkZXZmcmVxX2wzbGF0XzAgeworCXFjb20sY29yZS1kZXYtdGFibGUgPQorCQk8ICAzMDAwMDAgIDMwMDAwMDAwMCA+LAorCQk8ICA0ODAwMDAgIDQwMzIwMDAwMCA+LAorCQk8ICA2NTI4MDAgIDQ4MDAwMDAwMCA+LAorCQk8ICA3NDg4MDAgIDU3NjAwMDAwMCA+LAorCQk8ICA5MDI0MDAgIDY1MjgwMDAwMCA+LAorCQk8ICA5NzkyMDAgIDc0ODgwMDAwMCA+LAorCQk8IDExMzI4MDAgIDg0NDgwMDAwMCA+LAorCQk8IDEyMjg4MDAgIDk0MDgwMDAwMCA+LAorCQk8IDEzMjQ4MDAgMTAzNjgwMDAwMCA+LAorCQk8IDE0MjA4MDAgMTEzMjgwMDAwMCA+LAorCQk8IDE1MTY4MDAgMTIwOTYwMDAwMCA+LAorCQk8IDE2MTI4MDAgMTQwMTYwMDAwMCA+LAorCQk8IDE2ODk2MDAgMTQ5NzYwMDAwMCA+LAorCQk8IDE3NjY0MDAgMTU5MzYwMDAwMCA+OworfTsKKworJmRldmZyZXFfbDNsYXRfNCB7CisJcWNvbSxjb3JlLWRldi10YWJsZSA9CisJCTwgIDMwMDAwMCAgMzAwMDAwMDAwID4sCisJCTwgIDgyNTYwMCAgNTc2MDAwMDAwID4sCisJCTwgMTEzMjgwMCAgNzQ4ODAwMDAwID4sCisJCTwgMTM2MzIwMCAgOTQwODAwMDAwID4sCisJCTwgMTY4OTYwMCAxMjA5NjAwMDAwID4sCisJCTwgMTk5NjgwMCAxNDAxNjAwMDAwID4sCisJCTwgMjQwMDAwMCAxNTkzNjAwMDAwID47CiB9OwogCiAmYndtb24gewogCXFjb20sY291bnQtdW5pdCA9IDwweDEwMDAwPjsKIH07CiAKKyZjcHVidyB7CisJcWNvbSxidy10YmwgPQorCQk8IE1IWl9UT19NQlBTKDE1MCwgMTYpID4sIC8qICAyMjg4IE1CL3MgKi8KKwkJPCBNSFpfVE9fTUJQUygzMDAsIDE2KSA+LCAvKiAgNDU3NyBNQi9zICovCisJCTwgTUhaX1RPX01CUFMoNDI2LCAxNikgPiwgLyogIDY1MDAgTUIvcyAqLworCQk8IE1IWl9UT19NQlBTKDUzMywgMTYpID4sIC8qICA4MTMyIE1CL3MgKi8KKwkJPCBNSFpfVE9fTUJQUyg2MDAsIDE2KSA+LCAvKiAgOTE1NSBNQi9zICovCisJCTwgTUhaX1RPX01CUFMoODA2LCAxNikgPiwgLyogMTIyOTggTUIvcyAqLworCQk8IE1IWl9UT19NQlBTKDkzMywgMTYpID47IC8qIDE0MjM2IE1CL3MgKi8KK307CisKKyZkZXZmcmVxX2NwdWZyZXEgeworCW1pbmNwdWJ3LWNwdWZyZXEgeworCQljcHUtdG8tZGV2LW1hcC00ID0KKwkJCTwgMTg4MTYwMCBNSFpfVE9fTUJQUygyMDAsIDQpID4sCisJCQk8IDI0MDAwMDAgTUhaX1RPX01CUFMoNjgxLCA0KSA+OworCX07Cit9OworCiAmY2xvY2tfZ2NjIHsKIAljb21wYXRpYmxlID0gInFjb20sZ2NjLXNkbTg0NS12MiIsICJzeXNjb24iOwogfTsKIAogJmNsb2NrX2NhbWNjIHsKIAljb21wYXRpYmxlID0gInFjb20sY2FtX2NjLXNkbTg0NS12MiIsICJzeXNjb24iOworCXFjb20sY2FtX2NjX2NzaTNwaHl0aW1lcl9jbGtfc3JjLW9wcC1oYW5kbGUgPSA8JmNhbV9jc2lwaHkzPjsKIH07CiAKICZjbG9ja19kaXNwY2MgewpAQCAtNjc1LDE1ICsxMjA5LDY0IEBACiAKICZtZHNzX21kcCB7CiAJY2xvY2stbWF4LXJhdGUgPSA8MCAwIDAgMCA0MzAwMDAwMDAgMTkyMDAwMDAgMD47CisJcWNvbSxzZGUtbWluLWNvcmUtaWIta2JwcyA9IDw0ODAwMDAwPjsKK307CisKKyZtZHNzX2RzaTAgeworCXFjb20sY29yZS1zdXBwbHktZW50cmllcyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlxY29tLGNvcmUtc3VwcGx5LWVudHJ5QDAgeworCQkJcmVnID0gPDA+OworCQkJcWNvbSxzdXBwbHktbmFtZSA9ICJyZWZnZW4iOworCQkJcWNvbSxzdXBwbHktbWluLXZvbHRhZ2UgPSA8MD47CisJCQlxY29tLHN1cHBseS1tYXgtdm9sdGFnZSA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LWVuYWJsZS1sb2FkID0gPDA+OworCQkJcWNvbSxzdXBwbHktZGlzYWJsZS1sb2FkID0gPDA+OworCQl9OworCX07Cit9OworCismbWRzc19kc2kxIHsKKwlxY29tLGNvcmUtc3VwcGx5LWVudHJpZXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJcWNvbSxjb3JlLXN1cHBseS1lbnRyeUAwIHsKKwkJCXJlZyA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LW5hbWUgPSAicmVmZ2VuIjsKKwkJCXFjb20sc3VwcGx5LW1pbi12b2x0YWdlID0gPDA+OworCQkJcWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UgPSA8MD47CisJCQlxY29tLHN1cHBseS1lbmFibGUtbG9hZCA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LWRpc2FibGUtbG9hZCA9IDwwPjsKKwkJfTsKKwl9OworfTsKKworJnNkZV9kcCB7CisJcWNvbSxjb3JlLXN1cHBseS1lbnRyaWVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCXFjb20sY29yZS1zdXBwbHktZW50cnlAMCB7CisJCQlyZWcgPSA8MD47CisJCQlxY29tLHN1cHBseS1uYW1lID0gInJlZmdlbiI7CisJCQlxY29tLHN1cHBseS1taW4tdm9sdGFnZSA9IDwwPjsKKwkJCXFjb20sc3VwcGx5LW1heC12b2x0YWdlID0gPDA+OworCQkJcWNvbSxzdXBwbHktZW5hYmxlLWxvYWQgPSA8MD47CisJCQlxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQgPSA8MD47CisJCX07CisJfTsKIH07CiAKICZlbmVyZ3lfY29zdHMgewogCUNQVV9DT1NUXzA6IGNvcmUtY29zdDAgewogCQlidXN5LWNvc3QtZGF0YSA9IDwKLQkJCSAzMDAwMDAgMTEKKwkJCSAzMDAwMDAgMTIKIAkJCSA0MDMyMDAgMTcKIAkJCSA0ODAwMDAgMjEKLQkJCSA1NzYwMDAgMjYKKwkJCSA1NzYwMDAgMjcKIAkJCSA2NTI4MDAgMzEKIAkJCSA3NDg4MDAgMzcKIAkJCSA4MjU2MDAgNDIKQEAgLTY5MSwxMyArMTI3NCwxMyBAQAogCQkJIDk3OTIwMCA1MgogCQkJMTA1NjAwMCA1NwogCQkJMTEzMjgwMCA2MgotCQkJMTIyODgwMCA2OQorCQkJMTIyODgwMCA3MAogCQkJMTMyNDgwMCA3OAogCQkJMTQyMDgwMCA4OQogCQkJMTUxNjgwMCAxMDMKIAkJCTE2MTI4MDAgMTIyCi0JCQkxNjg5NjAwIDE0MAotCQkJMTc2NjQwMCAxNTkKKwkJCTE2ODk2MDAgMTQxCisJCQkxNzY2NDAwIDE2MAogCQk+OwogCQlpZGxlLWNvc3QtZGF0YSA9IDwKIAkJCTIyIDE4IDE0IDEyCkBAIC03MDUsMzcgKzEyODgsMzcgQEAKIAl9OwogCUNQVV9DT1NUXzE6IGNvcmUtY29zdDEgewogCQlidXN5LWNvc3QtZGF0YSA9IDwKLQkJCSAzMDAwMDAgMTMwCi0JCQkgNDAzMjAwIDQ4MAotCQkJIDQ4MDAwMCA3MzAKLQkJCSA1NzYwMDAgMTAzMAotCQkJIDY1MjgwMCAxMjYwCi0JCQkgNzQ4ODAwIDE1MzAKLQkJCSA4MjU2MDAgMTc0MAotCQkJIDkwMjQwMCAxOTMwCi0JCQkgOTc5MjAwIDIxMTAKLQkJCTEwNTYwMDAgMjI5MAotCQkJMTEzMjgwMCAyNDYwCi0JCQkxMjA5NjAwIDI2MzAKLQkJCTEyODY0MDAgMjgwMAotCQkJMTM2MzIwMCAyOTgwCi0JCQkxNDU5MjAwIDMyNDAKLQkJCTE1MzYwMDAgMzQ5MAotCQkJMTYxMjgwMCAzNzgwCi0JCQkxNjg5NjAwIDQxMjAKLQkJCTE3NjY0MDAgNDUzMAotCQkJMTg0MzIwMCA1MDIwCi0JCQkxOTIwMDAwIDU1OTAKLQkJCTE5OTY4MDAgNjIzMAorCQkJIDMwMDAwMCAxODkKKwkJCSA0MDMyMDAgNTIzCisJCQkgNDgwMDAwIDc2MworCQkJIDU3NjAwMCAxMDUyCisJCQkgNjUyODAwIDEyNzMKKwkJCSA3NDg4MDAgMTUzNgorCQkJIDgyNTYwMCAxNzM2CisJCQkgOTAyNDAwIDE5MjYKKwkJCSA5NzkyMDAgMjEwOAorCQkJMTA1NjAwMCAyMjg0CisJCQkxMTMyODAwIDI0NTYKKwkJCTEyMDk2MDAgMjYyOAorCQkJMTI4NjQwMCAyODA0CisJCQkxMzYzMjAwIDI5OTIKKwkJCTE0NTkyMDAgMzI1NQorCQkJMTUzNjAwMCAzNDk5CisJCQkxNjEyODAwIDM3ODYKKwkJCTE2ODk2MDAgNDEyOAorCQkJMTc2NjQwMCA0NTM1CisJCQkxODQzMjAwIDUwMTkKKwkJCTE5MjAwMDAgNTU4MworCQkJMTk5NjgwMCA2MjI2CiAJCQkyMDkyODAwIDcxMjAKLQkJCTIxNjk2MDAgNzg3MAotCQkJMjI0NjQwMCA4NjIwCi0JCQkyMzIzMjAwIDkzMzAKKwkJCTIxNjk2MDAgNzg3NgorCQkJMjI0NjQwMCA4NjI4CisJCQkyMzIzMjAwIDkzNDQKIAkJCTI0MDAwMDAgMTAwMzAKLQkJCTI0NzY4MDAgMTA4MzAKLQkJCTI1NTM2MDAgMTIwODAKLQkJCTI2MzA0MDAgMTQ1ODAKLQkJCTI3MDcyMDAgMTk5NjAKKwkJCTI0NzY4MDAgMTA4MDYKKwkJCTI1NTM2MDAgMTIwNDUKKwkJCTI2NDk2MDAgMTU2ODYKKwkJCTI3NDU2MDAgMjU1ODYKIAkJPjsKIAkJaWRsZS1jb3N0LWRhdGEgPSA8CiAJCQkxMDAgODAgNjAgNDAKQEAgLTc5Nyw4ICsxMzgwLDggQEAKIAkJCTI0MDAwMDAgMTM1CiAJCQkyNDc2ODAwIDE0MAogCQkJMjU1MzYwMCAxNDUKLQkJCTI2MzA0MDAgMTUwCi0JCQkyNzA3MjAwIDE1NQorCQkJMjY0OTYwMCAxNTAKKwkJCTI3NDU2MDAgMTU1CiAJCT47CiAJCWlkbGUtY29zdC1kYXRhID0gPAogCQkJNCAzIDIgMQpAQCAtODE2LDcgKzEzOTksNyBAQAogJm1zbV9ncHUgewogCS8qIFVwZGF0ZWQgY2hpcCBJRCAqLwogCXFjb20sY2hpcGlkID0gPDB4MDYwMzAwMDE+OwotCXFjb20saW5pdGlhbC1wd3JsZXZlbCA9IDw1PjsKKwlxY29tLGluaXRpYWwtcHdybGV2ZWwgPSA8Nj47CiAKIAlxY29tLGdwdS1wd3JsZXZlbHMgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKQEAgLTgyNiw1NCArMTQwOSw2MiBAQAogCiAJCXFjb20sZ3B1LXB3cmxldmVsQDAgewogCQkJcmVnID0gPDA+OworCQkJcWNvbSxncHUtZnJlcSA9IDw3MTAwMDAwMDA+OworCQkJcWNvbSxidXMtZnJlcSA9IDwxMj47CisJCQlxY29tLGJ1cy1taW4gPSA8MTI+OworCQkJcWNvbSxidXMtbWF4ID0gPDEyPjsKKwkJfTsKKworCQlxY29tLGdwdS1wd3JsZXZlbEAxIHsKKwkJCXJlZyA9IDwxPjsKIAkJCXFjb20sZ3B1LWZyZXEgPSA8Njc1MDAwMDAwPjsKIAkJCXFjb20sYnVzLWZyZXEgPSA8MTI+OwogCQkJcWNvbSxidXMtbWluID0gPDEwPjsKIAkJCXFjb20sYnVzLW1heCA9IDwxMj47CiAJCX07CiAKLQkJcWNvbSxncHUtcHdybGV2ZWxAMSB7Ci0JCQlyZWcgPSA8MT47CisJCXFjb20sZ3B1LXB3cmxldmVsQDIgeworCQkJcmVnID0gPDI+OwogCQkJcWNvbSxncHUtZnJlcSA9IDw1OTYwMDAwMDA+OwogCQkJcWNvbSxidXMtZnJlcSA9IDwxMD47CiAJCQlxY29tLGJ1cy1taW4gPSA8OT47Ci0JCQlxY29tLGJ1cy1tYXggPSA8MTE+OworCQkJcWNvbSxidXMtbWF4ID0gPDEyPjsKIAkJfTsKIAotCQlxY29tLGdwdS1wd3JsZXZlbEAyIHsKLQkJCXJlZyA9IDwyPjsKKwkJcWNvbSxncHUtcHdybGV2ZWxAMyB7CisJCQlyZWcgPSA8Mz47CiAJCQlxY29tLGdwdS1mcmVxID0gPDUyMDAwMDAwMD47CiAJCQlxY29tLGJ1cy1mcmVxID0gPDk+OwogCQkJcWNvbSxidXMtbWluID0gPDg+OwogCQkJcWNvbSxidXMtbWF4ID0gPDEwPjsKIAkJfTsKIAotCQlxY29tLGdwdS1wd3JsZXZlbEAzIHsKLQkJCXJlZyA9IDwzPjsKKwkJcWNvbSxncHUtcHdybGV2ZWxANCB7CisJCQlyZWcgPSA8ND47CiAJCQlxY29tLGdwdS1mcmVxID0gPDQxNDAwMDAwMD47CiAJCQlxY29tLGJ1cy1mcmVxID0gPDg+OwogCQkJcWNvbSxidXMtbWluID0gPDc+OwogCQkJcWNvbSxidXMtbWF4ID0gPDk+OwogCQl9OwogCi0JCXFjb20sZ3B1LXB3cmxldmVsQDQgewotCQkJcmVnID0gPDQ+OworCQlxY29tLGdwdS1wd3JsZXZlbEA1IHsKKwkJCXJlZyA9IDw1PjsKIAkJCXFjb20sZ3B1LWZyZXEgPSA8MzQyMDAwMDAwPjsKIAkJCXFjb20sYnVzLWZyZXEgPSA8Nj47CiAJCQlxY29tLGJ1cy1taW4gPSA8NT47CiAJCQlxY29tLGJ1cy1tYXggPSA8Nz47CiAJCX07CiAKLQkJcWNvbSxncHUtcHdybGV2ZWxANSB7Ci0JCQlyZWcgPSA8NT47CisJCXFjb20sZ3B1LXB3cmxldmVsQDYgeworCQkJcmVnID0gPDY+OwogCQkJcWNvbSxncHUtZnJlcSA9IDwyNTcwMDAwMDA+OwogCQkJcWNvbSxidXMtZnJlcSA9IDw0PjsKIAkJCXFjb20sYnVzLW1pbiA9IDwzPjsKIAkJCXFjb20sYnVzLW1heCA9IDw1PjsKIAkJfTsKIAotCQlxY29tLGdwdS1wd3JsZXZlbEA2IHsKLQkJCXJlZyA9IDw2PjsKKwkJcWNvbSxncHUtcHdybGV2ZWxANyB7CisJCQlyZWcgPSA8Nz47CiAJCQlxY29tLGdwdS1mcmVxID0gPDA+OwogCQkJcWNvbSxidXMtZnJlcSA9IDwwPjsKIAkJCXFjb20sYnVzLW1pbiA9IDwwPjsKQEAgLTg4OSw5ICsxNDgwLDEwIEBACiAKIAkJY29tcGF0aWJsZSA9ICJxY29tLGdtdS1wd3JsZXZlbHMiOwogCisJCS8qIEdNVSBwb3dlciBsZXZlbHMgbXVzdCBnbyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0ICovCiAJCXFjb20sZ211LXB3cmxldmVsQDAgewogCQkJcmVnID0gPDA+OwotCQkJcWNvbSxnbXUtZnJlcSA9IDw1MDAwMDAwMDA+OworCQkJcWNvbSxnbXUtZnJlcSA9IDwwPjsKIAkJfTsKIAogCQlxY29tLGdtdS1wd3JsZXZlbEAxIHsKQEAgLTkwMSw3ICsxNDkzLDMwIEBACiAKIAkJcWNvbSxnbXUtcHdybGV2ZWxAMiB7CiAJCQlyZWcgPSA8Mj47Ci0JCQlxY29tLGdtdS1mcmVxID0gPDA+OworCQkJcWNvbSxnbXUtZnJlcSA9IDw1MDAwMDAwMDA+OwogCQl9OwogCX07CiB9OworCismcXVzYl9waHkwIHsKKwkJcWNvbSxxdXNiLXBoeS1pbml0LXNlcSA9CisJCQkvKiA8dmFsdWUgcmVnX29mZnNldD4gKi8KKwkJCSAgIDwweDIzIDB4MjEwIC8qIFBXUl9DVFJMMSAqLworCQkJICAgIDB4MDMgMHgwNCAgLyogUExMX0FOQUxPR19DT05UUk9MU19UV08gKi8KKwkJCSAgICAweDdjIDB4MThjIC8qIFBMTF9DTE9DS19JTlZFUlRFUlMgKi8KKwkJCSAgICAweDgwIDB4MmMgIC8qIFBMTF9DTU9ERSAqLworCQkJICAgIDB4MGEgMHgxODQgLyogUExMX0xPQ0tfREVMQVkgKi8KKwkJCSAgICAweDE5IDB4YjQgIC8qIFBMTF9ESUdJVEFMX1RJTUVSU19UV08gKi8KKwkJCSAgICAweDQwIDB4MTk0IC8qIFBMTF9CSUFTX0NPTlRST0xfMSAqLworCQkJICAgIDB4MjAgMHgxOTggLyogUExMX0JJQVNfQ09OVFJPTF8yICovCisJCQkgICAgMHgyMSAweDIxNCAvKiBQV1JfQ1RSTDIgKi8KKwkJCSAgICAweDA3IDB4MjIwIC8qIElNUF9DVFJMMSAqLworCQkJICAgIDB4NTggMHgyMjQgLyogSU1QX0NUUkwyICovCisJCQkgICAgMHg0NSAweDI0MCAvKiBUVU5FMSAqLworCQkJICAgIDB4MjkgMHgyNDQgLyogVFVORTIgKi8KKwkJCSAgICAweGNhIDB4MjQ4IC8qIFRVTkUzICovCisJCQkgICAgMHgwNCAweDI0YyAvKiBUVU5FNCAqLworCQkJICAgIDB4MDMgMHgyNTAgLyogVFVORTUgKi8KKwkJCSAgICAweDAwIDB4MjNjIC8qIENIR19DVFJMMiAqLworCQkJICAgIDB4MjIgMHgyMTA+OyAvKiBQV1JfQ1RSTDEgKi8KK307CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc2RtODQ1LmR0c2kKaW5kZXggNDM2NmQ5MS4uOWVhNTQ2OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NkbTg0NS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zZG04NDUuZHRzaQpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3RoZXJtYWwvdGhlcm1hbC5oPgogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL21zbS9tc20tYnVzLWlkcy5oPgogCisjZGVmaW5lIE1IWl9UT19NQlBTKG1oeiwgdykgKChtaHogKiAxMDAwMDAwICogdykgLyAoMTAyNCAqIDEwMjQpKQorCiAvIHsKIAltb2RlbCA9ICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gU0RNODQ1IjsKIAljb21wYXRpYmxlID0gInFjb20sc2RtODQ1IjsKQEAgLTM0LDggKzM2LDggQEAKIAogCWFsaWFzZXMgewogCQl1ZnNoYzEgPSAmdWZzaGNfbWVtOyAvKiBFbWJlZGRlZCBVRlMgc2xvdCAqLwotCQl1ZnNoYzIgPSAmdWZzaGNfY2FyZDsgLyogUmVtb3ZhYmxlIFVGUyBzbG90ICovCiAJCXBjaS1kb21haW4wID0gJnBjaWUwOworCQlwY2ktZG9tYWluMSA9ICZwY2llMTsKIAkJc2RoYzIgPSAmc2RoY18yOyAvKiBTREMyIFNEIGNhcmQgc2xvdCAqLwogCX07CiAKQEAgLTY0Niw2ICs2NDgsOTQgQEAKIAlyYW5nZXMgPSA8MCAwIDAgMHhmZmZmZmZmZj47CiAJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKIAorCWp0YWdfbW0wOiBqdGFnbW1ANzA0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3MDQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVMD47CisJfTsKKworCWp0YWdfbW0xOiBqdGFnbW1ANzE0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3MTQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVMT47CisJfTsKKworCWp0YWdfbW0yOiBqdGFnbW1ANzI0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3MjQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVMj47CisJfTsKKworCWp0YWdfbW0zOiBqdGFnbW1ANzM0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3MzQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVMz47CisJfTsKKworCWp0YWdfbW00OiBqdGFnbW1ANzQ0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3NDQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVND47CisJfTsKKworCWp0YWdfbW01OiBqdGFnbW1ANzU0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3NTQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVNT47CisJfTsKKworCWp0YWdfbW02OiBqdGFnbW1ANzY0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3NjQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVNj47CisJfTsKKworCWp0YWdfbW03OiBqdGFnbW1ANzc0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxqdGFndjgtbW0iOworCQlyZWcgPSA8MHg3NzQwMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJldG0tYmFzZSI7CisKKwkJY2xvY2tzID0gPCZjbG9ja19hb3AgUURTU19DTEs+OworCQljbG9jay1uYW1lcyA9ICJjb3JlX2NsayI7CisKKwkJcWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSA9IDwmQ1BVNz47CisJfTsKKwogCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDE3YTAwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sZ2ljLXYzIjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKQEAgLTc1Niw2ICs4NDYsNyBAQAogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKIAkJY2VsbC1pbmRleCA9IDwwPjsKKwkJcWNvbSxlbmFibGUtYWhiLWJ1cy13b3JrYXJvdW5kOwogCX07CiAKIAlzcG1pX2RlYnVnX2J1czogcWNvbSxzcG1pLWRlYnVnQDZiMjIwMDAgewpAQCAtODI0LDEyICs5MTUsMTIgQEAKIAkJCTxNU01fQlVTX01BU1RFUl9BTVBTU19NMCBNU01fQlVTX1NMQVZFX0xMQ0M+OwogCQlxY29tLGFjdGl2ZS1vbmx5OwogCQlxY29tLGJ3LXRibCA9Ci0JCQk8ICAyMjg4IC8qIDE1MCBNSHogKi8gPiwKLQkJCTwgIDQ1NzcgLyogMzAwIE1IeiAqLyA+LAotCQkJPCAgNjUwMCAvKiA0MjYgTUh6ICovID4sCi0JCQk8ICA4MTMyIC8qIDUzMyBNSHogKi8gPiwKLQkJCTwgIDkxNTUgLyogNjAwIE1IeiAqLyA+LAotCQkJPCAxMDY4MSAvKiA3MDAgTUh6ICovID47CisJCQk8IE1IWl9UT19NQlBTKDE1MCwgMTYpID4sIC8qICAyMjg4IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMzAwLCAxNikgPiwgLyogIDQ1NzcgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyg0MjYsIDE2KSA+LCAvKiAgNjUwMCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDUzMywgMTYpID4sIC8qICA4MTMyIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoNjAwLCAxNikgPiwgLyogIDkxNTUgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyg3MDAsIDE2KSA+OyAvKiAxMDY4MSBNQi9zICovCiAJfTsKIAogCWJ3bW9uOiBxY29tLGNwdS1id21vbiB7CkBAIC04NDQsMjEgKzkzNSwyMSBAQAogCiAJbGxjY2J3OiBxY29tLGxsY2NidyB7CiAJCWNvbXBhdGlibGUgPSAicWNvbSxkZXZidyI7Ci0JCWdvdmVybm9yID0gInBvd2Vyc2F2ZSI7CisJCWdvdmVybm9yID0gInBlcmZvcm1hbmNlIjsKIAkJcWNvbSxzcmMtZHN0LXBvcnRzID0KIAkJCTxNU01fQlVTX01BU1RFUl9MTENDIE1TTV9CVVNfU0xBVkVfRUJJX0NIMD47CiAJCXFjb20sYWN0aXZlLW9ubHk7CiAJCXFjb20sYnctdGJsID0KLQkJCTwgIDc2MiAvKiAgMjAwIE1IeiAqLyA+LAotCQkJPCAxMTQ0IC8qICAzMDAgTUh6ICovID4sCi0JCQk8IDE3MjAgLyogIDQ1MSBNSHogKi8gPiwKLQkJCTwgMjA4NiAvKiAgNTQ3IE1IeiAqLyA+LAotCQkJPCAyNTk3IC8qICA2ODEgTUh6ICovID4sCi0JCQk8IDI5MjkgLyogIDc2OCBNSHogKi8gPiwKLQkJCTwgMzg3OSAvKiAxMDE3IE1IeiAqLyA+LAotCQkJPCA0OTQzIC8qIDEyOTYgTUh6ICovID4sCi0JCQk8IDU5MzEgLyogMTU1NSBNSHogKi8gPiwKLQkJCTwgNjg4MSAvKiAxODA0IE1IeiAqLyA+OworCQkJPCBNSFpfVE9fTUJQUyggMjAwLCA0KSA+LCAvKiA3NjIgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggMzAwLCA0KSA+LCAvKiAxMTQ0IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDQ1MSwgNCkgPiwgLyogMTcyMCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA1NDcsIDQpID4sIC8qIDIwODYgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNjgxLCA0KSA+LCAvKiAyNTk3IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDc2OCwgNCkgPiwgLyogMjkyOSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDEwMTcsIDQpID4sIC8qIDM4NzkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMjk2LCA0KSA+LCAvKiA0OTQzIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTU1NSwgNCkgPiwgLyogNTkzMSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE4MDQsIDQpID47IC8qIDY4ODEgTUIvcyAqLwogCX07CiAKIAlsbGNjX2J3bW9uOiBxY29tLGxsY2MtYndtb24gewpAQCAtODc5LDE2ICs5NzAsMTYgQEAKIAkJcWNvbSxzcmMtZHN0LXBvcnRzID0gPDEgNTEyPjsKIAkJcWNvbSxhY3RpdmUtb25seTsKIAkJcWNvbSxidy10YmwgPQotCQkJPCAgNzYyIC8qICAyMDAgTUh6ICovID4sCi0JCQk8IDExNDQgLyogIDMwMCBNSHogKi8gPiwKLQkJCTwgMTcyMCAvKiAgNDUxIE1IeiAqLyA+LAotCQkJPCAyMDg2IC8qICA1NDcgTUh6ICovID4sCi0JCQk8IDI1OTcgLyogIDY4MSBNSHogKi8gPiwKLQkJCTwgMjkyOSAvKiAgNzY4IE1IeiAqLyA+LAotCQkJPCAzODc5IC8qIDEwMTcgTUh6ICovID4sCi0JCQk8IDQ5NDMgLyogMTI5NiBNSHogKi8gPiwKLQkJCTwgNTkzMSAvKiAxNTU1IE1IeiAqLyA+LAotCQkJPCA2ODgxIC8qIDE4MDQgTUh6ICovID47CisJCQk8IE1IWl9UT19NQlBTKCAyMDAsIDQpID4sIC8qIDc2MiBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCAzMDAsIDQpID4sIC8qIDExNDQgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNDUxLCA0KSA+LCAvKiAxNzIwIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDU0NywgNCkgPiwgLyogMjA4NiBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA2ODEsIDQpID4sIC8qIDI1OTcgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNzY4LCA0KSA+LCAvKiAyOTI5IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTAxNywgNCkgPiwgLyogMzg3OSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDEyOTYsIDQpID4sIC8qIDQ5NDMgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxNTU1LCA0KSA+LCAvKiA1OTMxIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTgwNCwgNCkgPjsgLyogNjg4MSBNQi9zICovCiAJfTsKIAogCW1lbWxhdF9jcHU0OiBxY29tLG1lbWxhdC1jcHU0IHsKQEAgLTg5OCwxNiArOTg5LDE2IEBACiAJCXFjb20sYWN0aXZlLW9ubHk7CiAJCXN0YXR1cyA9ICJvayI7CiAJCXFjb20sYnctdGJsID0KLQkJCTwgIDc2MiAvKiAgMjAwIE1IeiAqLyA+LAotCQkJPCAxMTQ0IC8qICAzMDAgTUh6ICovID4sCi0JCQk8IDE3MjAgLyogIDQ1MSBNSHogKi8gPiwKLQkJCTwgMjA4NiAvKiAgNTQ3IE1IeiAqLyA+LAotCQkJPCAyNTk3IC8qICA2ODEgTUh6ICovID4sCi0JCQk8IDI5MjkgLyogIDc2OCBNSHogKi8gPiwKLQkJCTwgMzg3OSAvKiAxMDE3IE1IeiAqLyA+LAotCQkJPCA0OTQzIC8qIDEyOTYgTUh6ICovID4sCi0JCQk8IDU5MzEgLyogMTU1NSBNSHogKi8gPiwKLQkJCTwgNjg4MSAvKiAxODA0IE1IeiAqLyA+OworCQkJPCBNSFpfVE9fTUJQUyggMjAwLCA0KSA+LCAvKiA3NjIgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggMzAwLCA0KSA+LCAvKiAxMTQ0IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDQ1MSwgNCkgPiwgLyogMTcyMCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA1NDcsIDQpID4sIC8qIDIwODYgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNjgxLCA0KSA+LCAvKiAyNTk3IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDc2OCwgNCkgPiwgLyogMjkyOSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDEwMTcsIDQpID4sIC8qIDM4NzkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMjk2LCA0KSA+LCAvKiA0OTQzIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTU1NSwgNCkgPiwgLyogNTkzMSBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE4MDQsIDQpID47IC8qIDY4ODEgTUIvcyAqLwogCX07CiAKIAlzbm9jX2Nub2Nfa2VlcGFsaXZlOiBxY29tLHNub2NfY25vY19rZWVwYWxpdmUgewpAQCAtOTI2LDExICsxMDE3LDExIEBACiAJCXFjb20sdGFyZ2V0LWRldiA9IDwmbWVtbGF0X2NwdTA+OwogCQlxY29tLGNhY2hlbWlzcy1ldiA9IDwweDJBPjsKIAkJcWNvbSxjb3JlLWRldi10YWJsZSA9Ci0JCQk8ICAzMDAwMDAgIDc2MiA+LAotCQkJPCAgNzQ4ODAwIDE3MjAgPiwKLQkJCTwgMTEzMjgwMCAyMDg2ID4sCi0JCQk8IDE0NDAwMDAgMjkyOSA+LAotCQkJPCAxNTkzNjAwIDM4NzkgPjsKKwkJCTwgIDMwMDAwMCBNSFpfVE9fTUJQUyggMjAwLCA0KSA+LAorCQkJPCAgNzQ4ODAwIE1IWl9UT19NQlBTKCA0NTEsIDQpID4sCisJCQk8IDExMzI4MDAgTUhaX1RPX01CUFMoIDU0NywgNCkgPiwKKwkJCTwgMTQ0MDAwMCBNSFpfVE9fTUJQUyggNzY4LCA0KSA+LAorCQkJPCAxNTkzNjAwIE1IWl9UT19NQlBTKDEwMTcsIDQpID47CiAJfTsKIAogCWRldmZyZXFfbWVtbGF0XzQ6IHFjb20sY3B1NC1tZW1sYXQtbW9uIHsKQEAgLTkzOSwxNCArMTAzMCwxNCBAQAogCQlxY29tLHRhcmdldC1kZXYgPSA8Jm1lbWxhdF9jcHU0PjsKIAkJcWNvbSxjYWNoZW1pc3MtZXYgPSA8MHgyQT47CiAJCXFjb20sY29yZS1kZXYtdGFibGUgPQotCQkJPCAgMzAwMDAwICA3NjIgPiwKLQkJCTwgIDQ5OTIwMCAxNzIwID4sCi0JCQk8ICA4MDY0MDAgMjA4NiA+LAotCQkJPCAxMDM2ODAwIDI5MjkgPiwKLQkJCTwgMTE5MDQwMCAzODc5ID4sCi0JCQk8IDE1NzQ0MDAgNDk0MyA+LAotCQkJPCAxNzI4MDAwIDU5MzEgPiwKLQkJCTwgMTk1ODQwMCA2ODgxID47CisJCQk8ICAzMDAwMDAgTUhaX1RPX01CUFMoIDIwMCwgNCkgPiwKKwkJCTwgIDQ5OTIwMCBNSFpfVE9fTUJQUyggNDUxLCA0KSA+LAorCQkJPCAgODA2NDAwIE1IWl9UT19NQlBTKCA1NDcsIDQpID4sCisJCQk8IDEwMzY4MDAgTUhaX1RPX01CUFMoIDc2OCwgNCkgPiwKKwkJCTwgMTE5MDQwMCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LAorCQkJPCAxNTc0NDAwIE1IWl9UT19NQlBTKDEyOTYsIDQpID4sCisJCQk8IDE3MjgwMDAgTUhaX1RPX01CUFMoMTU1NSwgNCkgPiwKKwkJCTwgMTk1ODQwMCBNSFpfVE9fTUJQUygxODA0LCA0KSA+OwogCX07CiAKIAlsM19jcHUwOiBxY29tLGwzLWNwdTAgewpAQCAtMTAwNCwyNiArMTA5NSwyNiBAQAogCQlxY29tLHNyYy1kc3QtcG9ydHMgPSA8MSA1MTI+OwogCQlxY29tLGFjdGl2ZS1vbmx5OwogCQlxY29tLGJ3LXRibCA9Ci0JCQk8ICA3NjIgLyogIDIwMCBNSHogKi8gPiwKLQkJCTwgMTE0NCAvKiAgMzAwIE1IeiAqLyA+LAotCQkJPCAxNzIwIC8qICA0NTEgTUh6ICovID4sCi0JCQk8IDIwODYgLyogIDU0NyBNSHogKi8gPiwKLQkJCTwgMjU5NyAvKiAgNjgxIE1IeiAqLyA+LAotCQkJPCAyOTI5IC8qICA3NjggTUh6ICovID4sCi0JCQk8IDM4NzkgLyogMTAxNyBNSHogKi8gPiwKLQkJCTwgNDk0MyAvKiAxMjk2IE1IeiAqLyA+LAotCQkJPCA1OTMxIC8qIDE1NTUgTUh6ICovID4sCi0JCQk8IDY4ODEgLyogMTgwNCBNSHogKi8gPjsKKwkJCTwgTUhaX1RPX01CUFMoIDIwMCwgNCkgPiwgLyogNzYyIE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDMwMCwgNCkgPiwgLyogMTE0NCBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA0NTEsIDQpID4sIC8qIDE3MjAgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUyggNTQ3LCA0KSA+LCAvKiAyMDg2IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoIDY4MSwgNCkgPiwgLyogMjU5NyBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKCA3NjgsIDQpID4sIC8qIDI5MjkgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxMDE3LCA0KSA+LCAvKiAzODc5IE1CL3MgKi8KKwkJCTwgTUhaX1RPX01CUFMoMTI5NiwgNCkgPiwgLyogNDk0MyBNQi9zICovCisJCQk8IE1IWl9UT19NQlBTKDE1NTUsIDQpID4sIC8qIDU5MzEgTUIvcyAqLworCQkJPCBNSFpfVE9fTUJQUygxODA0LCA0KSA+OyAvKiA2ODgxIE1CL3MgKi8KIAl9OwogCi0JZGV2ZnJlcS1jcHVmcmVxIHsKKwlkZXZmcmVxX2NwdWZyZXE6IGRldmZyZXEtY3B1ZnJlcSB7CiAJCW1pbmNwdWJ3LWNwdWZyZXEgewogCQkJdGFyZ2V0LWRldiA9IDwmbWluY3B1Ync+OwogCQkJY3B1LXRvLWRldi1tYXAtMCA9Ci0JCQkJPCAxNzA4ODAwICA3NjIgPjsKKwkJCQk8IDE3MDg4MDAgTUhaX1RPX01CUFMoMjAwLCA0KSA+OwogCQkJY3B1LXRvLWRldi1tYXAtNCA9Ci0JCQkJPCAxODgxNjAwICA3NjIgPiwKLQkJCQk8IDIyMDgwMDAgMjU5NyA+OworCQkJCTwgMTg4MTYwMCBNSFpfVE9fTUJQUygyMDAsIDQpID4sCisJCQkJPCAyMjA4MDAwIE1IWl9UT19NQlBTKDY4MSwgNCkgPjsKIAkJfTsKIAl9OwogCkBAIC0xMDkxLDYgKzExODIsNyBAQAogCQlyZWcgPSA8MHg1MDkwMDAwIDB4OTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjY19iYXNlIjsKIAkJdmRkX2N4LXN1cHBseSA9IDwmcG04OTk4X3M5X2xldmVsPjsKKwkJdmRkX214LXN1cHBseSA9IDwmcG04OTk4X3M2X2xldmVsPjsKIAkJcWNvbSxncHVfY2NfZ211X2Nsa19zcmMtb3BwLWhhbmRsZSA9IDwmZ211PjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OwogCQkjcmVzZXQtY2VsbHMgPSA8MT47CkBAIC0xMTAxLDcgKzExOTMsNiBAQAogCQlyZWcgPSA8MHg1MDkwMDAwIDB4OTAwMD47CiAJCXJlZy1uYW1lcyA9ICJjY19iYXNlIjsKIAkJdmRkX2dmeC1zdXBwbHkgPSA8JnBtODAwNV9zMV9sZXZlbD47Ci0JCXZkZF9teC1zdXBwbHkgPSA8JnBtODk5OF9zNl9sZXZlbD47CiAJCXFjb20sZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMtb3BwLWhhbmRsZSA9IDwmbXNtX2dwdT47CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKIAkJI3Jlc2V0LWNlbGxzID0gPDE+OwpAQCAtMTU0MywxMDIgKzE2MzQsNiBAQAogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKLQlleHRjb25fc3RvcmFnZV9jZDogZXh0Y29uX3N0b3JhZ2VfY2QgewotCQljb21wYXRpYmxlID0gImV4dGNvbi1ncGlvIjsKLQkJZXh0Y29uLWlkID0gPDYyPjsgLyogRVhUQ09OX01FQ0hBTklDQUwgKi8KLQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQl9OwotCi0JdWZzcGh5X2NhcmQ6IHVmc3BoeV9jYXJkQDFkYTcwMDAgewotCQlyZWcgPSA8MHgxZGE3MDAwIDB4ZGE4PjsgLyogUEhZIHJlZ3MgKi8KLQkJcmVnLW5hbWVzID0gInBoeV9tZW0iOwotCQkjcGh5LWNlbGxzID0gPDA+OwotCi0JCWxhbmVzLXBlci1kaXJlY3Rpb24gPSA8MT47Ci0KLQkJY2xvY2stbmFtZXMgPSAicmVmX2Nsa19zcmMiLAotCQkJInJlZl9jbGsiLAotCQkJInJlZl9hdXhfY2xrIjsKLQkJY2xvY2tzID0gPCZjbG9ja19ycG1oIFJQTUhfQ1hPX0NMSz4sCi0JCQk8JmNsb2NrX2djYyBHQ0NfVUZTX0NBUkRfQ0xLUkVGX0NMSz4sCi0JCQk8JmNsb2NrX2djYyBHQ0NfVUZTX0NBUkRfUEhZX0FVWF9IV19DVExfQ0xLPjsKLQotCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwotCX07Ci0KLQl1ZnNoY19jYXJkOiB1ZnNoY19jYXJkQDFkYTQwMDAgewotCQljb21wYXRpYmxlID0gInFjb20sdWZzaGMiOwotCQlyZWcgPSA8MHgxZGE0MDAwIDB4MjUwMD47Ci0JCWludGVycnVwdHMgPSA8MCAxMjUgMD47Ci0JCXBoeXMgPSA8JnVmc3BoeV9jYXJkPjsKLQkJcGh5LW5hbWVzID0gInVmc3BoeSI7Ci0KLQkJbGFuZXMtcGVyLWRpcmVjdGlvbiA9IDwxPjsKLQkJZGV2LXJlZi1jbGstZnJlcSA9IDwwPjsgLyogMTkuMiBNSHogKi8KLQotCQljbG9jay1uYW1lcyA9Ci0JCQkiY29yZV9jbGsiLAotCQkJImJ1c19hZ2dyX2NsayIsCi0JCQkiaWZhY2VfY2xrIiwKLQkJCSJjb3JlX2Nsa191bmlwcm8iLAotCQkJImNvcmVfY2xrX2ljZSIsCi0JCQkicmVmX2NsayIsCi0JCQkidHhfbGFuZTBfc3luY19jbGsiLAotCQkJInJ4X2xhbmUwX3N5bmNfY2xrIjsKLQkJY2xvY2tzID0KLQkJCTwmY2xvY2tfZ2NjIEdDQ19VRlNfQ0FSRF9BWElfSFdfQ1RMX0NMSz4sCi0JCQk8JmNsb2NrX2djYyBHQ0NfQUdHUkVfVUZTX0NBUkRfQVhJX0hXX0NUTF9DTEs+LAotCQkJPCZjbG9ja19nY2MgR0NDX1VGU19DQVJEX0FIQl9DTEs+LAotCQkJPCZjbG9ja19nY2MgR0NDX1VGU19DQVJEX1VOSVBST19DT1JFX0hXX0NUTF9DTEs+LAotCQkJPCZjbG9ja19nY2MgR0NDX1VGU19DQVJEX0lDRV9DT1JFX0hXX0NUTF9DTEs+LAotCQkJPCZjbG9ja19ycG1oIFJQTUhfQ1hPX0NMSz4sCi0JCQk8JmNsb2NrX2djYyBHQ0NfVUZTX0NBUkRfVFhfU1lNQk9MXzBfQ0xLPiwKLQkJCTwmY2xvY2tfZ2NjIEdDQ19VRlNfQ0FSRF9SWF9TWU1CT0xfMF9DTEs+OwotCQlmcmVxLXRhYmxlLWh6ID0KLQkJCTw1MDAwMDAwMCAyMDAwMDAwMDA+LAotCQkJPDAgMD4sCi0JCQk8MCAwPiwKLQkJCTwzNzUwMDAwMCAxNTAwMDAwMDA+LAotCQkJPDc1MDAwMDAwIDMwMDAwMDAwMD4sCi0JCQk8MCAwPiwKLQkJCTwwIDA+LAotCQkJPDAgMD47Ci0KLQkJcWNvbSxtc20tYnVzLG5hbWUgPSAidWZzaGNfY2FyZCI7Ci0JCXFjb20sbXNtLWJ1cyxudW0tY2FzZXMgPSA8OT47Ci0JCXFjb20sbXNtLWJ1cyxudW0tcGF0aHMgPSA8Mj47Ci0JCXFjb20sbXNtLWJ1cyx2ZWN0b3JzLUtCcHMgPQotCQk8MTIyIDUxMiAwIDA+LCA8MSA3NTYgMCAwPiwgICAgICAgICAgLyogTm8gdm90ZSAqLwotCQk8MTIyIDUxMiA5MjIgMD4sIDwxIDc1NiAxMDAwIDA+LCAgICAgLyogUFdNIEcxICovCi0JCTwxMjIgNTEyIDEyNzc5NiAwPiwgPDEgNzU2IDEwMDAgMD4sICAvKiBIUyBHMSBSQSAqLwotCQk8MTIyIDUxMiAyNTU1OTEgMD4sIDwxIDc1NiAxMDAwIDA+LCAgLyogSFMgRzIgUkEgKi8KLQkJPDEyMiA1MTIgMjA5NzE1MiAwPiwgPDEgNzU2IDEwMjQwMCAwPiwgIC8qIEhTIEczIFJBICovCi0JCTwxMjIgNTEyIDE0OTQyMiAwPiwgPDEgNzU2IDEwMDAgMD4sICAvKiBIUyBHMSBSQiAqLwotCQk8MTIyIDUxMiAyOTgxODkgMD4sIDwxIDc1NiAxMDAwIDA+LCAgLyogSFMgRzIgUkIgKi8KLQkJPDEyMiA1MTIgMjA5NzE1MiAwPiwgPDEgNzU2IDEwMjQwMCAwPiwgIC8qIEhTIEczIFJCICovCi0JCTwxMjIgNTEyIDc2NDMxMzYgMD4sIDwxIDc1NiAzMDcyMDAgMD47IC8qIE1heC4gYmFuZHdpZHRoICovCi0JCXFjb20sYnVzLXZlY3Rvci1uYW1lcyA9ICJNSU4iLAotCQkiUFdNX0cxX0wxIiwKLQkJIkhTX1JBX0cxX0wxIiwgIkhTX1JBX0cyX0wxIiwgIkhTX1JBX0czX0wxIiwKLQkJIkhTX1JCX0cxX0wxIiwgIkhTX1JCX0cyX0wxIiwgIkhTX1JCX0czX0wxIiwKLQkJIk1BWCI7Ci0KLQkJLyogUE0gUW9TICovCi0JCXFjb20scG0tcW9zLWNwdS1ncm91cHMgPSA8MHgwZiAweGYwPjsKLQkJcWNvbSxwbS1xb3MtY3B1LWdyb3VwLWxhdGVuY3ktdXMgPSA8NzAgNzA+OwotCQlxY29tLHBtLXFvcy1kZWZhdWx0LWNwdSA9IDwwPjsKLQotCQkvKgotCQkgKiBOb3RlOiB0aGlzIGluc3RhbmNlIGRvZXNuJ3QgaGF2ZSBjb250cm9sIG92ZXIgVUZTIGRldmljZQotCQkgKiByZXNldAotCQkgKi8KLQotCQlyZXNldHMgPSA8JmNsb2NrX2djYyBHQ0NfVUZTX0NBUkRfQkNSPjsKLQkJcmVzZXQtbmFtZXMgPSAiY29yZV9yZXNldCI7Ci0KLQkJc3RhdHVzID0gImRpc2FibGVkIjsKLQl9OwotCiAJc2RoY18yOiBzZGhjaUA4ODA0MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLHNkaGNpLW1zbS12NSI7CiAJCXJlZyA9IDwweDg4MDQwMDAgMHgxMDAwPjsKQEAgLTE3MzcsNyArMTczMiw5IEBACiAJCXFjb20sc3lzbW9uLWlkID0gPDA+OwogCQlxY29tLHNzY3RsLWluc3RhbmNlLWlkID0gPDB4MTI+OwogCQlxY29tLG92ZXJyaWRlLWFjYzsKKwkJcWNvbSxzaWduYWwtYW9wOwogCQlxY29tLHFkc3A2djY1LTEtMDsKKwkJcWNvbSxtc3NfcGRjX29mZnNldCA9IDw4PjsKIAkJc3RhdHVzID0gIm9rIjsKIAkJbWVtb3J5LXJlZ2lvbiA9IDwmcGlsX21vZGVtX21lbT47CiAJCXFjb20sbWVtLXByb3RlY3QtaWQgPSA8MHhGPjsKQEAgLTE3NTEsNiArMTc0OCw5IEBACiAKIAkJLyogR1BJTyBvdXRwdXQgdG8gbXNzICovCiAJCXFjb20sZ3Bpby1mb3JjZS1zdG9wID0gPCZzbXAycGdwaW9fc3NyX3NtcDJwXzFfb3V0IDAgMD47CisKKwkJbWJveGVzID0gPCZxbXBfYW9wIDA+OworCQltYm94LW5hbWVzID0gIm1zcy1waWwiOwogCQlxY29tLG1iYS1tZW1AMCB7CiAJCQljb21wYXRpYmxlID0gInFjb20scGlsLW1iYS1tZW0iOwogCQkJbWVtb3J5LXJlZ2lvbiA9IDwmcGlsX21iYV9tZW0+OwpAQCAtMTc3Nyw2ICsxNzc3LDcgQEAKIAkJc3RhdHVzID0gIm9rIjsKIAkJcWNvbSxzc2N0bC1pbnN0YW5jZS1pZCA9IDwweDE0PjsKIAkJcWNvbSxmaXJtd2FyZS1uYW1lID0gImFkc3AiOworCQlxY29tLHNpZ25hbC1hb3A7CiAJCW1lbW9yeS1yZWdpb24gPSA8JnBpbF9hZHNwX21lbT47CiAKIAkJLyogR1BJTyBpbnB1dHMgZnJvbSBscGFzcyAqLwpAQCAtMTc4Nyw2ICsxNzg4LDkgQEAKIAogCQkvKiBHUElPIG91dHB1dCB0byBscGFzcyAqLwogCQlxY29tLGdwaW8tZm9yY2Utc3RvcCA9IDwmc21wMnBncGlvX3Nzcl9zbXAycF8yX291dCAwIDA+OworCisJCW1ib3hlcyA9IDwmcW1wX2FvcCAwPjsKKwkJbWJveC1uYW1lcyA9ICJhZHNwLXBpbCI7CiAJfTsKIAogCXFjb20sc3NjQDVjMDAwMDAgewpAQCAtMTgwOCw2ICsxODEyLDcgQEAKIAkJcWNvbSxzbWVtLWlkID0gPDQyND47CiAJCXFjb20sc3lzbW9uLWlkID0gPDM+OwogCQlxY29tLHNzY3RsLWluc3RhbmNlLWlkID0gPDB4MTY+OworCQlxY29tLHNpZ25hbC1hb3A7CiAJCXFjb20sZmlybXdhcmUtbmFtZSA9ICJzbHBpIjsKIAkJc3RhdHVzID0gIm9rIjsKIAkJbWVtb3J5LXJlZ2lvbiA9IDwmcGlsX3NscGlfbWVtPjsKQEAgLTE4MjAsNiArMTgyNSw5IEBACiAKIAkJLyogR1BJTyBvdXRwdXQgdG8gc3NjICovCiAJCXFjb20sZ3Bpby1mb3JjZS1zdG9wID0gPCZzbXAycGdwaW9fc3NyX3NtcDJwXzNfb3V0IDAgMD47CisKKwkJbWJveGVzID0gPCZxbXBfYW9wIDA+OworCQltYm94LW5hbWVzID0gInNscGktcGlsIjsKIAl9OwogCiAJc2xpbV9hdWQ6IHNsaW1AMTcxYzAwMDAgewpAQCAtMTg3NCw2ICsxODgyLDggQEAKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDQ5MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJcmVnID0gPDB4ODhlMDAwMCAweDIwMDA+OwogCQlyZWctbmFtZXMgPSAiZXVkX2Jhc2UiOworCQljbG9ja3MgPSA8JmNsb2NrX2djYyBHQ0NfVVNCX1BIWV9DRkdfQUhCMlBIWV9DTEs+OworCQljbG9jay1uYW1lcyA9ICJjZmdfYWhiX2NsayI7CiAJCXN0YXR1cyA9ICJvayI7CiAJfTsKIApAQCAtMTkwMiw5ICsxOTEyLDEzIEBACiAKIAkJcWNvbSxwYXMtaWQgPSA8MTQ+OwogCQlxY29tLHByb3h5LXRpbWVvdXQtbXMgPSA8MTAwMDA+OworCQlxY29tLHNpZ25hbC1hb3A7CiAJCXFjb20sZmlybXdhcmUtbmFtZSA9ICJzcHNzIjsKIAkJbWVtb3J5LXJlZ2lvbiA9IDwmcGlsX3Nwc3NfbWVtPjsKIAkJcWNvbSxzcHNzLXNjc3ItYml0cyA9IDwyNCAyNT47CisKKwkJbWJveGVzID0gPCZxbXBfYW9wIDA+OworCQltYm94LW5hbWVzID0gInNwc3MtcGlsIjsKIAl9OwogCiAJd2RvZzogcWNvbSx3ZHRAMTc5ODAwMDB7CkBAIC0xOTEzLDcgKzE5MjcsNyBAQAogCQlyZWctbmFtZXMgPSAid2R0LWJhc2UiOwogCQlpbnRlcnJ1cHRzID0gPDAgMCAwPiwgPDAgMSAwPjsKIAkJcWNvbSxiYXJrLXRpbWUgPSA8MTEwMDA+OwotCQlxY29tLHBldC10aW1lID0gPDEwMDAwPjsKKwkJcWNvbSxwZXQtdGltZSA9IDw5MzYwPjsKIAkJcWNvbSxpcGktcGluZzsKIAkJcWNvbSx3YWtldXAtZW5hYmxlOwogCX07CkBAIC0xOTM3LDYgKzE5NTEsNyBAQAogCQlxY29tLHN5c21vbi1pZCA9IDw3PjsKIAkJcWNvbSxzc2N0bC1pbnN0YW5jZS1pZCA9IDwweDE3PjsKIAkJcWNvbSxmaXJtd2FyZS1uYW1lID0gImNkc3AiOworCQlxY29tLHNpZ25hbC1hb3A7CiAJCW1lbW9yeS1yZWdpb24gPSA8JnBpbF9jZHNwX21lbT47CiAKIAkJLyogR1BJTyBpbnB1dHMgZnJvbSB0dXJpbmcgKi8KQEAgLTE5NDgsNiArMTk2Myw5IEBACiAJCS8qIEdQSU8gb3V0cHV0IHRvIHR1cmluZyovCiAJCXFjb20sZ3Bpby1mb3JjZS1zdG9wID0gPCZzbXAycGdwaW9fc3NyX3NtcDJwXzVfb3V0IDAgMD47CiAJCXN0YXR1cyA9ICJvayI7CisKKwkJbWJveGVzID0gPCZxbXBfYW9wIDA+OworCQltYm94LW5hbWVzID0gImNkc3AtcGlsIjsKIAl9OwogCiAJcWNvbSxtc20tcnRiIHsKQEAgLTIyNzgsMTkgKzIyOTYsMTkgQEAKIAkJfTsKIAogCQlMTENDXzE6IGxsY2NfMV9kY2FjaGUgewotCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMTQxMDA+OworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMTQxYzA+OwogCQl9OwogCiAJCUxMQ0NfMjogbGxjY18yX2RjYWNoZSB7Ci0JCQlxY29tLGR1bXAtc2l6ZSA9IDwweDExNDEwMD47CisJCQlxY29tLGR1bXAtc2l6ZSA9IDwweDExNDFjMD47CiAJCX07CiAKIAkJTExDQ18zOiBsbGNjXzNfZGNhY2hlIHsKLQkJCXFjb20sZHVtcC1zaXplID0gPDB4MTE0MTAwPjsKKwkJCXFjb20sZHVtcC1zaXplID0gPDB4MTE0MWMwPjsKIAkJfTsKIAogCQlMTENDXzQ6IGxsY2NfNF9kY2FjaGUgewotCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMTQxMDA+OworCQkJcWNvbSxkdW1wLXNpemUgPSA8MHgxMTQxYzA+OwogCQl9OwogCX07CiAKQEAgLTI1NDAsNiArMjU1OCwxOCBAQAogCQlxY29tLGZyYWdtZW50ZWQtZGF0YTsKIAl9OwogCisJcWNvbSxxc2VlX2lwY19pcnFfYnJpZGdlIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHFzZWUtaXBjLWlycS1icmlkZ2UiOworCisJCXFjb20scXNlZS1pcGMtaXJxLXNwc3MgeworCQkJcWNvbSxyeC1pcnEtY2xyID0gPDB4MTg4ODAwOCAweDQ+OworCQkJcWNvbSxyeC1pcnEtY2xyLW1hc2sgPSA8MHgxPjsKKwkJCXFjb20sZGV2LW5hbWUgPSAicXNlZV9pcGNfaXJxX3Nwc3MiOworCQkJaW50ZXJydXB0cyA9IDwwIDM0OSA0PjsKKwkJCWxhYmVsID0gInNwc3MiOworCQl9OworCX07CisKIAlxY29tLHNwY29tIHsKIAkJY29tcGF0aWJsZSA9ICJxY29tLHNwY29tIjsKIApAQCAtMjc5Nyw3ICsyODI3LDcgQEAKIAkJcWNvbSxzbW11LXMxLWJ5cGFzczsKIAkJcWNvbSxiYW5kd2lkdGgtdm90ZS1mb3ItaXBhOwogCQlxY29tLG1zbS1idXMsbmFtZSA9ICJpcGEiOwotCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDQ+OworCQlxY29tLG1zbS1idXMsbnVtLWNhc2VzID0gPDU+OwogCQlxY29tLG1zbS1idXMsbnVtLXBhdGhzID0gPDQ+OwogCQlxY29tLG1zbS1idXMsdmVjdG9ycy1LQnBzID0KIAkJLyogTm8gdm90ZSAqLwpAQCAtMjgwNSwyMiArMjgzNSwyOCBAQAogCQkJPDkwIDU4NSAwIDA+LAogCQkJPDEgNjc2IDAgMD4sCiAJCQk8MTQzIDc3NyAwIDA+LAorCQkvKiBTVlMyICovCisJCQk8OTAgNTEyIDgwMDAwIDYwMDAwMD4sCisJCQk8OTAgNTg1IDgwMDAwIDM1MDAwMD4sCisJCQk8MSA2NzYgNDAwMDAgNDAwMDA+LCAvKmdjY19jb25maWdfbm9jX2Nsa19zcmMgKi8KKwkJCTwxNDMgNzc3IDAgNzU+LCAvKiBJQiBkZWZpbmVkIGZvciBJUEEyWF9jbGsgaW4gTUh6Ki8KIAkJLyogU1ZTICovCiAJCQk8OTAgNTEyIDgwMDAwIDY0MDAwMD4sCiAJCQk8OTAgNTg1IDgwMDAwIDY0MDAwMD4sCiAJCQk8MSA2NzYgODAwMDAgODAwMDA+LAotCQkJPDE0MyA3NzcgMCAxNTA+LCAvKiBJQiBkZWZpbmVkIGZvciBJUEEgY2xrIGluIE1IeiovCisJCQk8MTQzIDc3NyAwIDE1MD4sIC8qIElCIGRlZmluZWQgZm9yIElQQTJYX2NsayBpbiBNSHoqLwogCQkvKiBOT01JTkFMICovCiAJCQk8OTAgNTEyIDIwNjAwMCA5NjAwMDA+LAogCQkJPDkwIDU4NSAyMDYwMDAgOTYwMDAwPiwKIAkJCTwxIDY3NiAyMDYwMDAgMTYwMDAwPiwKLQkJCTwxNDMgNzc3IDAgMzAwPiwgLyogSUIgZGVmaW5lZCBmb3IgSVBBIGNsayBpbiBNSHoqLworCQkJPDE0MyA3NzcgMCAzMDA+LCAvKiBJQiBkZWZpbmVkIGZvciBJUEEyWF9jbGsgaW4gTUh6Ki8KIAkJLyogVFVSQk8gKi8KIAkJCTw5MCA1MTIgMjA2MDAwIDM2MDAwMDA+LAogCQkJPDkwIDU4NSAyMDYwMDAgMzYwMDAwMD4sCiAJCQk8MSA2NzYgMjA2MDAwIDMwMDAwMD4sCiAJCQk8MTQzIDc3NyAwIDM1NT47IC8qIElCIGRlZmluZWQgZm9yIElQQSBjbGsgaW4gTUh6Ki8KLQkJcWNvbSxidXMtdmVjdG9yLW5hbWVzID0gIk1JTiIsICJTVlMiLCAiTk9NSU5BTCIsICJUVVJCTyI7CisJCXFjb20sYnVzLXZlY3Rvci1uYW1lcyA9CisJCQkiTUlOIiwgIlNWUzIiLCAiU1ZTIiwgIk5PTUlOQUwiLCAiVFVSQk8iOwogCiAJCS8qIElQQSBSQU0gbW1hcCAqLwogCQlxY29tLGlwYS1yYW0tbW1hcCA9IDwKQEAgLTI5MzEsNiArMjk2Nyw3IEBACiAJCWNvbXBhdGlibGUgPSAicWNvbSxwaWwtdHotZ2VuZXJpYyI7CiAJCXFjb20scGFzLWlkID0gPDB4Zj47CiAJCXFjb20sZmlybXdhcmUtbmFtZSA9ICJpcGFfZndzIjsKKwkJcWNvbSxwaWwtZm9yY2Utc2h1dGRvd247CiAJfTsKIAogCXFjb20sY2hkX3NsaXZlciB7CkBAIC0zMDM0LDYgKzMwNzEsMTEgQEAKIAkJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKIAkJCX07CiAKKwkJCW1vZGVtX3NraW46IG1vZGVtX3NraW4geworCQkJCXFjb20scW1pLWRldi1uYW1lID0gIm1vZGVtX3NraW4iOworCQkJCSNjb29saW5nLWNlbGxzID0gPDI+OworCQkJfTsKKwogCQkJbW9kZW1fdmRkOiBtb2RlbV92ZGQgewogCQkJCXFjb20scW1pLWRldi1uYW1lID0gImNwdXZfcmVzdHJpY3Rpb25fY29sZCI7CiAJCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CkBAIC0zNTU2LDcgKzM1OTgsNyBAQAogCX07CiAKIAlncGlfZG1hMDogcWNvbSxncGktZG1hQDB4ODAwMDAwIHsKLQkJI2RtYS1jZWxscyA9IDw2PjsKKwkJI2RtYS1jZWxscyA9IDw1PjsKIAkJY29tcGF0aWJsZSA9ICJxY29tLGdwaS1kbWEiOwogCQlyZWcgPSA8MHg4MDAwMDAgMHg2MDAwMD47CiAJCXJlZy1uYW1lcyA9ICJncGktdG9wIjsKQEAgLTM1NjgsMTEgKzM2MTAsMTMgQEAKIAkJcWNvbSxncGlpLW1hc2sgPSA8MHhmYT47CiAJCXFjb20sZXYtZmFjdG9yID0gPDI+OwogCQlpb21tdXMgPSA8JmFwcHNfc21tdSAweDAwMTYgMHgwPjsKKwkJcWNvbSxzbW11LWNmZyA9IDwweDE+OworCQlxY29tLGlvdmEtcmFuZ2UgPSA8MHgwIDB4MTAwMDAwIDB4MCAweDEwMDAwMD47CiAJCXN0YXR1cyA9ICJvayI7CiAJfTsKIAogCWdwaV9kbWExOiBxY29tLGdwaS1kbWFAMHhhMDAwMDAgewotCQkjZG1hLWNlbGxzID0gPDY+OworCQkjZG1hLWNlbGxzID0gPDU+OwogCQljb21wYXRpYmxlID0gInFjb20sZ3BpLWRtYSI7CiAJCXJlZyA9IDwweGEwMDAwMCAweDYwMDAwPjsKIAkJcmVnLW5hbWVzID0gImdwaS10b3AiOwpAQCAtMzU4NCw2ICszNjI4LDggQEAKIAkJcWNvbSxncGlpLW1hc2sgPSA8MHhmYT47CiAJCXFjb20sZXYtZmFjdG9yID0gPDI+OwogCQlpb21tdXMgPSA8JmFwcHNfc21tdSAweDA2ZDYgMHgwPjsKKwkJcWNvbSxzbW11LWNmZyA9IDwweDE+OworCQlxY29tLGlvdmEtcmFuZ2UgPSA8MHgwIDB4MTAwMDAwIDB4MCAweDEwMDAwMD47CiAJCXN0YXR1cyA9ICJvayI7CiAJfTsKIApAQCAtMzY3Nyw2ICszNzIzLDEwIEBACiAJCQkgPCZjbG9ja19ycG1oIFJQTUhfUkZfQ0xLM19BPjsKIAkJY2xvY2stbmFtZXMgPSAicmZfY2xrM19jbGsiLCAicmZfY2xrM19waW5fY2xrIjsKIAkJcWNvbSxzbW11LXN1cHBvcnQ7CisJCXFjb20sc21tdS1tYXBwaW5nID0gPDB4MjAwMDAwMDAgMHhlMDAwMDAwMD47CisJCXFjb20sc21tdS1zMS1lbjsKKwkJcWNvbSxzbW11LWZhc3QtbWFwOworCQlxY29tLHNtbXUtY29oZXJlbnQ7CiAJCXFjb20sa2VlcC1yYWRpby1vbi1kdXJpbmctc2xlZXA7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zbWIxMzU1LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3Fjb20vc21iMTM1NS5kdHNpCmluZGV4IDk5OWQ4N2EuLmJkZTRkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcWNvbS9zbWIxMzU1LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9xY29tL3NtYjEzNTUuZHRzaQpAQCAtMTMsMzAgKzEzLDc1IEBACiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaXJxLmg+CiAKICZxdXB2M19zZTEwX2kyYyB7Ci0Jc21iMTM1NTogcWNvbSxzbWIxMzU1QDggeworCXNtYjEzNTVfMDogcWNvbSxzbWIxMzU1QDggewogCQljb21wYXRpYmxlID0gInFjb20saTJjLXBtaWMiOwogCQlyZWcgPSA8MHg4PjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmc3BtaV9idXM+OwogCQlpbnRlcnJ1cHRzID0gPDB4MCAweGQxIDB4MCBJUlFfVFlQRV9MRVZFTF9MT1c+OwotCQlpbnRlcnJ1cHRfbmFtZXMgPSAic21iMTM1NSI7CisJCWludGVycnVwdF9uYW1lcyA9ICJzbWIxMzU1XzAiOwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKIAkJcWNvbSxwZXJpcGgtbWFwID0gPDB4MTAgMHgxMiAweDEzIDB4MTY+OwogCi0JCXNtYjEzNTVfcmV2aWQ6IHFjb20scmV2aWRAMTAwIHsKKwkJc21iMTM1NV9yZXZpZF8wOiBxY29tLHJldmlkQDEwMCB7CiAJCQljb21wYXRpYmxlID0gInFjb20scXBucC1yZXZpZCI7CiAJCQlyZWcgPSA8MHgxMDAgMHgxMDA+OwogCQl9OwogCi0JCXNtYjEzNTVfY2hhcmdlcjogcWNvbSxzbWIxMzU1LWNoYXJnZXJAMTAwMCB7CisJCXNtYjEzNTVfY2hhcmdlcl8wOiBxY29tLHNtYjEzNTUtY2hhcmdlckAxMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAicWNvbSxzbWIxMzU1IjsKLQkJCXFjb20scG1pYy1yZXZpZCA9IDwmc21iMTM1NV9yZXZpZD47CisJCQlxY29tLHBtaWMtcmV2aWQgPSA8JnNtYjEzNTVfcmV2aWRfMD47CiAJCQlyZWcgPSA8MHgxMDAwIDB4NzAwPjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZzbWIxMzU1PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNtYjEzNTVfMD47CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCisJCQlpby1jaGFubmVscyA9IDwmcG1pODk5OF9ycmFkYyAyPiwKKwkJCQkgICAgICA8JnBtaTg5OThfcnJhZGMgMTI+OworCQkJaW8tY2hhbm5lbC1uYW1lcyA9ICJjaGFyZ2VyX3RlbXAiLAorCQkJCQkgICAiY2hhcmdlcl90ZW1wX21heCI7CisKKwkJCXFjb20sY2hnckAxMDAwIHsKKwkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MTAgMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwkJCQlpbnRlcnJ1cHQtbmFtZXMgPSAiY2hnLXN0YXRlLWNoYW5nZSI7CisJCQl9OworCisJCQlxY29tLGNoZ3ItbWlzY0AxNjAwIHsKKwkJCQlyZWcgPSA8MHgxNjAwIDB4MTAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MTYgMHgxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwkJCQlpbnRlcnJ1cHQtbmFtZXMgPSAid2RvZy1iYXJrIjsKKwkJCX07CisJCX07CisJfTsKKworCXNtYjEzNTVfMTogcWNvbSxzbWIxMzU1QGMgeworCQljb21wYXRpYmxlID0gInFjb20saTJjLXBtaWMiOworCQlyZWcgPSA8MHhjPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZzcG1pX2J1cz47CisJCWludGVycnVwdHMgPSA8MHgwIDB4ZDEgMHgwIElSUV9UWVBFX0xFVkVMX0xPVz47CisJCWludGVycnVwdF9uYW1lcyA9ICJzbWIxMzU1XzEiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJcWNvbSxwZXJpcGgtbWFwID0gPDB4MTAgMHgxMiAweDEzIDB4MTY+OworCisJCXNtYjEzNTVfcmV2aWRfMTogcWNvbSxyZXZpZEAxMDAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHFwbnAtcmV2aWQiOworCQkJcmVnID0gPDB4MTAwIDB4MTAwPjsKKwkJfTsKKworCQlzbWIxMzU1X2NoYXJnZXJfMTogcWNvbSxzbWIxMzU1LWNoYXJnZXJAMTAwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20sc21iMTM1NSI7CisJCQlxY29tLHBtaWMtcmV2aWQgPSA8JnNtYjEzNTVfcmV2aWRfMT47CisJCQlyZWcgPSA8MHgxMDAwIDB4NzAwPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZzbWIxMzU1XzE+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAogCQkJaW8tY2hhbm5lbHMgPSA8JnBtaTg5OThfcnJhZGMgMj4sCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAtZXAxMDguZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy94aWxpbngvenlucW1wLWVwMTA4LmR0cwppbmRleCAzNTgwODk2Li5lZjFiOWU1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAtZXAxMDguZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC1lcDEwOC5kdHMKQEAgLTI3LDcgKzI3LDcgQEAKIAkJc3Rkb3V0LXBhdGggPSAic2VyaWFsMDoxMTUyMDBuOCI7CiAJfTsKIAotCW1lbW9yeSB7CisJbWVtb3J5QDAgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MHgwIDB4MCAweDAgMHg0MDAwMDAwMD47CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy94aWxpbngvenlucW1wLmR0c2kKaW5kZXggNjhhOTA4MzMuLjU0ZGMyODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpCkBAIC03Miw3ICs3Miw3IEBACiAJCQkgICAgIDwxIDEwIDB4ZjA4PjsKIAl9OwogCi0JYW1iYV9hcHUgeworCWFtYmFfYXB1OiBhbWJhX2FwdUAwIHsKIAkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJCX07CiAKIAkJaTJjMDogaTJjQGZmMDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiY2RucyxpMmMtcjFwMTAiOworCQkJY29tcGF0aWJsZSA9ICJjZG5zLGkyYy1yMXAxNCIsICJjZG5zLGkyYy1yMXAxMCI7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJCWludGVycnVwdHMgPSA8MCAxNyA0PjsKQEAgLTE4NSw3ICsxODUsNyBAQAogCQl9OwogCiAJCWkyYzE6IGkyY0BmZjAzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImNkbnMsaTJjLXIxcDEwIjsKKwkJCWNvbXBhdGlibGUgPSAiY2RucyxpMmMtcjFwMTQiLCAiY2RucyxpMmMtcjFwMTAiOwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMTggND47CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NvbmZpZ3MvbXNtODk1My1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtNjQvY29uZmlncy9tc204OTUzLXBlcmZfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2ZlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2NvbmZpZ3MvbXNtODk1My1wZXJmX2RlZmNvbmZpZwpAQCAtMCwwICsxLDQ3MyBAQAorQ09ORklHX0xPQ0FMVkVSU0lPTj0iLXBlcmYiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19GSEFORExFIGlzIG5vdCBzZXQKK0NPTkZJR19BVURJVD15CisjIENPTkZJR19BVURJVFNZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkc9eQorQ09ORklHX1NDSEVEX1dBTFQ9eQorQ09ORklHX1JDVV9FWFBFUlQ9eQorQ09ORklHX1JDVV9GQVNUX05PX0haPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFU9eQorQ09ORklHX1JDVV9OT0NCX0NQVV9BTEw9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQ1BVX01BWF9CVUZfU0hJRlQ9MTcKK0NPTkZJR19DR1JPVVBfRlJFRVpFUj15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorQ09ORklHX0NHUk9VUF9TQ0hFRFRVTkU9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKK0NPTkZJR19DR1JPVVBfQlBGPXkKK0NPTkZJR19TQ0hFRF9DT1JFX0NUTD15CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TQ0hFRF9BVVRPR1JPVVA9eQorQ09ORklHX1NDSEVEX1RVTkU9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX1JEX1haIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19SRF9MWjQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfQlBGX1NZU0NBTEw9eQorIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTUJBUlJJRVIgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkKK0NPTkZJR19BUkNIX01NQVBfUk5EX0NPTVBBVF9CSVRTPTE2CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TSUc9eQorQ09ORklHX01PRFVMRV9TSUdfRk9SQ0U9eQorQ09ORklHX01PRFVMRV9TSUdfU0hBNTEyPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9RQ09NPXkKK0NPTkZJR19BUkNIX01TTTg5NTM9eQorQ09ORklHX1NDSEVEX01DPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX0NNQT15CitDT05GSUdfWlNNQUxMT0M9eQorQ09ORklHX0JBTEFOQ0VfQU5PTl9GSUxFX1JFQ0xBSU09eQorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0FSTVY4X0RFUFJFQ0FURUQ9eQorQ09ORklHX1NXUF9FTVVMQVRJT049eQorQ09ORklHX0NQMTVfQkFSUklFUl9FTVVMQVRJT049eQorQ09ORklHX1NFVEVORF9FTVVMQVRJT049eQorIyBDT05GSUdfQVJNNjRfVkhFIGlzIG5vdCBzZXQKK0NPTkZJR19CVUlMRF9BUk02NF9BUFBFTkRFRF9EVEJfSU1BR0U9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVD15CitDT05GSUdfUE1fQVVUT1NMRUVQPXkKK0NPTkZJR19QTV9XQUtFTE9DS1M9eQorQ09ORklHX1BNX1dBS0VMT0NLU19MSU1JVD0wCisjIENPTkZJR19QTV9XQUtFTE9DS1NfR0MgaXMgbm90IHNldAorQ09ORklHX0NQVV9JRExFPXkKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFPXkKK0NPTkZJR19DUFVfQk9PU1Q9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9TQ0hFRFVUSUw9eQorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNX1VTRVI9eQorQ09ORklHX1hGUk1fU1RBVElTVElDUz15CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSU5FVF9BSD15CitDT05GSUdfSU5FVF9FU1A9eQorQ09ORklHX0lORVRfSVBDT01QPXkKK0NPTkZJR19JTkVUX0RJQUdfREVTVFJPWT15CitDT05GSUdfSVBWNl9ST1VURVJfUFJFRj15CitDT05GSUdfSVBWNl9ST1VURV9JTkZPPXkKK0NPTkZJR19JUFY2X09QVElNSVNUSUNfREFEPXkKK0NPTkZJR19JTkVUNl9BSD15CitDT05GSUdfSU5FVDZfRVNQPXkKK0NPTkZJR19JTkVUNl9JUENPTVA9eQorQ09ORklHX0lQVjZfTUlQNj15CitDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQorQ09ORklHX0lQVjZfU1VCVFJFRVM9eQorQ09ORklHX05FVEZJTFRFUj15CitDT05GSUdfTkZfQ09OTlRSQUNLPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSz15CitDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUz15CitDT05GSUdfTkZfQ1RfUFJPVE9fRENDUD15CitDT05GSUdfTkZfQ1RfUFJPVE9fU0NUUD15CitDT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT15CitDT05GSUdfTkZfQ09OTlRSQUNLX0FNQU5EQT15CitDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD15CitDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9eQorQ09ORklHX05GX0NPTk5UUkFDS19JUkM9eQorQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD15CitDT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9eQorQ09ORklHX05GX0NPTk5UUkFDS19URlRQPXkKK0NPTkZJR19ORl9DVF9ORVRMSU5LPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1FUj15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9IQVJESURMRVRJTUVSPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0xPRz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9URUU9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFBST1hZPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1NFQ01BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVENQTVNTPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5NQVJLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9eQorIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0wyVFAgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVRBR1VJRD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEEyPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU09DS0VUPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWND15CitDT05GSUdfSVBfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQX05GX01BVENIX0FIPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9FQ049eQorQ09ORklHX0lQX05GX01BVENIX1JQRklMVEVSPXkKK0NPTkZJR19JUF9ORl9NQVRDSF9UVEw9eQorQ09ORklHX0lQX05GX0ZJTFRFUj15CitDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD15CitDT05GSUdfSVBfTkZfTkFUPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT15CitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD15CitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPXkKK0NPTkZJR19JUF9ORl9NQU5HTEU9eQorQ09ORklHX0lQX05GX1JBVz15CitDT05GSUdfSVBfTkZfU0VDVVJJVFk9eQorQ09ORklHX0lQX05GX0FSUFRBQkxFUz15CitDT05GSUdfSVBfTkZfQVJQRklMVEVSPXkKK0NPTkZJR19JUF9ORl9BUlBfTUFOR0xFPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj15CitDT05GSUdfSVA2X05GX0lQVEFCTEVTPXkKK0NPTkZJR19JUDZfTkZfTUFUQ0hfUlBGSUxURVI9eQorQ09ORklHX0lQNl9ORl9GSUxURVI9eQorQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVKRUNUPXkKK0NPTkZJR19JUDZfTkZfTUFOR0xFPXkKK0NPTkZJR19JUDZfTkZfUkFXPXkKK0NPTkZJR19CUklER0VfTkZfRUJUQUJMRVM9eQorQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPXkKK0NPTkZJR19MMlRQPXkKK0NPTkZJR19MMlRQX1YzPXkKK0NPTkZJR19MMlRQX0lQPXkKK0NPTkZJR19MMlRQX0VUSD15CitDT05GSUdfQlJJREdFPXkKK0NPTkZJR19ORVRfU0NIRUQ9eQorQ09ORklHX05FVF9TQ0hfSFRCPXkKK0NPTkZJR19ORVRfU0NIX1BSSU89eQorQ09ORklHX05FVF9TQ0hfTVVMVElRPXkKK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQorQ09ORklHX05FVF9DTFNfRlc9eQorQ09ORklHX05FVF9DTFNfVTMyPXkKK0NPTkZJR19DTFNfVTMyX01BUks9eQorQ09ORklHX05FVF9DTFNfRkxPVz15CitDT05GSUdfTkVUX0VNQVRDSD15CitDT05GSUdfTkVUX0VNQVRDSF9DTVA9eQorQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9eQorQ09ORklHX05FVF9FTUFUQ0hfVTMyPXkKK0NPTkZJR19ORVRfRU1BVENIX01FVEE9eQorQ09ORklHX05FVF9FTUFUQ0hfVEVYVD15CitDT05GSUdfTkVUX0NMU19BQ1Q9eQorQ09ORklHX05FVF9BQ1RfR0FDVD15CitDT05GSUdfTkVUX0FDVF9NSVJSRUQ9eQorQ09ORklHX05FVF9BQ1RfU0tCRURJVD15CitDT05GSUdfUk1ORVRfREFUQT15CitDT05GSUdfUk1ORVRfREFUQV9GQz15CitDT05GSUdfUk1ORVRfREFUQV9ERUJVR19QS1Q9eQorQ09ORklHX0JUPXkKK0NPTkZJR19NU01fQlRfUE9XRVI9eQorQ09ORklHX0NGRzgwMjExPXkKK0NPTkZJR19DRkc4MDIxMV9JTlRFUk5BTF9SRUdEQj15CisjIENPTkZJR19DRkc4MDIxMV9DUkRBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1JGS0lMTD15CitDT05GSUdfTkZDX05RPXkKK0NPTkZJR19JUENfUk9VVEVSPXkKK0NPTkZJR19JUENfUk9VVEVSX1NFQ1VSSVRZPXkKK0NPTkZJR19GV19MT0FERVJfVVNFUl9IRUxQRVJfRkFMTEJBQ0s9eQorQ09ORklHX0RNQV9DTUE9eQorQ09ORklHX1pSQU09eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX1FTRUVDT009eQorQ09ORklHX01FTU9SWV9TVEFURV9USU1FPXkKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19DSFJfREVWX1NDSD15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKK0NPTkZJR19TQ1NJX1VGU0hDRD15CitDT05GSUdfU0NTSV9VRlNIQ0RfUExBVEZPUk09eQorQ09ORklHX1NDU0lfVUZTX1FDT009eQorQ09ORklHX1NDU0lfVUZTX1FDT01fSUNFPXkKK0NPTkZJR19TQ1NJX1VGU0hDRF9DTURfTE9HR0lORz15CitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfRE09eQorQ09ORklHX0RNX0RFQlVHPXkKK0NPTkZJR19ETV9DUllQVD15CitDT05GSUdfRE1fUkVRX0NSWVBUPXkKK0NPTkZJR19ETV9VRVZFTlQ9eQorQ09ORklHX0RNX1ZFUklUWT15CitDT05GSUdfRE1fVkVSSVRZX0ZFQz15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorQ09ORklHX1RVTj15CitDT05GSUdfUFBQPXkKK0NPTkZJR19QUFBfQlNEQ09NUD15CitDT05GSUdfUFBQX0RFRkxBVEU9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9NUFBFPXkKK0NPTkZJR19QUFBfTVVMVElMSU5LPXkKK0NPTkZJR19QUFBPRT15CitDT05GSUdfUFBQT0wyVFA9eQorQ09ORklHX1BQUE9MQUM9eQorQ09ORklHX1BQUE9QTlM9eQorQ09ORklHX1BQUF9BU1lOQz15CitDT05GSUdfUFBQX1NZTkNfVFRZPXkKK0NPTkZJR19XQ05TU19NRU1fUFJFX0FMTE9DPXkKK0NPTkZJR19DTERfTExfQ09SRT15CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0tFWUJPQVJEX0dQSU89eQorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0pPWVNUSUNLPXkKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfSEJUUF9JTlBVVD15CitDT05GSUdfSU5QVVRfVUlOUFVUPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9NU009eQorQ09ORklHX1NFUklBTF9NU01fQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19IV19SQU5ET01fTVNNX0xFR0FDWT15CitDT05GSUdfTVNNX0FEU1BSUEM9eQorQ09ORklHX01TTV9SREJHPW0KK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfUVVQPXkKK0NPTkZJR19TUElfU1BJREVWPXkKK0NPTkZJR19TTElNQlVTX01TTV9OR0Q9eQorQ09ORklHX1NQTUk9eQorQ09ORklHX1NQTUlfTVNNX1BNSUNfQVJCX0RFQlVHPXkKK0NPTkZJR19QSU5DVFJMX01TTTg5NTM9eQorQ09ORklHX1BJTkNUUkxfUUNPTV9TUE1JX1BNSUM9eQorQ09ORklHX0dQSU9MSUI9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorQ09ORklHX1BPV0VSX1JFU0VUX1FDT009eQorQ09ORklHX1FDT01fRExPQURfTU9ERT15CitDT05GSUdfUE9XRVJfUkVTRVRfWEdFTkU9eQorQ09ORklHX1BPV0VSX1JFU0VUX1NZU0NPTj15CitDT05GSUdfU0VOU09SU19RUE5QX0FEQ19WT0xUQUdFPXkKK0NPTkZJR19USEVSTUFMPXkKK0NPTkZJR19USEVSTUFMX1FQTlA9eQorQ09ORklHX1RIRVJNQUxfUVBOUF9BRENfVE09eQorQ09ORklHX1RIRVJNQUxfVFNFTlM9eQorQ09ORklHX01TTV9CQ0xfUEVSSVBIRVJBTF9DVEw9eQorQ09ORklHX1FUSV9USEVSTUFMX0xJTUlUU19EQ1ZTPXkKK0NPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CitDT05GSUdfUkVHVUxBVE9SX0NQUkhfS0JTUz15CitDT05GSUdfUkVHVUxBVE9SX1FQTlBfTEFCSUJCPXkKK0NPTkZJR19SRUdVTEFUT1JfUVBOUD15CitDT05GSUdfUkVHVUxBVE9SX1NUVUI9eQorQ09ORklHX01FRElBX1NVUFBPUlQ9eQorQ09ORklHX01FRElBX0NBTUVSQV9TVVBQT1JUPXkKK0NPTkZJR19NRURJQV9DT05UUk9MTEVSPXkKK0NPTkZJR19WSURFT19WNEwyX1NVQkRFVl9BUEk9eQorQ09ORklHX1Y0TF9QTEFURk9STV9EUklWRVJTPXkKK0NPTkZJR19NU01fVklEQ19WNEwyPXkKK0NPTkZJR19NU01fVklEQ19HT1ZFUk5PUlM9eQorQ09ORklHX01TTV9TREVfUk9UQVRPUj15CitDT05GSUdfTVNNX1NERV9ST1RBVE9SX0VWVExPR19ERUJVRz15CitDT05GSUdfUUNPTV9LR1NMPXkKK0NPTkZJR19EUk09eQorQ09ORklHX0RSTV9TREVfRVZUTE9HX0RFQlVHPXkKK0NPTkZJR19EUk1fU0RFX1JTQz15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlM9eQorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1VISUQ9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0VMRUNPTT15CitDT05GSUdfSElEX01BR0lDTU9VU0U9eQorQ09ORklHX0hJRF9NSUNST1NPRlQ9eQorQ09ORklHX0hJRF9NVUxUSVRPVUNIPXkKK0NPTkZJR19VU0JfRFdDMz15CitDT05GSUdfTk9QX1VTQl9YQ0VJVj15CitDT05GSUdfRFVBTF9ST0xFX1VTQl9JTlRGPXkKK0NPTkZJR19VU0JfTVNNX1NTUEhZX1FNUD15CitDT05GSUdfTVNNX1FVU0JfUEhZPXkKK0NPTkZJR19VU0JfR0FER0VUPXkKK0NPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTPXkKK0NPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZTPXkKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz01MDAKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19QRVJGX1BST0ZJTElORz15CitDT05GSUdfTU1DX1BBUkFOT0lEX1NEX0lOSVQ9eQorQ09ORklHX01NQ19DTEtHQVRFPXkKK0NPTkZJR19NTUNfQkxPQ0tfTUlOT1JTPTMyCitDT05GSUdfTU1DX0JMT0NLX0RFRkVSUkVEX1JFU1VNRT15CitDT05GSUdfTU1DX1RFU1Q9eQorQ09ORklHX01NQ19TREhDST15CitDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKK0NPTkZJR19NTUNfU0RIQ0lfTVNNPXkKK0NPTkZJR19ORVdfTEVEUz15CitDT05GSUdfTEVEU19DTEFTUz15CitDT05GSUdfTEVEU19RUE5QPXkKK0NPTkZJR19MRURTX1FQTlBfV0xFRD15CitDT05GSUdfTEVEU19UUklHR0VSUz15CitDT05GSUdfRURBQz15CitDT05GSUdfRURBQ19NTV9FREFDPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19EUlZfUVBOUD15CitDT05GSUdfRE1BREVWSUNFUz15CitDT05GSUdfUUNPTV9TUFNfRE1BPXkKK0NPTkZJR19VSU89eQorQ09ORklHX1VJT19NU01fU0hBUkVETUVNPXkKK0NPTkZJR19TVEFHSU5HPXkKK0NPTkZJR19BU0hNRU09eQorQ09ORklHX0FORFJPSURfTE9XX01FTU9SWV9LSUxMRVI9eQorQ09ORklHX0lPTj15CitDT05GSUdfSU9OX01TTT15CitDT05GSUdfR1NJPXkKK0NPTkZJR19JUEEzPXkKK0NPTkZJR19STU5FVF9JUEEzPXkKK0NPTkZJR19STkRJU19JUEE9eQorQ09ORklHX0lQQV9VVD15CitDT05GSUdfU1BTPXkKK0NPTkZJR19TUFNfU1VQUE9SVF9ORFBfQkFNPXkKK0NPTkZJR19RUE5QX0NPSU5DRUxMPXkKK0NPTkZJR19RUE5QX1JFVklEPXkKK0NPTkZJR19VU0JfQkFNPXkKK0NPTkZJR19RQ09NX01EU1NfUExMPXkKK0NPTkZJR19SRU1PVEVfU1BJTkxPQ0tfTVNNPXkKK0NPTkZJR19NQUlMQk9YPXkKK0NPTkZJR19BUk1fU01NVT15CitDT05GSUdfTVNNX0JPT1RfU1RBVFM9eQorQ09ORklHX1FDT01fRVVEPXkKK0NPTkZJR19RQ09NX1dBVENIRE9HX1YyPXkKK0NPTkZJR19RQ09NX01FTU9SWV9EVU1QX1YyPXkKK0NPTkZJR19RQ09NX1NFQ1VSRV9CVUZGRVI9eQorQ09ORklHX1FDT01fRUFSTFlfUkFORE9NPXkKK0NPTkZJR19NU01fU01FTT15CitDT05GSUdfTVNNX0dMSU5LPXkKK0NPTkZJR19NU01fR0xJTktfTE9PUEJBQ0tfU0VSVkVSPXkKK0NPTkZJR19NU01fR0xJTktfU01FTV9OQVRJVkVfWFBSVD15CitDT05GSUdfTVNNX0dMSU5LX1NQSV9YUFJUPXkKK0NPTkZJR19NU01fU01QMlA9eQorQ09ORklHX01TTV9TTVAyUF9URVNUPXkKK0NPTkZJR19NU01fSVBDX1JPVVRFUl9HTElOS19YUFJUPXkKK0NPTkZJR19NU01fUU1JX0lOVEVSRkFDRT15CitDT05GSUdfTVNNX0dMSU5LX1BLVD15CitDT05GSUdfTVNNX1NVQlNZU1RFTV9SRVNUQVJUPXkKK0NPTkZJR19NU01fUElMPXkKK0NPTkZJR19NU01fUElMX1NTUl9HRU5FUklDPXkKK0NPTkZJR19NU01fUElMX01TU19RRFNQNlY1PXkKK0NPTkZJR19JQ05TUz15CitDT05GSUdfTVNNX1BFUkZPUk1BTkNFPXkKK0NPTkZJR19NU01fRVZFTlRfVElNRVI9eQorQ09ORklHX01TTV9QTT15CitDT05GSUdfUVRJX1JQTV9TVEFUU19MT0c9eQorQ09ORklHX1FDT01fRk9SQ0VfV0RPR19CSVRFX09OX1BBTklDPXkKK0NPTkZJR19QV009eQorQ09ORklHX1BXTV9RUE5QPXkKK0NPTkZJR19BUk1fR0lDX1YzX0FDTD15CitDT05GSUdfQU5EUk9JRD15CitDT05GSUdfQU5EUk9JRF9CSU5ERVJfSVBDPXkKK0NPTkZJR19TRU5TT1JTX1NTQz15CitDT05GSUdfTVNNX1RaX0xPRz15CitDT05GSUdfUVVPVEE9eQorQ09ORklHX1FVT1RBX05FVExJTktfSU5URVJGQUNFPXkKK0NPTkZJR19GVVNFX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQorQ09ORklHX0VDUllQVF9GUz15CitDT05GSUdfRUNSWVBUX0ZTX01FU1NBR0lORz15CisjIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKK0NPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfREVCVUdfSU5GTz15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX1BBTklDX1RJTUVPVVQ9NQorQ09ORklHX1NDSEVEU1RBVFM9eQorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSVBDX0xPR0dJTkc9eQorQ09ORklHX0NQVV9GUkVRX1NXSVRDSF9QUk9GSUxFUj15CitDT05GSUdfREVCVUdfQUxJR05fUk9EQVRBPXkKK0NPTkZJR19DT1JFU0lHSFQ9eQorQ09ORklHX0NPUkVTSUdIVF9TVE09eQorQ09ORklHX0NPUkVTSUdIVF9FVkVOVD15CitDT05GSUdfU0VDVVJJVFlfUEVSRl9FVkVOVFNfUkVTVFJJQ1Q9eQorQ09ORklHX1NFQ1VSSVRZPXkKK0NPTkZJR19IQVJERU5FRF9VU0VSQ09QWT15CitDT05GSUdfU0VDVVJJVFlfU0VMSU5VWD15CitDT05GSUdfU0VDVVJJVFlfU01BQ0s9eQorQ09ORklHX0NSWVBUT19DVFI9eQorQ09ORklHX0NSWVBUT19YQ0JDPXkKK0NPTkZJR19DUllQVE9fTUQ0PXkKK0NPTkZJR19DUllQVE9fVFdPRklTSD15CitDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkc9eQorQ09ORklHX0NSWVBUT19ERVZfUUNPTV9NU01fUUNFPXkKK0NPTkZJR19DUllQVE9fREVWX1FDUllQVE89eQorQ09ORklHX0NSWVBUT19ERVZfUUNFREVWPXkKK0NPTkZJR19DUllQVE9fREVWX1FDT01fSUNFPXkKK0NPTkZJR19BUk02NF9DUllQVE89eQorQ09ORklHX0NSWVBUT19TSEExX0FSTTY0X0NFPXkKK0NPTkZJR19DUllQVE9fU0hBMl9BUk02NF9DRT15CitDT05GSUdfQ1JZUFRPX0dIQVNIX0FSTTY0X0NFPXkKK0NPTkZJR19DUllQVE9fQUVTX0FSTTY0X0NFX0NDTT15CitDT05GSUdfQ1JZUFRPX0FFU19BUk02NF9DRV9CTEs9eQorQ09ORklHX0NSWVBUT19BRVNfQVJNNjRfTkVPTl9CTEs9eQorQ09ORklHX0NSWVBUT19DUkMzMl9BUk02ND15CitDT05GSUdfUU1JX0VOQ0RFQz15CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NvbmZpZ3MvbXNtODk1M19kZWZjb25maWcgYi9hcmNoL2FybTY0L2NvbmZpZ3MvbXNtODk1M19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1MTA4NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvY29uZmlncy9tc204OTUzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDU0MyBAQAorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfRkhBTkRMRSBpcyBub3Qgc2V0CitDT05GSUdfQVVESVQ9eQorIyBDT05GSUdfQVVESVRTWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HPXkKK0NPTkZJR19TQ0hFRF9XQUxUPXkKK0NPTkZJR19UQVNLU1RBVFM9eQorQ09ORklHX1RBU0tfREVMQVlfQUNDVD15CitDT05GSUdfVEFTS19YQUNDVD15CitDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKK0NPTkZJR19SQ1VfRVhQRVJUPXkKK0NPTkZJR19SQ1VfRkFTVF9OT19IWj15CitDT05GSUdfUkNVX05PQ0JfQ1BVPXkKK0NPTkZJR19SQ1VfTk9DQl9DUFVfQUxMPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0NQVV9NQVhfQlVGX1NISUZUPTE3CitDT05GSUdfQ0dST1VQX0RFQlVHPXkKK0NPTkZJR19DR1JPVVBfRlJFRVpFUj15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorQ09ORklHX0NHUk9VUF9TQ0hFRFRVTkU9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKK0NPTkZJR19DR1JPVVBfQlBGPXkKK0NPTkZJR19TQ0hFRF9DT1JFX0NUTD15CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19TQ0hFRF9BVVRPR1JPVVA9eQorQ09ORklHX1NDSEVEX1RVTkU9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX1JEX1haIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEX0xaTyBpcyBub3Qgc2V0CisjIENPTkZJR19SRF9MWjQgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfQlBGX1NZU0NBTEw9eQorIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTUJBUlJJRVIgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkKK0NPTkZJR19BUkNIX01NQVBfUk5EX0NPTVBBVF9CSVRTPTE2CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorQ09ORklHX01PRFVMRV9TSUc9eQorQ09ORklHX01PRFVMRV9TSUdfRk9SQ0U9eQorQ09ORklHX01PRFVMRV9TSUdfU0hBNTEyPXkKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9RQ09NPXkKK0NPTkZJR19BUkNIX01TTTg5NTM9eQorQ09ORklHX1NDSEVEX01DPXkKK0NPTkZJR19OUl9DUFVTPTgKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19IWl8xMDA9eQorQ09ORklHX0NMRUFOQ0FDSEU9eQorQ09ORklHX0NNQT15CitDT05GSUdfQ01BX0RFQlVHRlM9eQorQ09ORklHX1pTTUFMTE9DPXkKK0NPTkZJR19CQUxBTkNFX0FOT05fRklMRV9SRUNMQUlNPXkKK0NPTkZJR19TRUNDT01QPXkKK0NPTkZJR19BUk1WOF9ERVBSRUNBVEVEPXkKK0NPTkZJR19TV1BfRU1VTEFUSU9OPXkKK0NPTkZJR19DUDE1X0JBUlJJRVJfRU1VTEFUSU9OPXkKK0NPTkZJR19TRVRFTkRfRU1VTEFUSU9OPXkKKyMgQ09ORklHX0FSTTY0X1ZIRSBpcyBub3Qgc2V0CitDT05GSUdfQlVJTERfQVJNNjRfQVBQRU5ERURfRFRCX0lNQUdFPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVQ9eQorQ09ORklHX1BNX0FVVE9TTEVFUD15CitDT05GSUdfUE1fV0FLRUxPQ0tTPXkKK0NPTkZJR19QTV9XQUtFTE9DS1NfTElNSVQ9MAorIyBDT05GSUdfUE1fV0FLRUxPQ0tTX0dDIGlzIG5vdCBzZXQKK0NPTkZJR19QTV9ERUJVRz15CitDT05GSUdfQ1BVX0lETEU9eQorQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPXkKK0NPTkZJR19DUFVfRlJFUV9HT1ZfT05ERU1BTkQ9eQorQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkU9eQorQ09ORklHX0NQVV9CT09TVD15CitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk1fVVNFUj15CitDT05GSUdfWEZSTV9TVEFUSVNUSUNTPXkKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JTkVUX0FIPXkKK0NPTkZJR19JTkVUX0VTUD15CitDT05GSUdfSU5FVF9JUENPTVA9eQorQ09ORklHX0lORVRfRElBR19ERVNUUk9ZPXkKK0NPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKK0NPTkZJR19JUFY2X1JPVVRFX0lORk89eQorQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQorQ09ORklHX0lORVQ2X0FIPXkKK0NPTkZJR19JTkVUNl9FU1A9eQorQ09ORklHX0lORVQ2X0lQQ09NUD15CitDT05GSUdfSVBWNl9NSVA2PXkKK0NPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBWNl9TVUJUUkVFUz15CitDT05GSUdfTkVURklMVEVSPXkKK0NPTkZJR19ORl9DT05OVFJBQ0s9eQorQ09ORklHX05GX0NPTk5UUkFDS19TRUNNQVJLPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKK0NPTkZJR19ORl9DVF9QUk9UT19EQ0NQPXkKK0NPTkZJR19ORl9DVF9QUk9UT19TQ1RQPXkKK0NPTkZJR19ORl9DVF9QUk9UT19VRFBMSVRFPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfRlRQPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfSDMyMz15CitDT05GSUdfTkZfQ09OTlRSQUNLX0lSQz15CitDT05GSUdfTkZfQ09OTlRSQUNLX05FVEJJT1NfTlM9eQorQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPXkKK0NPTkZJR19ORl9DT05OVFJBQ0tfU0FORT15CitDT05GSUdfTkZfQ09OTlRSQUNLX1RGVFA9eQorQ09ORklHX05GX0NUX05FVExJTks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTlNFQ01BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJTUVSPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0hBUkRJRExFVElNRVI9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTE9HPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RFRT15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUFJPWFk9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0U9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfU0VDTUFSSz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEFTSExJTUlUPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT15CisjIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTDJUUCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSz15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVEFHVUlEPXkKK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQTI9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQ9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUU9eQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9eQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PXkKK0NPTkZJR19JUF9ORl9JUFRBQkxFUz15CitDT05GSUdfSVBfTkZfTUFUQ0hfQUg9eQorQ09ORklHX0lQX05GX01BVENIX0VDTj15CitDT05GSUdfSVBfTkZfTUFUQ0hfUlBGSUxURVI9eQorQ09ORklHX0lQX05GX01BVENIX1RUTD15CitDT05GSUdfSVBfTkZfRklMVEVSPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPXkKK0NPTkZJR19JUF9ORl9OQVQ9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9eQorQ09ORklHX0lQX05GX01BTkdMRT15CitDT05GSUdfSVBfTkZfUkFXPXkKK0NPTkZJR19JUF9ORl9TRUNVUklUWT15CitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPXkKK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9eQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9eQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PXkKK0NPTkZJR19JUDZfTkZfSVBUQUJMRVM9eQorQ09ORklHX0lQNl9ORl9NQVRDSF9SUEZJTFRFUj15CitDT05GSUdfSVA2X05GX0ZJTFRFUj15CitDT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9eQorQ09ORklHX0lQNl9ORl9NQU5HTEU9eQorQ09ORklHX0lQNl9ORl9SQVc9eQorQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUz15CitDT05GSUdfQlJJREdFX0VCVF9CUk9VVEU9eQorQ09ORklHX0wyVFA9eQorQ09ORklHX0wyVFBfREVCVUdGUz15CitDT05GSUdfTDJUUF9WMz15CitDT05GSUdfTDJUUF9JUD15CitDT05GSUdfTDJUUF9FVEg9eQorQ09ORklHX0JSSURHRT15CitDT05GSUdfTkVUX1NDSEVEPXkKK0NPTkZJR19ORVRfU0NIX0hUQj15CitDT05GSUdfTkVUX1NDSF9QUklPPXkKK0NPTkZJR19ORVRfU0NIX01VTFRJUT15CitDT05GSUdfTkVUX1NDSF9JTkdSRVNTPXkKK0NPTkZJR19ORVRfQ0xTX0ZXPXkKK0NPTkZJR19ORVRfQ0xTX1UzMj15CitDT05GSUdfQ0xTX1UzMl9NQVJLPXkKK0NPTkZJR19ORVRfQ0xTX0ZMT1c9eQorQ09ORklHX05FVF9FTUFUQ0g9eQorQ09ORklHX05FVF9FTUFUQ0hfQ01QPXkKK0NPTkZJR19ORVRfRU1BVENIX05CWVRFPXkKK0NPTkZJR19ORVRfRU1BVENIX1UzMj15CitDT05GSUdfTkVUX0VNQVRDSF9NRVRBPXkKK0NPTkZJR19ORVRfRU1BVENIX1RFWFQ9eQorQ09ORklHX05FVF9DTFNfQUNUPXkKK0NPTkZJR19ORVRfQUNUX0dBQ1Q9eQorQ09ORklHX05FVF9BQ1RfTUlSUkVEPXkKK0NPTkZJR19ORVRfQUNUX1NLQkVESVQ9eQorQ09ORklHX0ROU19SRVNPTFZFUj15CitDT05GSUdfUk1ORVRfREFUQT15CitDT05GSUdfUk1ORVRfREFUQV9GQz15CitDT05GSUdfUk1ORVRfREFUQV9ERUJVR19QS1Q9eQorQ09ORklHX0JUPXkKK0NPTkZJR19NU01fQlRfUE9XRVI9eQorQ09ORklHX0NGRzgwMjExPXkKK0NPTkZJR19DRkc4MDIxMV9JTlRFUk5BTF9SRUdEQj15CisjIENPTkZJR19DRkc4MDIxMV9DUkRBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1JGS0lMTD15CitDT05GSUdfTkZDX05RPXkKK0NPTkZJR19JUENfUk9VVEVSPXkKK0NPTkZJR19JUENfUk9VVEVSX1NFQ1VSSVRZPXkKK0NPTkZJR19GV19MT0FERVJfVVNFUl9IRUxQRVJfRkFMTEJBQ0s9eQorQ09ORklHX0RNQV9DTUE9eQorQ09ORklHX1pSQU09eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX1FTRUVDT009eQorQ09ORklHX1VJRF9TWVNfU1RBVFM9eQorQ09ORklHX01FTU9SWV9TVEFURV9USU1FPXkKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19DSFJfREVWX1NDSD15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfTE9HR0lORz15CitDT05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKK0NPTkZJR19TQ1NJX1VGU0hDRD15CitDT05GSUdfU0NTSV9VRlNIQ0RfUExBVEZPUk09eQorQ09ORklHX1NDU0lfVUZTX1FDT009eQorQ09ORklHX1NDU0lfVUZTX1FDT01fSUNFPXkKK0NPTkZJR19TQ1NJX1VGU0hDRF9DTURfTE9HR0lORz15CitDT05GSUdfTUQ9eQorQ09ORklHX0JMS19ERVZfRE09eQorQ09ORklHX0RNX0RFQlVHPXkKK0NPTkZJR19ETV9DUllQVD15CitDT05GSUdfRE1fUkVRX0NSWVBUPXkKK0NPTkZJR19ETV9VRVZFTlQ9eQorQ09ORklHX0RNX1ZFUklUWT15CitDT05GSUdfRE1fVkVSSVRZX0ZFQz15CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorQ09ORklHX1RVTj15CitDT05GSUdfUFBQPXkKK0NPTkZJR19QUFBfQlNEQ09NUD15CitDT05GSUdfUFBQX0RFRkxBVEU9eQorQ09ORklHX1BQUF9GSUxURVI9eQorQ09ORklHX1BQUF9NUFBFPXkKK0NPTkZJR19QUFBfTVVMVElMSU5LPXkKK0NPTkZJR19QUFBPRT15CitDT05GSUdfUFBQT0wyVFA9eQorQ09ORklHX1BQUE9MQUM9eQorQ09ORklHX1BQUE9QTlM9eQorQ09ORklHX1BQUF9BU1lOQz15CitDT05GSUdfUFBQX1NZTkNfVFRZPXkKK0NPTkZJR19XQ05TU19NRU1fUFJFX0FMTE9DPXkKK0NPTkZJR19DTERfTExfQ09SRT15CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX0tFWUJPQVJEX0dQSU89eQorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0pPWVNUSUNLPXkKK0NPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CitDT05GSUdfSU5QVVRfTUlTQz15CitDT05GSUdfSU5QVVRfSEJUUF9JTlBVVD15CitDT05GSUdfSU5QVVRfVUlOUFVUPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9NU009eQorQ09ORklHX1NFUklBTF9NU01fQ09OU09MRT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19IV19SQU5ET01fTVNNX0xFR0FDWT15CitDT05GSUdfTVNNX0FEU1BSUEM9eQorQ09ORklHX01TTV9SREJHPW0KK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfU1BJPXkKK0NPTkZJR19TUElfUVVQPXkKK0NPTkZJR19TUElfU1BJREVWPXkKK0NPTkZJR19TTElNQlVTX01TTV9OR0Q9eQorQ09ORklHX1NQTUk9eQorQ09ORklHX1NQTUlfTVNNX1BNSUNfQVJCX0RFQlVHPXkKK0NPTkZJR19QSU5DVFJMX01TTTg5NTM9eQorQ09ORklHX1BJTkNUUkxfUUNPTV9TUE1JX1BNSUM9eQorQ09ORklHX0dQSU9MSUI9eQorQ09ORklHX0dQSU9fU1lTRlM9eQorQ09ORklHX1BPV0VSX1JFU0VUX1FDT009eQorQ09ORklHX1FDT01fRExPQURfTU9ERT15CitDT05GSUdfUE9XRVJfUkVTRVRfWEdFTkU9eQorQ09ORklHX1BPV0VSX1JFU0VUX1NZU0NPTj15CitDT05GSUdfU0VOU09SU19RUE5QX0FEQ19WT0xUQUdFPXkKK0NPTkZJR19USEVSTUFMPXkKK0NPTkZJR19USEVSTUFMX1FQTlA9eQorQ09ORklHX1RIRVJNQUxfUVBOUF9BRENfVE09eQorQ09ORklHX1RIRVJNQUxfVFNFTlM9eQorQ09ORklHX01TTV9CQ0xfUEVSSVBIRVJBTF9DVEw9eQorQ09ORklHX1FUSV9USEVSTUFMX0xJTUlUU19EQ1ZTPXkKK0NPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CitDT05GSUdfUkVHVUxBVE9SX0NQUkhfS0JTUz15CitDT05GSUdfUkVHVUxBVE9SX1FQTlBfTEFCSUJCPXkKK0NPTkZJR19SRUdVTEFUT1JfUVBOUD15CitDT05GSUdfUkVHVUxBVE9SX1NUVUI9eQorQ09ORklHX01FRElBX1NVUFBPUlQ9eQorQ09ORklHX01FRElBX0NBTUVSQV9TVVBQT1JUPXkKK0NPTkZJR19NRURJQV9DT05UUk9MTEVSPXkKK0NPTkZJR19WSURFT19WNEwyX1NVQkRFVl9BUEk9eQorQ09ORklHX1Y0TF9QTEFURk9STV9EUklWRVJTPXkKK0NPTkZJR19NU01fVklEQ19WNEwyPXkKK0NPTkZJR19NU01fVklEQ19HT1ZFUk5PUlM9eQorQ09ORklHX01TTV9TREVfUk9UQVRPUj15CitDT05GSUdfTVNNX1NERV9ST1RBVE9SX0VWVExPR19ERUJVRz15CitDT05GSUdfUUNPTV9LR1NMPXkKK0NPTkZJR19EUk09eQorQ09ORklHX0RSTV9TREVfRVZUTE9HX0RFQlVHPXkKK0NPTkZJR19EUk1fU0RFX1JTQz15CitDT05GSUdfRkJfVklSVFVBTD15CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dPX0xJTlVYX1ZHQTE2IGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORD15CitDT05GSUdfU05EPXkKK0NPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlM9eQorQ09ORklHX1NORF9TT0M9eQorQ09ORklHX1VISUQ9eQorQ09ORklHX0hJRF9BUFBMRT15CitDT05GSUdfSElEX0VMRUNPTT15CitDT05GSUdfSElEX01BR0lDTU9VU0U9eQorQ09ORklHX0hJRF9NSUNST1NPRlQ9eQorQ09ORklHX0hJRF9NVUxUSVRPVUNIPXkKK0NPTkZJR19VU0JfRFdDMz15CitDT05GSUdfTk9QX1VTQl9YQ0VJVj15CitDT05GSUdfRFVBTF9ST0xFX1VTQl9JTlRGPXkKK0NPTkZJR19VU0JfTVNNX1NTUEhZX1FNUD15CitDT05GSUdfTVNNX1FVU0JfUEhZPXkKK0NPTkZJR19VU0JfR0FER0VUPXkKK0NPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTPXkKK0NPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZTPXkKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz01MDAKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19QRVJGX1BST0ZJTElORz15CitDT05GSUdfTU1DX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19NTUNfUEFSQU5PSURfU0RfSU5JVD15CitDT05GSUdfTU1DX0NMS0dBVEU9eQorQ09ORklHX01NQ19CTE9DS19NSU5PUlM9MzIKK0NPTkZJR19NTUNfQkxPQ0tfREVGRVJSRURfUkVTVU1FPXkKK0NPTkZJR19NTUNfVEVTVD15CitDT05GSUdfTU1DX1NESENJPXkKK0NPTkZJR19NTUNfU0RIQ0lfUExURk09eQorQ09ORklHX01NQ19TREhDSV9NU009eQorQ09ORklHX05FV19MRURTPXkKK0NPTkZJR19MRURTX0NMQVNTPXkKK0NPTkZJR19MRURTX1FQTlA9eQorQ09ORklHX0xFRFNfUVBOUF9XTEVEPXkKK0NPTkZJR19MRURTX1RSSUdHRVJTPXkKK0NPTkZJR19FREFDPXkKK0NPTkZJR19FREFDX01NX0VEQUM9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9RUE5QPXkKK0NPTkZJR19ETUFERVZJQ0VTPXkKK0NPTkZJR19RQ09NX1NQU19ETUE9eQorQ09ORklHX1VJTz15CitDT05GSUdfVUlPX01TTV9TSEFSRURNRU09eQorQ09ORklHX1NUQUdJTkc9eQorQ09ORklHX0FTSE1FTT15CitDT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUj15CitDT05GSUdfSU9OPXkKK0NPTkZJR19JT05fTVNNPXkKK0NPTkZJR19HU0k9eQorQ09ORklHX0lQQTM9eQorQ09ORklHX1JNTkVUX0lQQTM9eQorQ09ORklHX1JORElTX0lQQT15CitDT05GSUdfU1BTPXkKK0NPTkZJR19TUFNfU1VQUE9SVF9ORFBfQkFNPXkKK0NPTkZJR19RUE5QX0NPSU5DRUxMPXkKK0NPTkZJR19RUE5QX1JFVklEPXkKK0NPTkZJR19VU0JfQkFNPXkKK0NPTkZJR19RQ09NX01EU1NfUExMPXkKK0NPTkZJR19SRU1PVEVfU1BJTkxPQ0tfTVNNPXkKK0NPTkZJR19NQUlMQk9YPXkKK0NPTkZJR19BUk1fU01NVT15CitDT05GSUdfSU9NTVVfREVCVUc9eQorQ09ORklHX0lPTU1VX0RFQlVHX1RSQUNLSU5HPXkKK0NPTkZJR19JT01NVV9URVNUUz15CitDT05GSUdfTVNNX0JPT1RfU1RBVFM9eQorQ09ORklHX01TTV9DT1JFX0hBTkdfREVURUNUPXkKK0NPTkZJR19NU01fR0xBRElBVE9SX0hBTkdfREVURUNUPXkKK0NPTkZJR19RQ09NX0VVRD15CitDT05GSUdfUUNPTV9XQVRDSERPR19WMj15CitDT05GSUdfUUNPTV9NRU1PUllfRFVNUF9WMj15CitDT05GSUdfUUNPTV9TRUNVUkVfQlVGRkVSPXkKK0NPTkZJR19RQ09NX0VBUkxZX1JBTkRPTT15CitDT05GSUdfTVNNX1NNRU09eQorQ09ORklHX01TTV9HTElOSz15CitDT05GSUdfTVNNX0dMSU5LX0xPT1BCQUNLX1NFUlZFUj15CitDT05GSUdfTVNNX0dMSU5LX1NNRU1fTkFUSVZFX1hQUlQ9eQorQ09ORklHX01TTV9HTElOS19TUElfWFBSVD15CitDT05GSUdfVFJBQ0VSX1BLVD15CitDT05GSUdfTVNNX1NNUDJQPXkKK0NPTkZJR19NU01fU01QMlBfVEVTVD15CitDT05GSUdfTVNNX0lQQ19ST1VURVJfR0xJTktfWFBSVD15CitDT05GSUdfTVNNX1FNSV9JTlRFUkZBQ0U9eQorQ09ORklHX01TTV9HTElOS19QS1Q9eQorQ09ORklHX01TTV9TVUJTWVNURU1fUkVTVEFSVD15CitDT05GSUdfTVNNX1BJTD15CitDT05GSUdfTVNNX1BJTF9TU1JfR0VORVJJQz15CitDT05GSUdfTVNNX1BJTF9NU1NfUURTUDZWNT15CitDT05GSUdfSUNOU1M9eQorQ09ORklHX01TTV9QRVJGT1JNQU5DRT15CitDT05GSUdfTVNNX0VWRU5UX1RJTUVSPXkKK0NPTkZJR19NU01fUE09eQorQ09ORklHX1FUSV9SUE1fU1RBVFNfTE9HPXkKK0NPTkZJR19RQ09NX0ZPUkNFX1dET0dfQklURV9PTl9QQU5JQz15CitDT05GSUdfUFdNPXkKK0NPTkZJR19QV01fUVBOUD15CitDT05GSUdfQVJNX0dJQ19WM19BQ0w9eQorQ09ORklHX0FORFJPSUQ9eQorQ09ORklHX0FORFJPSURfQklOREVSX0lQQz15CitDT05GSUdfU0VOU09SU19TU0M9eQorQ09ORklHX01TTV9UWl9MT0c9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQorQ09ORklHX1FVT1RBPXkKK0NPTkZJR19RVU9UQV9ORVRMSU5LX0lOVEVSRkFDRT15CitDT05GSUdfRlVTRV9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CitDT05GSUdfRUNSWVBUX0ZTPXkKK0NPTkZJR19FQ1JZUFRfRlNfTUVTU0FHSU5HPXkKKyMgQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19EWU5BTUlDX0RFQlVHPXkKK0NPTkZJR19ERUJVR19JTkZPPXkKK0NPTkZJR19QQUdFX09XTkVSPXkKK0NPTkZJR19QQUdFX09XTkVSX0VOQUJMRV9ERUZBVUxUPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfUEFHRUFMTE9DPXkKK0NPTkZJR19TTFVCX0RFQlVHX1BBTklDX09OPXkKK0NPTkZJR19ERUJVR19QQUdFQUxMT0NfRU5BQkxFX0RFRkFVTFQ9eQorQ09ORklHX1BBR0VfUE9JU09OSU5HPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTX0ZSRUU9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfVElNRVJTPXkKK0NPTkZJR19ERUJVR19PQkpFQ1RTX1dPUks9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQ9eQorQ09ORklHX0RFQlVHX09CSkVDVFNfUEVSQ1BVX0NPVU5URVI9eQorQ09ORklHX1NMVUJfREVCVUdfT049eQorQ09ORklHX0RFQlVHX0tNRU1MRUFLPXkKK0NPTkZJR19ERUJVR19LTUVNTEVBS19FQVJMWV9MT0dfU0laRT00MDAwCitDT05GSUdfREVCVUdfS01FTUxFQUtfREVGQVVMVF9PRkY9eQorQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFPXkKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CitDT05GSUdfTE9DS1VQX0RFVEVDVE9SPXkKK0NPTkZJR19XUV9XQVRDSERPRz15CitDT05GSUdfUEFOSUNfVElNRU9VVD01CitDT05GSUdfUEFOSUNfT05fU0NIRURfQlVHPXkKK0NPTkZJR19QQU5JQ19PTl9SVF9USFJPVFRMSU5HPXkKK0NPTkZJR19TQ0hFRFNUQVRTPXkKK0NPTkZJR19TQ0hFRF9TVEFDS19FTkRfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0s9eQorQ09ORklHX0RFQlVHX01VVEVYRVM9eQorQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUD15CitDT05GSUdfREVCVUdfTElTVD15CitDT05GSUdfRkFVTFRfSU5KRUNUSU9OPXkKK0NPTkZJR19GQUlMX1BBR0VfQUxMT0M9eQorQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUz15CitDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSPXkKK0NPTkZJR19JUENfTE9HR0lORz15CitDT05GSUdfUUNPTV9SVEI9eQorQ09ORklHX1FDT01fUlRCX1NFUEFSQVRFX0NQVVM9eQorQ09ORklHX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSVJRU09GRl9UUkFDRVI9eQorQ09ORklHX1BSRUVNUFRfVFJBQ0VSPXkKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKK0NPTkZJR19DUFVfRlJFUV9TV0lUQ0hfUFJPRklMRVI9eQorQ09ORklHX0xLRFRNPXkKK0NPTkZJR19NRU1URVNUPXkKK0NPTkZJR19QQU5JQ19PTl9EQVRBX0NPUlJVUFRJT049eQorQ09ORklHX0FSTTY0X1BURFVNUD15CitDT05GSUdfUElEX0lOX0NPTlRFWFRJRFI9eQorQ09ORklHX0NPUkVTSUdIVD15CitDT05GSUdfQ09SRVNJR0hUX1JFTU9URV9FVE09eQorQ09ORklHX0NPUkVTSUdIVF9SRU1PVEVfRVRNX0RFRkFVTFRfRU5BQkxFPTAKK0NPTkZJR19DT1JFU0lHSFRfU1RNPXkKK0NPTkZJR19DT1JFU0lHSFRfVFBEQT15CitDT05GSUdfQ09SRVNJR0hUX1RQRE09eQorQ09ORklHX0NPUkVTSUdIVF9DVEk9eQorQ09ORklHX0NPUkVTSUdIVF9FVkVOVD15CitDT05GSUdfQ09SRVNJR0hUX0hXRVZFTlQ9eQorQ09ORklHX1NFQ1VSSVRZX1BFUkZfRVZFTlRTX1JFU1RSSUNUPXkKK0NPTkZJR19TRUNVUklUWT15CitDT05GSUdfSEFSREVORURfVVNFUkNPUFk9eQorQ09ORklHX1NFQ1VSSVRZX1NFTElOVVg9eQorQ09ORklHX1NFQ1VSSVRZX1NNQUNLPXkKK0NPTkZJR19DUllQVE9fQ1RSPXkKK0NPTkZJR19DUllQVE9fWENCQz15CitDT05GSUdfQ1JZUFRPX01END15CitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9eQorQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HPXkKK0NPTkZJR19DUllQVE9fREVWX1FDT01fTVNNX1FDRT15CitDT05GSUdfQ1JZUFRPX0RFVl9RQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fREVWX1FDRURFVj15CitDT05GSUdfQ1JZUFRPX0RFVl9RQ09NX0lDRT15CitDT05GSUdfQVJNNjRfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fU0hBMV9BUk02NF9DRT15CitDT05GSUdfQ1JZUFRPX1NIQTJfQVJNNjRfQ0U9eQorQ09ORklHX0NSWVBUT19HSEFTSF9BUk02NF9DRT15CitDT05GSUdfQ1JZUFRPX0FFU19BUk02NF9DRV9DQ009eQorQ09ORklHX0NSWVBUT19BRVNfQVJNNjRfQ0VfQkxLPXkKK0NPTkZJR19DUllQVE9fQUVTX0FSTTY0X05FT05fQkxLPXkKK0NPTkZJR19DUllQVE9fQ1JDMzJfQVJNNjQ9eQorQ09ORklHX1FNSV9FTkNERUM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jb25maWdzL3NkbTY3MC1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtNjQvY29uZmlncy9zZG02NzAtcGVyZl9kZWZjb25maWcKaW5kZXggMWI1ZWFjOC4uZTA1ZjM5NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jb25maWdzL3NkbTY3MC1wZXJmX2RlZmNvbmZpZworKysgYi9hcmNoL2FybTY0L2NvbmZpZ3Mvc2RtNjcwLXBlcmZfZGVmY29uZmlnCkBAIC03LDYgKzcsOSBAQAogQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORz15CiBDT05GSUdfU0NIRURfV0FMVD15CitDT05GSUdfVEFTS1NUQVRTPXkKK0NPTkZJR19UQVNLX1hBQ0NUPXkKK0NPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkc9eQogQ09ORklHX1JDVV9FWFBFUlQ9eQogQ09ORklHX1JDVV9GQVNUX05PX0haPXkKIENPTkZJR19SQ1VfTk9DQl9DUFU9eQpAQCAtMTI3LDYgKzEzMCw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9JRExFVElNRVI9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSEFSRElETEVUSU1FUj15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9MT0c9eQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz15CkBAIC0yMDIsNiArMjA2LDggQEAKIENPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQogQ09ORklHX05FVF9DTFNfRlc9eQogQ09ORklHX05FVF9DTFNfVTMyPXkKK0NPTkZJR19DTFNfVTMyX01BUks9eQorQ09ORklHX05FVF9DTFNfRkxPVz15CiBDT05GSUdfTkVUX0VNQVRDSD15CiBDT05GSUdfTkVUX0VNQVRDSF9DTVA9eQogQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9eQpAQCAtMjMwLDcgKzIzNiw5IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgogQ09ORklHX1FTRUVDT009eQorQ09ORklHX1VJRF9TWVNfU1RBVFM9eQogQ09ORklHX01FTU9SWV9TVEFURV9USU1FPXkKK0NPTkZJR19RUE5QX01JU0M9eQogQ09ORklHX1NDU0k9eQogQ09ORklHX0JMS19ERVZfU0Q9eQogQ09ORklHX0NIUl9ERVZfU0c9eQpAQCAtMjYwLDkgKzI2OCwxNSBAQAogQ09ORklHX1BQUD15CiBDT05GSUdfUFBQX0JTRENPTVA9eQogQ09ORklHX1BQUF9ERUZMQVRFPXkKK0NPTkZJR19QUFBfRklMVEVSPXkKIENPTkZJR19QUFBfTVBQRT15CitDT05GSUdfUFBQX01VTFRJTElOSz15CitDT05GSUdfUFBQT0U9eQorQ09ORklHX1BQUE9MMlRQPXkKIENPTkZJR19QUFBPTEFDPXkKIENPTkZJR19QUFBPUE5TPXkKK0NPTkZJR19QUFBfQVNZTkM9eQorQ09ORklHX1BQUF9TWU5DX1RUWT15CiBDT05GSUdfVVNCX1VTQk5FVD15CiBDT05GSUdfV0lMNjIxMD1tCiAjIENPTkZJR19XSUw2MjEwX1RSQUNJTkcgaXMgbm90IHNldApAQCAtMjg5LDcgKzMwMyw2IEBACiBDT05GSUdfTVNNX1JEQkc9bQogQ09ORklHX0kyQ19DSEFSREVWPXkKIENPTkZJR19JMkNfUUNPTV9HRU5JPXkKLUNPTkZJR19TT1VORFdJUkU9eQogQ09ORklHX1NQST15CiBDT05GSUdfU1BJX1FVUD15CiBDT05GSUdfU1BJX1FDT01fR0VOST15CkBAIC0zMjEsMTcgKzMzNCwyMSBAQAogQ09ORklHX1RIRVJNQUxfUVBOUD15CiBDT05GSUdfVEhFUk1BTF9RUE5QX0FEQ19UTT15CiBDT05GSUdfVEhFUk1BTF9UU0VOUz15CitDT05GSUdfTVNNX0JDTF9QRVJJUEhFUkFMX0NUTD15CiBDT05GSUdfUVRJX1RIRVJNQUxfTElNSVRTX0RDVlM9eQogQ09ORklHX1FUSV9WSVJUVUFMX1NFTlNPUj15CiBDT05GSUdfUVRJX0FPUF9SRUdfQ09PTElOR19ERVZJQ0U9eQogQ09ORklHX1FUSV9RTUlfQ09PTElOR19ERVZJQ0U9eQorQ09ORklHX1JFR1VMQVRPUl9DT09MSU5HX0RFVklDRT15CiBDT05GSUdfTUZEX0kyQ19QTUlDPXkKIENPTkZJR19NRkRfU1BNSV9QTUlDPXkKLUNPTkZJR19XQ0Q5WFhYX0NPREVDX0NPUkU9eQogQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFPXkKIENPTkZJR19SRUdVTEFUT1JfQ1BSSF9LQlNTPXkKIENPTkZJR19SRUdVTEFUT1JfUVBOUF9MQUJJQkI9eQorQ09ORklHX1JFR1VMQVRPUl9RUE5QX0xDREI9eQorQ09ORklHX1JFR1VMQVRPUl9RUE5QX09MRURCPXkKIENPTkZJR19SRUdVTEFUT1JfUVBOUD15CitDT05GSUdfUkVHVUxBVE9SX1JFRkdFTj15CiBDT05GSUdfUkVHVUxBVE9SX1JQTUg9eQogQ09ORklHX1JFR1VMQVRPUl9TVFVCPXkKIENPTkZJR19NRURJQV9TVVBQT1JUPXkKQEAgLTM2Myw2ICszODAsNyBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkQ9eQogQ09ORklHX1NORD15CitDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXkKIENPTkZJR19TTkRfVVNCX0FVRElPPXkKIENPTkZJR19TTkRfVVNCX0FVRElPX1FNST15CiBDT05GSUdfU05EX1NPQz15CkBAIC0zODgsNiArNDA2LDcgQEAKIENPTkZJR19VU0JfUERfUE9MSUNZPXkKIENPTkZJR19RUE5QX1VTQl9QRFBIWT15CiBDT05GSUdfVVNCX0VIU0VUX1RFU1RfRklYVFVSRT15CitDT05GSUdfVVNCX0xJTktfTEFZRVJfVEVTVD15CiBDT05GSUdfTk9QX1VTQl9YQ0VJVj15CiBDT05GSUdfRFVBTF9ST0xFX1VTQl9JTlRGPXkKIENPTkZJR19VU0JfTVNNX1NTUEhZX1FNUD15CkBAIC00MjAsNiArNDM5LDcgQEAKIENPTkZJR19NTUNfU0RIQ0k9eQogQ09ORklHX01NQ19TREhDSV9QTFRGTT15CiBDT05GSUdfTU1DX1NESENJX01TTT15CitDT05GSUdfTU1DX0NRX0hDST15CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQogQ09ORklHX0xFRFNfUVBOUD15CkBAIC00NTEsOSArNDcxLDE0IEBACiBDT05GSUdfTVNNXzExQUQ9bQogQ09ORklHX1NFRU1QX0NPUkU9eQogQ09ORklHX1FDT01fR0VOSV9TRT15CitDT05GSUdfTVNNX0dDQ19TRE04NDU9eQorQ09ORklHX01TTV9WSURFT0NDX1NETTg0NT15CitDT05GSUdfTVNNX0NBTUNDX1NETTg0NT15CitDT05GSUdfTVNNX0RJU1BDQ19TRE04NDU9eQogQ09ORklHX0NMT0NLX1FQTlBfRElWPXkKIENPTkZJR19NU01fQ0xLX1JQTUg9eQogQ09ORklHX0NMT0NLX0NQVV9PU009eQorQ09ORklHX01TTV9HUFVDQ19TRE04NDU9eQogQ09ORklHX01TTV9DTEtfQU9QX1FNUD15CiBDT05GSUdfUUNPTV9NRFNTX1BMTD15CiBDT05GSUdfUkVNT1RFX1NQSU5MT0NLX01TTT15CkBAIC00NzIsNyArNDk3LDEwIEBACiBDT05GSUdfTVNNX0JPT1RfU1RBVFM9eQogQ09ORklHX1FDT01fRVVEPXkKIENPTkZJR19RQ09NX1dBVENIRE9HX1YyPXkKK0NPTkZJR19RUE5QX1BCUz15CiBDT05GSUdfUUNPTV9NRU1PUllfRFVNUF9WMj15CitDT05GSUdfUUNPTV9CVVNfU0NBTElORz15CitDT05GSUdfUUNPTV9CVVNfQ09ORklHX1JQTUg9eQogQ09ORklHX1FDT01fU0VDVVJFX0JVRkZFUj15CiBDT05GSUdfUUNPTV9FQVJMWV9SQU5ET009eQogQ09ORklHX01TTV9TTUVNPXkKQEAgLTQ5MSwxOCArNTE5LDIyIEBACiBDT05GSUdfTVNNX0dMSU5LX1BLVD15CiBDT05GSUdfTVNNX1NVQlNZU1RFTV9SRVNUQVJUPXkKIENPTkZJR19NU01fUElMPXkKK0NPTkZJR19NU01fU1lTTU9OX0dMSU5LX0NPTU09eQogQ09ORklHX01TTV9QSUxfU1NSX0dFTkVSSUM9eQogQ09ORklHX01TTV9QSUxfTVNTX1FEU1A2VjU9eQogQ09ORklHX0lDTlNTPXkKIENPTkZJR19RQ09NX0NPTU1BTkRfREI9eQogQ09ORklHX01TTV9QRVJGT1JNQU5DRT15CiBDT05GSUdfTVNNX0NEU1BfTE9BREVSPXkKK0NPTkZJR19RQ09NX1NNQ0lOVk9LRT15CiBDT05GSUdfTVNNX0VWRU5UX1RJTUVSPXkKIENPTkZJR19NU01fUE09eQogQ09ORklHX01TTV9RQlQxMDAwPXkKIENPTkZJR19BUFNTX0NPUkVfRUE9eQogQ09ORklHX1FUSV9SUE1fU1RBVFNfTE9HPXkKIENPTkZJR19RQ09NX0ZPUkNFX1dET0dfQklURV9PTl9QQU5JQz15CitDT05GSUdfUU1QX0RFQlVHRlNfQ0xJRU5UPXkKK0NPTkZJR19NU01fUkVNT1RFUURTUz15CiBDT05GSUdfUUNPTV9CSU1DX0JXTU9OPXkKIENPTkZJR19BUk1fTUVNTEFUX01PTj15CiBDT05GSUdfUUNPTUNDSV9IV01PTj15CkBAIC01NTMsMTMgKzU4NSwxNiBAQAogQ09ORklHX0NPUkVTSUdIVF9UUERBPXkKIENPTkZJR19DT1JFU0lHSFRfVFBETT15CiBDT05GSUdfQ09SRVNJR0hUX0NUST15CitDT05GSUdfQ09SRVNJR0hUX0VWRU5UPXkKIENPTkZJR19DT1JFU0lHSFRfSFdFVkVOVD15CiBDT05GSUdfQ09SRVNJR0hUX0RVTU1ZPXkKIENPTkZJR19TRUNVUklUWV9QRVJGX0VWRU5UU19SRVNUUklDVD15CiBDT05GSUdfU0VDVVJJVFk9eQogQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZPXkKK0NPTkZJR19GT1JUSUZZX1NPVVJDRT15CiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWD15CiBDT05GSUdfU0VDVVJJVFlfU01BQ0s9eQorQ09ORklHX0NSWVBUT19DVFI9eQogQ09ORklHX0NSWVBUT19YQ0JDPXkKIENPTkZJR19DUllQVE9fTUQ0PXkKIENPTkZJR19DUllQVE9fVFdPRklTSD15CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NvbmZpZ3Mvc2RtNjcwX2RlZmNvbmZpZyBiL2FyY2gvYXJtNjQvY29uZmlncy9zZG02NzBfZGVmY29uZmlnCmluZGV4IGUyYzY0NzQuLmI0Nzg1MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvY29uZmlncy9zZG02NzBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvY29uZmlncy9zZG02NzBfZGVmY29uZmlnCkBAIC0yMywyMyArMjMsMjYgQEAKIENPTkZJR19DR1JPVVBfQ1BVQUNDVD15CiBDT05GSUdfQ0dST1VQX1NDSEVEVFVORT15CiBDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0NHUk9VUF9CUEY9eQogQ09ORklHX1NDSEVEX0NPUkVfQ1RMPXkKIENPTkZJR19OQU1FU1BBQ0VTPXkKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX0FVVE9HUk9VUD15CiBDT05GSUdfU0NIRURfVFVORT15CitDT05GSUdfREVGQVVMVF9VU0VfRU5FUkdZX0FXQVJFPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiAjIENPTkZJR19SRF9YWiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk8gaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFo0IGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX0JQRl9TWVNDQUxMPXkKICMgQ09ORklHX0FJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1CQVJSSUVSIGlzIG5vdCBzZXQKIENPTkZJR19FTUJFRERFRD15CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19QUk9GSUxJTkc9eQotQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX1JFR1VMQVI9eQorQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX1NUUk9ORz15CiBDT05GSUdfQVJDSF9NTUFQX1JORF9DT01QQVRfQklUUz0xNgogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQpAQCAtMTMyLDYgKzEzNSw3IEBACiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OU0VDTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9JRExFVElNRVI9eQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSEFSRElETEVUSU1FUj15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9MT0c9eQogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz15CiBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRz15CkBAIC0xNTksNiArMTYzLDcgQEAKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPXkKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPXkKIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT15CitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FUQUdVSUQ9eQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT15CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBMj15CiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBMl9MT0c9eQpAQCAtMjM0LDYgKzIzOSw3IEBACiBDT05GSUdfSVBDX1JPVVRFUj15CiBDT05GSUdfSVBDX1JPVVRFUl9TRUNVUklUWT15CiBDT05GSUdfRldfTE9BREVSX1VTRVJfSEVMUEVSX0ZBTExCQUNLPXkKK0NPTkZJR19SRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUz15CiBDT05GSUdfRE1BX0NNQT15CiBDT05GSUdfWlJBTT15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKQEAgLTI0Miw2ICsyNDgsNyBAQAogQ09ORklHX1FTRUVDT009eQogQ09ORklHX1VJRF9TWVNfU1RBVFM9eQogQ09ORklHX01FTU9SWV9TVEFURV9USU1FPXkKK0NPTkZJR19RUE5QX01JU0M9eQogQ09ORklHX1NDU0k9eQogQ09ORklHX0JMS19ERVZfU0Q9eQogQ09ORklHX0NIUl9ERVZfU0c9eQpAQCAtMjY3LDkgKzI3NCwxNSBAQAogQ09ORklHX1BQUD15CiBDT05GSUdfUFBQX0JTRENPTVA9eQogQ09ORklHX1BQUF9ERUZMQVRFPXkKK0NPTkZJR19QUFBfRklMVEVSPXkKIENPTkZJR19QUFBfTVBQRT15CitDT05GSUdfUFBQX01VTFRJTElOSz15CitDT05GSUdfUFBQT0U9eQorQ09ORklHX1BQUE9MMlRQPXkKIENPTkZJR19QUFBPTEFDPXkKIENPTkZJR19QUFBPUE5TPXkKK0NPTkZJR19QUFBfQVNZTkM9eQorQ09ORklHX1BQUF9TWU5DX1RUWT15CiBDT05GSUdfVVNCX1VTQk5FVD15CiBDT05GSUdfV0lMNjIxMD1tCiBDT05GSUdfV0NOU1NfTUVNX1BSRV9BTExPQz15CkBAIC0yOTQsNyArMzA3LDYgQEAKIENPTkZJR19NU01fQURTUFJQQz15CiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19RQ09NX0dFTkk9eQotQ09ORklHX1NPVU5EV0lSRT15CiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfUVVQPXkKIENPTkZJR19TUElfUUNPTV9HRU5JPXkKQEAgLTMzMCwxMiArMzQyLDE3IEBACiBDT05GSUdfUVRJX1RIRVJNQUxfTElNSVRTX0RDVlM9eQogQ09ORklHX1FUSV9WSVJUVUFMX1NFTlNPUj15CiBDT05GSUdfUVRJX0FPUF9SRUdfQ09PTElOR19ERVZJQ0U9eQorQ09ORklHX1FUSV9RTUlfQ09PTElOR19ERVZJQ0U9eQorQ09ORklHX1JFR1VMQVRPUl9DT09MSU5HX0RFVklDRT15CiBDT05GSUdfTUZEX0kyQ19QTUlDPXkKIENPTkZJR19NRkRfU1BNSV9QTUlDPXkKIENPTkZJR19SRUdVTEFUT1JfRklYRURfVk9MVEFHRT15CiBDT05GSUdfUkVHVUxBVE9SX0NQUkhfS0JTUz15CiBDT05GSUdfUkVHVUxBVE9SX1FQTlBfTEFCSUJCPXkKK0NPTkZJR19SRUdVTEFUT1JfUVBOUF9MQ0RCPXkKK0NPTkZJR19SRUdVTEFUT1JfUVBOUF9PTEVEQj15CiBDT05GSUdfUkVHVUxBVE9SX1FQTlA9eQorQ09ORklHX1JFR1VMQVRPUl9SRUZHRU49eQogQ09ORklHX1JFR1VMQVRPUl9SUE1IPXkKIENPTkZJR19SRUdVTEFUT1JfU1RVQj15CiBDT05GSUdfTUVESUFfU1VQUE9SVD15CkBAIC0zNjIsMTAgKzM3OSwxMCBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfU09VTkQ9eQogQ09ORklHX1NORD15CitDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTPXkKIENPTkZJR19TTkRfVVNCX0FVRElPPXkKIENPTkZJR19TTkRfVVNCX0FVRElPX1FNST15CiBDT05GSUdfU05EX1NPQz15Ci1DT05GSUdfU05EX1NPQ19TRE04NDU9eQogQ09ORklHX1VISUQ9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX01JQ1JPU09GVD15CkBAIC0zODMsNiArNDAwLDcgQEAKIENPTkZJR19VU0JfUERfUE9MSUNZPXkKIENPTkZJR19RUE5QX1VTQl9QRFBIWT15CiBDT05GSUdfVVNCX0VIU0VUX1RFU1RfRklYVFVSRT15CitDT05GSUdfVVNCX0xJTktfTEFZRVJfVEVTVD15CiBDT05GSUdfTk9QX1VTQl9YQ0VJVj15CiBDT05GSUdfRFVBTF9ST0xFX1VTQl9JTlRGPXkKIENPTkZJR19VU0JfTVNNX1NTUEhZX1FNUD15CkBAIC00MDgsNiArNDI2LDcgQEAKIENPTkZJR19NTUM9eQogQ09ORklHX01NQ19QRVJGX1BST0ZJTElORz15CiBDT05GSUdfTU1DX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19NTUNfUEFSQU5PSURfU0RfSU5JVD15CiBDT05GSUdfTU1DX0NMS0dBVEU9eQogQ09ORklHX01NQ19CTE9DS19NSU5PUlM9MzIKIENPTkZJR19NTUNfQkxPQ0tfREVGRVJSRURfUkVTVU1FPXkKQEAgLTQxNSw2ICs0MzQsNyBAQAogQ09ORklHX01NQ19TREhDST15CiBDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKIENPTkZJR19NTUNfU0RIQ0lfTVNNPXkKK0NPTkZJR19NTUNfQ1FfSENJPXkKIENPTkZJR19ORVdfTEVEUz15CiBDT05GSUdfTEVEU19DTEFTUz15CiBDT05GSUdfTEVEU19RUE5QPXkKQEAgLTQ1Myw5ICs0NzMsMTQgQEAKIENPTkZJR19NU01fMTFBRD1tCiBDT05GSUdfU0VFTVBfQ09SRT15CiBDT05GSUdfUUNPTV9HRU5JX1NFPXkKK0NPTkZJR19NU01fR0NDX1NETTg0NT15CitDT05GSUdfTVNNX1ZJREVPQ0NfU0RNODQ1PXkKK0NPTkZJR19NU01fQ0FNQ0NfU0RNODQ1PXkKK0NPTkZJR19NU01fRElTUENDX1NETTg0NT15CiBDT05GSUdfQ0xPQ0tfUVBOUF9ESVY9eQogQ09ORklHX01TTV9DTEtfUlBNSD15CiBDT05GSUdfQ0xPQ0tfQ1BVX09TTT15CitDT05GSUdfTVNNX0dQVUNDX1NETTg0NT15CiBDT05GSUdfTVNNX0NMS19BT1BfUU1QPXkKIENPTkZJR19RQ09NX01EU1NfUExMPXkKIENPTkZJR19SRU1PVEVfU1BJTkxPQ0tfTVNNPXkKQEAgLTQ3OCw3ICs1MDMsMTAgQEAKIENPTkZJR19NU01fR0xBRElBVE9SX0VSUD15CiBDT05GSUdfUUNPTV9FVUQ9eQogQ09ORklHX1FDT01fV0FUQ0hET0dfVjI9eQorQ09ORklHX1FQTlBfUEJTPXkKIENPTkZJR19RQ09NX01FTU9SWV9EVU1QX1YyPXkKK0NPTkZJR19RQ09NX0JVU19TQ0FMSU5HPXkKK0NPTkZJR19RQ09NX0JVU19DT05GSUdfUlBNSD15CiBDT05GSUdfUUNPTV9TRUNVUkVfQlVGRkVSPXkKIENPTkZJR19RQ09NX0VBUkxZX1JBTkRPTT15CiBDT05GSUdfTVNNX1NNRU09eQpAQCAtNDk3LDIyICs1MjUsMjQgQEAKIENPTkZJR19NU01fR0xJTktfUEtUPXkKIENPTkZJR19NU01fU1VCU1lTVEVNX1JFU1RBUlQ9eQogQ09ORklHX01TTV9QSUw9eQorQ09ORklHX01TTV9TWVNNT05fR0xJTktfQ09NTT15CiBDT05GSUdfTVNNX1BJTF9TU1JfR0VORVJJQz15CiBDT05GSUdfTVNNX1BJTF9NU1NfUURTUDZWNT15CiBDT05GSUdfSUNOU1M9eQogQ09ORklHX0lDTlNTX0RFQlVHPXkKIENPTkZJR19RQ09NX0NPTU1BTkRfREI9eQotQ09ORklHX01TTV9BRFNQX0xPQURFUj15CiBDT05GSUdfTVNNX1BFUkZPUk1BTkNFPXkKIENPTkZJR19NU01fQ0RTUF9MT0FERVI9eQotQ09ORklHX01TTV9BVlRJTUVSPXkKK0NPTkZJR19RQ09NX1NNQ0lOVk9LRT15CiBDT05GSUdfTVNNX0VWRU5UX1RJTUVSPXkKIENPTkZJR19NU01fUE09eQogQ09ORklHX01TTV9RQlQxMDAwPXkKK0NPTkZJR19BUFNTX0NPUkVfRUE9eQogQ09ORklHX1FDT01fRENDX1YyPXkKIENPTkZJR19RVElfUlBNX1NUQVRTX0xPRz15CiBDT05GSUdfUUNPTV9GT1JDRV9XRE9HX0JJVEVfT05fUEFOSUM9eQogQ09ORklHX1FNUF9ERUJVR0ZTX0NMSUVOVD15CitDT05GSUdfTVNNX1JFTU9URVFEU1M9eQogQ09ORklHX1FDT01fQklNQ19CV01PTj15CiBDT05GSUdfQVJNX01FTUxBVF9NT049eQogQ09ORklHX1FDT01DQ0lfSFdNT049eQpAQCAtNjEwLDEzICs2NDAsMTYgQEAKIENPTkZJR19DT1JFU0lHSFRfVFBEQT15CiBDT05GSUdfQ09SRVNJR0hUX1RQRE09eQogQ09ORklHX0NPUkVTSUdIVF9DVEk9eQorQ09ORklHX0NPUkVTSUdIVF9FVkVOVD15CiBDT05GSUdfQ09SRVNJR0hUX0hXRVZFTlQ9eQogQ09ORklHX0NPUkVTSUdIVF9EVU1NWT15CiBDT05GSUdfU0VDVVJJVFlfUEVSRl9FVkVOVFNfUkVTVFJJQ1Q9eQogQ09ORklHX1NFQ1VSSVRZPXkKIENPTkZJR19IQVJERU5FRF9VU0VSQ09QWT15CitDT05GSUdfRk9SVElGWV9TT1VSQ0U9eQogQ09ORklHX1NFQ1VSSVRZX1NFTElOVVg9eQogQ09ORklHX1NFQ1VSSVRZX1NNQUNLPXkKK0NPTkZJR19DUllQVE9fQ1RSPXkKIENPTkZJR19DUllQVE9fWENCQz15CiBDT05GSUdfQ1JZUFRPX01END15CiBDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jb25maWdzL3NkbTg0NS1wZXJmX2RlZmNvbmZpZyBiL2FyY2gvYXJtNjQvY29uZmlncy9zZG04NDUtcGVyZl9kZWZjb25maWcKaW5kZXggZmI0NGM0MC4uYzFlZmVkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jb25maWdzL3NkbTg0NS1wZXJmX2RlZmNvbmZpZworKysgYi9hcmNoL2FybTY0L2NvbmZpZ3Mvc2RtODQ1LXBlcmZfZGVmY29uZmlnCkBAIC0yMSw2ICsyMSw3IEBACiBDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQogQ09ORklHX0NHUk9VUF9CUEY9eQogQ09ORklHX1NDSEVEX0NPUkVfQ1RMPXkKK0NPTkZJR19TQ0hFRF9DT1JFX1JPVEFURT15CiBDT05GSUdfTkFNRVNQQUNFUz15CiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKQEAgLTI5NiwxMSArMjk3LDExIEBACiBDT05GSUdfRElBR19DSEFSPXkKIENPTkZJR19IV19SQU5ET009eQogQ09ORklHX0hXX1JBTkRPTV9NU01fTEVHQUNZPXkKKyMgQ09ORklHX0RFVlBPUlQgaXMgbm90IHNldAogQ09ORklHX01TTV9BRFNQUlBDPXkKIENPTkZJR19NU01fUkRCRz1tCiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19RQ09NX0dFTkk9eQotQ09ORklHX1NPVU5EV0lSRT15CiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfUVVQPXkKIENPTkZJR19TUElfUUNPTV9HRU5JPXkKQEAgLTM0MCw3ICszNDEsNiBAQAogQ09ORklHX1JFR1VMQVRPUl9DT09MSU5HX0RFVklDRT15CiBDT05GSUdfTUZEX0kyQ19QTUlDPXkKIENPTkZJR19NRkRfU1BNSV9QTUlDPXkKLUNPTkZJR19XQ0Q5WFhYX0NPREVDX0NPUkU9eQogQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFPXkKIENPTkZJR19SRUdVTEFUT1JfUFJPWFlfQ09OU1VNRVI9eQogQ09ORklHX1JFR1VMQVRPUl9DUFJIX0tCU1M9eQpAQCAtMzc4LDExICszNzgsMTAgQEAKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX1NPVU5EPXkKIENPTkZJR19TTkQ9eQorQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15CiBDT05GSUdfU05EX1VTQl9BVURJTz15CiBDT05GSUdfU05EX1VTQl9BVURJT19RTUk9eQogQ09ORklHX1NORF9TT0M9eQotQ09ORklHX1NORF9TT0NfTUFDSElORV9TRE04NDU9eQotQ09ORklHX1NORF9TT0NfU0RNODQ1PXkKIENPTkZJR19VSElEPXkKIENPTkZJR19ISURfQVBQTEU9eQogQ09ORklHX0hJRF9FTEVDT009eQpAQCAtNTIyLDEwICs1MjEsOCBAQAogQ09ORklHX01TTV9QSUxfTVNTX1FEU1A2VjU9eQogQ09ORklHX0lDTlNTPXkKIENPTkZJR19RQ09NX0NPTU1BTkRfREI9eQotQ09ORklHX01TTV9BRFNQX0xPQURFUj15CiBDT05GSUdfTVNNX1BFUkZPUk1BTkNFPXkKIENPTkZJR19NU01fQ0RTUF9MT0FERVI9eQotQ09ORklHX01TTV9BVlRJTUVSPXkKIENPTkZJR19RQ09NX1NNQ0lOVk9LRT15CiBDT05GSUdfTVNNX0VWRU5UX1RJTUVSPXkKIENPTkZJR19NU01fUE09eQpAQCAtNTM0LDYgKzUzMSw3IEBACiBDT05GSUdfUVRJX1JQTV9TVEFUU19MT0c9eQogQ09ORklHX1FDT01fRk9SQ0VfV0RPR19CSVRFX09OX1BBTklDPXkKIENPTkZJR19RTVBfREVCVUdGU19DTElFTlQ9eQorQ09ORklHX1FTRUVfSVBDX0lSUV9CUklER0U9eQogQ09ORklHX1FDT01fQklNQ19CV01PTj15CiBDT05GSUdfQVJNX01FTUxBVF9NT049eQogQ09ORklHX1FDT01DQ0lfSFdNT049eQpAQCAtNTg0LDYgKzU4Miw3IEBACiBDT05GSUdfQ09SRVNJR0hUX1RQREE9eQogQ09ORklHX0NPUkVTSUdIVF9UUERNPXkKIENPTkZJR19DT1JFU0lHSFRfQ1RJPXkKK0NPTkZJR19DT1JFU0lHSFRfRVZFTlQ9eQogQ09ORklHX0NPUkVTSUdIVF9IV0VWRU5UPXkKIENPTkZJR19DT1JFU0lHSFRfRFVNTVk9eQogQ09ORklHX1NFQ1VSSVRZX1BFUkZfRVZFTlRTX1JFU1RSSUNUPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvY29uZmlncy9zZG04NDVfZGVmY29uZmlnIGIvYXJjaC9hcm02NC9jb25maWdzL3NkbTg0NV9kZWZjb25maWcKaW5kZXggZmM3ZDI4YS4uYzAyOWI3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jb25maWdzL3NkbTg0NV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm02NC9jb25maWdzL3NkbTg0NV9kZWZjb25maWcKQEAgLTI1LDYgKzI1LDcgQEAKIENPTkZJR19SVF9HUk9VUF9TQ0hFRD15CiBDT05GSUdfQ0dST1VQX0JQRj15CiBDT05GSUdfU0NIRURfQ09SRV9DVEw9eQorQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFPXkKIENPTkZJR19OQU1FU1BBQ0VTPXkKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QSURfTlMgaXMgbm90IHNldApAQCAtMjM3LDYgKzIzOCw3IEBACiBDT05GSUdfSVBDX1JPVVRFUj15CiBDT05GSUdfSVBDX1JPVVRFUl9TRUNVUklUWT15CiBDT05GSUdfRldfTE9BREVSX1VTRVJfSEVMUEVSX0ZBTExCQUNLPXkKK0NPTkZJR19SRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUz15CiBDT05GSUdfRE1BX0NNQT15CiBDT05GSUdfWlJBTT15CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKQEAgLTMwMywxMSArMzA1LDExIEBACiBDT05GSUdfRElBR19DSEFSPXkKIENPTkZJR19IV19SQU5ET009eQogQ09ORklHX0hXX1JBTkRPTV9NU01fTEVHQUNZPXkKKyMgQ09ORklHX0RFVlBPUlQgaXMgbm90IHNldAogQ09ORklHX01TTV9BRFNQUlBDPXkKIENPTkZJR19NU01fUkRCRz1tCiBDT05GSUdfSTJDX0NIQVJERVY9eQogQ09ORklHX0kyQ19RQ09NX0dFTkk9eQotQ09ORklHX1NPVU5EV0lSRT15CiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfUVVQPXkKIENPTkZJR19TUElfUUNPTV9HRU5JPXkKQEAgLTM0Nyw3ICszNDksNiBAQAogQ09ORklHX1JFR1VMQVRPUl9DT09MSU5HX0RFVklDRT15CiBDT05GSUdfTUZEX0kyQ19QTUlDPXkKIENPTkZJR19NRkRfU1BNSV9QTUlDPXkKLUNPTkZJR19XQ0Q5WFhYX0NPREVDX0NPUkU9eQogQ09ORklHX1JFR1VMQVRPUl9GSVhFRF9WT0xUQUdFPXkKIENPTkZJR19SRUdVTEFUT1JfUFJPWFlfQ09OU1VNRVI9eQogQ09ORklHX1JFR1VMQVRPUl9DUFJIX0tCU1M9eQpAQCAtMzg1LDExICszODYsMTAgQEAKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX1NPVU5EPXkKIENPTkZJR19TTkQ9eQorQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUz15CiBDT05GSUdfU05EX1VTQl9BVURJTz15CiBDT05GSUdfU05EX1VTQl9BVURJT19RTUk9eQogQ09ORklHX1NORF9TT0M9eQotQ09ORklHX1NORF9TT0NfTUFDSElORV9TRE04NDU9eQotQ09ORklHX1NORF9TT0NfU0RNODQ1PXkKIENPTkZJR19VSElEPXkKIENPTkZJR19ISURfQVBQTEU9eQogQ09ORklHX0hJRF9FTEVDT009eQpAQCAtNDU3LDkgKzQ1Nyw2IEBACiBDT05GSUdfRURBQ19LUllPM1hYX0FSTTY0PXkKIENPTkZJR19FREFDX0tSWU8zWFhfQVJNNjRfUEFOSUNfT05fQ0U9eQogQ09ORklHX0VEQUNfS1JZTzNYWF9BUk02NF9QQU5JQ19PTl9VRT15Ci1DT05GSUdfRURBQ19RQ09NX0xMQ0M9eQotQ09ORklHX0VEQUNfUUNPTV9MTENDX1BBTklDX09OX0NFPXkKLUNPTkZJR19FREFDX1FDT01fTExDQ19QQU5JQ19PTl9VRT15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfRFJWX1FQTlA9eQogQ09ORklHX0RNQURFVklDRVM9eQpAQCAtNTQyLDEwICs1MzksOCBAQAogQ09ORklHX0lDTlNTPXkKIENPTkZJR19JQ05TU19ERUJVRz15CiBDT05GSUdfUUNPTV9DT01NQU5EX0RCPXkKLUNPTkZJR19NU01fQURTUF9MT0FERVI9eQogQ09ORklHX01TTV9QRVJGT1JNQU5DRT15CiBDT05GSUdfTVNNX0NEU1BfTE9BREVSPXkKLUNPTkZJR19NU01fQVZUSU1FUj15CiBDT05GSUdfUUNPTV9TTUNJTlZPS0U9eQogQ09ORklHX01TTV9FVkVOVF9USU1FUj15CiBDT05GSUdfTVNNX1BNPXkKQEAgLTU1Niw2ICs1NTEsNyBAQAogQ09ORklHX1FDT01fRk9SQ0VfV0RPR19CSVRFX09OX1BBTklDPXkKIENPTkZJR19RTVBfREVCVUdGU19DTElFTlQ9eQogQ09ORklHX01TTV9SRU1PVEVRRFNTPXkKK0NPTkZJR19RU0VFX0lQQ19JUlFfQlJJREdFPXkKIENPTkZJR19RQ09NX0JJTUNfQldNT049eQogQ09ORklHX0FSTV9NRU1MQVRfTU9OPXkKIENPTkZJR19RQ09NQ0NJX0hXTU9OPXkKQEAgLTYxNiw2ICs2MTIsNyBAQAogQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFPXkKIENPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CiBDT05GSUdfTE9DS1VQX0RFVEVDVE9SPXkKK0NPTkZJR19CT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQz15CiBDT05GSUdfV1FfV0FUQ0hET0c9eQogQ09ORklHX1BBTklDX1RJTUVPVVQ9NQogQ09ORklHX1BBTklDX09OX1NDSEVEX0JVRz15CkBAIC02NTUsNiArNjUyLDggQEAKIENPTkZJR19DT1JFU0lHSFRfVFBEQT15CiBDT05GSUdfQ09SRVNJR0hUX1RQRE09eQogQ09ORklHX0NPUkVTSUdIVF9DVEk9eQorQ09ORklHX0NPUkVTSUdIVF9FVkVOVD15CitDT05GSUdfQ09SRVNJR0hUX1RHVT15CiBDT05GSUdfQ09SRVNJR0hUX0hXRVZFTlQ9eQogQ09ORklHX0NPUkVTSUdIVF9EVU1NWT15CiBDT05GSUdfU0VDVVJJVFlfUEVSRl9FVkVOVFNfUkVTVFJJQ1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAppbmRleCA2ZWJkMmMzLi5mMWFjZTU5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogI2RlZmluZSBJQ0NfRU9JUjFfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTIsIDEpCisjZGVmaW5lIElDQ19IUFBJUjFfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTIsIDIpCiAjZGVmaW5lIElDQ19ESVJfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTEsIDEpCiAjZGVmaW5lIElDQ19JQVIxX0VMMQkJCXN5c19yZWcoMywgMCwgMTIsIDEyLCAwKQogI2RlZmluZSBJQ0NfU0dJMVJfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTEsIDUpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVndjguaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWd2OC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMmRlODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVndjguaApAQCAtMCwwICsxLDIyOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9ERUJVR1Y4X0gKKyNkZWZpbmUgX19BU01fREVCVUdWOF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiAzMiBiaXQgcmVnaXN0ZXIgcmVhZHMgZm9yIGFhcmNoIDY0IGJpdCAqLworI2RlZmluZSBkYmdfcmVhZGwocmVnKQkJCVJTWVNMXyMjcmVnKCkKKy8qIDY0IGJpdCByZWdpc3RlciByZWFkcyBmb3IgYWFyY2ggNjQgYml0ICovCisjZGVmaW5lIGRiZ19yZWFkcShyZWcpCQkJUlNZU1FfIyNyZWcoKQorLyogMzIgYW5kIDY0IGJpdCByZWdpc3RlciB3cml0ZXMgZm9yIGFhcmNoIDY0IGJpdCAqLworI2RlZmluZSBkYmdfd3JpdGUodmFsLCByZWcpCQlXU1lTXyMjcmVnKHZhbCkKKworI2RlZmluZSBNUlNMKHJlZykJCQkJXAorKHsJCQkJCQlcCit1aW50MzJfdCB2YWw7CQkJCQlcCithc20gdm9sYXRpbGUoIm1ycyAlMCwgIiNyZWcgOiAiPXIiICh2YWwpKTsJXAordmFsOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgTVJTUShyZWcpCQkJCVwKKyh7CQkJCQkJXAordWludDY0X3QgdmFsOwkJCQkJXAorYXNtIHZvbGF0aWxlKCJtcnMgJTAsICIjcmVnIDogIj1yIiAodmFsKSk7CVwKK3ZhbDsJCQkJCQlcCit9KQorCisjZGVmaW5lIE1TUih2YWwsIHJlZykJCQkJXAorKHsJCQkJCQlcCithc20gdm9sYXRpbGUoIm1zciAiI3JlZyIsICUwIiA6IDogInIiICh2YWwpKTsJXAorfSkKKworLyoKKyAqIERlYnVnIEZlYXR1cmUgUmVnaXN0ZXIKKyAqCisgKiBSZWFkIG9ubHkKKyAqLworI2RlZmluZSBSU1lTUV9JRF9BQTY0REZSMF9FTDEoKQkJTVJTUShJRF9BQTY0REZSMF9FTDEpCisKKy8qCisgKiBEZWJ1ZyBSZWdpc3RlcnMKKyAqCisgKiBBdmFpbGFibGUgb25seSBpbiBEQkd2OAorICoKKyAqIFJlYWQgb25seQorICogTURDQ1NSX0VMMCwgTURSQVJfRUwxLCBPU0xTUl9FTDEsIERCR0RUUlJYX0VMMCwgREJHQVVUSFNUQVRVU19FTDEKKyAqCisgKiBXcml0ZSBvbmx5CisgKiBEQkdEVFJUWF9FTDAsIE9TTEFSX0VMMQorICovCisvKiAzMiBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJTWVNMX0RCR0RUUlJYX0VMMCgpCQlNUlNMKERCR0RUUlJYX0VMMCkKKyNkZWZpbmUgUlNZU0xfTURDQ1NSX0VMMCgpCQlNUlNMKE1EQ0NTUl9FTDApCisjZGVmaW5lIFJTWVNMX01EU0NSX0VMMSgpCQlNUlNMKE1EU0NSX0VMMSkKKyNkZWZpbmUgUlNZU0xfT1NEVFJSWF9FTDEoKQkJTVJTTChPU0RUUlJYX0VMMSkKKyNkZWZpbmUgUlNZU0xfT1NEVFJUWF9FTDEoKQkJTVJTTChPU0RUUlRYX0VMMSkKKyNkZWZpbmUgUlNZU0xfT1NETFJfRUwxKCkJCU1SU0woT1NETFJfRUwxKQorI2RlZmluZSBSU1lTTF9PU0xTUl9FTDEoKQkJTVJTTChPU0xTUl9FTDEpCisjZGVmaW5lIFJTWVNMX01EQ0NJTlRfRUwxKCkJCU1SU0woTURDQ0lOVF9FTDEpCisjZGVmaW5lIFJTWVNMX09TRUNDUl9FTDEoKQkJTVJTTChPU0VDQ1JfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdQUkNSX0VMMSgpCQlNUlNMKERCR1BSQ1JfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IwX0VMMSgpCQlNUlNMKERCR0JDUjBfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IxX0VMMSgpCQlNUlNMKERCR0JDUjFfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IyX0VMMSgpCQlNUlNMKERCR0JDUjJfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IzX0VMMSgpCQlNUlNMKERCR0JDUjNfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I0X0VMMSgpCQlNUlNMKERCR0JDUjRfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I1X0VMMSgpCQlNUlNMKERCR0JDUjVfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I2X0VMMSgpCQlNUlNMKERCR0JDUjZfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I3X0VMMSgpCQlNUlNMKERCR0JDUjdfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I4X0VMMSgpCQlNUlNMKERCR0JDUjhfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1I5X0VMMSgpCQlNUlNMKERCR0JDUjlfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IxMF9FTDEoKQkJTVJTTChEQkdCQ1IxMF9FTDEpCisjZGVmaW5lIFJTWVNMX0RCR0JDUjExX0VMMSgpCQlNUlNMKERCR0JDUjExX0VMMSkKKyNkZWZpbmUgUlNZU0xfREJHQkNSMTJfRUwxKCkJCU1SU0woREJHQkNSMTJfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdCQ1IxM19FTDEoKQkJTVJTTChEQkdCQ1IxM19FTDEpCisjZGVmaW5lIFJTWVNMX0RCR0JDUjE0X0VMMSgpCQlNUlNMKERCR0JDUjE0X0VMMSkKKyNkZWZpbmUgUlNZU0xfREJHQkNSMTVfRUwxKCkJCU1SU0woREJHQkNSMTVfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IwX0VMMSgpCQlNUlNMKERCR1dDUjBfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IxX0VMMSgpCQlNUlNMKERCR1dDUjFfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IyX0VMMSgpCQlNUlNMKERCR1dDUjJfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IzX0VMMSgpCQlNUlNMKERCR1dDUjNfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I0X0VMMSgpCQlNUlNMKERCR1dDUjRfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I1X0VMMSgpCQlNUlNMKERCR1dDUjVfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I2X0VMMSgpCQlNUlNMKERCR1dDUjZfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I3X0VMMSgpCQlNUlNMKERCR1dDUjdfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I4X0VMMSgpCQlNUlNMKERCR1dDUjhfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1I5X0VMMSgpCQlNUlNMKERCR1dDUjlfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IxMF9FTDEoKQkJTVJTTChEQkdXQ1IxMF9FTDEpCisjZGVmaW5lIFJTWVNMX0RCR1dDUjExX0VMMSgpCQlNUlNMKERCR1dDUjExX0VMMSkKKyNkZWZpbmUgUlNZU0xfREJHV0NSMTJfRUwxKCkJCU1SU0woREJHV0NSMTJfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdXQ1IxM19FTDEoKQkJTVJTTChEQkdXQ1IxM19FTDEpCisjZGVmaW5lIFJTWVNMX0RCR1dDUjE0X0VMMSgpCQlNUlNMKERCR1dDUjE0X0VMMSkKKyNkZWZpbmUgUlNZU0xfREJHV0NSMTVfRUwxKCkJCU1SU0woREJHV0NSMTVfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdDTEFJTVNFVF9FTDEoKQkJTVJTTChEQkdDTEFJTVNFVF9FTDEpCisjZGVmaW5lIFJTWVNMX0RCR0NMQUlNQ0xSX0VMMSgpCQlNUlNMKERCR0NMQUlNQ0xSX0VMMSkKKyNkZWZpbmUgUlNZU0xfREJHQVVUSFNUQVRVU19FTDEoKQlNUlNMKERCR0FVVEhTVEFUVVNfRUwxKQorI2RlZmluZSBSU1lTTF9EQkdWQ1IzMl9FTDIoKQkJTVJTTChEQkdWQ1IzMl9FTDIpCisjZGVmaW5lIFJTWVNMX01EQ1JfRUwyKCkJCU1SU0woTURDUl9FTDIpCisjZGVmaW5lIFJTWVNMX01EQ1JfRUwzKCkJCU1SU0woTURDUl9FTDMpCisvKiA2NCBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJTWVNRX0RCR0RUUl9FTDAoKQkJTVJTUShEQkdEVFJfRUwwKQorI2RlZmluZSBSU1lTUV9NRFJBUl9FTDEoKQkJTVJTUShNRFJBUl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjBfRUwxKCkJCU1SU1EoREJHQlZSMF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjFfRUwxKCkJCU1SU1EoREJHQlZSMV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjJfRUwxKCkJCU1SU1EoREJHQlZSMl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjNfRUwxKCkJCU1SU1EoREJHQlZSM19FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjRfRUwxKCkJCU1SU1EoREJHQlZSNF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjVfRUwxKCkJCU1SU1EoREJHQlZSNV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjZfRUwxKCkJCU1SU1EoREJHQlZSNl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjdfRUwxKCkJCU1SU1EoREJHQlZSN19FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjhfRUwxKCkJCU1SU1EoREJHQlZSOF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjlfRUwxKCkJCU1SU1EoREJHQlZSOV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjEwX0VMMSgpCQlNUlNRKERCR0JWUjEwX0VMMSkKKyNkZWZpbmUgUlNZU1FfREJHQlZSMTFfRUwxKCkJCU1SU1EoREJHQlZSMTFfRUwxKQorI2RlZmluZSBSU1lTUV9EQkdCVlIxMl9FTDEoKQkJTVJTUShEQkdCVlIxMl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR0JWUjEzX0VMMSgpCQlNUlNRKERCR0JWUjEzX0VMMSkKKyNkZWZpbmUgUlNZU1FfREJHQlZSMTRfRUwxKCkJCU1SU1EoREJHQlZSMTRfRUwxKQorI2RlZmluZSBSU1lTUV9EQkdCVlIxNV9FTDEoKQkJTVJTUShEQkdCVlIxNV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjBfRUwxKCkJCU1SU1EoREJHV1ZSMF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjFfRUwxKCkJCU1SU1EoREJHV1ZSMV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjJfRUwxKCkJCU1SU1EoREJHV1ZSMl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjNfRUwxKCkJCU1SU1EoREJHV1ZSM19FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjRfRUwxKCkJCU1SU1EoREJHV1ZSNF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjVfRUwxKCkJCU1SU1EoREJHV1ZSNV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjZfRUwxKCkJCU1SU1EoREJHV1ZSNl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjdfRUwxKCkJCU1SU1EoREJHV1ZSN19FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjhfRUwxKCkJCU1SU1EoREJHV1ZSOF9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjlfRUwxKCkJCU1SU1EoREJHV1ZSOV9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjEwX0VMMSgpCQlNUlNRKERCR1dWUjEwX0VMMSkKKyNkZWZpbmUgUlNZU1FfREJHV1ZSMTFfRUwxKCkJCU1SU1EoREJHV1ZSMTFfRUwxKQorI2RlZmluZSBSU1lTUV9EQkdXVlIxMl9FTDEoKQkJTVJTUShEQkdXVlIxMl9FTDEpCisjZGVmaW5lIFJTWVNRX0RCR1dWUjEzX0VMMSgpCQlNUlNRKERCR1dWUjEzX0VMMSkKKyNkZWZpbmUgUlNZU1FfREJHV1ZSMTRfRUwxKCkJCU1SU1EoREJHV1ZSMTRfRUwxKQorI2RlZmluZSBSU1lTUV9EQkdXVlIxNV9FTDEoKQkJTVJTUShEQkdXVlIxNV9FTDEpCisKKy8qIDMyIGJpdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV1NZU19EQkdEVFJUWF9FTDAodmFsKQkJTVNSKHZhbCwgREJHRFRSVFhfRUwwKQorI2RlZmluZSBXU1lTX01EQ0NJTlRfRUwxKHZhbCkJCU1TUih2YWwsIE1EQ0NJTlRfRUwxKQorI2RlZmluZSBXU1lTX01EU0NSX0VMMSh2YWwpCQlNU1IodmFsLCBNRFNDUl9FTDEpCisjZGVmaW5lIFdTWVNfT1NEVFJSWF9FTDEodmFsKQkJTVNSKHZhbCwgT1NEVFJSWF9FTDEpCisjZGVmaW5lIFdTWVNfT1NEVFJUWF9FTDEodmFsKQkJTVNSKHZhbCwgT1NEVFJUWF9FTDEpCisjZGVmaW5lIFdTWVNfT1NETFJfRUwxKHZhbCkJCU1TUih2YWwsIE9TRExSX0VMMSkKKyNkZWZpbmUgV1NZU19PU0VDQ1JfRUwxKHZhbCkJCU1TUih2YWwsIE9TRUNDUl9FTDEpCisjZGVmaW5lIFdTWVNfREJHUFJDUl9FTDEodmFsKQkJTVNSKHZhbCwgREJHUFJDUl9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSMF9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSMF9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSMV9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSMV9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSMl9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSMl9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSM19FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSM19FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSNF9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSNF9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSNV9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSNV9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSNl9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSNl9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSN19FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSN19FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSOF9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSOF9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSOV9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSOV9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSMTBfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JDUjEwX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdCQ1IxMV9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSMTFfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JDUjEyX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdCQ1IxMl9FTDEpCisjZGVmaW5lIFdTWVNfREJHQkNSMTNfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JDUjEzX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdCQ1IxNF9FTDEodmFsKQkJTVNSKHZhbCwgREJHQkNSMTRfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JDUjE1X0VMMSh2YWwpCQlNU1IodmFsLCBEQkdCQ1IxNV9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSMF9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSMF9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSMV9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSMV9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSMl9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSMl9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSM19FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSM19FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSNF9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSNF9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSNV9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSNV9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSNl9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSNl9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSN19FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSN19FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSOF9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSOF9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSOV9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSOV9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSMTBfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dDUjEwX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdXQ1IxMV9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSMTFfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dDUjEyX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdXQ1IxMl9FTDEpCisjZGVmaW5lIFdTWVNfREJHV0NSMTNfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dDUjEzX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdXQ1IxNF9FTDEodmFsKQkJTVNSKHZhbCwgREJHV0NSMTRfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dDUjE1X0VMMSh2YWwpCQlNU1IodmFsLCBEQkdXQ1IxNV9FTDEpCisjZGVmaW5lIFdTWVNfREJHQ0xBSU1TRVRfRUwxKHZhbCkJTVNSKHZhbCwgREJHQ0xBSU1TRVRfRUwxKQorI2RlZmluZSBXU1lTX0RCR0NMQUlNQ0xSX0VMMSh2YWwpCU1TUih2YWwsIERCR0NMQUlNQ0xSX0VMMSkKKyNkZWZpbmUgV1NZU19PU0xBUl9FTDEodmFsKQkJTVNSKHZhbCwgT1NMQVJfRUwxKQorI2RlZmluZSBXU1lTX0RCR1ZDUjMyX0VMMih2YWwpCQlNU1IodmFsLCBEQkdWQ1IzMl9FTDIpCisjZGVmaW5lIFdTWVNfTURDUl9FTDIodmFsKQkJTVNSKHZhbCwgTURDUl9FTDIpCisjZGVmaW5lIFdTWVNfTURDUl9FTDModmFsKQkJTVNSKHZhbCwgTURDUl9FTDMpCisvKiA2NCBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdTWVNfREJHRFRSX0VMMCh2YWwpCQlNU1IodmFsLCBEQkdEVFJfRUwwKQorI2RlZmluZSBXU1lTX0RCR0JWUjBfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjBfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjFfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjFfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjJfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjJfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjNfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjNfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjRfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjRfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjVfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjVfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjZfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjZfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjdfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjdfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjhfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjhfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjlfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjlfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjEwX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdCVlIxMF9FTDEpCisjZGVmaW5lIFdTWVNfREJHQlZSMTFfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjExX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdCVlIxMl9FTDEodmFsKQkJTVNSKHZhbCwgREJHQlZSMTJfRUwxKQorI2RlZmluZSBXU1lTX0RCR0JWUjEzX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdCVlIxM19FTDEpCisjZGVmaW5lIFdTWVNfREJHQlZSMTRfRUwxKHZhbCkJCU1TUih2YWwsIERCR0JWUjE0X0VMMSkKKyNkZWZpbmUgV1NZU19EQkdCVlIxNV9FTDEodmFsKQkJTVNSKHZhbCwgREJHQlZSMTVfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjBfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjBfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjFfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjFfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjJfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjJfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjNfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjNfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjRfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjRfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjVfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjVfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjZfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjZfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjdfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjdfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjhfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjhfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjlfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjlfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjEwX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdXVlIxMF9FTDEpCisjZGVmaW5lIFdTWVNfREJHV1ZSMTFfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjExX0VMMSkKKyNkZWZpbmUgV1NZU19EQkdXVlIxMl9FTDEodmFsKQkJTVNSKHZhbCwgREJHV1ZSMTJfRUwxKQorI2RlZmluZSBXU1lTX0RCR1dWUjEzX0VMMSh2YWwpCQlNU1IodmFsLCBEQkdXVlIxM19FTDEpCisjZGVmaW5lIFdTWVNfREJHV1ZSMTRfRUwxKHZhbCkJCU1TUih2YWwsIERCR1dWUjE0X0VMMSkKKyNkZWZpbmUgV1NZU19EQkdXVlIxNV9FTDEodmFsKQkJTVNSKHZhbCwgREJHV1ZSMTVfRUwxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLWlvbW11LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RtYS1pb21tdS5oCmluZGV4IGFiMGU1YjIuLjExMGY3NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZG1hLWlvbW11LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kbWEtaW9tbXUuaApAQCAtMTQsMTQgKzE0LDE2IEBACiBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgewogCS8qIGlvbW11IHNwZWNpZmljIGRhdGEgKi8KIAlzdHJ1Y3QgaW9tbXVfZG9tYWluCSpkb21haW47CisJYm9vbAkJCWluaXQ7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzICpvcHM7CiAKKwkvKiBQcm90ZWN0cyBiaXRtYXAgKi8KKwlzcGlubG9ja190CQlsb2NrOwogCXZvaWQJCQkqYml0bWFwOwogCXNpemVfdAkJCWJpdHM7CiAJZG1hX2FkZHJfdAkJYmFzZTsKIAotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IGtyZWYJCWtyZWY7Ci0KIAlzdHJ1Y3QgZG1hX2Zhc3Rfc21tdV9tYXBwaW5nICpmYXN0OwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYWZhMjNiMC4uMWZiMDIzMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xMTQsMTAgKzExNCwxMCBAQAogCiAvKgogICogVGhpcyBpcyB0aGUgYmFzZSBsb2NhdGlvbiBmb3IgUElFIChFVF9EWU4gd2l0aCBJTlRFUlApIGxvYWRzLiBPbgotICogNjQtYml0LCB0aGlzIGlzIHJhaXNlZCB0byA0R0IgdG8gbGVhdmUgdGhlIGVudGlyZSAzMi1iaXQgYWRkcmVzcworICogNjQtYml0LCB0aGlzIGlzIGFib3ZlIDRHQiB0byBsZWF2ZSB0aGUgZW50aXJlIDMyLWJpdCBhZGRyZXNzCiAgKiBzcGFjZSBvcGVuIGZvciB0aGluZ3MgdGhhdCB3YW50IHRvIHVzZSB0aGUgYXJlYSBmb3IgMzItYml0IHBvaW50ZXJzLgogICovCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkJMHgxMDAwMDAwMDBVTAorI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UJCSgyICogVEFTS19TSVpFXzY0IC8gMykKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9ldG12NHguaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXRtdjR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiOTFjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXRtdjR4LmgKQEAgLTAsMCArMSwzODUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fRVRNVjRYX0gKKyNkZWZpbmUgX19BU01fRVRNVjRYX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIDMyIGJpdCByZWdpc3RlciByZWFkcyBmb3IgQUFyY2g2NCAqLworI2RlZmluZSB0cmNfcmVhZGwocmVnKQkJCVJTWVNMXyMjcmVnKCkKKy8qIDY0IGJpdCByZWdpc3RlciByZWFkcyBmb3IgQUFyY2g2NCAqLworI2RlZmluZSB0cmNfcmVhZHEocmVnKQkJCVJTWVNRXyMjcmVnKCkKKy8qIDMyIGFuZCA2NCBiaXQgcmVnaXN0ZXIgd3JpdGVzIGZvciBBQXJjaDY0ICovCisjZGVmaW5lIHRyY193cml0ZSh2YWwsIHJlZykJCVdTWVNfIyNyZWcodmFsKQorCisjZGVmaW5lIE1SU0wob3AwLCBvcDEsIGNybiwgY3JtLCBvcDIpCQkJCQkgICAgIFwKKyh7CQkJCQkJCQkJICAgICBcCit1aW50MzJfdCB2YWw7CQkJCQkJCQkgICAgIFwKK2FzbSB2b2xhdGlsZSgibXJzICUwLCBTIiNvcDAiXyIjb3AxIl8iI2NybiJfIiNjcm0iXyIjb3AyIDogIj1yIiAodmFsKSk7ICAgICAgXAordmFsOwkJCQkJCQkJCSAgICAgXAorfSkKKworI2RlZmluZSBNUlNRKG9wMCwgb3AxLCBjcm4sIGNybSwgb3AyKQkJCQkJICAgICBcCisoewkJCQkJCQkJCSAgICAgXAordWludDY0X3QgdmFsOwkJCQkJCQkJICAgICBcCithc20gdm9sYXRpbGUoIm1ycyAlMCwgUyIjb3AwIl8iI29wMSJfIiNjcm4iXyIjY3JtIl8iI29wMiA6ICI9ciIgKHZhbCkpOyAgICAgIFwKK3ZhbDsJCQkJCQkJCQkgICAgIFwKK30pCisKKyNkZWZpbmUgTVNSKHZhbCwgb3AwLCBvcDEsIGNybiwgY3JtLCBvcDIpCQkJCSAgICAgXAorKHsJCQkJCQkJCQkgICAgIFwKK2FzbSB2b2xhdGlsZSgibXNyIFMiI29wMCJfIiNvcDEiXyIjY3JuIl8iI2NybSJfIiNvcDIiLCAlMCIgOiA6ICJyIiAodmFsKSk7ICAgXAorfSkKKworLyogQ2xvY2sgYW5kIFBvd2VyIE1hbmFnZW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNZU0xfQ1BNUl9FTDEoKQkJTVJTTCgzLCA3LCBjMTUsIGMwLCA1KQorI2RlZmluZSBXU1lTX0NQTVJfRUwxKHZhbCkJCU1TUih2YWwsIDMsIDcsIGMxNSwgYzAsIDUpCisKKy8qCisgKiBFVE12NCBSZWdpc3RlcnMKKyAqCisgKiBSZWFkIG9ubHkKKyAqIEVUTUFVVEhTVEFUVVMsIEVUTURFVkFSQ0gsIEVUTURFVklELCBFVE1JRFJuWzAtMTNdLCBFVE1PU0xTUiwgRVRNU1RBVFIKKyAqCisgKiBXcml0ZSBvbmx5CisgKiBFVE1PU0xBUgorICovCisvKiAzMiBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJTWVNMX0VUTUFVVEhTVEFUVVMoKQkJTVJTTCgyLCAxLCBjNywgYzE0LCA2KQorI2RlZmluZSBSU1lTTF9FVE1BVVhDVExSKCkJCU1SU0woMiwgMSwgYzAsIGM2LCAwKQorI2RlZmluZSBSU1lTTF9FVE1DQ0NUTFIoKQkJTVJTTCgyLCAxLCBjMCwgYzE0LCAwKQorI2RlZmluZSBSU1lTTF9FVE1DSURDQ1RMUjAoKQkJTVJTTCgyLCAxLCBjMywgYzAsIDIpCisjZGVmaW5lIFJTWVNMX0VUTUNOVENUTFIwKCkJCU1SU0woMiwgMSwgYzAsIGM0LCA1KQorI2RlZmluZSBSU1lTTF9FVE1DTlRDVExSMSgpCQlNUlNMKDIsIDEsIGMwLCBjNSwgNSkKKyNkZWZpbmUgUlNZU0xfRVRNQ05UQ1RMUjIoKQkJTVJTTCgyLCAxLCBjMCwgYzYsIDUpCisjZGVmaW5lIFJTWVNMX0VUTUNOVENUTFIzKCkJCU1SU0woMiwgMSwgYzAsIGM3LCA1KQorI2RlZmluZSBSU1lTTF9FVE1DTlRSTERWUjAoKQkJTVJTTCgyLCAxLCBjMCwgYzAsIDUpCisjZGVmaW5lIFJTWVNMX0VUTUNOVFJMRFZSMSgpCQlNUlNMKDIsIDEsIGMwLCBjMSwgNSkKKyNkZWZpbmUgUlNZU0xfRVRNQ05UUkxEVlIyKCkJCU1SU0woMiwgMSwgYzAsIGMyLCA1KQorI2RlZmluZSBSU1lTTF9FVE1DTlRSTERWUjMoKQkJTVJTTCgyLCAxLCBjMCwgYzMsIDUpCisjZGVmaW5lIFJTWVNMX0VUTUNOVFZSMCgpCQlNUlNMKDIsIDEsIGMwLCBjOCwgNSkKKyNkZWZpbmUgUlNZU0xfRVRNQ05UVlIxKCkJCU1SU0woMiwgMSwgYzAsIGM5LCA1KQorI2RlZmluZSBSU1lTTF9FVE1DTlRWUjIoKQkJTVJTTCgyLCAxLCBjMCwgYzEwLCA1KQorI2RlZmluZSBSU1lTTF9FVE1DTlRWUjMoKQkJTVJTTCgyLCAxLCBjMCwgYzExLCA1KQorI2RlZmluZSBSU1lTTF9FVE1DT05GSUdSKCkJCU1SU0woMiwgMSwgYzAsIGM0LCAwKQorI2RlZmluZSBSU1lTTF9FVE1ERVZBUkNIKCkJCU1SU0woMiwgMSwgYzcsIGMxNSwgNikKKyNkZWZpbmUgUlNZU0xfRVRNREVWSUQoKQkJTVJTTCgyLCAxLCBjNywgYzIsIDcpCisjZGVmaW5lIFJTWVNMX0VUTUVWRU5UQ1RMMFIoKQkJTVJTTCgyLCAxLCBjMCwgYzgsIDApCisjZGVmaW5lIFJTWVNMX0VUTUVWRU5UQ1RMMVIoKQkJTVJTTCgyLCAxLCBjMCwgYzksIDApCisjZGVmaW5lIFJTWVNMX0VUTUVYVElOU0VMUigpCQlNUlNMKDIsIDEsIGMwLCBjOCwgNCkKKyNkZWZpbmUgUlNZU0xfRVRNSURSMCgpCQkJTVJTTCgyLCAxLCBjMCwgYzgsIDcpCisjZGVmaW5lIFJTWVNMX0VUTUlEUjEoKQkJCU1SU0woMiwgMSwgYzAsIGM5LCA3KQorI2RlZmluZSBSU1lTTF9FVE1JRFIxMCgpCQlNUlNMKDIsIDEsIGMwLCBjMiwgNikKKyNkZWZpbmUgUlNZU0xfRVRNSURSMTEoKQkJTVJTTCgyLCAxLCBjMCwgYzMsIDYpCisjZGVmaW5lIFJTWVNMX0VUTUlEUjEyKCkJCU1SU0woMiwgMSwgYzAsIGM0LCA2KQorI2RlZmluZSBSU1lTTF9FVE1JRFIxMygpCQlNUlNMKDIsIDEsIGMwLCBjNSwgNikKKyNkZWZpbmUgUlNZU0xfRVRNSURSMigpCQkJTVJTTCgyLCAxLCBjMCwgYzEwLCA3KQorI2RlZmluZSBSU1lTTF9FVE1JRFIzKCkJCQlNUlNMKDIsIDEsIGMwLCBjMTEsIDcpCisjZGVmaW5lIFJTWVNMX0VUTUlEUjQoKQkJCU1SU0woMiwgMSwgYzAsIGMxMiwgNykKKyNkZWZpbmUgUlNZU0xfRVRNSURSNSgpCQkJTVJTTCgyLCAxLCBjMCwgYzEzLCA3KQorI2RlZmluZSBSU1lTTF9FVE1JRFI2KCkJCQlNUlNMKDIsIDEsIGMwLCBjMTQsIDcpCisjZGVmaW5lIFJTWVNMX0VUTUlEUjcoKQkJCU1SU0woMiwgMSwgYzAsIGMxNSwgNykKKyNkZWZpbmUgUlNZU0xfRVRNSURSOCgpCQkJTVJTTCgyLCAxLCBjMCwgYzAsIDYpCisjZGVmaW5lIFJTWVNMX0VUTUlEUjkoKQkJCU1SU0woMiwgMSwgYzAsIGMxLCA2KQorI2RlZmluZSBSU1lTTF9FVE1JTVNQRUMwKCkJCU1SU0woMiwgMSwgYzAsIGMwLCA3KQorI2RlZmluZSBSU1lTTF9FVE1PU0xTUigpCQlNUlNMKDIsIDEsIGMxLCBjMSwgNCkKKyNkZWZpbmUgUlNZU0xfRVRNUFJHQ1RMUigpCQlNUlNMKDIsIDEsIGMwLCBjMSwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMTAoKQkJTVJTTCgyLCAxLCBjMSwgYzEwLCAwKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIxMSgpCQlNUlNMKDIsIDEsIGMxLCBjMTEsIDApCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjEyKCkJCU1SU0woMiwgMSwgYzEsIGMxMiwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMTMoKQkJTVJTTCgyLCAxLCBjMSwgYzEzLCAwKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIxNCgpCQlNUlNMKDIsIDEsIGMxLCBjMTQsIDApCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjE1KCkJCU1SU0woMiwgMSwgYzEsIGMxNSwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMigpCQlNUlNMKDIsIDEsIGMxLCBjMiwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMygpCQlNUlNMKDIsIDEsIGMxLCBjMywgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSNCgpCQlNUlNMKDIsIDEsIGMxLCBjNCwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSNSgpCQlNUlNMKDIsIDEsIGMxLCBjNSwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSNigpCQlNUlNMKDIsIDEsIGMxLCBjNiwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSNygpCQlNUlNMKDIsIDEsIGMxLCBjNywgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSOCgpCQlNUlNMKDIsIDEsIGMxLCBjOCwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSOSgpCQlNUlNMKDIsIDEsIGMxLCBjOSwgMCkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMTYoKQkJTVJTTCgyLCAxLCBjMSwgYzAsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjE3KCkJCU1SU0woMiwgMSwgYzEsIGMxLCAxKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIxOCgpCQlNUlNMKDIsIDEsIGMxLCBjMiwgMSkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMTkoKQkJTVJTTCgyLCAxLCBjMSwgYzMsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjIwKCkJCU1SU0woMiwgMSwgYzEsIGM0LCAxKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIyMSgpCQlNUlNMKDIsIDEsIGMxLCBjNSwgMSkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMjIoKQkJTVJTTCgyLCAxLCBjMSwgYzYsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjIzKCkJCU1SU0woMiwgMSwgYzEsIGM3LCAxKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIyNCgpCQlNUlNMKDIsIDEsIGMxLCBjOCwgMSkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMjUoKQkJTVJTTCgyLCAxLCBjMSwgYzksIDEpCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjI2KCkJCU1SU0woMiwgMSwgYzEsIGMxMCwgMSkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMjcoKQkJTVJTTCgyLCAxLCBjMSwgYzExLCAxKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIyOCgpCQlNUlNMKDIsIDEsIGMxLCBjMTIsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVJTQ1RMUjI5KCkJCU1SU0woMiwgMSwgYzEsIGMxMywgMSkKKyNkZWZpbmUgUlNZU0xfRVRNUlNDVExSMzAoKQkJTVJTTCgyLCAxLCBjMSwgYzE0LCAxKQorI2RlZmluZSBSU1lTTF9FVE1SU0NUTFIzMSgpCQlNUlNMKDIsIDEsIGMxLCBjMTUsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVNFUUVWUjAoKQkJTVJTTCgyLCAxLCBjMCwgYzAsIDQpCisjZGVmaW5lIFJTWVNMX0VUTVNFUUVWUjEoKQkJTVJTTCgyLCAxLCBjMCwgYzEsIDQpCisjZGVmaW5lIFJTWVNMX0VUTVNFUUVWUjIoKQkJTVJTTCgyLCAxLCBjMCwgYzIsIDQpCisjZGVmaW5lIFJTWVNMX0VUTVNFUVJTVEVWUigpCQlNUlNMKDIsIDEsIGMwLCBjNiwgNCkKKyNkZWZpbmUgUlNZU0xfRVRNU0VRU1RSKCkJCU1SU0woMiwgMSwgYzAsIGM3LCA0KQorI2RlZmluZSBSU1lTTF9FVE1TVEFMTENUTFIoKQkJTVJTTCgyLCAxLCBjMCwgYzExLCAwKQorI2RlZmluZSBSU1lTTF9FVE1TVEFUUigpCQlNUlNMKDIsIDEsIGMwLCBjMywgMCkKKyNkZWZpbmUgUlNZU0xfRVRNU1lOQ1BSKCkJCU1SU0woMiwgMSwgYzAsIGMxMywgMCkKKyNkZWZpbmUgUlNZU0xfRVRNVFJBQ0VJRFIoKQkJTVJTTCgyLCAxLCBjMCwgYzAsIDEpCisjZGVmaW5lIFJTWVNMX0VUTVRTQ1RMUigpCQlNUlNMKDIsIDEsIGMwLCBjMTIsIDApCisjZGVmaW5lIFJTWVNMX0VUTVZJQ1RMUigpCQlNUlNMKDIsIDEsIGMwLCBjMCwgMikKKyNkZWZpbmUgUlNZU0xfRVRNVklJRUNUTFIoKQkJTVJTTCgyLCAxLCBjMCwgYzEsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVZJU1NDVExSKCkJCU1SU0woMiwgMSwgYzAsIGMyLCAyKQorI2RlZmluZSBSU1lTTF9FVE1TU0NDUjAoKQkJTVJTTCgyLCAxLCBjMSwgYzAsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ0NSMSgpCQlNUlNMKDIsIDEsIGMxLCBjMSwgMikKKyNkZWZpbmUgUlNZU0xfRVRNU1NDQ1IyKCkJCU1SU0woMiwgMSwgYzEsIGMyLCAyKQorI2RlZmluZSBSU1lTTF9FVE1TU0NDUjMoKQkJTVJTTCgyLCAxLCBjMSwgYzMsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ0NSNCgpCQlNUlNMKDIsIDEsIGMxLCBjNCwgMikKKyNkZWZpbmUgUlNZU0xfRVRNU1NDQ1I1KCkJCU1SU0woMiwgMSwgYzEsIGM1LCAyKQorI2RlZmluZSBSU1lTTF9FVE1TU0NDUjYoKQkJTVJTTCgyLCAxLCBjMSwgYzYsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ0NSNygpCQlNUlNMKDIsIDEsIGMxLCBjNywgMikKKyNkZWZpbmUgUlNZU0xfRVRNU1NDU1IwKCkJCU1SU0woMiwgMSwgYzEsIGM4LCAyKQorI2RlZmluZSBSU1lTTF9FVE1TU0NTUjEoKQkJTVJTTCgyLCAxLCBjMSwgYzksIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSMigpCQlNUlNMKDIsIDEsIGMxLCBjMTAsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSMygpCQlNUlNMKDIsIDEsIGMxLCBjMTEsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSNCgpCQlNUlNMKDIsIDEsIGMxLCBjMTIsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSNSgpCQlNUlNMKDIsIDEsIGMxLCBjMTMsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSNigpCQlNUlNMKDIsIDEsIGMxLCBjMTQsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTQ1NSNygpCQlNUlNMKDIsIDEsIGMxLCBjMTUsIDIpCisjZGVmaW5lIFJTWVNMX0VUTVNTUENJQ1IwKCkJCU1SU0woMiwgMSwgYzEsIGMwLCAzKQorI2RlZmluZSBSU1lTTF9FVE1TU1BDSUNSMSgpCQlNUlNMKDIsIDEsIGMxLCBjMSwgMykKKyNkZWZpbmUgUlNZU0xfRVRNU1NQQ0lDUjIoKQkJTVJTTCgyLCAxLCBjMSwgYzIsIDMpCisjZGVmaW5lIFJTWVNMX0VUTVNTUENJQ1IzKCkJCU1SU0woMiwgMSwgYzEsIGMzLCAzKQorI2RlZmluZSBSU1lTTF9FVE1TU1BDSUNSNCgpCQlNUlNMKDIsIDEsIGMxLCBjNCwgMykKKyNkZWZpbmUgUlNZU0xfRVRNU1NQQ0lDUjUoKQkJTVJTTCgyLCAxLCBjMSwgYzUsIDMpCisjZGVmaW5lIFJTWVNMX0VUTVNTUENJQ1I2KCkJCU1SU0woMiwgMSwgYzEsIGM2LCAzKQorI2RlZmluZSBSU1lTTF9FVE1TU1BDSUNSNygpCQlNUlNMKDIsIDEsIGMxLCBjNywgMykKKworLyogNjQgYml0IHJlZ2lzdGVycyAqLworI2RlZmluZSBSU1lTUV9FVE1BQ0FUUjAoKQkJTVJTUSgyLCAxLCBjMiwgYzAsIDIpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSMSgpCQlNUlNRKDIsIDEsIGMyLCBjMiwgMikKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFIyKCkJCU1SU1EoMiwgMSwgYzIsIGM0LCAyKQorI2RlZmluZSBSU1lTUV9FVE1BQ0FUUjMoKQkJTVJTUSgyLCAxLCBjMiwgYzYsIDIpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSNCgpCQlNUlNRKDIsIDEsIGMyLCBjOCwgMikKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFI1KCkJCU1SU1EoMiwgMSwgYzIsIGMxMCwgMikKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFI2KCkJCU1SU1EoMiwgMSwgYzIsIGMxMiwgMikKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFI3KCkJCU1SU1EoMiwgMSwgYzIsIGMxNCwgMikKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFI4KCkJCU1SU1EoMiwgMSwgYzIsIGMwLCAzKQorI2RlZmluZSBSU1lTUV9FVE1BQ0FUUjkoKQkJTVJTUSgyLCAxLCBjMiwgYzIsIDMpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSMTAoKQkJTVJTUSgyLCAxLCBjMiwgYzQsIDMpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSMTEoKQkJTVJTUSgyLCAxLCBjMiwgYzYsIDMpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSMTIoKQkJTVJTUSgyLCAxLCBjMiwgYzgsIDMpCisjZGVmaW5lIFJTWVNRX0VUTUFDQVRSMTMoKQkJTVJTUSgyLCAxLCBjMiwgYzEwLCAzKQorI2RlZmluZSBSU1lTUV9FVE1BQ0FUUjE0KCkJCU1SU1EoMiwgMSwgYzIsIGMxMiwgMykKKyNkZWZpbmUgUlNZU1FfRVRNQUNBVFIxNSgpCQlNUlNRKDIsIDEsIGMyLCBjMTQsIDMpCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjAoKQkJTVJTUSgyLCAxLCBjMywgYzAsIDApCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjEoKQkJTVJTUSgyLCAxLCBjMywgYzIsIDApCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjIoKQkJTVJTUSgyLCAxLCBjMywgYzQsIDApCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjMoKQkJTVJTUSgyLCAxLCBjMywgYzYsIDApCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjQoKQkJTVJTUSgyLCAxLCBjMywgYzgsIDApCisjZGVmaW5lIFJTWVNRX0VUTUNJRENWUjUoKQkJTVJTUSgyLCAxLCBjMywgYzEwLCAwKQorI2RlZmluZSBSU1lTUV9FVE1DSURDVlI2KCkJCU1SU1EoMiwgMSwgYzMsIGMxMiwgMCkKKyNkZWZpbmUgUlNZU1FfRVRNQ0lEQ1ZSNygpCQlNUlNRKDIsIDEsIGMzLCBjMTQsIDApCisjZGVmaW5lIFJTWVNRX0VUTUFDVlIwKCkJCU1SU1EoMiwgMSwgYzIsIGMwLCAwKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSMSgpCQlNUlNRKDIsIDEsIGMyLCBjMiwgMCkKKyNkZWZpbmUgUlNZU1FfRVRNQUNWUjIoKQkJTVJTUSgyLCAxLCBjMiwgYzQsIDApCisjZGVmaW5lIFJTWVNRX0VUTUFDVlIzKCkJCU1SU1EoMiwgMSwgYzIsIGM2LCAwKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSNCgpCQlNUlNRKDIsIDEsIGMyLCBjOCwgMCkKKyNkZWZpbmUgUlNZU1FfRVRNQUNWUjUoKQkJTVJTUSgyLCAxLCBjMiwgYzEwLCAwKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSNigpCQlNUlNRKDIsIDEsIGMyLCBjMTIsIDApCisjZGVmaW5lIFJTWVNRX0VUTUFDVlI3KCkJCU1SU1EoMiwgMSwgYzIsIGMxNCwgMCkKKyNkZWZpbmUgUlNZU1FfRVRNQUNWUjgoKQkJTVJTUSgyLCAxLCBjMiwgYzAsIDEpCisjZGVmaW5lIFJTWVNRX0VUTUFDVlI5KCkJCU1SU1EoMiwgMSwgYzIsIGMyLCAxKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSMTAoKQkJTVJTUSgyLCAxLCBjMiwgYzQsIDEpCisjZGVmaW5lIFJTWVNRX0VUTUFDVlIxMSgpCQlNUlNRKDIsIDEsIGMyLCBjNiwgMSkKKyNkZWZpbmUgUlNZU1FfRVRNQUNWUjEyKCkJCU1SU1EoMiwgMSwgYzIsIGM4LCAxKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSMTMoKQkJTVJTUSgyLCAxLCBjMiwgYzEwLCAxKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSMTQoKQkJTVJTUSgyLCAxLCBjMiwgYzEyLCAxKQorI2RlZmluZSBSU1lTUV9FVE1BQ1ZSMTUoKQkJTVJTUSgyLCAxLCBjMiwgYzE0LCAxKQorI2RlZmluZSBSU1lTUV9FVE1WTUlEQ1ZSMCgpCQlNUlNRKDIsIDEsIGMzLCBjMCwgMSkKKyNkZWZpbmUgUlNZU1FfRVRNVk1JRENWUjEoKQkJTVJTUSgyLCAxLCBjMywgYzIsIDEpCisjZGVmaW5lIFJTWVNRX0VUTVZNSURDVlIyKCkJCU1SU1EoMiwgMSwgYzMsIGM0LCAxKQorI2RlZmluZSBSU1lTUV9FVE1WTUlEQ1ZSMygpCQlNUlNRKDIsIDEsIGMzLCBjNiwgMSkKKyNkZWZpbmUgUlNZU1FfRVRNVk1JRENWUjQoKQkJTVJTUSgyLCAxLCBjMywgYzgsIDEpCisjZGVmaW5lIFJTWVNRX0VUTVZNSURDVlI1KCkJCU1SU1EoMiwgMSwgYzMsIGMxMCwgMSkKKyNkZWZpbmUgUlNZU1FfRVRNVk1JRENWUjYoKQkJTVJTUSgyLCAxLCBjMywgYzEyLCAxKQorI2RlZmluZSBSU1lTUV9FVE1WTUlEQ1ZSNygpCQlNUlNRKDIsIDEsIGMzLCBjMTQsIDEpCisjZGVmaW5lIFJTWVNRX0VUTURWQ1ZSMCgpCQlNUlNRKDIsIDEsIGMyLCBjMCwgNCkKKyNkZWZpbmUgUlNZU1FfRVRNRFZDVlIxKCkJCU1SU1EoMiwgMSwgYzIsIGM0LCA0KQorI2RlZmluZSBSU1lTUV9FVE1EVkNWUjIoKQkJTVJTUSgyLCAxLCBjMiwgYzgsIDQpCisjZGVmaW5lIFJTWVNRX0VUTURWQ1ZSMygpCQlNUlNRKDIsIDEsIGMyLCBjMTIsIDQpCisjZGVmaW5lIFJTWVNRX0VUTURWQ1ZSNCgpCQlNUlNRKDIsIDEsIGMyLCBjMCwgNSkKKyNkZWZpbmUgUlNZU1FfRVRNRFZDVlI1KCkJCU1SU1EoMiwgMSwgYzIsIGM0LCA1KQorI2RlZmluZSBSU1lTUV9FVE1EVkNWUjYoKQkJTVJTUSgyLCAxLCBjMiwgYzgsIDUpCisjZGVmaW5lIFJTWVNRX0VUTURWQ1ZSNygpCQlNUlNRKDIsIDEsIGMyLCBjMTIsIDUpCisjZGVmaW5lIFJTWVNRX0VUTURWQ01SMCgpCQlNUlNRKDIsIDEsIGMyLCBjMCwgNikKKyNkZWZpbmUgUlNZU1FfRVRNRFZDTVIxKCkJCU1SU1EoMiwgMSwgYzIsIGM0LCA2KQorI2RlZmluZSBSU1lTUV9FVE1EVkNNUjIoKQkJTVJTUSgyLCAxLCBjMiwgYzgsIDYpCisjZGVmaW5lIFJTWVNRX0VUTURWQ01SMygpCQlNUlNRKDIsIDEsIGMyLCBjMTIsIDYpCisjZGVmaW5lIFJTWVNRX0VUTURWQ01SNCgpCQlNUlNRKDIsIDEsIGMyLCBjMCwgNykKKyNkZWZpbmUgUlNZU1FfRVRNRFZDTVI1KCkJCU1SU1EoMiwgMSwgYzIsIGM0LCA3KQorI2RlZmluZSBSU1lTUV9FVE1EVkNNUjYoKQkJTVJTUSgyLCAxLCBjMiwgYzgsIDcpCisjZGVmaW5lIFJTWVNRX0VUTURWQ01SNygpCQlNUlNRKDIsIDEsIGMyLCBjMTIsIDcpCisKKy8qIDMyIGFuZCA2NCBiaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdTWVNfRVRNQVVYQ1RMUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzYsIDApCisjZGVmaW5lIFdTWVNfRVRNQUNBVFIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgMikKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGMyLCAyKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzQsIDIpCisjZGVmaW5lIFdTWVNfRVRNQUNBVFIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjNiwgMikKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjQodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM4LCAyKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSNSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzEwLCAyKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzEyLCAyKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSNyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzE0LCAyKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSOCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzAsIDMpCisjZGVmaW5lIFdTWVNfRVRNQUNBVFI5KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMiwgMykKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjEwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjNCwgMykKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjExKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjNiwgMykKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjEyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjOCwgMykKKyNkZWZpbmUgV1NZU19FVE1BQ0FUUjEzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTAsIDMpCisjZGVmaW5lIFdTWVNfRVRNQUNBVFIxNCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzEyLCAzKQorI2RlZmluZSBXU1lTX0VUTUFDQVRSMTUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGMxNCwgMykKKyNkZWZpbmUgV1NZU19FVE1BQ1ZSMCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzAsIDApCisjZGVmaW5lIFdTWVNfRVRNQUNWUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGMyLCAwKQorI2RlZmluZSBXU1lTX0VUTUFDVlIyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjNCwgMCkKKyNkZWZpbmUgV1NZU19FVE1BQ1ZSMyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzYsIDApCisjZGVmaW5lIFdTWVNfRVRNQUNWUjQodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM4LCAwKQorI2RlZmluZSBXU1lTX0VUTUFDVlI1KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTAsIDApCisjZGVmaW5lIFdTWVNfRVRNQUNWUjYodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGMxMiwgMCkKKyNkZWZpbmUgV1NZU19FVE1BQ1ZSNyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzE0LCAwKQorI2RlZmluZSBXU1lTX0VUTUFDVlI4KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgMSkKKyNkZWZpbmUgV1NZU19FVE1BQ1ZSOSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzIsIDEpCisjZGVmaW5lIFdTWVNfRVRNQUNWUjEwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjNCwgMSkKKyNkZWZpbmUgV1NZU19FVE1BQ1ZSMTEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM2LCAxKQorI2RlZmluZSBXU1lTX0VUTUFDVlIxMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzgsIDEpCisjZGVmaW5lIFdTWVNfRVRNQUNWUjEzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTAsIDEpCisjZGVmaW5lIFdTWVNfRVRNQUNWUjE0KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTIsIDEpCisjZGVmaW5lIFdTWVNfRVRNQUNWUjE1KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTQsIDEpCisjZGVmaW5lIFdTWVNfRVRNQ0NDVExSKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMTQsIDApCisjZGVmaW5lIFdTWVNfRVRNQ0lEQ0NUTFIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMCwgMikKKyNkZWZpbmUgV1NZU19FVE1DSURDVlIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMCwgMCkKKyNkZWZpbmUgV1NZU19FVE1DSURDVlIxKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMiwgMCkKKyNkZWZpbmUgV1NZU19FVE1DSURDVlIyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjNCwgMCkKKyNkZWZpbmUgV1NZU19FVE1DSURDVlIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjNiwgMCkKKyNkZWZpbmUgV1NZU19FVE1DSURDVlI0KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjOCwgMCkKKyNkZWZpbmUgV1NZU19FVE1DSURDVlI1KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMTAsIDApCisjZGVmaW5lIFdTWVNfRVRNQ0lEQ1ZSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMywgYzEyLCAwKQorI2RlZmluZSBXU1lTX0VUTUNJRENWUjcodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzMsIGMxNCwgMCkKKyNkZWZpbmUgV1NZU19FVE1DTlRDVExSMCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzQsIDUpCisjZGVmaW5lIFdTWVNfRVRNQ05UQ1RMUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGM1LCA1KQorI2RlZmluZSBXU1lTX0VUTUNOVENUTFIyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjNiwgNSkKKyNkZWZpbmUgV1NZU19FVE1DTlRDVExSMyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzcsIDUpCisjZGVmaW5lIFdTWVNfRVRNQ05UUkxEVlIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMCwgNSkKKyNkZWZpbmUgV1NZU19FVE1DTlRSTERWUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMxLCA1KQorI2RlZmluZSBXU1lTX0VUTUNOVFJMRFZSMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzIsIDUpCisjZGVmaW5lIFdTWVNfRVRNQ05UUkxEVlIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMywgNSkKKyNkZWZpbmUgV1NZU19FVE1DTlRWUjAodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGM4LCA1KQorI2RlZmluZSBXU1lTX0VUTUNOVFZSMSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzksIDUpCisjZGVmaW5lIFdTWVNfRVRNQ05UVlIyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMTAsIDUpCisjZGVmaW5lIFdTWVNfRVRNQ05UVlIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMTEsIDUpCisjZGVmaW5lIFdTWVNfRVRNQ09ORklHUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzQsIDApCisjZGVmaW5lIFdTWVNfRVRNRVZFTlRDVEwwUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzgsIDApCisjZGVmaW5lIFdTWVNfRVRNRVZFTlRDVEwxUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzksIDApCisjZGVmaW5lIFdTWVNfRVRNRVhUSU5TRUxSKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjOCwgNCkKKyNkZWZpbmUgV1NZU19FVE1JTVNQRUMwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMCwgNykKKyNkZWZpbmUgV1NZU19FVE1PU0xBUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzAsIDQpCisjZGVmaW5lIFdTWVNfRVRNUFJHQ1RMUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzEsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMTAodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMCwgMCkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIxMSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzExLCAwKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjEyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMTIsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMTModmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMywgMCkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIxNCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzE0LCAwKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjE1KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMTUsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzIsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzMsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSNCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzQsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSNSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzUsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzYsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSNyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzcsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSOCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzgsIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSOSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzksIDApCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMTYodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMwLCAxKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjE3KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMSwgMSkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIxOCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzIsIDEpCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMTkodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMzLCAxKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjNCwgMSkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIyMSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzUsIDEpCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMjIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM2LCAxKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjNywgMSkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIyNCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzgsIDEpCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMjUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM5LCAxKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjI2KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMTAsIDEpCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMjcodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMSwgMSkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIyOCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzEyLCAxKQorI2RlZmluZSBXU1lTX0VUTVJTQ1RMUjI5KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMTMsIDEpCisjZGVmaW5lIFdTWVNfRVRNUlNDVExSMzAodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxNCwgMSkKKyNkZWZpbmUgV1NZU19FVE1SU0NUTFIzMSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzE1LCAxKQorI2RlZmluZSBXU1lTX0VUTVNFUUVWUjAodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMwLCA0KQorI2RlZmluZSBXU1lTX0VUTVNFUUVWUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMxLCA0KQorI2RlZmluZSBXU1lTX0VUTVNFUUVWUjIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMyLCA0KQorI2RlZmluZSBXU1lTX0VUTVNFUVJTVEVWUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzYsIDQpCisjZGVmaW5lIFdTWVNfRVRNU0VRU1RSKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjNywgNCkKKyNkZWZpbmUgV1NZU19FVE1TVEFMTENUTFIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMxMSwgMCkKKyNkZWZpbmUgV1NZU19FVE1TWU5DUFIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMxMywgMCkKKyNkZWZpbmUgV1NZU19FVE1UUkFDRUlEUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzAsIDEpCisjZGVmaW5lIFdTWVNfRVRNVFNDVExSKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMTIsIDApCisjZGVmaW5lIFdTWVNfRVRNVklDVExSKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMwLCBjMCwgMikKKyNkZWZpbmUgV1NZU19FVE1WSUlFQ1RMUih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMCwgYzEsIDIpCisjZGVmaW5lIFdTWVNfRVRNVklTU0NUTFIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzAsIGMyLCAyKQorI2RlZmluZSBXU1lTX0VUTVZNSURDVlIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMCwgMSkKKyNkZWZpbmUgV1NZU19FVE1WTUlEQ1ZSMSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMywgYzIsIDEpCisjZGVmaW5lIFdTWVNfRVRNVk1JRENWUjIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzMsIGM0LCAxKQorI2RlZmluZSBXU1lTX0VUTVZNSURDVlIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjNiwgMSkKKyNkZWZpbmUgV1NZU19FVE1WTUlEQ1ZSNCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMywgYzgsIDEpCisjZGVmaW5lIFdTWVNfRVRNVk1JRENWUjUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzMsIGMxMCwgMSkKKyNkZWZpbmUgV1NZU19FVE1WTUlEQ1ZSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMywgYzEyLCAxKQorI2RlZmluZSBXU1lTX0VUTVZNSURDVlI3KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMzLCBjMTQsIDEpCisjZGVmaW5lIFdTWVNfRVRNRFZDVlIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgNCkKKyNkZWZpbmUgV1NZU19FVE1EVkNWUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM0LCA0KQorI2RlZmluZSBXU1lTX0VUTURWQ1ZSMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzgsIDQpCisjZGVmaW5lIFdTWVNfRVRNRFZDVlIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTIsIDQpCisjZGVmaW5lIFdTWVNfRVRNRFZDVlI0KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgNSkKKyNkZWZpbmUgV1NZU19FVE1EVkNWUjUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM0LCA1KQorI2RlZmluZSBXU1lTX0VUTURWQ1ZSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzgsIDUpCisjZGVmaW5lIFdTWVNfRVRNRFZDVlI3KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTIsIDUpCisjZGVmaW5lIFdTWVNfRVRNRFZDTVIwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgNikKKyNkZWZpbmUgV1NZU19FVE1EVkNNUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM0LCA2KQorI2RlZmluZSBXU1lTX0VUTURWQ01SMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzgsIDYpCisjZGVmaW5lIFdTWVNfRVRNRFZDTVIzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTIsIDYpCisjZGVmaW5lIFdTWVNfRVRNRFZDTVI0KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMCwgNykKKyNkZWZpbmUgV1NZU19FVE1EVkNNUjUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzIsIGM0LCA3KQorI2RlZmluZSBXU1lTX0VUTURWQ01SNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMiwgYzgsIDcpCisjZGVmaW5lIFdTWVNfRVRNRFZDTVI3KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMyLCBjMTIsIDcpCisjZGVmaW5lIFdTWVNfRVRNU1NDQ1IwKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMCwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NDUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxLCAyKQorI2RlZmluZSBXU1lTX0VUTVNTQ0NSMih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzIsIDIpCisjZGVmaW5lIFdTWVNfRVRNU1NDQ1IzKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMywgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NDUjQodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM0LCAyKQorI2RlZmluZSBXU1lTX0VUTVNTQ0NSNSh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzUsIDIpCisjZGVmaW5lIFdTWVNfRVRNU1NDQ1I2KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjNiwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NDUjcodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM3LCAyKQorI2RlZmluZSBXU1lTX0VUTVNTQ1NSMCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzgsIDIpCisjZGVmaW5lIFdTWVNfRVRNU1NDU1IxKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjOSwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjIodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMCwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjModmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMSwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjQodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMiwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjUodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxMywgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjYodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxNCwgMikKKyNkZWZpbmUgV1NZU19FVE1TU0NTUjcodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxNSwgMikKKyNkZWZpbmUgV1NZU19FVE1TU1BDSUNSMCh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzAsIDMpCisjZGVmaW5lIFdTWVNfRVRNU1NQQ0lDUjEodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGMxLCAzKQorI2RlZmluZSBXU1lTX0VUTVNTUENJQ1IyKHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjMiwgMykKKyNkZWZpbmUgV1NZU19FVE1TU1BDSUNSMyh2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzMsIDMpCisjZGVmaW5lIFdTWVNfRVRNU1NQQ0lDUjQodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM0LCAzKQorI2RlZmluZSBXU1lTX0VUTVNTUENJQ1I1KHZhbCkJCU1TUih2YWwsIDIsIDEsIGMxLCBjNSwgMykKKyNkZWZpbmUgV1NZU19FVE1TU1BDSUNSNih2YWwpCQlNU1IodmFsLCAyLCAxLCBjMSwgYzYsIDMpCisjZGVmaW5lIFdTWVNfRVRNU1NQQ0lDUjcodmFsKQkJTVNSKHZhbCwgMiwgMSwgYzEsIGM3LCAzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21lbW9yeS5oCmluZGV4IDVlZGI2ZWQuLmYzYTE0MmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMTY1LDYgKzE2NSwxMSBAQAogLyogdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBrZXJuZWwgdmlydHVhbCBhbmQgcGh5c2ljYWwgbWFwcGluZ3MgKi8KIGV4dGVybiB1NjQJCQlraW1hZ2Vfdm9mZnNldDsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGthc2xyX29mZnNldCh2b2lkKQoreworCXJldHVybiBraW1hZ2VfdmFkZHIgLSBLSU1BR0VfVkFERFI7Cit9CisKIC8qCiAgKiBBbGxvdyBhbGwgbWVtb3J5IGF0IHRoZSBkaXNjb3Zlcnkgc3RhZ2UuIFdlIHdpbGwgY2xpcCBpdCBsYXRlci4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1kLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYwppbmRleCAzOTRjNjFkLi4xZDU4OTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYwpAQCAtMTU3LDkgKzE1NywxMSBAQAogCiB2b2lkIGZwc2ltZF9mbHVzaF90aHJlYWQodm9pZCkKIHsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAltZW1zZXQoJmN1cnJlbnQtPnRocmVhZC5mcHNpbWRfc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgZnBzaW1kX3N0YXRlKSk7CiAJZnBzaW1kX2ZsdXNoX3Rhc2tfc3RhdGUoY3VycmVudCk7CiAJc2V0X3RocmVhZF9mbGFnKFRJRl9GT1JFSUdOX0ZQU1RBVEUpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwppbmRleCBiYTI5MDk1Li5hNThmYjkyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMKQEAgLTM1NiwxMSArMzU2LDExIEBACiBzdGF0aWMgaW50IGR1bXBfa2VybmVsX29mZnNldChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdiwKIAkJCSAgICAgIHZvaWQgKnApCiB7Ci0JdTY0IGNvbnN0IGthc2xyX29mZnNldCA9IGtpbWFnZV92YWRkciAtIEtJTUFHRV9WQUREUjsKKwljb25zdCB1bnNpZ25lZCBsb25nIG9mZnNldCA9IGthc2xyX29mZnNldCgpOwogCi0JaWYgKElTX0VOQUJMRUQoQ09ORklHX1JBTkRPTUlaRV9CQVNFKSAmJiBrYXNscl9vZmZzZXQgPiAwKSB7Ci0JCXByX2VtZXJnKCJLZXJuZWwgT2Zmc2V0OiAweCVsbHggZnJvbSAweCVseFxuIiwKLQkJCSBrYXNscl9vZmZzZXQsIEtJTUFHRV9WQUREUik7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1JBTkRPTUlaRV9CQVNFKSAmJiBvZmZzZXQgPiAwKSB7CisJCXByX2VtZXJnKCJLZXJuZWwgT2Zmc2V0OiAweCVseCBmcm9tIDB4JWx4XG4iLAorCQkJIG9mZnNldCwgS0lNQUdFX1ZBRERSKTsKIAl9IGVsc2UgewogCQlwcl9lbWVyZygiS2VybmVsIE9mZnNldDogZGlzYWJsZWRcbiIpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2FybTY0L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDdiNjcwZjEuLmYyZmU5NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtNDIwLDYgKzQyMCwxMSBAQAogCXJldHVybiAmY3B1X3RvcG9sb2d5W2NwdV0uY29yZV9zaWJsaW5nOwogfQogCitzdGF0aWMgaW50IGNwdV9jcHVfZmxhZ3Modm9pZCkKK3sKKwlyZXR1cm4gU0RfQVNZTV9DUFVDQVBBQ0lUWTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgY3B1X2NvcmVwb3dlcl9mbGFncyh2b2lkKQogewogCXJldHVybiBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTICB8IFNEX1NIQVJFX1BPV0VSRE9NQUlOIHwgXApAQCAtNDMwLDcgKzQzNSw3IEBACiAjaWZkZWYgQ09ORklHX1NDSEVEX01DCiAJeyBjcHVfY29yZWdyb3VwX21hc2ssIGNwdV9jb3JlcG93ZXJfZmxhZ3MsIGNwdV9jb3JlX2VuZXJneSwgU0RfSU5JVF9OQU1FKE1DKSB9LAogI2VuZGlmCi0JeyBjcHVfY3B1X21hc2ssIE5VTEwsIGNwdV9jbHVzdGVyX2VuZXJneSwgU0RfSU5JVF9OQU1FKERJRSkgfSwKKwl7IGNwdV9jcHVfbWFzaywgY3B1X2NwdV9mbGFncywgY3B1X2NsdXN0ZXJfZW5lcmd5LCBTRF9JTklUX05BTUUoRElFKSB9LAogCXsgTlVMTCwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGU1NzZjMWQuLjU2MjA1MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdHJhcHMuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9leGNlcHRpb24uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtX21pc2MuaD4KICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4Y2VwdGlvbi5oPgogCiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlcltdPSB7CiAJIlN5bmNocm9ub3VzIEFib3J0IiwKQEAgLTQ1OCw2ICs0NTksOCBAQAogCiBhc21saW5rYWdlIHZvaWQgX19leGNlcHRpb24gZG9fdW5kZWZpbnN0cihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwl2b2lkIF9fdXNlciAqcGMgPSAodm9pZCBfX3VzZXIgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCiAJLyogY2hlY2sgZm9yIEFBcmNoMzIgYnJlYWtwb2ludCBpbnN0cnVjdGlvbnMgKi8KIAlpZiAoIWFhcmNoMzJfYnJlYWtfaGFuZGxlcihyZWdzKSkKIAkJcmV0dXJuOwpAQCAtNDY1LDYgKzQ2OCw4IEBACiAJaWYgKGNhbGxfdW5kZWZfaG9vayhyZWdzKSA9PSAwKQogCQlyZXR1cm47CiAKKwl0cmFjZV91bmRlZl9pbnN0cihyZWdzLCBwYyk7CisKIAlmb3JjZV9zaWduYWxfaW5qZWN0KFNJR0lMTCwgSUxMX0lMTE9QQywgcmVncywgMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYwppbmRleCA3ZjkwYjdlLi41MjI5YjMzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCkBAIC0xOTA2LDIzICsxOTA2LDQyIEBACiAgKiBJTyBhZGRyZXNzIHJhbmdlcywgd2hpY2ggaXMgcmVxdWlyZWQgdG8gcGVyZm9ybSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKICAqIG1hcHBpbmcgd2l0aCBJT01NVSBhd2FyZSBmdW5jdGlvbnMuCiAgKgotICogVGhlIGNsaWVudCBkZXZpY2UgbmVlZCB0byBiZSBhdHRhY2hlZCB0byB0aGUgbWFwcGluZyB3aXRoCi0gKiBhcm1faW9tbXVfYXR0YWNoX2RldmljZSBmdW5jdGlvbi4KKyAqIENsaWVudHMgbWF5IHVzZSBpb21tdV9kb21haW5fc2V0X2F0dHIoKSB0byBzZXQgYWRkaXRpb25hbCBmbGFncyBwcmlvcgorICogdG8gY2FsbGluZyBhcm1faW9tbXVfYXR0YWNoX2RldmljZSgpIHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uLgogICovCiBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKgogYXJtX2lvbW11X2NyZWF0ZV9tYXBwaW5nKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBkbWFfYWRkcl90IGJhc2UsIHNpemVfdCBzaXplKQogewogCXVuc2lnbmVkIGludCBiaXRzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwotCXVuc2lnbmVkIGludCBiaXRtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MoYml0cykgKiBzaXplb2YobG9uZyk7CiAJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nOwotCWludCBlcnIgPSAtRU5PTUVNOwogCi0JaWYgKCFiaXRtYXBfc2l6ZSkKKwlpZiAoIWJpdHMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJbWFwcGluZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyksIEdGUF9LRVJORUwpOwogCWlmICghbWFwcGluZykKLQkJZ290byBlcnI7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWFwcGluZy0+YmFzZSA9IGJhc2U7CisJbWFwcGluZy0+Yml0cyA9IGJpdHM7CisKKwltYXBwaW5nLT5kb21haW4gPSBpb21tdV9kb21haW5fYWxsb2MoYnVzKTsKKwlpZiAoIW1hcHBpbmctPmRvbWFpbikKKwkJZ290byBlcnJfZG9tYWluX2FsbG9jOworCisJbWFwcGluZy0+aW5pdCA9IGZhbHNlOworCXJldHVybiBtYXBwaW5nOworCitlcnJfZG9tYWluX2FsbG9jOgorCWtmcmVlKG1hcHBpbmcpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworfQorRVhQT1JUX1NZTUJPTChhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcpOworCitzdGF0aWMgaW50CitiaXRtYXBfaW9tbXVfaW5pdF9tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nKQoreworCXVuc2lnbmVkIGludCBiaXRtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1MobWFwcGluZy0+Yml0cykgKiBzaXplb2YobG9uZyk7CiAKIAltYXBwaW5nLT5iaXRtYXAgPSBremFsbG9jKGJpdG1hcF9zaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOIHwKIAkJCQkJCQlfX0dGUF9OT1JFVFJZKTsKQEAgLTE5MzAsNjcgKzE5NDksMTI0IEBACiAJCW1hcHBpbmctPmJpdG1hcCA9IHZ6YWxsb2MoYml0bWFwX3NpemUpOwogCiAJaWYgKCFtYXBwaW5nLT5iaXRtYXApCi0JCWdvdG8gZXJyMjsKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQltYXBwaW5nLT5iYXNlID0gYmFzZTsKLQltYXBwaW5nLT5iaXRzID0gYml0czsKIAlzcGluX2xvY2tfaW5pdCgmbWFwcGluZy0+bG9jayk7Ci0KLQltYXBwaW5nLT5kb21haW4gPSBpb21tdV9kb21haW5fYWxsb2MoYnVzKTsKLQlpZiAoIW1hcHBpbmctPmRvbWFpbikKLQkJZ290byBlcnIzOwotCi0Ja3JlZl9pbml0KCZtYXBwaW5nLT5rcmVmKTsKLQlyZXR1cm4gbWFwcGluZzsKLWVycjM6Ci0Ja3ZmcmVlKG1hcHBpbmctPmJpdG1hcCk7Ci1lcnIyOgotCWtmcmVlKG1hcHBpbmcpOwotZXJyOgotCXJldHVybiBFUlJfUFRSKGVycik7CisJbWFwcGluZy0+b3BzID0gJmlvbW11X29wczsKKwlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woYXJtX2lvbW11X2NyZWF0ZV9tYXBwaW5nKTsKIAotc3RhdGljIHZvaWQgcmVsZWFzZV9pb21tdV9tYXBwaW5nKHN0cnVjdCBrcmVmICprcmVmKQorc3RhdGljIHZvaWQgYml0bWFwX2lvbW11X3JlbGVhc2VfbWFwcGluZyhzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPQorCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nLCBrcmVmKTsKKworCWtmcmVlKG1hcHBpbmctPmJpdG1hcCk7CisJaW9tbXVfZG9tYWluX2ZyZWUobWFwcGluZy0+ZG9tYWluKTsKKwlrZnJlZShtYXBwaW5nKTsKK30KKworc3RhdGljIHZvaWQgYnlwYXNzX2lvbW11X3JlbGVhc2VfbWFwcGluZyhzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPQogCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nLCBrcmVmKTsKIAogCWlvbW11X2RvbWFpbl9mcmVlKG1hcHBpbmctPmRvbWFpbik7Ci0Ja3ZmcmVlKG1hcHBpbmctPmJpdG1hcCk7CiAJa2ZyZWUobWFwcGluZyk7CiB9CiAKK3N0YXRpYyBpbnQgdXBzdHJlYW1faW9tbXVfaW5pdF9tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nKQoreworCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IG1hcHBpbmctPmRvbWFpbjsKKwlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwID0gZGV2LT5pb21tdV9ncm91cDsKKwlkbWFfYWRkcl90IGJhc2UgPSBtYXBwaW5nLT5iYXNlOworCXU2NCBzaXplID0gbWFwcGluZy0+Yml0cyA8PCBQQUdFX1NISUZUOworCisJaWYgKGlvbW11X2dldF9kbWFfY29va2llKGRvbWFpbikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTmVlZCB0byBhdHRhY2ggdG8gZ2V0IGdlb21ldHJ5ICovCisJaWYgKGlvbW11X2F0dGFjaF9ncm91cChkb21haW4sIGdyb3VwKSkKKwkJZ290byBvdXRfcHV0X2Nvb2tpZTsKKworCWlmIChpb21tdV9kbWFfaW5pdF9kb21haW4oZG9tYWluLCBiYXNlLCBzaXplLCBkZXYpKQorCQlnb3RvIG91dF9kZXRhY2hfZ3JvdXA7CisKKwltYXBwaW5nLT5vcHMgPSAmaW9tbXVfZG1hX29wczsKKwlpb21tdV9kZXRhY2hfZ3JvdXAoZG9tYWluLCBncm91cCk7CisJcmV0dXJuIDA7CisKK291dF9kZXRhY2hfZ3JvdXA6CisJaW9tbXVfZGV0YWNoX2dyb3VwKGRvbWFpbiwgZ3JvdXApOworb3V0X3B1dF9jb29raWU6CisJaW9tbXVfcHV0X2RtYV9jb29raWUoZG9tYWluKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgdXBzdHJlYW1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcsIGtyZWYpOworCisJaW9tbXVfcHV0X2RtYV9jb29raWUobWFwcGluZy0+ZG9tYWluKTsKKwlpb21tdV9kb21haW5fZnJlZShtYXBwaW5nLT5kb21haW4pOworCWtmcmVlKG1hcHBpbmcpOworfQorCisvKgorICogYXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZworICogQG1hcHBpbmc6IGFsbG9jdGVkIHZpYSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoKQorICoKKyAqIEZyZWVzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpb21tdSBtYXBwaW5nLgorICogVGhlIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXBwaW5nIG11c3QgYmUgaW4gdGhlICdkZXRhY2hlZCcgc3RhdGUKKyAqLwogdm9pZCBhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKHN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZykKIHsKLQlpZiAobWFwcGluZykKLQkJa3JlZl9wdXQoJm1hcHBpbmctPmtyZWYsIHJlbGVhc2VfaW9tbXVfbWFwcGluZyk7CisJaW50IHMxX2J5cGFzcyA9IDAsIGlzX2Zhc3QgPSAwLCBpc191cHN0cmVhbSA9IDA7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBrcmVmICprcmVmKTsKKworCWlmICghbWFwcGluZykKKwkJcmV0dXJuOworCisJaWYgKCFtYXBwaW5nLT5pbml0KSB7CisJCWlvbW11X2RvbWFpbl9mcmVlKG1hcHBpbmctPmRvbWFpbik7CisJCWtmcmVlKG1hcHBpbmcpOworCQlyZXR1cm47CisJfQorCisJaW9tbXVfZG9tYWluX2dldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwgRE9NQUlOX0FUVFJfUzFfQllQQVNTLAorCQkJCQkmczFfYnlwYXNzKTsKKwlpb21tdV9kb21haW5fZ2V0X2F0dHIobWFwcGluZy0+ZG9tYWluLCBET01BSU5fQVRUUl9GQVNULCAmaXNfZmFzdCk7CisJaW9tbXVfZG9tYWluX2dldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwKKwkJCQlET01BSU5fQVRUUl9VUFNUUkVBTV9JT1ZBX0FMTE9DQVRPUiwKKwkJCQkmaXNfdXBzdHJlYW0pOworCisJaWYgKHMxX2J5cGFzcykKKwkJcmVsZWFzZSA9IGJ5cGFzc19pb21tdV9yZWxlYXNlX21hcHBpbmc7CisJZWxzZSBpZiAoaXNfZmFzdCkKKwkJcmVsZWFzZSA9IGZhc3Rfc21tdV9yZWxlYXNlX21hcHBpbmc7CisJZWxzZSBpZiAoaXNfdXBzdHJlYW0pCisJCXJlbGVhc2UgPSB1cHN0cmVhbV9pb21tdV9yZWxlYXNlX21hcHBpbmc7CisJZWxzZQorCQlyZWxlYXNlID0gYml0bWFwX2lvbW11X3JlbGVhc2VfbWFwcGluZzsKKworCWtyZWZfcHV0KCZtYXBwaW5nLT5rcmVmLCByZWxlYXNlKTsKIH0KIEVYUE9SVF9TWU1CT0woYXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZyk7CiAKLS8qKgotICogYXJtX2lvbW11X2F0dGFjaF9kZXZpY2UKLSAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlcgotICogQG1hcHBpbmc6IGlvIGFkZHJlc3Mgc3BhY2UgbWFwcGluZyBzdHJ1Y3R1cmUgKHJldHVybmVkIGZyb20KLSAqCWFybV9pb21tdV9jcmVhdGVfbWFwcGluZykKLSAqCi0gKiBBdHRhY2hlcyBzcGVjaWZpZWQgaW8gYWRkcmVzcyBzcGFjZSBtYXBwaW5nIHRvIHRoZSBwcm92aWRlZCBkZXZpY2UsCi0gKiB0aGlzIHJlcGxhY2VzIHRoZSBkbWEgb3BlcmF0aW9ucyAoZG1hX21hcF9vcHMgcG9pbnRlcikgd2l0aCB0aGUKLSAqIElPTU1VIGF3YXJlIHZlcnNpb24uIE9ubHkgb25lIGRldmljZSBpbiBhbiBpb21tdV9ncm91cCBtYXkgdXNlIHRoaXMKLSAqIGZ1bmN0aW9uLgotICovCi1pbnQgYXJtX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIGludCBhcm1faW9tbXVfaW5pdF9tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcpCiB7Ci0JaW50IGVycjsKLQlpbnQgczFfYnlwYXNzID0gMCwgaXNfZmFzdCA9IDA7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IHMxX2J5cGFzcyA9IDAsIGlzX2Zhc3QgPSAwLCBpc191cHN0cmVhbSA9IDA7CiAJc3RydWN0IGlvbW11X2dyb3VwICpncm91cDsKIAlkbWFfYWRkcl90IGlvdmFfZW5kOwogCiAJZ3JvdXAgPSBkZXYtPmlvbW11X2dyb3VwOwogCWlmICghZ3JvdXApIHsKIAkJZGV2X2VycihkZXYsICJObyBpb21tdSBhc3NvY2lhdGVkIHdpdGggZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSkgewpAQCAtMTk5OCw2ICsyMDc0LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChtYXBwaW5nLT5pbml0KSB7CisJCWtyZWZfZ2V0KCZtYXBwaW5nLT5rcmVmKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJaW92YV9lbmQgPSBtYXBwaW5nLT5iYXNlICsgKG1hcHBpbmctPmJpdHMgPDwgUEFHRV9TSElGVCkgLSAxOwogCWlmIChpb3ZhX2VuZCA+IGRtYV9nZXRfbWFzayhkZXYpKSB7CiAJCWRldl9lcnIoZGV2LCAiZG1hIG1hc2sgJWxseCB0b28gc21hbGwgZm9yIHJlcXVlc3RlZCBpb3ZhIHJhbmdlICVwYWQgdG8gJXBhZFxuIiwKQEAgLTIwMDUsMjEgKzIwODYsNTkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaW9tbXVfZG9tYWluX2dldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwgRE9NQUlOX0FUVFJfUzFfQllQQVNTLAorCQkJCQkmczFfYnlwYXNzKTsKIAlpb21tdV9kb21haW5fZ2V0X2F0dHIobWFwcGluZy0+ZG9tYWluLCBET01BSU5fQVRUUl9GQVNULCAmaXNfZmFzdCk7Ci0JaWYgKGlzX2Zhc3QpCi0JCXJldHVybiBmYXN0X3NtbXVfYXR0YWNoX2RldmljZShkZXYsIG1hcHBpbmcpOworCWlvbW11X2RvbWFpbl9nZXRfYXR0cihtYXBwaW5nLT5kb21haW4sCisJCQkJRE9NQUlOX0FUVFJfVVBTVFJFQU1fSU9WQV9BTExPQ0FUT1IsCisJCQkJJmlzX3Vwc3RyZWFtKTsKIAotCWVyciA9IGlvbW11X2F0dGFjaF9ncm91cChtYXBwaW5nLT5kb21haW4sIGdyb3VwKTsKKwlpZiAoczFfYnlwYXNzKSB7CisJCW1hcHBpbmctPm9wcyA9ICZzd2lvdGxiX2RtYV9vcHM7CisJCWVyciA9IDA7CisJfSBlbHNlIGlmIChpc19mYXN0KSB7CisJCWVyciA9IGZhc3Rfc21tdV9pbml0X21hcHBpbmcoZGV2LCBtYXBwaW5nKTsKKwl9IGVsc2UgaWYgKGlzX3Vwc3RyZWFtKSB7CisJCWVyciA9IHVwc3RyZWFtX2lvbW11X2luaXRfbWFwcGluZyhkZXYsIG1hcHBpbmcpOworCX0gZWxzZSB7CisJCWVyciA9IGJpdG1hcF9pb21tdV9pbml0X21hcHBpbmcoZGV2LCBtYXBwaW5nKTsKKwl9CisJaWYgKCFlcnIpIHsKKwkJa3JlZl9pbml0KCZtYXBwaW5nLT5rcmVmKTsKKwkJbWFwcGluZy0+aW5pdCA9IHRydWU7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogYXJtX2lvbW11X2F0dGFjaF9kZXZpY2UKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlcgorICogQG1hcHBpbmc6IGlvIGFkZHJlc3Mgc3BhY2UgbWFwcGluZyBzdHJ1Y3R1cmUgKHJldHVybmVkIGZyb20KKyAqCWFybV9pb21tdV9jcmVhdGVfbWFwcGluZykKKyAqCisgKiBBdHRhY2hlcyBzcGVjaWZpZWQgaW8gYWRkcmVzcyBzcGFjZSBtYXBwaW5nIHRvIHRoZSBwcm92aWRlZCBkZXZpY2UsCisgKiB0aGlzIHJlcGxhY2VzIHRoZSBkbWEgb3BlcmF0aW9ucyAoZG1hX21hcF9vcHMgcG9pbnRlcikgd2l0aCB0aGUKKyAqIElPTU1VIGF3YXJlIHZlcnNpb24uCisgKgorICogQ2xpZW50cyBhcmUgZXhwZWN0ZWQgdG8gY2FsbCBhcm1faW9tbXVfYXR0YWNoX2RldmljZSgpIHByaW9yIHRvIHNoYXJpbmcKKyAqIHRoZSBkbWFfaW9tbXVfbWFwcGluZyBzdHJ1Y3R1cmUgd2l0aCBhbm90aGVyIGRldmljZS4gVGhpcyBlbnN1cmVzCisgKiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4KKyAqLworaW50IGFybV9pb21tdV9hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcpCit7CisJaW50IGVycjsKKworCWVyciA9IGFybV9pb21tdV9pbml0X21hcHBpbmcoZGV2LCBtYXBwaW5nKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaW9tbXVfZG9tYWluX2dldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwgRE9NQUlOX0FUVFJfUzFfQllQQVNTLAotCQkJCQkmczFfYnlwYXNzKTsKKwllcnIgPSBpb21tdV9hdHRhY2hfZ3JvdXAobWFwcGluZy0+ZG9tYWluLCBkZXYtPmlvbW11X2dyb3VwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0Ja3JlZl9nZXQoJm1hcHBpbmctPmtyZWYpOwogCWRldi0+YXJjaGRhdGEubWFwcGluZyA9IG1hcHBpbmc7Ci0JaWYgKCFzMV9ieXBhc3MpCi0JCXNldF9kbWFfb3BzKGRldiwgJmlvbW11X29wcyk7CisJc2V0X2RtYV9vcHMoZGV2LCBtYXBwaW5nLT5vcHMpOwogCiAJcHJfZGVidWcoIkF0dGFjaGVkIElPTU1VIGNvbnRyb2xsZXIgdG8gJXMgZGV2aWNlLlxuIiwgZGV2X25hbWUoZGV2KSk7CiAJcmV0dXJuIDA7CkBAIC0yMDM2LDggKzIxNTUsNyBAQAogdm9pZCBhcm1faW9tbXVfZGV0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nOwotCWludCBpc19mYXN0LCBzMV9ieXBhc3MgPSAwOwotCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXA7CisJaW50IHMxX2J5cGFzcyA9IDA7CiAKIAltYXBwaW5nID0gdG9fZG1hX2lvbW11X21hcHBpbmcoZGV2KTsKIAlpZiAoIW1hcHBpbmcpIHsKQEAgLTIwNDUsMjYgKzIxNjMsMjIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlvbW11X2RvbWFpbl9nZXRfYXR0cihtYXBwaW5nLT5kb21haW4sIERPTUFJTl9BVFRSX0ZBU1QsICZpc19mYXN0KTsKLQlpZiAoaXNfZmFzdCkgewotCQlmYXN0X3NtbXVfZGV0YWNoX2RldmljZShkZXYsIG1hcHBpbmcpOworCWlmICghZGV2LT5pb21tdV9ncm91cCkgeworCQlkZXZfZXJyKGRldiwgIk5vIGlvbW11IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2VcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaW9tbXVfZG9tYWluX2dldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwgRE9NQUlOX0FUVFJfUzFfQllQQVNTLAogCQkJCQkmczFfYnlwYXNzKTsKIAorCS8qCisJICogSU9OIGRlZmVycyBkbWFfdW5tYXAgY2FsbHMuIEVuc3VyZSB0aGV5IGhhdmUgYWxsIGNvbXBsZXRlZCBwcmlvciB0bworCSAqIHNldHRpbmcgZG1hX29wcyB0byBOVUxMLgorCSAqLwogCWlmIChtc21fZG1hX3VubWFwX2FsbF9mb3JfZGV2KGRldikpCiAJCWRldl93YXJuKGRldiwgIklPTU1VIGRldGFjaCB3aXRoIG91dHN0YW5kaW5nIG1hcHBpbmdzXG4iKTsKIAotCWdyb3VwID0gZGV2LT5pb21tdV9ncm91cDsKLQlpZiAoIWdyb3VwKSB7Ci0JCWRldl9lcnIoZGV2LCAiTm8gaW9tbXUgYXNzb2NpYXRlZCB3aXRoIGRldmljZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpb21tdV9kZXRhY2hfZ3JvdXAobWFwcGluZy0+ZG9tYWluLCBncm91cCk7Ci0Ja3JlZl9wdXQoJm1hcHBpbmctPmtyZWYsIHJlbGVhc2VfaW9tbXVfbWFwcGluZyk7CisJaW9tbXVfZGV0YWNoX2dyb3VwKG1hcHBpbmctPmRvbWFpbiwgZGV2LT5pb21tdV9ncm91cCk7CiAJZGV2LT5hcmNoZGF0YS5tYXBwaW5nID0gTlVMTDsKIAlpZiAoIXMxX2J5cGFzcykKIAkJc2V0X2RtYV9vcHMoZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZmF1bHQuYyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwppbmRleCBkMGZmYWRlLi43OTJkYWM4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9hcm02NC9tbS9mYXVsdC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXhjZXB0aW9uLmg+CiAKIHN0cnVjdCBmYXVsdF9pbmZvIHsKIAlpbnQJKCpmbikodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZXNyLApAQCAtMTAyLDIxICsxMDMsMjEgQEAKIAkJCWJyZWFrOwogCiAJCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKLQkJcHJpbnRrKCIsICpwdWQ9JTAxNmxseCIsIHB1ZF92YWwoKnB1ZCkpOworCQlwcl9jb250KCIsICpwdWQ9JTAxNmxseCIsIHB1ZF92YWwoKnB1ZCkpOwogCQlpZiAocHVkX25vbmUoKnB1ZCkgfHwgcHVkX2JhZCgqcHVkKSkKIAkJCWJyZWFrOwogCiAJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKLQkJcHJpbnRrKCIsICpwbWQ9JTAxNmxseCIsIHBtZF92YWwoKnBtZCkpOworCQlwcl9jb250KCIsICpwbWQ9JTAxNmxseCIsIHBtZF92YWwoKnBtZCkpOwogCQlpZiAocG1kX25vbmUoKnBtZCkgfHwgcG1kX2JhZCgqcG1kKSkKIAkJCWJyZWFrOwogCiAJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcik7Ci0JCXByaW50aygiLCAqcHRlPSUwMTZsbHgiLCBwdGVfdmFsKCpwdGUpKTsKKwkJcHJfY29udCgiLCAqcHRlPSUwMTZsbHgiLCBwdGVfdmFsKCpwdGUpKTsKIAkJcHRlX3VubWFwKHB0ZSk7CiAJfSB3aGlsZSgwKTsKIAotCXByaW50aygiXG4iKTsKKwlwcl9jb250KCJcbiIpOwogfQogCiAjaWZkZWYgQ09ORklHX0FSTTY0X0hXX0FGREJNCkBAIC0yMTIsNiArMjEzLDggQEAKIAlzdHJ1Y3Qgc2lnaW5mbyBzaTsKIAljb25zdCBzdHJ1Y3QgZmF1bHRfaW5mbyAqaW5mOwogCisJdHJhY2VfdXNlcl9mYXVsdCh0c2ssIGFkZHIsIGVzcik7CisKIAlpZiAodW5oYW5kbGVkX3NpZ25hbCh0c2ssIHNpZykgJiYgc2hvd191bmhhbmRsZWRfc2lnbmFsc19yYXRlbGltaXRlZCgpKSB7CiAJCWluZiA9IGVzcl90b19mYXVsdF9pbmZvKGVzcik7CiAJCXByX2luZm8oIiVzWyVkXTogdW5oYW5kbGVkICVzICglZCkgYXQgMHglMDhseCwgZXNyIDB4JTAzeFxuIiwKQEAgLTM4MSw4ICszODQsMTEgQEAKIAkgKiBzaWduYWwgZmlyc3QuIFdlIGRvIG5vdCBuZWVkIHRvIHJlbGVhc2UgdGhlIG1tYXBfc2VtIGJlY2F1c2UgaXQKIAkgKiB3b3VsZCBhbHJlYWR5IGJlIHJlbGVhc2VkIGluIF9fbG9ja19wYWdlX29yX3JldHJ5IGluIG1tL2ZpbGVtYXAuYy4KIAkgKi8KLQlpZiAoKGZhdWx0ICYgVk1fRkFVTFRfUkVUUlkpICYmIGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCWlmICgoZmF1bHQgJiBWTV9GQVVMVF9SRVRSWSkgJiYgZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJaWYgKCF1c2VyX21vZGUocmVncykpCisJCQlnb3RvIG5vX2NvbnRleHQ7CiAJCXJldHVybiAwOworCX0KIAogCS8qCiAJICogTWFqb3IvbWlub3IgcGFnZSBmYXVsdCBhY2NvdW50aW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgaW5pdGlhbApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TIGIvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCmluZGV4IDE5MTAyMjMuLmNlYTJiYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUworKysgYi9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKQEAgLTE0NywyMyArMTQ3LDEyIEBACiAJCSAqIEZpbmQgaXJxIHdpdGggaGlnaGVzdCBwcmlvcml0eQogCQkgKi8KIAkJIyBvcGVuIGNvZGVkIFBUUl9MQSB0MSwgY3B1X21hc2tfbnJfdGJsCi0jaWYgKF9NSVBTX1NaUFRSID09IDMyKQorI2lmIGRlZmluZWQoQ09ORklHXzMyQklUKSB8fCBkZWZpbmVkKEtCVUlMRF82NEJJVF9TWU0zMikKIAkJIyBvcGVuIGNvZGVkIGxhIHQxLCBjcHVfbWFza19ucl90YmwKIAkJbHVpCXQxLCAlaGkoY3B1X21hc2tfbnJfdGJsKQogCQlhZGRpdQl0MSwgJWxvKGNwdV9tYXNrX25yX3RibCkKLQotI2VuZGlmCi0jaWYgKF9NSVBTX1NaUFRSID09IDY0KQotCQkjIG9wZW4gY29kZWQgZGxhIHQxLCBjcHVfbWFza19ucl90YmwKLQkJLnNldAlwdXNoCi0JCS5zZXQJbm9hdAotCQlsdWkJdDEsICVoaWdoZXN0KGNwdV9tYXNrX25yX3RibCkKLQkJbHVpCUFULCAlaGkoY3B1X21hc2tfbnJfdGJsKQotCQlkYWRkaXUJdDEsIHQxLCAlaGlnaGVyKGNwdV9tYXNrX25yX3RibCkKLQkJZGFkZGl1CUFULCBBVCwgJWxvKGNwdV9tYXNrX25yX3RibCkKLQkJZHNsbAl0MSwgMzIKLQkJZGFkZHUJdDEsIHQxLCBBVAotCQkuc2V0CXBvcAorI2Vsc2UKKyNlcnJvciBHQ0MgYC1tc3ltMzInIG9wdGlvbiByZXF1aXJlZCBmb3IgNjQtYml0IERFQ3N0YXRpb24gYnVpbGRzCiAjZW5kaWYKIDE6CQlsdwl0MiwodDEpCiAJCW5vcApAQCAtMjE0LDIzICsyMDMsMTIgQEAKIAkJICogRmluZCBpcnEgd2l0aCBoaWdoZXN0IHByaW9yaXR5CiAJCSAqLwogCQkjIG9wZW4gY29kZWQgUFRSX0xBIHQxLGFzaWNfbWFza19ucl90YmwKLSNpZiAoX01JUFNfU1pQVFIgPT0gMzIpCisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpIHx8IGRlZmluZWQoS0JVSUxEXzY0QklUX1NZTTMyKQogCQkjIG9wZW4gY29kZWQgbGEgdDEsIGFzaWNfbWFza19ucl90YmwKIAkJbHVpCXQxLCAlaGkoYXNpY19tYXNrX25yX3RibCkKIAkJYWRkaXUJdDEsICVsbyhhc2ljX21hc2tfbnJfdGJsKQotCi0jZW5kaWYKLSNpZiAoX01JUFNfU1pQVFIgPT0gNjQpCi0JCSMgb3BlbiBjb2RlZCBkbGEgdDEsIGFzaWNfbWFza19ucl90YmwKLQkJLnNldAlwdXNoCi0JCS5zZXQJbm9hdAotCQlsdWkJdDEsICVoaWdoZXN0KGFzaWNfbWFza19ucl90YmwpCi0JCWx1aQlBVCwgJWhpKGFzaWNfbWFza19ucl90YmwpCi0JCWRhZGRpdQl0MSwgdDEsICVoaWdoZXIoYXNpY19tYXNrX25yX3RibCkKLQkJZGFkZGl1CUFULCBBVCwgJWxvKGFzaWNfbWFza19ucl90YmwpCi0JCWRzbGwJdDEsIDMyCi0JCWRhZGR1CXQxLCB0MSwgQVQKLQkJLnNldAlwb3AKKyNlbHNlCisjZXJyb3IgR0NDIGAtbXN5bTMyJyBvcHRpb24gcmVxdWlyZWQgZm9yIDY0LWJpdCBERUNzdGF0aW9uIGJ1aWxkcwogI2VuZGlmCiAyOgkJbHcJdDIsKHQxKQogCQlub3AKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGQ2OGI5ZWQuLmM1MDYwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KICAgICAgICAgLiA9IExPQURfQkFTRSA7CiAKKwlfdGV4dCA9IC47CisKIAkvKiBfc19rZXJuZWxfcm8gbXVzdCBiZSBwYWdlIGFsaWduZWQgKi8KIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfc19rZXJuZWxfcm8gPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2NhY2hlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwppbmRleCA1M2VjNzVmLi5kZjc1N2M5IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvY2FjaGUuYwpAQCAtNDUyLDggKzQ1Miw4IEBACiAJICBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGtlcm5lbCBtYXBwaW5nLiAqLwogCXByZWVtcHRfZGlzYWJsZSgpOwogCWZsdXNoX2RjYWNoZV9wYWdlX2FzbShfX3BhKHZmcm9tKSwgdmFkZHIpOwotCXByZWVtcHRfZW5hYmxlKCk7CiAJY29weV9wYWdlX2FzbSh2dG8sIHZmcm9tKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQogRVhQT1JUX1NZTUJPTChjb3B5X3VzZXJfcGFnZSk7CiAKQEAgLTUzOCw2ICs1MzgsMTAgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAlwZ2RfdCAqcGdkOwogCisJLyogRmx1c2ggdGhlIFRMQiB0byBhdm9pZCBzcGVjdWxhdGlvbiBpZiBjb2hlcmVuY3kgaXMgcmVxdWlyZWQuICovCisJaWYgKHBhcmlzY19yZXF1aXJlc19jb2hlcmVuY3koKSkKKwkJZmx1c2hfdGxiX2FsbCgpOworCiAJLyogRmx1c2hpbmcgdGhlIHdob2xlIGNhY2hlIG9uIGVhY2ggY3B1IHRha2VzIGZvcmV2ZXIgb24KIAkgICBycDM0NDAsIGV0Yy4gIFNvLCBhdm9pZCBpdCBpZiB0aGUgbW0gaXNuJ3QgdG9vIGJpZy4gICovCiAJaWYgKG1tX3RvdGFsX3NpemUobW0pID49IHBhcmlzY19jYWNoZV9mbHVzaF90aHJlc2hvbGQpIHsKQEAgLTU5NCwzMyArNTk4LDIxIEBACiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JcGdkX3QgKnBnZDsKLQogCUJVR19PTighdm1hLT52bV9tbS0+Y29udGV4dCk7CiAKLQlpZiAoKGVuZCAtIHN0YXJ0KSA+PSBwYXJpc2NfY2FjaGVfZmx1c2hfdGhyZXNob2xkKSB7CisJLyogRmx1c2ggdGhlIFRMQiB0byBhdm9pZCBzcGVjdWxhdGlvbiBpZiBjb2hlcmVuY3kgaXMgcmVxdWlyZWQuICovCisJaWYgKHBhcmlzY19yZXF1aXJlc19jb2hlcmVuY3koKSkKKwkJZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7CisKKwlpZiAoKGVuZCAtIHN0YXJ0KSA+PSBwYXJpc2NfY2FjaGVfZmx1c2hfdGhyZXNob2xkCisJICAgIHx8IHZtYS0+dm1fbW0tPmNvbnRleHQgIT0gbWZzcCgzKSkgewogCQlmbHVzaF9jYWNoZV9hbGwoKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh2bWEtPnZtX21tLT5jb250ZXh0ID09IG1mc3AoMykpIHsKLQkJZmx1c2hfdXNlcl9kY2FjaGVfcmFuZ2VfYXNtKHN0YXJ0LCBlbmQpOwotCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCi0JCQlmbHVzaF91c2VyX2ljYWNoZV9yYW5nZV9hc20oc3RhcnQsIGVuZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwZ2QgPSB2bWEtPnZtX21tLT5wZ2Q7Ci0JZm9yIChhZGRyID0gc3RhcnQgJiBQQUdFX01BU0s7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuOwotCQlwdGVfdCAqcHRlcCA9IGdldF9wdGVwKHBnZCwgYWRkcik7Ci0JCWlmICghcHRlcCkKLQkJCWNvbnRpbnVlOwotCQlwZm4gPSBwdGVfcGZuKCpwdGVwKTsKLQkJaWYgKHBmbl92YWxpZChwZm4pKQotCQkJX19mbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgUEZOX1BIWVMocGZuKSk7Ci0JfQorCWZsdXNoX3VzZXJfZGNhY2hlX3JhbmdlX2FzbShzdGFydCwgZW5kKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJCWZsdXNoX3VzZXJfaWNhY2hlX3JhbmdlX2FzbShzdGFydCwgZW5kKTsKIH0KIAogdm9pZApAQCAtNjI5LDcgKzYyMSw4IEBACiAJQlVHX09OKCF2bWEtPnZtX21tLT5jb250ZXh0KTsKIAogCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQlmbHVzaF90bGJfcGFnZSh2bWEsIHZtYWRkcik7CisJCWlmIChwYXJpc2NfcmVxdWlyZXNfY29oZXJlbmN5KCkpCisJCQlmbHVzaF90bGJfcGFnZSh2bWEsIHZtYWRkcik7CiAJCV9fZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgUEZOX1BIWVMocGZuKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZTdmZmRlMi4uNzU5Mzc4NyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KQEAgLTE0Miw2ICsxNDMsNyBAQAogCiAJLyogcHJldmVudCBzb2Z0IGxvY2t1cC9zdGFsbGVkIENQVSBtZXNzYWdlcyBmb3IgZW5kbGVzcyBsb29wLiAqLwogCXJjdV9zeXNycV9zdGFydCgpOworCWxvY2t1cF9kZXRlY3Rvcl9zdXNwZW5kKCk7CiAJZm9yICg7Oyk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggMDAxMmYwMy4uZmUyMDhiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTc1LDkgKzc1LDI3IEBACiAJCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJLyogTWFyayB0aGlzIGNvbnRleHQgaGFzIGJlZW4gdXNlZCBvbiB0aGUgbmV3IENQVSAqLwotCWlmICghY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobmV4dCkpKQorCWlmICghY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobmV4dCkpKSB7CiAJCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobmV4dCkpOwogCisJCS8qCisJCSAqIFRoaXMgZnVsbCBiYXJyaWVyIG9yZGVycyB0aGUgc3RvcmUgdG8gdGhlIGNwdW1hc2sgYWJvdmUgdnMKKwkJICogYSBzdWJzZXF1ZW50IG9wZXJhdGlvbiB3aGljaCBhbGxvd3MgdGhpcyBDUFUgdG8gYmVnaW4gbG9hZGluZworCQkgKiB0cmFuc2xhdGlvbnMgZm9yIG5leHQuCisJCSAqCisJCSAqIFdoZW4gdXNpbmcgdGhlIHJhZGl4IE1NVSB0aGF0IG9wZXJhdGlvbiBpcyB0aGUgbG9hZCBvZiB0aGUKKwkJICogTU1VIGNvbnRleHQgaWQsIHdoaWNoIGlzIHRoZW4gbW92ZWQgdG8gU1BSTl9QSUQuCisJCSAqCisJCSAqIEZvciB0aGUgaGFzaCBNTVUgaXQgaXMgZWl0aGVyIHRoZSBmaXJzdCBsb2FkIGZyb20gc2xiX2NhY2hlCisJCSAqIGluIHN3aXRjaF9zbGIoKSwgYW5kL29yIHRoZSBzdG9yZSBvZiBwYWNhLT5tbV9jdHhfaWQgaW4KKwkJICogY29weV9tbV90b19wYWNhKCkuCisJCSAqCisJCSAqIE9uIHRoZSByZWFkIHNpZGUgdGhlIGJhcnJpZXIgaXMgaW4gcHRlX3hjaGcoKSwgd2hpY2ggb3JkZXJzCisJCSAqIHRoZSBzdG9yZSB0byB0aGUgUFRFIHZzIHRoZSBsb2FkIG9mIG1tX2NwdW1hc2suCisJCSAqLworCQlzbXBfbWIoKTsKKwl9CisKIAkvKiAzMi1iaXQga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgUEdESVIgaW4gdGhlIHRocmVhZCBzdHJ1Y3QgKi8KICNpZmRlZiBDT05GSUdfUFBDMzIKIAl0c2stPnRocmVhZC5wZ2RpciA9IG5leHQtPnBnZDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLWJlLXR5cGVzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS1iZS10eXBlcy5oCmluZGV4IDQ5YzBhNWEuLjY4ZTA4N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLWJlLXR5cGVzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtYmUtdHlwZXMuaApAQCAtODcsNiArODcsNyBAQAogCXVuc2lnbmVkIGxvbmcgKnAgPSAodW5zaWduZWQgbG9uZyAqKXB0ZXA7CiAJX19iZTY0IHByZXY7CiAKKwkvKiBTZWUgY29tbWVudCBpbiBzd2l0Y2hfbW1faXJxc19vZmYoKSAqLwogCXByZXYgPSAoX19mb3JjZSBfX2JlNjQpX19jbXB4Y2hnX3U2NChwLCAoX19mb3JjZSB1bnNpZ25lZCBsb25nKXB0ZV9yYXcob2xkKSwKIAkJCQkJICAgICAoX19mb3JjZSB1bnNpZ25lZCBsb25nKXB0ZV9yYXcobmV3KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXR5cGVzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS10eXBlcy5oCmluZGV4IGU3ZjRmM2UuLjQxZTlkMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLXR5cGVzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUtdHlwZXMuaApAQCAtNjIsNiArNjIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgKnAgPSAodW5zaWduZWQgbG9uZyAqKXB0ZXA7CiAKKwkvKiBTZWUgY29tbWVudCBpbiBzd2l0Y2hfbW1faXJxc19vZmYoKSAqLwogCXJldHVybiBwdGVfdmFsKG9sZCkgPT0gX19jbXB4Y2hnX3U2NChwLCBwdGVfdmFsKG9sZCksIHB0ZV92YWwobmV3KSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKaW5kZXggMzI5NzcxNS4uOGIzYjQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTQ0LDIyICs0NCw4IEBACiBleHRlcm4gaW50IHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBuaWQpOwogZXh0ZXJuIHZvaWQgc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbmlkKTsKIAotc3RhdGljIGlubGluZSBpbnQgZWFybHlfY3B1X3RvX25vZGUoaW50IGNwdSkKLXsKLQlpbnQgbmlkOwotCi0JbmlkID0gbnVtYV9jcHVfbG9va3VwX3RhYmxlW2NwdV07Ci0KLQkvKgotCSAqIEZhbGwgYmFjayB0byBub2RlIDAgaWYgbmlkIGlzIHVuc2V0IChpdCBzaG91bGQgYmUsIGV4Y2VwdCBidWdzKS4KLQkgKiBUaGlzIGFsbG93cyBjYWxsZXJzIHRvIHNhZmVseSBkbyBOT0RFX0RBVEEoZWFybHlfY3B1X3RvX25vZGUoY3B1KSkuCi0JICovCi0JcmV0dXJuIChuaWQgPCAwKSA/IDAgOiBuaWQ7Ci19CiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIGludCBlYXJseV9jcHVfdG9fbm9kZShpbnQgY3B1KSB7IHJldHVybiAwOyB9Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX251bWFfY3B1X3RvcG9sb2d5KHZvaWQpIHt9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBuaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCAzYzA1YzMxLi4wMjhhMjJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTE0Niw2ICsxNDYsMTkgQEAKIAogCS8qIENsZWFyIGJpdCAwIHdoaWNoIHdlIHdvdWxkbid0IGNsZWFyIG90aGVyd2lzZSAqLwogCWxvY2FsX3BhY2EtPmlycV9oYXBwZW5lZCAmPSB+UEFDQV9JUlFfSEFSRF9ESVM7CisJaWYgKGhhcHBlbmVkICYgUEFDQV9JUlFfSEFSRF9ESVMpIHsKKwkJLyoKKwkJICogV2UgbWF5IGhhdmUgbWlzc2VkIGEgZGVjcmVtZW50ZXIgaW50ZXJydXB0IGlmIGhhcmQgZGlzYWJsZWQuCisJCSAqIENoZWNrIHRoZSBkZWNyZW1lbnRlciByZWdpc3RlciBpbiBjYXNlIHdlIGhhZCBhIHJvbGxvdmVyCisJCSAqIHdoaWxlIGhhcmQgZGlzYWJsZWQuCisJCSAqLworCQlpZiAoIShoYXBwZW5lZCAmIFBBQ0FfSVJRX0RFQykpIHsKKwkJCWlmIChkZWNyZW1lbnRlcl9jaGVja19vdmVyZmxvdygpKSB7CisJCQkJbG9jYWxfcGFjYS0+aXJxX2hhcHBlbmVkIHw9IFBBQ0FfSVJRX0RFQzsKKwkJCQloYXBwZW5lZCB8PSBQQUNBX0lSUV9ERUM7CisJCQl9CisJCX0KKwl9CiAKIAkvKgogCSAqIEZvcmNlIHRoZSBkZWxpdmVyeSBvZiBwZW5kaW5nIHNvZnQtZGlzYWJsZWQgaW50ZXJydXB0cyBvbiBQUzMuCkBAIC0xNzEsNyArMTg0LDcgQEAKIAkgKiBpbiBjYXNlIHdlIGFsc28gaGFkIGEgcm9sbG92ZXIgd2hpbGUgaGFyZCBkaXNhYmxlZAogCSAqLwogCWxvY2FsX3BhY2EtPmlycV9oYXBwZW5lZCAmPSB+UEFDQV9JUlFfREVDOwotCWlmICgoaGFwcGVuZWQgJiBQQUNBX0lSUV9ERUMpIHx8IGRlY3JlbWVudGVyX2NoZWNrX292ZXJmbG93KCkpCisJaWYgKGhhcHBlbmVkICYgUEFDQV9JUlFfREVDKQogCQlyZXR1cm4gMHg5MDA7CiAKIAkvKiBGaW5hbGx5IGNoZWNrIGlmIGFuIGV4dGVybmFsIGludGVycnVwdCBoYXBwZW5lZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiMjQ5YzJmLi4xYzE0MWQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzU5LDcgKzM1OSw4IEBACiAKIAljcHVtc3IgPSBtc3JfY2hlY2tfYW5kX3NldChNU1JfRlB8TVNSX1ZFQ3xNU1JfVlNYKTsKIAotCWlmIChjdXJyZW50LT50aHJlYWQucmVncyAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WU1gpKSB7CisJaWYgKGN1cnJlbnQtPnRocmVhZC5yZWdzICYmCisJICAgIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgKE1TUl9WU1h8TVNSX1ZFQ3xNU1JfRlApKSkgewogCQljaGVja19pZl90bV9yZXN0b3JlX3JlcXVpcmVkKGN1cnJlbnQpOwogCQkvKgogCQkgKiBJZiBhIHRocmVhZCBoYXMgYWxyZWFkeSBiZWVuIHJlY2xhaW1lZCB0aGVuIHRoZQpAQCAtMzgzLDcgKzM4NCw3IEBACiB7CiAJaWYgKHRzay0+dGhyZWFkLnJlZ3MpIHsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWlmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVlNYKSB7CisJCWlmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiAoTVNSX1ZTWHxNU1JfVkVDfE1TUl9GUCkpIHsKIAkJCUJVR19PTih0c2sgIT0gY3VycmVudCk7CiAJCQlnaXZldXBfdnN4KHRzayk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCmluZGV4IDVjOGYxMmYuLmRjYmI5MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTI3LDEyICsxMjcsMTkgQEAKIAkgKiBJZiB0YXNrIGlzIG5vdCBjdXJyZW50LCBpdCB3aWxsIGhhdmUgYmVlbiBmbHVzaGVkIGFscmVhZHkgdG8KIAkgKiBpdCdzIHRocmVhZF9zdHJ1Y3QgZHVyaW5nIF9fc3dpdGNoX3RvKCkuCiAJICoKLQkgKiBBIHJlY2xhaW0gZmx1c2hlcyBBTEwgdGhlIHN0YXRlLgorCSAqIEEgcmVjbGFpbSBmbHVzaGVzIEFMTCB0aGUgc3RhdGUgb3IgaWYgbm90IGluIFRNIHNhdmUgVE0gU1BScworCSAqIGluIHRoZSBhcHByb3ByaWF0ZSB0aHJlYWQgc3RydWN0dXJlcyBmcm9tIGxpdmUuCiAJICovCiAKLQlpZiAodHNrID09IGN1cnJlbnQgJiYgTVNSX1RNX1NVU1BFTkRFRChtZm1zcigpKSkKLQkJdG1fcmVjbGFpbV9jdXJyZW50KFRNX0NBVVNFX1NJR05BTCk7CisJaWYgKHRzayAhPSBjdXJyZW50KQorCQlyZXR1cm47CiAKKwlpZiAoTVNSX1RNX1NVU1BFTkRFRChtZm1zcigpKSkgeworCQl0bV9yZWNsYWltX2N1cnJlbnQoVE1fQ0FVU0VfU0lHTkFMKTsKKwl9IGVsc2UgeworCQl0bV9lbmFibGUoKTsKKwkJdG1fc2F2ZV9zcHJzKCYodHNrLT50aHJlYWQpKTsKKwl9CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RtcmVnc190b190aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IGFkYTcxYmUuLmExMmJlNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTU5NSw3ICs1OTUsNyBAQAogCiBzdGF0aWMgdm9pZCAqIF9faW5pdCBwY3B1X2ZjX2FsbG9jKHVuc2lnbmVkIGludCBjcHUsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pCiB7Ci0JcmV0dXJuIF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShlYXJseV9jcHVfdG9fbm9kZShjcHUpKSwgc2l6ZSwgYWxpZ24sCisJcmV0dXJuIF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShjcHVfdG9fbm9kZShjcHUpKSwgc2l6ZSwgYWxpZ24sCiAJCQkJICAgIF9fcGEoTUFYX0RNQV9BRERSRVNTKSk7CiB9CiAKQEAgLTYwNiw3ICs2MDYsNyBAQAogCiBzdGF0aWMgaW50IHBjcHVfY3B1X2Rpc3RhbmNlKHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgdG8pCiB7Ci0JaWYgKGVhcmx5X2NwdV90b19ub2RlKGZyb20pID09IGVhcmx5X2NwdV90b19ub2RlKHRvKSkKKwlpZiAoY3B1X3RvX25vZGUoZnJvbSkgPT0gY3B1X3RvX25vZGUodG8pKQogCQlyZXR1cm4gTE9DQUxfRElTVEFOQ0U7CiAJZWxzZQogCQlyZXR1cm4gUkVNT1RFX0RJU1RBTkNFOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKaW5kZXggNWMwMjk4NC4uMjE4Y2JhMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCkBAIC0yODA4LDYgKzI4MDgsOCBAQAogCWludCByOwogCWludCBzcmN1X2lkeDsKIAl1bnNpZ25lZCBsb25nIGViYl9yZWdzWzNdID0ge307CS8qIHNodXQgdXAgR0NDICovCisJdW5zaWduZWQgbG9uZyB1c2VyX3RhciA9IDA7CisJdW5zaWduZWQgaW50IHVzZXJfdnJzYXZlOwogCiAJaWYgKCF2Y3B1LT5hcmNoLnNhbmUpIHsKIAkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOwpAQCAtMjgyOCw2ICsyODMwLDggQEAKIAkJCXJ1bi0+ZmFpbF9lbnRyeS5oYXJkd2FyZV9lbnRyeV9mYWlsdXJlX3JlYXNvbiA9IDA7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCQkvKiBFbmFibGUgVE0gc28gd2UgY2FuIHJlYWQgdGhlIFRNIFNQUnMgKi8KKwkJbXRtc3IobWZtc3IoKSB8IE1TUl9UTSk7CiAJCWN1cnJlbnQtPnRocmVhZC50bV90ZmhhciA9IG1mc3ByKFNQUk5fVEZIQVIpOwogCQljdXJyZW50LT50aHJlYWQudG1fdGZpYXIgPSBtZnNwcihTUFJOX1RGSUFSKTsKIAkJY3VycmVudC0+dGhyZWFkLnRtX3RleGFzciA9IG1mc3ByKFNQUk5fVEVYQVNSKTsKQEAgLTI4NTYsMTIgKzI4NjAsMTQgQEAKIAogCWZsdXNoX2FsbF90b190aHJlYWQoY3VycmVudCk7CiAKLQkvKiBTYXZlIHVzZXJzcGFjZSBFQkIgcmVnaXN0ZXIgdmFsdWVzICovCisJLyogU2F2ZSB1c2Vyc3BhY2UgRUJCIGFuZCBvdGhlciByZWdpc3RlciB2YWx1ZXMgKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDdTKSkgewogCQllYmJfcmVnc1swXSA9IG1mc3ByKFNQUk5fRUJCSFIpOwogCQllYmJfcmVnc1sxXSA9IG1mc3ByKFNQUk5fRUJCUlIpOwogCQllYmJfcmVnc1syXSA9IG1mc3ByKFNQUk5fQkVTQ1IpOworCQl1c2VyX3RhciA9IG1mc3ByKFNQUk5fVEFSKTsKIAl9CisJdXNlcl92cnNhdmUgPSBtZnNwcihTUFJOX1ZSU0FWRSk7CiAKIAl2Y3B1LT5hcmNoLndxcCA9ICZ2Y3B1LT5hcmNoLnZjb3JlLT53cTsKIAl2Y3B1LT5hcmNoLnBnZGlyID0gY3VycmVudC0+bW0tPnBnZDsKQEAgLTI4ODUsMTIgKzI4OTEsMTUgQEAKIAkJCXIgPSBrdm1wcGNfeGljc19ybV9jb21wbGV0ZSh2Y3B1LCAwKTsKIAl9IHdoaWxlIChpc19rdm1wcGNfcmVzdW1lX2d1ZXN0KHIpKTsKIAotCS8qIFJlc3RvcmUgdXNlcnNwYWNlIEVCQiByZWdpc3RlciB2YWx1ZXMgKi8KKwkvKiBSZXN0b3JlIHVzZXJzcGFjZSBFQkIgYW5kIG90aGVyIHJlZ2lzdGVyIHZhbHVlcyAqLwogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BUkNIXzIwN1MpKSB7CiAJCW10c3ByKFNQUk5fRUJCSFIsIGViYl9yZWdzWzBdKTsKIAkJbXRzcHIoU1BSTl9FQkJSUiwgZWJiX3JlZ3NbMV0pOwogCQltdHNwcihTUFJOX0JFU0NSLCBlYmJfcmVnc1syXSk7CisJCW10c3ByKFNQUk5fVEFSLCB1c2VyX3Rhcik7CisJCW10c3ByKFNQUk5fRlNDUiwgY3VycmVudC0+dGhyZWFkLmZzY3IpOwogCX0KKwltdHNwcihTUFJOX1ZSU0FWRSwgdXNlcl92cnNhdmUpOwogCiAgb3V0OgogCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9OT1RSRUFEWTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwppbmRleCA2ZjgxYWRiLi4wNDQ3YTIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCkBAIC0zNyw2ICszNywxMyBAQAogI2RlZmluZSBOQVBQSU5HX0NFREUJMQogI2RlZmluZSBOQVBQSU5HX05PVkNQVQkyCiAKKy8qIFN0YWNrIGZyYW1lIG9mZnNldHMgZm9yIGt2bXBwY19odl9lbnRyeSAqLworI2RlZmluZSBTRlMJCQkxMTIKKyNkZWZpbmUgU1RBQ0tfU0xPVF9UUkFQCQkoU0ZTLTQpCisjZGVmaW5lIFNUQUNLX1NMT1RfQ0lBQlIJKFNGUy0xNikKKyNkZWZpbmUgU1RBQ0tfU0xPVF9EQVdSCQkoU0ZTLTI0KQorI2RlZmluZSBTVEFDS19TTE9UX0RBV1JYCShTRlMtMzIpCisKIC8qCiAgKiBDYWxsIGt2bXBwY19odl9lbnRyeSBpbiByZWFsIG1vZGUuCiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgaGFyZC1kaXNhYmxlZC4KQEAgLTI4OSwxMCArMjk2LDEwIEBACiAJYmwJa3ZtaHZfYWNjdW11bGF0ZV90aW1lCiAjZW5kaWYKIDEzOgltcglyMywgcjEyCi0Jc3R3CXIxMiwgMTEyLTQocjEpCisJc3R3CXIxMiwgU1RBQ0tfU0xPVF9UUkFQKHIxKQogCWJsCWt2bWh2X2NvbW1lbmNlX2V4aXQKIAlub3AKLQlsd3oJcjEyLCAxMTItNChyMSkKKwlsd3oJcjEyLCBTVEFDS19TTE9UX1RSQVAocjEpCiAJYglrdm1odl9zd2l0Y2hfdG9faG9zdAogCiAvKgpAQCAtNTM3LDcgKzU0NCw3IEBACiAJICovCiAJbWZscglyMAogCXN0ZAlyMCwgUFBDX0xSX1NUS09GRihyMSkKLQlzdGR1CXIxLCAtMTEyKHIxKQorCXN0ZHUJcjEsIC1TRlMocjEpCiAKIAkvKiBTYXZlIFIxIGluIHRoZSBQQUNBICovCiAJc3RkCXIxLCBIU1RBVEVfSE9TVF9SMShyMTMpCkBAIC02OTgsNiArNzA1LDE2IEBACiAJbXRzcHIJU1BSTl9QVVJSLHI3CiAJbXRzcHIJU1BSTl9TUFVSUixyOAogCisJLyogU2F2ZSBob3N0IHZhbHVlcyBvZiBzb21lIHJlZ2lzdGVycyAqLworQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwcglyNSwgU1BSTl9DSUFCUgorCW1mc3ByCXI2LCBTUFJOX0RBV1IKKwltZnNwcglyNywgU1BSTl9EQVdSWAorCXN0ZAlyNSwgU1RBQ0tfU0xPVF9DSUFCUihyMSkKKwlzdGQJcjYsIFNUQUNLX1NMT1RfREFXUihyMSkKKwlzdGQJcjcsIFNUQUNLX1NMT1RfREFXUlgocjEpCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwN1MpCisKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJLyogU2V0IHBhcnRpdGlvbiBEQUJSICovCiAJLyogRG8gdGhpcyBiZWZvcmUgcmUtZW5hYmxpbmcgUE1VIHRvIGF2b2lkIFA3IERBQlIgY29ycnVwdGlvbiBidWcgKi8KQEAgLTEzNjEsOCArMTM3OCw3IEBACiAJICovCiAJbGkJcjAsIDAKIAltdHNwcglTUFJOX0lBTVIsIHIwCi0JbXRzcHIJU1BSTl9DSUFCUiwgcjAKLQltdHNwcglTUFJOX0RBV1JYLCByMAorCW10c3ByCVNQUk5fUFNQQiwgcjAKIAltdHNwcglTUFJOX1RDU0NSLCByMAogCW10c3ByCVNQUk5fV09SVCwgcjAKIAkvKiBTZXQgTU1DUlMgdG8gMTw8MzEgdG8gZnJlZXplIGFuZCBkaXNhYmxlIHRoZSBTUE1DIGNvdW50ZXJzICovCkBAIC0xMzc4LDYgKzEzOTQsNyBAQAogCXN0ZAlyNixWQ1BVX1VBTU9SKHI5KQogCWxpCXI2LDAKIAltdHNwcglTUFJOX0FNUixyNgorCW10c3ByCVNQUk5fVUFNT1IsIHI2CiAKIAkvKiBTd2l0Y2ggRFNDUiBiYWNrIHRvIGhvc3QgdmFsdWUgKi8KIAltZnNwcglyOCwgU1BSTl9EU0NSCkBAIC0xNTE5LDYgKzE1MzYsMTYgQEAKIAlzbGJpYQogCXB0ZXN5bmMKIAorCS8qIFJlc3RvcmUgaG9zdCB2YWx1ZXMgb2Ygc29tZSByZWdpc3RlcnMgKi8KK0JFR0lOX0ZUUl9TRUNUSU9OCisJbGQJcjUsIFNUQUNLX1NMT1RfQ0lBQlIocjEpCisJbGQJcjYsIFNUQUNLX1NMT1RfREFXUihyMSkKKwlsZAlyNywgU1RBQ0tfU0xPVF9EQVdSWChyMSkKKwltdHNwcglTUFJOX0NJQUJSLCByNQorCW10c3ByCVNQUk5fREFXUiwgcjYKKwltdHNwcglTUFJOX0RBV1JYLCByNworRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQVJDSF8yMDdTKQorCiAJLyoKIAkgKiBQT1dFUjcvUE9XRVI4IGd1ZXN0IC0+IGhvc3QgcGFydGl0aW9uIHN3aXRjaCBjb2RlLgogCSAqIFdlIGRvbid0IGhhdmUgdG8gbG9jayBhZ2FpbnN0IHRsYmllcyBidXQgd2UgZG8KQEAgLTE2NTIsOCArMTY3OSw4IEBACiAJbGkJcjAsIEtWTV9HVUVTVF9NT0RFX05PTkUKIAlzdGIJcjAsIEhTVEFURV9JTl9HVUVTVChyMTMpCiAKLQlsZAlyMCwgMTEyK1BQQ19MUl9TVEtPRkYocjEpCi0JYWRkaQlyMSwgcjEsIDExMgorCWxkCXIwLCBTRlMrUFBDX0xSX1NUS09GRihyMSkKKwlhZGRpCXIxLCByMSwgU0ZTCiAJbXRscglyMAogCWJscgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCmluZGV4IGNjNjZjNDkuLjY2NmFkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jCkBAIC04Miw3ICs4Miw2IEBACiAKIAlvZl9kZXRhY2hfbm9kZShucCk7CiAJb2Zfbm9kZV9wdXQocGFyZW50KTsKLQlvZl9ub2RlX3B1dChucCk7IC8qIE11c3QgZGVjcmVtZW50IHRoZSByZWZjb3VudCAqLwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAwY2VhNzAyLi5kMzNmMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTQ4MCw3ICs0ODAsNyBAQAogICogSW4gdGhlIGNhc2UgdGhhdCBhIGd1ZXN0IHVzZXMgc3RvcmFnZSBrZXlzCiAgKiBmYXVsdHMgc2hvdWxkIG5vIGxvbmdlciBiZSBiYWNrZWQgYnkgemVybyBwYWdlcwogICovCi0jZGVmaW5lIG1tX2ZvcmJpZHNfemVyb3BhZ2UgbW1fdXNlX3NrZXkKKyNkZWZpbmUgbW1fZm9yYmlkc196ZXJvcGFnZSBtbV9oYXNfcGdzdGUKIHN0YXRpYyBpbmxpbmUgaW50IG1tX3VzZV9za2V5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogI2lmZGVmIENPTkZJR19QR1NURQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9zdGh5aS5jIGIvYXJjaC9zMzkwL2t2bS9zdGh5aS5jCmluZGV4IDA1Yzk4YmIuLjJmMDRhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vc3RoeWkuYworKysgYi9hcmNoL3MzOTAva3ZtL3N0aHlpLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCQkic3JsICAgICAlW2NjXSwyOFxuIgogCQk6IFtjY10gIj1kIiAoY2MpCiAJCTogW2NvZGVdICJkIiAoY29kZSksIFthZGRyXSAiYSIgKGFkZHIpCi0JCTogIm1lbW9yeSIsICJjYyIpOworCQk6ICIzIiwgIm1lbW9yeSIsICJjYyIpOwogCXJldHVybiBjYzsKIH0KIApAQCAtNDIyLDcgKzQyMiw3IEBACiAJVkNQVV9FVkVOVCh2Y3B1LCAzLCAiU1RIWUk6IGZjOiAlbGx1IGFkZHI6IDB4JTAxNmxseCIsIGNvZGUsIGFkZHIpOwogCXRyYWNlX2t2bV9zMzkwX2hhbmRsZV9zdGh5aSh2Y3B1LCBjb2RlLCBhZGRyKTsKIAotCWlmIChyZWcxID09IHJlZzIgfHwgcmVnMSAmIDEgfHwgcmVnMiAmIDEgfHwgYWRkciAmIH5QQUdFX01BU0spCisJaWYgKHJlZzEgPT0gcmVnMiB8fCByZWcxICYgMSB8fCByZWcyICYgMSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CiAKIAlpZiAoY29kZSAmIDB4ZmZmZikgewpAQCAtNDMwLDYgKzQzMCw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmIChhZGRyICYgflBBR0VfTUFTSykKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CisKIAkvKgogCSAqIElmIHRoZSBwYWdlIGhhcyBub3QgeWV0IGJlZW4gZmF1bHRlZCBpbiwgd2Ugd2FudCB0byBkbyB0aGF0CiAJICogbm93IGFuZCBub3QgYWZ0ZXIgYWxsIHRoZSBleHBlbnNpdmUgY2FsY3VsYXRpb25zLgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2dtYXAuYyBiL2FyY2gvczM5MC9tbS9nbWFwLmMKaW5kZXggM2JhNjIyNy4uY2IyY2QwNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2dtYXAuYworKysgYi9hcmNoL3MzOTAvbW0vZ21hcC5jCkBAIC0yMTI1LDYgKzIxMjUsMzcgQEAKIH0KIAogLyoKKyAqIFJlbW92ZSBhbGwgZW1wdHkgemVybyBwYWdlcyBmcm9tIHRoZSBtYXBwaW5nIGZvciBsYXp5IHJlZmF1bHRpbmcKKyAqIC0gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBtbS0+Y29udGV4dC5oYXNfcGdzdGUgaXMgc2V0LCB0byBhdm9pZAorICogICBmdXR1cmUgY3JlYXRpb24gb2YgemVybyBwYWdlcworICogLSBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIFRIUCB3YXMgZW5hYmxlZAorICovCitzdGF0aWMgaW50IF9femFwX3plcm9fcGFnZXMocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgZW5kLCBzdHJ1Y3QgbW1fd2FsayAqd2FsaykKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciAhPSBlbmQ7IGFkZHIgKz0gUEFHRV9TSVpFKSB7CisJCXB0ZV90ICpwdGVwOworCQlzcGlubG9ja190ICpwdGw7CisKKwkJcHRlcCA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sod2Fsay0+bW0sIHBtZCwgYWRkciwgJnB0bCk7CisJCWlmIChpc196ZXJvX3BmbihwdGVfcGZuKCpwdGVwKSkpCisJCQlwdGVwX3hjaGdfZGlyZWN0KHdhbGstPm1tLCBhZGRyLCBwdGVwLCBfX3B0ZShfUEFHRV9JTlZBTElEKSk7CisJCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6YXBfemVyb19wYWdlcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgbW1fd2FsayB3YWxrID0geyAucG1kX2VudHJ5ID0gX196YXBfemVyb19wYWdlcyB9OworCisJd2Fsay5tbSA9IG1tOworCXdhbGtfcGFnZV9yYW5nZSgwLCBUQVNLX1NJWkUsICZ3YWxrKTsKK30KKworLyoKICAqIHN3aXRjaCBvbiBwZ3N0ZXMgZm9yIGl0cyB1c2Vyc3BhY2UgcHJvY2VzcyAoZm9yIGt2bSkKICAqLwogaW50IHMzOTBfZW5hYmxlX3NpZSh2b2lkKQpAQCAtMjE0MSw2ICsyMTcyLDcgQEAKIAltbS0+Y29udGV4dC5oYXNfcGdzdGUgPSAxOwogCS8qIHNwbGl0IHRocCBtYXBwaW5ncyBhbmQgZGlzYWJsZSB0aHAgZm9yIGZ1dHVyZSBtYXBwaW5ncyAqLwogCXRocF9zcGxpdF9tbShtbSk7CisJemFwX3plcm9fcGFnZXMobW0pOwogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybiAwOwogfQpAQCAtMjE1MywxMyArMjE4NSw2IEBACiBzdGF0aWMgaW50IF9fczM5MF9lbmFibGVfc2tleShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIG5leHQsIHN0cnVjdCBtbV93YWxrICp3YWxrKQogewotCS8qCi0JICogUmVtb3ZlIGFsbCB6ZXJvIHBhZ2UgbWFwcGluZ3MsCi0JICogYWZ0ZXIgZXN0YWJsaXNoaW5nIGEgcG9saWN5IHRvIGZvcmJpZCB6ZXJvIHBhZ2UgbWFwcGluZ3MKLQkgKiBmb2xsb3dpbmcgZmF1bHRzIGZvciB0aGF0IHBhZ2Ugd2lsbCBnZXQgZnJlc2ggYW5vbnltb3VzIHBhZ2VzCi0JICovCi0JaWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4oKnB0ZSkpKQotCQlwdGVwX3hjaGdfZGlyZWN0KHdhbGstPm1tLCBhZGRyLCBwdGUsIF9fcHRlKF9QQUdFX0lOVkFMSUQpKTsKIAkvKiBDbGVhciBzdG9yYWdlIGtleSAqLwogCXB0ZXBfemFwX2tleSh3YWxrLT5tbSwgYWRkciwgcHRlKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9uZXQvYnBmX2ppdF9jb21wLmMgYi9hcmNoL3MzOTAvbmV0L2JwZl9qaXRfY29tcC5jCmluZGV4IGJlZTI4MWYuLmU4ZGVlNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9uZXQvYnBmX2ppdF9jb21wLmMKKysrIGIvYXJjaC9zMzkwL25ldC9icGZfaml0X2NvbXAuYwpAQCAtMTI1Miw3ICsxMjUyLDggQEAKIAkJaW5zbl9jb3VudCA9IGJwZl9qaXRfaW5zbihqaXQsIGZwLCBpKTsKIAkJaWYgKGluc25fY291bnQgPCAwKQogCQkJcmV0dXJuIC0xOwotCQlqaXQtPmFkZHJzW2kgKyAxXSA9IGppdC0+cHJnOyAvKiBOZXh0IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwkJLyogTmV4dCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCisJCWppdC0+YWRkcnNbaSArIGluc25fY291bnRdID0gaml0LT5wcmc7CiAJfQogCWJwZl9qaXRfZXBpbG9ndWUoaml0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dF82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dF82NC5oCmluZGV4IDM0OWRkMjMuLjBjZGViMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbW11X2NvbnRleHRfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0XzY0LmgKQEAgLTI1LDkgKzI1LDExIEBACiB2b2lkIF9fdHNiX2NvbnRleHRfc3dpdGNoKHVuc2lnbmVkIGxvbmcgcGdkX3BhLAogCQkJICBzdHJ1Y3QgdHNiX2NvbmZpZyAqdHNiX2Jhc2UsCiAJCQkgIHN0cnVjdCB0c2JfY29uZmlnICp0c2JfaHVnZSwKLQkJCSAgdW5zaWduZWQgbG9uZyB0c2JfZGVzY3JfcGEpOworCQkJICB1bnNpZ25lZCBsb25nIHRzYl9kZXNjcl9wYSwKKwkJCSAgdW5zaWduZWQgbG9uZyBzZWNvbmRhcnlfY3R4KTsKIAotc3RhdGljIGlubGluZSB2b2lkIHRzYl9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0c2JfY29udGV4dF9zd2l0Y2hfY3R4KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgY3R4KQogewogCV9fdHNiX2NvbnRleHRfc3dpdGNoKF9fcGEobW0tPnBnZCksCiAJCQkgICAgICZtbS0+Y29udGV4dC50c2JfYmxvY2tbMF0sCkBAIC0zOCw5ICs0MCwxMiBAQAogI2Vsc2UKIAkJCSAgICAgTlVMTAogI2VuZGlmCi0JCQkgICAgICwgX19wYSgmbW0tPmNvbnRleHQudHNiX2Rlc2NyWzBdKSk7CisJCQkgICAgICwgX19wYSgmbW0tPmNvbnRleHQudHNiX2Rlc2NyWzBdKSwKKwkJCSAgICAgY3R4KTsKIH0KIAorI2RlZmluZSB0c2JfY29udGV4dF9zd2l0Y2goWCkgdHNiX2NvbnRleHRfc3dpdGNoX2N0eChYLCAwKQorCiB2b2lkIHRzYl9ncm93KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCSAgICAgIHVuc2lnbmVkIGxvbmcgdHNiX2luZGV4LAogCSAgICAgIHVuc2lnbmVkIGxvbmcgbW1fcnNzKTsKQEAgLTExMCw4ICsxMTUsNyBAQAogCSAqIGNwdTAgdG8gdXBkYXRlIGl0J3MgVFNCIGJlY2F1c2UgYXQgdGhhdCBwb2ludCB0aGUgY3B1X3ZtX21hc2sKIAkgKiBvbmx5IGhhZCBjcHUxIHNldCBpbiBpdC4KIAkgKi8KLQlsb2FkX3NlY29uZGFyeV9jb250ZXh0KG1tKTsKLQl0c2JfY29udGV4dF9zd2l0Y2gobW0pOworCXRzYl9jb250ZXh0X3N3aXRjaF9jdHgobW0sIENUWF9IV0JJVFMobW0tPmNvbnRleHQpKTsKIAogCS8qIEFueSB0aW1lIGEgcHJvY2Vzc29yIHJ1bnMgYSBjb250ZXh0IG9uIGFuIGFkZHJlc3Mgc3BhY2UKIAkgKiBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlIG11c3QgZmx1c2ggdGhhdCBjb250ZXh0IG91dCBvZiB0aGUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdHJhcF9ibG9jay5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90cmFwX2Jsb2NrLmgKaW5kZXggZWM5YzA0ZC4uZmYwNTk5MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90cmFwX2Jsb2NrLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90cmFwX2Jsb2NrLmgKQEAgLTU0LDYgKzU0LDcgQEAKIHZvaWQgaW5pdF9jdXJfY3B1X3RyYXAoc3RydWN0IHRocmVhZF9pbmZvICopOwogdm9pZCBzZXR1cF90YmEodm9pZCk7CiBleHRlcm4gaW50IG5jcHVzX3Byb2JlZDsKK2V4dGVybiB1NjQgY3B1X21vbmRvX2NvdW50ZXJbTlJfQ1BVU107CiAKIHVuc2lnbmVkIGxvbmcgcmVhbF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggMDY5ODFjYy4uZDA0MTExYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTEyNDAsOCArMTI0MCw2IEBACiAJCQkgKiBBVFUgZ3JvdXAsIGJ1dCBBVFUgaGNhbGxzIHdvbid0IGJlIGF2YWlsYWJsZS4KIAkJCSAqLwogCQkJaHZfYXR1ID0gZmFsc2U7Ci0JCQlwcl9lcnIoUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgaHZhcGkgQVRVIGVycj0lZFxuIiwKLQkJCSAgICAgICBlcnIpOwogCQl9IGVsc2UgewogCQkJcHJfaW5mbyhQRlggIlJlZ2lzdGVyZWQgaHZhcGkgQVRVIG1ham9yWyVsdV0gbWlub3JbJWx1XVxuIiwKIAkJCQl2YXR1X21ham9yLCB2YXR1X21pbm9yKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKaW5kZXggZDU4MDdkMi4uMmRlYjg5ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKQEAgLTYyMSwyMiArNjIxLDQ4IEBACiAJfQogfQogCi0vKiBNdWx0aS1jcHUgbGlzdCB2ZXJzaW9uLiAgKi8KKyNkZWZpbmUJQ1BVX01PTkRPX0NPVU5URVIoY3B1aWQpCShjcHVfbW9uZG9fY291bnRlcltjcHVpZF0pCisjZGVmaW5lCU1PTkRPX1VTRUNfV0FJVF9NSU4JCTIKKyNkZWZpbmUJTU9ORE9fVVNFQ19XQUlUX01BWAkJMTAwCisjZGVmaW5lCU1PTkRPX1JFVFJZX0xJTUlUCQk1MDAwMDAKKworLyogTXVsdGktY3B1IGxpc3QgdmVyc2lvbi4KKyAqCisgKiBEZWxpdmVyIHhjYWxscyB0byAnY250JyBudW1iZXIgb2YgY3B1cyBpbiAnY3B1X2xpc3QnLgorICogU29tZXRpbWVzIG5vdCBhbGwgY3B1cyByZWNlaXZlIHRoZSBtb25kbywgcmVxdWlyaW5nIHVzIHRvIHJlLXNlbmQKKyAqIHRoZSBtb25kbyB1bnRpbCBhbGwgY3B1cyBoYXZlIHJlY2VpdmVkLCBvciBjcHVzIGFyZSB0cnVseSBzdHVjaworICogdW5hYmxlIHRvIHJlY2VpdmUgbW9uZG8sIGFuZCB3ZSB0aW1lb3V0LgorICogT2NjYXNpb25hbGx5IGEgdGFyZ2V0IGNwdSBzdHJhbmQgaXMgYm9ycm93ZWQgYnJpZWZseSBieSBoeXBlcnZpc29yIHRvCisgKiBwZXJmb3JtIGd1ZXN0IHNlcnZpY2UsIHN1Y2ggYXMgUENJZSBlcnJvciBoYW5kbGluZy4gQ29uc2lkZXIgdGhlCisgKiBzZXJ2aWNlIHRpbWUsIDEgc2Vjb25kIG92ZXJhbGwgd2FpdCBpcyByZWFzb25hYmxlIGZvciAxIGNwdS4KKyAqIEhlcmUgdHdvIGluLWJldHdlZW4gbW9uZG8gY2hlY2sgd2FpdCB0aW1lIGFyZSBkZWZpbmVkOiAyIHVzZWMgZm9yCisgKiBzaW5nbGUgY3B1IHF1aWNrIHR1cm4gYXJvdW5kIGFuZCB1cCB0byAxMDB1c2VjIGZvciBsYXJnZSBjcHUgY291bnQuCisgKiBEZWxpdmVyIG1vbmRvIHRvIGxhcmdlIG51bWJlciBvZiBjcHVzIGNvdWxkIHRha2UgbG9uZ2VyLCB3ZSBhZGp1c3RzCisgKiB0aGUgcmV0cnkgY291bnQgYXMgbG9uZyBhcyB0YXJnZXQgY3B1cyBhcmUgbWFraW5nIGZvcndhcmQgcHJvZ3Jlc3MuCisgKi8KIHN0YXRpYyB2b2lkIGh5cGVydmlzb3JfeGNhbGxfZGVsaXZlcihzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiwgaW50IGNudCkKIHsKLQlpbnQgcmV0cmllcywgdGhpc19jcHUsIHByZXZfc2VudCwgaSwgc2F3X2NwdV9lcnJvcjsKKwlpbnQgdGhpc19jcHUsIHRvdF9jcHVzLCBwcmV2X3NlbnQsIGksIHJlbTsKKwlpbnQgdXNlY193YWl0LCByZXRyaWVzLCB0b3RfcmV0cmllczsKKwl1MTYgZmlyc3RfY3B1ID0gMHhmZmZmOworCXVuc2lnbmVkIGxvbmcgeGNfcmN2ZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJaW50IGVjcHVlcnJvcl9pZCA9IDA7CisJaW50IGVub2NwdV9pZCA9IDA7CiAJdTE2ICpjcHVfbGlzdDsKKwl1MTYgY3B1OwogCiAJdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KIAljcHVfbGlzdCA9IF9fdmEodGItPmNwdV9saXN0X3BhKTsKLQotCXNhd19jcHVfZXJyb3IgPSAwOwotCXJldHJpZXMgPSAwOworCXVzZWNfd2FpdCA9IGNudCAqIE1PTkRPX1VTRUNfV0FJVF9NSU47CisJaWYgKHVzZWNfd2FpdCA+IE1PTkRPX1VTRUNfV0FJVF9NQVgpCisJCXVzZWNfd2FpdCA9IE1PTkRPX1VTRUNfV0FJVF9NQVg7CisJcmV0cmllcyA9IHRvdF9yZXRyaWVzID0gMDsKKwl0b3RfY3B1cyA9IGNudDsKIAlwcmV2X3NlbnQgPSAwOworCiAJZG8gewotCQlpbnQgZm9yd2FyZF9wcm9ncmVzcywgbl9zZW50OworCQlpbnQgbl9zZW50LCBtb25kb19kZWxpdmVyZWQsIHRhcmdldF9jcHVfYnVzeTsKIAogCQlzdGF0dXMgPSBzdW40dl9jcHVfbW9uZG9fc2VuZChjbnQsCiAJCQkJCSAgICAgIHRiLT5jcHVfbGlzdF9wYSwKQEAgLTY0NCw5NCArNjcwLDExMyBAQAogCiAJCS8qIEhWX0VPSyBtZWFucyBhbGwgY3B1cyByZWNlaXZlZCB0aGUgeGNhbGwsIHdlJ3JlIGRvbmUuICAqLwogCQlpZiAobGlrZWx5KHN0YXR1cyA9PSBIVl9FT0spKQotCQkJYnJlYWs7CisJCQlnb3RvIHhjYWxsX2RvbmU7CisKKwkJLyogSWYgbm90IHRoZXNlIG5vbi1mYXRhbCBlcnJvcnMsIHBhbmljICovCisJCWlmICh1bmxpa2VseSgoc3RhdHVzICE9IEhWX0VXT1VMREJMT0NLKSAmJgorCQkJKHN0YXR1cyAhPSBIVl9FQ1BVRVJST1IpICYmCisJCQkoc3RhdHVzICE9IEhWX0VOT0NQVSkpKQorCQkJZ290byBmYXRhbF9lcnJvcnM7CiAKIAkJLyogRmlyc3QsIHNlZSBpZiB3ZSBtYWRlIGFueSBmb3J3YXJkIHByb2dyZXNzLgogCQkgKgorCQkgKiBHbyB0aHJvdWdoIHRoZSBjcHVfbGlzdCwgY291bnQgdGhlIHRhcmdldCBjcHVzIHRoYXQgaGF2ZQorCQkgKiByZWNlaXZlZCBvdXIgbW9uZG8gKG5fc2VudCksIGFuZCB0aG9zZSB0aGF0IGRpZCBub3QgKHJlbSkuCisJCSAqIFJlLXBhY2sgY3B1X2xpc3Qgd2l0aCB0aGUgY3B1cyByZW1haW4gdG8gYmUgcmV0cmllZCBpbiB0aGUKKwkJICogZnJvbnQgLSB0aGlzIHNpbXBsaWZpZXMgdHJhY2tpbmcgdGhlIHRydWx5IHN0YWxsZWQgY3B1cy4KKwkJICoKIAkJICogVGhlIGh5cGVydmlzb3IgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwgc2VuZHMgYnkgc2V0dGluZwogCQkgKiBjcHUgbGlzdCBlbnRyaWVzIHRvIHRoZSB2YWx1ZSAweGZmZmYuCisJCSAqCisJCSAqIEVXT1VMREJMT0NLIG1lYW5zIHNvbWUgdGFyZ2V0IGNwdXMgZGlkIG5vdCByZWNlaXZlIHRoZQorCQkgKiBtb25kbyBhbmQgcmV0cnkgdXN1YWxseSBoZWxwcy4KKwkJICoKKwkJICogRUNQVUVSUk9SIG1lYW5zIGF0IGxlYXN0IG9uZSB0YXJnZXQgY3B1IGlzIGluIGVycm9yIHN0YXRlLAorCQkgKiBpdCdzIHVzdWFsbHkgc2FmZSB0byBza2lwIHRoZSBmYXVsdHkgY3B1IGFuZCByZXRyeS4KKwkJICoKKwkJICogRU5PQ1BVIG1lYW5zIG9uZSBvZiB0aGUgdGFyZ2V0IGNwdSBkb2Vzbid0IGJlbG9uZyB0byB0aGUKKwkJICogZG9tYWluLCBwZXJoYXBzIG9mZmxpbmVkIHdoaWNoIGlzIHVuZXhwZWN0ZWQsIGJ1dCBub3QKKwkJICogZmF0YWwgYW5kIGl0J3Mgb2theSB0byBza2lwIHRoZSBvZmZsaW5lZCBjcHUuCiAJCSAqLworCQlyZW0gPSAwOwogCQluX3NlbnQgPSAwOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKLQkJCWlmIChsaWtlbHkoY3B1X2xpc3RbaV0gPT0gMHhmZmZmKSkKKwkJCWNwdSA9IGNwdV9saXN0W2ldOworCQkJaWYgKGxpa2VseShjcHUgPT0gMHhmZmZmKSkgewogCQkJCW5fc2VudCsrOworCQkJfSBlbHNlIGlmICgoc3RhdHVzID09IEhWX0VDUFVFUlJPUikgJiYKKwkJCQkoc3VuNHZfY3B1X3N0YXRlKGNwdSkgPT0gSFZfQ1BVX1NUQVRFX0VSUk9SKSkgeworCQkJCWVjcHVlcnJvcl9pZCA9IGNwdSArIDE7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBIVl9FTk9DUFUgJiYgIWNwdV9vbmxpbmUoY3B1KSkgeworCQkJCWVub2NwdV9pZCA9IGNwdSArIDE7CisJCQl9IGVsc2UgeworCQkJCWNwdV9saXN0W3JlbSsrXSA9IGNwdTsKKwkJCX0KIAkJfQogCi0JCWZvcndhcmRfcHJvZ3Jlc3MgPSAwOwotCQlpZiAobl9zZW50ID4gcHJldl9zZW50KQotCQkJZm9yd2FyZF9wcm9ncmVzcyA9IDE7CisJCS8qIE5vIGNwdSByZW1haW5lZCwgd2UncmUgZG9uZS4gKi8KKwkJaWYgKHJlbSA9PSAwKQorCQkJYnJlYWs7CiAKKwkJLyogT3RoZXJ3aXNlLCB1cGRhdGUgdGhlIGNwdSBjb3VudCBmb3IgcmV0cnkuICovCisJCWNudCA9IHJlbTsKKworCQkvKiBSZWNvcmQgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIG1vbmRvcyByZWNlaXZlZCBieSB0aGUKKwkJICogZmlyc3Qgb2YgdGhlIHJlbWFpbmluZyBjcHVzLgorCQkgKi8KKwkJaWYgKGZpcnN0X2NwdSAhPSBjcHVfbGlzdFswXSkgeworCQkJZmlyc3RfY3B1ID0gY3B1X2xpc3RbMF07CisJCQl4Y19yY3ZkID0gQ1BVX01PTkRPX0NPVU5URVIoZmlyc3RfY3B1KTsKKwkJfQorCisJCS8qIFdhcyBhbnkgbW9uZG8gZGVsaXZlcmVkIHN1Y2Nlc3NmdWxseT8gKi8KKwkJbW9uZG9fZGVsaXZlcmVkID0gKG5fc2VudCA+IHByZXZfc2VudCk7CiAJCXByZXZfc2VudCA9IG5fc2VudDsKIAotCQkvKiBJZiB3ZSBnZXQgYSBIVl9FQ1BVRVJST1IsIHRoZW4gb25lIG9yIG1vcmUgb2YgdGhlIGNwdXMKLQkJICogaW4gdGhlIGxpc3QgYXJlIGluIGVycm9yIHN0YXRlLiAgVXNlIHRoZSBjcHVfc3RhdGUoKQotCQkgKiBoeXBlcnZpc29yIGNhbGwgdG8gZmluZCBvdXQgd2hpY2ggY3B1cyBhcmUgaW4gZXJyb3Igc3RhdGUuCisJCS8qIG9yLCB3YXMgYW55IHRhcmdldCBjcHUgYnVzeSBwcm9jZXNzaW5nIG90aGVyIG1vbmRvcz8gKi8KKwkJdGFyZ2V0X2NwdV9idXN5ID0gKHhjX3JjdmQgPCBDUFVfTU9ORE9fQ09VTlRFUihmaXJzdF9jcHUpKTsKKwkJeGNfcmN2ZCA9IENQVV9NT05ET19DT1VOVEVSKGZpcnN0X2NwdSk7CisKKwkJLyogUmV0cnkgY291bnQgaXMgZm9yIG5vIHByb2dyZXNzLiBJZiB3ZSdyZSBtYWtpbmcgcHJvZ3Jlc3MsCisJCSAqIHJlc2V0IHRoZSByZXRyeSBjb3VudC4KIAkJICovCi0JCWlmICh1bmxpa2VseShzdGF0dXMgPT0gSFZfRUNQVUVSUk9SKSkgewotCQkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCQkJbG9uZyBlcnI7Ci0JCQkJdTE2IGNwdTsKLQotCQkJCWNwdSA9IGNwdV9saXN0W2ldOwotCQkJCWlmIChjcHUgPT0gMHhmZmZmKQotCQkJCQljb250aW51ZTsKLQotCQkJCWVyciA9IHN1bjR2X2NwdV9zdGF0ZShjcHUpOwotCQkJCWlmIChlcnIgPT0gSFZfQ1BVX1NUQVRFX0VSUk9SKSB7Ci0JCQkJCXNhd19jcHVfZXJyb3IgPSAoY3B1ICsgMSk7Ci0JCQkJCWNwdV9saXN0W2ldID0gMHhmZmZmOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICh1bmxpa2VseShzdGF0dXMgIT0gSFZfRVdPVUxEQkxPQ0spKQotCQkJZ290byBmYXRhbF9tb25kb19lcnJvcjsKLQotCQkvKiBEb24ndCBib3RoZXIgcmV3cml0aW5nIHRoZSBDUFUgbGlzdCwganVzdCBsZWF2ZSB0aGUKLQkJICogMHhmZmZmIGFuZCBub24tMHhmZmZmIGVudHJpZXMgaW4gdGhlcmUgYW5kIHRoZQotCQkgKiBoeXBlcnZpc29yIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCQkgKgotCQkgKiBPbmx5IGFkdmFuY2UgdGltZW91dCBzdGF0ZSBpZiB3ZSBkaWRuJ3QgbWFrZSBhbnkKLQkJICogZm9yd2FyZCBwcm9ncmVzcy4KLQkJICovCi0JCWlmICh1bmxpa2VseSghZm9yd2FyZF9wcm9ncmVzcykpIHsKLQkJCWlmICh1bmxpa2VseSgrK3JldHJpZXMgPiAxMDAwMCkpCi0JCQkJZ290byBmYXRhbF9tb25kb190aW1lb3V0OwotCi0JCQkvKiBEZWxheSBhIGxpdHRsZSBiaXQgdG8gbGV0IG90aGVyIGNwdXMgY2F0Y2ggdXAKLQkJCSAqIG9uIHRoZWlyIGNwdSBtb25kbyBxdWV1ZSB3b3JrLgotCQkJICovCi0JCQl1ZGVsYXkoMiAqIGNudCk7CisJCWlmIChsaWtlbHkobW9uZG9fZGVsaXZlcmVkIHx8IHRhcmdldF9jcHVfYnVzeSkpIHsKKwkJCXRvdF9yZXRyaWVzICs9IHJldHJpZXM7CisJCQlyZXRyaWVzID0gMDsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShyZXRyaWVzID4gTU9ORE9fUkVUUllfTElNSVQpKSB7CisJCQlnb3RvIGZhdGFsX21vbmRvX3RpbWVvdXQ7CiAJCX0KKworCQkvKiBEZWxheSBhIGxpdHRsZSBiaXQgdG8gbGV0IG90aGVyIGNwdXMgY2F0Y2ggdXAgb24KKwkJICogdGhlaXIgY3B1IG1vbmRvIHF1ZXVlIHdvcmsuCisJCSAqLworCQlpZiAoIW1vbmRvX2RlbGl2ZXJlZCkKKwkJCXVkZWxheSh1c2VjX3dhaXQpOworCisJCXJldHJpZXMrKzsKIAl9IHdoaWxlICgxKTsKIAotCWlmICh1bmxpa2VseShzYXdfY3B1X2Vycm9yKSkKLQkJZ290byBmYXRhbF9tb25kb19jcHVfZXJyb3I7Ci0KK3hjYWxsX2RvbmU6CisJaWYgKHVubGlrZWx5KGVjcHVlcnJvcl9pZCA+IDApKSB7CisJCXByX2NyaXQoIkNQVVslZF06IFNVTjRWIG1vbmRvIGNwdSBlcnJvciwgdGFyZ2V0IGNwdSglZCkgd2FzIGluIGVycm9yIHN0YXRlXG4iLAorCQkgICAgICAgdGhpc19jcHUsIGVjcHVlcnJvcl9pZCAtIDEpOworCX0gZWxzZSBpZiAodW5saWtlbHkoZW5vY3B1X2lkID4gMCkpIHsKKwkJcHJfY3JpdCgiQ1BVWyVkXTogU1VONFYgbW9uZG8gY3B1IGVycm9yLCB0YXJnZXQgY3B1KCVkKSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGRvbWFpblxuIiwKKwkJICAgICAgIHRoaXNfY3B1LCBlbm9jcHVfaWQgLSAxKTsKKwl9CiAJcmV0dXJuOwogCi1mYXRhbF9tb25kb19jcHVfZXJyb3I6Ci0JcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVWyVkXTogU1VONFYgbW9uZG8gY3B1IGVycm9yLCBzb21lIHRhcmdldCBjcHVzICIKLQkgICAgICAgIihpbmNsdWRpbmcgJWQpIHdlcmUgaW4gZXJyb3Igc3RhdGVcbiIsCi0JICAgICAgIHRoaXNfY3B1LCBzYXdfY3B1X2Vycm9yIC0gMSk7Ci0JcmV0dXJuOworZmF0YWxfZXJyb3JzOgorCS8qIGZhdGFsIGVycm9ycyBpbmNsdWRlIGJhZCBhbGlnbm1lbnQsIGV0YyAqLworCXByX2NyaXQoIkNQVVslZF06IEFyZ3Mgd2VyZSBjbnQoJWQpIGNwdWxpc3RfcGEoJWx4KSBtb25kb19ibG9ja19wYSglbHgpXG4iLAorCSAgICAgICB0aGlzX2NwdSwgdG90X2NwdXMsIHRiLT5jcHVfbGlzdF9wYSwgdGItPmNwdV9tb25kb19ibG9ja19wYSk7CisJcGFuaWMoIlVuZXhwZWN0ZWQgU1VONFYgbW9uZG8gZXJyb3IgJWx1XG4iLCBzdGF0dXMpOwogCiBmYXRhbF9tb25kb190aW1lb3V0OgotCXByaW50ayhLRVJOX0NSSVQgIkNQVVslZF06IFNVTjRWIG1vbmRvIHRpbWVvdXQsIG5vIGZvcndhcmQgIgotCSAgICAgICAiIHByb2dyZXNzIGFmdGVyICVkIHJldHJpZXMuXG4iLAotCSAgICAgICB0aGlzX2NwdSwgcmV0cmllcyk7Ci0JZ290byBkdW1wX2NwdV9saXN0X2FuZF9vdXQ7Ci0KLWZhdGFsX21vbmRvX2Vycm9yOgotCXByaW50ayhLRVJOX0NSSVQgIkNQVVslZF06IFVuZXhwZWN0ZWQgU1VONFYgbW9uZG8gZXJyb3IgJWx1XG4iLAotCSAgICAgICB0aGlzX2NwdSwgc3RhdHVzKTsKLQlwcmludGsoS0VSTl9DUklUICJDUFVbJWRdOiBBcmdzIHdlcmUgY250KCVkKSBjcHVsaXN0X3BhKCVseCkgIgotCSAgICAgICAibW9uZG9fYmxvY2tfcGEoJWx4KVxuIiwKLQkgICAgICAgdGhpc19jcHUsIGNudCwgdGItPmNwdV9saXN0X3BhLCB0Yi0+Y3B1X21vbmRvX2Jsb2NrX3BhKTsKLQotZHVtcF9jcHVfbGlzdF9hbmRfb3V0OgotCXByaW50ayhLRVJOX0NSSVQgIkNQVVslZF06IENQVSBsaXN0IFsgIiwgdGhpc19jcHUpOwotCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKLQkJcHJpbnRrKCIldSAiLCBjcHVfbGlzdFtpXSk7Ci0JcHJpbnRrKCJdXG4iKTsKKwkvKiBzb21lIGNwdXMgYmVpbmcgbm9uLXJlc3BvbnNpdmUgdG8gdGhlIGNwdSBtb25kbyAqLworCXByX2NyaXQoIkNQVVslZF06IFNVTjRWIG1vbmRvIHRpbWVvdXQsIGNwdSglZCkgbWFkZSBubyBmb3J3YXJkIHByb2dyZXNzIGFmdGVyICVkIHJldHJpZXMuIFRvdGFsIHRhcmdldCBjcHVzKCVkKS5cbiIsCisJICAgICAgIHRoaXNfY3B1LCBmaXJzdF9jcHUsICh0b3RfcmV0cmllcyArIHJldHJpZXMpLCB0b3RfY3B1cyk7CisJcGFuaWMoIlNVTjRWIG1vbmRvIHRpbWVvdXQgcGFuaWNcbiIpOwogfQogCiBzdGF0aWMgdm9pZCAoKnhjYWxsX2RlbGl2ZXJfaW1wbCkoc3RydWN0IHRyYXBfcGVyX2NwdSAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNHZfaXZlYy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNHZfaXZlYy5TCmluZGV4IDU1OWJjNWUuLjM0NjMxOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjR2X2l2ZWMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40dl9pdmVjLlMKQEAgLTI2LDYgKzI2LDIxIEBACiAJbGR4YQlbJWcwXSBBU0lfU0NSQVRDSFBBRCwgJWc0CiAJc3ViCSVnNCwgVFJBUF9QRVJfQ1BVX0ZBVUxUX0lORk8sICVnNAogCisJLyogR2V0IHNtcF9wcm9jZXNzb3JfaWQoKSBpbnRvICVnMyAqLworCXNldGhpCSVoaSh0cmFwX2Jsb2NrKSwgJWc1CisJb3IJJWc1LCAlbG8odHJhcF9ibG9jayksICVnNQorCXN1YgklZzQsICVnNSwgJWczCisJc3JseAklZzMsIFRSQVBfQkxPQ0tfU1pfU0hJRlQsICVnMworCisJLyogSW5jcmVtZW50IGNwdV9tb25kb19jb3VudGVyW3NtcF9wcm9jZXNzb3JfaWQoKV0gKi8KKwlzZXRoaQklaGkoY3B1X21vbmRvX2NvdW50ZXIpLCAlZzUKKwlvcgklZzUsICVsbyhjcHVfbW9uZG9fY291bnRlciksICVnNQorCXNsbHgJJWczLCAzLCAlZzMKKwlhZGQJJWc1LCAlZzMsICVnNQorCWxkeAlbJWc1XSwgJWczCisJYWRkCSVnMywgMSwgJWczCisJc3R4CSVnMywgWyVnNV0KKwogCS8qIEdldCBDUFUgbW9uZG8gcXVldWUgYmFzZSBwaHlzIGFkZHJlc3MgaW50byAlZzcuICAqLwogCWxkeAlbJWc0ICsgVFJBUF9QRVJfQ1BVX0NQVV9NT05ET19QQV0sICVnNwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCBkNDRmYjgwLi4zMmRhZmI5MiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCkBAIC0yNzMyLDYgKzI3MzIsNyBAQAogCX0KIH0KIAordTY0IGNwdV9tb25kb19jb3VudGVyW05SX0NQVVNdID0gezB9Owogc3RydWN0IHRyYXBfcGVyX2NwdSB0cmFwX2Jsb2NrW05SX0NQVVNdOwogRVhQT1JUX1NZTUJPTCh0cmFwX2Jsb2NrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHNiLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC90c2IuUwppbmRleCAzOTVlYzE4Li43ZDk2MWY2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90c2IuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90c2IuUwpAQCAtMzc1LDYgKzM3NSw3IEBACiAJICogJW8xOglUU0IgYmFzZSBjb25maWcgcG9pbnRlcgogCSAqICVvMjoJVFNCIGh1Z2UgY29uZmlnIHBvaW50ZXIsIG9yIE5VTEwgaWYgbm9uZQogCSAqICVvMzoJSHlwZXJ2aXNvciBUU0IgZGVzY3JpcHRvciBwaHlzaWNhbCBhZGRyZXNzCisJICogJW80OiBTZWNvbmRhcnkgY29udGV4dCB0byBsb2FkLCBpZiBub24temVybwogCSAqCiAJICogV2UgaGF2ZSB0byBydW4gdGhpcyB3aG9sZSB0aGluZyB3aXRoIGludGVycnVwdHMKIAkgKiBkaXNhYmxlZCBzbyB0aGF0IHRoZSBjdXJyZW50IGNwdSBkb2Vzbid0IGNoYW5nZQpAQCAtMzg3LDYgKzM4OCwxNyBAQAogCXJkcHIJJXBzdGF0ZSwgJWcxCiAJd3JwcgklZzEsIFBTVEFURV9JRSwgJXBzdGF0ZQogCisJYnJ6LHBuCSVvNCwgMWYKKwkgbW92CVNFQ09OREFSWV9DT05URVhULCAlbzUKKworNjYxOglzdHhhCSVvNCwgWyVvNV0gQVNJX0RNTVUKKwkuc2VjdGlvbiAuc3VuNHZfMWluc25fcGF0Y2gsICJheCIKKwkud29yZAk2NjFiCisJc3R4YQklbzQsIFslbzVdIEFTSV9NTVUKKwkucHJldmlvdXMKKwlmbHVzaAklZzYKKworMToKIAlUUkFQX0xPQURfVFJBUF9CTE9DSyglZzIsICVnMykKIAogCXN0eAklbzAsIFslZzIgKyBUUkFQX1BFUl9DUFVfUEdEX1BBRERSXQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9saWIvVTNtZW1jcHkuUyBiL2FyY2gvc3BhcmMvbGliL1UzbWVtY3B5LlMKaW5kZXggNTRmOTg3MC4uNWE4Y2IzNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvVTNtZW1jcHkuUworKysgYi9hcmNoL3NwYXJjL2xpYi9VM21lbWNweS5TCkBAIC0xNDUsMTMgKzE0NSwxMyBAQAogRU5UUlkoVTNfcmV0bF9vMl9hbmRfN19wbHVzX0dTKQogCWFuZAklbzIsIDcsICVvMgogCXJldGwKLQkgYWRkCSVvMiwgR0xPQkFMX1NQQVJFLCAlbzIKKwkgYWRkCSVvMiwgR0xPQkFMX1NQQVJFLCAlbzAKIEVORFBST0MoVTNfcmV0bF9vMl9hbmRfN19wbHVzX0dTKQogRU5UUlkoVTNfcmV0bF9vMl9hbmRfN19wbHVzX0dTX3BsdXNfOCkKIAlhZGQJR0xPQkFMX1NQQVJFLCA4LCBHTE9CQUxfU1BBUkUKIAlhbmQJJW8yLCA3LCAlbzIKIAlyZXRsCi0JIGFkZAklbzIsIEdMT0JBTF9TUEFSRSwgJW8yCisJIGFkZAklbzIsIEdMT0JBTF9TUEFSRSwgJW8wCiBFTkRQUk9DKFUzX3JldGxfbzJfYW5kXzdfcGx1c19HU19wbHVzXzgpCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wb3dlci9oaWJlcm5hdGUuYyBiL2FyY2gvc3BhcmMvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMTdiZDJlMS4uZGY3MDdhOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wb3dlci9oaWJlcm5hdGUuYworKysgYi9hcmNoL3NwYXJjL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0zNSw2ICszNSw1IEBACiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5hY3RpdmVfbW07CiAKLQlsb2FkX3NlY29uZGFyeV9jb250ZXh0KG1tKTsKLQl0c2JfY29udGV4dF9zd2l0Y2gobW0pOworCXRzYl9jb250ZXh0X3N3aXRjaF9jdHgobW0sIENUWF9IV0JJVFMobW0tPmNvbnRleHQpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L3N0cmluZy5jCmluZGV4IGNjM2JkNTguLjllMjQwZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlICJjdHlwZS5oIgorI2luY2x1ZGUgInN0cmluZy5oIgogCiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IGxlbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmggYi9hcmNoL3g4Ni9ib290L3N0cmluZy5oCmluZGV4IDcyNWU4MjAuLjExMzU4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmgKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuaApAQCAtMTgsNCArMTgsMTMgQEAKICNkZWZpbmUgbWVtc2V0KGQsYyxsKSBfX2J1aWx0aW5fbWVtc2V0KGQsYyxsKQogI2RlZmluZSBtZW1jbXAJX19idWlsdGluX21lbWNtcAogCitleHRlcm4gaW50IHN0cmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKTsKK2V4dGVybiBpbnQgc3RybmNtcChjb25zdCBjaGFyICpjcywgY29uc3QgY2hhciAqY3QsIHNpemVfdCBjb3VudCk7CitleHRlcm4gc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICpzKTsKK2V4dGVybiBjaGFyICpzdHJzdHIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK2V4dGVybiBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRvdShjb25zdCBjaGFyICpzKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgc2ltcGxlX3N0cnRvdWxsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgYmFzZSk7CisKICNlbmRpZiAvKiBCT09UX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9hdngyX3g4Nl82NF9hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGExX2F2eDJfeDg2XzY0X2FzbS5TCmluZGV4IDFjZDc5MmQuLjFlYWI3OWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGExX2F2eDJfeDg2XzY0X2FzbS5TCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGExX2F2eDJfeDg2XzY0X2FzbS5TCkBAIC0xMTcsMTEgKzExNywxMCBAQAogCS5zZXQgVDEsIFJFR19UMQogLmVuZG0KIAotI2RlZmluZSBLX0JBU0UJCSVyOAogI2RlZmluZSBIQVNIX1BUUgklcjkKKyNkZWZpbmUgQkxPQ0tTX0NUUgklcjgKICNkZWZpbmUgQlVGRkVSX1BUUgklcjEwCiAjZGVmaW5lIEJVRkZFUl9QVFIyCSVyMTMKLSNkZWZpbmUgQlVGRkVSX0VORAklcjExCiAKICNkZWZpbmUgUFJFQ0FMQ19CVUYJJXIxNAogI2RlZmluZSBXS19CVUYJCSVyMTUKQEAgLTIwNSwxNCArMjA0LDE0IEBACiAJCSAqIGJsZW5kZWQgQVZYMiBhbmQgQUxVIGluc3RydWN0aW9uIHNjaGVkdWxpbmcKIAkJICogMSB2ZWN0b3IgaXRlcmF0aW9uIHBlciA4IHJvdW5kcwogCQkgKi8KLQkJdm1vdmRxdSAoKGkgKiAyKSArIFBSRUNBTENfT0ZGU0VUKShCVUZGRVJfUFRSKSwgV19UTVAKKwkJdm1vdmRxdSAoaSAqIDIpKEJVRkZFUl9QVFIpLCBXX1RNUAogCS5lbHNlaWYgKChpICYgNykgPT0gMSkKLQkJdmluc2VydGYxMjggJDEsICgoKGktMSkgKiAyKStQUkVDQUxDX09GRlNFVCkoQlVGRkVSX1BUUjIpLFwKKwkJdmluc2VydGYxMjggJDEsICgoaS0xKSAqIDIpKEJVRkZFUl9QVFIyKSxcCiAJCQkgV1lfVE1QLCBXWV9UTVAKIAkuZWxzZWlmICgoaSAmIDcpID09IDIpCiAJCXZwc2h1ZmIgWU1NX1NIVUZCX0JTV0FQLCBXWV9UTVAsIFdZCiAJLmVsc2VpZiAoKGkgJiA3KSA9PSA0KQotCQl2cGFkZGQgIEtfWE1NKEtfQkFTRSksIFdZLCBXWV9UTVAKKwkJdnBhZGRkICBLX1hNTSArIEtfWE1NX0FSKCVyaXApLCBXWSwgV1lfVE1QCiAJLmVsc2VpZiAoKGkgJiA3KSA9PSA3KQogCQl2bW92ZHF1ICBXWV9UTVAsIFBSRUNBTENfV0soaSZ+NykKIApAQCAtMjU1LDcgKzI1NCw3IEBACiAJCXZweG9yCVdZLCBXWV9UTVAsIFdZX1RNUAogCS5lbHNlaWYgKChpICYgNykgPT0gNykKIAkJdnB4b3IJV1lfVE1QMiwgV1lfVE1QLCBXWQotCQl2cGFkZGQJS19YTU0oS19CQVNFKSwgV1ksIFdZX1RNUAorCQl2cGFkZGQgIEtfWE1NICsgS19YTU1fQVIoJXJpcCksIFdZLCBXWV9UTVAKIAkJdm1vdmRxdQlXWV9UTVAsIFBSRUNBTENfV0soaSZ+NykKIAogCQlQUkVDQUxDX1JPVEFURV9XWQpAQCAtMjkxLDcgKzI5MCw3IEBACiAJCXZwc3JsZAkkMzAsIFdZLCBXWQogCQl2cG9yCVdZLCBXWV9UTVAsIFdZCiAJLmVsc2VpZiAoKGkgJiA3KSA9PSA3KQotCQl2cGFkZGQJS19YTU0oS19CQVNFKSwgV1ksIFdZX1RNUAorCQl2cGFkZGQgIEtfWE1NICsgS19YTU1fQVIoJXJpcCksIFdZLCBXWV9UTVAKIAkJdm1vdmRxdQlXWV9UTVAsIFBSRUNBTENfV0soaSZ+NykKIAogCQlQUkVDQUxDX1JPVEFURV9XWQpAQCAtNDQ2LDYgKzQ0NSwxNiBAQAogCiAuZW5kbQogCisvKiBBZGQgY29uc3RhbnQgb25seSBpZiAoJTIgPiAlMykgY29uZGl0aW9uIG1ldCAodXNlcyBSVEEgYXMgdGVtcCkKKyAqICUxICsgJTIgPj0gJTMgPyAlNCA6IDAKKyAqLworLm1hY3JvIEFERF9JRl9HRSBhLCBiLCBjLCBkCisJbW92ICAgICBcYSwgUlRBCisJYWRkICAgICAkXGQsIFJUQQorCWNtcCAgICAgJFxjLCBcYgorCWNtb3ZnZSAgUlRBLCBcYQorLmVuZG0KKwogLyoKICAqIG1hY3JvIGltcGxlbWVudHMgODAgcm91bmRzIG9mIFNIQS0xLCBmb3IgbXVsdGlwbGUgYmxvY2tzIHdpdGggcy93IHBpcGVsaW5pbmcKICAqLwpAQCAtNDYzLDEzICs0NzIsMTYgQEAKIAlsZWEJKDIqNCo4MCszMikoJXJzcCksIFdLX0JVRgogCiAJIyBQcmVjYWxjIFdLIGZvciBmaXJzdCAyIGJsb2NrcwotCVBSRUNBTENfT0ZGU0VUID0gMAorCUFERF9JRl9HRSBCVUZGRVJfUFRSMiwgQkxPQ0tTX0NUUiwgMiwgNjQKIAkuc2V0IGksIDAKIAkucmVwdCAgICAxNjAKIAkJUFJFQ0FMQyBpCiAJCS5zZXQgaSwgaSArIDEKIAkuZW5kcgotCVBSRUNBTENfT0ZGU0VUID0gMTI4CisKKwkvKiBHbyB0byBuZXh0IGJsb2NrIGlmIG5lZWRlZCAqLworCUFERF9JRl9HRSBCVUZGRVJfUFRSLCBCTE9DS1NfQ1RSLCAzLCAxMjgKKwlBRERfSUZfR0UgQlVGRkVSX1BUUjIsIEJMT0NLU19DVFIsIDQsIDEyOAogCXhjaGcJV0tfQlVGLCBQUkVDQUxDX0JVRgogCiAJLmFsaWduIDMyCkBAIC00NzksOCArNDkxLDggQEAKIAkgKiB3ZSB1c2UgS19CQVNFIHZhbHVlIGFzIGEgc2lnbmFsIG9mIGEgbGFzdCBibG9jaywKIAkgKiBpdCBpcyBzZXQgYmVsb3cgYnk6IGNtb3ZhZSBCVUZGRVJfUFRSLCBLX0JBU0UKIAkgKi8KLQljbXAJS19CQVNFLCBCVUZGRVJfUFRSCi0Jam5lCV9iZWdpbgorCXRlc3QgQkxPQ0tTX0NUUiwgQkxPQ0tTX0NUUgorCWpueiBfYmVnaW4KIAkuYWxpZ24gMzIKIAlqbXAJX2VuZAogCS5hbGlnbiAzMgpAQCAtNTEyLDEwICs1MjQsMTAgQEAKIAkJLnNldCBqLCBqKzIKIAkuZW5kcgogCi0JYWRkCSQoMio2NCksIEJVRkZFUl9QVFIgICAgICAgLyogbW92ZSB0byBuZXh0IG9kZC02NC1ieXRlIGJsb2NrICovCi0JY21wCUJVRkZFUl9FTkQsIEJVRkZFUl9QVFIgICAgLyogaXMgY3VycmVudCBibG9jayB0aGUgbGFzdCBvbmU/ICovCi0JY21vdmFlCUtfQkFTRSwgQlVGRkVSX1BUUgkvKiBzaWduYWwgdGhlIGxhc3QgaXRlcmF0aW9uIHNtYXJ0bHkgKi8KLQorCS8qIFVwZGF0ZSBDb3VudGVyICovCisJc3ViICQxLCBCTE9DS1NfQ1RSCisJLyogTW92ZSB0byB0aGUgbmV4dCBibG9jayBvbmx5IGlmIG5lZWRlZCovCisJQUREX0lGX0dFIEJVRkZFUl9QVFIsIEJMT0NLU19DVFIsIDQsIDEyOAogCS8qCiAJICogcm91bmRzCiAJICogNjAsNjIsNjQsNjYsNjgKQEAgLTUzMiw4ICs1NDQsOCBAQAogCVVQREFURV9IQVNICTEyKEhBU0hfUFRSKSwgRAogCVVQREFURV9IQVNICTE2KEhBU0hfUFRSKSwgRQogCi0JY21wCUtfQkFTRSwgQlVGRkVSX1BUUgkvKiBpcyBjdXJyZW50IGJsb2NrIHRoZSBsYXN0IG9uZT8gKi8KLQlqZQlfbG9vcAorCXRlc3QJQkxPQ0tTX0NUUiwgQkxPQ0tTX0NUUgorCWp6CV9sb29wCiAKIAltb3YJVEIsIEIKIApAQCAtNTc1LDEwICs1ODcsMTAgQEAKIAkJLnNldCBqLCBqKzIKIAkuZW5kcgogCi0JYWRkCSQoMio2NCksIEJVRkZFUl9QVFIyICAgICAgLyogbW92ZSB0byBuZXh0IGV2ZW4tNjQtYnl0ZSBibG9jayAqLwotCi0JY21wCUJVRkZFUl9FTkQsIEJVRkZFUl9QVFIyICAgLyogaXMgY3VycmVudCBibG9jayB0aGUgbGFzdCBvbmUgKi8KLQljbW92YWUJS19CQVNFLCBCVUZGRVJfUFRSICAgICAgIC8qIHNpZ25hbCB0aGUgbGFzdCBpdGVyYXRpb24gc21hcnRseSAqLworCS8qIHVwZGF0ZSBjb3VudGVyICovCisJc3ViICAgICAkMSwgQkxPQ0tTX0NUUgorCS8qIE1vdmUgdG8gdGhlIG5leHQgYmxvY2sgb25seSBpZiBuZWVkZWQqLworCUFERF9JRl9HRSBCVUZGRVJfUFRSMiwgQkxPQ0tTX0NUUiwgNCwgMTI4CiAKIAlqbXAJX2xvb3AzCiBfbG9vcDM6CkBAIC02NDEsMTkgKzY1MywxMiBAQAogCiAJYXZ4Ml96ZXJvdXBwZXIKIAotCWxlYQlLX1hNTV9BUiglcmlwKSwgS19CQVNFCi0KKwkvKiBTZXR1cCBpbml0aWFsIHZhbHVlcyAqLwogCW1vdglDVFgsIEhBU0hfUFRSCiAJbW92CUJVRiwgQlVGRkVSX1BUUgotCWxlYQk2NChCVUYpLCBCVUZGRVJfUFRSMgogCi0Jc2hsCSQ2LCBDTlQJCQkvKiBtdWwgYnkgNjQgKi8KLQlhZGQJQlVGLCBDTlQKLQlhZGQJJDY0LCBDTlQKLQltb3YJQ05ULCBCVUZGRVJfRU5ECi0KLQljbXAJQlVGRkVSX0VORCwgQlVGRkVSX1BUUjIKLQljbW92YWUJS19CQVNFLCBCVUZGRVJfUFRSMgorCW1vdglCVUYsIEJVRkZFUl9QVFIyCisJbW92CUNOVCwgQkxPQ0tTX0NUUgogCiAJeG1tX21vdglCU1dBUF9TSFVGQl9DVEwoJXJpcCksIFlNTV9TSFVGQl9CU1dBUAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMKaW5kZXggZjk2MGEwNC4uZmM2MTczOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGExX3Nzc2UzX2dsdWUuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAKIHN0YXRpYyBib29sIGF2eDJfdXNhYmxlKHZvaWQpCiB7Ci0JaWYgKGZhbHNlICYmIGF2eF91c2FibGUoKSAmJiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYMikKKwlpZiAoYXZ4X3VzYWJsZSgpICYmIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgyKQogCQkmJiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQk1JMSkKIAkJJiYgYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0JNSTIpKQogCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9lbnRyeS9lbnRyeV82NC5TCmluZGV4IGVmNzY2YTMuLmU3YjBlN2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUwpAQCAtMTIxNSw2ICsxMjE1LDggQEAKIAkgKiBvdGhlciBJU1QgZW50cmllcy4KIAkgKi8KIAorCUFTTV9DTEFDCisKIAkvKiBVc2UgJXJkeCBhcyBvdXIgdGVtcCB2YXJpYWJsZSB0aHJvdWdob3V0ICovCiAJcHVzaHEJJXJkeAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY3N0YXRlLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY3N0YXRlLmMKaW5kZXggZmVjOGE0Ni4uMTA3NmM5YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NzdGF0ZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jc3RhdGUuYwpAQCAtNDM0LDYgKzQzNCw3IEBACiAJLnN0b3AJCT0gY3N0YXRlX3BtdV9ldmVudF9zdG9wLAogCS5yZWFkCQk9IGNzdGF0ZV9wbXVfZXZlbnRfdXBkYXRlLAogCS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfTk9fSU5URVJSVVBULAorCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBtdSBjc3RhdGVfcGtnX3BtdSA9IHsKQEAgLTQ0Nyw2ICs0NDgsNyBAQAogCS5zdG9wCQk9IGNzdGF0ZV9wbXVfZXZlbnRfc3RvcCwKIAkucmVhZAkJPSBjc3RhdGVfcG11X2V2ZW50X3VwZGF0ZSwKIAkuY2FwYWJpbGl0aWVzCT0gUEVSRl9QTVVfQ0FQX05PX0lOVEVSUlVQVCwKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjc3RhdGVfbW9kZWwgbmhtX2NzdGF0ZXMgX19pbml0Y29uc3QgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3JhcGwuYwppbmRleCA4YjkwMmI2Li40YzFiN2VhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMKQEAgLTE2MSw3ICsxNjEsMTMgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFwbF9wbXUgKmNwdV90b19yYXBsX3BtdSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiByYXBsX3BtdXMtPnBtdXNbdG9wb2xvZ3lfbG9naWNhbF9wYWNrYWdlX2lkKGNwdSldOworCXVuc2lnbmVkIGludCBwa2dpZCA9IHRvcG9sb2d5X2xvZ2ljYWxfcGFja2FnZV9pZChjcHUpOworCisJLyoKKwkgKiBUaGUgdW5zaWduZWQgY2hlY2sgYWxzbyBjYXRjaGVzIHRoZSAnLTEnIHJldHVybiB2YWx1ZSBmb3Igbm9uCisJICogZXhpc3RlbnQgbWFwcGluZ3MgaW4gdGhlIHRvcG9sb2d5IG1hcC4KKwkgKi8KKwlyZXR1cm4gcGtnaWQgPCByYXBsX3BtdXMtPm1heHBrZyA/IHJhcGxfcG11cy0+cG11c1twa2dpZF0gOiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCByYXBsX3JlYWRfY291bnRlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC00MDIsNiArNDA4LDggQEAKIAogCS8qIG11c3QgYmUgZG9uZSBiZWZvcmUgdmFsaWRhdGVfZ3JvdXAgKi8KIAlwbXUgPSBjcHVfdG9fcmFwbF9wbXUoZXZlbnQtPmNwdSk7CisJaWYgKCFwbXUpCisJCXJldHVybiAtRUlOVkFMOwogCWV2ZW50LT5jcHUgPSBwbXUtPmNwdTsKIAlldmVudC0+cG11X3ByaXZhdGUgPSBwbXU7CiAJZXZlbnQtPmh3LmV2ZW50X2Jhc2UgPSBtc3I7CkBAIC01ODUsNiArNTkzLDE5IEBACiAJc3RydWN0IHJhcGxfcG11ICpwbXUgPSBjcHVfdG9fcmFwbF9wbXUoY3B1KTsKIAlpbnQgdGFyZ2V0OwogCisJaWYgKCFwbXUpIHsKKwkJcG11ID0ga3phbGxvY19ub2RlKHNpemVvZigqcG11KSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CisJCWlmICghcG11KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmF3X3NwaW5fbG9ja19pbml0KCZwbXUtPmxvY2spOworCQlJTklUX0xJU1RfSEVBRCgmcG11LT5hY3RpdmVfbGlzdCk7CisJCXBtdS0+cG11ID0gJnJhcGxfcG11cy0+cG11OworCQlwbXUtPnRpbWVyX2ludGVydmFsID0gbXNfdG9fa3RpbWUocmFwbF90aW1lcl9tcyk7CisJCXJhcGxfaHJ0aW1lcl9pbml0KHBtdSk7CisKKwkJcmFwbF9wbXVzLT5wbXVzW3RvcG9sb2d5X2xvZ2ljYWxfcGFja2FnZV9pZChjcHUpXSA9IHBtdTsKKwl9CiAJLyoKIAkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBvbmxpbmUgY3B1IGluIHRoZSBwYWNrYWdlIHdoaWNoIGNvbGxlY3RzIHJhcGwKIAkgKiBldmVudHMgYWxyZWFkeS4KQEAgLTU5OCwyNyArNjE5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYXBsX2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCi17Ci0Jc3RydWN0IHJhcGxfcG11ICpwbXUgPSBjcHVfdG9fcmFwbF9wbXUoY3B1KTsKLQotCWlmIChwbXUpCi0JCXJldHVybiAwOwotCi0JcG11ID0ga3phbGxvY19ub2RlKHNpemVvZigqcG11KSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7Ci0JaWYgKCFwbXUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmF3X3NwaW5fbG9ja19pbml0KCZwbXUtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZwbXUtPmFjdGl2ZV9saXN0KTsKLQlwbXUtPnBtdSA9ICZyYXBsX3BtdXMtPnBtdTsKLQlwbXUtPnRpbWVyX2ludGVydmFsID0gbXNfdG9fa3RpbWUocmFwbF90aW1lcl9tcyk7Ci0JcG11LT5jcHUgPSAtMTsKLQlyYXBsX2hydGltZXJfaW5pdChwbXUpOwotCXJhcGxfcG11cy0+cG11c1t0b3BvbG9neV9sb2dpY2FsX3BhY2thZ2VfaWQoY3B1KV0gPSBwbXU7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgcmFwbF9jaGVja19od191bml0KGJvb2wgYXBwbHlfcXVpcmspCiB7CiAJdTY0IG1zcl9yYXBsX3Bvd2VyX3VuaXRfYml0czsKQEAgLTY5Nyw2ICs2OTcsNyBAQAogCXJhcGxfcG11cy0+cG11LnN0YXJ0CQk9IHJhcGxfcG11X2V2ZW50X3N0YXJ0OwogCXJhcGxfcG11cy0+cG11LnN0b3AJCT0gcmFwbF9wbXVfZXZlbnRfc3RvcDsKIAlyYXBsX3BtdXMtPnBtdS5yZWFkCQk9IHJhcGxfcG11X2V2ZW50X3JlYWQ7CisJcmFwbF9wbXVzLT5wbXUubW9kdWxlCQk9IFRISVNfTU9EVUxFOwogCXJldHVybiAwOwogfQogCkBAIC04MDMsMjggKzgwNCwyMSBAQAogCSAqIEluc3RhbGwgY2FsbGJhY2tzLiBDb3JlIHdpbGwgY2FsbCB0aGVtIGZvciBlYWNoIG9ubGluZSBjcHUuCiAJICovCiAKLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9QRVJGX1g4Nl9SQVBMX1BSRVAsICJQRVJGX1g4Nl9SQVBMX1BSRVAiLAotCQkJCXJhcGxfY3B1X3ByZXBhcmUsIE5VTEwpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCiAJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfUEVSRl9YODZfUkFQTF9PTkxJTkUsCiAJCQkJIkFQX1BFUkZfWDg2X1JBUExfT05MSU5FIiwKIAkJCQlyYXBsX2NwdV9vbmxpbmUsIHJhcGxfY3B1X29mZmxpbmUpOwogCWlmIChyZXQpCi0JCWdvdG8gb3V0MTsKKwkJZ290byBvdXQ7CiAKIAlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcigmcmFwbF9wbXVzLT5wbXUsICJwb3dlciIsIC0xKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0MTsKIAogCXJhcGxfYWR2ZXJ0aXNlKCk7CiAJcmV0dXJuIDA7CiAKLW91dDI6Ci0JY3B1aHBfcmVtb3ZlX3N0YXRlKENQVUhQX0FQX1BFUkZfWDg2X1JBUExfT05MSU5FKTsKIG91dDE6Ci0JY3B1aHBfcmVtb3ZlX3N0YXRlKENQVUhQX1BFUkZfWDg2X1JBUExfUFJFUCk7CisJY3B1aHBfcmVtb3ZlX3N0YXRlKENQVUhQX0FQX1BFUkZfWDg2X1JBUExfT05MSU5FKTsKIG91dDoKIAlwcl93YXJuKCJJbml0aWFsaXphdGlvbiBmYWlsZWQgKCVkKSwgZGlzYWJsZWRcbiIsIHJldCk7CiAJY2xlYW51cF9yYXBsX3BtdXMoKTsKQEAgLTgzNSw3ICs4MjksNiBAQAogc3RhdGljIHZvaWQgX19leGl0IGludGVsX3JhcGxfZXhpdCh2b2lkKQogewogCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfWDg2X1JBUExfT05MSU5FKTsKLQljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9QRVJGX1g4Nl9SQVBMX1BSRVApOwogCXBlcmZfcG11X3VucmVnaXN0ZXIoJnJhcGxfcG11cy0+cG11KTsKIAljbGVhbnVwX3JhcGxfcG11cygpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jCmluZGV4IDE5ZDY0NmEuLmFlYzZjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMKQEAgLTczMyw2ICs3MzMsNyBAQAogCQkJLnN0YXJ0CQk9IHVuY29yZV9wbXVfZXZlbnRfc3RhcnQsCiAJCQkuc3RvcAkJPSB1bmNvcmVfcG11X2V2ZW50X3N0b3AsCiAJCQkucmVhZAkJPSB1bmNvcmVfcG11X2V2ZW50X3JlYWQsCisJCQkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAogCQl9OwogCX0gZWxzZSB7CiAJCXBtdS0+cG11ID0gKnBtdS0+dHlwZS0+cG11OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCBjMTUyZGIyLi43YmNkMTM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMjA0LDYgKzIwNCw3IEBACiAKICNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKHByX3JlZywgcmVncykJCQlcCiBkbyB7CQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBiYXNlOwkJCQkJXAogCXVuc2lnbmVkIHY7CQkJCQkJXAogCShwcl9yZWcpWzBdID0gKHJlZ3MpLT5yMTU7CQkJCVwKIAkocHJfcmVnKVsxXSA9IChyZWdzKS0+cjE0OwkJCQlcCkBAIC0yMjYsOCArMjI3LDggQEAKIAkocHJfcmVnKVsxOF0gPSAocmVncyktPmZsYWdzOwkJCQlcCiAJKHByX3JlZylbMTldID0gKHJlZ3MpLT5zcDsJCQkJXAogCShwcl9yZWcpWzIwXSA9IChyZWdzKS0+c3M7CQkJCVwKLQkocHJfcmVnKVsyMV0gPSBjdXJyZW50LT50aHJlYWQuZnNiYXNlOwkJCVwKLQkocHJfcmVnKVsyMl0gPSBjdXJyZW50LT50aHJlYWQuZ3NiYXNlOwkJCVwKKwlyZG1zcmwoTVNSX0ZTX0JBU0UsIGJhc2UpOyAocHJfcmVnKVsyMV0gPSBiYXNlOwkJXAorCXJkbXNybChNU1JfS0VSTkVMX0dTX0JBU0UsIGJhc2UpOyAocHJfcmVnKVsyMl0gPSBiYXNlOwlcCiAJYXNtKCJtb3ZsICUlZHMsJTAiIDogIj1yIiAodikpOyAocHJfcmVnKVsyM10gPSB2OwlcCiAJYXNtKCJtb3ZsICUlZXMsJTAiIDogIj1yIiAodikpOyAocHJfcmVnKVsyNF0gPSB2OwlcCiAJYXNtKCJtb3ZsICUlZnMsJTAiIDogIj1yIiAodikpOyAocHJfcmVnKVsyNV0gPSB2OwlcCkBAIC0yNDcsMTEgKzI0OCwxMSBAQAogCiAvKgogICogVGhpcyBpcyB0aGUgYmFzZSBsb2NhdGlvbiBmb3IgUElFIChFVF9EWU4gd2l0aCBJTlRFUlApIGxvYWRzLiBPbgotICogNjQtYml0LCB0aGlzIGlzIHJhaXNlZCB0byA0R0IgdG8gbGVhdmUgdGhlIGVudGlyZSAzMi1iaXQgYWRkcmVzcworICogNjQtYml0LCB0aGlzIGlzIGFib3ZlIDRHQiB0byBsZWF2ZSB0aGUgZW50aXJlIDMyLWJpdCBhZGRyZXNzCiAgKiBzcGFjZSBvcGVuIGZvciB0aGluZ3MgdGhhdCB3YW50IHRvIHVzZSB0aGUgYXJlYSBmb3IgMzItYml0IHBvaW50ZXJzLgogICovCiAjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkJKG1tYXBfaXNfaWEzMigpID8gMHgwMDA0MDAwMDBVTCA6IFwKLQkJCQkJCSAgMHgxMDAwMDAwMDBVTCkKKwkJCQkJCSAgKFRBU0tfU0laRSAvIDMgKiAyKSkKIAogLyogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdAogICAgaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgQ1BVIHN1cHBvcnRzLiAgVGhpcyBjb3VsZCBiZSBkb25lIGluIHVzZXIgc3BhY2UsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW8uaAppbmRleCBkMzRiZDM3Li42YzUwMjAxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvLmgKQEAgLTMwNCwxMyArMzA0LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgb3V0cyMjYndsKGludCBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KSBcCiB7CQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZSgicmVwOyBvdXRzIiAjYndsCQkJCQlcCi0JCSAgICAgOiAiK1MiKGFkZHIpLCAiK2MiKGNvdW50KSA6ICJkIihwb3J0KSk7CQlcCisJCSAgICAgOiAiK1MiKGFkZHIpLCAiK2MiKGNvdW50KSA6ICJkIihwb3J0KSA6ICJtZW1vcnkiKTsJXAogfQkJCQkJCQkJCVwKIAkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnMjI2J3bChpbnQgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkJXAogewkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoInJlcDsgaW5zIiAjYndsCQkJCQlcCi0JCSAgICAgOiAiK0QiKGFkZHIpLCAiK2MiKGNvdW50KSA6ICJkIihwb3J0KSk7CQlcCisJCSAgICAgOiAiK0QiKGFkZHIpLCAiK2MiKGNvdW50KSA6ICJkIihwb3J0KSA6ICJtZW1vcnkiKTsJXAogfQogCiBCVUlMRElPKGIsIGIsIGNoYXIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCA4ZTBhOWZlLi5mOWRkMjI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTExNiw5ICsxMTYsNyBAQAogCQltbS0+Y29udGV4dC5leGVjdXRlX29ubHlfcGtleSA9IC0xOwogCX0KIAkjZW5kaWYKLQlpbml0X25ld19jb250ZXh0X2xkdCh0c2ssIG1tKTsKLQotCXJldHVybiAwOworCXJldHVybiBpbml0X25ld19jb250ZXh0X2xkdCh0c2ssIG1tKTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKaW5kZXggM2RmY2E3Yi4uYTViNDdjMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYwpAQCAtOTU1LDYgKzk1NSw5IEBACiAJY29uc3QgY2hhciAqbmFtZSA9IGdldF9uYW1lKGJhbmssIE5VTEwpOwogCWludCBlcnIgPSAwOwogCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKGlzX3NoYXJlZF9iYW5rKGJhbmspKSB7CiAJCW5iID0gbm9kZV90b19hbWRfbmIoYW1kX2dldF9uYl9pZChjcHUpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bS5jIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCmluZGV4IDljZjY5N2MuLjU1ZmZkOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKQEAgLTE1Miw2ICsxNTIsOCBAQAogCQlpZiAoaGxpc3RfdW5oYXNoZWQoJm4ubGluaykpCiAJCQlicmVhazsKIAorCQlyY3VfaXJxX2V4aXQoKTsKKwogCQlpZiAoIW4uaGFsdGVkKSB7CiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCQlzY2hlZHVsZSgpOwpAQCAtMTYwLDExICsxNjIsMTEgQEAKIAkJCS8qCiAJCQkgKiBXZSBjYW5ub3QgcmVzY2hlZHVsZS4gU28gaGFsdC4KIAkJCSAqLwotCQkJcmN1X2lycV9leGl0KCk7CiAJCQluYXRpdmVfc2FmZV9oYWx0KCk7CiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQkJcmN1X2lycV9lbnRlcigpOwogCQl9CisKKwkJcmN1X2lycV9lbnRlcigpOwogCX0KIAlpZiAoIW4uaGFsdGVkKQogCQlmaW5pc2hfc3dhaXQoJm4ud3EsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGIzNzYwYjMuLjA4ODdkMmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMTM2LDYgKzEzNiwxMjMgQEAKIAl9CiB9CiAKK2VudW0gd2hpY2hfc2VsZWN0b3IgeworCUZTLAorCUdTCit9OworCisvKgorICogU2F2ZXMgdGhlIEZTIG9yIEdTIGJhc2UgZm9yIGFuIG91dGdvaW5nIHRocmVhZCBpZiBGU0dTQkFTRSBleHRlbnNpb25zIGFyZQorICogbm90IGF2YWlsYWJsZS4gIFRoZSBnb2FsIGlzIHRvIGJlIHJlYXNvbmFibHkgZmFzdCBvbiBub24tRlNHU0JBU0Ugc3lzdGVtcy4KKyAqIEl0J3MgZm9yY2libHkgaW5saW5lZCBiZWNhdXNlIGl0J2xsIGdlbmVyYXRlIGJldHRlciBjb2RlIGFuZCB0aGlzIGZ1bmN0aW9uCisgKiBpcyBob3QuCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzYXZlX2Jhc2VfbGVnYWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLAorCQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yLAorCQkJCQkgICAgIGVudW0gd2hpY2hfc2VsZWN0b3Igd2hpY2gpCit7CisJaWYgKGxpa2VseShzZWxlY3RvciA9PSAwKSkgeworCQkvKgorCQkgKiBPbiBJbnRlbCAod2l0aG91dCBYODZfQlVHX05VTExfU0VHKSwgdGhlIHNlZ21lbnQgYmFzZSBjb3VsZAorCQkgKiBiZSB0aGUgcHJlLWV4aXN0aW5nIHNhdmVkIGJhc2Ugb3IgaXQgY291bGQgYmUgemVyby4gIE9uIEFNRAorCQkgKiAod2l0aCBYODZfQlVHX05VTExfU0VHKSwgdGhlIHNlZ21lbnQgYmFzZSBjb3VsZCBiZSBhbG1vc3QKKwkJICogYW55dGhpbmcuCisJCSAqCisJCSAqIFRoaXMgYnJhbmNoIGlzIHZlcnkgaG90IChpdCdzIGhpdCB0d2ljZSBvbiBhbG1vc3QgZXZlcnkKKwkJICogY29udGV4dCBzd2l0Y2ggYmV0d2VlbiA2NC1iaXQgcHJvZ3JhbXMpLCBhbmQgYXZvaWRpbmcKKwkJICogdGhlIFJETVNSIGhlbHBzIGEgbG90LCBzbyB3ZSBqdXN0IGFzc3VtZSB0aGF0IHdoYXRldmVyCisJCSAqIHZhbHVlIGlzIGFscmVhZHkgc2F2ZWQgaXMgY29ycmVjdC4gIFRoaXMgbWF0Y2hlcyBoaXN0b3JpY2FsCisJCSAqIExpbnV4IGJlaGF2aW9yLCBzbyBpdCB3b24ndCBicmVhayBleGlzdGluZyBhcHBsaWNhdGlvbnMuCisJCSAqCisJCSAqIFRvIGF2b2lkIGxlYWtpbmcgc3RhdGUsIG9uIG5vbi1YODZfQlVHX05VTExfU0VHIENQVXMsIGlmIHdlCisJCSAqIHJlcG9ydCB0aGF0IHRoZSBiYXNlIGlzIHplcm8sIGl0IG5lZWRzIHRvIGFjdHVhbGx5IGJlIHplcm86CisJCSAqIHNlZSB0aGUgY29ycmVzcG9uZGluZyBsb2dpYyBpbiBsb2FkX3NlZ19sZWdhY3kuCisJCSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHRoZSBzZWxlY3RvciBpcyAxLCAyLCBvciAzLCB0aGVuIHRoZSBiYXNlIGlzIHplcm8gb24KKwkJICogIVg4Nl9CVUdfTlVMTF9TRUcgQ1BVcyBhbmQgY291bGQgYmUgYW55dGhpbmcgb24KKwkJICogWDg2X0JVR19OVUxMX1NFRyBDUFVzLiAgSW4gdGhlIGxhdHRlciBjYXNlLCBMaW51eAorCQkgKiBoYXMgbmV2ZXIgYXR0ZW1wdGVkIHRvIHByZXNlcnZlIHRoZSBiYXNlIGFjcm9zcyBjb250ZXh0CisJCSAqIHN3aXRjaGVzLgorCQkgKgorCQkgKiBJZiBzZWxlY3RvciA+IDMsIHRoZW4gaXQgcmVmZXJzIHRvIGEgcmVhbCBzZWdtZW50LCBhbmQKKwkJICogc2F2aW5nIHRoZSBiYXNlIGlzbid0IG5lY2Vzc2FyeS4KKwkJICovCisJCWlmICh3aGljaCA9PSBGUykKKwkJCXByZXZfcC0+dGhyZWFkLmZzYmFzZSA9IDA7CisJCWVsc2UKKwkJCXByZXZfcC0+dGhyZWFkLmdzYmFzZSA9IDA7CisJfQorfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2F2ZV9mc2dzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzYXZlc2VnbWVudChmcywgdGFzay0+dGhyZWFkLmZzaW5kZXgpOworCXNhdmVzZWdtZW50KGdzLCB0YXNrLT50aHJlYWQuZ3NpbmRleCk7CisJc2F2ZV9iYXNlX2xlZ2FjeSh0YXNrLCB0YXNrLT50aHJlYWQuZnNpbmRleCwgRlMpOworCXNhdmVfYmFzZV9sZWdhY3kodGFzaywgdGFzay0+dGhyZWFkLmdzaW5kZXgsIEdTKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGxvYWRzZWcoZW51bSB3aGljaF9zZWxlY3RvciB3aGljaCwKKwkJCQkgICAgdW5zaWduZWQgc2hvcnQgc2VsKQoreworCWlmICh3aGljaCA9PSBGUykKKwkJbG9hZHNlZ21lbnQoZnMsIHNlbCk7CisJZWxzZQorCQlsb2FkX2dzX2luZGV4KHNlbCk7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBsb2FkX3NlZ19sZWdhY3kodW5zaWduZWQgc2hvcnQgcHJldl9pbmRleCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgcHJldl9iYXNlLAorCQkJCQkgICAgdW5zaWduZWQgc2hvcnQgbmV4dF9pbmRleCwKKwkJCQkJICAgIHVuc2lnbmVkIGxvbmcgbmV4dF9iYXNlLAorCQkJCQkgICAgZW51bSB3aGljaF9zZWxlY3RvciB3aGljaCkKK3sKKwlpZiAobGlrZWx5KG5leHRfaW5kZXggPD0gMykpIHsKKwkJLyoKKwkJICogVGhlIG5leHQgdGFzayBpcyB1c2luZyA2NC1iaXQgVExTLCBpcyBub3QgdXNpbmcgdGhpcworCQkgKiBzZWdtZW50IGF0IGFsbCwgb3IgaXMgaGF2aW5nIGZ1biB3aXRoIGFyY2FuZSBDUFUgZmVhdHVyZXMuCisJCSAqLworCQlpZiAobmV4dF9iYXNlID09IDApIHsKKwkJCS8qCisJCQkgKiBOYXN0eSBjYXNlOiBvbiBBTUQgQ1BVcywgd2UgbmVlZCB0byBmb3JjaWJseSB6ZXJvCisJCQkgKiB0aGUgYmFzZS4KKwkJCSAqLworCQkJaWYgKHN0YXRpY19jcHVfaGFzX2J1ZyhYODZfQlVHX05VTExfU0VHKSkgeworCQkJCWxvYWRzZWcod2hpY2gsIF9fVVNFUl9EUyk7CisJCQkJbG9hZHNlZyh3aGljaCwgbmV4dF9pbmRleCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgY291bGQgdHJ5IHRvIGV4aGF1c3RpdmVseSBkZXRlY3QgY2FzZXMKKwkJCQkgKiB1bmRlciB3aGljaCB3ZSBjYW4gc2tpcCB0aGUgc2VnbWVudCBsb2FkLAorCQkJCSAqIGJ1dCB0aGVyZSdzIHJlYWxseSBvbmx5IG9uZSBjYXNlIHRoYXQgbWF0dGVycworCQkJCSAqIGZvciBwZXJmb3JtYW5jZTogaWYgYm90aCB0aGUgcHJldmlvdXMgYW5kCisJCQkJICogbmV4dCBzdGF0ZXMgYXJlIGZ1bGx5IHplcm9lZCwgd2UgY2FuIHNraXAKKwkJCQkgKiB0aGUgbG9hZC4KKwkJCQkgKgorCQkJCSAqIChUaGlzIGFzc3VtZXMgdGhhdCBwcmV2X2Jhc2UgPT0gMCBoYXMgbm8KKwkJCQkgKiBmYWxzZSBwb3NpdGl2ZXMuICBUaGlzIGlzIHRoZSBjYXNlIG9uCisJCQkJICogSW50ZWwtc3R5bGUgQ1BVcy4pCisJCQkJICovCisJCQkJaWYgKGxpa2VseShwcmV2X2luZGV4IHwgbmV4dF9pbmRleCB8IHByZXZfYmFzZSkpCisJCQkJCWxvYWRzZWcod2hpY2gsIG5leHRfaW5kZXgpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHByZXZfaW5kZXggIT0gbmV4dF9pbmRleCkKKwkJCQlsb2Fkc2VnKHdoaWNoLCBuZXh0X2luZGV4KTsKKwkJCXdybXNybCh3aGljaCA9PSBGUyA/IE1TUl9GU19CQVNFIDogTVNSX0tFUk5FTF9HU19CQVNFLAorCQkJICAgICAgIG5leHRfYmFzZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgbmV4dCB0YXNrIGlzIHVzaW5nIGEgcmVhbCBzZWdtZW50LiAgTG9hZGluZyB0aGUgc2VsZWN0b3IKKwkJICogaXMgc3VmZmljaWVudC4KKwkJICovCisJCWxvYWRzZWcod2hpY2gsIG5leHRfaW5kZXgpOworCX0KK30KKwogaW50IGNvcHlfdGhyZWFkX3Rscyh1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwLAogCQl1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIHRscykKIHsKQEAgLTIxNiwxMCArMzMzLDE5IEBACiAJCSAgICB1bnNpZ25lZCBsb25nIG5ld19zcCwKIAkJICAgIHVuc2lnbmVkIGludCBfY3MsIHVuc2lnbmVkIGludCBfc3MsIHVuc2lnbmVkIGludCBfZHMpCiB7CisJV0FSTl9PTl9PTkNFKHJlZ3MgIT0gY3VycmVudF9wdF9yZWdzKCkpOworCisJaWYgKHN0YXRpY19jcHVfaGFzKFg4Nl9CVUdfTlVMTF9TRUcpKSB7CisJCS8qIExvYWRpbmcgemVybyBiZWxvdyB3b24ndCBjbGVhciB0aGUgYmFzZS4gKi8KKwkJbG9hZHNlZ21lbnQoZnMsIF9fVVNFUl9EUyk7CisJCWxvYWRfZ3NfaW5kZXgoX19VU0VSX0RTKTsKKwl9CisKIAlsb2Fkc2VnbWVudChmcywgMCk7CiAJbG9hZHNlZ21lbnQoZXMsIF9kcyk7CiAJbG9hZHNlZ21lbnQoZHMsIF9kcyk7CiAJbG9hZF9nc19pbmRleCgwKTsKKwogCXJlZ3MtPmlwCQk9IG5ld19pcDsKIAlyZWdzLT5zcAkJPSBuZXdfc3A7CiAJcmVncy0+Y3MJCT0gX2NzOwpAQCAtMjY0LDcgKzM5MCw2IEBACiAJc3RydWN0IGZwdSAqbmV4dF9mcHUgPSAmbmV4dC0+ZnB1OwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHRzc19zdHJ1Y3QgKnRzcyA9ICZwZXJfY3B1KGNwdV90c3MsIGNwdSk7Ci0JdW5zaWduZWQgcHJldl9mc2luZGV4LCBwcmV2X2dzaW5kZXg7CiAJZnB1X3N3aXRjaF90IGZwdV9zd2l0Y2g7CiAKIAlmcHVfc3dpdGNoID0gc3dpdGNoX2ZwdV9wcmVwYXJlKHByZXZfZnB1LCBuZXh0X2ZwdSwgY3B1KTsKQEAgLTI3NCw4ICszOTksNyBAQAogCSAqCiAJICogKGUuZy4geGVuX2xvYWRfdGxzKCkpCiAJICovCi0Jc2F2ZXNlZ21lbnQoZnMsIHByZXZfZnNpbmRleCk7Ci0Jc2F2ZXNlZ21lbnQoZ3MsIHByZXZfZ3NpbmRleCk7CisJc2F2ZV9mc2dzKHByZXZfcCk7CiAKIAkvKgogCSAqIExvYWQgVExTIGJlZm9yZSByZXN0b3JpbmcgYW55IHNlZ21lbnRzIHNvIHRoYXQgc2VnbWVudCBsb2FkcwpAQCAtMzE0LDEwOCArNDM4LDEwIEBACiAJaWYgKHVubGlrZWx5KG5leHQtPmRzIHwgcHJldi0+ZHMpKQogCQlsb2Fkc2VnbWVudChkcywgbmV4dC0+ZHMpOwogCi0JLyoKLQkgKiBTd2l0Y2ggRlMgYW5kIEdTLgotCSAqCi0JICogVGhlc2UgYXJlIGV2ZW4gbW9yZSBjb21wbGljYXRlZCB0aGFuIERTIGFuZCBFUzogdGhleSBoYXZlCi0JICogNjQtYml0IGJhc2VzIGFyZSB0aGF0IGNvbnRyb2xsZWQgYnkgYXJjaF9wcmN0bC4gIFRoZSBiYXNlcwotCSAqIGRvbid0IG5lY2Vzc2FyaWx5IG1hdGNoIHRoZSBzZWxlY3RvcnMsIGFzIHVzZXIgY29kZSBjYW4gZG8KLQkgKiBhbnkgbnVtYmVyIG9mIHRoaW5ncyB0byBjYXVzZSB0aGVtIHRvIGJlIGluY29uc2lzdGVudC4KLQkgKgotCSAqIFdlIGRvbid0IHByb21pc2UgdG8gcHJlc2VydmUgdGhlIGJhc2VzIGlmIHRoZSBzZWxlY3RvcnMgYXJlCi0JICogbm9uemVyby4gIFdlIGFsc28gZG9uJ3QgcHJvbWlzZSB0byBwcmVzZXJ2ZSB0aGUgYmFzZSBpZiB0aGUKLQkgKiBzZWxlY3RvciBpcyB6ZXJvIGFuZCB0aGUgYmFzZSBkb2Vzbid0IG1hdGNoIHdoYXRldmVyIHdhcwotCSAqIG1vc3QgcmVjZW50bHkgcGFzc2VkIHRvIEFSQ0hfU0VUX0ZTL0dTLiAgKElmL3doZW4gdGhlCi0JICogRlNHU0JBU0UgaW5zdHJ1Y3Rpb25zIGFyZSBlbmFibGVkLCB3ZSdsbCBuZWVkIHRvIG9mZmVyCi0JICogc3Ryb25nZXIgZ3VhcmFudGVlcy4pCi0JICoKLQkgKiBBcyBhbiBpbnZhcmlhbnQsCi0JICogKGZzYmFzZSAhPSAwICYmIGZzaW5kZXggIT0gMCkgfHwgKGdzYmFzZSAhPSAwICYmIGdzaW5kZXggIT0gMCkgaXMKLQkgKiBpbXBvc3NpYmxlLgotCSAqLwotCWlmIChuZXh0LT5mc2luZGV4KSB7Ci0JCS8qIExvYWRpbmcgYSBub256ZXJvIHZhbHVlIGludG8gRlMgc2V0cyB0aGUgaW5kZXggYW5kIGJhc2UuICovCi0JCWxvYWRzZWdtZW50KGZzLCBuZXh0LT5mc2luZGV4KTsKLQl9IGVsc2UgewotCQlpZiAobmV4dC0+ZnNiYXNlKSB7Ci0JCQkvKiBOZXh0IGluZGV4IGlzIHplcm8gYnV0IG5leHQgYmFzZSBpcyBub256ZXJvLiAqLwotCQkJaWYgKHByZXZfZnNpbmRleCkKLQkJCQlsb2Fkc2VnbWVudChmcywgMCk7Ci0JCQl3cm1zcmwoTVNSX0ZTX0JBU0UsIG5leHQtPmZzYmFzZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOZXh0IGJhc2UgYW5kIGluZGV4IGFyZSBib3RoIHplcm8uICovCi0JCQlpZiAoc3RhdGljX2NwdV9oYXNfYnVnKFg4Nl9CVUdfTlVMTF9TRUcpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXZSBkb24ndCBrbm93IHRoZSBwcmV2aW91cyBiYXNlIGFuZCBjYW4ndAotCQkJCSAqIGZpbmQgb3V0IHdpdGhvdXQgUkRNU1IuICBGb3JjaWJseSBjbGVhciBpdC4KLQkJCQkgKi8KLQkJCQlsb2Fkc2VnbWVudChmcywgX19VU0VSX0RTKTsKLQkJCQlsb2Fkc2VnbWVudChmcywgMCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogSWYgdGhlIHByZXZpb3VzIGluZGV4IGlzIHplcm8gYW5kIEFSQ0hfU0VUX0ZTCi0JCQkJICogZGlkbid0IGNoYW5nZSB0aGUgYmFzZSwgdGhlbiB0aGUgYmFzZSBpcwotCQkJCSAqIGFsc28gemVybyBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KLQkJCQkgKi8KLQkJCQlpZiAocHJldi0+ZnNiYXNlIHx8IHByZXZfZnNpbmRleCkKLQkJCQkJbG9hZHNlZ21lbnQoZnMsIDApOwotCQkJfQotCQl9Ci0JfQotCS8qCi0JICogU2F2ZSB0aGUgb2xkIHN0YXRlIGFuZCBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50LgotCSAqIE5COiBpZiBwcmV2X2ZzaW5kZXggPT0gMCwgdGhlbiB3ZSBjYW4ndCByZWxpYWJseSBsZWFybiB0aGUgYmFzZQotCSAqIHdpdGhvdXQgUkRNU1IgYmVjYXVzZSBJbnRlbCB1c2VyIGNvZGUgY2FuIHplcm8gaXQgd2l0aG91dCB0ZWxsaW5nCi0JICogdXMgYW5kIEFNRCB1c2VyIGNvZGUgY2FuIHByb2dyYW0gYW55IDMyLWJpdCB2YWx1ZSB3aXRob3V0IHRlbGxpbmcKLQkgKiB1cy4KLQkgKi8KLQlpZiAocHJldl9mc2luZGV4KQotCQlwcmV2LT5mc2Jhc2UgPSAwOwotCXByZXYtPmZzaW5kZXggPSBwcmV2X2ZzaW5kZXg7Ci0KLQlpZiAobmV4dC0+Z3NpbmRleCkgewotCQkvKiBMb2FkaW5nIGEgbm9uemVybyB2YWx1ZSBpbnRvIEdTIHNldHMgdGhlIGluZGV4IGFuZCBiYXNlLiAqLwotCQlsb2FkX2dzX2luZGV4KG5leHQtPmdzaW5kZXgpOwotCX0gZWxzZSB7Ci0JCWlmIChuZXh0LT5nc2Jhc2UpIHsKLQkJCS8qIE5leHQgaW5kZXggaXMgemVybyBidXQgbmV4dCBiYXNlIGlzIG5vbnplcm8uICovCi0JCQlpZiAocHJldl9nc2luZGV4KQotCQkJCWxvYWRfZ3NfaW5kZXgoMCk7Ci0JCQl3cm1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBuZXh0LT5nc2Jhc2UpOwotCQl9IGVsc2UgewotCQkJLyogTmV4dCBiYXNlIGFuZCBpbmRleCBhcmUgYm90aCB6ZXJvLiAqLwotCQkJaWYgKHN0YXRpY19jcHVfaGFzX2J1ZyhYODZfQlVHX05VTExfU0VHKSkgewotCQkJCS8qCi0JCQkJICogV2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgYmFzZSBhbmQgY2FuJ3QKLQkJCQkgKiBmaW5kIG91dCB3aXRob3V0IFJETVNSLiAgRm9yY2libHkgY2xlYXIgaXQuCi0JCQkJICoKLQkJCQkgKiBUaGlzIGNvbnRhaW5zIGEgcG9pbnRsZXNzIFNXQVBHUyBwYWlyLgotCQkJCSAqIEZpeGluZyBpdCB3b3VsZCBpbnZvbHZlIGFuIGV4cGxpY2l0IGNoZWNrCi0JCQkJICogZm9yIFhlbiBvciBhIG5ldyBwdm9wLgotCQkJCSAqLwotCQkJCWxvYWRfZ3NfaW5kZXgoX19VU0VSX0RTKTsKLQkJCQlsb2FkX2dzX2luZGV4KDApOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIElmIHRoZSBwcmV2aW91cyBpbmRleCBpcyB6ZXJvIGFuZCBBUkNIX1NFVF9HUwotCQkJCSAqIGRpZG4ndCBjaGFuZ2UgdGhlIGJhc2UsIHRoZW4gdGhlIGJhc2UgaXMKLQkJCQkgKiBhbHNvIHplcm8gYW5kIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCQkJICovCi0JCQkJaWYgKHByZXYtPmdzYmFzZSB8fCBwcmV2X2dzaW5kZXgpCi0JCQkJCWxvYWRfZ3NfaW5kZXgoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBTYXZlIHRoZSBvbGQgc3RhdGUgYW5kIHByZXNlcnZlIHRoZSBpbnZhcmlhbnQuCi0JICogTkI6IGlmIHByZXZfZ3NpbmRleCA9PSAwLCB0aGVuIHdlIGNhbid0IHJlbGlhYmx5IGxlYXJuIHRoZSBiYXNlCi0JICogd2l0aG91dCBSRE1TUiBiZWNhdXNlIEludGVsIHVzZXIgY29kZSBjYW4gemVybyBpdCB3aXRob3V0IHRlbGxpbmcKLQkgKiB1cyBhbmQgQU1EIHVzZXIgY29kZSBjYW4gcHJvZ3JhbSBhbnkgMzItYml0IHZhbHVlIHdpdGhvdXQgdGVsbGluZwotCSAqIHVzLgotCSAqLwotCWlmIChwcmV2X2dzaW5kZXgpCi0JCXByZXYtPmdzYmFzZSA9IDA7Ci0JcHJldi0+Z3NpbmRleCA9IHByZXZfZ3NpbmRleDsKKwlsb2FkX3NlZ19sZWdhY3kocHJldi0+ZnNpbmRleCwgcHJldi0+ZnNiYXNlLAorCQkJbmV4dC0+ZnNpbmRleCwgbmV4dC0+ZnNiYXNlLCBGUyk7CisJbG9hZF9zZWdfbGVnYWN5KHByZXYtPmdzaW5kZXgsIHByZXYtPmdzYmFzZSwKKwkJCW5leHQtPmdzaW5kZXgsIG5leHQtPmdzYmFzZSwgR1MpOwogCiAJc3dpdGNoX2ZwdV9maW5pc2gobmV4dF9mcHUsIGZwdV9zd2l0Y2gpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vY3B1aWQuYyBiL2FyY2gveDg2L2t2bS9jcHVpZC5jCmluZGV4IDY0OWQ4ZjIuLjkxYWY3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9jcHVpZC5jCisrKyBiL2FyY2gveDg2L2t2bS9jcHVpZC5jCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJCWVudHJ5LT5lY3ggJj0ga3ZtX2NwdWlkXzdfMF9lY3hfeDg2X2ZlYXR1cmVzOwogCQkJY3B1aWRfbWFzaygmZW50cnktPmVjeCwgQ1BVSURfN19FQ1gpOwogCQkJLyogUEtVIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZm9yIHNoYWRvdyBwYWdpbmcuICovCi0JCQlpZiAoIXRkcF9lbmFibGVkKQorCQkJaWYgKCF0ZHBfZW5hYmxlZCB8fCAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX09TUEtFKSkKIAkJCQllbnRyeS0+ZWN4ICY9IH5GKFBLVSk7CiAJCX0gZWxzZSB7CiAJCQllbnRyeS0+ZWJ4ID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZQppbmRleCBkZDZjZmE0Li43NTAyOWQwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL01ha2VmaWxlCkBAIC0xNSw3ICsxNSw3IEBACiBvYmotJChzdWJzdCBtLHksJChDT05GSUdfR1BJT19JTlRFTF9QTUlDKSkgKz0gcGxhdGZvcm1fcG1pY19ncGlvLm8KIG9iai0kKHN1YnN0IG0seSwkKENPTkZJR19JTlRFTF9NRkxEX1RIRVJNQUwpKSArPSBwbGF0Zm9ybV9tc2ljX3RoZXJtYWwubwogIyBTUEkgRGV2aWNlcwotb2JqLSQoc3Vic3QgbSx5LCQoQ09ORklHX1NQSV9TUElERVYpKSArPSBwbGF0Zm9ybV9zcGlkZXYubworb2JqLSQoc3Vic3QgbSx5LCQoQ09ORklHX1NQSV9TUElERVYpKSArPSBwbGF0Zm9ybV9tcmZsZF9zcGlkZXYubwogIyBJMkMgRGV2aWNlcwogb2JqLSQoc3Vic3QgbSx5LCQoQ09ORklHX1NFTlNPUlNfRU1DMTQwMykpICs9IHBsYXRmb3JtX2VtYzE0MDMubwogb2JqLSQoc3Vic3QgbSx5LCQoQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEKSkgKz0gcGxhdGZvcm1fbGlzMzMxLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9zcGlkZXYuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zcGlkZXYuYwpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBhcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvcGxhdGZvcm1fc3BpZGV2LmMKcmVuYW1lIHRvIGFyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zcGlkZXYuYwppbmRleCAzMGM2MDFiLi4yNzE4NmFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvcGxhdGZvcm1fc3BpZGV2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX21yZmxkX3NwaWRldi5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBvZiB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9weGEyeHhfc3BpLmg+CkBAIC0zNCw2ICszNSw5IEBACiB7CiAJc3RydWN0IHNwaV9ib2FyZF9pbmZvICpzcGlfaW5mbyA9IGluZm87CiAKKwlpZiAoaW50ZWxfbWlkX2lkZW50aWZ5X2NwdSgpICE9IElOVEVMX01JRF9DUFVfQ0hJUF9UQU5HSUVSKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwogCXNwaV9pbmZvLT5tb2RlID0gU1BJX01PREVfMDsKIAlzcGlfaW5mby0+Y29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9zcGlfY2hpcDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3h0ZW5zYV9rc3ltcy5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3h0ZW5zYV9rc3ltcy5jCmluZGV4IDRkMjg3MmYuLmE3MWQyNzMgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC94dGVuc2Ffa3N5bXMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwveHRlbnNhX2tzeW1zLmMKQEAgLTk0LDEzICs5NCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChfX3N5bmNfZmV0Y2hfYW5kX29yXzQpOwogCi0jaWZkZWYgQ09ORklHX05FVAogLyoKICAqIE5ldHdvcmtpbmcgc3VwcG9ydAogICovCiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7CiBFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMpOwotI2VuZGlmIC8qIENPTkZJR19ORVQgKi8KIAogLyoKICAqIEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBzeW1ib2xzCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jIGIvYXJjaC94dGVuc2EvbW0vY2FjaGUuYwppbmRleCAxYTgwNGEyLi4zYzc1YzRlIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9tbS9jYWNoZS5jCisrKyBiL2FyY2gveHRlbnNhL21tL2NhY2hlLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCWNsZWFyX3BhZ2VfYWxpYXMoa3ZhZGRyLCBwYWRkcik7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KK0VYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9oaWdocGFnZSk7CiAKIHZvaWQgY29weV91c2VyX2hpZ2hwYWdlKHN0cnVjdCBwYWdlICpkc3QsIHN0cnVjdCBwYWdlICpzcmMsCiAJCQl1bnNpZ25lZCBsb25nIHZhZGRyLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKQEAgLTExOSwxMCArMTIwLDcgQEAKIAljb3B5X3BhZ2VfYWxpYXMoZHN0X3ZhZGRyLCBzcmNfdmFkZHIsIGRzdF9wYWRkciwgc3JjX3BhZGRyKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQotCi0jZW5kaWYgLyogRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFICovCi0KLSNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCitFWFBPUlRfU1lNQk9MKGNvcHlfdXNlcl9oaWdocGFnZSk7CiAKIC8qCiAgKiBBbnkgdGltZSB0aGUga2VybmVsIHdyaXRlcyB0byBhIHVzZXIgcGFnZSBjYWNoZSBwYWdlLCBvciBpdCBpcyBhYm91dCB0bwpAQCAtMTc2LDcgKzE3NCw3IEBACiAKIAkvKiBUaGVyZSBzaG91bGRuJ3QgYmUgYW4gZW50cnkgaW4gdGhlIGNhY2hlIGZvciB0aGlzIHBhZ2UgYW55bW9yZS4gKi8KIH0KLQorRVhQT1JUX1NZTUJPTChmbHVzaF9kY2FjaGVfcGFnZSk7CiAKIC8qCiAgKiBGb3Igbm93LCBmbHVzaCB0aGUgd2hvbGUgY2FjaGUuIEZJWE1FPz8KQEAgLTE4OCw2ICsxODYsNyBAQAogCV9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfYWxsKCk7CiAJX19pbnZhbGlkYXRlX2ljYWNoZV9hbGwoKTsKIH0KK0VYUE9SVF9TWU1CT0wobG9jYWxfZmx1c2hfY2FjaGVfcmFuZ2UpOwogCiAvKiAKICAqIFJlbW92ZSBhbnkgZW50cnkgaW4gdGhlIGNhY2hlIGZvciB0aGlzIHBhZ2UuIApAQCAtMjA3LDggKzIwNiw5IEBACiAJX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9wYWdlX2FsaWFzKHZpcnQsIHBoeXMpOwogCV9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZV9hbGlhcyh2aXJ0LCBwaHlzKTsKIH0KK0VYUE9SVF9TWU1CT0wobG9jYWxfZmx1c2hfY2FjaGVfcGFnZSk7CiAKLSNlbmRpZgorI2VuZGlmIC8qIERDQUNIRV9XQVlfU0laRSA+IFBBR0VfU0laRSAqLwogCiB2b2lkCiB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKQEAgLTIyNSw3ICsyMjUsNyBAQAogCiAJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyKTsKIAotI2lmIChEQ0FDSEVfV0FZX1NJWkUgPiBQQUdFX1NJWkUpICYmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKQogCiAJaWYgKCFQYWdlUmVzZXJ2ZWQocGFnZSkgJiYgdGVzdF9iaXQoUEdfYXJjaF8xLCAmcGFnZS0+ZmxhZ3MpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICogZmx1c2hfZGNhY2hlX3BhZ2UoKSBvbiB0aGUgcGFnZS4KICAqLwogCi0jaWYgKERDQUNIRV9XQVlfU0laRSA+IFBBR0VfU0laRSkgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworI2lmIChEQ0FDSEVfV0FZX1NJWkUgPiBQQUdFX1NJWkUpCiAKIHZvaWQgY29weV90b191c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLAogCQl1bnNpZ25lZCBsb25nIHZhZGRyLCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1wY2kuYyBiL2Jsb2NrL2Jsay1tcS1wY2kuYwppbmRleCA5NjZjMjE2Li5lZTlkM2Q5IDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtcGNpLmMKKysrIGIvYmxvY2svYmxrLW1xLXBjaS5jCkBAIC0zNiwxMiArMzYsMTggQEAKIAlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBzZXQtPm5yX2h3X3F1ZXVlczsgcXVldWUrKykgewogCQltYXNrID0gcGNpX2lycV9nZXRfYWZmaW5pdHkocGRldiwgcXVldWUpOwogCQlpZiAoIW1hc2spCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWdvdG8gZmFsbGJhY2s7CiAKIAkJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykKIAkJCXNldC0+bXFfbWFwW2NwdV0gPSBxdWV1ZTsKIAl9CiAKIAlyZXR1cm4gMDsKKworZmFsbGJhY2s6CisJV0FSTl9PTl9PTkNFKHNldC0+bnJfaHdfcXVldWVzID4gMSk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJc2V0LT5tcV9tYXBbY3B1XSA9IDA7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfbXFfcGNpX21hcF9xdWV1ZXMpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FsZ2lmX3NrY2lwaGVyLmMgYi9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYwppbmRleCAyODU1NmZjLi40NWFmMGZlIDEwMDY0NAotLS0gYS9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYworKysgYi9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYwpAQCAtODYsOCArODYsMTMgQEAKIAl9CiAJc2dsID0gc3JlcS0+dHNnOwogCW4gPSBzZ19uZW50cyhzZ2wpOwotCWZvcl9lYWNoX3NnKHNnbCwgc2csIG4sIGkpCi0JCXB1dF9wYWdlKHNnX3BhZ2Uoc2cpKTsKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuLCBpKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzZyk7CisKKwkJLyogc29tZSBTR3MgbWF5IG5vdCBoYXZlIGEgcGFnZSBtYXBwZWQgKi8KKwkJaWYgKHBhZ2UgJiYgcGFnZV9yZWZfY291bnQocGFnZSkpCisJCQlwdXRfcGFnZShwYWdlKTsKKwl9CiAKIAlrZnJlZShzcmVxLT50c2cpOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2F1dGhlbmNlc24uYyBiL2NyeXB0by9hdXRoZW5jZXNuLmMKaW5kZXggMTIxMDEwYS4uMThjOTRlMSAxMDA2NDQKLS0tIGEvY3J5cHRvL2F1dGhlbmNlc24uYworKysgYi9jcnlwdG8vYXV0aGVuY2Vzbi5jCkBAIC0yNDgsNiArMjQ4LDkgQEAKIAl1OCAqaWhhc2ggPSBvaGFzaCArIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKGF1dGgpOwogCXUzMiB0bXBbMl07CiAKKwlpZiAoIWF1dGhzaXplKQorCQlnb3RvIGRlY3J5cHQ7CisKIAkvKiBNb3ZlIGhpZ2gtb3JkZXIgYml0cyBvZiBzZXF1ZW5jZSBudW1iZXIgYmFjay4gKi8KIAlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkodG1wLCBkc3QsIDQsIDQsIDApOwogCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weSh0bXAgKyAxLCBkc3QsIGFzc29jbGVuICsgY3J5cHRsZW4sIDQsIDApOwpAQCAtMjU2LDYgKzI1OSw4IEBACiAJaWYgKGNyeXB0b19tZW1uZXEoaWhhc2gsIG9oYXNoLCBhdXRoc2l6ZSkpCiAJCXJldHVybiAtRUJBRE1TRzsKIAorZGVjcnlwdDoKKwogCXNnX2luaXRfdGFibGUoYXJlcV9jdHgtPmRzdCwgMik7CiAJZHN0ID0gc2NhdHRlcndhbGtfZmZ3ZChhcmVxX2N0eC0+ZHN0LCBkc3QsIGFzc29jbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDVmOGFiYzMuLmUzN2M5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTU0LDggKzU0LDYgQEAKIAogc291cmNlICJkcml2ZXJzL2kyYy9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc291bmR3aXJlL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3NsaW1idXMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGQwYWJiNWEuLjA0ZTJkNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtODEsNyArODEsNiBAQAogb2JqLSQoQ09ORklHX01URCkJCSs9IG10ZC8KIG9iai0kKENPTkZJR19TUEkpCQkrPSBzcGkvCiBvYmotJChDT05GSUdfU1BNSSkJCSs9IHNwbWkvCi1vYmotJChDT05GSUdfU09VTkRXSVJFKQkJKz0gc291bmR3aXJlLwogb2JqLSQoQ09ORklHX1NMSU1CVVMpCQkrPSBzbGltYnVzLwogb2JqLSQoQ09ORklHX0hTSSkJCSs9IGhzaS8KIG9iai15CQkJCSs9IG5ldC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYwppbmRleCBlNTNiZWY2Li4wMzc1YzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCkBAIC0xMDcyLDYgKzEwNzIsNyBAQAogCQlpZiAobGlzdF9lbXB0eSgmZ2hlc19zY2kpKQogCQkJdW5yZWdpc3Rlcl9hY3BpX2hlZF9ub3RpZmllcigmZ2hlc19ub3RpZmllcl9zY2kpOwogCQltdXRleF91bmxvY2soJmdoZXNfbGlzdF9tdXRleCk7CisJCXN5bmNocm9uaXplX3JjdSgpOwogCQlicmVhazsKIAljYXNlIEFDUElfSEVTVF9OT1RJRllfTk1JOgogCQlnaGVzX25taV9yZW1vdmUoZ2hlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IDc5MTUyZGIuLjUxODc0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0xNzI4LDcgKzE3MjgsNyBAQAogICogZnVuY3Rpb25pbmcgRUNEVCBFQyBmaXJzdCBpbiBvcmRlciB0byBoYW5kbGUgdGhlIGV2ZW50cy4KICAqIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MDIxCiAgKi8KLWludCBfX2luaXQgYWNwaV9lY19lY2R0X3N0YXJ0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2VjX2VjZHRfc3RhcnQodm9pZCkKIHsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAKQEAgLTE5NTksMjAgKzE5NTksMTcgQEAKIGludCBfX2luaXQgYWNwaV9lY19pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKKwlpbnQgZWNkdF9mYWlsLCBkc2R0X2ZhaWw7CiAKIAkvKiByZWdpc3RlciB3b3JrcXVldWUgZm9yIF9ReHggZXZhbHVhdGlvbnMgKi8KIAlyZXN1bHQgPSBhY3BpX2VjX3F1ZXJ5X2luaXQoKTsKIAlpZiAocmVzdWx0KQotCQlnb3RvIGVycl9leGl0OwotCS8qIE5vdyByZWdpc3RlciB0aGUgZHJpdmVyIGZvciB0aGUgRUMgKi8KLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZWNfZHJpdmVyKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycl9leGl0OworCQlyZXR1cm4gcmVzdWx0OwogCi1lcnJfZXhpdDoKLQlpZiAocmVzdWx0KQotCQlhY3BpX2VjX3F1ZXJ5X2V4aXQoKTsKLQlyZXR1cm4gcmVzdWx0OworCS8qIERyaXZlcnMgbXVzdCBiZSBzdGFydGVkIGFmdGVyIGFjcGlfZWNfcXVlcnlfaW5pdCgpICovCisJZWNkdF9mYWlsID0gYWNwaV9lY19lY2R0X3N0YXJ0KCk7CisJZHNkdF9mYWlsID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2VjX2RyaXZlcik7CisJcmV0dXJuIGVjZHRfZmFpbCAmJiBkc2R0X2ZhaWwgPyAtRU5PREVWIDogMDsKIH0KIAogLyogRUMgZHJpdmVyIGN1cnJlbnRseSBub3QgdW5sb2FkYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggNWVhNWRjMi4uNzNjOWM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC05OCw3ICs5OCwxNSBAQAogCWlmIChjaGVja19jaGlsZHJlbiAmJiBsaXN0X2VtcHR5KCZhZGV2LT5jaGlsZHJlbikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHN0YV9wcmVzZW50ID8gRklORF9DSElMRF9NQVhfU0NPUkUgOiBGSU5EX0NISUxEX01JTl9TQ09SRTsKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaGFzIGEgX0hJRCAob3IgX0NJRCkgcmV0dXJuaW5nIGEgdmFsaWQgQUNQSS9QTlAKKwkgKiBkZXZpY2UgSUQsIGl0IGlzIGJldHRlciB0byBtYWtlIGl0IGxvb2sgbGVzcyBhdHRyYWN0aXZlIGhlcmUsIHNvIHRoYXQKKwkgKiB0aGUgb3RoZXIgZGV2aWNlIHdpdGggdGhlIHNhbWUgX0FEUiB2YWx1ZSAodGhhdCBtYXkgbm90IGhhdmUgYSB2YWxpZAorCSAqIGRldmljZSBJRCkgY2FuIGJlIG1hdGNoZWQgZ29pbmcgZm9yd2FyZC4gIFtUaGlzIG1lYW5zIGEgc2Vjb25kIHNwZWMKKwkgKiB2aW9sYXRpb24gaW4gYSByb3csIHNvIHdoYXRldmVyIHdlIGRvIGhlcmUgaXMgYmVzdCBlZmZvcnQgYW55d2F5Ll0KKwkgKi8KKwlyZXR1cm4gc3RhX3ByZXNlbnQgJiYgbGlzdF9lbXB0eSgmYWRldi0+cG5wLmlkcykgPworCQkJRklORF9DSElMRF9NQVhfU0NPUkUgOiBGSU5EX0NISUxEX01JTl9TQ09SRTsKIH0KIAogc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2ZpbmRfY2hpbGRfZGV2aWNlKHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2ludGVybmFsLmggYi9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaAppbmRleCAyMTliOTBiLi4wOGIzY2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaApAQCAtMTg1LDcgKzE4NSw2IEBACiBpbnQgYWNwaV9lY19pbml0KHZvaWQpOwogaW50IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKTsKIGludCBhY3BpX2VjX2RzZHRfcHJvYmUodm9pZCk7Ci1pbnQgYWNwaV9lY19lY2R0X3N0YXJ0KHZvaWQpOwogdm9pZCBhY3BpX2VjX2Jsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKIHZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKIGludCBhY3BpX2VjX2FkZF9xdWVyeV9oYW5kbGVyKHN0cnVjdCBhY3BpX2VjICplYywgdTggcXVlcnlfYml0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2lvYXBpYy5jIGIvZHJpdmVycy9hY3BpL2lvYXBpYy5jCmluZGV4IDZkN2NlNmUuLjVlMThjY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pb2FwaWMuYworKysgYi9kcml2ZXJzL2FjcGkvaW9hcGljLmMKQEAgLTQ1LDYgKzQ1LDEyIEBACiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBkYXRhOwogCXN0cnVjdCByZXNvdXJjZV93aW4gd2luOwogCisJLyoKKwkgKiBXZSBtaWdodCBhc3NpZ24gdGhpcyB0byAncmVzJyBsYXRlciwgbWFrZSBzdXJlIGFsbCBwb2ludGVycyBhcmUKKwkgKiBjbGVhcmVkIGJlZm9yZSB0aGUgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlIGdsb2JhbCBsaXN0CisJICovCisJbWVtc2V0KCZ3aW4sIDAsIHNpemVvZih3aW4pKTsKKwogCXJlcy0+ZmxhZ3MgPSAwOwogCWlmIChhY3BpX2Rldl9maWx0ZXJfcmVzb3VyY2VfdHlwZShhY3BpX3JlcywgSU9SRVNPVVJDRV9NRU0pKQogCQlyZXR1cm4gQUVfT0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCBkZDM3ODZhLi5jZjcyNWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTIwNTEsNyArMjA1MSw2IEBACiAKIAlhY3BpX2dwZV9hcHBseV9tYXNrZWRfZ3BlcygpOwogCWFjcGlfdXBkYXRlX2FsbF9ncGVzKCk7Ci0JYWNwaV9lY19lY2R0X3N0YXJ0KCk7CiAKIAlhY3BpX3NjYW5faW5pdGlhbGl6ZWQgPSB0cnVlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvYW5kcm9pZC9LY29uZmlnCmluZGV4IDRkNGNkYzEuLjAxZGU0MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW5kcm9pZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9LY29uZmlnCkBAIC00NCw2ICs0NCwxNiBAQAogCiAJICBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIGJyZWFrIG5ld2VyIEFuZHJvaWQgdXNlci1zcGFjZS4KIAorY29uZmlnIEFORFJPSURfQklOREVSX0lQQ19TRUxGVEVTVAorCWJvb2wgIkFuZHJvaWQgQmluZGVyIElQQyBEcml2ZXIgU2VsZnRlc3QiCisJZGVwZW5kcyBvbiBBTkRST0lEX0JJTkRFUl9JUEMKKwktLS1oZWxwLS0tCisJICBUaGlzIGZlYXR1cmUgYWxsb3dzIGJpbmRlciBzZWxmdGVzdCB0byBydW4uCisKKwkgIEJpbmRlciBzZWxmdGVzdCBjaGVja3MgdGhlIGFsbG9jYXRpb24gYW5kIGZyZWUgb2YgYmluZGVyIGJ1ZmZlcnMKKwkgIGV4aGF1c3RpdmVseSB3aXRoIGNvbWJpbmF0aW9ucyBvZiB2YXJpb3VzIGJ1ZmZlciBzaXplcyBhbmQKKwkgIGFsaWdubWVudHMuCisKIGVuZGlmICMgaWYgQU5EUk9JRAogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2FuZHJvaWQvTWFrZWZpbGUKaW5kZXggNGI3YzcyNi4uYTAxMjU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbmRyb2lkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKIGNjZmxhZ3MteSArPSAtSSQoc3JjKQkJCSMgbmVlZGVkIGZvciB0cmFjZSBldmVudHMKIAogb2JqLSQoQ09ORklHX0FORFJPSURfQklOREVSX0lQQykJKz0gYmluZGVyLm8gYmluZGVyX2FsbG9jLm8KK29iai0kKENPTkZJR19BTkRST0lEX0JJTkRFUl9JUENfU0VMRlRFU1QpICs9IGJpbmRlcl9hbGxvY19zZWxmdGVzdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMKaW5kZXggNjMyYzgxNC4uZmNmODViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIHsKIAlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkOwogCi0JQlVHX09OKCFzcGluX2lzX2xvY2tlZCgmcHJvYy0+aW5uZXJfbG9jaykpOworCWFzc2VydF9zcGluX2xvY2tlZCgmcHJvYy0+aW5uZXJfbG9jayk7CiAJdGhyZWFkID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZwcm9jLT53YWl0aW5nX3RocmVhZHMsCiAJCQkJCSAgc3RydWN0IGJpbmRlcl90aHJlYWQsCiAJCQkJCSAgd2FpdGluZ190aHJlYWRfbm9kZSk7CkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQkJCQkgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKIAkJCQkJIGJvb2wgc3luYykKIHsKLQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKTsKIAogCWlmICh0aHJlYWQpIHsKIAkJaWYgKHN5bmMpCkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+bm9kZXMucmJfbm9kZTsKIAlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7CiAKLQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKTsKIAogCXdoaWxlIChuKSB7CiAJCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwpAQCAtMTI2OSw3ICsxMjY5LDggQEAKIAlfX3UzMiBmbGFncyA9IGZwID8gZnAtPmZsYWdzIDogMDsKIAlzOCBwcmlvcml0eTsKIAotCUJVR19PTighc3Bpbl9pc19sb2NrZWQoJnByb2MtPmlubmVyX2xvY2spKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnByb2MtPmlubmVyX2xvY2spOworCiAJd2hpbGUgKCpwKSB7CiAKIAkJcGFyZW50ID0gKnA7CkBAIC0xMzQ4LDkgKzEzNDksOSBAQAogewogCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IG5vZGUtPnByb2M7CiAKLQlCVUdfT04oIXNwaW5faXNfbG9ja2VkKCZub2RlLT5sb2NrKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZub2RlLT5sb2NrKTsKIAlpZiAocHJvYykKLQkJQlVHX09OKCFzcGluX2lzX2xvY2tlZCgmcHJvYy0+aW5uZXJfbG9jaykpOworCQlhc3NlcnRfc3Bpbl9sb2NrZWQoJnByb2MtPmlubmVyX2xvY2spOwogCWlmIChzdHJvbmcpIHsKIAkJaWYgKGludGVybmFsKSB7CiAJCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCAmJgpAQCAtMTQwMiw5ICsxNDAzLDkgQEAKIHsKIAlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBub2RlLT5wcm9jOwogCi0JQlVHX09OKCFzcGluX2lzX2xvY2tlZCgmbm9kZS0+bG9jaykpOworCWFzc2VydF9zcGluX2xvY2tlZCgmbm9kZS0+bG9jayk7CiAJaWYgKHByb2MpCi0JCUJVR19PTighc3Bpbl9pc19sb2NrZWQoJnByb2MtPmlubmVyX2xvY2spKTsKKwkJYXNzZXJ0X3NwaW5fbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKTsKIAlpZiAoc3Ryb25nKSB7CiAJCWlmIChpbnRlcm5hbCkKIAkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLS07CkBAIC0xOTI4LDcgKzE5MjksNyBAQAogCQkJCQkgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQogewogCUJVR19PTighdGFyZ2V0X3RocmVhZCk7Ci0JQlVHX09OKCFzcGluX2lzX2xvY2tlZCgmdGFyZ2V0X3RocmVhZC0+cHJvYy0+aW5uZXJfbG9jaykpOworCWFzc2VydF9zcGluX2xvY2tlZCgmdGFyZ2V0X3RocmVhZC0+cHJvYy0+aW5uZXJfbG9jayk7CiAJQlVHX09OKHRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrICE9IHQpOwogCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbSAhPSB0YXJnZXRfdGhyZWFkKTsKIAl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9CkBAIC0yNDc5LDcgKzI0ODAsNiBAQAogCQkJICAgICAodTY0KW5vZGUtPnB0cik7CiAJCWJpbmRlcl9ub2RlX3VubG9jayhub2RlKTsKIAl9IGVsc2UgewotCQlpbnQgcmV0OwogCQlzdHJ1Y3QgYmluZGVyX3JlZl9kYXRhIGRlc3RfcmRhdGE7CiAKIAkJYmluZGVyX25vZGVfdW5sb2NrKG5vZGUpOwpAQCAtMjc0Myw2ICsyNzQzLDQ4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKKy8qKgorICogYmluZGVyX2dldF9ub2RlX3JlZnNfZm9yX3R4bigpIC0gR2V0IHJlcXVpcmVkIHJlZnMgb24gbm9kZSBmb3IgdHhuCisgKiBAbm9kZTogICAgICAgICBzdHJ1Y3QgYmluZGVyX25vZGUgZm9yIHdoaWNoIHRvIGdldCByZWZzCisgKiBAcHJvYzogICAgICAgICByZXR1cm5zIEBub2RlLT5wcm9jIGlmIHZhbGlkCisgKiBAZXJyb3I6ICAgICAgICBpZiBubyBAcHJvYyB0aGVuIHJldHVybnMgQlJfREVBRF9SRVBMWQorICoKKyAqIFVzZXItc3BhY2Ugbm9ybWFsbHkga2VlcHMgdGhlIG5vZGUgYWxpdmUgd2hlbiBjcmVhdGluZyBhIHRyYW5zYWN0aW9uCisgKiBzaW5jZSBpdCBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRhcmdldC4gVGhlIGxvY2FsIHN0cm9uZyByZWYga2VlcHMgaXQKKyAqIGFsaXZlIGlmIHRoZSBzZW5kaW5nIHByb2Nlc3MgZGllcyBiZWZvcmUgdGhlIHRhcmdldCBwcm9jZXNzIHByb2Nlc3NlcworICogdGhlIHRyYW5zYWN0aW9uLiBJZiB0aGUgc291cmNlIHByb2Nlc3MgaXMgbWFsaWNpb3VzIG9yIGhhcyBhIHJlZmVyZW5jZQorICogY291bnRpbmcgYnVnLCByZWx5aW5nIG9uIHRoZSBsb2NhbCBzdHJvbmcgcmVmIGNhbiBmYWlsLgorICoKKyAqIFNpbmNlIHVzZXItc3BhY2UgY2FuIGNhdXNlIHRoZSBsb2NhbCBzdHJvbmcgcmVmIHRvIGdvIGF3YXksIHdlIGFsc28gdGFrZQorICogYSB0bXByZWYgb24gdGhlIG5vZGUgdG8gZW5zdXJlIGl0IHN1cnZpdmVzIHdoaWxlIHdlIGFyZSBjb25zdHJ1Y3RpbmcKKyAqIHRoZSB0cmFuc2FjdGlvbi4gV2UgYWxzbyBuZWVkIGEgdG1wcmVmIG9uIHRoZSBwcm9jIHdoaWxlIHdlIGFyZQorICogY29uc3RydWN0aW5nIHRoZSB0cmFuc2FjdGlvbiwgc28gd2UgdGFrZSB0aGF0IGhlcmUgYXMgd2VsbC4KKyAqCisgKiBSZXR1cm46IFRoZSB0YXJnZXRfbm9kZSB3aXRoIHJlZnMgdGFrZW4gb3IgTlVMTCBpZiBubyBAbm9kZS0+cHJvYyBpcyBOVUxMLgorICogQWxzbyBzZXRzIEBwcm9jIGlmIHZhbGlkLiBJZiB0aGUgQG5vZGUtPnByb2MgaXMgTlVMTCBpbmRpY2F0aW5nIHRoYXQgdGhlCisgKiB0YXJnZXQgcHJvYyBoYXMgZGllZCwgQGVycm9yIGlzIHNldCB0byBCUl9ERUFEX1JFUExZCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9nZXRfbm9kZV9yZWZzX2Zvcl90eG4oCisJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSwKKwkJc3RydWN0IGJpbmRlcl9wcm9jICoqcHJvY3AsCisJCXVpbnQzMl90ICplcnJvcikKK3sKKwlzdHJ1Y3QgYmluZGVyX25vZGUgKnRhcmdldF9ub2RlID0gTlVMTDsKKworCWJpbmRlcl9ub2RlX2lubmVyX2xvY2sobm9kZSk7CisJaWYgKG5vZGUtPnByb2MpIHsKKwkJdGFyZ2V0X25vZGUgPSBub2RlOworCQliaW5kZXJfaW5jX25vZGVfbmlsb2NrZWQobm9kZSwgMSwgMCwgTlVMTCk7CisJCWJpbmRlcl9pbmNfbm9kZV90bXByZWZfaWxvY2tlZChub2RlKTsKKwkJbm9kZS0+cHJvYy0+dG1wX3JlZisrOworCQkqcHJvY3AgPSBub2RlLT5wcm9jOworCX0gZWxzZQorCQkqZXJyb3IgPSBCUl9ERUFEX1JFUExZOworCWJpbmRlcl9ub2RlX2lubmVyX3VubG9jayhub2RlKTsKKworCXJldHVybiB0YXJnZXRfbm9kZTsKK30KKwogc3RhdGljIHZvaWQgYmluZGVyX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKIAkJCSAgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAogCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSAqdHIsIGludCByZXBseSwKQEAgLTI4NDUsNDMgKzI4ODcsMzUgQEAKIAkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX29sb2NrZWQocHJvYywgdHItPnRhcmdldC5oYW5kbGUsCiAJCQkJCQkgICAgIHRydWUpOwogCQkJaWYgKHJlZikgewotCQkJCWJpbmRlcl9pbmNfbm9kZShyZWYtPm5vZGUsIDEsIDAsIE5VTEwpOwotCQkJCXRhcmdldF9ub2RlID0gcmVmLT5ub2RlOworCQkJCXRhcmdldF9ub2RlID0gYmluZGVyX2dldF9ub2RlX3JlZnNfZm9yX3R4bigKKwkJCQkJCXJlZi0+bm9kZSwgJnRhcmdldF9wcm9jLAorCQkJCQkJJnJldHVybl9lcnJvcik7CisJCQl9IGVsc2UgeworCQkJCWJpbmRlcl91c2VyX2Vycm9yKCIlZDolZCBnb3QgdHJhbnNhY3Rpb24gdG8gaW52YWxpZCBoYW5kbGVcbiIsCisJCQkJCQkgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOworCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKIAkJCX0KIAkJCWJpbmRlcl9wcm9jX3VubG9jayhwcm9jKTsKLQkJCWlmICh0YXJnZXRfbm9kZSA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoIiVkOiVkIGdvdCB0cmFuc2FjdGlvbiB0byBpbnZhbGlkIGhhbmRsZVxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCXJldHVybl9lcnJvcl9wYXJhbSA9IC1FSU5WQUw7Ci0JCQkJcmV0dXJuX2Vycm9yX2xpbmUgPSBfX0xJTkVfXzsKLQkJCQlnb3RvIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQltdXRleF9sb2NrKCZjb250ZXh0LT5jb250ZXh0X21ncl9ub2RlX2xvY2spOwogCQkJdGFyZ2V0X25vZGUgPSBjb250ZXh0LT5iaW5kZXJfY29udGV4dF9tZ3Jfbm9kZTsKLQkJCWlmICh0YXJnZXRfbm9kZSA9PSBOVUxMKSB7CisJCQlpZiAodGFyZ2V0X25vZGUpCisJCQkJdGFyZ2V0X25vZGUgPSBiaW5kZXJfZ2V0X25vZGVfcmVmc19mb3JfdHhuKAorCQkJCQkJdGFyZ2V0X25vZGUsICZ0YXJnZXRfcHJvYywKKwkJCQkJCSZyZXR1cm5fZXJyb3IpOworCQkJZWxzZQogCQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jb250ZXh0X21ncl9ub2RlX2xvY2spOwotCQkJCXJldHVybl9lcnJvcl9saW5lID0gX19MSU5FX187Ci0JCQkJZ290byBlcnJfbm9fY29udGV4dF9tZ3Jfbm9kZTsKLQkJCX0KLQkJCWJpbmRlcl9pbmNfbm9kZSh0YXJnZXRfbm9kZSwgMSwgMCwgTlVMTCk7CiAJCQltdXRleF91bmxvY2soJmNvbnRleHQtPmNvbnRleHRfbWdyX25vZGVfbG9jayk7CiAJCX0KLQkJZS0+dG9fbm9kZSA9IHRhcmdldF9ub2RlLT5kZWJ1Z19pZDsKLQkJYmluZGVyX25vZGVfbG9jayh0YXJnZXRfbm9kZSk7Ci0JCXRhcmdldF9wcm9jID0gdGFyZ2V0X25vZGUtPnByb2M7Ci0JCWlmICh0YXJnZXRfcHJvYyA9PSBOVUxMKSB7Ci0JCQliaW5kZXJfbm9kZV91bmxvY2sodGFyZ2V0X25vZGUpOwotCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKKwkJaWYgKCF0YXJnZXRfbm9kZSkgeworCQkJLyoKKwkJCSAqIHJldHVybl9lcnJvciBpcyBzZXQgYWJvdmUKKwkJCSAqLworCQkJcmV0dXJuX2Vycm9yX3BhcmFtID0gLUVJTlZBTDsKIAkJCXJldHVybl9lcnJvcl9saW5lID0gX19MSU5FX187CiAJCQlnb3RvIGVycl9kZWFkX2JpbmRlcjsKIAkJfQotCQliaW5kZXJfaW5uZXJfcHJvY19sb2NrKHRhcmdldF9wcm9jKTsKLQkJdGFyZ2V0X3Byb2MtPnRtcF9yZWYrKzsKLQkJYmluZGVyX2lubmVyX3Byb2NfdW5sb2NrKHRhcmdldF9wcm9jKTsKLQkJYmluZGVyX25vZGVfdW5sb2NrKHRhcmdldF9ub2RlKTsKKwkJZS0+dG9fbm9kZSA9IHRhcmdldF9ub2RlLT5kZWJ1Z19pZDsKIAkJaWYgKHNlY3VyaXR5X2JpbmRlcl90cmFuc2FjdGlvbihwcm9jLT50c2ssCiAJCQkJCQl0YXJnZXRfcHJvYy0+dHNrKSA8IDApIHsKIAkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKQEAgLTMyNDAsNiArMzI3NCw4IEBACiAJaWYgKHRhcmdldF90aHJlYWQpCiAJCWJpbmRlcl90aHJlYWRfZGVjX3RtcHJlZih0YXJnZXRfdGhyZWFkKTsKIAliaW5kZXJfcHJvY19kZWNfdG1wcmVmKHRhcmdldF9wcm9jKTsKKwlpZiAodGFyZ2V0X25vZGUpCisJCWJpbmRlcl9kZWNfbm9kZV90bXByZWYodGFyZ2V0X25vZGUpOwogCS8qCiAJICogd3JpdGUgYmFycmllciB0byBzeW5jaHJvbml6ZSB3aXRoIGluaXRpYWxpemF0aW9uCiAJICogb2YgbG9nIGVudHJ5CkBAIC0zMjUxLDYgKzMyODcsNyBAQAogZXJyX2RlYWRfcHJvY19vcl90aHJlYWQ6CiAJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKIAlyZXR1cm5fZXJyb3JfbGluZSA9IF9fTElORV9fOworCWJpbmRlcl9kZXF1ZXVlX3dvcmsocHJvYywgdGNvbXBsZXRlKTsKIGVycl90cmFuc2xhdGVfZmFpbGVkOgogZXJyX2JhZF9vYmplY3RfdHlwZToKIGVycl9iYWRfb2Zmc2V0OgpAQCAtMzI1OCw2ICszMjk1LDggQEAKIGVycl9jb3B5X2RhdGFfZmFpbGVkOgogCXRyYWNlX2JpbmRlcl90cmFuc2FjdGlvbl9mYWlsZWRfYnVmZmVyX3JlbGVhc2UodC0+YnVmZmVyKTsKIAliaW5kZXJfdHJhbnNhY3Rpb25fYnVmZmVyX3JlbGVhc2UodGFyZ2V0X3Byb2MsIHQtPmJ1ZmZlciwgb2ZmcCk7CisJaWYgKHRhcmdldF9ub2RlKQorCQliaW5kZXJfZGVjX25vZGVfdG1wcmVmKHRhcmdldF9ub2RlKTsKIAl0YXJnZXRfbm9kZSA9IE5VTEw7CiAJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7CiAJYmluZGVyX2FsbG9jX2ZyZWVfYnVmKCZ0YXJnZXRfcHJvYy0+YWxsb2MsIHQtPmJ1ZmZlcik7CkBAIC0zMjcyLDEzICszMzExLDE0IEBACiBlcnJfZW1wdHlfY2FsbF9zdGFjazoKIGVycl9kZWFkX2JpbmRlcjoKIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU6Ci1lcnJfbm9fY29udGV4dF9tZ3Jfbm9kZToKIAlpZiAodGFyZ2V0X3RocmVhZCkKIAkJYmluZGVyX3RocmVhZF9kZWNfdG1wcmVmKHRhcmdldF90aHJlYWQpOwogCWlmICh0YXJnZXRfcHJvYykKIAkJYmluZGVyX3Byb2NfZGVjX3RtcHJlZih0YXJnZXRfcHJvYyk7Ci0JaWYgKHRhcmdldF9ub2RlKQorCWlmICh0YXJnZXRfbm9kZSkgewogCQliaW5kZXJfZGVjX25vZGUodGFyZ2V0X25vZGUsIDEsIDApOworCQliaW5kZXJfZGVjX25vZGVfdG1wcmVmKHRhcmdldF9ub2RlKTsKKwl9CiAKIAliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiwKIAkJICAgICAiJWQ6JWQgdHJhbnNhY3Rpb24gZmFpbGVkICVkLyVkLCBzaXplICVsbGQtJWxsZCBsaW5lICVkXG4iLApAQCAtMzUyMCwxMSArMzU2MCwxMyBAQAogCQkJCUJVR19PTihidWZfbm9kZS0+cHJvYyAhPSBwcm9jKTsKIAkJCQl3ID0gYmluZGVyX2RlcXVldWVfd29ya19oZWFkX2lsb2NrZWQoCiAJCQkJCQkmYnVmX25vZGUtPmFzeW5jX3RvZG8pOwotCQkJCWlmICghdykKKwkJCQlpZiAoIXcpIHsKIAkJCQkJYnVmX25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDA7Ci0JCQkJZWxzZQorCQkJCX0gZWxzZSB7CiAJCQkJCWJpbmRlcl9lbnF1ZXVlX3dvcmtfaWxvY2tlZCgKLQkJCQkJCQl3LCAmdGhyZWFkLT50b2RvKTsKKwkJCQkJCQl3LCAmcHJvYy0+dG9kbyk7CisJCQkJCWJpbmRlcl93YWtldXBfcHJvY19pbG9ja2VkKHByb2MpOworCQkJCX0KIAkJCQliaW5kZXJfbm9kZV9pbm5lcl91bmxvY2soYnVmX25vZGUpOwogCQkJfQogCQkJdHJhY2VfYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKGJ1ZmZlcik7CkBAIC0zNjY4LDIyICszNzEwLDEyIEBACiAJCQkJcmVmLT5kZWF0aCA9IGRlYXRoOwogCQkJCWlmIChyZWYtPm5vZGUtPnByb2MgPT0gTlVMTCkgewogCQkJCQlyZWYtPmRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjsKLQkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYKLQkJCQkJICAgIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAotCQkJCQkgICAgIEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpCi0JCQkJCQliaW5kZXJfZW5xdWV1ZV93b3JrKAotCQkJCQkJCXByb2MsCi0JCQkJCQkJJnJlZi0+ZGVhdGgtPndvcmssCi0JCQkJCQkJJnRocmVhZC0+dG9kbyk7Ci0JCQkJCWVsc2UgewotCQkJCQkJYmluZGVyX2lubmVyX3Byb2NfbG9jayhwcm9jKTsKLQkJCQkJCWJpbmRlcl9lbnF1ZXVlX3dvcmtfaWxvY2tlZCgKLQkJCQkJCQkmcmVmLT5kZWF0aC0+d29yaywKLQkJCQkJCQkmcHJvYy0+dG9kbyk7Ci0JCQkJCQliaW5kZXJfd2FrZXVwX3Byb2NfaWxvY2tlZCgKLQkJCQkJCQlwcm9jKTsKLQkJCQkJCWJpbmRlcl9pbm5lcl9wcm9jX3VubG9jayhwcm9jKTsKLQkJCQkJfQorCisJCQkJCWJpbmRlcl9pbm5lcl9wcm9jX2xvY2socHJvYyk7CisJCQkJCWJpbmRlcl9lbnF1ZXVlX3dvcmtfaWxvY2tlZCgKKwkJCQkJCSZyZWYtPmRlYXRoLT53b3JrLCAmcHJvYy0+dG9kbyk7CisJCQkJCWJpbmRlcl93YWtldXBfcHJvY19pbG9ja2VkKHByb2MpOworCQkJCQliaW5kZXJfaW5uZXJfcHJvY191bmxvY2socHJvYyk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAocmVmLT5kZWF0aCA9PSBOVUxMKSB7CkBAIC0zODAwLDEyICszODMyLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYmluZGVyX2hhc190aHJlYWRfd29yayhzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQotewotCXJldHVybiAhYmluZGVyX3dvcmtsaXN0X2VtcHR5KHRocmVhZC0+cHJvYywgJnRocmVhZC0+dG9kbykgfHwKLQkJdGhyZWFkLT5sb29wZXJfbmVlZF9yZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgYmluZGVyX3B1dF9ub2RlX2NtZChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCiAJCQkgICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKIAkJCSAgICAgICB2b2lkIF9fdXNlciAqKnB0cnAsCkBAIC00NDM2LDEyICs0NDYyLDkgQEAKIAogCWJpbmRlcl9pbm5lcl9wcm9jX3VubG9jayh0aHJlYWQtPnByb2MpOwogCi0JaWYgKGJpbmRlcl9oYXNfd29yayh0aHJlYWQsIHdhaXRfZm9yX3Byb2Nfd29yaykpCi0JCXJldHVybiBQT0xMSU47Ci0KIAlwb2xsX3dhaXQoZmlscCwgJnRocmVhZC0+d2FpdCwgd2FpdCk7CiAKLQlpZiAoYmluZGVyX2hhc190aHJlYWRfd29yayh0aHJlYWQpKQorCWlmIChiaW5kZXJfaGFzX3dvcmsodGhyZWFkLCB3YWl0X2Zvcl9wcm9jX3dvcmspKQogCQlyZXR1cm4gUE9MTElOOwogCiAJcmV0dXJuIDA7CkBAIC00NTk1LDYgKzQ2MTgsOCBAQAogCS8qcHJfaW5mbygiYmluZGVyX2lvY3RsOiAlZDolZCAleCAlbHhcbiIsCiAJCQlwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcpOyovCiAKKwliaW5kZXJfc2VsZnRlc3RfYWxsb2MoJnByb2MtPmFsbG9jKTsKKwogCXRyYWNlX2JpbmRlcl9pb2N0bChjbWQsIGFyZyk7CiAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOwpAQCAtNTA3MSw3ICs1MDk2LDYgQEAKIAlzdHJ1Y3QgYmluZGVyX3Byb2MgKnRvX3Byb2M7CiAJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciA9IHQtPmJ1ZmZlcjsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZwcm9jLT5pbm5lcl9sb2NrKSk7CiAJc3Bpbl9sb2NrKCZ0LT5sb2NrKTsKIAl0b19wcm9jID0gdC0+dG9fcHJvYzsKIAlzZXFfcHJpbnRmKG0sCkBAIC01MTYwLDcgKzUxODQsNiBAQAogCXNpemVfdCBzdGFydF9wb3MgPSBtLT5jb3VudDsKIAlzaXplX3QgaGVhZGVyX3BvczsKIAotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZ0aHJlYWQtPnByb2MtPmlubmVyX2xvY2spKTsKIAlzZXFfcHJpbnRmKG0sICIgIHRocmVhZCAlZDogbCAlMDJ4IG5lZWRfcmV0dXJuICVkIHRyICVkXG4iLAogCQkJdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyLAogCQkJdGhyZWFkLT5sb29wZXJfbmVlZF9yZXR1cm4sCkBAIC01MTk3LDEwICs1MjIwLDYgQEAKIAlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7CiAJaW50IGNvdW50OwogCi0JV0FSTl9PTighc3Bpbl9pc19sb2NrZWQoJm5vZGUtPmxvY2spKTsKLQlpZiAobm9kZS0+cHJvYykKLQkJV0FSTl9PTighc3Bpbl9pc19sb2NrZWQoJm5vZGUtPnByb2MtPmlubmVyX2xvY2spKTsKLQogCWNvdW50ID0gMDsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShyZWYsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQogCQljb3VudCsrOwpAQCAtNTIyNyw3ICs1MjQ2LDYgQEAKIHN0YXRpYyB2b2lkIHByaW50X2JpbmRlcl9yZWZfb2xvY2tlZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCiAJCQkJICAgICBzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmKQogewotCVdBUk5fT04oIXNwaW5faXNfbG9ja2VkKCZyZWYtPnByb2MtPm91dGVyX2xvY2spKTsKIAliaW5kZXJfbm9kZV9sb2NrKHJlZi0+bm9kZSk7CiAJc2VxX3ByaW50ZihtLCAiICByZWYgJWQ6IGRlc2MgJWQgJXNub2RlICVkIHMgJWQgdyAlZCBkICVwS1xuIiwKIAkJICAgcmVmLT5kYXRhLmRlYnVnX2lkLCByZWYtPmRhdGEuZGVzYywKQEAgLTU0NDcsNiArNTQ2NSw4IEBACiAJY291bnQgPSBiaW5kZXJfYWxsb2NfZ2V0X2FsbG9jYXRlZF9jb3VudCgmcHJvYy0+YWxsb2MpOwogCXNlcV9wcmludGYobSwgIiAgYnVmZmVyczogJWRcbiIsIGNvdW50KTsKIAorCWJpbmRlcl9hbGxvY19wcmludF9wYWdlcyhtLCAmcHJvYy0+YWxsb2MpOworCiAJY291bnQgPSAwOwogCWJpbmRlcl9pbm5lcl9wcm9jX2xvY2socHJvYyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+dG9kbywgZW50cnkpIHsKQEAgLTU2NDMsNiArNTY2Myw4IEBACiAJc3RydWN0IGJpbmRlcl9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwogCisJYmluZGVyX2FsbG9jX3Nocmlua2VyX2luaXQoKTsKKwogCWF0b21pY19zZXQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2cuY3VyLCB+MFUpOwogCWF0b21pY19zZXQoJmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkLmN1ciwgfjBVKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9hbGxvYy5jIGIvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9hbGxvYy5jCmluZGV4IGI5MDIyMmEuLmUwMjY4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfYWxsb2MuYworKysgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX2FsbG9jLmMKQEAgLTI3LDkgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3RfbHJ1Lmg+CiAjaW5jbHVkZSAiYmluZGVyX2FsbG9jLmgiCiAjaW5jbHVkZSAiYmluZGVyX3RyYWNlLmgiCiAKK3N0cnVjdCBsaXN0X2xydSBiaW5kZXJfYWxsb2NfbHJ1OworCiBzdGF0aWMgREVGSU5FX01VVEVYKGJpbmRlcl9hbGxvY19tbWFwX2xvY2spOwogCiBlbnVtIHsKQEAgLTQ4LDE0ICs1MSwyMyBAQAogCQkJcHJfaW5mbyh4KTsgXAogCX0gd2hpbGUgKDApCiAKK3N0YXRpYyBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYmluZGVyX2J1ZmZlcl9uZXh0KHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOworfQorCitzdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9idWZmZXJfcHJldihzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQoreworCXJldHVybiBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKK30KKwogc3RhdGljIHNpemVfdCBiaW5kZXJfYWxsb2NfYnVmZmVyX3NpemUoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCiAJCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCiB7CiAJaWYgKGxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJmFsbG9jLT5idWZmZXJzKSkKLQkJcmV0dXJuIGFsbG9jLT5idWZmZXIgKwotCQkgICAgICAgYWxsb2MtPmJ1ZmZlcl9zaXplIC0gKHZvaWQgKilidWZmZXItPmRhdGE7Ci0JcmV0dXJuIChzaXplX3QpbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCi0JCQkgIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSkgLSAoc2l6ZV90KWJ1ZmZlci0+ZGF0YTsKKwkJcmV0dXJuICh1OCAqKWFsbG9jLT5idWZmZXIgKworCQkJYWxsb2MtPmJ1ZmZlcl9zaXplIC0gKHU4ICopYnVmZmVyLT5kYXRhOworCXJldHVybiAodTggKiliaW5kZXJfYnVmZmVyX25leHQoYnVmZmVyKS0+ZGF0YSAtICh1OCAqKWJ1ZmZlci0+ZGF0YTsKIH0KIAogc3RhdGljIHZvaWQgYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywKQEAgLTEwNSw5ICsxMTcsOSBAQAogCQlidWZmZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKIAkJQlVHX09OKGJ1ZmZlci0+ZnJlZSk7CiAKLQkJaWYgKG5ld19idWZmZXIgPCBidWZmZXIpCisJCWlmIChuZXdfYnVmZmVyLT5kYXRhIDwgYnVmZmVyLT5kYXRhKQogCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKG5ld19idWZmZXIgPiBidWZmZXIpCisJCWVsc2UgaWYgKG5ld19idWZmZXItPmRhdGEgPiBidWZmZXItPmRhdGEpCiAJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CiAJCWVsc2UKIAkJCUJVRygpOwpAQCAtMTIyLDE4ICsxMzQsMTcgQEAKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbiA9IGFsbG9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOwogCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmtlcm5fcHRyOworCXZvaWQgKmtlcm5fcHRyOwogCi0Ja2Vybl9wdHIgPSAoc3RydWN0IGJpbmRlcl9idWZmZXIgKikodXNlcl9wdHIgLSBhbGxvYy0+dXNlcl9idWZmZXJfb2Zmc2V0Ci0JCS0gb2Zmc2V0b2Yoc3RydWN0IGJpbmRlcl9idWZmZXIsIGRhdGEpKTsKKwlrZXJuX3B0ciA9ICh2b2lkICopKHVzZXJfcHRyIC0gYWxsb2MtPnVzZXJfYnVmZmVyX29mZnNldCk7CiAKIAl3aGlsZSAobikgewogCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CiAJCUJVR19PTihidWZmZXItPmZyZWUpOwogCi0JCWlmIChrZXJuX3B0ciA8IGJ1ZmZlcikKKwkJaWYgKGtlcm5fcHRyIDwgYnVmZmVyLT5kYXRhKQogCQkJbiA9IG4tPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGtlcm5fcHRyID4gYnVmZmVyKQorCQllbHNlIGlmIChrZXJuX3B0ciA+IGJ1ZmZlci0+ZGF0YSkKIAkJCW4gPSBuLT5yYl9yaWdodDsKIAkJZWxzZSB7CiAJCQkvKgpAQCAtMTgwLDggKzE5MSw5IEBACiB7CiAJdm9pZCAqcGFnZV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9wYWdlX2FkZHI7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCBiaW5kZXJfbHJ1X3BhZ2UgKnBhZ2U7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCWJvb2wgbmVlZF9tbSA9IGZhbHNlOwogCiAJYmluZGVyX2FsbG9jX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCiAJCSAgICAgIiVkOiAlcyBwYWdlcyAlcEstJXBLXG4iLCBhbGxvYy0+cGlkLApAQCAtMTkyLDkgKzIwNCwxOCBAQAogCiAJdHJhY2VfYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKGFsbG9jLCBhbGxvY2F0ZSwgc3RhcnQsIGVuZCk7CiAKLQlpZiAodm1hKQotCQltbSA9IE5VTEw7Ci0JZWxzZQorCWlmIChhbGxvY2F0ZSA9PSAwKQorCQlnb3RvIGZyZWVfcmFuZ2U7CisKKwlmb3IgKHBhZ2VfYWRkciA9IHN0YXJ0OyBwYWdlX2FkZHIgPCBlbmQ7IHBhZ2VfYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJcGFnZSA9ICZhbGxvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIGFsbG9jLT5idWZmZXIpIC8gUEFHRV9TSVpFXTsKKwkJaWYgKCFwYWdlLT5wYWdlX3B0cikgeworCQkJbmVlZF9tbSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghdm1hICYmIG5lZWRfbW0pCiAJCW1tID0gZ2V0X3Rhc2tfbW0oYWxsb2MtPnRzayk7CiAKIAlpZiAobW0pIHsKQEAgLTIwNywxMCArMjI4LDcgQEAKIAkJfQogCX0KIAotCWlmIChhbGxvY2F0ZSA9PSAwKQotCQlnb3RvIGZyZWVfcmFuZ2U7Ci0KLQlpZiAodm1hID09IE5VTEwpIHsKKwlpZiAoIXZtYSAmJiBuZWVkX21tKSB7CiAJCXByX2VycigiJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkIHRvIG1hcCBwYWdlcyBpbiB1c2Vyc3BhY2UsIG5vIHZtYVxuIiwKIAkJCWFsbG9jLT5waWQpOwogCQlnb3RvIGVycl9ub192bWE7CkBAIC0yMTgsMTggKzIzNiw0MCBAQAogCiAJZm9yIChwYWdlX2FkZHIgPSBzdGFydDsgcGFnZV9hZGRyIDwgZW5kOyBwYWdlX2FkZHIgKz0gUEFHRV9TSVpFKSB7CiAJCWludCByZXQ7CisJCWJvb2wgb25fbHJ1OworCQlzaXplX3QgaW5kZXg7CiAKLQkJcGFnZSA9ICZhbGxvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIGFsbG9jLT5idWZmZXIpIC8gUEFHRV9TSVpFXTsKKwkJaW5kZXggPSAocGFnZV9hZGRyIC0gYWxsb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkU7CisJCXBhZ2UgPSAmYWxsb2MtPnBhZ2VzW2luZGV4XTsKIAotCQlCVUdfT04oKnBhZ2UpOwotCQkqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPKTsKLQkJaWYgKCpwYWdlID09IE5VTEwpIHsKKwkJaWYgKHBhZ2UtPnBhZ2VfcHRyKSB7CisJCQl0cmFjZV9iaW5kZXJfYWxsb2NfbHJ1X3N0YXJ0KGFsbG9jLCBpbmRleCk7CisKKwkJCW9uX2xydSA9IGxpc3RfbHJ1X2RlbCgmYmluZGVyX2FsbG9jX2xydSwgJnBhZ2UtPmxydSk7CisJCQlXQVJOX09OKCFvbl9scnUpOworCisJCQl0cmFjZV9iaW5kZXJfYWxsb2NfbHJ1X2VuZChhbGxvYywgaW5kZXgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoV0FSTl9PTighdm1hKSkKKwkJCWdvdG8gZXJyX3BhZ2VfcHRyX2NsZWFyZWQ7CisKKwkJdHJhY2VfYmluZGVyX2FsbG9jX3BhZ2Vfc3RhcnQoYWxsb2MsIGluZGV4KTsKKwkJcGFnZS0+cGFnZV9wdHIgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfAorCQkJCQkgICAgX19HRlBfSElHSE1FTSB8CisJCQkJCSAgICBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwYWdlLT5wYWdlX3B0cikgewogCQkJcHJfZXJyKCIlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgZm9yIHBhZ2UgYXQgJXBLXG4iLAogCQkJCWFsbG9jLT5waWQsIHBhZ2VfYWRkcik7CiAJCQlnb3RvIGVycl9hbGxvY19wYWdlX2ZhaWxlZDsKIAkJfQorCQlwYWdlLT5hbGxvYyA9IGFsbG9jOworCQlJTklUX0xJU1RfSEVBRCgmcGFnZS0+bHJ1KTsKKwogCQlyZXQgPSBtYXBfa2VybmVsX3JhbmdlX25vZmx1c2goKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyLAotCQkJCQlQQUdFX1NJWkUsIFBBR0VfS0VSTkVMLCBwYWdlKTsKKwkJCQkJICAgICAgIFBBR0VfU0laRSwgUEFHRV9LRVJORUwsCisJCQkJCSAgICAgICAmcGFnZS0+cGFnZV9wdHIpOwogCQlmbHVzaF9jYWNoZV92bWFwKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkciwKIAkJCQkodW5zaWduZWQgbG9uZylwYWdlX2FkZHIgKyBQQUdFX1NJWkUpOwogCQlpZiAocmV0ICE9IDEpIHsKQEAgLTIzOSwxMiArMjc5LDE0IEBACiAJCX0KIAkJdXNlcl9wYWdlX2FkZHIgPQogCQkJKHVpbnRwdHJfdClwYWdlX2FkZHIgKyBhbGxvYy0+dXNlcl9idWZmZXJfb2Zmc2V0OwotCQlyZXQgPSB2bV9pbnNlcnRfcGFnZSh2bWEsIHVzZXJfcGFnZV9hZGRyLCBwYWdlWzBdKTsKKwkJcmV0ID0gdm1faW5zZXJ0X3BhZ2Uodm1hLCB1c2VyX3BhZ2VfYWRkciwgcGFnZVswXS5wYWdlX3B0cik7CiAJCWlmIChyZXQpIHsKIAkJCXByX2VycigiJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkIHRvIG1hcCBwYWdlIGF0ICVseCBpbiB1c2Vyc3BhY2VcbiIsCiAJCQkgICAgICAgYWxsb2MtPnBpZCwgdXNlcl9wYWdlX2FkZHIpOwogCQkJZ290byBlcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOwogCQl9CisKKwkJdHJhY2VfYmluZGVyX2FsbG9jX3BhZ2VfZW5kKGFsbG9jLCBpbmRleCk7CiAJCS8qIHZtX2luc2VydF9wYWdlIGRvZXMgbm90IHNlZW0gdG8gaW5jcmVtZW50IHRoZSByZWZjb3VudCAqLwogCX0KIAlpZiAobW0pIHsKQEAgLTI1NiwxNiArMjk4LDI3IEBACiBmcmVlX3JhbmdlOgogCWZvciAocGFnZV9hZGRyID0gZW5kIC0gUEFHRV9TSVpFOyBwYWdlX2FkZHIgPj0gc3RhcnQ7CiAJICAgICBwYWdlX2FkZHIgLT0gUEFHRV9TSVpFKSB7Ci0JCXBhZ2UgPSAmYWxsb2MtPnBhZ2VzWyhwYWdlX2FkZHIgLSBhbGxvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07Ci0JCWlmICh2bWEpCi0JCQl6YXBfcGFnZV9yYW5nZSh2bWEsICh1aW50cHRyX3QpcGFnZV9hZGRyICsKLQkJCQlhbGxvYy0+dXNlcl9idWZmZXJfb2Zmc2V0LCBQQUdFX1NJWkUsIE5VTEwpOworCQlib29sIHJldDsKKwkJc2l6ZV90IGluZGV4OworCisJCWluZGV4ID0gKHBhZ2VfYWRkciAtIGFsbG9jLT5idWZmZXIpIC8gUEFHRV9TSVpFOworCQlwYWdlID0gJmFsbG9jLT5wYWdlc1tpbmRleF07CisKKwkJdHJhY2VfYmluZGVyX2ZyZWVfbHJ1X3N0YXJ0KGFsbG9jLCBpbmRleCk7CisKKwkJcmV0ID0gbGlzdF9scnVfYWRkKCZiaW5kZXJfYWxsb2NfbHJ1LCAmcGFnZS0+bHJ1KTsKKwkJV0FSTl9PTighcmV0KTsKKworCQl0cmFjZV9iaW5kZXJfZnJlZV9scnVfZW5kKGFsbG9jLCBpbmRleCk7CisJCWNvbnRpbnVlOworCiBlcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOgogCQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyLCBQQUdFX1NJWkUpOwogZXJyX21hcF9rZXJuZWxfZmFpbGVkOgotCQlfX2ZyZWVfcGFnZSgqcGFnZSk7Ci0JCSpwYWdlID0gTlVMTDsKKwkJX19mcmVlX3BhZ2UocGFnZS0+cGFnZV9wdHIpOworCQlwYWdlLT5wYWdlX3B0ciA9IE5VTEw7CiBlcnJfYWxsb2NfcGFnZV9mYWlsZWQ6CitlcnJfcGFnZV9wdHJfY2xlYXJlZDoKIAkJOwogCX0KIGVycl9ub192bWE6CkBAIC0zMjEsNiArMzc0LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CiAJfQogCisJLyogUGFkIDAtc2l6ZSBidWZmZXJzIHNvIHRoZXkgZ2V0IGFzc2lnbmVkIHVuaXF1ZSBhZGRyZXNzZXMgKi8KKwlzaXplID0gbWF4KHNpemUsIHNpemVvZih2b2lkICopKTsKKwogCXdoaWxlIChuKSB7CiAJCWJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKIAkJQlVHX09OKCFidWZmZXItPmZyZWUpOwpAQCAtMzgwLDE0ICs0MzYsOSBAQAogCiAJaGFzX3BhZ2VfYWRkciA9CiAJCSh2b2lkICopKCgodWludHB0cl90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyk7Ci0JaWYgKG4gPT0gTlVMTCkgewotCQlpZiAoc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcikgKyA0ID49IGJ1ZmZlcl9zaXplKQotCQkJYnVmZmVyX3NpemUgPSBzaXplOyAvKiBubyByb29tIGZvciBvdGhlciBidWZmZXJzICovCi0JCWVsc2UKLQkJCWJ1ZmZlcl9zaXplID0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7Ci0JfQorCVdBUk5fT04obiAmJiBidWZmZXJfc2l6ZSAhPSBzaXplKTsKIAllbmRfcGFnZV9hZGRyID0KLQkJKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpOworCQkodm9pZCAqKVBBR0VfQUxJR04oKHVpbnRwdHJfdClidWZmZXItPmRhdGEgKyBzaXplKTsKIAlpZiAoZW5kX3BhZ2VfYWRkciA+IGhhc19wYWdlX2FkZHIpCiAJCWVuZF9wYWdlX2FkZHIgPSBoYXNfcGFnZV9hZGRyOwogCXJldCA9IGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShhbGxvYywgMSwKQEAgLTM5NSwxNyArNDQ2LDI1IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAotCXJiX2VyYXNlKGJlc3RfZml0LCAmYWxsb2MtPmZyZWVfYnVmZmVycyk7Ci0JYnVmZmVyLT5mcmVlID0gMDsKLQlidWZmZXItPmZyZWVfaW5fcHJvZ3Jlc3MgPSAwOwotCWJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcl9sb2NrZWQoYWxsb2MsIGJ1ZmZlcik7CiAJaWYgKGJ1ZmZlcl9zaXplICE9IHNpemUpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIgPSAodm9pZCAqKWJ1ZmZlci0+ZGF0YSArIHNpemU7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyOwogCisJCW5ld19idWZmZXIgPSBremFsbG9jKHNpemVvZigqYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X2J1ZmZlcikgeworCQkJcHJfZXJyKCIlczogJWQgZmFpbGVkIHRvIGFsbG9jIG5ldyBidWZmZXIgc3RydWN0XG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBhbGxvYy0+cGlkKTsKKwkJCWdvdG8gZXJyX2FsbG9jX2J1Zl9zdHJ1Y3RfZmFpbGVkOworCQl9CisJCW5ld19idWZmZXItPmRhdGEgPSAodTggKilidWZmZXItPmRhdGEgKyBzaXplOwogCQlsaXN0X2FkZCgmbmV3X2J1ZmZlci0+ZW50cnksICZidWZmZXItPmVudHJ5KTsKIAkJbmV3X2J1ZmZlci0+ZnJlZSA9IDE7CiAJCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIoYWxsb2MsIG5ld19idWZmZXIpOwogCX0KKworCXJiX2VyYXNlKGJlc3RfZml0LCAmYWxsb2MtPmZyZWVfYnVmZmVycyk7CisJYnVmZmVyLT5mcmVlID0gMDsKKwlidWZmZXItPmZyZWVfaW5fcHJvZ3Jlc3MgPSAwOworCWJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcl9sb2NrZWQoYWxsb2MsIGJ1ZmZlcik7CiAJYmluZGVyX2FsbG9jX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCiAJCSAgICAgIiVkOiBiaW5kZXJfYWxsb2NfYnVmIHNpemUgJXpkIGdvdCAlcEtcbiIsCiAJCSAgICAgIGFsbG9jLT5waWQsIHNpemUsIGJ1ZmZlcik7CkBAIC00MjAsNiArNDc5LDEyIEBACiAJCQkgICAgICBhbGxvYy0+cGlkLCBzaXplLCBhbGxvYy0+ZnJlZV9hc3luY19zcGFjZSk7CiAJfQogCXJldHVybiBidWZmZXI7CisKK2Vycl9hbGxvY19idWZfc3RydWN0X2ZhaWxlZDoKKwliaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UoYWxsb2MsIDAsCisJCQkJICh2b2lkICopUEFHRV9BTElHTigodWludHB0cl90KWJ1ZmZlci0+ZGF0YSksCisJCQkJIGVuZF9wYWdlX2FkZHIsIE5VTEwpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCiAvKioKQEAgLTQ1NCw1NyArNTE5LDU5IEBACiAKIHN0YXRpYyB2b2lkICpidWZmZXJfc3RhcnRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQogewotCXJldHVybiAodm9pZCAqKSgodWludHB0cl90KWJ1ZmZlciAmIFBBR0VfTUFTSyk7CisJcmV0dXJuICh2b2lkICopKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICYgUEFHRV9NQVNLKTsKIH0KIAotc3RhdGljIHZvaWQgKmJ1ZmZlcl9lbmRfcGFnZShzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyKQorc3RhdGljIHZvaWQgKnByZXZfYnVmZmVyX2VuZF9wYWdlKHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCiB7Ci0JcmV0dXJuICh2b2lkICopKCgodWludHB0cl90KShidWZmZXIgKyAxKSAtIDEpICYgUEFHRV9NQVNLKTsKKwlyZXR1cm4gKHZvaWQgKikoKCh1aW50cHRyX3QpKGJ1ZmZlci0+ZGF0YSkgLSAxKSAmIFBBR0VfTUFTSyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJpbmRlcl9kZWxldGVfZnJlZV9idWZmZXIoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCiAJCQkJICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiwgKm5leHQgPSBOVUxMOwotCWludCBmcmVlX3BhZ2VfZW5kID0gMTsKLQlpbnQgZnJlZV9wYWdlX3N0YXJ0ID0gMTsKLQorCWJvb2wgdG9fZnJlZSA9IHRydWU7CiAJQlVHX09OKGFsbG9jLT5idWZmZXJzLm5leHQgPT0gJmJ1ZmZlci0+ZW50cnkpOwotCXByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwlwcmV2ID0gYmluZGVyX2J1ZmZlcl9wcmV2KGJ1ZmZlcik7CiAJQlVHX09OKCFwcmV2LT5mcmVlKTsKLQlpZiAoYnVmZmVyX2VuZF9wYWdlKHByZXYpID09IGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpIHsKLQkJZnJlZV9wYWdlX3N0YXJ0ID0gMDsKLQkJaWYgKGJ1ZmZlcl9lbmRfcGFnZShwcmV2KSA9PSBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSkKLQkJCWZyZWVfcGFnZV9lbmQgPSAwOworCWlmIChwcmV2X2J1ZmZlcl9lbmRfcGFnZShwcmV2KSA9PSBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSB7CisJCXRvX2ZyZWUgPSBmYWxzZTsKIAkJYmluZGVyX2FsbG9jX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkgICAgICIlZDogbWVyZ2UgZnJlZSwgYnVmZmVyICVwSyBzaGFyZSBwYWdlIHdpdGggJXBLXG4iLAotCQkJICAgICAgYWxsb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwkJCQkgICAiJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcEsgc2hhcmUgcGFnZSB3aXRoICVwS1xuIiwKKwkJCQkgICBhbGxvYy0+cGlkLCBidWZmZXItPmRhdGEsIHByZXYtPmRhdGEpOwogCX0KIAogCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmYWxsb2MtPmJ1ZmZlcnMpKSB7Ci0JCW5leHQgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKLQkJCQkgIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7Ci0JCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PSBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSkgewotCQkJZnJlZV9wYWdlX2VuZCA9IDA7Ci0JCQlpZiAoYnVmZmVyX3N0YXJ0X3BhZ2UobmV4dCkgPT0KLQkJCSAgICBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKQotCQkJCWZyZWVfcGFnZV9zdGFydCA9IDA7CisJCW5leHQgPSBiaW5kZXJfYnVmZmVyX25leHQoYnVmZmVyKTsKKwkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09IGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpIHsKKwkJCXRvX2ZyZWUgPSBmYWxzZTsKIAkJCWJpbmRlcl9hbGxvY19kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJCSAgICAgIiVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXBLIHNoYXJlIHBhZ2Ugd2l0aCAlcEtcbiIsCi0JCQkJICAgICAgYWxsb2MtPnBpZCwgYnVmZmVyLCBwcmV2KTsKKwkJCQkJICAgIiVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXBLIHNoYXJlIHBhZ2Ugd2l0aCAlcEtcbiIsCisJCQkJCSAgIGFsbG9jLT5waWQsCisJCQkJCSAgIGJ1ZmZlci0+ZGF0YSwKKwkJCQkJICAgbmV4dC0+ZGF0YSk7CiAJCX0KIAl9Ci0JbGlzdF9kZWwoJmJ1ZmZlci0+ZW50cnkpOwotCWlmIChmcmVlX3BhZ2Vfc3RhcnQgfHwgZnJlZV9wYWdlX2VuZCkgeworCisJaWYgKFBBR0VfQUxJR05FRChidWZmZXItPmRhdGEpKSB7CiAJCWJpbmRlcl9hbGxvY19kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJICAgICAiJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcEsgZG8gbm90IHNoYXJlIHBhZ2UlcyVzIHdpdGggJXBLIG9yICVwS1xuIiwKLQkJCSAgICAgYWxsb2MtPnBpZCwgYnVmZmVyLCBmcmVlX3BhZ2Vfc3RhcnQgPyAiIiA6ICIgZW5kIiwKLQkJCSAgICAgZnJlZV9wYWdlX2VuZCA/ICIiIDogIiBzdGFydCIsIHByZXYsIG5leHQpOwotCQliaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UoYWxsb2MsIDAsIGZyZWVfcGFnZV9zdGFydCA/Ci0JCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpIDogYnVmZmVyX2VuZF9wYWdlKGJ1ZmZlciksCi0JCQkoZnJlZV9wYWdlX2VuZCA/IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpIDoKLQkJCWJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpICsgUEFHRV9TSVpFLCBOVUxMKTsKKwkJCQkgICAiJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciBzdGFydCAlcEsgaXMgcGFnZSBhbGlnbmVkXG4iLAorCQkJCSAgIGFsbG9jLT5waWQsIGJ1ZmZlci0+ZGF0YSk7CisJCXRvX2ZyZWUgPSBmYWxzZTsKIAl9CisKKwlpZiAodG9fZnJlZSkgeworCQliaW5kZXJfYWxsb2NfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKKwkJCQkgICAiJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciAlcEsgZG8gbm90IHNoYXJlIHBhZ2Ugd2l0aCAlcEsgb3IgJXBLXG4iLAorCQkJCSAgIGFsbG9jLT5waWQsIGJ1ZmZlci0+ZGF0YSwKKwkJCQkgICBwcmV2LT5kYXRhLCBuZXh0LT5kYXRhKTsKKwkJYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKGFsbG9jLCAwLCBidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpLAorCQkJCQkgYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSArIFBBR0VfU0laRSwKKwkJCQkJIE5VTEwpOworCX0KKwlsaXN0X2RlbCgmYnVmZmVyLT5lbnRyeSk7CisJa2ZyZWUoYnVmZmVyKTsKIH0KIAogc3RhdGljIHZvaWQgYmluZGVyX2ZyZWVfYnVmX2xvY2tlZChzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywKQEAgLTUyNSw4ICs1OTIsOCBAQAogCUJVR19PTihidWZmZXItPmZyZWUpOwogCUJVR19PTihzaXplID4gYnVmZmVyX3NpemUpOwogCUJVR19PTihidWZmZXItPnRyYW5zYWN0aW9uICE9IE5VTEwpOwotCUJVR19PTigodm9pZCAqKWJ1ZmZlciA8IGFsbG9jLT5idWZmZXIpOwotCUJVR19PTigodm9pZCAqKWJ1ZmZlciA+IGFsbG9jLT5idWZmZXIgKyBhbGxvYy0+YnVmZmVyX3NpemUpOworCUJVR19PTihidWZmZXItPmRhdGEgPCBhbGxvYy0+YnVmZmVyKTsKKwlCVUdfT04oYnVmZmVyLT5kYXRhID4gYWxsb2MtPmJ1ZmZlciArIGFsbG9jLT5idWZmZXJfc2l6ZSk7CiAKIAlpZiAoYnVmZmVyLT5hc3luY190cmFuc2FjdGlvbikgewogCQlhbGxvYy0+ZnJlZV9hc3luY19zcGFjZSArPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKQEAgLTU0NCw4ICs2MTEsNyBAQAogCXJiX2VyYXNlKCZidWZmZXItPnJiX25vZGUsICZhbGxvYy0+YWxsb2NhdGVkX2J1ZmZlcnMpOwogCWJ1ZmZlci0+ZnJlZSA9IDE7CiAJaWYgKCFsaXN0X2lzX2xhc3QoJmJ1ZmZlci0+ZW50cnksICZhbGxvYy0+YnVmZmVycykpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5leHQgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkubmV4dCwKLQkJCQkJCXN0cnVjdCBiaW5kZXJfYnVmZmVyLCBlbnRyeSk7CisJCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXh0ID0gYmluZGVyX2J1ZmZlcl9uZXh0KGJ1ZmZlcik7CiAKIAkJaWYgKG5leHQtPmZyZWUpIHsKIAkJCXJiX2VyYXNlKCZuZXh0LT5yYl9ub2RlLCAmYWxsb2MtPmZyZWVfYnVmZmVycyk7CkBAIC01NTMsOCArNjE5LDcgQEAKIAkJfQogCX0KIAlpZiAoYWxsb2MtPmJ1ZmZlcnMubmV4dCAhPSAmYnVmZmVyLT5lbnRyeSkgewotCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5wcmV2LAotCQkJCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJc3RydWN0IGJpbmRlcl9idWZmZXIgKnByZXYgPSBiaW5kZXJfYnVmZmVyX3ByZXYoYnVmZmVyKTsKIAogCQlpZiAocHJldi0+ZnJlZSkgewogCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihhbGxvYywgYnVmZmVyKTsKQEAgLTY0MCwxNCArNzA1LDE0IEBACiAJfQogCWFsbG9jLT5idWZmZXJfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAotCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UoYWxsb2MsIDEsIGFsbG9jLT5idWZmZXIsCi0JCQkJICAgICBhbGxvYy0+YnVmZmVyICsgUEFHRV9TSVpFLCB2bWEpKSB7CisJYnVmZmVyID0ga3phbGxvYyhzaXplb2YoKmJ1ZmZlciksIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIHNtYWxsIGJ1ZiI7Ci0JCWdvdG8gZXJyX2FsbG9jX3NtYWxsX2J1Zl9mYWlsZWQ7CisJCWZhaWx1cmVfc3RyaW5nID0gImFsbG9jIGJ1ZmZlciBzdHJ1Y3QiOworCQlnb3RvIGVycl9hbGxvY19idWZfc3RydWN0X2ZhaWxlZDsKIAl9Ci0JYnVmZmVyID0gYWxsb2MtPmJ1ZmZlcjsKLQlJTklUX0xJU1RfSEVBRCgmYWxsb2MtPmJ1ZmZlcnMpOworCisJYnVmZmVyLT5kYXRhID0gYWxsb2MtPmJ1ZmZlcjsKIAlsaXN0X2FkZCgmYnVmZmVyLT5lbnRyeSwgJmFsbG9jLT5idWZmZXJzKTsKIAlidWZmZXItPmZyZWUgPSAxOwogCWJpbmRlcl9pbnNlcnRfZnJlZV9idWZmZXIoYWxsb2MsIGJ1ZmZlcik7CkBAIC02NTgsNyArNzIzLDcgQEAKIAogCXJldHVybiAwOwogCi1lcnJfYWxsb2Nfc21hbGxfYnVmX2ZhaWxlZDoKK2Vycl9hbGxvY19idWZfc3RydWN0X2ZhaWxlZDoKIAlrZnJlZShhbGxvYy0+cGFnZXMpOwogCWFsbG9jLT5wYWdlcyA9IE5VTEw7CiBlcnJfYWxsb2NfcGFnZXNfZmFpbGVkOgpAQCAtNjc4LDE0ICs3NDMsMTMgQEAKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKIAlpbnQgYnVmZmVycywgcGFnZV9jb3VudDsKKwlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwogCiAJQlVHX09OKGFsbG9jLT52bWEpOwogCiAJYnVmZmVycyA9IDA7CiAJbXV0ZXhfbG9jaygmYWxsb2MtPm11dGV4KTsKIAl3aGlsZSAoKG4gPSByYl9maXJzdCgmYWxsb2MtPmFsbG9jYXRlZF9idWZmZXJzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQogCQlidWZmZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgcmJfbm9kZSk7CiAKIAkJLyogVHJhbnNhY3Rpb24gc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGZyZWVkICovCkBAIC02OTUsMjIgKzc1OSwzNiBAQAogCQlidWZmZXJzKys7CiAJfQogCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhbGxvYy0+YnVmZmVycykpIHsKKwkJYnVmZmVyID0gbGlzdF9maXJzdF9lbnRyeSgmYWxsb2MtPmJ1ZmZlcnMsCisJCQkJCSAgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKKwkJV0FSTl9PTighYnVmZmVyLT5mcmVlKTsKKworCQlsaXN0X2RlbCgmYnVmZmVyLT5lbnRyeSk7CisJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmYWxsb2MtPmJ1ZmZlcnMpKTsKKwkJa2ZyZWUoYnVmZmVyKTsKKwl9CisKIAlwYWdlX2NvdW50ID0gMDsKIAlpZiAoYWxsb2MtPnBhZ2VzKSB7CiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBhbGxvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7IGkrKykgewogCQkJdm9pZCAqcGFnZV9hZGRyOworCQkJYm9vbCBvbl9scnU7CiAKLQkJCWlmICghYWxsb2MtPnBhZ2VzW2ldKQorCQkJaWYgKCFhbGxvYy0+cGFnZXNbaV0ucGFnZV9wdHIpCiAJCQkJY29udGludWU7CiAKKwkJCW9uX2xydSA9IGxpc3RfbHJ1X2RlbCgmYmluZGVyX2FsbG9jX2xydSwKKwkJCQkJICAgICAgJmFsbG9jLT5wYWdlc1tpXS5scnUpOwogCQkJcGFnZV9hZGRyID0gYWxsb2MtPmJ1ZmZlciArIGkgKiBQQUdFX1NJWkU7CiAJCQliaW5kZXJfYWxsb2NfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJCQkgICAgICIlczogJWQ6IHBhZ2UgJWQgYXQgJXBLIG5vdCBmcmVlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBhbGxvYy0+cGlkLCBpLCBwYWdlX2FkZHIpOworCQkJCSAgICAgIiVzOiAlZDogcGFnZSAlZCBhdCAlcEsgJXNcbiIsCisJCQkJICAgICBfX2Z1bmNfXywgYWxsb2MtPnBpZCwgaSwgcGFnZV9hZGRyLAorCQkJCSAgICAgb25fbHJ1ID8gIm9uIGxydSIgOiAiYWN0aXZlIik7CiAJCQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyLCBQQUdFX1NJWkUpOwotCQkJX19mcmVlX3BhZ2UoYWxsb2MtPnBhZ2VzW2ldKTsKKwkJCV9fZnJlZV9wYWdlKGFsbG9jLT5wYWdlc1tpXS5wYWdlX3B0cik7CiAJCQlwYWdlX2NvdW50Kys7CiAJCX0KIAkJa2ZyZWUoYWxsb2MtPnBhZ2VzKTsKQEAgLTc1NCw2ICs4MzIsMzQgQEAKIH0KIAogLyoqCisgKiBiaW5kZXJfYWxsb2NfcHJpbnRfcGFnZXMoKSAtIHByaW50IHBhZ2UgdXNhZ2UKKyAqIEBtOiAgICAgc2VxX2ZpbGUgZm9yIG91dHB1dCB2aWEgc2VxX3ByaW50ZigpCisgKiBAYWxsb2M6IGJpbmRlcl9hbGxvYyBmb3IgdGhpcyBwcm9jCisgKi8KK3ZvaWQgYmluZGVyX2FsbG9jX3ByaW50X3BhZ2VzKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jKQoreworCXN0cnVjdCBiaW5kZXJfbHJ1X3BhZ2UgKnBhZ2U7CisJaW50IGk7CisJaW50IGFjdGl2ZSA9IDA7CisJaW50IGxydSA9IDA7CisJaW50IGZyZWUgPSAwOworCisJbXV0ZXhfbG9jaygmYWxsb2MtPm11dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgYWxsb2MtPmJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJcGFnZSA9ICZhbGxvYy0+cGFnZXNbaV07CisJCWlmICghcGFnZS0+cGFnZV9wdHIpCisJCQlmcmVlKys7CisJCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnBhZ2UtPmxydSkpCisJCQlhY3RpdmUrKzsKKwkJZWxzZQorCQkJbHJ1Kys7CisJfQorCW11dGV4X3VubG9jaygmYWxsb2MtPm11dGV4KTsKKwlzZXFfcHJpbnRmKG0sICIgIHBhZ2VzOiAlZDolZDolZFxuIiwgYWN0aXZlLCBscnUsIGZyZWUpOworfQorCisvKioKICAqIGJpbmRlcl9hbGxvY19nZXRfYWxsb2NhdGVkX2NvdW50KCkgLSByZXR1cm4gY291bnQgb2YgYnVmZmVycwogICogQGFsbG9jOiBiaW5kZXJfYWxsb2MgZm9yIHRoaXMgcHJvYwogICoKQEAgLTc4Nyw2ICs4OTMsMTA4IEBACiB9CiAKIC8qKgorICogYmluZGVyX2FsbG9jX2ZyZWVfcGFnZSgpIC0gc2hyaW5rZXIgY2FsbGJhY2sgdG8gZnJlZSBwYWdlcworICogQGl0ZW06ICAgaXRlbSB0byBmcmVlCisgKiBAbG9jazogICBsb2NrIHByb3RlY3RpbmcgdGhlIGl0ZW0KKyAqIEBjYl9hcmc6IGNhbGxiYWNrIGFyZ3VtZW50CisgKgorICogQ2FsbGVkIGZyb20gbGlzdF9scnVfd2FsaygpIGluIGJpbmRlcl9zaHJpbmtfc2NhbigpIHRvIGZyZWUKKyAqIHVwIHBhZ2VzIHdoZW4gdGhlIHN5c3RlbSBpcyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisgKi8KK2VudW0gbHJ1X3N0YXR1cyBiaW5kZXJfYWxsb2NfZnJlZV9wYWdlKHN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sCisJCQkJICAgICAgIHN0cnVjdCBsaXN0X2xydV9vbmUgKmxydSwKKwkJCQkgICAgICAgc3BpbmxvY2tfdCAqbG9jaywKKwkJCQkgICAgICAgdm9pZCAqY2JfYXJnKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gTlVMTDsKKwlzdHJ1Y3QgYmluZGVyX2xydV9wYWdlICpwYWdlID0gY29udGFpbmVyX29mKGl0ZW0sCisJCQkJCQkgICAgc3RydWN0IGJpbmRlcl9scnVfcGFnZSwKKwkJCQkJCSAgICBscnUpOworCXN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jOworCXVpbnRwdHJfdCBwYWdlX2FkZHI7CisJc2l6ZV90IGluZGV4OworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJYWxsb2MgPSBwYWdlLT5hbGxvYzsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmFsbG9jLT5tdXRleCkpCisJCWdvdG8gZXJyX2dldF9hbGxvY19tdXRleF9mYWlsZWQ7CisKKwlpZiAoIXBhZ2UtPnBhZ2VfcHRyKQorCQlnb3RvIGVycl9wYWdlX2FscmVhZHlfZnJlZWQ7CisKKwlpbmRleCA9IHBhZ2UgLSBhbGxvYy0+cGFnZXM7CisJcGFnZV9hZGRyID0gKHVpbnRwdHJfdClhbGxvYy0+YnVmZmVyICsgaW5kZXggKiBQQUdFX1NJWkU7CisJdm1hID0gYWxsb2MtPnZtYTsKKwlpZiAodm1hKSB7CisJCW1tID0gZ2V0X3Rhc2tfbW0oYWxsb2MtPnRzayk7CisJCWlmICghbW0pCisJCQlnb3RvIGVycl9nZXRfdGFza19tbV9mYWlsZWQ7CisJCWlmICghZG93bl93cml0ZV90cnlsb2NrKCZtbS0+bW1hcF9zZW0pKQorCQkJZ290byBlcnJfZG93bl93cml0ZV9tbWFwX3NlbV9mYWlsZWQ7CisJfQorCisJbGlzdF9scnVfaXNvbGF0ZShscnUsIGl0ZW0pOworCXNwaW5fdW5sb2NrKGxvY2spOworCisJaWYgKHZtYSkgeworCQl0cmFjZV9iaW5kZXJfdW5tYXBfdXNlcl9zdGFydChhbGxvYywgaW5kZXgpOworCisJCXphcF9wYWdlX3JhbmdlKHZtYSwKKwkJCSAgICAgICBwYWdlX2FkZHIgKworCQkJICAgICAgIGFsbG9jLT51c2VyX2J1ZmZlcl9vZmZzZXQsCisJCQkgICAgICAgUEFHRV9TSVpFLCBOVUxMKTsKKworCQl0cmFjZV9iaW5kZXJfdW5tYXBfdXNlcl9lbmQoYWxsb2MsIGluZGV4KTsKKworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KKworCXRyYWNlX2JpbmRlcl91bm1hcF9rZXJuZWxfc3RhcnQoYWxsb2MsIGluZGV4KTsKKworCXVubWFwX2tlcm5lbF9yYW5nZShwYWdlX2FkZHIsIFBBR0VfU0laRSk7CisJX19mcmVlX3BhZ2UocGFnZS0+cGFnZV9wdHIpOworCXBhZ2UtPnBhZ2VfcHRyID0gTlVMTDsKKworCXRyYWNlX2JpbmRlcl91bm1hcF9rZXJuZWxfZW5kKGFsbG9jLCBpbmRleCk7CisKKwlzcGluX2xvY2sobG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhbGxvYy0+bXV0ZXgpOworCXJldHVybiBMUlVfUkVNT1ZFRF9SRVRSWTsKKworZXJyX2Rvd25fd3JpdGVfbW1hcF9zZW1fZmFpbGVkOgorCW1tcHV0X2FzeW5jKG1tKTsKK2Vycl9nZXRfdGFza19tbV9mYWlsZWQ6CitlcnJfcGFnZV9hbHJlYWR5X2ZyZWVkOgorCW11dGV4X3VubG9jaygmYWxsb2MtPm11dGV4KTsKK2Vycl9nZXRfYWxsb2NfbXV0ZXhfZmFpbGVkOgorCXJldHVybiBMUlVfU0tJUDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2JpbmRlcl9zaHJpbmtfY291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmssIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2MpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSBsaXN0X2xydV9jb3VudCgmYmluZGVyX2FsbG9jX2xydSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2JpbmRlcl9zaHJpbmtfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmluaywgc3RydWN0IHNocmlua19jb250cm9sICpzYykKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXJldCA9IGxpc3RfbHJ1X3dhbGsoJmJpbmRlcl9hbGxvY19scnUsIGJpbmRlcl9hbGxvY19mcmVlX3BhZ2UsCisJCQkgICAgTlVMTCwgc2MtPm5yX3RvX3NjYW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzaHJpbmtlciBiaW5kZXJfc2hyaW5rZXIgPSB7CisJLmNvdW50X29iamVjdHMgPSBiaW5kZXJfc2hyaW5rX2NvdW50LAorCS5zY2FuX29iamVjdHMgPSBiaW5kZXJfc2hyaW5rX3NjYW4sCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CisKKy8qKgogICogYmluZGVyX2FsbG9jX2luaXQoKSAtIGNhbGxlZCBieSBiaW5kZXJfb3BlbigpIGZvciBwZXItcHJvYyBpbml0aWFsaXphdGlvbgogICogQGFsbG9jOiBiaW5kZXJfYWxsb2MgZm9yIHRoaXMgcHJvYwogICoKQEAgLTc5OCw1ICsxMDA2LDExIEBACiAJYWxsb2MtPnRzayA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKIAlhbGxvYy0+cGlkID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyLT5waWQ7CiAJbXV0ZXhfaW5pdCgmYWxsb2MtPm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmYWxsb2MtPmJ1ZmZlcnMpOwogfQogCit2b2lkIGJpbmRlcl9hbGxvY19zaHJpbmtlcl9pbml0KHZvaWQpCit7CisJbGlzdF9scnVfaW5pdCgmYmluZGVyX2FsbG9jX2xydSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmJpbmRlcl9zaHJpbmtlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX2FsbG9jLmggYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX2FsbG9jLmgKaW5kZXggMDg4ZTRmZi4uYTNhMzYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9hbGxvYy5oCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfYWxsb2MuaApAQCAtMjEsNyArMjEsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3RfbHJ1Lmg+CiAKK2V4dGVybiBzdHJ1Y3QgbGlzdF9scnUgYmluZGVyX2FsbG9jX2xydTsKIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb247CiAKIC8qKgpAQCAtNTcsNyArNTksMTkgQEAKIAlzaXplX3QgZGF0YV9zaXplOwogCXNpemVfdCBvZmZzZXRzX3NpemU7CiAJc2l6ZV90IGV4dHJhX2J1ZmZlcnNfc2l6ZTsKLQl1aW50OF90IGRhdGFbMF07CisJdm9pZCAqZGF0YTsKK307CisKKy8qKgorICogc3RydWN0IGJpbmRlcl9scnVfcGFnZSAtIHBhZ2Ugb2JqZWN0IHVzZWQgZm9yIGJpbmRlciBzaHJpbmtlcgorICogQHBhZ2VfcHRyOiBwb2ludGVyIHRvIHBoeXNpY2FsIHBhZ2UgaW4gbW1hcCdkIHNwYWNlCisgKiBAbHJ1OiAgICAgIGVudHJ5IGluIGJpbmRlcl9hbGxvY19scnUKKyAqIEBhbGxvYzogICAgYmluZGVyX2FsbG9jIGZvciBhIHByb2MKKyAqLworc3RydWN0IGJpbmRlcl9scnVfcGFnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBscnU7CisJc3RydWN0IHBhZ2UgKnBhZ2VfcHRyOworCXN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jOwogfTsKIAogLyoqCkBAIC03NSw4ICs4OSw3IEBACiAgKiBAYWxsb2NhdGVkX2J1ZmZlcnM6ICByYiB0cmVlIG9mIGFsbG9jYXRlZCBidWZmZXJzIHNvcnRlZCBieSBhZGRyZXNzCiAgKiBAZnJlZV9hc3luY19zcGFjZTogICBWQSBzcGFjZSBhdmFpbGFibGUgZm9yIGFzeW5jIGJ1ZmZlcnMuIFRoaXMgaXMKICAqICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGF0IG1tYXAgdGltZSB0byAxLzIgdGhlIGZ1bGwgVkEgc3BhY2UKLSAqIEBwYWdlczogICAgICAgICAgICAgIGFycmF5IG9mIHBoeXNpY2FsIHBhZ2UgYWRkcmVzc2VzIGZvciBlYWNoCi0gKiAgICAgICAgICAgICAgICAgICAgICBwYWdlIG9mIG1tYXAnZCBzcGFjZQorICogQHBhZ2VzOiAgICAgICAgICAgICAgYXJyYXkgb2YgYmluZGVyX2xydV9wYWdlCiAgKiBAYnVmZmVyX3NpemU6ICAgICAgICBzaXplIG9mIGFkZHJlc3Mgc3BhY2Ugc3BlY2lmaWVkIHZpYSBtbWFwCiAgKiBAcGlkOiAgICAgICAgICAgICAgICBwaWQgZm9yIGFzc29jaWF0ZWQgYmluZGVyX3Byb2MgKGludmFyaWFudCBhZnRlciBpbml0KQogICoKQEAgLTk2LDE4ICsxMDksMjcgQEAKIAlzdHJ1Y3QgcmJfcm9vdCBmcmVlX2J1ZmZlcnM7CiAJc3RydWN0IHJiX3Jvb3QgYWxsb2NhdGVkX2J1ZmZlcnM7CiAJc2l6ZV90IGZyZWVfYXN5bmNfc3BhY2U7Ci0Jc3RydWN0IHBhZ2UgKipwYWdlczsKKwlzdHJ1Y3QgYmluZGVyX2xydV9wYWdlICpwYWdlczsKIAlzaXplX3QgYnVmZmVyX3NpemU7CiAJdWludDMyX3QgYnVmZmVyX2ZyZWU7CiAJaW50IHBpZDsKIH07CiAKKyNpZmRlZiBDT05GSUdfQU5EUk9JRF9CSU5ERVJfSVBDX1NFTEZURVNUCit2b2lkIGJpbmRlcl9zZWxmdGVzdF9hbGxvYyhzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGJpbmRlcl9zZWxmdGVzdF9hbGxvYyhzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYykge30KKyNlbmRpZgorZW51bSBscnVfc3RhdHVzIGJpbmRlcl9hbGxvY19mcmVlX3BhZ2Uoc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwKKwkJCQkgICAgICAgc3RydWN0IGxpc3RfbHJ1X29uZSAqbHJ1LAorCQkJCSAgICAgICBzcGlubG9ja190ICpsb2NrLCB2b2lkICpjYl9hcmcpOwogZXh0ZXJuIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYWxsb2NfbmV3X2J1ZihzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywKIAkJCQkJCSAgc2l6ZV90IGRhdGFfc2l6ZSwKIAkJCQkJCSAgc2l6ZV90IG9mZnNldHNfc2l6ZSwKIAkJCQkJCSAgc2l6ZV90IGV4dHJhX2J1ZmZlcnNfc2l6ZSwKIAkJCQkJCSAgaW50IGlzX2FzeW5jKTsKIGV4dGVybiB2b2lkIGJpbmRlcl9hbGxvY19pbml0KHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jKTsKK3ZvaWQgYmluZGVyX2FsbG9jX3Nocmlua2VyX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBiaW5kZXJfYWxsb2Nfdm1hX2Nsb3NlKHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jKTsKIGV4dGVybiBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqCiBiaW5kZXJfYWxsb2NfcHJlcGFyZV90b19mcmVlKHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLApAQCAtMTIwLDYgKzE0Miw4IEBACiBleHRlcm4gaW50IGJpbmRlcl9hbGxvY19nZXRfYWxsb2NhdGVkX2NvdW50KHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jKTsKIGV4dGVybiB2b2lkIGJpbmRlcl9hbGxvY19wcmludF9hbGxvY2F0ZWQoc3RydWN0IHNlcV9maWxlICptLAogCQkJCQkgc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MpOwordm9pZCBiaW5kZXJfYWxsb2NfcHJpbnRfcGFnZXMoc3RydWN0IHNlcV9maWxlICptLAorCQkJICAgICAgc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MpOwogCiAvKioKICAqIGJpbmRlcl9hbGxvY19nZXRfZnJlZV9hc3luY19zcGFjZSgpIC0gZ2V0IGZyZWUgc3BhY2UgYXZhaWxhYmxlIGZvciBhc3luYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9hbGxvY19zZWxmdGVzdC5jIGIvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9hbGxvY19zZWxmdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDdiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX2FsbG9jX3NlbGZ0ZXN0LmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qIGJpbmRlcl9hbGxvY19zZWxmdGVzdC5jCisgKgorICogQW5kcm9pZCBJUEMgU3Vic3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSAiYmluZGVyX2FsbG9jLmgiCisKKyNkZWZpbmUgQlVGRkVSX05VTSA1CisjZGVmaW5lIEJVRkZFUl9NSU5fU0laRSAoUEFHRV9TSVpFIC8gOCkKKworc3RhdGljIGJvb2wgYmluZGVyX3NlbGZ0ZXN0X3J1biA9IHRydWU7CitzdGF0aWMgaW50IGJpbmRlcl9zZWxmdGVzdF9mYWlsdXJlczsKK3N0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX3NlbGZ0ZXN0X2xvY2spOworCisvKioKKyAqIGVudW0gYnVmX2VuZF9hbGlnbl90eXBlIC0gUGFnZSBhbGlnbm1lbnQgb2YgYSBidWZmZXIKKyAqIGVuZCB3aXRoIHJlZ2FyZCB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBidWZmZXIuCisgKgorICogSW4gdGhlIHBpY3R1cmVzIGJlbG93LCBidWYyIHJlZmVycyB0byB0aGUgYnVmZmVyIHdlCisgKiBhcmUgYWxpZ25pbmcuIGJ1ZjEgcmVmZXJzIHRvIHByZXZpb3VzIGJ1ZmZlciBieSBhZGRyLgorICogU3ltYm9sIFsgbWVhbnMgdGhlIHN0YXJ0IG9mIGEgYnVmZmVyLCBdIG1lYW5zIHRoZSBlbmQKKyAqIG9mIGEgYnVmZmVyLCBhbmQgfCBtZWFucyBwYWdlIGJvdW5kYXJpZXMuCisgKi8KK2VudW0gYnVmX2VuZF9hbGlnbl90eXBlIHsKKwkvKioKKwkgKiBAU0FNRV9QQUdFX1VOQUxJR05FRDogVGhlIGVuZCBvZiB0aGlzIGJ1ZmZlciBpcyBvbgorCSAqIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYnVmZmVyIGFuZAorCSAqIGlzIG5vdCBwYWdlIGFsaWduZWQuIEV4YW1wbGVzOgorCSAqIGJ1ZjEgXVsgYnVmMiBdWyAuLi4KKwkgKiBidWYxIF18WyBidWYyIF1bIC4uLgorCSAqLworCVNBTUVfUEFHRV9VTkFMSUdORUQgPSAwLAorCS8qKgorCSAqIEBTQU1FX1BBR0VfQUxJR05FRDogV2hlbiB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBidWZmZXIKKwkgKiBpcyBub3QgcGFnZSBhbGlnbmVkLCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyIGlzIG9uIHRoZQorCSAqIHNhbWUgcGFnZSBhcyB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBidWZmZXIgYW5kIGlzIHBhZ2UKKwkgKiBhbGlnbmVkLiBXaGVuIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgcGFnZSBhbGlnbmVkLCB0aGUKKwkgKiBlbmQgb2YgdGhpcyBidWZmZXIgaXMgYWxpZ25lZCB0byB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5LgorCSAqIEV4YW1wbGVzOgorCSAqIGJ1ZjEgXVsgYnVmMiBdfCAuLi4KKwkgKiBidWYxIF18WyBidWYyIF18IC4uLgorCSAqLworCVNBTUVfUEFHRV9BTElHTkVELAorCS8qKgorCSAqIEBORVhUX1BBR0VfVU5BTElHTkVEOiBUaGUgZW5kIG9mIHRoaXMgYnVmZmVyIGlzIG9uCisJICogdGhlIHBhZ2UgbmV4dCB0byB0aGUgZW5kIG9mIHRoZSBwcmV2aW91cyBidWZmZXIgYW5kCisJICogaXMgbm90IHBhZ2UgYWxpZ25lZC4gRXhhbXBsZXM6CisJICogYnVmMSBdWyBidWYyIHwgYnVmMiBdWyAuLi4KKwkgKiBidWYxIF18WyBidWYyIHwgYnVmMiBdWyAuLi4KKwkgKi8KKwlORVhUX1BBR0VfVU5BTElHTkVELAorCS8qKgorCSAqIEBORVhUX1BBR0VfQUxJR05FRDogVGhlIGVuZCBvZiB0aGlzIGJ1ZmZlciBpcyBvbgorCSAqIHRoZSBwYWdlIG5leHQgdG8gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgYnVmZmVyIGFuZAorCSAqIGlzIHBhZ2UgYWxpZ25lZC4gRXhhbXBsZXM6CisJICogYnVmMSBdWyBidWYyIHwgYnVmMiBdfCAuLi4KKwkgKiBidWYxIF18WyBidWYyIHwgYnVmMiBdfCAuLi4KKwkgKi8KKwlORVhUX1BBR0VfQUxJR05FRCwKKwkvKioKKwkgKiBATkVYVF9ORVhUX1VOQUxJR05FRDogVGhlIGVuZCBvZiB0aGlzIGJ1ZmZlciBpcyBvbgorCSAqIHRoZSBwYWdlIHRoYXQgZm9sbG93cyB0aGUgcGFnZSBhZnRlciB0aGUgZW5kIG9mIHRoZQorCSAqIHByZXZpb3VzIGJ1ZmZlciBhbmQgaXMgbm90IHBhZ2UgYWxpZ25lZC4gRXhhbXBsZXM6CisJICogYnVmMSBdWyBidWYyIHwgYnVmMiB8IGJ1ZjIgXVsgLi4uCisJICogYnVmMSBdfFsgYnVmMiB8IGJ1ZjIgfCBidWYyIF1bIC4uLgorCSAqLworCU5FWFRfTkVYVF9VTkFMSUdORUQsCisJTE9PUF9FTkQsCit9OworCitzdGF0aWMgdm9pZCBwcl9lcnJfc2l6ZV9zZXEoc2l6ZV90ICpzaXplcywgaW50ICpzZXEpCit7CisJaW50IGk7CisKKwlwcl9lcnIoImFsbG9jIHNpemVzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsgaSsrKQorCQlwcl9jb250KCJbJXp1XSIsIHNpemVzW2ldKTsKKwlwcl9jb250KCJcbiIpOworCXByX2VycigiZnJlZSBzZXE6ICIpOworCWZvciAoaSA9IDA7IGkgPCBCVUZGRVJfTlVNOyBpKyspCisJCXByX2NvbnQoIlslZF0iLCBzZXFbaV0pOworCXByX2NvbnQoIlxuIik7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrX2J1ZmZlcl9wYWdlc19hbGxvY2F0ZWQoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCisJCQkJCSBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyLAorCQkJCQkgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcGFnZV9hZGRyLCAqZW5kOworCWludCBwYWdlX2luZGV4OworCisJZW5kID0gKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgc2l6ZSk7CisJcGFnZV9hZGRyID0gYnVmZmVyLT5kYXRhOworCWZvciAoOyBwYWdlX2FkZHIgPCBlbmQ7IHBhZ2VfYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJcGFnZV9pbmRleCA9IChwYWdlX2FkZHIgLSBhbGxvYy0+YnVmZmVyKSAvIFBBR0VfU0laRTsKKwkJaWYgKCFhbGxvYy0+cGFnZXNbcGFnZV9pbmRleF0ucGFnZV9wdHIgfHwKKwkJICAgICFsaXN0X2VtcHR5KCZhbGxvYy0+cGFnZXNbcGFnZV9pbmRleF0ubHJ1KSkgeworCQkJcHJfZXJyKCJleHBlY3QgYWxsb2MgYnV0IGlzICVzIGF0IHBhZ2UgaW5kZXggJWRcbiIsCisJCQkgICAgICAgYWxsb2MtPnBhZ2VzW3BhZ2VfaW5kZXhdLnBhZ2VfcHRyID8KKwkJCSAgICAgICAibHJ1IiA6ICJmcmVlIiwgcGFnZV9pbmRleCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9zZWxmdGVzdF9hbGxvY19idWYoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCisJCQkJICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcnNbXSwKKwkJCQkgICAgICBzaXplX3QgKnNpemVzLCBpbnQgKnNlcSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVUZGRVJfTlVNOyBpKyspIHsKKwkJYnVmZmVyc1tpXSA9IGJpbmRlcl9hbGxvY19uZXdfYnVmKGFsbG9jLCBzaXplc1tpXSwgMCwgMCwgMCk7CisJCWlmIChJU19FUlIoYnVmZmVyc1tpXSkgfHwKKwkJICAgICFjaGVja19idWZmZXJfcGFnZXNfYWxsb2NhdGVkKGFsbG9jLCBidWZmZXJzW2ldLAorCQkJCQkJICBzaXplc1tpXSkpIHsKKwkJCXByX2Vycl9zaXplX3NlcShzaXplcywgc2VxKTsKKwkJCWJpbmRlcl9zZWxmdGVzdF9mYWlsdXJlcysrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfc2VsZnRlc3RfZnJlZV9idWYoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCisJCQkJICAgICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyc1tdLAorCQkJCSAgICAgc2l6ZV90ICpzaXplcywgaW50ICpzZXEsIHNpemVfdCBlbmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsgaSsrKQorCQliaW5kZXJfYWxsb2NfZnJlZV9idWYoYWxsb2MsIGJ1ZmZlcnNbc2VxW2ldXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5kIC8gUEFHRV9TSVpFOyBpKyspIHsKKwkJLyoqCisJCSAqIEVycm9yIG1lc3NhZ2Ugb24gYSBmcmVlIHBhZ2UgY2FuIGJlIGZhbHNlIHBvc2l0aXZlCisJCSAqIGlmIGJpbmRlciBzaHJpbmtlciByYW4gZHVyaW5nIGJpbmRlcl9hbGxvY19mcmVlX2J1ZgorCQkgKiBjYWxscyBhYm92ZS4KKwkJICovCisJCWlmIChsaXN0X2VtcHR5KCZhbGxvYy0+cGFnZXNbaV0ubHJ1KSkgeworCQkJcHJfZXJyX3NpemVfc2VxKHNpemVzLCBzZXEpOworCQkJcHJfZXJyKCJleHBlY3QgbHJ1IGJ1dCBpcyAlcyBhdCBwYWdlIGluZGV4ICVkXG4iLAorCQkJICAgICAgIGFsbG9jLT5wYWdlc1tpXS5wYWdlX3B0ciA/ICJhbGxvYyIgOiAiZnJlZSIsIGkpOworCQkJYmluZGVyX3NlbGZ0ZXN0X2ZhaWx1cmVzKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9zZWxmdGVzdF9mcmVlX3BhZ2Uoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKworCXdoaWxlICgoY291bnQgPSBsaXN0X2xydV9jb3VudCgmYmluZGVyX2FsbG9jX2xydSkpKSB7CisJCWxpc3RfbHJ1X3dhbGsoJmJpbmRlcl9hbGxvY19scnUsIGJpbmRlcl9hbGxvY19mcmVlX3BhZ2UsCisJCQkgICAgICBOVUxMLCBjb3VudCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IChhbGxvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkUpOyBpKyspIHsKKwkJaWYgKGFsbG9jLT5wYWdlc1tpXS5wYWdlX3B0cikgeworCQkJcHJfZXJyKCJleHBlY3QgZnJlZSBidXQgaXMgJXMgYXQgcGFnZSBpbmRleCAlZFxuIiwKKwkJCSAgICAgICBsaXN0X2VtcHR5KCZhbGxvYy0+cGFnZXNbaV0ubHJ1KSA/CisJCQkgICAgICAgImFsbG9jIiA6ICJscnUiLCBpKTsKKwkJCWJpbmRlcl9zZWxmdGVzdF9mYWlsdXJlcysrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBiaW5kZXJfc2VsZnRlc3RfYWxsb2NfZnJlZShzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywKKwkJCQkgICAgICAgc2l6ZV90ICpzaXplcywgaW50ICpzZXEsIHNpemVfdCBlbmQpCit7CisJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcnNbQlVGRkVSX05VTV07CisKKwliaW5kZXJfc2VsZnRlc3RfYWxsb2NfYnVmKGFsbG9jLCBidWZmZXJzLCBzaXplcywgc2VxKTsKKwliaW5kZXJfc2VsZnRlc3RfZnJlZV9idWYoYWxsb2MsIGJ1ZmZlcnMsIHNpemVzLCBzZXEsIGVuZCk7CisKKwkvKiBBbGxvY2F0ZSBmcm9tIGxydS4gKi8KKwliaW5kZXJfc2VsZnRlc3RfYWxsb2NfYnVmKGFsbG9jLCBidWZmZXJzLCBzaXplcywgc2VxKTsKKwlpZiAobGlzdF9scnVfY291bnQoJmJpbmRlcl9hbGxvY19scnUpKQorCQlwcl9lcnIoImxydSBsaXN0IHNob3VsZCBiZSBlbXB0eSBidXQgaXMgbm90XG4iKTsKKworCWJpbmRlcl9zZWxmdGVzdF9mcmVlX2J1ZihhbGxvYywgYnVmZmVycywgc2l6ZXMsIHNlcSwgZW5kKTsKKwliaW5kZXJfc2VsZnRlc3RfZnJlZV9wYWdlKGFsbG9jKTsKK30KKworc3RhdGljIGJvb2wgaXNfZHVwKGludCAqc2VxLCBpbnQgaW5kZXgsIGludCB2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworCQlpZiAoc2VxW2ldID09IHZhbCkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIEdlbmVyYXRlIEJVRkZFUl9OVU0gZmFjdG9yaWFsIGZyZWUgb3JkZXJzLiAqLworc3RhdGljIHZvaWQgYmluZGVyX3NlbGZ0ZXN0X2ZyZWVfc2VxKHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLAorCQkJCSAgICAgc2l6ZV90ICpzaXplcywgaW50ICpzZXEsCisJCQkJICAgICBpbnQgaW5kZXgsIHNpemVfdCBlbmQpCit7CisJaW50IGk7CisKKwlpZiAoaW5kZXggPT0gQlVGRkVSX05VTSkgeworCQliaW5kZXJfc2VsZnRlc3RfYWxsb2NfZnJlZShhbGxvYywgc2l6ZXMsIHNlcSwgZW5kKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsgaSsrKSB7CisJCWlmIChpc19kdXAoc2VxLCBpbmRleCwgaSkpCisJCQljb250aW51ZTsKKwkJc2VxW2luZGV4XSA9IGk7CisJCWJpbmRlcl9zZWxmdGVzdF9mcmVlX3NlcShhbGxvYywgc2l6ZXMsIHNlcSwgaW5kZXggKyAxLCBlbmQpOworCX0KK30KKworc3RhdGljIHZvaWQgYmluZGVyX3NlbGZ0ZXN0X2FsbG9jX3NpemUoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCisJCQkJICAgICAgIHNpemVfdCAqZW5kX29mZnNldCkKK3sKKwlpbnQgaTsKKwlpbnQgc2VxW0JVRkZFUl9OVU1dID0gezB9OworCXNpemVfdCBmcm9udF9zaXplc1tCVUZGRVJfTlVNXTsKKwlzaXplX3QgYmFja19zaXplc1tCVUZGRVJfTlVNXTsKKwlzaXplX3QgbGFzdF9vZmZzZXQsIG9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsgaSsrKSB7CisJCWxhc3Rfb2Zmc2V0ID0gb2Zmc2V0OworCQlvZmZzZXQgPSBlbmRfb2Zmc2V0W2ldOworCQlmcm9udF9zaXplc1tpXSA9IG9mZnNldCAtIGxhc3Rfb2Zmc2V0OworCQliYWNrX3NpemVzW0JVRkZFUl9OVU0gLSBpIC0gMV0gPSBmcm9udF9zaXplc1tpXTsKKwl9CisJLyoKKwkgKiBCdWZmZXJzIHNoYXJlIHRoZSBmaXJzdCBvciBsYXN0IGZldyBwYWdlcy4KKwkgKiBPbmx5IEJVRkZFUl9OVU0gLSAxIGJ1ZmZlciBzaXplcyBhcmUgYWRqdXN0YWJsZSBzaW5jZQorCSAqIHdlIG5lZWQgb25lIGdpYW50IGJ1ZmZlciBiZWZvcmUgZ2V0dGluZyB0byB0aGUgbGFzdCBwYWdlLgorCSAqLworCWJhY2tfc2l6ZXNbMF0gKz0gYWxsb2MtPmJ1ZmZlcl9zaXplIC0gZW5kX29mZnNldFtCVUZGRVJfTlVNIC0gMV07CisJYmluZGVyX3NlbGZ0ZXN0X2ZyZWVfc2VxKGFsbG9jLCBmcm9udF9zaXplcywgc2VxLCAwLAorCQkJCSBlbmRfb2Zmc2V0W0JVRkZFUl9OVU0gLSAxXSk7CisJYmluZGVyX3NlbGZ0ZXN0X2ZyZWVfc2VxKGFsbG9jLCBiYWNrX3NpemVzLCBzZXEsIDAsIGFsbG9jLT5idWZmZXJfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJpbmRlcl9zZWxmdGVzdF9hbGxvY19vZmZzZXQoc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MsCisJCQkJCSBzaXplX3QgKmVuZF9vZmZzZXQsIGludCBpbmRleCkKK3sKKwlpbnQgYWxpZ247CisJc2l6ZV90IGVuZCwgcHJldjsKKworCWlmIChpbmRleCA9PSBCVUZGRVJfTlVNKSB7CisJCWJpbmRlcl9zZWxmdGVzdF9hbGxvY19zaXplKGFsbG9jLCBlbmRfb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKwlwcmV2ID0gaW5kZXggPT0gMCA/IDAgOiBlbmRfb2Zmc2V0W2luZGV4IC0gMV07CisJZW5kID0gcHJldjsKKworCUJVSUxEX0JVR19PTihCVUZGRVJfTUlOX1NJWkUgKiBCVUZGRVJfTlVNID49IFBBR0VfU0laRSk7CisKKwlmb3IgKGFsaWduID0gU0FNRV9QQUdFX1VOQUxJR05FRDsgYWxpZ24gPCBMT09QX0VORDsgYWxpZ24rKykgeworCQlpZiAoYWxpZ24gJSAyKQorCQkJZW5kID0gQUxJR04oZW5kLCBQQUdFX1NJWkUpOworCQllbHNlCisJCQllbmQgKz0gQlVGRkVSX01JTl9TSVpFOworCQllbmRfb2Zmc2V0W2luZGV4XSA9IGVuZDsKKwkJYmluZGVyX3NlbGZ0ZXN0X2FsbG9jX29mZnNldChhbGxvYywgZW5kX29mZnNldCwgaW5kZXggKyAxKTsKKwl9Cit9CisKKy8qKgorICogYmluZGVyX3NlbGZ0ZXN0X2FsbG9jKCkgLSBUZXN0IGFsbG9jIGFuZCBmcmVlIG9mIGJ1ZmZlciBwYWdlcy4KKyAqIEBhbGxvYzogUG9pbnRlciB0byBhbGxvYyBzdHJ1Y3QuCisgKgorICogQWxsb2NhdGUgQlVGRkVSX05VTSBidWZmZXJzIHRvIGNvdmVyIGFsbCBwYWdlIGFsaWdubWVudCBjYXNlcywKKyAqIHRoZW4gZnJlZSB0aGVtIGluIGFsbCBvcmRlcnMgcG9zc2libGUuIENoZWNrIHRoYXQgcGFnZXMgYXJlCisgKiBjb3JyZWN0bHkgYWxsb2NhdGVkLCBwdXQgb250byBscnUgd2hlbiBidWZmZXJzIGFyZSBmcmVlZCwgYW5kCisgKiBhcmUgZnJlZWQgd2hlbiBiaW5kZXJfYWxsb2NfZnJlZV9wYWdlIGlzIGNhbGxlZC4KKyAqLwordm9pZCBiaW5kZXJfc2VsZnRlc3RfYWxsb2Moc3RydWN0IGJpbmRlcl9hbGxvYyAqYWxsb2MpCit7CisJc2l6ZV90IGVuZF9vZmZzZXRbQlVGRkVSX05VTV07CisKKwlpZiAoIWJpbmRlcl9zZWxmdGVzdF9ydW4pCisJCXJldHVybjsKKwltdXRleF9sb2NrKCZiaW5kZXJfc2VsZnRlc3RfbG9jayk7CisJaWYgKCFiaW5kZXJfc2VsZnRlc3RfcnVuIHx8ICFhbGxvYy0+dm1hKQorCQlnb3RvIGRvbmU7CisJcHJfaW5mbygiU1RBUlRFRFxuIik7CisJYmluZGVyX3NlbGZ0ZXN0X2FsbG9jX29mZnNldChhbGxvYywgZW5kX29mZnNldCwgMCk7CisJYmluZGVyX3NlbGZ0ZXN0X3J1biA9IGZhbHNlOworCWlmIChiaW5kZXJfc2VsZnRlc3RfZmFpbHVyZXMgPiAwKQorCQlwcl9pbmZvKCIlZCB0ZXN0cyBGQUlMRURcbiIsIGJpbmRlcl9zZWxmdGVzdF9mYWlsdXJlcyk7CisJZWxzZQorCQlwcl9pbmZvKCJQQVNTRURcbiIpOworCitkb25lOgorCW11dGV4X3VubG9jaygmYmluZGVyX3NlbGZ0ZXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oIGIvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oCmluZGV4IDc5NjdkYjEuLjc2ZTNiOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaAorKysgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX3RyYWNlLmgKQEAgLTI5MSw2ICsyOTEsNjEgQEAKIAkJICBfX2VudHJ5LT5vZmZzZXQsIF9fZW50cnktPnNpemUpCiApOwogCitERUNMQVJFX0VWRU5UX0NMQVNTKGJpbmRlcl9scnVfcGFnZV9jbGFzcywKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywgc2l6ZV90IHBhZ2VfaW5kZXgpLAorCVRQX0FSR1MoYWxsb2MsIHBhZ2VfaW5kZXgpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoaW50LCBwcm9jKQorCQlfX2ZpZWxkKHNpemVfdCwgcGFnZV9pbmRleCkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5wcm9jID0gYWxsb2MtPnBpZDsKKwkJX19lbnRyeS0+cGFnZV9pbmRleCA9IHBhZ2VfaW5kZXg7CisJKSwKKwlUUF9wcmludGsoInByb2M9JWQgcGFnZV9pbmRleD0lenUiLAorCQkgIF9fZW50cnktPnByb2MsIF9fZW50cnktPnBhZ2VfaW5kZXgpCispOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfYWxsb2NfbHJ1X3N0YXJ0LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfYWxsb2NfbHJ1X2VuZCwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywgc2l6ZV90IHBhZ2VfaW5kZXgpLAorCVRQX0FSR1MoYWxsb2MsIHBhZ2VfaW5kZXgpKTsKKworREVGSU5FX0VWRU5UKGJpbmRlcl9scnVfcGFnZV9jbGFzcywgYmluZGVyX2ZyZWVfbHJ1X3N0YXJ0LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfZnJlZV9scnVfZW5kLAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfYWxsb2NfcGFnZV9zdGFydCwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywgc2l6ZV90IHBhZ2VfaW5kZXgpLAorCVRQX0FSR1MoYWxsb2MsIHBhZ2VfaW5kZXgpKTsKKworREVGSU5FX0VWRU5UKGJpbmRlcl9scnVfcGFnZV9jbGFzcywgYmluZGVyX2FsbG9jX3BhZ2VfZW5kLAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfdW5tYXBfdXNlcl9zdGFydCwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywgc2l6ZV90IHBhZ2VfaW5kZXgpLAorCVRQX0FSR1MoYWxsb2MsIHBhZ2VfaW5kZXgpKTsKKworREVGSU5FX0VWRU5UKGJpbmRlcl9scnVfcGFnZV9jbGFzcywgYmluZGVyX3VubWFwX3VzZXJfZW5kLAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfdW5tYXBfa2VybmVsX3N0YXJ0LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBiaW5kZXJfYWxsb2MgKmFsbG9jLCBzaXplX3QgcGFnZV9pbmRleCksCisJVFBfQVJHUyhhbGxvYywgcGFnZV9pbmRleCkpOworCitERUZJTkVfRVZFTlQoYmluZGVyX2xydV9wYWdlX2NsYXNzLCBiaW5kZXJfdW5tYXBfa2VybmVsX2VuZCwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgYmluZGVyX2FsbG9jICphbGxvYywgc2l6ZV90IHBhZ2VfaW5kZXgpLAorCVRQX0FSR1MoYWxsb2MsIHBhZ2VfaW5kZXgpKTsKKwogVFJBQ0VfRVZFTlQoYmluZGVyX2NvbW1hbmQsCiAJVFBfUFJPVE8odWludDMyX3QgY21kKSwKIAlUUF9BUkdTKGNtZCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwppbmRleCA4ZTU3NWZiLi5lM2UxMGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTI5NzEsMTAgKzI5NzEsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgYXRhX2RldmljZSAqYXRhX2ZpbmRfZGV2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBkZXZubykKIHsKIAlpZiAoIXNhdGFfcG1wX2F0dGFjaGVkKGFwKSkgewotCQlpZiAobGlrZWx5KGRldm5vIDwgYXRhX2xpbmtfbWF4X2RldmljZXMoJmFwLT5saW5rKSkpCisJCWlmIChsaWtlbHkoZGV2bm8gPj0gMCAmJgorCQkJICAgZGV2bm8gPCBhdGFfbGlua19tYXhfZGV2aWNlcygmYXAtPmxpbmspKSkKIAkJCXJldHVybiAmYXAtPmxpbmsuZGV2aWNlW2Rldm5vXTsKIAl9IGVsc2UgewotCQlpZiAobGlrZWx5KGRldm5vIDwgYXAtPm5yX3BtcF9saW5rcykpCisJCWlmIChsaWtlbHkoZGV2bm8gPj0gMCAmJgorCQkJICAgZGV2bm8gPCBhcC0+bnJfcG1wX2xpbmtzKSkKIAkJCXJldHVybiAmYXAtPnBtcF9saW5rW2Rldm5vXS5kZXZpY2VbMF07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwppbmRleCA4ZDRkOTU5Li44NzA2NTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKQEAgLTYxNiw2ICs2MTYsNyBAQAogCXsgUENJX1ZERVZJQ0UoTlZJRElBLAlQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNzNfSURFKSwJOCB9LAogCXsgUENJX1ZERVZJQ0UoTlZJRElBLAlQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNzdfSURFKSwJOCB9LAogCXsgUENJX1ZERVZJQ0UoQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSURFKSwJCTkgfSwKKwl7IFBDSV9WREVWSUNFKEFNRCwJUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0RFVl9JREUpLAk5IH0sCiAKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM2LmMKaW5kZXggNmMxNWE1NS4uZGMxMjU1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNi5jCkBAIC0yODksNiArMjg5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzNTUzNltdID0gewogCXsgUENJX1ZERVZJQ0UoQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSURFKSwgfSwKKwl7IFBDSV9WREVWSUNFKEFNRCwJUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0RFVl9JREUpLCB9LAogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCA2NDcwZWI4Li5lMzJhNzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC03MzYsNyArNzM2LDcgQEAKIAogb3V0X3VucmVnaXN0ZXI6CiAJa29iamVjdF9wdXQoJnByaXYtPmtvYmopOwotCWtmcmVlKGRydi0+cCk7CisJLyogZHJ2LT5wIGlzIGZyZWVkIGluIGRyaXZlcl9yZWxlYXNlKCkgICovCiAJZHJ2LT5wID0gTlVMTDsKIG91dF9wdXRfYnVzOgogCWJ1c19wdXQoYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jcHUuYyBiL2RyaXZlcnMvYmFzZS9jcHUuYwppbmRleCA1NTY4N2I4Li5lMTdhZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY3B1LmMKKysrIGIvZHJpdmVycy9iYXNlL2NwdS5jCkBAIC0yMDgsNiArMjA4LDU5IEBACiAKICNlbmRpZgogCitzdGF0aWMgc3NpemVfdCBzaG93X3NjaGVkX2xvYWRfYm9vc3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3NpemVfdCByYzsKKwl1bnNpZ25lZCBpbnQgYm9vc3Q7CisJc3RydWN0IGNwdSAqY3B1ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNwdSwgZGV2KTsKKwlpbnQgY3B1aWQgPSBjcHUtPmRldi5pZDsKKworCWJvb3N0ID0gcGVyX2NwdShzY2hlZF9sb2FkX2Jvb3N0LCBjcHVpZCk7CisJcmMgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCAiJWRcbiIsIGJvb3N0KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgX19yZWYgc3RvcmVfc2NoZWRfbG9hZF9ib29zdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGVycjsKKwlpbnQgYm9vc3Q7CisJc3RydWN0IGNwdSAqY3B1ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNwdSwgZGV2KTsKKwlpbnQgY3B1aWQgPSBjcHUtPmRldi5pZDsKKworCWVyciA9IGtzdHJ0b2ludChzdHJzdHJpcCgoY2hhciAqKWJ1ZiksIDAsICZib29zdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICogLTEwMCBpcyBsb3cgZW5vdWdoIHRvIGNhbmNlbCBvdXQgQ1BVJ3MgbG9hZCBhbmQgbWFrZSBpdCBuZWFyIHpyby4KKwkgKiAxMDAwIGlzIGNsb3NlIHRvIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY3B1X3V0aWxfZnJlcV97d2FsdCxwZWx0fQorCSAqIGNhbiB0YWtlIHdpdGhvdXQgb3ZlcmZsb3cuCisJICovCisJaWYgKGJvb3N0IDwgLTEwMCB8fCBib29zdCA+IDEwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJcGVyX2NwdShzY2hlZF9sb2FkX2Jvb3N0LCBjcHVpZCkgPSBib29zdDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHNjaGVkX2xvYWRfYm9vc3QsIDA2NDQsCisJCSAgIHNob3dfc2NoZWRfbG9hZF9ib29zdCwKKwkJICAgc3RvcmVfc2NoZWRfbG9hZF9ib29zdCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzY2hlZF9jcHVfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfc2NoZWRfbG9hZF9ib29zdC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjaGVkX2NwdV9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IHNjaGVkX2NwdV9hdHRycywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjb21tb25fY3B1X2F0dHJfZ3JvdXBzW10gPSB7CiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJJmNyYXNoX25vdGVfY3B1X2F0dHJfZ3JvdXAsCkBAIC0yMTUsNiArMjY4LDcgQEAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkmY3B1X2lzb2xhdGVkX2F0dHJfZ3JvdXAsCiAjZW5kaWYKKwkmc2NoZWRfY3B1X2F0dHJfZ3JvdXAsCiAJTlVMTAogfTsKIApAQCAtMjI1LDYgKzI3OSw3IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJJmNwdV9pc29sYXRlZF9hdHRyX2dyb3VwLAogI2VuZGlmCisJJnNjaGVkX2NwdV9hdHRyX2dyb3VwLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggYjBiZWI1Mi4uOTE0NDMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTk1OCw3ICs5NTgsNyBAQAogCQl0aW1lb3V0ID0gTUFYX0pJRkZZX09GRlNFVDsKIAl9CiAKLQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoJmJ1Zi0+Y29tcGxldGlvbiwKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZV90aW1lb3V0KCZidWYtPmNvbXBsZXRpb24sCiAJCQl0aW1lb3V0KTsKIAlpZiAodGltZW91dCA9PSAtRVJFU1RBUlRTWVMgfHwgIXRpbWVvdXQpIHsKIAkJcmV0dmFsID0gdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKaW5kZXggYTg0MzMyYS4uY2U2OGMxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Bvd2VyLmgKQEAgLTEzMSw2ICsxMzEsOCBAQAogLyogZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyAqLwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZHBtX2xpc3Q7CS8qIFRoZSBhY3RpdmUgZGV2aWNlIGxpc3QgKi8KIAorZXh0ZXJuIGludCBtc21fc2hvd19yZXN1bWVfaXJxX21hc2s7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqdG9fZGV2aWNlKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQogewogCXJldHVybiBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBkZXZpY2UsIHBvd2VyLmVudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwppbmRleCA0ZmM2MzM2Li5iNzU4NjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvcG1fd2FrZWlycS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgogCiAjaW5jbHVkZSAicG93ZXIuaCIKIApAQCAtOTA5LDcgKzkxMSwyMSBAQAogCiB2b2lkIHBtX3N5c3RlbV9pcnFfd2FrZXVwKHVuc2lnbmVkIGludCBpcnFfbnVtYmVyKQogeworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwljb25zdCBjaGFyICpuYW1lID0gIm51bGwiOworCiAJaWYgKHBtX3dha2V1cF9pcnEgPT0gMCkgeworCQlpZiAobXNtX3Nob3dfcmVzdW1lX2lycV9tYXNrKSB7CisJCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxX251bWJlcik7CisJCQlpZiAoZGVzYyA9PSBOVUxMKQorCQkJCW5hbWUgPSAic3RyYXkgaXJxIjsKKwkJCWVsc2UgaWYgKGRlc2MtPmFjdGlvbiAmJiBkZXNjLT5hY3Rpb24tPm5hbWUpCisJCQkJbmFtZSA9IGRlc2MtPmFjdGlvbi0+bmFtZTsKKworCQkJcHJfd2FybigiJXM6ICVkIHRyaWdnZXJlZCAlc1xuIiwgX19mdW5jX18sCisJCQkJCWlycV9udW1iZXIsIG5hbWUpOworCisJCX0KIAkJcG1fd2FrZXVwX2lycSA9IGlycV9udW1iZXI7CiAJCXBtX3N5c3RlbV93YWtldXAoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYyBiL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCmluZGV4IDQzYTM2ZDYuLjA2ZjY2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCkBAIC0xODIsMTEgKzE4MiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBmd25vZGVfaGFuZGxlICpkZXZfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0cnVjdCBmd25vZGVfaGFuZGxlICpkZXZfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gSVNfRU5BQkxFRChDT05GSUdfT0YpICYmIGRldi0+b2Zfbm9kZSA/CiAJCSZkZXYtPm9mX25vZGUtPmZ3bm9kZSA6IGRldi0+Zndub2RlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2X2Z3bm9kZSk7CiAKIC8qKgogICogZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQgLSBjaGVjayBpZiBhIHByb3BlcnR5IG9mIGEgZGV2aWNlIGlzIHByZXNlbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvS2NvbmZpZwppbmRleCBmYzgxNGEzLi40NWZjNTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9LY29uZmlnCkBAIC0zMiwzICszMiwxMiBAQAogCiBjb25maWcgUkVHTUFQX1NXUgogCXRyaXN0YXRlCisKK2NvbmZpZyBSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUworCWRlcGVuZHMgb24gUkVHTUFQICYmIERFQlVHX0ZTCisJYm9vbCAiQWxsb3cgUkVHTUFQIGRlYnVnZnMgd3JpdGUiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5ICd5JyBoZXJlIHRvIGFsbG93IHRoZSByZWdtYXAgZGVidWdmcyB3cml0ZS4gUmVnbWFwIGRlYnVnZnMgd3JpdGUKKwkgIGNvdWxkIGJlIHJpc2t5IHdoZW4gYWNjZXNzaW5nIHNvbWUgZXNzZW50aWFsIGhhcmR3YXJlcywgc28gaXQgaXMgbm90CisJICByZWNvbW1lbmRlZCB0byBlbmFibGUgdGhpcyBvcHRpb24gb24gYW55IHByb2R1Y3Rpb24gZGV2aWNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCmluZGV4IGI0YzUyMjQuLjE1NTkwNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKQEAgLTI2OSw4ICsyNjksNyBAQAogCQkJCSAgIGNvdW50LCBwcG9zKTsKIH0KIAotI2RlZmluZSBSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUwotI2lmZGVmIFJFR01BUF9BTExPV19XUklURV9ERUJVR0ZTCisjaWZkZWYgQ09ORklHX1JFR01BUF9BTExPV19XUklURV9ERUJVR0ZTCiAvKgogICogVGhpcyBjYW4gYmUgZGFuZ2Vyb3VzIGVzcGVjaWFsbHkgd2hlbiB3ZSBoYXZlIGNsaWVudHMgc3VjaCBhcwogICogUE1JQ3MsIHRoZXJlZm9yZSBkb24ndCBwcm92aWRlIGFueSByZWFsIGNvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uIG9wdGlvbgpAQCAtMzQwLDcgKzMzOSw3IEBACiAJCQluZXdfY291bnQsIHBwb3MpOwogfQogCi0jaWZkZWYgUkVHTUFQX0FMTE9XX1dSSVRFX0RFQlVHRlMKKyNpZmRlZiBDT05GSUdfUkVHTUFQX0FMTE9XX1dSSVRFX0RFQlVHRlMKIHN0YXRpYyBzc2l6ZV90IHJlZ21hcF9kYXRhX3dyaXRlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTYzMyw3ICs2MzIsNyBAQAogCWlmIChtYXAtPm1heF9yZWdpc3RlciB8fCByZWdtYXBfcmVhZGFibGUobWFwLCAwKSkgewogCQl1bW9kZV90IHJlZ2lzdGVyc19tb2RlOwogCi0jaWYgZGVmaW5lZChSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUykKKyNpZmRlZiBDT05GSUdfUkVHTUFQX0FMTE9XX1dSSVRFX0RFQlVHRlMKIAkJcmVnaXN0ZXJzX21vZGUgPSAwNjAwOwogI2Vsc2UKIAkJcmVnaXN0ZXJzX21vZGUgPSAwNDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtc3dyLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zd3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxZWIwMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1zd3IuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kd2lyZS9zb3VuZHdpcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi1zdGF0aWMgaW50IHJlZ21hcF9zd3JfZ2F0aGVyX3dyaXRlKHZvaWQgKmNvbnRleHQsCi0JCQkJY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkJY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCBzd3JfZGV2aWNlICpzd3IgPSB0b19zd3JfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHJlZ21hcCAqbWFwID0gZGV2X2dldF9yZWdtYXAoZGV2LCBOVUxMKTsKLQlzaXplX3QgYWRkcl9ieXRlczsKLQlzaXplX3QgdmFsX2J5dGVzOwotCWludCBpLCByZXQgPSAwOwotCXUxNiByZWdfYWRkciA9IDA7Ci0JdTggKnZhbHVlOwotCi0JaWYgKG1hcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ21hcCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOwotCWlmIChzd3IgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBzd3IgZGV2aWNlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChyZWdfc2l6ZSAhPSBhZGRyX2J5dGVzKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZyBzaXplICV6ZCBieXRlcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIHJlZ19zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJlZ19hZGRyID0gKih1MTYgKilyZWc7Ci0JdmFsX2J5dGVzID0gbWFwLT5mb3JtYXQudmFsX2J5dGVzOwotCS8qIHZhbF9sZW4gPSB2YWxfYnl0ZXMgKiB2YWxfY291bnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKHZhbF9sZW4gLyB2YWxfYnl0ZXMpOyBpKyspIHsKLQkJdmFsdWUgPSAodTggKil2YWwgKyAodmFsX2J5dGVzICogaSk7Ci0JCXJldCA9IHN3cl93cml0ZShzd3IsIHN3ci0+ZGV2X251bSwgKHJlZ19hZGRyICsgaSksIHZhbHVlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IHdyaXRlIHJlZyAweCV4IGZhaWxlZCwgZXJyICVkXG4iLAotCQkJCV9fZnVuY19fLCAocmVnX2FkZHIgKyBpKSwgcmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnbWFwX3N3cl9yYXdfbXVsdGlfcmVnX3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkJCSAgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3ciA9IHRvX3N3cl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBkZXZfZ2V0X3JlZ21hcChkZXYsIE5VTEwpOwotCXNpemVfdCBhZGRyX2J5dGVzOwotCXNpemVfdCB2YWxfYnl0ZXM7Ci0Jc2l6ZV90IHBhZF9ieXRlczsKLQlzaXplX3QgbnVtX3JlZ3M7Ci0JaW50IGkgPSAwOwotCWludCByZXQgPSAwOwotCXUxNiAqcmVnOwotCXU4ICp2YWw7Ci0JdTggKmJ1ZjsKLQotCWlmIChzd3IgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBzd3IgZGV2aWNlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG1hcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ21hcCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFkZHJfYnl0ZXMgPSBtYXAtPmZvcm1hdC5yZWdfYnl0ZXM7Ci0JdmFsX2J5dGVzID0gbWFwLT5mb3JtYXQudmFsX2J5dGVzOwotCXBhZF9ieXRlcyA9IG1hcC0+Zm9ybWF0LnBhZF9ieXRlczsKLQotCWlmIChhZGRyX2J5dGVzICsgdmFsX2J5dGVzICsgcGFkX2J5dGVzID09IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogc3VtIG9mIGFkZHIsIHZhbHVlIGFuZCBwYWQgaXMgMFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbnVtX3JlZ3MgPSBjb3VudCAvIChhZGRyX2J5dGVzICsgdmFsX2J5dGVzICsgcGFkX2J5dGVzKTsKLQotCXJlZyA9IGtjYWxsb2MobnVtX3JlZ3MsIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl2YWwgPSBrY2FsbG9jKG51bV9yZWdzLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXZhbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG1lbV9mYWlsOwotCX0KLQotCWJ1ZiA9ICh1OCAqKWRhdGE7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKLQkJcmVnW2ldID0gKih1MTYgKilidWY7Ci0JCWJ1ZiArPSAobWFwLT5mb3JtYXQucmVnX2J5dGVzICsgbWFwLT5mb3JtYXQucGFkX2J5dGVzKTsKLQkJdmFsW2ldID0gKmJ1ZjsKLQkJYnVmICs9IG1hcC0+Zm9ybWF0LnZhbF9ieXRlczsKLQl9Ci0JcmV0ID0gc3dyX2J1bGtfd3JpdGUoc3dyLCBzd3ItPmRldl9udW0sIHJlZywgdmFsLCBudW1fcmVncyk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihkZXYsICIlczogbXVsdGkgcmVnIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0Ja2ZyZWUodmFsKTsKLW1lbV9mYWlsOgotCWtmcmVlKHJlZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWdtYXBfc3dyX3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGRldl9nZXRfcmVnbWFwKGRldiwgTlVMTCk7Ci0Jc2l6ZV90IGFkZHJfYnl0ZXM7Ci0Jc2l6ZV90IHZhbF9ieXRlczsKLQlzaXplX3QgcGFkX2J5dGVzOwotCi0JaWYgKG1hcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ21hcCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOwotCXZhbF9ieXRlcyA9IG1hcC0+Zm9ybWF0LnZhbF9ieXRlczsKLQlwYWRfYnl0ZXMgPSBtYXAtPmZvcm1hdC5wYWRfYnl0ZXM7Ci0KLQlXQVJOX09OKGNvdW50IDwgYWRkcl9ieXRlcyk7Ci0KLQlpZiAoY291bnQgPiAoYWRkcl9ieXRlcyArIHZhbF9ieXRlcyArIHBhZF9ieXRlcykpCi0JCXJldHVybiByZWdtYXBfc3dyX3Jhd19tdWx0aV9yZWdfd3JpdGUoY29udGV4dCwgZGF0YSwgY291bnQpOwotCWVsc2UKLQkJcmV0dXJuIHJlZ21hcF9zd3JfZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIGFkZHJfYnl0ZXMsCi0JCQkJCSAgICAgICAoZGF0YSArIGFkZHJfYnl0ZXMpLAotCQkJCQkgICAgICAgKGNvdW50IC0gYWRkcl9ieXRlcykpOwotfQotCi1zdGF0aWMgaW50IHJlZ21hcF9zd3JfcmVhZCh2b2lkICpjb250ZXh0LAotCQkJY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQl2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCBzd3JfZGV2aWNlICpzd3IgPSB0b19zd3JfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHJlZ21hcCAqbWFwID0gZGV2X2dldF9yZWdtYXAoZGV2LCBOVUxMKTsKLQlzaXplX3QgYWRkcl9ieXRlczsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgcmVnX2FkZHIgPSAwOwotCi0JaWYgKG1hcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ21hcCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhZGRyX2J5dGVzID0gbWFwLT5mb3JtYXQucmVnX2J5dGVzOwotCWlmIChzd3IgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBzd3IgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHJlZ19zaXplICE9IGFkZHJfYnl0ZXMpIHsKLQkJZGV2X2VycihkZXYsICIlczogcmVnaXN0ZXIgc2l6ZSAlemQgYnl0ZXMgbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCByZWdfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZWdfYWRkciA9ICoodTE2ICopcmVnOwotCXJldCA9IHN3cl9yZWFkKHN3ciwgc3dyLT5kZXZfbnVtLCByZWdfYWRkciwgdmFsLCB2YWxfc2l6ZSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZGV2LCAiJXM6IGNvZGVjIHJlZyAweCV4IHJlYWQgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJlZ19hZGRyLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfc3dyID0gewotCS53cml0ZSA9IHJlZ21hcF9zd3Jfd3JpdGUsCi0JLmdhdGhlcl93cml0ZSA9IHJlZ21hcF9zd3JfZ2F0aGVyX3dyaXRlLAotCS5yZWFkID0gcmVnbWFwX3N3cl9yZWFkLAotCS5yZWdfZm9ybWF0X2VuZGlhbl9kZWZhdWx0ID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCi0JLnZhbF9mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKLX07Ci0KLXN0cnVjdCByZWdtYXAgKl9fcmVnbWFwX2luaXRfc3dyKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IsCi0JCQkJIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcsCi0JCQkJIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqbG9ja19rZXksCi0JCQkJIGNvbnN0IGNoYXIgKmxvY2tfbmFtZSkKLXsKLQlyZXR1cm4gX19yZWdtYXBfaW5pdCgmc3dyLT5kZXYsICZyZWdtYXBfc3dyLCAmc3dyLT5kZXYsIGNvbmZpZywKLQkJCSAgIGxvY2tfa2V5LCBsb2NrX25hbWUpOwotfQotRVhQT1JUX1NZTUJPTChfX3JlZ21hcF9pbml0X3N3cik7Ci0KLXN0cnVjdCByZWdtYXAgKl9fZGV2bV9yZWdtYXBfaW5pdF9zd3Ioc3RydWN0IHN3cl9kZXZpY2UgKnN3ciwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnLAotCQkJCSAgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqbG9ja19rZXksCi0JCQkJICAgICAgY29uc3QgY2hhciAqbG9ja19uYW1lKQotewotCXJldHVybiBfX2Rldm1fcmVnbWFwX2luaXQoJnN3ci0+ZGV2LCAmcmVnbWFwX3N3ciwgJnN3ci0+ZGV2LCBjb25maWcsCi0JCQkJbG9ja19rZXksIGxvY2tfbmFtZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fZGV2bV9yZWdtYXBfaW5pdF9zd3IpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCBjOTQ0MWY5Li45OGI3NjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTkyOSw2ICs5MjksNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBuYmRzX21heDsgaSsrKSB7CisJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOwogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGFsbG9jX2Rpc2soMSA8PCBwYXJ0X3NoaWZ0KTsKIAkJaWYgKCFkaXNrKQogCQkJZ290byBvdXQ7CkBAIC05NTQsMTIgKzk1NSwxMyBAQAogCQkgKiBldmVyeSBnZW5kaXNrIHRvIGhhdmUgaXRzIHZlcnkgb3duIHJlcXVlc3RfcXVldWUgc3RydWN0LgogCQkgKiBUaGVzZSBzdHJ1Y3RzIGFyZSBiaWcgc28gd2UgZHluYW1pY2FsbHkgYWxsb2NhdGUgdGhlbS4KIAkJICovCi0JCWRpc2stPnF1ZXVlID0gYmxrX21xX2luaXRfcXVldWUoJm5iZF9kZXZbaV0udGFnX3NldCk7Ci0JCWlmICghZGlzay0+cXVldWUpIHsKKwkJcSA9IGJsa19tcV9pbml0X3F1ZXVlKCZuYmRfZGV2W2ldLnRhZ19zZXQpOworCQlpZiAoSVNfRVJSKHEpKSB7CiAJCQlibGtfbXFfZnJlZV90YWdfc2V0KCZuYmRfZGV2W2ldLnRhZ19zZXQpOwogCQkJcHV0X2Rpc2soZGlzayk7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlkaXNrLT5xdWV1ZSA9IHE7CiAKIAkJLyoKIAkJICogVGVsbCB0aGUgYmxvY2sgbGF5ZXIgdGhhdCB3ZSBhcmUgbm90IGEgcm90YXRpb25hbCBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKaW5kZXggM2MzYjhmNi4uMTAzMzJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay92aXJ0aW9fYmxrLmMKQEAgLTYzMCwxMSArNjMwLDEyIEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfcHV0X2Rpc2s7CiAKLQlxID0gdmJsay0+ZGlzay0+cXVldWUgPSBibGtfbXFfaW5pdF9xdWV1ZSgmdmJsay0+dGFnX3NldCk7CisJcSA9IGJsa19tcV9pbml0X3F1ZXVlKCZ2YmxrLT50YWdfc2V0KTsKIAlpZiAoSVNfRVJSKHEpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2ZyZWVfdGFnczsKIAl9CisJdmJsay0+ZGlzay0+cXVldWUgPSBxOwogCiAJcS0+cXVldWVkYXRhID0gdmJsazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKaW5kZXggOTkwODU5Ny4uZjExZDYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCkBAIC0yMTEyLDkgKzIxMTIsOSBAQAogCQkJLyoKIAkJCSAqIEdldCB0aGUgYmlvcyBpbiB0aGUgcmVxdWVzdCBzbyB3ZSBjYW4gcmUtcXVldWUgdGhlbS4KIAkJCSAqLwotCQkJaWYgKHJlcV9vcChzaGFkb3dbaV0ucmVxdWVzdCkgPT0gUkVRX09QX0ZMVVNIIHx8Ci0JCQkgICAgcmVxX29wKHNoYWRvd1tpXS5yZXF1ZXN0KSA9PSBSRVFfT1BfRElTQ0FSRCB8fAotCQkJICAgIHJlcV9vcChzaGFkb3dbaV0ucmVxdWVzdCkgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSB8fAorCQkJaWYgKHJlcV9vcChzaGFkb3dbal0ucmVxdWVzdCkgPT0gUkVRX09QX0ZMVVNIIHx8CisJCQkgICAgcmVxX29wKHNoYWRvd1tqXS5yZXF1ZXN0KSA9PSBSRVFfT1BfRElTQ0FSRCB8fAorCQkJICAgIHJlcV9vcChzaGFkb3dbal0ucmVxdWVzdCkgPT0gUkVRX09QX1NFQ1VSRV9FUkFTRSB8fAogCQkJICAgIHNoYWRvd1tqXS5yZXF1ZXN0LT5jbWRfZmxhZ3MgJiBSRVFfRlVBKSB7CiAJCQkJLyoKIAkJCQkgKiBGbHVzaCBvcGVyYXRpb25zIGRvbid0IGNvbnRhaW4gYmlvcywgc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCmluZGV4IGRkMjIwZmEuLjc0ZTY3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwpAQCAtMzQyLDYgKzM0Miw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzNDEwKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUkVBTFRFSyB9LAogCXsgVVNCX0RFVklDRSgweDEzZDMsIDB4MzQxNiksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFQUxURUsgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDM0NTkpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9SRUFMVEVLIH0sCisJeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzNDk0KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUkVBTFRFSyB9LAogCiAJLyogQWRkaXRpb25hbCBSZWFsdGVrIDg4MjFBRSBCbHVldG9vdGggZGV2aWNlcyAqLwogCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTdkYyksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1JFQUxURUsgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZHNwcnBjLmMgYi9kcml2ZXJzL2NoYXIvYWRzcHJwYy5jCmluZGV4IDYzNmM5ODIuLjg5YmY3YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZHNwcnBjLmMKKysrIGIvZHJpdmVycy9jaGFyL2Fkc3BycGMuYwpAQCAtNjAsNiArNjAsNyBAQAogI2RlZmluZSBOVU1fU0VTU0lPTlMJOQkvKjggY29tcHV0ZSwgMSBjcHoqLwogI2RlZmluZSBNX0ZETElTVAkoMTYpCiAjZGVmaW5lIE1fQ1JDTElTVAkoNjQpCisjZGVmaW5lIFNFU1NJT05fSURfSU5ERVggKDMwKQogCiAjZGVmaW5lIElTX0NBQ0hFX0FMSUdORUQoeCkgKCgoeCkgJiAoKEwxX0NBQ0hFX0JZVEVTKS0xKSkgPT0gMCkKIApAQCAtMjgyLDYgKzI4Myw3IEBACiAJc3RydWN0IGZhc3RycGNfc2Vzc2lvbl9jdHggKnNlY3NjdHg7CiAJdWludDMyX3QgbW9kZTsKIAl1aW50MzJfdCBwcm9maWxlOworCWludCBzZXNzaW9uaWQ7CiAJaW50IHRnaWQ7CiAJaW50IGNpZDsKIAlpbnQgc3NyY291bnQ7CkBAIC04NjAsNyArODYyLDcgQEAKIAl9CiAJY3R4LT5yZXR2YWwgPSAtMTsKIAljdHgtPnBpZCA9IGN1cnJlbnQtPnBpZDsKLQljdHgtPnRnaWQgPSBjdXJyZW50LT50Z2lkOworCWN0eC0+dGdpZCA9IGZsLT50Z2lkOwogCWluaXRfY29tcGxldGlvbigmY3R4LT53b3JrKTsKIAogCXNwaW5fbG9jaygmZmwtPmhsb2NrKTsKQEAgLTEzNTEsOCArMTM1MywxMCBAQAogCVZFUklGWShlcnIsIDAgIT0gY2hhbm5lbF9jdHgtPmNoYW4pOwogCWlmIChlcnIpCiAJCWdvdG8gYmFpbDsKLQltc2ctPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJbXNnLT5waWQgPSBmbC0+dGdpZDsKIAltc2ctPnRpZCA9IGN1cnJlbnQtPnBpZDsKKwlpZiAoZmwtPnNlc3Npb25pZCkKKwkJbXNnLT50aWQgfD0gKDEgPDwgU0VTU0lPTl9JRF9JTkRFWCk7CiAJaWYgKGtlcm5lbCkKIAkJbXNnLT5waWQgPSAwOwogCW1zZy0+aW52b2tlLmhlYWRlci5jdHggPSBwdHJfdG9fdWludDY0KGN0eCkgfCBmbC0+cGQ7CkBAIC0xNDA3LDYgKzE0MTEsNyBAQAogCWlmIChmbC0+cHJvZmlsZSkKIAkJZ2V0bnN0aW1lb2ZkYXkoJmludm9rZXQpOwogCisKIAlWRVJJRlkoZXJyLCBmbC0+c2N0eCAhPSBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGJhaWw7CkBAIC0xNTA0LDcgKzE1MDksNyBAQAogCQlnb3RvIGJhaWw7CiAJaWYgKGluaXQtPmZsYWdzID09IEZBU1RSUENfSU5JVF9BVFRBQ0gpIHsKIAkJcmVtb3RlX2FyZ190IHJhWzFdOwotCQlpbnQgdGdpZCA9IGN1cnJlbnQtPnRnaWQ7CisJCWludCB0Z2lkID0gZmwtPnRnaWQ7CiAKIAkJcmFbMF0uYnVmLnB2ID0gKHZvaWQgKikmdGdpZDsKIAkJcmFbMF0uYnVmLmxlbiA9IHNpemVvZih0Z2lkKTsKQEAgLTE1MzIsNyArMTUzNyw3IEBACiAJCQlpbnQgc2lnbGVuOwogCQl9IGluYnVmOwogCi0JCWluYnVmLnBnaWQgPSBjdXJyZW50LT50Z2lkOworCQlpbmJ1Zi5wZ2lkID0gZmwtPnRnaWQ7CiAJCWluYnVmLm5hbWVsZW4gPSBzdHJsZW4oY3VycmVudC0+Y29tbSkgKyAxOwogCQlpbmJ1Zi5maWxlbGVuID0gaW5pdC0+ZmlsZWxlbjsKIAkJZmwtPnBkID0gMTsKQEAgLTE2NDUsNyArMTY1MCw3IEBACiAJCXVpbnRwdHJfdCB2YWRkcm91dDsKIAl9IHJvdXRhcmdzOwogCi0JaW5hcmdzLnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJaW5hcmdzLnBpZCA9IGZsLT50Z2lkOwogCWluYXJncy52YWRkcmluID0gKHVpbnRwdHJfdCltYXAtPnZhOwogCWluYXJncy5mbGFncyA9IGZsYWdzOwogCWluYXJncy5udW0gPSBmbC0+YXBwcy0+Y29tcGF0ID8gbnVtICogc2l6ZW9mKHBhZ2UpIDogbnVtOwpAQCAtMTY4Nyw3ICsxNjkyLDcgQEAKIAkJc3NpemVfdCBzaXplOwogCX0gaW5hcmdzOwogCi0JaW5hcmdzLnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJaW5hcmdzLnBpZCA9IGZsLT50Z2lkOwogCWluYXJncy5zaXplID0gbWFwLT5zaXplOwogCWluYXJncy52YWRkcm91dCA9IG1hcC0+cmFkZHI7CiAJcmFbMF0uYnVmLnB2ID0gKHZvaWQgKikmaW5hcmdzOwpAQCAtMTgxNywxOCArMTgyMiw2MiBAQAogewogfQogCitzdGF0aWMgaW50IGZhc3RycGNfc2VhcmNoX2N0eCh1aW50NjRfdCByY3R4KQoreworCXN0cnVjdCBmYXN0cnBjX2FwcHMgKm1lID0gJmdmYTsKKwlzdHJ1Y3QgZmFzdHJwY19maWxlICpmbDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwgKm07CisJc3RydWN0IHNtcV9pbnZva2VfY3R4ICppY3R4ID0gTlVMTDsKKwlzdHJ1Y3Qgc21xX2ludm9rZV9jdHggKmN0eDsKKwlpbnQgYmZvdW5kID0gMDsKKworCWN0eCA9IChzdHJ1Y3Qgc21xX2ludm9rZV9jdHggKikodWludDY0X3RvX3B0cihyY3R4KSk7CisJaWYgKCFjdHgpCisJCXJldHVybiBiZm91bmQ7CisKKwlzcGluX2xvY2soJm1lLT5obG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmbCwgbiwgJm1lLT5kcml2ZXJzLCBobikgeworCQlpZiAoY3R4LT5mbCAhPSBmbCkKKwkJCWNvbnRpbnVlOworCQlzcGluX2xvY2soJmZsLT5obG9jayk7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaWN0eCwgbSwgJmZsLT5jbHN0LnBlbmRpbmcsIGhuKSB7CisJCQlpZiAocHRyX3RvX3VpbnQ2NChpY3R4KSA9PSByY3R4KSB7CisJCQkJYmZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGljdHgsIG0sICZmbC0+Y2xzdC5pbnRlcnJ1cHRlZCwgaG4pIHsKKwkJCWlmIChwdHJfdG9fdWludDY0KGljdHgpID09IHJjdHgpIHsKKwkJCQliZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZmbC0+aGxvY2spOworCQlpZiAoYmZvdW5kKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZtZS0+aGxvY2spOworCXJldHVybiBiZm91bmQ7Cit9CisKIHZvaWQgZmFzdHJwY19nbGlua19ub3RpZnlfcngodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAogCWNvbnN0IHZvaWQgKnBrdF9wcml2LCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBzbXFfaW52b2tlX3JzcCAqcnNwID0gKHN0cnVjdCBzbXFfaW52b2tlX3JzcCAqKXB0cjsKLQlpbnQgbGVuID0gc2l6ZTsKKwlpbnQgYmZvdW5kID0gMDsKIAotCXdoaWxlIChsZW4gPj0gc2l6ZW9mKCpyc3ApICYmIHJzcCkgewotCQlyc3AtPmN0eCA9IHJzcC0+Y3R4ICYgfjE7Ci0JCWNvbnRleHRfbm90aWZ5X3VzZXIodWludDY0X3RvX3B0cihyc3AtPmN0eCksIHJzcC0+cmV0dmFsKTsKLQkJcnNwKys7Ci0JCWxlbiA9IGxlbiAtIHNpemVvZigqcnNwKTsKKwlpZiAoIXJzcCB8fCAoc2l6ZSA8IHNpemVvZigqcnNwKSkpCisJCWdvdG8gYmFpbDsKKworCWJmb3VuZCA9IGZhc3RycGNfc2VhcmNoX2N0eCgodWludDY0X3QpKHJzcC0+Y3R4ICYgfjEpKTsKKwlpZiAoIWJmb3VuZCkgeworCQlwcl9lcnIoImFkc3BycGM6IGludmFsaWQgY29udGV4dCAlcEtcbiIsICh2b2lkICopcnNwLT5jdHgpOworCQlnb3RvIGJhaWw7CiAJfQorCisJcnNwLT5jdHggPSByc3AtPmN0eCAmIH4xOworCWNvbnRleHRfbm90aWZ5X3VzZXIodWludDY0X3RvX3B0cihyc3AtPmN0eCksIHJzcC0+cmV0dmFsKTsKK2JhaWw6CiAJZ2xpbmtfcnhfZG9uZShoYW5kbGUsIHB0ciwgdHJ1ZSk7CiB9CiAKQEAgLTE4OTQsNiArMTk0Myw4IEBACiAJCXJldHVybiAwOwogCWNpZCA9IGZsLT5jaWQ7CiAKKwkodm9pZClmYXN0cnBjX3JlbGVhc2VfY3VycmVudF9kc3BfcHJvY2VzcyhmbCk7CisKIAlzcGluX2xvY2soJmZsLT5hcHBzLT5obG9jayk7CiAJaGxpc3RfZGVsX2luaXQoJmZsLT5obik7CiAJc3Bpbl91bmxvY2soJmZsLT5hcHBzLT5obG9jayk7CkBAIC0xOTAyLDcgKzE5NTMsNiBAQAogCQlrZnJlZShmbCk7CiAJCXJldHVybiAwOwogCX0KLQkodm9pZClmYXN0cnBjX3JlbGVhc2VfY3VycmVudF9kc3BfcHJvY2VzcyhmbCk7CiAJc3Bpbl9sb2NrKCZmbC0+aGxvY2spOwogCWZsLT5maWxlX2Nsb3NlID0gMTsKIAlzcGluX3VubG9jaygmZmwtPmhsb2NrKTsKQEAgLTIyMjYsNiArMjI3Niw3IEBACiAJSU5JVF9ITElTVF9IRUFEKCZmbC0+bWFwcyk7CiAJSU5JVF9ITElTVF9IRUFEKCZmbC0+YnVmcyk7CiAJSU5JVF9ITElTVF9OT0RFKCZmbC0+aG4pOworCWZsLT5zZXNzaW9uaWQgPSAwOwogCWZsLT50Z2lkID0gY3VycmVudC0+dGdpZDsKIAlmbC0+YXBwcyA9IG1lOwogCWZsLT5tb2RlID0gRkFTVFJQQ19NT0RFX1NFUklBTDsKQEAgLTIzODYsNiArMjQzNywxMCBAQAogCQljYXNlIEZBU1RSUENfTU9ERV9QUk9GSUxFOgogCQkJZmwtPnByb2ZpbGUgPSAodWludDMyX3QpaW9jdGxfcGFyYW07CiAJCQlicmVhazsKKwkJY2FzZSBGQVNUUlBDX01PREVfU0VTU0lPTjoKKwkJCWZsLT5zZXNzaW9uaWQgPSAxOworCQkJZmwtPnRnaWQgfD0gKDEgPDwgU0VTU0lPTl9JRF9JTkRFWCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FTk9UVFk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZHNwcnBjX3NoYXJlZC5oIGIvZHJpdmVycy9jaGFyL2Fkc3BycGNfc2hhcmVkLmgKaW5kZXggOWY5NjRkMi4uMmU4YmZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2Fkc3BycGNfc2hhcmVkLmgKKysrIGIvZHJpdmVycy9jaGFyL2Fkc3BycGNfc2hhcmVkLmgKQEAgLTUyLDYgKzUyLDkgQEAKIC8qIERyaXZlciBzaG91bGQgb3BlcmF0ZSBpbiBwcm9maWxlIG1vZGUgd2l0aCB0aGUgY28tcHJvY2Vzc29yICovCiAjZGVmaW5lIEZBU1RSUENfTU9ERV9QUk9GSUxFICAgICAyCiAKKy8qIFNldCBGYXN0UlBDIHNlc3Npb24gSUQgdG8gMSAqLworI2RlZmluZSBGQVNUUlBDX01PREVfU0VTU0lPTiAgICAgNAorCiAvKiBJTklUIGEgbmV3IHByb2Nlc3Mgb3IgYXR0YWNoIHRvIGd1ZXN0b3MgKi8KICNkZWZpbmUgRkFTVFJQQ19JTklUX0FUVEFDSCAgICAgIDAKICNkZWZpbmUgRkFTVFJQQ19JTklUX0NSRUFURSAgICAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdfbWFza3MuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdfbWFza3MuYwppbmRleCBkNzM0ZTI5Li5lZTc2ZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnX21hc2tzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ19tYXNrcy5jCkBAIC0xOTgyLDcgKzE5ODIsOCBAQAogCiB2b2lkIGRpYWdfc2VuZF91cGRhdGVzX3BlcmlwaGVyYWwodWludDhfdCBwZXJpcGhlcmFsKQogewotCWRpYWdfc2VuZF9mZWF0dXJlX21hc2tfdXBkYXRlKHBlcmlwaGVyYWwpOworCWlmICghZHJpdmVyLT5mZWF0dXJlW3BlcmlwaGVyYWxdLnNlbnRfZmVhdHVyZV9tYXNrKQorCQlkaWFnX3NlbmRfZmVhdHVyZV9tYXNrX3VwZGF0ZShwZXJpcGhlcmFsKTsKIAkvKgogCSAqIE1hc2tzIChGMywgbG9ncyBhbmQgZXZlbnRzKSB3aWxsIGJlIHNlbnQgdG8KIAkgKiBwZXJpcGhlcmFsIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBmZWF0dXJlIG1hc2sgdXBkYXRlIG9ubHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyLmggYi9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnY2hhci5oCmluZGV4IGFjM2MxZmQuLmM5YWU2ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyLmgKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2NoYXIuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgImRpYWdmd2RfYnJpZGdlLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyX2NvcmUuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdjaGFyX2NvcmUuYwppbmRleCAxOGY5NDFkLi41NDNmMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnY2hhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2NoYXJfY29yZS5jCkBAIC0yMzY4LDcgKzIzNjgsOSBAQAogCQltdXRleF91bmxvY2soJmRyaXZlci0+ZGNpX211dGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBESUFHX0lPQ1RMX0RDSV9FVkVOVF9TVEFUVVM6CisJCW11dGV4X2xvY2soJmRyaXZlci0+ZGNpX211dGV4KTsKIAkJcmVzdWx0ID0gZGlhZ19pb2N0bF9kY2lfZXZlbnRfc3RhdHVzKGlvYXJnKTsKKwkJbXV0ZXhfdW5sb2NrKCZkcml2ZXItPmRjaV9tdXRleCk7CiAJCWJyZWFrOwogCWNhc2UgRElBR19JT0NUTF9EQ0lfQ0xFQVJfTE9HUzoKIAkJbXV0ZXhfbG9jaygmZHJpdmVyLT5kY2lfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZF9icmlkZ2UuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfYnJpZGdlLmMKaW5kZXggMzY4NGI4ZC4uNWRlNzg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RpYWcvZGlhZ2Z3ZF9icmlkZ2UuYworKysgYi9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkX2JyaWRnZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTkwLDYgKzkwLDE4IEBACiB7CiAJaWYgKGlkIDwgMCB8fCBpZCA+PSBOVU1fUkVNT1RFX0RFVikKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKG1vZGUgPT0gRElBR19VU0JfTU9ERSAmJgorCQlkcml2ZXItPmxvZ2dpbmdfbW9kZSA9PSBESUFHX01FTU9SWV9ERVZJQ0VfTU9ERSkgfHwKKwkJKG1vZGUgPT0gRElBR19NRU1PUllfREVWSUNFX01PREUgJiYKKwkJZHJpdmVyLT5sb2dnaW5nX21vZGUgPT0gRElBR19VU0JfTU9ERSkpIHsKKwkJLyoKKwkJICogRG9uJ3QgY2xvc2UgdGhlIE1ISSBjaGFubmVscyB3aGVuIHVzYiBpcyBkaXNjb25uZWN0ZWQKKwkJICogYW5kIGEgcHJvY2VzcyBpcyBydW5uaW5nIGluIG1lbW9yeSBkZXZpY2UgbW9kZS4KKwkJICovCisJCXJldHVybiAwOworCX0KKwogCWlmIChicmlkZ2VfaW5mb1tpZF0uZGV2X29wcyAmJiBicmlkZ2VfaW5mb1tpZF0uZGV2X29wcy0+Y2xvc2UpCiAJCWJyaWRnZV9pbmZvW2lkXS5kZXZfb3BzLT5jbG9zZShicmlkZ2VfaW5mb1tpZF0uY3R4dCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkX2NudGwuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfY250bC5jCmluZGV4IGQ3ZTI0ZmMuLjcxMDI3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfY250bC5jCisrKyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfY250bC5jCkBAIC03MjksOCArNzI5LDkgQEAKIAlzdHJ1Y3QgZGlhZ2Z3ZF9pbmZvICpmd2RfaW5mb19jbWQgPSBOVUxMOwogCWNoYXIgKnByb2Nlc3NfbmFtZSA9IE5VTEw7CiAJaW50IGVyciA9IDA7CisJY2hhciAqcm9vdF9zdHIgPSBOVUxMOwogCXVpbnQ4X3QgbG9jYWxfZGlhZ19pZCA9IDA7Ci0JdWludDhfdCBuZXdfcmVxdWVzdCA9IDA7CisJdWludDhfdCBuZXdfcmVxdWVzdCA9IDAsIGkgPSAwOwogCiAJaWYgKCFidWYgfHwgbGVuID09IDAgfHwgcGVyaXBoZXJhbCA+PSBOVU1fUEVSSVBIRVJBTFMpCiAJCXJldHVybjsKQEAgLTc1MywxOSArNzU0LDI2IEBACiAJCWN0cmxfcGt0LmRpYWdfaWQgPSBkaWFnX2lkOwogCQluZXdfcmVxdWVzdCA9IDE7CiAJfQorCXJvb3Rfc3RyID0gc3RybnN0cihwcm9jZXNzX25hbWUsIERJQUdfSURfUk9PVF9TVFJJTkcsCisJCXN0cmxlbihwcm9jZXNzX25hbWUpKTsKIAogCWlmIChuZXdfcmVxdWVzdCkgewogCQlmd2RfaW5mb19kYXRhLT5udW1fcGQrKzsKIAkJZndkX2luZm9fY21kLT5udW1fcGQrKzsKLQl9CisJCWlmIChyb290X3N0cikgeworCQkJZndkX2luZm9fY21kLT5kaWFnaWRfcm9vdCA9IGN0cmxfcGt0LmRpYWdfaWQ7CisJCQlmd2RfaW5mb19kYXRhLT5kaWFnaWRfcm9vdCA9IGN0cmxfcGt0LmRpYWdfaWQ7CisJCX0gZWxzZSB7CisJCQlpID0gZndkX2luZm9fY21kLT5udW1fcGQgLSAyOworCQkJaWYgKGkgPj0gMCAmJiBpIDwgTUFYX1BFUklQSEVSQUxfVVBEKQorCQkJCWZ3ZF9pbmZvX2NtZC0+ZGlhZ2lkX3VzZXJbaV0gPQorCQkJCWN0cmxfcGt0LmRpYWdfaWQ7CiAKLQlpZiAoc3RybnN0cihwcm9jZXNzX25hbWUsIERJQUdfSURfUk9PVF9TVFJJTkcsIHN0cmxlbihwcm9jZXNzX25hbWUpKSkgewotCQlmd2RfaW5mb19jbWQtPmRpYWdpZF9yb290ID0gZGlhZ19pZDsKLQkJZndkX2luZm9fZGF0YS0+ZGlhZ2lkX3Jvb3QgPSBkaWFnX2lkOwotCQlkcml2ZXItPmRpYWdfaWRfc2VudFtwZXJpcGhlcmFsXSA9IDA7Ci0JfSBlbHNlIHsKLQkJZndkX2luZm9fY21kLT5kaWFnaWRfdXNlcltmd2RfaW5mb19jbWQtPm51bV9wZCAtIDJdID0gZGlhZ19pZDsKLQkJZndkX2luZm9fZGF0YS0+ZGlhZ2lkX3VzZXJbZndkX2luZm9fZGF0YS0+bnVtX3BkIC0gMl0gPSBkaWFnX2lkOworCQkJaSA9IGZ3ZF9pbmZvX2RhdGEtPm51bV9wZCAtIDI7CisJCQlpZiAoaSA+PSAwICYmIGkgPCBNQVhfUEVSSVBIRVJBTF9VUEQpCisJCQkJZndkX2luZm9fZGF0YS0+ZGlhZ2lkX3VzZXJbaV0gPQorCQkJCWN0cmxfcGt0LmRpYWdfaWQ7CisJCX0KIAl9CiAKIAlESUFHX0xPRyhESUFHX0RFQlVHX1BFUklQSEVSQUxTLApAQCAtNzg0LDE4ICs3OTIsMjQgQEAKIAkJcHJfZXJyKCJkaWFnOiBVbmFibGUgdG8gc2VuZCBkaWFnIGlkIGN0cmwgcGFja2V0IHRvIHBlcmlwaGVyYWwgJWQsIGVycjogJWRcbiIsCiAJCSAgICAgICBwZXJpcGhlcmFsLCBlcnIpOwogCX0gZWxzZSB7Ci0JLyoKLQkgKiBNYXNrcyAoRjMsIGxvZ3MgYW5kIGV2ZW50cykgd2lsbCBiZSBzZW50IHRvCi0JICogcGVyaXBoZXJhbCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgZmVhdHVyZSBtYXNrIHVwZGF0ZSBvbmx5Ci0JICogaWYgZGlhZ19pZCBzdXBwb3J0IGlzIG5vdCBwcmVzZW50IG9yCi0JICogZGlhZ19pZCBzdXBwb3J0IGlzIHByZXNlbnQgYW5kIGRpYWdfaWQgaGFzIGJlZW4gc2VudCB0bwotCSAqIHBlcmlwaGVyYWwuCi0JICogV2l0aCBkaWFnX2lkIGJlaW5nIHNlbnQgbm93LCBtYXNrIHdpbGwgYmUgdXBkYXRlZAotCSAqIHRvIHBlcmlwaGVyYWxzLgotCSAqLwotCQlkcml2ZXItPmRpYWdfaWRfc2VudFtwZXJpcGhlcmFsXSA9IDE7Ci0JCWRpYWdfc2VuZF91cGRhdGVzX3BlcmlwaGVyYWwocGVyaXBoZXJhbCk7CisJCS8qCisJCSAqIE1hc2tzIChGMywgbG9ncyBhbmQgZXZlbnRzKSB3aWxsIGJlIHNlbnQgdG8KKwkJICogcGVyaXBoZXJhbCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgZmVhdHVyZSBtYXNrIHVwZGF0ZSBvbmx5CisJCSAqIGlmIGRpYWdfaWQgc3VwcG9ydCBpcyBub3QgcHJlc2VudCBvcgorCQkgKiBkaWFnX2lkIHN1cHBvcnQgaXMgcHJlc2VudCBhbmQgZGlhZ19pZCBoYXMgYmVlbiBzZW50IHRvCisJCSAqIHBlcmlwaGVyYWwuCisJCSAqIFdpdGggZGlhZ19pZCBiZWluZyBzZW50IG5vdywgbWFzayB3aWxsIGJlIHVwZGF0ZWQKKwkJICogdG8gcGVyaXBoZXJhbHMuCisJCSAqLworCQlpZiAocm9vdF9zdHIpIHsKKwkJCWRyaXZlci0+ZGlhZ19pZF9zZW50W3BlcmlwaGVyYWxdID0gMTsKKwkJCWRpYWdfc2VuZF91cGRhdGVzX3BlcmlwaGVyYWwocGVyaXBoZXJhbCk7CisJCX0KIAkJZGlhZ2Z3ZF9idWZmZXJzX2luaXQoZndkX2luZm9fZGF0YSk7CisJCURJQUdfTE9HKERJQUdfREVCVUdfUEVSSVBIRVJBTFMsCisJCSJkaWFnOiBkaWFnX2lkIHNlbnQgPSAlZCB0byBwZXJpcGhlcmFsID0gJWQgd2l0aCBkaWFnX2lkID0gJWQgZm9yICVzIDpcbiIsCisJCQlkcml2ZXItPmRpYWdfaWRfc2VudFtwZXJpcGhlcmFsXSwgcGVyaXBoZXJhbCwKKwkJCWN0cmxfcGt0LmRpYWdfaWQsIHByb2Nlc3NfbmFtZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZGlhZy9kaWFnZndkX3BlcmlwaGVyYWwuYyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfcGVyaXBoZXJhbC5jCmluZGV4IDk1NWQ4MWYuLmUwMGE2MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfcGVyaXBoZXJhbC5jCisrKyBiL2RyaXZlcnMvY2hhci9kaWFnL2RpYWdmd2RfcGVyaXBoZXJhbC5jCkBAIC00OTcsNiArNDk3LDE5IEBACiAJCQkJCWZ3ZF9pbmZvLT51cGRfbGVuW2ldWzFdID0gMDsKIAkJCX0KIAkJfQorCisJCWlmIChmbGFnX2J1Zl8xKSB7CisJCQlmd2RfaW5mby0+Y3BkX2xlbl8xID0gbGVuX2NwZDsKKwkJCWZvciAoaSA9IDA7IGkgPD0gKGZ3ZF9pbmZvLT5udW1fcGQgLSAyKTsgaSsrKQorCQkJCWlmIChmd2RfaW5mby0+dHlwZSA9PSBUWVBFX0RBVEEpCisJCQkJCWZ3ZF9pbmZvLT51cGRfbGVuW2ldWzBdID0gbGVuX3VwZFtpXTsKKwkJfSBlbHNlIGlmIChmbGFnX2J1Zl8yKSB7CisJCQlmd2RfaW5mby0+Y3BkX2xlbl8yID0gbGVuX2NwZDsKKwkJCWZvciAoaSA9IDA7IGkgPD0gKGZ3ZF9pbmZvLT5udW1fcGQgLSAyKTsgaSsrKQorCQkJCWlmIChmd2RfaW5mby0+dHlwZSA9PSBUWVBFX0RBVEEpCisJCQkJCWZ3ZF9pbmZvLT51cGRfbGVuW2ldWzFdID0gbGVuX3VwZFtpXTsKKwkJfQorCiAJCWlmIChsZW5fY3BkKSB7CiAJCQlpZiAoZmxhZ19idWZfMSkKIAkJCQlmd2RfaW5mby0+Y3BkX2xlbl8xID0gbGVuX2NwZDsKQEAgLTEwMDQsMTYgKzEwMTcsNyBAQAogCQlkZXN0X2luZm8tPmJ1Zl9wdHJbaV0gPSBmd2RfaW5mby0+YnVmX3B0cltpXTsKIAlpZiAoIWNoZWNrX2NoYW5uZWxfc3RhdGUoZGVzdF9pbmZvLT5jdHh0KSkKIAkJZGlhZ2Z3ZF9sYXRlX29wZW4oZGVzdF9pbmZvKTsKLQotCS8qCi0JICoJT3BlbiBjb250cm9sIGNoYW5uZWwgdG8gdXBkYXRlIG1hc2tzIGFmdGVyIGJ1ZmZlcnMgYXJlCi0JICoJaW5pdGlhbGl6ZWQgZm9yIHBlcmlwaGVyYWxzIHRoYXQgaGF2ZSB0cmFuc3BvcnQgb3RoZXIgdGhhbgotCSAqCUdMSU5LLiBHTElOSyBzdXBwb3J0ZWQgcGVyaXBoZXJhbCBtYXNrIHVwZGF0ZSB3aWxsCi0JICoJaGFwcGVuIGFmdGVyIGdsaW5rIGJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkLgotCSAqLwotCi0JaWYgKGRlc3RfaW5mby0+dHJhbnNwb3J0ICE9IFRSQU5TUE9SVF9HTElOSykKLQkJZGlhZ2Z3ZF9jbnRsX29wZW4oZGVzdF9pbmZvKTsKKwlkaWFnZndkX2NudGxfb3BlbihkZXN0X2luZm8pOwogCWluaXRfZm4ocGVyaXBoZXJhbCk7CiAJbXV0ZXhfdW5sb2NrKCZkcml2ZXItPmRpYWdmd2RfY2hhbm5lbF9tdXRleFtwZXJpcGhlcmFsXSk7CiAJZGlhZ2Z3ZF9xdWV1ZV9yZWFkKCZwZXJpcGhlcmFsX2luZm9bVFlQRV9EQVRBXVtwZXJpcGhlcmFsXSk7CkBAIC0xMDY3LDcgKzEwNzEsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICh0eXBlID09IFRZUEVfQ01EKSB7Ci0JCWlmIChkcml2ZXItPmZlYXR1cmVbcGVyaXBoZXJhbF0udW50YWdfaGVhZGVyKQorCQlpZiAoZHJpdmVyLT5mZWF0dXJlW3BlcmlwaGVyYWxdLmRpYWdfaWRfc3VwcG9ydCkKIAkJCWlmICghZndkX2luZm8tPmRpYWdpZF9yb290IHx8CiAJCQkJKCFkcml2ZXItPmRpYWdfaWRfc2VudFtwZXJpcGhlcmFsXSkpIHsKIAkJCURJQUdfTE9HKERJQUdfREVCVUdfUEVSSVBIRVJBTFMsCkBAIC0xMjA4LDE1ICsxMjEyLDExIEBACiAJZGlhZ2Z3ZF9idWZmZXJzX2luaXQoZndkX2luZm8pOwogCiAJLyoKLQkgKglJbml0aWFsaXplIGJ1ZmZlcnMgZm9yIGdsaW5rIHN1cHBvcnRlZAotCSAqCXBlcmlwaGVyYWxzIG9ubHkuIE9wZW4gY29udHJvbCBjaGFubmVsIHRvIHVwZGF0ZQotCSAqCW1hc2tzIGFmdGVyIGJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkLgorCSAqIEluaXRpYWxpemUgYnVmZmVycyBmb3IgZ2xpbmsgc3VwcG9ydGVkCisJICogcGVyaXBoZXJhbHMgb25seS4KIAkgKi8KLQlpZiAoZndkX2luZm8tPnRyYW5zcG9ydCA9PSBUUkFOU1BPUlRfR0xJTkspIHsKKwlpZiAoZndkX2luZm8tPnRyYW5zcG9ydCA9PSBUUkFOU1BPUlRfR0xJTkspCiAJCWRpYWdmd2Rfd3JpdGVfYnVmZmVyc19pbml0KGZ3ZF9pbmZvKTsKLQkJaWYgKGZ3ZF9pbmZvLT50eXBlID09IFRZUEVfQ05UTCkKLQkJCWRpYWdmd2RfY250bF9vcGVuKGZ3ZF9pbmZvKTsKLQl9CiAKIAlpZiAoZndkX2luZm8gJiYgZndkX2luZm8tPmNfb3BzICYmIGZ3ZF9pbmZvLT5jX29wcy0+b3BlbikKIAkJZndkX2luZm8tPmNfb3BzLT5vcGVuKGZ3ZF9pbmZvKTsKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAKIHZvaWQgZGlhZ2Z3ZF93cml0ZV9kb25lKHVpbnQ4X3QgcGVyaXBoZXJhbCwgdWludDhfdCB0eXBlLCBpbnQgY3R4dCkKIHsKLQlpbnQgaSA9IDA7CisJaW50IGkgPSAwLCB1cGRfdmFsaWRfbGVuID0gMDsKIAlzdHJ1Y3QgZGlhZ2Z3ZF9pbmZvICpmd2RfaW5mbyA9IE5VTEw7CiAKIAlpZiAocGVyaXBoZXJhbCA+PSBOVU1fUEVSSVBIRVJBTFMgfHwgdHlwZSA+PSBOVU1fVFlQRVMpCkBAIC0xMzA2LDEyICsxMzA2LDI2IEBACiAKIAlpZiAoY3R4dCA9PSAxICYmIGZ3ZF9pbmZvLT5idWZfMSkgewogCQkvKiBCdWZmZXIgMSBmb3IgY29yZSBQRCBpcyBmcmVlZCAqLwotCQlhdG9taWNfc2V0KCZmd2RfaW5mby0+YnVmXzEtPmluX2J1c3ksIDApOwogCQlmd2RfaW5mby0+Y3BkX2xlbl8xID0gMDsKKwkJZm9yIChpID0gMDsgaSA8PSAoZndkX2luZm8tPm51bV9wZCAtIDIpOyBpKyspIHsKKwkJCWlmIChmd2RfaW5mby0+dXBkX2xlbltpXVswXSkgeworCQkJCXVwZF92YWxpZF9sZW4gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghdXBkX3ZhbGlkX2xlbikKKwkJCWF0b21pY19zZXQoJmZ3ZF9pbmZvLT5idWZfMS0+aW5fYnVzeSwgMCk7CiAJfSBlbHNlIGlmIChjdHh0ID09IDIgJiYgZndkX2luZm8tPmJ1Zl8yKSB7CiAJCS8qIEJ1ZmZlciAyIGZvciBjb3JlIFBEIGlzIGZyZWVkICovCi0JCWF0b21pY19zZXQoJmZ3ZF9pbmZvLT5idWZfMi0+aW5fYnVzeSwgMCk7CiAJCWZ3ZF9pbmZvLT5jcGRfbGVuXzIgPSAwOworCQlmb3IgKGkgPSAwOyBpIDw9IChmd2RfaW5mby0+bnVtX3BkIC0gMik7IGkrKykgeworCQkJaWYgKGZ3ZF9pbmZvLT51cGRfbGVuW2ldWzFdKSB7CisJCQkJdXBkX3ZhbGlkX2xlbiA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCF1cGRfdmFsaWRfbGVuKQorCQkJYXRvbWljX3NldCgmZndkX2luZm8tPmJ1Zl8yLT5pbl9idXN5LCAwKTsKIAl9IGVsc2UgaWYgKGN0eHQgPj0gMyAmJiAoY3R4dCAlIDIpKSB7CiAJCWZvciAoaSA9IDA7IGkgPD0gKGZ3ZF9pbmZvLT5udW1fcGQgLSAyKTsgaSsrKSB7CiAJCQlpZiAoZndkX2luZm8tPmJ1Zl91cGRbaV1bMF0pIHsKQEAgLTE1NzQsMTAgKzE1ODgsMTEgQEAKIAkJCQkJCQlmd2RfaW5mby0+dHlwZSwgMik7CiAJCX0KIAotCQlpZiAoZHJpdmVyLT5mZWF0dXJlW2Z3ZF9pbmZvLT5wZXJpcGhlcmFsXS51bnRhZ19oZWFkZXIpCisJCWlmIChkcml2ZXItPmZlYXR1cmVbZndkX2luZm8tPnBlcmlwaGVyYWxdLnVudGFnX2hlYWRlcikgewogCQkJcmV0ID0gZGlhZ2Z3ZF9idWZmZXJzX2FsbG9jYXRlKGZ3ZF9pbmZvKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBlcnI7CisJCX0KIAogCQlpZiAoZHJpdmVyLT5zdXBwb3J0c19hcHBzX2hkbGNfZW5jb2RpbmcpIHsKIAkJCS8qIEluIHN1cHBvcnQgb2YgaGRsYyBlbmNvZGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCmluZGV4IDRmYWNjNzUuLjkwOTMxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKQEAgLTExNjIsMTAgKzExNjIsMTEgQEAKIAkJCWlwbWlfd2F0Y2hkb2dfc3RhdGUgPSBXRE9HX1RJTUVPVVRfTk9ORTsKIAkJCWlwbWlfc2V0X3RpbWVvdXQoSVBNSV9TRVRfVElNRU9VVF9OT19IQik7CiAJCX0gZWxzZSBpZiAoaXBtaV93YXRjaGRvZ19zdGF0ZSAhPSBXRE9HX1RJTUVPVVRfTk9ORSkgewotCQkJLyogU2V0IGEgbG9uZyB0aW1lciB0byBsZXQgdGhlIHJlYm9vdCBoYXBwZW5zLCBidXQKLQkJCSAgIHJlYm9vdCBpZiBpdCBoYW5ncywgYnV0IG9ubHkgaWYgdGhlIHdhdGNoZG9nCisJCQkvKiBTZXQgYSBsb25nIHRpbWVyIHRvIGxldCB0aGUgcmVib290IGhhcHBlbiBvcgorCQkJICAgcmVzZXQgaWYgaXQgaGFuZ3MsIGJ1dCBvbmx5IGlmIHRoZSB3YXRjaGRvZwogCQkJICAgdGltZXIgd2FzIGFscmVhZHkgcnVubmluZy4gKi8KLQkJCXRpbWVvdXQgPSAxMjA7CisJCQlpZiAodGltZW91dCA8IDEyMCkKKwkJCQl0aW1lb3V0ID0gMTIwOwogCQkJcHJldGltZW91dCA9IDA7CiAJCQlpcG1pX3dhdGNoZG9nX3N0YXRlID0gV0RPR19USU1FT1VUX1JFU0VUOwogCQkJaXBtaV9zZXRfdGltZW91dChJUE1JX1NFVF9USU1FT1VUX05PX0hCKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay5jIGIvZHJpdmVycy9jbGsvY2xrLmMKaW5kZXggNTYzODMzMy4uNGYyZmI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLmMKQEAgLTI3MTIsOSArMjcxMiwxMCBAQAogCXN0cnVjdCBjbGtfY29yZSAqY29yZTsKIAlpbnQgY250ID0gMDsKIAotCWNsb2NrX2RlYnVnX291dHB1dChzLCAwLCAiRW5hYmxlZCBjbG9ja3M6XG4iKTsKKwlpZiAoIW11dGV4X3RyeWxvY2soJmNsa19kZWJ1Z19sb2NrKSkKKwkJcmV0dXJuOwogCi0JbXV0ZXhfbG9jaygmY2xrX2RlYnVnX2xvY2spOworCWNsb2NrX2RlYnVnX291dHB1dChzLCAwLCAiRW5hYmxlZCBjbG9ja3M6XG4iKTsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvcmUsICZjbGtfZGVidWdfbGlzdCwgZGVidWdfbm9kZSkKIAkJY250ICs9IGNsb2NrX2RlYnVnX3ByaW50X2Nsb2NrKGNvcmUsIHMpOwpAQCAtMzAzNywxNCArMzAzOCwxOSBAQAogCiAvKgogICogUHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBlbmFibGVkIGNsb2NrcyBhbmQgdGhlaXIgcGFyZW50cyBpZgotICogZGVidWdfc3VzcGVuZCBpcyBzZXQgZnJvbSBkZWJ1Z2ZzLgorICogZGVidWdfc3VzcGVuZCBpcyBzZXQgZnJvbSBkZWJ1Z2ZzIGFsb25nIHdpdGggcHJpbnRfcGFyZW50IGZsYWcgc2V0IHRvIDEuCisgKiBPdGhlcndpc2UgaWYgcHJpbnRfcGFyZW50IHNldCB0byAwLCBwcmludCBvbmx5IGVuYWJsZWQgY2xvY2tzCisgKgogICovCi12b2lkIGNsb2NrX2RlYnVnX3ByaW50X2VuYWJsZWQodm9pZCkKK3ZvaWQgY2xvY2tfZGVidWdfcHJpbnRfZW5hYmxlZChib29sIHByaW50X3BhcmVudCkKIHsKIAlpZiAobGlrZWx5KCFkZWJ1Z19zdXNwZW5kKSkKIAkJcmV0dXJuOwogCi0JY2xvY2tfZGVidWdfcHJpbnRfZW5hYmxlZF9kZWJ1Z19zdXNwZW5kKE5VTEwpOworCWlmIChwcmludF9wYXJlbnQpCisJCWNsb2NrX2RlYnVnX3ByaW50X2VuYWJsZWRfY2xvY2tzKE5VTEwpOworCWVsc2UKKwkJY2xvY2tfZGVidWdfcHJpbnRfZW5hYmxlZF9kZWJ1Z19zdXNwZW5kKE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xvY2tfZGVidWdfcHJpbnRfZW5hYmxlZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay5oIGIvZHJpdmVycy9jbGsvY2xrLmgKaW5kZXggYjUyYWEyNS4uYTdkMDk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLmgKKysrIGIvZHJpdmVycy9jbGsvY2xrLmgKQEAgLTIzLDcgKzIzLDcgQEAKIHZvaWQgX19jbGtfZnJlZV9jbGsoc3RydWN0IGNsayAqY2xrKTsKIAogLyogRGVidWdmcyBBUEkgdG8gcHJpbnQgdGhlIGVuYWJsZWQgY2xvY2tzICovCi12b2lkIGNsb2NrX2RlYnVnX3ByaW50X2VuYWJsZWQodm9pZCk7Cit2b2lkIGNsb2NrX2RlYnVnX3ByaW50X2VuYWJsZWQoYm9vbCBwcmludF9wYXJlbnQpOwogdm9pZCBjbGtfZGVidWdfcHJpbnRfaHcoc3RydWN0IGNsa19jb3JlICpjbGssIHN0cnVjdCBzZXFfZmlsZSAqZik7CiAKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2NhbWNjLXNkbTg0NS5jIGIvZHJpdmVycy9jbGsvcWNvbS9jYW1jYy1zZG04NDUuYwppbmRleCAxOTg0ZDRhLi41Y2FhOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2NhbWNjLXNkbTg0NS5jCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vY2FtY2Mtc2RtODQ1LmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCS5tbmRfd2lkdGggPSAwLAogCS5oaWRfd2lkdGggPSA1LAogCS5wYXJlbnRfbWFwID0gY2FtX2NjX3BhcmVudF9tYXBfMCwKLQkuZnJlcV90YmwgPSBOVUxMLAorCS5mcmVxX3RibCA9IGZ0YmxfY2FtX2NjX2NzaTBwaHl0aW1lcl9jbGtfc3JjLAogCS5jbGtyLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKIAkJLm5hbWUgPSAiY2FtX2NjX2NzaTNwaHl0aW1lcl9jbGtfc3JjIiwKIAkJLnBhcmVudF9uYW1lcyA9IGNhbV9jY19wYXJlbnRfbmFtZXNfMCwKQEAgLTE5NTksNiArMTk1OSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjYW1fY2Nfc2RtODQ1X21hdGNoX3RhYmxlW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGNhbV9jYy1zZG04NDUiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGNhbV9jYy1zZG04NDUtdjIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGNhbV9jYy1zZG02NzAiIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2FtX2NjX3NkbTg0NV9tYXRjaF90YWJsZSk7CkBAIC0xOTcyLDYgKzE5NzMsNyBAQAogCQkmY2FtX2NjX2NzaTNwaHl0aW1lcl9jbGtfc3JjLmNsa3I7CiAJY2FtX2NjX2NwaHlfcnhfY2xrX3NyYy5mcmVxX3RibCA9IGZ0YmxfY2FtX2NjX2NwaHlfcnhfY2xrX3NyY19zZG04NDVfdjI7CiAJY2FtX2NjX2NwaHlfcnhfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dFUl0gPSAzODQwMDAwMDA7CisJY2FtX2NjX2NwaHlfcnhfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1ddID0gMzg0MDAwMDAwOwogCWNhbV9jY19mZF9jb3JlX2Nsa19zcmMuZnJlcV90YmwgPSBmdGJsX2NhbV9jY19mZF9jb3JlX2Nsa19zcmNfc2RtODQ1X3YyOwogCWNhbV9jY19mZF9jb3JlX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XRVJdID0gMzg0MDAwMDAwOwogCWNhbV9jY19pY3BfY2xrX3NyYy5mcmVxX3RibCA9IGZ0YmxfY2FtX2NjX2ljcF9jbGtfc3JjX3NkbTg0NV92MjsKQEAgLTE5ODQsNiArMTk4NiwxNCBAQAogCWNhbV9jY19scm1lX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XX0wxXSA9IDMyMDAwMDAwMDsKIAljYW1fY2NfbHJtZV9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX05PTUlOQUxdID0gNDAwMDAwMDAwOwogCWNhbV9jY19zbG93X2FoYl9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV0VSXSA9IDgwMDAwMDAwOworCWNhbV9jY19zbG93X2FoYl9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV10gPSA4MDAwMDAwMDsKKwljYW1fY2Nfc2xvd19haGJfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dfTDFdID0KKwkJODAwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbV9jY19zZG04NDVfZml4dXBfc2RtNjcwKHZvaWQpCit7CisJY2FtX2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MigpOwogfQogCiBzdGF0aWMgaW50IGNhbV9jY19zZG04NDVfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTE5OTcsNiArMjAwNyw4IEBACiAKIAlpZiAoIXN0cmNtcChjb21wYXQsICJxY29tLGNhbV9jYy1zZG04NDUtdjIiKSkKIAkJY2FtX2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MigpOworCWVsc2UgaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSxjYW1fY2Mtc2RtNjcwIikpCisJCWNhbV9jY19zZG04NDVfZml4dXBfc2RtNjcwKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLWFscGhhLXBsbC5jIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstYWxwaGEtcGxsLmMKaW5kZXggZTdkM2VlNC4uYWZiMmMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9jbGstYWxwaGEtcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstYWxwaGEtcGxsLmMKQEAgLTQ1OSw2ICs0NTksMzcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgY2xrX2ZhYmlhX3BsbF9sYXRjaF9pbnB1dChzdHJ1Y3QgY2xrX2FscGhhX3BsbCAqcGxsLAorCQkJCQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJdTMyIHJlZ3ZhbDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIExhdGNoIHRoZSBQTEwgaW5wdXQgKi8KKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBwbGwtPm9mZnNldCArIFBMTF9NT0RFLAorCQkJICAgRkFCSUFfUExMX1VQREFURSwgRkFCSUFfUExMX1VQREFURSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhaXQgZm9yIDIgcmVmZXJlbmNlIGN5Y2xlcyBiZWZvcmUgY2hlY2tpbmcgdGhlIEFDSyBiaXQuICovCisJdWRlbGF5KDEpOworCXJlZ21hcF9yZWFkKHJlZ21hcCwgcGxsLT5vZmZzZXQgKyBQTExfTU9ERSwgJnJlZ3ZhbCk7CisJaWYgKCEocmVndmFsICYgRkFCSUFfUExMX0FDS19MQVRDSCkpIHsKKwkJV0FSTigxLCAiY2xrOiBQTEwgbGF0Y2ggZmFpbGVkLiBPdXRwdXQgbWF5IGJlIHVuc3RhYmxlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJldHVybiB0aGUgbGF0Y2ggaW5wdXQgdG8gMCAqLworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIHBsbC0+b2Zmc2V0ICsgUExMX01PREUsCisJCQkgICBGQUJJQV9QTExfVVBEQVRFLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FpdCBmb3IgUExMIG91dHB1dCB0byBzdGFiaWxpemUgKi8KKwl1ZGVsYXkoMTAwKTsKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIGNsa19mYWJpYV9wbGxfY29uZmlndXJlKHN0cnVjdCBjbGtfYWxwaGFfcGxsICpwbGwsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCQljb25zdCBzdHJ1Y3QgcGxsX2NvbmZpZyAqY29uZmlnKQogewpAQCAtNDcxLDYgKzUwMiw3IEBACiAJaWYgKGNvbmZpZy0+ZnJhYykKIAkJcmVnbWFwX3dyaXRlKHJlZ21hcCwgcGxsLT5vZmZzZXQgKyBGQUJJQV9GUkFDX1ZBTCwKIAkJCQkJCWNvbmZpZy0+ZnJhYyk7CisKIAlpZiAoY29uZmlnLT5jb25maWdfY3RsX3ZhbCkKIAkJcmVnbWFwX3dyaXRlKHJlZ21hcCwgcGxsLT5vZmZzZXQgKyBQTExfQ09ORklHX0NUTCwKIAkJCQljb25maWctPmNvbmZpZ19jdGxfdmFsKTsKQEAgLTQ4Miw2ICs1MTQsMTQgQEAKIAkJCQkJbWFzaywgdmFsKTsKIAl9CiAKKwkvKgorCSAqIElmIHRoZSBQTEwgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgaXQgd291bGQgbm93IGJlIGluIGEgU1RBTkRCWQorCSAqIHN0YXRlLiBBbnkgbmV3IHVwZGF0ZXMgdG8gdGhlIFBMTCBmcmVxdWVuY3kgd2lsbCByZXF1aXJlIHNldHRpbmcgdGhlCisJICogUExMX1VQREFURSBiaXQuCisJICovCisJaWYgKHBsbC0+aW5pdGVkKQorCQljbGtfZmFiaWFfcGxsX2xhdGNoX2lucHV0KHBsbCwgcmVnbWFwKTsKKwogCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIHBsbC0+b2Zmc2V0ICsgUExMX01PREUsCiAJCQkJIEZBQklBX1BMTF9IV19VUERBVEVfTE9HSUNfQllQQVNTLAogCQkJCSBGQUJJQV9QTExfSFdfVVBEQVRFX0xPR0lDX0JZUEFTUyk7CkBAIC02MjcsMjkgKzY2Nyw4IEBACiAJcmVnbWFwX3dyaXRlKHBsbC0+Y2xrci5yZWdtYXAsIG9mZiArIFBMTF9MX1ZBTCwgbCk7CiAJcmVnbWFwX3dyaXRlKHBsbC0+Y2xrci5yZWdtYXAsIG9mZiArIEZBQklBX0ZSQUNfVkFMLCBhKTsKIAotCS8qIExhdGNoIHRoZSBQTEwgaW5wdXQgKi8KLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGxsLT5jbGtyLnJlZ21hcCwgb2ZmICsgUExMX01PREUsCi0JCQkgICBGQUJJQV9QTExfVVBEQVRFLCBGQUJJQV9QTExfVVBEQVRFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FpdCBmb3IgMiByZWZlcmVuY2UgY3ljbGVzIGJlZm9yZSBjaGVja2luZyB0aGUgQUNLIGJpdC4gKi8KLQl1ZGVsYXkoMSk7Ci0JcmVnbWFwX3JlYWQocGxsLT5jbGtyLnJlZ21hcCwgb2ZmICsgUExMX01PREUsICZyZWd2YWwpOwotCWlmICghKHJlZ3ZhbCAmIEZBQklBX1BMTF9BQ0tfTEFUQ0gpKSB7Ci0JCVdBUk4oMSwgImNsazogUExMIGxhdGNoIGZhaWxlZC4gT3V0cHV0IG1heSBiZSB1bnN0YWJsZSFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGxhdGNoIGlucHV0IHRvIDAgKi8KLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGxsLT5jbGtyLnJlZ21hcCwgb2ZmICsgUExMX01PREUsCi0JCQkgICBGQUJJQV9QTExfVVBEQVRFLCAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FpdCBmb3IgUExMIG91dHB1dCB0byBzdGFiaWxpemUgKi8KLQl1ZGVsYXkoMTAwKTsKLQlyZXR1cm4gMDsKKwlyZXQgPSBjbGtfZmFiaWFfcGxsX2xhdGNoX2lucHV0KHBsbCwgcGxsLT5jbGtyLnJlZ21hcCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgY2xrX2ZhYmlhX3BsbF9saXN0X3JlZ2lzdGVycyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHN0cnVjdCBjbGtfaHcgKmh3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9jbGstYW9wLXFtcC5jIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstYW9wLXFtcC5jCmluZGV4IGZmMjI5ZmIuLmUyYmZlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLWFvcC1xbXAuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1hb3AtcW1wLmMKQEAgLTEzOSw2ICsxMzksMTIgQEAKIAlzdHJ1Y3QgY2xrX2FvcF9xbXAgKmNsayA9IHRvX2FvcF9xbXBfY2xrKGh3KTsKIAogCW11dGV4X2xvY2soJmNsa19hb3BfbG9jayk7CisJLyoKKwkgKiBSZXR1cm4gZWFybHkgaWYgdGhlIGNsb2NrIGhhcyBiZWVuIGVuYWJsZWQgYWxyZWFkeS4gVGhpcworCSAqIGlzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIHNlbmRpbmcgZHVwbGljYXRlIGVuYWJsZSByZXF1ZXN0cy4KKwkgKi8KKwlpZiAoY2xrLT5lbmFibGVkKQorCQlnb3RvIGVycjsKIAogCWlmIChjbGstPmxldmVsKQogCQlyYXRlID0gY2xrLT5sZXZlbDsKQEAgLTE3OSw2ICsxODUsOSBAQAogCiAJbXV0ZXhfbG9jaygmY2xrX2FvcF9sb2NrKTsKIAorCWlmICghY2xrLT5lbmFibGVkKQorCQlnb3RvIGVycjsKKwogCXJhdGUgPSBjbGstPmRpc2FibGVfc3RhdGU7CiAKIAlzbnByaW50ZihtYm94X21zZywgTUFYX0xFTiwgIntjbGFzczogJXMsIHJlczogJXMsIHZhbDogJWxkfSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1jcHUtb3NtLmMgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1jcHUtb3NtLmMKaW5kZXggMjU4YTZmMi4uOTNhMDhkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9jbGstY3B1LW9zbS5jCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLWNwdS1vc20uYwpAQCAtMjA2MCw3ICsyMDYwLDcgQEAKIAkJCWxhc3RfZW50cnkgPSB0cnVlOwogCQl9CiAJfQotCWZtYXhfdGVtcFtrXSA9IGFic19mbWF4OworCWZtYXhfdGVtcFtrKytdID0gYWJzX2ZtYXg7CiAKIAlvc21fY2xrc19pbml0W2MtPmNsdXN0ZXJfbnVtXS5yYXRlX21heCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAogCQkJCQkJIGsgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1yY2cuaCBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJjZy5oCmluZGV4IDdmNTZmYjYuLjYwNzU4YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJjZy5oCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJjZy5oCkBAIC0yMyw4ICsyMyw2IEBACiAJdTggcHJlX2RpdjsKIAl1MTYgbTsKIAl1MTYgbjsKLQl1bnNpZ25lZCBsb25nIHNyY19mcmVxOwotI2RlZmluZSBGSVhFRF9GUkVRX1NSQyAgIDAKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9jbGstcmNnMi5jIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstcmNnMi5jCmluZGV4IDczODJjZmEuLjhkNWU1MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJjZzIuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1yY2cyLmMKQEAgLTI4MSwxMCArMjgxLDkgQEAKIAkJY29uc3Qgc3RydWN0IGZyZXFfdGJsICpmLCBzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQogewogCXVuc2lnbmVkIGxvbmcgY2xrX2ZsYWdzLCByYXRlID0gcmVxLT5yYXRlOwotCXN0cnVjdCBjbGtfcmF0ZV9yZXF1ZXN0IHBhcmVudF9yZXEgPSB7IH07CiAJc3RydWN0IGNsa19odyAqcDsKIAlzdHJ1Y3QgY2xrX3JjZzIgKnJjZyA9IHRvX2Nsa19yY2cyKGh3KTsKLQlpbnQgaW5kZXgsIHJldCA9IDA7CisJaW50IGluZGV4OwogCiAJZiA9IHFjb21fZmluZF9mcmVxKGYsIHJhdGUpOwogCWlmICghZikKQEAgLTMxNSwyMSArMzE0LDYgQEAKIAlyZXEtPmJlc3RfcGFyZW50X3JhdGUgPSByYXRlOwogCXJlcS0+cmF0ZSA9IGYtPmZyZXE7CiAKLQlpZiAoZi0+c3JjX2ZyZXEgIT0gRklYRURfRlJFUV9TUkMpIHsKLQkJcmF0ZSA9IHBhcmVudF9yZXEucmF0ZSA9IGYtPnNyY19mcmVxOwotCQlwYXJlbnRfcmVxLmJlc3RfcGFyZW50X2h3ID0gcDsKLQkJcmV0ID0gX19jbGtfZGV0ZXJtaW5lX3JhdGUocCwgJnBhcmVudF9yZXEpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSBjbGtfc2V0X3JhdGUocC0+Y2xrLCBwYXJlbnRfcmVxLnJhdGUpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIkZhaWxlZCBzZXQgcmF0ZSglbHUpIG9uIHBhcmVudCBmb3Igbm9uLWZpeGVkIHNvdXJjZVxuIiwKLQkJCQkJCQlwYXJlbnRfcmVxLnJhdGUpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1ycG1oLmMgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1ycG1oLmMKaW5kZXggZTFjZGE5MC4uMjEwOTEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9jbGstcnBtaC5jCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJwbWguYwpAQCAtMzE3LDEwICszMTcsMzIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2xrX3JwbWhfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20scnBtaC1jbGstc2RtODQ1IiwgLmRhdGEgPSAmY2xrX3JwbWhfc2RtODQ1fSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scnBtaC1jbGstc2RtNjcwIiwgLmRhdGEgPSAmY2xrX3JwbWhfc2RtODQ1fSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBjbGtfcnBtaF9tYXRjaF90YWJsZSk7CiAKK3N0YXRpYyB2b2lkIGNsa19ycG1oX3NkbTY3MF9maXh1cF9zZG02NzAodm9pZCkKK3sKKwlzZG04NDVfcnBtaF9jbG9ja3NbUlBNSF9SRl9DTEszXSA9IE5VTEw7CisJc2RtODQ1X3JwbWhfY2xvY2tzW1JQTUhfUkZfQ0xLM19BXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3JwbWhfc2RtNjcwX2ZpeHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3QgY2hhciAqY29tcGF0ID0gTlVMTDsKKwlpbnQgY29tcGF0bGVuID0gMDsKKworCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwgImNvbXBhdGlibGUiLCAmY29tcGF0bGVuKTsKKwlpZiAoIWNvbXBhdCB8fCAoY29tcGF0bGVuIDw9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3RyY21wKGNvbXBhdCwgInFjb20scnBtaC1jbGstc2RtNjcwIikpCisJCWNsa19ycG1oX3NkbTY3MF9maXh1cF9zZG02NzAoKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNsa19ycG1oX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGNsayAqKmNsa3M7CkBAIC0zODgsNiArNDEwLDEwIEBACiAJCWdvdG8gZXJyMjsKIAl9CiAKKwlyZXQgPSBjbGtfcnBtaF9zZG02NzBfZml4dXAocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWh3X2Nsa3MgPSBkZXNjLT5jbGtzOwogCW51bV9jbGtzID0gZGVzYy0+bnVtX2Nsa3M7CiAKQEAgLTQwNCw2ICs0MzAsMTEgQEAKIAlkYXRhLT5jbGtfbnVtID0gbnVtX2Nsa3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nsa3M7IGkrKykgeworCQlpZiAoIWh3X2Nsa3NbaV0pIHsKKwkJCWNsa3NbaV0gPSBFUlJfUFRSKC1FTk9FTlQpOworCQkJY29udGludWU7CisJCX0KKwogCQlycG1oX2NsayA9IHRvX2Nsa19ycG1oKGh3X2Nsa3NbaV0pOwogCQlycG1oX2Nsay0+cmVzX2FkZHIgPSBjbWRfZGJfZ2V0X2FkZHIocnBtaF9jbGstPnJlc19uYW1lKTsKIAkJaWYgKCFycG1oX2Nsay0+cmVzX2FkZHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vZGVidWdjYy1zZG04NDUuYyBiL2RyaXZlcnMvY2xrL3Fjb20vZGVidWdjYy1zZG04NDUuYwppbmRleCBjYjBjYWRkLi5iZTg0YjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2RlYnVnY2Mtc2RtODQ1LmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9kZWJ1Z2NjLXNkbTg0NS5jCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkiZ2NjX2FnZ3JlX3Vmc19waHlfYXhpX2NsayIsCiAJImdjY19hZ2dyZV91c2IzX3ByaW1fYXhpX2NsayIsCiAJImdjY19hZ2dyZV91c2IzX3NlY19heGlfY2xrIiwKKwkiZ2NjX2FwY192c19jbGsiLAogCSJnY2NfYm9vdF9yb21fYWhiX2NsayIsCiAJImdjY19jYW1lcmFfYWhiX2NsayIsCiAJImdjY19jYW1lcmFfYXhpX2NsayIsCkBAIC0xNDQsMTIgKzE0NSwxNCBAQAogCSJnY2NfZ3B1X2dwbGwwX2Rpdl9jbGtfc3JjIiwKIAkiZ2NjX2dwdV9tZW1ub2NfZ2Z4X2NsayIsCiAJImdjY19ncHVfc25vY19kdm1fZ2Z4X2NsayIsCisJImdjY19ncHVfdnNfY2xrIiwKIAkiZ2NjX21zc19heGlzMl9jbGsiLAogCSJnY2NfbXNzX2NmZ19haGJfY2xrIiwKIAkiZ2NjX21zc19ncGxsMF9kaXZfY2xrX3NyYyIsCiAJImdjY19tc3NfbWZhYl9heGlzX2NsayIsCiAJImdjY19tc3NfcTZfbWVtbm9jX2F4aV9jbGsiLAogCSJnY2NfbXNzX3Nub2NfYXhpX2NsayIsCisJImdjY19tc3NfdnNfY2xrIiwKIAkiZ2NjX3BjaWVfMF9hdXhfY2xrIiwKIAkiZ2NjX3BjaWVfMF9jZmdfYWhiX2NsayIsCiAJImdjY19wY2llXzBfbXN0cl9heGlfY2xrIiwKQEAgLTIzMiw5ICsyMzUsMTcgQEAKIAkiZ2NjX3VzYjNfc2VjX3BoeV9jb21fYXV4X2NsayIsCiAJImdjY191c2IzX3NlY19waHlfcGlwZV9jbGsiLAogCSJnY2NfdXNiX3BoeV9jZmdfYWhiMnBoeV9jbGsiLAorCSJnY2NfdmRkYV92c19jbGsiLAorCSJnY2NfdmRkY3hfdnNfY2xrIiwKKwkiZ2NjX3ZkZG14X3ZzX2NsayIsCiAJImdjY192aWRlb19haGJfY2xrIiwKIAkiZ2NjX3ZpZGVvX2F4aV9jbGsiLAogCSJnY2NfdmlkZW9feG9fY2xrIiwKKwkiZ2NjX3ZzX2N0cmxfYWhiX2NsayIsCisJImdjY192c19jdHJsX2NsayIsCisJImdjY19zZGNjMV9haGJfY2xrIiwKKwkiZ2NjX3NkY2MxX2FwcHNfY2xrIiwKKwkiZ2NjX3NkY2MxX2ljZV9jb3JlX2NsayIsCiAJImdwdV9jY19hY2RfY3hvX2NsayIsCiAJImdwdV9jY19haGJfY2xrIiwKIAkiZ3B1X2NjX2NyY19haGJfY2xrIiwKQEAgLTQ0OSw2ICs0NjAsOCBAQAogCQkJMHgxMUIsIDB4M0ZGLCAwLCAweEYsIDAsIDQsIDB4NjIwMDgsIDB4NjIwMDAsIDB4NjIwMDQgfSwKIAkJeyAiZ2NjX2FnZ3JlX3VzYjNfc2VjX2F4aV9jbGsiLCAweDExQywgNCwgR0NDLAogCQkJMHgxMUMsIDB4M0ZGLCAwLCAweEYsIDAsIDQsIDB4NjIwMDgsIDB4NjIwMDAsIDB4NjIwMDQgfSwKKwkJeyAiZ2NjX2FwY192c19jbGsiLCAweDExMywgNCwgR0NDLAorCQkJMHgxMTMsIDB4M0ZGLCAwLCAweEYsIDAsIDQsIDB4NjIwMDgsIDB4NjIwMDAsIDB4NjIwMDQgfSwKIAkJeyAiZ2NjX2Jvb3Rfcm9tX2FoYl9jbGsiLCAweDk0LCA0LCBHQ0MsCiAJCQkweDk0LCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCiAJCXsgImdjY19jYW1lcmFfYWhiX2NsayIsIDB4M0EsIDQsIEdDQywKQEAgLTUwMyw2ICs1MTYsOCBAQAogCQkJMHgxNDUsIDB4M0ZGLCAwLCAweEYsIDAsIDQsIDB4NjIwMDgsIDB4NjIwMDAsIDB4NjIwMDQgfSwKIAkJeyAiZ2NjX2dwdV9zbm9jX2R2bV9nZnhfY2xrIiwgMHgxNDcsIDQsIEdDQywKIAkJCTB4MTQ3LCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY19ncHVfdnNfY2xrIiwgMHgxMTIsIDQsIEdDQywKKwkJCTB4MTEyLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCiAJCXsgImdjY19tc3NfYXhpczJfY2xrIiwgMHgxMkYsIDQsIEdDQywKIAkJCTB4MTJGLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCiAJCXsgImdjY19tc3NfY2ZnX2FoYl9jbGsiLCAweDEyRCwgNCwgR0NDLApAQCAtNTE1LDYgKzUzMCw4IEBACiAJCQkweDEzNSwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAogCQl7ICJnY2NfbXNzX3Nub2NfYXhpX2NsayIsIDB4MTM0LCA0LCBHQ0MsCiAJCQkweDEzNCwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAorCQl7ICJnY2NfbXNzX3ZzX2NsayIsIDB4MTExLCA0LCBHQ0MsCisJCQkweDExMSwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAogCQl7ICJnY2NfcGNpZV8wX2F1eF9jbGsiLCAweEU1LCA0LCBHQ0MsCiAJCQkweEU1LCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCiAJCXsgImdjY19wY2llXzBfY2ZnX2FoYl9jbGsiLCAweEU0LCA0LCBHQ0MsCkBAIC02NzksMTIgKzY5NiwyOCBAQAogCQkJMHg2QSwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAogCQl7ICJnY2NfdXNiX3BoeV9jZmdfYWhiMnBoeV9jbGsiLCAweDZGLCA0LCBHQ0MsCiAJCQkweDZGLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY192ZGRhX3ZzX2NsayIsIDB4MTBFLCA0LCBHQ0MsCisJCQkweDEwRSwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAorCQl7ICJnY2NfdmRkY3hfdnNfY2xrIiwgMHgxMEMsIDQsIEdDQywKKwkJCTB4MTBDLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY192ZGRteF92c19jbGsiLCAweDEwRCwgNCwgR0NDLAorCQkJMHgxMEQsIDB4M0ZGLCAwLCAweEYsIDAsIDQsIDB4NjIwMDgsIDB4NjIwMDAsIDB4NjIwMDQgfSwKIAkJeyAiZ2NjX3ZpZGVvX2FoYl9jbGsiLCAweDM5LCA0LCBHQ0MsCiAJCQkweDM5LCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCiAJCXsgImdjY192aWRlb19heGlfY2xrIiwgMHgzRiwgNCwgR0NDLAogCQkJMHgzRiwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAogCQl7ICJnY2NfdmlkZW9feG9fY2xrIiwgMHg0MiwgNCwgR0NDLAogCQkJMHg0MiwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAorCQl7ICJnY2NfdnNfY3RybF9haGJfY2xrIiwgMHgxMTAsIDQsIEdDQywKKwkJCTB4MTEwLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY192c19jdHJsX2NsayIsIDB4MTBGLCA0LCBHQ0MsCisJCQkweDEwRiwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAorCQl7ICJnY2Nfc2RjYzFfYWhiX2NsayIsIDB4MTVDLCA0LCBHQ0MsCisJCQkweDQyLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY19zZGNjMV9hcHBzX2NsayIsIDB4MTVCLCA0LCBHQ0MsCisJCQkweDQyLCAweDNGRiwgMCwgMHhGLCAwLCA0LCAweDYyMDA4LCAweDYyMDAwLCAweDYyMDA0IH0sCisJCXsgImdjY19zZGNjMV9pY2VfY29yZV9jbGsiLCAweDE1RCwgNCwgR0NDLAorCQkJMHg0MiwgMHgzRkYsIDAsIDB4RiwgMCwgNCwgMHg2MjAwOCwgMHg2MjAwMCwgMHg2MjAwNCB9LAogCQl7ICJncHVfY2NfYWNkX2N4b19jbGsiLCAweDE0NCwgNCwgR1BVX0NDLAogCQkJMHgxRiwgMHhGRiwgMCwgMHgzLCAwLCAxLCAweDE1NjgsIDB4MTBGQywgMHgxMTAwIH0sCiAJCXsgImdwdV9jY19haGJfY2xrIiwgMHgxNDQsIDQsIEdQVV9DQywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vZGlzcGNjLXNkbTg0NS5jIGIvZHJpdmVycy9jbGsvcWNvbS9kaXNwY2Mtc2RtODQ1LmMKaW5kZXggNTNiZmU3Ny4uM2IxM2M5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9kaXNwY2Mtc2RtODQ1LmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9kaXNwY2Mtc2RtODQ1LmMKQEAgLTQwLDggKzQwLDYgQEAKICNkZWZpbmUgRElTUF9DQ19NSVNDX0NNRAkweDgwMDAKIAogI2RlZmluZSBGKGYsIHMsIGgsIG0sIG4pIHsgKGYpLCAocyksICgyICogKGgpIC0gMSksIChtKSwgKG4pIH0KLSNkZWZpbmUgRl9TTEVXKGYsIHMsIGgsIG0sIG4sIHNyY19mcmVxKSB7IChmKSwgKHMpLCAoMiAqIChoKSAtIDEpLCAobSksIChuKSwgXAotCQkJCQkoc3JjX2ZyZXEpIH0KIAogc3RhdGljIERFRklORV9WRERfUkVHVUxBVE9SUyh2ZGRfY3gsIFZERF9DWF9OVU0sIDEsIHZkZF9jb3JuZXIpOwogCkBAIC0zODUsNiArMzgzLDIwIEBACiAJeyB9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGZ0YmxfZGlzcF9jY19tZHNzX21kcF9jbGtfc3JjX3NkbTY3MFtdID0geworCUYoMTkyMDAwMDAsIFBfQklfVENYTywgMSwgMCwgMCksCisJRig4NTcxNDI4NiwgUF9HUExMMF9PVVRfTUFJTiwgNywgMCwgMCksCisJRigxMDAwMDAwMDAsIFBfR1BMTDBfT1VUX01BSU4sIDYsIDAsIDApLAorCUYoMTUwMDAwMDAwLCBQX0dQTEwwX09VVF9NQUlOLCA0LCAwLCAwKSwKKwlGKDE3MTQyODU3MSwgUF9HUExMMF9PVVRfTUFJTiwgMy41LCAwLCAwKSwKKwlGKDIwMDAwMDAwMCwgUF9HUExMMF9PVVRfTUFJTiwgMywgMCwgMCksCisJRigyODY2NzAwMDAsIFBfRElTUF9DQ19QTEwwX09VVF9NQUlOLCAzLCAwLCAwKSwKKwlGKDMwMDAwMDAwMCwgUF9HUExMMF9PVVRfTUFJTiwgMiwgMCwgMCksCisJRigzNDQwMDAwMDAsIFBfRElTUF9DQ19QTEwwX09VVF9NQUlOLCAyLjUsIDAsIDApLAorCUYoNDMwMDAwMDAwLCBQX0RJU1BfQ0NfUExMMF9PVVRfTUFJTiwgMiwgMCwgMCksCisJeyB9Cit9OworCiBzdGF0aWMgc3RydWN0IGNsa19yY2cyIGRpc3BfY2NfbWRzc19tZHBfY2xrX3NyYyA9IHsKIAkuY21kX3JjZ3IgPSAweDIwODgsCiAJLm1uZF93aWR0aCA9IDAsCkBAIC0xMDE0LDYgKzEwMjYsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZGlzcF9jY19zZG04NDVfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20sZGlzcGNjLXNkbTg0NSIgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20sZGlzcGNjLXNkbTg0NS12MiIgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sZGlzcGNjLXNkbTY3MCIgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBkaXNwX2NjX3NkbTg0NV9tYXRjaF90YWJsZSk7CkBAIC0xMDIxLDIzICsxMDM0LDIzIEBACiBzdGF0aWMgdm9pZCBkaXNwX2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MihzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCiB7CiAJY2xrX2ZhYmlhX3BsbF9jb25maWd1cmUoJmRpc3BfY2NfcGxsMCwgcmVnbWFwLAotCQkJCQkmZGlzcF9jY19wbGwwX2NvbmZpZ192Mik7CisJCSZkaXNwX2NjX3BsbDBfY29uZmlnX3YyKTsKIAlkaXNwX2NjX21kc3NfYnl0ZTBfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dFUl0gPQogCQkxODAwMDAwMDA7CiAJZGlzcF9jY19tZHNzX2J5dGUwX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XXSA9CiAJCTI3NTAwMDAwMDsKIAlkaXNwX2NjX21kc3NfYnl0ZTBfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dfTDFdID0KLQkJMzU4MDAwMDAwOworCQkzMjg1ODAwMDA7CiAJZGlzcF9jY19tZHNzX2J5dGUxX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XRVJdID0KIAkJMTgwMDAwMDAwOwogCWRpc3BfY2NfbWRzc19ieXRlMV9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV10gPQogCQkyNzUwMDAwMDA7CiAJZGlzcF9jY19tZHNzX2J5dGUxX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XX0wxXSA9Ci0JCTM1ODAwMDAwMDsKKwkJMzI4NTgwMDAwOwogCWRpc3BfY2NfbWRzc19kcF9waXhlbDFfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1ddID0KLQkJMzM3NTAwMDAwOworCQkzMzc1MDA7CiAJZGlzcF9jY19tZHNzX2RwX3BpeGVsX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XXSA9Ci0JCTMzNzUwMDAwMDsKKwkJMzM3NTAwOwogCWRpc3BfY2NfbWRzc19tZHBfY2xrX3NyYy5mcmVxX3RibCA9CiAJCWZ0YmxfZGlzcF9jY19tZHNzX21kcF9jbGtfc3JjX3NkbTg0NV92MjsKIAlkaXNwX2NjX21kc3NfbWRwX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XRVJdID0KQEAgLTEwNTAsMTAgKzEwNjMsMTQgQEAKIAkJMjgwMDAwMDAwOwogCWRpc3BfY2NfbWRzc19wY2xrMF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV10gPQogCQk0MzAwMDAwMDA7CisJZGlzcF9jY19tZHNzX3BjbGswX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XX0wxXSA9CisJCTQzMDAwMDAwMDsKIAlkaXNwX2NjX21kc3NfcGNsazFfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dFUl0gPQogCQkyODAwMDAwMDA7CiAJZGlzcF9jY19tZHNzX3BjbGsxX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XXSA9CiAJCTQzMDAwMDAwMDsKKwlkaXNwX2NjX21kc3NfcGNsazFfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dfTDFdID0KKwkJNDMwMDAwMDAwOwogCWRpc3BfY2NfbWRzc19yb3RfY2xrX3NyYy5mcmVxX3RibCA9CiAJCWZ0YmxfZGlzcF9jY19tZHNzX3JvdF9jbGtfc3JjX3NkbTg0NV92MjsKIAlkaXNwX2NjX21kc3Nfcm90X2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XRVJdID0KQEAgLTEwNjQsNiArMTA4MSwxOCBAQAogCQk0MzAwMDAwMDA7CiB9CiAKK3N0YXRpYyB2b2lkIGRpc3BfY2Nfc2RtODQ1X2ZpeHVwX3NkbTY3MChzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJZGlzcF9jY19zZG04NDVfZml4dXBfc2RtODQ1djIocmVnbWFwKTsKKworCWRpc3BfY2NfbWRzc19tZHBfY2xrX3NyYy5mcmVxX3RibCA9CisJCWZ0YmxfZGlzcF9jY19tZHNzX21kcF9jbGtfc3JjX3NkbTY3MDsKKwlkaXNwX2NjX21kc3NfYnl0ZTBfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dfTDFdID0KKwkJMzU4MDAwMDAwOworCWRpc3BfY2NfbWRzc19ieXRlMV9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV19MMV0gPQorCQkzNTgwMDAwMDA7Cit9CisKIHN0YXRpYyBpbnQgZGlzcF9jY19zZG04NDVfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQkJCXN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKQEAgLTEwNzYsNiArMTEwNSw4IEBACiAKIAlpZiAoIXN0cmNtcChjb21wYXQsICJxY29tLGRpc3BjYy1zZG04NDUtdjIiKSkKIAkJZGlzcF9jY19zZG04NDVfZml4dXBfc2RtODQ1djIocmVnbWFwKTsKKwllbHNlIGlmICghc3RyY21wKGNvbXBhdCwgInFjb20sZGlzcGNjLXNkbTY3MCIpKQorCQlkaXNwX2NjX3NkbTg0NV9maXh1cF9zZG02NzAocmVnbWFwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9nY2Mtc2RtODQ1LmMgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1zZG04NDUuYwppbmRleCAxN2IyNDAzLi40MTQyZGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2djYy1zZG04NDUuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1zZG04NDUuYwpAQCAtMTk4LDYgKzE5OCwyMiBAQAogCSJjb3JlX2JpX3BsbF90ZXN0X3NlIiwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFyZW50X21hcCBnY2NfcGFyZW50X21hcF83W10gPSB7CisJeyBQX0JJX1RDWE8sIDAgfSwKKwl7IFBfR1BMTDBfT1VUX01BSU4sIDEgfSwKKwl7IFBfR1BMTDZfT1VUX01BSU4sIDIgfSwKKwl7IFBfR1BMTDBfT1VUX0VWRU4sIDYgfSwKKwl7IFBfQ09SRV9CSV9QTExfVEVTVF9TRSwgNyB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfcGFyZW50X25hbWVzXzExW10gPSB7CisJImJpX3RjeG8iLAorCSJncGxsMCIsCisJImdwbGw2IiwKKwkiZ3BsbDBfb3V0X2V2ZW4iLAorCSJjb3JlX2JpX3BsbF90ZXN0X3NlIiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrX2R1bW15IG1lYXN1cmVfb25seV9zbm9jX2NsayA9IHsKIAkucnJhdGUgPSAxMDAwLAogCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CkBAIC0zMDEsNiArMzE3LDI4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrX2FscGhhX3BsbCBncGxsNiA9IHsKKwkub2Zmc2V0ID0gMHgxMzAwMCwKKwkudmNvX3RhYmxlID0gZmFiaWFfdmNvLAorCS5udW1fdmNvID0gQVJSQVlfU0laRShmYWJpYV92Y28pLAorCS50eXBlID0gRkFCSUFfUExMLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4NTIwMDAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg2KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwbGw2IiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiYmlfdGN4byIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19mYWJpYV9maXhlZF9wbGxfb3BzLAorCQkJVkREX0NYX0ZNQVhfTUFQNCgKKwkJCQlNSU4sIDYxNTAwMDAwMCwKKwkJCQlMT1csIDEwNjYwMDAwMDAsCisJCQkJTE9XX0wxLCAxNjAwMDAwMDAwLAorCQkJCU5PTUlOQUwsIDIwMDAwMDAwMDApLAorCQl9LAorCX0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGZ0YmxfZ2NjX2NwdXNzX2FoYl9jbGtfc3JjW10gPSB7CiAJRigxOTIwMDAwMCwgUF9CSV9UQ1hPLCAxLCAwLCAwKSwKIAl7IH0KQEAgLTMzMCw2ICszNjgsMTIgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgZnRibF9nY2NfY3B1c3NfcmJjcHJfY2xrX3NyY19zZG02NzBbXSA9IHsKKwlGKDE5MjAwMDAwLCBQX0JJX1RDWE8sIDEsIDAsIDApLAorCUYoNTAwMDAwMDAsIFBfR1BMTDBfT1VUX01BSU4sIDEyLCAwLCAwKSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrX3JjZzIgZ2NjX2NwdXNzX3JiY3ByX2Nsa19zcmMgPSB7CiAJLmNtZF9yY2dyID0gMHg0ODE1YywKIAkubW5kX3dpZHRoID0gMCwKQEAgLTg2Miw2ICs5MDYsNjcgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBmdGJsX2djY19zZGNjMV9pY2VfY29yZV9jbGtfc3JjW10gPSB7CisJRig3NTAwMDAwMCwgUF9HUExMMF9PVVRfRVZFTiwgNCwgMCwgMCksCisJRigxNTAwMDAwMDAsIFBfR1BMTDBfT1VUX01BSU4sIDQsIDAsIDApLAorCUYoMjAwMDAwMDAwLCBQX0dQTEwwX09VVF9NQUlOLCAzLCAwLCAwKSwKKwlGKDMwMDAwMDAwMCwgUF9HUExMMF9PVVRfTUFJTiwgMiwgMCwgMCksCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cyIGdjY19zZGNjMV9pY2VfY29yZV9jbGtfc3JjID0geworCS5jbWRfcmNnciA9IDB4MjYwMTAsCisJLm1uZF93aWR0aCA9IDgsCisJLmhpZF93aWR0aCA9IDUsCisJLnBhcmVudF9tYXAgPSBnY2NfcGFyZW50X21hcF8wLAorCS5mcmVxX3RibCA9IGZ0YmxfZ2NjX3NkY2MxX2ljZV9jb3JlX2Nsa19zcmMsCisJLmVuYWJsZV9zYWZlX2NvbmZpZyA9IHRydWUsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJnY2Nfc2RjYzFfaWNlX2NvcmVfY2xrX3NyYyIsCisJCS5wYXJlbnRfbmFtZXMgPSBnY2NfcGFyZW50X25hbWVzXzAsCisJCS5udW1fcGFyZW50cyA9IDQsCisJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCS5vcHMgPSAmY2xrX3JjZzJfb3BzLAorCQlWRERfQ1hfRk1BWF9NQVAzKAorCQkJTUlOLCA3NTAwMDAwMCwKKwkJCUxPVywgMTUwMDAwMDAwLAorCQkJTk9NSU5BTCwgMzAwMDAwMDAwKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBmdGJsX2djY19zZGNjMV9hcHBzX2Nsa19zcmNbXSA9IHsKKwlGKDE0NDAwMCwgUF9CSV9UQ1hPLCAxNiwgMywgMjUpLAorCUYoNDAwMDAwLCBQX0JJX1RDWE8sIDEyLCAxLCA0KSwKKwlGKDIwMDAwMDAwLCBQX0dQTEwwX09VVF9FVkVOLCA1LCAxLCAzKSwKKwlGKDI1MDAwMDAwLCBQX0dQTEwwX09VVF9FVkVOLCA2LCAxLCAyKSwKKwlGKDUwMDAwMDAwLCBQX0dQTEwwX09VVF9FVkVOLCA2LCAwLCAwKSwKKwlGKDEwMDAwMDAwMCwgUF9HUExMMF9PVVRfTUFJTiwgNiwgMCwgMCksCisJRigxOTIwMDAwMDAsIFBfR1BMTDZfT1VUX01BSU4sIDIsIDAsIDApLAorCUYoMzg0MDAwMDAwLCBQX0dQTEw2X09VVF9NQUlOLCAxLCAwLCAwKSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZzIgZ2NjX3NkY2MxX2FwcHNfY2xrX3NyYyA9IHsKKwkuY21kX3JjZ3IgPSAweDI2MDI4LAorCS5tbmRfd2lkdGggPSA4LAorCS5oaWRfd2lkdGggPSA1LAorCS5wYXJlbnRfbWFwID0gZ2NjX3BhcmVudF9tYXBfNywKKwkuZnJlcV90YmwgPSBmdGJsX2djY19zZGNjMV9hcHBzX2Nsa19zcmMsCisJLmVuYWJsZV9zYWZlX2NvbmZpZyA9IHRydWUsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJnY2Nfc2RjYzFfYXBwc19jbGtfc3JjIiwKKwkJLnBhcmVudF9uYW1lcyA9IGdjY19wYXJlbnRfbmFtZXNfMTEsCisJCS5udW1fcGFyZW50cyA9IDUsCisJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCS5vcHMgPSAmY2xrX3JjZzJfb3BzLAorCQlWRERfQ1hfRk1BWF9NQVA0KAorCQkJTUlOLCAxOTIwMDAwMCwKKwkJCUxPV0VSLCA1MDAwMDAwMCwKKwkJCUxPVywgMTAwMDAwMDAwLAorCQkJTk9NSU5BTCwgMzg0MDAwMDAwKSwKKwl9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBmdGJsX2djY19zZGNjMl9hcHBzX2Nsa19zcmNbXSA9IHsKIAlGKDQwMDAwMCwgUF9CSV9UQ1hPLCAxMiwgMSwgNCksCiAJRig5NjAwMDAwLCBQX0JJX1RDWE8sIDIsIDAsIDApLApAQCAtOTA0LDE3ICsxMDA5LDI4IEBACiAJeyB9CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGZ0YmxfZ2NjX3NkY2M0X2FwcHNfY2xrX3NyY19zZG02NzBbXSA9IHsKKwlGKDQwMDAwMCwgUF9CSV9UQ1hPLCAxMiwgMSwgNCksCisJRig5NjAwMDAwLCBQX0JJX1RDWE8sIDIsIDAsIDApLAorCUYoMTkyMDAwMDAsIFBfQklfVENYTywgMSwgMCwgMCksCisJRigyNTAwMDAwMCwgUF9HUExMMF9PVVRfRVZFTiwgMTIsIDAsIDApLAorCUYoMzMzMzMzMzMsIFBfR1BMTDBfT1VUX0VWRU4sIDksIDAsIDApLAorCUYoNTAwMDAwMDAsIFBfR1BMTDBfT1VUX01BSU4sIDEyLCAwLCAwKSwKKwlGKDEwMDAwMDAwMCwgUF9HUExMMF9PVVRfTUFJTiwgNiwgMCwgMCksCisJeyB9Cit9OworCiBzdGF0aWMgc3RydWN0IGNsa19yY2cyIGdjY19zZGNjNF9hcHBzX2Nsa19zcmMgPSB7CiAJLmNtZF9yY2dyID0gMHgxNjAwYywKIAkubW5kX3dpZHRoID0gOCwKIAkuaGlkX3dpZHRoID0gNSwKLQkucGFyZW50X21hcCA9IGdjY19wYXJlbnRfbWFwXzMsCisJLnBhcmVudF9tYXAgPSBnY2NfcGFyZW50X21hcF8wLAogCS5mcmVxX3RibCA9IGZ0YmxfZ2NjX3NkY2M0X2FwcHNfY2xrX3NyYywKIAkuZW5hYmxlX3NhZmVfY29uZmlnID0gdHJ1ZSwKIAkuY2xrci5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CiAJCS5uYW1lID0gImdjY19zZGNjNF9hcHBzX2Nsa19zcmMiLAotCQkucGFyZW50X25hbWVzID0gZ2NjX3BhcmVudF9uYW1lc18zLAotCQkubnVtX3BhcmVudHMgPSAzLAorCQkucGFyZW50X25hbWVzID0gZ2NjX3BhcmVudF9uYW1lc18wLAorCQkubnVtX3BhcmVudHMgPSA0LAogCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAogCQkub3BzID0gJmNsa19yY2cyX29wcywKIAkJVkREX0NYX0ZNQVhfTUFQNCgKQEAgLTI3MDAsNiArMjgxNiw1NSBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ2NjX3NkY2MxX2ljZV9jb3JlX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDI2MDBjLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNjAwYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDApLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ2NjX3NkY2MxX2ljZV9jb3JlX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkiZ2NjX3NkY2MxX2ljZV9jb3JlX2Nsa19zcmMiLAorCQkJfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoMl9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnY2Nfc2RjYzFfYWhiX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDI2MDA4LAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNjAwOCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDApLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ2NjX3NkY2MxX2FoYl9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoMl9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnY2Nfc2RjYzFfYXBwc19jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyNjAwNCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxULAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjYwMDQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgwKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdjY19zZGNjMV9hcHBzX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkiZ2NjX3NkY2MxX2FwcHNfY2xrX3NyYyIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCQkub3BzID0gJmNsa19icmFuY2gyX29wcywKKwkJfSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdjY19zZGNjMl9haGJfY2xrID0gewogCS5oYWx0X3JlZyA9IDB4MTQwMDgsCiAJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVCwKQEAgLTM4MjQsNiArMzk4OSwxMiBAQAogCVtHUExMMF0gPSAmZ3BsbDAuY2xrciwKIAlbR1BMTDBfT1VUX0VWRU5dID0gJmdwbGwwX291dF9ldmVuLmNsa3IsCiAJW0dQTEw0XSA9ICZncGxsNC5jbGtyLAorCVtHQ0NfU0RDQzFfQUhCX0NMS10gPSBOVUxMLAorCVtHQ0NfU0RDQzFfQVBQU19DTEtdID0gTlVMTCwKKwlbR0NDX1NEQ0MxX0lDRV9DT1JFX0NMS10gPSBOVUxMLAorCVtHQ0NfU0RDQzFfQVBQU19DTEtfU1JDXSA9IE5VTEwsCisJW0dDQ19TRENDMV9JQ0VfQ09SRV9DTEtfU1JDXSA9IE5VTEwsCisJW0dQTEw2XSA9IE5VTEwsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHFjb21fcmVzZXRfbWFwIGdjY19zZG04NDVfcmVzZXRzW10gPSB7CkBAIC0zODUzLDYgKzQwMjQsNyBAQAogCVtHQ0NfVVNCX1BIWV9DRkdfQUhCMlBIWV9CQ1JdID0geyAweDZhMDAwIH0sCiAJW0dDQ19QQ0lFXzBfUEhZX0JDUl0gPSB7IDB4NmMwMWMgfSwKIAlbR0NDX1BDSUVfMV9QSFlfQkNSXSA9IHsgMHg4ZTAxYyB9LAorCVtHQ0NfU0RDQzFfQkNSXSA9IHsgMHgyNjAwMCB9LAogfTsKIAogLyogTGlzdCBvZiBSQ0cgY2xvY2tzIGFuZCBjb3JyZXNwb25kaW5nIGZsYWdzIHJlcXVlc3RlZCBmb3IgREZTIE1vZGUgKi8KQEAgLTM4OTksNiArNDA3MSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBnY2Nfc2RtODQ1X21hdGNoX3RhYmxlW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdjYy1zZG04NDUiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdjYy1zZG04NDUtdjIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdjYy1zZG02NzAiIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZ2NjX3NkbTg0NV9tYXRjaF90YWJsZSk7CkBAIC00MDA3LDYgKzQxODAsODUgQEAKIAkJMjQwMDAwMDAwOwogCWdjY191ZnNfcGh5X2F4aV9jbGtfc3JjLmZyZXFfdGJsID0KIAkJZnRibF9nY2NfdWZzX2NhcmRfYXhpX2Nsa19zcmNfc2RtODQ1X3YyOworCWdjY192c2Vuc29yX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfQ1hfTE9XXSA9IDYwMDAwMDAwMDsKK30KKworc3RhdGljIHZvaWQgZ2NjX3NkbTg0NV9maXh1cF9zZG02NzAodm9pZCkKK3sKKwlnY2Nfc2RtODQ1X2ZpeHVwX3NkbTg0NXYyKCk7CisKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfU0RDQzFfQUhCX0NMS10gPSAmZ2NjX3NkY2MxX2FoYl9jbGsuY2xrcjsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfU0RDQzFfQVBQU19DTEtdID0gJmdjY19zZGNjMV9hcHBzX2Nsay5jbGtyOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19TRENDMV9JQ0VfQ09SRV9DTEtdID0KKwkJCQkJJmdjY19zZGNjMV9pY2VfY29yZV9jbGsuY2xrcjsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfU0RDQzFfQVBQU19DTEtfU1JDXSA9CisJCQkJCSZnY2Nfc2RjYzFfYXBwc19jbGtfc3JjLmNsa3I7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1NEQ0MxX0lDRV9DT1JFX0NMS19TUkNdID0KKwkJCQkJJmdjY19zZGNjMV9pY2VfY29yZV9jbGtfc3JjLmNsa3I7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR1BMTDZdID0gJmdwbGw2LmNsa3I7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX0FHR1JFX1VGU19DQVJEX0FYSV9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfQUdHUkVfVUZTX0NBUkRfQVhJX0hXX0NUTF9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfQUdHUkVfVVNCM19TRUNfQVhJX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19BR0dSRV9OT0NfUENJRV9UQlVfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX0NGR19OT0NfVVNCM19TRUNfQVhJX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFXzBfQVVYX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFXzBfQVVYX0NMS19TUkNdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV8wX0NGR19BSEJfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMF9DTEtSRUZfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMF9NU1RSX0FYSV9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV8wX1BJUEVfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMF9TTFZfQVhJX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFXzBfU0xWX1EyQV9BWElfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMV9BVVhfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMV9BVVhfQ0xLX1NSQ10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFXzFfQ0ZHX0FIQl9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV8xX0NMS1JFRl9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV8xX01TVFJfQVhJX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFXzFfUElQRV9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV8xX1NMVl9BWElfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfMV9TTFZfUTJBX0FYSV9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfUENJRV9QSFlfQVVYX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19QQ0lFX1BIWV9SRUZHRU5fQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1BDSUVfUEhZX1JFRkdFTl9DTEtfU1JDXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19DQVJEX0FIQl9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVUZTX0NBUkRfQVhJX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9BWElfSFdfQ1RMX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9BWElfQ0xLX1NSQ10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9DTEtSRUZfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19DQVJEX0lDRV9DT1JFX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9JQ0VfQ09SRV9IV19DVExfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19DQVJEX0lDRV9DT1JFX0NMS19TUkNdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVUZTX0NBUkRfUEhZX0FVWF9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVUZTX0NBUkRfUEhZX0FVWF9IV19DVExfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19DQVJEX1BIWV9BVVhfQ0xLX1NSQ10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9SWF9TWU1CT0xfMF9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVUZTX0NBUkRfUlhfU1lNQk9MXzFfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19DQVJEX1RYX1NZTUJPTF8wX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9VTklQUk9fQ09SRV9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVUZTX0NBUkRfVU5JUFJPX0NPUkVfSFdfQ1RMX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VRlNfQ0FSRF9VTklQUk9fQ09SRV9DTEtfU1JDXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VGU19QSFlfUlhfU1lNQk9MXzFfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VTQjMwX1NFQ19NQVNURVJfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VTQjMwX1NFQ19NQVNURVJfQ0xLX1NSQ10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VU0IzMF9TRUNfTU9DS19VVE1JX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VU0IzMF9TRUNfTU9DS19VVE1JX0NMS19TUkNdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVVNCMzBfU0VDX1NMRUVQX0NMS10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VU0IzX1NFQ19DTEtSRUZfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VTQjNfU0VDX1BIWV9BVVhfQ0xLXSA9IE5VTEw7CisJZ2NjX3NkbTg0NV9jbG9ja3NbR0NDX1VTQjNfU0VDX1BIWV9BVVhfQ0xLX1NSQ10gPSBOVUxMOworCWdjY19zZG04NDVfY2xvY2tzW0dDQ19VU0IzX1NFQ19QSFlfQ09NX0FVWF9DTEtdID0gTlVMTDsKKwlnY2Nfc2RtODQ1X2Nsb2Nrc1tHQ0NfVVNCM19TRUNfUEhZX1BJUEVfQ0xLXSA9IE5VTEw7CisKKwlnY2NfY3B1c3NfcmJjcHJfY2xrX3NyYy5mcmVxX3RibCA9IGZ0YmxfZ2NjX2NwdXNzX3JiY3ByX2Nsa19zcmNfc2RtNjcwOworCWdjY19jcHVzc19yYmNwcl9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX05PTUlOQUxdID0KKwkJNTAwMDAwMDA7CisJZ2NjX3NkY2MyX2FwcHNfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dFUl0gPSA1MDAwMDAwMDsKKwlnY2Nfc2RjYzJfYXBwc19jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV19MMV0gPQorCQkxMDAwMDAwMDA7CisJZ2NjX3NkY2MyX2FwcHNfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9OT01JTkFMXSA9CisJCTIwMTUwMDAwMDsKKwlnY2Nfc2RjYzRfYXBwc19jbGtfc3JjLmZyZXFfdGJsID0gZnRibF9nY2Nfc2RjYzRfYXBwc19jbGtfc3JjX3NkbTY3MDsKKwlnY2Nfc2RjYzRfYXBwc19jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV0VSXSA9IDMzMzMzMzMzOwogfQogCiBzdGF0aWMgaW50IGdjY19zZG04NDVfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTQwMjAsNiArNDI3Miw4IEBACiAKIAlpZiAoIXN0cmNtcChjb21wYXQsICJxY29tLGdjYy1zZG04NDUtdjIiKSkKIAkJZ2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MigpOworCWVsc2UgaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSxnY2Mtc2RtNjcwIikpCisJCWdjY19zZG04NDVfZml4dXBfc2RtNjcwKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vZ3B1Y2Mtc2RtODQ1LmMgYi9kcml2ZXJzL2Nsay9xY29tL2dwdWNjLXNkbTg0NS5jCmluZGV4IGNmNGE4YTUuLjM1YTIzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vZ3B1Y2Mtc2RtODQ1LmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9ncHVjYy1zZG04NDUuYwpAQCAtMjI0LDYgKzIyNCwxMiBAQAogCXsgfQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBmdGJsX2dwdV9jY19nbXVfY2xrX3NyY19zZG02NzBbXSA9IHsKKwlGKDE5MjAwMDAwLCBQX0JJX1RDWE8sIDEsIDAsIDApLAorCUYoMjAwMDAwMDAwLCBQX0dQTEwwX09VVF9NQUlOX0RJViwgMS41LCAwLCAwKSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrX3JjZzIgZ3B1X2NjX2dtdV9jbGtfc3JjID0gewogCS5jbWRfcmNnciA9IDB4MTEyMCwKIAkubW5kX3dpZHRoID0gMCwKQEAgLTI3OSw2ICsyODUsMTggQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgZnRibF9ncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyY19zZG02NzBbXSA9IHsKKwlGKDE4MDAwMDAwMCwgUF9DUkNfRElWLCAgMSwgMCwgMCksCisJRigyNjcwMDAwMDAsIFBfQ1JDX0RJViwgIDEsIDAsIDApLAorCUYoMzU1MDAwMDAwLCBQX0NSQ19ESVYsICAxLCAwLCAwKSwKKwlGKDQzMDAwMDAwMCwgUF9DUkNfRElWLCAgMSwgMCwgMCksCisJRig1NjUwMDAwMDAsIFBfQ1JDX0RJViwgIDEsIDAsIDApLAorCUYoNjUwMDAwMDAwLCBQX0NSQ19ESVYsICAxLCAwLCAwKSwKKwlGKDc1MDAwMDAwMCwgUF9DUkNfRElWLCAgMSwgMCwgMCksCisJRig3ODAwMDAwMDAsIFBfQ1JDX0RJViwgIDEsIDAsIDApLAorCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCBjbGtfcmNnMiBncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYyA9IHsKIAkuY21kX3JjZ3IgPSAweDEwMWMsCiAJLm1uZF93aWR0aCA9IDAsCkBAIC01ODUsNiArNjAzLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdwdV9jY19zZG04NDVfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20sZ3B1Y2Mtc2RtODQ1IiB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxncHVjYy1zZG04NDUtdjIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdwdWNjLXNkbTY3MCIgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBncHVfY2Nfc2RtODQ1X21hdGNoX3RhYmxlKTsKQEAgLTU5Miw2ICs2MTEsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3B1X2NjX2dmeF9zZG04NDVfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20sZ2Z4Y2Mtc2RtODQ1IiB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxnZnhjYy1zZG04NDUtdjIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGdmeGNjLXNkbTY3MCIgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBncHVfY2NfZ2Z4X3NkbTg0NV9tYXRjaF90YWJsZSk7CkBAIC02MDUsMjMgKzYyNSw1MSBAQAogCWdwdV9jY19nbXVfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1ddID0gNTAwMDAwMDAwOwogfQogCitzdGF0aWMgdm9pZCBncHVfY2Nfc2RtODQ1X2ZpeHVwX3NkbTY3MChzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJZ3B1X2NjX3NkbTg0NV9jbG9ja3NbR1BVX0NDX1BMTDFdID0gJmdwdV9jY19wbGwxLmNsa3I7CisJY2xrX2ZhYmlhX3BsbF9jb25maWd1cmUoJmdwdV9jY19wbGwxLCByZWdtYXAsICZncHVfY2NfcGxsMV9jb25maWcpOworCisJZ3B1X2NjX2dtdV9jbGtfc3JjLmZyZXFfdGJsID0gZnRibF9ncHVfY2NfZ211X2Nsa19zcmNfc2RtNjcwOworCWdwdV9jY19nbXVfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1ddID0gMjAwMDAwMDAwOworfQorCiBzdGF0aWMgdm9pZCBncHVfY2NfZ2Z4X3NkbTg0NV9maXh1cF9zZG04NDV2Mih2b2lkKQogewogCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmZyZXFfdGJsID0KIAkJCQlmdGJsX2dwdV9jY19neF9nZngzZF9jbGtfc3JjX3NkbTg0NV92MjsKIAlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9NSU5dID0gMTgwMDAwMDAwOwogCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0dYX0xPV0VSXSA9Ci0JCQkJMjU3MDAwMDAwOworCQkyNTcwMDAwMDA7CiAJZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfR1hfTE9XXSA9IDM0MjAwMDAwMDsKIAlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9MT1dfTDFdID0KLQkJCQk0MTQwMDAwMDA7CisJCTQxNDAwMDAwMDsKIAlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9OT01JTkFMXSA9Ci0JCQkJNTIwMDAwMDAwOworCQk1MjAwMDAwMDA7CiAJZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfR1hfTk9NSU5BTF9MMV0gPQotCQkJCTU5NjAwMDAwMDsKKwkJNTk2MDAwMDAwOwogCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0dYX0hJR0hdID0gNjc1MDAwMDAwOwogCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0dYX0hJR0hfTDFdID0KLQkJCQk3MTAwMDAwMDA7CisJCTcxMDAwMDAwMDsKK30KKworc3RhdGljIHZvaWQgZ3B1X2NjX2dmeF9zZG04NDVfZml4dXBfc2RtNjcwKHZvaWQpCit7CisJZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMuZnJlcV90YmwgPQorCQkJCWZ0YmxfZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmNfc2RtNjcwOworCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0dYX01JTl0gPSAxODAwMDAwMDA7CisJZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfR1hfTE9XRVJdID0KKwkJMjY3MDAwMDAwOworCWdwdV9jY19neF9nZngzZF9jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0dYX0xPV10gPSAzNTUwMDAwMDA7CisJZ3B1X2NjX2d4X2dmeDNkX2Nsa19zcmMuY2xrci5ody5pbml0LT5yYXRlX21heFtWRERfR1hfTE9XX0wxXSA9CisJCTQzMDAwMDAwMDsKKwlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9OT01JTkFMXSA9CisJCTU2NTAwMDAwMDsKKwlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9OT01JTkFMX0wxXSA9CisJCTY1MDAwMDAwMDsKKwlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9ISUdIXSA9IDc1MDAwMDAwMDsKKwlncHVfY2NfZ3hfZ2Z4M2RfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9HWF9ISUdIX0wxXSA9CisJCTc4MDAwMDAwMDsKIH0KIAogc3RhdGljIGludCBncHVfY2NfZ2Z4X3NkbTg0NV9maXh1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNjM1LDYgKzY4Myw4IEBACiAKIAlpZiAoIXN0cmNtcChjb21wYXQsICJxY29tLGdmeGNjLXNkbTg0NS12MiIpKQogCQlncHVfY2NfZ2Z4X3NkbTg0NV9maXh1cF9zZG04NDV2MigpOworCWVsc2UgaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSxnZnhjYy1zZG02NzAiKSkKKwkJZ3B1X2NjX2dmeF9zZG04NDVfZml4dXBfc2RtNjcwKCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY1MSw2ICs3MDEsOCBAQAogCiAJaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSxncHVjYy1zZG04NDUtdjIiKSkKIAkJZ3B1X2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MihyZWdtYXApOworCWVsc2UgaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSxncHVjYy1zZG02NzAiKSkKKwkJZ3B1X2NjX3NkbTg0NV9maXh1cF9zZG02NzAocmVnbWFwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9tZHNzL21kc3MtZHNpLXBsbC0xMG5tLmMgYi9kcml2ZXJzL2Nsay9xY29tL21kc3MvbWRzcy1kc2ktcGxsLTEwbm0uYwppbmRleCBlYjZjNjU4Li44OWVkNWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL21kc3MvbWRzcy1kc2ktcGxsLTEwbm0uYworKysgYi9kcml2ZXJzL2Nsay9xY29tL21kc3MvbWRzcy1kc2ktcGxsLTEwbm0uYwpAQCAtMjg5LDYgKzI4OSwxNCBAQAogCiAJKHZvaWQpbWRzc19wbGxfcmVzb3VyY2VfZW5hYmxlKHJzYywgZmFsc2UpOwogCisJLyoKKwkgKiBjYWNoZSB0aGUgY3VycmVudCBwYXJlbnQgaW5kZXggZm9yIGNhc2VzIHdoZXJlIHBhcmVudAorCSAqIGlzIG5vdCBjaGFuZ2luZyBidXQgcmF0ZSBpcyBjaGFuZ2luZy4gSW4gdGhhdCBjYXNlCisJICogY2xvY2sgZnJhbWV3b3JrIHdvbid0IGNhbGwgcGFyZW50X3NldCBhbmQgaGVuY2UgZHNpY2xrX3NlbAorCSAqIGJpdCB3b24ndCBiZSBwcm9ncmFtbWVkLiBlLmcuIGRmcHMgdXBkYXRlIHVzZSBjYXNlLgorCSAqLworCXJzYy0+Y2FjaGVkX2NmZzEgPSB2YWw7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTYzMyw2ICs2NDEsMTIgQEAKIAlpZiAocnNjLT5zbGF2ZSkKIAkJZHNpX3BsbF9lbmFibGVfcGxsX2JpYXMocnNjLT5zbGF2ZSk7CiAKKwlwaHlfcmVnX3VwZGF0ZV9iaXRzX3N1Yihyc2MsIFBIWV9DTU5fQ0xLX0NGRzEsIDB4MDMsIHJzYy0+Y2FjaGVkX2NmZzEpOworCWlmIChyc2MtPnNsYXZlKQorCQlwaHlfcmVnX3VwZGF0ZV9iaXRzX3N1Yihyc2MtPnNsYXZlLCBQSFlfQ01OX0NMS19DRkcxLAorCQkJCTB4MDMsIHJzYy0+Y2FjaGVkX2NmZzEpOworCXdtYigpOyAvKiBlbnN1cmUgZHNpY2xrX3NlbCBpcyBhbHdheXMgcHJvZ3JhbW1lZCBiZWZvcmUgcGxsIHN0YXJ0ICovCisKIAkvKiBTdGFydCBQTEwgKi8KIAlNRFNTX1BMTF9SRUdfVyhyc2MtPnBoeV9iYXNlLCBQSFlfQ01OX1BMTF9DTlRSTCwgMHgwMSk7CiAKQEAgLTY2NSw3ICs2NzksNiBAQAogCiBzdGF0aWMgdm9pZCBkc2lfcGxsX2Rpc2FibGVfc3ViKHN0cnVjdCBtZHNzX3BsbF9yZXNvdXJjZXMgKnJzYykKIHsKLQlkc2lfcGxsX2Rpc2FibGVfZ2xvYmFsX2Nsayhyc2MpOwogCU1EU1NfUExMX1JFR19XKHJzYy0+cGh5X2Jhc2UsIFBIWV9DTU5fUkJVRl9DVFJMLCAwKTsKIAlkc2lfcGxsX2Rpc2FibGVfcGxsX2JpYXMocnNjKTsKIH0KQEAgLTY4NCwxMSArNjk3LDIwIEBACiAKIAlwcl9kZWJ1Zygic3RvcCBQTEwgKCVkKVxuIiwgcnNjLT5pbmRleCk7CiAKKwkvKgorCSAqIFRvIGF2b2lkIGFueSBzdHJheSBnbGl0Y2hlcyB3aGlsZQorCSAqIGFicnVwdGx5IHBvd2VyaW5nIGRvd24gdGhlIFBMTAorCSAqIG1ha2Ugc3VyZSB0byBnYXRlIHRoZSBjbG9jayB1c2luZworCSAqIHRoZSBjbG9jayBlbmFibGUgYml0IGJlZm9yZSBwb3dlcmluZworCSAqIGRvd24gdGhlIFBMTAorCSAqLworCWRzaV9wbGxfZGlzYWJsZV9nbG9iYWxfY2xrKHJzYyk7CiAJTURTU19QTExfUkVHX1cocnNjLT5waHlfYmFzZSwgUEhZX0NNTl9QTExfQ05UUkwsIDApOwogCWRzaV9wbGxfZGlzYWJsZV9zdWIocnNjKTsKLQlpZiAocnNjLT5zbGF2ZSkKKwlpZiAocnNjLT5zbGF2ZSkgeworCQlkc2lfcGxsX2Rpc2FibGVfZ2xvYmFsX2Nsayhyc2MtPnNsYXZlKTsKIAkJZHNpX3BsbF9kaXNhYmxlX3N1Yihyc2MtPnNsYXZlKTsKLQorCX0KIAkvKiBmbHVzaCwgZW5zdXJlIGFsbCByZWdpc3RlciB3cml0ZXMgYXJlIGRvbmUqLwogCXdtYigpOwogCXJzYy0+cGxsX29uID0gZmFsc2U7CkBAIC03MjAsNyArNzQyLDYgQEAKIAkJcmV0dXJuOwogCX0KIAlwbGwtPmNhY2hlZF9jZmcwID0gTURTU19QTExfUkVHX1IocGxsLT5waHlfYmFzZSwgUEhZX0NNTl9DTEtfQ0ZHMCk7Ci0JcGxsLT5jYWNoZWRfY2ZnMSA9IE1EU1NfUExMX1JFR19SKHBsbC0+cGh5X2Jhc2UsIFBIWV9DTU5fQ0xLX0NGRzEpOwogCXBsbC0+Y2FjaGVkX291dGRpdiA9IE1EU1NfUExMX1JFR19SKHBsbC0+cGxsX2Jhc2UsIFBMTF9QTExfT1VURElWX1JBVEUpOwogCXByX2RlYnVnKCJjZmcwPSVkLGNmZzE9JWQsIG91dGRpdj0lZFxuIiwgcGxsLT5jYWNoZWRfY2ZnMCwKIAkJCXBsbC0+Y2FjaGVkX2NmZzEsIHBsbC0+Y2FjaGVkX291dGRpdik7CkBAIC03NjIsOCArNzgzLDYgQEAKIAkJCXBsbC0+Y2FjaGVkX2NmZzEpOwogCQlNRFNTX1BMTF9SRUdfVyhwbGwtPnBoeV9iYXNlLCBQSFlfQ01OX0NMS19DRkcwLAogCQkJCQlwbGwtPmNhY2hlZF9jZmcwKTsKLQkJTURTU19QTExfUkVHX1cocGxsLT5waHlfYmFzZSwgUEhZX0NNTl9DTEtfQ0ZHMSwKLQkJCQkJcGxsLT5jYWNoZWRfY2ZnMSk7CiAJCU1EU1NfUExMX1JFR19XKHBsbC0+cGxsX2Jhc2UsIFBMTF9QTExfT1VURElWX1JBVEUsCiAJCQkJCXBsbC0+Y2FjaGVkX291dGRpdik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS92aWRlb2NjLXNkbTg0NS5jIGIvZHJpdmVycy9jbGsvcWNvbS92aWRlb2NjLXNkbTg0NS5jCmluZGV4IGJhNGU1OTEuLmY4ZmRmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vdmlkZW9jYy1zZG04NDUuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL3ZpZGVvY2Mtc2RtODQ1LmMKQEAgLTExNCw2ICsxMTQsMTcgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgZnRibF92aWRlb19jY192ZW51c19jbGtfc3JjX3NkbTY3MFtdID0geworCUYoMTAwMDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDQsIDAsIDApLAorCUYoMjAwMDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDIsIDAsIDApLAorCUYoMzMwMDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDIsIDAsIDApLAorCUYoMzY0ODAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDIsIDAsIDApLAorCUYoNDA0MDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDEsIDAsIDApLAorCUYoNDQ0MDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDEsIDAsIDApLAorCUYoNTMzMDAwMDAwLCBQX1ZJREVPX1BMTDBfT1VUX01BSU4sIDEsIDAsIDApLAorCXsgfQorfTsKKwogc3RhdGljIHN0cnVjdCBjbGtfcmNnMiB2aWRlb19jY192ZW51c19jbGtfc3JjID0gewogCS5jbWRfcmNnciA9IDB4N2YwLAogCS5tbmRfd2lkdGggPSAwLApAQCAtMzI4LDYgKzMzOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2aWRlb19jY19zZG04NDVfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20sdmlkZW9fY2Mtc2RtODQ1IiB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSx2aWRlb19jYy1zZG04NDUtdjIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHZpZGVvX2NjLXNkbTY3MCIgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2aWRlb19jY19zZG04NDVfbWF0Y2hfdGFibGUpOwpAQCAtMzQwLDYgKzM1MiwxNCBAQAogCQk0MDQwMDAwMDA7CiB9CiAKK3N0YXRpYyB2b2lkIHZpZGVvX2NjX3NkbTg0NV9maXh1cF9zZG02NzAodm9pZCkKK3sKKwl2aWRlb19jY192ZW51c19jbGtfc3JjLmZyZXFfdGJsID0gZnRibF92aWRlb19jY192ZW51c19jbGtfc3JjX3NkbTY3MDsKKwl2aWRlb19jY192ZW51c19jbGtfc3JjLmNsa3IuaHcuaW5pdC0+cmF0ZV9tYXhbVkREX0NYX0xPV10gPSAzMzAwMDAwMDA7CisJdmlkZW9fY2NfdmVudXNfY2xrX3NyYy5jbGtyLmh3LmluaXQtPnJhdGVfbWF4W1ZERF9DWF9MT1dfTDFdID0KKwkJNDA0MDAwMDAwOworfQorCiBzdGF0aWMgaW50IHZpZGVvX2NjX3NkbTg0NV9maXh1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWNvbnN0IGNoYXIgKmNvbXBhdCA9IE5VTEw7CkBAIC0zNTEsNiArMzcxLDggQEAKIAogCWlmICghc3RyY21wKGNvbXBhdCwgInFjb20sdmlkZW9fY2Mtc2RtODQ1LXYyIikpCiAJCXZpZGVvX2NjX3NkbTg0NV9maXh1cF9zZG04NDV2MigpOworCWVsc2UgaWYgKCFzdHJjbXAoY29tcGF0LCAicWNvbSx2aWRlb19jYy1zZG02NzAiKSkKKwkJdmlkZW9fY2Nfc2RtODQ1X2ZpeHVwX3NkbTY3MCgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDIwLmMgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDIwLmMKaW5kZXggOGM4YjQ5NS4uY2RjMDkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQyMC5jCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MjAuYwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJR0FURShDTEtfQUNMSzU1MF9DQU0sICJhY2xrNTUwX2NhbSIsICJtb3V0X3VzZXJfYWNsazU1MF9jYW0iLAogCQkJCUdBVEVfQlVTX1RPUCwgMjQsIDAsIDApLAogCUdBVEUoQ0xLX0FDTEs0MzJfU0NBTEVSLCAiYWNsazQzMl9zY2FsZXIiLCAibW91dF91c2VyX2FjbGs0MzJfc2NhbGVyIiwKLQkJCQlHQVRFX0JVU19UT1AsIDI3LCAwLCAwKSwKKwkJCQlHQVRFX0JVU19UT1AsIDI3LCBDTEtfSVNfQ1JJVElDQUwsIDApLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX211eF9jbG9jayBleHlub3M1NDIwX211eF9jbGtzW10gX19pbml0Y29uc3QgPSB7CkBAIC05NTYsMjAgKzk1NiwyMCBAQAogCUdBVEUoQ0xLX1NNTVVfRzJELCAic21tdV9nMmQiLCAiYWNsazMzM19nMmQiLCBHQVRFX0lQX0cyRCwgNywgMCwgMCksCiAKIAlHQVRFKDAsICJhY2xrMjAwX2ZzeXMiLCAibW91dF91c2VyX2FjbGsyMDBfZnN5cyIsCi0JCQlHQVRFX0JVU19GU1lTMCwgOSwgQ0xLX0lHTk9SRV9VTlVTRUQsIDApLAorCQkJR0FURV9CVVNfRlNZUzAsIDksIENMS19JU19DUklUSUNBTCwgMCksCiAJR0FURSgwLCAiYWNsazIwMF9mc3lzMiIsICJtb3V0X3VzZXJfYWNsazIwMF9mc3lzMiIsCiAJCQlHQVRFX0JVU19GU1lTMCwgMTAsIENMS19JR05PUkVfVU5VU0VELCAwKSwKIAogCUdBVEUoMCwgImFjbGszMzNfZzJkIiwgIm1vdXRfdXNlcl9hY2xrMzMzX2cyZCIsCiAJCQlHQVRFX0JVU19UT1AsIDAsIENMS19JR05PUkVfVU5VU0VELCAwKSwKIAlHQVRFKDAsICJhY2xrMjY2X2cyZCIsICJtb3V0X3VzZXJfYWNsazI2Nl9nMmQiLAotCQkJR0FURV9CVVNfVE9QLCAxLCBDTEtfSUdOT1JFX1VOVVNFRCwgMCksCisJCQlHQVRFX0JVU19UT1AsIDEsIENMS19JU19DUklUSUNBTCwgMCksCiAJR0FURSgwLCAiYWNsazMwMF9qcGVnIiwgIm1vdXRfdXNlcl9hY2xrMzAwX2pwZWciLAogCQkJR0FURV9CVVNfVE9QLCA0LCBDTEtfSUdOT1JFX1VOVVNFRCwgMCksCiAJR0FURSgwLCAiYWNsazMzM180MzJfaXNwMCIsICJtb3V0X3VzZXJfYWNsazMzM180MzJfaXNwMCIsCiAJCQlHQVRFX0JVU19UT1AsIDUsIDAsIDApLAogCUdBVEUoMCwgImFjbGszMDBfZ3NjbCIsICJtb3V0X3VzZXJfYWNsazMwMF9nc2NsIiwKLQkJCUdBVEVfQlVTX1RPUCwgNiwgQ0xLX0lHTk9SRV9VTlVTRUQsIDApLAorCQkJR0FURV9CVVNfVE9QLCA2LCBDTEtfSVNfQ1JJVElDQUwsIDApLAogCUdBVEUoMCwgImFjbGszMzNfNDMyX2dzY2wiLCAibW91dF91c2VyX2FjbGszMzNfNDMyX2dzY2wiLAogCQkJR0FURV9CVVNfVE9QLCA3LCBDTEtfSUdOT1JFX1VOVVNFRCwgMCksCiAJR0FURSgwLCAiYWNsazMzM180MzJfaXNwIiwgIm1vdXRfdXNlcl9hY2xrMzMzXzQzMl9pc3AiLApAQCAtOTgzLDIwICs5ODMsMjAgQEAKIAlHQVRFKDAsICJhY2xrMTY2IiwgIm1vdXRfdXNlcl9hY2xrMTY2IiwKIAkJCUdBVEVfQlVTX1RPUCwgMTQsIENMS19JR05PUkVfVU5VU0VELCAwKSwKIAlHQVRFKENMS19BQ0xLMzMzLCAiYWNsazMzMyIsICJtb3V0X3VzZXJfYWNsazMzMyIsCi0JCQlHQVRFX0JVU19UT1AsIDE1LCBDTEtfSUdOT1JFX1VOVVNFRCwgMCksCisJCQlHQVRFX0JVU19UT1AsIDE1LCBDTEtfSVNfQ1JJVElDQUwsIDApLAogCUdBVEUoMCwgImFjbGs0MDBfaXNwIiwgIm1vdXRfdXNlcl9hY2xrNDAwX2lzcCIsCiAJCQlHQVRFX0JVU19UT1AsIDE2LCAwLCAwKSwKIAlHQVRFKDAsICJhY2xrNDAwX21zY2wiLCAibW91dF91c2VyX2FjbGs0MDBfbXNjbCIsCiAJCQlHQVRFX0JVU19UT1AsIDE3LCAwLCAwKSwKIAlHQVRFKDAsICJhY2xrMjAwX2Rpc3AxIiwgIm1vdXRfdXNlcl9hY2xrMjAwX2Rpc3AxIiwKLQkJCUdBVEVfQlVTX1RPUCwgMTgsIDAsIDApLAorCQkJR0FURV9CVVNfVE9QLCAxOCwgQ0xLX0lTX0NSSVRJQ0FMLCAwKSwKIAlHQVRFKENMS19TQ0xLX01QSFlfSVhUQUwyNCwgInNjbGtfbXBoeV9peHRhbDI0IiwgIm1waHlfcmVmY2xrX2l4dGFsMjQiLAogCQkJR0FURV9CVVNfVE9QLCAyOCwgMCwgMCksCiAJR0FURShDTEtfU0NMS19IU0lDXzEyTSwgInNjbGtfaHNpY18xMm0iLCAiZmZfaHNpY18xMm0iLAogCQkJR0FURV9CVVNfVE9QLCAyOSwgMCwgMCksCiAKIAlHQVRFKDAsICJhY2xrMzAwX2Rpc3AxIiwgIm1vdXRfdXNlcl9hY2xrMzAwX2Rpc3AxIiwKLQkJCVNSQ19NQVNLX1RPUDIsIDI0LCAwLCAwKSwKKwkJCVNSQ19NQVNLX1RPUDIsIDI0LCBDTEtfSVNfQ1JJVElDQUwsIDApLAogCiAJR0FURShDTEtfTUFVX0VQTEwsICJtYXVfZXBsbCIsICJtb3V0X21hdV9lcGxsX2NsayIsCiAJCQlTUkNfTUFTS19UT1A3LCAyMCwgMCwgMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9pbnRlcmFjdGl2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfaW50ZXJhY3RpdmUuYwppbmRleCBhNmVkZjJmLi5jNTllOTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9pbnRlcmFjdGl2ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2ludGVyYWN0aXZlLmMKQEAgLTQ1NSwxNSArNDU1LDExIEBACiAJc3RydWN0IGNwdWZyZXFfaW50ZXJhY3RpdmVfY3B1aW5mbyAqcGNwdSA9ICZwZXJfY3B1KGNwdWluZm8sIGNwdSk7CiAJc3RydWN0IGNwdWZyZXFfaW50ZXJhY3RpdmVfdHVuYWJsZXMgKnR1bmFibGVzID0KIAkJcHBvbC0+cG9saWN5LT5nb3Zlcm5vcl9kYXRhOwotCXU2NCBub3c7Ci0JdTY0IG5vd19pZGxlOwotCXVuc2lnbmVkIGludCBkZWx0YV9pZGxlOwotCXVuc2lnbmVkIGludCBkZWx0YV90aW1lOwotCXU2NCBhY3RpdmVfdGltZTsKKwl1NjQgbm93X2lkbGUsIG5vdywgYWN0aXZlX3RpbWUsIGRlbHRhX2lkbGUsIGRlbHRhX3RpbWU7CiAKIAlub3dfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGNwdSwgJm5vdywgdHVuYWJsZXMtPmlvX2lzX2J1c3kpOwotCWRlbHRhX2lkbGUgPSAodW5zaWduZWQgaW50KShub3dfaWRsZSAtIHBjcHUtPnRpbWVfaW5faWRsZSk7Ci0JZGVsdGFfdGltZSA9ICh1bnNpZ25lZCBpbnQpKG5vdyAtIHBjcHUtPnRpbWVfaW5faWRsZV90aW1lc3RhbXApOworCWRlbHRhX2lkbGUgPSAobm93X2lkbGUgLSBwY3B1LT50aW1lX2luX2lkbGUpOworCWRlbHRhX3RpbWUgPSAobm93IC0gcGNwdS0+dGltZV9pbl9pZGxlX3RpbWVzdGFtcCk7CiAKIAlpZiAoZGVsdGFfdGltZSA8PSBkZWx0YV9pZGxlKQogCQlhY3RpdmVfdGltZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvbHBtLWxldmVscy1vZi5jIGIvZHJpdmVycy9jcHVpZGxlL2xwbS1sZXZlbHMtb2YuYwppbmRleCAwYWI0YzIxLi5mYjExYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvbHBtLWxldmVscy1vZi5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9scG0tbGV2ZWxzLW9mLmMKQEAgLTc3OSw2ICs3NzksNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZmFpbGVkX3BhcnNlX3BhcmFtczsKIAorCUlOSVRfTElTVF9IRUFEKCZjLT5saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmYy0+Y2hpbGQpOwogCUlOSVRfTElTVF9IRUFEKCZjLT5jcHUpOwogCWMtPnBhcmVudCA9IHBhcmVudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9scG0tbGV2ZWxzLmMgYi9kcml2ZXJzL2NwdWlkbGUvbHBtLWxldmVscy5jCmluZGV4IDI2MWI4YjEuLjc0NmNkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9scG0tbGV2ZWxzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2xwbS1sZXZlbHMuYwpAQCAtNjAxLDE2ICs2MDEsMTQgQEAKIAl1aW50MzJfdCAqbWF4X3Jlc2lkZW5jeSA9IGdldF9wZXJfY3B1X21heF9yZXNpZGVuY3koZGV2LT5jcHUpOwogCiAJaWYgKChzbGVlcF9kaXNhYmxlZCAmJiAhY3B1X2lzb2xhdGVkKGRldi0+Y3B1KSkgfHwgc2xlZXBfdXMgPCAwKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGJlc3RfbGV2ZWw7CiAKIAlpZHhfcmVzdHJpY3QgPSBjcHUtPm5sZXZlbHMgKyAxOwogCiAJbmV4dF9ldmVudF91cyA9ICh1aW50MzJfdCkoa3RpbWVfdG9fdXMoZ2V0X25leHRfZXZlbnRfdGltZShkZXYtPmNwdSkpKTsKIAotCWlmIChpc19jcHVfYmlhc2VkKGRldi0+Y3B1KSkgewotCQliZXN0X2xldmVsID0gMDsKKwlpZiAoaXNfY3B1X2JpYXNlZChkZXYtPmNwdSkpCiAJCWdvdG8gZG9uZV9zZWxlY3Q7Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IGNwdS0+bmxldmVsczsgaSsrKSB7CiAJCXN0cnVjdCBscG1fY3B1X2xldmVsICpsZXZlbCA9ICZjcHUtPmxldmVsc1tpXTsKQEAgLTEzNDIsMTQgKzEzNDAsMTQgQEAKIAkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpZHgpCiB7CiAJc3RydWN0IGxwbV9jcHUgKmNwdSA9IHBlcl9jcHUoY3B1X2xwbSwgZGV2LT5jcHUpOwotCWJvb2wgc3VjY2VzcyA9IHRydWU7CisJYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2sgPSBnZXRfY3B1X21hc2soZGV2LT5jcHUpOwogCWludDY0X3Qgc3RhcnRfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKSwgZW5kX3RpbWU7CiAJc3RydWN0IHBvd2VyX3BhcmFtcyAqcHdyX3BhcmFtczsKIAogCXB3cl9wYXJhbXMgPSAmY3B1LT5sZXZlbHNbaWR4XS5wd3I7Ci0KLQlwd3JfcGFyYW1zID0gJmNwdS0+bGV2ZWxzW2lkeF0ucHdyOworCXNjaGVkX3NldF9jcHVfY3N0YXRlKGRldi0+Y3B1LCBpZHggKyAxLAorCQkJcHdyX3BhcmFtcy0+ZW5lcmd5X292ZXJoZWFkLCBwd3JfcGFyYW1zLT5sYXRlbmN5X3VzKTsKIAogCWNwdV9wcmVwYXJlKGNwdSwgaWR4LCB0cnVlKTsKIAljbHVzdGVyX3ByZXBhcmUoY3B1LT5wYXJlbnQsIGNwdW1hc2ssIGlkeCwgdHJ1ZSwgc3RhcnRfdGltZSk7CkBAIC0xNjA4LDcgKzE2MDYsNyBAQAogCSAqIGNsb2NrcyB0aGF0IGFyZSBlbmFibGVkIGFuZCBwcmV2ZW50aW5nIHRoZSBzeXN0ZW0gbGV2ZWwKIAkgKiBMUE1zKFhPIGFuZCBWbWluKS4KIAkgKi8KLQljbG9ja19kZWJ1Z19wcmludF9lbmFibGVkKCk7CisJY2xvY2tfZGVidWdfcHJpbnRfZW5hYmxlZCh0cnVlKTsKIAogCXBzY2lfZW50ZXJfc2xlZXAobHBtX2NwdSwgaWR4LCBmYWxzZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2l4cDR4eF9jcnlwdG8uYyBiL2RyaXZlcnMvY3J5cHRvL2l4cDR4eF9jcnlwdG8uYwppbmRleCA3ODY4NzY1Li5iNTRhZjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9peHA0eHhfY3J5cHRvLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vaXhwNHh4X2NyeXB0by5jCkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogCQlyZXFfY3R4LT5obWFjX3ZpcnQgPSBkbWFfcG9vbF9hbGxvYyhidWZmZXJfcG9vbCwgZmxhZ3MsCiAJCQkJJmNyeXB0LT5pY3ZfcmV2X2Flcyk7CiAJCWlmICh1bmxpa2VseSghcmVxX2N0eC0+aG1hY192aXJ0KSkKLQkJCWdvdG8gZnJlZV9idWZfc3JjOworCQkJZ290byBmcmVlX2J1Zl9kc3Q7CiAJCWlmICghZW5jcnlwdCkgewogCQkJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KHJlcV9jdHgtPmhtYWNfdmlydCwKIAkJCQlyZXEtPnNyYywgY3J5cHRsZW4sIGF1dGhzaXplLCAwKTsKQEAgLTEwODksMTAgKzEwODksMTAgQEAKIAlCVUdfT04ocW1ncl9zdGF0X292ZXJmbG93KFNFTkRfUUlEKSk7CiAJcmV0dXJuIC1FSU5QUk9HUkVTUzsKIAotZnJlZV9idWZfc3JjOgotCWZyZWVfYnVmX2NoYWluKGRldiwgcmVxX2N0eC0+c3JjLCBjcnlwdC0+c3JjX2J1Zik7CiBmcmVlX2J1Zl9kc3Q6CiAJZnJlZV9idWZfY2hhaW4oZGV2LCByZXFfY3R4LT5kc3QsIGNyeXB0LT5kc3RfYnVmKTsKK2ZyZWVfYnVmX3NyYzoKKwlmcmVlX2J1Zl9jaGFpbihkZXYsIHJlcV9jdHgtPnNyYywgY3J5cHQtPnNyY19idWYpOwogCWNyeXB0LT5jdGxfZmxhZ3MgPSBDVExfRkxBR19VTlVTRUQ7CiAJcmV0dXJuIC1FTk9NRU07CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9tc20vaWNlLmMgYi9kcml2ZXJzL2NyeXB0by9tc20vaWNlLmMKaW5kZXggNmVkODJlZi4uNmZhOTFhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vbXNtL2ljZS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL21zbS9pY2UuYwpAQCAtODg4LDcgKzg4OCw3IEBACiBzdGF0aWMgaW50IHFjb21faWNlX2luaXRfY2xvY2tzKHN0cnVjdCBpY2VfZGV2aWNlICppY2UpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGljZV9jbGtfaW5mbyAqY2xraTsKKwlzdHJ1Y3QgaWNlX2Nsa19pbmZvICpjbGtpID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2UtPnBkZXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZpY2UtPmNsa19saXN0X2hlYWQ7CiAKQEAgLTkzMiw3ICs5MzIsNyBAQAogc3RhdGljIGludCBxY29tX2ljZV9lbmFibGVfY2xvY2tzKHN0cnVjdCBpY2VfZGV2aWNlICppY2UsIGJvb2wgZW5hYmxlKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBpY2VfY2xrX2luZm8gKmNsa2k7CisJc3RydWN0IGljZV9jbGtfaW5mbyAqY2xraSA9IE5VTEw7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaWNlLT5wZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmaWNlLT5jbGtfbGlzdF9oZWFkOwogCkBAIC0xNjA4LDEyICsxNjA4LDE0IEBACiAJCWlmIChpY2VfZGV2LT5wZGV2LT5vZl9ub2RlID09IG5vZGUpIHsKIAkJCXByX2luZm8oIiVzOiBmb3VuZCBpY2UgZGV2aWNlICVwS1xuIiwgX19mdW5jX18sCiAJCQlpY2VfZGV2KTsKKwkJCWljZV9wZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGljZV9kZXYtPnBkZXYpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQlpY2VfcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShpY2VfZGV2LT5wZGV2KTsKLQlwcl9pbmZvKCIlczogbWF0Y2hpbmcgcGxhdGZvcm0gZGV2aWNlICVwS1xuIiwgX19mdW5jX18sIGljZV9wZGV2KTsKKwlpZiAoaWNlX3BkZXYpCisJCXByX2luZm8oIiVzOiBtYXRjaGluZyBwbGF0Zm9ybSBkZXZpY2UgJXBLXG4iLCBfX2Z1bmNfXywKKwkJCWljZV9wZGV2KTsKIG91dDoKIAlyZXR1cm4gaWNlX3BkZXY7CiB9CkBAIC0xNjMyLDExICsxNjM0LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpY2VfZGV2LCAmaWNlX2RldmljZXMsIGxpc3QpIHsKIAkJaWYgKCFzdHJjbXAoaWNlX2Rldi0+aWNlX2luc3RhbmNlX3R5cGUsIHN0b3JhZ2VfdHlwZSkpIHsKIAkJCXByX2luZm8oIiVzOiBmb3VuZCBpY2UgZGV2aWNlICVwXG4iLCBfX2Z1bmNfXywgaWNlX2Rldik7Ci0JCQlicmVhazsKKwkJCXJldHVybiBpY2VfZGV2OwogCQl9CiAJfQogb3V0OgotCXJldHVybiBpY2VfZGV2OworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IGVuYWJsZV9pY2Vfc2V0dXAoc3RydWN0IGljZV9kZXZpY2UgKmljZV9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9tc20vcWNlZGV2LmMgYi9kcml2ZXJzL2NyeXB0by9tc20vcWNlZGV2LmMKaW5kZXggMmNmMzAzZS4uOTRiM2MxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vbXNtL3FjZWRldi5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL21zbS9xY2VkZXYuYwpAQCAtMzQwLDggKzM0MCw2IEBACiAJaWYgKGF1dGhkYXRhKSB7CiAJCWhhbmRsZS0+c2hhX2N0eHQuYXV0aF9kYXRhWzBdID0gYXV0aDMyWzBdOwogCQloYW5kbGUtPnNoYV9jdHh0LmF1dGhfZGF0YVsxXSA9IGF1dGgzMlsxXTsKLQkJaGFuZGxlLT5zaGFfY3R4dC5hdXRoX2RhdGFbMl0gPSBhdXRoMzJbMl07Ci0JCWhhbmRsZS0+c2hhX2N0eHQuYXV0aF9kYXRhWzNdID0gYXV0aDMyWzNdOwogCX0KIAogCXRhc2tsZXRfc2NoZWR1bGUoJnBkZXYtPmRvbmVfdGFza2xldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9kYXguYyBiL2RyaXZlcnMvZGF4L2RheC5jCmluZGV4IDU4NmY5NTQuLjQwYmUzNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGF4L2RheC5jCisrKyBiL2RyaXZlcnMvZGF4L2RheC5jCkBAIC01NDYsNyArNTQ2LDggQEAKIAlzdHJ1Y3QgZGF4X2RldiAqZGF4X2RldiA9IHRvX2RheF9kZXYoZGV2KTsKIAlzdHJ1Y3QgZGF4X3JlZ2lvbiAqZGF4X3JlZ2lvbiA9IGRheF9kZXYtPnJlZ2lvbjsKIAotCWlkYV9zaW1wbGVfcmVtb3ZlKCZkYXhfcmVnaW9uLT5pZGEsIGRheF9kZXYtPmlkKTsKKwlpZiAoZGF4X2Rldi0+aWQgPj0gMCkKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmRheF9yZWdpb24tPmlkYSwgZGF4X2Rldi0+aWQpOwogCWlkYV9zaW1wbGVfcmVtb3ZlKCZkYXhfbWlub3JfaWRhLCBNSU5PUihkZXYtPmRldnQpKTsKIAlkYXhfcmVnaW9uX3B1dChkYXhfcmVnaW9uKTsKIAlpcHV0KGRheF9kZXYtPmlub2RlKTsKQEAgLTU4MSw3ICs1ODIsNyBAQAogfQogCiBzdHJ1Y3QgZGF4X2RldiAqZGV2bV9jcmVhdGVfZGF4X2RldihzdHJ1Y3QgZGF4X3JlZ2lvbiAqZGF4X3JlZ2lvbiwKLQkJc3RydWN0IHJlc291cmNlICpyZXMsIGludCBjb3VudCkKKwkJaW50IGlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IGNvdW50KQogewogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRheF9yZWdpb24tPmRldjsKIAlzdHJ1Y3QgZGF4X2RldiAqZGF4X2RldjsKQEAgLTYwOCwxMCArNjA5LDE2IEBACiAJaWYgKGkgPCBjb3VudCkKIAkJZ290byBlcnJfaWQ7CiAKLQlkYXhfZGV2LT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZkYXhfcmVnaW9uLT5pZGEsIDAsIDAsIEdGUF9LRVJORUwpOwotCWlmIChkYXhfZGV2LT5pZCA8IDApIHsKLQkJcmMgPSBkYXhfZGV2LT5pZDsKLQkJZ290byBlcnJfaWQ7CisJaWYgKGlkIDwgMCkgeworCQlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZkYXhfcmVnaW9uLT5pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCQlkYXhfZGV2LT5pZCA9IGlkOworCQlpZiAoaWQgPCAwKSB7CisJCQlyYyA9IGlkOworCQkJZ290byBlcnJfaWQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiByZWdpb24gcHJvdmlkZXIgb3ducyBAaWQgbGlmZXRpbWUgKi8KKwkJZGF4X2Rldi0+aWQgPSAtMTsKIAl9CiAKIAltaW5vciA9IGlkYV9zaW1wbGVfZ2V0KCZkYXhfbWlub3JfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKQEAgLTY1MCw3ICs2NTcsNyBAQAogCWRldi0+cGFyZW50ID0gcGFyZW50OwogCWRldi0+Z3JvdXBzID0gZGF4X2F0dHJpYnV0ZV9ncm91cHM7CiAJZGV2LT5yZWxlYXNlID0gZGF4X2Rldl9yZWxlYXNlOwotCWRldl9zZXRfbmFtZShkZXYsICJkYXglZC4lZCIsIGRheF9yZWdpb24tPmlkLCBkYXhfZGV2LT5pZCk7CisJZGV2X3NldF9uYW1lKGRldiwgImRheCVkLiVkIiwgZGF4X3JlZ2lvbi0+aWQsIGlkKTsKIAlyYyA9IGRldmljZV9hZGQoZGV2KTsKIAlpZiAocmMpIHsKIAkJa2lsbF9kYXhfZGV2KGRheF9kZXYpOwpAQCAtNjY5LDcgKzY3Niw4IEBACiAgZXJyX2lub2RlOgogCWlkYV9zaW1wbGVfcmVtb3ZlKCZkYXhfbWlub3JfaWRhLCBtaW5vcik7CiAgZXJyX21pbm9yOgotCWlkYV9zaW1wbGVfcmVtb3ZlKCZkYXhfcmVnaW9uLT5pZGEsIGRheF9kZXYtPmlkKTsKKwlpZiAoZGF4X2Rldi0+aWQgPj0gMCkKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmRheF9yZWdpb24tPmlkYSwgZGF4X2Rldi0+aWQpOwogIGVycl9pZDoKIAlrZnJlZShkYXhfZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgvZGF4LmggYi9kcml2ZXJzL2RheC9kYXguaAppbmRleCBkZGQ4MjlhLi5iNWVkODUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RheC9kYXguaAorKysgYi9kcml2ZXJzL2RheC9kYXguaApAQCAtMjEsNSArMjEsNSBAQAogCQlpbnQgcmVnaW9uX2lkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IGFsaWduLAogCQl2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHN0cnVjdCBkYXhfZGV2ICpkZXZtX2NyZWF0ZV9kYXhfZGV2KHN0cnVjdCBkYXhfcmVnaW9uICpkYXhfcmVnaW9uLAotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IGNvdW50KTsKKwkJaW50IGlkLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IGNvdW50KTsKICNlbmRpZiAvKiBfX0RBWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGF4L3BtZW0uYyBiL2RyaXZlcnMvZGF4L3BtZW0uYwppbmRleCA3M2M2Y2U5Li5lZWJiMzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RheC9wbWVtLmMKKysrIGIvZHJpdmVycy9kYXgvcG1lbS5jCkBAIC01OCwxMyArNTgsMTIgQEAKIAogc3RhdGljIGludCBkYXhfcG1lbV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaW50IHJjOwogCXZvaWQgKmFkZHI7CiAJc3RydWN0IHJlc291cmNlIHJlczsKIAlzdHJ1Y3QgZGF4X2RldiAqZGF4X2RldjsKKwlpbnQgcmMsIGlkLCByZWdpb25faWQ7CiAJc3RydWN0IG5kX3Bmbl9zYiAqcGZuX3NiOwogCXN0cnVjdCBkYXhfcG1lbSAqZGF4X3BtZW07Ci0Jc3RydWN0IG5kX3JlZ2lvbiAqbmRfcmVnaW9uOwogCXN0cnVjdCBuZF9uYW1lc3BhY2VfaW8gKm5zaW87CiAJc3RydWN0IGRheF9yZWdpb24gKmRheF9yZWdpb247CiAJc3RydWN0IG5kX25hbWVzcGFjZV9jb21tb24gKm5kbnM7CkBAIC0xMjIsMTQgKzEyMSwxNyBAQAogCS8qIGFkanVzdCB0aGUgZGF4X3JlZ2lvbiByZXNvdXJjZSB0byB0aGUgc3RhcnQgb2YgZGF0YSAqLwogCXJlcy5zdGFydCArPSBsZTY0X3RvX2NwdShwZm5fc2ItPmRhdGFvZmYpOwogCi0JbmRfcmVnaW9uID0gdG9fbmRfcmVnaW9uKGRldi0+cGFyZW50KTsKLQlkYXhfcmVnaW9uID0gYWxsb2NfZGF4X3JlZ2lvbihkZXYsIG5kX3JlZ2lvbi0+aWQsICZyZXMsCisJcmMgPSBzc2NhbmYoZGV2X25hbWUoJm5kbnMtPmRldiksICJuYW1lc3BhY2UlZC4lZCIsICZyZWdpb25faWQsICZpZCk7CisJaWYgKHJjICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF4X3JlZ2lvbiA9IGFsbG9jX2RheF9yZWdpb24oZGV2LCByZWdpb25faWQsICZyZXMsCiAJCQlsZTMyX3RvX2NwdShwZm5fc2ItPmFsaWduKSwgYWRkciwgUEZOX0RFVnxQRk5fTUFQKTsKIAlpZiAoIWRheF9yZWdpb24pCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogVE9ETzogc3VwcG9ydCBmb3Igc3ViZGl2aWRpbmcgYSBkYXggcmVnaW9uLi4uICovCi0JZGF4X2RldiA9IGRldm1fY3JlYXRlX2RheF9kZXYoZGF4X3JlZ2lvbiwgJnJlcywgMSk7CisJZGF4X2RldiA9IGRldm1fY3JlYXRlX2RheF9kZXYoZGF4X3JlZ2lvbiwgaWQsICZyZXMsIDEpOwogCiAJLyogY2hpbGQgZGF4X2RldiBpbnN0YW5jZXMgbm93IG93biB0aGUgbGlmZXRpbWUgb2YgdGhlIGRheF9yZWdpb24gKi8KIAlkYXhfcmVnaW9uX3B1dChkYXhfcmVnaW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9hcm0tbWVtbGF0LW1vbi5jIGIvZHJpdmVycy9kZXZmcmVxL2FybS1tZW1sYXQtbW9uLmMKaW5kZXggNTgwMmMyMS4uZjRmNTAzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2FybS1tZW1sYXQtbW9uLmMKKysrIGIvZHJpdmVycy9kZXZmcmVxL2FybS1tZW1sYXQtbW9uLmMKQEAgLTU1LDggKzU1LDcgQEAKIHN0cnVjdCBjcHVfZ3JwX2luZm8gewogCWNwdW1hc2tfdCBjcHVzOwogCWNwdW1hc2tfdCBpbml0ZWRfY3B1czsKLQl1bnNpZ25lZCBsb25nIGNhY2hlX21pc3NfZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBpbnN0X2V2ZW50OworCXVuc2lnbmVkIGludCBldmVudF9pZHNbTlVNX0VWRU5UU107CiAJc3RydWN0IGNwdV9wbXVfc3RhdHMgKmNwdXN0YXRzOwogCXN0cnVjdCBtZW1sYXRfaHdtb24gaHc7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFybV9tZW1sYXRfY3B1X25vdGlmOwpAQCAtOTcsMTMgKzk2LDggQEAKIAl1NjQgdG90YWwsIGVuYWJsZWQsIHJ1bm5pbmc7CiAKIAl0b3RhbCA9IHBlcmZfZXZlbnRfcmVhZF92YWx1ZShldmVudC0+cGV2ZW50LCAmZW5hYmxlZCwgJnJ1bm5pbmcpOwotCWlmICh0b3RhbCA+PSBldmVudC0+cHJldl9jb3VudCkKLQkJZXZfY291bnQgPSB0b3RhbCAtIGV2ZW50LT5wcmV2X2NvdW50OwotCWVsc2UKLQkJZXZfY291bnQgPSAoTUFYX0NPVU5UX0xJTSAtIGV2ZW50LT5wcmV2X2NvdW50KSArIHRvdGFsOwotCisJZXZfY291bnQgPSB0b3RhbCAtIGV2ZW50LT5wcmV2X2NvdW50OwogCWV2ZW50LT5wcmV2X2NvdW50ID0gdG90YWw7Ci0KIAlyZXR1cm4gZXZfY291bnQ7CiB9CiAKQEAgLTEzNCw3ICsxMjgsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9FVkVOVFM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwdXN0YXRzLT5ldmVudHMpOyBpKyspIHsKIAkJY3B1c3RhdHMtPmV2ZW50c1tpXS5wcmV2X2NvdW50ID0gMDsKIAkJcGVyZl9ldmVudF9yZWxlYXNlX2tlcm5lbChjcHVzdGF0cy0+ZXZlbnRzW2ldLnBldmVudCk7CiAJfQpAQCAtMTg3LDcgKzE4MSw3IEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKnBldmVudDsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyOwotCWludCBlcnI7CisJaW50IGVyciwgaTsKIAlzdHJ1Y3QgY3B1X3BtdV9zdGF0cyAqY3B1c3RhdHMgPSB0b19jcHVzdGF0cyhjcHVfZ3JwLCBjcHUpOwogCiAJLyogQWxsb2NhdGUgYW4gYXR0cmlidXRlIGZvciBldmVudCBpbml0aWFsaXphdGlvbiAqLwpAQCAtMTk1LDI2ICsxODksMTUgQEAKIAlpZiAoIWF0dHIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JYXR0ci0+Y29uZmlnID0gY3B1X2dycC0+aW5zdF9ldmVudDsKLQlwZXZlbnQgPSBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcihhdHRyLCBjcHUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChJU19FUlIocGV2ZW50KSkKLQkJZ290byBlcnJfb3V0OwotCWNwdXN0YXRzLT5ldmVudHNbSU5TVF9JRFhdLnBldmVudCA9IHBldmVudDsKLQlwZXJmX2V2ZW50X2VuYWJsZShjcHVzdGF0cy0+ZXZlbnRzW0lOU1RfSURYXS5wZXZlbnQpOwotCi0JYXR0ci0+Y29uZmlnID0gY3B1X2dycC0+Y2FjaGVfbWlzc19ldmVudDsKLQlwZXZlbnQgPSBwZXJmX2V2ZW50X2NyZWF0ZV9rZXJuZWxfY291bnRlcihhdHRyLCBjcHUsIE5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChJU19FUlIocGV2ZW50KSkKLQkJZ290byBlcnJfb3V0OwotCWNwdXN0YXRzLT5ldmVudHNbQ01fSURYXS5wZXZlbnQgPSBwZXZlbnQ7Ci0JcGVyZl9ldmVudF9lbmFibGUoY3B1c3RhdHMtPmV2ZW50c1tDTV9JRFhdLnBldmVudCk7Ci0KLQlhdHRyLT5jb25maWcgPSBDWUNfRVY7Ci0JcGV2ZW50ID0gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIoYXR0ciwgY3B1LCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoSVNfRVJSKHBldmVudCkpCi0JCWdvdG8gZXJyX291dDsKLQljcHVzdGF0cy0+ZXZlbnRzW0NZQ19JRFhdLnBldmVudCA9IHBldmVudDsKLQlwZXJmX2V2ZW50X2VuYWJsZShjcHVzdGF0cy0+ZXZlbnRzW0NZQ19JRFhdLnBldmVudCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3B1c3RhdHMtPmV2ZW50cyk7IGkrKykgeworCQlhdHRyLT5jb25maWcgPSBjcHVfZ3JwLT5ldmVudF9pZHNbaV07CisJCXBldmVudCA9IHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKGF0dHIsIGNwdSwgTlVMTCwKKwkJCQkJCQkgIE5VTEwsIE5VTEwpOworCQlpZiAoSVNfRVJSKHBldmVudCkpCisJCQlnb3RvIGVycl9vdXQ7CisJCWNwdXN0YXRzLT5ldmVudHNbaV0ucGV2ZW50ID0gcGV2ZW50OworCQlwZXJmX2V2ZW50X2VuYWJsZShwZXZlbnQpOworCX0KIAogCWtmcmVlKGF0dHIpOwogCXJldHVybiAwOwpAQCAtMzE1LDcgKzI5OCw3IEBACiAJc3RydWN0IG1lbWxhdF9od21vbiAqaHc7CiAJc3RydWN0IGNwdV9ncnBfaW5mbyAqY3B1X2dycDsKIAlpbnQgY3B1LCByZXQ7Ci0JdTMyIGNhY2hlbWlzc19ldiwgaW5zdF9ldjsKKwl1MzIgZXZlbnRfaWQ7CiAKIAljcHVfZ3JwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjcHVfZ3JwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjcHVfZ3JwKQpAQCAtMzQ2LDIyICszMjksMjQgQEAKIAlpZiAoIWNwdV9ncnAtPmNwdXN0YXRzKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWNwdV9ncnAtPmV2ZW50X2lkc1tDWUNfSURYXSA9IENZQ19FVjsKKwogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInFjb20sY2FjaGVtaXNzLWV2IiwKLQkJCSZjYWNoZW1pc3NfZXYpOworCQkJCSAgICZldmVudF9pZCk7CiAJaWYgKHJldCkgewogCQlkZXZfZGJnKGRldiwgIkNhY2hlIE1pc3MgZXZlbnQgbm90IHNwZWNpZmllZC4gVXNpbmcgZGVmOjB4JXhcbiIsCi0JCQkJTDJETV9FVik7Ci0JCWNhY2hlbWlzc19ldiA9IEwyRE1fRVY7CisJCQlMMkRNX0VWKTsKKwkJZXZlbnRfaWQgPSBMMkRNX0VWOwogCX0KLQljcHVfZ3JwLT5jYWNoZV9taXNzX2V2ZW50ID0gY2FjaGVtaXNzX2V2OworCWNwdV9ncnAtPmV2ZW50X2lkc1tDTV9JRFhdID0gZXZlbnRfaWQ7CiAKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJxY29tLGluc3QtZXYiLCAmaW5zdF9ldik7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAicWNvbSxpbnN0LWV2IiwgJmV2ZW50X2lkKTsKIAlpZiAocmV0KSB7CiAJCWRldl9kYmcoZGV2LCAiSW5zdCBldmVudCBub3Qgc3BlY2lmaWVkLiBVc2luZyBkZWY6MHgleFxuIiwKLQkJCQlJTlNUX0VWKTsKLQkJaW5zdF9ldiA9IElOU1RfRVY7CisJCQlJTlNUX0VWKTsKKwkJZXZlbnRfaWQgPSBJTlNUX0VWOwogCX0KLQljcHVfZ3JwLT5pbnN0X2V2ZW50ID0gaW5zdF9ldjsKKwljcHVfZ3JwLT5ldmVudF9pZHNbSU5TVF9JRFhdID0gZXZlbnRfaWQ7CiAKIAlmb3JfZWFjaF9jcHUoY3B1LCAmY3B1X2dycC0+Y3B1cykKIAkJdG9fZGV2c3RhdHMoY3B1X2dycCwgY3B1KS0+aWQgPSBjcHU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvYmltYy1id21vbi5jIGIvZHJpdmVycy9kZXZmcmVxL2JpbWMtYndtb24uYwppbmRleCBmZmU2MGRlLi5mOWI3NThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RldmZyZXEvYmltYy1id21vbi5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9iaW1jLWJ3bW9uLmMKQEAgLTU3NSw3ICs1NzUsOSBAQAogCQljb3VudCA9IHJlYWRsX3JlbGF4ZWQoTU9OMl9aT05FX01BWChtLCB6b25lKSkgKyAxOwogCQlicmVhazsKIAljYXNlIE1PTjM6Ci0JCWNvdW50ID0gcmVhZGxfcmVsYXhlZChNT04zX1pPTkVfTUFYKG0sIHpvbmUpKSArIDE7CisJCWNvdW50ID0gcmVhZGxfcmVsYXhlZChNT04zX1pPTkVfTUFYKG0sIHpvbmUpKTsKKwkJaWYgKGNvdW50KQorCQkJY291bnQrKzsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZ292ZXJub3JfbWVtbGF0LmMgYi9kcml2ZXJzL2RldmZyZXEvZ292ZXJub3JfbWVtbGF0LmMKaW5kZXggZTFhZmE2MC4uMWE4ZWYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2dvdmVybm9yX21lbWxhdC5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9nb3Zlcm5vcl9tZW1sYXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtMzYsNiArMzYsNyBAQAogc3RydWN0IG1lbWxhdF9ub2RlIHsKIAl1bnNpZ25lZCBpbnQgcmF0aW9fY2VpbDsKIAlib29sIG1vbl9zdGFydGVkOworCWJvb2wgYWxyZWFkeV96ZXJvOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl2b2lkICpvcmlnX2RhdGE7CiAJc3RydWN0IG1lbWxhdF9od21vbiAqaHc7CkBAIC0yMjQsNyArMjI1LDcgQEAKIHN0YXRpYyBpbnQgZGV2ZnJlcV9tZW1sYXRfZ2V0X2ZyZXEoc3RydWN0IGRldmZyZXEgKmRmLAogCQkJCQl1bnNpZ25lZCBsb25nICpmcmVxKQogewotCWludCBpLCBsYXRfZGV2OworCWludCBpLCBsYXRfZGV2ID0gMDsKIAlzdHJ1Y3QgbWVtbGF0X25vZGUgKm5vZGUgPSBkZi0+ZGF0YTsKIAlzdHJ1Y3QgbWVtbGF0X2h3bW9uICpodyA9IG5vZGUtPmh3OwogCXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXEgPSAwOwpAQCAtMjM4LDIxICsyMzksMjcgQEAKIAkJaWYgKGh3LT5jb3JlX3N0YXRzW2ldLm1lbV9jb3VudCkKIAkJCXJhdGlvIC89IGh3LT5jb3JlX3N0YXRzW2ldLm1lbV9jb3VudDsKIAorCQlpZiAoIWh3LT5jb3JlX3N0YXRzW2ldLmluc3RfY291bnQKKwkJICAgIHx8ICFody0+Y29yZV9zdGF0c1tpXS5mcmVxKQorCQkJY29udGludWU7CisKIAkJdHJhY2VfbWVtbGF0X2Rldl9tZWFzKGRldl9uYW1lKGRmLT5kZXYucGFyZW50KSwKIAkJCQkJaHctPmNvcmVfc3RhdHNbaV0uaWQsCiAJCQkJCWh3LT5jb3JlX3N0YXRzW2ldLmluc3RfY291bnQsCiAJCQkJCWh3LT5jb3JlX3N0YXRzW2ldLm1lbV9jb3VudCwKIAkJCQkJaHctPmNvcmVfc3RhdHNbaV0uZnJlcSwgcmF0aW8pOwogCi0JCWlmIChyYXRpbyAmJiByYXRpbyA8PSBub2RlLT5yYXRpb19jZWlsCisJCWlmIChyYXRpbyA8PSBub2RlLT5yYXRpb19jZWlsCiAJCSAgICAmJiBody0+Y29yZV9zdGF0c1tpXS5mcmVxID4gbWF4X2ZyZXEpIHsKIAkJCWxhdF9kZXYgPSBpOwogCQkJbWF4X2ZyZXEgPSBody0+Y29yZV9zdGF0c1tpXS5mcmVxOwogCQl9CiAJfQogCi0JaWYgKG1heF9mcmVxKSB7CisJaWYgKG1heF9mcmVxKQogCQltYXhfZnJlcSA9IGNvcmVfdG9fZGV2X2ZyZXEobm9kZSwgbWF4X2ZyZXEpOworCisJaWYgKG1heF9mcmVxIHx8ICFub2RlLT5hbHJlYWR5X3plcm8pIHsKIAkJdHJhY2VfbWVtbGF0X2Rldl91cGRhdGUoZGV2X25hbWUoZGYtPmRldi5wYXJlbnQpLAogCQkJCQlody0+Y29yZV9zdGF0c1tsYXRfZGV2XS5pZCwKIAkJCQkJaHctPmNvcmVfc3RhdHNbbGF0X2Rldl0uaW5zdF9jb3VudCwKQEAgLTI2MSw2ICsyNjgsOCBAQAogCQkJCQltYXhfZnJlcSk7CiAJfQogCisJbm9kZS0+YWxyZWFkeV96ZXJvID0gIW1heF9mcmVxOworCiAJKmZyZXEgPSBtYXhfZnJlcTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2ZpbGUuYyBiL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2ZpbGUuYwppbmRleCA1YTkxNjZhLi4yZjM0YTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS1idWYvc3luY19maWxlLmMKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfZmlsZS5jCkBAIC0yODUsNyArMjg1LDcgQEAKIAlzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHN5bmNfZmlsZSwKIAkJCQkJCSAgICAga3JlZik7CiAKLQlpZiAodGVzdF9iaXQoUE9MTF9FTkFCTEVELCAmc3luY19maWxlLT5mZW5jZS0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChQT0xMX0VOQUJMRUQsICZzeW5jX2ZpbGUtPmZsYWdzKSkKIAkJZmVuY2VfcmVtb3ZlX2NhbGxiYWNrKHN5bmNfZmlsZS0+ZmVuY2UsICZzeW5jX2ZpbGUtPmNiKTsKIAlmZW5jZV9wdXQoc3luY19maWxlLT5mZW5jZSk7CiAJa2ZyZWUoc3luY19maWxlKTsKQEAgLTMwNSw3ICszMDUsNyBAQAogCiAJcG9sbF93YWl0KGZpbGUsICZzeW5jX2ZpbGUtPndxLCB3YWl0KTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChQT0xMX0VOQUJMRUQsICZzeW5jX2ZpbGUtPmZlbmNlLT5mbGFncykpIHsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUE9MTF9FTkFCTEVELCAmc3luY19maWxlLT5mbGFncykpIHsKIAkJaWYgKGZlbmNlX2FkZF9jYWxsYmFjayhzeW5jX2ZpbGUtPmZlbmNlLCAmc3luY19maWxlLT5jYiwKIAkJCQkJICAgZmVuY2VfY2hlY2tfY2JfZnVuYykgPCAwKQogCQkJd2FrZV91cF9hbGwoJnN5bmNfZmlsZS0+d3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggMTQxYWVmYi4uNGUyMzc5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC00MjIsNiArNDIyLDE2IEBACiAJICAxNiB0byAzMiBjaGFubmVscyBmb3IgcGVyaXBoZXJhbCB0byBtZW1vcnkgb3IgbWVtb3J5IHRvIG1lbW9yeQogCSAgdHJhbnNmZXJzLgogCitjb25maWcgUUNPTV9TUFNfRE1BCisJdHJpc3RhdGUgIlF1YWxjb21tIHRlY2hub2xvZ2llcyBpbmMgRE1BIGRyaXZlciBmb3Igc3BzLUJBTSIKKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTQorCXNlbGVjdCBETUFfRU5HSU5FCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFF1YWxjb21tIHRlY2hub2xvZ2llcyBpbmMsIEJBTSBETUEgZW5naW5lLgorCSAgVGhpcyBETUEtZW5naW5lLWRyaXZlciBpcyBhIHdyYXBwZXIgb2YgdGhlIHNwcy1CQU0gbGlicmFyeS4gRE1BCisJICBlbmdpbmUgY2FsbGJhY2tzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyB0aGUgc3BzLUJBTSBmdW5jdGlvbmFsaXR5CisJICB0byBhY2Nlc3MgSFcuCisKIGNvbmZpZyBTSVJGX0RNQQogCXRyaXN0YXRlICJDU1IgU2lSRnByaW1hSUkvU2lSRm1hcmNvIERNQSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9TSVJGCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCmluZGV4IGU0ZGM5Y2EuLjJjMTliZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC02Nyw2ICs2Nyw3IEBACiBvYmotJChDT05GSUdfVElfRURNQSkgKz0gZWRtYS5vCiBvYmotJChDT05GSUdfWEdFTkVfRE1BKSArPSB4Z2VuZS1kbWEubwogb2JqLSQoQ09ORklHX1pYX0RNQSkgKz0gengyOTY3MDJfZG1hLm8KK29iai0kKENPTkZJR19RQ09NX1NQU19ETUEpICs9IHFjb20tc3BzLWRtYS5vCiAKIG9iai15ICs9IHFjb20vCiBvYmoteSArPSB4aWxpbngvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb2F0L2h3LmggYi9kcml2ZXJzL2RtYS9pb2F0L2h3LmgKaW5kZXggOGU2Nzg5NS4uYWJjYzUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9ody5oCisrKyBiL2RyaXZlcnMvZG1hL2lvYXQvaHcuaApAQCAtNjQsNiArNjQsOCBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfQkRYOAkweDZmMmUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0JEWDkJMHg2ZjJmCiAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NLWAkweDIwMjEKKwogI2RlZmluZSBJT0FUX1ZFUl8xXzIgICAgICAgICAgICAweDEyICAgIC8qIFZlcnNpb24gMS4yICovCiAjZGVmaW5lIElPQVRfVkVSXzJfMCAgICAgICAgICAgIDB4MjAgICAgLyogVmVyc2lvbiAyLjAgKi8KICNkZWZpbmUgSU9BVF9WRVJfM18wICAgICAgICAgICAgMHgzMCAgICAvKiBWZXJzaW9uIDMuMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMgYi9kcml2ZXJzL2RtYS9pb2F0L2luaXQuYwppbmRleCBkMjM1ZmJlLi4wZGVhNmQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMKQEAgLTEwNiw2ICsxMDYsOCBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9CRFg4KSB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9CRFg5KSB9LAogCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NLWCkgfSwKKwogCS8qIEkvT0FUIHYzLjMgcGxhdGZvcm1zICovCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0JXRDApIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX0JXRDEpIH0sCkBAIC0yNDMsMTAgKzI0NSwxNSBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSBib29sIGlzX3NreF9pb2F0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TS1gpID8gdHJ1ZSA6IGZhbHNlOworfQorCiBzdGF0aWMgYm9vbCBpc194ZW9uX2NiMzIoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmV0dXJuIGlzX2pmX2lvYXQocGRldikgfHwgaXNfc25iX2lvYXQocGRldikgfHwgaXNfaXZiX2lvYXQocGRldikgfHwKLQkJaXNfaHN3X2lvYXQocGRldikgfHwgaXNfYmR4X2lvYXQocGRldik7CisJCWlzX2hzd19pb2F0KHBkZXYpIHx8IGlzX2JkeF9pb2F0KHBkZXYpIHx8IGlzX3NreF9pb2F0KHBkZXYpOwogfQogCiBib29sIGlzX2J3ZF9pb2F0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtMTM1MCw2ICsxMzU3LDggQEAKIAogCWRldmljZS0+dmVyc2lvbiA9IHJlYWRiKGRldmljZS0+cmVnX2Jhc2UgKyBJT0FUX1ZFUl9PRkZTRVQpOwogCWlmIChkZXZpY2UtPnZlcnNpb24gPj0gSU9BVF9WRVJfM18wKSB7CisJCWlmIChpc19za3hfaW9hdChwZGV2KSkKKwkJCWRldmljZS0+dmVyc2lvbiA9IElPQVRfVkVSXzNfMjsKIAkJZXJyID0gaW9hdDNfZG1hX3Byb2JlKGRldmljZSwgaW9hdF9kY2FfZW5hYmxlZCk7CiAKIAkJaWYgKGRldmljZS0+dmVyc2lvbiA+PSBJT0FUX1ZFUl8zXzMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9xY29tLXNwcy1kbWEuYyBiL2RyaXZlcnMvZG1hL3Fjb20tc3BzLWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmQ2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9xY29tLXNwcy1kbWEuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKy8qCisgKiBRdWFsY29tbSB0ZWNobm9sb2dpZXMgaW5jLCBETUEgQVBJIGZvciBCQU0gKEJ1cyBBY2Nlc3MgTWFuYWdlcikuCisgKiBUaGlzIERNQSBkcml2ZXIgdXNlcyBzcHMtQkFNIEFQSSB0byBhY2Nlc3MgdGhlIEhXLCB0aHVzIGl0IGlzIGVmZmVjdGl2ZWx5IGEKKyAqIERNQSBlbmdpbmUgd3JhcHBlciBvZiB0aGUgc3BzLUJBTSBBUEkuCisgKgorICogQ2xpZW50IGNoYW5uZWwgY29uZmlndXJhdGlvbiBleGFtcGxlOgorICogc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY29uZmlnIHsKKyAqICAgIC5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKKyAqIH07CisgKgorICogY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoY2xpZW50X2RldiwgInJ4Iik7CisgKiBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGNoYW4sICZjb25maWcpOworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbS1zcHMuaD4KKyNpbmNsdWRlICJkbWFlbmdpbmUuaCIKKworI2RlZmluZSBRQkFNX09GX1NMQVZFX05fQVJHUwkoNCkKKyNkZWZpbmUgUUJBTV9PRl9NQU5BR0VfTE9DQUwJInFjb20sbWFuYWdlZC1sb2NhbGx5IgorI2RlZmluZSBRQkFNX09GX1NVTV9USFJFU0hPTEQJInFjb20sc3VtbWluZy10aHJlc2hvbGQiCisjZGVmaW5lIFFCQU1fTUFYX0RFU0NSSVBUT1JTCSgweDEwMCkKKyNkZWZpbmUgUUJBTV9NQVhfQ0hBTk5FTFMJKDMyKQorCisvKgorICogcWJhbV9hc3luY190eF9kZXNjcmlwdG9yIC0gZG1hIGRlc2NyaXB0b3IgcGx1cyBhIGxpc3Qgb2YgeGZlcl9idWZzCisgKgorICogQHNnbCBzY2F0dGVybGlzdCBvZiB0cmFuc2ZlciBidWZmZXJzCisgKiBAc2dfbGVuIHNpemUgb2YgdGhhdCBsaXN0CisgKiBAZmxhZ3MgZG1hIHhmZXIgZmxhZ3MKKyAqLworc3RydWN0IHFiYW1fYXN5bmNfdHhfZGVzY3JpcHRvciB7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCWRtYV9kZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdAkJKnNnbDsKKwl1bnNpZ25lZCBpbnQJCQlzZ19sZW47CisJdW5zaWduZWQgbG9uZwkJCWZsYWdzOworfTsKKworI2RlZmluZSBETUFfVE9fUUJBTV9BU1lOQ19ERVNDKGRtYV9hc3luY19kZXNjKSBcCisJY29udGFpbmVyX29mKGRtYV9hc3luY19kZXNjLCBzdHJ1Y3QgcWJhbV9hc3luY190eF9kZXNjcmlwdG9yLCBkbWFfZGVzYykKKworc3RydWN0IHFiYW1fY2hhbm5lbDsKKy8qCisgKiBxYmFtX2RldmljZSAtIHRvcCBsZXZlbCBkZXZpY2Ugb2YgY3VycmVudCBkcml2ZXIKKyAqIEBoYW5kbGUgYmFtIHNwcyBoYW5kbGUuCisgKiBAcmVncyBiYW0gcmVnaXN0ZXIgc3BhY2UgdmlydHVhbCBiYXNlIGFkZHJlc3MuCisgKiBAbWVtX3Jlc291cmNlIGJhbSByZWdpc3RlciBzcGFjZSByZXNvdXJjZS4KKyAqIEBkZXJlZ2lzdGVyX3JlcXVpcmVkIGlmIGJhbSBpcyByZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyIGl0IG5lZWQgdG8gYmUKKyAqICAgdW5yZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyLgorICogQG1hbmFnZSBpcyBiYW1lIG1hbmFnZWQgbG9jYWxseSBvciByZW1vdGVseSwKKyAqIEBzdW1taW5nX3RocmVzaG9sZCBldmVudCB0aHJlc2hvbGQuCisgKiBAaXJxIGJhbSBpbnRlcnJ1cHQgbGluZS4KKyAqIEBjaGFubmVscyBoYXMgdGhlIHNhbWUgY2hhbm5lbHMgYXMgcWJhbV9kZXYtPmRtYV9kZXYuY2hhbm5lbHMgYnV0CisgKiAgIHN1cHBvcnRzIGZhc3QgYWNjZXNzIGJ5IHBpcGUgaW5kZXguCisgKi8KK3N0cnVjdCBxYmFtX2RldmljZSB7CisJc3RydWN0IGRtYV9kZXZpY2UJCWRtYV9kZXY7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisJc3RydWN0IHJlc291cmNlCQkJKm1lbV9yZXNvdXJjZTsKKwl1bG9uZwkJCQloYW5kbGU7CisJYm9vbAkJCQlkZXJlZ2lzdGVyX3JlcXVpcmVkOworCXUzMgkJCQlzdW1taW5nX3RocmVzaG9sZDsKKwl1MzIJCQkJbWFuYWdlOworCWludAkJCQlpcnE7CisJc3RydWN0IHFiYW1fY2hhbm5lbAkJKmNoYW5uZWxzW1FCQU1fTUFYX0NIQU5ORUxTXTsKK307CisKKy8qIHFiYW1fcGlwZTogYWdncmVnYXRlIG9mIGJhbSBwaXBlIHJlbGF0ZWQgZW50cmllcyBvZiBxYmFtX2NoYW5uZWwgKi8KK3N0cnVjdCBxYmFtX3BpcGUgeworCXUzMgkJCQlpbmRleDsKKwlzdHJ1Y3Qgc3BzX3BpcGUJCQkqaGFuZGxlOworCXN0cnVjdCBzcHNfY29ubmVjdAkJY2ZnOworCXUzMgkJCQludW1fZGVzY3JpcHRvcnM7CisJdTMyCQkJCXNwc19jb25uZWN0X2ZsYWdzOworCXUzMgkJCQlzcHNfcmVnaXN0ZXJfZXZlbnRfZmxhZ3M7Cit9OworCisvKgorICogcWJhbV9jaGFubmVsIC0gZG1hIGNoYW5uZWwgcGx1cyBiYW0gcGlwZSBpbmZvIGFuZCBjdXJyZW50IHBlbmRpbmcgdHJhbnNmZXJzCisgKgorICogQGRpcmVjdGlvbiBpcyBhIHByb2R1Y2VyIG9yIGNvbnN1bWVyIChNRU0gPT4gREVWIG9yIERFViA9PiBNRU0pCisgKiBAcGVuZGluZ19kZXNjIG5leHQgc2V0IG9mIHRyYW5zZmVyIHRvIHByb2Nlc3MKKyAqIEBlcnJvciBsYXN0IGVycm9yIHRoYXQgdG9vayBwbGFjZSBvbiB0aGUgY3VycmVudCBwZW5kaW5nX2Rlc2MKKyAqLworc3RydWN0IHFiYW1fY2hhbm5lbCB7CisJc3RydWN0IHFiYW1fcGlwZQkJYmFtX3BpcGU7CisKKwlzdHJ1Y3QgZG1hX2NoYW4JCQljaGFuOworCWVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbglkaXJlY3Rpb247CisJc3RydWN0IHFiYW1fYXN5bmNfdHhfZGVzY3JpcHRvcglwZW5kaW5nX2Rlc2M7CisKKwlzdHJ1Y3QgcWJhbV9kZXZpY2UJCSpxYmFtX2RldjsKKwlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOworCWludAkJCQllcnJvcjsKK307CisjZGVmaW5lIERNQV9UT19RQkFNX0NIQU4oZG1hX2NoYW4pIFwKKwkJCWNvbnRhaW5lcl9vZihkbWFfY2hhbiwgc3RydWN0IHFiYW1fY2hhbm5lbCwgY2hhbikKKyNkZWZpbmUgcWJhbV9lcnIocWJhbV9kZXYsIGZtdCAuLi4pIGRldl9lcnIocWJhbV9kZXYtPmRtYV9kZXYuZGV2LCBmbXQpCisKKy8qICBxYmFtX2Rpc2Nvbm5lY3RfY2hhbiAtIGRpc2Nvbm5lY3QgYSBjaGFubmVsICovCitzdGF0aWMgaW50IHFiYW1fZGlzY29ubmVjdF9jaGFuKHN0cnVjdCBxYmFtX2NoYW5uZWwgKnFiYW1fY2hhbikKK3sKKwlzdHJ1Y3QgcWJhbV9kZXZpY2UgICpxYmFtX2RldiAgICA9IHFiYW1fY2hhbi0+cWJhbV9kZXY7CisJc3RydWN0IHNwc19waXBlICAgICAqcGlwZV9oYW5kbGUgPSBxYmFtX2NoYW4tPmJhbV9waXBlLmhhbmRsZTsKKwlzdHJ1Y3Qgc3BzX2Nvbm5lY3QgICBwaXBlX2NvbmZpZ19ub19pcnEgPSB7Lm9wdGlvbnMgPSBTUFNfT19QT0xMfTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBTVyB3b3JrYXJvdW5kOgorCSAqIFdoZW4gZGlzY29ubmVjdGluZyBCQU0gcGlwZSBhIHNwdXJpb3VzIGludGVycnVwdCBzb21ldGltZXMgYXBwZWFycy4KKwkgKiBUbyBhdm9pZCB0aGF0LCB3ZSBjaGFuZ2UgdGhlIHBpcGUgc2V0dGluZyBmcm9tIGludGVycnVwdCAoZGVmYXVsdCkKKwkgKiB0byBwb2xsaW5nIChTUFNfT19QT0xMKSBiZWZvcmUgZGljb25uZWN0aW5nIHRoZSBwaXBlLgorCSAqLworCXJldCA9IHNwc19zZXRfY29uZmlnKHBpcGVfaGFuZGxlLCAmcGlwZV9jb25maWdfbm9faXJxKTsKKwlpZiAocmV0KQorCQlxYmFtX2VycihxYmFtX2RldiwKKwkJCSJlcnJvcjolZCBzcHNfc2V0X2NvbmZpZyhwaXBlOiVkKSBiZWZvcmUgZGlzY29ubmVjdFxuIiwKKwkJCXJldCwgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7CisKKwlyZXQgPSBzcHNfZGlzY29ubmVjdChwaXBlX2hhbmRsZSk7CisJaWYgKHJldCkKKwkJcWJhbV9lcnIocWJhbV9kZXYsICJlcnJvcjolZCBzcHNfZGlzY29ubmVjdChwaXBlOiVkKVxuIiwKKwkJCSByZXQsIHFiYW1fY2hhbi0+YmFtX3BpcGUuaW5kZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogIHFiYW1fZnJlZV9jaGFuIC0gZGlzY29ubmVjdCBjaGFubmVsIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMgKi8KK3N0YXRpYyB2b2lkIHFiYW1fZnJlZV9jaGFuKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgcWJhbV9jaGFubmVsICpxYmFtX2NoYW4gPSBETUFfVE9fUUJBTV9DSEFOKGNoYW4pOworCXN0cnVjdCBxYmFtX2RldmljZSAgKnFiYW1fZGV2ICA9IHFiYW1fY2hhbi0+cWJhbV9kZXY7CisKKwltdXRleF9sb2NrKCZxYmFtX2NoYW4tPmxvY2spOworCWlmIChxYmFtX2Rpc2Nvbm5lY3RfY2hhbihxYmFtX2NoYW4pKQorCQlxYmFtX2VycihxYmFtX2RldiwKKwkJCSJlcnJvciBmcmVlX2NoYW4oKSBmYWlsZWQgdG8gZGlzY29ubmVjdChwaXBlOiVkKVxuIiwKKwkJCXFiYW1fY2hhbi0+YmFtX3BpcGUuaW5kZXgpOworCXFiYW1fY2hhbi0+cGVuZGluZ19kZXNjLnNnbCA9IE5VTEw7CisJcWJhbV9jaGFuLT5wZW5kaW5nX2Rlc2Muc2dfbGVuID0gMDsKKwltdXRleF91bmxvY2soJnFiYW1fY2hhbi0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NoYW4gKnFiYW1fZG1hX3hsYXRlKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmRtYV9zcGVjLAorCQkJCQkJCXN0cnVjdCBvZl9kbWEgKm9mKQoreworCXN0cnVjdCBxYmFtX2RldmljZSAgKnFiYW1fZGV2ICA9IG9mLT5vZl9kbWFfZGF0YTsKKwlzdHJ1Y3QgcWJhbV9jaGFubmVsICpxYmFtX2NoYW47CisJdTMyIGNoYW5uZWxfaW5kZXg7CisJdTMyIG51bV9kZXNjcmlwdG9yczsKKworCWlmIChkbWFfc3BlYy0+YXJnc19jb3VudCAhPSBRQkFNX09GX1NMQVZFX05fQVJHUykgeworCQlxYmFtX2VycihxYmFtX2RldiwKKwkJCSJpbnZhbGlkIG51bWJlciBvZiBkbWEgYXJndW1lbnRzLCBleHBlY3Q6JWQgZ290OiVkXG4iLAorCQkJUUJBTV9PRl9TTEFWRV9OX0FSR1MsIGRtYV9zcGVjLT5hcmdzX2NvdW50KTsKKwkJcmV0dXJuIE5VTEw7CisJfTsKKworCWNoYW5uZWxfaW5kZXggPSBkbWFfc3BlYy0+YXJnc1swXTsKKworCWlmIChjaGFubmVsX2luZGV4ID49IFFCQU1fTUFYX0NIQU5ORUxTKSB7CisJCXFiYW1fZXJyKHFiYW1fZGV2LAorCQkJImVycm9yOiBjaGFubmVsX2luZGV4OiVkIG91dCBvZiBib3VuZHMiLAorCQkJY2hhbm5lbF9pbmRleCk7CisJCXJldHVybiBOVUxMOworCX0KKwlxYmFtX2NoYW4gPSBxYmFtX2Rldi0+Y2hhbm5lbHNbY2hhbm5lbF9pbmRleF07CisJIC8qIHJldHVybiBxYmFtX2NoYW4gaWYgZXhpc3RzLCBvciBjcmVhdGUgb25lICovCisJaWYgKHFiYW1fY2hhbikgeworCQlxYmFtX2NoYW4tPmNoYW4uY2xpZW50X2NvdW50ID0gMTsKKwkJcmV0dXJuICZxYmFtX2NoYW4tPmNoYW47CisJfQorCisJbnVtX2Rlc2NyaXB0b3JzID0gZG1hX3NwZWMtPmFyZ3NbMV07CisJaWYgKCFudW1fZGVzY3JpcHRvcnMgfHwgKG51bV9kZXNjcmlwdG9ycyA+IFFCQU1fTUFYX0RFU0NSSVBUT1JTKSkgeworCQlxYmFtX2VycihxYmFtX2RldiwKKwkJCSJpbnZhbGlkIG51bWJlciBvZiBkZXNjcmlwdG9ycywgcmFuZ2VbMS4uJWRdIGdvdDolZFxuIiwKKwkJCVFCQU1fTUFYX0RFU0NSSVBUT1JTLCBudW1fZGVzY3JpcHRvcnMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhIGNoYW5uZWwgKi8KKwlxYmFtX2NoYW4gPSBremFsbG9jKHNpemVvZigqcWJhbV9jaGFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxYmFtX2NoYW4pCisJCXJldHVybiBOVUxMOworCisJLyogYWxsb2NhdGUgQkFNIHJlc291cmNlcyBmb3IgdGhhdCBjaGFubmVsICovCisJcWJhbV9jaGFuLT5iYW1fcGlwZS5oYW5kbGUgPSBzcHNfYWxsb2NfZW5kcG9pbnQoKTsKKwlpZiAoIXFiYW1fY2hhbi0+YmFtX3BpcGUuaGFuZGxlKSB7CisJCXFiYW1fZXJyKHFiYW1fZGV2LCAiZXJyb3I6IHNwc19hbGxvY19lbmRwb2ludCgpIHJldHVybiBOVUxMXG4iKTsKKwkJa2ZyZWUocWJhbV9jaGFuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogaW5pdCBkbWFfY2hhbiAqLworCXFiYW1fY2hhbi0+Y2hhbi5kZXZpY2UgPSAmcWJhbV9kZXYtPmRtYV9kZXY7CisJZG1hX2Nvb2tpZV9pbml0KCZxYmFtX2NoYW4tPmNoYW4pOworCXFiYW1fY2hhbi0+Y2hhbi5jbGllbnRfY291bnQgICAgICAgICAgICAgICAgID0gMTsKKwkvKiBpbml0IHFiYW1fY2hhbiAqLworCXFiYW1fY2hhbi0+YmFtX3BpcGUuaW5kZXggICAgICAgICAgICAgICAgICAgID0gY2hhbm5lbF9pbmRleDsKKwlxYmFtX2NoYW4tPmJhbV9waXBlLm51bV9kZXNjcmlwdG9ycyAgICAgICAgICA9IG51bV9kZXNjcmlwdG9yczsKKwlxYmFtX2NoYW4tPmJhbV9waXBlLnNwc19jb25uZWN0X2ZsYWdzICAgICAgICA9IGRtYV9zcGVjLT5hcmdzWzJdOworCXFiYW1fY2hhbi0+YmFtX3BpcGUuc3BzX3JlZ2lzdGVyX2V2ZW50X2ZsYWdzID0gZG1hX3NwZWMtPmFyZ3NbM107CisJcWJhbV9jaGFuLT5xYmFtX2RldiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBxYmFtX2RldjsKKwltdXRleF9pbml0KCZxYmFtX2NoYW4tPmxvY2spOworCisJLyogYWRkIHRvIGRtYV9kZXZpY2UgbGlzdCBvZiBjaGFubmVscyAqLworCWxpc3RfYWRkKCZxYmFtX2NoYW4tPmNoYW4uZGV2aWNlX25vZGUsICZxYmFtX2Rldi0+ZG1hX2Rldi5jaGFubmVscyk7CisJcWJhbV9kZXYtPmNoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID0gcWJhbV9jaGFuOworCisJcmV0dXJuICZxYmFtX2NoYW4tPmNoYW47Cit9CisKK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMgcWJhbV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJZG1hX2Nvb2tpZV90IGNvb2tpZSwgc3RydWN0IGRtYV90eF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuID0gRE1BX1RPX1FCQU1fQ0hBTihjaGFuKTsKKwlzdHJ1Y3QgcWJhbV9hc3luY190eF9kZXNjcmlwdG9yCSpxYmFtX2Rlc2MgPSAmcWJhbV9jaGFuLT5wZW5kaW5nX2Rlc2M7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKworCW11dGV4X2xvY2soJnFiYW1fY2hhbi0+bG9jayk7CisKKwlpZiAocWJhbV9jaGFuLT5lcnJvcikgeworCQltdXRleF91bmxvY2soJnFiYW1fY2hhbi0+bG9jayk7CisJCXJldHVybiBETUFfRVJST1I7CisJfQorCisJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoY2hhbiwgY29va2llLCBzdGF0ZSk7CisJaWYgKHJldCA9PSBETUFfSU5fUFJPR1JFU1MpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJaW50IGk7CisJCXUzMiB0cmFuc2Zlcl9zaXplID0gMDsKKworCQlmb3JfZWFjaF9zZyhxYmFtX2Rlc2MtPnNnbCwgc2csIHFiYW1fZGVzYy0+c2dfbGVuLCBpKQorCQkJdHJhbnNmZXJfc2l6ZSArPSBzZ19kbWFfbGVuKHNnKTsKKworCQlkbWFfc2V0X3Jlc2lkdWUoc3RhdGUsIHRyYW5zZmVyX3NpemUpOworCX0KKwltdXRleF91bmxvY2soJnFiYW1fY2hhbi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcWJhbV9pbml0X2JhbV9oYW5kbGUgLSBmaW5kIG9yIGNyZWF0ZSBiYW0gaGFuZGxlLgorICoKKyAqIEJBTSBkZXZpY2UgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgZWFjaCBCTFNQIG9uY2UgYW5kIG9ubHkgb25jZS4gaWYgaXQKKyAqIHdhcyByZWdpc3RlcmVkLCB0aGVuIHdlIGZpbmQgdGhlIGhhbmRsZSB0byB0aGUgcmVnaXN0ZXJlZCBiYW0gYW5kIHJldHVybgorICogaXQsIG90aGVyd2lzZSB3ZSByZWdpc3RlciBpdCBoZXJlLgorICogVGhlIG1vZHVsZSB3aGljaCByZWdpc3RlcmVkIEJBTSBpcyByZXNwb25zaWJsZSBmb3IgZGVyZWdpc3RlcmluZyBpdC4KKyAqLworc3RhdGljIGludCBxYmFtX2luaXRfYmFtX2hhbmRsZShzdHJ1Y3QgcWJhbV9kZXZpY2UgKnFiYW1fZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzcHNfYmFtX3Byb3BzIGJhbV9wcm9wcyA9IHswfTsKKworCS8qCisJICogQ2hlY2sgaWYgQkFNIGlzIGFscmVhZHkgcmVnaXN0cmVkIHdpdGggU1BTIG9uIHRoZSBjdXJyZW50CisJICogQkxTUC4gSWYgaXQgaXNuJ3QgdGhlbiBnbyBhaGVhZCBhbmQgcmVnaXN0ZXIgaXQuCisJICovCisJcmV0ID0gc3BzX3BoeTJoKHFiYW1fZGV2LT5tZW1fcmVzb3VyY2UtPnN0YXJ0LCAmcWJhbV9kZXYtPmhhbmRsZSk7CisJaWYgKHFiYW1fZGV2LT5oYW5kbGUpCisJCXJldHVybiAwOworCisJcWJhbV9kZXYtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UocWJhbV9kZXYtPmRtYV9kZXYuZGV2LAorCQkJCQkgICAgICAgcWJhbV9kZXYtPm1lbV9yZXNvdXJjZSk7CisJaWYgKElTX0VSUihxYmFtX2Rldi0+cmVncykpIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsICJlcnJvcjolbGQgaW9yZW1hcChwaHk6MHglbHggbGVuOjB4JWx4KVxuIiwKKwkJCSBQVFJfRVJSKHFiYW1fZGV2LT5yZWdzKSwKKwkJCSAodWxvbmcpIHFiYW1fZGV2LT5tZW1fcmVzb3VyY2UtPnN0YXJ0LAorCQkJICh1bG9uZykgcmVzb3VyY2Vfc2l6ZShxYmFtX2Rldi0+bWVtX3Jlc291cmNlKSk7CisJCXJldHVybiBQVFJfRVJSKHFiYW1fZGV2LT5yZWdzKTsKKwl9OworCisJYmFtX3Byb3BzLnBoeXNfYWRkcgkJPSBxYmFtX2Rldi0+bWVtX3Jlc291cmNlLT5zdGFydDsKKwliYW1fcHJvcHMudmlydF9hZGRyCQk9IHFiYW1fZGV2LT5yZWdzOworCWJhbV9wcm9wcy5zdW1taW5nX3RocmVzaG9sZAk9IHFiYW1fZGV2LT5zdW1taW5nX3RocmVzaG9sZDsKKwliYW1fcHJvcHMubWFuYWdlCQk9IHFiYW1fZGV2LT5tYW5hZ2U7CisJYmFtX3Byb3BzLmlycQkJCT0gcWJhbV9kZXYtPmlycTsKKworCXJldCA9IHNwc19yZWdpc3Rlcl9iYW1fZGV2aWNlKCZiYW1fcHJvcHMsICZxYmFtX2Rldi0+aGFuZGxlKTsKKwlpZiAocmV0KQorCQlxYmFtX2VycihxYmFtX2RldiwgImVycm9yOiVkIHNwc19yZWdpc3Rlcl9iYW1fZGV2aWNlXG4iCisJCQkgIihwaHk6MHglbHggdmlydDoweCVseCBpcnE6JWQpXG4iLAorCQkJIHJldCwgKHVsb25nKSBiYW1fcHJvcHMucGh5c19hZGRyLAorCQkJICh1bG9uZykgYmFtX3Byb3BzLnZpcnRfYWRkciwgcWJhbV9kZXYtPmlycSk7CisJZWxzZQorCQlxYmFtX2Rldi0+ZGVyZWdpc3Rlcl9yZXF1aXJlZCA9IHRydWU7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcWJhbV9hbGxvY19jaGFuKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWJhbV9lb3RfY2FsbGJhY2soc3RydWN0IHNwc19ldmVudF9ub3RpZnkgKm5vdGlmeSkKK3sKKwlzdHJ1Y3QgcWJhbV9hc3luY190eF9kZXNjcmlwdG9yICpxYmFtX2Rlc2MgPSBub3RpZnktPmRhdGEudHJhbnNmZXIudXNlcjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgICpkbWFfZGVzYyAgPSAmcWJhbV9kZXNjLT5kbWFfZGVzYzsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2sJPSBkbWFfZGVzYy0+Y2FsbGJhY2s7CisJdm9pZCAqcGFyYW0JCQk9IGRtYV9kZXNjLT5jYWxsYmFja19wYXJhbTsKKworCWlmIChjYWxsYmFjaykKKwkJY2FsbGJhY2socGFyYW0pOworfQorCitzdGF0aWMgdm9pZCBxYmFtX2Vycm9yX2NhbGxiYWNrKHN0cnVjdCBzcHNfZXZlbnRfbm90aWZ5ICpub3RpZnkpCit7CisJc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuCT0gbm90aWZ5LT51c2VyOworCisJcWJhbV9lcnIocWJhbV9jaGFuLT5xYmFtX2RldiwgImVycm9yOiBxYmFtX2Vycm9yX2NhbGxiYWNrKHBpcGU6JWRcbikiLAorCQkgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgcWJhbV9jb25uZWN0X2NoYW4oc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBxYmFtX2RldmljZSAgICAgICAqcWJhbV9kZXYgPSBxYmFtX2NoYW4tPnFiYW1fZGV2OworCXN0cnVjdCBzcHNfcmVnaXN0ZXJfZXZlbnQgYmFtX2VvdF9ldmVudCA9IHsKKwkJLm1vZGUJCT0gU1BTX1RSSUdHRVJfQ0FMTEJBQ0ssCisJCS5vcHRpb25zCT0gcWJhbV9jaGFuLT5iYW1fcGlwZS5zcHNfcmVnaXN0ZXJfZXZlbnRfZmxhZ3MsCisJCS5jYWxsYmFjawk9IHFiYW1fZW90X2NhbGxiYWNrLAorCQl9OworCXN0cnVjdCBzcHNfcmVnaXN0ZXJfZXZlbnQgYmFtX2Vycm9yX2V2ZW50ID0geworCQkubW9kZQkJPSBTUFNfVFJJR0dFUl9DQUxMQkFDSywKKwkJLm9wdGlvbnMJPSBTUFNfT19FUlJPUiwKKwkJLmNhbGxiYWNrCT0gcWJhbV9lcnJvcl9jYWxsYmFjaywKKwkJLnVzZXIJCT0gcWJhbV9jaGFuLAorCQl9OworCisJcmV0ID0gc3BzX2Nvbm5lY3QocWJhbV9jaGFuLT5iYW1fcGlwZS5oYW5kbGUsICZxYmFtX2NoYW4tPmJhbV9waXBlLmNmZyk7CisJaWYgKHJldCkgeworCQlxYmFtX2VycihxYmFtX2RldiwgImVycm9yOiVkIHNwc19jb25uZWN0KHBpcGU6JWQpXG4iLCByZXQsCisJCQkgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3BzX3JlZ2lzdGVyX2V2ZW50KHFiYW1fY2hhbi0+YmFtX3BpcGUuaGFuZGxlLCAmYmFtX2VvdF9ldmVudCk7CisJaWYgKHJldCkgeworCQlxYmFtX2VycihxYmFtX2RldiwgImVycm9yOiVkIHNwc19yZWdpc3Rlcl9ldmVudChlb3RAcGlwZTolZClcbiIsCisJCQkgcmV0LCBxYmFtX2NoYW4tPmJhbV9waXBlLmluZGV4KTsKKwkJZ290byBuZWVkX2Rpc2Nvbm5lY3Q7CisJfQorCisJcmV0ID0gc3BzX3JlZ2lzdGVyX2V2ZW50KHFiYW1fY2hhbi0+YmFtX3BpcGUuaGFuZGxlLCAmYmFtX2Vycm9yX2V2ZW50KTsKKwlpZiAocmV0KSB7CisJCXFiYW1fZXJyKHFiYW1fZGV2LCAiZXJyb3I6JWQgc3BzX3JlZ2lzdGVyX2V2ZW50KGVyckBwaXBlOiVkKVxuIiwKKwkJCSByZXQsIHFiYW1fY2hhbi0+YmFtX3BpcGUuaW5kZXgpOworCQlnb3RvIG5lZWRfZGlzY29ubmVjdDsKKwl9CisKKwlyZXR1cm4gMDsKKworbmVlZF9kaXNjb25uZWN0OgorCXJldCA9IHNwc19kaXNjb25uZWN0KHFiYW1fY2hhbi0+YmFtX3BpcGUuaGFuZGxlKTsKKwlpZiAocmV0KQorCQlxYmFtX2VycihxYmFtX2RldiwgImVycm9yOiVkIHNwc19kaXNjb25uZWN0KHBpcGU6JWQpXG4iLCByZXQsCisJCQkgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHFiYW1fc2xhdmVfY2ZnIC0gY29uZmlndXJlIGFuZCBjb25uZWN0IGEgQkFNIHBpcGUKKyAqCisgKiBAY2ZnIG9ubHkgY2FyZXMgYWJvdXQgY2ZnLT5kaXJlY3Rpb24KKyAqLworc3RhdGljIGludCBxYmFtX3NsYXZlX2NmZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBxYmFtX2NoYW5uZWwgKnFiYW1fY2hhbiA9IERNQV9UT19RQkFNX0NIQU4oY2hhbik7CisJc3RydWN0IHFiYW1fZGV2aWNlICpxYmFtX2RldiA9IHFiYW1fY2hhbi0+cWJhbV9kZXY7CisJc3RydWN0IHNwc19jb25uZWN0ICpwaXBlX2NmZyA9ICZxYmFtX2NoYW4tPmJhbV9waXBlLmNmZzsKKworCWlmICghcWJhbV9kZXYtPmhhbmRsZSkgeworCQlyZXQgPSBxYmFtX2luaXRfYmFtX2hhbmRsZShxYmFtX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChxYmFtX2NoYW4tPmJhbV9waXBlLmNmZy5kZXNjLmJhc2UpCisJCWdvdG8gY2ZnX2RvbmU7CisKKwlyZXQgPSBzcHNfZ2V0X2NvbmZpZyhxYmFtX2NoYW4tPmJhbV9waXBlLmhhbmRsZSwKKwkJCQkJCSZxYmFtX2NoYW4tPmJhbV9waXBlLmNmZyk7CisJaWYgKHJldCkgeworCQlxYmFtX2VycihxYmFtX2RldiwgImVycm9yOiVkIHNwc19nZXRfY29uZmlnKDB4JXApXG4iLAorCQkJIHJldCwgcWJhbV9jaGFuLT5iYW1fcGlwZS5oYW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXFiYW1fY2hhbi0+ZGlyZWN0aW9uID0gY2ZnLT5kaXJlY3Rpb247CisJaWYgKGNmZy0+ZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKSB7CisJCXBpcGVfY2ZnLT5zb3VyY2UgICAgICAgICAgPSBTUFNfREVWX0hBTkRMRV9NRU07CisJCXBpcGVfY2ZnLT5kZXN0aW5hdGlvbiAgICAgPSBxYmFtX2Rldi0+aGFuZGxlOworCQlwaXBlX2NmZy0+bW9kZSAgICAgICAgICAgID0gU1BTX01PREVfREVTVDsKKwkJcGlwZV9jZmctPnNyY19waXBlX2luZGV4ICA9IDA7CisJCXBpcGVfY2ZnLT5kZXN0X3BpcGVfaW5kZXggPSBxYmFtX2NoYW4tPmJhbV9waXBlLmluZGV4OworCX0gZWxzZSB7CisJCXBpcGVfY2ZnLT5zb3VyY2UgICAgICAgICAgPSBxYmFtX2Rldi0+aGFuZGxlOworCQlwaXBlX2NmZy0+ZGVzdGluYXRpb24gICAgID0gU1BTX0RFVl9IQU5ETEVfTUVNOworCQlwaXBlX2NmZy0+bW9kZSAgICAgICAgICAgID0gU1BTX01PREVfU1JDOworCQlwaXBlX2NmZy0+c3JjX3BpcGVfaW5kZXggID0gcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleDsKKwkJcGlwZV9jZmctPmRlc3RfcGlwZV9pbmRleCA9IDA7CisJfQorCXBpcGVfY2ZnLT5vcHRpb25zICAgPSAgcWJhbV9jaGFuLT5iYW1fcGlwZS5zcHNfY29ubmVjdF9mbGFnczsKKwlwaXBlX2NmZy0+ZGVzYy5zaXplID0gKHFiYW1fY2hhbi0+YmFtX3BpcGUubnVtX2Rlc2NyaXB0b3JzICsgMSkgKgorCQkJCQkJIHNpemVvZihzdHJ1Y3Qgc3BzX2lvdmVjKTsKKwkvKiBtYW5hZ2VkIGRtYV9hbGxvY19jb2hlcmVudCgpICovCisJcGlwZV9jZmctPmRlc2MuYmFzZSA9IGRtYW1fYWxsb2NfY29oZXJlbnQocWJhbV9kZXYtPmRtYV9kZXYuZGV2LAorCQkJCQkJICBwaXBlX2NmZy0+ZGVzYy5zaXplLAorCQkJCQkJICAmcGlwZV9jZmctPmRlc2MucGh5c19iYXNlLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIXBpcGVfY2ZnLT5kZXNjLmJhc2UpIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsCisJCQkiZXJyb3IgZG1hX2FsbG9jX2NvaGVyZW50KGRlc2Mtc3o6JWxsdSAqIG4tZGVzY3M6JWQpXG4iLAorCQkJKHU2NCkgc2l6ZW9mKHN0cnVjdCBzcHNfaW92ZWMpLAorCQkJcWJhbV9jaGFuLT5iYW1fcGlwZS5udW1fZGVzY3JpcHRvcnMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CitjZmdfZG9uZToKKwlyZXQgPSBxYmFtX2Nvbm5lY3RfY2hhbihxYmFtX2NoYW4pOworCWlmIChyZXQpCisJCWRtYW1fZnJlZV9jb2hlcmVudChxYmFtX2Rldi0+ZG1hX2Rldi5kZXYsIHBpcGVfY2ZnLT5kZXNjLnNpemUsCisJCQkJIHBpcGVfY2ZnLT5kZXNjLmJhc2UsIHBpcGVfY2ZnLT5kZXNjLnBoeXNfYmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFiYW1fZmx1c2hfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuID0gRE1BX1RPX1FCQU1fQ0hBTihjaGFuKTsKKwlpbnQgcmV0ID0gcWJhbV9kaXNjb25uZWN0X2NoYW4ocWJhbV9jaGFuKTsKKworCWlmIChyZXQpIHsKKwkJcWJhbV9lcnIocWJhbV9jaGFuLT5xYmFtX2RldiwKKwkJCSAiZXJyb3I6IGRpc2Nvbm5lY3QgZmx1c2gocGlwZTolZFxuKSIsCisJCQkgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHFiYW1fY29ubmVjdF9jaGFuKHFiYW1fY2hhbik7CisJaWYgKHJldCkKKwkJcWJhbV9lcnIocWJhbV9jaGFuLT5xYmFtX2RldiwKKwkJCSAiZXJyb3I6IHJlY29ubmVjdCBmbHVzaChwaXBlOiVkXG4pIiwKKwkJCSBxYmFtX2NoYW4tPmJhbV9waXBlLmluZGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBxYmFtX3R4X3N1Ym1pdCAtIHNldHMgdGhlIGRlc2NyaXB0b3IgYXMgdGhlIG5leHQgb25lIHRvIGJlIGV4ZWN1dGVkICovCitzdGF0aWMgZG1hX2Nvb2tpZV90IHFiYW1fdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZG1hX2Rlc2MpCit7CisJc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuID0gRE1BX1RPX1FCQU1fQ0hBTihkbWFfZGVzYy0+Y2hhbik7CisJZG1hX2Nvb2tpZV90IHJldDsKKworCW11dGV4X2xvY2soJnFiYW1fY2hhbi0+bG9jayk7CisKKwlyZXQgPSBkbWFfY29va2llX2Fzc2lnbihkbWFfZGVzYyk7CisKKwltdXRleF91bmxvY2soJnFiYW1fY2hhbi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcWJhbV9wcmVwX3NsYXZlX3NnIC0gY3JlYXRlcyBxYmFtX3hmZXJfYnVmIGZyb20gYSBsaXN0IG9mIHNnCisgKgorICogQGNoYW46IGRtYSBjaGFubmVsCisgKiBAc2dsOiBzY2F0dGVyIGdhdGhlciBsaXN0CisgKiBAc2dfbGVuOiBsZW5ndGggb2Ygc2cKKyAqIEBkaXJlY3Rpb246IERNQSB0cmFuc2ZlciBkaXJlY3Rpb24KKyAqIEBmbGFnczogRE1BIGZsYWdzCisgKiBAY29udGV4dDogdHJhbnNmZXIgY29udGV4dCAodW51c2VkKQorICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBkZXNjcmlwdG9yIG9yIG5lZ2F0aXZlIEVSUl9QVFIoKSBvbiBlcnJvcgorICovCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpxYmFtX3ByZXBfc2xhdmVfc2coc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgc2dfbGVuLAorCWVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXJlY3Rpb24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgcWJhbV9jaGFubmVsICpxYmFtX2NoYW4gPSBETUFfVE9fUUJBTV9DSEFOKGNoYW4pOworCXN0cnVjdCBxYmFtX2RldmljZSAqcWJhbV9kZXYgPSBxYmFtX2NoYW4tPnFiYW1fZGV2OworCXN0cnVjdCBxYmFtX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnFiYW1fZGVzYyA9ICZxYmFtX2NoYW4tPnBlbmRpbmdfZGVzYzsKKworCWlmIChxYmFtX2NoYW4tPmRpcmVjdGlvbiAhPSBkaXJlY3Rpb24pIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsCisJCQkiaW52YWxpZCBkbWEgdHJhbnNmZXIgZGlyZWN0aW9uIGV4cGVjdGVkOiVkIGdpdmVuOiVkXG4iLAorCQkJcWJhbV9jaGFuLT5kaXJlY3Rpb24sIGRpcmVjdGlvbik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXFiYW1fZGVzYy0+ZG1hX2Rlc2MuY2hhbgk9ICZxYmFtX2NoYW4tPmNoYW47CisJcWJhbV9kZXNjLT5kbWFfZGVzYy50eF9zdWJtaXQJPSBxYmFtX3R4X3N1Ym1pdDsKKwlxYmFtX2Rlc2MtPnNnbAkJCT0gc2dsOworCXFiYW1fZGVzYy0+c2dfbGVuCQk9IHNnX2xlbjsKKwlxYmFtX2Rlc2MtPmZsYWdzCQk9IGZsYWdzOworCXJldHVybiAmcWJhbV9kZXNjLT5kbWFfZGVzYzsKK30KKworLyoKKyAqIHFiYW1faXNzdWVfcGVuZGluZyAtIHF1ZXVlIHBlbmRpbmcgZGVzY3JpcHRvciB0byBCQU0KKyAqCisgKiBJdGVyYXRlIG92ZXIgdGhlIHRyYW5zZmVycyBvZiB0aGUgcGVuZGluZyBkZXNjcmlwdG9yIGFuZCBwdXNoIHRoZW0gdG8gYmFtCisgKi8KK3N0YXRpYyB2b2lkIHFiYW1faXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHFiYW1fY2hhbm5lbCAqcWJhbV9jaGFuID0gRE1BX1RPX1FCQU1fQ0hBTihjaGFuKTsKKwlzdHJ1Y3QgcWJhbV9kZXZpY2UgICpxYmFtX2RldiAgPSBxYmFtX2NoYW4tPnFiYW1fZGV2OworCXN0cnVjdCBxYmFtX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnFiYW1fZGVzYyA9ICZxYmFtX2NoYW4tPnBlbmRpbmdfZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJCSpzZzsKKworCW11dGV4X2xvY2soJnFiYW1fY2hhbi0+bG9jayk7CisJaWYgKCFxYmFtX2NoYW4tPnBlbmRpbmdfZGVzYy5zZ2wpIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsCisJCSAgICJlcnJvciBxYmFtX2lzc3VlX3BlbmRpbmcoKSBubyBwZW5kaW5nIGRlc2NyaXB0b3IgcGlwZTolZFxuIiwKKwkJICAgcWJhbV9jaGFuLT5iYW1fcGlwZS5pbmRleCk7CisJCW11dGV4X3VubG9jaygmcWJhbV9jaGFuLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWZvcl9lYWNoX3NnKHFiYW1fZGVzYy0+c2dsLCBzZywgcWJhbV9kZXNjLT5zZ19sZW4sIGkpIHsKKworCQkvKiBBZGQgQkFNIGZsYWdzIG9ubHkgb24gdGhlIGxhc3QgYnVmZmVyICovCisJCWJvb2wgaXNfbGFzdF9idWYgPSAoaSA9PSAoKHFiYW1fZGVzYy0+c2dfbGVuKSAtIDEpKTsKKworCQlyZXQgPSBzcHNfdHJhbnNmZXJfb25lKHFiYW1fY2hhbi0+YmFtX3BpcGUuaGFuZGxlLAorCQkJCQlzZ19kbWFfYWRkcmVzcyhzZyksIHNnX2RtYV9sZW4oc2cpLAorCQkJCQlxYmFtX2Rlc2MsCisJCQkJCShpc19sYXN0X2J1ZiA/IHFiYW1fZGVzYy0+ZmxhZ3MgOiAwKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlxYmFtX2NoYW4tPmVycm9yID0gcmV0OworCisJCQlxYmFtX2VycihxYmFtX2RldiwgImVyb3JyOiVkIHNwc190cmFuc2Zlcl9vbmVcbiIKKwkJCQkiKGFkZHI6MHglbHggbGVuOiVkIGZsYWdzOjB4JWx4IHBpcGU6JWQpXG4iLAorCQkJCXJldCwgKHVsb25nKSBzZ19kbWFfYWRkcmVzcyhzZyksIHNnX2RtYV9sZW4oc2cpLAorCQkJCXFiYW1fZGVzYy0+ZmxhZ3MsIHFiYW1fY2hhbi0+YmFtX3BpcGUuaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkbWFfY29va2llX2NvbXBsZXRlKCZxYmFtX2Rlc2MtPmRtYV9kZXNjKTsKKwlxYmFtX2NoYW4tPmVycm9yID0gMDsKKwlxYmFtX2Rlc2MtPnNnbCA9IE5VTEw7CisJcWJhbV9kZXNjLT5zZ19sZW4gPSAwOworCW11dGV4X3VubG9jaygmcWJhbV9jaGFuLT5sb2NrKTsKK307CisKK3N0YXRpYyBpbnQgcWJhbV9kZXJlZ2lzdGVyX2JhbV9kZXYoc3RydWN0IHFiYW1fZGV2aWNlICpxYmFtX2RldikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFxYmFtX2Rldi0+aGFuZGxlKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNwc19kZXJlZ2lzdGVyX2JhbV9kZXZpY2UocWJhbV9kZXYtPmhhbmRsZSk7CisJaWYgKHJldCkKKwkJcWJhbV9lcnIocWJhbV9kZXYsCisJCQkiZXJyb3I6JWQgc3BzX2RlcmVnaXN0ZXJfYmFtX2RldmljZShobmRsOjB4JWx4KSBmYWlsZWQiLAorCQkJcmV0LCBxYmFtX2Rldi0+aGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBxYmFtX3BpcGVzX2ZyZWUoc3RydWN0IHFiYW1fZGV2aWNlICpxYmFtX2RldikKK3sKKwlzdHJ1Y3QgcWJhbV9jaGFubmVsICpxYmFtX2NoYW5fY3VyLCAqcWJhbV9jaGFuX25leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocWJhbV9jaGFuX2N1ciwgcWJhbV9jaGFuX25leHQsCisJCQkmcWJhbV9kZXYtPmRtYV9kZXYuY2hhbm5lbHMsIGNoYW4uZGV2aWNlX25vZGUpIHsKKwkJbXV0ZXhfbG9jaygmcWJhbV9jaGFuX2N1ci0+bG9jayk7CisJCXFiYW1fZnJlZV9jaGFuKCZxYmFtX2NoYW5fY3VyLT5jaGFuKTsKKwkJc3BzX2ZyZWVfZW5kcG9pbnQocWJhbV9jaGFuX2N1ci0+YmFtX3BpcGUuaGFuZGxlKTsKKwkJbGlzdF9kZWwoJnFiYW1fY2hhbl9jdXItPmNoYW4uZGV2aWNlX25vZGUpOworCQltdXRleF91bmxvY2soJnFiYW1fY2hhbl9jdXItPmxvY2spOworCQlrZnJlZShxYmFtX2NoYW5fY3VyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWJhbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBxYmFtX2RldmljZSAqcWJhbV9kZXY7CisJaW50IHJldDsKKwlib29sIG1hbmFnZWRfbG9jYWxseTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCXFiYW1fZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcWJhbV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFiYW1fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXFiYW1fZGV2LT5kbWFfZGV2LmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcWJhbV9kZXYpOworCisJcWJhbV9kZXYtPm1lbV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFxYmFtX2Rldi0+bWVtX3Jlc291cmNlKSB7CisJCXFiYW1fZXJyKHFiYW1fZGV2LCAibWlzc2luZyAncmVnJyBEVCBlbnRyeSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlxYmFtX2Rldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocWJhbV9kZXYtPmlycSA8IDApIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsICJtaXNzaW5nIERUIElSUSByZXNvdXJjZSBlbnRyeSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCBRQkFNX09GX1NVTV9USFJFU0hPTEQsCisJCQkJICAgJnFiYW1fZGV2LT5zdW1taW5nX3RocmVzaG9sZCk7CisJaWYgKHJldCkgeworCQlxYmFtX2VycihxYmFtX2RldiwgIm1pc3NpbmcgJyVzJyBEVCBlbnRyeSIsCisJCQkgUUJBTV9PRl9TVU1fVEhSRVNIT0xEKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiByZWFkIGZyb20gRFQgYW5kIHNldCBzcHNfYmFtX3Byb3BzLm1hbmFnZSAqLworCW1hbmFnZWRfbG9jYWxseSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChvZl9ub2RlLCBRQkFNX09GX01BTkFHRV9MT0NBTCk7CisJcWJhbV9kZXYtPm1hbmFnZSA9IG1hbmFnZWRfbG9jYWxseSA/IFNQU19CQU1fTUdSX0xPQ0FMIDoKKwkJCQkJICAgICBTUFNfQkFNX01HUl9ERVZJQ0VfUkVNT1RFOworCisJLyogSW5pdCBjaGFubmVscyAqLworCUlOSVRfTElTVF9IRUFEKCZxYmFtX2Rldi0+ZG1hX2Rldi5jaGFubmVscyk7CisKKwkvKiBTZXQgY2FwYWJpbGl0aWVzICovCisJZG1hX2NhcF96ZXJvKHFiYW1fZGV2LT5kbWFfZGV2LmNhcF9tYXNrKTsKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsCQlxYmFtX2Rldi0+ZG1hX2Rldi5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1BSSVZBVEUsCXFiYW1fZGV2LT5kbWFfZGV2LmNhcF9tYXNrKTsKKworCS8qIEluaXRpYWxpemUgZG1hZW5naW5lIGNhbGxiYWNrIGFwaXMgKi8KKwlxYmFtX2Rldi0+ZG1hX2Rldi5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMJPSBxYmFtX2FsbG9jX2NoYW47CisJcWJhbV9kZXYtPmRtYV9kZXYuZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMJPSBxYmFtX2ZyZWVfY2hhbjsKKwlxYmFtX2Rldi0+ZG1hX2Rldi5kZXZpY2VfcHJlcF9zbGF2ZV9zZwkJPSBxYmFtX3ByZXBfc2xhdmVfc2c7CisJcWJhbV9kZXYtPmRtYV9kZXYuZGV2aWNlX3Rlcm1pbmF0ZV9hbGwJCT0gcWJhbV9mbHVzaF9jaGFuOworCXFiYW1fZGV2LT5kbWFfZGV2LmRldmljZV9jb25maWcJCQk9IHFiYW1fc2xhdmVfY2ZnOworCXFiYW1fZGV2LT5kbWFfZGV2LmRldmljZV9pc3N1ZV9wZW5kaW5nCQk9IHFiYW1faXNzdWVfcGVuZGluZzsKKwlxYmFtX2Rldi0+ZG1hX2Rldi5kZXZpY2VfdHhfc3RhdHVzCQk9IHFiYW1fdHhfc3RhdHVzOworCisJLyogUmVnaXNlciB0byBETUEgZnJhbWV3b3JrICovCisJZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmcWJhbV9kZXYtPmRtYV9kZXYpOworCisJLyoKKwkgKiBEbyBub3QgcmV0dXJuIGVycm9yIGluIG9yZGVyIHRvIG5vdCBicmVhayB0aGUgZXhpc3RpbmcKKwkgKiB3YXkgb2YgcmVxdWVzdGluZyBjaGFubmVscy4KKwkgKi8KKwlyZXQgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3RlcihvZl9ub2RlLCBxYmFtX2RtYV94bGF0ZSwgcWJhbV9kZXYpOworCWlmIChyZXQpIHsKKwkJcWJhbV9lcnIocWJhbV9kZXYsICJlcnJvcjolZCBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3RlcigpXG4iLAorCQkJIHJldCk7CisJCWdvdG8gZXJyX3VucmVnaXN0ZXJfZG1hOworCX0KKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXJfZG1hOgorCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmcWJhbV9kZXYtPmRtYV9kZXYpOworCWlmIChxYmFtX2Rldi0+ZGVyZWdpc3Rlcl9yZXF1aXJlZCkKKwkJcmV0dXJuIHFiYW1fZGVyZWdpc3Rlcl9iYW1fZGV2KHFiYW1fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWJhbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcWJhbV9kZXZpY2UgKnFiYW1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJnFiYW1fZGV2LT5kbWFfZGV2KTsKKworCS8qIGZyZWUgQkFNIHBpcGVzIHJlc291cmNlcyAqLworCXFiYW1fcGlwZXNfZnJlZShxYmFtX2Rldik7CisKKwlpZiAocWJhbV9kZXYtPmRlcmVnaXN0ZXJfcmVxdWlyZWQpCisJCXJldHVybiBxYmFtX2RlcmVnaXN0ZXJfYmFtX2RldihxYmFtX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcWJhbV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcHMtZG1hIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcWJhbV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHFiYW1fZHJpdmVyID0geworCS5wcm9iZSA9IHFiYW1fcHJvYmUsCisJLnJlbW92ZSA9IHFiYW1fcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInFjb20tc3BzLWRtYSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBxYmFtX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHFiYW1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJETUEtQVBJIGRyaXZlciB0byBxY29tIEJBTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpxY29tLXNwcy1kbWEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3Fjb20vZ3BpLmMgYi9kcml2ZXJzL2RtYS9xY29tL2dwaS5jCmluZGV4IDNjYzAzNWMuLjk0YThlNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3Fjb20vZ3BpLmMKKysrIGIvZHJpdmVycy9kbWEvcWNvbS9ncGkuYwpAQCAtMTMxLDkgKzEzMSwxMSBAQAogI2RlZmluZSBHUElfTEFCRUxfU0laRSAoMjU2KQogI2RlZmluZSBHUElfREJHX0NPTU1PTiAoOTkpCiAjZGVmaW5lIE1BWF9DSEFOTkVMU19QRVJfR1BJSSAoMikKKyNkZWZpbmUgR1BJX1RYX0NIQU4gKDApCisjZGVmaW5lIEdQSV9SWF9DSEFOICgxKQogI2RlZmluZSBDTURfVElNRU9VVF9NUyAoNTApCiAjZGVmaW5lIFNUQVRFX0lHTk9SRSAoVTMyX01BWCkKLSNkZWZpbmUgUkVRX09GX0RNQV9BUkdTICg2KSAvKiAjIG9mIGFyZ3VtZW50cyByZXF1aXJlZCBmcm9tIGNsaWVudCAqLworI2RlZmluZSBSRVFfT0ZfRE1BX0FSR1MgKDUpIC8qICMgb2YgYXJndW1lbnRzIHJlcXVpcmVkIGZyb20gY2xpZW50ICovCiAKIHN0cnVjdCBfX3BhY2tlZCBncGlfZXJyb3JfbG9nX2VudHJ5IHsKIAl1MzIgcm91dGluZSA6IDQ7CkBAIC00MzcsNiArNDM5LDkgQEAKIAl1MzIgbWF4X2dwaWk7IC8qIG1heGltdW0gIyBvZiBncGlpIGluc3RhbmNlcyBhdmFpbGFibGUgcGVyIGdwaSBibG9jayAqLwogCXUzMiBncGlpX21hc2s7IC8qIGdwaWkgaW5zdGFuY2VzIGF2YWlsYWJsZSBmb3IgYXBwcyAqLwogCXUzMiBldl9mYWN0b3I7IC8qIGV2IHJpbmcgbGVuZ3RoIGZhY3RvciAqLworCXUzMiBzbW11X2NmZzsKKwlkbWFfYWRkcl90IGlvdmFfYmFzZTsKKwlzaXplX3QgaW92YV9zaXplOwogCXN0cnVjdCBncGlpICpncGlpczsKIAl2b2lkICppbGN0eHQ7CiAJdTMyIGlwY19sb2dfbHZsOwpAQCAtNTA5LDYgKzUxNCwxMSBAQAogCXN0cnVjdCBncGlpX2NoYW4gKmdwaWlfY2hhbjsKIH07CiAKKyNkZWZpbmUgR1BJX1NNTVVfQVRUQUNIIEJJVCgwKQorI2RlZmluZSBHUElfU01NVV9TMV9CWVBBU1MgQklUKDEpCisjZGVmaW5lIEdQSV9TTU1VX0ZBU1QgQklUKDIpCisjZGVmaW5lIEdQSV9TTU1VX0FUT01JQyBCSVQoMykKKwogY29uc3QgdTMyIEdQSUlfQ0hBTl9ESVJbTUFYX0NIQU5ORUxTX1BFUl9HUElJXSA9IHsKIAlHUElfQ0hUWVBFX0RJUl9PVVQsIEdQSV9DSFRZUEVfRElSX0lOCiB9OwpAQCAtMjQ2NCwxMiArMjQ3NCw1MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZ3BpX2ZpbmRfYXZhaWxfZ3BpaShzdHJ1Y3QgZ3BpX2RldiAqZ3BpX2RldiwgdTMyIHNlaWQpCit7CisJaW50IGdwaWk7CisJc3RydWN0IGdwaWlfY2hhbiAqdHhfY2hhbiwgKnJ4X2NoYW47CisKKwkvKiBjaGVjayBpZiBzYW1lIHNlaWQgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvciBhbm90aGVyIGNoaWQgKi8KKwlmb3IgKGdwaWkgPSAwOyBncGlpIDwgZ3BpX2Rldi0+bWF4X2dwaWk7IGdwaWkrKykgeworCQlpZiAoISgoMSA8PCBncGlpKSAmIGdwaV9kZXYtPmdwaWlfbWFzaykpCisJCQljb250aW51ZTsKKworCQl0eF9jaGFuID0gJmdwaV9kZXYtPmdwaWlzW2dwaWldLmdwaWlfY2hhbltHUElfVFhfQ0hBTl07CisJCXJ4X2NoYW4gPSAmZ3BpX2Rldi0+Z3BpaXNbZ3BpaV0uZ3BpaV9jaGFuW0dQSV9SWF9DSEFOXTsKKworCQlpZiAocnhfY2hhbi0+dmMuY2hhbi5jbGllbnRfY291bnQgJiYgcnhfY2hhbi0+c2VpZCA9PSBzZWlkKQorCQkJcmV0dXJuIGdwaWk7CisJCWlmICh0eF9jaGFuLT52Yy5jaGFuLmNsaWVudF9jb3VudCAmJiB0eF9jaGFuLT5zZWlkID09IHNlaWQpCisJCQlyZXR1cm4gZ3BpaTsKKwl9CisKKwkvKiBubyBjaGFubmVscyBjb25maWd1cmVkIHdpdGggc2FtZSBzZWlkLCByZXR1cm4gbmV4dCBhdmFpbCBncGlpICovCisJZm9yIChncGlpID0gMDsgZ3BpaSA8IGdwaV9kZXYtPm1heF9ncGlpOyBncGlpKyspIHsKKwkJaWYgKCEoKDEgPDwgZ3BpaSkgJiBncGlfZGV2LT5ncGlpX21hc2spKQorCQkJY29udGludWU7CisKKwkJdHhfY2hhbiA9ICZncGlfZGV2LT5ncGlpc1tncGlpXS5ncGlpX2NoYW5bR1BJX1RYX0NIQU5dOworCQlyeF9jaGFuID0gJmdwaV9kZXYtPmdwaWlzW2dwaWldLmdwaWlfY2hhbltHUElfUlhfQ0hBTl07CisKKwkJLyogY2hlY2sgaWYgZ3BpaSBpcyBjb25maWd1cmVkICovCisJCWlmICh0eF9jaGFuLT52Yy5jaGFuLmNsaWVudF9jb3VudCB8fAorCQkgICAgcnhfY2hhbi0+dmMuY2hhbi5jbGllbnRfY291bnQpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBhIGZyZWUgZ3BpaSAqLworCQlyZXR1cm4gZ3BpaTsKKwl9CisKKwkvKiBubyBncGlpIGluc3RhbmNlIGF2YWlsYWJsZSB0byB1c2UgKi8KKwlyZXR1cm4gLUVJTzsKK30KKwogLyogZ3BpX29mX2RtYV94bGF0ZTogb3BlbiBjbGllbnQgcmVxdWVzdGVkIGNoYW5uZWwgKi8KIHN0YXRpYyBzdHJ1Y3QgZG1hX2NoYW4gKmdwaV9vZl9kbWFfeGxhdGUoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKIAkJCQkJIHN0cnVjdCBvZl9kbWEgKm9mX2RtYSkKIHsKIAlzdHJ1Y3QgZ3BpX2RldiAqZ3BpX2RldiA9IChzdHJ1Y3QgZ3BpX2RldiAqKW9mX2RtYS0+b2ZfZG1hX2RhdGE7Ci0JdTMyIGdwaWksIGNoaWQ7CisJdTMyIHNlaWQsIGNoaWQ7CisJaW50IGdwaWk7CiAJc3RydWN0IGdwaWlfY2hhbiAqZ3BpaV9jaGFuOwogCiAJaWYgKGFyZ3MtPmFyZ3NfY291bnQgPCBSRVFfT0ZfRE1BX0FSR1MpIHsKQEAgLTI0NzksMjUgKzI1MzAsMzMgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JLyogQ2hlY2sgaWYgdmFsaWQgZ3BpaSBpbnN0YW5jZSAqLwotCWdwaWkgPSBhcmdzLT5hcmdzWzBdOwotCWlmICghKCgxIDw8IGdwaWkpICYgZ3BpX2Rldi0+Z3BpaV9tYXNrKSkgewotCQlHUElfRVJSKGdwaV9kZXYsICJncGlpIGluc3RhbmNlOiVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGdwaWkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQljaGlkID0gYXJncy0+YXJnc1sxXTsKKwljaGlkID0gYXJncy0+YXJnc1swXTsKIAlpZiAoY2hpZCA+PSBNQVhfQ0hBTk5FTFNfUEVSX0dQSUkpIHsKIAkJR1BJX0VSUihncGlfZGV2LCAiZ3BpaSBjaGFubmVsOiVkIG5vdCB2YWxpZFxuIiwgY2hpZCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIGdldCByaW5nIHNpemUsIHByb3RvY29sLCBzZV9pZCwgYW5kIHByaW9yaXR5ICovCisJc2VpZCA9IGFyZ3MtPmFyZ3NbMV07CisKKwkvKiBmaW5kIG5leHQgYXZhaWxhYmxlIGdwaWkgdG8gdXNlICovCisJZ3BpaSA9IGdwaV9maW5kX2F2YWlsX2dwaWkoZ3BpX2Rldiwgc2VpZCk7CisJaWYgKGdwaWkgPCAwKSB7CisJCUdQSV9FUlIoZ3BpX2RldiwgIm5vIGF2YWlsYWJsZSBncGlpIGluc3RhbmNlc1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwogCWdwaWlfY2hhbiA9ICZncGlfZGV2LT5ncGlpc1tncGlpXS5ncGlpX2NoYW5bY2hpZF07Ci0JZ3BpaV9jaGFuLT5zZWlkID0gYXJncy0+YXJnc1syXTsKLQlncGlpX2NoYW4tPnByb3RvY29sID0gYXJncy0+YXJnc1szXTsKLQlncGlpX2NoYW4tPnJlcV90cmVzID0gYXJncy0+YXJnc1s0XTsKLQlncGlpX2NoYW4tPnByaW9yaXR5ID0gYXJncy0+YXJnc1s1XTsKKwlpZiAoZ3BpaV9jaGFuLT52Yy5jaGFuLmNsaWVudF9jb3VudCkgeworCQlHUElfRVJSKGdwaV9kZXYsICJncGlpOiVkIGNoaWQ6JWQgc2VpZDolZCBhbHJlYWR5IGNvbmZpZ3VyZWRcbiIsCisJCQlncGlpLCBjaGlkLCBncGlpX2NoYW4tPnNlaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBnZXQgcmluZyBzaXplLCBwcm90b2NvbCwgc2VfaWQsIGFuZCBwcmlvcml0eSAqLworCWdwaWlfY2hhbi0+c2VpZCA9IHNlaWQ7CisJZ3BpaV9jaGFuLT5wcm90b2NvbCA9IGFyZ3MtPmFyZ3NbMl07CisJZ3BpaV9jaGFuLT5yZXFfdHJlcyA9IGFyZ3MtPmFyZ3NbM107CisJZ3BpaV9jaGFuLT5wcmlvcml0eSA9IGFyZ3MtPmFyZ3NbNF07CiAKIAlHUElfTE9HKGdwaV9kZXYsCiAJCSJjbGllbnQgcmVxLiBncGlpOiV1IGNoaWQ6JXUgI190cmU6JXUgcHJpb3JpdHk6JXUgcHJvdG9jb2w6JXVcbiIsCkBAIC0yNTYyLDUyICsyNjIxLDEyMyBAQAogCX0KIH0KIAorc3RhdGljIHN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqZ3BpX2NyZWF0ZV9tYXBwaW5nKHN0cnVjdCBncGlfZGV2ICpncGlfZGV2KQoreworCWRtYV9hZGRyX3QgYmFzZTsKKwlzaXplX3Qgc2l6ZTsKKworCS8qCisJICogSWYgUzFfQllQQVNTIGVuYWJsZWQgdGhlbiBpb21tdSBzcGFjZSBpcyBub3QgdXNlZCwgaG93ZXZlciBmcmFtZXdvcmsKKwkgKiBzdGlsbCByZXF1aXJlIGNsaWVudHMgdG8gY3JlYXRlIGEgbWFwcGluZyBzcGFjZSBiZWZvcmUgYXR0YWNoaW5nLiBTbworCSAqIHNldCB0byBzbWFsbGVzdCBzaXplIHJlcXVpcmVkIGJ5IGlvbW11IGZyYW1ld29yay4KKwkgKi8KKwlpZiAoZ3BpX2Rldi0+c21tdV9jZmcgJiBHUElfU01NVV9TMV9CWVBBU1MpIHsKKwkJYmFzZSA9IDA7CisJCXNpemUgPSBQQUdFX1NJWkU7CisJfSBlbHNlIHsKKwkJYmFzZSA9IGdwaV9kZXYtPmlvdmFfYmFzZTsKKwkJc2l6ZSA9IGdwaV9kZXYtPmlvdmFfc2l6ZTsKKwl9CisKKwlHUElfTE9HKGdwaV9kZXYsICJDcmVhdGluZyBpb21tdSBtYXBwaW5nIG9mIGJhc2U6MHglbGx4IHNpemU6JWx1XG4iLAorCQliYXNlLCBzaXplKTsKKworCXJldHVybiBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoJnBsYXRmb3JtX2J1c190eXBlLCBiYXNlLCBzaXplKTsKK30KKworc3RhdGljIGludCBncGlfZG1hX21hc2soc3RydWN0IGdwaV9kZXYgKmdwaV9kZXYpCit7CisJaW50IG1hc2sgPSA2NDsKKworCWlmIChncGlfZGV2LT5zbW11X2NmZyAmJiAhKGdwaV9kZXYtPnNtbXVfY2ZnICYgR1BJX1NNTVVfUzFfQllQQVNTKSkgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJYWRkciA9IGdwaV9kZXYtPmlvdmFfYmFzZSArIGdwaV9kZXYtPmlvdmFfc2l6ZSArIDE7CisJCW1hc2sgPSBmaW5kX2xhc3RfYml0KCZhZGRyLCA2NCk7CisJfQorCisJR1BJX0xPRyhncGlfZGV2LCAiU2V0dGluZyBkbWEgbWFzayB0byAlZFxuIiwgbWFzayk7CisKKwlyZXR1cm4gZG1hX3NldF9tYXNrKGdwaV9kZXYtPmRldiwgRE1BX0JJVF9NQVNLKG1hc2spKTsKK30KKwogc3RhdGljIGludCBncGlfc21tdV9pbml0KHN0cnVjdCBncGlfZGV2ICpncGlfZGV2KQogewotCXU2NCBzaXplID0gUEFHRV9TSVpFOwotCWRtYV9hZGRyX3QgYmFzZSA9IDB4MDsKLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcDsKLQlpbnQgYXR0ciwgcmV0OworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IE5VTEw7CisJaW50IHJldDsKIAotCW1hcCA9IGFybV9pb21tdV9jcmVhdGVfbWFwcGluZygmcGxhdGZvcm1fYnVzX3R5cGUsIGJhc2UsIHNpemUpOwotCWlmIChJU19FUlJfT1JfTlVMTChtYXApKSB7Ci0JCXJldCA9IFBUUl9FUlIobWFwKSA/IDogLUVJTzsKLQkJR1BJX0VSUihncGlfZGV2LCAiZXJyb3IgY3JlYXRlX21hcHBpbmcsIHJldDolZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwlpZiAoZ3BpX2Rldi0+c21tdV9jZmcpIHsKKworCQkvKiBjcmVhdGUgbWFwcGluZyB0YWJsZSAqLworCQltYXBwaW5nID0gZ3BpX2NyZWF0ZV9tYXBwaW5nKGdwaV9kZXYpOworCQlpZiAoSVNfRVJSKG1hcHBpbmcpKSB7CisJCQlHUElfRVJSKGdwaV9kZXYsCisJCQkJIkZhaWxlZCB0byBjcmVhdGUgaW9tbXUgbWFwcGluZywgcmV0OiVsZFxuIiwKKwkJCQlQVFJfRVJSKG1hcHBpbmcpKTsKKwkJCXJldHVybiBQVFJfRVJSKG1hcHBpbmcpOworCQl9CisKKwkJaWYgKGdwaV9kZXYtPnNtbXVfY2ZnICYgR1BJX1NNTVVfUzFfQllQQVNTKSB7CisJCQlpbnQgczFfYnlwYXNzID0gMTsKKworCQkJcmV0ID0gaW9tbXVfZG9tYWluX3NldF9hdHRyKG1hcHBpbmctPmRvbWFpbiwKKwkJCQkJRE9NQUlOX0FUVFJfUzFfQllQQVNTLCAmczFfYnlwYXNzKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlHUElfRVJSKGdwaV9kZXYsCisJCQkJCSJGYWlsZWQgdG8gc2V0IGF0dHIgUzFfQllQQVNTLCByZXQ6JWRcbiIsCisJCQkJCXJldCk7CisJCQkJZ290byByZWxlYXNlX21hcHBpbmc7CisJCQl9CisJCX0KKworCQlpZiAoZ3BpX2Rldi0+c21tdV9jZmcgJiBHUElfU01NVV9GQVNUKSB7CisJCQlpbnQgZmFzdCA9IDE7CisKKwkJCXJldCA9IGlvbW11X2RvbWFpbl9zZXRfYXR0cihtYXBwaW5nLT5kb21haW4sCisJCQkJCQkgICAgRE9NQUlOX0FUVFJfRkFTVCwgJmZhc3QpOworCQkJaWYgKHJldCkgeworCQkJCUdQSV9FUlIoZ3BpX2RldiwKKwkJCQkJIkZhaWxlZCB0byBzZXQgYXR0ciBGQVNULCByZXQ6JWRcbiIsCisJCQkJCXJldCk7CisJCQkJZ290byByZWxlYXNlX21hcHBpbmc7CisJCQl9CisJCX0KKworCQlpZiAoZ3BpX2Rldi0+c21tdV9jZmcgJiBHUElfU01NVV9BVE9NSUMpIHsKKwkJCWludCBhdG9taWMgPSAxOworCisJCQlyZXQgPSBpb21tdV9kb21haW5fc2V0X2F0dHIobWFwcGluZy0+ZG9tYWluLAorCQkJCQkJRE9NQUlOX0FUVFJfQVRPTUlDLCAmYXRvbWljKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlHUElfRVJSKGdwaV9kZXYsCisJCQkJCSJGYWlsZWQgdG8gc2V0IGF0dHIgQVRPTUlDLCByZXQ6JWRcbiIsCisJCQkJCXJldCk7CisJCQkJZ290byByZWxlYXNlX21hcHBpbmc7CisJCQl9CisJCX0KKworCQlyZXQgPSBhcm1faW9tbXVfYXR0YWNoX2RldmljZShncGlfZGV2LT5kZXYsIG1hcHBpbmcpOworCQlpZiAocmV0KSB7CisJCQlHUElfRVJSKGdwaV9kZXYsCisJCQkJIkZhaWxlZCB3aXRoIGlvbW11X2F0dGFjaCwgcmV0OiVkXG4iLCByZXQpOworCQkJZ290byByZWxlYXNlX21hcHBpbmc7CisJCX0KIAl9CiAKLQlhdHRyID0gMTsKLQlyZXQgPSBpb21tdV9kb21haW5fc2V0X2F0dHIobWFwLT5kb21haW4sIERPTUFJTl9BVFRSX0FUT01JQywgJmF0dHIpOworCXJldCA9IGdwaV9kbWFfbWFzayhncGlfZGV2KTsKIAlpZiAocmV0KSB7Ci0JCUdQSV9FUlIoZ3BpX2RldiwgImVycm9yIHNldHRpbmcgQVRUVFJfQVRPTUlDLCByZXQ6JWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3Jfc21tdTsKLQl9Ci0KLQlhdHRyID0gMTsKLQlyZXQgPSBpb21tdV9kb21haW5fc2V0X2F0dHIobWFwLT5kb21haW4sIERPTUFJTl9BVFRSX1MxX0JZUEFTUywgJmF0dHIpOwotCWlmIChyZXQpIHsKLQkJR1BJX0VSUihncGlfZGV2LCAiZXJyb3Igc2V0dGluZyBTMV9CWVBBU1MsIHJldDolZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcl9zbW11OwotCX0KLQotCXJldCA9IGFybV9pb21tdV9hdHRhY2hfZGV2aWNlKGdwaV9kZXYtPmRldiwgbWFwKTsKLQlpZiAocmV0KSB7Ci0JCUdQSV9FUlIoZ3BpX2RldiwgImVycm9yIGlvbW11X2F0dGFjaCwgcmV0OiVkXG4iLCByZXQpOwotCQlnb3RvIGVycm9yX3NtbXU7Ci0JfQotCi0JcmV0ID0gZG1hX3NldF9tYXNrKGdwaV9kZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7Ci0JaWYgKHJldCkgewotCQlHUElfRVJSKGdwaV9kZXYsICJlcnJvciBzZXR0aW5nIGRtYV9tYXNrLCByZXQ6JWRcbiIsIHJldCk7CisJCUdQSV9FUlIoZ3BpX2RldiwgIkVycm9yIHNldHRpbmcgZG1hX21hc2ssIHJldDolZFxuIiwgcmV0KTsKIAkJZ290byBlcnJvcl9zZXRfbWFzazsKIAl9CiAKIAlyZXR1cm4gcmV0OwogCiBlcnJvcl9zZXRfbWFzazoKLQlhcm1faW9tbXVfZGV0YWNoX2RldmljZShncGlfZGV2LT5kZXYpOwotZXJyb3Jfc21tdToKLQlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcCk7CisJaWYgKGdwaV9kZXYtPnNtbXVfY2ZnKQorCQlhcm1faW9tbXVfZGV0YWNoX2RldmljZShncGlfZGV2LT5kZXYpOworcmVsZWFzZV9tYXBwaW5nOgorCWlmIChtYXBwaW5nKQorCQlhcm1faW9tbXVfcmVsZWFzZV9tYXBwaW5nKG1hcHBpbmcpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI2NTYsNiArMjc4NiwzNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGdwaV9kZXYtPmRldi0+b2Zfbm9kZSwgInFjb20sc21tdS1jZmciLAorCQkJCSAgICZncGlfZGV2LT5zbW11X2NmZyk7CisJaWYgKHJldCkgeworCQlHUElfRVJSKGdwaV9kZXYsICJtaXNzaW5nICdxY29tLHNtbXUtY2ZnJyBEVCBub2RlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKGdwaV9kZXYtPnNtbXVfY2ZnICYmICEoZ3BpX2Rldi0+c21tdV9jZmcgJiBHUElfU01NVV9TMV9CWVBBU1MpKSB7CisJCXU2NCBpb3ZhX3JhbmdlWzJdOworCisJCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoZ3BpX2Rldi0+ZGV2LT5vZl9ub2RlLAorCQkJCQkJICAgICAgInFjb20saW92YS1yYW5nZSIsCisJCQkJCQkgICAgICBzaXplb2YoaW92YV9yYW5nZSkpOworCQlpZiAocmV0ICE9IDEpIHsKKwkJCUdQSV9FUlIoZ3BpX2RldiwKKwkJCQkibWlzc2luZyBvciBpbmNvcnJlY3QgJ3Fjb20saW92YS1yYW5nZScgRFQgbm9kZSByZXQ6JWRcbiIsCisJCQkJcmV0KTsKKwkJfQorCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5KGdwaV9kZXYtPmRldi0+b2Zfbm9kZSwKKwkJCQkJInFjb20saW92YS1yYW5nZSIsIGlvdmFfcmFuZ2UsCisJCQkJCXNpemVvZihpb3ZhX3JhbmdlKSAvIHNpemVvZih1NjQpKTsKKwkJaWYgKHJldCkgeworCQkJR1BJX0VSUihncGlfZGV2LAorCQkJCSJjb3VsZCBub3QgcmVhZCBEVCBwcm9wICdxY29tLGlvdmEtcmFuZ2VcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlncGlfZGV2LT5pb3ZhX2Jhc2UgPSBpb3ZhX3JhbmdlWzBdOworCQlncGlfZGV2LT5pb3ZhX3NpemUgPSBpb3ZhX3JhbmdlWzFdOworCX0KKwogCXJldCA9IGdwaV9zbW11X2luaXQoZ3BpX2Rldik7CiAJaWYgKHJldCkgewogCQlHUElfRVJSKGdwaV9kZXYsICJlcnJvciBjb25maWd1cmluZyBzbW11LCByZXQ6JWRcbiIsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aS1kbWEtY3Jvc3NiYXIuYyBiL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCmluZGV4IDNmMjRhZWIuLjI0MDM0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCisrKyBiL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAltYXRjaCA9IG9mX21hdGNoX25vZGUodGlfYW0zMzV4X21hc3Rlcl9tYXRjaCwgZG1hX25vZGUpOwogCWlmICghbWF0Y2gpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRE1BIG1hc3RlciBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJb2Zfbm9kZV9wdXQoZG1hX25vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMzOSw2ICszNDAsNyBAQAogCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZSh0aV9kcmE3X21hc3Rlcl9tYXRjaCwgZG1hX25vZGUpOwogCWlmICghbWF0Y2gpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRE1BIG1hc3RlciBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJb2Zfbm9kZV9wdXQoZG1hX25vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9xY29tX2xsY2NfZWRhYy5jIGIvZHJpdmVycy9lZGFjL3Fjb21fbGxjY19lZGFjLmMKaW5kZXggNGI4OWNiZi4uMDM4ZTg5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3Fjb21fbGxjY19lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3Fjb21fbGxjY19lZGFjLmMKQEAgLTM5NywyMSArMzk3LDYgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X21lbTsKIAotCWlmIChpbnRlcnJ1cHRfbW9kZSkgewotCQlkcnYtPmVjY19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZWNjX2lycSIpOwotCQlpZiAoIWRydi0+ZWNjX2lycSkgewotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBvdXRfZGV2OwotCQl9Ci0KLQkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgZHJ2LT5lY2NfaXJxLCBsbGNjX2VjY19pcnFfaGFuZGxlciwKLQkJCQlJUlFGX1RSSUdHRVJfSElHSCwgImxsY2NfZWNjIiwgZWRldl9jdGwpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZWNjIGlycVxuIik7Ci0JCQlnb3RvIG91dF9kZXY7Ci0JCX0KLQl9Ci0KIAlkcnYtPmxsY2NfYmFua3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKIAkJc2l6ZW9mKHUzMikgKiBkcnYtPm51bV9iYW5rcywgR0ZQX0tFUk5FTCk7CiAKQEAgLTQzNyw2ICs0MjIsMjEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGVkZXZfY3RsKTsKIAorCWlmIChpbnRlcnJ1cHRfbW9kZSkgeworCQlkcnYtPmVjY19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZWNjX2lycSIpOworCQlpZiAoIWRydi0+ZWNjX2lycSkgeworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBvdXRfZGV2OworCQl9CisKKwkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgZHJ2LT5lY2NfaXJxLCBsbGNjX2VjY19pcnFfaGFuZGxlciwKKwkJCQlJUlFGX1RSSUdHRVJfSElHSCwgImxsY2NfZWNjIiwgZWRldl9jdGwpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZWNjIGlycVxuIik7CisJCQlnb3RvIG91dF9kZXY7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIAogb3V0X2RldjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCmluZGV4IGYyYmI1MTIuLjA2M2QxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwpAQCAtNzAzLDI0ICs3MDMsMjMgQEAKIHsKIAlzdHJ1Y3QgbGluZWV2ZW50X3N0YXRlICpsZSA9IHA7CiAJc3RydWN0IGdwaW9ldmVudF9kYXRhIGdlOwotCWludCByZXQ7CisJaW50IHJldCwgbGV2ZWw7CiAKIAlnZS50aW1lc3RhbXAgPSBrdGltZV9nZXRfcmVhbF9ucygpOworCWxldmVsID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGxlLT5kZXNjKTsKIAogCWlmIChsZS0+ZWZsYWdzICYgR1BJT0VWRU5UX1JFUVVFU1RfUklTSU5HX0VER0UKIAkgICAgJiYgbGUtPmVmbGFncyAmIEdQSU9FVkVOVF9SRVFVRVNUX0ZBTExJTkdfRURHRSkgewotCQlpbnQgbGV2ZWwgPSBncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAobGUtPmRlc2MpOwotCiAJCWlmIChsZXZlbCkKIAkJCS8qIEVtaXQgbG93LXRvLWhpZ2ggZXZlbnQgKi8KIAkJCWdlLmlkID0gR1BJT0VWRU5UX0VWRU5UX1JJU0lOR19FREdFOwogCQllbHNlCiAJCQkvKiBFbWl0IGhpZ2gtdG8tbG93IGV2ZW50ICovCiAJCQlnZS5pZCA9IEdQSU9FVkVOVF9FVkVOVF9GQUxMSU5HX0VER0U7Ci0JfSBlbHNlIGlmIChsZS0+ZWZsYWdzICYgR1BJT0VWRU5UX1JFUVVFU1RfUklTSU5HX0VER0UpIHsKKwl9IGVsc2UgaWYgKGxlLT5lZmxhZ3MgJiBHUElPRVZFTlRfUkVRVUVTVF9SSVNJTkdfRURHRSAmJiBsZXZlbCkgewogCQkvKiBFbWl0IGxvdy10by1oaWdoIGV2ZW50ICovCiAJCWdlLmlkID0gR1BJT0VWRU5UX0VWRU5UX1JJU0lOR19FREdFOwotCX0gZWxzZSBpZiAobGUtPmVmbGFncyAmIEdQSU9FVkVOVF9SRVFVRVNUX0ZBTExJTkdfRURHRSkgeworCX0gZWxzZSBpZiAobGUtPmVmbGFncyAmIEdQSU9FVkVOVF9SRVFVRVNUX0ZBTExJTkdfRURHRSAmJiAhbGV2ZWwpIHsKIAkJLyogRW1pdCBoaWdoLXRvLWxvdyBldmVudCAqLwogCQlnZS5pZCA9IEdQSU9FVkVOVF9FVkVOVF9GQUxMSU5HX0VER0U7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NpLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zaS5jCmluZGV4IGRjOTUxMWMuLjMyN2JkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvc2kuYwpAQCAtMTMwMSw2ICsxMzAxLDcgQEAKIAkJYW1kZ3B1X3Byb2dyYW1fcmVnaXN0ZXJfc2VxdWVuY2UoYWRldiwKIAkJCQkJCSBwaXRjYWlybl9tZ2NnX2NnY2dfaW5pdCwKIAkJCQkJCSAoY29uc3QgdTMyKUFSUkFZX1NJWkUocGl0Y2Fpcm5fbWdjZ19jZ2NnX2luaXQpKTsKKwkJYnJlYWs7CiAJY2FzZSBDSElQX1ZFUkRFOgogCQlhbWRncHVfcHJvZ3JhbV9yZWdpc3Rlcl9zZXF1ZW5jZShhZGV2LAogCQkJCQkJIHZlcmRlX2dvbGRlbl9yZWdpc3RlcnMsCkBAIC0xMzI1LDYgKzEzMjYsNyBAQAogCQlhbWRncHVfcHJvZ3JhbV9yZWdpc3Rlcl9zZXF1ZW5jZShhZGV2LAogCQkJCQkJIG9sYW5kX21nY2dfY2djZ19pbml0LAogCQkJCQkJIChjb25zdCB1MzIpQVJSQVlfU0laRShvbGFuZF9tZ2NnX2NnY2dfaW5pdCkpOworCQlicmVhazsKIAljYXNlIENISVBfSEFJTkFOOgogCQlhbWRncHVfcHJvZ3JhbV9yZWdpc3Rlcl9zZXF1ZW5jZShhZGV2LAogCQkJCQkJIGhhaW5hbl9nb2xkZW5fcmVnaXN0ZXJzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTEuaCBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYWR2NzUxMS9hZHY3NTExLmgKaW5kZXggMTYxYzkyMy4uM2U3NGUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTEuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fkdjc1MTEvYWR2NzUxMS5oCkBAIC0zMTUsNiArMzE1LDggQEAKIAlib29sIGVkaWRfcmVhZDsKIAogCXdhaXRfcXVldWVfaGVhZF90IHdxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBocGRfd29yazsKKwogCXN0cnVjdCBkcm1fYnJpZGdlIGJyaWRnZTsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYWR2NzUxMS9hZHY3NTExX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMKaW5kZXggOGVkMzkwNi4uMjEzZDg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hZHY3NTExL2Fkdjc1MTFfZHJ2LmMKQEAgLTQwMiw2ICs0MDIsMjcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyB2b2lkIGFkdjc1MTFfaHBkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZHY3NTExICphZHY3NTExID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZHY3NTExLCBocGRfd29yayk7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQoYWR2NzUxMS0+cmVnbWFwLCBBRFY3NTExX1JFR19TVEFUVVMsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwllbHNlIGlmICh2YWwgJiBBRFY3NTExX1NUQVRVU19IUEQpCisJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworCWVsc2UKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7CisKKwlpZiAoYWR2NzUxMS0+Y29ubmVjdG9yLnN0YXR1cyAhPSBzdGF0dXMpIHsKKwkJYWR2NzUxMS0+Y29ubmVjdG9yLnN0YXR1cyA9IHN0YXR1czsKKwkJZHJtX2ttc19oZWxwZXJfaG90cGx1Z19ldmVudChhZHY3NTExLT5jb25uZWN0b3IuZGV2KTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYWR2NzUxMV9pcnFfcHJvY2VzcyhzdHJ1Y3QgYWR2NzUxMSAqYWR2NzUxMSwgYm9vbCBwcm9jZXNzX2hwZCkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxMCwgaXJxMTsKQEAgLTQxOSw3ICs0NDAsNyBAQAogCXJlZ21hcF93cml0ZShhZHY3NTExLT5yZWdtYXAsIEFEVjc1MTFfUkVHX0lOVCgxKSwgaXJxMSk7CiAKIAlpZiAocHJvY2Vzc19ocGQgJiYgaXJxMCAmIEFEVjc1MTFfSU5UMF9IUEQgJiYgYWR2NzUxMS0+YnJpZGdlLmVuY29kZXIpCi0JCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChhZHY3NTExLT5jb25uZWN0b3IuZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmYWR2NzUxMS0+aHBkX3dvcmspOwogCiAJaWYgKGlycTAgJiBBRFY3NTExX0lOVDBfRURJRF9SRUFEWSB8fCBpcnExICYgQURWNzUxMV9JTlQxX0REQ19FUlJPUikgewogCQlhZHY3NTExLT5lZGlkX3JlYWQgPSB0cnVlOwpAQCAtMTAwNiw2ICsxMDI3LDggQEAKIAkJCWdvdG8gZXJyX2kyY191bnJlZ2lzdGVyX2VkaWQ7CiAJfQogCisJSU5JVF9XT1JLKCZhZHY3NTExLT5ocGRfd29yaywgYWR2NzUxMV9ocGRfd29yayk7CisKIAlpZiAoaTJjLT5pcnEpIHsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmYWR2NzUxMS0+d3EpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYwppbmRleCA5OTAxMTYyMS4uNGUxNmRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCkBAIC0xNDU5LDYgKzE0NTksOSBAQAogCWlmIChjb25maWctPmZ1bmNzLT5hdG9taWNfY2hlY2spCiAJCXJldCA9IGNvbmZpZy0+ZnVuY3MtPmF0b21pY19jaGVjayhzdGF0ZS0+ZGV2LCBzdGF0ZSk7CiAKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKCFzdGF0ZS0+YWxsb3dfbW9kZXNldCkgewogCQlmb3JfZWFjaF9jcnRjX2luX3N0YXRlKHN0YXRlLCBjcnRjLCBjcnRjX3N0YXRlLCBpKSB7CiAJCQlpZiAoZHJtX2F0b21pY19jcnRjX25lZWRzX21vZGVzZXQoY3J0Y19zdGF0ZSkpIHsKQEAgLTE0NjksNyArMTQ3Miw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkcm1fYXRvbWljX2NoZWNrX29ubHkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYwppbmRleCBhYzU0MzdlLi42Mzk0MTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKQEAgLTM1OCwyMCArMzU4LDEzIEBACiAgKi8KIGludCBkcm1fZHBfbGlua19wb3dlcl91cChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LCBzdHJ1Y3QgZHJtX2RwX2xpbmsgKmxpbmspCiB7Ci0JdTggdmFsdWU7CisJdTggdmFsdWUgPSBEUF9TRVRfUE9XRVJfRDA7CiAJaW50IGVycjsKIAogCS8qIERQX1NFVF9QT1dFUiByZWdpc3RlciBpcyBvbmx5IGF2YWlsYWJsZSBvbiBEUENEIHYxLjEgYW5kIGxhdGVyICovCiAJaWYgKGxpbmstPnJldmlzaW9uIDwgMHgxMSkKIAkJcmV0dXJuIDA7CiAKLQllcnIgPSBkcm1fZHBfZHBjZF9yZWFkYihhdXgsIERQX1NFVF9QT1dFUiwgJnZhbHVlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXZhbHVlICY9IH5EUF9TRVRfUE9XRVJfTUFTSzsKLQl2YWx1ZSB8PSBEUF9TRVRfUE9XRVJfRDA7Ci0KIAllcnIgPSBkcm1fZHBfZHBjZF93cml0ZWIoYXV4LCBEUF9TRVRfUE9XRVIsIHZhbHVlKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dlbS5jCmluZGV4IDQ2NWJhY2QuLjQ4ZTk5YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9nZW0uYwpAQCAtMjU1LDEzICsyNTUsMTMgQEAKIAlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IHB0cjsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAKKwlpZiAoZGV2LT5kcml2ZXItPmdlbV9jbG9zZV9vYmplY3QpCisJCWRldi0+ZHJpdmVyLT5nZW1fY2xvc2Vfb2JqZWN0KG9iaiwgZmlsZV9wcml2KTsKKwogCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1BSSU1FKSkKIAkJZHJtX2dlbV9yZW1vdmVfcHJpbWVfaGFuZGxlcyhvYmosIGZpbGVfcHJpdik7CiAJZHJtX3ZtYV9ub2RlX3Jldm9rZSgmb2JqLT52bWFfbm9kZSwgZmlsZV9wcml2KTsKIAotCWlmIChkZXYtPmRyaXZlci0+Z2VtX2Nsb3NlX29iamVjdCkKLQkJZGV2LT5kcml2ZXItPmdlbV9jbG9zZV9vYmplY3Qob2JqLCBmaWxlX3ByaXYpOwotCiAJZHJtX2dlbV9vYmplY3RfaGFuZGxlX3VucmVmZXJlbmNlX3VubG9ja2VkKG9iaik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ2VtX3N1Ym1pdC5jIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9nZW1fc3VibWl0LmMKaW5kZXggYWZkZDU1ZC4uMWFjOWE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9nZW1fc3VibWl0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9nZW1fc3VibWl0LmMKQEAgLTI2NCw4ICsyNjQsOCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlpZiAoci0+cmVsb2Nfb2Zmc2V0ID49IGJvLT5vYmotPmJhc2Uuc2l6ZSAtIHNpemVvZigqcHRyKSkgewotCQkJRFJNX0VSUk9SKCJyZWxvY2F0aW9uICV1IG91dHNpZGUgb2JqZWN0IiwgaSk7CisJCWlmIChyLT5yZWxvY19vZmZzZXQgPiBiby0+b2JqLT5iYXNlLnNpemUgLSBzaXplb2YoKnB0cikpIHsKKwkJCURSTV9FUlJPUigicmVsb2NhdGlvbiAldSBvdXRzaWRlIG9iamVjdFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jb2xvci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY29sb3IuYwppbmRleCA5NWE3Mjc3Li44OWE3Nzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jb2xvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NvbG9yLmMKQEAgLTM5NCw2ICszOTQsNyBAQAogCQl9CiAKIAkJLyogUHJvZ3JhbSB0aGUgbWF4IHJlZ2lzdGVyIHRvIGNsYW1wIHZhbHVlcyA+IDEuMC4gKi8KKwkJaSA9IGx1dF9zaXplIC0gMTsKIAkJSTkxNV9XUklURShQUkVDX1BBTF9HQ19NQVgocGlwZSwgMCksCiAJCQkgICBkcm1fY29sb3JfbHV0X2V4dHJhY3QobHV0W2ldLnJlZCwgMTYpKTsKIAkJSTkxNV9XUklURShQUkVDX1BBTF9HQ19NQVgocGlwZSwgMSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQppbmRleCA0MDE1ODMyLi5jODE4MzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUKQEAgLTE2MSw3ICsxNjEsOCBAQAogCXNkZS9zZGVfaHdfY29sb3JfcHJvY2Vzc2luZ192MV83Lm8gXAogCXNkZS9zZGVfcmVnX2RtYS5vIFwKIAlzZGUvc2RlX2h3X3JlZ19kbWFfdjEubyBcCi0Jc2RlL3NkZV9od19kc2MubworCXNkZS9zZGVfaHdfZHNjLm8gXAorCXNkZS9zZGVfaHdfZHMubwogCiBtc21fZHJtLSQoQ09ORklHX0RSTV9TREVfV0IpICs9IHNkZS9zZGVfd2IubyBcCiAJc2RlL3NkZV9lbmNvZGVyX3BoeXNfd2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9hZHJlbm8vYWRyZW5vX2dwdS5jCmluZGV4IDk2MWQ0N2YuLjgyMTQxMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vYWRyZW5vL2FkcmVub19ncHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2FkcmVuby9hZHJlbm9fZ3B1LmMKQEAgLTIxMCw3ICsyMTAsMTQgQEAKIHZvaWQgYWRyZW5vX2ZsdXNoKHN0cnVjdCBtc21fZ3B1ICpncHUpCiB7CiAJc3RydWN0IGFkcmVub19ncHUgKmFkcmVub19ncHUgPSB0b19hZHJlbm9fZ3B1KGdwdSk7Ci0JdWludDMyX3Qgd3B0ciA9IGdldF93cHRyKGdwdS0+cmIpOworCXVpbnQzMl90IHdwdHI7CisKKwkvKgorCSAqIE1hc2sgd3B0ciB2YWx1ZSB0aGF0IHdlIGNhbGN1bGF0ZSB0byBmaXQgaW4gdGhlIEhXIHJhbmdlLiBUaGlzIGlzCisJICogdG8gYWNjb3VudCBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGxhc3QgY29tbWFuZCBmaXQgZXhhY3RseSBpbnRvCisJICogdGhlIHJpbmdidWZmZXIgYW5kIHJiLT5uZXh0IGhhc24ndCB3cmFwcGVkIHRvIHplcm8geWV0CisJICovCisJd3B0ciA9IGdldF93cHRyKGdwdS0+cmIpICYgKChncHUtPnJiLT5zaXplIC8gNCkgLSAxKTsKIAogCS8qIGVuc3VyZSB3cml0ZXMgdG8gcmluZ2J1ZmZlciBoYXZlIGhpdCBzeXN0ZW0gbWVtb3J5OiAqLwogCW1iKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2F1ZGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2F1ZGlvLmMKaW5kZXggYzI2MzExNS4uYzRhNjBkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdWRpby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXVkaW8uYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJY2FzZSBEUF9MSU5LX0JXXzVfNDoKIAkJc2VsZWN0ID0gMjsKIAkJYnJlYWs7Ci0JY2FzZSBEUF9MSU5LX1JBVEVfODEwOgorCWNhc2UgRFBfTElOS19CV184XzE6CiAJCXNlbGVjdCA9IDM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03NzEsOCArNzcxLDEwIEBACiAJZHBfYXVkaW8tPm9mZiA9IGRwX2F1ZGlvX29mZjsKIAogCXJjID0gZHBfYXVkaW9faW5pdF9leHRfZGlzcChhdWRpbyk7Ci0JaWYgKHJjKQorCWlmIChyYykgeworCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGF1ZGlvKTsKIAkJZ290byBlcnJvcjsKKwl9CiAKIAljYXRhbG9nLT5pbml0KGNhdGFsb2cpOwogCkBAIC03OTAsNSArNzkyLDUgQEAKIAogCWF1ZGlvID0gY29udGFpbmVyX29mKGRwX2F1ZGlvLCBzdHJ1Y3QgZHBfYXVkaW9fcHJpdmF0ZSwgZHBfYXVkaW8pOwogCi0Ja3pmcmVlKGF1ZGlvKTsKKwlkZXZtX2tmcmVlKCZhdWRpby0+cGRldi0+ZGV2LCBhdWRpbyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2F1eC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdXguYwppbmRleCA5MTA2MDI3Li5hY2JhZWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2F1eC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmMKQEAgLTM4LDYgKzM4LDEwIEBACiAJYm9vbCBjbWRfYnVzeTsKIAlib29sIG5hdGl2ZTsKIAlib29sIHJlYWQ7CisJYm9vbCBub19zZW5kX2FkZHI7CisJYm9vbCBub19zZW5kX3N0b3A7CisJdTMyIG9mZnNldDsKKwl1MzIgc2VnbWVudDsKIAogCXN0cnVjdCBkcm1fZHBfYXV4IGRybV9hdXg7CiB9OwpAQCAtMTAyLDkgKzEwNiwxOSBAQAogCQlhdXgtPmNhdGFsb2ctPndyaXRlX2RhdGEoYXV4LT5jYXRhbG9nKTsKIAl9CiAKKwlhdXgtPmNhdGFsb2ctPmNsZWFyX3RyYW5zKGF1eC0+Y2F0YWxvZywgZmFsc2UpOworCWF1eC0+Y2F0YWxvZy0+Y2xlYXJfaHdfaW50ZXJydXB0cyhhdXgtPmNhdGFsb2cpOworCiAJcmVnID0gMDsgLyogVHJhbnNhY3Rpb24gbnVtYmVyID09IDEgKi8KLQlpZiAoIWF1eC0+bmF0aXZlKSAvKiBpMmMgKi8KLQkJcmVnIHw9IChCSVQoOCkgfCBCSVQoMTApIHwgQklUKDExKSk7CisJaWYgKCFhdXgtPm5hdGl2ZSkgeyAvKiBpMmMgKi8KKwkJcmVnIHw9IEJJVCg4KTsKKworCQlpZiAoYXV4LT5ub19zZW5kX2FkZHIpCisJCQlyZWcgfD0gQklUKDEwKTsKKworCQlpZiAoYXV4LT5ub19zZW5kX3N0b3ApCisJCQlyZWcgfD0gQklUKDExKTsKKwl9CiAKIAlyZWcgfD0gQklUKDkpOwogCWF1eC0+Y2F0YWxvZy0+ZGF0YSA9IHJlZzsKQEAgLTE1MCw5ICsxNjQsMTEgQEAKIHsKIAl1MzIgZGF0YTsKIAl1OCAqZHA7Ci0JdTMyIGk7CisJdTMyIGksIGFjdHVhbF9pOwogCXUzMiBsZW4gPSBtc2ctPnNpemU7CiAKKwlhdXgtPmNhdGFsb2ctPmNsZWFyX3RyYW5zKGF1eC0+Y2F0YWxvZywgdHJ1ZSk7CisKIAlkYXRhID0gMDsKIAlkYXRhIHw9IERQX0FVWF9EQVRBX0lOREVYX1dSSVRFOyAvKiBJTkRFWF9XUklURSAqLwogCWRhdGEgfD0gQklUKDApOyAgLyogcmVhZCAqLwpAQCAtMTY4LDYgKzE4NCwxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlkYXRhID0gYXV4LT5jYXRhbG9nLT5yZWFkX2RhdGEoYXV4LT5jYXRhbG9nKTsKIAkJKmRwKysgPSAodTgpKChkYXRhID4+IDgpICYgMHhmZik7CisKKwkJYWN0dWFsX2kgPSAoZGF0YSA+PiAxNikgJiAweEZGOworCQlpZiAoaSAhPSBhY3R1YWxfaSkKKwkJCXByX3dhcm4oIkluZGV4IG1pc21hdGNoOiBleHBlY3RlZCAlZCwgZm91bmQgJWRcbiIsCisJCQkJaSwgYWN0dWFsX2kpOwogCX0KIH0KIApAQCAtMTgzLDYgKzIwNCwxMCBAQAogCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX1RPVVQ7CiAJaWYgKGlzciAmIERQX0lOVFJfTkFDS19ERUZFUikKIAkJYXV4LT5hdXhfZXJyb3JfbnVtID0gRFBfQVVYX0VSUl9OQUNLOworCWlmIChpc3IgJiBEUF9JTlRSX0FVWF9FUlJPUikgeworCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX1BIWTsKKwkJYXV4LT5jYXRhbG9nLT5jbGVhcl9od19pbnRlcnJ1cHRzKGF1eC0+Y2F0YWxvZyk7CisJfQogCiAJY29tcGxldGUoJmF1eC0+Y29tcCk7CiB9CkBAIC0yMDcsNiArMjMyLDEwIEBACiAJCQlhdXgtPmF1eF9lcnJvcl9udW0gPSBEUF9BVVhfRVJSX05BQ0s7CiAJCWlmIChpc3IgJiBEUF9JTlRSX0kyQ19ERUZFUikKIAkJCWF1eC0+YXV4X2Vycm9yX251bSA9IERQX0FVWF9FUlJfREVGRVI7CisJCWlmIChpc3IgJiBEUF9JTlRSX0FVWF9FUlJPUikgeworCQkJYXV4LT5hdXhfZXJyb3JfbnVtID0gRFBfQVVYX0VSUl9QSFk7CisJCQlhdXgtPmNhdGFsb2ctPmNsZWFyX2h3X2ludGVycnVwdHMoYXV4LT5jYXRhbG9nKTsKKwkJfQogCX0KIAogCWNvbXBsZXRlKCZhdXgtPmNvbXApOwpAQCAtMjUwLDYgKzI3OSw4NyBAQAogCWF1eC0+Y2F0YWxvZy0+cmVzZXQoYXV4LT5jYXRhbG9nKTsKIH0KIAorc3RhdGljIHZvaWQgZHBfYXV4X3VwZGF0ZV9vZmZzZXRfYW5kX3NlZ21lbnQoc3RydWN0IGRwX2F1eF9wcml2YXRlICphdXgsCisJCXN0cnVjdCBkcm1fZHBfYXV4X21zZyAqaW5wdXRfbXNnKQoreworCXUzMiBjb25zdCBlZGlkX2FkZHJlc3MgPSAweDUwOworCXUzMiBjb25zdCBzZWdtZW50X2FkZHJlc3MgPSAweDMwOworCWJvb2wgaTJjX3JlYWQgPSBpbnB1dF9tc2ctPnJlcXVlc3QgJgorCQkoRFBfQVVYX0kyQ19SRUFEICYgRFBfQVVYX05BVElWRV9SRUFEKTsKKwl1OCAqZGF0YSA9IE5VTEw7CisKKwlpZiAoYXV4LT5uYXRpdmUgfHwgaTJjX3JlYWQgfHwgKChpbnB1dF9tc2ctPmFkZHJlc3MgIT0gZWRpZF9hZGRyZXNzKSAmJgorCQkoaW5wdXRfbXNnLT5hZGRyZXNzICE9IHNlZ21lbnRfYWRkcmVzcykpKQorCQlyZXR1cm47CisKKworCWRhdGEgPSBpbnB1dF9tc2ctPmJ1ZmZlcjsKKwlpZiAoaW5wdXRfbXNnLT5hZGRyZXNzID09IHNlZ21lbnRfYWRkcmVzcykKKwkJYXV4LT5zZWdtZW50ID0gKmRhdGE7CisJZWxzZQorCQlhdXgtPm9mZnNldCA9ICpkYXRhOworfQorCisvKioKKyAqIGRwX2F1eF90cmFuc2Zlcl9oZWxwZXIoKSAtIGhlbHBlciBmdW5jdGlvbiBmb3IgRURJRCByZWFkIHRyYW5zYWN0aW9ucworICoKKyAqIEBhdXg6IERQIEFVWCBwcml2YXRlIHN0cnVjdHVyZQorICogQGlucHV0X21zZzogaW5wdXQgbWVzc2FnZSBmcm9tIERSTSB1cHN0cmVhbSBBUElzCisgKgorICogcmV0dXJuOiB2b2lkCisgKgorICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBmaXggRURJRCByZWFkcyBmb3Igbm9uLWNvbXBsaWFudAorICogc2lua3MgdGhhdCBkbyBub3QgaGFuZGxlIHRoZSBpMmMgbWlkZGxlLW9mLXRyYW5zYWN0aW9uIGZsYWcgY29ycmVjdGx5LgorICovCitzdGF0aWMgdm9pZCBkcF9hdXhfdHJhbnNmZXJfaGVscGVyKHN0cnVjdCBkcF9hdXhfcHJpdmF0ZSAqYXV4LAorCQlzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgKmlucHV0X21zZykKK3sKKwlzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgaGVscGVyX21zZzsKKwl1MzIgY29uc3QgbWVzc2FnZV9zaXplID0gMHgxMDsKKwl1MzIgY29uc3Qgc2VnbWVudF9hZGRyZXNzID0gMHgzMDsKKwlib29sIGkyY19tb3QgPSBpbnB1dF9tc2ctPnJlcXVlc3QgJiBEUF9BVVhfSTJDX01PVDsKKwlib29sIGkyY19yZWFkID0gaW5wdXRfbXNnLT5yZXF1ZXN0ICYKKwkJKERQX0FVWF9JMkNfUkVBRCAmIERQX0FVWF9OQVRJVkVfUkVBRCk7CisKKwlpZiAoIWkyY19tb3QgfHwgIWkyY19yZWFkIHx8IChpbnB1dF9tc2ctPnNpemUgPT0gMCkpCisJCXJldHVybjsKKworCWF1eC0+cmVhZCA9IGZhbHNlOworCWF1eC0+Y21kX2J1c3kgPSB0cnVlOworCWF1eC0+bm9fc2VuZF9hZGRyID0gdHJ1ZTsKKwlhdXgtPm5vX3NlbmRfc3RvcCA9IHRydWU7CisKKwkvKgorCSAqIFNlbmQgdGhlIHNlZ21lbnQgYWRkcmVzcyBmb3IgZXZlcnkgaTJjIHJlYWQgaW4gd2hpY2ggdGhlCisJICogbWlkZGxlLW9mLXRyYW5hY3Rpb24gZmxhZyBpcyBzZXQuIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBFRElECisJICogcmVhZHMgb2YgbW9yZSB0aGFuIDIgYmxvY2tzIGFzIHRoZSBzZWdtZW50IGFkZHJlc3MgaXMgcmVzZXQgdG8gMAorCSAqIHNpbmNlIHdlIGFyZSBvdmVycmlkaW5nIHRoZSBtaWRkbGUtb2YtdHJhbnNhY3Rpb24gZmxhZyBmb3IgcmVhZAorCSAqIHRyYW5zYWN0aW9ucy4KKwkgKi8KKwltZW1zZXQoJmhlbHBlcl9tc2csIDAsIHNpemVvZihoZWxwZXJfbXNnKSk7CisJaGVscGVyX21zZy5hZGRyZXNzID0gc2VnbWVudF9hZGRyZXNzOworCWhlbHBlcl9tc2cuYnVmZmVyID0gJmF1eC0+c2VnbWVudDsKKwloZWxwZXJfbXNnLnNpemUgPSAxOworCWRwX2F1eF9jbWRfZmlmb190eChhdXgsICZoZWxwZXJfbXNnKTsKKworCS8qCisJICogU2VuZCB0aGUgb2Zmc2V0IGFkZHJlc3MgZm9yIGV2ZXJ5IGkyYyByZWFkIGluIHdoaWNoIHRoZQorCSAqIG1pZGRsZS1vZi10cmFuc2FjdGlvbiBmbGFnIGlzIHNldC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBzaW5rCisJICogd2lsbCB1cGRhdGUgaXRzIHJlYWQgcG9pbnRlciBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHBvcnRpb24gb2YgdGhlCisJICogRURJRCBidWZmZXIgaW4gdGhlIHN1YnNlcXVlbnQgaTJjIHJlYWQgdHJhc250aW9uIHRyaWdnZXJlZCBpbiB0aGUKKwkgKiBuYXRpdmUgQVVYIHRyYW5zZmVyIGZ1bmN0aW9uLgorCSAqLworCW1lbXNldCgmaGVscGVyX21zZywgMCwgc2l6ZW9mKGhlbHBlcl9tc2cpKTsKKwloZWxwZXJfbXNnLmFkZHJlc3MgPSBpbnB1dF9tc2ctPmFkZHJlc3M7CisJaGVscGVyX21zZy5idWZmZXIgPSAmYXV4LT5vZmZzZXQ7CisJaGVscGVyX21zZy5zaXplID0gMTsKKwlkcF9hdXhfY21kX2ZpZm9fdHgoYXV4LCAmaGVscGVyX21zZyk7CisJYXV4LT5vZmZzZXQgKz0gbWVzc2FnZV9zaXplOworCisJaWYgKGF1eC0+b2Zmc2V0ID09IDB4ODAgfHwgYXV4LT5vZmZzZXQgPT0gMHgxMDApCisJCWF1eC0+c2VnbWVudCA9IDB4MDsgLyogcmVzZXQgc2VnbWVudCBhdCBlbmQgb2YgYmxvY2sgKi8KK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgcmVhbCBqb2IgdG8gcHJvY2VzcyBhbiBBVVggdHJhbnNhY3Rpb24uCiAgKiBJdCB3aWxsIGNhbGwgYXV4X3Jlc2V0KCkgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIEFVWCBjaGFubmVsLApAQCAtMjY4LDggKzM3OCw2IEBACiAJbXV0ZXhfbG9jaygmYXV4LT5tdXRleCk7CiAKIAlhdXgtPm5hdGl2ZSA9IG1zZy0+cmVxdWVzdCAmIChEUF9BVVhfTkFUSVZFX1dSSVRFICYgRFBfQVVYX05BVElWRV9SRUFEKTsKLQlhdXgtPnJlYWQgPSBtc2ctPnJlcXVlc3QgJiAoRFBfQVVYX0kyQ19SRUFEICYgRFBfQVVYX05BVElWRV9SRUFEKTsKLQlhdXgtPmNtZF9idXN5ID0gdHJ1ZTsKIAogCS8qIElnbm9yZSBhZGRyZXNzIG9ubHkgbWVzc2FnZSAqLwogCWlmICgobXNnLT5zaXplID09IDApIHx8IChtc2ctPmJ1ZmZlciA9PSBOVUxMKSkgewpAQCAtMjg4LDYgKzM5NiwyMCBAQAogCQlnb3RvIHVubG9ja19leGl0OwogCX0KIAorCWRwX2F1eF91cGRhdGVfb2Zmc2V0X2FuZF9zZWdtZW50KGF1eCwgbXNnKTsKKwlkcF9hdXhfdHJhbnNmZXJfaGVscGVyKGF1eCwgbXNnKTsKKworCWF1eC0+cmVhZCA9IG1zZy0+cmVxdWVzdCAmIChEUF9BVVhfSTJDX1JFQUQgJiBEUF9BVVhfTkFUSVZFX1JFQUQpOworCWF1eC0+Y21kX2J1c3kgPSB0cnVlOworCisJaWYgKGF1eC0+cmVhZCkgeworCQlhdXgtPm5vX3NlbmRfYWRkciA9IHRydWU7CisJCWF1eC0+bm9fc2VuZF9zdG9wID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJYXV4LT5ub19zZW5kX2FkZHIgPSB0cnVlOworCQlhdXgtPm5vX3NlbmRfc3RvcCA9IHRydWU7CisJfQorCiAJcmV0ID0gZHBfYXV4X2NtZF9maWZvX3R4KGF1eCwgbXNnKTsKIAlpZiAoKHJldCA8IDApICYmIGF1eC0+bmF0aXZlKSB7CiAJCWF1eC0+cmV0cnlfY250Kys7CkBAIC0zNDEsMTEgKzQ2MywxMSBAQAogCiAJYXV4ID0gY29udGFpbmVyX29mKGRwX2F1eCwgc3RydWN0IGRwX2F1eF9wcml2YXRlLCBkcF9hdXgpOwogCisJZHBfYXV4X3Jlc2V0X3BoeV9jb25maWdfaW5kaWNlcyhhdXhfY2ZnKTsKKwlhdXgtPmNhdGFsb2ctPnNldHVwKGF1eC0+Y2F0YWxvZywgYXV4X2NmZyk7CiAJYXV4LT5jYXRhbG9nLT5yZXNldChhdXgtPmNhdGFsb2cpOwogCWF1eC0+Y2F0YWxvZy0+ZW5hYmxlKGF1eC0+Y2F0YWxvZywgdHJ1ZSk7CiAJYXV4LT5yZXRyeV9jbnQgPSAwOwotCWRwX2F1eF9yZXNldF9waHlfY29uZmlnX2luZGljZXMoYXV4X2NmZyk7Ci0JYXV4LT5jYXRhbG9nLT5zZXR1cChhdXgtPmNhdGFsb2csIGF1eF9jZmcpOwogfQogCiBzdGF0aWMgdm9pZCBkcF9hdXhfZGVpbml0KHN0cnVjdCBkcF9hdXggKmRwX2F1eCkKQEAgLTQ1MSw1ICs1NzMsNyBAQAogCiAJYXV4ID0gY29udGFpbmVyX29mKGRwX2F1eCwgc3RydWN0IGRwX2F1eF9wcml2YXRlLCBkcF9hdXgpOwogCisJbXV0ZXhfZGVzdHJveSgmYXV4LT5tdXRleCk7CisKIAlkZXZtX2tmcmVlKGF1eC0+ZGV2LCBhdXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdXguaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfYXV4LmgKaW5kZXggNWQ5NmZkOS4uODU3NjFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdXguaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2F1eC5oCkBAIC0yNSw2ICsyNSw3IEBACiAJRFBfQVVYX0VSUl9OQUNLCT0gLTMsCiAJRFBfQVVYX0VSUl9ERUZFUgk9IC00LAogCURQX0FVWF9FUlJfTkFDS19ERUZFUgk9IC01LAorCURQX0FVWF9FUlJfUEhZCT0gLTYsCiB9OwogCiBzdHJ1Y3QgZHBfYXV4IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jYXRhbG9nLmMKaW5kZXggOTRiZDE5OS4uMjg5NGU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jYXRhbG9nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jYXRhbG9nLmMKQEAgLTE1LDEwICsxNSwxNCBAQAogI2RlZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2RwX2hlbHBlci5oPgogCiAjaW5jbHVkZSAiZHBfY2F0YWxvZy5oIgogI2luY2x1ZGUgImRwX3JlZy5oIgogCisjZGVmaW5lIERQX0dFVF9NU0IoeCkJKHggPj4gOCkKKyNkZWZpbmUgRFBfR0VUX0xTQih4KQkoeCAmIDB4ZmYpCisKICNkZWZpbmUgZHBfcmVhZChvZmZzZXQpIHJlYWRsX3JlbGF4ZWQoKG9mZnNldCkpCiAjZGVmaW5lIGRwX3dyaXRlKG9mZnNldCwgZGF0YSkgd3JpdGVsX3JlbGF4ZWQoKGRhdGEpLCAob2Zmc2V0KSkKIApAQCAtMTI3LDYgKzEzMSw1OCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBkcF9jYXRhbG9nX2F1eF9jbGVhcl90cmFucyhzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCwgYm9vbCByZWFkKQoreworCWludCByYyA9IDA7CisJdTMyIGRhdGEgPSAwOworCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJaWYgKCFhdXgpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVuZDsKKwl9CisKKwlkcF9jYXRhbG9nX2dldF9wcml2KGF1eCk7CisJYmFzZSA9IGNhdGFsb2ctPmlvLT5jdHJsX2lvLmJhc2U7CisKKwlpZiAocmVhZCkgeworCQlkYXRhID0gZHBfcmVhZChiYXNlICsgRFBfQVVYX1RSQU5TX0NUUkwpOworCQlkYXRhICY9IH5CSVQoOSk7CisJCWRwX3dyaXRlKGJhc2UgKyBEUF9BVVhfVFJBTlNfQ1RSTCwgZGF0YSk7CisJfSBlbHNlIHsKKwkJZHBfd3JpdGUoYmFzZSArIERQX0FVWF9UUkFOU19DVFJMLCAwKTsKKwl9CitlbmQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkcF9jYXRhbG9nX2F1eF9jbGVhcl9od19pbnRlcnJ1cHRzKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4KQoreworCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7CisJdm9pZCBfX2lvbWVtICpwaHlfYmFzZTsKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAoIWF1eCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihhdXgpOworCXBoeV9iYXNlID0gY2F0YWxvZy0+aW8tPnBoeV9pby5iYXNlOworCisJZGF0YSA9IGRwX3JlYWQocGh5X2Jhc2UgKyBEUF9QSFlfQVVYX0lOVEVSUlVQVF9TVEFUVVMpOworCXByX2RlYnVnKCJQSFlfQVVYX0lOVEVSUlVQVF9TVEFUVVM9MHglMDh4XG4iLCBkYXRhKTsKKworCWRwX3dyaXRlKHBoeV9iYXNlICsgRFBfUEhZX0FVWF9JTlRFUlJVUFRfQ0xFQVIsIDB4MWYpOworCXdtYigpOyAvKiBtYWtlIHN1cmUgMHgxZiBpcyB3cml0dGVuIGJlZm9yZSBuZXh0IHdyaXRlICovCisJZHBfd3JpdGUocGh5X2Jhc2UgKyBEUF9QSFlfQVVYX0lOVEVSUlVQVF9DTEVBUiwgMHg5Zik7CisJd21iKCk7IC8qIG1ha2Ugc3VyZSAweDlmIGlzIHdyaXR0ZW4gYmVmb3JlIG5leHQgd3JpdGUgKi8KKwlkcF93cml0ZShwaHlfYmFzZSArIERQX1BIWV9BVVhfSU5URVJSVVBUX0NMRUFSLCAwKTsKKwl3bWIoKTsgLyogbWFrZSBzdXJlIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8KK30KKwogc3RhdGljIHZvaWQgZHBfY2F0YWxvZ19hdXhfcmVzZXQoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgpCiB7CiAJdTMyIGF1eF9jdHJsOwpAQCAtMTQ5LDYgKzIwNSw3IEBACiAKIAlhdXhfY3RybCAmPSB+QklUKDEpOwogCWRwX3dyaXRlKGJhc2UgKyBEUF9BVVhfQ1RSTCwgYXV4X2N0cmwpOworCXdtYigpOyAvKiBtYWtlIHN1cmUgQVVYIHJlc2V0IGlzIGRvbmUgaGVyZSAqLwogfQogCiBzdGF0aWMgdm9pZCBkcF9jYXRhbG9nX2F1eF9lbmFibGUoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgsIGJvb2wgZW5hYmxlKQpAQCAtMTY4LDE0ICsyMjUsMTUgQEAKIAlhdXhfY3RybCA9IGRwX3JlYWQoYmFzZSArIERQX0FVWF9DVFJMKTsKIAogCWlmIChlbmFibGUpIHsKKwkJYXV4X2N0cmwgfD0gQklUKDApOworCQlkcF93cml0ZShiYXNlICsgRFBfQVVYX0NUUkwsIGF1eF9jdHJsKTsKKwkJd21iKCk7IC8qIG1ha2Ugc3VyZSBBVVggbW9kdWxlIGlzIGVuYWJsZWQgKi8KIAkJZHBfd3JpdGUoYmFzZSArIERQX1RJTUVPVVRfQ09VTlQsIDB4ZmZmZik7CiAJCWRwX3dyaXRlKGJhc2UgKyBEUF9BVVhfTElNSVRTLCAweGZmZmYpOwotCQlhdXhfY3RybCB8PSBCSVQoMCk7CiAJfSBlbHNlIHsKIAkJYXV4X2N0cmwgJj0gfkJJVCgwKTsKKwkJZHBfd3JpdGUoYmFzZSArIERQX0FVWF9DVFJMLCBhdXhfY3RybCk7CiAJfQotCi0JZHBfd3JpdGUoYmFzZSArIERQX0FVWF9DVFJMLCBhdXhfY3RybCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRwX2NhdGFsb2dfYXV4X3VwZGF0ZV9jZmcoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgsCkBAIC0yMTUsMTMgKzI3MywxMiBAQAogCiAJZHBfY2F0YWxvZ19nZXRfcHJpdihhdXgpOwogCi0JZHBfd3JpdGUoY2F0YWxvZy0+aW8tPnBoeV9pby5iYXNlICsgRFBfUEhZX1BEX0NUTCwgMHgwMik7CisJZHBfd3JpdGUoY2F0YWxvZy0+aW8tPnBoeV9pby5iYXNlICsgRFBfUEhZX1BEX0NUTCwgMHg2NSk7CiAJd21iKCk7IC8qIG1ha2Ugc3VyZSBQRCBwcm9ncmFtbWluZyBoYXBwZW5lZCAqLwotCWRwX3dyaXRlKGNhdGFsb2ctPmlvLT5waHlfaW8uYmFzZSArIERQX1BIWV9QRF9DVEwsIDB4N2QpOwogCiAJLyogVHVybiBvbiBCSUFTIGN1cnJlbnQgZm9yIFBIWS9QTEwgKi8KIAlkcF93cml0ZShjYXRhbG9nLT5pby0+ZHBfcGxsX2lvLmJhc2UgKwotCQlRU0VSREVTX0NPTV9CSUFTX0VOX0NMS0JVRkxSX0VOLCAweDNmKTsKKwkJUVNFUkRFU19DT01fQklBU19FTl9DTEtCVUZMUl9FTiwgMHgxYik7CiAKIAkvKiBEUCBBVVggQ0ZHIHJlZ2lzdGVyIHByb2dyYW1taW5nICovCiAJZm9yIChpID0gMDsgaSA8IFBIWV9BVVhfQ0ZHX01BWDsgaSsrKSB7CkBAIC0yMzMsNiArMjkwLDcgQEAKIAl9CiAKIAlkcF93cml0ZShjYXRhbG9nLT5pby0+cGh5X2lvLmJhc2UgKyBEUF9QSFlfQVVYX0lOVEVSUlVQVF9NQVNLLCAweDFGKTsKKwl3bWIoKTsgLyogbWFrZSBzdXJlIEFVWCBjb25maWd1cmF0aW9uIGlzIGRvbmUgYmVmb3JlIGVuYWJsaW5nIGl0ICovCiB9CiAKIHN0YXRpYyB2b2lkIGRwX2NhdGFsb2dfYXV4X2dldF9pcnEoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgsIGJvb2wgY21kX2J1c3kpCkBAIC0yNDksOSArMzA3LDYgQEAKIAlkcF9jYXRhbG9nX2dldF9wcml2KGF1eCk7CiAJYmFzZSA9IGNhdGFsb2ctPmlvLT5jdHJsX2lvLmJhc2U7CiAKLQlpZiAoY21kX2J1c3kpCi0JCWRwX3dyaXRlKGJhc2UgKyBEUF9BVVhfVFJBTlNfQ1RSTCwgMHgwKTsKLQogCWF1eC0+aXNyID0gZHBfcmVhZChiYXNlICsgRFBfSU5UUl9TVEFUVVMpOwogCWF1eC0+aXNyICY9IH5EUF9JTlRSX01BU0sxOwogCWFjayA9IGF1eC0+aXNyICYgRFBfSU5URVJSVVBUX1NUQVRVUzE7CkBAIC0yNzcsNiArMzMyLDE3NCBAQAogCXJldHVybiBkcF9yZWFkKGJhc2UgKyBEUF9IRENQX1NUQVRVUyk7CiB9CiAKK3N0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF9zZXR1cF9pbmZvZnJhbWVfc2RwKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIGhlYWRlciwgZGF0YTsKKworCWlmICghY3RybCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKKwliYXNlID0gY2F0YWxvZy0+aW8tPmN0cmxfaW8uYmFzZTsKKworCWhlYWRlciA9IGRwX3JlYWQoYmFzZSArIE1NU1NfRFBfVlNDRVhUXzApOworCWhlYWRlciB8PSBjdHJsLT5oZHJfZGF0YS52c2NfaGRyX2J5dGUxOworCWRwX3dyaXRlKGJhc2UgKyBNTVNTX0RQX1ZTQ0VYVF8wLCBoZWFkZXIpOworCisJaGVhZGVyID0gZHBfcmVhZChiYXNlICsgTU1TU19EUF9WU0NFWFRfMSk7CisJaGVhZGVyIHw9IGN0cmwtPmhkcl9kYXRhLnZzY19oZHJfYnl0ZTE7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfVlNDRVhUXzEsIGhlYWRlcik7CisKKwloZWFkZXIgPSBkcF9yZWFkKGJhc2UgKyBNTVNTX0RQX1ZTQ0VYVF8xKTsKKwloZWFkZXIgfD0gY3RybC0+aGRyX2RhdGEudnNjX2hkcl9ieXRlMTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfMSwgaGVhZGVyKTsKKworCWhlYWRlciA9ICBjdHJsLT5oZHJfZGF0YS52ZXJzaW9uOworCWhlYWRlciB8PSAgY3RybC0+aGRyX2RhdGEubGVuZ3RoIDw8IDg7CisJaGVhZGVyIHw9IGN0cmwtPmhkcl9kYXRhLmVvdGYgPDwgMTY7CisJaGVhZGVyIHw9IChjdHJsLT5oZHJfZGF0YS5kZXNjcmlwdG9yX2lkIDw8IDI0KTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfMiwgaGVhZGVyKTsKKworCWRhdGEgPSAoRFBfR0VUX0xTQihjdHJsLT5oZHJfZGF0YS5kaXNwbGF5X3ByaW1hcmllc194WzBdKSB8CisJCShEUF9HRVRfTVNCKGN0cmwtPmhkcl9kYXRhLmRpc3BsYXlfcHJpbWFyaWVzX3hbMF0pIDw8IDgpIHwKKwkJKERQX0dFVF9MU0IoY3RybC0+aGRyX2RhdGEuZGlzcGxheV9wcmltYXJpZXNfeVswXSkgPDwgMTYpIHwKKwkJKERQX0dFVF9NU0IoY3RybC0+aGRyX2RhdGEuZGlzcGxheV9wcmltYXJpZXNfeVswXSkgPDwgMjQpKTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfMywgZGF0YSk7CisKKwlkYXRhID0gKERQX0dFVF9MU0IoY3RybC0+aGRyX2RhdGEuZGlzcGxheV9wcmltYXJpZXNfeFsxXSkgfAorCQkoRFBfR0VUX01TQihjdHJsLT5oZHJfZGF0YS5kaXNwbGF5X3ByaW1hcmllc194WzFdKSA8PCA4KSB8CisJCShEUF9HRVRfTFNCKGN0cmwtPmhkcl9kYXRhLmRpc3BsYXlfcHJpbWFyaWVzX3lbMV0pIDw8IDE2KSB8CisJCShEUF9HRVRfTVNCKGN0cmwtPmhkcl9kYXRhLmRpc3BsYXlfcHJpbWFyaWVzX3lbMV0pIDw8IDI0KSk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfVlNDRVhUXzQsIGRhdGEpOworCisJZGF0YSA9IChEUF9HRVRfTFNCKGN0cmwtPmhkcl9kYXRhLmRpc3BsYXlfcHJpbWFyaWVzX3hbMl0pIHwKKwkJKERQX0dFVF9NU0IoY3RybC0+aGRyX2RhdGEuZGlzcGxheV9wcmltYXJpZXNfeFsyXSkgPDwgOCkgfAorCQkoRFBfR0VUX0xTQihjdHJsLT5oZHJfZGF0YS5kaXNwbGF5X3ByaW1hcmllc195WzJdKSA8PCAxNikgfAorCQkoRFBfR0VUX01TQihjdHJsLT5oZHJfZGF0YS5kaXNwbGF5X3ByaW1hcmllc195WzJdKSA8PCAyNCkpOworCWRwX3dyaXRlKGJhc2UgKyBNTVNTX0RQX1ZTQ0VYVF81LCBkYXRhKTsKKworCWRhdGEgPSAoRFBfR0VUX0xTQihjdHJsLT5oZHJfZGF0YS53aGl0ZV9wb2ludF94KSB8CisJCShEUF9HRVRfTVNCKGN0cmwtPmhkcl9kYXRhLndoaXRlX3BvaW50X3gpIDw8IDgpIHwKKwkJKERQX0dFVF9MU0IoY3RybC0+aGRyX2RhdGEud2hpdGVfcG9pbnRfeSkgPDwgMTYpIHwKKwkJKERQX0dFVF9NU0IoY3RybC0+aGRyX2RhdGEud2hpdGVfcG9pbnRfeSkgPDwgMjQpKTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfNiwgZGF0YSk7CisKKwlkYXRhID0gKERQX0dFVF9MU0IoY3RybC0+aGRyX2RhdGEubWF4X2x1bWluYW5jZSkgfAorCQkoRFBfR0VUX01TQihjdHJsLT5oZHJfZGF0YS5tYXhfbHVtaW5hbmNlKSA8PCA4KSB8CisJCShEUF9HRVRfTFNCKGN0cmwtPmhkcl9kYXRhLm1pbl9sdW1pbmFuY2UpIDw8IDE2KSB8CisJCShEUF9HRVRfTVNCKGN0cmwtPmhkcl9kYXRhLm1pbl9sdW1pbmFuY2UpIDw8IDI0KSk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfVlNDRVhUXzcsIGRhdGEpOworCisJZGF0YSA9IChEUF9HRVRfTFNCKGN0cmwtPmhkcl9kYXRhLm1heF9jb250ZW50X2xpZ2h0X2xldmVsKSB8CisJCShEUF9HRVRfTVNCKGN0cmwtPmhkcl9kYXRhLm1heF9jb250ZW50X2xpZ2h0X2xldmVsKSA8PCA4KSB8CisJCShEUF9HRVRfTFNCKGN0cmwtPmhkcl9kYXRhLm1heF9hdmVyYWdlX2xpZ2h0X2xldmVsKSA8PCAxNikgfAorCQkoRFBfR0VUX01TQihjdHJsLT5oZHJfZGF0YS5tYXhfYXZlcmFnZV9saWdodF9sZXZlbCkgPDwgMjQpKTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfOCwgZGF0YSk7CisKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9WU0NFWFRfOSwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF9zZXR1cF92c2Nfc2RwKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIHZhbHVlOworCisJaWYgKCFjdHJsKSB7CisJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOworCWJhc2UgPSBjYXRhbG9nLT5pby0+Y3RybF9pby5iYXNlOworCisJdmFsdWUgPSBkcF9yZWFkKGJhc2UgKyBNTVNTX0RQX0dFTkVSSUMwXzApOworCXZhbHVlIHw9IGN0cmwtPmhkcl9kYXRhLnZzY19oZHJfYnl0ZTE7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfMCwgdmFsdWUpOworCisJdmFsdWUgPSBkcF9yZWFkKGJhc2UgKyBNTVNTX0RQX0dFTkVSSUMwXzEpOworCXZhbHVlIHw9IGN0cmwtPmhkcl9kYXRhLnZzY19oZHJfYnl0ZTI7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfMSwgdmFsdWUpOworCisJdmFsdWUgPSBkcF9yZWFkKGJhc2UgKyBNTVNTX0RQX0dFTkVSSUMwXzEpOworCXZhbHVlIHw9IGN0cmwtPmhkcl9kYXRhLnZzY19oZHJfYnl0ZTM7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfMSwgdmFsdWUpOworCisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfMiwgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfMywgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfNCwgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfNSwgMHgwMCk7CisKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9HRU5FUklDMF82LCBjdHJsLT5oZHJfZGF0YS5wa3RfcGF5bG9hZCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfNywgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfOCwgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIE1NU1NfRFBfR0VORVJJQzBfOSwgMHgwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF9jb25maWdfaGRyKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIGNmZywgY2ZnMjsKKworCWlmICghY3RybCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKKwliYXNlID0gY2F0YWxvZy0+aW8tPmN0cmxfaW8uYmFzZTsKKworCWNmZyA9IGRwX3JlYWQoYmFzZSArIE1NU1NfRFBfU0RQX0NGRyk7CisJLyogVlNDRVhUX1NEUF9FTiAqLworCWNmZyB8PSBCSVQoMTYpOworCisJLyogR0VOMF9TRFBfRU4gKi8KKwljZmcgfD0gQklUKDE3KTsKKworCWRwX3dyaXRlKGJhc2UgKyBNTVNTX0RQX1NEUF9DRkcsIGNmZyk7CisKKwljZmcyID0gZHBfcmVhZChiYXNlICsgTU1TU19EUF9TRFBfQ0ZHMik7CisJLyogR2VuZXJpYzAgU0RQIFBheWxvYWQgaXMgMTkgYnl0ZXMgd2hpY2ggaXMgPiAxNiwgc28gQml0MTYgaXMgMSAqLworCWNmZzIgfD0gQklUKDE2KTsKKwlkcF93cml0ZShiYXNlICsgTU1TU19EUF9TRFBfQ0ZHMiwgY2ZnMik7CisKKwlkcF9jYXRhbG9nX2N0cmxfc2V0dXBfdnNjX3NkcChjdHJsKTsKKwlkcF9jYXRhbG9nX2N0cmxfc2V0dXBfaW5mb2ZyYW1lX3NkcChjdHJsKTsKKworCWNmZyA9IGRwX3JlYWQoYmFzZSArIERQX01JU0MxX01JU0MwKTsKKwkvKiBJbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgVlNDICovCisJY2ZnIHw9IEJJVCg2KSA8PCA4OworCisJZHBfd3JpdGUoYmFzZSArIERQX01JU0MxX01JU0MwLCBjZmcpOworCisJY2ZnID0gZHBfcmVhZChiYXNlICsgRFBfQ09ORklHVVJBVElPTl9DVFJMKTsKKwkvKiBTZW5kIFZTQyAqLworCWNmZyB8PSBCSVQoNyk7CisKKwlzd2l0Y2ggKGN0cmwtPmhkcl9kYXRhLmJwYykgeworCWRlZmF1bHQ6CisJY2FzZSAxMDoKKwkJY2ZnIHw9IEJJVCg5KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQljZmcgfD0gQklUKDgpOworCQlicmVhazsKKwl9CisKKwlkcF93cml0ZShiYXNlICsgRFBfQ09ORklHVVJBVElPTl9DVFJMLCBjZmcpOworCisJY2ZnID0gZHBfcmVhZChiYXNlICsgRFBfQ09NUFJFU1NJT05fTU9ERV9DVFJMKTsKKworCS8qIFRyaWdnZXIgU0RQIHZhbHVlcyBpbiByZWdpc3RlcnMgKi8KKwljZmcgfD0gQklUKDgpOworCWRwX3dyaXRlKGJhc2UgKyBEUF9DT01QUkVTU0lPTl9NT0RFX0NUUkwsIGNmZyk7Cit9CisKIHN0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF91cGRhdGVfdHJhbnNmZXJfdW5pdChzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKQogewogCXN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmNhdGFsb2c7CkBAIC0zODEsNyArNjA0LDcgQEAKIHN0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF9jb25maWdfbWlzYyhzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLAogCQkJCQl1MzIgY2MsIHUzMiB0YikKIHsKLQl1MzIgbWlzY192YWwgPSBjYzsKKwl1MzIgbWlzY192YWw7CiAJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAKQEAgLTM5Myw2ICs2MTYsOCBAQAogCWRwX2NhdGFsb2dfZ2V0X3ByaXYoY3RybCk7CiAJYmFzZSA9IGNhdGFsb2ctPmlvLT5jdHJsX2lvLmJhc2U7CiAKKwltaXNjX3ZhbCA9IGRwX3JlYWQoYmFzZSArIERQX01JU0MxX01JU0MwKTsKKwltaXNjX3ZhbCB8PSBjYzsKIAltaXNjX3ZhbCB8PSAodGIgPDwgNSk7CiAJbWlzY192YWwgfD0gQklUKDApOyAvKiBDb25maWd1cmUgY2xvY2sgdG8gc3luY2hyb25vdXMgbW9kZSAqLwogCkBAIC00MDgsNyArNjMzLDggQEAKIAl1MzIgbXZpZCwgbnZpZDsKIAl1NjQgbXZpZF9jYWxjOwogCXUzMiBjb25zdCBudmlkX2ZpeGVkID0gMHg4MDAwOwotCXUzMiBjb25zdCBsaW5rX3JhdGUgPSA1NDAwMDA7CisJdTMyIGNvbnN0IGxpbmtfcmF0ZV9oYnIyID0gNTQwMDAwOworCXUzMiBjb25zdCBsaW5rX3JhdGVfaGJyMyA9IDgxMDAwMDsKIAlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOwogCXZvaWQgX19pb21lbSAqYmFzZV9jYywgKmJhc2VfY3RybDsKIApAQCAtNDQ5LDggKzY3NSwxMSBAQAogCiAJCXByX2RlYnVnKCJyYXRlID0gJWRcbiIsIHJhdGUpOwogCi0JCWlmIChsaW5rX3JhdGUgPT0gcmF0ZSkKKwkJaWYgKGxpbmtfcmF0ZV9oYnIyID09IHJhdGUpCiAJCQludmlkICo9IDI7CisKKwkJaWYgKGxpbmtfcmF0ZV9oYnIzID09IHJhdGUpCisJCQludmlkICo9IDM7CiAJfQogCiAJYmFzZV9jdHJsID0gY2F0YWxvZy0+aW8tPmN0cmxfaW8uYmFzZTsKQEAgLTQ5Myw2ICs3MjIsNDMgQEAKIAkJcHJfZXJyKCJzZXQgbGlua190cmFpbj0lZCBmYWlsZWRcbiIsIHBhdHRlcm4pOwogfQogCitzdGF0aWMgdm9pZCBkcF9jYXRhbG9nX2N0cmxfdXNiX3Jlc2V0KHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZmxpcCkKK3sKKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOworCXZvaWQgX19pb21lbSAqYmFzZTsKKworCWlmICghY3RybCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKKworCWJhc2UgPSBjYXRhbG9nLT5pby0+dXNiM19kcF9jb20uYmFzZTsKKworCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9SRVNFVF9PVlJEX0NUUkwsIDB4MGEpOworCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9QSFlfTU9ERV9DVFJMLCAweDAyKTsKKwlkcF93cml0ZShiYXNlICsgVVNCM19EUF9DT01fU1dfUkVTRVQsIDB4MDEpOworCS8qIG1ha2Ugc3VyZSB1c2IzIGNvbSBwaHkgc29mdHdhcmUgcmVzZXQgaXMgZG9uZSAqLworCXdtYigpOworCisJaWYgKCFmbGlwKSAvKiBDQzEgKi8KKwkJZHBfd3JpdGUoYmFzZSArIFVTQjNfRFBfQ09NX1RZUEVDX0NUUkwsIDB4MDIpOworCWVsc2UgLyogQ0MyICovCisJCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9UWVBFQ19DVFJMLCAweDAzKTsKKworCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9TV0lfQ1RSTCwgMHgwMCk7CisJZHBfd3JpdGUoYmFzZSArIFVTQjNfRFBfQ09NX1NXX1JFU0VULCAweDAwKTsKKwkvKiBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIHJlc2V0IGlzIGRvbmUgKi8KKwl3bWIoKTsKKworCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9QT1dFUl9ET1dOX0NUUkwsIDB4MDEpOworCWRwX3dyaXRlKGJhc2UgKyBVU0IzX0RQX0NPTV9SRVNFVF9PVlJEX0NUUkwsIDB4MDApOworCS8qIG1ha2Ugc3VyZSBwaHkgaXMgYnJvdWdodCBvdXQgb2YgcmVzZXQgKi8KKwl3bWIoKTsKKworfQorCiBzdGF0aWMgdm9pZCBkcF9jYXRhbG9nX2N0cmxfcmVzZXQoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCkKIHsKIAl1MzIgc3dfcmVzZXQ7CkBAIC03MDYsNiArOTcyLDgyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBkcF9jYXRhbG9nX2N0cmxfc2VuZF9waHlfcGF0dGVybihzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLAorCQkJdTMyIHBhdHRlcm4pCit7CisJc3RydWN0IGRwX2NhdGFsb2dfcHJpdmF0ZSAqY2F0YWxvZzsKKwl1MzIgdmFsdWUgPSAweDA7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gTlVMTDsKKworCWlmICghY3RybCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKKworCWJhc2UgPSBjYXRhbG9nLT5pby0+Y3RybF9pby5iYXNlOworCisJZHBfd3JpdGUoYmFzZSArIERQX1NUQVRFX0NUUkwsIDB4MCk7CisKKwlzd2l0Y2ggKHBhdHRlcm4pIHsKKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fRDEwXzJfTk9fU0NSQU1CTElORzoKKwkJZHBfd3JpdGUoYmFzZSArIERQX1NUQVRFX0NUUkwsIDB4MSk7CisJCWJyZWFrOworCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl9TWU1CT0xfRVJSX01FQVNVUkVNRU5UX0NOVDoKKwkJdmFsdWUgJj0gfigxIDw8IDE2KTsKKwkJZHBfd3JpdGUoYmFzZSArIERQX0hCUjJfQ09NUExJQU5DRV9TQ1JBTUJMRVJfUkVTRVQsIHZhbHVlKTsKKwkJdmFsdWUgfD0gMHhGQzsKKwkJZHBfd3JpdGUoYmFzZSArIERQX0hCUjJfQ09NUExJQU5DRV9TQ1JBTUJMRVJfUkVTRVQsIHZhbHVlKTsKKwkJZHBfd3JpdGUoYmFzZSArIERQX01BSU5MSU5LX0xFVkVMUywgMHgyKTsKKwkJZHBfd3JpdGUoYmFzZSArIERQX1NUQVRFX0NUUkwsIDB4MTApOworCQlicmVhazsKKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fUFJCUzc6CisJCWRwX3dyaXRlKGJhc2UgKyBEUF9TVEFURV9DVFJMLCAweDIwKTsKKwkJYnJlYWs7CisJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOXzgwX0JJVF9DVVNUT01fUEFUVEVSTjoKKwkJZHBfd3JpdGUoYmFzZSArIERQX1NUQVRFX0NUUkwsIDB4NDApOworCQkvKiAwMDExMTExMDAwMDAxMTExMTAwMDAwMTExMTEwMDAwMCAqLworCQlkcF93cml0ZShiYXNlICsgRFBfVEVTVF84MEJJVF9DVVNUT01fUEFUVEVSTl9SRUcwLCAweDNFMEY4M0UwKTsKKwkJLyogMDAwMDExMTExMDAwMDAxMTExMTAwMDAwMTExMTEwMDAgKi8KKwkJZHBfd3JpdGUoYmFzZSArIERQX1RFU1RfODBCSVRfQ1VTVE9NX1BBVFRFUk5fUkVHMSwgMHgwRjgzRTBGOCk7CisJCS8qIDExMTExMDAwMDAxMTExMTAgKi8KKwkJZHBfd3JpdGUoYmFzZSArIERQX1RFU1RfODBCSVRfQ1VTVE9NX1BBVFRFUk5fUkVHMiwgMHgwMDAwRjgzRSk7CisJCWJyZWFrOworCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTjoKKwkJdmFsdWUgPSBCSVQoMTYpOworCQlkcF93cml0ZShiYXNlICsgRFBfSEJSMl9DT01QTElBTkNFX1NDUkFNQkxFUl9SRVNFVCwgdmFsdWUpOworCQl2YWx1ZSB8PSAweEZDOworCQlkcF93cml0ZShiYXNlICsgRFBfSEJSMl9DT01QTElBTkNFX1NDUkFNQkxFUl9SRVNFVCwgdmFsdWUpOworCQlkcF93cml0ZShiYXNlICsgRFBfTUFJTkxJTktfTEVWRUxTLCAweDIpOworCQlkcF93cml0ZShiYXNlICsgRFBfU1RBVEVfQ1RSTCwgMHgxMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJObyB2YWxpZCB0ZXN0IHBhdHRlcm4gcmVxdWVzdGVkOiAweCV4XG4iLCBwYXR0ZXJuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgdGVzdCBwYXR0ZXJuIGlzIHByb2dyYW1tZWQgaW4gdGhlIGhhcmR3YXJlICovCisJd21iKCk7Cit9CisKK3N0YXRpYyB1MzIgZHBfY2F0YWxvZ19jdHJsX3JlYWRfcGh5X3BhdHRlcm4oc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2YXRlICpjYXRhbG9nOworCXZvaWQgX19pb21lbSAqYmFzZSA9IE5VTEw7CisKKwlpZiAoIWN0cmwpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHBfY2F0YWxvZ19nZXRfcHJpdihjdHJsKTsKKworCWJhc2UgPSBjYXRhbG9nLT5pby0+Y3RybF9pby5iYXNlOworCisJcmV0dXJuIGRwX3JlYWQoYmFzZSArIERQX01BSU5MSU5LX1JFQURZKTsKK30KKwogLyogcGFuZWwgcmVsYXRlZCBjYXRhbG9nIGZ1bmN0aW9ucyAqLwogc3RhdGljIGludCBkcF9jYXRhbG9nX3BhbmVsX3RpbWluZ19jZmcoc3RydWN0IGRwX2NhdGFsb2dfcGFuZWwgKnBhbmVsKQogewpAQCAtOTIyLDExICsxMjY0LDEzIEBACiAJCS5yZWFkX2RhdGEgICAgID0gZHBfY2F0YWxvZ19hdXhfcmVhZF9kYXRhLAogCQkud3JpdGVfZGF0YSAgICA9IGRwX2NhdGFsb2dfYXV4X3dyaXRlX2RhdGEsCiAJCS53cml0ZV90cmFucyAgID0gZHBfY2F0YWxvZ19hdXhfd3JpdGVfdHJhbnMsCisJCS5jbGVhcl90cmFucyAgID0gZHBfY2F0YWxvZ19hdXhfY2xlYXJfdHJhbnMsCiAJCS5yZXNldCAgICAgICAgID0gZHBfY2F0YWxvZ19hdXhfcmVzZXQsCiAJCS51cGRhdGVfYXV4X2NmZyA9IGRwX2NhdGFsb2dfYXV4X3VwZGF0ZV9jZmcsCiAJCS5lbmFibGUgICAgICAgID0gZHBfY2F0YWxvZ19hdXhfZW5hYmxlLAogCQkuc2V0dXAgICAgICAgICA9IGRwX2NhdGFsb2dfYXV4X3NldHVwLAogCQkuZ2V0X2lycSAgICAgICA9IGRwX2NhdGFsb2dfYXV4X2dldF9pcnEsCisJCS5jbGVhcl9od19pbnRlcnJ1cHRzID0gZHBfY2F0YWxvZ19hdXhfY2xlYXJfaHdfaW50ZXJydXB0cywKIAl9OwogCXN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgY3RybCA9IHsKIAkJLnN0YXRlX2N0cmwgICAgID0gZHBfY2F0YWxvZ19jdHJsX3N0YXRlX2N0cmwsCkBAIC05MzcsNiArMTI4MSw3IEBACiAJCS5jb25maWdfbXNhICAgICA9IGRwX2NhdGFsb2dfY3RybF9jb25maWdfbXNhLAogCQkuc2V0X3BhdHRlcm4gICAgPSBkcF9jYXRhbG9nX2N0cmxfc2V0X3BhdHRlcm4sCiAJCS5yZXNldCAgICAgICAgICA9IGRwX2NhdGFsb2dfY3RybF9yZXNldCwKKwkJLnVzYl9yZXNldCAgICAgID0gZHBfY2F0YWxvZ19jdHJsX3VzYl9yZXNldCwKIAkJLm1haW5saW5rX3JlYWR5ID0gZHBfY2F0YWxvZ19jdHJsX21haW5saW5rX3JlYWR5LAogCQkuZW5hYmxlX2lycSAgICAgPSBkcF9jYXRhbG9nX2N0cmxfZW5hYmxlX2lycSwKIAkJLmhwZF9jb25maWcgICAgID0gZHBfY2F0YWxvZ19jdHJsX2hwZF9jb25maWcsCkBAIC05NDQsOCArMTI4OSwxMSBAQAogCQkucGh5X2xhbmVfY2ZnICAgPSBkcF9jYXRhbG9nX2N0cmxfcGh5X2xhbmVfY2ZnLAogCQkudXBkYXRlX3Z4X3B4ICAgPSBkcF9jYXRhbG9nX2N0cmxfdXBkYXRlX3Z4X3B4LAogCQkuZ2V0X2ludGVycnVwdCAgPSBkcF9jYXRhbG9nX2N0cmxfZ2V0X2ludGVycnVwdCwKKwkJLmNvbmZpZ19oZHIgICAgID0gZHBfY2F0YWxvZ19jdHJsX2NvbmZpZ19oZHIsCiAJCS51cGRhdGVfdHJhbnNmZXJfdW5pdCA9IGRwX2NhdGFsb2dfY3RybF91cGRhdGVfdHJhbnNmZXJfdW5pdCwKIAkJLnJlYWRfaGRjcF9zdGF0dXMgICAgID0gZHBfY2F0YWxvZ19jdHJsX3JlYWRfaGRjcF9zdGF0dXMsCisJCS5zZW5kX3BoeV9wYXR0ZXJuICAgID0gZHBfY2F0YWxvZ19jdHJsX3NlbmRfcGh5X3BhdHRlcm4sCisJCS5yZWFkX3BoeV9wYXR0ZXJuID0gZHBfY2F0YWxvZ19jdHJsX3JlYWRfcGh5X3BhdHRlcm4sCiAJfTsKIAlzdHJ1Y3QgZHBfY2F0YWxvZ19hdWRpbyBhdWRpbyA9IHsKIAkJLmluaXQgICAgICAgPSBkcF9jYXRhbG9nX2F1ZGlvX2luaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2NhdGFsb2cuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oCmluZGV4IDQ3YzEwYmYuLmFjYTJmMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oCkBAIC0zNCw2ICszNCwzMiBAQAogI2RlZmluZSBEUF9JTlRSX0ZSQU1FX0VORAkJQklUKDYpCiAjZGVmaW5lIERQX0lOVFJfQ1JDX1VQREFURUQJCUJJVCg5KQogCisjZGVmaW5lIEhEUl9QUklNQVJJRVNfQ09VTlQgICAzCisKK3N0cnVjdCBkcF9jYXRhbG9nX2hkcl9kYXRhIHsKKwl1MzIgdnNjX2hkcl9ieXRlMDsKKwl1MzIgdnNjX2hkcl9ieXRlMTsKKwl1MzIgdnNjX2hkcl9ieXRlMjsKKwl1MzIgdnNjX2hkcl9ieXRlMzsKKwl1MzIgcGt0X3BheWxvYWQ7CisKKwl1MzIgYnBjOworCisJdTMyIHZlcnNpb247CisJdTMyIGxlbmd0aDsKKwl1MzIgZW90ZjsKKwl1MzIgZGVzY3JpcHRvcl9pZDsKKworCXUzMiBkaXNwbGF5X3ByaW1hcmllc194W0hEUl9QUklNQVJJRVNfQ09VTlRdOworCXUzMiBkaXNwbGF5X3ByaW1hcmllc195W0hEUl9QUklNQVJJRVNfQ09VTlRdOworCXUzMiB3aGl0ZV9wb2ludF94OworCXUzMiB3aGl0ZV9wb2ludF95OworCXUzMiBtYXhfbHVtaW5hbmNlOworCXUzMiBtaW5fbHVtaW5hbmNlOworCXUzMiBtYXhfY29udGVudF9saWdodF9sZXZlbDsKKwl1MzIgbWF4X2F2ZXJhZ2VfbGlnaHRfbGV2ZWw7Cit9OworCiBzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggewogCXUzMiBkYXRhOwogCXUzMiBpc3I7CkBAIC00MSw2ICs2Nyw3IEBACiAJdTMyICgqcmVhZF9kYXRhKShzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCk7CiAJaW50ICgqd3JpdGVfZGF0YSkoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgpOwogCWludCAoKndyaXRlX3RyYW5zKShzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCk7CisJaW50ICgqY2xlYXJfdHJhbnMpKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4LCBib29sIHJlYWQpOwogCXZvaWQgKCpyZXNldCkoc3RydWN0IGRwX2NhdGFsb2dfYXV4ICphdXgpOwogCXZvaWQgKCplbmFibGUpKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4LCBib29sIGVuYWJsZSk7CiAJdm9pZCAoKnVwZGF0ZV9hdXhfY2ZnKShzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCwKQEAgLTQ4LDYgKzc1LDcgQEAKIAl2b2lkICgqc2V0dXApKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4LAogCQkJc3RydWN0IGRwX2F1eF9jZmcgKmF1eF9jZmcpOwogCXZvaWQgKCpnZXRfaXJxKShzdHJ1Y3QgZHBfY2F0YWxvZ19hdXggKmF1eCwgYm9vbCBjbWRfYnVzeSk7CisJdm9pZCAoKmNsZWFyX2h3X2ludGVycnVwdHMpKHN0cnVjdCBkcF9jYXRhbG9nX2F1eCAqYXV4KTsKIH07CiAKIHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgewpAQCAtNTUsNiArODMsNyBAQAogCXUzMiB2YWxpZF9ib3VuZGFyeTsKIAl1MzIgdmFsaWRfYm91bmRhcnkyOwogCXUzMiBpc3I7CisJc3RydWN0IGRwX2NhdGFsb2dfaGRyX2RhdGEgaGRyX2RhdGE7CiAKIAl2b2lkICgqc3RhdGVfY3RybCkoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwgdTMyIHN0YXRlKTsKIAl2b2lkICgqY29uZmlnX2N0cmwpKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIHUzMiBjb25maWcpOwpAQCAtNjUsNiArOTQsNyBAQAogCQkJCXUzMiBzdHJlYW1fcmF0ZV9raHosIGJvb2wgZml4ZWRfbnZpZCk7CiAJdm9pZCAoKnNldF9wYXR0ZXJuKShzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLCB1MzIgcGF0dGVybik7CiAJdm9pZCAoKnJlc2V0KShzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsKTsKKwl2b2lkICgqdXNiX3Jlc2V0KShzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjdHJsLCBib29sIGZsaXApOwogCWJvb2wgKCptYWlubGlua19yZWFkeSkoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCk7CiAJdm9pZCAoKmVuYWJsZV9pcnEpKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsIGJvb2wgZW5hYmxlKTsKIAl2b2lkICgqaHBkX2NvbmZpZykoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwgYm9vbCBlbmFibGUpOwpAQCAtNzQsOCArMTA0LDEyIEBACiAJdm9pZCAoKnVwZGF0ZV92eF9weCkoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCwgdTggdl9sZXZlbCwKIAkJCQl1OCBwX2xldmVsKTsKIAl2b2lkICgqZ2V0X2ludGVycnVwdCkoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCk7CisJdm9pZCAoKmNvbmZpZ19oZHIpKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwpOwogCXZvaWQgKCp1cGRhdGVfdHJhbnNmZXJfdW5pdCkoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCk7CiAJdTMyICgqcmVhZF9oZGNwX3N0YXR1cykoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCk7CisJdm9pZCAoKnNlbmRfcGh5X3BhdHRlcm4pKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwgKmN0cmwsCisJCQl1MzIgcGF0dGVybik7CisJdTMyICgqcmVhZF9waHlfcGF0dGVybikoc3RydWN0IGRwX2NhdGFsb2dfY3RybCAqY3RybCk7CiB9OwogCiBlbnVtIGRwX2NhdGFsb2dfYXVkaW9fc2RwX3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jdHJsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwuYwppbmRleCA1MWFiY2Y1Li4xM2NhNmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwuYwpAQCAtMzYsNiArMzYsMTEgQEAKICNkZWZpbmUgU1RfU0VORF9WSURFTwkJCUJJVCg3KQogI2RlZmluZSBTVF9QVVNIX0lETEUJCQlCSVQoOCkKIAorI2RlZmluZSBNUl9MSU5LX1RSQUlOSU5HMSAgMHg4CisjZGVmaW5lIE1SX0xJTktfU1lNQk9MX0VSTSAweDgwCisjZGVmaW5lIE1SX0xJTktfUFJCUzcgMHgxMDAKKyNkZWZpbmUgTVJfTElOS19DVVNUT004MCAweDIwMAorCiBzdHJ1Y3QgZHBfdmNfdHVfbWFwcGluZ190YWJsZSB7CiAJdTMyIHZpYzsKIAl1OCBsYW5lczsKQEAgLTYzLDkgKzY4LDcgQEAKIAogCXN0cnVjdCBjb21wbGV0aW9uIGlkbGVfY29tcDsKIAlzdHJ1Y3QgY29tcGxldGlvbiB2aWRlb19jb21wOwotCXN0cnVjdCBjb21wbGV0aW9uIGlycV9jb21wOwogCi0JYm9vbCBwc21fZW5hYmxlZDsKIAlib29sIG9yaWVudGF0aW9uOwogCWF0b21pY190IGFib3J0ZWQ7CiAKQEAgLTE1NSw3ICsxNTgsNyBAQAogCWNvbmZpZyB8PSB0YmQgPDwgODsKIAogCS8qIE51bSBvZiBMYW5lcyAqLwotCWNvbmZpZyB8PSAoKGN0cmwtPmxpbmstPmxhbmVfY291bnQgLSAxKSA8PCA0KTsKKwljb25maWcgfD0gKChjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5sYW5lX2NvdW50IC0gMSkgPDwgNCk7CiAKIAlpZiAoZHJtX2RwX2VuaGFuY2VkX2ZyYW1lX2NhcChkcGNkKSkKIAkJY29uZmlnIHw9IDB4NDA7CkBAIC0zMDMsNyArMzA2LDcgQEAKIAl1NjQgYnJ1dGVfZm9yY2VfdGhyZXNob2xkID0gMTA7CiAJdTY0IGRpZmZfYWJzOwogCi0JbG5fY250ID0gIGN0cmwtPmxpbmstPmxhbmVfY291bnQ7CisJbG5fY250ID0gIGN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQ7CiAKIAlicHAgPSBwaW5mby0+YnBwOwogCWx3aWR0aCA9IHBpbmZvLT5oX2FjdGl2ZTsKQEAgLTMyMiw3ICszMjUsOCBAQAogCWV2ZW5fZGlzdHJpYnV0aW9uID0gMDsKIAltaW5faGJsYW5rID0gMDsKIAotCWxjbGsgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoY3RybC0+bGluay0+YndfY29kZSkgKiBEUF9LSFpfVE9fSFo7CisJbGNsayA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZSgKKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSkgKiBEUF9LSFpfVE9fSFo7CiAKIAlwcl9kZWJ1ZygicGNsaz0lbGxkLCBhY3RpdmVfd2lkdGg9JWQsIGhfYmxhbms9JWRcbiIsCiAJCQkJCQlwY2xrLCBsd2lkdGgsIGhfYmxhbmspOwpAQCAtNzYxLDkgKzc2NSwxMCBAQAogCXN0cnVjdCBkcF9saW5rICpsaW5rID0gY3RybC0+bGluazsKIAogCWN0cmwtPmNhdGFsb2ctPnVwZGF0ZV92eF9weChjdHJsLT5jYXRhbG9nLAotCQkJbGluay0+dl9sZXZlbCwgbGluay0+cF9sZXZlbCk7CisJCWxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCwgbGluay0+cGh5X3BhcmFtcy5wX2xldmVsKTsKIAotCWRwX2N0cmxfdXBkYXRlX3NpbmtfdnhfcHgoY3RybCwgbGluay0+dl9sZXZlbCwgbGluay0+cF9sZXZlbCk7CisJZHBfY3RybF91cGRhdGVfc2lua192eF9weChjdHJsLCBsaW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwsCisJCWxpbmstPnBoeV9wYXJhbXMucF9sZXZlbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRwX2N0cmxfdHJhaW5fcGF0dGVybl9zZXQoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCwKQEAgLTgxNiw3ICs4MjEsNyBAQAogCWRwX2N0cmxfdXBkYXRlX3Z4X3B4KGN0cmwpOwogCiAJdHJpZXMgPSAwOwotCW9sZF92X2xldmVsID0gY3RybC0+bGluay0+dl9sZXZlbDsKKwlvbGRfdl9sZXZlbCA9IGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbDsKIAl3aGlsZSAoMSkgewogCQlkcm1fZHBfbGlua190cmFpbl9jbG9ja19yZWNvdmVyeV9kZWxheShjdHJsLT5wYW5lbC0+ZHBjZCk7CiAKQEAgLTgyNSwyNiArODMwLDI2IEBACiAJCQlicmVhazsKIAogCQlpZiAoZHJtX2RwX2Nsb2NrX3JlY292ZXJ5X29rKGxpbmtfc3RhdHVzLAotCQkJY3RybC0+bGluay0+bGFuZV9jb3VudCkpIHsKKwkJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQpKSB7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChjdHJsLT5saW5rLT52X2xldmVsID09IERQX0xJTktfVk9MVEFHRV9NQVgpIHsKKwkJaWYgKGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCA9PSBEUF9MSU5LX1ZPTFRBR0VfTUFYKSB7CiAJCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIm1heCB2X2xldmVsIHJlYWNoZWRcbiIpOwogCQkJcmV0ID0gLUVBR0FJTjsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKG9sZF92X2xldmVsID09IGN0cmwtPmxpbmstPnZfbGV2ZWwpIHsKKwkJaWYgKG9sZF92X2xldmVsID09IGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCkgewogCQkJdHJpZXMrKzsKIAkJCWlmICh0cmllcyA+PSBtYXhpbXVtX3JldHJpZXMpIHsKIAkJCQlwcl9lcnIoIm1heCB0cmllcyByZWFjaGVkXG4iKTsKLQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCXJldCA9IC1FVElNRURPVVQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQl0cmllcyA9IDA7Ci0JCQlvbGRfdl9sZXZlbCA9IGN0cmwtPmxpbmstPnZfbGV2ZWw7CisJCQlvbGRfdl9sZXZlbCA9IGN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbDsKIAkJfQogCiAJCXByX2RlYnVnKCJjbG9jayByZWNvdmVyeSBub3QgZG9uZSwgYWRqdXN0aW5nIHZ4IHB4XG4iKTsKQEAgLTg1OSw0MSArODY0LDI1IEBACiBzdGF0aWMgaW50IGRwX2N0cmxfbGlua19yYXRlX2Rvd25fc2hpZnQoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCkKIHsKIAlpbnQgcmV0ID0gMDsKLQl1MzIgbWluX3JlcV9saW5rX3JhdGVfa2h6OwotCXUzMiBuZXdfcHJvcG9zZWRfbGlua19id19jb2RlOwotCXUzMiBuZXdfcHJvcG9zZWRfbGlua19yYXRlX2toejsKIAogCWlmICghY3RybCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltaW5fcmVxX2xpbmtfcmF0ZV9raHogPSBjdHJsLT5wYW5lbC0+Z2V0X21pbl9yZXFfbGlua19yYXRlKGN0cmwtPnBhbmVsKTsKLQotCXN3aXRjaCAoY3RybC0+bGluay0+YndfY29kZSkgewotCWNhc2UgRFBfTElOS19SQVRFXzgxMDoKLQkJbmV3X3Byb3Bvc2VkX2xpbmtfYndfY29kZSA9IERQX0xJTktfQldfNV80OworCXN3aXRjaCAoY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSkgeworCWNhc2UgRFBfTElOS19CV184XzE6CisJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmJ3X2NvZGUgPSBEUF9MSU5LX0JXXzVfNDsKIAkJYnJlYWs7CiAJY2FzZSBEUF9MSU5LX0JXXzVfNDoKLQkJbmV3X3Byb3Bvc2VkX2xpbmtfYndfY29kZSA9IERQX0xJTktfQldfMl83OworCQljdHJsLT5saW5rLT5saW5rX3BhcmFtcy5id19jb2RlID0gRFBfTElOS19CV18yXzc7CiAJCWJyZWFrOwogCWNhc2UgRFBfTElOS19CV18yXzc6CiAJY2FzZSBEUF9MSU5LX0JXXzFfNjI6CiAJZGVmYXVsdDoKLQkJbmV3X3Byb3Bvc2VkX2xpbmtfYndfY29kZSA9IERQX0xJTktfQldfMV82MjsKKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSA9IERQX0xJTktfQldfMV82MjsKIAkJYnJlYWs7CiAJfTsKIAotCW5ld19wcm9wb3NlZF9saW5rX3JhdGVfa2h6ID0gZHJtX2RwX2J3X2NvZGVfdG9fbGlua19yYXRlKAotCQkJCQkJbmV3X3Byb3Bvc2VkX2xpbmtfYndfY29kZSk7Ci0KLQlwcl9kZWJ1ZygibmV3IHByb3Bvc2VkIGxpbmsgcmF0ZT0lZCBraHpcbiIsIG5ld19wcm9wb3NlZF9saW5rX3JhdGVfa2h6KTsKLQlwcl9kZWJ1ZygibWluIHJlcXVpcmVkIGxpbmsgcmF0ZT0lZCBraHpcbiIsIG1pbl9yZXFfbGlua19yYXRlX2toeik7Ci0KLQlpZiAobmV3X3Byb3Bvc2VkX2xpbmtfcmF0ZV9raHogPj0gbWluX3JlcV9saW5rX3JhdGVfa2h6KQotCQljdHJsLT5saW5rLT5id19jb2RlID0gbmV3X3Byb3Bvc2VkX2xpbmtfYndfY29kZTsKLQllbHNlCi0JCXByX2RlYnVnKCJjYW4ndCBnbyBiZWxvdyBtaW4gcmVxdWlyZWQgbGluayByYXRlXG4iKTsKLQotCXByX2RlYnVnKCJuZXcgYncgY29kZT0weCV4XG4iLCBjdHJsLT5saW5rLT5id19jb2RlKTsKKwlwcl9kZWJ1ZygibmV3IGJ3IGNvZGU9MHgleFxuIiwgY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTMxLDExICs5MjAsMTIgQEAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCi0JCWlmIChkcm1fZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0YXR1cywgY3RybC0+bGluay0+bGFuZV9jb3VudCkpCisJCWlmIChkcm1fZHBfY2hhbm5lbF9lcV9vayhsaW5rX3N0YXR1cywKKwkJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQpKQogCQkJYnJlYWs7CiAKIAkJaWYgKHRyaWVzID4gbWF4aW11bV9yZXRyaWVzKSB7Ci0JCQlyZXQgPSAtRUFHQUlOOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKIAkJCWJyZWFrOwogCQl9CiAJCXRyaWVzKys7CkBAIC05NTMsMTMgKzk0MywxNCBAQAogCXU4IGVuY29kaW5nID0gMHgxOwogCXN0cnVjdCBkcm1fZHBfbGluayBsaW5rX2luZm8gPSB7MH07CiAKLQljdHJsLT5saW5rLT5wX2xldmVsID0gMDsKLQljdHJsLT5saW5rLT52X2xldmVsID0gMDsKKwljdHJsLT5saW5rLT5waHlfcGFyYW1zLnBfbGV2ZWwgPSAwOworCWN0cmwtPmxpbmstPnBoeV9wYXJhbXMudl9sZXZlbCA9IDA7CiAKIAlkcF9jdHJsX2NvbmZpZ19jdHJsKGN0cmwpOwogCi0JbGlua19pbmZvLm51bV9sYW5lcyA9IGN0cmwtPmxpbmstPmxhbmVfY291bnQ7Ci0JbGlua19pbmZvLnJhdGUgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoY3RybC0+bGluay0+YndfY29kZSk7CisJbGlua19pbmZvLm51bV9sYW5lcyA9IGN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQ7CisJbGlua19pbmZvLnJhdGUgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoCisJCWN0cmwtPmxpbmstPmxpbmtfcGFyYW1zLmJ3X2NvZGUpOwogCWxpbmtfaW5mby5jYXBhYmlsaXRpZXMgPSBjdHJsLT5wYW5lbC0+bGlua19pbmZvLmNhcGFiaWxpdGllczsKIAogCWRybV9kcF9saW5rX2NvbmZpZ3VyZShjdHJsLT5hdXgtPmRybV9hdXgsICZsaW5rX2luZm8pOwpAQCAtMTAwMCw5ICs5OTEsMTIgQEAKIAogCWN0cmwtPmNhdGFsb2ctPm1haW5saW5rX2N0cmwoY3RybC0+Y2F0YWxvZywgdHJ1ZSk7CiAKLQlkcm1fZHBfbGlua19wb3dlcl91cChjdHJsLT5hdXgtPmRybV9hdXgsICZjdHJsLT5wYW5lbC0+bGlua19pbmZvKTsKKwlyZXQgPSBjdHJsLT5saW5rLT5wc21fY29uZmlnKGN0cmwtPmxpbmssCisJCSZjdHJsLT5wYW5lbC0+bGlua19pbmZvLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBlbmQ7CiAKLQlpZiAoY3RybC0+bGluay0+cGh5X3BhdHRlcm5fcmVxdWVzdGVkKGN0cmwtPmxpbmspKQorCWlmIChjdHJsLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVSTikKIAkJZ290byBlbmQ7CiAKIAlpZiAoIXRyYWluKQpAQCAtMTA2MCw3ICsxMDU0LDcgQEAKIAljdHJsLT5wb3dlci0+c2V0X3BpeGVsX2Nsa19wYXJlbnQoY3RybC0+cG93ZXIpOwogCiAJZHBfY3RybF9zZXRfY2xvY2tfcmF0ZShjdHJsLCAiY3RybF9saW5rX2NsayIsCi0JCWRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShjdHJsLT5saW5rLT5id19jb2RlKSk7CisJCWRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5id19jb2RlKSk7CiAKIAlkcF9jdHJsX3NldF9jbG9ja19yYXRlKGN0cmwsICJjdHJsX3BpeGVsX2NsayIsIGN0cmwtPnBpeGVsX3JhdGUpOwogCkBAIC0xMDkzLDcgKzEwODcsNyBAQAogCWN0cmwtPm9yaWVudGF0aW9uID0gZmxpcDsKIAljYXRhbG9nID0gY3RybC0+Y2F0YWxvZzsKIAotCWNhdGFsb2ctPnJlc2V0KGN0cmwtPmNhdGFsb2cpOworCWNhdGFsb2ctPnVzYl9yZXNldChjdHJsLT5jYXRhbG9nLCBmbGlwKTsKIAljYXRhbG9nLT5waHlfcmVzZXQoY3RybC0+Y2F0YWxvZyk7CiAJY2F0YWxvZy0+ZW5hYmxlX2lycShjdHJsLT5jYXRhbG9nLCB0cnVlKTsKIApAQCAtMTExOSwxMiArMTExMyw2IEBACiAJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKIAogCWN0cmwtPmNhdGFsb2ctPmVuYWJsZV9pcnEoY3RybC0+Y2F0YWxvZywgZmFsc2UpOwotCWN0cmwtPmNhdGFsb2ctPnJlc2V0KGN0cmwtPmNhdGFsb2cpOwotCi0JLyogTWFrZSBzdXJlIERQIGlzIGRpc2FibGVkIGJlZm9yZSBjbGsgZGlzYWJsZSAqLwotCXdtYigpOwotCi0JZHBfY3RybF9kaXNhYmxlX21haW5saW5rX2Nsb2NrcyhjdHJsKTsKIAogCXByX2RlYnVnKCJIb3N0IGRlaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIH0KQEAgLTExNDcsOTUgKzExMzUsMjIzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW50IGRwX2N0cmxfb25faXJxKHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwsIGJvb2wgbHRfbmVlZGVkKQorc3RhdGljIGludCBkcF9jdHJsX2xpbmtfbWFpbnRlbmFuY2Uoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCkKIHsKIAlpbnQgcmV0ID0gMDsKIAorCWN0cmwtPmRwX2N0cmwucHVzaF9pZGxlKCZjdHJsLT5kcF9jdHJsKTsKKwljdHJsLT5kcF9jdHJsLnJlc2V0KCZjdHJsLT5kcF9jdHJsKTsKKworCWN0cmwtPnBpeGVsX3JhdGUgPSBjdHJsLT5wYW5lbC0+cGluZm8ucGl4ZWxfY2xrX2toejsKKwogCWRvIHsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJCS8qIHRyeSB3aXRoIGxvd2VyIGxpbmsgcmF0ZSAqLworCQkJZHBfY3RybF9saW5rX3JhdGVfZG93bl9zaGlmdChjdHJsKTsKKwogCQkJY3RybC0+Y2F0YWxvZy0+bWFpbmxpbmtfY3RybChjdHJsLT5jYXRhbG9nLCBmYWxzZSk7CisJCX0KIAogCQljdHJsLT5jYXRhbG9nLT5waHlfbGFuZV9jZmcoY3RybC0+Y2F0YWxvZywKLQkJCWN0cmwtPm9yaWVudGF0aW9uLCBjdHJsLT5saW5rLT5sYW5lX2NvdW50KTsKKwkJCWN0cmwtPm9yaWVudGF0aW9uLCBjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5sYW5lX2NvdW50KTsKIAotCQlpZiAobHRfbmVlZGVkKSB7Ci0JCQkvKgotCQkJICogRGlhc2FibGUgYW5kIHJlLWVuYWJsZSB0aGUgbWFpbmxpbmsgY2xvY2sgc2luY2UgdGhlCi0JCQkgKiBsaW5rIGNsb2NrIG1pZ2h0IGhhdmUgYmVlbiBhZGp1c3RlZCBhcyBwYXJ0IG9mIHRoZQotCQkJICogbGluayBtYWludGVuYW5jZS4KLQkJCSAqLwotCQkJaWYgKCFjdHJsLT5saW5rLT5waHlfcGF0dGVybl9yZXF1ZXN0ZWQoCi0JCQkJCWN0cmwtPmxpbmspKQotCQkJCWRwX2N0cmxfZGlzYWJsZV9tYWlubGlua19jbG9ja3MoY3RybCk7CisJCS8qCisJCSAqIERpc2FibGUgYW5kIHJlLWVuYWJsZSB0aGUgbWFpbmxpbmsgY2xvY2sgc2luY2UgdGhlCisJCSAqIGxpbmsgY2xvY2sgbWlnaHQgaGF2ZSBiZWVuIGFkanVzdGVkIGFzIHBhcnQgb2YgdGhlCisJCSAqIGxpbmsgbWFpbnRlbmFuY2UuCisJCSAqLworCQlkcF9jdHJsX2Rpc2FibGVfbWFpbmxpbmtfY2xvY2tzKGN0cmwpOwogCi0JCQlyZXQgPSBkcF9jdHJsX2VuYWJsZV9tYWlubGlua19jbG9ja3MoY3RybCk7Ci0JCQlpZiAocmV0KQotCQkJCWNvbnRpbnVlOwotCQl9CisJCXJldCA9IGRwX2N0cmxfZW5hYmxlX21haW5saW5rX2Nsb2NrcyhjdHJsKTsKKwkJaWYgKHJldCkKKwkJCWNvbnRpbnVlOwogCiAJCWRwX2N0cmxfY29uZmlndXJlX3NvdXJjZV9wYXJhbXMoY3RybCk7CiAKIAkJY3RybC0+Y2F0YWxvZy0+Y29uZmlnX21zYShjdHJsLT5jYXRhbG9nLAotCQkJZHJtX2RwX2J3X2NvZGVfdG9fbGlua19yYXRlKGN0cmwtPmxpbmstPmJ3X2NvZGUpLAorCQkJZHJtX2RwX2J3X2NvZGVfdG9fbGlua19yYXRlKAorCQkJY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSksCiAJCQljdHJsLT5waXhlbF9yYXRlLCBkcF9jdHJsX3VzZV9maXhlZF9udmlkKGN0cmwpKTsKIAogCQlyZWluaXRfY29tcGxldGlvbigmY3RybC0+aWRsZV9jb21wKTsKIAotCQlpZiAoY3RybC0+cHNtX2VuYWJsZWQpIHsKLQkJCXJldCA9IGN0cmwtPmxpbmstPnNlbmRfcHNtX3JlcXVlc3QoY3RybC0+bGluaywgZmFsc2UpOwotCQkJaWYgKHJldCkgewotCQkJCXByX2VycigiZmFpbGVkIHRvIGV4aXQgbG93IHBvd2VyIG1vZGUsIHJjPSVkXG4iLAotCQkJCQlyZXQpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0ID0gZHBfY3RybF9zZXR1cF9tYWluX2xpbmsoY3RybCwgbHRfbmVlZGVkKTsKKwkJcmV0ID0gZHBfY3RybF9zZXR1cF9tYWluX2xpbmsoY3RybCwgdHJ1ZSk7CiAJfSB3aGlsZSAocmV0ID09IC1FQUdBSU4pOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkcF9jdHJsX29uX2hwZChzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQorc3RhdGljIHZvaWQgZHBfY3RybF9wcm9jZXNzX3BoeV90ZXN0X3JlcXVlc3Qoc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybCkKIHsKIAlpbnQgcmV0ID0gMDsKLQl1MzIgcmF0ZSA9IGN0cmwtPnBhbmVsLT5saW5rX2luZm8ucmF0ZTsKKworCWlmICghY3RybC0+bGluay0+cGh5X3BhcmFtcy5waHlfdGVzdF9wYXR0ZXJuX3NlbCkgeworCQlwcl9kZWJ1Zygibm8gdGVzdCBwYXR0ZXJuIHNlbGVjdGVkIGJ5IHNpbmtcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJfZGVidWcoInN0YXJ0XG4iKTsKKworCWN0cmwtPmRwX2N0cmwucHVzaF9pZGxlKCZjdHJsLT5kcF9jdHJsKTsKKwkvKgorCSAqIFRoZSBnbG9iYWwgcmVzZXQgd2lsbCBuZWVkIERQIGxpbmsgcmFsYXRlZCBjbG9ja3MgdG8gYmUKKwkgKiBydW5uaW5nLiBBZGQgdGhlIGdsb2JhbCByZXNldCBqdXN0IGJlZm9yZSBkaXNhYmxpbmcgdGhlCisJICogbGluayBjbG9ja3MgYW5kIGNvcmUgY2xvY2tzLgorCSAqLworCWN0cmwtPmRwX2N0cmwucmVzZXQoJmN0cmwtPmRwX2N0cmwpOworCWN0cmwtPmRwX2N0cmwub2ZmKCZjdHJsLT5kcF9jdHJsKTsKKworCXJldCA9IGN0cmwtPmRwX2N0cmwub24oJmN0cmwtPmRwX2N0cmwpOworCWlmIChyZXQpCisJCXByX2VycigiZmFpbGVkIHRvIGVuYWJsZSBEUCBjb250cm9sbGVyXG4iKTsKKworCXByX2RlYnVnKCJlbmRcbiIpOworfQorCitzdGF0aWMgdm9pZCBkcF9jdHJsX3NlbmRfcGh5X3Rlc3RfcGF0dGVybihzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsKQoreworCWJvb2wgc3VjY2VzcyA9IGZhbHNlOworCXUzMiBwYXR0ZXJuX3NlbnQgPSAweDA7CisJdTMyIHBhdHRlcm5fcmVxdWVzdGVkID0gY3RybC0+bGluay0+cGh5X3BhcmFtcy5waHlfdGVzdF9wYXR0ZXJuX3NlbDsKKworCXByX2RlYnVnKCJyZXF1ZXN0OiAlc1xuIiwKKwkJCWRwX2xpbmtfZ2V0X3BoeV90ZXN0X3BhdHRlcm4ocGF0dGVybl9yZXF1ZXN0ZWQpKTsKKworCWN0cmwtPmNhdGFsb2ctPnVwZGF0ZV92eF9weChjdHJsLT5jYXRhbG9nLAorCQkJY3RybC0+bGluay0+cGh5X3BhcmFtcy52X2xldmVsLAorCQkJY3RybC0+bGluay0+cGh5X3BhcmFtcy5wX2xldmVsKTsKKwljdHJsLT5jYXRhbG9nLT5zZW5kX3BoeV9wYXR0ZXJuKGN0cmwtPmNhdGFsb2csIHBhdHRlcm5fcmVxdWVzdGVkKTsKKwljdHJsLT5saW5rLT5zZW5kX3Rlc3RfcmVzcG9uc2UoY3RybC0+bGluayk7CisKKwlwYXR0ZXJuX3NlbnQgPSBjdHJsLT5jYXRhbG9nLT5yZWFkX3BoeV9wYXR0ZXJuKGN0cmwtPmNhdGFsb2cpOworCisJc3dpdGNoIChwYXR0ZXJuX3NlbnQpIHsKKwljYXNlIE1SX0xJTktfVFJBSU5JTkcxOgorCQlpZiAocGF0dGVybl9yZXF1ZXN0ZWQgPT0KKwkJCQlEUF9URVNUX1BIWV9QQVRURVJOX0QxMF8yX05PX1NDUkFNQkxJTkcpCisJCQlzdWNjZXNzID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBNUl9MSU5LX1NZTUJPTF9FUk06CisJCWlmICgocGF0dGVybl9yZXF1ZXN0ZWQgPT0KKwkJCQlEUF9URVNUX1BIWV9QQVRURVJOX1NZTUJPTF9FUlJfTUVBU1VSRU1FTlRfQ05UKQorCQkJfHwgKHBhdHRlcm5fcmVxdWVzdGVkID09CisJCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTikpCisJCQlzdWNjZXNzID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBNUl9MSU5LX1BSQlM3OgorCQlpZiAocGF0dGVybl9yZXF1ZXN0ZWQgPT0gRFBfVEVTVF9QSFlfUEFUVEVSTl9QUkJTNykKKwkJCXN1Y2Nlc3MgPSB0cnVlOworCQlicmVhazsKKwljYXNlIE1SX0xJTktfQ1VTVE9NODA6CisJCWlmIChwYXR0ZXJuX3JlcXVlc3RlZCA9PQorCQkJCURQX1RFU1RfUEhZX1BBVFRFUk5fODBfQklUX0NVU1RPTV9QQVRURVJOKQorCQkJc3VjY2VzcyA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN1Y2Nlc3MgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCXByX2RlYnVnKCIlczogJXNcbiIsIHN1Y2Nlc3MgPyAic3VjY2VzcyIgOiAiZmFpbGVkIiwKKwkJCWRwX2xpbmtfZ2V0X3BoeV90ZXN0X3BhdHRlcm4ocGF0dGVybl9yZXF1ZXN0ZWQpKTsKK30KKworc3RhdGljIHZvaWQgZHBfY3RybF9oYW5kbGVfc2lua19yZXF1ZXN0KHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKQoreworCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7CisJdTMyIHNpbmtfcmVxdWVzdCA9IDB4MDsKKworCWlmICghZHBfY3RybCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKKwlzaW5rX3JlcXVlc3QgPSBjdHJsLT5saW5rLT5zaW5rX3JlcXVlc3Q7CisKKwlpZiAoc2lua19yZXF1ZXN0ICYgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4pIHsKKwkJcHJfaW5mbygiUEhZX1RFU1RfUEFUVEVSTiByZXF1ZXN0XG4iKTsKKwkJZHBfY3RybF9wcm9jZXNzX3BoeV90ZXN0X3JlcXVlc3QoY3RybCk7CisJfQorCisJaWYgKHNpbmtfcmVxdWVzdCAmIERQX0xJTktfU1RBVFVTX1VQREFURUQpCisJCWRwX2N0cmxfbGlua19tYWludGVuYW5jZShjdHJsKTsKKworCWlmIChzaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfVFJBSU5JTkcpIHsKKwkJY3RybC0+bGluay0+c2VuZF90ZXN0X3Jlc3BvbnNlKGN0cmwtPmxpbmspOworCQlkcF9jdHJsX2xpbmtfbWFpbnRlbmFuY2UoY3RybCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcF9jdHJsX3Jlc2V0KHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKQoreworCXN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmw7CisKKwlpZiAoIWRwX2N0cmwpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIHBhcmFtc1xuIik7CisJCXJldHVybjsKKwl9CisKKwljdHJsID0gY29udGFpbmVyX29mKGRwX2N0cmwsIHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUsIGRwX2N0cmwpOworCWN0cmwtPmNhdGFsb2ctPnJlc2V0KGN0cmwtPmNhdGFsb2cpOworfQorCitzdGF0aWMgaW50IGRwX2N0cmxfb24oc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsOworCXUzMiByYXRlID0gMDsKIAl1MzIgbGlua190cmFpbl9tYXhfcmV0cmllcyA9IDEwMDsKKwl1MzIgY29uc3QgcGh5X2N0c19waXhlbF9jbGtfa2h6ID0gMTQ4NTAwOworCisJaWYgKCFkcF9jdHJsKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKIAogCWF0b21pY19zZXQoJmN0cmwtPmFib3J0ZWQsIDApOworCXJhdGUgPSBjdHJsLT5wYW5lbC0+bGlua19pbmZvLnJhdGU7CiAKIAljdHJsLT5wb3dlci0+Y2xrX2VuYWJsZShjdHJsLT5wb3dlciwgRFBfQ09SRV9QTSwgdHJ1ZSk7CiAJY3RybC0+Y2F0YWxvZy0+aHBkX2NvbmZpZyhjdHJsLT5jYXRhbG9nLCB0cnVlKTsKIAotCWN0cmwtPmxpbmstPmJ3X2NvZGUgID0gZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKHJhdGUpOwotCWN0cmwtPmxpbmstPmxhbmVfY291bnQgPSBjdHJsLT5wYW5lbC0+bGlua19pbmZvLm51bV9sYW5lczsKLQljdHJsLT5waXhlbF9yYXRlID0gY3RybC0+cGFuZWwtPnBpbmZvLnBpeGVsX2Nsa19raHo7CisJaWYgKGN0cmwtPmxpbmstPnNpbmtfcmVxdWVzdCAmIERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOKSB7CisJCXByX2RlYnVnKCJ1c2luZyBwaHkgdGVzdCBsaW5rIHBhcmFtZXRlcnNcbiIpOworCQlpZiAoIWN0cmwtPnBhbmVsLT5waW5mby5waXhlbF9jbGtfa2h6KQorCQkJY3RybC0+cGl4ZWxfcmF0ZSA9IHBoeV9jdHNfcGl4ZWxfY2xrX2toejsKKwl9IGVsc2UgeworCQljdHJsLT5saW5rLT5saW5rX3BhcmFtcy5id19jb2RlID0KKwkJCWRybV9kcF9saW5rX3JhdGVfdG9fYndfY29kZShyYXRlKTsKKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMubGFuZV9jb3VudCA9CisJCQljdHJsLT5wYW5lbC0+bGlua19pbmZvLm51bV9sYW5lczsKKwkJY3RybC0+cGl4ZWxfcmF0ZSA9IGN0cmwtPnBhbmVsLT5waW5mby5waXhlbF9jbGtfa2h6OworCX0KIAogCXByX2RlYnVnKCJid19jb2RlPSVkLCBsYW5lX2NvdW50PSVkLCBwaXhlbF9yYXRlPSVkXG4iLAotCQljdHJsLT5saW5rLT5id19jb2RlLCBjdHJsLT5saW5rLT5sYW5lX2NvdW50LAotCQljdHJsLT5waXhlbF9yYXRlKTsKKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSwKKwkJY3RybC0+bGluay0+bGlua19wYXJhbXMubGFuZV9jb3VudCwgY3RybC0+cGl4ZWxfcmF0ZSk7CiAKIAljdHJsLT5jYXRhbG9nLT5waHlfbGFuZV9jZmcoY3RybC0+Y2F0YWxvZywKLQkJCWN0cmwtPm9yaWVudGF0aW9uLCBjdHJsLT5saW5rLT5sYW5lX2NvdW50KTsKKwkJCWN0cmwtPm9yaWVudGF0aW9uLCBjdHJsLT5saW5rLT5saW5rX3BhcmFtcy5sYW5lX2NvdW50KTsKIAotCXJldCA9IGRwX2N0cmxfZW5hYmxlX21haW5saW5rX2Nsb2NrcyhjdHJsKTsKLQlpZiAocmV0KQotCQlnb3RvIGV4aXQ7CisJcmMgPSBkcF9jdHJsX2VuYWJsZV9tYWlubGlua19jbG9ja3MoY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGVuZDsKIAogCXJlaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5pZGxlX2NvbXApOwogCiAJZHBfY3RybF9jb25maWd1cmVfc291cmNlX3BhcmFtcyhjdHJsKTsKIAotCWlmIChjdHJsLT5wc21fZW5hYmxlZCkKLQkJcmV0ID0gY3RybC0+bGluay0+c2VuZF9wc21fcmVxdWVzdChjdHJsLT5saW5rLCBmYWxzZSk7Ci0KIAl3aGlsZSAoLS1saW5rX3RyYWluX21heF9yZXRyaWVzICYmICFhdG9taWNfcmVhZCgmY3RybC0+YWJvcnRlZCkpIHsKIAkJY3RybC0+Y2F0YWxvZy0+Y29uZmlnX21zYShjdHJsLT5jYXRhbG9nLAotCQkJZHJtX2RwX2J3X2NvZGVfdG9fbGlua19yYXRlKGN0cmwtPmxpbmstPmJ3X2NvZGUpLAorCQkJZHJtX2RwX2J3X2NvZGVfdG9fbGlua19yYXRlKAorCQkJY3RybC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSksCiAJCQljdHJsLT5waXhlbF9yYXRlLCBkcF9jdHJsX3VzZV9maXhlZF9udmlkKGN0cmwpKTsKIAotCQlyZXQgPSBkcF9jdHJsX3NldHVwX21haW5fbGluayhjdHJsLCB0cnVlKTsKLQkJaWYgKCFyZXQpCisJCXJjID0gZHBfY3RybF9zZXR1cF9tYWluX2xpbmsoY3RybCwgdHJ1ZSk7CisJCWlmICghcmMpCiAJCQlicmVhazsKIAogCQkvKiB0cnkgd2l0aCBsb3dlciBsaW5rIHJhdGUgKi8KQEAgLTEyNTAsNTAgKzEzNjYsMTYgQEAKIAkJZHBfY3RybF9lbmFibGVfbWFpbmxpbmtfY2xvY2tzKGN0cmwpOwogCX0KIAorCWlmIChjdHJsLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVSTikKKwkJZHBfY3RybF9zZW5kX3BoeV90ZXN0X3BhdHRlcm4oY3RybCk7CisKIAlwcl9kZWJ1ZygiRW5kLVxuIik7CiAKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZHBfY3RybF9vZmZfaXJxKHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwpCi17Ci0JY3RybC0+Y2F0YWxvZy0+bWFpbmxpbmtfY3RybChjdHJsLT5jYXRhbG9nLCBmYWxzZSk7Ci0KLQkvKiBNYWtlIHN1cmUgRFAgbWFpbmxpbmsgYW5kIGF1ZGlvIGVuZ2luZXMgYXJlIGRpc2FibGVkICovCi0Jd21iKCk7Ci0KLQljb21wbGV0ZV9hbGwoJmN0cmwtPmlycV9jb21wKTsKLQlwcl9kZWJ1ZygiZW5kXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgZHBfY3RybF9vZmZfaHBkKHN0cnVjdCBkcF9jdHJsX3ByaXZhdGUgKmN0cmwpCi17Ci0JY3RybC0+Y2F0YWxvZy0+bWFpbmxpbmtfY3RybChjdHJsLT5jYXRhbG9nLCBmYWxzZSk7Ci0JcHJfZGVidWcoIkRQIG9mZiBkb25lXG4iKTsKLX0KLQotc3RhdGljIGludCBkcF9jdHJsX29uKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsLCBib29sIGhwZF9pcnEpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpjdHJsOwotCi0JaWYgKCFkcF9jdHJsKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKLQotCWlmIChocGRfaXJxKQotCQlyYyA9IGRwX2N0cmxfb25faXJxKGN0cmwsIGZhbHNlKTsKLQllbHNlCi0JCXJjID0gZHBfY3RybF9vbl9ocGQoY3RybCk7CiBlbmQ6CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBkcF9jdHJsX29mZihzdHJ1Y3QgZHBfY3RybCAqZHBfY3RybCwgYm9vbCBocGRfaXJxKQorc3RhdGljIHZvaWQgZHBfY3RybF9vZmYoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpCiB7CiAJc3RydWN0IGRwX2N0cmxfcHJpdmF0ZSAqY3RybDsKIApAQCAtMTMwMiwxMCArMTM4NCwxNSBAQAogCiAJY3RybCA9IGNvbnRhaW5lcl9vZihkcF9jdHJsLCBzdHJ1Y3QgZHBfY3RybF9wcml2YXRlLCBkcF9jdHJsKTsKIAotCWlmIChocGRfaXJxKQotCQlkcF9jdHJsX29mZl9pcnEoY3RybCk7Ci0JZWxzZQotCQlkcF9jdHJsX29mZl9ocGQoY3RybCk7CisJY3RybC0+Y2F0YWxvZy0+bWFpbmxpbmtfY3RybChjdHJsLT5jYXRhbG9nLCBmYWxzZSk7CisJY3RybC0+Y2F0YWxvZy0+cmVzZXQoY3RybC0+Y2F0YWxvZyk7CisKKwkvKiBNYWtlIHN1cmUgRFAgaXMgZGlzYWJsZWQgYmVmb3JlIGNsayBkaXNhYmxlICovCisJd21iKCk7CisKKwlkcF9jdHJsX2Rpc2FibGVfbWFpbmxpbmtfY2xvY2tzKGN0cmwpOworCisJcHJfZGVidWcoIkRQIG9mZiBkb25lXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgZHBfY3RybF9pc3Ioc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpCkBAIC0xMzQ3LDcgKzE0MzQsNiBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5pZGxlX2NvbXApOwogCWluaXRfY29tcGxldGlvbigmY3RybC0+dmlkZW9fY29tcCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5pcnFfY29tcCk7CiAKIAkvKiBpbiBwYXJhbWV0ZXJzICovCiAJY3RybC0+cGFyc2VyICAgPSBpbi0+cGFyc2VyOwpAQCAtMTM2Nyw2ICsxNDUzLDggQEAKIAlkcF9jdHJsLT5wdXNoX2lkbGUgPSBkcF9jdHJsX3B1c2hfaWRsZTsKIAlkcF9jdHJsLT5hYm9ydCAgICAgPSBkcF9jdHJsX2Fib3J0OwogCWRwX2N0cmwtPmlzciAgICAgICA9IGRwX2N0cmxfaXNyOworCWRwX2N0cmwtPnJlc2V0CSAgID0gZHBfY3RybF9yZXNldDsKKwlkcF9jdHJsLT5oYW5kbGVfc2lua19yZXF1ZXN0ID0gZHBfY3RybF9oYW5kbGVfc2lua19yZXF1ZXN0OwogCiAJcmV0dXJuIGRwX2N0cmw7CiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jdHJsLmgKaW5kZXggMmVjZmEwZC4uZDZkMTBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jdHJsLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9jdHJsLmgKQEAgLTI1LDExICsyNSwxMyBAQAogc3RydWN0IGRwX2N0cmwgewogCWludCAoKmluaXQpKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsLCBib29sIGZsaXApOwogCXZvaWQgKCpkZWluaXQpKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKTsKLQlpbnQgKCpvbikoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwsIGJvb2wgaHBkX2lycSk7Ci0Jdm9pZCAoKm9mZikoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwsIGJvb2wgaHBkX2lycSk7CisJaW50ICgqb24pKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKTsKKwl2b2lkICgqb2ZmKShzdHJ1Y3QgZHBfY3RybCAqZHBfY3RybCk7CisJdm9pZCAoKnJlc2V0KShzdHJ1Y3QgZHBfY3RybCAqZHBfY3RybCk7CiAJdm9pZCAoKnB1c2hfaWRsZSkoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpOwogCXZvaWQgKCphYm9ydCkoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpOwogCXZvaWQgKCppc3IpKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKTsKKwl2b2lkICgqaGFuZGxlX3NpbmtfcmVxdWVzdCkoc3RydWN0IGRwX2N0cmwgKmRwX2N0cmwpOwogfTsKIAogc3RydWN0IGRwX2N0cmxfaW4gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kZWJ1Zy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kZWJ1Zy5jCmluZGV4IDgyZTM0ZGYuLjkyYWMwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RlYnVnLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbU1pfMzJdOwogCXNpemVfdCBsZW4gPSAwOwotCWludCBoZGlzcGxheSA9IDAsIHZkaXNwbGF5ID0gMCwgdnJlZnJlc2ggPSAwOworCWludCBoZGlzcGxheSA9IDAsIHZkaXNwbGF5ID0gMCwgdnJlZnJlc2ggPSAwLCBhc3BlY3RfcmF0aW87CiAKIAlpZiAoIWRlYnVnKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTg5LDcgKzg5LDggQEAKIAogCWJ1ZltsZW5dID0gJ1wwJzsKIAotCWlmIChzc2NhbmYoYnVmLCAiJWQgJWQgJWQiLCAmaGRpc3BsYXksICZ2ZGlzcGxheSwgJnZyZWZyZXNoKSAhPSAzKQorCWlmIChzc2NhbmYoYnVmLCAiJWQgJWQgJWQgJWQiLCAmaGRpc3BsYXksICZ2ZGlzcGxheSwgJnZyZWZyZXNoLAorCQkJCSZhc3BlY3RfcmF0aW8pICE9IDQpCiAJCWdvdG8gY2xlYXI7CiAKIAlpZiAoIWhkaXNwbGF5IHx8ICF2ZGlzcGxheSB8fCAhdnJlZnJlc2gpCkBAIC05OSw2ICsxMDAsNyBAQAogCWRlYnVnLT5kcF9kZWJ1Zy5oZGlzcGxheSA9IGhkaXNwbGF5OwogCWRlYnVnLT5kcF9kZWJ1Zy52ZGlzcGxheSA9IHZkaXNwbGF5OwogCWRlYnVnLT5kcF9kZWJ1Zy52cmVmcmVzaCA9IHZyZWZyZXNoOworCWRlYnVnLT5kcF9kZWJ1Zy5hc3BlY3RfcmF0aW8gPSBhc3BlY3RfcmF0aW87CiAJZ290byBlbmQ7CiBjbGVhcjoKIAlwcl9kZWJ1ZygiY2xlYXJpbmcgZGVidWcgbW9kZXNcbiIpOwpAQCAtMTA3LDYgKzEwOSw0MCBAQAogCXJldHVybiBsZW47CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGRwX2RlYnVnX2J3X2NvZGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkcF9kZWJ1Z19wcml2YXRlICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZltTWl84XTsKKwlzaXplX3QgbGVuID0gMDsKKwl1MzIgbWF4X2J3X2NvZGUgPSAwOworCisJaWYgKCFkZWJ1ZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKnBwb3MpCisJCXJldHVybiAwOworCisJLyogTGVhdmUgcm9vbSBmb3IgdGVybWluYXRpb24gY2hhciAqLworCWxlbiA9IG1pbl90KHNpemVfdCwgY291bnQsIFNaXzggLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZmYsIGxlbikpCisJCXJldHVybiAwOworCisJYnVmW2xlbl0gPSAnXDAnOworCisJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmbWF4X2J3X2NvZGUpICE9IDApCisJCXJldHVybiAwOworCisJaWYgKCFpc19saW5rX3JhdGVfdmFsaWQobWF4X2J3X2NvZGUpKSB7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgYncgY29kZSAlZFxuIiwgbWF4X2J3X2NvZGUpOworCQlyZXR1cm4gbGVuOworCX0KKwlkZWJ1Zy0+cGFuZWwtPm1heF9id19jb2RlID0gbWF4X2J3X2NvZGU7CisJcHJfZGVidWcoIm1heF9id19jb2RlOiAlZFxuIiwgbWF4X2J3X2NvZGUpOworCisJcmV0dXJuIGxlbjsKK30KKwogc3RhdGljIHNzaXplX3QgZHBfZGVidWdfcmVhZF9jb25uZWN0ZWQoc3RydWN0IGZpbGUgKmZpbGUsCiAJCWNoYXIgX191c2VyICp1c2VyX2J1ZmYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMTY0LDExICsyMDAsMTEgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kZSwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgU1pfNEsgLSBsZW4sCi0JCSIlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAweCV4XG4iLAotCQltb2RlLT5uYW1lLCBtb2RlLT52cmVmcmVzaCwgbW9kZS0+aGRpc3BsYXksCi0JCW1vZGUtPmhzeW5jX3N0YXJ0LCBtb2RlLT5oc3luY19lbmQsIG1vZGUtPmh0b3RhbCwKLQkJbW9kZS0+dmRpc3BsYXksIG1vZGUtPnZzeW5jX3N0YXJ0LCBtb2RlLT52c3luY19lbmQsCi0JCW1vZGUtPnZ0b3RhbCwgbW9kZS0+ZmxhZ3MpOworCQkiJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgMHgleFxuIiwKKwkJbW9kZS0+bmFtZSwgbW9kZS0+dnJlZnJlc2gsIG1vZGUtPnBpY3R1cmVfYXNwZWN0X3JhdGlvLAorCQltb2RlLT5oZGlzcGxheSwgbW9kZS0+aHN5bmNfc3RhcnQsIG1vZGUtPmhzeW5jX2VuZCwKKwkJbW9kZS0+aHRvdGFsLCBtb2RlLT52ZGlzcGxheSwgbW9kZS0+dnN5bmNfc3RhcnQsCisJCW1vZGUtPnZzeW5jX2VuZCwgbW9kZS0+dnRvdGFsLCBtb2RlLT5mbGFncyk7CiAJfQogCiAJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2J1ZmYsIGJ1ZiwgbGVuKSkgewpAQCAtMzA2LDMzICszNDIsMzQgQEAKIAkvKiBMaW5rIEluZm9ybWF0aW9uICovCiAJcmMgPSBzbnByaW50ZihidWYgKyBsZW4sIG1heF9zaXplLAogCQkiXHRkcF9saW5rOlxuXHRcdHRlc3RfcmVxdWVzdGVkID0gJWRcbiIsCi0JCWRlYnVnLT5saW5rLT50ZXN0X3JlcXVlc3RlZCk7CisJCWRlYnVnLT5saW5rLT5zaW5rX3JlcXVlc3QpOwogCWlmIChkcF9kZWJ1Z19jaGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6ZSwgJmxlbikpCiAJCWdvdG8gZXJyb3I7CiAKIAlyYyA9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3NpemUsCi0JCSJcdFx0bGFuZV9jb3VudCA9ICVkXG4iLCBkZWJ1Zy0+bGluay0+bGFuZV9jb3VudCk7CisJCSJcdFx0bGFuZV9jb3VudCA9ICVkXG4iLCBkZWJ1Zy0+bGluay0+bGlua19wYXJhbXMubGFuZV9jb3VudCk7CiAJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAmbGVuKSkKIAkJZ290byBlcnJvcjsKIAogCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKLQkJIlx0XHRid19jb2RlID0gJWRcbiIsIGRlYnVnLT5saW5rLT5id19jb2RlKTsKKwkJIlx0XHRid19jb2RlID0gJWRcbiIsIGRlYnVnLT5saW5rLT5saW5rX3BhcmFtcy5id19jb2RlKTsKIAlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZsZW4pKQogCQlnb3RvIGVycm9yOwogCi0JbGNsayA9IGRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShkZWJ1Zy0+bGluay0+YndfY29kZSkgKiAxMDAwOworCWxjbGsgPSBkcm1fZHBfYndfY29kZV90b19saW5rX3JhdGUoCisJCQlkZWJ1Zy0+bGluay0+bGlua19wYXJhbXMuYndfY29kZSkgKiAxMDAwOwogCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKIAkJIlx0XHRsY2xrID0gJWxsZFxuIiwgbGNsayk7CiAJaWYgKGRwX2RlYnVnX2NoZWNrX2J1ZmZlcl9vdmVyZmxvdyhyYywgJm1heF9zaXplLCAmbGVuKSkKIAkJZ290byBlcnJvcjsKIAogCXJjID0gc25wcmludGYoYnVmICsgbGVuLCBtYXhfc2l6ZSwKLQkJIlx0XHR2X2xldmVsID0gJWRcbiIsIGRlYnVnLT5saW5rLT52X2xldmVsKTsKKwkJIlx0XHR2X2xldmVsID0gJWRcbiIsIGRlYnVnLT5saW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwpOwogCWlmIChkcF9kZWJ1Z19jaGVja19idWZmZXJfb3ZlcmZsb3cocmMsICZtYXhfc2l6ZSwgJmxlbikpCiAJCWdvdG8gZXJyb3I7CiAKIAlyYyA9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4X3NpemUsCi0JCSJcdFx0cF9sZXZlbCA9ICVkXG4iLCBkZWJ1Zy0+bGluay0+cF9sZXZlbCk7CisJCSJcdFx0cF9sZXZlbCA9ICVkXG4iLCBkZWJ1Zy0+bGluay0+cGh5X3BhcmFtcy5wX2xldmVsKTsKIAlpZiAoZHBfZGVidWdfY2hlY2tfYnVmZmVyX292ZXJmbG93KHJjLCAmbWF4X3NpemUsICZsZW4pKQogCQlnb3RvIGVycm9yOwogCkBAIC0zNDgsNiArMzg1LDM2IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGRwX2RlYnVnX2J3X2NvZGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljaGFyIF9fdXNlciAqdXNlcl9idWZmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqYnVmOworCXUzMiBsZW4gPSAwOworCisJaWYgKCFkZWJ1ZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKnBwb3MpCisJCXJldHVybiAwOworCisJYnVmID0ga3phbGxvYyhTWl80SywgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgKFNaXzRLIC0gbGVuKSwKKwkJCSJtYXhfYndfY29kZSA9ICVkXG4iLCBkZWJ1Zy0+cGFuZWwtPm1heF9id19jb2RlKTsKKworCWlmIChjb3B5X3RvX3VzZXIodXNlcl9idWZmLCBidWYsIGxlbikpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJKnBwb3MgKz0gbGVuOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGxlbjsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHBfZGVidWdfZm9wcyA9IHsKIAkub3BlbiA9IHNpbXBsZV9vcGVuLAogCS5yZWFkID0gZHBfZGVidWdfcmVhZF9pbmZvLApAQCAtMzY5LDYgKzQzNiwxMiBAQAogCS5yZWFkID0gZHBfZGVidWdfcmVhZF9jb25uZWN0ZWQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBid19jb2RlX2ZvcHMgPSB7CisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkucmVhZCA9IGRwX2RlYnVnX2J3X2NvZGVfcmVhZCwKKwkud3JpdGUgPSBkcF9kZWJ1Z19id19jb2RlX3dyaXRlLAorfTsKKwogc3RhdGljIGludCBkcF9kZWJ1Z19pbml0KHN0cnVjdCBkcF9kZWJ1ZyAqZHBfZGVidWcpCiB7CiAJaW50IHJjID0gMDsKQEAgLTM3Niw2ICs0NDksNyBAQAogCQlzdHJ1Y3QgZHBfZGVidWdfcHJpdmF0ZSwgZHBfZGVidWcpOwogCXN0cnVjdCBkZW50cnkgKmRpciwgKmZpbGUsICplZGlkX21vZGVzOwogCXN0cnVjdCBkZW50cnkgKmhwZCwgKmNvbm5lY3RlZDsKKwlzdHJ1Y3QgZGVudHJ5ICptYXhfYndfY29kZTsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gZGVidWctPnJvb3Q7CiAKIAlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoREVCVUdfTkFNRSwgTlVMTCk7CkBAIC00MjIsNiArNDk2LDE1IEBACiAJCWdvdG8gZXJyb3JfcmVtb3ZlX2RpcjsKIAl9CiAKKwltYXhfYndfY29kZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1heF9id19jb2RlIiwgMDY0NCwgZGlyLAorCQkJZGVidWcsICZid19jb2RlX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChtYXhfYndfY29kZSkpIHsKKwkJcmMgPSBQVFJfRVJSKG1heF9id19jb2RlKTsKKwkJcHJfZXJyKCJbJXNdIGRlYnVnZnMgbWF4X2J3X2NvZGUgZmFpbGVkLCByYz0lZFxuIiwKKwkJICAgICAgIERFQlVHX05BTUUsIHJjKTsKKwkJZ290byBlcnJvcl9yZW1vdmVfZGlyOworCX0KKwogCXJvb3QgPSBkaXI7CiAJcmV0dXJuIHJjOwogZXJyb3JfcmVtb3ZlX2RpcjoKQEAgLTQ2Miw3ICs1NDUsMTEgQEAKIAlkcF9kZWJ1Zy0+aGRpc3BsYXkgPSAwOwogCWRwX2RlYnVnLT52cmVmcmVzaCA9IDA7CiAKLQlkcF9kZWJ1Z19pbml0KGRwX2RlYnVnKTsKKwlyYyA9IGRwX2RlYnVnX2luaXQoZHBfZGVidWcpOworCWlmIChyYykgeworCQlkZXZtX2tmcmVlKGRldiwgZGVidWcpOworCQlnb3RvIGVycm9yOworCX0KIAogCXJldHVybiBkcF9kZWJ1ZzsKIGVycm9yOgpAQCAtNDk0LDUgKzU4MSw1IEBACiAKIAlkcF9kZWJ1Z19kZWluaXQoZHBfZGVidWcpOwogCi0Ja3pmcmVlKGRlYnVnKTsKKwlkZXZtX2tmcmVlKGRlYnVnLT5kZXYsIGRlYnVnKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcuaAppbmRleCA3ZmQ1MzMwLi5kNWE5MzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RlYnVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kZWJ1Zy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgKi8KIHN0cnVjdCBkcF9kZWJ1ZyB7CiAJYm9vbCBkZWJ1Z19lbjsKKwlpbnQgYXNwZWN0X3JhdGlvOwogCWludCB2ZGlzcGxheTsKIAlpbnQgaGRpc3BsYXk7CiAJaW50IHZyZWZyZXNoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuYwppbmRleCA3ZTQwY2M2Li5lYTA3ZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgImRwX2RlYnVnLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZHBfZGlzcGxheSAqZ19kcF9kaXNwbGF5OworI2RlZmluZSBIUERfU1RSSU5HX1NJWkUgMzAKIAogc3RydWN0IGRwX2hkY3AgewogCXZvaWQgKmRhdGE7CkBAIC00MjIsMzMgKzQyMywxMjcgQEAKIAkudW5iaW5kID0gZHBfZGlzcGxheV91bmJpbmQsCiB9OwogCitzdGF0aWMgYm9vbCBkcF9kaXNwbGF5X2lzX2RzX2JyaWRnZShzdHJ1Y3QgZHBfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAocGFuZWwtPmRwY2RbRFBfRE9XTlNUUkVBTVBPUlRfUFJFU0VOVF0gJgorCQlEUF9EV05fU1RSTV9QT1JUX1BSRVNFTlQpOworfQorCitzdGF0aWMgYm9vbCBkcF9kaXNwbGF5X2lzX3NpbmtfY291bnRfemVybyhzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcCkKK3sKKwlyZXR1cm4gZHBfZGlzcGxheV9pc19kc19icmlkZ2UoZHAtPnBhbmVsKSAmJgorCQkoZHAtPmxpbmstPnNpbmtfY291bnQuY291bnQgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfc2VuZF9ocGRfZXZlbnQoc3RydWN0IGRwX2Rpc3BsYXkgKmRwX2Rpc3BsYXkpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHA7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwljaGFyIG5hbWVbSFBEX1NUUklOR19TSVpFXSwgc3RhdHVzW0hQRF9TVFJJTkdfU0laRV0sCisJCWJwcFtIUERfU1RSSU5HX1NJWkVdLCBwYXR0ZXJuW0hQRF9TVFJJTkdfU0laRV07CisJY2hhciAqZW52cFs1XTsKKworCWlmICghZHBfZGlzcGxheSkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJZHAgPSBjb250YWluZXJfb2YoZHBfZGlzcGxheSwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7CisJaWYgKCFkcCkgeworCQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKKwkJcmV0dXJuOworCX0KKwljb25uZWN0b3IgPSBkcC0+ZHBfZGlzcGxheS5jb25uZWN0b3I7CisJZGV2ID0gZHBfZGlzcGxheS0+Y29ubmVjdG9yLT5kZXY7CisKKwljb25uZWN0b3ItPnN0YXR1cyA9IGNvbm5lY3Rvci0+ZnVuY3MtPmRldGVjdChjb25uZWN0b3IsIGZhbHNlKTsKKwlwcl9kZWJ1ZygiWyVzXSBzdGF0dXMgdXBkYXRlZCB0byAlc1xuIiwKKwkJCSAgICAgIGNvbm5lY3Rvci0+bmFtZSwKKwkJCSAgICAgIGRybV9nZXRfY29ubmVjdG9yX3N0YXR1c19uYW1lKGNvbm5lY3Rvci0+c3RhdHVzKSk7CisJc25wcmludGYobmFtZSwgSFBEX1NUUklOR19TSVpFLCAibmFtZT0lcyIsIGNvbm5lY3Rvci0+bmFtZSk7CisJc25wcmludGYoc3RhdHVzLCBIUERfU1RSSU5HX1NJWkUsICJzdGF0dXM9JXMiLAorCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShjb25uZWN0b3ItPnN0YXR1cykpOworCXNucHJpbnRmKGJwcCwgSFBEX1NUUklOR19TSVpFLCAiYnBwPSVkIiwKKwkJZHBfbGlua19iaXRfZGVwdGhfdG9fYnBwKAorCQlkcC0+bGluay0+dGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCkpOworCXNucHJpbnRmKHBhdHRlcm4sIEhQRF9TVFJJTkdfU0laRSwgInBhdHRlcm49JWQiLAorCQlkcC0+bGluay0+dGVzdF92aWRlby50ZXN0X3ZpZGVvX3BhdHRlcm4pOworCisJcHJfZGVidWcoImdlbmVyYXRpbmcgaG90cGx1ZyBldmVudCBbJXNdOlslc10gWyVzXSBbJXNdXG4iLAorCQluYW1lLCBzdGF0dXMsIGJwcCwgcGF0dGVybik7CisJZW52cFswXSA9IG5hbWU7CisJZW52cFsxXSA9IHN0YXR1czsKKwllbnZwWzJdID0gYnBwOworCWVudnBbM10gPSBwYXR0ZXJuOworCWVudnBbNF0gPSBOVUxMOworCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5wcmltYXJ5LT5rZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSwKKwkJCWVudnApOworfQorCitzdGF0aWMgaW50IGRwX2Rpc3BsYXlfc2VuZF9ocGRfbm90aWZpY2F0aW9uKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwLAorCQlib29sIGhwZCkKK3sKKwlpZiAoKGhwZCAmJiBkcC0+ZHBfZGlzcGxheS5pc19jb25uZWN0ZWQpIHx8CisJCQkoIWhwZCAmJiAhZHAtPmRwX2Rpc3BsYXkuaXNfY29ubmVjdGVkKSkgeworCQlwcl9pbmZvKCJIUEQgYWxyZWFkeSAlc1xuIiwgKGhwZCA/ICJvbiIgOiAib2ZmIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByZXNldCB2aWRlbyBwYXR0ZXJuIGZsYWcgb24gZGlzY29ubmVjdCAqLworCWlmICghaHBkKQorCQlkcC0+cGFuZWwtPnZpZGVvX3Rlc3QgPSBmYWxzZTsKKworCWRwLT5kcF9kaXNwbGF5LmlzX2Nvbm5lY3RlZCA9IGhwZDsKKwlyZWluaXRfY29tcGxldGlvbigmZHAtPm5vdGlmaWNhdGlvbl9jb21wKTsKKwlkcF9kaXNwbGF5X3NlbmRfaHBkX2V2ZW50KCZkcC0+ZHBfZGlzcGxheSk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZHAtPm5vdGlmaWNhdGlvbl9jb21wLCBIWiAqIDUpKSB7CisJCXByX3dhcm4oIiVzIHRpbWVvdXRcbiIsIGhwZCA/ICJjb25uZWN0IiA6ICJkaXNjb25uZWN0Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRwX2Rpc3BsYXlfcHJvY2Vzc19ocGRfaGlnaChzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcCkKIHsKIAlpbnQgcmMgPSAwOwogCXUzMiBtYXhfcGNsa19mcm9tX2VkaWQgPSAwOwogCXN0cnVjdCBlZGlkICplZGlkOwogCisJZHAtPmF1eC0+aW5pdChkcC0+YXV4LCBkcC0+cGFyc2VyLT5hdXhfY2ZnKTsKKworCWlmIChkcC0+bGluay0+cHNtX2VuYWJsZWQpCisJCWdvdG8gbm90aWZ5OworCiAJcmMgPSBkcC0+cGFuZWwtPnJlYWRfc2lua19jYXBzKGRwLT5wYW5lbCwgZHAtPmRwX2Rpc3BsYXkuY29ubmVjdG9yKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBub3RpZnk7CisKKwlkcC0+bGluay0+cHJvY2Vzc19yZXF1ZXN0KGRwLT5saW5rKTsKKworCWlmIChkcF9kaXNwbGF5X2lzX3NpbmtfY291bnRfemVybyhkcCkpIHsKKwkJcHJfZGVidWcoIm5vIGRvd25zdHJlYW0gZGV2aWNlcyBjb25uZWN0ZWRcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KIAogCWVkaWQgPSBkcC0+cGFuZWwtPmVkaWRfY3RybC0+ZWRpZDsKIAogCWRwLT5hdWRpb19zdXBwb3J0ZWQgPSBkcm1fZGV0ZWN0X21vbml0b3JfYXVkaW8oZWRpZCk7CiAKKwlkcC0+cGFuZWwtPmhhbmRsZV9zaW5rX3JlcXVlc3QoZHAtPnBhbmVsKTsKKwogCW1heF9wY2xrX2Zyb21fZWRpZCA9IGRwLT5wYW5lbC0+Z2V0X21heF9wY2xrKGRwLT5wYW5lbCk7CiAKIAlkcC0+ZHBfZGlzcGxheS5tYXhfcGNsa19raHogPSBtaW4obWF4X3BjbGtfZnJvbV9lZGlkLAogCQlkcC0+cGFyc2VyLT5tYXhfcGNsa19raHopOwogCi0JZHAtPmRwX2Rpc3BsYXkuaXNfY29ubmVjdGVkID0gdHJ1ZTsKK25vdGlmeToKKwlkcF9kaXNwbGF5X3NlbmRfaHBkX25vdGlmaWNhdGlvbihkcCwgdHJ1ZSk7CiAKLQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZHAtPmRwX2Rpc3BsYXkuY29ubmVjdG9yLT5kZXYpOwotCi0JcmVpbml0X2NvbXBsZXRpb24oJmRwLT5ub3RpZmljYXRpb25fY29tcCk7Ci0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRwLT5ub3RpZmljYXRpb25fY29tcCwgSFogKiAyKSkKLQkJcHJfd2FybigidGltZW91dFxuIik7Ci0KK2VuZDoKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ2Niw3ICs1NjEsNiBAQAogCiAJZHAtPnBvd2VyLT5pbml0KGRwLT5wb3dlciwgZmxpcCk7CiAJZHAtPmN0cmwtPmluaXQoZHAtPmN0cmwsIGZsaXApOwotCWRwLT5hdXgtPmluaXQoZHAtPmF1eCwgZHAtPnBhcnNlci0+YXV4X2NmZyk7CiAJZW5hYmxlX2lycShkcC0+aXJxKTsKIAlkcC0+Y29yZV9pbml0aWFsaXplZCA9IHRydWU7CiB9CkBAIC00NzgsNyArNTcyLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRwLT5hdXgtPmRlaW5pdChkcC0+YXV4KTsKIAlkcC0+Y3RybC0+ZGVpbml0KGRwLT5jdHJsKTsKIAlkcC0+cG93ZXItPmRlaW5pdChkcC0+cG93ZXIpOwogCWRpc2FibGVfaXJxKGRwLT5pcnEpOwpAQCAtNDk4LDEyICs1OTEsOSBAQAogCWlmIChkcC0+YXVkaW9fc3VwcG9ydGVkKQogCQlkcC0+YXVkaW8tPm9mZihkcC0+YXVkaW8pOwogCi0JZHAtPmRwX2Rpc3BsYXkuaXNfY29ubmVjdGVkID0gZmFsc2U7Ci0JZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGRwLT5kcF9kaXNwbGF5LmNvbm5lY3Rvci0+ZGV2KTsKKwlkcF9kaXNwbGF5X3NlbmRfaHBkX25vdGlmaWNhdGlvbihkcCwgZmFsc2UpOwogCi0JcmVpbml0X2NvbXBsZXRpb24oJmRwLT5ub3RpZmljYXRpb25fY29tcCk7Ci0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRwLT5ub3RpZmljYXRpb25fY29tcCwgSFogKiAyKSkKLQkJcHJfd2FybigidGltZW91dFxuIik7CisJZHAtPmF1eC0+ZGVpbml0KGRwLT5hdXgpOwogfQogCiBzdGF0aWMgaW50IGRwX2Rpc3BsYXlfdXNicGRfY29uZmlndXJlX2NiKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTU0Myw3ICs2MzMsNyBAQAogCX0KIAogCWRwLT5jdHJsLT5wdXNoX2lkbGUoZHAtPmN0cmwpOwotCWRwLT5jdHJsLT5vZmYoZHAtPmN0cmwsIGZhbHNlKTsKKwlkcC0+Y3RybC0+b2ZmKGRwLT5jdHJsKTsKIH0KIAogc3RhdGljIGludCBkcF9kaXNwbGF5X3VzYnBkX2Rpc2Nvbm5lY3RfY2Ioc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNTcwLDIyICs2NjAsNTEgQEAKIAlpZiAoZHAtPmF1ZGlvX3N1cHBvcnRlZCkKIAkJZHAtPmF1ZGlvLT5vZmYoZHAtPmF1ZGlvKTsKIAotCWRwLT5kcF9kaXNwbGF5LmlzX2Nvbm5lY3RlZCA9IGZhbHNlOwotCWRybV9oZWxwZXJfaHBkX2lycV9ldmVudChkcC0+ZHBfZGlzcGxheS5jb25uZWN0b3ItPmRldik7CisJcmMgPSBkcF9kaXNwbGF5X3NlbmRfaHBkX25vdGlmaWNhdGlvbihkcCwgZmFsc2UpOwogCi0JcmVpbml0X2NvbXBsZXRpb24oJmRwLT5ub3RpZmljYXRpb25fY29tcCk7Ci0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRwLT5ub3RpZmljYXRpb25fY29tcCwgSFogKiAyKSkgewotCQlwcl93YXJuKCJ0aW1lb3V0XG4iKTsKKwkvKiBpZiBjYWJsZSBpcyBkaXNjb25uZWN0ZWQsIHJlc2V0IHBzbV9lbmFibGVkIGZsYWcgKi8KKwlpZiAoIWRwLT51c2JwZC0+YWx0X21vZGVfY2ZnX2RvbmUpCisJCWRwLT5saW5rLT5wc21fZW5hYmxlZCA9IGZhbHNlOwogCi0JCWlmIChkcC0+cG93ZXJfb24pCi0JCQlkcF9kaXNwbGF5X2NsZWFuKGRwKTsKLQl9CisJaWYgKChyYyA8IDApICYmIGRwLT5wb3dlcl9vbikKKwkJZHBfZGlzcGxheV9jbGVhbihkcCk7CiAKIAlkcF9kaXNwbGF5X2hvc3RfZGVpbml0KGRwKTsKIGVuZDoKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfaGFuZGxlX3ZpZGVvX3JlcXVlc3Qoc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCit7CisJaWYgKGRwLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTikgeworCQkvKiBmb3JjZSBkaXNjb25uZWN0IGZvbGxvd2VkIGJ5IGNvbm5lY3QgKi8KKwkJZHAtPnVzYnBkLT5jb25uZWN0KGRwLT51c2JwZCwgZmFsc2UpOworCQlkcC0+cGFuZWwtPnZpZGVvX3Rlc3QgPSB0cnVlOworCQlkcC0+dXNicGQtPmNvbm5lY3QoZHAtPnVzYnBkLCB0cnVlKTsKKwkJZHAtPmxpbmstPnNlbmRfdGVzdF9yZXNwb25zZShkcC0+bGluayk7CisJfQorfQorCitzdGF0aWMgaW50IGRwX2Rpc3BsYXlfaGFuZGxlX2hwZF9pcnEoc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHApCit7CisJaWYgKGRwLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEU19QT1JUX1NUQVRVU19DSEFOR0VEKSB7CisJCWRwX2Rpc3BsYXlfc2VuZF9ocGRfbm90aWZpY2F0aW9uKGRwLCBmYWxzZSk7CisKKwkJaWYgKGRwX2Rpc3BsYXlfaXNfc2lua19jb3VudF96ZXJvKGRwKSkgeworCQkJcHJfZGVidWcoInNpbmsgY291bnQgaXMgemVybywgbm90aGluZyB0byBkb1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJldHVybiBkcF9kaXNwbGF5X3Byb2Nlc3NfaHBkX2hpZ2goZHApOworCX0KKworCWRwLT5jdHJsLT5oYW5kbGVfc2lua19yZXF1ZXN0KGRwLT5jdHJsKTsKKworCWRwX2Rpc3BsYXlfaGFuZGxlX3ZpZGVvX3JlcXVlc3QoZHApOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHBfZGlzcGxheV91c2JwZF9hdHRlbnRpb25fY2Ioc3RydWN0IGRldmljZSAqZGV2KQogewogCWludCByYyA9IDA7CkBAIC02MTEsOSArNzMwLDEyIEBACiAJCX0KIAogCQlyYyA9IGRwLT5saW5rLT5wcm9jZXNzX3JlcXVlc3QoZHAtPmxpbmspOwotCQlkcC0+aHBkX2lycV9vbiA9IGZhbHNlOworCQkvKiBjaGVjayBmb3IgYW55IHRlc3QgcmVxdWVzdCBpc3N1ZWQgYnkgc2luayAqLwogCQlpZiAoIXJjKQotCQkJZ290byBlbmQ7CisJCQlkcF9kaXNwbGF5X2hhbmRsZV9ocGRfaXJxKGRwKTsKKworCQlkcC0+aHBkX2lycV9vbiA9IGZhbHNlOworCQlnb3RvIGVuZDsKIAl9CiAKIAlpZiAoIWRwLT51c2JwZC0+aHBkX2hpZ2gpIHsKQEAgLTYyNyw2ICs3NDksMjAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfZGVpbml0X3N1Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQoreworCWRwX2F1ZGlvX3B1dChkcC0+YXVkaW8pOworCWRwX2N0cmxfcHV0KGRwLT5jdHJsKTsKKwlkcF9saW5rX3B1dChkcC0+bGluayk7CisJZHBfcGFuZWxfcHV0KGRwLT5wYW5lbCk7CisJZHBfYXV4X3B1dChkcC0+YXV4KTsKKwlkcF9wb3dlcl9wdXQoZHAtPnBvd2VyKTsKKwlkcF9jYXRhbG9nX3B1dChkcC0+Y2F0YWxvZyk7CisJZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKKwlkcF91c2JwZF9wdXQoZHAtPnVzYnBkKTsKKwlkcF9kZWJ1Z19wdXQoZHAtPmRlYnVnKTsKK30KKwogc3RhdGljIGludCBkcF9pbml0X3N1Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQogewogCWludCByYyA9IDA7CkBAIC02MzUsNiArNzcxLDkgQEAKIAlzdHJ1Y3QgZHBfY3RybF9pbiBjdHJsX2luID0gewogCQkuZGV2ID0gZGV2LAogCX07CisJc3RydWN0IGRwX3BhbmVsX2luIHBhbmVsX2luID0geworCQkuZGV2ID0gZGV2LAorCX07CiAKIAljYi0+Y29uZmlndXJlICA9IGRwX2Rpc3BsYXlfdXNicGRfY29uZmlndXJlX2NiOwogCWNiLT5kaXNjb25uZWN0ID0gZHBfZGlzcGxheV91c2JwZF9kaXNjb25uZWN0X2NiOwpAQCAtNjQ0LDQ5ICs3ODMsNjAgQEAKIAlpZiAoSVNfRVJSKGRwLT51c2JwZCkpIHsKIAkJcmMgPSBQVFJfRVJSKGRwLT51c2JwZCk7CiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgdXNicGQsIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBlcnI7CisJCWRwLT51c2JwZCA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJZHAtPnBhcnNlciA9IGRwX3BhcnNlcl9nZXQoZHAtPnBkZXYpOwogCWlmIChJU19FUlIoZHAtPnBhcnNlcikpIHsKIAkJcmMgPSBQVFJfRVJSKGRwLT5wYXJzZXIpOwogCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIHBhcnNlciwgcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGVycjsKKwkJZHAtPnBhcnNlciA9IE5VTEw7CisJCWdvdG8gZXJyb3JfcGFyc2VyOwogCX0KIAogCWRwLT5jYXRhbG9nID0gZHBfY2F0YWxvZ19nZXQoZGV2LCAmZHAtPnBhcnNlci0+aW8pOwogCWlmIChJU19FUlIoZHAtPmNhdGFsb2cpKSB7CiAJCXJjID0gUFRSX0VSUihkcC0+Y2F0YWxvZyk7CiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgY2F0YWxvZywgcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGVycjsKKwkJZHAtPmNhdGFsb2cgPSBOVUxMOworCQlnb3RvIGVycm9yX2NhdGFsb2c7CiAJfQogCiAJZHAtPnBvd2VyID0gZHBfcG93ZXJfZ2V0KGRwLT5wYXJzZXIpOwogCWlmIChJU19FUlIoZHAtPnBvd2VyKSkgewogCQlyYyA9IFBUUl9FUlIoZHAtPnBvd2VyKTsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwb3dlciwgcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGVycjsKKwkJZHAtPnBvd2VyID0gTlVMTDsKKwkJZ290byBlcnJvcl9wb3dlcjsKIAl9CiAKIAlkcC0+YXV4ID0gZHBfYXV4X2dldChkZXYsICZkcC0+Y2F0YWxvZy0+YXV4LCBkcC0+cGFyc2VyLT5hdXhfY2ZnKTsKIAlpZiAoSVNfRVJSKGRwLT5hdXgpKSB7CiAJCXJjID0gUFRSX0VSUihkcC0+YXV4KTsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdXgsIHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JZHAtPnBhbmVsID0gZHBfcGFuZWxfZ2V0KGRldiwgZHAtPmF1eCwgJmRwLT5jYXRhbG9nLT5wYW5lbCk7Ci0JaWYgKElTX0VSUihkcC0+cGFuZWwpKSB7Ci0JCXJjID0gUFRSX0VSUihkcC0+cGFuZWwpOwotCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIHBhbmVsLCByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gZXJyOworCQlkcC0+YXV4ID0gTlVMTDsKKwkJZ290byBlcnJvcl9hdXg7CiAJfQogCiAJZHAtPmxpbmsgPSBkcF9saW5rX2dldChkZXYsIGRwLT5hdXgpOwogCWlmIChJU19FUlIoZHAtPmxpbmspKSB7CiAJCXJjID0gUFRSX0VSUihkcC0+bGluayk7CiAJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgbGluaywgcmMgPSAlZFxuIiwgcmMpOwotCQlnb3RvIGVycjsKKwkJZHAtPmxpbmsgPSBOVUxMOworCQlnb3RvIGVycm9yX2xpbms7CisJfQorCisJcGFuZWxfaW4uYXV4ID0gZHAtPmF1eDsKKwlwYW5lbF9pbi5jYXRhbG9nID0gJmRwLT5jYXRhbG9nLT5wYW5lbDsKKwlwYW5lbF9pbi5saW5rID0gZHAtPmxpbms7CisKKwlkcC0+cGFuZWwgPSBkcF9wYW5lbF9nZXQoJnBhbmVsX2luKTsKKwlpZiAoSVNfRVJSKGRwLT5wYW5lbCkpIHsKKwkJcmMgPSBQVFJfRVJSKGRwLT5wYW5lbCk7CisJCXByX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgcGFuZWwsIHJjID0gJWRcbiIsIHJjKTsKKwkJZHAtPnBhbmVsID0gTlVMTDsKKwkJZ290byBlcnJvcl9wYW5lbDsKIAl9CiAKIAljdHJsX2luLmxpbmsgPSBkcC0+bGluazsKQEAgLTcwMCwxMyArODUwLDE2IEBACiAJaWYgKElTX0VSUihkcC0+Y3RybCkpIHsKIAkJcmMgPSBQVFJfRVJSKGRwLT5jdHJsKTsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjdHJsLCByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gZXJyOworCQlkcC0+Y3RybCA9IE5VTEw7CisJCWdvdG8gZXJyb3JfY3RybDsKIAl9CiAKIAlkcC0+YXVkaW8gPSBkcF9hdWRpb19nZXQoZHAtPnBkZXYsIGRwLT5wYW5lbCwgJmRwLT5jYXRhbG9nLT5hdWRpbyk7CiAJaWYgKElTX0VSUihkcC0+YXVkaW8pKSB7CiAJCXJjID0gUFRSX0VSUihkcC0+YXVkaW8pOwogCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIGF1ZGlvLCByYyA9ICVkXG4iLCByYyk7CisJCWRwLT5hdWRpbyA9IE5VTEw7CisJCWdvdG8gZXJyb3JfYXVkaW87CiAJfQogCiAJZHAtPmRlYnVnID0gZHBfZGVidWdfZ2V0KGRldiwgZHAtPnBhbmVsLCBkcC0+dXNicGQsCkBAIC03MTQsOSArODY3LDMwIEBACiAJaWYgKElTX0VSUihkcC0+ZGVidWcpKSB7CiAJCXJjID0gUFRSX0VSUihkcC0+ZGVidWcpOwogCQlwcl9lcnIoImZhaWxlZCB0byBpbml0aWFsaXplIGRlYnVnLCByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gZXJyOworCQlkcC0+ZGVidWcgPSBOVUxMOworCQlnb3RvIGVycm9yX2RlYnVnOwogCX0KLWVycjoKKworCXJldHVybiByYzsKK2Vycm9yX2RlYnVnOgorCWRwX2F1ZGlvX3B1dChkcC0+YXVkaW8pOworZXJyb3JfYXVkaW86CisJZHBfY3RybF9wdXQoZHAtPmN0cmwpOworZXJyb3JfY3RybDoKKwlkcF9wYW5lbF9wdXQoZHAtPnBhbmVsKTsKK2Vycm9yX3BhbmVsOgorCWRwX2xpbmtfcHV0KGRwLT5saW5rKTsKK2Vycm9yX2xpbms6CisJZHBfYXV4X3B1dChkcC0+YXV4KTsKK2Vycm9yX2F1eDoKKwlkcF9wb3dlcl9wdXQoZHAtPnBvd2VyKTsKK2Vycm9yX3Bvd2VyOgorCWRwX2NhdGFsb2dfcHV0KGRwLT5jYXRhbG9nKTsKK2Vycm9yX2NhdGFsb2c6CisJZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKK2Vycm9yX3BhcnNlcjoKKwlkcF91c2JwZF9wdXQoZHAtPnVzYnBkKTsKK2Vycm9yOgogCXJldHVybiByYzsKIH0KIApAQCAtNzU3LDcgKzkzMSwxMiBAQAogCiAJZHAgPSBjb250YWluZXJfb2YoZHBfZGlzcGxheSwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7CiAKLQlyYyA9IGRwLT5jdHJsLT5vbihkcC0+Y3RybCwgZHAtPmhwZF9pcnFfb24pOworCWlmIChkcC0+cG93ZXJfb24pIHsKKwkJcHJfZGVidWcoIkxpbmsgYWxyZWFkeSBzZXR1cCwgcmV0dXJuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkcC0+Y3RybC0+b24oZHAtPmN0cmwpOwogCWlmICghcmMpCiAJCWRwLT5wb3dlcl9vbiA9IHRydWU7CiBlcnJvcjoKQEAgLTc3OCw4ICs5NTcsOCBAQAogCWRwID0gY29udGFpbmVyX29mKGRwX2Rpc3BsYXksIHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUsIGRwX2Rpc3BsYXkpOwogCiAJaWYgKGRwLT5hdWRpb19zdXBwb3J0ZWQpIHsKLQkJZHAtPmF1ZGlvLT5id19jb2RlID0gZHAtPmxpbmstPmJ3X2NvZGU7Ci0JCWRwLT5hdWRpby0+bGFuZV9jb3VudCA9IGRwLT5saW5rLT5sYW5lX2NvdW50OworCQlkcC0+YXVkaW8tPmJ3X2NvZGUgPSBkcC0+bGluay0+bGlua19wYXJhbXMuYndfY29kZTsKKwkJZHAtPmF1ZGlvLT5sYW5lX2NvdW50ID0gZHAtPmxpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQ7CiAJCWRwLT5hdWRpby0+b24oZHAtPmF1ZGlvKTsKIAl9CiAKQEAgLTgxOSw2ICs5OTgsMTAgQEAKIAkJCWRwLT5oZGNwLm9wcy0+b2ZmKGRwLT5oZGNwLmRhdGEpOwogCX0KIAorCWlmIChkcC0+dXNicGQtPmFsdF9tb2RlX2NmZ19kb25lICYmIChkcC0+dXNicGQtPmhwZF9oaWdoIHx8CisJCWRwLT51c2JwZC0+Zm9yY2VkX2Rpc2Nvbm5lY3QpKQorCQlkcC0+bGluay0+cHNtX2NvbmZpZyhkcC0+bGluaywgJmRwLT5wYW5lbC0+bGlua19pbmZvLCB0cnVlKTsKKwogCWRwLT5jdHJsLT5wdXNoX2lkbGUoZHAtPmN0cmwpOwogZXJyb3I6CiAJcmV0dXJuIHJjOwpAQCAtODQwLDcgKzEwMjMsNyBAQAogCWlmICghZHAtPnBvd2VyX29uIHx8ICFkcC0+Y29yZV9pbml0aWFsaXplZCkKIAkJZ290byBlcnJvcjsKIAotCWRwLT5jdHJsLT5vZmYoZHAtPmN0cmwsIGRwLT5ocGRfaXJxX29uKTsKKwlkcC0+Y3RybC0+b2ZmKGRwLT5jdHJsKTsKIAogCWRwLT5wb3dlcl9vbiA9IGZhbHNlOwogCkBAIC05MDUsMTkgKzEwODgsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcF9kaXNwbGF5X2dldF9tb2RlcyhzdHJ1Y3QgZHBfZGlzcGxheSAqZHApCitzdGF0aWMgaW50IGRwX2Rpc3BsYXlfZ2V0X21vZGVzKHN0cnVjdCBkcF9kaXNwbGF5ICpkcCwKKwlzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICpkcF9tb2RlKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwX2Rpc3BsYXk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRwKSB7CisJCXByX2VycigiaW52YWxpZCBwYXJhbXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlkcF9kaXNwbGF5ID0gY29udGFpbmVyX29mKGRwLCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLCBkcF9kaXNwbGF5KTsKIAotCXJldCA9IF9zZGVfZWRpZF91cGRhdGVfbW9kZXMoZHAtPmNvbm5lY3RvciwKLQkJZHBfZGlzcGxheS0+cGFuZWwtPmVkaWRfY3RybCk7Ci0KKwlyZXQgPSBkcF9kaXNwbGF5LT5wYW5lbC0+Z2V0X21vZGVzKGRwX2Rpc3BsYXktPnBhbmVsLAorCQlkcC0+Y29ubmVjdG9yLCBkcF9tb2RlKTsKKwlpZiAoZHBfbW9kZS0+dGltaW5nLnBpeGVsX2Nsa19raHopCisJCWRwLT5tYXhfcGNsa19raHogPSBkcF9tb2RlLT50aW1pbmcucGl4ZWxfY2xrX2toejsKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgYm9vbCBkcF9kaXNwbGF5X2NoZWNrX3ZpZGVvX3Rlc3Qoc3RydWN0IGRwX2Rpc3BsYXkgKmRwKQoreworCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwX2Rpc3BsYXk7CisKKwlpZiAoIWRwKSB7CisJCXByX2VycigiaW52YWxpZCBwYXJhbXNcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZHBfZGlzcGxheSA9IGNvbnRhaW5lcl9vZihkcCwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7CisKKwlpZiAoZHBfZGlzcGxheS0+cGFuZWwtPnZpZGVvX3Rlc3QpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGRwX2Rpc3BsYXlfZ2V0X3Rlc3RfYnBwKHN0cnVjdCBkcF9kaXNwbGF5ICpkcCkKK3sKKwlzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlICpkcF9kaXNwbGF5OworCisJaWYgKCFkcCkgeworCQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZHBfZGlzcGxheSA9IGNvbnRhaW5lcl9vZihkcCwgc3RydWN0IGRwX2Rpc3BsYXlfcHJpdmF0ZSwgZHBfZGlzcGxheSk7CisKKwlyZXR1cm4gZHBfbGlua19iaXRfZGVwdGhfdG9fYnBwKAorCQlkcF9kaXNwbGF5LT5saW5rLT50ZXN0X3ZpZGVvLnRlc3RfYml0X2RlcHRoKTsKK30KKwogc3RhdGljIGludCBkcF9kaXNwbGF5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJjID0gMDsKQEAgLTk1OCwxMCArMTE4MCwxNiBAQAogCWdfZHBfZGlzcGxheS0+dW5wcmVwYXJlICAgICA9IGRwX2Rpc3BsYXlfdW5wcmVwYXJlOwogCWdfZHBfZGlzcGxheS0+cmVxdWVzdF9pcnEgICA9IGRwX3JlcXVlc3RfaXJxOwogCWdfZHBfZGlzcGxheS0+Z2V0X2RlYnVnICAgICA9IGRwX2dldF9kZWJ1ZzsKKwlnX2RwX2Rpc3BsYXktPnNlbmRfaHBkX2V2ZW50ICAgID0gZHBfZGlzcGxheV9zZW5kX2hwZF9ldmVudDsKKwlnX2RwX2Rpc3BsYXktPmlzX3ZpZGVvX3Rlc3QgPSBkcF9kaXNwbGF5X2NoZWNrX3ZpZGVvX3Rlc3Q7CisJZ19kcF9kaXNwbGF5LT5nZXRfdGVzdF9icHAgPSBkcF9kaXNwbGF5X2dldF90ZXN0X2JwcDsKIAogCXJjID0gY29tcG9uZW50X2FkZCgmcGRldi0+ZGV2LCAmZHBfZGlzcGxheV9jb21wX29wcyk7Ci0JaWYgKHJjKQorCWlmIChyYykgewogCQlwcl9lcnIoImNvbXBvbmVudCBhZGQgZmFpbGVkLCByYz0lZFxuIiwgcmMpOworCQlkcF9kaXNwbGF5X2RlaW5pdF9zdWJfbW9kdWxlcyhkcCk7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZHApOworCX0KIAogCXJldHVybiByYzsKIH0KQEAgLTk4NywyMCArMTIxNSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfZGVpbml0X3N1Yl9tb2R1bGVzKHN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwKQotewotCWRwX2F1ZGlvX3B1dChkcC0+YXVkaW8pOwotCWRwX2N0cmxfcHV0KGRwLT5jdHJsKTsKLQlkcF9saW5rX3B1dChkcC0+bGluayk7Ci0JZHBfcGFuZWxfcHV0KGRwLT5wYW5lbCk7Ci0JZHBfYXV4X3B1dChkcC0+YXV4KTsKLQlkcF9wb3dlcl9wdXQoZHAtPnBvd2VyKTsKLQlkcF9jYXRhbG9nX3B1dChkcC0+Y2F0YWxvZyk7Ci0JZHBfcGFyc2VyX3B1dChkcC0+cGFyc2VyKTsKLQlkcF91c2JwZF9wdXQoZHAtPnVzYnBkKTsKLQlkcF9kZWJ1Z19wdXQoZHAtPmRlYnVnKTsKLX0KLQogc3RhdGljIGludCBkcF9kaXNwbGF5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkcF9kaXNwbGF5X3ByaXZhdGUgKmRwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kaXNwbGF5LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuaAppbmRleCA1OTQzNjI5Li41NTM5ZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2Rpc3BsYXkuaApAQCAtMTksMTEgKzE5LDYgQEAKIAogI2luY2x1ZGUgImRwX3BhbmVsLmgiCiAKLXN0cnVjdCBkcF9kaXNwbGF5X21vZGUgewotCXN0cnVjdCBkcF9wYW5lbF9pbmZvIHRpbWluZzsKLQl1MzIgY2FwYWJpbGl0aWVzOwotfTsKLQogc3RydWN0IGRwX2Rpc3BsYXkgewogCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2OwogCXN0cnVjdCBkcF9icmlkZ2UgKmJyaWRnZTsKQEAgLTQxLDExICszNiwxNSBAQAogCQkJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSAqbW9kZSk7CiAJaW50ICgqdmFsaWRhdGVfbW9kZSkoc3RydWN0IGRwX2Rpc3BsYXkgKmRwX2Rpc3BsYXksCiAJCQlzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICptb2RlKTsKLQlpbnQgKCpnZXRfbW9kZXMpKHN0cnVjdCBkcF9kaXNwbGF5ICpkcF9kaXNwbGF5KTsKKwlpbnQgKCpnZXRfbW9kZXMpKHN0cnVjdCBkcF9kaXNwbGF5ICpkcF9kaXNwbGF5LAorCQlzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICpkcF9tb2RlKTsKIAlpbnQgKCpwcmVwYXJlKShzdHJ1Y3QgZHBfZGlzcGxheSAqZHBfZGlzcGxheSk7CiAJaW50ICgqdW5wcmVwYXJlKShzdHJ1Y3QgZHBfZGlzcGxheSAqZHBfZGlzcGxheSk7CiAJaW50ICgqcmVxdWVzdF9pcnEpKHN0cnVjdCBkcF9kaXNwbGF5ICpkcF9kaXNwbGF5KTsKIAlzdHJ1Y3QgZHBfZGVidWcgKigqZ2V0X2RlYnVnKShzdHJ1Y3QgZHBfZGlzcGxheSAqZHBfZGlzcGxheSk7CisJdm9pZCAoKnNlbmRfaHBkX2V2ZW50KShzdHJ1Y3QgZHBfZGlzcGxheSAqZHBfZGlzcGxheSk7CisJYm9vbCAoKmlzX3ZpZGVvX3Rlc3QpKHN0cnVjdCBkcF9kaXNwbGF5ICpkcF9kaXNwbGF5KTsKKwlpbnQgKCpnZXRfdGVzdF9icHApKHN0cnVjdCBkcF9kaXNwbGF5ICpkcF9kaXNwbGF5KTsKIH07CiAKIGludCBkcF9kaXNwbGF5X2dldF9udW1fb2ZfZGlzcGxheXModm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uYwppbmRleCA4MDJmMjk1Li4yNTQzNDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmMKQEAgLTQ4LDcgKzQ4LDE1IEBACiAKIAlkcF9tb2RlLT50aW1pbmcudl9mcm9udF9wb3JjaCA9IGRybV9tb2RlLT52c3luY19zdGFydCAtCiAJCQkJCSBkcm1fbW9kZS0+dmRpc3BsYXk7Ci0JZHBfbW9kZS0+dGltaW5nLmJwcCA9IGRwLT5jb25uZWN0b3ItPmRpc3BsYXlfaW5mby5icGMgKiBudW1fY29tcG9uZW50czsKKworCWlmIChkcC0+aXNfdmlkZW9fdGVzdChkcCkpCisJCWRwX21vZGUtPnRpbWluZy5icHAgPSBkcC0+Z2V0X3Rlc3RfYnBwKGRwKTsKKwllbHNlCisJCWRwX21vZGUtPnRpbWluZy5icHAgPSBkcC0+Y29ubmVjdG9yLT5kaXNwbGF5X2luZm8uYnBjICoKKwkJbnVtX2NvbXBvbmVudHM7CisKKwlpZiAoIWRwX21vZGUtPnRpbWluZy5icHApCisJCWRwX21vZGUtPnRpbWluZy5icHAgPSAyNDsKIAogCWRwX21vZGUtPnRpbWluZy5yZWZyZXNoX3JhdGUgPSBkcm1fbW9kZS0+dnJlZnJlc2g7CiAKQEAgLTM3NSwyNiArMzgzLDY1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAordm9pZCBkcF9jb25uZWN0b3Jfc2VuZF9ocGRfZXZlbnQodm9pZCAqZGlzcGxheSkKK3sKKwlzdHJ1Y3QgZHBfZGlzcGxheSAqZHA7CisKKwlpZiAoIWRpc3BsYXkpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRwID0gZGlzcGxheTsKKworCWlmIChkcC0+c2VuZF9ocGRfZXZlbnQpCisJCWRwLT5zZW5kX2hwZF9ldmVudChkcCk7Cit9CisKIGludCBkcF9jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCiAJCXZvaWQgKmRpc3BsYXkpCiB7CiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgZHBfZGlzcGxheSAqZHA7CisJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSAqZHBfbW9kZSA9IE5VTEw7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm0sIGRybV9tb2RlOwogCiAJaWYgKCFjb25uZWN0b3IgfHwgIWRpc3BsYXkpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAogCWRwID0gZGlzcGxheTsKKworCWRwX21vZGUgPSBremFsbG9jKHNpemVvZigqZHBfbW9kZSksICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRwX21vZGUpCisJCXJldHVybiAwOworCiAJLyogcGx1Z2dhYmxlIGNhc2UgYXNzdW1lcyBFRElEIGlzIHJlYWQgd2hlbiBIUEQgKi8KIAlpZiAoZHAtPmlzX2Nvbm5lY3RlZCkgewotCQlyYyA9IGRwLT5nZXRfbW9kZXMoZHApOworCQlyYyA9IGRwLT5nZXRfbW9kZXMoZHAsIGRwX21vZGUpOwogCQlpZiAoIXJjKQogCQkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IERQIHNpbmsgbW9kZXMsIHJjPSVkXG4iLCByYyk7CisKKwkJaWYgKGRwX21vZGUtPnRpbWluZy5waXhlbF9jbGtfa2h6KSB7IC8qIHZhbGlkIERQIG1vZGUgKi8KKwkJCW1lbXNldCgmZHJtX21vZGUsIDB4MCwgc2l6ZW9mKGRybV9tb2RlKSk7CisJCQljb252ZXJ0X3RvX2RybV9tb2RlKGRwX21vZGUsICZkcm1fbW9kZSk7CisJCQltID0gZHJtX21vZGVfZHVwbGljYXRlKGNvbm5lY3Rvci0+ZGV2LCAmZHJtX21vZGUpOworCQkJaWYgKCFtKSB7CisJCQkJcHJfZXJyKCJmYWlsZWQgdG8gYWRkIG1vZGUgJXV4JXVcbiIsCisJCQkJICAgICAgIGRybV9tb2RlLmhkaXNwbGF5LAorCQkJCSAgICAgICBkcm1fbW9kZS52ZGlzcGxheSk7CisJCQkJa2ZyZWUoZHBfbW9kZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltLT53aWR0aF9tbSA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tOworCQkJbS0+aGVpZ2h0X21tID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVpZ2h0X21tOworCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG0pOworCQl9CiAJfSBlbHNlIHsKIAkJcHJfZXJyKCJObyBzaW5rIGNvbm5lY3RlZFxuIik7CiAJfQorCWtmcmVlKGRwX21vZGUpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiBpbnQgZHBfZHJtX2JyaWRnZV9pbml0KHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKQEAgLTQ2NywxOCArNTE0LDE5IEBACiAJZHBfZGlzcCA9IGRpc3BsYXk7CiAJZGVidWcgPSBkcF9kaXNwLT5nZXRfZGVidWcoZHBfZGlzcCk7CiAKLQlpZiAoZGVidWctPmRlYnVnX2VuKSB7Ci0JCWlmIChtb2RlLT5oZGlzcGxheSA9PSBkZWJ1Zy0+aGRpc3BsYXkgJiYKLQkJCQltb2RlLT52ZGlzcGxheSA9PSBkZWJ1Zy0+dmRpc3BsYXkgJiYKLQkJCQltb2RlLT52cmVmcmVzaCA9PSBkZWJ1Zy0+dnJlZnJlc2ggJiYKLQkJCQltb2RlLT5jbG9jayA8PSBkcF9kaXNwLT5tYXhfcGNsa19raHopCi0JCQlyZXR1cm4gTU9ERV9PSzsKLQkJZWxzZQotCQkJcmV0dXJuIE1PREVfRVJST1I7Ci0JfSBlbHNlIHsKLQkJaWYgKG1vZGUtPmNsb2NrID4gZHBfZGlzcC0+bWF4X3BjbGtfa2h6KQotCQkJcmV0dXJuIE1PREVfQkFEOwotCQllbHNlCi0JCQlyZXR1cm4gTU9ERV9PSzsKLQl9CisJbW9kZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKKworCWlmIChtb2RlLT52cmVmcmVzaCA+IDYwKQorCQlyZXR1cm4gTU9ERV9CQUQ7CisKKwlpZiAobW9kZS0+Y2xvY2sgPiBkcF9kaXNwLT5tYXhfcGNsa19raHopCisJCXJldHVybiBNT0RFX0JBRDsKKworCWlmIChkZWJ1Zy0+ZGVidWdfZW4gJiYgKG1vZGUtPmhkaXNwbGF5ICE9IGRlYnVnLT5oZGlzcGxheSB8fAorCQkJbW9kZS0+dmRpc3BsYXkgIT0gZGVidWctPnZkaXNwbGF5IHx8CisJCQltb2RlLT52cmVmcmVzaCAhPSBkZWJ1Zy0+dnJlZnJlc2ggfHwKKwkJCW1vZGUtPnBpY3R1cmVfYXNwZWN0X3JhdGlvICE9IGRlYnVnLT5hc3BlY3RfcmF0aW8pKQorCQlyZXR1cm4gTU9ERV9CQUQ7CisKKwlyZXR1cm4gTU9ERV9PSzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2RybS5oCmluZGV4IDU5MThkZjEuLjUzNTcwZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZHJtLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kcm0uaApAQCAtODYsNiArODYsOCBAQAogCiBpbnQgZHBfY29ubmVjdG9yX2dldF9pbmZvKHN0cnVjdCBtc21fZGlzcGxheV9pbmZvICppbmZvLCB2b2lkICpkaXNwbGF5KTsKIAordm9pZCBkcF9jb25uZWN0b3Jfc2VuZF9ocGRfZXZlbnQodm9pZCAqZGlzcGxheSk7CisKIGludCBkcF9kcm1fYnJpZGdlX2luaXQodm9pZCAqZGlzcGxheSwKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2hkY3AycDIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfaGRjcDJwMi5jCmluZGV4IDA2MWFjZWUuLjAxNmUxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfaGRjcDJwMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfaGRjcDJwMi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIERQX0lOVFJfU1RBVFVTMwkJCQkoMHgwMDAwMDAyOCkKICNkZWZpbmUgZHBfcmVhZChvZmZzZXQpIHJlYWRsX3JlbGF4ZWQoKG9mZnNldCkpCiAjZGVmaW5lIGRwX3dyaXRlKG9mZnNldCwgZGF0YSkgd3JpdGVsX3JlbGF4ZWQoKGRhdGEpLCAob2Zmc2V0KSkKKyNkZWZpbmUgRFBfSERDUF9SWENBUFNfTEVOR1RIIDMKIAogZW51bSBkcF9oZGNwMnAyX3Npbmtfc3RhdHVzIHsKIAlTSU5LX0RJU0NPTk5FQ1RFRCwKQEAgLTg5MywyMSArODk0LDIyIEBACiBzdGF0aWMgYm9vbCBkcF9oZGNwMnAyX3N1cHBvcnRlZChzdHJ1Y3QgZHBfaGRjcDJwMl9jdHJsICpjdHJsKQogewogCXUzMiBjb25zdCByeGNhcHNfZHBjZF9vZmZzZXQgPSAweDY5MjFkOwotCXNzaXplX3QgY29uc3QgYnl0ZXNfdG9fcmVhZCA9IDE7CiAJc3NpemVfdCBieXRlc19yZWFkID0gMDsKLQl1OCBidWYgPSAwOworCXU4IGJ1ZltEUF9IRENQX1JYQ0FQU19MRU5HVEhdOwogCiAJYnl0ZXNfcmVhZCA9IGRybV9kcF9kcGNkX3JlYWQoY3RybC0+aW5pdF9kYXRhLmRybV9hdXgsCi0JCQlyeGNhcHNfZHBjZF9vZmZzZXQsICZidWYsIGJ5dGVzX3RvX3JlYWQpOwotCWlmIChieXRlc19yZWFkICE9IGJ5dGVzX3RvX3JlYWQpIHsKKwkJCXJ4Y2Fwc19kcGNkX29mZnNldCwgJmJ1ZiwgRFBfSERDUF9SWENBUFNfTEVOR1RIKTsKKwlpZiAoYnl0ZXNfcmVhZCAhPSBEUF9IRENQX1JYQ0FQU19MRU5HVEgpIHsKIAkJcHJfZXJyKCJSeENhcHMgcmVhZCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXByX2RlYnVnKCJyeGNhcHMgMHgleFxuIiwgYnVmKTsKKwlwcl9kZWJ1ZygiSERDUF9DQVBBQkxFPSVsdVxuIiwgKGJ1ZlsyXSAmIEJJVCgxKSkgPj4gMSk7CisJcHJfZGVidWcoIlZFUlNJT049JWRcbiIsIGJ1ZlswXSk7CiAKLQlpZiAoYnVmICYgQklUKDEpKQorCWlmICgoYnVmWzJdICYgQklUKDEpKSAmJiAoYnVmWzBdID09IDB4MikpCiAJCXJldHVybiB0cnVlOworCiBlcnJvcjoKIAlyZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5jCmluZGV4IDQ4ZTZjOGYuLjBjZjQ4OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5jCkBAIC0xNywxNCArMTcsNiBAQAogI2luY2x1ZGUgImRwX2xpbmsuaCIKICNpbmNsdWRlICJkcF9wYW5lbC5oIgogCi0jZGVmaW5lIERQX0xJTktfRU5VTV9TVFIoeCkJCSN4Ci0KLWVudW0gZHBfbGFuZV9jb3VudCB7Ci0JRFBfTEFORV9DT1VOVF8xCT0gMSwKLQlEUF9MQU5FX0NPVU5UXzIJPSAyLAotCURQX0xBTkVfQ09VTlRfNAk9IDQsCi19OwotCiBlbnVtIGR5bmFtaWNfcmFuZ2UgewogCURQX0RZTkFNSUNfUkFOR0VfUkdCX1ZFU0EgPSAweDAwLAogCURQX0RZTkFNSUNfUkFOR0VfUkdCX0NFQSA9IDB4MDEsCkBAIC01MCwxMTEgKzQyLDE4IEBACiAJdTMyIHRlc3RfcmVxdWVzdGVkOwogCXUzMiB0ZXN0X2xpbmtfcmF0ZTsKIAl1MzIgdGVzdF9sYW5lX2NvdW50OwotCXUzMiBwaHlfdGVzdF9wYXR0ZXJuX3NlbDsKLQl1MzIgdGVzdF92aWRlb19wYXR0ZXJuOwotCXUzMiB0ZXN0X2JpdF9kZXB0aDsKLQl1MzIgdGVzdF9keW5fcmFuZ2U7Ci0JdTMyIHRlc3RfaF90b3RhbDsKLQl1MzIgdGVzdF92X3RvdGFsOwotCXUzMiB0ZXN0X2hfc3RhcnQ7Ci0JdTMyIHRlc3Rfdl9zdGFydDsKLQl1MzIgdGVzdF9oc3luY19wb2w7Ci0JdTMyIHRlc3RfaHN5bmNfd2lkdGg7Ci0JdTMyIHRlc3RfdnN5bmNfcG9sOwotCXUzMiB0ZXN0X3ZzeW5jX3dpZHRoOwotCXUzMiB0ZXN0X2hfd2lkdGg7Ci0JdTMyIHRlc3Rfdl9oZWlnaHQ7Ci0JdTMyIHRlc3RfcnJfZDsKLQl1MzIgdGVzdF9ycl9uOwotCXUzMiB0ZXN0X2F1ZGlvX3NhbXBsaW5nX3JhdGU7Ci0JdTMyIHRlc3RfYXVkaW9fY2hhbm5lbF9jb3VudDsKLQl1MzIgdGVzdF9hdWRpb19wYXR0ZXJuX3R5cGU7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzE7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzI7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzM7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzQ7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzU7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzY7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzc7Ci0JdTMyIHRlc3RfYXVkaW9fcGVyaW9kX2NoXzg7Ci0JdTMyIHJlc3BvbnNlOwotfTsKLQotc3RydWN0IGRwX2xpbmtfc2lua19jb3VudCB7Ci0JdTMyIGNvdW50OwotCWJvb2wgY3BfcmVhZHk7CiB9OwogCiBzdHJ1Y3QgZHBfbGlua19wcml2YXRlIHsKKwl1MzIgcHJldl9zaW5rX2NvdW50OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZHBfYXV4ICphdXg7CiAJc3RydWN0IGRwX2xpbmsgZHBfbGluazsKIAogCXN0cnVjdCBkcF9saW5rX3JlcXVlc3QgcmVxdWVzdDsKLQlzdHJ1Y3QgZHBfbGlua19zaW5rX2NvdW50IHNpbmtfY291bnQ7CiAJdTggbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV07CiB9OwogCi0vKioKLSAqIG1kc3NfZHBfdGVzdF9iaXRfZGVwdGhfdG9fYnBwKCkgLSBjb252ZXJ0IHRlc3QgYml0IGRlcHRoIHRvIGJwcAotICogQHRiZDogdGVzdCBiaXQgZGVwdGgKLSAqCi0gKiBSZXR1cm5zIHRoZSBiaXRzIHBlciBwaXhlbCAoYnBwKSB0byBiZSB1c2VkIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gKiBnaXQgYml0IGRlcHRoIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBiaXQgZGVwdGggaGFzCi0gKiBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkLgotICovCi1zdGF0aWMgaW5saW5lIHUzMiBkcF9saW5rX2JpdF9kZXB0aF90b19icHAodTMyIHRiZCkKLXsKLQl1MzIgYnBwOwotCi0JLyoKLQkgKiBGZXcgc2ltcGxpc3RpYyBydWxlcyBhbmQgYXNzdW1wdGlvbnMgbWFkZSBoZXJlOgotCSAqICAgIDEuIEJpdCBkZXB0aCBpcyBwZXIgY29sb3IgY29tcG9uZW50Ci0JICogICAgMi4gSWYgYml0IGRlcHRoIGlzIHVua25vd24gcmV0dXJuIDAKLQkgKiAgICAzLiBBc3N1bWUgMyBjb2xvciBjb21wb25lbnRzCi0JICovCi0Jc3dpdGNoICh0YmQpIHsKLQljYXNlIERQX1RFU1RfQklUX0RFUFRIXzY6Ci0JCWJwcCA9IDE4OwotCQlicmVhazsKLQljYXNlIERQX1RFU1RfQklUX0RFUFRIXzg6Ci0JCWJwcCA9IDI0OwotCQlicmVhazsKLQljYXNlIERQX1RFU1RfQklUX0RFUFRIXzEwOgotCQlicHAgPSAzMDsKLQkJYnJlYWs7Ci0JY2FzZSBEUF9URVNUX0JJVF9ERVBUSF9VTktOT1dOOgotCWRlZmF1bHQ6Ci0JCWJwcCA9IDA7Ci0JfQotCi0JcmV0dXJuIGJwcDsKLX0KLQotc3RhdGljIGNoYXIgKmRwX2xpbmtfZ2V0X3BoeV90ZXN0X3BhdHRlcm4odTMyIHBoeV90ZXN0X3BhdHRlcm5fc2VsKQotewotCXN3aXRjaCAocGh5X3Rlc3RfcGF0dGVybl9zZWwpIHsKLQljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fTk9ORToKLQkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoRFBfVEVTVF9QSFlfUEFUVEVSTl9OT05FKTsKLQljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fRDEwXzJfTk9fU0NSQU1CTElORzoKLQkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoCi0JCQlEUF9URVNUX1BIWV9QQVRURVJOX0QxMF8yX05PX1NDUkFNQkxJTkcpOwotCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl9TWU1CT0xfRVJSX01FQVNVUkVNRU5UX0NOVDoKLQkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoCi0JCQlEUF9URVNUX1BIWV9QQVRURVJOX1NZTUJPTF9FUlJfTUVBU1VSRU1FTlRfQ05UKTsKLQljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fUFJCUzc6Ci0JCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKERQX1RFU1RfUEhZX1BBVFRFUk5fUFJCUzcpOwotCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl84MF9CSVRfQ1VTVE9NX1BBVFRFUk46Ci0JCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKAotCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl84MF9CSVRfQ1VTVE9NX1BBVFRFUk4pOwotCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTjoKLQkJcmV0dXJuIERQX0xJTktfRU5VTV9TVFIoCi0JCQlEUF9URVNUX1BIWV9QQVRURVJOX0hCUjJfQ1RTX0VZRV9QQVRURVJOKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gInVua25vd24iOwotCX0KLX0KLQogc3RhdGljIGNoYXIgKmRwX2xpbmtfZ2V0X2F1ZGlvX3Rlc3RfcGF0dGVybih1MzIgcGF0dGVybikKIHsKIAlzd2l0Y2ggKHBhdHRlcm4pIHsKQEAgLTIyMyw3ICsxMjIsNyBAQAogc3RhdGljIGludCBkcF9saW5rX3BhcnNlX2F1ZGlvX2NoYW5uZWxfcGVyaW9kKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGRwX2xpbmtfcmVxdWVzdCAqcmVxID0gJmxpbmstPnJlcXVlc3Q7CisJc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyAqcmVxID0gJmxpbmstPmRwX2xpbmsudGVzdF9hdWRpbzsKIAogCXJldCA9IGRwX2xpbmtfZ2V0X3BlcmlvZChsaW5rLCBEUF9URVNUX0FVRElPX1BFUklPRF9DSDEpOwogCWlmIChyZXQgPT0gLUVJTlZBTCkKQEAgLTMxMCw3ICsyMDksNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3BhdHRlcm5fdHlwZSA9IGRhdGE7CisJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fcGF0dGVybl90eXBlID0gZGF0YTsKIAlwcl9kZWJ1ZygiYXVkaW8gcGF0dGVybiB0eXBlID0gJXNcbiIsCiAJCQlkcF9saW5rX2dldF9hdWRpb190ZXN0X3BhdHRlcm4oZGF0YSkpOwogZXhpdDoKQEAgLTM1Niw4ICsyNTUsOCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOwotCWxpbmstPnJlcXVlc3QudGVzdF9hdWRpb19jaGFubmVsX2NvdW50ID0gY2hhbm5lbF9jb3VudDsKKwlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKwlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19jaGFubmVsX2NvdW50ID0gY2hhbm5lbF9jb3VudDsKIAlwcl9kZWJ1Zygic2FtcGxpbmdfcmF0ZSA9ICVzLCBjaGFubmVsX2NvdW50ID0gMHgleFxuIiwKIAkJZHBfbGlua19nZXRfYXVkaW9fc2FtcGxlX3JhdGUoc2FtcGxpbmdfcmF0ZSksIGNoYW5uZWxfY291bnQpOwogZXhpdDoKQEAgLTU3OCwxMSArNDc3LDExIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlsaW5rLT5yZXF1ZXN0LnRlc3RfdmlkZW9fcGF0dGVybiA9IGRhdGE7CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfdmlkZW9fcGF0dGVybiA9IGRhdGE7CiAJcHJfZGVidWcoImxpbmsgdmlkZW8gcGF0dGVybiA9IDB4JXggKCVzKVxuIiwKLQkJbGluay0+cmVxdWVzdC50ZXN0X3ZpZGVvX3BhdHRlcm4sCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3ZpZGVvX3BhdHRlcm4sCiAJCWRwX2xpbmtfdmlkZW9fcGF0dGVybl90b19zdHJpbmcoCi0JCQlsaW5rLT5yZXF1ZXN0LnRlc3RfdmlkZW9fcGF0dGVybikpOworCQkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfdmlkZW9fcGF0dGVybikpOwogCiAJLyogUmVhZCB0aGUgcmVxdWVzdGVkIGNvbG9yIGJpdCBkZXB0aCBhbmQgZHluYW1pYyByYW5nZSAoQnl0ZSAweDIzMikgKi8KIAlybGVuID0gZHJtX2RwX2RwY2RfcmVhZChsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1RfTUlTQzAsCkBAIC02MDEsMTEgKzUwMCwxMSBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQotCWxpbmstPnJlcXVlc3QudGVzdF9keW5fcmFuZ2UgPSBkeW5fcmFuZ2U7CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfZHluX3JhbmdlID0gZHluX3JhbmdlOwogCXByX2RlYnVnKCJsaW5rIGR5bmFtaWMgcmFuZ2UgPSAweCV4ICglcylcbiIsCi0JCWxpbmstPnJlcXVlc3QudGVzdF9keW5fcmFuZ2UsCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2R5bl9yYW5nZSwKIAkJZHBfbGlua19keW5hbWljX3JhbmdlX3RvX3N0cmluZygKLQkJCWxpbmstPnJlcXVlc3QudGVzdF9keW5fcmFuZ2UpKTsKKwkJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2R5bl9yYW5nZSkpOwogCiAJLyogQ29sb3IgYml0IGRlcHRoICovCiAJZGF0YSAmPSBEUF9URVNUX0JJVF9ERVBUSF9NQVNLOwpAQCAtNjE1LDEyOCArNTE0LDEwOSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JbGluay0+cmVxdWVzdC50ZXN0X2JpdF9kZXB0aCA9IGRhdGE7CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfYml0X2RlcHRoID0gZGF0YTsKIAlwcl9kZWJ1ZygibGluayBiaXQgZGVwdGggPSAweCV4ICglcylcbiIsCi0JCWxpbmstPnJlcXVlc3QudGVzdF9iaXRfZGVwdGgsCi0JCWRwX2xpbmtfYml0X2RlcHRoX3RvX3N0cmluZyhsaW5rLT5yZXF1ZXN0LnRlc3RfYml0X2RlcHRoKSk7CisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCwKKwkJZHBfbGlua19iaXRfZGVwdGhfdG9fc3RyaW5nKAorCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9iaXRfZGVwdGgpKTsKIAogCS8qIHJlc29sdXRpb24gdGltaW5nIHBhcmFtcyAqLwogCXJldCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9IX1RPVEFMX0hJLCAyLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF9oX3RvdGFsKTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3RvdGFsKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIHRlc3RfaF90b3RhbCAoRFBfVEVTVF9IX1RPVEFMX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfSF9UT1RBTCA9ICVkXG4iLCBsaW5rLT5yZXF1ZXN0LnRlc3RfaF90b3RhbCk7CisJcHJfZGVidWcoIlRFU1RfSF9UT1RBTCA9ICVkXG4iLCBsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3RvdGFsKTsKIAogCXJldCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9WX1RPVEFMX0hJLCAyLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF92X3RvdGFsKTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3RvdGFsKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIHRlc3Rfdl90b3RhbCAoRFBfVEVTVF9WX1RPVEFMX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfVl9UT1RBTCA9ICVkXG4iLCBsaW5rLT5yZXF1ZXN0LnRlc3Rfdl90b3RhbCk7CisJcHJfZGVidWcoIlRFU1RfVl9UT1RBTCA9ICVkXG4iLCBsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3RvdGFsKTsKIAogCXJldCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9IX1NUQVJUX0hJLCAyLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF9oX3N0YXJ0KTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3N0YXJ0KTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIHRlc3RfaF9zdGFydCAoRFBfVEVTVF9IX1NUQVJUX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfSF9TVEFSVCA9ICVkXG4iLCBsaW5rLT5yZXF1ZXN0LnRlc3RfaF9zdGFydCk7CisJcHJfZGVidWcoIlRFU1RfSF9TVEFSVCA9ICVkXG4iLCBsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9oX3N0YXJ0KTsKIAogCXJldCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczEobGluaywgRFBfVEVTVF9WX1NUQVJUX0hJLCAyLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF92X3N0YXJ0KTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3N0YXJ0KTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIHRlc3Rfdl9zdGFydCAoRFBfVEVTVF9WX1NUQVJUX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfVl9TVEFSVCA9ICVkXG4iLCBsaW5rLT5yZXF1ZXN0LnRlc3Rfdl9zdGFydCk7CisJcHJfZGVidWcoIlRFU1RfVl9TVEFSVCA9ICVkXG4iLCBsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X3N0YXJ0KTsKIAogCXJldCA9IGRwX2xpbmtfcGFyc2VfdGltaW5nX3BhcmFtczIobGluaywgRFBfVEVTVF9IU1lOQ19ISSwgMiwKLQkJCSZsaW5rLT5yZXF1ZXN0LnRlc3RfaHN5bmNfcG9sLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF9oc3luY193aWR0aCk7CisJCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaHN5bmNfcG9sLAorCQkJJmxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2hzeW5jX3dpZHRoKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIChEUF9URVNUX0hTWU5DX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfSFNZTkNfUE9MID0gJWRcbiIsIGxpbmstPnJlcXVlc3QudGVzdF9oc3luY19wb2wpOwotCXByX2RlYnVnKCJURVNUX0hTWU5DX1dJRFRIID0gJWRcbiIsIGxpbmstPnJlcXVlc3QudGVzdF9oc3luY193aWR0aCk7CisJcHJfZGVidWcoIlRFU1RfSFNZTkNfUE9MID0gJWRcbiIsCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2hzeW5jX3BvbCk7CisJcHJfZGVidWcoIlRFU1RfSFNZTkNfV0lEVEggPSAlZFxuIiwKKwkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaHN5bmNfd2lkdGgpOwogCiAJcmV0ID0gZHBfbGlua19wYXJzZV90aW1pbmdfcGFyYW1zMihsaW5rLCBEUF9URVNUX1ZTWU5DX0hJLCAyLAotCQkJJmxpbmstPnJlcXVlc3QudGVzdF92c3luY19wb2wsCi0JCQkmbGluay0+cmVxdWVzdC50ZXN0X3ZzeW5jX3dpZHRoKTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92c3luY19wb2wsCisJCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfdnN5bmNfd2lkdGgpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcGFyc2UgKERQX1RFU1RfVlNZTkNfSEkpXG4iKTsKIAkJZ290byBleGl0OwogCX0KLQlwcl9kZWJ1ZygiVEVTVF9WU1lOQ19QT0wgPSAlZFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X3ZzeW5jX3BvbCk7Ci0JcHJfZGVidWcoIlRFU1RfVlNZTkNfV0lEVEggPSAlZFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X3ZzeW5jX3dpZHRoKTsKKwlwcl9kZWJ1ZygiVEVTVF9WU1lOQ19QT0wgPSAlZFxuIiwKKwkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfdnN5bmNfcG9sKTsKKwlwcl9kZWJ1ZygiVEVTVF9WU1lOQ19XSURUSCA9ICVkXG4iLAorCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92c3luY193aWR0aCk7CiAKIAlyZXQgPSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMxKGxpbmssIERQX1RFU1RfSF9XSURUSF9ISSwgMiwKLQkJCSZsaW5rLT5yZXF1ZXN0LnRlc3RfaF93aWR0aCk7CisJCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaF93aWR0aCk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoImZhaWxlZCB0byBwYXJzZSB0ZXN0X2hfd2lkdGggKERQX1RFU1RfSF9XSURUSF9ISSlcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQotCXByX2RlYnVnKCJURVNUX0hfV0lEVEggPSAlZFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X2hfd2lkdGgpOworCXByX2RlYnVnKCJURVNUX0hfV0lEVEggPSAlZFxuIiwgbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfaF93aWR0aCk7CiAKIAlyZXQgPSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMxKGxpbmssIERQX1RFU1RfVl9IRUlHSFRfSEksIDIsCi0JCQkmbGluay0+cmVxdWVzdC50ZXN0X3ZfaGVpZ2h0KTsKKwkJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X2hlaWdodCk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoImZhaWxlZCB0byBwYXJzZSB0ZXN0X3ZfaGVpZ2h0IChEUF9URVNUX1ZfSEVJR0hUX0hJKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfVl9IRUlHSFQgPSAlZFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X3ZfaGVpZ2h0KTsKKwlwcl9kZWJ1ZygiVEVTVF9WX0hFSUdIVCA9ICVkXG4iLAorCQlsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF92X2hlaWdodCk7CiAKIAlyZXQgPSBkcF9saW5rX3BhcnNlX3RpbWluZ19wYXJhbXMzKGxpbmssIERQX1RFU1RfTUlTQzEsCi0JCSZsaW5rLT5yZXF1ZXN0LnRlc3RfcnJfZCk7Ci0JbGluay0+cmVxdWVzdC50ZXN0X3JyX2QgJj0gRFBfVEVTVF9SRUZSRVNIX0RFTk9NSU5BVE9SOworCQkmbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfcnJfZCk7CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfcnJfZCAmPSBEUF9URVNUX1JFRlJFU0hfREVOT01JTkFUT1I7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoImZhaWxlZCB0byBwYXJzZSB0ZXN0X3JyX2QgKERQX1RFU1RfTUlTQzEpXG4iKTsKIAkJZ290byBleGl0OwogCX0KLQlwcl9kZWJ1ZygiVEVTVF9SRUZSRVNIX0RFTk9NSU5BVE9SID0gJWRcbiIsIGxpbmstPnJlcXVlc3QudGVzdF9ycl9kKTsKKwlwcl9kZWJ1ZygiVEVTVF9SRUZSRVNIX0RFTk9NSU5BVE9SID0gJWRcbiIsCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3JyX2QpOwogCiAJcmV0ID0gZHBfbGlua19wYXJzZV90aW1pbmdfcGFyYW1zMyhsaW5rLCBEUF9URVNUX1JFRlJFU0hfUkFURV9OVU1FUkFUT1IsCi0JCSZsaW5rLT5yZXF1ZXN0LnRlc3RfcnJfbik7CisJCSZsaW5rLT5kcF9saW5rLnRlc3RfdmlkZW8udGVzdF9ycl9uKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHBhcnNlIHRlc3RfcnJfbiAoRFBfVEVTVF9SRUZSRVNIX1JBVEVfTlVNRVJBVE9SKVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHJfZGVidWcoIlRFU1RfUkVGUkVTSF9OVU1FUkFUT1IgPSAlZFxuIiwgbGluay0+cmVxdWVzdC50ZXN0X3JyX24pOworCXByX2RlYnVnKCJURVNUX1JFRlJFU0hfTlVNRVJBVE9SID0gJWRcbiIsCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X3JyX24pOwogZXhpdDoKIAlyZXR1cm4gcmV0OwogfQogCiAvKioKLSAqIGRwX2xpbmtfaXNfbGlua19yYXRlX3ZhbGlkKCkgLSB2YWxpZGF0ZXMgdGhlIGxpbmsgcmF0ZQotICogQGxhbmVfcmF0ZTogbGluayByYXRlIHJlcXVlc3RlZCBieSB0aGUgc2luawotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWVzdGVkIGxpbmsgcmF0ZSBpcyBzdXBwb3J0ZWQuCi0gKi8KLXN0YXRpYyBib29sIGRwX2xpbmtfaXNfbGlua19yYXRlX3ZhbGlkKHUzMiBid19jb2RlKQotewotCXJldHVybiAoKGJ3X2NvZGUgPT0gRFBfTElOS19CV18xXzYyKSB8fAotCQkoYndfY29kZSA9PSBEUF9MSU5LX0JXXzJfNykgfHwKLQkJKGJ3X2NvZGUgPT0gRFBfTElOS19CV181XzQpIHx8Ci0JCShid19jb2RlID09IERQX0xJTktfUkFURV84MTApKTsKLX0KLQotLyoqCi0gKiBkcF9saW5rX2lzX2xhbmVfY291bnRfdmFsaWQoKSAtIHZhbGlkYXRlcyB0aGUgbGFuZSBjb3VudAotICogQGxhbmVfY291bnQ6IGxhbmUgY291bnQgcmVxdWVzdGVkIGJ5IHRoZSBzaW5rCi0gKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgbGFuZSBjb3VudCBpcyBzdXBwb3J0ZWQuCi0gKi8KLXN0YXRpYyBib29sIGRwX2xpbmtfaXNfbGFuZV9jb3VudF92YWxpZCh1MzIgbGFuZV9jb3VudCkKLXsKLQlyZXR1cm4gKGxhbmVfY291bnQgPT0gRFBfTEFORV9DT1VOVF8xKSB8fAotCQkobGFuZV9jb3VudCA9PSBEUF9MQU5FX0NPVU5UXzIpIHx8Ci0JCShsYW5lX2NvdW50ID09IERQX0xBTkVfQ09VTlRfNCk7Ci19Ci0KLS8qKgogICogZHBfbGlua19wYXJzZV9saW5rX3RyYWluaW5nX3BhcmFtcygpIC0gcGFyc2VzIGxpbmsgdHJhaW5pbmcgcGFyYW1ldGVycyBmcm9tCiAgKiBEUENECiAgKiBAbGluazogRGlzcGxheSBQb3J0IERyaXZlciBkYXRhCkBAIC03NjEsNyArNjQxLDcgQEAKIAl9CiAJZGF0YSA9IGJwOwogCi0JaWYgKCFkcF9saW5rX2lzX2xpbmtfcmF0ZV92YWxpZChkYXRhKSkgeworCWlmICghaXNfbGlua19yYXRlX3ZhbGlkKGRhdGEpKSB7CiAJCXByX2VycigiaW52YWxpZCBsaW5rIHJhdGUgPSAweCV4XG4iLCBkYXRhKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwpAQCAtNzgwLDcgKzY2MCw3IEBACiAJZGF0YSA9IGJwOwogCWRhdGEgJj0gMHgxRjsKIAotCWlmICghZHBfbGlua19pc19sYW5lX2NvdW50X3ZhbGlkKGRhdGEpKSB7CisJaWYgKCFpc19sYW5lX2NvdW50X3ZhbGlkKGRhdGEpKSB7CiAJCXByX2VycigiaW52YWxpZCBsYW5lIGNvdW50ID0gMHgleFxuIiwgZGF0YSk7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdDsKQEAgLTgzMiw3ICs3MTIsNyBAQAogCiAJZGF0YSA9IGJwOwogCi0JbGluay0+cmVxdWVzdC5waHlfdGVzdF9wYXR0ZXJuX3NlbCA9IGRhdGE7CisJbGluay0+ZHBfbGluay5waHlfcGFyYW1zLnBoeV90ZXN0X3BhdHRlcm5fc2VsID0gZGF0YTsKIAogCXByX2RlYnVnKCJwaHlfdGVzdF9wYXR0ZXJuX3NlbCA9ICVzXG4iLAogCQkJZHBfbGlua19nZXRfcGh5X3Rlc3RfcGF0dGVybihkYXRhKSk7CkBAIC04OTEsNiArNzcxLDExIEBACiAJCWRwX2xpbmtfaXNfdmlkZW9fYXVkaW9fdGVzdF9yZXF1ZXN0ZWQodGVzdF9yZXF1ZXN0ZWQpOwogfQogCitzdGF0aWMgYm9vbCBkcF9saW5rX2lzX3Rlc3RfZWRpZF9yZWFkKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCit7CisJcmV0dXJuIChsaW5rLT5yZXF1ZXN0LnRlc3RfcmVxdWVzdGVkID09IERQX1RFU1RfTElOS19FRElEX1JFQUQpOworfQorCiAvKioKICAqIGRwX3NpbmtfcGFyc2VfdGVzdF9yZXF1ZXN0KCkgLSBwYXJzZXMgbGluayByZXF1ZXN0IHBhcmFtZXRlcnMgZnJvbSBzaW5rCiAgKiBAbGluazogRGlzcGxheSBQb3J0IERyaXZlciBkYXRhCkBAIC05NzIsMTAgKzg1NywxNSBAQAogCSAqIFNlbmQgYSBEUF9URVNUX0FDSyBpZiBhbGwgbGluayBwYXJhbWV0ZXJzIGFyZSB2YWxpZCwgb3RoZXJ3aXNlIHNlbmQKIAkgKiBhIERQX1RFU1RfTkFLLgogCSAqLwotCWlmIChyZXQpCi0JCWxpbmstPnJlcXVlc3QucmVzcG9uc2UgPSBEUF9URVNUX05BSzsKLQllbHNlCi0JCWxpbmstPnJlcXVlc3QucmVzcG9uc2UgPSBEUF9URVNUX0FDSzsKKwlpZiAocmV0KSB7CisJCWxpbmstPmRwX2xpbmsudGVzdF9yZXNwb25zZSA9IERQX1RFU1RfTkFLOworCX0gZWxzZSB7CisJCWlmICghZHBfbGlua19pc190ZXN0X2VkaWRfcmVhZChsaW5rKSkKKwkJCWxpbmstPmRwX2xpbmsudGVzdF9yZXNwb25zZSA9IERQX1RFU1RfQUNLOworCQllbHNlCisJCQlsaW5rLT5kcF9saW5rLnRlc3RfcmVzcG9uc2UgPQorCQkJCURQX1RFU1RfRURJRF9DSEVDS1NVTV9XUklURTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTg3LDQ2ICs4NzcsNDkgQEAKICAqIChCeXRlIDB4MjAwKSwgYW5kIHdoZXRoZXIgYWxsIHRoZSBzaW5rIGRldmljZXMgY29ubmVjdGVkIGhhdmUgQ29udGVudAogICogUHJvdGVjdGlvbiBlbmFibGVkLgogICovCi1zdGF0aWMgdm9pZCBkcF9saW5rX3BhcnNlX3NpbmtfY291bnQoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKK3N0YXRpYyBpbnQgZHBfbGlua19wYXJzZV9zaW5rX2NvdW50KHN0cnVjdCBkcF9saW5rICpkcF9saW5rKQogewotCXU4IGJwOwotCXU4IGRhdGE7CiAJaW50IHJsZW47CiAJaW50IGNvbnN0IHBhcmFtX2xlbiA9IDB4MTsKKwlzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rID0gY29udGFpbmVyX29mKGRwX2xpbmssCisJCQlzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKIAogCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfU0lOS19DT1VOVCwKLQkJCSZicCwgcGFyYW1fbGVuKTsKKwkJCSZsaW5rLT5kcF9saW5rLnNpbmtfY291bnQuY291bnQsIHBhcmFtX2xlbik7CiAJaWYgKHJsZW4gPCBwYXJhbV9sZW4pIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCBzaW5rIGNvdW50XG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkYXRhID0gYnA7Ci0KKwlsaW5rLT5kcF9saW5rLnNpbmtfY291bnQuY3BfcmVhZHkgPQorCQlsaW5rLT5kcF9saW5rLnNpbmtfY291bnQuY291bnQgJiBEUF9TSU5LX0NQX1JFQURZOwogCS8qIEJJVCA3LCBCSVQgNTowICovCi0JbGluay0+c2lua19jb3VudC5jb3VudCA9IChkYXRhICYgQklUKDcpKSA8PCA2IHwgKGRhdGEgJiAweDYzKTsKLQkvKiBCSVQgNiovCi0JbGluay0+c2lua19jb3VudC5jcF9yZWFkeSA9IGRhdGEgJiBCSVQoNik7CisJbGluay0+ZHBfbGluay5zaW5rX2NvdW50LmNvdW50ID0KKwkJRFBfR0VUX1NJTktfQ09VTlQobGluay0+ZHBfbGluay5zaW5rX2NvdW50LmNvdW50KTsKIAogCXByX2RlYnVnKCJzaW5rX2NvdW50ID0gMHgleCwgY3BfcmVhZHkgPSAweCV4XG4iLAotCQlsaW5rLT5zaW5rX2NvdW50LmNvdW50LCBsaW5rLT5zaW5rX2NvdW50LmNwX3JlYWR5KTsKKwkJbGluay0+ZHBfbGluay5zaW5rX2NvdW50LmNvdW50LAorCQlsaW5rLT5kcF9saW5rLnNpbmtfY291bnQuY3BfcmVhZHkpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkcF9saW5rX3BhcnNlX3Npbmtfc3RhdHVzX2ZpZWxkKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCiB7CiAJaW50IGxlbiA9IDA7CiAKLQlkcF9saW5rX3BhcnNlX3NpbmtfY291bnQobGluayk7Ci0JZHBfbGlua19wYXJzZV9yZXF1ZXN0KGxpbmspOworCWxpbmstPnByZXZfc2lua19jb3VudCA9IGxpbmstPmRwX2xpbmsuc2lua19jb3VudC5jb3VudDsKKwlkcF9saW5rX3BhcnNlX3NpbmtfY291bnQoJmxpbmstPmRwX2xpbmspOworCiAJbGVuID0gZHJtX2RwX2RwY2RfcmVhZF9saW5rX3N0YXR1cyhsaW5rLT5hdXgtPmRybV9hdXgsCiAJCWxpbmstPmxpbmtfc3RhdHVzKTsKIAlpZiAobGVuIDwgRFBfTElOS19TVEFUVVNfU0laRSkKIAkJcHJfZXJyKCJEUCBsaW5rIHN0YXR1cyByZWFkIGZhaWxlZFxuIik7CisJZHBfbGlua19wYXJzZV9yZXF1ZXN0KGxpbmspOwogfQogCiBzdGF0aWMgYm9vbCBkcF9saW5rX2lzX2xpbmtfdHJhaW5pbmdfcmVxdWVzdGVkKHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCiB7Ci0JcmV0dXJuIChsaW5rLT5yZXF1ZXN0LnRlc3RfcmVxdWVzdGVkID09IERQX1RFU1RfTElOS19QSFlfVEVTVF9QQVRURVJOKTsKKwlyZXR1cm4gKGxpbmstPnJlcXVlc3QudGVzdF9yZXF1ZXN0ZWQgPT0gRFBfVEVTVF9MSU5LX1RSQUlOSU5HKTsKIH0KIAogLyoqCkBAIC0xMDQ2LDIyICs5MzksNzMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiJXMgbGluayByYXRlID0gMHgleCwgbGFuZSBjb3VudCA9IDB4JXhcbiIsCi0JCQlkcF9saW5rX2dldF90ZXN0X25hbWUoRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4pLAorCQkJZHBfbGlua19nZXRfdGVzdF9uYW1lKERQX1RFU1RfTElOS19UUkFJTklORyksCiAJCQlsaW5rLT5yZXF1ZXN0LnRlc3RfbGlua19yYXRlLAogCQkJbGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQpOwogCi0JbGluay0+ZHBfbGluay5sYW5lX2NvdW50ID0gbGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQ7Ci0JbGluay0+ZHBfbGluay5id19jb2RlID0gbGluay0+cmVxdWVzdC50ZXN0X2xpbmtfcmF0ZTsKKwlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmxhbmVfY291bnQgPSBsaW5rLT5yZXF1ZXN0LnRlc3RfbGFuZV9jb3VudDsKKwlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmJ3X2NvZGUgPSBsaW5rLT5yZXF1ZXN0LnRlc3RfbGlua19yYXRlOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sIGRwX2xpbmtfcGh5X3BhdHRlcm5fcmVxdWVzdGVkKHN0cnVjdCBkcF9saW5rICpkcF9saW5rKQorc3RhdGljIHZvaWQgZHBfbGlua19zZW5kX3Rlc3RfcmVzcG9uc2Uoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspCiB7Ci0Jc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluayA9IGNvbnRhaW5lcl9vZihkcF9saW5rLAotCQkJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSwgZHBfbGluayk7CisJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluayA9IE5VTEw7CisJdTMyIGNvbnN0IHJlc3BvbnNlX2xlbiA9IDB4MTsKIAotCXJldHVybiAobGluay0+cmVxdWVzdC50ZXN0X3JlcXVlc3RlZCA9PSBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVSTik7CisJaWYgKCFkcF9saW5rKSB7CisJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7CisJCXJldHVybjsKKwl9CisKKwlsaW5rID0gY29udGFpbmVyX29mKGRwX2xpbmssIHN0cnVjdCBkcF9saW5rX3ByaXZhdGUsIGRwX2xpbmspOworCisJZHJtX2RwX2RwY2Rfd3JpdGUobGluay0+YXV4LT5kcm1fYXV4LCBEUF9URVNUX1JFU1BPTlNFLAorCQkJJmRwX2xpbmstPnRlc3RfcmVzcG9uc2UsIHJlc3BvbnNlX2xlbik7Cit9CisKK3N0YXRpYyBpbnQgZHBfbGlua19wc21fY29uZmlnKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLAorCXN0cnVjdCBkcm1fZHBfbGluayAqbGlua19pbmZvLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHBfbGlua19wcml2YXRlICpsaW5rID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZHBfbGluaykgeworCQlwcl9lcnIoImludmFsaWQgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGluayA9IGNvbnRhaW5lcl9vZihkcF9saW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKKworCWlmIChlbmFibGUpCisJCXJldCA9IGRybV9kcF9saW5rX3Bvd2VyX2Rvd24obGluay0+YXV4LT5kcm1fYXV4LCBsaW5rX2luZm8pOworCWVsc2UKKwkJcmV0ID0gZHJtX2RwX2xpbmtfcG93ZXJfdXAobGluay0+YXV4LT5kcm1fYXV4LCBsaW5rX2luZm8pOworCisJaWYgKHJldCkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gJXMgbG93IHBvd2VyIG1vZGVcbiIsCisJCQkoZW5hYmxlID8gImVudGVyIiA6ICJleGl0IikpOworCWVsc2UKKwkJZHBfbGluay0+cHNtX2VuYWJsZWQgPSBlbmFibGU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkcF9saW5rX3NlbmRfZWRpZF9jaGVja3N1bShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTggY2hlY2tzdW0pCit7CisJc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluayA9IE5VTEw7CisJdTMyIGNvbnN0IHJlc3BvbnNlX2xlbiA9IDB4MTsKKworCWlmICghZHBfbGluaykgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm47CisJfQorCisJbGluayA9IGNvbnRhaW5lcl9vZihkcF9saW5rLCBzdHJ1Y3QgZHBfbGlua19wcml2YXRlLCBkcF9saW5rKTsKKworCWRybV9kcF9kcGNkX3dyaXRlKGxpbmstPmF1eC0+ZHJtX2F1eCwgRFBfVEVTVF9FRElEX0NIRUNLU1VNLAorCQkJJmNoZWNrc3VtLCByZXNwb25zZV9sZW4pOwogfQogCiBzdGF0aWMgaW50IGRwX2xpbmtfcGFyc2VfdnhfcHgoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKQEAgLTExMjcsMTAgKzEwNzEsMTEgQEAKIAkgKiB2ZWN0b3IuCiAJICovCiAJcHJfZGVidWcoIkN1cnJlbnQ6IHZfbGV2ZWwgPSAweCV4LCBwX2xldmVsID0gMHgleFxuIiwKLQkJCWxpbmstPmRwX2xpbmsudl9sZXZlbCwgbGluay0+ZHBfbGluay5wX2xldmVsKTsKKwkJCWxpbmstPmRwX2xpbmsucGh5X3BhcmFtcy52X2xldmVsLAorCQkJbGluay0+ZHBfbGluay5waHlfcGFyYW1zLnBfbGV2ZWwpOwogCXByX2RlYnVnKCJSZXF1ZXN0ZWQ6IHZfbGV2ZWwgPSAweCV4LCBwX2xldmVsID0gMHgleFxuIiwgdjAsIHAwKTsKLQlsaW5rLT5kcF9saW5rLnZfbGV2ZWwgPSB2MDsKLQlsaW5rLT5kcF9saW5rLnBfbGV2ZWwgPSBwMDsKKwlsaW5rLT5kcF9saW5rLnBoeV9wYXJhbXMudl9sZXZlbCA9IHYwOworCWxpbmstPmRwX2xpbmsucGh5X3BhcmFtcy5wX2xldmVsID0gcDA7CiAKIAlwcl9kZWJ1ZygiU3VjY2Vzc1xuIik7CiBlbmQ6CkBAIC0xMTUwLDE0ICsxMDk1LDE2IEBACiB7CiAJdTMyIHRlc3RfbGlua19yYXRlID0gMCwgdGVzdF9sYW5lX2NvdW50ID0gMDsKIAotCWlmICghZHBfbGlua19waHlfcGF0dGVybl9yZXF1ZXN0ZWQoJmxpbmstPmRwX2xpbmspKQorCWlmICghKGxpbmstPnJlcXVlc3QudGVzdF9yZXF1ZXN0ZWQgJiBEUF9URVNUX0xJTktfUEhZX1RFU1RfUEFUVEVSTikpIHsKKwkJcHJfZGVidWcoIm5vIHBoeSB0ZXN0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJdGVzdF9saW5rX3JhdGUgPSBsaW5rLT5yZXF1ZXN0LnRlc3RfbGlua19yYXRlOwogCXRlc3RfbGFuZV9jb3VudCA9IGxpbmstPnJlcXVlc3QudGVzdF9sYW5lX2NvdW50OwogCi0JaWYgKCFkcF9saW5rX2lzX2xpbmtfcmF0ZV92YWxpZCh0ZXN0X2xpbmtfcmF0ZSkgfHwKLQkJIWRwX2xpbmtfaXNfbGFuZV9jb3VudF92YWxpZCh0ZXN0X2xhbmVfY291bnQpKSB7CisJaWYgKCFpc19saW5rX3JhdGVfdmFsaWQodGVzdF9saW5rX3JhdGUpIHx8CisJCSFpc19sYW5lX2NvdW50X3ZhbGlkKHRlc3RfbGFuZV9jb3VudCkpIHsKIAkJcHJfZXJyKCJJbnZhbGlkIHBhcmFtczogbGluayByYXRlID0gMHgleCwgbGFuZSBjb3VudCA9IDB4JXhcbiIsCiAJCQkJdGVzdF9saW5rX3JhdGUsIHRlc3RfbGFuZV9jb3VudCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTE2NSw4ICsxMTEyLDE1IEBACiAKIAlwcl9kZWJ1Zygic3RhcnRcbiIpOwogCi0JbGluay0+ZHBfbGluay5sYW5lX2NvdW50ID0gbGluay0+cmVxdWVzdC50ZXN0X2xhbmVfY291bnQ7Ci0JbGluay0+ZHBfbGluay5id19jb2RlID0gbGluay0+cmVxdWVzdC50ZXN0X2xpbmtfcmF0ZTsKKwlwcl9pbmZvKCJDdXJyZW50OiBid19jb2RlID0gMHgleCwgbGFuZSBjb3VudCA9IDB4JXhcbiIsCisJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmJ3X2NvZGUsCisJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmxhbmVfY291bnQpOworCisJcHJfaW5mbygiUmVxdWVzdGVkOiBid19jb2RlID0gMHgleCwgbGFuZSBjb3VudCA9IDB4JXhcbiIsCisJCQl0ZXN0X2xpbmtfcmF0ZSwgdGVzdF9sYW5lX2NvdW50KTsKKworCWxpbmstPmRwX2xpbmsubGlua19wYXJhbXMubGFuZV9jb3VudCA9IGxpbmstPnJlcXVlc3QudGVzdF9sYW5lX2NvdW50OworCWxpbmstPmRwX2xpbmsubGlua19wYXJhbXMuYndfY29kZSA9IGxpbmstPnJlcXVlc3QudGVzdF9saW5rX3JhdGU7CiAKIAlkcF9saW5rX3BhcnNlX3Z4X3B4KGxpbmspOwogCkBAIC0xMTk2LDE2ICsxMTUwLDE2IEBACiAJaWYgKCEoZ2V0X2xpbmtfc3RhdHVzKGxpbmstPmxpbmtfc3RhdHVzLCBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVEKSAmCiAJCURQX0xJTktfU1RBVFVTX1VQREFURUQpIHx8IC8qIGxpbmsgc3RhdHVzIHVwZGF0ZWQgKi8KIAkJKGRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rLT5saW5rX3N0YXR1cywKLQkJCWxpbmstPmRwX2xpbmsubGFuZV9jb3VudCkgJiYKKwkJCWxpbmstPmRwX2xpbmsubGlua19wYXJhbXMubGFuZV9jb3VudCkgJiYKIAkgICAgIGRybV9kcF9jaGFubmVsX2VxX29rKGxpbmstPmxpbmtfc3RhdHVzLAotCQkJbGluay0+ZHBfbGluay5sYW5lX2NvdW50KSkpCisJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmxhbmVfY291bnQpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiY2hhbm5lbF9lcV9kb25lID0gJWQsIGNsb2NrX3JlY292ZXJ5X2RvbmUgPSAlZFxuIiwKIAkJCWRybV9kcF9jbG9ja19yZWNvdmVyeV9vayhsaW5rLT5saW5rX3N0YXR1cywKLQkJCWxpbmstPmRwX2xpbmsubGFuZV9jb3VudCksCisJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmxhbmVfY291bnQpLAogCQkJZHJtX2RwX2Nsb2NrX3JlY292ZXJ5X29rKGxpbmstPmxpbmtfc3RhdHVzLAotCQkJbGluay0+ZHBfbGluay5sYW5lX2NvdW50KSk7CisJCQlsaW5rLT5kcF9saW5rLmxpbmtfcGFyYW1zLmxhbmVfY291bnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIxNiw2ICsxMTcwLDkgQEAKIAkJRFBfRE9XTlNUUkVBTV9QT1JUX1NUQVRVU19DSEFOR0VEKSAvKiBwb3J0IHN0YXR1cyBjaGFuZ2VkICovCiAJCXJldHVybiB0cnVlOwogCisJaWYgKGxpbmstPnByZXZfc2lua19jb3VudCAhPSBsaW5rLT5kcF9saW5rLnNpbmtfY291bnQuY291bnQpCisJCXJldHVybiB0cnVlOworCiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0xMjM1LDYgKzExOTIsOSBAQAogCWlmICghZHBfbGlua19pc19kc19wb3J0X3N0YXR1c19jaGFuZ2VkKGxpbmspKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIHJlc2V0IHByZXZfc2lua19jb3VudCAqLworCWxpbmstPnByZXZfc2lua19jb3VudCA9IGxpbmstPmRwX2xpbmsuc2lua19jb3VudC5jb3VudDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMjY3LDEwICsxMjI3LDExIEBACiAKIAlwcl9kZWJ1ZygiJXM6IGJpdCBkZXB0aD0lZCglZCBicHApIHBhdHRlcm49JXNcbiIsCiAJCWRwX2xpbmtfZ2V0X3Rlc3RfbmFtZShEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTiksCi0JCWxpbmstPnJlcXVlc3QudGVzdF9iaXRfZGVwdGgsCi0JCWRwX2xpbmtfYml0X2RlcHRoX3RvX2JwcChsaW5rLT5yZXF1ZXN0LnRlc3RfYml0X2RlcHRoKSwKKwkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfYml0X2RlcHRoLAorCQlkcF9saW5rX2JpdF9kZXB0aF90b19icHAoCisJCWxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2JpdF9kZXB0aCksCiAJCWRwX2xpbmtfdmlkZW9fcGF0dGVybl90b19zdHJpbmcoCi0JCQlsaW5rLT5yZXF1ZXN0LnRlc3RfdmlkZW9fcGF0dGVybikpOworCQkJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfdmlkZW9fcGF0dGVybikpOwogCiAJcmV0dXJuIDA7CiBlbmQ6CkBAIC0xMjkzLDIyICsxMjU0LDIyIEBACiAKIAlwcl9kZWJ1Zygic2FtcGxpbmdfcmF0ZT0lcywgY2hhbm5lbF9jb3VudD0lZCwgcGF0dGVybl90eXBlPSVzXG4iLAogCQlkcF9saW5rX2dldF9hdWRpb19zYW1wbGVfcmF0ZSgKLQkJCWxpbmstPnJlcXVlc3QudGVzdF9hdWRpb19zYW1wbGluZ19yYXRlKSwKLQkJbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX2NoYW5uZWxfY291bnQsCisJCQlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19zYW1wbGluZ19yYXRlKSwKKwkJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fY2hhbm5lbF9jb3VudCwKIAkJZHBfbGlua19nZXRfYXVkaW9fdGVzdF9wYXR0ZXJuKAotCQkJbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3BhdHRlcm5fdHlwZSkpOworCQkJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fcGF0dGVybl90eXBlKSk7CiAKIAlwcl9kZWJ1ZygiYXVkaW9fcGVyaW9kOiBjaDE9MHgleCwgY2gyPTB4JXgsIGNoMz0weCV4LCBjaDQ9MHgleFxuIiwKLQkJbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3BlcmlvZF9jaF8xLAotCQlsaW5rLT5yZXF1ZXN0LnRlc3RfYXVkaW9fcGVyaW9kX2NoXzIsCi0JCWxpbmstPnJlcXVlc3QudGVzdF9hdWRpb19wZXJpb2RfY2hfMywKLQkJbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3BlcmlvZF9jaF80KTsKKwkJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fcGVyaW9kX2NoXzEsCisJCWxpbmstPmRwX2xpbmsudGVzdF9hdWRpby50ZXN0X2F1ZGlvX3BlcmlvZF9jaF8yLAorCQlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19wZXJpb2RfY2hfMywKKwkJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fcGVyaW9kX2NoXzQpOwogCiAJcHJfZGVidWcoImF1ZGlvX3BlcmlvZDogY2g1PTB4JXgsIGNoNj0weCV4LCBjaDc9MHgleCwgY2g4PTB4JXhcbiIsCi0JCWxpbmstPnJlcXVlc3QudGVzdF9hdWRpb19wZXJpb2RfY2hfNSwKLQkJbGluay0+cmVxdWVzdC50ZXN0X2F1ZGlvX3BlcmlvZF9jaF82LAotCQlsaW5rLT5yZXF1ZXN0LnRlc3RfYXVkaW9fcGVyaW9kX2NoXzcsCi0JCWxpbmstPnJlcXVlc3QudGVzdF9hdWRpb19wZXJpb2RfY2hfOCk7CisJCWxpbmstPmRwX2xpbmsudGVzdF9hdWRpby50ZXN0X2F1ZGlvX3BlcmlvZF9jaF81LAorCQlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8udGVzdF9hdWRpb19wZXJpb2RfY2hfNiwKKwkJbGluay0+ZHBfbGluay50ZXN0X2F1ZGlvLnRlc3RfYXVkaW9fcGVyaW9kX2NoXzcsCisJCWxpbmstPmRwX2xpbmsudGVzdF9hdWRpby50ZXN0X2F1ZGlvX3BlcmlvZF9jaF84KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMxNiw4ICsxMjc3LDEyIEBACiBzdGF0aWMgdm9pZCBkcF9saW5rX3Jlc2V0X2RhdGEoc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKIHsKIAlsaW5rLT5yZXF1ZXN0ID0gKGNvbnN0IHN0cnVjdCBkcF9saW5rX3JlcXVlc3QpeyAwIH07Ci0JbGluay0+cmVxdWVzdC50ZXN0X2JpdF9kZXB0aCA9IERQX1RFU1RfQklUX0RFUFRIX1VOS05PV047Ci0JbGluay0+ZHBfbGluay50ZXN0X3JlcXVlc3RlZCA9IDA7CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvID0gKGNvbnN0IHN0cnVjdCBkcF9saW5rX3Rlc3RfdmlkZW8peyAwIH07CisJbGluay0+ZHBfbGluay50ZXN0X3ZpZGVvLnRlc3RfYml0X2RlcHRoID0gRFBfVEVTVF9CSVRfREVQVEhfVU5LTk9XTjsKKwlsaW5rLT5kcF9saW5rLnRlc3RfYXVkaW8gPSAoY29uc3Qgc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyl7IDAgfTsKKwlsaW5rLT5kcF9saW5rLnBoeV9wYXJhbXMucGh5X3Rlc3RfcGF0dGVybl9zZWwgPSAwOworCWxpbmstPmRwX2xpbmsuc2lua19yZXF1ZXN0ID0gMDsKKwlsaW5rLT5kcF9saW5rLnRlc3RfcmVzcG9uc2UgPSAwOwogfQogCiAvKioKQEAgLTEzNDYsMzkgKzEzMTEsNDQgQEAKIAogCWRwX2xpbmtfcGFyc2Vfc2lua19zdGF0dXNfZmllbGQobGluayk7CiAKLQlyZXQgPSBkcF9saW5rX3Byb2Nlc3NfbGlua190cmFpbmluZ19yZXF1ZXN0KGxpbmspOwotCWlmICghcmV0KSB7Ci0JCWRwX2xpbmstPnRlc3RfcmVxdWVzdGVkIHw9IERQX1RFU1RfTElOS19UUkFJTklORzsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IGRwX2xpbmtfcHJvY2Vzc19waHlfdGVzdF9wYXR0ZXJuX3JlcXVlc3QobGluayk7Ci0JaWYgKCFyZXQpIHsKLQkJZHBfbGluay0+dGVzdF9yZXF1ZXN0ZWQgfD0gRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk47Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyZXQgPSBkcF9saW5rX3Byb2Nlc3NfbGlua19zdGF0dXNfdXBkYXRlKGxpbmspOwotCWlmICghcmV0KSB7Ci0JCWRwX2xpbmstPnRlc3RfcmVxdWVzdGVkIHw9IERQX0xJTktfU1RBVFVTX1VQREFURUQ7CisJaWYgKGRwX2xpbmtfaXNfdGVzdF9lZGlkX3JlYWQobGluaykpIHsKKwkJZHBfbGluay0+c2lua19yZXF1ZXN0IHw9IERQX1RFU1RfTElOS19FRElEX1JFQUQ7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlyZXQgPSBkcF9saW5rX3Byb2Nlc3NfZHNfcG9ydF9zdGF0dXNfY2hhbmdlKGxpbmspOwogCWlmICghcmV0KSB7Ci0JCWRwX2xpbmstPnRlc3RfcmVxdWVzdGVkIHw9IERTX1BPUlRfU1RBVFVTX0NIQU5HRUQ7CisJCWRwX2xpbmstPnNpbmtfcmVxdWVzdCB8PSBEU19QT1JUX1NUQVRVU19DSEFOR0VEOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gZHBfbGlua19wcm9jZXNzX2xpbmtfdHJhaW5pbmdfcmVxdWVzdChsaW5rKTsKKwlpZiAoIXJldCkgeworCQlkcF9saW5rLT5zaW5rX3JlcXVlc3QgfD0gRFBfVEVTVF9MSU5LX1RSQUlOSU5HOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gZHBfbGlua19wcm9jZXNzX3BoeV90ZXN0X3BhdHRlcm5fcmVxdWVzdChsaW5rKTsKKwlpZiAoIXJldCkgeworCQlkcF9saW5rLT5zaW5rX3JlcXVlc3QgfD0gRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk47CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyZXQgPSBkcF9saW5rX3Byb2Nlc3NfbGlua19zdGF0dXNfdXBkYXRlKGxpbmspOworCWlmICghcmV0KSB7CisJCWRwX2xpbmstPnNpbmtfcmVxdWVzdCB8PSBEUF9MSU5LX1NUQVRVU19VUERBVEVEOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJcmV0ID0gZHBfbGlua19wcm9jZXNzX3ZpZGVvX3BhdHRlcm5fcmVxdWVzdChsaW5rKTsKIAlpZiAoIXJldCkgewotCQlkcF9saW5rLT50ZXN0X3JlcXVlc3RlZCB8PSBEUF9URVNUX0xJTktfVklERU9fUEFUVEVSTjsKKwkJZHBfbGluay0+c2lua19yZXF1ZXN0IHw9IERQX1RFU1RfTElOS19WSURFT19QQVRURVJOOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJcmV0ID0gZHBfbGlua19wcm9jZXNzX2F1ZGlvX3BhdHRlcm5fcmVxdWVzdChsaW5rKTsKIAlpZiAoIXJldCkgewotCQlkcF9saW5rLT50ZXN0X3JlcXVlc3RlZCB8PSBEUF9URVNUX0xJTktfQVVESU9fUEFUVEVSTjsKKwkJZHBfbGluay0+c2lua19yZXF1ZXN0IHw9IERQX1RFU1RfTElOS19BVURJT19QQVRURVJOOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xNDAyLDcgKzEzNzIsNyBAQAogCiAJLyogdW5sZXNzIGEgdmlkZW8gcGF0dGVybiBDVFMgdGVzdCBpcyBvbmdvaW5nLCB1c2UgQ0VBX1ZFU0EgKi8KIAlpZiAoZHBfbGlua19pc192aWRlb19wYXR0ZXJuX3JlcXVlc3RlZChsaW5rKSkKLQkJZHIgPSBsaW5rLT5yZXF1ZXN0LnRlc3RfZHluX3JhbmdlOworCQlkciA9IGxpbmstPmRwX2xpbmsudGVzdF92aWRlby50ZXN0X2R5bl9yYW5nZTsKIAllbHNlCiAJCWRyID0gRFBfRFlOQU1JQ19SQU5HRV9SR0JfVkVTQTsKIApAQCAtMTQzNCw1MSArMTQwNCw1MiBAQAogCWxpbmsgPSBjb250YWluZXJfb2YoZHBfbGluaywgc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSwgZHBfbGluayk7CiAKIAkvKiB1c2UgdGhlIG1heCBsZXZlbCBhY3Jvc3MgbGFuZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZHBfbGluay0+bGFuZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRwX2xpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQ7IGkrKykgewogCQlkYXRhID0gZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF92b2x0YWdlKGxpbmtfc3RhdHVzLCBpKTsKIAkJcHJfZGVidWcoImxhbmU9JWQgcmVxX3ZvbHRhZ2Vfc3dpbmc9JWRcbiIsIGksIGRhdGEpOwogCQlpZiAobWF4IDwgZGF0YSkKIAkJCW1heCA9IGRhdGE7CiAJfQogCi0JZHBfbGluay0+dl9sZXZlbCA9IG1heCA+PiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOworCWRwX2xpbmstPnBoeV9wYXJhbXMudl9sZXZlbCA9IG1heCA+PiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX1NISUZUOwogCiAJLyogdXNlIHRoZSBtYXggbGV2ZWwgYWNyb3NzIGxhbmVzICovCiAJbWF4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgZHBfbGluay0+bGFuZV9jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGRwX2xpbmstPmxpbmtfcGFyYW1zLmxhbmVfY291bnQ7IGkrKykgewogCQlkYXRhID0gZHJtX2RwX2dldF9hZGp1c3RfcmVxdWVzdF9wcmVfZW1waGFzaXMobGlua19zdGF0dXMsIGkpOwogCQlwcl9kZWJ1ZygibGFuZT0lZCByZXFfcHJlX2VtcGhhc2lzPSVkXG4iLCBpLCBkYXRhKTsKIAkJaWYgKG1heCA8IGRhdGEpCiAJCQltYXggPSBkYXRhOwogCX0KIAotCWRwX2xpbmstPnBfbGV2ZWwgPSBtYXggPj4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTX1NISUZUOworCWRwX2xpbmstPnBoeV9wYXJhbXMucF9sZXZlbCA9IG1heCA+PiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfU0hJRlQ7CiAKIAkvKioKIAkgKiBBZGp1c3QgdGhlIHZvbHRhZ2Ugc3dpbmcgYW5kIHByZS1lbXBoYXNpcyBsZXZlbCBjb21iaW5hdGlvbiB0byB3aXRoaW4KIAkgKiB0aGUgYWxsb3dhYmxlIHJhbmdlLgogCSAqLwotCWlmIChkcF9saW5rLT52X2xldmVsID4gRFBfTElOS19WT0xUQUdFX01BWCkgeworCWlmIChkcF9saW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwgPiBEUF9MSU5LX1ZPTFRBR0VfTUFYKSB7CiAJCXByX2RlYnVnKCJSZXF1ZXN0ZWQgdlN3aW5nTGV2ZWw9JWQsIGNoYW5nZSB0byAlZFxuIiwKLQkJCQlkcF9saW5rLT52X2xldmVsLCBEUF9MSU5LX1ZPTFRBR0VfTUFYKTsKLQkJZHBfbGluay0+dl9sZXZlbCA9IERQX0xJTktfVk9MVEFHRV9NQVg7CisJCQlkcF9saW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwsIERQX0xJTktfVk9MVEFHRV9NQVgpOworCQlkcF9saW5rLT5waHlfcGFyYW1zLnZfbGV2ZWwgPSBEUF9MSU5LX1ZPTFRBR0VfTUFYOwogCX0KIAotCWlmIChkcF9saW5rLT5wX2xldmVsID4gRFBfTElOS19QUkVfRU1QSEFTSVNfTUFYKSB7CisJaWYgKGRwX2xpbmstPnBoeV9wYXJhbXMucF9sZXZlbCA+IERQX0xJTktfUFJFX0VNUEhBU0lTX01BWCkgewogCQlwcl9kZWJ1ZygiUmVxdWVzdGVkIHByZUVtcGhhc2lzTGV2ZWw9JWQsIGNoYW5nZSB0byAlZFxuIiwKLQkJCQlkcF9saW5rLT5wX2xldmVsLCBEUF9MSU5LX1BSRV9FTVBIQVNJU19NQVgpOwotCQlkcF9saW5rLT5wX2xldmVsID0gRFBfTElOS19QUkVfRU1QSEFTSVNfTUFYOworCQkJZHBfbGluay0+cGh5X3BhcmFtcy5wX2xldmVsLCBEUF9MSU5LX1BSRV9FTVBIQVNJU19NQVgpOworCQlkcF9saW5rLT5waHlfcGFyYW1zLnBfbGV2ZWwgPSBEUF9MSU5LX1BSRV9FTVBIQVNJU19NQVg7CiAJfQogCi0JaWYgKChkcF9saW5rLT5wX2xldmVsID4gRFBfTElOS19QUkVfRU1QSEFTSVNfTEVWRUxfMSkKLQkJCSYmIChkcF9saW5rLT52X2xldmVsID09IERQX0xJTktfVk9MVEFHRV9MRVZFTF8yKSkgeworCWlmICgoZHBfbGluay0+cGh5X3BhcmFtcy5wX2xldmVsID4gRFBfTElOS19QUkVfRU1QSEFTSVNfTEVWRUxfMSkKKwkJJiYgKGRwX2xpbmstPnBoeV9wYXJhbXMudl9sZXZlbCA9PSBEUF9MSU5LX1ZPTFRBR0VfTEVWRUxfMikpIHsKIAkJcHJfZGVidWcoIlJlcXVlc3RlZCBwcmVFbXBoYXNpc0xldmVsPSVkLCBjaGFuZ2UgdG8gJWRcbiIsCi0JCQkJZHBfbGluay0+cF9sZXZlbCwgRFBfTElOS19QUkVfRU1QSEFTSVNfTEVWRUxfMSk7Ci0JCWRwX2xpbmstPnBfbGV2ZWwgPSBEUF9MSU5LX1BSRV9FTVBIQVNJU19MRVZFTF8xOworCQkJZHBfbGluay0+cGh5X3BhcmFtcy5wX2xldmVsLAorCQkJRFBfTElOS19QUkVfRU1QSEFTSVNfTEVWRUxfMSk7CisJCWRwX2xpbmstPnBoeV9wYXJhbXMucF9sZXZlbCA9IERQX0xJTktfUFJFX0VNUEhBU0lTX0xFVkVMXzE7CiAJfQogCiAJcHJfZGVidWcoImFkanVzdGVkOiB2X2xldmVsPSVkLCBwX2xldmVsPSVkXG4iLAotCQlkcF9saW5rLT52X2xldmVsLCBkcF9saW5rLT5wX2xldmVsKTsKKwkJZHBfbGluay0+cGh5X3BhcmFtcy52X2xldmVsLCBkcF9saW5rLT5waHlfcGFyYW1zLnBfbGV2ZWwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTU1LDcgKzE1MjYsOSBAQAogCWRwX2xpbmstPmdldF9jb2xvcmltZXRyeV9jb25maWcgPSBkcF9saW5rX2dldF9jb2xvcmltZXRyeV9jb25maWc7CiAJZHBfbGluay0+YWRqdXN0X2xldmVscyAgICAgICAgICA9IGRwX2xpbmtfYWRqdXN0X2xldmVsczsKIAlkcF9saW5rLT5zZW5kX3BzbV9yZXF1ZXN0ICAgICAgID0gZHBfbGlua19zZW5kX3BzbV9yZXF1ZXN0OwotCWRwX2xpbmstPnBoeV9wYXR0ZXJuX3JlcXVlc3RlZCAgPSBkcF9saW5rX3BoeV9wYXR0ZXJuX3JlcXVlc3RlZDsKKwlkcF9saW5rLT5zZW5kX3Rlc3RfcmVzcG9uc2UgICAgID0gZHBfbGlua19zZW5kX3Rlc3RfcmVzcG9uc2U7CisJZHBfbGluay0+cHNtX2NvbmZpZyAgICAgICAgICAgICA9IGRwX2xpbmtfcHNtX2NvbmZpZzsKKwlkcF9saW5rLT5zZW5kX2VkaWRfY2hlY2tzdW0gICAgID0gZHBfbGlua19zZW5kX2VkaWRfY2hlY2tzdW07CiAKIAlyZXR1cm4gZHBfbGluazsKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9saW5rLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaAppbmRleCA0MTkxODZmLi5iMWQ5MjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2xpbmsuaApAQCAtMTcsNiArMTcsMTAgQEAKIAogI2luY2x1ZGUgImRwX2F1eC5oIgogCisjZGVmaW5lIERTX1BPUlRfU1RBVFVTX0NIQU5HRUQgMHgyMDAKKyNkZWZpbmUgRFBfVEVTVF9CSVRfREVQVEhfVU5LTk9XTiAweEZGRkZGRkZGCisjZGVmaW5lIERQX0xJTktfRU5VTV9TVFIoeCkJCSN4CisKIGVudW0gZHBfbGlua192b2x0YWdlX2xldmVsIHsKIAlEUF9MSU5LX1ZPTFRBR0VfTEVWRUxfMAk9IDAsCiAJRFBfTElOS19WT0xUQUdFX0xFVkVMXzEJPSAxLApAQCAtMzEsMjUgKzM1LDEzNiBAQAogCURQX0xJTktfUFJFX0VNUEhBU0lTX01BWAk9IERQX0xJTktfUFJFX0VNUEhBU0lTX0xFVkVMXzIsCiB9OwogCi0jZGVmaW5lIERTX1BPUlRfU1RBVFVTX0NIQU5HRUQgMHgyMDAKLSNkZWZpbmUgRFBfVEVTVF9CSVRfREVQVEhfVU5LTk9XTiAweEZGRkZGRkZGCitzdHJ1Y3QgZHBfbGlua19zaW5rX2NvdW50IHsKKwl1MzIgY291bnQ7CisJYm9vbCBjcF9yZWFkeTsKK307CiAKLXN0cnVjdCBkcF9saW5rIHsKLQl1MzIgdGVzdF9yZXF1ZXN0ZWQ7CitzdHJ1Y3QgZHBfbGlua190ZXN0X3ZpZGVvIHsKKwl1MzIgdGVzdF92aWRlb19wYXR0ZXJuOworCXUzMiB0ZXN0X2JpdF9kZXB0aDsKKwl1MzIgdGVzdF9keW5fcmFuZ2U7CisJdTMyIHRlc3RfaF90b3RhbDsKKwl1MzIgdGVzdF92X3RvdGFsOworCXUzMiB0ZXN0X2hfc3RhcnQ7CisJdTMyIHRlc3Rfdl9zdGFydDsKKwl1MzIgdGVzdF9oc3luY19wb2w7CisJdTMyIHRlc3RfaHN5bmNfd2lkdGg7CisJdTMyIHRlc3RfdnN5bmNfcG9sOworCXUzMiB0ZXN0X3ZzeW5jX3dpZHRoOworCXUzMiB0ZXN0X2hfd2lkdGg7CisJdTMyIHRlc3Rfdl9oZWlnaHQ7CisJdTMyIHRlc3RfcnJfZDsKKwl1MzIgdGVzdF9ycl9uOworfTsKIAorc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyB7CisJdTMyIHRlc3RfYXVkaW9fc2FtcGxpbmdfcmF0ZTsKKwl1MzIgdGVzdF9hdWRpb19jaGFubmVsX2NvdW50OworCXUzMiB0ZXN0X2F1ZGlvX3BhdHRlcm5fdHlwZTsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfMTsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfMjsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfMzsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfNDsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfNTsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfNjsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfNzsKKwl1MzIgdGVzdF9hdWRpb19wZXJpb2RfY2hfODsKK307CisKK3N0cnVjdCBkcF9saW5rX3BoeV9wYXJhbXMgeworCXUzMiBwaHlfdGVzdF9wYXR0ZXJuX3NlbDsKKwl1OCB2X2xldmVsOworCXU4IHBfbGV2ZWw7Cit9OworCitzdHJ1Y3QgZHBfbGlua19wYXJhbXMgewogCXUzMiBsYW5lX2NvdW50OwogCXUzMiBid19jb2RlOwotCXUzMiB2X2xldmVsOwotCXUzMiBwX2xldmVsOworfTsKKworc3RydWN0IGRwX2xpbmsgeworCXUzMiBzaW5rX3JlcXVlc3Q7CisJdTMyIHRlc3RfcmVzcG9uc2U7CisJYm9vbCBwc21fZW5hYmxlZDsKKworCXN0cnVjdCBkcF9saW5rX3NpbmtfY291bnQgc2lua19jb3VudDsKKwlzdHJ1Y3QgZHBfbGlua190ZXN0X3ZpZGVvIHRlc3RfdmlkZW87CisJc3RydWN0IGRwX2xpbmtfdGVzdF9hdWRpbyB0ZXN0X2F1ZGlvOworCXN0cnVjdCBkcF9saW5rX3BoeV9wYXJhbXMgcGh5X3BhcmFtczsKKwlzdHJ1Y3QgZHBfbGlua19wYXJhbXMgbGlua19wYXJhbXM7CiAKIAl1MzIgKCpnZXRfdGVzdF9iaXRzX2RlcHRoKShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTMyIGJwcCk7CiAJaW50ICgqcHJvY2Vzc19yZXF1ZXN0KShzdHJ1Y3QgZHBfbGluayAqZHBfbGluayk7CiAJaW50ICgqZ2V0X2NvbG9yaW1ldHJ5X2NvbmZpZykoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspOwogCWludCAoKmFkanVzdF9sZXZlbHMpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLCB1OCAqbGlua19zdGF0dXMpOwogCWludCAoKnNlbmRfcHNtX3JlcXVlc3QpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rLCBib29sIHJlcSk7Ci0JYm9vbCAoKnBoeV9wYXR0ZXJuX3JlcXVlc3RlZCkoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmspOworCXZvaWQgKCpzZW5kX3Rlc3RfcmVzcG9uc2UpKHN0cnVjdCBkcF9saW5rICpkcF9saW5rKTsKKwlpbnQgKCpwc21fY29uZmlnKShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywKKwkJc3RydWN0IGRybV9kcF9saW5rICpsaW5rX2luZm8sIGJvb2wgZW5hYmxlKTsKKwl2b2lkICgqc2VuZF9lZGlkX2NoZWNrc3VtKShzdHJ1Y3QgZHBfbGluayAqZHBfbGluaywgdTggY2hlY2tzdW0pOwogfTsKIAorc3RhdGljIGlubGluZSBjaGFyICpkcF9saW5rX2dldF9waHlfdGVzdF9wYXR0ZXJuKHUzMiBwaHlfdGVzdF9wYXR0ZXJuX3NlbCkKK3sKKwlzd2l0Y2ggKHBoeV90ZXN0X3BhdHRlcm5fc2VsKSB7CisJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX05PTkU6CisJCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKERQX1RFU1RfUEhZX1BBVFRFUk5fTk9ORSk7CisJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX0QxMF8yX05PX1NDUkFNQkxJTkc6CisJCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKAorCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl9EMTBfMl9OT19TQ1JBTUJMSU5HKTsKKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fU1lNQk9MX0VSUl9NRUFTVVJFTUVOVF9DTlQ6CisJCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKAorCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl9TWU1CT0xfRVJSX01FQVNVUkVNRU5UX0NOVCk7CisJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX1BSQlM3OgorCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUihEUF9URVNUX1BIWV9QQVRURVJOX1BSQlM3KTsKKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fODBfQklUX0NVU1RPTV9QQVRURVJOOgorCQlyZXR1cm4gRFBfTElOS19FTlVNX1NUUigKKwkJCURQX1RFU1RfUEhZX1BBVFRFUk5fODBfQklUX0NVU1RPTV9QQVRURVJOKTsKKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fSEJSMl9DVFNfRVlFX1BBVFRFUk46CisJCXJldHVybiBEUF9MSU5LX0VOVU1fU1RSKAorCQkJRFBfVEVTVF9QSFlfUEFUVEVSTl9IQlIyX0NUU19FWUVfUEFUVEVSTik7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKy8qKgorICogbWRzc19kcF90ZXN0X2JpdF9kZXB0aF90b19icHAoKSAtIGNvbnZlcnQgdGVzdCBiaXQgZGVwdGggdG8gYnBwCisgKiBAdGJkOiB0ZXN0IGJpdCBkZXB0aAorICoKKyAqIFJldHVybnMgdGhlIGJpdHMgcGVyIHBpeGVsIChicHApIHRvIGJlIHVzZWQgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGdpdCBiaXQgZGVwdGggdmFsdWUuIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGJpdCBkZXB0aCBoYXMKKyAqIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGRwX2xpbmtfYml0X2RlcHRoX3RvX2JwcCh1MzIgdGJkKQoreworCXUzMiBicHA7CisKKwkvKgorCSAqIEZldyBzaW1wbGlzdGljIHJ1bGVzIGFuZCBhc3N1bXB0aW9ucyBtYWRlIGhlcmU6CisJICogICAgMS4gQml0IGRlcHRoIGlzIHBlciBjb2xvciBjb21wb25lbnQKKwkgKiAgICAyLiBJZiBiaXQgZGVwdGggaXMgdW5rbm93biByZXR1cm4gMAorCSAqICAgIDMuIEFzc3VtZSAzIGNvbG9yIGNvbXBvbmVudHMKKwkgKi8KKwlzd2l0Y2ggKHRiZCkgeworCWNhc2UgRFBfVEVTVF9CSVRfREVQVEhfNjoKKwkJYnBwID0gMTg7CisJCWJyZWFrOworCWNhc2UgRFBfVEVTVF9CSVRfREVQVEhfODoKKwkJYnBwID0gMjQ7CisJCWJyZWFrOworCWNhc2UgRFBfVEVTVF9CSVRfREVQVEhfMTA6CisJCWJwcCA9IDMwOworCQlicmVhazsKKwljYXNlIERQX1RFU1RfQklUX0RFUFRIX1VOS05PV046CisJZGVmYXVsdDoKKwkJYnBwID0gMDsKKwl9CisKKwlyZXR1cm4gYnBwOworfQorCiAvKioKICAqIGRwX2xpbmtfZ2V0KCkgLSBnZXQgdGhlIGZ1bmN0aW9uYWxpdGllcyBvZiBkcCB0ZXN0IG1vZHVsZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuYwppbmRleCAyZTIxMDMzLi5mYzNmYjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhbmVsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiZHBfcGFuZWwuaCIKIAogI2RlZmluZSBEUF9QQU5FTF9ERUZBVUxUX0JQUCAyNAorI2RlZmluZSBEUF9NQVhfRFNfUE9SVF9DT1VOVCAxCiAKIGVudW0gewogCURQX0xJTktfUkFURV9NVUxUSVBMSUVSID0gMjcwMDAwMDAsCkBAIC0yNiwxNyArMjcsMzUgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGRwX3BhbmVsIGRwX3BhbmVsOwogCXN0cnVjdCBkcF9hdXggKmF1eDsKKwlzdHJ1Y3QgZHBfbGluayAqbGluazsKIAlzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqY2F0YWxvZzsKLQlib29sIGxhbmVfc3dpdGNoX3N1cHBvcnRlZDsKIAlib29sIGF1eF9jZmdfdXBkYXRlX2RvbmU7CiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRwX3BhbmVsX2luZm8gZmFpbF9zYWZlID0geworCS5oX2FjdGl2ZSA9IDY0MCwKKwkudl9hY3RpdmUgPSA0ODAsCisJLmhfYmFja19wb3JjaCA9IDQ4LAorCS5oX2Zyb250X3BvcmNoID0gMTYsCisJLmhfc3luY193aWR0aCA9IDk2LAorCS5oX2FjdGl2ZV9sb3cgPSAwLAorCS52X2JhY2tfcG9yY2ggPSAzMywKKwkudl9mcm9udF9wb3JjaCA9IDEwLAorCS52X3N5bmNfd2lkdGggPSAyLAorCS52X2FjdGl2ZV9sb3cgPSAwLAorCS5oX3NrZXcgPSAwLAorCS5yZWZyZXNoX3JhdGUgPSA2MCwKKwkucGl4ZWxfY2xrX2toeiA9IDI1MjAwLAorCS5icHAgPSAyNCwKK307CisKIHN0YXRpYyBpbnQgZHBfcGFuZWxfcmVhZF9kcGNkKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpCiB7CiAJaW50IHJsZW4sIHJjID0gMDsKIAlzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSAqcGFuZWw7CiAJc3RydWN0IGRybV9kcF9saW5rICpsaW5rX2luZm87Ci0JdTggbWFqb3IgPSAwLCBtaW5vciA9IDA7CisJdTggKmRwY2QsIG1ham9yID0gMCwgbWlub3IgPSAwOworCXUzMiBkZnBfY291bnQgPSAwOwogCXVuc2lnbmVkIGxvbmcgY2FwcyA9IERQX0xJTktfQ0FQX0VOSEFOQ0VEX0ZSQU1JTkc7CiAKIAlpZiAoIWRwX3BhbmVsKSB7CkBAIC00NSwxMSArNjQsMTMgQEAKIAkJZ290byBlbmQ7CiAJfQogCisJZHBjZCA9IGRwX3BhbmVsLT5kcGNkOworCiAJcGFuZWwgPSBjb250YWluZXJfb2YoZHBfcGFuZWwsIHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlLCBkcF9wYW5lbCk7CiAJbGlua19pbmZvID0gJmRwX3BhbmVsLT5saW5rX2luZm87CiAKIAlybGVuID0gZHJtX2RwX2RwY2RfcmVhZChwYW5lbC0+YXV4LT5kcm1fYXV4LCBEUF9EUENEX1JFViwKLQkJZHBfcGFuZWwtPmRwY2QsIChEUF9SRUNFSVZFUl9DQVBfU0laRSArIDEpKTsKKwkJZHBjZCwgKERQX1JFQ0VJVkVSX0NBUF9TSVpFICsgMSkpOwogCWlmIChybGVuIDwgKERQX1JFQ0VJVkVSX0NBUF9TSVpFICsgMSkpIHsKIAkJcHJfZXJyKCJkcGNkIHJlYWQgZmFpbGVkLCBybGVuPSVkXG4iLCBybGVuKTsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNjYsMjEgKzg3LDU0IEBACiAJCWRybV9kcF9id19jb2RlX3RvX2xpbmtfcmF0ZShkcF9wYW5lbC0+ZHBjZFtEUF9NQVhfTElOS19SQVRFXSk7CiAJcHJfZGVidWcoImxpbmtfcmF0ZT0lZFxuIiwgbGlua19pbmZvLT5yYXRlKTsKIAotCWlmIChwYW5lbC0+bGFuZV9zd2l0Y2hfc3VwcG9ydGVkKQotCQlsaW5rX2luZm8tPm51bV9sYW5lcyA9IGRwX3BhbmVsLT5kcGNkW0RQX01BWF9MQU5FX0NPVU5UXSAmCi0JCQlEUF9NQVhfTEFORV9DT1VOVF9NQVNLOwotCWVsc2UKLQkJbGlua19pbmZvLT5udW1fbGFuZXMgPSAyOworCWxpbmtfaW5mby0+bnVtX2xhbmVzID0gZHBfcGFuZWwtPmRwY2RbRFBfTUFYX0xBTkVfQ09VTlRdICYKKwkJCQlEUF9NQVhfTEFORV9DT1VOVF9NQVNLOwogCiAJcHJfZGVidWcoImxhbmVfY291bnQ9JWRcbiIsIGxpbmtfaW5mby0+bnVtX2xhbmVzKTsKIAotCWlmIChkcF9wYW5lbC0+ZHBjZFtEUF9NQVhfTEFORV9DT1VOVF0gJiBEUF9FTkhBTkNFRF9GUkFNRV9DQVApCisJaWYgKGRybV9kcF9lbmhhbmNlZF9mcmFtZV9jYXAoZHBjZCkpCiAJCWxpbmtfaW5mby0+Y2FwYWJpbGl0aWVzIHw9IGNhcHM7CiAKKwlkZnBfY291bnQgPSBkcGNkW0RQX0RPV05fU1RSRUFNX1BPUlRfQ09VTlRdICYKKwkJCQkJCURQX0RPV05fU1RSRUFNX1BPUlRfQ09VTlQ7CisKKwlpZiAoKGRwY2RbRFBfRE9XTlNUUkVBTVBPUlRfUFJFU0VOVF0gJiBEUF9EV05fU1RSTV9QT1JUX1BSRVNFTlQpCisJCSYmIChkcGNkW0RQX0RQQ0RfUkVWXSA+IDB4MTApKSB7CisJCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkKHBhbmVsLT5hdXgtPmRybV9hdXgsCisJCQlEUF9ET1dOU1RSRUFNX1BPUlRfMCwgZHBfcGFuZWwtPmRzX3BvcnRzLAorCQkJRFBfTUFYX0RPV05TVFJFQU1fUE9SVFMpOworCQlpZiAocmxlbiA8IERQX01BWF9ET1dOU1RSRUFNX1BPUlRTKSB7CisJCQlwcl9lcnIoImRzIHBvcnQgc3RhdHVzIGZhaWxlZCwgcmxlbj0lZFxuIiwgcmxlbik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKworCWlmIChkZnBfY291bnQgPiBEUF9NQVhfRFNfUE9SVF9DT1VOVCkKKwkJcHJfZGVidWcoIkRTIHBvcnQgY291bnQgJWQgZ3JlYXRlciB0aGF0IG1heCAoJWQpIHN1cHBvcnRlZFxuIiwKKwkJCWRmcF9jb3VudCwgRFBfTUFYX0RTX1BPUlRfQ09VTlQpOworCiBlbmQ6CiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGRwX3BhbmVsX3NldF9kZWZhdWx0X2xpbmtfcGFyYW1zKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpCit7CisJc3RydWN0IGRybV9kcF9saW5rICpsaW5rX2luZm87CisJY29uc3QgaW50IGRlZmF1bHRfYndfY29kZSA9IDE2MjAwMDsKKwljb25zdCBpbnQgZGVmYXVsdF9udW1fbGFuZXMgPSAxOworCisJaWYgKCFkcF9wYW5lbCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbGlua19pbmZvID0gJmRwX3BhbmVsLT5saW5rX2luZm87CisJbGlua19pbmZvLT5yYXRlID0gZGVmYXVsdF9id19jb2RlOworCWxpbmtfaW5mby0+bnVtX2xhbmVzID0gZGVmYXVsdF9udW1fbGFuZXM7CisJcHJfZGVidWcoImxpbmtfcmF0ZT0lZCBudW1fbGFuZXM9JWRcbiIsCisJCWxpbmtfaW5mby0+cmF0ZSwgbGlua19pbmZvLT5udW1fbGFuZXMpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IGRwX3BhbmVsX3JlYWRfZWRpZChzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsLAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCkBAIC0xMjYsMTQgKzE4MCwxOCBAQAogCXBhbmVsID0gY29udGFpbmVyX29mKGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOwogCiAJcmMgPSBkcF9wYW5lbF9yZWFkX2RwY2QoZHBfcGFuZWwpOwotCWlmIChyYykgewotCQlwcl9lcnIoInBhbmVsIGRwY2QgcmVhZCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmM7CisJaWYgKHJjIHx8ICFpc19saW5rX3JhdGVfdmFsaWQoZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKAorCQlkcF9wYW5lbC0+bGlua19pbmZvLnJhdGUpKSB8fCAhaXNfbGFuZV9jb3VudF92YWxpZCgKKwkJZHBfcGFuZWwtPmxpbmtfaW5mby5udW1fbGFuZXMpIHx8CisJCSgoZHJtX2RwX2xpbmtfcmF0ZV90b19id19jb2RlKGRwX3BhbmVsLT5saW5rX2luZm8ucmF0ZSkpID4KKwkJZHBfcGFuZWwtPm1heF9id19jb2RlKSkgeworCQlwcl9lcnIoInBhbmVsIGRwY2QgcmVhZCBmYWlsZWQvaW5jb3JyZWN0LCBzZXQgZGVmYXVsdCBwYXJhbXNcbiIpOworCQlkcF9wYW5lbF9zZXRfZGVmYXVsdF9saW5rX3BhcmFtcyhkcF9wYW5lbCk7CiAJfQogCiAJcmMgPSBkcF9wYW5lbF9yZWFkX2VkaWQoZHBfcGFuZWwsIGNvbm5lY3Rvcik7CiAJaWYgKHJjKSB7Ci0JCXByX2VycigicGFuZWwgZWRpZCByZWFkIGZhaWxlZFxuIik7CisJCXByX2VycigicGFuZWwgZWRpZCByZWFkIGZhaWxlZCwgc2V0IGZhaWxzYWZlIG1vZGVcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0xNzQsNiArMjMyLDk0IEBACiAJcmV0dXJuIG1heF9wY2xrX3JhdGVfa2h6OwogfQogCitzdGF0aWMgdm9pZCBkcF9wYW5lbF9zZXRfdGVzdF9tb2RlKHN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbCwKKwkJc3RydWN0IGRwX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3QgZHBfcGFuZWxfaW5mbyAqcGluZm8gPSBOVUxMOworCXN0cnVjdCBkcF9saW5rX3Rlc3RfdmlkZW8gKnRlc3RfaW5mbyA9IE5VTEw7CisKKwlpZiAoIXBhbmVsKSB7CisJCXByX2VycigiaW52YWxpZCBwYXJhbXNcbiIpOworCQlyZXR1cm47CisJfQorCisJcGluZm8gPSAmbW9kZS0+dGltaW5nOworCXRlc3RfaW5mbyA9ICZwYW5lbC0+bGluay0+dGVzdF92aWRlbzsKKworCXBpbmZvLT5oX2FjdGl2ZSA9IHRlc3RfaW5mby0+dGVzdF9oX3dpZHRoOworCXBpbmZvLT5oX3N5bmNfd2lkdGggPSB0ZXN0X2luZm8tPnRlc3RfaHN5bmNfd2lkdGg7CisJcGluZm8tPmhfYmFja19wb3JjaCA9IHRlc3RfaW5mby0+dGVzdF9oX3N0YXJ0IC0KKwkJdGVzdF9pbmZvLT50ZXN0X2hzeW5jX3dpZHRoOworCXBpbmZvLT5oX2Zyb250X3BvcmNoID0gdGVzdF9pbmZvLT50ZXN0X2hfdG90YWwgLQorCQkodGVzdF9pbmZvLT50ZXN0X2hfc3RhcnQgKyB0ZXN0X2luZm8tPnRlc3RfaF93aWR0aCk7CisKKwlwaW5mby0+dl9hY3RpdmUgPSB0ZXN0X2luZm8tPnRlc3Rfdl9oZWlnaHQ7CisJcGluZm8tPnZfc3luY193aWR0aCA9IHRlc3RfaW5mby0+dGVzdF92c3luY193aWR0aDsKKwlwaW5mby0+dl9iYWNrX3BvcmNoID0gdGVzdF9pbmZvLT50ZXN0X3Zfc3RhcnQgLQorCQl0ZXN0X2luZm8tPnRlc3RfdnN5bmNfd2lkdGg7CisJcGluZm8tPnZfZnJvbnRfcG9yY2ggPSB0ZXN0X2luZm8tPnRlc3Rfdl90b3RhbCAtCisJCSh0ZXN0X2luZm8tPnRlc3Rfdl9zdGFydCArIHRlc3RfaW5mby0+dGVzdF92X2hlaWdodCk7CisKKwlwaW5mby0+YnBwID0gZHBfbGlua19iaXRfZGVwdGhfdG9fYnBwKHRlc3RfaW5mby0+dGVzdF9iaXRfZGVwdGgpOworCXBpbmZvLT5oX2FjdGl2ZV9sb3cgPSB0ZXN0X2luZm8tPnRlc3RfaHN5bmNfcG9sOworCXBpbmZvLT52X2FjdGl2ZV9sb3cgPSB0ZXN0X2luZm8tPnRlc3RfdnN5bmNfcG9sOworCisJcGluZm8tPnJlZnJlc2hfcmF0ZSA9IHRlc3RfaW5mby0+dGVzdF9ycl9uOworCXBpbmZvLT5waXhlbF9jbGtfa2h6ID0gdGVzdF9pbmZvLT50ZXN0X2hfdG90YWwgKgorCQl0ZXN0X2luZm8tPnRlc3Rfdl90b3RhbCAqIHBpbmZvLT5yZWZyZXNoX3JhdGU7CisKKwlpZiAodGVzdF9pbmZvLT50ZXN0X3JyX2QgPT0gMCkKKwkJcGluZm8tPnBpeGVsX2Nsa19raHogLz0gMTAwMDsKKwllbHNlCisJCXBpbmZvLT5waXhlbF9jbGtfa2h6IC89IDEwMDE7CisKKwlpZiAodGVzdF9pbmZvLT50ZXN0X2hfd2lkdGggPT0gNjQwKQorCQlwaW5mby0+cGl4ZWxfY2xrX2toeiA9IDI1MTcwOworfQorCitzdGF0aWMgaW50IGRwX3BhbmVsX2dldF9tb2RlcyhzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsLAorCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHN0cnVjdCBkcF9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUgKnBhbmVsOworCisJaWYgKCFkcF9wYW5lbCkgeworCQlwcl9lcnIoImludmFsaWQgaW5wdXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYW5lbCA9IGNvbnRhaW5lcl9vZihkcF9wYW5lbCwgc3RydWN0IGRwX3BhbmVsX3ByaXZhdGUsIGRwX3BhbmVsKTsKKworCWlmIChkcF9wYW5lbC0+dmlkZW9fdGVzdCkgeworCQlkcF9wYW5lbF9zZXRfdGVzdF9tb2RlKHBhbmVsLCBtb2RlKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChkcF9wYW5lbC0+ZWRpZF9jdHJsLT5lZGlkKSB7CisJCXJldHVybiBfc2RlX2VkaWRfdXBkYXRlX21vZGVzKGNvbm5lY3RvciwgZHBfcGFuZWwtPmVkaWRfY3RybCk7CisJfSBlbHNlIHsgLyogZmFpbC1zYWZlIG1vZGUgKi8KKwkJbWVtY3B5KCZtb2RlLT50aW1pbmcsICZmYWlsX3NhZmUsCisJCQlzaXplb2YoZmFpbF9zYWZlKSk7CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgZHBfcGFuZWxfaGFuZGxlX3NpbmtfcmVxdWVzdChzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsKQoreworCXN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbDsKKworCWlmICghZHBfcGFuZWwpIHsKKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBhbmVsID0gY29udGFpbmVyX29mKGRwX3BhbmVsLCBzdHJ1Y3QgZHBfcGFuZWxfcHJpdmF0ZSwgZHBfcGFuZWwpOworCisJaWYgKHBhbmVsLT5saW5rLT5zaW5rX3JlcXVlc3QgJiBEUF9URVNUX0xJTktfRURJRF9SRUFEKSB7CisJCXU4IGNoZWNrc3VtID0gc2RlX2dldF9lZGlkX2NoZWNrc3VtKGRwX3BhbmVsLT5lZGlkX2N0cmwpOworCisJCXBhbmVsLT5saW5rLT5zZW5kX2VkaWRfY2hlY2tzdW0ocGFuZWwtPmxpbmssIGNoZWNrc3VtKTsKKwkJcGFuZWwtPmxpbmstPnNlbmRfdGVzdF9yZXNwb25zZShwYW5lbC0+bGluayk7CisJfQorfQorCiBzdGF0aWMgaW50IGRwX3BhbmVsX3RpbWluZ19jZmcoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMzMyLDMxICs0NzgsMzIgQEAKIAlyZXR1cm4gbWluX2xpbmtfcmF0ZV9raHo7CiB9CiAKLXN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWxfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRwX2F1eCAqYXV4LAotCQkJCXN0cnVjdCBkcF9jYXRhbG9nX3BhbmVsICpjYXRhbG9nKQorc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbF9nZXQoc3RydWN0IGRwX3BhbmVsX2luICppbikKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBkcF9wYW5lbF9wcml2YXRlICpwYW5lbDsKIAlzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsOwogCi0JaWYgKCFkZXYgfHwgIWF1eCB8fCAhY2F0YWxvZykgeworCWlmICghaW4tPmRldiB8fCAhaW4tPmNhdGFsb2cgfHwgIWluLT5hdXggfHwgIWluLT5saW5rKSB7CiAJCXByX2VycigiaW52YWxpZCBpbnB1dFxuIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlwYW5lbCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGFuZWwpLCBHRlBfS0VSTkVMKTsKKwlwYW5lbCA9IGRldm1fa3phbGxvYyhpbi0+ZGV2LCBzaXplb2YoKnBhbmVsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYW5lbCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JcGFuZWwtPmRldiA9IGRldjsKLQlwYW5lbC0+YXV4ID0gYXV4OwotCXBhbmVsLT5jYXRhbG9nID0gY2F0YWxvZzsKKwlwYW5lbC0+ZGV2ID0gaW4tPmRldjsKKwlwYW5lbC0+YXV4ID0gaW4tPmF1eDsKKwlwYW5lbC0+Y2F0YWxvZyA9IGluLT5jYXRhbG9nOworCXBhbmVsLT5saW5rID0gaW4tPmxpbms7CiAKIAlkcF9wYW5lbCA9ICZwYW5lbC0+ZHBfcGFuZWw7CiAJcGFuZWwtPmF1eF9jZmdfdXBkYXRlX2RvbmUgPSBmYWxzZTsKKwlkcF9wYW5lbC0+bWF4X2J3X2NvZGUgPSBEUF9MSU5LX0JXXzhfMTsKIAogCWRwX3BhbmVsLT5zZGVfZWRpZF9yZWdpc3RlciA9IGRwX3BhbmVsX2VkaWRfcmVnaXN0ZXI7CiAJZHBfcGFuZWwtPnNkZV9lZGlkX2RlcmVnaXN0ZXIgPSBkcF9wYW5lbF9lZGlkX2RlcmVnaXN0ZXI7CkBAIC0zNjUsNiArNTEyLDggQEAKIAlkcF9wYW5lbC0+cmVhZF9zaW5rX2NhcHMgPSBkcF9wYW5lbF9yZWFkX3NpbmtfY2FwczsKIAlkcF9wYW5lbC0+Z2V0X21pbl9yZXFfbGlua19yYXRlID0gZHBfcGFuZWxfZ2V0X21pbl9yZXFfbGlua19yYXRlOwogCWRwX3BhbmVsLT5nZXRfbWF4X3BjbGsgPSBkcF9wYW5lbF9nZXRfbWF4X3BjbGs7CisJZHBfcGFuZWwtPmdldF9tb2RlcyA9IGRwX3BhbmVsX2dldF9tb2RlczsKKwlkcF9wYW5lbC0+aGFuZGxlX3NpbmtfcmVxdWVzdCA9IGRwX3BhbmVsX2hhbmRsZV9zaW5rX3JlcXVlc3Q7CiAKIAlyZXR1cm4gZHBfcGFuZWw7CiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFuZWwuaAppbmRleCBhYjlhNDUxLi4wMWE5NzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhbmVsLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5oCkBAIC0xNiw5ICsxNiwxNyBAQAogI2RlZmluZSBfRFBfUEFORUxfSF8KIAogI2luY2x1ZGUgImRwX2F1eC5oIgorI2luY2x1ZGUgImRwX2xpbmsuaCIKKyNpbmNsdWRlICJkcF91c2JwZC5oIgogI2luY2x1ZGUgInNkZV9lZGlkX3BhcnNlci5oIgogCi0jZGVmaW5lIERQX0xJTktfUkFURV84MTAJMzAJLyogOC4xMEcgPSAyNzBNICogMzAgKi8KK2VudW0gZHBfbGFuZV9jb3VudCB7CisJRFBfTEFORV9DT1VOVF8xCT0gMSwKKwlEUF9MQU5FX0NPVU5UXzIJPSAyLAorCURQX0xBTkVfQ09VTlRfNAk9IDQsCit9OworCisjZGVmaW5lIERQX01BWF9ET1dOU1RSRUFNX1BPUlRTIDB4MTAKIAogc3RydWN0IGRwX3BhbmVsX2luZm8gewogCXUzMiBoX2FjdGl2ZTsKQEAgLTM3LDE4ICs0NSwzNSBAQAogCXUzMiBicHA7CiB9OwogCitzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlIHsKKwlzdHJ1Y3QgZHBfcGFuZWxfaW5mbyB0aW1pbmc7CisJdTMyIGNhcGFiaWxpdGllczsKK307CisKK3N0cnVjdCBkcF9wYW5lbF9pbiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkcF9hdXggKmF1eDsKKwlzdHJ1Y3QgZHBfbGluayAqbGluazsKKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqY2F0YWxvZzsKK307CisKIHN0cnVjdCBkcF9wYW5lbCB7CiAJLyogZHBjZCByYXcgZGF0YSAqLwogCXU4IGRwY2RbRFBfUkVDRUlWRVJfQ0FQX1NJWkVdOwotCXN0cnVjdCBkcm1fZHBfbGluayBsaW5rX2luZm87CisJdTggZHNfcG9ydHNbRFBfTUFYX0RPV05TVFJFQU1fUE9SVFNdOwogCisJc3RydWN0IGRybV9kcF9saW5rIGxpbmtfaW5mbzsKIAlzdHJ1Y3Qgc2RlX2VkaWRfY3RybCAqZWRpZF9jdHJsOwogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CiAJc3RydWN0IGRwX3BhbmVsX2luZm8gcGluZm87CisJYm9vbCB2aWRlb190ZXN0OwogCiAJdTMyIHZpYzsKIAl1MzIgbWF4X3BjbGtfa2h6OwogCisJLyogZGVidWcgKi8KKwl1MzIgbWF4X2J3X2NvZGU7CisKIAlpbnQgKCpzZGVfZWRpZF9yZWdpc3Rlcikoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7CiAJdm9pZCAoKnNkZV9lZGlkX2RlcmVnaXN0ZXIpKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpOwogCWludCAoKmluaXRfaW5mbykoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7CkBAIC01Nyw5ICs4MiwzOCBAQAogCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIAl1MzIgKCpnZXRfbWluX3JlcV9saW5rX3JhdGUpKHN0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWwpOwogCXUzMiAoKmdldF9tYXhfcGNsaykoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7CisJaW50ICgqZ2V0X21vZGVzKShzdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsLAorCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBzdHJ1Y3QgZHBfZGlzcGxheV9tb2RlICptb2RlKTsKKwl2b2lkICgqaGFuZGxlX3NpbmtfcmVxdWVzdCkoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7CiB9OwogCi1zdHJ1Y3QgZHBfcGFuZWwgKmRwX3BhbmVsX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkcF9hdXggKmF1eCwKLQkJCQlzdHJ1Y3QgZHBfY2F0YWxvZ19wYW5lbCAqY2F0YWxvZyk7CisvKioKKyAqIGlzX2xpbmtfcmF0ZV92YWxpZCgpIC0gdmFsaWRhdGVzIHRoZSBsaW5rIHJhdGUKKyAqIEBsYW5lX3JhdGU6IGxpbmsgcmF0ZSByZXF1ZXN0ZWQgYnkgdGhlIHNpbmsKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3RlZCBsaW5rIHJhdGUgaXMgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfbGlua19yYXRlX3ZhbGlkKHUzMiBid19jb2RlKQoreworCXJldHVybiAoKGJ3X2NvZGUgPT0gRFBfTElOS19CV18xXzYyKSB8fAorCQkoYndfY29kZSA9PSBEUF9MSU5LX0JXXzJfNykgfHwKKwkJKGJ3X2NvZGUgPT0gRFBfTElOS19CV181XzQpIHx8CisJCShid19jb2RlID09IERQX0xJTktfQldfOF8xKSk7Cit9CisKKy8qKgorICogZHBfbGlua19pc19sYW5lX2NvdW50X3ZhbGlkKCkgLSB2YWxpZGF0ZXMgdGhlIGxhbmUgY291bnQKKyAqIEBsYW5lX2NvdW50OiBsYW5lIGNvdW50IHJlcXVlc3RlZCBieSB0aGUgc2luaworICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVxdWVzdGVkIGxhbmUgY291bnQgaXMgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfbGFuZV9jb3VudF92YWxpZCh1MzIgbGFuZV9jb3VudCkKK3sKKwlyZXR1cm4gKGxhbmVfY291bnQgPT0gRFBfTEFORV9DT1VOVF8xKSB8fAorCQkobGFuZV9jb3VudCA9PSBEUF9MQU5FX0NPVU5UXzIpIHx8CisJCShsYW5lX2NvdW50ID09IERQX0xBTkVfQ09VTlRfNCk7Cit9CisKK3N0cnVjdCBkcF9wYW5lbCAqZHBfcGFuZWxfZ2V0KHN0cnVjdCBkcF9wYW5lbF9pbiAqaW4pOwogdm9pZCBkcF9wYW5lbF9wdXQoc3RydWN0IGRwX3BhbmVsICpkcF9wYW5lbCk7CiAjZW5kaWYgLyogX0RQX1BBTkVMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuYwppbmRleCBjODVjMmEyLi5jOGRhOTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmMKQEAgLTIyLDIyICsyMiwxNSBAQAogewogCXN0cnVjdCBkcF9pbyAqaW8gPSAmcGFyc2VyLT5pbzsKIAotCWlmICgmaW8tPmN0cmxfaW8pCi0JCW1zbV9kc3NfaW91bm1hcCgmaW8tPmN0cmxfaW8pOwotCWlmICgmaW8tPnBoeV9pbykKLQkJbXNtX2Rzc19pb3VubWFwKCZpby0+cGh5X2lvKTsKLQlpZiAoJmlvLT5sbl90eDBfaW8pCi0JCW1zbV9kc3NfaW91bm1hcCgmaW8tPmxuX3R4MF9pbyk7Ci0JaWYgKCZpby0+bG5fdHgxX2lvKQotCQltc21fZHNzX2lvdW5tYXAoJmlvLT5sbl90eDBfaW8pOwotCWlmICgmaW8tPmRwX3BsbF9pbykKLQkJbXNtX2Rzc19pb3VubWFwKCZpby0+ZHBfcGxsX2lvKTsKLQlpZiAoJmlvLT5kcF9jY19pbykKLQkJbXNtX2Rzc19pb3VubWFwKCZpby0+ZHBfY2NfaW8pOwotCWlmICgmaW8tPnFmcHJvbV9pbykKLQkJbXNtX2Rzc19pb3VubWFwKCZpby0+cWZwcm9tX2lvKTsKLQlpZiAoJmlvLT5oZGNwX2lvKQotCQltc21fZHNzX2lvdW5tYXAoJmlvLT5oZGNwX2lvKTsKKwltc21fZHNzX2lvdW5tYXAoJmlvLT5jdHJsX2lvKTsKKwltc21fZHNzX2lvdW5tYXAoJmlvLT5waHlfaW8pOworCW1zbV9kc3NfaW91bm1hcCgmaW8tPmxuX3R4MF9pbyk7CisJbXNtX2Rzc19pb3VubWFwKCZpby0+bG5fdHgwX2lvKTsKKwltc21fZHNzX2lvdW5tYXAoJmlvLT5kcF9wbGxfaW8pOworCW1zbV9kc3NfaW91bm1hcCgmaW8tPmRwX2NjX2lvKTsKKwltc21fZHNzX2lvdW5tYXAoJmlvLT51c2IzX2RwX2NvbSk7CisJbXNtX2Rzc19pb3VubWFwKCZpby0+cWZwcm9tX2lvKTsKKwltc21fZHNzX2lvdW5tYXAoJmlvLT5oZGNwX2lvKTsKIH0KIAogc3RhdGljIGludCBkcF9wYXJzZXJfY3RybF9yZXMoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKQpAQCAtODQsNiArNzcsMTIgQEAKIAkJZ290byBlcnI7CiAJfQogCisJcmMgPSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+dXNiM19kcF9jb20sICJ1c2IzX2RwX2NvbSIpOworCWlmIChyYykgeworCQlwcl9lcnIoInVuYWJsZSB0byByZW1hcCBVU0IzIERQIGNvbSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKIAlpZiAobXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8tPmRwX2NjX2lvLCAiZHBfbW1zc19jYyIpKSB7CiAJCXByX2VycigidW5hYmxlIHRvIHJlbWFwIGRwIE1NU1NfQ0MgcmVzb3VyY2VzXG4iKTsKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuaAppbmRleCA3Nzk0ZGE1Li43NmE3MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmgKQEAgLTY1LDYgKzY1LDcgQEAKICAqIEBkcF9jY19pbzogRFAgY2MncyBtYXBwZWQgbWVtb3J5IGFkZHJlc3MKICAqIEBxZnByb21faW86IHFmcHJvbSdzIG1hcHBlZCBtZW1vcnkgYWRkcmVzcwogICogQGRwX3BsbF9pbzogRFAgUExMIG1hcHBlZCBtZW1vcnkgYWRkcmVzcworICogQHVzYjNfZHBfY29tOiBVU0IzIERQIFBIWSBjb21ibyBtYXBwZWQgbWVtb3J5IGFkZHJlc3MKICAqIEBoZGNwX2lvOiBoZGNwJ3MgbWFwcGVkIG1lbW9yeSBhZGRyZXNzCiAgKi8KIHN0cnVjdCBkcF9pbyB7CkBAIC03NSw2ICs3Niw3IEBACiAJc3RydWN0IGRzc19pb19kYXRhIGRwX2NjX2lvOwogCXN0cnVjdCBkc3NfaW9fZGF0YSBxZnByb21faW87CiAJc3RydWN0IGRzc19pb19kYXRhIGRwX3BsbF9pbzsKKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgdXNiM19kcF9jb207CiAJc3RydWN0IGRzc19pb19kYXRhIGhkY3BfaW87CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmMKaW5kZXggNjBjODk2Ni4uZWI3ODdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wb3dlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcG93ZXIuYwpAQCAtNjEyLDggKzYxMiwxMiBAQAogCiB2b2lkIGRwX3Bvd2VyX3B1dChzdHJ1Y3QgZHBfcG93ZXIgKmRwX3Bvd2VyKQogewotCXN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwKLQkJCXN0cnVjdCBkcF9wb3dlcl9wcml2YXRlLCBkcF9wb3dlcik7CisJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyID0gTlVMTDsKKworCWlmICghZHBfcG93ZXIpCisJCXJldHVybjsKKworCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2VyLCBzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwogCiAJZGV2bV9rZnJlZSgmcG93ZXItPnBkZXYtPmRldiwgcG93ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcmVnLmgKaW5kZXggMzAzNzdhMC4uMjVkMDM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3JlZy5oCkBAIC03OSw2ICs3OSw4IEBACiAjZGVmaW5lIE1NU1NfRFBfUFNSX0NSQ19SRwkJCSgweDAwMDAwNTU0KQogI2RlZmluZSBNTVNTX0RQX1BTUl9DUkNfQgkJCSgweDAwMDAwNTU4KQogCisjZGVmaW5lIERQX0NPTVBSRVNTSU9OX01PREVfQ1RSTAkJKDB4MDAwMDA1ODApCisKICNkZWZpbmUgTU1TU19EUF9BVURJT19DRkcJCQkoMHgwMDAwMDYwMCkKICNkZWZpbmUgTU1TU19EUF9BVURJT19TVEFUVVMJCQkoMHgwMDAwMDYwNCkKICNkZWZpbmUgTU1TU19EUF9BVURJT19QS1RfQ1RSTAkJCSgweDAwMDAwNjA4KQpAQCAtMTQxLDYgKzE0MywxNyBAQAogI2RlZmluZSBNTVNTX0RQX0dFTkVSSUMxXzgJCQkoMHgwMDAwMDc0OCkKICNkZWZpbmUgTU1TU19EUF9HRU5FUklDMV85CQkJKDB4MDAwMDA3NEMpCiAKKyNkZWZpbmUgTU1TU19EUF9WU0NFWFRfMAkJCSgweDAwMDAwNkQwKQorI2RlZmluZSBNTVNTX0RQX1ZTQ0VYVF8xCQkJKDB4MDAwMDA2RDQpCisjZGVmaW5lIE1NU1NfRFBfVlNDRVhUXzIJCQkoMHgwMDAwMDZEOCkKKyNkZWZpbmUgTU1TU19EUF9WU0NFWFRfMwkJCSgweDAwMDAwNkRDKQorI2RlZmluZSBNTVNTX0RQX1ZTQ0VYVF80CQkJKDB4MDAwMDA2RTApCisjZGVmaW5lIE1NU1NfRFBfVlNDRVhUXzUJCQkoMHgwMDAwMDZFNCkKKyNkZWZpbmUgTU1TU19EUF9WU0NFWFRfNgkJCSgweDAwMDAwNkU4KQorI2RlZmluZSBNTVNTX0RQX1ZTQ0VYVF83CQkJKDB4MDAwMDA2RUMpCisjZGVmaW5lIE1NU1NfRFBfVlNDRVhUXzgJCQkoMHgwMDAwMDZGMCkKKyNkZWZpbmUgTU1TU19EUF9WU0NFWFRfOQkJCSgweDAwMDAwNkY0KQorCiAjZGVmaW5lIE1NU1NfRFBfVElNSU5HX0VOR0lORV9FTgkJKDB4MDAwMDBBMTApCiAjZGVmaW5lIE1NU1NfRFBfQVNZTkNfRklGT19DT05GSUcJCSgweDAwMDAwQTg4KQogCkBAIC0xNjYsNiArMTc5LDcgQEAKICNkZWZpbmUgRFBfUEhZX0FVWF9DRkc5ICAgICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwMDQ0KQogI2RlZmluZSBEUF9QSFlfQVVYX0lOVEVSUlVQVF9NQVNLICAgICAgICAgICAgICAgKDB4MDAwMDAwNDgpCiAjZGVmaW5lIERQX1BIWV9BVVhfSU5URVJSVVBUX0NMRUFSICAgICAgICAgICAgICAoMHgwMDAwMDA0QykKKyNkZWZpbmUgRFBfUEhZX0FVWF9JTlRFUlJVUFRfU1RBVFVTICAgICAgICAgICAgICgweDAwMDAwMEJDKQogCiAjZGVmaW5lIERQX1BIWV9TUEFSRTAJCQkJKDB4MDBBQykKIApAQCAtMjA1LDQgKzIxOSwxNCBAQAogI2RlZmluZSBIRENQX1NFQ19EUF9UWl9IVl9ITE9TX0hEQ1BfUkNWUE9SVF9EQVRBMTEgICAgICgweDAxQykKICNkZWZpbmUgSERDUF9TRUNfRFBfVFpfSFZfSExPU19IRENQX1JDVlBPUlRfREFUQTEyICAgICAoMHgwMjApCiAKKy8qIFVTQjMgRFAgQ09NIHJlZ2lzdGVycyAqLworI2RlZmluZSBVU0IzX0RQX0NPTV9SRVNFVF9PVlJEX0NUUkwgKDB4MUMpCisjZGVmaW5lIFVTQjNfRFBfQ09NX1BIWV9NT0RFX0NUUkwgICAoMHgwMCkKKyNkZWZpbmUgVVNCM19EUF9DT01fU1dfUkVTRVQgICAgICAgICgweDA0KQorI2RlZmluZSBVU0IzX0RQX0NPTV9UWVBFQ19DVFJMICAgICAgKDB4MTApCisjZGVmaW5lIFVTQjNfRFBfQ09NX1NXSV9DVFJMICAgICAgICAoMHgwYykKKyNkZWZpbmUgVVNCM19EUF9DT01fUE9XRVJfRE9XTl9DVFJMICgweDA4KQorCisKKwogI2VuZGlmIC8qIF9EUF9SRUdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfdXNicGQuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfdXNicGQuYwppbmRleCBkZjQzMjY3Li45ODc4MWFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF91c2JwZC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfdXNicGQuYwpAQCAtNzMsOCArNzMsNiBAQAogCXN0cnVjdCBkcF91c2JwZCBkcF91c2JwZDsKIAllbnVtIGRwX3VzYnBkX2FsdF9tb2RlIGFsdF9tb2RlOwogCXUzMiBkcF91c2JwZF9jb25maWc7Ci0KLQlib29sIGZvcmNlZF9kaXNjb25uZWN0OwogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRwX3VzYnBkX3Bpbl9uYW1lKHU4IHBpbikKQEAgLTE3OCw3ICsxNzYsMTAgQEAKIAl1MzIgY29uZmlnID0gMDsKIAljb25zdCB1MzIgdWZwX2RfY29uZmlnID0gMHgyLCBkcF92ZXIgPSAweDE7CiAKLQlwaW5fY2ZnID0gcGQtPmNhcC5kbGlua19waW5fY29uZmlnOworCWlmIChwZC0+Y2FwLnJlY2VwdGFjbGVfc3RhdGUpCisJCXBpbl9jZmcgPSBwZC0+Y2FwLnVsaW5rX3Bpbl9jb25maWc7CisJZWxzZQorCQlwaW5fY2ZnID0gcGQtPmNhcC5kbGlua19waW5fY29uZmlnOwogCiAJZm9yIChwaW4gPSBEUF9VU0JQRF9QSU5fQTsgcGluIDwgRFBfVVNCUERfUElOX01BWDsgcGluKyspIHsKIAkJaWYgKHBpbl9jZmcgJiBCSVQocGluKSkgewpAQCAtMzQ0LDcgKzM0NSw3IEBACiAJCWRwX3VzYnBkX3NlbmRfZXZlbnQocGQsIERQX1VTQlBEX0VWVF9TVEFUVVMpOwogCQlicmVhazsKIAljYXNlIFVTQlBEX1NWRE1fQVRURU5USU9OOgotCQlpZiAocGQtPmZvcmNlZF9kaXNjb25uZWN0KQorCQlpZiAocGQtPmRwX3VzYnBkLmZvcmNlZF9kaXNjb25uZWN0KQogCQkJYnJlYWs7CiAKIAkJcGQtPnZkbyA9ICp2ZG9zOwpAQCAtMzc0LDYgKzM3NSwxOCBAQAogCiAJCXBkLT5kcF91c2JwZC5vcmllbnRhdGlvbiA9IHVzYnBkX2dldF9wbHVnX29yaWVudGF0aW9uKHBkLT5wZCk7CiAKKwkJLyoKKwkJICogQnkgZGVmYXVsdCwgVVNCIHJlc2VydmVzIHR3byBsYW5lcyBmb3IgU3VwZXIgU3BlZWQuCisJCSAqIFdoaWNoIG1lYW5zIERQIGhhcyByZW1haW5pbmcgdHdvIGxhbmVzIHRvIG9wZXJhdGUgb24uCisJCSAqIElmIG11bHRpLWZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHJlcXVlc3QgVVNCIHRvCisJCSAqIHJlbGVhc2UgdGhlIFN1cGVyIFNwZWVkIGxhbmVzIHNvIHRoYXQgRFAgY2FuIHVzZQorCQkgKiBhbGwgZm91ciBsYW5lcyBpbiBjYXNlIERQQ0QgaW5kaWNhdGVzIHN1cHBvcnQgZm9yCisJCSAqIGZvdXIgbGFuZXMuCisJCSAqLworCQlpZiAoIXBkLT5kcF91c2JwZC5tdWx0aV9mdW5jKQorCQkJcGQtPnN2aWRfaGFuZGxlci5yZXF1ZXN0X3VzYl9zc19sYW5lKHBkLT5wZCwKKwkJCQkmcGQtPnN2aWRfaGFuZGxlcik7CisKIAkJaWYgKHBkLT5kcF9jYiAmJiBwZC0+ZHBfY2ItPmNvbmZpZ3VyZSkKIAkJCXBkLT5kcF9jYi0+Y29uZmlndXJlKHBkLT5kZXYpOwogCQlicmVhazsKQEAgLTM5Nyw3ICs0MTAsNyBAQAogCXBkID0gY29udGFpbmVyX29mKGRwX3VzYnBkLCBzdHJ1Y3QgZHBfdXNicGRfcHJpdmF0ZSwgZHBfdXNicGQpOwogCiAJZHBfdXNicGQtPmhwZF9oaWdoID0gaHBkOwotCXBkLT5mb3JjZWRfZGlzY29ubmVjdCA9ICFocGQ7CisJZHBfdXNicGQtPmZvcmNlZF9kaXNjb25uZWN0ID0gIWhwZDsKIAogCWlmIChocGQpCiAJCXBkLT5kcF9jYi0+Y29uZmlndXJlKHBkLT5kZXYpOwpAQCAtNDUxLDcgKzQ2NCw3IEBACiAJaWYgKHJjKSB7CiAJCXByX2VycigicGQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CiAJCXJjID0gLUVOT0RFVjsKLQkJa2ZyZWUodXNicGQpOworCQlkZXZtX2tmcmVlKGRldiwgdXNicGQpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtNDcyLDUgKzQ4NSw3IEBACiAKIAl1c2JwZCA9IGNvbnRhaW5lcl9vZihkcF91c2JwZCwgc3RydWN0IGRwX3VzYnBkX3ByaXZhdGUsIGRwX3VzYnBkKTsKIAotCWtmcmVlKHVzYnBkKTsKKwl1c2JwZF91bnJlZ2lzdGVyX3N2aWQodXNicGQtPnBkLCAmdXNicGQtPnN2aWRfaGFuZGxlcik7CisKKwlkZXZtX2tmcmVlKHVzYnBkLT5kZXYsIHVzYnBkKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfdXNicGQuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfdXNicGQuaAppbmRleCAyNjgyZTk4Li41YjM5MmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3VzYnBkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF91c2JwZC5oCkBAIC02Myw2ICs2Myw3IEBACiAJYm9vbCBocGRfaXJxOwogCWJvb2wgYWx0X21vZGVfY2ZnX2RvbmU7CiAJYm9vbCBkZWJ1Z19lbjsKKwlib29sIGZvcmNlZF9kaXNjb25uZWN0OwogCiAJaW50ICgqY29ubmVjdCkoc3RydWN0IGRwX3VzYnBkICpkcF91c2JwZCwgYm9vbCBocGQpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2NhdGFsb2cuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2NhdGFsb2cuYwppbmRleCBlOWRhYmIxLi41ZDlkMjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jYXRhbG9nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY2F0YWxvZy5jCkBAIC0yOCw2ICsyOCw3IEBACiAJY3RybC0+b3BzLnZpZGVvX2VuZ2luZV9lbiAgICAgICAgPSBkc2lfY3RybF9od19jbW5fdmlkZW9fZW5naW5lX2VuOwogCWN0cmwtPm9wcy52aWRlb19lbmdpbmVfc2V0dXAgICAgID0gZHNpX2N0cmxfaHdfY21uX3ZpZGVvX2VuZ2luZV9zZXR1cDsKIAljdHJsLT5vcHMuc2V0X3ZpZGVvX3RpbWluZyAgICAgICA9IGRzaV9jdHJsX2h3X2Ntbl9zZXRfdmlkZW9fdGltaW5nOworCWN0cmwtPm9wcy5zZXRfdGltaW5nX2RiICAgICAgICAgID0gZHNpX2N0cmxfaHdfY21uX3NldF90aW1pbmdfZGI7CiAJY3RybC0+b3BzLmNtZF9lbmdpbmVfc2V0dXAgICAgICAgPSBkc2lfY3RybF9od19jbW5fY21kX2VuZ2luZV9zZXR1cDsKIAljdHJsLT5vcHMuc2V0dXBfY21kX3N0cmVhbSAgICAgICA9IGRzaV9jdHJsX2h3X2Ntbl9zZXR1cF9jbWRfc3RyZWFtOwogCWN0cmwtPm9wcy5jdHJsX2VuICAgICAgICAgICAgICAgID0gZHNpX2N0cmxfaHdfY21uX2N0cmxfZW47CkBAIC01OCw2ICs1OSw5IEBACiAJY3RybC0+b3BzLnBoeV9yZXNldF9jb25maWcgPSBkc2lfY3RybF9od19jbW5fcGh5X3Jlc2V0X2NvbmZpZzsKIAljdHJsLT5vcHMuc2V0dXBfbWlzciA9IGRzaV9jdHJsX2h3X2Ntbl9zZXR1cF9taXNyOwogCWN0cmwtPm9wcy5jb2xsZWN0X21pc3IgPSBkc2lfY3RybF9od19jbW5fY29sbGVjdF9taXNyOworCWN0cmwtPm9wcy5kZWJ1Z19idXMgPSBkc2lfY3RybF9od19jbW5fZGVidWdfYnVzOworCWN0cmwtPm9wcy5nZXRfY21kX3JlYWRfZGF0YSA9IGRzaV9jdHJsX2h3X2Ntbl9nZXRfY21kX3JlYWRfZGF0YTsKKwljdHJsLT5vcHMuY2xlYXJfcmRia19yZWdpc3RlciA9IGRzaV9jdHJsX2h3X2Ntbl9jbGVhcl9yZGJrX3JlZzsKIAogCXN3aXRjaCAodmVyc2lvbikgewogCWNhc2UgRFNJX0NUUkxfVkVSU0lPTl8xXzQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jYXRhbG9nLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jYXRhbG9nLmgKaW5kZXggZThkNTk0Yy4uMTg2YTViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY2F0YWxvZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2NhdGFsb2cuaApAQCAtMTA0LDYgKzEwNCw3IEBACiAKIC8qIERTSSBjb250cm9sbGVyIGNvbW1vbiBvcHMgKi8KIHUzMiBkc2lfY3RybF9od19jbW5fZ2V0X2ludGVycnVwdF9zdGF0dXMoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsKTsKK3ZvaWQgZHNpX2N0cmxfaHdfY21uX2RlYnVnX2J1cyhzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwpOwogdm9pZCBkc2lfY3RybF9od19jbW5fY2xlYXJfaW50ZXJydXB0X3N0YXR1cyhzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsIHUzMiBpbnRzKTsKIHZvaWQgZHNpX2N0cmxfaHdfY21uX2VuYWJsZV9zdGF0dXNfaW50ZXJydXB0cyhzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCiAJCQkJCSAgICAgdTMyIGludHMpOwpAQCAtMTMyLDcgKzEzMyw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBkc2lfdmlkZW9fZW5naW5lX2NmZyAqY2ZnKTsKIHZvaWQgZHNpX2N0cmxfaHdfY21uX3NldF92aWRlb190aW1pbmcoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsLAogCQkJIHN0cnVjdCBkc2lfbW9kZV9pbmZvICptb2RlKTsKLQordm9pZCBkc2lfY3RybF9od19jbW5fc2V0X3RpbWluZ19kYihzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCisJCQkJICAgICBib29sIGVuYWJsZSk7CiB2b2lkIGRzaV9jdHJsX2h3X2Ntbl9jbWRfZW5naW5lX3NldHVwKHN0cnVjdCBkc2lfY3RybF9odyAqY3RybCwKIAkJCQkgICAgIHN0cnVjdCBkc2lfaG9zdF9jb21tb25fY2ZnICpjb21tb25fY2ZnLAogCQkJCSAgICAgc3RydWN0IGRzaV9jbWRfZW5naW5lX2NmZyAqY2ZnKTsKQEAgLTE2OCw2ICsxNzAsMTIgQEAKIAkJCWJvb2wgZW5hYmxlKTsKIHZvaWQgZHNpX2N0cmxfaHdfMjJfcGh5X3Jlc2V0X2NvbmZpZyhzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCiAJCQlib29sIGVuYWJsZSk7Cit1MzIgZHNpX2N0cmxfaHdfY21uX2dldF9jbWRfcmVhZF9kYXRhKHN0cnVjdCBkc2lfY3RybF9odyAqY3RybCwKKwkJCQkgICAgIHU4ICpyZF9idWYsCisJCQkJICAgICB1MzIgcmVhZF9vZmZzZXQsCisJCQkJICAgICB1MzIgcnhfYnl0ZSwKKwkJCQkgICAgIHUzMiBwa3Rfc2l6ZSwgdTMyICpod19yZWFkX2NudCk7Cit2b2lkIGRzaV9jdHJsX2h3X2Ntbl9jbGVhcl9yZGJrX3JlZyhzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwpOwogCiAvKiBEZWZpbml0aW9ucyBzcGVjaWZpYyB0byAxLjQgRFNJIGNvbnRyb2xsZXIgaGFyZHdhcmUgKi8KIGludCBkc2lfY3RybF9od18xNF93YWl0X2Zvcl9sYW5lX2lkbGUoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsLCB1MzIgbGFuZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybC5jCmluZGV4IGRjZGU1NjYuLjc5MGVlMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsLmMKQEAgLTM4LDYgKzM4LDggQEAKICNkZWZpbmUgRFNJX0NUUkxfVFhfVE9fTVMgICAgIDIwMAogCiAjZGVmaW5lIFRPX09OX09GRih4KSAoKHgpID8gIk9OIiA6ICJPRkYiKQorCisjZGVmaW5lIENFSUwoeCwgeSkgICAgICAgICAgICAgICgoKHgpICsgKCh5KS0xKSkgLyAoeSkpCiAvKioKICAqIGVudW0gZHNpX2N0cmxfZHJpdmVyX29wcyAtIGNvbnRyb2xsZXIgZHJpdmVyIG9wcwogICovCkBAIC04ODQsMTIgKzg4Niw0OSBAQAogCQlidWZbM10gfD0gQklUKDYpOwogCiAJYnVmWzNdIHw9IEJJVCg3KTsKKworCS8qIHNlbmQgZW1iZWRkZWQgQlRBIGZvciByZWFkIGNvbW1hbmRzICovCisJaWYgKChidWZbMl0gJiAweDNmKSA9PSBNSVBJX0RTSV9EQ1NfUkVBRCkKKwkJYnVmWzNdIHw9IEJJVCg1KTsKKwogCSpidWZmZXIgPSBidWY7CiAJKnNpemUgPSBsZW47CiAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyB2b2lkIGRzaV9jdHJsX3dhaXRfZm9yX3ZpZGVvX2RvbmUoc3RydWN0IGRzaV9jdHJsICpkc2lfY3RybCkKK3sKKwl1MzIgdl90b3RhbCA9IDAsIHZfYmxhbmsgPSAwLCBzbGVlcF9tcyA9IDAsIGZwcyA9IDAsIHJldDsKKwlzdHJ1Y3QgZHNpX21vZGVfaW5mbyAqdGltaW5nOworCisJaWYgKGRzaV9jdHJsLT5ob3N0X2NvbmZpZy5wYW5lbF9tb2RlICE9IERTSV9PUF9WSURFT19NT0RFKQorCQlyZXR1cm47CisKKwlkc2lfY3RybC0+aHcub3BzLmNsZWFyX2ludGVycnVwdF9zdGF0dXMoJmRzaV9jdHJsLT5odywKKwkJCQlEU0lfVklERU9fTU9ERV9GUkFNRV9ET05FKTsKKworCWRzaV9jdHJsX2VuYWJsZV9zdGF0dXNfaW50ZXJydXB0KGRzaV9jdHJsLAorCQkJCURTSV9TSU5UX1ZJREVPX01PREVfRlJBTUVfRE9ORSwgTlVMTCk7CisJcmVpbml0X2NvbXBsZXRpb24oJmRzaV9jdHJsLT5pcnFfaW5mby52aWRfZnJhbWVfZG9uZSk7CisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJJmRzaV9jdHJsLT5pcnFfaW5mby52aWRfZnJhbWVfZG9uZSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoRFNJX0NUUkxfVFhfVE9fTVMpKTsKKwlpZiAocmV0IDw9IDApCisJCXByX2RlYnVnKCJ3YWl0IGZvciB2aWRlbyBkb25lIGZhaWxlZFxuIik7CisJZHNpX2N0cmxfZGlzYWJsZV9zdGF0dXNfaW50ZXJydXB0KGRzaV9jdHJsLAorCQkJCURTSV9TSU5UX1ZJREVPX01PREVfRlJBTUVfRE9ORSk7CisKKwl0aW1pbmcgPSAmKGRzaV9jdHJsLT5ob3N0X2NvbmZpZy52aWRlb190aW1pbmcpOworCXZfdG90YWwgPSB0aW1pbmctPnZfc3luY193aWR0aCArIHRpbWluZy0+dl9iYWNrX3BvcmNoICsKKwkJCXRpbWluZy0+dl9mcm9udF9wb3JjaCArIHRpbWluZy0+dl9hY3RpdmU7CisJdl9ibGFuayA9IHRpbWluZy0+dl9zeW5jX3dpZHRoICsgdGltaW5nLT52X2JhY2tfcG9yY2g7CisJZnBzID0gdGltaW5nLT5yZWZyZXNoX3JhdGU7CisKKwlzbGVlcF9tcyA9IENFSUwoKHZfYmxhbmsgKiAxMDAwKSwgKHZfdG90YWwgKiBmcHMpKSArIDE7CisJdWRlbGF5KHNsZWVwX21zICogMTAwMCk7Cit9CisKIHN0YXRpYyBpbnQgZHNpX21lc3NhZ2VfdHgoc3RydWN0IGRzaV9jdHJsICpkc2lfY3RybCwKIAkJCSAgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnLAogCQkJICB1MzIgZmxhZ3MpCkBAIC05NzEsNiArMTAxMCw3IEBACiAJfQogCiAJaWYgKCEoZmxhZ3MgJiBEU0lfQ1RSTF9DTURfREVGRVJfVFJJR0dFUikpIHsKKwkJZHNpX2N0cmxfd2FpdF9mb3JfdmlkZW9fZG9uZShkc2lfY3RybCk7CiAJCWRzaV9jdHJsX2VuYWJsZV9zdGF0dXNfaW50ZXJydXB0KGRzaV9jdHJsLAogCQkJCQlEU0lfU0lOVF9DTURfTU9ERV9ETUFfRE9ORSwgTlVMTCk7CiAJCXJlaW5pdF9jb21wbGV0aW9uKCZkc2lfY3RybC0+aXJxX2luZm8uY21kX2RtYV9kb25lKTsKQEAgLTEwMjYsNiArMTA2Niw3IEBACiB7CiAJaW50IHJjID0gMDsKIAl1OCB0eFsyXSA9IHsgKHU4KShzaXplICYgMHhGRiksICh1OCkoc2l6ZSA+PiA4KSB9OworCXUzMiBmbGFncyA9IERTSV9DVFJMX0NNRF9GRVRDSF9NRU1PUlk7CiAJc3RydWN0IG1pcGlfZHNpX21zZyBtc2cgPSB7CiAJCS5jaGFubmVsID0gcnhfbXNnLT5jaGFubmVsLAogCQkudHlwZSA9IE1JUElfRFNJX1NFVF9NQVhJTVVNX1JFVFVSTl9QQUNLRVRfU0laRSwKQEAgLTEwMzMsMjQgKzEwNzQsNzcgQEAKIAkJLnR4X2J1ZiA9IHR4LAogCX07CiAKLQlyYyA9IGRzaV9tZXNzYWdlX3R4KGRzaV9jdHJsLCAmbXNnLCAweDApOworCXJjID0gZHNpX21lc3NhZ2VfdHgoZHNpX2N0cmwsICZtc2csIGZsYWdzKTsKIAlpZiAocmMpCiAJCXByX2VycigiZmFpbGVkIHRvIHNlbmQgbWF4IHJldHVybiBzaXplIHBhY2tldCwgcmM9JWRcbiIsIHJjKTsKIAogCXJldHVybiByYzsKIH0KIAorLyogSGVscGVyIGZ1bmN0aW9ucyB0byBzdXBwb3J0IERDUyByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIGludCBkc2lfcGFyc2Vfc2hvcnRfcmVhZDFfcmVzcChjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2csCisJCXVuc2lnbmVkIGNoYXIgKmJ1ZmYpCit7CisJdTggKmRhdGEgPSBtc2ctPnJ4X2J1ZjsKKwlpbnQgcmVhZF9sZW4gPSAxOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCS8qIHJlbW92ZSBkY3MgdHlwZSAqLworCWlmIChtc2ctPnJ4X2xlbiA+PSAxKQorCQlkYXRhWzBdID0gYnVmZlsxXTsKKwllbHNlCisJCXJlYWRfbGVuID0gMDsKKworCXJldHVybiByZWFkX2xlbjsKK30KKworc3RhdGljIGludCBkc2lfcGFyc2Vfc2hvcnRfcmVhZDJfcmVzcChjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2csCisJCXVuc2lnbmVkIGNoYXIgKmJ1ZmYpCit7CisJdTggKmRhdGEgPSBtc2ctPnJ4X2J1ZjsKKwlpbnQgcmVhZF9sZW4gPSAyOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCS8qIHJlbW92ZSBkY3MgdHlwZSAqLworCWlmIChtc2ctPnJ4X2xlbiA+PSAyKSB7CisJCWRhdGFbMF0gPSBidWZmWzFdOworCQlkYXRhWzFdID0gYnVmZlsyXTsKKwl9IGVsc2UgeworCQlyZWFkX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIHJlYWRfbGVuOworfQorCitzdGF0aWMgaW50IGRzaV9wYXJzZV9sb25nX3JlYWRfcmVzcChjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2csCisJCXVuc2lnbmVkIGNoYXIgKmJ1ZmYpCit7CisJaWYgKCFtc2ctPnJ4X2J1ZikKKwkJcmV0dXJuIDA7CisKKwkvKiByZW1vdmUgZGNzIHR5cGUgKi8KKwlpZiAobXNnLT5yeF9idWYgJiYgbXNnLT5yeF9sZW4pCisJCW1lbWNweShtc2ctPnJ4X2J1ZiwgYnVmZiArIDQsIG1zZy0+cnhfbGVuKTsKKworCXJldHVybiBtc2ctPnJ4X2xlbjsKK30KKwogc3RhdGljIGludCBkc2lfbWVzc2FnZV9yeChzdHJ1Y3QgZHNpX2N0cmwgKmRzaV9jdHJsLAogCQkJICBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2csCiAJCQkgIHUzMiBmbGFncykKIHsKIAlpbnQgcmMgPSAwOwotCXUzMiByZF9wa3Rfc2l6ZTsKLQl1MzIgdG90YWxfcmVhZF9sZW47Ci0JdTMyIGJ5dGVzX3JlYWQgPSAwLCB0b3RfYnl0ZXNfcmVhZCA9IDA7Ci0JdTMyIGN1cnJlbnRfcmVhZF9sZW47CisJdTMyIHJkX3BrdF9zaXplLCB0b3RhbF9yZWFkX2xlbiwgaHdfcmVhZF9jbnQ7CisJdTMyIGN1cnJlbnRfcmVhZF9sZW4gPSAwLCB0b3RhbF9ieXRlc19yZWFkID0gMDsKIAlib29sIHNob3J0X3Jlc3AgPSBmYWxzZTsKIAlib29sIHJlYWRfZG9uZSA9IGZhbHNlOworCXUzMiBkbGVuLCBkaWZmLCBybGVuID0gbXNnLT5yeF9sZW47CisJdW5zaWduZWQgY2hhciAqYnVmZjsKKwljaGFyIGNtZDsKIAogCWlmIChtc2ctPnJ4X2xlbiA8PSAyKSB7CiAJCXNob3J0X3Jlc3AgPSB0cnVlOwpAQCAtMTA2Niw2ICsxMTYwLDcgQEAKIAogCQl0b3RhbF9yZWFkX2xlbiA9IGN1cnJlbnRfcmVhZF9sZW4gKyA2OwogCX0KKwlidWZmID0gbXNnLT5yeF9idWY7CiAKIAl3aGlsZSAoIXJlYWRfZG9uZSkgewogCQlyYyA9IGRzaV9zZXRfbWF4X3JldHVybl9zaXplKGRzaV9jdHJsLCBtc2csIHJkX3BrdF9zaXplKTsKQEAgLTEwNzUsMjQgKzExNzAsNzkgQEAKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAorCQkvKiBjbGVhciBSREJLX0RBVEEgcmVnaXN0ZXJzIGJlZm9yZSBwcm9jZWVkaW5nICovCisJCWRzaV9jdHJsLT5ody5vcHMuY2xlYXJfcmRia19yZWdpc3RlcigmZHNpX2N0cmwtPmh3KTsKKwogCQlyYyA9IGRzaV9tZXNzYWdlX3R4KGRzaV9jdHJsLCBtc2csIGZsYWdzKTsKIAkJaWYgKHJjKSB7CiAJCQlwcl9lcnIoIk1lc3NhZ2UgdHJhbnNtaXNzaW9uIGZhaWxlZCwgcmM9JWRcbiIsIHJjKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAorCQlkbGVuID0gZHNpX2N0cmwtPmh3Lm9wcy5nZXRfY21kX3JlYWRfZGF0YSgmZHNpX2N0cmwtPmh3LAorCQkJCQlidWZmLCB0b3RhbF9ieXRlc19yZWFkLAorCQkJCQl0b3RhbF9yZWFkX2xlbiwgcmRfcGt0X3NpemUsCisJCQkJCSZod19yZWFkX2NudCk7CisJCWlmICghZGxlbikKKwkJCWdvdG8gZXJyb3I7CiAKLQkJdG90X2J5dGVzX3JlYWQgKz0gYnl0ZXNfcmVhZDsKIAkJaWYgKHNob3J0X3Jlc3ApCisJCQlicmVhazsKKworCQlpZiAocmxlbiA8PSBjdXJyZW50X3JlYWRfbGVuKSB7CisJCQlkaWZmID0gY3VycmVudF9yZWFkX2xlbiAtIHJsZW47CiAJCQlyZWFkX2RvbmUgPSB0cnVlOwotCQllbHNlIGlmIChtc2ctPnJ4X2xlbiA8PSB0b3RfYnl0ZXNfcmVhZCkKLQkJCXJlYWRfZG9uZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlkaWZmID0gMDsKKwkJCXJsZW4gLT0gY3VycmVudF9yZWFkX2xlbjsKKwkJfQorCisJCWRsZW4gLT0gMjsgLyogMiBieXRlcyBvZiBDUkMgKi8KKwkJZGxlbiAtPSBkaWZmOworCQlidWZmICs9IGRsZW47CisJCXRvdGFsX2J5dGVzX3JlYWQgKz0gZGxlbjsKKwkJaWYgKCFyZWFkX2RvbmUpIHsKKwkJCWN1cnJlbnRfcmVhZF9sZW4gPSAxNDsgLyogTm90IGZpcnN0IHJlYWQgKi8KKwkJCWlmIChybGVuIDwgY3VycmVudF9yZWFkX2xlbikKKwkJCQlyZF9wa3Rfc2l6ZSArPSBybGVuOworCQkJZWxzZQorCQkJCXJkX3BrdF9zaXplICs9IGN1cnJlbnRfcmVhZF9sZW47CisJCX0KIAl9CisKKwlpZiAoaHdfcmVhZF9jbnQgPCAxNiAmJiAhc2hvcnRfcmVzcCkKKwkJYnVmZiA9IG1zZy0+cnhfYnVmICsgKDE2IC0gaHdfcmVhZF9jbnQpOworCWVsc2UKKwkJYnVmZiA9IG1zZy0+cnhfYnVmOworCisJLyogcGFyc2UgdGhlIGRhdGEgcmVhZCBmcm9tIHBhbmVsICovCisJY21kID0gYnVmZlswXTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTUlQSV9EU0lfUlhfQUNLTk9XTEVER0VfQU5EX0VSUk9SX1JFUE9SVDoKKwkJcHJfZXJyKCJSeCBBQ0tfRVJST1JcbiIpOworCQlyYyA9IDA7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfUlhfR0VORVJJQ19TSE9SVF9SRUFEX1JFU1BPTlNFXzFCWVRFOgorCWNhc2UgTUlQSV9EU0lfUlhfRENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMUJZVEU6CisJCXJjID0gZHNpX3BhcnNlX3Nob3J0X3JlYWQxX3Jlc3AobXNnLCBidWZmKTsKKwkJYnJlYWs7CisJY2FzZSBNSVBJX0RTSV9SWF9HRU5FUklDX1NIT1JUX1JFQURfUkVTUE9OU0VfMkJZVEU6CisJY2FzZSBNSVBJX0RTSV9SWF9EQ1NfU0hPUlRfUkVBRF9SRVNQT05TRV8yQllURToKKwkJcmMgPSBkc2lfcGFyc2Vfc2hvcnRfcmVhZDJfcmVzcChtc2csIGJ1ZmYpOworCQlicmVhazsKKwljYXNlIE1JUElfRFNJX1JYX0dFTkVSSUNfTE9OR19SRUFEX1JFU1BPTlNFOgorCWNhc2UgTUlQSV9EU0lfUlhfRENTX0xPTkdfUkVBRF9SRVNQT05TRToKKwkJcmMgPSBkc2lfcGFyc2VfbG9uZ19yZWFkX3Jlc3AobXNnLCBidWZmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfd2FybigiSW52YWxpZCByZXNwb25zZVxuIik7CisJCXJjID0gMDsKKwl9CisKIGVycm9yOgogCXJldHVybiByYzsKIH0KIAotCiBzdGF0aWMgaW50IGRzaV9lbmFibGVfdWxwcyhzdHJ1Y3QgZHNpX2N0cmwgKmRzaV9jdHJsKQogewogCWludCByYyA9IDA7CkBAIC0xMTkzLDcgKzEzNDMsOSBAQAogCiAJCW1zbV9nZW1fcHV0X2lvdmEoZHNpX2N0cmwtPnR4X2NtZF9idWYsIGFzcGFjZSk7CiAKKwkJbXV0ZXhfbG9jaygmZHNpX2N0cmwtPmRybV9kZXYtPnN0cnVjdF9tdXRleCk7CiAJCW1zbV9nZW1fZnJlZV9vYmplY3QoZHNpX2N0cmwtPnR4X2NtZF9idWYpOworCQltdXRleF91bmxvY2soJmRzaV9jdHJsLT5kcm1fZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlkc2lfY3RybC0+dHhfY21kX2J1ZiA9IE5VTEw7CiAJfQogCkBAIC0xNDI5LDYgKzE1ODEsMjYgQEAKIAl9LAogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQorCit2b2lkIGRzaV9jdHJsX2RlYnVnX2R1bXAodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICp0bXA7CisJc3RydWN0IGRzaV9jdHJsICpjdHJsID0gTlVMTDsKKworCW11dGV4X2xvY2soJmRzaV9jdHJsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmZHNpX2N0cmxfbGlzdCkgeworCQlzdHJ1Y3QgZHNpX2N0cmxfbGlzdF9pdGVtICpuOworCisJCW4gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGRzaV9jdHJsX2xpc3RfaXRlbSwgbGlzdCk7CisJCWN0cmwgPSBuLT5jdHJsOworCQlwcl9lcnIoImRzaSBjdHJsOiVkXG4iLCBjdHJsLT5jZWxsX2luZGV4KTsKKwkJY3RybC0+aHcub3BzLmRlYnVnX2J1cygmY3RybC0+aHcpOworCX0KKwltdXRleF91bmxvY2soJmRzaV9jdHJsX2xpc3RfbG9jayk7Cit9CisKKyNlbmRpZgogLyoqCiAgKiBkc2lfY3RybF9nZXQoKSAtIGdldCBhIGRzaV9jdHJsIGhhbmRsZSBmcm9tIGFuIG9mX25vZGUKICAqIEBvZl9ub2RlOiAgICBvZl9ub2RlIG9mIHRoZSBEU0kgY29udHJvbGxlci4KQEAgLTE2NDUsNyArMTgxNyw3IEBACiAKIAlob3N0X21vZGUgPSAmZHNpX2N0cmwtPmhvc3RfY29uZmlnLnZpZGVvX3RpbWluZzsKIAltZW1jcHkoaG9zdF9tb2RlLCB0aW1pbmcsIHNpemVvZigqaG9zdF9tb2RlKSk7Ci0KKwlkc2lfY3RybC0+aHcub3BzLnNldF90aW1pbmdfZGIoJmRzaV9jdHJsLT5odywgdHJ1ZSk7CiAJZHNpX2N0cmwtPmh3Lm9wcy5zZXRfdmlkZW9fdGltaW5nKCZkc2lfY3RybC0+aHcsIGhvc3RfbW9kZSk7CiAKIGV4aXQ6CkBAIC0xNjUzLDYgKzE4MjUsNTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogZHNpX2N0cmxfdGltaW5nX2RiX3VwZGF0ZSgpIC0gdXBkYXRlIG9ubHkgY29udHJvbGxlciBUaW1pbmcgREIKKyAqIEBkc2lfY3RybDogICAgICAgICAgRFNJIGNvbnRyb2xsZXIgaGFuZGxlLgorICogQGVuYWJsZTogICAgICAgICAgICBFbmFibGUvZGlzYWJsZSBUaW1pbmcgREIgcmVnaXN0ZXIKKyAqCisgKiAgVXBkYXRlIHRpbWluZyBkYiByZWdpc3RlciB2YWx1ZSBkdXJpbmcgZGZwcyB1c2VjYXNlcworICoKKyAqIFJldHVybjogZXJyb3IgY29kZS4KKyAqLworaW50IGRzaV9jdHJsX3RpbWluZ19kYl91cGRhdGUoc3RydWN0IGRzaV9jdHJsICpkc2lfY3RybCwKKwkJYm9vbCBlbmFibGUpCit7CisJaW50IHJjID0gMDsKKworCWlmICghZHNpX2N0cmwpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIGRzaV9jdHJsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZHNpX2N0cmwtPmN0cmxfbG9jayk7CisKKwlyYyA9IGRzaV9jdHJsX2NoZWNrX3N0YXRlKGRzaV9jdHJsLCBEU0lfQ1RSTF9PUF9BU1lOQ19USU1JTkcsCisJCQlEU0lfQ1RSTF9FTkdJTkVfT04pOworCWlmIChyYykgeworCQlwcl9lcnIoIltEU0lfJWRdIENvbnRyb2xsZXIgc3RhdGUgY2hlY2sgZmFpbGVkLCByYz0lZFxuIiwKKwkJICAgICAgIGRzaV9jdHJsLT5jZWxsX2luZGV4LCByYyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIEFkZCBIVyByZWNvbW1lbmRlZCBkZWxheSBmb3IgZGZwcyBmZWF0dXJlLgorCSAqIFdoZW4gcHJlZmV0Y2ggaXMgZW5hYmxlZCwgTURTUyBIVyB3b3JrcyBvbiAyIHZzeW5jCisJICogYm91bmRhcmllcyBpLmUuIG1kcF92c3luYyBhbmQgcGFuZWxfdnN5bmMuCisJICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2UgYXJlIG9ubHkgd2FpdGluZworCSAqIGZvciBtZHBfdnN5bmMuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaW50ZXJmYWNlCisJICogZmx1c2ggaXMgYWZ0ZXIgcGFuZWxfdnN5bmMuIFNvLCBhZGRlZCB0aGUgcmVjb21tZW5kZWQKKwkgKiBkZWxheXMgYWZ0ZXIgZGZwcyB1cGRhdGUuCisJICovCisJdXNsZWVwX3JhbmdlKDIwMDAsIDIwMTApOworCisJZHNpX2N0cmwtPmh3Lm9wcy5zZXRfdGltaW5nX2RiKCZkc2lfY3RybC0+aHcsIGVuYWJsZSk7CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkc2lfY3RybC0+Y3RybF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKIGludCBkc2lfY3RybF9zZXR1cChzdHJ1Y3QgZHNpX2N0cmwgKmRzaV9jdHJsKQogewogCWludCByYyA9IDA7CkBAIC0yMTQ2LDcgKzIzNjUsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWlmICghKGZsYWdzICYgRFNJX01PREVfRkxBR19TRUFNTEVTUykpIHsKKwlpZiAoIShmbGFncyAmIChEU0lfTU9ERV9GTEFHX1NFQU1MRVNTIHwgRFNJX01PREVfRkxBR19WUlIpKSkgewogCQlyYyA9IGRzaV9jdHJsX3VwZGF0ZV9saW5rX2ZyZXFzKGN0cmwsIGNvbmZpZywgY2xrX2hhbmRsZSk7CiAJCWlmIChyYykgewogCQkJcHJfZXJyKCJbJXNdIGZhaWxlZCB0byB1cGRhdGUgbGluayBmcmVxdWVuY2llcywgcmM9JWRcbiIsCkBAIC0yMjMxLDggKzI0NTAsOCBAQAogCiAJaWYgKGZsYWdzICYgRFNJX0NUUkxfQ01EX1JFQUQpIHsKIAkJcmMgPSBkc2lfbWVzc2FnZV9yeChkc2lfY3RybCwgbXNnLCBmbGFncyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigicmVhZCBtZXNzYWdlIGZhaWxlZCwgcmM9JWRcbiIsIHJjKTsKKwkJaWYgKHJjIDw9IDApCisJCQlwcl9lcnIoInJlYWQgbWVzc2FnZSBmYWlsZWQgcmVhZCBsZW5ndGgsIHJjPSVkXG4iLCByYyk7CiAJfSBlbHNlIHsKIAkJcmMgPSBkc2lfbWVzc2FnZV90eChkc2lfY3RybCwgbXNnLCBmbGFncyk7CiAJCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmwuaAppbmRleCBmMTBjN2E2Li40NzgxMjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybC5oCkBAIC0zMTEsNiArMzExLDE4IEBACiAJCQkJaW50IGZsYWdzLCB2b2lkICpjbGtfaGFuZGxlKTsKIAogLyoqCisgKiBkc2lfY3RybF90aW1pbmdfZGJfdXBkYXRlKCkgLSB1cGRhdGUgb25seSBjb250cm9sbGVyIFRpbWluZyBEQgorICogQGRzaV9jdHJsOiAgICAgICAgICBEU0kgY29udHJvbGxlciBoYW5kbGUuCisgKiBAZW5hYmxlOiAgICAgICAgICAgIEVuYWJsZS9kaXNhYmxlIFRpbWluZyBEQiByZWdpc3RlcgorICoKKyAqIFVwZGF0ZSB0aW1pbmcgZGIgcmVnaXN0ZXIgdmFsdWUgZHVyaW5nIGRmcHMgdXNlY2FzZXMKKyAqCisgKiBSZXR1cm46IGVycm9yIGNvZGUuCisgKi8KK2ludCBkc2lfY3RybF90aW1pbmdfZGJfdXBkYXRlKHN0cnVjdCBkc2lfY3RybCAqZHNpX2N0cmwsCisJCWJvb2wgZW5hYmxlKTsKKworLyoqCiAgKiBkc2lfY3RybF9hc3luY190aW1pbmdfdXBkYXRlKCkgLSB1cGRhdGUgb25seSBjb250cm9sbGVyIHRpbWluZwogICogQGRzaV9jdHJsOiAgICAgICAgICBEU0kgY29udHJvbGxlciBoYW5kbGUuCiAgKiBAdGltaW5nOiAgICAgICAgICAgIE5ldyBEU0kgdGltaW5nIGluZm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmxfaHcuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmxfaHcuaAppbmRleCA1N2Y5YmNkLi43MTRhNDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsX2h3LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybF9ody5oCkBAIC00NDUsNiArNDQ1LDEyIEBACiAJdm9pZCAoKnBoeV9zd19yZXNldCkoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsKTsKIAogCS8qKgorCSAqIGRlYnVnX2J1cygpIC0gZ2V0IGRzaSBkZWJ1ZyBidXMgc3RhdHVzLgorCSAqIEBjdHJsOiAgICAgICAgUG9pbnRlciB0byB0aGUgY29udHJvbGxlciBob3N0IGhhcmR3YXJlLgorCSAqLworCXZvaWQgKCpkZWJ1Z19idXMpKHN0cnVjdCBkc2lfY3RybF9odyAqY3RybCk7CisKKwkvKioKIAkgKiBzb2Z0X3Jlc2V0KCkgLSBwZXJmb3JtIGEgc29mdCByZXNldCBvbiBEU0kgY29udHJvbGxlcgogCSAqIEBjdHJsOiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb250cm9sbGVyIGhvc3QgaGFyZHdhcmUuCiAJICoKQEAgLTUxNCwxMSArNTIwLDE3IEBACiAJICogZ2V0X2NtZF9yZWFkX2RhdGEoKSAtIGdldCBkYXRhIHJlYWQgZnJvbSB0aGUgcGVyaXBoZXJhbAogCSAqIEBjdHJsOiAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY29udHJvbGxlciBob3N0IGhhcmR3YXJlLgogCSAqIEByZF9idWY6ICAgICAgICAgQnVmZmVyIHdoZXJlIGRhdGEgd2lsbCBiZSByZWFkIGludG8uCi0JICogQHRvdGFsX3JlYWRfbGVuOiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKwkgKiBAcmVhZF9vZmZzZXQ6ICAgIE9mZnNldCBmcm9tIHdoZXJlIHRvIHJlYWQuCisJICogQHJ4X2J5dGU6ICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKwkgKiBAcGt0X3NpemU6ICAgICAgICBTaXplIG9mIHJlc3BvbnNlIGV4cGVjdGVkLgorCSAqIEBod19yZWFkX2NudDogICAgQWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkIGJ5IEhXLgogCSAqLwogCXUzMiAoKmdldF9jbWRfcmVhZF9kYXRhKShzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCiAJCQkJIHU4ICpyZF9idWYsCi0JCQkJIHUzMiB0b3RhbF9yZWFkX2xlbik7CisJCQkJIHUzMiByZWFkX29mZnNldCwKKwkJCQkgdTMyIHJ4X2J5dGUsCisJCQkJIHUzMiBwa3Rfc2l6ZSwKKwkJCQkgdTMyICpod19yZWFkX2NudCk7CiAKIAkvKioKIAkgKiB3YWl0X2Zvcl9sYW5lX2lkbGUoKSAtIHdhaXQgZm9yIERTSSBsYW5lcyB0byBnbyB0byBpZGxlIHN0YXRlCkBAIC02OTUsNiArNzA3LDIwIEBACiAJdTMyICgqY29sbGVjdF9taXNyKShzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCiAJCQkgICAgZW51bSBkc2lfb3BfbW9kZSBwYW5lbF9tb2RlKTsKIAorCS8qKgorCSAqIHNldF90aW1pbmdfZGIoKSAtIGVuYWJsZS9kaXNhYmxlIFRpbWluZyBEQiByZWdpc3RlcgorCSAqIEBjdHJsOiAgICAgICAgICBQb2ludGVyIHRvIGNvbnRyb2xsZXIgaG9zdCBoYXJkd2FyZS4KKwkgKiBAZW5hYmxlOiAgICAgICAgRW5hYmxlL0Rpc2FibGUgZmxhZy4KKwkgKgorCSAqIEVuYWJsZSBvciBEaXNhYmUgdGhlIFRpbWluZyBEQiByZWdpc3Rlci4KKwkgKi8KKwl2b2lkICgqc2V0X3RpbWluZ19kYikoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsLAorCQkJCSBib29sIGVuYWJsZSk7CisJLyoqCisJICogY2xlYXJfcmRia19yZWdpc3RlcigpIC0gQ2xlYXIgYW5kIHJlc2V0IHJlYWQgYmFjayByZWdpc3RlcgorCSAqIEBjdHJsOiAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2xsZXIgaG9zdCBoYXJkd2FyZS4KKwkgKi8KKwl2b2lkICgqY2xlYXJfcmRia19yZWdpc3Rlcikoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsKTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsX2h3X2Ntbi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybF9od19jbW4uYwppbmRleCAzZmVjMjk2Li4yOTU5ZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsX2h3X2Ntbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmxfaHdfY21uLmMKQEAgLTE2LDExICsxNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CiAKKyNpbmNsdWRlICJkc2lfY2F0YWxvZy5oIgogI2luY2x1ZGUgImRzaV9jdHJsX2h3LmgiCiAjaW5jbHVkZSAiZHNpX2N0cmxfcmVnLmgiCiAjaW5jbHVkZSAiZHNpX2h3LmgiCiAjaW5jbHVkZSAiZHNpX3BhbmVsLmgiCiAjaW5jbHVkZSAiZHNpX2NhdGFsb2cuaCIKKyNpbmNsdWRlICJzZGVfZGJnLmgiCiAKICNkZWZpbmUgTU1TU19NSVNDX0NMQU1QX1JFR19PRkYgICAgICAgICAgIDB4MDAxNAogI2RlZmluZSBEU0lfQ1RSTF9EWU5BTUlDX0ZPUkNFX09OICAgICAgICAgKDB4MjNGfEJJVCg4KXxCSVQoOSl8QklUKDExKXxCSVQoMjEpKQpAQCAtMjE4LDYgKzIyMCwyNyBAQAogfQogCiAvKioKKyogc2V0X3RpbWluZ19kYigpIC0gZW5hYmxlL2Rpc2FibGUgVGltaW5nIERCIHJlZ2lzdGVyCisqIEBjdHJsOiAgICAgICAgICBQb2ludGVyIHRvIGNvbnRyb2xsZXIgaG9zdCBoYXJkd2FyZS4KKyogQGVuYWJsZTogICAgICAgIEVuYWJsZS9EaXNhYmxlIGZsYWcuCisqCisqIEVuYWJsZSBvciBEaXNhYmUgdGhlIFRpbWluZyBEQiByZWdpc3Rlci4KKyovCit2b2lkIGRzaV9jdHJsX2h3X2Ntbl9zZXRfdGltaW5nX2RiKHN0cnVjdCBkc2lfY3RybF9odyAqY3RybCwKKwkJCQkgICAgIGJvb2wgZW5hYmxlKQoreworCWlmIChlbmFibGUpCisJCURTSV9XMzIoY3RybCwgRFNJX0RTSV9USU1JTkdfREJfTU9ERSwgMHgxKTsKKwllbHNlCisJCURTSV9XMzIoY3RybCwgRFNJX0RTSV9USU1JTkdfREJfTU9ERSwgMHgwKTsKKworCXdtYigpOyAvKiBtYWtlIHN1cmUgdGltaW5nIGRiIHJlZ2lzdGVycyBhcmUgc2V0ICovCisJcHJfZGVidWcoIltEU0lfJWRdIGN0cmwgdGltaW5nIERCIHNldDolZFxuIiwgY3RybC0+aW5kZXgsCisJCQkJZW5hYmxlKTsKKwlTREVfRVZUMzIoY3RybC0+aW5kZXgsIGVuYWJsZSk7Cit9CisKKy8qKgogICogc2V0X3ZpZGVvX3RpbWluZygpIC0gc2V0IHVwIHRoZSB0aW1pbmcgZm9yIHZpZGVvIGZyYW1lCiAgKiBAY3RybDogICAgICAgICAgUG9pbnRlciB0byBjb250cm9sbGVyIGhvc3QgaGFyZHdhcmUuCiAgKiBAbW9kZTogICAgICAgICAgVmlkZW8gbW9kZSBpbmZvcm1hdGlvbi4KQEAgLTI5MCw2ICszMTMsNyBAQAogCURTSV9XMzIoY3RybCwgRFNJX01JU1JfVklERU9fQ1RSTCwgMHgxMDEwMCk7CiAJRFNJX1czMihjdHJsLCBEU0lfRFNJX1RJTUlOR19GTFVTSCwgMHgxKTsKIAlwcl9kZWJ1ZygiW0RTSV8lZF0gY3RybCB2aWRlbyBwYXJhbWV0ZXJzIHVwZGF0ZWRcbiIsIGN0cmwtPmluZGV4KTsKKwlTREVfRVZUMzIodl90b3RhbCwgaF90b3RhbCk7CiB9CiAKIC8qKgpAQCAtMzU0LDggKzM3OCw2IEBACiAJCXJlZ19jdHJsIHw9IChyZWcgPDwgb2Zmc2V0KTsKIAkJcmVnX2N0cmwyICY9IH4oMHhGRkZGIDw8IG9mZnNldCk7CiAJCXJlZ19jdHJsMiB8PSAoZHNjLmJ5dGVzX2luX3NsaWNlIDw8IG9mZnNldCk7Ci0JCURTSV9XMzIoY3RybCwgRFNJX0NPTU1BTkRfQ09NUFJFU1NJT05fTU9ERV9DVFJMLCByZWdfY3RybCk7Ci0JCURTSV9XMzIoY3RybCwgRFNJX0NPTU1BTkRfQ09NUFJFU1NJT05fTU9ERV9DVFJMMiwgcmVnX2N0cmwyKTsKIAogCQlwcl9kZWJ1ZygiY3RybCAlZCByZWdfY3RybCAweCV4IHJlZ19jdHJsMiAweCV4XG4iLCBjdHJsLT5pbmRleCwKIAkJCQlyZWdfY3RybCwgcmVnX2N0cmwyKTsKQEAgLTM3Myw2ICszOTUsOSBAQAogCXN0cmVhbV9jdHJsIHw9ICh2Y19pZCAmIDB4MykgPDwgODsKIAlzdHJlYW1fY3RybCB8PSAweDM5OyAvKiBwYWNrZXQgZGF0YSB0eXBlICovCiAKKwlEU0lfVzMyKGN0cmwsIERTSV9DT01NQU5EX0NPTVBSRVNTSU9OX01PREVfQ1RSTCwgcmVnX2N0cmwpOworCURTSV9XMzIoY3RybCwgRFNJX0NPTU1BTkRfQ09NUFJFU1NJT05fTU9ERV9DVFJMMiwgcmVnX2N0cmwyKTsKKwogCURTSV9XMzIoY3RybCwgRFNJX0NPTU1BTkRfTU9ERV9NRFBfU1RSRUFNMF9DVFJMLCBzdHJlYW1fY3RybCk7CiAJRFNJX1czMihjdHJsLCBEU0lfQ09NTUFORF9NT0RFX01EUF9TVFJFQU0xX0NUUkwsIHN0cmVhbV9jdHJsKTsKIApAQCAtNDIzLDYgKzQ0OCwxOCBAQAogCXByX2RlYnVnKCJbRFNJXyVkXSBWaWRlbyBlbmdpbmUgc2V0dXAgZG9uZVxuIiwgY3RybC0+aW5kZXgpOwogfQogCit2b2lkIGRzaV9jdHJsX2h3X2Ntbl9kZWJ1Z19idXMoc3RydWN0IGRzaV9jdHJsX2h3ICpjdHJsKQoreworCXUzMiByZWcgPSAwOworCisJRFNJX1czMihjdHJsLCBEU0lfREVCVUdfQlVTX0NUTCwgMHgxODEpOworCisJLyogbWFrZSBzdXJlIHRoYXQgZGVidWcgdGVzdCBwb2ludCBpcyBlbmFibGVkICovCisJd21iKCk7CisJcmVnID0gRFNJX1IzMihjdHJsLCBEU0lfREVCVUdfQlVTX1NUQVRVUyk7CisKKwlwcl9lcnIoIltEU0lfJWRdIGRlYnVnIGJ1cyBzdGF0dXM6MHgleFxuIiwgY3RybC0+aW5kZXgsIHJlZyk7Cit9CiAvKioKICAqIGNtZF9lbmdpbmVfc2V0dXAoKSAtIHNldHVwIGRzaSBob3N0IGNvbnRyb2xsZXIgZm9yIGNvbW1hbmQgbW9kZQogICogQGN0cmw6ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2xsZXIgaG9zdCBoYXJkd2FyZS4KQEAgLTY3Myw2ICs3MTAsMjIgQEAKIH0KIAogLyoqCisgKiBjbGVhcl9yZGJrX3JlZygpIC0gY2xlYXIgcHJldmlvdXNseSByZWFkIHBhbmVsIGRhdGEuCisgKiBAY3RybDogICAgICAgICAgUG9pbnRlciB0byB0aGUgY29udHJvbGxlciBob3N0IGhhcmR3YXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBzZW5kaW5nIERTSSBSeCBjb21tYW5kIHRvCisgKiBwYW5lbCBpbiBvcmRlciB0byBjbGVhciBpZiBhbnkgc3RhbGUgZGF0YSByZW1haW5pbmcgZnJvbQorICogcHJldmlvdXMgcmVhZCBvcGVyYXRpb24uCisgKi8KK3ZvaWQgZHNpX2N0cmxfaHdfY21uX2NsZWFyX3JkYmtfcmVnKHN0cnVjdCBkc2lfY3RybF9odyAqY3RybCkKK3sKKwlEU0lfVzMyKGN0cmwsIERTSV9SREJLX0RBVEFfQ1RSTCwgMHgxKTsKKwl3bWIoKTsgLyogZW5zdXJlIHJlYWQgYmFjayByZWdpc3RlciBpcyByZXNldCAqLworCURTSV9XMzIoY3RybCwgRFNJX1JEQktfREFUQV9DVFJMLCAweDApOworCXdtYigpOyAvKiBlbnN1cmUgcmVhZCBiYWNrIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8KK30KKworLyoqCiAgKiBnZXRfY21kX3JlYWRfZGF0YSgpIC0gZ2V0IGRhdGEgcmVhZCBmcm9tIHRoZSBwZXJpcGhlcmFsCiAgKiBAY3RybDogICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2xsZXIgaG9zdCBoYXJkd2FyZS4KICAqIEByZF9idWY6ICAgICAgICAgQnVmZmVyIHdoZXJlIGRhdGEgd2lsbCBiZSByZWFkIGludG8uCkBAIC02ODMsMTYgKzczNiwxNiBAQAogdTMyIGRzaV9jdHJsX2h3X2Ntbl9nZXRfY21kX3JlYWRfZGF0YShzdHJ1Y3QgZHNpX2N0cmxfaHcgKmN0cmwsCiAJCQkJICAgICB1OCAqcmRfYnVmLAogCQkJCSAgICAgdTMyIHJlYWRfb2Zmc2V0LAotCQkJCSAgICAgdTMyIHRvdGFsX3JlYWRfbGVuKQorCQkJCSAgICAgdTMyIHJ4X2J5dGUsCisJCQkJICAgICB1MzIgcGt0X3NpemUsCisJCQkJICAgICB1MzIgKmh3X3JlYWRfY250KQogewogCXUzMiAqbHAsICp0ZW1wLCBkYXRhOwotCWludCBpLCBqID0gMCwgY250OworCWludCBpLCBqID0gMCwgY250LCBvZmY7CiAJdTMyIHJlYWRfY250OwotCXUzMiByeF9ieXRlID0gMDsKIAl1MzIgcmVwZWF0ZWRfYnl0ZXMgPSAwOwogCXU4IHJlZ1sxNl0gPSB7MH07Ci0JdTMyIHBrdF9zaXplID0gMDsKLQlpbnQgYnVmX29mZnNldCA9IHJlYWRfb2Zmc2V0OworCWJvb2wgYWNrX2VyciA9IGZhbHNlOwogCiAJbHAgPSAodTMyICopcmRfYnVmOwogCXRlbXAgPSAodTMyICopcmVnOwpAQCAtNzAxLDI4ICs3NTQsNDkgQEAKIAlpZiAoY250ID4gNCkKIAkJY250ID0gNDsKIAotCWlmIChyeF9ieXRlID09IDQpCi0JCXJlYWRfY250ID0gNDsKLQllbHNlCi0JCXJlYWRfY250ID0gcGt0X3NpemUgKyA2OworCXJlYWRfY250ID0gKERTSV9SMzIoY3RybCwgRFNJX1JEQktfREFUQV9DVFJMKSA+PiAxNik7CisJYWNrX2VyciA9IChyeF9ieXRlID09IDQpID8gKHJlYWRfY250ID09IDgpIDoKKwkJCSgocmVhZF9jbnQgLSA0KSA9PSAocGt0X3NpemUgKyA2KSk7CisKKwlpZiAoYWNrX2VycikKKwkJcmVhZF9jbnQgLT0gNDsKKwlpZiAoIXJlYWRfY250KSB7CisJCXByX2VycigiUGFuZWwgZGV0ZWN0ZWQgZXJyb3IsIG5vIGRhdGEgcmVhZFxuIik7CisJCXJldHVybiAwOworCX0KIAogCWlmIChyZWFkX2NudCA+IDE2KSB7Ci0JCWludCBieXRlc19zaGlmdGVkOworCQlpbnQgYnl0ZXNfc2hpZnRlZCwgZGF0YV9sb3N0ID0gMCwgcmVtX2hlYWRlciA9IDA7CiAKLQkJYnl0ZXNfc2hpZnRlZCA9IHJlYWRfY250IC0gMTY7Ci0JCXJlcGVhdGVkX2J5dGVzID0gYnVmX29mZnNldCAtIGJ5dGVzX3NoaWZ0ZWQ7CisJCWJ5dGVzX3NoaWZ0ZWQgPSByZWFkX2NudCAtIHJ4X2J5dGU7CisJCWlmIChieXRlc19zaGlmdGVkID49IDQpCisJCQlkYXRhX2xvc3QgPSBieXRlc19zaGlmdGVkIC0gNDsgLyogcmVtb3ZlIERDUyBoZWFkZXIgKi8KKwkJZWxzZQorCQkJcmVtX2hlYWRlciA9IDQgLSBieXRlc19zaGlmdGVkOyAvKiByZW1haW5pbmcgaGVhZGVyICovCisKKwkJcmVwZWF0ZWRfYnl0ZXMgPSAocmVhZF9vZmZzZXQgLSA0KSAtIGRhdGFfbG9zdCArIHJlbV9oZWFkZXI7CiAJfQogCi0JZm9yIChpID0gY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJZGF0YSA9IERTSV9SMzIoY3RybCwgRFNJX1JEQktfREFUQTAgKyBpKjQpOwotCQkqdGVtcCsrID0gbnRvaGwoZGF0YSk7CisJb2ZmID0gRFNJX1JEQktfREFUQTA7CisJb2ZmICs9ICgoY250IC0gMSkgKiA0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlkYXRhID0gRFNJX1IzMihjdHJsLCBvZmYpOworCQlpZiAoIXJlcGVhdGVkX2J5dGVzKQorCQkJKmxwKysgPSBudG9obChkYXRhKTsKKwkJZWxzZQorCQkJKnRlbXArKyA9IG50b2hsKGRhdGEpOworCQlvZmYgLT0gNDsKIAl9CiAKLQlmb3IgKGkgPSByZXBlYXRlZF9ieXRlczsgaSA8IDE2OyBpKyspCi0JCXJkX2J1ZltqKytdID0gcmVnW2ldOworCWlmIChyZXBlYXRlZF9ieXRlcykgeworCQlmb3IgKGkgPSByZXBlYXRlZF9ieXRlczsgaSA8IDE2OyBpKyspCisJCQlyZF9idWZbaisrXSA9IHJlZ1tpXTsKKwl9CiAKLQlwcl9kZWJ1ZygiW0RTSV8lZF0gUmVhZCAlZCBieXRlc1xuIiwgY3RybC0+aW5kZXgsIGopOwotCXJldHVybiBqOworCSpod19yZWFkX2NudCA9IHJlYWRfY250OworCXByX2RlYnVnKCJbRFNJXyVkXSBSZWFkICVkIGJ5dGVzXG4iLCBjdHJsLT5pbmRleCwgcnhfYnl0ZSk7CisJcmV0dXJuIHJ4X2J5dGU7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybF9yZWcuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2N0cmxfcmVnLmgKaW5kZXggZjhmN2UxMy4uMzlhYzAyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfY3RybF9yZWcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9jdHJsX3JlZy5oCkBAIC04Miw2ICs4Miw4IEBACiAjZGVmaW5lIERTSV9TT0ZUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMTE4KQogI2RlZmluZSBEU0lfQ0xLX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDExQykKICNkZWZpbmUgRFNJX0NMS19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxMjApCisjZGVmaW5lIERTSV9ERUJVR19CVVNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMTI0KQorI2RlZmluZSBEU0lfREVCVUdfQlVTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgKDB4MDEyOCkKICNkZWZpbmUgRFNJX1BIWV9TV19SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAxMkMpCiAjZGVmaW5lIERTSV9BWEkyQUhCX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMTMwKQogI2RlZmluZSBEU0lfTUlTUl9DTURfTURQMF8zMkJJVCAgICAgICAgICAgICAgICAgICAgKDB4MDEzNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RlZnMuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RlZnMuaAppbmRleCBmY2M1OWVmLi45NmVkNDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9kZWZzLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfZGVmcy5oCkBAIC03NywxMiArNzcsMTUgQEAKICAqIEBEU0lfTU9ERV9GTEFHX0RGUFM6CQlTZWFtbGVzcyB0cmFuc2l0aW9uIGlzIER5bmFtaWNGUFMKICAqIEBEU0lfTU9ERV9GTEFHX1ZCTEFOS19QUkVfTU9ERVNFVDoJVHJhbnNpdGlvbiBuZWVkcyBWQkxBTksgYmVmb3JlIE1vZGVzZXQKICAqIEBEU0lfTU9ERV9GTEFHX0RNUzogU2VhbWxlc3MgdHJhbnNpdGlvbiBpcyBkeW5hbWljIG1vZGUgc3dpdGNoCisgKiBARFNJX01PREVfRkxBR19WUlI6IFNlYW1sZXNzIHRyYW5zaXRpb24gaXMgRHluYW1pY0ZQUy4KKyAqICAgICAgICAgICAgICAgICAgICAgTmV3IHRpbWluZyB2YWx1ZXMgYXJlIHNlbnQgZnJvbSBEQUwuCiAgKi8KIGVudW0gZHNpX21vZGVfZmxhZ3MgewogCURTSV9NT0RFX0ZMQUdfU0VBTUxFU1MJCQk9IEJJVCgwKSwKIAlEU0lfTU9ERV9GTEFHX0RGUFMJCQk9IEJJVCgxKSwKIAlEU0lfTU9ERV9GTEFHX1ZCTEFOS19QUkVfTU9ERVNFVAk9IEJJVCgyKSwKIAlEU0lfTU9ERV9GTEFHX0RNUwkJCT0gQklUKDMpLAorCURTSV9NT0RFX0ZMQUdfVlJSCQkJPSBCSVQoNCksCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2Rpc3BsYXkuYwppbmRleCA0ZTc2YWE1Li5kNzFhNWYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2Rpc3BsYXkuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImRzaV9kcm0uaCIKICNpbmNsdWRlICJkc2lfY2xrLmgiCiAjaW5jbHVkZSAiZHNpX3B3ci5oIgorI2luY2x1ZGUgInNkZV9kYmcuaCIKIAogI2RlZmluZSB0b19kc2lfZGlzcGxheSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRzaV9kaXNwbGF5LCBob3N0KQogI2RlZmluZSBJTlRfQkFTRV8xMCAxMApAQCAtODQsNiArODUsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYW5lbCA9IGRzaV9kaXNwbGF5LT5wYW5lbDsKKworCWlmICghZHNpX3BhbmVsX2luaXRpYWxpemVkKHBhbmVsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlwYW5lbC0+YmxfY29uZmlnLmJsX2xldmVsID0gYmxfbHZsOwogCiAJLyogc2NhbGUgYmFja2xpZ2h0ICovCkBAIC05NSwxMCArMTAwLDMwNCBAQAogCiAJcHJfZGVidWcoImJsX3NjYWxlID0gJXUsIGJsX3NjYWxlX2FkID0gJXUsIGJsX2x2bCA9ICV1XG4iLAogCQlibF9zY2FsZSwgYmxfc2NhbGVfYWQsICh1MzIpYmxfdGVtcCk7CisKKwlyYyA9IGRzaV9kaXNwbGF5X2Nsa19jdHJsKGRzaV9kaXNwbGF5LT5kc2lfY2xrX2hhbmRsZSwKKwkJCURTSV9DT1JFX0NMSywgRFNJX0NMS19PTik7CisJaWYgKHJjKSB7CisJCXByX2VycigiWyVzXSBmYWlsZWQgdG8gZW5hYmxlIERTSSBjb3JlIGNsb2NrcywgcmM9JWRcbiIsCisJCSAgICAgICBkc2lfZGlzcGxheS0+bmFtZSwgcmMpOworCQlnb3RvIGVycm9yOworCX0KKwogCXJjID0gZHNpX3BhbmVsX3NldF9iYWNrbGlnaHQocGFuZWwsICh1MzIpYmxfdGVtcCk7CiAJaWYgKHJjKQogCQlwcl9lcnIoInVuYWJsZSB0byBzZXQgYmFja2xpZ2h0XG4iKTsKIAorCXJjID0gZHNpX2Rpc3BsYXlfY2xrX2N0cmwoZHNpX2Rpc3BsYXktPmRzaV9jbGtfaGFuZGxlLAorCQkJRFNJX0NPUkVfQ0xLLCBEU0lfQ0xLX09GRik7CisJaWYgKHJjKSB7CisJCXByX2VycigiWyVzXSBmYWlsZWQgdG8gZGlzYWJsZSBEU0kgY29yZSBjbG9ja3MsIHJjPSVkXG4iLAorCQkgICAgICAgZHNpX2Rpc3BsYXktPm5hbWUsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9jbWRfZW5naW5lX2VuYWJsZShzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXlfY3RybCAqbV9jdHJsLCAqY3RybDsKKworCWlmIChkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50ID4gMCkgeworCQlkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50Kys7CisJCXJldHVybiAwOworCX0KKworCW1fY3RybCA9ICZkaXNwbGF5LT5jdHJsW2Rpc3BsYXktPmNtZF9tYXN0ZXJfaWR4XTsKKworCXJjID0gZHNpX2N0cmxfc2V0X2NtZF9lbmdpbmVfc3RhdGUobV9jdHJsLT5jdHJsLCBEU0lfQ1RSTF9FTkdJTkVfT04pOworCWlmIChyYykgeworCQlwcl9lcnIoIlslc10gZmFpbGVkIHRvIGVuYWJsZSBjbWQgZW5naW5lLCByYz0lZFxuIiwKKwkJICAgICAgIGRpc3BsYXktPm5hbWUsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGxheS0+Y3RybF9jb3VudDsgaSsrKSB7CisJCWN0cmwgPSAmZGlzcGxheS0+Y3RybFtpXTsKKwkJaWYgKCFjdHJsLT5jdHJsIHx8IChjdHJsID09IG1fY3RybCkpCisJCQljb250aW51ZTsKKworCQlyYyA9IGRzaV9jdHJsX3NldF9jbWRfZW5naW5lX3N0YXRlKGN0cmwtPmN0cmwsCisJCQkJCQkgICBEU0lfQ1RSTF9FTkdJTkVfT04pOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiWyVzXSBmYWlsZWQgdG8gZW5hYmxlIGNtZCBlbmdpbmUsIHJjPSVkXG4iLAorCQkJICAgICAgIGRpc3BsYXktPm5hbWUsIHJjKTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV9tYXN0ZXI7CisJCX0KKwl9CisKKwlkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50Kys7CisJcmV0dXJuIHJjOworZXJyb3JfZGlzYWJsZV9tYXN0ZXI6CisJKHZvaWQpZHNpX2N0cmxfc2V0X2NtZF9lbmdpbmVfc3RhdGUobV9jdHJsLT5jdHJsLCBEU0lfQ1RSTF9FTkdJTkVfT0ZGKTsKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9jbWRfZW5naW5lX2Rpc2FibGUoc3RydWN0IGRzaV9kaXNwbGF5ICpkaXNwbGF5KQoreworCWludCByYyA9IDA7CisJaW50IGk7CisJc3RydWN0IGRzaV9kaXNwbGF5X2N0cmwgKm1fY3RybCwgKmN0cmw7CisKKwlpZiAoZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCA9PSAwKSB7CisJCXByX2VycigiWyVzXSBJbnZhbGlkIHJlZmNvdW50XG4iLCBkaXNwbGF5LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50ID4gMSkgeworCQlkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50LS07CisJCXJldHVybiAwOworCX0KKworCW1fY3RybCA9ICZkaXNwbGF5LT5jdHJsW2Rpc3BsYXktPmNtZF9tYXN0ZXJfaWR4XTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGxheS0+Y3RybF9jb3VudDsgaSsrKSB7CisJCWN0cmwgPSAmZGlzcGxheS0+Y3RybFtpXTsKKwkJaWYgKCFjdHJsLT5jdHJsIHx8IChjdHJsID09IG1fY3RybCkpCisJCQljb250aW51ZTsKKworCQlyYyA9IGRzaV9jdHJsX3NldF9jbWRfZW5naW5lX3N0YXRlKGN0cmwtPmN0cmwsCisJCQkJCQkgICBEU0lfQ1RSTF9FTkdJTkVfT0ZGKTsKKwkJaWYgKHJjKQorCQkJcHJfZXJyKCJbJXNdIGZhaWxlZCB0byBlbmFibGUgY21kIGVuZ2luZSwgcmM9JWRcbiIsCisJCQkgICAgICAgZGlzcGxheS0+bmFtZSwgcmMpOworCX0KKworCXJjID0gZHNpX2N0cmxfc2V0X2NtZF9lbmdpbmVfc3RhdGUobV9jdHJsLT5jdHJsLCBEU0lfQ1RSTF9FTkdJTkVfT0ZGKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJbJXNdIGZhaWxlZCB0byBlbmFibGUgY21kIGVuZ2luZSwgcmM9JWRcbiIsCisJCSAgICAgICBkaXNwbGF5LT5uYW1lLCByYyk7CisJCWdvdG8gZXJyb3I7CisJfQorCitlcnJvcjoKKwlkaXNwbGF5LT5jbWRfZW5naW5lX3JlZmNvdW50ID0gMDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIGRzaV9kaXNwbGF5X3ZhbGlkYXRlX3JlZ19yZWFkKHN0cnVjdCBkc2lfcGFuZWwgKnBhbmVsKQoreworCWludCBpLCBqID0gMDsKKwlpbnQgbGVuID0gMCwgKmxlbnA7CisJaW50IGdyb3VwID0gMCwgY291bnQgPSAwOworCXN0cnVjdCBkc2lfZGlzcGxheV9tb2RlICptb2RlOworCXN0cnVjdCBkcm1fcGFuZWxfZXNkX2NvbmZpZyAqY29uZmlnOworCisJaWYgKCFwYW5lbCkKKwkJcmV0dXJuIGZhbHNlOworCisJY29uZmlnID0gJihwYW5lbC0+ZXNkX2NvbmZpZyk7CisKKwlsZW5wID0gY29uZmlnLT5zdGF0dXNfdmFsaWRfcGFyYW1zID86IGNvbmZpZy0+c3RhdHVzX2NtZHNfcmxlbjsKKwltb2RlID0gcGFuZWwtPmN1cl9tb2RlOworCWNvdW50ID0gbW9kZS0+cHJpdl9pbmZvLT5jbWRfc2V0c1tEU0lfQ01EX1NFVF9QQU5FTF9TVEFUVVNdLmNvdW50OworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWxlbiArPSBsZW5wW2ldOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlqICs9IGxlbjsKKworCWZvciAoaiA9IDA7IGogPCBjb25maWctPmdyb3VwczsgKytqKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJaWYgKGNvbmZpZy0+cmV0dXJuX2J1ZltpXSAhPQorCQkJCWNvbmZpZy0+c3RhdHVzX3ZhbHVlW2dyb3VwICsgaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSA9PSBsZW4pCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZ3JvdXAgKz0gbGVuOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHNpX2Rpc3BsYXlfY3RybCAqY3RybCwKKwkJc3RydWN0IGRzaV9wYW5lbCAqcGFuZWwpCit7CisJaW50IGksIHJjID0gMCwgY291bnQgPSAwLCBzdGFydCA9IDAsICpsZW5wOworCXN0cnVjdCBkcm1fcGFuZWxfZXNkX2NvbmZpZyAqY29uZmlnOworCXN0cnVjdCBkc2lfY21kX2Rlc2MgKmNtZHM7CisJdTMyIGZsYWdzID0gMDsKKworCWlmICghcGFuZWwpCisJCXJldHVybiAtRUlOVkFMOworCisJY29uZmlnID0gJihwYW5lbC0+ZXNkX2NvbmZpZyk7CisJbGVucCA9IGNvbmZpZy0+c3RhdHVzX3ZhbGlkX3BhcmFtcyA/OiBjb25maWctPnN0YXR1c19jbWRzX3JsZW47CisJY291bnQgPSBjb25maWctPnN0YXR1c19jbWQuY291bnQ7CisJY21kcyA9IGNvbmZpZy0+c3RhdHVzX2NtZC5jbWRzOworCWZsYWdzID0gKERTSV9DVFJMX0NNRF9GRVRDSF9NRU1PUlkgfCBEU0lfQ1RSTF9DTURfUkVBRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworCQltZW1zZXQoY29uZmlnLT5zdGF0dXNfYnVmLCAweDAsIFNaXzRLKTsKKwkJY21kc1tpXS5tc2cucnhfYnVmID0gY29uZmlnLT5zdGF0dXNfYnVmOworCQljbWRzW2ldLm1zZy5yeF9sZW4gPSBjb25maWctPnN0YXR1c19jbWRzX3JsZW5baV07CisJCXJjID0gZHNpX2N0cmxfY21kX3RyYW5zZmVyKGN0cmwtPmN0cmwsICZjbWRzW2ldLm1zZywgZmxhZ3MpOworCQlpZiAocmMgPD0gMCkgeworCQkJcHJfZXJyKCJyeCBjbWQgdHJhbnNmZXIgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJbWVtY3B5KGNvbmZpZy0+cmV0dXJuX2J1ZiArIHN0YXJ0LAorCQkJY29uZmlnLT5zdGF0dXNfYnVmLCBsZW5wW2ldKTsKKwkJc3RhcnQgKz0gbGVucFtpXTsKKwl9CisKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkc2lfZGlzcGxheV92YWxpZGF0ZV9zdGF0dXMoc3RydWN0IGRzaV9kaXNwbGF5X2N0cmwgKmN0cmwsCisJCXN0cnVjdCBkc2lfcGFuZWwgKnBhbmVsKQoreworCWludCByYyA9IDA7CisKKwlyYyA9IGRzaV9kaXNwbGF5X3JlYWRfc3RhdHVzKGN0cmwsIHBhbmVsKTsKKwlpZiAocmMgPD0gMCkgeworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogcGFuZWwgc3RhdHVzIHJlYWQgc3VjY2Vzc2Z1bGx5LgorCQkgKiBjaGVjayBmb3IgdmFsaWRpdHkgb2YgdGhlIGRhdGEgcmVhZCBiYWNrLgorCQkgKi8KKwkJcmMgPSBkc2lfZGlzcGxheV92YWxpZGF0ZV9yZWdfcmVhZChwYW5lbCk7CisJCWlmICghcmMpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworZXhpdDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfc3RhdHVzX3JlZ19yZWFkKHN0cnVjdCBkc2lfZGlzcGxheSAqZGlzcGxheSkKK3sKKwlpbnQgcmMgPSAwLCBpOworCXN0cnVjdCBkc2lfZGlzcGxheV9jdHJsICptX2N0cmwsICpjdHJsOworCisJcHJfZGVidWcoIiArK1xuIik7CisKKwltX2N0cmwgPSAmZGlzcGxheS0+Y3RybFtkaXNwbGF5LT5jbWRfbWFzdGVyX2lkeF07CisKKwlyYyA9IGRzaV9kaXNwbGF5X2NtZF9lbmdpbmVfZW5hYmxlKGRpc3BsYXkpOworCWlmIChyYykgeworCQlwcl9lcnIoImNtZCBlbmdpbmUgZW5hYmxlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJcmMgPSBkc2lfZGlzcGxheV92YWxpZGF0ZV9zdGF0dXMobV9jdHJsLCBkaXNwbGF5LT5wYW5lbCk7CisJaWYgKHJjIDw9IDApIHsKKwkJcHJfZXJyKCJbJXNdIHJlYWQgc3RhdHVzIGZhaWxlZCBvbiBtYXN0ZXIscmM9JWRcbiIsCisJCSAgICAgICBkaXNwbGF5LT5uYW1lLCByYyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIWRpc3BsYXktPnBhbmVsLT5zeW5jX2Jyb2FkY2FzdF9lbikKKwkJZ290byBleGl0OworCisJZm9yIChpID0gMDsgaSA8IGRpc3BsYXktPmN0cmxfY291bnQ7IGkrKykgeworCQljdHJsID0gJmRpc3BsYXktPmN0cmxbaV07CisJCWlmIChjdHJsID09IG1fY3RybCkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gZHNpX2Rpc3BsYXlfdmFsaWRhdGVfc3RhdHVzKGN0cmwsIGRpc3BsYXktPnBhbmVsKTsKKwkJaWYgKHJjIDw9IDApIHsKKwkJCXByX2VycigiWyVzXSByZWFkIHN0YXR1cyBmYWlsZWQgb24gbWFzdGVyLHJjPSVkXG4iLAorCQkJICAgICAgIGRpc3BsYXktPm5hbWUsIHJjKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworZXhpdDoKKwlkc2lfZGlzcGxheV9jbWRfZW5naW5lX2Rpc2FibGUoZGlzcGxheSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X3N0YXR1c19idGFfcmVxdWVzdChzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIgKytcbiIpOworCS8qIFRPRE86IHRyaWdnZXIgU1cgQlRBIGFuZCB3YWl0IGZvciBhY2tub3dsZWRnbWVudCAqLworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGRzaV9kaXNwbGF5X3N0YXR1c19jaGVja190ZShzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXkpCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCIgKytcbiIpOworCS8qIFRPRE86IHdhaXQgZm9yIFRFIGludGVycnVwdCBmcm9tIHBhbmVsICovCisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBkc2lfZGlzcGxheV9jaGVja19zdGF0dXModm9pZCAqZGlzcGxheSkKK3sKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRzaV9kaXNwbGF5ID0gZGlzcGxheTsKKwlzdHJ1Y3QgZHNpX3BhbmVsICpwYW5lbDsKKwl1MzIgc3RhdHVzX21vZGU7CisJaW50IHJjID0gMDsKKworCWlmIChkc2lfZGlzcGxheSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhbmVsID0gZHNpX2Rpc3BsYXktPnBhbmVsOworCisJc3RhdHVzX21vZGUgPSBwYW5lbC0+ZXNkX2NvbmZpZy5zdGF0dXNfbW9kZTsKKworCWRzaV9kaXNwbGF5X2Nsa19jdHJsKGRzaV9kaXNwbGF5LT5kc2lfY2xrX2hhbmRsZSwKKwkJRFNJX0FMTF9DTEtTLCBEU0lfQ0xLX09OKTsKKworCWlmIChzdGF0dXNfbW9kZSA9PSBFU0RfTU9ERV9SRUdfUkVBRCkgeworCQlyYyA9IGRzaV9kaXNwbGF5X3N0YXR1c19yZWdfcmVhZChkc2lfZGlzcGxheSk7CisJfSBlbHNlIGlmIChzdGF0dXNfbW9kZSA9PSBFU0RfTU9ERV9TV19CVEEpIHsKKwkJcmMgPSBkc2lfZGlzcGxheV9zdGF0dXNfYnRhX3JlcXVlc3QoZHNpX2Rpc3BsYXkpOworCX0gZWxzZSBpZiAoc3RhdHVzX21vZGUgPT0gRVNEX01PREVfUEFORUxfVEUpIHsKKwkJcmMgPSBkc2lfZGlzcGxheV9zdGF0dXNfY2hlY2tfdGUoZHNpX2Rpc3BsYXkpOworCX0gZWxzZSB7CisJCXByX3dhcm4oInVuc3VwcG9ydGVkIGNoZWNrIHN0YXR1cyBtb2RlXG4iKTsKKwkJcGFuZWwtPmVzZF9jb25maWcuZXNkX2VuYWJsZWQgPSBmYWxzZTsKKwl9CisKKwlkc2lfZGlzcGxheV9jbGtfY3RybChkc2lfZGlzcGxheS0+ZHNpX2Nsa19oYW5kbGUsCisJCURTSV9BTExfQ0xLUywgRFNJX0NMS19PRkYpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMTg4LDg3ICsxNDg3LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfY21kX2VuZ2luZV9lbmFibGUoc3RydWN0IGRzaV9kaXNwbGF5ICpkaXNwbGF5KQotewotCWludCByYyA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IGRzaV9kaXNwbGF5X2N0cmwgKm1fY3RybCwgKmN0cmw7Ci0KLQlpZiAoZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCA+IDApIHsKLQkJZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCsrOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltX2N0cmwgPSAmZGlzcGxheS0+Y3RybFtkaXNwbGF5LT5jbWRfbWFzdGVyX2lkeF07Ci0KLQlyYyA9IGRzaV9jdHJsX3NldF9jbWRfZW5naW5lX3N0YXRlKG1fY3RybC0+Y3RybCwgRFNJX0NUUkxfRU5HSU5FX09OKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCJbJXNdIGZhaWxlZCB0byBlbmFibGUgY21kIGVuZ2luZSwgcmM9JWRcbiIsCi0JCSAgICAgICBkaXNwbGF5LT5uYW1lLCByYyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGRpc3BsYXktPmN0cmxfY291bnQ7IGkrKykgewotCQljdHJsID0gJmRpc3BsYXktPmN0cmxbaV07Ci0JCWlmICghY3RybC0+Y3RybCB8fCAoY3RybCA9PSBtX2N0cmwpKQotCQkJY29udGludWU7Ci0KLQkJcmMgPSBkc2lfY3RybF9zZXRfY21kX2VuZ2luZV9zdGF0ZShjdHJsLT5jdHJsLAotCQkJCQkJICAgRFNJX0NUUkxfRU5HSU5FX09OKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIlslc10gZmFpbGVkIHRvIGVuYWJsZSBjbWQgZW5naW5lLCByYz0lZFxuIiwKLQkJCSAgICAgICBkaXNwbGF5LT5uYW1lLCByYyk7Ci0JCQlnb3RvIGVycm9yX2Rpc2FibGVfbWFzdGVyOwotCQl9Ci0JfQotCi0JZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCsrOwotCXJldHVybiByYzsKLWVycm9yX2Rpc2FibGVfbWFzdGVyOgotCSh2b2lkKWRzaV9jdHJsX3NldF9jbWRfZW5naW5lX3N0YXRlKG1fY3RybC0+Y3RybCwgRFNJX0NUUkxfRU5HSU5FX09GRik7Ci1lcnJvcjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfY21kX2VuZ2luZV9kaXNhYmxlKHN0cnVjdCBkc2lfZGlzcGxheSAqZGlzcGxheSkKLXsKLQlpbnQgcmMgPSAwOwotCWludCBpOwotCXN0cnVjdCBkc2lfZGlzcGxheV9jdHJsICptX2N0cmwsICpjdHJsOwotCi0JaWYgKGRpc3BsYXktPmNtZF9lbmdpbmVfcmVmY291bnQgPT0gMCkgewotCQlwcl9lcnIoIlslc10gSW52YWxpZCByZWZjb3VudFxuIiwgZGlzcGxheS0+bmFtZSk7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCA+IDEpIHsKLQkJZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudC0tOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltX2N0cmwgPSAmZGlzcGxheS0+Y3RybFtkaXNwbGF5LT5jbWRfbWFzdGVyX2lkeF07Ci0JZm9yIChpID0gMDsgaSA8IGRpc3BsYXktPmN0cmxfY291bnQ7IGkrKykgewotCQljdHJsID0gJmRpc3BsYXktPmN0cmxbaV07Ci0JCWlmICghY3RybC0+Y3RybCB8fCAoY3RybCA9PSBtX2N0cmwpKQotCQkJY29udGludWU7Ci0KLQkJcmMgPSBkc2lfY3RybF9zZXRfY21kX2VuZ2luZV9zdGF0ZShjdHJsLT5jdHJsLAotCQkJCQkJICAgRFNJX0NUUkxfRU5HSU5FX09GRik7Ci0JCWlmIChyYykKLQkJCXByX2VycigiWyVzXSBmYWlsZWQgdG8gZW5hYmxlIGNtZCBlbmdpbmUsIHJjPSVkXG4iLAotCQkJICAgICAgIGRpc3BsYXktPm5hbWUsIHJjKTsKLQl9Ci0KLQlyYyA9IGRzaV9jdHJsX3NldF9jbWRfZW5naW5lX3N0YXRlKG1fY3RybC0+Y3RybCwgRFNJX0NUUkxfRU5HSU5FX09GRik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiWyVzXSBmYWlsZWQgdG8gZW5hYmxlIGNtZCBlbmdpbmUsIHJjPSVkXG4iLAotCQkgICAgICAgZGlzcGxheS0+bmFtZSwgcmMpOwotCQlnb3RvIGVycm9yOwotCX0KLQotZXJyb3I6Ci0JZGlzcGxheS0+Y21kX2VuZ2luZV9yZWZjb3VudCA9IDA7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGRzaV9kaXNwbGF5X2N0cmxfaG9zdF9lbmFibGUoc3RydWN0IGRzaV9kaXNwbGF5ICpkaXNwbGF5KQogewogCWludCByYyA9IDA7CkBAIC0xNjkwLDcgKzE5MDgsOSBAQAogcHV0X2lvdmE6CiAJbXNtX2dlbV9wdXRfaW92YShkaXNwbGF5LT50eF9jbWRfYnVmLCBhc3BhY2UpOwogZnJlZV9nZW06CisJbXV0ZXhfbG9jaygmZGlzcGxheS0+ZHJtX2Rldi0+c3RydWN0X211dGV4KTsKIAltc21fZ2VtX2ZyZWVfb2JqZWN0KGRpc3BsYXktPnR4X2NtZF9idWYpOworCW11dGV4X3VubG9jaygmZGlzcGxheS0+ZHJtX2Rldi0+c3RydWN0X211dGV4KTsKIGVycm9yOgogCXJldHVybiByYzsKIH0KQEAgLTI1MzMsNyArMjc1Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZHNpX2Rpc3BsYXlfZGZwc19jYWxjX2Zyb250X3BvcmNoKAotCQl1NjQgY2xrX2h6LAorCQl1MzIgb2xkX2ZwcywKIAkJdTMyIG5ld19mcHMsCiAJCXUzMiBhX3RvdGFsLAogCQl1MzIgYl90b3RhbCwKQEAgLTI1NDEsNiArMjc2MSw3IEBACiAJCXUzMiAqYl9mcF9vdXQpCiB7CiAJczMyIGJfZnBfbmV3OworCWludCBhZGRfcG9yY2hlcywgZGlmZjsKIAogCWlmICghYl9mcF9vdXQpIHsKIAkJcHJfZXJyKCJJbnZhbGlkIHBhcmFtcyIpOwpAQCAtMjU1MiwxNSArMjc3MywyMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKioKKwkvKgogCSAqIEtlZXAgY2xvY2ssIG90aGVyIHBvcmNoZXMgY29uc3RhbnQsIHVzZSBuZXcgZnBzLCBjYWxjIGZyb250IHBvcmNoCi0JICogY2xrID0gKGhvciAqIHZlciAqIGZwcykKLQkgKiBoZnJvbnQgPSBjbGsgLyAodnRvdGFsICogZnBzKSkgLSBoYWN0aXZlIC0gaGJhY2sgLSBoc3luYworCSAqIG5ld192dG90YWwgPSBvbGRfdnRvdGFsICogKG9sZF9mcHMgLyBuZXdfZnBzICkKKwkgKiBuZXdfdmZwIC0gb2xkX3ZmcCA9IG5ld192dG90YWwgLSBvbGRfdnRvdGFsCisJICogbmV3X3ZmcCA9IG9sZF92ZnAgKyBvbGRfdnRvdGFsICogKChvbGRfZnBzIC0gbmV3X2ZwcykvIG5ld19mcHMpCiAJICovCi0JYl9mcF9uZXcgPSAoY2xrX2h6IC8gKGFfdG90YWwgKiBuZXdfZnBzKSkgLSAoYl90b3RhbCAtIGJfZnApOworCWRpZmYgPSBhYnMob2xkX2ZwcyAtIG5ld19mcHMpOworCWFkZF9wb3JjaGVzID0gbXVsdF9mcmFjKGJfdG90YWwsIGRpZmYsIG5ld19mcHMpOwogCi0JcHJfZGVidWcoImNsayAlbGx1IGZwcyAldSBhICV1IGIgJXUgYl9mcCAldSBuZXdfZnAgJWRcbiIsCi0JCQljbGtfaHosIG5ld19mcHMsIGFfdG90YWwsIGJfdG90YWwsIGJfZnAsIGJfZnBfbmV3KTsKKwlpZiAob2xkX2ZwcyA+IG5ld19mcHMpCisJCWJfZnBfbmV3ID0gYl9mcCArIGFkZF9wb3JjaGVzOworCWVsc2UKKwkJYl9mcF9uZXcgPSBiX2ZwIC0gYWRkX3BvcmNoZXM7CisKKwlwcl9kZWJ1ZygiZnBzICV1IGEgJXUgYiAldSBiX2ZwICV1IG5ld19mcCAlZFxuIiwKKwkJCW5ld19mcHMsIGFfdG90YWwsIGJfdG90YWwsIGJfZnAsIGJfZnBfbmV3KTsKIAogCWlmIChiX2ZwX25ldyA8IDApIHsKIAkJcHJfZXJyKCJJbnZhbGlkIG5ld19oZnAgY2FsY2x1YXRlZCVkXG4iLCBiX2ZwX25ldyk7CkBAIC0yNTc2LDE0ICsyODA0LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZHNpX2Rpc3BsYXlfZ2V0X2RmcHNfdGltaW5nKCkgLSBHZXQgdGhlIG5ldyBkZnBzIHZhbHVlcy4KKyAqIEBkaXNwbGF5OiAgICAgICAgIERTSSBkaXNwbGF5IGhhbmRsZS4KKyAqIEBhZGpfbW9kZTogICAgICAgIE1vZGUgdmFsdWUgc3RydWN0dXJlIHRvIGJlIGNoYW5nZWQuCisgKiAgICAgICAgICAgICAgICAgICBJdCBjb250YWlucyBvbGQgdGltaW5nIHZhbHVlcyBhbmQgbGF0ZXN0IGZwcyB2YWx1ZS4KKyAqICAgICAgICAgICAgICAgICAgIE5ldyB0aW1pbmcgdmFsdWVzIGFyZSB1cGRhdGVkIGJhc2VkIG9uIG5ldyBmcHMuCisgKiBAY3Vycl9yZWZyZXNoX3JhdGU6ICBDdXJyZW50IGZwcyByYXRlLgorICogICAgICAgICAgICAgICAgICAgICAgSWYgemVybyAsIGN1cnJlbnQgZnBzIHJhdGUgaXMgdGFrZW4gZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgZGlzcGxheS0+cGFuZWwtPmN1cl9tb2RlLgorICogUmV0dXJuOiBlcnJvciBjb2RlLgorICovCiBzdGF0aWMgaW50IGRzaV9kaXNwbGF5X2dldF9kZnBzX3RpbWluZyhzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXksCi0JCQkJICAgICAgIHN0cnVjdCBkc2lfZGlzcGxheV9tb2RlICphZGpfbW9kZSkKKwkJCXN0cnVjdCBkc2lfZGlzcGxheV9tb2RlICphZGpfbW9kZSwKKwkJCQl1MzIgY3Vycl9yZWZyZXNoX3JhdGUpCiB7CiAJc3RydWN0IGRzaV9kZnBzX2NhcGFiaWxpdGllcyBkZnBzX2NhcHM7CiAJc3RydWN0IGRzaV9kaXNwbGF5X21vZGUgcGVyX2N0cmxfbW9kZTsKIAlzdHJ1Y3QgZHNpX21vZGVfaW5mbyAqdGltaW5nOwogCXN0cnVjdCBkc2lfY3RybCAqbV9jdHJsOwotCXU2NCBjbGtfaHo7CiAKIAlpbnQgcmMgPSAwOwogCkBAIC0yNjAyLDIwICsyODQxLDI3IEBACiAJcGVyX2N0cmxfbW9kZSA9ICphZGpfbW9kZTsKIAlhZGp1c3RfdGltaW5nX2J5X2N0cmxfY291bnQoZGlzcGxheSwgJnBlcl9jdHJsX21vZGUpOwogCi0JaWYgKCFkc2lfZGlzcGxheV9pc19zZWFtbGVzc19kZnBzX3Bvc3NpYmxlKGRpc3BsYXksCi0JCQkmcGVyX2N0cmxfbW9kZSwgZGZwc19jYXBzLnR5cGUpKSB7Ci0JCXByX2Vycigic2VhbWxlc3MgZHluYW1pYyBmcHMgbm90IHN1cHBvcnRlZCBmb3IgbW9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCWlmICghY3Vycl9yZWZyZXNoX3JhdGUpIHsKKwkJaWYgKCFkc2lfZGlzcGxheV9pc19zZWFtbGVzc19kZnBzX3Bvc3NpYmxlKGRpc3BsYXksCisJCQkJJnBlcl9jdHJsX21vZGUsIGRmcHNfY2Fwcy50eXBlKSkgeworCQkJcHJfZXJyKCJzZWFtbGVzcyBkeW5hbWljIGZwcyBub3Qgc3VwcG9ydGVkIGZvciBtb2RlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChkaXNwbGF5LT5wYW5lbC0+Y3VyX21vZGUpIHsKKwkJCWN1cnJfcmVmcmVzaF9yYXRlID0KKwkJCQlkaXNwbGF5LT5wYW5lbC0+Y3VyX21vZGUtPnRpbWluZy5yZWZyZXNoX3JhdGU7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoImN1cl9tb2RlIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KLQogCS8qIFRPRE86IFJlbW92ZSB0aGlzIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhlIGRzaV9jdHJsICovCi0JY2xrX2h6ID0gbV9jdHJsLT5jbGtfZnJlcS5waXhfY2xrX3JhdGU7CiAJdGltaW5nID0gJnBlcl9jdHJsX21vZGUudGltaW5nOwogCiAJc3dpdGNoIChkZnBzX2NhcHMudHlwZSkgewogCWNhc2UgRFNJX0RGUFNfSU1NRURJQVRFX1ZGUDoKIAkJcmMgPSBkc2lfZGlzcGxheV9kZnBzX2NhbGNfZnJvbnRfcG9yY2goCi0JCQkJY2xrX2h6LAorCQkJCWN1cnJfcmVmcmVzaF9yYXRlLAogCQkJCXRpbWluZy0+cmVmcmVzaF9yYXRlLAogCQkJCURTSV9IX1RPVEFMKHRpbWluZyksCiAJCQkJRFNJX1ZfVE9UQUwodGltaW5nKSwKQEAgLTI2MjUsNyArMjg3MSw3IEBACiAKIAljYXNlIERTSV9ERlBTX0lNTUVESUFURV9IRlA6CiAJCXJjID0gZHNpX2Rpc3BsYXlfZGZwc19jYWxjX2Zyb250X3BvcmNoKAotCQkJCWNsa19oeiwKKwkJCQljdXJyX3JlZnJlc2hfcmF0ZSwKIAkJCQl0aW1pbmctPnJlZnJlc2hfcmF0ZSwKIAkJCQlEU0lfVl9UT1RBTCh0aW1pbmcpLAogCQkJCURTSV9IX1RPVEFMKHRpbWluZyksCkBAIC0yNjU0LDcgKzI5MDAsNyBAQAogCX0KIAogCS8qIEN1cnJlbnRseSB0aGUgb25seSBzZWFtbGVzcyB0cmFuc2l0aW9uIGlzIGR5bmFtaWMgZnBzICovCi0JcmMgPSBkc2lfZGlzcGxheV9nZXRfZGZwc190aW1pbmcoZGlzcGxheSwgYWRqX21vZGUpOworCXJjID0gZHNpX2Rpc3BsYXlfZ2V0X2RmcHNfdGltaW5nKGRpc3BsYXksIGFkal9tb2RlLCAwKTsKIAlpZiAocmMpIHsKIAkJcHJfZGVidWcoIkR5bmFtaWMgRlBTIG5vdCBzdXBwb3J0ZWQgZm9yIHNlYW1sZXNzXG4iKTsKIAl9IGVsc2UgewpAQCAtMjY5NCw3ICsyOTQwLDggQEAKIAltZW1jcHkoJmRpc3BsYXktPmNvbmZpZy5sYW5lX21hcCwgJmRpc3BsYXktPmxhbmVfbWFwLAogCSAgICAgICBzaXplb2YoZGlzcGxheS0+bGFuZV9tYXApKTsKIAotCWlmIChtb2RlLT5kc2lfbW9kZV9mbGFncyAmIERTSV9NT0RFX0ZMQUdfREZQUykgeworCWlmIChtb2RlLT5kc2lfbW9kZV9mbGFncyAmCisJCQkoRFNJX01PREVfRkxBR19ERlBTIHwgRFNJX01PREVfRkxBR19WUlIpKSB7CiAJCXJjID0gZHNpX2Rpc3BsYXlfZGZwc191cGRhdGUoZGlzcGxheSwgbW9kZSk7CiAJCWlmIChyYykgewogCQkJcHJfZXJyKCJbJXNdRFNJIGRmcHMgdXBkYXRlIGZhaWxlZCwgcmM9JWRcbiIsCkBAIC0zMzY2LDYgKzM2MTMsOSBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAoZGlzcGxheS0+cGFuZWwtPmVzZF9jb25maWcuZXNkX2VuYWJsZWQpCisJCWluZm8tPmNhcGFiaWxpdGllcyB8PSBNU01fRElTUExBWV9FU0RfRU5BQkxFRDsKKwogCW1lbWNweSgmaW5mby0+cm9pX2NhcHMsICZkaXNwbGF5LT5wYW5lbC0+cm9pX2NhcHMsCiAJCQlzaXplb2YoaW5mby0+cm9pX2NhcHMpKTsKIApAQCAtMzQ3Miw2ICszNzIyLDcgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RmcHNfcmF0ZXM7IGkrKykgewogCQkJc3RydWN0IGRzaV9kaXNwbGF5X21vZGUgKnN1Yl9tb2RlID0gJm1vZGVzW2FycmF5X2lkeF07CisJCQl1MzIgY3Vycl9yZWZyZXNoX3JhdGU7CiAKIAkJCWlmICghc3ViX21vZGUpIHsKIAkJCQlwcl9lcnIoImludmFsaWQgbW9kZSBkYXRhXG4iKTsKQEAgLTM0ODEsOSArMzczMiwxNSBAQAogCQkJbWVtY3B5KHN1Yl9tb2RlLCAmcGFuZWxfbW9kZSwgc2l6ZW9mKHBhbmVsX21vZGUpKTsKIAogCQkJaWYgKGRmcHNfY2Fwcy5kZnBzX3N1cHBvcnQpIHsKKwkJCQljdXJyX3JlZnJlc2hfcmF0ZSA9CisJCQkJCXN1Yl9tb2RlLT50aW1pbmcucmVmcmVzaF9yYXRlOwogCQkJCXN1Yl9tb2RlLT50aW1pbmcucmVmcmVzaF9yYXRlID0KIAkJCQkJZGZwc19jYXBzLm1pbl9yZWZyZXNoX3JhdGUgKwogCQkJCQkoaSAlIG51bV9kZnBzX3JhdGVzKTsKKworCQkJCWRzaV9kaXNwbGF5X2dldF9kZnBzX3RpbWluZyhkaXNwbGF5LAorCQkJCQlzdWJfbW9kZSwgY3Vycl9yZWZyZXNoX3JhdGUpOworCiAJCQkJc3ViX21vZGUtPnBpeGVsX2Nsa19raHogPQogCQkJCQkoRFNJX0hfVE9UQUwoJnN1Yl9tb2RlLT50aW1pbmcpICoKIAkJCQkJRFNJX1ZfVE9UQUwoJnN1Yl9tb2RlLT50aW1pbmcpICoKQEAgLTM0OTgsNiArMzc1NSwxMDIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogZHNpX2Rpc3BsYXlfdmFsaWRhdGVfbW9kZV92cnIoKSAtIFZhbGlkYXRlIGlmIHZhcmFpYmxlIHJlZnJlc2ggY2FzZS4KKyAqIEBkaXNwbGF5OiAgICAgRFNJIGRpc3BsYXkgaGFuZGxlLgorICogQGN1cl9kc2lfbW9kZTogICBDdXJyZW50IERTSSBtb2RlLgorICogQG1vZGU6ICAgICAgICBNb2RlIHZhbHVlIHN0cnVjdHVyZSB0byBiZSB2YWxpZGF0ZWQuCisgKiAgICAgICAgICAgICAgIE1TTV9NT0RFX0ZMQUdfU0VBTUxFU1NfVlJSIGZsYWcgaXMgc2V0IGlmIHRoZXJlCisgKiAgICAgICAgICAgICAgIGlzIGNoYW5nZSBpbiBmcHMgYnV0IHZhY3RpdmUgYW5kIGhhY3RpdmUgYXJlIHNhbWUuCisgKiBSZXR1cm46IGVycm9yIGNvZGUuCisgKi8KK2ludCBkc2lfZGlzcGxheV92YWxpZGF0ZV9tb2RlX3ZycihzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXksCisJCQlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSAqY3VyX2RzaV9tb2RlLAorCQkJc3RydWN0IGRzaV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSBhZGpfbW9kZSwgY3VyX21vZGU7CisJc3RydWN0IGRzaV9kZnBzX2NhcGFiaWxpdGllcyBkZnBzX2NhcHM7CisJdTMyIGN1cnJfcmVmcmVzaF9yYXRlOworCisJaWYgKCFkaXNwbGF5IHx8ICFtb2RlKSB7CisJCXByX2VycigiSW52YWxpZCBwYXJhbXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWRpc3BsYXktPnBhbmVsIHx8ICFkaXNwbGF5LT5wYW5lbC0+Y3VyX21vZGUpIHsKKwkJcHJfZGVidWcoIkN1cnJlbnQgcGFuZWwgbW9kZSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW11dGV4X2xvY2soJmRpc3BsYXktPmRpc3BsYXlfbG9jayk7CisKKwlhZGpfbW9kZSA9ICptb2RlOworCWN1cl9tb2RlID0gKmN1cl9kc2lfbW9kZTsKKworCWlmICgoY3VyX21vZGUudGltaW5nLnJlZnJlc2hfcmF0ZSAhPSBhZGpfbW9kZS50aW1pbmcucmVmcmVzaF9yYXRlKSAmJgorCQkoY3VyX21vZGUudGltaW5nLnZfYWN0aXZlID09IGFkal9tb2RlLnRpbWluZy52X2FjdGl2ZSkgJiYKKwkJKGN1cl9tb2RlLnRpbWluZy5oX2FjdGl2ZSA9PSBhZGpfbW9kZS50aW1pbmcuaF9hY3RpdmUpKSB7CisKKwkJY3Vycl9yZWZyZXNoX3JhdGUgPSBjdXJfbW9kZS50aW1pbmcucmVmcmVzaF9yYXRlOworCQlyYyA9IGRzaV9wYW5lbF9nZXRfZGZwc19jYXBzKGRpc3BsYXktPnBhbmVsLCAmZGZwc19jYXBzKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIlslc10gZmFpbGVkIHRvIGdldCBkZnBzIGNhcHMgZnJvbSBwYW5lbFxuIiwKKwkJCQkJZGlzcGxheS0+bmFtZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJY3VyX21vZGUudGltaW5nLnJlZnJlc2hfcmF0ZSA9CisJCQlhZGpfbW9kZS50aW1pbmcucmVmcmVzaF9yYXRlOworCisJCXJjID0gZHNpX2Rpc3BsYXlfZ2V0X2RmcHNfdGltaW5nKGRpc3BsYXksCisJCQkmY3VyX21vZGUsIGN1cnJfcmVmcmVzaF9yYXRlKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIlslc10gc2VhbWxlc3MgdnJyIG5vdCBwb3NzaWJsZSByYz0lZFxuIiwKKwkJCWRpc3BsYXktPm5hbWUsIHJjKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc3dpdGNoIChkZnBzX2NhcHMudHlwZSkgeworCQkvKgorCQkgKiBJZ25vcmUgYW55IHJvdW5kIG9mZiBmYWN0b3JzIGluIHBvcmNoIGNhbGN1bGF0aW9uLgorCQkgKiBXb3JzZSBjYXNlIGlzIHNldCB0byA1LgorCQkgKi8KKwkJY2FzZSBEU0lfREZQU19JTU1FRElBVEVfVkZQOgorCQkJaWYgKGFicyhEU0lfVl9UT1RBTCgmY3VyX21vZGUudGltaW5nKSAtCisJCQkJRFNJX1ZfVE9UQUwoJmFkal9tb2RlLnRpbWluZykpID4gNSkKKwkJCQlwcl9lcnIoIk1pc21hdGNoIHZmcCBmcHM6JWQgbmV3OiVkIGdpdmVuOiVkXG4iLAorCQkJCWFkal9tb2RlLnRpbWluZy5yZWZyZXNoX3JhdGUsCisJCQkJY3VyX21vZGUudGltaW5nLnZfZnJvbnRfcG9yY2gsCisJCQkJYWRqX21vZGUudGltaW5nLnZfZnJvbnRfcG9yY2gpOworCQkJYnJlYWs7CisKKwkJY2FzZSBEU0lfREZQU19JTU1FRElBVEVfSEZQOgorCQkJaWYgKGFicyhEU0lfSF9UT1RBTCgmY3VyX21vZGUudGltaW5nKSAtCisJCQkJRFNJX0hfVE9UQUwoJmFkal9tb2RlLnRpbWluZykpID4gNSkKKwkJCQlwcl9lcnIoIk1pc21hdGNoIGhmcCBmcHM6JWQgbmV3OiVkIGdpdmVuOiVkXG4iLAorCQkJCWFkal9tb2RlLnRpbWluZy5yZWZyZXNoX3JhdGUsCisJCQkJY3VyX21vZGUudGltaW5nLmhfZnJvbnRfcG9yY2gsCisJCQkJYWRqX21vZGUudGltaW5nLmhfZnJvbnRfcG9yY2gpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByX2VycigiVW5zdXBwb3J0ZWQgREZQUyBtb2RlICVkXG4iLAorCQkJCWRmcHNfY2Fwcy50eXBlKTsKKwkJCXJjID0gLUVOT1RTVVBQOworCQl9CisKKwkJcHJfZGVidWcoIk1vZGUgc3dpdGNoIGlzIHNlYW1sZXNzIHZhcmlhYmxlIHJlZnJlc2hcbiIpOworCQltb2RlLT5kc2lfbW9kZV9mbGFncyB8PSBEU0lfTU9ERV9GTEFHX1ZSUjsKKwkJU0RFX0VWVDMyKGN1cnJfcmVmcmVzaF9yYXRlLCBhZGpfbW9kZS50aW1pbmcucmVmcmVzaF9yYXRlLAorCQkJCWN1cl9tb2RlLnRpbWluZy5oX2Zyb250X3BvcmNoLAorCQkJCWFkal9tb2RlLnRpbWluZy5oX2Zyb250X3BvcmNoKTsKKwl9CisKK2Vycm9yOgorCW11dGV4X3VubG9jaygmZGlzcGxheS0+ZGlzcGxheV9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKIGludCBkc2lfZGlzcGxheV92YWxpZGF0ZV9tb2RlKHN0cnVjdCBkc2lfZGlzcGxheSAqZGlzcGxheSwKIAkJCSAgICAgIHN0cnVjdCBkc2lfZGlzcGxheV9tb2RlICptb2RlLAogCQkJICAgICAgdTMyIGZsYWdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfZGlzcGxheS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfZGlzcGxheS5oCmluZGV4IDFjMzBiOWMuLmRhNGY1ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9kaXNwbGF5LmgKQEAgLTMyNCw2ICszMjQsMTcgQEAKIAkJCSAgICAgIHUzMiBmbGFncyk7CiAKIC8qKgorICogZHNpX2Rpc3BsYXlfdmFsaWRhdGVfbW9kZV92cnIoKSAtIHZhbGlkYXRlcyBtb2RlIGlmIHZhcmlhYmxlIHJlZnJlc2ggY2FzZQorICogQGRpc3BsYXk6ICAgICAgICAgICAgIEhhbmRsZSB0byBkaXNwbGF5LgorICogQG1vZGU6ICAgICAgICAgICAgICAgIE1vZGUgdG8gYmUgdmFsaWRhdGVkLi4KKyAqCisgKiBSZXR1cm46IDAgaWYgIGVycm9yIGNvZGUuCisgKi8KK2ludCBkc2lfZGlzcGxheV92YWxpZGF0ZV9tb2RlX3ZycihzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXksCisJCQlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSAqY3VyX2RzaV9tb2RlLAorCQkJc3RydWN0IGRzaV9kaXNwbGF5X21vZGUgKm1vZGUpOworCisvKioKICAqIGRzaV9kaXNwbGF5X3NldF9tb2RlKCkgLSBTZXQgbW9kZSBvbiB0aGUgZGlzcGxheS4KICAqIEBkaXNwbGF5OiAgICAgICAgICAgSGFuZGxlIHRvIGRpc3BsYXkuCiAgKiBAbW9kZTogICAgICAgICAgICAgIG1vZGUgdG8gYmUgc2V0LgpAQCAtNDc4LDYgKzQ4OSwxMiBAQAogaW50IGRzaV9kaXNwbGF5X3NldF9iYWNrbGlnaHQodm9pZCAqZGlzcGxheSwgdTMyIGJsX2x2bCk7CiAKIC8qKgorICogZHNpX2Rpc3BsYXlfY2hlY2tfc3RhdHVzKCkgLSBjaGVjayBpZiBwYW5lbCBpcyBkZWFkIG9yIGFsaXZlCisgKiBAZGlzcGxheTogICAgICAgICAgICBIYW5kbGUgdG8gZGlzcGxheS4KKyAqLworaW50IGRzaV9kaXNwbGF5X2NoZWNrX3N0YXR1cyh2b2lkICpkaXNwbGF5KTsKKworLyoqCiAgKiBkc2lfZGlzcGxheV9zb2Z0X3Jlc2V0KCkgLSBwZXJmb3JtIGEgc29mdCByZXNldCBvbiBEU0kgY29udHJvbGxlcgogICogQGRpc3BsYXk6ICAgICAgICAgSGFuZGxlIHRvIGRpc3BsYXkKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9kcm0uYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5jCmluZGV4IDMwZTVmMDIuLmFmNzIxZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5jCkBAIC02MSw2ICs2MSw4IEBACiAJCWRzaV9tb2RlLT5kc2lfbW9kZV9mbGFncyB8PSBEU0lfTU9ERV9GTEFHX1ZCTEFOS19QUkVfTU9ERVNFVDsKIAlpZiAobXNtX2lzX21vZGVfc2VhbWxlc3NfZG1zKGRybV9tb2RlKSkKIAkJZHNpX21vZGUtPmRzaV9tb2RlX2ZsYWdzIHw9IERTSV9NT0RFX0ZMQUdfRE1TOworCWlmIChtc21faXNfbW9kZV9zZWFtbGVzc192cnIoZHJtX21vZGUpKQorCQlkc2lfbW9kZS0+ZHNpX21vZGVfZmxhZ3MgfD0gRFNJX01PREVfRkxBR19WUlI7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRfdG9fZHJtX21vZGUoY29uc3Qgc3RydWN0IGRzaV9kaXNwbGF5X21vZGUgKmRzaV9tb2RlLApAQCAtOTYsNiArOTgsOCBAQAogCQlkcm1fbW9kZS0+cHJpdmF0ZV9mbGFncyB8PSBNU01fTU9ERV9GTEFHX1ZCTEFOS19QUkVfTU9ERVNFVDsKIAlpZiAoZHNpX21vZGUtPmRzaV9tb2RlX2ZsYWdzICYgRFNJX01PREVfRkxBR19ETVMpCiAJCWRybV9tb2RlLT5wcml2YXRlX2ZsYWdzIHw9IE1TTV9NT0RFX0ZMQUdfU0VBTUxFU1NfRE1TOworCWlmIChkc2lfbW9kZS0+ZHNpX21vZGVfZmxhZ3MgJiBEU0lfTU9ERV9GTEFHX1ZSUikKKwkJZHJtX21vZGUtPnByaXZhdGVfZmxhZ3MgfD0gTVNNX01PREVfRkxBR19TRUFNTEVTU19WUlI7CiAKIAlkcm1fbW9kZV9zZXRfbmFtZShkcm1fbW9kZSk7CiB9CkBAIC0xMzQsNyArMTM4LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChjX2JyaWRnZS0+ZHNpX21vZGUuZHNpX21vZGVfZmxhZ3MgJiBEU0lfTU9ERV9GTEFHX1NFQU1MRVNTKSB7CisJaWYgKGNfYnJpZGdlLT5kc2lfbW9kZS5kc2lfbW9kZV9mbGFncyAmCisJCShEU0lfTU9ERV9GTEFHX1NFQU1MRVNTIHwgRFNJX01PREVfRkxBR19WUlIpKSB7CiAJCXByX2RlYnVnKCJbJWRdIHNlYW1sZXNzIHByZS1lbmFibGVcbiIsIGNfYnJpZGdlLT5pZCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNjksNyArMTc0LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChjX2JyaWRnZS0+ZHNpX21vZGUuZHNpX21vZGVfZmxhZ3MgJiBEU0lfTU9ERV9GTEFHX1NFQU1MRVNTKSB7CisJaWYgKGNfYnJpZGdlLT5kc2lfbW9kZS5kc2lfbW9kZV9mbGFncyAmCisJCQkoRFNJX01PREVfRkxBR19TRUFNTEVTUyB8IERTSV9NT0RFX0ZMQUdfVlJSKSkgewogCQlwcl9kZWJ1ZygiWyVkXSBzZWFtbGVzcyBlbmFibGVcbiIsIGNfYnJpZGdlLT5pZCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNDksNyArMjU1LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBkc2lfYnJpZGdlICpjX2JyaWRnZSA9IHRvX2RzaV9icmlkZ2UoYnJpZGdlKTsKLQlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSBkc2lfbW9kZTsKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSBkc2lfbW9kZSwgY3VyX2RzaV9tb2RlOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIGN1cl9tb2RlOwogCiAJaWYgKCFicmlkZ2UgfHwgIW1vZGUgfHwgIWFkanVzdGVkX21vZGUpIHsKQEAgLTI2Nyw5ICsyNzMsMjAgQEAKIAl9CiAKIAlpZiAoYnJpZGdlLT5lbmNvZGVyICYmIGJyaWRnZS0+ZW5jb2Rlci0+Y3J0YykgeworCisJCWNvbnZlcnRfdG9fZHNpX21vZGUoJmJyaWRnZS0+ZW5jb2Rlci0+Y3J0Yy0+bW9kZSwKKwkJCQkJCQkmY3VyX2RzaV9tb2RlKTsKKwkJcmMgPSBkc2lfZGlzcGxheV92YWxpZGF0ZV9tb2RlX3ZycihjX2JyaWRnZS0+ZGlzcGxheSwKKwkJCQkJJmN1cl9kc2lfbW9kZSwgJmRzaV9tb2RlKTsKKwkJaWYgKHJjKQorCQkJcHJfZGVidWcoIlslc10gdnJyIG1vZGUgbWlzbWF0Y2ggZmFpbHVyZSByYz0lZFxuIiwKKwkJCQljX2JyaWRnZS0+ZGlzcGxheS0+bmFtZSwgcmMpOworCiAJCWN1cl9tb2RlID0gYnJpZGdlLT5lbmNvZGVyLT5jcnRjLT5tb2RlOwogCi0JCWlmICghZHJtX21vZGVfZXF1YWwoJmN1cl9tb2RlLCBhZGp1c3RlZF9tb2RlKSkKKwkJaWYgKCFkcm1fbW9kZV9lcXVhbCgmY3VyX21vZGUsIGFkanVzdGVkX21vZGUpICYmCisJCQkoIShkc2lfbW9kZS5kc2lfbW9kZV9mbGFncyAmCisJCQkJRFNJX01PREVfRkxBR19WUlIpKSkKIAkJCWRzaV9tb2RlLmRzaV9tb2RlX2ZsYWdzIHw9IERTSV9NT0RFX0ZMQUdfRE1TOwogCX0KIApAQCAtMzgzLDYgKzQwMCwxMyBAQAogCXNkZV9rbXNfaW5mb19hZGRfa2V5c3RyKGluZm8sICJkZnBzIHN1cHBvcnQiLAogCQkJcGFuZWwtPmRmcHNfY2Fwcy5kZnBzX3N1cHBvcnQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKIAorCWlmIChwYW5lbC0+ZGZwc19jYXBzLmRmcHNfc3VwcG9ydCkgeworCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWluX2ZwcyIsCisJCQlwYW5lbC0+ZGZwc19jYXBzLm1pbl9yZWZyZXNoX3JhdGUpOworCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWF4X2ZwcyIsCisJCQlwYW5lbC0+ZGZwc19jYXBzLm1heF9yZWZyZXNoX3JhdGUpOworCX0KKwogCXN3aXRjaCAocGFuZWwtPnBoeV9wcm9wcy5yb3RhdGlvbikgewogCWNhc2UgRFNJX1BBTkVMX1JPVEFURV9OT05FOgogCQlzZGVfa21zX2luZm9fYWRkX2tleXN0cihpbmZvLCAicGFuZWwgb3JpZW50YXRpb24iLCAibm9uZSIpOwpAQCAtNTk4LDYgKzYyMiw1MiBAQAogCWRzaV9kaXNwbGF5X2VuYWJsZV9ldmVudChkaXNwbGF5LCBldmVudF9pZHgsICZldmVudF9pbmZvLCBlbmFibGUpOwogfQogCitpbnQgZHNpX2Nvbm5fcG9zdF9raWNrb2ZmKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOworCXN0cnVjdCBkc2lfYnJpZGdlICpjX2JyaWRnZTsKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXlfbW9kZSBhZGpfbW9kZTsKKwlzdHJ1Y3QgZHNpX2Rpc3BsYXkgKmRpc3BsYXk7CisJc3RydWN0IGRzaV9kaXNwbGF5X2N0cmwgKm1fY3RybCwgKmN0cmw7CisJaW50IGksIHJjID0gMDsKKworCWlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3ItPnN0YXRlLT5iZXN0X2VuY29kZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJZW5jb2RlciA9IGNvbm5lY3Rvci0+c3RhdGUtPmJlc3RfZW5jb2RlcjsKKwljX2JyaWRnZSA9IHRvX2RzaV9icmlkZ2UoZW5jb2Rlci0+YnJpZGdlKTsKKwlhZGpfbW9kZSA9IGNfYnJpZGdlLT5kc2lfbW9kZTsKKwlkaXNwbGF5ID0gY19icmlkZ2UtPmRpc3BsYXk7CisKKwlpZiAoYWRqX21vZGUuZHNpX21vZGVfZmxhZ3MgJiBEU0lfTU9ERV9GTEFHX1ZSUikgeworCQltX2N0cmwgPSAmZGlzcGxheS0+Y3RybFtkaXNwbGF5LT5jbGtfbWFzdGVyX2lkeF07CisJCXJjID0gZHNpX2N0cmxfdGltaW5nX2RiX3VwZGF0ZShtX2N0cmwtPmN0cmwsIGZhbHNlKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIlslc10gZmFpbGVkIHRvIGRmcHMgdXBkYXRlICByYz0lZFxuIiwKKwkJCQlkaXNwbGF5LT5uYW1lLCByYyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgcmVzdCBvZiB0aGUgY29udHJvbGxlcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRpc3BsYXktPmN0cmxfY291bnQ7IGkrKykgeworCQkJY3RybCA9ICZkaXNwbGF5LT5jdHJsW2ldOworCQkJaWYgKCFjdHJsLT5jdHJsIHx8IChjdHJsID09IG1fY3RybCkpCisJCQkJY29udGludWU7CisKKwkJCXJjID0gZHNpX2N0cmxfdGltaW5nX2RiX3VwZGF0ZShjdHJsLT5jdHJsLCBmYWxzZSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcl9lcnIoIlslc10gZmFpbGVkIHRvIGRmcHMgdXBkYXRlIHJjPSVkXG4iLAorCQkJCQlkaXNwbGF5LT5uYW1lLCAgcmMpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJY19icmlkZ2UtPmRzaV9tb2RlLmRzaV9tb2RlX2ZsYWdzICY9IH5EU0lfTU9ERV9GTEFHX1ZSUjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGRzaV9icmlkZ2UgKmRzaV9kcm1fYnJpZGdlX2luaXQoc3RydWN0IGRzaV9kaXNwbGF5ICpkaXNwbGF5LAogCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9kcm0uaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5oCmluZGV4IDc5M2Y4ZjEuLjk3MDBlNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX2RybS5oCkBAIC0xMTksNCArMTE5LDExIEBACiAJCXZvaWQgKmRpc3BsYXksCiAJCXN0cnVjdCBtc21fZGlzcGxheV9raWNrb2ZmX3BhcmFtcyAqcGFyYW1zKTsKIAorLyoqCisgKiBkc2lfZGlzcGxheV9wb3N0X2tpY2tvZmYgLSBwcm9ncmFtIHBvc3Qga2lja29mZi10aW1lIGZlYXR1cmVzCisgKiBAY29ubmVjdG9yOiBQb2ludGVyIHRvIGRybSBjb25uZWN0b3Igc3RydWN0dXJlCisgKiBSZXR1cm5zOiBaZXJvIG9uIHN1Y2Nlc3MKKyAqLworaW50IGRzaV9jb25uX3Bvc3Rfa2lja29mZihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKwogI2VuZGlmIC8qIF9EU0lfRFJNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9wYW5lbC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfcGFuZWwuYwppbmRleCAzYThkZjk5Li42NzE4MTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9wYW5lbC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX3BhbmVsLmMKQEAgLTE2NTAsNiArMTY1MCw5IEBACiAKIAlwYW5lbC0+dGVfdXNpbmdfd2F0Y2hkb2dfdGltZXIgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wob2Zfbm9kZSwKIAkJCQkJInFjb20sbWRzcy1kc2ktdGUtdXNpbmctd2QiKTsKKworCXBhbmVsLT5zeW5jX2Jyb2FkY2FzdF9lbiA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChvZl9ub2RlLAorCQkJInFjb20sY21kLXN5bmMtd2FpdC1icm9hZGNhc3QiKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQzOCw2ICsyNDQxLDIxNiBAQAogCXJldHVybiAwOwogfTsKIAorLyoKKyAqIFRoZSBsZW5ndGggb2YgYWxsIHRoZSB2YWxpZCB2YWx1ZXMgdG8gYmUgY2hlY2tlZCBzaG91bGQgbm90IGJlIGdyZWF0ZXIKKyAqIHRoYW4gdGhlIGxlbmd0aCBvZiByZXR1cm5lZCBkYXRhIGZyb20gcmVhZCBjb21tYW5kLgorICovCitzdGF0aWMgYm9vbAorZHNpX3BhbmVsX3BhcnNlX2VzZF9jaGVja192YWxpZF9wYXJhbXMoc3RydWN0IGRzaV9wYW5lbCAqcGFuZWwsIHUzMiBjb3VudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZHJtX3BhbmVsX2VzZF9jb25maWcgKmNvbmZpZyA9ICZwYW5lbC0+ZXNkX2NvbmZpZzsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCWlmIChjb25maWctPnN0YXR1c192YWxpZF9wYXJhbXNbaV0gPgorCQkJCWNvbmZpZy0+c3RhdHVzX2NtZHNfcmxlbltpXSkgeworCQkJcHJfZGVidWcoImlnbm9yZSB2YWxpZCBwYXJhbXNcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGRzaV9wYW5lbF9wYXJzZV9lc2Rfc3RhdHVzX2xlbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCWNoYXIgKnByb3Bfa2V5LCB1MzIgKip0YXJnZXQsIHUzMiBjbWRfY250KQoreworCWludCB0bXA7CisKKwlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3Bfa2V5LCAmdG1wKSkKKwkJcmV0dXJuIGZhbHNlOworCisJdG1wIC89IHNpemVvZih1MzIpOworCWlmICh0bXAgIT0gY21kX2NudCkgeworCQlwcl9lcnIoInJlcXVlc3QgcHJvcGVydHkoJWQpIGRvIG5vdCBtYXRjaCBjbWQgY291bnQoJWQpXG4iLAorCQkJCXRtcCwgY21kX2NudCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkqdGFyZ2V0ID0ga2NhbGxvYyh0bXAsIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoKnRhcmdldCkpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgcHJvcGVydHlcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCBwcm9wX2tleSwgKnRhcmdldCwgdG1wKSkgeworCQlwcl9lcnIoImNhbm5vdCBnZXQgdmFsdWVzIGZyb20gZHRzXG4iKTsKKwkJa2ZyZWUoKnRhcmdldCk7CisJCSp0YXJnZXQgPSBOVUxMOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9wYW5lbF9lc2RfY29uZmlnX2RlaW5pdChzdHJ1Y3QgZHJtX3BhbmVsX2VzZF9jb25maWcgKmVzZF9jb25maWcpCit7CisJa2ZyZWUoZXNkX2NvbmZpZy0+c3RhdHVzX2J1Zik7CisJa2ZyZWUoZXNkX2NvbmZpZy0+cmV0dXJuX2J1Zik7CisJa2ZyZWUoZXNkX2NvbmZpZy0+c3RhdHVzX3ZhbHVlKTsKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfdmFsaWRfcGFyYW1zKTsKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfY21kc19ybGVuKTsKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfY21kLmNtZHMpOworfQorCitzdGF0aWMgaW50IGRzaV9wYW5lbF9wYXJzZV9lc2RfY29uZmlnKHN0cnVjdCBkc2lfcGFuZWwgKnBhbmVsLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKQoreworCWludCByYyA9IDA7CisJdTMyIHRtcDsKKwl1MzIgaSwgc3RhdHVzX2xlbiwgKmxlbnA7CisJc3RydWN0IHByb3BlcnR5ICpkYXRhOworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlzdHJ1Y3QgZHJtX3BhbmVsX2VzZF9jb25maWcgKmVzZF9jb25maWc7CisKKwllc2RfY29uZmlnID0gJnBhbmVsLT5lc2RfY29uZmlnOworCWVzZF9jb25maWctPmVzZF9lbmFibGVkID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG9mX25vZGUsCisJCSJxY29tLGVzZC1jaGVjay1lbmFibGVkIik7CisKKwlpZiAoIWVzZF9jb25maWctPmVzZF9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcob2Zfbm9kZSwKKwkJCSJxY29tLG1kc3MtZHNpLXBhbmVsLXN0YXR1cy1jaGVjay1tb2RlIiwgJnN0cmluZyk7CisJaWYgKCFyYykgeworCQlpZiAoIXN0cmNtcChzdHJpbmcsICJidGFfY2hlY2siKSkgeworCQkJZXNkX2NvbmZpZy0+c3RhdHVzX21vZGUgPSBFU0RfTU9ERV9TV19CVEE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChzdHJpbmcsICJyZWdfcmVhZCIpKSB7CisJCQllc2RfY29uZmlnLT5zdGF0dXNfbW9kZSA9IEVTRF9NT0RFX1JFR19SRUFEOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyaW5nLCAidGVfc2lnbmFsX2NoZWNrIikpIHsKKwkJCWlmIChwYW5lbC0+cGFuZWxfbW9kZSA9PSBEU0lfT1BfQ01EX01PREUpIHsKKwkJCQllc2RfY29uZmlnLT5zdGF0dXNfbW9kZSA9IEVTRF9NT0RFX1BBTkVMX1RFOworCQkJfSBlbHNlIHsKKwkJCQlwcl9lcnIoIlRFLUVTRCBub3QgdmFsaWQgZm9yIHZpZGVvIG1vZGVcbiIpOworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJfZXJyKCJObyB2YWxpZCBwYW5lbC1zdGF0dXMtY2hlY2stbW9kZSBzdHJpbmdcbiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0gZWxzZSB7CisJCXByX2RlYnVnKCJzdGF0dXMgY2hlY2sgbWV0aG9kIG5vdCBkZWZpbmVkIVxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKGVzZF9jb25maWctPnN0YXR1c19tb2RlID09IEVTRF9NT0RFX1NXX0JUQSkgfHwKKwkJKGVzZF9jb25maWctPnN0YXR1c19tb2RlID09IEVTRF9NT0RFX1BBTkVMX1RFKSkKKwkJcmV0dXJuIDA7CisKKwlkc2lfcGFuZWxfcGFyc2VfY21kX3NldHNfc3ViKCZlc2RfY29uZmlnLT5zdGF0dXNfY21kLAorCQkJCURTSV9DTURfU0VUX1BBTkVMX1NUQVRVUywgb2Zfbm9kZSk7CisJaWYgKCFlc2RfY29uZmlnLT5zdGF0dXNfY21kLmNvdW50KSB7CisJCXByX2VycigicGFuZWwgc3RhdHVzIGNvbW1hbmQgcGFyc2luZyBmYWlsZWRcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKCFkc2lfcGFuZWxfcGFyc2VfZXNkX3N0YXR1c19sZW4ob2Zfbm9kZSwKKwkJInFjb20sbWRzcy1kc2ktcGFuZWwtc3RhdHVzLXJlYWQtbGVuZ3RoIiwKKwkJCSZwYW5lbC0+ZXNkX2NvbmZpZy5zdGF0dXNfY21kc19ybGVuLAorCQkJCWVzZF9jb25maWctPnN0YXR1c19jbWQuY291bnQpKSB7CisJCXByX2VycigiSW52YWxpZCBzdGF0dXMgcmVhZCBsZW5ndGhcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IxOworCX0KKworCWlmIChkc2lfcGFuZWxfcGFyc2VfZXNkX3N0YXR1c19sZW4ob2Zfbm9kZSwKKwkJInFjb20sbWRzcy1kc2ktcGFuZWwtc3RhdHVzLXZhbGlkLXBhcmFtcyIsCisJCQkmcGFuZWwtPmVzZF9jb25maWcuc3RhdHVzX3ZhbGlkX3BhcmFtcywKKwkJCQllc2RfY29uZmlnLT5zdGF0dXNfY21kLmNvdW50KSkgeworCQlpZiAoIWRzaV9wYW5lbF9wYXJzZV9lc2RfY2hlY2tfdmFsaWRfcGFyYW1zKHBhbmVsLAorCQkJCQllc2RfY29uZmlnLT5zdGF0dXNfY21kLmNvdW50KSkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjI7CisJCX0KKwl9CisKKwlzdGF0dXNfbGVuID0gMDsKKwlsZW5wID0gZXNkX2NvbmZpZy0+c3RhdHVzX3ZhbGlkX3BhcmFtcyA/OiBlc2RfY29uZmlnLT5zdGF0dXNfY21kc19ybGVuOworCWZvciAoaSA9IDA7IGkgPCBlc2RfY29uZmlnLT5zdGF0dXNfY21kLmNvdW50OyArK2kpCisJCXN0YXR1c19sZW4gKz0gbGVucFtpXTsKKworCWlmICghc3RhdHVzX2xlbikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IyOworCX0KKworCS8qCisJICogU29tZSBwYW5lbCBtYXkgbmVlZCBtdWx0aXBsZSByZWFkIGNvbW1hbmRzIHRvIHByb3Blcmx5CisJICogY2hlY2sgcGFuZWwgc3RhdHVzLiBEbyBhIHNhbml0eSBjaGVjayBmb3IgcHJvcGVyIHN0YXR1cworCSAqIHZhbHVlIHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWUgcmVhZCBieSBkc2kKKwkgKiBjb250cm9sbGVyIGR1cmluZyBFU0QgY2hlY2suIEFsc28gY2hlY2sgaWYgbXVsdGlwbGUgcmVhZAorCSAqIGNvbW1hbmRzIGFyZSB0aGVyZSB0aGVuLCB0aGVyZSBzaG91bGQgYmUgY29ycmVzcG9uZGluZworCSAqIHN0YXR1cyBjaGVjayB2YWx1ZXMgZm9yIGVhY2ggcmVhZCBjb21tYW5kLgorCSAqLworCWRhdGEgPSBvZl9maW5kX3Byb3BlcnR5KG9mX25vZGUsCisJCQkicWNvbSxtZHNzLWRzaS1wYW5lbC1zdGF0dXMtdmFsdWUiLCAmdG1wKTsKKwl0bXAgLz0gc2l6ZW9mKHUzMik7CisJaWYgKCFJU19FUlJfT1JfTlVMTChkYXRhKSAmJiB0bXAgIT0gMCAmJiAodG1wICUgc3RhdHVzX2xlbikgPT0gMCkgeworCQllc2RfY29uZmlnLT5ncm91cHMgPSB0bXAgLyBzdGF0dXNfbGVuOworCX0gZWxzZSB7CisJCXByX2VycigiZXJyb3IgcGFyc2UgcGFuZWwtc3RhdHVzLXZhbHVlXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwllc2RfY29uZmlnLT5zdGF0dXNfdmFsdWUgPQorCQlremFsbG9jKHNpemVvZih1MzIpICogc3RhdHVzX2xlbiAqIGVzZF9jb25maWctPmdyb3VwcywKKwkJCUdGUF9LRVJORUwpOworCWlmICghZXNkX2NvbmZpZy0+c3RhdHVzX3ZhbHVlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjI7CisJfQorCisJZXNkX2NvbmZpZy0+cmV0dXJuX2J1ZiA9IGtjYWxsb2Moc3RhdHVzX2xlbiAqIGVzZF9jb25maWctPmdyb3VwcywKKwkJCXNpemVvZih1bnNpZ25lZCBjaGFyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlc2RfY29uZmlnLT5yZXR1cm5fYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjM7CisJfQorCisJZXNkX2NvbmZpZy0+c3RhdHVzX2J1ZiA9IGt6YWxsb2MoU1pfNEssIEdGUF9LRVJORUwpOworCWlmICghZXNkX2NvbmZpZy0+c3RhdHVzX2J1ZikKKwkJZ290byBlcnJvcjQ7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG9mX25vZGUsCisJCSJxY29tLG1kc3MtZHNpLXBhbmVsLXN0YXR1cy12YWx1ZSIsCisJCWVzZF9jb25maWctPnN0YXR1c192YWx1ZSwgZXNkX2NvbmZpZy0+Z3JvdXBzICogc3RhdHVzX2xlbik7CisJaWYgKHJjKSB7CisJCXByX2RlYnVnKCJlcnJvciByZWFkaW5nIHBhbmVsIHN0YXR1cyB2YWx1ZXNcbiIpOworCQltZW1zZXQoZXNkX2NvbmZpZy0+c3RhdHVzX3ZhbHVlLCAwLAorCQkJCWVzZF9jb25maWctPmdyb3VwcyAqIHN0YXR1c19sZW4pOworCX0KKworCXJldHVybiAwOworCitlcnJvcjQ6CisJa2ZyZWUoZXNkX2NvbmZpZy0+cmV0dXJuX2J1Zik7CitlcnJvcjM6CisJa2ZyZWUoZXNkX2NvbmZpZy0+c3RhdHVzX3ZhbHVlKTsKK2Vycm9yMjoKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfdmFsaWRfcGFyYW1zKTsKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfY21kc19ybGVuKTsKK2Vycm9yMToKKwlrZnJlZShlc2RfY29uZmlnLT5zdGF0dXNfY21kLmNtZHMpOworZXJyb3I6CisJcGFuZWwtPmVzZF9jb25maWcuZXNkX2VuYWJsZWQgPSBmYWxzZTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0cnVjdCBkc2lfcGFuZWwgKmRzaV9wYW5lbF9nZXQoc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKIAkJCQlpbnQgdG9wb2xvZ3lfb3ZlcnJpZGUpCkBAIC0yNTExLDYgKzI3MjQsMjIgQEAKIAlpZiAocmMpCiAJCXByX2RlYnVnKCJmYWlsZWQgdG8gZ2V0IGRtcyBpbmZvLCByYz0lZFxuIiwgcmMpOwogCisJcmMgPSBkc2lfcGFuZWxfcGFyc2VfZXNkX2NvbmZpZyhwYW5lbCwgb2Zfbm9kZSk7CisJaWYgKHJjKSB7CisJCXByX2RlYnVnKCJmYWlsZWQgdG8gcGFyc2UgZXNkIGNvbmZpZywgcmM9JWRcbiIsIHJjKTsKKwl9IGVsc2UgeworCQl1OCAqZXNkX21vZGUgPSBOVUxMOworCisJCWlmIChwYW5lbC0+ZXNkX2NvbmZpZy5zdGF0dXNfbW9kZSA9PSBFU0RfTU9ERV9SRUdfUkVBRCkKKwkJCWVzZF9tb2RlID0gInJlZ2lzdGVyX3JlYWQiOworCQllbHNlIGlmIChwYW5lbC0+ZXNkX2NvbmZpZy5zdGF0dXNfbW9kZSA9PSBFU0RfTU9ERV9TV19CVEEpCisJCQllc2RfbW9kZSA9ICJidGFfdHJpZ2dlciI7CisJCWVsc2UgaWYgKHBhbmVsLT5lc2RfY29uZmlnLnN0YXR1c19tb2RlID09ICBFU0RfTU9ERV9QQU5FTF9URSkKKwkJCWVzZF9tb2RlID0gInRlX2NoZWNrIjsKKworCQlwcl9pbmZvKCJFU0QgZW5hYmxlZCB3aXRoIG1vZGU6ICVzXG4iLCBlc2RfbW9kZSk7CisJfQorCiAJcGFuZWwtPnBhbmVsX29mX25vZGUgPSBvZl9ub2RlOwogCWRybV9wYW5lbF9pbml0KCZwYW5lbC0+ZHJtX3BhbmVsKTsKIAltdXRleF9pbml0KCZwYW5lbC0+cGFuZWxfbG9jayk7CkBAIC0yNTIzLDYgKzI3NTIsOSBAQAogCiB2b2lkIGRzaV9wYW5lbF9wdXQoc3RydWN0IGRzaV9wYW5lbCAqcGFuZWwpCiB7CisJLyogZnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBFU0QgY2hlY2sgKi8KKwlkc2lfcGFuZWxfZXNkX2NvbmZpZ19kZWluaXQoJnBhbmVsLT5lc2RfY29uZmlnKTsKKwogCWtmcmVlKHBhbmVsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfcGFuZWwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpLXN0YWdpbmcvZHNpX3BhbmVsLmgKaW5kZXggYTg4NjRlZS4uZjYzZmQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2ktc3RhZ2luZy9kc2lfcGFuZWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS1zdGFnaW5nL2RzaV9wYW5lbC5oCkBAIC0xMjAsNiArMTIwLDI2IEBACiAJdTMyIG1vZGVfc2VsX3N0YXRlOwogfTsKIAorZW51bSBlc2RfY2hlY2tfc3RhdHVzX21vZGUgeworCUVTRF9NT0RFX1JFR19SRUFELAorCUVTRF9NT0RFX1NXX0JUQSwKKwlFU0RfTU9ERV9QQU5FTF9URSwKKwlFU0RfTU9ERV9NQVgKK307CisKK3N0cnVjdCBkcm1fcGFuZWxfZXNkX2NvbmZpZyB7CisJYm9vbCBlc2RfZW5hYmxlZDsKKworCWVudW0gZXNkX2NoZWNrX3N0YXR1c19tb2RlIHN0YXR1c19tb2RlOworCXN0cnVjdCBkc2lfcGFuZWxfY21kX3NldCBzdGF0dXNfY21kOworCXUzMiAqc3RhdHVzX2NtZHNfcmxlbjsKKwl1MzIgKnN0YXR1c192YWxpZF9wYXJhbXM7CisJdTMyICpzdGF0dXNfdmFsdWU7CisJdTggKnJldHVybl9idWY7CisJdTggKnN0YXR1c19idWY7CisJdTMyIGdyb3VwczsKK307CisKIHN0cnVjdCBkc2lfcGFuZWwgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYW5lbF9vZl9ub2RlOwpAQCAtMTQ4LDYgKzE2OCw3IEBACiAJc3RydWN0IGRzaV9wYW5lbF9yZXNldF9jb25maWcgcmVzZXRfY29uZmlnOwogCXN0cnVjdCBkc2lfcGluY3RybF9pbmZvIHBpbmN0cmw7CiAJc3RydWN0IGRybV9wYW5lbF9oZHJfcHJvcGVydGllcyBoZHJfcHJvcHM7CisJc3RydWN0IGRybV9wYW5lbF9lc2RfY29uZmlnIGVzZF9jb25maWc7CiAKIAlib29sIGxwMTFfaW5pdDsKIAlib29sIHVscHNfZW5hYmxlZDsKQEAgLTE1OCw2ICsxNzksOCBAQAogCiAJY2hhciBkc2NfcHBzX2NtZFtEU0lfQ01EX1BQU19TSVpFXTsKIAllbnVtIGRzaV9kbXNfbW9kZSBkbXNfbW9kZTsKKworCWJvb2wgc3luY19icm9hZGNhc3RfZW47CiB9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgZHNpX3BhbmVsX3VscHNfZmVhdHVyZV9lbmFibGVkKHN0cnVjdCBkc2lfcGFuZWwgKnBhbmVsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fYXRvbWljLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9hdG9taWMuYwppbmRleCAwYzFiY2Y2Li5jYmNmNTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9hdG9taWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9hdG9taWMuYwpAQCAtMTMwLDExICsxMzAsMTMgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtc21faXNfbW9kZV9zZWFtbGVzcygKLQkJCQkmY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjLT5zdGF0ZS0+bW9kZSkpCisJCQkmY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjLT5zdGF0ZS0+bW9kZSkgfHwKKwkJCW1zbV9pc19tb2RlX3NlYW1sZXNzX3ZycigKKwkJCSZjb25uZWN0b3ItPmVuY29kZXItPmNydGMtPnN0YXRlLT5hZGp1c3RlZF9tb2RlKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtc21faXNfbW9kZV9zZWFtbGVzc19kbXMoCi0JCQkgICAgICAgJmNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGUpKQorCQkJJmNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGUpKQogCQkJY29udGludWU7CiAKIAkJZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKQEAgLTE2OSw3ICsxNzEsOCBAQAogCQlpZiAoIW9sZF9jcnRjX3N0YXRlLT5hY3RpdmUpCiAJCQljb250aW51ZTsKIAotCQlpZiAobXNtX2lzX21vZGVfc2VhbWxlc3MoJmNydGMtPnN0YXRlLT5tb2RlKSkKKwkJaWYgKG1zbV9pc19tb2RlX3NlYW1sZXNzKCZjcnRjLT5zdGF0ZS0+bW9kZSkgfHwKKwkJCW1zbV9pc19tb2RlX3NlYW1sZXNzX3ZycigmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGUpKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1zbV9pc19tb2RlX3NlYW1sZXNzX2RtcygmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGUpKQpAQCAtMzA5LDcgKzMxMiw4IEBACiAJCWlmICghY3J0Yy0+c3RhdGUtPmFjdGl2ZSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtc21faXNfbW9kZV9zZWFtbGVzcygmY3J0Yy0+c3RhdGUtPm1vZGUpKQorCQlpZiAobXNtX2lzX21vZGVfc2VhbWxlc3MoJmNydGMtPnN0YXRlLT5tb2RlKSB8fAorCQkJbXNtX2lzX21vZGVfc2VhbWxlc3NfdnJyKCZjcnRjLT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZSkpCiAJCQljb250aW51ZTsKIAogCQlmdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOwpAQCAtNDc2LDYgKzQ4MCwxMCBAQAogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IE5VTEw7CiAJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTCwgaSA9IDAsIGogPSAwOworCWJvb2wgbm9uYmxvY2s7CisKKwkvKiBjYWNoZSBzaW5jZSB3b3JrIHdpbGwga2ZyZWUgY29tbWl0IGluIG5vbi1ibG9ja2luZyBjYXNlICovCisJbm9uYmxvY2sgPSBjb21taXQtPm5vbmJsb2NrOwogCiAJZm9yX2VhY2hfY3J0Y19pbl9zdGF0ZShzdGF0ZSwgY3J0YywgY3J0Y19zdGF0ZSwgaSkgewogCQlmb3IgKGogPSAwOyBqIDwgcHJpdi0+bnVtX2NydGNzOyBqKyspIHsKQEAgLTUxNSwxMCArNTIzLDEzIEBACiAJCSAqLwogCQlEUk1fRVJST1IoImZhaWxlZCB0byBkaXNwYXRjaCBjb21taXQgdG8gYW55IENSVENcbiIpOwogCQljb21wbGV0ZV9jb21taXQoY29tbWl0KTsKLQl9IGVsc2UgaWYgKCFjb21taXQtPm5vbmJsb2NrKSB7CisJfSBlbHNlIGlmICghbm9uYmxvY2spIHsKIAkJa3RocmVhZF9mbHVzaF93b3JrKCZjb21taXQtPmNvbW1pdF93b3JrKTsKLQkJa2ZyZWUoY29tbWl0KTsKIAl9CisKKwkvKiBmcmVlIG5vbmJsb2NraW5nIGNvbW1pdHMgaW4gdGhpcyBjb250ZXh0LCBhZnRlciBwcm9jZXNzaW5nICovCisJaWYgKCFub25ibG9jaykKKwkJa2ZyZWUoY29tbWl0KTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jCmluZGV4IDVlNDdkYWYuLjJmOTU3MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jCkBAIC01OCw1MSArNTgsNiBAQAogI2RlZmluZSBNU01fVkVSU0lPTl9QQVRDSExFVkVMCTAKIAogI2RlZmluZSBURUFSRE9XTl9ERUFETE9DS19SRVRSWV9NQVggNQotI2RlZmluZSBIUERfU1RSSU5HX1NJWkUgMzAKLQotc3RhdGljIHZvaWQgbXNtX2RybV9oZWxwZXJfaG90cGx1Z19ldmVudChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7Ci0JY2hhciBuYW1lW0hQRF9TVFJJTkdfU0laRV0sIHN0YXR1c1tIUERfU1RSSU5HX1NJWkVdOwotCWNoYXIgY29uc3QgKmNvbm5lY3Rvcl9uYW1lOwotCWNoYXIgKmVudnBbM107Ci0KLQlpZiAoIWRldikgewotCQlEUk1fRVJST1IoImhvdHBsdWdfZXZlbnQgZmFpbGVkLCBpbnZhbGlkIGlucHV0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghZGV2LT5tb2RlX2NvbmZpZy5wb2xsX2VuYWJsZWQpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCWRybV9mb3JfZWFjaF9jb25uZWN0b3IoY29ubmVjdG9yLCBkZXYpIHsKLQkJLyogT25seSBoYW5kbGUgSFBEIGNhcGFibGUgY29ubmVjdG9ycy4gKi8KLQkJaWYgKCEoY29ubmVjdG9yLT5wb2xsZWQgJiBEUk1fQ09OTkVDVE9SX1BPTExfSFBEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWNvbm5lY3Rvci0+c3RhdHVzID0gY29ubmVjdG9yLT5mdW5jcy0+ZGV0ZWN0KGNvbm5lY3RvciwgZmFsc2UpOwotCi0JCWlmIChjb25uZWN0b3ItPm5hbWUpCi0JCQljb25uZWN0b3JfbmFtZSA9IGNvbm5lY3Rvci0+bmFtZTsKLQkJZWxzZQotCQkJY29ubmVjdG9yX25hbWUgPSAidW5rbm93biI7Ci0KLQkJc25wcmludGYobmFtZSwgSFBEX1NUUklOR19TSVpFLCAibmFtZT0lcyIsIGNvbm5lY3Rvcl9uYW1lKTsKLQotCQlzbnByaW50ZihzdGF0dXMsIEhQRF9TVFJJTkdfU0laRSwgInN0YXR1cz0lcyIsCi0JCQlkcm1fZ2V0X2Nvbm5lY3Rvcl9zdGF0dXNfbmFtZShjb25uZWN0b3ItPnN0YXR1cykpOwotCi0JCURSTV9ERUJVRygiZ2VuZXJhdGluZyBob3RwbHVnIGV2ZW50IFslc106IFslc11cbiIsCi0JCQluYW1lLCBzdGF0dXMpOwotCQllbnZwWzBdID0gbmFtZTsKLQkJZW52cFsxXSA9IHN0YXR1czsKLQkJZW52cFsyXSA9IE5VTEw7Ci0JCWtvYmplY3RfdWV2ZW50X2VudigmZGV2LT5wcmltYXJ5LT5rZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSwKLQkJCQllbnZwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKLX0KIAogc3RhdGljIHZvaWQgbXNtX2ZiX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKQEAgLTExNyw4ICs3Miw2IEBACiAKIAlpZiAocHJpdi0+ZmJkZXYpCiAJCWRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudChwcml2LT5mYmRldik7Ci0JZWxzZQotCQltc21fZHJtX2hlbHBlcl9ob3RwbHVnX2V2ZW50KGRldik7CiB9CiAKIC8qKgpAQCAtMTQxNiw3ICsxMzY5LDkgQEAKIAkJCWNvbnRpbnVlOwogCQlsZW4gPSBldmVudC0+bGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBkcm1fbXNtX2V2ZW50X3Jlc3ApOwogCQlpZiAobm9kZS0+YmFzZS5maWxlX3ByaXYtPmV2ZW50X3NwYWNlIDwgbGVuKSB7Ci0JCQlEUk1fRVJST1IoIkluc3VmZmljaWVudCBzcGFjZSB0byBub3RpZnlcbiIpOworCQkJRFJNX0VSUk9SKCJJbnN1ZmZpY2llbnQgc3BhY2UgJWQgZm9yIGV2ZW50ICV4IGxlbiAlZFxuIiwKKwkJCQlub2RlLT5iYXNlLmZpbGVfcHJpdi0+ZXZlbnRfc3BhY2UsIGV2ZW50LT50eXBlLAorCQkJCWxlbik7CiAJCQljb250aW51ZTsKIAkJfQogCQlub3RpZnkgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGE1OWRhNTcuLmUxOWQxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0xMjcsNiArMTI3LDkgQEAKIAogZW51bSBtc21fbWRwX2NydGNfcHJvcGVydHkgewogCUNSVENfUFJPUF9JTkZPLAorCUNSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfRUQsCisJQ1JUQ19QUk9QX0RFU1RfU0NBTEVSX0xVVF9DSVIsCisJQ1JUQ19QUk9QX0RFU1RfU0NBTEVSX0xVVF9TRVAsCiAKIAkvKiAjIG9mIGJsb2IgcHJvcGVydGllcyAqLwogCUNSVENfUFJPUF9CTE9CQ09VTlQsCkBAIC0xNDcsNyArMTUwLDggQEAKIAlDUlRDX1BST1BfUk9UX0NMSywKIAlDUlRDX1BST1BfUk9JX1YxLAogCUNSVENfUFJPUF9TRUNVUklUWV9MRVZFTCwKLQlDUlRDX1BST1BfSURMRV9USU1FLAorCUNSVENfUFJPUF9JRExFX1RJTUVPVVQsCisJQ1JUQ19QUk9QX0RFU1RfU0NBTEVSLAogCiAJLyogdG90YWwgIyBvZiBwcm9wZXJ0aWVzICovCiAJQ1JUQ19QUk9QX0NPVU5UCkBAIC0yMDgsMTIgKzIxMiwxNCBAQAogICogQE1TTV9ESVNQTEFZX0NBUF9DTURfTU9ERTogICAgICAgICAgIENvbW1hbmQgbW9kZSBzdXBwb3J0ZWQKICAqIEBNU01fRElTUExBWV9DQVBfSE9UX1BMVUc6ICAgICAgICAgICBIb3QgcGx1ZyBkZXRlY3Rpb24gc3VwcG9ydGVkCiAgKiBATVNNX0RJU1BMQVlfQ0FQX0VESUQ6ICAgICAgICAgICAgICAgRURJRCBzdXBwb3J0ZWQKKyAqIEBNU01fRElTUExBWV9FU0RfRU5BQkxFRDogICAgICAgICAgICBFU0QgZmVhdHVyZSBlbmFibGVkCiAgKi8KIGVudW0gbXNtX2Rpc3BsYXlfY2FwcyB7CiAJTVNNX0RJU1BMQVlfQ0FQX1ZJRF9NT0RFCT0gQklUKDApLAogCU1TTV9ESVNQTEFZX0NBUF9DTURfTU9ERQk9IEJJVCgxKSwKIAlNU01fRElTUExBWV9DQVBfSE9UX1BMVUcJPSBCSVQoMiksCiAJTVNNX0RJU1BMQVlfQ0FQX0VESUQJCT0gQklUKDMpLAorCU1TTV9ESVNQTEFZX0VTRF9FTkFCTEVECQk9IEJJVCg0KSwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYwppbmRleCBiODI5NDYwLi5mOGMzZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uYwpAQCAtMzExLDggKzMxMSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAotcHV0X2lvdmEoc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCitzdGF0aWMgdm9pZCBwdXRfaW92YShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CiAJc3RydWN0IG1zbV9nZW1fb2JqZWN0ICptc21fb2JqID0gdG9fbXNtX2JvKG9iaik7CkBAIC0zMjQsMTIgKzMyMywxNCBAQAogCQlpZiAoaW9tbXVfcHJlc2VudCgmcGxhdGZvcm1fYnVzX3R5cGUpKSB7CiAJCQltc21fZ2VtX3VubWFwX3ZtYShkb21haW4tPmFzcGFjZSwgZG9tYWluLAogCQkJCW1zbV9vYmotPnNndCwgZ2V0X2RtYWJ1Zl9wdHIob2JqKSk7Ci0KLQkJCW1zbV9nZW1fcmVtb3ZlX29ial9mcm9tX2FzcGFjZV9hY3RpdmVfbGlzdCgKLQkJCQkJZG9tYWluLT5hc3BhY2UsCi0JCQkJCW9iaik7CiAJCX0KIAorCQkvKgorCQkgKiBwdXRfaW92YSByZW1vdmVzIHRoZSBkb21haW4gY29ubmVjdGVkIHRvIHRoZSBvYmogd2hpY2ggbWFrZXMKKwkJICogdGhlIGFzcGFjZSBpbmFjY2Vzc2libGUuIFN0b3JlIHRoZSBhc3BhY2UsIGFzIGl0IGlzIHVzZWQgdG8KKwkJICogdXBkYXRlIHRoZSBhY3RpdmVfbGlzdCBkdXJpbmcgZ2VtX2ZyZWVfb2JqIGFuZCBnZW1fcHVyZWdlLgorCQkgKi8KKwkJbXNtX29iai0+YXNwYWNlID0gZG9tYWluLT5hc3BhY2U7CiAJCW9ial9yZW1vdmVfZG9tYWluKGRvbWFpbik7CiAJfQogfQpAQCAtNDA5LDcgKzQxMCw4IEBACiAKIAlpZiAoIXJldCAmJiBkb21haW4pIHsKIAkJKmlvdmEgPSBkb21haW4tPmlvdmE7Ci0JCW1zbV9nZW1fYWRkX29ial90b19hc3BhY2VfYWN0aXZlX2xpc3QoYXNwYWNlLCBvYmopOworCQlpZiAoYXNwYWNlICYmIGFzcGFjZS0+ZG9tYWluX2F0dGFjaGVkKQorCQkJbXNtX2dlbV9hZGRfb2JqX3RvX2FzcGFjZV9hY3RpdmVfbGlzdChhc3BhY2UsIG9iaik7CiAJfSBlbHNlIHsKIAkJb2JqX3JlbW92ZV9kb21haW4oZG9tYWluKTsKIAl9CkBAIC00ODUsMjQgKzQ4NywyMSBAQAogCQkvKioKIAkJICogVW5tYXAgYWN0aXZlIGJ1ZmZlcnMsCiAJCSAqIHR5cGljYWxseSBjbGllbnRzIHNob3VsZCBkbyB0aGlzIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCwKLQkJICogYnV0IHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhlIGZyYW1lYnVmZmVycyB3aGljaCBhcmUgbm90Ci0JCSAqIGF0dGFjaGVkIHRvIGFueSBwbGFuZXMuIChiYWNrZ3JvdW5kIGFwcHMpCisJCSAqIGJ1dCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoZSBidWZmZXJzIHdoaWNoIGFyZSBub3QKKwkJICogYXR0YWNoZWQgdG8gYW55IHBsYW5lcy4KIAkJICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobXNtX29iaiwgJmFzcGFjZS0+YWN0aXZlX2xpc3QsIGlvdmFfbGlzdCkgewogCQkJb2JqID0gJm1zbV9vYmotPmJhc2U7Ci0JCQlpZiAob2JqLT5pbXBvcnRfYXR0YWNoKSB7CisJCQlpZiAob2JqLT5pbXBvcnRfYXR0YWNoKQogCQkJCXB1dF9pb3ZhKG9iaik7Ci0JCQkJcHV0X3BhZ2VzKG9iaik7Ci0JCQl9CiAJCX0KIAl9IGVsc2UgewogCQkvKiBtYXAgYWN0aXZlIGJ1ZmZlcnMgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShtc21fb2JqLCAmYXNwYWNlLT5hY3RpdmVfbGlzdCwKLQkJCQlpb3ZhX2xpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtc21fb2JqLCAmYXNwYWNlLT5hY3RpdmVfbGlzdCwgaW92YV9saXN0KSB7CiAJCQlvYmogPSAmbXNtX29iai0+YmFzZTsKIAkJCXJldCA9IG1zbV9nZW1fZ2V0X2lvdmFfbG9ja2VkKG9iaiwgYXNwYWNlLCAmaW92YSk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZvYmotPmRldi0+c3RydWN0X211dGV4KTsKKwkJCQltdXRleF91bmxvY2soJmFzcGFjZS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtNjEzLDYgKzYxMiw3IEBACiAJV0FSTl9PTihvYmotPmltcG9ydF9hdHRhY2gpOwogCiAJcHV0X2lvdmEob2JqKTsKKwltc21fZ2VtX3JlbW92ZV9vYmpfZnJvbV9hc3BhY2VfYWN0aXZlX2xpc3QobXNtX29iai0+YXNwYWNlLCBvYmopOwogCiAJbXNtX2dlbV92dW5tYXAob2JqKTsKIApAQCAtODQxLDYgKzg0MSw3IEBACiAJbGlzdF9kZWwoJm1zbV9vYmotPm1tX2xpc3QpOwogCiAJcHV0X2lvdmEob2JqKTsKKwltc21fZ2VtX3JlbW92ZV9vYmpfZnJvbV9hc3BhY2VfYWN0aXZlX2xpc3QobXNtX29iai0+YXNwYWNlLCBvYmopOwogCiAJaWYgKG9iai0+aW1wb3J0X2F0dGFjaCkgewogCQlpZiAobXNtX29iai0+dmFkZHIpCkBAIC05MTMsNiArOTE0LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOworCiAJaWYgKCFpb21tdV9wcmVzZW50KCZwbGF0Zm9ybV9idXNfdHlwZSkpCiAJCXVzZV92cmFtID0gdHJ1ZTsKIAllbHNlIGlmICgoZmxhZ3MgJiBNU01fQk9fU1RPTEVOKSAmJiBwcml2LT52cmFtLnNpemUpCkBAIC05NDYsNiArOTQ5LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbXNtX29iai0+c3VibWl0X2VudHJ5KTsKIAlJTklUX0xJU1RfSEVBRCgmbXNtX29iai0+ZG9tYWlucyk7CiAJSU5JVF9MSVNUX0hFQUQoJm1zbV9vYmotPmlvdmFfbGlzdCk7CisJbXNtX29iai0+YXNwYWNlID0gTlVMTDsKIAogCWxpc3RfYWRkX3RhaWwoJm1zbV9vYmotPm1tX2xpc3QsICZwcml2LT5pbmFjdGl2ZV9saXN0KTsKIApAQCAtOTg3LDcgKzk5MSw3IEBACiAJCXN0cnVjdCBkbWFfYnVmICpkbWFidWYsIHN0cnVjdCBzZ190YWJsZSAqc2d0KQogewogCXN0cnVjdCBtc21fZ2VtX29iamVjdCAqbXNtX29iajsKLQlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiA9IE5VTEw7CiAJdWludDMyX3Qgc2l6ZTsKIAlpbnQgcmV0LCBucGFnZXM7CiAKQEAgLTk5OSw3ICsxMDAzLDEyIEBACiAKIAlzaXplID0gUEFHRV9BTElHTihkbWFidWYtPnNpemUpOwogCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwogCXJldCA9IG1zbV9nZW1fbmV3X2ltcGwoZGV2LCBzaXplLCBNU01fQk9fV0MsIGRtYWJ1Zi0+cmVzdiwgJm9iaik7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCmluZGV4IGM1MGM0NTMuLjg1MjFiZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5oCkBAIC0xMjIsNiArMTIyLDggQEAKIAkgKi8KIAlzdHJ1Y3QgZHJtX21tX25vZGUgKnZyYW1fbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGlvdmFfbGlzdDsKKworCXN0cnVjdCBtc21fZ2VtX2FkZHJlc3Nfc3BhY2UgKmFzcGFjZTsKIH07CiAjZGVmaW5lIHRvX21zbV9ibyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IG1zbV9nZW1fb2JqZWN0LCBiYXNlKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMKaW5kZXggYzY5NWRkYS4uY2M3NWZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtX3N1Ym1pdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYwpAQCAtMTA5LDcgKzEwOSw4IEBACiAJCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCQl9CiAKLQkJaWYgKHN1Ym1pdF9iby5mbGFncyAmIH5NU01fU1VCTUlUX0JPX0ZMQUdTKSB7CisJCWlmICgoc3VibWl0X2JvLmZsYWdzICYgfk1TTV9TVUJNSVRfQk9fRkxBR1MpIHx8CisJCQkhKHN1Ym1pdF9iby5mbGFncyAmIE1TTV9TVUJNSVRfQk9fRkxBR1MpKSB7CiAJCQlEUk1fRVJST1IoImludmFsaWQgZmxhZ3M6ICV4XG4iLCBzdWJtaXRfYm8uZmxhZ3MpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X3VubG9jazsKQEAgLTI5Myw3ICsyOTQsNyBAQAogewogCXVpbnQzMl90IGksIGxhc3Rfb2Zmc2V0ID0gMDsKIAl1aW50MzJfdCAqcHRyOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAob2Zmc2V0ICUgNCkgewogCQlEUk1fRVJST1IoIm5vbi1hbGlnbmVkIGNtZHN0cmVhbSBidWZmZXI6ICV1XG4iLCBvZmZzZXQpOwpAQCAtMzIwLDEyICszMjEsMTMgQEAKIAogCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc3VibWl0X3JlbG9jLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X3JlbG9jKSk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OwogCiAJCWlmIChzdWJtaXRfcmVsb2Muc3VibWl0X29mZnNldCAlIDQpIHsKIAkJCURSTV9FUlJPUigibm9uLWFsaWduZWQgcmVsb2Mgb2Zmc2V0OiAldVxuIiwKIAkJCQkJc3VibWl0X3JlbG9jLnN1Ym1pdF9vZmZzZXQpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBvZmZzZXQgaW4gZHdvcmRzOiAqLwpAQCAtMzM0LDEyICszMzYsMTMgQEAKIAkJaWYgKChvZmYgPj0gKG9iai0+YmFzZS5zaXplIC8gNCkpIHx8CiAJCQkJKG9mZiA8IGxhc3Rfb2Zmc2V0KSkgewogCQkJRFJNX0VSUk9SKCJpbnZhbGlkIG9mZnNldCAldSBhdCByZWxvYyAldVxuIiwgb2ZmLCBpKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJcmV0ID0gc3VibWl0X2JvKHN1Ym1pdCwgc3VibWl0X3JlbG9jLnJlbG9jX2lkeCwgTlVMTCwgJmlvdmEsICZ2YWxpZCk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXQ7CiAKIAkJaWYgKHZhbGlkKQogCQkJY29udGludWU7CkBAIC0zNTYsOSArMzU5LDEwIEBACiAJCWxhc3Rfb2Zmc2V0ID0gb2ZmOwogCX0KIAorb3V0OgogCW1zbV9nZW1fcHV0X3ZhZGRyX2xvY2tlZCgmb2JqLT5iYXNlKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHN1Ym1pdF9jbGVhbnVwKHN0cnVjdCBtc21fZ2VtX3N1Ym1pdCAqc3VibWl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9rbXMuaAppbmRleCA3NjUyM2M3Li4zMDRmYWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9rbXMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9rbXMuaApAQCAtMzYsNiArMzYsOCBAQAogI2RlZmluZSBNU01fTU9ERV9GTEFHX1ZCTEFOS19QUkVfTU9ERVNFVAkoMTw8MSkKIC8qIFJlcXVlc3QgdG8gc3dpdGNoIHRoZSBjb25uZWN0b3IgbW9kZSAqLwogI2RlZmluZSBNU01fTU9ERV9GTEFHX1NFQU1MRVNTX0RNUwkJCSgxPDwyKQorLyogUmVxdWVzdCB0byBzd2l0Y2ggdGhlIGZwcyAqLworI2RlZmluZSBNU01fTU9ERV9GTEFHX1NFQU1MRVNTX1ZSUgkJCSgxPDwzKQogCiAvKiBBcyB0aGVyZSBhcmUgZGlmZmVyZW50IGRpc3BsYXkgY29udHJvbGxlciBibG9ja3MgZGVwZW5kaW5nIG9uIHRoZQogICogc25hcGRyYWdvbiB2ZXJzaW9uLCB0aGUga21zIHN1cHBvcnQgaXMgc3BsaXQgb3V0IGFuZCB0aGUgYXBwcm9wcmlhdGUKQEAgLTE2Myw2ICsxNjUsMTIgQEAKIAkJKG1vZGUtPnByaXZhdGVfZmxhZ3MgJiBNU01fTU9ERV9GTEFHX1NFQU1MRVNTX0RZTkFNSUNfRlBTKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBtc21faXNfbW9kZV9zZWFtbGVzc192cnIoY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJcmV0dXJuIG1vZGUgPyAobW9kZS0+cHJpdmF0ZV9mbGFncyAmIE1TTV9NT0RFX0ZMQUdfU0VBTUxFU1NfVlJSKQorCQk6IGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgbXNtX25lZWRzX3ZibGFua19wcmVfbW9kZXNldCgKIAkJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9wcm9wLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9wcm9wLmMKaW5kZXggZDE5OTFhNC4uMDMzYmU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fcHJvcC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX3Byb3AuYwpAQCAtMjY5LDkgKzI2OSwxNiBAQAogCQlpbmZvLT5wcm9wZXJ0eV9kYXRhW3Byb3BlcnR5X2lkeF0uZGVmYXVsdF92YWx1ZSA9IDA7CiAJCWluZm8tPnByb3BlcnR5X2RhdGFbcHJvcGVydHlfaWR4XS5mb3JjZV9kaXJ0eSA9IGZhbHNlOwogCisJCS8qIHNlbGVjdCBmaXJzdCBkZWZpbmVkIHZhbHVlIGZvciBlbnVtcyAqLworCQlpZiAoIWlzX2JpdG1hc2spCisJCQlpbmZvLT5wcm9wZXJ0eV9kYXRhW3Byb3BlcnR5X2lkeF0uZGVmYXVsdF92YWx1ZSA9CisJCQkJdmFsdWVzLT50eXBlOworCiAJCS8qIGFsd2F5cyBhdHRhY2ggcHJvcGVydHksIGlmIGNyZWF0ZWQgKi8KIAkJaWYgKCpwcm9wKSB7Ci0JCQlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eShpbmZvLT5iYXNlLCAqcHJvcCwgMCk7CisJCQlkcm1fb2JqZWN0X2F0dGFjaF9wcm9wZXJ0eShpbmZvLT5iYXNlLCAqcHJvcCwKKwkJCQkJaW5mby0+cHJvcGVydHlfZGF0YQorCQkJCQlbcHJvcGVydHlfaWR4XS5kZWZhdWx0X3ZhbHVlKTsKIAkJCSsraW5mby0+aW5zdGFsbF9jb3VudDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX3JpbmdidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX3JpbmdidWZmZXIuYwppbmRleCBmMzI2Y2Y2Li42N2IzNGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fcmluZ2J1ZmZlci5jCkBAIC0yMyw3ICsyMyw4IEBACiAJc3RydWN0IG1zbV9yaW5nYnVmZmVyICpyaW5nOwogCWludCByZXQ7CiAKLQlzaXplID0gQUxJR04oc2l6ZSwgNCk7ICAgLyogc2l6ZSBzaG91bGQgYmUgZHdvcmQgYWxpZ25lZCAqLworCWlmIChXQVJOX09OKCFpc19wb3dlcl9vZl8yKHNpemUpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlyaW5nID0ga3phbGxvYyhzaXplb2YoKnJpbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJpbmcpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb2xvcl9wcm9jZXNzaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29sb3JfcHJvY2Vzc2luZy5jCmluZGV4IDk0MDkwNjYuLmU5ZmZiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb2xvcl9wcm9jZXNzaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NvbG9yX3Byb2Nlc3NpbmcuYwpAQCAtNjIsNiArNjIsOCBAQAogCiBzdGF0aWMgdm9pZCBkc3BwX2lnY19pbnN0YWxsX3Byb3BlcnR5KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CiAKK3N0YXRpYyB2b2lkIGRzcHBfaGlzdF9pbnN0YWxsX3Byb3BlcnR5KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisKIHR5cGVkZWYgdm9pZCAoKmRzcHBfcHJvcF9pbnN0YWxsX2Z1bmNfdCkoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAogc3RhdGljIGRzcHBfcHJvcF9pbnN0YWxsX2Z1bmNfdCBkc3BwX3Byb3BfaW5zdGFsbF9mdW5jW1NERV9EU1BQX01BWF07CkBAIC03Nyw2ICs3OSw4IEBACiBzdGF0aWMgdm9pZCBzZGVfY3BfYWRfc2V0X3Byb3Aoc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YywKIAkJZW51bSBhZF9wcm9wZXJ0eSBhZF9wcm9wKTsKIAorc3RhdGljIHZvaWQgc2RlX2NwX25vdGlmeV9oaXN0X2V2ZW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sIHZvaWQgKmFyZyk7CisKICNkZWZpbmUgc2V0dXBfZHNwcF9wcm9wX2luc3RhbGxfZnVuY3MoZnVuYykgXAogZG8geyBcCiAJZnVuY1tTREVfRFNQUF9QQ0NdID0gZHNwcF9wY2NfaW5zdGFsbF9wcm9wZXJ0eTsgXApAQCAtODYsNiArOTAsNyBAQAogCWZ1bmNbU0RFX0RTUFBfR0FNVVRdID0gZHNwcF9nYW11dF9pbnN0YWxsX3Byb3BlcnR5OyBcCiAJZnVuY1tTREVfRFNQUF9HQ10gPSBkc3BwX2djX2luc3RhbGxfcHJvcGVydHk7IFwKIAlmdW5jW1NERV9EU1BQX0lHQ10gPSBkc3BwX2lnY19pbnN0YWxsX3Byb3BlcnR5OyBcCisJZnVuY1tTREVfRFNQUF9ISVNUXSA9IGRzcHBfaGlzdF9pbnN0YWxsX3Byb3BlcnR5OyBcCiB9IHdoaWxlICgwKQogCiB0eXBlZGVmIHZvaWQgKCpsbV9wcm9wX2luc3RhbGxfZnVuY190KShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwpAQCAtMTExLDcgKzExNiw4IEBACiAJU0RFX0NQX0NSVENfRFNQUF9TSVhaT05FLAogCVNERV9DUF9DUlRDX0RTUFBfR0FNVVQsCiAJU0RFX0NQX0NSVENfRFNQUF9ESVRIRVIsCi0JU0RFX0NQX0NSVENfRFNQUF9ISVNULAorCVNERV9DUF9DUlRDX0RTUFBfSElTVF9DVFJMLAorCVNERV9DUF9DUlRDX0RTUFBfSElTVF9JUlEsCiAJU0RFX0NQX0NSVENfRFNQUF9BRCwKIAlTREVfQ1BfQ1JUQ19EU1BQX1ZMVVQsCiAJU0RFX0NQX0NSVENfRFNQUF9BRF9NT0RFLApAQCAtMzY1LDYgKzM3MSwxMyBAQAogCQlyZXR1cm47CiAJfQogCisJLyogY3JlYXRlIGJsb2IgdG8gc3RvcmUgaGlzdG9ncmFtIGRhdGEgKi8KKwlzZGVfY3J0Yy0+aGlzdF9ibG9iID0gZHJtX3Byb3BlcnR5X2NyZWF0ZV9ibG9iKGNydGMtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGRybV9tc21faGlzdCksIE5VTEwpOworCWlmIChJU19FUlIoc2RlX2NydGMtPmhpc3RfYmxvYikpCisJCXNkZV9jcnRjLT5oaXN0X2Jsb2IgPSBOVUxMOworCisJbXV0ZXhfaW5pdCgmc2RlX2NydGMtPmNydGNfY3BfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNkZV9jcnRjLT5hY3RpdmVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNkZV9jcnRjLT5kaXJ0eV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmc2RlX2NydGMtPmZlYXR1cmVfbGlzdCk7CkBAIC01MzEsNiArNTQ0LDc3IEBACiAJc2RlX2NwX2NydGNfcHJvcF9hdHRhY2goJnByb3BfYXR0YWNoKTsKIH0KIAorc3RhdGljIHN0cnVjdCBzZGVfY3J0Y19pcnFfaW5mbyAqX3NkZV9jcF9nZXRfaW50cl9ub2RlKHUzMiBldmVudCwKKwkJCQlzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjKQoreworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlzdHJ1Y3Qgc2RlX2NydGNfaXJxX2luZm8gKm5vZGUgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2RlX2NydGMtPnVzZXJfZXZlbnRfbGlzdCwgbGlzdCkgeworCQlpZiAobm9kZS0+ZXZlbnQgPT0gZXZlbnQpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkKKwkJbm9kZSA9IE5VTEw7CisKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHZvaWQgX3NkZV9jcF9jcnRjX2VuYWJsZV9oaXN0X2lycShzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0gPSAmc2RlX2NydGMtPmJhc2U7CisJc3RydWN0IHNkZV9rbXMgKmttcyA9IE5VTEw7CisJc3RydWN0IHNkZV9od19taXhlciAqaHdfbG07CisJc3RydWN0IHNkZV9od19kc3BwICpod19kc3BwID0gTlVMTDsKKwlzdHJ1Y3Qgc2RlX2NydGNfaXJxX2luZm8gKm5vZGUgPSBOVUxMOworCWludCBpLCBpcnFfaWR4LCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNydGNfZHJtKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBjcnRjICVwS1xuIiwgY3J0Y19kcm0pOworCQlyZXR1cm47CisJfQorCisJa21zID0gZ2V0X2ttcyhjcnRjX2RybSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2RlX2NydGMtPm51bV9taXhlcnM7IGkrKykgeworCQlod19sbSA9IHNkZV9jcnRjLT5taXhlcnNbaV0uaHdfbG07CisJCWh3X2RzcHAgPSBzZGVfY3J0Yy0+bWl4ZXJzW2ldLmh3X2RzcHA7CisJCWlmICghaHdfbG0tPmNmZy5yaWdodF9taXhlcikKKwkJCWJyZWFrOworCX0KKworCWlmICghaHdfZHNwcCkgeworCQlEUk1fRVJST1IoImludmFsaWQgZHNwcFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpcnFfaWR4ID0gc2RlX2NvcmVfaXJxX2lkeF9sb29rdXAoa21zLCBTREVfSVJRX1RZUEVfSElTVF9EU1BQX0RPTkUsCisJCQkJCWh3X2RzcHAtPmlkeCk7CisJaWYgKGlycV9pZHggPCAwKSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBpcnEgaWR4XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGVfY3J0Yy0+c3Bpbl9sb2NrLCBmbGFncyk7CisJbm9kZSA9IF9zZGVfY3BfZ2V0X2ludHJfbm9kZShEUk1fRVZFTlRfSElTVE9HUkFNLCBzZGVfY3J0Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RlX2NydGMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJaWYgKCFub2RlKQorCQlyZXR1cm47CisKKwlpZiAobm9kZS0+c3RhdGUgPT0gSVJRX0RJU0FCTEVEKSB7CisJCXJldCA9IHNkZV9jb3JlX2lycV9lbmFibGUoa21zLCAmaXJxX2lkeCwgMSk7CisJCWlmIChyZXQpCisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgaXJxICVkXG4iLCBpcnFfaWR4KTsKKwkJZWxzZQorCQkJbm9kZS0+c3RhdGUgPSBJUlFfRU5BQkxFRDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNkZV9jcF9jcnRjX3NldGZlYXR1cmUoc3RydWN0IHNkZV9jcF9ub2RlICpwcm9wX25vZGUsCiAJCQkJICAgc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YykKIHsKQEAgLTYzOSw2ICs3MjMsMjEgQEAKIAkJCX0KIAkJCWh3X2xtLT5vcHMuc2V0dXBfZ2MoaHdfbG0sICZod19jZmcpOwogCQkJYnJlYWs7CisJCWNhc2UgU0RFX0NQX0NSVENfRFNQUF9ISVNUX0NUUkw6CisJCQlpZiAoIWh3X2RzcHAgfHwgIWh3X2RzcHAtPm9wcy5zZXR1cF9oaXN0b2dyYW0pIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaHdfZHNwcC0+b3BzLnNldHVwX2hpc3RvZ3JhbShod19kc3BwLCAmZmVhdHVyZV9lbmFibGVkKTsKKwkJCWJyZWFrOworCQljYXNlIFNERV9DUF9DUlRDX0RTUFBfSElTVF9JUlE6CisJCQlpZiAoIWh3X2RzcHAgfHwgIWh3X2xtKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghaHdfbG0tPmNmZy5yaWdodF9taXhlcikKKwkJCQlfc2RlX2NwX2NydGNfZW5hYmxlX2hpc3RfaXJxKHNkZV9jcnRjKTsKKwkJCWJyZWFrOwogCQljYXNlIFNERV9DUF9DUlRDX0RTUFBfQURfTU9ERToKIAkJCWlmICghaHdfZHNwcCB8fCAhaHdfZHNwcC0+b3BzLnNldHVwX2FkKSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTc0Niw2ICs4NDUsOCBAQAogCQlyZXR1cm47CiAJfQogCisJbXV0ZXhfbG9jaygmc2RlX2NydGMtPmNydGNfY3BfbG9jayk7CisKIAkvKiBDaGVjayBpZiBkaXJ0eSBsaXN0cyBhcmUgZW1wdHkgYW5kIGFkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZCBmb3IKIAkgKiBlYXJseSByZXR1cm4uIElmIGFkIHByb3BlcnRpZXMgYXJlIGFjdGl2ZSB0aGVuIHdlIG5lZWQgdG8gaXNzdWUKIAkgKiBkc3BwIGZsdXNoLgpAQCAtNzU0LDcgKzg1NSw3IEBACiAJCWxpc3RfZW1wdHkoJnNkZV9jcnRjLT5hZF9kaXJ0eSkpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnNkZV9jcnRjLT5hZF9hY3RpdmUpKSB7CiAJCQlEUk1fREVCVUdfRFJJVkVSKCJEaXJ0eSBsaXN0IGlzIGVtcHR5XG4iKTsKLQkJCXJldHVybjsKKwkJCWdvdG8gZXhpdDsKIAkJfQogCQlzZGVfY3BfYWRfc2V0X3Byb3Aoc2RlX2NydGMsIEFEX0lQQ19SRVNFVCk7CiAJCXNldF9kc3BwX2ZsdXNoID0gdHJ1ZTsKQEAgLTc5NCw2ICs4OTUsOCBAQAogCQkJY3RsLT5vcHMudXBkYXRlX3BlbmRpbmdfZmx1c2goY3RsLCBmbHVzaF9tYXNrKTsKIAkJfQogCX0KK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZzZGVfY3J0Yy0+Y3J0Y19jcF9sb2NrKTsKIH0KIAogdm9pZCBzZGVfY3BfY3J0Y19pbnN0YWxsX3Byb3BlcnRpZXMoc3RydWN0IGRybV9jcnRjICpjcnRjKQpAQCAtODI0LDEzICs5MjcsMTUgQEAKIAkJcmV0dXJuOwogCX0KIAorCW11dGV4X2xvY2soJnNkZV9jcnRjLT5jcnRjX2NwX2xvY2spOworCiAJLyoqCiAJICogRnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGF0b21pY19jaGVjayB3aXRoIHRlc3Rfb25seSBmbGFnCiAJICogYW5kIGFjdHVhbCBjb21taXQuIEFsbG9jYXRlIHByb3BlcnRpZXMgb25seSBpZiBmZWF0dXJlIGxpc3QgaXMKIAkgKiBlbXB0eSBkdXJpbmcgdGhlIGF0b21pY19jaGVjayB3aXRoIHRlc3Rfb25seSBmbGFnLgogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmc2RlX2NydGMtPmZlYXR1cmVfbGlzdCkpCi0JCXJldHVybjsKKwkJZ290byBleGl0OwogCiAJY2F0YWxvZyA9IGttcy0+Y2F0YWxvZzsKIAlwcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTg0Niw3ICs5NTEsNyBAQAogCQlzZXR1cF9sbV9wcm9wX2luc3RhbGxfZnVuY3MobG1fcHJvcF9pbnN0YWxsX2Z1bmMpOwogCX0KIAlpZiAoIXByaXYtPmNwX3Byb3BlcnR5KQotCQlyZXR1cm47CisJCWdvdG8gZXhpdDsKIAogCWlmICghY2F0YWxvZy0+ZHNwcF9jb3VudCkKIAkJZ290byBsbV9wcm9wZXJ0eTsKQEAgLTg2Miw3ICs5NjcsNyBAQAogCiBsbV9wcm9wZXJ0eToKIAlpZiAoIWNhdGFsb2ctPm1peGVyX2NvdW50KQotCQlyZXR1cm47CisJCWdvdG8gZXhpdDsKIAogCS8qIENoZWNrIGZvciBhbGwgdGhlIExNIHByb3BlcnRpZXMgYW5kIGF0dGFjaCBpdCB0byBDUlRDICovCiAJZmVhdHVyZXMgPSBjYXRhbG9nLT5taXhlclswXS5mZWF0dXJlczsKQEAgLTg3Miw2ICs5NzcsOSBAQAogCQlpZiAobG1fcHJvcF9pbnN0YWxsX2Z1bmNbaV0pCiAJCQlsbV9wcm9wX2luc3RhbGxfZnVuY1tpXShjcnRjKTsKIAl9CitleGl0OgorCW11dGV4X3VubG9jaygmc2RlX2NydGMtPmNydGNfY3BfbG9jayk7CisKIH0KIAogaW50IHNkZV9jcF9jcnRjX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCkBAIC04OTQsNiArMTAwMiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCW11dGV4X2xvY2soJnNkZV9jcnRjLT5jcnRjX2NwX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHJvcF9ub2RlLCAmc2RlX2NydGMtPmZlYXR1cmVfbGlzdCwgZmVhdHVyZV9saXN0KSB7CiAJCWlmIChwcm9wZXJ0eS0+YmFzZS5pZCA9PSBwcm9wX25vZGUtPnByb3BlcnR5X2lkKSB7CiAJCQlmb3VuZCA9IDE7CkBAIC05MDIsNyArMTAxMSw4IEBACiAJfQogCiAJaWYgKCFmb3VuZCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gZXhpdDsKKwogCS8qKgogCSAqIHNkZV9jcnRjIGlzIHZpcnR1YWwgZW5zdXJlIHRoYXQgaGFyZHdhcmUgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlCiAJICogY3J0Yy4gQ2hlY2sgTE0gYW5kIGRzcHAgY291bnRzIGJhc2VkIG9uIHdoZXRoZXIgZmVhdHVyZSBpcyBhCkBAIC05MTIsNyArMTAyMiw4IEBACiAJICAgIHNkZV9jcnRjLT5udW1fbWl4ZXJzID4gQVJSQVlfU0laRShzZGVfY3J0Yy0+bWl4ZXJzKSkgewogCQlEUk1fRVJST1IoIkludmFsaWQgbWl4ZXIgY29uZmlnIGFjdCBjbnQgJWQgbWF4IGNudCAlbGRcbiIsCiAJCQlzZGVfY3J0Yy0+bnVtX21peGVycywgQVJSQVlfU0laRShzZGVfY3J0Yy0+bWl4ZXJzKSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CiAJfQogCiAJZHNwcF9jbnQgPSAwOwpAQCAtOTI3LDE3ICsxMDM4LDE5IEBACiAJaWYgKHByb3Bfbm9kZS0+aXNfZHNwcF9mZWF0dXJlICYmIGRzcHBfY250IDwgc2RlX2NydGMtPm51bV9taXhlcnMpIHsKIAkJRFJNX0VSUk9SKCJpbnZhbGlkIGRzcHAgY250ICVkIG1peGVyIGNudCAlZFxuIiwgZHNwcF9jbnQsCiAJCQlzZGVfY3J0Yy0+bnVtX21peGVycyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIGlmIChsbV9jbnQgPCBzZGVfY3J0Yy0+bnVtX21peGVycykgewogCQlEUk1fRVJST1IoImludmFsaWQgbG0gY250ICVkIG1peGVyIGNudCAlZFxuIiwgbG1fY250LAogCQkJc2RlX2NydGMtPm51bV9taXhlcnMpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBleGl0OwogCX0KIAogCXJldCA9IHNkZV9jcF9hZF92YWxpZGF0ZV9wcm9wKHByb3Bfbm9kZSwgc2RlX2NydGMpOwogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJhZCBwcm9wZXJ0eSB2YWxpZGF0aW9uIGZhaWxlZCByZXQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAkvKiByZW1vdmUgdGhlIHByb3BlcnR5IGZyb20gZGlydHkgbGlzdCAqLwpAQCAtOTU1LDYgKzEwNjgsOCBAQAogCQkvKiBNYXJrIHRoZSBmZWF0dXJlIGFzIGRpcnR5ICovCiAJCXNkZV9jcF91cGRhdGVfbGlzdChwcm9wX25vZGUsIHNkZV9jcnRjLCB0cnVlKTsKIAl9CitleGl0OgorCW11dGV4X3VubG9jaygmc2RlX2NydGMtPmNydGNfY3BfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTc3LDEyICsxMDkyLDE0IEBACiAJfQogCS8qIFJldHVybiAwIGlmIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgKi8KIAkqdmFsID0gMDsKKwltdXRleF9sb2NrKCZzZGVfY3J0Yy0+Y3J0Y19jcF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3Bfbm9kZSwgJnNkZV9jcnRjLT5mZWF0dXJlX2xpc3QsIGZlYXR1cmVfbGlzdCkgewogCQlpZiAocHJvcGVydHktPmJhc2UuaWQgPT0gcHJvcF9ub2RlLT5wcm9wZXJ0eV9pZCkgewogCQkJKnZhbCA9IHByb3Bfbm9kZS0+cHJvcF92YWw7CiAJCQlicmVhazsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJnNkZV9jcnRjLT5jcnRjX2NwX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xMDE1LDYgKzExMzIsMTAgQEAKIAkJa2ZyZWUocHJvcF9ub2RlKTsKIAl9CiAKKwlpZiAoc2RlX2NydGMtPmhpc3RfYmxvYikKKwkJZHJtX3Byb3BlcnR5X3VucmVmZXJlbmNlX2Jsb2Ioc2RlX2NydGMtPmhpc3RfYmxvYik7CisKKwltdXRleF9kZXN0cm95KCZzZGVfY3J0Yy0+Y3J0Y19jcF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmc2RlX2NydGMtPmFjdGl2ZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmc2RlX2NydGMtPmRpcnR5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZzZGVfY3J0Yy0+ZmVhdHVyZV9saXN0KTsKQEAgLTEwMzUsNiArMTE1Niw3IEBACiAJCXJldHVybjsKIAl9CiAKKwltdXRleF9sb2NrKCZzZGVfY3J0Yy0+Y3J0Y19jcF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHJvcF9ub2RlLCBuLCAmc2RlX2NydGMtPmFjdGl2ZV9saXN0LAogCQkJCSBhY3RpdmVfbGlzdCkgewogCQlzZGVfY3BfdXBkYXRlX2xpc3QocHJvcF9ub2RlLCBzZGVfY3J0YywgdHJ1ZSk7CkBAIC0xMDQ2LDYgKzExNjgsNyBAQAogCQlzZGVfY3BfdXBkYXRlX2xpc3QocHJvcF9ub2RlLCBzZGVfY3J0YywgdHJ1ZSk7CiAJCWxpc3RfZGVsX2luaXQoJnByb3Bfbm9kZS0+YWN0aXZlX2xpc3QpOwogCX0KKwltdXRleF91bmxvY2soJnNkZV9jcnRjLT5jcnRjX2NwX2xvY2spOwogfQogCiB2b2lkIHNkZV9jcF9jcnRjX3Jlc3VtZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0xMjczLDYgKzEzOTYsMzAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRzcHBfaGlzdF9pbnN0YWxsX3Byb3BlcnR5KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3Qgc2RlX2ttcyAqa21zID0gTlVMTDsKKwlzdHJ1Y3Qgc2RlX21kc3NfY2ZnICpjYXRhbG9nID0gTlVMTDsKKwl1MzIgdmVyc2lvbjsKKworCWttcyA9IGdldF9rbXMoY3J0Yyk7CisJY2F0YWxvZyA9IGttcy0+Y2F0YWxvZzsKKworCXZlcnNpb24gPSBjYXRhbG9nLT5kc3BwWzBdLnNibGstPmhpc3QudmVyc2lvbiA+PiAxNjsKKwlzd2l0Y2ggKHZlcnNpb24pIHsKKwljYXNlIDE6CisJCXNkZV9jcF9jcnRjX2luc3RhbGxfZW51bV9wcm9wZXJ0eShjcnRjLAorCQkJU0RFX0NQX0NSVENfRFNQUF9ISVNUX0NUUkwsIHNkZV9oaXN0X21vZGVzLAorCQkJQVJSQVlfU0laRShzZGVfaGlzdF9tb2RlcyksICJTREVfRFNQUF9ISVNUX0NUUkxfVjEiKTsKKwkJc2RlX2NwX2NydGNfaW5zdGFsbF9yYW5nZV9wcm9wZXJ0eShjcnRjLCAiU0RFX0RTUFBfSElTVF9JUlFfVjEiLAorCQkJU0RFX0NQX0NSVENfRFNQUF9ISVNUX0lSUSwgMCwgVTE2X01BWCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigidmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkXG4iLCB2ZXJzaW9uKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzZGVfY3BfdXBkYXRlX2xpc3Qoc3RydWN0IHNkZV9jcF9ub2RlICpwcm9wX25vZGUsCiAJCXN0cnVjdCBzZGVfY3J0YyAqY3J0YywgYm9vbCBkaXJ0eV9saXN0KQogewpAQCAtMTM5NCw2ICsxNTQxLDcgQEAKIAlpbnQgaTsKIAlpbnQgaXJxX2lkeCwgcmV0OwogCXN0cnVjdCBzZGVfY3Bfbm9kZSBwcm9wX25vZGU7CisJc3RydWN0IHNkZV9jcnRjX2lycV9pbmZvICpub2RlID0gTlVMTDsKIAogCWlmICghY3J0Y19kcm0gfHwgIWFkX2lycSkgewogCQlEUk1fRVJST1IoImludmFsaWQgY3J0YyAlcEsgaXJxICVwS1xuIiwgY3J0Y19kcm0sIGFkX2lycSk7CkBAIC0xNDM4LDE0ICsxNTg2LDI4IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwlub2RlID0gX3NkZV9jcF9nZXRfaW50cl9ub2RlKERSTV9FVkVOVF9BRF9CQUNLTElHSFQsIGNydGMpOworCiAJaWYgKCFlbikgewotCQlzZGVfY29yZV9pcnFfZGlzYWJsZShrbXMsICZpcnFfaWR4LCAxKTsKKwkJaWYgKG5vZGUpIHsKKwkJCWlmIChub2RlLT5zdGF0ZSA9PSBJUlFfRU5BQkxFRCkgeworCQkJCXJldCA9IHNkZV9jb3JlX2lycV9kaXNhYmxlKGttcywgJmlycV9pZHgsIDEpOworCQkJCWlmIChyZXQpCisJCQkJCURSTV9FUlJPUigiZGlzYWJsZSBpcnEgJWQgZXJyb3IgJWRcbiIsCisJCQkJCQlpcnFfaWR4LCByZXQpOworCQkJCWVsc2UKKwkJCQkJbm9kZS0+c3RhdGUgPSBJUlFfTk9JTklUOworCQkJfSBlbHNlIHsKKwkJCQlub2RlLT5zdGF0ZSA9IElSUV9OT0lOSVQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgbm9kZSBmcm9tIGNydGMgZXZlbnQgbGlzdFxuIik7CisJCX0KIAkJc2RlX2NvcmVfaXJxX3VucmVnaXN0ZXJfY2FsbGJhY2soa21zLCBpcnFfaWR4LCBhZF9pcnEpOwogCQlyZXQgPSAwOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJmFkX2lycS0+bGlzdCk7CiAJYWRfaXJxLT5hcmcgPSBjcnRjOwogCWFkX2lycS0+ZnVuYyA9IHNkZV9jcF9hZF9pbnRlcnJ1cHRfY2I7CiAJcmV0ID0gc2RlX2NvcmVfaXJxX3JlZ2lzdGVyX2NhbGxiYWNrKGttcywgaXJxX2lkeCwgYWRfaXJxKTsKQEAgLTE0NTMsMTAgKzE2MTUsMzAgQEAKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIHJldCAlZFxuIiwgcmV0KTsKIAkJZ290byBleGl0OwogCX0KLQlyZXQgPSBzZGVfY29yZV9pcnFfZW5hYmxlKGttcywgJmlycV9pZHgsIDEpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZW5hYmxlIGlycSByZXQgJWRcbiIsIHJldCk7Ci0JCXNkZV9jb3JlX2lycV91bnJlZ2lzdGVyX2NhbGxiYWNrKGttcywgaXJxX2lkeCwgYWRfaXJxKTsKKworCWlmIChub2RlKSB7CisJCS8qIGRldmljZSByZXN1bWUgb3IgcmVzdW1lIGZyb20gSVBDIGNhc2VzICovCisJCWlmIChub2RlLT5zdGF0ZSA9PSBJUlFfRElTQUJMRUQgfHwgbm9kZS0+c3RhdGUgPT0gSVJRX05PSU5JVCkgeworCQkJcmV0ID0gc2RlX2NvcmVfaXJxX2VuYWJsZShrbXMsICZpcnFfaWR4LCAxKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlEUk1fRVJST1IoImVuYWJsZSBpcnEgJWQgZXJyb3IgJWRcbiIsCisJCQkJCWlycV9pZHgsIHJldCk7CisJCQkJc2RlX2NvcmVfaXJxX3VucmVnaXN0ZXJfY2FsbGJhY2soa21zLAorCQkJCQlpcnFfaWR4LCBhZF9pcnEpOworCQkJfSBlbHNlIHsKKwkJCQlub2RlLT5zdGF0ZSA9IElSUV9FTkFCTEVEOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogcmVxdWVzdCBmcm9tIHVzZXJzcGFjZSB0byByZWdpc3RlciB0aGUgZXZlbnQKKwkJICogaW4gdGhpcyBjYXNlLCBub2RlIGhhcyBub3QgYmVlbiBhZGRlZCBpbnRvIHRoZSBldmVudCBsaXN0CisJCSAqLworCQlyZXQgPSBzZGVfY29yZV9pcnFfZW5hYmxlKGttcywgJmlycV9pZHgsIDEpOworCQlpZiAocmV0KSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgaXJxIHJldCAlZFxuIiwgcmV0KTsKKwkJCXNkZV9jb3JlX2lycV91bnJlZ2lzdGVyX2NhbGxiYWNrKGttcywKKwkJCQlpcnFfaWR4LCBhZF9pcnEpOworCQl9CiAJfQogZXhpdDoKIAlyZXR1cm4gcmV0OwpAQCAtMTUxOSwzICsxNzAxLDIwMSBAQAogCiAJc2RlX2NwX2FkX3NldF9wcm9wKHNkZV9jcnRjLCBBRF9JUENfUkVTVU1FKTsKIH0KKworc3RhdGljIHZvaWQgc2RlX2NwX2hpc3RfaW50ZXJydXB0X2NiKHZvaWQgKmFyZywgaW50IGlycV9pZHgpCit7CisJc3RydWN0IHNkZV9jcnRjICpjcnRjID0gYXJnOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0gPSAmY3J0Yy0+YmFzZTsKKwlzdHJ1Y3Qgc2RlX2h3X2RzcHAgKmh3X2RzcHA7CisJc3RydWN0IHNkZV9rbXMgKmttczsKKwlzdHJ1Y3Qgc2RlX2NydGNfaXJxX2luZm8gKm5vZGUgPSBOVUxMOworCXUzMiBpOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBkaXNhYmxlIGhpc3RvZ3JhbSBpcnEgKi8KKwlrbXMgPSBnZXRfa21zKGNydGNfZHJtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3J0Yy0+c3Bpbl9sb2NrLCBmbGFncyk7CisJbm9kZSA9IF9zZGVfY3BfZ2V0X2ludHJfbm9kZShEUk1fRVZFTlRfSElTVE9HUkFNLCBjcnRjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcnRjLT5zcGluX2xvY2ssIGZsYWdzKTsKKworCWlmICghbm9kZSkgeworCQlEUk1fRVJST1IoImNhbm5vdCBmaW5kIGhpc3RvZ3JhbSBldmVudCBub2RlIGluIGNydGNcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5vZGUtPnN0YXRlID09IElSUV9FTkFCTEVEKSB7CisJCWlmIChzZGVfY29yZV9pcnFfZGlzYWJsZV9ub2xvY2soa21zLCBpcnFfaWR4KSkgeworCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZGlzYWJsZSBpcnEgJWQsIHJldCAlZFxuIiwKKwkJCQlpcnFfaWR4LCByZXQpOworCQkJcmV0dXJuOworCQl9CisJCW5vZGUtPnN0YXRlID0gSVJRX0RJU0FCTEVEOworCX0KKworCS8qIGxvY2sgaGlzdG9ncmFtIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCBjcnRjLT5udW1fbWl4ZXJzOyBpKyspIHsKKwkJaHdfZHNwcCA9IGNydGMtPm1peGVyc1tpXS5od19kc3BwOworCQlpZiAoaHdfZHNwcCAmJiBod19kc3BwLT5vcHMubG9ja19oaXN0b2dyYW0pCisJCQlod19kc3BwLT5vcHMubG9ja19oaXN0b2dyYW0oaHdfZHNwcCwgTlVMTCk7CisJfQorCisJLyogbm90aWZ5IGhpc3RvZ3JhbSBldmVudCAqLworCXNkZV9jcnRjX2V2ZW50X3F1ZXVlKGNydGNfZHJtLCBzZGVfY3Bfbm90aWZ5X2hpc3RfZXZlbnQsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBzZGVfY3Bfbm90aWZ5X2hpc3RfZXZlbnQoc3RydWN0IGRybV9jcnRjICpjcnRjX2RybSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBzZGVfaHdfZHNwcCAqaHdfZHNwcCA9IE5VTEw7CisJc3RydWN0IHNkZV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZXZlbnQgZXZlbnQ7CisJc3RydWN0IGRybV9tc21faGlzdCAqaGlzdF9kYXRhOworCXN0cnVjdCBkcm1fbXNtX2hpc3QgdG1wX2hpc3RfZGF0YTsKKwl1MzIgaSwgajsKKworCWlmICghY3J0Y19kcm0pIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGNydGMgJXBLXG4iLCBjcnRjX2RybSk7CisJCXJldHVybjsKKwl9CisKKwljcnRjID0gdG9fc2RlX2NydGMoY3J0Y19kcm0pOworCWlmICghY3J0YykgeworCQlEUk1fRVJST1IoImludmFsaWQgc2RlX2NydGMgJXBLXG4iLCBjcnRjKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghY3J0Yy0+aGlzdF9ibG9iKQorCQlyZXR1cm47CisKKwkvKiByZWFkIGhpc3RvZ3JhbSBkYXRhIGludG8gYmxvYiAqLworCWhpc3RfZGF0YSA9IChzdHJ1Y3QgZHJtX21zbV9oaXN0ICopY3J0Yy0+aGlzdF9ibG9iLT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCBjcnRjLT5udW1fbWl4ZXJzOyBpKyspIHsKKwkJaHdfZHNwcCA9IGNydGMtPm1peGVyc1tpXS5od19kc3BwOworCQlpZiAoIWh3X2RzcHAgfHwgIWh3X2RzcHAtPm9wcy5yZWFkX2hpc3RvZ3JhbSkgeworCQkJRFJNX0VSUk9SKCJpbnZhbGlkIGRzcHAgJXBLIG9yIHJlYWRfaGlzdG9ncmFtIGZ1bmNcbiIsCisJCQkJaHdfZHNwcCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCFpKSB7CisJCQlod19kc3BwLT5vcHMucmVhZF9oaXN0b2dyYW0oaHdfZHNwcCwgaGlzdF9kYXRhKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1lcmdlIGhpc3QgZGF0YSBmb3IgRFNQUDAgYW5kIERTUFAxICovCisJCQlod19kc3BwLT5vcHMucmVhZF9oaXN0b2dyYW0oaHdfZHNwcCwgJnRtcF9oaXN0X2RhdGEpOworCQkJZm9yIChqID0gMDsgaiA8IEhJU1RfVl9TSVpFOyBqKyspCisJCQkJaGlzdF9kYXRhLT5kYXRhW2pdICs9IHRtcF9oaXN0X2RhdGEuZGF0YVtqXTsKKwkJfQorCX0KKworCS8qIHNlbmQgaGlzdG9ncmFtIGV2ZW50IHdpdGggYmxvYiBpZCAqLworCWV2ZW50Lmxlbmd0aCA9IHNpemVvZih1MzIpOworCWV2ZW50LnR5cGUgPSBEUk1fRVZFTlRfSElTVE9HUkFNOworCW1zbV9tb2RlX29iamVjdF9ldmVudF9ub3RpZnkoJmNydGNfZHJtLT5iYXNlLCBjcnRjX2RybS0+ZGV2LAorCQkJJmV2ZW50LCAodTggKikoJmNydGMtPmhpc3RfYmxvYi0+YmFzZS5pZCkpOworfQorCitpbnQgc2RlX2NwX2hpc3RfaW50ZXJydXB0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sIGJvb2wgZW4sCisJc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKmhpc3RfaXJxKQoreworCXN0cnVjdCBzZGVfa21zICprbXMgPSBOVUxMOworCXUzMiBudW1fbWl4ZXJzOworCXN0cnVjdCBzZGVfaHdfbWl4ZXIgKmh3X2xtOworCXN0cnVjdCBzZGVfaHdfZHNwcCAqaHdfZHNwcCA9IE5VTEw7CisJc3RydWN0IHNkZV9jcnRjICpjcnRjOworCXN0cnVjdCBzZGVfY3J0Y19pcnFfaW5mbyAqbm9kZSA9IE5VTEw7CisJaW50IGksIGlycV9pZHgsIHJldCA9IDA7CisKKwlpZiAoIWNydGNfZHJtIHx8ICFoaXN0X2lycSkgeworCQlEUk1fRVJST1IoImludmFsaWQgY3J0YyAlcEsgaXJxICVwS1xuIiwgY3J0Y19kcm0sIGhpc3RfaXJxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3J0YyA9IHRvX3NkZV9jcnRjKGNydGNfZHJtKTsKKwlpZiAoIWNydGMpIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHNkZV9jcnRjICVwS1xuIiwgY3J0Yyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWttcyA9IGdldF9rbXMoY3J0Y19kcm0pOworCW51bV9taXhlcnMgPSBjcnRjLT5udW1fbWl4ZXJzOworCisJZm9yIChpID0gMDsgaSA8IG51bV9taXhlcnM7IGkrKykgeworCQlod19sbSA9IGNydGMtPm1peGVyc1tpXS5od19sbTsKKwkJaHdfZHNwcCA9IGNydGMtPm1peGVyc1tpXS5od19kc3BwOworCQlpZiAoIWh3X2xtLT5jZmcucmlnaHRfbWl4ZXIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWh3X2RzcHApIHsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIGRzcHBcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaXJxX2lkeCA9IHNkZV9jb3JlX2lycV9pZHhfbG9va3VwKGttcywgU0RFX0lSUV9UWVBFX0hJU1RfRFNQUF9ET05FLAorCQkJaHdfZHNwcC0+aWR4KTsKKwlpZiAoaXJxX2lkeCA8IDApIHsKKwkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IHRoZSBpcnEgaWR4IHJldCAlZFxuIiwgaXJxX2lkeCk7CisJCXJldCA9IGlycV9pZHg7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlub2RlID0gX3NkZV9jcF9nZXRfaW50cl9ub2RlKERSTV9FVkVOVF9ISVNUT0dSQU0sIGNydGMpOworCisJLyogZGVyZWdpc3RlciBoaXN0b2dyYW0gaXJxICovCisJaWYgKCFlbikgeworCQlpZiAobm9kZSkgeworCQkJLyogZGV2aWNlIHN1c3BlbmQgY2FzZSBvciBzdXNwZW5kIHRvIElQQyBjYXNlcyAqLworCQkJaWYgKG5vZGUtPnN0YXRlID09IElSUV9FTkFCTEVEKSB7CisJCQkJcmV0ID0gc2RlX2NvcmVfaXJxX2Rpc2FibGUoa21zLCAmaXJxX2lkeCwgMSk7CisJCQkJaWYgKHJldCkKKwkJCQkJRFJNX0VSUk9SKCJkaXNhYmxlIGlycSAlZCBlcnJvciAlZFxuIiwKKwkJCQkJCWlycV9pZHgsIHJldCk7CisJCQkJZWxzZQorCQkJCQlub2RlLT5zdGF0ZSA9IElSUV9OT0lOSVQ7CisJCQl9IGVsc2UgeworCQkJCW5vZGUtPnN0YXRlID0gSVJRX05PSU5JVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCBub2RlIGZyb20gY3J0YyBldmVudCBsaXN0XG4iKTsKKwkJfQorCisJCXNkZV9jb3JlX2lycV91bnJlZ2lzdGVyX2NhbGxiYWNrKGttcywgaXJxX2lkeCwgaGlzdF9pcnEpOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogcmVnaXN0ZXIgaGlzdG9ncmFtIGlycSAqLworCWhpc3RfaXJxLT5hcmcgPSBjcnRjOworCWhpc3RfaXJxLT5mdW5jID0gc2RlX2NwX2hpc3RfaW50ZXJydXB0X2NiOworCXJldCA9IHNkZV9jb3JlX2lycV9yZWdpc3Rlcl9jYWxsYmFjayhrbXMsIGlycV9pZHgsIGhpc3RfaXJxKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBjYWxsYmFjayByZXQgJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAobm9kZSkgeworCQkvKiBkZXZpY2UgcmVzdW1lIG9yIHJlc3VtZSBmcm9tIElQQyBjYXNlcyAqLworCQlpZiAobm9kZS0+c3RhdGUgPT0gSVJRX0RJU0FCTEVEIHx8IG5vZGUtPnN0YXRlID09IElSUV9OT0lOSVQpIHsKKwkJCXJldCA9IHNkZV9jb3JlX2lycV9lbmFibGUoa21zLCAmaXJxX2lkeCwgMSk7CisJCQlpZiAocmV0KSB7CisJCQkJRFJNX0VSUk9SKCJlbmFibGUgaXJxICVkIGVycm9yICVkXG4iLAorCQkJCQlpcnFfaWR4LCByZXQpOworCQkJCXNkZV9jb3JlX2lycV91bnJlZ2lzdGVyX2NhbGxiYWNrKGttcywKKwkJCQkJaXJxX2lkeCwgaGlzdF9pcnEpOworCQkJfSBlbHNlIHsKKwkJCQlub2RlLT5zdGF0ZSA9IElSUV9FTkFCTEVEOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogcmVxdWVzdCBmcm9tIHVzZXJzcGFjZSB0byByZWdpc3RlciB0aGUgZXZlbnQKKwkJICogaW4gdGhpcyBjYXNlLCBub2RlIGhhcyBub3QgYmVlbiBhZGRlZCBpbnRvIHRoZSBldmVudCBsaXN0CisJCSAqLworCQlyZXQgPSBzZGVfY29yZV9pcnFfZW5hYmxlKGttcywgJmlycV9pZHgsIDEpOworCQlpZiAocmV0KSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgaXJxIHJldCAlZFxuIiwgcmV0KTsKKwkJCXNkZV9jb3JlX2lycV91bnJlZ2lzdGVyX2NhbGxiYWNrKGttcywKKwkJCQlpcnFfaWR4LCBoaXN0X2lycSk7CisJCX0KKwl9CitleGl0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29sb3JfcHJvY2Vzc2luZy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NvbG9yX3Byb2Nlc3NpbmcuaAppbmRleCAwOGUzNDVkLi5hZmYwN2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29sb3JfcHJvY2Vzc2luZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb2xvcl9wcm9jZXNzaW5nLmgKQEAgLTI5LDYgKzI5LDI1IEBACiAJTUVNQ09MT1JfRk9MSUFHRQogfTsKIAorLyoKKyAqIFBBIEhJU1RPR1JBTSBtb2RlcworICogQEhJU1RfRElTQUJMRUQgICAgICAgICAgSGlzdG9ncmFtIGRpc2FibGVkCisgKiBASElTVF9FTkFCTEVEICAgICAgICAgICBIaXN0b2dyYW0gZW5hYmxlZAorICovCitlbnVtIHNkZV9oaXN0X21vZGVzIHsKKwlISVNUX0RJU0FCTEVELAorCUhJU1RfRU5BQkxFRAorfTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IC0gZHJtIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgZW51bSBwcm9wZXJ0eSBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGluZyB2YWx1ZXMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcHJvcF9lbnVtX2xpc3Qgc2RlX2hpc3RfbW9kZXNbXSA9IHsKKwl7SElTVF9ESVNBQkxFRCwgImhpc3Rfb2ZmIn0sCisJe0hJU1RfRU5BQkxFRCwgImhpc3Rfb24ifSwKK307CisKIC8qKgogICogc2RlX2NwX2NydGNfaW5pdCgpOiBJbml0aWFsaXplIGNvbG9yIHByb2Nlc3NpbmcgbGlzdHMgZm9yIGEgY3J0Yy4KICAqICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgY3J0YyBpbml0aWFsaXphdGlvbi4KQEAgLTExNyw0ICsxMzYsMTMgQEAKICAqIEBjcnRjOiBQb2ludGVyIHRvIGNydGMuCiAgKi8KIHZvaWQgc2RlX2NwX2NydGNfcG9zdF9pcGMoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKKworLyoqCisgKiBzZGVfY3BfaGlzdF9pbnRlcnJ1cHQ6IEFwaSB0byBlbmFibGUvZGlzYWJsZSBoaXN0b2dyYW0gaW50ZXJydXB0CisgKiBAY3J0YzogUG9pbnRlciB0byBjcnRjLgorICogQGVuOiBWYXJpYWJsZSB0byBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHQuCisgKiBAaXJxOiBQb2ludGVyIHRvIGlycSBjYWxsYmFjaworICovCitpbnQgc2RlX2NwX2hpc3RfaW50ZXJydXB0KHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sIGJvb2wgZW4sCisJc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKmhpc3RfaXJxKTsKICNlbmRpZiAvKl9TREVfQ09MT1JfUFJPQ0VTU0lOR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29ubmVjdG9yLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29ubmVjdG9yLmMKaW5kZXggOWQ3MDUyNS4uZDgzZjQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2Nvbm5lY3Rvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb25uZWN0b3IuYwpAQCAtMTIsMTIgKzEyLDE0IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkJIltkcm06JXM6JWRdICIgZm10LCBfX2Z1bmNfXywgX19MSU5FX18KICNpbmNsdWRlICJtc21fZHJ2LmgiCisjaW5jbHVkZSAic2RlX2RiZy5oIgogCiAjaW5jbHVkZSAic2RlX2ttcy5oIgogI2luY2x1ZGUgInNkZV9jb25uZWN0b3IuaCIKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlICJkc2lfZHJtLmgiCiAjaW5jbHVkZSAiZHNpX2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJzZGVfY3J0Yy5oIgogCiAjZGVmaW5lIEJMX05PREVfTkFNRV9TSVpFIDMyCiAKQEAgLTEwNyw3ICsxMDksNiBAQAogc3RhdGljIGludCBzZGVfYmFja2xpZ2h0X3NldHVwKHN0cnVjdCBzZGVfY29ubmVjdG9yICpjX2Nvbm4sCiAJCQkJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsX2RldmljZTsKIAlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CiAJc3RydWN0IGRzaV9kaXNwbGF5ICpkaXNwbGF5OwogCXN0cnVjdCBkc2lfYmFja2xpZ2h0X2NvbmZpZyAqYmxfY29uZmlnOwpAQCAtMTMxLDExICsxMzIsMTIgQEAKIAlwcm9wcy5icmlnaHRuZXNzID0gYmxfY29uZmlnLT5icmlnaHRuZXNzX21heF9sZXZlbDsKIAlzbnByaW50ZihibF9ub2RlX25hbWUsIEJMX05PREVfTkFNRV9TSVpFLCAicGFuZWwldS1iYWNrbGlnaHQiLAogCQkJCQkJCWRpc3BsYXlfY291bnQpOwotCWJsX2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoYmxfbm9kZV9uYW1lLCBkZXYtPmRldiwKKwljX2Nvbm4tPmJsX2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoYmxfbm9kZV9uYW1lLCBkZXYtPmRldiwKIAkJCWNfY29ubiwgJnNkZV9iYWNrbGlnaHRfZGV2aWNlX29wcywgJnByb3BzKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYmxfZGV2aWNlKSkgeworCWlmIChJU19FUlJfT1JfTlVMTChjX2Nvbm4tPmJsX2RldmljZSkpIHsKIAkJU0RFX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgYmFja2xpZ2h0OiAlbGRcbiIsCi0JCQkJICAgIFBUUl9FUlIoYmxfZGV2aWNlKSk7CisJCQkJICAgIFBUUl9FUlIoY19jb25uLT5ibF9kZXZpY2UpKTsKKwkJY19jb25uLT5ibF9kZXZpY2UgPSBOVUxMOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJZGlzcGxheV9jb3VudCsrOwpAQCAtMzY1LDYgKzM2NywyOSBAQAogCXJldHVybiBjX2Nvbm4tPm9wcy5nZXRfaW5mbyhpbmZvLCBjX2Nvbm4tPmRpc3BsYXkpOwogfQogCit2b2lkIHNkZV9jb25uZWN0b3Jfc2NoZWR1bGVfc3RhdHVzX3dvcmsoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJYm9vbCBlbikKK3sKKwlzdHJ1Y3Qgc2RlX2Nvbm5lY3RvciAqY19jb25uOworCXN0cnVjdCBtc21fZGlzcGxheV9pbmZvIGluZm87CisKKwljX2Nvbm4gPSB0b19zZGVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CisJaWYgKCFjX2Nvbm4pCisJCXJldHVybjsKKworCXNkZV9jb25uZWN0b3JfZ2V0X2luZm8oY29ubmVjdG9yLCAmaW5mbyk7CisJaWYgKGNfY29ubi0+b3BzLmNoZWNrX3N0YXR1cyAmJgorCQkoaW5mby5jYXBhYmlsaXRpZXMgJiBNU01fRElTUExBWV9FU0RfRU5BQkxFRCkpIHsKKwkJaWYgKGVuKQorCQkJLyogU2NoZWR1bGUgRVNEIHN0YXR1cyBjaGVjayAqLworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjX2Nvbm4tPnN0YXR1c193b3JrLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoU1RBVFVTX0NIRUNLX0lOVEVSVkFMX01TKSk7CisJCWVsc2UKKwkJCS8qIENhbmNlbCBhbnkgcGVuZGluZyBFU0Qgc3RhdHVzIGNoZWNrICovCisJCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNfY29ubi0+c3RhdHVzX3dvcmspOworCX0KK30KKwogc3RhdGljIGludCBfc2RlX2Nvbm5lY3Rvcl91cGRhdGVfcG93ZXJfbG9ja2VkKHN0cnVjdCBzZGVfY29ubmVjdG9yICpjX2Nvbm4pCiB7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKQEAgLTQxMCw2ICs0MzUsOSBAQAogCX0KIAljX2Nvbm4tPmxhc3RfcGFuZWxfcG93ZXJfbW9kZSA9IG1vZGU7CiAKKwlpZiAobW9kZSAhPSBTREVfTU9ERV9EUE1TX09OKQorCQlzZGVfY29ubmVjdG9yX3NjaGVkdWxlX3N0YXR1c193b3JrKGNvbm5lY3RvciwgZmFsc2UpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC00OTEsNiArNTE5LDkgQEAKIAogCWNfY29ubiA9IHRvX3NkZV9jb25uZWN0b3IoY29ubmVjdG9yKTsKIAorCS8qIGNhbmNlbCBpZiBhbnkgcGVuZGluZyBlc2Qgd29yayAqLworCXNkZV9jb25uZWN0b3Jfc2NoZWR1bGVfc3RhdHVzX3dvcmsoY29ubmVjdG9yLCBmYWxzZSk7CisKIAlpZiAoY19jb25uLT5vcHMucHV0X21vZGVzKQogCQljX2Nvbm4tPm9wcy5wdXRfbW9kZXMoY29ubmVjdG9yLCBjX2Nvbm4tPmRpc3BsYXkpOwogCkBAIC01MDIsNiArNTMzLDggQEAKIAkJZHJtX3Byb3BlcnR5X3VucmVmZXJlbmNlX2Jsb2IoY19jb25uLT5ibG9iX2RpdGhlcik7CiAJbXNtX3Byb3BlcnR5X2Rlc3Ryb3koJmNfY29ubi0+cHJvcGVydHlfaW5mbyk7CiAKKwlpZiAoY19jb25uLT5ibF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihjX2Nvbm4tPmJsX2RldmljZSk7CiAJZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGNvbm5lY3Rvcik7CiAJbXV0ZXhfZGVzdHJveSgmY19jb25uLT5sb2NrKTsKIAlzZGVfZmVuY2VfZGVpbml0KCZjX2Nvbm4tPnJldGlyZV9mZW5jZSk7CkBAIC01NTYsNiArNTg5LDggQEAKIAlpZiAoY19zdGF0ZS0+b3V0X2ZiKQogCQlfc2RlX2Nvbm5lY3Rvcl9kZXN0cm95X2ZiKGNfY29ubiwgY19zdGF0ZSk7CiAKKwlfX2RybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlKCZjX3N0YXRlLT5iYXNlKTsKKwogCWlmICghY19jb25uKSB7CiAJCWtmcmVlKGNfc3RhdGUpOwogCX0gZWxzZSB7CkBAIC01NzcsNiArNjEyLDEyIEBACiAKIAljX2Nvbm4gPSB0b19zZGVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAKKwlpZiAoY29ubmVjdG9yLT5zdGF0ZSAmJgorCQkJIXNkZV9jcnRjX2lzX3Jlc2V0X3JlcXVpcmVkKGNvbm5lY3Rvci0+c3RhdGUtPmNydGMpKSB7CisJCVNERV9ERUJVR19DT05OKGNfY29ubiwgImF2b2lkIHJlc2V0IGZvciBjb25uZWN0b3JcbiIpOworCQlyZXR1cm47CisJfQorCiAJaWYgKGNvbm5lY3Rvci0+c3RhdGUpIHsKIAkJc2RlX2Nvbm5lY3Rvcl9hdG9taWNfZGVzdHJveV9zdGF0ZShjb25uZWN0b3IsIGNvbm5lY3Rvci0+c3RhdGUpOwogCQljb25uZWN0b3ItPnN0YXRlID0gMDsKQEAgLTU5Myw4ICs2MzQsNyBAQAogCQkJJmNfc3RhdGUtPnByb3BlcnR5X3N0YXRlLAogCQkJY19zdGF0ZS0+cHJvcGVydHlfdmFsdWVzKTsKIAotCWNfc3RhdGUtPmJhc2UuY29ubmVjdG9yID0gY29ubmVjdG9yOwotCWNvbm5lY3Rvci0+c3RhdGUgPSAmY19zdGF0ZS0+YmFzZTsKKwlfX2RybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9yZXNldChjb25uZWN0b3IsICZjX3N0YXRlLT5iYXNlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICoKQEAgLTYyMSw2ICs2NjEsOSBAQAogCQkJY19vbGRzdGF0ZSwgY19zdGF0ZSwKIAkJCSZjX3N0YXRlLT5wcm9wZXJ0eV9zdGF0ZSwgY19zdGF0ZS0+cHJvcGVydHlfdmFsdWVzKTsKIAorCV9fZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZShjb25uZWN0b3IsCisJCQkmY19zdGF0ZS0+YmFzZSk7CisKIAkvKiBhZGRpdGlvbmFsIGhhbmRsaW5nIGZvciBkcm0gZnJhbWVidWZmZXIgb2JqZWN0cyAqLwogCWlmIChjX3N0YXRlLT5vdXRfZmIpCiAJCWRybV9mcmFtZWJ1ZmZlcl9yZWZlcmVuY2UoY19zdGF0ZS0+b3V0X2ZiKTsKQEAgLTEwNTMsNiArMTA5Niw3IEBACiBzdGF0aWMgaW50IHNkZV9jb25uZWN0b3JfaW5pdF9kZWJ1Z2ZzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCiB7CiAJc3RydWN0IHNkZV9jb25uZWN0b3IgKnNkZV9jb25uZWN0b3I7CisJc3RydWN0IG1zbV9kaXNwbGF5X2luZm8gaW5mbzsKIAogCWlmICghY29ubmVjdG9yIHx8ICFjb25uZWN0b3ItPmRlYnVnZnNfZW50cnkpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGNvbm5lY3RvclxuIik7CkBAIC0xMDYxLDYgKzExMDUsMTMgQEAKIAogCXNkZV9jb25uZWN0b3IgPSB0b19zZGVfY29ubmVjdG9yKGNvbm5lY3Rvcik7CiAKKwlzZGVfY29ubmVjdG9yX2dldF9pbmZvKGNvbm5lY3RvciwgJmluZm8pOworCWlmIChzZGVfY29ubmVjdG9yLT5vcHMuY2hlY2tfc3RhdHVzICYmCisJCShpbmZvLmNhcGFiaWxpdGllcyAmIE1TTV9ESVNQTEFZX0VTRF9FTkFCTEVEKSkKKwkJZGVidWdmc19jcmVhdGVfdTMyKCJmb3JjZV9wYW5lbF9kZWFkIiwgMDYwMCwKKwkJCQljb25uZWN0b3ItPmRlYnVnZnNfZW50cnksCisJCQkJJnNkZV9jb25uZWN0b3ItPmZvcmNlX3BhbmVsX2RlYWQpOworCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJmYl9rbWFwIiwgMDYwMCwgY29ubmVjdG9yLT5kZWJ1Z2ZzX2VudHJ5LAogCQkJJnNkZV9jb25uZWN0b3ItPmZiX2ttYXApKSB7CiAJCVNERV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBjb25uZWN0b3IgZmJfa21hcFxuIik7CkBAIC0xMTU3LDYgKzEyMDgsNTYgQEAKIAlyZXR1cm4gY19jb25uLT5lbmNvZGVyOwogfQogCitzdGF0aWMgdm9pZCBzZGVfY29ubmVjdG9yX2NoZWNrX3N0YXR1c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2RlX2Nvbm5lY3RvciAqY29ubjsKKwlzdHJ1Y3QgZHJtX2V2ZW50IGV2ZW50OworCWludCByYyA9IDA7CisJYm9vbCBwYW5lbF9kZWFkID0gZmFsc2U7CisKKwljb25uID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwKKwkJCXN0cnVjdCBzZGVfY29ubmVjdG9yLCBzdGF0dXNfd29yayk7CisJaWYgKCFjb25uKSB7CisJCVNERV9FUlJPUigibm90IGFibGUgdG8gZ2V0IGNvbm5lY3RvciBvYmplY3RcbiIpOworCQlyZXR1cm47CisJfQorCisJbXV0ZXhfbG9jaygmY29ubi0+bG9jayk7CisJaWYgKCFjb25uLT5vcHMuY2hlY2tfc3RhdHVzIHx8CisJCQkoY29ubi0+ZHBtc19tb2RlICE9IERSTV9NT0RFX0RQTVNfT04pKSB7CisJCVNERV9ERUJVRygiZHBtcyBtb2RlOiAlZFxuIiwgY29ubi0+ZHBtc19tb2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb25uLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXJjID0gY29ubi0+b3BzLmNoZWNrX3N0YXR1cyhjb25uLT5kaXNwbGF5KTsKKwltdXRleF91bmxvY2soJmNvbm4tPmxvY2spOworCisJaWYgKGNvbm4tPmZvcmNlX3BhbmVsX2RlYWQpIHsKKwkJY29ubi0+Zm9yY2VfcGFuZWxfZGVhZC0tOworCQlpZiAoIWNvbm4tPmZvcmNlX3BhbmVsX2RlYWQpCisJCQlnb3RvIHN0YXR1c19kZWFkOworCX0KKworCWlmIChyYyA+IDApIHsKKwkJU0RFX0RFQlVHKCJlc2QgY2hlY2sgc3RhdHVzIHN1Y2Nlc3MgY29ubl9pZDogJWQgZW5jX2lkOiAlZFxuIiwKKwkJCQljb25uLT5iYXNlLmJhc2UuaWQsIGNvbm4tPmVuY29kZXItPmJhc2UuaWQpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvbm4tPnN0YXR1c193b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhTVEFUVVNfQ0hFQ0tfSU5URVJWQUxfTVMpKTsKKwkJcmV0dXJuOworCX0KKworc3RhdHVzX2RlYWQ6CisJU0RFX0VWVDMyKHJjLCBTREVfRVZUTE9HX0VSUk9SKTsKKwlTREVfRVJST1IoImVzZCBjaGVjayBmYWlsZWQgcmVwb3J0IFBBTkVMX0RFQUQgY29ubl9pZDogJWQgZW5jX2lkOiAlZFxuIiwKKwkJCWNvbm4tPmJhc2UuYmFzZS5pZCwgY29ubi0+ZW5jb2Rlci0+YmFzZS5pZCk7CisJcGFuZWxfZGVhZCA9IHRydWU7CisJZXZlbnQudHlwZSA9IERSTV9FVkVOVF9QQU5FTF9ERUFEOworCWV2ZW50Lmxlbmd0aCA9IHNpemVvZih1MzIpOworCW1zbV9tb2RlX29iamVjdF9ldmVudF9ub3RpZnkoJmNvbm4tPmJhc2UuYmFzZSwKKwkJY29ubi0+YmFzZS5kZXYsICZldmVudCwgKHU4ICopJnBhbmVsX2RlYWQpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzIHNkZV9jb25uZWN0b3JfaGVscGVyX29wcyA9IHsKIAkuZ2V0X21vZGVzID0gICAgc2RlX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCiAJLm1vZGVfdmFsaWQgPSAgIHNkZV9jb25uZWN0b3JfbW9kZV92YWxpZCwKQEAgLTExOTcsNiArMTI5OCw4IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAorCW1lbXNldCgmZGlzcGxheV9pbmZvLCAwLCBzaXplb2YoZGlzcGxheV9pbmZvKSk7CisKIAlyYyA9IGRybV9jb25uZWN0b3JfaW5pdChkZXYsCiAJCQkmY19jb25uLT5iYXNlLAogCQkJJnNkZV9jb25uZWN0b3Jfb3BzLApAQCAtMTM2Myw2ICsxNDY2LDkgQEAKIAogCXByaXYtPmNvbm5lY3RvcnNbcHJpdi0+bnVtX2Nvbm5lY3RvcnMrK10gPSAmY19jb25uLT5iYXNlOwogCisJSU5JVF9ERUxBWUVEX1dPUksoJmNfY29ubi0+c3RhdHVzX3dvcmssCisJCQlzZGVfY29ubmVjdG9yX2NoZWNrX3N0YXR1c193b3JrKTsKKwogCXJldHVybiAmY19jb25uLT5iYXNlOwogCiBlcnJvcl9kZXN0cm95X3Byb3BlcnR5OgpAQCAtMTM5NCw2ICsxNTAwLDkgQEAKIAljYXNlIERSTV9FVkVOVF9TWVNfQkFDS0xJR0hUOgogCQlyZXQgPSAwOwogCQlicmVhazsKKwljYXNlIERSTV9FVkVOVF9QQU5FTF9ERUFEOgorCQlyZXQgPSAwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29ubmVjdG9yLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29ubmVjdG9yLmgKaW5kZXggYjQ0YmZhZS4uNDAxODQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2Nvbm5lY3Rvci5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb25uZWN0b3IuaApAQCAtMTk5LDYgKzE5OSwyNiBAQAogCSAqIFJldHVybnM6IGRzdF9mb3JtYXQgb2YgZGlzcGxheQogCSAqLwogCWVudW0gZHNpX3BpeGVsX2Zvcm1hdCAoKmdldF9kc3RfZm9ybWF0KSh2b2lkICpkaXNwbGF5KTsKKworCS8qKgorCSAqIHBvc3Rfa2lja29mZiAtIGRpc3BsYXkgdG8gcHJvZ3JhbSBwb3N0IGtpY2tvZmYtdGltZSBmZWF0dXJlcworCSAqIEBjb25uZWN0b3I6IFBvaW50ZXIgdG8gZHJtIGNvbm5lY3RvciBzdHJ1Y3R1cmUKKwkgKiBSZXR1cm5zOiBaZXJvIG9uIHN1Y2Nlc3MKKwkgKi8KKwlpbnQgKCpwb3N0X2tpY2tvZmYpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOworCisJLyoqCisJICogc2VuZF9ocGRfZXZlbnQgLSBzZW5kIEhQRCB1ZXZlbnQgbm90aWZpY2F0aW9uIHRvIHVzZXJzcGFjZQorCSAqIEBkaXNwbGF5OiBQb2ludGVyIHRvIHByaXZhdGUgZGlzcGxheSBzdHJ1Y3R1cmUKKwkgKi8KKwl2b2lkICgqc2VuZF9ocGRfZXZlbnQpKHZvaWQgKmRpc3BsYXkpOworCisJLyoqCisJICogY2hlY2tfc3RhdHVzIC0gY2hlY2sgc3RhdHVzIG9mIGNvbm5lY3RlZCBkaXNwbGF5IHBhbmVsCisJICogQGRpc3BsYXk6IFBvaW50ZXIgdG8gcHJpdmF0ZSBkaXNwbGF5IGhhbmRsZQorCSAqIFJldHVybnM6IHBvc2l0aXZlIHZhbHVlIGZvciBzdWNjZXNzLCBuZWdldGl2ZSBvciB6ZXJvIGZvciBmYWlsdXJlCisJICovCisJaW50ICgqY2hlY2tfc3RhdHVzKSh2b2lkICpkaXNwbGF5KTsKIH07CiAKIC8qKgpAQCAtMjQ3LDYgKzI2Nyw5IEBACiAgKiBAZmJfa21hcDogdHJ1ZSBpZiBrZXJuZWwgbWFwcGluZyBvZiBmcmFtZWJ1ZmZlciBpcyByZXF1ZXN0ZWQKICAqIEBldmVudF90YWJsZTogQXJyYXkgb2YgcmVnaXN0ZXJlZCBldmVudHMKICAqIEBldmVudF9sb2NrOiBMb2NrIG9iamVjdCBmb3IgZXZlbnRfdGFibGUKKyAqIEBibF9kZXZpY2U6IGJhY2tsaWdodCBkZXZpY2Ugbm9kZQorICogQHN0YXR1c193b3JrOiB3b3JrIG9iamVjdCB0byBwZXJmb3JtIHN0YXR1cyBjaGVja3MKKyAqIEBmb3JjZV9wYW5lbF9kZWFkOiB2YXJpYWJsZSB0byB0cmlnZ2VyIGZvcmNlZCBFU0QgcmVjb3ZlcnkKICAqLwogc3RydWN0IHNkZV9jb25uZWN0b3IgewogCXN0cnVjdCBkcm1fY29ubmVjdG9yIGJhc2U7CkBAIC0yNzcsNiArMzAwLDEwIEBACiAJYm9vbCBmYl9rbWFwOwogCXN0cnVjdCBzZGVfY29ubmVjdG9yX2V2dCBldmVudF90YWJsZVtTREVfQ09OTl9FVkVOVF9DT1VOVF07CiAJc3BpbmxvY2tfdCBldmVudF9sb2NrOworCisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJsX2RldmljZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXR1c193b3JrOworCXUzMiBmb3JjZV9wYW5lbF9kZWFkOwogfTsKIAogLyoqCkBAIC01NjQsNCArNTkxLDExIEBACiBpbnQgc2RlX2Nvbm5lY3Rvcl9nZXRfZGl0aGVyX2NmZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubiwKIAkJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKnN0YXRlLCB2b2lkICoqY2ZnLCBzaXplX3QgKmxlbik7CiAKKy8qKgorICogc2RlX2Nvbm5lY3Rvcl9zY2hlZHVsZV9zdGF0dXNfd29yayAtIG1hbmFnZSBFU0QgdGhyZWFkCisgKiBjb25uOiBQb2ludGVyIHRvIGRybV9jb25uZWN0b3Igc3RydWN0CisgKiBAZW46IGZsYWcgdG8gc3RhcnQvc3RvcCBFU0QgdGhyZWFkCisgKi8KK3ZvaWQgc2RlX2Nvbm5lY3Rvcl9zY2hlZHVsZV9zdGF0dXNfd29yayhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubiwgYm9vbCBlbik7CisKICNlbmRpZiAvKiBfU0RFX0NPTk5FQ1RPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NvcmVfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29yZV9pcnEuYwppbmRleCAxNDAyZmRkLi5hMDg0NmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29yZV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29yZV9pcnEuYwpAQCAtMzEsMTQgKzMxLDE3IEBACiAJc3RydWN0IHNkZV9pcnEgKmlycV9vYmogPSAmc2RlX2ttcy0+aXJxX29iajsKIAlzdHJ1Y3Qgc2RlX2lycV9jYWxsYmFjayAqY2I7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJYm9vbCBjYl90YmxfZXJyb3IgPSBmYWxzZTsKKwlpbnQgZW5hYmxlX2NvdW50cyA9IDA7CiAKIAlwcl9kZWJ1ZygiaXJxX2lkeD0lZFxuIiwgaXJxX2lkeCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RlX2ttcy0+aXJxX29iai5jYl9sb2NrLCBpcnFfZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZpcnFfb2JqLT5pcnFfY2JfdGJsW2lycV9pZHhdKSkgewotCQlTREVfRVJST1IoImlycV9pZHg9JWQgaGFzIG5vIHJlZ2lzdGVyZWQgY2FsbGJhY2tcbiIsIGlycV9pZHgpOwotCQlTREVfRVZUMzJfSVJRKGlycV9pZHgsIGF0b21pY19yZWFkKAotCQkJCSZzZGVfa21zLT5pcnFfb2JqLmVuYWJsZV9jb3VudHNbaXJxX2lkeF0pLAotCQkJCVNERV9FVlRMT0dfRVJST1IpOworCQkvKiBwcmludCBlcnJvciBvdXRzaWRlIGxvY2sgKi8KKwkJY2JfdGJsX2Vycm9yID0gdHJ1ZTsKKwkJZW5hYmxlX2NvdW50cyA9IGF0b21pY19yZWFkKAorCQkJCSZzZGVfa21zLT5pcnFfb2JqLmVuYWJsZV9jb3VudHNbaXJxX2lkeF0pOwogCX0KIAogCWF0b21pY19pbmMoJmlycV9vYmotPmlycV9jb3VudHNbaXJxX2lkeF0pOwpAQCAtNDYsMTIgKzQ5LDE3IEBACiAJLyoKIAkgKiBQZXJmb3JtIHJlZ2lzdGVyZWQgZnVuY3Rpb24gY2FsbGJhY2sKIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RlX2ttcy0+aXJxX29iai5jYl9sb2NrLCBpcnFfZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZpcnFfb2JqLT5pcnFfY2JfdGJsW2lycV9pZHhdLCBsaXN0KQogCQlpZiAoY2ItPmZ1bmMpCiAJCQljYi0+ZnVuYyhjYi0+YXJnLCBpcnFfaWR4KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGVfa21zLT5pcnFfb2JqLmNiX2xvY2ssIGlycV9mbGFncyk7CiAKKwlpZiAoY2JfdGJsX2Vycm9yKSB7CisJCVNERV9FUlJPUigiaXJxIGhhcyBubyByZWdpc3RlcmVkIGNhbGxiYWNrLCBpZHggJWQgZW5hYmxlcyAlZFxuIiwKKwkJCQlpcnFfaWR4LCBlbmFibGVfY291bnRzKTsKKwkJU0RFX0VWVDMyX0lSUShpcnFfaWR4LCBlbmFibGVfY291bnRzLCBTREVfRVZUTE9HX0VSUk9SKTsKKwl9CisKIAkvKgogCSAqIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0IHN0YXR1cyBpbiBIVy4KIAkgKiBOT1RFOiBzZGVfY29yZV9pcnFfY2FsbGJhY2tfaGFuZGxlciBpcyBwcm90ZWN0ZWQgYnkgdG9wLWxldmVsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29yZV9wZXJmLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY29yZV9wZXJmLmMKaW5kZXggNzI0M2ZlMi4uOWRkY2E4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NvcmVfcGVyZi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jb3JlX3BlcmYuYwpAQCAtNzIyLDYgKzcyMiwxMiBAQAogCQkJKHUzMiAqKSZjYXRhbG9nLT5wZXJmLm1heF9id19sb3cpOwogCWRlYnVnZnNfY3JlYXRlX3UzMigidGhyZXNob2xkX2hpZ2giLCAwNjAwLCBwZXJmLT5kZWJ1Z2ZzX3Jvb3QsCiAJCQkodTMyICopJmNhdGFsb2ctPnBlcmYubWF4X2J3X2hpZ2gpOworCWRlYnVnZnNfY3JlYXRlX3UzMigibWluX2NvcmVfaWIiLCAwNjAwLCBwZXJmLT5kZWJ1Z2ZzX3Jvb3QsCisJCQkodTMyICopJmNhdGFsb2ctPnBlcmYubWluX2NvcmVfaWIpOworCWRlYnVnZnNfY3JlYXRlX3UzMigibWluX2xsY2NfaWIiLCAwNjAwLCBwZXJmLT5kZWJ1Z2ZzX3Jvb3QsCisJCQkodTMyICopJmNhdGFsb2ctPnBlcmYubWluX2xsY2NfaWIpOworCWRlYnVnZnNfY3JlYXRlX3UzMigibWluX2RyYW1faWIiLCAwNjAwLCBwZXJmLT5kZWJ1Z2ZzX3Jvb3QsCisJCQkodTMyICopJmNhdGFsb2ctPnBlcmYubWluX2RyYW1faWIpOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInBlcmZfbW9kZSIsIDA2MDAsIHBlcmYtPmRlYnVnZnNfcm9vdCwKIAkJCSh1MzIgKilwZXJmLCAmc2RlX2NvcmVfcGVyZl9tb2RlX2ZvcHMpOwogCWRlYnVnZnNfY3JlYXRlX3UzMigiYndfdm90ZV9tb2RlIiwgMDYwMCwgcGVyZi0+ZGVidWdmc19yb290LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jcnRjLmMKaW5kZXggODM5N2UxYy4uMjNjYTJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY3J0Yy5jCkBAIC00OCwxNCArNDgsNiBAQAogI2RlZmluZSBNRU1fUFJPVEVDVF9TRF9DVFJMX1NXSVRDSCAweDE4CiAjZGVmaW5lIE1EUF9ERVZJQ0VfSUQgICAgICAgICAgICAweDFBCiAKLXN0cnVjdCBzZGVfY3J0Y19pcnFfaW5mbyB7Ci0Jc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgaXJxOwotCXUzMiBldmVudDsKLQlpbnQgKCpmdW5jKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGJvb2wgZW4sCi0JCQlzdHJ1Y3Qgc2RlX2lycV9jYWxsYmFjayAqaXJxKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCiBzdHJ1Y3Qgc2RlX2NydGNfY3VzdG9tX2V2ZW50cyB7CiAJdTMyIGV2ZW50OwogCWludCAoKmZ1bmMpKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgYm9vbCBlbiwKQEAgLTY3LDE0ICs1OSwxMSBAQAogc3RhdGljIGludCBzZGVfY3J0Y19pZGxlX2ludGVycnVwdF9oYW5kbGVyKHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sCiAJYm9vbCBlbiwgc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKmlkbGVfaXJxKTsKIAotc3RhdGljIGludCBzZGVfY3J0Y19wbV9ldmVudF9oYW5kbGVyKHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sCi0JYm9vbCBlbiwgc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKm5vaXJxKTsKLQogc3RhdGljIHN0cnVjdCBzZGVfY3J0Y19jdXN0b21fZXZlbnRzIGN1c3RvbV9ldmVudHNbXSA9IHsKIAl7RFJNX0VWRU5UX0FEX0JBQ0tMSUdIVCwgc2RlX2NwX2FkX2ludGVycnVwdH0sCiAJe0RSTV9FVkVOVF9DUlRDX1BPV0VSLCBzZGVfY3J0Y19wb3dlcl9pbnRlcnJ1cHRfaGFuZGxlcn0sCi0Je0RSTV9FVkVOVF9TREVfUE9XRVIsIHNkZV9jcnRjX3BtX2V2ZW50X2hhbmRsZXJ9LAotCXtEUk1fRVZFTlRfSURMRV9OT1RJRlksIHNkZV9jcnRjX2lkbGVfaW50ZXJydXB0X2hhbmRsZXJ9CisJe0RSTV9FVkVOVF9JRExFX05PVElGWSwgc2RlX2NydGNfaWRsZV9pbnRlcnJ1cHRfaGFuZGxlcn0sCisJe0RSTV9FVkVOVF9ISVNUT0dSQU0sIHNkZV9jcF9oaXN0X2ludGVycnVwdH0sCiB9OwogCiAvKiBkZWZhdWx0IGlucHV0IGZlbmNlIHRpbWVvdXQsIGluIG1zICovCkBAIC02MTUsNiArNjA0LDE4IEBACiAJCXJldHVybjsKIH0KIAorLyoqCisgKiBzZGVfY3J0Y19kZXN0cm95X2Rlc3Rfc2NhbGVyIC0gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBzY2FsZXIgbHV0CisgKiBAc2RlX2NydGM6IFBvaW50ZXIgdG8gc2RlIGNydGMKKyAqLworc3RhdGljIHZvaWQgX3NkZV9jcnRjX2Rlc3Ryb3lfZGVzdF9zY2FsZXIoc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YykKK3sKKwlpZiAoIXNkZV9jcnRjKQorCQlyZXR1cm47CisKKwlrZnJlZShzZGVfY3J0Yy0+c2NsM19sdXRfY2ZnKTsKK30KKwogc3RhdGljIHZvaWQgc2RlX2NydGNfZGVzdHJveShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7CiAJc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YyA9IHRvX3NkZV9jcnRjKGNydGMpOwpAQCAtNjI4LDYgKzYyOSw3IEBACiAJCWRybV9wcm9wZXJ0eV91bnJlZmVyZW5jZV9ibG9iKHNkZV9jcnRjLT5ibG9iX2luZm8pOwogCW1zbV9wcm9wZXJ0eV9kZXN0cm95KCZzZGVfY3J0Yy0+cHJvcGVydHlfaW5mbyk7CiAJc2RlX2NwX2NydGNfZGVzdHJveV9wcm9wZXJ0aWVzKGNydGMpOworCV9zZGVfY3J0Y19kZXN0cm95X2Rlc3Rfc2NhbGVyKHNkZV9jcnRjKTsKIAogCXNkZV9mZW5jZV9kZWluaXQoJnNkZV9jcnRjLT5vdXRwdXRfZmVuY2UpOwogCV9zZGVfY3J0Y19kZWluaXRfZXZlbnRzKHNkZV9jcnRjKTsKQEAgLTY0Myw4ICs2NDUsOSBAQAogewogCVNERV9ERUJVRygiXG4iKTsKIAotCWlmIChtc21faXNfbW9kZV9zZWFtbGVzcyhhZGp1c3RlZF9tb2RlKSAmJgotCQkoIWNydGMtPmVuYWJsZWQgfHwgY3J0Yy0+c3RhdGUtPmFjdGl2ZV9jaGFuZ2VkKSkgeworCWlmICgobXNtX2lzX21vZGVfc2VhbWxlc3MoYWRqdXN0ZWRfbW9kZSkgfHwKKwkJCW1zbV9pc19tb2RlX3NlYW1sZXNzX3ZycihhZGp1c3RlZF9tb2RlKSkgJiYKKwkJKCFjcnRjLT5lbmFibGVkKSkgewogCQlTREVfRVJST1IoImNydGMgc3RhdGUgcHJldmVudHMgc2VhbWxlc3MgdHJhbnNpdGlvblxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC03OTQsNyArNzk3LDcgQEAKIH0KIAogc3RhdGljIGludCBfc2RlX2NydGNfc2V0X3JvaV92MShzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKnN0YXRlLAotCQl2b2lkICp1c3JfcHRyKQorCQl2b2lkIF9fdXNlciAqdXNyX3B0cikKIHsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc3RydWN0IHNkZV9jcnRjX3N0YXRlICpjc3RhdGU7CkBAIC05MTYsMjMgKzkxOSw2IEBACiAKIAlzZGVfa21zX3JlY3RfbWVyZ2VfcmVjdGFuZ2xlcygmY3J0Y19zdGF0ZS0+dXNlcl9yb2lfbGlzdCwgY3J0Y19yb2kpOwogCi0JLyoKLQkgKiBmb3IgM2RtdXggZHNjLCBtYWtlIHN1cmUgaXMgZnVsbCBST0ksIHNpbmNlIGN1cnJlbnQgZHJpdmVyIGRvZXNuJ3QKLQkgKiBzdXBwb3J0IHBhcnRpYWwgdXBkYXRlIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JaWYgKCFzZGVfa21zX3JlY3RfaXNfbnVsbChjcnRjX3JvaSkgJiYKLQkJX3NkZV9jcnRjX3NldHVwX2lzXzNkbXV4X2RzYyhzdGF0ZSkpIHsKLQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkal9tb2RlID0gJnN0YXRlLT5hZGp1c3RlZF9tb2RlOwotCi0JCWlmIChjcnRjX3JvaS0+dyAhPSBhZGpfbW9kZS0+aGRpc3BsYXkgfHwKLQkJCWNydGNfcm9pLT5oICE9IGFkal9tb2RlLT52ZGlzcGxheSkgewotCQkJU0RFX0VSUk9SKCIlczogdW5zdXBwb3J0ZWQgdG9wIHJvaVslZCAlZF0gd3hoWyVkICVkXVxuIiwKLQkJCQlzZGVfY3J0Yy0+bmFtZSwgY3J0Y19yb2ktPncsIGNydGNfcm9pLT5oLAotCQkJCWFkal9tb2RlLT5oZGlzcGxheSwgYWRqX21vZGUtPnZkaXNwbGF5KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCiAJU0RFX0RFQlVHKCIlczogY3J0YyByb2kgKCVkLCVkLCVkLCVkKVxuIiwgc2RlX2NydGMtPm5hbWUsCiAJCQljcnRjX3JvaS0+eCwgY3J0Y19yb2ktPnksIGNydGNfcm9pLT53LCBjcnRjX3JvaS0+aCk7CiAKQEAgLTEwMDMsNiArOTg5LDE4IEBACiAJU0RFX0RFQlVHKCIlczogbG0lZCByb2kgKCVkLCVkLCVkLCVkKVxuIiwgc2RlX2NydGMtPm5hbWUsIGxtX2lkeCwKIAkJCWxtX3JvaS0+eCwgbG1fcm9pLT55LCBsbV9yb2ktPncsIGxtX3JvaS0+aCk7CiAKKwkvKgorCSAqIHBhcnRpYWwgdXBkYXRlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCAzZG11eCBkc2Mgb3IgZGVzdCBzY2FsZXIuCisJICogaGVuY2UsIGNydGMgcm9pIG11c3QgbWF0Y2ggdGhlIG1peGVyIGRpbWVuc2lvbnMuCisJICovCisJaWYgKGNydGNfc3RhdGUtPm51bV9kc19lbmFibGVkIHx8CisJCV9zZGVfY3J0Y19zZXR1cF9pc18zZG11eF9kc2Moc3RhdGUpKSB7CisJCWlmIChtZW1jbXAobG1fcm9pLCBsbV9ib3VuZHMsIHNpemVvZihzdHJ1Y3Qgc2RlX3JlY3QpKSkgeworCQkJU0RFX0VSUk9SKCJVbnN1cHBvcnRlZDogRGVzdCBzY2FsZXIvM2QgbXV4IERTQyArIFBVXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJLyogaWYgYW55IGRpbWVuc2lvbiBpcyB6ZXJvLCBjbGVhciBhbGwgZGltZW5zaW9ucyBmb3IgY2xhcml0eSAqLwogCWlmIChzZGVfa21zX3JlY3RfaXNfbnVsbChsbV9yb2kpKQogCQltZW1zZXQobG1fcm9pLCAwLCBzaXplb2YoKmxtX3JvaSkpOwpAQCAtMTI2Nyw3ICsxMjY1LDcgQEAKIAlzdHJ1Y3Qgc2RlX2h3X3N0YWdlX2NmZyAqc3RhZ2VfY2ZnOwogCXN0cnVjdCBzZGVfcmVjdCBwbGFuZV9jcnRjX3JvaTsKIAotCXUzMiBmbHVzaF9tYXNrLCBmbHVzaF9zYnVmLCBmbHVzaF90bXA7CisJdTMyIGZsdXNoX21hc2ssIGZsdXNoX3NidWY7CiAJdWludDMyX3Qgc3RhZ2VfaWR4LCBsbV9pZHg7CiAJaW50IHpwb3NfY250W1NERV9TVEFHRV9NQVggKyAxXSA9IHsgMCB9OwogCWludCBpOwpAQCAtMTI4MywxMCArMTI4MSw5IEBACiAJbG0gPSBtaXhlci0+aHdfbG07CiAJc3RhZ2VfY2ZnID0gJnNkZV9jcnRjLT5zdGFnZV9jZmc7CiAJY3N0YXRlID0gdG9fc2RlX2NydGNfc3RhdGUoY3J0Yy0+c3RhdGUpOwotCWZsdXNoX3NidWYgPSAweDA7CiAKLQljc3RhdGUtPnNidWZfY2ZnLnJvdF9vcF9tb2RlID0gU0RFX0NUTF9ST1RfT1BfTU9ERV9PRkZMSU5FOwogCWNzdGF0ZS0+c2J1Zl9wcmVmaWxsX2xpbmUgPSAwOworCXNkZV9jcnRjLT5zYnVmX2ZsdXNoX21hc2sgPSAweDA7CiAKIAlkcm1fYXRvbWljX2NydGNfZm9yX2VhY2hfcGxhbmUocGxhbmUsIGNydGMpIHsKIAkJc3RhdGUgPSBwbGFuZS0+c3RhdGU7CkBAIC0xMzAxLDE3ICsxMjk4LDE0IEBACiAJCXBzdGF0ZSA9IHRvX3NkZV9wbGFuZV9zdGF0ZShzdGF0ZSk7CiAJCWZiID0gc3RhdGUtPmZiOwogCi0JCWlmIChzZGVfcGxhbmVfaXNfc2J1Zl9tb2RlKHBsYW5lLCAmcHJlZmlsbCkpCi0JCQljc3RhdGUtPnNidWZfY2ZnLnJvdF9vcF9tb2RlID0KLQkJCQkJU0RFX0NUTF9ST1RfT1BfTU9ERV9JTkxJTkVfU1lOQzsKKwkJcHJlZmlsbCA9IHNkZV9wbGFuZV9yb3RfY2FsY19wcmVmaWxsKHBsYW5lKTsKIAkJaWYgKHByZWZpbGwgPiBjc3RhdGUtPnNidWZfcHJlZmlsbF9saW5lKQogCQkJY3N0YXRlLT5zYnVmX3ByZWZpbGxfbGluZSA9IHByZWZpbGw7CiAKLQkJc2RlX3BsYW5lX2dldF9jdGxfZmx1c2gocGxhbmUsIGN0bCwgJmZsdXNoX21hc2ssICZmbHVzaF90bXApOworCQlzZGVfcGxhbmVfZ2V0X2N0bF9mbHVzaChwbGFuZSwgY3RsLCAmZmx1c2hfbWFzaywgJmZsdXNoX3NidWYpOwogCi0JCS8qIHBlcnNpc3Qgcm90YXRvciBmbHVzaCBiaXQocykgZm9yIG9uZSBtb3JlIGNvbW1pdCAqLwotCQlmbHVzaF9tYXNrIHw9IGNzdGF0ZS0+c2J1Zl9mbHVzaF9tYXNrIHwgZmx1c2hfdG1wOwotCQlmbHVzaF9zYnVmIHw9IGZsdXNoX3RtcDsKKwkJLyogc2F2ZSBzYnVmIGZsdXNoIHZhbHVlIGZvciBsYXRlciAqLworCQlzZGVfY3J0Yy0+c2J1Zl9mbHVzaF9tYXNrIHw9IGZsdXNoX3NidWY7CiAKIAkJU0RFX0RFQlVHKCJjcnRjICVkIHN0YWdlOiVkIC0gcGxhbmUgJWQgc3NwcCAlZCBmYiAlZFxuIiwKIAkJCQljcnRjLT5iYXNlLmlkLApAQCAtMTMzNSw4ICsxMzI5LDcgQEAKIAkJCQlzdGF0ZS0+c3JjX3cgPj4gMTYsIHN0YXRlLT5zcmNfaCA+PiAxNiwKIAkJCQlzdGF0ZS0+Y3J0Y194LCBzdGF0ZS0+Y3J0Y195LAogCQkJCXN0YXRlLT5jcnRjX3csIHN0YXRlLT5jcnRjX2gsCi0JCQkJZmx1c2hfdG1wID8gY3N0YXRlLT5zYnVmX2NmZy5yb3Rfb3BfbW9kZSA6Ci0JCQkJU0RFX0NUTF9ST1RfT1BfTU9ERV9PRkZMSU5FKTsKKwkJCQlmbHVzaF9zYnVmICE9IDApOwogCiAJCXN0YWdlX2lkeCA9IHpwb3NfY250W3BzdGF0ZS0+c3RhZ2VdKys7CiAJCXN0YWdlX2NmZy0+c3RhZ2VbcHN0YXRlLT5zdGFnZV1bc3RhZ2VfaWR4XSA9CkBAIC0xMzYzLDggKzEzNTYsNiBAQAogCQl9CiAJfQogCi0JY3N0YXRlLT5zYnVmX2ZsdXNoX21hc2sgPSBmbHVzaF9zYnVmOwotCiAJaWYgKGxtICYmIGxtLT5vcHMuc2V0dXBfZGltX2xheWVyKSB7CiAJCWNzdGF0ZSA9IHRvX3NkZV9jcnRjX3N0YXRlKGNydGMtPnN0YXRlKTsKIAkJZm9yIChpID0gMDsgaSA8IGNzdGF0ZS0+bnVtX2RpbV9sYXllcnM7IGkrKykKQEAgLTE1MDYsNiArMTQ5Nyw3IEBACiAKIAkJbG0tPm9wcy5zZXR1cF9hbHBoYV9vdXQobG0sIG1peGVyW2ldLm1peGVyX29wX21vZGUpOwogCisJCW1peGVyW2ldLnBpcGVfbWFzayA9IG1peGVyW2ldLmZsdXNoX21hc2s7CiAJCW1peGVyW2ldLmZsdXNoX21hc2sgfD0gY3RsLT5vcHMuZ2V0X2JpdG1hc2tfbWl4ZXIoY3RsLAogCQkJbWl4ZXJbaV0uaHdfbG0tPmlkeCk7CiAKQEAgLTE1MjgsNyArMTUyMCw2IEBACiBzdGF0aWMgaW50IF9zZGVfY3J0Y19maW5kX3BsYW5lX2ZiX21vZGVzKHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqc3RhdGUsCiAJCXVpbnQzMl90ICpmYl9ucywKIAkJdWludDMyX3QgKmZiX3NlYywKLQkJdWludDMyX3QgKmZiX25zX2RpciwKIAkJdWludDMyX3QgKmZiX3NlY19kaXIpCiB7CiAJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CkBAIC0xNTQ0LDcgKzE1MzUsNiBAQAogCiAJKmZiX25zID0gMDsKIAkqZmJfc2VjID0gMDsKLQkqZmJfbnNfZGlyID0gMDsKIAkqZmJfc2VjX2RpciA9IDA7CiAJZHJtX2F0b21pY19jcnRjX3N0YXRlX2Zvcl9lYWNoX3BsYW5lX3N0YXRlKHBsYW5lLCBwc3RhdGUsIHN0YXRlKSB7CiAJCWlmIChJU19FUlJfT1JfTlVMTChwc3RhdGUpKSB7CkBAIC0xNTY0LDE2ICsxNTU0LDEyIEBACiAJCWNhc2UgU0RFX0RSTV9GQl9TRUM6CiAJCQkoKmZiX3NlYykrKzsKIAkJCWJyZWFrOwotCQljYXNlIFNERV9EUk1fRkJfTk9OX1NFQ19ESVJfVFJBTlM6Ci0JCQkoKmZiX25zX2RpcikrKzsKLQkJCWJyZWFrOwogCQljYXNlIFNERV9EUk1fRkJfU0VDX0RJUl9UUkFOUzoKIAkJCSgqZmJfc2VjX2RpcikrKzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJU0RFX0VSUk9SKCJFcnJvcjogUGxhbmVbJWRdLCBmYl90cmFuc19tb2RlOiVkIiwKLQkJCQkJcGxhbmUtPmJhc2UuaWQsCi0JCQkJCW1vZGUpOworCQkJCQlwbGFuZS0+YmFzZS5pZCwgbW9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTE1OTcsNyArMTU4Myw3IEBACiAJc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YzsKIAlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZTsKIAlzdHJ1Y3Qgc2RlX2NydGNfc21tdV9zdGF0ZV9kYXRhICpzbW11X3N0YXRlOwotCXVpbnQzMl90IHRyYW5zbGF0aW9uX21vZGUgPSAwOworCXVpbnQzMl90IHRyYW5zbGF0aW9uX21vZGUgPSAwLCBzZWN1cmVfbGV2ZWw7CiAJaW50IG9wcyAgPSAwOwogCWJvb2wgcG9zdF9jb21taXQgPSBmYWxzZTsKIApAQCAtMTYwOSwxMCArMTU5NSwxMCBAQAogCXNkZV9jcnRjID0gdG9fc2RlX2NydGMoY3J0Yyk7CiAJY3N0YXRlID0gdG9fc2RlX2NydGNfc3RhdGUoY3J0Yy0+c3RhdGUpOwogCXNtbXVfc3RhdGUgPSAmc2RlX2NydGMtPnNtbXVfc3RhdGU7CisJc2VjdXJlX2xldmVsID0gc2RlX2NydGNfZ2V0X3NlY3VyZV9sZXZlbChjcnRjLCBjcnRjLT5zdGF0ZSk7CiAKLQlTREVfREVCVUcoImNydGMlZCwgc2VjdXJlX2xldmVsJWRcbiIsCi0JCQljcnRjLT5iYXNlLmlkLAotCQkJc2RlX2NydGNfZ2V0X3NlY3VyZV9sZXZlbChjcnRjLCBjcnRjLT5zdGF0ZSkpOworCVNERV9ERUJVRygiY3J0YyVkLCBzZWN1cmVfbGV2ZWwlZCBvbGRfdmFsaWRfZmIlZFxuIiwKKwkJCWNydGMtPmJhc2UuaWQsIHNlY3VyZV9sZXZlbCwgb2xkX3ZhbGlkX2ZiKTsKIAogCS8qKgogCSAqIFNNTVUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIGRlbGF5ZWQgaW4gY2FzZSBvZgpAQCAtMTYzNiw4ICsxNjIyLDcgQEAKIAkJCQlQTEFORV9QUk9QX0ZCX1RSQU5TTEFUSU9OX01PREUpOwogCQlpZiAodHJhbnNsYXRpb25fbW9kZSA+IFNERV9EUk1fRkJfU0VDX0RJUl9UUkFOUykgewogCQkJU0RFX0VSUk9SKCJjcnRjJWQsIGludmFsaWQgdHJhbnNsYXRpb25fbW9kZSVkXG4iLAotCQkJCQljcnRjLT5iYXNlLmlkLAotCQkJCQl0cmFuc2xhdGlvbl9tb2RlKTsKKwkJCQkJY3J0Yy0+YmFzZS5pZCwgdHJhbnNsYXRpb25fbW9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xNjQ1LDE0ICsxNjMwLDE1IEBACiAJCSAqIHdlIGNhbiBicmVhayBpZiB3ZSBmaW5kIHNlY19maXIgb3Igbm9uX3NlY19kaXIKIAkJICogcGxhbmUKIAkJICovCi0JCWlmICgodHJhbnNsYXRpb25fbW9kZSA9PSBTREVfRFJNX0ZCX05PTl9TRUNfRElSX1RSQU5TKSB8fAotCQkJKHRyYW5zbGF0aW9uX21vZGUgPT0gU0RFX0RSTV9GQl9TRUNfRElSX1RSQU5TKSkKKwkJaWYgKHRyYW5zbGF0aW9uX21vZGUgPT0gU0RFX0RSTV9GQl9TRUNfRElSX1RSQU5TKQogCQkJYnJlYWs7CiAJfQogCiAJc3dpdGNoICh0cmFuc2xhdGlvbl9tb2RlKSB7Ci0JY2FzZSBTREVfRFJNX0ZCX05PTl9TRUNfRElSX1RSQU5TOgotCQlpZiAoc21tdV9zdGF0ZS0+c3RhdGUgPT0gQVRUQUNIRUQpIHsKKwljYXNlIFNERV9EUk1fRkJfU0VDX0RJUl9UUkFOUzoKKwkJLyogc2VjdXJlIGRpc3BsYXkgdXNlY2FzZSAqLworCQlpZiAoKHNtbXVfc3RhdGUtPnN0YXRlID09IEFUVEFDSEVEKSAmJgorCQkJCShzZWN1cmVfbGV2ZWwgPT0gU0RFX0RSTV9TRUNfT05MWSkpIHsKIAkJCXNtbXVfc3RhdGUtPnN0YXRlID0gREVUQUNIX0FMTF9SRVE7CiAJCQlzbW11X3N0YXRlLT50cmFuc2l0aW9uX3R5cGUgPSBQUkVfQ09NTUlUOwogCQkJb3BzIHw9IFNERV9LTVNfT1BTX0NSVENfU0VDVVJFX1NUQVRFX0NIQU5HRTsKQEAgLTE2NjAsMTAgKzE2NDYsOCBAQAogCQkJCW9wcyB8PSAoU0RFX0tNU19PUFNfV0FJVF9GT1JfVFhfRE9ORSAgfAogCQkJCQlTREVfS01TX09QU19DTEVBTlVQX1BMQU5FX0ZCKTsKIAkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIFNERV9EUk1fRkJfU0VDX0RJUl9UUkFOUzoKLQkJaWYgKHNtbXVfc3RhdGUtPnN0YXRlID09IEFUVEFDSEVEKSB7CisJCS8qIHNlY3VyZSBjYW1lcmEgdXNlY2FzZSAqLworCQl9IGVsc2UgaWYgKHNtbXVfc3RhdGUtPnN0YXRlID09IEFUVEFDSEVEKSB7CiAJCQlzbW11X3N0YXRlLT5zdGF0ZSA9IERFVEFDSF9TRUNfUkVROwogCQkJc21tdV9zdGF0ZS0+dHJhbnNpdGlvbl90eXBlID0gUFJFX0NPTU1JVDsKIAkJCW9wcyB8PSBTREVfS01TX09QU19DUlRDX1NFQ1VSRV9TVEFURV9DSEFOR0U7CkBAIC0xNjcxLDM0ICsxNjU1LDMzIEBACiAJCWJyZWFrOwogCWNhc2UgU0RFX0RSTV9GQl9TRUM6CiAJY2FzZSBTREVfRFJNX0ZCX05PTl9TRUM6Ci0JCWlmIChzbW11X3N0YXRlLT5zdGF0ZSA9PSBERVRBQ0hFRF9TRUMpIHsKKwkJaWYgKChzbW11X3N0YXRlLT5zdGF0ZSA9PSBERVRBQ0hFRF9TRUMpIHx8CisJCQkoc21tdV9zdGF0ZS0+c3RhdGUgPT0gREVUQUNIX1NFQ19SRVEpKSB7CiAJCQlzbW11X3N0YXRlLT5zdGF0ZSA9IEFUVEFDSF9TRUNfUkVROwogCQkJc21tdV9zdGF0ZS0+dHJhbnNpdGlvbl90eXBlID0gcG9zdF9jb21taXQgPwogCQkJCVBPU1RfQ09NTUlUIDogUFJFX0NPTU1JVDsKIAkJCW9wcyB8PSBTREVfS01TX09QU19DUlRDX1NFQ1VSRV9TVEFURV9DSEFOR0U7Ci0JCQlpZiAodHJhbnNsYXRpb25fbW9kZSA9PSBTREVfRFJNX0ZCX1NFQykKLQkJCQlvcHMgfD0gU0RFX0tNU19PUFNfUFJFUEFSRV9QTEFORV9GQjsKLQkJfSBlbHNlIGlmIChzbW11X3N0YXRlLT5zdGF0ZSA9PSBERVRBQ0hFRCkgeworCQkJaWYgKG9sZF92YWxpZF9mYikKKwkJCQlvcHMgfD0gU0RFX0tNU19PUFNfV0FJVF9GT1JfVFhfRE9ORTsKKwkJfSBlbHNlIGlmICgoc21tdV9zdGF0ZS0+c3RhdGUgPT0gREVUQUNIRUQpIHx8CisJCQkJKHNtbXVfc3RhdGUtPnN0YXRlID09IERFVEFDSF9BTExfUkVRKSkgewogCQkJc21tdV9zdGF0ZS0+c3RhdGUgPSBBVFRBQ0hfQUxMX1JFUTsKIAkJCXNtbXVfc3RhdGUtPnRyYW5zaXRpb25fdHlwZSA9IHBvc3RfY29tbWl0ID8KIAkJCQlQT1NUX0NPTU1JVCA6IFBSRV9DT01NSVQ7Ci0JCQlvcHMgfD0gU0RFX0tNU19PUFNfQ1JUQ19TRUNVUkVfU1RBVEVfQ0hBTkdFIHwKLQkJCQlTREVfS01TX09QU19QUkVQQVJFX1BMQU5FX0ZCOworCQkJb3BzIHw9IFNERV9LTVNfT1BTX0NSVENfU0VDVVJFX1NUQVRFX0NIQU5HRTsKIAkJCWlmIChvbGRfdmFsaWRfZmIpCiAJCQkJb3BzIHw9IChTREVfS01TX09QU19XQUlUX0ZPUl9UWF9ET05FIHwKIAkJCQkgU0RFX0tNU19PUFNfQ0xFQU5VUF9QTEFORV9GQik7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJU0RFX0VSUk9SKCJpbnZhbGlkIHBsYW5lIGZiX21vZGU6JWRcbiIsCi0JCQkJdHJhbnNsYXRpb25fbW9kZSk7CisJCVNERV9FUlJPUigiaW52YWxpZCBwbGFuZSBmYl9tb2RlOiVkXG4iLCB0cmFuc2xhdGlvbl9tb2RlKTsKIAkJb3BzID0gMDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJU0RFX0RFQlVHKCJTTU1VIFN0YXRlOiVkLCB0eXBlOiVkIG9wczoleFxuIiwgc21tdV9zdGF0ZS0+c3RhdGUsCi0JCQlzbW11X3N0YXRlLT50cmFuc2l0aW9uX3R5cGUsCi0JCQlvcHMpOworCQkJc21tdV9zdGF0ZS0+dHJhbnNpdGlvbl90eXBlLCBvcHMpOwogCXJldHVybiBvcHM7CiB9CiAKQEAgLTE3MjYsMTMgKzE3MDksMTMgQEAKIAkgKi8KIAlzZWNfc2lkWzBdID0gU0VDX1NJRF9NQVNLXzA7CiAJc2VjX3NpZFsxXSA9IFNFQ19TSURfTUFTS18xOwotCWRtYWNfZmx1c2hfcmFuZ2UoJnNlY19zaWQsICZzZWNfc2lkICsgbnVtX3NpZHMpOworCWRtYWNfZmx1c2hfcmFuZ2Uoc2VjX3NpZCwgc2VjX3NpZCArIG51bV9zaWRzKTsKIAogCVNERV9ERUJVRygiY2FsbGluZyBzY21fY2FsbCBmb3Igdm1pZCAlZCIsIHZtaWQpOwogCiAJZGVzYy5hcmdpbmZvID0gU0NNX0FSR1MoNCwgU0NNX1ZBTCwgU0NNX1JXLCBTQ01fVkFMLCBTQ01fVkFMKTsKIAlkZXNjLmFyZ3NbMF0gPSBNRFBfREVWSUNFX0lEOwotCWRlc2MuYXJnc1sxXSA9IFNDTV9CVUZGRVJfUEhZUygmc2VjX3NpZCk7CisJZGVzYy5hcmdzWzFdID0gU0NNX0JVRkZFUl9QSFlTKHNlY19zaWQpOwogCWRlc2MuYXJnc1syXSA9IHNpemVvZih1aW50MzJfdCkgKiBudW1fc2lkczsKIAlkZXNjLmFyZ3NbM10gPSAgdm1pZDsKIApAQCAtMTc0MCw4ICsxNzIzLDcgQEAKIAkJCQltZW1fcHJvdGVjdF9zZF9jdHJsX2lkKSwgJmRlc2MpOwogCWlmIChyZXQpIHsKIAkJU0RFX0VSUk9SKCJFcnJvcjpzY21fY2FsbDIsIHZtaWQgKCVsbGQpOiByZXQlZFxuIiwKLQkJCQlkZXNjLmFyZ3NbM10sCi0JCQkJcmV0KTsKKwkJCQlkZXNjLmFyZ3NbM10sIHJldCk7CiAJfQogCiAJa2ZyZWUoc2VjX3NpZCk7CkBAIC0xNzQ5LDYgKzE3MzEsNjQgQEAKIH0KIAogLyoqCisgKiBfc2RlX2NydGNfc2V0dXBfc2NhbGVyM19sdXQgLSBTZXQgdXAgc2NhbGVyIGx1dAorICogTFVUcyBhcmUgY29uZmlndXJlZCBvbmx5IG9uY2UgZHVyaW5nIGJvb3QKKyAqIEBzZGVfY3J0YzogUG9pbnRlciB0byBzZGUgY3J0YworICogQGNzdGF0ZTogUG9pbnRlciB0byBzZGUgY3J0YyBzdGF0ZQorICovCitzdGF0aWMgaW50IF9zZGVfY3J0Y19zZXRfZGVzdF9zY2FsZXJfbHV0KHN0cnVjdCBzZGVfY3J0YyAqc2RlX2NydGMsCisJCXN0cnVjdCBzZGVfY3J0Y19zdGF0ZSAqY3N0YXRlLCB1aW50MzJfdCBsdXRfaWR4KQoreworCXN0cnVjdCBzZGVfaHdfc2NhbGVyM19sdXRfY2ZnICpjZmc7CisJdTMyICpsdXRfZGF0YSA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXNkZV9jcnRjIHx8ICFjc3RhdGUgfHwgIXNkZV9jcnRjLT5zY2wzX2x1dF9jZmcpIHsKKwkJU0RFX0VSUk9SKCJpbnZhbGlkIGFyZ3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc2RlX2NydGMtPnNjbDNfbHV0X2NmZy0+aXNfY29uZmlndXJlZCkgeworCQlTREVfREVCVUcoImx1dCBhbHJlYWR5IGNvbmZpZ3VyZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsdXRfZGF0YSA9IG1zbV9wcm9wZXJ0eV9nZXRfYmxvYigmc2RlX2NydGMtPnByb3BlcnR5X2luZm8sCisJCQkmY3N0YXRlLT5wcm9wZXJ0eV9zdGF0ZSwgJmxlbiwgbHV0X2lkeCk7CisJaWYgKCFsdXRfZGF0YSB8fCAhbGVuKSB7CisJCVNERV9FUlJPUigibHV0KCVkKTogbm8gZGF0YSwgbGVuKCV6dSlcbiIsIGx1dF9pZHgsIGxlbik7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwljZmcgPSBzZGVfY3J0Yy0+c2NsM19sdXRfY2ZnOworCisJc3dpdGNoIChsdXRfaWR4KSB7CisJY2FzZSBDUlRDX1BST1BfREVTVF9TQ0FMRVJfTFVUX0VEOgorCQljZmctPmRpcl9sdXQgPSBsdXRfZGF0YTsKKwkJY2ZnLT5kaXJfbGVuID0gbGVuOworCQlicmVhazsKKwljYXNlIENSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfQ0lSOgorCQljZmctPmNpcl9sdXQgPSBsdXRfZGF0YTsKKwkJY2ZnLT5jaXJfbGVuID0gbGVuOworCQlicmVhazsKKwljYXNlIENSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfU0VQOgorCQljZmctPnNlcF9sdXQgPSBsdXRfZGF0YTsKKwkJY2ZnLT5zZXBfbGVuID0gbGVuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlTREVfRVJST1IoImludmFsaWQgTFVUIGluZGV4ID0gJWQiLCBsdXRfaWR4KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNmZy0+ZGlyX2x1dCAmJiBjZmctPmNpcl9sdXQgJiYgY2ZnLT5zZXBfbHV0KQorCQljZmctPmlzX2NvbmZpZ3VyZWQgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCiAgKiBzZGVfY3J0Y19zZWN1cmVfY3RybCAtIEluaXRpYXRlcyB0aGUgb3BlcmF0aW9ucyB0byBzd3RpY2ggIGJldHdlZW4gc2VjdXJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vbi1zZWN1cmUgbW9kZQogICogQGNydGM6IFBvaW50ZXIgdG8gY3J0YwpAQCAtMTc4NCw3ICsxODI0LDYgQEAKIAkJLyogQmFpbCBvdXQgKi8KIAkJcmV0dXJuIDA7CiAKLQogCS8qIFNlY3VyZSBVSSB1c2UgY2FzZSBlbmFibGUgKi8KIAlzd2l0Y2ggKHNtbXVfc3RhdGUtPnN0YXRlKSB7CiAJY2FzZSBERVRBQ0hfQUxMX1JFUToKQEAgLTE4NjAsMTQgKzE4OTksMTEyIEBACiAJU0RFX0RFQlVHKCJjcnRjOiAlZCwgb2xkX3N0YXRlICVkIG5ld19zdGF0ZSAlZFxuIiwgY3J0Yy0+YmFzZS5pZCwKIAkJCW9sZF9zbW11X3N0YXRlLAogCQkJc21tdV9zdGF0ZS0+c3RhdGUpOwotCXNtbXVfc3RhdGUtPnRyYW5zaXRpb25fZXJyb3IgPSBmYWxzZTsKIAlzbW11X3N0YXRlLT50cmFuc2l0aW9uX3R5cGUgPSBOT05FOwogCiBlcnJvcjoKLQlzbW11X3N0YXRlLT50cmFuc2l0aW9uX2Vycm9yID0gdHJ1ZTsKKwlzbW11X3N0YXRlLT50cmFuc2l0aW9uX2Vycm9yID0gcmV0ID8gdHJ1ZSA6IGZhbHNlOwogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogX3NkZV9jcnRjX2Rlc3Rfc2NhbGVyX3NldHVwIC0gU2V0IHVwIGRlc3Qgc2NhbGVyIGJsb2NrCisgKiBAY3J0YzogUG9pbnRlciB0byBkcm0gY3J0YworICovCitzdGF0aWMgdm9pZCBfc2RlX2NydGNfZGVzdF9zY2FsZXJfc2V0dXAoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBzZGVfY3J0YyAqc2RlX2NydGM7CisJc3RydWN0IHNkZV9jcnRjX3N0YXRlICpjc3RhdGU7CisJc3RydWN0IHNkZV9od19taXhlciAqaHdfbG07CisJc3RydWN0IHNkZV9od19jdGwgKmh3X2N0bDsKKwlzdHJ1Y3Qgc2RlX2h3X2RzICpod19kczsKKwlzdHJ1Y3Qgc2RlX2h3X2RzX2NmZyAqY2ZnOworCXN0cnVjdCBzZGVfa21zICprbXM7CisJdTMyIGZsdXNoX21hc2sgPSAwLCBvcF9tb2RlID0gMDsKKwl1MzIgbG1faWR4ID0gMCwgbnVtX21peGVycyA9IDA7CisJaW50IGksIGNvdW50ID0gMDsKKworCWlmICghY3J0YykKKwkJcmV0dXJuOworCisJc2RlX2NydGMgICA9IHRvX3NkZV9jcnRjKGNydGMpOworCWNzdGF0ZSA9IHRvX3NkZV9jcnRjX3N0YXRlKGNydGMtPnN0YXRlKTsKKwlrbXMgICAgPSBfc2RlX2NydGNfZ2V0X2ttcyhjcnRjKTsKKwludW1fbWl4ZXJzID0gc2RlX2NydGMtPm51bV9taXhlcnM7CisKKwlTREVfREVCVUcoImNydGMlZFxuIiwgY3J0Yy0+YmFzZS5pZCk7CisKKwlpZiAoIWNzdGF0ZS0+ZHNfZGlydHkpIHsKKwkJU0RFX0RFQlVHKCJubyBjaGFuZ2UgaW4gc2V0dGluZ3MsIHNraXAgY29tbWl0XG4iKTsKKwl9IGVsc2UgaWYgKCFrbXMgfHwgIWttcy0+Y2F0YWxvZykgeworCQlTREVfRVJST1IoImludmFsaWQgcGFyYW1ldGVyc1xuIik7CisJfSBlbHNlIGlmICgha21zLT5jYXRhbG9nLT5tZHBbMF0uaGFzX2Rlc3Rfc2NhbGVyKSB7CisJCVNERV9ERUJVRygiZGVzdCBzY2FsZXIgZmVhdHVyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwl9IGVsc2UgaWYgKG51bV9taXhlcnMgPiBDUlRDX0RVQUxfTUlYRVJTKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBudW1iZXIgbWl4ZXJzOiAlZFxuIiwgbnVtX21peGVycyk7CisJfSBlbHNlIGlmICghc2RlX2NydGMtPnNjbDNfbHV0X2NmZy0+aXNfY29uZmlndXJlZCkgeworCQlTREVfREVCVUcoIm5vIExVVCBkYXRhIGF2YWlsYWJsZVxuIik7CisJfSBlbHNlIHsKKwkJY291bnQgPSBjc3RhdGUtPm51bV9kc19lbmFibGVkID8gY3N0YXRlLT5udW1fZHMgOiBudW1fbWl4ZXJzOworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQljZmcgPSAmY3N0YXRlLT5kc19jZmdbaV07CisKKwkJCWlmICghY2ZnLT5mbGFncykKKwkJCQljb250aW51ZTsKKworCQkJbG1faWR4ID0gY2ZnLT5uZHg7CisJCQlod19sbSAgPSBzZGVfY3J0Yy0+bWl4ZXJzW2xtX2lkeF0uaHdfbG07CisJCQlod19jdGwgPSBzZGVfY3J0Yy0+bWl4ZXJzW2xtX2lkeF0uaHdfY3RsOworCQkJaHdfZHMgID0gc2RlX2NydGMtPm1peGVyc1tsbV9pZHhdLmh3X2RzOworCisJCQkvKiBTZXR1cCBvcCBtb2RlIC0gRHVhbC9zaW5nbGUgKi8KKwkJCWlmIChjZmctPmZsYWdzICYgU0RFX0RSTV9ERVNUU0NBTEVSX0VOQUJMRSkKKwkJCQlvcF9tb2RlIHw9IEJJVChod19kcy0+aWR4IC0gRFNfMCk7CisKKwkJCWlmICgoaSA9PSBjb3VudC0xKSAmJiBod19kcy0+b3BzLnNldHVwX29wbW9kZSkgeworCQkJCW9wX21vZGUgfD0gKGNzdGF0ZS0+bnVtX2RzX2VuYWJsZWQgPT0KKwkJCQkJQ1JUQ19EVUFMX01JWEVSUykgPworCQkJCQlTREVfRFNfT1BfTU9ERV9EVUFMIDogMDsKKwkJCQlod19kcy0+b3BzLnNldHVwX29wbW9kZShod19kcywgb3BfbW9kZSk7CisJCQkJU0RFX0VWVDMyKERSTUlEKGNydGMpLCBvcF9tb2RlKTsKKwkJCX0KKworCQkJLyogU2V0dXAgc2NhbGVyICovCisJCQlpZiAoKGNmZy0+ZmxhZ3MgJiBTREVfRFJNX0RFU1RTQ0FMRVJfU0NBTEVfVVBEQVRFKSB8fAorCQkJCShjZmctPmZsYWdzICYKKwkJCQkJU0RFX0RSTV9ERVNUU0NBTEVSX0VOSEFOQ0VSX1VQREFURSkpIHsKKwkJCQlpZiAoaHdfZHMtPm9wcy5zZXR1cF9zY2FsZXIpCisJCQkJCWh3X2RzLT5vcHMuc2V0dXBfc2NhbGVyKGh3X2RzLAorCQkJCQkJCWNmZy0+c2NsM19jZmcsCisJCQkJCQkJc2RlX2NydGMtPnNjbDNfbHV0X2NmZyk7CisKKwkJCQkvKioKKwkJCQkgKiBDbGVhciB0aGUgZmxhZ3MgYXMgdGhlIGJsb2NrIGRvZXNuJ3QgaGF2ZSB0bworCQkJCSAqIGJlIHByb2dyYW1tZWQgaW4gZWFjaCBjb21taXQgaWYgbm8gdXBkYXRlcworCQkJCSAqLworCQkJCWNmZy0+ZmxhZ3MgJj0gflNERV9EUk1fREVTVFNDQUxFUl9TQ0FMRV9VUERBVEU7CisJCQkJY2ZnLT5mbGFncyAmPQorCQkJCQl+U0RFX0RSTV9ERVNUU0NBTEVSX0VOSEFOQ0VSX1VQREFURTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIERlc3Qgc2NhbGVyIHNoYXJlcyB0aGUgZmx1c2ggYml0IG9mIHRoZSBMTSBpbiBjb250cm9sCisJCQkgKi8KKwkJCWlmIChjZmctPnNldF9sbV9mbHVzaCAmJiBod19sbSAmJiBod19jdGwgJiYKKwkJCQlod19jdGwtPm9wcy5nZXRfYml0bWFza19taXhlcikgeworCQkJCWZsdXNoX21hc2sgPSBod19jdGwtPm9wcy5nZXRfYml0bWFza19taXhlcigKKwkJCQkJCWh3X2N0bCwgaHdfbG0tPmlkeCk7CisJCQkJU0RFX0RFQlVHKCJTZXQgbG1bJWRdIGZsdXNoID0gJWQiLAorCQkJCQlod19sbS0+aWR4LCBmbHVzaF9tYXNrKTsKKwkJCQlod19jdGwtPm9wcy51cGRhdGVfcGVuZGluZ19mbHVzaChod19jdGwsCisJCQkJCQkJCWZsdXNoX21hc2spOworCQkJfQorCQkJY2ZnLT5zZXRfbG1fZmx1c2ggPSBmYWxzZTsKKwkJfQorCQljc3RhdGUtPmRzX2RpcnR5ID0gZmFsc2U7CisJfQorfQorCiB2b2lkIHNkZV9jcnRjX3ByZXBhcmVfY29tbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJc3RydWN0IGRybV9jcnRjX3N0YXRlICpvbGRfc3RhdGUpCiB7CkBAIC0yMDI2LDYgKzIxNjMsNDcgQEAKIAlTREVfQVRSQUNFX0VORCgic2lnbmFsX3JldGlyZV9mZW5jZSIpOwogfQogCisvKiBfc2RlX2NydGNfaWRsZV9ub3RpZnkgLSBzaWduYWwgaWRsZSB0aW1lb3V0IHRvIGNsaWVudCAqLworc3RhdGljIHZvaWQgX3NkZV9jcnRjX2lkbGVfbm90aWZ5KHN0cnVjdCBzZGVfY3J0YyAqc2RlX2NydGMpCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCXN0cnVjdCBkcm1fZXZlbnQgZXZlbnQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXNkZV9jcnRjKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBzZGUgY3J0Y1xuIik7CisJCXJldHVybjsKKwl9CisKKwljcnRjID0gJnNkZV9jcnRjLT5iYXNlOworCWV2ZW50LnR5cGUgPSBEUk1fRVZFTlRfSURMRV9OT1RJRlk7CisJZXZlbnQubGVuZ3RoID0gc2l6ZW9mKHUzMik7CisJbXNtX21vZGVfb2JqZWN0X2V2ZW50X25vdGlmeSgmY3J0Yy0+YmFzZSwgY3J0Yy0+ZGV2LCAmZXZlbnQsCisJCQkJCQkJCSh1OCAqKSZyZXQpOworCisJU0RFX0RFQlVHKCJjcnRjOiVkIGlkbGUgdGltZW91dCBub3RpZmllZFxuIiwgY3J0Yy0+YmFzZS5pZCk7Cit9CisKKy8qCisgKiBzZGVfY3J0Y19oYW5kbGVfZXZlbnQgLSBjcnRjIGZyYW1lIGV2ZW50IGhhbmRsZS4KKyAqIFRoaXMgQVBJIG11c3QgbWFuYWdlIG9ubHkgbm9uLUlSUSBjb250ZXh0IGV2ZW50cy4KKyAqLworc3RhdGljIGJvb2wgX3NkZV9jcnRjX2hhbmRsZV9ldmVudChzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjLCB1MzIgZXZlbnQpCit7CisJYm9vbCBldmVudF9wcm9jZXNzZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIGlkbGUgZXZlbnRzIGFyZSBvcmlnaW5hdGVkIGZyb20gY29tbWl0IHRocmVhZCBhbmQgY2FuIGJlIHByb2Nlc3NlZAorCSAqIGluIHNhbWUgY29udGV4dAorCSAqLworCWlmIChldmVudCAmIFNERV9FTkNPREVSX0ZSQU1FX0VWRU5UX0lETEUpIHsKKwkJX3NkZV9jcnRjX2lkbGVfbm90aWZ5KHNkZV9jcnRjKTsKKwkJZXZlbnRfcHJvY2Vzc2VkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZXZlbnRfcHJvY2Vzc2VkOworfQorCiBzdGF0aWMgdm9pZCBzZGVfY3J0Y19mcmFtZV9ldmVudF93b3JrKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCiB7CiAJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdjsKQEAgLTIxMTksNiArMjI5NywxNSBAQAogCVNERV9BVFJBQ0VfRU5EKCJjcnRjX2ZyYW1lX2V2ZW50Iik7CiB9CiAKKy8qCisgKiBzZGVfY3J0Y19mcmFtZV9ldmVudF9jYiAtIGNydGMgZnJhbWUgZXZlbnQgY2FsbGJhY2sgQVBJLiBDUlRDIG1vZHVsZQorICogcmVnaXN0ZXJzIHRoaXMgQVBJIHRvIGVuY29kZXIgZm9yIGFsbCBmcmFtZSBldmVudCBjYWxsYmFja3MgbGlrZQorICogcmVsZWFzZV9mZW5jZSwgcmV0aXJlX2ZlbmNlLCBmcmFtZV9lcnJvciwgZnJhbWVfZG9uZSwgaWRsZV90aW1lb3V0LAorICogZXRjLiBFbmNvZGVyIG1heSBjYWxsIGRpZmZlcmVudCBldmVudHMgZnJvbSBkaWZmZXJlbnQgY29udGV4dCAtIElSUSwKKyAqIHVzZXIgdGhyZWFkLCBjb21taXRfdGhyZWFkLCBldGMuIEVhY2ggZXZlbnQgc2hvdWxkIGJlIGNhcmVmdWxseQorICogcmV2aWV3ZWQgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgaW4gcHJvcGVyIHRhc2sgY29udGV4dCB0byBhdm9pZCBzY2hlZHVsaW5nCisgKiBkZWxheSBvciBwcm9wZXJseSBtYW5hZ2UgdGhlIGlycSBjb250ZXh0J3MgYm90dG9tIGhhbGYgcHJvY2Vzc2luZy4KKyAqLwogc3RhdGljIHZvaWQgc2RlX2NydGNfZnJhbWVfZXZlbnRfY2Iodm9pZCAqZGF0YSwgdTMyIGV2ZW50KQogewogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IChzdHJ1Y3QgZHJtX2NydGMgKilkYXRhOwpAQCAtMjEyNyw2ICsyMzE0LDcgQEAKIAlzdHJ1Y3Qgc2RlX2NydGNfZnJhbWVfZXZlbnQgKmZldmVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjcnRjX2lkOworCWJvb2wgZXZlbnRfcHJvY2Vzc2VkID0gZmFsc2U7CiAKIAlpZiAoIWNydGMgfHwgIWNydGMtPmRldiB8fCAhY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlTREVfRVJST1IoImludmFsaWQgcGFyYW1ldGVyc1xuIik7CkBAIC0yMTM5LDYgKzIzMjcsMTEgQEAKIAlTREVfREVCVUcoImNydGMlZFxuIiwgY3J0Yy0+YmFzZS5pZCk7CiAJU0RFX0VWVDMyX1ZFUkJPU0UoRFJNSUQoY3J0YyksIGV2ZW50KTsKIAorCS8qIHRyeSB0byBwcm9jZXNzIHRoZSBldmVudCBpbiBjYWxsZXIgY29udGV4dCAqLworCWV2ZW50X3Byb2Nlc3NlZCA9IF9zZGVfY3J0Y19oYW5kbGVfZXZlbnQoc2RlX2NydGMsIGV2ZW50KTsKKwlpZiAoZXZlbnRfcHJvY2Vzc2VkKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2RlX2NydGMtPnNwaW5fbG9jaywgZmxhZ3MpOwogCWZldmVudCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmc2RlX2NydGMtPmZyYW1lX2V2ZW50X2xpc3QsCiAJCQlzdHJ1Y3Qgc2RlX2NydGNfZnJhbWVfZXZlbnQsIGxpc3QpOwpAQCAtMjE3OSw2ICsyMzcyLDI0IEBACiAJCXNkZV9jcnRjX3NlY3VyZV9jdHJsKGNydGMsIHRydWUpOwogfQogCisvKiBfc2RlX2NydGNfc2V0X2lkbGVfdGltZW91dCAtIHVwZGF0ZSBpZGxlIHRpbWVvdXQgd2FpdCBkdXJhdGlvbiAqLworc3RhdGljIHZvaWQgX3NkZV9jcnRjX3NldF9pZGxlX3RpbWVvdXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1NjQgdmFsKQoreworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCWlmICghY3J0YykgeworCQlTREVfRVJST1IoImludmFsaWQgY3J0Y1xuIik7CisJCXJldHVybjsKKwl9CisKKwlkcm1fZm9yX2VhY2hfZW5jb2RlcihlbmNvZGVyLCBjcnRjLT5kZXYpIHsKKwkJaWYgKGVuY29kZXItPmNydGMgIT0gY3J0YykKKwkJCWNvbnRpbnVlOworCisJCXNkZV9lbmNvZGVyX3NldF9pZGxlX3RpbWVvdXQoZW5jb2RlciwgKHUzMikgdmFsKTsKKwl9Cit9CisKIC8qKgogICogX3NkZV9jcnRjX3NldF9pbnB1dF9mZW5jZV90aW1lb3V0IC0gdXBkYXRlIG5zIHZlcnNpb24gb2YgaW4gZmVuY2UgdGltZW91dAogICogQGNzdGF0ZTogUG9pbnRlciB0byBzZGUgY3J0YyBzdGF0ZQpAQCAtMjIwMCw3ICsyNDExLDcgQEAKICAqIEB1c2VyX3B0cjogICAgVXNlciBwdHIgZm9yIHNkZV9kcm1fZGltX2xheWVyX3YxIHN0cnVjdAogICovCiBzdGF0aWMgdm9pZCBfc2RlX2NydGNfc2V0X2RpbV9sYXllcl92MShzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZSwKLQkJdm9pZCAqdXNyX3B0cikKKwkJdm9pZCBfX3VzZXIgKnVzcl9wdHIpCiB7CiAJc3RydWN0IHNkZV9kcm1fZGltX2xheWVyX3YxIGRpbV9sYXllcl92MTsKIAlzdHJ1Y3Qgc2RlX2RybV9kaW1fbGF5ZXJfY2ZnICp1c2VyX2NmZzsKQEAgLTIyNjIsNiArMjQ3MywzNjMgQEAKIH0KIAogLyoqCisgKiBfc2RlX2NydGNfZGVzdF9zY2FsZXJfaW5pdCAtIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2NhbGVyIGx1dAorICogQHNkZV9jcnRjICAgIDogIFBvaW50ZXIgdG8gc2RlIGNydGMKKyAqIEBjYXRhbG9nIDogIFBvaW50ZXIgdG8gbWRzcyBjYXRhbG9nIGluZm8KKyAqLworc3RhdGljIHZvaWQgX3NkZV9jcnRjX2Rlc3Rfc2NhbGVyX2luaXQoc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YywKKwkJCQlzdHJ1Y3Qgc2RlX21kc3NfY2ZnICpjYXRhbG9nKQoreworCWlmICghc2RlX2NydGMgfHwgIWNhdGFsb2cpCisJCXJldHVybjsKKworCWlmICghY2F0YWxvZy0+bWRwWzBdLmhhc19kZXN0X3NjYWxlcikgeworCQlTREVfREVCVUcoImRlc3Qgc2NhbGVyIGZlYXR1cmUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZGVfY3J0Yy0+c2NsM19sdXRfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNkZV9od19zY2FsZXIzX2x1dF9jZmcpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghc2RlX2NydGMtPnNjbDNfbHV0X2NmZykKKwkJU0RFX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHNjYWxlIExVVCBmb3IgZGVzdCBzY2FsZXIiKTsKK30KKworLyoqCisgKiBfc2RlX2NydGNfc2V0X2Rlc3Rfc2NhbGVyIC0gY29weSBkZXN0IHNjYWxlciBzZXR0aW5ncyBmcm9tIHVzZXJzcGFjZQorICogQHNkZV9jcnRjICAgOiAgUG9pbnRlciB0byBzZGUgY3J0YworICogQGNzdGF0ZSA6ICBQb2ludGVyIHRvIHNkZSBjcnRjIHN0YXRlCisgKiBAdXNyX3B0cjogIFVzZXIgcHRyIGZvciBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2RhdGEgc3RydWN0CisgKi8KK3N0YXRpYyBpbnQgX3NkZV9jcnRjX3NldF9kZXN0X3NjYWxlcihzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjLAorCQkJCXN0cnVjdCBzZGVfY3J0Y19zdGF0ZSAqY3N0YXRlLAorCQkJCXZvaWQgX191c2VyICp1c3JfcHRyKQoreworCXN0cnVjdCBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2RhdGEgZHNfZGF0YTsKKwlzdHJ1Y3Qgc2RlX2RybV9kZXN0X3NjYWxlcl9jZmcgKmRzX2NmZ191c3I7CisJc3RydWN0IHNkZV9kcm1fc2NhbGVyX3YyIHNjYWxlcl92MjsKKwl2b2lkIF9fdXNlciAqc2NhbGVyX3YyX3VzcjsKKwlpbnQgaSwgY291bnQsIHJldCA9IDA7CisKKwlpZiAoIXNkZV9jcnRjIHx8ICFjc3RhdGUpIHsKKwkJU0RFX0VSUk9SKCJpbnZhbGlkIHNkZV9jcnRjL3N0YXRlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJU0RFX0RFQlVHKCJjcnRjICVzXG4iLCBzZGVfY3J0Yy0+bmFtZSk7CisKKwljc3RhdGUtPm51bV9kcyA9IDA7CisJY3N0YXRlLT5kc19kaXJ0eSA9IGZhbHNlOworCWlmICghdXNyX3B0cikgeworCQlTREVfREVCVUcoImRzIGRhdGEgcmVtb3ZlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmZHNfZGF0YSwgdXNyX3B0ciwgc2l6ZW9mKGRzX2RhdGEpKSkgeworCQlTREVfRVJST1IoImZhaWxlZCB0byBjb3B5IGRlc3Qgc2NhbGVyIGRhdGEgZnJvbSB1c2VyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY291bnQgPSBkc19kYXRhLm51bV9kZXN0X3NjYWxlcjsKKwlpZiAoIXNkZV9jcnRjLT5udW1fbWl4ZXJzIHx8IGNvdW50ID4gc2RlX2NydGMtPm51bV9taXhlcnMgfHwKKwkJKGNvdW50ICYmIChjb3VudCAhPSBzZGVfY3J0Yy0+bnVtX21peGVycykgJiYKKwkJIShkc19kYXRhLmRzX2NmZ1swXS5mbGFncyAmIFNERV9EUk1fREVTVFNDQUxFUl9QVV9FTkFCTEUpKSkgeworCQlTREVfRVJST1IoImludmFsaWQgY29uZmlnOm51bSBkcyglZCksIG1peGVycyglZCksZmxhZ3MoJWQpXG4iLAorCQkJY291bnQsIHNkZV9jcnRjLT5udW1fbWl4ZXJzLCBkc19kYXRhLmRzX2NmZ1swXS5mbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBvcHVsYXRlIGZyb20gdXNlciBzcGFjZSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRzX2NmZ191c3IgPSAmZHNfZGF0YS5kc19jZmdbaV07CisKKwkJY3N0YXRlLT5kc19jZmdbaV0ubmR4ID0gZHNfY2ZnX3Vzci0+aW5kZXg7CisJCWNzdGF0ZS0+ZHNfY2ZnW2ldLmZsYWdzID0gZHNfY2ZnX3Vzci0+ZmxhZ3M7CisJCWNzdGF0ZS0+ZHNfY2ZnW2ldLmxtX3dpZHRoID0gZHNfY2ZnX3Vzci0+bG1fd2lkdGg7CisJCWNzdGF0ZS0+ZHNfY2ZnW2ldLmxtX2hlaWdodCA9IGRzX2NmZ191c3ItPmxtX2hlaWdodDsKKwkJY3N0YXRlLT5kc19jZmdbaV0uc2NsM19jZmcgPSBOVUxMOworCisJCWlmIChkc19jZmdfdXNyLT5zY2FsZXJfY2ZnKSB7CisJCQlzY2FsZXJfdjJfdXNyID0KKwkJCSh2b2lkIF9fdXNlciAqKSgodWludHB0cl90KWRzX2NmZ191c3ItPnNjYWxlcl9jZmcpOworCisJCQltZW1zZXQoJnNjYWxlcl92MiwgMCwgc2l6ZW9mKHNjYWxlcl92MikpOworCisJCQljc3RhdGUtPmRzX2NmZ1tpXS5zY2wzX2NmZyA9CisJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyksCisJCQkJCUdGUF9LRVJORUwpOworCisJCQlpZiAoIWNzdGF0ZS0+ZHNfY2ZnW2ldLnNjbDNfY2ZnKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzY2FsZXJfdjIsIHNjYWxlcl92Ml91c3IsCisJCQkJCXNpemVvZihzY2FsZXJfdjIpKSkgeworCQkJCVNERV9FUlJPUigic2NhbGUgZGF0YTpjb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCXNkZV9zZXRfc2NhbGVyX3YyKGNzdGF0ZS0+ZHNfY2ZnW2ldLnNjbDNfY2ZnLAorCQkJCQkmc2NhbGVyX3YyKTsKKworCQkJU0RFX0RFQlVHKCJlbiglZClkaXIoJWQpZGUoJWQpIHNyYyglZHglZCkgZHN0KCVkeCVkKVxuIiwKKwkJCQlzY2FsZXJfdjIuZW5hYmxlLCBzY2FsZXJfdjIuZGlyX2VuLAorCQkJCXNjYWxlcl92Mi5kZS5lbmFibGUsIHNjYWxlcl92Mi5zcmNfd2lkdGhbMF0sCisJCQkJc2NhbGVyX3YyLnNyY19oZWlnaHRbMF0sIHNjYWxlcl92Mi5kc3Rfd2lkdGgsCisJCQkJc2NhbGVyX3YyLmRzdF9oZWlnaHQpOworCQkJU0RFX0VWVDMyX1ZFUkJPU0UoRFJNSUQoJnNkZV9jcnRjLT5iYXNlKSwKKwkJCQlzY2FsZXJfdjIuZW5hYmxlLCBzY2FsZXJfdjIuZGlyX2VuLAorCQkJCXNjYWxlcl92Mi5kZS5lbmFibGUsIHNjYWxlcl92Mi5zcmNfd2lkdGhbMF0sCisJCQkJc2NhbGVyX3YyLnNyY19oZWlnaHRbMF0sIHNjYWxlcl92Mi5kc3Rfd2lkdGgsCisJCQkJc2NhbGVyX3YyLmRzdF9oZWlnaHQpOworCQl9CisKKwkJU0RFX0RFQlVHKCJkcyBjZmdbJWRdLW5keCglZCkgZmxhZ3MoJWQpIGxtKCVkeCVkKVxuIiwKKwkJCWksIGRzX2NmZ191c3ItPmluZGV4LCBkc19jZmdfdXNyLT5mbGFncywKKwkJCWRzX2NmZ191c3ItPmxtX3dpZHRoLCBkc19jZmdfdXNyLT5sbV9oZWlnaHQpOworCQlTREVfRVZUMzJfVkVSQk9TRShEUk1JRCgmc2RlX2NydGMtPmJhc2UpLCBpLCBkc19jZmdfdXNyLT5pbmRleCwKKwkJCWRzX2NmZ191c3ItPmZsYWdzLCBkc19jZmdfdXNyLT5sbV93aWR0aCwKKwkJCWRzX2NmZ191c3ItPmxtX2hlaWdodCk7CisJfQorCisJY3N0YXRlLT5udW1fZHMgPSBjb3VudDsKKwljc3RhdGUtPmRzX2RpcnR5ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWZvciAoOyBpID49IDA7IGktLSkKKwkJa2ZyZWUoY3N0YXRlLT5kc19jZmdbaV0uc2NsM19jZmcpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBfc2RlX2NydGNfY2hlY2tfZGVzdF9zY2FsZXJfZGF0YSAtIHZhbGlkYXRlIHRoZSBkZXN0IHNjYWxlciBkYXRhCisgKiBAY3J0YyAgOiAgUG9pbnRlciB0byBkcm0gY3J0YworICogQHN0YXRlIDogIFBvaW50ZXIgdG8gZHJtIGNydGMgc3RhdGUKKyAqLworc3RhdGljIGludCBfc2RlX2NydGNfY2hlY2tfZGVzdF9zY2FsZXJfZGF0YShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJc3RydWN0IGRybV9jcnRjX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjOworCXN0cnVjdCBzZGVfY3J0Y19zdGF0ZSAqY3N0YXRlOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCXN0cnVjdCBzZGVfa21zICprbXM7CisJc3RydWN0IHNkZV9od19kcyAqaHdfZHM7CisJc3RydWN0IHNkZV9od19kc19jZmcgKmNmZzsKKwl1MzIgaSwgcmV0ID0gMCwgbG1faWR4OworCXUzMiBudW1fZHNfZW5hYmxlID0gMDsKKwl1MzIgbWF4X2luX3dpZHRoID0gMCwgbWF4X291dF93aWR0aCA9IDA7CisJdTMyIHByZXZfbG1fd2lkdGggPSAwLCBwcmV2X2xtX2hlaWdodCA9IDA7CisKKwlpZiAoIWNydGMgfHwgIXN0YXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNkZV9jcnRjID0gdG9fc2RlX2NydGMoY3J0Yyk7CisJY3N0YXRlID0gdG9fc2RlX2NydGNfc3RhdGUoc3RhdGUpOworCWttcyA9IF9zZGVfY3J0Y19nZXRfa21zKGNydGMpOworCW1vZGUgPSAmc3RhdGUtPmFkanVzdGVkX21vZGU7CisKKwlTREVfREVCVUcoImNydGMlZFxuIiwgY3J0Yy0+YmFzZS5pZCk7CisKKwlpZiAoIWNzdGF0ZS0+ZHNfZGlydHkgJiYgIWNzdGF0ZS0+bnVtX2RzX2VuYWJsZWQpIHsKKwkJU0RFX0RFQlVHKCJkZXN0IHNjYWxlciBwcm9wZXJ0eSBub3Qgc2V0LCBza2lwIHZhbGlkYXRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWttcyB8fCAha21zLT5jYXRhbG9nKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBwYXJhbWV0ZXJzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFrbXMtPmNhdGFsb2ctPm1kcFswXS5oYXNfZGVzdF9zY2FsZXIpIHsKKwkJU0RFX0RFQlVHKCJkZXN0IHNjYWxlciBmZWF0dXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXNkZV9jcnRjLT5udW1fbWl4ZXJzKSB7CisJCVNERV9FUlJPUigibWl4ZXJzIG5vdCBhbGxvY2F0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiBzdWZmaWNpZW50IGh3IHJlc291cmNlcyBhcmUKKwkgKiBhdmFpbGFibGUgYXMgcGVyIHRhcmdldCBjYXBzICYgdG9wb2xvZ3kKKwkgKi8KKwlpZiAoc2RlX2NydGMtPm51bV9taXhlcnMgPiBDUlRDX0RVQUxfTUlYRVJTKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBjb25maWc6IG1peGVycyglZCkgbWF4KCVkKVxuIiwKKwkJCXNkZV9jcnRjLT5udW1fbWl4ZXJzLCBDUlRDX0RVQUxfTUlYRVJTKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNkZV9jcnRjLT5udW1fbWl4ZXJzOyBpKyspIHsKKwkJaWYgKCFzZGVfY3J0Yy0+bWl4ZXJzW2ldLmh3X2xtIHx8ICFzZGVfY3J0Yy0+bWl4ZXJzW2ldLmh3X2RzKSB7CisJCQlTREVfRVJST1IoImluc3VmZmljaWVudCBIVyByZXNvdXJjZXMgYWxsb2NhdGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrIGlmIERTIG5lZWRzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKwkgKiBJbiBjYXNlIG9mIGVuYWJsZSwgdmFsaWRhdGUgdGhlIGRhdGEKKwkgKi8KKwlpZiAoIWNzdGF0ZS0+ZHNfZGlydHkgfHwgIWNzdGF0ZS0+bnVtX2RzIHx8CisJCSEoY3N0YXRlLT5kc19jZmdbMF0uZmxhZ3MgJiBTREVfRFJNX0RFU1RTQ0FMRVJfRU5BQkxFKSkgeworCQlTREVfREVCVUcoImRpc2FibGUgZGVzdCBzY2FsZXIsZGlydHkoJWQpbnVtKCVkKWZsYWdzKCVkKVxuIiwKKwkJCWNzdGF0ZS0+ZHNfZGlydHksIGNzdGF0ZS0+bnVtX2RzLAorCQkJY3N0YXRlLT5kc19jZmdbMF0uZmxhZ3MpOworCQlnb3RvIGRpc2FibGU7CisJfQorCisJLyoqCisJICogTm8gb2YgZGVzdCBzY2FsZXJzIHNob3VsZG4ndCBleGNlZWQgaHcgZHMgYmxvY2sgY291bnQgYW5kCisJICogYWxzbywgbWF0Y2ggdGhlIG51bSBvZiBtaXhlcnMgdW5sZXNzIGl0IGlzIHBhcnRpYWwgdXBkYXRlCisJICogbGVmdCBvbmx5L3JpZ2h0IG9ubHkgdXNlIGNhc2UgLSBjdXJyZW50bHkgUFUgKyBEUyBpcyBub3Qgc3VwcG9ydGVkCisJICovCisJaWYgKGNzdGF0ZS0+bnVtX2RzID4ga21zLT5jYXRhbG9nLT5kc19jb3VudCB8fAorCQkoKGNzdGF0ZS0+bnVtX2RzICE9IHNkZV9jcnRjLT5udW1fbWl4ZXJzKSAmJgorCQkhKGNzdGF0ZS0+ZHNfY2ZnWzBdLmZsYWdzICYgU0RFX0RSTV9ERVNUU0NBTEVSX1BVX0VOQUJMRSkpKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBjZmc6IG51bV9kcyglZCksIGh3X2RzX2NudCglZCkgZmxhZ3MoJWQpXG4iLAorCQkJY3N0YXRlLT5udW1fZHMsIGttcy0+Y2F0YWxvZy0+ZHNfY291bnQsCisJCQljc3RhdGUtPmRzX2NmZ1swXS5mbGFncyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFZhbGlkYXRlIHRoZSBEUyBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IGNzdGF0ZS0+bnVtX2RzOyBpKyspIHsKKwkJY2ZnID0gJmNzdGF0ZS0+ZHNfY2ZnW2ldOworCQlsbV9pZHggPSBjZmctPm5keDsKKworCQkvKioKKwkJICogVmFsaWRhdGUgYWdhaW5zdCB0b3BvbG9neQorCQkgKiBObyBvZiBkZXN0IHNjYWxlcnMgc2hvdWxkIG1hdGNoIHRoZSBudW0gb2YgbWl4ZXJzCisJCSAqIHVubGVzcyBpdCBpcyBwYXJ0aWFsIHVwZGF0ZSBsZWZ0IG9ubHkvcmlnaHQgb25seSB1c2UgY2FzZQorCQkgKi8KKwkJaWYgKGxtX2lkeCA+PSBzZGVfY3J0Yy0+bnVtX21peGVycyB8fCAoaSAhPSBsbV9pZHggJiYKKwkJCSEoY2ZnLT5mbGFncyAmIFNERV9EUk1fREVTVFNDQUxFUl9QVV9FTkFCTEUpKSkgeworCQkJU0RFX0VSUk9SKCJpbnZhbGlkIHVzZXIgZGF0YSglZCk6aWR4KCVkKSwgZmxhZ3MoJWQpXG4iLAorCQkJCWksIGxtX2lkeCwgY2ZnLT5mbGFncyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKworCQlod19kcyA9IHNkZV9jcnRjLT5taXhlcnNbbG1faWR4XS5od19kczsKKworCQlpZiAoIW1heF9pbl93aWR0aCAmJiAhbWF4X291dF93aWR0aCkgeworCQkJbWF4X2luX3dpZHRoID0gaHdfZHMtPnNjbC0+dG9wLT5tYXhpbnB1dHdpZHRoOworCQkJbWF4X291dF93aWR0aCA9IGh3X2RzLT5zY2wtPnRvcC0+bWF4b3V0cHV0d2lkdGg7CisKKwkJCWlmIChjc3RhdGUtPm51bV9kcyA9PSBDUlRDX0RVQUxfTUlYRVJTKQorCQkJCW1heF9pbl93aWR0aCAtPSBTREVfRFNfT1ZFUkZFVENIX1NJWkU7CisKKwkJCVNERV9ERUJVRygibWF4IERTIHdpZHRoIFslZCwlZF0gZm9yIG51bV9kcyA9ICVkXG4iLAorCQkJCW1heF9pbl93aWR0aCwgbWF4X291dF93aWR0aCwgY3N0YXRlLT5udW1fZHMpOworCQl9CisKKwkJLyogQ2hlY2sgTE0gd2lkdGggYW5kIGhlaWdodCAqLworCQlpZiAoY2ZnLT5sbV93aWR0aCA+IChtb2RlLT5oZGlzcGxheS9zZGVfY3J0Yy0+bnVtX21peGVycykgfHwKKwkJCWNmZy0+bG1faGVpZ2h0ID4gbW9kZS0+dmRpc3BsYXkgfHwKKwkJCSFjZmctPmxtX3dpZHRoIHx8ICFjZmctPmxtX2hlaWdodCkgeworCQkJU0RFX0VSUk9SKCJpbnZhbGlkIGxtIHNpemVbJWQsJWRdIGRpc3BsYXkgWyVkLCVkXVxuIiwKKwkJCQljZmctPmxtX3dpZHRoLAorCQkJCWNmZy0+bG1faGVpZ2h0LAorCQkJCW1vZGUtPmhkaXNwbGF5L3NkZV9jcnRjLT5udW1fbWl4ZXJzLAorCQkJCW1vZGUtPnZkaXNwbGF5KTsKKwkJCXJldCA9IC1FMkJJRzsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJaWYgKCFwcmV2X2xtX3dpZHRoICYmICFwcmV2X2xtX2hlaWdodCkgeworCQkJcHJldl9sbV93aWR0aCA9IGNmZy0+bG1fd2lkdGg7CisJCQlwcmV2X2xtX2hlaWdodCA9IGNmZy0+bG1faGVpZ2h0OworCQl9IGVsc2UgeworCQkJaWYgKGNmZy0+bG1fd2lkdGggIT0gcHJldl9sbV93aWR0aCB8fAorCQkJCWNmZy0+bG1faGVpZ2h0ICE9IHByZXZfbG1faGVpZ2h0KSB7CisJCQkJU0RFX0VSUk9SKCJsbSBzaXplOmxlZnRbJWQsJWRdLCByaWdodFslZCAlZF1cbiIsCisJCQkJCWNmZy0+bG1fd2lkdGgsIGNmZy0+bG1faGVpZ2h0LAorCQkJCQlwcmV2X2xtX3dpZHRoLCBwcmV2X2xtX2hlaWdodCk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIHNjYWxlciBkYXRhICovCisJCWlmIChjZmctPmZsYWdzICYgU0RFX0RSTV9ERVNUU0NBTEVSX1NDQUxFX1VQREFURSB8fAorCQkJY2ZnLT5mbGFncyAmIFNERV9EUk1fREVTVFNDQUxFUl9FTkhBTkNFUl9VUERBVEUpIHsKKwkJCWlmICghY2ZnLT5zY2wzX2NmZykgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJU0RFX0VSUk9SKCJudWxsIHNjYWxlIGRhdGFcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJaWYgKGNmZy0+c2NsM19jZmctPnNyY193aWR0aFswXSA+IG1heF9pbl93aWR0aCB8fAorCQkJCWNmZy0+c2NsM19jZmctPmRzdF93aWR0aCA+IG1heF9vdXRfd2lkdGggfHwKKwkJCQkhY2ZnLT5zY2wzX2NmZy0+c3JjX3dpZHRoWzBdIHx8CisJCQkJIWNmZy0+c2NsM19jZmctPmRzdF93aWR0aCkgeworCQkJCVNERV9FUlJPUigic2NhbGUgd2lkdGgoJWQgJWQpIGZvciBkcy0lZDpcbiIsCisJCQkJCWNmZy0+c2NsM19jZmctPnNyY193aWR0aFswXSwKKwkJCQkJY2ZnLT5zY2wzX2NmZy0+ZHN0X3dpZHRoLAorCQkJCQlod19kcy0+aWR4IC0gRFNfMCk7CisJCQkJU0RFX0VSUk9SKCJzY2FsZV9lbiA9ICVkLCBERV9lbiA9JWRcbiIsCisJCQkJCWNmZy0+c2NsM19jZmctPmVuYWJsZSwKKwkJCQkJY2ZnLT5zY2wzX2NmZy0+ZGUuZW5hYmxlKTsKKworCQkJCWNmZy0+ZmxhZ3MgJj0KKwkJCQkJflNERV9EUk1fREVTVFNDQUxFUl9TQ0FMRV9VUERBVEU7CisJCQkJY2ZnLT5mbGFncyAmPQorCQkJCQl+U0RFX0RSTV9ERVNUU0NBTEVSX0VOSEFOQ0VSX1VQREFURTsKKworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT5mbGFncyAmIFNERV9EUk1fREVTVFNDQUxFUl9FTkFCTEUpCisJCQludW1fZHNfZW5hYmxlKys7CisKKwkJLyoqCisJCSAqIFZhbGlkYXRpb24gc3VjY2Vzc2Z1bCwgaW5kaWNhdG9yIGZvciBmbHVzaCB0byBiZSBpc3N1ZWQKKwkJICovCisJCWNmZy0+c2V0X2xtX2ZsdXNoID0gdHJ1ZTsKKworCQlTREVfREVCVUcoImRzWyVkXTogZmxhZ3MgPSAweCVYXG4iLAorCQkJaHdfZHMtPmlkeCAtIERTXzAsIGNmZy0+ZmxhZ3MpOworCX0KKworZGlzYWJsZToKKwlTREVfREVCVUcoImRlc3Qgc2NhbGVyIGVuYWJsZSBzdGF0dXMsIG9sZCA9ICVkLCBuZXcgPSAlZCIsCisJCWNzdGF0ZS0+bnVtX2RzX2VuYWJsZWQsIG51bV9kc19lbmFibGUpOworCVNERV9FVlQzMihEUk1JRChjcnRjKSwgY3N0YXRlLT5udW1fZHNfZW5hYmxlZCwgbnVtX2RzX2VuYWJsZSwKKwkJY3N0YXRlLT5kc19kaXJ0eSk7CisKKwlpZiAoY3N0YXRlLT5udW1fZHNfZW5hYmxlZCAhPSBudW1fZHNfZW5hYmxlKSB7CisJCS8qIERpc2FibGluZyBkZXN0aW5hdGlvbiBzY2FsZXIgKi8KKwkJaWYgKCFudW1fZHNfZW5hYmxlKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2RlX2NydGMtPm51bV9taXhlcnM7IGkrKykgeworCQkJCWNmZyA9ICZjc3RhdGUtPmRzX2NmZ1tpXTsKKwkJCQljZmctPm5keCA9IGk7CisJCQkJLyogVXBkYXRlIHNjYWxlciBzZXR0aW5ncyBpbiBkaXNhYmxlIGNhc2UgKi8KKwkJCQljZmctPmZsYWdzID0gU0RFX0RSTV9ERVNUU0NBTEVSX1NDQUxFX1VQREFURTsKKwkJCQljZmctPnNjbDNfY2ZnLT5lbmFibGUgPSAwOworCQkJCWNmZy0+c2NsM19jZmctPmRlLmVuYWJsZSA9IDA7CisJCQkJY2ZnLT5zZXRfbG1fZmx1c2ggPSB0cnVlOworCQkJfQorCQl9CisJCWNzdGF0ZS0+bnVtX2RzX2VuYWJsZWQgPSBudW1fZHNfZW5hYmxlOworCQljc3RhdGUtPmRzX2RpcnR5ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWNzdGF0ZS0+ZHNfZGlydHkgPSBmYWxzZTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIF9zZGVfY3J0Y193YWl0X2Zvcl9mZW5jZXMgLSB3YWl0IGZvciBpbmNvbWluZyBmcmFtZWJ1ZmZlciBzeW5jIGZlbmNlcwogICogQGNydGM6IFBvaW50ZXIgdG8gQ1JUQyBvYmplY3QKICAqLwpAQCAtMjMxOCwxMSArMjg4NiwxMiBAQAogCXN0cnVjdCBzZGVfY3J0Y19taXhlciAqbWl4ZXI7CiAJc3RydWN0IHNkZV9od19jdGwgKmxhc3RfdmFsaWRfY3RsID0gTlVMTDsKIAlpbnQgaTsKLQlzdHJ1Y3Qgc2RlX3JtX2h3X2l0ZXIgbG1faXRlciwgY3RsX2l0ZXIsIGRzcHBfaXRlcjsKKwlzdHJ1Y3Qgc2RlX3JtX2h3X2l0ZXIgbG1faXRlciwgY3RsX2l0ZXIsIGRzcHBfaXRlciwgZHNfaXRlcjsKIAogCXNkZV9ybV9pbml0X2h3X2l0ZXIoJmxtX2l0ZXIsIGVuYy0+YmFzZS5pZCwgU0RFX0hXX0JMS19MTSk7CiAJc2RlX3JtX2luaXRfaHdfaXRlcigmY3RsX2l0ZXIsIGVuYy0+YmFzZS5pZCwgU0RFX0hXX0JMS19DVEwpOwogCXNkZV9ybV9pbml0X2h3X2l0ZXIoJmRzcHBfaXRlciwgZW5jLT5iYXNlLmlkLCBTREVfSFdfQkxLX0RTUFApOworCXNkZV9ybV9pbml0X2h3X2l0ZXIoJmRzX2l0ZXIsIGVuYy0+YmFzZS5pZCwgU0RFX0hXX0JMS19EUyk7CiAKIAkvKiBTZXQgdXAgYWxsIHRoZSBtaXhlcnMgYW5kIGN0bHMgcmVzZXJ2ZWQgYnkgdGhpcyBlbmNvZGVyICovCiAJZm9yIChpID0gc2RlX2NydGMtPm51bV9taXhlcnM7IGkgPCBBUlJBWV9TSVpFKHNkZV9jcnRjLT5taXhlcnMpOyBpKyspIHsKQEAgLTIzNTMsNiArMjkyMiwxMCBAQAogCQkodm9pZCkgc2RlX3JtX2dldF9odyhybSwgJmRzcHBfaXRlcik7CiAJCW1peGVyLT5od19kc3BwID0gKHN0cnVjdCBzZGVfaHdfZHNwcCAqKWRzcHBfaXRlci5odzsKIAorCQkvKiBEUyBtYXkgYmUgbnVsbCAqLworCQkodm9pZCkgc2RlX3JtX2dldF9odyhybSwgJmRzX2l0ZXIpOworCQltaXhlci0+aHdfZHMgPSAoc3RydWN0IHNkZV9od19kcyAqKWRzX2l0ZXIuaHc7CisKIAkJbWl4ZXItPmVuY29kZXIgPSBlbmM7CiAKIAkJc2RlX2NydGMtPm51bV9taXhlcnMrKzsKQEAgLTIzNjAsNiArMjkzMyw5IEBACiAJCQkJaSwgbWl4ZXItPmh3X2xtLT5pZHggLSBMTV8wKTsKIAkJU0RFX0RFQlVHKCJzZXR1cCBtaXhlciAlZDogY3RsICVkXG4iLAogCQkJCWksIG1peGVyLT5od19jdGwtPmlkeCAtIENUTF8wKTsKKwkJaWYgKG1peGVyLT5od19kcykKKwkJCVNERV9ERUJVRygic2V0dXAgbWl4ZXIgJWQ6IGRzICVkXG4iLAorCQkJCWksIG1peGVyLT5od19kcy0+aWR4IC0gRFNfMCk7CiAJfQogfQogCkBAIC0yMzY5LDYgKzI5NDUsNyBAQAogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jOwogCiAJc2RlX2NydGMtPm51bV9taXhlcnMgPSAwOworCXNkZV9jcnRjLT5taXhlcnNfc3dhcHBlZCA9IGZhbHNlOwogCW1lbXNldChzZGVfY3J0Yy0+bWl4ZXJzLCAwLCBzaXplb2Yoc2RlX2NydGMtPm1peGVycykpOwogCiAJbXV0ZXhfbG9jaygmc2RlX2NydGMtPmNydGNfbG9jayk7CkBAIC0yNDE4LDEzICsyOTk1LDE0IEBACiAJY3N0YXRlID0gdG9fc2RlX2NydGNfc3RhdGUoc3RhdGUpOwogCiAJYWRqX21vZGUgPSAmc3RhdGUtPmFkanVzdGVkX21vZGU7Ci0JY3J0Y19zcGxpdF93aWR0aCA9IHNkZV9jcnRjX21peGVyX3dpZHRoKHNkZV9jcnRjLCBhZGpfbW9kZSk7CisJY3J0Y19zcGxpdF93aWR0aCA9IHNkZV9jcnRjX2dldF9taXhlcl93aWR0aChzZGVfY3J0YywgY3N0YXRlLCBhZGpfbW9kZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2RlX2NydGMtPm51bV9taXhlcnM7IGkrKykgewogCQljc3RhdGUtPmxtX2JvdW5kc1tpXS54ID0gY3J0Y19zcGxpdF93aWR0aCAqIGk7CiAJCWNzdGF0ZS0+bG1fYm91bmRzW2ldLnkgPSAwOwogCQljc3RhdGUtPmxtX2JvdW5kc1tpXS53ID0gY3J0Y19zcGxpdF93aWR0aDsKLQkJY3N0YXRlLT5sbV9ib3VuZHNbaV0uaCA9IGFkal9tb2RlLT52ZGlzcGxheTsKKwkJY3N0YXRlLT5sbV9ib3VuZHNbaV0uaCA9CisJCQlzZGVfY3J0Y19nZXRfbWl4ZXJfaGVpZ2h0KHNkZV9jcnRjLCBjc3RhdGUsIGFkal9tb2RlKTsKIAkJbWVtY3B5KCZjc3RhdGUtPmxtX3JvaVtpXSwgJmNzdGF0ZS0+bG1fYm91bmRzW2ldLAogCQkJCXNpemVvZihjc3RhdGUtPmxtX3JvaVtpXSkpOwogCQlTREVfRVZUMzJfVkVSQk9TRShEUk1JRChjcnRjKSwgaSwKQEAgLTI0OTQsMTMgKzMwNzIsOCBAQAogCWlmICh1bmxpa2VseSghc2RlX2NydGMtPm51bV9taXhlcnMpKQogCQlyZXR1cm47CiAKLQkvKiBjYW5jZWwgdGhlIGlkbGUgbm90aWZ5IGRlbGF5ZWQgd29yayAqLwotCWlmIChzZGVfZW5jb2Rlcl9jaGVja19tb2RlKHNkZV9jcnRjLT5taXhlcnNbMF0uZW5jb2RlciwKLQkJCQkJTVNNX0RJU1BMQVlfQ0FQX1ZJRF9NT0RFKSAmJgotCQlrdGhyZWFkX2NhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2RlX2NydGMtPmlkbGVfbm90aWZ5X3dvcmspKQotCQlTREVfREVCVUcoImlkbGUgbm90aWZ5IHdvcmsgY2FuY2VsbGVkXG4iKTsKLQogCV9zZGVfY3J0Y19ibGVuZF9zZXR1cChjcnRjKTsKKwlfc2RlX2NydGNfZGVzdF9zY2FsZXJfc2V0dXAoY3J0Yyk7CiAKIAkvKgogCSAqIFNpbmNlIENQIHByb3BlcnRpZXMgdXNlIEFYSSBidWZmZXIgdG8gcHJvZ3JhbSB0aGUKQEAgLTI1MDksNyArMzA4Miw3IEBACiAJICogYXBwbHkgY29sb3IgcHJvY2Vzc2luZyBwcm9wZXJ0aWVzIG9ubHkgaWYKIAkgKiBzbW11IHN0YXRlIGlzIGF0dGFjaGVkLAogCSAqLwotCWlmICgoc21tdV9zdGF0ZS0+c3RhdGUgIT0gREVUQUNIRUQpIHx8CisJaWYgKChzbW11X3N0YXRlLT5zdGF0ZSAhPSBERVRBQ0hFRCkgJiYKIAkJCShzbW11X3N0YXRlLT5zdGF0ZSAhPSBERVRBQ0hfQUxMX1JFUSkpCiAJCXNkZV9jcF9jcnRjX2FwcGx5X3Byb3BlcnRpZXMoY3J0Yyk7CiAKQEAgLTI1MzMsNyArMzEwNiw2IEBACiAJc3RydWN0IG1zbV9kcm1fdGhyZWFkICpldmVudF90aHJlYWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZTsKLQlpbnQgaWRsZV90aW1lID0gMDsKIAogCWlmICghY3J0YyB8fCAhY3J0Yy0+ZGV2IHx8ICFjcnRjLT5kZXYtPmRldl9wcml2YXRlKSB7CiAJCVNERV9FUlJPUigiaW52YWxpZCBjcnRjXG4iKTsKQEAgLTI1NTksNyArMzEzMSw2IEBACiAJfQogCiAJZXZlbnRfdGhyZWFkID0gJnByaXYtPmV2ZW50X3RocmVhZFtjcnRjLT5pbmRleF07Ci0JaWRsZV90aW1lID0gc2RlX2NydGNfZ2V0X3Byb3BlcnR5KGNzdGF0ZSwgQ1JUQ19QUk9QX0lETEVfVElNRSk7CiAKIAlpZiAoc2RlX2NydGMtPmV2ZW50KSB7CiAJCVNERV9ERUJVRygiYWxyZWFkeSByZWNlaXZlZCBzZGVfY3J0Yy0+ZXZlbnRcbiIpOwpAQCAtMjU5MCwxNSArMzE2MSw2IEBACiAJLyogd2FpdCBmb3IgYWNxdWlyZSBmZW5jZXMgYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgZG9uZSAqLwogCV9zZGVfY3J0Y193YWl0X2Zvcl9mZW5jZXMoY3J0Yyk7CiAKLQkvKiBzY2hlZHVsZSB0aGUgaWRsZSBub3RpZnkgZGVsYXllZCB3b3JrICovCi0JaWYgKGlkbGVfdGltZSAmJiBzZGVfZW5jb2Rlcl9jaGVja19tb2RlKHNkZV9jcnRjLT5taXhlcnNbMF0uZW5jb2RlciwKLQkJCQkJCU1TTV9ESVNQTEFZX0NBUF9WSURfTU9ERSkpIHsKLQkJa3RocmVhZF9xdWV1ZV9kZWxheWVkX3dvcmsoJmV2ZW50X3RocmVhZC0+d29ya2VyLAotCQkJCQkmc2RlX2NydGMtPmlkbGVfbm90aWZ5X3dvcmssCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoaWRsZV90aW1lKSk7Ci0JCVNERV9ERUJVRygic2NoZWR1bGUgaWRsZSBub3RpZnkgd29yayBpbiAlZG1zXG4iLCBpZGxlX3RpbWUpOwotCX0KLQogCWlmICghY3N0YXRlLT5yc2NfdXBkYXRlKSB7CiAJCWRybV9mb3JfZWFjaF9lbmNvZGVyKGVuY29kZXIsIGRldikgewogCQkJaWYgKGVuY29kZXItPmNydGMgIT0gY3J0YykKQEAgLTI2NjAsNyArMzIyMiw3IEBACiBzdGF0aWMgaW50IF9zZGVfY3J0Y193YWl0X2Zvcl9mcmFtZV9kb25lKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKIHsKIAlzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjOwotCWludCByZXQsIHJjID0gMDsKKwlpbnQgcmV0LCByYyA9IDAsIGk7CiAKIAlpZiAoIWNydGMpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGFyZ3VtZW50XG4iKTsKQEAgLTI2NzMsNyArMzIzNSwxNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlTREVfRVZUMzJfVkVSQk9TRShEUk1JRChjcnRjKSwgU0RFX0VWVExPR19GVU5DX0VOVFJZKTsKKwlTREVfRVZUMzIoRFJNSUQoY3J0YyksIFNERV9FVlRMT0dfRlVOQ19FTlRSWSk7CisKKwkvKgorCSAqIGZsdXNoIGFsbCB0aGUgZXZlbnQgdGhyZWFkIHdvcmsgdG8gbWFrZSBzdXJlIGFsbCB0aGUKKwkgKiBGUkFNRV9FVkVOVFMgZnJvbSBlbmNvZGVyIGFyZSBwcm9wYWdhdGVkIHRvIGNydGMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZGVfY3J0Yy0+ZnJhbWVfZXZlbnRzKTsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KCZzZGVfY3J0Yy0+ZnJhbWVfZXZlbnRzW2ldLmxpc3QpKQorCQkJa3RocmVhZF9mbHVzaF93b3JrKCZzZGVfY3J0Yy0+ZnJhbWVfZXZlbnRzW2ldLndvcmspOworCX0KKwogCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2RlX2NydGMtPmZyYW1lX2RvbmVfY29tcCwKIAkJCW1zZWNzX3RvX2ppZmZpZXMoU0RFX0ZSQU1FX0RPTkVfVElNRU9VVCkpOwogCWlmICghcmV0KSB7CkBAIC0yNjg3LDE3ICszMjU5LDEyMCBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZCBzZGVfY3J0Y19jb21taXRfa2lja29mZihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCitzdGF0aWMgaW50IF9zZGVfY3J0Y19jb21taXRfa2lja29mZl9yb3Qoc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZSkKIHsKIAlzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZTsKKwlzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjOworCXN0cnVjdCBzZGVfaHdfY3RsICpjdGwsICptYXN0ZXJfY3RsOworCXUzMiBmbHVzaF9tYXNrOworCWludCBpLCByYyA9IDA7CisKKwlpZiAoIWNydGMgfHwgIWNzdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZGVfY3J0YyA9IHRvX3NkZV9jcnRjKGNydGMpOworCisJLyoKKwkgKiBVcGRhdGUgc2J1ZiBjb25maWd1cmF0aW9uIGFuZCBmbHVzaCBiaXRzIGlmIGEgZmx1c2gKKwkgKiBtYXNrIGhhcyBiZWVuIGRlZmluZWQgZm9yIGVpdGhlciB0aGUgY3VycmVudCBvcgorCSAqIHByZXZpb3VzIGNvbW1pdC4KKwkgKgorCSAqIFVwZGF0ZXMgYXJlIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBmaXJzdCBjb21taXQgYWZ0ZXIKKwkgKiBzYnVmX2ZsdXNoX21hc2sgYmVjb21lcyAweDAsIHRvIHByb3Blcmx5IHRyYW5zaXRpb24KKwkgKiB0aGUgaGFyZHdhcmUgb3V0IG9mIHNidWYgbW9kZS4KKwkgKi8KKwlpZiAoIXNkZV9jcnRjLT5zYnVmX2ZsdXNoX21hc2tfb2xkICYmICFzZGVfY3J0Yy0+c2J1Zl9mbHVzaF9tYXNrKQorCQlyZXR1cm4gMDsKKworCWZsdXNoX21hc2sgPSBzZGVfY3J0Yy0+c2J1Zl9mbHVzaF9tYXNrX29sZCB8IHNkZV9jcnRjLT5zYnVmX2ZsdXNoX21hc2s7CisJc2RlX2NydGMtPnNidWZfZmx1c2hfbWFza19vbGQgPSBzZGVfY3J0Yy0+c2J1Zl9mbHVzaF9tYXNrOworCisJU0RFX0FUUkFDRV9CRUdJTigiY3J0Y19raWNrb2ZmX3JvdCIpOworCisJaWYgKGNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUgIT0gU0RFX0NUTF9ST1RfT1BfTU9ERV9PRkZMSU5FKSB7CisJCWRybV9hdG9taWNfY3J0Y19mb3JfZWFjaF9wbGFuZShwbGFuZSwgY3J0YykgeworCQkJcmMgPSBzZGVfcGxhbmVfa2lja29mZl9yb3QocGxhbmUpOworCQkJaWYgKHJjKSB7CisJCQkJU0RFX0VSUk9SKCJjcnRjJWQgY2FuY2VsbGluZyBpbmxpbmUgcm90YXRpb25cbiIsCisJCQkJCQljcnRjLT5iYXNlLmlkKTsKKwkJCQlTREVfRVZUMzIoRFJNSUQoY3J0YyksIFNERV9FVlRMT0dfRVJST1IpOworCisJCQkJLyogcmV2ZXJ0IHRvIG9mZmxpbmUgb24gZXJyb3JzICovCisJCQkJY3N0YXRlLT5zYnVmX2NmZy5yb3Rfb3BfbW9kZSA9CisJCQkJCVNERV9DVExfUk9UX09QX01PREVfT0ZGTElORTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCW1hc3Rlcl9jdGwgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBzZGVfY3J0Yy0+bnVtX21peGVyczsgaSsrKSB7CisJCWN0bCA9IHNkZV9jcnRjLT5taXhlcnNbaV0uaHdfY3RsOworCQlpZiAoIWN0bCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghbWFzdGVyX2N0bCB8fCBtYXN0ZXJfY3RsLT5pZHggPiBjdGwtPmlkeCkKKwkJCW1hc3Rlcl9jdGwgPSBjdGw7CisJfQorCisJLyogb25seSB1cGRhdGUgc2J1Zl9jZmcgYW5kIGZsdXNoIGZvciBtYXN0ZXIgY3RsICovCisJaWYgKG1hc3Rlcl9jdGwgJiYgbWFzdGVyX2N0bC0+b3BzLnNldHVwX3NidWZfY2ZnICYmCisJCQltYXN0ZXJfY3RsLT5vcHMudXBkYXRlX3BlbmRpbmdfZmx1c2gpIHsKKwkJbWFzdGVyX2N0bC0+b3BzLnNldHVwX3NidWZfY2ZnKG1hc3Rlcl9jdGwsICZjc3RhdGUtPnNidWZfY2ZnKTsKKwkJbWFzdGVyX2N0bC0+b3BzLnVwZGF0ZV9wZW5kaW5nX2ZsdXNoKG1hc3Rlcl9jdGwsIGZsdXNoX21hc2spOworCisJCS8qIGV4cGxpY2l0bHkgdHJpZ2dlciByb3RhdG9yIGZvciBhc3luYyBtb2RlcyAqLworCQlpZiAoY3N0YXRlLT5zYnVmX2NmZy5yb3Rfb3BfbW9kZSA9PQorCQkJCVNERV9DVExfUk9UX09QX01PREVfSU5MSU5FX0FTWU5DICYmCisJCQkJbWFzdGVyX2N0bC0+b3BzLnRyaWdnZXJfcm90X3N0YXJ0KSB7CisJCQltYXN0ZXJfY3RsLT5vcHMudHJpZ2dlcl9yb3Rfc3RhcnQobWFzdGVyX2N0bCk7CisJCQlTREVfRVZUMzIoRFJNSUQoY3J0YyksIG1hc3Rlcl9jdGwtPmlkeCAtIENUTF8wKTsKKwkJfQorCX0KKworCVNERV9BVFJBQ0VfRU5EKCJjcnRjX2tpY2tvZmZfcm90Iik7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIF9zZGVfY3J0Y19yZW1vdmVfcGlwZV9mbHVzaCAtIHJlbW92ZSBzdGFnZWQgcGlwZXMgZnJvbSBmbHVzaCBtYXNrCisgKiBAc2RlX2NydGM6IFBvaW50ZXIgdG8gc2RlIGNydGMgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIF9zZGVfY3J0Y19yZW1vdmVfcGlwZV9mbHVzaChzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjKQoreworCXN0cnVjdCBzZGVfY3J0Y19taXhlciAqbWl4ZXI7CisJc3RydWN0IHNkZV9od19jdGwgKmN0bDsKKwl1MzIgaSwgZmx1c2hfbWFzazsKKworCWlmICghc2RlX2NydGMpCisJCXJldHVybjsKKworCW1peGVyID0gc2RlX2NydGMtPm1peGVyczsKKwlmb3IgKGkgPSAwOyBpIDwgc2RlX2NydGMtPm51bV9taXhlcnM7IGkrKykgeworCQljdGwgPSBtaXhlcltpXS5od19jdGw7CisJCWlmICghY3RsIHx8ICFjdGwtPm9wcy5nZXRfcGVuZGluZ19mbHVzaCB8fAorCQkJCSFjdGwtPm9wcy5jbGVhcl9wZW5kaW5nX2ZsdXNoIHx8CisJCQkJIWN0bC0+b3BzLnVwZGF0ZV9wZW5kaW5nX2ZsdXNoKQorCQkJY29udGludWU7CisKKwkJZmx1c2hfbWFzayA9IGN0bC0+b3BzLmdldF9wZW5kaW5nX2ZsdXNoKGN0bCk7CisJCWZsdXNoX21hc2sgJj0gfm1peGVyW2ldLnBpcGVfbWFzazsKKwkJY3RsLT5vcHMuY2xlYXJfcGVuZGluZ19mbHVzaChjdGwpOworCQljdGwtPm9wcy51cGRhdGVfcGVuZGluZ19mbHVzaChjdGwsIGZsdXNoX21hc2spOworCX0KK30KKwordm9pZCBzZGVfY3J0Y19jb21taXRfa2lja29mZihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YzsKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBzZGVfa21zICpzZGVfa21zOwogCXN0cnVjdCBzZGVfY3J0Y19zdGF0ZSAqY3N0YXRlOwotCXN0cnVjdCBzZGVfaHdfY3RsICpjdGw7Ci0JaW50IHJldCwgaTsKKwlib29sIGlzX2Vycm9yOworCWludCByZXQ7CiAKIAlpZiAoIWNydGMpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGFyZ3VtZW50XG4iKTsKQEAgLTI3MDYsNiArMzM4MSw3IEBACiAJZGV2ID0gY3J0Yy0+ZGV2OwogCXNkZV9jcnRjID0gdG9fc2RlX2NydGMoY3J0Yyk7CiAJc2RlX2ttcyA9IF9zZGVfY3J0Y19nZXRfa21zKGNydGMpOworCWlzX2Vycm9yID0gZmFsc2U7CiAKIAlpZiAoIXNkZV9rbXMgfHwgIXNkZV9rbXMtPmRldiB8fCAhc2RlX2ttcy0+ZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlTREVfRVJST1IoImludmFsaWQgYXJndW1lbnRcbiIpOwpAQCAtMjcyNCw2ICszNDAwLDExIEBACiAJCXJldHVybjsKIAogCVNERV9BVFJBQ0VfQkVHSU4oImNydGNfY29tbWl0Iik7CisKKwkvKiBkZWZhdWx0IHRvIEFTWU5DIG1vZGUgZm9yIGlubGluZSByb3RhdGlvbiAqLworCWNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUgPSBzZGVfY3J0Yy0+c2J1Zl9mbHVzaF9tYXNrID8KKwkJU0RFX0NUTF9ST1RfT1BfTU9ERV9JTkxJTkVfQVNZTkMgOiBTREVfQ1RMX1JPVF9PUF9NT0RFX09GRkxJTkU7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZkZXYtPm1vZGVfY29uZmlnLmVuY29kZXJfbGlzdCwgaGVhZCkgewogCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfa2lja29mZl9wYXJhbXMgcGFyYW1zID0geyAwIH07CiAKQEAgLTI3MzgsOCArMzQxOSwyOCBAQAogCQlwYXJhbXMuYWZmZWN0ZWRfZGlzcGxheXMgPSBfc2RlX2NydGNfZ2V0X2Rpc3BsYXlzX2FmZmVjdGVkKGNydGMsCiAJCQkJY3J0Yy0+c3RhdGUpOwogCQlzZGVfZW5jb2Rlcl9wcmVwYXJlX2Zvcl9raWNrb2ZmKGVuY29kZXIsICZwYXJhbXMpOworCisJCS8qCisJCSAqIEZvciBpbmxpbmUgQVNZTkMgbW9kZXMsIHRoZSBmbHVzaCBiaXRzIGFyZSBub3Qgd3JpdHRlbgorCQkgKiB0byBoYXJkd2FyZSBhdG9taWNhbGx5LCBzbyBhdm9pZCB1c2luZyBpdCBpZiBhIHZpZGVvCisJCSAqIG1vZGUgZW5jb2RlciBpcyBhY3RpdmUgb24gdGhpcyBDUlRDLgorCQkgKi8KKwkJaWYgKGNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUgPT0KKwkJCQlTREVfQ1RMX1JPVF9PUF9NT0RFX0lOTElORV9BU1lOQyAmJgorCQkJCXNkZV9lbmNvZGVyX2dldF9pbnRmX21vZGUoZW5jb2RlcikgPT0KKwkJCQlJTlRGX01PREVfVklERU8pCisJCQljc3RhdGUtPnNidWZfY2ZnLnJvdF9vcF9tb2RlID0KKwkJCQlTREVfQ1RMX1JPVF9PUF9NT0RFX0lOTElORV9TWU5DOwogCX0KIAorCS8qCisJICogRm9yIEFTWU5DIGlubGluZSBtb2Rlcywga2ljayBvZmYgdGhlIHJvdGF0b3Igbm93IHNvIHRoYXQgdGhlIEgvVworCSAqIGNhbiBzdGFydCBhcyBzb29uIGFzIGl0J3MgcmVhZHkuCisJICovCisJaWYgKGNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUgPT0gU0RFX0NUTF9ST1RfT1BfTU9ERV9JTkxJTkVfQVNZTkMpCisJCWlmIChfc2RlX2NydGNfY29tbWl0X2tpY2tvZmZfcm90KGNydGMsIGNzdGF0ZSkpCisJCQlpc19lcnJvciA9IHRydWU7CisKIAkvKiB3YWl0IGZvciBmcmFtZV9ldmVudF9kb25lIGNvbXBsZXRpb24gKi8KIAlTREVfQVRSQUNFX0JFR0lOKCJ3YWl0X2Zvcl9mcmFtZV9kb25lX2V2ZW50Iik7CiAJcmV0ID0gX3NkZV9jcnRjX3dhaXRfZm9yX2ZyYW1lX2RvbmUoY3J0Yyk7CkBAIC0yNzQ4LDM5ICszNDQ5LDQ4IEBACiAJCVNERV9FUlJPUigiY3J0YyVkIHdhaXQgZm9yIGZyYW1lIGRvbmUgZmFpbGVkO2ZyYW1lX3BlbmRpbmclZFxuIiwKIAkJCQljcnRjLT5iYXNlLmlkLAogCQkJCWF0b21pY19yZWFkKCZzZGVfY3J0Yy0+ZnJhbWVfcGVuZGluZykpOwotCQlnb3RvIGVuZDsKKworCQlpc19lcnJvciA9IHRydWU7CisKKwkJLyogZm9yY2Ugb2ZmbGluZSByb3RhdGlvbiBtb2RlIHNpbmNlIHRoZSBjb21taXQgaGFzIG5vIHBpcGVzICovCisJCWNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUgPSBTREVfQ1RMX1JPVF9PUF9NT0RFX09GRkxJTkU7CiAJfQogCiAJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzZGVfY3J0Yy0+ZnJhbWVfcGVuZGluZykgPT0gMSkgewogCQkvKiBhY3F1aXJlIGJhbmR3aWR0aCBhbmQgb3RoZXIgcmVzb3VyY2VzICovCiAJCVNERV9ERUJVRygiY3J0YyVkIGZpcnN0IGNvbW1pdFxuIiwgY3J0Yy0+YmFzZS5pZCk7Ci0JCVNERV9FVlQzMihEUk1JRChjcnRjKSwgU0RFX0VWVExPR19GVU5DX0NBU0UxKTsKKwkJU0RFX0VWVDMyKERSTUlEKGNydGMpLCBjc3RhdGUtPnNidWZfY2ZnLnJvdF9vcF9tb2RlLAorCQkJCVNERV9FVlRMT0dfRlVOQ19DQVNFMSk7CiAJfSBlbHNlIHsKIAkJU0RFX0RFQlVHKCJjcnRjJWQgY29tbWl0XG4iLCBjcnRjLT5iYXNlLmlkKTsKLQkJU0RFX0VWVDMyKERSTUlEKGNydGMpLCBTREVfRVZUTE9HX0ZVTkNfQ0FTRTIpOworCQlTREVfRVZUMzIoRFJNSUQoY3J0YyksIGNzdGF0ZS0+c2J1Zl9jZmcucm90X29wX21vZGUsCisJCQkJU0RFX0VWVExPR19GVU5DX0NBU0UyKTsKIAl9CiAJc2RlX2NydGMtPnBsYXlfY291bnQrKzsKIAotCWlmIChjc3RhdGUtPnNidWZfY2ZnLnJvdF9vcF9tb2RlICE9IFNERV9DVExfUk9UX09QX01PREVfT0ZGTElORSkKLQkJZHJtX2F0b21pY19jcnRjX2Zvcl9lYWNoX3BsYW5lKHBsYW5lLCBjcnRjKQotCQkJc2RlX3BsYW5lX2tpY2tvZmYocGxhbmUpOwotCi0JZm9yIChpID0gMDsgaSA8IHNkZV9jcnRjLT5udW1fbWl4ZXJzOyBpKyspIHsKLQkJY3RsID0gc2RlX2NydGMtPm1peGVyc1tpXS5od19jdGw7Ci0JCWlmIChjdGwgJiYgY3RsLT5vcHMuc2V0dXBfc2J1Zl9jZmcpCi0JCQljdGwtPm9wcy5zZXR1cF9zYnVmX2NmZyhjdGwsICZjc3RhdGUtPnNidWZfY2ZnKTsKLQl9CisJLyoKKwkgKiBGb3IgU1lOQyBpbmxpbmUgbW9kZXMsIGRlbGF5IHRoZSBraWNrIG9mZiB1bnRpbCBhZnRlciB0aGUKKwkgKiB3YWl0IGZvciBmcmFtZSBkb25lIGluIGNhc2UgdGhlIHdhaXQgdGltZXMgb3V0LgorCSAqCisJICogQWxzbyBwZXJmb3JtIGEgZmluYWwga2lja29mZiB3aGVuIHRyYW5zaXRpb25pbmcgYmFjayB0bworCSAqIG9mZmxpbmUgbW9kZS4KKwkgKi8KKwlpZiAoY3N0YXRlLT5zYnVmX2NmZy5yb3Rfb3BfbW9kZSAhPSBTREVfQ1RMX1JPVF9PUF9NT0RFX0lOTElORV9BU1lOQykKKwkJaWYgKF9zZGVfY3J0Y19jb21taXRfa2lja29mZl9yb3QoY3J0YywgY3N0YXRlKSkKKwkJCWlzX2Vycm9yID0gdHJ1ZTsKIAogCXNkZV92YmlmX2NsZWFyX2Vycm9ycyhzZGVfa21zKTsKIAorCWlmIChpc19lcnJvcikKKwkJX3NkZV9jcnRjX3JlbW92ZV9waXBlX2ZsdXNoKHNkZV9jcnRjKTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CiAJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCiAJCQljb250aW51ZTsKIAotCQlzZGVfZW5jb2Rlcl9raWNrb2ZmKGVuY29kZXIpOworCQlzZGVfZW5jb2Rlcl9raWNrb2ZmKGVuY29kZXIsIGlzX2Vycm9yKTsKIAl9CiAKLWVuZDoKIAlyZWluaXRfY29tcGxldGlvbigmc2RlX2NydGMtPmZyYW1lX2RvbmVfY29tcCk7CiAJU0RFX0FUUkFDRV9FTkQoImNydGNfY29tbWl0Iik7CiAJcmV0dXJuOwpAQCAtMjk1NSw5ICszNjY1LDE2IEBACiAJfQogCiAJLyogcmV2ZXJ0IHN1c3BlbmQgYWN0aW9ucywgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKHNkZV9rbXNfaXNfc3VzcGVuZF9zdGF0ZShjcnRjLT5kZXYpKQorCWlmIChzZGVfa21zX2lzX3N1c3BlbmRfc3RhdGUoY3J0Yy0+ZGV2KSkgewogCQlfc2RlX2NydGNfc2V0X3N1c3BlbmQoY3J0YywgZmFsc2UpOwogCisJCWlmICghc2RlX2NydGNfaXNfcmVzZXRfcmVxdWlyZWQoY3J0YykpIHsKKwkJCVNERV9ERUJVRygiYXZvaWRpbmcgcmVzZXQgZm9yIGNydGM6JWRcbiIsCisJCQkJCWNydGMtPmJhc2UuaWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJLyogcmVtb3ZlIHByZXZpb3VzIHN0YXRlLCBpZiBwcmVzZW50ICovCiAJaWYgKGNydGMtPnN0YXRlKSB7CiAJCXNkZV9jcnRjX2Rlc3Ryb3lfc3RhdGUoY3J0YywgY3J0Yy0+c3RhdGUpOwpAQCAtMjk5Miw4ICszNzA5LDEwIEBACiAJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBzZGVfY3J0Y19taXhlciAqbTsKLQlzdHJ1Y3QgZHJtX2V2ZW50IGV2ZW50OwotCXUzMiBwb3dlcl9vbiA9IDAsIGksIG1pc3Jfc3RhdHVzOworCXUzMiBpLCBtaXNyX3N0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZGVfY3J0Y19pcnFfaW5mbyAqbm9kZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoIWNydGMpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGNydGNcbiIpOwpAQCAtMzAxNCwxMyArMzczMywxOSBAQAogCiAJCQlzZGVfZW5jb2Rlcl92aXJ0X3Jlc3RvcmUoZW5jb2Rlcik7CiAJCX0KLQkJc2RlX2NwX2NydGNfcG9zdF9pcGMoY3J0Yyk7CiAKLQkJZXZlbnQudHlwZSA9IERSTV9FVkVOVF9TREVfUE9XRVI7Ci0JCWV2ZW50Lmxlbmd0aCA9IHNpemVvZihwb3dlcl9vbik7Ci0JCXBvd2VyX29uID0gMTsKLQkJbXNtX21vZGVfb2JqZWN0X2V2ZW50X25vdGlmeSgmY3J0Yy0+YmFzZSwgY3J0Yy0+ZGV2LCAmZXZlbnQsCi0JCQkJKHU4ICopJnBvd2VyX29uKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZV9jcnRjLT5zcGluX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmc2RlX2NydGMtPnVzZXJfZXZlbnRfbGlzdCwgbGlzdCkgeworCQkJcmV0ID0gMDsKKwkJCWlmIChub2RlLT5mdW5jKQorCQkJCXJldCA9IG5vZGUtPmZ1bmMoY3J0YywgdHJ1ZSwgJm5vZGUtPmlycSk7CisJCQlpZiAocmV0KQorCQkJCVNERV9FUlJPUigiJXMgZmFpbGVkIHRvIGVuYWJsZSBldmVudCAleFxuIiwKKwkJCQkJCXNkZV9jcnRjLT5uYW1lLCBub2RlLT5ldmVudCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RlX2NydGMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJCXNkZV9jcF9jcnRjX3Bvc3RfaXBjKGNydGMpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBzZGVfY3J0Yy0+bnVtX21peGVyczsgKytpKSB7CiAJCQltID0gJnNkZV9jcnRjLT5taXhlcnNbaV07CkBAIC0zMDQzLDYgKzM3NjgsMTkgQEAKIAkJCXNkZV9jcnRjLT5taXNyX2RhdGFbaV0gPSBtaXNyX3N0YXR1cyA/IG1pc3Jfc3RhdHVzIDoKIAkJCQkJCQlzZGVfY3J0Yy0+bWlzcl9kYXRhW2ldOwogCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZV9jcnRjLT5zcGluX2xvY2ssIGZsYWdzKTsKKwkJbm9kZSA9IE5VTEw7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJnNkZV9jcnRjLT51c2VyX2V2ZW50X2xpc3QsIGxpc3QpIHsKKwkJCXJldCA9IDA7CisJCQlpZiAobm9kZS0+ZnVuYykKKwkJCQlyZXQgPSBub2RlLT5mdW5jKGNydGMsIGZhbHNlLCAmbm9kZS0+aXJxKTsKKwkJCWlmIChyZXQpCisJCQkJU0RFX0VSUk9SKCIlcyBmYWlsZWQgdG8gZGlzYWJsZSBldmVudCAleFxuIiwKKwkJCQkJCXNkZV9jcnRjLT5uYW1lLCBub2RlLT5ldmVudCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RlX2NydGMtPnNwaW5fbG9jaywgZmxhZ3MpOworCiAJCXNkZV9jcF9jcnRjX3ByZV9pcGMoY3J0Yyk7CiAJCWJyZWFrOwogCWNhc2UgU0RFX1BPV0VSX0VWRU5UX1BPU1RfRElTQUJMRToKQEAgLTMwNTQsMTIgKzM3OTIsNiBAQAogCQkJc2RlX3BsYW5lX3NldF9yZXZhbGlkYXRlKHBsYW5lLCB0cnVlKTsKIAogCQlzZGVfY3BfY3J0Y19zdXNwZW5kKGNydGMpOwotCi0JCWV2ZW50LnR5cGUgPSBEUk1fRVZFTlRfU0RFX1BPV0VSOwotCQlldmVudC5sZW5ndGggPSBzaXplb2YocG93ZXJfb24pOwotCQlwb3dlcl9vbiA9IDA7Ci0JCW1zbV9tb2RlX29iamVjdF9ldmVudF9ub3RpZnkoJmNydGMtPmJhc2UsIGNydGMtPmRldiwgJmV2ZW50LAotCQkJCSh1OCAqKSZwb3dlcl9vbik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVNERV9ERUJVRygiZXZlbnQ6JWQgbm90IGhhbmRsZWRcbiIsIGV2ZW50X3R5cGUpOwpAQCAtMzA5MSw2ICszODIzLDEwIEBACiAKIAlTREVfREVCVUcoImNydGMlZFxuIiwgY3J0Yy0+YmFzZS5pZCk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgY3N0YXRlLT5udW1fY29ubmVjdG9yczsgaSsrKQorCQlzZGVfY29ubmVjdG9yX3NjaGVkdWxlX3N0YXR1c193b3JrKGNzdGF0ZS0+Y29ubmVjdG9yc1tpXSwKKwkJCQkJCQlmYWxzZSk7CisKIAlpZiAoc2RlX2ttc19pc19zdXNwZW5kX3N0YXRlKGNydGMtPmRldikpCiAJCV9zZGVfY3J0Y19zZXRfc3VzcGVuZChjcnRjLCB0cnVlKTsKIApAQCAtMzE2NSw2ICszOTAxLDcgQEAKIAogCW1lbXNldChzZGVfY3J0Yy0+bWl4ZXJzLCAwLCBzaXplb2Yoc2RlX2NydGMtPm1peGVycykpOwogCXNkZV9jcnRjLT5udW1fbWl4ZXJzID0gMDsKKwlzZGVfY3J0Yy0+bWl4ZXJzX3N3YXBwZWQgPSBmYWxzZTsKIAogCS8qIGRpc2FibGUgY2xrICYgYncgY29udHJvbCB1bnRpbCBjbGsgJiBidyBwcm9wZXJ0aWVzIGFyZSBzZXQgKi8KIAljc3RhdGUtPmJ3X2NvbnRyb2wgPSBmYWxzZTsKQEAgLTMxODIsMTMgKzM5MTksMTUgQEAKIAlzdHJ1Y3Qgc2RlX2NydGNfaXJxX2luZm8gKm5vZGUgPSBOVUxMOwogCXN0cnVjdCBkcm1fZXZlbnQgZXZlbnQ7CiAJdTMyIHBvd2VyX29uOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZTsKIAogCWlmICghY3J0YyB8fCAhY3J0Yy0+ZGV2IHx8ICFjcnRjLT5kZXYtPmRldl9wcml2YXRlKSB7CiAJCVNERV9FUlJPUigiaW52YWxpZCBjcnRjXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlwcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwljc3RhdGUgPSB0b19zZGVfY3J0Y19zdGF0ZShjcnRjLT5zdGF0ZSk7CiAKIAlTREVfREVCVUcoImNydGMlZFxuIiwgY3J0Yy0+YmFzZS5pZCk7CiAJU0RFX0VWVDMyX1ZFUkJPU0UoRFJNSUQoY3J0YykpOwpAQCAtMzIzOSw2ICszOTc4LDkgQEAKIAkJU0RFX1BPV0VSX0VWRU5UX1BPU1RfRU5BQkxFIHwgU0RFX1BPV0VSX0VWRU5UX1BPU1RfRElTQUJMRSB8CiAJCVNERV9QT1dFUl9FVkVOVF9QUkVfRElTQUJMRSwKIAkJc2RlX2NydGNfaGFuZGxlX3Bvd2VyX2V2ZW50LCBjcnRjLCBzZGVfY3J0Yy0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3N0YXRlLT5udW1fY29ubmVjdG9yczsgaSsrKQorCQlzZGVfY29ubmVjdG9yX3NjaGVkdWxlX3N0YXR1c193b3JrKGNzdGF0ZS0+Y29ubmVjdG9yc1tpXSwgdHJ1ZSk7CiB9CiAKIHN0cnVjdCBwbGFuZV9zdGF0ZSB7CkBAIC0zMzQ4LDcgKzQwOTAsNyBAQAogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZTsKIAl1aW50MzJfdCBzZWN1cmU7Ci0JdWludDMyX3QgZmJfbnMgPSAwLCBmYl9zZWMgPSAwLCBmYl9uc19kaXIgPSAwLCBmYl9zZWNfZGlyID0gMDsKKwl1aW50MzJfdCBmYl9ucyA9IDAsIGZiX3NlYyA9IDAsIGZiX3NlY19kaXIgPSAwOwogCWludCBlbmNvZGVyX2NudCA9IDA7CiAJaW50IHJjOwogCkBAIC0zMzY1LDI2ICs0MTA3LDIxIEBACiAJcmMgPSBfc2RlX2NydGNfZmluZF9wbGFuZV9mYl9tb2RlcyhzdGF0ZSwKIAkJCSZmYl9ucywKIAkJCSZmYl9zZWMsCi0JCQkmZmJfbnNfZGlyLAogCQkJJmZiX3NlY19kaXIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJLyoqCiAJICogdmFsaWRhdGUgcGxhbmVzCi0JICogZmJfbnNfZGlyIGlzIGZvciAgc2VjdXJlIGRpc3BsYXkgdXNlIGNhc2UsCi0JICogZmJfc2VjX2RpciBpcyBmb3Igc2VjdXJlIGNhbWVyYSBwcmV2aWV3IHVzZSBjYXNlLAorCSAqIGZiX3NlY19kaXIgaXMgZm9yIHNlY3VyZSBjYW1lcmEgcHJldmlldyBhbmQgc2VjdXJlIGRpc3BsYXkgIHVzZSBjYXNlLAogCSAqIGZiX3NlYyBpcyBmb3Igc2VjdXJlIHZpZGVvIHBsYXliYWNrLAogCSAqIGZiX25zIGlzIGZvciBub3JtYWwgbm9uIHNlY3VyZSB1c2UgY2FzZXMuCiAJICovCi0JaWYgKCgoc2VjdXJlID09IFNERV9EUk1fU0VDX09OTFkpICYmCi0JCQkJKGZiX25zIHx8IGZiX3NlYyB8fCBmYl9zZWNfZGlyKSkgfHwKLQkJCShmYl9zZWMgJiYgZmJfc2VjX2RpcikpIHsKKwlpZiAoKHNlY3VyZSA9PSBTREVfRFJNX1NFQ19PTkxZKSAmJgorCQkJKGZiX25zIHx8IGZiX3NlYyB8fCAoZmJfc2VjICYmIGZiX3NlY19kaXIpKSkgewogCQlTREVfRVJST1IoCi0JCQkiY3J0YyVkOiBpbnZhbGlkIHBsYW5lcyBmYl9tb2RlcyBTZWM6JWQsIE5TOiVkLCBTZWNfRGlyOiVkLCBOU19EaXIlZFxuIiwKLQkJCQljcnRjLT5iYXNlLmlkLAotCQkJCWZiX3NlYywgZmJfbnMsIGZiX3NlY19kaXIsCi0JCQkJZmJfbnNfZGlyKTsKKwkJImNydGMlZDogaW52YWxpZCBwbGFuZXMgZmJfbW9kZXMgU2VjOiVkLCBOUzolZCwgU2VjX0RpcjolZFxuIiwKKwkJCQljcnRjLT5iYXNlLmlkLCBmYl9zZWMsIGZiX25zLCBmYl9zZWNfZGlyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMzkyLDcgKzQxMjksNyBAQAogCSAqIHNlY3VyZV9jcnRjIGlzIG5vdCBhbGxvd2VkIGluIGEgc2hhcmVkIHRvcHBvbGd5CiAJICogYWNyb3NzIGRpZmZlcmVudCBlbmNvZGVycy4KIAkgKi8KLQlpZiAoZmJfbnNfZGlyIHx8IGZiX3NlY19kaXIpIHsKKwlpZiAoZmJfc2VjX2RpcikgewogCQlkcm1fZm9yX2VhY2hfZW5jb2RlcihlbmNvZGVyLCBjcnRjLT5kZXYpCiAJCQlpZiAoZW5jb2Rlci0+Y3J0YyA9PSAgY3J0YykKIAkJCQllbmNvZGVyX2NudCsrOwpAQCAtMzQ1Miw3ICs0MTg5LDE0IEBACiAKIAltZW1zZXQocGlwZV9zdGFnZWQsIDAsIHNpemVvZihwaXBlX3N0YWdlZCkpOwogCi0JbWl4ZXJfd2lkdGggPSBzZGVfY3J0Y19taXhlcl93aWR0aChzZGVfY3J0YywgbW9kZSk7CisJcmMgPSBfc2RlX2NydGNfY2hlY2tfZGVzdF9zY2FsZXJfZGF0YShjcnRjLCBzdGF0ZSk7CisJaWYgKHJjKSB7CisJCVNERV9FUlJPUigiY3J0YyVkIGZhaWxlZCBkZXN0IHNjYWxlciBjaGVjayAlZFxuIiwKKwkJCWNydGMtPmJhc2UuaWQsIHJjKTsKKwkJZ290byBlbmQ7CisJfQorCisJbWl4ZXJfd2lkdGggPSBzZGVfY3J0Y19nZXRfbWl4ZXJfd2lkdGgoc2RlX2NydGMsIGNzdGF0ZSwgbW9kZSk7CiAKIAlfc2RlX2NydGNfc2V0dXBfaXNfcHBzcGxpdChzdGF0ZSk7CiAJX3NkZV9jcnRjX3NldHVwX2xtX2JvdW5kcyhjcnRjLCBzdGF0ZSk7CkBAIC0zODA1LDcgKzQ1NDksOCBAQAogCQkJQ1JUQ19QUk9QX1JPVF9DTEspOwogCiAJbXNtX3Byb3BlcnR5X2luc3RhbGxfcmFuZ2UoJnNkZV9jcnRjLT5wcm9wZXJ0eV9pbmZvLAotCQkiaWRsZV90aW1lIiwgMHgwLCAwLCBVNjRfTUFYLCAwLCBDUlRDX1BST1BfSURMRV9USU1FKTsKKwkJImlkbGVfdGltZSIsIElETEVfVElNRU9VVCwgMCwgVTY0X01BWCwgMCwKKwkJQ1JUQ19QUk9QX0lETEVfVElNRU9VVCk7CiAKIAltc21fcHJvcGVydHlfaW5zdGFsbF9ibG9iKCZzZGVfY3J0Yy0+cHJvcGVydHlfaW5mbywgImNhcGFiaWxpdGllcyIsCiAJCURSTV9NT0RFX1BST1BfSU1NVVRBQkxFLCBDUlRDX1BST1BfSU5GTyk7CkBAIC0zODQ2LDYgKzQ1OTEsMzkgQEAKIAkJCQkJInNtYXJ0X2RtYV9yZXYiLCAic21hcnRfZG1hX3YyIik7CiAJfQogCisJaWYgKGNhdGFsb2ctPm1kcFswXS5oYXNfZGVzdF9zY2FsZXIpIHsKKwkJc2RlX2ttc19pbmZvX2FkZF9rZXlpbnQoaW5mbywgImhhc19kZXN0X3NjYWxlciIsCisJCQkJY2F0YWxvZy0+bWRwWzBdLmhhc19kZXN0X3NjYWxlcik7CisJCXNkZV9rbXNfaW5mb19hZGRfa2V5aW50KGluZm8sICJkZXN0X3NjYWxlcl9jb3VudCIsCisJCQkJCWNhdGFsb2ctPmRzX2NvdW50KTsKKworCQlpZiAoY2F0YWxvZy0+ZHNbMF0udG9wKSB7CisJCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLAorCQkJCQkibWF4X2Rlc3Rfc2NhbGVyX2lucHV0X3dpZHRoIiwKKwkJCQkJY2F0YWxvZy0+ZHNbMF0udG9wLT5tYXhpbnB1dHdpZHRoKTsKKwkJCXNkZV9rbXNfaW5mb19hZGRfa2V5aW50KGluZm8sCisJCQkJCSJtYXhfZGVzdF9zY2FsZXJfb3V0cHV0X3dpZHRoIiwKKwkJCQkJY2F0YWxvZy0+ZHNbMF0udG9wLT5tYXhpbnB1dHdpZHRoKTsKKwkJCXNkZV9rbXNfaW5mb19hZGRfa2V5aW50KGluZm8sICJtYXhfZGVzdF9zY2FsZV91cCIsCisJCQkJCWNhdGFsb2ctPmRzWzBdLnRvcC0+bWF4dXBzY2FsZSk7CisJCX0KKworCQlpZiAoY2F0YWxvZy0+ZHNbMF0uZmVhdHVyZXMgJiBCSVQoU0RFX1NTUFBfU0NBTEVSX1FTRUVEMykpIHsKKwkJCW1zbV9wcm9wZXJ0eV9pbnN0YWxsX3ZvbGF0aWxlX3JhbmdlKAorCQkJCQkmc2RlX2NydGMtPnByb3BlcnR5X2luZm8sICJkZXN0X3NjYWxlciIsCisJCQkJCTB4MCwgMCwgfjAsIDAsIENSVENfUFJPUF9ERVNUX1NDQUxFUik7CisJCQltc21fcHJvcGVydHlfaW5zdGFsbF9ibG9iKCZzZGVfY3J0Yy0+cHJvcGVydHlfaW5mbywKKwkJCQkJImRzX2x1dF9lZCIsIDAsCisJCQkJCUNSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfRUQpOworCQkJbXNtX3Byb3BlcnR5X2luc3RhbGxfYmxvYigmc2RlX2NydGMtPnByb3BlcnR5X2luZm8sCisJCQkJCSJkc19sdXRfY2lyIiwgMCwKKwkJCQkJQ1JUQ19QUk9QX0RFU1RfU0NBTEVSX0xVVF9DSVIpOworCQkJbXNtX3Byb3BlcnR5X2luc3RhbGxfYmxvYigmc2RlX2NydGMtPnByb3BlcnR5X2luZm8sCisJCQkJCSJkc19sdXRfc2VwIiwgMCwKKwkJCQkJQ1JUQ19QUk9QX0RFU1RfU0NBTEVSX0xVVF9TRVApOworCQl9CisJfQorCiAJc2RlX2ttc19pbmZvX2FkZF9rZXlpbnQoaW5mbywgImhhc19zcmNfc3BsaXQiLCBjYXRhbG9nLT5oYXNfc3JjX3NwbGl0KTsKIAlpZiAoY2F0YWxvZy0+cGVyZi5tYXhfYndfbG93KQogCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWF4X2JhbmR3aWR0aF9sb3ciLApAQCAtMzg1Myw2ICs0NjMxLDE1IEBACiAJaWYgKGNhdGFsb2ctPnBlcmYubWF4X2J3X2hpZ2gpCiAJCXNkZV9rbXNfaW5mb19hZGRfa2V5aW50KGluZm8sICJtYXhfYmFuZHdpZHRoX2hpZ2giLAogCQkJCWNhdGFsb2ctPnBlcmYubWF4X2J3X2hpZ2ggKiAxMDAwTEwpOworCWlmIChjYXRhbG9nLT5wZXJmLm1pbl9jb3JlX2liKQorCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWluX2NvcmVfaWIiLAorCQkJCWNhdGFsb2ctPnBlcmYubWluX2NvcmVfaWIgKiAxMDAwTEwpOworCWlmIChjYXRhbG9nLT5wZXJmLm1pbl9sbGNjX2liKQorCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWluX2xsY2NfaWIiLAorCQkJCWNhdGFsb2ctPnBlcmYubWluX2xsY2NfaWIgKiAxMDAwTEwpOworCWlmIChjYXRhbG9nLT5wZXJmLm1pbl9kcmFtX2liKQorCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWluX2RyYW1faWIiLAorCQkJCWNhdGFsb2ctPnBlcmYubWluX2RyYW1faWIgKiAxMDAwTEwpOwogCWlmIChzZGVfa21zLT5wZXJmLm1heF9jb3JlX2Nsa19yYXRlKQogCQlzZGVfa21zX2luZm9fYWRkX2tleWludChpbmZvLCAibWF4X21kcF9jbGsiLAogCQkJCXNkZV9rbXMtPnBlcmYubWF4X2NvcmVfY2xrX3JhdGUpOwpAQCAtMzkyMSwxMCArNDcwOCwyMiBAQAogCQkJCV9zZGVfY3J0Y19zZXRfaW5wdXRfZmVuY2VfdGltZW91dChjc3RhdGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDUlRDX1BST1BfRElNX0xBWUVSX1YxOgotCQkJCV9zZGVfY3J0Y19zZXRfZGltX2xheWVyX3YxKGNzdGF0ZSwgKHZvaWQgKil2YWwpOworCQkJCV9zZGVfY3J0Y19zZXRfZGltX2xheWVyX3YxKGNzdGF0ZSwKKwkJCQkJCQkodm9pZCBfX3VzZXIgKil2YWwpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDUlRDX1BST1BfUk9JX1YxOgotCQkJCXJldCA9IF9zZGVfY3J0Y19zZXRfcm9pX3YxKHN0YXRlLCAodm9pZCAqKXZhbCk7CisJCQkJcmV0ID0gX3NkZV9jcnRjX3NldF9yb2lfdjEoc3RhdGUsCisJCQkJCQkJKHZvaWQgX191c2VyICopdmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1JUQ19QUk9QX0RFU1RfU0NBTEVSOgorCQkJCXJldCA9IF9zZGVfY3J0Y19zZXRfZGVzdF9zY2FsZXIoc2RlX2NydGMsCisJCQkJCQljc3RhdGUsICh2b2lkIF9fdXNlciAqKXZhbCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfRUQ6CisJCQljYXNlIENSVENfUFJPUF9ERVNUX1NDQUxFUl9MVVRfQ0lSOgorCQkJY2FzZSBDUlRDX1BST1BfREVTVF9TQ0FMRVJfTFVUX1NFUDoKKwkJCQlyZXQgPSBfc2RlX2NydGNfc2V0X2Rlc3Rfc2NhbGVyX2x1dChzZGVfY3J0YywKKwkJCQkJCQkJY3N0YXRlLCBpZHgpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDUlRDX1BST1BfQ09SRV9DTEs6CiAJCQljYXNlIENSVENfUFJPUF9DT1JFX0FCOgpAQCAtMzkzOCw2ICs0NzM3LDggQEAKIAkJCQljc3RhdGUtPmJ3X2NvbnRyb2wgPSB0cnVlOwogCQkJCWNzdGF0ZS0+Yndfc3BsaXRfdm90ZSA9IHRydWU7CiAJCQkJYnJlYWs7CisJCQljYXNlIENSVENfUFJPUF9JRExFX1RJTUVPVVQ6CisJCQkJX3NkZV9jcnRjX3NldF9pZGxlX3RpbWVvdXQoY3J0YywgdmFsKTsKIAkJCWRlZmF1bHQ6CiAJCQkJLyogbm90aGluZyB0byBkbyAqLwogCQkJCWJyZWFrOwpAQCAtNDA3MCw3ICs0ODcxLDcgQEAKIAogCW11dGV4X2xvY2soJnNkZV9jcnRjLT5jcnRjX2xvY2spOwogCW1vZGUgPSAmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7Ci0Jb3V0X3dpZHRoID0gc2RlX2NydGNfbWl4ZXJfd2lkdGgoc2RlX2NydGMsIG1vZGUpOworCW91dF93aWR0aCA9IHNkZV9jcnRjX2dldF9taXhlcl93aWR0aChzZGVfY3J0YywgY3N0YXRlLCBtb2RlKTsKIAogCXNlcV9wcmludGYocywgImNydGM6JWQgd2lkdGg6JWQgaGVpZ2h0OiVkXG4iLCBjcnRjLT5iYXNlLmlkLAogCQkJCW1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSk7CkBAIC00NTM5LDMxICs1MzQwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qCi0gKiBfX3NkZV9jcnRjX2lkbGVfbm90aWZ5X3dvcmsgLSBzaWduYWwgaWRsZSB0aW1lb3V0IHRvIHVzZXIgc3BhY2UKLSAqLwotc3RhdGljIHZvaWQgX19zZGVfY3J0Y19pZGxlX25vdGlmeV93b3JrKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCi17Ci0Jc3RydWN0IHNkZV9jcnRjICpzZGVfY3J0YyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2RlX2NydGMsCi0JCQkJaWRsZV9ub3RpZnlfd29yay53b3JrKTsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Ci0Jc3RydWN0IGRybV9ldmVudCBldmVudDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc2RlX2NydGMpIHsKLQkJU0RFX0VSUk9SKCJpbnZhbGlkIHNkZSBjcnRjXG4iKTsKLQl9IGVsc2UgewotCQljcnRjID0gJnNkZV9jcnRjLT5iYXNlOwotCQlldmVudC50eXBlID0gRFJNX0VWRU5UX0lETEVfTk9USUZZOwotCQlldmVudC5sZW5ndGggPSBzaXplb2YodTMyKTsKLQkJbXNtX21vZGVfb2JqZWN0X2V2ZW50X25vdGlmeSgmY3J0Yy0+YmFzZSwgY3J0Yy0+ZGV2LAotCQkJCSZldmVudCwgKHU4ICopJnJldCk7Ci0KLQkJU0RFX0RFQlVHKCJjcnRjWyVkXTogaWRsZSB0aW1lb3V0IG5vdGlmaWVkXG4iLCBjcnRjLT5iYXNlLmlkKTsKLQl9Ci19Ci0KLQogLyogaW5pdGlhbGl6ZSBjcnRjICovCiBzdHJ1Y3QgZHJtX2NydGMgKnNkZV9jcnRjX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCiB7CkBAIC00NjMwLDEzICs1NDA2LDEzIEBACiAKIAlzZGVfY3J0Y19pbnN0YWxsX3Byb3BlcnRpZXMoY3J0Yywga21zLT5jYXRhbG9nKTsKIAorCS8qIEluaXQgZGVzdCBzY2FsZXIgKi8KKwlfc2RlX2NydGNfZGVzdF9zY2FsZXJfaW5pdChzZGVfY3J0Yywga21zLT5jYXRhbG9nKTsKKwogCS8qIEluc3RhbGwgY29sb3IgcHJvY2Vzc2luZyBwcm9wZXJ0aWVzICovCiAJc2RlX2NwX2NydGNfaW5pdChjcnRjKTsKIAlzZGVfY3BfY3J0Y19pbnN0YWxsX3Byb3BlcnRpZXMoY3J0Yyk7CiAKLQlrdGhyZWFkX2luaXRfZGVsYXllZF93b3JrKCZzZGVfY3J0Yy0+aWRsZV9ub3RpZnlfd29yaywKLQkJCQkJX19zZGVfY3J0Y19pZGxlX25vdGlmeV93b3JrKTsKLQogCVNERV9ERUJVRygiJXM6IHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBjcnRjXG4iLCBzZGVfY3J0Yy0+bmFtZSk7CiAJcmV0dXJuIGNydGM7CiB9CkBAIC00NjkwLDYgKzU0NjYsNyBAQAogCWlmIChjcnRjX2RybS0+ZW5hYmxlZCkgewogCQlzZGVfcG93ZXJfcmVzb3VyY2VfZW5hYmxlKCZwcml2LT5waGFuZGxlLCBrbXMtPmNvcmVfY2xpZW50LAogCQkJCXRydWUpOworCQlJTklUX0xJU1RfSEVBRCgmbm9kZS0+aXJxLmxpc3QpOwogCQlyZXQgPSBub2RlLT5mdW5jKGNydGNfZHJtLCB0cnVlLCAmbm9kZS0+aXJxKTsKIAkJc2RlX3Bvd2VyX3Jlc291cmNlX2VuYWJsZSgmcHJpdi0+cGhhbmRsZSwga21zLT5jb3JlX2NsaWVudCwKIAkJCQlmYWxzZSk7CkBAIC00Njk3LDYgKzU0NzQsOCBAQAogCiAJaWYgKCFyZXQpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNydGMtPnNwaW5fbG9jaywgZmxhZ3MpOworCQkvKiBpcnEgaXMgcmVnaWVzdGVyZWQgYW5kIGVuYWJsZWQgYW5kIHNldCB0aGUgc3RhdGUgKi8KKwkJbm9kZS0+c3RhdGUgPSBJUlFfRU5BQkxFRDsKIAkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+bGlzdCwgJmNydGMtPnVzZXJfZXZlbnRfbGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNydGMtPnNwaW5fbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7CkBAIC00NzIwLDcgKzU0OTksNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcnRjLT5zcGluX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZjcnRjLT51c2VyX2V2ZW50X2xpc3QsIGxpc3QpIHsKIAkJaWYgKG5vZGUtPmV2ZW50ID09IGV2ZW50KSB7Ci0JCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CiAJCQlmb3VuZCA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpAQCAtNDczNiwxMiArNTUxNCwxNSBAQAogCSAqIG5vIG5lZWQgdG8gZGlzYWJsZS9kZS1yZWdpc3Rlci4KIAkgKi8KIAlpZiAoIWNydGNfZHJtLT5lbmFibGVkKSB7CisJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKIAkJa2ZyZWUobm9kZSk7CiAJCXJldHVybiAwOwogCX0KIAlwcml2ID0ga21zLT5kZXYtPmRldl9wcml2YXRlOwogCXNkZV9wb3dlcl9yZXNvdXJjZV9lbmFibGUoJnByaXYtPnBoYW5kbGUsIGttcy0+Y29yZV9jbGllbnQsIHRydWUpOwogCXJldCA9IG5vZGUtPmZ1bmMoY3J0Y19kcm0sIGZhbHNlLCAmbm9kZS0+aXJxKTsKKwlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7CisJa2ZyZWUobm9kZSk7CiAJc2RlX3Bvd2VyX3Jlc291cmNlX2VuYWJsZSgmcHJpdi0+cGhhbmRsZSwga21zLT5jb3JlX2NsaWVudCwgZmFsc2UpOwogCXJldHVybiByZXQ7CiB9CkBAIC00NzczLDE2ICs1NTU0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZGVfY3J0Y19wbV9ldmVudF9oYW5kbGVyKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgYm9vbCBlbiwKLQkJc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKm5vaXJxKQotewotCS8qCi0JICogSVJRIG9iamVjdCBub2lycSBpcyBub3QgYmVpbmcgdXNlZCBoZXJlIHNpbmNlIHRoZXJlIGlzCi0JICogbm8gY3J0YyBpcnEgZnJvbSBwbSBldmVudC4KLQkgKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzZGVfY3J0Y19pZGxlX2ludGVycnVwdF9oYW5kbGVyKHN0cnVjdCBkcm1fY3J0YyAqY3J0Y19kcm0sCiAJYm9vbCBlbiwgc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgKmlycSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jcnRjLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfY3J0Yy5oCmluZGV4IDFlMGU5MTcuLjU5YmZjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9jcnRjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2NydGMuaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgInNkZV9rbXMuaCIKICNpbmNsdWRlICJzZGVfY29yZV9wZXJmLmgiCiAjaW5jbHVkZSAic2RlX2h3X2Jsay5oIgorI2luY2x1ZGUgInNkZV9od19kcy5oIgogCiAjZGVmaW5lIFNERV9DUlRDX05BTUVfU0laRQkxMgogCkBAIC0xMDYsMTcgKzEwNywyMSBAQAogICogQGh3X2xtOglMTSBIVyBEcml2ZXIgY29udGV4dAogICogQGh3X2N0bDoJQ1RMIFBhdGggSFcgZHJpdmVyIGNvbnRleHQKICAqIEBod19kc3BwOglEU1BQIEhXIGRyaXZlciBjb250ZXh0CisgKiBAaHdfZHM6CURTIEhXIGRyaXZlciBjb250ZXh0CiAgKiBAZW5jb2RlcjoJRW5jb2RlciBhdHRhY2hlZCB0byB0aGlzIGxtICYgY3RsCi0gKiBAbWl4ZXJfb3BfbW9kZTogbWl4ZXIgYmxlbmRpbmcgb3BlcmF0aW9uIG1vZGUKKyAqIEBtaXhlcl9vcF9tb2RlOgltaXhlciBibGVuZGluZyBvcGVyYXRpb24gbW9kZQogICogQGZsdXNoX21hc2s6CW1peGVyIGZsdXNoIG1hc2sgZm9yIGN0bCwgbWl4ZXIgYW5kIHBpcGUKKyAqIEBwaXBlX21hc2s6CW1peGVyIGZsdXNoIG1hc2sgZm9yIHBpcGUKICAqLwogc3RydWN0IHNkZV9jcnRjX21peGVyIHsKIAlzdHJ1Y3Qgc2RlX2h3X21peGVyICpod19sbTsKIAlzdHJ1Y3Qgc2RlX2h3X2N0bCAqaHdfY3RsOwotCXN0cnVjdCBzZGVfaHdfZHNwcCAgKmh3X2RzcHA7CisJc3RydWN0IHNkZV9od19kc3BwICpod19kc3BwOworCXN0cnVjdCBzZGVfaHdfZHMgKmh3X2RzOwogCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKIAl1MzIgbWl4ZXJfb3BfbW9kZTsKIAl1MzIgZmx1c2hfbWFzazsKKwl1MzIgcGlwZV9tYXNrOwogfTsKIAogLyoqCkBAIC0yMDQsMTEgKzIwOSwxMyBAQAogICogQG1pc3JfZW5hYmxlICAgOiBib29sZWFuIGVudHJ5IGluZGljYXRlcyBtaXNyIGVuYWJsZS9kaXNhYmxlIHN0YXR1cy4KICAqIEBtaXNyX2ZyYW1lX2NvdW50ICA6IG1pc3IgZnJhbWUgY291bnQgcHJvdmlkZWQgYnkgY2xpZW50CiAgKiBAbWlzcl9kYXRhICAgICA6IHN0b3JlIG1pc3IgZGF0YSBiZWZvcmUgdHVybmluZyBvZmYgdGhlIGNsb2Nrcy4KLSAqIEBpZGxlX25vdGlmeV93b3JrOiBkZWxheWVkIHdvcmtlciB0byBub3RpZnkgaWRsZSB0aW1lb3V0IHRvIHVzZXIgc3BhY2UKKyAqIEBzYnVmX2ZsdXNoX21hc2s6IGZsdXNoIG1hc2sgZm9yIGlubGluZSByb3RhdG9yCisgKiBAc2J1Zl9mbHVzaF9tYXNrX29sZDogaW5saW5lIHJvdGF0b3IgZmx1c2ggbWFzayBmb3IgcHJldmlvdXMgY29tbWl0CiAgKiBAcG93ZXJfZXZlbnQgICA6IHJlZ2lzdGVyZWQgcG93ZXIgZXZlbnQgaGFuZGxlCiAgKiBAY3VyX3BlcmYgICAgICA6IGN1cnJlbnQgcGVyZm9ybWFuY2UgY29tbWl0dGVkIHRvIGNsb2NrL2JhbmR3aWR0aCBkcml2ZXIKICAqIEBycF9sb2NrICAgICAgIDogc2VyaWFsaXphdGlvbiBsb2NrIGZvciByZXNvdXJjZSBwb29sCiAgKiBAcnBfaGVhZCAgICAgICA6IGxpc3Qgb2YgYWN0aXZlIHJlc291cmNlIHBvb2wKKyAqIEBzY2wzX2NmZ19sdXQgIDogcXNlZWQzIGx1dCBjb25maWcKICAqLwogc3RydWN0IHNkZV9jcnRjIHsKIAlzdHJ1Y3QgZHJtX2NydGMgYmFzZTsKQEAgLTIxOSw2ICsyMjYsNyBAQAogCXUzMiBudW1fbWl4ZXJzOwogCWJvb2wgbWl4ZXJzX3N3YXBwZWQ7CiAJc3RydWN0IHNkZV9jcnRjX21peGVyIG1peGVyc1tDUlRDX0RVQUxfTUlYRVJTXTsKKwlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfbHV0X2NmZyAqc2NsM19sdXRfY2ZnOwogCiAJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZXZlbnQ7CiAJdTMyIHZzeW5jX2NvdW50OwpAQCAtMjQ4LDYgKzI1Niw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCB1c2VyX2V2ZW50X2xpc3Q7CiAKIAlzdHJ1Y3QgbXV0ZXggY3J0Y19sb2NrOworCXN0cnVjdCBtdXRleCBjcnRjX2NwX2xvY2s7CiAKIAlhdG9taWNfdCBmcmFtZV9wZW5kaW5nOwogCXN0cnVjdCBzZGVfY3J0Y19mcmFtZV9ldmVudCBmcmFtZV9ldmVudHNbU0RFX0NSVENfRlJBTUVfRVZFTlRfU0laRV07CkBAIC0yNjUsNyArMjc0LDggQEAKIAl1MzIgbWlzcl9mcmFtZV9jb3VudDsKIAl1MzIgbWlzcl9kYXRhW0NSVENfRFVBTF9NSVhFUlNdOwogCi0Jc3RydWN0IGt0aHJlYWRfZGVsYXllZF93b3JrIGlkbGVfbm90aWZ5X3dvcms7CisJdTMyIHNidWZfZmx1c2hfbWFzazsKKwl1MzIgc2J1Zl9mbHVzaF9tYXNrX29sZDsKIAogCXN0cnVjdCBzZGVfcG93ZXJfZXZlbnQgKnBvd2VyX2V2ZW50OwogCkBAIC0yNzUsNiArMjg1LDkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJwX2hlYWQ7CiAKIAlzdHJ1Y3Qgc2RlX2NydGNfc21tdV9zdGF0ZV9kYXRhIHNtbXVfc3RhdGU7CisKKwkvKiBibG9iIGZvciBoaXN0b2dyYW0gZGF0YSAqLworCXN0cnVjdCBkcm1fcHJvcGVydHlfYmxvYiAqaGlzdF9ibG9iOwogfTsKIAogI2RlZmluZSB0b19zZGVfY3J0Yyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHNkZV9jcnRjLCBiYXNlKQpAQCAtMzQwLDcgKzM1Myw2IEBACiAgKiBAYmFzZTogQmFzZSBkcm0gY3J0YyBzdGF0ZSBzdHJ1Y3R1cmUKICAqIEBjb25uZWN0b3JzICAgIDogQ3VycmVudGx5IGFzc29jaWF0ZWQgZHJtIGNvbm5lY3RvcnMKICAqIEBudW1fY29ubmVjdG9yczogTnVtYmVyIG9mIGFzc29jaWF0ZWQgZHJtIGNvbm5lY3RvcnMKLSAqIEBpbnRmX21vZGUgICAgIDogSW50ZXJmYWNlIG1vZGUgb2YgdGhlIHByaW1hcnkgY29ubmVjdG9yCiAgKiBAcnNjX2NsaWVudCAgICA6IHNkZSByc2MgY2xpZW50IHdoZW4gbW9kZSBpcyB2YWxpZAogICogQGlzX3Bwc3BsaXQgICAgOiBXaGV0aGVyIGN1cnJlbnQgdG9wb2xvZ3kgcmVxdWlyZXMgUFBTcGxpdCBzcGVjaWFsIGhhbmRsaW5nCiAgKiBAYndfY29udHJvbCAgICA6IHRydWUgaWYgYncvY2xrIGNvbnRyb2xsZWQgYnkgY29yZSBidy9jbGsgcHJvcGVydGllcwpAQCAtMzU3LDE3ICszNjksMTkgQEAKICAqIEBpbnB1dF9mZW5jZV90aW1lb3V0X25zIDogQ2FjaGVkIGlucHV0IGZlbmNlIHRpbWVvdXQsIGluIG5zCiAgKiBAbnVtX2RpbV9sYXllcnM6IE51bWJlciBvZiBkaW0gbGF5ZXJzCiAgKiBAZGltX2xheWVyOiBEaW0gbGF5ZXIgY29uZmlncworICogQG51bV9kczogTnVtYmVyIG9mIGRlc3RpbmF0aW9uIHNjYWxlcnMgdG8gYmUgY29uZmlndXJlZAorICogQG51bV9kc19lbmFibGVkOiBOdW1iZXIgb2YgZGVzdGluYXRpb24gc2NhbGVycyBlbmFibGVkCisgKiBAZHNfZGlydHk6IEJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgZGlydHkgb3Igbm90CisgKiBAZHNfY2ZnOiBEZXN0aW5hdGlvbiBzY2FsZXIgY29uZmlnCiAgKiBAbmV3X3BlcmY6IG5ldyBwZXJmb3JtYW5jZSBzdGF0ZSBiZWluZyByZXF1ZXN0ZWQKICAqIEBzYnVmX2NmZzogc3RyZWFtIGJ1ZmZlciBjb25maWd1cmF0aW9uCiAgKiBAc2J1Zl9wcmVmaWxsX2xpbmU6IG51bWJlciBvZiBsaW5lIGZvciBpbmxpbmUgcm90YXRvciBwcmVmZXRjaAotICogQHNidWZfZmx1c2hfbWFzazogZmx1c2ggbWFzayBmb3IgaW5saW5lIHJvdGF0b3IKICAqLwogc3RydWN0IHNkZV9jcnRjX3N0YXRlIHsKIAlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgYmFzZTsKIAogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3JzW01BWF9DT05ORUNUT1JTXTsKIAlpbnQgbnVtX2Nvbm5lY3RvcnM7Ci0JZW51bSBzZGVfaW50Zl9tb2RlIGludGZfbW9kZTsKIAlzdHJ1Y3Qgc2RlX3JzY19jbGllbnQgKnJzY19jbGllbnQ7CiAJYm9vbCByc2NfdXBkYXRlOwogCWJvb2wgYndfY29udHJvbDsKQEAgLTM4NCwxNSArMzk4LDQxIEBACiAJdWludDY0X3QgaW5wdXRfZmVuY2VfdGltZW91dF9uczsKIAl1aW50MzJfdCBudW1fZGltX2xheWVyczsKIAlzdHJ1Y3Qgc2RlX2h3X2RpbV9sYXllciBkaW1fbGF5ZXJbU0RFX01BWF9ESU1fTEFZRVJTXTsKKwl1aW50MzJfdCBudW1fZHM7CisJdWludDMyX3QgbnVtX2RzX2VuYWJsZWQ7CisJYm9vbCBkc19kaXJ0eTsKKwlzdHJ1Y3Qgc2RlX2h3X2RzX2NmZyBkc19jZmdbU0RFX01BWF9EU19DT1VOVF07CiAKIAlzdHJ1Y3Qgc2RlX2NvcmVfcGVyZl9wYXJhbXMgbmV3X3BlcmY7CiAJc3RydWN0IHNkZV9jdGxfc2J1Zl9jZmcgc2J1Zl9jZmc7CiAJdTMyIHNidWZfcHJlZmlsbF9saW5lOwotCXUzMiBzYnVmX2ZsdXNoX21hc2s7CiAKIAlzdHJ1Y3Qgc2RlX2NydGNfcmVzcG9vbCBycDsKIH07CiAKK2VudW0gc2RlX2NydGNfaXJxX3N0YXRlIHsKKwlJUlFfTk9JTklULAorCUlSUV9FTkFCTEVELAorCUlSUV9ESVNBQkxFRCwKK307CisKKy8qKgorICogc2RlX2NydGNfaXJxX2luZm8gLSBjcnRjIGludGVycnVwdCBpbmZvCisgKiBAaXJxOiBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqIEBldmVudDogZXZlbnQgdHlwZSBvZiB0aGUgaW50ZXJydXB0CisgKiBAZnVuYzogZnVuY3Rpb24gcG9pbnRlciB0byBlbmFibGUvZGlzYWJsZSB0aGUgaW50ZXJydXB0CisgKiBAbGlzdDogbGlzdCBvZiB1c2VyIGN1c3RvbWl6ZWQgZXZlbnQgaW4gY3J0YworICogQHJlZl9jb3VudDogcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgaW50ZXJydXB0CisgKi8KK3N0cnVjdCBzZGVfY3J0Y19pcnFfaW5mbyB7CisJc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgaXJxOworCXUzMiBldmVudDsKKwlpbnQgKCpmdW5jKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGJvb2wgZW4sCisJCQlzdHJ1Y3Qgc2RlX2lycV9jYWxsYmFjayAqaXJxKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJZW51bSBzZGVfY3J0Y19pcnFfc3RhdGUgc3RhdGU7Cit9OworCiAjZGVmaW5lIHRvX3NkZV9jcnRjX3N0YXRlKHgpIFwKIAljb250YWluZXJfb2YoeCwgc3RydWN0IHNkZV9jcnRjX3N0YXRlLCBiYXNlKQogCkBAIC00MDUsMTQgKzQ0NSw0MSBAQAogI2RlZmluZSBzZGVfY3J0Y19nZXRfcHJvcGVydHkoUywgWCkgXAogCSgoUykgJiYgKChYKSA8IENSVENfUFJPUF9DT1VOVCkgPyAoKFMpLT5wcm9wZXJ0eV92YWx1ZXNbKFgpXS52YWx1ZSkgOiAwKQogCi1zdGF0aWMgaW5saW5lIGludCBzZGVfY3J0Y19taXhlcl93aWR0aChzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjLAotCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQorLyoqCisgKiBzZGVfY3J0Y19nZXRfbWl4ZXJfd2lkdGggLSBnZXQgdGhlIG1peGVyIHdpZHRoCisgKiBNaXhlciB3aWR0aCB3aWxsIGJlIHNhbWUgYXMgcGFuZWwgd2lkdGgoLzIgZm9yIHNwbGl0KQorICogdW5sZXNzIGRlc3RpbmF0aW9uIHNjYWxlciBmZWF0dXJlIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2RlX2NydGNfZ2V0X21peGVyX3dpZHRoKHN0cnVjdCBzZGVfY3J0YyAqc2RlX2NydGMsCisJc3RydWN0IHNkZV9jcnRjX3N0YXRlICpjc3RhdGUsIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewotCWlmICghc2RlX2NydGMgfHwgIW1vZGUpCisJdTMyIG1peGVyX3dpZHRoOworCisJaWYgKCFzZGVfY3J0YyB8fCAhY3N0YXRlIHx8ICFtb2RlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiAgc2RlX2NydGMtPm51bV9taXhlcnMgPT0gQ1JUQ19EVUFMX01JWEVSUyA/Ci0JCW1vZGUtPmhkaXNwbGF5IC8gQ1JUQ19EVUFMX01JWEVSUyA6IG1vZGUtPmhkaXNwbGF5OworCWlmIChjc3RhdGUtPm51bV9kc19lbmFibGVkKQorCQltaXhlcl93aWR0aCA9IGNzdGF0ZS0+ZHNfY2ZnWzBdLmxtX3dpZHRoOworCWVsc2UKKwkJbWl4ZXJfd2lkdGggPSAoc2RlX2NydGMtPm51bV9taXhlcnMgPT0gQ1JUQ19EVUFMX01JWEVSUyA/CisJCQltb2RlLT5oZGlzcGxheSAvIENSVENfRFVBTF9NSVhFUlMgOiBtb2RlLT5oZGlzcGxheSk7CisKKwlyZXR1cm4gbWl4ZXJfd2lkdGg7Cit9CisKKy8qKgorICogc2RlX2NydGNfZ2V0X21peGVyX2hlaWdodCAtIGdldCB0aGUgbWl4ZXIgaGVpZ2h0CisgKiBNaXhlciBoZWlnaHQgd2lsbCBiZSBzYW1lIGFzIHBhbmVsIGhlaWdodCB1bmxlc3MKKyAqIGRlc3RpbmF0aW9uIHNjYWxlciBmZWF0dXJlIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgc2RlX2NydGNfZ2V0X21peGVyX2hlaWdodChzdHJ1Y3Qgc2RlX2NydGMgKnNkZV9jcnRjLAorCQlzdHJ1Y3Qgc2RlX2NydGNfc3RhdGUgKmNzdGF0ZSwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaWYgKCFzZGVfY3J0YyB8fCAhY3N0YXRlIHx8ICFtb2RlKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAoY3N0YXRlLT5udW1fZHNfZW5hYmxlZCA/CisJCQljc3RhdGUtPmRzX2NmZ1swXS5sbV9oZWlnaHQgOiBtb2RlLT52ZGlzcGxheSk7CiB9CiAKIC8qKgpAQCAtNTAzLDggKzU3MCw4IEBACiAJaWYgKCFjc3RhdGUpCiAJCXJldHVybiBOUlRfQ0xJRU5UOwogCi0JcmV0dXJuIGNzdGF0ZS0+cnNjX2NsaWVudCA/IFJUX1JTQ19DTElFTlQgOgotCSAgICAoY3N0YXRlLT5pbnRmX21vZGUgPT0gSU5URl9NT0RFX1dCX0xJTkUgPyBOUlRfQ0xJRU5UIDogUlRfQ0xJRU5UKTsKKwlyZXR1cm4gc2RlX2NydGNfZ2V0X2ludGZfbW9kZShjcnRjKSA9PSBJTlRGX01PREVfV0JfTElORSA/IE5SVF9DTElFTlQgOgorCQkJKGNzdGF0ZS0+cnNjX2NsaWVudCA/IFJUX1JTQ19DTElFTlQgOiBSVF9DTElFTlQpOwogfQogCiAvKioKQEAgLTUzNCw2ICs2MDEsMzAgQEAKIH0KIAogLyoqCisgKiBzZGVfY3J0Y19pc19yZXNldF9yZXF1aXJlZCAtIHZhbGlkYXRlIHRoZSByZXNldCByZXF1ZXN0IGJhc2VkIG9uIHRoZQorICoJcG1fc3VzcGVuZCBhbmQgY3J0YydzIGFjdGl2ZSBzdGF0dXMuIGNydGMncyBhcmUgbGVmdCBhY3RpdmUKKyAqCW9uIHBtX3N1c3BlbmQgZHVyaW5nIExQMS9MUDIgc3RhdGVzLCBhcyB0aGUgZGlzcGxheSBpcyBzdGlsbAorICoJbGVmdCBPTi4gQXZvaWQgcmVzZXQgZm9yIHRoZSBzdWJzZXF1ZW50IHBtX3Jlc3VtZSBpbiBzdWNoIGNhc2VzLgorICogQGNydGM6IFBvaW50ZXIgdG8gY3J0YworICogcmV0dXJuOiBmYWxzZSBpZiBpbiBzdXNwZW5kIHN0YXRlIGFuZCBjcnRjIGFjdGl2ZSwgdHJ1ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIHNkZV9jcnRjX2lzX3Jlc2V0X3JlcXVpcmVkKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwkvKgorCSAqIHJlc2V0IGlzIHJlcXVpcmVkIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBjcnRjX3N0YXRlIGFzIGl0IGlzIHJlcXVpcmVkCisJICogdG8gY3JlYXRlIHRoZSBpbml0aWFsIHN0YXRlIG9iamVjdAorCSAqLworCWlmICghY3J0YyB8fCAhY3J0Yy0+c3RhdGUpCisJCXJldHVybiB0cnVlOworCisJLyogcmVzZXQgbm90IHJlcXVpcmVkIGlmIGNydGMgaXMgYWN0aXZlIGR1cmluZyBzdXNwZW5kIHN0YXRlICovCisJaWYgKHNkZV9rbXNfaXNfc3VzcGVuZF9zdGF0ZShjcnRjLT5kZXYpICYmIGNydGMtPnN0YXRlLT5hY3RpdmUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKICAqIHNkZV9jcnRjX2V2ZW50X3F1ZXVlIC0gcmVxdWVzdCBldmVudCBjYWxsYmFjawogICogQGNydGM6IFBvaW50ZXIgdG8gZHJtIGNydGMgc3RydWN0dXJlCiAgKiBAZnVuYzogUG9pbnRlciB0byBjYWxsYmFjayBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyLmMKaW5kZXggNGE2NDNjYy4uN2M2MDBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlci5jCkBAIC03MSw3ICs3MSw2IEBACiAKICNkZWZpbmUgTUlTUl9CVUZGX1NJWkUJCQkyNTYKIAotI2RlZmluZSBJRExFX1RJTUVPVVQJKDY2IC0gMTYvMikKICNkZWZpbmUgSURMRV9TSE9SVF9USU1FT1VUCTEKIAogLyogTWF4aW11bSBudW1iZXIgb2YgVlNZTkMgd2FpdCBhdHRlbXB0cyBmb3IgUlNDIHN0YXRlIHRyYW5zaXRpb24gKi8KQEAgLTE4MCw2ICsxNzksNyBAQAogICogQGNydGNfZnJhbWVfZXZlbnRfY2JfZGF0YToJY2FsbGJhY2sgaGFuZGxlciBwcml2YXRlIGRhdGEKICAqIEBmcmFtZV9kb25lX3RpbWVvdXQ6CQlmcmFtZSBkb25lIHRpbWVvdXQgaW4gSHoKICAqIEBmcmFtZV9kb25lX3RpbWVyOgkJd2F0Y2hkb2cgdGltZXIgZm9yIGZyYW1lIGRvbmUgZXZlbnQKKyAqIEB2c3luY19ldmVudF90aW1lcjoJCXZzeW5jIHRpbWVyCiAgKiBAcnNjX2NsaWVudDoJCQlyc2MgY2xpZW50IHBvaW50ZXIKICAqIEByc2Nfc3RhdGVfaW5pdDoJCWJvb2xlYW4gdG8gaW5kaWNhdGUgcnNjIGNvbmZpZyBpbml0CiAgKiBAZGlzcF9pbmZvOgkJCWxvY2FsIGNvcHkgb2YgbXNtX2Rpc3BsYXlfaW5mbyBzdHJ1Y3QKQEAgLTE5MiwxMSArMTkyLDEzIEBACiAgKiBAcmNfc3RhdGU6CQkJcmVzb3VyY2UgY29udHJvbGxlciBzdGF0ZQogICogQGRlbGF5ZWRfb2ZmX3dvcms6CQlkZWxheWVkIHdvcmtlciB0byBzY2hlZHVsZSBkaXNhYmxpbmcgb2YKICAqCQkJCWNsa3MgYW5kIHJlc291cmNlcyBhZnRlciBJRExFX1RJTUVPVVQgdGltZS4KKyAqIEB2c3luY19ldmVudF93b3JrOgkJd29ya2VyIHRvIGhhbmRsZSB2c3luYyBldmVudCBmb3IgYXV0b3JlZnJlc2gKICAqIEB0b3BvbG9neTogICAgICAgICAgICAgICAgICAgdG9wb2xvZ3kgb2YgdGhlIGRpc3BsYXkKICAqIEBtb2RlX3NldF9jb21wbGV0ZTogICAgICAgICAgZmxhZyB0byBpbmRpY2F0ZSBtb2Rlc2V0IGNvbXBsZXRpb24KICAqIEByc2NfY29uZmlnOgkJCXJzYyBjb25maWd1cmF0aW9uIGZvciBkaXNwbGF5IHZ0b3RhbCwgZnBzLCBldGMuCiAgKiBAY3VyX2Nvbm5fcm9pOgkJY3VycmVudCBjb25uZWN0b3Igcm9pCiAgKiBAcHJ2X2Nvbm5fcm9pOgkJcHJldmlvdXMgY29ubmVjdG9yIHJvaSB0byBvcHRpbWl6ZSBpZiB1bmNoYW5nZWQKKyAqIEBpZGxlX3RpbWVvdXQ6CQlpZGxlIHRpbWVvdXQgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCiAgKi8KIHN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0IHsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgYmFzZTsKQEAgLTIyNCw2ICsyMjYsNyBAQAogCiAJYXRvbWljX3QgZnJhbWVfZG9uZV90aW1lb3V0OwogCXN0cnVjdCB0aW1lcl9saXN0IGZyYW1lX2RvbmVfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QgdnN5bmNfZXZlbnRfdGltZXI7CiAKIAlzdHJ1Y3Qgc2RlX3JzY19jbGllbnQgKnJzY19jbGllbnQ7CiAJYm9vbCByc2Nfc3RhdGVfaW5pdDsKQEAgLTIzNiwxMiArMjM5LDE1IEBACiAJc3RydWN0IG11dGV4IHJjX2xvY2s7CiAJZW51bSBzZGVfZW5jX3JjX3N0YXRlcyByY19zdGF0ZTsKIAlzdHJ1Y3Qga3RocmVhZF9kZWxheWVkX3dvcmsgZGVsYXllZF9vZmZfd29yazsKKwlzdHJ1Y3Qga3RocmVhZF93b3JrIHZzeW5jX2V2ZW50X3dvcms7CiAJc3RydWN0IG1zbV9kaXNwbGF5X3RvcG9sb2d5IHRvcG9sb2d5OwogCWJvb2wgbW9kZV9zZXRfY29tcGxldGU7CiAKIAlzdHJ1Y3Qgc2RlX3JzY19jbWRfY29uZmlnIHJzY19jb25maWc7CiAJc3RydWN0IHNkZV9yZWN0IGN1cl9jb25uX3JvaTsKIAlzdHJ1Y3Qgc2RlX3JlY3QgcHJ2X2Nvbm5fcm9pOworCisJdTMyIGlkbGVfdGltZW91dDsKIH07CiAKICNkZWZpbmUgdG9fc2RlX2VuY29kZXJfdmlydCh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHNkZV9lbmNvZGVyX3ZpcnQsIGJhc2UpCkBAIC0yNjEsNiArMjY3LDE3IEBACiAJcmV0dXJuIChjb21wX2luZm8tPmNvbXBfdHlwZSA9PSBNU01fRElTUExBWV9DT01QUkVTU0lPTl9EU0MpOwogfQogCit2b2lkIHNkZV9lbmNvZGVyX3NldF9pZGxlX3RpbWVvdXQoc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jLCB1MzIgaWRsZV90aW1lb3V0KQoreworCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0ICpzZGVfZW5jOworCisJaWYgKCFkcm1fZW5jKQorCQlyZXR1cm47CisKKwlzZGVfZW5jID0gdG9fc2RlX2VuY29kZXJfdmlydChkcm1fZW5jKTsKKwlzZGVfZW5jLT5pZGxlX3RpbWVvdXQgPSBpZGxlX3RpbWVvdXQ7Cit9CisKIGJvb2wgc2RlX2VuY29kZXJfaXNfZHNjX21lcmdlKHN0cnVjdCBkcm1fZW5jb2RlciAqZHJtX2VuYykKIHsKIAllbnVtIHNkZV9ybV90b3BvbG9neV9uYW1lIHRvcG9sb2d5OwpAQCAtNDI1LDcgKzQ0Miw3IEBACiAJaXJxID0gJnBoeXNfZW5jLT5pcnFbaW50cl9pZHhdOwogCiAJaWYgKGlycS0+aXJxX2lkeCA+PSAwKSB7Ci0JCVNERV9FUlJPUl9QSFlTKHBoeXNfZW5jLAorCQlTREVfREVCVUdfUEhZUyhwaHlzX2VuYywKIAkJCQkic2tpcHBpbmcgYWxyZWFkeSByZWdpc3RlcmVkIGlycSAlcyB0eXBlICVkXG4iLAogCQkJCWlycS0+bmFtZSwgaXJxLT5pbnRyX3R5cGUpOwogCQlyZXR1cm4gMDsKQEAgLTEyMjQsNiArMTI0MSwxMDIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgX3NkZV9lbmNvZGVyX2RzY19kaXNhYmxlKHN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0ICpzZGVfZW5jKQoreworCWVudW0gc2RlX3JtX3RvcG9sb2d5X25hbWUgdG9wb2xvZ3k7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmRybV9jb25uOworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBzZGVfaHdfcGluZ3BvbmcgKmh3X3BwW01BWF9DSEFOTkVMU19QRVJfRU5DXTsKKwlzdHJ1Y3Qgc2RlX2h3X2RzYyAqaHdfZHNjW01BWF9DSEFOTkVMU19QRVJfRU5DXSA9IHtOVUxMfTsKKwlpbnQgcHBfY291bnQgPSAwOworCWludCBkc2NfY291bnQgPSAwOworCisJaWYgKCFzZGVfZW5jIHx8ICFzZGVfZW5jLT5waHlzX2VuY3NbMF0gfHwKKwkJCSFzZGVfZW5jLT5waHlzX2VuY3NbMF0tPmNvbm5lY3RvcikgeworCQlTREVfRVJST1IoImludmFsaWQgcGFyYW1zICVkICVkXG4iLAorCQkJIXNkZV9lbmMsIHNkZV9lbmMgPyAhc2RlX2VuYy0+cGh5c19lbmNzWzBdIDogLTEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcm1fY29ubiA9IHNkZV9lbmMtPnBoeXNfZW5jc1swXS0+Y29ubmVjdG9yOworCisJdG9wb2xvZ3kgPSBzZGVfY29ubmVjdG9yX2dldF90b3BvbG9neV9uYW1lKGRybV9jb25uKTsKKwlpZiAodG9wb2xvZ3kgPT0gU0RFX1JNX1RPUE9MT0dZX05PTkUpIHsKKwkJU0RFX0VSUk9SX0VOQyhzZGVfZW5jLCAidG9wb2xvZ3kgbm90IHNldCB5ZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHRvcG9sb2d5KSB7CisJY2FzZSBTREVfUk1fVE9QT0xPR1lfU0lOR0xFUElQRToKKwljYXNlIFNERV9STV9UT1BPTE9HWV9TSU5HTEVQSVBFX0RTQzoKKwkJLyogc2luZ2xlIFBQICovCisJCWh3X3BwWzBdID0gc2RlX2VuYy0+aHdfcHBbMF07CisJCWh3X2RzY1swXSA9IHNkZV9lbmMtPmh3X2RzY1swXTsKKwkJcHBfY291bnQgPSAxOworCQlkc2NfY291bnQgPSAxOworCQlicmVhazsKKwljYXNlIFNERV9STV9UT1BPTE9HWV9EVUFMUElQRV9EU0M6CisJY2FzZSBTREVfUk1fVE9QT0xPR1lfRFVBTFBJUEVfM0RNRVJHRV9EU0M6CisJY2FzZSBTREVfUk1fVE9QT0xPR1lfRFVBTFBJUEVfRFNDTUVSR0U6CisJCS8qIGR1YWwgZHNjICovCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFNfUEVSX0VOQzsgaSsrKSB7CisJCQlod19kc2NbaV0gPSBzZGVfZW5jLT5od19kc2NbaV07CisJCQlpZiAoaHdfZHNjW2ldKQorCQkJCWRzY19jb3VudCsrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU0RFX1JNX1RPUE9MT0dZX0RVQUxQSVBFOgorCWNhc2UgU0RFX1JNX1RPUE9MT0dZX0RVQUxQSVBFXzNETUVSR0U6CisJCS8qIGR1YWwgcHAgKi8KKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOTkVMU19QRVJfRU5DOyBpKyspIHsKKwkJCWh3X3BwW2ldID0gc2RlX2VuYy0+aHdfcHBbaV07CisJCQlpZiAoaHdfcHBbaV0pCisJCQkJcHBfY291bnQrKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlTREVfREVCVUdfRU5DKHNkZV9lbmMsICJVbmV4cGVjdGVkIHRvcG9sb2d5OiVkXG4iLCB0b3BvbG9neSk7CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlTREVfRVZUMzIoRFJNSUQoJnNkZV9lbmMtPmJhc2UpLCB0b3BvbG9neSwgcHBfY291bnQsIGRzY19jb3VudCk7CisKKwlpZiAocHBfY291bnQgPiBNQVhfQ0hBTk5FTFNfUEVSX0VOQyB8fAorCQlkc2NfY291bnQgPiBNQVhfQ0hBTk5FTFNfUEVSX0VOQykgeworCQlTREVfRVJST1JfRU5DKHNkZV9lbmMsICJXcm9uZyBjb3VudCBwcDolZCBkc2M6JWQgdG9wOiVkXG4iLAorCQkJCXBwX2NvdW50LCBkc2NfY291bnQsIHRvcG9sb2d5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRGlzYWJsZSBEU0MgZm9yIGFsbCB0aGUgcHAncyBwcmVzZW50IGluIHRoaXMgdG9wb2xvZ3kgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHBfY291bnQ7IGkrKykgeworCisJCWlmICghaHdfcHBbaV0pIHsKKwkJCVNERV9FUlJPUl9FTkMoc2RlX2VuYywgIm51bGwgcHA6JWQgdG9wOiVkIGNudDolZFxuIiwKKwkJCQkJaSwgdG9wb2xvZ3ksIHBwX2NvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGh3X3BwW2ldLT5vcHMuZGlzYWJsZV9kc2MpCisJCQlod19wcFtpXS0+b3BzLmRpc2FibGVfZHNjKGh3X3BwW2ldKTsKKwl9CisKKwkvKiBEaXNhYmxlIERTQyBIVyAqLworCWZvciAoaSA9IDA7IGkgPCBkc2NfY291bnQ7IGkrKykgeworCisJCWlmICghaHdfZHNjW2ldKSB7CisJCQlTREVfRVJST1JfRU5DKHNkZV9lbmMsICJudWxsIGRzYzolZCB0b3A6JWQgY250OiVkXG4iLAorCQkJCQlpLCB0b3BvbG9neSwgZHNjX2NvdW50KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGh3X2RzY1tpXS0+b3BzLmRzY19kaXNhYmxlKQorCQkJaHdfZHNjW2ldLT5vcHMuZHNjX2Rpc2FibGUoaHdfZHNjW2ldKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IF9zZGVfZW5jb2Rlcl91cGRhdGVfcnNjX2NsaWVudCgKIAkJc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jLAogCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfcnNjX2NvbmZpZyAqY29uZmlnLCBib29sIGVuYWJsZSkKQEAgLTEzOTMsMjkgKzE1MDYsMzEgQEAKIHsKIAlzdHJ1Y3Qgc2RlX2VuY29kZXJfdmlydCAqc2RlX2VuYyA9IHRvX3NkZV9lbmNvZGVyX3ZpcnQoZHJtX2VuYyk7CiAJc3RydWN0IHNkZV9lbmNvZGVyX3JzY19jb25maWcgcnNjX2NmZyA9IHsgMCB9OworCWludCBpOwogCiAJaWYgKGVuYWJsZSkgewogCQlyc2NfY2ZnLmlubGluZV9yb3RhdGVfcHJlZmlsbCA9CiAJCQkJc2RlX2NydGNfZ2V0X2lubGluZV9wcmVmaWxsKGRybV9lbmMtPmNydGMpOwogCi0JCS8qIGNvbm5lY3QgdGhlIFRFIHNvdXJjZSB0byBhY3R1YWwgVEUgR1BJTyB0byBkcml2ZSBSU0MgKi8KLQkJX3NkZV9lbmNvZGVyX3VwZGF0ZV92c3luY19zb3VyY2Uoc2RlX2VuYywgJnNkZV9lbmMtPmRpc3BfaW5mbywKLQkJCQlmYWxzZSk7Ci0KIAkJX3NkZV9lbmNvZGVyX3VwZGF0ZV9yc2NfY2xpZW50KGRybV9lbmMsICZyc2NfY2ZnLCB0cnVlKTsKIAl9IGVsc2UgewogCQlfc2RlX2VuY29kZXJfdXBkYXRlX3JzY19jbGllbnQoZHJtX2VuYywgTlVMTCwgZmFsc2UpOwogCiAJCS8qKgotCQkgKiBkaXNjb25uZWN0IHRoZSBURSBzb3VyY2UgZnJvbSB0aGUgYWN0dWFsIFRFIEdQSU8gZm9yIFJTQwotCQkgKgotCQkgKiB0aGlzIGNhbGwgaXMgZm9yIGhhcmR3YXJlIHdvcmthcm91bmQgb24gc2RtODQ1IGFuZCBzaG91bGQKLQkJICogbm90IGJlIHJlbW92ZWQgd2l0aG91dCBjb25zaWRlcmluZyB0aGUgZGVzaWduIGNoYW5nZXMgZm9yCi0JCSAqIHNkZSByc2MgKyBjb21tYW5kIG1vZGUgY29uY3VycmVuY3kuIEl0IG1heSBsZWFkIHRvIHBwCi0JCSAqIHRpbWVvdXQgZHVlIHRvIHZzeW5jIGZyb20gcGFuZWwgZm9yIGNvbW1hbmQgbW9kZSBwYW5lbC4KKwkJICogZGlzYWJsZSB0aGUgdnN5bmMgc291cmNlIGFmdGVyIHVwZGF0aW5nIHRoZSByc2Mgc3RhdGUuIHJzYworCQkgKiBzdGF0ZSB1cGRhdGUgbWlnaHQgaGF2ZSB2c3luYyB3YWl0IGFuZCB2c3luYyBzb3VyY2UgbXVzdCBiZQorCQkgKiBkaXNhYmxlZCBhZnRlciBpdC4gSXQgd2lsbCBhdm9pZCBnZW5lcmF0aW5nIGFueSB2c3luYyBmcm9tCisJCSAqIHRoaXMgcG9pbnQgdGlsbCBtb2RlLTIgZW50cnkuIEl0IGlzIFNXIHdvcmthcm91bmQgZm9yCisJCSAqIEhXIGxpbWl0YXRpb24gYW5kIHNob3VsZCBub3QgYmUgcmVtb3ZlZCB3aXRob3V0IGNoZWNraW5nIHRoZQorCQkgKiB1cGRhdGVkIGRlc2lnbi4KIAkJICovCi0JCV9zZGVfZW5jb2Rlcl91cGRhdGVfdnN5bmNfc291cmNlKHNkZV9lbmMsICZzZGVfZW5jLT5kaXNwX2luZm8sCi0JCQkJdHJ1ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBzZGVfZW5jLT5udW1fcGh5c19lbmNzOyBpKyspIHsKKwkJCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzID0gc2RlX2VuYy0+cGh5c19lbmNzW2ldOworCisJCQlpZiAocGh5cyAmJiBwaHlzLT5vcHMucHJlcGFyZV9pZGxlX3BjKQorCQkJCXBoeXMtPm9wcy5wcmVwYXJlX2lkbGVfcGMocGh5cyk7CisJCX0KKwogCX0KIH0KIApAQCAtMTQ3Miw2ICsxNTg3LDcgQEAKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBtc21fZHJtX3RocmVhZCAqZGlzcF90aHJlYWQ7CiAJaW50IHJldDsKKwlib29sIGlzX3ZpZF9tb2RlID0gZmFsc2U7CiAKIAlpZiAoIWRybV9lbmMgfHwgIWRybV9lbmMtPmRldiB8fCAhZHJtX2VuYy0+ZGV2LT5kZXZfcHJpdmF0ZSB8fAogCQkJIWRybV9lbmMtPmNydGMpIHsKQEAgLTE0ODAsNiArMTU5Niw4IEBACiAJfQogCXNkZV9lbmMgPSB0b19zZGVfZW5jb2Rlcl92aXJ0KGRybV9lbmMpOwogCXByaXYgPSBkcm1fZW5jLT5kZXYtPmRldl9wcml2YXRlOworCWlzX3ZpZF9tb2RlID0gc2RlX2VuYy0+ZGlzcF9pbmZvLmNhcGFiaWxpdGllcyAmCisJCQkJCQlNU01fRElTUExBWV9DQVBfVklEX01PREU7CiAKIAlpZiAoZHJtX2VuYy0+Y3J0Yy0+aW5kZXggPj0gQVJSQVlfU0laRShwcml2LT5kaXNwX3RocmVhZCkpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGNydGMgaW5kZXhcbiIpOwpAQCAtMTQ4OSw3ICsxNjA3LDcgQEAKIAogCS8qCiAJICogd2hlbiBpZGxlX3BjIGlzIG5vdCBzdXBwb3J0ZWQsIHByb2Nlc3Mgb25seSBLSUNLT0ZGLCBTVE9QIGFuZCBNT0RFU0VUCi0JICogZXZlbnRzIGFuZCByZXR1cm4gZWFybHkgZm9yIG90aGVyIGV2ZW50cyAoaWUgdmlkZW8gbW9kZSkuCisJICogZXZlbnRzIGFuZCByZXR1cm4gZWFybHkgZm9yIG90aGVyIGV2ZW50cyAoaWUgd2IgZGlzcGxheSkuCiAJICovCiAJaWYgKCFzZGVfZW5jLT5pZGxlX3BjX3N1cHBvcnRlZCAmJgogCQkJKHN3X2V2ZW50ICE9IFNERV9FTkNfUkNfRVZFTlRfS0lDS09GRiAmJgpAQCAtMTUxOCw2ICsxNjM2LDggQEAKIAkJaWYgKHNkZV9lbmMtPnJjX3N0YXRlID09IFNERV9FTkNfUkNfU1RBVEVfT04pIHsKIAkJCVNERV9ERUJVR19FTkMoc2RlX2VuYywgInN3X2V2ZW50OiVkLCByYyBpbiBPTiBzdGF0ZVxuIiwKIAkJCQkJc3dfZXZlbnQpOworCQkJU0RFX0VWVDMyKERSTUlEKGRybV9lbmMpLCBzd19ldmVudCwgc2RlX2VuYy0+cmNfc3RhdGUsCisJCQkJU0RFX0VWVExPR19GVU5DX0NBU0UxKTsKIAkJCW11dGV4X3VubG9jaygmc2RlX2VuYy0+cmNfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIGlmIChzZGVfZW5jLT5yY19zdGF0ZSAhPSBTREVfRU5DX1JDX1NUQVRFX09GRiAmJgpAQCAtMTUzMCw5ICsxNjUwLDEzIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCS8qIGVuYWJsZSBhbGwgdGhlIGNsa3MgYW5kIHJlc291cmNlcyAqLwotCQlfc2RlX2VuY29kZXJfcmVzb3VyY2VfY29udHJvbF9oZWxwZXIoZHJtX2VuYywgdHJ1ZSk7Ci0JCV9zZGVfZW5jb2Rlcl9yZXNvdXJjZV9jb250cm9sX3JzY191cGRhdGUoZHJtX2VuYywgdHJ1ZSk7CisJCWlmIChpc192aWRfbW9kZSAmJiBzZGVfZW5jLT5yY19zdGF0ZSA9PSBTREVfRU5DX1JDX1NUQVRFX0lETEUpIHsKKwkJCV9zZGVfZW5jb2Rlcl9pcnFfY29udHJvbChkcm1fZW5jLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGVuYWJsZSBhbGwgdGhlIGNsa3MgYW5kIHJlc291cmNlcyAqLworCQkJX3NkZV9lbmNvZGVyX3Jlc291cmNlX2NvbnRyb2xfaGVscGVyKGRybV9lbmMsIHRydWUpOworCQkJX3NkZV9lbmNvZGVyX3Jlc291cmNlX2NvbnRyb2xfcnNjX3VwZGF0ZShkcm1fZW5jLCB0cnVlKTsKKwkJfQogCiAJCVNERV9FVlQzMihEUk1JRChkcm1fZW5jKSwgc3dfZXZlbnQsIHNkZV9lbmMtPnJjX3N0YXRlLAogCQkJCVNERV9FTkNfUkNfU1RBVEVfT04sIFNERV9FVlRMT0dfRlVOQ19DQVNFMSk7CkBAIC0xNTYyLDYgKzE2ODYsOCBAQAogCQkgKi8KIAkJaWYgKHNkZV9jcnRjX2ZyYW1lX3BlbmRpbmcoZHJtX2VuYy0+Y3J0YykgPiAxKSB7CiAJCQlTREVfREVCVUdfRU5DKHNkZV9lbmMsICJza2lwIHNjaGVkdWxlIHdvcmsiKTsKKwkJCVNERV9FVlQzMihEUk1JRChkcm1fZW5jKSwgc3dfZXZlbnQsIHNkZV9lbmMtPnJjX3N0YXRlLAorCQkJCVNERV9FVlRMT0dfRlVOQ19DQVNFMik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC0xNTgyLDcgKzE3MDgsNyBAQAogCQlpZiAobHAgPT0gU0RFX01PREVfRFBNU19MUDIpCiAJCQlpZGxlX3RpbWVvdXQgPSBJRExFX1NIT1JUX1RJTUVPVVQ7CiAJCWVsc2UKLQkJCWlkbGVfdGltZW91dCA9IElETEVfVElNRU9VVDsKKwkJCWlkbGVfdGltZW91dCA9IHNkZV9lbmMtPmlkbGVfdGltZW91dDsKIAogCQlpZiAoIWF1dG9yZWZyZXNoX2VuYWJsZWQpCiAJCQlrdGhyZWFkX3F1ZXVlX2RlbGF5ZWRfd29yaygKQEAgLTE2MDUsMTEgKzE3MzEsMTcgQEAKIAogCQltdXRleF9sb2NrKCZzZGVfZW5jLT5yY19sb2NrKTsKIAorCQlpZiAoaXNfdmlkX21vZGUgJiYKKwkJCSAgc2RlX2VuYy0+cmNfc3RhdGUgPT0gU0RFX0VOQ19SQ19TVEFURV9JRExFKSB7CisJCQlfc2RlX2VuY29kZXJfaXJxX2NvbnRyb2woZHJtX2VuYywgdHJ1ZSk7CisJCX0KIAkJLyogc2tpcCBpZiBpcyBhbHJlYWR5IE9GRiBvciBJRExFLCByZXNvdXJjZXMgYXJlIG9mZiBhbHJlYWR5ICovCi0JCWlmIChzZGVfZW5jLT5yY19zdGF0ZSA9PSBTREVfRU5DX1JDX1NUQVRFX09GRiB8fAorCQllbHNlIGlmIChzZGVfZW5jLT5yY19zdGF0ZSA9PSBTREVfRU5DX1JDX1NUQVRFX09GRiB8fAogCQkJCXNkZV9lbmMtPnJjX3N0YXRlID09IFNERV9FTkNfUkNfU1RBVEVfSURMRSkgewogCQkJU0RFX0RFQlVHX0VOQyhzZGVfZW5jLCAic3dfZXZlbnQ6JWQsIHJjIGluICVkIHN0YXRlXG4iLAogCQkJCQlzd19ldmVudCwgc2RlX2VuYy0+cmNfc3RhdGUpOworCQkJU0RFX0VWVDMyKERSTUlEKGRybV9lbmMpLCBzd19ldmVudCwgc2RlX2VuYy0+cmNfc3RhdGUsCisJCQkJU0RFX0VWVExPR19GVU5DX0NBU0UzKTsKIAkJCW11dGV4X3VubG9jaygmc2RlX2VuYy0+cmNfbG9jayk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTYzNiw2ICsxNzY4LDggQEAKIAkJaWYgKHNkZV9lbmMtPnJjX3N0YXRlID09IFNERV9FTkNfUkNfU1RBVEVfT0ZGKSB7CiAJCQlTREVfREVCVUdfRU5DKHNkZV9lbmMsICJzd19ldmVudDolZCwgcmMgaW4gT0ZGIHN0YXRlXG4iLAogCQkJCQlzd19ldmVudCk7CisJCQlTREVfRVZUMzIoRFJNSUQoZHJtX2VuYyksIHN3X2V2ZW50LCBzZGVfZW5jLT5yY19zdGF0ZSwKKwkJCQlTREVfRVZUTE9HX0ZVTkNfQ0FTRTQpOwogCQkJbXV0ZXhfdW5sb2NrKCZzZGVfZW5jLT5yY19sb2NrKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgaWYgKHNkZV9lbmMtPnJjX3N0YXRlID09IFNERV9FTkNfUkNfU1RBVEVfT04gfHwKQEAgLTE3NTYsOSArMTg5MCwxNSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQkvKiBkaXNhYmxlIGFsbCB0aGUgY2xrcyBhbmQgcmVzb3VyY2VzICovCi0JCV9zZGVfZW5jb2Rlcl9yZXNvdXJjZV9jb250cm9sX3JzY191cGRhdGUoZHJtX2VuYywgZmFsc2UpOwotCQlfc2RlX2VuY29kZXJfcmVzb3VyY2VfY29udHJvbF9oZWxwZXIoZHJtX2VuYywgZmFsc2UpOworCQlpZiAoaXNfdmlkX21vZGUpIHsKKwkJCV9zZGVfZW5jb2Rlcl9pcnFfY29udHJvbChkcm1fZW5jLCBmYWxzZSk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXNhYmxlIGFsbCB0aGUgY2xrcyBhbmQgcmVzb3VyY2VzICovCisJCQlfc2RlX2VuY29kZXJfcmVzb3VyY2VfY29udHJvbF9yc2NfdXBkYXRlKGRybV9lbmMsCisJCQkJCQkJCWZhbHNlKTsKKwkJCV9zZGVfZW5jb2Rlcl9yZXNvdXJjZV9jb250cm9sX2hlbHBlcihkcm1fZW5jLCBmYWxzZSk7CisJCX0KKwogCQlTREVfRVZUMzIoRFJNSUQoZHJtX2VuYyksIHN3X2V2ZW50LCBzZGVfZW5jLT5yY19zdGF0ZSwKIAkJCQlTREVfRU5DX1JDX1NUQVRFX0lETEUsIFNERV9FVlRMT0dfRlVOQ19DQVNFNyk7CiAJCXNkZV9lbmMtPnJjX3N0YXRlID0gU0RFX0VOQ19SQ19TVEFURV9JRExFOwpAQCAtMTc3NywyMCArMTkxNyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX29mZl93b3JrKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCi17Ci0Jc3RydWN0IHNkZV9lbmNvZGVyX3ZpcnQgKnNkZV9lbmMgPSBjb250YWluZXJfb2Yod29yaywKLQkJCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0LCBkZWxheWVkX29mZl93b3JrLndvcmspOwotCi0JaWYgKCFzZGVfZW5jKSB7Ci0JCVNERV9FUlJPUigiaW52YWxpZCBzZGUgZW5jb2RlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzZGVfZW5jb2Rlcl9yZXNvdXJjZV9jb250cm9sKCZzZGVfZW5jLT5iYXNlLAotCQkJU0RFX0VOQ19SQ19FVkVOVF9FTlRFUl9JRExFKTsKLX0KLQogc3RhdGljIHZvaWQgc2RlX2VuY29kZXJfdmlydF9tb2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmRybV9lbmMsCiAJCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCiAJCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkal9tb2RlKQpAQCAtMTg1Miw2ICsxOTc4LDEyIEBACiAJCQkJCXJldCk7CiAJCQlyZXR1cm47CiAJCX0KKworCQkvKgorCQkgKiBEaXNhYmxlIGRzYyBiZWZvcmUgc3dpdGNoIHRoZSBtb2RlIGFuZCBhZnRlciBwcmVfbW9kZXNldCwKKwkJICogdG8gZ3VhcmFudGVlIHRoYXQgcHJldmlvdXMga2lja29mZiBmaW5pc2hlZC4KKwkJICovCisJCV9zZGVfZW5jb2Rlcl9kc2NfZGlzYWJsZShzZGVfZW5jKTsKIAl9CiAKIAkvKiBSZXNlcnZlIGR5bmFtaWMgcmVzb3VyY2VzIG5vdy4gSW5kaWNhdGluZyBub24tQXRvbWljVGVzdCBwaGFzZSAqLwpAQCAtMjA4Myw2ICsyMjE1LDEzIEBACiAJCQlwaHlzLT5vcHMuZGlzYWJsZShwaHlzKTsKIAl9CiAKKwkvKgorCSAqIGRpc2FibGUgZHNjIGFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSAoZm9yIGNvbW1hbmQgbW9kZSkKKwkgKiBhbmQgYWZ0ZXIgcGh5c2ljYWwgZW5jb2RlciBpcyBkaXNhYmxlZCwgdG8gbWFrZSBzdXJlIHRpbWluZworCSAqIGVuZ2luZSBpcyBhbHJlYWR5IGRpc2FibGVkIChmb3IgdmlkZW8gbW9kZSkuCisJICovCisJX3NkZV9lbmNvZGVyX2RzY19kaXNhYmxlKHNkZV9lbmMpOworCiAJLyogYWZ0ZXIgcGh5cyB3YWl0cyBmb3IgZnJhbWUtZG9uZSwgc2hvdWxkIGJlIG5vIG1vcmUgZnJhbWVzIHBlbmRpbmcgKi8KIAlpZiAoYXRvbWljX3hjaGcoJnNkZV9lbmMtPmZyYW1lX2RvbmVfdGltZW91dCwgMCkpIHsKIAkJU0RFX0VSUk9SKCJlbmMlZCB0aW1lb3V0IHBlbmRpbmdcbiIsIGRybV9lbmMtPmJhc2UuaWQpOwpAQCAtMjA5MSwxMSArMjIzMCwxMyBAQAogCiAJc2RlX2VuY29kZXJfcmVzb3VyY2VfY29udHJvbChkcm1fZW5jLCBTREVfRU5DX1JDX0VWRU5UX1NUT1ApOwogCi0JaWYgKHNkZV9lbmMtPmN1cl9tYXN0ZXIpIHsKLQkJc2RlX2VuYy0+Y3VyX21hc3Rlci0+Y29ubmVjdG9yID0gTlVMTDsKLQkJc2RlX2VuYy0+Y3VyX21hc3RlciA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IHNkZV9lbmMtPm51bV9waHlzX2VuY3M7IGkrKykgeworCQlpZiAoc2RlX2VuYy0+cGh5c19lbmNzW2ldKQorCQkJc2RlX2VuYy0+cGh5c19lbmNzW2ldLT5jb25uZWN0b3IgPSBOVUxMOwogCX0KIAorCXNkZV9lbmMtPmN1cl9tYXN0ZXIgPSBOVUxMOworCiAJU0RFX0RFQlVHX0VOQyhzZGVfZW5jLCAiZW5jb2RlciBkaXNhYmxlZFxuIik7CiAKIAlzZGVfcm1fcmVsZWFzZSgmc2RlX2ttcy0+cm0sIGRybV9lbmMpOwpAQCAtMjI1OSw2ICsyNDAwLDIzIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZGVfZW5jb2Rlcl9vZmZfd29yayhzdHJ1Y3Qga3RocmVhZF93b3JrICp3b3JrKQoreworCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0ICpzZGVfZW5jID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfdmlydCwgZGVsYXllZF9vZmZfd29yay53b3JrKTsKKworCWlmICghc2RlX2VuYykgeworCQlTREVfRVJST1IoImludmFsaWQgc2RlIGVuY29kZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJc2RlX2VuY29kZXJfcmVzb3VyY2VfY29udHJvbCgmc2RlX2VuYy0+YmFzZSwKKwkJCQkJCVNERV9FTkNfUkNfRVZFTlRfRU5URVJfSURMRSk7CisKKwlzZGVfZW5jb2Rlcl9mcmFtZV9kb25lX2NhbGxiYWNrKCZzZGVfZW5jLT5iYXNlLCBOVUxMLAorCQkJCVNERV9FTkNPREVSX0ZSQU1FX0VWRU5UX0lETEUpOworfQorCiAvKioKICAqIF9zZGVfZW5jb2Rlcl90cmlnZ2VyX2ZsdXNoIC0gdHJpZ2dlciBmbHVzaCBmb3IgYSBwaHlzaWNhbCBlbmNvZGVyCiAgKiBkcm1fZW5jOiBQb2ludGVyIHRvIGRybSBlbmNvZGVyIHN0cnVjdHVyZQpAQCAtMjQ3OSw3ICsyNjM3LDggQEAKIAkJCQlwaHlzLT5zcGxpdF9yb2xlID09IEVOQ19ST0xFX1NMQVZFKSAmJgogCQkJCXBoeXMtPnNwbGl0X3JvbGUgIT0gRU5DX1JPTEVfU0tJUCkKIAkJCXNldF9iaXQoaSwgc2RlX2VuYy0+ZnJhbWVfYnVzeV9tYXNrKTsKLQorCQlpZiAocGh5cy0+aHdfY3RsLT5vcHMucmVnX2RtYV9mbHVzaCkKKwkJCXBoeXMtPmh3X2N0bC0+b3BzLnJlZ19kbWFfZmx1c2gocGh5cy0+aHdfY3RsKTsKIAkJaWYgKCFwaHlzLT5vcHMubmVlZHNfc2luZ2xlX2ZsdXNoIHx8CiAJCQkJIXBoeXMtPm9wcy5uZWVkc19zaW5nbGVfZmx1c2gocGh5cykpCiAJCQlfc2RlX2VuY29kZXJfdHJpZ2dlcl9mbHVzaCgmc2RlX2VuYy0+YmFzZSwgcGh5cywgMHgwKTsKQEAgLTI2ODksNiArMjg0OCwxNjUgQEAKIAkJcGh5cy0+aHdfcHAtPm9wcy5zZXR1cF9kaXRoZXIocGh5cy0+aHdfcHAsIGRpdGhlcl9jZmcsIGxlbik7CiB9CiAKK3N0YXRpYyB1MzIgX3NkZV9lbmNvZGVyX2NhbGN1bGF0ZV9saW5ldGltZShzdHJ1Y3Qgc2RlX2VuY29kZXJfdmlydCAqc2RlX2VuYywKKwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJdTY0IHBjbGtfcmF0ZTsKKwl1MzIgcGNsa19wZXJpb2Q7CisJdTMyIGxpbmVfdGltZTsKKworCS8qCisJICogRm9yIGxpbmV0aW1lIGNhbGN1bGF0aW9uLCBvbmx5IG9wZXJhdGUgb24gbWFzdGVyIGVuY29kZXIuCisJICovCisJaWYgKCFzZGVfZW5jLT5jdXJfbWFzdGVyKQorCQlyZXR1cm4gMDsKKworCWlmICghc2RlX2VuYy0+Y3VyX21hc3Rlci0+b3BzLmdldF9saW5lX2NvdW50KSB7CisJCVNERV9FUlJPUigiZ2V0X2xpbmVfY291bnQgZnVuY3Rpb24gbm90IGRlZmluZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwY2xrX3JhdGUgPSBtb2RlLT5jbG9jazsgLyogcGl4ZWwgY2xvY2sgaW4ga0h6ICovCisJaWYgKHBjbGtfcmF0ZSA9PSAwKSB7CisJCVNERV9FUlJPUigicGNsayBpcyAwLCBjYW5ub3QgY2FsY3VsYXRlIGxpbmUgdGltZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXBjbGtfcGVyaW9kID0gRElWX1JPVU5EX1VQX1VMTCgxMDAwMDAwMDAwdWxsLCBwY2xrX3JhdGUpOworCWlmIChwY2xrX3BlcmlvZCA9PSAwKSB7CisJCVNERV9FUlJPUigicGNsayBwZXJpb2QgaXMgMFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTGluZSB0aW1lIGNhbGN1bGF0aW9uIGJhc2VkIG9uIFBpeGVsIGNsb2NrIGFuZCBIVE9UQUwuCisJICogRmluYWwgdW5pdCBpcyBpbiBucy4KKwkgKi8KKwlsaW5lX3RpbWUgPSAocGNsa19wZXJpb2QgKiBtb2RlLT5odG90YWwpIC8gMTAwMDsKKwlpZiAobGluZV90aW1lID09IDApIHsKKwkJU0RFX0VSUk9SKCJsaW5lIHRpbWUgY2FsY3VsYXRpb24gaXMgMFxuIik7CisJCXJldHVybiAwOworCX0KKworCVNERV9ERUJVR19FTkMoc2RlX2VuYywKKwkJCSJjbGtfcmF0ZT0lbGxka0h6LCBjbGtfcGVyaW9kPSVkLCBsaW5ldGltZT0lZG5zXG4iLAorCQkJcGNsa19yYXRlLCBwY2xrX3BlcmlvZCwgbGluZV90aW1lKTsKKworCXJldHVybiBsaW5lX3RpbWU7Cit9CisKK3N0YXRpYyBpbnQgX3NkZV9lbmNvZGVyX3dha2V1cF90aW1lKHN0cnVjdCBkcm1fZW5jb2RlciAqZHJtX2VuYywKKwkJa3RpbWVfdCAqd2FrZXVwX3RpbWUpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7CisJc3RydWN0IHNkZV9lbmNvZGVyX3ZpcnQgKnNkZV9lbmM7CisJdTMyIGN1cl9saW5lOworCXUzMiBsaW5lX3RpbWU7CisJdTMyIHZ0b3RhbCwgdGltZV90b192c3luYzsKKwlrdGltZV90IGN1cl90aW1lOworCisJc2RlX2VuYyA9IHRvX3NkZV9lbmNvZGVyX3ZpcnQoZHJtX2VuYyk7CisKKwlpZiAoIWRybV9lbmMtPmNydGMgfHwgIWRybV9lbmMtPmNydGMtPnN0YXRlKSB7CisJCVNERV9FUlJPUigiY3J0Yy9jcnRjIHN0YXRlIG9iamVjdCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1vZGUgPSAmZHJtX2VuYy0+Y3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7CisKKwlsaW5lX3RpbWUgPSBfc2RlX2VuY29kZXJfY2FsY3VsYXRlX2xpbmV0aW1lKHNkZV9lbmMsIG1vZGUpOworCWlmICghbGluZV90aW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN1cl9saW5lID0gc2RlX2VuYy0+Y3VyX21hc3Rlci0+b3BzLmdldF9saW5lX2NvdW50KHNkZV9lbmMtPmN1cl9tYXN0ZXIpOworCisJdnRvdGFsID0gbW9kZS0+dnRvdGFsOworCWlmIChjdXJfbGluZSA+PSB2dG90YWwpCisJCXRpbWVfdG9fdnN5bmMgPSBsaW5lX3RpbWUgKiB2dG90YWw7CisJZWxzZQorCQl0aW1lX3RvX3ZzeW5jID0gbGluZV90aW1lICogKHZ0b3RhbCAtIGN1cl9saW5lKTsKKworCWlmICh0aW1lX3RvX3ZzeW5jID09IDApIHsKKwkJU0RFX0VSUk9SKCJ0aW1lIHRvIHZzeW5jIHNob3VsZCBub3QgYmUgemVybywgdnRvdGFsPSVkXG4iLAorCQkJCXZ0b3RhbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN1cl90aW1lID0ga3RpbWVfZ2V0KCk7CisJKndha2V1cF90aW1lID0ga3RpbWVfYWRkX25zKGN1cl90aW1lLCB0aW1lX3RvX3ZzeW5jKTsKKworCVNERV9ERUJVR19FTkMoc2RlX2VuYywKKwkJCSJjdXJfbGluZT0ldSB2dG90YWw9JXUgdGltZV90b192c3luYz0ldSwgY3VyX3RpbWU9JWxsZCwgd2FrZXVwX3RpbWU9JWxsZFxuIiwKKwkJCWN1cl9saW5lLCB2dG90YWwsIHRpbWVfdG9fdnN5bmMsCisJCQlrdGltZV90b19tcyhjdXJfdGltZSksCisJCQlrdGltZV90b19tcygqd2FrZXVwX3RpbWUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2RlX2VuY29kZXJfdnN5bmNfZXZlbnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jID0gKHN0cnVjdCBkcm1fZW5jb2RlciAqKSBkYXRhOworCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0ICpzZGVfZW5jOworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IG1zbV9kcm1fdGhyZWFkICpldmVudF90aHJlYWQ7CisJYm9vbCBhdXRvcmVmcmVzaF9lbmFibGVkID0gZmFsc2U7CisKKwlpZiAoIWRybV9lbmMgfHwgIWRybV9lbmMtPmRldiB8fCAhZHJtX2VuYy0+ZGV2LT5kZXZfcHJpdmF0ZSB8fAorCQkJIWRybV9lbmMtPmNydGMpIHsKKwkJU0RFX0VSUk9SKCJpbnZhbGlkIHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm47CisJfQorCisJc2RlX2VuYyA9IHRvX3NkZV9lbmNvZGVyX3ZpcnQoZHJtX2VuYyk7CisJcHJpdiA9IGRybV9lbmMtPmRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZHJtX2VuYy0+Y3J0Yy0+aW5kZXggPj0gQVJSQVlfU0laRShwcml2LT5ldmVudF90aHJlYWQpKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBjcnRjIGluZGV4XG4iKTsKKwkJcmV0dXJuOworCX0KKwlldmVudF90aHJlYWQgPSAmcHJpdi0+ZXZlbnRfdGhyZWFkW2RybV9lbmMtPmNydGMtPmluZGV4XTsKKwlpZiAoIWV2ZW50X3RocmVhZCkgeworCQlTREVfRVJST1IoImV2ZW50X3RocmVhZCBub3QgZm91bmQgZm9yIGNydGM6JWRcbiIsCisJCQkJZHJtX2VuYy0+Y3J0Yy0+aW5kZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNkZV9lbmMtPmN1cl9tYXN0ZXIgJiYKKwkJc2RlX2VuYy0+Y3VyX21hc3Rlci0+b3BzLmlzX2F1dG9yZWZyZXNoX2VuYWJsZWQpCisJCWF1dG9yZWZyZXNoX2VuYWJsZWQgPQorCQkJc2RlX2VuYy0+Y3VyX21hc3Rlci0+b3BzLmlzX2F1dG9yZWZyZXNoX2VuYWJsZWQoCisJCQkJCQlzZGVfZW5jLT5jdXJfbWFzdGVyKTsKKworCS8qCisJICogUXVldWUgd29yayB0byB1cGRhdGUgdGhlIHZzeW5jIGV2ZW50IHRpbWVyCisJICogaWYgYXV0b3JlZnJlc2ggaXMgZW5hYmxlZC4KKwkgKi8KKwlTREVfRVZUMzJfVkVSQk9TRShhdXRvcmVmcmVzaF9lbmFibGVkKTsKKwlpZiAoYXV0b3JlZnJlc2hfZW5hYmxlZCkKKwkJa3RocmVhZF9xdWV1ZV93b3JrKCZldmVudF90aHJlYWQtPndvcmtlciwKKwkJCQkmc2RlX2VuYy0+dnN5bmNfZXZlbnRfd29yayk7CisJZWxzZQorCQlkZWxfdGltZXIoJnNkZV9lbmMtPnZzeW5jX2V2ZW50X3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgc2RlX2VuY29kZXJfdnN5bmNfZXZlbnRfd29ya19oYW5kbGVyKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IHNkZV9lbmNvZGVyX3ZpcnQgKnNkZV9lbmMgPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0LCB2c3luY19ldmVudF93b3JrKTsKKwlrdGltZV90IHdha2V1cF90aW1lOworCisJaWYgKCFzZGVfZW5jKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBzZGUgZW5jb2RlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoX3NkZV9lbmNvZGVyX3dha2V1cF90aW1lKCZzZGVfZW5jLT5iYXNlLCAmd2FrZXVwX3RpbWUpKQorCQlyZXR1cm47CisKKwlTREVfRVZUMzJfVkVSQk9TRShrdGltZV90b19tcyh3YWtldXBfdGltZSkpOworCW1vZF90aW1lcigmc2RlX2VuYy0+dnN5bmNfZXZlbnRfdGltZXIsCisJCQluc2Vjc190b19qaWZmaWVzKGt0aW1lX3RvX25zKHdha2V1cF90aW1lKSkpOworfQorCiB2b2lkIHNkZV9lbmNvZGVyX3ByZXBhcmVfZm9yX2tpY2tvZmYoc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jLAogCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfa2lja29mZl9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTI3NTIsMTEgKzMwNzAsNTEgQEAKIAl9CiB9CiAKLXZvaWQgc2RlX2VuY29kZXJfa2lja29mZihzdHJ1Y3QgZHJtX2VuY29kZXIgKmRybV9lbmMpCisvKioKKyAqIF9zZGVfZW5jb2Rlcl9yZXNldF9jdGxfaHcgLSByZXNldCBoL3cgY29uZmlndXJhdGlvbiBmb3IgYWxsIGN0bCdzIGFzc29jaWF0ZWQKKyAqCXdpdGggdGhlIHNwZWNpZmllZCBlbmNvZGVyLCBhbmQgdW5zdGFnZSBhbGwgcGlwZXMgZnJvbSBpdAorICogQGVuY29kZXI6CWVuY29kZXIgcG9pbnRlcgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX3NkZV9lbmNvZGVyX3Jlc2V0X2N0bF9odyhzdHJ1Y3QgZHJtX2VuY29kZXIgKmRybV9lbmMpCiB7CiAJc3RydWN0IHNkZV9lbmNvZGVyX3ZpcnQgKnNkZV9lbmM7CiAJc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXM7CiAJdW5zaWduZWQgaW50IGk7CisJaW50IHJjID0gMDsKKworCWlmICghZHJtX2VuYykgeworCQlTREVfRVJST1IoImludmFsaWQgZW5jb2RlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNkZV9lbmMgPSB0b19zZGVfZW5jb2Rlcl92aXJ0KGRybV9lbmMpOworCisJU0RFX0FUUkFDRV9CRUdJTigiZW5jb2Rlcl9yZWxlYXNlX2xtIik7CisJU0RFX0RFQlVHX0VOQyhzZGVfZW5jLCAiXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBzZGVfZW5jLT5udW1fcGh5c19lbmNzOyBpKyspIHsKKwkJcGh5cyA9IHNkZV9lbmMtPnBoeXNfZW5jc1tpXTsKKwkJaWYgKCFwaHlzKQorCQkJY29udGludWU7CisKKwkJU0RFX0VWVDMyKERSTUlEKGRybV9lbmMpLCBwaHlzLT5pbnRmX2lkeCAtIElOVEZfMCk7CisKKwkJcmMgPSBzZGVfZW5jb2Rlcl9oZWxwZXJfcmVzZXRfbWl4ZXJzKHBoeXMsIE5VTEwpOworCQlpZiAocmMpCisJCQlTREVfRVZUMzIoRFJNSUQoZHJtX2VuYyksIHJjLCBTREVfRVZUTE9HX0VSUk9SKTsKKwl9CisKKwlTREVfQVRSQUNFX0VORCgiZW5jb2Rlcl9yZWxlYXNlX2xtIik7CisJcmV0dXJuIHJjOworfQorCit2b2lkIHNkZV9lbmNvZGVyX2tpY2tvZmYoc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jLCBib29sIGlzX2Vycm9yKQoreworCXN0cnVjdCBzZGVfZW5jb2Rlcl92aXJ0ICpzZGVfZW5jOworCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzOworCWt0aW1lX3Qgd2FrZXVwX3RpbWU7CisJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWRybV9lbmMpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGVuY29kZXJcbiIpOwpAQCAtMjc3Myw2ICszMTMxLDEwIEBACiAJbW9kX3RpbWVyKCZzZGVfZW5jLT5mcmFtZV9kb25lX3RpbWVyLCBqaWZmaWVzICsKIAkJKChhdG9taWNfcmVhZCgmc2RlX2VuYy0+ZnJhbWVfZG9uZV90aW1lb3V0KSAqIEhaKSAvIDEwMDApKTsKIAorCS8qIGNyZWF0ZSBhICdubyBwaXBlcycgY29tbWl0IHRvIHJlbGVhc2UgYnVmZmVycyBvbiBlcnJvcnMgKi8KKwlpZiAoaXNfZXJyb3IpCisJCV9zZGVfZW5jb2Rlcl9yZXNldF9jdGxfaHcoZHJtX2VuYyk7CisKIAkvKiBBbGwgcGh5cyBlbmNzIGFyZSByZWFkeSB0byBnbywgdHJpZ2dlciB0aGUga2lja29mZiAqLwogCV9zZGVfZW5jb2Rlcl9raWNrb2ZmX3BoeXMoc2RlX2VuYyk7CiAKQEAgLTI3ODIsMTAgKzMxNDQsMTggQEAKIAkJaWYgKHBoeXMgJiYgcGh5cy0+b3BzLmhhbmRsZV9wb3N0X2tpY2tvZmYpCiAJCQlwaHlzLT5vcHMuaGFuZGxlX3Bvc3Rfa2lja29mZihwaHlzKTsKIAl9CisKKwlpZiAoc2RlX2VuYy0+ZGlzcF9pbmZvLmludGZfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFNJICYmCisJCQkhX3NkZV9lbmNvZGVyX3dha2V1cF90aW1lKGRybV9lbmMsICZ3YWtldXBfdGltZSkpIHsKKwkJU0RFX0VWVDMyX1ZFUkJPU0Uoa3RpbWVfdG9fbXMod2FrZXVwX3RpbWUpKTsKKwkJbW9kX3RpbWVyKCZzZGVfZW5jLT52c3luY19ldmVudF90aW1lciwKKwkJCQluc2Vjc190b19qaWZmaWVzKGt0aW1lX3RvX25zKHdha2V1cF90aW1lKSkpOworCX0KKwogCVNERV9BVFJBQ0VfRU5EKCJlbmNvZGVyX2tpY2tvZmYiKTsKIH0KIAotaW50IHNkZV9lbmNvZGVyX2hlbHBlcl9od19yZWxlYXNlKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYywKK2ludCBzZGVfZW5jb2Rlcl9oZWxwZXJfcmVzZXRfbWl4ZXJzKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYywKIAkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCiB7CiAJc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jOwpAQCAtMjgwMiw4ICszMTcyLDYgQEAKIAltZW1zZXQoJm1peGVyLCAwLCBzaXplb2YobWl4ZXIpKTsKIAogCS8qIHJlc2V0IGFzc29jaWF0ZWQgQ1RML0xNcyAqLwotCWlmIChwaHlzX2VuYy0+aHdfY3RsLT5vcHMuY2xlYXJfcGVuZGluZ19mbHVzaCkKLQkJcGh5c19lbmMtPmh3X2N0bC0+b3BzLmNsZWFyX3BlbmRpbmdfZmx1c2gocGh5c19lbmMtPmh3X2N0bCk7CiAJaWYgKHBoeXNfZW5jLT5od19jdGwtPm9wcy5jbGVhcl9hbGxfYmxlbmRzdGFnZXMpCiAJCXBoeXNfZW5jLT5od19jdGwtPm9wcy5jbGVhcl9hbGxfYmxlbmRzdGFnZXMocGh5c19lbmMtPmh3X2N0bCk7CiAKQEAgLTI4NDMsNyArMzIxMSw3IEBACiAJfQogCiAJaWYgKCFsbV92YWxpZCkgewotCQlTREVfREVCVUdfRU5DKHRvX3NkZV9lbmNvZGVyX3ZpcnQoZHJtX2VuYyksICJsbSBub3QgZm91bmRcbiIpOworCQlTREVfRVJST1JfRU5DKHRvX3NkZV9lbmNvZGVyX3ZpcnQoZHJtX2VuYyksICJsbSBub3QgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zMjQ2LDcgKzM2MTQsOCBAQAogCiAJU0RFX0RFQlVHKCJkc2lfaW5mby0+bnVtX29mX2hfdGlsZXMgJWRcbiIsIGRpc3BfaW5mby0+bnVtX29mX2hfdGlsZXMpOwogCi0JaWYgKGRpc3BfaW5mby0+Y2FwYWJpbGl0aWVzICYgTVNNX0RJU1BMQVlfQ0FQX0NNRF9NT0RFKQorCWlmICgoZGlzcF9pbmZvLT5jYXBhYmlsaXRpZXMgJiBNU01fRElTUExBWV9DQVBfQ01EX01PREUpIHx8CisJICAgIChkaXNwX2luZm8tPmNhcGFiaWxpdGllcyAmIE1TTV9ESVNQTEFZX0NBUF9WSURfTU9ERSkpCiAJCXNkZV9lbmMtPmlkbGVfcGNfc3VwcG9ydGVkID0gc2RlX2ttcy0+Y2F0YWxvZy0+aGFzX2lkbGVfcGM7CiAKIAltdXRleF9sb2NrKCZzZGVfZW5jLT5lbmNfbG9jayk7CkBAIC0zMzk5LDYgKzM3NjgsMTIgQEAKIAlzZXR1cF90aW1lcigmc2RlX2VuYy0+ZnJhbWVfZG9uZV90aW1lciwgc2RlX2VuY29kZXJfZnJhbWVfZG9uZV90aW1lb3V0LAogCQkJKHVuc2lnbmVkIGxvbmcpIHNkZV9lbmMpOwogCisJaWYgKChkaXNwX2luZm8tPmludGZfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFNJKSAmJgorCQkJZGlzcF9pbmZvLT5pc19wcmltYXJ5KQorCQlzZXR1cF90aW1lcigmc2RlX2VuYy0+dnN5bmNfZXZlbnRfdGltZXIsCisJCQkJc2RlX2VuY29kZXJfdnN5bmNfZXZlbnRfaGFuZGxlciwKKwkJCQkodW5zaWduZWQgbG9uZylzZGVfZW5jKTsKKwogCXNucHJpbnRmKG5hbWUsIFNERV9OQU1FX1NJWkUsICJyc2NfZW5jJXUiLCBkcm1fZW5jLT5iYXNlLmlkKTsKIAlzZGVfZW5jLT5yc2NfY2xpZW50ID0gc2RlX3JzY19jbGllbnRfY3JlYXRlKFNERV9SU0NfSU5ERVgsIG5hbWUsCiAJCQkJCWRpc3BfaW5mby0+aXNfcHJpbWFyeSk7CkBAIC0zNDExLDYgKzM3ODYsMTAgQEAKIAltdXRleF9pbml0KCZzZGVfZW5jLT5yY19sb2NrKTsKIAlrdGhyZWFkX2luaXRfZGVsYXllZF93b3JrKCZzZGVfZW5jLT5kZWxheWVkX29mZl93b3JrLAogCQkJc2RlX2VuY29kZXJfb2ZmX3dvcmspOworCXNkZV9lbmMtPmlkbGVfdGltZW91dCA9IElETEVfVElNRU9VVDsKKworCWt0aHJlYWRfaW5pdF93b3JrKCZzZGVfZW5jLT52c3luY19ldmVudF93b3JrLAorCQkJc2RlX2VuY29kZXJfdnN5bmNfZXZlbnRfd29ya19oYW5kbGVyKTsKIAogCW1lbWNweSgmc2RlX2VuYy0+ZGlzcF9pbmZvLCBkaXNwX2luZm8sIHNpemVvZigqZGlzcF9pbmZvKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlci5oCmluZGV4IDYxOGQ0YWUuLmJhZjU5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXIuaApAQCAtMjksNiArMjksOSBAQAogI2RlZmluZSBTREVfRU5DT0RFUl9GUkFNRV9FVkVOVF9QQU5FTF9ERUFECQlCSVQoMikKICNkZWZpbmUgU0RFX0VOQ09ERVJfRlJBTUVfRVZFTlRfU0lHTkFMX1JFTEVBU0VfRkVOQ0UJQklUKDMpCiAjZGVmaW5lIFNERV9FTkNPREVSX0ZSQU1FX0VWRU5UX1NJR05BTF9SRVRJUkVfRkVOQ0UJQklUKDQpCisjZGVmaW5lIFNERV9FTkNPREVSX0ZSQU1FX0VWRU5UX0lETEUJCQlCSVQoNSkKKworI2RlZmluZSBJRExFX1RJTUVPVVQJKDY2IC0gMTYvMikKIAogLyoqCiAgKiBFbmNvZGVyIGZ1bmN0aW9ucyBhbmQgZGF0YSB0eXBlcwpAQCAtMTI1LDggKzEyOCwxMCBAQAogICogc2RlX2VuY29kZXJfa2lja29mZiAtIHRyaWdnZXIgYSBkb3VibGUgYnVmZmVyIGZsaXAgb2YgdGhlIGN0bCBwYXRoCiAgKgkoaS5lLiBjdGwgZmx1c2ggYW5kIHN0YXJ0KSBpbW1lZGlhdGVseS4KICAqIEBlbmNvZGVyOgllbmNvZGVyIHBvaW50ZXIKKyAqIEBpc19lcnJvcjoJd2hldGhlciB0aGUgY3VycmVudCBjb21taXQgbmVlZHMgdG8gYmUgYWJvcnRlZCBhbmQgcmVwbGFjZWQKKyAqCQl3aXRoIGEgJ3NhZmUnIGNvbW1pdAogICovCi12b2lkIHNkZV9lbmNvZGVyX2tpY2tvZmYoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKTsKK3ZvaWQgc2RlX2VuY29kZXJfa2lja29mZihzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsIGJvb2wgaXNfZXJyb3IpOwogCiAvKioKICAqIHNkZV9lbmNvZGVyX3dhaXRfZm9yX2V2ZW50IC0gV2FpdHMgZm9yIGVuY29kZXIgZXZlbnRzCkBAIC0yMDUsNCArMjEwLDEzIEBACiAgKi8KIHZvaWQgc2RlX2VuY29kZXJfcHJlcGFyZV9jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICpkcm1fZW5jKTsKIAorLyoqCisgKiBzZGVfZW5jb2Rlcl9zZXRfaWRsZV90aW1lb3V0IC0gc2V0IHRoZSBpZGxlIHRpbWVvdXQgZm9yIHZpZGVvCisgKiAgICAgICAgICAgICAgICAgICAgYW5kIGNvbW1hbmQgbW9kZSBlbmNvZGVycy4KKyAqIEBkcm1fZW5jOiAgICBQb2ludGVyIHRvIHByZXZpb3VzbHkgY3JlYXRlZCBkcm0gZW5jb2RlciBzdHJ1Y3R1cmUKKyAqIEBpZGxlX3RpbWVvdXQ6ICAgIGlkbGUgdGltZW91dCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMKKyAqLwordm9pZCBzZGVfZW5jb2Rlcl9zZXRfaWRsZV90aW1lb3V0KHN0cnVjdCBkcm1fZW5jb2RlciAqZHJtX2VuYywKKwkJCQkJCQl1MzIgaWRsZV90aW1lb3V0KTsKKwogI2VuZGlmIC8qIF9fU0RFX0VOQ09ERVJfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzLmgKaW5kZXggNWE3OGU0ZC4uODgxM2ZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXMuaApAQCAtMTI1LDkgKzEyNSwxMiBAQAogICoJCQkJU0RFX0VOQ19FUlJfTkVFRFNfSFdfUkVTRVQgc3RhdGUKICAqIEBpcnFfY29udHJvbDoJCUhhbmRsZXIgdG8gZW5hYmxlL2Rpc2FibGUgYWxsIHRoZSBlbmNvZGVyIElSUXMKICAqIEB1cGRhdGVfc3BsaXRfcm9sZToJCVVwZGF0ZSB0aGUgc3BsaXQgcm9sZSBvZiB0aGUgcGh5cyBlbmMKKyAqIEBwcmVwYXJlX2lkbGVfcGM6CQlwaHlzIGVuY29kZXIgY2FuIHVwZGF0ZSB0aGUgdnN5bmNfZW5hYmxlIHN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBpZGxlIHBvd2VyIGNvbGxhcHNlIHByZXBhcmUKICAqIEByZXN0b3JlOgkJCVJlc3RvcmUgYWxsIHRoZSBlbmNvZGVyIGNvbmZpZ3MuCiAgKiBAaXNfYXV0b3JlZnJlc2hfZW5hYmxlZDoJcHJvdmlkZXMgdGhlIGF1dG9yZWZyZXNoIGN1cnJlbnQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlL2Rpc2FibGUgc3RhdGUuCisgKiBAZ2V0X2xpbmVfY291bnQ6CQlPYnRhaW4gY3VycmVudCB2ZXJ0aWNhbCBsaW5lIGNvdW50CiAgKi8KIAogc3RydWN0IHNkZV9lbmNvZGVyX3BoeXNfb3BzIHsKQEAgLTE2Nyw4ICsxNzAsMTAgQEAKIAl2b2lkICgqaXJxX2NvbnRyb2wpKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzLCBib29sIGVuYWJsZSk7CiAJdm9pZCAoKnVwZGF0ZV9zcGxpdF9yb2xlKShzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5cyAqcGh5c19lbmMsCiAJCQllbnVtIHNkZV9lbmNfc3BsaXRfcm9sZSByb2xlKTsKKwl2b2lkICgqcHJlcGFyZV9pZGxlX3BjKShzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5cyAqcGh5c19lbmMpOwogCXZvaWQgKCpyZXN0b3JlKShzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5cyAqcGh5cyk7CiAJYm9vbCAoKmlzX2F1dG9yZWZyZXNoX2VuYWJsZWQpKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzKTsKKwlpbnQgKCpnZXRfbGluZV9jb3VudCkoc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXMpOwogfTsKIAogLyoqCkBAIC01MTcsMTIgKzUyMiwxMiBAQAogCQllbnVtIHNkZV9pbnRmIGludGVyZmFjZSk7CiAKIC8qKgotICogc2RlX2VuY29kZXJfaGVscGVyX2h3X3JlbGVhc2UgLSBwcmVwYXJlIGZvciBoL3cgcmVzZXQgZHVyaW5nIGRpc2FibGUKKyAqIHNkZV9lbmNvZGVyX2hlbHBlcl9yZXNldF9taXhlcnMgLSByZXNldCBtaXhlcnMgYXNzb2NpYXRlZCB3aXRoIHBoeXMgZW5jCiAgKiBAcGh5c19lbmM6IFBvaW50ZXIgdG8gcGh5c2ljYWwgZW5jb2RlciBzdHJ1Y3R1cmUKICAqIEBmYjogT3B0aW9uYWwgZmIgZm9yIHNwZWNpZnlpbmcgbmV3IG1peGVyIG91dHB1dCByZXNvbHV0aW9uLCBtYXkgYmUgTlVMTAogICogUmV0dXJuOiBaZXJvIG9uIHN1Y2Nlc3MKICAqLwotaW50IHNkZV9lbmNvZGVyX2hlbHBlcl9od19yZWxlYXNlKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYywKK2ludCBzZGVfZW5jb2Rlcl9oZWxwZXJfcmVzZXRfbWl4ZXJzKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYywKIAkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpOwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfY21kLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzX2NtZC5jCmluZGV4IDcwYTI1ZGQuLjQyOTEwOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfY21kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5c19jbWQuYwpAQCAtMzQsOSArMzQsNiBAQAogCiAjZGVmaW5lIFBQX1RJTUVPVVRfTUFYX1RSSUFMUwkxMAogCi0vKiB3YWl0IGZvciAyIHZ5bmNzIG9ubHkgKi8KLSNkZWZpbmUgQ1RMX1NUQVJUX1RJTUVPVVRfTVMJMzIKLQogLyoKICAqIFRlYXJjaGVjayBzeW5jIHN0YXJ0IGFuZCBjb250aW51ZSB0aHJlc2hvbGRzIGFyZSBlbXBpcmljYWxseSBmb3VuZAogICogYmFzZWQgb24gY29tbW9uIHBhbmVscyBJbiB0aGUgZnV0dXJlLCBtYXkgd2FudCB0byBhbGxvdyBwYW5lbHMgdG8gb3ZlcnJpZGUKQEAgLTg5Nyw2ICs4OTQsMzAgQEAKIAlwaHlzX2VuYy0+aHdfcHAtPm9wcy5jb25uZWN0X2V4dGVybmFsX3RlKHBoeXNfZW5jLT5od19wcCwgZW5hYmxlKTsKIH0KIAorc3RhdGljIHZvaWQgc2RlX2VuY29kZXJfcGh5c19jbWRfcHJlcGFyZV9pZGxlX3BjKAorCQlzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5cyAqcGh5c19lbmMpCit7CisJX3NkZV9lbmNvZGVyX3BoeXNfY21kX2Nvbm5lY3RfdGUocGh5c19lbmMsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBzZGVfZW5jb2Rlcl9waHlzX2NtZF9nZXRfbGluZV9jb3VudCgKKwkJc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXNfZW5jKQoreworCXN0cnVjdCBzZGVfaHdfcGluZ3BvbmcgKmh3X3BwOworCisJaWYgKCFwaHlzX2VuYyB8fCAhcGh5c19lbmMtPmh3X3BwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2RlX2VuY29kZXJfcGh5c19jbWRfaXNfbWFzdGVyKHBoeXNfZW5jKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlod19wcCA9IHBoeXNfZW5jLT5od19wcDsKKwlpZiAoIWh3X3BwLT5vcHMuZ2V0X2xpbmVfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGh3X3BwLT5vcHMuZ2V0X2xpbmVfY291bnQoaHdfcHApOworfQorCiBzdGF0aWMgdm9pZCBzZGVfZW5jb2Rlcl9waHlzX2NtZF9kaXNhYmxlKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYykKIHsKIAlzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5c19jbWQgKmNtZF9lbmMgPQpAQCAtMTAwNyw3ICsxMDI4LDcgQEAKIAogCXdhaXRfaW5mby53cSA9ICZwaHlzX2VuYy0+cGVuZGluZ19raWNrb2ZmX3dxOwogCXdhaXRfaW5mby5hdG9taWNfY250ID0gJnBoeXNfZW5jLT5wZW5kaW5nX2N0bHN0YXJ0X2NudDsKLQl3YWl0X2luZm8udGltZW91dF9tcyA9IENUTF9TVEFSVF9USU1FT1VUX01TOworCXdhaXRfaW5mby50aW1lb3V0X21zID0gS0lDS09GRl9USU1FT1VUX01TOwogCiAJLyogc2xhdmUgZW5jb2RlciBkb2Vzbid0IGVuYWJsZSBmb3IgcHBzcGxpdCAqLwogCWlmIChfc2RlX2VuY29kZXJfcGh5c19pc19wcHNwbGl0X3NsYXZlKHBoeXNfZW5jKSkKQEAgLTEyMzksOSArMTI2MCwxMSBAQAogCW9wcy0+aXJxX2NvbnRyb2wgPSBzZGVfZW5jb2Rlcl9waHlzX2NtZF9pcnFfY29udHJvbDsKIAlvcHMtPnVwZGF0ZV9zcGxpdF9yb2xlID0gc2RlX2VuY29kZXJfcGh5c19jbWRfdXBkYXRlX3NwbGl0X3JvbGU7CiAJb3BzLT5yZXN0b3JlID0gc2RlX2VuY29kZXJfcGh5c19jbWRfZW5hYmxlX2hlbHBlcjsKKwlvcHMtPnByZXBhcmVfaWRsZV9wYyA9IHNkZV9lbmNvZGVyX3BoeXNfY21kX3ByZXBhcmVfaWRsZV9wYzsKIAlvcHMtPmlzX2F1dG9yZWZyZXNoX2VuYWJsZWQgPQogCQkJc2RlX2VuY29kZXJfcGh5c19jbWRfaXNfYXV0b3JlZnJlc2hfZW5hYmxlZDsKIAlvcHMtPmhhbmRsZV9wb3N0X2tpY2tvZmYgPSBzZGVfZW5jb2Rlcl9waHlzX2NtZF9oYW5kbGVfcG9zdF9raWNrb2ZmOworCW9wcy0+Z2V0X2xpbmVfY291bnQgPSBzZGVfZW5jb2Rlcl9waHlzX2NtZF9nZXRfbGluZV9jb3VudDsKIH0KIAogc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnNkZV9lbmNvZGVyX3BoeXNfY21kX2luaXQoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzX3ZpZC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5c192aWQuYwppbmRleCA3OGMyMmM5Li42YTQzNDhiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5c192aWQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfZW5jb2Rlcl9waHlzX3ZpZC5jCkBAIC0xNTcsMTUgKzE1Nyw2IEBACiAJdTMyIG5lZWRlZF92ZnBfbGluZXMgPSB3b3JzdF9jYXNlX25lZWRlZF9saW5lcyAtIHN0YXJ0X29mX2ZyYW1lX2xpbmVzOwogCXUzMiBhY3R1YWxfdmZwX2xpbmVzID0gMDsKIAotCWlmICh3b3JzdF9jYXNlX25lZWRlZF9saW5lcyA8IHN0YXJ0X29mX2ZyYW1lX2xpbmVzKSB7Ci0JCW5lZWRlZF92ZnBfbGluZXMgPSAwOwotCQlTREVfRVJST1IoImludmFsaWQgcGFyYW1zIC0gbmVlZGVkX2xpbmVzOiVkLCBmcmFtZV9saW5lczolZFxuIiwKLQkJCQl3b3JzdF9jYXNlX25lZWRlZF9saW5lcywgc3RhcnRfb2ZfZnJhbWVfbGluZXMpOwotCX0gZWxzZSB7Ci0JCW5lZWRlZF92ZnBfbGluZXMgPSB3b3JzdF9jYXNlX25lZWRlZF9saW5lcwotCQkJCQktIHN0YXJ0X29mX2ZyYW1lX2xpbmVzOwotCX0KLQogCS8qIEZldGNoIG11c3QgYmUgb3V0c2lkZSBhY3RpdmUgbGluZXMsIG90aGVyd2lzZSB1bmRlZmluZWQuICovCiAJaWYgKHN0YXJ0X29mX2ZyYW1lX2xpbmVzID49IHdvcnN0X2Nhc2VfbmVlZGVkX2xpbmVzKSB7CiAJCVNERV9ERUJVR19WSURFTkModmlkX2VuYywKQEAgLTI4OCw4ICsyNzksOSBAQAogCQlyZXR1cm47CiAKIAlTREVfREVCVUdfVklERU5DKHZpZF9lbmMsCi0JCSJyb3RfZmV0Y2hfbGluZXMgJXUgcm90X2ZldGNoX3N0YXJ0X3ZzeW5jX2NvdW50ZXIgJXVcbiIsCi0JCXJvdF9mZXRjaF9saW5lcywgcm90X2ZldGNoX3N0YXJ0X3ZzeW5jX2NvdW50ZXIpOworCQkicm90X2ZldGNoX2xpbmVzICV1IHZmcF9mZXRjaF9saW5lcyAldSByb3RfZmV0Y2hfc3RhcnRfdnN5bmNfY291bnRlciAldVxuIiwKKwkJcm90X2ZldGNoX2xpbmVzLCB2ZnBfZmV0Y2hfbGluZXMsCisJCXJvdF9mZXRjaF9zdGFydF92c3luY19jb3VudGVyKTsKIAogCXBoeXNfZW5jLT5od19jdGwtPm9wcy5nZXRfYml0bWFza19pbnRmKAogCQkJcGh5c19lbmMtPmh3X2N0bCwgJmZsdXNoX21hc2ssIHZpZF9lbmMtPmh3X2ludGYtPmlkeCk7CkBAIC00NjQsMTAgKzQ1NiwyNiBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wgX3NkZV9lbmNvZGVyX3BoeXNfaXNfZHVhbF9jdGwoc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXNfZW5jKQoreworCWVudW0gc2RlX3JtX3RvcG9sb2d5X25hbWUgdG9wb2xvZ3k7CisKKwlpZiAoIXBoeXNfZW5jKQorCQlyZXR1cm4gZmFsc2U7CisKKwl0b3BvbG9neSA9IHNkZV9jb25uZWN0b3JfZ2V0X3RvcG9sb2d5X25hbWUocGh5c19lbmMtPmNvbm5lY3Rvcik7CisJaWYgKCh0b3BvbG9neSA9PSBTREVfUk1fVE9QT0xPR1lfRFVBTFBJUEVfRFNDKSB8fAorCQkodG9wb2xvZ3kgPT0gU0RFX1JNX1RPUE9MT0dZX0RVQUxQSVBFKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBib29sIHNkZV9lbmNvZGVyX3BoeXNfdmlkX25lZWRzX3NpbmdsZV9mbHVzaCgKIAkJc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXNfZW5jKQogewotCXJldHVybiBwaHlzX2VuYyAmJiBfc2RlX2VuY29kZXJfcGh5c19pc19wcHNwbGl0KHBoeXNfZW5jKTsKKwlyZXR1cm4gcGh5c19lbmMgJiYgKF9zZGVfZW5jb2Rlcl9waHlzX2lzX3Bwc3BsaXQocGh5c19lbmMpIHx8CisJCV9zZGVfZW5jb2Rlcl9waHlzX2lzX2R1YWxfY3RsKHBoeXNfZW5jKSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9zZGVfZW5jb2Rlcl9waHlzX3ZpZF9zZXR1cF9pcnFfaHdfaWR4KApAQCAtNDc1LDEzICs0ODMsMTkgQEAKIHsKIAlzdHJ1Y3Qgc2RlX2VuY29kZXJfaXJxICppcnE7CiAKKwkvKgorCSAqIEluaXRpYWxpemUgaXJxLT5od19pZHggb25seSB3aGVuIGlycSBpcyBub3QgcmVnaXN0ZXJlZC4KKwkgKiBQcmV2ZW50IGludmFsaWRhdGluZyBpcnEtPmlycV9pZHggYXMgbW9kZXNldCBtYXkgYmUKKwkgKiBjYWxsZWQgbWFueSB0aW1lcyBkdXJpbmcgZGZwcy4KKwkgKi8KKwogCWlycSA9ICZwaHlzX2VuYy0+aXJxW0lOVFJfSURYX1ZTWU5DXTsKLQlpcnEtPmh3X2lkeCA9IHBoeXNfZW5jLT5pbnRmX2lkeDsKLQlpcnEtPmlycV9pZHggPSAtRUlOVkFMOworCWlmIChpcnEtPmlycV9pZHggPCAwKQorCQlpcnEtPmh3X2lkeCA9IHBoeXNfZW5jLT5pbnRmX2lkeDsKIAogCWlycSA9ICZwaHlzX2VuYy0+aXJxW0lOVFJfSURYX1VOREVSUlVOXTsKLQlpcnEtPmh3X2lkeCA9IHBoeXNfZW5jLT5pbnRmX2lkeDsKLQlpcnEtPmlycV9pZHggPSAtRUlOVkFMOworCWlmIChpcnEtPmlycV9pZHggPCAwKQorCQlpcnEtPmh3X2lkeCA9IHBoeXNfZW5jLT5pbnRmX2lkeDsKIH0KIAogc3RhdGljIHZvaWQgc2RlX2VuY29kZXJfcGh5c192aWRfbW9kZV9zZXQoCkBAIC01MzIsMTcgKzU0NiwyNSBAQAogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzX3ZpZCAqdmlkX2VuYzsKKwlpbnQgcmVmY291bnQ7CiAKIAlpZiAoIXBoeXNfZW5jKSB7CiAJCVNERV9FUlJPUigiaW52YWxpZCBlbmNvZGVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcmVmY291bnQgPSBhdG9taWNfcmVhZCgmcGh5c19lbmMtPnZibGFua19yZWZjb3VudCk7CiAJdmlkX2VuYyA9IHRvX3NkZV9lbmNvZGVyX3BoeXNfdmlkKHBoeXNfZW5jKTsKIAogCS8qIFNsYXZlIGVuY29kZXJzIGRvbid0IHJlcG9ydCB2YmxhbmsgKi8KIAlpZiAoIXNkZV9lbmNvZGVyX3BoeXNfdmlkX2lzX21hc3RlcihwaHlzX2VuYykpCi0JCXJldHVybiAwOworCQlnb3RvIGVuZDsKKworCS8qIHByb3RlY3QgYWdhaW5zdCBuZWdhdGl2ZSAqLworCWlmICghZW5hYmxlICYmIHJlZmNvdW50ID09IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQogCiAJU0RFX0RFQlVHX1ZJREVOQyh2aWRfZW5jLCAiWyVwU10gZW5hYmxlPSVkLyVkXG4iLAogCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLApAQCAtNTU3LDExICs1NzksMTUgQEAKIAkJcmV0ID0gc2RlX2VuY29kZXJfaGVscGVyX3VucmVnaXN0ZXJfaXJxKHBoeXNfZW5jLAogCQkJCUlOVFJfSURYX1ZTWU5DKTsKIAotCWlmIChyZXQpCitlbmQ6CisJaWYgKHJldCkgewogCQlTREVfRVJST1JfVklERU5DKHZpZF9lbmMsCiAJCQkJImNvbnRyb2wgdmJsYW5rIGlycSBlcnJvciAlZCwgZW5hYmxlICVkXG4iLAogCQkJCXJldCwgZW5hYmxlKTsKLQorCQlTREVfRVZUMzIoRFJNSUQocGh5c19lbmMtPnBhcmVudCksCisJCQkJdmlkX2VuYy0+aHdfaW50Zi0+aWR4IC0gSU5URl8wLAorCQkJCWVuYWJsZSwgcmVmY291bnQsIFNERV9FVlRMT0dfRVJST1IpOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NzIsNyArNTk4LDYgQEAKIAlzdHJ1Y3Qgc2RlX2h3X2ludGYgKmludGY7CiAJc3RydWN0IHNkZV9od19jdGwgKmN0bDsKIAl1MzIgZmx1c2hfbWFzayA9IDA7Ci0JaW50IHJldDsKIAogCWlmICghcGh5c19lbmMgfHwgIXBoeXNfZW5jLT5wYXJlbnQgfHwgIXBoeXNfZW5jLT5wYXJlbnQtPmRldiB8fAogCQkJIXBoeXNfZW5jLT5wYXJlbnQtPmRldi0+ZGV2X3ByaXZhdGUpIHsKQEAgLTYwMSwyMSArNjI2LDEzIEBACiAJc2RlX2VuY29kZXJfaGVscGVyX3NwbGl0X2NvbmZpZyhwaHlzX2VuYywgdmlkX2VuYy0+aHdfaW50Zi0+aWR4KTsKIAogCXNkZV9lbmNvZGVyX3BoeXNfdmlkX3NldHVwX3RpbWluZ19lbmdpbmUocGh5c19lbmMpOwotCXJldCA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX2NvbnRyb2xfdmJsYW5rX2lycShwaHlzX2VuYywgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlbmQ7Ci0KLQlyZXQgPSBzZGVfZW5jb2Rlcl9oZWxwZXJfcmVnaXN0ZXJfaXJxKHBoeXNfZW5jLCBJTlRSX0lEWF9VTkRFUlJVTik7Ci0JaWYgKHJldCkgewotCQlzZGVfZW5jb2Rlcl9waHlzX3ZpZF9jb250cm9sX3ZibGFua19pcnEocGh5c19lbmMsIGZhbHNlKTsKLQkJZ290byBlbmQ7Ci0JfQogCiAJLyoKLQkgKiBGb3IgcHAtc3BsaXQsIHNraXAgc2V0dGluZyB0aGUgZmx1c2ggYml0IGZvciB0aGUgc2xhdmUgaW50Ziwgc2luY2UKLQkgKiBib3RoIGludGZzIHVzZSBzYW1lIGN0bCBhbmQgSFcgd2lsbCBvbmx5IGZsdXNoIHRoZSBtYXN0ZXIuCisJICogRm9yIHNpbmdsZSBmbHVzaCBjYXNlcyAoZHVhbC1jdGwgb3IgcHAtc3BsaXQpLCBza2lwIHNldHRpbmcgdGhlCisJICogZmx1c2ggYml0IGZvciB0aGUgc2xhdmUgaW50Ziwgc2luY2UgYm90aCBpbnRmcyB1c2Ugc2FtZSBjdGwKKwkgKiBhbmQgSFcgd2lsbCBvbmx5IGZsdXNoIHRoZSBtYXN0ZXIuCiAJICovCi0JaWYgKF9zZGVfZW5jb2Rlcl9waHlzX2lzX3Bwc3BsaXQocGh5c19lbmMpICYmCisJaWYgKHNkZV9lbmNvZGVyX3BoeXNfdmlkX25lZWRzX3NpbmdsZV9mbHVzaChwaHlzX2VuYykgJiYKIAkJIXNkZV9lbmNvZGVyX3BoeXNfdmlkX2lzX21hc3RlcihwaHlzX2VuYykpCiAJCWdvdG8gc2tpcF9mbHVzaDsKIApAQCAtNjMwLDcgKzY0Nyw2IEBACiAJaWYgKHBoeXNfZW5jLT5lbmFibGVfc3RhdGUgPT0gU0RFX0VOQ19ESVNBQkxFRCkKIAkJcGh5c19lbmMtPmVuYWJsZV9zdGF0ZSA9IFNERV9FTkNfRU5BQkxJTkc7CiAKLWVuZDoKIAlyZXR1cm47CiB9CiAKQEAgLTgwNCwxMSArODIwLDggQEAKIAkJCVNERV9FVlQzMihEUk1JRChwaHlzX2VuYy0+cGFyZW50KSwKIAkJCQkJdmlkX2VuYy0+aHdfaW50Zi0+aWR4IC0gSU5URl8wLCByZXQpOwogCQl9Ci0JCXNkZV9lbmNvZGVyX3BoeXNfdmlkX2NvbnRyb2xfdmJsYW5rX2lycShwaHlzX2VuYywgZmFsc2UpOwogCX0KIAotCXNkZV9lbmNvZGVyX2hlbHBlcl91bnJlZ2lzdGVyX2lycShwaHlzX2VuYywgSU5UUl9JRFhfVU5ERVJSVU4pOwotCiAJcGh5c19lbmMtPmVuYWJsZV9zdGF0ZSA9IFNERV9FTkNfRElTQUJMRUQ7CiB9CiAKQEAgLTg0MCw2ICs4NTMsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX3BoeXNfdmlkX2lycV9jb250cm9sKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYywKKwkJYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHNkZV9lbmNvZGVyX3BoeXNfdmlkICp2aWRfZW5jOworCWludCByZXQ7CisKKwlpZiAoIXBoeXNfZW5jKQorCQlyZXR1cm47CisKKwl2aWRfZW5jID0gdG9fc2RlX2VuY29kZXJfcGh5c192aWQocGh5c19lbmMpOworCisJU0RFX0VWVDMyKERSTUlEKHBoeXNfZW5jLT5wYXJlbnQpLCB2aWRfZW5jLT5od19pbnRmLT5pZHggLSBJTlRGXzAsCisJCQllbmFibGUsIGF0b21pY19yZWFkKCZwaHlzX2VuYy0+dmJsYW5rX3JlZmNvdW50KSk7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJldCA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX2NvbnRyb2xfdmJsYW5rX2lycShwaHlzX2VuYywgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisKKwkJc2RlX2VuY29kZXJfaGVscGVyX3JlZ2lzdGVyX2lycShwaHlzX2VuYywgSU5UUl9JRFhfVU5ERVJSVU4pOworCX0gZWxzZSB7CisJCXNkZV9lbmNvZGVyX3BoeXNfdmlkX2NvbnRyb2xfdmJsYW5rX2lycShwaHlzX2VuYywgZmFsc2UpOworCQlzZGVfZW5jb2Rlcl9oZWxwZXJfdW5yZWdpc3Rlcl9pcnEocGh5c19lbmMsIElOVFJfSURYX1VOREVSUlVOKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX3BoeXNfdmlkX3NldHVwX21pc3Ioc3RydWN0IHNkZV9lbmNvZGVyX3BoeXMgKnBoeXNfZW5jLAogCQkJCQkJYm9vbCBlbmFibGUsIHUzMiBmcmFtZV9jb3VudCkKIHsKQEAgLTg2Niw2ICs5MDUsMjQgQEAKIAkJdmlkX2VuYy0+aHdfaW50Zi0+b3BzLmNvbGxlY3RfbWlzcih2aWRfZW5jLT5od19pbnRmKSA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgc2RlX2VuY29kZXJfcGh5c192aWRfZ2V0X2xpbmVfY291bnQoCisJCXN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzICpwaHlzX2VuYykKK3sKKwlzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5c192aWQgKnZpZF9lbmM7CisKKwlpZiAoIXBoeXNfZW5jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2RlX2VuY29kZXJfcGh5c192aWRfaXNfbWFzdGVyKHBoeXNfZW5jKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2aWRfZW5jID0gdG9fc2RlX2VuY29kZXJfcGh5c192aWQocGh5c19lbmMpOworCWlmICghdmlkX2VuYy0+aHdfaW50ZiB8fCAhdmlkX2VuYy0+aHdfaW50Zi0+b3BzLmdldF9saW5lX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2aWRfZW5jLT5od19pbnRmLT5vcHMuZ2V0X2xpbmVfY291bnQodmlkX2VuYy0+aHdfaW50Zik7Cit9CisKIHN0YXRpYyB2b2lkIHNkZV9lbmNvZGVyX3BoeXNfdmlkX2luaXRfb3BzKHN0cnVjdCBzZGVfZW5jb2Rlcl9waHlzX29wcyAqb3BzKQogewogCW9wcy0+aXNfbWFzdGVyID0gc2RlX2VuY29kZXJfcGh5c192aWRfaXNfbWFzdGVyOwpAQCAtODc5LDEyICs5MzYsMTQgQEAKIAlvcHMtPndhaXRfZm9yX2NvbW1pdF9kb25lID0gc2RlX2VuY29kZXJfcGh5c192aWRfd2FpdF9mb3JfdmJsYW5rOwogCW9wcy0+d2FpdF9mb3JfdmJsYW5rID0gc2RlX2VuY29kZXJfcGh5c192aWRfd2FpdF9mb3JfdmJsYW5rOwogCW9wcy0+d2FpdF9mb3JfdHhfY29tcGxldGUgPSBzZGVfZW5jb2Rlcl9waHlzX3ZpZF93YWl0X2Zvcl92Ymxhbms7CisJb3BzLT5pcnFfY29udHJvbCA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX2lycV9jb250cm9sOwogCW9wcy0+cHJlcGFyZV9mb3Jfa2lja29mZiA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX3ByZXBhcmVfZm9yX2tpY2tvZmY7CiAJb3BzLT5oYW5kbGVfcG9zdF9raWNrb2ZmID0gc2RlX2VuY29kZXJfcGh5c192aWRfaGFuZGxlX3Bvc3Rfa2lja29mZjsKIAlvcHMtPm5lZWRzX3NpbmdsZV9mbHVzaCA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX25lZWRzX3NpbmdsZV9mbHVzaDsKIAlvcHMtPnNldHVwX21pc3IgPSBzZGVfZW5jb2Rlcl9waHlzX3ZpZF9zZXR1cF9taXNyOwogCW9wcy0+Y29sbGVjdF9taXNyID0gc2RlX2VuY29kZXJfcGh5c192aWRfY29sbGVjdF9taXNyOwogCW9wcy0+aHdfcmVzZXQgPSBzZGVfZW5jb2Rlcl9oZWxwZXJfaHdfcmVzZXQ7CisJb3BzLT5nZXRfbGluZV9jb3VudCA9IHNkZV9lbmNvZGVyX3BoeXNfdmlkX2dldF9saW5lX2NvdW50OwogfQogCiBzdHJ1Y3Qgc2RlX2VuY29kZXJfcGh5cyAqc2RlX2VuY29kZXJfcGh5c192aWRfaW5pdCgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfd2IuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfd2IuYwppbmRleCAyNDBlNTIxLi4xMjExNTc1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2VuY29kZXJfcGh5c193Yi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9lbmNvZGVyX3BoeXNfd2IuYwpAQCAtMTEzOSw3ICsxMTM5LDkgQEAKIAl9CiAKIAkvKiByZXNldCBoL3cgYmVmb3JlIGZpbmFsIGZsdXNoICovCi0JaWYgKHNkZV9lbmNvZGVyX2hlbHBlcl9od19yZWxlYXNlKHBoeXNfZW5jLCB3Yl9lbmMtPmZiX2Rpc2FibGUpKQorCWlmIChwaHlzX2VuYy0+aHdfY3RsLT5vcHMuY2xlYXJfcGVuZGluZ19mbHVzaCkKKwkJcGh5c19lbmMtPmh3X2N0bC0+b3BzLmNsZWFyX3BlbmRpbmdfZmx1c2gocGh5c19lbmMtPmh3X2N0bCk7CisJaWYgKHNkZV9lbmNvZGVyX2hlbHBlcl9yZXNldF9taXhlcnMocGh5c19lbmMsIHdiX2VuYy0+ZmJfZGlzYWJsZSkpCiAJCWdvdG8gZXhpdDsKIAogCXBoeXNfZW5jLT5lbmFibGVfc3RhdGUgPSBTREVfRU5DX0RJU0FCTElORzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9mZW5jZS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2ZlbmNlLmMKaW5kZXggYjNiYzI4Zi4uODE2MzM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2ZlbmNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2ZlbmNlLmMKQEAgLTEzNiwzMSArMTM2LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNkZV9mZW5jZV9yZWxlYXNlKHN0cnVjdCBmZW5jZSAqZmVuY2UpCiB7Ci0Jc3RydWN0IHNkZV9mZW5jZSAqZiA9IHRvX3NkZV9mZW5jZShmZW5jZSk7Ci0Jc3RydWN0IHNkZV9mZW5jZSAqZmMsICpuZXh0OwotCXN0cnVjdCBzZGVfZmVuY2VfY29udGV4dCAqY3R4OwotCWJvb2wgcmVsZWFzZV9rcmVmID0gZmFsc2U7CisJc3RydWN0IHNkZV9mZW5jZSAqZjsKIAotCWlmICghZmVuY2UgfHwgIWYtPmN0eCkKLQkJcmV0dXJuOwotCi0JY3R4ID0gZi0+Y3R4OwotCi0Jc3Bpbl9sb2NrKCZjdHgtPmxpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjLCBuZXh0LCAmY3R4LT5mZW5jZV9saXN0X2hlYWQsIGZlbmNlX2xpc3QpIHsKLQkJLyogZmVuY2UgcmVsZWFzZSBjYWxsZWQgYmVmb3JlIHNpZ25hbCAqLwotCQlpZiAoZiA9PSBmYykgewotCQkJbGlzdF9kZWxfaW5pdCgmZmMtPmZlbmNlX2xpc3QpOwotCQkJcmVsZWFzZV9rcmVmID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9CisJaWYgKGZlbmNlKSB7CisJCWYgPSB0b19zZGVfZmVuY2UoZmVuY2UpOworCQlrZnJlZShmKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmN0eC0+bGlzdF9sb2NrKTsKLQotCS8qIGtlZXAga3B1dCBvdXRzaWRlIHNwaW5fbG9jayBiZWNhdXNlIGl0IG1heSByZWxlYXNlIGN0eCAqLwotCWlmIChyZWxlYXNlX2tyZWYpCi0JCWtyZWZfcHV0KCZjdHgtPmtyZWYsIHNkZV9mZW5jZV9kZXN0cm95KTsKLQlrZnJlZShmKTsKIH0KIAogc3RhdGljIHZvaWQgc2RlX2ZlbmNlX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLCBjaGFyICpzdHIsIGludCBzaXplKQpAQCAtMjI1LDkgKzIwNiw5IEBACiAJLyogY3JlYXRlIGZkICovCiAJZmQgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKDApOwogCWlmIChmZCA8IDApIHsKLQkJZmVuY2VfcHV0KCZzZGVfZmVuY2UtPmJhc2UpOwogCQlTREVfRVJST1IoImZhaWxlZCB0byBnZXRfdW51c2VkX2ZkX2ZsYWdzKCksICVzXG4iLAogCQkJCQkJCXNkZV9mZW5jZS0+bmFtZSk7CisJCWZlbmNlX3B1dCgmc2RlX2ZlbmNlLT5iYXNlKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjM2LDggKzIxNyw4IEBACiAJaWYgKHN5bmNfZmlsZSA9PSBOVUxMKSB7CiAJCXB1dF91bnVzZWRfZmQoZmQpOwogCQlmZCA9IC1FSU5WQUw7Ci0JCWZlbmNlX3B1dCgmc2RlX2ZlbmNlLT5iYXNlKTsKIAkJU0RFX0VSUk9SKCJjb3VsZG4ndCBjcmVhdGUgZmVuY2UsICVzXG4iLCBzZGVfZmVuY2UtPm5hbWUpOworCQlmZW5jZV9wdXQoJnNkZV9mZW5jZS0+YmFzZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTI5Nyw2ICsyNzgsNDQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIF9zZGVfZmVuY2VfdHJpZ2dlcihzdHJ1Y3Qgc2RlX2ZlbmNlX2NvbnRleHQgKmN0eCwga3RpbWVfdCB0cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZGVfZmVuY2UgKmZjLCAqbmV4dDsKKwlib29sIGlzX3NpZ25hbGVkID0gZmFsc2U7CisJc3RydWN0IGxpc3RfaGVhZCBsb2NhbF9saXN0X2hlYWQ7CisKKwlJTklUX0xJU1RfSEVBRCgmbG9jYWxfbGlzdF9oZWFkKTsKKworCXNwaW5fbG9jaygmY3R4LT5saXN0X2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZjdHgtPmZlbmNlX2xpc3RfaGVhZCkpIHsKKwkJU0RFX0RFQlVHKCJub3RoaW5nIHRvIHRyaWdnZXIhXG4iKTsKKwkJc3Bpbl91bmxvY2soJmN0eC0+bGlzdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmYywgbmV4dCwgJmN0eC0+ZmVuY2VfbGlzdF9oZWFkLCBmZW5jZV9saXN0KQorCQlsaXN0X21vdmUoJmZjLT5mZW5jZV9saXN0LCAmbG9jYWxfbGlzdF9oZWFkKTsKKwlzcGluX3VubG9jaygmY3R4LT5saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjLCBuZXh0LCAmbG9jYWxfbGlzdF9oZWFkLCBmZW5jZV9saXN0KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKwkJZmMtPmJhc2UudGltZXN0YW1wID0gdHM7CisJCWlzX3NpZ25hbGVkID0gZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKCZmYy0+YmFzZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChpc19zaWduYWxlZCkgeworCQkJbGlzdF9kZWxfaW5pdCgmZmMtPmZlbmNlX2xpc3QpOworCQkJZmVuY2VfcHV0KCZmYy0+YmFzZSk7CisJCQlrcmVmX3B1dCgmY3R4LT5rcmVmLCBzZGVfZmVuY2VfZGVzdHJveSk7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJmN0eC0+bGlzdF9sb2NrKTsKKwkJCWxpc3RfbW92ZSgmZmMtPmZlbmNlX2xpc3QsICZjdHgtPmZlbmNlX2xpc3RfaGVhZCk7CisJCQlzcGluX3VubG9jaygmY3R4LT5saXN0X2xvY2spOworCQl9CisJfQorfQorCiBpbnQgc2RlX2ZlbmNlX2NyZWF0ZShzdHJ1Y3Qgc2RlX2ZlbmNlX2NvbnRleHQgKmN0eCwgdWludDY0X3QgKnZhbCwKIAkJCQkJCQl1aW50MzJfdCBvZmZzZXQpCiB7CkBAIC0zMzAsMTAgKzM0OSwxMiBAQAogCiAJU0RFX0VWVDMyKGN0eC0+ZHJtX2lkLCB0cmlnZ2VyX3ZhbHVlLCBmZCk7CiAKLQlpZiAoZmQgPj0gMCkKKwlpZiAoZmQgPj0gMCkgewogCQlyYyA9IDA7Ci0JZWxzZQorCQlfc2RlX2ZlbmNlX3RyaWdnZXIoY3R4LCBrdGltZV9nZXQoKSk7CisJfSBlbHNlIHsKIAkJcmMgPSBmZDsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0zNDIsMTcgKzM2MywxMiBAQAogCQkJCQkJCWJvb2wgcmVzZXRfdGltZWxpbmUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc2RlX2ZlbmNlICpmYywgKm5leHQ7Ci0JYm9vbCBpc19zaWduYWxlZCA9IGZhbHNlOwotCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfbGlzdF9oZWFkOwogCiAJaWYgKCFjdHgpIHsKIAkJU0RFX0VSUk9SKCJpbnZhbGlkIGN0eCwgJXBLXG4iLCBjdHgpOwogCQlyZXR1cm47CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJmxvY2FsX2xpc3RfaGVhZCk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5sb2NrLCBmbGFncyk7CiAJaWYgKHJlc2V0X3RpbWVsaW5lKSB7CiAJCWlmICgoaW50KShjdHgtPmRvbmVfY291bnQgLSBjdHgtPmNvbW1pdF9jb3VudCkgPCAwKSB7CkBAIC0zODQsMjkgKzQwMCw1IEBACiAJU0RFX0VWVDMyKGN0eC0+ZHJtX2lkLCBjdHgtPmRvbmVfY291bnQsIGN0eC0+Y29tbWl0X2NvdW50LAogCQkJa3RpbWVfdG9fdXModHMpKTsKIAotCXNwaW5fbG9jaygmY3R4LT5saXN0X2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZjdHgtPmZlbmNlX2xpc3RfaGVhZCkpIHsKLQkJU0RFX0RFQlVHKCJub3RoaW5nIHRvIHRyaWdnZXIhLW5vIGdldF9wcm9wIGNhbGxcbiIpOwotCQlzcGluX3VubG9jaygmY3R4LT5saXN0X2xvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjLCBuZXh0LCAmY3R4LT5mZW5jZV9saXN0X2hlYWQsIGZlbmNlX2xpc3QpCi0JCWxpc3RfbW92ZSgmZmMtPmZlbmNlX2xpc3QsICZsb2NhbF9saXN0X2hlYWQpOwotCXNwaW5fdW5sb2NrKCZjdHgtPmxpc3RfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmMsIG5leHQsICZsb2NhbF9saXN0X2hlYWQsIGZlbmNlX2xpc3QpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgZmxhZ3MpOwotCQlmYy0+YmFzZS50aW1lc3RhbXAgPSB0czsKLQkJaXNfc2lnbmFsZWQgPSBmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoJmZjLT5iYXNlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGlzX3NpZ25hbGVkKSB7Ci0JCQlrcmVmX3B1dCgmY3R4LT5rcmVmLCBzZGVfZmVuY2VfZGVzdHJveSk7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2soJmN0eC0+bGlzdF9sb2NrKTsKLQkJCWxpc3RfbW92ZSgmZmMtPmZlbmNlX2xpc3QsICZjdHgtPmZlbmNlX2xpc3RfaGVhZCk7Ci0JCQlzcGluX3VubG9jaygmY3R4LT5saXN0X2xvY2spOwotCQl9Ci0JfQorCV9zZGVfZmVuY2VfdHJpZ2dlcihjdHgsIHRzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2F0YWxvZy5jCmluZGV4IDBlMWFiNTEuLmFlYTJjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NhdGFsb2cuYwpAQCAtMzYsOSArMzYsMTIgQEAKIC8qIGVhY2ggZW50cnkgd2lsbCBoYXZlIHJlZ2lzdGVyIGFkZHJlc3MgYW5kIGJpdCBvZmZzZXQgaW4gdGhhdCByZWdpc3RlciAqLwogI2RlZmluZSBNQVhfQklUX09GRlNFVCAyCiAKLS8qIGRlZmF1bHQgbGluZSB3aWR0aCBmb3Igc3NwcCAqLworLyogZGVmYXVsdCBsaW5lIHdpZHRoIGZvciBzc3BwLCBtaXhlciwgZHMgKGlucHV0KSwgd2IgKi8KICNkZWZpbmUgREVGQVVMVF9TREVfTElORV9XSURUSCAyMDQ4CiAKKy8qIGRlZmF1bHQgb3V0cHV0IGxpbmUgd2lkdGggZm9yIGRzICovCisjZGVmaW5lIERFRkFVTFRfU0RFX09VVFBVVF9MSU5FX1dJRFRIIDI1NjAKKwogLyogbWF4IG1peGVyIGJsZW5kIHN0YWdlcyAqLwogI2RlZmluZSBERUZBVUxUX1NERV9NSVhFUl9CTEVORFNUQUdFUyA3CiAKQEAgLTYwLDggKzYzLDggQEAKIC8qIHRvdGFsIG51bWJlciBvZiBpbnRmIC0gZHAsIGRzaSwgaGRtaSAqLwogI2RlZmluZSBJTlRGX0NPVU5UCQkJMwogCi0jZGVmaW5lIE1BWF9TU1BQX1VQU0NBTEUJCTIwCi0jZGVmaW5lIE1BWF9TU1BQX0RPV05TQ0FMRQkJNAorI2RlZmluZSBNQVhfVVBTQ0FMRV9SQVRJTwkJMjAKKyNkZWZpbmUgTUFYX0RPV05TQ0FMRV9SQVRJTwkJNAogI2RlZmluZSBTU1BQX1VOSVRZX1NDQUxFCQkxCiAKICNkZWZpbmUgTUFYX0hPUlpfREVDSU1BVElPTgkJNApAQCAtMTQwLDEyICsxNDMsMTYgQEAKIAlESU1fTEFZRVIsCiAJU01BUlRfRE1BX1JFViwKIAlJRExFX1BDLAorCURFU1RfU0NBTEVSLAogCVNERV9QUk9QX01BWCwKIH07CiAKIGVudW0gewogCVBFUkZfTUFYX0JXX0xPVywKIAlQRVJGX01BWF9CV19ISUdILAorCVBFUkZfTUlOX0NPUkVfSUIsCisJUEVSRl9NSU5fTExDQ19JQiwKKwlQRVJGX01JTl9EUkFNX0lCLAogCVBFUkZfQ09SRV9JQl9GRiwKIAlQRVJGX0NPUkVfQ0xLX0ZGLAogCVBFUkZfQ09NUF9SQVRJT19SVCwKQEAgLTIzMCw2ICsyMzcsMjAgQEAKIH07CiAKIGVudW0geworCURTX1RPUF9PRkYsCisJRFNfVE9QX0xFTiwKKwlEU19UT1BfSU5QVVRfTElORVdJRFRILAorCURTX1RPUF9PVVRQVVRfTElORVdJRFRILAorCURTX1RPUF9QUk9QX01BWCwKK307CisKK2VudW0geworCURTX09GRiwKKwlEU19MRU4sCisJRFNfUFJPUF9NQVgsCit9OworCitlbnVtIHsKIAlEU1BQX1RPUF9PRkYsCiAJRFNQUF9UT1BfU0laRSwKIAlEU1BQX1RPUF9QUk9QX01BWCwKQEAgLTM3MSwxMSArMzkyLDE1IEBACiAJe0RJTV9MQVlFUiwgInFjb20sc2RlLWhhcy1kaW0tbGF5ZXIiLCBmYWxzZSwgUFJPUF9UWVBFX0JPT0x9LAogCXtTTUFSVF9ETUFfUkVWLCAicWNvbSxzZGUtc21hcnQtZG1hLXJldiIsIGZhbHNlLCBQUk9QX1RZUEVfU1RSSU5HfSwKIAl7SURMRV9QQywgInFjb20sc2RlLWhhcy1pZGxlLXBjIiwgZmFsc2UsIFBST1BfVFlQRV9CT09MfSwKKwl7REVTVF9TQ0FMRVIsICJxY29tLHNkZS1oYXMtZGVzdC1zY2FsZXIiLCBmYWxzZSwgUFJPUF9UWVBFX0JPT0x9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzZGVfcHJvcF90eXBlIHNkZV9wZXJmX3Byb3BbXSA9IHsKIAl7UEVSRl9NQVhfQldfTE9XLCAicWNvbSxzZGUtbWF4LWJ3LWxvdy1rYnBzIiwgZmFsc2UsIFBST1BfVFlQRV9VMzJ9LAogCXtQRVJGX01BWF9CV19ISUdILCAicWNvbSxzZGUtbWF4LWJ3LWhpZ2gta2JwcyIsIGZhbHNlLCBQUk9QX1RZUEVfVTMyfSwKKwl7UEVSRl9NSU5fQ09SRV9JQiwgInFjb20sc2RlLW1pbi1jb3JlLWliLWticHMiLCBmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCisJe1BFUkZfTUlOX0xMQ0NfSUIsICJxY29tLHNkZS1taW4tbGxjYy1pYi1rYnBzIiwgZmFsc2UsIFBST1BfVFlQRV9VMzJ9LAorCXtQRVJGX01JTl9EUkFNX0lCLCAicWNvbSxzZGUtbWluLWRyYW0taWIta2JwcyIsIGZhbHNlLCBQUk9QX1RZUEVfVTMyfSwKIAl7UEVSRl9DT1JFX0lCX0ZGLCAicWNvbSxzZGUtY29yZS1pYi1mZiIsIGZhbHNlLCBQUk9QX1RZUEVfU1RSSU5HfSwKIAl7UEVSRl9DT1JFX0NMS19GRiwgInFjb20sc2RlLWNvcmUtY2xrLWZmIiwgZmFsc2UsIFBST1BfVFlQRV9TVFJJTkd9LAogCXtQRVJGX0NPTVBfUkFUSU9fUlQsICJxY29tLHNkZS1jb21wLXJhdGlvLXJ0IiwgZmFsc2UsCkBAIC01MDAsNiArNTI1LDIwIEBACiAJe0FEX1ZFUlNJT04sICJxY29tLHNkZS1kc3BwLWFkLXZlcnNpb24iLCBmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNkZV9wcm9wX3R5cGUgZHNfdG9wX3Byb3BbXSA9IHsKKwl7RFNfVE9QX09GRiwgInFjb20sc2RlLWRlc3Qtc2NhbGVyLXRvcC1vZmYiLCBmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCisJe0RTX1RPUF9MRU4sICJxY29tLHNkZS1kZXN0LXNjYWxlci10b3Atc2l6ZSIsIGZhbHNlLCBQUk9QX1RZUEVfVTMyfSwKKwl7RFNfVE9QX0lOUFVUX0xJTkVXSURUSCwgInFjb20sc2RlLW1heC1kZXN0LXNjYWxlci1pbnB1dC1saW5ld2lkdGgiLAorCQlmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCisJe0RTX1RPUF9PVVRQVVRfTElORVdJRFRILCAicWNvbSxzZGUtbWF4LWRlc3Qtc2NhbGVyLW91dHB1dC1saW5ld2lkdGgiLAorCQlmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCit9OworCitzdGF0aWMgc3RydWN0IHNkZV9wcm9wX3R5cGUgZHNfcHJvcFtdID0geworCXtEU19PRkYsICJxY29tLHNkZS1kZXN0LXNjYWxlci1vZmYiLCBmYWxzZSwgUFJPUF9UWVBFX1UzMl9BUlJBWX0sCisJe0RTX0xFTiwgInFjb20sc2RlLWRlc3Qtc2NhbGVyLXNpemUiLCBmYWxzZSwgUFJPUF9UWVBFX1UzMn0sCit9OworCiBzdGF0aWMgc3RydWN0IHNkZV9wcm9wX3R5cGUgcHBfcHJvcFtdID0gewogCXtQUF9PRkYsICJxY29tLHNkZS1wcC1vZmYiLCB0cnVlLCBQUk9QX1RZUEVfVTMyX0FSUkFZfSwKIAl7UFBfTEVOLCAicWNvbSxzZGUtcHAtc2l6ZSIsIGZhbHNlLCBQUk9QX1RZUEVfVTMyfSwKQEAgLTg1Nyw4ICs4OTYsOCBAQAogCXN0cnVjdCBzZGVfc3NwcF9jZmcgKnNzcHAsIHN0cnVjdCBzZGVfc3NwcF9zdWJfYmxrcyAqc2JsaywKIAlib29sICpwcm9wX2V4aXN0cywgc3RydWN0IHNkZV9wcm9wX3ZhbHVlICpwcm9wX3ZhbHVlLCB1MzIgKnZpZ19jb3VudCkKIHsKLQlzYmxrLT5tYXh1cHNjYWxlID0gTUFYX1NTUFBfVVBTQ0FMRTsKLQlzYmxrLT5tYXhkd25zY2FsZSA9IE1BWF9TU1BQX0RPV05TQ0FMRTsKKwlzYmxrLT5tYXh1cHNjYWxlID0gTUFYX1VQU0NBTEVfUkFUSU87CisJc2Jsay0+bWF4ZHduc2NhbGUgPSBNQVhfRE9XTlNDQUxFX1JBVElPOwogCXNzcHAtPmlkID0gU1NQUF9WSUcwICsgKnZpZ19jb3VudDsKIAlzbnByaW50Zihzc3BwLT5uYW1lLCBTREVfSFdfQkxLX05BTUVfTEVOLCAic3NwcF8ldSIsCiAJCQlzc3BwLT5pZCAtIFNTUFBfVklHMCk7CkBAIC05NTIsOCArOTkxLDggQEAKIAlzdHJ1Y3Qgc2RlX3NzcHBfY2ZnICpzc3BwLCBzdHJ1Y3Qgc2RlX3NzcHBfc3ViX2Jsa3MgKnNibGssCiAJYm9vbCAqcHJvcF9leGlzdHMsIHN0cnVjdCBzZGVfcHJvcF92YWx1ZSAqcHJvcF92YWx1ZSwgdTMyICpyZ2JfY291bnQpCiB7Ci0Jc2Jsay0+bWF4dXBzY2FsZSA9IE1BWF9TU1BQX1VQU0NBTEU7Ci0Jc2Jsay0+bWF4ZHduc2NhbGUgPSBNQVhfU1NQUF9ET1dOU0NBTEU7CisJc2Jsay0+bWF4dXBzY2FsZSA9IE1BWF9VUFNDQUxFX1JBVElPOworCXNibGstPm1heGR3bnNjYWxlID0gTUFYX0RPV05TQ0FMRV9SQVRJTzsKIAlzc3BwLT5pZCA9IFNTUFBfUkdCMCArICpyZ2JfY291bnQ7CiAJc25wcmludGYoc3NwcC0+bmFtZSwgU0RFX0hXX0JMS19OQU1FX0xFTiwgInNzcHBfJXUiLAogCQkJc3NwcC0+aWQgLSBTU1BQX1ZJRzApOwpAQCAtMTI4Nyw4ICsxMzI2LDggQEAKIAl1MzIgb2ZmX2NvdW50LCBibGVuZF9vZmZfY291bnQsIG1heF9ibGVuZHN0YWdlcywgbG1fcGFpcl9tYXNrOwogCXN0cnVjdCBzZGVfbG1fY2ZnICptaXhlcjsKIAlzdHJ1Y3Qgc2RlX2xtX3N1Yl9ibGtzICpzYmxrOwotCWludCBwcF9jb3VudCwgZHNwcF9jb3VudDsKLQl1MzIgcHBfaWR4LCBkc3BwX2lkeDsKKwlpbnQgcHBfY291bnQsIGRzcHBfY291bnQsIGRzX2NvdW50OworCXUzMiBwcF9pZHgsIGRzcHBfaWR4LCBkc19pZHg7CiAJc3RydWN0IGRldmljZV9ub2RlICpzbnAgPSBOVUxMOwogCiAJaWYgKCFzZGVfY2ZnKSB7CkBAIC0xMzE5LDYgKzEzNTgsNyBAQAogCiAJcHBfY291bnQgPSBzZGVfY2ZnLT5waW5ncG9uZ19jb3VudDsKIAlkc3BwX2NvdW50ID0gc2RlX2NmZy0+ZHNwcF9jb3VudDsKKwlkc19jb3VudCA9IHNkZV9jZmctPmRzX2NvdW50OwogCiAJLyogZ2V0IG1peGVyIGZlYXR1cmUgZHQgcHJvcGVydGllcyBpZiB0aGV5IGV4aXN0ICovCiAJc25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsIG1peGVyX3Byb3BbTUlYRVJfQkxPQ0tTXS5wcm9wX25hbWUpOwpAQCAtMTM1OCw3ICsxMzk4LDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gZW5kOwogCi0JZm9yIChpID0gMCwgcHBfaWR4ID0gMCwgZHNwcF9pZHggPSAwOyBpIDwgb2ZmX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwLCBwcF9pZHggPSAwLCBkc3BwX2lkeCA9IDAsIGRzX2lkeCA9IDA7IGkgPCBvZmZfY291bnQ7IGkrKykgewogCQltaXhlciA9IHNkZV9jZmctPm1peGVyICsgaTsKIAkJc2JsayA9IGt6YWxsb2Moc2l6ZW9mKCpzYmxrKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2JsaykgewpAQCAtMTQwMCwxMyArMTQ0MCwxNyBAQAogCQkJCQkJCQk6IFBJTkdQT05HX01BWDsKIAkJCW1peGVyLT5kc3BwID0gZHNwcF9jb3VudCA+IDAgPyBkc3BwX2lkeCArIERTUFBfMAogCQkJCQkJCQk6IERTUFBfTUFYOworCQkJbWl4ZXItPmRzID0gZHNfY291bnQgPiAwID8gZHNfaWR4ICsgRFNfMCA6IERTX01BWDsKIAkJCXBwX2NvdW50LS07CiAJCQlkc3BwX2NvdW50LS07CisJCQlkc19jb3VudC0tOwogCQkJcHBfaWR4Kys7CiAJCQlkc3BwX2lkeCsrOworCQkJZHNfaWR4Kys7CiAJCX0gZWxzZSB7CiAJCQltaXhlci0+cGluZ3BvbmcgPSBQSU5HUE9OR19NQVg7CiAJCQltaXhlci0+ZHNwcCA9IERTUFBfTUFYOworCQkJbWl4ZXItPmRzID0gRFNfTUFYOwogCQl9CiAKIAkJc2Jsay0+Z2MuaWQgPSBTREVfTUlYRVJfR0M7CkBAIC0yMDM4LDYgKzIwODIsMTE2IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IHNkZV9kc19wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJc3RydWN0IHNkZV9tZHNzX2NmZyAqc2RlX2NmZykKK3sKKwlpbnQgcmMsIHByb3BfY291bnRbRFNfUFJPUF9NQVhdLCB0b3BfcHJvcF9jb3VudFtEU19UT1BfUFJPUF9NQVhdLCBpOworCXN0cnVjdCBzZGVfcHJvcF92YWx1ZSAqcHJvcF92YWx1ZSA9IE5VTEwsICp0b3BfcHJvcF92YWx1ZSA9IE5VTEw7CisJYm9vbCBwcm9wX2V4aXN0c1tEU19QUk9QX01BWF0sIHRvcF9wcm9wX2V4aXN0c1tEU19UT1BfUFJPUF9NQVhdOworCXUzMiBvZmZfY291bnQgPSAwLCB0b3Bfb2ZmX2NvdW50ID0gMDsKKwlzdHJ1Y3Qgc2RlX2RzX2NmZyAqZHM7CisJc3RydWN0IHNkZV9kc190b3BfY2ZnICpkc190b3AgPSBOVUxMOworCisJaWYgKCFzZGVfY2ZnKSB7CisJCVNERV9FUlJPUigiaW52YWxpZCBhcmd1bWVudFxuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKCFzZGVfY2ZnLT5tZHBbMF0uaGFzX2Rlc3Rfc2NhbGVyKSB7CisJCVNERV9ERUJVRygiZGVzdCBzY2FsZXIgZmVhdHVyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmMgPSAwOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBQYXJzZSB0aGUgZGVzdCBzY2FsZXIgdG9wIHJlZ2lzdGVyIG9mZnNldCBhbmQgY2FwYWJpbGl0aWVzICovCisJdG9wX3Byb3BfdmFsdWUgPSBremFsbG9jKERTX1RPUF9QUk9QX01BWCAqCisJCQlzaXplb2Yoc3RydWN0IHNkZV9wcm9wX3ZhbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0b3BfcHJvcF92YWx1ZSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKworCXJjID0gX3ZhbGlkYXRlX2R0X2VudHJ5KG5wLCBkc190b3BfcHJvcCwKKwkJCQlBUlJBWV9TSVpFKGRzX3RvcF9wcm9wKSwKKwkJCQl0b3BfcHJvcF9jb3VudCwgJnRvcF9vZmZfY291bnQpOworCWlmIChyYykKKwkJZ290byBlbmQ7CisKKwlyYyA9IF9yZWFkX2R0X2VudHJ5KG5wLCBkc190b3BfcHJvcCwKKwkJCUFSUkFZX1NJWkUoZHNfdG9wX3Byb3ApLCB0b3BfcHJvcF9jb3VudCwKKwkJCXRvcF9wcm9wX2V4aXN0cywgdG9wX3Byb3BfdmFsdWUpOworCWlmIChyYykKKwkJZ290byBlbmQ7CisKKwkvKiBQYXJzZSB0aGUgb2Zmc2V0IG9mIGVhY2ggZGVzdCBzY2FsZXIgYmxvY2sgKi8KKwlwcm9wX3ZhbHVlID0ga3phbGxvYyhEU19QUk9QX01BWCAqCisJCQlzaXplb2Yoc3RydWN0IHNkZV9wcm9wX3ZhbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wX3ZhbHVlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJcmMgPSBfdmFsaWRhdGVfZHRfZW50cnkobnAsIGRzX3Byb3AsIEFSUkFZX1NJWkUoZHNfcHJvcCksIHByb3BfY291bnQsCisJCSZvZmZfY291bnQpOworCWlmIChyYykKKwkJZ290byBlbmQ7CisKKwlzZGVfY2ZnLT5kc19jb3VudCA9IG9mZl9jb3VudDsKKworCXJjID0gX3JlYWRfZHRfZW50cnkobnAsIGRzX3Byb3AsIEFSUkFZX1NJWkUoZHNfcHJvcCksIHByb3BfY291bnQsCisJCXByb3BfZXhpc3RzLCBwcm9wX3ZhbHVlKTsKKwlpZiAocmMpCisJCWdvdG8gZW5kOworCisJaWYgKCFvZmZfY291bnQpCisJCWdvdG8gZW5kOworCisJZHNfdG9wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNkZV9kc190b3BfY2ZnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkc190b3ApIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVuZDsKKwl9CisKKwlkc190b3AtPmlkID0gRFNfVE9QOworCXNucHJpbnRmKGRzX3RvcC0+bmFtZSwgU0RFX0hXX0JMS19OQU1FX0xFTiwgImRzX3RvcF8ldSIsCisJCWRzX3RvcC0+aWQgLSBEU19UT1ApOworCWRzX3RvcC0+YmFzZSA9IFBST1BfVkFMVUVfQUNDRVNTKHRvcF9wcm9wX3ZhbHVlLCBEU19UT1BfT0ZGLCAwKTsKKwlkc190b3AtPmxlbiA9IFBST1BfVkFMVUVfQUNDRVNTKHRvcF9wcm9wX3ZhbHVlLCBEU19UT1BfTEVOLCAwKTsKKwlkc190b3AtPm1heHVwc2NhbGUgPSBNQVhfVVBTQ0FMRV9SQVRJTzsKKworCWRzX3RvcC0+bWF4aW5wdXR3aWR0aCA9IFBST1BfVkFMVUVfQUNDRVNTKHRvcF9wcm9wX3ZhbHVlLAorCQkJRFNfVE9QX0lOUFVUX0xJTkVXSURUSCwgMCk7CisJaWYgKCF0b3BfcHJvcF9leGlzdHNbRFNfVE9QX0lOUFVUX0xJTkVXSURUSF0pCisJCWRzX3RvcC0+bWF4aW5wdXR3aWR0aCA9IERFRkFVTFRfU0RFX0xJTkVfV0lEVEg7CisKKwlkc190b3AtPm1heG91dHB1dHdpZHRoID0gUFJPUF9WQUxVRV9BQ0NFU1ModG9wX3Byb3BfdmFsdWUsCisJCQlEU19UT1BfT1VUUFVUX0xJTkVXSURUSCwgMCk7CisJaWYgKCF0b3BfcHJvcF9leGlzdHNbRFNfVE9QX09VVFBVVF9MSU5FV0lEVEhdKQorCQlkc190b3AtPm1heG91dHB1dHdpZHRoID0gREVGQVVMVF9TREVfT1VUUFVUX0xJTkVfV0lEVEg7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2ZmX2NvdW50OyBpKyspIHsKKwkJZHMgPSBzZGVfY2ZnLT5kcyArIGk7CisJCWRzLT50b3AgPSBkc190b3A7CisJCWRzLT5iYXNlID0gUFJPUF9WQUxVRV9BQ0NFU1MocHJvcF92YWx1ZSwgRFNfT0ZGLCBpKTsKKwkJZHMtPmlkID0gRFNfMCArIGk7CisJCWRzLT5sZW4gPSBQUk9QX1ZBTFVFX0FDQ0VTUyhwcm9wX3ZhbHVlLCBEU19MRU4sIDApOworCQlzbnByaW50Zihkcy0+bmFtZSwgU0RFX0hXX0JMS19OQU1FX0xFTiwgImRzXyV1IiwKKwkJCWRzLT5pZCAtIERTXzApOworCisJCWlmICghcHJvcF9leGlzdHNbRFNfTEVOXSkKKwkJCWRzLT5sZW4gPSBERUZBVUxUX1NERV9IV19CTE9DS19MRU47CisKKwkJaWYgKHNkZV9jZmctPnFzZWVkX3R5cGUgPT0gU0RFX1NTUFBfU0NBTEVSX1FTRUVEMykKKwkJCXNldF9iaXQoU0RFX1NTUFBfU0NBTEVSX1FTRUVEMywgJmRzLT5mZWF0dXJlcyk7CisJfQorCitlbmQ6CisJa2ZyZWUodG9wX3Byb3BfdmFsdWUpOworCWtmcmVlKHByb3BfdmFsdWUpOworCXJldHVybiByYzsKK307CisKIHN0YXRpYyBpbnQgc2RlX2RzY19wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJc3RydWN0IHNkZV9tZHNzX2NmZyAqc2RlX2NmZykKIHsKQEAgLTI1NDIsNiArMjY5Niw5IEBACiAJaWYgKCFwcm9wX2V4aXN0c1tVQldDX1NXSVpaTEVdKQogCQljZmctPm1kcFswXS51YndjX3N3aXp6bGUgPSBERUZBVUxUX1NERV9VQldDX1NXSVpaTEU7CiAKKwljZmctPm1kcFswXS5oYXNfZGVzdF9zY2FsZXIgPQorCQlQUk9QX1ZBTFVFX0FDQ0VTUyhwcm9wX3ZhbHVlLCBERVNUX1NDQUxFUiwgMCk7CisKIAlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCBzZGVfcHJvcFtRU0VFRF9UWVBFXS5wcm9wX25hbWUsICZ0eXBlKTsKIAlpZiAoIXJjICYmICFzdHJjbXAodHlwZSwgInFzZWVkdjMiKSkgewogCQljZmctPnFzZWVkX3R5cGUgPSBTREVfU1NQUF9TQ0FMRVJfUVNFRUQzOwpAQCAtMjY5MSw2ICsyODQ4LDE4IEBACiAJCQlwcm9wX2V4aXN0c1tQRVJGX01BWF9CV19ISUdIXSA/CiAJCQlQUk9QX1ZBTFVFX0FDQ0VTUyhwcm9wX3ZhbHVlLCBQRVJGX01BWF9CV19ISUdILCAwKSA6CiAJCQlERUZBVUxUX01BWF9CV19ISUdIOworCWNmZy0+cGVyZi5taW5fY29yZV9pYiA9CisJCQlwcm9wX2V4aXN0c1tQRVJGX01JTl9DT1JFX0lCXSA/CisJCQlQUk9QX1ZBTFVFX0FDQ0VTUyhwcm9wX3ZhbHVlLCBQRVJGX01JTl9DT1JFX0lCLCAwKSA6CisJCQlERUZBVUxUX01BWF9CV19MT1c7CisJY2ZnLT5wZXJmLm1pbl9sbGNjX2liID0KKwkJCXByb3BfZXhpc3RzW1BFUkZfTUlOX0xMQ0NfSUJdID8KKwkJCVBST1BfVkFMVUVfQUNDRVNTKHByb3BfdmFsdWUsIFBFUkZfTUlOX0xMQ0NfSUIsIDApIDoKKwkJCURFRkFVTFRfTUFYX0JXX0xPVzsKKwljZmctPnBlcmYubWluX2RyYW1faWIgPQorCQkJcHJvcF9leGlzdHNbUEVSRl9NSU5fRFJBTV9JQl0gPworCQkJUFJPUF9WQUxVRV9BQ0NFU1MocHJvcF92YWx1ZSwgUEVSRl9NSU5fRFJBTV9JQiwgMCkgOgorCQkJREVGQVVMVF9NQVhfQldfTE9XOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIHBlcmZvcm1hbmNlIHBhcmFtZXRlcnMgKGUuZy4gY29yZV9pYl9mZikgYXJlCkBAIC0yODczLDcgKzMwNDIsOCBAQAogCXZpZ19saXN0X3NpemUgKz0gQVJSQVlfU0laRShyZ2JfMTBiaXRfZm9ybWF0cykKIAkJKyBBUlJBWV9TSVpFKHRwMTBfdWJ3Y19mb3JtYXRzKQogCQkrIEFSUkFZX1NJWkUocDAxMF9mb3JtYXRzKTsKLQlpZiAoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDAwKSkKKwlpZiAoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDAwKSB8fAorCQkoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDEwKSkpCiAJCXZpZ19saXN0X3NpemUgKz0gQVJSQVlfU0laRShwMDEwX3Vid2NfZm9ybWF0cyk7CiAKIAl3YjJfbGlzdF9zaXplICs9IEFSUkFZX1NJWkUocmdiXzEwYml0X2Zvcm1hdHMpCkBAIC0yOTE0LDcgKzMwODQsOCBAQAogCQlBUlJBWV9TSVpFKHJnYl8xMGJpdF9mb3JtYXRzKSk7CiAJaW5kZXggKz0gc2RlX2NvcHlfZm9ybWF0cyhzZGVfY2ZnLT52aWdfZm9ybWF0cywgdmlnX2xpc3Rfc2l6ZSwKIAkJaW5kZXgsIHAwMTBfZm9ybWF0cywgQVJSQVlfU0laRShwMDEwX2Zvcm1hdHMpKTsKLQlpZiAoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDAwKSkKKwlpZiAoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDAwKSB8fAorCQkoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKGh3X3JldiksIFNERV9IV19WRVJfNDEwKSkpCiAJCWluZGV4ICs9IHNkZV9jb3B5X2Zvcm1hdHMoc2RlX2NmZy0+dmlnX2Zvcm1hdHMsCiAJCQl2aWdfbGlzdF9zaXplLCBpbmRleCwgcDAxMF91YndjX2Zvcm1hdHMsCiAJCQlBUlJBWV9TSVpFKHAwMTBfdWJ3Y19mb3JtYXRzKSk7CkBAIC0yOTQ0LDMzICszMTE1LDI1IEBACiAKIAlyYyA9IHNkZV9oYXJkd2FyZV9mb3JtYXRfY2FwcyhzZGVfY2ZnLCBod19yZXYpOwogCi0Jc3dpdGNoIChod19yZXYpIHsKLQljYXNlIFNERV9IV19WRVJfMTcwOgotCWNhc2UgU0RFX0hXX1ZFUl8xNzE6Ci0JY2FzZSBTREVfSFdfVkVSXzE3MjoKKwlpZiAoSVNfTVNNODk5Nl9UQVJHRVQoaHdfcmV2KSkgewogCQkvKiB1cGRhdGUgbXNtODk5NiB0YXJnZXQgaGVyZSAqLwogCQlzZGVfY2ZnLT5wZXJmLm1pbl9wcmVmaWxsX2xpbmVzID0gMjE7Ci0JCWJyZWFrOwotCWNhc2UgU0RFX0hXX1ZFUl8zMDA6Ci0JY2FzZSBTREVfSFdfVkVSXzMwMToKKwl9IGVsc2UgaWYgKElTX01TTTg5OThfVEFSR0VUKGh3X3JldikpIHsKIAkJLyogdXBkYXRlIG1zbTg5OTggdGFyZ2V0IGhlcmUgKi8KIAkJc2RlX2NmZy0+aGFzX3diX3Vid2MgPSB0cnVlOwogCQlzZGVfY2ZnLT5wZXJmLm1pbl9wcmVmaWxsX2xpbmVzID0gMjU7CiAJCXNkZV9jZmctPnZiaWZfcW9zX25sdmwgPSA0OwogCQlzZGVfY2ZnLT50c19wcmVmaWxsX3JldiA9IDE7Ci0JCXNkZV9jZmctPnBlcmYubWluX3ByZWZpbGxfbGluZXMgPSAyNTsKLQkJYnJlYWs7Ci0JY2FzZSBTREVfSFdfVkVSXzQwMDoKKwl9IGVsc2UgaWYgKElTX1NETTg0NV9UQVJHRVQoaHdfcmV2KSB8fCBJU19TRE02NzBfVEFSR0VUKGh3X3JldikpIHsKIAkJLyogdXBkYXRlIHNkbTg0NSB0YXJnZXQgaGVyZSAqLwogCQlzZGVfY2ZnLT5oYXNfd2JfdWJ3YyA9IHRydWU7CiAJCXNkZV9jZmctPnBlcmYubWluX3ByZWZpbGxfbGluZXMgPSAyNDsKIAkJc2RlX2NmZy0+dmJpZl9xb3Nfbmx2bCA9IDg7CiAJCXNkZV9jZmctPnRzX3ByZWZpbGxfcmV2ID0gMjsKLQkJc2RlX2NmZy0+cGVyZi5taW5fcHJlZmlsbF9saW5lcyA9IDI0OwotCQlicmVhazsKLQlkZWZhdWx0OgorCX0gZWxzZSB7CisJCVNERV9FUlJPUigidW5zdXBwb3J0ZWQgY2hpcHNldCBpZDolWFxuIiwgaHdfcmV2KTsKIAkJc2RlX2NmZy0+cGVyZi5taW5fcHJlZmlsbF9saW5lcyA9IDB4ZmZmZjsKLQkJYnJlYWs7CisJCXJjID0gLUVOT0RFVjsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0yOTk1LDYgKzMxNTgsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBzZGVfY2ZnLT5kc3BwX2NvdW50OyBpKyspCiAJCWtmcmVlKHNkZV9jZmctPmRzcHBbaV0uc2Jsayk7CiAKKwlpZiAoc2RlX2NmZy0+ZHNfY291bnQpCisJCWtmcmVlKHNkZV9jZmctPmRzWzBdLnRvcCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgc2RlX2NmZy0+cGluZ3BvbmdfY291bnQ7IGkrKykKIAkJa2ZyZWUoc2RlX2NmZy0+cGluZ3BvbmdbaV0uc2Jsayk7CiAKQEAgLTMwNjMsNiArMzIyOSwxMCBAQAogCWlmIChyYykKIAkJZ290byBlbmQ7CiAKKwlyYyA9IHNkZV9kc19wYXJzZV9kdChucCwgc2RlX2NmZyk7CisJaWYgKHJjKQorCQlnb3RvIGVuZDsKKwogCXJjID0gc2RlX2RzY19wYXJzZV9kdChucCwgc2RlX2NmZyk7CiAJaWYgKHJjKQogCQlnb3RvIGVuZDsKQEAgLTMwNzEsNyArMzI0MSw5IEBACiAJaWYgKHJjKQogCQlnb3RvIGVuZDsKIAotCS8qIG1peGVyIHBhcnNpbmcgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgZHNwcCBhbmQgcHAgZm9yIG1hcHBpbmcgc2V0dXAgKi8KKwkvKiBtaXhlciBwYXJzaW5nIHNob3VsZCBiZSBkb25lIGFmdGVyIGRzcHAsCisJICogZHMgYW5kIHBwIGZvciBtYXBwaW5nIHNldHVwCisJICovCiAJcmMgPSBzZGVfbWl4ZXJfcGFyc2VfZHQobnAsIHNkZV9jZmcpOwogCWlmIChyYykKIAkJZ290byBlbmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2F0YWxvZy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NhdGFsb2cuaAppbmRleCBmYTEwYTg4Li5lNjBiNWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2F0YWxvZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jYXRhbG9nLmgKQEAgLTQ1LDggKzQ1LDEzIEBACiAjZGVmaW5lIFNERV9IV19WRVJfMzAwCVNERV9IV19WRVIoMywgMCwgMCkgLyogODk5OCB2MS4wICovCiAjZGVmaW5lIFNERV9IV19WRVJfMzAxCVNERV9IV19WRVIoMywgMCwgMSkgLyogODk5OCB2MS4xICovCiAjZGVmaW5lIFNERV9IV19WRVJfNDAwCVNERV9IV19WRVIoNCwgMCwgMCkgLyogc2RtODQ1IHYxLjAgKi8KKyNkZWZpbmUgU0RFX0hXX1ZFUl80MDEJU0RFX0hXX1ZFUig0LCAwLCAxKSAvKiBzZG04NDUgdjIuMCAqLworI2RlZmluZSBTREVfSFdfVkVSXzQxMAlTREVfSFdfVkVSKDQsIDEsIDApIC8qIHNkbTY3MCB2MS4wICovCiAKKyNkZWZpbmUgSVNfTVNNODk5Nl9UQVJHRVQocmV2KSBJU19TREVfTUFKT1JfTUlOT1JfU0FNRSgocmV2KSwgU0RFX0hXX1ZFUl8xNzApCisjZGVmaW5lIElTX01TTTg5OThfVEFSR0VUKHJldikgSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKHJldiksIFNERV9IV19WRVJfMzAwKQogI2RlZmluZSBJU19TRE04NDVfVEFSR0VUKHJldikgSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKHJldiksIFNERV9IV19WRVJfNDAwKQorI2RlZmluZSBJU19TRE02NzBfVEFSR0VUKHJldikgSVNfU0RFX01BSk9SX01JTk9SX1NBTUUoKHJldiksIFNERV9IV19WRVJfNDEwKQogCiAjZGVmaW5lIFNERV9IV19CTEtfTkFNRV9MRU4JMTYKIApAQCAtNTE0LDYgKzUxOSw3IEBACiAgKiBAaGlnaGVzdF9iYW5rX2JpdDogIFVCV0MgcGFyYW1ldGVyCiAgKiBAdWJ3Y19zdGF0aWM6ICAgICAgIHVid2Mgc3RhdGljIGNvbmZpZ3VyYXRpb24KICAqIEB1YndjX3N3aXp6bGU6ICAgICAgdWJ3YyBkZWZhdWx0IHN3aXp6bGUgc2V0dGluZworICogQGhhc19kZXN0X3NjYWxlcjogICBpbmRpY2F0ZXMgc3VwcG9ydCBvZiBkZXN0aW5hdGlvbiBzY2FsZXIKICAqIEBjbGtfY3RybHMgICAgICAgICAgY2xvY2sgY29udHJvbCByZWdpc3RlciBkZWZpbml0aW9uCiAgKi8KIHN0cnVjdCBzZGVfbWRwX2NmZyB7CkBAIC01MjEsNiArNTI3LDcgQEAKIAl1MzIgaGlnaGVzdF9iYW5rX2JpdDsKIAl1MzIgdWJ3Y19zdGF0aWM7CiAJdTMyIHVid2Nfc3dpenpsZTsKKwlib29sIGhhc19kZXN0X3NjYWxlcjsKIAlzdHJ1Y3Qgc2RlX2Nsa19jdHJsX3JlZyBjbGtfY3RybHNbU0RFX0NMS19DVFJMX01BWF07CiB9OwogCkBAIC01NTksNiArNTY2LDcgQEAKICAqIEBzYmxrOiAgICAgICAgICAgICAgTE0gU3ViLWJsb2NrcyBpbmZvcm1hdGlvbgogICogQGRzcHA6ICAgICAgICAgICAgICBJRCBvZiBjb25uZWN0ZWQgRFNQUCwgRFNQUF9NQVggaWYgdW5zdXBwb3J0ZWQKICAqIEBwaW5ncG9uZzogICAgICAgICAgSUQgb2YgY29ubmVjdGVkIFBpbmdQb25nLCBQSU5HUE9OR19NQVggaWYgdW5zdXBwb3J0ZWQKKyAqIEBkczogICAgICAgICAgICAgICAgSUQgb2YgY29ubmVjdGVkIERTLCBEU19NQVggaWYgdW5zdXBwb3J0ZWQKICAqIEBsbV9wYWlyX21hc2s6ICAgICAgQml0bWFzayBvZiBMTXMgdGhhdCBjYW4gYmUgY29udHJvbGxlZCBieSBzYW1lIENUTAogICovCiBzdHJ1Y3Qgc2RlX2xtX2NmZyB7CkBAIC01NjYsNiArNTc0LDcgQEAKIAljb25zdCBzdHJ1Y3Qgc2RlX2xtX3N1Yl9ibGtzICpzYmxrOwogCXUzMiBkc3BwOwogCXUzMiBwaW5ncG9uZzsKKwl1MzIgZHM7CiAJdW5zaWduZWQgbG9uZyBsbV9wYWlyX21hc2s7CiB9OwogCkBAIC01OTQsNiArNjAzLDM4IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBzZGVfZHNfdG9wX2NmZyAtIGluZm9ybWF0aW9uIG9mIGRlc3Qgc2NhbGVyIHRvcAorICogQGlkICAgICAgICAgICAgICAgZW51bSBpZGVudGlmeWluZyB0aGlzIGJsb2NrCisgKiBAYmFzZSAgICAgICAgICAgICByZWdpc3RlciBvZmZzZXQgb2YgdGhpcyBibG9jaworICogQGZlYXR1cmVzICAgICAgICAgYml0IG1hc2sgaWRlbnRpZnlpbmcgZmVhdHVyZXMKKyAqIEB2ZXJzaW9uICAgICAgICAgIGh3IHZlcnNpb24gb2YgZGVzdCBzY2FsZXIKKyAqIEBtYXhpbnB1dHdpZHRoICAgIG1heGltdW0gaW5wdXQgbGluZSB3aWR0aAorICogQG1heG91dHB1dHdpZHRoICAgbWF4aW11bSBvdXRwdXQgbGluZSB3aWR0aAorICogQG1heHVwc2NhbGUgICAgICAgbWF4aW11bSB1cHNjYWxlIHJhdGlvCisgKi8KK3N0cnVjdCBzZGVfZHNfdG9wX2NmZyB7CisJU0RFX0hXX0JMS19JTkZPOworCXUzMiB2ZXJzaW9uOworCXUzMiBtYXhpbnB1dHdpZHRoOworCXUzMiBtYXhvdXRwdXR3aWR0aDsKKwl1MzIgbWF4dXBzY2FsZTsKK307CisKKy8qKgorICogc3RydWN0IHNkZV9kc19jZmcgLSBpbmZvcm1hdGlvbiBvZiBkZXN0IHNjYWxlciBibG9ja3MKKyAqIEBpZCAgICAgICAgICBlbnVtIGlkZW50aWZ5aW5nIHRoaXMgYmxvY2sKKyAqIEBiYXNlICAgICAgICByZWdpc3RlciBvZmZzZXQgd3J0IERTIHRvcCBvZmZzZXQKKyAqIEBmZWF0dXJlcyAgICBiaXQgbWFzayBpZGVudGlmeWluZyBmZWF0dXJlcworICogQHZlcnNpb24gICAgIGh3IHZlcnNpb24gb2YgdGhlIHFzZWVkIGJsb2NrCisgKiBAdG9wICAgICAgICAgRFMgdG9wIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBzZGVfZHNfY2ZnIHsKKwlTREVfSFdfQkxLX0lORk87CisJdTMyIHZlcnNpb247CisJY29uc3Qgc3RydWN0IHNkZV9kc190b3BfY2ZnICp0b3A7Cit9OworCisvKioKICAqIHN0cnVjdCBzZGVfcGluZ3BvbmdfY2ZnIC0gaW5mb3JtYXRpb24gb2YgUElORy1QT05HIGJsb2NrcwogICogQGlkICAgICAgICAgICAgICAgICBlbnVtIGlkZW50aWZ5aW5nIHRoaXMgYmxvY2sKICAqIEBiYXNlICAgICAgICAgICAgICAgcmVnaXN0ZXIgb2Zmc2V0IG9mIHRoaXMgYmxvY2sKQEAgLTgwMCw2ICs4NDEsMTAgQEAKICAqIHN0cnVjdCBzZGVfcGVyZl9jZmcgLSBwZXJmb3JtYW5jZSBjb250cm9sIHNldHRpbmdzCiAgKiBAbWF4X2J3X2xvdyAgICAgICAgIGxvdyB0aHJlc2hvbGQgb2YgbWF4aW11bSBiYW5kd2lkdGggKGticHMpCiAgKiBAbWF4X2J3X2hpZ2ggICAgICAgIGhpZ2ggdGhyZXNob2xkIG9mIG1heGltdW0gYmFuZHdpZHRoIChrYnBzKQorICogQG1pbl9jb3JlX2liICAgICAgICBtaW5pbXVtIGJhbmR3aWR0aCBmb3IgY29yZSAoa2JwcykKKyAqIEBtaW5fY29yZV9pYiAgICAgICAgbWluaW11bSBtbm9jIGliIHZvdGUgaW4ga2JwcworICogQG1pbl9sbGNjX2liICAgICAgICBtaW5pbXVtIGxsY2MgaWIgdm90ZSBpbiBrYnBzCisgKiBAbWluX2RyYW1faWIgICAgICAgIG1pbmltdW0gZHJhbSBpYiB2b3RlIGluIGticHMKICAqIEBjb3JlX2liX2ZmICAgICAgICAgY29yZSBpbnN0YW50YW5lb3VzIGJhbmR3aWR0aCBmdWRnZSBmYWN0b3IKICAqIEBjb3JlX2Nsa19mZiAgICAgICAgY29yZSBjbG9jayBmdWRnZSBmYWN0b3IKICAqIEBjb21wX3JhdGlvX3J0ICAgICAgc3RyaW5nIG9mIDAgb3IgbW9yZSBvZiA8Zm91cmNjPi88dmVuPi88bW9kPi88Y29tcCByYXRpbz4KQEAgLTgyMSw2ICs4NjYsOSBAQAogc3RydWN0IHNkZV9wZXJmX2NmZyB7CiAJdTMyIG1heF9id19sb3c7CiAJdTMyIG1heF9id19oaWdoOworCXUzMiBtaW5fY29yZV9pYjsKKwl1MzIgbWluX2xsY2NfaWI7CisJdTMyIG1pbl9kcmFtX2liOwogCWNvbnN0IGNoYXIgKmNvcmVfaWJfZmY7CiAJY29uc3QgY2hhciAqY29yZV9jbGtfZmY7CiAJY29uc3QgY2hhciAqY29tcF9yYXRpb19ydDsKQEAgLTkwOSw2ICs5NTcsOSBAQAogCXUzMiBkc3BwX2NvdW50OwogCXN0cnVjdCBzZGVfZHNwcF9jZmcgZHNwcFtNQVhfQkxPQ0tTXTsKIAorCXUzMiBkc19jb3VudDsKKwlzdHJ1Y3Qgc2RlX2RzX2NmZyBkc1tNQVhfQkxPQ0tTXTsKKwogCXUzMiBwaW5ncG9uZ19jb3VudDsKIAlzdHJ1Y3Qgc2RlX3Bpbmdwb25nX2NmZyBwaW5ncG9uZ1tNQVhfQkxPQ0tTXTsKIApAQCAtOTYxLDYgKzEwMTIsNyBAQAogI2RlZmluZSBCTEtfQ1VSU09SKHMpICgocyktPmN1cnNvcikKICNkZWZpbmUgQkxLX01JWEVSKHMpICgocyktPm1peGVyKQogI2RlZmluZSBCTEtfRFNQUChzKSAoKHMpLT5kc3BwKQorI2RlZmluZSBCTEtfRFMocykgKChzKS0+ZHMpCiAjZGVmaW5lIEJMS19QSU5HUE9ORyhzKSAoKHMpLT5waW5ncG9uZykKICNkZWZpbmUgQkxLX0NETShzKSAoKHMpLT5jZG0pCiAjZGVmaW5lIEJMS19JTlRGKHMpICgocyktPmludGYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2RtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY2RtLmMKaW5kZXggMzA0MTA2ZC4uN2EzOTFhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NkbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jZG0uYwpAQCAtODEsNiArODEsNyBAQAogCQlpZiAoY2RtID09IG0tPmNkbVtpXS5pZCkgewogCQkJYi0+YmFzZV9vZmYgPSBhZGRyOwogCQkJYi0+YmxrX29mZiA9IG0tPmNkbVtpXS5iYXNlOworCQkJYi0+bGVuZ3RoID0gbS0+Y2RtW2ldLmxlbjsKIAkJCWItPmh3dmVyc2lvbiA9IG0tPmh3dmVyc2lvbjsKIAkJCWItPmxvZ19tYXNrID0gU0RFX0RCR19NQVNLX0NETTsKIAkJCXJldHVybiAmbS0+Y2RtW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NvbG9yX3Byb2NfdjQuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jb2xvcl9wcm9jX3Y0LmMKaW5kZXggZGNmZDgxZC4uZjVhZWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NvbG9yX3Byb2NfdjQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY29sb3JfcHJvY192NC5jCkBAIC00OSw3ICs0OSw2IEBACiAJCWJyZWFrOwogCWNhc2UgR0FNVVRfM0RfTU9ERV81OgogCQkqb3Bjb2RlID0gZ2FtdXRfbW9kZV81IDw8IDI7Ci0JCSpvcGNvZGUgfD0gR0FNVVRfTUFQX0VOOwogCQl0YmxfbGVuID0gR0FNVVRfM0RfTU9ERTVfVEJMX1NaOwogCQl0Ymxfb2ZmID0gR0FNVVRfTU9ERV81X09GRjsKIAkJc2NhbGVfb2ZmID0gR0FNVVRfU0NBTEVCX09GRlNFVF9PRkY7CkBAIC04MSw3ICs4MCw4IEBACiAJCWVsc2UKIAkJCXNjYWxlX3RibF9sZW4gPSBHQU1VVF8zRF9TQ0FMRUJfT0ZGX1NaOwogCQlmb3IgKGkgPSAwOyBpIDwgR0FNVVRfM0RfU0NBTEVfT0ZGX1RCTF9OVU07IGkrKykgewotCQkJc2NhbGVfdGJsX29mZiA9IGJhc2UgKyBzY2FsZV9vZmYgKyBpICogc2NhbGVfdGJsX2xlbjsKKwkJCXNjYWxlX3RibF9vZmYgPSBiYXNlICsgc2NhbGVfb2ZmICsKKwkJCQkJaSAqIHNjYWxlX3RibF9sZW4gKiBzaXplb2YodTMyKTsKIAkJCXNjYWxlX2RhdGEgPSAmcGF5bG9hZC0+c2NhbGVfb2ZmW2ldWzBdOwogCQkJZm9yIChqID0gMDsgaiA8IHNjYWxlX3RibF9sZW47IGorKykKIAkJCQlTREVfUkVHX1dSSVRFKGh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NvbG9yX3Byb2Nlc3NpbmdfdjFfNy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2NvbG9yX3Byb2Nlc3NpbmdfdjFfNy5jCmluZGV4IDQxOTEzNjcuLjhlNTRhMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jb2xvcl9wcm9jZXNzaW5nX3YxXzcuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY29sb3JfcHJvY2Vzc2luZ192MV83LmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGRybS9tc21fZHJtX3BwLmg+CiAjaW5jbHVkZSAic2RlX2h3X2NvbG9yX3Byb2Nlc3NpbmdfdjFfNy5oIgorI2luY2x1ZGUgInNkZV9od19jdGwuaCIKIAogI2RlZmluZSBQQV9IVUVfVklHX09GRgkJMHgxMTAKICNkZWZpbmUgUEFfU0FUX1ZJR19PRkYJCTB4MTE0CkBAIC0yMyw5ICsyNCwxNSBAQAogI2RlZmluZSBQQV9WQUxfRFNQUF9PRkYJCTB4MjQwCiAjZGVmaW5lIFBBX0NPTlRfRFNQUF9PRkYJMHgyNDQKIAorI2RlZmluZSBQQV9ISVNUX0NUUkxfRFNQUF9PRkYJMHg0CisjZGVmaW5lIFBBX0hJU1RfREFUQV9EU1BQX09GRgkweDQwMAorCiAjZGVmaW5lIFBBX0xVVFZfRFNQUF9PRkYJMHgxNDAwCiAjZGVmaW5lIFBBX0xVVF9TV0FQX09GRgkJMHgyMzQKIAorI2RlZmluZSBQQV9MVVRWX0RTUFBfQ1RSTF9PRkYJMHg0YworI2RlZmluZSBQQV9MVVRWX0RTUFBfU1dBUF9PRkYJMHgxOAorCiAjZGVmaW5lIFBBX0hVRV9NQVNLCQkweEZGRgogI2RlZmluZSBQQV9TQVRfTUFTSwkJMHhGRkZGCiAjZGVmaW5lIFBBX1ZBTF9NQVNLCQkweEZGCkBAIC02Niw2ICs3Myw3IEBACiAjZGVmaW5lIERTUFBfT1BfUEFfQ09OVF9FTglCSVQoMjgpCiAjZGVmaW5lIERTUFBfT1BfUEFfRU4JCUJJVCgyMCkKICNkZWZpbmUgRFNQUF9PUF9QQV9MVVRWX0VOCUJJVCgxOSkKKyNkZWZpbmUgRFNQUF9PUF9QQV9ISVNUX0VOCUJJVCgxNikKICNkZWZpbmUgRFNQUF9PUF9QQV9TS0lOX0VOCUJJVCg1KQogI2RlZmluZSBEU1BQX09QX1BBX0ZPTF9FTglCSVQoNikKICNkZWZpbmUgRFNQUF9PUF9QQV9TS1lfRU4JQklUKDcpCkBAIC00NTgsNiArNDY2LDYyIEBACiAJU0RFX1JFR19XUklURSgmY3R4LT5odywgYmFzZSwgb3BfbW9kZSk7CiB9CiAKK3ZvaWQgc2RlX3NldHVwX2RzcHBfcGFfdmx1dF92MV84KHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpCit7CisJc3RydWN0IGRybV9tc21fcGFfdmx1dCAqcGF5bG9hZCA9IE5VTEw7CisJc3RydWN0IHNkZV9od19jcF9jZmcgKmh3X2NmZyA9IGNmZzsKKwlzdHJ1Y3Qgc2RlX2h3X2N0bCAqY3RsID0gTlVMTDsKKwl1MzIgdmx1dF9iYXNlLCBwYV9oaXN0X2Jhc2U7CisJdTMyIGN0cmxfb2ZmLCBzd2FwX29mZjsKKwl1MzIgdG1wID0gMDsKKwlpbnQgaSA9IDAsIGogPSAwOworCXUzMiBmbHVzaF9tYXNrID0gMDsKKworCWlmICghY3R4KSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXIgTlVMTCBjdHhcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFod19jZmcgfHwgKGh3X2NmZy0+cGF5bG9hZCAmJiBod19jZmctPmxlbiAhPQorCQkJc2l6ZW9mKHN0cnVjdCBkcm1fbXNtX3BhX3ZsdXQpKSkgeworCQlEUk1fRVJST1IoImh3ICVwSyBwYXlsb2FkICVwSyBwYXlsb2Fkc2l6ZSAlZCBleHAgc2l6ZSAlemRcbiIsCisJCQkgIGh3X2NmZywgKChod19jZmcpID8gaHdfY2ZnLT5wYXlsb2FkIDogTlVMTCksCisJCQkgICgoaHdfY2ZnKSA/IGh3X2NmZy0+bGVuIDogMCksCisJCQkgIHNpemVvZihzdHJ1Y3QgZHJtX21zbV9wYV92bHV0KSk7CisJCXJldHVybjsKKwl9CisKKwljdGwgPSBod19jZmctPmN0bDsKKwl2bHV0X2Jhc2UgPSBjdHgtPmNhcC0+c2Jsay0+dmx1dC5iYXNlOworCXBhX2hpc3RfYmFzZSA9IGN0eC0+Y2FwLT5zYmxrLT5oaXN0LmJhc2U7CisJY3RybF9vZmYgPSBwYV9oaXN0X2Jhc2UgKyBQQV9MVVRWX0RTUFBfQ1RSTF9PRkY7CisJc3dhcF9vZmYgPSBwYV9oaXN0X2Jhc2UgKyBQQV9MVVRWX0RTUFBfU1dBUF9PRkY7CisKKwlpZiAoIWh3X2NmZy0+cGF5bG9hZCkgeworCQlEUk1fREVCVUdfRFJJVkVSKCJEaXNhYmxlIHZsdXQgZmVhdHVyZVxuIik7CisJCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIGN0cmxfb2ZmLCAwKTsKKwkJZ290byBleGl0OworCX0KKworCXBheWxvYWQgPSBod19jZmctPnBheWxvYWQ7CisJRFJNX0RFQlVHX0RSSVZFUigiRW5hYmxlIHZsdXQgZmVhdHVyZSBmbGFncyAlbGx4XG4iLCBwYXlsb2FkLT5mbGFncyk7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBBUlJBWV9TSVpFKHBheWxvYWQtPnZhbCk7IGkgKz0gMiwgaiArPSA0KSB7CisJCXRtcCA9IChwYXlsb2FkLT52YWxbaV0gJiBSRUdfTUFTSygxMCkpIHwKKwkJCSgocGF5bG9hZC0+dmFsW2kgKyAxXSAmIFJFR19NQVNLKDEwKSkgPDwgMTYpOworCQlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCAodmx1dF9iYXNlICsgaiksIHRtcCk7CisJfQorCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIGN0cmxfb2ZmLCAxKTsKKwlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBzd2FwX29mZiwgMSk7CisKK2V4aXQ6CisJLyogdXBkYXRlIGZsdXNoIGJpdCAqLworCWlmIChjdGwgJiYgY3RsLT5vcHMuZ2V0X2JpdG1hc2tfZHNwcF9wYXZsdXQpIHsKKwkJY3RsLT5vcHMuZ2V0X2JpdG1hc2tfZHNwcF9wYXZsdXQoY3RsLCAmZmx1c2hfbWFzaywgY3R4LT5pZHgpOworCQlpZiAoY3RsLT5vcHMudXBkYXRlX3BlbmRpbmdfZmx1c2gpCisJCQljdGwtPm9wcy51cGRhdGVfcGVuZGluZ19mbHVzaChjdGwsIGZsdXNoX21hc2spOworCX0KK30KKwogdm9pZCBzZGVfc2V0dXBfZHNwcF9nY192MV83KHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpCiB7CiAJc3RydWN0IGRybV9tc21fcGdjX2x1dCAqcGF5bG9hZCA9IE5VTEw7CkBAIC01MDMsMyArNTY3LDY5IEBACiAJaSA9IEJJVCgwKSB8ICgocGF5bG9hZC0+ZmxhZ3MgJiBQR0NfOEJfUk9VTkQpID8gQklUKDEpIDogMCk7CiAJU0RFX1JFR19XUklURSgmY3R4LT5odywgY3R4LT5jYXAtPnNibGstPmdjLmJhc2UsIGkpOwogfQorCit2b2lkIHNkZV9zZXR1cF9kc3BwX2hpc3RfdjFfNyhzdHJ1Y3Qgc2RlX2h3X2RzcHAgKmN0eCwgdm9pZCAqY2ZnKQoreworCXUzMiBiYXNlLCBvZmZzZXQ7CisJdTMyIG9wX21vZGU7CisJYm9vbCBmZWF0dXJlX2VuYWJsZWQ7CisKKwlpZiAoIWN0eCB8fCAhY2ZnKSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBwYXJhbWV0ZXJzIGN0eCAlcEsgY2ZnICVwSyIsIGN0eCwgY2ZnKTsKKwkJcmV0dXJuOworCX0KKworCWZlYXR1cmVfZW5hYmxlZCA9ICooYm9vbCAqKWNmZzsKKwliYXNlID0gY3R4LT5jYXAtPnNibGstPmhpc3QuYmFzZTsKKwlvZmZzZXQgPSBiYXNlICsgUEFfSElTVF9DVFJMX0RTUFBfT0ZGOworCisJb3BfbW9kZSA9IFNERV9SRUdfUkVBRCgmY3R4LT5odywgYmFzZSk7CisJaWYgKCFmZWF0dXJlX2VuYWJsZWQpIHsKKwkJb3BfbW9kZSAmPSB+RFNQUF9PUF9QQV9ISVNUX0VOOworCQlpZiAoUEFfRFNQUF9ESVNBQkxFX1JFUVVJUkVEKG9wX21vZGUpKQorCQkJb3BfbW9kZSAmPSB+RFNQUF9PUF9QQV9FTjsKKwl9IGVsc2UgeworCQlvcF9tb2RlIHw9IERTUFBfT1BfUEFfSElTVF9FTiB8IERTUFBfT1BfUEFfRU47CisJfQorCisJU0RFX1JFR19XUklURSgmY3R4LT5odywgb2Zmc2V0LCAwKTsKKwlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBiYXNlLCBvcF9tb2RlKTsKK30KKwordm9pZCBzZGVfcmVhZF9kc3BwX2hpc3RfdjFfNyhzdHJ1Y3Qgc2RlX2h3X2RzcHAgKmN0eCwgdm9pZCAqY2ZnKQoreworCXN0cnVjdCBkcm1fbXNtX2hpc3QgKmhpc3RfZGF0YTsKKwl1MzIgb2Zmc2V0LCBvZmZzZXRfY3RsOworCXUzMiBpOworCisJaWYgKCFjdHggfHwgIWNmZykgeworCQlEUk1fRVJST1IoImludmFsaWQgcGFyYW1ldGVycyBjdHggJXBLIGNmZyAlcEsiLCBjdHgsIGNmZyk7CisJCXJldHVybjsKKwl9CisKKwloaXN0X2RhdGEgPSAoc3RydWN0IGRybV9tc21faGlzdCAqKWNmZzsKKwlvZmZzZXQgPSBjdHgtPmNhcC0+c2Jsay0+aGlzdC5iYXNlICsgUEFfSElTVF9EQVRBX0RTUFBfT0ZGOworCW9mZnNldF9jdGwgPSBjdHgtPmNhcC0+c2Jsay0+aGlzdC5iYXNlICsgUEFfSElTVF9DVFJMX0RTUFBfT0ZGOworCisJZm9yIChpID0gMDsgaSA8IEhJU1RfVl9TSVpFOyBpKyspCisJCWhpc3RfZGF0YS0+ZGF0YVtpXSA9IFNERV9SRUdfUkVBRCgmY3R4LT5odywgb2Zmc2V0ICsgaSAqIDQpICYKKwkJCQkJUkVHX01BU0soMjQpOworCisJLyogdW5sb2NrIGhpc3QgYnVmZmVyICovCisJU0RFX1JFR19XUklURSgmY3R4LT5odywgb2Zmc2V0X2N0bCwgMCk7Cit9CisKK3ZvaWQgc2RlX2xvY2tfZHNwcF9oaXN0X3YxXzcoc3RydWN0IHNkZV9od19kc3BwICpjdHgsIHZvaWQgKmNmZykKK3sKKwl1MzIgb2Zmc2V0X2N0bDsKKworCWlmICghY3R4KSB7CisJCURSTV9FUlJPUigiaW52YWxpZCBwYXJhbWV0ZXJzIGN0eCAlcEsiLCBjdHgpOworCQlyZXR1cm47CisJfQorCisJb2Zmc2V0X2N0bCA9IGN0eC0+Y2FwLT5zYmxrLT5oaXN0LmJhc2UgKyBQQV9ISVNUX0NUUkxfRFNQUF9PRkY7CisKKwkvKiBsb2NrIGhpc3QgYnVmZmVyICovCisJU0RFX1JFR19XUklURSgmY3R4LT5odywgb2Zmc2V0X2N0bCwgMSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY29sb3JfcHJvY2Vzc2luZ192MV83LmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY29sb3JfcHJvY2Vzc2luZ192MV83LmgKaW5kZXggMjVlNDQ2YjcuLjc0MDE4YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jb2xvcl9wcm9jZXNzaW5nX3YxXzcuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY29sb3JfcHJvY2Vzc2luZ192MV83LmgKQEAgLTc2LDEwICs3NiwzNiBAQAogdm9pZCBzZGVfc2V0dXBfZHNwcF9wYV92bHV0X3YxXzcoc3RydWN0IHNkZV9od19kc3BwICpjdHgsIHZvaWQgKmNmZyk7CiAKIC8qKgorICogc2RlX3NldHVwX2RzcHBfcGFfdmx1dF92MV84IC0gc2V0dXAgRFNQUCBQQSB2TFVUIGZlYXR1cmUgaW4gdjEuOCBoYXJkd2FyZQorICogQGN0eDogUG9pbnRlciB0byBEU1BQIGNvbnRleHQKKyAqIEBjZmc6IFBvaW50ZXIgdG8gdkxVVCBkYXRhCisgKi8KK3ZvaWQgc2RlX3NldHVwX2RzcHBfcGFfdmx1dF92MV84KHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpOworCisvKioKICAqIHNkZV9zZXR1cF9kc3BwX2djX3YxXzcgLSBzZXR1cCBEU1BQIGdjIGZlYXR1cmUgaW4gdjEuNyBoYXJkd2FyZQogICogQGN0eDogUG9pbnRlciB0byBEU1BQIGNvbnRleHQKICAqIEBjZmc6IFBvaW50ZXIgdG8gZ2MgZGF0YQogICovCiB2b2lkIHNkZV9zZXR1cF9kc3BwX2djX3YxXzcoc3RydWN0IHNkZV9od19kc3BwICpjdHgsIHZvaWQgKmNmZyk7CiAKKy8qKgorICogc2RlX3NldHVwX2RzcHBfaGlzdF92MV83IC0gc2V0dXAgRFNQUCBoaXN0b2dyYW0gZmVhdHVyZSBpbiB2MS43IGhhcmR3YXJlCisgKiBAY3R4OiBQb2ludGVyIHRvIERTUFAgY29udGV4dAorICogQGNmZzogUG9pbnRlciB0byBoaXN0b2dyYW0gY29udHJvbCBkYXRhCisgKi8KK3ZvaWQgc2RlX3NldHVwX2RzcHBfaGlzdF92MV83KHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpOworCisvKioKKyAqIHNkZV9yZWFkX2RzcHBfaGlzdF92MV83IC0gcmVhZCBEU1BQIGhpc3RvZ3JhbSBkYXRhIGluIHYxLjcgaGFyZHdhcmUKKyAqIEBjdHg6IFBvaW50ZXIgdG8gRFNQUCBjb250ZXh0CisgKiBAY2ZnOiBQb2ludGVyIHRvIGhpc3RvZ3JhbSBkYXRhCisgKi8KK3ZvaWQgc2RlX3JlYWRfZHNwcF9oaXN0X3YxXzcoc3RydWN0IHNkZV9od19kc3BwICpjdHgsIHZvaWQgKmNmZyk7CisKKy8qKgorICogc2RlX2xvY2tfZHNwcF9oaXN0X3YxXzcgLSBsb2NrIERTUFAgaGlzdG9ncmFtIGJ1ZmZlciBpbiB2MS43IGhhcmR3YXJlCisgKiBAY3R4OiBQb2ludGVyIHRvIERTUFAgY29udGV4dAorICovCit2b2lkIHNkZV9sb2NrX2RzcHBfaGlzdF92MV83KHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY3RsLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY3RsLmMKaW5kZXggNjA2ZmRlYi4uOTViN2E2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2N0bC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jdGwuYwpAQCAtMzksNyArMzksNyBAQAogI2RlZmluZSBDVExfRkxVU0hfTUFTS19ST1QgICAgICAgICAgICAgIEJJVCgyNykKICNkZWZpbmUgQ1RMX0ZMVVNIX01BU0tfQ1RMICAgICAgICAgICAgICBCSVQoMTcpCiAKLSNkZWZpbmUgU0RFX1JFR19SRVNFVF9USU1FT1VUX0NPVU5UICAgIDIwCisjZGVmaW5lIFNERV9SRUdfUkVTRVRfVElNRU9VVF9VUyAgICAgICAgMjAwMAogCiBzdGF0aWMgc3RydWN0IHNkZV9jdGxfY2ZnICpfY3RsX29mZnNldChlbnVtIHNkZV9jdGwgY3RsLAogCQlzdHJ1Y3Qgc2RlX21kc3NfY2ZnICptLApAQCAtODksNiArODksMTEgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNkZV9od19jdGxfdHJpZ2dlcl9yb3Rfc3RhcnQoc3RydWN0IHNkZV9od19jdGwgKmN0eCkKIHsKKwkvKiBST1QgZmx1c2ggYml0IGlzIGxhdGNoZWQgZHVyaW5nIFJPVCBzdGFydCwgc28gc2V0IGl0IGZpcnN0ICovCisJaWYgKENUTF9GTFVTSF9NQVNLX1JPVCAmIGN0eC0+cGVuZGluZ19mbHVzaF9tYXNrKSB7CisJCWN0eC0+cGVuZGluZ19mbHVzaF9tYXNrICY9IH5DVExfRkxVU0hfTUFTS19ST1Q7CisJCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIENUTF9GTFVTSCwgQ1RMX0ZMVVNIX01BU0tfUk9UKTsKKwl9CiAJU0RFX1JFR19XUklURSgmY3R4LT5odywgQ1RMX1JPVF9TVEFSVCwgQklUKDApKTsKIH0KIApAQCAtMTEzLDEwICsxMTgsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2RlX2h3X2N0bF90cmlnZ2VyX2ZsdXNoKHN0cnVjdCBzZGVfaHdfY3RsICpjdHgpCiB7Ci0Jc3RydWN0IHNkZV9od19yZWdfZG1hX29wcyAqb3BzID0gc2RlX3JlZ19kbWFfZ2V0X29wcygpOwotCi0JaWYgKG9wcyAmJiBvcHMtPmxhc3RfY29tbWFuZCkKLQkJb3BzLT5sYXN0X2NvbW1hbmQoY3R4LCBETUFfQ1RMX1FVRVVFMCk7CiAKIAlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBDVExfRkxVU0gsIGN0eC0+cGVuZGluZ19mbHVzaF9tYXNrKTsKIH0KQEAgLTIzOSw2ICsyNDAsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2RlX2h3X2N0bF9nZXRfYml0bWFza19kc3BwX3Bhdmx1dChzdHJ1Y3Qgc2RlX2h3X2N0bCAqY3R4LAorCQl1MzIgKmZsdXNoYml0cywgZW51bSBzZGVfZHNwcCBkc3BwKQoreworCXN3aXRjaCAoZHNwcCkgeworCWNhc2UgRFNQUF8wOgorCQkqZmx1c2hiaXRzIHw9IEJJVCgzKTsKKwkJYnJlYWs7CisJY2FzZSBEU1BQXzE6CisJCSpmbHVzaGJpdHMgfD0gQklUKDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHNkZV9od19jdGxfZ2V0X2JpdG1hc2tfaW50ZihzdHJ1Y3Qgc2RlX2h3X2N0bCAqY3R4LAogCQl1MzIgKmZsdXNoYml0cywgZW51bSBzZGVfaW50ZiBpbnRmKQogewpAQCAtMzAyLDE0ICszMTksMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBzZGVfaHdfY3RsX3BvbGxfcmVzZXRfc3RhdHVzKHN0cnVjdCBzZGVfaHdfY3RsICpjdHgsIHUzMiBjb3VudCkKK3N0YXRpYyB1MzIgc2RlX2h3X2N0bF9wb2xsX3Jlc2V0X3N0YXR1cyhzdHJ1Y3Qgc2RlX2h3X2N0bCAqY3R4LCB1MzIgdGltZW91dF91cykKIHsKIAlzdHJ1Y3Qgc2RlX2h3X2Jsa19yZWdfbWFwICpjID0gJmN0eC0+aHc7CisJa3RpbWVfdCB0aW1lb3V0OwogCXUzMiBzdGF0dXM7CiAKLQkvKiBwcm90ZWN0IHRvIGRvIGF0IGxlYXN0IG9uZSBpdGVyYXRpb24gKi8KLQlpZiAoIWNvdW50KQotCQljb3VudCA9IDE7CisJdGltZW91dCA9IGt0aW1lX2FkZF91cyhrdGltZV9nZXQoKSwgdGltZW91dF91cyk7CiAKIAkvKgogCSAqIGl0IHRha2VzIGFyb3VuZCAzMHVzIHRvIGhhdmUgbWRwIGZpbmlzaCByZXNldHRpbmcgaXRzIGN0bCBwYXRoCkBAIC0zMTcsMTAgKzMzMywxMCBAQAogCSAqLwogCWRvIHsKIAkJc3RhdHVzID0gU0RFX1JFR19SRUFEKGMsIENUTF9TV19SRVNFVCk7Ci0JCXN0YXR1cyAmPSAweDAxOworCQlzdGF0dXMgJj0gMHgxOwogCQlpZiAoc3RhdHVzKQogCQkJdXNsZWVwX3JhbmdlKDIwLCA1MCk7Ci0JfSB3aGlsZSAoc3RhdHVzICYmIC0tY291bnQgPiAwKTsKKwl9IHdoaWxlIChzdGF0dXMgJiYga3RpbWVfY29tcGFyZV9zYWZlKGt0aW1lX2dldCgpLCB0aW1lb3V0KSA8IDApOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTMzMSw3ICszNDcsNyBAQAogCiAJcHJfZGVidWcoImlzc3VpbmcgaHcgY3RsIHJlc2V0IGZvciBjdGw6JWRcbiIsIGN0eC0+aWR4KTsKIAlTREVfUkVHX1dSSVRFKGMsIENUTF9TV19SRVNFVCwgMHgxKTsKLQlpZiAoc2RlX2h3X2N0bF9wb2xsX3Jlc2V0X3N0YXR1cyhjdHgsIFNERV9SRUdfUkVTRVRfVElNRU9VVF9DT1VOVCkpCisJaWYgKHNkZV9od19jdGxfcG9sbF9yZXNldF9zdGF0dXMoY3R4LCBTREVfUkVHX1JFU0VUX1RJTUVPVVRfVVMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpAQCAtMzQ4LDcgKzM2NCw3IEBACiAJCXJldHVybiAwOwogCiAJcHJfZGVidWcoImh3IGN0bCByZXNldCBpcyBzZXQgZm9yIGN0bDolZFxuIiwgY3R4LT5pZHgpOwotCWlmIChzZGVfaHdfY3RsX3BvbGxfcmVzZXRfc3RhdHVzKGN0eCwgU0RFX1JFR19SRVNFVF9USU1FT1VUX0NPVU5UKSkgeworCWlmIChzZGVfaHdfY3RsX3BvbGxfcmVzZXRfc3RhdHVzKGN0eCwgU0RFX1JFR19SRVNFVF9USU1FT1VUX1VTKSkgewogCQlwcl9lcnIoImh3IHJlY292ZXJ5IGlzIG5vdCBjb21wbGV0ZSBmb3IgY3RsOiVkXG4iLCBjdHgtPmlkeCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTU0Nyw2ICs1NjMsMTQgQEAKIAlTREVfUkVHX1dSSVRFKGMsIENUTF9ST1RfVE9QLCB2YWwpOwogfQogCitzdGF0aWMgdm9pZCBzZGVfaHdfcmVnX2RtYV9mbHVzaChzdHJ1Y3Qgc2RlX2h3X2N0bCAqY3R4KQoreworCXN0cnVjdCBzZGVfaHdfcmVnX2RtYV9vcHMgKm9wcyA9IHNkZV9yZWdfZG1hX2dldF9vcHMoKTsKKworCWlmIChvcHMgJiYgb3BzLT5sYXN0X2NvbW1hbmQpCisJCW9wcy0+bGFzdF9jb21tYW5kKGN0eCwgRE1BX0NUTF9RVUVVRTApOworfQorCiBzdGF0aWMgdm9pZCBfc2V0dXBfY3RsX29wcyhzdHJ1Y3Qgc2RlX2h3X2N0bF9vcHMgKm9wcywKIAkJdW5zaWduZWQgbG9uZyBjYXApCiB7CkBAIC01NjUsOSArNTg5LDEyIEBACiAJb3BzLT5nZXRfYml0bWFza19zc3BwID0gc2RlX2h3X2N0bF9nZXRfYml0bWFza19zc3BwOwogCW9wcy0+Z2V0X2JpdG1hc2tfbWl4ZXIgPSBzZGVfaHdfY3RsX2dldF9iaXRtYXNrX21peGVyOwogCW9wcy0+Z2V0X2JpdG1hc2tfZHNwcCA9IHNkZV9od19jdGxfZ2V0X2JpdG1hc2tfZHNwcDsKKwlvcHMtPmdldF9iaXRtYXNrX2RzcHBfcGF2bHV0ID0gc2RlX2h3X2N0bF9nZXRfYml0bWFza19kc3BwX3Bhdmx1dDsKIAlvcHMtPmdldF9iaXRtYXNrX2ludGYgPSBzZGVfaHdfY3RsX2dldF9iaXRtYXNrX2ludGY7CiAJb3BzLT5nZXRfYml0bWFza19jZG0gPSBzZGVfaHdfY3RsX2dldF9iaXRtYXNrX2NkbTsKIAlvcHMtPmdldF9iaXRtYXNrX3diID0gc2RlX2h3X2N0bF9nZXRfYml0bWFza193YjsKKwlvcHMtPnJlZ19kbWFfZmx1c2ggPSBzZGVfaHdfcmVnX2RtYV9mbHVzaDsKKwogCWlmIChjYXAgJiBCSVQoU0RFX0NUTF9TQlVGKSkgewogCQlvcHMtPmdldF9iaXRtYXNrX3JvdCA9IHNkZV9od19jdGxfZ2V0X2JpdG1hc2tfcm90OwogCQlvcHMtPnNldHVwX3NidWZfY2ZnID0gc2RlX2h3X2N0bF9zZXR1cF9zYnVmX2NmZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jdGwuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19jdGwuaAppbmRleCBhMTExOTE2Li45N2JjMWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfY3RsLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2N0bC5oCkBAIC0xNzMsNiArMTczLDEwIEBACiAJCXUzMiAqZmx1c2hiaXRzLAogCQllbnVtIHNkZV9kc3BwIGJsayk7CiAKKwlpbnQgKCpnZXRfYml0bWFza19kc3BwX3Bhdmx1dCkoc3RydWN0IHNkZV9od19jdGwgKmN0eCwKKwkJdTMyICpmbHVzaGJpdHMsCisJCWVudW0gc2RlX2RzcHAgYmxrKTsKKwogCWludCAoKmdldF9iaXRtYXNrX2ludGYpKHN0cnVjdCBzZGVfaHdfY3RsICpjdHgsCiAJCXUzMiAqZmx1c2hiaXRzLAogCQllbnVtIHNkZV9pbnRmIGJsayk7CkBAIC0yMDYsNiArMjEwLDEzIEBACiAKIAl2b2lkICgqc2V0dXBfc2J1Zl9jZmcpKHN0cnVjdCBzZGVfaHdfY3RsICpjdHgsCiAJCXN0cnVjdCBzZGVfY3RsX3NidWZfY2ZnICpjZmcpOworCisJLyoqCisJICogRmx1c2ggdGhlIHJlZyBkbWEgYnkgc2VuZGluZyBsYXN0IGNvbW1hbmQuCisJICogQGN0eCAgICAgICA6IGN0bCBwYXRoIGN0eCBwb2ludGVyCisJICovCisJdm9pZCAoKnJlZ19kbWFfZmx1c2gpKHN0cnVjdCBzZGVfaHdfY3RsICpjdHgpOworCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kcy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3YTdkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kcy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgInNkZV9od19kcy5oIgorI2luY2x1ZGUgInNkZV9mb3JtYXRzLmgiCisjaW5jbHVkZSAic2RlX2RiZy5oIgorI2luY2x1ZGUgInNkZV9rbXMuaCIKKworLyogRGVzdGluYXRpb24gc2NhbGVyIFRPUCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgREVTVF9TQ0FMRVJfT1BfTU9ERSAgICAgMHgwMAorI2RlZmluZSBERVNUX1NDQUxFUl9IV19WRVJTSU9OICAweDEwCisKK3N0YXRpYyB2b2lkIHNkZV9od19kc19zZXR1cF9vcG1vZGUoc3RydWN0IHNkZV9od19kcyAqaHdfZHMsCisJCQkJdTMyIG9wX21vZGUpCit7CisJc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqaHcgPSAmaHdfZHMtPmh3OworCisJU0RFX1JFR19XUklURShodywgREVTVF9TQ0FMRVJfT1BfTU9ERSwgb3BfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNkZV9od19kc19zZXR1cF9zY2FsZXIzKHN0cnVjdCBzZGVfaHdfZHMgKmh3X2RzLAorCQkJdm9pZCAqc2NhbGVyX2NmZywgdm9pZCAqc2NhbGVyX2x1dF9jZmcpCit7CisJc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyAqc2NsM19jZmcgPSBzY2FsZXJfY2ZnOworCXN0cnVjdCBzZGVfaHdfc2NhbGVyM19sdXRfY2ZnICpzY2wzX2x1dF9jZmcgPSBzY2FsZXJfbHV0X2NmZzsKKworCWlmICghaHdfZHMgfHwgIWh3X2RzLT5zY2wgfHwgIXNjbDNfY2ZnIHx8ICFzY2wzX2x1dF9jZmcpCisJCXJldHVybjsKKworCS8qCisJICogY29weSBMVVQgdmFsdWVzIHRvIHNjYWxlciBzdHJ1Y3R1cmUKKwkgKi8KKwlpZiAoc2NsM19sdXRfY2ZnLT5pc19jb25maWd1cmVkKSB7CisJCXNjbDNfY2ZnLT5kaXJfbHV0ID0gc2NsM19sdXRfY2ZnLT5kaXJfbHV0OworCQlzY2wzX2NmZy0+ZGlyX2xlbiA9IHNjbDNfbHV0X2NmZy0+ZGlyX2xlbjsKKwkJc2NsM19jZmctPmNpcl9sdXQgPSBzY2wzX2x1dF9jZmctPmNpcl9sdXQ7CisJCXNjbDNfY2ZnLT5jaXJfbGVuID0gc2NsM19sdXRfY2ZnLT5jaXJfbGVuOworCQlzY2wzX2NmZy0+c2VwX2x1dCA9IHNjbDNfbHV0X2NmZy0+c2VwX2x1dDsKKwkJc2NsM19jZmctPnNlcF9sZW4gPSBzY2wzX2x1dF9jZmctPnNlcF9sZW47CisJfQorCisJc2RlX2h3X3NldHVwX3NjYWxlcjMoJmh3X2RzLT5odywgc2NsM19jZmcsCisJCQkgaHdfZHMtPnNjbC0+YmFzZSwKKwkJCSBod19kcy0+c2NsLT52ZXJzaW9uLAorCQkJIHNkZV9nZXRfc2RlX2Zvcm1hdChEUk1fRk9STUFUX1hCR1IyMTAxMDEwKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXR1cF9kc19vcHMoc3RydWN0IHNkZV9od19kc19vcHMgKm9wcywgdW5zaWduZWQgbG9uZyBmZWF0dXJlcykKK3sKKwlvcHMtPnNldHVwX29wbW9kZSA9IHNkZV9od19kc19zZXR1cF9vcG1vZGU7CisKKwlpZiAodGVzdF9iaXQoU0RFX1NTUFBfU0NBTEVSX1FTRUVEMywgJmZlYXR1cmVzKSkKKwkJb3BzLT5zZXR1cF9zY2FsZXIgPSBzZGVfaHdfZHNfc2V0dXBfc2NhbGVyMzsKK30KKworc3RhdGljIHN0cnVjdCBzZGVfZHNfY2ZnICpfZHNfb2Zmc2V0KGVudW0gc2RlX2RzIGRzLAorCQlzdHJ1Y3Qgc2RlX21kc3NfY2ZnICptLAorCQl2b2lkIF9faW9tZW0gKmFkZHIsCisJCXN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmIpCit7CisJaW50IGk7CisKKwlpZiAoIW0gfHwgIWFkZHIgfHwgIWIpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJZm9yIChpID0gMDsgaSA8IG0tPmRzX2NvdW50OyBpKyspIHsKKwkJaWYgKChkcyA9PSBtLT5kc1tpXS5pZCkgJiYKKwkJCSAobS0+ZHNbaV0udG9wKSkgeworCQkJYi0+YmFzZV9vZmYgPSBhZGRyOworCQkJYi0+YmxrX29mZiA9IG0tPmRzW2ldLnRvcC0+YmFzZTsKKwkJCWItPmxlbmd0aCA9IG0tPmRzW2ldLnRvcC0+bGVuOworCQkJYi0+aHd2ZXJzaW9uID0gbS0+aHd2ZXJzaW9uOworCQkJYi0+bG9nX21hc2sgPSBTREVfREJHX01BU0tfRFM7CisJCQlyZXR1cm4gJm0tPmRzW2ldOworCQl9CisJfQorCisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2RlX2h3X2Jsa19vcHMgc2RlX2h3X29wcyA9IHsKKwkuc3RhcnQgPSBOVUxMLAorCS5zdG9wID0gTlVMTCwKK307CisKK3N0cnVjdCBzZGVfaHdfZHMgKnNkZV9od19kc19pbml0KGVudW0gc2RlX2RzIGlkeCwKKwkJCXZvaWQgX19pb21lbSAqYWRkciwKKwkJCXN0cnVjdCBzZGVfbWRzc19jZmcgKm0pCit7CisJc3RydWN0IHNkZV9od19kcyAqaHdfZHM7CisJc3RydWN0IHNkZV9kc19jZmcgKmNmZzsKKwlpbnQgcmM7CisKKwlpZiAoIWFkZHIgfHwgIW0pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJaHdfZHMgPSBremFsbG9jKHNpemVvZigqaHdfZHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh3X2RzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWNmZyA9IF9kc19vZmZzZXQoaWR4LCBtLCBhZGRyLCAmaHdfZHMtPmh3KTsKKwlpZiAoSVNfRVJSX09SX05VTEwoY2ZnKSkgeworCQlTREVfRVJST1IoImZhaWxlZCB0byBnZXQgZHMgY2ZnXG4iKTsKKwkJa2ZyZWUoaHdfZHMpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwkvKiBBc3NpZ24gb3BzICovCisJaHdfZHMtPmlkeCA9IGlkeDsKKwlod19kcy0+c2NsID0gY2ZnOworCV9zZXR1cF9kc19vcHMoJmh3X2RzLT5vcHMsIGh3X2RzLT5zY2wtPmZlYXR1cmVzKTsKKworCXJjID0gc2RlX2h3X2Jsa19pbml0KCZod19kcy0+YmFzZSwgU0RFX0hXX0JMS19EUywgaWR4LCAmc2RlX2h3X29wcyk7CisJaWYgKHJjKSB7CisJCVNERV9FUlJPUigiZmFpbGVkIHRvIGluaXQgaHcgYmxrICVkXG4iLCByYyk7CisJCWdvdG8gYmxrX2luaXRfZXJyb3I7CisJfQorCisJaWYgKGNmZy0+bGVuKSB7CisJCXNkZV9kYmdfcmVnX3JlZ2lzdGVyX2R1bXBfcmFuZ2UoU0RFX0RCR19OQU1FLCBjZmctPm5hbWUsCisJCQkJaHdfZHMtPmh3LmJsa19vZmYgKyBjZmctPmJhc2UsCisJCQkJaHdfZHMtPmh3LmJsa19vZmYgKyBjZmctPmJhc2UgKyBjZmctPmxlbiwKKwkJCQlod19kcy0+aHcueGluX2lkKTsKKwl9CisKKwlyZXR1cm4gaHdfZHM7CisKK2Jsa19pbml0X2Vycm9yOgorCWt6ZnJlZShod19kcyk7CisKKwlyZXR1cm4gRVJSX1BUUihyYyk7CisKK30KKwordm9pZCBzZGVfaHdfZHNfZGVzdHJveShzdHJ1Y3Qgc2RlX2h3X2RzICpod19kcykKK3sKKwlpZiAoaHdfZHMpCisJCXNkZV9od19ibGtfZGVzdHJveSgmaHdfZHMtPmJhc2UpOworCWtmcmVlKGh3X2RzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kcy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxY2ZhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kcy5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfU0RFX0hXX0RTX0gKKyNkZWZpbmUgX1NERV9IV19EU19ICisKKyNpbmNsdWRlICJzZGVfaHdfbWRzcy5oIgorI2luY2x1ZGUgInNkZV9od191dGlsLmgiCisjaW5jbHVkZSAic2RlX2h3X2NhdGFsb2cuaCIKKyNpbmNsdWRlICJzZGVfaHdfYmxrLmgiCisKK3N0cnVjdCBzZGVfaHdfZHM7CisKKy8qIERlc3RpbmF0aW9uIFNjYWxlciBEVUFMIG1vZGUgb3ZlcmZldGNoIHBpeGVsIGNvdW50ICovCisjZGVmaW5lIFNERV9EU19PVkVSRkVUQ0hfU0laRSA1CisKKy8qIERlc3RpbmF0aW9uIHNjYWxlciBEVUFMIG1vZGUgb3BlcmF0aW9uIGJpdCAqLworI2RlZmluZSBTREVfRFNfT1BfTU9ERV9EVUFMIEJJVCgxNikKKworLyogc3RydWN0IHNkZV9od19kc19jZmcgLSBkZXN0aW5hdGlvbiBzY2FsZXIgY29uZmlnCisgKiBAbmR4ICAgICAgICAgIDogRFMgc2VsZWN0aW9uIGluZGV4CisgKiBAZmxhZ3MgICAgICAgIDogRmxhZyB0byBzd2l0Y2ggYmV0d2VlbiBtb2RlIGZvciBEUworICogQGxtX3dpZHRoICAgICA6IExheWVyIG1peGVyIHdpZHRoIGNvbmZpZ3VyYXRpb24KKyAqIEBsbV9oZWlnaCAgICAgOiBMYXllciBtaXhlciBoZWlnaHQgY29uZmlndXJhdGlvbgorICogQHNldF9sbV9mbHVzaCA6IExNIGZsdXNoIGJpdAorICogQHNjbDNfY2ZnICAgICA6IFBvaW50ZXIgdG8gc2RlX2h3X3NjYWxlcjNfY2ZnLgorICovCitzdHJ1Y3Qgc2RlX2h3X2RzX2NmZyB7CisJdTMyIG5keDsKKwlpbnQgZmxhZ3M7CisJdTMyIGxtX3dpZHRoOworCXUzMiBsbV9oZWlnaHQ7CisJYm9vbCBzZXRfbG1fZmx1c2g7CisJc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyAqc2NsM19jZmc7Cit9OworCisvKioKKyAqIHN0cnVjdCBzZGVfaHdfZHNfb3BzIC0gaW50ZXJmYWNlIHRvIHRoZSBkZXN0aW5hdGlvbiBzY2FsZXIKKyAqIGhhcmR3YXJlIGRyaXZlciBmdW5jdGlvbnMKKyAqIENhbGxlciBtdXN0IGNhbGwgdGhlIGluaXQgZnVuY3Rpb24gdG8gZ2V0IHRoZSBkcyBjb250ZXh0IGZvciBlYWNoIGRzCisgKiBBc3N1bXB0aW9uIGlzIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBhZnRlciBjbG9ja3MgYXJlIGVuYWJsZWQKKyAqLworc3RydWN0IHNkZV9od19kc19vcHMgeworCS8qKgorCSAqIHNldHVwX29wbW9kZSAtIGRlc3RpbmF0aW9uIHNjYWxlciBvcCBtb2RlIHNldHVwCisJICogQGh3X2RzICAgOiBQb2ludGVyIHRvIGRzIGNvbnRleHQKKwkgKiBAb3BfbW9kZSA6IE9wIG1vZGUgY29uZmlndXJhdGlvbgorCSAqLworCXZvaWQgKCpzZXR1cF9vcG1vZGUpKHN0cnVjdCBzZGVfaHdfZHMgKmh3X2RzLAorCQkJCXUzMiBvcF9tb2RlKTsKKworCS8qKgorCSAqIHNldHVwX3NjYWxlciAtIGRlc3RpbmF0aW9uIHNjYWxlciBibG9jayBzZXR1cAorCSAqIEBod19kcyAgICAgICAgICA6IFBvaW50ZXIgdG8gZHMgY29udGV4dAorCSAqIEBzY2FsZXJfY2ZnICAgICA6IFBvaW50ZXIgdG8gc2NhbGVyIGRhdGEKKwkgKiBAc2NhbGVyX2x1dF9jZmcgOiBQb2ludGVyIHRvIHNjYWxlciBsdXQKKwkgKi8KKwl2b2lkICgqc2V0dXBfc2NhbGVyKShzdHJ1Y3Qgc2RlX2h3X2RzICpod19kcywKKwkJCQl2b2lkICpzY2FsZXJfY2ZnLAorCQkJCXZvaWQgKnNjYWxlcl9sdXRfY2ZnKTsKKworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2RlX2h3X2RzIC0gZGVzdGluYXRpb24gc2NhbGVyIGRlc2NyaXB0aW9uCisgKiBAYmFzZSA6IEhhcmR3YXJlIGJsb2NrIGJhc2Ugc3RydWN0dXJlCisgKiBAaHcgICA6IEJsb2NrIGhhcmR3YXJlIGRldGFpbHMKKyAqIEBpZHggIDogRGVzdGluYXRpb24gc2NhbGVyIGluZGV4CisgKiBAc2NsICA6IFBvaW50ZXIgdG8KKyAqICAgICAgICAgIC0gc2NhbGVyIG9mZnNldCByZWxhdGl2ZSB0byB0b3Agb2Zmc2V0CisgKiAgICAgICAgICAtIGNhcGFiaWxpdGllcworICogQG9wcyAgOiBQb2ludGVyIHRvIG9wZXJhdGlvbnMgZm9yIHRoaXMgRFMKKyAqLworc3RydWN0IHNkZV9od19kcyB7CisJc3RydWN0IHNkZV9od19ibGsgYmFzZTsKKwlzdHJ1Y3Qgc2RlX2h3X2Jsa19yZWdfbWFwIGh3OworCWVudW0gc2RlX2RzIGlkeDsKKwljb25zdCBzdHJ1Y3Qgc2RlX2RzX2NmZyAqc2NsOworCXN0cnVjdCBzZGVfaHdfZHNfb3BzIG9wczsKK307CisKKy8qKgorICogc2RlX2h3X2RzX2luaXQgLSBpbml0aWFsaXplcyB0aGUgZGVzdGluYXRpb24gc2NhbGVyCisgKiBodyBkcml2ZXIgb2JqZWN0IGFuZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYmVmb3JlCisgKiBhY2Nlc3NpbmcgZXZlcnkgZGVzdGluYXRpb24gc2NhbGVyCisgKiBAaWR4IDogRFMgaW5kZXggZm9yIHdoaWNoIGRyaXZlciBvYmplY3QgaXMgcmVxdWlyZWQKKyAqIEBhZGRyOiBNYXBwZWQgcmVnaXN0ZXIgaW8gYWRkcmVzcyBvZiBNRFAKKyAqIEBtICAgOiBNRFNTIGNhdGFsb2cgaW5mb3JtYXRpb24KKyAqIEBSZXR1cm46IHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIEVSUl9QVFIKKyAqLworc3RydWN0IHNkZV9od19kcyAqc2RlX2h3X2RzX2luaXQoZW51bSBzZGVfZHMgaWR4LAorCQkJdm9pZCBfX2lvbWVtICphZGRyLAorCQkJc3RydWN0IHNkZV9tZHNzX2NmZyAqbSk7CisKKy8qKgorICogc2RlX2h3X2RzX2Rlc3Ryb3kgLSBkZXN0cm95cyBkZXN0aW5hdGlvbiBzY2FsZXIKKyAqIGRyaXZlciBjb250ZXh0CisgKiBAaHdfZHM6ICAgUG9pbnRlciB0byBEUyBjb250ZXh0CisgKi8KK3ZvaWQgc2RlX2h3X2RzX2Rlc3Ryb3koc3RydWN0IHNkZV9od19kcyAqaHdfZHMpOworCisjZW5kaWYgLypfU0RFX0hXX0RTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kc3BwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfZHNwcC5jCmluZGV4IDViM2Y1MWUuLjM2ZTMwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kc3BwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2RzcHAuYwpAQCAtODIsOSArODIsMjMgQEAKIAkJCX0gZWxzZSBpZiAoYy0+Y2FwLT5zYmxrLT52bHV0LnZlcnNpb24gPT0KIAkJCQkJKFNERV9DT0xPUl9QUk9DRVNTX1ZFUigweDEsIDB4OCkpKSB7CiAJCQkJcmV0ID0gcmVnX2RtYXYxX2luaXRfZHNwcF9vcF92NChpLCBjLT5pZHgpOwotCQkJCWlmIChyZXQpCisJCQkJaWYgKCFyZXQpCiAJCQkJCWMtPm9wcy5zZXR1cF92bHV0ID0KIAkJCQkJcmVnX2RtYXYxX3NldHVwX2RzcHBfdmx1dHYxODsKKwkJCQllbHNlCisJCQkJCWMtPm9wcy5zZXR1cF92bHV0ID0KKwkJCQkJc2RlX3NldHVwX2RzcHBfcGFfdmx1dF92MV84OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU0RFX0RTUFBfSElTVDoKKwkJCWlmIChjLT5jYXAtPnNibGstPmhpc3QudmVyc2lvbiA9PQorCQkJCShTREVfQ09MT1JfUFJPQ0VTU19WRVIoMHgxLCAweDcpKSkgeworCQkJCWMtPm9wcy5zZXR1cF9oaXN0b2dyYW0gPQorCQkJCSAgICBzZGVfc2V0dXBfZHNwcF9oaXN0X3YxXzc7CisJCQkJYy0+b3BzLnJlYWRfaGlzdG9ncmFtID0KKwkJCQkgICAgc2RlX3JlYWRfZHNwcF9oaXN0X3YxXzc7CisJCQkJYy0+b3BzLmxvY2tfaGlzdG9ncmFtID0KKwkJCQkgICAgc2RlX2xvY2tfZHNwcF9oaXN0X3YxXzc7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBTREVfRFNQUF9HQU1VVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kc3BwLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfZHNwcC5oCmluZGV4IDQ0YjM4MzEuLjQ4NzhmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19kc3BwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2RzcHAuaApAQCAtMzgsNiArMzgsMTMgQEAKIAl2b2lkICgqcmVhZF9oaXN0b2dyYW0pKHN0cnVjdCBzZGVfaHdfZHNwcCAqY3R4LCB2b2lkICpjZmcpOwogCiAJLyoqCisJICogbG9ja19oaXN0b2dyYW0gLSBsb2NrIGRzcHAgaGlzdG9ncmFtIGJ1ZmZlcgorCSAqIEBjdHg6IFBvaW50ZXIgdG8gZHNwcCBjb250ZXh0CisJICogQGNmZzogUG9pbnRlciB0byBjb25maWd1cmF0aW9uCisJICovCisJdm9pZCAoKmxvY2tfaGlzdG9ncmFtKShzdHJ1Y3Qgc2RlX2h3X2RzcHAgKmN0eCwgdm9pZCAqY2ZnKTsKKworCS8qKgogCSAqIHNldHVwX2lnYyAtIHVwZGF0ZSBkc3BwIGlnYwogCSAqIEBjdHg6IFBvaW50ZXIgdG8gZHNwcCBjb250ZXh0CiAJICogQGNmZzogUG9pbnRlciB0byBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfaW50Zi5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2ludGYuYwppbmRleCAzNWYxODAwLi5mZDA2YzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfaW50Zi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19pbnRmLmMKQEAgLTI4OSw2ICsyODksMTggQEAKIAlyZXR1cm4gU0RFX1JFR19SRUFEKGMsIElOVEZfTUlTUl9TSUdOQVRVUkUpOwogfQogCitzdGF0aWMgdTMyIHNkZV9od19pbnRmX2dldF9saW5lX2NvdW50KHN0cnVjdCBzZGVfaHdfaW50ZiAqaW50ZikKK3sKKwlzdHJ1Y3Qgc2RlX2h3X2Jsa19yZWdfbWFwICpjOworCisJaWYgKCFpbnRmKQorCQlyZXR1cm4gMDsKKworCWMgPSAmaW50Zi0+aHc7CisKKwlyZXR1cm4gU0RFX1JFR19SRUFEKGMsIElOVEZfTElORV9DT1VOVCk7Cit9CisKIHN0YXRpYyB2b2lkIF9zZXR1cF9pbnRmX29wcyhzdHJ1Y3Qgc2RlX2h3X2ludGZfb3BzICpvcHMsCiAJCXVuc2lnbmVkIGxvbmcgY2FwKQogewpAQCAtMjk4LDYgKzMxMCw3IEBACiAJb3BzLT5lbmFibGVfdGltaW5nID0gc2RlX2h3X2ludGZfZW5hYmxlX3RpbWluZ19lbmdpbmU7CiAJb3BzLT5zZXR1cF9taXNyID0gc2RlX2h3X2ludGZfc2V0dXBfbWlzcjsKIAlvcHMtPmNvbGxlY3RfbWlzciA9IHNkZV9od19pbnRmX2NvbGxlY3RfbWlzcjsKKwlvcHMtPmdldF9saW5lX2NvdW50ID0gc2RlX2h3X2ludGZfZ2V0X2xpbmVfY291bnQ7CiAJaWYgKGNhcCAmIEJJVChTREVfSU5URl9ST1RfU1RBUlQpKQogCQlvcHMtPnNldHVwX3JvdF9zdGFydCA9IHNkZV9od19pbnRmX3NldHVwX3JvdF9zdGFydDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19pbnRmLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfaW50Zi5oCmluZGV4IDgzZTIwNmQuLjg5MDY4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19pbnRmLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2ludGYuaApAQCAtNjIsNiArNjIsNyBAQAogICogQCBnZXRfc3RhdHVzOiByZXR1cm5zIGlmIHRpbWluZyBlbmdpbmUgaXMgZW5hYmxlZCBvciBub3QKICAqIEAgc2V0dXBfbWlzcjogZW5hYmxlcy9kaXNhYmxlcyBNSVNSIGluIEhXIHJlZ2lzdGVyCiAgKiBAIGNvbGxlY3RfbWlzcjogcmVhZHMgYW5kIHN0b3JlcyBNSVNSIGRhdGEgZnJvbSBIVyByZWdpc3RlcgorICogQCBnZXRfbGluZV9jb3VudDogcmVhZHMgY3VycmVudCB2ZXJ0aWNhbCBsaW5lIGNvdW50ZXIKICAqLwogc3RydWN0IHNkZV9od19pbnRmX29wcyB7CiAJdm9pZCAoKnNldHVwX3RpbWluZ19nZW4pKHN0cnVjdCBzZGVfaHdfaW50ZiAqaW50ZiwKQEAgLTg0LDYgKzg1LDggQEAKIAkJCWJvb2wgZW5hYmxlLCB1MzIgZnJhbWVfY291bnQpOwogCiAJdTMyICgqY29sbGVjdF9taXNyKShzdHJ1Y3Qgc2RlX2h3X2ludGYgKmludGYpOworCisJdTMyICgqZ2V0X2xpbmVfY291bnQpKHN0cnVjdCBzZGVfaHdfaW50ZiAqaW50Zik7CiB9OwogCiBzdHJ1Y3Qgc2RlX2h3X2ludGYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X2xtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfbG0uYwppbmRleCAzZDI4MmVlLi40ZTY3N2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfbG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfbG0uYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgZmVhdHVyZXMpCiB7CiAJb3BzLT5zZXR1cF9taXhlcl9vdXQgPSBzZGVfaHdfbG1fc2V0dXBfb3V0OwotCWlmIChJU19TRE04NDVfVEFSR0VUKG0tPmh3dmVyc2lvbikpCisJaWYgKElTX1NETTg0NV9UQVJHRVQobS0+aHd2ZXJzaW9uKSB8fCBJU19TRE02NzBfVEFSR0VUKG0tPmh3dmVyc2lvbikpCiAJCW9wcy0+c2V0dXBfYmxlbmRfY29uZmlnID0gc2RlX2h3X2xtX3NldHVwX2JsZW5kX2NvbmZpZ19zZG04NDU7CiAJZWxzZQogCQlvcHMtPnNldHVwX2JsZW5kX2NvbmZpZyA9IHNkZV9od19sbV9zZXR1cF9ibGVuZF9jb25maWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfbWRzcy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X21kc3MuaAppbmRleCBmMDdmNWVkLi45NTJlZThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfbWRzcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19tZHNzLmgKQEAgLTEwMCw2ICsxMDAsNyBAQAogCVNERV9IV19CTEtfU1NQUCwKIAlTREVfSFdfQkxLX0xNLAogCVNERV9IV19CTEtfRFNQUCwKKwlTREVfSFdfQkxLX0RTLAogCVNERV9IV19CTEtfQ1RMLAogCVNERV9IV19CTEtfQ0RNLAogCVNERV9IV19CTEtfUElOR1BPTkcsCkBAIC0xNzYsNiArMTc3LDEzIEBACiAJRFNQUF9NQVgKIH07CiAKK2VudW0gc2RlX2RzIHsKKwlEU19UT1AsCisJRFNfMCwKKwlEU18xLAorCURTX01BWAorfTsKKwogZW51bSBzZGVfY3RsIHsKIAlDVExfMCA9IDEsCiAJQ1RMXzEsCkBAIC00ODksNiArNDk3LDcgQEAKICNkZWZpbmUgU0RFX0RCR19NQVNLX1ZCSUYgICAgICgxIDw8IDEwKQogI2RlZmluZSBTREVfREJHX01BU0tfRFNDICAgICAgKDEgPDwgMTEpCiAjZGVmaW5lIFNERV9EQkdfTUFTS19ST1QgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgU0RFX0RCR19NQVNLX0RTICAgICAgICgxIDw8IDEzKQogCiAvKioKICAqIHN0cnVjdCBzZGVfaHdfY3BfY2ZnOiBoYXJkd2FyZSBkc3BwL2xtIGZlYXR1cmUgcGF5bG9hZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19waW5ncG9uZy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmMKaW5kZXggZmY3OTZmNy4uZDhmNzlmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmMKQEAgLTE2NSwxMSArMTY1LDE2IEBACiBzdGF0aWMgdm9pZCBzZGVfaHdfcHBfZHNjX2Rpc2FibGUoc3RydWN0IHNkZV9od19waW5ncG9uZyAqcHApCiB7CiAJc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqYzsKKwl1MzIgZGF0YTsKIAogCWlmICghcHApCiAJCXJldHVybjsKIAljID0gJnBwLT5odzsKIAorCWRhdGEgPSBTREVfUkVHX1JFQUQoYywgUFBfRENFX0RBVEFfT1VUX1NXQVApOworCWRhdGEgJj0gfkJJVCgxOCk7IC8qIGRpc2FibGUgZW5kaWFuIGZsaXAgKi8KKwlTREVfUkVHX1dSSVRFKGMsIFBQX0RDRV9EQVRBX09VVF9TV0FQLCBkYXRhKTsKKwogCVNERV9SRUdfV1JJVEUoYywgUFBfRFNDX01PREUsIDApOwogfQogCkBAIC0yOTcsNiArMzAyLDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1MzIgc2RlX2h3X3BwX2dldF9saW5lX2NvdW50KHN0cnVjdCBzZGVfaHdfcGluZ3BvbmcgKnBwKQoreworCXN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmMgPSAmcHAtPmh3OworCXUzMiBoZWlnaHQsIGluaXQ7CisJdTMyIGxpbmUgPSAweEZGRkY7CisKKwlpZiAoIXBwKQorCQlyZXR1cm4gMDsKKwljID0gJnBwLT5odzsKKworCWluaXQgPSBTREVfUkVHX1JFQUQoYywgUFBfVlNZTkNfSU5JVF9WQUwpICYgMHhGRkZGOworCWhlaWdodCA9IFNERV9SRUdfUkVBRChjLCBQUF9TWU5DX0NPTkZJR19IRUlHSFQpICYgMHhGRkZGOworCisJaWYgKGhlaWdodCA8IGluaXQpCisJCWdvdG8gbGluZV9jb3VudF9leGl0OworCisJbGluZSA9IFNERV9SRUdfUkVBRChjLCBQUF9JTlRfQ09VTlRfVkFMKSAmIDB4RkZGRjsKKworCWlmIChsaW5lIDwgaW5pdCkKKwkJbGluZSArPSAoMHhGRkZGIC0gaW5pdCk7CisJZWxzZQorCQlsaW5lIC09IGluaXQ7CisKK2xpbmVfY291bnRfZXhpdDoKKwlyZXR1cm4gbGluZTsKK30KKwogc3RhdGljIHZvaWQgX3NldHVwX3Bpbmdwb25nX29wcyhzdHJ1Y3Qgc2RlX2h3X3Bpbmdwb25nX29wcyAqb3BzLAogCWNvbnN0IHN0cnVjdCBzZGVfcGluZ3BvbmdfY2ZnICpod19jYXApCiB7CkBAIC0zMTIsNiArMzQ0LDcgQEAKIAlvcHMtPmRpc2FibGVfZHNjID0gc2RlX2h3X3BwX2RzY19kaXNhYmxlOwogCW9wcy0+Z2V0X2F1dG9yZWZyZXNoID0gc2RlX2h3X3BwX2dldF9hdXRvcmVmcmVzaF9jb25maWc7CiAJb3BzLT5wb2xsX3RpbWVvdXRfd3JfcHRyID0gc2RlX2h3X3BwX3BvbGxfdGltZW91dF93cl9wdHI7CisJb3BzLT5nZXRfbGluZV9jb3VudCA9IHNkZV9od19wcF9nZXRfbGluZV9jb3VudDsKIAogCXZlcnNpb24gPSBTREVfQ09MT1JfUFJPQ0VTU19NQUpPUihod19jYXAtPnNibGstPmRpdGhlci52ZXJzaW9uKTsKIAlzd2l0Y2ggKHZlcnNpb24pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19waW5ncG9uZy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmgKaW5kZXggZjBhMjA1NC4uMzg5YjJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3Bpbmdwb25nLmgKQEAgLTY0LDYgKzY0LDcgQEAKICAqICBAZW5hYmxlX2RzYyA6IGVuYWJsZXMgRFNDIGVuY29kZXIKICAqICBAZGlzYWJsZV9kc2MgOiBkaXNhYmxlcyBEU0MgZW5jb2RlcgogICogIEBzZXR1cF9kaXRoZXIgOiBmdW5jdGlvbiB0byBwcm9ncmFtIHRoZSBkaXRoZXIgaHcgYmxvY2sKKyAqICBAZ2V0X2xpbmVfY291bnQ6IG9idGFpbiBjdXJyZW50IHZlcnRpY2FsIGxpbmUgY291bnRlcgogICovCiBzdHJ1Y3Qgc2RlX2h3X3Bpbmdwb25nX29wcyB7CiAJLyoqCkBAIC0xMzAsNiArMTMxLDExIEBACiAJICogUHJvZ3JhbSB0aGUgZGl0aGVyIGh3IGJsb2NrCiAJICovCiAJaW50ICgqc2V0dXBfZGl0aGVyKShzdHJ1Y3Qgc2RlX2h3X3Bpbmdwb25nICpwcCwgdm9pZCAqY2ZnLCBzaXplX3QgbGVuKTsKKworCS8qKgorCSAqIE9idGFpbiBjdXJyZW50IHZlcnRpY2FsIGxpbmUgY291bnRlcgorCSAqLworCXUzMiAoKmdldF9saW5lX2NvdW50KShzdHJ1Y3Qgc2RlX2h3X3Bpbmdwb25nICpwcCk7CiB9OwogCiBzdHJ1Y3Qgc2RlX2h3X3Bpbmdwb25nIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19yZWdfZG1hX3YxLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfcmVnX2RtYV92MS5jCmluZGV4IDkxOTkwNDguLmQ3Yjc2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19yZWdfZG1hX3YxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3JlZ19kbWFfdjEuYwpAQCAtNTAsNyArNTAsNiBAQAogCQkJKGNmZyktPmRtYV9idWYtPmluZGV4KQogCiAjZGVmaW5lIFJFR19ETUFfREVDT0RFX1NFTCAweDE4MEFDMDYwCi0jZGVmaW5lIFJFR19ETUFfTEFTVF9DTUQgMHgxODBBQzAwNAogI2RlZmluZSBTSU5HTEVfUkVHX1dSSVRFX09QQ09ERSAoQklUKDI4KSkKICNkZWZpbmUgUkVMX0FERFJfT1BDT0RFIChCSVQoMjcpKQogI2RlZmluZSBIV19JTkRFWF9SRUdfV1JJVEVfT1BDT0RFIChCSVQoMjgpIHwgQklUKDI5KSkKQEAgLTQ3MSw3ICs0NzAsOCBAQAogCQkJY2ZnLT5kbWFfYnVmLT5pb3ZhKTsKIAlTREVfUkVHX1dSSVRFKCZodywgcmVnX2RtYV9jdGxfcXVldWVfb2ZmW2NmZy0+Y3RsLT5pZHhdICsgMHg0LAogCQkJY21kMSk7Ci0JU0RFX1JFR19XUklURSgmY2ZnLT5jdGwtPmh3LCBSRUdfRE1BX0NUTF9UUklHR0VSX09GRiwKKwlpZiAoY2ZnLT5sYXN0X2NvbW1hbmQpCisJCVNERV9SRUdfV1JJVEUoJmNmZy0+Y3RsLT5odywgUkVHX0RNQV9DVExfVFJJR0dFUl9PRkYsCiAJCQlxdWV1ZV9zZWxbY2ZnLT5xdWV1ZV9zZWxlY3RdKTsKIAogCXJldHVybiAwOwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkZV9yZWdfZG1hX2FzcGFjZV9jYih2b2lkICpjYl9kYXRhLCBib29sIGF0dGFjaCkKK3N0YXRpYyB2b2lkIHNkZV9yZWdfZG1hX2FzcGFjZV9jYl9sb2NrZWQodm9pZCAqY2JfZGF0YSwgYm9vbCBpc19kZXRhY2gpCiB7CiAJc3RydWN0IHNkZV9yZWdfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9IE5VTEw7CiAJc3RydWN0IG1zbV9nZW1fYWRkcmVzc19zcGFjZSAqYXNwYWNlID0gTlVMTDsKQEAgLTU5NywxNCArNTk3LDIzIEBACiAJZG1hX2J1ZiA9IChzdHJ1Y3Qgc2RlX3JlZ19kbWFfYnVmZmVyICopY2JfZGF0YTsKIAlhc3BhY2UgPSBkbWFfYnVmLT5hc3BhY2U7CiAKLQlpZiAoYXR0YWNoKSB7Ci0JCXJjID0gbXNtX2dlbV9nZXRfaW92YShkbWFfYnVmLT5idWYsIGFzcGFjZSwgJmRtYV9idWYtPmlvdmEpOworCWlmIChpc19kZXRhY2gpIHsKKwkJLyogaW52YWxpZGF0ZSB0aGUgc3RvcmVkIGlvdmEgKi8KKwkJZG1hX2J1Zi0+aW92YSA9IDA7CisKKwkJLyogcmV0dXJuIHRoZSB2aXJ0dWFsIGFkZHJlc3MgbWFwcGluZyAqLworCQltc21fZ2VtX3B1dF92YWRkcl9sb2NrZWQoZG1hX2J1Zi0+YnVmKTsKKwkJbXNtX2dlbV92dW5tYXAoZG1hX2J1Zi0+YnVmKTsKKworCX0gZWxzZSB7CisJCXJjID0gbXNtX2dlbV9nZXRfaW92YV9sb2NrZWQoZG1hX2J1Zi0+YnVmLCBhc3BhY2UsCisJCQkJJmRtYV9idWYtPmlvdmEpOwogCQlpZiAocmMpIHsKIAkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGdldCB0aGUgaW92YSByYyAlZFxuIiwgcmMpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJZG1hX2J1Zi0+dmFkZHIgPSBtc21fZ2VtX2dldF92YWRkcihkbWFfYnVmLT5idWYpOworCQlkbWFfYnVmLT52YWRkciA9IG1zbV9nZW1fZ2V0X3ZhZGRyX2xvY2tlZChkbWFfYnVmLT5idWYpOwogCQlpZiAoSVNfRVJSX09SX05VTEwoZG1hX2J1Zi0+dmFkZHIpKSB7CiAJCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgdmEgcmMgJWRcbiIsIHJjKTsKIAkJCXJldHVybjsKQEAgLTYxNSwxMyArNjI0LDYgQEAKIAkJZG1hX2J1Zi0+aW92YSA9IGRtYV9idWYtPmlvdmEgKyBvZmZzZXQ7CiAJCWRtYV9idWYtPnZhZGRyID0gKHZvaWQgKikoKCh1OCAqKWRtYV9idWYtPnZhZGRyKSArIG9mZnNldCk7CiAJCWRtYV9idWYtPm5leHRfb3BfYWxsb3dlZCA9IERFQ09ERV9TRUxfT1A7Ci0JfSBlbHNlIHsKLQkJLyogaW52YWxpZGF0ZSB0aGUgc3RvcmVkIGlvdmEgKi8KLQkJZG1hX2J1Zi0+aW92YSA9IDA7Ci0KLQkJLyogcmV0dXJuIHRoZSB2aXJ0dWFsIGFkZHJlc3MgbWFwcGluZyAqLwotCQltc21fZ2VtX3B1dF92YWRkcihkbWFfYnVmLT5idWYpOwotCQltc21fZ2VtX3Z1bm1hcChkbWFfYnVmLT5idWYpOwogCX0KIH0KIApAQCAtNjYxLDcgKzY2Myw3IEBACiAKIAkvKiByZWdpc3RlciB0byBhc3BhY2UgKi8KIAlyYyA9IG1zbV9nZW1fYWRkcmVzc19zcGFjZV9yZWdpc3Rlcl9jYihhc3BhY2UsCi0JCQlzZGVfcmVnX2RtYV9hc3BhY2VfY2IsCisJCQlzZGVfcmVnX2RtYV9hc3BhY2VfY2JfbG9ja2VkLAogCQkJKHZvaWQgKilkbWFfYnVmKTsKIAlpZiAocmMpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcmVnaXN0ZXIgY2FsbGJhY2sgJWQiLCByYyk7CkBAIC02OTQsMTAgKzY5NiwxMiBAQAogcHV0X2lvdmE6CiAJbXNtX2dlbV9wdXRfaW92YShkbWFfYnVmLT5idWYsIGFzcGFjZSk7CiBmcmVlX2FzcGFjZV9jYjoKLQltc21fZ2VtX2FkZHJlc3Nfc3BhY2VfdW5yZWdpc3Rlcl9jYihhc3BhY2UsIHNkZV9yZWdfZG1hX2FzcGFjZV9jYiwKLQkJCWRtYV9idWYpOworCW1zbV9nZW1fYWRkcmVzc19zcGFjZV91bnJlZ2lzdGVyX2NiKGFzcGFjZSwKKwkJCXNkZV9yZWdfZG1hX2FzcGFjZV9jYl9sb2NrZWQsIGRtYV9idWYpOwogZnJlZV9nZW06CisJbXV0ZXhfbG9jaygmcmVnX2RtYS0+ZHJtX2Rldi0+c3RydWN0X211dGV4KTsKIAltc21fZ2VtX2ZyZWVfb2JqZWN0KGRtYV9idWYtPmJ1Zik7CisJbXV0ZXhfdW5sb2NrKCZyZWdfZG1hLT5kcm1fZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogZmFpbDoKIAlrZnJlZShkbWFfYnVmKTsKIAlyZXR1cm4gRVJSX1BUUihyYyk7CkBAIC03MTMsNyArNzE3LDcgQEAKIAlpZiAoZG1hX2J1Zi0+YnVmKSB7CiAJCW1zbV9nZW1fcHV0X2lvdmEoZG1hX2J1Zi0+YnVmLCAwKTsKIAkJbXNtX2dlbV9hZGRyZXNzX3NwYWNlX3VucmVnaXN0ZXJfY2IoZG1hX2J1Zi0+YXNwYWNlLAotCQkJCXNkZV9yZWdfZG1hX2FzcGFjZV9jYiwgZG1hX2J1Zik7CisJCQkJc2RlX3JlZ19kbWFfYXNwYWNlX2NiX2xvY2tlZCwgZG1hX2J1Zik7CiAJCW11dGV4X2xvY2soJnJlZ19kbWEtPmRybV9kZXYtPnN0cnVjdF9tdXRleCk7CiAJCW1zbV9nZW1fZnJlZV9vYmplY3QoZG1hX2J1Zi0+YnVmKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdfZG1hLT5kcm1fZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtNzU0LDggKzc1OCw4IEBACiAKIAlsb2MgPSAgKHUzMiAqKSgodTggKiljZmctPmRtYV9idWYtPnZhZGRyICsKIAkJCWNmZy0+ZG1hX2J1Zi0+aW5kZXgpOwotCWxvY1swXSA9IFJFR19ETUFfTEFTVF9DTUQ7Ci0JbG9jWzFdID0gQklUKDApOworCWxvY1swXSA9IFJFR19ETUFfREVDT0RFX1NFTDsKKwlsb2NbMV0gPSAwOwogCWNmZy0+ZG1hX2J1Zi0+aW5kZXggPSBzaXplb2YodTMyKSAqIDI7CiAJY2ZnLT5kbWFfYnVmLT5vcHNfY29tcGxldGVkID0gUkVHX1dSSVRFX09QIHwgREVDT0RFX1NFTF9PUDsKIAljZmctPmRtYV9idWYtPm5leHRfb3BfYWxsb3dlZCA9IFJFR19XUklURV9PUDsKQEAgLTc3NCw2ICs3NzgsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKCFsYXN0X2NtZF9idWYtPmlvdmEpIHsKKwkJRFJNX0RFQlVHKCJpb3ZhIG5vdCBzZXQsIHBvc3NpYmxlIHNlY3VyZSBzZXNzaW9uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJY2ZnLmRtYV9idWYgPSBsYXN0X2NtZF9idWY7CiAJcmVzZXRfcmVnX2RtYV9idWZmZXJfdjEobGFzdF9jbWRfYnVmKTsKIAlpZiAodmFsaWRhdGVfbGFzdF9jbWQoJmNmZykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19yZWdfZG1hX3YxX2NvbG9yX3Byb2MuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19yZWdfZG1hX3YxX2NvbG9yX3Byb2MuYwppbmRleCA1NWNiMjYwLi5iNTlkZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfcmVnX2RtYV92MV9jb2xvcl9wcm9jLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3JlZ19kbWFfdjFfY29sb3JfcHJvYy5jCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgc3RydWN0IHNkZV9yZWdfZG1hX2J1ZmZlciAqZHNwcF9idWZbUkVHX0RNQV9GRUFUVVJFU19NQVhdW0RTUFBfTUFYXTsKIAogc3RhdGljIHUzMiBmZWF0dXJlX21hcFtTREVfRFNQUF9NQVhdID0gewotCVtTREVfRFNQUF9WTFVUXSA9IFZMVVQsCisJW1NERV9EU1BQX1ZMVVRdID0gUkVHX0RNQV9GRUFUVVJFU19NQVgsCiAJW1NERV9EU1BQX0dBTVVUXSA9IEdBTVVULAogCVtTREVfRFNQUF9JR0NdID0gSUdDLAogCVtTREVfRFNQUF9QQ0NdID0gUENDLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3JvdC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3JvdC5jCmluZGV4IDFhMDA1MTcuLmM1YWYzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19yb3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfcm90LmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogCQkJU0RFX0VSUk9SKCJmYWlsZWQgdG8gZ2V0IGRzdCBmb3JtYXRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQl9IGVsc2UgaWYgKGh3X2NtZCA9PSBTREVfSFdfUk9UX0NNRF9DT01NSVQpIHsKKwl9IGVsc2UgewogCQlyYyA9IHNkZV9od19yb3RfdG9fdjRsMl9waXhmbXQoZGF0YS0+ZHN0X3BpeGVsX2Zvcm1hdCwKIAkJCQlkYXRhLT5kc3RfbW9kaWZpZXIsICZyb3RfY21kLmRzdF9waXhmbXQpOwogCQlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19zc3BwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfc3NwcC5jCmluZGV4IGE0NTY0YzEuLmFjZWNmMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19zc3BwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3NzcHAuYwpAQCAtODUsNiArODUsNyBAQAogI2RlZmluZSBTU1BQX1RSQUZGSUNfU0hBUEVSICAgICAgICAgICAgICAgIDB4MTMwCiAjZGVmaW5lIFNTUFBfQ0RQX0NOVEwgICAgICAgICAgICAgICAgICAgICAgMHgxMzQKICNkZWZpbmUgU1NQUF9VQldDX0VSUk9SX1NUQVRVUyAgICAgICAgICAgICAweDEzOAorI2RlZmluZSBTU1BQX0NEUF9DTlRMX1JFQzEgICAgICAgICAgICAgICAgIDB4MTNjCiAjZGVmaW5lIFNTUFBfVFJBRkZJQ19TSEFQRVJfUFJFRklMTCAgICAgICAgMHgxNTAKICNkZWZpbmUgU1NQUF9UUkFGRklDX1NIQVBFUl9SRUMxX1BSRUZJTEwgICAweDE1NAogI2RlZmluZSBTU1BQX1RSQUZGSUNfU0hBUEVSX1JFQzEgICAgICAgICAgIDB4MTU4CkBAIC0xMTksNTcgKzEyMCw2IEBACiAjZGVmaW5lIENPTVAxXzJfSU5JVF9QSEFTRV9ZICAgICAgICAgICAgICAgMHgyQwogI2RlZmluZSBWSUdfMF9RU0VFRDJfU0hBUlAgICAgICAgICAgICAgICAgIDB4MzAKIAotLyogU0RFX1NTUFBfU0NBTEVSX1FTRUVEMyAqLwotI2RlZmluZSBRU0VFRDNfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgUVNFRUQzX09QX01PREUgICAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFFTRUVEM19SR0IyWV9DT0VGRiAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgIDB4MEMKLSNkZWZpbmUgUVNFRUQzX1BIQVNFX1NURVBfWV9IICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFFTRUVEM19QSEFTRV9TVEVQX1lfViAgICAgICAgICAgICAgMHgxNAotI2RlZmluZSBRU0VFRDNfUEhBU0VfU1RFUF9VVl9IICAgICAgICAgICAgIDB4MTgKLSNkZWZpbmUgUVNFRUQzX1BIQVNFX1NURVBfVVZfViAgICAgICAgICAgICAweDFDCi0jZGVmaW5lIFFTRUVEM19QUkVMT0FEICAgICAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBRU0VFRDNfREVfU0hBUlBFTiAgICAgICAgICAgICAgICAgIDB4MjQKLSNkZWZpbmUgUVNFRUQzX0RFX1NIQVJQRU5fQ1RMICAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIFFTRUVEM19ERV9TSEFQRV9DVEwgICAgICAgICAgICAgICAgMHgyQwotI2RlZmluZSBRU0VFRDNfREVfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4MzAKLSNkZWZpbmUgUVNFRUQzX0RFX0FESlVTVF9EQVRBXzAgICAgICAgICAgICAweDM0Ci0jZGVmaW5lIFFTRUVEM19ERV9BREpVU1RfREFUQV8xICAgICAgICAgICAgMHgzOAotI2RlZmluZSBRU0VFRDNfREVfQURKVVNUX0RBVEFfMiAgICAgICAgICAgIDB4M0MKLSNkZWZpbmUgUVNFRUQzX1NSQ19TSVpFX1lfUkdCX0EgICAgICAgICAgICAweDQwCi0jZGVmaW5lIFFTRUVEM19TUkNfU0laRV9VViAgICAgICAgICAgICAgICAgMHg0NAotI2RlZmluZSBRU0VFRDNfRFNUX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4NDgKLSNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX0NUUkwgICAgICAgICAgICAgICAweDRDCi0jZGVmaW5lIFFTRUVEM19DT0VGX0xVVF9TV0FQX0JJVCAgICAgICAgICAgMAotI2RlZmluZSBRU0VFRDNfQ09FRl9MVVRfRElSX0JJVCAgICAgICAgICAgIDEKLSNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX1lfQ0lSX0JJVCAgICAgICAgICAyCi0jZGVmaW5lIFFTRUVEM19DT0VGX0xVVF9VVl9DSVJfQklUICAgICAgICAgMwotI2RlZmluZSBRU0VFRDNfQ09FRl9MVVRfWV9TRVBfQklUICAgICAgICAgIDQKLSNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX1VWX1NFUF9CSVQgICAgICAgICA1Ci0jZGVmaW5lIFFTRUVEM19CVUZGRVJfQ1RSTCAgICAgICAgICAgICAgICAgMHg1MAotI2RlZmluZSBRU0VFRDNfQ0xLX0NUUkwwICAgICAgICAgICAgICAgICAgIDB4NTQKLSNkZWZpbmUgUVNFRUQzX0NMS19DVFJMMSAgICAgICAgICAgICAgICAgICAweDU4Ci0jZGVmaW5lIFFTRUVEM19DTEtfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg1QwotI2RlZmluZSBRU0VFRDNfTUlTUl9DVFJMICAgICAgICAgICAgICAgICAgIDB4NzAKLSNkZWZpbmUgUVNFRUQzX01JU1JfU0lHTkFUVVJFXzAgICAgICAgICAgICAweDc0Ci0jZGVmaW5lIFFTRUVEM19NSVNSX1NJR05BVFVSRV8xICAgICAgICAgICAgMHg3OAotI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVF9ZX0ggICAgICAgICAgICAgIDB4OTAKLSNkZWZpbmUgUVNFRUQzX1BIQVNFX0lOSVRfWV9WICAgICAgICAgICAgICAweDk0Ci0jZGVmaW5lIFFTRUVEM19QSEFTRV9JTklUX1VWX0ggICAgICAgICAgICAgMHg5OAotI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVF9VVl9WICAgICAgICAgICAgIDB4OUMKLSNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUICAgICAgICAgICAgICAgICAgICAweDEwMAotI2RlZmluZSBRU0VFRDNfRklMVEVSUyAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUVNFRUQzX0xVVF9SRUdJT05TICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFFTRUVEM19DSVJDVUxBUl9MVVRTICAgICAgICAgICAgICAgOQotI2RlZmluZSBRU0VFRDNfU0VQQVJBQkxFX0xVVFMgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFFTRUVEM19MVVRfU0laRSAgICAgICAgICAgICAgICAgICAgNjAKLSNkZWZpbmUgUVNFRUQzX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFTRUVEM19ESVJfTFVUX1NJWkUgICAgICAgICAgICAgICAgKDIwMCAqIHNpemVvZih1MzIpKQotI2RlZmluZSBRU0VFRDNfQ0lSX0xVVF9TSVpFIFwKLQkoUVNFRUQzX0xVVF9TSVpFICogUVNFRUQzX0NJUkNVTEFSX0xVVFMgKiBzaXplb2YodTMyKSkKLSNkZWZpbmUgUVNFRUQzX1NFUF9MVVRfU0laRSBcCi0JKFFTRUVEM19MVVRfU0laRSAqIFFTRUVEM19TRVBBUkFCTEVfTFVUUyAqIHNpemVvZih1MzIpKQotCiAvKgogICogRGVmaW5pdGlvbnMgZm9yIFZpRyBvcCBtb2RlcwogICovCkBAIC00MjIsMTkgKzM3MiwxOSBAQAogCWlmIChfc3NwcF9zdWJibGtfb2Zmc2V0KGN0eCwgU0RFX1NTUFBfU1JDLCAmaWR4KSkKIAkJcmV0dXJuOwogCi0JaWYgKHJlY3RfbW9kZSA9PSBTREVfU1NQUF9SRUNUX1NPTE8gfHwgcmVjdF9tb2RlID09IFNERV9TU1BQX1JFQ1RfMCkKLQkJc2VjdXJlX2JpdF9tYXNrID0gKHJlY3RfbW9kZSA9PSBTREVfU1NQUF9SRUNUX1NPTE8pID8gMHhGIDoKLQkJCTB4NTsKLQllbHNlCi0JCXNlY3VyZV9iaXRfbWFzayA9IDB4QTsKLQogCWMgPSAmY3R4LT5odzsKIAotCXNlY3VyZSA9IFNERV9SRUdfUkVBRChjLCBTU1BQX1NSQ19BRERSX1NXX1NUQVRVUyArIGlkeCk7Ci0JaWYgKGVuYWJsZSkKKwlpZiAoZW5hYmxlKSB7CisJCWlmICgocmVjdF9tb2RlID09IFNERV9TU1BQX1JFQ1RfU09MTykKKwkJCQl8fCAocmVjdF9tb2RlID09IFNERV9TU1BQX1JFQ1RfMCkpCisJCQlzZWN1cmVfYml0X21hc2sgPQorCQkJCShyZWN0X21vZGUgPT0gU0RFX1NTUFBfUkVDVF9TT0xPKSA/IDB4RiA6IDB4NTsKKwkJZWxzZQorCQkJc2VjdXJlX2JpdF9tYXNrID0gMHhBOworCisJCXNlY3VyZSA9IFNERV9SRUdfUkVBRChjLCBTU1BQX1NSQ19BRERSX1NXX1NUQVRVUyArIGlkeCk7CiAJCXNlY3VyZSB8PSBzZWN1cmVfYml0X21hc2s7Ci0JZWxzZQotCQlzZWN1cmUgJj0gfnNlY3VyZV9iaXRfbWFzazsKKwl9CiAKIAlTREVfUkVHX1dSSVRFKGMsIFNTUFBfU1JDX0FERFJfU1dfU1RBVFVTICsgaWR4LCBzZWN1cmUpOwogfQpAQCAtNTU2LDE0NCArNTA2LDEyIEBACiAJCXBlLT5waGFzZV9zdGVwX3lbU0RFX1NTUFBfQ09NUF8xXzJdKTsKIH0KIAotc3RhdGljIHZvaWQgX3NkZV9od19zc3BwX3NldHVwX3NjYWxlcjNfbHV0KHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4LAotCQlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnICpzY2FsZXIzX2NmZykKLXsKLQl1MzIgaWR4OwotCWludCBpLCBqLCBmaWx0ZXI7Ci0JaW50IGNvbmZpZ19sdXQgPSAweDA7Ci0JdW5zaWduZWQgbG9uZyBsdXRfZmxhZ3M7Ci0JdTMyIGx1dF9hZGRyLCBsdXRfb2Zmc2V0LCBsdXRfbGVuOwotCXUzMiAqbHV0W1FTRUVEM19GSUxURVJTXSA9IHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKLQlzdGF0aWMgY29uc3QgdWludDMyX3Qgb2Zmc2V0W1FTRUVEM19GSUxURVJTXVtRU0VFRDNfTFVUX1JFR0lPTlNdWzJdID0gewotCQl7ezE4LCAweDAwMH0sIHsxMiwgMHgxMjB9LCB7MTIsIDB4MUUwfSwgezgsIDB4MkEwfSB9LAotCQl7ezYsIDB4MzIwfSwgezMsIDB4M0UwfSwgezMsIDB4NDQwfSwgezMsIDB4NEEwfSB9LAotCQl7ezYsIDB4NTAwfSwgezMsIDB4NWMwfSwgezMsIDB4NjIwfSwgezMsIDB4NjgwfSB9LAotCQl7ezYsIDB4MzgwfSwgezMsIDB4NDEwfSwgezMsIDB4NDcwfSwgezMsIDB4NGQwfSB9LAotCQl7ezYsIDB4NTYwfSwgezMsIDB4NWYwfSwgezMsIDB4NjUwfSwgezMsIDB4NmIwfSB9LAotCX07Ci0KLQlpZiAoX3NzcHBfc3ViYmxrX29mZnNldChjdHgsIFNERV9TU1BQX1NDQUxFUl9RU0VFRDMsICZpZHgpIHx8Ci0JCSFzY2FsZXIzX2NmZykKLQkJcmV0dXJuOwotCi0JbHV0X2ZsYWdzID0gKHVuc2lnbmVkIGxvbmcpIHNjYWxlcjNfY2ZnLT5sdXRfZmxhZzsKLQlpZiAodGVzdF9iaXQoUVNFRUQzX0NPRUZfTFVUX0RJUl9CSVQsICZsdXRfZmxhZ3MpICYmCi0JCShzY2FsZXIzX2NmZy0+ZGlyX2xlbiA9PSBRU0VFRDNfRElSX0xVVF9TSVpFKSkgewotCQlsdXRbMF0gPSBzY2FsZXIzX2NmZy0+ZGlyX2x1dDsKLQkJY29uZmlnX2x1dCA9IDE7Ci0JfQotCWlmICh0ZXN0X2JpdChRU0VFRDNfQ09FRl9MVVRfWV9DSVJfQklULCAmbHV0X2ZsYWdzKSAmJgotCQkoc2NhbGVyM19jZmctPnlfcmdiX2Npcl9sdXRfaWR4IDwgUVNFRUQzX0NJUkNVTEFSX0xVVFMpICYmCi0JCShzY2FsZXIzX2NmZy0+Y2lyX2xlbiA9PSBRU0VFRDNfQ0lSX0xVVF9TSVpFKSkgewotCQlsdXRbMV0gPSBzY2FsZXIzX2NmZy0+Y2lyX2x1dCArCi0JCQlzY2FsZXIzX2NmZy0+eV9yZ2JfY2lyX2x1dF9pZHggKiBRU0VFRDNfTFVUX1NJWkU7Ci0JCWNvbmZpZ19sdXQgPSAxOwotCX0KLQlpZiAodGVzdF9iaXQoUVNFRUQzX0NPRUZfTFVUX1VWX0NJUl9CSVQsICZsdXRfZmxhZ3MpICYmCi0JCShzY2FsZXIzX2NmZy0+dXZfY2lyX2x1dF9pZHggPCBRU0VFRDNfQ0lSQ1VMQVJfTFVUUykgJiYKLQkJKHNjYWxlcjNfY2ZnLT5jaXJfbGVuID09IFFTRUVEM19DSVJfTFVUX1NJWkUpKSB7Ci0JCWx1dFsyXSA9IHNjYWxlcjNfY2ZnLT5jaXJfbHV0ICsKLQkJCXNjYWxlcjNfY2ZnLT51dl9jaXJfbHV0X2lkeCAqIFFTRUVEM19MVVRfU0laRTsKLQkJY29uZmlnX2x1dCA9IDE7Ci0JfQotCWlmICh0ZXN0X2JpdChRU0VFRDNfQ09FRl9MVVRfWV9TRVBfQklULCAmbHV0X2ZsYWdzKSAmJgotCQkoc2NhbGVyM19jZmctPnlfcmdiX3NlcF9sdXRfaWR4IDwgUVNFRUQzX1NFUEFSQUJMRV9MVVRTKSAmJgotCQkoc2NhbGVyM19jZmctPnNlcF9sZW4gPT0gUVNFRUQzX1NFUF9MVVRfU0laRSkpIHsKLQkJbHV0WzNdID0gc2NhbGVyM19jZmctPnNlcF9sdXQgKwotCQkJc2NhbGVyM19jZmctPnlfcmdiX3NlcF9sdXRfaWR4ICogUVNFRUQzX0xVVF9TSVpFOwotCQljb25maWdfbHV0ID0gMTsKLQl9Ci0JaWYgKHRlc3RfYml0KFFTRUVEM19DT0VGX0xVVF9VVl9TRVBfQklULCAmbHV0X2ZsYWdzKSAmJgotCQkoc2NhbGVyM19jZmctPnV2X3NlcF9sdXRfaWR4IDwgUVNFRUQzX1NFUEFSQUJMRV9MVVRTKSAmJgotCQkoc2NhbGVyM19jZmctPnNlcF9sZW4gPT0gUVNFRUQzX1NFUF9MVVRfU0laRSkpIHsKLQkJbHV0WzRdID0gc2NhbGVyM19jZmctPnNlcF9sdXQgKwotCQkJc2NhbGVyM19jZmctPnV2X3NlcF9sdXRfaWR4ICogUVNFRUQzX0xVVF9TSVpFOwotCQljb25maWdfbHV0ID0gMTsKLQl9Ci0KLQlpZiAoY29uZmlnX2x1dCkgewotCQlmb3IgKGZpbHRlciA9IDA7IGZpbHRlciA8IFFTRUVEM19GSUxURVJTOyBmaWx0ZXIrKykgewotCQkJaWYgKCFsdXRbZmlsdGVyXSkKLQkJCQljb250aW51ZTsKLQkJCWx1dF9vZmZzZXQgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IFFTRUVEM19MVVRfUkVHSU9OUzsgaSsrKSB7Ci0JCQkJbHV0X2FkZHIgPSBRU0VFRDNfQ09FRl9MVVQgKyBpZHgKLQkJCQkJKyBvZmZzZXRbZmlsdGVyXVtpXVsxXTsKLQkJCQlsdXRfbGVuID0gb2Zmc2V0W2ZpbHRlcl1baV1bMF0gPDwgMjsKLQkJCQlmb3IgKGogPSAwOyBqIDwgbHV0X2xlbjsgaisrKSB7Ci0JCQkJCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsCi0JCQkJCQlsdXRfYWRkciwKLQkJCQkJCShsdXRbZmlsdGVyXSlbbHV0X29mZnNldCsrXSk7Ci0JCQkJCWx1dF9hZGRyICs9IDQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHRlc3RfYml0KFFTRUVEM19DT0VGX0xVVF9TV0FQX0JJVCwgJmx1dF9mbGFncykpCi0JCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19DT0VGX0xVVF9DVFJMICsgaWR4LCBCSVQoMCkpOwotCi19Ci0KLXN0YXRpYyB2b2lkIF9zZGVfaHdfc3NwcF9zZXR1cF9zY2FsZXIzX2RlKHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4LAotCQlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfZGVfY2ZnICpkZV9jZmcpCi17Ci0JdTMyIGlkeDsKLQl1MzIgc2hhcnBfbHZsLCBzaGFycF9jdGwsIHNoYXBlX2N0bCwgZGVfdGhyOwotCXUzMiBhZGp1c3RfYSwgYWRqdXN0X2IsIGFkanVzdF9jOwotCXN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmh3OwotCi0JaWYgKF9zc3BwX3N1YmJsa19vZmZzZXQoY3R4LCBTREVfU1NQUF9TQ0FMRVJfUVNFRUQzLCAmaWR4KSB8fCAhZGVfY2ZnKQotCQlyZXR1cm47Ci0KLQlpZiAoIWRlX2NmZy0+ZW5hYmxlKQotCQlyZXR1cm47Ci0KLQlodyA9ICZjdHgtPmh3OwotCXNoYXJwX2x2bCA9IChkZV9jZmctPnNoYXJwZW5fbGV2ZWwxICYgMHgxRkYpIHwKLQkJKChkZV9jZmctPnNoYXJwZW5fbGV2ZWwyICYgMHgxRkYpIDw8IDE2KTsKLQotCXNoYXJwX2N0bCA9ICgoZGVfY2ZnLT5saW1pdCAmIDB4RikgPDwgOSkgfAotCQkoKGRlX2NmZy0+cHJlY19zaGlmdCAmIDB4NykgPDwgMTMpIHwKLQkJKChkZV9jZmctPmNsaXAgJiAweDcpIDw8IDE2KTsKLQotCXNoYXBlX2N0bCA9IChkZV9jZmctPnRocl9xdWlldCAmIDB4RkYpIHwKLQkJKChkZV9jZmctPnRocl9kaWVvdXQgJiAweDNGRikgPDwgMTYpOwotCi0JZGVfdGhyID0gKGRlX2NmZy0+dGhyX2xvdyAmIDB4M0ZGKSB8Ci0JCSgoZGVfY2ZnLT50aHJfaGlnaCAmIDB4M0ZGKSA8PCAxNik7Ci0KLQlhZGp1c3RfYSA9IChkZV9jZmctPmFkanVzdF9hWzBdICYgMHgzRkYpIHwKLQkJKChkZV9jZmctPmFkanVzdF9hWzFdICYgMHgzRkYpIDw8IDEwKSB8Ci0JCSgoZGVfY2ZnLT5hZGp1c3RfYVsyXSAmIDB4M0ZGKSA8PCAyMCk7Ci0KLQlhZGp1c3RfYiA9IChkZV9jZmctPmFkanVzdF9iWzBdICYgMHgzRkYpIHwKLQkJKChkZV9jZmctPmFkanVzdF9iWzFdICYgMHgzRkYpIDw8IDEwKSB8Ci0JCSgoZGVfY2ZnLT5hZGp1c3RfYlsyXSAmIDB4M0ZGKSA8PCAyMCk7Ci0KLQlhZGp1c3RfYyA9IChkZV9jZmctPmFkanVzdF9jWzBdICYgMHgzRkYpIHwKLQkJKChkZV9jZmctPmFkanVzdF9jWzFdICYgMHgzRkYpIDw8IDEwKSB8Ci0JCSgoZGVfY2ZnLT5hZGp1c3RfY1syXSAmIDB4M0ZGKSA8PCAyMCk7Ci0KLQlTREVfUkVHX1dSSVRFKGh3LCBRU0VFRDNfREVfU0hBUlBFTiArIGlkeCwgc2hhcnBfbHZsKTsKLQlTREVfUkVHX1dSSVRFKGh3LCBRU0VFRDNfREVfU0hBUlBFTl9DVEwgKyBpZHgsIHNoYXJwX2N0bCk7Ci0JU0RFX1JFR19XUklURShodywgUVNFRUQzX0RFX1NIQVBFX0NUTCArIGlkeCwgc2hhcGVfY3RsKTsKLQlTREVfUkVHX1dSSVRFKGh3LCBRU0VFRDNfREVfVEhSRVNIT0xEICsgaWR4LCBkZV90aHIpOwotCVNERV9SRUdfV1JJVEUoaHcsIFFTRUVEM19ERV9BREpVU1RfREFUQV8wICsgaWR4LCBhZGp1c3RfYSk7Ci0JU0RFX1JFR19XUklURShodywgUVNFRUQzX0RFX0FESlVTVF9EQVRBXzEgKyBpZHgsIGFkanVzdF9iKTsKLQlTREVfUkVHX1dSSVRFKGh3LCBRU0VFRDNfREVfQURKVVNUX0RBVEFfMiArIGlkeCwgYWRqdXN0X2MpOwotCi19Ci0KIHN0YXRpYyB2b2lkIF9zZGVfaHdfc3NwcF9zZXR1cF9zY2FsZXIzKHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4LAogCQlzdHJ1Y3Qgc2RlX2h3X3BpcGVfY2ZnICpzc3BwLAogCQlzdHJ1Y3Qgc2RlX2h3X3BpeGVsX2V4dCAqcGUsCiAJCXZvaWQgKnNjYWxlcl9jZmcpCiB7CiAJdTMyIGlkeDsKLQl1MzIgb3BfbW9kZSA9IDA7Ci0JdTMyIHBoYXNlX2luaXQsIHByZWxvYWQsIHNyY195X3JnYiwgc3JjX3V2LCBkc3Q7CiAJc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyAqc2NhbGVyM19jZmcgPSBzY2FsZXJfY2ZnOwogCiAJKHZvaWQpcGU7CkBAIC03MDEsOTMgKzUxOSw5IEBACiAJCXx8ICFzY2FsZXIzX2NmZyB8fCAhY3R4IHx8ICFjdHgtPmNhcCB8fCAhY3R4LT5jYXAtPnNibGspCiAJCXJldHVybjsKIAotCWlmICghc2NhbGVyM19jZmctPmVuYWJsZSkKLQkJZ290byBlbmQ7Ci0KLQlvcF9tb2RlIHw9IEJJVCgwKTsKLQlvcF9tb2RlIHw9IChzY2FsZXIzX2NmZy0+eV9yZ2JfZmlsdGVyX2NmZyAmIDB4MykgPDwgMTY7Ci0KLQlpZiAoU0RFX0ZPUk1BVF9JU19ZVVYoc3NwcC0+bGF5b3V0LmZvcm1hdCkpIHsKLQkJb3BfbW9kZSB8PSBCSVQoMTIpOwotCQlvcF9tb2RlIHw9IChzY2FsZXIzX2NmZy0+dXZfZmlsdGVyX2NmZyAmIDB4MykgPDwgMjQ7Ci0JfQotCi0Jb3BfbW9kZSB8PSAoc2NhbGVyM19jZmctPmJsZW5kX2NmZyAmIDEpIDw8IDMxOwotCW9wX21vZGUgfD0gKHNjYWxlcjNfY2ZnLT5kaXJfZW4pID8gQklUKDQpIDogMDsKLQotCXByZWxvYWQgPQotCQkoKHNjYWxlcjNfY2ZnLT5wcmVsb2FkX3hbMF0gJiAweDdGKSA8PCAwKSB8Ci0JCSgoc2NhbGVyM19jZmctPnByZWxvYWRfeVswXSAmIDB4N0YpIDw8IDgpIHwKLQkJKChzY2FsZXIzX2NmZy0+cHJlbG9hZF94WzFdICYgMHg3RikgPDwgMTYpIHwKLQkJKChzY2FsZXIzX2NmZy0+cHJlbG9hZF95WzFdICYgMHg3RikgPDwgMjQpOwotCi0Jc3JjX3lfcmdiID0gKHNjYWxlcjNfY2ZnLT5zcmNfd2lkdGhbMF0gJiAweDFGRkZGKSB8Ci0JCSgoc2NhbGVyM19jZmctPnNyY19oZWlnaHRbMF0gJiAweDFGRkZGKSA8PCAxNik7Ci0KLQlzcmNfdXYgPSAoc2NhbGVyM19jZmctPnNyY193aWR0aFsxXSAmIDB4MUZGRkYpIHwKLQkJKChzY2FsZXIzX2NmZy0+c3JjX2hlaWdodFsxXSAmIDB4MUZGRkYpIDw8IDE2KTsKLQotCWRzdCA9IChzY2FsZXIzX2NmZy0+ZHN0X3dpZHRoICYgMHgxRkZGRikgfAotCQkoKHNjYWxlcjNfY2ZnLT5kc3RfaGVpZ2h0ICYgMHgxRkZGRikgPDwgMTYpOwotCi0JaWYgKHNjYWxlcjNfY2ZnLT5kZS5lbmFibGUpIHsKLQkJX3NkZV9od19zc3BwX3NldHVwX3NjYWxlcjNfZGUoY3R4LCAmc2NhbGVyM19jZmctPmRlKTsKLQkJb3BfbW9kZSB8PSBCSVQoOCk7Ci0JfQotCi0JaWYgKHNjYWxlcjNfY2ZnLT5sdXRfZmxhZykKLQkJX3NkZV9od19zc3BwX3NldHVwX3NjYWxlcjNfbHV0KGN0eCwgc2NhbGVyM19jZmcpOwotCi0JaWYgKGN0eC0+Y2FwLT5zYmxrLT5zY2FsZXJfYmxrLnZlcnNpb24gPT0gMHgxMDAyKSB7Ci0JCXBoYXNlX2luaXQgPQotCQkJKChzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV94WzBdICYgMHgzRikgPDwgMCkgfAotCQkJKChzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV95WzBdICYgMHgzRikgPDwgOCkgfAotCQkJKChzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV94WzFdICYgMHgzRikgPDwgMTYpIHwKLQkJCSgoc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeVsxXSAmIDB4M0YpIDw8IDI0KTsKLQkJU0RFX1JFR19XUklURSgmY3R4LT5odywgUVNFRUQzX1BIQVNFX0lOSVQgKyBpZHgsIHBoYXNlX2luaXQpOwotCX0gZWxzZSB7Ci0JCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19QSEFTRV9JTklUX1lfSCArIGlkeCwKLQkJCXNjYWxlcjNfY2ZnLT5pbml0X3BoYXNlX3hbMF0gJiAweDFGRkZGRik7Ci0JCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19QSEFTRV9JTklUX1lfViArIGlkeCwKLQkJCXNjYWxlcjNfY2ZnLT5pbml0X3BoYXNlX3lbMF0gJiAweDFGRkZGRik7Ci0JCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19QSEFTRV9JTklUX1VWX0ggKyBpZHgsCi0JCQlzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV94WzFdICYgMHgxRkZGRkYpOwotCQlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBRU0VFRDNfUEhBU0VfSU5JVF9VVl9WICsgaWR4LAotCQkJc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeVsxXSAmIDB4MUZGRkZGKTsKLQl9Ci0KLQlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBRU0VFRDNfUEhBU0VfU1RFUF9ZX0ggKyBpZHgsCi0JCXNjYWxlcjNfY2ZnLT5waGFzZV9zdGVwX3hbMF0gJiAweEZGRkZGRik7Ci0KLQlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBRU0VFRDNfUEhBU0VfU1RFUF9ZX1YgKyBpZHgsCi0JCXNjYWxlcjNfY2ZnLT5waGFzZV9zdGVwX3lbMF0gJiAweEZGRkZGRik7Ci0KLQlTREVfUkVHX1dSSVRFKCZjdHgtPmh3LCBRU0VFRDNfUEhBU0VfU1RFUF9VVl9IICsgaWR4LAotCQlzY2FsZXIzX2NmZy0+cGhhc2Vfc3RlcF94WzFdICYgMHhGRkZGRkYpOwotCi0JU0RFX1JFR19XUklURSgmY3R4LT5odywgUVNFRUQzX1BIQVNFX1NURVBfVVZfViArIGlkeCwKLQkJc2NhbGVyM19jZmctPnBoYXNlX3N0ZXBfeVsxXSAmIDB4RkZGRkZGKTsKLQotCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19QUkVMT0FEICsgaWR4LCBwcmVsb2FkKTsKLQotCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19TUkNfU0laRV9ZX1JHQl9BICsgaWR4LCBzcmNfeV9yZ2IpOwotCi0JU0RFX1JFR19XUklURSgmY3R4LT5odywgUVNFRUQzX1NSQ19TSVpFX1VWICsgaWR4LCBzcmNfdXYpOwotCi0JU0RFX1JFR19XUklURSgmY3R4LT5odywgUVNFRUQzX0RTVF9TSVpFICsgaWR4LCBkc3QpOwotCi1lbmQ6Ci0JaWYgKCFTREVfRk9STUFUX0lTX0RYKHNzcHAtPmxheW91dC5mb3JtYXQpKQotCQlvcF9tb2RlIHw9IEJJVCgxNCk7Ci0KLQlpZiAoc3NwcC0+bGF5b3V0LmZvcm1hdC0+YWxwaGFfZW5hYmxlKSB7Ci0JCW9wX21vZGUgfD0gQklUKDEwKTsKLQkJaWYgKGN0eC0+Y2FwLT5zYmxrLT5zY2FsZXJfYmxrLnZlcnNpb24gPT0gMHgxMDAyKQotCQkJb3BfbW9kZSB8PSAoc2NhbGVyM19jZmctPmFscGhhX2ZpbHRlcl9jZmcgJiAweDEpIDw8IDMwOwotCQllbHNlCi0JCQlvcF9tb2RlIHw9IChzY2FsZXIzX2NmZy0+YWxwaGFfZmlsdGVyX2NmZyAmIDB4MykgPDwgMjk7Ci0JfQotCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIFFTRUVEM19PUF9NT0RFICsgaWR4LCBvcF9tb2RlKTsKKwlzZGVfaHdfc2V0dXBfc2NhbGVyMygmY3R4LT5odywgc2NhbGVyM19jZmcsIGlkeCwKKwkJCWN0eC0+Y2FwLT5zYmxrLT5zY2FsZXJfYmxrLnZlcnNpb24sCisJCQlzc3BwLT5sYXlvdXQuZm9ybWF0KTsKIH0KIAogc3RhdGljIHUzMiBfc2RlX2h3X3NzcHBfZ2V0X3NjYWxlcjNfdmVyKHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4KQpAQCAtNzk3LDcgKzUzMSw3IEBACiAJaWYgKCFjdHggfHwgX3NzcHBfc3ViYmxrX29mZnNldChjdHgsIFNERV9TU1BQX1NDQUxFUl9RU0VFRDMsICZpZHgpKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBTREVfUkVHX1JFQUQoJmN0eC0+aHcsIFFTRUVEM19IV19WRVJTSU9OICsgaWR4KTsKKwlyZXR1cm4gc2RlX2h3X2dldF9zY2FsZXIzX3ZlcigmY3R4LT5odywgaWR4KTsKIH0KIAogLyoqCkBAIC0xMTQwLDEwICs4NzQsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgc2RlX2h3X3NzcHBfc2V0dXBfY2RwKHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4LAotCQlzdHJ1Y3Qgc2RlX2h3X3BpcGVfY2RwX2NmZyAqY2ZnKQorCQlzdHJ1Y3Qgc2RlX2h3X3BpcGVfY2RwX2NmZyAqY2ZnLAorCQllbnVtIHNkZV9zc3BwX211bHRpcmVjdF9pbmRleCBpbmRleCkKIHsKIAl1MzIgaWR4OwogCXUzMiBjZHBfY250bCA9IDA7CisJdTMyIGNkcF9jbnRsX29mZnNldCA9IDA7CiAKIAlpZiAoIWN0eCB8fCAhY2ZnKQogCQlyZXR1cm47CkBAIC0xMTUxLDYgKzg4NywxMyBAQAogCWlmIChfc3NwcF9zdWJibGtfb2Zmc2V0KGN0eCwgU0RFX1NTUFBfU1JDLCAmaWR4KSkKIAkJcmV0dXJuOwogCisJaWYgKGluZGV4ID09IFNERV9TU1BQX1JFQ1RfMCkKKwkJY2RwX2NudGxfb2Zmc2V0ID0gU1NQUF9DRFBfQ05UTDsKKwllbHNlIGlmIChpbmRleCA9PSBTREVfU1NQUF9SRUNUXzEpCisJCWNkcF9jbnRsX29mZnNldCA9IFNTUFBfQ0RQX0NOVExfUkVDMTsKKwllbHNlCisJCXJldHVybjsKKwogCWlmIChjZmctPmVuYWJsZSkKIAkJY2RwX2NudGwgfD0gQklUKDApOwogCWlmIChjZmctPnVid2NfbWV0YV9lbmFibGUpCkBAIC0xMTYwLDcgKzkwMyw3IEBACiAJaWYgKGNmZy0+cHJlbG9hZF9haGVhZCA9PSBTREVfU1NQUF9DRFBfUFJFTE9BRF9BSEVBRF82NCkKIAkJY2RwX2NudGwgfD0gQklUKDMpOwogCi0JU0RFX1JFR19XUklURSgmY3R4LT5odywgU1NQUF9DRFBfQ05UTCwgY2RwX2NudGwpOworCVNERV9SRUdfV1JJVEUoJmN0eC0+aHcsIGNkcF9jbnRsX29mZnNldCwgY2RwX2NudGwpOwogfQogCiBzdGF0aWMgdm9pZCBfc2V0dXBfbGF5ZXJfb3BzKHN0cnVjdCBzZGVfaHdfcGlwZSAqYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19zc3BwLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfc3NwcC5oCmluZGV4IDg3MDA2MjcuLmQzMmM5ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od19zc3BwLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3NzcHAuaApAQCAtMTU2LDExNCArMTU2LDYgQEAKIH07CiAKIC8qKgotICogc3RydWN0IHNkZV9od19zY2FsZXIzX2RlX2NmZyA6IFFTRUVEdjMgZGV0YWlsIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24KLSAqIEBlbmFibGU6ICAgICAgICAgZGV0YWlsIGVuaGFuY2VyIGVuYWJsZS9kaXNhYmxlCi0gKiBAc2hhcnBlbl9sZXZlbDE6IHNoYXJwZW5pbmcgc3RyZW5ndGggZm9yIG5vaXNlCi0gKiBAc2hhcnBlbl9sZXZlbDI6IHNoYXJwZW5pbmcgc3RyZW5ndGggZm9yIHNpZ25hbAotICogQCBjbGlwOiAgICAgICAgICBjbGlwIHNoaWZ0Ci0gKiBAIGxpbWl0OiAgICAgICAgIGxpbWl0IHZhbHVlCi0gKiBAIHRocl9xdWlldDogICAgIHF1aWV0IHRocmVzaG9sZAotICogQCB0aHJfZGllb3V0OiAgICBkaWVvdXQgdGhyZXNob2xkCi0gKiBAIHRocl9oaWdoOiAgICAgIGxvdyB0aHJlc2hvbGQKLSAqIEAgdGhyX2hpZ2g6ICAgICAgaGlnaCB0aHJlc2hvbGQKLSAqIEAgcHJlY19zaGlmdDogICAgcHJlY2lzaW9uIHNoaWZ0Ci0gKiBAIGFkanVzdF9hOiAgICAgIEEtY29lZmZpY2llbnRzIGZvciBtYXBwaW5nIGN1cnZlCi0gKiBAIGFkanVzdF9iOiAgICAgIEItY29lZmZpY2llbnRzIGZvciBtYXBwaW5nIGN1cnZlCi0gKiBAIGFkanVzdF9jOiAgICAgIEMtY29lZmZpY2llbnRzIGZvciBtYXBwaW5nIGN1cnZlCi0gKi8KLXN0cnVjdCBzZGVfaHdfc2NhbGVyM19kZV9jZmcgewotCXUzMiBlbmFibGU7Ci0JaW50MTZfdCBzaGFycGVuX2xldmVsMTsKLQlpbnQxNl90IHNoYXJwZW5fbGV2ZWwyOwotCXVpbnQxNl90IGNsaXA7Ci0JdWludDE2X3QgbGltaXQ7Ci0JdWludDE2X3QgdGhyX3F1aWV0OwotCXVpbnQxNl90IHRocl9kaWVvdXQ7Ci0JdWludDE2X3QgdGhyX2xvdzsKLQl1aW50MTZfdCB0aHJfaGlnaDsKLQl1aW50MTZfdCBwcmVjX3NoaWZ0OwotCWludDE2X3QgYWRqdXN0X2FbU0RFX01BWF9ERV9DVVJWRVNdOwotCWludDE2X3QgYWRqdXN0X2JbU0RFX01BWF9ERV9DVVJWRVNdOwotCWludDE2X3QgYWRqdXN0X2NbU0RFX01BWF9ERV9DVVJWRVNdOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnIDogUVNFRUR2MyBjb25maWd1cmF0aW9uCi0gKiBAZW5hYmxlOiAgICAgICAgc2NhbGVyIGVuYWJsZQotICogQGRpcl9lbjogICAgICAgIGRpcmVjdGlvbiBkZXRlY3Rpb24gYmxvY2sgZW5hYmxlCi0gKiBAIGluaXRfcGhhc2VfeDogaG9yaXpvbnRhbCBpbml0aWFsIHBoYXNlCi0gKiBAIHBoYXNlX3N0ZXBfeDogaG9yaXpvbnRhbCBwaGFzZSBzdGVwCi0gKiBAIGluaXRfcGhhc2VfeTogdmVydGljYWwgaW5pdGlhbCBwaGFzZQotICogQCBwaGFzZV9zdGVwX3k6IHZlcnRpY2FsIHBoYXNlIHN0ZXAKLSAqIEAgcHJlbG9hZF94OiAgICBob3Jpem9udGFsIHByZWxvYWQgdmFsdWUKLSAqIEAgcHJlbG9hZF95OiAgICB2ZXJ0aWNhbCBwcmVsb2FkIHZhbHVlCi0gKiBAIHNyY193aWR0aDogICAgc291cmNlIHdpZHRoCi0gKiBAIHNyY19oZWlnaHQ6ICAgc291cmNlIGhlaWdodAotICogQCBkc3Rfd2lkdGg6ICAgIGRlc3RpbmF0aW9uIHdpZHRoCi0gKiBAIGRzdF9oZWlnaHQ6ICAgZGVzdGluYXRpb24gaGVpZ2h0Ci0gKiBAIHlfcmdiX2ZpbHRlcl9jZmc6IHkvcmdiIHBsYW5lIGZpbHRlciBjb25maWd1cmF0aW9uCi0gKiBAIHV2X2ZpbHRlcl9jZmc6IHV2IHBsYW5lIGZpbHRlciBjb25maWd1cmF0aW9uCi0gKiBAIGFscGhhX2ZpbHRlcl9jZmc6IGFscGhhIGZpbHRlciBjb25maWd1cmF0aW9uCi0gKiBAIGJsZW5kX2NmZzogICAgYmxlbmQgY29lZmZpY2llbnRzIGNvbmZpZ3VyYXRpb24KLSAqIEAgbHV0X2ZsYWc6ICAgICBzY2FsZXIgTFVUIHVwZGF0ZSBmbGFncwotICogICAgICAgICAgICAgICAgIDB4MSBzd2FwIExVVCBiYW5rCi0gKiAgICAgICAgICAgICAgICAgMHgyIHVwZGF0ZSAyRCBmaWx0ZXIgTFVUCi0gKiAgICAgICAgICAgICAgICAgMHg0IHVwZGF0ZSB5IGNpcmN1bGFyIGZpbHRlciBMVVQKLSAqICAgICAgICAgICAgICAgICAweDggdXBkYXRlIHV2IGNpcmN1bGFyIGZpbHRlciBMVVQKLSAqICAgICAgICAgICAgICAgICAweDEwIHVwZGF0ZSB5IHNlcGFyYWJsZSBmaWx0ZXIgTFVUCi0gKiAgICAgICAgICAgICAgICAgMHgyMCB1cGRhdGUgdXYgc2VwYXJhYmxlIGZpbHRlciBMVVQKLSAqIEAgZGlyX2x1dF9pZHg6ICAyRCBmaWx0ZXIgTFVUIGluZGV4Ci0gKiBAIHlfcmdiX2Npcl9sdXRfaWR4OiB5IGNpcmN1bGFyIGZpbHRlciBMVVQgaW5kZXgKLSAqIEAgdXZfY2lyX2x1dF9pZHg6IHV2IGNpcmN1bGFyIGZpbHRlciBMVVQgaW5kZXgKLSAqIEAgeV9yZ2Jfc2VwX2x1dF9pZHg6IHkgY2lyY3VsYXIgZmlsdGVyIExVVCBpbmRleAotICogQCB1dl9zZXBfbHV0X2lkeDogdXYgc2VwYXJhYmxlIGZpbHRlciBMVVQgaW5kZXgKLSAqIEAgZGlyX2x1dDogICAgICBwb2ludGVyIHRvIDJEIExVVAotICogQCBjaXJfbHV0OiAgICAgIHBvaW50ZXIgdG8gY2lyY3VsYXIgZmlsdGVyIExVVAotICogQCBzZXBfbHV0OiAgICAgIHBvaW50ZXIgdG8gc2VwYXJhYmxlIGZpbHRlciBMVVQKLSAqIEAgZGU6IGRldGFpbCBlbmhhbmNlciBjb25maWd1cmF0aW9uCi0gKi8KLXN0cnVjdCBzZGVfaHdfc2NhbGVyM19jZmcgewotCXUzMiBlbmFibGU7Ci0JdTMyIGRpcl9lbjsKLQlpbnQzMl90IGluaXRfcGhhc2VfeFtTREVfTUFYX1BMQU5FU107Ci0JaW50MzJfdCBwaGFzZV9zdGVwX3hbU0RFX01BWF9QTEFORVNdOwotCWludDMyX3QgaW5pdF9waGFzZV95W1NERV9NQVhfUExBTkVTXTsKLQlpbnQzMl90IHBoYXNlX3N0ZXBfeVtTREVfTUFYX1BMQU5FU107Ci0KLQl1MzIgcHJlbG9hZF94W1NERV9NQVhfUExBTkVTXTsKLQl1MzIgcHJlbG9hZF95W1NERV9NQVhfUExBTkVTXTsKLQl1MzIgc3JjX3dpZHRoW1NERV9NQVhfUExBTkVTXTsKLQl1MzIgc3JjX2hlaWdodFtTREVfTUFYX1BMQU5FU107Ci0KLQl1MzIgZHN0X3dpZHRoOwotCXUzMiBkc3RfaGVpZ2h0OwotCi0JdTMyIHlfcmdiX2ZpbHRlcl9jZmc7Ci0JdTMyIHV2X2ZpbHRlcl9jZmc7Ci0JdTMyIGFscGhhX2ZpbHRlcl9jZmc7Ci0JdTMyIGJsZW5kX2NmZzsKLQotCXUzMiBsdXRfZmxhZzsKLQl1MzIgZGlyX2x1dF9pZHg7Ci0KLQl1MzIgeV9yZ2JfY2lyX2x1dF9pZHg7Ci0JdTMyIHV2X2Npcl9sdXRfaWR4OwotCXUzMiB5X3JnYl9zZXBfbHV0X2lkeDsKLQl1MzIgdXZfc2VwX2x1dF9pZHg7Ci0JdTMyICpkaXJfbHV0OwotCXNpemVfdCBkaXJfbGVuOwotCXUzMiAqY2lyX2x1dDsKLQlzaXplX3QgY2lyX2xlbjsKLQl1MzIgKnNlcF9sdXQ7Ci0Jc2l6ZV90IHNlcF9sZW47Ci0KLQkvKgotCSAqIERldGFpbCBlbmhhbmNlciBzZXR0aW5ncwotCSAqLwotCXN0cnVjdCBzZGVfaHdfc2NhbGVyM19kZV9jZmcgZGU7Ci19OwotCi0vKioKICAqIHN0cnVjdCBzZGVfaHdfcGlwZV9jZmcgOiBQaXBlIGRlc2NyaXB0aW9uCiAgKiBAbGF5b3V0OiAgICBmb3JtYXQgbGF5b3V0IGluZm9ybWF0aW9uIGZvciBwcm9ncmFtbWluZyBidWZmZXIgdG8gaGFyZHdhcmUKICAqIEBzcmNfcmVjdDogIHNyYyBST0ksIGNhbGxlciB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGRpZmZlcmVudCBvcGVyYXRpb25zCkBAIC02MTAsOSArNTAyLDExIEBACiAJICogc2V0dXBfY2RwIC0gc2V0dXAgY2xpZW50IGRyaXZlbiBwcmVmZXRjaAogCSAqIEBjdHg6IFBvaW50ZXIgdG8gcGlwZSBjb250ZXh0CiAJICogQGNmZzogUG9pbnRlciB0byBjZHAgY29uZmlndXJhdGlvbgorCSAqIEBpbmRleDogcmVjdGFuZ2xlIGluZGV4IGluIG11bHRpcmVjdAogCSAqLwogCXZvaWQgKCpzZXR1cF9jZHApKHN0cnVjdCBzZGVfaHdfcGlwZSAqY3R4LAotCQkJc3RydWN0IHNkZV9od19waXBlX2NkcF9jZmcgKmNmZyk7CisJCQlzdHJ1Y3Qgc2RlX2h3X3BpcGVfY2RwX2NmZyAqY2ZnLAorCQkJZW51bSBzZGVfc3NwcF9tdWx0aXJlY3RfaW5kZXggaW5kZXgpOwogCiAJLyoqCiAJICogc2V0dXBfc2VjdXJlX2FkZHJlc3MgLSBzZXR1cCBzZWN1cmVpdHkgc3RhdHVzIG9mIHRoZSBzb3VyY2UgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3V0aWwuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od191dGlsLmMKaW5kZXggN2RmNTczNi4uMDhmZTVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3V0aWwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfdXRpbC5jCkBAIC0xMCw2ICsxMCw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjZGVmaW5lIHByX2ZtdChmbXQpCSJbZHJtOiVzOiVkXSAiIGZtdCwgX19mdW5jX18sIF9fTElORV9fCisKKyNpbmNsdWRlIDx1YXBpL2RybS9zZGVfZHJtLmg+CiAjaW5jbHVkZSAibXNtX2Rydi5oIgogI2luY2x1ZGUgInNkZV9rbXMuaCIKICNpbmNsdWRlICJzZGVfaHdfbWRzcy5oIgpAQCAtMTgsNiArMjAsNTcgQEAKIC8qIHVzaW5nIGEgZmlsZSBzdGF0aWMgdmFyaWFibGVzIGZvciBkZWJ1Z2ZzIGFjY2VzcyAqLwogc3RhdGljIHUzMiBzZGVfaHdfdXRpbF9sb2dfbWFzayA9IFNERV9EQkdfTUFTS19OT05FOwogCisvKiBTREVfU0NBTEVSX1FTRUVEMyAqLworI2RlZmluZSBRU0VFRDNfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUVNFRUQzX09QX01PREUgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFFTRUVEM19SR0IyWV9DT0VGRiAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVCAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgUVNFRUQzX1BIQVNFX1NURVBfWV9IICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFFTRUVEM19QSEFTRV9TVEVQX1lfViAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBRU0VFRDNfUEhBU0VfU1RFUF9VVl9IICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgUVNFRUQzX1BIQVNFX1NURVBfVVZfViAgICAgICAgICAgICAweDFDCisjZGVmaW5lIFFTRUVEM19QUkVMT0FEICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBRU0VFRDNfREVfU0hBUlBFTiAgICAgICAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgUVNFRUQzX0RFX1NIQVJQRU5fQ1RMICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIFFTRUVEM19ERV9TSEFQRV9DVEwgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBRU0VFRDNfREVfVEhSRVNIT0xEICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgUVNFRUQzX0RFX0FESlVTVF9EQVRBXzAgICAgICAgICAgICAweDM0CisjZGVmaW5lIFFTRUVEM19ERV9BREpVU1RfREFUQV8xICAgICAgICAgICAgMHgzOAorI2RlZmluZSBRU0VFRDNfREVfQURKVVNUX0RBVEFfMiAgICAgICAgICAgIDB4M0MKKyNkZWZpbmUgUVNFRUQzX1NSQ19TSVpFX1lfUkdCX0EgICAgICAgICAgICAweDQwCisjZGVmaW5lIFFTRUVEM19TUkNfU0laRV9VViAgICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBRU0VFRDNfRFNUX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX0NUUkwgICAgICAgICAgICAgICAweDRDCisjZGVmaW5lIFFTRUVEM19DT0VGX0xVVF9TV0FQX0JJVCAgICAgICAgICAgMAorI2RlZmluZSBRU0VFRDNfQ09FRl9MVVRfRElSX0JJVCAgICAgICAgICAgIDEKKyNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX1lfQ0lSX0JJVCAgICAgICAgICAyCisjZGVmaW5lIFFTRUVEM19DT0VGX0xVVF9VVl9DSVJfQklUICAgICAgICAgMworI2RlZmluZSBRU0VFRDNfQ09FRl9MVVRfWV9TRVBfQklUICAgICAgICAgIDQKKyNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUX1VWX1NFUF9CSVQgICAgICAgICA1CisjZGVmaW5lIFFTRUVEM19CVUZGRVJfQ1RSTCAgICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBRU0VFRDNfQ0xLX0NUUkwwICAgICAgICAgICAgICAgICAgIDB4NTQKKyNkZWZpbmUgUVNFRUQzX0NMS19DVFJMMSAgICAgICAgICAgICAgICAgICAweDU4CisjZGVmaW5lIFFTRUVEM19DTEtfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg1QworI2RlZmluZSBRU0VFRDNfTUlTUl9DVFJMICAgICAgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgUVNFRUQzX01JU1JfU0lHTkFUVVJFXzAgICAgICAgICAgICAweDc0CisjZGVmaW5lIFFTRUVEM19NSVNSX1NJR05BVFVSRV8xICAgICAgICAgICAgMHg3OAorI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVF9ZX0ggICAgICAgICAgICAgIDB4OTAKKyNkZWZpbmUgUVNFRUQzX1BIQVNFX0lOSVRfWV9WICAgICAgICAgICAgICAweDk0CisjZGVmaW5lIFFTRUVEM19QSEFTRV9JTklUX1VWX0ggICAgICAgICAgICAgMHg5OAorI2RlZmluZSBRU0VFRDNfUEhBU0VfSU5JVF9VVl9WICAgICAgICAgICAgIDB4OUMKKyNkZWZpbmUgUVNFRUQzX0NPRUZfTFVUICAgICAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBRU0VFRDNfRklMVEVSUyAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUVNFRUQzX0xVVF9SRUdJT05TICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFFTRUVEM19DSVJDVUxBUl9MVVRTICAgICAgICAgICAgICAgOQorI2RlZmluZSBRU0VFRDNfU0VQQVJBQkxFX0xVVFMgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFFTRUVEM19MVVRfU0laRSAgICAgICAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgUVNFRUQzX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFTRUVEM19ESVJfTFVUX1NJWkUgICAgICAgICAgICAgICAgKDIwMCAqIHNpemVvZih1MzIpKQorI2RlZmluZSBRU0VFRDNfQ0lSX0xVVF9TSVpFIFwKKwkoUVNFRUQzX0xVVF9TSVpFICogUVNFRUQzX0NJUkNVTEFSX0xVVFMgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgUVNFRUQzX1NFUF9MVVRfU0laRSBcCisJKFFTRUVEM19MVVRfU0laRSAqIFFTRUVEM19TRVBBUkFCTEVfTFVUUyAqIHNpemVvZih1MzIpKQorCiB2b2lkIHNkZV9yZWdfd3JpdGUoc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqYywKIAkJdTMyIHJlZ19vZmYsCiAJCXUzMiB2YWwsCkBAIC00MCw2ICs5MywyODMgQEAKIAlyZXR1cm4gJnNkZV9od191dGlsX2xvZ19tYXNrOwogfQogCit2b2lkIHNkZV9zZXRfc2NhbGVyX3YyKHN0cnVjdCBzZGVfaHdfc2NhbGVyM19jZmcgKmNmZywKKwkJY29uc3Qgc3RydWN0IHNkZV9kcm1fc2NhbGVyX3YyICpzY2FsZV92MikKK3sKKwlpbnQgaTsKKworCWNmZy0+ZW5hYmxlID0gc2NhbGVfdjItPmVuYWJsZTsKKwljZmctPmRpcl9lbiA9IHNjYWxlX3YyLT5kaXJfZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgU0RFX01BWF9QTEFORVM7IGkrKykgeworCQljZmctPmluaXRfcGhhc2VfeFtpXSA9IHNjYWxlX3YyLT5pbml0X3BoYXNlX3hbaV07CisJCWNmZy0+cGhhc2Vfc3RlcF94W2ldID0gc2NhbGVfdjItPnBoYXNlX3N0ZXBfeFtpXTsKKwkJY2ZnLT5pbml0X3BoYXNlX3lbaV0gPSBzY2FsZV92Mi0+aW5pdF9waGFzZV95W2ldOworCQljZmctPnBoYXNlX3N0ZXBfeVtpXSA9IHNjYWxlX3YyLT5waGFzZV9zdGVwX3lbaV07CisKKwkJY2ZnLT5wcmVsb2FkX3hbaV0gPSBzY2FsZV92Mi0+cHJlbG9hZF94W2ldOworCQljZmctPnByZWxvYWRfeVtpXSA9IHNjYWxlX3YyLT5wcmVsb2FkX3lbaV07CisJCWNmZy0+c3JjX3dpZHRoW2ldID0gc2NhbGVfdjItPnNyY193aWR0aFtpXTsKKwkJY2ZnLT5zcmNfaGVpZ2h0W2ldID0gc2NhbGVfdjItPnNyY19oZWlnaHRbaV07CisJfQorCisJY2ZnLT5kc3Rfd2lkdGggPSBzY2FsZV92Mi0+ZHN0X3dpZHRoOworCWNmZy0+ZHN0X2hlaWdodCA9IHNjYWxlX3YyLT5kc3RfaGVpZ2h0OworCisJY2ZnLT55X3JnYl9maWx0ZXJfY2ZnID0gc2NhbGVfdjItPnlfcmdiX2ZpbHRlcl9jZmc7CisJY2ZnLT51dl9maWx0ZXJfY2ZnID0gc2NhbGVfdjItPnV2X2ZpbHRlcl9jZmc7CisJY2ZnLT5hbHBoYV9maWx0ZXJfY2ZnID0gc2NhbGVfdjItPmFscGhhX2ZpbHRlcl9jZmc7CisJY2ZnLT5ibGVuZF9jZmcgPSBzY2FsZV92Mi0+YmxlbmRfY2ZnOworCisJY2ZnLT5sdXRfZmxhZyA9IHNjYWxlX3YyLT5sdXRfZmxhZzsKKwljZmctPmRpcl9sdXRfaWR4ID0gc2NhbGVfdjItPmRpcl9sdXRfaWR4OworCWNmZy0+eV9yZ2JfY2lyX2x1dF9pZHggPSBzY2FsZV92Mi0+eV9yZ2JfY2lyX2x1dF9pZHg7CisJY2ZnLT51dl9jaXJfbHV0X2lkeCA9IHNjYWxlX3YyLT51dl9jaXJfbHV0X2lkeDsKKwljZmctPnlfcmdiX3NlcF9sdXRfaWR4ID0gc2NhbGVfdjItPnlfcmdiX3NlcF9sdXRfaWR4OworCWNmZy0+dXZfc2VwX2x1dF9pZHggPSBzY2FsZV92Mi0+dXZfc2VwX2x1dF9pZHg7CisKKwljZmctPmRlLmVuYWJsZSA9IHNjYWxlX3YyLT5kZS5lbmFibGU7CisJY2ZnLT5kZS5zaGFycGVuX2xldmVsMSA9IHNjYWxlX3YyLT5kZS5zaGFycGVuX2xldmVsMTsKKwljZmctPmRlLnNoYXJwZW5fbGV2ZWwyID0gc2NhbGVfdjItPmRlLnNoYXJwZW5fbGV2ZWwyOworCWNmZy0+ZGUuY2xpcCA9IHNjYWxlX3YyLT5kZS5jbGlwOworCWNmZy0+ZGUubGltaXQgPSBzY2FsZV92Mi0+ZGUubGltaXQ7CisJY2ZnLT5kZS50aHJfcXVpZXQgPSBzY2FsZV92Mi0+ZGUudGhyX3F1aWV0OworCWNmZy0+ZGUudGhyX2RpZW91dCA9IHNjYWxlX3YyLT5kZS50aHJfZGllb3V0OworCWNmZy0+ZGUudGhyX2xvdyA9IHNjYWxlX3YyLT5kZS50aHJfbG93OworCWNmZy0+ZGUudGhyX2hpZ2ggPSBzY2FsZV92Mi0+ZGUudGhyX2hpZ2g7CisJY2ZnLT5kZS5wcmVjX3NoaWZ0ID0gc2NhbGVfdjItPmRlLnByZWNfc2hpZnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0RFX01BWF9ERV9DVVJWRVM7IGkrKykgeworCQljZmctPmRlLmFkanVzdF9hW2ldID0gc2NhbGVfdjItPmRlLmFkanVzdF9hW2ldOworCQljZmctPmRlLmFkanVzdF9iW2ldID0gc2NhbGVfdjItPmRlLmFkanVzdF9iW2ldOworCQljZmctPmRlLmFkanVzdF9jW2ldID0gc2NhbGVfdjItPmRlLmFkanVzdF9jW2ldOworCX0KK30KKworc3RhdGljIHZvaWQgX3NkZV9od19zZXR1cF9zY2FsZXIzX2x1dChzdHJ1Y3Qgc2RlX2h3X2Jsa19yZWdfbWFwICpjLAorCQlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnICpzY2FsZXIzX2NmZywgdTMyIG9mZnNldCkKK3sKKwlpbnQgaSwgaiwgZmlsdGVyOworCWludCBjb25maWdfbHV0ID0gMHgwOworCXVuc2lnbmVkIGxvbmcgbHV0X2ZsYWdzOworCXUzMiBsdXRfYWRkciwgbHV0X29mZnNldCwgbHV0X2xlbjsKKwl1MzIgKmx1dFtRU0VFRDNfRklMVEVSU10gPSB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisJc3RhdGljIGNvbnN0IHVpbnQzMl90IG9mZl90YmxbUVNFRUQzX0ZJTFRFUlNdW1FTRUVEM19MVVRfUkVHSU9OU11bMl0gPSB7CisJCXt7MTgsIDB4MDAwfSwgezEyLCAweDEyMH0sIHsxMiwgMHgxRTB9LCB7OCwgMHgyQTB9IH0sCisJCXt7NiwgMHgzMjB9LCB7MywgMHgzRTB9LCB7MywgMHg0NDB9LCB7MywgMHg0QTB9IH0sCisJCXt7NiwgMHg1MDB9LCB7MywgMHg1YzB9LCB7MywgMHg2MjB9LCB7MywgMHg2ODB9IH0sCisJCXt7NiwgMHgzODB9LCB7MywgMHg0MTB9LCB7MywgMHg0NzB9LCB7MywgMHg0ZDB9IH0sCisJCXt7NiwgMHg1NjB9LCB7MywgMHg1ZjB9LCB7MywgMHg2NTB9LCB7MywgMHg2YjB9IH0sCisJfTsKKworCWx1dF9mbGFncyA9ICh1bnNpZ25lZCBsb25nKSBzY2FsZXIzX2NmZy0+bHV0X2ZsYWc7CisJaWYgKHRlc3RfYml0KFFTRUVEM19DT0VGX0xVVF9ESVJfQklULCAmbHV0X2ZsYWdzKSAmJgorCQkoc2NhbGVyM19jZmctPmRpcl9sZW4gPT0gUVNFRUQzX0RJUl9MVVRfU0laRSkpIHsKKwkJbHV0WzBdID0gc2NhbGVyM19jZmctPmRpcl9sdXQ7CisJCWNvbmZpZ19sdXQgPSAxOworCX0KKwlpZiAodGVzdF9iaXQoUVNFRUQzX0NPRUZfTFVUX1lfQ0lSX0JJVCwgJmx1dF9mbGFncykgJiYKKwkJKHNjYWxlcjNfY2ZnLT55X3JnYl9jaXJfbHV0X2lkeCA8IFFTRUVEM19DSVJDVUxBUl9MVVRTKSAmJgorCQkoc2NhbGVyM19jZmctPmNpcl9sZW4gPT0gUVNFRUQzX0NJUl9MVVRfU0laRSkpIHsKKwkJbHV0WzFdID0gc2NhbGVyM19jZmctPmNpcl9sdXQgKworCQkJc2NhbGVyM19jZmctPnlfcmdiX2Npcl9sdXRfaWR4ICogUVNFRUQzX0xVVF9TSVpFOworCQljb25maWdfbHV0ID0gMTsKKwl9CisJaWYgKHRlc3RfYml0KFFTRUVEM19DT0VGX0xVVF9VVl9DSVJfQklULCAmbHV0X2ZsYWdzKSAmJgorCQkoc2NhbGVyM19jZmctPnV2X2Npcl9sdXRfaWR4IDwgUVNFRUQzX0NJUkNVTEFSX0xVVFMpICYmCisJCShzY2FsZXIzX2NmZy0+Y2lyX2xlbiA9PSBRU0VFRDNfQ0lSX0xVVF9TSVpFKSkgeworCQlsdXRbMl0gPSBzY2FsZXIzX2NmZy0+Y2lyX2x1dCArCisJCQlzY2FsZXIzX2NmZy0+dXZfY2lyX2x1dF9pZHggKiBRU0VFRDNfTFVUX1NJWkU7CisJCWNvbmZpZ19sdXQgPSAxOworCX0KKwlpZiAodGVzdF9iaXQoUVNFRUQzX0NPRUZfTFVUX1lfU0VQX0JJVCwgJmx1dF9mbGFncykgJiYKKwkJKHNjYWxlcjNfY2ZnLT55X3JnYl9zZXBfbHV0X2lkeCA8IFFTRUVEM19TRVBBUkFCTEVfTFVUUykgJiYKKwkJKHNjYWxlcjNfY2ZnLT5zZXBfbGVuID09IFFTRUVEM19TRVBfTFVUX1NJWkUpKSB7CisJCWx1dFszXSA9IHNjYWxlcjNfY2ZnLT5zZXBfbHV0ICsKKwkJCXNjYWxlcjNfY2ZnLT55X3JnYl9zZXBfbHV0X2lkeCAqIFFTRUVEM19MVVRfU0laRTsKKwkJY29uZmlnX2x1dCA9IDE7CisJfQorCWlmICh0ZXN0X2JpdChRU0VFRDNfQ09FRl9MVVRfVVZfU0VQX0JJVCwgJmx1dF9mbGFncykgJiYKKwkJKHNjYWxlcjNfY2ZnLT51dl9zZXBfbHV0X2lkeCA8IFFTRUVEM19TRVBBUkFCTEVfTFVUUykgJiYKKwkJKHNjYWxlcjNfY2ZnLT5zZXBfbGVuID09IFFTRUVEM19TRVBfTFVUX1NJWkUpKSB7CisJCWx1dFs0XSA9IHNjYWxlcjNfY2ZnLT5zZXBfbHV0ICsKKwkJCXNjYWxlcjNfY2ZnLT51dl9zZXBfbHV0X2lkeCAqIFFTRUVEM19MVVRfU0laRTsKKwkJY29uZmlnX2x1dCA9IDE7CisJfQorCisJaWYgKGNvbmZpZ19sdXQpIHsKKwkJZm9yIChmaWx0ZXIgPSAwOyBmaWx0ZXIgPCBRU0VFRDNfRklMVEVSUzsgZmlsdGVyKyspIHsKKwkJCWlmICghbHV0W2ZpbHRlcl0pCisJCQkJY29udGludWU7CisJCQlsdXRfb2Zmc2V0ID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBRU0VFRDNfTFVUX1JFR0lPTlM7IGkrKykgeworCQkJCWx1dF9hZGRyID0gUVNFRUQzX0NPRUZfTFVUICsgb2Zmc2V0CisJCQkJCSsgb2ZmX3RibFtmaWx0ZXJdW2ldWzFdOworCQkJCWx1dF9sZW4gPSBvZmZfdGJsW2ZpbHRlcl1baV1bMF0gPDwgMjsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbHV0X2xlbjsgaisrKSB7CisJCQkJCVNERV9SRUdfV1JJVEUoYywKKwkJCQkJCWx1dF9hZGRyLAorCQkJCQkJKGx1dFtmaWx0ZXJdKVtsdXRfb2Zmc2V0KytdKTsKKwkJCQkJbHV0X2FkZHIgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoUVNFRUQzX0NPRUZfTFVUX1NXQVBfQklULCAmbHV0X2ZsYWdzKSkKKwkJU0RFX1JFR19XUklURShjLCBRU0VFRDNfQ09FRl9MVVRfQ1RSTCArIG9mZnNldCwgQklUKDApKTsKKworfQorCitzdGF0aWMgdm9pZCBfc2RlX2h3X3NldHVwX3NjYWxlcjNfZGUoc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqYywKKwkJc3RydWN0IHNkZV9od19zY2FsZXIzX2RlX2NmZyAqZGVfY2ZnLCB1MzIgb2Zmc2V0KQoreworCXUzMiBzaGFycF9sdmwsIHNoYXJwX2N0bCwgc2hhcGVfY3RsLCBkZV90aHI7CisJdTMyIGFkanVzdF9hLCBhZGp1c3RfYiwgYWRqdXN0X2M7CisKKwlpZiAoIWRlX2NmZy0+ZW5hYmxlKQorCQlyZXR1cm47CisKKwlzaGFycF9sdmwgPSAoZGVfY2ZnLT5zaGFycGVuX2xldmVsMSAmIDB4MUZGKSB8CisJCSgoZGVfY2ZnLT5zaGFycGVuX2xldmVsMiAmIDB4MUZGKSA8PCAxNik7CisKKwlzaGFycF9jdGwgPSAoKGRlX2NmZy0+bGltaXQgJiAweEYpIDw8IDkpIHwKKwkJKChkZV9jZmctPnByZWNfc2hpZnQgJiAweDcpIDw8IDEzKSB8CisJCSgoZGVfY2ZnLT5jbGlwICYgMHg3KSA8PCAxNik7CisKKwlzaGFwZV9jdGwgPSAoZGVfY2ZnLT50aHJfcXVpZXQgJiAweEZGKSB8CisJCSgoZGVfY2ZnLT50aHJfZGllb3V0ICYgMHgzRkYpIDw8IDE2KTsKKworCWRlX3RociA9IChkZV9jZmctPnRocl9sb3cgJiAweDNGRikgfAorCQkoKGRlX2NmZy0+dGhyX2hpZ2ggJiAweDNGRikgPDwgMTYpOworCisJYWRqdXN0X2EgPSAoZGVfY2ZnLT5hZGp1c3RfYVswXSAmIDB4M0ZGKSB8CisJCSgoZGVfY2ZnLT5hZGp1c3RfYVsxXSAmIDB4M0ZGKSA8PCAxMCkgfAorCQkoKGRlX2NmZy0+YWRqdXN0X2FbMl0gJiAweDNGRikgPDwgMjApOworCisJYWRqdXN0X2IgPSAoZGVfY2ZnLT5hZGp1c3RfYlswXSAmIDB4M0ZGKSB8CisJCSgoZGVfY2ZnLT5hZGp1c3RfYlsxXSAmIDB4M0ZGKSA8PCAxMCkgfAorCQkoKGRlX2NmZy0+YWRqdXN0X2JbMl0gJiAweDNGRikgPDwgMjApOworCisJYWRqdXN0X2MgPSAoZGVfY2ZnLT5hZGp1c3RfY1swXSAmIDB4M0ZGKSB8CisJCSgoZGVfY2ZnLT5hZGp1c3RfY1sxXSAmIDB4M0ZGKSA8PCAxMCkgfAorCQkoKGRlX2NmZy0+YWRqdXN0X2NbMl0gJiAweDNGRikgPDwgMjApOworCisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfREVfU0hBUlBFTiArIG9mZnNldCwgc2hhcnBfbHZsKTsKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19ERV9TSEFSUEVOX0NUTCArIG9mZnNldCwgc2hhcnBfY3RsKTsKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19ERV9TSEFQRV9DVEwgKyBvZmZzZXQsIHNoYXBlX2N0bCk7CisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfREVfVEhSRVNIT0xEICsgb2Zmc2V0LCBkZV90aHIpOworCVNERV9SRUdfV1JJVEUoYywgUVNFRUQzX0RFX0FESlVTVF9EQVRBXzAgKyBvZmZzZXQsIGFkanVzdF9hKTsKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19ERV9BREpVU1RfREFUQV8xICsgb2Zmc2V0LCBhZGp1c3RfYik7CisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfREVfQURKVVNUX0RBVEFfMiArIG9mZnNldCwgYWRqdXN0X2MpOworCit9CisKK3ZvaWQgc2RlX2h3X3NldHVwX3NjYWxlcjMoc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqYywKKwkJc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyAqc2NhbGVyM19jZmcsCisJCXUzMiBzY2FsZXJfb2Zmc2V0LCB1MzIgc2NhbGVyX3ZlcnNpb24sCisJCWNvbnN0IHN0cnVjdCBzZGVfZm9ybWF0ICpmb3JtYXQpCit7CisJdTMyIG9wX21vZGUgPSAwOworCXUzMiBwaGFzZV9pbml0LCBwcmVsb2FkLCBzcmNfeV9yZ2IsIHNyY191diwgZHN0OworCisJaWYgKCFzY2FsZXIzX2NmZy0+ZW5hYmxlKQorCQlnb3RvIGVuZDsKKworCW9wX21vZGUgfD0gQklUKDApOworCW9wX21vZGUgfD0gKHNjYWxlcjNfY2ZnLT55X3JnYl9maWx0ZXJfY2ZnICYgMHgzKSA8PCAxNjsKKworCWlmIChmb3JtYXQgJiYgU0RFX0ZPUk1BVF9JU19ZVVYoZm9ybWF0KSkgeworCQlvcF9tb2RlIHw9IEJJVCgxMik7CisJCW9wX21vZGUgfD0gKHNjYWxlcjNfY2ZnLT51dl9maWx0ZXJfY2ZnICYgMHgzKSA8PCAyNDsKKwl9CisKKwlvcF9tb2RlIHw9IChzY2FsZXIzX2NmZy0+YmxlbmRfY2ZnICYgMSkgPDwgMzE7CisJb3BfbW9kZSB8PSAoc2NhbGVyM19jZmctPmRpcl9lbikgPyBCSVQoNCkgOiAwOworCisJcHJlbG9hZCA9CisJCSgoc2NhbGVyM19jZmctPnByZWxvYWRfeFswXSAmIDB4N0YpIDw8IDApIHwKKwkJKChzY2FsZXIzX2NmZy0+cHJlbG9hZF95WzBdICYgMHg3RikgPDwgOCkgfAorCQkoKHNjYWxlcjNfY2ZnLT5wcmVsb2FkX3hbMV0gJiAweDdGKSA8PCAxNikgfAorCQkoKHNjYWxlcjNfY2ZnLT5wcmVsb2FkX3lbMV0gJiAweDdGKSA8PCAyNCk7CisKKwlzcmNfeV9yZ2IgPSAoc2NhbGVyM19jZmctPnNyY193aWR0aFswXSAmIDB4MUZGRkYpIHwKKwkJKChzY2FsZXIzX2NmZy0+c3JjX2hlaWdodFswXSAmIDB4MUZGRkYpIDw8IDE2KTsKKworCXNyY191diA9IChzY2FsZXIzX2NmZy0+c3JjX3dpZHRoWzFdICYgMHgxRkZGRikgfAorCQkoKHNjYWxlcjNfY2ZnLT5zcmNfaGVpZ2h0WzFdICYgMHgxRkZGRikgPDwgMTYpOworCisJZHN0ID0gKHNjYWxlcjNfY2ZnLT5kc3Rfd2lkdGggJiAweDFGRkZGKSB8CisJCSgoc2NhbGVyM19jZmctPmRzdF9oZWlnaHQgJiAweDFGRkZGKSA8PCAxNik7CisKKwlpZiAoc2NhbGVyM19jZmctPmRlLmVuYWJsZSkgeworCQlfc2RlX2h3X3NldHVwX3NjYWxlcjNfZGUoYywgJnNjYWxlcjNfY2ZnLT5kZSwgc2NhbGVyX29mZnNldCk7CisJCW9wX21vZGUgfD0gQklUKDgpOworCX0KKworCWlmIChzY2FsZXIzX2NmZy0+bHV0X2ZsYWcpCisJCV9zZGVfaHdfc2V0dXBfc2NhbGVyM19sdXQoYywgc2NhbGVyM19jZmcsCisJCQkJCQkJCXNjYWxlcl9vZmZzZXQpOworCisJaWYgKHNjYWxlcl92ZXJzaW9uID09IDB4MTAwMikgeworCQlwaGFzZV9pbml0ID0KKwkJCSgoc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeFswXSAmIDB4M0YpIDw8IDApIHwKKwkJCSgoc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeVswXSAmIDB4M0YpIDw8IDgpIHwKKwkJCSgoc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeFsxXSAmIDB4M0YpIDw8IDE2KSB8CisJCQkoKHNjYWxlcjNfY2ZnLT5pbml0X3BoYXNlX3lbMV0gJiAweDNGKSA8PCAyNCk7CisJCVNERV9SRUdfV1JJVEUoYywgUVNFRUQzX1BIQVNFX0lOSVQgKyBzY2FsZXJfb2Zmc2V0LCBwaGFzZV9pbml0KTsKKwl9IGVsc2UgeworCQlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19QSEFTRV9JTklUX1lfSCArIHNjYWxlcl9vZmZzZXQsCisJCQlzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV94WzBdICYgMHgxRkZGRkYpOworCQlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19QSEFTRV9JTklUX1lfViArIHNjYWxlcl9vZmZzZXQsCisJCQlzY2FsZXIzX2NmZy0+aW5pdF9waGFzZV95WzBdICYgMHgxRkZGRkYpOworCQlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19QSEFTRV9JTklUX1VWX0ggKyBzY2FsZXJfb2Zmc2V0LAorCQkJc2NhbGVyM19jZmctPmluaXRfcGhhc2VfeFsxXSAmIDB4MUZGRkZGKTsKKwkJU0RFX1JFR19XUklURShjLCBRU0VFRDNfUEhBU0VfSU5JVF9VVl9WICsgc2NhbGVyX29mZnNldCwKKwkJCXNjYWxlcjNfY2ZnLT5pbml0X3BoYXNlX3lbMV0gJiAweDFGRkZGRik7CisJfQorCisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfUEhBU0VfU1RFUF9ZX0ggKyBzY2FsZXJfb2Zmc2V0LAorCQlzY2FsZXIzX2NmZy0+cGhhc2Vfc3RlcF94WzBdICYgMHhGRkZGRkYpOworCisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfUEhBU0VfU1RFUF9ZX1YgKyBzY2FsZXJfb2Zmc2V0LAorCQlzY2FsZXIzX2NmZy0+cGhhc2Vfc3RlcF95WzBdICYgMHhGRkZGRkYpOworCisJU0RFX1JFR19XUklURShjLCBRU0VFRDNfUEhBU0VfU1RFUF9VVl9IICsgc2NhbGVyX29mZnNldCwKKwkJc2NhbGVyM19jZmctPnBoYXNlX3N0ZXBfeFsxXSAmIDB4RkZGRkZGKTsKKworCVNERV9SRUdfV1JJVEUoYywgUVNFRUQzX1BIQVNFX1NURVBfVVZfViArIHNjYWxlcl9vZmZzZXQsCisJCXNjYWxlcjNfY2ZnLT5waGFzZV9zdGVwX3lbMV0gJiAweEZGRkZGRik7CisKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19QUkVMT0FEICsgc2NhbGVyX29mZnNldCwgcHJlbG9hZCk7CisKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19TUkNfU0laRV9ZX1JHQl9BICsgc2NhbGVyX29mZnNldCwgc3JjX3lfcmdiKTsKKworCVNERV9SRUdfV1JJVEUoYywgUVNFRUQzX1NSQ19TSVpFX1VWICsgc2NhbGVyX29mZnNldCwgc3JjX3V2KTsKKworCVNERV9SRUdfV1JJVEUoYywgUVNFRUQzX0RTVF9TSVpFICsgc2NhbGVyX29mZnNldCwgZHN0KTsKKworZW5kOgorCWlmIChmb3JtYXQgJiYgIVNERV9GT1JNQVRfSVNfRFgoZm9ybWF0KSkKKwkJb3BfbW9kZSB8PSBCSVQoMTQpOworCisJaWYgKGZvcm1hdCAmJiBmb3JtYXQtPmFscGhhX2VuYWJsZSkgeworCQlvcF9tb2RlIHw9IEJJVCgxMCk7CisJCWlmIChzY2FsZXJfdmVyc2lvbiA9PSAweDEwMDIpCisJCQlvcF9tb2RlIHw9IChzY2FsZXIzX2NmZy0+YWxwaGFfZmlsdGVyX2NmZyAmIDB4MSkgPDwgMzA7CisJCWVsc2UKKwkJCW9wX21vZGUgfD0gKHNjYWxlcjNfY2ZnLT5hbHBoYV9maWx0ZXJfY2ZnICYgMHgzKSA8PCAyOTsKKwl9CisKKwlTREVfUkVHX1dSSVRFKGMsIFFTRUVEM19PUF9NT0RFICsgc2NhbGVyX29mZnNldCwgb3BfbW9kZSk7Cit9CisKK3UzMiBzZGVfaHdfZ2V0X3NjYWxlcjNfdmVyKHN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmMsCisJCQl1MzIgc2NhbGVyX29mZnNldCkKK3sKKwlyZXR1cm4gU0RFX1JFR19SRUFEKGMsIFFTRUVEM19IV19WRVJTSU9OICsgc2NhbGVyX29mZnNldCk7Cit9CisKIHZvaWQgc2RlX2h3X2NzY19zZXR1cChzdHJ1Y3Qgc2RlX2h3X2Jsa19yZWdfbWFwICpjLAogCQl1MzIgY3NjX3JlZ19vZmYsCiAJCXN0cnVjdCBzZGVfY3NjX2NmZyAqZGF0YSwgYm9vbCBjc2MxMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od191dGlsLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaHdfdXRpbC5oCmluZGV4IGFhM2Q1YjkuLjcyMGUxMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9od191dGlsLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2h3X3V0aWwuaApAQCAtMzksNiArMzksMTI1IEBACiAJdTMyIGxvZ19tYXNrOwogfTsKIAorLyoqCisgKiBzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfZGVfY2ZnIDogUVNFRUR2MyBkZXRhaWwgZW5oYW5jZXIgY29uZmlndXJhdGlvbgorICogQGVuYWJsZTogICAgICAgICBkZXRhaWwgZW5oYW5jZXIgZW5hYmxlL2Rpc2FibGUKKyAqIEBzaGFycGVuX2xldmVsMTogc2hhcnBlbmluZyBzdHJlbmd0aCBmb3Igbm9pc2UKKyAqIEBzaGFycGVuX2xldmVsMjogc2hhcnBlbmluZyBzdHJlbmd0aCBmb3Igc2lnbmFsCisgKiBAIGNsaXA6ICAgICAgICAgIGNsaXAgc2hpZnQKKyAqIEAgbGltaXQ6ICAgICAgICAgbGltaXQgdmFsdWUKKyAqIEAgdGhyX3F1aWV0OiAgICAgcXVpZXQgdGhyZXNob2xkCisgKiBAIHRocl9kaWVvdXQ6ICAgIGRpZW91dCB0aHJlc2hvbGQKKyAqIEAgdGhyX2hpZ2g6ICAgICAgbG93IHRocmVzaG9sZAorICogQCB0aHJfaGlnaDogICAgICBoaWdoIHRocmVzaG9sZAorICogQCBwcmVjX3NoaWZ0OiAgICBwcmVjaXNpb24gc2hpZnQKKyAqIEAgYWRqdXN0X2E6ICAgICAgQS1jb2VmZmljaWVudHMgZm9yIG1hcHBpbmcgY3VydmUKKyAqIEAgYWRqdXN0X2I6ICAgICAgQi1jb2VmZmljaWVudHMgZm9yIG1hcHBpbmcgY3VydmUKKyAqIEAgYWRqdXN0X2M6ICAgICAgQy1jb2VmZmljaWVudHMgZm9yIG1hcHBpbmcgY3VydmUKKyAqLworc3RydWN0IHNkZV9od19zY2FsZXIzX2RlX2NmZyB7CisJdTMyIGVuYWJsZTsKKwlpbnQxNl90IHNoYXJwZW5fbGV2ZWwxOworCWludDE2X3Qgc2hhcnBlbl9sZXZlbDI7CisJdWludDE2X3QgY2xpcDsKKwl1aW50MTZfdCBsaW1pdDsKKwl1aW50MTZfdCB0aHJfcXVpZXQ7CisJdWludDE2X3QgdGhyX2RpZW91dDsKKwl1aW50MTZfdCB0aHJfbG93OworCXVpbnQxNl90IHRocl9oaWdoOworCXVpbnQxNl90IHByZWNfc2hpZnQ7CisJaW50MTZfdCBhZGp1c3RfYVtTREVfTUFYX0RFX0NVUlZFU107CisJaW50MTZfdCBhZGp1c3RfYltTREVfTUFYX0RFX0NVUlZFU107CisJaW50MTZfdCBhZGp1c3RfY1tTREVfTUFYX0RFX0NVUlZFU107Cit9OworCisKKy8qKgorICogc3RydWN0IHNkZV9od19zY2FsZXIzX2NmZyA6IFFTRUVEdjMgY29uZmlndXJhdGlvbgorICogQGVuYWJsZTogICAgICAgIHNjYWxlciBlbmFibGUKKyAqIEBkaXJfZW46ICAgICAgICBkaXJlY3Rpb24gZGV0ZWN0aW9uIGJsb2NrIGVuYWJsZQorICogQCBpbml0X3BoYXNlX3g6IGhvcml6b250YWwgaW5pdGlhbCBwaGFzZQorICogQCBwaGFzZV9zdGVwX3g6IGhvcml6b250YWwgcGhhc2Ugc3RlcAorICogQCBpbml0X3BoYXNlX3k6IHZlcnRpY2FsIGluaXRpYWwgcGhhc2UKKyAqIEAgcGhhc2Vfc3RlcF95OiB2ZXJ0aWNhbCBwaGFzZSBzdGVwCisgKiBAIHByZWxvYWRfeDogICAgaG9yaXpvbnRhbCBwcmVsb2FkIHZhbHVlCisgKiBAIHByZWxvYWRfeTogICAgdmVydGljYWwgcHJlbG9hZCB2YWx1ZQorICogQCBzcmNfd2lkdGg6ICAgIHNvdXJjZSB3aWR0aAorICogQCBzcmNfaGVpZ2h0OiAgIHNvdXJjZSBoZWlnaHQKKyAqIEAgZHN0X3dpZHRoOiAgICBkZXN0aW5hdGlvbiB3aWR0aAorICogQCBkc3RfaGVpZ2h0OiAgIGRlc3RpbmF0aW9uIGhlaWdodAorICogQCB5X3JnYl9maWx0ZXJfY2ZnOiB5L3JnYiBwbGFuZSBmaWx0ZXIgY29uZmlndXJhdGlvbgorICogQCB1dl9maWx0ZXJfY2ZnOiB1diBwbGFuZSBmaWx0ZXIgY29uZmlndXJhdGlvbgorICogQCBhbHBoYV9maWx0ZXJfY2ZnOiBhbHBoYSBmaWx0ZXIgY29uZmlndXJhdGlvbgorICogQCBibGVuZF9jZmc6ICAgIGJsZW5kIGNvZWZmaWNpZW50cyBjb25maWd1cmF0aW9uCisgKiBAIGx1dF9mbGFnOiAgICAgc2NhbGVyIExVVCB1cGRhdGUgZmxhZ3MKKyAqICAgICAgICAgICAgICAgICAweDEgc3dhcCBMVVQgYmFuaworICogICAgICAgICAgICAgICAgIDB4MiB1cGRhdGUgMkQgZmlsdGVyIExVVAorICogICAgICAgICAgICAgICAgIDB4NCB1cGRhdGUgeSBjaXJjdWxhciBmaWx0ZXIgTFVUCisgKiAgICAgICAgICAgICAgICAgMHg4IHVwZGF0ZSB1diBjaXJjdWxhciBmaWx0ZXIgTFVUCisgKiAgICAgICAgICAgICAgICAgMHgxMCB1cGRhdGUgeSBzZXBhcmFibGUgZmlsdGVyIExVVAorICogICAgICAgICAgICAgICAgIDB4MjAgdXBkYXRlIHV2IHNlcGFyYWJsZSBmaWx0ZXIgTFVUCisgKiBAIGRpcl9sdXRfaWR4OiAgMkQgZmlsdGVyIExVVCBpbmRleAorICogQCB5X3JnYl9jaXJfbHV0X2lkeDogeSBjaXJjdWxhciBmaWx0ZXIgTFVUIGluZGV4CisgKiBAIHV2X2Npcl9sdXRfaWR4OiB1diBjaXJjdWxhciBmaWx0ZXIgTFVUIGluZGV4CisgKiBAIHlfcmdiX3NlcF9sdXRfaWR4OiB5IGNpcmN1bGFyIGZpbHRlciBMVVQgaW5kZXgKKyAqIEAgdXZfc2VwX2x1dF9pZHg6IHV2IHNlcGFyYWJsZSBmaWx0ZXIgTFVUIGluZGV4CisgKiBAIGRpcl9sdXQ6ICAgICAgcG9pbnRlciB0byAyRCBMVVQKKyAqIEAgY2lyX2x1dDogICAgICBwb2ludGVyIHRvIGNpcmN1bGFyIGZpbHRlciBMVVQKKyAqIEAgc2VwX2x1dDogICAgICBwb2ludGVyIHRvIHNlcGFyYWJsZSBmaWx0ZXIgTFVUCisgKiBAIGRlOiBkZXRhaWwgZW5oYW5jZXIgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnIHsKKwl1MzIgZW5hYmxlOworCXUzMiBkaXJfZW47CisJaW50MzJfdCBpbml0X3BoYXNlX3hbU0RFX01BWF9QTEFORVNdOworCWludDMyX3QgcGhhc2Vfc3RlcF94W1NERV9NQVhfUExBTkVTXTsKKwlpbnQzMl90IGluaXRfcGhhc2VfeVtTREVfTUFYX1BMQU5FU107CisJaW50MzJfdCBwaGFzZV9zdGVwX3lbU0RFX01BWF9QTEFORVNdOworCisJdTMyIHByZWxvYWRfeFtTREVfTUFYX1BMQU5FU107CisJdTMyIHByZWxvYWRfeVtTREVfTUFYX1BMQU5FU107CisJdTMyIHNyY193aWR0aFtTREVfTUFYX1BMQU5FU107CisJdTMyIHNyY19oZWlnaHRbU0RFX01BWF9QTEFORVNdOworCisJdTMyIGRzdF93aWR0aDsKKwl1MzIgZHN0X2hlaWdodDsKKworCXUzMiB5X3JnYl9maWx0ZXJfY2ZnOworCXUzMiB1dl9maWx0ZXJfY2ZnOworCXUzMiBhbHBoYV9maWx0ZXJfY2ZnOworCXUzMiBibGVuZF9jZmc7CisKKwl1MzIgbHV0X2ZsYWc7CisJdTMyIGRpcl9sdXRfaWR4OworCisJdTMyIHlfcmdiX2Npcl9sdXRfaWR4OworCXUzMiB1dl9jaXJfbHV0X2lkeDsKKwl1MzIgeV9yZ2Jfc2VwX2x1dF9pZHg7CisJdTMyIHV2X3NlcF9sdXRfaWR4OworCXUzMiAqZGlyX2x1dDsKKwlzaXplX3QgZGlyX2xlbjsKKwl1MzIgKmNpcl9sdXQ7CisJc2l6ZV90IGNpcl9sZW47CisJdTMyICpzZXBfbHV0OworCXNpemVfdCBzZXBfbGVuOworCisJLyoKKwkgKiBEZXRhaWwgZW5oYW5jZXIgc2V0dGluZ3MKKwkgKi8KKwlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfZGVfY2ZnIGRlOworfTsKKworc3RydWN0IHNkZV9od19zY2FsZXIzX2x1dF9jZmcgeworCWJvb2wgaXNfY29uZmlndXJlZDsKKwl1MzIgKmRpcl9sdXQ7CisJc2l6ZV90IGRpcl9sZW47CisJdTMyICpjaXJfbHV0OworCXNpemVfdCBjaXJfbGVuOworCXUzMiAqc2VwX2x1dDsKKwlzaXplX3Qgc2VwX2xlbjsKK307CisKIHUzMiAqc2RlX2h3X3V0aWxfZ2V0X2xvZ19tYXNrX3B0cih2b2lkKTsKIAogdm9pZCBzZGVfcmVnX3dyaXRlKHN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmMsCkBAIC01OCw2ICsxNzcsMTcgQEAKIAogdm9pZCAqc2RlX2h3X3V0aWxfZ2V0X2Rpcih2b2lkKTsKIAordm9pZCBzZGVfc2V0X3NjYWxlcl92MihzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnICpjZmcsCisJCWNvbnN0IHN0cnVjdCBzZGVfZHJtX3NjYWxlcl92MiAqc2NhbGVfdjIpOworCit2b2lkIHNkZV9od19zZXR1cF9zY2FsZXIzKHN0cnVjdCBzZGVfaHdfYmxrX3JlZ19tYXAgKmMsCisJCXN0cnVjdCBzZGVfaHdfc2NhbGVyM19jZmcgKnNjYWxlcjNfY2ZnLAorCQl1MzIgc2NhbGVyX29mZnNldCwgdTMyIHNjYWxlcl92ZXJzaW9uLAorCQljb25zdCBzdHJ1Y3Qgc2RlX2Zvcm1hdCAqZm9ybWF0KTsKKwordTMyIHNkZV9od19nZXRfc2NhbGVyM192ZXIoc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAqYywKKwkJdTMyIHNjYWxlcl9vZmZzZXQpOworCiB2b2lkIHNkZV9od19jc2Nfc2V0dXAoc3RydWN0IHNkZV9od19ibGtfcmVnX21hcCAgKmMsCiAJCXUzMiBjc2NfcmVnX29mZiwKIAkJc3RydWN0IHNkZV9jc2NfY2ZnICpkYXRhLCBib29sIGNzYzEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9pcnEuYwppbmRleCBlZWI3YTAwLi43NmY4OWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2lycS5jCkBAIC0xOSw2ICsxOSwzMCBAQAogI2luY2x1ZGUgInNkZV9pcnEuaCIKICNpbmNsdWRlICJzZGVfY29yZV9pcnEuaCIKIAorc3RhdGljIHVpbnQzMl90IGdfc2RlX2lycV9zdGF0dXM7CisKK3ZvaWQgc2RlX2lycV91cGRhdGUoc3RydWN0IG1zbV9rbXMgKm1zbV9rbXMsIGJvb2wgZW5hYmxlKQoreworCWludCBpcnFfbnVtOworCXN0cnVjdCBzZGVfa21zICpzZGVfa21zID0gdG9fc2RlX2ttcyhtc21fa21zKTsKKworCWlmICghbXNtX2ttcyB8fCAhc2RlX2ttcykgeworCQlTREVfRVJST1IoImludmFsaWQga21zIGFyZ3VtZW50c1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpcnFfbnVtID0gcGxhdGZvcm1fZ2V0X2lycShzZGVfa21zLT5kZXYtPnBsYXRmb3JtZGV2LCAwKTsKKwlpZiAoaXJxX251bSA8IDApIHsKKwkJU0RFX0VSUk9SKCJpbnZhbGlkIGlycSBudW1iZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGVuYWJsZSkKKwkJZW5hYmxlX2lycShpcnFfbnVtKTsKKwllbHNlCisJCWRpc2FibGVfaXJxKGlycV9udW0pOworfQorCiBpcnFyZXR1cm5fdCBzZGVfaXJxKHN0cnVjdCBtc21fa21zICprbXMpCiB7CiAJc3RydWN0IHNkZV9rbXMgKnNkZV9rbXMgPSB0b19zZGVfa21zKGttcyk7CkBAIC0yNyw2ICs1MSw5IEBACiAJc2RlX2ttcy0+aHdfaW50ci0+b3BzLmdldF9pbnRlcnJ1cHRfc291cmNlcyhzZGVfa21zLT5od19pbnRyLAogCQkJJmludGVycnVwdHMpOwogCisJLyogc3RvcmUgaXJxIHN0YXR1cyBpbiBjYXNlIG9mIGlycS1zdG9ybSBkZWJ1Z2dpbmcgKi8KKwlnX3NkZV9pcnFfc3RhdHVzID0gaW50ZXJydXB0czsKKwogCS8qCiAJICogVGFraW5nIGNhcmUgb2YgTURQIGludGVycnVwdAogCSAqLwpAQCAtNDAsMTMgKzY3LDMwIEBACiAJICovCiAJd2hpbGUgKGludGVycnVwdHMpIHsKIAkJaXJxX2h3X251bWJlcl90IGh3aXJxID0gZmxzKGludGVycnVwdHMpIC0gMTsKKwkJdW5zaWduZWQgaW50IG1hcHBpbmc7CisJCWludCByYzsKIAotCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2ZpbmRfbWFwcGluZygKLQkJCQlzZGVfa21zLT5pcnFfY29udHJvbGxlci5kb21haW4sIGh3aXJxKSk7CisJCW1hcHBpbmcgPSBpcnFfZmluZF9tYXBwaW5nKHNkZV9rbXMtPmlycV9jb250cm9sbGVyLmRvbWFpbiwKKwkJCQlod2lycSk7CisJCWlmIChtYXBwaW5nID09IDApIHsKKwkJCVNERV9FVlQzMihod2lycSwgU0RFX0VWVExPR19FUlJPUik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcmMgPSBnZW5lcmljX2hhbmRsZV9pcnEobWFwcGluZyk7CisJCWlmIChyYyA8IDApIHsKKwkJCVNERV9FVlQzMihod2lycSwgbWFwcGluZywgcmMsIFNERV9FVlRMT0dfRVJST1IpOworCQkJZ290byBlcnJvcjsKKwkJfQorCiAJCWludGVycnVwdHMgJj0gfigxIDw8IGh3aXJxKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK2Vycm9yOgorCS8qIGJhZCBzaXR1YXRpb24sIGluZm9ybSBpcnEgc3lzdGVtLCBpdCBtYXkgZGlzYWJsZSBvdmVyYWxsIE1EU1MgaXJxICovCisJcmV0dXJuIElSUV9OT05FOwogfQogCiB2b2lkIHNkZV9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgbXNtX2ttcyAqa21zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2lycS5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2lycS5oCmluZGV4IGUxMDkwMDcxLi41YmIyOTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfaXJxLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2lycS5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTU2LDQgKzU2LDExIEBACiAgKi8KIGlycXJldHVybl90IHNkZV9pcnEoc3RydWN0IG1zbV9rbXMgKmttcyk7CiAKKy8qKgorICogc2RlX2lycV91cGRhdGUgLSBlbmFibGUvZGlzYWJsZSBJUlEgbGluZQorICogQGttczoJCXBvaW50ZXIgdG8ga21zIGNvbnRleHQKKyAqIEBlbmFibGU6CQllbmFibGU6dHJ1ZSwgZGlzYWJsZTpmYWxzZQorICovCit2b2lkIHNkZV9pcnFfdXBkYXRlKHN0cnVjdCBtc21fa21zICprbXMsIGJvb2wgZW5hYmxlKTsKKwogI2VuZGlmIC8qIF9fU0RFX0lSUV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9rbXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9rbXMuYwppbmRleCA0ZWZkZGI0Li5iZjA2ZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2ttcy5jCkBAIC01NDUsNyArNTQ1LDkgQEAKIAlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKm9sZF9jcnRjX3N0YXRlOwotCWludCBpOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25uX3N0YXRlOworCWludCBpLCByYyA9IDA7CiAKIAlpZiAoIWttcyB8fCAhb2xkX3N0YXRlKQogCQlyZXR1cm47CkBAIC01NTgsNiArNTYwLDE5IEBACiAJZm9yX2VhY2hfY3J0Y19pbl9zdGF0ZShvbGRfc3RhdGUsIGNydGMsIG9sZF9jcnRjX3N0YXRlLCBpKQogCQlzZGVfY3J0Y19jb21wbGV0ZV9jb21taXQoY3J0Yywgb2xkX2NydGNfc3RhdGUpOwogCisJZm9yX2VhY2hfY29ubmVjdG9yX2luX3N0YXRlKG9sZF9zdGF0ZSwgY29ubmVjdG9yLCBvbGRfY29ubl9zdGF0ZSwgaSkgeworCQlzdHJ1Y3Qgc2RlX2Nvbm5lY3RvciAqY19jb25uOworCisJCWNfY29ubiA9IHRvX3NkZV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKwkJaWYgKCFjX2Nvbm4tPm9wcy5wb3N0X2tpY2tvZmYpCisJCQljb250aW51ZTsKKwkJcmMgPSBjX2Nvbm4tPm9wcy5wb3N0X2tpY2tvZmYoY29ubmVjdG9yKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIkNvbm5lY3RvciBQb3N0IGtpY2tvZmYgZmFpbGVkIHJjPSVkXG4iLAorCQkJCQkgcmMpOworCQl9CisJfQorCiAJc2RlX3Bvd2VyX3Jlc291cmNlX2VuYWJsZSgmcHJpdi0+cGhhbmRsZSwgc2RlX2ttcy0+Y29yZV9jbGllbnQsIGZhbHNlKTsKIAogCVNERV9FVlQzMl9WRVJCT1NFKFNERV9FVlRMT0dfRlVOQ19FWElUKTsKQEAgLTc1OCw2ICs3NzMsOCBAQAogCQkuc2V0X3Bvd2VyID0gZHNpX2Rpc3BsYXlfc2V0X3Bvd2VyLAogCQkuZ2V0X21vZGVfaW5mbyA9IGRzaV9jb25uX2dldF9tb2RlX2luZm8sCiAJCS5nZXRfZHN0X2Zvcm1hdCA9IGRzaV9kaXNwbGF5X2dldF9kc3RfZm9ybWF0LAorCQkucG9zdF9raWNrb2ZmID0gZHNpX2Nvbm5fcG9zdF9raWNrb2ZmLAorCQkuY2hlY2tfc3RhdHVzID0gZHNpX2Rpc3BsYXlfY2hlY2tfc3RhdHVzLAogCX07CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBzZGVfY29ubmVjdG9yX29wcyB3Yl9vcHMgPSB7CiAJCS5wb3N0X2luaXQgPSAgICBzZGVfd2JfY29ubmVjdG9yX3Bvc3RfaW5pdCwKQEAgLTc2Nyw3ICs3ODQsOCBAQAogCQkuZ2V0X2luZm8gPSAgICAgc2RlX3diX2dldF9pbmZvLAogCQkuc29mdF9yZXNldCA9ICAgTlVMTCwKIAkJLmdldF9tb2RlX2luZm8gPSBzZGVfd2JfZ2V0X21vZGVfaW5mbywKLQkJLmdldF9kc3RfZm9ybWF0ID0gTlVMTAorCQkuZ2V0X2RzdF9mb3JtYXQgPSBOVUxMLAorCQkuY2hlY2tfc3RhdHVzID0gTlVMTCwKIAl9OwogCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RlX2Nvbm5lY3Rvcl9vcHMgZHBfb3BzID0gewogCQkucG9zdF9pbml0ICA9IGRwX2Nvbm5lY3Rvcl9wb3N0X2luaXQsCkBAIC03NzYsNiArNzk0LDggQEAKIAkJLm1vZGVfdmFsaWQgPSBkcF9jb25uZWN0b3JfbW9kZV92YWxpZCwKIAkJLmdldF9pbmZvICAgPSBkcF9jb25uZWN0b3JfZ2V0X2luZm8sCiAJCS5nZXRfbW9kZV9pbmZvICA9IGRwX2Nvbm5lY3Rvcl9nZXRfbW9kZV9pbmZvLAorCQkuc2VuZF9ocGRfZXZlbnQgPSBkcF9jb25uZWN0b3Jfc2VuZF9ocGRfZXZlbnQsCisJCS5jaGVja19zdGF0dXMgPSBOVUxMLAogCX07CiAJc3RydWN0IG1zbV9kaXNwbGF5X2luZm8gaW5mbzsKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXI7CkBAIC0xMjU5LDExICsxMjc5LDEzIEBACiAJLyogYWxsb2NhdGUgYmFja2luZyBidWZmZXIgb2JqZWN0ICovCiAJaWYgKHNkZV9rbXMtPmljbGllbnQpIHsKIAkJdTMyIGhlYXBfaWQgPSBmYm8tPmZsYWdzICYgRFJNX01PREVfRkJfU0VDVVJFID8KLQkJCQlJT05fSEVBUChJT05fU0VDVVJFX0RJU1BMQVlfSEVBUF9JRCkgOgorCQkJCUlPTl9IRUFQKElPTl9TRUNVUkVfSEVBUF9JRCkgOgogCQkJCUlPTl9IRUFQKElPTl9TWVNURU1fSEVBUF9JRCk7CisJCXUzMiBpZmxhZ3MgPSBmYm8tPmZsYWdzICYgRFJNX01PREVfRkJfU0VDVVJFID8KKwkJCQkoSU9OX0ZMQUdfU0VDVVJFIHwgSU9OX0ZMQUdfQ1BfUElYRUwpIDogMDsKIAogCQlmYm8tPmloYW5kbGUgPSBpb25fYWxsb2Moc2RlX2ttcy0+aWNsaWVudCwKLQkJCQlmYm8tPmxheW91dC50b3RhbF9zaXplLCBTWl80SywgaGVhcF9pZCwgMCk7CisJCQkJZmJvLT5sYXlvdXQudG90YWxfc2l6ZSwgU1pfNEssIGhlYXBfaWQsIGlmbGFncyk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChmYm8tPmloYW5kbGUpKSB7CiAJCQlTREVfRVJST1IoImZhaWxlZCB0byBhbGxvYyBpb24gbWVtb3J5XG4iKTsKIAkJCXJldCA9IFBUUl9FUlIoZmJvLT5paGFuZGxlKTsKQEAgLTE0MDEsNiArMTQyMywxMiBAQAogCWlmICghcHJpdikKIAkJcmV0dXJuOwogCisJaWYgKHNkZV9rbXMtPmdlbnBkX2luaXQpIHsKKwkJc2RlX2ttcy0+Z2VucGRfaW5pdCA9IGZhbHNlOworCQlwbV9nZW5wZF9yZW1vdmUoJnNkZV9rbXMtPmdlbnBkKTsKKwkJb2ZfZ2VucGRfZGVsX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlKTsKKwl9CisKIAlpZiAoc2RlX2ttcy0+aHdfaW50cikKIAkJc2RlX2h3X2ludHJfZGVzdHJveShzZGVfa21zLT5od19pbnRyKTsKIAlzZGVfa21zLT5od19pbnRyID0gTlVMTDsKQEAgLTE2ODMsNiArMTcxMSw4IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CiAJc3RydWN0IHNkZV9rbXMgKnNkZV9rbXMgPSBOVUxMOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBOVUxMOworCXN0cnVjdCBzZGVfY29ubmVjdG9yICpzZGVfY29ubiA9IE5VTEw7CiAKIAlpZiAoIWttcykgewogCQlTREVfRVJST1IoImludmFsaWQga21zXG4iKTsKQEAgLTE2OTcsOCArMTcyNywyMiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGRldi0+bW9kZV9jb25maWcuZnVuY3MtPm91dHB1dF9wb2xsX2NoYW5nZWQpCi0JCWRldi0+bW9kZV9jb25maWcuZnVuY3MtPm91dHB1dF9wb2xsX2NoYW5nZWQoZGV2KTsKKwlpZiAoIWRldi0+bW9kZV9jb25maWcucG9sbF9lbmFibGVkKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKKwlkcm1fZm9yX2VhY2hfY29ubmVjdG9yKGNvbm5lY3RvciwgZGV2KSB7CisJCS8qIE9ubHkgaGFuZGxlIEhQRCBjYXBhYmxlIGNvbm5lY3RvcnMuICovCisJCWlmICghKGNvbm5lY3Rvci0+cG9sbGVkICYgRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRCkpCisJCQljb250aW51ZTsKKworCQlzZGVfY29ubiA9IHRvX3NkZV9jb25uZWN0b3IoY29ubmVjdG9yKTsKKworCQlpZiAoc2RlX2Nvbm4tPm9wcy5zZW5kX2hwZF9ldmVudCkKKwkJCXNkZV9jb25uLT5vcHMuc2VuZF9ocGRfZXZlbnQoc2RlX2Nvbm4tPmRpc3BsYXkpOworCX0KKwltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOworCiB9CiAKIHN0YXRpYyBpbnQgc2RlX2ttc19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTE3MDgsNyArMTc1Miw3IEBACiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm47CiAJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlOwogCXN0cnVjdCBzZGVfa21zICpzZGVfa21zOwotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBudW1fY3J0Y3MgPSAwOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTc2OCw3ICsxODEyLDkgQEAKIAkJCQlkcm1fYXRvbWljX3N0YXRlX2ZyZWUoc3RhdGUpOwogCQkJCWdvdG8gdW5sb2NrOwogCQkJfQotCQl9IGVsc2UgaWYgKGxwICE9IFNERV9NT0RFX0RQTVNfTFAyKSB7CisJCX0KKworCQlpZiAobHAgIT0gU0RFX01PREVfRFBNU19MUDIpIHsKIAkJCS8qIGZvcmNlIENSVEMgdG8gYmUgaW5hY3RpdmUgKi8KIAkJCWNydGNfc3RhdGUgPSBkcm1fYXRvbWljX2dldF9jcnRjX3N0YXRlKHN0YXRlLAogCQkJCQljb25uLT5zdGF0ZS0+Y3J0Yyk7CkBAIC0xNzc4LDE5ICsxODI0LDMxIEBACiAJCQkJZHJtX2F0b21pY19zdGF0ZV9mcmVlKHN0YXRlKTsKIAkJCQlnb3RvIHVubG9jazsKIAkJCX0KLQkJCWNydGNfc3RhdGUtPmFjdGl2ZSA9IGZhbHNlOworCisJCQlpZiAobHAgIT0gU0RFX01PREVfRFBNU19MUDEpCisJCQkJY3J0Y19zdGF0ZS0+YWN0aXZlID0gZmFsc2U7CisJCQkrK251bV9jcnRjczsKIAkJfQogCX0KIAorCS8qIGNoZWNrIGZvciBub3RoaW5nIHRvIGRvICovCisJaWYgKG51bV9jcnRjcyA9PSAwKSB7CisJCURSTV9ERUJVRygiYWxsIGNydGNzIGFyZSBhbHJlYWR5IGluIHRoZSBvZmYgc3RhdGVcbiIpOworCQlkcm1fYXRvbWljX3N0YXRlX2ZyZWUoc3RhdGUpOworCQlnb3RvIHN1c3BlbmRlZDsKKwl9CisKIAkvKiBjb21taXQgdGhlICJkaXNhYmxlIGFsbCIgc3RhdGUgKi8KIAlyZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0ZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZGlzYWJsZSBjcnRjcywgJWRcbiIsIHJldCk7CiAJCWRybV9hdG9taWNfc3RhdGVfZnJlZShzdGF0ZSk7Ci0JfSBlbHNlIHsKLQkJc2RlX2ttcy0+c3VzcGVuZF9ibG9jayA9IHRydWU7CisJCWdvdG8gdW5sb2NrOwogCX0KIAorc3VzcGVuZGVkOgorCXNkZV9rbXMtPnN1c3BlbmRfYmxvY2sgPSB0cnVlOworCiB1bmxvY2s6CiAJaWYgKHJldCA9PSAtRURFQURMSykgewogCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgpOwpAQCAtMTk0NCwxMiArMjAwMiw3MSBAQAogc3RhdGljIHZvaWQgc2RlX2ttc19oYW5kbGVfcG93ZXJfZXZlbnQodTMyIGV2ZW50X3R5cGUsIHZvaWQgKnVzcikKIHsKIAlzdHJ1Y3Qgc2RlX2ttcyAqc2RlX2ttcyA9IHVzcjsKKwlzdHJ1Y3QgbXNtX2ttcyAqbXNtX2ttczsKIAorCW1zbV9rbXMgPSAmc2RlX2ttcy0+YmFzZTsKIAlpZiAoIXNkZV9rbXMpCiAJCXJldHVybjsKIAotCWlmIChldmVudF90eXBlID09IFNERV9QT1dFUl9FVkVOVF9QT1NUX0VOQUJMRSkKKwlTREVfREVCVUcoImV2ZW50X3R5cGU6JWRcbiIsIGV2ZW50X3R5cGUpOworCVNERV9FVlQzMl9WRVJCT1NFKGV2ZW50X3R5cGUpOworCisJaWYgKGV2ZW50X3R5cGUgPT0gU0RFX1BPV0VSX0VWRU5UX1BPU1RfRU5BQkxFKSB7CisJCXNkZV9pcnFfdXBkYXRlKG1zbV9rbXMsIHRydWUpOwogCQlzZGVfdmJpZl9pbml0X21lbXR5cGVzKHNkZV9rbXMpOworCX0gZWxzZSBpZiAoZXZlbnRfdHlwZSA9PSBTREVfUE9XRVJfRVZFTlRfUFJFX0RJU0FCTEUpIHsKKwkJc2RlX2lycV91cGRhdGUobXNtX2ttcywgZmFsc2UpOworCX0KK30KKworI2RlZmluZSBnZW5wZF90b19zZGVfa21zKGRvbWFpbikgY29udGFpbmVyX29mKGRvbWFpbiwgc3RydWN0IHNkZV9rbXMsIGdlbnBkKQorCitzdGF0aWMgaW50IHNkZV9rbXNfcGRfZW5hYmxlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJc3RydWN0IHNkZV9rbXMgKnNkZV9rbXMgPSBnZW5wZF90b19zZGVfa21zKGdlbnBkKTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXY7CisJaW50IHJjOworCisJU0RFX0RFQlVHKCJcbiIpOworCisJZGV2ID0gc2RlX2ttcy0+ZGV2OworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlTREVfRVZUMzIoZ2VucGQtPmRldmljZV9jb3VudCk7CisKKwlyYyA9IHNkZV9wb3dlcl9yZXNvdXJjZV9lbmFibGUoJnByaXYtPnBoYW5kbGUsIHByaXYtPnBjbGllbnQsIHRydWUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHNkZV9rbXNfcGRfZGlzYWJsZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCXN0cnVjdCBzZGVfa21zICpzZGVfa21zID0gZ2VucGRfdG9fc2RlX2ttcyhnZW5wZCk7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbXNtX2RybV9wcml2YXRlICpwcml2OworCWludCByYzsKKworCVNERV9ERUJVRygiXG4iKTsKKworCWRldiA9IHNkZV9rbXMtPmRldjsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRUlOVkFMOworCisJU0RFX0VWVDMyKGdlbnBkLT5kZXZpY2VfY291bnQpOworCisJcmMgPSBzZGVfcG93ZXJfcmVzb3VyY2VfZW5hYmxlKCZwcml2LT5waGFuZGxlLCBwcml2LT5wY2xpZW50LCBmYWxzZSk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgc2RlX2ttc19od19pbml0KHN0cnVjdCBtc21fa21zICprbXMpCkBAIC0yMDMxLDcgKzIxNDgsNyBAQAogCX0gZWxzZSB7CiAJCXNkZV9rbXMtPnJlZ19kbWFfbGVuID0gbXNtX2lvbWFwX3NpemUoZGV2LT5wbGF0Zm9ybWRldiwKIAkJCQkJCQkJInJlZ2RtYV9waHlzIik7Ci0JCXJjID0gIHNkZV9kYmdfcmVnX3JlZ2lzdGVyX2Jhc2UoInZiaWZfbnJ0IiwKKwkJcmMgPSAgc2RlX2RiZ19yZWdfcmVnaXN0ZXJfYmFzZSgicmVnX2RtYSIsCiAJCQkJc2RlX2ttcy0+cmVnX2RtYSwKIAkJCQlzZGVfa21zLT5yZWdfZG1hX2xlbik7CiAJCWlmIChyYykKQEAgLTIxNzcsMTIgKzIyOTQsNDEgQEAKIAkgKi8KIAlzZGVfa21zX2hhbmRsZV9wb3dlcl9ldmVudChTREVfUE9XRVJfRVZFTlRfUE9TVF9FTkFCTEUsIHNkZV9rbXMpOwogCXNkZV9rbXMtPnBvd2VyX2V2ZW50ID0gc2RlX3Bvd2VyX2hhbmRsZV9yZWdpc3Rlcl9ldmVudCgmcHJpdi0+cGhhbmRsZSwKLQkJCVNERV9QT1dFUl9FVkVOVF9QT1NUX0VOQUJMRSwKKwkJCVNERV9QT1dFUl9FVkVOVF9QT1NUX0VOQUJMRSB8CisJCQlTREVfUE9XRVJfRVZFTlRfUFJFX0RJU0FCTEUsCiAJCQlzZGVfa21zX2hhbmRsZV9wb3dlcl9ldmVudCwgc2RlX2ttcywgImttcyIpOwogCisJLyogaW5pdGlhbGl6ZSBwb3dlciBkb21haW4gaWYgZGVmaW5lZCAqLworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+ZGV2LT5vZl9ub2RlLCAiI3Bvd2VyLWRvbWFpbi1jZWxscyIsIE5VTEwpKSB7CisJCXNkZV9rbXMtPmdlbnBkLm5hbWUgPSBkZXYtPnVuaXF1ZTsKKwkJc2RlX2ttcy0+Z2VucGQucG93ZXJfb2ZmID0gc2RlX2ttc19wZF9kaXNhYmxlOworCQlzZGVfa21zLT5nZW5wZC5wb3dlcl9vbiA9IHNkZV9rbXNfcGRfZW5hYmxlOworCisJCXJjID0gcG1fZ2VucGRfaW5pdCgmc2RlX2ttcy0+Z2VucGQsIE5VTEwsIHRydWUpOworCQlpZiAocmMgPCAwKSB7CisJCQlTREVfRVJST1IoImZhaWxlZCB0byBpbml0IGdlbnBkIHByb3ZpZGVyICVzOiAlZFxuIiwKKwkJCQkJc2RlX2ttcy0+Z2VucGQubmFtZSwgcmMpOworCQkJZ290byBnZW5wZF9lcnI7CisJCX0KKworCQlyYyA9IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoZGV2LT5kZXYtPm9mX25vZGUsCisJCQkJJnNkZV9rbXMtPmdlbnBkKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJU0RFX0VSUk9SKCJmYWlsZWQgdG8gYWRkIGdlbnBkIHByb3ZpZGVyICVzOiAlZFxuIiwKKwkJCQkJc2RlX2ttcy0+Z2VucGQubmFtZSwgcmMpOworCQkJcG1fZ2VucGRfcmVtb3ZlKCZzZGVfa21zLT5nZW5wZCk7CisJCQlnb3RvIGdlbnBkX2VycjsKKwkJfQorCisJCXNkZV9rbXMtPmdlbnBkX2luaXQgPSB0cnVlOworCQlTREVfREVCVUcoImFkZGVkIGdlbnBkIHByb3ZpZGVyICVzXG4iLCBzZGVfa21zLT5nZW5wZC5uYW1lKTsKKwl9CisKIAlzZGVfcG93ZXJfcmVzb3VyY2VfZW5hYmxlKCZwcml2LT5waGFuZGxlLCBzZGVfa21zLT5jb3JlX2NsaWVudCwgZmFsc2UpOworCiAJcmV0dXJuIDA7CiAKK2dlbnBkX2VycjoKIGRybV9vYmpfaW5pdF9lcnI6CiAJc2RlX2NvcmVfcGVyZl9kZXN0cm95KCZzZGVfa21zLT5wZXJmKTsKIGh3X2ludHJfaW5pdF9lcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfa21zLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfa21zLmgKaW5kZXggMGRkZmIzMC4uYWFjZmY3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX2ttcy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9rbXMuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBfX1NERV9LTVNfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8bGludXgvcG1fZG9tYWluLmg+CiAKICNpbmNsdWRlICJtc21fZHJ2LmgiCiAjaW5jbHVkZSAibXNtX2ttcy5oIgpAQCAtMTA3LDYgKzEwOCw5IEBACiAjZGVmaW5lIFNERV9LTVNfT1BTX0NMRUFOVVBfUExBTkVfRkIgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyKQogI2RlZmluZSBTREVfS01TX09QU19QUkVQQVJFX1BMQU5FX0ZCICAgICAgICAgICAgICAgICAgICAgICBCSVQoMykKIAorLyogRVNEIHN0YXR1cyBjaGVjayBpbnRlcnZhbCBpbiBtaWxpc2Vjb25kcyAqLworI2RlZmluZSBTVEFUVVNfQ0hFQ0tfSU5URVJWQUxfTVMgNTAwMAorCiAvKgogICogc3RydWN0IHNkZV9pcnFfY2FsbGJhY2sgLSBJUlEgY2FsbGJhY2sgaGFuZGxlcnMKICAqIEBsaXN0OiBsaXN0IHRvIGNhbGxiYWNrCkBAIC0xNzMsNiArMTc3LDkgQEAKIAlpbnQgY29yZV9yZXY7CiAJc3RydWN0IHNkZV9tZHNzX2NmZyAqY2F0YWxvZzsKIAorCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBnZW5wZDsKKwlib29sIGdlbnBkX2luaXQ7CisKIAlzdHJ1Y3QgbXNtX2dlbV9hZGRyZXNzX3NwYWNlICphc3BhY2VbTVNNX1NNTVVfRE9NQUlOX01BWF07CiAJc3RydWN0IHNkZV9wb3dlcl9jbGllbnQgKmNvcmVfY2xpZW50OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcGxhbmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5jCmluZGV4IDQwZGFkNzYuLmY0NjcyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5jCkBAIC04NzgsNyArODc4LDYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIFNERV9EUk1fRkJfU0VDX0RJUl9UUkFOUzoKLQljYXNlIFNERV9EUk1fRkJfTk9OX1NFQ19ESVJfVFJBTlM6CiAJCSphc3BhY2UgPSBOVUxMOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtOTE3LDYgKzkxNiwyMiBAQAogCQlyZXR1cm47CiAJfQogCisJLyoKKwkgKiBmcmFtZWJ1ZmZlciBwcmVwYXJlIGlzIGRlZmVycmVkIGZvciBwcmVwYXJlX2ZiIGNhbGxzIHRoYXQKKwkgKiBoYXBwZW4gZHVyaW5nIHRoZSB0cmFuc2l0aW9uIGZyb20gc2VjdXJlIHRvIG5vbi1zZWN1cmUuCisJICogSGFuZGxlIHRoZSBwcmVwYXJlIGF0IHRoaXMgcG9pbnQgZm9yIHN1Y2ggY2FzZXMuIFRoaXMgY2FuIGJlCisJICogZXhwZWN0ZWQgZm9yIG9uZSBvciB0d28gZnJhbWVzIGR1cmluZyB0aGUgdHJhbnNpdGlvbi4KKwkgKi8KKwlpZiAoYXNwYWNlICYmIHBzdGF0ZS0+ZGVmZXJfcHJlcGFyZV9mYikgeworCQlyZXQgPSBtc21fZnJhbWVidWZmZXJfcHJlcGFyZShmYiwgcHN0YXRlLT5hc3BhY2UpOworCQlpZiAocmV0KSB7CisJCQlTREVfRVJST1JfUExBTkUocHNkZSwKKwkJCQkiZmFpbGVkIHRvIHByZXBhcmUgZnJhbWVidWZmZXIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm47CisJCX0KKwkJcHN0YXRlLT5kZWZlcl9wcmVwYXJlX2ZiID0gZmFsc2U7CisJfQorCiAJcmV0ID0gc2RlX2Zvcm1hdF9wb3B1bGF0ZV9sYXlvdXQoYXNwYWNlLCBmYiwgJnBpcGVfY2ZnLT5sYXlvdXQpOwogCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJU0RFX0RFQlVHX1BMQU5FKHBzZGUsICJub3QgdXBkYXRpbmcgc2FtZSBzcmMgYWRkcnNcbiIpOwpAQCAtMTQ2OSw2ICsxNDg0LDEyIEBACiAJCWlmIChwc2RlLT5waXBlX2h3LT5vcHMuc2V0dXBfcGUpCiAJCQlwc2RlLT5waXBlX2h3LT5vcHMuc2V0dXBfcGUocHNkZS0+cGlwZV9odywKIAkJCQkJJnBzdGF0ZS0+cGl4ZWxfZXh0KTsKKworCQlpZiAocHNkZS0+cGlwZV9ody0+b3BzLnNldHVwX3NjYWxlciAmJgorCQkJCXBzdGF0ZS0+bXVsdGlyZWN0X2luZGV4ICE9IFNERV9TU1BQX1JFQ1RfMSkKKwkJCXBzZGUtPnBpcGVfaHctPm9wcy5zZXR1cF9zY2FsZXIocHNkZS0+cGlwZV9odywKKwkJCQkJJnBzZGUtPnBpcGVfY2ZnLCAmcHN0YXRlLT5waXhlbF9leHQsCisJCQkJCSZwc3RhdGUtPnNjYWxlcjNfY2ZnKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTMsNyArMTUzNCw3IEBACiAgKiBAcGxhbmU6IFBvaW50ZXIgdG8gZHJtIHBsYW5lCiAgKiByZXR1cm46IHByZWZpbGwgdGltZSBpbiBsaW5lCiAgKi8KLXN0YXRpYyB1MzIgc2RlX3BsYW5lX3JvdF9jYWxjX3ByZWZpbGwoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit1MzIgc2RlX3BsYW5lX3JvdF9jYWxjX3ByZWZpbGwoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCiB7CiAJc3RydWN0IGRybV9wbGFuZV9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IHNkZV9wbGFuZV9zdGF0ZSAqcHN0YXRlOwpAQCAtMTU0MiwzMyArMTU2MywxOSBAQAogCQkJCSZibG9ja3NpemUsICZibG9ja3NpemUpOwogCiAJcHJlZmlsbF9saW5lID0gYmxvY2tzaXplICsgc2RlX2ttcy0+Y2F0YWxvZy0+c2J1Zl9oZWFkcm9vbTsKLQotCVNERV9ERUJVRygicGxhbmUlZCBwcmVmaWxsOiV1XG4iLCBwbGFuZS0+YmFzZS5pZCwgcHJlZmlsbF9saW5lKTsKKwlwcmVmaWxsX2xpbmUgPSBtdWx0X2ZyYWMocHJlZmlsbF9saW5lLCByc3RhdGUtPm91dF9zcmNfaCA+PiAxNiwKKwkJCXN0YXRlLT5jcnRjX2gpOworCVNERV9ERUJVRygKKwkJInBsYW5lJWQuJWQgYmxrOiV1IGhlYWQ6JXUgdmRzdC92c3JjOiV1LyV1IHByZWZpbGw6JXVcbiIsCisJCQlwbGFuZS0+YmFzZS5pZCwgcnN0YXRlLT5zZXF1ZW5jZV9pZCwKKwkJCWJsb2Nrc2l6ZSwgc2RlX2ttcy0+Y2F0YWxvZy0+c2J1Zl9oZWFkcm9vbSwKKwkJCXN0YXRlLT5jcnRjX2gsIHJzdGF0ZS0+b3V0X3NyY19oID4+IDE2LAorCQkJcHJlZmlsbF9saW5lKTsKIAogCXJldHVybiBwcmVmaWxsX2xpbmU7CiB9CiAKIC8qKgotICogc2RlX3BsYW5lX2lzX3NidWZfbW9kZSAtIGNoZWNrIGlmIHNzcHAgb2YgZ2l2ZW4gcGxhbmUgaXMgaW4gc3RyZWFtaW5nCi0gKglidWZmZXIgbW9kZQotICogQHBsYW5lOiBQb2ludGVyIHRvIGRybSBwbGFuZQotICogQHByZWZpbGw6IFBvaW50ZXIgdG8gcHJlZmlsbCBsaW5lIGNvdW50Ci0gKiByZXR1cm46IHRydWUgaWYgc3NwcCBpcyBpbiBzdHJlYW0gYnVmZmVyIG1vZGUKLSAqLwotYm9vbCBzZGVfcGxhbmVfaXNfc2J1Zl9tb2RlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCB1MzIgKnByZWZpbGwpCi17Ci0Jc3RydWN0IHNkZV9wbGFuZV9zdGF0ZSAqcHN0YXRlID0gcGxhbmUgJiYgcGxhbmUtPnN0YXRlID8KLQkJCXRvX3NkZV9wbGFuZV9zdGF0ZShwbGFuZS0+c3RhdGUpIDogTlVMTDsKLQlzdHJ1Y3Qgc2RlX3BsYW5lX3JvdF9zdGF0ZSAqcnN0YXRlID0gcHN0YXRlID8gJnBzdGF0ZS0+cm90IDogTlVMTDsKLQlib29sIHNidWZfbW9kZSA9IHJzdGF0ZSA/IHJzdGF0ZS0+b3V0X3NidWYgOiBmYWxzZTsKLQotCWlmIChwcmVmaWxsKQotCQkqcHJlZmlsbCA9IHNkZV9wbGFuZV9yb3RfY2FsY19wcmVmaWxsKHBsYW5lKTsKLQotCXJldHVybiBzYnVmX21vZGU7Ci19Ci0KLS8qKgogICogc2RlX3BsYW5lX3JvdF9jYWxjX2NmZyAtIGNhbGN1bGF0ZSByb3RhdG9yL3NzcHAgY29uZmlndXJhdGlvbiBieQogICoJZW51bWVyYXRpbmcgb3ZlciBhbGwgcGxhbmVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIHJvdGF0b3IKICAqIEBwbGFuZTogUG9pbnRlciB0byBkcm0gcGxhbmUKQEAgLTIxMjYsNiArMjEzMywxMyBAQAogCQl9CiAJfQogCisJaWYgKG5ld19wc3RhdGUtPmRlZmVyX3ByZXBhcmVfZmIpIHsKKwkJU0RFX0RFQlVHKAorCQkgICAgInBsYW5lJWQsIGRvbWFpbiBub3QgYXR0YWNoZWQsIHByZXBhcmUgZmIgaGFuZGxlZCBsYXRlclxuIiwKKwkJICAgIHBsYW5lLT5iYXNlLmlkKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogcHJlcGFyZSByb3RhdG9yIGlucHV0IGJ1ZmZlciAqLwogCXJldCA9IG1zbV9mcmFtZWJ1ZmZlcl9wcmVwYXJlKG5ld19zdGF0ZS0+ZmIsIG5ld19wc3RhdGUtPmFzcGFjZSk7CiAJaWYgKHJldCkgewpAQCAtMjM5NSw2ICsyNDA5LDcgQEAKIAlzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpzdGF0ZTsKIAlzdHJ1Y3Qgc2RlX3BsYW5lX3N0YXRlICpwc3RhdGU7CiAJc3RydWN0IHNkZV9wbGFuZV9yb3Rfc3RhdGUgKnJzdGF0ZTsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghcGxhbmUgfHwgIXBsYW5lLT5zdGF0ZSkgewogCQlTREVfRVJST1IoImludmFsaWQgcGxhbmUvc3RhdGVcbiIpOwpAQCAtMjQxNiwyNCArMjQzMSw1NyBAQAogCWlmICghcnN0YXRlLT5vdXRfc2J1ZiB8fCAhcnN0YXRlLT5yb3RfaHcpCiAJCXJldHVybjsKIAorCS8qCisJICogZnJhbWVidWZmZXIgcHJlcGFyZSBpcyBkZWZlcnJlZCBmb3IgcHJlcGFyZV9mYiBjYWxscyB0aGF0CisJICogaGFwcGVuIGR1cmluZyB0aGUgdHJhbnNpdGlvbiBmcm9tIHNlY3VyZSB0byBub24tc2VjdXJlLgorCSAqIEhhbmRsZSB0aGUgcHJlcGFyZSBhdCB0aGlzIHBvaW50IGZvciByb3RhdG9yIGluIHN1Y2ggY2FzZXMuCisJICogVGhpcyBjYW4gYmUgZXhwZWN0ZWQgZm9yIG9uZSBvciB0d28gZnJhbWVzIGR1cmluZyB0aGUgdHJhbnNpdGlvbi4KKwkgKi8KKwlpZiAocHN0YXRlLT5hc3BhY2UgJiYgcHN0YXRlLT5kZWZlcl9wcmVwYXJlX2ZiKSB7CisJCS8qIHByZXBhcmUgcm90YXRvciBpbnB1dCBidWZmZXIgKi8KKwkJcmV0ID0gbXNtX2ZyYW1lYnVmZmVyX3ByZXBhcmUoc3RhdGUtPmZiLCBwc3RhdGUtPmFzcGFjZSk7CisJCWlmIChyZXQpIHsKKwkJCVNERV9FUlJPUigicCVkIGZhaWxlZCB0byBwcmVwYXJlIGlucHV0IGZiICVkXG4iLAorCQkJCQkJCXBsYW5lLT5iYXNlLmlkLCByZXQpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogcHJlcGFyZSByb3RhdG9yIG91dHB1dCBidWZmZXIgKi8KKwkJaWYgKHNkZV9wbGFuZV9lbmFibGVkKHN0YXRlKSAmJiByc3RhdGUtPm91dF9mYikgeworCQkJcmV0ID0gbXNtX2ZyYW1lYnVmZmVyX3ByZXBhcmUocnN0YXRlLT5vdXRfZmIsCisJCQkJCQlwc3RhdGUtPmFzcGFjZSk7CisJCQlpZiAocmV0KSB7CisJCQkJU0RFX0VSUk9SKAorCQkJCSAgInAlZCBmYWlsZWQgdG8gcHJlcGFyZSBpbmxpbmUgZmIgJWRcbiIsCisJCQkJICBwbGFuZS0+YmFzZS5pZCwgcmV0KTsKKwkJCQlnb3RvIGVycm9yX3ByZXBhcmVfb3V0cHV0X2J1ZmZlcjsKKwkJCX0KKwkJfQorCX0KKwogCXNkZV9wbGFuZV9yb3Rfc3VibWl0X2NvbW1hbmQocGxhbmUsIHN0YXRlLCBTREVfSFdfUk9UX0NNRF9DT01NSVQpOworCisJcmV0dXJuOworCitlcnJvcl9wcmVwYXJlX291dHB1dF9idWZmZXI6CisJbXNtX2ZyYW1lYnVmZmVyX2NsZWFudXAoc3RhdGUtPmZiLCBwc3RhdGUtPmFzcGFjZSk7CiB9CiAKLXZvaWQgc2RlX3BsYW5lX2tpY2tvZmYoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCitpbnQgc2RlX3BsYW5lX2tpY2tvZmZfcm90KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQogewogCXN0cnVjdCBzZGVfcGxhbmVfc3RhdGUgKnBzdGF0ZTsKIAogCWlmICghcGxhbmUgfHwgIXBsYW5lLT5zdGF0ZSkgewogCQlTREVfRVJST1IoImludmFsaWQgcGxhbmVcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXBzdGF0ZSA9IHRvX3NkZV9wbGFuZV9zdGF0ZShwbGFuZS0+c3RhdGUpOwogCiAJaWYgKCFwc3RhdGUtPnJvdC5yb3RfaHcgfHwgIXBzdGF0ZS0+cm90LnJvdF9ody0+b3BzLmNvbW1pdCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAotCXBzdGF0ZS0+cm90LnJvdF9ody0+b3BzLmNvbW1pdChwc3RhdGUtPnJvdC5yb3RfaHcsCisJcmV0dXJuIHBzdGF0ZS0+cm90LnJvdF9ody0+b3BzLmNvbW1pdChwc3RhdGUtPnJvdC5yb3RfaHcsCiAJCQkmcHN0YXRlLT5yb3Qucm90X2NtZCwKIAkJCVNERV9IV19ST1RfQ01EX1NUQVJUKTsKIH0KQEAgLTI3NDcsNyArMjc5NSw3IEBACiAJCXJldHVybjsKIAogCSpmbHVzaF9yb3QgPSAweDA7Ci0JaWYgKHNkZV9wbGFuZV9pc19zYnVmX21vZGUocGxhbmUsIE5VTEwpICYmIHJzdGF0ZS0+cm90X2h3ICYmCisJaWYgKHJzdGF0ZSAmJiByc3RhdGUtPm91dF9zYnVmICYmIHJzdGF0ZS0+cm90X2h3ICYmCiAJCQljdGwtPm9wcy5nZXRfYml0bWFza19yb3QpCiAJCWN0bC0+b3BzLmdldF9iaXRtYXNrX3JvdChjdGwsIGZsdXNoX3JvdCwgcnN0YXRlLT5yb3RfaHctPmlkeCk7CiB9CkBAIC0yNzc0LDE0ICsyODIyLDMwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLypjYWNoZSBhc3BhY2UgKi8KKwkvKiBjYWNoZSBhc3BhY2UgKi8KIAlwc3RhdGUtPmFzcGFjZSA9IGFzcGFjZTsKKworCS8qCisJICogd2hlbiB0cmFuc2l0aW9uaW5nIGZyb20gc2VjdXJlIHRvIG5vbi1zZWN1cmUsCisJICogcGxhbmUtPnByZXBhcmVfZmIgaGFwcGVucyBiZWZvcmUgdGhlIGNvbW1pdC4gSW4gc3VjaCBjYXNlLAorCSAqIGRlZmVyIHRoZSBwcmVwYXJlX2ZiIGFuZCBoYW5kbGVkIGl0IGxhdGUsIGR1cmluZyB0aGUgY29tbWl0CisJICogYWZ0ZXIgYXR0YWNoaW5nIHRoZSBkb21haW5zIGFzIHBhcnQgb2YgdGhlIHRyYW5zaXRpb24KKwkgKi8KKwlwc3RhdGUtPmRlZmVyX3ByZXBhcmVfZmIgPSAoYXNwYWNlICYmICFhc3BhY2UtPmRvbWFpbl9hdHRhY2hlZCkgPworCQkJCQkJCXRydWUgOiBmYWxzZTsKKwogCXJldCA9IHNkZV9wbGFuZV9yb3RfcHJlcGFyZV9mYihwbGFuZSwgbmV3X3N0YXRlKTsKIAlpZiAocmV0KSB7CiAJCVNERV9FUlJPUigiZmFpbGVkIHRvIHByZXBhcmUgcm90IGZyYW1lYnVmZmVyXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlpZiAocHN0YXRlLT5kZWZlcl9wcmVwYXJlX2ZiKSB7CisJCVNERV9ERUJVR19QTEFORShwc2RlLAorCQkgICAgImRvbWFpbiBub3QgYXR0YWNoZWQsIHByZXBhcmVfZmIgaGFuZGxlZCBsYXRlclxuIik7CisJCXJldHVybiAwOworCX0KKwogCW5ld19yc3RhdGUgPSAmdG9fc2RlX3BsYW5lX3N0YXRlKG5ld19zdGF0ZSktPnJvdDsKIAogCWlmIChwc3RhdGUtPmFzcGFjZSkgewpAQCAtMzUzOSw3ICszNjAzLDggQEAKIAkJCQkJU0RFX0ZPUk1BVF9JU19USUxFKGZtdCk7CiAJCQljZHBfY2ZnLT5wcmVsb2FkX2FoZWFkID0gU0RFX1dCX0NEUF9QUkVMT0FEX0FIRUFEXzY0OwogCi0JCQlwc2RlLT5waXBlX2h3LT5vcHMuc2V0dXBfY2RwKHBzZGUtPnBpcGVfaHcsIGNkcF9jZmcpOworCQkJcHNkZS0+cGlwZV9ody0+b3BzLnNldHVwX2NkcChwc2RlLT5waXBlX2h3LCBjZHBfY2ZnLAorCQkJCQlwc3RhdGUtPm11bHRpcmVjdF9pbmRleCk7CiAJCX0KIAogCQlpZiAocHNkZS0+cGlwZV9ody0+b3BzLnNldHVwX3N5c19jYWNoZSkgewpAQCAtNDA2MSw1MSArNDEyNiwxMSBAQAogCQkJJnBzdGF0ZS0+cHJvcGVydHlfc3RhdGUsIFBMQU5FX1BST1BfU0NBTEVSX1YyKTsKIAogCS8qIHBvcHVsYXRlIGZyb20gdXNlciBzcGFjZSAqLworCXNkZV9zZXRfc2NhbGVyX3YyKGNmZywgJnNjYWxlX3YyKTsKKwogCXBlID0gJnBzdGF0ZS0+cGl4ZWxfZXh0OwogCW1lbXNldChwZSwgMCwgc2l6ZW9mKHN0cnVjdCBzZGVfaHdfcGl4ZWxfZXh0KSk7Ci0JY2ZnLT5lbmFibGUgPSBzY2FsZV92Mi5lbmFibGU7Ci0JY2ZnLT5kaXJfZW4gPSBzY2FsZV92Mi5kaXJfZW47Ci0JZm9yIChpID0gMDsgaSA8IFNERV9NQVhfUExBTkVTOyBpKyspIHsKLQkJY2ZnLT5pbml0X3BoYXNlX3hbaV0gPSBzY2FsZV92Mi5pbml0X3BoYXNlX3hbaV07Ci0JCWNmZy0+cGhhc2Vfc3RlcF94W2ldID0gc2NhbGVfdjIucGhhc2Vfc3RlcF94W2ldOwotCQljZmctPmluaXRfcGhhc2VfeVtpXSA9IHNjYWxlX3YyLmluaXRfcGhhc2VfeVtpXTsKLQkJY2ZnLT5waGFzZV9zdGVwX3lbaV0gPSBzY2FsZV92Mi5waGFzZV9zdGVwX3lbaV07CiAKLQkJY2ZnLT5wcmVsb2FkX3hbaV0gPSBzY2FsZV92Mi5wcmVsb2FkX3hbaV07Ci0JCWNmZy0+cHJlbG9hZF95W2ldID0gc2NhbGVfdjIucHJlbG9hZF95W2ldOwotCQljZmctPnNyY193aWR0aFtpXSA9IHNjYWxlX3YyLnNyY193aWR0aFtpXTsKLQkJY2ZnLT5zcmNfaGVpZ2h0W2ldID0gc2NhbGVfdjIuc3JjX2hlaWdodFtpXTsKLQl9Ci0JY2ZnLT5kc3Rfd2lkdGggPSBzY2FsZV92Mi5kc3Rfd2lkdGg7Ci0JY2ZnLT5kc3RfaGVpZ2h0ID0gc2NhbGVfdjIuZHN0X2hlaWdodDsKLQotCWNmZy0+eV9yZ2JfZmlsdGVyX2NmZyA9IHNjYWxlX3YyLnlfcmdiX2ZpbHRlcl9jZmc7Ci0JY2ZnLT51dl9maWx0ZXJfY2ZnID0gc2NhbGVfdjIudXZfZmlsdGVyX2NmZzsKLQljZmctPmFscGhhX2ZpbHRlcl9jZmcgPSBzY2FsZV92Mi5hbHBoYV9maWx0ZXJfY2ZnOwotCWNmZy0+YmxlbmRfY2ZnID0gc2NhbGVfdjIuYmxlbmRfY2ZnOwotCi0JY2ZnLT5sdXRfZmxhZyA9IHNjYWxlX3YyLmx1dF9mbGFnOwotCWNmZy0+ZGlyX2x1dF9pZHggPSBzY2FsZV92Mi5kaXJfbHV0X2lkeDsKLQljZmctPnlfcmdiX2Npcl9sdXRfaWR4ID0gc2NhbGVfdjIueV9yZ2JfY2lyX2x1dF9pZHg7Ci0JY2ZnLT51dl9jaXJfbHV0X2lkeCA9IHNjYWxlX3YyLnV2X2Npcl9sdXRfaWR4OwotCWNmZy0+eV9yZ2Jfc2VwX2x1dF9pZHggPSBzY2FsZV92Mi55X3JnYl9zZXBfbHV0X2lkeDsKLQljZmctPnV2X3NlcF9sdXRfaWR4ID0gc2NhbGVfdjIudXZfc2VwX2x1dF9pZHg7Ci0KLQljZmctPmRlLmVuYWJsZSA9IHNjYWxlX3YyLmRlLmVuYWJsZTsKLQljZmctPmRlLnNoYXJwZW5fbGV2ZWwxID0gc2NhbGVfdjIuZGUuc2hhcnBlbl9sZXZlbDE7Ci0JY2ZnLT5kZS5zaGFycGVuX2xldmVsMiA9IHNjYWxlX3YyLmRlLnNoYXJwZW5fbGV2ZWwyOwotCWNmZy0+ZGUuY2xpcCA9IHNjYWxlX3YyLmRlLmNsaXA7Ci0JY2ZnLT5kZS5saW1pdCA9IHNjYWxlX3YyLmRlLmxpbWl0OwotCWNmZy0+ZGUudGhyX3F1aWV0ID0gc2NhbGVfdjIuZGUudGhyX3F1aWV0OwotCWNmZy0+ZGUudGhyX2RpZW91dCA9IHNjYWxlX3YyLmRlLnRocl9kaWVvdXQ7Ci0JY2ZnLT5kZS50aHJfbG93ID0gc2NhbGVfdjIuZGUudGhyX2xvdzsKLQljZmctPmRlLnRocl9oaWdoID0gc2NhbGVfdjIuZGUudGhyX2hpZ2g7Ci0JY2ZnLT5kZS5wcmVjX3NoaWZ0ID0gc2NhbGVfdjIuZGUucHJlY19zaGlmdDsKLQlmb3IgKGkgPSAwOyBpIDwgU0RFX01BWF9ERV9DVVJWRVM7IGkrKykgewotCQljZmctPmRlLmFkanVzdF9hW2ldID0gc2NhbGVfdjIuZGUuYWRqdXN0X2FbaV07Ci0JCWNmZy0+ZGUuYWRqdXN0X2JbaV0gPSBzY2FsZV92Mi5kZS5hZGp1c3RfYltpXTsKLQkJY2ZnLT5kZS5hZGp1c3RfY1tpXSA9IHNjYWxlX3YyLmRlLmFkanVzdF9jW2ldOwotCX0KIAlmb3IgKGkgPSAwOyBpIDwgU0RFX01BWF9QTEFORVM7IGkrKykgewogCQlwZS0+bGVmdF9mdGNoW2ldID0gc2NhbGVfdjIucGUubGVmdF9mdGNoW2ldOwogCQlwZS0+cmlnaHRfZnRjaFtpXSA9IHNjYWxlX3YyLnBlLnJpZ2h0X2Z0Y2hbaV07CkBAIC00MzYyLDYgKzQzODcsMTEgQEAKIAlwc2RlID0gdG9fc2RlX3BsYW5lKHBsYW5lKTsKIAlTREVfREVCVUdfUExBTkUocHNkZSwgIlxuIik7CiAKKwlpZiAocGxhbmUtPnN0YXRlICYmICFzZGVfY3J0Y19pc19yZXNldF9yZXF1aXJlZChwbGFuZS0+c3RhdGUtPmNydGMpKSB7CisJCVNERV9ERUJVR19QTEFORShwc2RlLCAiYXZvaWQgcmVzZXQgZm9yIHBsYW5lXG4iKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIHJlbW92ZSBwcmV2aW91cyBzdGF0ZSwgaWYgcHJlc2VudCAqLwogCWlmIChwbGFuZS0+c3RhdGUpIHsKIAkJc2RlX3BsYW5lX2Rlc3Ryb3lfc3RhdGUocGxhbmUsIHBsYW5lLT5zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcGxhbmUuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5oCmluZGV4IDkxMzY0N2YuLmQ2YzU4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9wbGFuZS5oCkBAIC0xMjksNiArMTI5LDcgQEAKICAqIEBtdWx0aXJlY3RfaW5kZXg6IGluZGV4IG9mIHRoZSByZWN0YW5nbGUgb2YgU1NQUAogICogQG11bHRpcmVjdF9tb2RlOiBwYXJhbGxlbCBvciB0aW1lIG11bHRpcGxleCBtdWx0aXJlY3QgbW9kZQogICogQHBlbmRpbmc6CXdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIGlzIHN0aWxsIHBlbmRpbmcKKyAqIEBkZWZlcl9wcmVwYXJlX2ZiOglpbmRpY2F0ZSBpZiBwcmVwYXJlX2ZiIGNhbGwgd2FzIGRlZmVycmVkCiAgKiBAc2NhbGVyM19jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3Igc2NhbGVyMwogICogQHBpeGVsX2V4dDogY29uZmlndXJhdGlvbiBkYXRhIGZvciBwaXhlbCBleHRlbnNpb25zCiAgKiBAc2NhbGVyX2NoZWNrX3N0YXRlOiBpbmRpY2F0ZXMgc3RhdHVzIG9mIHVzZXIgcHJvdmlkZWQgcGl4ZWwgZXh0ZW5zaW9uIGRhdGEKQEAgLTE0Niw2ICsxNDcsNyBAQAogCXVpbnQzMl90IG11bHRpcmVjdF9pbmRleDsKIAl1aW50MzJfdCBtdWx0aXJlY3RfbW9kZTsKIAlib29sIHBlbmRpbmc7CisJYm9vbCBkZWZlcl9wcmVwYXJlX2ZiOwogCiAJLyogc2NhbGVyIGNvbmZpZ3VyYXRpb24gKi8KIAlzdHJ1Y3Qgc2RlX2h3X3NjYWxlcjNfY2ZnIHNjYWxlcjNfY2ZnOwpAQCAtMjA3LDEyICsyMDksMTEgQEAKIAkJdTMyICpmbHVzaF9zc3BwLCB1MzIgKmZsdXNoX3JvdCk7CiAKIC8qKgotICogc2RlX3BsYW5lX2lzX3NidWZfbW9kZSAtIHJldHVybiBzdGF0dXMgb2Ygc3RyZWFtIGJ1ZmZlciBtb2RlCi0gKiBAcGxhbmU6ICAgUG9pbnRlciB0byBEUk0gcGxhbmUgb2JqZWN0Ci0gKiBAcHJlZmlsbDogUG9pbnRlciB0byB1cGRhdGVkIHByZWZpbGwgaW4gc3RyZWFtIGJ1ZmZlciBtb2RlIChvcHRpb25hbCkKLSAqIFJldHVybnM6IHRydWUgaWYgcGxhbmUgaXMgaW4gc3RyZWFtIGJ1ZmZlciBtb2RlCisgKiBzZGVfcGxhbmVfcm90X2NhbGNfcHJlZmlsbCAtIGNhbGN1bGF0ZSByb3RhdG9yIHN0YXJ0IHByZWZpbGwKKyAqIEBwbGFuZTogUG9pbnRlciB0byBkcm0gcGxhbmUKKyAqIHJldHVybjogcHJlZmlsbCB0aW1lIGluIGxpbmUKICAqLwotYm9vbCBzZGVfcGxhbmVfaXNfc2J1Zl9tb2RlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLCB1MzIgKnByZWZpbGwpOwordTMyIHNkZV9wbGFuZV9yb3RfY2FsY19wcmVmaWxsKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKTsKIAogLyoqCiAgKiBzZGVfcGxhbmVfcmVzdG9yZSAtIHJlc3RvcmUgaHcgc3RhdGUgaWYgcHJldmlvdXNseSBwb3dlciBjb2xsYXBzZWQKQEAgLTIyNywxMCArMjI4LDExIEBACiB2b2lkIHNkZV9wbGFuZV9mbHVzaChzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSk7CiAKIC8qKgotICogc2RlX3BsYW5lX2tpY2tvZmYgLSBmaW5hbCBwbGFuZSBvcGVyYXRpb25zIGJlZm9yZSBjb21taXQga2lja29mZgorICogc2RlX3BsYW5lX2tpY2tvZmZfcm90IC0gZmluYWwgcGxhbmUgcm90YXRvciBvcGVyYXRpb25zIGJlZm9yZSBjb21taXQga2lja29mZgogICogQHBsYW5lOiBQb2ludGVyIHRvIGRybSBwbGFuZSBzdHJ1Y3R1cmUKKyAqIFJldHVybnM6IFplcm8gb24gc3VjY2VzcwogICovCi12b2lkIHNkZV9wbGFuZV9raWNrb2ZmKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKTsKK2ludCBzZGVfcGxhbmVfa2lja29mZl9yb3Qoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpOwogCiAvKioKICAqIHNkZV9wbGFuZV9zZXRfZXJyb3I6IGVuYWJsZS9kaXNhYmxlIGVycm9yIGNvbmRpdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3JlZ19kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlL3NkZV9yZWdfZG1hLmMKaW5kZXggY2M4N2FlYi4uYTUyYWJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3JlZ19kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcmVnX2RtYS5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlICJzZGVfcmVnX2RtYS5oIgogI2luY2x1ZGUgInNkZV9od19yZWdfZG1hX3YxLmgiCisjaW5jbHVkZSAic2RlX2RiZy5oIgogCiBzdGF0aWMgaW50IGRlZmF1bHRfY2hlY2tfc3VwcG9ydChlbnVtIHNkZV9yZWdfZG1hX2ZlYXR1cmVzIGZlYXR1cmUsCiAJCSAgICAgZW51bSBzZGVfcmVnX2RtYV9ibGsgYmxrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3JtLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uYwppbmRleCBiZTNhOGFmLi5lYmNmOWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgInNkZV9od19jdGwuaCIKICNpbmNsdWRlICJzZGVfaHdfY2RtLmgiCiAjaW5jbHVkZSAic2RlX2h3X2RzcHAuaCIKKyNpbmNsdWRlICJzZGVfaHdfZHMuaCIKICNpbmNsdWRlICJzZGVfaHdfcGluZ3BvbmcuaCIKICNpbmNsdWRlICJzZGVfaHdfaW50Zi5oIgogI2luY2x1ZGUgInNkZV9od193Yi5oIgpAQCAtMzIsNiArMzMsNyBAQAogI2RlZmluZSBSTV9SUV9MT0NLKHIpICgociktPnRvcF9jdHJsICYgQklUKFNERV9STV9UT1BDVExfUkVTRVJWRV9MT0NLKSkKICNkZWZpbmUgUk1fUlFfQ0xFQVIocikgKChyKS0+dG9wX2N0cmwgJiBCSVQoU0RFX1JNX1RPUENUTF9SRVNFUlZFX0NMRUFSKSkKICNkZWZpbmUgUk1fUlFfRFNQUChyKSAoKHIpLT50b3BfY3RybCAmIEJJVChTREVfUk1fVE9QQ1RMX0RTUFApKQorI2RlZmluZSBSTV9SUV9EUyhyKSAoKHIpLT50b3BfY3RybCAmIEJJVChTREVfUk1fVE9QQ1RMX0RTKSkKICNkZWZpbmUgUk1fSVNfVE9QT0xPR1lfTUFUQ0godCwgcikgKCh0KS5udW1fbG0gPT0gKHIpLm51bV9sbSAmJiBcCiAJCQkJKHQpLm51bV9jb21wX2VuYyA9PSAocikubnVtX2VuYyAmJiBcCiAJCQkJKHQpLm51bV9pbnRmID09IChyKS5udW1faW50ZikKQEAgLTIzNCw2ICsyMzYsOSBAQAogCWNhc2UgU0RFX0hXX0JMS19EU1BQOgogCQlzZGVfaHdfZHNwcF9kZXN0cm95KGh3KTsKIAkJYnJlYWs7CisJY2FzZSBTREVfSFdfQkxLX0RTOgorCQlzZGVfaHdfZHNfZGVzdHJveShodyk7CisJCWJyZWFrOwogCWNhc2UgU0RFX0hXX0JMS19DVEw6CiAJCXNkZV9od19jdGxfZGVzdHJveShodyk7CiAJCWJyZWFrOwpAQCAtMzA0LDcgKzMwOSw3IEBACiBzdGF0aWMgaW50IF9zZGVfcm1faHdfYmxrX2NyZWF0ZSgKIAkJc3RydWN0IHNkZV9ybSAqcm0sCiAJCXN0cnVjdCBzZGVfbWRzc19jZmcgKmNhdCwKLQkJdm9pZCAqbW1pbywKKwkJdm9pZCBfX2lvbWVtICptbWlvLAogCQllbnVtIHNkZV9od19ibGtfdHlwZSB0eXBlLAogCQl1aW50MzJfdCBpZCwKIAkJdm9pZCAqaHdfY2F0YWxvZ19pbmZvKQpAQCAtMzIyLDYgKzMyNyw5IEBACiAJY2FzZSBTREVfSFdfQkxLX0RTUFA6CiAJCWh3ID0gc2RlX2h3X2RzcHBfaW5pdChpZCwgbW1pbywgY2F0KTsKIAkJYnJlYWs7CisJY2FzZSBTREVfSFdfQkxLX0RTOgorCQlodyA9IHNkZV9od19kc19pbml0KGlkLCBtbWlvLCBjYXQpOworCQlicmVhazsKIAljYXNlIFNERV9IV19CTEtfQ1RMOgogCQlodyA9IHNkZV9od19jdGxfaW5pdChpZCwgbW1pbywgY2F0KTsKIAkJYnJlYWs7CkBAIC0zNzUsNyArMzgzLDcgQEAKIAogaW50IHNkZV9ybV9pbml0KHN0cnVjdCBzZGVfcm0gKnJtLAogCQlzdHJ1Y3Qgc2RlX21kc3NfY2ZnICpjYXQsCi0JCXZvaWQgKm1taW8sCisJCXZvaWQgX19pb21lbSAqbW1pbywKIAkJc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmMsIGk7CkBAIC00NDQsNiArNDUyLDE3IEBACiAJCX0KIAl9CiAKKwlpZiAoY2F0LT5tZHBbMF0uaGFzX2Rlc3Rfc2NhbGVyKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjYXQtPmRzX2NvdW50OyBpKyspIHsKKwkJCXJjID0gX3NkZV9ybV9od19ibGtfY3JlYXRlKHJtLCBjYXQsIG1taW8sIFNERV9IV19CTEtfRFMsCisJCQkJCWNhdC0+ZHNbaV0uaWQsICZjYXQtPmRzW2ldKTsKKwkJCWlmIChyYykgeworCQkJCVNERV9FUlJPUigiZmFpbGVkOiBkcyBodyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgY2F0LT5waW5ncG9uZ19jb3VudDsgaSsrKSB7CiAJCXJjID0gX3NkZV9ybV9od19ibGtfY3JlYXRlKHJtLCBjYXQsIG1taW8sIFNERV9IV19CTEtfUElOR1BPTkcsCiAJCQkJY2F0LT5waW5ncG9uZ1tpXS5pZCwgJmNhdC0+cGluZ3BvbmdbaV0pOwpAQCAtNTQzLDE4ICs1NjIsMjIgQEAKIAkJc3RydWN0IHNkZV9ybV9yZXF1aXJlbWVudHMgKnJlcXMsCiAJCXN0cnVjdCBzZGVfcm1faHdfYmxrICpsbSwKIAkJc3RydWN0IHNkZV9ybV9od19ibGsgKipkc3BwLAorCQlzdHJ1Y3Qgc2RlX3JtX2h3X2JsayAqKmRzLAogCQlzdHJ1Y3Qgc2RlX3JtX2h3X2JsayAqKnBwLAogCQlzdHJ1Y3Qgc2RlX3JtX2h3X2JsayAqcHJpbWFyeV9sbSkKIHsKIAljb25zdCBzdHJ1Y3Qgc2RlX2xtX2NmZyAqbG1fY2ZnID0gdG9fc2RlX2h3X21peGVyKGxtLT5odyktPmNhcDsKIAljb25zdCBzdHJ1Y3Qgc2RlX3Bpbmdwb25nX2NmZyAqcHBfY2ZnOwogCXN0cnVjdCBzZGVfcm1faHdfaXRlciBpdGVyOworCWJvb2wgaXNfdmFsaWRfZHNwcCwgaXNfdmFsaWRfZHMsIHJldDsKIAogCSpkc3BwID0gTlVMTDsKKwkqZHMgPSBOVUxMOwogCSpwcCA9IE5VTEw7CiAKLQlTREVfREVCVUcoImNoZWNrIGxtICVkOiBkc3BwICVkIHBwICVkXG4iLCBsbV9jZmctPmlkLCBsbV9jZmctPmRzcHAsCi0JCQlsbV9jZmctPnBpbmdwb25nKTsKKwlTREVfREVCVUcoImNoZWNrIGxtICVkOiBkc3BwICVkIGRzICVkIHBwICVkXG4iLAorCQkJICAgbG1fY2ZnLT5pZCwgbG1fY2ZnLT5kc3BwLAorCQkJICAgbG1fY2ZnLT5kcywgbG1fY2ZnLT5waW5ncG9uZyk7CiAKIAkvKiBDaGVjayBpZiB0aGlzIGxheWVyIG1peGVyIGlzIGEgcGVlciBvZiB0aGUgcHJvcG9zZWQgcHJpbWFyeSBMTSAqLwogCWlmIChwcmltYXJ5X2xtKSB7CkBAIC01NjgsMTMgKzU5MSwyOCBAQAogCQl9CiAJfQogCi0JLyogTWF0Y2hlcyB1c2VyIHJlcXVpcmVtZW50cz8gKi8KLQlpZiAoKFJNX1JRX0RTUFAocmVxcykgJiYgbG1fY2ZnLT5kc3BwID09IERTUFBfTUFYKSB8fAotCQkJKCFSTV9SUV9EU1BQKHJlcXMpICYmIGxtX2NmZy0+ZHNwcCAhPSBEU1BQX01BWCkpIHsKLQkJU0RFX0RFQlVHKCJkc3BwIHJlcSBtaXNtYXRjaCBsbSAlZCByZXFkc3BwICVkLCBsbS0+ZHNwcCAlZFxuIiwKLQkJCQlsbV9jZmctPmlkLCAoYm9vbCkoUk1fUlFfRFNQUChyZXFzKSksCi0JCQkJbG1fY2ZnLT5kc3BwKTsKLQkJcmV0dXJuIGZhbHNlOworCWlzX3ZhbGlkX2RzcHAgPSAobG1fY2ZnLT5kc3BwICE9IERTUFBfTUFYKSA/IHRydWUgOiBmYWxzZTsKKwlpc192YWxpZF9kcyA9IChsbV9jZmctPmRzICE9IERTX01BWCkgPyB0cnVlIDogZmFsc2U7CisKKwkvKioKKwkgKiBSTV9SUV9YOiBzcGVjaWZpY2F0aW9uIG9mIHdoaWNoIExNcyB0byBjaG9vc2UKKwkgKiBpc192YWxpZF9YOiBpbmRpY2F0ZXMgd2hldGhlciBMTSBpcyB0aWVkIHdpdGggYmxvY2sgWAorCSAqIHJldDogdHJ1ZSBpZiBnaXZlbiBMTSBtYXRjaGVzIHRoZSB1c2VyIHJlcXVpcmVtZW50LCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlpZiAoUk1fUlFfRFNQUChyZXFzKSAmJiBSTV9SUV9EUyhyZXFzKSkKKwkJcmV0ID0gKGlzX3ZhbGlkX2RzcHAgJiYgaXNfdmFsaWRfZHMpOworCWVsc2UgaWYgKFJNX1JRX0RTUFAocmVxcykpCisJCXJldCA9IGlzX3ZhbGlkX2RzcHA7CisJZWxzZSBpZiAoUk1fUlFfRFMocmVxcykpCisJCXJldCA9IGlzX3ZhbGlkX2RzOworCWVsc2UKKwkJcmV0ID0gIShpc192YWxpZF9kc3BwIHx8IGlzX3ZhbGlkX2RzKTsKKworCWlmICghcmV0KSB7CisJCVNERV9ERUJVRygiZmFpbDpsbSglZClyZXFfZHNwcCglZClkc3BwKCVkKXJlcV9kcyglZClkcyglZClcbiIsCisJCQlsbV9jZmctPmlkLCAoYm9vbCkoUk1fUlFfRFNQUChyZXFzKSksIGxtX2NmZy0+ZHNwcCwKKwkJCShib29sKShSTV9SUV9EUyhyZXFzKSksIGxtX2NmZy0+ZHMpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIEFscmVhZHkgcmVzZXJ2ZWQ/ICovCkBAIC02MDUsNiArNjQzLDI4IEBACiAJCX0KIAl9CiAKKwlpZiAobG1fY2ZnLT5kcyAhPSBEU19NQVgpIHsKKwkJc2RlX3JtX2luaXRfaHdfaXRlcigmaXRlciwgMCwgU0RFX0hXX0JMS19EUyk7CisJCXdoaWxlIChfc2RlX3JtX2dldF9od19sb2NrZWQocm0sICZpdGVyKSkgeworCQkJaWYgKGl0ZXIuYmxrLT5pZCA9PSBsbV9jZmctPmRzKSB7CisJCQkJKmRzID0gaXRlci5ibGs7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoISpkcykgeworCQkJU0RFX0RFQlVHKCJsbSAlZCBmYWlsZWQgdG8gcmV0cmlldmUgZHMgJWRcbiIsIGxtLT5pZCwKKwkJCQkJbG1fY2ZnLT5kcyk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoUkVTRVJWRURfQllfT1RIRVIoKmRzLCByc3ZwKSkgeworCQkJU0RFX0RFQlVHKCJsbSAlZCBkcyAlZCBhbHJlYWR5IHJlc2VydmVkXG4iLAorCQkJCQlsbS0+aWQsICgqZHMpLT5pZCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKIAlzZGVfcm1faW5pdF9od19pdGVyKCZpdGVyLCAwLCBTREVfSFdfQkxLX1BJTkdQT05HKTsKIAl3aGlsZSAoX3NkZV9ybV9nZXRfaHdfbG9ja2VkKHJtLCAmaXRlcikpIHsKIAkJaWYgKGl0ZXIuYmxrLT5pZCA9PSBsbV9jZmctPnBpbmdwb25nKSB7CkBAIC02MjIsNiArNjgyLDcgQEAKIAkJU0RFX0RFQlVHKCJsbSAlZCBwcCAlZCBhbHJlYWR5IHJlc2VydmVkXG4iLCBsbS0+aWQsCiAJCQkJKCpwcCktPmlkKTsKIAkJKmRzcHAgPSBOVUxMOworCQkqZHMgPSBOVUxMOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC02MzAsNiArNjkxLDcgQEAKIAkJCSEodGVzdF9iaXQoU0RFX1BJTkdQT05HX1NQTElULCAmcHBfY2ZnLT5mZWF0dXJlcykpKSB7CiAJCVNERV9ERUJVRygicHAgJWQgZG9lc24ndCBzdXBwb3J0IHBwc3BsaXRcbiIsIHBwX2NmZy0+aWQpOwogCQkqZHNwcCA9IE5VTEw7CisJCSpkcyA9IE5VTEw7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTY0NCw2ICs3MDYsNyBAQAogewogCXN0cnVjdCBzZGVfcm1faHdfYmxrICpsbVtNQVhfQkxPQ0tTXTsKIAlzdHJ1Y3Qgc2RlX3JtX2h3X2JsayAqZHNwcFtNQVhfQkxPQ0tTXTsKKwlzdHJ1Y3Qgc2RlX3JtX2h3X2JsayAqZHNbTUFYX0JMT0NLU107CiAJc3RydWN0IHNkZV9ybV9od19ibGsgKnBwW01BWF9CTE9DS1NdOwogCXN0cnVjdCBzZGVfcm1faHdfaXRlciBpdGVyX2ksIGl0ZXJfajsKIAlpbnQgbG1fY291bnQgPSAwOwpAQCAtNjYwLDE0ICs3MjMsMTYgQEAKIAkJCV9zZGVfcm1fZ2V0X2h3X2xvY2tlZChybSwgJml0ZXJfaSkpIHsKIAkJbWVtc2V0KCZsbSwgMCwgc2l6ZW9mKGxtKSk7CiAJCW1lbXNldCgmZHNwcCwgMCwgc2l6ZW9mKGRzcHApKTsKKwkJbWVtc2V0KCZkcywgMCwgc2l6ZW9mKGRzKSk7CiAJCW1lbXNldCgmcHAsIDAsIHNpemVvZihwcCkpOwogCiAJCWxtX2NvdW50ID0gMDsKIAkJbG1bbG1fY291bnRdID0gaXRlcl9pLmJsazsKIAotCQlpZiAoIV9zZGVfcm1fY2hlY2tfbG1fYW5kX2dldF9jb25uZWN0ZWRfYmxrcyhybSwgcnN2cCwgcmVxcywKLQkJCQlsbVtsbV9jb3VudF0sICZkc3BwW2xtX2NvdW50XSwgJnBwW2xtX2NvdW50XSwKLQkJCQlOVUxMKSkKKwkJaWYgKCFfc2RlX3JtX2NoZWNrX2xtX2FuZF9nZXRfY29ubmVjdGVkX2Jsa3MoCisJCQkJcm0sIHJzdnAsIHJlcXMsIGxtW2xtX2NvdW50XSwKKwkJCQkmZHNwcFtsbV9jb3VudF0sICZkc1tsbV9jb3VudF0sCisJCQkJJnBwW2xtX2NvdW50XSwgTlVMTCkpCiAJCQljb250aW51ZTsKIAogCQkrK2xtX2NvdW50OwpAQCAtNjgwLDggKzc0NSw5IEBACiAJCQlpZiAoaXRlcl9pLmJsayA9PSBpdGVyX2ouYmxrKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoIV9zZGVfcm1fY2hlY2tfbG1fYW5kX2dldF9jb25uZWN0ZWRfYmxrcyhybSwgcnN2cCwKLQkJCQkJcmVxcywgaXRlcl9qLmJsaywgJmRzcHBbbG1fY291bnRdLAorCQkJaWYgKCFfc2RlX3JtX2NoZWNrX2xtX2FuZF9nZXRfY29ubmVjdGVkX2Jsa3MoCisJCQkJCXJtLCByc3ZwLCByZXFzLCBpdGVyX2ouYmxrLAorCQkJCQkmZHNwcFtsbV9jb3VudF0sICZkc1tsbV9jb3VudF0sCiAJCQkJCSZwcFtsbV9jb3VudF0sIGl0ZXJfaS5ibGspKQogCQkJCWNvbnRpbnVlOwogCkBAIC03MDQsOCArNzcwLDEyIEBACiAJCWlmIChkc3BwW2ldKQogCQkJZHNwcFtpXS0+cnN2cF9ueHQgPSByc3ZwOwogCisJCWlmIChkc1tpXSkKKwkJCWRzW2ldLT5yc3ZwX254dCA9IHJzdnA7CisKIAkJU0RFX0VWVDMyKGxtW2ldLT50eXBlLCByc3ZwLT5lbmNfaWQsIGxtW2ldLT5pZCwgcHBbaV0tPmlkLAotCQkJCWRzcHBbaV0gPyBkc3BwW2ldLT5pZCA6IDApOworCQkJCWRzcHBbaV0gPyBkc3BwW2ldLT5pZCA6IDAsCisJCQkJZHNbaV0gPyBkc1tpXS0+aWQgOiAwKTsKIAl9CiAKIAlpZiAocmVxcy0+dG9wb2xvZ3ktPnRvcF9uYW1lID09IFNERV9STV9UT1BPTE9HWV9QUFNQTElUKSB7CkBAIC0xMDE4LDYgKzEwODgsMTUgQEAKIAlpZiAocmVxcy0+dG9wb2xvZ3ktPm51bV9jb21wX2VuYykKIAkJcmVxcy0+dG9wX2N0cmwgfD0gQklUKFNERV9STV9UT1BDVExfRFNQUCk7CiAKKwkvKioKKwkgKiBTZXQgdGhlIHJlcXVpcmVtZW50IGJhc2VkIG9uIGNhcHMgaWYgbm90IHNldCBmcm9tIHVzZXIgc3BhY2UKKwkgKiBUaGlzIHdpbGwgZW5zdXJlIHRvIHNlbGVjdCBMTSB0aWVkIHdpdGggRFMgYmxvY2tzCisJICogQ3VycmVudGx5LCBEUyBibG9ja3MgYXJlIHRpZWQgd2l0aCBMTSAwIGFuZCBMTSAxIChwcmltYXJ5IGRpc3BsYXkpCisJICovCisJaWYgKCFSTV9SUV9EUyhyZXFzKSAmJiBybS0+aHdfbWRwLT5jYXBzLT5oYXNfZGVzdF9zY2FsZXIgJiYKKwkJY29ubl9zdGF0ZS0+Y29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PSBEUk1fTU9ERV9DT05ORUNUT1JfRFNJKQorCQlyZXFzLT50b3BfY3RybCB8PSBCSVQoU0RFX1JNX1RPUENUTF9EUyk7CisKIAlTREVfREVCVUcoInRvcF9jdHJsOiAweCVsbFggbnVtX2hfdGlsZXM6ICVkXG4iLCByZXFzLT50b3BfY3RybCwKIAkJCXJlcXMtPmh3X3Jlcy5kaXNwbGF5X251bV9vZl9oX3RpbGVzKTsKIAlTREVfREVCVUcoIm51bV9sbTogJWQgbnVtX2N0bDogJWQgdG9wb2xvZ3k6ICVkIHNwbGl0X2Rpc3BsYXk6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGUvc2RlX3JtLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uaAppbmRleCBiNGE4MDFhLi4xZTQ4ODU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZS9zZGVfcm0uaApAQCAtNTYsMTEgKzU2LDEzIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgYmVoYXZpb3Igd291bGQgbm90IGltcGFjdCB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmF0aW9uIGxpc3QgZHVyaW5nIHRoZSBBdG9taWNUZXN0IHBoYXNlLgogICogQFNERV9STV9UT1BDVExfRFNQUDogUmVxdWlyZSBsYXllciBtaXhlcnMgd2l0aCBEU1BQIGNhcGFiaWxpdGllcworICogQFNERV9STV9UT1BDVExfRFMgIDogUmVxdWlyZSBsYXllciBtaXhlcnMgd2l0aCBEUyBjYXBhYmlsaXRpZXMKICAqLwogZW51bSBzZGVfcm1fdG9wb2xvZ3lfY29udHJvbCB7CiAJU0RFX1JNX1RPUENUTF9SRVNFUlZFX0xPQ0ssCiAJU0RFX1JNX1RPUENUTF9SRVNFUlZFX0NMRUFSLAogCVNERV9STV9UT1BDVExfRFNQUCwKKwlTREVfUk1fVE9QQ1RMX0RTLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9kYmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2RiZy5jCmluZGV4IDdlNThjMmYuLmRjMTZhYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2RiZy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2RiZy5jCkBAIC00NCw2ICs0NCw3IEBACiAKIC8qIG9mZnNldHMgZnJvbSBzZGUgdG9wIGFkZHJlc3MgZm9yIHRoZSBkZWJ1ZyBidXNlcyAqLwogI2RlZmluZSBEQkdCVVNfU1NQUDAJMHgxODgKKyNkZWZpbmUgREJHQlVTX0FYSV9JTlRGCTB4MTk0CiAjZGVmaW5lIERCR0JVU19TU1BQMQkweDI5OAogI2RlZmluZSBEQkdCVVNfRFNQUAkweDM0OAogI2RlZmluZSBEQkdCVVNfUEVSSVBICTB4NDE4CkBAIC02Niw2ICs2Nyw3IEBACiAvKiBwcmludCBkZWJ1ZyByYW5nZXMgaW4gZ3JvdXBzIG9mIDQgdTMycyAqLwogI2RlZmluZSBSRUdfRFVNUF9BTElHTgkJMTYKIAorI2RlZmluZSBSU0NfREVCVUdfTVVYX1NFTF9TRE04NDUgOQogLyoqCiAgKiBzdHJ1Y3Qgc2RlX2RiZ19yZWdfb2Zmc2V0IC0gdHJhY2tpbmcgZm9yIHN0YXJ0IGFuZCBlbmQgb2YgcmVnaW9uCiAgKiBAc3RhcnQ6IHN0YXJ0IG9mZnNldApAQCAtMTI4LDcgKzEzMCw4IEBACiAJdTMyIHdyX2FkZHI7CiAJdTMyIGJsb2NrX2lkOwogCXUzMiB0ZXN0X2lkOwotCXZvaWQgKCphbmFseXplcikoc3RydWN0IHNkZV9kZWJ1Z19idXNfZW50cnkgKmVudHJ5LCB1MzIgdmFsKTsKKwl2b2lkICgqYW5hbHl6ZXIpKHZvaWQgX19pb21lbSAqbWVtX2Jhc2UsCisJCQkJc3RydWN0IHNkZV9kZWJ1Z19idXNfZW50cnkgKmVudHJ5LCB1MzIgdmFsKTsKIH07CiAKIHN0cnVjdCB2YmlmX2RlYnVnX2J1c19lbnRyeSB7CkBAIC0xNzQsNiArMTc3LDcgQEAKICAqIEBkYmdidXNfc2RlOiBkZWJ1ZyBidXMgc3RydWN0dXJlIGZvciB0aGUgc2RlCiAgKiBAZGJnYnVzX3ZiaWZfcnQ6IGRlYnVnIGJ1cyBzdHJ1Y3R1cmUgZm9yIHRoZSByZWFsdGltZSB2YmlmCiAgKiBAZHVtcF9hbGw6IGR1bXAgYWxsIGVudHJpZXMgaW4gcmVnaXN0ZXIgZHVtcAorICogQGRzaV9kYmdfYnVzOiBkdW1wIGRzaSBkZWJ1ZyBidXMgcmVnaXN0ZXIKICAqLwogc3RhdGljIHN0cnVjdCBzZGVfZGJnX2Jhc2UgewogCXN0cnVjdCBzZGVfZGJnX2V2dGxvZyAqZXZ0bG9nOwpAQCAtMTkxLDIwICsxOTUsMjEgQEAKIAlzdHJ1Y3Qgc2RlX2RiZ19zZGVfZGVidWdfYnVzIGRiZ2J1c19zZGU7CiAJc3RydWN0IHNkZV9kYmdfdmJpZl9kZWJ1Z19idXMgZGJnYnVzX3ZiaWZfcnQ7CiAJYm9vbCBkdW1wX2FsbDsKKwlib29sIGRzaV9kYmdfYnVzOwogfSBzZGVfZGJnX2Jhc2U7CiAKIC8qIHNkZV9kYmdfYmFzZV9ldnRsb2cgLSBnbG9iYWwgcG9pbnRlciB0byBtYWluIHNkZSBldmVudCBsb2cgZm9yIG1hY3JvIHVzZSAqLwogc3RydWN0IHNkZV9kYmdfZXZ0bG9nICpzZGVfZGJnX2Jhc2VfZXZ0bG9nOwogCi1zdGF0aWMgdm9pZCBfc2RlX2RlYnVnX2J1c194YmFyX2R1bXAoc3RydWN0IHNkZV9kZWJ1Z19idXNfZW50cnkgKmVudHJ5LAotCQl1MzIgdmFsKQorc3RhdGljIHZvaWQgX3NkZV9kZWJ1Z19idXNfeGJhcl9kdW1wKHZvaWQgX19pb21lbSAqbWVtX2Jhc2UsCisJCXN0cnVjdCBzZGVfZGVidWdfYnVzX2VudHJ5ICplbnRyeSwgdTMyIHZhbCkKIHsKIAlkZXZfZXJyKHNkZV9kYmdfYmFzZS5kZXYsICJ4YmFyIDB4JXggJWQgJWQgMHgleFxuIiwKIAkJCWVudHJ5LT53cl9hZGRyLCBlbnRyeS0+YmxvY2tfaWQsIGVudHJ5LT50ZXN0X2lkLCB2YWwpOwogfQogCi1zdGF0aWMgdm9pZCBfc2RlX2RlYnVnX2J1c19sbV9kdW1wKHN0cnVjdCBzZGVfZGVidWdfYnVzX2VudHJ5ICplbnRyeSwKLQkJdTMyIHZhbCkKK3N0YXRpYyB2b2lkIF9zZGVfZGVidWdfYnVzX2xtX2R1bXAodm9pZCBfX2lvbWVtICptZW1fYmFzZSwKKwkJc3RydWN0IHNkZV9kZWJ1Z19idXNfZW50cnkgKmVudHJ5LCB1MzIgdmFsKQogewogCWlmICghKHZhbCAmIDB4RkZGMDAwKSkKIAkJcmV0dXJuOwpAQCAtMjEzLDggKzIxOCw4IEBACiAJCQllbnRyeS0+d3JfYWRkciwgZW50cnktPmJsb2NrX2lkLCBlbnRyeS0+dGVzdF9pZCwgdmFsKTsKIH0KIAotc3RhdGljIHZvaWQgX3NkZV9kZWJ1Z19idXNfcHBiMF9kdW1wKHN0cnVjdCBzZGVfZGVidWdfYnVzX2VudHJ5ICplbnRyeSwKLQkJdTMyIHZhbCkKK3N0YXRpYyB2b2lkIF9zZGVfZGVidWdfYnVzX3BwYjBfZHVtcCh2b2lkIF9faW9tZW0gKm1lbV9iYXNlLAorCQlzdHJ1Y3Qgc2RlX2RlYnVnX2J1c19lbnRyeSAqZW50cnksIHUzMiB2YWwpCiB7CiAJaWYgKCEodmFsICYgQklUKDE1KSkpCiAJCXJldHVybjsKQEAgLTIyMyw4ICsyMjgsOCBAQAogCQkJZW50cnktPndyX2FkZHIsIGVudHJ5LT5ibG9ja19pZCwgZW50cnktPnRlc3RfaWQsIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9zZGVfZGVidWdfYnVzX3BwYjFfZHVtcChzdHJ1Y3Qgc2RlX2RlYnVnX2J1c19lbnRyeSAqZW50cnksCi0JCXUzMiB2YWwpCitzdGF0aWMgdm9pZCBfc2RlX2RlYnVnX2J1c19wcGIxX2R1bXAodm9pZCBfX2lvbWVtICptZW1fYmFzZSwKKwkJc3RydWN0IHNkZV9kZWJ1Z19idXNfZW50cnkgKmVudHJ5LCB1MzIgdmFsKQogewogCWlmICghKHZhbCAmIEJJVCgxNSkpKQogCQlyZXR1cm47CkBAIC0yMzMsNiArMjM4LDI5IEBACiAJCQllbnRyeS0+d3JfYWRkciwgZW50cnktPmJsb2NrX2lkLCBlbnRyeS0+dGVzdF9pZCwgdmFsKTsKIH0KIAorc3RhdGljIHZvaWQgX3NkZV9kZWJ1Z19idXNfYXhpX2R1bXBfc2RtODQ1KHZvaWQgX19pb21lbSAqbWVtX2Jhc2UsCisJCXN0cnVjdCBzZGVfZGVidWdfYnVzX2VudHJ5ICplbnRyeSwgdTMyIHZhbCkKK3sKKwl1MzIgc3RhdHVzLCBpOworCisJaWYgKCFtZW1fYmFzZSB8fCAhZW50cnkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPD0gUlNDX0RFQlVHX01VWF9TRUxfU0RNODQ1OyBpKyspIHsKKwkJc2RlX3JzY19kZWJ1Z19kdW1wKGkpOworCisJCS8qIG1ha2Ugc3VyZSB0aGF0IG11eF9zZWwgdXBkYXRlZCAqLworCQl3bWIoKTsKKworCQkvKiByZWFkIHN0YXR1cyBhZ2FpbiBhZnRlciByc2Mgcm91dGVzIHRoZSBkZWJ1ZyBidXMgKi8KKwkJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChtZW1fYmFzZSArIERCR0JVU19EU1BQX1NUQVRVUyk7CisKKwkJZGV2X2VycihzZGVfZGJnX2Jhc2UuZGV2LCAicnNjIG11eF9zZWw6JWQgMHgleCAlZCAlZCAweCV4XG4iLAorCQkJaSwgZW50cnktPndyX2FkZHIsIGVudHJ5LT5ibG9ja19pZCwKKwkJCWVudHJ5LT50ZXN0X2lkLCBzdGF0dXMpOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBzZGVfZGVidWdfYnVzX2VudHJ5IGRiZ19idXNfc2RlXzg5OThbXSA9IHsKIAogCS8qIFVucGFjayAwIHNzcHAgMCovCkBAIC0xOTg2LDYgKzIwMTQsOSBAQAogCXsgREJHQlVTX1BFUklQSCwgNzEsIDN9LAogCXsgREJHQlVTX1BFUklQSCwgNzEsIDR9LAogCXsgREJHQlVTX1BFUklQSCwgNzEsIDV9LAorCisJLyogYXhpIC0gc2hvdWxkIGJlIGxhc3QgZW50cnkgKi8KKwl7IERCR0JVU19BWElfSU5URiwgNjIsIDAsIF9zZGVfZGVidWdfYnVzX2F4aV9kdW1wX3NkbTg0NX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHZiaWZfZGVidWdfYnVzX2VudHJ5IHZiaWZfZGJnX2J1c19tc204OTk4W10gPSB7CkBAIC0yMzMyLDcgKzIzNjMsNyBAQAogCQl9CiAKIAkJaWYgKGhlYWQtPmFuYWx5emVyKQotCQkJaGVhZC0+YW5hbHl6ZXIoaGVhZCwgc3RhdHVzKTsKKwkJCWhlYWQtPmFuYWx5emVyKG1lbV9iYXNlLCBoZWFkLCBzdGF0dXMpOwogCiAJCS8qIERpc2FibGUgZGVidWcgYnVzIG9uY2Ugd2UgYXJlIGRvbmUgKi8KIAkJd3JpdGVsX3JlbGF4ZWQoMCwgbWVtX2Jhc2UgKyBoZWFkLT53cl9hZGRyKTsKQEAgLTI1NDEsNiArMjU3Miw5IEBACiAJaWYgKGR1bXBfZGJnYnVzX3ZiaWZfcnQpCiAJCV9zZGVfZGJnX2R1bXBfdmJpZl9kYmdfYnVzKCZzZGVfZGJnX2Jhc2UuZGJnYnVzX3ZiaWZfcnQpOwogCisJaWYgKHNkZV9kYmdfYmFzZS5kc2lfZGJnX2J1cyB8fCBkdW1wX2FsbCkKKwkJZHNpX2N0cmxfZGVidWdfZHVtcCgpOworCiAJaWYgKGRvX3BhbmljICYmIHNkZV9kYmdfYmFzZS5wYW5pY19vbl9lcnIpCiAJCXBhbmljKG5hbWUpOwogfQpAQCAtMjYxNSw2ICsyNjQ5LDkgQEAKIAkJaWYgKCFzdHJjbXAoYmxrX25hbWUsICJ2YmlmX2RiZ19idXMiKSkKIAkJCWR1bXBfZGJnYnVzX3ZiaWZfcnQgPSB0cnVlOwogCisJCWlmICghc3RyY21wKGJsa19uYW1lLCAiZHNpX2RiZ19idXMiKSkKKwkJCXNkZV9kYmdfYmFzZS5kc2lfZGJnX2J1cyA9IHRydWU7CisKIAkJaWYgKCFzdHJjbXAoYmxrX25hbWUsICJwYW5pYyIpKQogCQkJZG9fcGFuaWMgPSB0cnVlOwogCX0KQEAgLTI2MjcsNiArMjY2NCw3IEBACiAJCQkJZHVtcF9kYmdidXNfc2RlOwogCQlzZGVfZGJnX2Jhc2UuZGJnYnVzX3ZiaWZfcnQuY21uLmluY2x1ZGVfaW5fZGVmZXJyZWRfd29yayA9CiAJCQkJZHVtcF9kYmdidXNfdmJpZl9ydDsKKwkJc2RlX2RiZ19iYXNlLmR1bXBfYWxsID0gZHVtcF9hbGw7CiAJCXNjaGVkdWxlX3dvcmsoJnNkZV9kYmdfYmFzZS5kdW1wX3dvcmspOwogCX0gZWxzZSB7CiAJCV9zZGVfZHVtcF9hcnJheShibGtfYXJyLCBibGtfbGVuLCBkb19wYW5pYywgbmFtZSwKQEAgLTMwNjcsOSArMzEwNSw3IEBACiAJbWVtc2V0KCZkYmctPmRiZ2J1c19zZGUsIDAsIHNpemVvZihkYmctPmRiZ2J1c19zZGUpKTsKIAltZW1zZXQoJmRiZy0+ZGJnYnVzX3ZiaWZfcnQsIDAsIHNpemVvZihkYmctPmRiZ2J1c192YmlmX3J0KSk7CiAKLQlzd2l0Y2ggKGh3dmVyc2lvbikgewotCWNhc2UgU0RFX0hXX1ZFUl8zMDA6Ci0JY2FzZSBTREVfSFdfVkVSXzMwMToKKwlpZiAoSVNfTVNNODk5OF9UQVJHRVQoaHd2ZXJzaW9uKSkgewogCQlkYmctPmRiZ2J1c19zZGUuZW50cmllcyA9IGRiZ19idXNfc2RlXzg5OTg7CiAJCWRiZy0+ZGJnYnVzX3NkZS5jbW4uZW50cmllc19zaXplID0gQVJSQVlfU0laRShkYmdfYnVzX3NkZV84OTk4KTsKIAkJZGJnLT5kYmdidXNfc2RlLmNtbi5mbGFncyA9IERCR0JVU19GTEFHU19EU1BQOwpAQCAtMzA3Nyw5ICszMTEzLDcgQEAKIAkJZGJnLT5kYmdidXNfdmJpZl9ydC5lbnRyaWVzID0gdmJpZl9kYmdfYnVzX21zbTg5OTg7CiAJCWRiZy0+ZGJnYnVzX3ZiaWZfcnQuY21uLmVudHJpZXNfc2l6ZSA9CiAJCQkJQVJSQVlfU0laRSh2YmlmX2RiZ19idXNfbXNtODk5OCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTREVfSFdfVkVSXzQwMDoKKwl9IGVsc2UgaWYgKElTX1NETTg0NV9UQVJHRVQoaHd2ZXJzaW9uKSB8fCBJU19TRE02NzBfVEFSR0VUKGh3dmVyc2lvbikpIHsKIAkJZGJnLT5kYmdidXNfc2RlLmVudHJpZXMgPSBkYmdfYnVzX3NkZV9zZG04NDU7CiAJCWRiZy0+ZGJnYnVzX3NkZS5jbW4uZW50cmllc19zaXplID0KIAkJCQlBUlJBWV9TSVpFKGRiZ19idXNfc2RlX3NkbTg0NSk7CkBAIC0zMDg5LDEwICszMTIzLDggQEAKIAkJZGJnLT5kYmdidXNfdmJpZl9ydC5lbnRyaWVzID0gdmJpZl9kYmdfYnVzX21zbTg5OTg7CiAJCWRiZy0+ZGJnYnVzX3ZiaWZfcnQuY21uLmVudHJpZXNfc2l6ZSA9CiAJCQkJQVJSQVlfU0laRSh2YmlmX2RiZ19idXNfbXNtODk5OCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigidW5zdXBwb3J0ZWQgY2hpcHNldCBpZCAldVxuIiwgaHd2ZXJzaW9uKTsKLQkJYnJlYWs7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBjaGlwc2V0IGlkICVYXG4iLCBod3ZlcnNpb24pOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZGJnLmggYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9kYmcuaAppbmRleCBhMjY2NTc0Li43ODY0NTFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZGJnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZGJnLmgKQEAgLTMxNSw2ICszMTUsMTcgQEAKIGludCBzZGVfZXZ0bG9nX2dldF9maWx0ZXIoc3RydWN0IHNkZV9kYmdfZXZ0bG9nICpldnRsb2csIGludCBpbmRleCwKIAkJY2hhciAqYnVmLCBzaXplX3QgYnVmc3opOwogCisvKioKKyAqIHNkZV9yc2NfZGVidWdfZHVtcCAtIHNkZSByc2MgZGVidWcgZHVtcCBzdGF0dXMKKyAqIEBtdXhfc2VsOglzZWxlY3QgbXV4IG9uIHJzYyBkZWJ1ZyBidXMKKyAqLwordm9pZCBzZGVfcnNjX2RlYnVnX2R1bXAodTMyIG11eF9zZWwpOworCisvKioKKyAqIGRzaV9jdHJsX2RlYnVnX2R1bXAgLSBkdW1wIGRzaSBkZWJ1ZyBkdW1wIHN0YXR1cworICovCit2b2lkIGRzaV9jdHJsX2RlYnVnX2R1bXAodm9pZCk7CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzZGVfZGJnX2V2dGxvZyAqc2RlX2V2dGxvZ19pbml0KHZvaWQpCiB7CkBAIC0zOTYsNiArNDA3LDE0IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZGVfcnNjX2RlYnVnX2R1bXAodTMyIG11eF9zZWwpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfY3RybF9kZWJ1Z19kdW1wKHZvaWQpCit7Cit9CisKICNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9lZGlkX3BhcnNlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZWRpZF9wYXJzZXIuYwppbmRleCAzZDZjMmVhLi43OTFhNmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9lZGlkX3BhcnNlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2VkaWRfcGFyc2VyLmMKQEAgLTYwNSw2ICs2MDUsMzAgQEAKIAl9CiB9CiAKK3U4IHNkZV9nZXRfZWRpZF9jaGVja3N1bSh2b2lkICppbnB1dCkKK3sKKwlzdHJ1Y3Qgc2RlX2VkaWRfY3RybCAqZWRpZF9jdHJsID0gKHN0cnVjdCBzZGVfZWRpZF9jdHJsICopKGlucHV0KTsKKwlzdHJ1Y3QgZWRpZCAqZWRpZCA9IE5VTEwsICpsYXN0X2Jsb2NrID0gTlVMTDsKKwl1OCAqcmF3X2VkaWQgPSBOVUxMOworCisJaWYgKCFlZGlkX2N0cmwgfHwgIWVkaWRfY3RybC0+ZWRpZCkgeworCQlTREVfRVJST1IoImludmFsaWQgZWRpZCBpbnB1dFxuIik7CisJCXJldHVybiAwOworCX0KKworCWVkaWQgPSBlZGlkX2N0cmwtPmVkaWQ7CisKKwlyYXdfZWRpZCA9ICh1OCAqKWVkaWQ7CisJcmF3X2VkaWQgKz0gKGVkaWQtPmV4dGVuc2lvbnMgKiBFRElEX0xFTkdUSCk7CisJbGFzdF9ibG9jayA9IChzdHJ1Y3QgZWRpZCAqKXJhd19lZGlkOworCisJaWYgKGxhc3RfYmxvY2spCisJCXJldHVybiBsYXN0X2Jsb2NrLT5jaGVja3N1bTsKKworCVNERV9FUlJPUigiSW52YWxpZCBibG9jaywgbm8gY2hlY2tzdW1cbiIpOworCXJldHVybiAwOworfQorCiBib29sIHNkZV9kZXRlY3RfaGRtaV9tb25pdG9yKHZvaWQgKmlucHV0KQogewogCXN0cnVjdCBzZGVfZWRpZF9jdHJsICplZGlkX2N0cmwgPSAoc3RydWN0IHNkZV9lZGlkX2N0cmwgKikoaW5wdXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZWRpZF9wYXJzZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2VkaWRfcGFyc2VyLmgKaW5kZXggYjU4YjMyMi4uMDdiZGY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfZWRpZF9wYXJzZXIuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9lZGlkX3BhcnNlci5oCkBAIC0xNDYsNiArMTQ2LDE0IEBACiB1MzIgc2RlX2dldF9zaW5rX2JwYyh2b2lkICplZGlkX2N0cmwpOwogCiAvKioKKyAqIHNkZV9nZXRfZWRpZF9jaGVja3N1bSgpIC0gcmV0dXJuIHRoZSBjaGVja3N1bSBvZiBsYXN0IGJsb2NrIG9mIEVESUQuCisgKiBAaW5wdXQ6ICAgICBIYW5kbGUgdG8gdGhlIGVkaWRfY3RybCBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiBjaGVja3N1bSBvZiB0aGUgbGFzdCBFRElEIGJsb2NrLgorICovCit1OCBzZGVfZ2V0X2VkaWRfY2hlY2tzdW0odm9pZCAqaW5wdXQpOworCisvKioKICAqIF9zZGVfZWRpZF91cGRhdGVfbW9kZXMoKSAtIHBvcHVsYXRlIEVESUQgbW9kZXMuCiAgKiBAZWRpZF9jdHJsOiAgICAgSGFuZGxlIHRvIHRoZSBlZGlkX2N0cmwgc3RydWN0dXJlLgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2hkY3BfMXguYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2hkY3BfMXguYwppbmRleCA3OTUxYzIzLi4zNjczZDEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfaGRjcF8xeC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX2hkY3BfMXguYwpAQCAtMzYzLDEyICszNjMsMTUgQEAKIAkJCWlmIChieXRlc19yZWFkICE9IHJlYWRfc2l6ZSkgewogCQkJCXByX2VycigiZmFpbDogb2Zmc2V0KDB4JXgpLCBzaXplKDB4JXgpLCByYygweCV4KVxuIiwKIAkJCQkJb2Zmc2V0LCByZWFkX3NpemUsIGJ5dGVzX3JlYWQpOworCQkJCXJjID0gLUVJTzsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJYnVmICs9IHJlYWRfc2l6ZTsKLQkJCW9mZnNldCArPSByZWFkX3NpemU7CiAJCQlzaXplIC09IHJlYWRfc2l6ZTsKKworCQkJaWYgKCFyZWFsaWduKQorCQkJCW9mZnNldCArPSByZWFkX3NpemU7CiAJCX0gd2hpbGUgKHNpemUgPiAwKTsKIAl9CiAKQEAgLTM5Myw2ICszOTYsNyBAQAogCQkJaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gd3JpdGVfc2l6ZSkgewogCQkJCXByX2VycigiZmFpbDogb2Zmc2V0KDB4JXgpLCBzaXplKDB4JXgpLCByYygweCV4KVxuIiwKIAkJCQkJb2Zmc2V0LCB3cml0ZV9zaXplLCBieXRlc193cml0dGVuKTsKKwkJCQlyYyA9IC1FSU87CiAJCQkJYnJlYWs7CiAJCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX3JzYy5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfcnNjLmMKaW5kZXggYjY1NGIyNi4uODJiMTE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfcnNjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfcnNjLmMKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCX0gZWxzZSBpZiAocnNjLT5od19vcHMuc3RhdGVfdXBkYXRlKSB7CiAJCXJjID0gcnNjLT5od19vcHMuc3RhdGVfdXBkYXRlKHJzYywgU0RFX1JTQ19JRExFX1NUQVRFKTsKIAkJaWYgKCFyYykKLQkJCXJwbWhfbW9kZV9zb2x2ZXJfc2V0KHJzYy0+ZGlzcF9yc2MsIGZhbHNlKTsKKwkJCXJwbWhfbW9kZV9zb2x2ZXJfc2V0KHJzYy0+ZGlzcF9yc2MsIHRydWUpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTgzNyw2ICs4MzcsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2RlX3JzY19jbGllbnRfdm90ZSk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKK3ZvaWQgc2RlX3JzY19kZWJ1Z19kdW1wKHUzMiBtdXhfc2VsKQoreworCXN0cnVjdCBzZGVfcnNjX3ByaXYgKnJzYzsKKworCXJzYyA9IHJzY19wcnZfbGlzdFtTREVfUlNDX0lOREVYXTsKKwlpZiAoIXJzYykKKwkJcmV0dXJuOworCisJLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIHJzYyBjbG9ja3MgZW5hYmxlZCAqLworCWlmIChyc2MtPmh3X29wcy5kZWJ1Z19kdW1wKQorCQlyc2MtPmh3X29wcy5kZWJ1Z19kdW1wKHJzYywgbXV4X3NlbCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICovCisKIHN0YXRpYyBpbnQgX3NkZV9kZWJ1Z2ZzX3N0YXR1c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2RlX3JzY19wcml2ICpyc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9yc2NfaHcuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX3JzY19ody5jCmluZGV4IGI0NzRkMjEuLmU5NTc3NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX3JzY19ody5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX3JzY19ody5jCkBAIC01MTUsNyArNTE1LDcgQEAKIAkJcmVnID0gZHNzX3JlZ19yKCZyc2MtPndyYXBwZXJfaW8sCiAJCQlTREVfUlNDQ19XUkFQUEVSX09WRVJSSURFX0NUUkwsIHJzYy0+ZGVidWdfbW9kZSk7CiAJCXJlZyB8PSAoQklUKDApIHwgQklUKDgpKTsKLQkJcmVnICY9IH4oQklUKDEpIHwgQklUKDIpIHwgQklUKDMpIHwgQklUKDYpIHwgQklUKDcpKTsKKwkJcmVnICY9IH4oQklUKDEpIHwgQklUKDIpIHwgQklUKDMpIHwgQklUKDYpIHwgQklUKDcpIHwgQklUKDkpKTsKIAkJZHNzX3JlZ193KCZyc2MtPndyYXBwZXJfaW8sIFNERV9SU0NDX1dSQVBQRVJfT1ZFUlJJREVfQ1RSTCwKIAkJCQkJCQlyZWcsIHJzYy0+ZGVidWdfbW9kZSk7CiAJCS8qIG1ha2Ugc3VyZSB0aGF0IHNvbHZlciBpcyBlbmFibGVkICovCkBAIC03NDYsNiArNzQ2LDEyIEBACiAJcmV0dXJuIGJsZW47CiB9CiAKK3N0YXRpYyB2b2lkIHJzY19od19kZWJ1Z19kdW1wKHN0cnVjdCBzZGVfcnNjX3ByaXYgKnJzYywgdTMyIG11eF9zZWwpCit7CisJZHNzX3JlZ193KCZyc2MtPndyYXBwZXJfaW8sIFNERV9SU0NDX1dSQVBQRVJfREVCVUdfQlVTLAorCQkoKG11eF9zZWwgJiAweGYpIDw8IDEpIHwgQklUKDApLCByc2MtPmRlYnVnX21vZGUpOworfQorCiBib29sIHJzY19od19pc19hbWNfbW9kZShzdHJ1Y3Qgc2RlX3JzY19wcml2ICpyc2MpCiB7CiAJcmV0dXJuIGRzc19yZWdfcigmcnNjLT5kcnZfaW8sIFNERV9SU0NDX1RDU19EUlYwX0NPTlRST0wsCkBAIC04MDYsNiArODEyLDcgQEAKIAlyc2MtPmh3X29wcy5zdGF0ZV91cGRhdGUgPSBzZGVfcnNjX3N0YXRlX3VwZGF0ZTsKIAlyc2MtPmh3X29wcy5kZWJ1Z19zaG93ID0gc2RlX3JzY19kZWJ1Z19zaG93OwogCXJzYy0+aHdfb3BzLm1vZGVfY3RybCA9IHJzY19od19tb2RlX2N0cmw7CisJcnNjLT5od19vcHMuZGVidWdfZHVtcCA9IHJzY19od19kZWJ1Z19kdW1wOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9yc2NfcHJpdi5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9zZGVfcnNjX3ByaXYuaAppbmRleCBjOTZjZTc1Li42NGIwMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL3NkZV9yc2NfcHJpdi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vc2RlX3JzY19wcml2LmgKQEAgLTczLDYgKzczLDcgQEAKICAqIEBod192c3luYzoJCQlFbmFibGVzIHRoZSB2c3luYyBvbiBSU0MgYmxvY2suCiAgKiBAdGNzX3VzZV9vazoJCQlzZXQgVENTIHNldCB0byBoaWdoIHRvIGFsbG93IFJTQyB0byB1c2UgaXQuCiAgKiBAaXNfYW1jX21vZGU6CQlDaGVjayBjdXJyZW50IGFtYyBtb2RlIHN0YXR1cworICogQGRlYnVnX2R1bXA6CQkJZHVtcCBkZWJ1ZyBidXMgcmVnaXN0ZXJzIG9yIGVuYWJsZSBkZWJ1ZyBidXMKICAqIEBzdGF0ZV91cGRhdGU6CQlFbmFibGUvb3ZlcnJpZGUgdGhlIHNvbHZlciBiYXNlZCBvbiByc2Mgc3RhdGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzIChjb21tYW5kL3ZpZGVvKQogICogQG1vZGVfc2hvdzoJCQlzaG93cyBjdXJyZW50IG1vZGUgc3RhdHVzLCBtb2RlMC8xLzIKQEAgLTg3LDYgKzg4LDcgQEAKIAkJY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIHUzMiBtb2RlKTsKIAlpbnQgKCp0Y3NfdXNlX29rKShzdHJ1Y3Qgc2RlX3JzY19wcml2ICpyc2MpOwogCWJvb2wgKCppc19hbWNfbW9kZSkoc3RydWN0IHNkZV9yc2NfcHJpdiAqcnNjKTsKKwl2b2lkICgqZGVidWdfZHVtcCkoc3RydWN0IHNkZV9yc2NfcHJpdiAqcnNjLCB1MzIgbXV4X3NlbCk7CiAJaW50ICgqc3RhdGVfdXBkYXRlKShzdHJ1Y3Qgc2RlX3JzY19wcml2ICpyc2MsIGVudW0gc2RlX3JzY19zdGF0ZSBzdGF0ZSk7CiAJaW50ICgqZGVidWdfc2hvdykoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3Qgc2RlX3JzY19wcml2ICpyc2MpOwogCWludCAoKm1vZGVfY3RybCkoc3RydWN0IHNkZV9yc2NfcHJpdiAqcnNjLCBlbnVtIHJzY19tb2RlX3JlcSByZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGlzcC9udjUwLmggYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kaXNwL252NTAuaAppbmRleCAxZTFkZTZiLi41ODkzYmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kaXNwL252NTAuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kaXNwL252NTAuaApAQCAtMjcsNyArMjcsNyBAQAogCQl1OCB0eXBlWzNdOwogCX0gcGlvcjsKIAotCXN0cnVjdCBudjUwX2Rpc3BfY2hhbiAqY2hhblsxN107CisJc3RydWN0IG52NTBfZGlzcF9jaGFuICpjaGFuWzIxXTsKIH07CiAKIGludCBudjUwX2Rpc3Bfcm9vdF9zY2Fub3V0cG9zKE5WNTBfRElTUF9NVEhEX1YwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vc3ViZGV2L2Jhci9nZjEwMC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvYmFyL2dmMTAwLmMKaW5kZXggYzc5NGIyYy4uNmQ4ZjIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvYmFyL2dmMTAwLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvYmFyL2dmMTAwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAJaWYgKGJhci0+YmFyWzBdLm1lbSkgewogCQlhZGRyID0gbnZrbV9tZW1vcnlfYWRkcihiYXItPmJhclswXS5tZW0pID4+IDEyOwotCQludmttX3dyMzIoZGV2aWNlLCAweDAwMTcxNCwgMHhjMDAwMDAwMCB8IGFkZHIpOworCQludmttX3dyMzIoZGV2aWNlLCAweDAwMTcxNCwgMHg4MDAwMDAwMCB8IGFkZHIpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNlLmMKaW5kZXggZWI5YjI3OC4uYTRjYjgyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvYmFzZS5jCkBAIC0xOTIsNiArMTkyLDEwIEBACiAJCX0KIAl9CiAKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlwY2ktPm1zaSA9IGZhbHNlOworI2VuZGlmCisKIAlwY2ktPm1zaSA9IG52a21fYm9vbG9wdChkZXZpY2UtPmNmZ29wdCwgIk52TVNJIiwgcGNpLT5tc2kpOwogCWlmIChwY2ktPm1zaSAmJiBmdW5jLT5tc2lfcmVhcm0pIHsKIAkJcGNpLT5tc2kgPSBwY2lfZW5hYmxlX21zaShwY2ktPnBkZXYpID09IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5jCmluZGV4IDczMTZmYzcuLmEyZWM2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5jCkBAIC0xNDksOCArMTQ5LDggQEAKIAlyY2FyX2R1X2dyb3VwX3dyaXRlKHJjcnRjLT5ncm91cCwgcmNydGMtPmluZGV4ICUgMiA/IE9UQVIyIDogT1RBUiwgMCk7CiAKIAkvKiBTaWduYWwgcG9sYXJpdGllcyAqLwotCXZhbHVlID0gKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUFZTWU5DKSA/IDAgOiBEU01SX1ZTTCkKLQkgICAgICB8ICgobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykgPyAwIDogRFNNUl9IU0wpCisJdmFsdWUgPSAoKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpID8gRFNNUl9WU0wgOiAwKQorCSAgICAgIHwgKChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKSA/IERTTVJfSFNMIDogMCkKIAkgICAgICB8IERTTVJfRElQTV9ESVNQIHwgRFNNUl9DU1BNOwogCXJjYXJfZHVfY3J0Y193cml0ZShyY3J0YywgRFNNUiwgdmFsdWUpOwogCkBAIC0xNzIsNyArMTcyLDcgQEAKIAkJCQkJbW9kZS0+Y3J0Y192c3luY19zdGFydCAtIDEpOwogCXJjYXJfZHVfY3J0Y193cml0ZShyY3J0YywgVkNSLCAgbW9kZS0+Y3J0Y192dG90YWwgLSAxKTsKIAotCXJjYXJfZHVfY3J0Y193cml0ZShyY3J0YywgREVTUiwgIG1vZGUtPmh0b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0KTsKKwlyY2FyX2R1X2NydGNfd3JpdGUocmNydGMsIERFU1IsICBtb2RlLT5odG90YWwgLSBtb2RlLT5oc3luY19zdGFydCAtIDEpOwogCXJjYXJfZHVfY3J0Y193cml0ZShyY3J0YywgREVXUiwgIG1vZGUtPmhkaXNwbGF5KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfZHJ2LmMKaW5kZXggNzNjOTcxZS4uYWUxMjVkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2Rydi5jCkBAIC0yODUsNyArMjg1LDYgQEAKIAogCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkZGV2KTsKIAlkcm1fbW9kZV9jb25maWdfY2xlYW51cChkZGV2KTsKLQlkcm1fdmJsYW5rX2NsZWFudXAoZGRldik7CiAKIAlkcm1fZGV2X3VucmVmKGRkZXYpOwogCkBAIC0zMDUsNyArMzA0LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIERSTSBhbmQgUi1DYXIgZGV2aWNlIHN0cnVjdHVyZXMuICovCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIFItQ2FyIGRldmljZSBzdHJ1Y3R1cmUuICovCiAJcmNkdSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnJjZHUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocmNkdSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTMxNSw2ICszMTQsMTUgQEAKIAlyY2R1LT5kZXYgPSAmcGRldi0+ZGV2OwogCXJjZHUtPmluZm8gPSBvZl9tYXRjaF9kZXZpY2UocmNhcl9kdV9vZl90YWJsZSwgcmNkdS0+ZGV2KS0+ZGF0YTsKIAorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJjZHUpOworCisJLyogSS9PIHJlc291cmNlcyAqLworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmNkdS0+bW1pbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBtZW0pOworCWlmIChJU19FUlIocmNkdS0+bW1pbykpCisJCXJldHVybiBQVFJfRVJSKHJjZHUtPm1taW8pOworCisJLyogRFJNL0tNUyBvYmplY3RzICovCiAJZGRldiA9IGRybV9kZXZfYWxsb2MoJnJjYXJfZHVfZHJpdmVyLCAmcGRldi0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRkZXYpKQogCQlyZXR1cm4gUFRSX0VSUihkZGV2KTsKQEAgLTMyMiwyNCArMzMwLDYgQEAKIAlyY2R1LT5kZGV2ID0gZGRldjsKIAlkZGV2LT5kZXZfcHJpdmF0ZSA9IHJjZHU7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByY2R1KTsKLQotCS8qIEkvTyByZXNvdXJjZXMgKi8KLQltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXJjZHUtPm1taW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKLQlpZiAoSVNfRVJSKHJjZHUtPm1taW8pKSB7Ci0JCXJldCA9IFBUUl9FUlIocmNkdS0+bW1pbyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB2ZXJ0aWNhbCBibGFua2luZyBpbnRlcnJ1cHRzIGhhbmRsaW5nLiBTdGFydCB3aXRoIHZibGFuawotCSAqIGRpc2FibGVkIGZvciBhbGwgQ1JUQ3MuCi0JICovCi0JcmV0ID0gZHJtX3ZibGFua19pbml0KGRkZXYsICgxIDw8IHJjZHUtPmluZm8tPm51bV9jcnRjcykgLSAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCS8qIERSTS9LTVMgb2JqZWN0cyAqLwogCXJldCA9IHJjYXJfZHVfbW9kZXNldF9pbml0KHJjZHUpOwogCWlmIChyZXQgPCAwKSB7CiAJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfa21zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2ttcy5jCmluZGV4IDM5MmM3ZTYuLmM1ODYwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9rbXMuYwpAQCAtNDUzLDEzICs0NTMsMTMgQEAKIAl9CiAKIAlyZXQgPSByY2FyX2R1X2VuY29kZXJfaW5pdChyY2R1LCBlbmNfdHlwZSwgb3V0cHV0LCBlbmNvZGVyLCBjb25uZWN0b3IpOwotCW9mX25vZGVfcHV0KGVuY29kZXIpOwotCW9mX25vZGVfcHV0KGNvbm5lY3Rvcik7Ci0KIAlpZiAocmV0ICYmIHJldCAhPSAtRVBST0JFX0RFRkVSKQogCQlkZXZfd2FybihyY2R1LT5kZXYsCi0JCQkgImZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgJXMgKCVkKSwgc2tpcHBpbmdcbiIsCi0JCQkgZW5jb2Rlci0+ZnVsbF9uYW1lLCByZXQpOworCQkJICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyICVzIG9uIG91dHB1dCAldSAoJWQpLCBza2lwcGluZ1xuIiwKKwkJCSBvZl9ub2RlX2Z1bGxfbmFtZShlbmNvZGVyKSwgb3V0cHV0LCByZXQpOworCisJb2Zfbm9kZV9wdXQoZW5jb2Rlcik7CisJb2Zfbm9kZV9wdXQoY29ubmVjdG9yKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NjcsNiArNTY3LDEzIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKKwkvKiBJbml0aWFsaXplIHZlcnRpY2FsIGJsYW5raW5nIGludGVycnVwdHMgaGFuZGxpbmcuIFN0YXJ0IHdpdGggdmJsYW5rCisJICogZGlzYWJsZWQgZm9yIGFsbCBDUlRDcy4KKwkgKi8KKwlyZXQgPSBkcm1fdmJsYW5rX2luaXQoZGV2LCAoMSA8PCByY2R1LT5pbmZvLT5udW1fY3J0Y3MpIC0gMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAkvKiBJbml0aWFsaXplIHRoZSBncm91cHMuICovCiAJbnVtX2dyb3VwcyA9IERJVl9ST1VORF9VUChyY2R1LT5udW1fY3J0Y3MsIDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jLmMKaW5kZXggYTM3ZGU1ZC4uZGRkNmJhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdlX2FsbG9jLmMKQEAgLTYxMiw3ICs2MTIsNyBAQAogCQl9IGVsc2UgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmlsbCBwb29sICglcClcbiIsIHBvb2wpOwogCQkJLyogSWYgd2UgaGF2ZSBhbnkgcGFnZXMgbGVmdCBwdXQgdGhlbSB0byB0aGUgcG9vbC4gKi8KLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnBvb2wtPmxpc3QsIGxydSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbmV3X3BhZ2VzLCBscnUpIHsKIAkJCQkrK2NwYWdlczsKIAkJCX0KIAkJCWxpc3Rfc3BsaWNlKCZuZXdfcGFnZXMsICZwb29sLT5saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92aXJ0aW8vdmlydGdwdV9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3ZpcnRpby92aXJ0Z3B1X2ZiLmMKaW5kZXggMjI0MmE4MC4uZGMyOTc2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZpcnRpby92aXJ0Z3B1X2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZpcnRpby92aXJ0Z3B1X2ZiLmMKQEAgLTMzNyw3ICszMzcsNyBAQAogCWluZm8tPmZib3BzID0gJnZpcnRpb19ncHVmYl9vcHM7CiAJaW5mby0+cGl4bWFwLmZsYWdzID0gRkJfUElYTUFQX1NZU1RFTTsKIAotCWluZm8tPnNjcmVlbl9iYXNlID0gb2JqLT52bWFwOworCWluZm8tPnNjcmVlbl9idWZmZXIgPSBvYmotPnZtYXA7CiAJaW5mby0+c2NyZWVuX3NpemUgPSBvYmotPmdlbV9iYXNlLnNpemU7CiAJZHJtX2ZiX2hlbHBlcl9maWxsX2ZpeChpbmZvLCBmYi0+cGl0Y2hlc1swXSwgZmItPmRlcHRoKTsKIAlkcm1fZmJfaGVscGVyX2ZpbGxfdmFyKGluZm8sICZ2ZmJkZXYtPmhlbHBlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2V4ZWNidWYuYwppbmRleCBjN2I1M2Q5Li5mZWZiOWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9leGVjYnVmLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZXhlY2J1Zi5jCkBAIC01MTksNyArNTE5LDcgQEAKIAkJCSAgIHN0cnVjdCB2bXdfc3dfY29udGV4dCAqc3dfY29udGV4dCwKIAkJCSAgIFNWR0EzZENtZEhlYWRlciAqaGVhZGVyKQogewotCXJldHVybiBjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gOiAtRUlOVkFMOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IHZtd19jbWRfb2soc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hNnh4X3JlZy5oIGIvZHJpdmVycy9ncHUvbXNtL2E2eHhfcmVnLmgKaW5kZXggNDFiNjRjZGMuLmMyZWI5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9hNnh4X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hNnh4X3JlZy5oCkBAIC03NjQsNiArNzY0LDI5IEBACiAjZGVmaW5lIEE2WFhfVkJJRl9QRVJGX1BXUl9DTlRfSElHSDEgICAgICAgICAgICAweDMxMTkKICNkZWZpbmUgQTZYWF9WQklGX1BFUkZfUFdSX0NOVF9ISUdIMiAgICAgICAgICAgIDB4MzExYQogCisvKiBHQklGIHJlZ2lzdGVycyAqLworI2RlZmluZSBBNlhYX0dCSUZfSEFMVCAgICAgICAgICAgICAgICAgICAgMHgzYzQ1CisjZGVmaW5lIEE2WFhfR0JJRl9IQUxUX0FDSyAgICAgICAgICAgICAgICAweDNjNDYKKyNkZWZpbmUgQTZYWF9HQklGX0hBTFRfTUFTSyAgICAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIEE2WFhfR0JJRl9QRVJGX1BXUl9DTlRfRU4gICAgICAgICAweDNjYzAKKyNkZWZpbmUgQTZYWF9HQklGX1BFUkZfQ05UX1NFTCAgICAgICAgICAgIDB4M2NjMgorI2RlZmluZSBBNlhYX0dCSUZfUEVSRl9DTlRfTE9XMCAgICAgICAgICAgMHgzY2M0CisjZGVmaW5lIEE2WFhfR0JJRl9QRVJGX0NOVF9MT1cxICAgICAgICAgICAweDNjYzUKKyNkZWZpbmUgQTZYWF9HQklGX1BFUkZfQ05UX0xPVzIgICAgICAgICAgIDB4M2NjNgorI2RlZmluZSBBNlhYX0dCSUZfUEVSRl9DTlRfTE9XMyAgICAgICAgICAgMHgzY2M3CisjZGVmaW5lIEE2WFhfR0JJRl9QRVJGX0NOVF9ISUdIMCAgICAgICAgICAweDNjYzgKKyNkZWZpbmUgQTZYWF9HQklGX1BFUkZfQ05UX0hJR0gxICAgICAgICAgIDB4M2NjOQorI2RlZmluZSBBNlhYX0dCSUZfUEVSRl9DTlRfSElHSDIgICAgICAgICAgMHgzY2NhCisjZGVmaW5lIEE2WFhfR0JJRl9QRVJGX0NOVF9ISUdIMyAgICAgICAgICAweDNjY2IKKyNkZWZpbmUgQTZYWF9HQklGX1BXUl9DTlRfTE9XMCAgICAgICAgICAgIDB4M2NjYworI2RlZmluZSBBNlhYX0dCSUZfUFdSX0NOVF9MT1cxICAgICAgICAgICAgMHgzY2NkCisjZGVmaW5lIEE2WFhfR0JJRl9QV1JfQ05UX0xPVzIgICAgICAgICAgICAweDNjY2UKKyNkZWZpbmUgQTZYWF9HQklGX1BXUl9DTlRfSElHSDAgICAgICAgICAgIDB4M2NjZgorI2RlZmluZSBBNlhYX0dCSUZfUFdSX0NOVF9ISUdIMSAgICAgICAgICAgMHgzY2QwCisjZGVmaW5lIEE2WFhfR0JJRl9QV1JfQ05UX0hJR0gyICAgICAgICAgICAweDNjZDEKKworCiAvKiBDWF9EQkdDX0NGRyByZWdpc3RlcnMgKi8KICNkZWZpbmUgQTZYWF9DWF9EQkdDX0NGR19EQkdCVVNfU0VMX0EgICAgICAgICAgICAgICAgICAgMHgxODQwMAogI2RlZmluZSBBNlhYX0NYX0RCR0NfQ0ZHX0RCR0JVU19TRUxfQiAgICAgICAgICAgICAgICAgICAweDE4NDAxCkBAIC05MzUsNiArOTU4LDcgQEAKICNkZWZpbmUgQTZYWF9HTVVfQU9fU1BBUkVfQ05UTAkJCTB4MjNCMTYKIAogLyogR01VIFJTQyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBBNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMwX0RSVjAJCTB4MjM0MDQKICNkZWZpbmUgQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUQkJMHgyM0IwNwogI2RlZmluZSBBNlhYX0dNVV9SU0NDX0NPTlRST0xfQUNLCQkweDIzQjA4CiAKQEAgLTk2NSwxMCArOTg5LDYgQEAKICNkZWZpbmUgQTZYWF9SU0NDX1RDUzJfRFJWMF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgMHgyM0ExNgogI2RlZmluZSBBNlhYX1JTQ0NfVENTM19EUlYwX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAweDIzQjdFCiAKLQotLyogQ1BSIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgQTZYWF9HUFVfQ1BSX0ZTTV9DVEwJCQkJMHgyNjgwMQotCiAvKiBHUFUgUERDIHNlcXVlbmNlciByZWdpc3RlcnMgaW4gQU9TUy5SUE1oIGRvbWFpbiAqLwogI2RlZmluZQlQRENfR1BVX0VOQUJMRV9QREMJCQkweDIxMTQwCiAjZGVmaW5lIFBEQ19HUFVfU0VRX1NUQVJUX0FERFIJCQkweDIxMTQ4CkBAIC05ODYsNyArMTAwNiw1IEBACiAjZGVmaW5lIFBEQ19HUFVfVENTMV9DTUQwX0RBVEEJCQkweDIxNTc3CiAjZGVmaW5lIFBEQ19HUFVfU0VRX01FTV8wCQkJMHhBMDAwMAogCi0vKiBHRlggcmFpbCBDUFIgcmVnaXN0ZXJzIGluIEFPU1MuQ1BSIGRvbWFpbiAqLwotI2RlZmluZSBDUFJfQ1BSRl9DUFJGNV9DVFJMCQkJMHgxODAxCiAjZW5kaWYgLyogX0E2WFhfUkVHX0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2FkcmVuby1ncHVsaXN0LmggYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLWdwdWxpc3QuaAppbmRleCA3ZGRhNjJhLi5iNDUxNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLWdwdWxpc3QuaAorKysgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLWdwdWxpc3QuaApAQCAtMzQ2LDcgKzM0Niw4IEBACiAJCS5tYWpvciA9IDEsCiAJCS5taW5vciA9IDUsCiAJCS5wYXRjaGlkID0gQU5ZX0lELAotCQkuZmVhdHVyZXMgPSBBRFJFTk9fNjRCSVQgfCBBRFJFTk9fUlBNSCwKKwkJLmZlYXR1cmVzID0gQURSRU5PXzY0QklUIHwgQURSRU5PX1JQTUggfAorCQkJQURSRU5PX0dQTVUgfCBBRFJFTk9fQ09OVEVOVF9QUk9URUNUSU9OLAogCQkuc3FlZndfbmFtZSA9ICJhNjMwX3NxZS5mdyIsCiAJCS56YXBfbmFtZSA9ICJhNjE1X3phcCIsCiAJCS5ncHVkZXYgPSAmYWRyZW5vX2E2eHhfZ3B1ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2FkcmVuby5jIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVuby5jCmluZGV4IDJkYWU3NTguLjg0NDE0MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm8uYworKysgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLmMKQEAgLTU1NCw3ICs1NTQsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCisvKioKKyAqIGFkcmVub19pcnFjdHJsKCkgLSBFbmFibGVzL2Rpc2FibGVzIHRoZSBSQkJNIGludGVycnVwdCBtYXNrCisgKiBAYWRyZW5vX2RldjogUG9pbnRlciB0byBhbiBhZHJlbm9fZGV2aWNlCisgKiBAc3RhdGU6IDEgZm9yIG1hc2tlZCBvciAwIGZvciB1bm1hc2tlZAorICogUG93ZXI6IFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBtdXN0IG1ha2Ugc3VyZSB0byB1c2UgT09CcworICogc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhlIEdQVSBpcyBwb3dlcmVkIG9uCisgKi8KIHZvaWQgYWRyZW5vX2lycWN0cmwoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7CkBAIC01OTksNyArNjA1LDcgQEAKIAlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7CiAJc3RydWN0IGFkcmVub19pcnEgKmlycV9wYXJhbXMgPSBncHVkZXYtPmlycTsKIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gMCwgdG1wLCBpbnRfYml0OworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwLCBmZW5jZSA9IDAsIHRtcCwgaW50X2JpdDsKIAlpbnQgaTsKIAogCWF0b21pY19pbmMoJmFkcmVub19kZXYtPnBlbmRpbmdfaXJxX3JlZmNudCk7CkBAIC02MTQsNiArNjIwLDE3IEBACiAJaWYgKGdwdWRldi0+Z3B1X2tlZXBhbGl2ZSkKIAkJZ3B1ZGV2LT5ncHVfa2VlcGFsaXZlKGFkcmVub19kZXYsIHRydWUpOwogCisJLyoKKwkgKiBJZiB0aGUgQUhCIGZlbmNlIGlzIG5vdCBpbiBBTExPVyBtb2RlIHdoZW4gd2UgcmVjZWl2ZSBhbiBSQkJNCisJICogaW50ZXJydXB0LCBzb21ldGhpbmcgd2VudCB3cm9uZy4gU2V0IGEgZmF1bHQgYW5kIGNoYW5nZSB0aGUKKwkgKiBmZW5jZSB0byBBTExPVyBzbyB3ZSBjYW4gY2xlYXIgdGhlIGludGVycnVwdC4KKwkgKi8KKwlhZHJlbm9fcmVhZHJlZyhhZHJlbm9fZGV2LCBBRFJFTk9fUkVHX0dNVV9BT19BSEJfRkVOQ0VfQ1RSTCwgJmZlbmNlKTsKKwlpZiAoZmVuY2UgIT0gMCkgeworCQlLR1NMX0RSVl9DUklUX1JBVEVMSU1JVChkZXZpY2UsICJBSEIgZmVuY2UgaXMgc3R1Y2sgaW4gSVNSXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlhZHJlbm9fcmVhZHJlZyhhZHJlbm9fZGV2LCBBRFJFTk9fUkVHX1JCQk1fSU5UXzBfU1RBVFVTLCAmc3RhdHVzKTsKIAogCS8qCkBAIC05NDgsNiArOTY1LDkgQEAKIAlkZXZpY2UtPnB3cmN0cmwuYnVzX2NvbnRyb2wgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwKIAkJInFjb20sYnVzLWNvbnRyb2wiKTsKIAorCWRldmljZS0+cHdyY3RybC5pbnB1dF9kaXNhYmxlID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsCisJCSJxY29tLGRpc2FibGUtd2FrZS1vbi10b3VjaCIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwOTEsMTUgKzExMTEsMTkgQEAKIAkJYWRyZW5vX2Rldi0+Z3B1aHR3X2xsY19zbGljZSA9IE5VTEw7CiAJfQogCi0JYWRyZW5vX2lucHV0X2hhbmRsZXIucHJpdmF0ZSA9IGRldmljZTsKLQogI2lmZGVmIENPTkZJR19JTlBVVAotCS8qCi0JICogSXQgaXNuJ3QgZmF0YWwgaWYgd2UgY2Fubm90IHJlZ2lzdGVyIHRoZSBpbnB1dCBoYW5kbGVyLiAgU2FkLAotCSAqIHBlcmhhcHMsIGJ1dCBub3QgZmF0YWwKLQkgKi8KLQlpZiAoaW5wdXRfcmVnaXN0ZXJfaGFuZGxlcigmYWRyZW5vX2lucHV0X2hhbmRsZXIpKQotCQlLR1NMX0RSVl9FUlIoZGV2aWNlLCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBpbnB1dCBoYW5kbGVyXG4iKTsKKwlpZiAoIWRldmljZS0+cHdyY3RybC5pbnB1dF9kaXNhYmxlKSB7CisJCWFkcmVub19pbnB1dF9oYW5kbGVyLnByaXZhdGUgPSBkZXZpY2U7CisJCS8qCisJCSAqIEl0IGlzbid0IGZhdGFsIGlmIHdlIGNhbm5vdCByZWdpc3RlciB0aGUgaW5wdXQgaGFuZGxlci4gIFNhZCwKKwkJICogcGVyaGFwcywgYnV0IG5vdCBmYXRhbAorCQkgKi8KKwkJaWYgKGlucHV0X3JlZ2lzdGVyX2hhbmRsZXIoJmFkcmVub19pbnB1dF9oYW5kbGVyKSkgeworCQkJYWRyZW5vX2lucHV0X2hhbmRsZXIucHJpdmF0ZSA9IE5VTEw7CisJCQlLR1NMX0RSVl9FUlIoZGV2aWNlLAorCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgdGhlIGlucHV0IGhhbmRsZXJcbiIpOworCQl9CisJfQogI2VuZGlmCiBvdXQ6CiAJaWYgKHN0YXR1cykgewpAQCAtMTE1Myw3ICsxMTc3LDggQEAKIAlfYWRyZW5vX2ZyZWVfbWVtb3JpZXMoYWRyZW5vX2Rldik7CiAKICNpZmRlZiBDT05GSUdfSU5QVVQKLQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZXIoJmFkcmVub19pbnB1dF9oYW5kbGVyKTsKKwlpZiAoYWRyZW5vX2lucHV0X2hhbmRsZXIucHJpdmF0ZSkKKwkJaW5wdXRfdW5yZWdpc3Rlcl9oYW5kbGVyKCZhZHJlbm9faW5wdXRfaGFuZGxlcik7CiAjZW5kaWYKIAlhZHJlbm9fc3lzZnNfY2xvc2UoYWRyZW5vX2Rldik7CiAKQEAgLTEzMjUsOCArMTM1MCw3IEBACiAKIAl9CiAKLQlpZiAobm9wcmVlbXB0ID09IGZhbHNlICYmCi0JCUFEUkVOT19GRUFUVVJFKGFkcmVub19kZXYsIEFEUkVOT19QUkVFTVBUSU9OKSkgeworCWlmIChub3ByZWVtcHQgPT0gZmFsc2UpIHsKIAkJaW50IHIgPSAwOwogCiAJCWlmIChncHVkZXYtPnByZWVtcHRpb25faW5pdCkKQEAgLTE0OTEsOSArMTUxNSw5IEBACiAKIAkvKiBTZW5kIE9PQiByZXF1ZXN0IHRvIHR1cm4gb24gdGhlIEdYICovCiAJaWYgKGdwdWRldi0+b29iX3NldCkgewotCQlzdGF0dXMgPSBncHVkZXYtPm9vYl9zZXQoYWRyZW5vX2RldiwgT09CX0dQVVNUQVJUX1NFVF9NQVNLLAotCQkJCU9PQl9HUFVTVEFSVF9DSEVDS19NQVNLLAotCQkJCU9PQl9HUFVTVEFSVF9DTEVBUl9NQVNLKTsKKwkJc3RhdHVzID0gZ3B1ZGV2LT5vb2Jfc2V0KGFkcmVub19kZXYsIE9PQl9HUFVfU0VUX01BU0ssCisJCQkJT09CX0dQVV9DSEVDS19NQVNLLAorCQkJCU9PQl9HUFVfQ0xFQVJfTUFTSyk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIGVycm9yX21tdV9vZmY7CiAJfQpAQCAtMTU5MiwxNyArMTYxNiwyOCBAQAogCQkJCXBtcW9zX2FjdGl2ZV92b3RlKTsKIAogCS8qIFNlbmQgT09CIHJlcXVlc3QgdG8gYWxsb3cgSUZQQyAqLwotCWlmIChncHVkZXYtPm9vYl9jbGVhcikKLQkJZ3B1ZGV2LT5vb2JfY2xlYXIoYWRyZW5vX2RldiwgT09CX0dQVVNUQVJUX0NMRUFSX01BU0spOworCWlmIChncHVkZXYtPm9vYl9jbGVhcikgeworCQlncHVkZXYtPm9vYl9jbGVhcihhZHJlbm9fZGV2LCBPT0JfR1BVX0NMRUFSX01BU0spOworCisJCS8qIElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIHRoZSBCT09UIE9PQiB3YXMgc2VudCB0byB0aGUgR01VICovCisJCWlmIChBRFJFTk9fUVVJUksoYWRyZW5vX2RldiwgQURSRU5PX1FVSVJLX0hGSV9VU0VfUkVHKSkKKwkJCWdwdWRldi0+b29iX2NsZWFyKGFkcmVub19kZXYsCisJCQkJCU9PQl9CT09UX1NMVU1CRVJfQ0xFQVJfTUFTSyk7CisJfQogCiAJcmV0dXJuIDA7CiAKIGVycm9yX29vYl9jbGVhcjoKIAlpZiAoZ3B1ZGV2LT5vb2JfY2xlYXIpCi0JCWdwdWRldi0+b29iX2NsZWFyKGFkcmVub19kZXYsIE9PQl9HUFVTVEFSVF9DTEVBUl9NQVNLKTsKKwkJZ3B1ZGV2LT5vb2JfY2xlYXIoYWRyZW5vX2RldiwgT09CX0dQVV9DTEVBUl9NQVNLKTsKIAogZXJyb3JfbW11X29mZjoKIAlrZ3NsX21tdV9zdG9wKCZkZXZpY2UtPm1tdSk7CisJaWYgKGdwdWRldi0+b29iX2NsZWFyICYmCisJCQlBRFJFTk9fUVVJUksoYWRyZW5vX2RldiwgQURSRU5PX1FVSVJLX0hGSV9VU0VfUkVHKSkgeworCQlncHVkZXYtPm9vYl9jbGVhcihhZHJlbm9fZGV2LAorCQkJCU9PQl9CT09UX1NMVU1CRVJfQ0xFQVJfTUFTSyk7CisJfQogCiBlcnJvcl9wd3Jfb2ZmOgogCS8qIHNldCB0aGUgc3RhdGUgYmFjayB0byBvcmlnaW5hbCBzdGF0ZSAqLwpAQCAtMTY2MCwxMCArMTY5NSwyMyBAQAogc3RhdGljIGludCBhZHJlbm9fc3RvcChzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiA9IEFEUkVOT19ERVZJQ0UoZGV2aWNlKTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7CisJaW50IGVycm9yID0gMDsKIAogCWlmICghdGVzdF9iaXQoQURSRU5PX0RFVklDRV9TVEFSVEVELCAmYWRyZW5vX2Rldi0+cHJpdikpCiAJCXJldHVybiAwOwogCisJLyogVHVybiB0aGUgcG93ZXIgb24gb25lIGxhc3QgdGltZSBiZWZvcmUgc3RvcHBpbmcgKi8KKwlpZiAoZ3B1ZGV2LT5vb2Jfc2V0KSB7CisJCWVycm9yID0gZ3B1ZGV2LT5vb2Jfc2V0KGFkcmVub19kZXYsIE9PQl9HUFVfU0VUX01BU0ssCisJCQkJT09CX0dQVV9DSEVDS19NQVNLLAorCQkJCU9PQl9HUFVfQ0xFQVJfTUFTSyk7CisJCWlmIChlcnJvcikgeworCQkJZ3B1ZGV2LT5vb2JfY2xlYXIoYWRyZW5vX2RldiwgT09CX0dQVV9DTEVBUl9NQVNLKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwogCWFkcmVub19zZXRfYWN0aXZlX2N0eHNfbnVsbChhZHJlbm9fZGV2KTsKIAogCWFkcmVub19kaXNwYXRjaGVyX3N0b3AoYWRyZW5vX2Rldik7CkBAIC0xNjg3LDYgKzE3MzUsMTkgQEAKIAkvKiBTYXZlIHBoeXNpY2FsIHBlcmZvcm1hbmNlIGNvdW50ZXIgdmFsdWVzIGJlZm9yZSBHUFUgcG93ZXIgZG93biovCiAJYWRyZW5vX3BlcmZjb3VudGVyX3NhdmUoYWRyZW5vX2Rldik7CiAKKwlpZiAoZ3B1ZGV2LT5vb2JfY2xlYXIpCisJCWdwdWRldi0+b29iX2NsZWFyKGFkcmVub19kZXYsIE9PQl9HUFVfQ0xFQVJfTUFTSyk7CisKKwkvKgorCSAqIFNhdmluZyBwZXJmY291bnRlcnMgd2lsbCB1c2UgYW4gT09CIHRvIHB1dCB0aGUgR01VIGludG8KKwkgKiBhY3RpdmUgc3RhdGUuIEJlZm9yZSBjb250aW51aW5nLCB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlCisJICogR01VIHRvIHJldHVybiB0byB0aGUgbG93ZXN0IGlkbGUgbGV2ZWwuIFRoaXMgaXMKKwkgKiBiZWNhdXNlIHNvbWUgaWRsZSBsZXZlbCB0cmFuc2l0aW9ucyByZXF1aXJlIFZCSUYgYW5kIE1NVS4KKwkgKi8KKwlpZiAoZ3B1ZGV2LT53YWl0X2Zvcl9sb3dlc3RfaWRsZSAmJgorCQkJZ3B1ZGV2LT53YWl0X2Zvcl9sb3dlc3RfaWRsZShhZHJlbm9fZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlhZHJlbm9fdmJpZl9jbGVhcl9wZW5kaW5nX3RyYW5zYWN0aW9ucyhkZXZpY2UpOwogCiAJa2dzbF9tbXVfc3RvcCgmZGV2aWNlLT5tbXUpOwpAQCAtMjQ1Nyw3ICsyNTE4LDcgQEAKIAogCWRldl9lcnIoZGV2aWNlLT5kZXYsICIgaHdmYXVsdD0lOC44WFxuIiwgaHdmYXVsdCk7CiAKLQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIE5VTEwpOworCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCwgYWRyZW5vX2dtdV9ncHVfZmF1bHQoYWRyZW5vX2RldikpOwogfQogCiAvKioKQEAgLTI4NjMsNyArMjkyNCw3IEBACiAJCQlncHVfYnVzeSArPSBhZGo7CiAJCX0KIAotCQlpZiAoa2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkpIHsKKwkJaWYgKGFkcmVub19pc19hNnh4KGFkcmVub19kZXYpKSB7CiAJCQkvKiBjbG9jayBzb3VyY2VkIGZyb20gWE8gKi8KIAkJCXN0YXRzLT5idXN5X3RpbWUgPSBncHVfYnVzeSAqIDEwIC8gMTkyOwogCQl9IGVsc2UgewpAQCAtMzA4NCw2ICszMTQ1LDcgQEAKIAkuaXJxX2hhbmRsZXIgPSBhZHJlbm9faXJxX2hhbmRsZXIsCiAJLmRyYWluID0gYWRyZW5vX2RyYWluLAogCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLworCS5zbmFwc2hvdF9nbXUgPSBhZHJlbm9fc25hcHNob3RfZ211LAogCS5kcmF3Y3R4dF9jcmVhdGUgPSBhZHJlbm9fZHJhd2N0eHRfY3JlYXRlLAogCS5kcmF3Y3R4dF9kZXRhY2ggPSBhZHJlbm9fZHJhd2N0eHRfZGV0YWNoLAogCS5kcmF3Y3R4dF9kZXN0cm95ID0gYWRyZW5vX2RyYXdjdHh0X2Rlc3Ryb3ksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLmggYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vLmgKaW5kZXggODdhN2YwMC4uMzExODM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVuby5oCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm8uaApAQCAtNDgzLDYgKzQ4MywxMCBAQAogCXZvaWQgKmdwdWh0d19sbGNfc2xpY2U7CiAJYm9vbCBncHVodHdfbGxjX3NsaWNlX2VuYWJsZTsKIAl1bnNpZ25lZCBpbnQgemFwX2xvYWRlZDsKKwl1bnNpZ25lZCBpbnQgcHJlZW1wdF9sZXZlbDsKKwlib29sIHVzZXNnbWVtOworCWJvb2wgc2tpcHNhdmVyZXN0b3JlOworCiB9OwogCiAvKioKQEAgLTUyNCw2ICs1MjgsNyBAQAogCUFEUkVOT19ERVZJQ0VfSVNEQl9FTkFCTEVEID0gMTIsCiAJQURSRU5PX0RFVklDRV9DQUNIRV9GTFVTSF9UU19TVVNQRU5ERUQgPSAxMywKIAlBRFJFTk9fREVWSUNFX0hBUkRfUkVTRVQgPSAxNCwKKwlBRFJFTk9fREVWSUNFX1BSRUVNUFRJT05fRVhFQ1VUSU9OID0gMTUsCiB9OwogCiAvKioKQEAgLTYxNiw2ICs2MjEsOCBAQAogCUFEUkVOT19SRUdfUkJCTV9SQkJNX0NUTCwKIAlBRFJFTk9fUkVHX1VDSEVfSU5WQUxJREFURTAsCiAJQURSRU5PX1JFR19VQ0hFX0lOVkFMSURBVEUxLAorCUFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX1JCQk1fMF9MTywKKwlBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9SQkJNXzBfSEksCiAJQURSRU5PX1JFR19SQkJNX1BFUkZDVFJfTE9BRF9WQUxVRV9MTywKIAlBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9MT0FEX1ZBTFVFX0hJLAogCUFEUkVOT19SRUdfUkJCTV9TRUNWSURfVFJVU1RfQ09OVFJPTCwKQEAgLTYyOSw2ICs2MzYsOSBAQAogCUFEUkVOT19SRUdfVkJJRl9YSU5fSEFMVF9DVFJMMCwKIAlBRFJFTk9fUkVHX1ZCSUZfWElOX0hBTFRfQ1RSTDEsCiAJQURSRU5PX1JFR19WQklGX1ZFUlNJT04sCisJQURSRU5PX1JFR19HQklGX0hBTFQsCisJQURSRU5PX1JFR19HQklGX0hBTFRfQUNLLAorCUFEUkVOT19SRUdfR01VX0FPX0FIQl9GRU5DRV9DVFJMLAogCUFEUkVOT19SRUdfR01VX0FPX0lOVEVSUlVQVF9FTiwKIAlBRFJFTk9fUkVHX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9DTFIsCiAJQURSRU5PX1JFR19HTVVfQU9fSE9TVF9JTlRFUlJVUFRfU1RBVFVTLApAQCAtODI3LDYgKzgzNyw3IEBACiAJLyogR1BVIHNwZWNpZmljIGZ1bmN0aW9uIGhvb2tzICovCiAJdm9pZCAoKmlycV90cmFjZSkoc3RydWN0IGFkcmVub19kZXZpY2UgKiwgdW5zaWduZWQgaW50IHN0YXR1cyk7CiAJdm9pZCAoKnNuYXBzaG90KShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqLCBzdHJ1Y3Qga2dzbF9zbmFwc2hvdCAqKTsKKwl2b2lkICgqc25hcHNob3RfZ211KShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqLCBzdHJ1Y3Qga2dzbF9zbmFwc2hvdCAqKTsKIAl2b2lkICgqcGxhdGZvcm1fc2V0dXApKHN0cnVjdCBhZHJlbm9fZGV2aWNlICopOwogCXZvaWQgKCppbml0KShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqKTsKIAl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqKTsKQEAgLTg1MSw3ICs4NjIsNyBAQAogCQkJCXVuc2lnbmVkIGludCAqY21kcywKIAkJCQlzdHJ1Y3Qga2dzbF9jb250ZXh0ICpjb250ZXh0KTsKIAlpbnQgKCpwcmVlbXB0aW9uX3lpZWxkX2VuYWJsZSkodW5zaWduZWQgaW50ICopOwotCXVuc2lnbmVkIGludCAoKnByZWVtcHRpb25fc2V0X21hcmtlcikodW5zaWduZWQgaW50ICpjbWRzLCBpbnQgc3RhcnQpOworCXVuc2lnbmVkIGludCAoKnNldF9tYXJrZXIpKHVuc2lnbmVkIGludCAqY21kcywgaW50IHN0YXJ0KTsKIAl1bnNpZ25lZCBpbnQgKCpwcmVlbXB0aW9uX3Bvc3RfaWJzdWJtaXQpKAogCQkJCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAogCQkJCXVuc2lnbmVkIGludCAqY21kcyk7CkBAIC04NzYsNiArODg3LDcgQEAKIAlpbnQgKCpycG1oX2dwdV9wd3JjdHJsKShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqLCB1bnNpZ25lZCBpbnQgb3BzLAogCQkJCXVuc2lnbmVkIGludCBhcmcxLCB1bnNpZ25lZCBpbnQgYXJnMik7CiAJYm9vbCAoKmh3X2lzaWRsZSkoc3RydWN0IGFkcmVub19kZXZpY2UgKik7CisJaW50ICgqd2FpdF9mb3JfbG93ZXN0X2lkbGUpKHN0cnVjdCBhZHJlbm9fZGV2aWNlICopOwogCWludCAoKndhaXRfZm9yX2dtdV9pZGxlKShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqKTsKIAljb25zdCBjaGFyICooKmlvbW11X2ZhdWx0X2Jsb2NrKShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiwKIAkJCQl1bnNpZ25lZCBpbnQgZnN5bnIxKTsKQEAgLTg4Myw2ICs4OTUsOCBAQAogCWludCAoKnNvZnRfcmVzZXQpKHN0cnVjdCBhZHJlbm9fZGV2aWNlICopOwogCWJvb2wgKCpneF9pc19vbikoc3RydWN0IGFkcmVub19kZXZpY2UgKik7CiAJYm9vbCAoKnNwdHByYWNfaXNfb24pKHN0cnVjdCBhZHJlbm9fZGV2aWNlICopOworCXVuc2lnbmVkIGludCAoKmNjdV9pbnZhbGlkYXRlKShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiwKKwkJCQl1bnNpZ25lZCBpbnQgKmNtZHMpOwogfTsKIAogLyoqCkBAIC0xMDAxLDYgKzEwMTUsOSBAQAogCQlzdHJ1Y3Qga2dzbF9zbmFwc2hvdCAqc25hcHNob3QsCiAJCXN0cnVjdCBrZ3NsX2NvbnRleHQgKmNvbnRleHQpOwogCit2b2lkIGFkcmVub19zbmFwc2hvdF9nbXUoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsCisJCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdCk7CisKIGludCBhZHJlbm9fcmVzZXQoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsIGludCBmYXVsdCk7CiAKIHZvaWQgYWRyZW5vX2ZhdWx0X3NraXBjbWRfZGV0YWNoZWQoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsCkBAIC0xMzMwLDYgKzEzNDcsMTAgQEAKIAlzbXBfd21iKCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBhZHJlbm9fZ211X2dwdV9mYXVsdChzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldikKK3sKKwlyZXR1cm4gYWRyZW5vX2dwdV9mYXVsdChhZHJlbm9fZGV2KSAmIEFEUkVOT19HTVVfRkFVTFQ7Cit9CiAKIC8qKgogICogYWRyZW5vX2NsZWFyX2dwdV9mYXVsdCgpIC0gQ2xlYXIgdGhlIEdQVSBmYXVsdCByZWdpc3RlcgpAQCAtMTU1MiwxMSArMTU3MywyMyBAQAogCXNtcF93bWIoKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoCitzdGF0aWMgaW5saW5lIGJvb2wgYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoCisJCQkJc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYpCit7CisJcmV0dXJuIHRlc3RfYml0KEFEUkVOT19ERVZJQ0VfUFJFRU1QVElPTl9FWEVDVVRJT04sICZhZHJlbm9fZGV2LT5wcml2KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGFkcmVub19pc19wcmVlbXB0aW9uX3NldHVwX2VuYWJsZWQoCiAJCQkJc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYpCiB7CiAJcmV0dXJuIHRlc3RfYml0KEFEUkVOT19ERVZJQ0VfUFJFRU1QVElPTiwgJmFkcmVub19kZXYtPnByaXYpOwogfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZCgKKwkJCQlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldikKK3sKKwlyZXR1cm4gMDsKK30KIC8qKgogICogYWRyZW5vX2N0eF9nZXRfcmIoKSAtIFJldHVybiB0aGUgcmluZ2J1ZmZlciB0aGF0IGEgY29udGV4dCBzaG91bGQKICAqIHVzZSBiYXNlZCBvbiBwcmlvcml0eQpAQCAtMTU4MCw3ICsxNjEzLDcgQEAKIAkgKiByaW5nYnVmZmVyCiAJICovCiAKLQlpZiAoIWFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCisJaWYgKCFhZHJlbm9faXNfcHJlZW1wdGlvbl9leGVjdXRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJcmV0dXJuICYoYWRyZW5vX2Rldi0+cmluZ2J1ZmZlcnNbMF0pOwogCiAJLyoKQEAgLTE2ODIsMjEgKzE3MTUsNjAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyYi0+cHJlZW1wdF9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wb3dlcl9jb3VudGVyX292ZXJmbG93KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAorCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBwcmV2X3ZhbCwgdW5zaWduZWQgaW50ICpwZXJmY3RyX3B3cl9oaSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWJvb2wgcmV0ID0gZmFsc2U7CisKKwkvKgorCSAqIElmIHByZXZfdmFsIGlzIHplcm8sIGl0IGlzIGZpcnN0IHJlYWQgYWZ0ZXIgcGVyZiBjb3VudGVyIHJlc2V0LgorCSAqIFNvIHNldCBwZXJmY3RyX3B3cl9oaSByZWdpc3RlciB0byB6ZXJvLgorCSAqLworCWlmIChwcmV2X3ZhbCA9PSAwKSB7CisJCSpwZXJmY3RyX3B3cl9oaSA9IDA7CisJCXJldHVybiByZXQ7CisJfQorCWFkcmVub19yZWFkcmVnKGFkcmVub19kZXYsIEFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX1JCQk1fMF9ISSwgJnZhbCk7CisJaWYgKHZhbCAhPSAqcGVyZmN0cl9wd3JfaGkpIHsKKwkJKnBlcmZjdHJfcHdyX2hpID0gdmFsOworCQlyZXQgPSB0cnVlOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb3VudGVyX2RlbHRhKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLAogCQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICpjb3VudGVyKQogeworCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwogCXVuc2lnbmVkIGludCB2YWw7CiAJdW5zaWduZWQgaW50IHJldCA9IDA7CisJYm9vbCBvdmVyZmxvdyA9IHRydWU7CisJc3RhdGljIHVuc2lnbmVkIGludCBwZXJmY3RyX3B3cl9oaTsKIAogCS8qIFJlYWQgdGhlIHZhbHVlICovCiAJa2dzbF9yZWdyZWFkKGRldmljZSwgcmVnLCAmdmFsKTsKIAorCWlmIChhZHJlbm9faXNfYTV4eChhZHJlbm9fZGV2KSAmJiByZWcgPT0gYWRyZW5vX2dldHJlZworCQkoYWRyZW5vX2RldiwgQURSRU5PX1JFR19SQkJNX1BFUkZDVFJfUkJCTV8wX0xPKSkKKwkJb3ZlcmZsb3cgPSBpc19wb3dlcl9jb3VudGVyX292ZXJmbG93KGFkcmVub19kZXYsIHJlZywKKwkJCQkqY291bnRlciwgJnBlcmZjdHJfcHdyX2hpKTsKKwogCS8qIFJldHVybiAwIGZvciB0aGUgZmlyc3QgcmVhZCAqLwogCWlmICgqY291bnRlciAhPSAwKSB7Ci0JCWlmICh2YWwgPCAqY291bnRlcikKLQkJCXJldCA9ICgweEZGRkZGRkZGIC0gKmNvdW50ZXIpICsgdmFsOwotCQllbHNlCisJCWlmICh2YWwgPj0gKmNvdW50ZXIpIHsKIAkJCXJldCA9IHZhbCAtICpjb3VudGVyOworCQl9IGVsc2UgaWYgKG92ZXJmbG93ID09IHRydWUpIHsKKwkJCXJldCA9ICgweEZGRkZGRkZGIC0gKmNvdW50ZXIpICsgdmFsOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFNpbmNlIEtHU0wgZ290IGFibm9ybWFsIHZhbHVlIGZyb20gdGhlIGNvdW50ZXIsCisJCQkgKiBXZSB3aWxsIGRyb3AgdGhlIHZhbHVlIGZyb20gYmVpbmcgYWNjdW11bGF0ZWQuCisJCQkgKi8KKwkJCXByX3dhcm5fb25jZSgiS0dTTDogQWJub3JtYWwgdmFsdWUgOjB4JXggKDB4JXgpIGZyb20gcGVyZiBjb3VudGVyIDogMHgleFxuIiwKKwkJCQkJdmFsLCAqY291bnRlciwgcmVnKTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogCiAJKmNvdW50ZXIgPSB2YWw7CkBAIC0xNzM1LDYgKzE4MDcsNDcgQEAKIAlrZ3NsX2FjdGl2ZV9jb3VudF9wdXQoS0dTTF9ERVZJQ0UoYWRyZW5vX2RldikpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgYWRyZW5vX2hhc19nYmlmKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQoreworCWlmIChhZHJlbm9faXNfYTYxNShhZHJlbm9fZGV2KSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogYWRyZW5vX3dhaXRfZm9yX3ZiaWZfaGFsdF9hY2soKSAtIHdhaXQgZm9yIFZCSUYgYWNrbm93bGVkZ21lbnQKKyAqIGZvciBnaXZlbiBIQUxUIHJlcXVlc3QuCisgKiBAYWNrX3JlZzogcmVnaXN0ZXIgb2Zmc2V0IHRvIHdhaXQgZm9yIGFja25vd2xlZGdlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFkcmVub193YWl0X2Zvcl92YmlmX2hhbHRfYWNrKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLAorCWludCBhY2tfcmVnKQoreworCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOworCXN0cnVjdCBhZHJlbm9fZ3B1ZGV2ICpncHVkZXYgPSBBRFJFTk9fR1BVX0RFVklDRShhZHJlbm9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHdhaXRfZm9yX3ZiaWY7CisJdW5zaWduZWQgaW50IG1hc2sgPSBncHVkZXYtPnZiaWZfeGluX2hhbHRfY3RybDBfbWFzazsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQgPSAwOworCisJLyogd2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9ucyB0byBjbGVhciAqLworCXdhaXRfZm9yX3ZiaWYgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXdoaWxlICgxKSB7CisJCWFkcmVub19yZWFkcmVnKGFkcmVub19kZXYsIGFja19yZWcsCisJCQkmdmFsKTsKKwkJaWYgKCh2YWwgJiBtYXNrKSA9PSBtYXNrKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHdhaXRfZm9yX3ZiaWYpKSB7CisJCQlLR1NMX0RSVl9FUlIoZGV2aWNlLAorCQkJCSJXYWl0IGxpbWl0IHJlYWNoZWQgZm9yIFZCSUYgWElOIEhhbHRcbiIpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogLyoqCiAgKiBhZHJlbm9fdmJpZl9jbGVhcl9wZW5kaW5nX3RyYW5zYWN0aW9ucygpIC0gQ2xlYXIgdHJhbnNhY3Rpb25zIGluIFZCSUYgcGlwZQogICogQGRldmljZTogUG9pbnRlciB0byB0aGUgZGV2aWNlIHdob3NlIFZCSUYgcGlwZSBpcyB0byBiZSBjbGVhcmVkCkBAIC0xNzQ1LDI2ICsxODU4LDIwIEBACiAJc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYgPSBBRFJFTk9fREVWSUNFKGRldmljZSk7CiAJc3RydWN0IGFkcmVub19ncHVkZXYgKmdwdWRldiA9IEFEUkVOT19HUFVfREVWSUNFKGFkcmVub19kZXYpOwogCXVuc2lnbmVkIGludCBtYXNrID0gZ3B1ZGV2LT52YmlmX3hpbl9oYWx0X2N0cmwwX21hc2s7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBsb25nIHdhaXRfZm9yX3ZiaWY7CiAJaW50IHJldCA9IDA7CiAKLQlhZHJlbm9fd3JpdGVyZWcoYWRyZW5vX2RldiwgQURSRU5PX1JFR19WQklGX1hJTl9IQUxUX0NUUkwwLCBtYXNrKTsKLQkvKiB3YWl0IGZvciB0aGUgdHJhbnNhY3Rpb25zIHRvIGNsZWFyICovCi0Jd2FpdF9mb3JfdmJpZiA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0Jd2hpbGUgKDEpIHsKLQkJYWRyZW5vX3JlYWRyZWcoYWRyZW5vX2RldiwKLQkJCUFEUkVOT19SRUdfVkJJRl9YSU5fSEFMVF9DVFJMMSwgJnZhbCk7Ci0JCWlmICgodmFsICYgbWFzaykgPT0gbWFzaykKLQkJCWJyZWFrOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB3YWl0X2Zvcl92YmlmKSkgewotCQkJS0dTTF9EUlZfRVJSKGRldmljZSwKLQkJCQkiV2FpdCBsaW1pdCByZWFjaGVkIGZvciBWQklGIFhJTiBIYWx0XG4iKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlicmVhazsKLQkJfQorCWlmIChhZHJlbm9faGFzX2diaWYoYWRyZW5vX2RldikpIHsKKwkJYWRyZW5vX3dyaXRlcmVnKGFkcmVub19kZXYsIEFEUkVOT19SRUdfR0JJRl9IQUxULCBtYXNrKTsKKwkJcmV0ID0gYWRyZW5vX3dhaXRfZm9yX3ZiaWZfaGFsdF9hY2soZGV2aWNlLAorCQkJCUFEUkVOT19SRUdfR0JJRl9IQUxUX0FDSyk7CisJCWFkcmVub193cml0ZXJlZyhhZHJlbm9fZGV2LCBBRFJFTk9fUkVHX0dCSUZfSEFMVCwgMCk7CisJfSBlbHNlIHsKKwkJYWRyZW5vX3dyaXRlcmVnKGFkcmVub19kZXYsIEFEUkVOT19SRUdfVkJJRl9YSU5fSEFMVF9DVFJMMCwKKwkJCW1hc2spOworCQlyZXQgPSBhZHJlbm9fd2FpdF9mb3JfdmJpZl9oYWx0X2FjayhkZXZpY2UsCisJCQkJQURSRU5PX1JFR19WQklGX1hJTl9IQUxUX0NUUkwxKTsKKwkJYWRyZW5vX3dyaXRlcmVnKGFkcmVub19kZXYsIEFEUkVOT19SRUdfVkJJRl9YSU5fSEFMVF9DVFJMMCwgMCk7CiAJfQotCWFkcmVub193cml0ZXJlZyhhZHJlbm9fZGV2LCBBRFJFTk9fUkVHX1ZCSUZfWElOX0hBTFRfQ1RSTDAsIDApOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTN4eC5jIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hM3h4LmMKaW5kZXggNWQ3ZmIyMS4uYjJjZGY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hM3h4LmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hM3h4LmMKQEAgLTY4NSw3ICs2ODUsNyBAQAogCQlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOwogCiAJCWRldl9lcnIoZGV2aWNlLT5kZXYsICJDUCBpbml0aWFsaXphdGlvbiBmYWlsZWQgdG8gaWRsZVxuIik7Ci0JCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCk7CisJCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCwgZmFsc2UpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xNTMzLDYgKzE1MzMsMTAgQEAKIAkJCUEzWFhfVUNIRV9DQUNIRV9JTlZBTElEQVRFMF9SRUcpLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfVUNIRV9JTlZBTElEQVRFMSwKIAkJCUEzWFhfVUNIRV9DQUNIRV9JTlZBTElEQVRFMV9SRUcpLAorCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX1JCQk1fMF9MTywKKwkJCUEzWFhfUkJCTV9QRVJGQ1RSX1JCQk1fMF9MTyksCisJQURSRU5PX1JFR19ERUZJTkUoQURSRU5PX1JFR19SQkJNX1BFUkZDVFJfUkJCTV8wX0hJLAorCQkJQTNYWF9SQkJNX1BFUkZDVFJfUkJCTV8wX0hJKSwKIAlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9MT0FEX1ZBTFVFX0xPLAogCQkJCUEzWFhfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfTE8pLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfSEksCkBAIC0xODIzLDcgKzE4MjcsNyBAQAogCiAJaWYgKHJldCkgewogCQlLR1NMX0RSVl9FUlIoZGV2aWNlLCAibWljcm9jb2RlIGJvb3RzdHJhcCBmYWlsZWQgdG8gaWRsZVxuIik7Ci0JCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCk7CisJCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCwgZmFsc2UpOwogCX0KIAogCS8qIENsZWFyIHRoZSBjaGlja2VuIGJpdCBmb3Igc3BlZWQgdXAgb24gQTQzMCBhbmQgaXRzIGRlcml2YXRpdmVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E0eHguYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTR4eC5jCmluZGV4IGM4MDdiNjcuLjgwY2VhYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTR4eC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTR4eC5jCkBAIC04MDgsNiArODA4LDEwIEBACiAJQURSRU5PX1JFR19ERUZJTkUoQURSRU5PX1JFR19SQkJNX1NXX1JFU0VUX0NNRCwgQTRYWF9SQkJNX1NXX1JFU0VUX0NNRCksCiAJQURSRU5PX1JFR19ERUZJTkUoQURSRU5PX1JFR19VQ0hFX0lOVkFMSURBVEUwLCBBNFhYX1VDSEVfSU5WQUxJREFURTApLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfVUNIRV9JTlZBTElEQVRFMSwgQTRYWF9VQ0hFX0lOVkFMSURBVEUxKSwKKwlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9SQkJNXzBfTE8sCisJCQkJQTRYWF9SQkJNX1BFUkZDVFJfUkJCTV8wX0xPKSwKKwlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9SQkJNXzBfSEksCisJCQkJQTRYWF9SQkJNX1BFUkZDVFJfUkJCTV8wX0hJKSwKIAlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9MT0FEX1ZBTFVFX0xPLAogCQkJCUE0WFhfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfTE8pLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfSEksCkBAIC0xNTM1LDcgKzE1MzksNyBAQAogCQlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOwogCiAJCWRldl9lcnIoZGV2aWNlLT5kZXYsICJDUCBpbml0aWFsaXphdGlvbiBmYWlsZWQgdG8gaWRsZVxuIik7Ci0JCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCk7CisJCWtnc2xfZGV2aWNlX3NuYXBzaG90KGRldmljZSwgTlVMTCwgZmFsc2UpOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E1eHguYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTV4eC5jCmluZGV4IDc0MmRhOTEuLjQzNGZlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTV4eC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTV4eC5jCkBAIC02MSw4ICs2MSw4IEBACiB9OwogCiBzdGF0aWMgdm9pZCBhNXh4X2lycV9zdG9ybV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyBpbnQgX3JlYWRfZncyX2Jsb2NrX2hlYWRlcih1aW50MzJfdCAqaGVhZGVyLCB1aW50MzJfdCBpZCwKLQl1aW50MzJfdCBtYWpvciwgdWludDMyX3QgbWlub3IpOworc3RhdGljIGludCBfcmVhZF9mdzJfYmxvY2tfaGVhZGVyKHVpbnQzMl90ICpoZWFkZXIsIHVpbnQzMl90IHJlbWFpbiwKKwl1aW50MzJfdCBpZCwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKTsKIHN0YXRpYyB2b2lkIGE1eHhfZ3BtdV9yZXNldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCBhNXh4X2dwbXVfaW5pdChzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2Rldik7CiAKQEAgLTY3OCwxMiArNjc4LDE3IEBACiAJaWYgKGRhdGFbMV0gIT0gR1BNVV9GSVJNV0FSRV9JRCkKIAkJZ290byBlcnI7CiAJcmV0ID0gX3JlYWRfZncyX2Jsb2NrX2hlYWRlcigmZGF0YVsyXSwKKwkJZGF0YVswXSAtIDIsCiAJCUdQTVVfRklSTVdBUkVfSUQsCiAJCWFkcmVub19kZXYtPmdwdWNvcmUtPmdwbXVfbWFqb3IsCiAJCWFkcmVub19kZXYtPmdwdWNvcmUtPmdwbXVfbWlub3IpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCisJLyogSW50ZWdlciBvdmVyZmxvdyBjaGVjayBmb3IgY21kX3NpemUgKi8KKwlpZiAoZGF0YVsyXSA+IChkYXRhWzBdIC0gMikpCisJCWdvdG8gZXJyOworCiAJY21kcyA9IGRhdGEgKyBkYXRhWzJdICsgMzsKIAljbWRfc2l6ZSA9IGRhdGFbMF0gLSBkYXRhWzJdIC0gMjsKIApAQCAtMTE5Niw4ICsxMjAxLDggQEAKIAlrZ3NsX3JlZ3dyaXRlKGRldmljZSwgQTVYWF9SQkJNX0lTREJfQ05ULCBvbiA/IDB4MDAwMDAxODIgOiAweDAwMDAwMTgwKTsKIH0KIAotc3RhdGljIGludCBfcmVhZF9mdzJfYmxvY2tfaGVhZGVyKHVpbnQzMl90ICpoZWFkZXIsIHVpbnQzMl90IGlkLAotCQkJCXVpbnQzMl90IG1ham9yLCB1aW50MzJfdCBtaW5vcikKK3N0YXRpYyBpbnQgX3JlYWRfZncyX2Jsb2NrX2hlYWRlcih1aW50MzJfdCAqaGVhZGVyLCB1aW50MzJfdCByZW1haW4sCisJCQl1aW50MzJfdCBpZCwgdWludDMyX3QgbWFqb3IsIHVpbnQzMl90IG1pbm9yKQogewogCXVpbnQzMl90IGhlYWRlcl9zaXplOwogCWludCBpID0gMTsKQEAgLTEyMDcsNyArMTIxMiw4IEBACiAKIAloZWFkZXJfc2l6ZSA9IGhlYWRlclswXTsKIAkvKiBIZWFkZXJzIGhhdmUgbGltaXRlZCBzaXplIGFuZCBhbHdheXMgb2NjdXIgYXMgcGFpcnMgb2Ygd29yZHMgKi8KLQlpZiAoaGVhZGVyX3NpemUgPiBNQVhfSEVBREVSX1NJWkUgfHwgaGVhZGVyX3NpemUgJSAyKQorCWlmIChoZWFkZXJfc2l6ZSA+ICBNQVhfSEVBREVSX1NJWkUgfHwgaGVhZGVyX3NpemUgPj0gcmVtYWluIHx8CisJCQkJaGVhZGVyX3NpemUgJSAyIHx8IGhlYWRlcl9zaXplID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCS8qIFNlcXVlbmNlcyBtdXN0IGhhdmUgYW4gaWRlbnRpZnlpbmcgaWQgZmlyc3QgdGhpbmcgaW4gdGhlaXIgaGVhZGVyICovCiAJaWYgKGlkID09IEdQTVVfU0VRVUVOQ0VfSUQpIHsKQEAgLTEzMDIsNiArMTMwOCw3IEBACiAJCS8qIEZvciBub3cgaWdub3JlIGJsb2NrcyBvdGhlciB0aGFuIHRoZSBMTSBzZXF1ZW5jZSAqLwogCQlpZiAoYmxvY2tbNF0gPT0gTE1fU0VRVUVOQ0VfSUQpIHsKIAkJCXJldCA9IF9yZWFkX2Z3Ml9ibG9ja19oZWFkZXIoJmJsb2NrWzJdLAorCQkJCWJsb2NrX3NpemUgLSAyLAogCQkJCUdQTVVfU0VRVUVOQ0VfSUQsCiAJCQkJYWRyZW5vX2Rldi0+Z3B1Y29yZS0+bG1fbWFqb3IsCiAJCQkJYWRyZW5vX2Rldi0+Z3B1Y29yZS0+bG1fbWlub3IpOwpAQCAtMjAzNyw2ICsyMDQ0LDkgQEAKIAogCX0KIAorCS8qIERpc2FibGUgQWxsIGZsYXQgc2hhZGluZyBvcHRpbWl6YXRpb24gKi8KKwlrZ3NsX3JlZ3JtdyhkZXZpY2UsIEE1WFhfVlBDX0RCR19FQ09fQ05UTCwgMCwgMHgxIDw8IDEwKTsKKwogCS8qCiAJICogVlBDIGNvcm5lciBjYXNlIHdpdGggbG9jYWwgbWVtb3J5IGxvYWQga2lsbCBsZWFkcyB0byBjb3JydXB0CiAJICogaW50ZXJuYWwgc3RhdGUuIE5vcm1hbCBEaXNhYmxlIGRvZXMgbm90IHdvcmsgZm9yIGFsbCBhNXggY2hpcHMuCkBAIC0yOTkxLDYgKzMwMDEsMTAgQEAKIAkJQURSRU5PX1JFR19ERUZJTkUoQURSRU5PX1JFR19SQkJNX0JMT0NLX1NXX1JFU0VUX0NNRDIsCiAJCQkJCSAgQTVYWF9SQkJNX0JMT0NLX1NXX1JFU0VUX0NNRDIpLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfVUNIRV9JTlZBTElEQVRFMCwgQTVYWF9VQ0hFX0lOVkFMSURBVEUwKSwKKwlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9SQkJNXzBfTE8sCisJCQkJQTVYWF9SQkJNX1BFUkZDVFJfUkJCTV8wX0xPKSwKKwlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9SQkJNXzBfSEksCisJCQkJQTVYWF9SQkJNX1BFUkZDVFJfUkJCTV8wX0hJKSwKIAlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX1JCQk1fUEVSRkNUUl9MT0FEX1ZBTFVFX0xPLAogCQkJCUE1WFhfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfTE8pLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9QRVJGQ1RSX0xPQURfVkFMVUVfSEksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E1eHhfc25hcHNob3QuYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTV4eF9zbmFwc2hvdC5jCmluZGV4IDc4YjU2YmMuLjZkYzYyODY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E1eHhfc25hcHNob3QuYworKysgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E1eHhfc25hcHNob3QuYwpAQCAtNzY3LDYgKzc2Nyw4IEBACiAKIAljcmFzaF9kdW1wX3ZhbGlkID0gZmFsc2U7CiAKKwlpZiAoIWRldmljZS0+c25hcHNob3RfY3Jhc2hkdW1wZXIpCisJCXJldHVybjsKIAlpZiAoY2FwdHVyZXNjcmlwdC5ncHVhZGRyID09IDAgfHwgcmVnaXN0ZXJzLmdwdWFkZHIgPT0gMCkKIAkJcmV0dXJuOwogCkBAIC04NzIsOCArODc0LDcgQEAKIAkJQVJSQVlfU0laRShhNXh4X3ZiaWZfc25hcHNob3RfcmVnaXN0ZXJzKSk7CiAKIAkvKiBUcnkgdG8gcnVuIHRoZSBjcmFzaCBkdW1wZXIgKi8KLQlpZiAoZGV2aWNlLT5zbmFwc2hvdF9jcmFzaGR1bXBlcikKLQkJX2E1eHhfZG9fY3Jhc2hkdW1wKGRldmljZSk7CisJX2E1eHhfZG9fY3Jhc2hkdW1wKGRldmljZSk7CiAKIAlrZ3NsX3NuYXBzaG90X2FkZF9zZWN0aW9uKGRldmljZSwgS0dTTF9TTkFQU0hPVF9TRUNUSU9OX1JFR1MsCiAJCXNuYXBzaG90LCBhNXh4X3NuYXBzaG90X3JlZ2lzdGVycywgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E2eHguYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTZ4eC5jCmluZGV4IDI0ZjQ1MmYuLmRlNDY3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTZ4eC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTZ4eC5jCkBAIC01MCwxMCArNTAsMTUgQEAKIAl7MCwgMH0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFkcmVub192YmlmX3BsYXRmb3JtIGE2eHhfdmJpZl9wbGF0Zm9ybXNbXSA9IHsKLQl7IGFkcmVub19pc19hNjMwLCBhNjMwX3ZiaWYgfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRyZW5vX3ZiaWZfZGF0YSBhNjE1X2diaWZbXSA9IHsKKwl7QTZYWF9SQkJNX1ZCSUZfQ0xJRU5UX1FPU19DTlRMLCAweDN9LAorCXswLCAwfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRyZW5vX3ZiaWZfcGxhdGZvcm0gYTZ4eF92YmlmX3BsYXRmb3Jtc1tdID0geworCXsgYWRyZW5vX2lzX2E2MzAsIGE2MzBfdmJpZiB9LAorCXsgYWRyZW5vX2lzX2E2MTUsIGE2MTVfZ2JpZiB9LAorfTsKIAogc3RydWN0IGtnc2xfaHdjZ19yZWcgewogCXVuc2lnbmVkIGludCBvZmY7CkBAIC0yNDQsMTggKzI0OSw2IEBACiAJeyBBNlhYX1JCX0NPTlRFWFRfU1dJVENIX0dNRU1fU0FWRV9SRVNUT1JFLCAweDAgfSwKIH07CiAKLXN0YXRpYyB2b2lkIGE2eHhfcGxhdGZvcm1fc2V0dXAoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYpCi17Ci0JdWludDY0X3QgYWRkcjsKLQlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7Ci0KLQkvKiBDYWxjdWxhdGUgU1AgbG9jYWwgYW5kIHByaXZhdGUgbWVtIGFkZHJlc3NlcyAqLwotCWFkZHIgPSBBTElHTihBRFJFTk9fVUNIRV9HTUVNX0JBU0UgKyBhZHJlbm9fZGV2LT5nbWVtX3NpemUsIFNaXzY0Syk7Ci0JYWRyZW5vX2Rldi0+c3BfbG9jYWxfZ3B1YWRkciA9IGFkZHI7Ci0JYWRyZW5vX2Rldi0+c3BfcHZ0X2dwdWFkZHIgPSBhZGRyICsgU1pfNjRLOwotCWdwdWRldi0+dmJpZl94aW5faGFsdF9jdHJsMF9tYXNrID0gQTZYWF9WQklGX1hJTl9IQUxUX0NUUkwwX01BU0s7Ci19Ci0KIHN0YXRpYyB2b2lkIF91cGRhdGVfYWx3YXlzX29uX3JlZ3Moc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYpCiB7CiAJc3RydWN0IGFkcmVub19ncHVkZXYgKmdwdWRldiA9IEFEUkVOT19HUFVfREVWSUNFKGFkcmVub19kZXYpOwpAQCAtMjcyLDcgKzI2NSw3IEBACiAJc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UgPSBLR1NMX0RFVklDRShhZHJlbm9fZGV2KTsKIAogCWlmIChrZ3NsX2FsbG9jYXRlX2dsb2JhbChkZXZpY2UsICZhZHJlbm9fZGV2LT5wd3J1cF9yZWdsaXN0LAotCQlQQUdFX1NJWkUsIDAsIEtHU0xfTUVNREVTQ19QUklWSUxFR0VELAorCQlQQUdFX1NJWkUsIEtHU0xfTUVNRkxBR1NfR1BVUkVBRE9OTFksIDAsCiAJCSJwb3dlcnVwX3JlZ2lzdGVyX2xpc3QiKSkgewogCQlhZHJlbm9fZGV2LT5wd3J1cF9yZWdsaXN0LmdwdWFkZHIgPSAwOwogCQlyZXR1cm47CkBAIC0zNjksMTQgKzM2MiwzMyBAQAogCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JCQk1fU0VDVklEX1RTQl9BRERSX01PREVfQ05UTCwgMHgxKTsKIH0KIAorI2RlZmluZSBSQkJNX0NMT0NLX0NOVExfT04gMHg4QUE4QUEwMgogCiBzdGF0aWMgdm9pZCBhNnh4X2h3Y2dfc2V0KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LCBib29sIG9uKQogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CiAJY29uc3Qgc3RydWN0IGtnc2xfaHdjZ19yZWcgKnJlZ3M7CisJdW5zaWduZWQgaW50IHZhbHVlOwogCWludCBpLCBqOwogCiAJaWYgKCF0ZXN0X2JpdChBRFJFTk9fSFdDR19DVFJMLCAmYWRyZW5vX2Rldi0+cHdyY3RybF9mbGFnKSkKKwkJb24gPSBmYWxzZTsKKworCWlmIChrZ3NsX2dtdV9pc2VuYWJsZWQoZGV2aWNlKSkgeworCQlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0dNVV9BT19HTVVfQ0dDX01PREVfQ05UTCwKKwkJCW9uID8gMHgwMDAyMDIyMiA6IDApOworCQlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0dNVV9BT19HTVVfQ0dDX0RFTEFZX0NOVEwsCisJCQlvbiA/IDB4MDAwMTAxMTEgOiAwKTsKKwkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dQVV9HTVVfQU9fR01VX0NHQ19IWVNUX0NOVEwsCisJCQlvbiA/IDB4MDAwNTA1NTUgOiAwKTsKKwl9CisKKwlrZ3NsX3JlZ3JlYWQoZGV2aWNlLCBBNlhYX1JCQk1fQ0xPQ0tfQ05UTCwgJnZhbHVlKTsKKworCWlmICh2YWx1ZSA9PSBSQkJNX0NMT0NLX0NOVExfT04gJiYgb24pCisJCXJldHVybjsKKworCWlmICh2YWx1ZSA9PSAwICYmICFvbikKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9od2NnX3JlZ2lzdGVycyk7IGkrKykgewpAQCAtMzk1LDE5ICs0MDcsMTIgQEAKIAlmb3IgKGogPSAwOyBqIDwgYTZ4eF9od2NnX3JlZ2lzdGVyc1tpXS5jb3VudDsgaisrKQogCQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwgcmVnc1tqXS5vZmYsIG9uID8gcmVnc1tqXS52YWwgOiAwKTsKIAotCWlmIChrZ3NsX2dtdV9pc2VuYWJsZWQoZGV2aWNlKSkgewotCQlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0dNVV9BT19HTVVfQ0dDX01PREVfQ05UTCwKLQkJCTB4MDAwMjAyMjIpOwotCQlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0dNVV9BT19HTVVfQ0dDX0RFTEFZX0NOVEwsCi0JCQkweDAwMDEwMTExKTsKLQkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dQVV9HTVVfQU9fR01VX0NHQ19IWVNUX0NOVEwsCi0JCQkweDAwMDUwNTU1KTsKLQl9CiAJLyogRW5hYmxlIFNQIGNsb2NrICovCiAJa2dzbF9nbXVfcmVncm13KGRldmljZSwgQTZYWF9HUFVfR01VX0dYX1NQVFBSQUNfQ0xPQ0tfQ09OVFJPTCwgMCwgMSk7CiAKIAkvKiBlbmFibGUgdG9wIGxldmVsIEhXQ0cgKi8KLQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwgQTZYWF9SQkJNX0NMT0NLX0NOVEwsIG9uID8gMHg4QUE4QUEwMiA6IDApOworCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JCQk1fQ0xPQ0tfQ05UTCwKKwkJb24gPyBSQkJNX0NMT0NLX0NOVExfT04gOiAwKTsKIH0KIAogI2RlZmluZSBMTV9ERUZBVUxUX0xJTUlUCTYwMDAKQEAgLTU2Nyw3ICs1NzIsNyBAQAogCQlrZ3NsX3JlZ3JtdyhkZXZpY2UsIEE2WFhfUENfREJHX0VDT19DTlRMLCAwLCAoMSA8PCA4KSk7CiAKIAkvKiBFbmFibGUgdGhlIEdNRU0gc2F2ZS9yZXN0b3JlIGZlYXR1cmUgZm9yIHByZWVtcHRpb24gKi8KLQlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKKwlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fc2V0dXBfZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJa2dzbF9yZWd3cml0ZShkZXZpY2UsIEE2WFhfUkJfQ09OVEVYVF9TV0lUQ0hfR01FTV9TQVZFX1JFU1RPUkUsCiAJCQkweDEpOwogCkBAIC02OTQsNyArNjk5LDcgQEAKIAkJKmNtZHMrKyA9IGxvd2VyXzMyX2JpdHMoZ3B1YWRkcik7CiAJCSpjbWRzKysgPSB1cHBlcl8zMl9iaXRzKGdwdWFkZHIpOwogCQkvKiBTaXplIGlzIGluIGR3b3JkcyAqLwotCQkqY21kcysrID0gc2l6ZW9mKGE2eHhfcHdydXBfcmVnbGlzdCkgPj4gMjsKKwkJKmNtZHMrKyA9IDA7CiAJfQogCiAJLyogUGFkIHJlc3Qgb2YgdGhlIGNtZHMgd2l0aCAwJ3MgKi8KQEAgLTc3Myw3ICs3NzgsNyBAQAogCXN0cnVjdCBhZHJlbm9fcmluZ2J1ZmZlciAqcmIgPSBhZHJlbm9fZGV2LT5jdXJfcmI7CiAJc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UgPSBLR1NMX0RFVklDRShhZHJlbm9fZGV2KTsKIAotCWlmICghYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKKwlpZiAoIWFkcmVub19pc19wcmVlbXB0aW9uX2V4ZWN1dGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQogCQlyZXR1cm4gMDsKIAogCWNtZHMgPSBhZHJlbm9fcmluZ2J1ZmZlcl9hbGxvY3NwYWNlKHJiLCA0Mik7CkBAIC04NzEsMTYgKzg3Niw2IEBACiAKICNkZWZpbmUgUlNDX0NNRF9PRkZTRVQgMgogI2RlZmluZSBQRENfQ01EX09GRlNFVCA0Ci1zdGF0aWMgdm9pZCBfcmVncmVhZCh2b2lkIF9faW9tZW0gKnJlZ2Jhc2UsCi0JCXVuc2lnbmVkIGludCBvZmZzZXR3b3JkcywgdW5zaWduZWQgaW50ICp2YWx1ZSkKLXsKLQl2b2lkIF9faW9tZW0gKnJlZzsKLQotCXJlZyA9IHJlZ2Jhc2UgKyAob2Zmc2V0d29yZHMgPDwgMik7Ci0JKnZhbHVlID0gX19yYXdfcmVhZGwocmVnKTsKLQkvKiBFbnN1cmUgcmVhZCBjb21wbGV0ZXMgKi8KLQlybWIoKTsKLX0KIAogc3RhdGljIHZvaWQgX3JlZ3dyaXRlKHZvaWQgX19pb21lbSAqcmVnYmFzZSwKIAkJdW5zaWduZWQgaW50IG9mZnNldHdvcmRzLCB1bnNpZ25lZCBpbnQgdmFsdWUpCkBAIC04OTgsOCArODkzLDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9sb2FkX2dtdV9ycG1oX3Vjb2RlKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlKQogeworCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwogCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CiAKKwkvKiBEaXNhYmxlIFNERSBjbG9jayBnYXRpbmcgKi8KKwlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX1JTQ0NfUlNDX1NUQVRVUzBfRFJWMCwgQklUKDI0KSk7CisKIAkvKiBTZXR1cCBSU0MgUERDIGhhbmRzaGFrZSBmb3Igc2xlZXAgYW5kIHdha2V1cCAqLwogCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9SU0NDX1BEQ19TTEFWRV9JRF9EUlYwLCAxKTsKIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfUlNDQ19ISURERU5fVENTX0NNRDBfREFUQSwgMCk7CkBAIC05MTksOCArOTE4LDkgQEAKIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfUlNDQ19QRENfTUFUQ0hfVkFMVUVfTE8sIDB4NDUxMCk7CiAJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JTQ0NfUERDX01BVENIX1ZBTFVFX0hJLCAweDQ1MTQpOwogCi0JLyogRW5hYmxlIHRpbWVzdGFtcCBldmVudCAqLwotCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9SU0NDX1RJTUVTVEFNUF9VTklUMV9FTl9EUlYwLCAxKTsKKwkvKiBFbmFibGUgdGltZXN0YW1wIGV2ZW50IGZvciB2MSBvbmx5ICovCisJaWYgKGFkcmVub19pc19hNjMwdjEoYWRyZW5vX2RldikpCisJCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9SU0NDX1RJTUVTVEFNUF9VTklUMV9FTl9EUlYwLCAxKTsKIAogCS8qIExvYWQgUlNDIHNlcXVlbmNlciB1Q29kZSBmb3Igc2xlZXAgYW5kIHdha2V1cCAqLwogCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9SU0NDX1NFUV9NRU1fMF9EUlYwLCAweEE3QTUwNkEwKTsKQEAgLTkzMCwxMSArOTMwLDExIEBACiAJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JTQ0NfU0VRX01FTV8wX0RSVjAgKyA0LCAweDAwMjBFOEE4KTsKIAogCS8qIExvYWQgUERDIHNlcXVlbmNlciB1Q29kZSBmb3IgcG93ZXIgdXAgYW5kIHBvd2VyIGRvd24gc2VxdWVuY2UgKi8KLQlfcmVnd3JpdGUoZ211LT5wZGNfcmVnX3ZpcnQsIFBEQ19HUFVfU0VRX01FTV8wLCAweEZGQkZBMUUxKTsKLQlfcmVnd3JpdGUoZ211LT5wZGNfcmVnX3ZpcnQsIFBEQ19HUFVfU0VRX01FTV8wICsgMSwgMHhFMEE0QTNBMik7Ci0JX3JlZ3dyaXRlKGdtdS0+cGRjX3JlZ192aXJ0LCBQRENfR1BVX1NFUV9NRU1fMCArIDIsIDB4RTI4NDgzODIpOwotCV9yZWd3cml0ZShnbXUtPnBkY19yZWdfdmlydCwgUERDX0dQVV9TRVFfTUVNXzAgKyAzLCAweEZEQkRFNEUzKTsKLQlfcmVnd3JpdGUoZ211LT5wZGNfcmVnX3ZpcnQsIFBEQ19HUFVfU0VRX01FTV8wICsgNCwgMHgwMDAwMjA4MSk7CisJX3JlZ3dyaXRlKGdtdS0+cGRjX3JlZ192aXJ0LCBQRENfR1BVX1NFUV9NRU1fMCwgMHhGRUJFQTFFMSk7CisJX3JlZ3dyaXRlKGdtdS0+cGRjX3JlZ192aXJ0LCBQRENfR1BVX1NFUV9NRU1fMCArIDEsIDB4QTVBNEEzQTIpOworCV9yZWd3cml0ZShnbXUtPnBkY19yZWdfdmlydCwgUERDX0dQVV9TRVFfTUVNXzAgKyAyLCAweDgzODJBNkUwKTsKKwlfcmVnd3JpdGUoZ211LT5wZGNfcmVnX3ZpcnQsIFBEQ19HUFVfU0VRX01FTV8wICsgMywgMHhCQ0UzRTI4NCk7CisJX3JlZ3dyaXRlKGdtdS0+cGRjX3JlZ192aXJ0LCBQRENfR1BVX1NFUV9NRU1fMCArIDQsIDB4MDAyMDgxRkMpOwogCiAJLyogU2V0IFRDUyBjb21tYW5kcyB1c2VkIGJ5IFBEQyBzZXF1ZW5jZSBmb3IgbG93IHBvd2VyIG1vZGVzICovCiAJX3JlZ3dyaXRlKGdtdS0+cGRjX3JlZ192aXJ0LCBQRENfR1BVX1RDUzBfQ01EX0VOQUJMRV9CQU5LLCA3KTsKQEAgLTEwMTcsMTAgKzEwMTcsMjQgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAJfSB3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdCkpOwogCisJLyogRG91YmxlIGNoZWNrIG9uZSBsYXN0IHRpbWUgKi8KKwlrZ3NsX2dtdV9yZWdyZWFkKGRldmljZSwgb2Zmc2V0LCAmdmFsdWUpOworCWlmICgodmFsdWUgJiBtYXNrKSA9PSBleHBlY3RlZF9yZXQpCisJCXJldHVybiAwOworCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qCisgKiBUaGUgbG93ZXN0IDE2IGJpdHMgb2YgdGhpcyB2YWx1ZSBhcmUgdGhlIG51bWJlciBvZiBYTyBjbG9jayBjeWNsZXMKKyAqIGZvciBtYWluIGh5c3RlcmVzaXMuIFRoaXMgaXMgdGhlIGZpcnN0IGh5c3RlcmVzaXMuIEhlcmUgd2Ugc2V0IGl0CisgKiB0byAweDVEQyBjeWNsZXMsIG9yIDc4LjEgdXMuIFRoZSBoaWdoZXN0IDE2IGJpdHMgb2YgdGhpcyB2YWx1ZSBhcmUKKyAqIHRoZSBudW1iZXIgb2YgWE8gY2xvY2sgY3ljbGVzIGZvciBzaG9ydCBoeXN0ZXJlc2lzLiBUaGlzIGhhcHBlbnMKKyAqIGFmdGVyIG1haW4gaHlzdGVyZXNpcy4gSGVyZSB3ZSBzZXQgaXQgdG8gMHhBIGN5Y2xlcywgb3IgMC41IHVzLgorICovCisjZGVmaW5lIEdNVV9QV1JfQ09MX0hZU1QgMHgwMDBBMDVEQworCisvKgogICogYTZ4eF9nbXVfcG93ZXJfY29uZmlnKCkgLSBDb25maWd1cmUgYW5kIGVuYWJsZSBHTVUncyBsb3cgcG93ZXIgbW9kZQogICogc2V0dGluZyBiYXNlZCBvbiBBRFJFTk8gZmVhdHVyZSBmbGFncy4KICAqIEBkZXZpY2U6IFBvaW50ZXIgdG8gS0dTTCBkZXZpY2UKQEAgLTEwNTEsMTMgKzEwNjUsMTMgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBHUFVfSFdfSUZQQzoKIAkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dNVV9QV1JfQ09MX0lOVEVSX0ZSQU1FX0hZU1QsCi0JCQkJMHgwMDBBMDA4MCk7CisJCQkJR01VX1BXUl9DT0xfSFlTVCk7CiAJCWtnc2xfZ211X3JlZ3JtdyhkZXZpY2UsIEE2WFhfR01VX1BXUl9DT0xfSU5URVJfRlJBTUVfQ1RSTCwgMCwKIAkJCQlJRlBDX0VOQUJMRV9NQVNLKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBHUFVfSFdfU1BUUF9QQzoKIAkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dNVV9QV1JfQ09MX1NQVFBSQUNfSFlTVCwKLQkJCQkweDAwMEEwMDgwKTsKKwkJCQlHTVVfUFdSX0NPTF9IWVNUKTsKIAkJa2dzbF9nbXVfcmVncm13KGRldmljZSwgQTZYWF9HTVVfUFdSX0NPTF9JTlRFUl9GUkFNRV9DVFJMLCAwLAogCQkJCVNQVFBfRU5BQkxFX01BU0spOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTEyNzYsMjEgKzEyOTAsMTIgQEAKIHsKIAlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOwogCXVuc2lnbmVkIGludCB2YWw7Ci0JYm9vbCBzdGF0ZTsKIAogCWlmICgha2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkpCiAJCXJldHVybiB0cnVlOwogCiAJa2dzbF9nbXVfcmVncmVhZChkZXZpY2UsIEE2WFhfR01VX1NQVFBSQUNfUFdSX0NMS19TVEFUVVMsICZ2YWwpOwotCXN0YXRlID0gISh2YWwgJiAoR1hfR0RTQ19QT1dFUl9PRkYgfCBHWF9DTEtfT0ZGKSk7Ci0KLQkvKiBJZiBHTVUgaXMgaG9sZGluZyBvbiB0byB0aGUgZmVuY2UgdGhlbiB3ZSBjYW5ub3QgZHVtcCBhbnkgR1ggc3R1ZmYgKi8KLQlrZ3NsX2dtdV9yZWdyZWFkKGRldmljZSwgQTZYWF9HTVVfQU9fQUhCX0ZFTkNFX0NUUkwsICZ2YWwpOwotCWlmICh2YWwpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiBzdGF0ZTsKLQorCXJldHVybiAhKHZhbCAmIChHWF9HRFNDX1BPV0VSX09GRiB8IEdYX0NMS19PRkYpKTsKIH0KIAogLyoKQEAgLTEzNjEsMTIgKzEzNjYsMTMgQEAKIAkvKiBEaXNhYmxlIHRoZSBwb3dlciBjb3VudGVyIHNvIHRoYXQgdGhlIEdNVSBpcyBub3QgYnVzeSAqLwogCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9HTVVfQ1hfR01VX1BPV0VSX0NPVU5URVJfRU5BQkxFLCAwKTsKIAotCS8qIFR1cm4gb2ZmIFNQVFBSQUMgYmVmb3JlIEdNVSB0dXJucyBvZmYgR1ggKi8KLQlhNnh4X3NwdHByYWNfZGlzYWJsZShhZHJlbm9fZGV2KTsKKwkvKiBUdXJuIG9mZiBTUFRQUkFDIGlmIHdlIG93biBpdCAqLworCWlmIChnbXUtPmlkbGVfbGV2ZWwgPCBHUFVfSFdfU1BUUF9QQykKKwkJYTZ4eF9zcHRwcmFjX2Rpc2FibGUoYWRyZW5vX2Rldik7CiAKIAlpZiAoIUFEUkVOT19RVUlSSyhhZHJlbm9fZGV2LCBBRFJFTk9fUVVJUktfSEZJX1VTRV9SRUcpKSB7CiAJCXJldCA9IGhmaV9ub3RpZnlfc2x1bWJlcihnbXUsIHBlcmZfaWR4LCBidXNfbGV2ZWwpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAl9CiAKIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR01VX0JPT1RfU0xVTUJFUl9PUFRJT04sCkBAIC0xMzkyLDYgKzEzOTgsOSBAQAogCQl9CiAJfQogCitvdXQ6CisJLyogTWFrZSBzdXJlIHRoZSBmZW5jZSBpcyBpbiBBTExPVyBtb2RlICovCisJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dNVV9BT19BSEJfRkVOQ0VfQ1RSTCwgMCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM5OSwxMiArMTQwOCwxMiBAQAogewogCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmdtdS0+cGRldi0+ZGV2OwotCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwotCXVuc2lnbmVkIGludCB0bXA7CiAJaW50IHZhbDsKIAogCWtnc2xfZ211X3JlZ3JlYWQoZGV2aWNlLCBBNlhYX0dQVV9DQ19HWF9ET01BSU5fTUlTQywgJnZhbCk7Ci0JV0FSTl9PTighKHZhbCAmIDB4MSkpOworCWlmICghKHZhbCAmIDB4MSkpCisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmdtdS0+cGRldi0+ZGV2LAorCQkJIkdNRU0gQ0xBTVAgSU8gbm90IHNldCB3aGlsZSBHRlggcmFpbCBvZmZcbiIpOwogCiAJLyogUlNDIHdha2Ugc2VxdWVuY2UgKi8KIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR01VX1JTQ0NfQ09OVFJPTF9SRVEsIEJJVCgxKSk7CkBAIC0xNDMwLDE5ICsxNDM5LDYgQEAKIAogCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMCk7CiAKLQkvKiBUdXJuIG9uIEdGWCByYWlsIENQUiAqLwotCWlmIChhZHJlbm9faXNfYTYzMHYyKGFkcmVub19kZXYpKSB7Ci0JCV9yZWdyZWFkKGdtdS0+Y3ByX3JlZ192aXJ0LCBDUFJfQ1BSRl9DUFJGNV9DVFJMLCAmdG1wKTsKLQkJdG1wIHw9IEJJVCgyKTsKLQkJX3JlZ3dyaXRlKGdtdS0+Y3ByX3JlZ192aXJ0LCBDUFJfQ1BSRl9DUFJGNV9DVFJMLCB0bXApOwotCi0JCWtnc2xfZ211X3JlZ3JlYWQoZGV2aWNlLCBBNlhYX0dQVV9DUFJfRlNNX0NUTCwgJnRtcCk7Ci0JCXRtcCB8PSBCSVQoMCk7Ci0JCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9HUFVfQ1BSX0ZTTV9DVEwsIHRtcCk7Ci0JCS8qIEVuc3VyZSB3cml0ZSBoYXBwZW5zIGJlZm9yZSBleGl0IHRoZSBmdW5jdGlvbiAqLwotCQl3bWIoKTsKLQl9Ci0KIAkvKiBFbmFibGUgdGhlIHBvd2VyIGNvdW50ZXIgYmVjYXVzZSBpdCB3YXMgZGlzYWJsZWQgYmVmb3JlIHNsdW1iZXIgKi8KIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR01VX0NYX0dNVV9QT1dFUl9DT1VOVEVSX0VOQUJMRSwgMSk7CiAKQEAgLTE0NTYsNDkgKzE0NTIsNDkgQEAKIHsKIAlzdHJ1Y3QgZ211X2RldmljZSAqZ211ID0gJmRldmljZS0+Z211OwogCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwotCXVuc2lnbmVkIGludCB0bXA7Ci0JaW50IHZhbDsKKwlpbnQgcmV0OwogCi0JLyogVHVybiBvZmYgR0ZYIHJhaWwgQ1BSICovCi0JaWYgKGFkcmVub19pc19hNjMwdjIoYWRyZW5vX2RldikpIHsKLQkJX3JlZ3JlYWQoZ211LT5jcHJfcmVnX3ZpcnQsIENQUl9DUFJGX0NQUkY1X0NUUkwsICZ0bXApOwotCQl0bXAgJj0gfkJJVCgyKTsKLQkJX3JlZ3dyaXRlKGdtdS0+Y3ByX3JlZ192aXJ0LCBDUFJfQ1BSRl9DUFJGNV9DVFJMLCB0bXApOworCS8qIFJTQyBzbGVlcCBzZXF1ZW5jZSBpcyBkaWZmZXJlbnQgb24gdjEgKi8KKwlpZiAoYWRyZW5vX2lzX2E2MzB2MShhZHJlbm9fZGV2KSkKKwkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JTQ0NfVElNRVNUQU1QX1VOSVQxX0VOX0RSVjAsIDEpOwogCi0JCWtnc2xfZ211X3JlZ3JlYWQoZGV2aWNlLCBBNlhYX0dQVV9DUFJfRlNNX0NUTCwgJnRtcCk7Ci0JCXRtcCAmPSB+QklUKDApOwotCQlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0NQUl9GU01fQ1RMLCB0bXApOwotCQkvKiBFbnN1cmUgd3JpdGUgY29tcGxldGVzIGJlZm9yZSBzdGFydGluZyBzbGVlcCBzZXEgKi8KLQkJd21iKCk7Ci0JfQotCi0JLyogUlNDIHNsZWVwIHNlcXVlbmNlICovCi0Ja2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX1JTQ0NfVElNRVNUQU1QX1VOSVQxX0VOX0RSVjAsIDEpOwogCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9HTVVfUlNDQ19DT05UUk9MX1JFUSwgMSk7CiAJd21iKCk7CiAKLQlpZiAodGltZWRfcG9sbF9jaGVjayhkZXZpY2UsCi0JCQlBNlhYX1JTQ0NfVElNRVNUQU1QX1VOSVQxX09VVFBVVF9EUlYwLAotCQkJQklUKDApLAotCQkJR1BVX1NUQVJUX1RJTUVPVVQsCi0JCQlCSVQoMCkpKSB7CisJaWYgKGFkcmVub19pc19hNjMwdjEoYWRyZW5vX2RldikpCisJCXJldCA9IHRpbWVkX3BvbGxfY2hlY2soZGV2aWNlLAorCQkJCUE2WFhfUlNDQ19USU1FU1RBTVBfVU5JVDFfT1VUUFVUX0RSVjAsCisJCQkJQklUKDApLAorCQkJCUdQVV9TVEFSVF9USU1FT1VULAorCQkJCUJJVCgwKSk7CisJZWxzZQorCQlyZXQgPSB0aW1lZF9wb2xsX2NoZWNrKGRldmljZSwKKwkJCQlBNlhYX0dQVV9SU0NDX1JTQ19TVEFUVVMwX0RSVjAsCisJCQkJQklUKDE2KSwKKwkJCQlHUFVfU1RBUlRfVElNRU9VVCwKKwkJCQlCSVQoMTYpKTsKKworCWlmIChyZXQpIHsKIAkJZGV2X2VycigmZ211LT5wZGV2LT5kZXYsICJHUFUgUlNDIHBvd2VyIG9mZiBmYWlsXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAotCS8qIFJlYWQgdG8gY2xlYXIgdGhlIHRpbWVzdGFtcCAqLwotCWtnc2xfZ211X3JlZ3JlYWQoZGV2aWNlLCBBNlhYX1JTQ0NfVElNRVNUQU1QX1VOSVQwX1RJTUVTVEFNUF9MX0RSVjAsCi0JCQkmdmFsKTsKLQlrZ3NsX2dtdV9yZWdyZWFkKGRldmljZSwgQTZYWF9SU0NDX1RJTUVTVEFNUF9VTklUMF9USU1FU1RBTVBfSF9EUlYwLAotCQkJJnZhbCk7CisJLyogUmVhZCB0byBjbGVhciB0aGUgdGltZXN0YW1wIHZhbGlkIHNpZ25hbC4gRG9uJ3QgY2FyZSB3aGF0IHdlIHJlYWQuICovCisJaWYgKGFkcmVub19pc19hNjMwdjEoYWRyZW5vX2RldikpIHsKKwkJa2dzbF9nbXVfcmVncmVhZChkZXZpY2UsCisJCQkJQTZYWF9SU0NDX1RJTUVTVEFNUF9VTklUMF9USU1FU1RBTVBfTF9EUlYwLAorCQkJCSZyZXQpOworCQlrZ3NsX2dtdV9yZWdyZWFkKGRldmljZSwKKwkJCQlBNlhYX1JTQ0NfVElNRVNUQU1QX1VOSVQwX1RJTUVTVEFNUF9IX0RSVjAsCisJCQkJJnJldCk7CisJfQorCiAJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dNVV9SU0NDX0NPTlRST0xfUkVRLCAwKTsKIAogCWlmIChBRFJFTk9fRkVBVFVSRShhZHJlbm9fZGV2LCBBRFJFTk9fTE0pICYmCi0JCXRlc3RfYml0KEFEUkVOT19MTV9DVFJMLCAmYWRyZW5vX2Rldi0+cHdyY3RybF9mbGFnKSkKKwkJCXRlc3RfYml0KEFEUkVOT19MTV9DVFJMLCAmYWRyZW5vX2Rldi0+cHdyY3RybF9mbGFnKSkKIAkJa2dzbF9nbXVfcmVnd3JpdGUoZGV2aWNlLCBBNlhYX0dNVV9BT19TUEFSRV9DTlRMLCAwKTsKIAotCS8qIEZJWE1FOiB2MiBoYXMgZGlmZmVyZW50IHByb2NlZHVyZSB0byB0cmlnZ2VyIHNlcXVlbmNlICovCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU3NCw2ICsxNTcwLDggQEAKIAlrZ3NsX2dtdV9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR1BVX0NTX0FNUF9DQUxJQlJBVElPTl9ET05FLCAxKTsKIAogfQorCisjZGVmaW5lIEdQVV9MSU1JVF9USFJFU0hPTERfRU5BQkxFCUJJVCgzMSkKIC8qCiAgKiBhNnh4X2dtdV9md19zdGFydCgpIC0gc2V0IHVwIEdNVSBhbmQgc3RhcnQgRlcKICAqIEBkZXZpY2U6IFBvaW50ZXIgdG8gS0dTTCBkZXZpY2UKQEAgLTE2NTcsNyArMTY1NSw3IEBACiAJaWYgKEFEUkVOT19GRUFUVVJFKGFkcmVub19kZXYsIEFEUkVOT19MTSkgJiYKIAkJdGVzdF9iaXQoQURSRU5PX0xNX0NUUkwsICZhZHJlbm9fZGV2LT5wd3JjdHJsX2ZsYWcpKSB7CiAJCWtnc2xfZ211X3JlZ3dyaXRlKGRldmljZSwgQTZYWF9HUFVfR01VX0NYX0dNVV9QV1JfVEhSRVNIT0xELAotCQkJbG1fbGltaXQoYWRyZW5vX2RldikpOworCQkJR1BVX0xJTUlUX1RIUkVTSE9MRF9FTkFCTEUgfCBsbV9saW1pdChhZHJlbm9fZGV2KSk7CiAJCWlzZW5zZV9jb2xkX3RyaW1tKGRldmljZSk7CiAJfQogCkBAIC0xNzU0LDYgKzE3NTIsNTMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGludCBhNnh4X3dhaXRfZm9yX2xvd2VzdF9pZGxlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQoreworCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CisJc3RydWN0IGdtdV9kZXZpY2UgKmdtdSA9ICZkZXZpY2UtPmdtdTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAoIWtnc2xfZ211X2lzZW5hYmxlZChkZXZpY2UpKQorCQlyZXR1cm4gMDsKKworCXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhHTVVfSURMRV9USU1FT1VUKTsKKwl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdCkpIHsKKwkJYWRyZW5vX3JlYWRfZ211cmVnKEFEUkVOT19ERVZJQ0UoZGV2aWNlKSwKKwkJCQlBRFJFTk9fUkVHX0dNVV9SUE1IX1BPV0VSX1NUQVRFLCAmcmVnKTsKKworCQkvKiBTUFRQUkFDIFBDIGhhcyB0aGUgc2FtZSBpZGxlIGxldmVsIGFzIElGUEMgKi8KKwkJaWYgKChyZWcgPT0gZ211LT5pZGxlX2xldmVsKSB8fAorCQkJCShnbXUtPmlkbGVfbGV2ZWwgPT0gR1BVX0hXX1NQVFBfUEMgJiYKKwkJCQlyZWcgPT0gR1BVX0hXX0lGUEMpKSB7CisJCQkvKiBJRlBDIGlzIG5vdCBjb21wbGV0ZSB1bnRpbCBHWCBpcyBvZmYgKi8KKwkJCWlmIChnbXUtPmlkbGVfbGV2ZWwgIT0gR1BVX0hXX0lGUEMgfHwKKwkJCQkJIWdwdWRldi0+Z3hfaXNfb24oYWRyZW5vX2RldikpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBXYWl0IDEwMHVzIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSBBSEIgYnVzIHRyYWZmaWMgKi8KKwkJdWRlbGF5KDEwMCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCS8qIENoZWNrIG9uZSBsYXN0IHRpbWUgKi8KKwlhZHJlbm9fcmVhZF9nbXVyZWcoQURSRU5PX0RFVklDRShkZXZpY2UpLAorCQkJQURSRU5PX1JFR19HTVVfUlBNSF9QT1dFUl9TVEFURSwgJnJlZyk7CisJaWYgKChyZWcgPT0gZ211LT5pZGxlX2xldmVsKSB8fAorCQkJKGdtdS0+aWRsZV9sZXZlbCA9PSBHUFVfSFdfU1BUUF9QQyAmJgorCQkJcmVnID09IEdQVV9IV19JRlBDKSkgeworCQlpZiAoZ211LT5pZGxlX2xldmVsICE9IEdQVV9IV19JRlBDIHx8CisJCQkJIWdwdWRldi0+Z3hfaXNfb24oYWRyZW5vX2RldikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZfZXJyKCZnbXUtPnBkZXYtPmRldiwKKwkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIGxvd2VzdCBpZGxlIGxldmVsOiAlZFxuIiwgcmVnKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKwogc3RhdGljIGludCBhNnh4X3dhaXRfZm9yX2dtdV9pZGxlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CkBAIC0xOTgyLDkgKzIwMjcsNyBAQAogCS8qIElmIFNQVFBfUkFDIGlzIG9uLCB0dXJuIG9mZiBTUFRQX1JBQyBIUyAqLwogCWE2eHhfc3B0cHJhY19kaXNhYmxlKGFkcmVub19kZXYpOwogCi0JLyogRGlzY29ubmVjdCBHUFUgZnJvbSBCVVMuIENsZWFyIGFuZCByZWNvbm5lY3RlZCBhZnRlciByZXNldCAqLwotCS8qIGFkcmVub192YmlmX2NsZWFyX3BlbmRpbmdfdHJhbnNhY3Rpb25zKGRldmljZSk7ICovCi0JLyogVW5uZWNlc3Nhcnk6IGE2eHhfc29mdF9yZXNldChhZHJlbm9fZGV2KTsgKi8KKwkvKiBEaXNjb25uZWN0IEdQVSBmcm9tIEJVUyBpcyBub3QgbmVlZGVkIGlmIENYIEdEU0MgZ29lcyBvZmYgbGF0ZXIgKi8KIAogCS8qIENoZWNrIG5vIG91dHN0YW5kaW5nIFJQTWggdm90aW5nICovCiAJYTZ4eF9jb21wbGV0ZV9ycG1oX3ZvdGVzKGRldmljZSk7CkBAIC0yMzM0LDcgKzIzNzcsNyBAQAogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CiAKLQlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKKwlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCiAJCWE2eHhfcHJlZW1wdGlvbl90cmlnZ2VyKGFkcmVub19kZXYpOwogCiAJYWRyZW5vX2Rpc3BhdGNoZXJfc2NoZWR1bGUoZGV2aWNlKTsKQEAgLTI3MjYsNiArMjc2OSwyNyBAQAogCQlBNlhYX1ZCSUZfUEVSRl9QV1JfQ05UX0hJR0gyLCAtMSwgQTZYWF9WQklGX1BFUkZfUFdSX0NOVF9FTjIgfSwKIH07CiAKKworc3RhdGljIHN0cnVjdCBhZHJlbm9fcGVyZmNvdW50X3JlZ2lzdGVyIGE2eHhfcGVyZmNvdW50ZXJzX2diaWZbXSA9IHsKKwl7IEtHU0xfUEVSRkNPVU5URVJfTk9UX1VTRUQsIDAsIDAsIEE2WFhfR0JJRl9QRVJGX0NOVF9MT1cwLAorCQlBNlhYX0dCSUZfUEVSRl9DTlRfSElHSDAsIC0xLCBBNlhYX0dCSUZfUEVSRl9DTlRfU0VMIH0sCisJeyBLR1NMX1BFUkZDT1VOVEVSX05PVF9VU0VELCAwLCAwLCBBNlhYX0dCSUZfUEVSRl9DTlRfTE9XMSwKKwkJQTZYWF9HQklGX1BFUkZfQ05UX0hJR0gxLCAtMSwgQTZYWF9HQklGX1BFUkZfQ05UX1NFTCB9LAorCXsgS0dTTF9QRVJGQ09VTlRFUl9OT1RfVVNFRCwgMCwgMCwgQTZYWF9HQklGX1BFUkZfQ05UX0xPVzIsCisJCUE2WFhfR0JJRl9QRVJGX0NOVF9ISUdIMiwgLTEsIEE2WFhfR0JJRl9QRVJGX0NOVF9TRUwgfSwKKwl7IEtHU0xfUEVSRkNPVU5URVJfTk9UX1VTRUQsIDAsIDAsIEE2WFhfR0JJRl9QRVJGX0NOVF9MT1czLAorCQlBNlhYX0dCSUZfUEVSRl9DTlRfSElHSDMsIC0xLCBBNlhYX0dCSUZfUEVSRl9DTlRfU0VMIH0sCit9OworCitzdGF0aWMgc3RydWN0IGFkcmVub19wZXJmY291bnRfcmVnaXN0ZXIgYTZ4eF9wZXJmY291bnRlcnNfZ2JpZl9wd3JbXSA9IHsKKwl7IEtHU0xfUEVSRkNPVU5URVJfTk9UX1VTRUQsIDAsIDAsIEE2WFhfR0JJRl9QV1JfQ05UX0xPVzAsCisJCUE2WFhfR0JJRl9QV1JfQ05UX0hJR0gwLCAtMSwgQTZYWF9HQklGX1BFUkZfUFdSX0NOVF9FTiB9LAorCXsgS0dTTF9QRVJGQ09VTlRFUl9OT1RfVVNFRCwgMCwgMCwgQTZYWF9HQklGX1BXUl9DTlRfTE9XMSwKKwkJQTZYWF9HQklGX1BXUl9DTlRfSElHSDEsIC0xLCBBNlhYX0dCSUZfUEVSRl9QV1JfQ05UX0VOIH0sCisJeyBLR1NMX1BFUkZDT1VOVEVSX05PVF9VU0VELCAwLCAwLCBBNlhYX0dCSUZfUFdSX0NOVF9MT1cyLAorCQlBNlhYX0dCSUZfUFdSX0NOVF9ISUdIMiwgLTEsIEE2WFhfR0JJRl9QRVJGX1BXUl9DTlRfRU4gfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYWRyZW5vX3BlcmZjb3VudF9yZWdpc3RlciBhNnh4X3BlcmZjb3VudGVyc19wd3JbXSA9IHsKIAl7IEtHU0xfUEVSRkNPVU5URVJfQlJPS0VOLCAwLCAwLCAwLCAwLCAtMSwgMCB9LAogCXsgS0dTTF9QRVJGQ09VTlRFUl9OT1RfVVNFRCwgMCwgMCwKQEAgLTI4MzYsNiArMjkwMCw0OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhNnh4X3BsYXRmb3JtX3NldHVwKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQoreworCXVpbnQ2NF90IGFkZHI7CisJc3RydWN0IGFkcmVub19ncHVkZXYgKmdwdWRldiA9IEFEUkVOT19HUFVfREVWSUNFKGFkcmVub19kZXYpOworCisJLyogQ2FsY3VsYXRlIFNQIGxvY2FsIGFuZCBwcml2YXRlIG1lbSBhZGRyZXNzZXMgKi8KKwlhZGRyID0gQUxJR04oQURSRU5PX1VDSEVfR01FTV9CQVNFICsgYWRyZW5vX2Rldi0+Z21lbV9zaXplLCBTWl82NEspOworCWFkcmVub19kZXYtPnNwX2xvY2FsX2dwdWFkZHIgPSBhZGRyOworCWFkcmVub19kZXYtPnNwX3B2dF9ncHVhZGRyID0gYWRkciArIFNaXzY0SzsKKworCWlmIChhZHJlbm9faGFzX2diaWYoYWRyZW5vX2RldikpIHsKKwkJYTZ4eF9wZXJmY291bnRlcl9ncm91cHNbS0dTTF9QRVJGQ09VTlRFUl9HUk9VUF9WQklGXS5yZWdzID0KKwkJCQlhNnh4X3BlcmZjb3VudGVyc19nYmlmOworCQlhNnh4X3BlcmZjb3VudGVyX2dyb3Vwc1tLR1NMX1BFUkZDT1VOVEVSX0dST1VQX1ZCSUZdLnJlZ19jb3VudAorCQkJCT0gQVJSQVlfU0laRShhNnh4X3BlcmZjb3VudGVyc19nYmlmKTsKKworCQlhNnh4X3BlcmZjb3VudGVyX2dyb3Vwc1tLR1NMX1BFUkZDT1VOVEVSX0dST1VQX1ZCSUZfUFdSXS5yZWdzID0KKwkJCQlhNnh4X3BlcmZjb3VudGVyc19nYmlmX3B3cjsKKwkJYTZ4eF9wZXJmY291bnRlcl9ncm91cHNbS0dTTF9QRVJGQ09VTlRFUl9HUk9VUF9WQklGXS5yZWdfY291bnQKKwkJCQk9IEFSUkFZX1NJWkUoYTZ4eF9wZXJmY291bnRlcnNfZ2JpZl9wd3IpOworCisJCWdwdWRldi0+dmJpZl94aW5faGFsdF9jdHJsMF9tYXNrID0KKwkJCQlBNlhYX0dCSUZfSEFMVF9NQVNLOworCX0gZWxzZQorCQlncHVkZXYtPnZiaWZfeGluX2hhbHRfY3RybDBfbWFzayA9CisJCQkJQTZYWF9WQklGX1hJTl9IQUxUX0NUUkwwX01BU0s7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBhNnh4X2NjdV9pbnZhbGlkYXRlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAorCXVuc2lnbmVkIGludCAqY21kcykKK3sKKwkvKiBDQ1VfSU5WQUxJREFURV9ERVBUSCAqLworCSpjbWRzKysgPSBjcF9wYWNrZXQoYWRyZW5vX2RldiwgQ1BfRVZFTlRfV1JJVEUsIDEpOworCSpjbWRzKysgPSAyNDsKKworCS8qIENDVV9JTlZBTElEQVRFX0NPTE9SICovCisJKmNtZHMrKyA9IGNwX3BhY2tldChhZHJlbm9fZGV2LCBDUF9FVkVOVF9XUklURSwgMSk7CisJKmNtZHMrKyA9IDI1OworCisJcmV0dXJuIDQ7Cit9CisKIC8qIFJlZ2lzdGVyIG9mZnNldCBkZWZpbmVzIGZvciBBNlhYLCBpbiBvcmRlciBvZiBlbnVtIGFkcmVub19yZWdzICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGE2eHhfcmVnaXN0ZXJfb2Zmc2V0c1tBRFJFTk9fUkVHX1JFR0lTVEVSX01BWF0gPSB7CiAKQEAgLTI4OTUsMTAgKzMwMDIsMTQgQEAKIAkJCQlBNlhYX1ZCSUZfWElOX0hBTFRfQ1RSTDApLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfVkJJRl9YSU5fSEFMVF9DVFJMMSwKIAkJCQlBNlhYX1ZCSUZfWElOX0hBTFRfQ1RSTDEpLAorCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfR0JJRl9IQUxULCBBNlhYX0dCSUZfSEFMVCksCisJQURSRU5PX1JFR19ERUZJTkUoQURSRU5PX1JFR19HQklGX0hBTFRfQUNLLCBBNlhYX0dCSUZfSEFMVF9BQ0spLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9BTFdBWVNPTl9DT1VOVEVSX0xPLAogCQkJCUE2WFhfR01VX0FMV0FZU19PTl9DT1VOVEVSX0wpLAogCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfUkJCTV9BTFdBWVNPTl9DT1VOVEVSX0hJLAogCQkJCUE2WFhfR01VX0FMV0FZU19PTl9DT1VOVEVSX0gpLAorCUFEUkVOT19SRUdfREVGSU5FKEFEUkVOT19SRUdfR01VX0FPX0FIQl9GRU5DRV9DVFJMLAorCQkJCUE2WFhfR01VX0FPX0FIQl9GRU5DRV9DVFJMKSwKIAlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX0dNVV9BT19JTlRFUlJVUFRfRU4sCiAJCQkJQTZYWF9HTVVfQU9fSU5URVJSVVBUX0VOKSwKIAlBRFJFTk9fUkVHX0RFRklORShBRFJFTk9fUkVHX0dNVV9BT19IT1NUX0lOVEVSUlVQVF9DTFIsCkBAIC0yOTU2LDYgKzMwNjcsNyBAQAogCS5yZWdfb2Zmc2V0cyA9ICZhNnh4X3JlZ19vZmZzZXRzLAogCS5zdGFydCA9IGE2eHhfc3RhcnQsCiAJLnNuYXBzaG90ID0gYTZ4eF9zbmFwc2hvdCwKKwkuc25hcHNob3RfZ211ID0gYTZ4eF9zbmFwc2hvdF9nbXUsCiAJLmlycSA9ICZhNnh4X2lycSwKIAkuc25hcHNob3RfZGF0YSA9ICZhNnh4X3NuYXBzaG90X2RhdGEsCiAJLmlycV90cmFjZSA9IHRyYWNlX2tnc2xfYTV4eF9pcnFfc3RhdHVzLApAQCAtMjk3OCw2ICszMDkwLDcgQEAKIAkuZ3B1X2tlZXBhbGl2ZSA9IGE2eHhfZ3B1X2tlZXBhbGl2ZSwKIAkucnBtaF9ncHVfcHdyY3RybCA9IGE2eHhfcnBtaF9ncHVfcHdyY3RybCwKIAkuaHdfaXNpZGxlID0gYTZ4eF9od19pc2lkbGUsIC8qIFJlcGxhY2VkIGJ5IE5VTEwgaWYgR01VIGlzIGRpc2FibGVkICovCisJLndhaXRfZm9yX2xvd2VzdF9pZGxlID0gYTZ4eF93YWl0X2Zvcl9sb3dlc3RfaWRsZSwKIAkud2FpdF9mb3JfZ211X2lkbGUgPSBhNnh4X3dhaXRfZm9yX2dtdV9pZGxlLAogCS5pb21tdV9mYXVsdF9ibG9jayA9IGE2eHhfaW9tbXVfZmF1bHRfYmxvY2ssCiAJLnJlc2V0ID0gYTZ4eF9yZXNldCwKQEAgLTI5ODYsOSArMzA5OSwxMCBAQAogCS5wcmVlbXB0aW9uX3Bvc3RfaWJzdWJtaXQgPSBhNnh4X3ByZWVtcHRpb25fcG9zdF9pYnN1Ym1pdCwKIAkucHJlZW1wdGlvbl9pbml0ID0gYTZ4eF9wcmVlbXB0aW9uX2luaXQsCiAJLnByZWVtcHRpb25fc2NoZWR1bGUgPSBhNnh4X3ByZWVtcHRpb25fc2NoZWR1bGUsCi0JLnByZWVtcHRpb25fc2V0X21hcmtlciA9IGE2eHhfcHJlZW1wdGlvbl9zZXRfbWFya2VyLAorCS5zZXRfbWFya2VyID0gYTZ4eF9zZXRfbWFya2VyLAogCS5wcmVlbXB0aW9uX2NvbnRleHRfaW5pdCA9IGE2eHhfcHJlZW1wdGlvbl9jb250ZXh0X2luaXQsCiAJLnByZWVtcHRpb25fY29udGV4dF9kZXN0cm95ID0gYTZ4eF9wcmVlbXB0aW9uX2NvbnRleHRfZGVzdHJveSwKIAkuZ3hfaXNfb24gPSBhNnh4X2d4X2lzX29uLAogCS5zcHRwcmFjX2lzX29uID0gYTZ4eF9zcHRwcmFjX2lzX29uLAorCS5jY3VfaW52YWxpZGF0ZSA9IGE2eHhfY2N1X2ludmFsaWRhdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4LmggYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E2eHguaAppbmRleCAwMjc0OGE2Li5kZDhhZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E2eHguaAorKysgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E2eHguaApAQCAtMTAwLDcgKzEwMCw3IEBACiAJCXN0cnVjdCBhZHJlbm9fcmluZ2J1ZmZlciAqcmIsCiAJCXVuc2lnbmVkIGludCAqY21kcywgc3RydWN0IGtnc2xfY29udGV4dCAqY29udGV4dCk7CiAKLXVuc2lnbmVkIGludCBhNnh4X3ByZWVtcHRpb25fc2V0X21hcmtlcih1bnNpZ25lZCBpbnQgKmNtZHMsIGludCBzdGFydCk7Cit1bnNpZ25lZCBpbnQgYTZ4eF9zZXRfbWFya2VyKHVuc2lnbmVkIGludCAqY21kcywgaW50IHN0YXJ0KTsKIAogdm9pZCBhNnh4X3ByZWVtcHRpb25fY2FsbGJhY2soc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsIGludCBiaXQpOwogCkBAIC0xMTAsNiArMTEwLDggQEAKIAogdm9pZCBhNnh4X3NuYXBzaG90KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAogCQlzdHJ1Y3Qga2dzbF9zbmFwc2hvdCAqc25hcHNob3QpOwordm9pZCBhNnh4X3NuYXBzaG90X2dtdShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiwKKwkJc3RydWN0IGtnc2xfc25hcHNob3QgKnNuYXBzaG90KTsKIAogdm9pZCBhNnh4X2NyYXNoZHVtcF9pbml0KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4X3ByZWVtcHQuYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTZ4eF9wcmVlbXB0LmMKaW5kZXggMDAzMjVlNS4uY2EwMTFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4X3ByZWVtcHQuYworKysgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2E2eHhfcHJlZW1wdC5jCkBAIC0yMDcsNyArMjA3LDExIEBACiAJdWludDY0X3QgdHRicjA7CiAJdW5zaWduZWQgaW50IGNvbnRleHRpZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBwcmVlbXB0X2xldmVsID0gMCwgdXNlc2dtZW0gPSAxLCBza2lwc2F2ZXJlc3RvcmUgPSAwOworCXVpbnQzMl90IHByZWVtcHRfbGV2ZWwsIHVzZXNnbWVtLCBza2lwc2F2ZXJlc3RvcmU7CisKKwlwcmVlbXB0X2xldmVsID0gYWRyZW5vX2Rldi0+cHJlZW1wdF9sZXZlbDsKKwl1c2VzZ21lbSA9IGFkcmVub19kZXYtPnVzZXNnbWVtOworCXNraXBzYXZlcmVzdG9yZSA9IGFkcmVub19kZXYtPnNraXBzYXZlcmVzdG9yZTsKIAogCS8qIFB1dCBvdXJzZWx2ZXMgaW50byBhIHBvc3NpYmxlIHRyaWdnZXIgc3RhdGUgKi8KIAlpZiAoIWFkcmVub19tb3ZlX3ByZWVtcHRfc3RhdGUoYWRyZW5vX2RldiwKQEAgLTM1Niw3ICszNjAsNyBAQAogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CiAKLQlpZiAoIWFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCisJaWYgKCFhZHJlbm9faXNfcHJlZW1wdGlvbl9leGVjdXRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmZGV2aWNlLT5tdXRleCk7CkBAIC0zNjksNyArMzczLDcgQEAKIAltdXRleF91bmxvY2soJmRldmljZS0+bXV0ZXgpOwogfQogCi11bnNpZ25lZCBpbnQgYTZ4eF9wcmVlbXB0aW9uX3NldF9tYXJrZXIodW5zaWduZWQgaW50ICpjbWRzLCBpbnQgc3RhcnQpCit1bnNpZ25lZCBpbnQgYTZ4eF9zZXRfbWFya2VyKHVuc2lnbmVkIGludCAqY21kcywgaW50IHN0YXJ0KQogewogCSpjbWRzKysgPSBjcF90eXBlN19wYWNrZXQoQ1BfU0VUX01BUktFUiwgMSk7CiAKQEAgLTQ0OSw3ICs0NTMsNyBAQAogCXN0cnVjdCBhZHJlbm9fcmluZ2J1ZmZlciAqcmI7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlpZiAoIWFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCisJaWYgKCFhZHJlbm9faXNfcHJlZW1wdGlvbl9leGVjdXRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJcmV0dXJuOwogCiAJLyogRm9yY2UgdGhlIHN0YXRlIHRvIGJlIGNsZWFyICovCkBAIC02MjcsMTAgKzYzMSwxMyBAQAogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gY29udGV4dC0+ZGV2aWNlOwogCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwogCi0JaWYgKCFhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQorCWlmICghYWRyZW5vX2lzX3ByZWVtcHRpb25fc2V0dXBfZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJcmV0dXJuOwogCiAJZ3B1bWVtX2ZyZWVfZW50cnkoY29udGV4dC0+dXNlcl9jdHh0X3JlY29yZCk7CisKKwkvKiBQdXQgdGhlIGV4dHJhIHJlZiBmcm9tIGdwdW1lbV9hbGxvY19lbnRyeSgpICovCisJa2dzbF9tZW1fZW50cnlfcHV0KGNvbnRleHQtPnVzZXJfY3R4dF9yZWNvcmQpOwogfQogCiBpbnQgYTZ4eF9wcmVlbXB0aW9uX2NvbnRleHRfaW5pdChzdHJ1Y3Qga2dzbF9jb250ZXh0ICpjb250ZXh0KQpAQCAtNjM4LDkgKzY0NSwxMyBAQAogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gY29udGV4dC0+ZGV2aWNlOwogCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwogCi0JaWYgKCFhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQorCWlmICghYWRyZW5vX2lzX3ByZWVtcHRpb25fc2V0dXBfZW5hYmxlZChhZHJlbm9fZGV2KSkKIAkJcmV0dXJuIDA7CiAKKwkvKgorCSAqIGdwdW1lbV9hbGxvY19lbnRyeSB0YWtlcyBhbiBleHRyYSByZWZjb3VudC4gUHV0IGl0IG9ubHkgd2hlbgorCSAqIGRlc3Ryb3lpbmcgdGhlIGNvbnRleHQgdG8ga2VlcCB0aGUgY29udGV4dCByZWNvcmQgdmFsaWQKKwkgKi8KIAljb250ZXh0LT51c2VyX2N0eHRfcmVjb3JkID0gZ3B1bWVtX2FsbG9jX2VudHJ5KGNvbnRleHQtPmRldl9wcml2LAogCQkJQTZYWF9DUF9DVFhSRUNPUkRfVVNFUl9SRVNUT1JFX1NJWkUsIDApOwogCWlmIChJU19FUlIoY29udGV4dC0+dXNlcl9jdHh0X3JlY29yZCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fYTZ4eF9zbmFwc2hvdC5jIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4X3NuYXBzaG90LmMKaW5kZXggODBjOWE2MS4uZTg2NWYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4X3NuYXBzaG90LmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19hNnh4X3NuYXBzaG90LmMKQEAgLTU1Nyw2ICs1NTcsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnczsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAJY29uc3Qgc3RydWN0IHNlbF9yZWcgKnNlbDsKKwl1aW50NjRfdCBvZmZzZXQ7CiB9IGE2eHhfcmVnX2xpc3RbXSA9IHsKIAl7IGE2eHhfcmVnaXN0ZXJzLCBBUlJBWV9TSVpFKGE2eHhfcmVnaXN0ZXJzKSAvIDIsIE5VTEwgfSwKIAl7IGE2eHhfcmJfcmFjX3JlZ2lzdGVycywgQVJSQVlfU0laRShhNnh4X3JiX3JhY19yZWdpc3RlcnMpIC8gMiwKQEAgLTU2OSw2NCArNTcwLDU2IEBACiAJKCgoX2EpWygyICogKF9pKSkgKyAxXSAtIChfYSlbMiAqIChfaSldKSArIDEpCiAKIHN0YXRpYyBzaXplX3QgYTZ4eF9sZWdhY3lfc25hcHNob3RfcmVnaXN0ZXJzKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLAotCQl1OCAqYnVmLCBzaXplX3QgcmVtYWluKQorCQl1OCAqYnVmLCBzaXplX3QgcmVtYWluLCBzdHJ1Y3QgcmVnX2xpc3QgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc2l6ZV90IHVzZWQgPSAwOworCXN0cnVjdCBrZ3NsX3NuYXBzaG90X3JlZ2lzdGVycyBzbmFwc2hvdF9yZWdzID0geworCQkucmVncyA9IHJlZ3MtPnJlZ3MsCisJCS5jb3VudCA9IHJlZ3MtPmNvdW50LAorCX07CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhNnh4X3JlZ19saXN0KTsgaSsrKSB7Ci0JCXN0cnVjdCByZWdfbGlzdCAqcmVncyA9ICZhNnh4X3JlZ19saXN0W2ldOwotCQlzdHJ1Y3Qga2dzbF9zbmFwc2hvdF9yZWdpc3RlcnMgc25hcHNob3RfcmVncyA9IHsKLQkJCS5yZWdzID0gcmVncy0+cmVncywKLQkJCS5jb3VudCA9IHJlZ3MtPmNvdW50LAotCQl9OworCWlmIChyZWdzLT5zZWwpCisJCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCByZWdzLT5zZWwtPmhvc3RfcmVnLCByZWdzLT5zZWwtPnZhbCk7CiAKLQkJaWYgKHJlZ3MtPnNlbCkKLQkJCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCByZWdzLT5zZWwtPmhvc3RfcmVnLAotCQkJCXJlZ3MtPnNlbC0+dmFsKTsKLQkJdXNlZCArPSBrZ3NsX3NuYXBzaG90X2R1bXBfcmVnaXN0ZXJzKGRldmljZSwgYnVmICsgdXNlZCwKLQkJCQkJCXJlbWFpbiAtIHVzZWQsICZzbmFwc2hvdF9yZWdzKTsKLQl9Ci0JcmV0dXJuIHVzZWQ7CisJcmV0dXJuIGtnc2xfc25hcHNob3RfZHVtcF9yZWdpc3RlcnMoZGV2aWNlLCBidWYsIHJlbWFpbiwKKwkJJnNuYXBzaG90X3JlZ3MpOwogfQogCiBzdGF0aWMgc2l6ZV90IGE2eHhfc25hcHNob3RfcmVnaXN0ZXJzKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLCB1OCAqYnVmLAogCQlzaXplX3QgcmVtYWluLCB2b2lkICpwcml2KQogewogCXN0cnVjdCBrZ3NsX3NuYXBzaG90X3JlZ3MgKmhlYWRlciA9IChzdHJ1Y3Qga2dzbF9zbmFwc2hvdF9yZWdzICopYnVmOworCXN0cnVjdCByZWdfbGlzdCAqcmVncyA9IChzdHJ1Y3QgcmVnX2xpc3QgKilwcml2OwogCXVuc2lnbmVkIGludCAqZGF0YSA9ICh1bnNpZ25lZCBpbnQgKikoYnVmICsgc2l6ZW9mKCpoZWFkZXIpKTsKLQl1bnNpZ25lZCBpbnQgKnNyYyA9ICh1bnNpZ25lZCBpbnQgKilhNnh4X2NyYXNoZHVtcF9yZWdpc3RlcnMuaG9zdHB0cjsKLQl1bnNpZ25lZCBpbnQgaSwgaiwgazsKKwl1bnNpZ25lZCBpbnQgKnNyYzsKKwl1bnNpZ25lZCBpbnQgaiwgazsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCiAJaWYgKGNyYXNoX2R1bXBfdmFsaWQgPT0gZmFsc2UpCi0JCXJldHVybiBhNnh4X2xlZ2FjeV9zbmFwc2hvdF9yZWdpc3RlcnMoZGV2aWNlLCBidWYsIHJlbWFpbik7CisJCXJldHVybiBhNnh4X2xlZ2FjeV9zbmFwc2hvdF9yZWdpc3RlcnMoZGV2aWNlLCBidWYsIHJlbWFpbiwKKwkJCXJlZ3MpOwogCiAJaWYgKHJlbWFpbiA8IHNpemVvZigqaGVhZGVyKSkgewogCQlTTkFQU0hPVF9FUlJfTk9NRU0oZGV2aWNlLCAiUkVHSVNURVJTIik7CiAJCXJldHVybiAwOwogCX0KIAorCXNyYyA9ICh1bnNpZ25lZCBpbnQgKikoYTZ4eF9jcmFzaGR1bXBfcmVnaXN0ZXJzLmhvc3RwdHIgKyByZWdzLT5vZmZzZXQpOwogCXJlbWFpbiAtPSBzaXplb2YoKmhlYWRlcik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhNnh4X3JlZ19saXN0KTsgaSsrKSB7Ci0JCXN0cnVjdCByZWdfbGlzdCAqcmVncyA9ICZhNnh4X3JlZ19saXN0W2ldOworCWZvciAoaiA9IDA7IGogPCByZWdzLT5jb3VudDsgaisrKSB7CisJCXVuc2lnbmVkIGludCBzdGFydCA9IHJlZ3MtPnJlZ3NbMiAqIGpdOworCQl1bnNpZ25lZCBpbnQgZW5kID0gcmVncy0+cmVnc1soMiAqIGopICsgMV07CiAKLQkJZm9yIChqID0gMDsgaiA8IHJlZ3MtPmNvdW50OyBqKyspIHsKLQkJCXVuc2lnbmVkIGludCBzdGFydCA9IHJlZ3MtPnJlZ3NbMiAqIGpdOwotCQkJdW5zaWduZWQgaW50IGVuZCA9IHJlZ3MtPnJlZ3NbKDIgKiBqKSArIDFdOworCQlpZiAocmVtYWluIDwgKChlbmQgLSBzdGFydCkgKyAxKSAqIDgpIHsKKwkJCVNOQVBTSE9UX0VSUl9OT01FTShkZXZpY2UsICJSRUdJU1RFUlMiKTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJCWlmIChyZW1haW4gPCAoKGVuZCAtIHN0YXJ0KSArIDEpICogOCkgewotCQkJCVNOQVBTSE9UX0VSUl9OT01FTShkZXZpY2UsICJSRUdJU1RFUlMiKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KKwkJcmVtYWluIC09ICgoZW5kIC0gc3RhcnQpICsgMSkgKiA4OwogCi0JCQlyZW1haW4gLT0gKChlbmQgLSBzdGFydCkgKyAxKSAqIDg7Ci0KLQkJCWZvciAoayA9IHN0YXJ0OyBrIDw9IGVuZDsgaysrLCBjb3VudCsrKSB7Ci0JCQkJKmRhdGErKyA9IGs7Ci0JCQkJKmRhdGErKyA9ICpzcmMrKzsKLQkJCX0KKwkJZm9yIChrID0gc3RhcnQ7IGsgPD0gZW5kOyBrKyssIGNvdW50KyspIHsKKwkJCSpkYXRhKysgPSBrOworCQkJKmRhdGErKyA9ICpzcmMrKzsKIAkJfQogCX0KIApAQCAtMTM2Niw2ICsxMzU5LDcgQEAKIAkJc3RydWN0IGtnc2xfc25hcHNob3QgKnNuYXBzaG90KQogewogCWludCBpOworCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX0RFVklDRShkZXZpY2UpOwogCiAJa2dzbF9yZWd3cml0ZShkZXZpY2UsIEE2WFhfREJHQ19DRkdfREJHQlVTX0NOVExULAogCQkoMHhmIDw8IEE2WFhfREJHQ19DRkdfREJHQlVTX0NOVExUX1NFR1RfU0hJRlQpIHwKQEAgLTE0NTYsOSArMTQ1MCwxMiBAQAogCQkJKHZvaWQgKikgJmE2eHhfZGJnY19kZWJ1Z2J1c19ibG9ja3NbaV0pOwogCX0KIAotCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLCBLR1NMX1NOQVBTSE9UX1NFQ1RJT05fREVCVUdCVVMsCi0JCQlzbmFwc2hvdCwgYTZ4eF9zbmFwc2hvdF92YmlmX2RlYnVnYnVzX2Jsb2NrLAotCQkJKHZvaWQgKikgJmE2eHhfdmJpZl9kZWJ1Z2J1c19ibG9ja3MpOworCS8qIFNraXAgaWYgR1BVIGhhcyBHQklGICovCisJaWYgKCFhZHJlbm9faGFzX2diaWYoYWRyZW5vX2RldikpCisJCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLAorCQkJCUtHU0xfU05BUFNIT1RfU0VDVElPTl9ERUJVR0JVUywKKwkJCQlzbmFwc2hvdCwgYTZ4eF9zbmFwc2hvdF92YmlmX2RlYnVnYnVzX2Jsb2NrLAorCQkJCSh2b2lkICopICZhNnh4X3ZiaWZfZGVidWdidXNfYmxvY2tzKTsKIAogCWlmIChhNnh4X2N4X2RiZ2MpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9jeF9kYmdjX2RlYnVnYnVzX2Jsb2Nrcyk7IGkrKykgewpAQCAtMTQ3MSwxMCArMTQ2OCwxOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYTZ4eF9zbmFwc2hvdF9nbXUoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsCisvKgorICogYTZ4eF9zbmFwc2hvdF9nbXUoKSAtIEE2WFggR01VIHNuYXBzaG90IGZ1bmN0aW9uCisgKiBAYWRyZW5vX2RldjogRGV2aWNlIGJlaW5nIHNuYXBzaG90dGVkCisgKiBAc25hcHNob3Q6IFBvaW50ZXIgdG8gdGhlIHNuYXBzaG90IGluc3RhbmNlCisgKgorICogVGhpcyBpcyB3aGVyZSBhbGwgb2YgdGhlIEE2WFggR01VIHNwZWNpZmljIGJpdHMgYW5kIHBpZWNlcyBhcmUgZ3JhYmJlZAorICogaW50byB0aGUgc25hcHNob3QgbWVtb3J5CisgKi8KK3ZvaWQgYTZ4eF9zbmFwc2hvdF9nbXUoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsCiAJCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdCkKIHsKLQlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiA9IEFEUkVOT19ERVZJQ0UoZGV2aWNlKTsKKwlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOwogCXN0cnVjdCBhZHJlbm9fZ3B1ZGV2ICpncHVkZXYgPSBBRFJFTk9fR1BVX0RFVklDRShhZHJlbm9fZGV2KTsKIAogCWlmICgha2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkpCkBAIC0xNTE5LDYgKzE1MjQsOCBAQAogCiAJY3Jhc2hfZHVtcF92YWxpZCA9IGZhbHNlOwogCisJaWYgKCFkZXZpY2UtPnNuYXBzaG90X2NyYXNoZHVtcGVyKQorCQlyZXR1cm47CiAJaWYgKGE2eHhfY2FwdHVyZXNjcmlwdC5ncHVhZGRyID09IDAgfHwKIAkJYTZ4eF9jcmFzaGR1bXBfcmVnaXN0ZXJzLmdwdWFkZHIgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMTU3MCwzMyArMTU3NywzOCBAQAogCXN0cnVjdCBhZHJlbm9fZ3B1ZGV2ICpncHVkZXYgPSBBRFJFTk9fR1BVX0RFVklDRShhZHJlbm9fZGV2KTsKIAlzdHJ1Y3QgYWRyZW5vX3NuYXBzaG90X2RhdGEgKnNuYXBfZGF0YSA9IGdwdWRldi0+c25hcHNob3RfZGF0YTsKIAlib29sIHNwdHByYWNfb247CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGZlbmNlIGlzIGluIEFMTE9XIG1vZGUgc28gcmVnaXN0ZXJzIGNhbiBiZSByZWFkICovCisJa2dzbF9yZWd3cml0ZShkZXZpY2UsIEE2WFhfR01VX0FPX0FIQl9GRU5DRV9DVFJMLCAwKTsKIAogCS8qIEdNVSBUQ00gZGF0YSBkdW1wZWQgdGhyb3VnaCBBSEIgKi8KLQlhNnh4X3NuYXBzaG90X2dtdShkZXZpY2UsIHNuYXBzaG90KTsKKwlhNnh4X3NuYXBzaG90X2dtdShhZHJlbm9fZGV2LCBzbmFwc2hvdCk7CiAKIAlzcHRwcmFjX29uID0gZ3B1ZGV2LT5zcHRwcmFjX2lzX29uKGFkcmVub19kZXYpOwogCiAJLyogUmV0dXJuIGlmIHRoZSBHWCBpcyBvZmYgKi8KLQlpZiAoIWdwdWRldi0+Z3hfaXNfb24oYWRyZW5vX2RldikpIHsKLQkJcHJfZXJyKCJHWCBpcyBvZmYuIE9ubHkgZHVtcGluZyBHTVUgZGF0YSBpbiBzbmFwc2hvdFxuIik7CisJaWYgKCFncHVkZXYtPmd4X2lzX29uKGFkcmVub19kZXYpKQogCQlyZXR1cm47Ci0JfQogCiAJLyogRHVtcCB0aGUgcmVnaXN0ZXJzIHdoaWNoIGdldCBhZmZlY3RlZCBieSBjcmFzaCBkdW1wZXIgdHJpZ2dlciAqLwogCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLCBLR1NMX1NOQVBTSE9UX1NFQ1RJT05fUkVHUywKIAkJc25hcHNob3QsIGE2eHhfc25hcHNob3RfcHJlX2NyYXNoZHVtcF9yZWdzLCBOVUxMKTsKIAogCS8qIER1bXAgdmJpZiByZWdpc3RlcnMgYXMgd2VsbCB3aGljaCBnZXQgYWZmZWN0ZWQgYnkgY3Jhc2ggZHVtcGVyICovCi0JYWRyZW5vX3NuYXBzaG90X3ZiaWZfcmVnaXN0ZXJzKGRldmljZSwgc25hcHNob3QsCi0JCWE2eHhfdmJpZl9zbmFwc2hvdF9yZWdpc3RlcnMsCi0JCUFSUkFZX1NJWkUoYTZ4eF92YmlmX3NuYXBzaG90X3JlZ2lzdGVycykpOworCWlmICghYWRyZW5vX2hhc19nYmlmKGFkcmVub19kZXYpKQorCQlhZHJlbm9fc25hcHNob3RfdmJpZl9yZWdpc3RlcnMoZGV2aWNlLCBzbmFwc2hvdCwKKwkJCWE2eHhfdmJpZl9zbmFwc2hvdF9yZWdpc3RlcnMsCisJCQlBUlJBWV9TSVpFKGE2eHhfdmJpZl9zbmFwc2hvdF9yZWdpc3RlcnMpKTsKIAogCS8qIFRyeSB0byBydW4gdGhlIGNyYXNoIGR1bXBlciAqLwogCWlmIChzcHRwcmFjX29uKQogCQlfYTZ4eF9kb19jcmFzaGR1bXAoZGV2aWNlKTsKIAotCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLCBLR1NMX1NOQVBTSE9UX1NFQ1RJT05fUkVHUywKLQkJc25hcHNob3QsIGE2eHhfc25hcHNob3RfcmVnaXN0ZXJzLCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhNnh4X3JlZ19saXN0KTsgaSsrKSB7CisJCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLCBLR1NMX1NOQVBTSE9UX1NFQ1RJT05fUkVHUywKKwkJCXNuYXBzaG90LCBhNnh4X3NuYXBzaG90X3JlZ2lzdGVycywgJmE2eHhfcmVnX2xpc3RbaV0pOworCX0KIAogCS8qIENQX1NRRSBpbmRleGVkIHJlZ2lzdGVycyAqLwogCWtnc2xfc25hcHNob3RfaW5kZXhlZF9yZWdpc3RlcnMoZGV2aWNlLCBzbmFwc2hvdCwKQEAgLTE5MjAsNiArMTkzMiw4IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYTZ4eF9yZWdfbGlzdCk7IGkrKykgewogCQlzdHJ1Y3QgcmVnX2xpc3QgKnJlZ3MgPSAmYTZ4eF9yZWdfbGlzdFtpXTsKIAorCQlyZWdzLT5vZmZzZXQgPSBvZmZzZXQ7CisKIAkJLyogUHJvZ3JhbSB0aGUgU0VMX0NOVExfQ0QgcmVnaXN0ZXIgYXBwcm9wcmlhdGVseSAqLwogCQlpZiAocmVncy0+c2VsKSB7CiAJCQkqcHRyKysgPSByZWdzLT5zZWwtPnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fZGlzcGF0Y2guYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fZGlzcGF0Y2guYwppbmRleCA4ZmQ4Yjg4Li5jYjQyYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2Rpc3BhdGNoLmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19kaXNwYXRjaC5jCkBAIC0yMDQ2LDcgKzIwNDYsNyBAQAogCWtmcmVlKHJlcGxheSk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX2hlYWRlcl9hbmRfc25hcHNob3Qoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsCitzdGF0aWMgdm9pZCBkb19oZWFkZXJfYW5kX3NuYXBzaG90KHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLCBpbnQgZmF1bHQsCiAJCXN0cnVjdCBhZHJlbm9fcmluZ2J1ZmZlciAqcmIsIHN0cnVjdCBrZ3NsX2RyYXdvYmpfY21kICpjbWRvYmopCiB7CiAJc3RydWN0IGtnc2xfZHJhd29iaiAqZHJhd29iaiA9IERSQVdPQkooY21kb2JqKTsKQEAgLTIwNTQsNyArMjA1NCw3IEBACiAJLyogQWx3YXlzIGR1bXAgdGhlIHNuYXBzaG90IG9uIGEgbm9uLWRyYXdvYmogZmFpbHVyZSAqLwogCWlmIChjbWRvYmogPT0gTlVMTCkgewogCQlhZHJlbm9fZmF1bHRfaGVhZGVyKGRldmljZSwgcmIsIE5VTEwpOwotCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIE5VTEwpOworCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIE5VTEwsIGZhdWx0ICYgQURSRU5PX0dNVV9GQVVMVCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIwNjYsNyArMjA2Niw4IEBACiAJYWRyZW5vX2ZhdWx0X2hlYWRlcihkZXZpY2UsIHJiLCBjbWRvYmopOwogCiAJaWYgKCEoZHJhd29iai0+Y29udGV4dC0+ZmxhZ3MgJiBLR1NMX0NPTlRFWFRfTk9fU05BUFNIT1QpKQotCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIGRyYXdvYmotPmNvbnRleHQpOworCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIGRyYXdvYmotPmNvbnRleHQsCisJCQkJCWZhdWx0ICYgQURSRU5PX0dNVV9GQVVMVCk7CiB9CiAKIHN0YXRpYyBpbnQgZGlzcGF0Y2hlcl9kb19mYXVsdChzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldikKQEAgLTIwNzgsNyArMjA3OSw3IEBACiAJc3RydWN0IGFkcmVub19yaW5nYnVmZmVyICpyYjsKIAlzdHJ1Y3QgYWRyZW5vX3JpbmdidWZmZXIgKmh1bmdfcmIgPSBOVUxMOwogCXVuc2lnbmVkIGludCByZWc7Ci0JdWludDY0X3QgYmFzZTsKKwl1aW50NjRfdCBiYXNlID0gMDsKIAlzdHJ1Y3Qga2dzbF9kcmF3b2JqX2NtZCAqY21kb2JqID0gTlVMTDsKIAlpbnQgcmV0LCBpOwogCWludCBmYXVsdDsKQEAgLTIxMzksNyArMjE0MCw3IEBACiAJICogRGVsZXRpbmcgdW5pbml0aWFsaXplZCB0aW1lciB3aWxsIGJsb2NrIGZvciBldmVyIG9uIGtlcm5lbCBkZWJ1ZwogCSAqIGRpc2FibGUgYnVpbGQuIEhlbmNlIHNraXAgZGVsIHRpbWVyIGlmIGl0IGlzIG5vdCBpbml0aWFsaXplZC4KIAkgKi8KLQlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKKwlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCiAJCWRlbF90aW1lcl9zeW5jKCZhZHJlbm9fZGV2LT5wcmVlbXB0LnRpbWVyKTsKIAogCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOwpAQCAtMjE5Miw3ICsyMTkzLDcgQEAKIAkJYWRyZW5vX3JlYWRyZWc2NChhZHJlbm9fZGV2LCBBRFJFTk9fUkVHX0NQX0lCMV9CQVNFLAogCQkJQURSRU5PX1JFR19DUF9JQjFfQkFTRV9ISSwgJmJhc2UpOwogCi0JZG9faGVhZGVyX2FuZF9zbmFwc2hvdChkZXZpY2UsIGh1bmdfcmIsIGNtZG9iaik7CisJZG9faGVhZGVyX2FuZF9zbmFwc2hvdChkZXZpY2UsIGZhdWx0LCBodW5nX3JiLCBjbWRvYmopOwogCiAJLyogVHVybiBvZmYgdGhlIEtFRVBBTElWRSB2b3RlIGZyb20gdGhlIElTUiBmb3IgaGFyZCBmYXVsdCAqLwogCWlmIChncHVkZXYtPmdwdV9rZWVwYWxpdmUgJiYgZmF1bHQgJiBBRFJFTk9fSEFSRF9GQVVMVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fZHJhd2N0eHQuYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fZHJhd2N0eHQuYwppbmRleCAwODgyNDQ3Li4yNjE1ZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2RyYXdjdHh0LmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19kcmF3Y3R4dC5jCkBAIC01MzMsNyArNTMzLDggQEAKIAkJCQlkcmF3Y3R4dC0+aW50ZXJuYWxfdGltZXN0YW1wLAogCQkJCWRyYXdjdHh0LT50eXBlLCByZXQpOwogCQlkZXZpY2UtPmZvcmNlX3BhbmljID0gMTsKLQkJa2dzbF9kZXZpY2Vfc25hcHNob3QoZGV2aWNlLCBjb250ZXh0KTsKKwkJa2dzbF9kZXZpY2Vfc25hcHNob3QoZGV2aWNlLCBjb250ZXh0LAorCQkJCWFkcmVub19nbXVfZ3B1X2ZhdWx0KGFkcmVub19kZXYpKTsKIAl9CiAKIAlrZ3NsX3NoYXJlZG1lbV93cml0ZWwoZGV2aWNlLCAmZGV2aWNlLT5tZW1zdG9yZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9faW9jdGwuYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9faW9jdGwuYwppbmRleCA3YzdiZmE1Li44YjI4M2FlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX2lvY3RsLmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19pb2N0bC5jCkBAIC05Niw3ICs5Niw3IEBACiAJaW50IGxldmVsc190b19jb3B5OwogCiAJaWYgKCFhZHJlbm9faXNfYTV4eChhZHJlbm9fZGV2KSB8fAotCQkhYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkKKwkJIWFkcmVub19pc19wcmVlbXB0aW9uX2V4ZWN1dGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAocmVhZC0+c2l6ZV91c2VyIDwgc2l6ZV9sZXZlbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fcGVyZmNvdW50ZXIuYyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fcGVyZmNvdW50ZXIuYwppbmRleCAwZGE0ZGE5Li45ZWE4MDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3BlcmZjb3VudGVyLmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19wZXJmY291bnRlci5jCkBAIC0yOCw2ICsyOCwyMCBAQAogLyogb2Zmc2V0IG9mIGVuYWJsZSByZWdpc3RlciBmcm9tIHNlbGVjdCByZWdpc3RlciAqLwogI2RlZmluZSBWQklGMl9QRVJGX0VOX1JFR19TRUxfT0ZGIDE2CiAKKy8qIG9mZnNldCBvZiBjbGVhciByZWdpc3RlciBmcm9tIHNlbGVjdCByZWdpc3RlciBmb3IgR0JJRiAqLworI2RlZmluZSBHQklGX1BFUkZfQ0xSX1JFR19TRUxfT0ZGIDEKKworLyogb2Zmc2V0IG9mIGVuYWJsZSByZWdpc3RlciBmcm9tIHNlbGVjdCByZWdpc3RlciBmb3IgR0JJRiovCisjZGVmaW5lIEdCSUZfUEVSRl9FTl9SRUdfU0VMX09GRiAgMgorCisvKiBvZmZzZXQgb2YgY2xlYXIgcmVnaXN0ZXIgZnJvbSB0aGUgcG93ZXIgZW5hYmxlIHJlZ2lzdGVyIGZvciBHQklGKi8KKyNkZWZpbmUgR0JJRl9QV1JfQ0xSX1JFR19FTl9PRkYgICAgMQorCisvKiAqLworI2RlZmluZSBHQklGX1BFUkZfUk1XX01BU0sgICAweEZGCisvKiAqLworI2RlZmluZSBHQklGX1BXUl9STVdfTUFTSyAgICAweDEwMDAwCisKIC8qIG9mZnNldCBvZiBjbGVhciByZWdpc3RlciBmcm9tIHRoZSBlbmFibGUgcmVnaXN0ZXIgKi8KICNkZWZpbmUgVkJJRjJfUEVSRl9QV1JfQ0xSX1JFR19FTl9PRkYgOAogCkBAIC0xNjAsMTAgKzE3NCwxNSBAQAogCXN0cnVjdCBhZHJlbm9fcGVyZmNvdW50ZXJzICpjb3VudGVycyA9IEFEUkVOT19QRVJGQ09VTlRFUlMoYWRyZW5vX2Rldik7CiAJc3RydWN0IGFkcmVub19wZXJmY291bnRfZ3JvdXAgKmdyb3VwOwogCXVuc2lnbmVkIGludCBjb3VudGVyLCBncm91cGlkOworCWludCByZXQ7CiAKIAlpZiAoY291bnRlcnMgPT0gTlVMTCkKIAkJcmV0dXJuOwogCisJcmV0ID0gYWRyZW5vX3BlcmZjbnRyX2FjdGl2ZV9vb2JfZ2V0KGFkcmVub19kZXYpOworCWlmIChyZXQpCisJCXJldHVybjsKKwogCWZvciAoZ3JvdXBpZCA9IDA7IGdyb3VwaWQgPCBjb3VudGVycy0+Z3JvdXBfY291bnQ7IGdyb3VwaWQrKykgewogCQlncm91cCA9ICYoY291bnRlcnMtPmdyb3Vwc1tncm91cGlkXSk7CiAKQEAgLTE4Myw2ICsyMDIsOCBAQAogCQkJCQkJCQljb3VudGVyKTsKIAkJfQogCX0KKworCWFkcmVub19wZXJmY250cl9hY3RpdmVfb29iX3B1dChhZHJlbm9fZGV2KTsKIH0KIAogc3RhdGljIGludCBhZHJlbm9fcGVyZmNvdW50ZXJfZW5hYmxlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LApAQCAtNjEyLDE0ICs2MzMsNDEgQEAKIHsKIAlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOwogCXN0cnVjdCBhZHJlbm9fcGVyZmNvdW50X3JlZ2lzdGVyICpyZWc7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gY291bnRlciA8PCAzOwogCiAJcmVnID0gJmNvdW50ZXJzLT5ncm91cHNbS0dTTF9QRVJGQ09VTlRFUl9HUk9VUF9WQklGXS5yZWdzW2NvdW50ZXJdOwotCS8qIFdyaXRlIDEsIGZvbGxvd2VkIGJ5IDAgdG8gQ0xSIHJlZ2lzdGVyIGZvciBjbGVhcmluZyB0aGUgY291bnRlciAqLwotCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCByZWctPnNlbGVjdCAtIFZCSUYyX1BFUkZfQ0xSX1JFR19TRUxfT0ZGLCAxKTsKLQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwgcmVnLT5zZWxlY3QgLSBWQklGMl9QRVJGX0NMUl9SRUdfU0VMX09GRiwgMCk7Ci0Ja2dzbF9yZWd3cml0ZShkZXZpY2UsIHJlZy0+c2VsZWN0LCBjb3VudGFibGUgJiBWQklGMl9QRVJGX0NOVF9TRUxfTUFTSyk7Ci0JLyogZW5hYmxlIHJlZyBpcyA4IERXT1JEUyBiZWZvcmUgc2VsZWN0IHJlZyAqLwotCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCByZWctPnNlbGVjdCAtIFZCSUYyX1BFUkZfRU5fUkVHX1NFTF9PRkYsIDEpOworCisJaWYgKGFkcmVub19oYXNfZ2JpZihhZHJlbm9fZGV2KSkgeworCQkvKgorCQkgKiBXcml0ZSAxLCBmb2xsb3dlZCBieSAwIHRvIENMUiByZWdpc3RlciBmb3IKKwkJICogY2xlYXJpbmcgdGhlIGNvdW50ZXIKKwkJICovCisJCWtnc2xfcmVncm13KGRldmljZSwgcmVnLT5zZWxlY3QgLSBHQklGX1BFUkZfQ0xSX1JFR19TRUxfT0ZGLAorCQkJMSA8PCBjb3VudGVyLCAxKTsKKwkJa2dzbF9yZWdybXcoZGV2aWNlLCByZWctPnNlbGVjdCAtIEdCSUZfUEVSRl9DTFJfUkVHX1NFTF9PRkYsCisJCQkxIDw8IGNvdW50ZXIsIDApOworCQkvKiBzZWxlY3QgdGhlIGRlc2lyZWQgY291bnRhYmxlICovCisJCWtnc2xfcmVncm13KGRldmljZSwgcmVnLT5zZWxlY3QsCisJCQlHQklGX1BFUkZfUk1XX01BU0sgPDwgc2hpZnQsIGNvdW50YWJsZSA8PCBzaGlmdCk7CisJCS8qIGVuYWJsZSBjb3VudGVyICovCisJCWtnc2xfcmVncm13KGRldmljZSwgcmVnLT5zZWxlY3QgLSBHQklGX1BFUkZfRU5fUkVHX1NFTF9PRkYsCisJCQkxIDw8IGNvdW50ZXIsIDEpOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogV3JpdGUgMSwgZm9sbG93ZWQgYnkgMCB0byBDTFIgcmVnaXN0ZXIgZm9yCisJCSAqIGNsZWFyaW5nIHRoZSBjb3VudGVyCisJCSAqLworCQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwKKwkJCXJlZy0+c2VsZWN0IC0gVkJJRjJfUEVSRl9DTFJfUkVHX1NFTF9PRkYsIDEpOworCQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwKKwkJCXJlZy0+c2VsZWN0IC0gVkJJRjJfUEVSRl9DTFJfUkVHX1NFTF9PRkYsIDApOworCQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwKKwkJCXJlZy0+c2VsZWN0LCBjb3VudGFibGUgJiBWQklGMl9QRVJGX0NOVF9TRUxfTUFTSyk7CisJCS8qIGVuYWJsZSByZWcgaXMgOCBEV09SRFMgYmVmb3JlIHNlbGVjdCByZWcgKi8KKwkJa2dzbF9yZWd3cml0ZShkZXZpY2UsCisJCQlyZWctPnNlbGVjdCAtIFZCSUYyX1BFUkZfRU5fUkVHX1NFTF9PRkYsIDEpOworCX0KIAlyZWctPnZhbHVlID0gMDsKIH0KIApAQCAtNjMwLDEwICs2NzgsMzAgQEAKIAlzdHJ1Y3QgYWRyZW5vX3BlcmZjb3VudF9yZWdpc3RlciAqcmVnOwogCiAJcmVnID0gJmNvdW50ZXJzLT5ncm91cHNbS0dTTF9QRVJGQ09VTlRFUl9HUk9VUF9WQklGX1BXUl0ucmVnc1tjb3VudGVyXTsKLQkvKiBXcml0ZSAxLCBmb2xsb3dlZCBieSAwIHRvIENMUiByZWdpc3RlciBmb3IgY2xlYXJpbmcgdGhlIGNvdW50ZXIgKi8KLQlrZ3NsX3JlZ3dyaXRlKGRldmljZSwgcmVnLT5zZWxlY3QgKyBWQklGMl9QRVJGX1BXUl9DTFJfUkVHX0VOX09GRiwgMSk7Ci0Ja2dzbF9yZWd3cml0ZShkZXZpY2UsIHJlZy0+c2VsZWN0ICsgVkJJRjJfUEVSRl9QV1JfQ0xSX1JFR19FTl9PRkYsIDApOwotCWtnc2xfcmVnd3JpdGUoZGV2aWNlLCByZWctPnNlbGVjdCwgMSk7CisKKwlpZiAoYWRyZW5vX2hhc19nYmlmKGFkcmVub19kZXYpKSB7CisJCS8qCisJCSAqIFdyaXRlIDEsIGZvbGxvd2VkIGJ5IDAgdG8gQ0xSIHJlZ2lzdGVyIGZvcgorCQkgKiBjbGVhcmluZyB0aGUgY291bnRlcgorCQkgKi8KKwkJa2dzbF9yZWdybXcoZGV2aWNlLCByZWctPnNlbGVjdCArIEdCSUZfUFdSX0NMUl9SRUdfRU5fT0ZGLAorCQkJR0JJRl9QV1JfUk1XX01BU0sgPDwgY291bnRlciwgMSk7CisJCWtnc2xfcmVncm13KGRldmljZSwgcmVnLT5zZWxlY3QgKyBHQklGX1BXUl9DTFJfUkVHX0VOX09GRiwKKwkJCUdCSUZfUFdSX1JNV19NQVNLIDw8IGNvdW50ZXIsIDApOworCQkvKiBFbmFibGUgdGhlIGNvdW50ZXIgKi8KKwkJa2dzbF9yZWdybXcoZGV2aWNlLCByZWctPnNlbGVjdCwKKwkJCUdCSUZfUFdSX1JNV19NQVNLIDw8IGNvdW50ZXIsIDEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdyaXRlIDEsIGZvbGxvd2VkIGJ5IDAgdG8gQ0xSIHJlZ2lzdGVyIGZvcgorCQkgKiBjbGVhcmluZyB0aGUgY291bnRlcgorCQkgKi8KKwkJa2dzbF9yZWd3cml0ZShkZXZpY2UsIHJlZy0+c2VsZWN0ICsKKwkJCVZCSUYyX1BFUkZfUFdSX0NMUl9SRUdfRU5fT0ZGLCAxKTsKKwkJa2dzbF9yZWd3cml0ZShkZXZpY2UsIHJlZy0+c2VsZWN0ICsKKwkJCVZCSUYyX1BFUkZfUFdSX0NMUl9SRUdfRU5fT0ZGLCAwKTsKKwkJa2dzbF9yZWd3cml0ZShkZXZpY2UsIHJlZy0+c2VsZWN0LCAxKTsKKwl9CiAJcmVnLT52YWx1ZSA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19yaW5nYnVmZmVyLmMKaW5kZXggMTVjNjhmYi4uZDI0ODQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19yaW5nYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub19yaW5nYnVmZmVyLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJhZHJlbm9faW9tbXUuaCIKICNpbmNsdWRlICJhZHJlbm9fcG00dHlwZXMuaCIKICNpbmNsdWRlICJhZHJlbm9fcmluZ2J1ZmZlci5oIgorI2luY2x1ZGUgImFkcmVub190cmFjZS5oIgogCiAjaW5jbHVkZSAiYTN4eF9yZWcuaCIKICNpbmNsdWRlICJhZHJlbm9fYTV4eC5oIgpAQCAtMzcsNiArMzgsNyBAQAogCSgoX3JiKS0+YnVmZmVyX2Rlc2MuZ3B1YWRkciArICgoX3BvcykgKiBzaXplb2YodW5zaWduZWQgaW50KSkpCiAKIHN0YXRpYyB2b2lkIGFkcmVub19nZXRfc3VibWl0X3RpbWUoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsCisJCXN0cnVjdCBhZHJlbm9fcmluZ2J1ZmZlciAqcmIsCiAJCXN0cnVjdCBhZHJlbm9fc3VibWl0X3RpbWUgKnRpbWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY2LDYgKzY4LDkgQEAKIAl9IGVsc2UKIAkJdGltZS0+dGlja3MgPSAwOwogCisJLyogVHJhY2UgdGhlIEdQVSB0aW1lIHRvIGNyZWF0ZSBhIG1hcHBpbmcgdG8gZnRyYWNlIHRpbWUgKi8KKwl0cmFjZV9hZHJlbm9fY21kYmF0Y2hfc3luYyhyYi0+ZHJhd2N0eHRfYWN0aXZlLCB0aW1lLT50aWNrcyk7CisKIAkvKiBHZXQgdGhlIGtlcm5lbCBjbG9jayBmb3IgdGltZSBzaW5jZSBib290ICovCiAJdGltZS0+a3RpbWUgPSBsb2NhbF9jbG9jaygpOwogCkBAIC03OCwxMCArODMsMTIgQEAKIC8qCiAgKiBXYWl0IHRpbWUgYmVmb3JlIHRyeWluZyB0byB3cml0ZSB0aGUgcmVnaXN0ZXIgYWdhaW4uCiAgKiBIb3BlZnVsbHkgdGhlIEdNVSBoYXMgZmluaXNoZWQgd2FraW5nIHVwIGR1cmluZyB0aGlzIGRlbGF5LgorICogVGhpcyBkZWxheSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgSUZQQyBtYWluIGh5c3RlcmVzaXMgb3IKKyAqIHRoZSBHTVUgd2lsbCBzdGFydCBzaHV0dGluZyBkb3duIGJlZm9yZSB3ZSB0cnkgYWdhaW4uCiAgKi8KLSNkZWZpbmUgR01VX1dBS0VVUF9ERUxBWSA1MAorI2RlZmluZSBHTVVfV0FLRVVQX0RFTEFZIDIwCiAvKiBNYXggYW1vdW50IG9mIHRyaWVzIHRvIHdha2UgdXAgdGhlIEdNVS4gKi8KLSNkZWZpbmUgR01VX1dBS0VVUF9SRVRSWV9NQVggMjAKKyNkZWZpbmUgR01VX1dBS0VVUF9SRVRSWV9NQVggNjAKIAogLyoKICAqIENoZWNrIHRoZSBXUklURURST1BQRUQwIGJpdCBpbiB0aGUKQEAgLTE0OCw3ICsxNTUsNyBAQAogCXN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2ID0gQURSRU5PX1JCX0RFVklDRShyYik7CiAKIAlpZiAodGltZSAhPSBOVUxMKQotCQlhZHJlbm9fZ2V0X3N1Ym1pdF90aW1lKGFkcmVub19kZXYsIHRpbWUpOworCQlhZHJlbm9fZ2V0X3N1Ym1pdF90aW1lKGFkcmVub19kZXYsIHJiLCB0aW1lKTsKIAogCWFkcmVub19yaW5nYnVmZmVyX3dwdHIoYWRyZW5vX2RldiwgcmIpOwogfQpAQCAtMjg0LDcgKzI5MSw3IEBACiAJc3RydWN0IGFkcmVub19ncHVkZXYgKmdwdWRldiA9IEFEUkVOT19HUFVfREVWSUNFKGFkcmVub19kZXYpOwogCWludCBpOwogCi0JaWYgKG5vcHJlZW1wdCA9PSBmYWxzZSAmJiBBRFJFTk9fRkVBVFVSRShhZHJlbm9fZGV2LCBBRFJFTk9fUFJFRU1QVElPTikpCisJaWYgKG5vcHJlZW1wdCA9PSBmYWxzZSkKIAkJYWRyZW5vX2Rldi0+bnVtX3JpbmdidWZmZXJzID0gZ3B1ZGV2LT5udW1fcHJpb19sZXZlbHM7CiAJZWxzZQogCQlhZHJlbm9fZGV2LT5udW1fcmluZ2J1ZmZlcnMgPSAxOwpAQCAtNDczLDExICs0ODAsMTEgQEAKIAkJdG90YWxfc2l6ZWR3b3JkcyArPSA0OwogCiAJaWYgKGdwdWRldi0+cHJlZW1wdGlvbl9wcmVfaWJzdWJtaXQgJiYKLQkJCQlhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQorCQkJYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCiAJCXRvdGFsX3NpemVkd29yZHMgKz0gMjI7CiAKIAlpZiAoZ3B1ZGV2LT5wcmVlbXB0aW9uX3Bvc3RfaWJzdWJtaXQgJiYKLQkJCQlhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQorCQkJYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCiAJCXRvdGFsX3NpemVkd29yZHMgKz0gNTsKIAogCS8qCkBAIC01MjMsNyArNTMwLDcgQEAKIAkqcmluZ2NtZHMrKyA9IGNwX3BhY2tldChhZHJlbm9fZGV2LCBDUF9OT1AsIDEpOwogCSpyaW5nY21kcysrID0gS0dTTF9DTURfSURFTlRJRklFUjsKIAotCWlmIChhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpICYmCisJaWYgKGFkcmVub19pc19wcmVlbXB0aW9uX2V4ZWN1dGlvbl9lbmFibGVkKGFkcmVub19kZXYpICYmCiAJCQkJZ3B1ZGV2LT5wcmVlbXB0aW9uX3ByZV9pYnN1Ym1pdCkKIAkJcmluZ2NtZHMgKz0gZ3B1ZGV2LT5wcmVlbXB0aW9uX3ByZV9pYnN1Ym1pdCgKIAkJCQkJYWRyZW5vX2RldiwgcmIsIHJpbmdjbWRzLCBjb250ZXh0KTsKQEAgLTY2MCw3ICs2NjcsNyBAQAogCQlyaW5nY21kcyArPSBjcF9zZWN1cmVfbW9kZShhZHJlbm9fZGV2LCByaW5nY21kcywgMCk7CiAKIAlpZiAoZ3B1ZGV2LT5wcmVlbXB0aW9uX3Bvc3RfaWJzdWJtaXQgJiYKLQkJCQlhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQorCQkJYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpCiAJCXJpbmdjbWRzICs9IGdwdWRldi0+cHJlZW1wdGlvbl9wb3N0X2lic3VibWl0KGFkcmVub19kZXYsCiAJCQlyaW5nY21kcyk7CiAKQEAgLTg2NCwxMyArODcxLDE3IEBACiAJCQlkd29yZHMgKz0gMjsKIAl9CiAKLQlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZW5hYmxlZChhZHJlbm9fZGV2KSkgewotCQlpZiAoZ3B1ZGV2LT5wcmVlbXB0aW9uX3NldF9tYXJrZXIpCi0JCQlkd29yZHMgKz0gNDsKLQkJZWxzZSBpZiAoZ3B1ZGV2LT5wcmVlbXB0aW9uX3lpZWxkX2VuYWJsZSkKKwlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpIHsKKwkJaWYgKGdwdWRldi0+cHJlZW1wdGlvbl95aWVsZF9lbmFibGUpCiAJCQlkd29yZHMgKz0gODsKIAl9CiAKKwlpZiAoZ3B1ZGV2LT5zZXRfbWFya2VyKQorCQlkd29yZHMgKz0gNDsKKworCWlmIChncHVkZXYtPmNjdV9pbnZhbGlkYXRlKQorCQlkd29yZHMgKz0gNDsKKwogCWxpbmsgPSBrY2FsbG9jKGR3b3Jkcywgc2l6ZW9mKHVuc2lnbmVkIGludCksIEdGUF9LRVJORUwpOwogCWlmICghbGluaykgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtOTAwLDkgKzkxMSw4IEBACiAJCQlncHVfdGlja3Nfc3VibWl0dGVkKSk7CiAJfQogCi0JaWYgKGdwdWRldi0+cHJlZW1wdGlvbl9zZXRfbWFya2VyICYmCi0JCQlhZHJlbm9faXNfcHJlZW1wdGlvbl9lbmFibGVkKGFkcmVub19kZXYpKQotCQljbWRzICs9IGdwdWRldi0+cHJlZW1wdGlvbl9zZXRfbWFya2VyKGNtZHMsIDEpOworCWlmIChncHVkZXYtPnNldF9tYXJrZXIpCisJCWNtZHMgKz0gZ3B1ZGV2LT5zZXRfbWFya2VyKGNtZHMsIDEpOwogCiAJaWYgKG51bWlicykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGliLCAmY21kb2JqLT5jbWRsaXN0LCBub2RlKSB7CkBAIC05MjUsMTAgKzkzNSwxNCBAQAogCQl9CiAJfQogCi0JaWYgKGFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpIHsKLQkJaWYgKGdwdWRldi0+cHJlZW1wdGlvbl9zZXRfbWFya2VyKQotCQkJY21kcyArPSBncHVkZXYtPnByZWVtcHRpb25fc2V0X21hcmtlcihjbWRzLCAwKTsKLQkJZWxzZSBpZiAoZ3B1ZGV2LT5wcmVlbXB0aW9uX3lpZWxkX2VuYWJsZSkKKwlpZiAoZ3B1ZGV2LT5jY3VfaW52YWxpZGF0ZSkKKwkJY21kcyArPSBncHVkZXYtPmNjdV9pbnZhbGlkYXRlKGFkcmVub19kZXYsIGNtZHMpOworCisJaWYgKGdwdWRldi0+c2V0X21hcmtlcikKKwkJY21kcyArPSBncHVkZXYtPnNldF9tYXJrZXIoY21kcywgMCk7CisKKwlpZiAoYWRyZW5vX2lzX3ByZWVtcHRpb25fZXhlY3V0aW9uX2VuYWJsZWQoYWRyZW5vX2RldikpIHsKKwkJaWYgKGdwdWRldi0+cHJlZW1wdGlvbl95aWVsZF9lbmFibGUpCiAJCQljbWRzICs9IGdwdWRldi0+cHJlZW1wdGlvbl95aWVsZF9lbmFibGUoY21kcyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3NuYXBzaG90LmMgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3NuYXBzaG90LmMKaW5kZXggMDg0MGFiYS4uYjU5OTllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19zbmFwc2hvdC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fc25hcHNob3QuYwpAQCAtOTQ1LDYgKzk0NSwyNCBAQAogCiB9CiAKKy8qIGFkcmVub19zbmFwc2hvdF9nbXUgLSBTbmFwc2hvdCB0aGUgQWRyZW5vIEdNVSBzdGF0ZQorICogQGRldmljZSAtIEtHU0wgZGV2aWNlIHRvIHNuYXBzaG90CisgKiBAc25hcHNob3QgLSBQb2ludGVyIHRvIHRoZSBzbmFwc2hvdCBpbnN0YW5jZQorICogVGhpcyBpcyBhIGhvb2sgZnVuY3Rpb24gY2FsbGVkIGJ5IGtnc2xfc25hcHNob3QgdG8gc25hcHNob3QgdGhlCisgKiBBZHJlbm8gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIHRoZSBHTVUgc25hcHNob3QuICBJbiB0dXJuLCB0aGlzIGZ1bmN0aW9uCisgKiBjYWxscyB0aGUgR01VIHNwZWNpZmljIHNuYXBzaG90IGZ1bmN0aW9uIHRvIGdldCBjb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICovCit2b2lkIGFkcmVub19zbmFwc2hvdF9nbXUoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsCisJCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdCkKK3sKKwlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiA9IEFEUkVOT19ERVZJQ0UoZGV2aWNlKTsKKwlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7CisKKwkvKiBBZGQgR01VIHNwZWNpZmljIHNlY3Rpb25zICovCisJaWYgKGdwdWRldi0+c25hcHNob3RfZ211KQorCQlncHVkZXYtPnNuYXBzaG90X2dtdShhZHJlbm9fZGV2LCBzbmFwc2hvdCk7Cit9CisKIC8qCiAgKiBhZHJlbm9fc25hcHNob3RfY3Bfcm9xIC0gRHVtcCBDUCBtZXJjaXUgZGF0YSBpbiBzbmFwc2hvdAogICogQGRldmljZTogRGV2aWNlIGJlaW5nIHNuYXBzaG90dGVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3N5c2ZzLmMgYi9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3N5c2ZzLmMKaW5kZXggODllYTFkOS4uNzA0ZTc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2FkcmVub19zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fc3lzZnMuYwpAQCAtNTEsNiArNTEsNDMgQEAKIAlyZXR1cm4gYWRyZW5vX2Rldi0+ZnRfcG9saWN5OwogfQogCitzdGF0aWMgaW50IF9wcmVlbXB0X2xldmVsX3N0b3JlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAorCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmICh2YWwgPD0gMikKKwkJYWRyZW5vX2Rldi0+cHJlZW1wdF9sZXZlbCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfcHJlZW1wdF9sZXZlbF9zaG93KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQoreworCXJldHVybiBhZHJlbm9fZGV2LT5wcmVlbXB0X2xldmVsOworfQorCitzdGF0aWMgaW50IF91c2VzZ21lbV9zdG9yZShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiwKKwkJdW5zaWduZWQgaW50IHZhbCkKK3sKKwlhZHJlbm9fZGV2LT51c2VzZ21lbSA9IHZhbCA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF91c2VzZ21lbV9zaG93KHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2KQoreworCXJldHVybiBhZHJlbm9fZGV2LT51c2VzZ21lbTsKK30KKworc3RhdGljIGludCBfc2tpcHNhdmVyZXN0b3JlX3N0b3JlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAorCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCWFkcmVub19kZXYtPnNraXBzYXZlcmVzdG9yZSA9IHZhbCA/IDEgOiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IF9za2lwc2F2ZXJlc3RvcmVfc2hvdyhzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldikKK3sKKwlyZXR1cm4gYWRyZW5vX2Rldi0+c2tpcHNhdmVyZXN0b3JlOworfQorCiBzdGF0aWMgaW50IF9mdF9wYWdlZmF1bHRfcG9saWN5X3N0b3JlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LAogCQl1bnNpZ25lZCBpbnQgdmFsKQogewpAQCAtMTI4LDcgKzE2NSw2IEBACiAKIAlpZiAodGVzdF9iaXQoQURSRU5PX0RFVklDRV9TVEFSVEVELCAmYWRyZW5vX2Rldi0+cHJpdikpIHsKIAkJa2dzbF9wd3JjdHJsX2NoYW5nZV9zdGF0ZShkZXZpY2UsIEtHU0xfU1RBVEVfQUNUSVZFKTsKLQkJYWRyZW5vX2lycWN0cmwoYWRyZW5vX2RldiwgMSk7CiAJfSBlbHNlIGlmIChkZXZpY2UtPnN0YXRlID09IEtHU0xfU1RBVEVfSU5JVCkgewogCQlyZXQgPSAtRUFDQ0VTOwogCQljaGFuZ2VfYml0KEFEUkVOT19ERVZJQ0VfSEFOR19JTlRSLCAmYWRyZW5vX2Rldi0+cHJpdik7CkBAIC0xNjgsMTMgKzIwNCwxNCBAQAogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0gS0dTTF9ERVZJQ0UoYWRyZW5vX2Rldik7CiAKLQlpZiAodGVzdF9iaXQoQURSRU5PX0RFVklDRV9QUkVFTVBUSU9OLCAmYWRyZW5vX2Rldi0+cHJpdikgPT0gdmFsKQorCWlmICh0ZXN0X2JpdChBRFJFTk9fREVWSUNFX1BSRUVNUFRJT05fRVhFQ1VUSU9OLAorCQkmYWRyZW5vX2Rldi0+cHJpdikgPT0gdmFsKQogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOwogCiAJa2dzbF9wd3JjdHJsX2NoYW5nZV9zdGF0ZShkZXZpY2UsIEtHU0xfU1RBVEVfU1VTUEVORCk7Ci0JY2hhbmdlX2JpdChBRFJFTk9fREVWSUNFX1BSRUVNUFRJT04sICZhZHJlbm9fZGV2LT5wcml2KTsKKwljaGFuZ2VfYml0KEFEUkVOT19ERVZJQ0VfUFJFRU1QVElPTl9FWEVDVVRJT04sICZhZHJlbm9fZGV2LT5wcml2KTsKIAlhZHJlbm9fZGV2LT5jdXJfcmIgPSAmKGFkcmVub19kZXYtPnJpbmdidWZmZXJzWzBdKTsKIAlrZ3NsX3B3cmN0cmxfY2hhbmdlX3N0YXRlKGRldmljZSwgS0dTTF9TVEFURV9TTFVNQkVSKTsKIApAQCAtMTgzLDkgKzIyMCwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IF9nbXVfaWRsZV9sZXZlbF9zdG9yZShzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiwKKwkJdW5zaWduZWQgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOworCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CisKKwltdXRleF9sb2NrKCZkZXZpY2UtPm11dGV4KTsKKworCS8qIFBvd2VyIGRvd24gdGhlIEdQVSBiZWZvcmUgY2hhbmdpbmcgdGhlIGlkbGUgbGV2ZWwgKi8KKwlrZ3NsX3B3cmN0cmxfY2hhbmdlX3N0YXRlKGRldmljZSwgS0dTTF9TVEFURV9TVVNQRU5EKTsKKwlnbXUtPmlkbGVfbGV2ZWwgPSB2YWw7CisJa2dzbF9wd3JjdHJsX2NoYW5nZV9zdGF0ZShkZXZpY2UsIEtHU0xfU1RBVEVfU0xVTUJFUik7CisKKwltdXRleF91bmxvY2soJmRldmljZS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IF9wcmVlbXB0aW9uX3Nob3coc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYpCiB7Ci0JcmV0dXJuIGFkcmVub19pc19wcmVlbXB0aW9uX2VuYWJsZWQoYWRyZW5vX2Rldik7CisJcmV0dXJuIGFkcmVub19pc19wcmVlbXB0aW9uX2V4ZWN1dGlvbl9lbmFibGVkKGFkcmVub19kZXYpOwogfQogCiBzdGF0aWMgaW50IF9od2NnX3N0b3JlKHN0cnVjdCBhZHJlbm9fZGV2aWNlICphZHJlbm9fZGV2LApAQCAtMjMxLDYgKzI4NSw0MCBAQAogCXJldHVybiB0ZXN0X2JpdChBRFJFTk9fTE1fQ1RSTCwgJmFkcmVub19kZXYtPnB3cmN0cmxfZmxhZyk7CiB9CiAKK3N0YXRpYyBpbnQgX2lmcGNfc3RvcmUoc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYsIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UgPSBLR1NMX0RFVklDRShhZHJlbm9fZGV2KTsKKwlzdHJ1Y3QgZ211X2RldmljZSAqZ211ID0gJmRldmljZS0+Z211OworCXVuc2lnbmVkIGludCByZXF1ZXN0ZWRfaWRsZV9sZXZlbDsKKworCWlmICgha2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkgfHwKKwkJCSFBRFJFTk9fRkVBVFVSRShhZHJlbm9fZGV2LCBBRFJFTk9fSUZQQykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCh2YWwgJiYgZ211LT5pZGxlX2xldmVsID49IEdQVV9IV19JRlBDKSB8fAorCQkJKCF2YWwgJiYgZ211LT5pZGxlX2xldmVsIDwgR1BVX0hXX0lGUEMpKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwpCisJCXJlcXVlc3RlZF9pZGxlX2xldmVsID0gR1BVX0hXX0lGUEM7CisJZWxzZSB7CisJCWlmIChBRFJFTk9fRkVBVFVSRShhZHJlbm9fZGV2LCBBRFJFTk9fU1BUUF9QQykpCisJCQlyZXF1ZXN0ZWRfaWRsZV9sZXZlbCA9IEdQVV9IV19TUFRQX1BDOworCQllbHNlCisJCQlyZXF1ZXN0ZWRfaWRsZV9sZXZlbCA9IEdQVV9IV19BQ1RJVkU7CisJfQorCisJcmV0dXJuIF9nbXVfaWRsZV9sZXZlbF9zdG9yZShhZHJlbm9fZGV2LCByZXF1ZXN0ZWRfaWRsZV9sZXZlbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX2lmcGNfc2hvdyhzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldikKK3sKKwlzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSA9IEtHU0xfREVWSUNFKGFkcmVub19kZXYpOworCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CisKKwlyZXR1cm4ga2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkgJiYgZ211LT5pZGxlX2xldmVsID49IEdQVV9IV19JRlBDOworfQorCiBzdGF0aWMgc3NpemVfdCBfc3lzZnNfc3RvcmVfdTMyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtMzEzLDYgKzQwMSw5IEBACiAKIHN0YXRpYyBBRFJFTk9fU1lTRlNfVTMyKGZ0X3BvbGljeSk7CiBzdGF0aWMgQURSRU5PX1NZU0ZTX1UzMihmdF9wYWdlZmF1bHRfcG9saWN5KTsKK3N0YXRpYyBBRFJFTk9fU1lTRlNfVTMyKHByZWVtcHRfbGV2ZWwpOworc3RhdGljIEFEUkVOT19TWVNGU19CT09MKHVzZXNnbWVtKTsKK3N0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChza2lwc2F2ZXJlc3RvcmUpOwogc3RhdGljIEFEUkVOT19TWVNGU19CT09MKGZ0X2xvbmdfaWJfZGV0ZWN0KTsKIHN0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChmdF9oYW5nX2ludHJfc3RhdHVzKTsKIHN0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChncHVfbGxjX3NsaWNlX2VuYWJsZSk7CkBAIC0zMjYsNiArNDE3LDcgQEAKIHN0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChwcmVlbXB0aW9uKTsKIHN0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChod2NnKTsKIHN0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTCh0aHJvdHRsaW5nKTsKK3N0YXRpYyBBRFJFTk9fU1lTRlNfQk9PTChpZnBjKTsKIAogCiAKQEAgLTM0Myw2ICs0MzUsMTAgQEAKIAkmYWRyZW5vX2F0dHJfdGhyb3R0bGluZy5hdHRyLAogCSZhZHJlbm9fYXR0cl9ncHVfbGxjX3NsaWNlX2VuYWJsZS5hdHRyLAogCSZhZHJlbm9fYXR0cl9ncHVodHdfbGxjX3NsaWNlX2VuYWJsZS5hdHRyLAorCSZhZHJlbm9fYXR0cl9wcmVlbXB0X2xldmVsLmF0dHIsCisJJmFkcmVub19hdHRyX3VzZXNnbWVtLmF0dHIsCisJJmFkcmVub19hdHRyX3NraXBzYXZlcmVzdG9yZS5hdHRyLAorCSZhZHJlbm9fYXR0cl9pZnBjLmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L21zbS9hZHJlbm9fdHJhY2UuaAppbmRleCA3YmM0YzkzLi5lMzMwNjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20vYWRyZW5vX3RyYWNlLmgKKysrIGIvZHJpdmVycy9ncHUvbXNtL2FkcmVub190cmFjZS5oCkBAIC0xNDgsNiArMTQ4LDI5IEBACiAJKQogKTsKIAorVFJBQ0VfRVZFTlQoYWRyZW5vX2NtZGJhdGNoX3N5bmMsCisJVFBfUFJPVE8oc3RydWN0IGFkcmVub19jb250ZXh0ICpkcmF3Y3R4dCwKKwkJdWludDY0X3QgdGlja3MpLAorCVRQX0FSR1MoZHJhd2N0eHQsIHRpY2tzKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgaWQpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCB0aW1lc3RhbXApCisJCV9fZmllbGQodWludDY0X3QsIHRpY2tzKQorCQlfX2ZpZWxkKGludCwgcHJpbykKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pZCA9IGRyYXdjdHh0LT5iYXNlLmlkOworCQlfX2VudHJ5LT50aW1lc3RhbXAgPSBkcmF3Y3R4dC0+dGltZXN0YW1wOworCQlfX2VudHJ5LT50aWNrcyA9IHRpY2tzOworCQlfX2VudHJ5LT5wcmlvID0gZHJhd2N0eHQtPmJhc2UucHJpb3JpdHk7CisJKSwKKwlUUF9wcmludGsoCisJCSJjdHg9JXUgY3R4X3ByaW89JWQgdHM9JXUgdGlja3M9JWxsZCIsCisJCQlfX2VudHJ5LT5pZCwgX19lbnRyeS0+cHJpbywgX19lbnRyeS0+dGltZXN0YW1wLAorCQkJX19lbnRyeS0+dGlja3MKKwkpCispOworCiBUUkFDRV9FVkVOVChhZHJlbm9fY21kYmF0Y2hfZmF1bHQsCiAJVFBfUFJPVE8oc3RydWN0IGtnc2xfZHJhd29ial9jbWQgKmNtZG9iaiwgdW5zaWduZWQgaW50IGZhdWx0KSwKIAlUUF9BUkdTKGNtZG9iaiwgZmF1bHQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2wuYyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsLmMKaW5kZXggOTk2OGQ4Yy4uMGE3ZDE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2tnc2wuYworKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbC5jCkBAIC0yMjgwLDcgKzIyODAsNyBAQAogCQlzdHJ1Y3Qga2dzbF9tZW1fZW50cnkgKmVudHJ5LAogCQlzdHJ1Y3Qga2dzbF9ncHVvYmpfaW1wb3J0ICpwYXJhbSkKIHsKLQlzdHJ1Y3Qga2dzbF9ncHVvYmpfaW1wb3J0X3VzZXJhZGRyIHVzZXJhZGRyOworCXN0cnVjdCBrZ3NsX2dwdW9ial9pbXBvcnRfdXNlcmFkZHIgdXNlcmFkZHIgPSB7MH07CiAJaW50IHJldDsKIAogCXBhcmFtLT5mbGFncyAmPSBLR1NMX01FTUZMQUdTX0dQVVJFQURPTkxZCkBAIC0zNDcxLDcgKzM0NzEsNyBAQAogCXN0cnVjdCBzcGFyc2VfYmluZF9vYmplY3QgKm5ldzsKIAlzdHJ1Y3QgcmJfbm9kZSAqKm5vZGUsICpwYXJlbnQgPSBOVUxMOwogCi0JbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfQVRPTUlDKTsKIAlpZiAobmV3ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNTA1LDcgKzM1MDUsNiBAQAogCQlzdHJ1Y3Qgc3BhcnNlX2JpbmRfb2JqZWN0ICpvYmosCiAJCXVpbnQ2NF90IHZfb2Zmc2V0LCB1aW50NjRfdCBzaXplKQogewotCXNwaW5fbG9jaygmZW50cnktPmJpbmRfbG9jayk7CiAJaWYgKHZfb2Zmc2V0ID09IG9iai0+dl9vZmYgJiYgc2l6ZSA+PSBvYmotPnNpemUpIHsKIAkJLyoKIAkJICogV2UgYXJlIGFsbCBlbmNvbXBhc3NpbmcsIHJlbW92ZSB0aGUgZW50cnkgYW5kIGZyZWUKQEAgLTM1MzgsNyArMzUzNyw2IEBACiAKIAkJb2JqLT5zaXplID0gdl9vZmZzZXQgLSBvYmotPnZfb2ZmOwogCi0JCXNwaW5fdW5sb2NrKCZlbnRyeS0+YmluZF9sb2NrKTsKIAkJcmV0ID0gX3NwYXJzZV9hZGRfdG9fYmluZF90cmVlKGVudHJ5LCB2X29mZnNldCArIHNpemUsCiAJCQkJb2JqLT5wX21lbWRlc2MsCiAJCQkJb2JqLT5wX29mZiArICh2X29mZnNldCAtIG9iai0+dl9vZmYpICsgc2l6ZSwKQEAgLTM1NDgsMTEgKzM1NDYsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlzcGluX3VubG9jaygmZW50cnktPmJpbmRfbG9jayk7Ci0KIAlyZXR1cm4gMDsKIH0KIAorLyogZW50cnktPmJpbmRfbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlciAqLwogc3RhdGljIHN0cnVjdCBzcGFyc2VfYmluZF9vYmplY3QgKl9maW5kX2NvbnRhaW5pbmdfYmluZF9vYmooCiAJCXN0cnVjdCBrZ3NsX21lbV9lbnRyeSAqZW50cnksCiAJCXVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkKQEAgLTM1NjAsOCArMzU1Nyw2IEBACiAJc3RydWN0IHNwYXJzZV9iaW5kX29iamVjdCAqb2JqID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IGVudHJ5LT5iaW5kX3RyZWUucmJfbm9kZTsKIAotCXNwaW5fbG9jaygmZW50cnktPmJpbmRfbG9jayk7Ci0KIAl3aGlsZSAobm9kZSAhPSBOVUxMKSB7CiAJCW9iaiA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzcGFyc2VfYmluZF9vYmplY3QsIG5vZGUpOwogCkBAIC0zNTgwLDMzICszNTc1LDE2IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9jaygmZW50cnktPmJpbmRfbG9jayk7Ci0KIAlyZXR1cm4gb2JqOwogfQogCisvKiBlbnRyeS0+YmluZF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyICovCiBzdGF0aWMgaW50IF9zcGFyc2VfdW5iaW5kKHN0cnVjdCBrZ3NsX21lbV9lbnRyeSAqZW50cnksCiAJCXN0cnVjdCBzcGFyc2VfYmluZF9vYmplY3QgKmJpbmRfb2JqLAogCQl1aW50NjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpCiB7Ci0Jc3RydWN0IGtnc2xfbWVtZGVzYyAqbWVtZGVzYyA9IGJpbmRfb2JqLT5wX21lbWRlc2M7Ci0Jc3RydWN0IGtnc2xfcGFnZXRhYmxlICpwdCA9IG1lbWRlc2MtPnBhZ2V0YWJsZTsKIAlpbnQgcmV0OwogCi0JaWYgKG1lbWRlc2MtPmN1cl9iaW5kaW5ncyA8IChzaXplIC8gUEFHRV9TSVpFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1kZXNjLT5jdXJfYmluZGluZ3MgLT0gc2l6ZSAvIFBBR0VfU0laRTsKLQotCXJldCA9IGtnc2xfbW11X3VubWFwX29mZnNldChwdCwgbWVtZGVzYywKLQkJCWVudHJ5LT5tZW1kZXNjLmdwdWFkZHIsIG9mZnNldCwgc2l6ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGtnc2xfbW11X3NwYXJzZV9kdW1teV9tYXAocHQsICZlbnRyeS0+bWVtZGVzYywgb2Zmc2V0LCBzaXplKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gX3NwYXJzZV9ybV9mcm9tX2JpbmRfdHJlZShlbnRyeSwgYmluZF9vYmosIG9mZnNldCwgc2l6ZSk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCWF0b21pY19sb25nX3N1YihzaXplLCAma2dzbF9kcml2ZXIuc3RhdHMubWFwcGVkKTsKQEAgLTM2MjAsNiArMzU5OCw4IEBACiAJc3RydWN0IGtnc2xfbWVtX2VudHJ5ICp2aXJ0X2VudHJ5KQogewogCXN0cnVjdCBzcGFyc2VfYmluZF9vYmplY3QgKmJpbmRfb2JqOworCXN0cnVjdCBrZ3NsX21lbWRlc2MgKm1lbWRlc2M7CisJc3RydWN0IGtnc2xfcGFnZXRhYmxlICpwdDsKIAlpbnQgcmV0ID0gMDsKIAl1aW50NjRfdCBzaXplID0gb2JqLT5zaXplOwogCXVpbnQ2NF90IHRtcF9zaXplID0gb2JqLT5zaXplOwpAQCAtMzYyNyw5ICszNjA3LDE0IEBACiAKIAl3aGlsZSAoc2l6ZSA+IDAgJiYgcmV0ID09IDApIHsKIAkJdG1wX3NpemUgPSBzaXplOworCisJCXNwaW5fbG9jaygmdmlydF9lbnRyeS0+YmluZF9sb2NrKTsKIAkJYmluZF9vYmogPSBfZmluZF9jb250YWluaW5nX2JpbmRfb2JqKHZpcnRfZW50cnksIG9mZnNldCwgc2l6ZSk7Ci0JCWlmIChiaW5kX29iaiA9PSBOVUxMKQorCisJCWlmIChiaW5kX29iaiA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9jaygmdmlydF9lbnRyeS0+YmluZF9sb2NrKTsKIAkJCXJldHVybiAwOworCQl9CiAKIAkJaWYgKGJpbmRfb2JqLT52X29mZiA+IG9mZnNldCkgewogCQkJdG1wX3NpemUgPSBzaXplIC0gYmluZF9vYmotPnZfb2ZmIC0gb2Zmc2V0OwpAQCAtMzY0Niw3ICszNjMxLDI4IEBACiAJCQkJdG1wX3NpemUgPSBiaW5kX29iai0+c2l6ZTsKIAkJfQogCisJCW1lbWRlc2MgPSBiaW5kX29iai0+cF9tZW1kZXNjOworCQlwdCA9IG1lbWRlc2MtPnBhZ2V0YWJsZTsKKworCQlpZiAobWVtZGVzYy0+Y3VyX2JpbmRpbmdzIDwgKHRtcF9zaXplIC8gUEFHRV9TSVpFKSkgeworCQkJc3Bpbl91bmxvY2soJnZpcnRfZW50cnktPmJpbmRfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW1lbWRlc2MtPmN1cl9iaW5kaW5ncyAtPSB0bXBfc2l6ZSAvIFBBR0VfU0laRTsKKwogCQlyZXQgPSBfc3BhcnNlX3VuYmluZCh2aXJ0X2VudHJ5LCBiaW5kX29iaiwgb2Zmc2V0LCB0bXBfc2l6ZSk7CisJCXNwaW5fdW5sb2NrKCZ2aXJ0X2VudHJ5LT5iaW5kX2xvY2spOworCisJCXJldCA9IGtnc2xfbW11X3VubWFwX29mZnNldChwdCwgbWVtZGVzYywKKwkJCQl2aXJ0X2VudHJ5LT5tZW1kZXNjLmdwdWFkZHIsIG9mZnNldCwgdG1wX3NpemUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBrZ3NsX21tdV9zcGFyc2VfZHVtbXlfbWFwKHB0LCBtZW1kZXNjLCBvZmZzZXQsIHRtcF9zaXplKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJaWYgKHJldCA9PSAwKSB7CiAJCQlvZmZzZXQgKz0gdG1wX3NpemU7CiAJCQlzaXplIC09IHRtcF9zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfZGV2aWNlLmggYi9kcml2ZXJzL2dwdS9tc20va2dzbF9kZXZpY2UuaAppbmRleCAyY2MxODY5Li4wYWI3NzVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9kZXZpY2UuaAorKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9kZXZpY2UuaApAQCAtMTUxLDYgKzE1MSw4IEBACiAJdW5zaWduZWQgaW50ICgqZ3B1aWQpKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgKmNoaXBpZCk7CiAJdm9pZCAoKnNuYXBzaG90KShzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGtnc2xfc25hcHNob3QgKnNuYXBzaG90LCBzdHJ1Y3Qga2dzbF9jb250ZXh0ICpjb250ZXh0KTsKKwl2b2lkICgqc25hcHNob3RfZ211KShzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSwKKwkJc3RydWN0IGtnc2xfc25hcHNob3QgKnNuYXBzaG90KTsKIAlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVyKShzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSk7CiAJaW50ICgqZHJhaW4pKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlKTsKIAkvKgpAQCAtNDkzLDcgKzQ5NSw5IEBACiAgKiBAd29yazogd29ya2VyIHRvIGR1bXAgdGhlIGZyb3plbiBtZW1vcnkKICAqIEBkdW1wX2dhdGU6IGNvbXBsZXRpb24gZ2F0ZSBzaWduYWxlZCBieSB3b3JrZXIgd2hlbiBpdCBpcyBmaW5pc2hlZC4KICAqIEBwcm9jZXNzOiB0aGUgcHJvY2VzcyB0aGF0IGNhdXNlZCB0aGUgaGFuZywgaWYga25vd24uCi0gKiBAc3lzZnNfcmVhZDogQW4gYXRvbWljIGZvciBjb25jdXJyZW50IHNuYXBzaG90IHJlYWRzIHZpYSBzeWZzLgorICogQHN5c2ZzX3JlYWQ6IENvdW50IG9mIGN1cnJlbnQgcmVhZHMgdmlhIHN5c2ZzCisgKiBAZmlyc3RfcmVhZDogVHJ1ZSB1bnRpbCB0aGUgc25hcHNob3QgcmVhZCBpcyBzdGFydGVkCisgKiBAZ211X2ZhdWx0OiBTbmFwc2hvdCBjb2xsZWN0ZWQgd2hlbiBHTVUgZmF1bHQgaGFwcGVuZWQKICAqLwogc3RydWN0IGtnc2xfc25hcHNob3QgewogCXVpbnQ2NF90IGliMWJhc2U7CkBAIC01MTQsNyArNTE4LDkgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbiBkdW1wX2dhdGU7CiAJc3RydWN0IGtnc2xfcHJvY2Vzc19wcml2YXRlICpwcm9jZXNzOwotCWF0b21pY190IHN5c2ZzX3JlYWQ7CisJdW5zaWduZWQgaW50IHN5c2ZzX3JlYWQ7CisJYm9vbCBmaXJzdF9yZWFkOworCWJvb2wgZ211X2ZhdWx0OwogfTsKIAogLyoqCkBAIC03MDAsOSArNzA2LDggQEAKIAogaW50IGtnc2xfZGV2aWNlX3NuYXBzaG90X2luaXQoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UpOwogdm9pZCBrZ3NsX2RldmljZV9zbmFwc2hvdChzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSwKLQkJCXN0cnVjdCBrZ3NsX2NvbnRleHQgKmNvbnRleHQpOworCQkJc3RydWN0IGtnc2xfY29udGV4dCAqY29udGV4dCwgYm9vbCBnbXVfZmF1bHQpOwogdm9pZCBrZ3NsX2RldmljZV9zbmFwc2hvdF9jbG9zZShzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSk7Ci12b2lkIGtnc2xfc25hcHNob3Rfc2F2ZV9mcm96ZW5fb2JqcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiB2b2lkIGtnc2xfZXZlbnRzX2luaXQodm9pZCk7CiB2b2lkIGtnc2xfZXZlbnRzX2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20va2dzbF9nbXUuYyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2dtdS5jCmluZGV4IDI5ODE0YTAuLjc4ZWY4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2dtdS5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2dtdS5jCkBAIC00NTYsMTEgKzQ1NiwxMiBAQAogCQkJR01VX0RDVlNfTk9IRkksIHBlcmZfaWR4LCBid19pZHgpOwogCiAJCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJmdtdS0+cGRldi0+ZGV2LAorCQkJZGV2X2Vycl9yYXRlbGltaXRlZCgmZ211LT5wZGV2LT5kZXYsCiAJCQkJIkZhaWxlZCB0byBzZXQgR1BVIHBlcmYgaWR4ICVkLCBidyBpZHggJWRcbiIsCiAJCQkJcGVyZl9pZHgsIGJ3X2lkeCk7CiAKLQkJCWdtdV9zbmFwc2hvdChkZXZpY2UpOworCQkJYWRyZW5vX3NldF9ncHVfZmF1bHQoYWRyZW5vX2RldiwgQURSRU5PX0dNVV9GQVVMVCk7CisJCQlhZHJlbm9fZGlzcGF0Y2hlcl9zY2hlZHVsZShkZXZpY2UpOwogCQl9CiAKIAkJcmV0dXJuIHJldDsKQEAgLTUwNCw5ICs1MDUsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbGVuOwogCiAJbGVuID0gY21kX2RiX2dldF9hdXhfZGF0YV9sZW4ocmVzX2lkKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGxlbiA+IChNQVhfR1hfTEVWRUxTIDw8IDEpKSB7Ci0JCS8qIENtZERCIFZMVkwgdGFibGUgc2l6ZSBpbiBieXRlcyBpcyB0b28gbGFyZ2UgKi8KIAkJZGV2X2VycigmZ211LT5wZGV2LT5kZXYsCiAJCQkiZ2Z4IGNtZGRiIHNpemUgJWQgbGFyZ2VyIHRoYW4gYWxsb2MgYnVmICVkIG9mICVzXG4iLAogCQkJbGVuLCAoTUFYX0dYX0xFVkVMUyA8PCAxKSwgcmVzX2lkKTsKQEAgLTUxNCw4ICs1MTYsMTYgQEAKIAl9CiAKIAljbWRfZGJfZ2V0X2F1eF9kYXRhKHJlc19pZCwgKHVpbnQ4X3QgKilhcmMtPnZhbCwgbGVuKTsKLQlmb3IgKGFyYy0+bnVtID0gMTsgYXJjLT5udW0gPD0gTUFYX0dYX0xFVkVMUzsgYXJjLT5udW0rKykgewotCQlpZiAoYXJjLT5udW0gPT0gTUFYX0dYX0xFVkVMUyB8fAorCisJLyoKKwkgKiBjbWRfZGJfZ2V0X2F1eF9kYXRhKCkgZ2l2ZXMgdXMgYSB6ZXJvLXBhZGRlZCB0YWJsZSBvZgorCSAqIHNpemUgbGVuIHRoYXQgY29udGFpbnMgdGhlIGFyYyB2YWx1ZXMuIFRvIGRldGVybWluZSB0aGUKKwkgKiBudW1iZXIgb2YgYXJjIHZhbHVlcywgd2UgbG9vcCB0aHJvdWdoIHRoZSB0YWJsZSBhbmQgY291bnQKKwkgKiB0aGVtIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgb3IgaGl0IHRoZQorCSAqIHplcm8gcGFkZGluZy4KKwkgKi8KKwlmb3IgKGFyYy0+bnVtID0gMTsgYXJjLT5udW0gPD0gbGVuOyBhcmMtPm51bSsrKSB7CisJCWlmIChhcmMtPm51bSA9PSBsZW4gfHwKIAkJCQlhcmMtPnZhbFthcmMtPm51bSAtIDFdID49IGFyYy0+dmFsW2FyYy0+bnVtXSkKIAkJCWJyZWFrOwogCX0KQEAgLTg2Miw3ICs4NzIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdtdV9yZWdfcHJvYmUoc3RydWN0IGdtdV9kZXZpY2UgKmdtdSwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgZ211X3JlZ19wcm9iZShzdHJ1Y3QgZ211X2RldmljZSAqZ211LCBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX2dtdSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIApAQCAtODgwLDcgKzg5MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghc3RyY21wKG5hbWUsICJrZ3NsX2dtdV9yZWciKSkgeworCWlmIChpc19nbXUpIHsKIAkJZ211LT5yZWdfcGh5cyA9IHJlcy0+c3RhcnQ7CiAJCWdtdS0+cmVnX2xlbiA9IHJlc291cmNlX3NpemUocmVzKTsKIAkJZ211LT5yZWdfdmlydCA9IGRldm1faW9yZW1hcCgmZ211LT5wZGV2LT5kZXYsIHJlcy0+c3RhcnQsCkBAIC04OTEsMjAgKzkwMSwxMyBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAia2dzbF9nbXVfcGRjX3JlZyIpKSB7CisJfSBlbHNlIHsKIAkJZ211LT5wZGNfcmVnX3ZpcnQgPSBkZXZtX2lvcmVtYXAoJmdtdS0+cGRldi0+ZGV2LCByZXMtPnN0YXJ0LAogCQkJCXJlc291cmNlX3NpemUocmVzKSk7CiAJCWlmIChnbXUtPnBkY19yZWdfdmlydCA9PSBOVUxMKSB7CiAJCQlkZXZfZXJyKCZnbXUtPnBkZXYtPmRldiwgIlBEQyByZWdzIGlvcmVtYXAgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJrZ3NsX2dtdV9jcHJfcmVnIikpIHsKLQkJZ211LT5jcHJfcmVnX3ZpcnQgPSBkZXZtX2lvcmVtYXAoJmdtdS0+cGRldi0+ZGV2LCByZXMtPnN0YXJ0LAotCQkJCXJlc291cmNlX3NpemUocmVzKSk7Ci0JCWlmIChnbXUtPmNwcl9yZWdfdmlydCA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKCZnbXUtPnBkZXYtPmRldiwgIkNQUiByZWdzIGlvcmVtYXAgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTI1LDE1ICsxMTI4LDExIEBACiAJbWVtX2FkZHIgPSBnbXUtPmhmaV9tZW07CiAKIAkvKiBNYXAgYW5kIHJlc2VydmUgR01VIENTUnMgcmVnaXN0ZXJzICovCi0JcmV0ID0gZ211X3JlZ19wcm9iZShnbXUsICJrZ3NsX2dtdV9yZWciKTsKKwlyZXQgPSBnbXVfcmVnX3Byb2JlKGdtdSwgImtnc2xfZ211X3JlZyIsIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSBnbXVfcmVnX3Byb2JlKGdtdSwgImtnc2xfZ211X3BkY19yZWciKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gZ211X3JlZ19wcm9iZShnbXUsICJrZ3NsX2dtdV9jcHJfcmVnIik7CisJcmV0ID0gZ211X3JlZ19wcm9iZShnbXUsICJrZ3NsX2dtdV9wZGNfcmVnIiwgZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTExNTksNyArMTE1OCw2IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlnbXUtPm51bV9ncHVwd3JsZXZlbHMgPSBwd3ItPm51bV9wd3JsZXZlbHM7Ci0JZ211LT53YWtldXBfcHdybGV2ZWwgPSBwd3ItPmRlZmF1bHRfcHdybGV2ZWw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZ211LT5udW1fZ3B1cHdybGV2ZWxzOyBpKyspIHsKIAkJaW50IGogPSBnbXUtPm51bV9ncHVwd3JsZXZlbHMgLSAxIC0gaTsKQEAgLTEzNTIsNiArMTM1MCw3IEBACiAKIAlnbXVfZGlzYWJsZV9jbGtzKGdtdSk7CiAJZ211X2Rpc2FibGVfZ2RzYyhnbXUpOworCWRldl9lcnIoJmdtdS0+cGRldi0+ZGV2LCAiU3VzcGVuZGVkIEdNVVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNjAsNyArMTM1OSw3IEBACiAJc3RydWN0IGFkcmVub19kZXZpY2UgKmFkcmVub19kZXYgPSBBRFJFTk9fREVWSUNFKGRldmljZSk7CiAJc3RydWN0IGdtdV9kZXZpY2UgKmdtdSA9ICZkZXZpY2UtPmdtdTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChHTVVfRkFVTFQsICZnbXUtPmZsYWdzKSkgeworCWlmICghZ211LT5mYXVsdF9jb3VudCkgewogCQkvKiBNYXNrIHNvIHRoZXJlJ3Mgbm8gaW50ZXJydXB0IGNhdXNlZCBieSBOTUkgKi8KIAkJYWRyZW5vX3dyaXRlX2dtdXJlZyhhZHJlbm9fZGV2LAogCQkJCUFEUkVOT19SRUdfR01VX0dNVTJIT1NUX0lOVFJfTUFTSywgMHhGRkZGRkZGRik7CkBAIC0xMzc1LDcgKzEzNzQsNyBAQAogCQkvKiBXYWl0IGZvciB0aGUgTk1JIHRvIGJlIGhhbmRsZWQgKi8KIAkJd21iKCk7CiAJCXVkZWxheSgxMDApOwotCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIE5VTEwpOworCQlrZ3NsX2RldmljZV9zbmFwc2hvdChkZXZpY2UsIE5VTEwsIHRydWUpOwogCiAJCWFkcmVub193cml0ZV9nbXVyZWcoYWRyZW5vX2RldiwKIAkJCQlBRFJFTk9fUkVHX0dNVV9HTVUySE9TVF9JTlRSX0NMUiwgMHhGRkZGRkZGRik7CkBAIC0xMzgzLDYgKzEzODIsOCBAQAogCQkJCUFEUkVOT19SRUdfR01VX0dNVTJIT1NUX0lOVFJfTUFTSywKIAkJCQkodW5zaWduZWQgaW50KSB+SEZJX0lSUV9NQVNLKTsKIAl9CisKKwlnbXUtPmZhdWx0X2NvdW50Kys7CiB9CiAKIC8qIFRvIGJlIGNhbGxlZCB0byBwb3dlciBvbiBib3RoIEdQVSBhbmQgR01VICovCkBAIC0xNDAwLDMyICsxNDAxLDI2IEBACiAJCVdBUk5fT04odGVzdF9iaXQoR01VX0NMS19PTiwgJmdtdS0+ZmxhZ3MpKTsKIAkJZ211X2VuYWJsZV9nZHNjKGdtdSk7CiAJCWdtdV9lbmFibGVfY2xrcyhnbXUpOworCQlnbXVfaXJxX2VuYWJsZShkZXZpY2UpOwogCiAJCS8qIFZvdGUgZm9yIDMwME1IeiBERFIgZm9yIEdNVSB0byBpbml0ICovCiAJCXJldCA9IG1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KGdtdS0+cGNsLAogCQkJCXB3ci0+cHdybGV2ZWxzW3B3ci0+ZGVmYXVsdF9wd3JsZXZlbF0uYnVzX2ZyZXEpOwotCQlpZiAocmV0KSB7CisJCWlmIChyZXQpCiAJCQlkZXZfZXJyKCZnbXUtPnBkZXYtPmRldiwKLQkJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBnbXUgYi93XG4iKTsKLQkJCWdvdG8gZXJyb3JfY2xrczsKLQkJfQorCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgZ211IGIvdzogJWRcbiIsIHJldCk7CiAKIAkJcmV0ID0gZ3B1ZGV2LT5ycG1oX2dwdV9wd3JjdHJsKGFkcmVub19kZXYsIEdNVV9GV19TVEFSVCwKIAkJCQlHTVVfQ09MRF9CT09ULCAwKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfYnVzOwotCi0JCWdtdV9pcnFfZW5hYmxlKGRldmljZSk7CisJCQlnb3RvIGVycm9yX2dtdTsKIAogCQlyZXQgPSBoZmlfc3RhcnQoZ211LCBHTVVfQ09MRF9CT09UKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfZ3B1OworCQkJZ290byBlcnJvcl9nbXU7CiAKLQkJLyogU2VuZCBkZWZhdWx0IERDVlMgbGV2ZWwgKi8KLQkJcmV0ID0gZ211X2RjdnNfc2V0KGdtdSwgcHdyLT5kZWZhdWx0X3B3cmxldmVsLAotCQkJCXB3ci0+cHdybGV2ZWxzW3B3ci0+ZGVmYXVsdF9wd3JsZXZlbF0uYnVzX2ZyZXEpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9ncHU7CisJCS8qIFJlcXVlc3QgZGVmYXVsdCBEQ1ZTIGxldmVsICovCisJCWtnc2xfcHdyY3RybF9wd3JsZXZlbF9jaGFuZ2UoZGV2aWNlLCBwd3ItPmRlZmF1bHRfcHdybGV2ZWwpOwogCiAJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KGdtdS0+cGNsLCAwKTsKIAkJYnJlYWs7CkBAIC0xNDM0LDQ5ICsxNDI5LDQxIEBACiAJCVdBUk5fT04odGVzdF9iaXQoR01VX0NMS19PTiwgJmdtdS0+ZmxhZ3MpKTsKIAkJZ211X2VuYWJsZV9nZHNjKGdtdSk7CiAJCWdtdV9lbmFibGVfY2xrcyhnbXUpOworCQlnbXVfaXJxX2VuYWJsZShkZXZpY2UpOwogCiAJCXJldCA9IGdwdWRldi0+cnBtaF9ncHVfcHdyY3RybChhZHJlbm9fZGV2LCBHTVVfRldfU1RBUlQsCiAJCQkJR01VX1dBUk1fQk9PVCwgMCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX2Nsa3M7Ci0KLQkJZ211X2lycV9lbmFibGUoZGV2aWNlKTsKKwkJCWdvdG8gZXJyb3JfZ211OwogCiAJCXJldCA9IGhmaV9zdGFydChnbXUsIEdNVV9XQVJNX0JPT1QpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9ncHU7CisJCQlnb3RvIGVycm9yX2dtdTsKIAotCQlyZXQgPSBnbXVfZGN2c19zZXQoZ211LCBnbXUtPndha2V1cF9wd3JsZXZlbCwKLQkJCQlwd3ItPnB3cmxldmVsc1tnbXUtPndha2V1cF9wd3JsZXZlbF0uYnVzX2ZyZXEpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9ncHU7Ci0KLQkJZ211LT53YWtldXBfcHdybGV2ZWwgPSBwd3ItPmRlZmF1bHRfcHdybGV2ZWw7CisJCWtnc2xfcHdyY3RybF9wd3JsZXZlbF9jaGFuZ2UoZGV2aWNlLCBwd3ItPmRlZmF1bHRfcHdybGV2ZWwpOwogCQlicmVhazsKIAogCWNhc2UgS0dTTF9TVEFURV9SRVNFVDoKLQkJaWYgKHRlc3RfYml0KEFEUkVOT19ERVZJQ0VfSEFSRF9SRVNFVCwgJmFkcmVub19kZXYtPnByaXYpKSB7CisJCWlmICh0ZXN0X2JpdChBRFJFTk9fREVWSUNFX0hBUkRfUkVTRVQsICZhZHJlbm9fZGV2LT5wcml2KSB8fAorCQkJdGVzdF9iaXQoR01VX0ZBVUxULCAmZ211LT5mbGFncykpIHsKIAkJCWdtdV9zdXNwZW5kKGRldmljZSk7CiAJCQlnbXVfZW5hYmxlX2dkc2MoZ211KTsKIAkJCWdtdV9lbmFibGVfY2xrcyhnbXUpOworCQkJZ211X2lycV9lbmFibGUoZGV2aWNlKTsKIAogCQkJcmV0ID0gZ3B1ZGV2LT5ycG1oX2dwdV9wd3JjdHJsKAogCQkJCWFkcmVub19kZXYsIEdNVV9GV19TVEFSVCwgR01VX1JFU0VULCAwKTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcl9jbGtzOworCQkJCWdvdG8gZXJyb3JfZ211OwogCi0JCQlnbXVfaXJxX2VuYWJsZShkZXZpY2UpOwogCiAJCQlyZXQgPSBoZmlfc3RhcnQoZ211LCBHTVVfQ09MRF9CT09UKTsKIAkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcl9ncHU7CisJCQkJZ290byBlcnJvcl9nbXU7CiAKIAkJCS8qIFNlbmQgRENWUyBsZXZlbCBwcmlvciB0byByZXNldCovCi0JCQlyZXQgPSBnbXVfZGN2c19zZXQoZ211LCBwd3ItPmFjdGl2ZV9wd3JsZXZlbCwKLQkJCQkJcHdyLT5wd3JsZXZlbHNbcHdyLT5hY3RpdmVfcHdybGV2ZWxdCi0JCQkJCS5idXNfZnJlcSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfZ3B1OworCQkJa2dzbF9wd3JjdHJsX3B3cmxldmVsX2NoYW5nZShkZXZpY2UsCisJCQkJcHdyLT5kZWZhdWx0X3B3cmxldmVsKTsKIAogCQkJcmV0ID0gZ3B1ZGV2LT5vb2Jfc2V0KGFkcmVub19kZXYsCiAJCQkJT09CX0NQSU5JVF9TRVRfTUFTSywKQEAgLTE0OTAsNzQgKzE0NzcsNTcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKEFEUkVOT19RVUlSSyhhZHJlbm9fZGV2LCBBRFJFTk9fUVVJUktfSEZJX1VTRV9SRUcpKQotCQlncHVkZXYtPm9vYl9jbGVhcihhZHJlbm9fZGV2LAotCQkJCU9PQl9CT09UX1NMVU1CRVJfQ0xFQVJfTUFTSyk7Ci0KIAlyZXR1cm4gcmV0OwogCi1lcnJvcl9ncHU6CitlcnJvcl9nbXU6CiAJZ211X3NuYXBzaG90KGRldmljZSk7Ci0JaGZpX3N0b3AoZ211KTsKLQlnbXVfaXJxX2Rpc2FibGUoZGV2aWNlKTsKLQlpZiAoQURSRU5PX1FVSVJLKGFkcmVub19kZXYsIEFEUkVOT19RVUlSS19IRklfVVNFX1JFRykpCi0JCWdwdWRldi0+b29iX2NsZWFyKGFkcmVub19kZXYsCi0JCQkJT09CX0JPT1RfU0xVTUJFUl9DTEVBUl9NQVNLKTsKLQlncHVkZXYtPnJwbWhfZ3B1X3B3cmN0cmwoYWRyZW5vX2RldiwgR01VX0ZXX1NUT1AsIDAsIDApOwotZXJyb3JfYnVzOgotCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KGdtdS0+cGNsLCAwKTsKLWVycm9yX2Nsa3M6Ci0JZ211X3NuYXBzaG90KGRldmljZSk7Ci0JZ211X2Rpc2FibGVfY2xrcyhnbXUpOwotCWdtdV9kaXNhYmxlX2dkc2MoZ211KTsKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIEdNVV9JRExFX1RJTUVPVVQJMTAgLyogbXMgKi8KLQogLyogQ2FsbGVyIHNoYWxsIGVuc3VyZSBHUFUgaXMgcmVhZHkgZm9yIFNMVU1CRVIgKi8KIHZvaWQgZ211X3N0b3Aoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGdtdV9kZXZpY2UgKmdtdSA9ICZkZXZpY2UtPmdtdTsKIAlzdHJ1Y3QgYWRyZW5vX2RldmljZSAqYWRyZW5vX2RldiA9IEFEUkVOT19ERVZJQ0UoZGV2aWNlKTsKIAlzdHJ1Y3QgYWRyZW5vX2dwdWRldiAqZ3B1ZGV2ID0gQURSRU5PX0dQVV9ERVZJQ0UoYWRyZW5vX2Rldik7Ci0JdW5zaWduZWQgbG9uZyB0OwotCWJvb2wgaWRsZSA9IGZhbHNlOwotCXVuc2lnbmVkIGludCByZWc7CisJYm9vbCBpZGxlID0gdHJ1ZTsKIAogCWlmICghdGVzdF9iaXQoR01VX0NMS19PTiwgJmdtdS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQl0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoR01VX0lETEVfVElNRU9VVCk7Ci0Jd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHQpKSB7Ci0JCWFkcmVub19yZWFkX2dtdXJlZyhBRFJFTk9fREVWSUNFKGRldmljZSksCi0JCQlBRFJFTk9fUkVHX0dNVV9SUE1IX1BPV0VSX1NUQVRFLCAmcmVnKTsKLQkJaWYgKHJlZyA9PSBkZXZpY2UtPmdtdS5pZGxlX2xldmVsKSB7Ci0JCQlpZGxlID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIFdhaXQgMTAwdXMgdG8gcmVkdWNlIHVubmVjZXNzYXJ5IEFIQiBidXMgdHJhZmZpYyAqLwotCQl1ZGVsYXkoMTAwKTsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQorCS8qIFdhaXQgZm9yIHRoZSBsb3dlc3QgaWRsZSBsZXZlbCB3ZSByZXF1ZXN0ZWQgKi8KKwlpZiAoZ3B1ZGV2LT53YWl0X2Zvcl9sb3dlc3RfaWRsZSAmJgorCQkJZ3B1ZGV2LT53YWl0X2Zvcl9sb3dlc3RfaWRsZShhZHJlbm9fZGV2KSkKKwkJaWRsZSA9IGZhbHNlOwogCiAJZ3B1ZGV2LT5ycG1oX2dwdV9wd3JjdHJsKGFkcmVub19kZXYsIEdNVV9OT1RJRllfU0xVTUJFUiwgMCwgMCk7Ci0KIAlpZiAoIWlkbGUgfHwgKGdwdWRldi0+d2FpdF9mb3JfZ211X2lkbGUgJiYKIAkJCWdwdWRldi0+d2FpdF9mb3JfZ211X2lkbGUoYWRyZW5vX2RldikpKSB7CiAJCWRldl9lcnIoJmdtdS0+cGRldi0+ZGV2LCAiU3RvcHBpbmcgR01VIGJlZm9yZSBpdCBpcyBpZGxlXG4iKTsKKwkJaWRsZSA9IGZhbHNlOworCQlzZXRfYml0KEdNVV9GQVVMVCwgJmdtdS0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCWlkbGUgPSB0cnVlOwogCX0KIAotCS8qIFBlbmRpbmcgbWVzc2FnZSBpbiBhbGwgcXVldWVzIGFyZSBhYmFuZG9uZWQgKi8KLQloZmlfc3RvcChnbXUpOwotCWNsZWFyX2JpdChHTVVfSEZJX09OLCAmZ211LT5mbGFncyk7Ci0JZ211X2lycV9kaXNhYmxlKGRldmljZSk7CisJaWYgKGlkbGUpIHsKKwkJLyogUGVuZGluZyBtZXNzYWdlIGluIGFsbCBxdWV1ZXMgYXJlIGFiYW5kb25lZCAqLworCQloZmlfc3RvcChnbXUpOworCQljbGVhcl9iaXQoR01VX0hGSV9PTiwgJmdtdS0+ZmxhZ3MpOworCQlnbXVfaXJxX2Rpc2FibGUoZGV2aWNlKTsKIAotCWdwdWRldi0+cnBtaF9ncHVfcHdyY3RybChhZHJlbm9fZGV2LCBHTVVfRldfU1RPUCwgMCwgMCk7Ci0JZ211X2Rpc2FibGVfY2xrcyhnbXUpOwotCWdtdV9kaXNhYmxlX2dkc2MoZ211KTsKLQotCS8qIFRPRE86IFZvdGUgQ1gsIE1YIHJldGVudGlvbiBvZmYgKi8KKwkJZ3B1ZGV2LT5ycG1oX2dwdV9wd3JjdHJsKGFkcmVub19kZXYsIEdNVV9GV19TVE9QLCAwLCAwKTsKKwkJZ211X2Rpc2FibGVfY2xrcyhnbXUpOworCQlnbXVfZGlzYWJsZV9nZHNjKGdtdSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHBvd2VyIGNvbnRyb2xsZXIgd2lsbCBjaGFuZ2Ugc3RhdGUgdG8gU0xVTUJFUiBhbnl3YXkKKwkJICogU2V0IEdNVV9GQVVMVCBmbGFnIHRvIGluZGljYXRlIHRvIHBvd2VyIGNvbnRybGxlcgorCQkgKiB0aGF0IGhhbmcgcmVjb3ZlcnkgaXMgbmVlZGVkIHRvIHBvd2VyIG9uIEdQVQorCQkgKi8KKwkJc2V0X2JpdChHTVVfRkFVTFQsICZnbXUtPmZsYWdzKTsKKwkJZ211X3NuYXBzaG90KGRldmljZSk7CisJfQogCiAJbXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoZ211LT5wY2wsIDApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfZ211LmggYi9kcml2ZXJzL2dwdS9tc20va2dzbF9nbXUuaAppbmRleCBjNTU4MDY3Li5mYzZiYWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9nbXUuaAorKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9nbXUuaApAQCAtNTYsNiArNTYsOSBAQAogI2RlZmluZSBHUFVCVVNZSUdOQUhCCQlCSVQoMjMpCiAjZGVmaW5lIENYR1hDUFVCVVNZSUdOQUhCCUJJVCgzMCkKIAorLyogR01VIHRpbWVvdXRzICovCisjZGVmaW5lIEdNVV9JRExFX1RJTUVPVVQgICAgICAgIDEwIC8qIG1zICovCisKIC8qIENvbnN0YW50cyBmb3IgR01VIE9PQnMgKi8KICNkZWZpbmUgT09CX0JPT1RfT1BUSU9OICAgICAgICAgMAogI2RlZmluZSBPT0JfU0xVTUJFUl9PUFRJT04gICAgICAxCkBAIC03MywxNiArNzYsMTcgQEAKICNkZWZpbmUgT09CX1BFUkZDTlRSX1NFVF9NQVNLCQlCSVQoMTcpCiAjZGVmaW5lIE9PQl9QRVJGQ05UUl9DSEVDS19NQVNLCQlCSVQoMjUpCiAjZGVmaW5lIE9PQl9QRVJGQ05UUl9DTEVBUl9NQVNLCQlCSVQoMjUpCi0jZGVmaW5lIE9PQl9HUFVTVEFSVF9TRVRfTUFTSwkJQklUKDE4KQotI2RlZmluZSBPT0JfR1BVU1RBUlRfQ0hFQ0tfTUFTSwkJQklUKDI2KQotI2RlZmluZSBPT0JfR1BVU1RBUlRfQ0xFQVJfTUFTSwkJQklUKDI2KQorI2RlZmluZSBPT0JfR1BVX1NFVF9NQVNLCQlCSVQoMTgpCisjZGVmaW5lIE9PQl9HUFVfQ0hFQ0tfTUFTSwkJQklUKDI2KQorI2RlZmluZSBPT0JfR1BVX0NMRUFSX01BU0sJCUJJVCgyNikKIAogLyogQml0cyBmb3IgdGhlIGZsYWdzIGZpZWxkIGluIHRoZSBnbXUgc3RydWN0dXJlICovCiBlbnVtIGdtdV9mbGFncyB7CiAJR01VX0JPT1RfSU5JVF9ET05FID0gMCwKIAlHTVVfQ0xLX09OID0gMSwKIAlHTVVfSEZJX09OID0gMiwKLQlHTVVfRkFVTFQgPSAzCisJR01VX0ZBVUxUID0gMywKKwlHTVVfRENWU19SRVBMQVkgPSA0LAogfTsKIAogLyoqCkBAIC0xNjYsNyArMTcwLDYgQEAKICAqCWFuZCBHUFUgcmVnaXN0ZXIgc2V0LCB0aGUgb2Zmc2V0IHdpbGwgYmUgdXNlZCB3aGVuIGFjY2Vzc2luZwogICoJZ211IHJlZ2lzdGVycyB1c2luZyBvZmZzZXQgZGVmaW5lZCBpbiBHUFUgcmVnaXN0ZXIgc3BhY2UuCiAgKiBAcGRjX3JlZ192aXJ0OiBzdGFydGluZyBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIGZvciBSUE1oIFBEQyByZWdpc3RlcnMKLSAqIEBjcHJfcmVnX3ZpcnQ6IHN0YXJ0aW5nIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIFJQTWggQ1BSIGNvbnRyb2xsZXIKICAqIEBnbXVfaW50ZXJydXB0X251bTogR01VIGludGVycnVwdCBudW1iZXIKICAqIEBmd19pbWFnZTogZGVzY3JpcHRvciBvZiBHTVUgbWVtb3J5IHRoYXQgaGFzIEdNVSBpbWFnZSBpbiBpdAogICogQGhmaV9tZW06IHBvaW50ZXIgdG8gSEZJIHNoYXJlZCBtZW1vcnkKQEAgLTE5NCw2ICsxOTcsNyBAQAogICogQHBjbDogR1BVIEJXIHNjYWxpbmcgY2xpZW50CiAgKiBAY2NsOiBDTk9DIEJXIHNjYWxpbmcgY2xpZW50CiAgKiBAaWRsZV9sZXZlbDogTWluaW1hbCBHUFUgaWRsZSBwb3dlciBsZXZlbAorICogQGZhdWx0X2NvdW50OiBHTVUgZmF1bHQgY291bnQKICAqLwogc3RydWN0IGdtdV9kZXZpY2UgewogCXVuc2lnbmVkIGludCB2ZXI7CkBAIC0yMDMsNyArMjA3LDYgQEAKIAl1bnNpZ25lZCBpbnQgcmVnX2xlbjsKIAl1bnNpZ25lZCBpbnQgZ211MmdwdV9vZmZzZXQ7CiAJdm9pZCBfX2lvbWVtICpwZGNfcmVnX3ZpcnQ7Ci0Jdm9pZCBfX2lvbWVtICpjcHJfcmVnX3ZpcnQ7CiAJdW5zaWduZWQgaW50IGdtdV9pbnRlcnJ1cHRfbnVtOwogCXN0cnVjdCBnbXVfbWVtZGVzYyBmd19pbWFnZTsKIAlzdHJ1Y3QgZ211X21lbWRlc2MgKmhmaV9tZW07CkBAIC0yMjgsNiArMjMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgcGNsOwogCXVuc2lnbmVkIGludCBjY2w7CiAJdW5zaWduZWQgaW50IGlkbGVfbGV2ZWw7CisJdW5zaWduZWQgaW50IGZhdWx0X2NvdW50OwogfTsKIAogYm9vbCBrZ3NsX2dtdV9pc2VuYWJsZWQoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfaGZpLmMgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9oZmkuYwppbmRleCA2OGUwZjNhLi4yY2M2MGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9oZmkuYworKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9oZmkuYwpAQCAtMjc4LDggKzI3OCw3IEBACiAJaW50IHJjID0gMDsKIAlzdHJ1Y3QgcGVuZGluZ19tc2cgbXNnOwogCi0JcmMgPSBoZmlfc2VuZF9tc2coZ211LCAoc3RydWN0IGhmaV9tc2dfaGRyICopJmluaXRfbXNnLAotCQkJbXNnX3NpemVfZHdvcmRzLCAmbXNnKTsKKwlyYyA9IGhmaV9zZW5kX21zZyhnbXUsICZpbml0X21zZy5oZHIsIG1zZ19zaXplX2R3b3JkcywgJm1zZyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTMwOSw4ICszMDgsNyBAQAogCWludCByYyA9IDA7CiAJc3RydWN0IHBlbmRpbmdfbXNnIG1zZzsKIAotCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgKHN0cnVjdCBoZmlfbXNnX2hkciAqKSZmd192ZXIsCi0JCQltc2dfc2l6ZV9kd29yZHMsICZtc2cpOworCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgJmZ3X3Zlci5oZHIsIG1zZ19zaXplX2R3b3JkcywgJm1zZyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTM0Niw4ICszNDQsNyBAQAogCQlsbWNvbmZpZy5sbV9lbmFibGVfYml0bWFzayA9CiAJCQkoMSA8PCAoZ211LT5sbV9kY3ZzX2xldmVsICsgMSkpIC0gMTsKIAotCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgKHN0cnVjdCBoZmlfbXNnX2hkciAqKSAmbG1jb25maWcsCi0JCQltc2dfc2l6ZV9kd29yZHMsICZtc2cpOworCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgJmxtY29uZmlnLmhkciwgbXNnX3NpemVfZHdvcmRzLCAmbXNnKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMzg4LDggKzM4NSw3IEBACiAKIAl9CiAKLQlyYyA9IGhmaV9zZW5kX21zZyhnbXUsIChzdHJ1Y3QgaGZpX21zZ19oZHIgKikmZGN2c3RibCwKLQkJCW1zZ19zaXplLCAmbXNnKTsKKwlyYyA9IGhmaV9zZW5kX21zZyhnbXUsICZkY3ZzdGJsLmhkciwgbXNnX3NpemUsICZtc2cpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC00NDEsOCArNDM3LDcgQEAKIAkJCQkJZ211LT5ycG1oX3ZvdGVzLmNub2Nfdm90ZXMuCiAJCQkJCWNtZF9kYXRhW2ldW2pdOwogCi0JcmMgPSBoZmlfc2VuZF9tc2coZ211LCAoc3RydWN0IGhmaV9tc2dfaGRyICopICZid3RibCwKLQkJCW1zZ19zaXplX2R3b3JkcywgJm1zZyk7CisJcmMgPSBoZmlfc2VuZF9tc2coZ211LCAmYnd0YmwuaGRyLCBtc2dfc2l6ZV9kd29yZHMsICZtc2cpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC00NTQsNiArNDQ5LDIyIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGhmaV9zZW5kX3Rlc3Qoc3RydWN0IGdtdV9kZXZpY2UgKmdtdSkKK3sKKwlzdHJ1Y3QgaGZpX3Rlc3RfY21kIHRlc3RfbXNnID0geworCQkuaGRyID0geworCQkJLmlkID0gSDJGX01TR19URVNULAorCQkJLnNpemUgPSBzaXplb2YodGVzdF9tc2cpID4+IDIsCisJCQkudHlwZSA9IEhGSV9NU0dfQ01ELAorCQl9LAorCX07CisJdWludDMyX3QgbXNnX3NpemVfZHdvcmRzID0gKHNpemVvZih0ZXN0X21zZykpID4+IDI7CisJc3RydWN0IHBlbmRpbmdfbXNnIG1zZzsKKworCXJldHVybiBoZmlfc2VuZF9tc2coZ211LCAoc3RydWN0IGhmaV9tc2dfaGRyICopJnRlc3RfbXNnLmhkciwKKwkJCW1zZ19zaXplX2R3b3JkcywgJm1zZyk7Cit9CisKIGludCBoZmlfc2VuZF9kY3ZzX3ZvdGUoc3RydWN0IGdtdV9kZXZpY2UgKmdtdSwgdWludDMyX3QgcGVyZl9pZHgsCiAJCXVpbnQzMl90IGJ3X2lkeCwgZW51bSBycG1fYWNrX3R5cGUgYWNrX3R5cGUpCiB7CkBAIC00NzgsOCArNDg5LDcgQEAKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCBwZW5kaW5nX21zZyBtc2c7CiAKLQlyYyA9IGhmaV9zZW5kX21zZyhnbXUsIChzdHJ1Y3QgaGZpX21zZ19oZHIgKikmZGN2c19jbWQsCi0JCQltc2dfc2l6ZV9kd29yZHMsICZtc2cpOworCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgJmRjdnNfY21kLmhkciwgbXNnX3NpemVfZHdvcmRzLCAmbXNnKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtNTExLDggKzUyMSw3IEBACiAJaWYgKGluaXRfcGVyZl9pZHggPj0gTUFYX0dYX0xFVkVMUyB8fCBpbml0X2J3X2lkeCA+PSBNQVhfR1hfTEVWRUxTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgKHN0cnVjdCBoZmlfbXNnX2hkciAqKSAmc2x1bWJlcl9jbWQsCi0JCQltc2dfc2l6ZV9kd29yZHMsICZtc2cpOworCXJjID0gaGZpX3NlbmRfbXNnKGdtdSwgJnNsdW1iZXJfY21kLmhkciwgbXNnX3NpemVfZHdvcmRzLCAmbXNnKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtNjE0LDEyICs2MjMsMTkgQEAKIAogCQlyZXN1bHQgPSBoZmlfc2VuZF9sbWNvbmZpZyhnbXUpOwogCQlpZiAocmVzdWx0KSB7Ci0JCQlkZXZfZXJyKGRldiwgIkZhaWxpcmUgZW5hYmxpbmcgbGltaXRzIG1hbmFnZW1lbnQgKCVkKVxuIiwKLQkJCQlyZXN1bHQpOworCQkJZGV2X2VycihkZXYsICJGYWlsdXJlIGVuYWJsaW5nIExNICglZClcbiIsCisJCQkJCXJlc3VsdCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CiAJfQogCisJLyogVGVsbCB0aGUgR01VIHdlIGFyZSBzZW5kaW5nIG5vIG1vcmUgSEZJcyB1bnRpbCB0aGUgbmV4dCBib290ICovCisJaWYgKEFEUkVOT19RVUlSSyhhZHJlbm9fZGV2LCBBRFJFTk9fUVVJUktfSEZJX1VTRV9SRUcpKSB7CisJCXJlc3VsdCA9IGhmaV9zZW5kX3Rlc3QoZ211KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCiAJc2V0X2JpdChHTVVfSEZJX09OLCAmZ211LT5mbGFncyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20va2dzbF9oZmkuaCBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2hmaS5oCmluZGV4IDQ3ZDA3ZDkuLjE5MTk4N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2hmaS5oCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX2hmaS5oCkBAIC0yMjgsNiArMjI4LDEwIEBACiAJdWludDMyX3QgZGRyX2NtZF9kYXRhW01BWF9HWF9MRVZFTFNdW01BWF9CV19DTURTXTsKIH07CiAKK3N0cnVjdCBoZmlfdGVzdF9jbWQgeworCXN0cnVjdCBoZmlfbXNnX2hkciBoZHI7Cit9OworCiBzdHJ1Y3QgYXJjX3ZvdGVfZGVzYyB7CiAJLyogSW4gY2FzZSBvZiBHUFUgZnJlcSB2b3RlLCBwcmltYXJ5IGlzIEdYLCBzZWNvbmRhcnkgaXMgTVgKIAkgKiBpbiBjYXNlIG9mIEdNVSBmcmVxIHZvdGUsIHByaW1hcnkgaXMgQ1gsIHNlY29uZGFyeSBpcyBNWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfbW11LmMgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9tbXUuYwppbmRleCA4ZWE0NDkyLi5hMGZkM2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9tbXUuYworKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9tbXUuYwpAQCAtMjYsNiArMjYsMTcgQEAKIAogc3RhdGljIHZvaWQgcGFnZXRhYmxlX3JlbW92ZV9zeXNmc19vYmplY3RzKHN0cnVjdCBrZ3NsX3BhZ2V0YWJsZSAqcGFnZXRhYmxlKTsKIAorc3RhdGljIHZvaWQgX2RlZmVycmVkX2Rlc3Ryb3koc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlzdHJ1Y3Qga2dzbF9wYWdldGFibGUgKnBhZ2V0YWJsZSA9IGNvbnRhaW5lcl9vZih3cywKKwkJCQkJc3RydWN0IGtnc2xfcGFnZXRhYmxlLCBkZXN0cm95X3dzKTsKKworCWlmIChQVF9PUF9WQUxJRChwYWdldGFibGUsIG1tdV9kZXN0cm95X3BhZ2V0YWJsZSkpCisJCXBhZ2V0YWJsZS0+cHRfb3BzLT5tbXVfZGVzdHJveV9wYWdldGFibGUocGFnZXRhYmxlKTsKKworCWtmcmVlKHBhZ2V0YWJsZSk7Cit9CisKIHN0YXRpYyB2b2lkIGtnc2xfZGVzdHJveV9wYWdldGFibGUoc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0IGtnc2xfcGFnZXRhYmxlICpwYWdldGFibGUgPSBjb250YWluZXJfb2Yoa3JlZiwKQEAgLTMzLDEwICs0NCw3IEBACiAKIAlrZ3NsX21tdV9kZXRhY2hfcGFnZXRhYmxlKHBhZ2V0YWJsZSk7CiAKLQlpZiAoUFRfT1BfVkFMSUQocGFnZXRhYmxlLCBtbXVfZGVzdHJveV9wYWdldGFibGUpKQotCQlwYWdldGFibGUtPnB0X29wcy0+bW11X2Rlc3Ryb3lfcGFnZXRhYmxlKHBhZ2V0YWJsZSk7Ci0KLQlrZnJlZShwYWdldGFibGUpOworCWtnc2xfc2NoZWR1bGVfd29yaygmcGFnZXRhYmxlLT5kZXN0cm95X3dzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGtnc2xfcHV0X3BhZ2V0YWJsZShzdHJ1Y3Qga2dzbF9wYWdldGFibGUgKnBhZ2V0YWJsZSkKQEAgLTI5OSw2ICszMDcsNyBAQAogCWtyZWZfaW5pdCgmcGFnZXRhYmxlLT5yZWZjb3VudCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmcGFnZXRhYmxlLT5sb2NrKTsKKwlJTklUX1dPUksoJnBhZ2V0YWJsZS0+ZGVzdHJveV93cywgX2RlZmVycmVkX2Rlc3Ryb3kpOwogCiAJcGFnZXRhYmxlLT5tbXUgPSBtbXU7CiAJcGFnZXRhYmxlLT5uYW1lID0gbmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX21tdS5oIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfbW11LmgKaW5kZXggNTZiYjMxNy4uN2E4YWI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfbW11LmgKKysrIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfbW11LmgKQEAgLTQyLDYgKzQyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdW5zaWduZWQgaW50IG5hbWU7CiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CisJc3RydWN0IHdvcmtfc3RydWN0IGRlc3Ryb3lfd3M7CiAKIAlzdHJ1Y3QgewogCQlhdG9taWNfdCBlbnRyaWVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfcG9vbC5jIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfcG9vbC5jCmluZGV4IDY4NWNlM2UuLmMzMWE4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3Bvb2wuYworKysgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9wb29sLmMKQEAgLTY1LDE5ICs2NSwyNiBAQAogCiAvKiBNYXAgdGhlIHBhZ2UgaW50byBrZXJuZWwgYW5kIHplcm8gaXQgb3V0ICovCiBzdGF0aWMgdm9pZAotX2tnc2xfcG9vbF96ZXJvX3BhZ2Uoc3RydWN0IHBhZ2UgKnApCitfa2dzbF9wb29sX3plcm9fcGFnZShzdHJ1Y3QgcGFnZSAqcCwgdW5zaWduZWQgaW50IHBvb2xfb3JkZXIpCiB7Ci0Jdm9pZCAqYWRkciA9IGttYXBfYXRvbWljKHApOworCWludCBpOwogCi0JbWVtc2V0KGFkZHIsIDAsIFBBR0VfU0laRSk7Ci0JZG1hY19mbHVzaF9yYW5nZShhZGRyLCBhZGRyICsgUEFHRV9TSVpFKTsKLQlrdW5tYXBfYXRvbWljKGFkZHIpOworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBwb29sX29yZGVyKTsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gbnRoX3BhZ2UocCwgaSk7CisJCXZvaWQgKmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKworCQltZW1zZXQoYWRkciwgMCwgUEFHRV9TSVpFKTsKKwkJZG1hY19mbHVzaF9yYW5nZShhZGRyLCBhZGRyICsgUEFHRV9TSVpFKTsKKwkJa3VubWFwX2F0b21pYyhhZGRyKTsKKwl9CiB9CiAKIC8qIEFkZCBhIHBhZ2UgdG8gc3BlY2lmaWVkIHBvb2wgKi8KIHN0YXRpYyB2b2lkCiBfa2dzbF9wb29sX2FkZF9wYWdlKHN0cnVjdCBrZ3NsX3BhZ2VfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnApCiB7CisJX2tnc2xfcG9vbF96ZXJvX3BhZ2UocCwgcG9vbC0+cG9vbF9vcmRlcik7CisKIAlzcGluX2xvY2soJnBvb2wtPmxpc3RfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmcC0+bHJ1LCAmcG9vbC0+cGFnZV9saXN0KTsKIAlwb29sLT5wYWdlX2NvdW50Kys7CkBAIC0zMjIsNiArMzI5LDcgQEAKIAkJCX0gZWxzZQogCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CisJCV9rZ3NsX3Bvb2xfemVyb19wYWdlKHBhZ2UsIG9yZGVyKTsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMzQxLDYgKzM0OSw3IEBACiAJCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIG9yZGVyKTsKIAkJCWlmIChwYWdlID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlfa2dzbF9wb29sX3plcm9fcGFnZShwYWdlLCBvcmRlcik7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CkBAIC0zNzAsMTIgKzM3OSwxMyBAQAogCQkJfSBlbHNlCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKworCQlfa2dzbF9wb29sX3plcm9fcGFnZShwYWdlLCBvcmRlcik7CiAJfQogCiBkb25lOgogCWZvciAoaiA9IDA7IGogPCAoKnBhZ2Vfc2l6ZSA+PiBQQUdFX1NISUZUKTsgaisrKSB7CiAJCXAgPSBudGhfcGFnZShwYWdlLCBqKTsKLQkJX2tnc2xfcG9vbF96ZXJvX3BhZ2UocCk7CiAJCXBhZ2VzW3Bjb3VudF0gPSBwOwogCQlwY291bnQrKzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20va2dzbF9wd3JjdHJsLmMgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9wd3JjdHJsLmMKaW5kZXggOGNjYTI0OC4uOTdlNWMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvbXNtL2tnc2xfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3B3cmN0cmwuYwpAQCAtMjE0LDE4ICsyMTQsMTAgQEAKIHN0YXRpYyBpbnQga2dzbF9idXNfc2NhbGVfcmVxdWVzdChzdHJ1Y3Qga2dzbF9kZXZpY2UgKmRldmljZSwKIAkJdW5zaWduZWQgaW50IGJ1c2xldmVsKQogewotCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CiAJc3RydWN0IGtnc2xfcHdyY3RybCAqcHdyID0gJmRldmljZS0+cHdyY3RybDsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIEdNVSBzY2FsZXMgQlcgKi8KLQlpZiAoa2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkpIHsKLQkJaWYgKCEoZ211LT5mbGFncyAmIEdNVV9IRklfT04pIHx8ICFidXNsZXZlbCkKLQkJCS8qIFplcm8gYnVzIGxldmVsIGlzIGludmFsaWQgZm9yIEdNVSB0byB2b3RlICovCi0JCQlyZXR1cm4gMDsKLQotCQlyZXQgPSBnbXVfZGN2c19zZXQoZ211LCBJTlZBTElEX0RDVlNfSURYLCBidXNsZXZlbCk7Ci0JfSBlbHNlIGlmIChwd3ItPnBjbCkgeworCWlmIChwd3ItPnBjbCkgewogCQkvKiBMaW51eCBidXMgZHJpdmVyIHNjYWxlcyBCVyAqLwogCQlyZXQgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdChwd3ItPnBjbCwgYnVzbGV2ZWwpOwogCX0KQEAgLTI1MiwxMiArMjQ0LDkgQEAKIAkvKiBHTVUgc2NhbGVzIEdQVSBmcmVxICovCiAJaWYgKGtnc2xfZ211X2lzZW5hYmxlZChkZXZpY2UpKSB7CiAJCS8qIElmIEdNVSBoYXMgbm90IGJlZW4gc3RhcnRlZCwgc2F2ZSBpdCAqLwotCQlpZiAoIShnbXUtPmZsYWdzICYgR01VX0hGSV9PTikpIHsKLQkJCS8qIEluIHNsdW1iZXIgdGhlIGNsb2NrIGlzIG9mZiBzbyB3ZSBhcmUgZG9uZSAqLwotCQkJaWYgKHB3cmxldmVsID09IChnbXUtPm51bV9ncHVwd3JsZXZlbHMgLSAxKSkKLQkJCQlyZXR1cm4gMDsKLQotCQkJZ211LT53YWtldXBfcHdybGV2ZWwgPSBwd3JsZXZlbDsKKwkJaWYgKCF0ZXN0X2JpdChHTVVfSEZJX09OLCAmZ211LT5mbGFncykpIHsKKwkJCS8qIHN0b3JlIGNsb2NrIGNoYW5nZSByZXF1ZXN0ICovCisJCQlzZXRfYml0KEdNVV9EQ1ZTX1JFUExBWSwgJmdtdS0+ZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMjY3LDYgKzI1Niw4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlyZXQgPSBnbXVfZGN2c19zZXQoZ211LCBwd3JsZXZlbCwgSU5WQUxJRF9EQ1ZTX0lEWCk7CisJCS8qIGluZGljYXRlIGFjdHVhbCBjbG9jayAgY2hhbmdlICovCisJCWNsZWFyX2JpdChHTVVfRENWU19SRVBMQVksICZnbXUtPmZsYWdzKTsKIAl9IGVsc2UKIAkJLyogTGludXggY2xvY2sgZHJpdmVyIHNjYWxlcyBHUFUgZnJlcSAqLwogCQlyZXQgPSBjbGtfc2V0X3JhdGUocHdyLT5ncnBfY2xrc1swXSwgcGwtPmdwdV9mcmVxKTsKQEAgLTI5MSw4ICsyODIsNyBAQAogCXVuc2lnbmVkIGxvbmcgYWI7CiAKIAkvKiB0aGUgYnVzIHNob3VsZCBiZSBPTiB0byB1cGRhdGUgdGhlIGFjdGl2ZSBmcmVxdWVuY3kgKi8KLQlpZiAoIShrZ3NsX2dtdV9pc2VuYWJsZWQoZGV2aWNlKSkgJiYgb24gJiYKLQkJISh0ZXN0X2JpdChLR1NMX1BXUkZMQUdTX0FYSV9PTiwgJnB3ci0+cG93ZXJfZmxhZ3MpKSkKKwlpZiAob24gJiYgISh0ZXN0X2JpdChLR1NMX1BXUkZMQUdTX0FYSV9PTiwgJnB3ci0+cG93ZXJfZmxhZ3MpKSkKIAkJcmV0dXJuOwogCS8qCiAJICogSWYgdGhlIGJ1cyBzaG91bGQgcmVtYWluIG9uIGNhbGN1bGF0ZSBvdXIgcmVxdWVzdCBhbmQgc3VibWl0IGl0LApAQCAtNDIxLDcgKzQxMSw4IEBACiAJICovCiAJa2dzbF9wd3JjdHJsX3NldF90aGVybWFsX2N5Y2xlKHB3ciwgbmV3X2xldmVsKTsKIAotCWlmIChuZXdfbGV2ZWwgPT0gb2xkX2xldmVsKQorCWlmIChuZXdfbGV2ZWwgPT0gb2xkX2xldmVsICYmCisJCSF0ZXN0X2JpdChHTVVfRENWU19SRVBMQVksICZkZXZpY2UtPmdtdS5mbGFncykpCiAJCXJldHVybjsKIAogCWtnc2xfcHdyc2NhbGVfdXBkYXRlX3N0YXRzKGRldmljZSk7CkBAIC0yNDk0LDYgKzI0ODUsOSBAQAogc3RhdGljIHZvaWQga2dzbF9wd3JjdHJsX2Rpc2FibGUoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UpCiB7CiAJaWYgKGtnc2xfZ211X2lzZW5hYmxlZChkZXZpY2UpKSB7CisJCXN0cnVjdCBrZ3NsX3B3cmN0cmwgKnB3ciA9ICZkZXZpY2UtPnB3cmN0cmw7CisKKwkJcHdyLT5hY3RpdmVfcHdybGV2ZWwgPSBwd3ItPm51bV9wd3JsZXZlbHMgLSAxOwogCQlrZ3NsX3B3cmN0cmxfYXhpKGRldmljZSwgS0dTTF9QV1JGTEFHU19PRkYpOwogCQlyZXR1cm4gZ211X3N0b3AoZGV2aWNlKTsKIAl9CkBAIC0yNjM4LDYgKzI2MzIsNyBAQAogX2F3YXJlKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlKQogewogCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBnbXVfZGV2aWNlICpnbXUgPSAmZGV2aWNlLT5nbXU7CiAKIAlzd2l0Y2ggKGRldmljZS0+c3RhdGUpIHsKIAljYXNlIEtHU0xfU1RBVEVfUkVTRVQ6CkBAIC0yNjU3LDE1ICsyNjUyLDQyIEBACiAJCWtnc2xfcHdyc2NhbGVfbWlkZnJhbWVfdGltZXJfY2FuY2VsKGRldmljZSk7CiAJCWJyZWFrOwogCWNhc2UgS0dTTF9TVEFURV9TTFVNQkVSOgorCQkvKiBpZiBHTVUgYWxyZWFkeSBpbiBGQVVMVCAqLworCQlpZiAoa2dzbF9nbXVfaXNlbmFibGVkKGRldmljZSkgJiYKKwkJCXRlc3RfYml0KEdNVV9GQVVMVCwgJmdtdS0+ZmxhZ3MpKSB7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwogCQlzdGF0dXMgPSBrZ3NsX3B3cmN0cmxfZW5hYmxlKGRldmljZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJfQotCWlmIChzdGF0dXMpCisKKwlpZiAoc3RhdHVzKSB7CisJCWlmIChrZ3NsX2dtdV9pc2VuYWJsZWQoZGV2aWNlKSkgeworCQkJLyogR01VIGhhbmcgcmVjb3ZlcnkgKi8KKwkJCWtnc2xfcHdyY3RybF9zZXRfc3RhdGUoZGV2aWNlLCBLR1NMX1NUQVRFX1JFU0VUKTsKKwkJCXNldF9iaXQoR01VX0ZBVUxULCAmZ211LT5mbGFncyk7CisJCQlzdGF0dXMgPSBrZ3NsX3B3cmN0cmxfZW5hYmxlKGRldmljZSk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJLyoKKwkJCQkgKiBDYW5ub3QgcmVjb3ZlciBHTVUgZmFpbHVyZQorCQkJCSAqIEdQVSB3aWxsIG5vdCBiZSBwb3dlcmVkIG9uCisJCQkJICovCisJCQkJV0FSTl9PTkNFKDEsICJGYWlsZWQgdG8gcmVjb3ZlciBHTVVcbiIpOworCQkJfQorCisJCQljbGVhcl9iaXQoR01VX0ZBVUxULCAmZ211LT5mbGFncyk7CisJCQlrZ3NsX3B3cmN0cmxfc2V0X3N0YXRlKGRldmljZSwgS0dTTF9TVEFURV9BV0FSRSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKIAkJa2dzbF9wd3JjdHJsX3JlcXVlc3Rfc3RhdGUoZGV2aWNlLCBLR1NMX1NUQVRFX05PTkUpOwotCWVsc2UKKwl9IGVsc2UgewogCQlrZ3NsX3B3cmN0cmxfc2V0X3N0YXRlKGRldmljZSwgS0dTTF9TVEFURV9BV0FSRSk7CisJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMxMTEsNyArMzEzMyw3IEBACiB7CiAJc3RydWN0IGtnc2xfcHdyX2xpbWl0ICpsaW1pdCA9IGxpbWl0X3B0cjsKIAotCWlmIChJU19FUlIobGltaXQpKQorCWlmIChJU19FUlJfT1JfTlVMTChsaW1pdCkpCiAJCXJldHVybjsKIAogCV91cGRhdGVfbGltaXRzKGxpbWl0LCBLR1NMX1BXUl9ERUxfTElNSVQsIDApOwpAQCAtMzEzMiw3ICszMTU0LDcgQEAKIAlzdHJ1Y3Qga2dzbF9wd3JfbGltaXQgKmxpbWl0ID0gbGltaXRfcHRyOwogCWludCBsZXZlbDsKIAotCWlmIChJU19FUlIobGltaXQpKQorCWlmIChJU19FUlJfT1JfTlVMTChsaW1pdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHdyID0gJmxpbWl0LT5kZXZpY2UtPnB3cmN0cmw7CkBAIC0zMTU0LDcgKzMxNzYsNyBAQAogewogCXN0cnVjdCBrZ3NsX3B3cl9saW1pdCAqbGltaXQgPSBsaW1pdF9wdHI7CiAKLQlpZiAoSVNfRVJSKGxpbWl0KSkKKwlpZiAoSVNfRVJSX09SX05VTEwobGltaXQpKQogCQlyZXR1cm47CiAKIAlfdXBkYXRlX2xpbWl0cyhsaW1pdCwgS0dTTF9QV1JfU0VUX0xJTUlULCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3B3cmN0cmwuaCBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3B3cmN0cmwuaAppbmRleCA1M2JiMjU1Li44NWJhYjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9wd3JjdHJsLmgKKysrIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfcHdyY3RybC5oCkBAIC0xNDUsNiArMTQ1LDcgQEAKICAqIEBwbV9xb3NfcmVxX2RtYSAtIHRoZSBwb3dlciBtYW5hZ2VtZW50IHF1YWxpdHkgb2Ygc2VydmljZSBzdHJ1Y3R1cmUKICAqIEBwbV9xb3NfYWN0aXZlX2xhdGVuY3kgLSBhbGxvd2VkIENQVSBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcyB3aGVuIGFjdGl2ZQogICogQHBtX3Fvc19jcHVfbWFza19sYXRlbmN5IC0gYWxsb3dlZCBDUFUgbWFzayBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcworICogQGlucHV0X2Rpc2FibGUgLSBUbyBkaXNhYmxlIEdQVSB3YWtldXAgb24gdG91Y2ggaW5wdXQgZXZlbnQKICAqIEBwbV9xb3Nfd2FrZXVwX2xhdGVuY3kgLSBhbGxvd2VkIENQVSBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcyBkdXJpbmcgd2FrZXVwCiAgKiBAYnVzX2NvbnRyb2wgLSB0cnVlIGlmIHRoZSBidXMgY2FsY3VsYXRpb24gaXMgaW5kZXBlbmRlbnQKICAqIEBidXNfbW9kIC0gbW9kaWZpZXIgZnJvbSB0aGUgY3VycmVudCBwb3dlciBsZXZlbCBmb3IgdGhlIGJ1cyB2b3RlCkBAIC0yMDAsNiArMjAxLDcgQEAKIAl1bnNpZ25lZCBpbnQgcG1fcW9zX2FjdGl2ZV9sYXRlbmN5OwogCXVuc2lnbmVkIGludCBwbV9xb3NfY3B1X21hc2tfbGF0ZW5jeTsKIAl1bnNpZ25lZCBpbnQgcG1fcW9zX3dha2V1cF9sYXRlbmN5OworCWJvb2wgaW5wdXRfZGlzYWJsZTsKIAlib29sIGJ1c19jb250cm9sOwogCWludCBidXNfbW9kOwogCXVuc2lnbmVkIGludCBidXNfcGVyY2VudF9hYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3B3cnNjYWxlLmMgYi9kcml2ZXJzL2dwdS9tc20va2dzbF9wd3JzY2FsZS5jCmluZGV4IDZmYjgxZWUuLjIwNTkwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3B3cnNjYWxlLmMKKysrIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfcHdyc2NhbGUuYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qga2dzbF9wd3JjdHJsICpwd3JjdHJsOwogCXN0cnVjdCBrZ3NsX3B3cnNjYWxlICpwd3JzY2FsZTsKLQlrdGltZV90IHRtcDsKKwlrdGltZV90IHRtcDEsIHRtcDI7CiAKIAlpZiAoZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNjI2LDYgKzYyNiw4IEBACiAJcHdyY3RybCA9ICZkZXZpY2UtPnB3cmN0cmw7CiAKIAltdXRleF9sb2NrKCZkZXZpY2UtPm11dGV4KTsKKworCXRtcDEgPSBrdGltZV9nZXQoKTsKIAkvKgogCSAqIElmIHRoZSBHUFUgY2xvY2sgaXMgb24gZ3JhYiB0aGUgbGF0ZXN0IHBvd2VyIGNvdW50ZXIKIAkgKiB2YWx1ZXMuICBPdGhlcndpc2UgdGhlIG1vc3QgcmVjZW50IEFDVElWRSB2YWx1ZXMgd2lsbApAQCAtNjMzLDkgKzYzNSw5IEBACiAJICovCiAJa2dzbF9wd3JzY2FsZV91cGRhdGVfc3RhdHMoZGV2aWNlKTsKIAotCXRtcCA9IGt0aW1lX2dldCgpOwotCXN0YXQtPnRvdGFsX3RpbWUgPSBrdGltZV91c19kZWx0YSh0bXAsIHB3cnNjYWxlLT50aW1lKTsKLQlwd3JzY2FsZS0+dGltZSA9IHRtcDsKKwl0bXAyID0ga3RpbWVfZ2V0KCk7CisJc3RhdC0+dG90YWxfdGltZSA9IGt0aW1lX3VzX2RlbHRhKHRtcDIsIHB3cnNjYWxlLT50aW1lKTsKKwlwd3JzY2FsZS0+dGltZSA9IHRtcDE7CiAKIAlzdGF0LT5idXN5X3RpbWUgPSBwd3JzY2FsZS0+YWNjdW1fc3RhdHMuYnVzeV90aW1lOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9tc20va2dzbF9zbmFwc2hvdC5jIGIvZHJpdmVycy9ncHUvbXNtL2tnc2xfc25hcHNob3QuYwppbmRleCA3Y2JkYTcyLi5mNzEwZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9tc20va2dzbF9zbmFwc2hvdC5jCisrKyBiL2RyaXZlcnMvZ3B1L21zbS9rZ3NsX3NuYXBzaG90LmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlICJrZ3NsX3NuYXBzaG90LmgiCiAjaW5jbHVkZSAiYWRyZW5vX2NwX3BhcnNlci5oIgogCitzdGF0aWMgdm9pZCBrZ3NsX3NuYXBzaG90X3NhdmVfZnJvemVuX29ianMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogLyogUGxhY2Vob2xkZXIgZm9yIGxpc3Qgb2YgaWIgb2JqZWN0cyB0aGF0IGNvbnRhaW4gYWxsIG9iamVjdHMgaW4gdGhhdCBJQiAqLwogCiBzdHJ1Y3Qga2dzbF9zbmFwc2hvdF9jcF9vYmogewpAQCAtMTgyLDcgKzE4NCw3IEBACiAJY29udGV4dCA9IGtnc2xfY29udGV4dF9nZXQoZGV2aWNlLCBoZWFkZXItPmN1cnJlbnRfY29udGV4dCk7CiAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgUFQgYmFzZSAqLwotCSBoZWFkZXItPnB0YmFzZSA9IGtnc2xfbW11X2dldF9jdXJyZW50X3R0YnIwKCZkZXZpY2UtPm1tdSk7CisJaGVhZGVyLT5wdGJhc2UgPSBrZ3NsX21tdV9nZXRfY3VycmVudF90dGJyMCgmZGV2aWNlLT5tbXUpOwogCiAJLyogQW5kIHRoZSBQSUQgZm9yIHRoZSB0YXNrIGxlYWRlciAqLwogCWlmIChjb250ZXh0KSB7CkBAIC0yMDYsNiArMjA4LDQ0IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKKy8qIFNuYXBzaG90IHRoZSBMaW51eCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworc3RhdGljIHNpemVfdCBzbmFwc2hvdF9vc19ub19jdHh0KHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLAorCXU4ICpidWYsIHNpemVfdCByZW1haW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGtnc2xfc25hcHNob3RfbGludXhfdjIgKmhlYWRlciA9CisJCShzdHJ1Y3Qga2dzbF9zbmFwc2hvdF9saW51eF92MiAqKWJ1ZjsKKwlzdHJ1Y3Qga2dzbF9wd3JjdHJsICpwd3IgPSAmZGV2aWNlLT5wd3JjdHJsOworCXNpemVfdCBzaXplID0gc2l6ZW9mKCpoZWFkZXIpOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciB0aGUgZGF0YSAqLworCWlmIChyZW1haW4gPCBzaXplKSB7CisJCVNOQVBTSE9UX0VSUl9OT01FTShkZXZpY2UsICJPUyIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoKmhlYWRlcikpOworCisJaGVhZGVyLT5vc2lkID0gS0dTTF9TTkFQU0hPVF9PU19MSU5VWF9WMzsKKworCS8qIEdldCB0aGUga2VybmVsIGJ1aWxkIGluZm9ybWF0aW9uICovCisJc3RybGNweShoZWFkZXItPnJlbGVhc2UsIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAorCQkJc2l6ZW9mKGhlYWRlci0+cmVsZWFzZSkpOworCXN0cmxjcHkoaGVhZGVyLT52ZXJzaW9uLCBpbml0X3V0c25hbWUoKS0+dmVyc2lvbiwKKwkJCXNpemVvZihoZWFkZXItPnZlcnNpb24pKTsKKworCS8qIEdldCB0aGUgVW5peCB0aW1lIGZvciB0aGUgdGltZXN0YW1wICovCisJaGVhZGVyLT5zZWNvbmRzID0gZ2V0X3NlY29uZHMoKTsKKworCS8qIFJlbWVtYmVyIHRoZSBwb3dlciBpbmZvcm1hdGlvbiAqLworCWhlYWRlci0+cG93ZXJfZmxhZ3MgPSBwd3ItPnBvd2VyX2ZsYWdzOworCWhlYWRlci0+cG93ZXJfbGV2ZWwgPSBwd3ItPmFjdGl2ZV9wd3JsZXZlbDsKKwloZWFkZXItPnBvd2VyX2ludGVydmFsX3RpbWVvdXQgPSBwd3ItPmludGVydmFsX3RpbWVvdXQ7CisJaGVhZGVyLT5ncnBjbGsgPSBrZ3NsX2dldF9jbGtyYXRlKHB3ci0+Z3JwX2Nsa3NbMF0pOworCisJLyogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBkYXRhIHNlZ21lbnQgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKwogc3RhdGljIHZvaWQga2dzbF9zbmFwc2hvdF9wdXRfb2JqZWN0KHN0cnVjdCBrZ3NsX3NuYXBzaG90X29iamVjdCAqb2JqKQogewogCWxpc3RfZGVsKCZvYmotPm5vZGUpOwpAQCAtNTcyLDE2ICs2MTIsMzQgQEAKIAlzbmFwc2hvdC0+c2l6ZSArPSBoZWFkZXItPnNpemU7CiB9CiAKK3N0YXRpYyB2b2lkIGtnc2xfZnJlZV9zbmFwc2hvdChzdHJ1Y3Qga2dzbF9zbmFwc2hvdCAqc25hcHNob3QpCit7CisJc3RydWN0IGtnc2xfc25hcHNob3Rfb2JqZWN0ICpvYmosICp0bXA7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzbmFwc2hvdC0+ZHVtcF9nYXRlKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIHRtcCwKKwkJCQkmc25hcHNob3QtPm9ial9saXN0LCBub2RlKQorCQlrZ3NsX3NuYXBzaG90X3B1dF9vYmplY3Qob2JqKTsKKworCWlmIChzbmFwc2hvdC0+bWVtcG9vbCkKKwkJdmZyZWUoc25hcHNob3QtPm1lbXBvb2wpOworCisJa2ZyZWUoc25hcHNob3QpOworCUtHU0xfQ09SRV9FUlIoInNuYXBzaG90OiBvYmplY3RzIHJlbGVhc2VkXG4iKTsKK30KKwogLyoqCiAgKiBrZ3NsX3NuYXBzaG90KCkgLSBjb25zdHJ1Y3QgYSBkZXZpY2Ugc25hcHNob3QKICAqIEBkZXZpY2U6IGRldmljZSB0byBzbmFwc2hvdAogICogQGNvbnRleHQ6IHRoZSBjb250ZXh0IHRoYXQgaXMgaHVuZywgbWlnaHQgYmUgTlVMTCBpZiB1bmtub3duLgorICogQGdtdV9mYXVsdDogd2hldGhlciB0aGlzIHNuYXBzaG90IGlzIHRyaWdnZXJlZCBieSBhIEdNVSBmYXVsdC4KICAqCiAgKiBHaXZlbiBhIGRldmljZSwgY29uc3RydWN0IGEgYmluYXJ5IHNuYXBzaG90IGR1bXAgb2YgdGhlIGN1cnJlbnQgZGV2aWNlIHN0YXRlCiAgKiBhbmQgc3RvcmUgaXQgaW4gdGhlIGRldmljZSBzbmFwc2hvdCBtZW1vcnkuCiAgKi8KIHZvaWQga2dzbF9kZXZpY2Vfc25hcHNob3Qoc3RydWN0IGtnc2xfZGV2aWNlICpkZXZpY2UsCi0JCXN0cnVjdCBrZ3NsX2NvbnRleHQgKmNvbnRleHQpCisJCXN0cnVjdCBrZ3NsX2NvbnRleHQgKmNvbnRleHQsIGJvb2wgZ211X2ZhdWx0KQogewogCXN0cnVjdCBrZ3NsX3NuYXBzaG90X2hlYWRlciAqaGVhZGVyID0gZGV2aWNlLT5zbmFwc2hvdF9tZW1vcnkucHRyOwogCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdDsKQEAgLTYwMiwxMSArNjYwLDIwIEBACiAJZGV2aWNlLT5zbmFwc2hvdF9mYXVsdGNvdW50Kys7CiAKIAkvKgotCSAqIFRoZSBmaXJzdCBoYW5nIGlzIGFsd2F5cyB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluLiBEb24ndCBjYXB0dXJlCi0JICogYSBuZXcgc25hcHNob3QgaW5zdGFuY2UgaWYgdGhlIG9sZCBvbmUgaGFzbid0IGJlZW4gZ3JhYmJlZCB5ZXQKKwkgKiBPdmVyd3JpdGUgYSBub24tR01VIGZhdWx0IHNuYXBzaG90IGlmIGEgR01VIGZhdWx0IG9jY3Vycy4KIAkgKi8KLQlpZiAoZGV2aWNlLT5zbmFwc2hvdCAhPSBOVUxMKQotCQlyZXR1cm47CisJaWYgKGRldmljZS0+c25hcHNob3QgIT0gTlVMTCkgeworCQlpZiAoIWdtdV9mYXVsdCB8fCBkZXZpY2UtPnNuYXBzaG90LT5nbXVfZmF1bHQpCisJCQlyZXR1cm47CisKKwkJLyoKKwkJICogSWYgYW5vdGhlciB0aHJlYWQgaXMgY3VycmVudGx5IHJlYWRpbmcgaXQsIHRoYXQgdGhyZWFkCisJCSAqIHdpbGwgZnJlZSBpdCwgb3RoZXJ3aXNlIGZyZWUgaXQgbm93LgorCQkgKi8KKwkJaWYgKCFkZXZpY2UtPnNuYXBzaG90LT5zeXNmc19yZWFkKQorCQkJa2dzbF9mcmVlX3NuYXBzaG90KGRldmljZS0+c25hcHNob3QpOworCQlkZXZpY2UtPnNuYXBzaG90ID0gTlVMTDsKKwl9CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzbmFwc2hvdCBpbnN0YW5jZSAqLwogCXNuYXBzaG90ID0ga3phbGxvYyhzaXplb2YoKnNuYXBzaG90KSwgR0ZQX0tFUk5FTCk7CkBAIC02MjEsNyArNjg4LDkgQEAKIAlzbmFwc2hvdC0+c3RhcnQgPSBkZXZpY2UtPnNuYXBzaG90X21lbW9yeS5wdHI7CiAJc25hcHNob3QtPnB0ciA9IGRldmljZS0+c25hcHNob3RfbWVtb3J5LnB0cjsKIAlzbmFwc2hvdC0+cmVtYWluID0gZGV2aWNlLT5zbmFwc2hvdF9tZW1vcnkuc2l6ZTsKLQlhdG9taWNfc2V0KCZzbmFwc2hvdC0+c3lzZnNfcmVhZCwgMCk7CisJc25hcHNob3QtPmdtdV9mYXVsdCA9IGdtdV9mYXVsdDsKKwlzbmFwc2hvdC0+Zmlyc3RfcmVhZCA9IHRydWU7CisJc25hcHNob3QtPnN5c2ZzX3JlYWQgPSAwOwogCiAJaGVhZGVyID0gKHN0cnVjdCBrZ3NsX3NuYXBzaG90X2hlYWRlciAqKSBzbmFwc2hvdC0+cHRyOwogCkBAIC02MzMsMTIgKzcwMiwyNCBAQAogCXNuYXBzaG90LT5zaXplICs9IHNpemVvZigqaGVhZGVyKTsKIAogCS8qIEJ1aWxkIHRoZSBMaW51eCBzcGVjaWZpYyBoZWFkZXIgKi8KLQlrZ3NsX3NuYXBzaG90X2FkZF9zZWN0aW9uKGRldmljZSwgS0dTTF9TTkFQU0hPVF9TRUNUSU9OX09TLAotCQkJc25hcHNob3QsIHNuYXBzaG90X29zLCBOVUxMKTsKKwkvKiBXZSBlaXRoZXIgd2FudCB0byBvbmx5IGR1bXAgR01VLCBvciB3ZSB3YW50IHRvIGR1bXAgR1BVIGFuZCBHTVUgKi8KKwlpZiAoZ211X2ZhdWx0KSB7CisJCS8qIER1bXAgb25seSB0aGUgR01VICovCisJCWtnc2xfc25hcHNob3RfYWRkX3NlY3Rpb24oZGV2aWNlLCBLR1NMX1NOQVBTSE9UX1NFQ1RJT05fT1MsCisJCQkJc25hcHNob3QsIHNuYXBzaG90X29zX25vX2N0eHQsIE5VTEwpOwogCi0JLyogR2V0IHRoZSBkZXZpY2Ugc3BlY2lmaWMgc2VjdGlvbnMgKi8KLQlpZiAoZGV2aWNlLT5mdGJsLT5zbmFwc2hvdCkKLQkJZGV2aWNlLT5mdGJsLT5zbmFwc2hvdChkZXZpY2UsIHNuYXBzaG90LCBjb250ZXh0KTsKKwkJaWYgKGRldmljZS0+ZnRibC0+c25hcHNob3RfZ211KQorCQkJZGV2aWNlLT5mdGJsLT5zbmFwc2hvdF9nbXUoZGV2aWNlLCBzbmFwc2hvdCk7CisJfSBlbHNlIHsKKwkJLyogRHVtcCBHUFUgYW5kIEdNVSAqLworCQlrZ3NsX3NuYXBzaG90X2FkZF9zZWN0aW9uKGRldmljZSwgS0dTTF9TTkFQU0hPVF9TRUNUSU9OX09TLAorCQkJCXNuYXBzaG90LCBzbmFwc2hvdF9vcywgTlVMTCk7CisKKwkJaWYgKGRldmljZS0+ZnRibC0+c25hcHNob3QpCisJCQlkZXZpY2UtPmZ0YmwtPnNuYXBzaG90KGRldmljZSwgc25hcHNob3QsIGNvbnRleHQpOworCQlpZiAoZGV2aWNlLT5mdGJsLT5zbmFwc2hvdF9nbXUpCisJCQlkZXZpY2UtPmZ0YmwtPnNuYXBzaG90X2dtdShkZXZpY2UsIHNuYXBzaG90KTsKKwl9CiAKIAkvKgogCSAqIFRoZSB0aW1lc3RhbXAgaXMgdGhlIHNlY29uZHMgc2luY2UgYm9vdCBzbyBpdCBpcyBlYXNpZXIgdG8gbWF0Y2ggdG8KQEAgLTcwOCw2ICs3ODksMzAgQEAKICNkZWZpbmUga29ial90b19kZXZpY2UoYSkgXAogY29udGFpbmVyX29mKGEsIHN0cnVjdCBrZ3NsX2RldmljZSwgc25hcHNob3Rfa29iaikKIAorc3RhdGljIGludCBzbmFwc2hvdF9yZWxlYXNlKHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLAorCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdCkKK3sKKwlib29sIHNuYXBzaG90X2ZyZWUgPSBmYWxzZTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOworCXNuYXBzaG90LT5zeXNmc19yZWFkLS07CisKKwkvKgorCSAqIElmIHNvbWVvbmUncyByZXBsYWNlZCB0aGUgc25hcHNob3QsIHJldHVybiBhbiBlcnJvciBhbmQgZnJlZQorCSAqIHRoZSBzbmFwc2hvdCBpZiB0aGlzIGlzIHRoZSBsYXN0IHRocmVhZCB0byByZWFkIGl0LgorCSAqLworCWlmIChkZXZpY2UtPnNuYXBzaG90ICE9IHNuYXBzaG90KSB7CisJCXJldCA9IC1FSU87CisJCWlmICghc25hcHNob3QtPnN5c2ZzX3JlYWQpCisJCQlzbmFwc2hvdF9mcmVlID0gdHJ1ZTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPm11dGV4KTsKKwlpZiAoc25hcHNob3RfZnJlZSkKKwkJa2dzbF9mcmVlX3NuYXBzaG90KHNuYXBzaG90KTsKKwlyZXR1cm4gcmV0OworfQorCiAvKiBEdW1wIHRoZSBzeXNmcyBiaW5hcnkgZGF0YSB0byB0aGUgdXNlciAqLwogc3RhdGljIHNzaXplX3Qgc25hcHNob3Rfc2hvdyhzdHJ1Y3QgZmlsZSAqZmlsZXAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsCkBAIC03MTUsMjAgKzgyMCwzNSBAQAogewogCXN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlID0ga29ial90b19kZXZpY2Uoa29iaik7CiAJc3RydWN0IGtnc2xfc25hcHNob3QgKnNuYXBzaG90OwotCXN0cnVjdCBrZ3NsX3NuYXBzaG90X29iamVjdCAqb2JqLCAqdG1wOwogCXN0cnVjdCBrZ3NsX3NuYXBzaG90X3NlY3Rpb25faGVhZGVyIGhlYWQ7CiAJc3RydWN0IHNuYXBzaG90X29ial9pdHIgaXRyOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoZGV2aWNlID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmZGV2aWNlLT5tdXRleCk7CiAJc25hcHNob3QgPSBkZXZpY2UtPnNuYXBzaG90OwotCWlmIChzbmFwc2hvdCAhPSBOVUxMKQotCQlhdG9taWNfaW5jKCZzbmFwc2hvdC0+c3lzZnNfcmVhZCk7CisJaWYgKHNuYXBzaG90ICE9IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgd2UncmUgcmVhZGluZyBhdCBhIG5vbi16ZXJvIG9mZnNldCBmcm9tIGEgbmV3IHNuYXBzaG90LAorCQkgKiB0aGF0IG1lYW5zIHdlIHdhbnQgdG8gcmVhZCBmcm9tIHRoZSBwcmV2aW91cyBzbmFwc2hvdCAod2hpY2gKKwkJICogd2FzIG92ZXJ3cml0dGVuKSwgc28gcmV0dXJuIGFuIGVycm9yCisJCSAqLworCQlpZiAoc25hcHNob3QtPmZpcnN0X3JlYWQpIHsKKwkJCWlmIChvZmYpCisJCQkJcmV0ID0gLUVJTzsKKwkJCWVsc2UKKwkJCQlzbmFwc2hvdC0+Zmlyc3RfcmVhZCA9IGZhbHNlOworCQl9CisJCWlmICghcmV0KQorCQkJc25hcHNob3QtPnN5c2ZzX3JlYWQrKzsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPm11dGV4KTsKIAorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBSZXR1cm4gbm90aGluZyBpZiB3ZSBoYXZlbid0IHRha2VuIGEgc25hcHNob3QgeWV0ICovCiAJaWYgKHNuYXBzaG90ID09IE5VTEwpCiAJCXJldHVybiAwOwpAQCAtNzM5LDcgKzg1OSw3IEBACiAJICovCiAJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZzbmFwc2hvdC0+ZHVtcF9nYXRlKTsKIAlpZiAocmV0KSB7Ci0JCWF0b21pY19kZWMoJnNuYXBzaG90LT5zeXNmc19yZWFkKTsKKwkJc25hcHNob3RfcmVsZWFzZShkZXZpY2UsIHNuYXBzaG90KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTc3NiwyOSArODk2LDIxIEBACiAJCWJvb2wgc25hcHNob3RfZnJlZSA9IGZhbHNlOwogCiAJCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc25hcHNob3QtPnN5c2ZzX3JlYWQpKSB7Ci0JCQlkZXZpY2UtPnNuYXBzaG90ID0gTlVMTDsKKwkJaWYgKC0tc25hcHNob3QtPnN5c2ZzX3JlYWQgPT0gMCkgeworCQkJaWYgKGRldmljZS0+c25hcHNob3QgPT0gc25hcHNob3QpCisJCQkJZGV2aWNlLT5zbmFwc2hvdCA9IE5VTEw7CiAJCQlzbmFwc2hvdF9mcmVlID0gdHJ1ZTsKIAkJfQogCQltdXRleF91bmxvY2soJmRldmljZS0+bXV0ZXgpOwogCi0JCWlmIChzbmFwc2hvdF9mcmVlKSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCB0bXAsCi0JCQkJCQkmc25hcHNob3QtPm9ial9saXN0LCBub2RlKQotCQkJCWtnc2xfc25hcHNob3RfcHV0X29iamVjdChvYmopOwotCi0JCQlpZiAoc25hcHNob3QtPm1lbXBvb2wpCi0JCQkJdmZyZWUoc25hcHNob3QtPm1lbXBvb2wpOwotCi0JCQlrZnJlZShzbmFwc2hvdCk7Ci0JCQlLR1NMX0NPUkVfRVJSKCJzbmFwc2hvdDogb2JqZWN0cyByZWxlYXNlZFxuIik7Ci0JCX0KKwkJaWYgKHNuYXBzaG90X2ZyZWUpCisJCQlrZ3NsX2ZyZWVfc25hcHNob3Qoc25hcHNob3QpOwogCQlyZXR1cm4gMDsKIAl9CiAKIGRvbmU6Ci0JYXRvbWljX2RlYygmc25hcHNob3QtPnN5c2ZzX3JlYWQpOwotCXJldHVybiBpdHIud3JpdGU7CisJcmV0ID0gc25hcHNob3RfcmVsZWFzZShkZXZpY2UsIHNuYXBzaG90KTsKKwlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogaXRyLndyaXRlOwogfQogCiAvKiBTaG93IHRoZSB0b3RhbCBudW1iZXIgb2YgaGFuZ3Mgc2luY2UgZGV2aWNlIGJvb3QgKi8KQEAgLTg2OSw5ICs5ODEsMTEgQEAKIC8qIFNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBjb2xsZWN0ZWQgc25hcHNob3QgKi8KIHN0YXRpYyBzc2l6ZV90IHRpbWVzdGFtcF9zaG93KHN0cnVjdCBrZ3NsX2RldmljZSAqZGV2aWNlLCBjaGFyICpidWYpCiB7Ci0JdW5zaWduZWQgbG9uZyB0aW1lc3RhbXAgPQotCQlkZXZpY2UtPnNuYXBzaG90ID8gZGV2aWNlLT5zbmFwc2hvdC0+dGltZXN0YW1wIDogMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKIAorCW11dGV4X2xvY2soJmRldmljZS0+bXV0ZXgpOworCXRpbWVzdGFtcCA9IGRldmljZS0+c25hcHNob3QgPyBkZXZpY2UtPnNuYXBzaG90LT50aW1lc3RhbXAgOiAwOworCW11dGV4X3VubG9jaygmZGV2aWNlLT5tdXRleCk7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWx1XG4iLCB0aW1lc3RhbXApOwogfQogCkBAIC0xMTI4LDcgKzEyNDIsNyBAQAogICogaXMgdGFrZW4KICAqIEB3b3JrOiBUaGUgd29yayBpdGVtIHRoYXQgc2NoZWR1bGVkIHRoaXMgd29yawogICovCi12b2lkIGtnc2xfc25hcHNob3Rfc2F2ZV9mcm96ZW5fb2JqcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBrZ3NsX3NuYXBzaG90X3NhdmVfZnJvemVuX29ianMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBrZ3NsX3NuYXBzaG90ICpzbmFwc2hvdCA9IGNvbnRhaW5lcl9vZih3b3JrLAogCQkJCXN0cnVjdCBrZ3NsX3NuYXBzaG90LCB3b3JrKTsKQEAgLTExNDAsNiArMTI1NCw5IEBACiAJaWYgKElTX0VSUl9PUl9OVUxMKGRldmljZSkpCiAJCXJldHVybjsKIAorCWlmIChzbmFwc2hvdC0+Z211X2ZhdWx0KQorCQlnb3RvIGdtdV9vbmx5OworCiAJa2dzbF9zbmFwc2hvdF9wcm9jZXNzX2liX29ial9saXN0KHNuYXBzaG90KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmc25hcHNob3QtPm9ial9saXN0LCBub2RlKSB7CkBAIC0xMTg2LDYgKzEzMDMsNyBAQAogCQkJICAgICAgICJzbmFwc2hvdDogQWN0aXZlIElCMjolMDE2bGx4IG5vdCBkdW1wZWRcbiIsCiAJCQkJc25hcHNob3QtPmliMmJhc2UpOwogCitnbXVfb25seToKIAljb21wbGV0ZV9hbGwoJnNuYXBzaG90LT5kdW1wX2dhdGUpOwogCUJVR19PTihkZXZpY2UtPmZvcmNlX3BhbmljKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IGQ3ZjZjZjAuLmQ0MmFjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMjQ4NSw2ICsyNDg1LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEFOSklULCAweDAwMDIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDAzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9QQU5KSVQsIDB4MDAwNCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUEVUWkwsIFVTQl9ERVZJQ0VfSURfUEVUWkxfSEVBRExBTVApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BISUxJUFMsIFVTQl9ERVZJQ0VfSURfUEhJTElQU19JRUVFODAyMTU0X0RPTkdMRSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUE9XRVJDT00sIFVTQl9ERVZJQ0VfSURfUE9XRVJDT01fVVBTKSB9LAogI2lmIElTX0VOQUJMRUQoQ09ORklHX01PVVNFX1NZTkFQVElDU19VU0IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggY2ZjYTQzZi4uMDhmZDNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtODE5LDYgKzgxOSw5IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUEVUQUxZTlgJCTB4MThiMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1BFVEFMWU5YX01BWFRFUl9SRU1PVEUJMHgwMDM3CiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QRVRaTAkJMHgyMTIyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUEVUWkxfSEVBRExBTVAJMHgxMjM0CisKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9QSElMSVBTCQkweDA0NzEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9QSElMSVBTX0lFRUU4MDIxNTRfRE9OR0xFIDB4MDYxNwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3FwbnAtYWRjLWN1cnJlbnQuYyBiL2RyaXZlcnMvaHdtb24vcXBucC1hZGMtY3VycmVudC5jCmluZGV4IGE1OTdlZjkuLmM0ZGE3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcXBucC1hZGMtY3VycmVudC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcXBucC1hZGMtY3VycmVudC5jCkBAIC0yNywxNyArMjcsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zcG1pLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaWZkZWYgQ09ORklHX1dBS0VMT0NLCi0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3FwbnAvcXBucC1hZGMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpZmRlZiBDT05GSUdfV0FLRUxPQ0sKLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgotI2VuZGlmCiAKIC8qIFFQTlAgSUFEQyByZWdpc3RlciBkZWZpbml0aW9uICovCiAjZGVmaW5lIFFQTlBfSUFEQ19SRVZJU0lPTjEJCQkJMHgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvS2NvbmZpZyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9LY29uZmlnCmluZGV4IDI4NWI4MGQuLjhkMjQyZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9LY29uZmlnCkBAIC0xNDgsNiArMTQ4LDI1IEBACiAJICBoYXJkd2FyZSBjb21wb25lbnQgdG8gYW5vdGhlci4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBwYXNzCiAJICBzb2Z0d2FyZSBnZW5lcmF0ZWQgZXZlbnRzLgogCitjb25maWcgQ09SRVNJR0hUX0VWRU5UCisgICAgICAgIHRyaXN0YXRlICJDb3JlU2lnaHQgRXZlbnQgZHJpdmVyIgorICAgICAgICBoZWxwCisgICAgICAgICAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVnaXN0ZXJpbmcgd2l0aCB2YXJpb3VzIGV2ZW50cworICAgICAgICAgIGFuZCBwZXJmb3JtaW5nIENvcmVTaWdodCBhY3Rpb25zIGxpa2UgYWJvcnRpbmcgdHJhY2Ugb24gdGhlaXIKKyAgICAgICAgICBvY2N1cnJlbmNlLiBUaGVzZSBldmVudHMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgdXNpbmcgbW9kdWxlCisgICAgICAgICAgcGFyYW1ldGVycy4KKworY29uZmlnIENPUkVTSUdIVF9UR1UKKwlib29sICJDb3JlU2lnaHQgVHJpZ2dlciBHZW5lcmF0aW9uIFVuaXQgZHJpdmVyIgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIFRyaWdnZXIgR2VuZXJhdGlvbiBVbml0IHRoYXQgaXMKKwkgIHVzZWQgdG8gZGV0ZWN0IHBhdHRlcm5zIG9yIHNlcXVlbmNlcyBvbiBhIGdpdmVuIHNldCBvZiBzaWduYWxzLgorCSAgVEdVIGlzIHVzZWQgdG8gbW9uaXRvciBhIHBhcnRpY3VsYXIgYnVzIHdpdGhpbiBhIGdpdmVuIHJlZ2lvbiB0bworCSAgZGV0ZWN0IGlsbGVnYWwgdHJhbnNhY3Rpb24gc2VxdWVuY2VzIG9yIHNsYXZlIHJlc3BvbnNlcy4gSXQgaXMgYWxzbworCSAgdXNlZCB0byBtb25pdG9yIGEgZGF0YSBzdHJlYW0gdG8gZGV0ZWN0IHByb3RvY29sIHZpb2xhdGlvbnMgYW5kIHRvCisJICBwcm92aWRlIGEgdHJpZ2dlciBwb2ludCBmb3IgY2VudGVyaW5nIGRhdGEgYXJvdW5kIGEgc3BlY2lmaWMgZXZlbnQKKwkgIHdpdGhpbiB0aGUgdHJhY2UgZGF0YSBidWZmZXIuCisKIGNvbmZpZyBDT1JFU0lHSFRfQ1NSCiAJYm9vbCAiQ29yZVNpZ2h0IFNsYXZlIFJlZ2lzdGVyIGRyaXZlciIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvTWFrZWZpbGUKaW5kZXggYWY5NGFkNy4uY2I0N2VjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9NYWtlZmlsZQpAQCAtNSw3ICs1LDggQEAKIG9iai0kKENPTkZJR19PRikgKz0gb2ZfY29yZXNpZ2h0Lm8KIG9iai0kKENPTkZJR19DT1JFU0lHSFRfTElOS19BTkRfU0lOS19UTUMpICs9IGNvcmVzaWdodC10bWMubyBcCiAJCQkJCSAgICAgY29yZXNpZ2h0LXRtYy1ldGYubyBcCi0JCQkJCSAgICAgY29yZXNpZ2h0LXRtYy1ldHIubworCQkJCQkgICAgIGNvcmVzaWdodC10bWMtZXRyLm8gXAorCQkJCQkgICAgIGNvcmVzaWdodC1ieXRlLWNudHIubwogb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9TSU5LX1RQSVUpICs9IGNvcmVzaWdodC10cGl1Lm8KIG9iai0kKENPTkZJR19DT1JFU0lHSFRfU0lOS19FVEJWMTApICs9IGNvcmVzaWdodC1ldGIxMC5vCiBvYmotJChDT05GSUdfQ09SRVNJR0hUX0xJTktTX0FORF9TSU5LUykgKz0gY29yZXNpZ2h0LWZ1bm5lbC5vIFwKQEAgLTE5LDcgKzIwLDkgQEAKIG9iai0kKENPTkZJR19DT1JFU0lHSFRfT1NUKSArPSBjb3Jlc2lnaHQtb3N0Lm8KIG9iai0kKENPTkZJR19DT1JFU0lHSFRfVFBEQSkgKz0gY29yZXNpZ2h0LXRwZGEubwogb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9UUERNKSArPSBjb3Jlc2lnaHQtdHBkbS5vCitvYmotJChDT05GSUdfQ09SRVNJR0hUX0VWRU5UKSArPSBjb3Jlc2lnaHQtZXZlbnQubwogb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9DVEkpICs9IGNvcmVzaWdodC1jdGkubworb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9UR1UpICs9IGNvcmVzaWdodC10Z3Uubwogb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9DU1IpICs9IGNvcmVzaWdodC1jc3Iubwogb2JqLSQoQ09ORklHX0NPUkVTSUdIVF9IV0VWRU5UKSArPSBjb3Jlc2lnaHQtaHdldmVudC5vCiBvYmotJChDT05GSUdfQ09SRVNJR0hUX0RVTU1ZKSArPSBjb3Jlc2lnaHQtZHVtbXkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ieXRlLWNudHIuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtYnl0ZS1jbnRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMjcxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtYnl0ZS1jbnRyLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJjb3Jlc2lnaHQtYnl0ZS1jbnRyLmgiCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKKyNpbmNsdWRlICJjb3Jlc2lnaHQtdG1jLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdG1jX2RydmRhdGEgKnRtY2RydmRhdGE7CisKK3N0YXRpYyB2b2lkIHRtY19ldHJfcmVhZF9ieXRlcyhzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YSwgbG9mZl90ICpwcG9zLAorCQkJICAgICAgIHNpemVfdCBieXRlcywgc2l6ZV90ICpsZW4pCit7CisJaWYgKCpsZW4gPj0gYnl0ZXMpIHsKKwkJYXRvbWljX2RlYygmYnl0ZV9jbnRyX2RhdGEtPmlycV9jbnQpOworCQkqbGVuID0gYnl0ZXM7CisJfSBlbHNlIHsKKwkJaWYgKCgodWludDMyX3QpKnBwb3MgJSBieXRlcykgKyAqbGVuID4gYnl0ZXMpCisJCQkqbGVuID0gYnl0ZXMgLSAoKHVpbnQzMl90KSpwcG9zICUgYnl0ZXMpOworCQlpZiAoKCpsZW4gKyAodWludDMyX3QpKnBwb3MpICUgYnl0ZXMgPT0gMCkKKwkJCWF0b21pY19kZWMoJmJ5dGVfY250cl9kYXRhLT5pcnFfY250KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRtY19ldHJfc2dfcmVhZF9wb3MobG9mZl90ICpwcG9zLAorCQkJCXNpemVfdCBieXRlcywgYm9vbCBub2lycSwgc2l6ZV90ICpsZW4sCisJCQkJY2hhciAqKmJ1ZnBwKQoreworCXVpbnQzMl90IHJ3cCwgaSA9IDA7CisJdWludDMyX3QgYmxrX251bSwgc2dfdGJsX251bSwgYmxrX251bV9sb2MsIHJlYWRfb2ZmOworCXVpbnQzMl90ICp2aXJ0X3B0ZSwgKnZpcnRfc3RfdGJsOworCXZvaWQgKnZpcnRfYmxrOworCXBoeXNfYWRkcl90IHBoeXNfcHRlOworCWludCB0b3RhbF9lbnRzID0gRElWX1JPVU5EX1VQKHRtY2RydmRhdGEtPnNpemUsIFBBR0VfU0laRSk7CisJaW50IGVudHNfcGVyX3BnID0gUEFHRV9TSVpFL3NpemVvZih1aW50MzJfdCk7CisKKwlpZiAoKmxlbiA9PSAwKQorCQlyZXR1cm47CisKKwlibGtfbnVtID0gKnBwb3MgLyBQQUdFX1NJWkU7CisJcmVhZF9vZmYgPSAqcHBvcyAlIFBBR0VfU0laRTsKKworCXZpcnRfc3RfdGJsID0gKHVpbnQzMl90ICopdG1jZHJ2ZGF0YS0+dmFkZHI7CisKKwkvKiBDb21wdXRlIHRhYmxlIGluZGV4IGFuZCBibG9jayBlbnRyeSBpbmRleCB3aXRoaW4gdGhhdCB0YWJsZSAqLworCWlmIChibGtfbnVtICYmIChibGtfbnVtID09ICh0b3RhbF9lbnRzIC0gMSkpICYmCisJICAgICEoYmxrX251bSAlIChlbnRzX3Blcl9wZyAtIDEpKSkgeworCQlzZ190YmxfbnVtID0gYmxrX251bSAvIGVudHNfcGVyX3BnOworCQlibGtfbnVtX2xvYyA9IGVudHNfcGVyX3BnIC0gMTsKKwl9IGVsc2UgeworCQlzZ190YmxfbnVtID0gYmxrX251bSAvIChlbnRzX3Blcl9wZyAtIDEpOworCQlibGtfbnVtX2xvYyA9IGJsa19udW0gJSAoZW50c19wZXJfcGcgLSAxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dfdGJsX251bTsgaSsrKSB7CisJCXZpcnRfcHRlID0gdmlydF9zdF90YmwgKyAoZW50c19wZXJfcGcgLSAxKTsKKwkJcGh5c19wdGUgPSBUTUNfRVRSX1NHX0VOVF9UT19CTEsoKnZpcnRfcHRlKTsKKwkJdmlydF9zdF90YmwgPSAodWludDMyX3QgKilwaHlzX3RvX3ZpcnQocGh5c19wdGUpOworCX0KKworCXZpcnRfcHRlID0gdmlydF9zdF90YmwgKyBibGtfbnVtX2xvYzsKKwlwaHlzX3B0ZSA9IFRNQ19FVFJfU0dfRU5UX1RPX0JMSygqdmlydF9wdGUpOworCXZpcnRfYmxrID0gcGh5c190b192aXJ0KHBoeXNfcHRlKTsKKworCSpidWZwcCA9IChjaGFyICopKHZpcnRfYmxrICsgcmVhZF9vZmYpOworCisJaWYgKG5vaXJxKSB7CisJCXJ3cCA9IHJlYWRsX3JlbGF4ZWQodG1jZHJ2ZGF0YS0+YmFzZSArIFRNQ19SV1ApOworCQl0bWNfZXRyX3NnX3J3cF9wb3ModG1jZHJ2ZGF0YSwgcndwKTsKKwkJaWYgKHRtY2RydmRhdGEtPnNnX2Jsa19udW0gPT0gYmxrX251bSAmJgorCQkgICAgcndwID49IChwaHlzX3B0ZSArIHJlYWRfb2ZmKSkKKwkJCSpsZW4gPSByd3AgLSBwaHlzX3B0ZSAtIHJlYWRfb2ZmOworCQllbHNlIGlmICh0bWNkcnZkYXRhLT5zZ19ibGtfbnVtID4gYmxrX251bSkKKwkJCSpsZW4gPSBQQUdFX1NJWkUgLSByZWFkX29mZjsKKwkJZWxzZQorCQkJKmxlbiA9IGJ5dGVzOworCX0gZWxzZSB7CisKKwkJaWYgKCpsZW4gPiAoUEFHRV9TSVpFIC0gcmVhZF9vZmYpKQorCQkJKmxlbiA9IFBBR0VfU0laRSAtIHJlYWRfb2ZmOworCisJCWlmICgqbGVuID49IChieXRlcyAtICgodWludDMyX3QpKnBwb3MgJSBieXRlcykpKQorCQkJKmxlbiA9IGJ5dGVzIC0gKCh1aW50MzJfdCkqcHBvcyAlIGJ5dGVzKTsKKworCQlpZiAoKCpsZW4gKyAodWludDMyX3QpKnBwb3MpICUgYnl0ZXMgPT0gMCkKKwkJCWF0b21pY19kZWMoJnRtY2RydmRhdGEtPmJ5dGVfY250ci0+aXJxX2NudCk7CisJfQorCisJLyoKKwkgKiBJbnZhbGlkYXRlIGNhY2hlIHJhbmdlIGJlZm9yZSByZWFkaW5nLiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgQ1BVCisJICogcmVhZHMgbGF0ZXN0IGNvbnRlbnRzIGZyb20gRERSCisJICovCisJZG1hY19pbnZfcmFuZ2UoKHZvaWQgKikoKmJ1ZnBwKSwgKHZvaWQgKikoKmJ1ZnBwKSArICpsZW4pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YSA9IGRhdGE7CisKKwlhdG9taWNfaW5jKCZieXRlX2NudHJfZGF0YS0+aXJxX2NudCk7CisKKwl3YWtlX3VwKCZieXRlX2NudHJfZGF0YS0+d3EpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCB0bWNfZXRyX2ZsdXNoX2J5dGVzKGxvZmZfdCAqcHBvcywgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKmxlbikKK3sKKwl1aW50MzJfdCByd3AgPSAwOworCisJcndwID0gcmVhZGxfcmVsYXhlZCh0bWNkcnZkYXRhLT5iYXNlICsgVE1DX1JXUCk7CisKKwlpZiAocndwID49ICh0bWNkcnZkYXRhLT5wYWRkciArICpwcG9zKSkgeworCQlpZiAoYnl0ZXMgPiAocndwIC0gdG1jZHJ2ZGF0YS0+cGFkZHIgLSAqcHBvcykpCisJCQkqbGVuID0gcndwIC0gdG1jZHJ2ZGF0YS0+cGFkZHIgLSAqcHBvczsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRtY19ldHJfYnl0ZV9jbnRyX3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGJ5dGVfY250ciAqYnl0ZV9jbnRyX2RhdGEgPSBmcC0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmJ1ZnA7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9sb2NrKTsKKwlpZiAoIWJ5dGVfY250cl9kYXRhLT5yZWFkX2FjdGl2ZSkKKwkJZ290byBlcnIwOworCisJaWYgKGJ5dGVfY250cl9kYXRhLT5lbmFibGUpIHsKKwkJaWYgKCFhdG9taWNfcmVhZCgmYnl0ZV9jbnRyX2RhdGEtPmlycV9jbnQpKSB7CisJCQltdXRleF91bmxvY2soJmJ5dGVfY250cl9kYXRhLT5ieXRlX2NudHJfbG9jayk7CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGJ5dGVfY250cl9kYXRhLT53cSwKKwkJCQlhdG9taWNfcmVhZCgmYnl0ZV9jbnRyX2RhdGEtPmlycV9jbnQpID4gMCkpCisJCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJCW11dGV4X2xvY2soJmJ5dGVfY250cl9kYXRhLT5ieXRlX2NudHJfbG9jayk7CisJCQlpZiAoIWJ5dGVfY250cl9kYXRhLT5yZWFkX2FjdGl2ZSkKKwkJCQlnb3RvIGVycjA7CisJCX0KKwkJYnVmcCA9IChjaGFyICopKHRtY2RydmRhdGEtPnZhZGRyICsgKnBwb3MpOworCisJCWlmICh0bWNkcnZkYXRhLT5tZW1fdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykKKwkJCXRtY19ldHJfcmVhZF9ieXRlcyhieXRlX2NudHJfZGF0YSwgcHBvcywKKwkJCQkJICAgYnl0ZV9jbnRyX2RhdGEtPmJsb2NrX3NpemUsICZsZW4pOworCQllbHNlCisJCQl0bWNfZXRyX3NnX3JlYWRfcG9zKHBwb3MsIGJ5dGVfY250cl9kYXRhLT5ibG9ja19zaXplLCAwLAorCQkJCQkgICAgJmxlbiwgJmJ1ZnApOworCisJfSBlbHNlIHsKKwkJaWYgKCFhdG9taWNfcmVhZCgmYnl0ZV9jbnRyX2RhdGEtPmlycV9jbnQpKSB7CisJCQlpZiAodG1jZHJ2ZGF0YS0+bWVtX3R5cGUgPT0gVE1DX0VUUl9NRU1fVFlQRV9DT05USUcpCisJCQkJdG1jX2V0cl9mbHVzaF9ieXRlcyhwcG9zLAorCQkJCQkJICAgIGJ5dGVfY250cl9kYXRhLT5ibG9ja19zaXplLAorCQkJCQkJICAgICZsZW4pOworCQkJZWxzZQorCQkJCXRtY19ldHJfc2dfcmVhZF9wb3MocHBvcywKKwkJCQkJCSAgICBieXRlX2NudHJfZGF0YS0+YmxvY2tfc2l6ZSwKKwkJCQkJCSAgICAxLAorCQkJCQkJICAgICZsZW4sICZidWZwKTsKKwkJCWlmICghbGVuKQorCQkJCWdvdG8gZXJyMDsKKwkJfSBlbHNlIHsKKwkJCWlmICh0bWNkcnZkYXRhLT5tZW1fdHlwZSA9PSBUTUNfRVRSX01FTV9UWVBFX0NPTlRJRykKKwkJCQl0bWNfZXRyX3JlYWRfYnl0ZXMoYnl0ZV9jbnRyX2RhdGEsIHBwb3MsCisJCQkJCQkgICBieXRlX2NudHJfZGF0YS0+YmxvY2tfc2l6ZSwKKwkJCQkJCSAgICZsZW4pOworCQkJZWxzZQorCQkJCXRtY19ldHJfc2dfcmVhZF9wb3MocHBvcywKKwkJCQkJCSAgICBieXRlX2NudHJfZGF0YS0+YmxvY2tfc2l6ZSwKKwkJCQkJCSAgICAxLAorCQkJCQkJICAgICZsZW4sICZidWZwKTsKKwkJfQorCX0KKworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgYnVmcCwgbGVuKSkgeworCQltdXRleF91bmxvY2soJmJ5dGVfY250cl9kYXRhLT5ieXRlX2NudHJfbG9jayk7CisJCWRldl9kYmcodG1jZHJ2ZGF0YS0+ZGV2LCAiJXM6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCpwcG9zICsgbGVuID49IHRtY2RydmRhdGEtPnNpemUpCisJCSpwcG9zID0gMDsKKwllbHNlCisJCSpwcG9zICs9IGxlbjsKK2VycjA6CisJbXV0ZXhfdW5sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZCB0bWNfZXRyX2J5dGVfY250cl9zdGFydChzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YSkKK3sKKwlpZiAoIWJ5dGVfY250cl9kYXRhKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCisJaWYgKGJ5dGVfY250cl9kYXRhLT5ibG9ja19zaXplID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCQlyZXR1cm47CisJfQorCisJYXRvbWljX3NldCgmYnl0ZV9jbnRyX2RhdGEtPmlycV9jbnQsIDApOworCWJ5dGVfY250cl9kYXRhLT5lbmFibGUgPSB0cnVlOworCW11dGV4X3VubG9jaygmYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0wodG1jX2V0cl9ieXRlX2NudHJfc3RhcnQpOworCit2b2lkIHRtY19ldHJfYnl0ZV9jbnRyX3N0b3Aoc3RydWN0IGJ5dGVfY250ciAqYnl0ZV9jbnRyX2RhdGEpCit7CisJaWYgKCFieXRlX2NudHJfZGF0YSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9sb2NrKTsKKwlieXRlX2NudHJfZGF0YS0+ZW5hYmxlID0gZmFsc2U7CisJY29yZXNpZ2h0X2Nzcl9zZXRfYnl0ZV9jbnRyKDApOworCW11dGV4X3VubG9jaygmYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9sb2NrKTsKKworfQorRVhQT1JUX1NZTUJPTCh0bWNfZXRyX2J5dGVfY250cl9zdG9wKTsKKworCitzdGF0aWMgaW50IHRtY19ldHJfYnl0ZV9jbnRyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbiwgc3RydWN0IGZpbGUgKmZwKQoreworCXN0cnVjdCBieXRlX2NudHIgKmJ5dGVfY250cl9kYXRhID0gZnAtPnByaXZhdGVfZGF0YTsKKworCW11dGV4X2xvY2soJmJ5dGVfY250cl9kYXRhLT5ieXRlX2NudHJfbG9jayk7CisJYnl0ZV9jbnRyX2RhdGEtPnJlYWRfYWN0aXZlID0gZmFsc2U7CisKKwljb3Jlc2lnaHRfY3NyX3NldF9ieXRlX2NudHIoMCk7CisJbXV0ZXhfdW5sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG1jX2V0cl9ieXRlX2NudHJfb3BlbihzdHJ1Y3QgaW5vZGUgKmluLCBzdHJ1Y3QgZmlsZSAqZnApCit7CisJc3RydWN0IGJ5dGVfY250ciAqYnl0ZV9jbnRyX2RhdGEgPQorCQkJY29udGFpbmVyX29mKGluLT5pX2NkZXYsIHN0cnVjdCBieXRlX2NudHIsIGRldik7CisKKwltdXRleF9sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCisJaWYgKCF0bWNkcnZkYXRhLT5lbmFibGUgfHwgIWJ5dGVfY250cl9kYXRhLT5ibG9ja19zaXplKSB7CisJCW11dGV4X3VubG9jaygmYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29yZXNpZ2h0X2Nzcl9zZXRfYnl0ZV9jbnRyKGJ5dGVfY250cl9kYXRhLT5ibG9ja19zaXplKTsKKwlmcC0+cHJpdmF0ZV9kYXRhID0gYnl0ZV9jbnRyX2RhdGE7CisJbm9uc2Vla2FibGVfb3BlbihpbiwgZnApOworCWJ5dGVfY250cl9kYXRhLT5lbmFibGUgPSB0cnVlOworCWJ5dGVfY250cl9kYXRhLT5yZWFkX2FjdGl2ZSA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZieXRlX2NudHJfZGF0YS0+Ynl0ZV9jbnRyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ5dGVfY250cl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB0bWNfZXRyX2J5dGVfY250cl9vcGVuLAorCS5yZWFkCQk9IHRtY19ldHJfYnl0ZV9jbnRyX3JlYWQsCisJLnJlbGVhc2UJPSB0bWNfZXRyX2J5dGVfY250cl9yZWxlYXNlLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworc3RhdGljIGludCBieXRlX2NudHJfcmVnaXN0ZXJfY2hhcmRldihzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBiYXNlbWlub3IgPSAwOworCXVuc2lnbmVkIGludCBjb3VudCA9IDE7CisJc3RydWN0IGRldmljZSAqZGV2aWNlOworCWRldl90IGRldjsKKworCXJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgYmFzZW1pbm9yLCBjb3VudCwgImJ5dGUtY250ciIpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiYWxsb2NfY2hyZGV2X3JlZ2lvbiBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWNkZXZfaW5pdCgmYnl0ZV9jbnRyX2RhdGEtPmRldiwgJmJ5dGVfY250cl9mb3BzKTsKKworCWJ5dGVfY250cl9kYXRhLT5kZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlieXRlX2NudHJfZGF0YS0+ZGV2Lm9wcyA9ICZieXRlX2NudHJfZm9wczsKKworCXJldCA9IGNkZXZfYWRkKCZieXRlX2NudHJfZGF0YS0+ZGV2LCBkZXYsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF91bnJlZ19jaHJkZXZfcmVnaW9uOworCisJYnl0ZV9jbnRyX2RhdGEtPmRyaXZlcl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwKKwkJCQkJCSAgICJjb3Jlc2lnaHQtdG1jLWV0ci1zdHJlYW0iKTsKKwlpZiAoSVNfRVJSKGJ5dGVfY250cl9kYXRhLT5kcml2ZXJfY2xhc3MpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXByX2VycigiY2xhc3NfY3JlYXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBleGl0X3VucmVnX2NocmRldl9yZWdpb247CisJfQorCisJZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShieXRlX2NudHJfZGF0YS0+ZHJpdmVyX2NsYXNzLCBOVUxMLAorCQkJICAgICAgIGJ5dGVfY250cl9kYXRhLT5kZXYuZGV2LCBieXRlX2NudHJfZGF0YSwKKwkJCSAgICAgICAiYnl0ZS1jbnRyIik7CisKKwlpZiAoSVNfRVJSKGRldmljZSkpIHsKKwkJcHJfZXJyKCJjbGFzc19kZXZpY2VfY3JlYXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Rlc3Ryb3lfY2xhc3M7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfZGVzdHJveV9jbGFzczoKKwljbGFzc19kZXN0cm95KGJ5dGVfY250cl9kYXRhLT5kcml2ZXJfY2xhc3MpOworZXhpdF91bnJlZ19jaHJkZXZfcmVnaW9uOgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihieXRlX2NudHJfZGF0YS0+ZGV2LmRldiwgMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGJ5dGVfY250ciAqYnl0ZV9jbnRyX2luaXQoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2LAorCQkJCSBzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CisJaW50IGJ5dGVfY250cl9pcnE7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YTsKKworCWJ5dGVfY250cl9pcnEgPSBvZl9pcnFfZ2V0X2J5bmFtZShucCwgImJ5dGUtY250ci1pcnEiKTsKKwlpZiAoYnl0ZV9jbnRyX2lycSA8IDApCisJCXJldHVybiBOVUxMOworCisJYnl0ZV9jbnRyX2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmJ5dGVfY250cl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFieXRlX2NudHJfZGF0YSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgYnl0ZV9jbnRyX2lycSwgZXRyX2hhbmRsZXIsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfU0hBUkVELAorCQkJICAgICAgICJ0bWMtZXRyIiwgYnl0ZV9jbnRyX2RhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2bV9rZnJlZShkZXYsIGJ5dGVfY250cl9kYXRhKTsKKwkJZGV2X2VycihkZXYsICJCeXRlX2NudHIgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBieXRlX2NudHJfcmVnaXN0ZXJfY2hhcmRldihieXRlX2NudHJfZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZtX2ZyZWVfaXJxKGRldiwgYnl0ZV9jbnRyX2lycSwgYnl0ZV9jbnRyX2RhdGEpOworCQlkZXZtX2tmcmVlKGRldiwgYnl0ZV9jbnRyX2RhdGEpOworCQlkZXZfZXJyKGRldiwgIkJ5dGVfY250ciBjaGFyIGRldiByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdG1jZHJ2ZGF0YSA9IGRydmRhdGE7CisJYnl0ZV9jbnRyX2RhdGEtPmJ5dGVfY250cl9pcnEgPSBieXRlX2NudHJfaXJxOworCWF0b21pY19zZXQoJmJ5dGVfY250cl9kYXRhLT5pcnFfY250LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXRlX2NudHJfZGF0YS0+d3EpOworCW11dGV4X2luaXQoJmJ5dGVfY250cl9kYXRhLT5ieXRlX2NudHJfbG9jayk7CisKKwlyZXR1cm4gYnl0ZV9jbnRyX2RhdGE7Cit9CitFWFBPUlRfU1lNQk9MKGJ5dGVfY250cl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtYnl0ZS1jbnRyLmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWJ5dGUtY250ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTkwODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWJ5dGUtY250ci5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX0NPUkVTSUdIVF9CWVRFX0NOVFJfSAorI2RlZmluZSBfQ09SRVNJR0hUX0JZVEVfQ05UUl9ICisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKK3N0cnVjdCBieXRlX2NudHIgeworCXN0cnVjdCBjZGV2CQlkZXY7CisJc3RydWN0IGNsYXNzCQkqZHJpdmVyX2NsYXNzOworCWJvb2wJCQllbmFibGU7CisJYm9vbAkJCXJlYWRfYWN0aXZlOworCXVpbnQzMl90CQlieXRlX2NudHJfdmFsdWU7CisJdWludDMyX3QJCWJsb2NrX3NpemU7CisJaW50CQkJYnl0ZV9jbnRyX2lycTsKKwlhdG9taWNfdAkJaXJxX2NudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cTsKKwlzdHJ1Y3QgbXV0ZXgJCWJ5dGVfY250cl9sb2NrOworfTsKKworZXh0ZXJuIHZvaWQgdG1jX2V0cl9ieXRlX2NudHJfc3RhcnQoc3RydWN0IGJ5dGVfY250ciAqYnl0ZV9jbnRyX2RhdGEpOworZXh0ZXJuIHZvaWQgdG1jX2V0cl9ieXRlX2NudHJfc3RvcChzdHJ1Y3QgYnl0ZV9jbnRyICpieXRlX2NudHJfZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jCmluZGV4IDcxZTQxMDMuLmVlNGI4YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmMKQEAgLTk3Niw3ICs5NzYsMTIgQEAKIAogCXNwaW5fbG9ja19pbml0KCZkcnZkYXRhLT5zcGlubG9jayk7CiAKLQlkcnZkYXRhLT5jcHUgPSBwZGF0YSA/IHBkYXRhLT5jcHUgOiAwOworCWRydmRhdGEtPmNwdSA9IHBkYXRhID8gcGRhdGEtPmNwdSA6IC0xOworCisJaWYgKGRydmRhdGEtPmNwdSA9PSAtMSkgeworCQlkZXZfaW5mbyhkZXYsICJDUFUgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV2ZW50LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXZlbnQuYwpAQCAtMCwwICsxLDE2OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3Jlc2lnaHQuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9leGNlcHRpb24uaD4KKworc3RhdGljIGludCBldmVudF9hYm9ydF9lbmFibGU7CitzdGF0aWMgaW50IGV2ZW50X2Fib3J0X3NldChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKK21vZHVsZV9wYXJhbV9jYWxsKGV2ZW50X2Fib3J0X2VuYWJsZSwgZXZlbnRfYWJvcnRfc2V0LCBwYXJhbV9nZXRfaW50LAorCQkgICZldmVudF9hYm9ydF9lbmFibGUsIDA2NDQpOworCitzdGF0aWMgaW50IGV2ZW50X2Fib3J0X2Vhcmx5X3BhbmljID0gMTsKK3N0YXRpYyBpbnQgZXZlbnRfYWJvcnRfb25fcGFuaWNfc2V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOworbW9kdWxlX3BhcmFtX2NhbGwoZXZlbnRfYWJvcnRfZWFybHlfcGFuaWMsIGV2ZW50X2Fib3J0X29uX3BhbmljX3NldCwKKwkJICBwYXJhbV9nZXRfaW50LCAmZXZlbnRfYWJvcnRfZWFybHlfcGFuaWMsIDA2NDQpOworCitzdGF0aWMgdm9pZCBldmVudF9hYm9ydF91c2VyX2ZhdWx0KHZvaWQgKmlnbm9yZSwKKwkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCSAgIHVuc2lnbmVkIGludCBmc3IpCit7CisJY29yZXNpZ2h0X2Fib3J0KCk7CisJcHJfZGVidWcoImNvcmVzaWdodF9ldmVudDogdGFza19uYW1lOiAlcywgYWRkcjogJWx1LCBmc3I6JXUiLAorCQkoY2hhciAqKXRhc2stPmNvbW0sIGFkZHIsIGZzcik7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X2Fib3J0X3VuZGVmX2luc3RyKHZvaWQgKmlnbm9yZSwKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgIHZvaWQgX191c2VyICpwYykKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWNvcmVzaWdodF9hYm9ydCgpOworCQlwcl9kZWJ1ZygiY29yZXNpZ2h0X2V2ZW50OiBwYzogJXBLIiwgcGMpOworCX0KK30KKworc3RhdGljIHZvaWQgZXZlbnRfYWJvcnRfdW5oYW5kbGVkX2Fib3J0KHZvaWQgKmlnbm9yZSwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJdW5zaWduZWQgaW50IGZzcikKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWNvcmVzaWdodF9hYm9ydCgpOworCQlwcl9kZWJ1ZygiY29yZXNpZ2h0X2V2ZW50OiBhZGRyOiAlbHUsIGZzcjoldSIsIGFkZHIsIGZzcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBldmVudF9hYm9ydF9rZXJuZWxfcGFuaWModm9pZCAqaWdub3JlLCBsb25nIHN0YXRlKQoreworCWNvcmVzaWdodF9hYm9ydCgpOworfQorCitzdGF0aWMgaW50IGV2ZW50X2Fib3J0X3JlZ2lzdGVyKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ2lzdGVyX3RyYWNlX3VzZXJfZmF1bHQoZXZlbnRfYWJvcnRfdXNlcl9mYXVsdCwgTlVMTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdXNyX2ZhdWx0OworCXJldCA9IHJlZ2lzdGVyX3RyYWNlX3VuZGVmX2luc3RyKGV2ZW50X2Fib3J0X3VuZGVmX2luc3RyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmRlZl9pbnN0cjsKKwlyZXQgPSByZWdpc3Rlcl90cmFjZV91bmhhbmRsZWRfYWJvcnQoZXZlbnRfYWJvcnRfdW5oYW5kbGVkX2Fib3J0LCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmhhbmRsZWRfYWJvcnQ7CisKKwlyZXR1cm4gMDsKKworZXJyX3VuaGFuZGxlZF9hYm9ydDoKKwl1bnJlZ2lzdGVyX3RyYWNlX3VuZGVmX2luc3RyKGV2ZW50X2Fib3J0X3VuZGVmX2luc3RyLCBOVUxMKTsKK2Vycl91bmRlZl9pbnN0cjoKKwl1bnJlZ2lzdGVyX3RyYWNlX3VzZXJfZmF1bHQoZXZlbnRfYWJvcnRfdXNlcl9mYXVsdCwgTlVMTCk7CitlcnJfdXNyX2ZhdWx0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50X2Fib3J0X3VucmVnaXN0ZXIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3RyYWNlX3VzZXJfZmF1bHQoZXZlbnRfYWJvcnRfdXNlcl9mYXVsdCwgTlVMTCk7CisJdW5yZWdpc3Rlcl90cmFjZV91bmRlZl9pbnN0cihldmVudF9hYm9ydF91bmRlZl9pbnN0ciwgTlVMTCk7CisJdW5yZWdpc3Rlcl90cmFjZV91bmhhbmRsZWRfYWJvcnQoZXZlbnRfYWJvcnRfdW5oYW5kbGVkX2Fib3J0LCBOVUxMKTsKK30KKworc3RhdGljIGludCBldmVudF9hYm9ydF9zZXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGFyYW1fc2V0X2ludCh2YWwsIGtwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiY29yZXNpZ2h0X2V2ZW50OiBlcnJvciBzZXR0aW5nIHZhbHVlICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChldmVudF9hYm9ydF9lbmFibGUpCisJCXJldCA9IGV2ZW50X2Fib3J0X3JlZ2lzdGVyKCk7CisJZWxzZQorCQlldmVudF9hYm9ydF91bnJlZ2lzdGVyKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV2ZW50X2Fib3J0X29uX3BhbmljX3NldChjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwYXJhbV9zZXRfaW50KHZhbCwga3ApOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJjb3Jlc2lnaHRfZXZlbnQ6IGVycm9yIHNldHRpbmcgdmFsIG9uIHBhbmljICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChldmVudF9hYm9ydF9lYXJseV9wYW5pYykgeworCQl1bnJlZ2lzdGVyX3RyYWNlX2tlcm5lbF9wYW5pY19sYXRlKGV2ZW50X2Fib3J0X2tlcm5lbF9wYW5pYywKKwkJCQkJCSAgIE5VTEwpOworCQkgcmV0ID0gcmVnaXN0ZXJfdHJhY2Vfa2VybmVsX3BhbmljKGV2ZW50X2Fib3J0X2tlcm5lbF9wYW5pYywKKwkJCQkJCSAgTlVMTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeworCQl1bnJlZ2lzdGVyX3RyYWNlX2tlcm5lbF9wYW5pYyhldmVudF9hYm9ydF9rZXJuZWxfcGFuaWMsIE5VTEwpOworCQlyZXQgPSByZWdpc3Rlcl90cmFjZV9rZXJuZWxfcGFuaWNfbGF0ZShldmVudF9hYm9ydF9rZXJuZWxfcGFuaWMsCisJCQkJCQkJTlVMTCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJcHJfZXJyKCJjb3Jlc2lnaHRfZXZlbnQ6IGVycm9yIHJlZ2lzdGVyaW5nIHBhbmljIGV2ZW50ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGV2ZW50X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnaXN0ZXJfdHJhY2Vfa2VybmVsX3BhbmljKGV2ZW50X2Fib3J0X2tlcm5lbF9wYW5pYywgTlVMTCk7CisJaWYgKHJldCkgeworCQkvKiBXZSBkbyBub3Qgd2FudCB0byBmYWlsIG1vZHVsZSBpbml0LiBUaGlzIG1vZHVsZSBjYW4gc3RpbGwKKwkJICogYmUgdXNlZCB0byByZWdpc3RlciBvdGhlciBhYm9ydCBldmVudHMuCisJCSAqLworCQlwcl9lcnIoImNvcmVzaWdodF9ldmVudDogZXJyb3IgcmVnaXN0ZXJpbmcgb24gcGFuaWMgJWRcbiIsIHJldCk7CisJfQorCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZXZlbnRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldmVudF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl90cmFjZV9rZXJuZWxfcGFuaWMoZXZlbnRfYWJvcnRfa2VybmVsX3BhbmljLCBOVUxMKTsKK30KK21vZHVsZV9leGl0KGV2ZW50X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmVzaWdodCBFdmVudCBkcml2ZXIgdG8gYWJvcnQgdHJhY2luZyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1wcml2LmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAppbmRleCAzYWYzNThhLi5hZmU5ZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaApAQCAtMTUzLDEyICsxNTMsMTQgQEAKIGV4dGVybiB2b2lkIG1zbV9xZHNzX2Nzcl9kaXNhYmxlX2JhbV90b191c2Iodm9pZCk7CiBleHRlcm4gdm9pZCBtc21fcWRzc19jc3JfZGlzYWJsZV9mbHVzaCh2b2lkKTsKIGV4dGVybiBpbnQgY29yZXNpZ2h0X2Nzcl9od2N0cmxfc2V0KHVpbnQ2NF90IGFkZHIsIHVpbnQzMl90IHZhbCk7CitleHRlcm4gdm9pZCBjb3Jlc2lnaHRfY3NyX3NldF9ieXRlX2NudHIodWludDMyX3QgY291bnQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBtc21fcWRzc19jc3JfZW5hYmxlX2JhbV90b191c2Iodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBtc21fcWRzc19jc3JfZGlzYWJsZV9iYW1fdG9fdXNiKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3Fkc3NfY3NyX2Rpc2FibGVfZmx1c2godm9pZCkge30KLXN0YXRpYyBpbmxpbmUgaW50IGNvcmVzaWdodF9jc3JfaHdjdHJsX3NldCh1aW50NjRfdCBhZGRyLAk5NQorc3RhdGljIGlubGluZSBpbnQgY29yZXNpZ2h0X2Nzcl9od2N0cmxfc2V0KHVpbnQ2NF90IGFkZHIsCiAJCQkJCSAgIHVpbnQzMl90IHZhbCkgeyByZXR1cm4gLUVJTlZBTDsgfQorc3RhdGljIGlubGluZSB2b2lkIGNvcmVzaWdodF9jc3Jfc2V0X2J5dGVfY250cih1aW50MzJfdCBjb3VudCkge30KICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdGd1LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRndS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTlmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRndS5jCkBAIC0wLDAgKzEsNTM0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC5oPgorCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKKworI2RlZmluZSB0Z3Vfd3JpdGVsKGRydmRhdGEsIHZhbCwgb2ZmKQlfX3Jhd193cml0ZWwoKHZhbCksIGRydmRhdGEtPmJhc2UgKyBvZmYpCisjZGVmaW5lIHRndV9yZWFkbChkcnZkYXRhLCBvZmYpCQlfX3Jhd19yZWFkbChkcnZkYXRhLT5iYXNlICsgb2ZmKQorCisjZGVmaW5lIFRHVV9MT0NLKGRydmRhdGEpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwltYigpOyAvKiBlbnN1cmUgY29uZmlndXJhdGlvbiB0YWtlIGVmZmVjdCBiZWZvcmUgd2UgbG9jayBpdCAqLwlcCisJdGd1X3dyaXRlbChkcnZkYXRhLCAweDAsIENPUkVTSUdIVF9MQVIpOwkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFRHVV9VTkxPQ0soZHJ2ZGF0YSkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXRndV93cml0ZWwoZHJ2ZGF0YSwgQ09SRVNJR0hUX1VOTE9DSywgQ09SRVNJR0hUX0xBUik7CQlcCisJbWIoKTsgLyogZW5zdXJlIHVubG9jayB0YWtlIGVmZmVjdCBiZWZvcmUgd2UgY29uZmlndXJlICovCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEdVX0NPTlRST0wJCQkweDAwMDAKKyNkZWZpbmUgVElNRVIwX1NUQVRVUwkJCTB4MDAwNAorI2RlZmluZSBDT1VOVEVSMF9TVEFUVVMJCQkweDAwMEMKKyNkZWZpbmUgVEdVX1NUQVRVUwkJCTB4MDAxNAorI2RlZmluZSBUSU1FUjBfQ09NUEFSRV9TVEVQKG4pCQkoMHgwMDQwICsgMHgxRDggKiBuKQorI2RlZmluZSBDT1VOVEVSMF9DT01QQVJFX1NURVAobikJKDB4MDA0OCArIDB4MUQ4ICogbikKKyNkZWZpbmUgR1JPVVBfUkVHX1NURVAoZ3JwLCByZWcsIHN0ZXApCSgweDAwNzQgKyAweDYwICogZ3JwICsgMHg0ICogcmVnICsgXAorCQkJCQkJCQkgMHgxRDggKiBzdGVwKQorI2RlZmluZSBDT05ESVRJT05fREVDT0RFX1NURVAobSwgbikJKDB4MDA1MCArIDB4NCAqIG0gKyAweDFEOCAqIG4pCisjZGVmaW5lIENPTkRJVElPTl9TRUxFQ1RfU1RFUChtLCBuKQkoMHgwMDYwICsgMHg0ICogbSArIDB4MUQ4ICogbikKKyNkZWZpbmUgR1JPVVAwCQkJCTB4MDA3NAorI2RlZmluZSBHUk9VUDEJCQkJMHgwMEQ0CisjZGVmaW5lIEdST1VQMgkJCQkweDAxMzQKKyNkZWZpbmUgR1JPVVAzCQkJCTB4MDE5NAorI2RlZmluZSBUR1VfTEFSCQkJCTB4MEZCMAorCisjZGVmaW5lIE1BWF9HUk9VUF9TRVRTCQkJMjU2CisjZGVmaW5lIE1BWF9HUk9VUFMJCQk0CisjZGVmaW5lIE1BWF9DT05ESVRJT05fU0VUUwkJNjQKKyNkZWZpbmUgTUFYX1RJTUVSX0NPVU5URVJfU0VUUwkJOAorCisjZGVmaW5lIHRvX3RndV9kcnZkYXRhKGMpCQljb250YWluZXJfb2YoYywgc3RydWN0IHRndV9kcnZkYXRhLCB0Z3UpCisKK3N0cnVjdCBUcmlnZ2VyX2dyb3VwX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgZ3JwYWRkcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworfTsKKworc3RydWN0IFRyaWdnZXJfY29uZGl0aW9uX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgY29uZGFkZHI7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CisKK3N0cnVjdCBUcmlnZ2VyX3NlbGVjdF9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIHNlbGVjdGFkZHI7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CisKK3N0cnVjdCBUcmlnZ2VyX3RpbWVyX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgdGltZXJhZGRyOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7Cit9OworCitzdHJ1Y3QgVHJpZ2dlcl9jb3VudGVyX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgY291bnRlcmFkZHI7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKK307CitzdHJ1Y3QgdGd1X2RydmRhdGEgeworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlCQkqY3NkZXY7CisJc3RydWN0IGNsawkJCSpjbGs7CisJc3BpbmxvY2tfdAkJCXNwaW5sb2NrOworCWludAkJCQltYXhfc3RlcHM7CisJaW50CQkJCW1heF9jb25kaXRpb25zOworCWludAkJCQltYXhfcmVnczsKKwlpbnQJCQkJbWF4X3RpbWVyX2NvdW50ZXI7CisJc3RydWN0IFRyaWdnZXJfZ3JvdXBfZGF0YQkqZ3JwX2RhdGE7CisJc3RydWN0IFRyaWdnZXJfY29uZGl0aW9uX2RhdGEJKmNvbmRpdGlvbl9kYXRhOworCXN0cnVjdCBUcmlnZ2VyX3NlbGVjdF9kYXRhCSpzZWxlY3RfZGF0YTsKKwlzdHJ1Y3QgVHJpZ2dlcl90aW1lcl9kYXRhCSp0aW1lcl9kYXRhOworCXN0cnVjdCBUcmlnZ2VyX2NvdW50ZXJfZGF0YQkqY291bnRlcl9kYXRhOworCWludAkJCQlncnBfcmVmY250OworCWludAkJCQljb25kX3JlZmNudDsKKwlpbnQJCQkJc2VsZWN0X3JlZmNudDsKKwlpbnQJCQkJdGltZXJfcmVmY250OworCWludAkJCQljb3VudGVyX3JlZmNudDsKKwlib29sCQkJCWVuYWJsZTsKK307CisKK3N0YXRpYyBzc2l6ZV90IGVuYWJsZV90Z3Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlzdHJ1Y3QgdGd1X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCWludCByZXQsIGksIGo7CisKKwlpZiAoa3N0cnRvdWwoYnVmLCAxNiwgJnZhbHVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBFbmFibGUgY2xvY2sgKi8KKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRydmRhdGEtPmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCS8qIFVubG9jayB0aGUgVEdVIExBUiAqLworCVRHVV9VTkxPQ0soZHJ2ZGF0YSk7CisKKwlpZiAodmFsdWUpIHsKKworCQkvKiBEaXNhYmxlIFRHVSB0byBwcm9ncmFtIHRoZSB0cmlnZ2VycyAqLworCQl0Z3Vfd3JpdGVsKGRydmRhdGEsIDAsIFRHVV9DT05UUk9MKTsKKworCQkvKiBwcm9ncmFtIHRoZSBUR1UgR3JvdXAgZGF0YSBmb3IgdGhlIGRlc2lyZWQgdXNlIGNhc2UqLworCisJCWZvciAoaSA9IDA7IGkgPD0gZHJ2ZGF0YS0+Z3JwX3JlZmNudDsgaSsrKQorCQkJdGd1X3dyaXRlbChkcnZkYXRhLCBkcnZkYXRhLT5ncnBfZGF0YVtpXS52YWx1ZSwKKwkJCQkJCWRydmRhdGEtPmdycF9kYXRhW2ldLmdycGFkZHIpOworCisJCS8qIHByb2dyYW0gdGhlIHVudXNlZCBDb25kaXRpb24gRGVjb2RlIHJlZ2lzdGVycyBOT1QgYml0cyB0byAxKi8KKwkJZm9yIChpID0gMDsgaSA8PSBkcnZkYXRhLT5tYXhfY29uZGl0aW9uczsgaSsrKSB7CisJCQlmb3IgKGogPSAwOyBqIDw9IGRydmRhdGEtPm1heF9zdGVwczsgaisrKQorCQkJCXRndV93cml0ZWwoZHJ2ZGF0YSwgMHgxMDAwMDAwLAorCQkJCQkJQ09ORElUSU9OX0RFQ09ERV9TVEVQKGksIGopKTsKKwkJfQorCQkvKiBwcm9ncmFtIHRoZSBUR1UgQ29uZGl0aW9uIERlY29kZSBmb3IgdGhlIGRlc2lyZWQgdXNlIGNhc2UqLworCQlmb3IgKGkgPSAwOyBpIDw9IGRydmRhdGEtPmNvbmRfcmVmY250OyBpKyspCisJCQl0Z3Vfd3JpdGVsKGRydmRhdGEsIGRydmRhdGEtPmNvbmRpdGlvbl9kYXRhW2ldLnZhbHVlLAorCQkJCQlkcnZkYXRhLT5jb25kaXRpb25fZGF0YVtpXS5jb25kYWRkcik7CisKKwkJLyogcHJvZ3JhbSB0aGUgVEdVIENvbmRpdGlvbiBTZWxlY3QgZm9yIHRoZSBkZXNpcmVkIHVzZSBjYXNlKi8KKwkJZm9yIChpID0gMDsgaSA8PSBkcnZkYXRhLT5zZWxlY3RfcmVmY250OyBpKyspCisJCQl0Z3Vfd3JpdGVsKGRydmRhdGEsIGRydmRhdGEtPnNlbGVjdF9kYXRhW2ldLnZhbHVlLAorCQkJCQlkcnZkYXRhLT5zZWxlY3RfZGF0YVtpXS5zZWxlY3RhZGRyKTsKKworCQkvKiAgVGltZXIgYW5kIENvdW50ZXIgQ2hlY2sgKi8KKwkJZm9yIChpID0gMDsgaSA8PSBkcnZkYXRhLT50aW1lcl9yZWZjbnQ7IGkrKykKKwkJCXRndV93cml0ZWwoZHJ2ZGF0YSwgZHJ2ZGF0YS0+dGltZXJfZGF0YVtpXS52YWx1ZSwKKwkJCQkJZHJ2ZGF0YS0+dGltZXJfZGF0YVtpXS50aW1lcmFkZHIpOworCisJCWZvciAoaSA9IDA7IGkgPD0gZHJ2ZGF0YS0+Y291bnRlcl9yZWZjbnQ7IGkrKykKKwkJCXRndV93cml0ZWwoZHJ2ZGF0YSwgZHJ2ZGF0YS0+Y291bnRlcl9kYXRhW2ldLnZhbHVlLAorCQkJCQlkcnZkYXRhLT5jb3VudGVyX2RhdGFbaV0uY291bnRlcmFkZHIpOworCisJCS8qIEVuYWJsZSBUR1UgdG8gcHJvZ3JhbSB0aGUgdHJpZ2dlcnMgKi8KKwkJdGd1X3dyaXRlbChkcnZkYXRhLCAxLCBUR1VfQ09OVFJPTCk7CisKKwkJZHJ2ZGF0YS0+ZW5hYmxlID0gdHJ1ZTsKKwkJZGV2X2RiZyhkZXYsICJDb3Jlc2lnaHQtVEdVIGVuYWJsZWRcbiIpOworCisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBUR1UgdG8gcHJvZ3JhbSB0aGUgdHJpZ2dlcnMgKi8KKwkJdGd1X3dyaXRlbChkcnZkYXRhLCAwLCBUR1VfQ09OVFJPTCk7CisJCVRHVV9MT0NLKGRydmRhdGEpOworCQlzcGluX3VubG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCisJCXBtX3J1bnRpbWVfcHV0KGRydmRhdGEtPmRldik7CisJCWRldl9kYmcoZGV2LCAiQ29yZXNpZ2h0LVRHVSBkaXNhYmxlZFxuIik7CisJfQorCisJVEdVX0xPQ0soZHJ2ZGF0YSk7CisJc3Bpbl91bmxvY2soJmRydmRhdGEtPnNwaW5sb2NrKTsKKwlyZXR1cm4gc2l6ZTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihlbmFibGVfdGd1LCAwMjAwLCBOVUxMLCBlbmFibGVfdGd1KTsKKworc3RhdGljIHNzaXplX3QgcmVzZXRfdGd1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJc3RydWN0IHRndV9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTYsICZ2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkcnZkYXRhLT5lbmFibGUpIHsKKwkJLyogRW5hYmxlIGNsb2NrICovCisJCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZHJ2ZGF0YS0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJc3Bpbl9sb2NrKCZkcnZkYXRhLT5zcGlubG9jayk7CisJLyogVW5sb2NrIHRoZSBUR1UgTEFSICovCisJVEdVX1VOTE9DSyhkcnZkYXRhKTsKKworCWlmICh2YWx1ZSkgeworCQkvKiBEaXNhYmxlIFRHVSB0byBwcm9ncmFtIHRoZSB0cmlnZ2VycyAqLworCQl0Z3Vfd3JpdGVsKGRydmRhdGEsIDAsIFRHVV9DT05UUk9MKTsKKworCQkvKiBSZXNldCB0aGUgUmVmZXJlbmNlIGNvdW50ZXJzKi8KKwkJZHJ2ZGF0YS0+Z3JwX3JlZmNudCA9IDA7CisJCWRydmRhdGEtPmNvbmRfcmVmY250ID0gMDsKKwkJZHJ2ZGF0YS0+c2VsZWN0X3JlZmNudCA9IDA7CisJCWRydmRhdGEtPnRpbWVyX3JlZmNudCA9IDA7CisJCWRydmRhdGEtPmNvdW50ZXJfcmVmY250ID0gMDsKKworCQlkZXZfZGJnKGRldiwgIkNvcmVzaWdodC1UR1UgZGlzYWJsZWRcbiIpOworCX0gZWxzZQorCQlkZXZfZGJnKGRldiwgIkludmFsaWQgaW5wdXQgdG8gcmVzZXQgdGhlIFRHVVxuIik7CisKKwlUR1VfTE9DSyhkcnZkYXRhKTsKKwlzcGluX3VubG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCXBtX3J1bnRpbWVfcHV0KGRydmRhdGEtPmRldik7CisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocmVzZXRfdGd1LCAwMjAwLCBOVUxMLCByZXNldF90Z3UpOworCitzdGF0aWMgc3NpemVfdCBzZXRfZ3JvdXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRndV9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlpbnQgZ3JwLCByZWcsIHN0ZXA7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCWlmIChkcnZkYXRhLT5ncnBfcmVmY250ID49IE1BWF9HUk9VUF9TRVRTKSB7CisJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LCAiIFRvbyBtYW55IGdyb3VwcyBhcmUgYmVpbmcgY29uZmlndXJlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkICVkICVkICVseCIsICZncnAsICZyZWcsICZzdGVwLCAmdmFsdWUpICE9IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZkcnZkYXRhLT5zcGlubG9jayk7CisJaWYgKChncnAgPD0gTUFYX0dST1VQUykgJiYgKHJlZyA8PSBkcnZkYXRhLT5tYXhfcmVncykpIHsKKwkJZHJ2ZGF0YS0+Z3JwX2RhdGFbZHJ2ZGF0YS0+Z3JwX3JlZmNudF0uZ3JwYWRkciA9CisJCQkJCQlHUk9VUF9SRUdfU1RFUChncnAsIHJlZywgc3RlcCk7CisJCWRydmRhdGEtPmdycF9kYXRhW2RydmRhdGEtPmdycF9yZWZjbnRdLnZhbHVlID0gdmFsdWU7CisJCWRydmRhdGEtPmdycF9yZWZjbnQrKzsKKwl9IGVsc2UKKwkJZGV2X2VycihkcnZkYXRhLT5kZXYsICJJbnZhbGlkIGdyb3VwIGRhdGFcbiIpOworCisJc3Bpbl91bmxvY2soJmRydmRhdGEtPnNwaW5sb2NrKTsKKworCXJldHVybiBzaXplOworfQorc3RhdGljIERFVklDRV9BVFRSKHNldF9ncm91cCwgMDIwMCwgTlVMTCwgc2V0X2dyb3VwKTsKKworc3RhdGljIHNzaXplX3QgdGd1X3NldF9jb25kaXRpb24oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJCQkqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGd1X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IGNvbmQsIHN0ZXA7CisKKwlpZiAoZHJ2ZGF0YS0+Y29uZF9yZWZjbnQgPj0gTUFYX0NPTkRJVElPTl9TRVRTKSB7CisJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LCAiIFRvbyBtYW55IGdyb3VwcyBhcmUgYmVpbmcgY29uZmlndXJlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkICVkICVseCIsICZjb25kLCAmc3RlcCwgJnZhbHVlKSAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCWlmICgoY29uZCA8PSBkcnZkYXRhLT5tYXhfY29uZGl0aW9ucykgJiYgKHN0ZXAgPD0KKwkJCQkJCWRydmRhdGEtPm1heF9zdGVwcykpIHsKKwkJZHJ2ZGF0YS0+Y29uZGl0aW9uX2RhdGFbZHJ2ZGF0YS0+Y29uZF9yZWZjbnRdLmNvbmRhZGRyID0KKwkJCQkJQ09ORElUSU9OX0RFQ09ERV9TVEVQKGNvbmQsIHN0ZXApOworCQlkcnZkYXRhLT5jb25kaXRpb25fZGF0YVtkcnZkYXRhLT5jb25kX3JlZmNudF0udmFsdWUgPSB2YWx1ZTsKKwkJZHJ2ZGF0YS0+Y29uZF9yZWZjbnQrKzsKKwl9IGVsc2UKKwkJZGV2X2VycihkcnZkYXRhLT5kZXYsICJJbnZhbGlkIGNvbmRpdGlvbiBkZWNvZGUgZGF0YVxuIik7CisKKwlzcGluX3VubG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X2NvbmRpdGlvbiwgMDIwMCwgTlVMTCwgdGd1X3NldF9jb25kaXRpb24pOworCitzdGF0aWMgc3NpemVfdCB0Z3Vfc2V0X3NlbGVjdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdGd1X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHNlbGVjdCwgc3RlcDsKKworCWlmIChkcnZkYXRhLT5zZWxlY3RfcmVmY250ID49IE1BWF9DT05ESVRJT05fU0VUUykgeworCQlkZXZfZXJyKGRydmRhdGEtPmRldiwgIiBUb28gbWFueSBncm91cHMgYXJlIGJlaW5nIGNvbmZpZ3VyZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlZCAlZCAlbHgiLCAmc2VsZWN0LCAmc3RlcCwgJnZhbHVlKSAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCisJaWYgKChzZWxlY3QgPD0gZHJ2ZGF0YS0+bWF4X2NvbmRpdGlvbnMpICYmIChzdGVwIDw9CisJCQkJCWRydmRhdGEtPm1heF9zdGVwcykpIHsKKwkJZHJ2ZGF0YS0+c2VsZWN0X2RhdGFbZHJ2ZGF0YS0+c2VsZWN0X3JlZmNudF0uc2VsZWN0YWRkciA9CisJCQkJCUNPTkRJVElPTl9TRUxFQ1RfU1RFUChzZWxlY3QsIHN0ZXApOworCQlkcnZkYXRhLT5zZWxlY3RfZGF0YVtkcnZkYXRhLT5zZWxlY3RfcmVmY250XS52YWx1ZSA9IHZhbHVlOworCQlkcnZkYXRhLT5zZWxlY3RfcmVmY250Kys7CisJfSBlbHNlCisJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LCAiSW52YWxpZCBzZWxlY3QgZGVjb2RlIGRhdGFcbiIpOworCisJc3Bpbl91bmxvY2soJmRydmRhdGEtPnNwaW5sb2NrKTsKKworCXJldHVybiBzaXplOworfQorc3RhdGljIERFVklDRV9BVFRSKHNldF9zZWxlY3QsIDAyMDAsIE5VTEwsIHRndV9zZXRfc2VsZWN0KTsKKworc3RhdGljIHNzaXplX3QgdGd1X3NldF90aW1lcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRndV9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCBzdGVwOworCisJaWYgKGRydmRhdGEtPnNlbGVjdF9yZWZjbnQgPj0gTUFYX1RJTUVSX0NPVU5URVJfU0VUUykgeworCQlkZXZfZXJyKGRydmRhdGEtPmRldiwgIiBUb28gbWFueSBncm91cHMgYXJlIGJlaW5nIGNvbmZpZ3VyZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIlZCAlbHgiLCAmc3RlcCwgJnZhbHVlKSAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCWlmIChzdGVwIDw9IGRydmRhdGEtPm1heF90aW1lcl9jb3VudGVyKSB7CisJCWRydmRhdGEtPnRpbWVyX2RhdGFbZHJ2ZGF0YS0+dGltZXJfcmVmY250XS50aW1lcmFkZHIgPQorCQkJCQkJVElNRVIwX0NPTVBBUkVfU1RFUChzdGVwKTsKKwkJZHJ2ZGF0YS0+dGltZXJfZGF0YVtkcnZkYXRhLT50aW1lcl9yZWZjbnRdLnZhbHVlID0gdmFsdWU7CisJCWRydmRhdGEtPnRpbWVyX3JlZmNudCsrOworCX0gZWxzZQorCQlkZXZfZXJyKGRydmRhdGEtPmRldiwgIkludmFsaWQgVEdVIHRpbWVyIGRhdGFcbiIpOworCisJc3Bpbl91bmxvY2soJmRydmRhdGEtPnNwaW5sb2NrKTsKKworCXJldHVybiBzaXplOworfQorc3RhdGljIERFVklDRV9BVFRSKHNldF90aW1lciwgMDIwMCwgTlVMTCwgdGd1X3NldF90aW1lcnMpOworCitzdGF0aWMgc3NpemVfdCB0Z3Vfc2V0X2NvdW50ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCQkJKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHRndV9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCBzdGVwOworCisJaWYgKGRydmRhdGEtPmNvdW50ZXJfcmVmY250ID49IE1BWF9USU1FUl9DT1VOVEVSX1NFVFMpIHsKKwkJZGV2X2VycihkcnZkYXRhLT5kZXYsICIgVG9vIG1hbnkgZ3JvdXBzIGFyZSBiZWluZyBjb25maWd1cmVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJWQgJWx4IiwgJnN0ZXAsICZ2YWx1ZSkgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJmRydmRhdGEtPnNwaW5sb2NrKTsKKwlpZiAoc3RlcCA8PSBkcnZkYXRhLT5tYXhfdGltZXJfY291bnRlcikgeworCQlkcnZkYXRhLT5jb3VudGVyX2RhdGFbZHJ2ZGF0YS0+Y291bnRlcl9yZWZjbnRdLmNvdW50ZXJhZGRyID0KKwkJCQkJCUNPVU5URVIwX0NPTVBBUkVfU1RFUChzdGVwKTsKKwkJZHJ2ZGF0YS0+Y291bnRlcl9kYXRhW2RydmRhdGEtPmNvdW50ZXJfcmVmY250XS52YWx1ZSA9IHZhbHVlOworCQlkcnZkYXRhLT5jb3VudGVyX3JlZmNudCsrOworCX0gZWxzZQorCQlkZXZfZXJyKGRydmRhdGEtPmRldiwgIkludmFsaWQgVEdVIGNvdW50ZXIgZGF0YVxuIik7CisKKwlzcGluX3VubG9jaygmZHJ2ZGF0YS0+c3BpbmxvY2spOworCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc2V0X2NvdW50ZXIsIDAyMDAsIE5VTEwsIHRndV9zZXRfY291bnRlcnMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGd1X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2VuYWJsZV90Z3UuYXR0ciwKKwkmZGV2X2F0dHJfcmVzZXRfdGd1LmF0dHIsCisJJmRldl9hdHRyX3NldF9ncm91cC5hdHRyLAorCSZkZXZfYXR0cl9zZXRfY29uZGl0aW9uLmF0dHIsCisJJmRldl9hdHRyX3NldF9zZWxlY3QuYXR0ciwKKwkmZGV2X2F0dHJfc2V0X3RpbWVyLmF0dHIsCisJJmRldl9hdHRyX3NldF9jb3VudGVyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRndV9hdHRyX2dycCA9IHsKKwkuYXR0cnMgPSB0Z3VfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdGd1X2F0dHJfZ3Jwc1tdID0geworCSZ0Z3VfYXR0cl9ncnAsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgdGd1X3Byb2JlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwgY29uc3Qgc3RydWN0IGFtYmFfaWQgKmlkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGV2LT5kZXY7CisJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgdGd1X2RydmRhdGEgKmRydmRhdGE7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCisJcGRhdGEgPSBvZl9nZXRfY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEoZGV2LCBhZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKElTX0VSUihwZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKHBkYXRhKTsKKwlhZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCisJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZHJ2ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZkYXRhLT5kZXYgPSAmYWRldi0+ZGV2OworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2ZGF0YSk7CisKKwlkcnZkYXRhLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgJmFkZXYtPnJlcyk7CisJaWYgKCFkcnZkYXRhLT5iYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZkcnZkYXRhLT5zcGlubG9jayk7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihhZGV2LT5kZXYub2Zfbm9kZSwgInRndS1zdGVwcyIsCisJCQkJCQkmZHJ2ZGF0YS0+bWF4X3N0ZXBzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGFkZXYtPmRldi5vZl9ub2RlLCAidGd1LWNvbmRpdGlvbnMiLAorCQkJCQkJJmRydmRhdGEtPm1heF9jb25kaXRpb25zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGFkZXYtPmRldi5vZl9ub2RlLCAidGd1LXJlZ3MiLAorCQkJCQkJCSZkcnZkYXRhLT5tYXhfcmVncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihhZGV2LT5kZXYub2Zfbm9kZSwgInRndS10aW1lci1jb3VudGVycyIsCisJCQkJCQkmZHJ2ZGF0YS0+bWF4X3RpbWVyX2NvdW50ZXIpOworCWlmIChyZXQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2MgbWVtb3J5IGZvciBHcnBzLCBDb25kaXRpb25zIGFuZCBTdGVwcyAqLworCWRydmRhdGEtPmdycF9kYXRhID0gZGV2bV9remFsbG9jKGRldiwgTUFYX0dST1VQX1NFVFMgKgorCQkJCSAgICAgICBzaXplb2YoKmRydmRhdGEtPmdycF9kYXRhKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZkYXRhLT5ncnBfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZkYXRhLT5jb25kaXRpb25fZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIE1BWF9DT05ESVRJT05fU0VUUyAqCisJCQkJICAgICAgIHNpemVvZigqZHJ2ZGF0YS0+Y29uZGl0aW9uX2RhdGEpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKworCWlmICghZHJ2ZGF0YS0+Y29uZGl0aW9uX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZHJ2ZGF0YS0+c2VsZWN0X2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBNQVhfQ09ORElUSU9OX1NFVFMgKgorCQkJCSAgICAgICBzaXplb2YoKmRydmRhdGEtPnNlbGVjdF9kYXRhKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZkYXRhLT5zZWxlY3RfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZkYXRhLT50aW1lcl9kYXRhID0gZGV2bV9remFsbG9jKGRldiwgTUFYX1RJTUVSX0NPVU5URVJfU0VUUyAqCisJCQkJICAgICAgIHNpemVvZigqZHJ2ZGF0YS0+dGltZXJfZGF0YSksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghZHJ2ZGF0YS0+dGltZXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZkYXRhLT5jb3VudGVyX2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBNQVhfVElNRVJfQ09VTlRFUl9TRVRTICoKKwkJCQkgICAgICAgc2l6ZW9mKCpkcnZkYXRhLT5jb3VudGVyX2RhdGEpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydmRhdGEtPmNvdW50ZXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZkYXRhLT5lbmFibGUgPSBmYWxzZTsKKworCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTk9ORTsKKwlkZXNjLT5wZGF0YSA9IGFkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRlc2MtPmRldiA9ICZhZGV2LT5kZXY7CisJZGVzYy0+Z3JvdXBzID0gdGd1X2F0dHJfZ3JwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKKwkJZ290byBlcnI7CisJfQorCisJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CisJZGV2X2RiZyhkZXYsICJUR1UgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworZXJyOgorCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9pZCB0Z3VfaWRzW10gPSB7CisJeworCQkuaWQJPQkweDAwMDNiOTk5LAorCQkubWFzawk9CTB4MDAwM2ZmZmYsCisJCS5kYXRhCT0JIlRHVSIsCisJfSwKKwl7IDAsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciB0Z3VfZHJpdmVyID0geworCS5kcnYgPSB7CisJCS5uYW1lCQkJPQkiY29yZXNpZ2h0LXRndSIsCisJCS5vd25lcgkJCT0JVEhJU19NT0RVTEUsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzCT0JdHJ1ZSwKKwl9LAorCS5wcm9iZQkJPQl0Z3VfcHJvYmUsCisJLmlkX3RhYmxlCT0JdGd1X2lkcywKK307CisKK2J1aWx0aW5fYW1iYV9kcml2ZXIodGd1X2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29yZVNpZ2h0IFRHVSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0Zi5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKaW5kZXggODVmZTg3Zi4uNGFkZTIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKQEAgLTQ4NCw2ICs0ODQsMzYgQEAKIAlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwogfQogCitzdGF0aWMgdm9pZCB0bWNfYWJvcnRfZXRmX3Npbmsoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwllbnVtIHRtY19tb2RlIG1vZGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoZHJ2ZGF0YS0+cmVhZGluZykKKwkJZ290byBvdXQwOworCisJaWYgKGRydmRhdGEtPmNvbmZpZ190eXBlID09IFRNQ19DT05GSUdfVFlQRV9FVEIpIHsKKwkJdG1jX2V0Yl9kaXNhYmxlX2h3KGRydmRhdGEpOworCX0gZWxzZSB7CisKKwkJbW9kZSA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19NT0RFKTsKKwkJaWYgKG1vZGUgPT0gVE1DX01PREVfQ0lSQ1VMQVJfQlVGRkVSKQorCQkJdG1jX2V0Yl9kaXNhYmxlX2h3KGRydmRhdGEpOworCQllbHNlCisJCQlnb3RvIG91dDE7CisJfQorb3V0MDoKKwlkcnZkYXRhLT5lbmFibGUgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOworCisJZGV2X2luZm8oZHJ2ZGF0YS0+ZGV2LCAiVE1DIGFib3J0ZWRcbiIpOworCXJldHVybjsKK291dDE6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBjb3Jlc2lnaHRfb3BzX3NpbmsgdG1jX2V0Zl9zaW5rX29wcyA9IHsKIAkuZW5hYmxlCQk9IHRtY19lbmFibGVfZXRmX3NpbmssCiAJLmRpc2FibGUJPSB0bWNfZGlzYWJsZV9ldGZfc2luaywKQEAgLTQ5Miw2ICs1MjIsNyBAQAogCS5zZXRfYnVmZmVyCT0gdG1jX3NldF9ldGZfYnVmZmVyLAogCS5yZXNldF9idWZmZXIJPSB0bWNfcmVzZXRfZXRmX2J1ZmZlciwKIAkudXBkYXRlX2J1ZmZlcgk9IHRtY191cGRhdGVfZXRmX2J1ZmZlciwKKwkuYWJvcnQJCT0gdG1jX2Fib3J0X2V0Zl9zaW5rLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb3Jlc2lnaHRfb3BzX2xpbmsgdG1jX2V0Zl9saW5rX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRyLmMKaW5kZXggZWIzNTVmNC4uZWI3MGU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRyLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRyLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCXRtY19ldHJfc2dfdGJsX2ZsdXNoKHZhZGRyLCBzaXplKTsKIH0KIAotc3RhdGljIHZvaWQgdG1jX2V0cl9zZ19yd3BfcG9zKHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSwgdWludDMyX3QgcndwKQordm9pZCB0bWNfZXRyX3NnX3J3cF9wb3Moc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhLCB1aW50MzJfdCByd3ApCiB7CiAJdWludDMyX3QgaSA9IDAsIHB0ZV9uID0gMCwgbGFzdF9wdGU7CiAJdWludDMyX3QgKnZpcnRfc3RfdGJsLCAqdmlydF9wdGU7CkBAIC00MDMsNiArNDAzLDcgQEAKIAkJCWJyZWFrOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wodG1jX2V0cl9zZ19yd3BfcG9zKTsKIAogc3RhdGljIHZvaWQgdG1jX2V0cl9tZW1fcmVzZXQoc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQogewpAQCAtODMxLDYgKzgzMiw4IEBACiAJZHJ2ZGF0YS0+c3RpY2t5X2VuYWJsZSA9IHRydWU7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoZHJ2ZGF0YS0+b3V0X21vZGUgPT0gVE1DX0VUUl9PVVRfTU9ERV9NRU0pCisJCXRtY19ldHJfYnl0ZV9jbnRyX3N0YXJ0KGRydmRhdGEtPmJ5dGVfY250cik7CiAJbXV0ZXhfdW5sb2NrKCZkcnZkYXRhLT5tZW1fbG9jayk7CiAKIAlpZiAoIXJldCkKQEAgLTkxOSwxNSArOTIyLDM3IEBACiAJaWYgKGRydmRhdGEtPm91dF9tb2RlID09IFRNQ19FVFJfT1VUX01PREVfTUVNKSB7CiAJCWNvcmVzaWdodF9jdGlfdW5tYXBfdHJpZ2luKGRydmRhdGEtPmN0aV9yZXNldCwgMiwgMCk7CiAJCWNvcmVzaWdodF9jdGlfdW5tYXBfdHJpZ291dChkcnZkYXRhLT5jdGlfZmx1c2gsIDMsIDApOworCQl0bWNfZXRyX2J5dGVfY250cl9zdG9wKGRydmRhdGEtPmJ5dGVfY250cik7CiAJfQogb3V0OgogCW11dGV4X3VubG9jaygmZHJ2ZGF0YS0+bWVtX2xvY2spOwogCWRldl9pbmZvKGRydmRhdGEtPmRldiwgIlRNQy1FVFIgZGlzYWJsZWRcbiIpOwogfQogCitzdGF0aWMgdm9pZCB0bWNfYWJvcnRfZXRyX3Npbmsoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOworCWlmIChkcnZkYXRhLT5yZWFkaW5nKQorCQlnb3RvIG91dDA7CisKKwlpZiAoZHJ2ZGF0YS0+b3V0X21vZGUgPT0gVE1DX0VUUl9PVVRfTU9ERV9NRU0pCisJCXRtY19ldHJfZGlzYWJsZV9odyhkcnZkYXRhKTsKKwllbHNlIGlmIChkcnZkYXRhLT5vdXRfbW9kZSA9PSBUTUNfRVRSX09VVF9NT0RFX1VTQikKKwkJX190bWNfZXRyX2Rpc2FibGVfdG9fYmFtKGRydmRhdGEpOworb3V0MDoKKwlkcnZkYXRhLT5lbmFibGUgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOworCisJZGV2X2luZm8oZHJ2ZGF0YS0+ZGV2LCAiVE1DIGFib3J0ZWRcbiIpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvcmVzaWdodF9vcHNfc2luayB0bWNfZXRyX3Npbmtfb3BzID0gewogCS5lbmFibGUJCT0gdG1jX2VuYWJsZV9ldHJfc2luaywKIAkuZGlzYWJsZQk9IHRtY19kaXNhYmxlX2V0cl9zaW5rLAorCS5hYm9ydAkJPSB0bWNfYWJvcnRfZXRyX3NpbmssCiB9OwogCiBjb25zdCBzdHJ1Y3QgY29yZXNpZ2h0X29wcyB0bWNfZXRyX2NzX29wcyA9IHsKQEAgLTk2OSw2ICs5OTQsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKGRydmRhdGEtPmJ5dGVfY250ciAmJiBkcnZkYXRhLT5ieXRlX2NudHItPmVuYWJsZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBEaXNhYmxlIHRoZSBUTUMgaWYgbmVlZCBiZSAqLwogCWlmICh2YWwgPT0gQ1NfTU9ERV9TWVNGUykKIAkJdG1jX2V0cl9kaXNhYmxlX2h3KGRydmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKaW5kZXggYjk3ZWJiOC4uNmYxM2ViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCkBAIC00NTksNiArNDU5LDQyIEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcobWVtX3R5cGUpOwogCitzdGF0aWMgc3NpemVfdCBibG9ja19zaXplX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJdWludDMyX3QgdmFsID0gMDsKKworCWlmIChkcnZkYXRhLT5ieXRlX2NudHIpCisJCXZhbCA9IGRydmRhdGEtPmJ5dGVfY250ci0+YmxvY2tfc2l6ZTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCXZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJsb2NrX3NpemVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkcnZkYXRhLT5ieXRlX2NudHIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZHJ2ZGF0YS0+Ynl0ZV9jbnRyLT5ieXRlX2NudHJfbG9jayk7CisJZHJ2ZGF0YS0+Ynl0ZV9jbnRyLT5ibG9ja19zaXplID0gdmFsICogODsKKwltdXRleF91bmxvY2soJmRydmRhdGEtPmJ5dGVfY250ci0+Ynl0ZV9jbnRyX2xvY2spOworCisJcmV0dXJuIHNpemU7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoYmxvY2tfc2l6ZSk7CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb3Jlc2lnaHRfdG1jX2V0Zl9hdHRyc1tdID0gewogCSZkZXZfYXR0cl90cmlnZ2VyX2NudHIuYXR0ciwKIAlOVUxMLApAQCAtNDcwLDYgKzUwNiw3IEBACiAJJmRldl9hdHRyX3RyaWdnZXJfY250ci5hdHRyLAogCSZkZXZfYXR0cl9vdXRfbW9kZS5hdHRyLAogCSZkZXZfYXR0cl9hdmFpbGFibGVfb3V0X21vZGVzLmF0dHIsCisJJmRldl9hdHRyX2Jsb2NrX3NpemUuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtNTg3LDYgKzYyNCw4IEBACiAJCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ldHJfZ3JvdXBzOwogCQlkZXNjLnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfQlVGRkVSOwogCisJCWRydmRhdGEtPmJ5dGVfY250ciA9IGJ5dGVfY250cl9pbml0KGFkZXYsIGRydmRhdGEpOworCiAJCXJldCA9IHRtY19ldHJfYmFtX2luaXQoYWRldiwgZHJ2ZGF0YSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oCmluZGV4IDY2NDNhZGMuLmZlNmJjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JfcWRzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC1jdGkuaD4KIAorI2luY2x1ZGUgImNvcmVzaWdodC1ieXRlLWNudHIuaCIKKwogI2RlZmluZSBUTUNfUlNaCQkJMHgwMDQKICNkZWZpbmUgVE1DX1NUUwkJCTB4MDBjCiAjZGVmaW5lIFRNQ19SUkQJCQkweDAxMApAQCAtMTY3LDcgKzE2OSw3IEBACiAJYm9vbAkJCWVuYWJsZTsKIAljaGFyCQkJKmJ1ZjsKIAlkbWFfYWRkcl90CQlwYWRkcjsKLQl2b2lkIF9faW9tZW0JCSp2YWRkcjsKKwl2b2lkCQkJKnZhZGRyOwogCXUzMgkJCXNpemU7CiAJdTMyCQkJbGVuOwogCWxvY2FsX3QJCQltb2RlOwpAQCAtMTg3LDYgKzE4OSw3IEBACiAJYm9vbAkJCXN0aWNreV9lbmFibGU7CiAJc3RydWN0IGNvcmVzaWdodF9jdGkJKmN0aV9mbHVzaDsKIAlzdHJ1Y3QgY29yZXNpZ2h0X2N0aQkqY3RpX3Jlc2V0OworCXN0cnVjdCBieXRlX2NudHIJKmJ5dGVfY250cjsKIH07CiAKIC8qIEdlbmVyaWMgZnVuY3Rpb25zICovCkBAIC0yMTQsNSArMjE3LDkgQEAKIAkJICBzdHJ1Y3QgdXNiX3Fkc3NfY2ggKmNoKTsKIGludCB0bWNfZXRyX2JhbV9pbml0KHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwKIAkJICAgICBzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpOworZXh0ZXJuIHN0cnVjdCBieXRlX2NudHIgKmJ5dGVfY250cl9pbml0KHN0cnVjdCBhbWJhX2RldmljZSAqYWRldiwKKwkJCQkJc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKTsKK2V4dGVybiB2b2lkIHRtY19ldHJfc2dfcndwX3BvcyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEsIHVpbnQzMl90IHJ3cCk7CisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY29yZXNpZ2h0X29wcyB0bWNfZXRyX2NzX29wczsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jCmluZGV4IGUyMzNlNzYuLjc1OThhYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNvcmVzaWdodF9tdXRleCk7Ci0KK3N0YXRpYyBzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3Vycl9zaW5rOwogLyoqCiAgKiBzdHJ1Y3QgY29yZXNpZ2h0X25vZGUgLSBlbGVtZW50cyBvZiBhIHBhdGgsIGZyb20gc291cmNlIHRvIHNpbmsKICAqIEBjc2RldjoJQWRkcmVzcyBvZiBhbiBlbGVtZW50LgpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJY29yZXNpZ2h0X3JlbGVhc2VfcGF0aChjc2RldiwgcGF0aCk7CiAJZ290byBvdXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjb3Jlc2lnaHRfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woY29yZXNpZ2h0X2VuYWJsZSk7CiAKIHN0YXRpYyB2b2lkIF9fY29yZXNpZ2h0X2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQogewpAQCAtNjA0LDcgKzYwNCwyNyBAQAogCV9fY29yZXNpZ2h0X2Rpc2FibGUoY3NkZXYpOwogCW11dGV4X3VubG9jaygmY29yZXNpZ2h0X211dGV4KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNvcmVzaWdodF9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woY29yZXNpZ2h0X2Rpc2FibGUpOworCit2b2lkIGNvcmVzaWdodF9hYm9ydCh2b2lkKQoreworCWlmICghbXV0ZXhfdHJ5bG9jaygmY29yZXNpZ2h0X211dGV4KSkgeworCQlwcl9lcnIoImNvcmVzaWdodDogYWJvcnQgY291bGQgbm90IGJlIHByb2Nlc3NlZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKCFjdXJyX3NpbmspCisJCWdvdG8gb3V0OworCisJaWYgKGN1cnJfc2luay0+ZW5hYmxlICYmIHNpbmtfb3BzKGN1cnJfc2luayktPmFib3J0KSB7CisJCXNpbmtfb3BzKGN1cnJfc2luayktPmFib3J0KGN1cnJfc2luayk7CisJCWN1cnJfc2luay0+ZW5hYmxlID0gZmFsc2U7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjb3Jlc2lnaHRfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTChjb3Jlc2lnaHRfYWJvcnQpOworCiAKIHN0YXRpYyBzc2l6ZV90IGVuYWJsZV9zaW5rX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvb2ZfY29yZXNpZ2h0LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvb2ZfY29yZXNpZ2h0LmMKaW5kZXggODFiYmQ3OC4uNTQ3M2ZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L29mX2NvcmVzaWdodC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYwpAQCAtMTgyLDggKzE4Miw4IEBACiAJCX0gd2hpbGUgKGVwKTsKIAl9CiAKLQkvKiBBZmZpbml0eSBkZWZhdWx0cyB0byBDUFUwICovCi0JcGRhdGEtPmNwdSA9IDA7CisJLyogQWZmaW5pdHkgZGVmYXVsdHMgdG8gaW52YWxpZCAqLworCXBkYXRhLT5jcHUgPSAtMTsKIAlkbiA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgImNwdSIsIDApOwogCWZvciAoY3B1ID0gMDsgZG4gJiYgY3B1IDwgbnJfY3B1X2lkczsgY3B1KyspIHsKIAkJaWYgKGRuID09IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9pbnRlbF90aC9wY2kuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2ludGVsX3RoL3BjaS5jCmluZGV4IDBiYmEzODQuLjYzYjVkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2ludGVsX3RoL3BjaS5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2ludGVsX3RoL3BjaS5jCkBAIC04NSw2ICs4NSwxNiBAQAogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4YTJhNiksCiAJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkwLAogCX0sCisJeworCQkvKiBDYW5ub24gTGFrZSBIICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHhhMzI2KSwKKwkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KTAsCisJfSwKKwl7CisJCS8qIENhbm5vbiBMYWtlIExQICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg5ZGE2KSwKKwkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KTAsCisJfSwKIAl7IDAgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggYTljZjY4Ny4uYjgzNTNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTEyMjQsNCArMTIyNCwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBhcyBpMmMtb3BhbC4KIAorY29uZmlnIEkyQ19NU01fVjIKKyAgICAgICAgdHJpc3RhdGUgIkkyQ19NU01fVjIiCisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9RQ09NCisgICAgICAgIGhlbHAKKyAgICAgICAgICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKyAgICAgICAgICBidWlsdC1pbiBJMkMgaW50ZXJmYWNlIGFuZCBpdHMgRE1BIGVuZ2luZSBvbiB0aGUgTVNNIGZhbWlseQorICAgICAgICAgIHByb2Nlc3NvcnMuCisKKyAgICAgICAgICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgaTJjLW1zbS12Mi4KKworCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggN2YyNTIzZi4uMTkwZjhiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtMTAwLDYgKzEwMCw3IEBACiBvYmotJChDT05GSUdfSTJDX1hMUikJCSs9IGkyYy14bHIubwogb2JqLSQoQ09ORklHX0kyQ19YTFA5WFgpCSs9IGkyYy14bHA5eHgubwogb2JqLSQoQ09ORklHX0kyQ19SQ0FSKQkJKz0gaTJjLXJjYXIubworb2JqLSQoQ09ORklHX0kyQ19NU01fVjIpICAgICAgICArPSBpMmMtbXNtLXYyLm8KIAogIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCiBvYmotJChDT05GSUdfSTJDX0RJT0xBTl9VMkMpCSs9IGkyYy1kaW9sYW4tdTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jCmluZGV4IDBiNDJhMTIuLmI0MmQ5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBsYXRkcnYuYwpAQCAtMzE5LDcgKzMxOSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBkd19pMmNfcGxhdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZHdfaTJjX3BsYXRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGR3X2kyY19kZXYgKmlfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC0zNDMsMTEgKzM0MywyMSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGR3X2kyY19wbGF0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXBtX3J1bnRpbWVfcmVzdW1lKGRldik7CisJcmV0dXJuIGR3X2kyY19wbGF0X3J1bnRpbWVfc3VzcGVuZChkZXYpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkd19pMmNfZGV2X3BtX29wcyA9IHsKIAkucHJlcGFyZSA9IGR3X2kyY19wbGF0X3ByZXBhcmUsCiAJLmNvbXBsZXRlID0gZHdfaTJjX3BsYXRfY29tcGxldGUsCiAJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZHdfaTJjX3BsYXRfc3VzcGVuZCwgZHdfaTJjX3BsYXRfcmVzdW1lKQotCVNFVF9SVU5USU1FX1BNX09QUyhkd19pMmNfcGxhdF9zdXNwZW5kLCBkd19pMmNfcGxhdF9yZXN1bWUsIE5VTEwpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGR3X2kyY19wbGF0X3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIGR3X2kyY19wbGF0X3Jlc3VtZSwKKwkJCSAgIE5VTEwpCiB9OwogCiAjZGVmaW5lIERXX0kyQ19ERVZfUE1PUFMgKCZkd19pMmNfZGV2X3BtX29wcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNtdC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc210LmMKaW5kZXggZjU3MzQ0OC4uODQ3NzI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc210LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc210LmMKQEAgLTM0MSw4ICszNDEsMTAgQEAKIAkJCWJyZWFrOwogCQljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgogCQljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKLQkJCW1lbWNweSgmZGF0YS0+YmxvY2tbMV0sIGRtYV9idWZmZXIsIGRlc2MtPnJ4Ynl0ZXMpOwotCQkJZGF0YS0+YmxvY2tbMF0gPSBkZXNjLT5yeGJ5dGVzOworCQkJaWYgKGRlc2MtPnJ4Ynl0ZXMgIT0gZG1hX2J1ZmZlclswXSArIDEpCisJCQkJcmV0dXJuIC1FTVNHU0laRTsKKworCQkJbWVtY3B5KGRhdGEtPmJsb2NrLCBkbWFfYnVmZmVyLCBkZXNjLT5yeGJ5dGVzKTsKIAkJCWJyZWFrOwogCQl9CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tc20tdjIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXNtLXYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhZWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXNtLXYyLmMKQEAgLTAsMCArMSwzMDM5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKy8qCisgKiBJMkMgY29udHJvbGxlciBkcml2ZXIgZm9yIFF1YWxjb21tIFRlY2hub2xvZ2llcyBJbmMgcGxhdGZvcm1zCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAiIyVkICIgZm10ICJcbiIsIF9fTElORV9fCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvbXNtLXNwcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbS1idXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc20tYnVzLWJvYXJkLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2kyYy1tc20tdjIuaD4KKworI2lmZGVmIERFQlVHCitzdGF0aWMgY29uc3QgZW51bSBtc21faTJfZGVidWdfbGV2ZWwgREVGQVVMVF9EQkdfTFZMID0gTVNNX0RCRzsKKyNlbHNlCitzdGF0aWMgY29uc3QgZW51bSBtc21faTJfZGVidWdfbGV2ZWwgREVGQVVMVF9EQkdfTFZMID0gTVNNX0VSUjsKKyNlbmRpZgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGJvb2wgaTJjX21zbV94ZmVyX25leHRfYnVmKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpOworc3RhdGljIGludCBpMmNfbXNtX3hmZXJfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLAorCQkJCQkJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRlKTsKK3N0YXRpYyBpbnQgIGkyY19tc21fcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpMmNfbXNtX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGkyY19tc21fY2xrX3BhdGhfaW5pdChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKTsKK3N0YXRpYyB2b2lkIGkyY19tc21fcG1fcGluY3RybF9zdGF0ZShzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLAorCQkJCQkJYm9vbCBydW50aW1lX2FjdGl2ZSk7CisKKy8qIHN0cmluZyB0YWJsZSBmb3IgZW51bSBpMmNfbXNtX3hmZXJfbW9kZV9pZCAqLworY29uc3QgY2hhciAqIGNvbnN0IGkyY19tc21fbW9kZV9zdHJfdGJsW10gPSB7CisJIkZJRk8iLCAiQkxPQ0siLCAiRE1BIiwgIk5vbmUiLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBpMmNfbXNtX2ZpZm9fYmxvY2tfc3pfdGJsW10gPSB7MTYsIDE2LCAzMiwgMH07CisKKy8qIGZyb20gZW51bSBpMmNfbXNtX3hmZXJfbW9kZV9pZCB0byBxdXBfaW9fbW9kZXMgcmVnaXN0ZXIgdmFsdWVzICovCitzdGF0aWMgY29uc3QgdTMyIGkyY19tc21fbW9kZV90b19yZWdfdGJsW10gPSB7CisJMHgwLCAvKiBtYXAgSTJDX01TTV9YRkVSX01PREVfRklGTyAtPiBiaW5hcnkgMDAgKi8KKwkweDEsIC8qIG1hcCBJMkNfTVNNX1hGRVJfTU9ERV9CTE9DSyAtPiBiaW5hcnkgMDEgKi8KKwkweDMgIC8qIG1hcCBJMkNfTVNNX1hGRVJfTU9ERV9ETUEgLT4gYmluYXJ5IDExICovCit9OworCitjb25zdCBjaGFyICppMmNfbXNtX2Vycl9zdHJfdGFibGVbXSA9IHsKKwlbSTJDX01TTV9OT19FUlJdICAgICA9ICJOT05FIiwKKwlbSTJDX01TTV9FUlJfTkFDS10gICA9ICJOQUNLOiBzbGF2ZSBub3QgcmVzcG9uZGluZywgZW5zdXJlIGl0cyBwb3dlcmVkIiwKKwlbSTJDX01TTV9FUlJfQVJCX0xPU1RdID0gIkFSQl9MT1NUIiwKKwlbSTJDX01TTV9FUlJfQlVTX0VSUl0gPSAiQlVTIEVSUk9SOm5vaXN5IGJ1cy91bmV4cGVjdGVkIHN0YXJ0L3N0b3AgdGFnIiwKKwlbSTJDX01TTV9FUlJfVElNRU9VVF0gID0gIlRJTUVPVVRfRVJST1IiLAorCVtJMkNfTVNNX0VSUl9DT1JFX0NMS10gPSAiQ0xPQ0sgT0ZGOiBDaGVjayBDb3JlIENsb2NrIiwKKwlbSTJDX01TTV9FUlJfT1ZSX1VORFJfUlVOXSA9ICJPVkVSX1VOREVSX1JVTl9FUlJPUiIsCit9OworCitzdGF0aWMgdm9pZCBpMmNfbXNtX2RiZ19kdW1wX2RpYWcoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCQlib29sIHVzZV9wYXJhbV92YWxzLCB1MzIgc3RhdHVzLCB1MzIgcXVwX29wKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXIgKnhmZXIgPSAmY3RybC0+eGZlcjsKKwljb25zdCBjaGFyICpzdHIgPSBpMmNfbXNtX2Vycl9zdHJfdGFibGVbeGZlci0+ZXJyXTsKKwljaGFyIGJ1ZltJMkNfTVNNX1JFR18yX1NUUl9CVUZfU1pdOworCisJaWYgKCF1c2VfcGFyYW1fdmFscykgeworCQl2b2lkIF9faW9tZW0gICAgICAgICpiYXNlID0gY3RybC0+cnNyY3MuYmFzZTsKKworCQlzdGF0dXMgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBRVVBfSTJDX1NUQVRVUyk7CisJCXF1cF9vcCA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CisJfQorCisJaWYgKHhmZXItPmVyciA9PSBJMkNfTVNNX0VSUl9USU1FT1VUKSB7CisJCS8qCisJCSAqIGlmIHdlIGFyZSBub3QgdGhlIGJ1cyBtYXN0ZXIgb3IgU0RBL1NDTCBpcyBsb3cgdGhlbiBpdCBtYXkgYmUKKwkJICogdGhhdCBzbGF2ZSBpcyBwdWxsaW5nIHRoZSBsaW5lcyBsb3cuIE90aGVyd2lzZSBpdCBpcyBsaWtlbHkgYQorCQkgKiBHUElPIGlzc3VlCisJCSAqLworCQlpZiAoIShzdGF0dXMgJiBRVVBfQlVTX01BU1RFUikpCisJCQlzbnByaW50ZihidWYsIEkyQ19NU01fUkVHXzJfU1RSX0JVRl9TWiwKKwkJCQkiJXModmFsOiVkbXNlYykgbWlzY29uZmlndXJlZCBHUElPIG9yIHNsYXZlIHB1bGxpbmcgYnVzIGxpbmUocykgbG93XG4iLAorCQkJCXN0ciwgamlmZmllc190b19tc2Vjcyh4ZmVyLT50aW1lb3V0KSk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiwgSTJDX01TTV9SRUdfMl9TVFJfQlVGX1NaLAorCQkJIiVzKHZhbDolZG1zZWMpIiwgc3RyLCBqaWZmaWVzX3RvX21zZWNzKHhmZXItPnRpbWVvdXQpKTsKKworCQlzdHIgPSBidWY7CisJfQorCisJLyogZHVtcCB4ZmVyIGRldGFpbHMgKi8KKwlkZXZfZXJyKGN0cmwtPmRldiwKKwkJIiVzOiBtc2dzKG46JWQgY3VyOiVkICVzKSBiYyhyeDolenUgdHg6JXp1KSBtb2RlOiVzIHNsdl9hZGRyOjB4JTB4IE1TVFJfU1RTOjB4JTA4eCBPUEVSOjB4JTA4eFxuIiwKKwkJc3RyLCB4ZmVyLT5tc2dfY250LCB4ZmVyLT5jdXJfYnVmLm1zZ19pZHgsCisJCXhmZXItPmN1cl9idWYuaXNfcnggPyAicngiIDogInR4IiwgeGZlci0+cnhfY250LCB4ZmVyLT50eF9jbnQsCisJCWkyY19tc21fbW9kZV9zdHJfdGJsW3hmZXItPm1vZGVfaWRdLCB4ZmVyLT5tc2dzLT5hZGRyLAorCQlzdGF0dXMsIHF1cF9vcCk7Cit9CisKK3N0YXRpYyB1MzIgaTJjX21zbV9yZWdfaW9fbW9kZXNfb3V0X2Jsa19zeih1MzIgcXVwX2lvX21vZGVzKQoreworCXJldHVybiBpMmNfbXNtX2ZpZm9fYmxvY2tfc3pfdGJsW3F1cF9pb19tb2RlcyAmIDB4M107Cit9CisKK3N0YXRpYyB1MzIgaTJjX21zbV9yZWdfaW9fbW9kZXNfaW5fYmxrX3N6KHUzMiBxdXBfaW9fbW9kZXMpCit7CisJcmV0dXJuIGkyY19tc21fZmlmb19ibG9ja19zel90YmxbQklUU19BVChxdXBfaW9fbW9kZXMsIDUsIDIpXTsKK30KKworc3RhdGljIGNvbnN0IHUzMiBpMmNfbXNtX2ZpZm9fc3pfdGFibGVbXSA9IHsyLCA0LCA4LCAxNn07CisKK3N0YXRpYyB2b2lkIGkyY19tc21fcXVwX2ZpZm9fY2FsY19zaXplKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJdTMyIHJlZ19kYXRhLCBvdXRwdXRfZmlmb19zaXplLCBpbnB1dF9maWZvX3NpemU7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2ZpZm8gKmZpZm8gPSAmY3RybC0+eGZlci5maWZvOworCisJLyogR3VyYWQgdG8gcmVhZCBmaWZvIHNpemUgb25seSBvbmNlLiBJdCBoYXJkIHdpcmVkIGFuZCBuZXZlciBjaGFuZ2VzICovCisJaWYgKGZpZm8tPmlucHV0X2ZpZm9fc3ogJiYgZmlmby0+b3V0cHV0X2ZpZm9fc3opCisJCXJldHVybjsKKworCXJlZ19kYXRhID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX0lPX01PREVTKTsKKwlvdXRwdXRfZmlmb19zaXplICA9IEJJVFNfQVQocmVnX2RhdGEsIDIsIDIpOworCWlucHV0X2ZpZm9fc2l6ZSAgID0gQklUU19BVChyZWdfZGF0YSwgNywgMik7CisKKwlmaWZvLT5pbnB1dF9maWZvX3N6ID0gaTJjX21zbV9yZWdfaW9fbW9kZXNfaW5fYmxrX3N6KHJlZ19kYXRhKSAqCisJCQkJCWkyY19tc21fZmlmb19zel90YWJsZVtpbnB1dF9maWZvX3NpemVdOworCWZpZm8tPm91dHB1dF9maWZvX3N6ID0gaTJjX21zbV9yZWdfaW9fbW9kZXNfb3V0X2Jsa19zeihyZWdfZGF0YSkgKgorCQkJCQlpMmNfbXNtX2ZpZm9fc3pfdGFibGVbb3V0cHV0X2ZpZm9fc2l6ZV07CisKKwlpMmNfbXNtX2RiZyhjdHJsLCBNU01fUFJPRiwgIlFVUCBpbnB1dC1zejolenUsIGlucHV0LXN6OiV6dSIsCisJCQlmaWZvLT5pbnB1dF9maWZvX3N6LCBmaWZvLT5vdXRwdXRfZmlmb19zeik7CisKK30KKworLyoKKyAqIGkyY19tc21fdGFnX2J5dGU6IGFjY2Vzc29yIGZvciB0YWcgYXMgZm91ciBieXRlcyBhcnJheQorICovCitzdGF0aWMgdTggKmkyY19tc21fdGFnX2J5dGUoc3RydWN0IGkyY19tc21fdGFnICp0YWcsIGludCBieXRlX24pCit7CisJcmV0dXJuICgodTggKil0YWcpICsgYnl0ZV9uOworfQorCisvKgorICogaTJjX21zbV9idWZfdG9fcHRyOiB0cmFuc2xhdGVzIGEgeGZlciBidWYgdG8gYSBwb2ludGVyIGludG8gdGhlIGkyY19tc2cgZGF0YQorICovCitzdGF0aWMgdTggKmkyY19tc21fYnVmX3RvX3B0cihzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAqYnVmKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXIgKnhmZXIgPQorCQkJCWNvbnRhaW5lcl9vZihidWYsIHN0cnVjdCBpMmNfbXNtX3hmZXIsIGN1cl9idWYpOworCXN0cnVjdCBpMmNfbXNnICptc2cgPSB4ZmVyLT5tc2dzICsgYnVmLT5tc2dfaWR4OworCisJcmV0dXJuIG1zZy0+YnVmICsgYnVmLT5ieXRlX2lkeDsKK30KKworLyoKKyAqIHRhZ19sb29rdXBfdGFibGVbaXNfbmV3X2FkZHJdW2lzX2xhc3RdW2lzX3J4XQorICogQGlzX25ld19hZGRyIElzIHN0YXJ0IHRhZyByZXF1aXJlZD8gKHdoaWNoIHJlcXVpcmVzIHR3byBtb3JlIGJ5dGVzLikKKyAqIEBpc19sYXN0ICAgICBVc2UgdGhlIFhYWFhYX05fU1RPUCB0YWcgdmFyaWFudAorICogQGlzX3J4ICAgICAgIFJFQUQvV1JJVEUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfbXNtX3RhZyB0YWdfbG9va3VwX3RhYmxlWzJdWzJdWzJdID0geworCXt7e1FVUF9UQUcyX0RBVEFfV1JJVEUsCQkJCQkyfSwKKwkgICB7UVVQX1RBRzJfREFUQV9SRUFELAkJCQkJMn0gfSwKKwkvKiBsYXN0IGJ1ZmZlciAqLworCSAge3tRVVBfVEFHMl9EQVRBX1dSSVRFX05fU1RPUCwJCQkJMn0sCisJICAge1FVUF9UQUcyX0RBVEFfUkVBRF9OX1NUT1AsCQkJCTJ9IH0gfSwKKwkvKiBuZXcgYWRkciAqLworCSB7e3tRVVBfVEFHMl9TVEFSVCB8IChRVVBfVEFHMl9EQVRBX1dSSVRFICAgICAgICAgICA8PCAxNiksIDR9LAorCSAgIHtRVVBfVEFHMl9TVEFSVCB8IChRVVBfVEFHMl9EQVRBX1JFQUQgICAgICAgICAgICA8PCAxNiksIDR9IH0sCisJLyogbGFzdCBidWZmZXIgKyBuZXcgYWRkciAqLworCSAge3tRVVBfVEFHMl9TVEFSVCB8IChRVVBfVEFHMl9EQVRBX1dSSVRFX05fU1RPUCAgICA8PCAxNiksIDR9LAorCSAgIHtRVVBfVEFHMl9TVEFSVCB8IChRVVBfVEFHMl9EQVRBX1JFQURfTl9TVE9QICAgICA8PCAxNiksIDR9IH0gfSwKK307CisKKy8qCisgKiBpMmNfbXNtX3RhZ19jcmVhdGU6IGZvcm1hdCBhIHF1cCB0YWcgdmVyMgorICovCitzdGF0aWMgc3RydWN0IGkyY19tc21fdGFnIGkyY19tc21fdGFnX2NyZWF0ZShib29sIGlzX25ld19hZGRyLCBib29sIGlzX2xhc3RfYnVmLAorCQkJCQlib29sIGlzX3J4LCB1OCBidWZfbGVuLCB1OCBzbGF2ZV9hZGRyKQoreworCXN0cnVjdCBpMmNfbXNtX3RhZyB0YWc7CisJLyogTm9ybWFsaXplIGJvb2xlYW5zIHRvIDEgb3IgMCAqLworCWlzX25ld19hZGRyID0gaXNfbmV3X2FkZHIgPyAxIDogMDsKKwlpc19sYXN0X2J1ZiA9IGlzX2xhc3RfYnVmID8gMSA6IDA7CisJaXNfcnggPSBpc19yeCA/IDEgOiAwOworCisJdGFnID0gdGFnX2xvb2t1cF90YWJsZVtpc19uZXdfYWRkcl1baXNfbGFzdF9idWZdW2lzX3J4XTsKKwkvKiBmaWxsIGluIHRoZSBub24tY29uc3QgdmFsdWU6IHRoZSBhZGRyZXNzIGFuZCB0aGUgbGVuZ3RoICovCisJaWYgKHRhZy5sZW4gPT0gSTJDX01TTV9UQUcyX01BWF9MRU4pIHsKKwkJKmkyY19tc21fdGFnX2J5dGUoJnRhZywgMSkgPSBzbGF2ZV9hZGRyOworCQkqaTJjX21zbV90YWdfYnl0ZSgmdGFnLCAzKSA9IGJ1Zl9sZW47CisJfSBlbHNlIHsKKwkJKmkyY19tc21fdGFnX2J5dGUoJnRhZywgMSkgPSBidWZfbGVuOworCX0KKworCXJldHVybiB0YWc7Cit9CisKK3N0YXRpYyBpbnQKK2kyY19tc21fcXVwX3N0YXRlX3dhaXRfdmFsaWQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCWVudW0gaTJjX21zbV9xdXBfc3RhdGUgc3RhdGUsIGJvb2wgb25seV92YWxpZCkKK3sKKwl1MzIgc3RhdHVzOworCXZvaWQgX19pb21lbSAgKmJhc2UgICAgID0gY3RybC0+cnNyY3MuYmFzZTsKKwlpbnQgcmV0ICAgICAgPSAwOworCWludCByZWFkX2NudCA9IDA7CisKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9TVEFURSk7CisJCSsrcmVhZF9jbnQ7CisKKwkJLyoKKwkJICogSWYgb25seSB2YWxpZCBiaXQgbmVlZHMgdG8gYmUgY2hlY2tlZCwgcmVxdWVzdGVkIHN0YXRlIGlzCisJCSAqICdkb24ndCBjYXJlJworCQkgKi8KKwkJaWYgKHN0YXR1cyAmIFFVUF9TVEFURV9WQUxJRCkgeworCQkJaWYgKG9ubHlfdmFsaWQpCisJCQkJZ290byBwb2xsX3ZhbGlkX2VuZDsKKwkJCWVsc2UgaWYgKChzdGF0ZSAmIFFVUF9JMkNfTUFTVF9HRU4pICYmCisJCQkJCShzdGF0dXMgJiBRVVBfSTJDX01BU1RfR0VOKSkKKwkJCQlnb3RvIHBvbGxfdmFsaWRfZW5kOworCQkJZWxzZSBpZiAoKHN0YXR1cyAmIFFVUF9TVEFURV9NQVNLKSA9PSBzdGF0ZSkKKwkJCQlnb3RvIHBvbGxfdmFsaWRfZW5kOworCQl9CisKKwkJLyoKKwkJICogU2xlZXBpbmcgZm9yIDEtMS41IG1zIGZvciBldmVyeSAxMDAgaXRlcmF0aW9ucyBhbmQgYnJlYWsgaWYKKwkJICogaXRlcmF0aW9ucyBjcm9zc2VzIHRoZSAxNTAwIG1hcmtzIGFsbG93cyByb3VnaGx5IDEwLTE1IG1zZWMKKwkJICogb2YgdGltZSB0byBnZXQgdGhlIGNvcmUgdG8gdmFsaWQgc3RhdGUuCisJCSAqLworCQlpZiAoIShyZWFkX2NudCAlIDEwMCkpCisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CisJfSB3aGlsZSAocmVhZF9jbnQgPD0gMTUwMCk7CisKKwlyZXQgPSAtRVRJTUVET1VUOworCWRldl9lcnIoY3RybC0+ZGV2LAorCQkiZXJyb3IgdGltZW91dCBvbiBwb2xsaW5nIGZvciB2YWxpZCBzdGF0ZS4gY2hlY2sgY29yZV9jbGtcbiIpOworCitwb2xsX3ZhbGlkX2VuZDoKKwlpZiAoIW9ubHlfdmFsaWQpCisJCWkyY19tc21fcHJvZl9ldm50X2FkZChjdHJsLCBNU01fREJHLCBJMkNfTVNNX1ZBTElEX0VORCwKKwkJCQkvKiBhZ2dyZWdhdGUgcmV0IGFuZCBzdGF0ZSAqLworCQkJCSgoKC1yZXQpICYgMHhmZikgfCAoKHN0YXRlICYgMHhmKSA8PCAxNikpLAorCQkJCXJlYWRfY250LCBzdGF0dXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCQkJCWVudW0gaTJjX21zbV9xdXBfc3RhdGUgc3RhdGUpCit7CisJaWYgKGkyY19tc21fcXVwX3N0YXRlX3dhaXRfdmFsaWQoY3RybCwgMCwgdHJ1ZSkpCisJCXJldHVybiAtRUlPOworCisJd3JpdGVsX3JlbGF4ZWQoc3RhdGUsIGN0cmwtPnJzcmNzLmJhc2UgKyBRVVBfU1RBVEUpOworCisJaWYgKGkyY19tc21fcXVwX3N0YXRlX3dhaXRfdmFsaWQoY3RybCwgc3RhdGUsIGZhbHNlKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMmNfbXNtX3F1cF9zd19yZXNldChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQ7CisKKwl3cml0ZWxfcmVsYXhlZCgxLCBjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX1NXX1JFU0VUKTsKKwkvKgorCSAqIEVuc3VyZSB0aGF0IFFVUCB0aGF0IHJlc2V0IHN0YXRlIGlzIHdyaXR0ZW4gYmVmb3JlIHdhaXRpbmcgZm9yIGEgdGhlCisJICogcmVzZXQgc3RhdGUgdG8gYmUgdmFsaWQuCisJICovCisJd21iKCk7CisJcmV0ID0gaTJjX21zbV9xdXBfc3RhdGVfd2FpdF92YWxpZChjdHJsLCBRVVBfU1RBVEVfUkVTRVQsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWlmIChhdG9taWNfcmVhZCgmY3RybC0+eGZlci5pc19hY3RpdmUpKQorCQkJY3RybC0+eGZlci5lcnIgPSBJMkNfTVNNX0VSUl9DT1JFX0NMSzsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJlcnJvciBvbiBpc3N1aW5nIFFVUCBzb2Z0d2FyZS1yZXNldFxuIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBpMmNfbXNtX3F1cF94ZmVyX2luaXRfcmVzZXRfc3RhdGU6IHNldHVwIFFVUCByZWdpc3RlcnMgZm9yIHRoZSBuZXh0IHJ1biBzdGF0ZQorICogQHByZSBRVVAgbXVzdCBiZSBpbiByZXNldCBzdGF0ZS4KKyAqIEBwcmUgeGZlci0+bW9kZV9pZCBpcyBzZXQgdG8gdGhlIGNob3NlbiB0cmFuc2ZlciBzdGF0ZQorICogQHBvc3QgdXBkYXRlIHZhbHVlcyBpbiBRVVBfTVhfKl9DT1VOVCwgUVVQX0NPTkZJRywgUVVQX0lPX01PREVTLAorICogICAgICAgYW5kIFFVUF9PUEVSQVRJT05BTF9NQVNLIHJlZ2lzdGVycworICovCitzdGF0aWMgdm9pZAoraTJjX21zbV9xdXBfeGZlcl9pbml0X3Jlc2V0X3N0YXRlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGkyY19tc21feGZlciAqeGZlciA9ICZjdHJsLT54ZmVyOworCXZvaWQgX19pb21lbSAqIGNvbnN0IGJhc2UgPSBjdHJsLT5yc3Jjcy5iYXNlOworCXUzMiAgbXhfcmRfY250ICAgICA9IDA7CisJdTMyICBteF93cl9jbnQgICAgID0gMDsKKwl1MzIgIG14X2luX2NudCAgICAgPSAwOworCXUzMiAgbXhfb3V0X2NudCAgICA9IDA7CisJdTMyICBub19pbnB1dCAgICAgID0gMDsKKwl1MzIgIG5vX291dHB1dCAgICAgPSAwOworCXUzMiAgaW5wdXRfbW9kZSAgICA9IGkyY19tc21fbW9kZV90b19yZWdfdGJsW3hmZXItPm1vZGVfaWRdIDw8IDEyOworCXUzMiAgb3V0cHV0X21vZGUgICA9IGkyY19tc21fbW9kZV90b19yZWdfdGJsW3hmZXItPm1vZGVfaWRdIDw8IDEwOworCXUzMiAgY29uZmlnX3JlZzsKKwl1MzIgIGlvX21vZGVzX3JlZzsKKwl1MzIgIG9wX21hc2s7CisJdTMyICByeF9jbnQgPSAwOworCXUzMiAgdHhfY250ID0gMDsKKwkvKgorCSAqIERNQSBtb2RlOgorCSAqIDEuIFFVUF9NWF8qX0NPVU5UIG11c3QgYmUgemVybyBpbiBhbGwgY2FzZXMuCisJICogMi4gYm90aCBRVVBfTk9fSU5QVVQgYW5kIFFVUF9OT19PVVRQVVQgYXJlIHVuc2V0LgorCSAqIEZJRk8gbW9kZToKKwkgKiAxLiBRVVBfTVhfSU5QVVRfQ09VTlQgYW5kIFFVUF9NWF9PVVRQVVRfQ09VTlQgYXJlIHplcm8KKwkgKiAyLiBRVVBfTVhfUkVBRF9DT1VOVCBhbmQgUVVQX01YX1dSSVRFX0NPVU5UIHJlZmxlY3QgdHJ1ZSBjb3VudAorCSAqIDMuIFFVUF9OT19JTlBVVCBhbmQgUVVQX05PX09VVFBVVCBhcmUgc2V0IGFjY29yZGluZyB0byBjb3VudHMKKwkgKi8KKwlpZiAoeGZlci0+bW9kZV9pZCAhPSBJMkNfTVNNX1hGRVJfTU9ERV9ETUEpIHsKKwkJcnhfY250ICAgPSB4ZmVyLT5yeF9jbnQgKyB4ZmVyLT5yeF9vdnJoZF9jbnQ7CisJCXR4X2NudCAgID0geGZlci0+dHhfY250ICsgeGZlci0+dHhfb3ZyaGRfY250OworCQlub19pbnB1dCA9IHJ4X2NudCAgPyAwIDogUVVQX05PX0lOUFVUOworCisJCXN3aXRjaCAoeGZlci0+bW9kZV9pZCkgeworCQljYXNlIEkyQ19NU01fWEZFUl9NT0RFX0ZJRk86CisJCQlteF9yZF9jbnQgID0gcnhfY250OworCQkJbXhfd3JfY250ICA9IHR4X2NudDsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19NU01fWEZFUl9NT0RFX0JMT0NLOgorCQkJbXhfaW5fY250ICA9IHJ4X2NudDsKKwkJCW14X291dF9jbnQgPSB0eF9jbnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogaW5pdCBETUEvQkxPQ0sgbW9kZXMgY291bnRlciAqLworCXdyaXRlbF9yZWxheGVkKG14X2luX2NudCwgIGJhc2UgKyBRVVBfTVhfSU5QVVRfQ09VTlQpOworCXdyaXRlbF9yZWxheGVkKG14X291dF9jbnQsIGJhc2UgKyBRVVBfTVhfT1VUUFVUX0NPVU5UKTsKKworCS8qIGludCBGSUZPIG1vZGUgY291bnRlciAqLworCXdyaXRlbF9yZWxheGVkKG14X3JkX2NudCwgYmFzZSArIFFVUF9NWF9SRUFEX0NPVU5UKTsKKwl3cml0ZWxfcmVsYXhlZChteF93cl9jbnQsIGJhc2UgKyBRVVBfTVhfV1JJVEVfQ09VTlQpOworCisJLyoKKwkgKiBTZXQgUVVQIG1pbmktY29yZSB0byBJMkMgdGFncyB2ZXItMgorCSAqIHNldHMgTk9fSU5QVVQgLyBOT19PVVRQVVQgYXMgbmVlZGVkCisJICovCisJY29uZmlnX3JlZyA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9DT05GSUcpOworCWNvbmZpZ19yZWcgJj0KKwkgICAgICB+KFFVUF9OT19JTlBVVCB8IFFVUF9OT19PVVRQVVQgfCBRVVBfTl9NQVNLIHwgUVVQX01JTklfQ09SRV9NQVNLKTsKKwljb25maWdfcmVnIHw9IChub19pbnB1dCB8IG5vX291dHB1dCB8IFFVUF9OX1ZBTCB8CisJCQkJCQkJUVVQX01JTklfQ09SRV9JMkNfVkFMKTsKKwl3cml0ZWxfcmVsYXhlZChjb25maWdfcmVnLCBiYXNlICsgUVVQX0NPTkZJRyk7CisKKwkvKgorCSAqIFR1cm5zLW9uIHBhY2tpbmcvdW5wYWNraW5nCisJICogc2V0cyBOT19JTlBVVCAvIE5PX09VVFBVVCBhcyBuZWVkZWQKKwkgKi8KKwlpb19tb2Rlc19yZWcgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBRVVBfSU9fTU9ERVMpOworCWlvX21vZGVzX3JlZyAmPQorCSAgIH4oUVVQX0lOUFVUX01PREUgfCBRVVBfT1VUUFVUX01PREUgfCBRVVBfUEFDS19FTiB8IFFVUF9VTlBBQ0tfRU4KKwkgICAgIHwgUVVQX09VVFBVVF9CSVRfU0hJRlRfRU4pOworCWlvX21vZGVzX3JlZyB8PQorCSAgIChpbnB1dF9tb2RlIHwgb3V0cHV0X21vZGUgfCBRVVBfUEFDS19FTiB8IFFVUF9VTlBBQ0tfRU4pOworCXdyaXRlbF9yZWxheGVkKGlvX21vZGVzX3JlZywgYmFzZSArIFFVUF9JT19NT0RFUyk7CisKKwkvKgorCSAqIG1hc2sgSU5QVVQgYW5kIE9VVFBVVCBzZXJ2aWNlIGZsYWdzIGluIHRvIHByZXZlbnQgSVJRcyBvbiBGSUZPIHN0YXR1cworCSAqIGNoYW5nZSBvbiBETUEtbW9kZSB0cmFuc2ZlcnMKKwkgKi8KKwlvcF9tYXNrID0gKHhmZXItPm1vZGVfaWQgPT0gSTJDX01TTV9YRkVSX01PREVfRE1BKSA/CisJCSAgICAoUVVQX0lOUFVUX1NFUlZJQ0VfTUFTSyB8IFFVUF9PVVRQVVRfU0VSVklDRV9NQVNLKSA6IDA7CisJd3JpdGVsX3JlbGF4ZWQob3BfbWFzaywgYmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKKwkvKiBFbnN1cmUgdGhhdCBRVVAgY29uZmlndXJhdGlvbiBpcyB3cml0dGVuIGJlZm9yZSBsZWF2aW5nIHRoaXMgZnVuYyAqLworCXdtYigpOworfQorCisvKgorICogaTJjX21zbV9jbGtfZGl2X2ZsZDoKKyAqIEBjbGtfZnJlcV9vdXQgb3V0cHV0IGNsb2NrIGZyZXF1ZW5jeQorICogQGZzX2RpdiBmcyBkaXZpZGVyIHZhbHVlCisgKiBAaHRfZGl2IGhpZ2ggdGltZSBkaXZpZGVyIHZhbHVlCisgKi8KK3N0cnVjdCBpMmNfbXNtX2Nsa19kaXZfZmxkIHsKKwl1MzIgICAgICAgICAgICAgICAgY2xrX2ZyZXFfb3V0OworCXU4ICAgICAgICAgICAgICAgICBmc19kaXY7CisJdTggICAgICAgICAgICAgICAgIGh0X2RpdjsKK307CisKKy8qCisgKiBkaXZpZGVyIHZhbHVlcyBhcyBwZXIgSFcgRGVzaWduZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX21zbV9jbGtfZGl2X2ZsZCBpMmNfbXNtX2Nsa19kaXZfbWFwW10gPSB7CisJe0tIeigxMDApLCAxMjQsIDYyfSwKKwl7S0h6KDQwMCksICAyOCwgMTR9LAorCXtLSHooMTAwMCksICA4LCAgNX0sCit9OworCisvKgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqIEBmc19kaXYgd2hlbiB6ZXJvIHVzZSB2YWx1ZSBmcm9tIHRhYmxlIGFib3ZlLCBvdGhlcndpc2UgdXNlIGdpdmVuIHZhbHVlCisgKiBAaHRfZGl2IHdoZW4gemVybyB1c2UgdmFsdWUgZnJvbSB0YWJsZSBhYm92ZSwgb3RoZXJ3aXNlIHVzZSBnaXZlbiB2YWx1ZQorICoKKyAqIEZvcm1hdCB0aGUgdmFsdWUgdG8gYmUgY29uZmlndXJlZCBpbnRvIHRoZSBjbG9jayBkaXZpZGVyIHJlZ2lzdGVyLiBUaGlzCisgKiByZWdpc3RlciBpcyBjb25maWd1cmVkIGV2ZXJ5IHRpbWUgY29yZSBpcyBtb3ZlZCBmcm9tIHJlc2V0IHRvIHJ1biBzdGF0ZS4KKyAqLworc3RhdGljIGludCBpMmNfbXNtX3NldF9tc3RyX2Nsa19jdGwoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwgaW50IGZzX2RpdiwKKwkJCWludCBodF9kaXYsIGludCBub2lzZV9yamN0X3NjbCwgaW50IG5vaXNlX3JqY3Rfc2RhKQoreworCWludCByZXQgPSAwOworCWludCBpOworCXUzMiByZWdfdmFsID0gMDsKKwlzdHJ1Y3QgaTJjX21zbV9jbGtfZGl2X2ZsZCAqaXRyID0gaTJjX21zbV9jbGtfZGl2X21hcDsKKworCS8qIHNldCBub2lzZSByZWplY3Rpb24gdmFsdWVzIGZvciBzY2wgYW5kIHNkYSAqLworCXJlZ192YWwgPSBJMkNfTVNNX1NDTF9OT0lTRV9SRUpFQ1RJT04ocmVnX3ZhbCwgbm9pc2VfcmpjdF9zY2wpOworCXJlZ192YWwgPSBJMkNfTVNNX1NEQV9OT0lTRV9SRUpFQ1RJT04ocmVnX3ZhbCwgbm9pc2VfcmpjdF9zZGEpOworCisJLyoKKwkgKiBmaW5kIG1hdGNoaW5nIGZyZXEgYW5kIHNldCBkaXZpZGVyIHZhbHVlcyB1bmxlc3MgdGhleSBhcmUgZm9yY2VkCisJICogZnJvbSBwYXJhbWV0ciBsaXN0CisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaTJjX21zbV9jbGtfZGl2X21hcCk7ICsraSwgKytpdHIpIHsKKwkJaWYgKGN0cmwtPnJzcmNzLmNsa19mcmVxX291dCA9PSBpdHItPmNsa19mcmVxX291dCkgeworCQkJaWYgKCFmc19kaXYpCisJCQkJZnNfZGl2ID0gaXRyLT5mc19kaXY7CisJCQlpZiAoIWh0X2RpdikKKwkJCQlodF9kaXYgPSBpdHItPmh0X2RpdjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZnNfZGl2KSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiRm9yIG5vbi1zdGFuZGFyZCBjbG9jayBmcmVxOiVkS0h6XG4iCisJCSJjbGsgZGl2aWRlciB2YWx1ZSBmc19kaXYgc2hvdWxkIGJlIHN1cHBseSBieSBjbGllbnQgdGhyb3VnaFxuIgorCQkiZGV2aWNlIHRyZWVcbiIsIChjdHJsLT5yc3Jjcy5jbGtfZnJlcV9vdXQgLyAxMDAwKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGZvcm1hdCB2YWx1ZXMgaW4gY2xrLWN0bCBjYWNoZSAqLworCWN0cmwtPm1zdHJfY2xrX2N0bCA9IChyZWdfdmFsICYgKH4weGZmMDdmZikpIHwgKChodF9kaXYgJiAweGZmKSA8PCAxNikKKwkJCQkJCQl8KGZzX2RpdiAmIDB4ZmYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGkyY19tc21fcXVwX3hmZXJfaW5pdF9ydW5fc3RhdGU6IHNldCBxdXAgcmVncyB3aGljaCBtdXN0IGJlIHNldCAqYWZ0ZXIqIHJlc2V0CisgKi8KK3N0YXRpYyB2b2lkIGkyY19tc21fcXVwX3hmZXJfaW5pdF9ydW5fc3RhdGUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBjdHJsLT5yc3Jjcy5iYXNlOworCisJd3JpdGVsX3JlbGF4ZWQoY3RybC0+bXN0cl9jbGtfY3RsLCBiYXNlICsgUVVQX0kyQ19NQVNURVJfQ0xLX0NUTCk7CisKKwkvKiBFbnN1cmUgdGhhdCBRVVAgY29uZmlndXJhdGlvbiBpcyB3cml0dGVuIGJlZm9yZSBsZWF2aW5nIHRoaXMgZnVuYyAqLworCXdtYigpOworCisJaWYgKGN0cmwtPmRiZ2ZzLmRiZ19sdmwgPT0gTVNNX0RCRykgeworCQlkZXZfaW5mbyhjdHJsLT5kZXYsCisJCQkiUVVQIHN0YXRlIGFmdGVyIHByb2dyYW1taW5nIGZvciBuZXh0IHRyYW5zZmVyc1xuIik7CisJCWkyY19tc21fZGJnX3F1cF9yZWdfZHVtcChjdHJsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fZmlmb193cl93b3JkKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwsIHUzMiBkYXRhKQoreworCXdyaXRlbF9yZWxheGVkKGRhdGEsIGN0cmwtPnJzcmNzLmJhc2UgKyBRVVBfT1VUX0ZJRk9fQkFTRSk7CisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgIk9VVC1GSUZPOjB4JTA4eCIsIGRhdGEpOworfQorCitzdGF0aWMgdTMyIGkyY19tc21fZmlmb19yZF93b3JkKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwsIHUzMiAqZGF0YSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX0lOX0ZJRk9fQkFTRSk7CisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgIklOLUZJRk8gOjB4JTA4eCIsIHZhbCk7CisKKwlpZiAoZGF0YSkKKwkJKmRhdGEgPSB2YWw7CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogaTJjX21zbV9maWZvX3dyX2J1Zl9mbHVzaDoKKyAqLworc3RhdGljIHZvaWQgaTJjX21zbV9maWZvX3dyX2J1Zl9mbHVzaChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9maWZvICpmaWZvID0gJmN0cmwtPnhmZXIuZmlmbzsKKwl1MzIgKndvcmQ7CisKKwlpZiAoIWZpZm8tPm91dF9idWZfaWR4KQorCQlyZXR1cm47CisKKwl3b3JkID0gKHUzMiAqKSBmaWZvLT5vdXRfYnVmOworCWkyY19tc21fZmlmb193cl93b3JkKGN0cmwsICp3b3JkKTsKKwlmaWZvLT5vdXRfYnVmX2lkeCA9IDA7CisJKndvcmQgPSAwOworfQorCisvKgorICogaTJjX21zbV9maWZvX3dyX2J1ZjoKKyAqCisgKiBAbGVuIGJ1ZiBzaXplIChpbiBieXRlcykKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gYnVmIHdoaWNoIGhhdmUgYmVlbiBwcm9jZXNzZWQgKHdyaXR0ZW4gdG8KKyAqICAgICAgICAgRklGTyBvciBrZXB0IGluIG91dCBidWZmZXIgYW5kIHdpbGwgYmUgd3JpdHRlbiBsYXRlcikKKyAqLworc3RhdGljIHNpemVfdAoraTJjX21zbV9maWZvX3dyX2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLCB1OCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9maWZvICpmaWZvID0gJmN0cmwtPnhmZXIuZmlmbzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuOyArK2ksICsrYnVmKSB7CisKKwkJZmlmby0+b3V0X2J1ZltmaWZvLT5vdXRfYnVmX2lkeF0gPSAqYnVmOworCQkrK2ZpZm8tPm91dF9idWZfaWR4OworCisJCWlmIChmaWZvLT5vdXRfYnVmX2lkeCA9PSA0KSB7CisJCQl1MzIgKndvcmQgPSAodTMyICopIGZpZm8tPm91dF9idWY7CisKKwkJCWkyY19tc21fZmlmb193cl93b3JkKGN0cmwsICp3b3JkKTsKKwkJCWZpZm8tPm91dF9idWZfaWR4ID0gMDsKKwkJCSp3b3JkID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdCBpMmNfbXNtX2ZpZm9feGZlcl93cl90YWcoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAqYnVmID0gJmN0cmwtPnhmZXIuY3VyX2J1ZjsKKwlzaXplX3QgbGVuID0gMDsKKworCWlmIChjdHJsLT5kYmdmcy5kYmdfbHZsID49IE1TTV9EQkcpIHsKKwkJY2hhciBzdHJbSTJDX01TTV9SRUdfMl9TVFJfQlVGX1NaXTsKKworCQlkZXZfaW5mbyhjdHJsLT5kZXYsICJ0YWcudmFsOjB4JWxseCB0YWcubGVuOiVkICVzXG4iLAorCQkJYnVmLT5vdXRfdGFnLnZhbCwgYnVmLT5vdXRfdGFnLmxlbiwKKwkJCWkyY19tc21fZGJnX3RhZ190b19zdHIoJmJ1Zi0+b3V0X3RhZywgc3RyLAorCQkJCQkJCQlzaXplb2Yoc3RyKSkpOworCX0KKworCWlmIChidWYtPm91dF90YWcubGVuKSB7CisJCWxlbiA9IGkyY19tc21fZmlmb193cl9idWYoY3RybCwgKHU4ICopICZidWYtPm91dF90YWcudmFsLAorCQkJCQkJCWJ1Zi0+b3V0X3RhZy5sZW4pOworCisJCWlmIChsZW4gPCBidWYtPm91dF90YWcubGVuKQorCQkJZ290byBkb25lOworCisJCWJ1Zi0+b3V0X3RhZyA9IChzdHJ1Y3QgaTJjX21zbV90YWcpIHswfTsKKwl9Citkb25lOgorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBpMmNfbXNtX2ZpZm9fcmVhZDogcmVhZHMgdXAgdG8gZmlmbyBzaXplIGludG8gdXNlcidzIGJ1ZgorICovCitzdGF0aWMgdm9pZCBpMmNfbXNtX2ZpZm9fcmVhZF94ZmVyX2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpidWYgPSAmY3RybC0+eGZlci5jdXJfYnVmOworCXN0cnVjdCBpMmNfbXNnICAgICAgICAgICptc2cgPSBjdHJsLT54ZmVyLm1zZ3MgKyBidWYtPm1zZ19pZHg7CisJdTggKnBfdGFnX3ZhbCAgID0gKHU4ICopICZidWYtPmluX3RhZy52YWw7CisJaW50IGJ1Zl9uZWVkX2JjID0gbXNnLT5sZW4gLSBidWYtPmJ5dGVfaWR4OworCXU4ICB3b3JkWzRdOworCWludCBjb3B5X2JjOworCWludCB3b3JkX2lkeDsKKwlpbnQgd29yZF9iYzsKKworCWlmICghYnVmLT5pc19yeCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGJ1Zl9uZWVkX2JjIHx8IGJ1Zi0+aW5fdGFnLmxlbikgeworCQlpMmNfbXNtX2ZpZm9fcmRfd29yZChjdHJsLCAodTMyICopIHdvcmQpOworCQl3b3JkX2JjICA9IHNpemVvZih3b3JkKTsKKwkJd29yZF9pZHggPSAwOworCisJCS8qCisJCSAqIGNvcHkgYnl0ZXMgZnJvbSBmaWZvIHdvcmQgdG8gdGFnLgorCQkgKiBAbm90ZSBidWYtPmluX3RhZy5sZW4gKG1heCAyYnl0ZXMpIDwgd29yZF9iYyAoNGJ5dGVzKQorCQkgKi8KKwkJaWYgKGJ1Zi0+aW5fdGFnLmxlbikgeworCQkJY29weV9iYyA9IG1pbl90KGludCwgd29yZF9iYywgYnVmLT5pbl90YWcubGVuKTsKKworCQkJbWVtY3B5KHBfdGFnX3ZhbCArIGJ1Zi0+aW5fdGFnLmxlbiwgd29yZCwgY29weV9iYyk7CisKKwkJCXdvcmRfaWR4ICAgICAgICArPSBjb3B5X2JjOworCQkJd29yZF9iYyAgICAgICAgIC09IGNvcHlfYmM7CisJCQlidWYtPmluX3RhZy5sZW4gLT0gY29weV9iYzsKKworCQkJaWYgKChjdHJsLT5kYmdmcy5kYmdfbHZsID49IE1TTV9EQkcpICYmCisJCQkJCQkJIWJ1Zi0+aW5fdGFnLmxlbikgeworCQkJCWNoYXIgc3RyWzY0XTsKKworCQkJCWRldl9pbmZvKGN0cmwtPmRldiwgIiVzXG4iLAorCQkJCQlpMmNfbXNtX2RiZ190YWdfdG9fc3RyKCZidWYtPmluX3RhZywKKwkJCQkJCQlzdHIsIHNpemVvZihzdHIpKSk7CisJCQl9CisJCX0KKworCQkvKiBjb3B5IGJ5dGVzIGZyb20gZmlmbyB3b3JkIHRvIHVzZXIncyBidWZmZXIgKi8KKwkJY29weV9iYyA9IG1pbl90KGludCwgd29yZF9iYywgYnVmX25lZWRfYmMpOworCQltZW1jcHkobXNnLT5idWYgKyBidWYtPmJ5dGVfaWR4LCB3b3JkICsgd29yZF9pZHgsIGNvcHlfYmMpOworCisJCWJ1Zi0+Ynl0ZV9pZHggKz0gY29weV9iYzsKKwkJYnVmX25lZWRfYmMgICAtPSBjb3B5X2JjOworCX0KK30KKworLyoKKyAqIGkyY19tc21fZmlmb193cml0ZV94ZmVyX2J1Zjogd3JpdGUgeGZlci5jdXJfYnVmICh1c2VyJ3MtYnVmICsgdGFnKSB0byBmaWZvCisgKi8KK3N0YXRpYyB2b2lkIGkyY19tc21fZmlmb193cml0ZV94ZmVyX2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpidWYgID0gJmN0cmwtPnhmZXIuY3VyX2J1ZjsKKwlzaXplX3QgbGVuOworCXNpemVfdCB0YWdfbGVuOworCisJdGFnX2xlbiA9IGJ1Zi0+b3V0X3RhZy5sZW47CisJbGVuID0gaTJjX21zbV9maWZvX3hmZXJfd3JfdGFnKGN0cmwpOworCWlmIChsZW4gPCB0YWdfbGVuKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3Igb24gd3JpdGluZyB0YWcgdG8gb3V0IEZJRk9cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFidWYtPmlzX3J4KSB7CisJCWlmIChjdHJsLT5kYmdmcy5kYmdfbHZsID49IE1TTV9EQkcpIHsKKwkJCWNoYXIgc3RyW0kyQ19NU01fUkVHXzJfU1RSX0JVRl9TWl07CisJCQlpbnQgIG9mZnNldCA9IDA7CisJCQl1OCAgKnAgICAgICA9IGkyY19tc21fYnVmX3RvX3B0cihidWYpOworCQkJaW50ICBpOworCisJCQlmb3IgKGkgPSAwIDsgaSA8IGxlbjsgKytpLCArK3ApCisJCQkJb2Zmc2V0ICs9IHNucHJpbnRmKHN0ciArIG9mZnNldCwKKwkJCQkJCSAgIHNpemVvZihzdHIpIC0gb2Zmc2V0LAorCQkJCQkJICAgIjB4JXggIiwgKnApOworCQkJZGV2X2luZm8oY3RybC0+ZGV2LCAiZGF0YTogJXNcbiIsIHN0cik7CisJCX0KKworCQlsZW4gPSBpMmNfbXNtX2ZpZm9fd3JfYnVmKGN0cmwsIGkyY19tc21fYnVmX3RvX3B0cihidWYpLAorCQkJCQkJYnVmLT5sZW4pOworCQlpZiAobGVuIDwgYnVmLT5sZW4pCisJCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIG9uIHhmZXJpbmcgYnVmIHdpdGggRklGT1xuIik7CisJfQorfQorCisvKgorICogaTJjX21zbV9maWZvX3hmZXJfcHJvY2VzczoKKyAqCisgKiBAcHJlICAgIHRyYW5zZmVyIHNpemUgaXMgbGVzcyB0aGVuIG9yIGVxdWFsIHRvIGZpZm8gc2l6ZS4KKyAqIEBwcmUgICAgUVVQIGluIHJ1biBzdGF0ZS9wYXVzZQorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpMmNfbXNtX2ZpZm9feGZlcl9wcm9jZXNzKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGkyY19tc21feGZlcl9idWYgZmlyc3RfYnVmID0gY3RybC0+eGZlci5jdXJfYnVmOworCWludCByZXQ7CisKKwkvKiBsb2FkIGZpZm8gd2hpbGUgaW4gcGF1c2Ugc3RhdGUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zICovCisJcmV0ID0gaTJjX21zbV9xdXBfc3RhdGVfc2V0KGN0cmwsIFFVUF9TVEFURV9QQVVTRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiB3cml0ZSBhbGwgdGhhdCBnb2VzIHRvIG91dHB1dCBmaWZvICovCisJd2hpbGUgKGkyY19tc21feGZlcl9uZXh0X2J1ZihjdHJsKSkKKwkJaTJjX21zbV9maWZvX3dyaXRlX3hmZXJfYnVmKGN0cmwpOworCisJaTJjX21zbV9maWZvX3dyX2J1Zl9mbHVzaChjdHJsKTsKKworCWN0cmwtPnhmZXIuY3VyX2J1ZiA9IGZpcnN0X2J1ZjsKKworCXJldCA9IGkyY19tc21fcXVwX3N0YXRlX3NldChjdHJsLCBRVVBfU1RBVEVfUlVOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdhaXQgZm9yIGlucHV0IGRvbmUgaW50ZXJydXB0ICovCisJcmV0ID0gaTJjX21zbV94ZmVyX3dhaXRfZm9yX2NvbXBsZXRpb24oY3RybCwgJmN0cmwtPnhmZXIuY29tcGxldGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogcmVhZCBhbGwgZnJvbSBpbnB1dCBmaWZvICovCisJd2hpbGUgKGkyY19tc21feGZlcl9uZXh0X2J1ZihjdHJsKSkKKwkJaTJjX21zbV9maWZvX3JlYWRfeGZlcl9idWYoY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGkyY19tc21fZmlmb194ZmVyOiBwcm9jZXNzIHRyYW5zZmVyIHVzaW5nIGZpZm8gbW9kZQorICovCitzdGF0aWMgaW50IGkyY19tc21fZmlmb194ZmVyKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IHJldDsKKworCWkyY19tc21fZGJnKGN0cmwsIE1TTV9EQkcsICJTdGFydGluZyBGSUZPIHRyYW5zZmVyIik7CisKKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHByb2dyYW0gcXVwIHJlZ2lzdGVycyAqLworCWkyY19tc21fcXVwX3hmZXJfaW5pdF9yZXNldF9zdGF0ZShjdHJsKTsKKworCXJldCA9IGkyY19tc21fcXVwX3N0YXRlX3NldChjdHJsLCBRVVBfU1RBVEVfUlVOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHByb2dyYW0gcXVwIHJlZ2lzdGVycyB3aGljaCBtdXN0IGJlIHNldCAqYWZ0ZXIqIHJlc2V0ICovCisJaTJjX21zbV9xdXBfeGZlcl9pbml0X3J1bl9zdGF0ZShjdHJsKTsKKworCXJldCA9IGkyY19tc21fZmlmb194ZmVyX3Byb2Nlc3MoY3RybCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaTJjX21zbV9ibGtfaW5pdF9zdHJ1Y3Q6IEFsbG9jYXRlIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZSBibGsgc3RydWN0dXJlCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGkyY19tc21fYmxrX2luaXRfc3RydWN0KHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJdTMyIHJlZ19kYXRhID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX0lPX01PREVTKTsKKwlpbnQgcmV0OworCXN0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9ibGsgKmJsayA9ICZjdHJsLT54ZmVyLmJsazsKKworCWJsay0+aW5fYmxrX3N6ICA9IGkyY19tc21fcmVnX2lvX21vZGVzX2luX2Jsa19zeihyZWdfZGF0YSksCisJYmxrLT5vdXRfYmxrX3N6ID0gaTJjX21zbV9yZWdfaW9fbW9kZXNfb3V0X2Jsa19zeihyZWdfZGF0YSksCisKKwlibGstPnR4X2NhY2hlID0ga21hbGxvYyhibGstPm91dF9ibGtfc3osIEdGUF9LRVJORUwpOworCWlmICghYmxrLT50eF9jYWNoZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9idWZfZXJyOworCX0KKworCWJsay0+cnhfY2FjaGUgPSBrbWFsbG9jKGJsay0+aW5fYmxrX3N6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJsay0+dHhfY2FjaGUpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSJlcnJvciBvbiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgYmxvY2sgdHhfY2FjaGUuIG1hbGxvYyhzaXplOiV6dSlcbiIsCisJCSBibGstPm91dF9ibGtfc3opOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGluX2J1Zl9lcnI7CisJfQorCisJYmxrLT5pc19pbml0ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKKworaW5fYnVmX2VycjoKKwlrZnJlZShibGstPnR4X2NhY2hlKTsKK291dF9idWZfZXJyOgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGkyY19tc21fYmxrX3dyX2ZsdXNoOiBmbHVzaGVzIGludGVybmFsIGNhY2hlZCBibG9jayB0byBGSUZPCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGkyY19tc21fYmxrX3dyX2ZsdXNoKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IGJ5dGVfbnVtOworCWludCByZXQgPSAwOworCXN0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9ibGsgKmJsayA9ICZjdHJsLT54ZmVyLmJsazsKKwl1MzIgKmJ1Zl91MzJfcHRyOworCisJaWYgKCFibGstPnR4X2NhY2hlX2lkeCkKKwkJcmV0dXJuIDA7CisKKwkvKiBpZiBubyBibG9ja3MgYXZhaWxhYmxlIHdhaXQgZm9yIGludGVycnVwdCAqLworCXJldCA9IGkyY19tc21feGZlcl93YWl0X2Zvcl9jb21wbGV0aW9uKGN0cmwsICZibGstPndhaXRfdHhfYmxrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBwYXVzZSB0aGUgY29udHJvbGxlciB1bnRpbCB3ZSBmaW5pc2ggbG9hZGluZyB0aGUgYmxvY2sgaW4gb3JkZXIgdG8KKwkgKiBhdm9pZCByYWNlIGNvbmRpdGlvbnMKKwkgKi8KKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1BBVVNFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpMmNfbXNtX2RiZyhjdHJsLCBNU01fREJHLCAiT1VULUJMSzolKnBoQyIsIGJsay0+dHhfY2FjaGVfaWR4LAorCQkJCQkJCWJsay0+dHhfY2FjaGUpOworCisJZm9yIChieXRlX251bSA9IDA7IGJ5dGVfbnVtIDwgYmxrLT50eF9jYWNoZV9pZHg7CisJCQkJCQlieXRlX251bSArPSBzaXplb2YodTMyKSkgeworCQlidWZfdTMyX3B0ciA9ICh1MzIgKikgKGJsay0+dHhfY2FjaGUgKyBieXRlX251bSk7CisJCXdyaXRlbF9yZWxheGVkKCpidWZfdTMyX3B0ciwKKwkJCQkJY3RybC0+cnNyY3MuYmFzZSArIFFVUF9PVVRfRklGT19CQVNFKTsKKwkJKmJ1Zl91MzJfcHRyID0gMDsKKwl9CisKKwkvKiBub3cgY2FjaGUgaXMgZW1wdHkgKi8KKwlibGstPnR4X2NhY2hlX2lkeCA9IDA7CisJcmV0ID0gaTJjX21zbV9xdXBfc3RhdGVfc2V0KGN0cmwsIFFVUF9TVEFURV9SVU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGkyY19tc21fYmxrX3dyX2J1ZjoKKyAqCisgKiBAbGVuIGJ1ZiBzaXplIChpbiBieXRlcykKKyAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gYnVmIHdoaWNoIGhhdmUgYmVlbiBwcm9jZXNzZWQgKHdyaXR0ZW4gdG8KKyAqICAgICAgICAgRklGTyBvciBrZXB0IGluIG91dCBidWZmZXIgYW5kIHdpbGwgYmUgd3JpdHRlbiBsYXRlcikKKyAqLworc3RhdGljIGludAoraTJjX21zbV9ibGtfd3JfYnVmKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2JsayAqYmxrID0gJmN0cmwtPnhmZXIuYmxrOworCWludCBieXRlX251bTsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoYnl0ZV9udW0gPSAwOyBieXRlX251bSA8IGxlbjsgKytieXRlX251bSwgKytidWYpIHsKKwkJYmxrLT50eF9jYWNoZVtibGstPnR4X2NhY2hlX2lkeF0gPSAqYnVmOworCQkrK2Jsay0+dHhfY2FjaGVfaWR4OworCisJCS8qIGZsdXNoIGNhY2hlZCBidWZmZXIgdG8gSFcgRklGTyB3aGVuIGZ1bGwgKi8KKwkJaWYgKGJsay0+dHhfY2FjaGVfaWR4ID09IGJsay0+b3V0X2Jsa19zeikgeworCQkJcmV0ID0gaTJjX21zbV9ibGtfd3JfZmx1c2goY3RybCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIGJ5dGVfbnVtOworfQorCisvKgorICogaTJjX21zbV9ibGtfeGZlcl93cl90YWc6IGJ1ZmZlcmVkIHdyaXRpbmcgdGhlIHRhZyBvZiBjdXJyZW50IGJ1ZgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpMmNfbXNtX2Jsa194ZmVyX3dyX3RhZyhzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpidWYgPSAmY3RybC0+eGZlci5jdXJfYnVmOworCWludCBsZW4gPSAwOworCisJaWYgKCFidWYtPm91dF90YWcubGVuKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IGkyY19tc21fYmxrX3dyX2J1ZihjdHJsLCAodTggKikgJmJ1Zi0+b3V0X3RhZy52YWwsCisJCQkJCQkJYnVmLT5vdXRfdGFnLmxlbik7CisJaWYgKGxlbiAhPSBidWYtPm91dF90YWcubGVuKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1Zi0+b3V0X3RhZyA9IChzdHJ1Y3QgaTJjX21zbV90YWcpIHswfTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGkyY19tc21fYmxrX3dyX3hmZXJfYnVmOiB3cml0ZXMgY3RybC0+eGZlci5jdXJfYnVmIHRvIEhXCisgKgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpMmNfbXNtX2Jsa193cl94ZmVyX2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpidWYgID0gJmN0cmwtPnhmZXIuY3VyX2J1ZjsKKwlpbnQgbGVuOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbXNtX2Jsa194ZmVyX3dyX3RhZyhjdHJsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbGVuID0gaTJjX21zbV9ibGtfd3JfYnVmKGN0cmwsIGkyY19tc21fYnVmX3RvX3B0cihidWYpLCBidWYtPmxlbik7CisJaWYgKGxlbiA8IGJ1Zi0+bGVuKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1Zi0+Ynl0ZV9pZHggKz0gbGVuOworCXJldHVybiAwOworfQorCisvKgorICogaTJjX21zbV9ibGtfcmRfYmxrOiByZWFkIGEgYmxvY2sgZnJvbSBIVyBGSUZPIHRvIGludGVybmFsIGNhY2hlCisgKgorICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBuZWdhdGl2ZSBlcnJvciB2YWx1ZQorICogQG5lZWRfYmMgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2UgbmVlZAorICoKKyAqIHVzZXMgaW50ZXJuYWwgY291bnRlciB0byBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBhdmFpbGFibGUgYmxvY2tzLiBXaGVuCisgKiB6ZXJvLCB3YWl0cyBmb3IgaW50ZXJydXB0LgorICovCitzdGF0aWMgaW50IGkyY19tc21fYmxrX3JkX2JsayhzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLCBpbnQgbmVlZF9iYykKK3sKKwlpbnQgYnl0ZV9udW07CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2JsayAqYmxrID0gJmN0cmwtPnhmZXIuYmxrOworCXUzMiAqY2FjaGVfcHRyID0gKHUzMiAqKSBibGstPnJ4X2NhY2hlOworCWludCByZWFkX2JjICAgID0gbWluX3QoaW50LCBibGstPmluX2Jsa19zeiwgbmVlZF9iYyk7CisKKwkvKiB3YWl0IGZvciBibG9jayBhdmlhbGJsZSBpbnRlcnJ1cHQgKi8KKwlyZXQgPSBpMmNfbXNtX3hmZXJfd2FpdF9mb3JfY29tcGxldGlvbihjdHJsLCAmYmxrLT53YWl0X3J4X2Jsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlYWQgYmxvY2sgZnJvbSBIVyB0byBjYWNoZSAqLworCWZvciAoYnl0ZV9udW0gPSAwOyBieXRlX251bSA8IGJsay0+aW5fYmxrX3N6OworCQkJCQlieXRlX251bSArPSBzaXplb2YodTMyKSkgeworCQlpZiAoYnl0ZV9udW0gPCByZWFkX2JjKSB7CisJCQkqY2FjaGVfcHRyID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yc3Jjcy5iYXNlICsKKwkJCQkJCQlRVVBfSU5fRklGT19CQVNFKTsKKwkJCSsrY2FjaGVfcHRyOworCQl9CisJfQorCWJsay0+cnhfY2FjaGVfaWR4ID0gMDsKKwlyZXR1cm4gcmVhZF9iYzsKK30KKworLyoKKyAqIGkyY19tc21fYmxrX3JkX3hmZXJfYnVmOiBmaWxsIGluIGN0cmwtPnhmZXIuY3VyX2J1ZiBmcm9tIEhXCisgKgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBpMmNfbXNtX2Jsa19yZF94ZmVyX2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9ibGsgKmJsayA9ICZjdHJsLT54ZmVyLmJsazsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAqYnVmICAgICAgPSAmY3RybC0+eGZlci5jdXJfYnVmOworCXN0cnVjdCBpMmNfbXNnICptc2cgICAgICAgICAgICAgICA9IGN0cmwtPnhmZXIubXNncyArIGJ1Zi0+bXNnX2lkeDsKKwlpbnQgICAgY29weV9iYzsgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSB0byB1c2VyJ3MgYnVmZmVyICovCisJaW50ICAgIGNhY2hlX2F2YWlsX2JjOworCWludCAgICByZXQgPSAwOworCisJLyogd3JpdGUgdGFnIHRvIG91dCBGSUZPICovCisJcmV0ID0gaTJjX21zbV9ibGtfeGZlcl93cl90YWcoY3RybCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpMmNfbXNtX2Jsa193cl9mbHVzaChjdHJsKTsKKworCXdoaWxlIChidWYtPmxlbiB8fCBidWYtPmluX3RhZy5sZW4pIHsKKwkJY2FjaGVfYXZhaWxfYmMgPSBpMmNfbXNtX2Jsa19yZF9ibGsoY3RybCwKKwkJCQkJCWJ1Zi0+bGVuICsgYnVmLT5pbl90YWcubGVuKTsKKworCQlpMmNfbXNtX2RiZyhjdHJsLCBNU01fREJHLCAiSU4tQkxLOiUqcGhDXG4iLCBjYWNoZV9hdmFpbF9iYywKKwkJCQkJYmxrLT5yeF9jYWNoZSArIGJsay0+cnhfY2FjaGVfaWR4KTsKKworCQlpZiAoY2FjaGVfYXZhaWxfYmMgPCAwKQorCQkJcmV0dXJuIGNhY2hlX2F2YWlsX2JjOworCisJCS8qIGRpc2NhcmQgdGFnIGZyb20gaW5wdXQgRklGTyAqLworCQlpZiAoYnVmLT5pbl90YWcubGVuKSB7CisJCQlpbnQgZGlzY2FyZF9iYyA9IG1pbl90KGludCwgY2FjaGVfYXZhaWxfYmMsCisJCQkJCQkJYnVmLT5pbl90YWcubGVuKTsKKwkJCWJsay0+cnhfY2FjaGVfaWR4ICs9IGRpc2NhcmRfYmM7CisJCQlidWYtPmluX3RhZy5sZW4gICAtPSBkaXNjYXJkX2JjOworCQkJY2FjaGVfYXZhaWxfYmMgICAgLT0gZGlzY2FyZF9iYzsKKwkJfQorCisJCS8qIGNvcHkgYnl0ZXMgZnJvbSBjYWNoZWQgYmxvY2sgdG8gdXNlcidzIGJ1ZmZlciAqLworCQljb3B5X2JjID0gbWluX3QoaW50LCBjYWNoZV9hdmFpbF9iYywgYnVmLT5sZW4pOworCQltZW1jcHkobXNnLT5idWYgKyBidWYtPmJ5dGVfaWR4LAorCQkJYmxrLT5yeF9jYWNoZSArIGJsay0+cnhfY2FjaGVfaWR4LCBjb3B5X2JjKTsKKworCQlibGstPnJ4X2NhY2hlX2lkeCArPSBjb3B5X2JjOworCQlidWYtPmxlbiAgICAgICAgICAtPSBjb3B5X2JjOworCQlidWYtPmJ5dGVfaWR4ICAgICArPSBjb3B5X2JjOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaTJjX21zbV9ibGtfeGZlcjogcHJvY2VzcyB0cmFuc2ZlciB1c2luZyBibG9jayBtb2RlCisgKi8KK3N0YXRpYyBpbnQgaTJjX21zbV9ibGtfeGZlcihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICAgICAgKmJ1ZiA9ICZjdHJsLT54ZmVyLmN1cl9idWY7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2JsayAqYmxrID0gJmN0cmwtPnhmZXIuYmxrOworCisJaWYgKCFibGstPmlzX2luaXQpIHsKKwkJcmV0ID0gaTJjX21zbV9ibGtfaW5pdF9zdHJ1Y3QoY3RybCk7CisJCWlmICghYmxrLT5pc19pbml0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJmJsay0+d2FpdF9yeF9ibGspOworCWluaXRfY29tcGxldGlvbigmYmxrLT53YWl0X3R4X2Jsayk7CisKKwkvKiB0eF9jbnQgPiAwIGFsd2F5cyAqLworCWJsay0+Y29tcGxldGVfbWFzayA9IFFVUF9NQVhfT1VUUFVUX0RPTkVfRkxBRzsKKwlpZiAoY3RybC0+eGZlci5yeF9jbnQpCisJCWJsay0+Y29tcGxldGVfbWFzayB8PSBRVVBfTUFYX0lOUFVUX0RPTkVfRkxBRzsKKworCS8qIGluaXRpYWxpemUgYmxvY2sgbW9kZSBmb3IgbmV3IHRyYW5zZmVyICovCisJYmxrLT50eF9jYWNoZV9pZHggPSAwOworCWJsay0+cnhfY2FjaGVfaWR4ID0gMDsKKworCXJldCA9IGkyY19tc21fcXVwX3N0YXRlX3NldChjdHJsLCBRVVBfU1RBVEVfUkVTRVQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogcHJvZ3JhbSBxdXAgcmVnaXN0ZXJzICovCisJaTJjX21zbV9xdXBfeGZlcl9pbml0X3Jlc2V0X3N0YXRlKGN0cmwpOworCisJcmV0ID0gaTJjX21zbV9xdXBfc3RhdGVfc2V0KGN0cmwsIFFVUF9TVEFURV9SVU4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogcHJvZ3JhbSBxdXAgcmVnaXN0ZXJzIHdoaWNoIG11c3QgYmUgc2V0ICphZnRlciogcmVzZXQgKi8KKwlpMmNfbXNtX3F1cF94ZmVyX2luaXRfcnVuX3N0YXRlKGN0cmwpOworCisJd2hpbGUgKGkyY19tc21feGZlcl9uZXh0X2J1ZihjdHJsKSkgeworCQlpZiAoYnVmLT5pc19yeCkgeworCQkJcmV0ID0gaTJjX21zbV9ibGtfcmRfeGZlcl9idWYoY3RybCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQkvKgorCQkJICogU1cgd29ya2Fyb3VuZCB0byB3YWl0IGZvciBleHRyYSBpbnRlcnJ1cHQgZnJvbQorCQkJICogaGFyZHdhcmUgZm9yIGxhc3QgYmxvY2sgaW4gYmxvY2sgbW9kZSBmb3IgcmVhZAorCQkJICovCisJCQlpZiAoYnVmLT5pc19sYXN0KSB7CisJCQkJcmV0ID0gaTJjX21zbV94ZmVyX3dhaXRfZm9yX2NvbXBsZXRpb24oY3RybCwKKwkJCQkJCQkmYmxrLT53YWl0X3J4X2Jsayk7CisJCQkJaWYgKCFyZXQpCisJCQkJCWNvbXBsZXRlKCZjdHJsLT54ZmVyLmNvbXBsZXRlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IGkyY19tc21fYmxrX3dyX3hmZXJfYnVmKGN0cmwpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWkyY19tc21fYmxrX3dyX2ZsdXNoKGN0cmwpOworCXJldHVybiBpMmNfbXNtX3hmZXJfd2FpdF9mb3JfY29tcGxldGlvbihjdHJsLCAmY3RybC0+eGZlci5jb21wbGV0ZSk7Cit9CisKKy8qCisgKiBpMmNfbXNtX2RtYV94ZmVyX3ByZXBhcmU6IG1hcCBETUEgYnVmZmVycywgYW5kIGNyZWF0ZSB0YWdzLgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqLworc3RhdGljIGludCBpMmNfbXNtX2RtYV94ZmVyX3ByZXBhcmUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZG1hICpkbWEgID0gJmN0cmwtPnhmZXIuZG1hOworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICAgICAgKmJ1ZiAgPSAmY3RybC0+eGZlci5jdXJfYnVmOworCXN0cnVjdCBpMmNfbXNtX2RtYV9jaGFuICAgICAgKnR4ID0gJmRtYS0+Y2hhbltJMkNfTVNNX0RNQV9UWF07CisJc3RydWN0IGkyY19tc21fZG1hX2NoYW4gICAgICAqcnggPSAmZG1hLT5jaGFuW0kyQ19NU01fRE1BX1JYXTsKKwlzdHJ1Y3QgaTJjX21zbV9kbWFfYnVmICpkbWFfYnVmOworCWludCAgICAgICAgICAgICAgICAgICAgIHJlbV9idWZfY250ID0gSTJDX01TTV9ETUFfREVTQ19BUlJfU0laOworCXN0cnVjdCBpMmNfbXNnICAgICAgICAgKmN1cl9tc2c7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gYnVmX2RtYV9kaXJjdG47CisJc3RydWN0IGkyY19tc21fZG1hX21lbSAgZGF0YTsKKwl1OCAgICAgICAgKnRhZ19hcnJfaXRyX3ZydGxfYWRkcjsKKwlkbWFfYWRkcl90IHRhZ19hcnJfaXRyX3BoeV9hZGRyOworCisJdHgtPmRlc2NfY250X2N1ciAgICA9IDA7CisJcngtPmRlc2NfY250X2N1ciAgICA9IDA7CisJZG1hLT5idWZfYXJyX2NudCAgICAgID0gMDsKKwlkbWFfYnVmICAgICAgICAgICAgICAgPSBkbWEtPmJ1Zl9hcnI7CisJdGFnX2Fycl9pdHJfdnJ0bF9hZGRyID0gKCh1OCAqKSBkbWEtPnRhZ19hcnIudnJ0bF9hZGRyKTsKKwl0YWdfYXJyX2l0cl9waHlfYWRkciAgPSBkbWEtPnRhZ19hcnIucGh5X2FkZHI7CisKKwlmb3IgKDsgaTJjX21zbV94ZmVyX25leHRfYnVmKGN0cmwpICYmIHJlbV9idWZfY250OworCQkrK2RtYV9idWYsCisJCXRhZ19hcnJfaXRyX3BoeV9hZGRyICArPSBzaXplb2YoZG1hX2FkZHJfdCksCisJCXRhZ19hcnJfaXRyX3ZydGxfYWRkciArPSBzaXplb2YoZG1hX2FkZHJfdCkpIHsKKworCQkvKiBkbWEtbWFwIHRoZSBjbGllbnQncyBtZXNzYWdlICovCisJCWN1cl9tc2cgICAgICAgID0gY3RybC0+eGZlci5tc2dzICsgYnVmLT5tc2dfaWR4OworCQlkYXRhLnZydGxfYWRkciA9IGN1cl9tc2ctPmJ1ZiArIGJ1Zi0+Ynl0ZV9pZHg7CisJCWlmIChidWYtPmlzX3J4KSB7CisJCQlidWZfZG1hX2RpcmN0biAgPSBETUFfRlJPTV9ERVZJQ0U7CisJCQlyeC0+ZGVzY19jbnRfY3VyICs9IDI7IC8qIG1zZyArIHRhZyAqLworCQkJdHgtPmRlc2NfY250X2N1ciArPSAxOyAvKiB0YWcgKi8KKwkJfSBlbHNlIHsKKwkJCWJ1Zl9kbWFfZGlyY3RuICA9IERNQV9UT19ERVZJQ0U7CisJCQl0eC0+ZGVzY19jbnRfY3VyICs9IDI7IC8qIG1zZyArIHRhZyAqLworCQl9CisKKwkJLyogZm9yIGxhc3QgYnVmZmVyIGluIGEgdHJhbnNmZXIgbXNnICovCisJCWlmIChidWYtPmlzX2xhc3QpIHsKKwkJCS8qIGFkZCBvdnJoZWFkIGJ5dGUgY250IGZvciB0YWdzIHNwZWNpZmljIHRvIERNQSBtb2RlICovCisJCQljdHJsLT54ZmVyLnJ4X292cmhkX2NudCArPSAyOyAvKiBFT1QrRkxVU0hfU1RPUCB0YWdzKi8KKwkJCWN0cmwtPnhmZXIudHhfb3ZyaGRfY250ICs9IDI7IC8qIEVPVCtGTFVTSF9TVE9QIHRhZ3MgKi8KKworCQkJLyogaW5jcmVtZW50IHJ4IGRlc2MgY250IHRvIHJlYWQgb2ZmIHRhZ3MgYW5kCisJCQkgKiBpbmNyZW1lbnQgdHggZGVzYyBjbnQgdG8gcXVldWUgRU9UK0ZMVVNIX1NUT1AgdGFncworCQkJICovCisJCQl0eC0+ZGVzY19jbnRfY3VyKys7CisJCQlyeC0+ZGVzY19jbnRfY3VyKys7CisJCX0KKworCQlpZiAoKHJ4LT5kZXNjX2NudF9jdXIgPj0gSTJDX01TTV9ETUFfUlhfU1opIHx8CisJCSAgICAodHgtPmRlc2NfY250X2N1ciA+PSBJMkNfTVNNX0RNQV9UWF9TWikpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlkYXRhLnBoeV9hZGRyID0gZG1hX21hcF9zaW5nbGUoY3RybC0+ZGV2LCBkYXRhLnZydGxfYWRkciwKKwkJCQkJCWJ1Zi0+bGVuLCBidWZfZG1hX2RpcmN0bik7CisKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGN0cmwtPmRldiwgZGF0YS5waHlfYWRkcikpIHsKKwkJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJICAiZXJyb3IgRE1BIG1hcHBpbmcgRE1BIGJ1ZmZlcnMsIGVycjolbGxkIGJ1Zl92cnRsOjB4JXAgZGF0YV9sZW46JWQgZG1hX2Rpcjolc1xuIiwKKwkJCSAgKHU2NCkgZGF0YS5waHlfYWRkciwgZGF0YS52cnRsX2FkZHIsIGJ1Zi0+bGVuLAorCQkJICAoKGJ1Zl9kbWFfZGlyY3RuID09IERNQV9GUk9NX0RFVklDRSkKKwkJCQk/ICJETUFfRlJPTV9ERVZJQ0UiIDogIkRNQV9UT19ERVZJQ0UiKSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIGNvcHkgOCBieXRlcy4gT25seSB0YWcubGVuIGJ5dGVzIHdpbGwgYmUgdXNlZCAqLworCQkqKCh1NjQgKil0YWdfYXJyX2l0cl92cnRsX2FkZHIpID0gIGJ1Zi0+b3V0X3RhZy52YWw7CisKKwkJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywKKwkJCSJ2cnRsOjB4JXAgcGh5OjB4JWxseCB2YWw6MHglbGx4IHNpemVvZihkbWFfYWRkcl90KTolenUiLAorCQkJdGFnX2Fycl9pdHJfdnJ0bF9hZGRyLCAodTY0KSB0YWdfYXJyX2l0cl9waHlfYWRkciwKKwkJCSooKHU2NCAqKXRhZ19hcnJfaXRyX3ZydGxfYWRkciksIHNpemVvZihkbWFfYWRkcl90KSk7CisKKwkJLyoKKwkJICogY3JlYXRlIGRtYSBidWYsIGluIHRoZSBkbWEgYnVmIGFyciwgYmFzZWQgb24gdGhlIGJ1ZiBjcmVhdGVkCisJCSAqIGJ5IGkyY19tc21feGZlcl9uZXh0X2J1ZigpCisJCSAqLworCQkqZG1hX2J1ZiA9IChzdHJ1Y3QgaTJjX21zbV9kbWFfYnVmKSB7CisJCQkucHRyICAgICAgPSBkYXRhLAorCQkJLmxlbiAgICAgID0gYnVmLT5sZW4sCisJCQkuZG1hX2RpciAgPSBidWZfZG1hX2RpcmN0biwKKwkJCS5pc19yeCAgICA9IGJ1Zi0+aXNfcngsCisJCQkuaXNfbGFzdCAgPSBidWYtPmlzX2xhc3QsCisJCQkudGFnICAgICAgPSAoc3RydWN0IGkyY19tc21fZG1hX3RhZykgeworCQkJCS5idWYgPSB0YWdfYXJyX2l0cl9waHlfYWRkciwKKwkJCQkubGVuID0gYnVmLT5vdXRfdGFnLmxlbiwKKwkJCX0sCisJCX07CisJCSsrZG1hLT5idWZfYXJyX2NudDsKKwkJLS1yZW1fYnVmX2NudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpMmNfbXNtX2RtYV94ZmVyX3VucHJlcGFyZTogREFNIHVubWFwIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGkyY19tc21fZG1hX3hmZXJfdW5wcmVwYXJlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IGk7CisJc3RydWN0IGkyY19tc21fZG1hX2J1ZiAqYnVmX2l0ciA9IGN0cmwtPnhmZXIuZG1hLmJ1Zl9hcnI7CisKKwlmb3IgKGkgPSAwIDsgaSA8IGN0cmwtPnhmZXIuZG1hLmJ1Zl9hcnJfY250IDsgKytpLCArK2J1Zl9pdHIpCisJCWRtYV91bm1hcF9zaW5nbGUoY3RybC0+ZGV2LCBidWZfaXRyLT5wdHIucGh5X2FkZHIsIGJ1Zl9pdHItPmxlbiwKKwkJCQkJCQlidWZfaXRyLT5kbWFfZGlyKTsKK30KKworc3RhdGljIHZvaWQgaTJjX21zbV9kbWFfY2FsbGJhY2tfdHhfY29tcGxldGUodm9pZCAqZG1hX2FzeW5jX3BhcmFtKQoreworCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwgPSBkbWFfYXN5bmNfcGFyYW07CisKKwljb21wbGV0ZSgmY3RybC0+eGZlci5jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fZG1hX2NhbGxiYWNrX3J4X2NvbXBsZXRlKHZvaWQgKmRtYV9hc3luY19wYXJhbSkKK3sKKwlzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsID0gZG1hX2FzeW5jX3BhcmFtOworCisJY29tcGxldGUoJmN0cmwtPnhmZXIucnhfY29tcGxldGUpOworfQorCisvKgorICogaTJjX21zbV9kbWFfeGZlcl9wcm9jZXNzOiBRdWV1ZSB0cmFuc2ZlcnMgdG8gRE1BCisgKiBAcHJlIDEpUVVQIGlzIGluIHJ1biBzdGF0ZS4gMikgaTJjX21zbV9kbWFfeGZlcl9wcmVwYXJlKCkgd2FzIGNhbGxlZC4KKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgaTJjX21zbV9kbWFfeGZlcl9wcm9jZXNzKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2RtYSAqZG1hID0gJmN0cmwtPnhmZXIuZG1hOworCXN0cnVjdCBpMmNfbXNtX2RtYV9jaGFuICp0eCAgICAgICA9ICZkbWEtPmNoYW5bSTJDX01TTV9ETUFfVFhdOworCXN0cnVjdCBpMmNfbXNtX2RtYV9jaGFuICpyeCAgICAgICA9ICZkbWEtPmNoYW5bSTJDX01TTV9ETUFfUlhdOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcnggICAgICAgICA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19yeF9pdHIgICAgID0gTlVMTDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3R4ICAgICAgICAgPSBOVUxMOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfdHhfaXRyICAgICA9IE5VTEw7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAgICAqZG1hX2Rlc2Nfcng7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAgICAqZG1hX2Rlc2NfdHg7CisJc3RydWN0IGkyY19tc21fZG1hX2J1ZiAgICAgICAgICAgICAqYnVmX2l0cjsKKwlpbnQgIGk7CisJaW50ICByZXQgPSAwOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgIkdvaW5nIHRvIGVucXVldWUgJXp1IGJ1ZmZlcnMgaW4gRE1BIiwKKwkJCQkJCQlkbWEtPmJ1Zl9hcnJfY250KTsKKworCS8qIFNldCB0aGUgUVVQIFN0YXRlIHRvIHBhdXNlIHdoaWxlIERNQSBjb21wbGV0ZXMgdGhlIHR4biAqLworCXJldCA9IGkyY19tc21fcXVwX3N0YXRlX3NldChjdHJsLCBRVVBfU1RBVEVfUEFVU0UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJ0cmFuc2l0aW9uIHRvIHBhdXNlIHN0YXRlIGZhaWxlZCBiZWZvcmUgRE1BIHRyYW5zYWN0aW9uIDolZFxuIiwKKwkJCQkJCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2dfdHggPSBrY2FsbG9jKHR4LT5kZXNjX2NudF9jdXIsIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpLAorCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNnX3R4KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG1hX3hmZXJfZW5kOworCX0KKwlzZ19pbml0X3RhYmxlKHNnX3R4LCB0eC0+ZGVzY19jbnRfY3VyKTsKKwlzZ190eF9pdHIgPSBzZ190eDsKKworCXNnX3J4ID0ga2NhbGxvYyhyeC0+ZGVzY19jbnRfY3VyLCBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFzZ19yeCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRtYV94ZmVyX2VuZDsKKwl9CisJc2dfaW5pdF90YWJsZShzZ19yeCwgcngtPmRlc2NfY250X2N1cik7CisJc2dfcnhfaXRyID0gc2dfcng7CisKKwlidWZfaXRyID0gZG1hLT5idWZfYXJyOworCisJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2Fycl9jbnQgOyArK2ksICsrYnVmX2l0cikgeworCQkvKiBRdWV1ZSB0YWcgKi8KKwkJc2dfZG1hX2FkZHJlc3Moc2dfdHhfaXRyKSA9IGJ1Zl9pdHItPnRhZy5idWY7CisJCXNnX2RtYV9sZW4oc2dfdHhfaXRyKSA9IGJ1Zl9pdHItPnRhZy5sZW47CisJCSsrc2dfdHhfaXRyOworCisJCS8qIHJlYWQgb2ZmIHRhZyArIGxlbiBieXRlcyhkb24ndCBjYXJlKSBpbiBpbnB1dCBGSUZPCisJCSAqIG9uIHJlYWQgdHJhbnNmZXIKKwkJICovCisJCWlmIChidWZfaXRyLT5pc19yeCkgeworCQkJLyogcmlkIG9mIGlucHV0IHRhZyAqLworCQkJc2dfZG1hX2FkZHJlc3Moc2dfcnhfaXRyKSA9CisJCQkJCWN0cmwtPnhmZXIuZG1hLmlucHV0X3RhZy5waHlfYWRkcjsKKwkJCXNnX2RtYV9sZW4oc2dfcnhfaXRyKSAgICAgPSBRVVBfQlVGX09WRVJIRF9CQzsKKwkJCSsrc2dfcnhfaXRyOworCisJCQkvKiBxdWV1ZSBkYXRhIGJ1ZmZlciAqLworCQkJc2dfZG1hX2FkZHJlc3Moc2dfcnhfaXRyKSA9IGJ1Zl9pdHItPnB0ci5waHlfYWRkcjsKKwkJCXNnX2RtYV9sZW4oc2dfcnhfaXRyKSAgICAgPSBidWZfaXRyLT5sZW47CisJCQkrK3NnX3J4X2l0cjsKKwkJfSBlbHNlIHsKKwkJCXNnX2RtYV9hZGRyZXNzKHNnX3R4X2l0cikgPSBidWZfaXRyLT5wdHIucGh5X2FkZHI7CisJCQlzZ19kbWFfbGVuKHNnX3R4X2l0cikgICAgID0gYnVmX2l0ci0+bGVuOworCQkJKytzZ190eF9pdHI7CisJCX0KKwl9CisKKwkvKiB0aGlzIHRhZyB3aWxsIGJlIGNvcGllZCB0byByeCBmaWZvICovCisJc2dfZG1hX2FkZHJlc3Moc2dfdHhfaXRyKSA9IGRtYS0+ZW90X25fZmx1c2hfc3RvcF90YWdzLnBoeV9hZGRyOworCXNnX2RtYV9sZW4oc2dfdHhfaXRyKSAgICAgPSBRVVBfQlVGX09WRVJIRF9CQzsKKwkrK3NnX3R4X2l0cjsKKworCS8qCisJICogUmVhZGluZyB0aGUgdGFnIG9mZiB0aGUgaW5wdXQgZmlmbyBoYXMgc2lkZSBlZmZlY3RzIGFuZAorCSAqIGl0IGlzIG1hbmRhdG9yeSBmb3IgZ2V0dGluZyB0aGUgRE1BJ3MgaW50ZXJydXB0LgorCSAqLworCXNnX2RtYV9hZGRyZXNzKHNnX3J4X2l0cikgPSBjdHJsLT54ZmVyLmRtYS5pbnB1dF90YWcucGh5X2FkZHI7CisJc2dfZG1hX2xlbihzZ19yeF9pdHIpICAgICA9IFFVUF9CVUZfT1ZFUkhEX0JDOworCSsrc2dfcnhfaXRyOworCisJLyoKKwkgKiBXZSBvbmx5IHdhbnQgYSBzaW5nbGUgQkFNIGludGVycnVwdCBwZXIgdHJhbnNmZXIsIGFuZCB3ZSBhbHdheXMKKwkgKiBhZGQgYSBmbHVzaC1zdG9wIGkyYyB0YWcgYXMgdGhlIGxhc3QgdHggc2cgZW50cnkuIFNpbmNlIHRoZSBkbWEKKwkgKiBkcml2ZXIgcHV0cyB0aGUgc3VwcGxpZWQgQkFNIGZsYWdzIG9ubHkgb24gdGhlIGxhc3QgQkFNIGRlc2NyaXB0b3IsCisJICogdGhlIGZsdXNoIHN0b3Agd2lsbCBhbHdheXMgYmUgdGhlIG9uZSB3aGljaCBnZW5lcmF0ZSB0aGF0IGludGVycnVwdAorCSAqIGFuZCBpbnZva2VzIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlkbWFfZGVzY190eCA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKHR4LT5kbWFfY2hhbiwKKwkJCQkJCXNnX3R4LAorCQkJCQkJc2dfdHhfaXRyIC0gc2dfdHgsCisJCQkJCQl0eC0+ZGlyLAorCQkJCQkJKFNQU19JT1ZFQ19GTEFHX0VPVCB8CisJCQkJCQkJU1BTX0lPVkVDX0ZMQUdfTldEKSk7CisJaWYgKGRtYV9kZXNjX3R4IDwgMCkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnIHR4OiVsZFxuIiwKKwkJCQkJCQlQVFJfRVJSKGRtYV9kZXNjX3R4KSk7CisJCXJldCA9IFBUUl9FUlIoZG1hX2Rlc2NfdHgpOworCQlnb3RvIGRtYV94ZmVyX2VuZDsKKwl9CisKKwkvKiBjYWxsYmFjayBkZWZpbmVkIGZvciB0eCBkbWEgZGVzYyAqLworCWRtYV9kZXNjX3R4LT5jYWxsYmFjayAgICAgICA9IGkyY19tc21fZG1hX2NhbGxiYWNrX3R4X2NvbXBsZXRlOworCWRtYV9kZXNjX3R4LT5jYWxsYmFja19wYXJhbSA9IGN0cmw7CisJZG1hZW5naW5lX3N1Ym1pdChkbWFfZGVzY190eCk7CisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcodHgtPmRtYV9jaGFuKTsKKworCS8qIHF1ZXVlIHRoZSByeCBkbWEgZGVzYyAqLworCWRtYV9kZXNjX3J4ID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2cocngtPmRtYV9jaGFuLCBzZ19yeCwKKwkJCQkJc2dfcnhfaXRyIC0gc2dfcngsIHJ4LT5kaXIsCisJCQkJCShTUFNfSU9WRUNfRkxBR19FT1QgfAorCQkJCQkJCVNQU19JT1ZFQ19GTEFHX05XRCkpOworCWlmIChkbWFfZGVzY19yeCA8IDApIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkiZXJyb3IgZG1hZW5naW5lX3ByZXBfc2xhdmVfc2cgcng6JWxkXG4iLAorCQkJCQkJUFRSX0VSUihkbWFfZGVzY19yeCkpOworCQlyZXQgPSBQVFJfRVJSKGRtYV9kZXNjX3J4KTsKKwkJZ290byBkbWFfeGZlcl9lbmQ7CisJfQorCisJZG1hX2Rlc2NfcngtPmNhbGxiYWNrICAgICAgID0gaTJjX21zbV9kbWFfY2FsbGJhY2tfcnhfY29tcGxldGU7CisJZG1hX2Rlc2NfcngtPmNhbGxiYWNrX3BhcmFtID0gY3RybDsKKwlkbWFlbmdpbmVfc3VibWl0KGRtYV9kZXNjX3J4KTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhyeC0+ZG1hX2NoYW4pOworCisJLyogU2V0IHRoZSBRVVAgU3RhdGUgdG8gUnVuIHdoZW4gY29tcGxldGVzIHRoZSB0eG4gKi8KKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1JVTik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgInRyYW5zaXRpb24gdG8gcnVuIHN0YXRlIGZhaWxlZCBiZWZvcmUgRE1BIHRyYW5zYWN0aW9uIDolZFxuIiwKKwkJCQkJCQkJCXJldCk7CisJCWdvdG8gZG1hX3hmZXJfZW5kOworCX0KKworCXJldCA9IGkyY19tc21feGZlcl93YWl0X2Zvcl9jb21wbGV0aW9uKGN0cmwsICZjdHJsLT54ZmVyLmNvbXBsZXRlKTsKKwlpZiAoIXJldCAmJiBjdHJsLT54ZmVyLnJ4X2NudCkKKwkJcmV0ID0gaTJjX21zbV94ZmVyX3dhaXRfZm9yX2NvbXBsZXRpb24oY3RybCwKKwkJCQkJCSZjdHJsLT54ZmVyLnJ4X2NvbXBsZXRlKTsKKworZG1hX3hmZXJfZW5kOgorCS8qIGZyZWUgc2NhdHRlci1nYXRoZXIgbGlzdHMgKi8KKwlrZnJlZShzZ190eCk7CisJa2ZyZWUoc2dfcngpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaTJjX21zbV9kbWFfZnJlZV9jaGFubmVscyhzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19NU01fRE1BX0NOVDsgKytpKSB7CisJCXN0cnVjdCBpMmNfbXNtX2RtYV9jaGFuICpjaGFuID0gJmN0cmwtPnhmZXIuZG1hLmNoYW5baV07CisKKwkJaWYgKCFjaGFuLT5pc19pbml0KQorCQkJY29udGludWU7CisKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChjaGFuLT5kbWFfY2hhbik7CisJCWNoYW4tPmlzX2luaXQgID0gZmFsc2U7CisJCWNoYW4tPmRtYV9jaGFuID0gTlVMTDsKKwl9CisJaWYgKGN0cmwtPnhmZXIuZG1hLnN0YXRlID4gSTJDX01TTV9ETUFfSU5JVF9DT1JFKQorCQljdHJsLT54ZmVyLmRtYS5zdGF0ZSA9IEkyQ19NU01fRE1BX0lOSVRfQ09SRTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfbXNtX2RtYV9jaGFuX25hbWVbXSA9IHsidHgiLCAicngifTsKKworc3RhdGljIGludCBpMmNfbXNtX2RtYWVuZ2luZV9kaXJbXSA9IHsKKwlETUFfTUVNX1RPX0RFViwgRE1BX0RFVl9UT19NRU0KK307CisKK3N0YXRpYyBpbnQgaTJjX21zbV9kbWFfaW5pdF9jaGFubmVscyhzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQgPSAwOworCWludCBpOworCisJLyogSXRlcmF0ZSBvdmVyIHRoZSBkbWEgY2hhbm5lbHMgdG8gaW5pdGlhbGl6ZSB0aGVtICovCisJZm9yIChpID0gMDsgaSA8IEkyQ19NU01fRE1BX0NOVDsgKytpKSB7CisJCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZyA9IHswfTsKKwkJc3RydWN0IGkyY19tc21fZG1hX2NoYW4gKmNoYW4gPSAmY3RybC0+eGZlci5kbWEuY2hhbltpXTsKKworCQlpZiAoY2hhbi0+aXNfaW5pdCkKKwkJCWNvbnRpbnVlOworCisJCWNoYW4tPm5hbWUgICAgID0gaTJjX21zbV9kbWFfY2hhbl9uYW1lW2ldOworCQljaGFuLT5kbWFfY2hhbiA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoY3RybC0+ZGV2LAorCQkJCQkJCQljaGFuLT5uYW1lKTsKKwkJaWYgKCFjaGFuLT5kbWFfY2hhbikgeworCQkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkJImVycm9yIGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoZGV2OiVzIGNoYW46JXMpXG4iLAorCQkJCWRldl9uYW1lKGN0cmwtPmRldiksIGNoYW4tPm5hbWUpOworCQkJLyogZnJlZSB0aGUgY2hhbm5lbHMgaWYgYWxsb2NhdGVkIGJlZm9yZSAqLworCQkJaTJjX21zbV9kbWFfZnJlZV9jaGFubmVscyhjdHJsKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJY2hhbi0+ZGlyID0gY2ZnLmRpcmVjdGlvbiA9IGkyY19tc21fZG1hZW5naW5lX2RpcltpXTsKKwkJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhjaGFuLT5kbWFfY2hhbiwgJmNmZyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yOiVkIGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoY2hhbjolcylcbiIsCisJCQkJCQlyZXQsIGNoYW4tPm5hbWUpOworCQkJZG1hX3JlbGVhc2VfY2hhbm5lbChjaGFuLT5kbWFfY2hhbik7CisJCQljaGFuLT5kbWFfY2hhbiA9IE5VTEw7CisJCQlpMmNfbXNtX2RtYV9mcmVlX2NoYW5uZWxzKGN0cmwpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQljaGFuLT5pc19pbml0ID0gdHJ1ZTsKKwl9CisJY3RybC0+eGZlci5kbWEuc3RhdGUgPSBJMkNfTVNNX0RNQV9JTklUX0NIQU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fZG1hX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2RtYSAqZG1hID0gJmN0cmwtPnhmZXIuZG1hOworCisJaTJjX21zbV9kbWFfZnJlZV9jaGFubmVscyhjdHJsKTsKKworCWlmIChkbWEtPnN0YXRlID4gSTJDX01TTV9ETUFfSU5JVF9OT05FKQorCQlkbWFfZnJlZV9jb2hlcmVudChjdHJsLT5kZXYsIEkyQ19NU01fRE1BX1RBR19NRU1fU1osCisJCQkJICBkbWEtPmlucHV0X3RhZy52cnRsX2FkZHIsCisJCQkJICBkbWEtPmlucHV0X3RhZy5waHlfYWRkcik7CisKKwlkbWEtPnN0YXRlID0gSTJDX01TTV9ETUFfSU5JVF9OT05FOworfQorCitzdGF0aWMgaW50IGkyY19tc21fZG1hX2luaXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZG1hICpkbWEgPSAmY3RybC0+eGZlci5kbWE7CisJdTggICAgICAgICAgICAgKnRhZ3Nfc3BhY2VfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgICAgICB0YWdzX3NwYWNlX3BoeV9hZGRyOworCisJLyogY2hlY2sgaWYgRE1BIGNvcmUgaXMgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoZG1hLT5zdGF0ZSA+IEkyQ19NU01fRE1BX0lOSVRfTk9ORSkKKwkJZ290byBkbWFfY29yZV9pc19pbml0OworCisJLyoKKwkgKiBhbGxvY2F0ZSBkbWEgbWVtb3J5IGZvciBpbnB1dF90YWcgKyBlb3Rfbl9mbHVzaF9zdG9wX3RhZ3MgKyB0YWdfYXJyCisJICogZm9yIG1vcmUgc2VlOiBJMkNfTVNNX0RNQV9UQUdfTUVNX1NaIGRlZmluaXRpb24KKwkgKi8KKwl0YWdzX3NwYWNlX3ZpcnRfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgKKwkJCQkJCWN0cmwtPmRldiwKKwkJCQkJCUkyQ19NU01fRE1BX1RBR19NRU1fU1osCisJCQkJCQkmdGFnc19zcGFjZV9waHlfYWRkciwKKwkJCQkJCUdGUF9LRVJORUwpOworCWlmICghdGFnc19zcGFjZV92aXJ0X2FkZHIpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSAgImVycm9yIGFsbG9jICVkIGJ5dGVzIG9mIERNQWFibGUgbWVtb3J5IGZvciBETUEgdGFncyBzcGFjZVxuIiwKKwkJICBJMkNfTVNNX0RNQV9UQUdfTUVNX1NaKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBzZXQgdGhlIGRtYS10YWdzIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3NlczoKKwkgKiAxKSB0aGUgZmlyc3QgdGFnIHNwYWNlIGlzIGZvciB0aGUgaW5wdXQgKHRocm93IGF3YXkpIHRhZworCSAqLworCWRtYS0+aW5wdXRfdGFnLnZydGxfYWRkciAgPSB0YWdzX3NwYWNlX3ZpcnRfYWRkcjsKKwlkbWEtPmlucHV0X3RhZy5waHlfYWRkciAgID0gdGFnc19zcGFjZV9waHlfYWRkcjsKKworCS8qIDIpIHNlY29uZCB0YWcgc3BhY2UgaXMgZm9yIGVvdF9mbHVzaF9zdG9wIHRhZyB3aGljaCBpcyBjb25zdCB2YWx1ZSAqLworCXRhZ3Nfc3BhY2VfdmlydF9hZGRyICs9IEkyQ19NU01fVEFHMl9NQVhfTEVOOworCXRhZ3Nfc3BhY2VfcGh5X2FkZHIgICs9IEkyQ19NU01fVEFHMl9NQVhfTEVOOworCWRtYS0+ZW90X25fZmx1c2hfc3RvcF90YWdzLnZydGxfYWRkciA9IHRhZ3Nfc3BhY2VfdmlydF9hZGRyOworCWRtYS0+ZW90X25fZmx1c2hfc3RvcF90YWdzLnBoeV9hZGRyICA9IHRhZ3Nfc3BhY2VfcGh5X2FkZHI7CisKKwkvKiBzZXQgZW90X25fZmx1c2hfc3RvcF90YWdzIHZhbHVlICovCisJKigodTE2ICopIGRtYS0+ZW90X25fZmx1c2hfc3RvcF90YWdzLnZydGxfYWRkcikgPQorCQkJCVFVUF9UQUcyX0lOUFVUX0VPVCB8IChRVVBfVEFHMl9GTFVTSF9TVE9QIDw8IDgpOworCisJLyogMykgYWxsIG90aGVyIHRhZyBzcGFjZXMgYXJlIHVzZWQgZm9yIHRyYW5zZmVyIHRhZ3MgKi8KKwl0YWdzX3NwYWNlX3ZpcnRfYWRkciAgKz0gSTJDX01TTV9UQUcyX01BWF9MRU47CisJdGFnc19zcGFjZV9waHlfYWRkciAgICs9IEkyQ19NU01fVEFHMl9NQVhfTEVOOworCWRtYS0+dGFnX2Fyci52cnRsX2FkZHIgPSB0YWdzX3NwYWNlX3ZpcnRfYWRkcjsKKwlkbWEtPnRhZ19hcnIucGh5X2FkZHIgID0gdGFnc19zcGFjZV9waHlfYWRkcjsKKworCWRtYS0+c3RhdGUgPSBJMkNfTVNNX0RNQV9JTklUX0NPUkU7CisKK2RtYV9jb3JlX2lzX2luaXQ6CisJcmV0dXJuIGkyY19tc21fZG1hX2luaXRfY2hhbm5lbHMoY3RybCk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX21zbV9kbWFfeGZlcihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbXNtX2RtYV9pbml0KGN0cmwpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJETUEgSW5pdCBGYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGRtYSBtYXAgdXNlcidzIGJ1ZmZlcnMgYW5kIGNyZWF0ZSB0YWdzICovCisJcmV0ID0gaTJjX21zbV9kbWFfeGZlcl9wcmVwYXJlKGN0cmwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3Igb24gaTJjX21zbV9kbWFfeGZlcl9wcmVwYXJlKCk6JWRcbiIsCisJCQkJCQkJCQlyZXQpOworCQlnb3RvIGVycl9kbWFfeGZlcjsKKwl9CisKKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZG1hX3hmZXI7CisKKwkvKiBwcm9ncmFtIHF1cCByZWdpc3RlcnMgKi8KKwlpMmNfbXNtX3F1cF94ZmVyX2luaXRfcmVzZXRfc3RhdGUoY3RybCk7CisKKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1JVTik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2RtYV94ZmVyOworCisJLyogcHJvZ3JhbSBxdXAgcmVnaXN0ZXJzIHdoaWNoIG11c3QgYmUgc2V0ICphZnRlciogcmVzZXQgKi8KKwlpMmNfbXNtX3F1cF94ZmVyX2luaXRfcnVuX3N0YXRlKGN0cmwpOworCisJLyogZW5xdWV1ZSB0cmFuc2ZlciBidWZmZXJzICovCisJcmV0ID0gaTJjX21zbV9kbWFfeGZlcl9wcm9jZXNzKGN0cmwpOworCWlmIChyZXQpCisJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yIGkyY19tc21fZG1hX3hmZXJfcHJvY2VzcyhuX2J1ZnM6JXp1KTolZFxuIiwKKwkJCWN0cmwtPnhmZXIuZG1hLmJ1Zl9hcnJfY250LCByZXQpOworCitlcnJfZG1hX3hmZXI6CisJaTJjX21zbV9kbWFfeGZlcl91bnByZXBhcmUoY3RybCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGkyY19tc21fcXVwX3Nsdl9ob2xkc19idXM6IHRydWUgd2hlbiBzbGF2ZSBob2xkIHRoZSBTREEgbG93CisgKi8KK3N0YXRpYyBib29sIGkyY19tc21fcXVwX3Nsdl9ob2xkc19idXMoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwl1MzIgc3RhdHVzID0gcmVhZGxfcmVsYXhlZChjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX0kyQ19TVEFUVVMpOworCisJYm9vbCBzbHZfaG9sZHNfYnVzID0JIShzdGF0dXMgJiBRVVBfSTJDX1NEQSkgJiYKKwkJCQkoc3RhdHVzICYgUVVQX0JVU19BQ1RJVkUpICYmCisJCQkJIShzdGF0dXMgJiBRVVBfQlVTX01BU1RFUik7CisJaWYgKHNsdl9ob2xkc19idXMpCisJCWRldl9pbmZvKGN0cmwtPmRldiwKKwkJCSJidXMgbGluZXMgaGVsZCBsb3cgYnkgYSBzbGF2ZSBkZXRlY3RlZFxuIik7CisKKwlyZXR1cm4gc2x2X2hvbGRzX2J1czsKK30KKworLyoKKyAqIGkyY19tc21fcXVwX3BvbGxfYnVzX2FjdGl2ZV91bnNldDogcG9sbCB1bnRpbCBRVVBfQlVTX0FDVElWRSBpcyB1bnNldAorICoKKyAqIEByZXR1cm4gemVybyB3aGVuIGJ1cyBpbmFjdGl2ZSwgb3Igbm9uemVybyBvbiB0aW1lb3V0LgorICoKKyAqIExvb3AgYW5kIHJlYWRzIFFVUF9JMkNfTUFTVEVSX1NUQVRVUyB1bnRpbCBidXMgaXMgaW5hY3RpdmUgb3IgdGltZW91dAorICogcmVhY2hlZC4gVXNlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiBkdWUgdG8gZ2FwIGJldHdlZW4gUVVQIGNvbXBsZXRpb24KKyAqIGludGVycnVwdCBhbmQgUVVQIGlzc3Vpbmcgc3RvcCBzaWduYWwgb24gdGhlIGJ1cy4KKyAqLworc3RhdGljIGludCBpMmNfbXNtX3F1cF9wb2xsX2J1c19hY3RpdmVfdW5zZXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgICAgPSBjdHJsLT5yc3Jjcy5iYXNlOworCXVsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJMkNfTVNNX01BWF9QT0xMX01TRUMpOworCWludCAgICByZXQgICAgICA9IDA7CisJc2l6ZV90IHJlYWRfY250ID0gMDsKKworCWRvIHsKKwkJaWYgKCEocmVhZGxfcmVsYXhlZChiYXNlICsgUVVQX0kyQ19TVEFUVVMpICYgUVVQX0JVU19BQ1RJVkUpKQorCQkJZ290byBwb2xsX2FjdGl2ZV9lbmQ7CisJCSsrcmVhZF9jbnQ7CisJfSB3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpOworCisJcmV0ID0gLUVCVVNZOworCitwb2xsX2FjdGl2ZV9lbmQ6CisJLyogc2Vjb25kIGxvZ2dlZCB2YWx1ZSBpcyB0aW1lLWxlZnQgYmVmb3JlIHRpbWVvdXQgb3IgemVybyBpZiBleHBpcmVkICovCisJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9EQkcsIEkyQ19NU01fQUNUVl9FTkQsCisJCQkJcmV0LCAocmV0ID8gMCA6ICh0aW1lb3V0IC0gamlmZmllcykpLCByZWFkX2NudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX2Nsa19wYXRoX3ZvdGUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlpMmNfbXNtX2Nsa19wYXRoX2luaXQoY3RybCk7CisKKwlpZiAoY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5jbGllbnRfaGRsKQorCQltc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKKwkJCQkJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5jbGllbnRfaGRsLAorCQkJCQlJMkNfTVNNX0NMS19QQVRIX1JFU1VNRV9WRUMpOworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX2Nsa19wYXRoX3Vudm90ZShzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWlmIChjdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLmNsaWVudF9oZGwpCisJCW1zbV9idXNfc2NhbGVfY2xpZW50X3VwZGF0ZV9yZXF1ZXN0KAorCQkJCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLmNsaWVudF9oZGwsCisJCQkJCUkyQ19NU01fQ0xLX1BBVEhfU1VTUEVORF9WRUMpOworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX2Nsa19wYXRoX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaWYgKGN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUuY2xpZW50X2hkbCkgeworCQltc21fYnVzX3NjYWxlX3VucmVnaXN0ZXJfY2xpZW50KAorCQkJCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLmNsaWVudF9oZGwpOworCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLmNsaWVudF9oZGwgPSAwOworCX0KK30KKworLyoKKyAqIGkyY19tc21fY2xrX3BhdGhfaW5pdF9zdHJ1Y3RzOiBpbnRlcm5hbCBpbXBsIGRldGFpbCBvZiBpMmNfbXNtX2Nsa19wYXRoX2luaXQKKyAqCisgKiBhbGxvY2F0ZXMgYW5kIGluaXRpbGl6ZXMgdGhlIGJ1cyBzY2FsaW5nIHZlY3RvcnMuCisgKi8KK3N0YXRpYyBpbnQgaTJjX21zbV9jbGtfcGF0aF9pbml0X3N0cnVjdHMoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgbXNtX2J1c192ZWN0b3JzICpwYXRocyAgICA9IE5VTEw7CisJc3RydWN0IG1zbV9idXNfcGF0aHMgICAqdXNlY2FzZXMgPSBOVUxMOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX1BST0YsICJpbml0aWFsaXplcyBwYXRoIGNsb2NrIHZvdGluZyBzdHJ1Y3RzIik7CisKKwlwYXRocyA9IGRldm1fa3phbGxvYyhjdHJsLT5kZXYsIHNpemVvZigqcGF0aHMpICogMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXRocykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2VjYXNlcyA9IGRldm1fa3phbGxvYyhjdHJsLT5kZXYsIHNpemVvZigqdXNlY2FzZXMpICogMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2VjYXNlcykKKwkJZ290byBwYXRoX2luaXRfZXJyOworCisJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSA9IGRldm1fa3phbGxvYyhjdHJsLT5kZXYsCisJCQkJICAgICAgIHNpemVvZigqY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwKKwkJCSJlcnJvciAgbXNtX2J1c19zY2FsZV9wZGF0YSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIHBhdGhfaW5pdF9lcnI7CisJfQorCisJcGF0aHNbSTJDX01TTV9DTEtfUEFUSF9TVVNQRU5EX1ZFQ10gPSAoc3RydWN0IG1zbV9idXNfdmVjdG9ycykgeworCQkuc3JjID0gY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5tc3RyX2lkLAorCQkuZHN0ID0gTVNNX0JVU19TTEFWRV9FQklfQ0gwLAorCQkuYWIgID0gMCwKKwkJLmliICA9IDAsCisJfTsKKworCXBhdGhzW0kyQ19NU01fQ0xLX1BBVEhfUkVTVU1FX1ZFQ10gID0gKHN0cnVjdCBtc21fYnVzX3ZlY3RvcnMpIHsKKwkJLnNyYyA9IGN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUubXN0cl9pZCwKKwkJLmRzdCA9IE1TTV9CVVNfU0xBVkVfRUJJX0NIMCwKKwkJLmFiICA9IEkyQ19NU01fQ0xLX1BBVEhfQVZSR19CVyhjdHJsKSwKKwkJLmliICA9IEkyQ19NU01fQ0xLX1BBVEhfQlJTVF9CVyhjdHJsKSwKKwl9OworCisJdXNlY2FzZXNbSTJDX01TTV9DTEtfUEFUSF9TVVNQRU5EX1ZFQ10gPSAoc3RydWN0IG1zbV9idXNfcGF0aHMpIHsKKwkJLm51bV9wYXRocyA9IDEsCisJCS52ZWN0b3JzICAgPSAmcGF0aHNbSTJDX01TTV9DTEtfUEFUSF9TVVNQRU5EX1ZFQ10sCisJfTsKKworCXVzZWNhc2VzW0kyQ19NU01fQ0xLX1BBVEhfUkVTVU1FX1ZFQ10gPSAoc3RydWN0IG1zbV9idXNfcGF0aHMpIHsKKwkJLm51bV9wYXRocyA9IDEsCisJCS52ZWN0b3JzICAgPSAmcGF0aHNbSTJDX01TTV9DTEtfUEFUSF9SRVNVTUVfVkVDXSwKKwl9OworCisJKmN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUucGRhdGEgPSAoc3RydWN0IG1zbV9idXNfc2NhbGVfcGRhdGEpIHsKKwkJLnVzZWNhc2UgICAgICA9IHVzZWNhc2VzLAorCQkubnVtX3VzZWNhc2VzID0gMiwKKwkJLm5hbWUgICAgICAgICA9IGRldl9uYW1lKGN0cmwtPmRldiksCisJfTsKKworCXJldHVybiAwOworCitwYXRoX2luaXRfZXJyOgorCWRldm1fa2ZyZWUoY3RybC0+ZGV2LCBwYXRocyk7CisJZGV2bV9rZnJlZShjdHJsLT5kZXYsIHVzZWNhc2VzKTsKKwlkZXZtX2tmcmVlKGN0cmwtPmRldiwgY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSk7CisJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSA9IE5VTEw7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBpMmNfbXNtX2Nsa19wYXRoX3Bvc3Rwb25lZF9yZWdpc3RlcjogcmVnIHdpdGggYnVzLXNjYWxpbmcgYWZ0ZXIgaXQgaXMgcHJvYmVkCisgKgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MKKyAqCisgKiBXb3JrYXJvdW5kOiBpMmMgZHJpdmVyIG1heSBiZSBwcm9iZWQgYmVmb3JlIHRoZSBidXMgc2NhbGluZyBkcml2ZXIuIENhbGxpbmcKKyAqIG1zbV9idXNfc2NhbGVfcmVnaXN0ZXJfY2xpZW50KCkgd2lsbCBmYWlsIGlmIHRoZSBidXMgc2NhbGluZyBkcml2ZXIgaXMgbm90CisgKiByZWFkeSB5ZXQuIFRodXMsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBub3QgZnJvbSBwcm9iZSBidXQgZnJvbSBhCisgKiBsYXRlciBjb250ZXh0LiBBbHNvLCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGVuIG9uY2UgYmVmb3JlCisgKiByZWdpc3RlciBzdWNjZWVkLiBBdCB0aGlzIGNhc2Ugb25seSBvbmUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZC4gQXQgYm9vdAorICogdGltZSBhbGwgY2xvY2tzIGFyZSBvbiwgc28gZWFybGllciBpMmMgdHJhbnNhY3Rpb25zIHNob3VsZCBzdWNjZWVkLgorICovCitzdGF0aWMgaW50IGkyY19tc21fY2xrX3BhdGhfcG9zdHBvbmVkX3JlZ2lzdGVyKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5jbGllbnRfaGRsID0KKwkJbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQoY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5wZGF0YSk7CisKKwlpZiAoY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5jbGllbnRfaGRsKSB7CisJCWlmIChjdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLnJlZ19lcnIpIHsKKwkJCS8qIGxvZyBhIHN1Y2Nlc3MgbWVzc2FnZSBpZiBhbiBlcnJvciBtc2cgd2FzIGxvZ2dlZCAqLworCQkJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5yZWdfZXJyID0gZmFsc2U7CisJCQlkZXZfZXJyKGN0cmwtPmRldiwKKwkJCQkibXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQobXN0ci1pZDolZCk6MHgleCAob2spIiwKKwkJCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLm1zdHJfaWQsCisJCQkJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5jbGllbnRfaGRsKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGd1YXJkIHRvIGxvZyBvbmx5IG9uZSBlcnJvciBvbiBtdWx0aXBsZSBmYWlsdXJlICovCisJCWlmICghY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5yZWdfZXJyKSB7CisJCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLnJlZ19lcnIgPSB0cnVlOworCisJCQlkZXZfaW5mbyhjdHJsLT5kZXYsCisJCQkJIm1zbV9idXNfc2NhbGVfcmVnaXN0ZXJfY2xpZW50KG1zdHItaWQ6JWQpOjAgKG5vdCBhIHByb2JsZW0pIiwKKwkJCQljdHJsLT5yc3Jjcy5jbGtfcGF0aF92b3RlLm1zdHJfaWQpOworCQl9CisJfQorCisJcmV0dXJuIGN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUuY2xpZW50X2hkbCA/IDAgOiAtRUFHQUlOOworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX2Nsa19wYXRoX2luaXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwkvKgorCSAqIGJhaWwgb3V0IGlmIHBhdGggdm90aW5nIGlzIGRpYWJsZWQgKG1hc3Rlcl9pZCA9PSAwKSBvciBpZiBpdCBpcworCSAqIGFscmVhZHkgcmVnaXN0ZXJlZCAoY2xpZW50X2hkbCAhPSAwKQorCSAqLworCWlmICghY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5tc3RyX2lkIHx8CisJCWN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUuY2xpZW50X2hkbCkKKwkJcmV0dXJuOworCisJLyogaWYgZmFpbCBvbmNlIHRoZW4gdHJ5IG5vIG1vcmUgKi8KKwlpZiAoIWN0cmwtPnJzcmNzLmNsa19wYXRoX3ZvdGUucGRhdGEgJiYKKwkJCQkJaTJjX21zbV9jbGtfcGF0aF9pbml0X3N0cnVjdHMoY3RybCkpIHsKKwkJY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5tc3RyX2lkID0gMDsKKwkJcmV0dXJuOworCX07CisKKwkvKiBvbiBmYWlsdXJlIHRyeSBhZ2FpbiBsYXRlciAqLworCWlmIChpMmNfbXNtX2Nsa19wYXRoX3Bvc3Rwb25lZF9yZWdpc3RlcihjdHJsKSkKKwkJcmV0dXJuOworfQorCisvKgorICogaTJjX21zbV9xdXBfaXNyOiBRVVAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaTJjX21zbV9xdXBfaXNyKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwgPSBkZXZpZDsKKwl2b2lkIF9faW9tZW0gICAgICAgICpiYXNlID0gY3RybC0+cnNyY3MuYmFzZTsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyICp4ZmVyID0gJmN0cmwtPnhmZXI7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2JsayAqYmxrID0gJmN0cmwtPnhmZXIuYmxrOworCXUzMiAgZXJyX2ZsYWdzICA9IDA7CisJdTMyICBjbHJfZmxkcyAgID0gMDsKKwlib29sIGxvZ19ldmVudCAgICAgICA9IGZhbHNlOworCWJvb2wgc2lnbmFsX2NvbXBsZXRlID0gZmFsc2U7CisJYm9vbCBuZWVkX3dtYiAgICAgICAgPSBmYWxzZTsKKworCWkyY19tc21fcHJvZl9ldm50X2FkZChjdHJsLCBNU01fUFJPRiwgSTJDX01TTV9JUlFfQkdOLCBpcnEsIDAsIDApOworCisJaWYgKCFhdG9taWNfcmVhZCgmY3RybC0+eGZlci5pc19hY3RpdmUpKSB7CisJCWRldl9pbmZvKGN0cmwtPmRldiwgImlycTolZCB3aGVuIG5vIGFjdGl2ZSB0cmFuc2ZlclxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWN0cmwtPmkyY19zdHNfcmVnICA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9JMkNfU1RBVFVTKTsKKwllcnJfZmxhZ3MJICAgPSByZWFkbF9yZWxheGVkKGJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworCWN0cmwtPnF1cF9vcF9yZWcgICA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CisKKwlpZiAoY3RybC0+aTJjX3N0c19yZWcgJiBRVVBfTVNUUl9TVFRTX0VSUl9NQVNLKSB7CisJCXNpZ25hbF9jb21wbGV0ZSA9IHRydWU7CisJCWxvZ19ldmVudCAgICAgICA9IHRydWU7CisJCS8qCisJCSAqIElmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIGVycm9yIGhlcmUsIGxhc3Qgb25lIHN0aWNrcy4KKwkJICogVGhlIG9yZGVyIG9mIHRoZSBlcnJvciBzZXQgaGVyZSBtYXR0ZXJzLgorCQkgKi8KKwkJaWYgKGN0cmwtPmkyY19zdHNfcmVnICYgUVVQX0FSQl9MT1NUKQorCQkJY3RybC0+eGZlci5lcnIgPSBJMkNfTVNNX0VSUl9BUkJfTE9TVDsKKworCQlpZiAoY3RybC0+aTJjX3N0c19yZWcgJiBRVVBfQlVTX0VSUk9SKQorCQkJY3RybC0+eGZlci5lcnIgPSBJMkNfTVNNX0VSUl9CVVNfRVJSOworCisJCWlmIChjdHJsLT5pMmNfc3RzX3JlZyAmIFFVUF9QQUNLRVRfTkFDS0VEKQorCQkJY3RybC0+eGZlci5lcnIgPSBJMkNfTVNNX0VSUl9OQUNLOworCX0KKworCS8qIGNoZWNrIGZvciBGSUZPIG92ZXIvdW5kZXIgcnVucyBlcnJvciAqLworCWlmIChlcnJfZmxhZ3MgJiBRVVBfRVJSX0ZMR1NfTUFTSykKKwkJY3RybC0+eGZlci5lcnIgPSBJMkNfTVNNX0VSUl9PVlJfVU5EUl9SVU47CisKKwkvKiBEdW1wIHRoZSByZWdpc3RlciB2YWx1ZXMgYmVmb3JlIHJlc2V0IHRoZSBjb3JlICovCisJaWYgKGN0cmwtPnhmZXIuZXJyICYmIGN0cmwtPmRiZ2ZzLmRiZ19sdmwgPj0gTVNNX0RCRykKKwkJaTJjX21zbV9kYmdfcXVwX3JlZ19kdW1wKGN0cmwpOworCisJLyogY2xlYXIgaW50ZXJydXB0cyBmaWVsZHMgKi8KKwljbHJfZmxkcyA9IGN0cmwtPmkyY19zdHNfcmVnICYgUVVQX01TVFJfU1RUU19FUlJfTUFTSzsKKwlpZiAoY2xyX2ZsZHMpIHsKKwkJd3JpdGVsX3JlbGF4ZWQoY2xyX2ZsZHMsIGJhc2UgKyBRVVBfSTJDX1NUQVRVUyk7CisJCW5lZWRfd21iID0gdHJ1ZTsKKwl9CisKKwljbHJfZmxkcyA9IGVycl9mbGFncyAmIFFVUF9FUlJfRkxHU19NQVNLOworCWlmIChjbHJfZmxkcykgeworCQl3cml0ZWxfcmVsYXhlZChjbHJfZmxkcywgIGJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworCQluZWVkX3dtYiA9IHRydWU7CisJfQorCisJY2xyX2ZsZHMgPSBjdHJsLT5xdXBfb3BfcmVnICYKKwkJCShRVVBfT1VUUFVUX1NFUlZJQ0VfRkxBRyB8CisJCQlRVVBfSU5QVVRfU0VSVklDRV9GTEFHKTsKKwlpZiAoY2xyX2ZsZHMpIHsKKwkJd3JpdGVsX3JlbGF4ZWQoY2xyX2ZsZHMsIGJhc2UgKyBRVVBfT1BFUkFUSU9OQUwpOworCQluZWVkX3dtYiA9IHRydWU7CisJfQorCisJaWYgKG5lZWRfd21iKQorCQkvKgorCQkgKiBmbHVzaCB3cml0ZXMgdGhhdCBjbGVhciB0aGUgaW50ZXJydXB0IGZsYWdzIGJlZm9yZSBjaGFuZ2luZworCQkgKiBzdGF0ZSB0byByZXNldC4KKwkJICovCisJCXdtYigpOworCisJLyogUmVzZXQgYW5kIGJhaWwgb3V0IG9uIGVycm9yICovCisJaWYgKGN0cmwtPnhmZXIuZXJyKSB7CisJCS8qIEZsdXNoIGZvciB0aGUgdGFncyBpbiBjYXNlIG9mIGFuIGVycm9yIGFuZCBETUEgTW9kZSovCisJCWlmIChjdHJsLT54ZmVyLm1vZGVfaWQgPT0gSTJDX01TTV9YRkVSX01PREVfRE1BKSB7CisJCQl3cml0ZWxfcmVsYXhlZChRVVBfSTJDX0ZMVVNILCBjdHJsLT5yc3Jjcy5iYXNlCisJCQkJCQkJCSsgUVVQX1NUQVRFKTsKKwkJCS8qCisJCQkgKiBFbnN1cmUgdGhhdCBRVVBfSTJDX0ZMVVNIIGlzIHdyaXR0ZW4gYmVmb3JlCisJCQkgKiBTdGF0ZSByZXNldAorCQkJICovCisJCQl3bWIoKTsKKwkJfQorCisJCS8qIEhXIHdvcmthcm91bmQ6IHdoZW4gaW50ZXJydXB0IGlzIGxldmVsIHRyaWdnZXJkLCBtb3JlCisJCSAqIHRoYW4gb25lIGludGVycnVwdCBtYXkgZmlyZSBpbiBlcnJvciBjYXNlcy4gVGh1cyB3ZQorCQkgKiBjaGFuZ2UgdGhlIFFVUCBjb3JlIHN0YXRlIHRvIFJlc2V0IGltbWVkaWF0ZWx5IGluIHRoZQorCQkgKiBJU1IgdG8gd2FyZCBvZmYgdGhlIG5leHQgaW50ZXJydXB0LgorCQkgKi8KKwkJd3JpdGVsX3JlbGF4ZWQoUVVQX1NUQVRFX1JFU0VULCBjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX1NUQVRFKTsKKworCQlzaWduYWxfY29tcGxldGUgPSB0cnVlOworCQlsb2dfZXZlbnQgICAgICAgPSB0cnVlOworCQlnb3RvIGlzcl9lbmQ7CisJfQorCisJLyogaGFuZGxlIGRhdGEgY29tcGxldGlvbiAqLworCWlmICh4ZmVyLT5tb2RlX2lkID09IEkyQ19NU01fWEZFUl9NT0RFX0JMT0NLKSB7CisJCS8qIGJsb2NrIHJlYWR5IGZvciB3cml0aW5nICovCisJCWlmIChjdHJsLT5xdXBfb3BfcmVnICYgUVVQX09VVFBVVF9TRVJWSUNFX0ZMQUcpIHsKKwkJCWxvZ19ldmVudCA9IHRydWU7CisJCQlpZiAoY3RybC0+cXVwX29wX3JlZyAmIFFVUF9PVVRfQkxPQ0tfV1JJVEVfUkVRKQorCQkJCWNvbXBsZXRlKCZibGstPndhaXRfdHhfYmxrKTsKKworCQkJaWYgKChjdHJsLT5xdXBfb3BfcmVnICYgYmxrLT5jb21wbGV0ZV9tYXNrKQorCQkJCQk9PSBibGstPmNvbXBsZXRlX21hc2spIHsKKwkJCQlsb2dfZXZlbnQgICAgICAgPSB0cnVlOworCQkJCXNpZ25hbF9jb21wbGV0ZSA9IHRydWU7CisJCQl9CisJCX0KKwkJLyogYmxvY2sgcmVhZHkgZm9yIHJlYWRpbmcgKi8KKwkJaWYgKGN0cmwtPnF1cF9vcF9yZWcgJiBRVVBfSU5QVVRfU0VSVklDRV9GTEFHKSB7CisJCQlsb2dfZXZlbnQgPSB0cnVlOworCQkJY29tcGxldGUoJmJsay0+d2FpdF9yeF9ibGspOworCQl9CisJfSBlbHNlIHsKKwkJLyogZm9yIEZJRk8vRE1BIE1vZGUqLworCQlpZiAoY3RybC0+cXVwX29wX3JlZyAmIFFVUF9NQVhfSU5QVVRfRE9ORV9GTEFHKSB7CisJCQlsb2dfZXZlbnQgPSB0cnVlOworCQkJLyoKKwkJCSAqIElmIGxhc3QgdHJhbnNhY3Rpb24gaXMgYW4gaW5wdXQgdGhlbiB0aGUgZW50aXJlCisJCQkgKiB0cmFuc2ZlciBpcyBkb25lCisJCQkgKi8KKwkJCWlmIChjdHJsLT54ZmVyLmxhc3RfaXNfcngpCisJCQkJc2lnbmFsX2NvbXBsZXRlID0gdHJ1ZTsKKwkJfQorCQkvKgorCQkgKiBJZGVhbGx5LCB3b3VsZCBsaWtlIHRvIGNoZWNrIFFVUF9NQVhfT1VUUFVUX0RPTkVfRkxBRy4KKwkJICogSG93ZXZlciwgUVVQX01BWF9PVVRQVVRfRE9ORV9GTEFHIGlzIGxhZ2dpbmcgYmVoaW5kCisJCSAqIFFVUF9PVVRQVVRfU0VSVklDRV9GTEFHLiBUaGUgb25seSByZWFzb24gZm9yCisJCSAqIFFVUF9PVVRQVVRfU0VSVklDRV9GTEFHIHRvIGJlIHNldCBpbiBGSUZPIG1vZGUgaXMKKwkJICogUVVQX01BWF9PVVRQVVRfRE9ORV9GTEFHIGNvbmRpdGlvbi4gVGhlIGNvZGUgY2hlY2tpbmcKKwkJICogaGVyZSBRVVBfT1VUUFVUX1NFUlZJQ0VfRkxBRyBhbmQgYXNzdW1lcyB0aGF0CisJCSAqIFFVUF9NQVhfT1VUUFVUX0RPTkVfRkxBRy4KKwkJICovCisJCWlmIChjdHJsLT5xdXBfb3BfcmVnICYgKFFVUF9PVVRQVVRfU0VSVklDRV9GTEFHIHwKKwkJCQkJCVFVUF9NQVhfT1VUUFVUX0RPTkVfRkxBRykpIHsKKwkJCWxvZ19ldmVudCA9IHRydWU7CisJCQkvKgorCQkJICogSWYgbGFzdCB0cmFuc2FjdGlvbiBpcyBhbiBvdXRwdXQgdGhlbiB0aGUKKwkJCSAqIGVudGlyZSB0cmFuc2ZlciBpcyBkb25lCisJCQkgKi8KKwkJCWlmICghY3RybC0+eGZlci5sYXN0X2lzX3J4KQorCQkJCXNpZ25hbF9jb21wbGV0ZSA9IHRydWU7CisJCX0KKwl9CisKK2lzcl9lbmQ6CisJaWYgKGxvZ19ldmVudCB8fCAoY3RybC0+ZGJnZnMuZGJnX2x2bCA+PSBNU01fREJHKSkKKwkJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9QUk9GLAorCQkJCQlJMkNfTVNNX0lSUV9FTkQsCisJCQkJCWN0cmwtPmkyY19zdHNfcmVnLCBjdHJsLT5xdXBfb3BfcmVnLAorCQkJCQllcnJfZmxhZ3MpOworCisJaWYgKHNpZ25hbF9jb21wbGV0ZSkKKwkJY29tcGxldGUoJmN0cmwtPnhmZXIuY29tcGxldGUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBpMnhfbXNtX2Jsa19mcmVlX2NhY2hlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJa2ZyZWUoY3RybC0+eGZlci5ibGsudHhfY2FjaGUpOworCWtmcmVlKGN0cmwtPnhmZXIuYmxrLnJ4X2NhY2hlKTsKK30KKworc3RhdGljIHZvaWQgaTJjX21zbV9xdXBfaW5pdChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXUzMiBzdGF0ZTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBjdHJsLT5yc3Jjcy5iYXNlOworCisJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9QUk9GLCBJMkNfTVNNX1BST0ZfUkVTRVQsIDAsIDAsIDApOworCisJaTJjX21zbV9xdXBfc3dfcmVzZXQoY3RybCk7CisJaTJjX21zbV9xdXBfc3RhdGVfc2V0KGN0cmwsIFFVUF9TVEFURV9SRVNFVCk7CisKKwl3cml0ZWxfcmVsYXhlZChRVVBfTl9WQUwgfCBRVVBfTUlOSV9DT1JFX0kyQ19WQUwsIGJhc2UgKyBRVVBfQ09ORklHKTsKKworCXdyaXRlbF9yZWxheGVkKFFVUF9PVVRQVVRfT1ZFUl9SVU5fRVJSX0VOIHwgUVVQX0lOUFVUX1VOREVSX1JVTl9FUlJfRU4KKwkJICAgICB8IFFVUF9PVVRQVVRfVU5ERVJfUlVOX0VSUl9FTiB8IFFVUF9JTlBVVF9PVkVSX1JVTl9FUlJfRU4sCisJCQkJCWJhc2UgKyBRVVBfRVJST1JfRkxBR1NfRU4pOworCisJd3JpdGVsX3JlbGF4ZWQoUVVQX0lOUFVUX1NFUlZJQ0VfTUFTSyB8IFFVUF9PVVRQVVRfU0VSVklDRV9NQVNLLAorCQkJCQliYXNlICsgUVVQX09QRVJBVElPTkFMX01BU0spOworCisJd3JpdGVsX3JlbGF4ZWQoUVVQX0VOX1ZFUlNJT05fVFdPX1RBRywgYmFzZSArIFFVUF9JMkNfTUFTVEVSX0NPTkZJRyk7CisKKwlpMmNfbXNtX3F1cF9maWZvX2NhbGNfc2l6ZShjdHJsKTsKKwkvKgorCSAqIEVuc3VyZSB0aGF0IFFVUCBjb25maWd1cmF0aW9uIGlzIHdyaXR0ZW4gYW5kIHRoYXQgZmlmbyBzaXplIGlmIHJlYWQKKwkgKiBiZWZvcmUgbGVhdmluZyB0aGlzIGZ1bmN0aW9uCisJICovCisJbWIoKTsKKworCXN0YXRlID0gcmVhZGxfcmVsYXhlZChiYXNlICsgUVVQX1NUQVRFKTsKKworCWlmICghKHN0YXRlICYgUVVQX0kyQ19NQVNUX0dFTikpCisJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yIG9uIHZlcmlmeWluZyBIVyBzdXBwb3J0IChJMkNfTUFTVF9HRU49MClcbiIpOworfQorCisvKgorICogcXVwX2kyY190cnlfcmVjb3Zlcl9idXNfYnVzeTogaXNzdWUgUVVQIGJ1cyBjbGVhciBjb21tYW5kCisgKi8KK3N0YXRpYyBpbnQgcXVwX2kyY190cnlfcmVjb3Zlcl9idXNfYnVzeShzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQ7CisJdWxvbmcgbWluX3NsZWVwX3VzZWM7CisKKwkvKiBjYWxsIGkyY19tc21fcXVwX2luaXQoKSB0byBzZXQgY29yZSBpbiBpZGxlIHN0YXRlICovCisJaTJjX21zbV9xdXBfaW5pdChjdHJsKTsKKworCS8qIG11c3QgYmUgaW4gcnVuIHN0YXRlIGZvciBidXMgY2xlYXIgKi8KKwlyZXQgPSBpMmNfbXNtX3F1cF9zdGF0ZV9zZXQoY3RybCwgUVVQX1NUQVRFX1JVTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJlcnJvcjogYnVzIGNsZWFyIGZhaWwgdG8gc2V0IHJ1biBzdGF0ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBjYWxsIGkyY19tc21fcXVwX3hmZXJfaW5pdF9ydW5fc3RhdGUoKSB0byBzZXQgY2xvY2sgZGl2aWRlcnMuCisJICogdGhlIGRpdmlkZXJzIGFyZSBuZWNlc3NhcnkgZm9yIGJ1cyBjbGVhci4KKwkgKi8KKwlpMmNfbXNtX3F1cF94ZmVyX2luaXRfcnVuX3N0YXRlKGN0cmwpOworCisJd3JpdGVsX3JlbGF4ZWQoMHgxLCBjdHJsLT5yc3Jjcy5iYXNlICsgUVVQX0kyQ19NQVNURVJfQlVTX0NMUik7CisKKwkvKgorCSAqIHdhaXQgZm9yIHJlY292ZXJ5ICg5IGNsb2NrIHB1bHNlIGN5Y2xlcykgdG8gY29tcGxldGUuCisJICogbWluX3RpbWUgPSA5IGNsb2NrICoxMCAgKDEwMDAlIG1hcmdpbikKKwkgKiBtYXhfdGltZSA9IDEwKiBtaW5fdGltZQorCSAqLworCW1pbl9zbGVlcF91c2VjID0KKwkgIG1heF90KHVsb25nLCAoOSAqIDEwICogVVNFQ19QRVJfU0VDKSAvIGN0cmwtPnJzcmNzLmNsa19mcmVxX291dCwgMTAwKTsKKworCXVzbGVlcF9yYW5nZShtaW5fc2xlZXBfdXNlYywgbWluX3NsZWVwX3VzZWMgKiAxMCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxdXBfaTJjX3JlY292ZXJfYnVzX2J1c3koc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwl1MzIgYnVzX2NsciwgYnVzX2FjdGl2ZSwgc3RhdHVzOworCWludCByZXRyeSA9IDA7CisKKwlkZXZfaW5mbyhjdHJsLT5kZXYsICJFeGVjdXRpbmcgYnVzIHJlY292ZXJ5IHByb2NlZHVyZSAoOSBjbGsgcHVsc2UpXG4iKTsKKworCWRvIHsKKwkJcXVwX2kyY190cnlfcmVjb3Zlcl9idXNfYnVzeShjdHJsKTsKKwkJYnVzX2NsciAgICA9IHJlYWRsX3JlbGF4ZWQoY3RybC0+cnNyY3MuYmFzZSArCisJCQkJCQkJUVVQX0kyQ19NQVNURVJfQlVTX0NMUik7CisJCXN0YXR1cyAgICAgPSByZWFkbF9yZWxheGVkKGN0cmwtPnJzcmNzLmJhc2UgKyBRVVBfSTJDX1NUQVRVUyk7CisJCWJ1c19hY3RpdmUgPSBzdGF0dXMgJiBJMkNfU1RBVFVTX0JVU19BQ1RJVkU7CisJCWlmICgrK3JldHJ5ID49IEkyQ19RVVBfTUFYX0JVU19SRUNPVkVSWV9SRVRSWSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGJ1c19jbHIgfHwgYnVzX2FjdGl2ZSk7CisKKwlkZXZfaW5mbyhjdHJsLT5kZXYsICJCdXMgcmVjb3ZlcnkgJXMgYWZ0ZXIgJWQgcmV0cmllc1xuIiwKKwkJKGJ1c19jbHIgfHwgYnVzX2FjdGl2ZSkgPyAiZmFpbCIgOiAic3VjY2VzcyIsIHJldHJ5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMmNfbXNtX3F1cF9wb3N0X3hmZXIoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwgaW50IGVycikKK3sKKwkvKiBwb2xsIHVudGlsIGJ1cyBpcyByZWxlYXNlZCAqLworCWlmIChpMmNfbXNtX3F1cF9wb2xsX2J1c19hY3RpdmVfdW5zZXQoY3RybCkpIHsKKwkJaWYgKChjdHJsLT54ZmVyLmVyciA9PSBJMkNfTVNNX0VSUl9BUkJfTE9TVCkgfHwKKwkJICAgIChjdHJsLT54ZmVyLmVyciA9PSBJMkNfTVNNX0VSUl9CVVNfRVJSKSAgfHwKKwkJICAgIChjdHJsLT54ZmVyLmVyciA9PSBJMkNfTVNNX0VSUl9USU1FT1VUKSkgeworCQkJaWYgKGkyY19tc21fcXVwX3Nsdl9ob2xkc19idXMoY3RybCkpCisJCQkJcXVwX2kyY19yZWNvdmVyX2J1c19idXN5KGN0cmwpOworCisJCQkvKiBkbyBub3QgZ2VuZXJhbGl6ZSBlcnJvciB0byBFSU8gaWYgaXRzIGFscmVhZHkgc2V0ICovCisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAtRUlPOworCQl9CisJfQorCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBJUlEgYmVmb3JlIGNoYW5nZSB0byByZXNldCBzdGF0ZSB0byBhdm9pZAorCSAqIHNwdXJpb3VzIGludGVycnVwdHMuCisJICoKKwkgKi8KKwlkaXNhYmxlX2lycShjdHJsLT5yc3Jjcy5pcnEpOworCisJLyogZmx1c2ggZG1hIGRhdGEgYW5kIHJlc2V0IHRoZSBxdXAgY29yZSBpbiB0aW1lb3V0IGVycm9yLgorCSAqIGZvciBvdGhlciBlcnJvciBjYXNlLCBpdHMgaGFuZGxlZCBieSB0aGUgSVNSCisJICovCisJaWYgKGN0cmwtPnhmZXIuZXJyICYgSTJDX01TTV9FUlJfVElNRU9VVCkgeworCQkvKiBGbHVzaCBmb3IgdGhlIERNQSByZWdpc3RlcnMgKi8KKwkJaWYgKGN0cmwtPnhmZXIubW9kZV9pZCA9PSBJMkNfTVNNX1hGRVJfTU9ERV9ETUEpCisJCQl3cml0ZWxfcmVsYXhlZChRVVBfSTJDX0ZMVVNILCBjdHJsLT5yc3Jjcy5iYXNlCisJCQkJCQkJCSsgUVVQX1NUQVRFKTsKKworCQkvKiByZXNldCB0aGUgcXVwIGNvcmUgKi8KKwkJaTJjX21zbV9xdXBfc3RhdGVfc2V0KGN0cmwsIFFVUF9TVEFURV9SRVNFVCk7CisJCWVyciA9IC1FVElNRURPVVQ7CisJfSBlbHNlIGlmIChjdHJsLT54ZmVyLmVyciA9PSBJMkNfTVNNX0VSUl9OQUNLKSB7CisJCWVyciA9IC1FTk9UQ09OTjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgZW51bSBpMmNfbXNtX3hmZXJfbW9kZV9pZAoraTJjX21zbV9xdXBfY2hvb3NlX21vZGUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZmlmbyAqZmlmbyA9ICZjdHJsLT54ZmVyLmZpZm87CisJc3RydWN0IGkyY19tc21feGZlciAgICAgICAgICAgKnhmZXIgPSAmY3RybC0+eGZlcjsKKwlzaXplX3QgcnhfY250X3N1bSA9IHhmZXItPnJ4X2NudCArIHhmZXItPnJ4X292cmhkX2NudDsKKwlzaXplX3QgdHhfY250X3N1bSA9IHhmZXItPnR4X2NudCArIHhmZXItPnR4X292cmhkX2NudDsKKworCisJaWYgKGN0cmwtPmRiZ2ZzLmZvcmNlX3hmZXJfbW9kZSAhPSBJMkNfTVNNX1hGRVJfTU9ERV9OT05FKQorCQlyZXR1cm4gY3RybC0+ZGJnZnMuZm9yY2VfeGZlcl9tb2RlOworCisJaWYgKCgocnhfY250X3N1bSA8IGZpZm8tPmlucHV0X2ZpZm9fc3opICYmCisJCSh0eF9jbnRfc3VtIDwgZmlmby0+b3V0cHV0X2ZpZm9fc3opKSkKKwkJcmV0dXJuIEkyQ19NU01fWEZFUl9NT0RFX0ZJRk87CisKKwlpZiAoY3RybC0+cnNyY3MuZGlzYWJsZV9kbWEpCisJCXJldHVybiBJMkNfTVNNX1hGRVJfTU9ERV9CTE9DSzsKKworCXJldHVybiBJMkNfTVNNX1hGRVJfTU9ERV9ETUE7Cit9CisKKy8qCisgKiBpMmNfbXNtX3hmZXJfY2FsY190aW1lb3V0OiBjYWxjIG1heGltdW0geGZlciB0aW1lIGluIGppZmZpZXMKKyAqCisgKiBCYXNpY2FsbHkgdGltZW91dCA9IChiaXRfY291bnQgLyBmcmVxdWVuY3kpICogc2FmZXR5X2NvZWZmaWNpZW50LgorICogVGhlIHNhZmV0eS1jb2VmZmljaWVudCBhbHNvIGFjY291bnRzIGZvciBkZWJ1Z2dpbmcgZGVsYXkgKG1vc3RseSBmcm9tCisgKiBwcmludGsoKSBjYWxscykuCisgKi8KK3N0YXRpYyB2b2lkIGkyY19tc21feGZlcl9jYWxjX3RpbWVvdXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzaXplX3QgYnl0ZV9jbnQgPSBjdHJsLT54ZmVyLnJ4X2NudCArIGN0cmwtPnhmZXIudHhfY250OworCXNpemVfdCBiaXRfY250ICA9IGJ5dGVfY250ICogOTsKKwlzaXplX3QgYml0X3VzZWMgPSAoYml0X2NudCAqIFVTRUNfUEVSX1NFQykgLyBjdHJsLT5yc3Jjcy5jbGtfZnJlcV9vdXQ7CisJc2l6ZV90IGxvZ2luZ19vdnJoZF9jb2VmID0gY3RybC0+ZGJnZnMuZGJnX2x2bCArIDE7CisJc2l6ZV90IHNhZmV0eV9jb2VmICAgPSBJMkNfTVNNX1RJTUVPVVRfU0FGRVRZX0NPRUYgKiBsb2dpbmdfb3ZyaGRfY29lZjsKKwlzaXplX3QgeGZlcl9tYXhfdXNlYyA9IChiaXRfdXNlYyAqIHNhZmV0eV9jb2VmKSArCisJCQkJCQlJMkNfTVNNX1RJTUVPVVRfTUlOX1VTRUM7CisKKwljdHJsLT54ZmVyLnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKHhmZXJfbWF4X3VzZWMpOworfQorCitzdGF0aWMgaW50IGkyY19tc21feGZlcl93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwsCisJCQkJCQlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGUpCit7CisJc3RydWN0IGkyY19tc21feGZlciAqeGZlciA9ICZjdHJsLT54ZmVyOworCWxvbmcgIHRpbWVfbGVmdDsKKwlpbnQgICByZXQgPSAwOworCisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KGNvbXBsZXRlLAorCQkJCQkJeGZlci0+dGltZW91dCk7CisJaWYgKCF0aW1lX2xlZnQpIHsKKwkJeGZlci0+ZXJyID0gSTJDX01TTV9FUlJfVElNRU9VVDsKKwkJaTJjX21zbV9kYmdfZHVtcF9kaWFnKGN0cmwsIGZhbHNlLCAwLCAwKTsKKwkJcmV0ID0gLUVJTzsKKwkJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9FUlIsIEkyQ19NU01fQ09NUExUX0ZMLAorCQkJCQl4ZmVyLT50aW1lb3V0LCB0aW1lX2xlZnQsIDApOworCX0gZWxzZSB7CisJCS8qIHJldHVybiBhbiBlcnJvciBpZiBvbmUgZGV0ZWN0ZWQgYnkgSVNSICovCisJCWlmIChjdHJsLT54ZmVyLmVyciB8fAorCQkJCShjdHJsLT5kYmdmcy5kYmdfbHZsID49IE1TTV9EQkcpKSB7CisJCQlpMmNfbXNtX2RiZ19kdW1wX2RpYWcoY3RybCwgdHJ1ZSwKKwkJCQkJY3RybC0+aTJjX3N0c19yZWcsIGN0cmwtPnF1cF9vcF9yZWcpOworCQkJcmV0ID0gLSh4ZmVyLT5lcnIpOworCQl9CisJCWkyY19tc21fcHJvZl9ldm50X2FkZChjdHJsLCBNU01fREJHLCBJMkNfTVNNX0NPTVBMVF9PSywKKwkJCQkJeGZlci0+dGltZW91dCwgdGltZV9sZWZ0LCAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGkyY19tc21fc2x2X3JkX3dyX2FkZHIodTE2IHNsdl9hZGRyLCBib29sIGlzX3J4KQoreworCXJldHVybiAoc2x2X2FkZHIgPDwgMSkgfCAoaXNfcnggPyAweDEgOiAweDApOworfQorCisvKgorICogQHJldHVybiB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdHJhbnNmZXIncyBidWZmZXIgcG9pbnRzIHRvIHRoZSBsYXN0IG1lc3NhZ2UKKyAqICAgIG9mIHRoZSB1c2VyJ3MgcmVxdWVzdC4KKyAqLworc3RhdGljIGJvb2wgaTJjX21zbV94ZmVyX21zZ19pc19sYXN0KHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJcmV0dXJuIGN0cmwtPnhmZXIuY3VyX2J1Zi5tc2dfaWR4ID49IChjdHJsLT54ZmVyLm1zZ19jbnQgLSAxKTsKK30KKworLyoKKyAqIEByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYW5zZmVyJ3MgYnVmZmVyIHBvaW50cyB0byB0aGUgbGFzdAorICogICAgdHJhbnNmZXJhYmxlIGJ1ZmZlciAoc2l6ZSA9PCBRVVBfTUFYX0JVRl9TWikgb2YgdGhlIGxhc3QgbWVzc2FnZSBvZiB0aGUKKyAqICAgIHVzZXIncyByZXF1ZXN0LgorICovCitzdGF0aWMgYm9vbCBpMmNfbXNtX3hmZXJfYnVmX2lzX2xhc3Qoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAqY3VyX2J1ZiA9ICZjdHJsLT54ZmVyLmN1cl9idWY7CisJc3RydWN0IGkyY19tc2cgKmN1cl9tc2cgPSBjdHJsLT54ZmVyLm1zZ3MgKyBjdXJfYnVmLT5tc2dfaWR4OworCisJcmV0dXJuIGkyY19tc21feGZlcl9tc2dfaXNfbGFzdChjdHJsKSAmJgorCQkoKGN1cl9idWYtPmJ5dGVfaWR4ICsgUVVQX01BWF9CVUZfU1opID49IGN1cl9tc2ctPmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21feGZlcl9jcmVhdGVfY3VyX3RhZyhzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLAorCQkJCQkJCQlib29sIHN0YXJ0X3JlcSkKK3sKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAqY3VyX2J1ZiA9ICZjdHJsLT54ZmVyLmN1cl9idWY7CisKKwljdXJfYnVmLT5vdXRfdGFnID0gaTJjX21zbV90YWdfY3JlYXRlKHN0YXJ0X3JlcSwgY3VyX2J1Zi0+aXNfbGFzdCwKKwkJCQkJY3VyX2J1Zi0+aXNfcngsIGN1cl9idWYtPmxlbiwKKwkJCQkJY3VyX2J1Zi0+c2x2X2FkZHIpOworCisJY3VyX2J1Zi0+aW5fdGFnLmxlbiA9IGN1cl9idWYtPmlzX3J4ID8gUVVQX0JVRl9PVkVSSERfQkMgOiAwOworfQorCisvKgorICogaTJjX21zbV94ZmVyX25leHRfYnVmOiBzdXBwb3J0IGNhc2VzIHdoZW4gbXNnLmxlbiA+IDI1NiBieXRlcworICoKKyAqIEByZXR1cm4gdHJ1ZSB3aGVuIG5leHQgYnVmZmVyIGV4aXN0LCBvciBmYWxzZSB3aGVuIG5vIHN1Y2ggYnVmZmVyCisgKi8KK3N0YXRpYyBib29sIGkyY19tc21feGZlcl9uZXh0X2J1ZihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpjdXJfYnVmID0gJmN0cmwtPnhmZXIuY3VyX2J1ZjsKKwlzdHJ1Y3QgaTJjX21zZyAgICAgICAgICAqY3VyX21zZyA9IGN0cmwtPnhmZXIubXNncyArIGN1cl9idWYtPm1zZ19pZHg7CisJaW50IGJjX3JlbSA9IGN1cl9tc2ctPmxlbiAtIGN1cl9idWYtPmVuZF9pZHg7CisKKwlpZiAoY3VyX2J1Zi0+aXNfaW5pdCAmJiBjdXJfYnVmLT5lbmRfaWR4ICYmIGJjX3JlbSkgeworCQkvKiBub3QgdGhlIGZpcnN0IGJ1ZmZlciBpbiBhIG1lc3NhZ2UgKi8KKworCQljdXJfYnVmLT5ieXRlX2lkeCAgPSBjdXJfYnVmLT5lbmRfaWR4OworCQljdXJfYnVmLT5pc19sYXN0ICAgPSBpMmNfbXNtX3hmZXJfYnVmX2lzX2xhc3QoY3RybCk7CisJCWN1cl9idWYtPmxlbiAgICAgICA9IG1pbl90KGludCwgYmNfcmVtLCBRVVBfTUFYX0JVRl9TWik7CisJCWN1cl9idWYtPmVuZF9pZHggICs9IGN1cl9idWYtPmxlbjsKKworCQkvKiBObyBTdGFydCBpcyByZXF1aXJlZCBpZiBpdCBpcyBub3QgYSBmaXJzdCBidWZmZXIgaW4gbXNnICovCisJCWkyY19tc21feGZlcl9jcmVhdGVfY3VyX3RhZyhjdHJsLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJLyogZmlyc3QgYnVmZmVyIGluIGEgbmV3IG1lc3NhZ2UgKi8KKwkJaWYgKGN1cl9idWYtPmlzX2luaXQpIHsKKwkJCWlmIChpMmNfbXNtX3hmZXJfbXNnX2lzX2xhc3QoY3RybCkpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQkrK2N1cl9idWYtPm1zZ19pZHg7CisJCQkrK2N1cl9tc2c7CisJCX0gZWxzZSB7CisJCQljdXJfYnVmLT5pc19pbml0ID0gdHJ1ZTsKKwkJfQorCQljdXJfYnVmLT5ieXRlX2lkeCAgPSAwOworCQljdXJfYnVmLT5pc19sYXN0ICAgPSBpMmNfbXNtX3hmZXJfYnVmX2lzX2xhc3QoY3RybCk7CisJCWN1cl9idWYtPmxlbiAgICAgICA9IG1pbl90KGludCwgY3VyX21zZy0+bGVuLCBRVVBfTUFYX0JVRl9TWik7CisJCWN1cl9idWYtPmlzX3J4ICAgICA9IChjdXJfbXNnLT5mbGFncyAmIEkyQ19NX1JEKTsKKwkJY3VyX2J1Zi0+ZW5kX2lkeCAgID0gY3VyX2J1Zi0+bGVuOworCQljdXJfYnVmLT5zbHZfYWRkciAgPSBpMmNfbXNtX3Nsdl9yZF93cl9hZGRyKGN1cl9tc2ctPmFkZHIsCisJCQkJCQkJCWN1cl9idWYtPmlzX3J4KTsKKwkJaTJjX21zbV94ZmVyX2NyZWF0ZV9jdXJfdGFnKGN0cmwsIHRydWUpOworCX0KKwlpMmNfbXNtX3Byb2ZfZXZudF9hZGQoY3RybCwgTVNNX0RCRywgSTJDX01TTV9ORVhUX0JVRiwgY3VyX2J1Zi0+bXNnX2lkeCwKKwkJCQkJCQljdXJfYnVmLT5ieXRlX2lkeCwgMCk7CisJcmV0dXJuICB0cnVlOworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX3BtX2Nsa191bnByZXBhcmUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwljbGtfdW5wcmVwYXJlKGN0cmwtPnJzcmNzLmNvcmVfY2xrKTsKKwljbGtfdW5wcmVwYXJlKGN0cmwtPnJzcmNzLmlmYWNlX2Nsayk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX21zbV9wbV9jbGtfcHJlcGFyZShzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZShjdHJsLT5yc3Jjcy5pZmFjZV9jbGspOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwKKwkJCSJlcnJvciBvbiBjbGtfcHJlcGFyZShpZmFjZV9jbGspOiVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlKGN0cmwtPnJzcmNzLmNvcmVfY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa191bnByZXBhcmUoY3RybC0+cnNyY3MuaWZhY2VfY2xrKTsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkiZXJyb3IgY2xrX3ByZXBhcmUoY29yZV9jbGspOiVkXG4iLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX3BtX2Nsa19kaXNhYmxlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJY2xrX2Rpc2FibGUoY3RybC0+cnNyY3MuY29yZV9jbGspOworCWNsa19kaXNhYmxlKGN0cmwtPnJzcmNzLmlmYWNlX2Nsayk7Cit9CisKK3N0YXRpYyBpbnQgaTJjX21zbV9wbV9jbGtfZW5hYmxlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IHJldDsKKworCXJldCA9IGNsa19lbmFibGUoY3RybC0+cnNyY3MuaWZhY2VfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yIG9uIGNsa19lbmFibGUoaWZhY2VfY2xrKTolZFxuIiwgcmV0KTsKKwkJaTJjX21zbV9wbV9jbGtfdW5wcmVwYXJlKGN0cmwpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBjbGtfZW5hYmxlKGN0cmwtPnJzcmNzLmNvcmVfY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlKGN0cmwtPnJzcmNzLmlmYWNlX2Nsayk7CisJCWkyY19tc21fcG1fY2xrX3VucHJlcGFyZShjdHJsKTsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkiZXJyb3IgY2xrX2VuYWJsZShjb3JlX2Nsayk6JWRcbiIsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaTJjX21zbV9wbV94ZmVyX3N0YXJ0KHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmN0cmwtPnhmZXIubXR4KTsKKworCWkyY19tc21fcG1fcGluY3RybF9zdGF0ZShjdHJsLCB0cnVlKTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGN0cmwtPmRldik7CisJLyoKKwkgKiBpZiBydW50aW1lIFBNIGNhbGxiYWNrIHdhcyBub3QgaW52b2tlZCAod2hlbiBib3RoIHJ1bnRpbWUtcG0KKwkgKiBhbmQgc3lzdG1lLXBtIGFyZSBpbiB0cmFuc2l0aW9uIGNvbmN1cnJlbnRseSkKKwkgKi8KKwlpZiAoY3RybC0+cHdyX3N0YXRlICE9IEkyQ19NU01fUE1fUlRfQUNUSVZFKSB7CisJCWRldl9pbmZvKGN0cmwtPmRldiwgIlJ1bnRpbWUgUE0tY2FsbGJhY2sgd2FzIG5vdCBpbnZva2VkLlxuIik7CisJCWkyY19tc21fcG1fcmVzdW1lKGN0cmwtPmRldik7CisJfQorCisJcmV0ID0gaTJjX21zbV9wbV9jbGtfZW5hYmxlKGN0cmwpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsLT54ZmVyLm10eCk7CisJCXJldHVybiByZXQ7CisJfQorCWkyY19tc21fcXVwX2luaXQoY3RybCk7CisKKwkvKiBTZXQgeGZlciB0byBhY3RpdmUgc3RhdGUgKGVmZWN0aXZlbHkgZW5hYmxpbmcgb3VyIElTUikqLworCWF0b21pY19zZXQoJmN0cmwtPnhmZXIuaXNfYWN0aXZlLCAxKTsKKworCWVuYWJsZV9pcnEoY3RybC0+cnNyY3MuaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTJjX21zbV9wbV94ZmVyX2VuZChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCisJYXRvbWljX3NldCgmY3RybC0+eGZlci5pc19hY3RpdmUsIDApOworCisJLyoKKwkgKiBETUEgcmVzb3VyY2VzIGFyZSBmcmVlZCBkdWUgdG8gbXVsdGktRUUgdXNlIGNhc2UuCisJICogT3RoZXIgRUVzIGNhbiBwb3RlbnRpYWxseSB1c2UgdGhlIERNQQorCSAqIHJlc291cmNlcyB3aXRoIGluIHRoZSBzYW1lIHJ1bnRpbWUgUE0gdm90ZS4KKwkgKi8KKwlpZiAoY3RybC0+eGZlci5tb2RlX2lkID09IEkyQ19NU01fWEZFUl9NT0RFX0RNQSkKKwkJaTJjX21zbV9kbWFfZnJlZV9jaGFubmVscyhjdHJsKTsKKworCWkyY19tc21fcG1fY2xrX2Rpc2FibGUoY3RybCk7CisKKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChjdHJsLT5kZXYpKQorCQlpMmNfbXNtX3BtX3N1c3BlbmQoY3RybC0+ZGV2KTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koY3RybC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjdHJsLT5kZXYpOworCWkyY19tc21fcG1fcGluY3RybF9zdGF0ZShjdHJsLCBmYWxzZSk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT54ZmVyLm10eCk7Cit9CisKKy8qCisgKiBpMmNfbXNtX3hmZXJfc2NhbjogaW5pdGlhbCBpbnB1dCBzY2FuCisgKi8KK3N0YXRpYyB2b2lkIGkyY19tc21feGZlcl9zY2FuKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGkyY19tc21feGZlciAgICAgKnhmZXIgICAgICA9ICZjdHJsLT54ZmVyOworCXN0cnVjdCBpMmNfbXNtX3hmZXJfYnVmICpjdXJfYnVmICAgPSAmeGZlci0+Y3VyX2J1ZjsKKworCXdoaWxlIChpMmNfbXNtX3hmZXJfbmV4dF9idWYoY3RybCkpIHsKKworCQlpZiAoY3VyX2J1Zi0+aXNfcngpCisJCQl4ZmVyLT5yeF9jbnQgKz0gY3VyX2J1Zi0+bGVuOworCQllbHNlCisJCQl4ZmVyLT50eF9jbnQgKz0gY3VyX2J1Zi0+bGVuOworCisJCXhmZXItPnJ4X292cmhkX2NudCArPSBjdXJfYnVmLT5pbl90YWcubGVuOworCQl4ZmVyLT50eF9vdnJoZF9jbnQgKz0gY3VyX2J1Zi0+b3V0X3RhZy5sZW47CisKKwkJaWYgKGkyY19tc21feGZlcl9tc2dfaXNfbGFzdChjdHJsKSkKKwkJCXhmZXItPmxhc3RfaXNfcnggPSBjdXJfYnVmLT5pc19yeDsKKwl9CisJeGZlci0+Y3VyX2J1ZiA9IChzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1Zil7MH07Cit9CisKK3N0YXRpYyBpbnQKK2kyY19tc21fZnJtd3JrX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyY19tc21fY3RybCAgICAgICpjdHJsID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyICAgICAgKnhmZXIgPSAmY3RybC0+eGZlcjsKKworCWlmIChJU19FUlJfT1JfTlVMTChtc2dzKSkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgIiBlcnJvciBvbiBtc2dzIEFjY2Vzc2luZyBpbnZhbGlkICBwb2ludGVyIGxvY2F0aW9uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobXNncyk7CisJfQorCisJLyogaWYgc3lzdGVtIGlzIHN1c3BlbmRlZCBqdXN0IGJhaWwgb3V0ICovCisJaWYgKGN0cmwtPnB3cl9zdGF0ZSA9PSBJMkNfTVNNX1BNX1NZU19TVVNQRU5ERUQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkJInNsYXZlOjB4JXggaXMgY2FsbGluZyB4ZmVyIHdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZFxuIiwKKwkJCQltc2dzLT5hZGRyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gaTJjX21zbV9wbV94ZmVyX3N0YXJ0KGN0cmwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBpbml0IHhmZXIgKi8KKwl4ZmVyLT5tc2dzICAgICAgICAgPSBtc2dzOworCXhmZXItPm1zZ19jbnQgICAgICA9IG51bTsKKwl4ZmVyLT5tb2RlX2lkICAgICAgPSBJMkNfTVNNX1hGRVJfTU9ERV9OT05FOworCXhmZXItPmVyciAgICAgICAgICA9IDA7CisJeGZlci0+cnhfY250ICAgICAgID0gMDsKKwl4ZmVyLT50eF9jbnQgICAgICAgPSAwOworCXhmZXItPnJ4X292cmhkX2NudCA9IDA7CisJeGZlci0+dHhfb3ZyaGRfY250ID0gMDsKKwlhdG9taWNfc2V0KCZ4ZmVyLT5ldmVudF9jbnQsIDApOworCWluaXRfY29tcGxldGlvbigmeGZlci0+Y29tcGxldGUpOworCWluaXRfY29tcGxldGlvbigmeGZlci0+cnhfY29tcGxldGUpOworCisJeGZlci0+Y3VyX2J1Zi5pc19pbml0ID0gZmFsc2U7CisJeGZlci0+Y3VyX2J1Zi5tc2dfaWR4ID0gMDsKKworCWkyY19tc21fcHJvZl9ldm50X2FkZChjdHJsLCBNU01fUFJPRiwgSTJDX01TTV9YRkVSX0JFRywgbnVtLAorCQkJCQkJCQltc2dzLT5hZGRyLCAwKTsKKworCWkyY19tc21feGZlcl9zY2FuKGN0cmwpOworCWkyY19tc21feGZlcl9jYWxjX3RpbWVvdXQoY3RybCk7CisJeGZlci0+bW9kZV9pZCA9IGkyY19tc21fcXVwX2Nob29zZV9tb2RlKGN0cmwpOworCisJZGV2X2RiZyhjdHJsLT5kZXYsICJ4ZmVyKCkgbW9kZTolZCBtc2dfY250OiVkIHJ4X2NidDolenUgdHhfY250OiV6dVxuIiwKKwkJeGZlci0+bW9kZV9pZCwgeGZlci0+bXNnX2NudCwgeGZlci0+cnhfY250LCB4ZmVyLT50eF9jbnQpOworCisJc3dpdGNoICh4ZmVyLT5tb2RlX2lkKSB7CisJY2FzZSBJMkNfTVNNX1hGRVJfTU9ERV9GSUZPOgorCQlyZXQgPSBpMmNfbXNtX2ZpZm9feGZlcihjdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfTVNNX1hGRVJfTU9ERV9CTE9DSzoKKwkJcmV0ID0gaTJjX21zbV9ibGtfeGZlcihjdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfTVNNX1hGRVJfTU9ERV9ETUE6CisJCXJldCA9IGkyY19tc21fZG1hX3hmZXIoY3RybCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5UUjsKKwl9OworCisJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9QUk9GLCBJMkNfTVNNX1NDQU5fU1VNLAorCQkoKHhmZXItPnJ4X2NudCAmIDB4ZmYpIHwgKCh4ZmVyLT5yeF9vdnJoZF9jbnQgJiAweGZmKSA8PCAxNikpLAorCQkoKHhmZXItPnR4X2NudCAmIDB4ZmYpIHwgKCh4ZmVyLT50eF9vdnJoZF9jbnQgJiAweGZmKSA8PCAxNikpLAorCQkoKGN0cmwtPnhmZXIudGltZW91dCAmIDB4ZmZmKSB8ICgoeGZlci0+bW9kZV9pZCAmIDB4ZikgPDwgMjQpKSk7CisKKwlyZXQgPSBpMmNfbXNtX3F1cF9wb3N0X3hmZXIoY3RybCwgcmV0KTsKKwkvKiBvbiBzdWNjZXNzLCByZXR1cm4gbnVtYmVyIG9mIG1lc3NhZ2VzIHNlbnQgKHdoaWNoIGlzIGluZGV4ICsgMSkqLworCWlmICghcmV0KQorCQlyZXQgPSB4ZmVyLT5jdXJfYnVmLm1zZ19pZHggKyAxOworCisJaTJjX21zbV9wcm9mX2V2bnRfYWRkKGN0cmwsIE1TTV9QUk9GLCBJMkNfTVNNX1hGRVJfRU5ELCByZXQsIHhmZXItPmVyciwKKwkJCQkJCXhmZXItPmN1cl9idWYubXNnX2lkeCArIDEpOworCS8qIHByb2Nlc3MgYW5kIGR1bXAgcHJvZmlsaW5nIGRhdGEgKi8KKwlpZiAoeGZlci0+ZXJyIHx8IChjdHJsLT5kYmdmcy5kYmdfbHZsID49IE1TTV9QUk9GKSkKKwkJaTJjX21zbV9wcm9mX2V2bnRfZHVtcChjdHJsKTsKKworCWkyY19tc21fcG1feGZlcl9lbmQoY3RybCk7CisJcmV0dXJuIHJldDsKK30KKworZW51bSBpMmNfbXNtX2R0X2VudHJ5X3N0YXR1cyB7CisJRFRfUkVRLCAgLyogUmVxdWlyZWQ6ICBmYWlsIGlmIG1pc3NpbmcgKi8KKwlEVF9TR1NULCAvKiBTdWdnZXN0ZWQ6IHdhcm4gaWYgbWlzc2luZyAqLworCURUX09QVCwgIC8qIE9wdGlvbmFsOiAgZG9uJ3Qgd2FybiBpZiBtaXNzaW5nICovCit9OworCitlbnVtIGkyY19tc21fZHRfZW50cnlfdHlwZSB7CisJRFRfVTMyLAorCURUX0JPT0wsCisJRFRfSUQsICAgLyogb2ZfYWxpYXNfZ2V0X2lkKCkgKi8KK307CisKK3N0cnVjdCBpMmNfbXNtX2R0X3RvX3BkYXRhX21hcCB7CisJY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpkdF9uYW1lOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX2RhdGE7CisJZW51bSBpMmNfbXNtX2R0X2VudHJ5X3N0YXR1cyBzdGF0dXM7CisJZW51bSBpMmNfbXNtX2R0X2VudHJ5X3R5cGUgICB0eXBlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92YWw7Cit9OworCitzdGF0aWMgaW50IGkyY19tc21fZHRfdG9fcGRhdGFfcG9wdWxhdGUoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IGkyY19tc21fZHRfdG9fcGRhdGFfbWFwICppdHIpCit7CisJaW50ICByZXQsIGVyciA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlmb3IgKDsgaXRyLT5kdF9uYW1lIDsgKytpdHIpIHsKKwkJc3dpdGNoIChpdHItPnR5cGUpIHsKKwkJY2FzZSBEVF9VMzI6CisJCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBpdHItPmR0X25hbWUsCisJCQkJCQkJICh1MzIgKikgaXRyLT5wdHJfZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBEVF9CT09MOgorCQkJKigoYm9vbCAqKSBpdHItPnB0cl9kYXRhKSA9CisJCQkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsIGl0ci0+ZHRfbmFtZSk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRFRfSUQ6CisJCQlyZXQgPSBvZl9hbGlhc19nZXRfaWQobm9kZSwgaXRyLT5kdF9uYW1lKTsKKwkJCWlmIChyZXQgPj0gMCkgeworCQkJCSooKGludCAqKSBpdHItPnB0cl9kYXRhKSA9IHJldDsKKwkJCQlyZXQgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGN0cmwtPmRldiwKKwkJCQkiZXJyb3IgJWQgaXMgb2YgdW5rbm93biBEVCBlbnRyeSB0eXBlXG4iLAorCQkJCWl0ci0+dHlwZSk7CisJCQlyZXQgPSAtRUJBREU7CisJCX0KKworCQlpMmNfbXNtX2RiZyhjdHJsLCBNU01fUFJPRiwgIkRUIGVudHJ5IHJldDolZCBuYW1lOiVzIHZhbDolZCIsCisJCQkJcmV0LCBpdHItPmR0X25hbWUsICooKGludCAqKWl0ci0+cHRyX2RhdGEpKTsKKworCQlpZiAocmV0KSB7CisJCQkqKChpbnQgKilpdHItPnB0cl9kYXRhKSA9IGl0ci0+ZGVmYXVsdF92YWw7CisKKwkJCWlmIChpdHItPnN0YXR1cyA8IERUX09QVCkgeworCQkJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJCQkiZXJyb3IgTWlzc2luZyAnJXMnIERUIGVudHJ5XG4iLAorCQkJCQlpdHItPmR0X25hbWUpOworCisJCQkJLyogY29udCBvbiBlcnIgdG8gZHVtcCBhbGwgbWlzc2luZyBlbnRyaWVzICovCisJCQkJaWYgKGl0ci0+c3RhdHVzID09IERUX1JFUSAmJiAhZXJyKQorCQkJCQllcnIgPSByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qCisgKiBpMmNfbXNtX3JzcmNzX3Byb2Nlc3NfZHQ6IGNvcHkgZGF0YSBmcm9tIERUIHRvIHBsYXRmb3JtIGRhdGEKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpMmNfbXNtX3JzcmNzX3Byb2Nlc3NfZHQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1MzIgZnNfY2xrX2RpdiwgaHRfY2xrX2Rpdiwgbm9pc2VfcmpjdF9zY2wsIG5vaXNlX3JqY3Rfc2RhOworCWludCByZXQ7CisKKwlzdHJ1Y3QgaTJjX21zbV9kdF90b19wZGF0YV9tYXAgbWFwW10gPSB7CisJeyJpMmMiLAkJCQkmcGRldi0+aWQsCURUX1JFUSwgIERUX0lELCAgLTF9LAorCXsicWNvbSxjbGstZnJlcS1vdXQiLAkJJmN0cmwtPnJzcmNzLmNsa19mcmVxX291dCwKKwkJCQkJCQlEVF9SRVEsICBEVF9VMzIsICAwfSwKKwl7InFjb20sY2xrLWZyZXEtaW4iLAkJJmN0cmwtPnJzcmNzLmNsa19mcmVxX2luLAorCQkJCQkJCURUX1JFUSwgIERUX1UzMiwgIDB9LAorCXsicWNvbSxkaXNhYmxlLWRtYSIsCQkmKGN0cmwtPnJzcmNzLmRpc2FibGVfZG1hKSwKKwkJCQkJCQlEVF9PUFQsICBEVF9CT09MLCAwfSwKKwl7InFjb20sbWFzdGVyLWlkIiwJCSYoY3RybC0+cnNyY3MuY2xrX3BhdGhfdm90ZS5tc3RyX2lkKSwKKwkJCQkJCQlEVF9TR1NULCBEVF9VMzIsICAwfSwKKwl7InFjb20sbm9pc2UtcmpjdC1zY2wiLAkJJm5vaXNlX3JqY3Rfc2NsLAorCQkJCQkJCURUX09QVCwgIERUX1UzMiwgIDB9LAorCXsicWNvbSxub2lzZS1yamN0LXNkYSIsCQkmbm9pc2VfcmpjdF9zZGEsCisJCQkJCQkJRFRfT1BULCAgRFRfVTMyLCAgMH0sCisJeyJxY29tLGhpZ2gtdGltZS1jbGstZGl2IiwJJmh0X2Nsa19kaXYsCisJCQkJCQkJRFRfT1BULCAgRFRfVTMyLCAgMH0sCisJeyJxY29tLGZzLWNsay1kaXYiLAkJJmZzX2Nsa19kaXYsCisJCQkJCQkJRFRfT1BULCAgRFRfVTMyLCAgMH0sCisJe05VTEwsICBOVUxMLAkJCQkJMCwgICAgICAgMCwgICAgICAgMH0sCisJfTsKKworCXJldCA9IGkyY19tc21fZHRfdG9fcGRhdGFfcG9wdWxhdGUoY3RybCwgcGRldiwgbWFwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGRpdmlkZXIgYW5kIG5vaXNlIHJlamVjdCB2YWx1ZXMgKi8KKwlyZXR1cm4gaTJjX21zbV9zZXRfbXN0cl9jbGtfY3RsKGN0cmwsIGZzX2Nsa19kaXYsIGh0X2Nsa19kaXYsCisJCQkJCQlub2lzZV9yamN0X3NjbCwgbm9pc2VfcmpjdF9zZGEpOworfQorCisvKgorICogaTJjX21zbV9yc3Jjc19tZW1faW5pdDogcmVhZHMgcGRhdGEgcmVxdWVzdCByZWdpb24gYW5kIGlvcmVtYXAgaXQKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBpMmNfbXNtX3JzcmNzX21lbV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCQlzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXN0cnVjdCByZXNvdXJjZSAqbWVtX3JlZ2lvbjsKKworCWN0cmwtPnJzcmNzLm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCQkJInF1cF9waHlzX2FkZHIiKTsKKwlpZiAoIWN0cmwtPnJzcmNzLm1lbSkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIE1pc3NpbmcgJ3F1cF9waHlzX2FkZHInIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWVtX3JlZ2lvbiA9IHJlcXVlc3RfbWVtX3JlZ2lvbihjdHJsLT5yc3Jjcy5tZW0tPnN0YXJ0LAorCQkJCQlyZXNvdXJjZV9zaXplKGN0cmwtPnJzcmNzLm1lbSksCisJCQkJCXBkZXYtPm5hbWUpOworCWlmICghbWVtX3JlZ2lvbikgeworCQlkZXZfZXJyKGN0cmwtPmRldiwKKwkJCSJRVVAgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbiBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWN0cmwtPnJzcmNzLmJhc2UgPSBkZXZtX2lvcmVtYXAoY3RybC0+ZGV2LCBjdHJsLT5yc3Jjcy5tZW0tPnN0YXJ0LAorCQkJCSAgIHJlc291cmNlX3NpemUoY3RybC0+cnNyY3MubWVtKSk7CisJaWYgKCFjdHJsLT5yc3Jjcy5iYXNlKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yIGZhaWxlZCBpb3JlbWFwKGJhc2U6MHglbGx4IHNpemU6MHglbGx4XG4pIiwKKwkJCSh1NjQpIGN0cmwtPnJzcmNzLm1lbS0+c3RhcnQsCisJCQkodTY0KSByZXNvdXJjZV9zaXplKGN0cmwtPnJzcmNzLm1lbSkpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY3RybC0+cnNyY3MubWVtLT5zdGFydCwKKwkJCQkJCXJlc291cmNlX3NpemUoY3RybC0+cnNyY3MubWVtKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpMmNfbXNtX3JzcmNzX21lbV90ZWFyZG93bihzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKQoreworCXJlbGVhc2VfbWVtX3JlZ2lvbihjdHJsLT5yc3Jjcy5tZW0tPnN0YXJ0LAorCQkJCQkJcmVzb3VyY2Vfc2l6ZShjdHJsLT5yc3Jjcy5tZW0pKTsKK30KKworLyoKKyAqIGkyY19tc21fcnNyY3NfaXJxX2luaXQ6IGZpbmRzIGlycSBudW0gaW4gcGRhdGEgYW5kIHJlcXVlc3RzIGl0CisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaTJjX21zbV9yc3Jjc19pcnFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCQkJc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlpbnQgcmV0LCBpcnE7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicXVwX2lycSIpOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3IgcmVhZGluZyBpcnEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gaXJxOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaTJjX21zbV9xdXBfaXNyLCBJUlFGX1RSSUdHRVJfSElHSCwKKwkJCQkJCSJpMmMtbXNtLXYyLWlycSIsIGN0cmwpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJlcnJvciByZXF1ZXN0X2lycShpcnFfbnVtOiVkICkgcmV0OiVkXG4iLAorCQkJCQkJCQlpcnEsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGlzYWJsZV9pcnEoaXJxKTsKKwljdHJsLT5yc3Jjcy5pcnEgPSBpcnE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fcnNyY3NfaXJxX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJZnJlZV9pcnEoY3RybC0+cnNyY3MuaXJxLCBjdHJsKTsKK30KKworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfc3RhdGUgKgoraTJjX21zbV9yc3Jjc19ncGlvX2dldF9zdGF0ZShzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpwaW5fc3RhdGUKKwkJCT0gcGluY3RybF9sb29rdXBfc3RhdGUoY3RybC0+cnNyY3MucGluY3RybCwgbmFtZSk7CisKKwlpZiAoSVNfRVJSX09SX05VTEwocGluX3N0YXRlKSkKKwkJZGV2X2luZm8oY3RybC0+ZGV2LCAibm90ZSBwaW5jdHJsX2xvb2t1cF9zdGF0ZSglcykgZXJyOiVsZFxuIiwKKwkJCQkJCW5hbWUsIFBUUl9FUlIocGluX3N0YXRlKSk7CisJcmV0dXJuIHBpbl9zdGF0ZTsKK30KKworLyoKKyAqIGkyY19tc21fcnNyY3NfZ3Bpb19waW5jdHJsX2luaXQ6IGluaXRpYWxpemVzIHRoZSBwaW5jdHJsIGZvciBpMmMgZ3Bpb3MKKyAqCisgKiBAcHJlIHBsYXRmb3JtIGRhdGEgbXVzdCBiZSBpbml0aWFsaXplZAorICovCitzdGF0aWMgaW50IGkyY19tc21fcnNyY3NfZ3Bpb19waW5jdHJsX2luaXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwljdHJsLT5yc3Jjcy5waW5jdHJsID0gZGV2bV9waW5jdHJsX2dldChjdHJsLT5kZXYpOworCWlmIChJU19FUlJfT1JfTlVMTChjdHJsLT5yc3Jjcy5waW5jdHJsKSkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIGRldm1fcGluY3RybF9nZXQoKSBmYWlsZWQgZXJyOiVsZFxuIiwKKwkJCQlQVFJfRVJSKGN0cmwtPnJzcmNzLnBpbmN0cmwpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3RybC0+cnNyY3MucGluY3RybCk7CisJfQorCisJY3RybC0+cnNyY3MuZ3Bpb19zdGF0ZV9hY3RpdmUgPQorCQlpMmNfbXNtX3JzcmNzX2dwaW9fZ2V0X3N0YXRlKGN0cmwsIEkyQ19NU01fUElOQ1RSTF9BQ1RJVkUpOworCisJY3RybC0+cnNyY3MuZ3Bpb19zdGF0ZV9zdXNwZW5kID0KKwkJaTJjX21zbV9yc3Jjc19ncGlvX2dldF9zdGF0ZShjdHJsLCBJMkNfTVNNX1BJTkNUUkxfU1VTUEVORCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTJjX21zbV9wbV9waW5jdHJsX3N0YXRlKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwsCisJCQkJYm9vbCBydW50aW1lX2FjdGl2ZSkKK3sKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqcGluc19zdGF0ZTsKKwljb25zdCBjaGFyICAgICAgICAgICAqcGluc19zdGF0ZV9uYW1lOworCisJaWYgKHJ1bnRpbWVfYWN0aXZlKSB7CisJCXBpbnNfc3RhdGUgICAgICA9IGN0cmwtPnJzcmNzLmdwaW9fc3RhdGVfYWN0aXZlOworCQlwaW5zX3N0YXRlX25hbWUgPSBJMkNfTVNNX1BJTkNUUkxfQUNUSVZFOworCX0gZWxzZSB7CisJCXBpbnNfc3RhdGUgICAgICA9IGN0cmwtPnJzcmNzLmdwaW9fc3RhdGVfc3VzcGVuZDsKKwkJcGluc19zdGF0ZV9uYW1lID0gSTJDX01TTV9QSU5DVFJMX1NVU1BFTkQ7CisJfQorCisJaWYgKCFJU19FUlJfT1JfTlVMTChwaW5zX3N0YXRlKSkgeworCQlpbnQgcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUoY3RybC0+cnNyY3MucGluY3RybCwgcGluc19zdGF0ZSk7CisKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJImVycm9yIHBpbmN0cmxfc2VsZWN0X3N0YXRlKCVzKSBlcnI6JWRcbiIsCisJCQlwaW5zX3N0YXRlX25hbWUsIHJldCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkiZXJyb3IgcGluY3RybCBzdGF0ZS1uYW1lOiclcycgaXMgbm90IGNvbmZpZ3VyZWRcbiIsCisJCQlwaW5zX3N0YXRlX25hbWUpOworCX0KK30KKworLyoKKyAqIGkyY19tc21fcnNyY3NfY2xrX2luaXQ6IGdldCBjbG9ja3MgYW5kIHNldCByYXRlCisgKgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGkyY19tc21fcnNyY3NfY2xrX2luaXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoY3RybC0+cnNyY3MuY2xrX2ZyZXFfb3V0IDw9IDApIHx8CisJICAgIChjdHJsLT5yc3Jjcy5jbGtfZnJlcV9vdXQgPiBJMkNfTVNNX0NMS19GQVNUX1BMVVNfRlJFUSkpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCQkiZXJyb3IgY2xvY2sgZnJlcXVlbmN5ICVkS0haIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkoY3RybC0+cnNyY3MuY2xrX2ZyZXFfb3V0IC8gMTAwMCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwljdHJsLT5yc3Jjcy5jb3JlX2NsayA9IGNsa19nZXQoY3RybC0+ZGV2LCAiY29yZV9jbGsiKTsKKwlpZiAoSVNfRVJSKGN0cmwtPnJzcmNzLmNvcmVfY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGN0cmwtPnJzcmNzLmNvcmVfY2xrKTsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJlcnJvciBvbiBjbGtfZ2V0KGNvcmVfY2xrKTolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY3RybC0+cnNyY3MuY29yZV9jbGssIGN0cmwtPnJzcmNzLmNsa19mcmVxX2luKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3Igb24gY2xrX3NldF9yYXRlKGNvcmVfY2xrLCAlZEtIeik6JWRcbiIsCisJCQkJCShjdHJsLT5yc3Jjcy5jbGtfZnJlcV9pbiAvIDEwMDApLCByZXQpOworCQlnb3RvIGVycl9zZXRfcmF0ZTsKKwl9CisKKwljdHJsLT5yc3Jjcy5pZmFjZV9jbGsgPSBjbGtfZ2V0KGN0cmwtPmRldiwgImlmYWNlX2NsayIpOworCWlmIChJU19FUlIoY3RybC0+cnNyY3MuaWZhY2VfY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGN0cmwtPnJzcmNzLmlmYWNlX2Nsayk7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3Igb24gY2xrX2dldChpZmFjZV9jbGspOiVkXG4iLCByZXQpOworCQlnb3RvIGVycl9zZXRfcmF0ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3NldF9yYXRlOgorCQljbGtfcHV0KGN0cmwtPnJzcmNzLmNvcmVfY2xrKTsKKwkJY3RybC0+cnNyY3MuY29yZV9jbGsgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fcnNyY3NfY2xrX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJY2xrX3B1dChjdHJsLT5yc3Jjcy5jb3JlX2Nsayk7CisJY2xrX3B1dChjdHJsLT5yc3Jjcy5pZmFjZV9jbGspOworCWkyY19tc21fY2xrX3BhdGhfdGVhcmRvd24oY3RybCk7Cit9CisKKworCitzdGF0aWMgdm9pZCBpMmNfbXNtX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChjdHJsLT5wd3Jfc3RhdGUgPT0gSTJDX01TTV9QTV9SVF9TVVNQRU5ERUQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJhdHRlbXB0IHRvIHN1c3BlbmQgd2hlbiBzdXNwZW5kZWRcbiIpOworCQlyZXR1cm47CisJfQorCWkyY19tc21fZGJnKGN0cmwsIE1TTV9EQkcsICJzdXNwZW5kaW5nLi4uIik7CisJaTJjX21zbV9wbV9jbGtfdW5wcmVwYXJlKGN0cmwpOworCWkyY19tc21fY2xrX3BhdGhfdW52b3RlKGN0cmwpOworCisJLyoKKwkgKiBXZSBpbXBsZW1lbnQgc3lzdGVtIGFuZCBydW50aW1lIHN1c3BlbmQgaW4gdGhlIHNhbWUgd2F5LiBIb3dldmVyCisJICogaXQgaXMgaW1wb3J0YW50IGZvciB1cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0gaW4gd2hlbiBzZXJ2aWNpbmcKKwkgKiBhIHRyYW5zZmVyIHJlcXVlc3RzLiBJZiB3ZSBnZXQgdHJhbnNmZXIgcmVxdWVzdCB3aGlsZSBpbiBydW50aW1lCisJICogc3VzcGVuZCB3ZSB3YW50IHRvIHNpbXBseSB3YWtlIHVwIGFuZCBzZXJ2aWNlIHRoYXQgcmVxdWVzdC4gQnV0IGlmIHdlCisJICogZ2V0IGEgdHJhbnNmZXIgcmVxdWVzdCB3aGlsZSBzeXN0ZW0gaXMgc3VzcGVuZGluZyB3ZSB3YW50IHRvIGJhaWwKKwkgKiBvdXQgb24gdGhhdCByZXF1ZXN0LiBUaGlzIGlzIHdoeSBpZiB3ZSBtYXJrZWQgdGhhdCB3ZSBhcmUgaW4gc3lzdGVtCisJICogc3VzcGVuZCwgd2UgZG8gbm90IHdhbnQgdG8gb3ZlcnJpZGUgdGhhdCBzdGF0ZSB3aXRoIHJ1bnRpbWUgc3VzcGVuZC4KKwkgKi8KKwlpZiAoY3RybC0+cHdyX3N0YXRlICE9IEkyQ19NU01fUE1fU1lTX1NVU1BFTkRFRCkKKwkJY3RybC0+cHdyX3N0YXRlID0gSTJDX01TTV9QTV9SVF9TVVNQRU5ERUQ7Cit9CisKK3N0YXRpYyBpbnQgaTJjX21zbV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChjdHJsLT5wd3Jfc3RhdGUgPT0gSTJDX01TTV9QTV9SVF9BQ1RJVkUpCisJCXJldHVybiAwOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgInJlc3VtaW5nLi4uIik7CisKKwlpMmNfbXNtX2Nsa19wYXRoX3ZvdGUoY3RybCk7CisJaTJjX21zbV9wbV9jbGtfcHJlcGFyZShjdHJsKTsKKwljdHJsLT5wd3Jfc3RhdGUgPSBJMkNfTVNNX1BNX1JUX0FDVElWRTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIGkyY19tc21fcG1fc3lzX3N1c3BlbmRfbm9pcnE6IHN5c3RlbSBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrCisgKi8KK3N0YXRpYyBpbnQgaTJjX21zbV9wbV9zeXNfc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyY19tc21fY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWVudW0gaTJjX21zbV9wb3dlcl9zdGF0ZSBwcmV2X3N0YXRlID0gY3RybC0+cHdyX3N0YXRlOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgInBtX3N5c19ub2lycTogc3VzcGVuZGluZy4uLiIpOworCisJLyogQWNxdWlyZSBtdXRleCB0byBlbnN1cmUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBvdmVyICovCisJbXV0ZXhfbG9jaygmY3RybC0+eGZlci5tdHgpOworCWN0cmwtPnB3cl9zdGF0ZSA9IEkyQ19NU01fUE1fU1lTX1NVU1BFTkRFRDsKKwltdXRleF91bmxvY2soJmN0cmwtPnhmZXIubXR4KTsKKwlpMmNfbXNtX2RiZyhjdHJsLCBNU01fREJHLCAicG1fc3lzX25vaXJxOiBzdXNwZW5kaW5nLi4uIik7CisKKwlpZiAocHJldl9zdGF0ZSA9PSBJMkNfTVNNX1BNX1JUX0FDVElWRSkgeworCQlpMmNfbXNtX3BtX3N1c3BlbmQoZGV2KTsKKwkJLyoKKwkJICogU3luY2hyb25pemUgcnVudGltZS1wbSBhbmQgc3lzdGVtLXBtIHN0YXRlczoKKwkJICogYXQgdGhpcyBwb2ludCB3ZSBhcmUgYWxyZWFkeSBzdXNwZW5kZWQuIEhvd2V2ZXIsIHRoZQorCQkgKiBydW50aW1lLVBNIGZyYW1ld29yayBzdGlsbCB0aGlua3MgdGhhdCB3ZSBhcmUgYWN0aXZlLgorCQkgKiBUaGUgdGhyZWUgY2FsbHMgYmVsb3cgbGV0IHRoZSBydW50aW1lLVBNIGtub3cgdGhhdCB3ZSBhcmUKKwkJICogc3VzcGVuZGVkIGFscmVhZHkgd2l0aG91dCByZS1pbnZva2luZyB0aGUgc3VzcGVuZCBjYWxsYmFjaworCQkgKi8KKwkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBpMmNfbXNtX3BtX3N5c19yZXN1bWU6IHN5c3RlbSBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrCisgKiBzaGlmdHMgdGhlIGNvbnRyb2xsZXIncyBwb3dlciBzdGF0ZSBmcm9tIHN5c3RlbSBzdXNwZW5kIHRvIHJ1bnRpbWUgc3VzcGVuZAorICovCitzdGF0aWMgaW50IGkyY19tc21fcG1fc3lzX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19tc21fY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgInBtX3N5c19ub2lycTogcmVzdW1pbmcuLi4iKTsKKwltdXRleF9sb2NrKCZjdHJsLT54ZmVyLm10eCk7CisJY3RybC0+cHdyX3N0YXRlID0gSTJDX01TTV9QTV9SVF9TVVNQRU5ERUQ7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT54ZmVyLm10eCk7CisJcmV0dXJuICAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB2b2lkIGkyY19tc21fcG1fcnRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCAoTVNFQ19QRVJfU0VDID4+IDIpKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Cit9CisKKy8qCisgKiBpMmNfbXNtX3BtX3J0X3N1c3BlbmQ6IHJ1bnRpbWUgcG93ZXIgbWFuYWdlbWVudCBjYWxsYmFjaworICovCitzdGF0aWMgaW50IGkyY19tc21fcG1fcnRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19tc21fY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgInBtX3J1bnRpbWU6IHN1c3BlbmRpbmcuLi4iKTsKKwlpMmNfbXNtX3BtX3N1c3BlbmQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGkyY19tc21fcG1fcnRfcmVzdW1lOiBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBpMmNfbXNtX3BtX3J0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19tc21fY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX0RCRywgInBtX3J1bnRpbWU6IHJlc3VtaW5nLi4uIik7CisJcmV0dXJuICBpMmNfbXNtX3BtX3Jlc3VtZShkZXYpOworfQorCisjZWxzZQorc3RhdGljIHZvaWQgaTJjX21zbV9wbV9ydF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikge30KKyNkZWZpbmUgaTJjX21zbV9wbV9ydF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgaTJjX21zbV9wbV9ydF9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpMmNfbXNtX3BtX29wcyA9IHsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwkuc3VzcGVuZF9ub2lycQkJPSBpMmNfbXNtX3BtX3N5c19zdXNwZW5kX25vaXJxLAorCS5yZXN1bWVfbm9pcnEJCT0gaTJjX21zbV9wbV9zeXNfcmVzdW1lX25vaXJxLAorI2VuZGlmCisJU0VUX1JVTlRJTUVfUE1fT1BTKGkyY19tc21fcG1fcnRfc3VzcGVuZCwKKwkJCSAgIGkyY19tc21fcG1fcnRfcmVzdW1lLAorCQkJICAgTlVMTCkKK307CisKK3N0YXRpYyB1MzIgaTJjX21zbV9mcm13cmtfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IChJMkNfRlVOQ19TTUJVU19FTVVMICYgfkkyQ19GVU5DX1NNQlVTX1FVSUNLKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19tc21fZnJtd3JrX2FsZ3J0bSA9IHsKKwkubWFzdGVyX3hmZXIJPSBpMmNfbXNtX2ZybXdya194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gaTJjX21zbV9mcm13cmtfZnVuYywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjX21zbV9hZGFwdGVyX25hbWUgPSAiTVNNLUkyQy12Mi1hZGFwdGVyIjsKKworc3RhdGljIGludCBpMmNfbXNtX2ZybXdya19yZWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaW50IHJldDsKKworCWkyY19zZXRfYWRhcGRhdGEoJmN0cmwtPmFkYXB0ZXIsIGN0cmwpOworCWN0cmwtPmFkYXB0ZXIuYWxnbyA9ICZpMmNfbXNtX2ZybXdya19hbGdydG07CisJc3RybGNweShjdHJsLT5hZGFwdGVyLm5hbWUsIGkyY19tc21fYWRhcHRlcl9uYW1lLAorCQkJCQkJc2l6ZW9mKGN0cmwtPmFkYXB0ZXIubmFtZSkpOworCisJY3RybC0+YWRhcHRlci5uciA9IHBkZXYtPmlkOworCWN0cmwtPmFkYXB0ZXIuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJY3RybC0+YWRhcHRlci5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmY3RybC0+YWRhcHRlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIGkyY19hZGRfYWRhcHRlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGkyY19tc21fZnJtd3JrX3VucmVnKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJaTJjX2RlbF9hZGFwdGVyKCZjdHJsLT5hZGFwdGVyKTsKK30KKworc3RhdGljIGludCBpMmNfbXNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGkyY19tc21fY3RybCAqY3RybDsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcm9iaW5nIGRyaXZlciBpMmMtbXNtLXYyXG4iKTsKKworCWN0cmwgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjdHJsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLUVOT01FTTsKKwljdHJsLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0cmwpOworCWN0cmwtPmRiZ2ZzLmRiZ19sdmwgICAgICAgICA9IERFRkFVTFRfREJHX0xWTDsKKwljdHJsLT5kYmdmcy5mb3JjZV94ZmVyX21vZGUgPSBJMkNfTVNNX1hGRVJfTU9ERV9OT05FOworCW11dGV4X2luaXQoJmN0cmwtPnhmZXIubXR4KTsKKwljdHJsLT5wd3Jfc3RhdGUgPSBJMkNfTVNNX1BNX1JUX1NVU1BFTkRFRDsKKworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3I6IG51bGwgZGV2aWNlLXRyZWUgbm9kZSIpOworCQlyZXR1cm4gLUVCQURFOworCX0KKworCXJldCA9IGkyY19tc21fcnNyY3NfcHJvY2Vzc19kdChjdHJsLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZXJyb3IgaW4gcHJvY2VzcyBkZXZpY2UgdHJlZSBub2RlIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaTJjX21zbV9yc3Jjc19tZW1faW5pdChwZGV2LCBjdHJsKTsKKwlpZiAocmV0KQorCQlnb3RvIG1lbV9lcnI7CisKKwlyZXQgPSBpMmNfbXNtX3JzcmNzX2Nsa19pbml0KGN0cmwpOworCWlmIChyZXQpCisJCWdvdG8gY2xrX2VycjsKKworCS8qIHZvdGUgZm9yIGNsb2NrIHRvIGVuYWJsZSByZWFkaW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZmYgdGhlIEhXICovCisJaTJjX21zbV9jbGtfcGF0aF92b3RlKGN0cmwpOworCisJcmV0ID0gaTJjX21zbV9wbV9jbGtfcHJlcGFyZShjdHJsKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsa19lcnI7CisKKwlyZXQgPSBpMmNfbXNtX3BtX2Nsa19lbmFibGUoY3RybCk7CisJaWYgKHJldCkgeworCQlpMmNfbXNtX3BtX2Nsa191bnByZXBhcmUoY3RybCk7CisJCWdvdG8gY2xrX2VycjsKKwl9CisKKwkvKgorCSAqIHJlc2V0IHRoZSBjb3JlIGJlZm9yZSByZWdpc3RlcmluZyBmb3IgaW50ZXJydXB0cy4gVGhpcyBzb2x2ZXMgYW4KKwkgKiBpbnRlcnJ1cHQgc3Rvcm0gaXNzdWUgd2hlbiB0aGUgYm9vdGxvYWRlciBsZWF2ZXMgYSBwZW5kaW5nIGludGVycnVwdC4KKwkgKi8KKwlyZXQgPSBpMmNfbXNtX3F1cF9zd19yZXNldChjdHJsKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIGVycm9yIG9uIHF1cCBzb2Z0d2FyZSByZXNldFxuIik7CisKKwlpMmNfbXNtX3BtX2Nsa19kaXNhYmxlKGN0cmwpOworCWkyY19tc21fcG1fY2xrX3VucHJlcGFyZShjdHJsKTsKKwlpMmNfbXNtX2Nsa19wYXRoX3Vudm90ZShjdHJsKTsKKworCXJldCA9IGkyY19tc21fcnNyY3NfZ3Bpb19waW5jdHJsX2luaXQoY3RybCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbm9fcGluY3RybDsKKworCWkyY19tc21fcG1fcnRfaW5pdChjdHJsLT5kZXYpOworCisJcmV0ID0gaTJjX21zbV9yc3Jjc19pcnFfaW5pdChwZGV2LCBjdHJsKTsKKwlpZiAocmV0KQorCQlnb3RvIGlycV9lcnI7CisKKwlpMmNfbXNtX2RiZ2ZzX2luaXQoY3RybCk7CisKKwlyZXQgPSBpMmNfbXNtX2ZybXdya19yZWcocGRldiwgY3RybCk7CisJaWYgKHJldCkKKwkJZ290byByZWdfZXJyOworCisJaTJjX21zbV9kYmcoY3RybCwgTVNNX1BST0YsICJwcm9iZSgpIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3MiKTsKKwlyZXR1cm4gMDsKKworcmVnX2VycjoKKwlpMmNfbXNtX2RiZ2ZzX3RlYXJkb3duKGN0cmwpOworCWkyY19tc21fcnNyY3NfaXJxX3RlYXJkb3duKGN0cmwpOworaXJxX2VycjoKKwlpMnhfbXNtX2Jsa19mcmVlX2NhY2hlKGN0cmwpOworZXJyX25vX3BpbmN0cmw6CisJaTJjX21zbV9yc3Jjc19jbGtfdGVhcmRvd24oY3RybCk7CitjbGtfZXJyOgorCWkyY19tc21fcnNyY3NfbWVtX3RlYXJkb3duKGN0cmwpOworbWVtX2VycjoKKwlkZXZfZXJyKGN0cmwtPmRldiwgImVycm9yIHByb2JlKCkgZmFpbGVkIHdpdGggZXJyOiVkXG4iLCByZXQpOworCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgY3RybCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpMmNfbXNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIEdyYWIgbXV0ZXggdG8gZW5zdXJlIG9uZ29pbmcgdHJhbnNhY3Rpb24gaXMgb3ZlciAqLworCW11dGV4X2xvY2soJmN0cmwtPnhmZXIubXR4KTsKKwljdHJsLT5wd3Jfc3RhdGUgPSBJMkNfTVNNX1BNX1NZU19TVVNQRU5ERUQ7CisJcG1fcnVudGltZV9kaXNhYmxlKGN0cmwtPmRldik7CisJLyogbm8gb25lIGNhbiBjYWxsIGEgeGZlciBhZnRlciB0aGUgbmV4dCBsaW5lICovCisJaTJjX21zbV9mcm13cmtfdW5yZWcoY3RybCk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT54ZmVyLm10eCk7CisJbXV0ZXhfZGVzdHJveSgmY3RybC0+eGZlci5tdHgpOworCisJaTJjX21zbV9kbWFfdGVhcmRvd24oY3RybCk7CisJaTJjX21zbV9kYmdmc190ZWFyZG93bihjdHJsKTsKKwlpMmNfbXNtX3JzcmNzX2lycV90ZWFyZG93bihjdHJsKTsKKwlpMmNfbXNtX3JzcmNzX2Nsa190ZWFyZG93bihjdHJsKTsKKwlpMmNfbXNtX3JzcmNzX21lbV90ZWFyZG93bihjdHJsKTsKKwlpMnhfbXNtX2Jsa19mcmVlX2NhY2hlKGN0cmwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfbXNtX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLGkyYy1tc20tdjIiLAorCX0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGkyY19tc21fZHJpdmVyID0geworCS5wcm9iZSAgPSBpMmNfbXNtX3Byb2JlLAorCS5yZW1vdmUgPSBpMmNfbXNtX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICAgPSAiaTJjLW1zbS12MiIsCisJCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCQkucG0gICAgICAgICAgICAgPSAmaTJjX21zbV9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IGkyY19tc21fZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaTJjX21zbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaTJjX21zbV9kcml2ZXIpOworfQorYXJjaF9pbml0Y2FsbChpMmNfbXNtX2luaXQpOworCitzdGF0aWMgdm9pZCBpMmNfbXNtX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaTJjX21zbV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaTJjX21zbV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTppMmMtbXNtLXYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXFjb20tZ2VuaS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xY29tLWdlbmkuYwppbmRleCA5MWU3YjBjLi4yNDYwYmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXFjb20tZ2VuaS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcWNvbS1nZW5pLmMKQEAgLTE5MSwxMyArMTkxLDYgQEAKIAogc3RhdGljIHZvaWQgZ2VuaV9pMmNfZXJyKHN0cnVjdCBnZW5pX2kyY19kZXYgKmdpMmMsIGludCBlcnIpCiB7Ci0JdTMyIG1fY21kID0gcmVhZGxfcmVsYXhlZChnaTJjLT5iYXNlICsgU0VfR0VOSV9NX0NNRDApOwotCXUzMiBtX3N0YXQgPSByZWFkbF9yZWxheGVkKGdpMmMtPmJhc2UgKyBTRV9HRU5JX01fSVJRX1NUQVRVUyk7Ci0JdTMyIGdlbmlfcyA9IHJlYWRsX3JlbGF4ZWQoZ2kyYy0+YmFzZSArIFNFX0dFTklfU1RBVFVTKTsKLQl1MzIgZ2VuaV9pb3MgPSByZWFkbF9yZWxheGVkKGdpMmMtPmJhc2UgKyBTRV9HRU5JX0lPUyk7Ci0JdTMyIGRtYSA9IHJlYWRsX3JlbGF4ZWQoZ2kyYy0+YmFzZSArIFNFX0dFTklfRE1BX01PREVfRU4pOwotCXUzMiByeF9zdCwgdHhfc3Q7Ci0KIAlpZiAoZ2kyYy0+Y3VyKQogCQlHRU5JX1NFX0RCRyhnaTJjLT5pcGNsLCBmYWxzZSwgZ2kyYy0+ZGV2LAogCQkJICAgICJsZW46JWQsIHNsdi1hZGRyOjB4JXgsIFJEL1dSOiVkXG4iLCBnaTJjLT5jdXItPmxlbiwKQEAgLTIxMSwyMyArMjA0LDkgQEAKIAkJR0VOSV9TRV9FUlIoZ2kyYy0+aXBjbCwgdHJ1ZSwgZ2kyYy0+ZGV2LCAiJXNcbiIsCiAJCQkgICAgIGdpMmNfbG9nW2Vycl0ubXNnKTsKIAl9Ci0JaWYgKGdpMmMtPnNlX21vZGUgPT0gR1NJX09OTFkpCi0JCWdvdG8gZXJyX291dDsKLQotCWlmIChkbWEpIHsKLQkJcnhfc3QgPSByZWFkbF9yZWxheGVkKGdpMmMtPmJhc2UgKyBTRV9ETUFfUlhfSVJRX1NUQVQpOwotCQl0eF9zdCA9IHJlYWRsX3JlbGF4ZWQoZ2kyYy0+YmFzZSArIFNFX0RNQV9UWF9JUlFfU1RBVCk7Ci0JfSBlbHNlIHsKLQkJcnhfc3QgPSByZWFkbF9yZWxheGVkKGdpMmMtPmJhc2UgKyBTRV9HRU5JX1JYX0ZJRk9fU1RBVFVTKTsKLQkJdHhfc3QgPSByZWFkbF9yZWxheGVkKGdpMmMtPmJhc2UgKyBTRV9HRU5JX1RYX0ZJRk9fU1RBVFVTKTsKLQl9Ci0JR0VOSV9TRV9EQkcoZ2kyYy0+aXBjbCwgZmFsc2UsIGdpMmMtPmRldiwKLQkJICAgICAiRE1BOiVkIHR4X3N0YXQ6MHgleCwgcnhfc3RhdDoweCV4LCBpcnEtc3RhdDoweCV4XG4iLAotCQkgICAgIGRtYSwgdHhfc3QsIHJ4X3N0LCBtX3N0YXQpOwotZXJyX291dDoKLQlHRU5JX1NFX0RCRyhnaTJjLT5pcGNsLCBmYWxzZSwgZ2kyYy0+ZGV2LAotCQkJICAgICAibV9jbWQ6MHgleCwgZ2VuaV9zdGF0dXM6MHgleCwgZ2VuaV9pb3M6MHgleFxuIiwKLQkJCSAgICAgbV9jbWQsIGdlbmlfcywgZ2VuaV9pb3MpOworCUdFTklfU0VfREJHKGdpMmMtPmlwY2wsIGZhbHNlLCBnaTJjLT5kZXYsICIlczogc2UtbW9kZTolZFxuIiwgX19mdW5jX18sCisJCQkJCQkJZ2kyYy0+c2VfbW9kZSk7CisJZ2VuaV9zZV9kdW1wX2RiZ19yZWdzKCZnaTJjLT5pMmNfcnNjLCBnaTJjLT5iYXNlLCBnaTJjLT5pcGNsKTsKIGVycl9yZXQ6CiAJZ2kyYy0+ZXJyID0gZ2kyY19sb2dbZXJyXS5lcnI7CiB9CkBAIC00NjksOCArNDQ4LDggQEAKIAkJaW50IHN0cmV0Y2ggPSAoaSA8IChudW0gLSAxKSk7CiAJCWRtYV9jb29raWVfdCB0eF9jb29raWUsIHJ4X2Nvb2tpZTsKIAkJc3RydWN0IG1zbV9ncGlfdHJlICpnb190ID0gJmdpMmMtPmdvX3Q7Ci0JCXN0cnVjdCBkZXZpY2UgKnJ4X2RldiA9IGdpMmMtPnJ4X2MtPmRldmljZS0+ZGV2OwotCQlzdHJ1Y3QgZGV2aWNlICp0eF9kZXYgPSBnaTJjLT50eF9jLT5kZXZpY2UtPmRldjsKKwkJc3RydWN0IGRldmljZSAqcnhfZGV2ID0gZ2kyYy0+d3JhcHBlcl9kZXY7CisJCXN0cnVjdCBkZXZpY2UgKnR4X2RldiA9IGdpMmMtPndyYXBwZXJfZGV2OwogCiAJCWdpMmMtPmN1ciA9ICZtc2dzW2ldOwogCQlpZiAoIWdpMmMtPmNmZ19zZW50KSB7CkBAIC01MDEsOSArNDgwLDggQEAKIAogCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CiAJCQlzZ19pbml0X3RhYmxlKCZnaTJjLT5yeF9zZywgMSk7Ci0JCQlnaTJjLT5yeF9waCA9IGRtYV9tYXBfc2luZ2xlKHJ4X2RldiwgbXNnc1tpXS5idWYsCi0JCQkJCQkgICAgIG1zZ3NbaV0ubGVuLAotCQkJCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQkJZ2VuaV9zZV9pb21tdV9tYXBfYnVmKHJ4X2RldiwgJmdpMmMtPnJ4X3BoLCBtc2dzW2ldLmJ1ZiwKKwkJCQkJCW1zZ3NbaV0ubGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJZ2kyYy0+cnhfdC5kd29yZFswXSA9CiAJCQkJTVNNX0dQSV9ETUFfV19CVUZGRVJfVFJFX0RXT1JEMChnaTJjLT5yeF9waCk7CiAJCQlnaTJjLT5yeF90LmR3b3JkWzFdID0KQEAgLTUzMyw5ICs1MTEsOCBAQAogCQkJcnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChnaTJjLT5yeF9kZXNjKTsKIAkJCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGdpMmMtPnJ4X2MpOwogCQl9IGVsc2UgewotCQkJZ2kyYy0+dHhfcGggPSBkbWFfbWFwX3NpbmdsZSh0eF9kZXYsIG1zZ3NbaV0uYnVmLAotCQkJCQkJICAgICBtc2dzW2ldLmxlbiwKLQkJCQkJCSAgICAgRE1BX1RPX0RFVklDRSk7CisJCQlnZW5pX3NlX2lvbW11X21hcF9idWYodHhfZGV2LCAmZ2kyYy0+dHhfcGgsIG1zZ3NbaV0uYnVmLAorCQkJCQkJbXNnc1tpXS5sZW4sIERNQV9UT19ERVZJQ0UpOwogCQkJZ2kyYy0+dHhfdC5kd29yZFswXSA9CiAJCQkJTVNNX0dQSV9ETUFfV19CVUZGRVJfVFJFX0RXT1JEMChnaTJjLT50eF9waCk7CiAJCQlnaTJjLT50eF90LmR3b3JkWzFdID0KQEAgLTU2OCwxMSArNTQ1LDExIEBACiAKIAkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZ2kyYy0+eGZlciwgSFopOwogCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKQotCQkJZG1hX3VubWFwX3NpbmdsZShyeF9kZXYsIGdpMmMtPnJ4X3BoLCBtc2dzW2ldLmxlbiwKLQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQlnZW5pX3NlX2lvbW11X3VubWFwX2J1ZihyeF9kZXYsICZnaTJjLT5yeF9waCwKKwkJCQltc2dzW2ldLmxlbiwgRE1BX0ZST01fREVWSUNFKTsKIAkJZWxzZQotCQkJZG1hX3VubWFwX3NpbmdsZSh0eF9kZXYsIGdpMmMtPnR4X3BoLCBtc2dzW2ldLmxlbiwKLQkJCQkJIERNQV9UT19ERVZJQ0UpOworCQkJZ2VuaV9zZV9pb21tdV91bm1hcF9idWYodHhfZGV2LCAmZ2kyYy0+dHhfcGgsCisJCQkJbXNnc1tpXS5sZW4sIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmICghdGltZW91dCkgewogCQkJR0VOSV9TRV9FUlIoZ2kyYy0+aXBjbCwgdHJ1ZSwgZ2kyYy0+ZGV2LApAQCAtOTMzLDggKzkxMCwyMyBAQAogCiBzdGF0aWMgaW50IGdlbmlfaTJjX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewotCWlmICghcG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKGRldmljZSkpCisJc3RydWN0IGdlbmlfaTJjX2RldiAqZ2kyYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCWludCByZXQ7CisKKwkvKiBNYWtlIHN1cmUgbm8gdHJhbnNhY3Rpb25zIGFyZSBwZW5kaW5nICovCisJcmV0ID0gaTJjX3RyeWxvY2tfYnVzKCZnaTJjLT5hZGFwLCBJMkNfTE9DS19TRUdNRU5UKTsKKwlpZiAoIXJldCkgeworCQlHRU5JX1NFX0VSUihnaTJjLT5pcGNsLCB0cnVlLCBnaTJjLT5kZXYsCisJCQkJImxhdGUgSTJDIHRyYW5zYWN0aW9uIHJlcXVlc3RcbiIpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoIXBtX3J1bnRpbWVfc3RhdHVzX3N1c3BlbmRlZChkZXZpY2UpKSB7CisJCWdlbmlfaTJjX3J1bnRpbWVfc3VzcGVuZChkZXZpY2UpOworCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2aWNlKTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldmljZSk7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGRldmljZSk7CisJfQorCWkyY191bmxvY2tfYnVzKCZnaTJjLT5hZGFwLCBJMkNfTE9DS19TRUdNRU5UKTsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jIGIvZHJpdmVycy9paW8vYWNjZWwvYm1jMTUwLWFjY2VsLWNvcmUuYwppbmRleCA1OWIzODBkLi5jMzg4ODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMKQEAgLTE5Myw3ICsxOTMsNiBAQAogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlpbnQgaXJxOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0IGludGVycnVwdHNbQk1DMTUwX0FDQ0VMX0lOVEVSUlVQVFNdOwotCWF0b21pY190IGFjdGl2ZV9pbnRyOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfdHJpZ2dlciB0cmlnZ2Vyc1tCTUMxNTBfQUNDRUxfVFJJR0dFUlNdOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAl1OCBmaWZvX21vZGUsIHdhdGVybWFyazsKQEAgLTQ5MywxMSArNDkyLDYgQEAKIAkJZ290byBvdXRfZml4X3Bvd2VyX3N0YXRlOwogCX0KIAotCWlmIChzdGF0ZSkKLQkJYXRvbWljX2luYygmZGF0YS0+YWN0aXZlX2ludHIpOwotCWVsc2UKLQkJYXRvbWljX2RlYygmZGF0YS0+YWN0aXZlX2ludHIpOwotCiAJcmV0dXJuIDA7CiAKIG91dF9maXhfcG93ZXJfc3RhdGU6CkBAIC0xNzA5LDggKzE3MDMsNyBAQAogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7Ci0JaWYgKGF0b21pY19yZWFkKCZkYXRhLT5hY3RpdmVfaW50cikpCi0JCWJtYzE1MF9hY2NlbF9zZXRfbW9kZShkYXRhLCBCTUMxNTBfQUNDRUxfU0xFRVBfTU9ERV9OT1JNQUwsIDApOworCWJtYzE1MF9hY2NlbF9zZXRfbW9kZShkYXRhLCBCTUMxNTBfQUNDRUxfU0xFRVBfTU9ERV9OT1JNQUwsIDApOwogCWJtYzE1MF9hY2NlbF9maWZvX3NldF9tb2RlKGRhdGEpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvcWNvbS1ycmFkYy5jIGIvZHJpdmVycy9paW8vYWRjL3Fjb20tcnJhZGMuYwppbmRleCBiMDU1ZmY2Li4wMmRmYmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvcWNvbS1ycmFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9xY29tLXJyYWRjLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3FwbnAvcXBucC1yZXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogCiAjZGVmaW5lIEZHX0FEQ19SUl9FTl9DVEwJCQkweDQ2CiAjZGVmaW5lIEZHX0FEQ19SUl9TS0lOX1RFTVBfTFNCCQkJMHg1MApAQCAtMTgwLDYgKzE4MSw5IEBACiAjZGVmaW5lIEZHX0FEQ19SUl9WT0xUX0lOUFVUX0ZBQ1RPUgkJOAogI2RlZmluZSBGR19BRENfUlJfQ1VSUl9JTlBVVF9GQUNUT1IJCTIwMDAKICNkZWZpbmUgRkdfQURDX1JSX0NVUlJfVVNCSU5fSU5QVVRfRkFDVE9SX01JTAkxODg2CisjZGVmaW5lIEZHX0FEQ19SUl9DVVJSX1VTQklOXzY2MF9GQUNUT1JfTUlMCTkKKyNkZWZpbmUgRkdfQURDX1JSX0NVUlJfVVNCSU5fNjYwX1VWX1ZBTAk1Nzk1MDAKKwogI2RlZmluZSBGR19BRENfU0NBTEVfTUlMTElfRkFDVE9SCQkxMDAwCiAjZGVmaW5lIEZHX0FEQ19LRUxWSU5NSUxfQ0VMU0lVU01JTAkJMjczMTUwCiAKQEAgLTE4OSw5ICsxOTMsMTEgQEAKICNkZWZpbmUgRkdfUlJfQURDX1NUU19DSEFOTkVMX1JFQURJTkdfTUFTSwkweDMKICNkZWZpbmUgRkdfUlJfQURDX1NUU19DSEFOTkVMX1NUUwkJMHgyCiAKLSNkZWZpbmUgRkdfUlJfQ09OVl9DT05USU5VT1VTX1RJTUVfTUlOX1VTCTUwMDAwCi0jZGVmaW5lIEZHX1JSX0NPTlZfQ09OVElOVU9VU19USU1FX01BWF9VUwk1MTAwMAorI2RlZmluZSBGR19SUl9DT05WX0NPTlRJTlVPVVNfVElNRV9NSU5fTVMJNTAKICNkZWZpbmUgRkdfUlJfQ09OVl9NQVhfUkVUUllfQ05UCQk1MAorI2RlZmluZSBGR19SUl9UUF9SRVZfVkVSU0lPTjEJCTIxCisjZGVmaW5lIEZHX1JSX1RQX1JFVl9WRVJTSU9OMgkJMjkKKyNkZWZpbmUgRkdfUlJfVFBfUkVWX1ZFUlNJT04zCQkzMgogCiAvKgogICogVGhlIGNoYW5uZWwgbnVtYmVyIGlzIG5vdCBhIHBoeXNpY2FsIGluZGV4IGluIGhhcmR3YXJlLApAQCAtMjI4LDYgKzIzNCw4IEBACiAJc3RydWN0IHJyYWRjX2NoYW5fcHJvcAkJKmNoYW5fcHJvcHM7CiAJc3RydWN0IGRldmljZV9ub2RlCQkqcmV2aWRfZGV2X25vZGU7CiAJc3RydWN0IHBtaWNfcmV2aWRfZGF0YQkJKnBtaWNfZmFiX2lkOworCWludCB2b2x0OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSp1c2JfdHJpZzsKIH07CiAKIHN0cnVjdCBycmFkY19jaGFubmVscyB7CkBAIC0zNTMsNyArMzYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBycmFkY19wb3N0X3Byb2Nlc3NfY3VycihzdHJ1Y3QgcnJhZGNfY2hpcCAqY2hpcCwKK3N0YXRpYyBpbnQgcnJhZGNfcG9zdF9wcm9jZXNzX3VzYmluX2N1cnIoc3RydWN0IHJyYWRjX2NoaXAgKmNoaXAsCiAJCQlzdHJ1Y3QgcnJhZGNfY2hhbl9wcm9wICpwcm9wLCB1MTYgYWRjX2NvZGUsCiAJCQlpbnQgKnJlc3VsdF91YSkKIHsKQEAgLTM2MSwxMSArMzY5LDMzIEBACiAKIAlpZiAoIXByb3ApCiAJCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHByb3AtPmNoYW5uZWwgPT0gUlJfQURDX1VTQklOX0kpCi0JCXNjYWxlID0gRkdfQURDX1JSX0NVUlJfVVNCSU5fSU5QVVRfRkFDVE9SX01JTDsKLQllbHNlCi0JCXNjYWxlID0gRkdfQURDX1JSX0NVUlJfSU5QVVRfRkFDVE9SOworCWlmIChjaGlwLT5yZXZpZF9kZXZfbm9kZSkgeworCQlzd2l0Y2ggKGNoaXAtPnBtaWNfZmFiX2lkLT5wbWljX3N1YnR5cGUpIHsKKwkJY2FzZSBQTTY2MF9TVUJUWVBFOgorCQkJaWYgKCgoY2hpcC0+cG1pY19mYWJfaWQtPnRwX3JldgorCQkJCT49IEZHX1JSX1RQX1JFVl9WRVJTSU9OMSkKKwkJCSYmIChjaGlwLT5wbWljX2ZhYl9pZC0+dHBfcmV2CisJCQkJPD0gRkdfUlJfVFBfUkVWX1ZFUlNJT04yKSkKKwkJCXx8IChjaGlwLT5wbWljX2ZhYl9pZC0+dHBfcmV2CisJCQkJPj0gRkdfUlJfVFBfUkVWX1ZFUlNJT04zKSkgeworCQkJCWNoaXAtPnZvbHQgPSBkaXY2NF9zNjQoY2hpcC0+dm9sdCwgMTAwMCk7CisJCQkJY2hpcC0+dm9sdCA9IGNoaXAtPnZvbHQgKgorCQkJCQlGR19BRENfUlJfQ1VSUl9VU0JJTl82NjBfRkFDVE9SX01JTDsKKwkJCQljaGlwLT52b2x0ID0gRkdfQURDX1JSX0NVUlJfVVNCSU5fNjYwX1VWX1ZBTCAtCisJCQkJCShjaGlwLT52b2x0KTsKKwkJCQljaGlwLT52b2x0ID0gZGl2NjRfczY0KDEwMDAwMDAwMDAsIGNoaXAtPnZvbHQpOworCQkJCXNjYWxlID0gY2hpcC0+dm9sdDsKKwkJCX0gZWxzZQorCQkJCXNjYWxlID0gRkdfQURDX1JSX0NVUlJfVVNCSU5fSU5QVVRfRkFDVE9SX01JTDsKKwkJCWJyZWFrOworCQljYXNlIFBNSTg5OThfU1VCVFlQRToKKwkJCXNjYWxlID0gRkdfQURDX1JSX0NVUlJfVVNCSU5fSU5QVVRfRkFDVE9SX01JTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJObyBQTUlDIHN1YnR5cGUgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CiAKIAkvKiBzY2FsZSAqIFYvQTsgMi41ViBBREMgZnVsbCBzY2FsZSAqLwogCXVhID0gKChpbnQ2NF90KWFkY19jb2RlICogc2NhbGUpOwpAQCAtMzc2LDYgKzQwNiwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJyYWRjX3Bvc3RfcHJvY2Vzc19kY2luX2N1cnIoc3RydWN0IHJyYWRjX2NoaXAgKmNoaXAsCisJCQlzdHJ1Y3QgcnJhZGNfY2hhbl9wcm9wICpwcm9wLCB1MTYgYWRjX2NvZGUsCisJCQlpbnQgKnJlc3VsdF91YSkKK3sKKwlpbnQ2NF90IHVhID0gMDsKKworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiAwLjUgVi9BOyAyLjVWIEFEQyBmdWxsIHNjYWxlICovCisJdWEgPSAoKGludDY0X3QpYWRjX2NvZGUgKiBGR19BRENfUlJfQ1VSUl9JTlBVVF9GQUNUT1IpOworCXVhICo9IChGR19BRENfUlJfRlNfVk9MVEFHRV9NViAqIEZHX0FEQ19TQ0FMRV9NSUxMSV9GQUNUT1IpOworCXVhID0gZGl2NjRfczY0KHVhLCAoRkdfTUFYX0FEQ19SRUFESU5HUyAqIDEwMDApKTsKKwkqcmVzdWx0X3VhID0gdWE7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBycmFkY19wb3N0X3Byb2Nlc3NfZGllX3RlbXAoc3RydWN0IHJyYWRjX2NoaXAgKmNoaXAsCiAJCQlzdHJ1Y3QgcnJhZGNfY2hhbl9wcm9wICpwcm9wLCB1MTYgYWRjX2NvZGUsCiAJCQlpbnQgKnJlc3VsdF9taWxsaWRlZ2MpCkBAIC01OTEsMTMgKzYzOSwxMyBAQAogCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BST0NFU1NFRCksCiAJCQlGR19BRENfUlJfU0tJTl9URU1QX0xTQiwgRkdfQURDX1JSX1NLSU5fVEVNUF9NU0IsCiAJCQlGR19BRENfUlJfQVVYX1RIRVJNX1NUUykKLQlSUl9BRENfQ0hBTl9DVVJSRU5UKCJ1c2Jpbl9pIiwgJnJyYWRjX3Bvc3RfcHJvY2Vzc19jdXJyLAorCVJSX0FEQ19DSEFOX0NVUlJFTlQoInVzYmluX2kiLCAmcnJhZGNfcG9zdF9wcm9jZXNzX3VzYmluX2N1cnIsCiAJCQlGR19BRENfUlJfVVNCX0lOX0lfTFNCLCBGR19BRENfUlJfVVNCX0lOX0lfTVNCLAogCQkJRkdfQURDX1JSX1VTQl9JTl9JX1NUUykKIAlSUl9BRENfQ0hBTl9WT0xUKCJ1c2Jpbl92IiwgJnJyYWRjX3Bvc3RfcHJvY2Vzc192b2x0LAogCQkJRkdfQURDX1JSX1VTQl9JTl9WX0xTQiwgRkdfQURDX1JSX1VTQl9JTl9WX01TQiwKIAkJCUZHX0FEQ19SUl9VU0JfSU5fVl9TVFMpCi0JUlJfQURDX0NIQU5fQ1VSUkVOVCgiZGNpbl9pIiwgJnJyYWRjX3Bvc3RfcHJvY2Vzc19jdXJyLAorCVJSX0FEQ19DSEFOX0NVUlJFTlQoImRjaW5faSIsICZycmFkY19wb3N0X3Byb2Nlc3NfZGNpbl9jdXJyLAogCQkJRkdfQURDX1JSX0RDX0lOX0lfTFNCLCBGR19BRENfUlJfRENfSU5fSV9NU0IsCiAJCQlGR19BRENfUlJfRENfSU5fSV9TVFMpCiAJUlJfQURDX0NIQU5fVk9MVCgiZGNpbl92IiwgJnJyYWRjX3Bvc3RfcHJvY2Vzc192b2x0LApAQCAtNjc5LDYgKzcyNywyNCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGJvb2wgcnJhZGNfaXNfdXNiX3ByZXNlbnQoc3RydWN0IHJyYWRjX2NoaXAgKmNoaXApCit7CisJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgcHZhbDsKKwlpbnQgcmM7CisJYm9vbCB1c2JfcHJlc2VudCA9IGZhbHNlOworCisJaWYgKCFjaGlwLT51c2JfdHJpZykgeworCQlwcl9kZWJ1ZygiVVNCIHByb3BlcnR5IG5vdCBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIHVzYl9wcmVzZW50OworCX0KKworCXJjID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShjaGlwLT51c2JfdHJpZywKKwkJCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsICZwdmFsKTsKKwl1c2JfcHJlc2VudCA9IChyYyA8IDApID8gMCA6IHB2YWwuaW50dmFsOworCisJcmV0dXJuIHVzYl9wcmVzZW50OworfQorCiBzdGF0aWMgaW50IHJyYWRjX2NoZWNrX3N0YXR1c19yZWFkeV93aXRoX3JldHJ5KHN0cnVjdCBycmFkY19jaGlwICpjaGlwLAogCQlzdHJ1Y3QgcnJhZGNfY2hhbl9wcm9wICpwcm9wLCB1OCAqYnVmLCB1MTYgc3RhdHVzKQogewpAQCAtNjk4LDggKzc2NCwxOCBAQAogCQkJKHJldHJ5X2NudCA8IEZHX1JSX0NPTlZfTUFYX1JFVFJZX0NOVCkpIHsKIAkJcHJfZGVidWcoIiVzIGlzIG5vdCByZWFkeTsgbm90aGluZyB0byByZWFkOjB4JXhcbiIsCiAJCQlycmFkY19jaGFuc1twcm9wLT5jaGFubmVsXS5kYXRhc2hlZXRfbmFtZSwgYnVmWzBdKTsKLQkJdXNsZWVwX3JhbmdlKEZHX1JSX0NPTlZfQ09OVElOVU9VU19USU1FX01JTl9VUywKLQkJCQlGR19SUl9DT05WX0NPTlRJTlVPVVNfVElNRV9NQVhfVVMpOworCisJCWlmICgoKHByb3AtPmNoYW5uZWwgPT0gUlJfQURDX0NIR19URU1QKSB8fAorCQkJKHByb3AtPmNoYW5uZWwgPT0gUlJfQURDX1NLSU5fVEVNUCkgfHwKKwkJCShwcm9wLT5jaGFubmVsID09IFJSX0FEQ19VU0JJTl9JKSB8fAorCQkJKHByb3AtPmNoYW5uZWwgPT0gUlJfQURDX0RJRV9URU1QKSkgJiYKKwkJCQkJKCghcnJhZGNfaXNfdXNiX3ByZXNlbnQoY2hpcCkpKSkgeworCQkJcHJfZGVidWcoIlVTQiBub3QgcHJlc2VudCBmb3IgJWRcbiIsIHByb3AtPmNoYW5uZWwpOworCQkJcmMgPSAtRU5PREFUQTsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNsZWVwKEZHX1JSX0NPTlZfQ09OVElOVU9VU19USU1FX01JTl9NUyk7CiAJCXJldHJ5X2NudCsrOwogCQlyYyA9IHJyYWRjX3JlYWQoY2hpcCwgc3RhdHVzLCBidWYsIDEpOwogCQlpZiAocmMgPCAwKSB7CkBAIC03MTcsNyArNzkzLDcgQEAKIHN0YXRpYyBpbnQgcnJhZGNfcmVhZF9jaGFubmVsX3dpdGhfY29udGludW91c19tb2RlKHN0cnVjdCBycmFkY19jaGlwICpjaGlwLAogCQkJc3RydWN0IHJyYWRjX2NoYW5fcHJvcCAqcHJvcCwgdTggKmJ1ZikKIHsKLQlpbnQgcmMgPSAwOworCWludCByYyA9IDAsIHJldCA9IDA7CiAJdTE2IHN0YXR1cyA9IDA7CiAKIAlyYyA9IHJyYWRjX2VuYWJsZV9jb250aW51b3VzX21vZGUoY2hpcCk7CkBAIC03MzAsMjMgKzgwNiwyNSBAQAogCXJjID0gcnJhZGNfcmVhZChjaGlwLCBzdGF0dXMsIGJ1ZiwgMSk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoInN0YXR1cyByZWFkIGZhaWxlZDolZFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7CisJCXJldCA9IHJjOworCQlnb3RvIGRpc2FibGU7CiAJfQogCiAJcmMgPSBycmFkY19jaGVja19zdGF0dXNfcmVhZHlfd2l0aF9yZXRyeShjaGlwLCBwcm9wLAogCQkJCQkJYnVmLCBzdGF0dXMpOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJTdGF0dXMgcmVhZCBmYWlsZWQ6JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlyZXQgPSByYzsKIAl9CiAKK2Rpc2FibGU6CiAJcmMgPSBycmFkY19kaXNhYmxlX2NvbnRpbnVvdXNfbW9kZShjaGlwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHN3aXRjaCB0byBub24gY29udGludW91cyBtb2RlXG4iKTsKLQkJcmV0dXJuIHJjOworCQlyZXQgPSByYzsKIAl9CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBycmFkY19lbmFibGVfYmF0dF9pZF9jaGFubmVsKHN0cnVjdCBycmFkY19jaGlwICpjaGlwLCBib29sIGVuYWJsZSkKQEAgLTk1NSw2ICsxMDMzLDIxIEBACiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fUFJPQ0VTU0VEOgorCQlpZiAoKChjaGlwLT5wbWljX2ZhYl9pZC0+dHBfcmV2CisJCQkJPj0gRkdfUlJfVFBfUkVWX1ZFUlNJT04xKQorCQkmJiAoY2hpcC0+cG1pY19mYWJfaWQtPnRwX3JldgorCQkJCTw9IEZHX1JSX1RQX1JFVl9WRVJTSU9OMikpCisJCXx8IChjaGlwLT5wbWljX2ZhYl9pZC0+dHBfcmV2CisJCQkJPj0gRkdfUlJfVFBfUkVWX1ZFUlNJT04zKSkgeworCQkJaWYgKGNoYW4tPmFkZHJlc3MgPT0gUlJfQURDX1VTQklOX0kpIHsKKwkJCQlwcm9wID0gJmNoaXAtPmNoYW5fcHJvcHNbUlJfQURDX1VTQklOX1ZdOworCQkJCXJjID0gcnJhZGNfZG9fY29udmVyc2lvbihjaGlwLCBwcm9wLCAmYWRjX2NvZGUpOworCQkJCWlmIChyYykKKwkJCQkJYnJlYWs7CisJCQkJcHJvcC0+c2NhbGUoY2hpcCwgcHJvcCwgYWRjX2NvZGUsICZjaGlwLT52b2x0KTsKKwkJCX0KKwkJfQorCiAJCXByb3AgPSAmY2hpcC0+Y2hhbl9wcm9wc1tjaGFuLT5hZGRyZXNzXTsKIAkJcmMgPSBycmFkY19kb19jb252ZXJzaW9uKGNoaXAsIHByb3AsICZhZGNfY29kZSk7CiAJCWlmIChyYykKQEAgLTEwOTAsNiArMTE4MywxMCBAQAogCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGlwLT5paW9fY2hhbnM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBjaGlwLT5uY2hhbm5lbHM7CiAKKwljaGlwLT51c2JfdHJpZyA9IHBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZSgidXNiIik7CisJaWYgKCFjaGlwLT51c2JfdHJpZykKKwkJcHJfZGVidWcoIkVycm9yIG9idGFpbmluZyB1c2IgcG93ZXIgc3VwcGx5XG4iKTsKKwogCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkczEwMTUuYwppbmRleCBjZGU2ZjEzLi40NzI2NDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHMxMDE1LmMKQEAgLTgwLDE4ICs4MCwxMiBAQAogCTgsIDE2LCAzMiwgNjQsIDEyOCwgMjUwLCA0NzUsIDg2MAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JaW50IHNjYWxlOwotCWludCB1c2NhbGU7Ci19IGFkczEwMTVfc2NhbGVbXSA9IHsKLQl7MywgMH0sCi0JezIsIDB9LAotCXsxLCAwfSwKLQl7MCwgNTAwMDAwfSwKLQl7MCwgMjUwMDAwfSwKLQl7MCwgMTI1MDAwfSwKLQl7MCwgMTI1MDAwfSwKLQl7MCwgMTI1MDAwfSwKKy8qCisgKiBUcmFuc2xhdGlvbiBmcm9tIFBHQSBiaXRzIHRvIGZ1bGwtc2NhbGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGlucHV0IHZvbHRhZ2UKKyAqIHJhbmdlIGluIG1WCisgKi8KK3N0YXRpYyBpbnQgYWRzMTAxNV9mdWxsc2NhbGVfcmFuZ2VbXSA9IHsKKwk2MTQ0LCA0MDk2LCAyMDQ4LCAxMDI0LCA1MTIsIDI1NiwgMjU2LCAyNTYKIH07CiAKICNkZWZpbmUgQURTMTAxNV9WX0NIQU4oX2NoYW4sIF9hZGRyKSB7CQkJCVwKQEAgLTE4Miw2ICsxNzYsMTIgQEAKIAlzdHJ1Y3QgYWRzMTAxNV9jaGFubmVsX2RhdGEgY2hhbm5lbF9kYXRhW0FEUzEwMTVfQ0hBTk5FTFNdOwogCiAJdW5zaWduZWQgaW50ICpkYXRhX3JhdGU7CisJLyoKKwkgKiBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBBREMgaXMgc3dpdGNoZWQgdG8gdGhlIGNvbnRpbnVvdXMtY29udmVyc2lvbgorCSAqIG1vZGUgYW5kIGV4aXRzIGZyb20gYSBwb3dlci1kb3duIHN0YXRlLiAgVGhpcyBmbGFnIGlzIHVzZWQgdG8gYXZvaWQKKwkgKiBnZXR0aW5nIHRoZSBzdGFsZSByZXN1bHQgZnJvbSB0aGUgY29udmVyc2lvbiByZWdpc3Rlci4KKwkgKi8KKwlib29sIGNvbnZfaW52YWxpZDsKIH07CiAKIHN0YXRpYyBib29sIGFkczEwMTVfaXNfd3JpdGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCkBAIC0yMzQsMzMgKzIzNCw0MyBAQAogCQlyZXQgPSBwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiBzdGF0aWMKIGludCBhZHMxMDE1X2dldF9hZGNfcmVzdWx0KHN0cnVjdCBhZHMxMDE1X2RhdGEgKmRhdGEsIGludCBjaGFuLCBpbnQgKnZhbCkKIHsKIAlpbnQgcmV0LCBwZ2EsIGRyLCBjb252X3RpbWU7Ci0JYm9vbCBjaGFuZ2U7CisJdW5zaWduZWQgaW50IG9sZCwgbWFzaywgY2ZnOwogCiAJaWYgKGNoYW4gPCAwIHx8IGNoYW4gPj0gQURTMTAxNV9DSEFOTkVMUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwZ2EgPSBkYXRhLT5jaGFubmVsX2RhdGFbY2hhbl0ucGdhOwotCWRyID0gZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW5dLmRhdGFfcmF0ZTsKLQotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0c19jaGVjayhkYXRhLT5yZWdtYXAsIEFEUzEwMTVfQ0ZHX1JFRywKLQkJCQkgICAgICAgQURTMTAxNV9DRkdfTVVYX01BU0sgfAotCQkJCSAgICAgICBBRFMxMDE1X0NGR19QR0FfTUFTSywKLQkJCQkgICAgICAgY2hhbiA8PCBBRFMxMDE1X0NGR19NVVhfU0hJRlQgfAotCQkJCSAgICAgICBwZ2EgPDwgQURTMTAxNV9DRkdfUEdBX1NISUZULAotCQkJCSAgICAgICAmY2hhbmdlKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSByZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIEFEUzEwMTVfQ0ZHX1JFRywgJm9sZCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChjaGFuZ2UpIHsKLQkJY29udl90aW1lID0gRElWX1JPVU5EX1VQKFVTRUNfUEVSX1NFQywgZGF0YS0+ZGF0YV9yYXRlW2RyXSk7CisJcGdhID0gZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW5dLnBnYTsKKwlkciA9IGRhdGEtPmNoYW5uZWxfZGF0YVtjaGFuXS5kYXRhX3JhdGU7CisJbWFzayA9IEFEUzEwMTVfQ0ZHX01VWF9NQVNLIHwgQURTMTAxNV9DRkdfUEdBX01BU0sgfAorCQlBRFMxMDE1X0NGR19EUl9NQVNLOworCWNmZyA9IGNoYW4gPDwgQURTMTAxNV9DRkdfTVVYX1NISUZUIHwgcGdhIDw8IEFEUzEwMTVfQ0ZHX1BHQV9TSElGVCB8CisJCWRyIDw8IEFEUzEwMTVfQ0ZHX0RSX1NISUZUOworCisJY2ZnID0gKG9sZCAmIH5tYXNrKSB8IChjZmcgJiBtYXNrKTsKKworCXJldCA9IHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIEFEUzEwMTVfQ0ZHX1JFRywgY2ZnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG9sZCAhPSBjZmcgfHwgZGF0YS0+Y29udl9pbnZhbGlkKSB7CisJCWludCBkcl9vbGQgPSAob2xkICYgQURTMTAxNV9DRkdfRFJfTUFTSykgPj4KKwkJCQlBRFMxMDE1X0NGR19EUl9TSElGVDsKKworCQljb252X3RpbWUgPSBESVZfUk9VTkRfVVAoVVNFQ19QRVJfU0VDLCBkYXRhLT5kYXRhX3JhdGVbZHJfb2xkXSk7CisJCWNvbnZfdGltZSArPSBESVZfUk9VTkRfVVAoVVNFQ19QRVJfU0VDLCBkYXRhLT5kYXRhX3JhdGVbZHJdKTsKIAkJdXNsZWVwX3JhbmdlKGNvbnZfdGltZSwgY29udl90aW1lICsgMSk7CisJCWRhdGEtPmNvbnZfaW52YWxpZCA9IGZhbHNlOwogCX0KIAogCXJldHVybiByZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIEFEUzEwMTVfQ09OVl9SRUcsIHZhbCk7CkBAIC0yOTcsMTcgKzMwNywyMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBhZHMxMDE1X3NldF9zY2FsZShzdHJ1Y3QgYWRzMTAxNV9kYXRhICpkYXRhLCBpbnQgY2hhbiwKK3N0YXRpYyBpbnQgYWRzMTAxNV9zZXRfc2NhbGUoc3RydWN0IGFkczEwMTVfZGF0YSAqZGF0YSwKKwkJCSAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkgICAgIGludCBzY2FsZSwgaW50IHVzY2FsZSkKIHsKIAlpbnQgaSwgcmV0LCByaW5kZXggPSAtMTsKKwlpbnQgZnVsbHNjYWxlID0gZGl2X3M2NCgoc2NhbGUgKiAxMDAwMDAwTEwgKyB1c2NhbGUpIDw8CisJCQkJKGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyAtIDEpLCAxMDAwMDAwKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkczEwMTVfc2NhbGUpOyBpKyspCi0JCWlmIChhZHMxMDE1X3NjYWxlW2ldLnNjYWxlID09IHNjYWxlICYmCi0JCSAgICBhZHMxMDE1X3NjYWxlW2ldLnVzY2FsZSA9PSB1c2NhbGUpIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZHMxMDE1X2Z1bGxzY2FsZV9yYW5nZSk7IGkrKykgeworCQlpZiAoYWRzMTAxNV9mdWxsc2NhbGVfcmFuZ2VbaV0gPT0gZnVsbHNjYWxlKSB7CiAJCQlyaW5kZXggPSBpOwogCQkJYnJlYWs7CiAJCX0KKwl9CiAJaWYgKHJpbmRleCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zMTcsMzIgKzMzMCwyMyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW5dLnBnYSA9IHJpbmRleDsKKwlkYXRhLT5jaGFubmVsX2RhdGFbY2hhbi0+YWRkcmVzc10ucGdhID0gcmluZGV4OwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWRzMTAxNV9zZXRfZGF0YV9yYXRlKHN0cnVjdCBhZHMxMDE1X2RhdGEgKmRhdGEsIGludCBjaGFuLCBpbnQgcmF0ZSkKIHsKLQlpbnQgaSwgcmV0LCByaW5kZXggPSAtMTsKKwlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkczEwMTVfZGF0YV9yYXRlKTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkczEwMTVfZGF0YV9yYXRlKTsgaSsrKSB7CiAJCWlmIChkYXRhLT5kYXRhX3JhdGVbaV0gPT0gcmF0ZSkgewotCQkJcmluZGV4ID0gaTsKLQkJCWJyZWFrOworCQkJZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW5dLmRhdGFfcmF0ZSA9IGk7CisJCQlyZXR1cm4gMDsKIAkJfQotCWlmIChyaW5kZXggPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBBRFMxMDE1X0NGR19SRUcsCi0JCQkJIEFEUzEwMTVfQ0ZHX0RSX01BU0ssCi0JCQkJIHJpbmRleCA8PCBBRFMxMDE1X0NGR19EUl9TSElGVCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhLT5jaGFubmVsX2RhdGFbY2hhbl0uZGF0YV9yYXRlID0gcmluZGV4OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgYWRzMTAxNV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LApAQCAtMzg0LDkgKzM4OCw5IEBACiAJfQogCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKIAkJaWR4ID0gZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW4tPmFkZHJlc3NdLnBnYTsKLQkJKnZhbCA9IGFkczEwMTVfc2NhbGVbaWR4XS5zY2FsZTsKLQkJKnZhbDIgPSBhZHMxMDE1X3NjYWxlW2lkeF0udXNjYWxlOwotCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQkqdmFsID0gYWRzMTAxNV9mdWxsc2NhbGVfcmFuZ2VbaWR4XTsKKwkJKnZhbDIgPSBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMgLSAxOworCQlyZXQgPSBJSU9fVkFMX0ZSQUNUSU9OQUxfTE9HMjsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKIAkJaWR4ID0gZGF0YS0+Y2hhbm5lbF9kYXRhW2NoYW4tPmFkZHJlc3NdLmRhdGFfcmF0ZTsKQEAgLTQxMyw3ICs0MTcsNyBAQAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKLQkJcmV0ID0gYWRzMTAxNV9zZXRfc2NhbGUoZGF0YSwgY2hhbi0+YWRkcmVzcywgdmFsLCB2YWwyKTsKKwkJcmV0ID0gYWRzMTAxNV9zZXRfc2NhbGUoZGF0YSwgY2hhbiwgdmFsLCB2YWwyKTsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKIAkJcmV0ID0gYWRzMTAxNV9zZXRfZGF0YV9yYXRlKGRhdGEsIGNoYW4tPmFkZHJlc3MsIHZhbCk7CkBAIC00NDUsNyArNDQ5LDEwIEBACiAJLnZhbGlkYXRlX3NjYW5fbWFzayA9ICZpaW9fdmFsaWRhdGVfc2Nhbl9tYXNrX29uZWhvdCwKIH07CiAKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUihzY2FsZV9hdmFpbGFibGUsICIzIDIgMSAwLjUgMC4yNSAwLjEyNSIpOworc3RhdGljIElJT19DT05TVF9BVFRSX05BTUVEKGFkczEwMTVfc2NhbGVfYXZhaWxhYmxlLCBzY2FsZV9hdmFpbGFibGUsCisJIjMgMiAxIDAuNSAwLjI1IDAuMTI1Iik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfTkFNRUQoYWRzMTExNV9zY2FsZV9hdmFpbGFibGUsIHNjYWxlX2F2YWlsYWJsZSwKKwkiMC4xODc1IDAuMTI1IDAuMDYyNSAwLjAzMTI1IDAuMDE1NjI1IDAuMDA3ODEzIik7CiAKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUl9OQU1FRChhZHMxMDE1X3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUsCiAJc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZSwgIjEyOCAyNTAgNDkwIDkyMCAxNjAwIDI0MDAgMzMwMCIpOwpAQCAtNDUzLDcgKzQ2MCw3IEBACiAJc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZSwgIjggMTYgMzIgNjQgMTI4IDI1MCA0NzUgODYwIik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHMxMDE1X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2NvbnN0X2F0dHJfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2FkczEwMTVfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX2FkczEwMTVfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwsCiB9OwpAQCAtNDYzLDcgKzQ3MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRzMTExNV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19jb25zdF9hdHRyX3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9hZHMxMTE1X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl9hZHMxMTE1X3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKQEAgLTYyNCw2ICs2MzEsMTUgQEAKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gdHJpZ2dlcmVkIGJ1ZmZlciBzZXR1cCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEFEUzEwMTVfQ0ZHX1JFRywKKwkJCQlBRFMxMDE1X0NGR19NT0RfTUFTSywKKwkJCQlBRFMxMDE1X0NPTlRJTlVPVVMgPDwgQURTMTAxNV9DRkdfTU9EX1NISUZUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZGF0YS0+Y29udl9pbnZhbGlkID0gdHJ1ZTsKKwogCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmY2xpZW50LT5kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2J1ZmZlcl9jbGVhbnVwOwpAQCAtNjc5LDEwICs2OTUsMTUgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CiAJc3RydWN0IGFkczEwMTVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKIAotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBBRFMxMDE1X0NGR19SRUcsCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRhdGEtPnJlZ21hcCwgQURTMTAxNV9DRkdfUkVHLAogCQkJCSAgQURTMTAxNV9DRkdfTU9EX01BU0ssCiAJCQkJICBBRFMxMDE1X0NPTlRJTlVPVVMgPDwgQURTMTAxNV9DRkdfTU9EX1NISUZUKTsKKwlpZiAoIXJldCkKKwkJZGF0YS0+Y29udl9pbnZhbGlkID0gdHJ1ZTsKKworCXJldHVybiByZXQ7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCmluZGV4IDIyOGEwMDMuLmQxYmRlNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMKQEAgLTc3LDcgKzc3LDcgQEAKICNkZWZpbmUgVkY2MTBfQURDX0FEU1RTX01BU0sJCTB4MzAwCiAjZGVmaW5lIFZGNjEwX0FEQ19BRExQQ19FTgkJMHg4MAogI2RlZmluZSBWRjYxMF9BRENfQURIU0NfRU4JCTB4NDAwCi0jZGVmaW5lIFZGNjEwX0FEQ19SRUZTRUxfVkFMVAkJMHgxMDAKKyNkZWZpbmUgVkY2MTBfQURDX1JFRlNFTF9WQUxUCQkweDgwMAogI2RlZmluZSBWRjYxMF9BRENfUkVGU0VMX1ZCRwkJMHgxMDAwCiAjZGVmaW5lIFZGNjEwX0FEQ19BRFRSR19IQVJECQkweDIwMDAKICNkZWZpbmUgVkY2MTBfQURDX0FWR1NfOAkJMHg0MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMKaW5kZXggNjA4MjkzNC4uYjYwZTVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLXRyaWdnZXIuYwpAQCAtMzYsOCArMzYsNiBAQAogCXMzMiBwb2xsX3ZhbHVlID0gMDsKIAogCWlmIChzdGF0ZSkgewotCQlpZiAoIWF0b21pY19yZWFkKCZzdC0+dXNlcl9yZXF1ZXN0ZWRfc3RhdGUpKQotCQkJcmV0dXJuIDA7CiAJCWlmIChzZW5zb3JfaHViX2RldmljZV9vcGVuKHN0LT5oc2RldikpCiAJCQlyZXR1cm4gLUVJTzsKIApAQCAtODYsNiArODQsOSBAQAogCQkJCSAgICAgICAmcmVwb3J0X3ZhbCk7CiAJfQogCisJcHJfZGVidWcoIkhJRF9TRU5TT1IgJXMgc2V0IHBvd2VyX3N0YXRlICVkIHJlcG9ydF9zdGF0ZSAlZFxuIiwKKwkJIHN0LT5wZGV2LT5uYW1lLCBzdGF0ZV92YWwsIHJlcG9ydF92YWwpOworCiAJc2Vuc29yX2h1Yl9nZXRfZmVhdHVyZShzdC0+aHNkZXYsIHN0LT5wb3dlcl9zdGF0ZS5yZXBvcnRfaWQsCiAJCQkgICAgICAgc3QtPnBvd2VyX3N0YXRlLmluZGV4LAogCQkJICAgICAgIHNpemVvZihzdGF0ZV92YWwpLCAmc3RhdGVfdmFsKTsKQEAgLTEwNyw2ICsxMDgsNyBAQAogCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZzdC0+cGRldi0+ZGV2KTsKIAllbHNlIHsKIAkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmc3QtPnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKCZzdC0+cGRldi0+ZGV2KTsKIAkJcmV0ID0gcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJnN0LT5wZGV2LT5kZXYpOwogCX0KIAlpZiAocmV0IDwgMCkgewpAQCAtMjAxLDggKzIwMyw2IEBACiAJLyogRGVmYXVsdCB0byAzIHNlY29uZHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCBmcm9tIHN5c2ZzICovCiAJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJmF0dHJiLT5wZGV2LT5kZXYsCiAJCQkJCSAzMDAwKTsKLQlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmYXR0cmItPnBkZXYtPmRldik7Ci0KIAlyZXR1cm4gcmV0OwogZXJyb3JfdW5yZWdfdHJpZ2dlcjoKIAlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L2FkaXMxNjQ4MC5jIGIvZHJpdmVycy9paW8vaW11L2FkaXMxNjQ4MC5jCmluZGV4IDhjZjg0ZDMuLjEyODk4NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9hZGlzMTY0ODAuYworKysgYi9kcml2ZXJzL2lpby9pbXUvYWRpczE2NDgwLmMKQEAgLTY5Niw3ICs2OTYsNyBAQAogCQkuZ3lyb19tYXhfdmFsID0gSUlPX1JBRF9UT19ERUdSRUUoMjI1MDApLAogCQkuZ3lyb19tYXhfc2NhbGUgPSA0NTAsCiAJCS5hY2NlbF9tYXhfdmFsID0gSUlPX01fU18yX1RPX0coMTI1MDApLAotCQkuYWNjZWxfbWF4X3NjYWxlID0gNSwKKwkJLmFjY2VsX21heF9zY2FsZSA9IDEwLAogCX0sCiAJW0FESVMxNjQ4NV0gPSB7CiAJCS5jaGFubmVscyA9IGFkaXMxNjQ4NV9jaGFubmVscywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L3RzbDI1NjMuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3RzbDI1NjMuYwppbmRleCAwNDU5OGFlLi5mMGQzZjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC90c2wyNTYzLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvdHNsMjU2My5jCkBAIC02MjYsNyArNjI2LDcgQEAKIAlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwogCiAJaWlvX3B1c2hfZXZlbnQoZGV2X2luZm8sCi0JCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fTElHSFQsCisJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fSU5URU5TSVRZLAogCQkJCQkgICAgMCwKIAkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJICAgIElJT19FVl9ESVJfRUlUSEVSKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwppbmRleCAwMWUzYTM3Li5kMTE4ZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfY21kLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC0yMzQyLDggKzIzNDIsOSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChjbWQucG9ydF9udW0gPCByZG1hX3N0YXJ0X3BvcnQoaWJfZGV2KSB8fAotCSAgICBjbWQucG9ydF9udW0gPiByZG1hX2VuZF9wb3J0KGliX2RldikpCisJaWYgKChjbWQuYXR0cl9tYXNrICYgSUJfUVBfUE9SVCkgJiYKKwkgICAgKGNtZC5wb3J0X251bSA8IHJkbWFfc3RhcnRfcG9ydChpYl9kZXYpIHx8CisJICAgICBjbWQucG9ydF9udW0gPiByZG1hX2VuZF9wb3J0KGliX2RldikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLCBOVUxMLCBpbl9sZW4gLSBzaXplb2YgY21kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwppbmRleCBmMTUxMGNjLi45Mzk4MTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYwpAQCAtMTgwNCwyMCArMTgwNCwyMSBAQAogCXNrYl90cmltKHNrYiwgZGxlbik7CiAJbXV0ZXhfbG9jaygmZXAtPmNvbS5tdXRleCk7CiAKLQkvKiB1cGRhdGUgUlggY3JlZGl0cyAqLwotCXVwZGF0ZV9yeF9jcmVkaXRzKGVwLCBkbGVuKTsKLQogCXN3aXRjaCAoZXAtPmNvbS5zdGF0ZSkgewogCWNhc2UgTVBBX1JFUV9TRU5UOgorCQl1cGRhdGVfcnhfY3JlZGl0cyhlcCwgZGxlbik7CiAJCWVwLT5yY3Zfc2VxICs9IGRsZW47CiAJCWRpc2Nvbm5lY3QgPSBwcm9jZXNzX21wYV9yZXBseShlcCwgc2tiKTsKIAkJYnJlYWs7CiAJY2FzZSBNUEFfUkVRX1dBSVQ6CisJCXVwZGF0ZV9yeF9jcmVkaXRzKGVwLCBkbGVuKTsKIAkJZXAtPnJjdl9zZXEgKz0gZGxlbjsKIAkJZGlzY29ubmVjdCA9IHByb2Nlc3NfbXBhX3JlcXVlc3QoZXAsIHNrYik7CiAJCWJyZWFrOwogCWNhc2UgRlBEVV9NT0RFOiB7CiAJCXN0cnVjdCBjNGl3X3FwX2F0dHJpYnV0ZXMgYXR0cnM7CisKKwkJdXBkYXRlX3J4X2NyZWRpdHMoZXAsIGRsZW4pOwogCQlCVUdfT04oIWVwLT5jb20ucXApOwogCQlpZiAoc3RhdHVzKQogCQkJcHJfZXJyKCIlcyBVbmV4cGVjdGVkIHN0cmVhbWluZyBkYXRhLiIgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCmluZGV4IGYyYTg4NWUuLjgwNTliN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKQEAgLTE2ODAsOSArMTY4MCwxOSBAQAogCQlzaXplICs9IHJldDsKIAl9CiAKKwlpZiAobWx4NF9pc19tYXN0ZXIobWRldi0+ZGV2KSAmJiBmbG93X3R5cGUgPT0gTUxYNF9GU19SRUdVTEFSICYmCisJICAgIGZsb3dfYXR0ci0+bnVtX29mX3NwZWNzID09IDEpIHsKKwkJc3RydWN0IF9ydWxlX2h3ICpydWxlX2hlYWRlciA9IChzdHJ1Y3QgX3J1bGVfaHcgKikoY3RybCArIDEpOworCQllbnVtIGliX2Zsb3dfc3BlY190eXBlIGhlYWRlcl9zcGVjID0KKwkJCSgodW5pb24gaWJfZmxvd19zcGVjICopKGZsb3dfYXR0ciArIDEpKS0+dHlwZTsKKworCQlpZiAoaGVhZGVyX3NwZWMgPT0gSUJfRkxPV19TUEVDX0VUSCkKKwkJCW1seDRfaGFuZGxlX2V0aF9oZWFkZXJfbWNhc3RfcHJpbyhjdHJsLCBydWxlX2hlYWRlcik7CisJfQorCiAJcmV0ID0gbWx4NF9jbWRfaW1tKG1kZXYtPmRldiwgbWFpbGJveC0+ZG1hLCByZWdfaWQsIHNpemUgPj4gMiwgMCwKIAkJCSAgIE1MWDRfUVBfRkxPV19TVEVFUklOR19BVFRBQ0gsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKLQkJCSAgIE1MWDRfQ01EX1dSQVBQRUQpOworCQkJICAgTUxYNF9DTURfTkFUSVZFKTsKIAlpZiAocmV0ID09IC1FTk9NRU0pCiAJCXByX2VycigibWNnIHRhYmxlIGlzIGZ1bGwuIEZhaWwgdG8gcmVnaXN0ZXIgbmV0d29yayBydWxlLlxuIik7CiAJZWxzZSBpZiAocmV0ID09IC1FTlhJTykKQEAgLTE2OTksNyArMTcwOSw3IEBACiAJaW50IGVycjsKIAllcnIgPSBtbHg0X2NtZChkZXYsIHJlZ19pZCwgMCwgMCwKIAkJICAgICAgIE1MWDRfUVBfRkxPV19TVEVFUklOR19ERVRBQ0gsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKLQkJICAgICAgIE1MWDRfQ01EX1dSQVBQRUQpOworCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKIAlpZiAoZXJyKQogCQlwcl9lcnIoIkZhaWwgdG8gZGV0YWNoIG5ldHdvcmsgcnVsZS4gcmVnaXN0cmF0aW9uIGlkID0gMHglbGx4XG4iLAogCQkgICAgICAgcmVnX2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9oYnRwX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvaGJ0cF9pbnB1dC5jCmluZGV4IDdhNmY1MGIuLjY2ZDE0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9oYnRwX2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2hidHBfaW5wdXQuYwpAQCAtOTIsNiArOTIsNyBAQAogCXN0cnVjdCBrb2JqZWN0ICpzeXNmc19rb2JqZWN0OwogCXMxNiBST0lbTUFYX1JPSV9TSVpFXTsKIAlzMTYgYWNjZWxCdWZmZXJbTUFYX0FDQ0VMX1NJWkVdOworCXUzMiBkaXNwbGF5X3N0YXR1czsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGJ0cF9kYXRhICpoYnRwOwpAQCAtMTQyNSwxMCArMTQyNiwxMSBAQAogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJoYnRwOiByZXQgZXJyb3I6ICV6ZFxuIiwgcmV0KTsKIAkJbXV0ZXhfdW5sb2NrKCZoYnRwLT5tdXRleCk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiAwOwogCX0KLQlpZiAoIWhidHAgfHwgIWhidHAtPmlucHV0X2RldikgewotCQlwcl9lcnIoImhidHA6IGhidHAgb3IgaGJ0cC0+aW5wdXRfZGV2IG5vdCByZWFkeSFcbiIpOworCWhidHAtPmRpc3BsYXlfc3RhdHVzID0gc3RhdHVzOworCWlmICghaGJ0cC0+aW5wdXRfZGV2KSB7CisJCXByX2VycigiaGJ0cDogaGJ0cC0+aW5wdXRfZGV2IG5vdCByZWFkeSFcbiIpOwogCQltdXRleF91bmxvY2soJmhidHAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xNDQ1LDggKzE0NDcsMjAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGhidHBfZGlzcGxheV9wd3Jfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3NpemVfdCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmaGJ0cC0+bXV0ZXgpOworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGhidHAtPmRpc3BsYXlfc3RhdHVzKTsKKwltdXRleF91bmxvY2soJmhidHAtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGhidHBfZGlzcGxheV9hdHRyaWJ1dGUgPQotCQlfX0FUVFIoZGlzcGxheV9wd3IsIDA2NjAsIE5VTEwsIGhidHBfZGlzcGxheV9wd3Jfc3RvcmUpOworCQlfX0FUVFIoZGlzcGxheV9wd3IsIDA2NjAsIGhidHBfZGlzcGxheV9wd3Jfc2hvdywKKwkJCWhidHBfZGlzcGxheV9wd3Jfc3RvcmUpOwogCiBzdGF0aWMgaW50IF9faW5pdCBoYnRwX2luaXQodm9pZCkKIHsKQEAgLTE0NjMsNiArMTQ3Nyw3IEBACiAKIAltdXRleF9pbml0KCZoYnRwLT5tdXRleCk7CiAJbXV0ZXhfaW5pdCgmaGJ0cC0+c2Vuc29ybXV0ZXgpOworCWhidHAtPmRpc3BsYXlfc3RhdHVzID0gMTsKIAogCWVycm9yID0gbWlzY19yZWdpc3RlcigmaGJ0cF9pbnB1dF9taXNjKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTE1NDUsNiArMTU2MCw4IEBACiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKHNlbnNvcl9rb2JqZWN0LCAmdmliZGF0YV9hdHRyKTsKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoc2Vuc29yX2tvYmplY3QsICZjYXBkYXRhX2F0dHIpOwogCWtvYmplY3RfcHV0KHNlbnNvcl9rb2JqZWN0KTsKKwlzeXNmc19yZW1vdmVfZmlsZShoYnRwLT5zeXNmc19rb2JqZWN0LCAmaGJ0cF9kaXNwbGF5X2F0dHJpYnV0ZS5hdHRyKTsKKwlrb2JqZWN0X3B1dChoYnRwLT5zeXNmc19rb2JqZWN0KTsKIAltaXNjX2RlcmVnaXN0ZXIoJmhidHBfaW5wdXRfbWlzYyk7CiAJaWYgKGhidHAtPmlucHV0X2RldikKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaGJ0cC0+aW5wdXRfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9rZXljaG9yZC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2tleWNob3JkLmMKaW5kZXggYzVhYjNkZC4uZmRjYzE0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2tleWNob3JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2tleWNob3JkLmMKQEAgLTYwLDYgKzYwLDEwIEBACiAJdW5zaWduZWQgY2hhcgkJaGVhZDsKIAl1bnNpZ25lZCBjaGFyCQl0YWlsOwogCV9fdTE2CQkJYnVmZltCVUZGRVJfU0laRV07CisJLyogQml0IHRvIHNlcmlhbGl6ZSB3cml0ZXMgdG8gdGhpcyBkZXZpY2UgKi8KKyNkZWZpbmUgS0VZQ0hPUkRfQlVTWQkJCTB4MDEKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0cTsKIH07CiAKIHN0YXRpYyBpbnQgY2hlY2tfa2V5Y2hvcmQoc3RydWN0IGtleWNob3JkX2RldmljZSAqa2RldiwKQEAgLTE3Miw3ICsxNzYsNiBAQAogCQlnb3RvIGVycl9pbnB1dF9vcGVuX2RldmljZTsKIAogCXByX2luZm8oImtleWNob3JkOiB1c2luZyBpbnB1dCBkZXYgJXMgZm9yIGZldmVudFxuIiwgZGV2LT5uYW1lKTsKLQogCXJldHVybiAwOwogCiBlcnJfaW5wdXRfb3Blbl9kZXZpY2U6CkBAIC0yMjUsNiArMjI4LDQxIEBACiB9CiAKIC8qCisgKiBzZXJpYWxpemVzIHdyaXRlcyBvbiBhIGRldmljZS4gY2FuIHVzZSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoKQorICogZm9yIHRoaXMgcGFydGljdWxhciB1c2UgY2FzZSBhcyB3ZWxsIC0gYSBtYXR0ZXIgb2YgcHJlZmVyZW5jZS4KKyAqLworc3RhdGljIGludAora2V5Y2hvcmRfd3JpdGVfbG9jayhzdHJ1Y3Qga2V5Y2hvcmRfZGV2aWNlICprZGV2KQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZrZGV2LT5sb2NrLCBmbGFncyk7CisJd2hpbGUgKGtkZXYtPmZsYWdzICYgS0VZQ0hPUkRfQlVTWSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShrZGV2LT53cml0ZV93YWl0cSwKKwkJCSAgICAgICAoKGtkZXYtPmZsYWdzICYgS0VZQ0hPUkRfQlVTWSkgPT0gMCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmtkZXYtPmxvY2ssIGZsYWdzKTsKKwl9CisJa2Rldi0+ZmxhZ3MgfD0gS0VZQ0hPUkRfQlVTWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZGV2LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitrZXljaG9yZF93cml0ZV91bmxvY2soc3RydWN0IGtleWNob3JkX2RldmljZSAqa2RldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmtkZXYtPmxvY2ssIGZsYWdzKTsKKwlrZGV2LT5mbGFncyAmPSB+S0VZQ0hPUkRfQlVTWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrZGV2LT5sb2NrLCBmbGFncyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZrZGV2LT53cml0ZV93YWl0cSk7Cit9CisKKy8qCiAgKiBrZXljaG9yZF93cml0ZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCiAgKi8KIHN0YXRpYyBzc2l6ZV90IGtleWNob3JkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApAQCAtMjUwLDYgKzI4OCwyMiBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwkvKgorCSAqIFNlcmlhbGl6ZSB3cml0ZXMgdG8gdGhpcyBkZXZpY2UgdG8gcHJldmVudCB2YXJpb3VzIHJhY2VzLgorCSAqIDEpIHdyaXRlcnMgcmFjaW5nIGhlcmUgY291bGQgZG8gZHVwbGljYXRlIGlucHV0X3VucmVnaXN0ZXJfaGFuZGxlcigpCisJICogICAgY2FsbHMsIHJlc3VsdGluZyBpbiBhdHRlbXB0aW5nIHRvIHVubGluayBhIG5vZGUgZnJvbSBhIGxpc3QgdGhhdAorCSAqICAgIGRvZXMgbm90IGV4aXN0LgorCSAqIDIpIHdyaXRlcnMgcmFjaW5nIGhlcmUgY291bGQgZG8gZHVwbGljYXRlIGlucHV0X3JlZ2lzdGVyX2hhbmRsZXIoKSBjYWxscworCSAqICAgIGJlbG93LCByZXN1bHRpbmcgaW4gYSBkdXBsaWNhdGUgaW5zZXJ0aW9uIG9mIGEgbm9kZSBpbnRvIHRoZSBsaXN0LgorCSAqIDMpIGEgZG91YmxlIGtmcmVlIG9mIGtleWNob3JkcyBjYW4gb2NjdXIgKGluIHRoZSBldmVudCB0aGF0CisJICogICAgaW5wdXRfcmVnaXN0ZXJfaGFuZGxlcigpIGZhaWxzIGJlbG93LgorCSAqLworCXJldCA9IGtleWNob3JkX3dyaXRlX2xvY2soa2Rldik7CisJaWYgKHJldCkgeworCQlrZnJlZShrZXljaG9yZHMpOworCQlyZXR1cm4gcmV0OworCX0KKwogCS8qIHVucmVnaXN0ZXIgaGFuZGxlciBiZWZvcmUgY2hhbmdpbmcgY29uZmlndXJhdGlvbiAqLwogCWlmIChrZGV2LT5yZWdpc3RlcmVkKSB7CiAJCWlucHV0X3VucmVnaXN0ZXJfaGFuZGxlcigma2Rldi0+aW5wdXRfaGFuZGxlcik7CkBAIC0zMTgsMTUgKzM3MiwxOSBAQAogCWlmIChyZXQpIHsKIAkJa2ZyZWUoa2V5Y2hvcmRzKTsKIAkJa2Rldi0+a2V5Y2hvcmRzID0gMDsKKwkJa2V5Y2hvcmRfd3JpdGVfdW5sb2NrKGtkZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlrZGV2LT5yZWdpc3RlcmVkID0gMTsKIAorCWtleWNob3JkX3dyaXRlX3VubG9jayhrZGV2KTsKKwogCXJldHVybiBjb3VudDsKIAogZXJyX3VubG9ja19yZXR1cm46CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2Rldi0+bG9jaywgZmxhZ3MpOwogCWtmcmVlKGtleWNob3Jkcyk7CisJa2V5Y2hvcmRfd3JpdGVfdW5sb2NrKGtkZXYpOwogCXJldHVybiAtRUlOVkFMOwogfQogCkBAIC0zNTIsNiArNDEwLDcgQEAKIAogCXNwaW5fbG9ja19pbml0KCZrZGV2LT5sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrZGV2LT53YWl0cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgma2Rldi0+d3JpdGVfd2FpdHEpOwogCiAJa2Rldi0+aW5wdXRfaGFuZGxlci5ldmVudCA9IGtleWNob3JkX2V2ZW50OwogCWtkZXYtPmlucHV0X2hhbmRsZXIuY29ubmVjdCA9IGtleWNob3JkX2Nvbm5lY3Q7CkBAIC0zNzMsNiArNDMyLDcgQEAKIAogCWlmIChrZGV2LT5yZWdpc3RlcmVkKQogCQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZXIoJmtkZXYtPmlucHV0X2hhbmRsZXIpOworCWtmcmVlKGtkZXYtPmtleWNob3Jkcyk7CiAJa2ZyZWUoa2Rldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKaW5kZXggNTE4ZThhNy4uZjI2ODA3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMKQEAgLTEyMTIsMTQgKzEyMTIsMjQgQEAKIAogCWNhc2UgU1M0X1BBQ0tFVF9JRF9UV086CiAJCWlmIChwcml2LT5mbGFncyAmIEFMUFNfQlVUVE9OUEFEKSB7Ci0JCQlmLT5tdFswXS54ID0gU1M0X0JUTF9NRl9YX1YyKHAsIDApOworCQkJaWYgKElTX1NTNFBMVVNfREVWKHByaXYtPmRldl9pZCkpIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X1BMVVNfQlRMX01GX1hfVjIocCwgMCk7CisJCQkJZi0+bXRbMV0ueCA9IFNTNF9QTFVTX0JUTF9NRl9YX1YyKHAsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X0JUTF9NRl9YX1YyKHAsIDApOworCQkJCWYtPm10WzFdLnggPSBTUzRfQlRMX01GX1hfVjIocCwgMSk7CisJCQl9CiAJCQlmLT5tdFswXS55ID0gU1M0X0JUTF9NRl9ZX1YyKHAsIDApOwotCQkJZi0+bXRbMV0ueCA9IFNTNF9CVExfTUZfWF9WMihwLCAxKTsKIAkJCWYtPm10WzFdLnkgPSBTUzRfQlRMX01GX1lfVjIocCwgMSk7CiAJCX0gZWxzZSB7Ci0JCQlmLT5tdFswXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDApOworCQkJaWYgKElTX1NTNFBMVVNfREVWKHByaXYtPmRldl9pZCkpIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X1BMVVNfU1REX01GX1hfVjIocCwgMCk7CisJCQkJZi0+bXRbMV0ueCA9IFNTNF9QTFVTX1NURF9NRl9YX1YyKHAsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDApOworCQkJCWYtPm10WzFdLnggPSBTUzRfU1REX01GX1hfVjIocCwgMSk7CisJCQl9CiAJCQlmLT5tdFswXS55ID0gU1M0X1NURF9NRl9ZX1YyKHAsIDApOwotCQkJZi0+bXRbMV0ueCA9IFNTNF9TVERfTUZfWF9WMihwLCAxKTsKIAkJCWYtPm10WzFdLnkgPSBTUzRfU1REX01GX1lfVjIocCwgMSk7CiAJCX0KIAkJZi0+cHJlc3N1cmUgPSBTUzRfTUZfWl9WMihwLCAwKSA/IDB4MzAgOiAwOwpAQCAtMTIzNiwxNiArMTI0NiwyNyBAQAogCiAJY2FzZSBTUzRfUEFDS0VUX0lEX01VTFRJOgogCQlpZiAocHJpdi0+ZmxhZ3MgJiBBTFBTX0JVVFRPTlBBRCkgewotCQkJZi0+bXRbMl0ueCA9IFNTNF9CVExfTUZfWF9WMihwLCAwKTsKKwkJCWlmIChJU19TUzRQTFVTX0RFVihwcml2LT5kZXZfaWQpKSB7CisJCQkJZi0+bXRbMF0ueCA9IFNTNF9QTFVTX0JUTF9NRl9YX1YyKHAsIDApOworCQkJCWYtPm10WzFdLnggPSBTUzRfUExVU19CVExfTUZfWF9WMihwLCAxKTsKKwkJCX0gZWxzZSB7CisJCQkJZi0+bXRbMl0ueCA9IFNTNF9CVExfTUZfWF9WMihwLCAwKTsKKwkJCQlmLT5tdFszXS54ID0gU1M0X0JUTF9NRl9YX1YyKHAsIDEpOworCQkJfQorCiAJCQlmLT5tdFsyXS55ID0gU1M0X0JUTF9NRl9ZX1YyKHAsIDApOwotCQkJZi0+bXRbM10ueCA9IFNTNF9CVExfTUZfWF9WMihwLCAxKTsKIAkJCWYtPm10WzNdLnkgPSBTUzRfQlRMX01GX1lfVjIocCwgMSk7CiAJCQlub19kYXRhX3ggPSBTUzRfTUZQQUNLRVRfTk9fQVhfQkw7CiAJCQlub19kYXRhX3kgPSBTUzRfTUZQQUNLRVRfTk9fQVlfQkw7CiAJCX0gZWxzZSB7Ci0JCQlmLT5tdFsyXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDApOworCQkJaWYgKElTX1NTNFBMVVNfREVWKHByaXYtPmRldl9pZCkpIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X1BMVVNfU1REX01GX1hfVjIocCwgMCk7CisJCQkJZi0+bXRbMV0ueCA9IFNTNF9QTFVTX1NURF9NRl9YX1YyKHAsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlmLT5tdFswXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDApOworCQkJCWYtPm10WzFdLnggPSBTUzRfU1REX01GX1hfVjIocCwgMSk7CisJCQl9CiAJCQlmLT5tdFsyXS55ID0gU1M0X1NURF9NRl9ZX1YyKHAsIDApOwotCQkJZi0+bXRbM10ueCA9IFNTNF9TVERfTUZfWF9WMihwLCAxKTsKIAkJCWYtPm10WzNdLnkgPSBTUzRfU1REX01GX1lfVjIocCwgMSk7CiAJCQlub19kYXRhX3ggPSBTUzRfTUZQQUNLRVRfTk9fQVg7CiAJCQlub19kYXRhX3kgPSBTUzRfTUZQQUNLRVRfTk9fQVk7CkBAIC0yNTM1LDggKzI1NTYsOCBAQAogCiAJbWVtc2V0KG90cCwgMCwgc2l6ZW9mKG90cCkpOwogCi0JaWYgKGFscHNfZ2V0X290cF92YWx1ZXNfc3M0X3YyKHBzbW91c2UsIDAsICZvdHBbMF1bMF0pIHx8Ci0JICAgIGFscHNfZ2V0X290cF92YWx1ZXNfc3M0X3YyKHBzbW91c2UsIDEsICZvdHBbMV1bMF0pKQorCWlmIChhbHBzX2dldF9vdHBfdmFsdWVzX3NzNF92Mihwc21vdXNlLCAxLCAmb3RwWzFdWzBdKSB8fAorCSAgICBhbHBzX2dldF9vdHBfdmFsdWVzX3NzNF92Mihwc21vdXNlLCAwLCAmb3RwWzBdWzBdKSkKIAkJcmV0dXJuIC0xOwogCiAJYWxwc191cGRhdGVfZGV2aWNlX2FyZWFfc3M0X3YyKG90cCwgcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5oCmluZGV4IGRiZmQyNjAuLjc5MzEyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5oCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5oCkBAIC05MSw2ICs5MSwxMCBAQAogCQkJCSAoKF9iWzEgKyBfaSAqIDNdICA8PCA1KSAmIDB4MUYwMCkJXAogCQkJCSkKIAorI2RlZmluZSBTUzRfUExVU19TVERfTUZfWF9WMihfYiwgX2kpICgoKF9iWzAgKyAoX2kpICogM10gPDwgNCkgJiAweDAwNzApIHwgXAorCQkJCSAoKF9iWzEgKyAoX2kpICogM10gIDw8IDQpICYgMHgwRjgwKQlcCisJCQkJKQorCiAjZGVmaW5lIFNTNF9TVERfTUZfWV9WMihfYiwgX2kpCSgoKF9iWzEgKyAoX2kpICogM10gPDwgMykgJiAweDAwMTApIHwJXAogCQkJCSAoKF9iWzIgKyAoX2kpICogM10gPDwgNSkgJiAweDAxRTApIHwJXAogCQkJCSAoKF9iWzIgKyAoX2kpICogM10gPDwgNCkgJiAweDBFMDApCVwKQEAgLTEwMCw2ICsxMDQsMTAgQEAKIAkJCQkgKChfYlswICsgKF9pKSAqIDNdID4+IDMpICYgMHgwMDEwKQlcCiAJCQkJKQogCisjZGVmaW5lIFNTNF9QTFVTX0JUTF9NRl9YX1YyKF9iLCBfaSkgKFNTNF9QTFVTX1NURF9NRl9YX1YyKF9iLCBfaSkgfAlcCisJCQkJICgoX2JbMCArIChfaSkgKiAzXSA+PiA0KSAmIDB4MDAwOCkJXAorCQkJCSkKKwogI2RlZmluZSBTUzRfQlRMX01GX1lfVjIoX2IsIF9pKQkoU1M0X1NURF9NRl9ZX1YyKF9iLCBfaSkgfCBcCiAJCQkJICgoX2JbMCArIChfaSkgKiAzXSA+PiAzKSAmIDB4MDAwOCkJXAogCQkJCSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmNfY29yZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19jb3JlLmMKaW5kZXggZGE1NDU4ZC4uNjgxZGNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19jb3JlLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19jb3JlLmMKQEAgLTEyMzQsNyArMTIzNCwxMiBAQAogCXsgIkVMQU4wMDAwIiwgMCB9LAogCXsgIkVMQU4wMTAwIiwgMCB9LAogCXsgIkVMQU4wNjAwIiwgMCB9LAorCXsgIkVMQU4wNjAyIiwgMCB9LAogCXsgIkVMQU4wNjA1IiwgMCB9LAorCXsgIkVMQU4wNjA4IiwgMCB9LAorCXsgIkVMQU4wNjA1IiwgMCB9LAorCXsgIkVMQU4wNjA5IiwgMCB9LAorCXsgIkVMQU4wNjBCIiwgMCB9LAogCXsgIkVMQU4xMDAwIiwgMCB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKaW5kZXggMzU0ZDQ3ZS4uN2UyZGM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKQEAgLTI2NSw3ICsyNjUsOCBAQAogCWlmIChwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCBwYXJhbSwgTUFLRV9QUzJfQ01EKDAsIDIsIFRQX1JFQURfSUQpKSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKHBhcmFtWzBdICE9IFRQX01BR0lDX0lERU5UKQorCS8qIGFkZCBuZXcgVFAgSUQuICovCisJaWYgKCEocGFyYW1bMF0gJiBUUF9NQUdJQ19JREVOVCkpCiAJCXJldHVybiAtMTsKIAogCWlmIChmaXJtd2FyZV9pZCkKQEAgLTM4MCw4ICszODEsOCBAQAogCQlyZXR1cm4gMDsKIAogCWlmICh0cmFja3BvaW50X3JlYWQoJnBzbW91c2UtPnBzMmRldiwgVFBfRVhUX0JUTiwgJmJ1dHRvbl9pbmZvKSkgewotCQlwc21vdXNlX3dhcm4ocHNtb3VzZSwgImZhaWxlZCB0byBnZXQgZXh0ZW5kZWQgYnV0dG9uIGRhdGFcbiIpOwotCQlidXR0b25faW5mbyA9IDA7CisJCXBzbW91c2Vfd2Fybihwc21vdXNlLCAiZmFpbGVkIHRvIGdldCBleHRlbmRlZCBidXR0b24gZGF0YSwgYXNzdW1pbmcgMyBidXR0b25zXG4iKTsKKwkJYnV0dG9uX2luZm8gPSAweDMzOwogCX0KIAogCXBzbW91c2UtPnByaXZhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2twb2ludF9kYXRhKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3RyYWNrcG9pbnQuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5oCmluZGV4IDU2MTdlZDMuLjg4MDU1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5oCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5oCkBAIC0yMSw4ICsyMSw5IEBACiAjZGVmaW5lIFRQX0NPTU1BTkQJCTB4RTIJLyogQ29tbWFuZHMgc3RhcnQgd2l0aCB0aGlzICovCiAKICNkZWZpbmUgVFBfUkVBRF9JRAkJMHhFMQkvKiBTZW50IGZvciBkZXZpY2UgaWRlbnRpZmljYXRpb24gKi8KLSNkZWZpbmUgVFBfTUFHSUNfSURFTlQJCTB4MDEJLyogU2VudCBhZnRlciBhIFRQX1JFQURfSUQgZm9sbG93ZWQgKi8KKyNkZWZpbmUgVFBfTUFHSUNfSURFTlQJCTB4MDMJLyogU2VudCBhZnRlciBhIFRQX1JFQURfSUQgZm9sbG93ZWQgKi8KIAkJCQkJLyogYnkgdGhlIGZpcm13YXJlIElEICovCisJCQkJCS8qIEZpcm13YXJlIElEIGluY2x1ZGVzIDB4MSwgMHgyLCAweDMgKi8KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKaW5kZXggNDE4MDBiNi4uYzM4MGI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCkBAIC00Mjk0LDYgKzQyOTQsNyBAQAogCQkvKiBTZXR0aW5nICovCiAJCWlydGUtPmhpLmZpZWxkcy5nYV9yb290X3B0ciA9IChwaV9kYXRhLT5iYXNlID4+IDEyKTsKIAkJaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciA9IHZjcHVfcGlfaW5mby0+dmVjdG9yOworCQlpcnRlLT5sby5maWVsZHNfdmFwaWMuZ2FfbG9nX2ludHIgPSAxOwogCQlpcnRlLT5sby5maWVsZHNfdmFwaWMuZ3Vlc3RfbW9kZSA9IDE7CiAJCWlydGUtPmxvLmZpZWxkc192YXBpYy5nYV90YWcgPSBwaV9kYXRhLT5nYV90YWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYwppbmRleCAyM2VhYjAwLi5hMGUxZjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jCkBAIC01MSw2ICs1MSw5IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9tc20tYnVzLmg+CiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvbXNtL21zbS1idXMtaWRzLmg+CisjaW5jbHVkZSA8bGludXgvcmVtb3RlX3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvaW9tbXUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKQEAgLTMxOSw2ICszMjIsMTQgQEAKIAlRQ09NX1NNTVVWNTAwLAogfTsKIAorc3RydWN0IGFybV9zbW11X2RldmljZTsKK3N0cnVjdCBhcm1fc21tdV9hcmNoX29wcyB7CisJaW50ICgqaW5pdCkoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSk7CisJdm9pZCAoKmRldmljZV9yZXNldCkoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSk7CisJcGh5c19hZGRyX3QgKCppb3ZhX3RvX3BoeXNfaGFyZCkoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQkJCQkgZG1hX2FkZHJfdCBpb3ZhKTsKK307CisKIHN0cnVjdCBhcm1fc21tdV9pbXBsX2RlZl9yZWcgewogCXUzMiBvZmZzZXQ7CiAJdTMyIHZhbHVlOwpAQCAtMzkyLDcgKzQwMyw2IEBACiAJaW50CQkJCXJlZ3VsYXRvcl9kZWZlcjsKIH07CiAKLXN0cnVjdCBhcm1fc21tdV9hcmNoX29wczsKIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgewogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwogCkBAIC00MjAsNiArNDMwLDggQEAKICNkZWZpbmUgQVJNX1NNTVVfT1BUX0RZTkFNSUMJCSgxIDw8IDMpCiAjZGVmaW5lIEFSTV9TTU1VX09QVF8zTFZMX1RBQkxFUwkoMSA8PCA0KQogI2RlZmluZSBBUk1fU01NVV9PUFRfTk9fQVNJRF9SRVRFTlRJT04JKDEgPDwgNSkKKyNkZWZpbmUgQVJNX1NNTVVfT1BUX0RJU0FCTEVfQVRPUwkoMSA8PCA2KQorI2RlZmluZSBBUk1fU01NVV9PUFRfUUNPTV9NTVU1MDBfRVJSQVRBMQkoMSA8PCA3KQogCXUzMgkJCQlvcHRpb25zOwogCWVudW0gYXJtX3NtbXVfYXJjaF92ZXJzaW9uCXZlcnNpb247CiAJZW51bSBhcm1fc21tdV9pbXBsZW1lbnRhdGlvbgltb2RlbDsKQEAgLTUxOSw2ICs1MzEsOSBAQAogCXN0cnVjdCBtdXRleAkJCWFzc2lnbl9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQJCXNlY3VyZV9wb29sX2xpc3Q7CiAJc3RydWN0IGlvbW11X2RvbWFpbgkJZG9tYWluOworCisJYm9vbAkJCQlxc21tdXY1MDBfZXJyYXRhMV9pbml0OworCWJvb2wJCQkJcXNtbXV2NTAwX2VycmF0YTFfY2xpZW50OwogfTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhhcm1fc21tdV9kZXZpY2VzX2xvY2spOwpAQCAtNTQwLDYgKzU1NSw4IEBACiAJeyBBUk1fU01NVV9PUFRfRFlOQU1JQywgInFjb20sZHluYW1pYyIgfSwKIAl7IEFSTV9TTU1VX09QVF8zTFZMX1RBQkxFUywgInFjb20sdXNlLTMtbHZsLXRhYmxlcyIgfSwKIAl7IEFSTV9TTU1VX09QVF9OT19BU0lEX1JFVEVOVElPTiwgInFjb20sbm8tYXNpZC1yZXRlbnRpb24iIH0sCisJeyBBUk1fU01NVV9PUFRfRElTQUJMRV9BVE9TLCAicWNvbSxkaXNhYmxlLWF0b3MiIH0sCisJeyBBUk1fU01NVV9PUFRfUUNPTV9NTVU1MDBfRVJSQVRBMSwgInFjb20sbW11NTAwLWVycmF0YS0xIiB9LAogCXsgMCwgTlVMTH0sCiB9OwogCkBAIC01NTQsNiArNTcxLDkgQEAKIHN0YXRpYyBpbnQgYXJtX3NtbXVfYXNzaWduX3RhYmxlKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluKTsKIHN0YXRpYyB2b2lkIGFybV9zbW11X3VuYXNzaWduX3RhYmxlKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluKTsKIAorc3RhdGljIGludCBhcm1fc21tdV9hcmNoX2luaXQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSk7CitzdGF0aWMgdm9pZCBhcm1fc21tdV9hcmNoX2RldmljZV9yZXNldChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KTsKKwogc3RhdGljIHVpbnQ2NF90IGFybV9zbW11X2lvdmFfdG9fcHRlKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCQkgICAgZG1hX2FkZHJfdCBpb3ZhKTsKIApAQCAtNTYyLDYgKzU4Miw3IEBACiBzdGF0aWMgaW50IGFybV9zbW11X2FsbG9jX2NiKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKIAkJCQlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LAogCQkJCXN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgcXNtbXV2NTAwX2VycmF0YTFfc21tdV9nYXRoZXJfb3BzOwogCiBzdGF0aWMgc3RydWN0IGFybV9zbW11X2RvbWFpbiAqdG9fc21tdV9kb21haW4oc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tKQogewpAQCAtNjE3LDc2ICs2MzgsNiBAQAogCQltdXRleF91bmxvY2soJnNtbXVfZG9tYWluLT5hc3NpZ25fbG9jayk7CiB9CiAKLS8qCi0gKiBpbml0KCkKLSAqIEhvb2sgZm9yIGFkZGl0aW9uYWwgZGV2aWNlIHRyZWUgcGFyc2luZyBhdCBwcm9iZSB0aW1lLgotICoKLSAqIGRldmljZV9yZXNldCgpCi0gKiBIb29rIGZvciBvbmUtdGltZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgcmVnaXN0ZXIgc2V0dGluZ3MuCi0gKgotICogaW92YV90b19waHlzX2hhcmQoKQotICogUHJvdmlkZXMgZGVidWcgaW5mb3JtYXRpb24uIE1heSBiZSBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBmYXVsdCBpcnEgaGFuZGxlci4KLSAqCi0gKiBpbml0X2NvbnRleHRfYmFuaygpCi0gKiBIb29rIGZvciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2V0dGluZ3Mgd2hpY2ggcmVxdWlyZSBrbm93bGVkZ2Ugb2YgdGhlCi0gKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgY29udGV4dCBiYW5rIG51bWJlci4KLSAqCi0gKiBkZXZpY2VfZ3JvdXAoKQotICogSG9vayBmb3IgY2hlY2tpbmcgd2hldGhlciBhIGRldmljZSBpcyBjb21wYXRpYmxlIHdpdGggYSBzYWlkIGdyb3VwLgotICovCi1zdHJ1Y3QgYXJtX3NtbXVfYXJjaF9vcHMgewotCWludCAoKmluaXQpKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpOwotCXZvaWQgKCpkZXZpY2VfcmVzZXQpKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUpOwotCXBoeXNfYWRkcl90ICgqaW92YV90b19waHlzX2hhcmQpKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwKLQkJCQkJIGRtYV9hZGRyX3QgaW92YSk7Ci0Jdm9pZCAoKmluaXRfY29udGV4dF9iYW5rKShzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiwKLQkJCQkJc3RydWN0IGRldmljZSAqZGV2KTsKLQlpbnQgKCpkZXZpY2VfZ3JvdXApKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGlvbW11X2dyb3VwICpncm91cCk7Ci19OwotCi1zdGF0aWMgaW50IGFybV9zbW11X2FyY2hfaW5pdChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQotewotCWlmICghc21tdS0+YXJjaF9vcHMpCi0JCXJldHVybiAwOwotCWlmICghc21tdS0+YXJjaF9vcHMtPmluaXQpCi0JCXJldHVybiAwOwotCXJldHVybiBzbW11LT5hcmNoX29wcy0+aW5pdChzbW11KTsKLX0KLQotc3RhdGljIHZvaWQgYXJtX3NtbXVfYXJjaF9kZXZpY2VfcmVzZXQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKLXsKLQlpZiAoIXNtbXUtPmFyY2hfb3BzKQotCQlyZXR1cm47Ci0JaWYgKCFzbW11LT5hcmNoX29wcy0+ZGV2aWNlX3Jlc2V0KQotCQlyZXR1cm47Ci0JcmV0dXJuIHNtbXUtPmFyY2hfb3BzLT5kZXZpY2VfcmVzZXQoc21tdSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFybV9zbW11X2FyY2hfaW5pdF9jb250ZXh0X2JhbmsoCi0JCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OwotCi0JaWYgKCFzbW11LT5hcmNoX29wcykKLQkJcmV0dXJuOwotCWlmICghc21tdS0+YXJjaF9vcHMtPmluaXRfY29udGV4dF9iYW5rKQotCQlyZXR1cm47Ci0JcmV0dXJuIHNtbXUtPmFyY2hfb3BzLT5pbml0X2NvbnRleHRfYmFuayhzbW11X2RvbWFpbiwgZGV2KTsKLX0KLQotc3RhdGljIGludCBhcm1fc21tdV9hcmNoX2RldmljZV9ncm91cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXApCi17Ci0Jc3RydWN0IGlvbW11X2Z3c3BlYyAqZndzcGVjID0gZGV2LT5pb21tdV9md3NwZWM7Ci0Jc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IGZ3c3BlY19zbW11KGZ3c3BlYyk7Ci0KLQlpZiAoIXNtbXUtPmFyY2hfb3BzKQotCQlyZXR1cm4gMDsKLQlpZiAoIXNtbXUtPmFyY2hfb3BzLT5kZXZpY2VfZ3JvdXApCi0JCXJldHVybiAwOwotCXJldHVybiBzbW11LT5hcmNoX29wcy0+ZGV2aWNlX2dyb3VwKGRldiwgZ3JvdXApOwotfQotCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpkZXZfZ2V0X2Rldl9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2X2lzX3BjaShkZXYpKSB7CkBAIC0xMjg2LDExICsxMjM3LDEyIEBACiB7CiAJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihkb21haW4pOwogCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKKwljb25zdCBzdHJ1Y3QgaW9tbXVfZ2F0aGVyX29wcyAqdGxiID0gc21tdV9kb21haW4tPnBndGJsX2NmZy50bGI7CiAJcGh5c19hZGRyX3QgcGh5czsKIAlwaHlzX2FkZHJfdCBwaHlzX3Bvc3RfdGxiaWFsbDsKIAogCXBoeXMgPSBhcm1fc21tdV9pb3ZhX3RvX3BoeXNfaGFyZChkb21haW4sIGlvdmEpOwotCWFybV9zbW11X3RsYl9pbnZfY29udGV4dChzbW11X2RvbWFpbik7CisJdGxiLT50bGJfZmx1c2hfYWxsKHNtbXVfZG9tYWluKTsKIAlwaHlzX3Bvc3RfdGxiaWFsbCA9IGFybV9zbW11X2lvdmFfdG9fcGh5c19oYXJkKGRvbWFpbiwgaW92YSk7CiAKIAlpZiAocGh5cyAhPSBwaHlzX3Bvc3RfdGxiaWFsbCkgewpAQCAtMTY0Niw2ICsxNTk4LDcgQEAKIAlib29sIGlzX2Zhc3QgPSBzbW11X2RvbWFpbi0+YXR0cmlidXRlcyAmICgxIDw8IERPTUFJTl9BVFRSX0ZBU1QpOwogCXVuc2lnbmVkIGxvbmcgcXVpcmtzID0gMDsKIAlib29sIGR5bmFtaWM7CisJY29uc3Qgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgKnRsYjsKIAogCW11dGV4X2xvY2soJnNtbXVfZG9tYWluLT5pbml0X211dGV4KTsKIAlpZiAoc21tdV9kb21haW4tPnNtbXUpCkBAIC0xNzYwLDYgKzE3MTMsMTMgQEAKIAkJcXVpcmtzIHw9IElPX1BHVEFCTEVfUVVJUktfUUNPTV9VU0VfVVBTVFJFQU1fSElOVDsKIAlpZiAoaXNfaW9tbXVfcHRfY29oZXJlbnQoc21tdV9kb21haW4pKQogCQlxdWlya3MgfD0gSU9fUEdUQUJMRV9RVUlSS19QQUdFX1RBQkxFX0NPSEVSRU5UOworCWlmICgocXVpcmtzICYgSU9fUEdUQUJMRV9RVUlSS19RQ09NX1VTRV9VUFNUUkVBTV9ISU5UKSAmJgorCQkoc21tdS0+bW9kZWwgPT0gUUNPTV9TTU1VVjUwMCkpCisJCXF1aXJrcyB8PSBJT19QR1RBQkxFX1FVSVJLX1FTTU1VVjUwMF9OT05fU0hBUkVBQkxFOworCisJdGxiID0gJmFybV9zbW11X2dhdGhlcl9vcHM7CisJaWYgKHNtbXUtPm9wdGlvbnMgJiBBUk1fU01NVV9PUFRfUUNPTV9NTVU1MDBfRVJSQVRBMSkKKwkJdGxiID0gJnFzbW11djUwMF9lcnJhdGExX3NtbXVfZ2F0aGVyX29wczsKIAogCXJldCA9IGFybV9zbW11X2FsbG9jX2NiKGRvbWFpbiwgc21tdSwgZGV2KTsKIAlpZiAocmV0IDwgMCkKQEAgLTE3NzgsNyArMTczOCw3IEBACiAJCS5wZ3NpemVfYml0bWFwCT0gc21tdS0+cGdzaXplX2JpdG1hcCwKIAkJLmlhcwkJPSBpYXMsCiAJCS5vYXMJCT0gb2FzLAotCQkudGxiCQk9ICZhcm1fc21tdV9nYXRoZXJfb3BzLAorCQkudGxiCQk9IHRsYiwKIAkJLmlvbW11X2Rldgk9IHNtbXUtPmRldiwKIAl9OwogCkBAIC0xODE0LDggKzE3NzQsNiBAQAogCQlhcm1fc21tdV9pbml0X2NvbnRleHRfYmFuayhzbW11X2RvbWFpbiwKIAkJCQkJCSZzbW11X2RvbWFpbi0+cGd0YmxfY2ZnKTsKIAotCQlhcm1fc21tdV9hcmNoX2luaXRfY29udGV4dF9iYW5rKHNtbXVfZG9tYWluLCBkZXYpOwotCiAJCS8qCiAJCSAqIFJlcXVlc3QgY29udGV4dCBmYXVsdCBpbnRlcnJ1cHQuIERvIHRoaXMgbGFzdCB0byBhdm9pZCB0aGUKIAkJICogaGFuZGxlciBzZWVpbmcgYSBoYWxmLWluaXRpYWxpc2VkIGRvbWFpbiBzdGF0ZS4KQEAgLTI0MzgsNiArMjM5Niw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWFybV9zbW11X3NlY3VyZV9kb21haW5fbG9jayhzbW11X2RvbWFpbik7CisKIAlfX3NhdmVkX2lvdmFfc3RhcnQgPSBpb3ZhOwogCWlkeF9zdGFydCA9IGlkeF9lbmQgPSAwOwogCXNnX3N0YXJ0ID0gc2dfZW5kID0gc2c7CkBAIC0yNDc1LDYgKzI0MzUsNyBAQAogCQlhcm1fc21tdV91bm1hcChkb21haW4sIF9fc2F2ZWRfaW92YV9zdGFydCwgc2l6ZV90b191bm1hcCk7CiAJCWlvdmEgPSBfX3NhdmVkX2lvdmFfc3RhcnQ7CiAJfQorCWFybV9zbW11X3NlY3VyZV9kb21haW5fdW5sb2NrKHNtbXVfZG9tYWluKTsKIAlhcm1fc21tdV9kb21haW5fcG93ZXJfb2ZmKGRvbWFpbiwgc21tdV9kb21haW4tPnNtbXUpOwogCXJldHVybiBpb3ZhIC0gX19zYXZlZF9pb3ZhX3N0YXJ0OwogfQpAQCAtMjU1Miw2ICsyNTEzLDEwIEBACiAJcGh5c19hZGRyX3QgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CisKKwlpZiAoc21tdS0+b3B0aW9ucyAmIEFSTV9TTU1VX09QVF9ESVNBQkxFX0FUT1MpCisJCXJldHVybiAwOwogCiAJaWYgKHNtbXVfZG9tYWluLT5zbW11LT5hcmNoX29wcyAmJgogCSAgICBzbW11X2RvbWFpbi0+c21tdS0+YXJjaF9vcHMtPmlvdmFfdG9fcGh5c19oYXJkKSB7CkBAIC0yNzIxLDIwICsyNjg2LDEzIEBACiAJCWdyb3VwID0gc21tdS0+czJjcnNbaWR4XS5ncm91cDsKIAl9CiAKLQlpZiAoIWdyb3VwKSB7Ci0JCWlmIChkZXZfaXNfcGNpKGRldikpCi0JCQlncm91cCA9IHBjaV9kZXZpY2VfZ3JvdXAoZGV2KTsKLQkJZWxzZQotCQkJZ3JvdXAgPSBnZW5lcmljX2RldmljZV9ncm91cChkZXYpOworCWlmIChncm91cCkKKwkJcmV0dXJuIGdyb3VwOwogCi0JCWlmIChJU19FUlIoZ3JvdXApKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGFybV9zbW11X2FyY2hfZGV2aWNlX2dyb3VwKGRldiwgZ3JvdXApKSB7Ci0JCWlvbW11X2dyb3VwX3B1dChncm91cCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KKwlpZiAoZGV2X2lzX3BjaShkZXYpKQorCQlncm91cCA9IHBjaV9kZXZpY2VfZ3JvdXAoZGV2KTsKKwllbHNlCisJCWdyb3VwID0gZ2VuZXJpY19kZXZpY2VfZ3JvdXAoZGV2KTsKIAogCXJldHVybiBncm91cDsKIH0KQEAgLTI4MjksNiArMjc4NywxMSBAQAogCQkJCQkmICgxIDw8IERPTUFJTl9BVFRSX0ZBU1QpKTsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CisJY2FzZSBET01BSU5fQVRUUl9VUFNUUkVBTV9JT1ZBX0FMTE9DQVRPUjoKKwkJKigoaW50ICopZGF0YSkgPSAhIShzbW11X2RvbWFpbi0+YXR0cmlidXRlcworCQkJJiAoMSA8PCBET01BSU5fQVRUUl9VUFNUUkVBTV9JT1ZBX0FMTE9DQVRPUikpOworCQlyZXQgPSAwOworCQlicmVhazsKIAljYXNlIERPTUFJTl9BVFRSX1VTRV9VUFNUUkVBTV9ISU5UOgogCQkqKChpbnQgKilkYXRhKSA9ICEhKHNtbXVfZG9tYWluLT5hdHRyaWJ1dGVzICYKIAkJCQkgICAoMSA8PCBET01BSU5fQVRUUl9VU0VfVVBTVFJFQU1fSElOVCkpOwpAQCAtMjk4MSw2ICsyOTQ0LDEyIEBACiAJCX0KIAkJc21tdV9kb21haW4tPnNlY3VyZV92bWlkID0gKigoaW50ICopZGF0YSk7CiAJCWJyZWFrOworCWNhc2UgRE9NQUlOX0FUVFJfVVBTVFJFQU1fSU9WQV9BTExPQ0FUT1I6CisJCWlmICgqKChpbnQgKilkYXRhKSkKKwkJCXNtbXVfZG9tYWluLT5hdHRyaWJ1dGVzIHw9CisJCQkJMSA8PCBET01BSU5fQVRUUl9VUFNUUkVBTV9JT1ZBX0FMTE9DQVRPUjsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CiAJY2FzZSBET01BSU5fQVRUUl9GQVNUOgogCQlpZiAoKigoaW50ICopZGF0YSkpCiAJCQlzbW11X2RvbWFpbi0+YXR0cmlidXRlcyB8PSAxIDw8IERPTUFJTl9BVFRSX0ZBU1Q7CkBAIC0zMTkwLDcgKzMxNTksMTAgQEAKIAogc3RhdGljIHZvaWQgYXJtX3NtbXVfdGxiaV9kb21haW4oc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQogewotCWFybV9zbW11X3RsYl9pbnZfY29udGV4dCh0b19zbW11X2RvbWFpbihkb21haW4pKTsKKwlzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7CisJY29uc3Qgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgKnRsYiA9IHNtbXVfZG9tYWluLT5wZ3RibF9jZmcudGxiOworCisJdGxiLT50bGJfZmx1c2hfYWxsKHNtbXVfZG9tYWluKTsKIH0KIAogc3RhdGljIGludCBhcm1fc21tdV9lbmFibGVfY29uZmlnX2Nsb2NrcyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCkBAIC0zMzM0LDExICszMzA2LDYgQEAKIAl1MzIgc2N0bHIsIHNjdGxyX29yaWcsIGZzcjsKIAl2b2lkIF9faW9tZW0gKmNiX2Jhc2U7CiAKLQlpZiAoc21tdS0+bW9kZWwgPT0gUUNPTV9TTU1VVjIpIHsKLQkJZGV2X2VycihzbW11LT5kZXYsICJBVE9TIHN1cHBvcnQgaXMgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlyZXQgPSBhcm1fc21tdV9wb3dlcl9vbihzbW11X2RvbWFpbi0+c21tdS0+cHdyKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMzU2Myw2ICszNTMwLDcgQEAKIAogCQlyYXdfczJjciA9IHJlYWRsX3JlbGF4ZWQoQVJNX1NNTVVfR1IwKHNtbXUpICsKIAkJCQkJQVJNX1NNTVVfR1IwX1MyQ1IoaSkpOworCQltZW1zZXQoJnMyY3IsIDAsIHNpemVvZihzMmNyKSk7CiAJCXMyY3IuZ3JvdXAgPSBOVUxMOwogCQlzMmNyLmNvdW50ID0gMTsKIAkJczJjci50eXBlID0gKHJhd19zMmNyID4+IFMyQ1JfVFlQRV9TSElGVCkgJiBTMkNSX1RZUEVfTUFTSzsKQEAgLTQwMTAsNiArMzk3OCwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFybV9zbW11X2FyY2hfaW5pdChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCWlmICghc21tdS0+YXJjaF9vcHMpCisJCXJldHVybiAwOworCWlmICghc21tdS0+YXJjaF9vcHMtPmluaXQpCisJCXJldHVybiAwOworCXJldHVybiBzbW11LT5hcmNoX29wcy0+aW5pdChzbW11KTsKK30KKworc3RhdGljIHZvaWQgYXJtX3NtbXVfYXJjaF9kZXZpY2VfcmVzZXQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSkKK3sKKwlpZiAoIXNtbXUtPmFyY2hfb3BzKQorCQlyZXR1cm47CisJaWYgKCFzbW11LT5hcmNoX29wcy0+ZGV2aWNlX3Jlc2V0KQorCQlyZXR1cm47CisJcmV0dXJuIHNtbXUtPmFyY2hfb3BzLT5kZXZpY2VfcmVzZXQoc21tdSk7Cit9CisKIHN0cnVjdCBhcm1fc21tdV9tYXRjaF9kYXRhIHsKIAllbnVtIGFybV9zbW11X2FyY2hfdmVyc2lvbiB2ZXJzaW9uOwogCWVudW0gYXJtX3NtbXVfaW1wbGVtZW50YXRpb24gbW9kZWw7CkBAIC00MzM0LDEyICs0MzIwLDYgQEAKIAogI2RlZmluZSBUQlVfREJHX1RJTUVPVVRfVVMJCTMwMDAwCiAKLQotc3RydWN0IGFjdGxyX3NldHRpbmcgewotCXN0cnVjdCBhcm1fc21tdV9zbXIgc21yOwotCXUzMiBhY3RscjsKLX07Ci0KIHN0cnVjdCBxc21tdXY1MDBfYXJjaGRhdGEgewogCXN0cnVjdCBsaXN0X2hlYWQJCXRidXM7CiAJdm9pZCBfX2lvbWVtCQkJKnRjdV9iYXNlOwpAQCAtNDM0Nyw2ICs0MzI3LDExIEBACiAKIAlzdHJ1Y3QgYWN0bHJfc2V0dGluZwkJKmFjdGxyczsKIAl1MzIJCQkJYWN0bHJfdGJsX3NpemU7CisKKwlzdHJ1Y3QgYXJtX3NtbXVfc21yCQkqZXJyYXRhMV9jbGllbnRzOworCXUzMgkJCQludW1fZXJyYXRhMV9jbGllbnRzOworCXJlbW90ZV9zcGlubG9ja190CQllcnJhdGExX2xvY2s7CisJa3RpbWVfdAkJCQlsYXN0X3RsYmlfa3RpbWU7CiB9OwogI2RlZmluZSBnZXRfcXNtbXV2NTAwX2FyY2hkYXRhKHNtbXUpCQkJCVwKIAkoKHN0cnVjdCBxc21tdXY1MDBfYXJjaGRhdGEgKikoc21tdS0+YXJjaGRhdGEpKQpAQCAtNDM2NywxMyArNDM1MiwxMTcgQEAKIAl1MzIJCQkJaGFsdF9jb3VudDsKIH07CiAKLXN0cnVjdCBxc21tdXY1MDBfZ3JvdXBfaW9tbXVkYXRhIHsKLQlib29sIGhhc19hY3RscjsKLQl1MzIgYWN0bHI7CitzdGF0aWMgYm9vbCBhcm1fc21tdV9kb21haW5fbWF0Y2hfc21yKHN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluLAorCQkJCSAgICAgIHN0cnVjdCBhcm1fc21tdV9zbXIgKnNtcikKK3sKKwlzdHJ1Y3QgYXJtX3NtbXVfc21yICpzbXIyOworCWludCBpLCBpZHg7CisKKwlmb3JfZWFjaF9jZmdfc21lKHNtbXVfZG9tYWluLT5kZXYtPmlvbW11X2Z3c3BlYywgaSwgaWR4KSB7CisJCXNtcjIgPSAmc21tdV9kb21haW4tPnNtbXUtPnNtcnNbaWR4XTsKKwkJLyogQ29udGludWUgaWYgdGFibGUgZW50cnkgZG9lcyBub3QgbWF0Y2ggKi8KKwkJaWYgKChzbXItPmlkIF4gc21yMi0+aWQpICYgfihzbXItPm1hc2sgfCBzbXIyLT5tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisjZGVmaW5lIEVSUkFUQTFfUkVNT1RFX1NQSU5MT0NLICAgICAgICJTOjYiCisjZGVmaW5lIEVSUkFUQTFfVExCSV9JTlRFUlZBTF9VUwkJMTAKK3N0YXRpYyBib29sCitxc21tdXY1MDBfZXJyYXRhMV9yZXF1aXJlZChzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2RvbWFpbiwKKwkJCQkgc3RydWN0IHFzbW11djUwMF9hcmNoZGF0YSAqZGF0YSkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCWludCBqOworCXN0cnVjdCBhcm1fc21tdV9zbXIgKnNtcjsKKworCWlmIChzbW11X2RvbWFpbi0+cXNtbXV2NTAwX2VycmF0YTFfaW5pdCkKKwkJcmV0dXJuIHNtbXVfZG9tYWluLT5xc21tdXY1MDBfZXJyYXRhMV9jbGllbnQ7CisKKwlmb3IgKGogPSAwOyBqIDwgZGF0YS0+bnVtX2VycmF0YTFfY2xpZW50czsgaisrKSB7CisJCXNtciA9ICZkYXRhLT5lcnJhdGExX2NsaWVudHNbal07CisJCWlmIChhcm1fc21tdV9kb21haW5fbWF0Y2hfc21yKHNtbXVfZG9tYWluLCBzbXIpKSB7CisJCQlyZXQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzbW11X2RvbWFpbi0+cXNtbXV2NTAwX2VycmF0YTFfaW5pdCA9IHRydWU7CisJc21tdV9kb21haW4tPnFzbW11djUwMF9lcnJhdGExX2NsaWVudCA9IHJldDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX3FzbW11djUwMF9lcnJhdGExX3RsYmlhbGwoc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4pCit7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNtbXVfZG9tYWluLT5kZXY7CisJc3RydWN0IGFybV9zbW11X2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5jZmc7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWt0aW1lX3QgY3VyOworCXUzMiB2YWw7CisKKwliYXNlID0gQVJNX1NNTVVfQ0JfQkFTRShzbW11KSArIEFSTV9TTU1VX0NCKHNtbXUsIGNmZy0+Y2JuZHgpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBBUk1fU01NVV9DQl9TMV9UTEJJQUxMKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgQVJNX1NNTVVfQ0JfVExCU1lOQyk7CisJaWYgKHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMoYmFzZSArIEFSTV9TTU1VX0NCX1RMQlNUQVRVUywgdmFsLAorCQkJCSAgICAgICEodmFsICYgVExCU1RBVFVTX1NBQ1RJVkUpLCAwLCAxMDApKSB7CisJCWN1ciA9IGt0aW1lX2dldCgpOworCQl0cmFjZV9lcnJhdGFfdGhyb3R0bGVfc3RhcnQoZGV2LCAwKTsKKworCQltc21fYnVzX25vY190aHJvdHRsZV93YSh0cnVlKTsKKwkJaWYgKHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMoYmFzZSArIEFSTV9TTU1VX0NCX1RMQlNUQVRVUywgdmFsLAorCQkJCSAgICAgICEodmFsICYgVExCU1RBVFVTX1NBQ1RJVkUpLCAwLCAxMDAwMCkpIHsKKwkJCWRldl9lcnIoc21tdS0+ZGV2LCAiRVJSQVRBMSBUTEJTWU5DIHRpbWVvdXQiKTsKKwkJCXRyYWNlX2VycmF0YV9mYWlsZWQoZGV2LCAwKTsKKwkJfQorCisJCW1zbV9idXNfbm9jX3Rocm90dGxlX3dhKGZhbHNlKTsKKworCQl0cmFjZV9lcnJhdGFfdGhyb3R0bGVfZW5kKAorCQkJCWRldiwga3RpbWVfdXNfZGVsdGEoa3RpbWVfZ2V0KCksIGN1cikpOworCX0KK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBjbG9ja3MvcmVndWxhdG9ycyBlbmFibGVkICovCitzdGF0aWMgdm9pZCBxc21tdXY1MDBfZXJyYXRhMV90bGJfaW52X2NvbnRleHQodm9pZCAqY29va2llKQoreworCXN0cnVjdCBhcm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gY29va2llOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNtbXVfZG9tYWluLT5kZXY7CisJc3RydWN0IHFzbW11djUwMF9hcmNoZGF0YSAqZGF0YSA9CisJCQlnZXRfcXNtbXV2NTAwX2FyY2hkYXRhKHNtbXVfZG9tYWluLT5zbW11KTsKKwlrdGltZV90IGN1cjsKKwlib29sIGVycmF0YTsKKworCWN1ciA9IGt0aW1lX2dldCgpOworCXRyYWNlX2VycmF0YV90bGJpX3N0YXJ0KGRldiwgMCk7CisKKwllcnJhdGEgPSBxc21tdXY1MDBfZXJyYXRhMV9yZXF1aXJlZChzbW11X2RvbWFpbiwgZGF0YSk7CisJcmVtb3RlX3NwaW5fbG9jaygmZGF0YS0+ZXJyYXRhMV9sb2NrKTsKKwlpZiAoZXJyYXRhKSB7CisJCXM2NCBkZWx0YTsKKworCQlkZWx0YSA9IGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCBkYXRhLT5sYXN0X3RsYmlfa3RpbWUpOworCQlpZiAoZGVsdGEgPCBFUlJBVEExX1RMQklfSU5URVJWQUxfVVMpCisJCQl1ZGVsYXkoRVJSQVRBMV9UTEJJX0lOVEVSVkFMX1VTIC0gZGVsdGEpOworCisJCV9fcXNtbXV2NTAwX2VycmF0YTFfdGxiaWFsbChzbW11X2RvbWFpbik7CisKKwkJZGF0YS0+bGFzdF90bGJpX2t0aW1lID0ga3RpbWVfZ2V0KCk7CisJfSBlbHNlIHsKKwkJX19xc21tdXY1MDBfZXJyYXRhMV90bGJpYWxsKHNtbXVfZG9tYWluKTsKKwl9CisJcmVtb3RlX3NwaW5fdW5sb2NrKCZkYXRhLT5lcnJhdGExX2xvY2spOworCisJdHJhY2VfZXJyYXRhX3RsYmlfZW5kKGRldiwga3RpbWVfdXNfZGVsdGEoa3RpbWVfZ2V0KCksIGN1cikpOworfQorCitzdGF0aWMgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgcXNtbXV2NTAwX2VycmF0YTFfc21tdV9nYXRoZXJfb3BzID0geworCS50bGJfZmx1c2hfYWxsCT0gcXNtbXV2NTAwX2VycmF0YTFfdGxiX2ludl9jb250ZXh0LAorCS5hbGxvY19wYWdlc19leGFjdCA9IGFybV9zbW11X2FsbG9jX3BhZ2VzX2V4YWN0LAorCS5mcmVlX3BhZ2VzX2V4YWN0ID0gYXJtX3NtbXVfZnJlZV9wYWdlc19leGFjdCwKIH07Ci0jZGVmaW5lIHRvX3FzbW11djUwMF9ncm91cF9pb21tdWRhdGEoZ3JvdXApCQkJCVwKLQkoKHN0cnVjdCBxc21tdXY1MDBfZ3JvdXBfaW9tbXVkYXRhICopCQkJCVwKLQkJKGlvbW11X2dyb3VwX2dldF9pb21tdWRhdGEoZ3JvdXApKSkKIAogc3RhdGljIGludCBxc21tdXY1MDBfdGJ1X2hhbHQoc3RydWN0IHFzbW11djUwMF90YnVfZGV2aWNlICp0YnUpCiB7CkBAIC00NjI4LDc5ICs0NzE3LDYgQEAKIAlyZXR1cm4gcXNtbXV2NTAwX2lvdmFfdG9fcGh5cyhkb21haW4sIGlvdmEsIHNpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHFzbW11djUwMF9yZWxlYXNlX2dyb3VwX2lvbW11ZGF0YSh2b2lkICpkYXRhKQotewotCWtmcmVlKGRhdGEpOwotfQotCi0vKiBJZiBhIGRldmljZSBoYXMgYSB2YWxpZCBhY3RsciwgaXQgbXVzdCBtYXRjaCAqLwotc3RhdGljIGludCBxc21tdXY1MDBfZGV2aWNlX2dyb3VwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgaW9tbXVfZ3JvdXAgKmdyb3VwKQotewotCXN0cnVjdCBpb21tdV9md3NwZWMgKmZ3c3BlYyA9IGRldi0+aW9tbXVfZndzcGVjOwotCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBmd3NwZWNfc21tdShmd3NwZWMpOwotCXN0cnVjdCBxc21tdXY1MDBfYXJjaGRhdGEgKmRhdGEgPSBnZXRfcXNtbXV2NTAwX2FyY2hkYXRhKHNtbXUpOwotCXN0cnVjdCBxc21tdXY1MDBfZ3JvdXBfaW9tbXVkYXRhICppb21tdWRhdGE7Ci0JdTMyIGFjdGxyLCBpLCBqLCBpZHg7Ci0Jc3RydWN0IGFybV9zbW11X3NtciAqc21yLCAqc21yMjsKLQotCWlvbW11ZGF0YSA9IHRvX3FzbW11djUwMF9ncm91cF9pb21tdWRhdGEoZ3JvdXApOwotCWlmICghaW9tbXVkYXRhKSB7Ci0JCWlvbW11ZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCppb21tdWRhdGEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpb21tdWRhdGEpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpb21tdV9ncm91cF9zZXRfaW9tbXVkYXRhKGdyb3VwLCBpb21tdWRhdGEsCi0JCQkJcXNtbXV2NTAwX3JlbGVhc2VfZ3JvdXBfaW9tbXVkYXRhKTsKLQl9Ci0KLQlmb3JfZWFjaF9jZmdfc21lKGZ3c3BlYywgaSwgaWR4KSB7Ci0JCXNtciA9ICZzbW11LT5zbXJzW2lkeF07Ci0JCWZvciAoaiA9IDA7IGogPCBkYXRhLT5hY3Rscl90Ymxfc2l6ZTsgaisrKSB7Ci0JCQlzbXIyID0gJmRhdGEtPmFjdGxyc1tqXS5zbXI7Ci0JCQlhY3RsciA9IGRhdGEtPmFjdGxyc1tqXS5hY3RscjsKLQotCQkJLyogQ29udGludWUgaWYgdGFibGUgZW50cnkgZG9lcyBub3QgbWF0Y2ggKi8KLQkJCWlmICgoc21yLT5pZCBeIHNtcjItPmlkKSAmIH4oc21yLT5tYXNrIHwgc21yMi0+bWFzaykpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICghaW9tbXVkYXRhLT5oYXNfYWN0bHIpIHsKLQkJCQlpb21tdWRhdGEtPmFjdGxyID0gYWN0bHI7Ci0JCQkJaW9tbXVkYXRhLT5oYXNfYWN0bHIgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChpb21tdWRhdGEtPmFjdGxyICE9IGFjdGxyKSB7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcXNtbXV2NTAwX2luaXRfY2Ioc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4sCi0JCQkJc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKLQlzdHJ1Y3QgcXNtbXV2NTAwX2dyb3VwX2lvbW11ZGF0YSAqaW9tbXVkYXRhID0KLQkJdG9fcXNtbXV2NTAwX2dyb3VwX2lvbW11ZGF0YShkZXYtPmlvbW11X2dyb3VwKTsKLQl2b2lkIF9faW9tZW0gKmNiX2Jhc2U7Ci0JY29uc3Qgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgKnRsYjsKLQotCWlmICghaW9tbXVkYXRhLT5oYXNfYWN0bHIpCi0JCXJldHVybjsKLQotCXRsYiA9IHNtbXVfZG9tYWluLT5wZ3RibF9jZmcudGxiOwotCWNiX2Jhc2UgPSBBUk1fU01NVV9DQl9CQVNFKHNtbXUpICsKLQkJCUFSTV9TTU1VX0NCKHNtbXUsIHNtbXVfZG9tYWluLT5jZmcuY2JuZHgpOwotCi0Jd3JpdGVsX3JlbGF4ZWQoaW9tbXVkYXRhLT5hY3RsciwgY2JfYmFzZSArIEFSTV9TTU1VX0NCX0FDVExSKTsKLQotCS8qCi0JICogRmx1c2ggdGhlIGNvbnRleHQgYmFuayBhZnRlciBtb2RpZnlpbmcgQUNUTFIgdG8gZW5zdXJlIHRoZXJlCi0JICogYXJlIG5vIGNhY2hlIGVudHJpZXMgd2l0aCBzdGFsZSBzdGF0ZQotCSAqLwotCXRsYi0+dGxiX2ZsdXNoX2FsbChzbW11X2RvbWFpbik7Ci19Ci0KIHN0YXRpYyBpbnQgcXNtbXV2NTAwX3RidV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmNvb2tpZSkKIHsKIAlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gY29va2llOwpAQCAtNDcyMCwzNSArNDczNiwzNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFzbW11djUwMF9yZWFkX2FjdGxyX3RibChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQorc3RhdGljIGludCBxc21tdXY1MDBfcGFyc2VfZXJyYXRhMShzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQogewogCWludCBsZW4sIGk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gc21tdS0+ZGV2OwogCXN0cnVjdCBxc21tdXY1MDBfYXJjaGRhdGEgKmRhdGEgPSBnZXRfcXNtbXV2NTAwX2FyY2hkYXRhKHNtbXUpOwotCXN0cnVjdCBhY3Rscl9zZXR0aW5nICphY3RscnM7CisJc3RydWN0IGFybV9zbW11X3NtciAqc21yczsKIAljb25zdCBfX2JlMzIgKmNlbGw7CiAKLQljZWxsID0gb2ZfZ2V0X3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sYWN0bHIiLCBOVUxMKTsKKwljZWxsID0gb2ZfZ2V0X3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sbW11NTAwLWVycmF0YS0xIiwgTlVMTCk7CiAJaWYgKCFjZWxsKQogCQlyZXR1cm4gMDsKIAotCWxlbiA9IG9mX3Byb3BlcnR5X2NvdW50X2VsZW1zX29mX3NpemUoZGV2LT5vZl9ub2RlLCAicWNvbSxhY3RsciIsCi0JCQkJCQlzaXplb2YodTMyKSAqIDMpOworCXJlbW90ZV9zcGluX2xvY2tfaW5pdCgmZGF0YS0+ZXJyYXRhMV9sb2NrLCBFUlJBVEExX1JFTU9URV9TUElOTE9DSyk7CisJbGVuID0gb2ZfcHJvcGVydHlfY291bnRfZWxlbXNfb2Zfc2l6ZSgKKwkJCWRldi0+b2Zfbm9kZSwgInFjb20sbW11NTAwLWVycmF0YS0xIiwgc2l6ZW9mKHUzMikgKiAyKTsKIAlpZiAobGVuIDwgMCkKIAkJcmV0dXJuIDA7CiAKLQlhY3RscnMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmFjdGxycykgKiBsZW4sIEdGUF9LRVJORUwpOwotCWlmICghYWN0bHJzKQorCXNtcnMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNtcnMpICogbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNtcnMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWFjdGxyc1tpXS5zbXIuaWQgPSBvZl9yZWFkX251bWJlcihjZWxsKyssIDEpOwotCQlhY3RscnNbaV0uc21yLm1hc2sgPSBvZl9yZWFkX251bWJlcihjZWxsKyssIDEpOwotCQlhY3RscnNbaV0uYWN0bHIgPSBvZl9yZWFkX251bWJlcihjZWxsKyssIDEpOworCQlzbXJzW2ldLmlkID0gb2ZfcmVhZF9udW1iZXIoY2VsbCsrLCAxKTsKKwkJc21yc1tpXS5tYXNrID0gb2ZfcmVhZF9udW1iZXIoY2VsbCsrLCAxKTsKIAl9CiAKLQlkYXRhLT5hY3RscnMgPSBhY3RscnM7Ci0JZGF0YS0+YWN0bHJfdGJsX3NpemUgPSBsZW47CisJZGF0YS0+ZXJyYXRhMV9jbGllbnRzID0gc21yczsKKwlkYXRhLT5udW1fZXJyYXRhMV9jbGllbnRzID0gbGVuOwogCXJldHVybiAwOwogfQogCkBAIC00NzU5LDggKzQ3NzUsNiBAQAogCXN0cnVjdCBxc21tdXY1MDBfYXJjaGRhdGEgKmRhdGE7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlpbnQgcmV0OwotCXUzMiB2YWw7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQpAQCAtNDc3NywyMyArNDc5MSwxMCBAQAogCWRhdGEtPnZlcnNpb24gPSByZWFkbF9yZWxheGVkKGRhdGEtPnRjdV9iYXNlICsgVENVX0hXX1ZFUlNJT05fSExPUzEpOwogCXNtbXUtPmFyY2hkYXRhID0gZGF0YTsKIAotCXJldCA9IHFzbW11djUwMF9yZWFkX2FjdGxyX3RibChzbW11KTsKKwlyZXQgPSBxc21tdXY1MDBfcGFyc2VfZXJyYXRhMShzbW11KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmVnID0gQVJNX1NNTVVfR1IwKHNtbXUpOwotCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnICsgQVJNX1NNTVVfR1IwX3NBQ1IpOwotCXZhbCAmPSB+QVJNX01NVTUwMF9BQ1JfQ0FDSEVfTE9DSzsKLQl3cml0ZWxfcmVsYXhlZCh2YWwsIHJlZyArIEFSTV9TTU1VX0dSMF9zQUNSKTsKLQl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyArIEFSTV9TTU1VX0dSMF9zQUNSKTsKLQkvKgotCSAqIE1vZGlmaXlpbmcgdGhlIG5vbnNlY3VyZSBjb3B5IG9mIHRoZSBzQUNSIHJlZ2lzdGVyIGlzIG9ubHkKLQkgKiBhbGxvd2VkIGlmIHBlcm1pc3Npb24gaXMgZ2l2ZW4gaW4gdGhlIHNlY3VyZSBzQUNSIHJlZ2lzdGVyLgotCSAqIEF0dGVtcHQgdG8gZGV0ZWN0IGlmIHdlIHdlcmUgYWJsZSB0byB1cGRhdGUgdGhlIHZhbHVlLgotCSAqLwotCVdBUk5fT04odmFsICYgQVJNX01NVTUwMF9BQ1JfQ0FDSEVfTE9DSyk7Ci0KLQogCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKGRldi0+b2Zfbm9kZSwgTlVMTCwgTlVMTCwgZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNDgwOSw4ICs0ODEwLDYgQEAKIHN0cnVjdCBhcm1fc21tdV9hcmNoX29wcyBxc21tdXY1MDBfYXJjaF9vcHMgPSB7CiAJLmluaXQgPSBxc21tdXY1MDBfYXJjaF9pbml0LAogCS5pb3ZhX3RvX3BoeXNfaGFyZCA9IHFzbW11djUwMF9pb3ZhX3RvX3BoeXNfaGFyZCwKLQkuaW5pdF9jb250ZXh0X2JhbmsgPSBxc21tdXY1MDBfaW5pdF9jYiwKLQkuZGV2aWNlX2dyb3VwID0gcXNtbXV2NTAwX2RldmljZV9ncm91cCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFzbW11djUwMF90YnVfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jCmluZGV4IGQ5MmEzNTIuLmRhNGQyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYwpAQCAtMjAyLDM5ICsyMDIsNTggQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW92YSAqX19hbGxvY19pb3ZhKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc2l6ZV90IHNpemUsCi0JCWRtYV9hZGRyX3QgZG1hX2xpbWl0KQorc3RhdGljIGRtYV9hZGRyX3QgaW9tbXVfZG1hX2FsbG9jX2lvdmEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAorCQlzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCBkbWFfbGltaXQsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkID0gY29va2llX2lvdmFkKGRvbWFpbik7CiAJdW5zaWduZWQgbG9uZyBzaGlmdCA9IGlvdmFfc2hpZnQoaW92YWQpOwotCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gaW92YV9hbGlnbihpb3ZhZCwgc2l6ZSkgPj4gc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBpb3ZhX2xlbiA9IHNpemUgPj4gc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBpb3ZhID0gMDsKKwlkbWFfYWRkcl90IGxpbWl0OworCisJLyoKKwkgKiBGcmVlaW5nIG5vbi1wb3dlci1vZi10d28tc2l6ZWQgYWxsb2NhdGlvbnMgYmFjayBpbnRvIHRoZSBJT1ZBIGNhY2hlcworCSAqIHdpbGwgY29tZSBiYWNrIHRvIGJpdGUgdXMgYmFkbHksIHNvIHdlIGhhdmUgdG8gd2FzdGUgYSBiaXQgb2Ygc3BhY2UKKwkgKiByb3VuZGluZyB1cCBhbnl0aGluZyBjYWNoZWFibGUgdG8gbWFrZSBzdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLiBUaGUKKwkgKiBvcmRlciBvZiB0aGUgdW5hZGp1c3RlZCBzaXplIHdpbGwgc3RpbGwgbWF0Y2ggdXBvbiBmcmVlaW5nLgorCSAqLworCWlmIChpb3ZhX2xlbiA8ICgxIDw8IChJT1ZBX1JBTkdFX0NBQ0hFX01BWF9TSVpFIC0gMSkpKQorCQlpb3ZhX2xlbiA9IHJvdW5kdXBfcG93X29mX3R3byhpb3ZhX2xlbik7CiAKIAlpZiAoZG9tYWluLT5nZW9tZXRyeS5mb3JjZV9hcGVydHVyZSkKIAkJZG1hX2xpbWl0ID0gbWluKGRtYV9saW1pdCwgZG9tYWluLT5nZW9tZXRyeS5hcGVydHVyZV9lbmQpOworCiAJLyoKLQkgKiBFbmZvcmNlIHNpemUtYWxpZ25tZW50IHRvIGJlIHNhZmUgLSB0aGVyZSBjb3VsZCBwZXJoYXBzIGJlIGFuCi0JICogYXR0cmlidXRlIHRvIGNvbnRyb2wgdGhpcyBwZXItZGV2aWNlLCBvciBhdCBsZWFzdCBwZXItZG9tYWluLi4uCisJICogRW5zdXJlIGlvdmEgaXMgd2l0aGluIHJhbmdlIHNwZWNpZmllZCBpbiBpb21tdV9kbWFfaW5pdF9kb21haW4oKS4KKwkgKiBUaGlzIGFsc28gcHJldmVudHMgdW5uZWNlc3Nhcnkgd29yayBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZW50aXJlCisJICogcmJfdHJlZS4KIAkgKi8KLQlyZXR1cm4gYWxsb2NfaW92YShpb3ZhZCwgbGVuZ3RoLCBkbWFfbGltaXQgPj4gc2hpZnQsIHRydWUpOworCWxpbWl0ID0gbWluX3QoZG1hX2FkZHJfdCwgZG1hX2xpbWl0ID4+IHNoaWZ0LCBpb3ZhZC0+ZG1hXzMyYml0X3Bmbik7CisJaW92YSA9IGFsbG9jX2lvdmFfZmFzdChpb3ZhZCwgaW92YV9sZW4sIGxpbWl0KTsKKworCXJldHVybiAoZG1hX2FkZHJfdClpb3ZhIDw8IHNoaWZ0OwogfQogCi0vKiBUaGUgSU9WQSBhbGxvY2F0b3Iga25vd3Mgd2hhdCB3ZSBtYXBwZWQsIHNvIGp1c3QgdW5tYXAgd2hhdGV2ZXIgdGhhdCB3YXMgKi8KLXN0YXRpYyB2b2lkIF9faW9tbXVfZG1hX3VubWFwKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3N0YXRpYyB2b2lkIGlvbW11X2RtYV9mcmVlX2lvdmEoc3RydWN0IGlvbW11X2RtYV9jb29raWUgKmNvb2tpZSwKKwkJZG1hX2FkZHJfdCBpb3ZhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkID0gJmNvb2tpZS0+aW92YWQ7CisJdW5zaWduZWQgbG9uZyBzaGlmdCA9IGlvdmFfc2hpZnQoaW92YWQpOworCisJZnJlZV9pb3ZhX2Zhc3QoaW92YWQsIGlvdmEgPj4gc2hpZnQsIHNpemUgPj4gc2hpZnQpOworfQorCitzdGF0aWMgdm9pZCBfX2lvbW11X2RtYV91bm1hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCXNpemVfdCBzaXplKQogewogCXN0cnVjdCBpb3ZhX2RvbWFpbiAqaW92YWQgPSBjb29raWVfaW92YWQoZG9tYWluKTsKLQl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gaW92YV9zaGlmdChpb3ZhZCk7Ci0JdW5zaWduZWQgbG9uZyBwZm4gPSBkbWFfYWRkciA+PiBzaGlmdDsKLQlzdHJ1Y3QgaW92YSAqaW92YSA9IGZpbmRfaW92YShpb3ZhZCwgcGZuKTsKLQlzaXplX3Qgc2l6ZTsKKwlzaXplX3QgaW92YV9vZmYgPSBpb3ZhX29mZnNldChpb3ZhZCwgZG1hX2FkZHIpOwogCi0JaWYgKFdBUk5fT04oIWlvdmEpKQotCQlyZXR1cm47CisJZG1hX2FkZHIgLT0gaW92YV9vZmY7CisJc2l6ZSA9IGlvdmFfYWxpZ24oaW92YWQsIHNpemUgKyBpb3ZhX29mZik7CiAKLQlzaXplID0gaW92YV9zaXplKGlvdmEpIDw8IHNoaWZ0OwotCXNpemUgLT0gaW9tbXVfdW5tYXAoZG9tYWluLCBwZm4gPDwgc2hpZnQsIHNpemUpOwotCS8qIC4uLmFuZCBpZiB3ZSBjYW4ndCwgdGhlbiBzb21ldGhpbmcgaXMgaG9ycmlibHksIGhvcnJpYmx5IHdyb25nICovCi0JV0FSTl9PTihzaXplID4gMCk7Ci0JX19mcmVlX2lvdmEoaW92YWQsIGlvdmEpOworCVdBUk5fT04oaW9tbXVfdW5tYXAoZG9tYWluLCBkbWFfYWRkciwgc2l6ZSkgIT0gc2l6ZSk7CisJaW9tbXVfZG1hX2ZyZWVfaW92YShkb21haW4tPmlvdmFfY29va2llLCBkbWFfYWRkciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW9tbXVfZG1hX2ZyZWVfcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGNvdW50KQpAQCAtMzE2LDcgKzMzNSw3IEBACiB2b2lkIGlvbW11X2RtYV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKipwYWdlcywgc2l6ZV90IHNpemUsCiAJCWRtYV9hZGRyX3QgKmhhbmRsZSkKIHsKLQlfX2lvbW11X2RtYV91bm1hcChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSwgKmhhbmRsZSk7CisJX19pb21tdV9kbWFfdW5tYXAoaW9tbXVfZ2V0X2RvbWFpbl9mb3JfZGV2KGRldiksICpoYW5kbGUsIHNpemUpOwogCV9faW9tbXVfZG1hX2ZyZWVfcGFnZXMocGFnZXMsIFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCk7CiAJKmhhbmRsZSA9IERNQV9FUlJPUl9DT0RFOwogfQpAQCAtMzQ0LDExICszNjMsMTEgQEAKIAkJdm9pZCAoKmZsdXNoX3BhZ2UpKHN0cnVjdCBkZXZpY2UgKiwgY29uc3Qgdm9pZCAqLCBwaHlzX2FkZHJfdCkpCiB7CiAJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0gaW9tbXVfZ2V0X2RvbWFpbl9mb3JfZGV2KGRldik7Ci0Jc3RydWN0IGlvdmFfZG9tYWluICppb3ZhZCA9IGNvb2tpZV9pb3ZhZChkb21haW4pOwotCXN0cnVjdCBpb3ZhICppb3ZhOworCXN0cnVjdCBpb21tdV9kbWFfY29va2llICpjb29raWUgPSBkb21haW4tPmlvdmFfY29va2llOworCXN0cnVjdCBpb3ZhX2RvbWFpbiAqaW92YWQgPSAmY29va2llLT5pb3ZhZDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCXN0cnVjdCBzZ190YWJsZSBzZ3Q7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlkbWFfYWRkcl90IGlvdmE7CiAJdW5zaWduZWQgaW50IGNvdW50LCBtaW5fc2l6ZSwgYWxsb2Nfc2l6ZXMgPSBkb21haW4tPnBnc2l6ZV9iaXRtYXA7CiAKIAkqaGFuZGxlID0gRE1BX0VSUk9SX0NPREU7CkBAIC0zNjgsMTEgKzM4NywxMSBAQAogCWlmICghcGFnZXMpCiAJCXJldHVybiBOVUxMOwogCi0JaW92YSA9IF9fYWxsb2NfaW92YShkb21haW4sIHNpemUsIGRldi0+Y29oZXJlbnRfZG1hX21hc2spOworCXNpemUgPSBpb3ZhX2FsaWduKGlvdmFkLCBzaXplKTsKKwlpb3ZhID0gaW9tbXVfZG1hX2FsbG9jX2lvdmEoZG9tYWluLCBzaXplLCBkZXYtPmNvaGVyZW50X2RtYV9tYXNrLCBkZXYpOwogCWlmICghaW92YSkKIAkJZ290byBvdXRfZnJlZV9wYWdlczsKIAotCXNpemUgPSBpb3ZhX2FsaWduKGlvdmFkLCBzaXplKTsKIAlpZiAoc2dfYWxsb2NfdGFibGVfZnJvbV9wYWdlcygmc2d0LCBwYWdlcywgY291bnQsIDAsIHNpemUsIEdGUF9LRVJORUwpKQogCQlnb3RvIG91dF9mcmVlX2lvdmE7CiAKQEAgLTM4OCwxOSArNDA3LDE4IEBACiAJCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKIAl9CiAKLQlkbWFfYWRkciA9IGlvdmFfZG1hX2FkZHIoaW92YWQsIGlvdmEpOwotCWlmIChpb21tdV9tYXBfc2coZG9tYWluLCBkbWFfYWRkciwgc2d0LnNnbCwgc2d0Lm9yaWdfbmVudHMsIHByb3QpCisJaWYgKGlvbW11X21hcF9zZyhkb21haW4sIGlvdmEsIHNndC5zZ2wsIHNndC5vcmlnX25lbnRzLCBwcm90KQogCQkJPCBzaXplKQogCQlnb3RvIG91dF9mcmVlX3NnOwogCi0JKmhhbmRsZSA9IGRtYV9hZGRyOworCSpoYW5kbGUgPSBpb3ZhOwogCXNnX2ZyZWVfdGFibGUoJnNndCk7CiAJcmV0dXJuIHBhZ2VzOwogCiBvdXRfZnJlZV9zZzoKIAlzZ19mcmVlX3RhYmxlKCZzZ3QpOwogb3V0X2ZyZWVfaW92YToKLQlfX2ZyZWVfaW92YShpb3ZhZCwgaW92YSk7CisJaW9tbXVfZG1hX2ZyZWVfaW92YShjb29raWUsIGlvdmEsIHNpemUpOwogb3V0X2ZyZWVfcGFnZXM6CiAJX19pb21tdV9kbWFfZnJlZV9wYWdlcyhwYWdlcywgY291bnQpOwogCXJldHVybiBOVUxMOwpAQCAtNDM0LDIyICs0NTIsMjIgQEAKIHN0YXRpYyBkbWFfYWRkcl90IF9faW9tbXVfZG1hX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBoeXMsCiAJCXNpemVfdCBzaXplLCBpbnQgcHJvdCkKIHsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwogCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IGlvbW11X2dldF9kb21haW5fZm9yX2RldihkZXYpOwotCXN0cnVjdCBpb3ZhX2RvbWFpbiAqaW92YWQgPSBjb29raWVfaW92YWQoZG9tYWluKTsKKwlzdHJ1Y3QgaW9tbXVfZG1hX2Nvb2tpZSAqY29va2llID0gZG9tYWluLT5pb3ZhX2Nvb2tpZTsKKwlzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkID0gJmNvb2tpZS0+aW92YWQ7CiAJc2l6ZV90IGlvdmFfb2ZmID0gaW92YV9vZmZzZXQoaW92YWQsIHBoeXMpOwotCXNpemVfdCBsZW4gPSBpb3ZhX2FsaWduKGlvdmFkLCBzaXplICsgaW92YV9vZmYpOwotCXN0cnVjdCBpb3ZhICppb3ZhID0gX19hbGxvY19pb3ZhKGRvbWFpbiwgbGVuLCBkbWFfZ2V0X21hc2soZGV2KSk7CisJZG1hX2FkZHJfdCBpb3ZhOwogCisJc2l6ZSA9IGlvdmFfYWxpZ24oaW92YWQsIHNpemUgKyBpb3ZhX29mZik7CisJaW92YSA9IGlvbW11X2RtYV9hbGxvY19pb3ZhKGRvbWFpbiwgc2l6ZSwgZG1hX2dldF9tYXNrKGRldiksIGRldik7CiAJaWYgKCFpb3ZhKQogCQlyZXR1cm4gRE1BX0VSUk9SX0NPREU7CiAKLQlkbWFfYWRkciA9IGlvdmFfZG1hX2FkZHIoaW92YWQsIGlvdmEpOwotCWlmIChpb21tdV9tYXAoZG9tYWluLCBkbWFfYWRkciwgcGh5cyAtIGlvdmFfb2ZmLCBsZW4sIHByb3QpKSB7Ci0JCV9fZnJlZV9pb3ZhKGlvdmFkLCBpb3ZhKTsKKwlpZiAoaW9tbXVfbWFwKGRvbWFpbiwgaW92YSwgcGh5cyAtIGlvdmFfb2ZmLCBzaXplLCBwcm90KSkgeworCQlpb21tdV9kbWFfZnJlZV9pb3ZhKGNvb2tpZSwgaW92YSwgc2l6ZSk7CiAJCXJldHVybiBETUFfRVJST1JfQ09ERTsKIAl9Ci0JcmV0dXJuIGRtYV9hZGRyICsgaW92YV9vZmY7CisJcmV0dXJuIGlvdmEgKyBpb3ZhX29mZjsKIH0KIAogZG1hX2FkZHJfdCBpb21tdV9kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTQ2MSw3ICs0NzksNyBAQAogdm9pZCBpb21tdV9kbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIGF0dHJzKQogewotCV9faW9tbXVfZG1hX3VubWFwKGlvbW11X2dldF9kb21haW5fZm9yX2RldihkZXYpLCBoYW5kbGUpOworCV9faW9tbXVfZG1hX3VubWFwKGlvbW11X2dldF9kb21haW5fZm9yX2RldihkZXYpLCBoYW5kbGUsIHNpemUpOwogfQogCiAvKgpAQCAtNTUwLDEwICs1NjgsMTAgQEAKIAkJaW50IG5lbnRzLCBpbnQgcHJvdCkKIHsKIAlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4gPSBpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KTsKLQlzdHJ1Y3QgaW92YV9kb21haW4gKmlvdmFkID0gY29va2llX2lvdmFkKGRvbWFpbik7Ci0Jc3RydWN0IGlvdmEgKmlvdmE7CisJc3RydWN0IGlvbW11X2RtYV9jb29raWUgKmNvb2tpZSA9IGRvbWFpbi0+aW92YV9jb29raWU7CisJc3RydWN0IGlvdmFfZG9tYWluICppb3ZhZCA9ICZjb29raWUtPmlvdmFkOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqcywgKnByZXYgPSBOVUxMOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJZG1hX2FkZHJfdCBpb3ZhOwogCXNpemVfdCBpb3ZhX2xlbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBtYXNrID0gZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KTsKIAlpbnQgaTsKQEAgLTU5Nyw3ICs2MTUsNyBAQAogCQlwcmV2ID0gczsKIAl9CiAKLQlpb3ZhID0gX19hbGxvY19pb3ZhKGRvbWFpbiwgaW92YV9sZW4sIGRtYV9nZXRfbWFzayhkZXYpKTsKKwlpb3ZhID0gaW9tbXVfZG1hX2FsbG9jX2lvdmEoZG9tYWluLCBpb3ZhX2xlbiwgZG1hX2dldF9tYXNrKGRldiksIGRldik7CiAJaWYgKCFpb3ZhKQogCQlnb3RvIG91dF9yZXN0b3JlX3NnOwogCkBAIC02MDUsMTQgKzYyMywxMyBAQAogCSAqIFdlJ2xsIGxlYXZlIGFueSBwaHlzaWNhbCBjb25jYXRlbmF0aW9uIHRvIHRoZSBJT01NVSBkcml2ZXIncwogCSAqIGltcGxlbWVudGF0aW9uIC0gaXQga25vd3MgYmV0dGVyIHRoYW4gd2UgZG8uCiAJICovCi0JZG1hX2FkZHIgPSBpb3ZhX2RtYV9hZGRyKGlvdmFkLCBpb3ZhKTsKLQlpZiAoaW9tbXVfbWFwX3NnKGRvbWFpbiwgZG1hX2FkZHIsIHNnLCBuZW50cywgcHJvdCkgPCBpb3ZhX2xlbikKKwlpZiAoaW9tbXVfbWFwX3NnKGRvbWFpbiwgaW92YSwgc2csIG5lbnRzLCBwcm90KSA8IGlvdmFfbGVuKQogCQlnb3RvIG91dF9mcmVlX2lvdmE7CiAKLQlyZXR1cm4gX19maW5hbGlzZV9zZyhkZXYsIHNnLCBuZW50cywgZG1hX2FkZHIpOworCXJldHVybiBfX2ZpbmFsaXNlX3NnKGRldiwgc2csIG5lbnRzLCBpb3ZhKTsKIAogb3V0X2ZyZWVfaW92YToKLQlfX2ZyZWVfaW92YShpb3ZhZCwgaW92YSk7CisJaW9tbXVfZG1hX2ZyZWVfaW92YShjb29raWUsIGlvdmEsIGlvdmFfbGVuKTsKIG91dF9yZXN0b3JlX3NnOgogCV9faW52YWxpZGF0ZV9zZyhzZywgbmVudHMpOwogCXJldHVybiAwOwpAQCAtNjIxLDExICs2MzgsMjEgQEAKIHZvaWQgaW9tbXVfZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCiB7CisJZG1hX2FkZHJfdCBzdGFydCwgZW5kOworCXN0cnVjdCBzY2F0dGVybGlzdCAqdG1wOworCWludCBpOwogCS8qCiAJICogVGhlIHNjYXR0ZXJsaXN0IHNlZ21lbnRzIGFyZSBtYXBwZWQgaW50byBhIHNpbmdsZQogCSAqIGNvbnRpZ3VvdXMgSU9WQSBhbGxvY2F0aW9uLCBzbyB0aGlzIGlzIGluY3JlZGlibHkgZWFzeS4KIAkgKi8KLQlfX2lvbW11X2RtYV91bm1hcChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSwgc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwlzdGFydCA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwlmb3JfZWFjaF9zZyhzZ19uZXh0KHNnKSwgdG1wLCBuZW50cyAtIDEsIGkpIHsKKwkJaWYgKHNnX2RtYV9sZW4odG1wKSA9PSAwKQorCQkJYnJlYWs7CisJCXNnID0gdG1wOworCX0KKwllbmQgPSBzZ19kbWFfYWRkcmVzcyhzZykgKyBzZ19kbWFfbGVuKHNnKTsKKwlfX2lvbW11X2RtYV91bm1hcChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIH0KIAogZG1hX2FkZHJfdCBpb21tdV9kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgcGh5cywKQEAgLTYzOCw3ICs2NjUsNyBAQAogdm9pZCBpb21tdV9kbWFfdW5tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGhhbmRsZSwKIAkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKIHsKLQlfX2lvbW11X2RtYV91bm1hcChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSwgaGFuZGxlKTsKKwlfX2lvbW11X2RtYV91bm1hcChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSwgaGFuZGxlLCBzaXplKTsKIH0KIAogaW50IGlvbW11X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKQEAgLTY2Miw3ICs2ODksNyBAQAogCXN0cnVjdCBpb21tdV9kbWFfY29va2llICpjb29raWUgPSBkb21haW4tPmlvdmFfY29va2llOwogCXN0cnVjdCBpb21tdV9kbWFfbXNpX3BhZ2UgKm1zaV9wYWdlOwogCXN0cnVjdCBpb3ZhX2RvbWFpbiAqaW92YWQgPSAmY29va2llLT5pb3ZhZDsKLQlzdHJ1Y3QgaW92YSAqaW92YTsKKwlkbWFfYWRkcl90IGlvdmE7CiAJaW50IHByb3QgPSBJT01NVV9XUklURSB8IElPTU1VX05PRVhFQyB8IElPTU1VX01NSU87CiAKIAltc2lfYWRkciAmPSB+KHBoeXNfYWRkcl90KWlvdmFfbWFzayhpb3ZhZCk7CkBAIC02NzQsMTIgKzcwMSwxMyBAQAogCWlmICghbXNpX3BhZ2UpCiAJCXJldHVybiBOVUxMOwogCi0JaW92YSA9IF9fYWxsb2NfaW92YShkb21haW4sIGlvdmFkLT5ncmFudWxlLCBkbWFfZ2V0X21hc2soZGV2KSk7CisJaW92YSA9IGlvbW11X2RtYV9hbGxvY19pb3ZhKGRvbWFpbiwgaW92YWQtPmdyYW51bGUsIGRtYV9nZXRfbWFzayhkZXYpLAorCQkJCSAgICBkZXYpOwogCWlmICghaW92YSkKIAkJZ290byBvdXRfZnJlZV9wYWdlOwogCiAJbXNpX3BhZ2UtPnBoeXMgPSBtc2lfYWRkcjsKLQltc2lfcGFnZS0+aW92YSA9IGlvdmFfZG1hX2FkZHIoaW92YWQsIGlvdmEpOworCW1zaV9wYWdlLT5pb3ZhID0gaW92YTsKIAlpZiAoaW9tbXVfbWFwKGRvbWFpbiwgbXNpX3BhZ2UtPmlvdmEsIG1zaV9hZGRyLCBpb3ZhZC0+Z3JhbnVsZSwgcHJvdCkpCiAJCWdvdG8gb3V0X2ZyZWVfaW92YTsKIApAQCAtNjg4LDcgKzcxNiw3IEBACiAJcmV0dXJuIG1zaV9wYWdlOwogCiBvdXRfZnJlZV9pb3ZhOgotCV9fZnJlZV9pb3ZhKGlvdmFkLCBpb3ZhKTsKKwlpb21tdV9kbWFfZnJlZV9pb3ZhKGNvb2tpZSwgaW92YSwgaW92YWQtPmdyYW51bGUpOwogb3V0X2ZyZWVfcGFnZToKIAlrZnJlZShtc2lfcGFnZSk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2RtYS1tYXBwaW5nLWZhc3QuYyBiL2RyaXZlcnMvaW9tbXUvZG1hLW1hcHBpbmctZmFzdC5jCmluZGV4IGI1ZTgxN2IuLjA0YTVjMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvZG1hLW1hcHBpbmctZmFzdC5jCisrKyBiL2RyaXZlcnMvaW9tbXUvZG1hLW1hcHBpbmctZmFzdC5jCkBAIC04NTUsMjkgKzg1NSwyOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hcHBpbmctPmxvY2ssIGZsYWdzKTsKIH0KIAotCiAvKioKLSAqIGZhc3Rfc21tdV9hdHRhY2hfZGV2aWNlCisgKiBmYXN0X3NtbXVfaW5pdF9tYXBwaW5nCiAgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKICAqIEBtYXBwaW5nOiBpbyBhZGRyZXNzIHNwYWNlIG1hcHBpbmcgc3RydWN0dXJlIChyZXR1cm5lZCBmcm9tCi0gKglmYXN0X3NtbXVfY3JlYXRlX21hcHBpbmcpCisgKglhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcpCiAgKgotICogQXR0YWNoZXMgc3BlY2lmaWVkIGlvIGFkZHJlc3Mgc3BhY2UgbWFwcGluZyB0byB0aGUgcHJvdmlkZWQgZGV2aWNlLAotICogdGhpcyByZXBsYWNlcyB0aGUgZG1hIG9wZXJhdGlvbnMgKGRtYV9tYXBfb3BzIHBvaW50ZXIpIHdpdGggdGhlCi0gKiBJT01NVSBhd2FyZSB2ZXJzaW9uLiBNb3JlIHRoYW4gb25lIGNsaWVudCBtaWdodCBiZSBhdHRhY2hlZCB0bwotICogdGhlIHNhbWUgaW8gYWRkcmVzcyBzcGFjZSBtYXBwaW5nLgorICogQ2FsbGVkIHRoZSBmaXJzdCB0aW1lIGEgZGV2aWNlIGlzIGF0dGFjaGVkIHRvIHRoaXMgbWFwcGluZy4KKyAqIE5vdCBmb3IgZG1hIGNsaWVudCB1c2UuCiAgKi8KLWludCBmYXN0X3NtbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCitpbnQgZmFzdF9zbW11X2luaXRfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nKQogewotCWludCBhdG9taWNfZG9tYWluID0gMTsKKwlpbnQgZXJyLCBhdG9taWNfZG9tYWluID0gMTsKIAlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4gPSBtYXBwaW5nLT5kb21haW47CiAJc3RydWN0IGlvbW11X2dyb3VwICpncm91cDsKIAlzdHJ1Y3QgaW9tbXVfcGd0YmxfaW5mbyBpbmZvOwogCXU2NCBzaXplID0gKHU2NCltYXBwaW5nLT5iaXRzIDw8IFBBR0VfU0hJRlQ7CiAKLQlpZiAobWFwcGluZy0+YmFzZSArIHNpemUgPiAoU1pfMUcgKiA0VUxMKSkKKwlpZiAobWFwcGluZy0+YmFzZSArIHNpemUgPiAoU1pfMUcgKiA0VUxMKSkgeworCQlkZXZfZXJyKGRldiwgIklvdmEgZW5kIGFkZHJlc3MgdG9vIGxhcmdlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJaWYgKGlvbW11X2RvbWFpbl9zZXRfYXR0cihkb21haW4sIERPTUFJTl9BVFRSX0FUT01JQywKIAkJCQkgICZhdG9taWNfZG9tYWluKSkKQEAgLTg5NCw1NCArODkzLDY3IEBACiAJZ3JvdXAgPSBkZXYtPmlvbW11X2dyb3VwOwogCWlmICghZ3JvdXApIHsKIAkJZGV2X2VycihkZXYsICJObyBpb21tdSBhc3NvY2lhdGVkIHdpdGggZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gcmVsZWFzZV9tYXBwaW5nOwogCX0KIAogCWlmIChpb21tdV9nZXRfZG9tYWluX2Zvcl9kZXYoZGV2KSkgewogCQlkZXZfZXJyKGRldiwgIkRldmljZSBhbHJlYWR5IGF0dGFjaGVkIHRvIG90aGVyIGlvbW11X2RvbWFpblxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJlbGVhc2VfbWFwcGluZzsKIAl9CiAKLQlpZiAoaW9tbXVfYXR0YWNoX2dyb3VwKG1hcHBpbmctPmRvbWFpbiwgZ3JvdXApKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIE5lZWQgdG8gYXR0YWNoIHByaW9yIHRvIGNhbGxpbmcgRE9NQUlOX0FUVFJfUEdUQkxfSU5GTyBhbmQgdGhlbgorCSAqIGRldGFjaCB0byBiZSBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuIEl0cyBhIGJpdCBtZXNzeS4KKwkgKi8KKwlpZiAoaW9tbXVfYXR0YWNoX2dyb3VwKG1hcHBpbmctPmRvbWFpbiwgZ3JvdXApKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmVsZWFzZV9tYXBwaW5nOworCX0KIAogCWlmIChpb21tdV9kb21haW5fZ2V0X2F0dHIoZG9tYWluLCBET01BSU5fQVRUUl9QR1RCTF9JTkZPLAogCQkJCSAgJmluZm8pKSB7CiAJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgZ2V0IHBhZ2UgdGFibGUgaW5mb1xuIik7Ci0JCWZhc3Rfc21tdV9kZXRhY2hfZGV2aWNlKGRldiwgbWFwcGluZyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGRldGFjaF9ncm91cDsKIAl9CiAJbWFwcGluZy0+ZmFzdC0+cGd0YmxfcG1kcyA9IGluZm8ucG1kczsKIAogCWlmIChpb21tdV9kb21haW5fZ2V0X2F0dHIoZG9tYWluLCBET01BSU5fQVRUUl9QQUdFX1RBQkxFX0lTX0NPSEVSRU5ULAotCQkJCSAgJm1hcHBpbmctPmZhc3QtPmlzX3NtbXVfcHRfY29oZXJlbnQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkgICZtYXBwaW5nLT5mYXN0LT5pc19zbW11X3B0X2NvaGVyZW50KSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGRldGFjaF9ncm91cDsKKwl9CiAKIAltYXBwaW5nLT5mYXN0LT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gZmFzdF9zbW11X25vdGlmeTsKIAlhdjhsX3JlZ2lzdGVyX25vdGlmeSgmbWFwcGluZy0+ZmFzdC0+bm90aWZpZXIpOwogCi0JZGV2LT5hcmNoZGF0YS5tYXBwaW5nID0gbWFwcGluZzsKLQlzZXRfZG1hX29wcyhkZXYsICZmYXN0X3NtbXVfZG1hX29wcyk7Ci0KKwlpb21tdV9kZXRhY2hfZ3JvdXAobWFwcGluZy0+ZG9tYWluLCBncm91cCk7CisJbWFwcGluZy0+b3BzID0gJmZhc3Rfc21tdV9kbWFfb3BzOwogCXJldHVybiAwOworCitkZXRhY2hfZ3JvdXA6CisJaW9tbXVfZGV0YWNoX2dyb3VwKG1hcHBpbmctPmRvbWFpbiwgZ3JvdXApOworcmVsZWFzZV9tYXBwaW5nOgorCWtmcmVlKG1hcHBpbmctPmZhc3QtPmJpdG1hcCk7CisJa2ZyZWUobWFwcGluZy0+ZmFzdCk7CisJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0woZmFzdF9zbW11X2F0dGFjaF9kZXZpY2UpOwogCiAvKioKLSAqIGZhc3Rfc21tdV9kZXRhY2hfZGV2aWNlCi0gKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKKyAqIGZhc3Rfc21tdV9yZWxlYXNlX21hcHBpbmcKKyAqIEBrcmVmOiBkbWFfaW9tbXVfbWFwcGluZy0+a3JlZgogICoKLSAqIERldGFjaGVzIHRoZSBwcm92aWRlZCBkZXZpY2UgZnJvbSBhIHByZXZpb3VzbHkgYXR0YWNoZWQgbWFwLgotICogVGhpcyB2b2lkcyB0aGUgZG1hIG9wZXJhdGlvbnMgKGRtYV9tYXBfb3BzIHBvaW50ZXIpCisgKiBDbGVhbnMgdXAgdGhlIGdpdmVuIGlvbW11IG1hcHBpbmcuCiAgKi8KLXZvaWQgZmFzdF9zbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcpCit2b2lkIGZhc3Rfc21tdV9yZWxlYXNlX21hcHBpbmcoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0JaW9tbXVfZGV0YWNoX2dyb3VwKG1hcHBpbmctPmRvbWFpbiwgZGV2LT5pb21tdV9ncm91cCk7Ci0JZGV2LT5hcmNoZGF0YS5tYXBwaW5nID0gTlVMTDsKLQlzZXRfZG1hX29wcyhkZXYsIE5VTEwpOworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcsIGtyZWYpOwogCiAJa3ZmcmVlKG1hcHBpbmctPmZhc3QtPmJpdG1hcCk7CiAJa2ZyZWUobWFwcGluZy0+ZmFzdCk7CisJaW9tbXVfZG9tYWluX2ZyZWUobWFwcGluZy0+ZG9tYWluKTsKKwlrZnJlZShtYXBwaW5nKTsKIH0KLUVYUE9SVF9TWU1CT0woZmFzdF9zbW11X2RldGFjaF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS5jCmluZGV4IGRkZTI4NzYuLmEzNTk0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0uYworKysgYi9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLmMKQEAgLTEwMTEsNiArMTAxMSwxMSBAQAogCQlyZWcgPSAoQVJNX0xQQUVfVENSX1NIX09TIDw8IEFSTV9MUEFFX1RDUl9TSDBfU0hJRlQpIHwKIAkJCShBUk1fTFBBRV9UQ1JfUkdOX1dCV0EgPDwgQVJNX0xQQUVfVENSX0lSR04wX1NISUZUKSB8CiAJCQkoQVJNX0xQQUVfVENSX1JHTl9XQldBIDw8IEFSTV9MUEFFX1RDUl9PUkdOMF9TSElGVCk7CisJZWxzZSBpZiAoKGNmZy0+cXVpcmtzICYgSU9fUEdUQUJMRV9RVUlSS19RQ09NX1VTRV9VUFNUUkVBTV9ISU5UKSAmJgorCQkoY2ZnLT5xdWlya3MgJiBJT19QR1RBQkxFX1FVSVJLX1FTTU1VVjUwMF9OT05fU0hBUkVBQkxFKSkKKwkJcmVnID0gKEFSTV9MUEFFX1RDUl9TSF9OUyA8PCBBUk1fTFBBRV9UQ1JfU0gwX1NISUZUKSB8CisJCQkoQVJNX0xQQUVfVENSX1JHTl9OQyA8PCBBUk1fTFBBRV9UQ1JfSVJHTjBfU0hJRlQpIHwKKwkJCShBUk1fTFBBRV9UQ1JfUkdOX1dCV0EgPDwgQVJNX0xQQUVfVENSX09SR04wX1NISUZUKTsKIAllbHNlIGlmIChjZmctPnF1aXJrcyAmIElPX1BHVEFCTEVfUVVJUktfUUNPTV9VU0VfVVBTVFJFQU1fSElOVCkKIAkJcmVnID0gKEFSTV9MUEFFX1RDUl9TSF9PUyA8PCBBUk1fTFBBRV9UQ1JfU0gwX1NISUZUKSB8CiAJCQkoQVJNX0xQQUVfVENSX1JHTl9OQyA8PCBBUk1fTFBBRV9UQ1JfSVJHTjBfU0hJRlQpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS5oIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmgKaW5kZXggYTY4NmFkMC4uYjM1MDE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmgKKysrIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLmgKQEAgLTgxLDYgKzgxLDEyIEBACiAJICoKIAkgKiBJT19QR1RBQkxFX1FVSVJLX1BBR0VfVEFCTEVfQ09IRVJFTlQ6IFNldCB0aGUgcGFnZSB0YWJsZSBhcwogCSAqCWNvaGVyZW50LgorCSAqCisJICogSU9fUEdUQUJMRV9RVUlSS19RU01NVVY1MDBfTk9OX1NIQVJFQUJMRToKKwkgKglIYXZpbmcgcGFnZSB0YWJsZXMgd2hpY2ggYXJlIG5vbiBjb2hlcmVudCwgYnV0IGNhY2hlZCBpbiBhCisJICoJc3lzdGVtIGNhY2hlIHJlcXVpcmVzIFNIPU5vbi1TaGFyZWFibGUuIFRoaXMgYXBwbGllcyB0byB0aGUKKwkgKglxc21tdXY1MDAgbW9kZWwuIEZvciBkYXRhIGJ1ZmZlcnMgU0g9Tm9uLVNoYXJlYWJsZSBpcyBub3QKKwkgKglyZXF1aXJlZC4KIAkgKi8KIAkjZGVmaW5lIElPX1BHVEFCTEVfUVVJUktfQVJNX05TCQlCSVQoMCkKIAkjZGVmaW5lIElPX1BHVEFCTEVfUVVJUktfTk9fUEVSTVMJQklUKDEpCkBAIC04OCw2ICs5NCw3IEBACiAJI2RlZmluZSBJT19QR1RBQkxFX1FVSVJLX0FSTV9NVEtfNEdCCUJJVCgzKQogCSNkZWZpbmUgSU9fUEdUQUJMRV9RVUlSS19RQ09NX1VTRV9VUFNUUkVBTV9ISU5UCUJJVCg0KQogCSNkZWZpbmUgSU9fUEdUQUJMRV9RVUlSS19QQUdFX1RBQkxFX0NPSEVSRU5UIEJJVCg1KQorCSNkZWZpbmUgSU9fUEdUQUJMRV9RVUlSS19RU01NVVY1MDBfTk9OX1NIQVJFQUJMRSBCSVQoNikKIAl1bnNpZ25lZCBsb25nCQkJcXVpcmtzOwogCXVuc2lnbmVkIGxvbmcJCQlwZ3NpemVfYml0bWFwOwogCXVuc2lnbmVkIGludAkJCWlhczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW92YS5jIGIvZHJpdmVycy9pb21tdS9pb3ZhLmMKaW5kZXggZTIzMDAxYi4uNWM4OGJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pb3ZhLmMKKysrIGIvZHJpdmVycy9pb21tdS9pb3ZhLmMKQEAgLTU2LDEzICs1NiwxMyBAQAogc3RhdGljIHN0cnVjdCByYl9ub2RlICoKIF9fZ2V0X2NhY2hlZF9yYm5vZGUoc3RydWN0IGlvdmFfZG9tYWluICppb3ZhZCwgdW5zaWduZWQgbG9uZyAqbGltaXRfcGZuKQogewotCWlmICgoKmxpbWl0X3BmbiAhPSBpb3ZhZC0+ZG1hXzMyYml0X3BmbikgfHwKKwlpZiAoKCpsaW1pdF9wZm4gPiBpb3ZhZC0+ZG1hXzMyYml0X3BmbikgfHwKIAkJKGlvdmFkLT5jYWNoZWQzMl9ub2RlID09IE5VTEwpKQogCQlyZXR1cm4gcmJfbGFzdCgmaW92YWQtPnJicm9vdCk7CiAJZWxzZSB7CiAJCXN0cnVjdCByYl9ub2RlICpwcmV2X25vZGUgPSByYl9wcmV2KGlvdmFkLT5jYWNoZWQzMl9ub2RlKTsKIAkJc3RydWN0IGlvdmEgKmN1cnJfaW92YSA9Ci0JCQljb250YWluZXJfb2YoaW92YWQtPmNhY2hlZDMyX25vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKKwkJCXJiX2VudHJ5KGlvdmFkLT5jYWNoZWQzMl9ub2RlLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CiAJCSpsaW1pdF9wZm4gPSBjdXJyX2lvdmEtPnBmbl9sbyAtIDE7CiAJCXJldHVybiBwcmV2X25vZGU7CiAJfQpAQCAtODYsMTEgKzg2LDExIEBACiAJaWYgKCFpb3ZhZC0+Y2FjaGVkMzJfbm9kZSkKIAkJcmV0dXJuOwogCWN1cnIgPSBpb3ZhZC0+Y2FjaGVkMzJfbm9kZTsKLQljYWNoZWRfaW92YSA9IGNvbnRhaW5lcl9vZihjdXJyLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CisJY2FjaGVkX2lvdmEgPSByYl9lbnRyeShjdXJyLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CiAKIAlpZiAoZnJlZS0+cGZuX2xvID49IGNhY2hlZF9pb3ZhLT5wZm5fbG8pIHsKIAkJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByYl9uZXh0KCZmcmVlLT5ub2RlKTsKLQkJc3RydWN0IGlvdmEgKmlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCQlzdHJ1Y3QgaW92YSAqaW92YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKIAogCQkvKiBvbmx5IGNhY2hlIGlmIGl0J3MgYmVsb3cgMzJiaXQgcGZuICovCiAJCWlmIChub2RlICYmIGlvdmEtPnBmbl9sbyA8IGlvdmFkLT5kbWFfMzJiaXRfcGZuKQpAQCAtMTAwLDYgKzEwMCwzNCBAQAogCX0KIH0KIAorLyogSW5zZXJ0IHRoZSBpb3ZhIGludG8gZG9tYWluIHJidHJlZSBieSBob2xkaW5nIHdyaXRlciBsb2NrICovCitzdGF0aWMgdm9pZAoraW92YV9pbnNlcnRfcmJ0cmVlKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgaW92YSAqaW92YSwKKwkJICAgc3RydWN0IHJiX25vZGUgKnN0YXJ0KQoreworCXN0cnVjdCByYl9ub2RlICoqbmV3LCAqcGFyZW50ID0gTlVMTDsKKworCW5ldyA9IChzdGFydCkgPyAmc3RhcnQgOiAmKHJvb3QtPnJiX25vZGUpOworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCisJd2hpbGUgKCpuZXcpIHsKKwkJc3RydWN0IGlvdmEgKnRoaXMgPSByYl9lbnRyeSgqbmV3LCBzdHJ1Y3QgaW92YSwgbm9kZSk7CisKKwkJcGFyZW50ID0gKm5ldzsKKworCQlpZiAoaW92YS0+cGZuX2xvIDwgdGhpcy0+cGZuX2xvKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChpb3ZhLT5wZm5fbG8gPiB0aGlzLT5wZm5fbG8pCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfcmlnaHQpOworCQllbHNlIHsKKwkJCVdBUk5fT04oMSk7IC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBBZGQgbmV3IG5vZGUgYW5kIHJlYmFsYW5jZSB0cmVlLiAqLworCXJiX2xpbmtfbm9kZSgmaW92YS0+bm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmaW92YS0+bm9kZSwgcm9vdCk7Cit9CisKIC8qCiAgKiBDb21wdXRlcyB0aGUgcGFkZGluZyBzaXplIHJlcXVpcmVkLCB0byBtYWtlIHRoZSBzdGFydCBhZGRyZXNzCiAgKiBuYXR1cmFsbHkgYWxpZ25lZCBvbiB0aGUgcG93ZXItb2YtdHdvIG9yZGVyIG9mIGl0cyBzaXplCkBAIC0xMjUsNyArMTUzLDcgQEAKIAljdXJyID0gX19nZXRfY2FjaGVkX3Jibm9kZShpb3ZhZCwgJmxpbWl0X3Bmbik7CiAJcHJldiA9IGN1cnI7CiAJd2hpbGUgKGN1cnIpIHsKLQkJc3RydWN0IGlvdmEgKmN1cnJfaW92YSA9IGNvbnRhaW5lcl9vZihjdXJyLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CisJCXN0cnVjdCBpb3ZhICpjdXJyX2lvdmEgPSByYl9lbnRyeShjdXJyLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CiAKIAkJaWYgKGxpbWl0X3BmbiA8IGN1cnJfaW92YS0+cGZuX2xvKQogCQkJZ290byBtb3ZlX2xlZnQ7CkBAIC0xMzgsNyArMTY2LDcgQEAKIAkJCQlicmVhazsJLyogZm91bmQgYSBmcmVlIHNsb3QgKi8KIAkJfQogYWRqdXN0X2xpbWl0X3BmbjoKLQkJbGltaXRfcGZuID0gY3Vycl9pb3ZhLT5wZm5fbG8gLSAxOworCQlsaW1pdF9wZm4gPSBjdXJyX2lvdmEtPnBmbl9sbyA/IChjdXJyX2lvdmEtPnBmbl9sbyAtIDEpIDogMDsKIG1vdmVfbGVmdDoKIAkJcHJldiA9IGN1cnI7CiAJCWN1cnIgPSByYl9wcmV2KGN1cnIpOwpAQCAtMTU3LDM2ICsxODUsOCBAQAogCW5ldy0+cGZuX2xvID0gbGltaXRfcGZuIC0gKHNpemUgKyBwYWRfc2l6ZSkgKyAxOwogCW5ldy0+cGZuX2hpID0gbmV3LT5wZm5fbG8gKyBzaXplIC0gMTsKIAotCS8qIEluc2VydCB0aGUgbmV3X2lvdmEgaW50byBkb21haW4gcmJ0cmVlIGJ5IGhvbGRpbmcgd3JpdGVyIGxvY2sgKi8KLQkvKiBBZGQgbmV3IG5vZGUgYW5kIHJlYmFsYW5jZSB0cmVlLiAqLwotCXsKLQkJc3RydWN0IHJiX25vZGUgKiplbnRyeSwgKnBhcmVudCA9IE5VTEw7Ci0KLQkJLyogSWYgd2UgaGF2ZSAncHJldicsIGl0J3MgYSB2YWxpZCBwbGFjZSB0byBzdGFydCB0aGUKLQkJICAgaW5zZXJ0aW9uLiBPdGhlcndpc2UsIHN0YXJ0IGZyb20gdGhlIHJvb3QuICovCi0JCWlmIChwcmV2KQotCQkJZW50cnkgPSAmcHJldjsKLQkJZWxzZQotCQkJZW50cnkgPSAmaW92YWQtPnJicm9vdC5yYl9ub2RlOwotCi0JCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcHV0IG5ldyBub2RlICovCi0JCXdoaWxlICgqZW50cnkpIHsKLQkJCXN0cnVjdCBpb3ZhICp0aGlzID0gY29udGFpbmVyX29mKCplbnRyeSwKLQkJCQkJCQlzdHJ1Y3QgaW92YSwgbm9kZSk7Ci0JCQlwYXJlbnQgPSAqZW50cnk7Ci0KLQkJCWlmIChuZXctPnBmbl9sbyA8IHRoaXMtPnBmbl9sbykKLQkJCQllbnRyeSA9ICYoKCplbnRyeSktPnJiX2xlZnQpOwotCQkJZWxzZSBpZiAobmV3LT5wZm5fbG8gPiB0aGlzLT5wZm5fbG8pCi0JCQkJZW50cnkgPSAmKCgqZW50cnkpLT5yYl9yaWdodCk7Ci0JCQllbHNlCi0JCQkJQlVHKCk7IC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KLQkJfQotCi0JCS8qIEFkZCBuZXcgbm9kZSBhbmQgcmViYWxhbmNlIHRyZWUuICovCi0JCXJiX2xpbmtfbm9kZSgmbmV3LT5ub2RlLCBwYXJlbnQsIGVudHJ5KTsKLQkJcmJfaW5zZXJ0X2NvbG9yKCZuZXctPm5vZGUsICZpb3ZhZC0+cmJyb290KTsKLQl9CisJLyogSWYgd2UgaGF2ZSAncHJldicsIGl0J3MgYSB2YWxpZCBwbGFjZSB0byBzdGFydCB0aGUgaW5zZXJ0aW9uLiAqLworCWlvdmFfaW5zZXJ0X3JidHJlZSgmaW92YWQtPnJicm9vdCwgbmV3LCBwcmV2KTsKIAlfX2NhY2hlZF9yYm5vZGVfaW5zZXJ0X3VwZGF0ZShpb3ZhZCwgc2F2ZWRfcGZuLCBuZXcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW92YWQtPmlvdmFfcmJ0cmVlX2xvY2ssIGZsYWdzKTsKQEAgLTE5NSwyOCArMTk1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLWlvdmFfaW5zZXJ0X3JidHJlZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IGlvdmEgKmlvdmEpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipuZXcgPSAmKHJvb3QtPnJiX25vZGUpLCAqcGFyZW50ID0gTlVMTDsKLQkvKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBuZXcgbm9kZSAqLwotCXdoaWxlICgqbmV3KSB7Ci0JCXN0cnVjdCBpb3ZhICp0aGlzID0gY29udGFpbmVyX29mKCpuZXcsIHN0cnVjdCBpb3ZhLCBub2RlKTsKLQotCQlwYXJlbnQgPSAqbmV3OwotCi0JCWlmIChpb3ZhLT5wZm5fbG8gPCB0aGlzLT5wZm5fbG8pCi0JCQluZXcgPSAmKCgqbmV3KS0+cmJfbGVmdCk7Ci0JCWVsc2UgaWYgKGlvdmEtPnBmbl9sbyA+IHRoaXMtPnBmbl9sbykKLQkJCW5ldyA9ICYoKCpuZXcpLT5yYl9yaWdodCk7Ci0JCWVsc2UKLQkJCUJVRygpOyAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuICovCi0JfQotCS8qIEFkZCBuZXcgbm9kZSBhbmQgcmViYWxhbmNlIHRyZWUuICovCi0JcmJfbGlua19ub2RlKCZpb3ZhLT5ub2RlLCBwYXJlbnQsIG5ldyk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZpb3ZhLT5ub2RlLCByb290KTsKLX0KLQogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppb3ZhX2NhY2hlOwogc3RhdGljIHVuc2lnbmVkIGludCBpb3ZhX2NhY2hlX3VzZXJzOwogc3RhdGljIERFRklORV9NVVRFWChpb3ZhX2NhY2hlX211dGV4KTsKQEAgLTMxMSw3ICsyODksNyBAQAogCWFzc2VydF9zcGluX2xvY2tlZCgmaW92YWQtPmlvdmFfcmJ0cmVlX2xvY2spOwogCiAJd2hpbGUgKG5vZGUpIHsKLQkJc3RydWN0IGlvdmEgKmlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCQlzdHJ1Y3QgaW92YSAqaW92YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKIAogCQkvKiBJZiBwZm4gZmFsbHMgd2l0aGluIGlvdmEncyByYW5nZSwgcmV0dXJuIGlvdmEgKi8KIAkJaWYgKChwZm4gPj0gaW92YS0+cGZuX2xvKSAmJiAocGZuIDw9IGlvdmEtPnBmbl9oaSkpIHsKQEAgLTQ2Myw3ICs0NDEsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb3ZhZC0+aW92YV9yYnRyZWVfbG9jaywgZmxhZ3MpOwogCW5vZGUgPSByYl9maXJzdCgmaW92YWQtPnJicm9vdCk7CiAJd2hpbGUgKG5vZGUpIHsKLQkJc3RydWN0IGlvdmEgKmlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCQlzdHJ1Y3QgaW92YSAqaW92YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKIAogCQlyYl9lcmFzZShub2RlLCAmaW92YWQtPnJicm9vdCk7CiAJCWZyZWVfaW92YV9tZW0oaW92YSk7CkBAIC00NzcsNyArNDU1LDcgQEAKIF9faXNfcmFuZ2Vfb3ZlcmxhcChzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwKIAl1bnNpZ25lZCBsb25nIHBmbl9sbywgdW5zaWduZWQgbG9uZyBwZm5faGkpCiB7Ci0Jc3RydWN0IGlvdmEgKmlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCXN0cnVjdCBpb3ZhICppb3ZhID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOwogCiAJaWYgKChwZm5fbG8gPD0gaW92YS0+cGZuX2hpKSAmJiAocGZuX2hpID49IGlvdmEtPnBmbl9sbykpCiAJCXJldHVybiAxOwpAQCAtNTA2LDcgKzQ4NCw3IEBACiAKIAlpb3ZhID0gYWxsb2NfYW5kX2luaXRfaW92YShwZm5fbG8sIHBmbl9oaSk7CiAJaWYgKGlvdmEpCi0JCWlvdmFfaW5zZXJ0X3JidHJlZSgmaW92YWQtPnJicm9vdCwgaW92YSk7CisJCWlvdmFfaW5zZXJ0X3JidHJlZSgmaW92YWQtPnJicm9vdCwgaW92YSwgTlVMTCk7CiAKIAlyZXR1cm4gaW92YTsKIH0KQEAgLTU0MSw3ICs1MTksNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb3ZhZC0+aW92YV9yYnRyZWVfbG9jaywgZmxhZ3MpOwogCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZpb3ZhZC0+cmJyb290KTsgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKIAkJaWYgKF9faXNfcmFuZ2Vfb3ZlcmxhcChub2RlLCBwZm5fbG8sIHBmbl9oaSkpIHsKLQkJCWlvdmEgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOworCQkJaW92YSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBpb3ZhLCBub2RlKTsKIAkJCV9fYWRqdXN0X292ZXJsYXBfcmFuZ2UoaW92YSwgJnBmbl9sbywgJnBmbl9oaSk7CiAJCQlpZiAoKHBmbl9sbyA+PSBpb3ZhLT5wZm5fbG8pICYmCiAJCQkJKHBmbl9oaSA8PSBpb3ZhLT5wZm5faGkpKQpAQCAtNTc4LDcgKzU1Niw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZnJvbS0+aW92YV9yYnRyZWVfbG9jaywgZmxhZ3MpOwogCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZmcm9tLT5yYnJvb3QpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgewotCQlzdHJ1Y3QgaW92YSAqaW92YSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaW92YSwgbm9kZSk7CisJCXN0cnVjdCBpb3ZhICppb3ZhID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGlvdmEsIG5vZGUpOwogCQlzdHJ1Y3QgaW92YSAqbmV3X2lvdmE7CiAKIAkJbmV3X2lvdmEgPSByZXNlcnZlX2lvdmEodG8sIGlvdmEtPnBmbl9sbywgaW92YS0+cGZuX2hpKTsKQEAgLTYxMywxMSArNTkxLDExIEBACiAJcmJfZXJhc2UoJmlvdmEtPm5vZGUsICZpb3ZhZC0+cmJyb290KTsKIAogCWlmIChwcmV2KSB7Ci0JCWlvdmFfaW5zZXJ0X3JidHJlZSgmaW92YWQtPnJicm9vdCwgcHJldik7CisJCWlvdmFfaW5zZXJ0X3JidHJlZSgmaW92YWQtPnJicm9vdCwgcHJldiwgTlVMTCk7CiAJCWlvdmEtPnBmbl9sbyA9IHBmbl9sbzsKIAl9CiAJaWYgKG5leHQpIHsKLQkJaW92YV9pbnNlcnRfcmJ0cmVlKCZpb3ZhZC0+cmJyb290LCBuZXh0KTsKKwkJaW92YV9pbnNlcnRfcmJ0cmVlKCZpb3ZhZC0+cmJyb290LCBuZXh0LCBOVUxMKTsKIAkJaW92YS0+cGZuX2hpID0gcGZuX2hpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3ZhZC0+aW92YV9yYnRyZWVfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWMtY29tbW9uLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy1jb21tb24uYwppbmRleCAyOGIyNmM4Li4wNTY1MDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy1jb21tb24uYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy1jb21tb24uYwpAQCAtMTQyLDkgKzE0Miw5IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAKLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKHJvb3QsIE5VTEwsICJhdG1lbCxhdDkxcm05MjAwLXJ0YyIpOworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImF0bWVsLGF0OTFybTkyMDAtcnRjIik7CiAJaWYgKCFucCkKLQkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShyb290LCBOVUxMLAorCQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCiAJCQkJCSAgICAgImF0bWVsLGF0OTFzYW05eDUtcnRjIik7CiAKIAlpZiAoIW5wKQpAQCAtMTk2LDcgKzE5Niw2IEBACiAJCXJldHVybjsKIAogCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtYXRjaGVzLCByb290KTsKLQlvZl9ub2RlX3B1dChyb290KTsKIAogCWlmIChtYXRjaCkgewogCQl2b2lkICgqZml4dXApKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKSA9IG1hdGNoLT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLmMKaW5kZXggNzc5MDAxZS4uMDFmOTQzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCkBAIC0xMzIsNiArMTMyLDQ1IEBACiB9CiAjZW5kaWYKIAorLyoKKyAqIGdpY19zaG93X3BlbmRpbmdfaXJxIC0gU2hvd3MgdGhlIHBlbmRpbmcgaW50ZXJydXB0cworICogTm90ZTogSW50ZXJydXB0cyBzaG91bGQgYmUgZGlzYWJsZWQgb24gdGhlIGNwdSBmcm9tIHdoaWNoCisgKiB0aGlzIGlzIGNhbGxlZCB0byBnZXQgYWNjdXJhdGUgbGlzdCBvZiBwZW5kaW5nIGludGVycnVwdHMuCisgKi8KK3ZvaWQgZ2ljX3Nob3dfcGVuZGluZ19pcnFzKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXUzMiBwZW5kaW5nWzMyXSwgZW5hYmxlZDsKKwl1bnNpZ25lZCBpbnQgajsKKworCWJhc2UgPSBnaWNfZGF0YS5kaXN0X2Jhc2U7CisJZm9yIChqID0gMDsgaiAqIDMyIDwgZ2ljX2RhdGEuaXJxX25yOyBqKyspIHsKKwkJZW5hYmxlZCA9IHJlYWRsX3JlbGF4ZWQoYmFzZSArCisJCQkJCUdJQ0RfSVNFTkFCTEVSICsgaiAqIDQpOworCQlwZW5kaW5nW2pdID0gcmVhZGxfcmVsYXhlZChiYXNlICsKKwkJCQkJR0lDRF9JU1BFTkRSICsgaiAqIDQpOworCQlwZW5kaW5nW2pdICY9IGVuYWJsZWQ7CisJCXByX2VycigiUGVuZGluZyBpcnFzWyVkXSAleFxuIiwgaiwgcGVuZGluZ1tqXSk7CisJfQorfQorCisvKgorICogZ2V0X2dpY19oaWdocHJpX2lycSAtIFJldHVybnMgbmV4dCBoaWdoIHByaW9yaXR5IGludGVycnVwdCBvbiBjdXJyZW50IENQVQorICovCit1bnNpZ25lZCBpbnQgZ2V0X2dpY19oaWdocHJpX2lycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdmFsID0gcmVhZF9naWNyZWcoSUNDX0hQUElSMV9FTDEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWlmICh2YWwgPj0gMTAyMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHZhbDsKK30KKwogc3RhdGljIHZvaWQgZ2ljX2VuYWJsZV9yZWRpc3QoYm9vbCBlbmFibGUpCiB7CiAJdm9pZCBfX2lvbWVtICpyYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEta2V5c3RvbmUuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEta2V5c3RvbmUuYwppbmRleCA1NGE1ZTg3Li5lZmJjZjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1rZXlzdG9uZS5jCkBAIC0xOSw5ICsxOSw5IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CkBAIC0zOSw2ICszOSw3IEBACiAJc3RydWN0IGlycV9kb21haW4JKmlycWQ7CiAJc3RydWN0IHJlZ21hcAkJKmRldmN0cmxfcmVnczsKIAl1MzIJCQlkZXZjdHJsX29mZnNldDsKKwlyYXdfc3BpbmxvY2tfdAkJd2FfbG9jazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGtleXN0b25lX2lycV9yZWFkbChzdHJ1Y3Qga2V5c3RvbmVfaXJxX2RldmljZSAqa2lycSkKQEAgLTgzLDE3ICs4NCwxNSBAQAogCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwogfQogCi1zdGF0aWMgdm9pZCBrZXlzdG9uZV9pcnFfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCitzdGF0aWMgaXJxcmV0dXJuX3Qga2V5c3RvbmVfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqa2V5c3RvbmVfaXJxKQogewotCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfZGVzY19nZXRfaXJxKGRlc2MpOwotCXN0cnVjdCBrZXlzdG9uZV9pcnFfZGV2aWNlICpraXJxID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlzdHJ1Y3Qga2V5c3RvbmVfaXJxX2RldmljZSAqa2lycSA9IGtleXN0b25lX2lycTsKKwl1bnNpZ25lZCBsb25nIHdhX2xvY2tfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBwZW5kaW5nOwogCWludCBzcmMsIHZpcnE7CiAKIAlkZXZfZGJnKGtpcnEtPmRldiwgInN0YXJ0IGlycSAlZFxuIiwgaXJxKTsKIAotCWNoYWluZWRfaXJxX2VudGVyKGlycV9kZXNjX2dldF9jaGlwKGRlc2MpLCBkZXNjKTsKLQogCXBlbmRpbmcgPSBrZXlzdG9uZV9pcnFfcmVhZGwoa2lycSk7CiAJa2V5c3RvbmVfaXJxX3dyaXRlbChraXJxLCBwZW5kaW5nKTsKIApAQCAtMTExLDEzICsxMTAsMTUgQEAKIAkJCWlmICghdmlycSkKIAkJCQlkZXZfd2FybihraXJxLT5kZXYsICJzcHVyaW91cyBpcnEgZGV0ZWN0ZWQgaHdpcnEgJWQsIHZpcnEgJWRcbiIsCiAJCQkJCSBzcmMsIHZpcnEpOworCQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZraXJxLT53YV9sb2NrLCB3YV9sb2NrX2ZsYWdzKTsKIAkJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKKwkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZraXJxLT53YV9sb2NrLAorCQkJCQkJICAgd2FfbG9ja19mbGFncyk7CiAJCX0KIAl9CiAKLQljaGFpbmVkX2lycV9leGl0KGlycV9kZXNjX2dldF9jaGlwKGRlc2MpLCBkZXNjKTsKLQogCWRldl9kYmcoa2lycS0+ZGV2LCAiZW5kIGlycSAlZFxuIiwgaXJxKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpbnQga2V5c3RvbmVfaXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqaCwgdW5zaWduZWQgaW50IHZpcnEsCkBAIC0xODIsOSArMTgzLDE2IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCXJhd19zcGluX2xvY2tfaW5pdCgma2lycS0+d2FfbG9jayk7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBraXJxKTsKIAotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGtpcnEtPmlycSwga2V5c3RvbmVfaXJxX2hhbmRsZXIsIGtpcnEpOworCXJldCA9IHJlcXVlc3RfaXJxKGtpcnEtPmlycSwga2V5c3RvbmVfaXJxX2hhbmRsZXIsCisJCQkgIDAsIGRldl9uYW1lKGRldiksIGtpcnEpOworCWlmIChyZXQpIHsKKwkJaXJxX2RvbWFpbl9yZW1vdmUoa2lycS0+aXJxZCk7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogY2xlYXIgYWxsIHNvdXJjZSBiaXRzICovCiAJa2V5c3RvbmVfaXJxX3dyaXRlbChraXJxLCB+MHgwKTsKQEAgLTE5OSw2ICsyMDcsOCBAQAogCXN0cnVjdCBrZXlzdG9uZV9pcnFfZGV2aWNlICpraXJxID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGh3aXJxOwogCisJZnJlZV9pcnEoa2lycS0+aXJxLCBraXJxKTsKKwogCWZvciAoaHdpcnEgPSAwOyBod2lycSA8IEtFWVNUT05FX05fSVJROyBod2lycSsrKQogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycV9maW5kX21hcHBpbmcoa2lycS0+aXJxZCwgaHdpcnEpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jCmluZGV4IGMwMTc4YTEuLmQ3NDM3NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbWlwcy1naWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMKQEAgLTExMTUsOCArMTExNSwxMSBAQAogCQlnaWNfbGVuID0gcmVzb3VyY2Vfc2l6ZSgmcmVzKTsKIAl9CiAKLQlpZiAobWlwc19jbV9wcmVzZW50KCkpCisJaWYgKG1pcHNfY21fcHJlc2VudCgpKSB7CiAJCXdyaXRlX2djcl9naWNfYmFzZShnaWNfYmFzZSB8IENNX0dDUl9HSUNfQkFTRV9HSUNFTl9NU0spOworCQkvKiBFbnN1cmUgR0lDIHJlZ2lvbiBpcyBlbmFibGVkIGJlZm9yZSB0cnlpbmcgdG8gYWNjZXNzIGl0ICovCisJCV9fc3luYygpOworCX0KIAlnaWNfcHJlc2VudCA9IHRydWU7CiAKIAlfX2dpY19pbml0KGdpY19iYXNlLCBnaWNfbGVuLCBjcHVfdmVjLCAwLCBub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXhzLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW14cy5jCmluZGV4IDE3MzA0NzAuLjA1ZmE5ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXhzLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1teHMuYwpAQCAtMTMxLDEyICsxMzEsMTYgQEAKIAkuaXJxX2FjayA9IGljb2xsX2Fja19pcnEsCiAJLmlycV9tYXNrID0gaWNvbGxfbWFza19pcnEsCiAJLmlycV91bm1hc2sgPSBpY29sbF91bm1hc2tfaXJxLAorCS5mbGFncyA9IElSUUNISVBfTUFTS19PTl9TVVNQRU5EIHwKKwkJIElSUUNISVBfU0tJUF9TRVRfV0FLRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXNtOTI2MF9pY29sbF9jaGlwID0gewogCS5pcnFfYWNrID0gaWNvbGxfYWNrX2lycSwKIAkuaXJxX21hc2sgPSBhc205MjYwX21hc2tfaXJxLAogCS5pcnFfdW5tYXNrID0gYXNtOTI2MF91bm1hc2tfaXJxLAorCS5mbGFncyA9IElSUUNISVBfTUFTS19PTl9TVVNQRU5EIHwKKwkJIElSUUNISVBfU0tJUF9TRVRfV0FLRSwKIH07CiAKIGFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbl9pcnFfZW50cnkgaWNvbGxfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYwppbmRleCA5Yjg1NmUxLi5lNGM0M2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCkBAIC0xMzc5LDYgKzEzNzksNyBAQAogCQkJaWYgKGFyZykgewogCQkJCWlmIChjb3B5X2Zyb21fdXNlcihibmFtZSwgYXJncCwgc2l6ZW9mKGJuYW1lKSAtIDEpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlibmFtZVtzaXplb2YoYm5hbWUpLTFdID0gMDsKIAkJCX0gZWxzZQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPm10eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggYzE1MWM2ZC4uZjYzYTExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtMjYxMSwxMCArMjYxMSw5IEBACiAJY2hhciBuZXduYW1lWzEwXTsKIAogCWlmIChwKSB7Ci0JCS8qIFNsYXZlLU5hbWUgTVVTVCBub3QgYmUgZW1wdHkgKi8KLQkJaWYgKCFzdHJsZW4ocCArIDEpKQorCQkvKiBTbGF2ZS1OYW1lIE1VU1Qgbm90IGJlIGVtcHR5IG9yIG92ZXJmbG93ICduZXduYW1lJyAqLworCQlpZiAoc3Ryc2NweShuZXduYW1lLCBwICsgMSwgc2l6ZW9mKG5ld25hbWUpKSA8PSAwKQogCQkJcmV0dXJuIE5VTEw7Ci0JCXN0cmNweShuZXduYW1lLCBwICsgMSk7CiAJCSpwID0gMDsKIAkJLyogTWFzdGVyIG11c3QgYWxyZWFkeSBleGlzdCAqLwogCQlpZiAoIShuID0gaXNkbl9uZXRfZmluZGlmKHBhcm0pKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9wcHAuYwppbmRleCA5YzFlOGFkLi5iZjNmYmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fcHBwLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3BwcC5jCkBAIC0yMzY0LDcgKzIzNjQsNyBAQAogCQkgICAgICAgaWQpOwogCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UgewotCQlycyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX2NjcF9yZXNldF9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlycyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHBwX2NjcF9yZXNldF9zdGF0ZSksIEdGUF9BVE9NSUMpOwogCQlpZiAoIXJzKQogCQkJcmV0dXJuIE5VTEw7CiAJCXJzLT5zdGF0ZSA9IENDUFJlc2V0SWRsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXFwbnAtd2xlZC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcXBucC13bGVkLmMKaW5kZXggNTY4YzlmOS4uNWM5Yzc1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtcXBucC13bGVkLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtcXBucC13bGVkLmMKQEAgLTEyMyw2ICsxMjMsNyBAQAogI2RlZmluZSBRUE5QX1dMRURfSUxJTV9GQVVMVF9CSVQJQklUKDApCiAjZGVmaW5lIFFQTlBfV0xFRF9PVlBfRkFVTFRfQklUCQlCSVQoMSkKICNkZWZpbmUgUVBOUF9XTEVEX1NDX0ZBVUxUX0JJVAkJQklUKDIpCisjZGVmaW5lIFFQTlBfV0xFRF9PVlBfRkxUX1JUX1NUU19CSVQJQklUKDEpCiAKIC8qIHNpbmsgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFFQTlBfV0xFRF9DVVJSX1NJTktfUkVHKGIpCShiICsgMHg0NikKQEAgLTExMDMsMTQgKzExMDQsNiBAQAogCWludCByYyA9IDAsIGk7CiAJdTggcmVnID0gMCwgc2lua19jb25maWcgPSAwLCBzaW5rX3Rlc3QgPSAwLCBzaW5rX3ZhbGlkID0gMCwgaW50X3N0czsKIAotCW11dGV4X2xvY2soJndsZWQtPmxvY2spOwotCi0JLyogZGlzYWJsZSBPVlAgSVJRICovCi0JaWYgKHdsZWQtPm92cF9pcnEgPiAwICYmICF3bGVkLT5vdnBfaXJxX2Rpc2FibGVkKSB7Ci0JCWRpc2FibGVfaXJxX25vc3luYyh3bGVkLT5vdnBfaXJxKTsKLQkJd2xlZC0+b3ZwX2lycV9kaXNhYmxlZCA9IHRydWU7Ci0JfQotCiAJLyogcmVhZCBjb25maWd1cmVkIHNpbmsgY29uZmlndXJhdGlvbiAqLwogCXJjID0gcXBucF93bGVkX3JlYWRfcmVnKHdsZWQsCiAJCVFQTlBfV0xFRF9DVVJSX1NJTktfUkVHKHdsZWQtPnNpbmtfYmFzZSksICZzaW5rX2NvbmZpZyk7CkBAIC0xMjU5LDcgKzEyNTIsOCBAQAogCX0KIAogCS8qIHJlc3RvcmUgIGJyaWdodG5lc3MgKi8KLQlyYyA9IHFwbnBfd2xlZF9zZXRfbGV2ZWwod2xlZCwgd2xlZC0+Y2Rldi5icmlnaHRuZXNzKTsKKwlyYyA9IHFwbnBfd2xlZF9zZXRfbGV2ZWwod2xlZCwgIXdsZWQtPmNkZXYuYnJpZ2h0bmVzcyA/CisJCQlBVVRPX0NBTElCX0JSSUdIVE5FU1MgOiB3bGVkLT5jZGV2LmJyaWdodG5lc3MpOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IGJyaWdodG5lc3MgYWZ0ZXIgY2FsaWJyYXRpb24gcmM9JWRcbiIsCiAJCQkJCQlyYyk7CkBAIC0xMjgwLDExICsxMjc0LDYgQEAKIAkJCVFQTlBfV0xFRF9TT0ZUX1NUQVJUX0RMWV9VUyArIDEwMDApOwogCiBmYWlsZWRfY2FsaWI6Ci0JaWYgKHdsZWQtPm92cF9pcnEgPiAwICYmIHdsZWQtPm92cF9pcnFfZGlzYWJsZWQpIHsKLQkJZW5hYmxlX2lycSh3bGVkLT5vdnBfaXJxKTsKLQkJd2xlZC0+b3ZwX2lycV9kaXNhYmxlZCA9IGZhbHNlOwotCX0KLQltdXRleF91bmxvY2soJndsZWQtPmxvY2spOwogCXJldHVybiByYzsKIH0KIApAQCAtMTMyMCw2ICsxMzA5LDM4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW50IHFwbnBfd2xlZF9hdXRvX2NhbGlicmF0ZV9hdF9pbml0KHN0cnVjdCBxcG5wX3dsZWQgKndsZWQpCit7CisJaW50IHJjOworCXU4IGZhdWx0X3N0YXR1cyA9IDAsIHJ0X3N0YXR1cyA9IDA7CisKKwlpZiAoIXdsZWQtPmF1dG9fY2FsaWJfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IHFwbnBfd2xlZF9yZWFkX3JlZyh3bGVkLAorCQkJUVBOUF9XTEVEX0lOVF9SVF9TVFMod2xlZC0+Y3RybF9iYXNlKSwgJnJ0X3N0YXR1cyk7CisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVhZCBSVCBzdGF0dXMgcmM9JWRcbiIsIHJjKTsKKworCXJjID0gcXBucF93bGVkX3JlYWRfcmVnKHdsZWQsCisJCQlRUE5QX1dMRURfRkFVTFRfU1RBVFVTKHdsZWQtPmN0cmxfYmFzZSksICZmYXVsdF9zdGF0dXMpOworCWlmIChyYyA8IDApCisJCXByX2VycigiRmFpbGVkIHRvIHJlYWQgZmF1bHQgc3RhdHVzIHJjPSVkXG4iLCByYyk7CisKKwlpZiAoKHJ0X3N0YXR1cyAmIFFQTlBfV0xFRF9PVlBfRkxUX1JUX1NUU19CSVQpIHx8CisJCQkoZmF1bHRfc3RhdHVzICYgUVBOUF9XTEVEX09WUF9GQVVMVF9CSVQpKSB7CisJCW11dGV4X2xvY2soJndsZWQtPmxvY2spOworCQlyYyA9IHdsZWRfYXV0b19jYWxpYnJhdGUod2xlZCk7CisJCWlmIChyYyA8IDApCisJCQlwcl9lcnIoIkZhaWxlZCBhdXRvLWNhbGlicmF0aW9uIHJjPSVkXG4iLCByYyk7CisJCWVsc2UKKwkJCXdsZWQtPmF1dG9fY2FsaWJfZG9uZSA9IHRydWU7CisJCW11dGV4X3VubG9jaygmd2xlZC0+bG9jayk7CisJfQorCisJcmV0dXJuIHJjOworfQorCiAvKiBvdnAgaXJxIGhhbmRsZXIgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBxcG5wX3dsZWRfb3ZwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl93bGVkKQogewpAQCAtMTM0OCwxMyArMTM2OSwyNiBAQAogCWlmIChmYXVsdF9zdHMgJiBRUE5QX1dMRURfT1ZQX0ZBVUxUX0JJVCkgewogCQlpZiAod2xlZC0+YXV0b19jYWxpYl9lbmFibGVkICYmICF3bGVkLT5hdXRvX2NhbGliX2RvbmUpIHsKIAkJCWlmIChxcG5wX3dsZWRfYXV0b19jYWxfcmVxdWlyZWQod2xlZCkpIHsKLQkJCQlyYyA9IHdsZWRfYXV0b19jYWxpYnJhdGUod2xlZCk7Ci0JCQkJaWYgKHJjIDwgMCkgewotCQkJCQlwcl9lcnIoIkZhaWxlZCBhdXRvLWNhbGlicmF0aW9uIHJjPSVkXG4iLAotCQkJCQkJCXJjKTsKLQkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJCW11dGV4X2xvY2soJndsZWQtPmxvY2spOworCQkJCWlmICh3bGVkLT5vdnBfaXJxID4gMCAmJgorCQkJCQkJIXdsZWQtPm92cF9pcnFfZGlzYWJsZWQpIHsKKwkJCQkJZGlzYWJsZV9pcnFfbm9zeW5jKHdsZWQtPm92cF9pcnEpOworCQkJCQl3bGVkLT5vdnBfaXJxX2Rpc2FibGVkID0gdHJ1ZTsKIAkJCQl9Ci0JCQkJd2xlZC0+YXV0b19jYWxpYl9kb25lID0gdHJ1ZTsKKworCQkJCXJjID0gd2xlZF9hdXRvX2NhbGlicmF0ZSh3bGVkKTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlwcl9lcnIoIkZhaWxlZCBhdXRvLWNhbGlicmF0aW9uIHJjPSVkXG4iLAorCQkJCQkJCQlyYyk7CisJCQkJZWxzZQorCQkJCQl3bGVkLT5hdXRvX2NhbGliX2RvbmUgPSB0cnVlOworCisJCQkJaWYgKHdsZWQtPm92cF9pcnEgPiAwICYmCisJCQkJCQl3bGVkLT5vdnBfaXJxX2Rpc2FibGVkKSB7CisJCQkJCWVuYWJsZV9pcnEod2xlZC0+b3ZwX2lycSk7CisJCQkJCXdsZWQtPm92cF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJCQl9CisJCQkJbXV0ZXhfdW5sb2NrKCZ3bGVkLT5sb2NrKTsKIAkJCX0KIAkJfQogCX0KQEAgLTE5NDYsNiArMTk4MCwxMCBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJcmMgPSBxcG5wX3dsZWRfYXV0b19jYWxpYnJhdGVfYXRfaW5pdCh3bGVkKTsKKwlpZiAocmMgPCAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byBhdXRvLWNhbGlicmF0ZSBhdCBpbml0IHJjPSVkXG4iLCByYyk7CisKIAkvKiBzZXR1cCBvdnAgYW5kIHNjIGlycXMgKi8KIAlpZiAod2xlZC0+b3ZwX2lycSA+PSAwKSB7CiAJCXJjID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmd2xlZC0+cGRldi0+ZGV2LCB3bGVkLT5vdnBfaXJxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtcXBucC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcXBucC5jCmluZGV4IDgxN2RmYTMuLmUzY2ZmZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXFwbnAuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1xcG5wLmMKQEAgLTg3NSw2ICs4NzUsMTQgQEAKIAkJfQogCQlpZiAobGVkLT5tcHBfY2ZnLT5wd21fbW9kZSA9PSBQV01fTU9ERSkgewogCQkJLypjb25maWcgcHdtIGZvciBicmlnaHRuZXNzIHNjYWxpbmcqLworCQkJcmMgPSBwd21fY2hhbmdlX21vZGUobGVkLT5tcHBfY2ZnLT5wd21fY2ZnLT5wd21fZGV2LAorCQkJCQlQTV9QV01fTU9ERV9QV00pOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWRldl9lcnIoJmxlZC0+cGRldi0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIHNldCBQV00gbW9kZSwgcmMgPSAlZFxuIiwKKwkJCQkJcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KIAkJCXBlcmlvZF91cyA9IGxlZC0+bXBwX2NmZy0+cHdtX2NmZy0+cHdtX3BlcmlvZF91czsKIAkJCWlmIChwZXJpb2RfdXMgPiBJTlRfTUFYIC8gTlNFQ19QRVJfVVNFQykgewogCQkJCWR1dHlfdXMgPSAocGVyaW9kX3VzICogbGVkLT5jZGV2LmJyaWdodG5lc3MpIC8KQEAgLTEyMTMsNyArMTIyMSw3IEBACiAKIHN0YXRpYyBpbnQgcXBucF9mbGFzaF9zZXQoc3RydWN0IHFwbnBfbGVkX2RhdGEgKmxlZCkKIHsKLQlpbnQgcmMsIGVycm9yOworCWludCByYyA9IDAsIGVycm9yOwogCWludCB2YWwgPSBsZWQtPmNkZXYuYnJpZ2h0bmVzczsKIAogCWlmIChsZWQtPmZsYXNoX2NmZy0+dG9yY2hfZW5hYmxlKQpAQCAtMTI1MSw3ICsxMjU5LDggQEAKIAkJCQl9CiAJCQl9CiAKLQkJCXFwbnBfbGVkX21hc2tlZF93cml0ZShsZWQsIEZMQVNIX01BWF9DVVJSKGxlZC0+YmFzZSksCisJCQlyYyA9IHFwbnBfbGVkX21hc2tlZF93cml0ZShsZWQsCisJCQkJRkxBU0hfTUFYX0NVUlIobGVkLT5iYXNlKSwKIAkJCQlGTEFTSF9DVVJSRU5UX01BU0ssCiAJCQkJVE9SQ0hfTUFYX0xFVkVMKTsKIAkJCWlmIChyYykgewpAQCAtMTI2MSw3ICsxMjcwLDcgQEAKIAkJCQlnb3RvIGVycm9yX3JlZ193cml0ZTsKIAkJCX0KIAotCQkJcXBucF9sZWRfbWFza2VkX3dyaXRlKGxlZCwKKwkJCXJjID0gcXBucF9sZWRfbWFza2VkX3dyaXRlKGxlZCwKIAkJCQlGTEFTSF9MRURfVE1SX0NUUkwobGVkLT5iYXNlKSwKIAkJCQlGTEFTSF9UTVJfTUFTSywKIAkJCQlGTEFTSF9UTVJfV0FUQ0hET0cpOwpAQCAtMTI5Myw3ICsxMzAyLDcgQEAKIAkJCQlnb3RvIGVycm9yX3JlZ193cml0ZTsKIAkJCX0KIAotCQkJcXBucF9sZWRfbWFza2VkX3dyaXRlKGxlZCwKKwkJCXJjID0gcXBucF9sZWRfbWFza2VkX3dyaXRlKGxlZCwKIAkJCQlGTEFTSF9XQVRDSERPR19UTVIobGVkLT5iYXNlKSwKIAkJCQlGTEFTSF9XQVRDSERPR19NQVNLLAogCQkJCWxlZC0+Zmxhc2hfY2ZnLT5kdXJhdGlvbik7CkBAIC0xMzQxLDcgKzEzNTAsNyBAQAogCQkJCWdvdG8gZXJyb3JfZmxhc2hfc2V0OwogCQkJfQogCi0JCQlxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLAorCQkJcmMgPSBxcG5wX2xlZF9tYXNrZWRfd3JpdGUobGVkLAogCQkJCUZMQVNIX0xFRF9UTVJfQ1RSTChsZWQtPmJhc2UpLAogCQkJCUZMQVNIX1RNUl9NQVNLLAogCQkJCUZMQVNIX1RNUl9TQUZFVFkpOwpAQCAtMTU4MCw2ICsxNTg5LDE0IEBACiAJCX0KIAogCQlpZiAobGVkLT5rcGRibF9jZmctPnB3bV9jZmctPm1vZGUgPT0gUFdNX01PREUpIHsKKwkJCXJjID0gcHdtX2NoYW5nZV9tb2RlKGxlZC0+a3BkYmxfY2ZnLT5wd21fY2ZnLT5wd21fZGV2LAorCQkJCQlQTV9QV01fTU9ERV9QV00pOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWRldl9lcnIoJmxlZC0+cGRldi0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIHNldCBQV00gbW9kZSwgcmMgPSAlZFxuIiwKKwkJCQkJcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KIAkJCXBlcmlvZF91cyA9IGxlZC0+a3BkYmxfY2ZnLT5wd21fY2ZnLT5wd21fcGVyaW9kX3VzOwogCQkJaWYgKHBlcmlvZF91cyA+IElOVF9NQVggLyBOU0VDX1BFUl9VU0VDKSB7CiAJCQkJZHV0eV91cyA9IChwZXJpb2RfdXMgKiBsZWQtPmNkZXYuYnJpZ2h0bmVzcykgLwpAQCAtMTcwMSw2ICsxNzE4LDE0IEBACiAJCQlsZWQtPnJnYl9jZmctPnB3bV9jZmctPm1vZGUgPQogCQkJCWxlZC0+cmdiX2NmZy0+cHdtX2NmZy0+ZGVmYXVsdF9tb2RlOwogCQlpZiAobGVkLT5yZ2JfY2ZnLT5wd21fY2ZnLT5tb2RlID09IFBXTV9NT0RFKSB7CisJCQlyYyA9IHB3bV9jaGFuZ2VfbW9kZShsZWQtPnJnYl9jZmctPnB3bV9jZmctPnB3bV9kZXYsCisJCQkJCVBNX1BXTV9NT0RFX1BXTSk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJZGV2X2VycigmbGVkLT5wZGV2LT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gc2V0IFBXTSBtb2RlLCByYyA9ICVkXG4iLAorCQkJCQlyYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQogCQkJcGVyaW9kX3VzID0gbGVkLT5yZ2JfY2ZnLT5wd21fY2ZnLT5wd21fcGVyaW9kX3VzOwogCQkJaWYgKHBlcmlvZF91cyA+IElOVF9NQVggLyBOU0VDX1BFUl9VU0VDKSB7CiAJCQkJZHV0eV91cyA9IChwZXJpb2RfdXMgKiBsZWQtPmNkZXYuYnJpZ2h0bmVzcykgLwpAQCAtMjEzNSw2ICsyMTYwLDExIEBACiAJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwd20gTFVUXG4iKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9CisJCQlyYyA9IHB3bV9jaGFuZ2VfbW9kZShwd21fY2ZnLT5wd21fZGV2LCBQTV9QV01fTU9ERV9MUEcpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzZXQgTFBHIG1vZGVcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgUFdNIGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvdHJpZ2dlci9sZWR0cmlnLWhlYXJ0YmVhdC5jIGIvZHJpdmVycy9sZWRzL3RyaWdnZXIvbGVkdHJpZy1oZWFydGJlYXQuYwppbmRleCBjOWYzODYyLi40MTBjMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvdHJpZ2dlci9sZWR0cmlnLWhlYXJ0YmVhdC5jCisrKyBiL2RyaXZlcnMvbGVkcy90cmlnZ2VyL2xlZHRyaWctaGVhcnRiZWF0LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSAiLi4vbGVkcy5oIgogCiBzdGF0aWMgaW50IHBhbmljX2hlYXJ0YmVhdHM7CkBAIC0xNTUsMzAgKzE1NCw2IEBACiAJLmRlYWN0aXZhdGUgPSBoZWFydGJlYXRfdHJpZ19kZWFjdGl2YXRlLAogfTsKIAotc3RhdGljIGludCBoZWFydGJlYXRfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQkgdW5zaWduZWQgbG9uZyBwbV9ldmVudCwgdm9pZCAqdW51c2VkKQotewotCWludCByYzsKLQotCXN3aXRjaCAocG1fZXZlbnQpIHsKLQljYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKLQljYXNlIFBNX0hJQkVSTkFUSU9OX1BSRVBBUkU6Ci0JY2FzZSBQTV9SRVNUT1JFX1BSRVBBUkU6Ci0JCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXIoJmhlYXJ0YmVhdF9sZWRfdHJpZ2dlcik7Ci0JCWJyZWFrOwotCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgotCWNhc2UgUE1fUE9TVF9ISUJFUk5BVElPTjoKLQljYXNlIFBNX1BPU1RfUkVTVE9SRToKLQkJcmMgPSBsZWRfdHJpZ2dlcl9yZWdpc3RlcigmaGVhcnRiZWF0X2xlZF90cmlnZ2VyKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJjb3VsZCBub3QgcmUtcmVnaXN0ZXIgaGVhcnRiZWF0IHRyaWdnZXJcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCiBzdGF0aWMgaW50IGhlYXJ0YmVhdF9yZWJvb3Rfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQogewpAQCAtMTkzLDEwICsxNjgsNiBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBoZWFydGJlYXRfcG1fbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBoZWFydGJlYXRfcG1fbm90aWZpZXIsCi19OwotCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGhlYXJ0YmVhdF9yZWJvb3RfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBoZWFydGJlYXRfcmVib290X25vdGlmaWVyLAogfTsKQEAgLTIxMywxNCArMTg0LDEyIEBACiAJCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKIAkJCQkJICAgICAgICZoZWFydGJlYXRfcGFuaWNfbmIpOwogCQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmhlYXJ0YmVhdF9yZWJvb3RfbmIpOwotCQlyZWdpc3Rlcl9wbV9ub3RpZmllcigmaGVhcnRiZWF0X3BtX25iKTsKIAl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaGVhcnRiZWF0X3RyaWdfZXhpdCh2b2lkKQogewotCXVucmVnaXN0ZXJfcG1fbm90aWZpZXIoJmhlYXJ0YmVhdF9wbV9uYik7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmhlYXJ0YmVhdF9yZWJvb3RfbmIpOwogCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAogCQkJCQkgJmhlYXJ0YmVhdF9wYW5pY19uYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvTWFrZWZpbGUgYi9kcml2ZXJzL21haWxib3gvTWFrZWZpbGUKaW5kZXggM2M4MTFkMy4uNjM5NDliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWFpbGJveC9NYWtlZmlsZQpAQCAtMzAsNiArMzAsNiBAQAogCiBvYmotJChDT05GSUdfQkNNX1BEQ19NQk9YKQkrPSBiY20tcGRjLW1haWxib3gubwogCi1vYmotJChDT05GSUdfUVRJX1JQTUhfTUJPWCkJKz0gcXRpLXRjcy5vCitvYmotJChDT05GSUdfUVRJX1JQTUhfTUJPWCkJKz0gcWNvbS1ycG1oLW1haWxib3gubwogCiBvYmotJChDT05GSUdfTVNNX1FNUCkJKz0gbXNtX3FtcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvbWFpbGJveC5jIGIvZHJpdmVycy9tYWlsYm94L21haWxib3guYwppbmRleCAzOTg5YmM2Li45ZjM0MGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21haWxib3gvbWFpbGJveC5jCisrKyBiL2RyaXZlcnMvbWFpbGJveC9tYWlsYm94LmMKQEAgLTExNSwxMSArMTE1LDE0IEBACiAJLyogU3VibWl0IG5leHQgbWVzc2FnZSAqLwogCW1zZ19zdWJtaXQoY2hhbik7CiAKKwlpZiAoIW1zc2cpCisJCXJldHVybjsKKwogCS8qIE5vdGlmeSB0aGUgY2xpZW50ICovCi0JaWYgKG1zc2cgJiYgY2hhbi0+Y2wtPnR4X2RvbmUpCisJaWYgKGNoYW4tPmNsLT50eF9kb25lKQogCQljaGFuLT5jbC0+dHhfZG9uZShjaGFuLT5jbCwgbXNzZywgcik7CiAKLQlpZiAoY2hhbi0+Y2wtPnR4X2Jsb2NrKQorCWlmIChyICE9IC1FVElNRSAmJiBjaGFuLT5jbC0+dHhfYmxvY2spCiAJCWNvbXBsZXRlKCZjaGFuLT50eF9jb21wbGV0ZSk7CiB9CiAKQEAgLTI3Miw3ICsyNzUsNyBAQAogCiAJbXNnX3N1Ym1pdChjaGFuKTsKIAotCWlmIChjaGFuLT5jbC0+dHhfYmxvY2sgJiYgY2hhbi0+YWN0aXZlX3JlcSkgeworCWlmIChjaGFuLT5jbC0+dHhfYmxvY2spIHsKIAkJdW5zaWduZWQgbG9uZyB3YWl0OwogCQlpbnQgcmV0OwogCkBAIC0yODMsOCArMjg2LDggQEAKIAogCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNoYW4tPnR4X2NvbXBsZXRlLCB3YWl0KTsKIAkJaWYgKHJldCA9PSAwKSB7Ci0JCQl0ID0gLUVJTzsKLQkJCXR4X3RpY2soY2hhbiwgLUVJTyk7CisJCQl0ID0gLUVUSU1FOworCQkJdHhfdGljayhjaGFuLCB0KTsKIAkJfQogCX0KIApAQCAtMjkzLDggKzI5Niw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTChtYm94X3NlbmRfbWVzc2FnZSk7CiAKIC8qKgotICogbWJveF9zZW5kX2NvbnRyb2xsZXJfZGF0YS0JRm9yIGNsaWVudCB0byBzdWJtaXQgYSBtZXNzYWdlIHRvIGJlCi0gKgkJCQlzZW50IG9ubHkgdG8gdGhlIGNvbnRyb2xsZXIuCisgKiBtYm94X3dyaXRlX2NvbnRyb2xsZXJfZGF0YSAtCUZvciBjbGllbnQgdG8gc3VibWl0IGEgbWVzc2FnZSB0byBiZQorICoJCQkJd3JpdHRlbiB0byB0aGUgY29udHJvbGxlciBidXQgbm90IHNlbnQgdG8KKyAqCQkJCXRoZSByZW1vdGUgcHJvY2Vzc29yLgogICogQGNoYW46IE1haWxib3ggY2hhbm5lbCBhc3NpZ25lZCB0byB0aGlzIGNsaWVudC4KICAqIEBtc3NnOiBDbGllbnQgc3BlY2lmaWMgbWVzc2FnZSB0eXBlY2FzdGVkLgogICoKQEAgLTMwNSw3ICszMDksNyBAQAogICoJb3IgdHJhbnNtaXNzaW9uIG92ZXIgY2hhbiAoYmxvY2tpbmcgbW9kZSkuCiAgKglOZWdhdGl2ZSB2YWx1ZSBkZW5vdGVzIGZhaWx1cmUuCiAgKi8KLWludCBtYm94X3NlbmRfY29udHJvbGxlcl9kYXRhKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4sIHZvaWQgKm1zc2cpCitpbnQgbWJveF93cml0ZV9jb250cm9sbGVyX2RhdGEoc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwgdm9pZCAqbXNzZykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CkBAIC0zMTQsMTIgKzMxOCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0JZXJyID0gY2hhbi0+bWJveC0+b3BzLT5zZW5kX2NvbnRyb2xsZXJfZGF0YShjaGFuLCBtc3NnKTsKKwllcnIgPSBjaGFuLT5tYm94LT5vcHMtPndyaXRlX2NvbnRyb2xsZXJfZGF0YShjaGFuLCBtc3NnKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChtYm94X3NlbmRfY29udHJvbGxlcl9kYXRhKTsKK0VYUE9SVF9TWU1CT0wobWJveF93cml0ZV9jb250cm9sbGVyX2RhdGEpOwogCiBib29sIG1ib3hfY29udHJvbGxlcl9pc19pZGxlKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvbXNtX3FtcC5jIGIvZHJpdmVycy9tYWlsYm94L21zbV9xbXAuYwppbmRleCBmMGJiMGJjLi5kNmU0MWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21haWxib3gvbXNtX3FtcC5jCisrKyBiL2RyaXZlcnMvbWFpbGJveC9tc21fcW1wLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNkZWZpbmUgUU1QX1ZFUlNJT04JMHgxCiAjZGVmaW5lIFFNUF9GRUFUVVJFUwkweDAKICNkZWZpbmUgUU1QX1RPVVRfTVMJNTAwMAotI2RlZmluZSBRTVBfVFhfVE9VVF9NUwkyMDAwCisjZGVmaW5lIFFNUF9UWF9UT1VUX01TCTEwMDAKIAogI2RlZmluZSBRTVBfTUJPWF9MSU5LX0RPV04JCTB4RkZGRjAwMDAKICNkZWZpbmUgUU1QX01CT1hfTElOS19VUAkJMHgwMDAwRkZGRgpAQCAtMjI5LDcgKzIyOSw3IEBACiB9CiAKIC8qKgotICogcW1wX25vdGlmeV90aW1lb3V0KCkgLSBOb3RpZnkgY2xpZW50IG9mIHR4IHRpbWVvdXQgd2l0aCAtRUlPCisgKiBxbXBfbm90aWZ5X3RpbWVvdXQoKSAtIE5vdGlmeSBjbGllbnQgb2YgdHggdGltZW91dCB3aXRoIC1FVElNRQogICogQHdvcms6CVN0cnVjdHVyZSBmb3Igd29yayB0aGF0IHdhcyBzY2hlZHVsZWQuCiAgKi8KIHN0YXRpYyB2b2lkIHFtcF9ub3RpZnlfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMzcsNyArMjM3LDcgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKIAlzdHJ1Y3QgcW1wX21ib3ggKm1ib3ggPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBxbXBfbWJveCwgZHdvcmspOwogCXN0cnVjdCBtYm94X2NoYW4gKmNoYW4gPSAmbWJveC0+Y3RybC5jaGFuc1ttYm94LT5pZHhfaW5fZmxpZ2h0XTsKLQlpbnQgZXJyID0gLUVJTzsKKwlpbnQgZXJyID0gLUVUSU1FOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWJveC0+dHhfbG9jaywgZmxhZ3MpOwpAQCAtMjQ2LDYgKzI0Niw3IEBACiAJCXJldHVybjsKIAl9CiAJcHJfZXJyKCIlczogcW1wIHR4IHRpbWVvdXQgZm9yICVkXG4iLCBfX2Z1bmNfXywgbWJveC0+aWR4X2luX2ZsaWdodCk7CisJaW93cml0ZTMyKDAsIG1ib3gtPm1kZXYtPm1zZ3JhbSArIG1ib3gtPm1jb3JlX21ib3hfb2Zmc2V0KTsKIAltYm94LT50eF9zZW50ID0gZmFsc2U7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJveC0+dHhfbG9jaywgZmxhZ3MpOwogCW1ib3hfY2hhbl90eGRvbmUoY2hhbiwgZXJyKTsKQEAgLTM1OCw3ICszNTksNyBAQAogCWFkZHIgPSBtZGV2LT5tc2dyYW0gKyBtYm94LT5tY29yZV9tYm94X29mZnNldDsKIAlpZiAobWJveC0+dHhfc2VudCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYm94LT50eF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUJVU1k7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCWlmIChwa3QtPnNpemUgKyBzaXplb2YocGt0LT5zaXplKSA+IG1ib3gtPm1jb3JlX21ib3hfc2l6ZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWlsYm94L3F0aS10Y3MuYyBiL2RyaXZlcnMvbWFpbGJveC9xY29tLXJwbWgtbWFpbGJveC5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWFpbGJveC9xdGktdGNzLmMKcmVuYW1lIHRvIGRyaXZlcnMvbWFpbGJveC9xY29tLXJwbWgtbWFpbGJveC5jCmluZGV4IGY5MjNkYjUuLjdiZjhhMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFpbGJveC9xdGktdGNzLmMKKysrIGIvZHJpdmVycy9tYWlsYm94L3Fjb20tcnBtaC1tYWlsYm94LmMKQEAgLTQxLDE0ICs0MSwxNCBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3JwbWguaD4KIAotI2RlZmluZSBUQ1NfRFJWX0lQQ19MT0dfU0laRQkJMgorI2RlZmluZSBSU0NfRFJWX0lQQ19MT0dfU0laRQkJMgogCiAjZGVmaW5lIE1BWF9DTURTX1BFUl9UQ1MJCTE2CiAjZGVmaW5lIE1BWF9UQ1NfUEVSX1RZUEUJCTMKICNkZWZpbmUgTUFYX1RDU19TTE9UUwkJCShNQVhfQ01EU19QRVJfVENTICogTUFYX1RDU19QRVJfVFlQRSkKIAotI2RlZmluZSBUQ1NfRFJWX1RDU19PRkZTRVQJCTY3MgotI2RlZmluZSBUQ1NfRFJWX0NNRF9PRkZTRVQJCTIwCisjZGVmaW5lIFJTQ19EUlZfVENTX09GRlNFVAkJNjcyCisjZGVmaW5lIFJTQ19EUlZfQ01EX09GRlNFVAkJMjAKIAogLyogRFJWIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgRFJWX1BSTlRfQ0hMRF9DT05GSUcJCTB4MEMKQEAgLTU4LDE4ICs1OCwxOCBAQAogI2RlZmluZSBEUlZfTkNQVF9TSElGVAkJCTI3CiAKIC8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgVENTX0RSVl9JUlFfRU5BQkxFCQkweDAwCi0jZGVmaW5lIFRDU19EUlZfSVJRX1NUQVRVUwkJMHgwNAotI2RlZmluZSBUQ1NfRFJWX0lSUV9DTEVBUgkJMHgwOAotI2RlZmluZSBUQ1NfRFJWX0NNRF9XQUlUX0ZPUl9DTVBMCTB4MTAKLSNkZWZpbmUgVENTX0RSVl9DT05UUk9MCQkJMHgxNAotI2RlZmluZSBUQ1NfRFJWX1NUQVRVUwkJCTB4MTgKLSNkZWZpbmUgVENTX0RSVl9DTURfRU5BQkxFCQkweDFDCi0jZGVmaW5lIFRDU19EUlZfQ01EX01TR0lECQkweDMwCi0jZGVmaW5lIFRDU19EUlZfQ01EX0FERFIJCTB4MzQKLSNkZWZpbmUgVENTX0RSVl9DTURfREFUQQkJMHgzOAotI2RlZmluZSBUQ1NfRFJWX0NNRF9TVEFUVVMJCTB4M0MKLSNkZWZpbmUgVENTX0RSVl9DTURfUkVTUF9EQVRBCQkweDQwCisjZGVmaW5lIFJTQ19EUlZfSVJRX0VOQUJMRQkJMHgwMAorI2RlZmluZSBSU0NfRFJWX0lSUV9TVEFUVVMJCTB4MDQKKyNkZWZpbmUgUlNDX0RSVl9JUlFfQ0xFQVIJCTB4MDgKKyNkZWZpbmUgUlNDX0RSVl9DTURfV0FJVF9GT1JfQ01QTAkweDEwCisjZGVmaW5lIFJTQ19EUlZfQ09OVFJPTAkJCTB4MTQKKyNkZWZpbmUgUlNDX0RSVl9TVEFUVVMJCQkweDE4CisjZGVmaW5lIFJTQ19EUlZfQ01EX0VOQUJMRQkJMHgxQworI2RlZmluZSBSU0NfRFJWX0NNRF9NU0dJRAkJMHgzMAorI2RlZmluZSBSU0NfRFJWX0NNRF9BRERSCQkweDM0CisjZGVmaW5lIFJTQ19EUlZfQ01EX0RBVEEJCTB4MzgKKyNkZWZpbmUgUlNDX0RSVl9DTURfU1RBVFVTCQkweDNDCisjZGVmaW5lIFJTQ19EUlZfQ01EX1JFU1BfREFUQQkJMHg0MAogCiAjZGVmaW5lIFRDU19BTUNfTU9ERV9FTkFCTEUJCUJJVCgxNikKICNkZWZpbmUgVENTX0FNQ19NT0RFX1RSSUdHRVIJCUJJVCgyNCkKQEAgLTkwLDEwICs5MCwxMCBAQAogI2RlZmluZSBNQVhfUE9PTF9TSVpFCQkJKE1BWF9UQ1NfUEVSX1RZUEUgKiBUQ1NfVFlQRV9OUikKICNkZWZpbmUgVENTX01fSU5JVAkJCTB4RkZGRgogCi1zdHJ1Y3QgdGNzX2RydjsKK3N0cnVjdCByc2NfZHJ2OwogCiBzdHJ1Y3QgdGNzX3Jlc3BvbnNlIHsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2OworCXN0cnVjdCByc2NfZHJ2ICpkcnY7CiAJc3RydWN0IG1ib3hfY2hhbiAqY2hhbjsKIAlzdHJ1Y3QgdGNzX21ib3hfbXNnICptc2c7CiAJdTMyIG07IC8qIG0tdGggVENTICovCkBAIC0xMTEsNyArMTExLDcgQEAKIAogLyogT25lIHBlciBUQ1MgdHlwZSBvZiBhIGNvbnRyb2xsZXIgKi8KIHN0cnVjdCB0Y3NfbWJveCB7Ci0Jc3RydWN0IHRjc19kcnYgKmRydjsKKwlzdHJ1Y3QgcnNjX2RydiAqZHJ2OwogCXUzMiAqY21kX2FkZHI7CiAJaW50IHR5cGU7CiAJdTMyIHRjc19tYXNrOwpAQCAtMTIzLDcgKzEyMyw3IEBACiB9OwogCiAvKiBPbmUgcGVyIE1CT1ggY29udHJvbGxlciAqLwotc3RydWN0IHRjc19kcnYgeworc3RydWN0IHJzY19kcnYgewogCXN0cnVjdCBtYm94X2NvbnRyb2xsZXIgbWJveDsKIAljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgX19pb21lbSAqYmFzZTsgLyogc3RhcnQgYWRkcmVzcyBvZiB0aGUgUlNDJ3MgcmVnaXN0ZXJzICovCkBAIC0xNzIsNyArMTcyLDcgQEAKIAl9IHdoaWxlICgwKQogCiAKLXN0YXRpYyBpbnQgdGNzX3Jlc3BvbnNlX3Bvb2xfaW5pdChzdHJ1Y3QgdGNzX2RydiAqZHJ2KQorc3RhdGljIGludCB0Y3NfcmVzcG9uc2VfcG9vbF9pbml0KHN0cnVjdCByc2NfZHJ2ICpkcnYpCiB7CiAJc3RydWN0IHRjc19yZXNwb25zZV9wb29sICpwb29sOwogCWludCBpOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGNzX3Jlc3BvbnNlICpzZXR1cF9yZXNwb25zZShzdHJ1Y3QgdGNzX2RydiAqZHJ2LAorc3RhdGljIHN0cnVjdCB0Y3NfcmVzcG9uc2UgKnNldHVwX3Jlc3BvbnNlKHN0cnVjdCByc2NfZHJ2ICpkcnYsCiAJCXN0cnVjdCB0Y3NfbWJveF9tc2cgKm1zZywgc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwKIAkJdTMyIG0sIGludCBlcnIpCiB7CkBAIC0yMzMsNyArMjMzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRjc19yZXNwb25zZSAqZ2V0X3Jlc3BvbnNlKHN0cnVjdCB0Y3NfZHJ2ICpkcnYsIHUzMiBtLAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNzX3Jlc3BvbnNlICpnZXRfcmVzcG9uc2Uoc3RydWN0IHJzY19kcnYgKmRydiwgdTMyIG0sCiAJCQkJCWJvb2wgZm9yX3VzZSkKIHsKIAlzdHJ1Y3QgdGNzX3Jlc3BvbnNlX3Bvb2wgKnBvb2wgPSBkcnYtPnJlc3BfcG9vbDsKQEAgLTI1OSw3ICsyNTksNyBAQAogCXJldHVybiByZXNwOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9yZXNwb25zZShzdHJ1Y3QgdGNzX2RydiAqZHJ2LCBpbnQgbSkKK3N0YXRpYyB2b2lkIHByaW50X3Jlc3BvbnNlKHN0cnVjdCByc2NfZHJ2ICpkcnYsIGludCBtKQogewogCXN0cnVjdCB0Y3NfcmVzcG9uc2UgKnJlc3A7CiAJc3RydWN0IHRjc19tYm94X21zZyAqbXNnOwpAQCAtMjg4LDE0ICsyODgsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfdGNzX3JlZyh2b2lkIF9faW9tZW0gKmJhc2UsIGludCByZWcsIGludCBtLCBpbnQgbikKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUocmVhZGxfcmVsYXhlZChiYXNlICsgcmVnICsKLQkJCVRDU19EUlZfVENTX09GRlNFVCAqIG0gKyBUQ1NfRFJWX0NNRF9PRkZTRVQgKiBuKSk7CisJCQlSU0NfRFJWX1RDU19PRkZTRVQgKiBtICsgUlNDX0RSVl9DTURfT0ZGU0VUICogbikpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdGNzX3JlZyh2b2lkIF9faW9tZW0gKmJhc2UsIGludCByZWcsIGludCBtLCBpbnQgbiwKIAkJCQl1MzIgZGF0YSkKIHsKIAl3cml0ZWxfcmVsYXhlZChjcHVfdG9fbGUzMihkYXRhKSwgYmFzZSArIHJlZyArCi0JCQlUQ1NfRFJWX1RDU19PRkZTRVQgKiBtICsgVENTX0RSVl9DTURfT0ZGU0VUICogbik7CisJCQlSU0NfRFJWX1RDU19PRkZTRVQgKiBtICsgUlNDX0RSVl9DTURfT0ZGU0VUICogbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV90Y3NfcmVnX3N5bmModm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgcmVnLCBpbnQgbSwgaW50IG4sCkBAIC0zMDksMTUgKzMwOSwxNSBAQAogCX0gd2hpbGUgKDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgdGNzX2lzX2ZyZWUoc3RydWN0IHRjc19kcnYgKmRydiwgaW50IG0pCitzdGF0aWMgaW5saW5lIGJvb2wgdGNzX2lzX2ZyZWUoc3RydWN0IHJzY19kcnYgKmRydiwgaW50IG0pCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gZHJ2LT5yZWdfYmFzZTsKIAotCXJldHVybiByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9TVEFUVVMsIG0sIDApICYmCisJcmV0dXJuIHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX1NUQVRVUywgbSwgMCkgJiYKIAkJCSFhdG9taWNfcmVhZCgmZHJ2LT50Y3NfaW5fdXNlW21dKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNzX21ib3ggKmdldF90Y3NfZnJvbV9pbmRleChzdHJ1Y3QgdGNzX2RydiAqZHJ2LCBpbnQgbSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRjc19tYm94ICpnZXRfdGNzX2Zyb21faW5kZXgoc3RydWN0IHJzY19kcnYgKmRydiwgaW50IG0pCiB7CiAJc3RydWN0IHRjc19tYm94ICp0Y3MgPSBOVUxMOwogCWludCBpOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJcmV0dXJuIHRjczsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGNzX21ib3ggKmdldF90Y3Nfb2ZfdHlwZShzdHJ1Y3QgdGNzX2RydiAqZHJ2LCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRjc19tYm94ICpnZXRfdGNzX29mX3R5cGUoc3RydWN0IHJzY19kcnYgKmRydiwgaW50IHR5cGUpCiB7CiAJaW50IGk7CiAJc3RydWN0IHRjc19tYm94ICp0Y3M7CkBAIC0zNTUsNyArMzU1LDcgQEAKIAlyZXR1cm4gdGNzOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0Y3NfbWJveCAqZ2V0X3Rjc19mb3JfbXNnKHN0cnVjdCB0Y3NfZHJ2ICpkcnYsCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0Y3NfbWJveCAqZ2V0X3Rjc19mb3JfbXNnKHN0cnVjdCByc2NfZHJ2ICpkcnYsCiAJCQkJCQlzdHJ1Y3QgdGNzX21ib3hfbXNnICptc2cpCiB7CiAJaW50IHR5cGUgPSAtMTsKQEAgLTM5NCw3ICszOTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF90Y3NfcmVzcG9uc2Uoc3RydWN0IHRjc19yZXNwb25zZSAqcmVzcCkKIHsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2ID0gcmVzcC0+ZHJ2OworCXN0cnVjdCByc2NfZHJ2ICpkcnYgPSByZXNwLT5kcnY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkcnYtPmRydl9sb2NrLCBmbGFncyk7CkBAIC00MDUsMTggKzQwNSwxOCBAQAogCXRhc2tsZXRfc2NoZWR1bGUoJmRydi0+dGFza2xldCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfdGNzX2lycShzdHJ1Y3QgdGNzX2RydiAqZHJ2LCBpbnQgbSwgYm9vbCBlbmFibGUpCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX3Rjc19pcnEoc3RydWN0IHJzY19kcnYgKmRydiwgaW50IG0sIGJvb2wgZW5hYmxlKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGRydi0+cmVnX2Jhc2U7CiAJdTMyIGRhdGE7CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3Igbm9uLUFDVElWRSBUQ1MgKi8KLQlkYXRhID0gcmVhZF90Y3NfcmVnKGJhc2UsIFRDU19EUlZfSVJRX0VOQUJMRSwgMCwgMCk7CisJZGF0YSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0lSUV9FTkFCTEUsIDAsIDApOwogCWlmIChlbmFibGUpCiAJCWRhdGEgfD0gQklUKG0pOwogCWVsc2UKIAkJZGF0YSAmPSB+QklUKG0pOwotCXdyaXRlX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9JUlFfRU5BQkxFLCAwLCAwLCBkYXRhKTsKKwl3cml0ZV90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfSVJRX0VOQUJMRSwgMCwgMCwgZGF0YSk7CiB9CiAKIC8qKgpAQCAtNDI0LDcgKzQyNCw3IEBACiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCB0Y3NfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2ID0gcDsKKwlzdHJ1Y3QgcnNjX2RydiAqZHJ2ID0gcDsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBkcnYtPnJlZ19iYXNlOwogCWludCBtLCBpOwogCXUzMiBpcnFfc3RhdHVzLCBzdHM7CkBAIC00MzQsNyArNDM0LDcgQEAKIAl1MzIgZGF0YTsKIAogCS8qIEtub3cgd2hpY2ggVENTZXMgd2VyZSB0cmlnZ2VyZWQgKi8KLQlpcnFfc3RhdHVzID0gcmVhZF90Y3NfcmVnKGJhc2UsIFRDU19EUlZfSVJRX1NUQVRVUywgMCwgMCk7CisJaXJxX3N0YXR1cyA9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0lSUV9TVEFUVVMsIDAsIDApOwogCiAJZm9yIChtID0gMDsgbSA8IGRydi0+bnVtX3RjczsgbSsrKSB7CiAJCWlmICghKGlycV9zdGF0dXMgJiAodTMyKUJJVChtKSkpCkBAIC00NTEsNyArNDUxLDcgQEAKIAkJcmVzcC0+ZXJyID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHJlc3AtPm1zZy0+bnVtX3BheWxvYWQ7IGkrKykgewogCQkJY21kID0gJnJlc3AtPm1zZy0+cGF5bG9hZFtpXTsKLQkJCXN0cyA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9TVEFUVVMsIG0sIGkpOworCQkJc3RzID0gcmVhZF90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX1NUQVRVUywgbSwgaSk7CiAJCQlpZiAoKCEoc3RzICYgQ01EX1NUQVRVU19JU1NVRUQpKSB8fAogCQkJCSgocmVzcC0+bXNnLT5pc19jb21wbGV0ZSB8fCBjbWQtPmNvbXBsZXRlKSAmJgogCQkJCSghKHN0cyAmIENNRF9TVEFUVVNfQ09NUEwpKSkpIHsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQkvKiBDaGVjayBmb3IgcmVzcG9uc2UgaWYgdGhpcyB3YXMgYSByZWFkIHJlcXVlc3QgKi8KIAkJaWYgKHJlc3AtPm1zZy0+aXNfcmVhZCkgewogCQkJLyogUmVzcG9uZCB0aGUgZGF0YSBiYWNrIGluIHRoZSBzYW1lIHJlcSBkYXRhICovCi0JCQlkYXRhID0gcmVhZF90Y3NfcmVnKGJhc2UsIFRDU19EUlZfQ01EX1JFU1BfREFUQSwgbSwgMCk7CisJCQlkYXRhID0gcmVhZF90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX1JFU1BfREFUQSwgbSwgMCk7CiAJCQlyZXNwLT5tc2ctPnBheWxvYWRbMF0uZGF0YSA9IGRhdGE7CiAJCQltYm94X2NoYW5fcmVjZWl2ZWRfZGF0YShyZXNwLT5jaGFuLCByZXNwLT5tc2cpOwogCQl9CkBAIC00NzQsMTEgKzQ3NCwxMSBAQAogCQkvKiBDbGVhciB0aGUgQU1DIG1vZGUgZm9yIG5vbi1BQ1RJVkUgVENTZXMgKi8KIAkJdGNzID0gZ2V0X3Rjc19mcm9tX2luZGV4KGRydiwgbSk7CiAJCWlmICh0Y3MgJiYgdGNzLT50eXBlICE9IEFDVElWRV9UQ1MpIHsKLQkJCWRhdGEgPSByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DT05UUk9MLCBtLCAwKTsKKwkJCWRhdGEgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DT05UUk9MLCBtLCAwKTsKIAkJCWRhdGEgJj0gflRDU19BTUNfTU9ERV9UUklHR0VSOwotCQkJd3JpdGVfdGNzX3JlZ19zeW5jKGJhc2UsIFRDU19EUlZfQ09OVFJPTCwgbSwgMCwgZGF0YSk7CisJCQl3cml0ZV90Y3NfcmVnX3N5bmMoYmFzZSwgUlNDX0RSVl9DT05UUk9MLCBtLCAwLCBkYXRhKTsKIAkJCWRhdGEgJj0gflRDU19BTUNfTU9ERV9FTkFCTEU7Ci0JCQl3cml0ZV90Y3NfcmVnKGJhc2UsIFRDU19EUlZfQ09OVFJPTCwgbSwgMCwgZGF0YSk7CisJCQl3cml0ZV90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ09OVFJPTCwgbSwgMCwgZGF0YSk7CiAJCQkvKgogCQkJICogRGlzYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgVENTIHRvIGF2b2lkIGJlaW5nCiAJCQkgKiBzcGFtbWVkIHdpdGggaW50ZXJydXB0cyBjb21pbmcgd2hlbiB0aGUgc29sdmVyCkBAIC00ODcsNyArNDg3LDcgQEAKIAkJCWVuYWJsZV90Y3NfaXJxKGRydiwgbSwgZmFsc2UpOwogCQl9IGVsc2UgewogCQkJLyogQ2xlYXIgdGhlIGVuYWJsZSBiaXQgZm9yIHRoZSBjb21tYW5kcyAqLwotCQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9FTkFCTEUsIG0sIDAsIDApOworCQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9FTkFCTEUsIG0sIDAsIDApOwogCQl9CiAKIG5vX3Jlc3A6CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJZHJ2LT50Y3NfbGFzdF9yZWN2X3RzW21dID0gYXJjaF9jb3VudGVyX2dldF9jbnR2Y3QoKTsKIAogCQkvKiBDbGVhciB0aGUgVENTIElSUSBzdGF0dXMgKi8KLQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0lSUV9DTEVBUiwgMCwgMCwgQklUKG0pKTsKKwkJd3JpdGVfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0lSUV9DTEVBUiwgMCwgMCwgQklUKG0pKTsKIAogCQkvKiBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoaXMgcmVxdWVzdCBpcyBjb21wbGV0ZWQuICovCiAJCWF0b21pY19zZXQoJmRydi0+dGNzX2luX3VzZVttXSwgMCk7CkBAIC01MTEsNyArNTExLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYm94X25vdGlmeV90eF9kb25lKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4sCiAJCQkJc3RydWN0IHRjc19tYm94X21zZyAqbXNnLCBpbnQgbSwgaW50IGVycikKIHsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKGNoYW4tPm1ib3gsIHN0cnVjdCB0Y3NfZHJ2LCBtYm94KTsKKwlzdHJ1Y3QgcnNjX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKGNoYW4tPm1ib3gsIHN0cnVjdCByc2NfZHJ2LCBtYm94KTsKIAogCWxvZ19ycG1oX25vdGlmeShkcnYsIG0sIG1zZy0+cGF5bG9hZFswXS5hZGRyLCBlcnIpOwogCW1ib3hfY2hhbl90eGRvbmUoY2hhbiwgZXJyKTsKQEAgLTUzMyw3ICs1MzMsNyBAQAogICovCiBzdGF0aWMgdm9pZCB0Y3Nfbm90aWZ5X3R4X2RvbmUodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCB0Y3NfZHJ2ICpkcnYgPSAoc3RydWN0IHRjc19kcnYgKilkYXRhOworCXN0cnVjdCByc2NfZHJ2ICpkcnYgPSAoc3RydWN0IHJzY19kcnYgKilkYXRhOwogCXN0cnVjdCB0Y3NfcmVzcG9uc2UgKnJlc3A7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNTUxLDcgKzU1MSw3IEBACiAJfSB3aGlsZSAoMSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fdGNzX2J1ZmZlcl93cml0ZShzdHJ1Y3QgdGNzX2RydiAqZHJ2LCBpbnQgZCwgaW50IG0sIGludCBuLAorc3RhdGljIHZvaWQgX190Y3NfYnVmZmVyX3dyaXRlKHN0cnVjdCByc2NfZHJ2ICpkcnYsIGludCBkLCBpbnQgbSwgaW50IG4sCiAJCQlzdHJ1Y3QgdGNzX21ib3hfbXNnICptc2csIGJvb2wgdHJpZ2dlcikKIHsKIAl1MzIgbXNnaWQsIGNtZF9tc2dpZCA9IDA7CkBAIC01NjgsNyArNTY4LDcgQEAKIAljbWRfbXNnaWQgfD0gKCFtc2ctPmlzX3JlYWQpID8gQ01EX01TR0lEX1dSSVRFIDogMDsKIAogCS8qIFJlYWQgdGhlIHNlbmQtYWZ0ZXItcHJldiBjb21wbGV0ZSBmbGFnIGZvciB0aG9zZSBhbHJlYWR5IGluIFRDUyAqLwotCWNtZF9jb21wbGV0ZSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9XQUlUX0ZPUl9DTVBMLCBtLCAwKTsKKwljbWRfY29tcGxldGUgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DTURfV0FJVF9GT1JfQ01QTCwgbSwgMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbXNnLT5udW1fcGF5bG9hZDsgaSsrKSB7CiAJCWNtZCA9ICZtc2ctPnBheWxvYWRbaV07CkBAIC01NzYsMTkgKzU3NiwxOSBAQAogCQljbWRfY29tcGxldGUgfD0gY21kLT5jb21wbGV0ZSA8PCAobiArIGkpOwogCQltc2dpZCA9IGNtZF9tc2dpZDsKIAkJbXNnaWQgfD0gKGNtZC0+Y29tcGxldGUpID8gQ01EX01TR0lEX1JFU1BfUkVRIDogMDsKLQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9NU0dJRCwgbSwgbiArIGksIG1zZ2lkKTsKLQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9BRERSLCBtLCBuICsgaSwgY21kLT5hZGRyKTsKLQkJd3JpdGVfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9EQVRBLCBtLCBuICsgaSwgY21kLT5kYXRhKTsKKwkJd3JpdGVfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9NU0dJRCwgbSwgbiArIGksIG1zZ2lkKTsKKwkJd3JpdGVfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9BRERSLCBtLCBuICsgaSwgY21kLT5hZGRyKTsKKwkJd3JpdGVfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9EQVRBLCBtLCBuICsgaSwgY21kLT5kYXRhKTsKIAkJbG9nX3NlbmRfbXNnKGRydiwgbSwgbiArIGksIG1zZ2lkLCBjbWQtPmFkZHIsCiAJCQkJCWNtZC0+ZGF0YSwgY21kLT5jb21wbGV0ZSwgdHJpZ2dlcik7CiAJfQogCiAJLyogV3JpdGUgdGhlIHNlbmQtYWZ0ZXItcHJldiBjb21wbGV0aW9uIGJpdHMgZm9yIHRoZSBiYXRjaCAqLwotCXdyaXRlX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfV0FJVF9GT1JfQ01QTCwgbSwgMCwgY21kX2NvbXBsZXRlKTsKKwl3cml0ZV90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX1dBSVRfRk9SX0NNUEwsIG0sIDAsIGNtZF9jb21wbGV0ZSk7CiAKIAkvKiBFbmFibGUgdGhlIG5ldyBjb21tYW5kcyBpbiBUQ1MgKi8KLQljbWRfZW5hYmxlIHw9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9FTkFCTEUsIG0sIDApOwotCXdyaXRlX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfRU5BQkxFLCBtLCAwLCBjbWRfZW5hYmxlKTsKKwljbWRfZW5hYmxlIHw9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9FTkFCTEUsIG0sIDApOworCXdyaXRlX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DTURfRU5BQkxFLCBtLCAwLCBjbWRfZW5hYmxlKTsKIAogCWlmICh0cmlnZ2VyKSB7CiAJCS8qCkBAIC01OTYsMzEgKzU5NiwzMSBAQAogCQkgKiBXaGlsZSBjbGVhcmluZyBlbnN1cmUgdGhhdCB0aGUgQU1DIG1vZGUgdHJpZ2dlciBpcyBjbGVhcmVkCiAJCSAqIGFuZCB0aGVuIHRoZSBtb2RlIGVuYWJsZSBpcyBjbGVhcmVkLgogCQkgKi8KLQkJZW5hYmxlID0gcmVhZF90Y3NfcmVnKGJhc2UsIFRDU19EUlZfQ09OVFJPTCwgbSwgMCk7CisJCWVuYWJsZSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NPTlRST0wsIG0sIDApOwogCQllbmFibGUgJj0gflRDU19BTUNfTU9ERV9UUklHR0VSOwotCQl3cml0ZV90Y3NfcmVnX3N5bmMoYmFzZSwgVENTX0RSVl9DT05UUk9MLCBtLCAwLCBlbmFibGUpOworCQl3cml0ZV90Y3NfcmVnX3N5bmMoYmFzZSwgUlNDX0RSVl9DT05UUk9MLCBtLCAwLCBlbmFibGUpOwogCQllbmFibGUgJj0gflRDU19BTUNfTU9ERV9FTkFCTEU7Ci0JCXdyaXRlX3Rjc19yZWdfc3luYyhiYXNlLCBUQ1NfRFJWX0NPTlRST0wsIG0sIDAsIGVuYWJsZSk7CisJCXdyaXRlX3Rjc19yZWdfc3luYyhiYXNlLCBSU0NfRFJWX0NPTlRST0wsIG0sIDAsIGVuYWJsZSk7CiAKIAkJLyogRW5hYmxlIHRoZSBBTUMgbW9kZSBvbiB0aGUgVENTIGFuZCB0aGVuIHRyaWdnZXIgdGhlIFRDUyAqLwogCQllbmFibGUgPSBUQ1NfQU1DX01PREVfRU5BQkxFOwotCQl3cml0ZV90Y3NfcmVnX3N5bmMoYmFzZSwgVENTX0RSVl9DT05UUk9MLCBtLCAwLCBlbmFibGUpOworCQl3cml0ZV90Y3NfcmVnX3N5bmMoYmFzZSwgUlNDX0RSVl9DT05UUk9MLCBtLCAwLCBlbmFibGUpOwogCQllbmFibGUgfD0gVENTX0FNQ19NT0RFX1RSSUdHRVI7Ci0JCXdyaXRlX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DT05UUk9MLCBtLCAwLCBlbmFibGUpOworCQl3cml0ZV90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ09OVFJPTCwgbSwgMCwgZW5hYmxlKTsKIAl9CiB9CiAKIC8qKgotICogdGNzX2Rydl9pc19pZGxlOiBDaGVjayBpZiBhbnkgb2YgdGhlIEFNQ3MgYXJlIGJ1c3kuCisgKiByc2NfZHJ2X2lzX2lkbGU6IENoZWNrIGlmIGFueSBvZiB0aGUgQU1DcyBhcmUgYnVzeS4KICAqCiAgKiBAbWJveDogVGhlIG1haWxib3ggY29udHJvbGxlci4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFNQ3MgYXJlIG5vdCBlbmdhZ2VkIG9yIGFic2VudC4KICAqLwotc3RhdGljIGJvb2wgdGNzX2Rydl9pc19pZGxlKHN0cnVjdCBtYm94X2NvbnRyb2xsZXIgKm1ib3gpCitzdGF0aWMgYm9vbCByc2NfZHJ2X2lzX2lkbGUoc3RydWN0IG1ib3hfY29udHJvbGxlciAqbWJveCkKIHsKIAlpbnQgbTsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKG1ib3gsIHN0cnVjdCB0Y3NfZHJ2LCBtYm94KTsKKwlzdHJ1Y3QgcnNjX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKG1ib3gsIHN0cnVjdCByc2NfZHJ2LCBtYm94KTsKIAlzdHJ1Y3QgdGNzX21ib3ggKnRjcyA9IGdldF90Y3Nfb2ZfdHlwZShkcnYsIEFDVElWRV9UQ1MpOwogCiAJLyogQ2hlY2sgZm9yIFdBS0UgVENTIGlmIHRoZXJlIGFyZSBubyBBQ1RJVkUgVENTICovCkBAIC02MzQsNyArNjM0LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBjaGVja19mb3JfcmVxX2luZmxpZ2h0KHN0cnVjdCB0Y3NfZHJ2ICpkcnYsIHN0cnVjdCB0Y3NfbWJveCAqdGNzLAorc3RhdGljIGludCBjaGVja19mb3JfcmVxX2luZmxpZ2h0KHN0cnVjdCByc2NfZHJ2ICpkcnYsIHN0cnVjdCB0Y3NfbWJveCAqdGNzLAogCQkJCQkJc3RydWN0IHRjc19tYm94X21zZyAqbXNnKQogewogCXUzMiBjdXJyX2VuYWJsZWQsIGFkZHI7CkBAIC02NDYsMTMgKzY0NiwxMyBAQAogCQlpZiAodGNzX2lzX2ZyZWUoZHJ2LCBtKSkKIAkJCWNvbnRpbnVlOwogCi0JCWN1cnJfZW5hYmxlZCA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9FTkFCTEUsIG0sIDApOworCQljdXJyX2VuYWJsZWQgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DTURfRU5BQkxFLCBtLCAwKTsKIAogCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NNRFNfUEVSX1RDUzsgaisrKSB7CiAJCQlpZiAoIShjdXJyX2VuYWJsZWQgJiAodTMyKUJJVChqKSkpCiAJCQkJY29udGludWU7CiAKLQkJCWFkZHIgPSByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfQUREUiwgbSwgaik7CisJCQlhZGRyID0gcmVhZF90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX0FERFIsIG0sIGopOwogCQkJZm9yIChrID0gMDsgayA8IG1zZy0+bnVtX3BheWxvYWQ7IGsrKykgewogCQkJCWlmIChhZGRyID09IG1zZy0+cGF5bG9hZFtrXS5hZGRyKQogCQkJCQlyZXR1cm4gLUVCVVNZOwpAQCAtNzM0LDcgKzczNCw3IEBACiBzdGF0aWMgaW50IHRjc19tYm94X3dyaXRlKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4sIHN0cnVjdCB0Y3NfbWJveF9tc2cgKm1zZywKIAkJCQlib29sIHRyaWdnZXIpCiB7Ci0Jc3RydWN0IHRjc19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihjaGFuLT5tYm94LCBzdHJ1Y3QgdGNzX2RydiwgbWJveCk7CisJc3RydWN0IHJzY19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihjaGFuLT5tYm94LCBzdHJ1Y3QgcnNjX2RydiwgbWJveCk7CiAJaW50IGQgPSBkcnYtPmRydl9pZDsKIAlzdHJ1Y3QgdGNzX21ib3ggKnRjczsKIAlpbnQgaSwgc2xvdCwgb2Zmc2V0LCBtLCBuLCByZXQ7CkBAIC04MDQsMTIgKzgwNCwxMiBAQAogCiBzdGF0aWMgdm9pZCBfX3Rjc19idWZmZXJfaW52YWxpZGF0ZSh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBtKQogewotCXdyaXRlX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfRU5BQkxFLCBtLCAwLCAwKTsKKwl3cml0ZV90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX0VOQUJMRSwgbSwgMCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgdGNzX21ib3hfaW52YWxpZGF0ZShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQogewotCXN0cnVjdCB0Y3NfZHJ2ICpkcnYgPSBjb250YWluZXJfb2YoY2hhbi0+bWJveCwgc3RydWN0IHRjc19kcnYsIG1ib3gpOworCXN0cnVjdCByc2NfZHJ2ICpkcnYgPSBjb250YWluZXJfb2YoY2hhbi0+bWJveCwgc3RydWN0IHJzY19kcnYsIG1ib3gpOwogCXN0cnVjdCB0Y3NfbWJveCAqdGNzOwogCWludCBtLCBpOwogCWludCBpbnZfdHlwZXNbXSA9IHsgV0FLRV9UQ1MsIFNMRUVQX1RDUyB9OwpAQCAtODM4LDcgKzgzOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3Rjc19yZWdzKHN0cnVjdCB0Y3NfZHJ2ICpkcnYsIGludCBtKQorc3RhdGljIHZvaWQgcHJpbnRfdGNzX3JlZ3Moc3RydWN0IHJzY19kcnYgKmRydiwgaW50IG0pCiB7CiAJaW50IG47CiAJc3RydWN0IHRjc19tYm94ICp0Y3MgPSBnZXRfdGNzX2Zyb21faW5kZXgoZHJ2LCBtKTsKQEAgLTg0OCwxNSArODQ4LDE1IEBACiAJaWYgKCF0Y3MgfHwgdGNzX2lzX2ZyZWUoZHJ2LCBtKSkKIAkJcmV0dXJuOwogCi0JZW5hYmxlID0gcmVhZF90Y3NfcmVnKGJhc2UsIFRDU19EUlZfQ01EX0VOQUJMRSwgbSwgMCk7CisJZW5hYmxlID0gcmVhZF90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfQ01EX0VOQUJMRSwgbSwgMCk7CiAJaWYgKCFlbmFibGUpCiAJCXJldHVybjsKIAogCXByX3dhcm4oIlJTQzolc1xuIiwgZHJ2LT5uYW1lKTsKIAotCXN0cyA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX1NUQVRVUywgbSwgMCk7Ci0JZGF0YSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NPTlRST0wsIG0sIDApOwotCWlycV9zdHMgPSByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9JUlFfU1RBVFVTLCAwLCAwKTsKKwlzdHMgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9TVEFUVVMsIG0sIDApOworCWRhdGEgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DT05UUk9MLCBtLCAwKTsKKwlpcnFfc3RzID0gcmVhZF90Y3NfcmVnKGJhc2UsIFJTQ19EUlZfSVJRX1NUQVRVUywgMCwgMCk7CiAJcHJfd2FybigiVENTPSVkIFtjdHJsci1zdHM6JXMgYW1jLW1vZGU6MHgleCBpcnEtc3RzOiVzXVxuIiwKIAkJCW0sIHN0cyA/ICJJRExFIiA6ICJCVVNZIiwgZGF0YSwKIAkJCShpcnFfc3RzICYgQklUKG0pKSA/ICJDT01QTEVURUQiIDogIlBFTkRJTkciKTsKQEAgLTg2NCwxNiArODY0LDE2IEBACiAJZm9yIChuID0gMDsgbiA8IHRjcy0+bmNwdDsgbisrKSB7CiAJCWlmICghKGVuYWJsZSAmIEJJVChuKSkpCiAJCQljb250aW51ZTsKLQkJYWRkciA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9BRERSLCBtLCBuKTsKLQkJZGF0YSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBUQ1NfRFJWX0NNRF9EQVRBLCBtLCBuKTsKLQkJbXNnaWQgPSByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfTVNHSUQsIG0sIG4pOwotCQlzdHMgPSByZWFkX3Rjc19yZWcoYmFzZSwgVENTX0RSVl9DTURfU1RBVFVTLCBtLCBuKTsKKwkJYWRkciA9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9BRERSLCBtLCBuKTsKKwkJZGF0YSA9IHJlYWRfdGNzX3JlZyhiYXNlLCBSU0NfRFJWX0NNRF9EQVRBLCBtLCBuKTsKKwkJbXNnaWQgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DTURfTVNHSUQsIG0sIG4pOworCQlzdHMgPSByZWFkX3Rjc19yZWcoYmFzZSwgUlNDX0RSVl9DTURfU1RBVFVTLCBtLCBuKTsKIAkJcHJfd2FybigiXHRDTUQ9JWQgW2FkZHI9MHgleCBkYXRhPTB4JXggaGRyPTB4JXggc3RzPTB4JXhdXG4iLAogCQkJCQkJbiwgYWRkciwgZGF0YSwgbXNnaWQsIHN0cyk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBkdW1wX3Rjc19zdGF0cyhzdHJ1Y3QgdGNzX2RydiAqZHJ2KQorc3RhdGljIHZvaWQgZHVtcF90Y3Nfc3RhdHMoc3RydWN0IHJzY19kcnYgKmRydikKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY3VyciA9IGFyY2hfY291bnRlcl9nZXRfY250dmN0KCk7CkBAIC04OTQsNyArODk0LDcgQEAKIAogc3RhdGljIHZvaWQgY2hhbl9kZWJ1ZyhzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQogewotCXN0cnVjdCB0Y3NfZHJ2ICpkcnYgPSBjb250YWluZXJfb2YoY2hhbi0+bWJveCwgc3RydWN0IHRjc19kcnYsIG1ib3gpOworCXN0cnVjdCByc2NfZHJ2ICpkcnYgPSBjb250YWluZXJfb2YoY2hhbi0+bWJveCwgc3RydWN0IHJzY19kcnYsIG1ib3gpOwogCiAJZHVtcF90Y3Nfc3RhdHMoZHJ2KTsKIH0KQEAgLTkxMiw3ICs5MTIsNyBAQAogICovCiBzdGF0aWMgaW50IGNoYW5fdGNzX3dyaXRlKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4sIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHRjc19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihjaGFuLT5tYm94LCBzdHJ1Y3QgdGNzX2RydiwgbWJveCk7CisJc3RydWN0IHJzY19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihjaGFuLT5tYm94LCBzdHJ1Y3QgcnNjX2RydiwgbWJveCk7CiAJc3RydWN0IHRjc19tYm94X21zZyAqbXNnID0gZGF0YTsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjaGFuLT5jbC0+ZGV2OwogCWludCByZXQgPSAwOwpAQCAtOTg2LDcgKzk4Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX190Y3Nfd3JpdGVfaGlkZGVuKHN0cnVjdCB0Y3NfZHJ2ICpkcnYsIGludCBkLAorc3RhdGljIHZvaWQgX190Y3Nfd3JpdGVfaGlkZGVuKHN0cnVjdCByc2NfZHJ2ICpkcnYsIGludCBkLAogCQkJCQlzdHJ1Y3QgdGNzX21ib3hfbXNnICptc2cpCiB7CiAJaW50IGk7CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogc3RhdGljIGludCB0Y3NfY29udHJvbF93cml0ZShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuLCBzdHJ1Y3QgdGNzX21ib3hfbXNnICptc2cpCiB7CiAJY29uc3Qgc3RydWN0IGRldmljZSAqZGV2ID0gY2hhbi0+Y2wtPmRldjsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKGNoYW4tPm1ib3gsIHN0cnVjdCB0Y3NfZHJ2LCBtYm94KTsKKwlzdHJ1Y3QgcnNjX2RydiAqZHJ2ID0gY29udGFpbmVyX29mKGNoYW4tPm1ib3gsIHN0cnVjdCByc2NfZHJ2LCBtYm94KTsKIAlzdHJ1Y3QgdGNzX21ib3ggKnRjczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1ib3hfY2hhbl9vcHMgbWJveF9vcHMgPSB7CiAJLnNlbmRfZGF0YSA9IGNoYW5fdGNzX3dyaXRlLAotCS5zZW5kX2NvbnRyb2xsZXJfZGF0YSA9IGNoYW5fdGNzX2N0cmxfd3JpdGUsCisJLndyaXRlX2NvbnRyb2xsZXJfZGF0YSA9IGNoYW5fdGNzX2N0cmxfd3JpdGUsCiAJLnN0YXJ0dXAgPSBjaGFuX2luaXQsCiAJLnNodXRkb3duID0gY2hhbl9zaHV0ZG93biwKIH07CkBAIC0xMDgzLDcgKzEwODMsNyBAQAogc3RhdGljIHN0cnVjdCBtYm94X2NoYW4gKm9mX3Rjc19tYm94X3hsYXRlKHN0cnVjdCBtYm94X2NvbnRyb2xsZXIgKm1ib3gsCiAJCQkJY29uc3Qgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3ApCiB7Ci0Jc3RydWN0IHRjc19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihtYm94LCBzdHJ1Y3QgdGNzX2RydiwgbWJveCk7CisJc3RydWN0IHJzY19kcnYgKmRydiA9IGNvbnRhaW5lcl9vZihtYm94LCBzdHJ1Y3QgcnNjX2RydiwgbWJveCk7CiAJc3RydWN0IG1ib3hfY2hhbiAqY2hhbjsKIAogCWlmIChkcnYtPm51bV9hc3NpZ25lZCA+PSBtYm94LT5udW1fY2hhbnMpIHsKQEAgLTEwOTcsMTEgKzEwOTcsMTEgQEAKIAlyZXR1cm4gY2hhbjsKIH0KIAotc3RhdGljIGludCB0Y3NfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHJzY19kcnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgdGNzX2RydiAqZHJ2OworCXN0cnVjdCByc2NfZHJ2ICpkcnY7CiAJc3RydWN0IG1ib3hfY2hhbiAqY2hhbnM7CiAJc3RydWN0IHRjc19tYm94ICp0Y3M7CiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBwOwpAQCAtMTE3OCwxMSArMTE3OCwxMCBAQAogCQlpZiAodGNzLT5udW1fdGNzIDw9IDAgfHwgdGNzLT50eXBlID09IENPTlRST0xfVENTKQogCQkJY29udGludWU7CiAKLQkJaWYgKHRjcy0+bnVtX3RjcyA+IE1BWF9UQ1NfUEVSX1RZUEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoc3QgKyB0Y3MtPm51bV90Y3MgPiBtYXhfdGNzICYmCi0JCQkJc3QgKyB0Y3MtPm51bV90Y3MgPj0gc2l6ZW9mKHRjcy0+dGNzX21hc2spKQorCQlpZiAodGNzLT5udW1fdGNzID4gTUFYX1RDU19QRVJfVFlQRSB8fAorCQkJc3QgKyB0Y3MtPm51bV90Y3MgPiBtYXhfdGNzIHx8CisJCQlzdCArIHRjcy0+bnVtX3RjcyA+PQorCQkJCUJJVFNfUEVSX0JZVEUgKiBzaXplb2YodGNzLT50Y3NfbWFzaykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQl0Y3MtPnRjc19tYXNrID0gKCgxIDw8IHRjcy0+bnVtX3RjcykgLSAxKSA8PCBzdDsKQEAgLTEyMzQsNyArMTIzMyw3IEBACiAJZHJ2LT5tYm94Lm51bV9jaGFucyA9IG51bV9jaGFuczsKIAlkcnYtPm1ib3gudHhkb25lX2lycSA9IHRydWU7CiAJZHJ2LT5tYm94Lm9mX3hsYXRlID0gb2ZfdGNzX21ib3hfeGxhdGU7Ci0JZHJ2LT5tYm94LmlzX2lkbGUgPSB0Y3NfZHJ2X2lzX2lkbGU7CisJZHJ2LT5tYm94LmlzX2lkbGUgPSByc2NfZHJ2X2lzX2lkbGU7CiAJZHJ2LT5tYm94LmRlYnVnID0gY2hhbl9kZWJ1ZzsKIAlkcnYtPm51bV90Y3MgPSBzdDsKIAlkcnYtPnBkZXYgPSBwZGV2OwpAQCAtMTI2MSwxMyArMTI2MCwxMyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIEFNQyBUQ1MgKi8KLQl3cml0ZV90Y3NfcmVnKGRydi0+cmVnX2Jhc2UsIFRDU19EUlZfSVJRX0VOQUJMRSwgMCwgMCwKKwl3cml0ZV90Y3NfcmVnKGRydi0+cmVnX2Jhc2UsIFJTQ19EUlZfSVJRX0VOQUJMRSwgMCwgMCwKIAkJCQkJZHJ2LT50Y3NbQUNUSVZFX1RDU10udGNzX21hc2spOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJ2LT50Y3NfaW5fdXNlKTsgaSsrKQogCQlhdG9taWNfc2V0KCZkcnYtPnRjc19pbl91c2VbaV0sIDApOwogCi0JZHJ2LT5pcGNfbG9nX2N0eCA9IGlwY19sb2dfY29udGV4dF9jcmVhdGUoVENTX0RSVl9JUENfTE9HX1NJWkUsCisJZHJ2LT5pcGNfbG9nX2N0eCA9IGlwY19sb2dfY29udGV4dF9jcmVhdGUoUlNDX0RSVl9JUENfTE9HX1NJWkUsCiAJCQkJCQlkcnYtPm5hbWUsIDApOwogCiAJcmV0ID0gbWJveF9jb250cm9sbGVyX3JlZ2lzdGVyKCZkcnYtPm1ib3gpOwpAQCAtMTI4MCwyMSArMTI3OSwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0Y3NfZHJ2X21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByc2NfZHJ2X21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHRjcy1kcnYiLCB9LAogCXsgfQogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGNzX21ib3hfZHJpdmVyID0gewotCS5wcm9iZSA9IHRjc19kcnZfcHJvYmUsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBycG1oX21ib3hfZHJpdmVyID0geworCS5wcm9iZSA9IHJzY19kcnZfcHJvYmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gdGNzX2Rydl9tYXRjaCwKKwkJLm9mX21hdGNoX3RhYmxlID0gcnNjX2Rydl9tYXRjaCwKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgdGNzX21ib3hfZHJpdmVyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHJwbWhfbWJveF9kcml2ZXJfaW5pdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRjc19tYm94X2RyaXZlcik7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcnBtaF9tYm94X2RyaXZlcik7CiB9Ci1hcmNoX2luaXRjYWxsKHRjc19tYm94X2RyaXZlcl9pbml0KTsKK2FyY2hfaW5pdGNhbGwocnBtaF9tYm94X2RyaXZlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1scGMuYyBiL2RyaXZlcnMvbWNiL21jYi1scGMuYwppbmRleCBkMDcyYzA4Li45NDUwOTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9tY2ItbHBjLmMKKysrIGIvZHJpdmVycy9tY2IvbWNiLWxwYy5jCkBAIC0xMTQsNiArMTE0LDEyIEBACiAJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNjMzFfZnBnYV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQgPSAweGYwMDBlMDAwLAorCS5lbmQgPSAweGYwMDBlMDAwICsgQ0hBTV9IRUFERVJfU0laRSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1jYl9scGNfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZSA9ICJtY2ItbHBjIiwKQEAgLTEzMiw2ICsxMzgsMTUgQEAKIAkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmc2MyNF9mcGdhX3Jlc291cmNlLAogCQkuY2FsbGJhY2sgPSBtY2JfbHBjX2NyZWF0ZV9wbGF0Zm9ybV9kZXZpY2UsCiAJfSwKKwl7CisJCS5pZGVudCA9ICJTQzMxIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNRU4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMTRTQzMxIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJnNjMzFfZnBnYV9yZXNvdXJjZSwKKwkJLmNhbGxiYWNrID0gbWNiX2xwY19jcmVhdGVfcGxhdGZvcm1fZGV2aWNlLAorCX0sCiAJe30KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgbWNiX2xwY19kbWlfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1ycS5jIGIvZHJpdmVycy9tZC9kbS1ycS5jCmluZGV4IGJjYTRjMGUuLmUyODlhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcnEuYworKysgYi9kcml2ZXJzL21kL2RtLXJxLmMKQEAgLTg0OCw4ICs4NDgsMTIgQEAKIAkJdGlvID0gdGlvX2Zyb21fcmVxdWVzdChycSk7CiAJCS8qIEVzdGFibGlzaCB0aW8tPnRpIGJlZm9yZSBxdWV1aW5nIHdvcmsgKG1hcF90aW9fcmVxdWVzdCkgKi8KIAkJdGlvLT50aSA9IHRpOwotCQlrdGhyZWFkX3F1ZXVlX3dvcmsoJm1kLT5rd29ya2VyLCAmdGlvLT53b3JrKTsKKwkJc3Bpbl91bmxvY2socS0+cXVldWVfbG9jayk7CisJCWlmIChtYXBfcmVxdWVzdCh0aW8pID09IERNX01BUElPX1JFUVVFVUUpCisJCQlkbV9yZXF1ZXVlX29yaWdpbmFsX3JlcXVlc3QodGlvLCBmYWxzZSk7CisKIAkJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOworCQlzcGluX2xvY2socS0+cXVldWVfbG9jayk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggOGYxMTdkNi4uNTQ5YjRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNTg0Myw2ICs1ODQzLDEwIEBACiAJcHJfZGVidWcoIiVkIHN0cmlwZXMgaGFuZGxlZFxuIiwgaGFuZGxlZCk7CiAKIAlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKKworCXI1bF9mbHVzaF9zdHJpcGVfdG9fcmFpZChjb25mLT5sb2cpOworCisJYXN5bmNfdHhfaXNzdWVfcGVuZGluZ19hbGwoKTsKIAlibGtfZmluaXNoX3BsdWcoJnBsdWcpOwogCiAJcHJfZGVidWcoIi0tLSByYWlkNXdvcmtlciBpbmFjdGl2ZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2kyYy9zNWM3M20zL3M1YzczbTMtY3RybHMuYyBiL2RyaXZlcnMvbWVkaWEvaTJjL3M1YzczbTMvczVjNzNtMy1jdHJscy5jCmluZGV4IDBhMDYwMzMuLjJlNzE4NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvaTJjL3M1YzczbTMvczVjNzNtMy1jdHJscy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvaTJjL3M1YzczbTMvczVjNzNtMy1jdHJscy5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAl9CiAKIAlpZiAoKGN0cmwtPnZhbCBeIGN0cmwtPmN1ci52YWwpICYgVjRMMl9MT0NLX0ZPQ1VTKQotCQlyZXQgPSBzNWM3M20zX2FmX3J1bihzdGF0ZSwgfmFmX2xvY2spOworCQlyZXQgPSBzNWM3M20zX2FmX3J1bihzdGF0ZSwgIWFmX2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxNjQvc2FhNzE2NC1idXMuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxNjQvc2FhNzE2NC1idXMuYwppbmRleCBhMThmZTVkLi5iNDg1N2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTY0L3NhYTcxNjQtYnVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzE2NC9zYWE3MTY0LWJ1cy5jCkBAIC0zOTMsMTEgKzM5MywxMSBAQAogCW1zZ190bXAuc2l6ZSA9IGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNiltc2dfdG1wLnNpemUpOwogCW1zZ190bXAuY29tbWFuZCA9IGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMiltc2dfdG1wLmNvbW1hbmQpOwogCW1zZ190bXAuY29udHJvbHNlbGVjdG9yID0gbGUxNl90b19jcHUoKF9fZm9yY2UgX19sZTE2KW1zZ190bXAuY29udHJvbHNlbGVjdG9yKTsKKwltZW1jcHkobXNnLCAmbXNnX3RtcCwgc2l6ZW9mKCptc2cpKTsKIAogCS8qIE5vIG5lZWQgdG8gdXBkYXRlIHRoZSByZWFkIHBvc2l0aW9ucywgYmVjYXVzZSB0aGlzIHdhcyBhIHBlZWsgKi8KIAkvKiBJZiB0aGUgY2FsbGVyIHNwZWNpZmljYWxseSB3YW50IHRvIHBlZWssIHJldHVybiAqLwogCWlmIChwZWVrb25seSkgewotCQltZW1jcHkobXNnLCAmbXNnX3RtcCwgc2l6ZW9mKCptc2cpKTsKIAkJZ290byBwZWVrb3V0OwogCX0KIApAQCAtNDQyLDIxICs0NDIsMTUgQEAKIAkJc3BhY2VfcmVtID0gYnVzLT5tX2R3U2l6ZUdldFJpbmcgLSBjdXJyX2dycDsKIAogCQlpZiAoc3BhY2VfcmVtIDwgc2l6ZW9mKCptc2cpKSB7Ci0JCQkvKiBtc2cgd3JhcHMgYXJvdW5kIHRoZSByaW5nICovCi0JCQltZW1jcHlfZnJvbWlvKG1zZywgYnVzLT5tX3Bkd0dldFJpbmcgKyBjdXJyX2dycCwgc3BhY2VfcmVtKTsKLQkJCW1lbWNweV9mcm9taW8oKHU4ICopbXNnICsgc3BhY2VfcmVtLCBidXMtPm1fcGR3R2V0UmluZywKLQkJCQlzaXplb2YoKm1zZykgLSBzcGFjZV9yZW0pOwogCQkJaWYgKGJ1ZikKIAkJCQltZW1jcHlfZnJvbWlvKGJ1ZiwgYnVzLT5tX3Bkd0dldFJpbmcgKyBzaXplb2YoKm1zZykgLQogCQkJCQlzcGFjZV9yZW0sIGJ1Zl9zaXplKTsKIAogCQl9IGVsc2UgaWYgKHNwYWNlX3JlbSA9PSBzaXplb2YoKm1zZykpIHsKLQkJCW1lbWNweV9mcm9taW8obXNnLCBidXMtPm1fcGR3R2V0UmluZyArIGN1cnJfZ3JwLCBzaXplb2YoKm1zZykpOwogCQkJaWYgKGJ1ZikKIAkJCQltZW1jcHlfZnJvbWlvKGJ1ZiwgYnVzLT5tX3Bkd0dldFJpbmcsIGJ1Zl9zaXplKTsKIAkJfSBlbHNlIHsKIAkJCS8qIEFkZGl0aW9uYWwgZGF0YSB3cmFwcyBhcm91bmQgdGhlIHJpbmcgKi8KLQkJCW1lbWNweV9mcm9taW8obXNnLCBidXMtPm1fcGR3R2V0UmluZyArIGN1cnJfZ3JwLCBzaXplb2YoKm1zZykpOwogCQkJaWYgKGJ1ZikgewogCQkJCW1lbWNweV9mcm9taW8oYnVmLCBidXMtPm1fcGR3R2V0UmluZyArIGN1cnJfZ3JwICsKIAkJCQkJc2l6ZW9mKCptc2cpLCBzcGFjZV9yZW0gLSBzaXplb2YoKm1zZykpOwpAQCAtNDY5LDE1ICs0NjMsMTAgQEAKIAogCX0gZWxzZSB7CiAJCS8qIE5vIHdyYXBwaW5nICovCi0JCW1lbWNweV9mcm9taW8obXNnLCBidXMtPm1fcGR3R2V0UmluZyArIGN1cnJfZ3JwLCBzaXplb2YoKm1zZykpOwogCQlpZiAoYnVmKQogCQkJbWVtY3B5X2Zyb21pbyhidWYsIGJ1cy0+bV9wZHdHZXRSaW5nICsgY3Vycl9ncnAgKyBzaXplb2YoKm1zZyksCiAJCQkJYnVmX3NpemUpOwogCX0KLQkvKiBDb252ZXJ0IGZyb20gbGl0dGxlIGVuZGlhbiB0byBDUFUgKi8KLQltc2ctPnNpemUgPSBsZTE2X3RvX2NwdSgoX19mb3JjZSBfX2xlMTYpbXNnLT5zaXplKTsKLQltc2ctPmNvbW1hbmQgPSBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpbXNnLT5jb21tYW5kKTsKLQltc2ctPmNvbnRyb2xzZWxlY3RvciA9IGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNiltc2ctPmNvbnRyb2xzZWxlY3Rvcik7CiAKIAkvKiBVcGRhdGUgdGhlIHJlYWQgcG9zaXRpb25zLCBhZGp1c3RpbmcgdGhlIHJpbmcgKi8KIAlzYWE3MTY0X3dyaXRlbChidXMtPm1fZHdHZXRSZWFkUG9zLCBuZXdfZ3JwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZGF2aW5jaS92cGZlX2NhcHR1cmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vZGF2aW5jaS92cGZlX2NhcHR1cmUuYwppbmRleCA2ZWZiMmYxLi5iZGI3YTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL2RhdmluY2kvdnBmZV9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9kYXZpbmNpL3ZwZmVfY2FwdHVyZS5jCkBAIC0xNzI1LDI3ICsxNzI1LDkgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBWUEZFX0NNRF9TX0NDRENfUkFXX1BBUkFNUzoKKwkJcmV0ID0gLUVJTlZBTDsKIAkJdjRsMl93YXJuKCZ2cGZlX2Rldi0+djRsMl9kZXYsCi0JCQkgICJWUEZFX0NNRF9TX0NDRENfUkFXX1BBUkFNUzogZXhwZXJpbWVudGFsIGlvY3RsXG4iKTsKLQkJaWYgKGNjZGNfZGV2LT5od19vcHMuc2V0X3BhcmFtcykgewotCQkJcmV0ID0gY2NkY19kZXYtPmh3X29wcy5zZXRfcGFyYW1zKHBhcmFtKTsKLQkJCWlmIChyZXQpIHsKLQkJCQl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwZmVfZGV2LT52NGwyX2RldiwKLQkJCQkJIkVycm9yIHNldHRpbmcgcGFyYW1ldGVycyBpbiBDQ0RDXG4iKTsKLQkJCQlnb3RvIHVubG9ja19vdXQ7Ci0JCQl9Ci0JCQlyZXQgPSB2cGZlX2dldF9jY2RjX2ltYWdlX2Zvcm1hdCh2cGZlX2RldiwKLQkJCQkJCQkgJnZwZmVfZGV2LT5mbXQpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwZmVfZGV2LT52NGwyX2RldiwKLQkJCQkJIkludmFsaWQgaW1hZ2UgZm9ybWF0IGF0IENDRENcbiIpOwotCQkJCWdvdG8gdW5sb2NrX291dDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwZmVfZGV2LT52NGwyX2RldiwKLQkJCQkiVlBGRV9DTURfU19DQ0RDX1JBV19QQVJBTVMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCX0KKwkJCSJWUEZFX0NNRF9TX0NDRENfUkFXX1BBUkFNUyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1RUWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2Jyb2FkY2FzdC90c3BwLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9icm9hZGNhc3QvdHNwcC5jCmluZGV4IDJjOTBlNDcuLmJlN2Y0YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2Jyb2FkY2FzdC90c3BwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vYnJvYWRjYXN0L3RzcHAuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3JlZ3VsYXRvci9xY29tLHJwbWgtcmVndWxhdG9yLmg+CiAjaW5jbHVkZSA8bGludXgvbXNtLXNwcy5oPiAgICAgICAgICAgIC8qIEJBTSBzdHVmZiAqLwotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+ICAgICAgLyogTG9ja2luZyBmdW5jdGlvbnMgKi8KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPiAgICAgICAgIC8qIFRpbWVyIHNlcnZpY2VzICovCiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPiAgICAgICAvKiBKaWZmaWVzIGNvdW50ZXIgKi8KICNpbmNsdWRlIDxsaW51eC9xY29tX3RzcHAuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9NYWtlZmlsZQppbmRleCA4MDBjOWVhLi40OGZhMWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL01ha2VmaWxlCkBAIC05LDMgKzksNCBAQAogb2JqLSQoQ09ORklHX1NQRUNUUkFfQ0FNRVJBKSArPSBjYW1fc2Vuc29yX21vZHVsZS8KIG9iai0kKENPTkZJR19TUEVDVFJBX0NBTUVSQSkgKz0gY2FtX2ljcC8KIG9iai0kKENPTkZJR19TUEVDVFJBX0NBTUVSQSkgKz0gY2FtX2pwZWcvCitvYmotJChDT05GSUdfU1BFQ1RSQV9DQU1FUkEpICs9IGNhbV9mZC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY2RtL2NhbV9jZG1fY29yZV9jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY2RtL2NhbV9jZG1fY29yZV9jb21tb24uYwppbmRleCA2YzhiZGUxLi4zZmJiM2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NkbS9jYW1fY2RtX2NvcmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0vY2FtX2NkbV9jb3JlX2NvbW1vbi5jCkBAIC0zMzgsNiArMzM4LDcgQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWNsaWVudC0+c3RyZWFtX29uID0gZmFsc2U7CisJCQkJcmMgPSAwOwogCQkJCUNBTV9EQkcoQ0FNX0NETSwKIAkJCQkJIkNsaWVudCBzdHJlYW0gb2ZmIHN1Y2Nlc3MgPSVkIiwKIAkJCQkJY2RtX2h3LT5vcGVuX2NvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY2RtL2NhbV9jZG1faHdfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0vY2FtX2NkbV9od19jb3JlLmMKaW5kZXggNWY2ODk1Yy4uMjlkZTMxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0vY2FtX2NkbV9od19jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0vY2FtX2NkbV9od19jb3JlLmMKQEAgLTc4NSwxOCArNzg1LDYgQEAKIAl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNkbV9jb3JlLT5yZXNldF9jb21wbGV0ZSwKIAkJbXNlY3NfdG9famlmZmllcyhDQU1fQ0RNX0hXX1JFU0VUX1RJTUVPVVQpKTsKIAotCS8qCi0JICogQ2hlY2sgZm9yIEhXIGVycm9yIGFuZCByZWNvdmVyIGFzIGEgd29ya2Fyb3VuZAotCSAqIFNvbWV0aW1lcyBDRE0gSFcgdHJpZ2dlcnMgaXJxIHdpdGggaW52YWxpZCBzdGF0dXMgZm9yCi0JICogSFcgcmVzZXQgY29tbWFuZCwgc28gaWdub3JlIHJlc2V0IGZhaWx1cmUgYW5kIHByb2NlZWQgZnVydGhlcgotCSAqIGFzIGEgd29ya2Fyb3VuZC4KLQkgKi8KLQlpZiAodGltZV9sZWZ0IDw9IDApIHsKLQkJQ0FNX0VSUihDQU1fQ0RNLCAiQ0RNIEhXIHJlc2V0IFdhaXQgZmFpbGVkIHRpbWVfbGVmdD0lbGQiLAotCQkJdGltZV9sZWZ0KTsKLQkJdGltZV9sZWZ0ID0gMTsKLQl9Ci0KIAlpZiAodGltZV9sZWZ0IDw9IDApIHsKIAkJQ0FNX0VSUihDQU1fQ0RNLCAiQ0RNIEhXIHJlc2V0IFdhaXQgZmFpbGVkIHJjPSVkIiwgcmMpOwogCQlnb3RvIGRpc2FibGVfcmV0dXJuOwpAQCAtODY5LDYgKzg1Nyw4IEBACiAKIAljZG1faHctPmh3X3N0YXRlID0gQ0FNX0hXX1NUQVRFX1BPV0VSX0RPV047CiAJY2RtX2h3LT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwljZG1faHctPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJY2RtX2h3LT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJY2RtX2h3X2ludGYtPmh3X3R5cGUgPSBDQU1fSFdfQ0RNOwogCWNkbV9ody0+b3Blbl9jb3VudCA9IDA7CiAJbXV0ZXhfaW5pdCgmY2RtX2h3LT5od19tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NkbS9jYW1fY2RtX3ZpcnR1YWxfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0vY2FtX2NkbV92aXJ0dWFsX2NvcmUuYwppbmRleCBiMjMwZDRlLi5kNzZmMzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NkbS9jYW1fY2RtX3ZpcnR1YWxfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY2RtL2NhbV9jZG1fdmlydHVhbF9jb3JlLmMKQEAgLTEzMSw4ICsxMzEsMTAgQEAKIAkJCQljZG1fY21kLT5jbWRbaV0ubGVuLCBjbGllbnQtPmRhdGEuYmFzZV9hcnJheSwKIAkJCQljbGllbnQtPmRhdGEuYmFzZV9hcnJheV9jbnQsIGNvcmUtPmJsX3RhZyk7CiAJCQlpZiAocmMpIHsKLQkJCQlDQU1fRVJSKENBTV9DRE0sICJ3cml0ZSBmYWlsZWQgZm9yIGNudD0lZDolZCIsCi0JCQkJCWksIHJlcS0+ZGF0YS0+Y21kX2FycmFyeV9jb3VudCk7CisJCQkJQ0FNX0VSUihDQU1fQ0RNLAorCQkJCQkid3JpdGUgZmFpbGVkIGZvciBjbnQ9JWQ6JWQgbGVuICV1IiwKKwkJCQkJaSwgcmVxLT5kYXRhLT5jbWRfYXJyYXJ5X2NvdW50LAorCQkJCQljZG1fY21kLT5jbWRbaV0ubGVuKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY29yZS9jYW1fbm9kZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlL2NhbV9ub2RlLmMKaW5kZXggMDQzZjQ0ZC4uNmU0OGM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlL2NhbV9ub2RlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlL2NhbV9ub2RlLmMKQEAgLTY1LDcgKzY1LDggQEAKIAogCXJjID0gY2FtX2NvbnRleHRfaGFuZGxlX2FjcXVpcmVfZGV2KGN0eCwgYWNxdWlyZSk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0NPUkUsICJBY3F1aXJlIGRldmljZSBmYWlsZWQiKTsKKwkJQ0FNX0VSUihDQU1fQ09SRSwgIkFjcXVpcmUgZGV2aWNlIGZhaWxlZCBmb3Igbm9kZSAlcyIsCisJCQlub2RlLT5uYW1lKTsKIAkJZ290byBmcmVlX2N0eDsKIAl9CiAKQEAgLTgyLDYgKzgzLDcgQEAKIAlzdHJ1Y3QgY2FtX3N0YXJ0X3N0b3BfZGV2X2NtZCAqc3RhcnQpCiB7CiAJc3RydWN0IGNhbV9jb250ZXh0ICpjdHggPSBOVUxMOworCWludCByYzsKIAogCWlmICghc3RhcnQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAzLDEzICsxMDUsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIGNhbV9jb250ZXh0X2hhbmRsZV9zdGFydF9kZXYoY3R4LCBzdGFydCk7CisJcmMgPSBjYW1fY29udGV4dF9oYW5kbGVfc3RhcnRfZGV2KGN0eCwgc3RhcnQpOworCWlmIChyYykKKwkJQ0FNX0VSUihDQU1fQ09SRSwgIlN0YXJ0IGZhaWx1cmUgZm9yIG5vZGUgJXMiLCBub2RlLT5uYW1lKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBfX2NhbV9ub2RlX2hhbmRsZV9zdG9wX2RldihzdHJ1Y3QgY2FtX25vZGUgKm5vZGUsCiAJc3RydWN0IGNhbV9zdGFydF9zdG9wX2Rldl9jbWQgKnN0b3ApCiB7CiAJc3RydWN0IGNhbV9jb250ZXh0ICpjdHggPSBOVUxMOworCWludCByYzsKIAogCWlmICghc3RvcCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzEsMTMgKzEzOCwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gY2FtX2NvbnRleHRfaGFuZGxlX3N0b3BfZGV2KGN0eCwgc3RvcCk7CisJcmMgPSBjYW1fY29udGV4dF9oYW5kbGVfc3RvcF9kZXYoY3R4LCBzdG9wKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0NPUkUsICJTdG9wIGZhaWx1cmUgZm9yIG5vZGUgJXMiLCBub2RlLT5uYW1lKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBfX2NhbV9ub2RlX2hhbmRsZV9jb25maWdfZGV2KHN0cnVjdCBjYW1fbm9kZSAqbm9kZSwKIAlzdHJ1Y3QgY2FtX2NvbmZpZ19kZXZfY21kICpjb25maWcpCiB7CiAJc3RydWN0IGNhbV9jb250ZXh0ICpjdHggPSBOVUxMOworCWludCByYzsKIAogCWlmICghY29uZmlnKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1OSw3ICsxNzEsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIGNhbV9jb250ZXh0X2hhbmRsZV9jb25maWdfZGV2KGN0eCwgY29uZmlnKTsKKwlyYyA9IGNhbV9jb250ZXh0X2hhbmRsZV9jb25maWdfZGV2KGN0eCwgY29uZmlnKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0NPUkUsICJDb25maWcgZmFpbHVyZSBmb3Igbm9kZSAlcyIsIG5vZGUtPm5hbWUpOworCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IF9fY2FtX25vZGVfaGFuZGxlX3JlbGVhc2VfZGV2KHN0cnVjdCBjYW1fbm9kZSAqbm9kZSwKQEAgLTE4MywxOCArMTk5LDE5IEBACiAKIAljdHggPSAoc3RydWN0IGNhbV9jb250ZXh0ICopY2FtX2dldF9kZXZpY2VfcHJpdihyZWxlYXNlLT5kZXZfaGFuZGxlKTsKIAlpZiAoIWN0eCkgewotCQlDQU1fRVJSKENBTV9DT1JFLCAiQ2FuIG5vdCBnZXQgY29udGV4dCBmb3IgaGFuZGxlICVkIiwKLQkJCXJlbGVhc2UtPmRldl9oYW5kbGUpOworCQlDQU1fRVJSKENBTV9DT1JFLCAiQ2FuIG5vdCBnZXQgY29udGV4dCBmb3IgaGFuZGxlICVkIG5vZGUgJXMiLAorCQkJcmVsZWFzZS0+ZGV2X2hhbmRsZSwgbm9kZS0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJjID0gY2FtX2NvbnRleHRfaGFuZGxlX3JlbGVhc2VfZGV2KGN0eCwgcmVsZWFzZSk7CiAJaWYgKHJjKQotCQlDQU1fRVJSKENBTV9DT1JFLCAiY29udGV4dCByZWxlYXNlIGZhaWxlZCIpOworCQlDQU1fRVJSKENBTV9DT1JFLCAiY29udGV4dCByZWxlYXNlIGZhaWxlZCBub2RlICVzIiwgbm9kZS0+bmFtZSk7CiAKIAlyYyA9IGNhbV9kZXN0cm95X2RldmljZV9oZGwocmVsZWFzZS0+ZGV2X2hhbmRsZSk7CiAJaWYgKHJjKQotCQlDQU1fRVJSKENBTV9DT1JFLCAiZGVzdHJveSBkZXZpY2UgaGFuZGxlIGlzIGZhaWxlZCIpOworCQlDQU1fRVJSKENBTV9DT1JFLCAiZGVzdHJveSBkZXZpY2UgaGFuZGxlIGlzIGZhaWxlZCBub2RlICVzIiwKKwkJCW5vZGUtPm5hbWUpOwogCiAJbXV0ZXhfbG9jaygmbm9kZS0+bGlzdF9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmY3R4LT5saXN0LCAmbm9kZS0+ZnJlZV9jdHhfbGlzdCk7CkBAIC0yNTYsNyArMjczLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdHJhY2VfY2FtX2FwcGx5X3JlcSgiTm9kZSIsIGFwcGx5KTsKKwl0cmFjZV9jYW1fYXBwbHlfcmVxKCJOb2RlIiwgYXBwbHktPnJlcXVlc3RfaWQpOwogCiAJcmV0dXJuIGNhbV9jb250ZXh0X2hhbmRsZV9jcm1fYXBwbHlfcmVxKGN0eCwgYXBwbHkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jcGFzL2NhbV9jcGFzX2h3LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvY2FtX2NwYXNfaHcuYwppbmRleCA4MjAzNWU5Li42YmY4MWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvY2FtX2NwYXNfaHcuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvY2FtX2NwYXNfaHcuYwpAQCAtMTMzOCw2ICsxMzM4LDggQEAKIAogCWNwYXNfaHctPmh3X3N0YXRlID0gQ0FNX0hXX1NUQVRFX1BPV0VSX0RPV047CiAJY3Bhc19ody0+c29jX2luZm8ucGRldiA9IHBkZXY7CisJY3Bhc19ody0+c29jX2luZm8uZGV2ID0gJnBkZXYtPmRldjsKKwljcGFzX2h3LT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJY3Bhc19ody0+b3Blbl9jb3VudCA9IDA7CiAJbXV0ZXhfaW5pdCgmY3Bhc19ody0+aHdfbXV0ZXgpOwogCXNwaW5fbG9ja19pbml0KCZjcGFzX2h3LT5od19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY3Bhcy9jcGFzX3RvcC9jYW1fY3Bhc3RvcF9ody5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jcGFzL2NwYXNfdG9wL2NhbV9jcGFzdG9wX2h3LmMKaW5kZXggZDkxMzNiOS4uZTNkNDZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jcGFzL2NwYXNfdG9wL2NhbV9jcGFzdG9wX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jcGFzL2NwYXNfdG9wL2NhbV9jcGFzdG9wX2h3LmMKQEAgLTQwMiw5ICs0MDIsMTAgQEAKIAkJCUNBTV9DUEFTX1BPTExfUkVUUllfQ05ULAogCQkJQ0FNX0NQQVNfUE9MTF9NSU5fVVNFQ1MsIENBTV9DUEFTX1BPTExfTUFYX1VTRUNTKTsKIAkJaWYgKHJjKSB7Ci0JCQlDQU1fRVJSKENBTV9DUEFTLAorCQkJQ0FNX0RCRyhDQU1fQ1BBUywKIAkJCQkiY2Ftbm9jIGZsdXNoIHNsYXZlIHBlbmRpbmcgdHJhbnMgZmFpbGVkIik7CiAJCQkvKiBEbyBub3QgcmV0dXJuIGVycm9yLCBwYXNzdGhyb3VnaCAqLworCQkJcmMgPSAwOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvY3Bhc190b3AvY3Bhc3RvcF92MTcwXzExMC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jcGFzL2NwYXNfdG9wL2NwYXN0b3BfdjE3MF8xMTAuaAppbmRleCBmNGQwZTM2Li45MTgyNThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvY3Bhc190b3AvY3Bhc3RvcF92MTcwXzExMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY3Bhcy9jcGFzX3RvcC9jcGFzdG9wX3YxNzBfMTEwLmgKQEAgLTUxNSw3ICs1MTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNhbV9jcGFzX2h3X2VycmF0YV93YV9saXN0IGNhbTE3MF9jcGFzMTEwX2VycmF0YV93YV9saXN0ID0gewogCS5jYW1ub2NfZmx1c2hfc2xhdmVfcGVuZGluZ190cmFucyA9IHsKLQkJLmVuYWJsZSA9IHRydWUsCisJCS5lbmFibGUgPSBmYWxzZSwKIAkJLmRhdGEucmVnX2luZm8gPSB7CiAJCQkuYWNjZXNzX3R5cGUgPSBDQU1fUkVHX1RZUEVfUkVBRCwKIAkJCS5vZmZzZXQgPSAweDIxMDAsIC8qIFNpZGViYW5kTWFuYWdlcl9TZW5zZUluMF9Mb3cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTc3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21ncgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3N5bmMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9odworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvaW5jbHVkZQorCitvYmotJChDT05GSUdfU1BFQ1RSQV9DQU1FUkEpICs9IGZkX2h3X21nci8KK29iai0kKENPTkZJR19TUEVDVFJBX0NBTUVSQSkgKz0gY2FtX2ZkX2Rldi5vIGNhbV9mZF9jb250ZXh0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvY2FtX2ZkX2NvbnRleHQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvY2FtX2ZkX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNjNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9jYW1fZmRfY29udGV4dC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSAiY2FtX2RlYnVnX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1fZmRfY29udGV4dC5oIgorI2luY2x1ZGUgImNhbV90cmFjZS5oIgorCisvKiBGdW5jdGlvbnMgaW4gQXZhaWxhYmxlIHN0YXRlICovCitzdGF0aWMgaW50IF9fY2FtX2ZkX2N0eF9hY3F1aXJlX2Rldl9pbl9hdmFpbGFibGUoc3RydWN0IGNhbV9jb250ZXh0ICpjdHgsCisJc3RydWN0IGNhbV9hY3F1aXJlX2Rldl9jbWQgKmNtZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGNhbV9jb250ZXh0X2FjcXVpcmVfZGV2X3RvX2h3KGN0eCwgY21kKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gQWNxdWlyZSBkZXYsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJY3R4LT5zdGF0ZSA9IENBTV9DVFhfQUNRVUlSRUQ7CisJdHJhY2VfY2FtX2NvbnRleHRfc3RhdGUoIkZEIiwgY3R4KTsKKworCXJldHVybiByYzsKK30KKworLyogRnVuY3Rpb25zIGluIEFjcXVpcmVkIHN0YXRlICovCitzdGF0aWMgaW50IF9fY2FtX2ZkX2N0eF9yZWxlYXNlX2Rldl9pbl9hY3F1aXJlZChzdHJ1Y3QgY2FtX2NvbnRleHQgKmN0eCwKKwlzdHJ1Y3QgY2FtX3JlbGVhc2VfZGV2X2NtZCAqY21kKQoreworCWludCByYzsKKworCXJjID0gY2FtX2NvbnRleHRfcmVsZWFzZV9kZXZfdG9faHcoY3R4LCBjbWQpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBSZWxlYXNlIGRldiwgcmM9JWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwljdHgtPnN0YXRlID0gQ0FNX0NUWF9BVkFJTEFCTEU7CisJdHJhY2VfY2FtX2NvbnRleHRfc3RhdGUoIkZEIiwgY3R4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2NhbV9mZF9jdHhfY29uZmlnX2Rldl9pbl9hY3F1aXJlZChzdHJ1Y3QgY2FtX2NvbnRleHQgKmN0eCwKKwlzdHJ1Y3QgY2FtX2NvbmZpZ19kZXZfY21kICpjbWQpCit7CisJaW50IHJjOworCisJcmMgPSBjYW1fY29udGV4dF9wcmVwYXJlX2Rldl90b19odyhjdHgsIGNtZCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIFByZXBhcmUgZGV2LCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2NhbV9mZF9jdHhfc3RhcnRfZGV2X2luX2FjcXVpcmVkKHN0cnVjdCBjYW1fY29udGV4dCAqY3R4LAorCXN0cnVjdCBjYW1fc3RhcnRfc3RvcF9kZXZfY21kICpjbWQpCit7CisJaW50IHJjOworCisJcmMgPSBjYW1fY29udGV4dF9zdGFydF9kZXZfdG9faHcoY3R4LCBjbWQpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBTdGFydCBkZXYsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJY3R4LT5zdGF0ZSA9IENBTV9DVFhfQUNUSVZBVEVEOworCXRyYWNlX2NhbV9jb250ZXh0X3N0YXRlKCJGRCIsIGN0eCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEZ1bmN0aW9ucyBpbiBBY3RpdmF0ZWQgc3RhdGUgKi8KK3N0YXRpYyBpbnQgX19jYW1fZmRfY3R4X3N0b3BfZGV2X2luX2FjdGl2YXRlZChzdHJ1Y3QgY2FtX2NvbnRleHQgKmN0eCwKKwlzdHJ1Y3QgY2FtX3N0YXJ0X3N0b3BfZGV2X2NtZCAqY21kKQoreworCWludCByYzsKKworCXJjID0gY2FtX2NvbnRleHRfc3RvcF9kZXZfdG9faHcoY3R4KTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gU3RvcCBkZXYsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJY3R4LT5zdGF0ZSA9IENBTV9DVFhfQUNRVUlSRUQ7CisJdHJhY2VfY2FtX2NvbnRleHRfc3RhdGUoIkZEIiwgY3R4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2NhbV9mZF9jdHhfcmVsZWFzZV9kZXZfaW5fYWN0aXZhdGVkKHN0cnVjdCBjYW1fY29udGV4dCAqY3R4LAorCXN0cnVjdCBjYW1fcmVsZWFzZV9kZXZfY21kICpjbWQpCit7CisJaW50IHJjOworCisJcmMgPSBfX2NhbV9mZF9jdHhfc3RvcF9kZXZfaW5fYWN0aXZhdGVkKGN0eCwgTlVMTCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIFN0b3AgZGV2LCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gX19jYW1fZmRfY3R4X3JlbGVhc2VfZGV2X2luX2FjcXVpcmVkKGN0eCwgY21kKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gUmVsZWFzZSBkZXYsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fY2FtX2ZkX2N0eF9jb25maWdfZGV2X2luX2FjdGl2YXRlZCgKKwlzdHJ1Y3QgY2FtX2NvbnRleHQgKmN0eCwgc3RydWN0IGNhbV9jb25maWdfZGV2X2NtZCAqY21kKQoreworCWludCByYzsKKworCXJjID0gY2FtX2NvbnRleHRfcHJlcGFyZV9kZXZfdG9faHcoY3R4LCBjbWQpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBQcmVwYXJlIGRldiwgcmM9JWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19jYW1fZmRfY3R4X2hhbmRsZV9pcnFfaW5fYWN0aXZhdGVkKHZvaWQgKmNvbnRleHQsCisJdWludDMyX3QgZXZ0X2lkLCB2b2lkICpldnRfZGF0YSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGNhbV9jb250ZXh0X2J1Zl9kb25lX2Zyb21faHcoY29udGV4dCwgZXZ0X2RhdGEsIGV2dF9pZCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIGJ1ZiBkb25lLCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworLyogdG9wIHN0YXRlIG1hY2hpbmUgKi8KK3N0YXRpYyBzdHJ1Y3QgY2FtX2N0eF9vcHMKKwljYW1fZmRfY3R4X3N0YXRlX21hY2hpbmVbQ0FNX0NUWF9TVEFURV9NQVhdID0geworCS8qIFVuaW5pdCAqLworCXsKKwkJLmlvY3RsX29wcyA9IHt9LAorCQkuY3JtX29wcyA9IHt9LAorCQkuaXJxX29wcyA9IE5VTEwsCisJfSwKKwkvKiBBdmFpbGFibGUgKi8KKwl7CisJCS5pb2N0bF9vcHMgPSB7CisJCQkuYWNxdWlyZV9kZXYgPSBfX2NhbV9mZF9jdHhfYWNxdWlyZV9kZXZfaW5fYXZhaWxhYmxlLAorCQl9LAorCQkuY3JtX29wcyA9IHt9LAorCQkuaXJxX29wcyA9IE5VTEwsCisJfSwKKwkvKiBBY3F1aXJlZCAqLworCXsKKwkJLmlvY3RsX29wcyA9IHsKKwkJCS5yZWxlYXNlX2RldiA9IF9fY2FtX2ZkX2N0eF9yZWxlYXNlX2Rldl9pbl9hY3F1aXJlZCwKKwkJCS5jb25maWdfZGV2ID0gX19jYW1fZmRfY3R4X2NvbmZpZ19kZXZfaW5fYWNxdWlyZWQsCisJCQkuc3RhcnRfZGV2ID0gX19jYW1fZmRfY3R4X3N0YXJ0X2Rldl9pbl9hY3F1aXJlZCwKKwkJfSwKKwkJLmNybV9vcHMgPSB7fSwKKwkJLmlycV9vcHMgPSBOVUxMLAorCX0sCisJLyogUmVhZHkgKi8KKwl7CisJCS5pb2N0bF9vcHMgPSB7IH0sCisJCS5jcm1fb3BzID0ge30sCisJCS5pcnFfb3BzID0gTlVMTCwKKwl9LAorCS8qIEFjdGl2YXRlZCAqLworCXsKKwkJLmlvY3RsX29wcyA9IHsKKwkJCS5zdG9wX2RldiA9IF9fY2FtX2ZkX2N0eF9zdG9wX2Rldl9pbl9hY3RpdmF0ZWQsCisJCQkucmVsZWFzZV9kZXYgPSBfX2NhbV9mZF9jdHhfcmVsZWFzZV9kZXZfaW5fYWN0aXZhdGVkLAorCQkJLmNvbmZpZ19kZXYgPSBfX2NhbV9mZF9jdHhfY29uZmlnX2Rldl9pbl9hY3RpdmF0ZWQsCisJCX0sCisJCS5jcm1fb3BzID0ge30sCisJCS5pcnFfb3BzID0gX19jYW1fZmRfY3R4X2hhbmRsZV9pcnFfaW5fYWN0aXZhdGVkLAorCX0sCit9OworCisKK2ludCBjYW1fZmRfY29udGV4dF9pbml0KHN0cnVjdCBjYW1fZmRfY29udGV4dCAqZmRfY3R4LAorCXN0cnVjdCBjYW1fY29udGV4dCAqYmFzZV9jdHgsIHN0cnVjdCBjYW1faHdfbWdyX2ludGYgKmh3X2ludGYpCit7CisJaW50IHJjOworCisJaWYgKCFiYXNlX2N0eCB8fCAhZmRfY3R4KSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBDb250ZXh0ICVwSyAlcEsiLCBiYXNlX2N0eCwgZmRfY3R4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGZkX2N0eCwgMCwgc2l6ZW9mKCpmZF9jdHgpKTsKKworCXJjID0gY2FtX2NvbnRleHRfaW5pdChiYXNlX2N0eCwgTlVMTCwgaHdfaW50ZiwgZmRfY3R4LT5yZXFfYmFzZSwKKwkJQ0FNX0NUWF9SRVFfTUFYKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJDYW1lcmEgQ29udGV4dCBCYXNlIGluaXQgZmFpbGVkLCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWZkX2N0eC0+YmFzZSA9IGJhc2VfY3R4OworCWJhc2VfY3R4LT5jdHhfcHJpdiA9IGZkX2N0eDsKKwliYXNlX2N0eC0+c3RhdGVfbWFjaGluZSA9IGNhbV9mZF9jdHhfc3RhdGVfbWFjaGluZTsKKworCXJldHVybiByYzsKK30KKworaW50IGNhbV9mZF9jb250ZXh0X2RlaW5pdChzdHJ1Y3QgY2FtX2ZkX2NvbnRleHQgKmZkX2N0eCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFmZF9jdHggfHwgIWZkX2N0eC0+YmFzZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXRzICVwSyIsIGZkX2N0eCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2FtX2NvbnRleHRfZGVpbml0KGZkX2N0eC0+YmFzZSk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9GRCwgIkVycm9yIGluIGJhc2UgZGVpbml0LCByYz0lZCIsIHJjKTsKKworCW1lbXNldChmZF9jdHgsIDAsIHNpemVvZigqZmRfY3R4KSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2NhbV9mZF9jb250ZXh0LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2NhbV9mZF9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvY2FtX2ZkX2NvbnRleHQuaApAQCAtMCwwICsxLDM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0FNX0ZEX0NPTlRFWFRfSF8KKyNkZWZpbmUgX0NBTV9GRF9DT05URVhUX0hfCisKKyNpbmNsdWRlICJjYW1fY29udGV4dC5oIgorI2luY2x1ZGUgImNhbV9jb250ZXh0X3V0aWxzLmgiCisjaW5jbHVkZSAiY2FtX2h3X21ncl9pbnRmLmgiCisjaW5jbHVkZSAiY2FtX3JlcV9tZ3JfaW50ZXJmYWNlLmgiCisKKy8qKgorICogc3RydWN0IGNhbV9mZF9jb250ZXh0IC0gRmFjZSBEZXRlY3Rpb24gY29udGV4dCBpbmZvcm1hdGlvbgorICoKKyAqIEBiYXNlICAgICA6IEJhc2UgY29udGV4dCBwb2ludGVyIGZvciB0aGlzIEZEIGNvbnRleHQKKyAqIEByZXFfYmFzZSA6IExpc3Qgb2YgYmFzZSByZXF1ZXN0cyBmb3IgdGhpcyBGRCBjb250ZXh0CisgKi8KK3N0cnVjdCBjYW1fZmRfY29udGV4dCB7CisJc3RydWN0IGNhbV9jb250ZXh0ICAgICAgICpiYXNlOworCXN0cnVjdCBjYW1fY3R4X3JlcXVlc3QgICAgcmVxX2Jhc2VbQ0FNX0NUWF9SRVFfTUFYXTsKK307CisKK2ludCBjYW1fZmRfY29udGV4dF9pbml0KHN0cnVjdCBjYW1fZmRfY29udGV4dCAqZmRfY3R4LAorCXN0cnVjdCBjYW1fY29udGV4dCAqYmFzZV9jdHgsIHN0cnVjdCBjYW1faHdfbWdyX2ludGYgKmh3X2ludGYpOworaW50IGNhbV9mZF9jb250ZXh0X2RlaW5pdChzdHJ1Y3QgY2FtX2ZkX2NvbnRleHQgKmN0eCk7CisKKyNlbmRpZiAvKiBfQ0FNX0ZEX0NPTlRFWFRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvY2FtX2ZkX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9jYW1fZmRfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmNTUxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvY2FtX2ZkX2Rldi5jCkBAIC0wLDAgKzEsMjA1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImNhbV9zdWJkZXYuaCIKKyNpbmNsdWRlICJjYW1fbm9kZS5oIgorI2luY2x1ZGUgImNhbV9mZF9jb250ZXh0LmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X21nci5oIgorI2luY2x1ZGUgImNhbV9mZF9od19tZ3JfaW50Zi5oIgorCisjZGVmaW5lIENBTV9GRF9ERVZfTkFNRSAiY2FtLWZkIgorCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfZGV2IC0gRkQgZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogQHNkOiAgICAgICAgIFN1YmRldiBpbmZvcm1hdGlvbgorICogQGJhc2VfY3R4OiAgIExpc3Qgb2YgYmFzZSBjb250ZXh0cworICogQGZkX2N0eDogICAgIExpc3Qgb2YgRkQgY29udGV4dHMKKyAqIEBsb2NrOiAgICAgICBNdXRleCBoYW5kbGUKKyAqIEBvcGVuX2NudDogICBGRCBzdWJkZXYgb3BlbiBjb3VudAorICogQHByb2JlX2RvbmU6IFdoZXRoZXIgRkQgcHJvYmUgaXMgY29tcGxldGVkCisgKi8KK3N0cnVjdCBjYW1fZmRfZGV2IHsKKwlzdHJ1Y3QgY2FtX3N1YmRldiAgICAgc2Q7CisJc3RydWN0IGNhbV9jb250ZXh0ICAgIGJhc2VfY3R4W0NBTV9DVFhfTUFYXTsKKwlzdHJ1Y3QgY2FtX2ZkX2NvbnRleHQgZmRfY3R4W0NBTV9DVFhfTUFYXTsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgbG9jazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgb3Blbl9jbnQ7CisJYm9vbCAgICAgICAgICAgICAgICAgIHByb2JlX2RvbmU7Cit9OworCitzdGF0aWMgc3RydWN0IGNhbV9mZF9kZXYgZ19mZF9kZXY7CisKK3N0YXRpYyBpbnQgY2FtX2ZkX2Rldl9vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlzdHJ1Y3QgY2FtX2ZkX2RldiAqZmRfZGV2ID0gJmdfZmRfZGV2OworCisJaWYgKCFmZF9kZXYtPnByb2JlX2RvbmUpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGRCBEZXYgbm90IGluaXRpYWxpemVkLCBmZF9kZXY9JXBLIiwgZmRfZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbXV0ZXhfbG9jaygmZmRfZGV2LT5sb2NrKTsKKwlmZF9kZXYtPm9wZW5fY250Kys7CisJQ0FNX0RCRyhDQU1fRkQsICJGRCBTdWJkZXYgb3BlbiBjb3VudCAlZCIsIGZkX2Rldi0+b3Blbl9jbnQpOworCW11dGV4X3VubG9jaygmZmRfZGV2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9kZXZfY2xvc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXN0cnVjdCBjYW1fZmRfZGV2ICpmZF9kZXYgPSAmZ19mZF9kZXY7CisKKwlpZiAoIWZkX2Rldi0+cHJvYmVfZG9uZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkZEIERldiBub3QgaW5pdGlhbGl6ZWQsIGZkX2Rldj0lcEsiLCBmZF9kZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltdXRleF9sb2NrKCZmZF9kZXYtPmxvY2spOworCWZkX2Rldi0+b3Blbl9jbnQtLTsKKwlDQU1fREJHKENBTV9GRCwgIkZEIFN1YmRldiBvcGVuIGNvdW50ICVkIiwgZmRfZGV2LT5vcGVuX2NudCk7CisJbXV0ZXhfdW5sb2NrKCZmZF9kZXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIGNhbV9mZF9zdWJkZXZfaW50ZXJuYWxfb3BzID0geworCS5vcGVuID0gY2FtX2ZkX2Rldl9vcGVuLAorCS5jbG9zZSA9IGNhbV9mZF9kZXZfY2xvc2UsCit9OworCitzdGF0aWMgaW50IGNhbV9mZF9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmM7CisJaW50IGk7CisJc3RydWN0IGNhbV9od19tZ3JfaW50ZiBod19tZ3JfaW50ZjsKKwlzdHJ1Y3QgY2FtX25vZGUgKm5vZGU7CisKKwlnX2ZkX2Rldi5zZC5pbnRlcm5hbF9vcHMgPSAmY2FtX2ZkX3N1YmRldl9pbnRlcm5hbF9vcHM7CisKKwkvKiBJbml0aWFsemUgdGhlIHY0bDIgc3ViZGV2aWNlIGZpcnN0LiAoY3JlYXRlIGNhbV9ub2RlKSAqLworCXJjID0gY2FtX3N1YmRldl9wcm9iZSgmZ19mZF9kZXYuc2QsIHBkZXYsIENBTV9GRF9ERVZfTkFNRSwKKwkJQ0FNX0ZEX0RFVklDRV9UWVBFKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGRCBjYW1fc3ViZGV2X3Byb2JlIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJbm9kZSA9IChzdHJ1Y3QgY2FtX25vZGUgKikgZ19mZF9kZXYuc2QudG9rZW47CisKKwlyYyA9IGNhbV9mZF9od19tZ3JfaW5pdChwZGV2LT5kZXYub2Zfbm9kZSwgJmh3X21ncl9pbnRmKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gaW5pdGlhbGl6aW5nIEZEIEhXIG1hbmFnZXIsIHJjPSVkIiwKKwkJCXJjKTsKKwkJZ290byB1bnJlZ2lzdGVyX3N1YmRldjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FNX0NUWF9NQVg7IGkrKykgeworCQlyYyA9IGNhbV9mZF9jb250ZXh0X2luaXQoJmdfZmRfZGV2LmZkX2N0eFtpXSwKKwkJCSZnX2ZkX2Rldi5iYXNlX2N0eFtpXSwgJm5vZGUtPmh3X21ncl9pbnRmKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkZEIGNvbnRleHQgaW5pdCBmYWlsZWQgaT0lZCwgcmM9JWQiLAorCQkJCWksIHJjKTsKKwkJCWdvdG8gZGVpbml0X2N0eDsKKwkJfQorCX0KKworCXJjID0gY2FtX25vZGVfaW5pdChub2RlLCAmaHdfbWdyX2ludGYsIGdfZmRfZGV2LmJhc2VfY3R4LCBDQU1fQ1RYX01BWCwKKwkJQ0FNX0ZEX0RFVl9OQU1FKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGRCBub2RlIGluaXQgZmFpbGVkLCByYz0lZCIsIHJjKTsKKwkJZ290byBkZWluaXRfY3R4OworCX0KKworCW11dGV4X2luaXQoJmdfZmRfZGV2LmxvY2spOworCWdfZmRfZGV2LnByb2JlX2RvbmUgPSB0cnVlOworCisJQ0FNX0RCRyhDQU1fRkQsICJDYW1lcmEgRkQgcHJvYmUgY29tcGxldGUiKTsKKworCXJldHVybiAwOworCitkZWluaXRfY3R4OgorCWZvciAoLS1pOyBpID49IDA7IGktLSkgeworCQlpZiAoY2FtX2ZkX2NvbnRleHRfZGVpbml0KCZnX2ZkX2Rldi5mZF9jdHhbaV0pKQorCQkJQ0FNX0VSUihDQU1fRkQsICJGRCBjb250ZXh0ICVkIGRlaW5pdCBmYWlsZWQiLCBpKTsKKwl9Cit1bnJlZ2lzdGVyX3N1YmRldjoKKwlpZiAoY2FtX3N1YmRldl9yZW1vdmUoJmdfZmRfZGV2LnNkKSkKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gc3ViZGV2IHJlbW92ZSIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGksIHJjOworCisJZm9yIChpID0gMDsgaSA8IENBTV9DVFhfTUFYOyBpKyspIHsKKwkJcmMgPSBjYW1fZmRfY29udGV4dF9kZWluaXQoJmdfZmRfZGV2LmZkX2N0eFtpXSk7CisJCWlmIChyYykKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiRkQgY29udGV4dCAlZCBkZWluaXQgZmFpbGVkLCByYz0lZCIsCisJCQkJaSwgcmMpOworCX0KKworCXJjID0gY2FtX2ZkX2h3X21ncl9kZWluaXQocGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChyYykKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gaHcgbWdyIGRlaW5pdCwgcmM9JWQiLCByYyk7CisKKwlyYyA9IGNhbV9zdWJkZXZfcmVtb3ZlKCZnX2ZkX2Rldi5zZCk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9GRCwgIlVucmVnaXN0ZXIgZmFpbGVkLCByYz0lZCIsIHJjKTsKKworCW11dGV4X2Rlc3Ryb3koJmdfZmRfZGV2LmxvY2spOworCWdfZmRfZGV2LnByb2JlX2RvbmUgPSBmYWxzZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2FtX2ZkX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLGNhbS1mZCIKKwl9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjYW1fZmRfZHJpdmVyID0geworCS5wcm9iZSA9IGNhbV9mZF9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IGNhbV9mZF9kZXZfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImNhbV9mZCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBjYW1fZmRfZHRfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNhbV9mZF9kZXZfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjYW1fZmRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNhbV9mZF9kZXZfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2FtX2ZkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNhbV9mZF9kZXZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY2FtX2ZkX2Rldl9leGl0X21vZHVsZSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBGRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NzhjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21ncgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3N5bmMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9odworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvaW5jbHVkZQorCitvYmotJChDT05GSUdfU1BFQ1RSQV9DQU1FUkEpICs9IGZkX2h3Lworb2JqLSQoQ09ORklHX1NQRUNUUkFfQ0FNRVJBKSArPSBjYW1fZmRfaHdfbWdyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2NhbV9mZF9od19tZ3IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2NhbV9mZF9od19tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U2OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvY2FtX2ZkX2h3X21nci5jCkBAIC0wLDAgKzEsMTc0MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9jYW1fY3Bhcy5oPgorI2luY2x1ZGUgPG1lZGlhL2NhbV9yZXFfbWdyLmg+CisKKyNpbmNsdWRlICJjYW1faW9fdXRpbC5oIgorI2luY2x1ZGUgImNhbV9zb2NfdXRpbC5oIgorI2luY2x1ZGUgImNhbV9tZW1fbWdyX2FwaS5oIgorI2luY2x1ZGUgImNhbV9zbW11X2FwaS5oIgorI2luY2x1ZGUgImNhbV9wYWNrZXRfdXRpbC5oIgorI2luY2x1ZGUgImNhbV9mZF9jb250ZXh0LmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X2ludGYuaCIKKyNpbmNsdWRlICJjYW1fZmRfaHdfY29yZS5oIgorI2luY2x1ZGUgImNhbV9mZF9od19zb2MuaCIKKyNpbmNsdWRlICJjYW1fZmRfaHdfbWdyX2ludGYuaCIKKyNpbmNsdWRlICJjYW1fZmRfaHdfbWdyLmgiCisjaW5jbHVkZSAiY2FtX3RyYWNlLmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2FtX2ZkX2h3X21nciBnX2ZkX2h3X21ncjsKKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfcGFja2V0X3ZhbGlkYXRlKHN0cnVjdCBjYW1fcGFja2V0ICpwYWNrZXQpCit7CisJc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgKmNtZF9kZXNjID0gTlVMTDsKKwlpbnQgaSwgcmM7CisKKwlpZiAoIXBhY2tldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlDQU1fREJHKENBTV9GRCwgIlBhY2tldCByZXF1ZXN0PSVkLCBvcF9jb2RlPTB4JXgsIHNpemU9JWQsIGZsYWdzPSVkIiwKKwkJcGFja2V0LT5oZWFkZXIucmVxdWVzdF9pZCwgcGFja2V0LT5oZWFkZXIub3BfY29kZSwKKwkJcGFja2V0LT5oZWFkZXIuc2l6ZSwgcGFja2V0LT5oZWFkZXIuZmxhZ3MpOworCUNBTV9EQkcoQ0FNX0ZELAorCQkiUGFja2V0IGNtZGJ1ZihvZmZzZXQ9JWQsIG51bT0lZCkgaW8ob2Zmc2V0PSVkLCBudW09JWQpIiwKKwkJcGFja2V0LT5jbWRfYnVmX29mZnNldCwgcGFja2V0LT5udW1fY21kX2J1ZiwKKwkJcGFja2V0LT5pb19jb25maWdzX29mZnNldCwgcGFja2V0LT5udW1faW9fY29uZmlncyk7CisJQ0FNX0RCRyhDQU1fRkQsCisJCSJQYWNrZXQgUGF0Y2gob2Zmc2V0PSVkLCBudW09JWQpIGttZChvZmZzZXQ9JWQsIG51bT0lZCkiLAorCQlwYWNrZXQtPnBhdGNoX29mZnNldCwgcGFja2V0LT5udW1fcGF0Y2hlcywKKwkJcGFja2V0LT5rbWRfY21kX2J1Zl9vZmZzZXQsIHBhY2tldC0+a21kX2NtZF9idWZfaW5kZXgpOworCisJaWYgKGNhbV9wYWNrZXRfdXRpbF92YWxpZGF0ZV9wYWNrZXQocGFja2V0KSkgeworCQlDQU1fRVJSKENBTV9GRCwgImludmFsaWQgcGFja2V0OiVkICVkICVkICVkICVkIiwKKwkJCXBhY2tldC0+a21kX2NtZF9idWZfaW5kZXgsCisJCQlwYWNrZXQtPm51bV9jbWRfYnVmLCBwYWNrZXQtPmNtZF9idWZfb2Zmc2V0LAorCQkJcGFja2V0LT5pb19jb25maWdzX29mZnNldCwgcGFja2V0LT5oZWFkZXIuc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFsbCBidWZmZXJzIG11c3QgY29tZSB0aHJvdWdoIGlvIGNvbmZpZywgZG8gbm90IHN1cHBvcnQgcGF0Y2hpbmcgKi8KKwlpZiAocGFja2V0LT5udW1fcGF0Y2hlcyB8fCAhcGFja2V0LT5udW1faW9fY29uZmlncykgeworCQlDQU1fRVJSKENBTV9GRCwgIndyb25nIG51bWJlciBvZiBjbWQvcGF0Y2ggaW5mbzogJXUgJXUiLAorCQkJcGFja2V0LT5udW1fY21kX2J1ZiwgcGFja2V0LT5udW1fcGF0Y2hlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEtNRCBCdWYgaW5kZXggY2FuIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBudW0gY21kIGJ1ZnMgKi8KKwlpZiAocGFja2V0LT5rbWRfY21kX2J1Zl9pbmRleCA+PSBwYWNrZXQtPm51bV9jbWRfYnVmKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBrbWQgaW5kZXggJWQgKCVkKSIsCisJCQlwYWNrZXQtPmttZF9jbWRfYnVmX2luZGV4LCBwYWNrZXQtPm51bV9jbWRfYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChwYWNrZXQtPmhlYWRlci5vcF9jb2RlICYgMHhmZikgIT0KKwkJQ0FNX1BBQ0tFVF9PUENPREVTX0ZEX0ZSQU1FX1VQREFURSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgb3BfY29kZSAldSIsCisJCQlwYWNrZXQtPmhlYWRlci5vcF9jb2RlICYgMHhmZik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNtZF9kZXNjID0gKHN0cnVjdCBjYW1fY21kX2J1Zl9kZXNjICopICgodWludDhfdCAqKSZwYWNrZXQtPnBheWxvYWQgKworCQlwYWNrZXQtPmNtZF9idWZfb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPm51bV9jbWRfYnVmOyBpKyspIHsKKwkJLyoKKwkJICogV2UgY2FuIGFsbG93IDAgbGVuZ3RoIGNtZCBidWZmZXIuIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlCisJCSAqIHVtZCBnaXZlcyBhbiBlbXB0eSBjbWQgYnVmZmVyIGFzIGttZCBidWZmZXIKKwkJICovCisJCWlmICghY21kX2Rlc2NbaV0ubGVuZ3RoKQorCQkJY29udGludWU7CisKKwkJaWYgKChjbWRfZGVzY1tpXS5tZXRhX2RhdGEgIT0gQ0FNX0ZEX0NNRF9CVUZGRVJfSURfR0VORVJJQykgJiYKKwkJCShjbWRfZGVzY1tpXS5tZXRhX2RhdGEgIT0gQ0FNX0ZEX0NNRF9CVUZGRVJfSURfQ0RNKSkgeworCQkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIG1ldGFfZGF0YSBbJWRdICV1IiwgaSwKKwkJCQljbWRfZGVzY1tpXS5tZXRhX2RhdGEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlDQU1fREJHKENBTV9GRCwKKwkJCSJDbWRCdWZbJWRdIGhkbD0lZCwgb2Zmc2V0PSVkLCBzaXplPSVkLCBsZW49JWQsIHR5cGU9JWQsIG1ldGFfZGF0YT0lZCIsCisJCQlpLAorCQkJY21kX2Rlc2NbaV0ubWVtX2hhbmRsZSwgY21kX2Rlc2NbaV0ub2Zmc2V0LAorCQkJY21kX2Rlc2NbaV0uc2l6ZSwgY21kX2Rlc2NbaV0ubGVuZ3RoLCBjbWRfZGVzY1tpXS50eXBlLAorCQkJY21kX2Rlc2NbaV0ubWV0YV9kYXRhKTsKKworCQlyYyA9IGNhbV9wYWNrZXRfdXRpbF92YWxpZGF0ZV9jbWRfZGVzYygmY21kX2Rlc2NbaV0pOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBjbWQgYnVmZmVyICVkIiwgaSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfcHV0X2N0eCgKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzcmNfbGlzdCwKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKipmZF9jdHgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmN0eF9wdHIgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZ19mZF9od19tZ3IuY3R4X211dGV4KTsKKwljdHhfcHRyID0gKmZkX2N0eDsKKwlpZiAoY3R4X3B0cikKKwkJbGlzdF9hZGRfdGFpbCgmY3R4X3B0ci0+bGlzdCwgc3JjX2xpc3QpOworCSpmZF9jdHggPSBOVUxMOworCW11dGV4X3VubG9jaygmZ19mZF9od19tZ3IuY3R4X211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfZ2V0X2N0eCgKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzcmNfbGlzdCwKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKipmZF9jdHgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmN0eF9wdHIgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZ19mZF9od19tZ3IuY3R4X211dGV4KTsKKwlpZiAoIWxpc3RfZW1wdHkoc3JjX2xpc3QpKSB7CisJCWN0eF9wdHIgPSBsaXN0X2ZpcnN0X2VudHJ5KHNyY19saXN0LAorCQkJc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4LCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY3R4X3B0ci0+bGlzdCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJObyBtb3JlIGZyZWUgZmQgaHcgbWdyIGN0eCIpOworCQlyYyA9IC0xOworCX0KKwkqZmRfY3R4ID0gY3R4X3B0cjsKKwltdXRleF91bmxvY2soJmdfZmRfaHdfbWdyLmN0eF9tdXRleCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl91dGlsX3B1dF9mcmFtZV9yZXEoCisJc3RydWN0IGxpc3RfaGVhZCAqc3JjX2xpc3QsCisJc3RydWN0IGNhbV9mZF9tZ3JfZnJhbWVfcmVxdWVzdCAqKmZyYW1lX3JlcSkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1fZmRfbWdyX2ZyYW1lX3JlcXVlc3QgKnJlcV9wdHIgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmZ19mZF9od19tZ3IuZnJhbWVfcmVxX211dGV4KTsKKwlyZXFfcHRyID0gKmZyYW1lX3JlcTsKKwlpZiAocmVxX3B0cikKKwkJbGlzdF9hZGRfdGFpbCgmcmVxX3B0ci0+bGlzdCwgc3JjX2xpc3QpOworCSpmcmFtZV9yZXEgPSBOVUxMOworCW11dGV4X3VubG9jaygmZ19mZF9od19tZ3IuZnJhbWVfcmVxX211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfZ2V0X2ZyYW1lX3JlcSgKKwlzdHJ1Y3QgbGlzdF9oZWFkICpzcmNfbGlzdCwKKwlzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0ICoqZnJhbWVfcmVxKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGNhbV9mZF9tZ3JfZnJhbWVfcmVxdWVzdCAqcmVxX3B0ciA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZnX2ZkX2h3X21nci5mcmFtZV9yZXFfbXV0ZXgpOworCWlmICghbGlzdF9lbXB0eShzcmNfbGlzdCkpIHsKKwkJcmVxX3B0ciA9IGxpc3RfZmlyc3RfZW50cnkoc3JjX2xpc3QsCisJCQlzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0LCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxX3B0ci0+bGlzdCk7CisJfSBlbHNlIHsKKwkJQ0FNX0RCRyhDQU1fRkQsICJGcmFtZSByZXEgbm90IGF2YWlsYWJsZSIpOworCQlyYyA9IC1FUEVSTTsKKwl9CisJKmZyYW1lX3JlcSA9IHJlcV9wdHI7CisJbXV0ZXhfdW5sb2NrKCZnX2ZkX2h3X21nci5mcmFtZV9yZXFfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9tZ3JfdXRpbF9nZXRfZGV2aWNlKHN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICpod19jdHgsIHN0cnVjdCBjYW1fZmRfZGV2aWNlICoqaHdfZGV2aWNlKQoreworCWlmICghaHdfbWdyIHx8ICFod19jdHggfHwgIWh3X2RldmljZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgJXBLICVwSyAlcEsiLCBod19tZ3IsIGh3X2N0eCwKKwkJCWh3X2RldmljZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoaHdfY3R4LT5kZXZpY2VfaW5kZXggPCAwKSB8fAorCQkoaHdfY3R4LT5kZXZpY2VfaW5kZXggPj0gQ0FNX0ZEX0hXX01BWCkpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGRldmljZSBpbmR4ICVkIiwgaHdfY3R4LT5kZXZpY2VfaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlDQU1fREJHKENBTV9GRCwgImN0eCBpbmRleD0lZCwgaHdfY3R4PSVkIiwgaHdfY3R4LT5jdHhfaW5kZXgsCisJCWh3X2N0eC0+ZGV2aWNlX2luZGV4KTsKKworCSpod19kZXZpY2UgPSAmaHdfbWdyLT5od19kZXZpY2VbaHdfY3R4LT5kZXZpY2VfaW5kZXhdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl91dGlsX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICpod19jdHgpCit7CisJc3RydWN0IGNhbV9mZF9kZXZpY2UgKmh3X2RldmljZTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3JlbGVhc2VfYXJncyBod19yZWxlYXNlX2FyZ3M7CisJaW50IHJjOworCisJcmMgPSBjYW1fZmRfbWdyX3V0aWxfZ2V0X2RldmljZShod19tZ3IsIGh3X2N0eCwgJmh3X2RldmljZSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgaW4gZ2V0dGluZyBkZXZpY2UgJWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMucmVsZWFzZSkgeworCQlod19yZWxlYXNlX2FyZ3MuaHdfY3R4ID0gaHdfY3R4OworCQlod19yZWxlYXNlX2FyZ3MuY3R4X2h3X3ByaXZhdGUgPSBod19jdHgtPmN0eF9od19wcml2YXRlOworCQlyYyA9IGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnJlbGVhc2UoCisJCQlod19kZXZpY2UtPmh3X2ludGYtPmh3X3ByaXYsICZod19yZWxlYXNlX2FyZ3MsCisJCQlzaXplb2YoaHdfcmVsZWFzZV9hcmdzKSk7CisJCWlmIChyYykgeworCQkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gSFcgcmVsZWFzZSAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCByZWxlYXNlIGZ1bmN0aW9uIik7CisJfQorCisJbXV0ZXhfbG9jaygmaHdfbWdyLT5od19tZ3JfbXV0ZXgpOworCWh3X2RldmljZS0+bnVtX2N0eHRzLS07CisJbXV0ZXhfdW5sb2NrKCZod19tZ3ItPmh3X21ncl9tdXRleCk7CisKKwlod19jdHgtPmRldmljZV9pbmRleCA9IC0xOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9tZ3JfdXRpbF9zZWxlY3RfZGV2aWNlKHN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICpod19jdHgsCisJc3RydWN0IGNhbV9mZF9hY3F1aXJlX2Rldl9pbmZvICpmZF9hY3F1aXJlX2FyZ3MpCit7CisJaW50IGksIHJjOworCXN0cnVjdCBjYW1fZmRfaHdfcmVzZXJ2ZV9hcmdzIGh3X3Jlc2VydmVfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2RldmljZSAqaHdfZGV2aWNlID0gTlVMTDsKKworCWlmICghaHdfbWdyIHx8ICFod19jdHggfHwgIWZkX2FjcXVpcmVfYXJncykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgJXBLICVwSyAlcEsiLCBod19tZ3IsIGh3X2N0eCwKKwkJCWZkX2FjcXVpcmVfYXJncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKworCS8qIENoZWNrIGlmIGEgZGV2aWNlIGlzIGZyZWUgd2hpY2ggY2FuIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBod19tZ3ItPm51bV9kZXZpY2VzOyBpKyspIHsKKwkJaHdfZGV2aWNlID0gJmh3X21nci0+aHdfZGV2aWNlW2ldOworCQlDQU1fREJHKENBTV9GRCwKKwkJCSJbJWRdIDogbnVtX2N0eHRzPSVkLCBtb2Rlcz0lZCwgcmF3X3Jlc3VsdHM9JWQiLAorCQkJaSwgaHdfZGV2aWNlLT5udW1fY3R4dHMsCisJCQlod19kZXZpY2UtPmh3X2NhcHMuc3VwcG9ydGVkX21vZGVzLAorCQkJaHdfZGV2aWNlLT5od19jYXBzLnJhd19yZXN1bHRzX2F2YWlsYWJsZSk7CisJCWlmICgoaHdfZGV2aWNlLT5udW1fY3R4dHMgPT0gMCkgJiYKKwkJCShmZF9hY3F1aXJlX2FyZ3MtPm1vZGUgJgorCQkJaHdfZGV2aWNlLT5od19jYXBzLnN1cHBvcnRlZF9tb2RlcykgJiYKKwkJCSghZmRfYWNxdWlyZV9hcmdzLT5nZXRfcmF3X3Jlc3VsdHMgfHwKKwkJCWh3X2RldmljZS0+aHdfY2Fwcy5yYXdfcmVzdWx0c19hdmFpbGFibGUpKSB7CisJCQlDQU1fREJHKENBTV9GRCwgIkZvdW5kIGRlZGljYXRlZCBIVyBJbmRleD0lZCIsIGkpOworCQkJaHdfZGV2aWNlLT5udW1fY3R4dHMrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBjb3VsZG4ndCBmaW5kIGEgZnJlZSBIVyB3aGljaCBtZWV0cyByZXF1aXJlbWVudCwgbm93IGNoZWNrIGlmCisJICogdGhlcmUgaXMgYSBIVyB3aGljaCBtZWV0cyBhY3F1aXJlIHJlcXVpcmVtZW50cworCSAqLworCWlmIChpID09IGh3X21nci0+bnVtX2RldmljZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGh3X21nci0+bnVtX2RldmljZXM7IGkrKykgeworCQkJaHdfZGV2aWNlID0gJmh3X21nci0+aHdfZGV2aWNlW2ldOworCQkJaWYgKChmZF9hY3F1aXJlX2FyZ3MtPm1vZGUgJgorCQkJCWh3X2RldmljZS0+aHdfY2Fwcy5zdXBwb3J0ZWRfbW9kZXMpICYmCisJCQkJKCFmZF9hY3F1aXJlX2FyZ3MtPmdldF9yYXdfcmVzdWx0cyB8fAorCQkJCWh3X2RldmljZS0+aHdfY2Fwcy5yYXdfcmVzdWx0c19hdmFpbGFibGUpKSB7CisJCQkJaHdfZGV2aWNlLT5udW1fY3R4dHMrKzsKKwkJCQlDQU1fREJHKENBTV9GRCwgIkZvdW5kIHNoYXJpbmcgSFcgSW5kZXg9JWQiLCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmaHdfbWdyLT5od19tZ3JfbXV0ZXgpOworCisJaWYgKChpID09IGh3X21nci0+bnVtX2RldmljZXMpIHx8ICFod19kZXZpY2UpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJDb3VsZG4ndCBhY3F1aXJlIEhXICVkICVkIiwKKwkJCWZkX2FjcXVpcmVfYXJncy0+bW9kZSwKKwkJCWZkX2FjcXVpcmVfYXJncy0+Z2V0X3Jhd19yZXN1bHRzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlDQU1fREJHKENBTV9GRCwgIkRldmljZSBpbmRleCAlZCBzZWxlY3RlZCBmb3IgdGhpcyBhY3F1aXJlIiwgaSk7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gcmVzZXJ2ZSB0aGlzIEhXICovCisJaWYgKGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnJlc2VydmUpIHsKKwkJaHdfcmVzZXJ2ZV9hcmdzLmh3X2N0eCA9IGh3X2N0eDsKKwkJaHdfcmVzZXJ2ZV9hcmdzLm1vZGUgPSBmZF9hY3F1aXJlX2FyZ3MtPm1vZGU7CisJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMucmVzZXJ2ZSgKKwkJCWh3X2RldmljZS0+aHdfaW50Zi0+aHdfcHJpdiwgJmh3X3Jlc2VydmVfYXJncywKKwkJCXNpemVvZihod19yZXNlcnZlX2FyZ3MpKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIVyByZXNlcnZlICVkIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWh3X2N0eC0+Y3R4X2h3X3ByaXZhdGUgPSBod19yZXNlcnZlX2FyZ3MuY3R4X2h3X3ByaXZhdGU7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIHJlc2VydmUgZnVuY3Rpb24iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBVcGRhdGUgcmVxdWlyZWQgaW5mbyBpbiBodyBjb250ZXh0ICovCisJaHdfY3R4LT5kZXZpY2VfaW5kZXggPSBpOworCisJQ0FNX0RCRyhDQU1fRkQsICJjdHggaW5kZXg9JWQsIGRldmljZV9pbmRleD0lZCIsIGh3X2N0eC0+Y3R4X2luZGV4LAorCQlod19jdHgtPmRldmljZV9pbmRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfcGRldl9nZXRfaHdfaW50ZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCisJaW50IGksIHN0cnVjdCBjYW1faHdfaW50ZiAqKmRldmljZV9od19pbnRmKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlX25vZGUgPSBOVUxMOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNoaWxkX3BkZXYgPSBOVUxMOworCXN0cnVjdCBjYW1faHdfaW50ZiAqaHdfaW50ZiA9IE5VTEw7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IHJjOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChvZl9ub2RlLCAiY29tcGF0LWh3LW5hbWUiLCBpLCAmbmFtZSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiR2V0dGluZyBkZXYgb2JqZWN0IG5hbWUgZmFpbGVkICVkICVkIiwgaSwgcmMpOworCQlnb3RvIHB1dF9ub2RlOworCX0KKworCWRldmljZV9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgbmFtZSk7CisJaWYgKCFkZXZpY2Vfbm9kZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkNhbm5vdCBmaW5kIG5vZGUgaW4gZHRzaSAlcyIsIG5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljaGlsZF9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkZXZpY2Vfbm9kZSk7CisJaWYgKCFjaGlsZF9wZGV2KSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIHRvIGZpbmQgZGV2aWNlIG9uIGJ1cyAlcyIsCisJCQlkZXZpY2Vfbm9kZS0+bmFtZSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBwdXRfbm9kZTsKKwl9CisKKwlod19pbnRmID0gKHN0cnVjdCBjYW1faHdfaW50ZiAqKXBsYXRmb3JtX2dldF9kcnZkYXRhKGNoaWxkX3BkZXYpOworCWlmICghaHdfaW50ZikgeworCQlDQU1fRVJSKENBTV9GRCwgIk5vIGRyaXZlciBkYXRhIGZvciBjaGlsZCBkZXZpY2UiKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIHB1dF9ub2RlOworCX0KKworCUNBTV9EQkcoQ0FNX0ZELCAiY2hpbGQgdHlwZSAlZCBpbmRleCAlZCBjaGlsZF9pbnRmICVwSyIsCisJCWh3X2ludGYtPmh3X3R5cGUsIGh3X2ludGYtPmh3X2lkeCwgaHdfaW50Zik7CisKKwlpZiAoaHdfaW50Zi0+aHdfaWR4ID49IENBTV9GRF9IV19NQVgpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJod19pZHggaW52YWxpZCAlZCIsIGh3X2ludGYtPmh3X2lkeCk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBwdXRfbm9kZTsKKwl9CisKKwlyYyA9IDA7CisJKmRldmljZV9od19pbnRmID0gaHdfaW50ZjsKKworcHV0X25vZGU6CisJb2Zfbm9kZV9wdXQoZGV2aWNlX25vZGUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9wYWNrZXRfZ2VuZXJpY19ibG9iX2hhbmRsZXIodm9pZCAqdXNlcl9kYXRhLAorCXVpbnQzMl90IGJsb2JfdHlwZSwgdWludDMyX3QgYmxvYl9zaXplLCB1aW50OF90ICpibG9iX2RhdGEpCit7CisJc3RydWN0IGNhbV9mZF9od19jbWRfcHJlc3RhcnRfYXJncyAqcHJlc3RhcnRfYXJncyA9CisJCShzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9wcmVzdGFydF9hcmdzICopdXNlcl9kYXRhOworCisJaWYgKCFibG9iX2RhdGEgfHwgKGJsb2Jfc2l6ZSA9PSAwKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYmxvYiBpbmZvICVwSyAlZCIsIGJsb2JfZGF0YSwKKwkJCWJsb2Jfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcHJlc3RhcnRfYXJncykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgdXNlciBkYXRhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoYmxvYl90eXBlKSB7CisJY2FzZSBDQU1fRkRfQkxPQl9UWVBFX1JBV19SRVNVTFRTX1JFUVVJUkVEOiB7CisJCXVpbnQzMl90ICpnZXRfcmF3X3Jlc3VsdHMgPSAodWludDMyX3QgKilibG9iX2RhdGE7CisKKwkJaWYgKHNpemVvZih1aW50MzJfdCkgIT0gYmxvYl9zaXplKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYmxvYiBzaXplICVkICVkIiwKKwkJCQlzaXplb2YodWludDMyX3QpLCBibG9iX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlwcmVzdGFydF9hcmdzLT5nZXRfcmF3X3Jlc3VsdHMgPSAqZ2V0X3Jhd19yZXN1bHRzOworCQlicmVhazsKKwl9CisJY2FzZSBDQU1fRkRfQkxPQl9UWVBFX1NPQ19DTE9DS19CV19SRVFVRVNUOiB7CisJCXN0cnVjdCBjYW1fZmRfc29jX2Nsb2NrX2J3X3JlcXVlc3QgKmNsa19yZXEgPQorCQkJKHN0cnVjdCBjYW1fZmRfc29jX2Nsb2NrX2J3X3JlcXVlc3QgKilibG9iX2RhdGE7CisKKwkJaWYgKHNpemVvZihzdHJ1Y3QgY2FtX2ZkX3NvY19jbG9ja19id19yZXF1ZXN0KSAhPSBibG9iX3NpemUpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBibG9iIHNpemUgJWQgJWQiLAorCQkJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX3NvY19jbG9ja19id19yZXF1ZXN0KSwKKwkJCQlibG9iX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlDQU1fREJHKENBTV9GRCwgIlNPQyBDbGsgUmVxdWVzdCBjbG9jaz0lbGxkLCBidz0lbGxkIiwKKwkJCWNsa19yZXEtPmNsb2NrX3JhdGUsIGNsa19yZXEtPmJhbmR3aWR0aCk7CisKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUNBTV9XQVJOKENBTV9GRCwgIlVua25vd24gYmxvYiB0eXBlICVkIiwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl91dGlsX3BhcnNlX2dlbmVyaWNfY21kX2J1ZmZlcigKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eCwgc3RydWN0IGNhbV9wYWNrZXQgKnBhY2tldCwKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9wcmVzdGFydF9hcmdzICpwcmVzdGFydF9hcmdzKQoreworCXN0cnVjdCBjYW1fY21kX2J1Zl9kZXNjICpjbWRfZGVzYyA9IE5VTEw7CisJaW50IGksIHJjID0gMDsKKworCWNtZF9kZXNjID0gKHN0cnVjdCBjYW1fY21kX2J1Zl9kZXNjICopICgodWludDhfdCAqKSZwYWNrZXQtPnBheWxvYWQgKworCQlwYWNrZXQtPmNtZF9idWZfb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPm51bV9jbWRfYnVmOyBpKyspIHsKKwkJaWYgKCFjbWRfZGVzY1tpXS5sZW5ndGgpCisJCQljb250aW51ZTsKKworCQlpZiAoY21kX2Rlc2NbaV0ubWV0YV9kYXRhID09IENBTV9GRF9DTURfQlVGRkVSX0lEX0NETSkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gY2FtX3BhY2tldF91dGlsX3ZhbGlkYXRlX2NtZF9kZXNjKCZjbWRfZGVzY1tpXSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGNhbV9wYWNrZXRfdXRpbF9wcm9jZXNzX2dlbmVyaWNfY21kX2J1ZmZlcigmY21kX2Rlc2NbaV0sCisJCQljYW1fZmRfcGFja2V0X2dlbmVyaWNfYmxvYl9oYW5kbGVyLCBwcmVzdGFydF9hcmdzKTsKKwkJaWYgKHJjKQorCQkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gcHJvY2Vzc2luZyBibG9icyAlZCIsIHJjKTsKKworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl91dGlsX2dldF9idWZfbWFwX3JlcXVpcmVtZW50KHVpbnQzMl90IGRpcmVjdGlvbiwKKwl1aW50MzJfdCByZXNvdXJjZV90eXBlLCBib29sICpuZWVkX2lvX21hcCwgYm9vbCAqbmVlZF9jcHVfbWFwKQoreworCWlmICghbmVlZF9pb19tYXAgfHwgIW5lZWRfY3B1X21hcCkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgcG9pbnRlcnMgJXBLICVwSyIsIG5lZWRfaW9fbWFwLAorCQkJbmVlZF9jcHVfbWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRpcmVjdGlvbiA9PSBDQU1fQlVGX0lOUFVUKSB7CisJCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgeworCQljYXNlIENBTV9GRF9JTlBVVF9QT1JUX0lEX0lNQUdFOgorCQkJKm5lZWRfaW9fbWFwID0gdHJ1ZTsKKwkJCSpuZWVkX2NwdV9tYXAgPSBmYWxzZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQ0FNX1dBUk4oQ0FNX0ZELCAiSW52YWxpZCBwb3J0OiBkaXIgJWQsIGlkICVkIiwKKwkJCQlkaXJlY3Rpb24sIHJlc291cmNlX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBDQU1fQlVGX09VVFBVVCkgeworCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUpIHsKKwkJY2FzZSBDQU1fRkRfT1VUUFVUX1BPUlRfSURfUkVTVUxUUzoKKwkJCSpuZWVkX2lvX21hcCA9IHRydWU7CisJCQkqbmVlZF9jcHVfbWFwID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GRF9PVVRQVVRfUE9SVF9JRF9SQVdfUkVTVUxUUzoKKwkJCSpuZWVkX2lvX21hcCA9IHRydWU7CisJCQkqbmVlZF9jcHVfbWFwID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GRF9PVVRQVVRfUE9SVF9JRF9XT1JLX0JVRkZFUjoKKwkJCSpuZWVkX2lvX21hcCA9IHRydWU7CisJCQkqbmVlZF9jcHVfbWFwID0gZmFsc2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUNBTV9XQVJOKENBTV9GRCwgIkludmFsaWQgcG9ydDogZGlyICVkLCBpZCAlZCIsCisJCQkJZGlyZWN0aW9uLCByZXNvdXJjZV90eXBlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJQ0FNX1dBUk4oQ0FNX0ZELCAiSW52YWxpZCBkaXJlY3Rpb24gJWQiLCBkaXJlY3Rpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfcHJlcGFyZV9pb19idWZfaW5mbyhpbnQzMl90IGlvbW11X2hkbCwKKwlzdHJ1Y3QgY2FtX2h3X3ByZXBhcmVfdXBkYXRlX2FyZ3MgKnByZXBhcmUsCisJc3RydWN0IGNhbV9mZF9od19pb19idWZmZXIgKmlucHV0X2J1ZiwKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2lvX2J1ZmZlciAqb3V0cHV0X2J1ZiwgdWludDMyX3QgaW9fYnVmX3NpemUpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKwl1aW50MzJfdCBpLCBqLCBwbGFuZSwgbnVtX291dF9idWYsIG51bV9pbl9idWY7CisJc3RydWN0IGNhbV9idWZfaW9fY2ZnICppb19jZmc7CisJdWludDY0X3QgaW9fYWRkcltDQU1fUEFDS0VUX01BWF9QTEFORVNdOworCXVpbnQ2NF90IGNwdV9hZGRyW0NBTV9QQUNLRVRfTUFYX1BMQU5FU107CisJc2l6ZV90IHNpemU7CisJYm9vbCBuZWVkX2lvX21hcCwgbmVlZF9jcHVfbWFwOworCisJLyogR2V0IElPIEJ1ZiBpbmZvcm1hdGlvbiAqLworCW51bV9vdXRfYnVmID0gMDsKKwludW1faW5fYnVmICA9IDA7CisJaW9fY2ZnID0gKHN0cnVjdCBjYW1fYnVmX2lvX2NmZyAqKSAoKHVpbnQ4X3QgKikKKwkJJnByZXBhcmUtPnBhY2tldC0+cGF5bG9hZCArIHByZXBhcmUtPnBhY2tldC0+aW9fY29uZmlnc19vZmZzZXQpOworCisJZm9yIChpID0gMDsgaSA8IHByZXBhcmUtPnBhY2tldC0+bnVtX2lvX2NvbmZpZ3M7IGkrKykgeworCQlDQU1fREJHKENBTV9GRCwKKwkJCSJJT0NvbmZpZ1slZF0gOiBoYW5kbGVbJWRdIERpclslZF0gUmVzWyVkXSBGZW5jZVslZF0sIEZvcm1hdFslZF0iLAorCQkJaSwgaW9fY2ZnW2ldLm1lbV9oYW5kbGVbMF0sIGlvX2NmZ1tpXS5kaXJlY3Rpb24sCisJCQlpb19jZmdbaV0ucmVzb3VyY2VfdHlwZSwKKwkJCWlvX2NmZ1tpXS5mZW5jZSwgaW9fY2ZnW2ldLmZvcm1hdCk7CisKKwkJaWYgKChudW1faW5fYnVmID49IGlvX2J1Zl9zaXplKSB8fAorCQkJKG51bV9vdXRfYnVmID49IGlvX2J1Zl9zaXplKSkgeworCQkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIG51bWJlciBvZiBidWZmZXJzICVkICVkICVkIiwKKwkJCQludW1faW5fYnVmLCBudW1fb3V0X2J1ZiwgaW9fYnVmX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfYnVmX21hcF9yZXF1aXJlbWVudCgKKwkJCWlvX2NmZ1tpXS5kaXJlY3Rpb24sIGlvX2NmZ1tpXS5yZXNvdXJjZV90eXBlLAorCQkJJm5lZWRfaW9fbWFwLCAmbmVlZF9jcHVfbWFwKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fV0FSTihDQU1fRkQsICJJbnZhbGlkIGlvIGJ1ZmYgWyVkXSA6ICVkICVkICVkIiwKKwkJCQlpLCBpb19jZmdbaV0uZGlyZWN0aW9uLAorCQkJCWlvX2NmZ1tpXS5yZXNvdXJjZV90eXBlLCByYyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldChpb19hZGRyLCAweDAsIHNpemVvZihpb19hZGRyKSk7CisJCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IENBTV9QQUNLRVRfTUFYX1BMQU5FUzsgcGxhbmUrKykgeworCQkJaWYgKCFpb19jZmdbaV0ubWVtX2hhbmRsZVtwbGFuZV0pCisJCQkJYnJlYWs7CisKKwkJCWlvX2FkZHJbcGxhbmVdID0gMHgwOworCQkJY3B1X2FkZHJbcGxhbmVdID0gMHgwOworCisJCQlpZiAobmVlZF9pb19tYXApIHsKKwkJCQlyYyA9IGNhbV9tZW1fZ2V0X2lvX2J1ZigKKwkJCQkJaW9fY2ZnW2ldLm1lbV9oYW5kbGVbcGxhbmVdLAorCQkJCQlpb21tdV9oZGwsICZpb19hZGRyW3BsYW5lXSwgJnNpemUpOworCQkJCWlmICgocmMpIHx8IChpb19hZGRyW3BsYW5lXSA+PiAzMikpIHsKKwkJCQkJQ0FNX0VSUihDQU1fRkQsCisJCQkJCQkiSW52YWxpZCBpbyBidWYgJWQgJWQgJWQgJWQiLAorCQkJCQkJaW9fY2ZnW2ldLmRpcmVjdGlvbiwKKwkJCQkJCWlvX2NmZ1tpXS5yZXNvdXJjZV90eXBlLCBwbGFuZSwKKwkJCQkJCXJjKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCisJCQkJaW9fYWRkcltwbGFuZV0gKz0gaW9fY2ZnW2ldLm9mZnNldHNbcGxhbmVdOworCQkJfQorCisJCQlpZiAobmVlZF9jcHVfbWFwKSB7CisJCQkJcmMgPSBjYW1fbWVtX2dldF9jcHVfYnVmKAorCQkJCQlpb19jZmdbaV0ubWVtX2hhbmRsZVtwbGFuZV0sCisJCQkJCSZjcHVfYWRkcltwbGFuZV0sICZzaXplKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJQ0FNX0VSUihDQU1fRkQsCisJCQkJCQkiSW52YWxpZCBjcHUgYnVmICVkICVkICVkICVkIiwKKwkJCQkJCWlvX2NmZ1tpXS5kaXJlY3Rpb24sCisJCQkJCQlpb19jZmdbaV0ucmVzb3VyY2VfdHlwZSwgcGxhbmUsCisJCQkJCQlyYyk7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CisKKwkJCQljcHVfYWRkcltwbGFuZV0gKz0gaW9fY2ZnW2ldLm9mZnNldHNbcGxhbmVdOworCQkJfQorCisJCQlDQU1fREJHKENBTV9GRCwgIklPIEFkZHJlc3NbJWRdWyVkXSA6ICVwSywgJXBLIiwKKwkJCQlpb19jZmdbaV0uZGlyZWN0aW9uLCBwbGFuZSwgaW9fYWRkcltwbGFuZV0sCisJCQkJY3B1X2FkZHJbcGxhbmVdKTsKKwkJfQorCisJCXN3aXRjaCAoaW9fY2ZnW2ldLmRpcmVjdGlvbikgeworCQljYXNlIENBTV9CVUZfSU5QVVQ6IHsKKwkJCXByZXBhcmUtPmluX21hcF9lbnRyaWVzW251bV9pbl9idWZdLnJlc291cmNlX2hhbmRsZSA9CisJCQkJaW9fY2ZnW2ldLnJlc291cmNlX3R5cGU7CisJCQlwcmVwYXJlLT5pbl9tYXBfZW50cmllc1tudW1faW5fYnVmXS5zeW5jX2lkID0KKwkJCQlpb19jZmdbaV0uZmVuY2U7CisKKwkJCWlucHV0X2J1ZltudW1faW5fYnVmXS52YWxpZCA9IHRydWU7CisJCQlmb3IgKGogPSAwOyBqIDwgcGxhbmU7IGorKykgeworCQkJCWlucHV0X2J1ZltudW1faW5fYnVmXS5pb19hZGRyW2pdID0gaW9fYWRkcltqXTsKKwkJCQlpbnB1dF9idWZbbnVtX2luX2J1Zl0uY3B1X2FkZHJbal0gPSBjcHVfYWRkcltqXTsKKwkJCX0KKwkJCWlucHV0X2J1ZltudW1faW5fYnVmXS5udW1fYnVmID0gcGxhbmU7CisJCQlpbnB1dF9idWZbbnVtX2luX2J1Zl0uaW9fY2ZnID0gJmlvX2NmZ1tpXTsKKworCQkJbnVtX2luX2J1ZisrOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDQU1fQlVGX09VVFBVVDogeworCQkJcHJlcGFyZS0+b3V0X21hcF9lbnRyaWVzW251bV9vdXRfYnVmXS5yZXNvdXJjZV9oYW5kbGUgPQorCQkJCWlvX2NmZ1tpXS5yZXNvdXJjZV90eXBlOworCQkJcHJlcGFyZS0+b3V0X21hcF9lbnRyaWVzW251bV9vdXRfYnVmXS5zeW5jX2lkID0KKwkJCQlpb19jZmdbaV0uZmVuY2U7CisKKwkJCW91dHB1dF9idWZbbnVtX291dF9idWZdLnZhbGlkID0gdHJ1ZTsKKwkJCWZvciAoaiA9IDA7IGogPCBwbGFuZTsgaisrKSB7CisJCQkJb3V0cHV0X2J1ZltudW1fb3V0X2J1Zl0uaW9fYWRkcltqXSA9IGlvX2FkZHJbal07CisJCQkJb3V0cHV0X2J1ZltudW1fb3V0X2J1Zl0uY3B1X2FkZHJbal0gPQorCQkJCQljcHVfYWRkcltqXTsKKwkJCX0KKwkJCW91dHB1dF9idWZbbnVtX291dF9idWZdLm51bV9idWYgPSBwbGFuZTsKKwkJCW91dHB1dF9idWZbbnVtX291dF9idWZdLmlvX2NmZyA9ICZpb19jZmdbaV07CisKKwkJCW51bV9vdXRfYnVmKys7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJQ0FNX0VSUihDQU1fRkQsICJVbnN1cHBvcnRlZCBpbyBkaXJlY3Rpb24gJWQiLAorCQkJCWlvX2NmZ1tpXS5kaXJlY3Rpb24pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlwcmVwYXJlLT5udW1faW5fbWFwX2VudHJpZXMgID0gbnVtX2luX2J1ZjsKKwlwcmVwYXJlLT5udW1fb3V0X21hcF9lbnRyaWVzID0gbnVtX291dF9idWY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfcHJlcGFyZV9od191cGRhdGVfZW50cmllcygKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAqcHJlcGFyZSwKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9wcmVzdGFydF9hcmdzICpwcmVzdGFydF9hcmdzLAorCXN0cnVjdCBjYW1fa21kX2J1Zl9pbmZvICprbWRfYnVmX2luZm8pCit7CisJaW50IGksIHJjOworCXN0cnVjdCBjYW1faHdfdXBkYXRlX2VudHJ5ICpod19lbnRyeTsKKwl1aW50MzJfdCBudW1fZW50OworCXN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqaHdfY3R4ID0KKwkJKHN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqKXByZXBhcmUtPmN0eHRfdG9faHdfbWFwOworCXN0cnVjdCBjYW1fZmRfZGV2aWNlICpod19kZXZpY2U7CisJdWludDMyX3Qga21kX2J1Zl9tYXhfc2l6ZSwga21kX2J1Zl91c2VkX2J5dGVzID0gMDsKKwl1aW50MzJfdCAqa21kX2J1Zl9hZGRyOworCXN0cnVjdCBjYW1fY21kX2J1Zl9kZXNjICpjbWRfZGVzYyA9IE5VTEw7CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfZGV2aWNlKGh3X21nciwgaHdfY3R4LCAmaHdfZGV2aWNlKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBnZXR0aW5nIGRldmljZSAlZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWttZF9idWZfYWRkciA9ICh1aW50MzJfdCAqKSgodWludDhfdCAqKWttZF9idWZfaW5mby0+Y3B1X2FkZHIgKworCQlrbWRfYnVmX2luZm8tPnVzZWRfYnl0ZXMpOworCWttZF9idWZfbWF4X3NpemUgPSBrbWRfYnVmX2luZm8tPnNpemUgLSBrbWRfYnVmX2luZm8tPnVzZWRfYnl0ZXM7CisKKwlwcmVzdGFydF9hcmdzLT5jbWRfYnVmX2FkZHIgPSBrbWRfYnVmX2FkZHI7CisJcHJlc3RhcnRfYXJncy0+c2l6ZSAgPSBrbWRfYnVmX21heF9zaXplOworCXByZXN0YXJ0X2FyZ3MtPnByZV9jb25maWdfYnVmX3NpemUgPSAwOworCXByZXN0YXJ0X2FyZ3MtPnBvc3RfY29uZmlnX2J1Zl9zaXplID0gMDsKKworCWlmIChod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5wcm9jZXNzX2NtZCkgeworCQlyYyA9IGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnByb2Nlc3NfY21kKAorCQkJaHdfZGV2aWNlLT5od19pbnRmLT5od19wcml2LCBDQU1fRkRfSFdfQ01EX1BSRVNUQVJULAorCQkJcHJlc3RhcnRfYXJncywKKwkJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9wcmVzdGFydF9hcmdzKSk7CisJCWlmIChyYykgeworCQkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gQ01EX1BSRVNUQVJUICVkIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJa21kX2J1Zl91c2VkX2J5dGVzICs9IHByZXN0YXJ0X2FyZ3MtPnByZV9jb25maWdfYnVmX3NpemU7CisJa21kX2J1Zl91c2VkX2J5dGVzICs9IHByZXN0YXJ0X2FyZ3MtPnBvc3RfY29uZmlnX2J1Zl9zaXplOworCisJLyogSFcgbGF5ZXIgaXMgZXhwZWN0ZWQgdG8gYWRkIGNvbW1hbmRzICovCisJaWYgKCFrbWRfYnVmX3VzZWRfYnl0ZXMgfHwgKGttZF9idWZfdXNlZF9ieXRlcyA+IGttZF9idWZfbWF4X3NpemUpKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBrbWQgdXNlZCBieXRlcyAlZCAoJWQpIiwKKwkJCWttZF9idWZfdXNlZF9ieXRlcywga21kX2J1Zl9tYXhfc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWh3X2VudHJ5ID0gcHJlcGFyZS0+aHdfdXBkYXRlX2VudHJpZXM7CisJbnVtX2VudCA9IDA7CisKKwlpZiAocHJlc3RhcnRfYXJncy0+cHJlX2NvbmZpZ19idWZfc2l6ZSkgeworCQlpZiAoKG51bV9lbnQgKyAxKSA+PSBwcmVwYXJlLT5tYXhfaHdfdXBkYXRlX2VudHJpZXMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiSW5zdWZmaWNpZW50ICBIVyBlbnRyaWVzIDolZCAlZCIsCisJCQkJbnVtX2VudCwgcHJlcGFyZS0+bWF4X2h3X3VwZGF0ZV9lbnRyaWVzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaHdfZW50cnlbbnVtX2VudF0uaGFuZGxlID0ga21kX2J1Zl9pbmZvLT5oYW5kbGU7CisJCWh3X2VudHJ5W251bV9lbnRdLmxlbiAgPSBwcmVzdGFydF9hcmdzLT5wcmVfY29uZmlnX2J1Zl9zaXplOworCQlod19lbnRyeVtudW1fZW50XS5vZmZzZXQgPSBrbWRfYnVmX2luZm8tPm9mZnNldDsKKworCQlrbWRfYnVmX2luZm8tPnVzZWRfYnl0ZXMgKz0gcHJlc3RhcnRfYXJncy0+cHJlX2NvbmZpZ19idWZfc2l6ZTsKKwkJa21kX2J1Zl9pbmZvLT5vZmZzZXQgKz0gcHJlc3RhcnRfYXJncy0+cHJlX2NvbmZpZ19idWZfc2l6ZTsKKwkJbnVtX2VudCsrOworCX0KKworCS8qCisJICogc2V0IHRoZSBjbWRfZGVzYyB0byBwb2ludCB0aGUgZmlyc3QgY29tbWFuZCBkZXNjcmlwdG9yIGluIHRoZQorCSAqIHBhY2tldCBhbmQgdXBkYXRlIGh3IGVudHJpZXMgd2l0aCBDRE0gY29tbWFuZCBidWZmZXJzCisJICovCisJY21kX2Rlc2MgPSAoc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgKikoKHVpbnQ4X3QgKikKKwkJJnByZXBhcmUtPnBhY2tldC0+cGF5bG9hZCArIHByZXBhcmUtPnBhY2tldC0+Y21kX2J1Zl9vZmZzZXQpOworCisJZm9yIChpID0gMDsgaSA8IHByZXBhcmUtPnBhY2tldC0+bnVtX2NtZF9idWY7IGkrKykgeworCQlpZiAoIWNtZF9kZXNjW2ldLmxlbmd0aCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjbWRfZGVzY1tpXS5tZXRhX2RhdGEgIT0gQ0FNX0ZEX0NNRF9CVUZGRVJfSURfQ0RNKQorCQkJY29udGludWU7CisKKwkJaWYgKG51bV9lbnQgKyAxID49IHByZXBhcmUtPm1heF9od191cGRhdGVfZW50cmllcykgeworCQkJQ0FNX0VSUihDQU1fRkQsICJJbnN1ZmZpY2llbnQgIEhXIGVudHJpZXMgOiVkICVkIiwKKwkJCQludW1fZW50LCBwcmVwYXJlLT5tYXhfaHdfdXBkYXRlX2VudHJpZXMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlod19lbnRyeVtudW1fZW50XS5oYW5kbGUgPSBjbWRfZGVzY1tpXS5tZW1faGFuZGxlOworCQlod19lbnRyeVtudW1fZW50XS5sZW4gPSBjbWRfZGVzY1tpXS5sZW5ndGg7CisJCWh3X2VudHJ5W251bV9lbnRdLm9mZnNldCA9IGNtZF9kZXNjW2ldLm9mZnNldDsKKwkJbnVtX2VudCsrOworCX0KKworCWlmIChwcmVzdGFydF9hcmdzLT5wb3N0X2NvbmZpZ19idWZfc2l6ZSkgeworCQlpZiAobnVtX2VudCArIDEgPj0gcHJlcGFyZS0+bWF4X2h3X3VwZGF0ZV9lbnRyaWVzKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkluc3VmZmljaWVudCAgSFcgZW50cmllcyA6JWQgJWQiLAorCQkJCW51bV9lbnQsIHByZXBhcmUtPm1heF9od191cGRhdGVfZW50cmllcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWh3X2VudHJ5W251bV9lbnRdLmhhbmRsZSA9IGttZF9idWZfaW5mby0+aGFuZGxlOworCQlod19lbnRyeVtudW1fZW50XS5sZW4gICAgPSBwcmVzdGFydF9hcmdzLT5wb3N0X2NvbmZpZ19idWZfc2l6ZTsKKwkJaHdfZW50cnlbbnVtX2VudF0ub2Zmc2V0ID0ga21kX2J1Zl9pbmZvLT5vZmZzZXQ7CisKKwkJa21kX2J1Zl9pbmZvLT51c2VkX2J5dGVzICs9IHByZXN0YXJ0X2FyZ3MtPnBvc3RfY29uZmlnX2J1Zl9zaXplOworCQlrbWRfYnVmX2luZm8tPm9mZnNldCAgICAgKz0gcHJlc3RhcnRfYXJncy0+cG9zdF9jb25maWdfYnVmX3NpemU7CisKKwkJbnVtX2VudCsrOworCX0KKworCXByZXBhcmUtPm51bV9od191cGRhdGVfZW50cmllcyA9IG51bV9lbnQ7CisKKwlDQU1fREJHKENBTV9GRCwgIkZpbmFsQ29uZmlnIDogaHdfZW50cmllcz0lZCwgU3luYyhpbj0lZCwgb3V0PSVkKSIsCisJCXByZXBhcmUtPm51bV9od191cGRhdGVfZW50cmllcywgcHJlcGFyZS0+bnVtX2luX21hcF9lbnRyaWVzLAorCQlwcmVwYXJlLT5udW1fb3V0X21hcF9lbnRyaWVzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfc3VibWl0X2ZyYW1lKHZvaWQgKnByaXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhbV9mZF9kZXZpY2UgKmh3X2RldmljZTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqaHdfbWdyOworCXN0cnVjdCBjYW1fZmRfbWdyX2ZyYW1lX3JlcXVlc3QgKmZyYW1lX3JlcTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zdGFydF9hcmdzIHN0YXJ0X2FyZ3M7CisJaW50IHJjOworCisJaWYgKCFwcml2KSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBkYXRhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWh3X21nciA9IChzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqKXByaXY7CisJbXV0ZXhfbG9jaygmaHdfbWdyLT5mcmFtZV9yZXFfbXV0ZXgpOworCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgZnJhbWVzIHBlbmRpbmcgaW4gaGlnaCBwcmlvcml0eSBsaXN0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZod19tZ3ItPmZyYW1lX3BlbmRpbmdfbGlzdF9oaWdoKSkgeworCQlDQU1fREJHKENBTV9GRCwgIlBlbmRpbmcgZnJhbWVzIGluIGhpZ2ggcHJpb3JpdHkgbGlzdCIpOworCQlmcmFtZV9yZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZod19tZ3ItPmZyYW1lX3BlbmRpbmdfbGlzdF9oaWdoLAorCQkJc3RydWN0IGNhbV9mZF9tZ3JfZnJhbWVfcmVxdWVzdCwgbGlzdCk7CisJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmaHdfbWdyLT5mcmFtZV9wZW5kaW5nX2xpc3Rfbm9ybWFsKSkgeworCQlDQU1fREJHKENBTV9GRCwgIlBlbmRpbmcgZnJhbWVzIGluIG5vcm1hbCBwcmlvcml0eSBsaXN0Iik7CisJCWZyYW1lX3JlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmh3X21nci0+ZnJhbWVfcGVuZGluZ19saXN0X25vcm1hbCwKKwkJCXN0cnVjdCBjYW1fZmRfbWdyX2ZyYW1lX3JlcXVlc3QsIGxpc3QpOworCX0gZWxzZSB7CisJCW11dGV4X3VubG9jaygmaHdfbWdyLT5mcmFtZV9yZXFfbXV0ZXgpOworCQlDQU1fREJHKENBTV9GRCwgIk5vIHBlbmRpbmcgZnJhbWVzIik7CisJCXJldHVybiAwOworCX0KKworCUNBTV9EQkcoQ0FNX0ZELCAiRnJhbWVTdWJtaXQgOiBGcmFtZVslbGxkXSIsIGZyYW1lX3JlcS0+cmVxdWVzdF9pZCk7CisJaHdfY3R4ID0gZnJhbWVfcmVxLT5od19jdHg7CisJcmMgPSBjYW1fZmRfbWdyX3V0aWxfZ2V0X2RldmljZShod19tZ3IsIGh3X2N0eCwgJmh3X2RldmljZSk7CisJaWYgKHJjKSB7CisJCW11dGV4X3VubG9jaygmaHdfbWdyLT5mcmFtZV9yZXFfbXV0ZXgpOworCQlDQU1fRVJSKENBTV9GRCwgIkVycm9yIGluIGdldHRpbmcgZGV2aWNlICVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJbXV0ZXhfbG9jaygmaHdfZGV2aWNlLT5sb2NrKTsKKwlpZiAoaHdfZGV2aWNlLT5yZWFkeV90b19wcm9jZXNzID09IGZhbHNlKSB7CisJCW11dGV4X3VubG9jaygmaHdfZGV2aWNlLT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZod19tZ3ItPmZyYW1lX3JlcV9tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJdHJhY2VfY2FtX3N1Ym1pdF90b19odygiRkQiLCBmcmFtZV9yZXEtPnJlcXVlc3RfaWQpOworCisJbGlzdF9kZWxfaW5pdCgmZnJhbWVfcmVxLT5saXN0KTsKKwltdXRleF91bmxvY2soJmh3X21nci0+ZnJhbWVfcmVxX211dGV4KTsKKworCWlmIChod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5zdGFydCkgeworCQlzdGFydF9hcmdzLmh3X2N0eCA9IGh3X2N0eDsKKwkJc3RhcnRfYXJncy5jdHhfaHdfcHJpdmF0ZSA9IGh3X2N0eC0+Y3R4X2h3X3ByaXZhdGU7CisJCXN0YXJ0X2FyZ3MuaHdfcmVxX3ByaXZhdGUgPSAmZnJhbWVfcmVxLT5od19yZXFfcHJpdmF0ZTsKKwkJc3RhcnRfYXJncy5od191cGRhdGVfZW50cmllcyA9IGZyYW1lX3JlcS0+aHdfdXBkYXRlX2VudHJpZXM7CisJCXN0YXJ0X2FyZ3MubnVtX2h3X3VwZGF0ZV9lbnRyaWVzID0KKwkJCWZyYW1lX3JlcS0+bnVtX2h3X3VwZGF0ZV9lbnRyaWVzOworCisJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMuc3RhcnQoCisJCQlod19kZXZpY2UtPmh3X2ludGYtPmh3X3ByaXYsICZzdGFydF9hcmdzLAorCQkJc2l6ZW9mKHN0YXJ0X2FyZ3MpKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIVyBTdGFydCAlZCIsIHJjKTsKKwkJCW11dGV4X3VubG9jaygmaHdfZGV2aWNlLT5sb2NrKTsKKwkJCWdvdG8gcHV0X3JlcV9pbnRvX2ZyZWVfbGlzdDsKKwkJfQorCX0gZWxzZSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBod19vcHMuc3RhcnQiKTsKKwkJbXV0ZXhfdW5sb2NrKCZod19kZXZpY2UtPmxvY2spOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBwdXRfcmVxX2ludG9fZnJlZV9saXN0OworCX0KKworCWh3X2RldmljZS0+cmVhZHlfdG9fcHJvY2VzcyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmaHdfZGV2aWNlLT5sb2NrKTsKKworCXJjID0gY2FtX2ZkX21ncl91dGlsX3B1dF9mcmFtZV9yZXEoCisJCSZod19tZ3ItPmZyYW1lX3Byb2Nlc3NpbmdfbGlzdCwgJmZyYW1lX3JlcSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELAorCQkJIkZhaWxlZCBpbiBwdXR0aW5nIGZyYW1lIHJlcSBpbiBwcm9jZXNzaW5nIGxpc3QiKTsKKwkJZ290byBzdG9wX3VubG9jazsKKwl9CisKKwlyZXR1cm4gcmM7CisKK3N0b3BfdW5sb2NrOgorCWlmIChod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5zdG9wKSB7CisJCXN0cnVjdCBjYW1fZmRfaHdfc3RvcF9hcmdzIHN0b3BfYXJnczsKKworCQlzdG9wX2FyZ3MuaHdfY3R4ID0gaHdfY3R4OworCQlzdG9wX2FyZ3MuY3R4X2h3X3ByaXZhdGUgPSBod19jdHgtPmN0eF9od19wcml2YXRlOworCQlzdG9wX2FyZ3MuaHdfcmVxX3ByaXZhdGUgPSAmZnJhbWVfcmVxLT5od19yZXFfcHJpdmF0ZTsKKwkJaWYgKGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnN0b3AoCisJCQlod19kZXZpY2UtPmh3X2ludGYtPmh3X3ByaXYsICZzdG9wX2FyZ3MsCisJCQlzaXplb2Yoc3RvcF9hcmdzKSkpCisJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIVyBTdG9wICVkIiwgcmMpOworCX0KK3B1dF9yZXFfaW50b19mcmVlX2xpc3Q6CisJY2FtX2ZkX21ncl91dGlsX3B1dF9mcmFtZV9yZXEoJmh3X21nci0+ZnJhbWVfZnJlZV9saXN0LCAmZnJhbWVfcmVxKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX3V0aWxfc2NoZWR1bGVfZnJhbWVfd29ya2VyX3Rhc2soCisJc3RydWN0IGNhbV9mZF9od19tZ3IgKmh3X21ncikKK3sKKwlpbnQzMl90IHJjID0gMDsKKwlzdHJ1Y3QgY3JtX3dvcmtxX3Rhc2sgKnRhc2s7CisJc3RydWN0IGNhbV9mZF9tZ3Jfd29ya19kYXRhICp3b3JrX2RhdGE7CisKKwl0YXNrID0gY2FtX3JlcV9tZ3Jfd29ya3FfZ2V0X3Rhc2soaHdfbWdyLT53b3JrKTsKKwlpZiAoIXRhc2spIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJubyBlbXB0eSB0YXNrIGF2YWlsYWJsZSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3b3JrX2RhdGEgPSAoc3RydWN0IGNhbV9mZF9tZ3Jfd29ya19kYXRhICopdGFzay0+cGF5bG9hZDsKKwl3b3JrX2RhdGEtPnR5cGUgPSBDQU1fRkRfV09SS19GUkFNRTsKKworCXRhc2stPnByb2Nlc3NfY2IgPSBjYW1fZmRfbWdyX3V0aWxfc3VibWl0X2ZyYW1lOworCXJjID0gY2FtX3JlcV9tZ3Jfd29ya3FfZW5xdWV1ZV90YXNrKHRhc2ssIGh3X21nciwgQ1JNX1RBU0tfUFJJT1JJVFlfMCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQzMl90IGNhbV9mZF9tZ3Jfd29ya3FfaXJxX2NiKHZvaWQgKnByaXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhbV9mZF9kZXZpY2UgKmh3X2RldmljZSA9IE5VTEw7CisJc3RydWN0IGNhbV9mZF9od19tZ3IgKmh3X21ncjsKKwlzdHJ1Y3QgY2FtX2ZkX21ncl93b3JrX2RhdGEgKndvcmtfZGF0YTsKKwlzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0ICpmcmFtZV9yZXEgPSBOVUxMOworCWVudW0gY2FtX2ZkX2h3X2lycV90eXBlIGlycV90eXBlOworCWJvb2wgZnJhbWVfYWJvcnQgPSB0cnVlOworCWludCByYzsKKworCWlmICghZGF0YSB8fCAhcHJpdikgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgZGF0YSAlcEsgJXBLIiwgZGF0YSwgcHJpdik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWh3X21nciA9IChzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqKXByaXY7CisJd29ya19kYXRhID0gKHN0cnVjdCBjYW1fZmRfbWdyX3dvcmtfZGF0YSAqKWRhdGE7CisJaXJxX3R5cGUgPSB3b3JrX2RhdGEtPmlycV90eXBlOworCisJQ0FNX0RCRyhDQU1fRkQsICJGRCBJUlEgdHlwZT0lZCIsIGlycV90eXBlKTsKKworCWlmIChpcnFfdHlwZSA9PSBDQU1fRkRfSVJRX0hBTFRfRE9ORSkgeworCQkvKiBIQUxUIHdvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgUkVTRVQsIGlnbm9yZSB0aGlzICovCisJCUNBTV9EQkcoQ0FNX0ZELCAiSEFMVCBJUlEgY2FsbGJhY2siKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogR2V0IHRoZSBmcmFtZSBmcm9tIHByb2Nlc3NpbmcgbGlzdCAqLworCXJjID0gY2FtX2ZkX21ncl91dGlsX2dldF9mcmFtZV9yZXEoJmh3X21nci0+ZnJhbWVfcHJvY2Vzc2luZ19saXN0LAorCQkmZnJhbWVfcmVxKTsKKwlpZiAocmMgfHwgIWZyYW1lX3JlcSkgeworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgcmVzZXQgaXMgdHJpZ2dlcmVkIHdoaWxlIG5vIGZyYW1lcworCQkgKiB3ZXJlIHBlbmRpbmcsIHNvIG5vdCBhbiBlcnJvciwganVzdCBjb250aW51ZSB0byBjaGVjayBpZgorCQkgKiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgZnJhbWVzIGFuZCBzdWJtaXQKKwkJICovCisJCUNBTV9EQkcoQ0FNX0ZELCAiTm8gRnJhbWUgaW4gcHJvY2Vzc2luZyBsaXN0LCByYz0lZCIsIHJjKTsKKwkJZ290byBzdWJtaXRfbmV4dF9mcmFtZTsKKwl9CisKKwlpZiAoIWZyYW1lX3JlcS0+aHdfY3R4KSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBGcmFtZSByZXF1ZXN0ICVsbGQiLAorCQkJZnJhbWVfcmVxLT5yZXF1ZXN0X2lkKTsKKwkJZ290byBwdXRfcmVxX2luX2ZyZWVfbGlzdDsKKwl9CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfZGV2aWNlKGh3X21nciwgZnJhbWVfcmVxLT5od19jdHgsICZod19kZXZpY2UpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkVycm9yIGluIGdldHRpbmcgZGV2aWNlICVkIiwgcmMpOworCQlnb3RvIHB1dF9yZXFfaW5fZnJlZV9saXN0OworCX0KKworCS8qIFJlYWQgZnJhbWUgcmVzdWx0cyBmaXJzdCAqLworCWlmIChpcnFfdHlwZSA9PSBDQU1fRkRfSVJRX0ZSQU1FX0RPTkUpIHsKKwkJc3RydWN0IGNhbV9mZF9od19mcmFtZV9kb25lX2FyZ3MgZnJhbWVfZG9uZV9hcmdzOworCisJCUNBTV9EQkcoQ0FNX0ZELCAiRnJhbWVEb25lIDogRnJhbWVbJWxsZF0iLAorCQkJZnJhbWVfcmVxLT5yZXF1ZXN0X2lkKTsKKworCQlmcmFtZV9kb25lX2FyZ3MuaHdfY3R4ID0gZnJhbWVfcmVxLT5od19jdHg7CisJCWZyYW1lX2RvbmVfYXJncy5jdHhfaHdfcHJpdmF0ZSA9CisJCQlmcmFtZV9yZXEtPmh3X2N0eC0+Y3R4X2h3X3ByaXZhdGU7CisJCWZyYW1lX2RvbmVfYXJncy5yZXF1ZXN0X2lkID0gZnJhbWVfcmVxLT5yZXF1ZXN0X2lkOworCQlmcmFtZV9kb25lX2FyZ3MuaHdfcmVxX3ByaXZhdGUgPSAmZnJhbWVfcmVxLT5od19yZXFfcHJpdmF0ZTsKKworCQlpZiAoaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMucHJvY2Vzc19jbWQpIHsKKwkJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMucHJvY2Vzc19jbWQoCisJCQkJaHdfZGV2aWNlLT5od19pbnRmLT5od19wcml2LAorCQkJCUNBTV9GRF9IV19DTURfRlJBTUVfRE9ORSwKKwkJCQkmZnJhbWVfZG9uZV9hcmdzLCBzaXplb2YoZnJhbWVfZG9uZV9hcmdzKSk7CisJCQlpZiAocmMpIHsKKwkJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBDTURfUFJFU1RBUlQgJWQiLAorCQkJCQlyYyk7CisJCQkJZnJhbWVfYWJvcnQgPSB0cnVlOworCQkJCWdvdG8gbm90aWZ5X2NvbnRleHQ7CisJCQl9CisJCX0KKworCQlmcmFtZV9hYm9ydCA9IGZhbHNlOworCX0KKworCXRyYWNlX2NhbV9pcnFfaGFuZGxlZCgiRkQiLCBpcnFfdHlwZSk7CisKK25vdGlmeV9jb250ZXh0OgorCS8qIERvIGEgY2FsbGJhY2sgdG8gaW5mb3JtIGZyYW1lIGRvbmUgb3Igc3RvcCBkb25lICovCisJaWYgKGZyYW1lX3JlcS0+aHdfY3R4LT5ldmVudF9jYikgeworCQlzdHJ1Y3QgY2FtX2h3X2RvbmVfZXZlbnRfZGF0YSBidWZfZGF0YTsKKworCQlDQU1fREJHKENBTV9GRCwgIkZyYW1lSEFMVCA6IEZyYW1lWyVsbGRdIiwKKwkJCWZyYW1lX3JlcS0+cmVxdWVzdF9pZCk7CisKKwkJYnVmX2RhdGEubnVtX2hhbmRsZXMgPSBmcmFtZV9yZXEtPm51bV9od191cGRhdGVfZW50cmllczsKKwkJYnVmX2RhdGEucmVxdWVzdF9pZCA9IGZyYW1lX3JlcS0+cmVxdWVzdF9pZDsKKworCQlyYyA9IGZyYW1lX3JlcS0+aHdfY3R4LT5ldmVudF9jYihmcmFtZV9yZXEtPmh3X2N0eC0+Y2JfcHJpdiwKKwkJCWZyYW1lX2Fib3J0LCAmYnVmX2RhdGEpOworCQlpZiAocmMpCisJCQlDQU1fRVJSKENBTV9GRCwgIkVycm9yIGluIGV2ZW50IGNiIGhhbmRsaW5nICVkIiwgcmMpOworCX0KKworCS8qCisJICogTm93IHdlIGNhbiBzZXQgaHcgZGV2aWNlIGlzIGZyZWUgdG8gcHJvY2VzcyBmdXJ0aGVyIGZyYW1lcy4KKwkgKiBOb3RlIC0gRG8gbm90IGNoYW5nZSBzdGF0ZSB0byBJRExFIHVudGlsIHdlIHJlYWQgdGhlIGZyYW1lIHJlc3VsdHMsCisJICogT3RoZXJ3aXNlLCBvdGhlciB0aHJlYWQgbWF5IHNjaGVkdWxlIGZyYW1lIHByb2Nlc3NpbmcgYmVmb3JlCisJICogcmVhZGluZyBjdXJyZW50IGZyYW1lJ3MgcmVzdWx0cy4gQWxzbywgd2UgbmVlZCB0byBzZXQgdG8gSURMRSBzdGF0ZQorCSAqIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5zIGFmdGVyIGdldHRpbmcgdGhpcyBpcnEgY2FsbGJhY2sKKwkgKi8KKwltdXRleF9sb2NrKCZod19kZXZpY2UtPmxvY2spOworCWh3X2RldmljZS0+cmVhZHlfdG9fcHJvY2VzcyA9IHRydWU7CisJQ0FNX0RCRyhDQU1fRkQsICJyZWFkeV90b19wcm9jZXNzPSVkIiwgaHdfZGV2aWNlLT5yZWFkeV90b19wcm9jZXNzKTsKKwltdXRleF91bmxvY2soJmh3X2RldmljZS0+bG9jayk7CisKK3B1dF9yZXFfaW5fZnJlZV9saXN0OgorCXJjID0gY2FtX2ZkX21ncl91dGlsX3B1dF9mcmFtZV9yZXEoJmh3X21nci0+ZnJhbWVfZnJlZV9saXN0LAorCQkmZnJhbWVfcmVxKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gcHV0dGluZyBmcmFtZSByZXEgaW4gZnJlZSBsaXN0Iik7CisJCS8qIGNvbnRpbnVlICovCisJfQorCitzdWJtaXRfbmV4dF9mcmFtZToKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGZyYW1lcyBwZW5kaW5nIGZvciBwcm9jZXNzaW5nIGFuZCBzdWJtaXQgKi8KKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9zdWJtaXRfZnJhbWUoaHdfbWdyLCBOVUxMKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciB3aGlsZSBzdWJtaXQgZnJhbWUsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9tZ3JfaXJxX2NiKHZvaWQgKmRhdGEsIGVudW0gY2FtX2ZkX2h3X2lycV90eXBlIGlycV90eXBlKQoreworCXN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IgPSAmZ19mZF9od19tZ3I7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjcm1fd29ya3FfdGFzayAqdGFzazsKKwlzdHJ1Y3QgY2FtX2ZkX21ncl93b3JrX2RhdGEgKndvcmtfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod19tZ3ItPmh3X21ncl9zbG9jaywgZmxhZ3MpOworCXRhc2sgPSBjYW1fcmVxX21ncl93b3JrcV9nZXRfdGFzayhod19tZ3ItPndvcmspOworCWlmICghdGFzaykgeworCQlDQU1fRVJSKENBTV9GRCwgIm5vIGVtcHR5IHRhc2sgYXZhaWxhYmxlIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3X21nci0+aHdfbWdyX3Nsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdvcmtfZGF0YSA9IChzdHJ1Y3QgY2FtX2ZkX21ncl93b3JrX2RhdGEgKil0YXNrLT5wYXlsb2FkOworCXdvcmtfZGF0YS0+dHlwZSA9IENBTV9GRF9XT1JLX0lSUTsKKwl3b3JrX2RhdGEtPmlycV90eXBlID0gaXJxX3R5cGU7CisKKwl0YXNrLT5wcm9jZXNzX2NiID0gY2FtX2ZkX21ncl93b3JrcV9pcnFfY2I7CisJcmMgPSBjYW1fcmVxX21ncl93b3JrcV9lbnF1ZXVlX3Rhc2sodGFzaywgaHdfbWdyLCBDUk1fVEFTS19QUklPUklUWV8wKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIGVucXVldWUgd29yayB0YXNrLCByYz0lZCIsIHJjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3X21nci0+aHdfbWdyX3Nsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl9od19nZXRfY2Fwcyh2b2lkICpod19tZ3JfcHJpdiwgdm9pZCAqaHdfZ2V0X2NhcHNfYXJncykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IgPSBod19tZ3JfcHJpdjsKKwlzdHJ1Y3QgY2FtX3F1ZXJ5X2NhcF9jbWQgKnF1ZXJ5ID0gaHdfZ2V0X2NhcHNfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX3F1ZXJ5X2NhcF9jbWQgcXVlcnlfZmQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnF1ZXJ5X2ZkLCAodm9pZCBfX3VzZXIgKilxdWVyeS0+Y2Fwc19oYW5kbGUsCisJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX3F1ZXJ5X2NhcF9jbWQpKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBjb3B5IGZyb20gdXNlciwgcmM9JWQiLCByYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXF1ZXJ5X2ZkICA9IGh3X21nci0+ZmRfY2FwczsKKworCUNBTV9EQkcoQ0FNX0ZELAorCQkiSU9NTVUgZGV2aWNlKCVkLCAlZCksIENETSglZCwgJWQpLCB2ZXJzaW9ucyAlZC4lZCwgJWQuJWQiLAorCQlxdWVyeV9mZC5kZXZpY2VfaW9tbXUuc2VjdXJlLCBxdWVyeV9mZC5kZXZpY2VfaW9tbXUubm9uX3NlY3VyZSwKKwkJcXVlcnlfZmQuY2RtX2lvbW11LnNlY3VyZSwgcXVlcnlfZmQuY2RtX2lvbW11Lm5vbl9zZWN1cmUsCisJCXF1ZXJ5X2ZkLmh3X2NhcHMuY29yZV92ZXJzaW9uLm1ham9yLAorCQlxdWVyeV9mZC5od19jYXBzLmNvcmVfdmVyc2lvbi5taW5vciwKKwkJcXVlcnlfZmQuaHdfY2Fwcy53cmFwcGVyX3ZlcnNpb24ubWFqb3IsCisJCXF1ZXJ5X2ZkLmh3X2NhcHMud3JhcHBlcl92ZXJzaW9uLm1pbm9yKTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopcXVlcnktPmNhcHNfaGFuZGxlLCAmcXVlcnlfZmQsCisJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX3F1ZXJ5X2NhcF9jbWQpKSkKKwkJcmMgPSAtRUZBVUxUOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9tZ3JfaHdfYWNxdWlyZSh2b2lkICpod19tZ3JfcHJpdiwgdm9pZCAqaHdfYWNxdWlyZV9hcmdzKQoreworCXN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IgPSAoc3RydWN0IGNhbV9mZF9od19tZ3IgKilod19tZ3JfcHJpdjsKKwlzdHJ1Y3QgY2FtX2h3X2FjcXVpcmVfYXJncyAqYWNxdWlyZV9hcmdzID0KKwkJKHN0cnVjdCBjYW1faHdfYWNxdWlyZV9hcmdzICopaHdfYWNxdWlyZV9hcmdzOworCXN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqaHdfY3R4OworCXN0cnVjdCBjYW1fZmRfYWNxdWlyZV9kZXZfaW5mbyBmZF9hY3F1aXJlX2FyZ3M7CisJaW50IHJjOworCisJaWYgKCFhY3F1aXJlX2FyZ3MgfHwgYWNxdWlyZV9hcmdzLT5udW1fYWNxIDw9IDApIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFjcXVpcmUgYXJncyAlcEsiLCBhY3F1aXJlX2FyZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZkX2FjcXVpcmVfYXJncywKKwkJKHZvaWQgX191c2VyICopYWNxdWlyZV9hcmdzLT5hY3F1aXJlX2luZm8sCisJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX2FjcXVpcmVfZGV2X2luZm8pKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlDQU1fREJHKENBTV9GRCwgIkFjcXVpcmUgOiBtb2RlPSVkLCBnZXRfcmF3X3Jlc3VsdHM9JWQsIHByaW9yaXR5PSVkIiwKKwkJZmRfYWNxdWlyZV9hcmdzLm1vZGUsIGZkX2FjcXVpcmVfYXJncy5nZXRfcmF3X3Jlc3VsdHMsCisJCWZkX2FjcXVpcmVfYXJncy5wcmlvcml0eSk7CisKKwkvKiBnZXQgYSBmcmVlIGZkIGh3IG1nciBjdHggKi8KKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfY3R4KCZod19tZ3ItPmZyZWVfY3R4X2xpc3QsICZod19jdHgpOworCWlmIChyYyB8fCAhaHdfY3R4KSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiR2V0IGh3IGNvbnRleHQgZmFpbGVkLCByYz0lZCwgaHdfY3R4PSVwSyIsCisJCQlyYywgaHdfY3R4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZkX2FjcXVpcmVfYXJncy5nZXRfcmF3X3Jlc3VsdHMgJiYgIWh3X21nci0+cmF3X3Jlc3VsdHNfYXZhaWxhYmxlKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSFcgY2Fubm90IHN1cHBvcnQgcmF3IHJlc3VsdHMgJWQgKCVkKSIsCisJCQlmZF9hY3F1aXJlX2FyZ3MuZ2V0X3Jhd19yZXN1bHRzLAorCQkJaHdfbWdyLT5yYXdfcmVzdWx0c19hdmFpbGFibGUpOworCQlnb3RvIHB1dF9jdHg7CisJfQorCisJaWYgKCEoZmRfYWNxdWlyZV9hcmdzLm1vZGUgJiBod19tZ3ItPnN1cHBvcnRlZF9tb2RlcykpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJIVyBjYW5ub3Qgc3VwcG9ydCByZXF1ZXN0ZWQgbW9kZSAweCV4ICgweCV4KSIsCisJCQlmZF9hY3F1aXJlX2FyZ3MubW9kZSwgaHdfbWdyLT5zdXBwb3J0ZWRfbW9kZXMpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBwdXRfY3R4OworCX0KKworCXJjID0gY2FtX2ZkX21ncl91dGlsX3NlbGVjdF9kZXZpY2UoaHdfbWdyLCBod19jdHgsICZmZF9hY3F1aXJlX2FyZ3MpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBzZWxlY3RpbmcgZGV2aWNlLCByYz0lZCIsIHJjKTsKKwkJZ290byBwdXRfY3R4OworCX0KKworCWh3X2N0eC0+Y3R4X2luX3VzZSA9IHRydWU7CisJaHdfY3R4LT5od19tZ3IgPSBod19tZ3I7CisJaHdfY3R4LT5nZXRfcmF3X3Jlc3VsdHMgPSBmZF9hY3F1aXJlX2FyZ3MuZ2V0X3Jhd19yZXN1bHRzOworCWh3X2N0eC0+bW9kZSA9IGZkX2FjcXVpcmVfYXJncy5tb2RlOworCisJLyogU2F2ZSBpbmNvbWluZyBjYW0gY29yZSBpbmZvIGludG8gaHcgY3R4Ki8KKwlod19jdHgtPmNiX3ByaXYgPSBhY3F1aXJlX2FyZ3MtPmNvbnRleHRfZGF0YTsKKwlod19jdHgtPmV2ZW50X2NiID0gYWNxdWlyZV9hcmdzLT5ldmVudF9jYjsKKworCS8qIFVwZGF0ZSBvdXQgYXJncyAqLworCWFjcXVpcmVfYXJncy0+Y3R4dF90b19od19tYXAgPSBod19jdHg7CisKKwljYW1fZmRfbWdyX3V0aWxfcHV0X2N0eCgmaHdfbWdyLT51c2VkX2N0eF9saXN0LCAmaHdfY3R4KTsKKworCXJldHVybiAwOworcHV0X2N0eDoKKwlsaXN0X2RlbF9pbml0KCZod19jdHgtPmxpc3QpOworCWNhbV9mZF9tZ3JfdXRpbF9wdXRfY3R4KCZod19tZ3ItPmZyZWVfY3R4X2xpc3QsICZod19jdHgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX2h3X3JlbGVhc2Uodm9pZCAqaHdfbWdyX3ByaXYsIHZvaWQgKmh3X3JlbGVhc2VfYXJncykKK3sKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqaHdfbWdyID0gKHN0cnVjdCBjYW1fZmRfaHdfbWdyICopaHdfbWdyX3ByaXY7CisJc3RydWN0IGNhbV9od19yZWxlYXNlX2FyZ3MgKnJlbGVhc2VfYXJncyA9IGh3X3JlbGVhc2VfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eDsKKwlpbnQgcmM7CisKKwlpZiAoIWh3X21ncl9wcml2IHx8ICFod19yZWxlYXNlX2FyZ3MpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZ3VtZW50cyAlcEssICVwSyIsCisJCQlod19tZ3JfcHJpdiwgaHdfcmVsZWFzZV9hcmdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaHdfY3R4ID0gKHN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqKXJlbGVhc2VfYXJncy0+Y3R4dF90b19od19tYXA7CisJaWYgKCFod19jdHggfHwgIWh3X2N0eC0+Y3R4X2luX3VzZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkLCBod19jdHg9JXBLIiwgaHdfY3R4KTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9yZWxlYXNlX2RldmljZShod19tZ3IsIGh3X2N0eCk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiByZWxlYXNlIGRldmljZSwgcmM9JWQiLCByYyk7CisKKwlsaXN0X2RlbF9pbml0KCZod19jdHgtPmxpc3QpOworCWNhbV9mZF9tZ3JfdXRpbF9wdXRfY3R4KCZod19tZ3ItPmZyZWVfY3R4X2xpc3QsICZod19jdHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl9od19zdGFydCh2b2lkICpod19tZ3JfcHJpdiwgdm9pZCAqbWdyX3N0YXJ0X2FyZ3MpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqaHdfbWdyID0gKHN0cnVjdCBjYW1fZmRfaHdfbWdyICopaHdfbWdyX3ByaXY7CisJc3RydWN0IGNhbV9od19zdGFydF9hcmdzICpod19tZ3Jfc3RhcnRfYXJncyA9CisJCShzdHJ1Y3QgY2FtX2h3X3N0YXJ0X2FyZ3MgKiltZ3Jfc3RhcnRfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eDsKKwlzdHJ1Y3QgY2FtX2ZkX2RldmljZSAqaHdfZGV2aWNlOworCXN0cnVjdCBjYW1fZmRfaHdfaW5pdF9hcmdzIGh3X2luaXRfYXJnczsKKworCWlmICghaHdfbWdyX3ByaXYgfHwgIWh3X21ncl9zdGFydF9hcmdzKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBhcmd1bWVudHMgJXBLICVwSyIsCisJCQlod19tZ3JfcHJpdiwgaHdfbWdyX3N0YXJ0X2FyZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlod19jdHggPSAoc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICopaHdfbWdyX3N0YXJ0X2FyZ3MtPmN0eHRfdG9faHdfbWFwOworCWlmICghaHdfY3R4IHx8ICFod19jdHgtPmN0eF9pbl91c2UpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCwgaHdfY3R4PSVwSyIsIGh3X2N0eCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJQ0FNX0RCRyhDQU1fRkQsICJjdHggaW5kZXg9JWQsIGRldmljZV9pbmRleD0lZCIsIGh3X2N0eC0+Y3R4X2luZGV4LAorCQlod19jdHgtPmRldmljZV9pbmRleCk7CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfZGV2aWNlKGh3X21nciwgaHdfY3R4LCAmaHdfZGV2aWNlKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBnZXR0aW5nIGRldmljZSAlZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5pbml0KSB7CisJCWh3X2luaXRfYXJncy5od19jdHggPSBod19jdHg7CisJCWh3X2luaXRfYXJncy5jdHhfaHdfcHJpdmF0ZSA9IGh3X2N0eC0+Y3R4X2h3X3ByaXZhdGU7CisJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMuaW5pdCgKKwkJCWh3X2RldmljZS0+aHdfaW50Zi0+aHdfcHJpdiwgJmh3X2luaXRfYXJncywKKwkJCXNpemVvZihod19pbml0X2FyZ3MpKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIVyBJbml0ICVkIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGluaXQgZnVuY3Rpb24iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9tZ3JfaHdfc3RvcCh2b2lkICpod19tZ3JfcHJpdiwgdm9pZCAqbWdyX3N0b3BfYXJncykKK3sKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqaHdfbWdyID0gKHN0cnVjdCBjYW1fZmRfaHdfbWdyICopaHdfbWdyX3ByaXY7CisJc3RydWN0IGNhbV9od19zdG9wX2FyZ3MgKmh3X21ncl9zdG9wX2FyZ3MgPQorCQkoc3RydWN0IGNhbV9od19zdG9wX2FyZ3MgKiltZ3Jfc3RvcF9hcmdzOworCXN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqaHdfY3R4OworCXN0cnVjdCBjYW1fZmRfZGV2aWNlICpod19kZXZpY2U7CisJc3RydWN0IGNhbV9mZF9od19zdG9wX2FyZ3MgaHdfc3RvcF9hcmdzOworCXN0cnVjdCBjYW1fZmRfaHdfZGVpbml0X2FyZ3MgaHdfZGVpbml0X2FyZ3M7CisJaW50IHJjID0gMDsKKworCWlmICghaHdfbWdyX3ByaXYgfHwgIWh3X21ncl9zdG9wX2FyZ3MpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZ3VtZW50cyAlcEsgJXBLIiwKKwkJCWh3X21ncl9wcml2LCBod19tZ3Jfc3RvcF9hcmdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaHdfY3R4ID0gKHN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqKWh3X21ncl9zdG9wX2FyZ3MtPmN0eHRfdG9faHdfbWFwOworCWlmICghaHdfY3R4IHx8ICFod19jdHgtPmN0eF9pbl91c2UpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCwgaHdfY3R4PSVwSyIsIGh3X2N0eCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCUNBTV9EQkcoQ0FNX0ZELCAiY3R4IGluZGV4PSVkLCBod19jdHg9JWQiLCBod19jdHgtPmN0eF9pbmRleCwKKwkJaHdfY3R4LT5kZXZpY2VfaW5kZXgpOworCisJcmMgPSBjYW1fZmRfbWdyX3V0aWxfZ2V0X2RldmljZShod19tZ3IsIGh3X2N0eCwgJmh3X2RldmljZSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgaW4gZ2V0dGluZyBkZXZpY2UgJWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlDQU1fREJHKENBTV9GRCwgIkZEIERldmljZSByZWFkeV90b19wcm9jZXNzID0gJWQiLAorCQlod19kZXZpY2UtPnJlYWR5X3RvX3Byb2Nlc3MpOworCisJaWYgKChod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5zdG9wKSAmJgorCQkoaHdfZGV2aWNlLT5yZWFkeV90b19wcm9jZXNzID09IGZhbHNlKSkgeworCQkvKgorCQkgKiBFdmVuIGlmIGRldmljZSBpcyBpbiBwcm9jZXNzaW5nIHN0YXRlLCB3ZSBzaG91bGQgc3VibWl0CisJCSAqIHN0b3AgY29tbWFuZCBvbmx5IGlmIHRoaXMgY3R4IGlzIHJ1bm5pbmcgb24gaHcKKwkJICovCisJCWh3X3N0b3BfYXJncy5od19jdHggPSBod19jdHg7CisJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMuc3RvcCgKKwkJCWh3X2RldmljZS0+aHdfaW50Zi0+aHdfcHJpdiwgJmh3X3N0b3BfYXJncywKKwkJCXNpemVvZihod19zdG9wX2FyZ3MpKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIVyBTdG9wICVkIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJaWYgKGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLmRlaW5pdCkgeworCQlod19kZWluaXRfYXJncy5od19jdHggPSBod19jdHg7CisJCWh3X2RlaW5pdF9hcmdzLmN0eF9od19wcml2YXRlID0gaHdfY3R4LT5jdHhfaHdfcHJpdmF0ZTsKKwkJcmMgPSBod19kZXZpY2UtPmh3X2ludGYtPmh3X29wcy5kZWluaXQoCisJCQlod19kZXZpY2UtPmh3X2ludGYtPmh3X3ByaXYsICZod19kZWluaXRfYXJncywKKwkJCXNpemVvZihod19kZWluaXRfYXJncykpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIEhXIERlSW5pdCAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfbWdyX2h3X3ByZXBhcmVfdXBkYXRlKHZvaWQgKmh3X21ncl9wcml2LAorCXZvaWQgKmh3X3ByZXBhcmVfdXBkYXRlX2FyZ3MpCit7CisJc3RydWN0IGNhbV9mZF9od19tZ3IgKmh3X21nciA9IChzdHJ1Y3QgY2FtX2ZkX2h3X21nciAqKWh3X21ncl9wcml2OworCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAqcHJlcGFyZSA9CisJCShzdHJ1Y3QgY2FtX2h3X3ByZXBhcmVfdXBkYXRlX2FyZ3MgKikgaHdfcHJlcGFyZV91cGRhdGVfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eDsKKwlzdHJ1Y3QgY2FtX2ZkX2RldmljZSAqaHdfZGV2aWNlOworCXN0cnVjdCBjYW1fa21kX2J1Zl9pbmZvIGttZF9idWY7CisJaW50IHJjOworCXN0cnVjdCBjYW1fZmRfaHdfY21kX3ByZXN0YXJ0X2FyZ3MgcHJlc3RhcnRfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0ICpmcmFtZV9yZXE7CisKKwlpZiAoIWh3X21ncl9wcml2IHx8ICFod19wcmVwYXJlX3VwZGF0ZV9hcmdzKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBhcmdzICVwSyAlcEsiLAorCQkJaHdfbWdyX3ByaXYsIGh3X3ByZXBhcmVfdXBkYXRlX2FyZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlod19jdHggPSAoc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICopcHJlcGFyZS0+Y3R4dF90b19od19tYXA7CisJaWYgKCFod19jdHggfHwgIWh3X2N0eC0+Y3R4X2luX3VzZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkLCBod19jdHg9JXBLIiwgaHdfY3R4KTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9nZXRfZGV2aWNlKGh3X21nciwgaHdfY3R4LCAmaHdfZGV2aWNlKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBnZXR0aW5nIGRldmljZSAlZCIsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9wYWNrZXRfdmFsaWRhdGUocHJlcGFyZS0+cGFja2V0KTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBwYWNrZXQgdmFsaWRhdGlvbiAlZCIsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYyA9IGNhbV9wYWNrZXRfdXRpbF9nZXRfa21kX2J1ZmZlcihwcmVwYXJlLT5wYWNrZXQsICZrbWRfYnVmKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBnZXQga21kIGJ1ZiBidWZmZXIgJWQiLCByYyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJQ0FNX0RCRyhDQU1fRkQsCisJCSJLTUQgQnVmIDogaGRsPSVkLCBjcHVfYWRkcj0lcEssIG9mZnNldD0lZCwgc2l6ZT0lZCwgdXNlZD0lZCIsCisJCWttZF9idWYuaGFuZGxlLCBrbWRfYnVmLmNwdV9hZGRyLCBrbWRfYnVmLm9mZnNldCwKKwkJa21kX2J1Zi5zaXplLCBrbWRfYnVmLnVzZWRfYnl0ZXMpOworCisJLyogV2UgZG8gbm90IGV4cGVjdCBhbnkgcGF0Y2hpbmcsIGJ1dCBqdXN0IGRvIGl0IGFueXdheSAqLworCXJjID0gY2FtX3BhY2tldF91dGlsX3Byb2Nlc3NfcGF0Y2hlcyhwcmVwYXJlLT5wYWNrZXQsCisJCWh3X21nci0+ZGV2aWNlX2lvbW11Lm5vbl9zZWN1cmUsIC0xKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJQYXRjaCBGRCBwYWNrZXQgZmFpbGVkLCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW1lbXNldCgmcHJlc3RhcnRfYXJncywgMHgwLCBzaXplb2YocHJlc3RhcnRfYXJncykpOworCXByZXN0YXJ0X2FyZ3MuY3R4X2h3X3ByaXZhdGUgPSBod19jdHgtPmN0eF9od19wcml2YXRlOworCXByZXN0YXJ0X2FyZ3MuaHdfY3R4ID0gaHdfY3R4OworCXByZXN0YXJ0X2FyZ3MucmVxdWVzdF9pZCA9IHByZXBhcmUtPnBhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQ7CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9wYXJzZV9nZW5lcmljX2NtZF9idWZmZXIoaHdfY3R4LCBwcmVwYXJlLT5wYWNrZXQsCisJCSZwcmVzdGFydF9hcmdzKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBwYXJzaW5nIGdlcm5lcmljIGNtZCBidWZmZXIgJWQiLCByYyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmMgPSBjYW1fZmRfbWdyX3V0aWxfcHJlcGFyZV9pb19idWZfaW5mbygKKwkJaHdfbWdyLT5kZXZpY2VfaW9tbXUubm9uX3NlY3VyZSwgcHJlcGFyZSwKKwkJcHJlc3RhcnRfYXJncy5pbnB1dF9idWYsIHByZXN0YXJ0X2FyZ3Mub3V0cHV0X2J1ZiwKKwkJQ0FNX0ZEX01BWF9JT19CVUZGRVJTKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBwcmVwYXJlIElPIEJ1ZiAlZCIsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYyA9IGNhbV9mZF9tZ3JfdXRpbF9wcmVwYXJlX2h3X3VwZGF0ZV9lbnRyaWVzKGh3X21nciwgcHJlcGFyZSwKKwkJJnByZXN0YXJ0X2FyZ3MsICZrbWRfYnVmKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBodyB1cGRhdGUgZW50cmllcyAlZCIsIHJjKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBnZXQgYSBmcmVlIGZyYW1lIHJlcSBmcm9tIGZyZWUgbGlzdCAqLworCXJjID0gY2FtX2ZkX21ncl91dGlsX2dldF9mcmFtZV9yZXEoJmh3X21nci0+ZnJhbWVfZnJlZV9saXN0LAorCQkmZnJhbWVfcmVxKTsKKwlpZiAocmMgfHwgIWZyYW1lX3JlcSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkdldCBmcmFtZV9yZXEgZmFpbGVkLCByYz0lZCwgaHdfY3R4PSVwSyIsCisJCQlyYywgaHdfY3R4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2V0dXAgZnJhbWUgcmVxdWVzdCBpbmZvIGFuZCBxdWV1ZSB0byBwZW5kaW5nIGxpc3QgKi8KKwlmcmFtZV9yZXEtPmh3X2N0eCA9IGh3X2N0eDsKKwlmcmFtZV9yZXEtPnJlcXVlc3RfaWQgPSBwcmVwYXJlLT5wYWNrZXQtPmhlYWRlci5yZXF1ZXN0X2lkOworCS8qIFRoaXMgaGFzIHRvIGJlIHBhc3NlZCB0byBIVyB3aGlsZSBjYWxsaW5nIGh3X29wcy0+c3RhcnQgKi8KKwlmcmFtZV9yZXEtPmh3X3JlcV9wcml2YXRlID0gcHJlc3RhcnRfYXJncy5od19yZXFfcHJpdmF0ZTsKKworCS8qCisJICogU2F2ZSB0aGUgY3VycmVudCBmcmFtZV9yZXEgaW50byBwcml2LAorCSAqIHRoaXMgd2lsbCBjb21lIGFzIHByaXYgd2hpbGUgaHdfY29uZmlnCisJICovCisJcHJlcGFyZS0+cHJpdiA9IGZyYW1lX3JlcTsKKworCUNBTV9EQkcoQ0FNX0ZELCAiRnJhbWVQcmVwYXJlIDogRnJhbWVbJWxsZF0iLCBmcmFtZV9yZXEtPnJlcXVlc3RfaWQpOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX21ncl9od19jb25maWcodm9pZCAqaHdfbWdyX3ByaXYsIHZvaWQgKmh3X2NvbmZpZ19hcmdzKQoreworCXN0cnVjdCBjYW1fZmRfaHdfbWdyICpod19tZ3IgPSAoc3RydWN0IGNhbV9mZF9od19tZ3IgKilod19tZ3JfcHJpdjsKKwlzdHJ1Y3QgY2FtX2h3X2NvbmZpZ19hcmdzICpjb25maWcgPQorCQkoc3RydWN0IGNhbV9od19jb25maWdfYXJncyAqKSBod19jb25maWdfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggKmh3X2N0eDsKKwlzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0ICpmcmFtZV9yZXE7CisJaW50IHJjOworCWludCBpOworCisJaWYgKCFod19tZ3IgfHwgIWNvbmZpZykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYXJndW1lbnRzICVwSyAlcEsiLCBod19tZ3IsIGNvbmZpZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY29uZmlnLT5udW1faHdfdXBkYXRlX2VudHJpZXMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJObyBodyB1cGRhdGUgZW50ZXJpZXMgYXJlIGF2YWlsYWJsZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlod19jdHggPSAoc3RydWN0IGNhbV9mZF9od19tZ3JfY3R4ICopY29uZmlnLT5jdHh0X3RvX2h3X21hcDsKKwlpZiAoIWh3X2N0eCB8fCAhaHdfY3R4LT5jdHhfaW5fdXNlKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBjb250ZXh0IGlzIHVzZWQsIGh3X2N0eD0lcEsiLCBod19jdHgpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWZyYW1lX3JlcSA9IGNvbmZpZy0+cHJpdjsKKworCXRyYWNlX2NhbV9hcHBseV9yZXEoIkZEIiwgZnJhbWVfcmVxLT5yZXF1ZXN0X2lkKTsKKwlDQU1fREJHKENBTV9GRCwgIkZyYW1lSFdDb25maWcgOiBGcmFtZVslbGxkXSIsIGZyYW1lX3JlcS0+cmVxdWVzdF9pZCk7CisKKwlmcmFtZV9yZXEtPm51bV9od191cGRhdGVfZW50cmllcyA9IGNvbmZpZy0+bnVtX2h3X3VwZGF0ZV9lbnRyaWVzOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPm51bV9od191cGRhdGVfZW50cmllczsgaSsrKSB7CisJCWZyYW1lX3JlcS0+aHdfdXBkYXRlX2VudHJpZXNbaV0gPSBjb25maWctPmh3X3VwZGF0ZV9lbnRyaWVzW2ldOworCQlDQU1fREJHKENBTV9GRCwgIlByZVN0YXJ0IEhXRW50cnlbJWRdIDogJWQgJWQgJWQgJWQgJXBLIiwKKwkJCWZyYW1lX3JlcS0+aHdfdXBkYXRlX2VudHJpZXNbaV0uaGFuZGxlLAorCQkJZnJhbWVfcmVxLT5od191cGRhdGVfZW50cmllc1tpXS5vZmZzZXQsCisJCQlmcmFtZV9yZXEtPmh3X3VwZGF0ZV9lbnRyaWVzW2ldLmxlbiwKKwkJCWZyYW1lX3JlcS0+aHdfdXBkYXRlX2VudHJpZXNbaV0uZmxhZ3MsCisJCQlmcmFtZV9yZXEtPmh3X3VwZGF0ZV9lbnRyaWVzW2ldLmFkZHIpOworCX0KKworCWlmIChod19jdHgtPnByaW9yaXR5ID09IENBTV9GRF9QUklPUklUWV9ISUdIKSB7CisJCUNBTV9EQkcoQ0FNX0ZELCAiSW5zZXJ0IGZyYW1lIGludG8gcHJpbzAgcXVldWUiKTsKKwkJcmMgPSBjYW1fZmRfbWdyX3V0aWxfcHV0X2ZyYW1lX3JlcSgKKwkJCSZod19tZ3ItPmZyYW1lX3BlbmRpbmdfbGlzdF9oaWdoLCAmZnJhbWVfcmVxKTsKKwl9IGVsc2UgeworCQlDQU1fREJHKENBTV9GRCwgIkluc2VydCBmcmFtZSBpbnRvIHByaW8xIHF1ZXVlIik7CisJCXJjID0gY2FtX2ZkX21ncl91dGlsX3B1dF9mcmFtZV9yZXEoCisJCQkmaHdfbWdyLT5mcmFtZV9wZW5kaW5nX2xpc3Rfbm9ybWFsLCAmZnJhbWVfcmVxKTsKKwl9CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIHF1ZXVpbmcgZnJhbWUgcmVxLCByYz0lZCIsIHJjKTsKKwkJZ290byBwdXRfZnJlZV9saXN0OworCX0KKworCXJjID0gY2FtX2ZkX21ncl91dGlsX3NjaGVkdWxlX2ZyYW1lX3dvcmtlcl90YXNrKGh3X21ncik7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiV29ya2VyIHRhc2sgc2NoZWR1bGluZyBmYWlsZWQgJWQiLCByYyk7CisJCWdvdG8gcmVtb3ZlX2FuZF9wdXRfZnJlZV9saXN0OworCX0KKworCXJldHVybiAwOworCityZW1vdmVfYW5kX3B1dF9mcmVlX2xpc3Q6CisKKwlpZiAoaHdfY3R4LT5wcmlvcml0eSA9PSBDQU1fRkRfUFJJT1JJVFlfSElHSCkgeworCQlDQU1fREJHKENBTV9GRCwgIlJlbW92aW5nIGZyYW1lIGludG8gcHJpbzAgcXVldWUiKTsKKwkJY2FtX2ZkX21ncl91dGlsX2dldF9mcmFtZV9yZXEoCisJCQkmaHdfbWdyLT5mcmFtZV9wZW5kaW5nX2xpc3RfaGlnaCwgJmZyYW1lX3JlcSk7CisJfSBlbHNlIHsKKwkJQ0FNX0RCRyhDQU1fRkQsICJSZW1vdmluZyBmcmFtZSBpbnRvIHByaW8xIHF1ZXVlIik7CisJCWNhbV9mZF9tZ3JfdXRpbF9nZXRfZnJhbWVfcmVxKAorCQkJJmh3X21nci0+ZnJhbWVfcGVuZGluZ19saXN0X25vcm1hbCwgJmZyYW1lX3JlcSk7CisJfQorcHV0X2ZyZWVfbGlzdDoKKwljYW1fZmRfbWdyX3V0aWxfcHV0X2ZyYW1lX3JlcSgmaHdfbWdyLT5mcmFtZV9mcmVlX2xpc3QsCisJCSZmcmFtZV9yZXEpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2FtX2ZkX2h3X21ncl9kZWluaXQoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKQoreworCUNBTV9EQkcoQ0FNX0ZELCAiSFcgTWdyIERlaW5pdCIpOworCisJY2FtX3JlcV9tZ3Jfd29ya3FfZGVzdHJveSgmZ19mZF9od19tZ3Iud29yayk7CisKKwljYW1fc21tdV9vcHMoZ19mZF9od19tZ3IuZGV2aWNlX2lvbW11Lm5vbl9zZWN1cmUsIENBTV9TTU1VX0RFVEFDSCk7CisJY2FtX3NtbXVfZGVzdHJveV9oYW5kbGUoZ19mZF9od19tZ3IuZGV2aWNlX2lvbW11Lm5vbl9zZWN1cmUpOworCWdfZmRfaHdfbWdyLmRldmljZV9pb21tdS5ub25fc2VjdXJlID0gLTE7CisKKwltdXRleF9kZXN0cm95KCZnX2ZkX2h3X21nci5jdHhfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJmdfZmRfaHdfbWdyLmZyYW1lX3JlcV9tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmZ19mZF9od19tZ3IuaHdfbWdyX211dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgY2FtX2ZkX2h3X21ncl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKKwlzdHJ1Y3QgY2FtX2h3X21ncl9pbnRmICpod19tZ3JfaW50ZikKK3sKKwlpbnQgY291bnQsIGksIHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmh3X2ludGYgPSBOVUxMOworCXN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAqaHdfbWdyX2N0eDsKKwlzdHJ1Y3QgY2FtX2ZkX2RldmljZSAqaHdfZGV2aWNlOworCXN0cnVjdCBjYW1fZmRfbWdyX2ZyYW1lX3JlcXVlc3QgKmZyYW1lX3JlcTsKKworCWlmICghb2Zfbm9kZSB8fCAhaHdfbWdyX2ludGYpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZ3Mgb2Zfbm9kZSAlcEsgaHdfbWdyX2ludGYgJXBLIiwKKwkJCW9mX25vZGUsIGh3X21ncl9pbnRmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZnX2ZkX2h3X21nciwgMHgwLCBzaXplb2YoZ19mZF9od19tZ3IpKTsKKwltZW1zZXQoaHdfbWdyX2ludGYsIDB4MCwgc2l6ZW9mKCpod19tZ3JfaW50ZikpOworCisJbXV0ZXhfaW5pdCgmZ19mZF9od19tZ3IuY3R4X211dGV4KTsKKwltdXRleF9pbml0KCZnX2ZkX2h3X21nci5mcmFtZV9yZXFfbXV0ZXgpOworCW11dGV4X2luaXQoJmdfZmRfaHdfbWdyLmh3X21ncl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmdfZmRfaHdfbWdyLmh3X21ncl9zbG9jayk7CisKKwljb3VudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3Mob2Zfbm9kZSwgImNvbXBhdC1ody1uYW1lIik7CisJaWYgKCFjb3VudCB8fCAoY291bnQgPiBDQU1fRkRfSFdfTUFYKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgY29tcGF0IG5hbWVzIGluIGRldiB0cmVlICVkIiwgY291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZ19mZF9od19tZ3IubnVtX2RldmljZXMgPSBjb3VudDsKKworCWdfZmRfaHdfbWdyLnJhd19yZXN1bHRzX2F2YWlsYWJsZSA9IGZhbHNlOworCWdfZmRfaHdfbWdyLnN1cHBvcnRlZF9tb2RlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlod19kZXZpY2UgPSAmZ19mZF9od19tZ3IuaHdfZGV2aWNlW2ldOworCisJCXJjID0gY2FtX2ZkX21ncl91dGlsX3BkZXZfZ2V0X2h3X2ludGYob2Zfbm9kZSwgaSwgJmh3X2ludGYpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiaHcgaW50ZiBmcm9tIHBkZXYgZmFpbGVkLCByYz0lZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCW11dGV4X2luaXQoJmh3X2RldmljZS0+bG9jayk7CisKKwkJaHdfZGV2aWNlLT52YWxpZCA9IHRydWU7CisJCWh3X2RldmljZS0+aHdfaW50ZiA9IGh3X2ludGY7CisJCWh3X2RldmljZS0+cmVhZHlfdG9fcHJvY2VzcyA9IHRydWU7CisKKwkJaWYgKGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnByb2Nlc3NfY21kKSB7CisJCQlzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zZXRfaXJxX2NiIGlycV9jYl9hcmdzOworCisJCQlpcnFfY2JfYXJncy5jYW1fZmRfaHdfbWdyX2NiID0gY2FtX2ZkX21ncl9pcnFfY2I7CisJCQlpcnFfY2JfYXJncy5kYXRhID0gaHdfZGV2aWNlOworCisJCQlyYyA9IGh3X2RldmljZS0+aHdfaW50Zi0+aHdfb3BzLnByb2Nlc3NfY21kKAorCQkJCWh3X2RldmljZS0+aHdfaW50Zi0+aHdfcHJpdiwKKwkJCQlDQU1fRkRfSFdfQ01EX1JFR0lTVEVSX0NBTExCQUNLLAorCQkJCSZpcnFfY2JfYXJncywgc2l6ZW9mKGlycV9jYl9hcmdzKSk7CisJCQlpZiAocmMpIHsKKwkJCQlDQU1fRVJSKENBTV9GRCwKKwkJCQkJIkZhaWxlZCBpbiBSRUdJU1RFUl9DQUxMQkFDSyAlZCIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKworCQlpZiAoaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMuZ2V0X2h3X2NhcHMpIHsKKwkJCXJjID0gaHdfZGV2aWNlLT5od19pbnRmLT5od19vcHMuZ2V0X2h3X2NhcHMoCisJCQkJaHdfaW50Zi0+aHdfcHJpdiwgJmh3X2RldmljZS0+aHdfY2FwcywKKwkJCQlzaXplb2YoaHdfZGV2aWNlLT5od19jYXBzKSk7CisJCQlpZiAocmMpIHsKKwkJCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBnZXRfaHdfY2FwcyAlZCIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCWdfZmRfaHdfbWdyLnJhd19yZXN1bHRzX2F2YWlsYWJsZSB8PQorCQkJCWh3X2RldmljZS0+aHdfY2Fwcy5yYXdfcmVzdWx0c19hdmFpbGFibGU7CisJCQlnX2ZkX2h3X21nci5zdXBwb3J0ZWRfbW9kZXMgfD0KKwkJCQlod19kZXZpY2UtPmh3X2NhcHMuc3VwcG9ydGVkX21vZGVzOworCisJCQlDQU1fREJHKENBTV9GRCwKKwkJCQkiRGV2aWNlW21vZGU9JWQsIHJhdz0lZF0sIE1nclttb2RlPSVkLCByYXc9JWRdIiwKKwkJCQlod19kZXZpY2UtPmh3X2NhcHMuc3VwcG9ydGVkX21vZGVzLAorCQkJCWh3X2RldmljZS0+aHdfY2Fwcy5yYXdfcmVzdWx0c19hdmFpbGFibGUsCisJCQkJZ19mZF9od19tZ3Iuc3VwcG9ydGVkX21vZGVzLAorCQkJCWdfZmRfaHdfbWdyLnJhd19yZXN1bHRzX2F2YWlsYWJsZSk7CisJCX0KKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmZ19mZF9od19tZ3IuZnJlZV9jdHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmdfZmRfaHdfbWdyLnVzZWRfY3R4X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnX2ZkX2h3X21nci5mcmFtZV9mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZnX2ZkX2h3X21nci5mcmFtZV9wZW5kaW5nX2xpc3RfaGlnaCk7CisJSU5JVF9MSVNUX0hFQUQoJmdfZmRfaHdfbWdyLmZyYW1lX3BlbmRpbmdfbGlzdF9ub3JtYWwpOworCUlOSVRfTElTVF9IRUFEKCZnX2ZkX2h3X21nci5mcmFtZV9wcm9jZXNzaW5nX2xpc3QpOworCisJZ19mZF9od19tZ3IuZGV2aWNlX2lvbW11Lm5vbl9zZWN1cmUgPSAtMTsKKwlnX2ZkX2h3X21nci5kZXZpY2VfaW9tbXUuc2VjdXJlID0gLTE7CisJZ19mZF9od19tZ3IuY2RtX2lvbW11Lm5vbl9zZWN1cmUgPSAtMTsKKwlnX2ZkX2h3X21nci5jZG1faW9tbXUuc2VjdXJlID0gLTE7CisKKwlyYyA9IGNhbV9zbW11X2dldF9oYW5kbGUoImZkIiwKKwkJJmdfZmRfaHdfbWdyLmRldmljZV9pb21tdS5ub25fc2VjdXJlKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJHZXQgaW9tbXUgaGFuZGxlIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCWdvdG8gZGVzdHJveV9tdXRleDsKKwl9CisKKwlyYyA9IGNhbV9zbW11X29wcyhnX2ZkX2h3X21nci5kZXZpY2VfaW9tbXUubm9uX3NlY3VyZSwgQ0FNX1NNTVVfQVRUQUNIKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGRCBhdHRhY2ggaW9tbXUgaGFuZGxlIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCWdvdG8gZGVzdHJveV9zbW11OworCX0KKworCXJjID0gY2FtX2NkbV9nZXRfaW9tbXVfaGFuZGxlKCJmZCIsICZnX2ZkX2h3X21nci5jZG1faW9tbXUpOworCWlmIChyYykKKwkJQ0FNX0RCRyhDQU1fRkQsICJGYWlsZWQgdG8gYWNxdWlyZSB0aGUgQ0RNIGlvbW11IGhhbmRsZXMiKTsKKworCUNBTV9EQkcoQ0FNX0ZELCAiaW9tbXUgaGFuZGxlcyA6IGRldmljZSglZCwgJWQpLCBjZG0oJWQsICVkKSIsCisJCWdfZmRfaHdfbWdyLmRldmljZV9pb21tdS5ub25fc2VjdXJlLAorCQlnX2ZkX2h3X21nci5kZXZpY2VfaW9tbXUuc2VjdXJlLAorCQlnX2ZkX2h3X21nci5jZG1faW9tbXUubm9uX3NlY3VyZSwKKwkJZ19mZF9od19tZ3IuY2RtX2lvbW11LnNlY3VyZSk7CisKKwkvKiBJbml0IGh3IG1nciBjb250ZXh0cyBhbmQgYWRkIHRvIGZyZWUgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBDQU1fQ1RYX01BWDsgaSsrKSB7CisJCWh3X21ncl9jdHggPSAmZ19mZF9od19tZ3IuY3R4X3Bvb2xbaV07CisKKwkJbWVtc2V0KGh3X21ncl9jdHgsIDB4MCwgc2l6ZW9mKCpod19tZ3JfY3R4KSk7CisJCUlOSVRfTElTVF9IRUFEKCZod19tZ3JfY3R4LT5saXN0KTsKKworCQlod19tZ3JfY3R4LT5jdHhfaW5kZXggPSBpOworCQlod19tZ3JfY3R4LT5kZXZpY2VfaW5kZXggPSAtMTsKKwkJaHdfbWdyX2N0eC0+aHdfbWdyID0gJmdfZmRfaHdfbWdyOworCisJCWxpc3RfYWRkX3RhaWwoJmh3X21ncl9jdHgtPmxpc3QsICZnX2ZkX2h3X21nci5mcmVlX2N0eF9saXN0KTsKKwl9CisKKwkvKiBJbml0IGh3IG1nciBmcmFtZSByZXF1ZXN0cyBhbmQgYWRkIHRvIGZyZWUgbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBDQU1fQ1RYX1JFUV9NQVg7IGkrKykgeworCQlmcmFtZV9yZXEgPSAmZ19mZF9od19tZ3IuZnJhbWVfcmVxW2ldOworCisJCW1lbXNldChmcmFtZV9yZXEsIDB4MCwgc2l6ZW9mKCpmcmFtZV9yZXEpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZyYW1lX3JlcS0+bGlzdCk7CisKKwkJbGlzdF9hZGRfdGFpbCgmZnJhbWVfcmVxLT5saXN0LCAmZ19mZF9od19tZ3IuZnJhbWVfZnJlZV9saXN0KTsKKwl9CisKKwlyYyA9IGNhbV9yZXFfbWdyX3dvcmtxX2NyZWF0ZSgiY2FtX2ZkX3dvcmtlciIsIENBTV9GRF9XT1JLUV9OVU1fVEFTSywKKwkJJmdfZmRfaHdfbWdyLndvcmssIENSTV9XT1JLUV9VU0FHRV9JUlEpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIlVuYWJsZSB0byBjcmVhdGUgYSB3b3JrZXIsIHJjPSVkIiwgcmMpOworCQlnb3RvIGRldGFjaF9zbW11OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBDQU1fRkRfV09SS1FfTlVNX1RBU0s7IGkrKykKKwkJZ19mZF9od19tZ3Iud29yay0+dGFzay5wb29sW2ldLnBheWxvYWQgPQorCQkJJmdfZmRfaHdfbWdyLndvcmtfZGF0YVtpXTsKKworCS8qIFNldHVwIGh3IGNhcCBzbyB0aGF0IHdlIGNhbiBqdXN0IHJldHVybiB0aGUgaW5mbyB3aGVuIHJlcXVlc3RlZCAqLworCW1lbXNldCgmZ19mZF9od19tZ3IuZmRfY2FwcywgMCwgc2l6ZW9mKGdfZmRfaHdfbWdyLmZkX2NhcHMpKTsKKwlnX2ZkX2h3X21nci5mZF9jYXBzLmRldmljZV9pb21tdSA9IGdfZmRfaHdfbWdyLmRldmljZV9pb21tdTsKKwlnX2ZkX2h3X21nci5mZF9jYXBzLmNkbV9pb21tdSA9IGdfZmRfaHdfbWdyLmNkbV9pb21tdTsKKwlnX2ZkX2h3X21nci5mZF9jYXBzLmh3X2NhcHMgPSBnX2ZkX2h3X21nci5od19kZXZpY2VbMF0uaHdfY2FwczsKKworCUNBTV9EQkcoQ0FNX0ZELAorCQkiSU9NTVUgZGV2aWNlKCVkLCAlZCksIENETSglZCwgJWQpIHZlcnNpb25zIGNvcmVbJWQuJWRdLCB3cmFwcGVyWyVkLiVkXSIsCisJCWdfZmRfaHdfbWdyLmZkX2NhcHMuZGV2aWNlX2lvbW11LnNlY3VyZSwKKwkJZ19mZF9od19tZ3IuZmRfY2Fwcy5kZXZpY2VfaW9tbXUubm9uX3NlY3VyZSwKKwkJZ19mZF9od19tZ3IuZmRfY2Fwcy5jZG1faW9tbXUuc2VjdXJlLAorCQlnX2ZkX2h3X21nci5mZF9jYXBzLmNkbV9pb21tdS5ub25fc2VjdXJlLAorCQlnX2ZkX2h3X21nci5mZF9jYXBzLmh3X2NhcHMuY29yZV92ZXJzaW9uLm1ham9yLAorCQlnX2ZkX2h3X21nci5mZF9jYXBzLmh3X2NhcHMuY29yZV92ZXJzaW9uLm1pbm9yLAorCQlnX2ZkX2h3X21nci5mZF9jYXBzLmh3X2NhcHMud3JhcHBlcl92ZXJzaW9uLm1ham9yLAorCQlnX2ZkX2h3X21nci5mZF9jYXBzLmh3X2NhcHMud3JhcHBlcl92ZXJzaW9uLm1pbm9yKTsKKworCWh3X21ncl9pbnRmLT5od19tZ3JfcHJpdiA9ICZnX2ZkX2h3X21ncjsKKwlod19tZ3JfaW50Zi0+aHdfZ2V0X2NhcHMgPSBjYW1fZmRfbWdyX2h3X2dldF9jYXBzOworCWh3X21ncl9pbnRmLT5od19hY3F1aXJlID0gY2FtX2ZkX21ncl9od19hY3F1aXJlOworCWh3X21ncl9pbnRmLT5od19yZWxlYXNlID0gY2FtX2ZkX21ncl9od19yZWxlYXNlOworCWh3X21ncl9pbnRmLT5od19zdGFydCA9IGNhbV9mZF9tZ3JfaHdfc3RhcnQ7CisJaHdfbWdyX2ludGYtPmh3X3N0b3AgPSBjYW1fZmRfbWdyX2h3X3N0b3A7CisJaHdfbWdyX2ludGYtPmh3X3ByZXBhcmVfdXBkYXRlID0gY2FtX2ZkX21ncl9od19wcmVwYXJlX3VwZGF0ZTsKKwlod19tZ3JfaW50Zi0+aHdfY29uZmlnID0gY2FtX2ZkX21ncl9od19jb25maWc7CisJaHdfbWdyX2ludGYtPmh3X3JlYWQgPSBOVUxMOworCWh3X21ncl9pbnRmLT5od193cml0ZSA9IE5VTEw7CisJaHdfbWdyX2ludGYtPmh3X2Nsb3NlID0gTlVMTDsKKworCXJldHVybiByYzsKKworZGV0YWNoX3NtbXU6CisJY2FtX3NtbXVfb3BzKGdfZmRfaHdfbWdyLmRldmljZV9pb21tdS5ub25fc2VjdXJlLCBDQU1fU01NVV9ERVRBQ0gpOworZGVzdHJveV9zbW11OgorCWNhbV9zbW11X2Rlc3Ryb3lfaGFuZGxlKGdfZmRfaHdfbWdyLmRldmljZV9pb21tdS5ub25fc2VjdXJlKTsKKwlnX2ZkX2h3X21nci5kZXZpY2VfaW9tbXUubm9uX3NlY3VyZSA9IC0xOworZGVzdHJveV9tdXRleDoKKwltdXRleF9kZXN0cm95KCZnX2ZkX2h3X21nci5jdHhfbXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJmdfZmRfaHdfbWdyLmZyYW1lX3JlcV9tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmZ19mZF9od19tZ3IuaHdfbWdyX211dGV4KTsKKworCXJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvY2FtX2ZkX2h3X21nci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvY2FtX2ZkX2h3X21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWUwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9jYW1fZmRfaHdfbWdyLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DQU1fRkRfSFdfTUdSX0hfCisjZGVmaW5lIF9DQU1fRkRfSFdfTUdSX0hfCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL2NhbV9mZC5oPgorI2luY2x1ZGUgImNhbV9ody5oIgorI2luY2x1ZGUgImNhbV9od19pbnRmLmgiCisjaW5jbHVkZSAiY2FtX2NwYXNfYXBpLmgiCisjaW5jbHVkZSAiY2FtX2RlYnVnX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1faHdfbWdyX2ludGYuaCIKKyNpbmNsdWRlICJjYW1fcmVxX21ncl93b3JrcS5oIgorI2luY2x1ZGUgImNhbV9mZF9od19pbnRmLmgiCisKKyNkZWZpbmUgQ0FNX0ZEX0hXX01BWCAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FNX0ZEX1dPUktRX05VTV9UQVNLICAgIDEwCisKK3N0cnVjdCBjYW1fZmRfaHdfbWdyOworCisvKioKKyAqIGVudW0gY2FtX2ZkX21ncl93b3JrX3R5cGUgLSBUeXBlIG9mIHdvcmtlciB0YXNrCisgKgorICogQENBTV9GRF9XT1JLX0ZSQU1FIDogV29yayB0eXBlIGluZGljYXRpbmcgZnJhbWUgdGFzaworICogQENBTV9GRF9XT1JLX0lSUSAgIDogV29yayB0eXBlIGluZGljYXRpbmcgaXJxIHRhc2sKKyAqLworZW51bSBjYW1fZmRfbWdyX3dvcmtfdHlwZSB7CisJQ0FNX0ZEX1dPUktfRlJBTUUsCisJQ0FNX0ZEX1dPUktfSVJRLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggOiBGRCBIVyBNZ3IgY29udGV4dAorICoKKyAqIEBsaXN0ICAgICAgICAgICAgOiBMaXN0IHBvaW50ZXIgdXNlZCB0byBtYWludGFpbiB0aGlzIGNvbnRleHQKKyAqICAgICAgICAgICAgICAgICAgICBpbiBmcmVlLCB1c2VkIGxpc3QKKyAqIEBjdHhfaW5kZXggICAgICAgOiBJbmRleCBvZiB0aGlzIGNvbnRleHQKKyAqIEBjdHhfaW5fdXNlICAgICAgOiBXaGV0aGVyIHRoaXMgY29udGV4dCBpcyBpbiB1c2UKKyAqIEBldmVudF9jYiAgICAgICAgOiBFdmVudCBjYWxsYmFjayBwb2ludGVyIHRvIG5vdGlmeSBjYW0gY29yZSBjb250ZXh0CisgKiBAY2JfcHJpdiAgICAgICAgIDogRXZlbnQgY2FsbGJhY2sgcHJpdmF0ZSBwb2ludGVyCisgKiBAaHdfbWdyICAgICAgICAgIDogUG9pbnRlciB0byBodyBtYW5hZ2VyCisgKiBAZ2V0X3Jhd19yZXN1bHRzIDogV2hldGhlciB0aGlzIGNvbnRleHQgbmVlZHMgcmF3IHJlc3VsdHMKKyAqIEBtb2RlICAgICAgICAgICAgOiBNb2RlIGluIHdoaWNoIHRoaXMgY29udGV4dCBydW5zCisgKiBAZGV2aWNlX2luZGV4ICAgIDogSFcgRGV2aWNlIHVzZWQgYnkgdGhpcyBjb250ZXh0CisgKiBAY3R4X2h3X3ByaXZhdGUgIDogSFcgbGF5ZXIncyBwcml2YXRlIGNvbnRleHQgcG9pbnRlciBmb3IgdGhpcyBjb250ZXh0CisgKiBAcHJpb3JpdHkgICAgICAgIDogUHJpb3JpdHkgb2YgdGhpcyBjb250ZXh0CisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgIGxpc3Q7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGN0eF9pbmRleDsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4X2luX3VzZTsKKwljYW1faHdfZXZlbnRfY2JfZnVuYyAgICAgICAgICAgZXZlbnRfY2I7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmNiX3ByaXY7CisJc3RydWN0IGNhbV9mZF9od19tZ3IgICAgICAgICAgKmh3X21ncjsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jhd19yZXN1bHRzOworCWVudW0gY2FtX2ZkX2h3X21vZGUgICAgICAgICAgICBtb2RlOworCWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaW5kZXg7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmN0eF9od19wcml2YXRlOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9kZXZpY2UgOiBGRCBIVyBEZXZpY2UKKyAqCisgKiBAaHdfY2FwcyAgICAgICAgICA6IFRoaXMgRkQgZGV2aWNlJ3MgY2FwYWJpbGl0aWVzCisgKiBAaHdfaW50ZiAgICAgICAgICA6IEZEIGRldmljZSdzIGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQHJlYWR5X3RvX3Byb2Nlc3MgOiBXaGV0aGVyIHRoaXMgZGV2aWNlIGlzIHJlYWR5IHRvIHByb2Nlc3MgbmV4dCBmcmFtZQorICogQG51bV9jdHh0cyAgICAgICAgOiBOdW1iZXIgb2YgY29udGV4dCBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIGRldmljZQorICogQHZhbGlkICAgICAgICAgICAgOiBXaGV0aGVyIHRoaXMgZGV2aWNlIGlzIHZhbGlkCisgKiBAbG9jayAgICAgICAgICAgICA6IExvY2sgdXNlZCBmb3IgcHJvdGVjdGluCisgKi8KK3N0cnVjdCBjYW1fZmRfZGV2aWNlIHsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NhcHMgICAgaHdfY2FwczsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgICAgICAqaHdfaW50ZjsKKwlib29sICAgICAgICAgICAgICAgICAgICAgcmVhZHlfdG9fcHJvY2VzczsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgbnVtX2N0eHRzOworCWJvb2wgICAgICAgICAgICAgICAgICAgICB2YWxpZDsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgbG9jazsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9tZ3JfZnJhbWVfcmVxdWVzdCA6IEZyYW1lIHJlcXVlc3QgaW5mb3JtYXRpb24gbWFpbnRhaW5lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEhXIE1nciBsYXllcgorICoKKyAqIEBsaXN0ICAgICAgICAgICAgICAgICAgOiBMaXN0IHBvaW50ZXIgdXNlZCB0byBtYWludGFpbiB0aGlzIHJlcXVlc3QgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlLCBwZW5kaW5nLCBwcm9jZXNzaW5nIHJlcXVlc3QgbGlzdHMKKyAqIEByZXF1ZXN0X2lkICAgICAgICAgICAgOiBSZXF1ZXN0IElEIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZXF1ZXN0CisgKiBAaHdfY3R4ICAgICAgICAgICAgICAgIDogSFcgY29udGV4dCBmcm9tIHdoaWNoIHRoaXMgcmVxdWVzdCBpcyBjb21pbmcKKyAqIEBod19yZXFfcHJpdmF0ZSAgICAgICAgOiBIVyBsYXllcidzIHByaXZhdGUgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJlcXVlc3QKKyAqIEBod191cGRhdGVfZW50cmllcyAgICAgOiBIVyB1cGRhdGUgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcmVxdWVzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG5lZWRzIHRvIGJlIHN1Ym1pdHRlZCB0byBIVyB0aHJvdWdoIENETQorICogQG51bV9od191cGRhdGVfZW50cmllcyA6IE51bWJlciBvZiBIVyB1cGRhdGUgZW50cmllcworICovCitzdHJ1Y3QgY2FtX2ZkX21ncl9mcmFtZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgbGlzdDsKKwl1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9pZDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X21ncl9jdHggICAgICAqaHdfY3R4OworCXN0cnVjdCBjYW1fZmRfaHdfcmVxX3ByaXZhdGUgICBod19yZXFfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2FtX2h3X3VwZGF0ZV9lbnRyeSAgICAgaHdfdXBkYXRlX2VudHJpZXNbQ0FNX0ZEX01BWF9IV19FTlRSSUVTXTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX2h3X3VwZGF0ZV9lbnRyaWVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX21ncl93b3JrX2RhdGEgOiBIVyBNZ3Igd29yayBkYXRhIGluZm9ybWF0aW9uCisgKgorICogQHR5cGUgICAgIDogVHlwZSBvZiB3b3JrCisgKiBAaXJxX3R5cGUgOiBJUlEgdHlwZSB3aGVuIHRoaXMgd29yayBpcyBxdWV1ZWQgYmVjYXVzZSBvZiBpcnEgY2FsbGJhY2sKKyAqLworc3RydWN0IGNhbV9mZF9tZ3Jfd29ya19kYXRhIHsKKwllbnVtIGNhbV9mZF9tZ3Jfd29ya190eXBlICAgICAgdHlwZTsKKwllbnVtIGNhbV9mZF9od19pcnFfdHlwZSAgICAgICAgaXJxX3R5cGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfbWdyIDogRkQgSFcgTWdyIGluZm9ybWF0aW9uCisgKgorICogQGZyZWVfY3R4X2xpc3QgICAgICAgICAgICAgOiBMaXN0IG9mIGZyZWUgY29udGV4dHMgYXZhaWxhYmxlIGZvciBhY3F1aXJlCisgKiBAdXNlZF9jdHhfbGlzdCAgICAgICAgICAgICA6IExpc3Qgb2YgY29udGV4dHMgdGhhdCBhcmUgYWNxdWlyZWQKKyAqIEBmcmFtZV9mcmVlX2xpc3QgICAgICAgICAgIDogTGlzdCBvZiBmcmVlIGZyYW1lIHJlcXVlc3RzIGF2YWlsYWJsZQorICogQGZyYW1lX3BlbmRpbmdfbGlzdF9oaWdoICAgOiBMaXN0IG9mIGhpZ2ggcHJpb3JpdHkgZnJhbWUgcmVxdWVzdHMgcGVuZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcHJvY2Vzc2luZworICogQGZyYW1lX3BlbmRpbmdfbGlzdF9ub3JtYWwgOiBMaXN0IG9mIG5vcm1hbCBwcmlvcml0eSBmcmFtZSByZXF1ZXN0cyBwZW5kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwcm9jZXNzaW5nCisgKiBAZnJhbWVfcHJvY2Vzc2luZ19saXN0ICAgICA6IExpc3Qgb2YgZnJhbWUgcmVxdWVzdHMgY3VycmVudGx5IGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBjdXJyZW50bHkuIEdlbmVyYWxseSBtYXhpbXVtIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHdvdWxkIGJlIHByZXNlbnQgaW4gdGhpcyBsaXN0CisgKiBAaHdfbWdyX211dGV4ICAgICAgICAgICAgICA6IE11dGV4IHRvIHByb3RlY3QgaHcgbWdyIGRhdGEgd2hlbiBhY2Nlc3NlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG11bHRpcGxlIHRocmVhZHMKKyAqIEBod19tZ3Jfc2xvY2sgICAgICAgICAgICAgIDogU3BpbiBsb2NrIHRvIHByb3RlY3QgaHcgbWdyIGRhdGEgd2hlbiBhY2Nlc3NlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG11bHRpcGxlIHRocmVhZHMKKyAqIEBjdHhfbXV0ZXggICAgICAgICAgICAgICAgIDogTXV0ZXggdG8gcHJvdGVjdCBjb250ZXh0IGxpc3QKKyAqIEBmcmFtZV9yZXFfbXV0ZXggICAgICAgICAgIDogTXV0ZXggdG8gcHJvdGVjdCBmcmFtZSByZXF1ZXN0IGxpc3QKKyAqIEBkZXZpY2VfaW9tbXUgICAgICAgICAgICAgIDogRGV2aWNlIElPTU1VIGluZm9ybWF0aW9uCisgKiBAY2RtX2lvbW11ICAgICAgICAgICAgICAgICA6IENETSBJT01NVSBpbmZvcm1hdGlvbgorICogQGh3X2RldmljZSAgICAgICAgICAgICAgICAgOiBVbmRlcmx5aW5nIEhXIGRldmljZSBpbmZvcm1hdGlvbgorICogQG51bV9kZXZpY2VzICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgSFcgZGV2aWNlcyBhdmFpbGFibGUKKyAqIEByYXdfcmVzdWx0c19hdmFpbGFibGUgICAgIDogV2hldGhlciByYXcgcmVzdWx0cyBhdmFpbGFibGUgaW4gdGhpcyBkcml2ZXIKKyAqIEBzdXBwb3J0ZWRfbW9kZXMgICAgICAgICAgIDogU3VwcG9ydGVkIG1vZGVzIGJ5IHRoaXMgZHJpdmVyCisgKiBAY3R4X3Bvb2wgICAgICAgICAgICAgICAgICA6IExpc3Qgb2YgY29udGV4dAorICogQGZyYW1lX3JlcSAgICAgICAgICAgICAgICAgOiBMaXN0IG9mIGZyYW1lIHJlcXVlc3RzCisgKiBAd29yayAgICAgICAgICAgICAgICAgICAgICA6IFdvcmtlciBoYW5kbGUKKyAqIEB3b3JrX2RhdGEgICAgICAgICAgICAgICAgIDogV29ya2VyIGRhdGEKKyAqIEBmZF9jYXBzICAgICAgICAgICAgICAgICAgIDogRkQgZHJpdmVyIGNhcGFiaWxpdGllcworICovCitzdHJ1Y3QgY2FtX2ZkX2h3X21nciB7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgICAgICBmcmVlX2N0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICAgICAgdXNlZF9jdHhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICAgIGZyYW1lX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICAgIGZyYW1lX3BlbmRpbmdfbGlzdF9oaWdoOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICAgICAgZnJhbWVfcGVuZGluZ19saXN0X25vcm1hbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICAgIGZyYW1lX3Byb2Nlc3NpbmdfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgIGh3X21ncl9tdXRleDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgICAgIGh3X21ncl9zbG9jazsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgIGN0eF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JlcV9tdXRleDsKKwlzdHJ1Y3QgY2FtX2lvbW11X2hhbmRsZSAgICAgICAgICAgIGRldmljZV9pb21tdTsKKwlzdHJ1Y3QgY2FtX2lvbW11X2hhbmRsZSAgICAgICAgICAgIGNkbV9pb21tdTsKKwlzdHJ1Y3QgY2FtX2ZkX2RldmljZSAgICAgICAgICAgICAgIGh3X2RldmljZVtDQU1fRkRfSFdfTUFYXTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXZpY2VzOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3Jlc3VsdHNfYXZhaWxhYmxlOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX21vZGVzOworCXN0cnVjdCBjYW1fZmRfaHdfbWdyX2N0eCAgICAgICAgICAgY3R4X3Bvb2xbQ0FNX0NUWF9NQVhdOworCXN0cnVjdCBjYW1fZmRfbWdyX2ZyYW1lX3JlcXVlc3QgICAgZnJhbWVfcmVxW0NBTV9DVFhfUkVRX01BWF07CisJc3RydWN0IGNhbV9yZXFfbWdyX2NvcmVfd29ya3EgICAgICp3b3JrOworCXN0cnVjdCBjYW1fZmRfbWdyX3dvcmtfZGF0YSAgICAgICAgd29ya19kYXRhW0NBTV9GRF9XT1JLUV9OVU1fVEFTS107CisJc3RydWN0IGNhbV9mZF9xdWVyeV9jYXBfY21kICAgICAgICBmZF9jYXBzOworfTsKKworI2VuZGlmIC8qIF9DQU1fRkRfSFdfTUdSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9jYW1fZmRfaHdfbWdyX2ludGYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2NhbV9mZF9od19tZ3JfaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2JhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9jYW1fZmRfaHdfbWdyX2ludGYuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0FNX0ZEX0hXX01HUl9JTlRGX0hfCisjZGVmaW5lIF9DQU1fRkRfSFdfTUdSX0lOVEZfSF8KKworI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgorI2luY2x1ZGUgImNhbV9od19tZ3JfaW50Zi5oIgorCitpbnQgY2FtX2ZkX2h3X21ncl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKKwlzdHJ1Y3QgY2FtX2h3X21ncl9pbnRmICpod19tZ3JfaW50Zik7CitpbnQgY2FtX2ZkX2h3X21ncl9kZWluaXQoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKTsKKworI2VuZGlmIC8qIF9DQU1fRkRfSFdfTUdSX0lOVEZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvZmRfaHcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNzA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21ncgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jb3JlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3N5bmMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdQorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9jZG0KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9odworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2NwYXMvaW5jbHVkZQorCitvYmotJChDT05GSUdfU1BFQ1RSQV9DQU1FUkEpICs9IGNhbV9mZF9od19kZXYubyBjYW1fZmRfaHdfY29yZS5vIGNhbV9mZF9od19zb2MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvZmRfaHcvY2FtX2ZkX2h3X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhNTY4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19jb3JlLmMKQEAgLTAsMCArMSwxMTMwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImNhbV9mZF9od19jb3JlLmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X3NvYy5oIgorI2luY2x1ZGUgImNhbV90cmFjZS5oIgorCisjZGVmaW5lIENBTV9GRF9SRUdfVkFMX1BBSVJfU0laRSAyNTYKKworc3RhdGljIHVpbnQzMl90IGNhbV9mZF9jZG1fd3JpdGVfcmVnX3ZhbF9wYWlyKHVpbnQzMl90ICpidWZmZXIsCisJdWludDMyX3QgaW5kZXgsIHVpbnQzMl90IHJlZ19vZmZzZXQsIHVpbnQzMl90IHJlZ192YWx1ZSkKK3sKKwlidWZmZXJbaW5kZXgrK10gPSByZWdfb2Zmc2V0OworCWJ1ZmZlcltpbmRleCsrXSA9IHJlZ192YWx1ZTsKKworCUNBTV9EQkcoQ0FNX0ZELCAiRkRfQ0RNX0NNRDogQmFzZVtGRF9DT1JFXSBPZmZzZXRbMHglOHhdIFZhbHVlWzB4JTh4XSIsCisJCXJlZ19vZmZzZXQsIHJlZ192YWx1ZSk7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIGNhbV9mZF9od191dGlsX2NkbV9jYWxsYmFjayh1aW50MzJfdCBoYW5kbGUsIHZvaWQgKnVzZXJkYXRhLAorCWVudW0gY2FtX2NkbV9jYl9zdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBjb29raWUpCit7CisJdHJhY2VfY2FtX2NkbV9jYigiRkQiLCBzdGF0dXMpOworCUNBTV9EQkcoQ0FNX0ZELCAiQ0RNIGhkbD0leCwgdWRhdGE9JXBLLCBzdGF0dXM9JWQsIGNvb2tpZT0lZCIsCisJCWhhbmRsZSwgdXNlcmRhdGEsIHN0YXR1cywgY29va2llKTsKK30KKworc3RhdGljIHZvaWQgY2FtX2ZkX2h3X3V0aWxfZW5hYmxlX3Bvd2VyX29uX3NldHRpbmdzKHN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcpCit7CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8gPSAmZmRfaHctPnNvY19pbmZvOworCXN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gKmh3X3N0YXRpY19pbmZvID0KKwkJKChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKilmZF9ody0+Y29yZV9pbmZvKS0+aHdfc3RhdGljX2luZm87CisKKwlpZiAoaHdfc3RhdGljX2luZm8tPmVuYWJsZV9lcnJhdGFfd2Euc2luZ2xlX2lycV9vbmx5ID09IGZhbHNlKSB7CisJCS8qIEVuYWJsZSBJUlFzIGhlcmUgKi8KKwkJY2FtX2ZkX3NvY19yZWdpc3Rlcl93cml0ZShzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQkJaHdfc3RhdGljX2luZm8tPndyYXBwZXJfcmVncy5pcnFfbWFzaywKKwkJCWh3X3N0YXRpY19pbmZvLT5pcnFfbWFzayk7CisJfQorCisJLyogUW9TIHNldHRpbmdzICovCisJY2FtX2ZkX3NvY19yZWdpc3Rlcl93cml0ZShzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLnZiaWZfcmVxX3ByaW9yaXR5LAorCQlod19zdGF0aWNfaW5mby0+cW9zX3ByaW9yaXR5KTsKKwljYW1fZmRfc29jX3JlZ2lzdGVyX3dyaXRlKHNvY19pbmZvLCBDQU1fRkRfUkVHX1dSQVBQRVIsCisJCWh3X3N0YXRpY19pbmZvLT53cmFwcGVyX3JlZ3MudmJpZl9wcmlvcml0eV9sZXZlbCwKKwkJaHdfc3RhdGljX2luZm8tPnFvc19wcmlvcml0eV9sZXZlbCk7Cit9CisKK2ludCBjYW1fZmRfaHdfdXRpbF9nZXRfaHdfY2FwcyhzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3LAorCXN0cnVjdCBjYW1fZmRfaHdfY2FwcyAqaHdfY2FwcykKK3sKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbyA9ICZmZF9ody0+c29jX2luZm87CisJc3RydWN0IGNhbV9mZF9od19zdGF0aWNfaW5mbyAqaHdfc3RhdGljX2luZm8gPQorCQkoKHN0cnVjdCBjYW1fZmRfY29yZSAqKWZkX2h3LT5jb3JlX2luZm8pLT5od19zdGF0aWNfaW5mbzsKKwl1aW50MzJfdCByZWdfdmFsdWU7CisKKwlpZiAoIWh3X3N0YXRpY19pbmZvKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBodyBpbmZvIGRhdGEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnX3ZhbHVlID0gY2FtX2ZkX3NvY19yZWdpc3Rlcl9yZWFkKHNvY19pbmZvLCBDQU1fRkRfUkVHX0NPUkUsCisJCWh3X3N0YXRpY19pbmZvLT5jb3JlX3JlZ3MudmVyc2lvbik7CisJaHdfY2Fwcy0+Y29yZV92ZXJzaW9uLm1ham9yID0KKwkJQ0FNX0JJVFNfTUFTS19TSElGVChyZWdfdmFsdWUsIDB4ZjAwLCAweDgpOworCWh3X2NhcHMtPmNvcmVfdmVyc2lvbi5taW5vciA9CisJCUNBTV9CSVRTX01BU0tfU0hJRlQocmVnX3ZhbHVlLCAweGYwLCAweDQpOworCWh3X2NhcHMtPmNvcmVfdmVyc2lvbi5pbmNyID0KKwkJQ0FNX0JJVFNfTUFTS19TSElGVChyZWdfdmFsdWUsIDB4ZiwgMHgwKTsKKworCXJlZ192YWx1ZSA9IGNhbV9mZF9zb2NfcmVnaXN0ZXJfcmVhZChzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLndyYXBwZXJfdmVyc2lvbik7CisJaHdfY2Fwcy0+d3JhcHBlcl92ZXJzaW9uLm1ham9yID0KKwkJQ0FNX0JJVFNfTUFTS19TSElGVChyZWdfdmFsdWUsIDB4ZjAwMDAwMDAsIDB4MWMpOworCWh3X2NhcHMtPndyYXBwZXJfdmVyc2lvbi5taW5vciA9CisJCUNBTV9CSVRTX01BU0tfU0hJRlQocmVnX3ZhbHVlLCAweGZmZjAwMDAsIDB4MTApOworCWh3X2NhcHMtPndyYXBwZXJfdmVyc2lvbi5pbmNyID0KKwkJQ0FNX0JJVFNfTUFTS19TSElGVChyZWdfdmFsdWUsIDB4ZmZmZiwgMHgwKTsKKworCWh3X2NhcHMtPnJhd19yZXN1bHRzX2F2YWlsYWJsZSA9CisJCWh3X3N0YXRpY19pbmZvLT5yZXN1bHRzLnJhd19yZXN1bHRzX2F2YWlsYWJsZTsKKwlod19jYXBzLT5zdXBwb3J0ZWRfbW9kZXMgPSBod19zdGF0aWNfaW5mby0+c3VwcG9ydGVkX21vZGVzOworCisJQ0FNX0RCRyhDQU1fRkQsICJjb3JlOiVkLiVkLiVkIHdyYXBwZXI6JWQuJWQuJWQgaW50ZXJtZWRpYXRlOiVkIiwKKwkJaHdfY2Fwcy0+Y29yZV92ZXJzaW9uLm1ham9yLCBod19jYXBzLT5jb3JlX3ZlcnNpb24ubWlub3IsCisJCWh3X2NhcHMtPmNvcmVfdmVyc2lvbi5pbmNyLCBod19jYXBzLT53cmFwcGVyX3ZlcnNpb24ubWFqb3IsCisJCWh3X2NhcHMtPndyYXBwZXJfdmVyc2lvbi5taW5vciwgaHdfY2Fwcy0+d3JhcHBlcl92ZXJzaW9uLmluY3IsCisJCWh3X2NhcHMtPnJhd19yZXN1bHRzX2F2YWlsYWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fZmRfaHdfdXRpbF9mZHdyYXBwZXJfc3luY19yZXNldChzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3KQoreworCXN0cnVjdCBjYW1fZmRfY29yZSAqZmRfY29yZSA9IChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKilmZF9ody0+Y29yZV9pbmZvOworCXN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gKmh3X3N0YXRpY19pbmZvID0gZmRfY29yZS0+aHdfc3RhdGljX2luZm87CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8gPSAmZmRfaHctPnNvY19pbmZvOworCWxvbmcgdGltZV9sZWZ0OworCisJLyogQmVmb3JlIHRyaWdnZXJpbmcgcmVzZXQgdG8gSFcsIGNsZWFyIHRoZSByZXNldCBjb21wbGV0ZSAqLworCXJlaW5pdF9jb21wbGV0aW9uKCZmZF9jb3JlLT5yZXNldF9jb21wbGV0ZSk7CisKKwlpZiAoaHdfc3RhdGljX2luZm8tPmVuYWJsZV9lcnJhdGFfd2Euc2luZ2xlX2lycV9vbmx5KSB7CisJCWNhbV9mZF9zb2NfcmVnaXN0ZXJfd3JpdGUoc29jX2luZm8sIENBTV9GRF9SRUdfV1JBUFBFUiwKKwkJCWh3X3N0YXRpY19pbmZvLT53cmFwcGVyX3JlZ3MuaXJxX21hc2ssCisJCQlDQU1fRkRfSVJRX1RPX01BU0soQ0FNX0ZEX0lSUV9SRVNFVF9ET05FKSk7CisJfQorCisJY2FtX2ZkX3NvY19yZWdpc3Rlcl93cml0ZShzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLnN3X3Jlc2V0LCAweDEpOworCisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmZF9jb3JlLT5yZXNldF9jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhDQU1fRkRfSFdfSEFMVF9SRVNFVF9USU1FT1VUKSk7CisJaWYgKHRpbWVfbGVmdCA8PSAwKQorCQlDQU1fV0FSTihDQU1fRkQsICJIVyByZXNldCB0aW1lb3V0IHRpbWVfbGVmdD0lZCIsIHRpbWVfbGVmdCk7CisKKwljYW1fZmRfc29jX3JlZ2lzdGVyX3dyaXRlKHNvY19pbmZvLCBDQU1fRkRfUkVHX0NPUkUsCisJCWh3X3N0YXRpY19pbmZvLT5jb3JlX3JlZ3MuY29udHJvbCwgMHgxKTsKKworCUNBTV9EQkcoQ0FNX0ZELCAiRkQgV3JhcHBlciBTVyBTeW5jIFJlc2V0IGNvbXBsZXRlIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNhbV9mZF9od191dGlsX2Zkd3JhcHBlcl9oYWx0KHN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcpCit7CisJc3RydWN0IGNhbV9mZF9jb3JlICpmZF9jb3JlID0gKHN0cnVjdCBjYW1fZmRfY29yZSAqKWZkX2h3LT5jb3JlX2luZm87CisJc3RydWN0IGNhbV9mZF9od19zdGF0aWNfaW5mbyAqaHdfc3RhdGljX2luZm8gPSBmZF9jb3JlLT5od19zdGF0aWNfaW5mbzsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbyA9ICZmZF9ody0+c29jX2luZm87CisJbG9uZyB0aW1lX2xlZnQ7CisKKwkvKiBCZWZvcmUgdHJpZ2dlcmluZyBoYWx0IHRvIEhXLCBjbGVhciBoYWx0IGNvbXBsZXRlICovCisJcmVpbml0X2NvbXBsZXRpb24oJmZkX2NvcmUtPmhhbHRfY29tcGxldGUpOworCisJaWYgKGh3X3N0YXRpY19pbmZvLT5lbmFibGVfZXJyYXRhX3dhLnNpbmdsZV9pcnFfb25seSkgeworCQljYW1fZmRfc29jX3JlZ2lzdGVyX3dyaXRlKHNvY19pbmZvLCBDQU1fRkRfUkVHX1dSQVBQRVIsCisJCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLmlycV9tYXNrLAorCQkJQ0FNX0ZEX0lSUV9UT19NQVNLKENBTV9GRF9JUlFfSEFMVF9ET05FKSk7CisJfQorCisJY2FtX2ZkX3NvY19yZWdpc3Rlcl93cml0ZShzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLmh3X3N0b3AsIDB4MSk7CisKKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZkX2NvcmUtPmhhbHRfY29tcGxldGUsCisJCW1zZWNzX3RvX2ppZmZpZXMoQ0FNX0ZEX0hXX0hBTFRfUkVTRVRfVElNRU9VVCkpOworCWlmICh0aW1lX2xlZnQgPD0gMCkKKwkJQ0FNX1dBUk4oQ0FNX0ZELCAiSFcgaGFsdCB0aW1lb3V0IHRpbWVfbGVmdD0lZCIsIHRpbWVfbGVmdCk7CisKKwlDQU1fREJHKENBTV9GRCwgIkZEIFdyYXBwZXIgSGFsdCBjb21wbGV0ZSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX2h3X3V0aWxfcHJvY2Vzc2NtZF9wcmVzdGFydChzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3LAorCXN0cnVjdCBjYW1fZmRfaHdfY21kX3ByZXN0YXJ0X2FyZ3MgKnByZXN0YXJ0X2FyZ3MpCit7CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8gPSAmZmRfaHctPnNvY19pbmZvOworCXN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gKmh3X3N0YXRpY19pbmZvID0KKwkJKChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKilmZF9ody0+Y29yZV9pbmZvKS0+aHdfc3RhdGljX2luZm87CisJc3RydWN0IGNhbV9mZF9jdHhfaHdfcHJpdmF0ZSAqY3R4X2h3X3ByaXZhdGUgPQorCQlwcmVzdGFydF9hcmdzLT5jdHhfaHdfcHJpdmF0ZTsKKwl1aW50MzJfdCBzaXplLCBzaXplX3JlcXVpcmVkID0gMDsKKwl1aW50MzJfdCBtZW1fYmFzZTsKKwl1aW50MzJfdCAqY21kX2J1Zl9hZGRyID0gcHJlc3RhcnRfYXJncy0+Y21kX2J1Zl9hZGRyOworCXVpbnQzMl90IHJlZ192YWxfcGFpcltDQU1fRkRfUkVHX1ZBTF9QQUlSX1NJWkVdOworCXVpbnQzMl90IG51bV9jbWRzID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2lvX2J1ZmZlciAqaW9fYnVmOworCXN0cnVjdCBjYW1fZmRfaHdfcmVxX3ByaXZhdGUgKnJlcV9wcml2YXRlOworCXVpbnQzMl90IGF2YWlsYWJsZV9zaXplID0gcHJlc3RhcnRfYXJncy0+c2l6ZTsKKwlib29sIHdvcmtfYnVmZmVyX2NvbmZpZ3VyZWQgPSBmYWxzZTsKKworCWlmICghY3R4X2h3X3ByaXZhdGUgfHwgIWNtZF9idWZfYWRkcikgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgcHJlc3RhcnQgYXJncyAlcEsgJXBLIiwKKwkJCWN0eF9od19wcml2YXRlLCBjbWRfYnVmX2FkZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocHJlc3RhcnRfYXJncy0+Z2V0X3Jhd19yZXN1bHRzICYmCisJCSFod19zdGF0aWNfaW5mby0+cmVzdWx0cy5yYXdfcmVzdWx0c19hdmFpbGFibGUpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJSYXcgcmVzdWx0cyBub3Qgc3VwcG9ydGVkICVkICVkIiwKKwkJCXByZXN0YXJ0X2FyZ3MtPmdldF9yYXdfcmVzdWx0cywKKwkJCWh3X3N0YXRpY19pbmZvLT5yZXN1bHRzLnJhd19yZXN1bHRzX2F2YWlsYWJsZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcV9wcml2YXRlID0gJnByZXN0YXJ0X2FyZ3MtPmh3X3JlcV9wcml2YXRlOworCXJlcV9wcml2YXRlLT5jdHhfaHdfcHJpdmF0ZSA9IHByZXN0YXJ0X2FyZ3MtPmN0eF9od19wcml2YXRlOworCXJlcV9wcml2YXRlLT5yZXF1ZXN0X2lkID0gcHJlc3RhcnRfYXJncy0+cmVxdWVzdF9pZDsKKwlyZXFfcHJpdmF0ZS0+Z2V0X3Jhd19yZXN1bHRzID0gcHJlc3RhcnRfYXJncy0+Z2V0X3Jhd19yZXN1bHRzOworCXJlcV9wcml2YXRlLT5mZF9yZXN1bHRzID0gTlVMTDsKKwlyZXFfcHJpdmF0ZS0+cmF3X3Jlc3VsdHMgPSBOVUxMOworCisJLyogU3RhcnQgcHJlcGFyaW5nIENETSByZWdpc3RlciB2YWx1ZXMgdGhhdCBLTUQgaGFzIHRvIGluc2VydCAqLworCW51bV9jbWRzID0gY2FtX2ZkX2NkbV93cml0ZV9yZWdfdmFsX3BhaXIocmVnX3ZhbF9wYWlyLCBudW1fY21kcywKKwkJaHdfc3RhdGljX2luZm8tPmNvcmVfcmVncy5jb250cm9sLCAweDEpOworCW51bV9jbWRzID0gY2FtX2ZkX2NkbV93cml0ZV9yZWdfdmFsX3BhaXIocmVnX3ZhbF9wYWlyLCBudW1fY21kcywKKwkJaHdfc3RhdGljX2luZm8tPmNvcmVfcmVncy5jb250cm9sLCAweDApOworCisJZm9yIChpID0gMDsgaSA8IENBTV9GRF9NQVhfSU9fQlVGRkVSUzsgaSsrKSB7CisJCWlvX2J1ZiA9ICZwcmVzdGFydF9hcmdzLT5pbnB1dF9idWZbaV07CisKKwkJaWYgKGlvX2J1Zi0+dmFsaWQgPT0gZmFsc2UpCisJCQlicmVhazsKKworCQlpZiAoaW9fYnVmLT5pb19jZmctPmRpcmVjdGlvbiAhPSBDQU1fQlVGX0lOUFVUKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkluY29ycmVjdCBkaXJlY3Rpb24gJWQgJWQiLAorCQkJCWlvX2J1Zi0+aW9fY2ZnLT5kaXJlY3Rpb24sIENBTV9CVUZfSU5QVVQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGlvX2J1Zi0+aW9fY2ZnLT5yZXNvdXJjZV90eXBlKSB7CisJCWNhc2UgQ0FNX0ZEX0lOUFVUX1BPUlRfSURfSU1BR0U6IHsKKwkJCWlmICgobnVtX2NtZHMgKyAyKSA+IENBTV9GRF9SRUdfVkFMX1BBSVJfU0laRSkgeworCQkJCUNBTV9FUlIoQ0FNX0ZELAorCQkJCQkiSW52YWxpZCByZWdfdmFsIHBhaXIgc2l6ZSAlZCwgJWQiLAorCQkJCQludW1fY21kcywgQ0FNX0ZEX1JFR19WQUxfUEFJUl9TSVpFKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJbnVtX2NtZHMgPSBjYW1fZmRfY2RtX3dyaXRlX3JlZ192YWxfcGFpcigKKwkJCQlyZWdfdmFsX3BhaXIsIG51bV9jbWRzLAorCQkJCWh3X3N0YXRpY19pbmZvLT5jb3JlX3JlZ3MuaW1hZ2VfYWRkciwKKwkJCQlpb19idWYtPmlvX2FkZHJbMF0pOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCByZXNvdXJjZSB0eXBlICVkIiwKKwkJCQlpb19idWYtPmlvX2NmZy0+cmVzb3VyY2VfdHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBDQU1fRkRfTUFYX0lPX0JVRkZFUlM7IGkrKykgeworCQlpb19idWYgPSAmcHJlc3RhcnRfYXJncy0+b3V0cHV0X2J1ZltpXTsKKworCQlpZiAoaW9fYnVmLT52YWxpZCA9PSBmYWxzZSkKKwkJCWJyZWFrOworCisJCWlmIChpb19idWYtPmlvX2NmZy0+ZGlyZWN0aW9uICE9IENBTV9CVUZfT1VUUFVUKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgIkluY29ycmVjdCBkaXJlY3Rpb24gJWQgJWQiLAorCQkJCWlvX2J1Zi0+aW9fY2ZnLT5kaXJlY3Rpb24sIENBTV9CVUZfSU5QVVQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzd2l0Y2ggKGlvX2J1Zi0+aW9fY2ZnLT5yZXNvdXJjZV90eXBlKSB7CisJCWNhc2UgQ0FNX0ZEX09VVFBVVF9QT1JUX0lEX1JFU1VMVFM6IHsKKwkJCXVpbnQzMl90IGZhY2VfcmVzdWx0c19vZmZzZXQ7CisKKwkJCXNpemVfcmVxdWlyZWQgPSBod19zdGF0aWNfaW5mby0+cmVzdWx0cy5tYXhfZmFjZXMgKgorCQkJCWh3X3N0YXRpY19pbmZvLT5yZXN1bHRzLnBlcl9mYWNlX2VudHJpZXMgKiA0OworCisJCQlpZiAoaW9fYnVmLT5pb19jZmctPnBsYW5lc1swXS5wbGFuZV9zdHJpZGUgPAorCQkJCXNpemVfcmVxdWlyZWQpIHsKKwkJCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgcmVzdWx0cyBzaXplICVkICVkIiwKKwkJCQkJaW9fYnVmLT5pb19jZmctPnBsYW5lc1swXS5wbGFuZV9zdHJpZGUsCisJCQkJCXNpemVfcmVxdWlyZWQpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlyZXFfcHJpdmF0ZS0+ZmRfcmVzdWx0cyA9CisJCQkJKHN0cnVjdCBjYW1fZmRfcmVzdWx0cyAqKWlvX2J1Zi0+Y3B1X2FkZHJbMF07CisKKwkJCWZhY2VfcmVzdWx0c19vZmZzZXQgPQorCQkJCSh1aW50OF90ICopJnJlcV9wcml2YXRlLT5mZF9yZXN1bHRzLT5mYWNlc1swXSAtCisJCQkJKHVpbnQ4X3QgKilyZXFfcHJpdmF0ZS0+ZmRfcmVzdWx0czsKKworCQkJaWYgKGh3X3N0YXRpY19pbmZvLT5yb19tb2RlX3N1cHBvcnRlZCkgeworCQkJCWlmICgobnVtX2NtZHMgKyA0KSA+IENBTV9GRF9SRUdfVkFMX1BBSVJfU0laRSkgeworCQkJCQlDQU1fRVJSKENBTV9GRCwKKwkJCQkJCSJJbnZhbGlkIHJlZ192YWwgc2l6ZSAlZCwgJWQiLAorCQkJCQkJbnVtX2NtZHMsCisJCQkJCQlDQU1fRkRfUkVHX1ZBTF9QQUlSX1NJWkUpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBGYWNlIGRhdGEgYWN0dWFsbHkgc3RhcnRzIDE2Ynl0ZXMgbGF0ZXIgaW4KKwkJCQkgKiB0aGUgaW8gYnVmZmVyICBDaGVjayBjYW1fZmRfcmVzdWx0cy4KKwkJCQkgKi8KKwkJCQludW1fY21kcyA9IGNhbV9mZF9jZG1fd3JpdGVfcmVnX3ZhbF9wYWlyKAorCQkJCQlyZWdfdmFsX3BhaXIsIG51bV9jbWRzLAorCQkJCQlod19zdGF0aWNfaW5mby0+Y29yZV9yZWdzLnJlc3VsdF9hZGRyLAorCQkJCQlpb19idWYtPmlvX2FkZHJbMF0gKworCQkJCQlmYWNlX3Jlc3VsdHNfb2Zmc2V0KTsKKwkJCQludW1fY21kcyA9IGNhbV9mZF9jZG1fd3JpdGVfcmVnX3ZhbF9wYWlyKAorCQkJCQlyZWdfdmFsX3BhaXIsIG51bV9jbWRzLAorCQkJCQlod19zdGF0aWNfaW5mby0+Y29yZV9yZWdzLnJvX21vZGUsCisJCQkJCTB4MSk7CisKKwkJCQlyZXFfcHJpdmF0ZS0+cm9fbW9kZV9lbmFibGVkID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmVxX3ByaXZhdGUtPnJvX21vZGVfZW5hYmxlZCA9IGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDQU1fRkRfT1VUUFVUX1BPUlRfSURfUkFXX1JFU1VMVFM6IHsKKwkJCXNpemVfcmVxdWlyZWQgPQorCQkJCWh3X3N0YXRpY19pbmZvLT5yZXN1bHRzLnJhd19yZXN1bHRzX2VudHJpZXMgKgorCQkJCXNpemVvZih1aW50MzJfdCk7CisKKwkJCWlmIChpb19idWYtPmlvX2NmZy0+cGxhbmVzWzBdLnBsYW5lX3N0cmlkZSA8CisJCQkJc2l6ZV9yZXF1aXJlZCkgeworCQkJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCByZXN1bHRzIHNpemUgJWQgJWQiLAorCQkJCQlpb19idWYtPmlvX2NmZy0+cGxhbmVzWzBdLnBsYW5lX3N0cmlkZSwKKwkJCQkJc2l6ZV9yZXF1aXJlZCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCXJlcV9wcml2YXRlLT5yYXdfcmVzdWx0cyA9CisJCQkJKHVpbnQzMl90ICopaW9fYnVmLT5jcHVfYWRkclswXTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgQ0FNX0ZEX09VVFBVVF9QT1JUX0lEX1dPUktfQlVGRkVSOiB7CisJCQlpZiAoKG51bV9jbWRzICsgMikgPiBDQU1fRkRfUkVHX1ZBTF9QQUlSX1NJWkUpIHsKKwkJCQlDQU1fRVJSKENBTV9GRCwKKwkJCQkJIkludmFsaWQgcmVnX3ZhbCBwYWlyIHNpemUgJWQsICVkIiwKKwkJCQkJbnVtX2NtZHMsIENBTV9GRF9SRUdfVkFMX1BBSVJfU0laRSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCW51bV9jbWRzID0gY2FtX2ZkX2NkbV93cml0ZV9yZWdfdmFsX3BhaXIoCisJCQkJcmVnX3ZhbF9wYWlyLCBudW1fY21kcywKKwkJCQlod19zdGF0aWNfaW5mby0+Y29yZV9yZWdzLndvcmtfYWRkciwKKwkJCQlpb19idWYtPmlvX2FkZHJbMF0pOworCisJCQl3b3JrX2J1ZmZlcl9jb25maWd1cmVkID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgcmVzb3VyY2UgdHlwZSAlZCIsCisJCQkJaW9fYnVmLT5pb19jZmctPnJlc291cmNlX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIXJlcV9wcml2YXRlLT5mZF9yZXN1bHRzIHx8ICF3b3JrX2J1ZmZlcl9jb25maWd1cmVkKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBJTyBCdWZmZXJzIHJlc3VsdHM9JXBLIHdvcms9JWQiLAorCQkJcmVxX3ByaXZhdGUtPmZkX3Jlc3VsdHMsIHdvcmtfYnVmZmVyX2NvbmZpZ3VyZWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaXJzdCBpbnNlcnQgQ0hBTkdFX0JBU0UgY29tbWFuZCAqLworCXNpemUgPSBjdHhfaHdfcHJpdmF0ZS0+Y2RtX29wcy0+Y2RtX3JlcXVpcmVkX3NpemVfY2hhbmdlYmFzZSgpOworCS8qIHNpbmNlIGNkbSByZXR1cm5zIGR3b3Jkcywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IGludG8gYnl0ZXMgKi8KKwlpZiAoKHNpemUgKiA0KSA+IGF2YWlsYWJsZV9zaXplKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiYnVmIHNpemU6JWQgaXMgbm90IHN1ZmZpY2llbnQsIGV4cGVjdGVkOiAlZCIsCisJCQlwcmVzdGFydF9hcmdzLT5zaXplLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtX2Jhc2UgPSBDQU1fU09DX0dFVF9SRUdfTUFQX0NBTV9CQVNFKHNvY19pbmZvLAorCQkoKHN0cnVjdCBjYW1fZmRfc29jX3ByaXZhdGUgKilzb2NfaW5mby0+c29jX3ByaXZhdGUpLT4KKwkJcmVnYmFzZV9pbmRleFtDQU1fRkRfUkVHX0NPUkVdKTsKKworCWN0eF9od19wcml2YXRlLT5jZG1fb3BzLT5jZG1fd3JpdGVfY2hhbmdlYmFzZShjbWRfYnVmX2FkZHIsIG1lbV9iYXNlKTsKKwljbWRfYnVmX2FkZHIgKz0gc2l6ZTsKKwlhdmFpbGFibGVfc2l6ZSAtPSAoc2l6ZSAqIDQpOworCisJc2l6ZSA9IGN0eF9od19wcml2YXRlLT5jZG1fb3BzLT5jZG1fcmVxdWlyZWRfc2l6ZV9yZWdfcmFuZG9tKAorCQludW1fY21kcy8yKTsKKwkvKiBjZG0gdXRpbCByZXR1cm5zIGR3b3JkcywgbmVlZCB0byBjb252ZXJ0IHRvIGJ5dGVzICovCisJaWYgKChzaXplICogNCkgPiBhdmFpbGFibGVfc2l6ZSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkluc3VmZmljaWVudCBzaXplOiVkICwgZXhwZWN0ZWQgc2l6ZTolZCIsCisJCQlhdmFpbGFibGVfc2l6ZSwgc2l6ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljdHhfaHdfcHJpdmF0ZS0+Y2RtX29wcy0+Y2RtX3dyaXRlX3JlZ3JhbmRvbShjbWRfYnVmX2FkZHIsIG51bV9jbWRzLzIsCisJCXJlZ192YWxfcGFpcik7CisJY21kX2J1Zl9hZGRyICs9IHNpemU7CisJYXZhaWxhYmxlX3NpemUgLT0gKHNpemUgKiA0KTsKKworCS8qIFVwZGF0ZSBwcmVfY29uZmlnX2J1Zl9zaXplIGluIGJ5dGVzICovCisJcHJlc3RhcnRfYXJncy0+cHJlX2NvbmZpZ19idWZfc2l6ZSA9CisJCXByZXN0YXJ0X2FyZ3MtPnNpemUgLSBhdmFpbGFibGVfc2l6ZTsKKworCS8qIEluc2VydCBzdGFydCB0cmlnZ2VyIGNvbW1hbmQgaW50byBDRE0gYXMgcG9zdCBjb25maWcgY29tbWFuZHMuICovCisJbnVtX2NtZHMgPSBjYW1fZmRfY2RtX3dyaXRlX3JlZ192YWxfcGFpcihyZWdfdmFsX3BhaXIsIDAsCisJCWh3X3N0YXRpY19pbmZvLT5jb3JlX3JlZ3MuY29udHJvbCwgMHgyKTsKKwlzaXplID0gY3R4X2h3X3ByaXZhdGUtPmNkbV9vcHMtPmNkbV9yZXF1aXJlZF9zaXplX3JlZ19yYW5kb20oCisJCW51bV9jbWRzLzIpOworCWlmICgoc2l6ZSAqIDQpID4gYXZhaWxhYmxlX3NpemUpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnN1ZmZpY2llbnQgc2l6ZTolZCAsIGV4cGVjdGVkIHNpemU6JWQiLAorCQkJYXZhaWxhYmxlX3NpemUsIHNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY3R4X2h3X3ByaXZhdGUtPmNkbV9vcHMtPmNkbV93cml0ZV9yZWdyYW5kb20oY21kX2J1Zl9hZGRyLCBudW1fY21kcy8yLAorCQlyZWdfdmFsX3BhaXIpOworCWNtZF9idWZfYWRkciArPSBzaXplOworCWF2YWlsYWJsZV9zaXplIC09IChzaXplICogNCk7CisKKwlwcmVzdGFydF9hcmdzLT5wb3N0X2NvbmZpZ19idWZfc2l6ZSA9IHNpemUgKiA0OworCisJQ0FNX0RCRyhDQU1fRkQsICJQcmVDb25maWcgWyVwSyAlZF0sIFBvc3RDb25maWdbJXBLICVkXSIsCisJCXByZXN0YXJ0X2FyZ3MtPmNtZF9idWZfYWRkciwgcHJlc3RhcnRfYXJncy0+cHJlX2NvbmZpZ19idWZfc2l6ZSwKKwkJY21kX2J1Zl9hZGRyLCBwcmVzdGFydF9hcmdzLT5wb3N0X2NvbmZpZ19idWZfc2l6ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHByZXN0YXJ0X2FyZ3MtPnByZV9jb25maWdfYnVmX3NpemUgKworCQlwcmVzdGFydF9hcmdzLT5wb3N0X2NvbmZpZ19idWZfc2l6ZSkgLyA0OyBpKyspCisJCUNBTV9EQkcoQ0FNX0ZELCAiQ0RNIEtNRCBDb21tYW5kcyBbJWRdIDogWyVwS10gWzB4JXhdIiwgaSwKKwkJCSZwcmVzdGFydF9hcmdzLT5jbWRfYnVmX2FkZHJbaV0sCisJCQlwcmVzdGFydF9hcmdzLT5jbWRfYnVmX2FkZHJbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ZkX2h3X3V0aWxfcHJvY2Vzc2NtZF9mcmFtZV9kb25lKHN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcsCisJc3RydWN0IGNhbV9mZF9od19mcmFtZV9kb25lX2FyZ3MgKmZyYW1lX2RvbmVfYXJncykKK3sKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmUgPSAoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3N0YXRpY19pbmZvICpod19zdGF0aWNfaW5mbyA9IGZkX2NvcmUtPmh3X3N0YXRpY19pbmZvOworCXN0cnVjdCBjYW1fZmRfaHdfcmVxX3ByaXZhdGUgKnJlcV9wcml2YXRlOworCXVpbnQzMl90IGJhc2UsIGZhY2VfY250OworCXVpbnQzMl90ICpidWZmZXI7CisJaW50IGk7CisKKwlzcGluX2xvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisJaWYgKChmZF9jb3JlLT5jb3JlX3N0YXRlICE9IENBTV9GRF9DT1JFX1NUQVRFX0lETEUpIHx8CisJCShmZF9jb3JlLT5yZXN1bHRzX3ZhbGlkID09IGZhbHNlKSB8fAorCQkhZmRfY29yZS0+aHdfcmVxX3ByaXZhdGUpIHsKKwkJQ0FNX0VSUihDQU1fRkQsCisJCQkiSW52YWxpZCBzdGF0ZSBmb3IgcmVzdWx0cyBzdGF0ZT0lZCwgcmVzdWx0cz0lZCAlcEsiLAorCQkJZmRfY29yZS0+Y29yZV9zdGF0ZSwgZmRfY29yZS0+cmVzdWx0c192YWxpZCwKKwkJCWZkX2NvcmUtPmh3X3JlcV9wcml2YXRlKTsKKwkJc3Bpbl91bmxvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmZF9jb3JlLT5jb3JlX3N0YXRlID0gQ0FNX0ZEX0NPUkVfU1RBVEVfUkVBRElOR19SRVNVTFRTOworCXJlcV9wcml2YXRlID0gZmRfY29yZS0+aHdfcmVxX3ByaXZhdGU7CisJc3Bpbl91bmxvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisKKwkvKgorCSAqIENvcHkgdGhlIHJlZ2lzdGVyIHZhbHVlIGFzIGlzIGludG8gb3V0cHV0IGJ1ZmZlcnMuCisJICogV2VodGVyIHdlIGFyZSBjb3B5aW5nIHRoZSBvdXRwdXQgZGF0YSBieSByZWFkaW5nIHJlZ2lzdGVycyBvcgorCSAqIHByb2dyYW1taW5nIG91dHB1dCBidWZmZXIgZGlyZWN0bHkgdG8gSFcgbXVzdCBiZSB0cmFuc3BhcmVudCB0byBVTUQuCisJICogSW4gY2FzZSBIVyBzdXBwb3J0cyB3cml0aW5nIGZhY2UgY291bnQgdmFsdWUgZGlyZWN0bHkgaW50bworCSAqIEREUiBtZW1vcnkgaW4gZnV0dXJlLCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoLgorCSAqLworCXJlcV9wcml2YXRlLT5mZF9yZXN1bHRzLT5mYWNlX2NvdW50ID0KKwkJY2FtX2ZkX3NvY19yZWdpc3Rlcl9yZWFkKCZmZF9ody0+c29jX2luZm8sIENBTV9GRF9SRUdfQ09SRSwKKwkJaHdfc3RhdGljX2luZm8tPmNvcmVfcmVncy5yZXN1bHRfY250KTsKKworCWZhY2VfY250ID0gcmVxX3ByaXZhdGUtPmZkX3Jlc3VsdHMtPmZhY2VfY291bnQgJiAweDNGOworCisJaWYgKGZhY2VfY250ID4gaHdfc3RhdGljX2luZm8tPnJlc3VsdHMubWF4X2ZhY2VzKSB7CisJCUNBTV9XQVJOKENBTV9GRCwgIkZhY2UgY291bnQgZ3JlYXRlciB0aGFuIG1heCAlZCAlZCIsCisJCQlmYWNlX2NudCwgaHdfc3RhdGljX2luZm8tPnJlc3VsdHMubWF4X2ZhY2VzKTsKKwkJZmFjZV9jbnQgPSBod19zdGF0aWNfaW5mby0+cmVzdWx0cy5tYXhfZmFjZXM7CisJfQorCisJQ0FNX0RCRyhDQU1fRkQsICJSZXFJRFslbGxkXSBGYWNlcyBEZXRlY3RlZCA9ICVkIiwKKwkJcmVxX3ByaXZhdGUtPnJlcXVlc3RfaWQsIGZhY2VfY250KTsKKworCS8qCisJICogV2UgbmVlZCB0byByZWFkIHRoZSBmYWNlIGRhdGEgaW5mb3JtYXRpb24gZnJvbSByZWdpc3RlcnMgb25seQorCSAqIGlmIG9uZSBvZiBiZWxvdyBpcyB0cnVlCisJICogMS4gUk8gbW9kZSBpcyBub3Qgc2V0LiBpLmUgRkQgSFcgZG9lc24ndCB3cml0ZSBmYWNlIGRhdGEgaW50bworCSAqICAgIEREUiBtZW1vcnkKKwkgKiAyLiBPbiB0aGUgY3VycmVudCBjaGlwc2V0LCByZXN1bHRzIHdyaXR0ZW4gaW50byBERFIgbWVtb3J5IGJ5IEZEIEhXCisJICogICAgYXJlIG5vdCBnYXVyYW50ZWVkIHRvIGJlIGNvcnJlY3QKKwkgKi8KKwlpZiAoIXJlcV9wcml2YXRlLT5yb19tb2RlX2VuYWJsZWQgfHwKKwkJaHdfc3RhdGljX2luZm8tPmVuYWJsZV9lcnJhdGFfd2Eucm9fbW9kZV9yZXN1bHRzX2ludmFsaWQpIHsKKwkJYnVmZmVyID0gKHVpbnQzMl90ICopJnJlcV9wcml2YXRlLT5mZF9yZXN1bHRzLT5mYWNlc1swXTsKKwkJYmFzZSA9IGh3X3N0YXRpY19pbmZvLT5jb3JlX3JlZ3MucmVzdWx0c19yZWdfYmFzZTsKKworCQkvKgorCQkgKiBXcml0ZSByZWdpc3RlciB2YWx1ZXMgYXMgaXMgaW50byBmYWNlIGRhdGEgYnVmZmVyLiAgSXRzIFVNRAorCQkgKiBkcml2ZXIgcmVzcG9uc2liaWxpdHkgdG8gaW50ZXJwcmV0IHRoZSBkYXRhIGFuZCBleHRyYWN0IGZhY2UKKwkJICogcHJvcGVydGllcyBmcm9tIG91dHB1dCBidWZmZXIuIFRoaW5rIGluIGNhc2Ugb3V0cHV0IGJ1ZmZlcgorCQkgKiBpcyBkaXJlY3RseSBwcm9ncmFtbWVkIHRvIEhXLCB0aGVuIEtNRCBoYXMgbm8gY29udHJvbCB0bworCQkgKiBleHRyYWN0IHRoZSBmYWNlIHByb3BlcnRpZXMgYW5kIFVNRCBhbnl3YXkgaGFzIHRvIGV4dHJhY3QKKwkJICogZmFjZSBwcm9wZXJ0aWVzLiBTbyB3ZSBmb2xsb3cgdGhlIHNhbWUgYXBwcm9hY2ggYW5kIGtlZXAKKwkJICogdGhpcyB0cmFuc3BhcmVudCB0byBVTUQuCisJCSAqLworCQlmb3IgKGkgPSAwOworCQkJaSA8IChmYWNlX2NudCAqCisJCQlod19zdGF0aWNfaW5mby0+cmVzdWx0cy5wZXJfZmFjZV9lbnRyaWVzKTsgaSsrKSB7CisJCQkqYnVmZmVyID0gY2FtX2ZkX3NvY19yZWdpc3Rlcl9yZWFkKCZmZF9ody0+c29jX2luZm8sCisJCQkJQ0FNX0ZEX1JFR19DT1JFLCBiYXNlICsgKGkgKiAweDQpKTsKKwkJCUNBTV9EQkcoQ0FNX0ZELCAiRmFjZURhdGFbJWRdIDogMHgleCIsIGkgLyA0LCAqYnVmZmVyKTsKKwkJCWJ1ZmZlcisrOworCQl9CisJfQorCisJaWYgKHJlcV9wcml2YXRlLT5nZXRfcmF3X3Jlc3VsdHMgJiYKKwkJcmVxX3ByaXZhdGUtPnJhd19yZXN1bHRzICYmCisJCWh3X3N0YXRpY19pbmZvLT5yZXN1bHRzLnJhd19yZXN1bHRzX2F2YWlsYWJsZSkgeworCQlidWZmZXIgPSByZXFfcHJpdmF0ZS0+cmF3X3Jlc3VsdHM7CisJCWJhc2UgPSBod19zdGF0aWNfaW5mby0+Y29yZV9yZWdzLnJhd19yZXN1bHRzX3JlZ19iYXNlOworCisJCWZvciAoaSA9IDA7CisJCQlpIDwgaHdfc3RhdGljX2luZm8tPnJlc3VsdHMucmF3X3Jlc3VsdHNfZW50cmllczsKKwkJCWkrKykgeworCQkJKmJ1ZmZlciA9IGNhbV9mZF9zb2NfcmVnaXN0ZXJfcmVhZCgmZmRfaHctPnNvY19pbmZvLAorCQkJCUNBTV9GRF9SRUdfQ09SRSwgYmFzZSArIChpICogMHg0KSk7CisJCQlDQU1fREJHKENBTV9GRCwgIlJhd0RhdGFbJWRdIDogMHgleCIsIGksICpidWZmZXIpOworCQkJYnVmZmVyKys7CisJCX0KKwl9CisKKwlzcGluX2xvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisJZmRfY29yZS0+aHdfcmVxX3ByaXZhdGUgPSBOVUxMOworCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9JRExFOworCXNwaW5fdW5sb2NrKCZmZF9jb3JlLT5zcGluX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK2lycXJldHVybl90IGNhbV9mZF9od19pcnEoaW50IGlycV9udW0sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhbV9od19pbmZvICpmZF9odyA9IChzdHJ1Y3QgY2FtX2h3X2luZm8gKilkYXRhOworCXN0cnVjdCBjYW1fZmRfY29yZSAqZmRfY29yZTsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbzsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3N0YXRpY19pbmZvICpod19zdGF0aWNfaW5mbzsKKwl1aW50MzJfdCByZWdfdmFsdWU7CisJZW51bSBjYW1fZmRfaHdfaXJxX3R5cGUgaXJxX3R5cGUgPSBDQU1fRkRfSVJRX0ZSQU1FX0RPTkU7CisJdWludDMyX3QgbnVtX2lycXMgPSAwOworCisJaWYgKCFmZF9odykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgZGF0YSBpbiBJUlEgY2FsbGJhY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmRfY29yZSA9IChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKikgZmRfaHctPmNvcmVfaW5mbzsKKwlzb2NfaW5mbyA9ICZmZF9ody0+c29jX2luZm87CisJaHdfc3RhdGljX2luZm8gPSBmZF9jb3JlLT5od19zdGF0aWNfaW5mbzsKKworCXJlZ192YWx1ZSA9IGNhbV9mZF9zb2NfcmVnaXN0ZXJfcmVhZChzb2NfaW5mbywgQ0FNX0ZEX1JFR19XUkFQUEVSLAorCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLmlycV9zdGF0dXMpOworCisJQ0FNX0RCRyhDQU1fRkQsICJGRCBJUlEgc3RhdHVzIDB4JXgiLCByZWdfdmFsdWUpOworCisJaWYgKHJlZ192YWx1ZSAmIENBTV9GRF9JUlFfVE9fTUFTSyhDQU1fRkRfSVJRX0hBTFRfRE9ORSkpIHsKKwkJY29tcGxldGVfYWxsKCZmZF9jb3JlLT5oYWx0X2NvbXBsZXRlKTsKKwkJaXJxX3R5cGUgPSBDQU1fRkRfSVJRX0hBTFRfRE9ORTsKKwkJbnVtX2lycXMrKzsKKwl9CisKKwlpZiAocmVnX3ZhbHVlICYgQ0FNX0ZEX0lSUV9UT19NQVNLKENBTV9GRF9JUlFfUkVTRVRfRE9ORSkpIHsKKwkJY29tcGxldGVfYWxsKCZmZF9jb3JlLT5yZXNldF9jb21wbGV0ZSk7CisJCWlycV90eXBlID0gQ0FNX0ZEX0lSUV9SRVNFVF9ET05FOworCQludW1faXJxcysrOworCX0KKworCWlmIChyZWdfdmFsdWUgJiBDQU1fRkRfSVJRX1RPX01BU0soQ0FNX0ZEX0lSUV9GUkFNRV9ET05FKSkgeworCQljb21wbGV0ZV9hbGwoJmZkX2NvcmUtPnByb2Nlc3NpbmdfY29tcGxldGUpOworCQlpcnFfdHlwZSA9IENBTV9GRF9JUlFfRlJBTUVfRE9ORTsKKwkJbnVtX2lycXMrKzsKKwl9CisKKwkvKgorCSAqIFdlIHNob3VsZCBuZXZlciBnZXQgYW4gSVJRIGNhbGxiYWNrIHdpdGggbm8gb3IgbW9yZSB0aGFuIG9uZSBtYXNrLgorCSAqIFZhbGlkYXRlIGZpcnN0IHRvIG1ha2Ugc3VyZSBub3RoaW5nIGdvaW5nIHdyb25nLgorCSAqLworCWlmIChudW1faXJxcyAhPSAxKSB7CisJCUNBTV9FUlIoQ0FNX0ZELAorCQkJIkludmFsaWQgbnVtYmVyIG9mIElSUXMsIHZhbHVlPTB4JXgsIG51bV9pcnFzPSVkIiwKKwkJCXJlZ192YWx1ZSwgbnVtX2lycXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0cmFjZV9jYW1faXJxX2FjdGl2YXRlZCgiRkQiLCBpcnFfdHlwZSk7CisKKwljYW1fZmRfc29jX3JlZ2lzdGVyX3dyaXRlKHNvY19pbmZvLCBDQU1fRkRfUkVHX1dSQVBQRVIsCisJCWh3X3N0YXRpY19pbmZvLT53cmFwcGVyX3JlZ3MuaXJxX2NsZWFyLAorCQlod19zdGF0aWNfaW5mby0+aXJxX21hc2spOworCisJaWYgKGlycV90eXBlID09IENBTV9GRF9JUlFfSEFMVF9ET05FKSB7CisJCS8qCisJCSAqIERvIG5vdCBzZW5kIEhBTFQgSVJRIGNhbGxiYWNrIHRvIEh3IE1nciwKKwkJICogYSByZXNldCB3b3VsZCBhbHdheXMgZm9sbG93CisJCSAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl9sb2NrKCZmZF9jb3JlLT5zcGluX2xvY2spOworCS8qIERvIG5vdCBjaGFuZ2Ugc3RhdGUgdG8gSURMRSBvbiBIQUxUIElSUS4gUmVzZXQgbXVzdCBmb2xsb3cgaGFsdCAqLworCWlmICgoaXJxX3R5cGUgPT0gQ0FNX0ZEX0lSUV9SRVNFVF9ET05FKSB8fAorCQkoaXJxX3R5cGUgPT0gQ0FNX0ZEX0lSUV9GUkFNRV9ET05FKSkgeworCisJCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9JRExFOworCQlpZiAoaXJxX3R5cGUgPT0gQ0FNX0ZEX0lSUV9GUkFNRV9ET05FKQorCQkJZmRfY29yZS0+cmVzdWx0c192YWxpZCA9IHRydWU7CisKKwkJQ0FNX0RCRyhDQU1fRkQsICJGRCBJUlEgdHlwZSAlZCwgc3RhdGU9JWQiLAorCQkJaXJxX3R5cGUsIGZkX2NvcmUtPmNvcmVfc3RhdGUpOworCX0KKwlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKworCWlmIChmZF9jb3JlLT5pcnFfY2IuY2FtX2ZkX2h3X21ncl9jYikKKwkJZmRfY29yZS0+aXJxX2NiLmNhbV9mZF9od19tZ3JfY2IoZmRfY29yZS0+aXJxX2NiLmRhdGEsCisJCQlpcnFfdHlwZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBjYW1fZmRfaHdfZ2V0X2h3X2NhcHModm9pZCAqaHdfcHJpdiwgdm9pZCAqZ2V0X2h3X2NhcF9hcmdzLAorCXVpbnQzMl90IGFyZ19zaXplKQoreworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcgPSAoc3RydWN0IGNhbV9od19pbmZvICopaHdfcHJpdjsKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmU7CisJc3RydWN0IGNhbV9mZF9od19jYXBzICpmZF9od19jYXBzID0KKwkJKHN0cnVjdCBjYW1fZmRfaHdfY2FwcyAqKWdldF9od19jYXBfYXJnczsKKworCWlmICghaHdfcHJpdiB8fCAhZ2V0X2h3X2NhcF9hcmdzKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBpbnB1dCBwb2ludGVycyAlcEsgJXBLIiwKKwkJCWh3X3ByaXYsIGdldF9od19jYXBfYXJncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZkX2NvcmUgPSAoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKwkqZmRfaHdfY2FwcyA9IGZkX2NvcmUtPmh3X2NhcHM7CisKKwlDQU1fREJHKENBTV9GRCwgImNvcmU6JWQuJWQgd3JhcHBlcjolZC4lZCBtb2RlOiVkLCByYXc6JWQiLAorCQlmZF9od19jYXBzLT5jb3JlX3ZlcnNpb24ubWFqb3IsCisJCWZkX2h3X2NhcHMtPmNvcmVfdmVyc2lvbi5taW5vciwKKwkJZmRfaHdfY2Fwcy0+d3JhcHBlcl92ZXJzaW9uLm1ham9yLAorCQlmZF9od19jYXBzLT53cmFwcGVyX3ZlcnNpb24ubWlub3IsCisJCWZkX2h3X2NhcHMtPnN1cHBvcnRlZF9tb2RlcywKKwkJZmRfaHdfY2Fwcy0+cmF3X3Jlc3VsdHNfYXZhaWxhYmxlKTsKKworCXJldHVybiAwOworfQorCitpbnQgY2FtX2ZkX2h3X2luaXQodm9pZCAqaHdfcHJpdiwgdm9pZCAqaW5pdF9od19hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSkKK3sKKwlzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3ID0gKHN0cnVjdCBjYW1faHdfaW5mbyAqKWh3X3ByaXY7CisJc3RydWN0IGNhbV9mZF9jb3JlICpmZF9jb3JlOworCXN0cnVjdCBjYW1fZmRfaHdfaW5pdF9hcmdzICppbml0X2FyZ3MgPQorCQkoc3RydWN0IGNhbV9mZF9od19pbml0X2FyZ3MgKilpbml0X2h3X2FyZ3M7CisJaW50IHJjID0gMDsKKworCWlmICghZmRfaHcgfHwgIWluaXRfYXJncykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYXJndW1lbnQgJXBLICVwSyIsIGZkX2h3LCBpbml0X2FyZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfaW5pdF9hcmdzKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYXJnIHNpemUgJWQsICVkIiwgYXJnX3NpemUsCisJCQlzaXplb2Yoc3RydWN0IGNhbV9mZF9od19pbml0X2FyZ3MpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmRfY29yZSA9IChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKilmZF9ody0+Y29yZV9pbmZvOworCisJbXV0ZXhfbG9jaygmZmRfaHctPmh3X211dGV4KTsKKwlDQU1fREJHKENBTV9GRCwgIkZEIEhXIEluaXQgcmVmIGNvdW50IGJlZm9yZSAlZCIsIGZkX2h3LT5vcGVuX2NvdW50KTsKKworCWlmIChmZF9ody0+b3Blbl9jb3VudCA+IDApIHsKKwkJcmMgPSAwOworCQlnb3RvIGNkbV9zdHJlYW1vbjsKKwl9CisKKwlyYyA9IGNhbV9mZF9zb2NfZW5hYmxlX3Jlc291cmNlcygmZmRfaHctPnNvY19pbmZvKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFbmFibGUgU09DIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCWdvdG8gdW5sb2NrX3JldHVybjsKKwl9CisKKwlyYyA9IGNhbV9mZF9od19yZXNldChod19wcml2LCBOVUxMLCAwKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJSZXNldCBGYWlsZWQsIHJjPSVkIiwgcmMpOworCQlnb3RvIGRpc2FibGVfc29jOworCX0KKworCWNhbV9mZF9od191dGlsX2VuYWJsZV9wb3dlcl9vbl9zZXR0aW5ncyhmZF9odyk7CisKKwlmZF9ody0+aHdfc3RhdGUgPSBDQU1fSFdfU1RBVEVfUE9XRVJfVVA7CisJZmRfY29yZS0+Y29yZV9zdGF0ZSA9IENBTV9GRF9DT1JFX1NUQVRFX0lETEU7CisKK2NkbV9zdHJlYW1vbjoKKwlmZF9ody0+b3Blbl9jb3VudCsrOworCUNBTV9EQkcoQ0FNX0ZELCAiRkQgSFcgSW5pdCByZWYgY291bnQgYWZ0ZXIgJWQiLCBmZF9ody0+b3Blbl9jb3VudCk7CisKKwltdXRleF91bmxvY2soJmZkX2h3LT5od19tdXRleCk7CisKKwlpZiAoaW5pdF9hcmdzLT5jdHhfaHdfcHJpdmF0ZSkgeworCQlzdHJ1Y3QgY2FtX2ZkX2N0eF9od19wcml2YXRlICpjdHhfaHdfcHJpdmF0ZSA9CisJCQlpbml0X2FyZ3MtPmN0eF9od19wcml2YXRlOworCisJCXJjID0gY2FtX2NkbV9zdHJlYW1fb24oY3R4X2h3X3ByaXZhdGUtPmNkbV9oYW5kbGUpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiQ0RNIFN0cmVhbU9uIGZhaWwgOmhhbmRsZT0weCV4LCByYz0lZCIsCisJCQkJY3R4X2h3X3ByaXZhdGUtPmNkbV9oYW5kbGUsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiByYzsKKworZGlzYWJsZV9zb2M6CisJaWYgKGNhbV9mZF9zb2NfZGlzYWJsZV9yZXNvdXJjZXMoJmZkX2h3LT5zb2NfaW5mbykpCisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgaW4gZGlzYWJsZSBzb2MgcmVzb3VyY2VzIik7Cit1bmxvY2tfcmV0dXJuOgorCW11dGV4X3VubG9jaygmZmRfaHctPmh3X211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjYW1fZmRfaHdfZGVpbml0KHZvaWQgKmh3X3ByaXYsIHZvaWQgKmRlaW5pdF9od19hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSkKK3sKKwlzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3ID0gaHdfcHJpdjsKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmUgPSBOVUxMOworCXN0cnVjdCBjYW1fZmRfaHdfZGVpbml0X2FyZ3MgKmRlaW5pdF9hcmdzID0KKwkJKHN0cnVjdCBjYW1fZmRfaHdfZGVpbml0X2FyZ3MgKilkZWluaXRfaHdfYXJnczsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFmZF9odyB8fCAhZGVpbml0X2h3X2FyZ3MpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZ3VtZW50Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGNhbV9mZF9od19kZWluaXRfYXJncykpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZyBzaXplICVkLCAlZCIsIGFyZ19zaXplLAorCQkJc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfZGVpbml0X2FyZ3MpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmZmRfaHctPmh3X211dGV4KTsKKwlpZiAoZmRfaHctPm9wZW5fY291bnQgPT0gMCkgeworCQltdXRleF91bmxvY2soJmZkX2h3LT5od19tdXRleCk7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgVW5iYWxhbmNlZCBkZWluaXQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZmRfaHctPm9wZW5fY291bnQtLTsKKwlDQU1fREJHKENBTV9GRCwgIkZEIEhXIHJlZiBjb3VudD0lZCIsIGZkX2h3LT5vcGVuX2NvdW50KTsKKworCWlmIChmZF9ody0+b3Blbl9jb3VudCA+IDApIHsKKwkJcmMgPSAwOworCQlnb3RvIHBvc2l0aXZlX3JlZl9jbnQ7CisJfQorCisJcmMgPSBjYW1fZmRfc29jX2Rpc2FibGVfcmVzb3VyY2VzKCZmZF9ody0+c29jX2luZm8pOworCWlmIChyYykKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gRGlzYWJsZSBTT0MsIHJjPSVkIiwgcmMpOworCisJZmRfaHctPmh3X3N0YXRlID0gQ0FNX0hXX1NUQVRFX1BPV0VSX0RPV047CisJZmRfY29yZSA9IChzdHJ1Y3QgY2FtX2ZkX2NvcmUgKilmZF9ody0+Y29yZV9pbmZvOworCisJLyogV2l0aCB0aGUgcmVmX2NudCBjb3JyZWN0LCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlXQVJOX09OKCFmZF9jb3JlKTsKKworCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9QT1dFUkRPV047CisKK3Bvc2l0aXZlX3JlZl9jbnQ6CisJaWYgKGRlaW5pdF9hcmdzLT5jdHhfaHdfcHJpdmF0ZSkgeworCQlzdHJ1Y3QgY2FtX2ZkX2N0eF9od19wcml2YXRlICpjdHhfaHdfcHJpdmF0ZSA9CisJCQlkZWluaXRfYXJncy0+Y3R4X2h3X3ByaXZhdGU7CisKKwkJcmMgPSBjYW1fY2RtX3N0cmVhbV9vZmYoY3R4X2h3X3ByaXZhdGUtPmNkbV9oYW5kbGUpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELAorCQkJCSJGYWlsZWQgaW4gQ0RNIFN0cmVhbU9mZiwgaGFuZGxlPTB4JXgsIHJjPSVkIiwKKwkJCQljdHhfaHdfcHJpdmF0ZS0+Y2RtX2hhbmRsZSwgcmMpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmZF9ody0+aHdfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworaW50IGNhbV9mZF9od19yZXNldCh2b2lkICpod19wcml2LCB2b2lkICpyZXNldF9jb3JlX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQoreworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcgPSAoc3RydWN0IGNhbV9od19pbmZvICopaHdfcHJpdjsKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmU7CisJaW50IHJjOworCisJaWYgKCFmZF9odykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgaGFuZGxlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZkX2NvcmUgPSAoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKworCXNwaW5fbG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwlpZiAoZmRfY29yZS0+Y29yZV9zdGF0ZSA9PSBDQU1fRkRfQ09SRV9TVEFURV9SRVNFVF9QUk9HUkVTUykgeworCQlDQU1fRVJSKENBTV9GRCwgIlJlc2V0IG5vdCBhbGxvd2VkIGluICVkIHN0YXRlIiwKKwkJCWZkX2NvcmUtPmNvcmVfc3RhdGUpOworCQlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmRfY29yZS0+cmVzdWx0c192YWxpZCA9IGZhbHNlOworCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9SRVNFVF9QUk9HUkVTUzsKKwlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKworCXJjID0gY2FtX2ZkX2h3X3V0aWxfZmR3cmFwcGVyX2hhbHQoZmRfaHcpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBIQUxUIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBjYW1fZmRfaHdfdXRpbF9mZHdyYXBwZXJfc3luY19yZXNldChmZF9odyk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIFJFU0VUIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJc3Bpbl9sb2NrKCZmZF9jb3JlLT5zcGluX2xvY2spOworCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9JRExFOworCXNwaW5fdW5sb2NrKCZmZF9jb3JlLT5zcGluX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2FtX2ZkX2h3X3N0YXJ0KHZvaWQgKmh3X3ByaXYsIHZvaWQgKmh3X3N0YXJ0X2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQoreworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcgPSAoc3RydWN0IGNhbV9od19pbmZvICopaHdfcHJpdjsKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmU7CisJc3RydWN0IGNhbV9mZF9od19zdGF0aWNfaW5mbyAqaHdfc3RhdGljX2luZm87CisJc3RydWN0IGNhbV9mZF9od19jbWRfc3RhcnRfYXJncyAqc3RhcnRfYXJncyA9CisJCShzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zdGFydF9hcmdzICopaHdfc3RhcnRfYXJnczsKKwlzdHJ1Y3QgY2FtX2ZkX2N0eF9od19wcml2YXRlICpjdHhfaHdfcHJpdmF0ZTsKKwlpbnQgcmM7CisKKwlpZiAoIWh3X3ByaXYgfHwgIXN0YXJ0X2FyZ3MpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGlucHV0IGFyZ3MgJXBLICVwSyIsIGh3X3ByaXYsCisJCQlzdGFydF9hcmdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zdGFydF9hcmdzKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgYXJnIHNpemUgJWQsICVkIiwgYXJnX3NpemUsCisJCQlzaXplb2Yoc3RydWN0IGNhbV9mZF9od19jbWRfc3RhcnRfYXJncykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmZF9jb3JlID0gKHN0cnVjdCBjYW1fZmRfY29yZSAqKWZkX2h3LT5jb3JlX2luZm87CisJaHdfc3RhdGljX2luZm8gPSBmZF9jb3JlLT5od19zdGF0aWNfaW5mbzsKKworCXNwaW5fbG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwlpZiAoZmRfY29yZS0+Y29yZV9zdGF0ZSAhPSBDQU1fRkRfQ09SRV9TVEFURV9JRExFKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiQ2Fubm90IHN0YXJ0IGluICVkIHN0YXRlIiwKKwkJCWZkX2NvcmUtPmNvcmVfc3RhdGUpOworCQlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgYWJvdXQgdG8gc3RhcnQgRkQgSFcgcHJvY2Vzc2luZywgc2F2ZSB0aGUgcmVxdWVzdAorCSAqIHByaXZhdGUgZGF0YSB3aGljaCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgSFcuIE9uY2UgdGhlIGZyYW1lCisJICogcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCwgcHJvY2Vzc19jbWQoRlJBTUVfRE9ORSkgc2hvdWxkIGJlIGNhbGxlZAorCSAqIHdpdGggc2FtZSBod19yZXFfcHJpdmF0ZSBhcyBpbnB1dC4KKwkgKi8KKwlmZF9jb3JlLT5od19yZXFfcHJpdmF0ZSA9IHN0YXJ0X2FyZ3MtPmh3X3JlcV9wcml2YXRlOworCWZkX2NvcmUtPmNvcmVfc3RhdGUgPSBDQU1fRkRfQ09SRV9TVEFURV9QUk9DRVNTSU5HOworCWZkX2NvcmUtPnJlc3VsdHNfdmFsaWQgPSBmYWxzZTsKKwlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKworCWN0eF9od19wcml2YXRlID0gc3RhcnRfYXJncy0+Y3R4X2h3X3ByaXZhdGU7CisKKwkvKiBCZWZvcmUgc3RhcnRpbmcgSFcgcHJvY2VzcywgY2xlYXIgcHJvY2Vzc2luZyBjb21wbGV0ZSAqLworCXJlaW5pdF9jb21wbGV0aW9uKCZmZF9jb3JlLT5wcm9jZXNzaW5nX2NvbXBsZXRlKTsKKworCWlmIChod19zdGF0aWNfaW5mby0+ZW5hYmxlX2VycmF0YV93YS5zaW5nbGVfaXJxX29ubHkpIHsKKwkJY2FtX2ZkX3NvY19yZWdpc3Rlcl93cml0ZSgmZmRfaHctPnNvY19pbmZvLCBDQU1fRkRfUkVHX1dSQVBQRVIsCisJCQlod19zdGF0aWNfaW5mby0+d3JhcHBlcl9yZWdzLmlycV9tYXNrLAorCQkJQ0FNX0ZEX0lSUV9UT19NQVNLKENBTV9GRF9JUlFfRlJBTUVfRE9ORSkpOworCX0KKworCWlmIChzdGFydF9hcmdzLT5udW1faHdfdXBkYXRlX2VudHJpZXMgPiAwKSB7CisJCXN0cnVjdCBjYW1fY2RtX2JsX3JlcXVlc3QgKmNkbV9jbWQgPSBjdHhfaHdfcHJpdmF0ZS0+Y2RtX2NtZDsKKwkJc3RydWN0IGNhbV9od191cGRhdGVfZW50cnkgKmNtZDsKKwkJaW50IGk7CisKKwkJY2RtX2NtZC0+Y21kX2FycmFyeV9jb3VudCA9IHN0YXJ0X2FyZ3MtPm51bV9od191cGRhdGVfZW50cmllczsKKwkJY2RtX2NtZC0+dHlwZSA9IENBTV9DRE1fQkxfQ01EX1RZUEVfTUVNX0hBTkRMRTsKKwkJY2RtX2NtZC0+ZmxhZyA9IGZhbHNlOworCQljZG1fY21kLT51c2VyZGF0YSA9IE5VTEw7CisJCWNkbV9jbWQtPmNvb2tpZSA9IDA7CisKKwkJZm9yIChpID0gMCA7IGkgPD0gc3RhcnRfYXJncy0+bnVtX2h3X3VwZGF0ZV9lbnRyaWVzOyBpKyspIHsKKwkJCWNtZCA9IChzdGFydF9hcmdzLT5od191cGRhdGVfZW50cmllcyArIGkpOworCQkJY2RtX2NtZC0+Y21kW2ldLmJsX2FkZHIubWVtX2hhbmRsZSA9IGNtZC0+aGFuZGxlOworCQkJY2RtX2NtZC0+Y21kW2ldLm9mZnNldCA9IGNtZC0+b2Zmc2V0OworCQkJY2RtX2NtZC0+Y21kW2ldLmxlbiA9IGNtZC0+bGVuOworCQl9CisKKwkJcmMgPSBjYW1fY2RtX3N1Ym1pdF9ibHMoY3R4X2h3X3ByaXZhdGUtPmNkbV9oYW5kbGUsIGNkbV9jbWQpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELAorCQkJCSJGYWlsZWQgdG8gc3VibWl0IGNkbSBjb21tYW5kcywgcmM9JWQiLCByYyk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIG51bWJlciBvZiBodyB1cGRhdGUgZW50cmllcyIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CitlcnJvcjoKKwlzcGluX2xvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisJZmRfY29yZS0+Y29yZV9zdGF0ZSA9IENBTV9GRF9DT1JFX1NUQVRFX0lETEU7CisJc3Bpbl91bmxvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjYW1fZmRfaHdfaGFsdF9yZXNldCh2b2lkICpod19wcml2LCB2b2lkICpzdG9wX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQoreworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcgPSAoc3RydWN0IGNhbV9od19pbmZvICopaHdfcHJpdjsKKwlzdHJ1Y3QgY2FtX2ZkX2NvcmUgKmZkX2NvcmU7CisJaW50IHJjOworCisJaWYgKCFmZF9odykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgaGFuZGxlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZkX2NvcmUgPSAoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKworCXNwaW5fbG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwlpZiAoKGZkX2NvcmUtPmNvcmVfc3RhdGUgPT0gQ0FNX0ZEX0NPUkVfU1RBVEVfUE9XRVJET1dOKSB8fAorCQkoZmRfY29yZS0+Y29yZV9zdGF0ZSA9PSBDQU1fRkRfQ09SRV9TVEFURV9SRVNFVF9QUk9HUkVTUykpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJSZXNldCBub3QgYWxsb3dlZCBpbiAlZCBzdGF0ZSIsCisJCQlmZF9jb3JlLT5jb3JlX3N0YXRlKTsKKwkJc3Bpbl91bmxvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZkX2NvcmUtPnJlc3VsdHNfdmFsaWQgPSBmYWxzZTsKKwlmZF9jb3JlLT5jb3JlX3N0YXRlID0gQ0FNX0ZEX0NPUkVfU1RBVEVfUkVTRVRfUFJPR1JFU1M7CisJc3Bpbl91bmxvY2soJmZkX2NvcmUtPnNwaW5fbG9jayk7CisKKwlyYyA9IGNhbV9mZF9od191dGlsX2Zkd3JhcHBlcl9oYWx0KGZkX2h3KTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgaW4gSEFMVCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEhBTFQgbXVzdCBiZSBmb2xsb3dlZCBieSBSRVNFVCAqLworCXJjID0gY2FtX2ZkX2h3X3V0aWxfZmR3cmFwcGVyX3N5bmNfcmVzZXQoZmRfaHcpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBSRVNFVCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNwaW5fbG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKwlmZF9jb3JlLT5jb3JlX3N0YXRlID0gQ0FNX0ZEX0NPUkVfU1RBVEVfSURMRTsKKwlzcGluX3VubG9jaygmZmRfY29yZS0+c3Bpbl9sb2NrKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNhbV9mZF9od19yZXNlcnZlKHZvaWQgKmh3X3ByaXYsIHZvaWQgKmh3X3Jlc2VydmVfYXJncywgdWludDMyX3QgYXJnX3NpemUpCit7CisJc3RydWN0IGNhbV9od19pbmZvICpmZF9odyA9IChzdHJ1Y3QgY2FtX2h3X2luZm8gKilod19wcml2OworCWludCByYyA9IC1FSU5WQUw7CisJc3RydWN0IGNhbV9mZF9jdHhfaHdfcHJpdmF0ZSAqY3R4X2h3X3ByaXZhdGU7CisJc3RydWN0IGNhbV9mZF9od19yZXNlcnZlX2FyZ3MgKnJlc2VydmVfYXJncyA9CisJCShzdHJ1Y3QgY2FtX2ZkX2h3X3Jlc2VydmVfYXJncyAqKWh3X3Jlc2VydmVfYXJnczsKKwlzdHJ1Y3QgY2FtX2NkbV9hY3F1aXJlX2RhdGEgY2RtX2FjcXVpcmU7CisJc3RydWN0IGNhbV9jZG1fYmxfcmVxdWVzdCAqY2RtX2NtZDsKKwlpbnQgaTsKKworCWlmICghZmRfaHcgfHwgIXJlc2VydmVfYXJncykgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgaW5wdXQgJXBLLCAlcEsiLCBmZF9odywgcmVzZXJ2ZV9hcmdzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgY2FtX2ZkX2h3X3Jlc2VydmVfYXJncykpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZyBzaXplICVkLCAlZCIsIGFyZ19zaXplLAorCQkJc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfcmVzZXJ2ZV9hcmdzKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNkbV9jbWQgPSBremFsbG9jKCgoc2l6ZW9mKHN0cnVjdCBjYW1fY2RtX2JsX3JlcXVlc3QpKSArCisJCQkoKENBTV9GRF9NQVhfSFdfRU5UUklFUyAtIDEpICoKKwkJCXNpemVvZihzdHJ1Y3QgY2FtX2NkbV9ibF9jbWQpKSksIEdGUF9LRVJORUwpOworCWlmICghY2RtX2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHhfaHdfcHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fZmRfY3R4X2h3X3ByaXZhdGUpLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eF9od19wcml2YXRlKSB7CisJCWtmcmVlKGNkbV9jbWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoJmNkbV9hY3F1aXJlLCAwLCBzaXplb2YoY2RtX2FjcXVpcmUpKTsKKwlzdHJsY3B5KGNkbV9hY3F1aXJlLmlkZW50aWZpZXIsICJmZCIsIHNpemVvZigiZmQiKSk7CisJY2RtX2FjcXVpcmUuY2VsbF9pbmRleCA9IGZkX2h3LT5zb2NfaW5mby5pbmRleDsKKwljZG1fYWNxdWlyZS5oYW5kbGUgPSAwOworCWNkbV9hY3F1aXJlLnVzZXJkYXRhID0gY3R4X2h3X3ByaXZhdGU7CisJY2RtX2FjcXVpcmUuY2FtX2NkbV9jYWxsYmFjayA9IGNhbV9mZF9od191dGlsX2NkbV9jYWxsYmFjazsKKwljZG1fYWNxdWlyZS5pZCA9IENBTV9DRE1fVklSVFVBTDsKKwljZG1fYWNxdWlyZS5iYXNlX2FycmF5X2NudCA9IGZkX2h3LT5zb2NfaW5mby5udW1fcmVnX21hcDsKKwlmb3IgKGkgPSAwOyBpIDwgZmRfaHctPnNvY19pbmZvLm51bV9yZWdfbWFwOyBpKyspCisJCWNkbV9hY3F1aXJlLmJhc2VfYXJyYXlbaV0gPSAmZmRfaHctPnNvY19pbmZvLnJlZ19tYXBbaV07CisKKwlyYyA9IGNhbV9jZG1fYWNxdWlyZSgmY2RtX2FjcXVpcmUpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCB0byBhY3F1aXJlIHRoZSBDRE0gSFciKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwljdHhfaHdfcHJpdmF0ZS0+aHdfY3R4ID0gcmVzZXJ2ZV9hcmdzLT5od19jdHg7CisJY3R4X2h3X3ByaXZhdGUtPmZkX2h3ID0gZmRfaHc7CisJY3R4X2h3X3ByaXZhdGUtPm1vZGUgPSByZXNlcnZlX2FyZ3MtPm1vZGU7CisJY3R4X2h3X3ByaXZhdGUtPmNkbV9oYW5kbGUgPSBjZG1fYWNxdWlyZS5oYW5kbGU7CisJY3R4X2h3X3ByaXZhdGUtPmNkbV9vcHMgPSBjZG1fYWNxdWlyZS5vcHM7CisJY3R4X2h3X3ByaXZhdGUtPmNkbV9jbWQgPSBjZG1fY21kOworCisJcmVzZXJ2ZV9hcmdzLT5jdHhfaHdfcHJpdmF0ZSA9IGN0eF9od19wcml2YXRlOworCisJQ0FNX0RCRyhDQU1fRkQsICJwcml2YXRlPSVwSywgaHdfY3R4PSVwSywgbW9kZT0lZCwgY2RtX2hhbmRsZT0weCV4IiwKKwkJY3R4X2h3X3ByaXZhdGUsIGN0eF9od19wcml2YXRlLT5od19jdHgsIGN0eF9od19wcml2YXRlLT5tb2RlLAorCQljdHhfaHdfcHJpdmF0ZS0+Y2RtX2hhbmRsZSk7CisKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWtmcmVlKGN0eF9od19wcml2YXRlKTsKKwlrZnJlZShjZG1fY21kKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjYW1fZmRfaHdfcmVsZWFzZSh2b2lkICpod19wcml2LCB2b2lkICpod19yZWxlYXNlX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQoreworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHcgPSAoc3RydWN0IGNhbV9od19pbmZvICopaHdfcHJpdjsKKwlpbnQgcmMgPSAtRUlOVkFMOworCXN0cnVjdCBjYW1fZmRfY3R4X2h3X3ByaXZhdGUgKmN0eF9od19wcml2YXRlOworCXN0cnVjdCBjYW1fZmRfaHdfcmVsZWFzZV9hcmdzICpyZWxlYXNlX2FyZ3MgPQorCQkoc3RydWN0IGNhbV9mZF9od19yZWxlYXNlX2FyZ3MgKilod19yZWxlYXNlX2FyZ3M7CisKKwlpZiAoIWZkX2h3IHx8ICFyZWxlYXNlX2FyZ3MpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGlucHV0ICVwSywgJXBLIiwgZmRfaHcsIHJlbGVhc2VfYXJncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhcmdfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGNhbV9mZF9od19yZWxlYXNlX2FyZ3MpKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBhcmcgc2l6ZSAlZCwgJWQiLCBhcmdfc2l6ZSwKKwkJCXNpemVvZihzdHJ1Y3QgY2FtX2ZkX2h3X3JlbGVhc2VfYXJncykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHhfaHdfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgY2FtX2ZkX2N0eF9od19wcml2YXRlICopcmVsZWFzZV9hcmdzLT5jdHhfaHdfcHJpdmF0ZTsKKworCXJjID0gY2FtX2NkbV9yZWxlYXNlKGN0eF9od19wcml2YXRlLT5jZG1faGFuZGxlKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0ZELCAiUmVsZWFzZSBjZG0gaGFuZGxlIGZhaWxlZCwgaGFuZGxlPTB4JXgsIHJjPSVkIiwKKwkJCWN0eF9od19wcml2YXRlLT5jZG1faGFuZGxlLCByYyk7CisKKwlrZnJlZShjdHhfaHdfcHJpdmF0ZSk7CisJcmVsZWFzZV9hcmdzLT5jdHhfaHdfcHJpdmF0ZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNhbV9mZF9od19wcm9jZXNzX2NtZCh2b2lkICpod19wcml2LCB1aW50MzJfdCBjbWRfdHlwZSwKKwl2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpCit7CisJc3RydWN0IGNhbV9od19pbmZvICpmZF9odyA9IChzdHJ1Y3QgY2FtX2h3X2luZm8gKilod19wcml2OworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoIWh3X3ByaXYgfHwgIWNtZF9hcmdzIHx8CisJCShjbWRfdHlwZSA+PSBDQU1fRkRfSFdfQ01EX01BWCkpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGFyZ3VtZW50cyAlcEsgJXBLICVkIiwgaHdfcHJpdiwKKwkJCWNtZF9hcmdzLCBjbWRfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY21kX3R5cGUpIHsKKwljYXNlIENBTV9GRF9IV19DTURfUkVHSVNURVJfQ0FMTEJBQ0s6IHsKKwkJc3RydWN0IGNhbV9mZF9od19jbWRfc2V0X2lycV9jYiAqaXJxX2NiX2FyZ3M7CisJCXN0cnVjdCBjYW1fZmRfY29yZSAqZmRfY29yZSA9CisJCQkoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKworCQlpZiAoc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfY21kX3NldF9pcnFfY2IpICE9IGFyZ19zaXplKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgImNtZF90eXBlICVkLCBzaXplIG1pc21hdGNoICVkIiwKKwkJCQljbWRfdHlwZSwgYXJnX3NpemUpOworCQkJYnJlYWs7CisJCX0KKworCQlpcnFfY2JfYXJncyA9IChzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zZXRfaXJxX2NiICopY21kX2FyZ3M7CisJCWZkX2NvcmUtPmlycV9jYi5jYW1fZmRfaHdfbWdyX2NiID0KKwkJCWlycV9jYl9hcmdzLT5jYW1fZmRfaHdfbWdyX2NiOworCQlmZF9jb3JlLT5pcnFfY2IuZGF0YSA9IGlycV9jYl9hcmdzLT5kYXRhOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKwljYXNlIENBTV9GRF9IV19DTURfUFJFU1RBUlQ6IHsKKwkJc3RydWN0IGNhbV9mZF9od19jbWRfcHJlc3RhcnRfYXJncyAqcHJlc3RhcnRfYXJnczsKKworCQlpZiAoc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfY21kX3ByZXN0YXJ0X2FyZ3MpICE9IGFyZ19zaXplKSB7CisJCQlDQU1fRVJSKENBTV9GRCwgImNtZF90eXBlICVkLCBzaXplIG1pc21hdGNoICVkIiwKKwkJCQljbWRfdHlwZSwgYXJnX3NpemUpOworCQkJYnJlYWs7CisJCX0KKworCQlwcmVzdGFydF9hcmdzID0gKHN0cnVjdCBjYW1fZmRfaHdfY21kX3ByZXN0YXJ0X2FyZ3MgKiljbWRfYXJnczsKKwkJcmMgPSBjYW1fZmRfaHdfdXRpbF9wcm9jZXNzY21kX3ByZXN0YXJ0KGZkX2h3LCBwcmVzdGFydF9hcmdzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQ0FNX0ZEX0hXX0NNRF9GUkFNRV9ET05FOiB7CisJCXN0cnVjdCBjYW1fZmRfaHdfZnJhbWVfZG9uZV9hcmdzICpjbWRfZnJhbWVfcmVzdWx0czsKKworCQlpZiAoc2l6ZW9mKHN0cnVjdCBjYW1fZmRfaHdfZnJhbWVfZG9uZV9hcmdzKSAhPQorCQkJYXJnX3NpemUpIHsKKwkJCUNBTV9FUlIoQ0FNX0ZELCAiY21kX3R5cGUgJWQsIHNpemUgbWlzbWF0Y2ggJWQiLAorCQkJCWNtZF90eXBlLCBhcmdfc2l6ZSk7CisJCQlicmVhazsKKwkJfQorCisJCWNtZF9mcmFtZV9yZXN1bHRzID0KKwkJCShzdHJ1Y3QgY2FtX2ZkX2h3X2ZyYW1lX2RvbmVfYXJncyAqKWNtZF9hcmdzOworCQlyYyA9IGNhbV9mZF9od191dGlsX3Byb2Nlc3NjbWRfZnJhbWVfZG9uZShmZF9odywKKwkJCWNtZF9mcmFtZV9yZXN1bHRzKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19jb3JlLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZDcyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfY29yZS5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0FNX0ZEX0hXX0NPUkVfSF8KKyNkZWZpbmUgX0NBTV9GRF9IV19DT1JFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bWVkaWEvY2FtX2RlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9jYW1fZmQuaD4KKworI2luY2x1ZGUgImNhbV9jb21tb25fdXRpbC5oIgorI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCisjaW5jbHVkZSAiY2FtX2lvX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1fY3Bhc19hcGkuaCIKKyNpbmNsdWRlICJjYW1fY2RtX2ludGZfYXBpLmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X2ludGYuaCIKKyNpbmNsdWRlICJjYW1fZmRfaHdfc29jLmgiCisKKyNkZWZpbmUgQ0FNX0ZEX0lSUV9UT19NQVNLKGlycSkgICAgICAgICgxIDw8IChpcnEpKQorI2RlZmluZSBDQU1fRkRfTUFTS19UT19JUlEobWFzaywgaXJxKSAgKChtYXNrKSA+PiAoaXJxKSkKKworI2RlZmluZSBDQU1fRkRfSFdfSEFMVF9SRVNFVF9USU1FT1VUICAgMTAwCisKKy8qKgorICogZW51bSBjYW1fZmRfY29yZV9zdGF0ZSAtIEZEIENvcmUgaW50ZXJuYWwgc3RhdGVzCisgKgorICogQENBTV9GRF9DT1JFX1NUQVRFX1BPV0VSRE9XTiAgICAgICA6IEluZGljYXRlcyBGRCBjb3JlIGlzIHBvd2VyZWQgZG93bgorICogQENBTV9GRF9DT1JFX1NUQVRFX0lETEUgICAgICAgICAgICA6IEluZGljYXRlcyBGRCBIVyBpcyBpbiBpZGxlIHN0YXRlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUgY2FuIGJlIGluIHRoaXMgc3RhdGUgd2hlbiBpdCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5IHRvIHByb2Nlc3MgZnJhbWVzIG9yIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkIGFuZCByZXN1bHRzIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICogQENBTV9GRF9DT1JFX1NUQVRFX1BST0NFU1NJTkcgICAgICA6IEluZGljYXRlcyBGRCBjb3JlIGlzIHByb2Nlc3NpbmcgZnJhbWUKKyAqIEBDQU1fRkRfQ09SRV9TVEFURV9SRUFESU5HX1JFU1VMVFMgOiBJbmRpY2F0ZXMgcmVzdWx0cyBhcmUgYmVpbmcgcmVhZCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkQgY29yZQorICogQENBTV9GRF9DT1JFX1NUQVRFX1JFU0VUX1BST0dSRVNTICA6ICBJbmRpY2F0ZXMgRkQgQ29yZSBpcyBpbiByZXNldCBzdGF0ZQorICovCitlbnVtIGNhbV9mZF9jb3JlX3N0YXRlIHsKKwlDQU1fRkRfQ09SRV9TVEFURV9QT1dFUkRPV04sCisJQ0FNX0ZEX0NPUkVfU1RBVEVfSURMRSwKKwlDQU1fRkRfQ09SRV9TVEFURV9QUk9DRVNTSU5HLAorCUNBTV9GRF9DT1JFX1NUQVRFX1JFQURJTkdfUkVTVUxUUywKKwlDQU1fRkRfQ09SRV9TVEFURV9SRVNFVF9QUk9HUkVTUywKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9jdHhfaHdfcHJpdmF0ZSA6IEhXIHByaXZhdGUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgaHcgY3R4LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgcG9wdWxhdGVkIGJ5IEhXIGxheWVyIG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZSgpIGFuZCBnaXZlbiBiYWNrIHRvIEhXIE1nciBhcyBwcml2YXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmb3IgdGhlIGh3IGNvbnRleHQuIFRoaXMgcHJpdmF0ZV9kYXRhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIHRvIGJlIHBhc3NlZCBieSBIVyBNZ3IgbGF5ZXIgd2hpbGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXJ0aGVyIEhXIGxheWVyIGNhbGxzCisgKgorICogQGh3X2N0eCAgICAgICAgICAgOiBDb3JyZXNwb25kaW5nIGh3X2N0eCBwb2ludGVyCisgKiBAZmRfaHcgICAgICAgICAgICA6IEZEIEhXIGluZm8gcG9pbnRlcgorICogQGNkbV9oYW5kbGUgICAgICAgOiBDRE0gSGFuZGxlIGZvciB0aGlzIGNvbnRleHQKKyAqIEBjZG1fb3BzICAgICAgICAgIDogQ0RNIE9wcworICogQGNkbV9jbWQgICAgICAgICAgOiBDRE0gY29tbWFuZCBwb2ludGVyCisgKiBAbW9kZSAgICAgICAgICAgICA6IE1vZGUgdGhpcyBjb250ZXh0IGlzIHJ1bm5pbmcKKyAqIEBjdXJyX3JlcV9wcml2YXRlIDogQ3VycmVudCBSZXF1ZXN0IGluZm9ybWF0aW9uCisgKgorICovCitzdHJ1Y3QgY2FtX2ZkX2N0eF9od19wcml2YXRlIHsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqaHdfY3R4OworCXN0cnVjdCBjYW1faHdfaW5mbyAgICAgICAgICAgICpmZF9odzsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgY2RtX2hhbmRsZTsKKwlzdHJ1Y3QgY2FtX2NkbV91dGlsc19vcHMgICAgICAqY2RtX29wczsKKwlzdHJ1Y3QgY2FtX2NkbV9ibF9yZXF1ZXN0ICAgICAqY2RtX2NtZDsKKwllbnVtIGNhbV9mZF9od19tb2RlICAgICAgICAgICAgbW9kZTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlICAqY3Vycl9yZXFfcHJpdmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9jb3JlX3JlZ3MgOiBGRCBIVyBDb3JlIHJlZ2lzdGVyIG9mZnNldHMgaW5mbworICoKKyAqIEB2ZXJzaW9uICAgICAgICAgICAgICA6IE9mZnNldCBvZiB2ZXJzaW9uIHJlZ2lzdGVyCisgKiBAY29udHJvbCAgICAgICAgICAgICAgOiBPZmZzZXQgb2YgY29udHJvbCByZWdpc3RlcgorICogQHJlc3VsdF9jbnQgICAgICAgICAgIDogT2Zmc2V0IG9mIHJlc3VsdCBjb3VudCByZWdpc3RlcgorICogQHJlc3VsdF9hZGRyICAgICAgICAgIDogT2Zmc2V0IG9mIHJlc3VsdHMgYWRkcmVzcyByZWdpc3RlcgorICogQGltYWdlX2FkZHIgICAgICAgICAgIDogT2Zmc2V0IG9mIGltYWdlIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIEB3b3JrX2FkZHIgICAgICAgICAgICA6IE9mZnNldCBvZiB3b3JrIGFkZHJlc3MgcmVnaXN0ZXIKKyAqIEByb19tb2RlICAgICAgICAgICAgICA6IE9mZnNldCBvZiByb19tb2RlIHJlZ2lzdGVyCisgKiBAcmVzdWx0c19yZWdfYmFzZSAgICAgOiBPZmZzZXQgb2YgcmVzdWx0c19yZWdfYmFzZSByZWdpc3RlcgorICogQHJhd19yZXN1bHRzX3JlZ19iYXNlIDogT2Zmc2V0IG9mIHJhd19yZXN1bHRzX3JlZ19iYXNlIHJlZ2lzdGVyCisgKgorICovCitzdHJ1Y3QgY2FtX2ZkX2NvcmVfcmVncyB7CisJdWludDMyX3QgICAgICAgdmVyc2lvbjsKKwl1aW50MzJfdCAgICAgICBjb250cm9sOworCXVpbnQzMl90ICAgICAgIHJlc3VsdF9jbnQ7CisJdWludDMyX3QgICAgICAgcmVzdWx0X2FkZHI7CisJdWludDMyX3QgICAgICAgaW1hZ2VfYWRkcjsKKwl1aW50MzJfdCAgICAgICB3b3JrX2FkZHI7CisJdWludDMyX3QgICAgICAgcm9fbW9kZTsKKwl1aW50MzJfdCAgICAgICByZXN1bHRzX3JlZ19iYXNlOworCXVpbnQzMl90ICAgICAgIHJhd19yZXN1bHRzX3JlZ19iYXNlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2NvcmVfcmVncyA6IEZEIEhXIFdyYXBwZXIgcmVnaXN0ZXIgb2Zmc2V0cyBpbmZvCisgKgorICogQHdyYXBwZXJfdmVyc2lvbiAgICAgOiBPZmZzZXQgb2Ygd3JhcHBlcl92ZXJzaW9uIHJlZ2lzdGVyCisgKiBAY2djX2Rpc2FibGUgICAgICAgICA6IE9mZnNldCBvZiBjZ2NfZGlzYWJsZSByZWdpc3RlcgorICogQGh3X3N0b3AgICAgICAgICAgICAgOiBPZmZzZXQgb2YgaHdfc3RvcCByZWdpc3RlcgorICogQHN3X3Jlc2V0ICAgICAgICAgICAgOiBPZmZzZXQgb2Ygc3dfcmVzZXQgcmVnaXN0ZXIKKyAqIEB2YmlmX3JlcV9wcmlvcml0eSAgIDogT2Zmc2V0IG9mIHZiaWZfcmVxX3ByaW9yaXR5IHJlZ2lzdGVyCisgKiBAdmJpZl9wcmlvcml0eV9sZXZlbCA6IE9mZnNldCBvZiB2YmlmX3ByaW9yaXR5X2xldmVsIHJlZ2lzdGVyCisgKiBAdmJpZl9kb25lX3N0YXR1cyAgICA6IE9mZnNldCBvZiB2YmlmX2RvbmVfc3RhdHVzIHJlZ2lzdGVyCisgKiBAaXJxX21hc2sgICAgICAgICAgICA6IE9mZnNldCBvZiBpcnEgbWFzayByZWdpc3RlcgorICogQGlycV9zdGF0dXMgICAgICAgICAgOiBPZmZzZXQgb2YgaXJxIHN0YXR1cyByZWdpc3RlcgorICogQGlycV9jbGVhciAgICAgICAgICAgOiBPZmZzZXQgb2YgaXJxIGNsZWFyIHJlZ2lzdGVyCisgKgorICovCitzdHJ1Y3QgY2FtX2ZkX3dyYXBwZXJfcmVncyB7CisJdWludDMyX3QgICAgICAgd3JhcHBlcl92ZXJzaW9uOworCXVpbnQzMl90ICAgICAgIGNnY19kaXNhYmxlOworCXVpbnQzMl90ICAgICAgIGh3X3N0b3A7CisJdWludDMyX3QgICAgICAgc3dfcmVzZXQ7CisJdWludDMyX3QgICAgICAgdmJpZl9yZXFfcHJpb3JpdHk7CisJdWludDMyX3QgICAgICAgdmJpZl9wcmlvcml0eV9sZXZlbDsKKwl1aW50MzJfdCAgICAgICB2YmlmX2RvbmVfc3RhdHVzOworCXVpbnQzMl90ICAgICAgIGlycV9tYXNrOworCXVpbnQzMl90ICAgICAgIGlycV9zdGF0dXM7CisJdWludDMyX3QgICAgICAgaXJxX2NsZWFyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X2VycmF0YV93YSA6IEZEIEhXIEVycmF0YSB3b3JrYXJvdW5kIGVuYWJsZS9kc2lhYmxlIGluZm8KKyAqCisgKiBAc2luZ2xlX2lycV9vbmx5ICAgICAgICAgOiBXaGV0aGVyIHRvIGVuYWJsZSBvbmx5IG9uZSBpcnEgYXQgYW55IHRpbWUKKyAqIEByb19tb2RlX2VuYWJsZV9hbHdheXMgICA6IFdoZXRoZXIgdG8gZW5hYmxlIHJvIG1vZGUgYWx3YXlzCisgKiBAcm9fbW9kZV9yZXN1bHRzX2ludmFsaWQgOiBXaGV0aGVyIHJlc3VsdHMgd3JpdHRlbiBkaXJlY3RseSBpbnRvIG91dHB1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGJ5IEhXIGFyZSB2YWxpZCBvciBub3QKKyAqLworc3RydWN0IGNhbV9mZF9od19lcnJhdGFfd2EgeworCWJvb2wgICBzaW5nbGVfaXJxX29ubHk7CisJYm9vbCAgIHJvX21vZGVfZW5hYmxlX2Fsd2F5czsKKwlib29sICAgcm9fbW9kZV9yZXN1bHRzX2ludmFsaWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfcmVzdWx0c19wcm9wIDogRkQgSFcgUmVzdWx0cyBwcm9wZXJ0aWVzCisgKgorICogQG1heF9mYWNlcyAgICAgICAgICAgICA6IE1heGltdW0gbnVtYmVyIG9mIGZhY2VzIHN1cHBvcnRlZAorICogQHBlcl9mYWNlX2VudHJpZXMgICAgICA6IE51bWJlciBvZiByZWdpc3RlciB3aXRoIHByb3BlcnRpZXMgZm9yIGVhY2ggZmFjZQorICogQHJhd19yZXN1bHRzX2VudHJpZXMgICA6IE51bWJlciBvZiByYXcgcmVzdWx0cyBlbnRyaWVzIGZvciB0aGUgZnVsbCBzZWFyY2gKKyAqIEByYXdfcmVzdWx0c19hdmFpbGFibGUgOiBXaGV0aGVyIHJhdyByZXN1bHRzIGF2YWlsYWJsZSBvbiB0aGlzIEhXCisgKgorICovCitzdHJ1Y3QgY2FtX2ZkX2h3X3Jlc3VsdHNfcHJvcCB7CisJdWludDMyX3QgICAgICAgbWF4X2ZhY2VzOworCXVpbnQzMl90ICAgICAgIHBlcl9mYWNlX2VudHJpZXM7CisJdWludDMyX3QgICAgICAgcmF3X3Jlc3VsdHNfZW50cmllczsKKwlib29sICAgICAgICAgICByYXdfcmVzdWx0c19hdmFpbGFibGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gOiBGRCBIVyBpbmZvcm1hdGlvbiBiYXNlZCBvbiBIVyB2ZXJzaW9uCisgKgorICogQGNvcmVfdmVyc2lvbiAgICAgICA6IENvcmUgdmVyc2lvbiBvZiBGRCBIVworICogQHdyYXBwZXJfdmVyc2lvbiAgICA6IFdyYXBwZXIgdmVyc2lvbiBvZiBGRCBIVworICogQGNvcmVfcmVncyAgICAgICAgICA6IFJlZ2lzdGVyIG9mZnNldCBpbmZvcm1hdGlvbiBmb3IgY29yZSByZWdpc3RlcnMKKyAqIEB3cmFwcGVyX3JlZ3MgICAgICAgOiBSZWdpc3RlciBvZmZzZXQgaW5mb3JtYXRpb24gZm9yIHdyYXBwZXIgcmVnaXN0ZXJzCisgKiBAcmVzdWx0cyAgICAgICAgICAgIDogSW5mb3JtYXRpb24gYWJvdXQgcmVzdWx0cyBhdmFpbGFibGUgb24gdGhpcyBIVworICogQGVuYWJsZV9lcnJhdGFfd2EgICA6IEVycmF0YSB3b3JrYXJvdW5kIGluZm9ybWF0aW9uCisgKiBAaXJxX21hc2sgICAgICAgICAgIDogSVJRIG1hc2sgdG8gZW5hYmxlCisgKiBAcW9zX3ByaW9yaXR5ICAgICAgIDogUW9TIHByaW9yaXR5IHNldHRpbmcgZm9yIHRoaXMgY2hpcHNldAorICogQHFvc19wcmlvcml0eV9sZXZlbCA6IFFvUyBwcmlvcml0eSBsZXZlbCBzZXR0aW5nIGZvciB0aGlzIGNoaXBzZXQKKyAqIEBzdXBwb3J0ZWRfbW9kZXMgICAgOiBTdXBwb3J0ZWQgSFcgbW9kZXMgb24gdGhpcyBIVyB2ZXJzaW9uCisgKiBAcm9fbW9kZV9zdXBwb3J0ZWQgIDogV2hldGhlciBSTyBtb2RlIGlzIHN1cHBvcnRlZCBvbiB0aGlzIEhXCisgKgorICovCitzdHJ1Y3QgY2FtX2ZkX2h3X3N0YXRpY19pbmZvIHsKKwlzdHJ1Y3QgY2FtX2h3X3ZlcnNpb24gICAgICAgICAgY29yZV92ZXJzaW9uOworCXN0cnVjdCBjYW1faHdfdmVyc2lvbiAgICAgICAgICB3cmFwcGVyX3ZlcnNpb247CisJc3RydWN0IGNhbV9mZF9jb3JlX3JlZ3MgICAgICAgIGNvcmVfcmVnczsKKwlzdHJ1Y3QgY2FtX2ZkX3dyYXBwZXJfcmVncyAgICAgd3JhcHBlcl9yZWdzOworCXN0cnVjdCBjYW1fZmRfaHdfcmVzdWx0c19wcm9wICByZXN1bHRzOworCXN0cnVjdCBjYW1fZmRfaHdfZXJyYXRhX3dhICAgICBlbmFibGVfZXJyYXRhX3dhOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBpcnFfbWFzazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgcW9zX3ByaW9yaXR5OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBxb3NfcHJpb3JpdHlfbGV2ZWw7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9tb2RlczsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9fbW9kZV9zdXBwb3J0ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfY29yZSA6IEZEIEhXIGNvcmUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBAaHdfc3RhdGljX2luZm8gICAgICA6IEhXIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHZlcnNpb24KKyAqIEBod19jYXBzICAgICAgICAgICAgIDogSFcgY2FwYWJpbGl0aWVzCisgKiBAY29yZV9zdGF0ZSAgICAgICAgICA6IEN1cnJlbnQgSFcgc3RhdGUKKyAqIEBwcm9jZXNzaW5nX2NvbXBsZXRlIDogV2hldGhlciBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlCisgKiBAcmVzZXRfY29tcGxldGUgICAgICA6IFdoZXRoZXIgcmVzZXQgaXMgY29tcGxldGUKKyAqIEBoYWx0X2NvbXBsZXRlICAgICAgIDogV2hldGhlciBoYWx0IGlzIGNvbXBsZXRlCisgKiBAaHdfcmVxX3ByaXZhdGUgICAgICA6IFJlcXVlc3QgdGhhdCBpcyBiZWluZyBjdXJyZW50bHkgcHJvY2Vzc2VkIGJ5IEhXCisgKiBAcmVzdWx0c192YWxpZCAgICAgICA6IFdoZXRoZXIgSFcgZnJhbWUgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHRvIGdldAorICogQHNwaW5fbG9jayAgICAgICAgICAgOiBNdXRleCB0byBwcm90ZWN0IHNoYXJlZCBkYXRhIGluIGh3IGxheWVyCisgKiBAaXJxX2NiICAgICAgICAgICAgICA6IEhXIE1hbmFnZXIgY2FsbGJhY2sgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0cnVjdCBjYW1fZmRfY29yZSB7CisJc3RydWN0IGNhbV9mZF9od19zdGF0aWNfaW5mbyAgICpod19zdGF0aWNfaW5mbzsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NhcHMgICAgICAgICAgIGh3X2NhcHM7CisJZW51bSBjYW1fZmRfY29yZV9zdGF0ZSAgICAgICAgICBjb3JlX3N0YXRlOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgcHJvY2Vzc2luZ19jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgIHJlc2V0X2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgaGFsdF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlICAgKmh3X3JlcV9wcml2YXRlOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c192YWxpZDsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jazsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9zZXRfaXJxX2NiIGlycV9jYjsKK307CisKK2ludCBjYW1fZmRfaHdfdXRpbF9nZXRfaHdfY2FwcyhzdHJ1Y3QgY2FtX2h3X2luZm8gKmZkX2h3LAorCXN0cnVjdCBjYW1fZmRfaHdfY2FwcyAqaHdfY2Fwcyk7CitpcnFyZXR1cm5fdCBjYW1fZmRfaHdfaXJxKGludCBpcnFfbnVtLCB2b2lkICpkYXRhKTsKKworaW50IGNhbV9mZF9od19nZXRfaHdfY2Fwcyh2b2lkICpod19wcml2LCB2b2lkICpnZXRfaHdfY2FwX2FyZ3MsCisJdWludDMyX3QgYXJnX3NpemUpOworaW50IGNhbV9mZF9od19pbml0KHZvaWQgKmh3X3ByaXYsIHZvaWQgKmluaXRfaHdfYXJncywgdWludDMyX3QgYXJnX3NpemUpOworaW50IGNhbV9mZF9od19kZWluaXQodm9pZCAqaHdfcHJpdiwgdm9pZCAqZGVpbml0X2h3X2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKTsKK2ludCBjYW1fZmRfaHdfcmVzZXQodm9pZCAqaHdfcHJpdiwgdm9pZCAqcmVzZXRfY29yZV9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSk7CitpbnQgY2FtX2ZkX2h3X3Jlc2VydmUodm9pZCAqaHdfcHJpdiwgdm9pZCAqaHdfcmVzZXJ2ZV9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSk7CitpbnQgY2FtX2ZkX2h3X3JlbGVhc2Uodm9pZCAqaHdfcHJpdiwgdm9pZCAqaHdfcmVsZWFzZV9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSk7CitpbnQgY2FtX2ZkX2h3X3N0YXJ0KHZvaWQgKmh3X3ByaXYsIHZvaWQgKmh3X3N0YXJ0X2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKTsKK2ludCBjYW1fZmRfaHdfaGFsdF9yZXNldCh2b2lkICpod19wcml2LCB2b2lkICpzdG9wX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKTsKK2ludCBjYW1fZmRfaHdfcmVhZCh2b2lkICpod19wcml2LCB2b2lkICpyZWFkX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKTsKK2ludCBjYW1fZmRfaHdfd3JpdGUodm9pZCAqaHdfcHJpdiwgdm9pZCAqd3JpdGVfYXJncywgdWludDMyX3QgYXJnX3NpemUpOworaW50IGNhbV9mZF9od19wcm9jZXNzX2NtZCh2b2lkICpod19wcml2LCB1aW50MzJfdCBjbWRfdHlwZSwKKwl2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpOworCisjZW5kaWYgLyogX0NBTV9GRF9IV19DT1JFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZGE3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19kZXYuYwpAQCAtMCwwICsxLDIyMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImNhbV9zdWJkZXYuaCIKKyNpbmNsdWRlICJjYW1fZmRfaHdfaW50Zi5oIgorI2luY2x1ZGUgImNhbV9mZF9od19jb3JlLmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X3NvYy5oIgorI2luY2x1ZGUgImNhbV9mZF9od192NDEuaCIKKworc3RhdGljIGludCBjYW1fZmRfaHdfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNhbV9od19pbmZvICpmZF9odzsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmZkX2h3X2ludGY7CisJc3RydWN0IGNhbV9mZF9jb3JlICpmZF9jb3JlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoX2RldiA9IE5VTEw7CisJc3RydWN0IGNhbV9mZF9od19zdGF0aWNfaW5mbyAqaHdfc3RhdGljX2luZm8gPSBOVUxMOworCWludCByYyA9IDA7CisJc3RydWN0IGNhbV9mZF9od19pbml0X2FyZ3MgaW5pdF9hcmdzOworCXN0cnVjdCBjYW1fZmRfaHdfZGVpbml0X2FyZ3MgZGVpbml0X2FyZ3M7CisKKwlmZF9od19pbnRmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9od19pbnRmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZF9od19pbnRmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZkX2h3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9od19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZF9odykgeworCQlrZnJlZShmZF9od19pbnRmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmRfY29yZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fZmRfY29yZSksIEdGUF9LRVJORUwpOworCWlmICghZmRfY29yZSkgeworCQlrZnJlZShmZF9odyk7CisJCWtmcmVlKGZkX2h3X2ludGYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmZF9od19pbnRmLT5od19wcml2ID0gZmRfaHc7CisJZmRfaHctPmNvcmVfaW5mbyA9IGZkX2NvcmU7CisKKwlmZF9ody0+aHdfc3RhdGUgPSBDQU1fSFdfU1RBVEVfUE9XRVJfRE9XTjsKKwlmZF9ody0+c29jX2luZm8ucGRldiA9IHBkZXY7CisJZmRfaHctPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJZmRfaHctPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKKwlmZF9ody0+b3Blbl9jb3VudCA9IDA7CisJbXV0ZXhfaW5pdCgmZmRfaHctPmh3X211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmZmRfaHctPmh3X2xvY2spOworCWluaXRfY29tcGxldGlvbigmZmRfaHctPmh3X2NvbXBsZXRlKTsKKworCXNwaW5fbG9ja19pbml0KCZmZF9jb3JlLT5zcGluX2xvY2spOworCWluaXRfY29tcGxldGlvbigmZmRfY29yZS0+cHJvY2Vzc2luZ19jb21wbGV0ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZmZF9jb3JlLT5oYWx0X2NvbXBsZXRlKTsKKwlpbml0X2NvbXBsZXRpb24oJmZkX2NvcmUtPnJlc2V0X2NvbXBsZXRlKTsKKworCWZkX2h3X2ludGYtPmh3X29wcy5nZXRfaHdfY2FwcyA9IGNhbV9mZF9od19nZXRfaHdfY2FwczsKKwlmZF9od19pbnRmLT5od19vcHMuaW5pdCA9IGNhbV9mZF9od19pbml0OworCWZkX2h3X2ludGYtPmh3X29wcy5kZWluaXQgPSBjYW1fZmRfaHdfZGVpbml0OworCWZkX2h3X2ludGYtPmh3X29wcy5yZXNldCA9IGNhbV9mZF9od19yZXNldDsKKwlmZF9od19pbnRmLT5od19vcHMucmVzZXJ2ZSA9IGNhbV9mZF9od19yZXNlcnZlOworCWZkX2h3X2ludGYtPmh3X29wcy5yZWxlYXNlID0gY2FtX2ZkX2h3X3JlbGVhc2U7CisJZmRfaHdfaW50Zi0+aHdfb3BzLnN0YXJ0ID0gY2FtX2ZkX2h3X3N0YXJ0OworCWZkX2h3X2ludGYtPmh3X29wcy5zdG9wID0gY2FtX2ZkX2h3X2hhbHRfcmVzZXQ7CisJZmRfaHdfaW50Zi0+aHdfb3BzLnJlYWQgPSBOVUxMOworCWZkX2h3X2ludGYtPmh3X29wcy53cml0ZSA9IE5VTEw7CisJZmRfaHdfaW50Zi0+aHdfb3BzLnByb2Nlc3NfY21kID0gY2FtX2ZkX2h3X3Byb2Nlc3NfY21kOworCWZkX2h3X2ludGYtPmh3X3R5cGUgPSBDQU1fSFdfRkQ7CisKKwltYXRjaF9kZXYgPSBvZl9tYXRjaF9kZXZpY2UocGRldi0+ZGV2LmRyaXZlci0+b2ZfbWF0Y2hfdGFibGUsCisJCSZwZGV2LT5kZXYpOworCWlmICghbWF0Y2hfZGV2IHx8ICFtYXRjaF9kZXYtPmRhdGEpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJObyBPZl9tYXRjaCBkYXRhLCAlcEsiLCBtYXRjaF9kZXYpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9tZW1vcnk7CisJfQorCWh3X3N0YXRpY19pbmZvID0gKHN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gKiltYXRjaF9kZXYtPmRhdGE7CisJZmRfY29yZS0+aHdfc3RhdGljX2luZm8gPSBod19zdGF0aWNfaW5mbzsKKworCUNBTV9EQkcoQ0FNX0ZELCAiSFcgU3RhdGljIEluZm8gOiB2ZXJzaW9uIGNvcmVbJWQuJWRdIHdyYXBwZXJbJWQuJWRdIiwKKwkJaHdfc3RhdGljX2luZm8tPmNvcmVfdmVyc2lvbi5tYWpvciwKKwkJaHdfc3RhdGljX2luZm8tPmNvcmVfdmVyc2lvbi5taW5vciwKKwkJaHdfc3RhdGljX2luZm8tPndyYXBwZXJfdmVyc2lvbi5tYWpvciwKKwkJaHdfc3RhdGljX2luZm8tPndyYXBwZXJfdmVyc2lvbi5taW5vcik7CisKKwlyYyA9IGNhbV9mZF9zb2NfaW5pdF9yZXNvdXJjZXMoJmZkX2h3LT5zb2NfaW5mbywgY2FtX2ZkX2h3X2lycSwgZmRfaHcpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCB0byBpbml0IHNvYywgcmM9JWQiLCByYyk7CisJCWdvdG8gZnJlZV9tZW1vcnk7CisJfQorCisJZmRfaHdfaW50Zi0+aHdfaWR4ID0gZmRfaHctPnNvY19pbmZvLmluZGV4OworCisJbWVtc2V0KCZpbml0X2FyZ3MsIDB4MCwgc2l6ZW9mKGluaXRfYXJncykpOworCW1lbXNldCgmZGVpbml0X2FyZ3MsIDB4MCwgc2l6ZW9mKGRlaW5pdF9hcmdzKSk7CisJcmMgPSBjYW1fZmRfaHdfaW5pdChmZF9odywgJmluaXRfYXJncywgc2l6ZW9mKGluaXRfYXJncykpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCB0byBodyBpbml0LCByYz0lZCIsIHJjKTsKKwkJZ290byBkZWluaXRfcGxhdGZvcm1fcmVzOworCX0KKworCXJjID0gY2FtX2ZkX2h3X3V0aWxfZ2V0X2h3X2NhcHMoZmRfaHcsICZmZF9jb3JlLT5od19jYXBzKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJGYWlsZWQgdG8gZ2V0IGh3IGNhcHMsIHJjPSVkIiwgcmMpOworCQlnb3RvIGRlaW5pdF9odzsKKwl9CisKKwlyYyA9IGNhbV9mZF9od19kZWluaXQoZmRfaHcsICZkZWluaXRfYXJncywgc2l6ZW9mKGRlaW5pdF9hcmdzKSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIHRvIGRlaW5pdCBodywgcmM9JWQiLCByYyk7CisJCWdvdG8gZGVpbml0X3BsYXRmb3JtX3JlczsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmZF9od19pbnRmKTsKKwlDQU1fREJHKENBTV9GRCwgIkZELSVkIHByb2JlIHN1Y2Nlc3NmdWwiLCBmZF9od19pbnRmLT5od19pZHgpOworCisJcmV0dXJuIHJjOworCitkZWluaXRfaHc6CisJaWYgKGNhbV9mZF9od19kZWluaXQoZmRfaHcsICZkZWluaXRfYXJncywgc2l6ZW9mKGRlaW5pdF9hcmdzKSkpCisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIGh3IGRlaW5pdCIpOworZGVpbml0X3BsYXRmb3JtX3JlczoKKwlpZiAoY2FtX2ZkX3NvY19kZWluaXRfcmVzb3VyY2VzKCZmZF9ody0+c29jX2luZm8pKQorCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBzb2MgZGVpbml0Iik7CisJbXV0ZXhfZGVzdHJveSgmZmRfaHctPmh3X211dGV4KTsKK2ZyZWVfbWVtb3J5OgorCWtmcmVlKGZkX2h3KTsKKwlrZnJlZShmZF9od19pbnRmKTsKKwlrZnJlZShmZF9jb3JlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fZmRfaHdfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByYyA9IDA7CisJc3RydWN0IGNhbV9od19pbnRmICpmZF9od19pbnRmOworCXN0cnVjdCBjYW1faHdfaW5mbyAqZmRfaHc7CisJc3RydWN0IGNhbV9mZF9jb3JlICpmZF9jb3JlOworCisJZmRfaHdfaW50ZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghZmRfaHdfaW50ZikgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgZmRfaHdfaW50ZiBmcm9tIHBkZXYiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmRfaHcgPSBmZF9od19pbnRmLT5od19wcml2OworCWlmICghZmRfaHcpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGZkX2h3IGZyb20gZmRfaHdfaW50ZiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9mZF9od19pbnRmOworCX0KKworCWZkX2NvcmUgPSAoc3RydWN0IGNhbV9mZF9jb3JlICopZmRfaHctPmNvcmVfaW5mbzsKKwlpZiAoIWZkX2NvcmUpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIGZkX2NvcmUgZnJvbSBmZF9odyIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZGVpbml0X3BsYXRmb3JtX3JlczsKKwl9CisKKwlrZnJlZShmZF9jb3JlKTsKKworZGVpbml0X3BsYXRmb3JtX3JlczoKKwlyYyA9IGNhbV9mZF9zb2NfZGVpbml0X3Jlc291cmNlcygmZmRfaHctPnNvY19pbmZvKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgaW4gRkQgc29jIGRlaW5pdCwgcmM9JWQiLCByYyk7CisKKwltdXRleF9kZXN0cm95KCZmZF9ody0+aHdfbXV0ZXgpOworCWtmcmVlKGZkX2h3KTsKKworZnJlZV9mZF9od19pbnRmOgorCWtmcmVlKGZkX2h3X2ludGYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjYW1fZmRfaHdfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20sZmQ0MSIsCisJCS5kYXRhID0gJmNhbV9mZF93cmFwcGVyMTIwX2NvcmU0MTBfaW5mbywKKwl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2FtX2ZkX2h3X2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2FtX2ZkX2h3X2RyaXZlciA9IHsKKwkucHJvYmUgPSBjYW1fZmRfaHdfZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBjYW1fZmRfaHdfZGV2X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjYW1fZmRfaHciLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gY2FtX2ZkX2h3X2R0X21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjYW1fZmRfaHdfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjYW1fZmRfaHdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNhbV9mZF9od19leGl0X21vZHVsZSh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjYW1fZmRfaHdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2FtX2ZkX2h3X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGNhbV9mZF9od19leGl0X21vZHVsZSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNBTSBGRCBIVyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19pbnRmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTc2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfaW50Zi5oCkBAIC0wLDAgKzEsMjg5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0FNX0ZEX0hXX0lOVEZfSF8KKyNkZWZpbmUgX0NBTV9GRF9IV19JTlRGX0hfCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bWVkaWEvY2FtX2NwYXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9jYW1fcmVxX21nci5oPgorI2luY2x1ZGUgPG1lZGlhL2NhbV9mZC5oPgorCisjaW5jbHVkZSAiY2FtX2lvX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1fc29jX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1faHcuaCIKKyNpbmNsdWRlICJjYW1faHdfaW50Zi5oIgorI2luY2x1ZGUgImNhbV9zdWJkZXYuaCIKKyNpbmNsdWRlICJjYW1fY3Bhc19hcGkuaCIKKyNpbmNsdWRlICJjYW1faHdfbWdyX2ludGYuaCIKKyNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgorCisjZGVmaW5lIENBTV9GRF9NQVhfSU9fQlVGRkVSUyAgICAgICAgNQorI2RlZmluZSBDQU1fRkRfTUFYX0hXX0VOVFJJRVMgICAgICAgIDUKKworLyoqCisgKiBlbnVtIGNhbV9mZF9od190eXBlIC0gRW51bSBmb3IgRkQgSFcgdHlwZQorICoKKyAqIEBDQU1fSFdfRkQgOiBGYWNlRGV0ZWN0aW9uIEhXIHR5cGUKKyAqLworZW51bSBjYW1fZmRfaHdfdHlwZSB7CisJQ0FNX0hXX0ZELAorfTsKKworLyoqCisgKiBlbnVtIGNhbV9mZF9od19tb2RlIC0gTW9kZSBpbiB3aGljaCBIVyBjYW4gcnVuCisgKgorICogQENBTV9GRF9NT0RFX0ZBQ0VERVRFQ1RJT04gOiBGYWNlIERldGVjdGlvbiBtb2RlIGluIHdoaWNoIGZhY2Ugc2VhcmNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGRvbmUgb24gdGhlIGdpdmVuIGZyYW1lCisgKiBAQ0FNX0ZEX01PREVfUFlSQU1JRCAgICAgICA6IFB5cmFtaWQgbW9kZSB3aGVyZSBhIHB5cmFtaWQgaW1hZ2UgaXMgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYW4gaW5wdXQgaW1hZ2UKKyAqLworZW51bSBjYW1fZmRfaHdfbW9kZSB7CisJQ0FNX0ZEX01PREVfRkFDRURFVEVDVElPTiAgICA9IDB4MSwKKwlDQU1fRkRfTU9ERV9QWVJBTUlEICAgICAgICAgID0gMHgyLAorfTsKKworLyoqCisgKiBlbnVtIGNhbV9mZF9wcmlvcml0eSAtIEZEIHByaW9yaXR5IGxldmVscworICoKKyAqIEBDQU1fRkRfUFJJT1JJVFlfSElHSCAgIDogSW5kaWNhdGVzIGhpZ2ggcHJpb3JpdHkgY2xpZW50LCBkcml2ZXIgcHJpb3JpdGl6ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgcmVxdWVzdHMgY29taW5nIGZyb20gY29udGV4dHMgd2l0aCBISUdICisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IGNvbXBhcmVkIHRvIGNvbnRleHQgd2l0aCBub3JtYWwgcHJpb3JpdHkKKyAqIEBDQU1fRkRfUFJJT1JJVFlfTk9STUFMIDogSW5kaWNhdGVzIG5vcm1hbCBwcmlvcml0eSBjbGllbnQKKyAqLworZW51bSBjYW1fZmRfcHJpb3JpdHkgeworCUNBTV9GRF9QUklPUklUWV9ISUdIICAgICAgICAgPSAweDAsCisJQ0FNX0ZEX1BSSU9SSVRZX05PUk1BTCwKK307CisKKy8qKgorICogZW51bSBjYW1fZmRfaHdfaXJxX3R5cGUgLSBGRCBIVyBJUlEgdHlwZXMKKyAqCisgKiBAQ0FNX0ZEX0lSUV9GUkFNRV9ET05FIDogSW5kaWNhdGVzIGZyYW1lIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQKKyAqIEBDQU1fRkRfSVJRX0hBTFRfRE9ORSAgOiBJbmRpY2F0ZXMgSFcgaGFsdCBpcyBmaW5pc2hlZAorICogQENBTV9GRF9JUlFfUkVTRVRfRE9ORSA6IEluZGljYXRlcyBIVyByZXNldCBpcyBmaW5pc2hlZAorICovCitlbnVtIGNhbV9mZF9od19pcnFfdHlwZSB7CisJQ0FNX0ZEX0lSUV9GUkFNRV9ET05FLAorCUNBTV9GRF9JUlFfSEFMVF9ET05FLAorCUNBTV9GRF9JUlFfUkVTRVRfRE9ORSwKK307CisKKy8qKgorICogZW51bSBjYW1fZmRfaHdfY21kX3R5cGUgLSBGRCBIVyBsYXllciBjdXN0b20gY29tbWFuZHMKKyAqCisgKiBAQ0FNX0ZEX0hXX0NNRF9QUkVTVEFSVCAgICAgICAgICA6IENvbW1hbmQgdG8gcHJvY2VzcyBwcmUtc3RhcnQgc2V0dGluZ3MKKyAqIEBDQU1fRkRfSFdfQ01EX0ZSQU1FX0RPTkUgICAgICAgIDogQ29tbWFuZCB0byBwcm9jZXNzIGZyYW1lIGRvbmUgc2V0dGluZ3MKKyAqIEBDQU1fRkRfSFdfQ01EX1VQREFURV9TT0MgICAgICAgIDogQ29tbWFuZCB0byBwcm9jZXNzIHNvYyB1cGRhdGUKKyAqIEBDQU1fRkRfSFdfQ01EX1JFR0lTVEVSX0NBTExCQUNLIDogQ29tbWFuZCB0byBzZXQgaHcgbWdyIGNhbGxiYWNrCisgKiBAQ0FNX0ZEX0hXX0NNRF9NQVggICAgICAgICAgICAgICA6IEluZGljYXRlcyBtYXggY21kCisgKi8KK2VudW0gY2FtX2ZkX2h3X2NtZF90eXBlIHsKKwlDQU1fRkRfSFdfQ01EX1BSRVNUQVJULAorCUNBTV9GRF9IV19DTURfRlJBTUVfRE9ORSwKKwlDQU1fRkRfSFdfQ01EX1VQREFURV9TT0MsCisJQ0FNX0ZEX0hXX0NNRF9SRUdJU1RFUl9DQUxMQkFDSywKKwlDQU1fRkRfSFdfQ01EX01BWCwKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9od19pb19idWZmZXIgOiBGRCBIVyBJTyBCdWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBAdmFsaWQgICAgOiBXaGV0aGVyIHRoaXMgSU8gQnVmIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQKKyAqIEBpb19jZmcgICA6IElPIENvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqIEBudW1fYnVmICA6IE51bWJlciBwbGFuZXMgaW4gaW9fYWRkciwgY3B1X2FkZHIgYXJyYXkKKyAqIEBpb19hZGRyICA6IEFycmF5IG9mIElPIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHBsYW5lcworICogQGNwdV9hZGRyIDogQXJyYXkgb2YgQ1BVIGFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHBsYW5lcworICovCitzdHJ1Y3QgY2FtX2ZkX2h3X2lvX2J1ZmZlciB7CisJYm9vbCAgICAgICAgICAgICAgICAgICB2YWxpZDsKKwlzdHJ1Y3QgY2FtX2J1Zl9pb19jZmcgKmlvX2NmZzsKKwl1aW50MzJfdCAgICAgICAgICAgICAgIG51bV9idWY7CisJdWludDY0X3QgICAgICAgICAgICAgICBpb19hZGRyW0NBTV9QQUNLRVRfTUFYX1BMQU5FU107CisJdWludDY0X3QgICAgICAgICAgICAgICBjcHVfYWRkcltDQU1fUEFDS0VUX01BWF9QTEFORVNdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlIDogRkQgSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgIHNwZWNpZmljIHRvIGEgcmVxdWVzdAorICoKKyAqIEBjdHhfaHdfcHJpdmF0ZSAgOiBGRCBIVyBsYXllcidzIGN0eCBzcGVjaWZpYyBwcml2YXRlIGRhdGEKKyAqIEByZXF1ZXN0X2lkICAgICAgOiBSZXF1ZXN0IElEIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwcml2YXRlIGluZm9ybWF0aW9uCisgKiBAZ2V0X3Jhd19yZXN1bHRzIDogV2hldGhlciB0byBnZXQgcmF3IHJlc3VsdHMgZm9yIHRoaXMgcmVxdWVzdAorICogQHJvX21vZGVfZW5hYmxlZCA6IFdoZXRoZXIgUk8gbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHJlcXVlc3QKKyAqIEBmZF9yZXN1bHRzICAgICAgOiBQb2ludGVyIHRvIHNhdmUgZmFjZSBkZXRlY3Rpb24gcmVzdWx0cworICogQHJhd19yZXN1bHRzICAgICA6IFBvaW50ZXIgdG8gc2F2ZSBmYWNlIGRldGVjdGlvbiByYXcgcmVzdWx0cworICovCitzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlIHsKKwl2b2lkICAgICAgICAgICAgICAgICAgKmN0eF9od19wcml2YXRlOworCXVpbnQ2NF90ICAgICAgICAgICAgICAgcmVxdWVzdF9pZDsKKwlib29sICAgICAgICAgICAgICAgICAgIGdldF9yYXdfcmVzdWx0czsKKwlib29sICAgICAgICAgICAgICAgICAgIHJvX21vZGVfZW5hYmxlZDsKKwlzdHJ1Y3QgY2FtX2ZkX3Jlc3VsdHMgKmZkX3Jlc3VsdHM7CisJdWludDMyX3QgICAgICAgICAgICAgICpyYXdfcmVzdWx0czsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9od19yZXNlcnZlX2FyZ3MgOiBSZXNlcnZlIGFyZ3MgZm9yIHRoaXMgSFcgY29udGV4dAorICoKKyAqIEBod19jdHggICAgICAgICA6IEhXIGNvbnRleHQgZm9yIHdoaWNoIHJlc2VydmUgaXMgcmVxdWVzdGVkCisgKiBAbW9kZSAgICAgICAgICAgOiBNb2RlIGZvciB3aGljaCB0aGlzIHJlc2VydmUgaXMgcmVxdWVzdGVkCisgKiBAY3R4X2h3X3ByaXZhdGUgOiBQb2ludGVyIHRvIHNhdmUgSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljCisgKiAgICAgICAgICAgICAgICAgICB0byB0aGlzIGh3IGNvbnRleHQuIFRoaXMgaGFzIHRvIGJlIHBhc3NlZCB3aGlsZSBjYWxsaW5nCisgKiAgICAgICAgICAgICAgICAgICBmdXJ0aGVyIEhXIGxheWVyIGNhbGxzCisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfcmVzZXJ2ZV9hcmdzIHsKKwl2b2lkICAgICAgICAgICAgICAgICAgKmh3X2N0eDsKKwllbnVtIGNhbV9mZF9od19tb2RlICAgIG1vZGU7CisJdm9pZCAgICAgICAgICAgICAgICAgICpjdHhfaHdfcHJpdmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9od19yZWxlYXNlX2FyZ3MgOiBSZWxlYXNlIGFyZ3MgZm9yIHRoaXMgSFcgY29udGV4dAorICoKKyAqIEBod19jdHggICAgICAgICA6IEhXIGNvbnRleHQgZm9yIHdoaWNoIHJlbGVhc2UgaXMgcmVxdWVzdGVkCisgKiBAY3R4X2h3X3ByaXZhdGUgOiBIVyBsYXllcidzIHByaXZhdGUgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBodyBjb250ZXh0CisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfcmVsZWFzZV9hcmdzIHsKKwl2b2lkICAgICpod19jdHg7CisJdm9pZCAgICAqY3R4X2h3X3ByaXZhdGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfaW5pdF9hcmdzIDogSW5pdCBhcmdzIGZvciB0aGlzIEhXIGNvbnRleHQKKyAqCisgKiBAaHdfY3R4ICAgICAgICAgOiBIVyBjb250ZXh0IGZvciB3aGljaCBpbml0IGlzIHJlcXVlc3RlZAorICogQGN0eF9od19wcml2YXRlIDogSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMgaHcgY29udGV4dAorICovCitzdHJ1Y3QgY2FtX2ZkX2h3X2luaXRfYXJncyB7CisJdm9pZCAgICAqaHdfY3R4OworCXZvaWQgICAgKmN0eF9od19wcml2YXRlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X2RlaW5pdF9hcmdzIDogRGVpbml0IGFyZ3MgZm9yIHRoaXMgSFcgY29udGV4dAorICoKKyAqIEBod19jdHggICAgICAgICA6IEhXIGNvbnRleHQgZm9yIHdoaWNoIGRlaW5pdCBpcyByZXF1ZXN0ZWQKKyAqIEBjdHhfaHdfcHJpdmF0ZSA6IEhXIGxheWVyJ3MgcHJpdmF0ZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGh3IGNvbnRleHQKKyAqLworc3RydWN0IGNhbV9mZF9od19kZWluaXRfYXJncyB7CisJdm9pZCAgICAqaHdfY3R4OworCXZvaWQgICAgKmN0eF9od19wcml2YXRlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X2NtZF9wcmVzdGFydF9hcmdzIDogUHJlc3RhcnQgY29tbWFuZCBhcmdzCisgKgorICogQGh3X2N0eCAgICAgICAgICAgICAgIDogSFcgY29udGV4dCB3aGljaCBzdWJtaXR0ZWQgdGhpcyBwcmVzdGFydAorICogQGN0eF9od19wcml2YXRlICAgICAgIDogSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGh3IGNvbnRleHQKKyAqIEByZXF1ZXN0X2lkICAgICAgICAgICA6IFJlcXVlc3QgSUQgY29ycmVzcG9uZHMgdG8gdGhpcyBwcmUtc3RhcnQgY29tbWFuZAorICogQGdldF9yYXdfcmVzdWx0cyAgICAgIDogV2hldGhlciB0byBnZXQgcmF3IHJlc3VsdHMgZm9yIHRoaXMgcmVxdWVzdAorICogQGlucHV0X2J1ZiAgICAgICAgICAgIDogSW5wdXQgSU8gQnVmZmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHJlcXVlc3QKKyAqIEBvdXRwdXRfYnVmICAgICAgICAgICA6IE91dHB1dCBJTyBCdWZmZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgcmVxdWVzdAorICogQGNtZF9idWZfYWRkciAgICAgICAgIDogQ29tbWFuZCBidWZmZXIgYWRkcmVzcyB0byBmaWxsIGttZCBjb21tYW5kcworICogQHNpemUgICAgICAgICAgICAgICAgIDogU2l6ZSBhdmFpbGFibGUgaW4gY29tbWFuZCBidWZmZXIKKyAqIEBwcmVfY29uZmlnX2J1Zl9zaXplICA6IEJ1ZmZlciBzaXplIGZpbGxlZCB3aXRoIGNvbW1hbmRzIGJ5IEtNRCB0aGF0IGhhcworICogICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHVtZCBjb21tYW5kcworICogQHBvc3RfY29uZmlnX2J1Zl9zaXplIDogQnVmZmVyIHNpemUgZmlsbGVkIHdpdGggY29tbWFuZHMgYnkgS01EIHRoYXQgaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBpbnNlcnRlZCBhZnRlciB1bWQgY29tbWFuZHMKKyAqIEBod19yZXFfcHJpdmF0ZSAgICAgICA6IEhXIGxheWVyJ3MgcHJpdmF0ZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyByZXF1ZXN0CisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfY21kX3ByZXN0YXJ0X2FyZ3MgeworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmh3X2N0eDsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpjdHhfaHdfcHJpdmF0ZTsKKwl1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2lkOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yYXdfcmVzdWx0czsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2lvX2J1ZmZlciAgICBpbnB1dF9idWZbQ0FNX0ZEX01BWF9JT19CVUZGRVJTXTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2lvX2J1ZmZlciAgICBvdXRwdXRfYnVmW0NBTV9GRF9NQVhfSU9fQlVGRkVSU107CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAqY21kX2J1Zl9hZGRyOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgcHJlX2NvbmZpZ19idWZfc2l6ZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBwb3N0X2NvbmZpZ19idWZfc2l6ZTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlICBod19yZXFfcHJpdmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9od19jbWRfc3RhcnRfYXJncyA6IFN0YXJ0IGNvbW1hbmQgYXJncworICoKKyAqIEBod19jdHggICAgICAgICAgICAgICAgOiBIVyBjb250ZXh0IHdoaWNoIHN1Ym1pdHRpbmcgc3RhcnQgY29tbWFuZAorICogQGN0eF9od19wcml2YXRlICAgICAgICA6IEhXIGxheWVyJ3MgcHJpdmF0ZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBodyBjb250ZXh0CisgKiBAaHdfcmVxX3ByaXZhdGUgICAgICAgIDogSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvCisgKiAgICAgICAgICB0aGlzIHJlcXVlc3QKKyAqIEBod191cGRhdGVfZW50cmllcyAgICAgOiBIVyB1cGRhdGUgZW50cmllcyBjb3JyZXNwb25kcyB0byB0aGlzIHJlcXVlc3QKKyAqIEBudW1faHdfdXBkYXRlX2VudHJpZXMgOiBOdW1iZXIgb2YgaHcgdXBkYXRlIGVudHJpZXMKKyAqLworc3RydWN0IGNhbV9mZF9od19jbWRfc3RhcnRfYXJncyB7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmh3X2N0eDsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqY3R4X2h3X3ByaXZhdGU7CisJc3RydWN0IGNhbV9mZF9od19yZXFfcHJpdmF0ZSAgKmh3X3JlcV9wcml2YXRlOworCXN0cnVjdCBjYW1faHdfdXBkYXRlX2VudHJ5ICAgICpod191cGRhdGVfZW50cmllczsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgbnVtX2h3X3VwZGF0ZV9lbnRyaWVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2h3X3N0b3BfYXJncyA6IFN0b3AgY29tbWFuZCBhcmdzCisgKgorICogQGh3X2N0eCAgICAgICAgIDogSFcgY29udGV4dCB3aGljaCBzdWJtaXR0aW5nIHN0b3AgY29tbWFuZAorICogQGN0eF9od19wcml2YXRlIDogSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMgaHcgY29udGV4dAorICogQHJlcXVlc3RfaWQgICAgIDogUmVxdWVzdCBJRCB0aGF0IG5lZWQgdG8gYmUgc3RvcHBlZAorICogQGh3X3JlcV9wcml2YXRlIDogSFcgbGF5ZXIncyBwcml2YXRlIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMgcmVxdWVzdAorICovCitzdHJ1Y3QgY2FtX2ZkX2h3X3N0b3BfYXJncyB7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqaHdfY3R4OworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKmN0eF9od19wcml2YXRlOworCXVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfaWQ7CisJc3RydWN0IGNhbV9mZF9od19yZXFfcHJpdmF0ZSAqaHdfcmVxX3ByaXZhdGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfZnJhbWVfZG9uZV9hcmdzIDogRnJhbWUgZG9uZSBjb21tYW5kIGFyZ3MKKyAqCisgKiBAaHdfY3R4ICAgICAgICAgOiBIVyBjb250ZXh0IHdoaWNoIHN1Ym1pdHRpbmcgZnJhbWUgZG9uZSByZXF1ZXN0CisgKiBAY3R4X2h3X3ByaXZhdGUgOiBIVyBsYXllcidzIHByaXZhdGUgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBodyBjb250ZXh0CisgKiBAcmVxdWVzdF9pZCAgICAgOiBSZXF1ZXN0IElEIHRoYXQgbmVlZCB0byBiZSBzdG9wcGVkCisgKiBAaHdfcmVxX3ByaXZhdGUgOiBIVyBsYXllcidzIHByaXZhdGUgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyByZXF1ZXN0CisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfZnJhbWVfZG9uZV9hcmdzIHsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpod19jdHg7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAqY3R4X2h3X3ByaXZhdGU7CisJdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9pZDsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X3JlcV9wcml2YXRlICpod19yZXFfcHJpdmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9od19yZXNldF9hcmdzIDogUmVzZXQgY29tbWFuZCBhcmdzCisgKgorICogQGh3X2N0eCAgICAgICAgIDogSFcgY29udGV4dCB3aGljaCBzdWJtaXR0aW5nIHJlc2V0IGNvbW1hbmQKKyAqIEBjdHhfaHdfcHJpdmF0ZSA6IEhXIGxheWVyJ3MgcHJpdmF0ZSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGlzIGh3IGNvbnRleHQKKyAqLworc3RydWN0IGNhbV9mZF9od19yZXNldF9hcmdzIHsKKwl2b2lkICAgICpod19jdHg7CisJdm9pZCAgICAqY3R4X2h3X3ByaXZhdGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfY21kX3NldF9pcnFfY2IgOiBTZXQgSVJRIGNhbGxiYWNrIGNvbW1hbmQgYXJncworICoKKyAqIEBjYW1fZmRfaHdfbWdyX2NiIDogSFcgTWdyJ3MgY2FsbGJhY2sgcG9pbnRlcgorICogQGRhdGEgICAgICAgICAgICAgOiBIVyBNZ3IncyBwcml2YXRlIGRhdGEKKyAqLworc3RydWN0IGNhbV9mZF9od19jbWRfc2V0X2lycV9jYiB7CisJaW50ICgqY2FtX2ZkX2h3X21ncl9jYikodm9pZCAqZGF0YSwgZW51bSBjYW1fZmRfaHdfaXJxX3R5cGUgaXJxX3R5cGUpOworCXZvaWQgKmRhdGE7Cit9OworCisjZW5kaWYgLyogX0NBTV9GRF9IV19JTlRGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfc29jLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfc29jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0NWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19zb2MuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgImNhbV9mZF9od19jb3JlLmgiCisjaW5jbHVkZSAiY2FtX2ZkX2h3X3NvYy5oIgorCitzdGF0aWMgdm9pZCBjYW1fZmRfaHdfdXRpbF9jcGFzX2NhbGxiYWNrKHVpbnQzMl90IGhhbmRsZSwgdm9pZCAqdXNlcmRhdGEsCisJZW51bSBjYW1fY2Ftbm9jX2lycV90eXBlIGV2ZW50X3R5cGUsIHVpbnQzMl90IGV2ZW50X2RhdGEpCit7CisJQ0FNX0RCRyhDQU1fRkQsICJDUEFTIGhkbD0lZCwgdWRhdGE9JXBLLCBldmVudD0lZCwgZXZlbnRfZGF0YT0lZCIsCisJCWhhbmRsZSwgdXNlcmRhdGEsIGV2ZW50X3R5cGUsIGV2ZW50X2RhdGEpOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9od19zb2NfdXRpbF9zZXR1cF9yZWdiYXNlX2luZGljZXMoCisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pCit7CisJc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSAqc29jX3ByaXZhdGUgPQorCQkoc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSAqKXNvY19pbmZvLT5zb2NfcHJpdmF0ZTsKKwl1aW50MzJfdCBpbmRleDsKKwlpbnQgcmMsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FNX0ZEX1JFR19NQVg7IGkrKykKKwkJc29jX3ByaXZhdGUtPnJlZ2Jhc2VfaW5kZXhbaV0gPSAtMTsKKworCWlmICgoc29jX2luZm8tPm51bV9tZW1fYmxvY2sgPiBDQU1fU09DX01BWF9CTE9DSykgfHwKKwkJKHNvY19pbmZvLT5udW1fbWVtX2Jsb2NrICE9IENBTV9GRF9SRUdfTUFYKSkgeworCQlDQU1fRVJSKENBTV9GRCwgIkludmFsaWQgbnVtX21lbV9ibG9jaz0lZCIsCisJCQlzb2NfaW5mby0+bnVtX21lbV9ibG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2FtX2NvbW1vbl91dGlsX2dldF9zdHJpbmdfaW5kZXgoc29jX2luZm8tPm1lbV9ibG9ja19uYW1lLAorCQlzb2NfaW5mby0+bnVtX21lbV9ibG9jaywgImZkX2NvcmUiLCAmaW5kZXgpOworCWlmICgocmMgPT0gMCkgJiYgKGluZGV4IDwgQ0FNX0ZEX1JFR19NQVgpKSB7CisJCXNvY19wcml2YXRlLT5yZWdiYXNlX2luZGV4W0NBTV9GRF9SRUdfQ09SRV0gPSBpbmRleDsKKwl9IGVsc2UgeworCQlDQU1fRVJSKENBTV9GRCwgInJlZ2Jhc2Ugbm90IGZvdW5kIGZvciBGRF9DT1JFLCByYz0lZCwgJWQgJWQiLAorCQkJcmMsIGluZGV4LCBDQU1fRkRfUkVHX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2FtX2NvbW1vbl91dGlsX2dldF9zdHJpbmdfaW5kZXgoc29jX2luZm8tPm1lbV9ibG9ja19uYW1lLAorCQlzb2NfaW5mby0+bnVtX21lbV9ibG9jaywgImZkX3dyYXBwZXIiLCAmaW5kZXgpOworCWlmICgocmMgPT0gMCkgJiYgKGluZGV4IDwgQ0FNX0ZEX1JFR19NQVgpKSB7CisJCXNvY19wcml2YXRlLT5yZWdiYXNlX2luZGV4W0NBTV9GRF9SRUdfV1JBUFBFUl0gPSBpbmRleDsKKwl9IGVsc2UgeworCQlDQU1fRVJSKENBTV9GRCwgInJlZ2Jhc2Ugbm90IGZvdW5kIEZEX1dSQVBQRVIsIHJjPSVkLCAlZCAlZCIsCisJCQlyYywgaW5kZXgsIENBTV9GRF9SRUdfTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQ0FNX0RCRyhDQU1fRkQsICJSZWcgaW5kaWNlcyA6IENPUkU9JWQsIFdSQVBQRVI9JWQiLAorCQlzb2NfcHJpdmF0ZS0+cmVnYmFzZV9pbmRleFtDQU1fRkRfUkVHX0NPUkVdLAorCQlzb2NfcHJpdmF0ZS0+cmVnYmFzZV9pbmRleFtDQU1fRkRfUkVHX1dSQVBQRVJdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9mZF9zb2Nfc2V0X2Nsa19mbGFncyhzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbykKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKHNvY19pbmZvLT5udW1fY2xrID4gQ0FNX1NPQ19NQVhfQ0xLKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiSW52YWxpZCBudW0gY2xrICVkIiwgc29jX2luZm8tPm51bV9jbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzZXQgbWVtY29yZSBhbmQgbWVtIHBlcmlwaGVyeSBsb2dpYyBmbGFncyB0byAwICovCisJZm9yIChpID0gMDsgaSA8IHNvY19pbmZvLT5udW1fY2xrOyBpKyspIHsKKwkJaWYgKChzdHJjbXAoc29jX2luZm8tPmNsa19uYW1lW2ldLCAiZmRfY29yZV9jbGsiKSA9PSAwKSB8fAorCQkJKHN0cmNtcChzb2NfaW5mby0+Y2xrX25hbWVbaV0sICJmZF9jb3JlX3Vhcl9jbGsiKSA9PQorCQkJMCkpIHsKKwkJCXJjID0gY2FtX3NvY191dGlsX3NldF9jbGtfZmxhZ3Moc29jX2luZm8sIGksCisJCQkJQ0xLRkxBR19OT1JFVEFJTl9NRU0pOworCQkJaWYgKHJjKQorCQkJCUNBTV9FUlIoQ0FNX0ZELAorCQkJCQkiRmFpbGVkIGluIE5PUkVUQUlOX01FTSBpPSVkLCByYz0lZCIsCisJCQkJCWksIHJjKTsKKworCQkJY2FtX3NvY191dGlsX3NldF9jbGtfZmxhZ3Moc29jX2luZm8sIGksCisJCQkJQ0xLRkxBR19OT1JFVEFJTl9QRVJJUEgpOworCQkJaWYgKHJjKQorCQkJCUNBTV9FUlIoQ0FNX0ZELAorCQkJCQkiRmFpbGVkIGluIE5PUkVUQUlOX1BFUklQSCBpPSVkLCByYz0lZCIsCisJCQkJCWksIHJjKTsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKwordm9pZCBjYW1fZmRfc29jX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvLAorCWVudW0gY2FtX2ZkX3JlZ19iYXNlIHJlZ19iYXNlLCB1aW50MzJfdCByZWdfb2Zmc2V0LCB1aW50MzJfdCByZWdfdmFsdWUpCit7CisJc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSAqc29jX3ByaXZhdGUgPQorCQkoc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSAqKXNvY19pbmZvLT5zb2NfcHJpdmF0ZTsKKwlpbnQzMl90IHJlZ19pbmRleCA9IHNvY19wcml2YXRlLT5yZWdiYXNlX2luZGV4W3JlZ19iYXNlXTsKKworCUNBTV9EQkcoQ0FNX0ZELCAiRkRfUkVHX1dSSVRFOiBCYXNlWyVkXSBPZmZzZXRbMHglOHhdIFZhbHVlWzB4JTh4XSIsCisJCXJlZ19iYXNlLCByZWdfb2Zmc2V0LCByZWdfdmFsdWUpOworCisJY2FtX2lvX3dfbWIocmVnX3ZhbHVlLAorCQlzb2NfaW5mby0+cmVnX21hcFtyZWdfaW5kZXhdLm1lbV9iYXNlICsgcmVnX29mZnNldCk7Cit9CisKK3VpbnQzMl90IGNhbV9mZF9zb2NfcmVnaXN0ZXJfcmVhZChzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwllbnVtIGNhbV9mZF9yZWdfYmFzZSByZWdfYmFzZSwgdWludDMyX3QgcmVnX29mZnNldCkKK3sKKwlzdHJ1Y3QgY2FtX2ZkX3NvY19wcml2YXRlICpzb2NfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgY2FtX2ZkX3NvY19wcml2YXRlICopc29jX2luZm8tPnNvY19wcml2YXRlOworCWludDMyX3QgcmVnX2luZGV4ID0gc29jX3ByaXZhdGUtPnJlZ2Jhc2VfaW5kZXhbcmVnX2Jhc2VdOworCXVpbnQzMl90IHJlZ192YWx1ZTsKKworCXJlZ192YWx1ZSA9IGNhbV9pb19yX21iKAorCQlzb2NfaW5mby0+cmVnX21hcFtyZWdfaW5kZXhdLm1lbV9iYXNlICsgcmVnX29mZnNldCk7CisKKwlDQU1fREJHKENBTV9GRCwgIkZEX1JFR19SRUFEOiBCYXNlWyVkXSBPZmZzZXRbMHglOHhdIFZhbHVlWzB4JTh4XSIsCisJCXJlZ19iYXNlLCByZWdfb2Zmc2V0LCByZWdfdmFsdWUpOworCisJcmV0dXJuIHJlZ192YWx1ZTsKK30KKworaW50IGNhbV9mZF9zb2NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbykKK3sKKwlzdHJ1Y3QgY2FtX2ZkX3NvY19wcml2YXRlICpzb2NfcHJpdmF0ZSA9IHNvY19pbmZvLT5zb2NfcHJpdmF0ZTsKKwlzdHJ1Y3QgY2FtX2FoYl92b3RlIGFoYl92b3RlOworCXN0cnVjdCBjYW1fYXhpX3ZvdGUgYXhpX3ZvdGU7CisJaW50IHJjOworCisJYWhiX3ZvdGUudHlwZSA9IENBTV9WT1RFX0FCU09MVVRFOworCWFoYl92b3RlLnZvdGUubGV2ZWwgPSBDQU1fU1ZTX1ZPVEU7CisJYXhpX3ZvdGUuY29tcHJlc3NlZF9idyA9IDcyMDAwMDA7CisJYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gNzIwMDAwMDsKKwlyYyA9IGNhbV9jcGFzX3N0YXJ0KHNvY19wcml2YXRlLT5jcGFzX2hhbmRsZSwgJmFoYl92b3RlLCAmYXhpX3ZvdGUpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkVycm9yIGluIENQQVMgU1RBUlQsIHJjPSVkIiwgcmMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGNhbV9zb2NfdXRpbF9lbmFibGVfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8sIHRydWUsIENBTV9TVlNfVk9URSwKKwkJdHJ1ZSk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgZW5hYmxlIHBsYXRmb3JtIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCWdvdG8gc3RvcF9jcGFzOworCX0KKworCXJldHVybiByYzsKKworc3RvcF9jcGFzOgorCWlmIChjYW1fY3Bhc19zdG9wKHNvY19wcml2YXRlLT5jcGFzX2hhbmRsZSkpCisJCUNBTV9FUlIoQ0FNX0ZELCAiRXJyb3IgaW4gQ1BBUyBTVE9QIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworaW50IGNhbV9mZF9zb2NfZGlzYWJsZV9yZXNvdXJjZXMoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pCit7CisJc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSAqc29jX3ByaXZhdGU7CisJaW50IHJjID0gMDsKKworCWlmICghc29jX2luZm8pIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJJbnZhbGlkIHNvY19pbmZvIHBhcmFtIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzb2NfcHJpdmF0ZSA9IHNvY19pbmZvLT5zb2NfcHJpdmF0ZTsKKworCXJjID0gY2FtX3NvY191dGlsX2Rpc2FibGVfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8sIHRydWUsIHRydWUpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgImRpc2FibGUgcGxhdGZvcm0gcmVzb3VyY2VzIGZhaWxlZCwgcmM9JWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGNhbV9jcGFzX3N0b3Aoc29jX3ByaXZhdGUtPmNwYXNfaGFuZGxlKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJFcnJvciBpbiBDUEFTIFNUT1AsIGhhbmRsZT0weCV4LCByYz0lZCIsCisJCQlzb2NfcHJpdmF0ZS0+Y3Bhc19oYW5kbGUsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGNhbV9mZF9zb2NfaW5pdF9yZXNvdXJjZXMoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8sCisJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlciwgdm9pZCAqcHJpdmF0ZV9kYXRhKQoreworCXN0cnVjdCBjYW1fZmRfc29jX3ByaXZhdGUgKnNvY19wcml2YXRlOworCXN0cnVjdCBjYW1fY3Bhc19yZWdpc3Rlcl9wYXJhbXMgY3Bhc19yZWdpc3Rlcl9wYXJhbTsKKwlpbnQgcmM7CisKKwlyYyA9IGNhbV9zb2NfdXRpbF9nZXRfZHRfcHJvcGVydGllcyhzb2NfaW5mbyk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0ZELCAiRmFpbGVkIGluIGdldF9kdF9wcm9wZXJ0aWVzLCByYz0lZCIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY2FtX3NvY191dGlsX3JlcXVlc3RfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8sIGlycV9oYW5kbGVyLAorCQlwcml2YXRlX2RhdGEpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiByZXF1ZXN0X3BsYXRmb3JtX3Jlc291cmNlIHJjPSVkIiwKKwkJCXJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY2FtX2ZkX3NvY19zZXRfY2xrX2ZsYWdzKHNvY19pbmZvKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJmYWlsZWQgaW4gc2V0X2Nsa19mbGFncyByYz0lZCIsIHJjKTsKKwkJZ290byByZWxlYXNlX3JlczsKKwl9CisKKwlzb2NfcHJpdmF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fZmRfc29jX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvY19wcml2YXRlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX3JlczsKKwl9CisJc29jX2luZm8tPnNvY19wcml2YXRlID0gc29jX3ByaXZhdGU7CisKKwlyYyA9IGNhbV9mZF9od19zb2NfdXRpbF9zZXR1cF9yZWdiYXNlX2luZGljZXMoc29jX2luZm8pOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9GRCwgIkZhaWxlZCBpbiBzZXR1cCByZWdiYXNlLCByYz0lZCIsIHJjKTsKKwkJZ290byBmcmVlX3NvY19wcml2YXRlOworCX0KKworCW1lbXNldCgmY3Bhc19yZWdpc3Rlcl9wYXJhbSwgMCwgc2l6ZW9mKGNwYXNfcmVnaXN0ZXJfcGFyYW0pKTsKKwlzdHJsY3B5KGNwYXNfcmVnaXN0ZXJfcGFyYW0uaWRlbnRpZmllciwgImZkIiwgQ0FNX0hXX0lERU5USUZJRVJfTEVOR1RIKTsKKwljcGFzX3JlZ2lzdGVyX3BhcmFtLmNlbGxfaW5kZXggPSBzb2NfaW5mby0+aW5kZXg7CisJY3Bhc19yZWdpc3Rlcl9wYXJhbS5kZXYgPSAmc29jX2luZm8tPnBkZXYtPmRldjsKKwljcGFzX3JlZ2lzdGVyX3BhcmFtLnVzZXJkYXRhID0gcHJpdmF0ZV9kYXRhOworCWNwYXNfcmVnaXN0ZXJfcGFyYW0uY2FtX2NwYXNfY2xpZW50X2NiID0gY2FtX2ZkX2h3X3V0aWxfY3Bhc19jYWxsYmFjazsKKworCXJjID0gY2FtX2NwYXNfcmVnaXN0ZXJfY2xpZW50KCZjcGFzX3JlZ2lzdGVyX3BhcmFtKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRkQsICJDUEFTIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBmcmVlX3NvY19wcml2YXRlOworCX0KKwlzb2NfcHJpdmF0ZS0+Y3Bhc19oYW5kbGUgPSBjcGFzX3JlZ2lzdGVyX3BhcmFtLmNsaWVudF9oYW5kbGU7CisJQ0FNX0RCRyhDQU1fRkQsICJDUEFTIGhhbmRsZT0lZCIsIHNvY19wcml2YXRlLT5jcGFzX2hhbmRsZSk7CisKKwlyZXR1cm4gcmM7CisKK2ZyZWVfc29jX3ByaXZhdGU6CisJa2ZyZWUoc29jX2luZm8tPnNvY19wcml2YXRlKTsKKwlzb2NfaW5mby0+c29jX3ByaXZhdGUgPSBOVUxMOworcmVsZWFzZV9yZXM6CisJY2FtX3NvY191dGlsX3JlbGVhc2VfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8pOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2FtX2ZkX3NvY19kZWluaXRfcmVzb3VyY2VzKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKQoreworCXN0cnVjdCBjYW1fZmRfc29jX3ByaXZhdGUgKnNvY19wcml2YXRlID0KKwkJKHN0cnVjdCBjYW1fZmRfc29jX3ByaXZhdGUgKilzb2NfaW5mby0+c29jX3ByaXZhdGU7CisJaW50IHJjOworCisJcmMgPSBjYW1fY3Bhc191bnJlZ2lzdGVyX2NsaWVudChzb2NfcHJpdmF0ZS0+Y3Bhc19oYW5kbGUpOworCWlmIChyYykKKwkJQ0FNX0VSUihDQU1fRkQsICJVbnJlZ2lzdGVyIGNwYXMgZmFpbGVkLCBoYW5kbGU9JWQsIHJjPSVkIiwKKwkJCXNvY19wcml2YXRlLT5jcGFzX2hhbmRsZSwgcmMpOworCisJcmMgPSBjYW1fc29jX3V0aWxfcmVsZWFzZV9wbGF0Zm9ybV9yZXNvdXJjZShzb2NfaW5mbyk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9GRCwgInJlbGVhc2UgcGxhdGZvcm0gZmFpbGVkLCByYz0lZCIsIHJjKTsKKworCWtmcmVlKHNvY19pbmZvLT5zb2NfcHJpdmF0ZSk7CisJc29jX2luZm8tPnNvY19wcml2YXRlID0gTlVMTDsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19zb2MuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fZmQvZmRfaHdfbWdyL2ZkX2h3L2NhbV9mZF9od19zb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTIyMjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvZmRfaHcvY2FtX2ZkX2h3X3NvYy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DQU1fRkRfSFdfU09DX0hfCisjZGVmaW5lIF9DQU1fRkRfSFdfU09DX0hfCisKKyNpbmNsdWRlICJjYW1fc29jX3V0aWwuaCIKKworLyoqCisgKiBlbnVtIGNhbV9mZF9yZWdfYmFzZSAtIEVudW0gZm9yIEZEIHJlZ2lzdGVyIHNldHMKKyAqCisgKiBAQ0FNX0ZEX1JFR19DT1JFICAgIDogSW5kaWNhdGVzIEZEIENvcmUgcmVnaXN0ZXIgc3BhY2UKKyAqIEBDQU1fRkRfUkVHX1dSQVBQRVIgOiBJbmRpY2F0ZXMgRkQgV3JhcHBlciByZWdpc3RlciBzcGFjZQorICogQENBTV9GRF9SRUdfTUFYICAgICA6IE1heCBudW1iZXIgb2YgcmVnaXN0ZXIgc2V0cyBzdXBwb3J0ZWQKKyAqLworZW51bSBjYW1fZmRfcmVnX2Jhc2UgeworCUNBTV9GRF9SRUdfQ09SRSwKKwlDQU1fRkRfUkVHX1dSQVBQRVIsCisJQ0FNX0ZEX1JFR19NQVgKK307CisKKy8qKgorICogc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSA6IEZEIHByaXZhdGUgU09DIGluZm9ybWF0aW9uCisgKgorICogQHJlZ2Jhc2VfaW5kZXggOiBNYXBwaW5nIGJldHdlZW4gUmVnaXN0ZXIgYmFzZSBlbnVtIHRvIHJlZ2lzdGVyIGluZGV4IGluIFNPQworICogQGNwYXNfaGFuZGxlICAgOiBDUEFTIGhhbmRsZQorICoKKyAqLworc3RydWN0IGNhbV9mZF9zb2NfcHJpdmF0ZSB7CisJaW50MzJfdCAgICAgICAgcmVnYmFzZV9pbmRleFtDQU1fRkRfUkVHX01BWF07CisJdWludDMyX3QgICAgICAgY3Bhc19oYW5kbGU7Cit9OworCitpbnQgY2FtX2ZkX3NvY19pbml0X3Jlc291cmNlcyhzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwlpcnFfaGFuZGxlcl90IGlycV9oYW5kbGVyLCB2b2lkICpwcml2YXRlX2RhdGEpOworaW50IGNhbV9mZF9zb2NfZGVpbml0X3Jlc291cmNlcyhzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbyk7CitpbnQgY2FtX2ZkX3NvY19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKTsKK2ludCBjYW1fZmRfc29jX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKTsKK3VpbnQzMl90IGNhbV9mZF9zb2NfcmVnaXN0ZXJfcmVhZChzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwllbnVtIGNhbV9mZF9yZWdfYmFzZSByZWdfYmFzZSwgdWludDMyX3QgcmVnX29mZnNldCk7Cit2b2lkIGNhbV9mZF9zb2NfcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8sCisJZW51bSBjYW1fZmRfcmVnX2Jhc2UgcmVnX2Jhc2UsIHVpbnQzMl90IHJlZ19vZmZzZXQsIHVpbnQzMl90IHJlZ192YWx1ZSk7CisKKyNlbmRpZiAvKiBfQ0FNX0ZEX0hXX1NPQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvZmRfaHcvY2FtX2ZkX2h3X3Y0MS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9mZC9mZF9od19tZ3IvZmRfaHcvY2FtX2ZkX2h3X3Y0MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDQ4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ZkL2ZkX2h3X21nci9mZF9ody9jYW1fZmRfaHdfdjQxLmgKQEAgLTAsMCArMSw3MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0NBTV9GRF9IV19WNDFfSF8KKyNkZWZpbmUgX0NBTV9GRF9IV19WNDFfSF8KKworc3RhdGljIHN0cnVjdCBjYW1fZmRfaHdfc3RhdGljX2luZm8gY2FtX2ZkX3dyYXBwZXIxMjBfY29yZTQxMF9pbmZvID0geworCS5jb3JlX3ZlcnNpb24gPSB7CisJCS5tYWpvciAgPSA0LAorCQkubWlub3IgID0gMSwKKwkJLmluY3IgICA9IDAsCisJfSwKKwkud3JhcHBlcl92ZXJzaW9uID0geworCQkubWFqb3IgID0gMSwKKwkJLm1pbm9yICA9IDIsCisJCS5pbmNyICAgPSAwLAorCX0sCisJLmNvcmVfcmVncyA9IHsKKwkJLnZlcnNpb24gICAgICAgICAgICAgICA9IDB4MzgsCisJCS5jb250cm9sICAgICAgICAgICAgICAgPSAweDAsCisJCS5yZXN1bHRfY250ICAgICAgICAgICAgPSAweDQsCisJCS5yZXN1bHRfYWRkciAgICAgICAgICAgPSAweDIwLAorCQkuaW1hZ2VfYWRkciAgICAgICAgICAgID0gMHgyNCwKKwkJLndvcmtfYWRkciAgICAgICAgICAgICA9IDB4MjgsCisJCS5yb19tb2RlICAgICAgICAgICAgICAgPSAweDM0LAorCQkucmVzdWx0c19yZWdfYmFzZSAgICAgID0gMHg0MDAsCisJCS5yYXdfcmVzdWx0c19yZWdfYmFzZSAgPSAweDgwMCwKKwl9LAorCS53cmFwcGVyX3JlZ3MgPSB7CisJCS53cmFwcGVyX3ZlcnNpb24gICAgICAgPSAweDAsCisJCS5jZ2NfZGlzYWJsZSAgICAgICAgICAgPSAweDQsCisJCS5od19zdG9wICAgICAgICAgICAgICAgPSAweDgsCisJCS5zd19yZXNldCAgICAgICAgICAgICAgPSAweDEwLAorCQkudmJpZl9yZXFfcHJpb3JpdHkgICAgID0gMHgyMCwKKwkJLnZiaWZfcHJpb3JpdHlfbGV2ZWwgICA9IDB4MjQsCisJCS52YmlmX2RvbmVfc3RhdHVzICAgICAgPSAweDM0LAorCQkuaXJxX21hc2sgICAgICAgICAgICAgID0gMHg1MCwKKwkJLmlycV9zdGF0dXMgICAgICAgICAgICA9IDB4NTQsCisJCS5pcnFfY2xlYXIgICAgICAgICAgICAgPSAweDU4LAorCX0sCisJLnJlc3VsdHMgPSB7CisJCS5tYXhfZmFjZXMgICAgICAgICAgICAgPSAzNSwKKwkJLnBlcl9mYWNlX2VudHJpZXMgICAgICA9IDQsCisJCS5yYXdfcmVzdWx0c19hdmFpbGFibGUgPSB0cnVlLAorCQkucmF3X3Jlc3VsdHNfZW50cmllcyAgID0gNTEyLAorCX0sCisJLmVuYWJsZV9lcnJhdGFfd2EgPSB7CisJCS5zaW5nbGVfaXJxX29ubHkgICAgICAgICA9IHRydWUsCisJCS5yb19tb2RlX2VuYWJsZV9hbHdheXMgICA9IHRydWUsCisJCS5yb19tb2RlX3Jlc3VsdHNfaW52YWxpZCA9IHRydWUsCisJfSwKKwkuaXJxX21hc2sgPSBDQU1fRkRfSVJRX1RPX01BU0soQ0FNX0ZEX0lSUV9GUkFNRV9ET05FKSB8CisJCUNBTV9GRF9JUlFfVE9fTUFTSyhDQU1fRkRfSVJRX0hBTFRfRE9ORSkgfAorCQlDQU1fRkRfSVJRX1RPX01BU0soQ0FNX0ZEX0lSUV9SRVNFVF9ET05FKSwKKwkucW9zX3ByaW9yaXR5ICAgICAgID0gNCwKKwkucW9zX3ByaW9yaXR5X2xldmVsID0gNCwKKwkuc3VwcG9ydGVkX21vZGVzICAgID0gQ0FNX0ZEX01PREVfRkFDRURFVEVDVElPTiB8IENBTV9GRF9NT0RFX1BZUkFNSUQsCisJLnJvX21vZGVfc3VwcG9ydGVkICA9IHRydWUsCit9OworCisjZW5kaWYgLyogX0NBTV9GRF9IV19WNDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2NhbV9pY3Bfc3ViZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9jYW1faWNwX3N1YmRldi5jCmluZGV4IGJiZGZmMjcuLjhhMGQ1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2NhbV9pY3Bfc3ViZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvY2FtX2ljcF9zdWJkZXYuYwpAQCAtNDEsOCArNDEsOCBAQAogc3RydWN0IGNhbV9pY3Bfc3ViZGV2IHsKIAlzdHJ1Y3QgY2FtX3N1YmRldiBzZDsKIAlzdHJ1Y3QgY2FtX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGNhbV9jb250ZXh0IGN0eFtDQU1fQ1RYX01BWF07Ci0Jc3RydWN0IGNhbV9pY3BfY29udGV4dCBjdHhfaWNwW0NBTV9DVFhfTUFYXTsKKwlzdHJ1Y3QgY2FtX2NvbnRleHQgY3R4W0NBTV9JQ1BfQ1RYX01BWF07CisJc3RydWN0IGNhbV9pY3BfY29udGV4dCBjdHhfaWNwW0NBTV9JQ1BfQ1RYX01BWF07CiAJc3RydWN0IG11dGV4IGljcF9sb2NrOwogCWludDMyX3Qgb3Blbl9jbnQ7CiAJaW50MzJfdCByZXNlcnZlZDsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCQlnb3RvIGh3X2luaXRfZmFpbDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQ0FNX0NUWF9NQVg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBDQU1fSUNQX0NUWF9NQVg7IGkrKykgewogCQlnX2ljcF9kZXYuY3R4X2ljcFtpXS5iYXNlID0gJmdfaWNwX2Rldi5jdHhbaV07CiAJCXJjID0gY2FtX2ljcF9jb250ZXh0X2luaXQoJmdfaWNwX2Rldi5jdHhfaWNwW2ldLAogCQkJCQlod19tZ3JfaW50Zik7CkBAIC0xNzUsNyArMTc1LDcgQEAKIAl9CiAKIAlyYyA9IGNhbV9ub2RlX2luaXQobm9kZSwgaHdfbWdyX2ludGYsIGdfaWNwX2Rldi5jdHgsCi0JCQkJQ0FNX0NUWF9NQVgsIENBTV9JQ1BfREVWX05BTUUpOworCQkJCUNBTV9JQ1BfQ1RYX01BWCwgQ0FNX0lDUF9ERVZfTkFNRSk7CiAJaWYgKHJjKSB7CiAJCUNBTV9FUlIoQ0FNX0lDUCwgIklDUCBub2RlIGluaXQgZmFpbGVkIik7CiAJCWdvdG8gY3R4X2ZhaWw7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IENBTV9DVFhfTUFYOyBpKyspCisJZm9yIChpID0gMDsgaSA8IENBTV9JQ1BfQ1RYX01BWDsgaSsrKQogCQljYW1faWNwX2NvbnRleHRfZGVpbml0KCZnX2ljcF9kZXYuY3R4X2ljcFtpXSk7CiAJY2FtX25vZGVfZGVpbml0KGdfaWNwX2Rldi5ub2RlKTsKIAljYW1fc3ViZGV2X3JlbW92ZSgmZ19pY3BfZGV2LnNkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9hNV9ody9hNV9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9hNV9ody9hNV9kZXYuYwppbmRleCBkYWZmYWU4Li45OWUyZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvYTVfaHcvYTVfZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2E1X2h3L2E1X2Rldi5jCkBAIC05Niw2ICs5Niw4IEBACiAJfQogCiAJYTVfZGV2LT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlhNV9kZXYtPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJYTVfZGV2LT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJYTVfZGV2X2ludGYtPmh3X3ByaXYgPSBhNV9kZXY7CiAJYTVfZGV2X2ludGYtPmh3X29wcy5pbml0ID0gY2FtX2E1X2luaXRfaHc7CiAJYTVfZGV2X2ludGYtPmh3X29wcy5kZWluaXQgPSBjYW1fYTVfZGVpbml0X2h3OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2Jwc19ody9icHNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2Jwc19ody9icHNfY29yZS5jCmluZGV4IDU1YTJlMWIuLjM0NzNkMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvYnBzX2h3L2Jwc19jb3JlLmMKQEAgLTc1LDggKzc1LDggQEAKIAogCWNwYXNfdm90ZS5haGJfdm90ZS50eXBlID0gQ0FNX1ZPVEVfQUJTT0xVVEU7CiAJY3Bhc192b3RlLmFoYl92b3RlLnZvdGUubGV2ZWwgPSBDQU1fU1ZTX1ZPVEU7Ci0JY3Bhc192b3RlLmF4aV92b3RlLmNvbXByZXNzZWRfYncgPSBJQ1BfVFVSQk9fVk9URTsKLQljcGFzX3ZvdGUuYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gSUNQX1RVUkJPX1ZPVEU7CisJY3Bhc192b3RlLmF4aV92b3RlLmNvbXByZXNzZWRfYncgPSBDQU1fQ1BBU19ERUZBVUxUX0FYSV9CVzsKKwljcGFzX3ZvdGUuYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gQ0FNX0NQQVNfREVGQVVMVF9BWElfQlc7CiAKIAlyYyA9IGNhbV9jcGFzX3N0YXJ0KGNvcmVfaW5mby0+Y3Bhc19oYW5kbGUsCiAJCQkmY3Bhc192b3RlLmFoYl92b3RlLCAmY3Bhc192b3RlLmF4aV92b3RlKTsKQEAgLTI2OSw2ICsyNjksMTMgQEAKIAljYXNlIENBTV9JQ1BfQlBTX0NNRF9QT1dFUl9SRVNVTUU6CiAJCXJjID0gY2FtX2Jwc19oYW5kbGVfcmVzdW1lKGJwc19kZXYpOwogCQlicmVhazsKKwljYXNlIENBTV9JQ1BfQlBTX0NNRF9VUERBVEVfQ0xLOiB7CisJCXVpbnQzMl90IGNsa19yYXRlID0gKih1aW50MzJfdCAqKWNtZF9hcmdzOworCisJCUNBTV9EQkcoQ0FNX0lDUCwgImJwc19zcmNfY2xrIHJhdGUgPSAlZCIsIChpbnQpY2xrX3JhdGUpOworCQlyYyA9IGNhbV9icHNfdXBkYXRlX2Nsa19yYXRlKHNvY19pbmZvLCBjbGtfcmF0ZSk7CisJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvYnBzX2h3L2Jwc19kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX2Rldi5jCmluZGV4IDQxOWJiNTIuLjBlMzZlYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX2Rldi5jCkBAIC03OCw2ICs3OCw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlicHNfZGV2LT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlicHNfZGV2LT5zb2NfaW5mby5kZXYgPSAmcGRldi0+ZGV2OworCWJwc19kZXYtPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAlicHNfZGV2X2ludGYtPmh3X3ByaXYgPSBicHNfZGV2OwogCWJwc19kZXZfaW50Zi0+aHdfb3BzLmluaXQgPSBjYW1fYnBzX2luaXRfaHc7CiAJYnBzX2Rldl9pbnRmLT5od19vcHMuZGVpbml0ID0gY2FtX2Jwc19kZWluaXRfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvYnBzX2h3L2Jwc19zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX3NvYy5jCmluZGV4IDA3ZGFjYjIuLjI0NzdlN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX3NvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX3NvYy5jCkBAIC0xMzIsMyArMTMyLDEzIEBACiAKIAlyZXR1cm4gcmM7CiB9CisKK2ludCBjYW1fYnBzX3VwZGF0ZV9jbGtfcmF0ZShzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwl1aW50MzJfdCBjbGtfcmF0ZSkKK3sKKwlpZiAoIXNvY19pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjYW1fc29jX3V0aWxfc2V0X2Nsa19yYXRlKHNvY19pbmZvLT5jbGtbc29jX2luZm8tPnNyY19jbGtfaWR4XSwKKwkJc29jX2luZm8tPmNsa19uYW1lW3NvY19pbmZvLT5zcmNfY2xrX2lkeF0sIGNsa19yYXRlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9icHNfaHcvYnBzX3NvYy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2Jwc19ody9icHNfc29jLmgKaW5kZXggM2NmZmIwOS4uMmRkMmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2Jwc19ody9icHNfc29jLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2Jwc19ody9icHNfc29jLmgKQEAgLTI2LDQgKzI2LDYgQEAKIAogaW50IGNhbV9icHNfdHJhbnNmZXJfZ2RzY19jb250cm9sKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKTsKIAoraW50IGNhbV9icHNfdXBkYXRlX2Nsa19yYXRlKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvLAorCXVpbnQzMl90IGNsa19yYXRlKTsKICNlbmRpZiAvKiBfQ0FNX0JQU19TT0NfSF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvY2FtX2ljcF9od19tZ3IuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2NhbV9pY3BfaHdfbWdyLmMKaW5kZXggNTA1NWU4ZC4uMzg0NDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvY2FtX2ljcF9od19tZ3IuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9jYW1faWNwX2h3X21nci5jCkBAIC00NSwxMyArNDUsNjU5IEBACiAjaW5jbHVkZSAiYTVfY29yZS5oIgogI2luY2x1ZGUgImhmaV9zeXNfZGVmcy5oIgogI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCisjaW5jbHVkZSAiY2FtX3NvY191dGlsLmgiCiAKLSNkZWZpbmUgSUNQX1dPUktRX05VTV9UQVNLICAgICAgMzAKICNkZWZpbmUgSUNQX1dPUktRX1RBU0tfQ01EX1RZUEUgMQogI2RlZmluZSBJQ1BfV09SS1FfVEFTS19NU0dfVFlQRSAyCiAKIHN0YXRpYyBzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgaWNwX2h3X21ncjsKIAorc3RhdGljIHZvaWQgY2FtX2ljcF9od19tZ3JfY2xrX2luZm9fdXBkYXRlKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSkKK3sKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqaHdfbWdyX2Nsa19pbmZvOworCisJaWYgKGN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mby0+ZGV2X3R5cGUgPT0gQ0FNX0lDUF9SRVNfVFlQRV9CUFMpCisJCWh3X21ncl9jbGtfaW5mbyA9ICZod19tZ3ItPmNsa19pbmZvW0lDUF9DTEtfSFdfQlBTXTsKKwllbHNlCisJCWh3X21ncl9jbGtfaW5mbyA9ICZod19tZ3ItPmNsa19pbmZvW0lDUF9DTEtfSFdfSVBFXTsKKworCWlmIChod19tZ3JfY2xrX2luZm8tPmJhc2VfY2xrID49IGN0eF9kYXRhLT5jbGtfaW5mby5iYXNlX2NsaykKKwkJaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsayAtPSBjdHhfZGF0YS0+Y2xrX2luZm8uYmFzZV9jbGs7Cit9CisKK3N0YXRpYyB2b2lkIGNhbV9pY3BfaHdfbWdyX3Jlc2V0X2Nsa19pbmZvKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElDUF9DTEtfSFdfTUFYOyBpKyspIHsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS5iYXNlX2NsayA9IDA7CisJCWh3X21nci0+Y2xrX2luZm9baV0uY3Vycl9jbGsgPSBJQ1BfVFVSQk9fVk9URTsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS50aHJlc2hvbGQgPSBJQ1BfT1ZFUl9DTEtfVEhSRVNIT0xEOworCQlod19tZ3ItPmNsa19pbmZvW2ldLm92ZXJfY2xrZWQgPSAwOworCQlod19tZ3ItPmNsa19pbmZvW2ldLnVuY29tcHJlc3NlZF9idyA9IENBTV9DUEFTX0RFRkFVTFRfQVhJX0JXOworCQlod19tZ3ItPmNsa19pbmZvW2ldLmNvbXByZXNzZWRfYncgPSBDQU1fQ1BBU19ERUZBVUxUX0FYSV9CVzsKKwl9CisJaHdfbWdyLT5pY3BfZGVmYXVsdF9jbGsgPSBJQ1BfU1ZTX1ZPVEU7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9nZXRfYWN0dWFsX2Nsa19yYXRlX2lkeCgKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsIHVpbnQzMl90IGJhc2VfY2xrKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENBTV9NQVhfVk9URTsgaSsrKQorCQlpZiAoY3R4X2RhdGEtPmNsa19pbmZvLmNsa19yYXRlW2ldID49IGJhc2VfY2xrKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgY2FtX2ljcF9pc19vdmVyX2NsayhzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsCisJc3RydWN0IGNhbV9pY3BfY2xrX2luZm8gKmh3X21ncl9jbGtfaW5mbykKK3sKKwlpbnQgYmFzZV9jbGtfaWR4OworCWludCBjdXJyX2Nsa19pZHg7CisKKwliYXNlX2Nsa19pZHggPSBjYW1faWNwX2dldF9hY3R1YWxfY2xrX3JhdGVfaWR4KGN0eF9kYXRhLAorCQlod19tZ3JfY2xrX2luZm8tPmJhc2VfY2xrKTsKKworCWN1cnJfY2xrX2lkeCA9IGNhbV9pY3BfZ2V0X2FjdHVhbF9jbGtfcmF0ZV9pZHgoY3R4X2RhdGEsCisJCWh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGspOworCisJQ0FNX0RCRyhDQU1fSUNQLCAiYmNfaWR4ID0gJWQgY2NfaWR4ID0gJWQgJWxsZCAlbGxkIiwKKwkJYmFzZV9jbGtfaWR4LCBjdXJyX2Nsa19pZHgsIGh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGssCisJCWh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGspOworCisJaWYgKGN1cnJfY2xrX2lkeCA+IGJhc2VfY2xrX2lkeCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9nZXRfbG93ZXJfY2xrX3JhdGUoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLCB1aW50MzJfdCBiYXNlX2NsaykKK3sKKwlpbnQgaTsKKworCWkgPSBjYW1faWNwX2dldF9hY3R1YWxfY2xrX3JhdGVfaWR4KGN0eF9kYXRhLCBiYXNlX2Nsayk7CisKKwlpZiAoaSA+IDApCisJCXJldHVybiBjdHhfZGF0YS0+Y2xrX2luZm8uY2xrX3JhdGVbaSAtIDFdOworCisJQ0FNX0RCRyhDQU1fSUNQLCAiQWxyZWFkeSBjbGsgYXQgbG93ZXIgbGV2ZWwiKTsKKwlyZXR1cm4gYmFzZV9jbGs7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9nZXRfbmV4dF9jbGtfcmF0ZShzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsIHVpbnQzMl90IGJhc2VfY2xrKQoreworCWludCBpOworCisJaSA9IGNhbV9pY3BfZ2V0X2FjdHVhbF9jbGtfcmF0ZV9pZHgoY3R4X2RhdGEsIGJhc2VfY2xrKTsKKworCWlmIChpIDwgQ0FNX01BWF9WT1RFIC0gMSkKKwkJcmV0dXJuIGN0eF9kYXRhLT5jbGtfaW5mby5jbGtfcmF0ZVtpICsgMV07CisKKwlDQU1fREJHKENBTV9JQ1AsICJBbHJlYWR5IGNsayBhdCBoaWdoZXIgbGV2ZWwiKTsKKworCXJldHVybiBiYXNlX2NsazsKK30KKworc3RhdGljIGludCBjYW1faWNwX2dldF9hY3R1YWxfY2xrX3JhdGUoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLCB1aW50MzJfdCBiYXNlX2NsaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDQU1fTUFYX1ZPVEU7IGkrKykKKwkJaWYgKGN0eF9kYXRhLT5jbGtfaW5mby5jbGtfcmF0ZVtpXSA+PSBiYXNlX2NsaykKKwkJCXJldHVybiBjdHhfZGF0YS0+Y2xrX2luZm8uY2xrX3JhdGVbaV07CisKKwlyZXR1cm4gYmFzZV9jbGs7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9zdXBwb3J0ZWRfY2xrX3JhdGVzKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbzsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmRldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2h3X2luZm8gKmRldiA9IE5VTEw7CisKKwlpZiAoY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5kZXZfdHlwZSA9PSBDQU1fSUNQX1JFU19UWVBFX0JQUykKKwkJZGV2X2ludGYgPSBod19tZ3ItPmRldmljZXNbQ0FNX0lDUF9ERVZfQlBTXVswXTsKKwllbHNlCisJCWRldl9pbnRmID0gaHdfbWdyLT5kZXZpY2VzW0NBTV9JQ1BfREVWX0lQRV1bMF07CisKKwlpZiAoIWRldl9pbnRmKSB7CisJCUNBTV9FUlIoQ0FNX0lDUCwgImRldl9pbnRmIGlzIGludmFsaWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRldiA9IChzdHJ1Y3QgY2FtX2h3X2luZm8gKilkZXZfaW50Zi0+aHdfcHJpdjsKKwlzb2NfaW5mbyA9ICZkZXYtPnNvY19pbmZvOworCisJZm9yIChpID0gMDsgaSA8IENBTV9NQVhfVk9URTsgaSsrKSB7CisJCWN0eF9kYXRhLT5jbGtfaW5mby5jbGtfcmF0ZVtpXSA9CisJCQlzb2NfaW5mby0+Y2xrX3JhdGVbaV1bc29jX2luZm8tPm51bV9jbGsgLSAxXTsKKwkJQ0FNX0RCRyhDQU1fSUNQLCAiY2xrX2luZm8gPSAlZCIsCisJCQljdHhfZGF0YS0+Y2xrX2luZm8uY2xrX3JhdGVbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9pY3BfY2xrX2lkeF9mcm9tX3JlcV9pZChzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsCisJdWludDY0X3QgcmVxX2lkKQoreworCXN0cnVjdCBoZmlfZnJhbWVfcHJvY2Vzc19pbmZvICpmcmFtZV9wcm9jZXNzOworCWludCBpOworCisJZnJhbWVfcHJvY2VzcyA9ICZjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0FNX0ZSQU1FX0NNRF9NQVg7IGkrKykKKwkJaWYgKGZyYW1lX3Byb2Nlc3MtPnJlcXVlc3RfaWRbaV0gPT0gcmVxX2lkKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1faWNwX2Nsa19pbmZvX2luaXQoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElDUF9DTEtfSFdfTUFYOyBpKyspIHsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS5iYXNlX2NsayA9IElDUF9UVVJCT19WT1RFOworCQlod19tZ3ItPmNsa19pbmZvW2ldLmN1cnJfY2xrID0gSUNQX1RVUkJPX1ZPVEU7CisJCWh3X21nci0+Y2xrX2luZm9baV0udGhyZXNob2xkID0gSUNQX09WRVJfQ0xLX1RIUkVTSE9MRDsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS5vdmVyX2Nsa2VkID0gMDsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS51bmNvbXByZXNzZWRfYncgPSBDQU1fQ1BBU19ERUZBVUxUX0FYSV9CVzsKKwkJaHdfbWdyLT5jbGtfaW5mb1tpXS5jb21wcmVzc2VkX2J3ID0gQ0FNX0NQQVNfREVGQVVMVF9BWElfQlc7CisJfQorCWh3X21nci0+aWNwX2RlZmF1bHRfY2xrID0gSUNQX1NWU19WT1RFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9jdHhfY2xrX2luZm9faW5pdChzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEpCit7CisJY3R4X2RhdGEtPmNsa19pbmZvLmN1cnJfZmMgPSAwOworCWN0eF9kYXRhLT5jbGtfaW5mby5iYXNlX2NsayA9IDA7CisJY3R4X2RhdGEtPmNsa19pbmZvLnVuY29tcHJlc3NlZF9idyA9IDA7CisJY3R4X2RhdGEtPmNsa19pbmZvLmNvbXByZXNzZWRfYncgPSAwOworCWNhbV9pY3Bfc3VwcG9ydGVkX2Nsa19yYXRlcygmaWNwX2h3X21nciwgY3R4X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBjYW1faWNwX21ncl9jYWxjX2Jhc2VfY2xrKHVpbnQzMl90IGZyYW1lX2N5Y2xlcywKKwl1aW50NjRfdCBidWRnZXQpCit7CisJdWludDY0X3QgYmFzZV9jbGs7CisJdWludDY0X3QgbXVsID0gMTAwMDAwMDAwMDsKKworCWJhc2VfY2xrID0gKGZyYW1lX2N5Y2xlcyAqIG11bCkgLyBidWRnZXQ7CisKKwlDQU1fREJHKENBTV9JQ1AsICJidWRnZXQgPSAlbGxkIGZjID0gJWQgaWIgPSAlbGxkIGJhc2VfY2xrID0gJWxsZCIsCisJCWJ1ZGdldCwgZnJhbWVfY3ljbGVzLAorCQkobG9uZyBsb25nIGludCkoZnJhbWVfY3ljbGVzICogbXVsKSwgYmFzZV9jbGspOworCisJcmV0dXJuIGJhc2VfY2xrOworfQorCitzdGF0aWMgYm9vbCBjYW1faWNwX2J1c3lfcHJldl9yZXFzKHN0cnVjdCBoZmlfZnJhbWVfcHJvY2Vzc19pbmZvICpmcm1fcHJvY2VzcywKKwl1aW50NjRfdCByZXFfaWQpCit7CisJaW50IGk7CisJaW50IGNudDsKKworCWZvciAoaSA9IDAsIGNudCA9IDA7IGkgPCBDQU1fRlJBTUVfQ01EX01BWDsgaSsrKSB7CisJCWlmIChmcm1fcHJvY2Vzcy0+cmVxdWVzdF9pZFtpXSkgeworCQkJaWYgKGZybV9wcm9jZXNzLT5md19wcm9jZXNzX2ZsYWdbaV0pIHsKKwkJCQlDQU1fREJHKENBTV9JQ1AsICJyIGlkID0gJWxsZCBidXN5ID0gJWQiLAorCQkJCQlmcm1fcHJvY2Vzcy0+cmVxdWVzdF9pZFtpXSwKKwkJCQkJZnJtX3Byb2Nlc3MtPmZ3X3Byb2Nlc3NfZmxhZ1tpXSk7CisJCQkJY250Kys7CisJCQl9CisJCX0KKwl9CisJaWYgKGNudCA+IDEpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGNhbV9pY3BfY2FsY190b3RhbF9jbGsoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfY2xrX2luZm8gKmh3X21ncl9jbGtfaW5mbywgdWludDMyX3QgZGV2X3R5cGUpCit7CisJaW50IGk7CisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhOworCisJaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsayA9IDA7CisJZm9yIChpID0gMDsgaSA8IENBTV9JQ1BfQ1RYX01BWDsgaSsrKSB7CisJCWN0eF9kYXRhID0gJmh3X21nci0+Y3R4X2RhdGFbaV07CisJCWlmIChjdHhfZGF0YS0+aW5fdXNlICYmCisJCQljdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09IGRldl90eXBlKQorCQkJaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsayArPQorCQkJCWN0eF9kYXRhLT5jbGtfaW5mby5iYXNlX2NsazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgY2FtX2ljcF91cGRhdGVfY2xrX2J1c3koc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLAorCXN0cnVjdCBjYW1faWNwX2Nsa19pbmZvICpod19tZ3JfY2xrX2luZm8sCisJc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgKmNsa19pbmZvLAorCXVpbnQzMl90IGJhc2VfY2xrKQoreworCXVpbnQzMl90IG5leHRfY2xrX2xldmVsOworCXVpbnQzMl90IGFjdHVhbF9jbGs7CisJYm9vbCByYyA9IGZhbHNlOworCisJLyogMS4gaWYgY3VycmVudCByZXF1ZXN0IGZyYW1lIGN5Y2xlcyhmYykgYXJlIG1vcmUgdGhhbiBwcmV2aW91cworCSAqICAgICAgZnJhbWUgZmMKKwkgKiAgICAgIENhbGN1bGF0ZSB0aGUgbmV3IGJhc2UgY2xvY2suCisJICogICAgICBpZiBzdW0gb2YgYmFzZSBjbG9ja3MgYXJlIG1vcmUgdGhhbiBuZXh0IGF2YWlsYWJsZSBjbGsgbGV2ZWwKKwkgKiAgICAgICBVcGRhdGUgY2xvY2sgcmF0ZSwgY2hhbmdlIGN1cnJfY2xrX3JhdGUgdG8gc3VtIG9mIGJhc2UgY2xvY2sKKwkgKiAgICAgICByYXRlcyBhbmQgbWFrZSBvdmVyX2Nsa2VkIHRvIHplcm8KKwkgKiAgICAgIGVsc2UKKwkgKiAgICAgICBVcGRhdGUgY2xvY2sgcmF0ZSB0byBuZXh0IGxldmVsLCB1cGRhdGUgY3Vycl9jbGtfcmF0ZSBhbmQgbWFrZQorCSAqICAgICAgIG92ZXJjbGtlZCBjbnQgdG8gemVybworCSAqIDIuIGlmIGN1cnJlbnQgZmMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHByZXZpb3VzICBmcmFtZSBmYworCSAqICAgICAgU3RpbGwgQnVtcCB1cCB0aGUgY2xvY2sgdG8gbmV4dCBhdmFpbGFibGUgbGV2ZWwKKwkgKiAgICAgIGlmIGl0IGlzIGF2YWlsYWJsZSwgdGhlbiB1cGRhdGUgY2xvY2ssIG1ha2Ugb3ZlcmNsayBjbnQgdG8KKwkgKiAgICAgIHplcm8uIElmIHRoZSBjbG9jayBpcyBhbHJlYWR5IGF0IGhpZ2hlc3QgY2xvY2sgcmF0ZSB0aGVuCisJICogICAgICBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgY2xvY2sKKwkgKi8KKwltdXRleF9sb2NrKCZod19tZ3ItPmh3X21ncl9tdXRleCk7CisJY3R4X2RhdGEtPmNsa19pbmZvLmN1cnJfZmMgPSBjbGtfaW5mby0+ZnJhbWVfY3ljbGVzOworCWN0eF9kYXRhLT5jbGtfaW5mby5iYXNlX2NsayA9IGJhc2VfY2xrOworCWh3X21ncl9jbGtfaW5mby0+b3Zlcl9jbGtlZCA9IDA7CisJaWYgKGNsa19pbmZvLT5mcmFtZV9jeWNsZXMgPiBjdHhfZGF0YS0+Y2xrX2luZm8uY3Vycl9mYykgeworCQljYW1faWNwX2NhbGNfdG90YWxfY2xrKGh3X21nciwgaHdfbWdyX2Nsa19pbmZvLAorCQkJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5kZXZfdHlwZSk7CisJCWFjdHVhbF9jbGsgPSBjYW1faWNwX2dldF9hY3R1YWxfY2xrX3JhdGUoaHdfbWdyLAorCQkJY3R4X2RhdGEsIGJhc2VfY2xrKTsKKwkJaWYgKGh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGsgPiBhY3R1YWxfY2xrKSB7CisJCQlod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrID0gaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsazsKKwkJfSBlbHNlIHsKKwkJCW5leHRfY2xrX2xldmVsID0gY2FtX2ljcF9nZXRfbmV4dF9jbGtfcmF0ZShod19tZ3IsCisJCQkJY3R4X2RhdGEsIGh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGspOworCQkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA9IG5leHRfY2xrX2xldmVsOworCQl9CisJCXJjID0gdHJ1ZTsKKwl9IGVsc2UgeworCQluZXh0X2Nsa19sZXZlbCA9CisJCQljYW1faWNwX2dldF9uZXh0X2Nsa19yYXRlKGh3X21nciwgY3R4X2RhdGEsCisJCQlod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrKTsKKwkJaWYgKGh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGsgPCBuZXh0X2Nsa19sZXZlbCkgeworCQkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA9IG5leHRfY2xrX2xldmVsOworCQkJcmMgPSB0cnVlOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaHdfbWdyLT5od19tZ3JfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgYm9vbCBjYW1faWNwX3VwZGF0ZV9jbGtfb3ZlcmNsa19mcmVlKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSwKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqaHdfbWdyX2Nsa19pbmZvLAorCXN0cnVjdCBjYW1faWNwX2Nsa19id19yZXF1ZXN0ICpjbGtfaW5mbywKKwl1aW50MzJfdCBiYXNlX2NsaykKK3sKKwlpbnQgcmMgPSBmYWxzZTsKKworCS8qCisJICogSW4gY2FzZW9mIG5vIHBlbmRpbmcgcGFja2V0cyBjYXNlCisJICogICAgMS4gSW4gY2FzZW9mIG92ZXJjbGsgY250IGlzIGxlc3MgdGhhbiB0aHJlc2hvbGQsIGluY3JlYXNlCisJICogICAgICAgb3ZlcmNsayBjb3VudCBhbmQgbm8gdXBkYXRlIGluIHRoZSBjbG9jayByYXRlCisJICogICAgMi4gSW4gY2FzZW9mIG92ZXJjbGsgY250IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aHJlc2hvbGQKKwkgKiAgICAgICB0aGVuIGxvd2VyIGNsb2NrIHJhdGUgYnkgb25lIGxldmVsIGFuZCB1cGRhdGUgaHdfbWdyIGN1cnJlbnQKKwkgKiAgICAgICBjbG9jayB2YWx1ZS4KKwkgKiAgICAgICAgYS4gSW4gY2FzZSBvZiBuZXcgY2xvY2sgcmF0ZSBncmVhdGVyIHRoYW4gc3VtIG9mIGNsb2NrCisJICogICAgICAgICAgIHJhdGVzLCByZXNldCBvdmVyY2xrIGNvdW50IHZhbHVlIHRvIHplcm8gaWYgaXQgaXMKKwkgKiAgICAgICAgICAgb3ZlcmNsb2NrCisJICogICAgICAgIGIuIGlmIGl0IGlzIGxlc3MgdGhhbiBzdW0gb2YgYmFzZSBjbG9ja3MgdGhlbiBnbyB0byBuZXh0CisJICogICAgICAgICAgIGxldmVsIG9mIGNsb2NrIGFuZCBtYWtlIG92ZXJjbGsgY291bnQgdG8gemVybworCSAqICAgICAgICBjLiBpZiBpdCBpcyBzYW1lIGFzIHN1bSBvZiBiYXNlIGNsb2NrIHJhdGVzIHVwZGF0ZSBvdmVyY2xvY2sKKwkgKiAgICAgICAgICAgY250IHRvIDAKKwkgKi8KKwlpZiAoaHdfbWdyX2Nsa19pbmZvLT5vdmVyX2Nsa2VkIDwgaHdfbWdyX2Nsa19pbmZvLT50aHJlc2hvbGQpIHsKKwkJaHdfbWdyX2Nsa19pbmZvLT5vdmVyX2Nsa2VkKys7CisJCXJjID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA9CisJCQljYW1faWNwX2dldF9sb3dlcl9jbGtfcmF0ZShod19tZ3IsIGN0eF9kYXRhLAorCQkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2Nsayk7CisJCWlmIChod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrID4gaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsaykgeworCQkJaWYgKGNhbV9pY3BfaXNfb3Zlcl9jbGsoaHdfbWdyLCBjdHhfZGF0YSwKKwkJCQlod19tZ3JfY2xrX2luZm8pKQorCQkJCWh3X21ncl9jbGtfaW5mby0+b3Zlcl9jbGtlZCA9IDA7CisJCX0gZWxzZSBpZiAoaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA8CisJCQlod19tZ3JfY2xrX2luZm8tPmJhc2VfY2xrKSB7CisJCQlod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrID0KKwkJCQljYW1faWNwX2dldF9uZXh0X2Nsa19yYXRlKGh3X21nciwgY3R4X2RhdGEsCisJCQkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2Nsayk7CisJCQkJaHdfbWdyX2Nsa19pbmZvLT5vdmVyX2Nsa2VkID0gMDsKKwkJfSBlbHNlIGlmIChod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrID09CisJCQlod19tZ3JfY2xrX2luZm8tPmJhc2VfY2xrKSB7CisJCQlod19tZ3JfY2xrX2luZm8tPm92ZXJfY2xrZWQgPSAwOworCQl9CisJCXJjID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIGNhbV9pY3BfdXBkYXRlX2Nsa19mcmVlKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSwKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqaHdfbWdyX2Nsa19pbmZvLAorCXN0cnVjdCBjYW1faWNwX2Nsa19id19yZXF1ZXN0ICpjbGtfaW5mbywKKwl1aW50MzJfdCBiYXNlX2NsaykKK3sKKwlpbnQgcmMgPSBmYWxzZTsKKwlib29sIG92ZXJfY2xvY2tlZCA9IGZhbHNlOworCisJY3R4X2RhdGEtPmNsa19pbmZvLmN1cnJfZmMgPSBjbGtfaW5mby0+ZnJhbWVfY3ljbGVzOworCWN0eF9kYXRhLT5jbGtfaW5mby5iYXNlX2NsayA9IGJhc2VfY2xrOworCW11dGV4X2xvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKwljYW1faWNwX2NhbGNfdG90YWxfY2xrKGh3X21nciwgaHdfbWdyX2Nsa19pbmZvLAorCQljdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlKTsKKwltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKworCS8qCisJICogQ3VycmVudCBjbG9jayBpcyBub3QgYWx3YXlzIHN1bSBvZiBiYXNlIGNsb2NrcywgZHVlIHRvCisJICogY2xvY2sgc2NhbGVzIHVwZGF0ZSB0byBuZXh0IGhpZ2hlciBvciBsb3dlciBsZXZlbHMsIGl0CisJICogZXF1YWxzIHRvIG9uZSBvZiBkaXNjcmV0ZSBjbG9jayB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLgorCSAqIFNvIGV2ZW4gY3VycmVudCBjbG9jayBpcyBoaWdoZXIgdGhhbiBzdW0gb2YgYmFzZSBjbG9ja3MsIHdlCisJICogY2FuIG5vdCBjb25zaWRlciBpdCBpcyBvdmVyIGNsb2NrZWQuIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbgorCSAqIGRpc2NyZXRlIGNsb2NrIGxldmVsIHRoZW4gb25seSBpdCBpcyBjb25zaWRlcmVkIGFzIG92ZXIgY2xvY2suCisJICogMS4gSGFuZGxlIG92ZXIgY2xvY2sgY2FzZQorCSAqIDIuIElmIGN1cnJlbnQgY2xvY2sgaXMgbGVzcyB0aGFuIHN1bSBvZiBiYXNlIGNsb2NrcworCSAqICAgIHVwZGF0ZSBjdXJyZW50IGNsb2NrCisJICogMy4gSWYgY3VycmVudCBjbG9jayBpcyBzYW1lIGFzIHN1bSBvZiBiYXNlIGNsb2NrcyBubyBhY3Rpb24KKwkgKi8KKworCW92ZXJfY2xvY2tlZCA9IGNhbV9pY3BfaXNfb3Zlcl9jbGsoaHdfbWdyLCBjdHhfZGF0YSwKKwkJaHdfbWdyX2Nsa19pbmZvKTsKKworCW11dGV4X2xvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKwlpZiAoaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA+IGh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGsgJiYKKwkJb3Zlcl9jbG9ja2VkKSB7CisJCXJjID0gY2FtX2ljcF91cGRhdGVfY2xrX292ZXJjbGtfZnJlZShod19tZ3IsIGN0eF9kYXRhLAorCQkJaHdfbWdyX2Nsa19pbmZvLCBjbGtfaW5mbywgYmFzZV9jbGspOworCX0gZWxzZSBpZiAoaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA+IGh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGspIHsKKwkJaHdfbWdyX2Nsa19pbmZvLT5vdmVyX2Nsa2VkID0gMDsKKwkJcmMgPSBmYWxzZTsKKwl9ICBlbHNlIGlmIChod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrIDwgaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsaykgeworCQlod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrID0gaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsazsKKwkJcmMgPSB0cnVlOworCX0KKwltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGJvb2wgY2FtX2ljcF9kZWJ1Z19jbGtfdXBkYXRlKHN0cnVjdCBjYW1faWNwX2Nsa19pbmZvICpod19tZ3JfY2xrX2luZm8pCit7CisJaWYgKGljcF9od19tZ3IuaWNwX2RlYnVnX2NsayA8IElDUF9UVVJCT19WT1RFICYmCisJCWljcF9od19tZ3IuaWNwX2RlYnVnX2NsayAmJgorCQlpY3BfaHdfbWdyLmljcF9kZWJ1Z19jbGsgIT0gaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsaykgeworCQltdXRleF9sb2NrKCZpY3BfaHdfbWdyLmh3X21ncl9tdXRleCk7CisJCWh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGsgPSBpY3BfaHdfbWdyLmljcF9kZWJ1Z19jbGs7CisJCWh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGsgPSBpY3BfaHdfbWdyLmljcF9kZWJ1Z19jbGs7CisJCWh3X21ncl9jbGtfaW5mby0+dW5jb21wcmVzc2VkX2J3ID0gaWNwX2h3X21nci5pY3BfZGVidWdfY2xrOworCQlod19tZ3JfY2xrX2luZm8tPmNvbXByZXNzZWRfYncgPSBpY3BfaHdfbWdyLmljcF9kZWJ1Z19jbGs7CisJCW11dGV4X3VubG9jaygmaWNwX2h3X21nci5od19tZ3JfbXV0ZXgpOworCQlDQU1fREJHKENBTV9JQ1AsICJiYyA9ICVkIGNjID0gJWQiLAorCQkJaHdfbWdyX2Nsa19pbmZvLT5iYXNlX2NsaywgaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2Nsayk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY2FtX2ljcF9kZWZhdWx0X2Nsa191cGRhdGUoc3RydWN0IGNhbV9pY3BfY2xrX2luZm8gKmh3X21ncl9jbGtfaW5mbykKK3sKKwlpZiAoaWNwX2h3X21nci5pY3BfZGVmYXVsdF9jbGsgIT0gaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsaykgeworCQltdXRleF9sb2NrKCZpY3BfaHdfbWdyLmh3X21ncl9tdXRleCk7CisJCWh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGsgPSBpY3BfaHdfbWdyLmljcF9kZWZhdWx0X2NsazsKKwkJaHdfbWdyX2Nsa19pbmZvLT5jdXJyX2NsayA9IGljcF9od19tZ3IuaWNwX2RlZmF1bHRfY2xrOworCQlod19tZ3JfY2xrX2luZm8tPnVuY29tcHJlc3NlZF9idyA9IGljcF9od19tZ3IuaWNwX2RlZmF1bHRfY2xrOworCQlod19tZ3JfY2xrX2luZm8tPmNvbXByZXNzZWRfYncgPSBpY3BfaHdfbWdyLmljcF9kZWZhdWx0X2NsazsKKwkJbXV0ZXhfdW5sb2NrKCZpY3BfaHdfbWdyLmh3X21ncl9tdXRleCk7CisJCUNBTV9EQkcoQ0FNX0lDUCwgImJjID0gJWQgY2MgPSAlZCIsCisJCQlod19tZ3JfY2xrX2luZm8tPmJhc2VfY2xrLCBod19tZ3JfY2xrX2luZm8tPmN1cnJfY2xrKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBjYW1faWNwX3VwZGF0ZV9idyhzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsCisJc3RydWN0IGNhbV9pY3BfY2xrX2luZm8gKmh3X21ncl9jbGtfaW5mbywKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfYndfcmVxdWVzdCAqY2xrX2luZm8sCisJYm9vbCBidXN5KQoreworCWludCBpOworCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHg7CisKKwkvKgorCSAqIElmIGN1cnJlbnQgcmVxdWVzdCBiYW5kd2lkdGggaXMgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgZnJhbWVzLCB0aGVuCisJICogcmVjYWxjdWxhdGUgYmFuZHdpZHRoIG9mIGFsbCBjb250ZXh0cyBvZiBzYW1lIGhhcmR3YXJlIGFuZCB1cGRhdGUKKwkgKiB2b3Rpbmcgb2YgYmFuZHdpZHRoCisJICovCisJaWYgKGNsa19pbmZvLT51bmNvbXByZXNzZWRfYncgPT0gY3R4X2RhdGEtPmNsa19pbmZvLnVuY29tcHJlc3NlZF9idykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGJ1c3kgJiYKKwkJY3R4X2RhdGEtPmNsa19pbmZvLnVuY29tcHJlc3NlZF9idyA+IGNsa19pbmZvLT51bmNvbXByZXNzZWRfYncpCisJCXJldHVybiBmYWxzZTsKKworCWN0eF9kYXRhLT5jbGtfaW5mby51bmNvbXByZXNzZWRfYncgPSBjbGtfaW5mby0+dW5jb21wcmVzc2VkX2J3OworCWN0eF9kYXRhLT5jbGtfaW5mby5jb21wcmVzc2VkX2J3ID0gY2xrX2luZm8tPmNvbXByZXNzZWRfYnc7CisJaHdfbWdyX2Nsa19pbmZvLT51bmNvbXByZXNzZWRfYncgPSAwOworCWh3X21ncl9jbGtfaW5mby0+Y29tcHJlc3NlZF9idyA9IDA7CisJZm9yIChpID0gMDsgaSA8IENBTV9JQ1BfQ1RYX01BWDsgaSsrKSB7CisJCWN0eCA9ICZod19tZ3ItPmN0eF9kYXRhW2ldOworCQlpZiAoY3R4LT5pbl91c2UgJiYKKwkJCWN0eC0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09CisJCQljdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlKSB7CisJCQltdXRleF9sb2NrKCZod19tZ3ItPmh3X21ncl9tdXRleCk7CisJCQlod19tZ3JfY2xrX2luZm8tPnVuY29tcHJlc3NlZF9idyArPQorCQkJCWN0eC0+Y2xrX2luZm8udW5jb21wcmVzc2VkX2J3OworCQkJaHdfbWdyX2Nsa19pbmZvLT5jb21wcmVzc2VkX2J3ICs9CisJCQkJY3R4LT5jbGtfaW5mby5jb21wcmVzc2VkX2J3OworCQkJbXV0ZXhfdW5sb2NrKCZod19tZ3ItPmh3X21ncl9tdXRleCk7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY2FtX2ljcF9jaGVja19jbGtfdXBkYXRlKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAorCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSwgaW50IGlkeCkKK3sKKwlib29sIGJ1c3ksIHJjID0gZmFsc2U7CisJdWludDMyX3QgYmFzZV9jbGs7CisJc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgKmNsa19pbmZvOworCXN0cnVjdCBoZmlfZnJhbWVfcHJvY2Vzc19pbmZvICpmcmFtZV9pbmZvOworCXVpbnQ2NF90IHJlcV9pZDsKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqaHdfbWdyX2Nsa19pbmZvOworCisJaWYgKGN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mby0+ZGV2X3R5cGUgPT0gQ0FNX0lDUF9SRVNfVFlQRV9CUFMpCisJCWh3X21ncl9jbGtfaW5mbyA9ICZod19tZ3ItPmNsa19pbmZvW0lDUF9DTEtfSFdfQlBTXTsKKwllbHNlCisJCWh3X21ncl9jbGtfaW5mbyA9ICZod19tZ3ItPmNsa19pbmZvW0lDUF9DTEtfSFdfSVBFXTsKKworCWlmIChpY3BfaHdfbWdyLmljcF9kZWJ1Z19jbGspCisJCXJldHVybiBjYW1faWNwX2RlYnVnX2Nsa191cGRhdGUoaHdfbWdyX2Nsa19pbmZvKTsKKworCS8qIENoZWNrIGlzIHRoZXJlIGFueSBwZW5kaW5nIGZyYW1lcyBpbiB0aGlzIGNvbnRleHQgKi8KKwlmcmFtZV9pbmZvID0gJmN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2VzczsKKwlyZXFfaWQgPSBmcmFtZV9pbmZvLT5yZXF1ZXN0X2lkW2lkeF07CisJYnVzeSA9IGNhbV9pY3BfYnVzeV9wcmV2X3JlcXMoZnJhbWVfaW5mbywgcmVxX2lkKTsKKwlDQU1fREJHKENBTV9JQ1AsICJidXN5ID0gJWQgcmVxX2lkID0gJWxsZCIsIGJ1c3ksIHJlcV9pZCk7CisKKwljbGtfaW5mbyA9ICZjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuY2xrX2luZm9baWR4XTsKKwlpZiAoIWNsa19pbmZvLT5mcmFtZV9jeWNsZXMpCisJCXJldHVybiBjYW1faWNwX2RlZmF1bHRfY2xrX3VwZGF0ZShod19tZ3JfY2xrX2luZm8pOworCisJLyogQ2FsY3VsYXRlIGJhc2UgY2xrIHJhdGUgKi8KKwliYXNlX2NsayA9IGNhbV9pY3BfbWdyX2NhbGNfYmFzZV9jbGsoCisJCWNsa19pbmZvLT5mcmFtZV9jeWNsZXMsIGNsa19pbmZvLT5idWRnZXRfbnMpOworCWN0eF9kYXRhLT5jbGtfaW5mby5ydF9mbGFnID0gY2xrX2luZm8tPnJ0X2ZsYWc7CisKKwlpZiAoYnVzeSkKKwkJcmMgPSBjYW1faWNwX3VwZGF0ZV9jbGtfYnVzeShod19tZ3IsIGN0eF9kYXRhLAorCQkJaHdfbWdyX2Nsa19pbmZvLCBjbGtfaW5mbywgYmFzZV9jbGspOworCWVsc2UKKwkJcmMgPSBjYW1faWNwX3VwZGF0ZV9jbGtfZnJlZShod19tZ3IsIGN0eF9kYXRhLAorCQkJaHdfbWdyX2Nsa19pbmZvLCBjbGtfaW5mbywgYmFzZV9jbGspOworCisJQ0FNX0RCRyhDQU1fSUNQLCAiYmMgPSAlZCBjYyA9ICVkIGJ1c3kgPSAlZCBvdmVyY2xrID0gJWQgdWMgPSAlZCIsCisJCWh3X21ncl9jbGtfaW5mby0+YmFzZV9jbGssIGh3X21ncl9jbGtfaW5mby0+Y3Vycl9jbGssCisJCWJ1c3ksIGh3X21ncl9jbGtfaW5mby0+b3Zlcl9jbGtlZCwgcmMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgYm9vbCBjYW1faWNwX2NoZWNrX2J3X3VwZGF0ZShzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsIGludCBpZHgpCit7CisJYm9vbCBidXN5LCByYyA9IGZhbHNlOworCXN0cnVjdCBjYW1faWNwX2Nsa19id19yZXF1ZXN0ICpjbGtfaW5mbzsKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqaHdfbWdyX2Nsa19pbmZvOworCXN0cnVjdCBoZmlfZnJhbWVfcHJvY2Vzc19pbmZvICpmcmFtZV9pbmZvOworCXVpbnQ2NF90IHJlcV9pZDsKKworCWlmIChjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09IENBTV9JQ1BfUkVTX1RZUEVfQlBTKQorCQlod19tZ3JfY2xrX2luZm8gPSAmaHdfbWdyLT5jbGtfaW5mb1tJQ1BfQ0xLX0hXX0JQU107CisJZWxzZQorCQlod19tZ3JfY2xrX2luZm8gPSAmaHdfbWdyLT5jbGtfaW5mb1tJQ1BfQ0xLX0hXX0lQRV07CisKKwljbGtfaW5mbyA9ICZjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuY2xrX2luZm9baWR4XTsKKwlmcmFtZV9pbmZvID0gJmN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2VzczsKKwlyZXFfaWQgPSBmcmFtZV9pbmZvLT5yZXF1ZXN0X2lkW2lkeF07CisJYnVzeSA9IGNhbV9pY3BfYnVzeV9wcmV2X3JlcXMoZnJhbWVfaW5mbywgcmVxX2lkKTsKKwlyYyA9IGNhbV9pY3BfdXBkYXRlX2J3KGh3X21nciwgY3R4X2RhdGEsIGh3X21ncl9jbGtfaW5mbywKKwkJY2xrX2luZm8sIGJ1c3kpOworCisJQ0FNX0RCRyhDQU1fSUNQLCAidWJ3ID0gJWxsZCwgY2J3ID0gJWxsZCwgdXBkYXRlX2J3ID0gJWQiLAorCQlod19tZ3JfY2xrX2luZm8tPnVuY29tcHJlc3NlZF9idywKKwkJaHdfbWdyX2Nsa19pbmZvLT5jb21wcmVzc2VkX2J3LCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF91cGRhdGVfY2xrX3JhdGUoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhKQoreworCXVpbnQzMl90IGlkOworCXVpbnQzMl90IGN1cnJfY2xrX3JhdGU7CisJc3RydWN0IGNhbV9od19pbnRmICppcGUwX2Rldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmlwZTFfZGV2X2ludGYgPSBOVUxMOworCXN0cnVjdCBjYW1faHdfaW50ZiAqYnBzX2Rldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmRldl9pbnRmID0gTlVMTDsKKworCWlwZTBfZGV2X2ludGYgPSBod19tZ3ItPmRldmljZXNbQ0FNX0lDUF9ERVZfSVBFXVswXTsKKwlpcGUxX2Rldl9pbnRmID0gaHdfbWdyLT5kZXZpY2VzW0NBTV9JQ1BfREVWX0lQRV1bMV07CisJYnBzX2Rldl9pbnRmID0gaHdfbWdyLT5kZXZpY2VzW0NBTV9JQ1BfREVWX0JQU11bMF07CisKKworCWlmICgoIWlwZTBfZGV2X2ludGYpIHx8ICghYnBzX2Rldl9pbnRmKSkgeworCQlDQU1fRVJSKENBTV9JQ1AsICJkZXYgaW50ZnMgYXJlIHdyb25nLCBmYWlsZWQgdG8gdXBkYXRlIGNsayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5kZXZfdHlwZSA9PSBDQU1fSUNQX1JFU19UWVBFX0JQUykgeworCQlkZXZfaW50ZiA9IGJwc19kZXZfaW50ZjsKKwkJY3Vycl9jbGtfcmF0ZSA9IGh3X21nci0+Y2xrX2luZm9bSUNQX0NMS19IV19CUFNdLmN1cnJfY2xrOworCQlpZCA9IENBTV9JQ1BfQlBTX0NNRF9VUERBVEVfQ0xLOworCX0gZWxzZSB7CisJCWRldl9pbnRmID0gaXBlMF9kZXZfaW50ZjsKKwkJY3Vycl9jbGtfcmF0ZSA9IGh3X21nci0+Y2xrX2luZm9bSUNQX0NMS19IV19JUEVdLmN1cnJfY2xrOworCQlpZCA9IENBTV9JQ1BfSVBFX0NNRF9VUERBVEVfQ0xLOworCX0KKworCWRldl9pbnRmLT5od19vcHMucHJvY2Vzc19jbWQoZGV2X2ludGYtPmh3X3ByaXYsIGlkLAorCQkmY3Vycl9jbGtfcmF0ZSwgc2l6ZW9mKGN1cnJfY2xrX3JhdGUpKTsKKworCWlmIChjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlICE9IENBTV9JQ1BfUkVTX1RZUEVfQlBTKQorCQlpZiAoaXBlMV9kZXZfaW50ZikKKwkJCWlwZTFfZGV2X2ludGYtPmh3X29wcy5wcm9jZXNzX2NtZCgKKwkJCQlpcGUxX2Rldl9pbnRmLT5od19wcml2LCBpZCwKKwkJCQkmY3Vycl9jbGtfcmF0ZSwgc2l6ZW9mKGN1cnJfY2xrX3JhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9pY3BfdXBkYXRlX2NwYXNfdm90ZShzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEpCit7CisJdWludDMyX3QgaWQ7CisJc3RydWN0IGNhbV9od19pbnRmICppcGUwX2Rldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmlwZTFfZGV2X2ludGYgPSBOVUxMOworCXN0cnVjdCBjYW1faHdfaW50ZiAqYnBzX2Rldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2h3X2ludGYgKmRldl9pbnRmID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyAqY2xrX2luZm87CisJc3RydWN0IGNhbV9pY3BfY3Bhc192b3RlIGNsa191cGRhdGU7CisKKwlpcGUwX2Rldl9pbnRmID0gaHdfbWdyLT5kZXZpY2VzW0NBTV9JQ1BfREVWX0lQRV1bMF07CisJaXBlMV9kZXZfaW50ZiA9IGh3X21nci0+ZGV2aWNlc1tDQU1fSUNQX0RFVl9JUEVdWzFdOworCWJwc19kZXZfaW50ZiA9IGh3X21nci0+ZGV2aWNlc1tDQU1fSUNQX0RFVl9CUFNdWzBdOworCisJaWYgKCghaXBlMF9kZXZfaW50ZikgfHwgKCFicHNfZGV2X2ludGYpKSB7CisJCUNBTV9FUlIoQ0FNX0lDUCwgImRldiBpbnRmcyBhcmUgd3JvbmcsIGZhaWxlZCB0byB1cGRhdGUgY2xrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09IENBTV9JQ1BfUkVTX1RZUEVfQlBTKSB7CisJCWRldl9pbnRmID0gYnBzX2Rldl9pbnRmOworCQljbGtfaW5mbyA9ICZod19tZ3ItPmNsa19pbmZvW0lDUF9DTEtfSFdfQlBTXTsKKwkJaWQgPSBDQU1fSUNQX0JQU19DTURfVk9URV9DUEFTOworCX0gZWxzZSB7CisJCWRldl9pbnRmID0gaXBlMF9kZXZfaW50ZjsKKwkJY2xrX2luZm8gPSAmaHdfbWdyLT5jbGtfaW5mb1tJQ1BfQ0xLX0hXX0lQRV07CisJCWlkID0gQ0FNX0lDUF9JUEVfQ01EX1ZPVEVfQ1BBUzsKKwl9CisKKwljbGtfdXBkYXRlLmFoYl92b3RlLnR5cGUgPSBDQU1fVk9URV9EWU5BTUlDOworCWNsa191cGRhdGUuYWhiX3ZvdGUudm90ZS5mcmVxID0gY2xrX2luZm8tPmN1cnJfY2xrOworCWNsa191cGRhdGUuYWhiX3ZvdGVfdmFsaWQgPSB0cnVlOworCWNsa191cGRhdGUuYXhpX3ZvdGUuY29tcHJlc3NlZF9idyA9IGNsa19pbmZvLT5jb21wcmVzc2VkX2J3OworCWNsa191cGRhdGUuYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gY2xrX2luZm8tPnVuY29tcHJlc3NlZF9idzsKKwljbGtfdXBkYXRlLmF4aV92b3RlX3ZhbGlkID0gdHJ1ZTsKKwlkZXZfaW50Zi0+aHdfb3BzLnByb2Nlc3NfY21kKGRldl9pbnRmLT5od19wcml2LCBpZCwKKwkJJmNsa191cGRhdGUsIHNpemVvZihjbGtfdXBkYXRlKSk7CisKKwlpZiAoY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5kZXZfdHlwZSAhPSBDQU1fSUNQX1JFU19UWVBFX0JQUykKKwkJaWYgKGlwZTFfZGV2X2ludGYpCisJCQlpcGUxX2Rldl9pbnRmLT5od19vcHMucHJvY2Vzc19jbWQoCisJCQkJaXBlMV9kZXZfaW50Zi0+aHdfcHJpdiwgaWQsCisJCQkJJmNsa191cGRhdGUsIHNpemVvZihjbGtfdXBkYXRlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1faWNwX21ncl9pcGVfYnBzX2Nsa191cGRhdGUoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLCBpbnQgaWR4KQoreworCWludCByYyA9IDA7CisKKwlpZiAoY2FtX2ljcF9jaGVja19jbGtfdXBkYXRlKGh3X21nciwgY3R4X2RhdGEsIGlkeCkpCisJCXJjID0gY2FtX2ljcF91cGRhdGVfY2xrX3JhdGUoaHdfbWdyLCBjdHhfZGF0YSk7CisKKwlpZiAoY2FtX2ljcF9jaGVja19id191cGRhdGUoaHdfbWdyLCBjdHhfZGF0YSwgaWR4KSkKKwkJcmMgfD0gY2FtX2ljcF91cGRhdGVfY3Bhc192b3RlKGh3X21nciwgY3R4X2RhdGEpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGNhbV9pY3BfbWdyX2lwZV9icHNfcmVzdW1lKHN0cnVjdCBjYW1faWNwX2h3X21nciAqaHdfbWdyLAogCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSkKIHsKQEAgLTEyOCw4ICs3NzQsMjYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgY2FtX2ljcF9zZXRfZGJnX2RlZmF1bHRfY2xrKHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJaWNwX2h3X21nci5pY3BfZGVidWdfY2xrID0gdmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9pY3BfZ2V0X2RiZ19kZWZhdWx0X2Nsayh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gaWNwX2h3X21nci5pY3BfZGVidWdfY2xrOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1faWNwX2RlYnVnX2RlZmF1bHRfY2xrLAorCWNhbV9pY3BfZ2V0X2RiZ19kZWZhdWx0X2NsaywKKwljYW1faWNwX3NldF9kYmdfZGVmYXVsdF9jbGssICIlMTZsbHUiKTsKKwogc3RhdGljIGludCBjYW1faWNwX2h3X21ncl9jcmVhdGVfZGVidWdmc19lbnRyeSh2b2lkKQogeworCWludCByYyA9IDA7CisKIAlpY3BfaHdfbWdyLmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2FtZXJhX2ljcCIsIE5VTEwpOwogCWlmICghaWNwX2h3X21nci5kZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM5LDcgKzgwMyw4IEBACiAJCWljcF9od19tZ3IuZGVudHJ5LAogCQkmaWNwX2h3X21nci5hNV9kZWJ1ZykpIHsKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGljcF9od19tZ3IuZGVudHJ5KTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnI7CiAJfQogCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpY3BfcGMiLApAQCAtMTQ3LDEwICs4MTIsMjMgQEAKIAkJaWNwX2h3X21nci5kZW50cnksCiAJCSZpY3BfaHdfbWdyLmljcF9wY19mbGFnKSkgewogCQlDQU1fRVJSKENBTV9JQ1AsICJmYWlsZWQgdG8gY3JlYXRlIGljcF9wYyBlbnRyeSIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKIAl9CiAKLQlyZXR1cm4gMDsKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoImljcF9kZWJ1Z19jbGsiLAorCQkwNjQ0LAorCQlpY3BfaHdfbWdyLmRlbnRyeSwgTlVMTCwKKwkJJmNhbV9pY3BfZGVidWdfZGVmYXVsdF9jbGspKSB7CisJCUNBTV9FUlIoQ0FNX0lDUCwgImZhaWxlZCB0byBjcmVhdGUgaWNwX2RlYnVnX2NsayBlbnRyeSIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiByYzsKK2VycjoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaWNwX2h3X21nci5kZW50cnkpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjYW1faWNwX21ncl9wcm9jZXNzX2NtZCh2b2lkICpwcml2LCB2b2lkICpkYXRhKQpAQCAtMjA5LDcgKzg4NywxNCBAQAogCWJ1Zl9kYXRhLnJlcXVlc3RfaWQgPSBoZmlfZnJhbWVfcHJvY2Vzcy0+cmVxdWVzdF9pZFtpZHhdOwogCWN0eF9kYXRhLT5jdHh0X2V2ZW50X2NiKGN0eF9kYXRhLT5jb250ZXh0X3ByaXYsIGZsYWcsICZidWZfZGF0YSk7CiAJaGZpX2ZyYW1lX3Byb2Nlc3MtPnJlcXVlc3RfaWRbaWR4XSA9IDA7CisJaWYgKGN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5pbl9yZXNvdXJjZVtpZHhdID4gMCkgeworCQlDQU1fREJHKENBTV9JQ1AsICJEZWxldGUgbWVyZ2VkIHN5bmMgaW4gb2JqZWN0OiAlZCIsCisJCQljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaWR4XSk7CisJCWNhbV9zeW5jX2Rlc3Ryb3koY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2lkeF0pOworCQljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaWR4XSA9IDA7CisJfQogCWNsZWFyX2JpdChpZHgsIGN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5iaXRtYXApOworCWhmaV9mcmFtZV9wcm9jZXNzLT5md19wcm9jZXNzX2ZsYWdbaWR4XSA9IGZhbHNlOwogCW11dGV4X3VubG9jaygmY3R4X2RhdGEtPmN0eF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIyOCw3ICs5MTMsNyBAQAogCWlvY29uZmlnX2FjayA9IChzdHJ1Y3QgaGZpX21zZ19pcGVicHNfYXN5bmNfYWNrICopbXNnX3B0cjsKIAlpZiAoaW9jb25maWdfYWNrLT5lcnJfdHlwZSAhPSBIRklfRVJSX1NZU19OT05FKSB7CiAJCUNBTV9FUlIoQ0FNX0lDUCwgImZhaWxlZCB3aXRoIGVycm9yIDogJXUiLAotCQkJaW9jb25maWdfYWNrLT5lcnJfdHlwZSk7CisJCWlvY29uZmlnX2Fjay0+ZXJyX3R5cGUpOwogCQljYW1faWNwX21ncl9oYW5kbGVfZnJhbWVfcHJvY2Vzcyhtc2dfcHRyLAogCQkJSUNQX0ZSQU1FX1BST0NFU1NfRkFJTFVSRSk7CiAJCXJldHVybiAtRUlPOwpAQCAtNjQyLDQwICsxMzI3LDUyIEBACiB7CiAJaW50IHJjID0gMDsKIAl1bnNpZ25lZCBsb25nIHJlbV9qaWZmaWVzOworCXNpemVfdCBwYWNrZXRfc2l6ZTsKIAlpbnQgdGltZW91dCA9IDUwMDA7CiAJc3RydWN0IGhmaV9jbWRfd29ya19kYXRhICp0YXNrX2RhdGE7Ci0Jc3RydWN0IGhmaV9jbWRfaXBlYnBzX2FzeW5jIGFib3J0X2NtZDsKKwlzdHJ1Y3QgaGZpX2NtZF9pcGVicHNfYXN5bmMgKmFib3J0X2NtZDsKIAlzdHJ1Y3QgY3JtX3dvcmtxX3Rhc2sgKnRhc2s7CiAKIAl0YXNrID0gY2FtX3JlcV9tZ3Jfd29ya3FfZ2V0X3Rhc2soaWNwX2h3X21nci5jbWRfd29yayk7CiAJaWYgKCF0YXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWFib3J0X2NtZC5zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCBoZmlfY21kX2lwZWJwc19hc3luYyk7Ci0JYWJvcnRfY21kLnBrdF90eXBlID0gSEZJX0NNRF9JUEVCUFNfQVNZTkNfQ09NTUFORF9ESVJFQ1Q7CisJcGFja2V0X3NpemUgPQorCQlzaXplb2Yoc3RydWN0IGhmaV9jbWRfaXBlYnBzX2FzeW5jKSArCisJCXNpemVvZihzdHJ1Y3QgaGZpX2NtZF9hYm9ydF9kZXN0cm95KSAtCisJCXNpemVvZigoKHN0cnVjdCBoZmlfY21kX2lwZWJwc19hc3luYyAqKTApLT5wYXlsb2FkLmRpcmVjdCk7CisJYWJvcnRfY21kID0ga3phbGxvYyhwYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhYm9ydF9jbWQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlyZXR1cm4gcmM7CisJfQorCisJYWJvcnRfY21kLT5zaXplID0gcGFja2V0X3NpemU7CisJYWJvcnRfY21kLT5wa3RfdHlwZSA9IEhGSV9DTURfSVBFQlBTX0FTWU5DX0NPTU1BTkRfRElSRUNUOwogCWlmIChjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09IENBTV9JQ1BfUkVTX1RZUEVfQlBTKQotCQlhYm9ydF9jbWQub3Bjb2RlID0gSEZJX0lQRUJQU19DTURfT1BDT0RFX0JQU19BQk9SVDsKKwkJYWJvcnRfY21kLT5vcGNvZGUgPSBIRklfSVBFQlBTX0NNRF9PUENPREVfQlBTX0FCT1JUOwogCWVsc2UKLQkJYWJvcnRfY21kLm9wY29kZSA9IEhGSV9JUEVCUFNfQ01EX09QQ09ERV9JUEVfQUJPUlQ7CisJCWFib3J0X2NtZC0+b3Bjb2RlID0gSEZJX0lQRUJQU19DTURfT1BDT0RFX0lQRV9BQk9SVDsKIAogCXJlaW5pdF9jb21wbGV0aW9uKCZjdHhfZGF0YS0+d2FpdF9jb21wbGV0ZSk7Ci0JYWJvcnRfY21kLm51bV9md19oYW5kbGVzID0gMTsKLQlhYm9ydF9jbWQuZndfaGFuZGxlc1swXSA9IGN0eF9kYXRhLT5md19oYW5kbGU7Ci0JYWJvcnRfY21kLnVzZXJfZGF0YTEgPSAodWludDY0X3QpY3R4X2RhdGE7Ci0JYWJvcnRfY21kLnVzZXJfZGF0YTIgPSAodWludDY0X3QpMHgwOwotCW1lbWNweShhYm9ydF9jbWQucGF5bG9hZC5kaXJlY3QsICZjdHhfZGF0YS0+dGVtcF9wYXlsb2FkLAotCQlzaXplb2YodWludDMyX3QpKTsKKwlhYm9ydF9jbWQtPm51bV9md19oYW5kbGVzID0gMTsKKwlhYm9ydF9jbWQtPmZ3X2hhbmRsZXNbMF0gPSBjdHhfZGF0YS0+ZndfaGFuZGxlOworCWFib3J0X2NtZC0+dXNlcl9kYXRhMSA9ICh1aW50NjRfdCljdHhfZGF0YTsKKwlhYm9ydF9jbWQtPnVzZXJfZGF0YTIgPSAodWludDY0X3QpMHgwOworCW1lbWNweShhYm9ydF9jbWQtPnBheWxvYWQuZGlyZWN0LCAmY3R4X2RhdGEtPnRlbXBfcGF5bG9hZCwKKwkJc2l6ZW9mKHVpbnQ2NF90KSk7CiAKIAl0YXNrX2RhdGEgPSAoc3RydWN0IGhmaV9jbWRfd29ya19kYXRhICopdGFzay0+cGF5bG9hZDsKLQl0YXNrX2RhdGEtPmRhdGEgPSAodm9pZCAqKSZhYm9ydF9jbWQ7CisJdGFza19kYXRhLT5kYXRhID0gKHZvaWQgKilhYm9ydF9jbWQ7CiAJdGFza19kYXRhLT5yZXF1ZXN0X2lkID0gMDsKIAl0YXNrX2RhdGEtPnR5cGUgPSBJQ1BfV09SS1FfVEFTS19DTURfVFlQRTsKIAl0YXNrLT5wcm9jZXNzX2NiID0gY2FtX2ljcF9tZ3JfcHJvY2Vzc19jbWQ7CiAJcmMgPSBjYW1fcmVxX21ncl93b3JrcV9lbnF1ZXVlX3Rhc2sodGFzaywgJmljcF9od19tZ3IsCiAJCUNSTV9UQVNLX1BSSU9SSVRZXzApOwotCWlmIChyYykKKwlpZiAocmMpIHsKKwkJa2ZyZWUoYWJvcnRfY21kKTsKIAkJcmV0dXJuIHJjOworCX0KIAogCUNBTV9EQkcoQ0FNX0lDUCwgImZ3X2hhbmRsZSA9ICV4IGN0eF9kYXRhID0gJXBLIiwKIAkJY3R4X2RhdGEtPmZ3X2hhbmRsZSwgY3R4X2RhdGEpOwpAQCAtNjg2LDYgKzEzODMsNyBAQAogCQlDQU1fREJHKENBTV9JQ1AsICJGVyB0aW1lb3V0L2VyciBpbiBhYm9ydCBoYW5kbGUgY29tbWFuZCIpOwogCX0KIAorCWtmcmVlKGFib3J0X2NtZCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02OTUsMzkgKzEzOTMsNTEgQEAKIAlpbnQgcmMgPSAwOwogCWludCB0aW1lb3V0ID0gNTAwMDsKIAl1bnNpZ25lZCBsb25nIHJlbV9qaWZmaWVzOworCXNpemVfdCBwYWNrZXRfc2l6ZTsKIAlzdHJ1Y3QgaGZpX2NtZF93b3JrX2RhdGEgKnRhc2tfZGF0YTsKLQlzdHJ1Y3QgaGZpX2NtZF9pcGVicHNfYXN5bmMgZGVzdHJveV9jbWQ7CisJc3RydWN0IGhmaV9jbWRfaXBlYnBzX2FzeW5jICpkZXN0cm95X2NtZDsKIAlzdHJ1Y3QgY3JtX3dvcmtxX3Rhc2sgKnRhc2s7CiAKIAl0YXNrID0gY2FtX3JlcV9tZ3Jfd29ya3FfZ2V0X3Rhc2soaWNwX2h3X21nci5jbWRfd29yayk7CiAJaWYgKCF0YXNrKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRlc3Ryb3lfY21kLnNpemUgPQotCQlzaXplb2Yoc3RydWN0IGhmaV9jbWRfaXBlYnBzX2FzeW5jKTsKLQlkZXN0cm95X2NtZC5wa3RfdHlwZSA9IEhGSV9DTURfSVBFQlBTX0FTWU5DX0NPTU1BTkRfRElSRUNUOworCXBhY2tldF9zaXplID0KKwkJc2l6ZW9mKHN0cnVjdCBoZmlfY21kX2lwZWJwc19hc3luYykgKworCQlzaXplb2Yoc3RydWN0IGhmaV9jbWRfYWJvcnRfZGVzdHJveSkgLQorCQlzaXplb2YoKChzdHJ1Y3QgaGZpX2NtZF9pcGVicHNfYXN5bmMgKikwKS0+cGF5bG9hZC5kaXJlY3QpOworCWRlc3Ryb3lfY21kID0ga3phbGxvYyhwYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXN0cm95X2NtZCkgeworCQlyYyA9IC1FTk9NRU07CisJCXJldHVybiByYzsKKwl9CisKKwlkZXN0cm95X2NtZC0+c2l6ZSA9IHBhY2tldF9zaXplOworCWRlc3Ryb3lfY21kLT5wa3RfdHlwZSA9IEhGSV9DTURfSVBFQlBTX0FTWU5DX0NPTU1BTkRfRElSRUNUOwogCWlmIChjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmRldl90eXBlID09IENBTV9JQ1BfUkVTX1RZUEVfQlBTKQotCQlkZXN0cm95X2NtZC5vcGNvZGUgPSBIRklfSVBFQlBTX0NNRF9PUENPREVfQlBTX0RFU1RST1k7CisJCWRlc3Ryb3lfY21kLT5vcGNvZGUgPSBIRklfSVBFQlBTX0NNRF9PUENPREVfQlBTX0RFU1RST1k7CiAJZWxzZQotCQlkZXN0cm95X2NtZC5vcGNvZGUgPSBIRklfSVBFQlBTX0NNRF9PUENPREVfSVBFX0RFU1RST1k7CisJCWRlc3Ryb3lfY21kLT5vcGNvZGUgPSBIRklfSVBFQlBTX0NNRF9PUENPREVfSVBFX0RFU1RST1k7CiAKIAlyZWluaXRfY29tcGxldGlvbigmY3R4X2RhdGEtPndhaXRfY29tcGxldGUpOwotCWRlc3Ryb3lfY21kLm51bV9md19oYW5kbGVzID0gMTsKLQlkZXN0cm95X2NtZC5md19oYW5kbGVzWzBdID0gY3R4X2RhdGEtPmZ3X2hhbmRsZTsKLQlkZXN0cm95X2NtZC51c2VyX2RhdGExID0gKHVpbnQ2NF90KWN0eF9kYXRhOwotCWRlc3Ryb3lfY21kLnVzZXJfZGF0YTIgPSAodWludDY0X3QpMHgwOwotCW1lbWNweShkZXN0cm95X2NtZC5wYXlsb2FkLmRpcmVjdCwgJmN0eF9kYXRhLT50ZW1wX3BheWxvYWQsCi0JCQkJCQlzaXplb2YodWludDMyX3QpKTsKKwlkZXN0cm95X2NtZC0+bnVtX2Z3X2hhbmRsZXMgPSAxOworCWRlc3Ryb3lfY21kLT5md19oYW5kbGVzWzBdID0gY3R4X2RhdGEtPmZ3X2hhbmRsZTsKKwlkZXN0cm95X2NtZC0+dXNlcl9kYXRhMSA9ICh1aW50NjRfdCljdHhfZGF0YTsKKwlkZXN0cm95X2NtZC0+dXNlcl9kYXRhMiA9ICh1aW50NjRfdCkweDA7CisJbWVtY3B5KGRlc3Ryb3lfY21kLT5wYXlsb2FkLmRpcmVjdCwgJmN0eF9kYXRhLT50ZW1wX3BheWxvYWQsCisJCXNpemVvZih1aW50NjRfdCkpOwogCiAJdGFza19kYXRhID0gKHN0cnVjdCBoZmlfY21kX3dvcmtfZGF0YSAqKXRhc2stPnBheWxvYWQ7Ci0JdGFza19kYXRhLT5kYXRhID0gKHZvaWQgKikmZGVzdHJveV9jbWQ7CisJdGFza19kYXRhLT5kYXRhID0gKHZvaWQgKilkZXN0cm95X2NtZDsKIAl0YXNrX2RhdGEtPnJlcXVlc3RfaWQgPSAwOwogCXRhc2tfZGF0YS0+dHlwZSA9IElDUF9XT1JLUV9UQVNLX0NNRF9UWVBFOwogCXRhc2stPnByb2Nlc3NfY2IgPSBjYW1faWNwX21ncl9wcm9jZXNzX2NtZDsKIAlyYyA9IGNhbV9yZXFfbWdyX3dvcmtxX2VucXVldWVfdGFzayh0YXNrLCAmaWNwX2h3X21nciwKIAkJQ1JNX1RBU0tfUFJJT1JJVFlfMCk7Ci0JaWYgKHJjKQorCWlmIChyYykgeworCQlrZnJlZShkZXN0cm95X2NtZCk7CiAJCXJldHVybiByYzsKKwl9CiAKIAlDQU1fREJHKENBTV9JQ1AsICJmd19oYW5kbGUgPSAleCBjdHhfZGF0YSA9ICVwSyIsCiAJCWN0eF9kYXRhLT5md19oYW5kbGUsIGN0eF9kYXRhKTsKQEAgLTczOCw2ICsxNDQ4LDcgQEAKIAkJQ0FNX0VSUihDQU1fSUNQLCAiRlcgcmVzcG9uc2UgdGltZW91dDogJWQiLCByYyk7CiAJfQogCisJa2ZyZWUoZGVzdHJveV9jbWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtNzY1LDYgKzE0NzYsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBDQU1fRlJBTUVfQ01EX01BWDsgaSsrKQogCQljbGVhcl9iaXQoaSwgaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmhmaV9mcmFtZV9wcm9jZXNzLmJpdG1hcCk7CiAJa2ZyZWUoaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmhmaV9mcmFtZV9wcm9jZXNzLmJpdG1hcCk7CisJY2FtX2ljcF9od19tZ3JfY2xrX2luZm9fdXBkYXRlKGh3X21nciwgJmh3X21nci0+Y3R4X2RhdGFbY3R4X2lkXSk7CisJaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmNsa19pbmZvLmN1cnJfZmMgPSAwOworCWh3X21nci0+Y3R4X2RhdGFbY3R4X2lkXS5jbGtfaW5mby5iYXNlX2NsayA9IDA7CiAJaHdfbWdyLT5jdHh0X2NudC0tOwogCWtmcmVlKGh3X21nci0+Y3R4X2RhdGFbY3R4X2lkXS5pY3BfZGV2X2FjcXVpcmVfaW5mbyk7CiAJaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmljcF9kZXZfYWNxdWlyZV9pbmZvID0gTlVMTDsKQEAgLTg0OSw2ICsxNTYzLDcgQEAKIAljYW1faWNwX21ncl9kZXZpY2VfZGVpbml0KGh3X21ncik7CiAJY2FtX2ljcF9mcmVlX2hmaV9tZW0oKTsKIAlod19tZ3ItPmZ3X2Rvd25sb2FkID0gZmFsc2U7CisJaHdfbWdyLT5zZWN1cmVfbW9kZSA9IENBTV9TRUNVUkVfTU9ERV9OT05fU0VDVVJFOwogCW11dGV4X3VubG9jaygmaHdfbWdyLT5od19tZ3JfbXV0ZXgpOwogCiAJcmV0dXJuIHJjOwpAQCAtMTEwOSwxMyArMTgyNCwxOCBAQAogCiBzdGF0aWMgaW50IGNhbV9pY3BfbWdyX2hhbmRsZV9jb25maWdfZXJyKAogCXN0cnVjdCBjYW1faHdfY29uZmlnX2FyZ3MgKmNvbmZpZ19hcmdzLAotCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHhfZGF0YSkKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGEsCisJaW50IGlkeCkKIHsKIAlzdHJ1Y3QgY2FtX2h3X2RvbmVfZXZlbnRfZGF0YSBidWZfZGF0YTsKIAogCWJ1Zl9kYXRhLnJlcXVlc3RfaWQgPSAqKHVpbnQ2NF90ICopY29uZmlnX2FyZ3MtPnByaXY7CiAJY3R4X2RhdGEtPmN0eHRfZXZlbnRfY2IoY3R4X2RhdGEtPmNvbnRleHRfcHJpdiwgdHJ1ZSwgJmJ1Zl9kYXRhKTsKIAorCWN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5yZXF1ZXN0X2lkW2lkeF0gPSAwOworCWN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5md19wcm9jZXNzX2ZsYWdbaWR4XSA9IGZhbHNlOworCWNsZWFyX2JpdChpZHgsIGN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5iaXRtYXApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNTQsNiArMTg3NCw4IEBACiBzdGF0aWMgaW50IGNhbV9pY3BfbWdyX2NvbmZpZ19odyh2b2lkICpod19tZ3JfcHJpdiwgdm9pZCAqY29uZmlnX2h3X2FyZ3MpCiB7CiAJaW50IHJjID0gMDsKKwlpbnQgaWR4OworCXVpbnQ2NF90IHJlcV9pZDsKIAlzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciA9IGh3X21ncl9wcml2OwogCXN0cnVjdCBjYW1faHdfY29uZmlnX2FyZ3MgKmNvbmZpZ19hcmdzID0gY29uZmlnX2h3X2FyZ3M7CiAJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhID0gTlVMTDsKQEAgLTExNzMsMTAgKzE4OTUsMTQgQEAKIAltdXRleF9sb2NrKCZjdHhfZGF0YS0+Y3R4X211dGV4KTsKIAlpZiAoIWN0eF9kYXRhLT5pbl91c2UpIHsKIAkJQ0FNX0VSUihDQU1fSUNQLCAiY3R4IGlzIG5vdCBpbiB1c2UiKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGNvbmZpZ19lcnI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJlcV9pZCA9ICoodWludDY0X3QgKiljb25maWdfYXJncy0+cHJpdjsKKwlpZHggPSBjYW1faWNwX2Nsa19pZHhfZnJvbV9yZXFfaWQoY3R4X2RhdGEsIHJlcV9pZCk7CisJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmZ3X3Byb2Nlc3NfZmxhZ1tpZHhdID0gdHJ1ZTsKKwljYW1faWNwX21ncl9pcGVfYnBzX2Nsa191cGRhdGUoaHdfbWdyLCBjdHhfZGF0YSwgaWR4KTsKKwogCXJjID0gY2FtX2ljcF9tZ3JfZW5xdWV1ZV9jb25maWcoaHdfbWdyLCBjb25maWdfYXJncyk7CiAJaWYgKHJjKQogCQlnb3RvIGNvbmZpZ19lcnI7CkBAIC0xMTg0LDggKzE5MTAsOCBAQAogCiAJcmV0dXJuIDA7CiBjb25maWdfZXJyOgorCWNhbV9pY3BfbWdyX2hhbmRsZV9jb25maWdfZXJyKGNvbmZpZ19hcmdzLCBjdHhfZGF0YSwgaWR4KTsKIAltdXRleF91bmxvY2soJmN0eF9kYXRhLT5jdHhfbXV0ZXgpOwotCWNhbV9pY3BfbWdyX2hhbmRsZV9jb25maWdfZXJyKGNvbmZpZ19hcmdzLCBjdHhfZGF0YSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMjI0LDE0ICsxOTUwLDggQEAKIAkJCXBhY2tldC0+aGVhZGVyLm9wX2NvZGUgJiAweGZmKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JaWYgKChwYWNrZXQtPm51bV9jbWRfYnVmID4gMSkgfHwgKCFwYWNrZXQtPm51bV9wYXRjaGVzKSB8fAotCQkoIXBhY2tldC0+bnVtX2lvX2NvbmZpZ3MpKSB7Ci0JCUNBTV9FUlIoQ0FNX0lDUCwgIndyb25nIG51bWJlciBvZiBjbWQvcGF0Y2ggaW5mbzogJXUgJXUiLAorCUNBTV9EQkcoQ0FNX0lDUCwgIm51bWJlciBvZiBjbWQvcGF0Y2ggaW5mbzogJXUgJXUiLAogCQkJcGFja2V0LT5udW1fY21kX2J1ZiwgcGFja2V0LT5udW1fcGF0Y2hlcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0xMjQwLDM2ICsxOTYwLDQzIEBACiAJdWludDMyX3QgKmZ3X2NtZF9idWZfaW92YV9hZGRyKQogewogCWludCByYyA9IDA7Ci0JdWludDY0X3QgaW92YV9hZGRyOwotCXNpemVfdCAgIGZ3X2NtZF9idWZfbGVuOworCWludCBpOworCXVpbnQ2NF90IGFkZHI7CisJc2l6ZV90IGxlbjsKIAlzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqY21kX2Rlc2MgPSBOVUxMOwogCiAJY21kX2Rlc2MgPSAoc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgKikKIAkJKCh1aW50MzJfdCAqKSAmcGFja2V0LT5wYXlsb2FkICsgcGFja2V0LT5jbWRfYnVmX29mZnNldC80KTsKIAotCXJjID0gY2FtX21lbV9nZXRfaW9fYnVmKGNtZF9kZXNjLT5tZW1faGFuZGxlLAotCQlod19tZ3ItPmlvbW11X2hkbCwgJmlvdmFfYWRkciwgJmZ3X2NtZF9idWZfbGVuKTsKLQlpZiAocmMpIHsKLQkJQ0FNX0VSUihDQU1fSUNQLCAidW5hYmxlIHRvIGdldCBzcmMgYnVmIGluZm8gZm9yIGNtZCBidWY6ICV4IiwKLQkJCWh3X21nci0+aW9tbXVfaGRsKTsKLQkJcmV0dXJuIHJjOworCSpmd19jbWRfYnVmX2lvdmFfYWRkciA9IDA7CisJZm9yIChpID0gMDsgaSA8IHBhY2tldC0+bnVtX2NtZF9idWY7IGkrKykgeworCQlpZiAoY21kX2Rlc2NbaV0udHlwZSA9PSBDQU1fQ01EX0JVRl9GVykgeworCQkJcmMgPSBjYW1fbWVtX2dldF9pb19idWYoY21kX2Rlc2NbaV0ubWVtX2hhbmRsZSwKKwkJCQlod19tZ3ItPmlvbW11X2hkbCwgJmFkZHIsICZsZW4pOworCQkJaWYgKHJjKSB7CisJCQkJQ0FNX0VSUihDQU1fSUNQLCAiZ2V0IGNtZCBidWYgZmFpbGVkICV4IiwKKwkJCQkJaHdfbWdyLT5pb21tdV9oZGwpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCSpmd19jbWRfYnVmX2lvdmFfYWRkciA9IGFkZHI7CisJCQkqZndfY21kX2J1Zl9pb3ZhX2FkZHIgPQorCQkJCSgqZndfY21kX2J1Zl9pb3ZhX2FkZHIgKyBjbWRfZGVzY1tpXS5vZmZzZXQpOworCQl9CiAJfQotCUNBTV9EQkcoQ0FNX0lDUCwgImNtZF9idWYgZGVzYyBjcHUgYW5kIGlvdmEgYWRkcmVzczogJXBLICV6dSIsCi0JCSh2b2lkICopaW92YV9hZGRyLCBmd19jbWRfYnVmX2xlbik7Ci0KLQkqZndfY21kX2J1Zl9pb3ZhX2FkZHIgPSBpb3ZhX2FkZHI7Ci0JKmZ3X2NtZF9idWZfaW92YV9hZGRyID0gKCpmd19jbWRfYnVmX2lvdmFfYWRkciArIGNtZF9kZXNjLT5vZmZzZXQpOwogCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBjYW1faWNwX21ncl9wcm9jZXNzX2lvX2NmZyhzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgKmh3X21nciwKK3N0YXRpYyBpbnQgY2FtX2ljcF9tZ3JfcHJvY2Vzc19pb19jZmcoc3RydWN0IGNhbV9pY3BfaHdfbWdyICpod19tZ3IsCiAJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLAogCXN0cnVjdCBjYW1fcGFja2V0ICpwYWNrZXQsCi0Jc3RydWN0IGNhbV9od19wcmVwYXJlX3VwZGF0ZV9hcmdzICpwcmVwYXJlX2FyZ3MpCisJc3RydWN0IGNhbV9od19wcmVwYXJlX3VwZGF0ZV9hcmdzICpwcmVwYXJlX2FyZ3MsCisJaW50MzJfdCBpbmRleCkKIHsKLQlpbnQgaSwgaiwgazsKKwlpbnQgaSwgaiwgaywgcmMgPSAwOwogCXN0cnVjdCBjYW1fYnVmX2lvX2NmZyAqaW9fY2ZnX3B0ciA9IE5VTEw7CisJaW50MzJfdCBzeW5jX2luX29ialtDQU1fTUFYX09VVF9SRVNdOworCWludDMyX3QgbWVyZ2VkX3N5bmNfaW5fb2JqOwogCiAJaW9fY2ZnX3B0ciA9IChzdHJ1Y3QgY2FtX2J1Zl9pb19jZmcgKikgKCh1aW50MzJfdCAqKSAmcGFja2V0LT5wYXlsb2FkICsKIAkJCQlwYWNrZXQtPmlvX2NvbmZpZ3Nfb2Zmc2V0LzQpOwpAQCAtMTI3OCw4ICsyMDA1LDcgQEAKIAogCWZvciAoaSA9IDAsIGogPSAwLCBrID0gMDsgaSA8IHBhY2tldC0+bnVtX2lvX2NvbmZpZ3M7IGkrKykgewogCQlpZiAoaW9fY2ZnX3B0cltpXS5kaXJlY3Rpb24gPT0gQ0FNX0JVRl9JTlBVVCkgewotCQkJcHJlcGFyZV9hcmdzLT5pbl9tYXBfZW50cmllc1tqKytdLnN5bmNfaWQgPQotCQkJCWlvX2NmZ19wdHJbaV0uZmVuY2U7CisJCQlzeW5jX2luX29ialtqKytdID0gaW9fY2ZnX3B0cltpXS5mZW5jZTsKIAkJCXByZXBhcmVfYXJncy0+bnVtX2luX21hcF9lbnRyaWVzKys7CiAJCX0gZWxzZSB7CiAJCQlwcmVwYXJlX2FyZ3MtPm91dF9tYXBfZW50cmllc1trKytdLnN5bmNfaWQgPQpAQCAtMTI4OSw2ICsyMDE1LDEwNyBAQAogCQlDQU1fREJHKENBTV9JQ1AsICJkaXJbJWRdOiAldSwgZmVuY2U6ICV1IiwKIAkJCWksIGlvX2NmZ19wdHJbaV0uZGlyZWN0aW9uLCBpb19jZmdfcHRyW2ldLmZlbmNlKTsKIAl9CisKKwlpZiAocHJlcGFyZV9hcmdzLT5udW1faW5fbWFwX2VudHJpZXMgPiAxKSB7CisJCXJjID0gY2FtX3N5bmNfbWVyZ2UoJnN5bmNfaW5fb2JqWzBdLAorCQkJcHJlcGFyZV9hcmdzLT5udW1faW5fbWFwX2VudHJpZXMsICZtZXJnZWRfc3luY19pbl9vYmopOworCQlpZiAocmMpIHsKKwkJCXByZXBhcmVfYXJncy0+bnVtX291dF9tYXBfZW50cmllcyA9IDA7CisJCQlwcmVwYXJlX2FyZ3MtPm51bV9pbl9tYXBfZW50cmllcyA9IDA7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaW5kZXhdID0KKwkJCW1lcmdlZF9zeW5jX2luX29iajsKKwkJcHJlcGFyZV9hcmdzLT5pbl9tYXBfZW50cmllc1swXS5zeW5jX2lkID0gbWVyZ2VkX3N5bmNfaW5fb2JqOworCQlwcmVwYXJlX2FyZ3MtPm51bV9pbl9tYXBfZW50cmllcyA9IDE7CisJCUNBTV9EQkcoQ0FNX0lDUCwgIk1lcmdlZCBTeW5jIG9iaiA9ICVkIiwgbWVyZ2VkX3N5bmNfaW5fb2JqKTsKKwl9IGVsc2UgaWYgKHByZXBhcmVfYXJncy0+bnVtX2luX21hcF9lbnRyaWVzID09IDEpIHsKKwkJcHJlcGFyZV9hcmdzLT5pbl9tYXBfZW50cmllc1swXS5zeW5jX2lkID0gc3luY19pbl9vYmpbMF07CisJCXByZXBhcmVfYXJncy0+bnVtX2luX21hcF9lbnRyaWVzID0gMTsKKwkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2luZGV4XSA9IDA7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fSUNQLCAiTm8gaW5wdXQgZmVuY2VzIik7CisJCXByZXBhcmVfYXJncy0+bnVtX2luX21hcF9lbnRyaWVzID0gMDsKKwkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2luZGV4XSA9IDA7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2ljcF9wYWNrZXRfZ2VuZXJpY19ibG9iX2hhbmRsZXIodm9pZCAqdXNlcl9kYXRhLAorCXVpbnQzMl90IGJsb2JfdHlwZSwgdWludDMyX3QgYmxvYl9zaXplLCB1aW50OF90ICpibG9iX2RhdGEpCit7CisJc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgKnNvY19yZXE7CisJc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgKmNsa19pbmZvOworCXN0cnVjdCBpY3BfY21kX2dlbmVyaWNfYmxvYiAqYmxvYjsKKwlzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSAqY3R4X2RhdGE7CisJdWludDMyX3QgaW5kZXg7CisJaW50IHJjID0gMDsKKworCWlmICghYmxvYl9kYXRhIHx8IChibG9iX3NpemUgPT0gMCkpIHsKKwkJQ0FNX0VSUihDQU1fSUNQLCAiSW52YWxpZCBibG9iIGluZm8gJXBLICVkIiwgYmxvYl9kYXRhLAorCQkJYmxvYl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmxvYiA9IChzdHJ1Y3QgaWNwX2NtZF9nZW5lcmljX2Jsb2IgKil1c2VyX2RhdGE7CisJY3R4X2RhdGEgPSBibG9iLT5jdHg7CisJaW5kZXggPSBibG9iLT5mcmFtZV9pbmZvX2lkeDsKKworCXN3aXRjaCAoYmxvYl90eXBlKSB7CisJY2FzZSBDQU1fSUNQX0NNRF9HRU5FUklDX0JMT0JfQ0xLOgorCQlpZiAoYmxvYl9zaXplICE9IHNpemVvZihzdHJ1Y3QgY2FtX2ljcF9jbGtfYndfcmVxdWVzdCkpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWNsa19pbmZvID0gJmN0eF9kYXRhLT5oZmlfZnJhbWVfcHJvY2Vzcy5jbGtfaW5mb1tpbmRleF07CisJCW1lbXNldChjbGtfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBjYW1faWNwX2Nsa19id19yZXF1ZXN0KSk7CisKKwkJc29jX3JlcSA9IChzdHJ1Y3QgY2FtX2ljcF9jbGtfYndfcmVxdWVzdCAqKWJsb2JfZGF0YTsKKwkJKmNsa19pbmZvID0gKnNvY19yZXE7CisJCUNBTV9EQkcoQ0FNX0lDUCwgIiVsbHUgJWxsdSAlZCAlZCAlZCIsCisJCQljbGtfaW5mby0+YnVkZ2V0X25zLCBjbGtfaW5mby0+ZnJhbWVfY3ljbGVzLAorCQkJY2xrX2luZm8tPnJ0X2ZsYWcsIGNsa19pbmZvLT51bmNvbXByZXNzZWRfYncsCisJCQljbGtfaW5mby0+Y29tcHJlc3NlZF9idyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQ0FNX1dBUk4oQ0FNX0lDUCwgIkludmFsaWQgYmxvYiB0eXBlICVkIiwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1faWNwX3Byb2Nlc3NfZ2VuZXJpY19jbWRfYnVmZmVyKAorCXN0cnVjdCBjYW1fcGFja2V0ICpwYWNrZXQsCisJc3RydWN0IGNhbV9pY3BfaHdfY3R4X2RhdGEgKmN0eF9kYXRhLAorCWludDMyX3QgaW5kZXgpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqY21kX2Rlc2MgPSBOVUxMOworCXN0cnVjdCBpY3BfY21kX2dlbmVyaWNfYmxvYiBjbWRfZ2VuZXJpY19ibG9iOworCisJY21kX2dlbmVyaWNfYmxvYi5jdHggPSBjdHhfZGF0YTsKKwljbWRfZ2VuZXJpY19ibG9iLmZyYW1lX2luZm9faWR4ID0gaW5kZXg7CisKKwljbWRfZGVzYyA9IChzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqKQorCQkoKHVpbnQzMl90ICopICZwYWNrZXQtPnBheWxvYWQgKyBwYWNrZXQtPmNtZF9idWZfb2Zmc2V0LzQpOworCWZvciAoaSA9IDA7IGkgPCBwYWNrZXQtPm51bV9jbWRfYnVmOyBpKyspIHsKKwkJaWYgKCFjbWRfZGVzY1tpXS5sZW5ndGgpCisJCQljb250aW51ZTsKKworCQlpZiAoY21kX2Rlc2NbaV0ubWV0YV9kYXRhICE9IENBTV9JQ1BfQ01EX01FVEFfR0VORVJJQ19CTE9CKQorCQkJY29udGludWU7CisKKwkJcmMgPSBjYW1fcGFja2V0X3V0aWxfcHJvY2Vzc19nZW5lcmljX2NtZF9idWZmZXIoJmNtZF9kZXNjW2ldLAorCQkJY2FtX2ljcF9wYWNrZXRfZ2VuZXJpY19ibG9iX2hhbmRsZXIsICZjbWRfZ2VuZXJpY19ibG9iKTsKKwkJaWYgKHJjKQorCQkJQ0FNX0VSUihDQU1fSUNQLCAiRmFpbGVkIGluIHByb2Nlc3NpbmcgYmxvYnMgJWQiLCByYyk7CisJfQorCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGNhbV9pY3BfbWdyX3VwZGF0ZV9oZmlfZnJhbWVfcHJvY2VzcygKQEAgLTEyOTcsNyArMjEyNCw3IEBACiAJc3RydWN0IGNhbV9od19wcmVwYXJlX3VwZGF0ZV9hcmdzICpwcmVwYXJlX2FyZ3MsCiAJaW50MzJfdCAqaWR4KQogewotCWludDMyX3QgaW5kZXg7CisJaW50MzJfdCBpbmRleCwgcmM7CiAKIAlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmJpdG1hcCwKIAkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmJpdHMpOwpAQCAtMTMwOSw3ICsyMTM2LDEyIEBACiAKIAljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MucmVxdWVzdF9pZFtpbmRleF0gPQogCQlwYWNrZXQtPmhlYWRlci5yZXF1ZXN0X2lkOwotCisJcmMgPSBjYW1faWNwX3Byb2Nlc3NfZ2VuZXJpY19jbWRfYnVmZmVyKHBhY2tldCwgY3R4X2RhdGEsIGluZGV4KTsKKwlpZiAocmMpIHsKKwkJY2xlYXJfYml0KGluZGV4LCBjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuYml0bWFwKTsKKwkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLnJlcXVlc3RfaWRbaW5kZXhdID0gLTE7CisJCXJldHVybiByYzsKKwl9CiAJKmlkeCA9IGluZGV4OwogCiAJcmV0dXJuIDA7CkBAIC0xMzU3LDIxICsyMTg5LDI4IEBACiAJfQogCiAJLyogVXBkYXRlIEJ1ZmZlciBBZGRyZXNzIGZyb20gaGFuZGxlcyBhbmQgcGF0Y2ggaW5mb3JtYXRpb24gKi8KLQlyYyA9IGNhbV9wYWNrZXRfdXRpbF9wcm9jZXNzX3BhdGNoZXMocGFja2V0LCBod19tZ3ItPmlvbW11X2hkbCk7CisJcmMgPSBjYW1fcGFja2V0X3V0aWxfcHJvY2Vzc19wYXRjaGVzKHBhY2tldCwgaHdfbWdyLT5pb21tdV9oZGwsCisJCWh3X21nci0+aW9tbXVfc2VjX2hkbCk7CiAJaWYgKHJjKSB7CiAJCW11dGV4X3VubG9jaygmY3R4X2RhdGEtPmN0eF9tdXRleCk7CiAJCXJldHVybiByYzsKIAl9CiAKLQljYW1faWNwX21ncl9wcm9jZXNzX2lvX2NmZyhod19tZ3IsIGN0eF9kYXRhLAotCQlwYWNrZXQsIHByZXBhcmVfYXJncyk7Ci0KIAlyYyA9IGNhbV9pY3BfbWdyX3VwZGF0ZV9oZmlfZnJhbWVfcHJvY2VzcyhjdHhfZGF0YSwgcGFja2V0LAogCQlwcmVwYXJlX2FyZ3MsICZpZHgpOwogCWlmIChyYykgewotCQlpZiAocHJlcGFyZV9hcmdzLT5pbl9tYXBfZW50cmllc1swXS5zeW5jX2lkID4gMCkKKwkJbXV0ZXhfdW5sb2NrKCZjdHhfZGF0YS0+Y3R4X211dGV4KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gY2FtX2ljcF9tZ3JfcHJvY2Vzc19pb19jZmcoaHdfbWdyLCBjdHhfZGF0YSwKKwkJcGFja2V0LCBwcmVwYXJlX2FyZ3MsIGlkeCk7CisJaWYgKHJjKSB7CisJCWlmIChjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaWR4XSA+IDApCiAJCQljYW1fc3luY19kZXN0cm95KAotCQkJCXByZXBhcmVfYXJncy0+aW5fbWFwX2VudHJpZXNbMF0uc3luY19pZCk7CisJCQkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2lkeF0pOworCQljbGVhcl9iaXQoaWR4LCBjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuYml0bWFwKTsKKwkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLnJlcXVlc3RfaWRbaWR4XSA9IC0xOwogCQltdXRleF91bmxvY2soJmN0eF9kYXRhLT5jdHhfbXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQpAQCAtMTQwNiw2ICsyMjQ1LDEzIEBACiAKIAkJLyogbm93IHJlbGVhc2UgbWVtb3J5IGZvciBoZmkgZnJhbWUgcHJvY2VzcyBjb21tYW5kICovCiAJCWhmaV9mcmFtZV9wcm9jZXNzLT5yZXF1ZXN0X2lkW2lkeF0gPSAwOworCQlpZiAoY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2lkeF0gPiAwKSB7CisJCQlDQU1fREJHKENBTV9JQ1AsICJEZWxldGUgbWVyZ2VkIHN5bmMgaW4gb2JqZWN0OiAlZCIsCisJCQkJY3R4X2RhdGEtPmhmaV9mcmFtZV9wcm9jZXNzLmluX3Jlc291cmNlW2lkeF0pOworCQkJY2FtX3N5bmNfZGVzdHJveSgKKwkJCQljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaWR4XSk7CisJCQljdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuaW5fcmVzb3VyY2VbaWR4XSA9IDA7CisJfQogCQljbGVhcl9iaXQoaWR4LCBjdHhfZGF0YS0+aGZpX2ZyYW1lX3Byb2Nlc3MuYml0bWFwKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjdHhfZGF0YS0+Y3R4X211dGV4KTsKQEAgLTE0NDksNiArMjI5NSw4IEBACiAJCWNhbV9pY3BfbWdyX2lwZV9icHNfcG93ZXJfY29sbGFwc2UoaHdfbWdyLAogCQkJTlVMTCwgMCk7CiAJCWNhbV9pY3BfbWdyX2h3X2Nsb3NlKGh3X21nciwgTlVMTCk7CisJCWNhbV9pY3BfaHdfbWdyX3Jlc2V0X2Nsa19pbmZvKGh3X21ncik7CisJCWh3X21nci0+c2VjdXJlX21vZGUgPSBDQU1fU0VDVVJFX01PREVfTk9OX1NFQ1VSRTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0xNTk0LDYgKzI0NDIsMTIgQEAKIAkJc2l6ZW9mKHN0cnVjdCBjYW1faWNwX2FjcXVpcmVfZGV2X2luZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKKwlpZiAoaWNwX2Rldl9hY3F1aXJlX2luZm8uc2VjdXJlX21vZGUgPiBDQU1fU0VDVVJFX01PREVfU0VDVVJFKSB7CisJCUNBTV9FUlIoQ0FNX0lDUCwgIkludmFsaWQgbW9kZTolZCIsCisJCQlpY3BfZGV2X2FjcXVpcmVfaW5mby5zZWN1cmVfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChpY3BfZGV2X2FjcXVpcmVfaW5mby5udW1fb3V0X3JlcyA+IElDUF9NQVhfT1VUUFVUX1NVUFBPUlRFRCkgewogCQlDQU1fRVJSKENBTV9JQ1AsICJudW0gb2Ygb3V0IHJlc291cmNlcyBleGNlZWRpbmcgOiAldSIsCiAJCQlpY3BfZGV2X2FjcXVpcmVfaW5mby5udW1fb3V0X3Jlcyk7CkBAIC0xNjA2LDI4ICsyNDYwLDQ2IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCWlmICghaHdfbWdyLT5jdHh0X2NudCkgeworCQlod19tZ3ItPnNlY3VyZV9tb2RlID0gaWNwX2Rldl9hY3F1aXJlX2luZm8uc2VjdXJlX21vZGU7CisJfSBlbHNlIHsKKwkJaWYgKGh3X21nci0+c2VjdXJlX21vZGUgIT0gaWNwX2Rldl9hY3F1aXJlX2luZm8uc2VjdXJlX21vZGUpIHsKKwkJCUNBTV9FUlIoQ0FNX0lDUCwKKwkJCQkic2VjdXJlIG1vZGUgbWlzbWF0Y2ggZHJpdmVyOiVkLCBjb250ZXh0OiVkIiwKKwkJCQlod19tZ3ItPnNlY3VyZV9tb2RlLAorCQkJCWljcF9kZXZfYWNxdWlyZV9pbmZvLnNlY3VyZV9tb2RlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJYWNxdWlyZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBjYW1faWNwX2FjcXVpcmVfZGV2X2luZm8pICsKIAkJKGljcF9kZXZfYWNxdWlyZV9pbmZvLm51bV9vdXRfcmVzICoKIAkJc2l6ZW9mKHN0cnVjdCBjYW1faWNwX3Jlc19pbmZvKSk7CiAJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvID0ga3phbGxvYyhhY3F1aXJlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvKQorCWlmICghY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvKSB7CisJCWlmICghaHdfbWdyLT5jdHh0X2NudCkKKwkJCWh3X21nci0+c2VjdXJlX21vZGUgPSBDQU1fU0VDVVJFX01PREVfTk9OX1NFQ1VSRTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJaWYgKGNvcHlfZnJvbV91c2VyKGN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mbywKIAkJKHZvaWQgX191c2VyICopYXJncy0+YWNxdWlyZV9pbmZvLCBhY3F1aXJlX3NpemUpKSB7CisJCWlmICghaHdfbWdyLT5jdHh0X2NudCkKKwkJCWh3X21nci0+c2VjdXJlX21vZGUgPSBDQU1fU0VDVVJFX01PREVfTk9OX1NFQ1VSRTsKIAkJa2ZyZWUoY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvKTsKIAkJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvID0gTlVMTDsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JQ0FNX0RCRyhDQU1fSUNQLCAiJXggJXggJXggJXggJXggJXggJXgiLAorCUNBTV9EQkcoQ0FNX0lDUCwgIiV4ICV4ICV4ICV4ICV4ICV4ICV4ICV1IiwKIAkJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5kZXZfdHlwZSwKIAkJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5pbl9yZXMuZm9ybWF0LAogCQljdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmluX3Jlcy53aWR0aCwKIAkJY3R4X2RhdGEtPmljcF9kZXZfYWNxdWlyZV9pbmZvLT5pbl9yZXMuaGVpZ2h0LAogCQljdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPmluX3Jlcy5mcHMsCiAJCWN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mby0+bnVtX291dF9yZXMsCi0JCWN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mby0+c2NyYXRjaF9tZW1fc2l6ZSk7CisJCWN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mby0+c2NyYXRjaF9tZW1fc2l6ZSwKKwkJaHdfbWdyLT5zZWN1cmVfbW9kZSk7CiAKIAlwX2ljcF9vdXQgPSBjdHhfZGF0YS0+aWNwX2Rldl9hY3F1aXJlX2luZm8tPm91dF9yZXM7CiAJZm9yIChpID0gMDsgaSA8IGljcF9kZXZfYWNxdWlyZV9pbmZvLm51bV9vdXRfcmVzOyBpKyspCkBAIC0xNjgwLDE4ICsyNTUyLDEwIEBACiAJCWdvdG8gYWNxdWlyZV9pbmZvX2ZhaWxlZDsKIAlpY3BfZGV2X2FjcXVpcmVfaW5mbyA9IGN0eF9kYXRhLT5pY3BfZGV2X2FjcXVpcmVfaW5mbzsKIAotCS8qIEdldCBJT0NPTkZJRyBjb21tYW5kIGluZm8gKi8KLQlpZiAoaWNwX2Rldl9hY3F1aXJlX2luZm8tPnNlY3VyZV9tb2RlKQotCQlyYyA9IGNhbV9tZW1fZ2V0X2lvX2J1ZigKLQkJCWljcF9kZXZfYWNxdWlyZV9pbmZvLT5pb19jb25maWdfY21kX2hhbmRsZSwKLQkJCWh3X21nci0+aW9tbXVfc2VjX2hkbCwKLQkJCSZpb19idWZfYWRkciwgJmlvX2J1Zl9zaXplKTsKLQllbHNlCi0JCXJjID0gY2FtX21lbV9nZXRfaW9fYnVmKAotCQkJaWNwX2Rldl9hY3F1aXJlX2luZm8tPmlvX2NvbmZpZ19jbWRfaGFuZGxlLAotCQkJaHdfbWdyLT5pb21tdV9oZGwsCi0JCQkmaW9fYnVmX2FkZHIsICZpb19idWZfc2l6ZSk7Ci0KKwlyYyA9IGNhbV9tZW1fZ2V0X2lvX2J1ZigKKwkJaWNwX2Rldl9hY3F1aXJlX2luZm8tPmlvX2NvbmZpZ19jbWRfaGFuZGxlLAorCQlod19tZ3ItPmlvbW11X2hkbCwKKwkJJmlvX2J1Zl9hZGRyLCAmaW9fYnVmX3NpemUpOwogCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9JQ1AsICJ1bmFibGUgdG8gZ2V0IHNyYyBidWYgaW5mbyBmcm9tIGlvIGRlc2MiKTsKIAkJZ290byBnZXRfaW9fYnVmX2ZhaWxlZDsKQEAgLTE3MDQsNiArMjU2OCw5IEBACiAJbXV0ZXhfbG9jaygmaHdfbWdyLT5od19tZ3JfbXV0ZXgpOwogCWlmICghaHdfbWdyLT5jdHh0X2NudCkgewogCQltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKKwkJcmMgPSBjYW1faWNwX2Nsa19pbmZvX2luaXQoaHdfbWdyLCBjdHhfZGF0YSk7CisJCWlmIChyYykKKwkJCWdvdG8gZ2V0X2lvX2J1Zl9mYWlsZWQ7CiAJCXJjID0gY2FtX2ljcF9tZ3JfZG93bmxvYWRfZncoaHdfbWdyLCBjdHhfZGF0YSk7CiAJCWlmIChyYykKIAkJCWdvdG8gZ2V0X2lvX2J1Zl9mYWlsZWQ7CkBAIC0xNzQ5LDYgKzI2MTYsNyBAQAogCQlpY3BfZGV2X2FjcXVpcmVfaW5mbywgc2l6ZW9mKHN0cnVjdCBjYW1faWNwX2FjcXVpcmVfZGV2X2luZm8pKSkKIAkJZ290byBjb3B5X3RvX3VzZXJfZmFpbGVkOwogCisJY2FtX2ljcF9jdHhfY2xrX2luZm9faW5pdChjdHhfZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZjdHhfZGF0YS0+Y3R4X211dGV4KTsKIAlDQU1fREJHKENBTV9JQ1AsICJzY3JhdGNoIHNpemUgPSAleCBmd19oYW5kbGUgPSAleCIsCiAJCQkodW5zaWduZWQgaW50KWljcF9kZXZfYWNxdWlyZV9pbmZvLT5zY3JhdGNoX21lbV9zaXplLApAQCAtMjAxNCw2ICsyODgyLDcgQEAKIAlod19tZ3JfaW50Zi0+ZG93bmxvYWRfZncgPSBjYW1faWNwX21ncl9kb3dubG9hZF9mdzsKIAlod19tZ3JfaW50Zi0+aHdfY2xvc2UgPSBjYW1faWNwX21ncl9od19jbG9zZTsKIAorCWljcF9od19tZ3Iuc2VjdXJlX21vZGUgPSBDQU1fU0VDVVJFX01PREVfTk9OX1NFQ1VSRTsKIAltdXRleF9pbml0KCZpY3BfaHdfbWdyLmh3X21ncl9tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJmljcF9od19tZ3IuaHdfbWdyX2xvY2spOwogCkBAIC0yMDI2LDcgKzI4OTUsNyBAQAogCiAJcmMgPSBjYW1fc21tdV9nZXRfaGFuZGxlKCJpY3AiLCAmaWNwX2h3X21nci5pb21tdV9oZGwpOwogCWlmIChyYykgewotCQlDQU1fRVJSKENBTV9JQ1AsICJpY3AgZ2V0IGlvbW11IGhhbmRsZSBmYWlsZWQ6ICVkIiwgcmMpOworCQlDQU1fRVJSKENBTV9JQ1AsICJnZXQgbW11IGhhbmRsZSBmYWlsZWQ6ICVkIiwgcmMpOwogCQlnb3RvIGljcF9nZXRfaGRsX2ZhaWxlZDsKIAl9CiAKQEAgLTIwMzYsNiArMjkwNSwxMiBAQAogCQlnb3RvIGljcF9hdHRhY2hfZmFpbGVkOwogCX0KIAorCXJjID0gY2FtX3NtbXVfZ2V0X2hhbmRsZSgiY2FtLXNlY3VyZSIsICZpY3BfaHdfbWdyLmlvbW11X3NlY19oZGwpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9JQ1AsICJnZXQgc2VjdXJlIG1tdSBoYW5kbGUgZmFpbGVkOiAlZCIsIHJjKTsKKwkJZ290byBzZWN1cmVfaGRsX2ZhaWxlZDsKKwl9CisKIAlyYyA9IGNhbV9pY3BfbWdyX2NyZWF0ZV93cSgpOwogCWlmIChyYykKIAkJZ290byBpY3Bfd3FfY3JlYXRlX2ZhaWxlZDsKQEAgLTIwNDUsNiArMjkyMCw5IEBACiAJcmV0dXJuIHJjOwogCiBpY3Bfd3FfY3JlYXRlX2ZhaWxlZDoKKwljYW1fc21tdV9kZXN0cm95X2hhbmRsZShpY3BfaHdfbWdyLmlvbW11X3NlY19oZGwpOworCWljcF9od19tZ3IuaW9tbXVfc2VjX2hkbCA9IC0xOworc2VjdXJlX2hkbF9mYWlsZWQ6CiAJY2FtX3NtbXVfb3BzKGljcF9od19tZ3IuaW9tbXVfaGRsLCBDQU1fU01NVV9ERVRBQ0gpOwogaWNwX2F0dGFjaF9mYWlsZWQ6CiAJY2FtX3NtbXVfZGVzdHJveV9oYW5kbGUoaWNwX2h3X21nci5pb21tdV9oZGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvY2FtX2ljcF9od19tZ3IuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2NhbV9pY3BfaHdfbWdyLmgKaW5kZXggMjdhODZiMi4uYzRhNDgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvY2FtX2ljcF9od19tZ3IuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9jYW1faWNwX2h3X21nci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSAiY2FtX3JlcV9tZ3Jfd29ya3EuaCIKICNpbmNsdWRlICJjYW1fbWVtX21nci5oIgogI2luY2x1ZGUgImNhbV9zbW11X2FwaS5oIgotCisjaW5jbHVkZSAiY2FtX3NvY191dGlsLmgiCiAKICNkZWZpbmUgQ0FNX0lDUF9ST0xFX1BBUkVOVCAgICAgMQogI2RlZmluZSBDQU1fSUNQX1JPTEVfQ0hJTEQgICAgICAyCkBAIC0zMyw3ICszMyw3IEBACiAKICNkZWZpbmUgQ0FNX01BWF9PVVRfUkVTICAgICAgICAgNgogCi0jZGVmaW5lIElDUF9XT1JLUV9OVU1fVEFTSyAgICAgIDMwCisjZGVmaW5lIElDUF9XT1JLUV9OVU1fVEFTSyAgICAgIDEwMAogI2RlZmluZSBJQ1BfV09SS1FfVEFTS19DTURfVFlQRSAxCiAjZGVmaW5lIElDUF9XT1JLUV9UQVNLX01TR19UWVBFIDIKIApAQCAtNDUsNiArNDUsMTIgQEAKICNkZWZpbmUgSUNQX0ZSQU1FX1BST0NFU1NfU1VDQ0VTUyAwCiAjZGVmaW5lIElDUF9GUkFNRV9QUk9DRVNTX0ZBSUxVUkUgMQogCisjZGVmaW5lIElDUF9DTEtfSFdfSVBFICAgICAgICAgIDB4MAorI2RlZmluZSBJQ1BfQ0xLX0hXX0JQUyAgICAgICAgICAweDEKKyNkZWZpbmUgSUNQX0NMS19IV19NQVggICAgICAgICAgMHgyCisKKyNkZWZpbmUgSUNQX09WRVJfQ0xLX1RIUkVTSE9MRCAgMTUKKwogLyoqCiAgKiBzdHJ1Y3QgaWNwX2hmaV9tZW1faW5mbwogICogQHF0Ymw6IE1lbW9yeSBpbmZvIG9mIHF1ZXVlIHRhYmxlCkBAIC05Nyw2ICsxMDMsOCBAQAogICogQHJlcXVlc3RfaWQ6IFJlcXVlc3QgaWQgbGlzdAogICogQG51bV9vdXRfcmVzb3VyY2VzOiBOdW1iZXIgb2Ygb3V0IHN5bmNzCiAgKiBAb3V0X3Jlc291cmNlOiBPdXQgc3luYyBpbmZvCisgKiBAZndfcHJvY2Vzc19mbGFnOiBGcmFtZSBwcm9jZXNzIGZsYWcKKyAqIEBjbGtfaW5mbzogQ2xvY2sgaW5mb3JtYXRpb24gZm9yIGEgcmVxdWVzdAogICovCiBzdHJ1Y3QgaGZpX2ZyYW1lX3Byb2Nlc3NfaW5mbyB7CiAJc3RydWN0IGhmaV9jbWRfaXBlYnBzX2FzeW5jIGhmaV9mcmFtZV9jbWRbQ0FNX0ZSQU1FX0NNRF9NQVhdOwpAQCAtMTA2LDkgKzExNCwzMSBAQAogCXVpbnQ2NF90IHJlcXVlc3RfaWRbQ0FNX0ZSQU1FX0NNRF9NQVhdOwogCXVpbnQzMl90IG51bV9vdXRfcmVzb3VyY2VzW0NBTV9GUkFNRV9DTURfTUFYXTsKIAl1aW50MzJfdCBvdXRfcmVzb3VyY2VbQ0FNX0ZSQU1FX0NNRF9NQVhdW0NBTV9NQVhfT1VUX1JFU107CisJdWludDMyX3QgaW5fcmVzb3VyY2VbQ0FNX0ZSQU1FX0NNRF9NQVhdOworCXVpbnQzMl90IGZ3X3Byb2Nlc3NfZmxhZ1tDQU1fRlJBTUVfQ01EX01BWF07CisJc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgY2xrX2luZm9bQ0FNX0ZSQU1FX0NNRF9NQVhdOwogfTsKIAogLyoqCisgKiBzdHJ1Y3QgY2FtX2N0eF9jbGtfaW5mbworICogQGN1cnJfZmM6IENvbnRleHQgbGF0ZXN0IHJlcXVlc3QgZnJhbWUgY3ljbGVzCisgKiBAcnRfZmxhZzogRmxhZyB0byBpbmRpY2F0ZSByZWFsIHRpbWUgcmVxdWVzdAorICogQGJhc2VfY2xrOiBCYXNlIGNsb2NrIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QKKyAqIEByZXNlcnZlZDogUmVzZXJ2ZWQgZmllbGQKKyAqICN1bmNvbXByZXNzZWRfYnc6IEN1cnJlbnQgYmFuZHdpZHRoIHZvdGluZworICogQGNvbXByZXNzZWRfYnc6IEN1cnJlbnQgY29tcHJlc3NlZCBiYW5kd2lkdGggdm90aW5nCisgKiBAY2xrX3JhdGU6IFN1cHBvcnRlZCBjbG9jayByYXRlcyBmb3IgdGhlIGNvbnRleHQKKyAqLworc3RydWN0IGNhbV9jdHhfY2xrX2luZm8geworCXVpbnQzMl90IGN1cnJfZmM7CisJdWludDMyX3QgcnRfZmxhZzsKKwl1aW50MzJfdCBiYXNlX2NsazsKKwl1aW50MzJfdCByZXNlcnZlZDsKKwl1aW50NjRfdCB1bmNvbXByZXNzZWRfYnc7CisJdWludDY0X3QgY29tcHJlc3NlZF9idzsKKwlpbnQzMl90IGNsa19yYXRlW0NBTV9NQVhfVk9URV07Cit9OworLyoqCiAgKiBzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YQogICogQGNvbnRleHRfcHJpdjogQ29udGV4dCBwcml2YXRlIGRhdGEKICAqIEBjdHhfbXV0ZXg6IE11dGV4IGZvciBjb250ZXh0CkBAIC0xMjIsOCArMTUyLDkgQEAKICAqIEBjaGFpbl9jdHg6IFBlZXIgY29udGV4dAogICogQGhmaV9mcmFtZV9wcm9jZXNzOiBGcmFtZSBwcm9jZXNzIGNvbW1hbmQKICAqIEB3YWl0X2NvbXBsZXRlOiBDb21wbGV0aW9uIGluZm8KLSAqIEBjdHhfaWQ6IENvbnRleHQgSWQKICAqIEB0ZW1wX3BheWxvYWQ6IFBheWxvYWQgZm9yIGRlc3Ryb3kgaGFuZGxlIGRhdGEKKyAqIEBjdHhfaWQ6IENvbnRleHQgSWQKKyAqIEBjbGtfaW5mbzogQ3VycmVudCBjbG9jayBpbmZvIG9mIGEgY29udGV4dAogICovCiBzdHJ1Y3QgY2FtX2ljcF9od19jdHhfZGF0YSB7CiAJdm9pZCAqY29udGV4dF9wcml2OwpAQCAtMTQwLDYgKzE3MSwzNSBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHdhaXRfY29tcGxldGU7CiAJc3RydWN0IGlwZV9icHNfZGVzdHJveSB0ZW1wX3BheWxvYWQ7CiAJdWludDMyX3QgY3R4X2lkOworCXN0cnVjdCBjYW1fY3R4X2Nsa19pbmZvIGNsa19pbmZvOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWNwX2NtZF9nZW5lcmljX2Jsb2IKKyAqIEBjdHg6IEN1cnJlbnQgY29udGV4dCBpbmZvCisgKiBAZnJhbWVfaW5mb19pZHg6IEluZGV4IHVzZWQgZm9yIGZyYW1lIHByb2Nlc3MgaW5mbworICovCitzdHJ1Y3QgaWNwX2NtZF9nZW5lcmljX2Jsb2IgeworCXN0cnVjdCBjYW1faWNwX2h3X2N0eF9kYXRhICpjdHg7CisJdWludDMyX3QgZnJhbWVfaW5mb19pZHg7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1faWNwX2Nsa19pbmZvCisgKiBAYmFzZV9jbGs6IEJhc2UgY2xvY2sgdG8gcHJvY2VzcyByZXF1ZXN0CisgKiBAY3Vycl9jbGs6IEN1cnJlbnQgY2xvY2sgb2YgaGFkcndhcmUKKyAqIEB0aHJlc2hvbGQ6IFRocmVzaG9sZCBmb3Igb3ZlcmNsayBjb3VudAorICogQG92ZXJfY2xrZWQ6IE92ZXIgY2xvY2sgY291bnQKKyAqICN1bmNvbXByZXNzZWRfYnc6IEN1cnJlbnQgYmFuZHdpZHRoIHZvdGluZworICogQGNvbXByZXNzZWRfYnc6IEN1cnJlbnQgY29tcHJlc3NlZCBiYW5kd2lkdGggdm90aW5nCisgKi8KK3N0cnVjdCBjYW1faWNwX2Nsa19pbmZvIHsKKwl1aW50MzJfdCBiYXNlX2NsazsKKwl1aW50MzJfdCBjdXJyX2NsazsKKwl1aW50MzJfdCB0aHJlc2hvbGQ7CisJdWludDMyX3Qgb3Zlcl9jbGtlZDsKKwl1aW50NjRfdCB1bmNvbXByZXNzZWRfYnc7CisJdWludDY0X3QgY29tcHJlc3NlZF9idzsKIH07CiAKIC8qKgpAQCAtMTY2LDYgKzIyNiwxMCBAQAogICogQGRlbnRyeTogRGVidWdmcyBlbnRyeQogICogQGE1X2RlYnVnOiBBNSBkZWJ1ZyBmbGFnCiAgKiBAaWNwX3BjX2ZsYWc6IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgcG93ZXIgY29sbGFwc2UKKyAqIEBpY3BfZGVidWdfY2xrOiBTZXQgY2xvY2sgYmFzZWQgb24gZGVidWcgdmFsdWUKKyAqIEBpY3BfZGVmYXVsdF9jbGs6IFNldCB0aGlzIGNsb2sgaWYgdXNlciBkb2Vzbid0IHN1cHBseQorICogQGNsa19pbmZvOiBDbG9jayBpbmZvIG9mIGhhcmR3YXJlCisgKiBAc2VjdXJlX21vZGU6IEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgc2VjdXJlIGNhbWVyYQogICovCiBzdHJ1Y3QgY2FtX2ljcF9od19tZ3IgewogCXN0cnVjdCBtdXRleCBod19tZ3JfbXV0ZXg7CkBAIC0xOTIsNiArMjU2LDEwIEBACiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWJvb2wgYTVfZGVidWc7CiAJYm9vbCBpY3BfcGNfZmxhZzsKKwl1aW50NjRfdCBpY3BfZGVidWdfY2xrOworCXVpbnQ2NF90IGljcF9kZWZhdWx0X2NsazsKKwlzdHJ1Y3QgY2FtX2ljcF9jbGtfaW5mbyBjbGtfaW5mb1tJQ1BfQ0xLX0hXX01BWF07CisJYm9vbCBzZWN1cmVfbW9kZTsKIH07CiAKIHN0YXRpYyBpbnQgY2FtX2ljcF9tZ3JfaHdfY2xvc2Uodm9pZCAqaHdfcHJpdiwgdm9pZCAqaHdfY2xvc2VfYXJncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9pbmNsdWRlL2NhbV9icHNfaHdfaW50Zi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvaW5jbHVkZS9jYW1fYnBzX2h3X2ludGYuaAppbmRleCA0NDI3YTMwLi5kNzkxODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9pbmNsdWRlL2NhbV9icHNfaHdfaW50Zi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2luY2x1ZGUvY2FtX2Jwc19od19pbnRmLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAlDQU1fSUNQX0JQU19DTURfVk9URV9DUEFTLAogCUNBTV9JQ1BfQlBTX0NNRF9DUEFTX1NUQVJULAogCUNBTV9JQ1BfQlBTX0NNRF9DUEFTX1NUT1AsCisJQ0FNX0lDUF9CUFNfQ01EX1VQREFURV9DTEssCiAJQ0FNX0lDUF9CUFNfQ01EX01BWCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2luY2x1ZGUvY2FtX2ljcF9od19pbnRmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9pbmNsdWRlL2NhbV9pY3BfaHdfaW50Zi5oCmluZGV4IDkzMDBlYTguLjY5MTVhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2luY2x1ZGUvY2FtX2ljcF9od19pbnRmLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvaW5jbHVkZS9jYW1faWNwX2h3X2ludGYuaApAQCAtMTMsOCArMTMsNiBAQAogI2lmbmRlZiBDQU1fSUNQX0hXX0lOVEZfSAogI2RlZmluZSBDQU1fSUNQX0hXX0lOVEZfSAogCi0jZGVmaW5lIENBTV9JQ1BfQ1RYX01BWCAgICAgICAgICAgICAgICAgOAotCiAjZGVmaW5lIENBTV9JQ1BfQ01EX0JVRl9NQVhfU0laRSAgICAgMTI4CiAjZGVmaW5lIENBTV9JQ1BfTVNHX0JVRl9NQVhfU0laRSAgICAgQ0FNX0lDUF9DTURfQlVGX01BWF9TSVpFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2luY2x1ZGUvY2FtX2lwZV9od19pbnRmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaWNwX2h3X21nci9pbmNsdWRlL2NhbV9pcGVfaHdfaW50Zi5oCmluZGV4IDBkYjY2YzAuLjY5Nzc1N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pY3BfaHdfbWdyL2luY2x1ZGUvY2FtX2lwZV9od19pbnRmLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2ljcF9od19tZ3IvaW5jbHVkZS9jYW1faXBlX2h3X2ludGYuaApAQCAtMjYsNiArMjYsNyBAQAogCUNBTV9JQ1BfSVBFX0NNRF9WT1RFX0NQQVMsCiAJQ0FNX0lDUF9JUEVfQ01EX0NQQVNfU1RBUlQsCiAJQ0FNX0lDUF9JUEVfQ01EX0NQQVNfU1RPUCwKKwlDQU1fSUNQX0lQRV9DTURfVVBEQVRFX0NMSywKIAlDQU1fSUNQX0lQRV9DTURfTUFYLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2luY2x1ZGUvY2FtX2ljcF9od19tZ3JfaW50Zi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2luY2x1ZGUvY2FtX2ljcF9od19tZ3JfaW50Zi5oCmluZGV4IDJmMTAwY2EuLjRmNmZjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pbmNsdWRlL2NhbV9pY3BfaHdfbWdyX2ludGYuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaW5jbHVkZS9jYW1faWNwX2h3X21ncl9pbnRmLmgKQEAgLTE4LDcgKzE4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgImNhbV9jcGFzX2FwaS5oIgogCi0jZGVmaW5lIElDUF9UVVJCT19WT1RFICAgICAgICAgICA2NDAwMDAwMDAKKyNkZWZpbmUgSUNQX1RVUkJPX1ZPVEUgICAgICAgICAgIDYwMDAwMDAwMAorI2RlZmluZSBJQ1BfU1ZTX1ZPVEUgICAgICAgICAgICAgNDAwMDAwMDAwCisjZGVmaW5lIENBTV9JQ1BfQ1RYX01BWCAgICAgICAgICAzNgogCiBpbnQgY2FtX2ljcF9od19tZ3JfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCiAJdWludDY0X3QgKmh3X21ncl9oZGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2lwZV9ody9pcGVfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pY3AvaWNwX2h3L2lwZV9ody9pcGVfY29yZS5jCmluZGV4IDc5YzMzODguLjg2MzBlMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9jb3JlLmMKQEAgLTczLDggKzczLDggQEAKIAogCWNwYXNfdm90ZS5haGJfdm90ZS50eXBlID0gQ0FNX1ZPVEVfQUJTT0xVVEU7CiAJY3Bhc192b3RlLmFoYl92b3RlLnZvdGUubGV2ZWwgPSBDQU1fU1ZTX1ZPVEU7Ci0JY3Bhc192b3RlLmF4aV92b3RlLmNvbXByZXNzZWRfYncgPSBJQ1BfVFVSQk9fVk9URTsKLQljcGFzX3ZvdGUuYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gSUNQX1RVUkJPX1ZPVEU7CisJY3Bhc192b3RlLmF4aV92b3RlLmNvbXByZXNzZWRfYncgPSBDQU1fQ1BBU19ERUZBVUxUX0FYSV9CVzsKKwljcGFzX3ZvdGUuYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gQ0FNX0NQQVNfREVGQVVMVF9BWElfQlc7CiAKIAlyYyA9IGNhbV9jcGFzX3N0YXJ0KGNvcmVfaW5mby0+Y3Bhc19oYW5kbGUsCiAJCSZjcGFzX3ZvdGUuYWhiX3ZvdGUsICZjcGFzX3ZvdGUuYXhpX3ZvdGUpOwpAQCAtMjYzLDYgKzI2MywxMyBAQAogCWNhc2UgQ0FNX0lDUF9JUEVfQ01EX1BPV0VSX1JFU1VNRToKIAkJcmMgPSBjYW1faXBlX2hhbmRsZV9yZXN1bWUoaXBlX2Rldik7CiAJCWJyZWFrOworCWNhc2UgQ0FNX0lDUF9JUEVfQ01EX1VQREFURV9DTEs6IHsKKwkJdWludDMyX3QgY2xrX3JhdGUgPSAqKHVpbnQzMl90ICopY21kX2FyZ3M7CisKKwkJQ0FNX0RCRyhDQU1fSUNQLCAiaXBlX3NyY19jbGsgcmF0ZSA9ICVkIiwgKGludCljbGtfcmF0ZSk7CisJCXJjID0gY2FtX2lwZV91cGRhdGVfY2xrX3JhdGUoc29jX2luZm8sIGNsa19yYXRlKTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX2Rldi5jCmluZGV4IGQxMzM2M2UuLmNiZDlkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX2Rldi5jCkBAIC04Niw2ICs4Niw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpcGVfZGV2LT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlpcGVfZGV2LT5zb2NfaW5mby5kZXYgPSAmcGRldi0+ZGV2OworCWlwZV9kZXYtPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAlpcGVfZGV2X2ludGYtPmh3X3ByaXYgPSBpcGVfZGV2OwogCWlwZV9kZXZfaW50Zi0+aHdfb3BzLmluaXQgPSBjYW1faXBlX2luaXRfaHc7CiAJaXBlX2Rldl9pbnRmLT5od19vcHMuZGVpbml0ID0gY2FtX2lwZV9kZWluaXRfaHc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX3NvYy5jCmluZGV4IGU3YjI3MzNmLi40OTE3NmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9zb2MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9zb2MuYwpAQCAtMTM1LDMgKzEzNSwxMyBAQAogCiAJcmV0dXJuIHJjOwogfQorCitpbnQgY2FtX2lwZV91cGRhdGVfY2xrX3JhdGUoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8sCisJdWludDMyX3QgY2xrX3JhdGUpCit7CisJaWYgKCFzb2NfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY2FtX3NvY191dGlsX3NldF9jbGtfcmF0ZShzb2NfaW5mby0+Y2xrW3NvY19pbmZvLT5zcmNfY2xrX2lkeF0sCisJCXNvY19pbmZvLT5jbGtfbmFtZVtzb2NfaW5mby0+c3JjX2Nsa19pZHhdLCBjbGtfcmF0ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2ljcC9pY3BfaHcvaXBlX2h3L2lwZV9zb2MuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX3NvYy5oCmluZGV4IGVkOGJiNmUuLjhlNWEzOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX3NvYy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faWNwL2ljcF9ody9pcGVfaHcvaXBlX3NvYy5oCkBAIC0yNSw0ICsyNSw3IEBACiBpbnQgY2FtX2lwZV9nZXRfZ2RzY19jb250cm9sKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKTsKIAogaW50IGNhbV9pcGVfdHJhbnNmZXJfZ2RzY19jb250cm9sKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvKTsKKworaW50IGNhbV9pcGVfdXBkYXRlX2Nsa19yYXRlKHN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvLAorCXVpbnQzMl90IGNsa19yYXRlKTsKICNlbmRpZiAvKiBDQU1fSVBFX1NPQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9jYW1faXNwX2NvbnRleHQuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2NhbV9pc3BfY29udGV4dC5jCmluZGV4IGE2ZjYwZjUuLmFhZDc5MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2NhbV9pc3BfY29udGV4dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2NhbV9pc3BfY29udGV4dC5jCkBAIC0yNCw2ICsyNCw5MSBAQAogI2luY2x1ZGUgImNhbV90cmFjZS5oIgogI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCiAKK3N0YXRpYyBpbnQgX19jYW1faXNwX2N0eF9lbnF1ZXVlX3JlcXVlc3RfaW5fb3JkZXIoCisJc3RydWN0IGNhbV9jb250ZXh0ICpjdHgsIHN0cnVjdCBjYW1fY3R4X3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2FtX2N0eF9yZXF1ZXN0ICAgICAgICAgICAqcmVxX2N1cnJlbnQ7CisJc3RydWN0IGNhbV9jdHhfcmVxdWVzdCAgICAgICAgICAgKnJlcV9wcmV2OworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICAgICB0ZW1wX2xpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmdGVtcF9saXN0KTsKKwlzcGluX2xvY2tfYmgoJmN0eC0+bG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+cGVuZGluZ19yZXFfbGlzdCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmY3R4LT5wZW5kaW5nX3JlcV9saXN0KTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZSgKKwkJCXJlcV9jdXJyZW50LCByZXFfcHJldiwgJmN0eC0+cGVuZGluZ19yZXFfbGlzdCwgbGlzdCkgeworCQkJaWYgKHJlcS0+cmVxdWVzdF9pZCA8IHJlcV9jdXJyZW50LT5yZXF1ZXN0X2lkKSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmcmVxX2N1cnJlbnQtPmxpc3QpOworCQkJCWxpc3RfYWRkKCZyZXFfY3VycmVudC0+bGlzdCwgJnRlbXBfbGlzdCk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHJlcS0+cmVxdWVzdF9pZCA9PSByZXFfY3VycmVudC0+cmVxdWVzdF9pZCkgeworCQkJCUNBTV9XQVJOKENBTV9JU1AsCisJCQkJCSJSZWNlaXZlZCBkdXBsaWNhdGVkIHJlcXVlc3QgJWxsZCIsCisJCQkJCXJlcS0+cmVxdWVzdF9pZCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZjdHgtPnBlbmRpbmdfcmVxX2xpc3QpOworCisJCWlmICghbGlzdF9lbXB0eSgmdGVtcF9saXN0KSkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKAorCQkJCXJlcV9jdXJyZW50LCByZXFfcHJldiwgJnRlbXBfbGlzdCwgbGlzdCkgeworCQkJCWxpc3RfZGVsX2luaXQoJnJlcV9jdXJyZW50LT5saXN0KTsKKwkJCQlsaXN0X2FkZF90YWlsKCZyZXFfY3VycmVudC0+bGlzdCwKKwkJCQkJJmN0eC0+cGVuZGluZ19yZXFfbGlzdCk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmN0eC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfX2NhbV9pc3BfcmVzb3VyY2VfaGFuZGxlX2lkX3RvX3R5cGUKKwkodWludDMyX3QgcmVzb3VyY2VfaGFuZGxlKQoreworCXN3aXRjaCAocmVzb3VyY2VfaGFuZGxlKSB7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX0ZVTEw6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19GVUxMIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfRFM0OgorCQlyZXR1cm4gIkNBTV9JU1BfSUZFX09VVF9SRVNfRFM0IjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfRFMxNjoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX0RTMTYiOworCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19SQVdfRFVNUDoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1JBV19EVU1QIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfRkQ6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19GRCI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1BEQUY6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19QREFGIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfUkRJXzA6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMCI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1JESV8xOgorCQlyZXR1cm4gIkNBTV9JU1BfSUZFX09VVF9SRVNfUkRJXzEiOworCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMjoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1JESV8yIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfUkRJXzM6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMyI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0hEUl9CRToKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0hEUl9CRSI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0hEUl9CSElTVDoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0hEUl9CSElTVCI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX1RMX0JHOgorCQlyZXR1cm4gIkNBTV9JU1BfSUZFX09VVF9SRVNfU1RBVFNfVExfQkciOworCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19TVEFUU19CRjoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0JGIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfU1RBVFNfQVdCX0JHOgorCQlyZXR1cm4gIkNBTV9JU1BfSUZFX09VVF9SRVNfU1RBVFNfQVdCX0JHIjsKKwljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfU1RBVFNfQkhJU1Q6CisJCXJldHVybiAiQ0FNX0lTUF9JRkVfT1VUX1JFU19TVEFUU19CSElTVCI7CisJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX1JTOgorCQlyZXR1cm4gIkNBTV9JU1BfSUZFX09VVF9SRVNfU1RBVFNfUlMiOworCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19TVEFUU19DUzoKKwkJcmV0dXJuICJDQU1fSVNQX0lGRV9PVVRfUkVTX1NUQVRTX0NTIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIkNBTV9JU1BfSW52YWxpZF9SZXNvdXJjZV9UeXBlIjsKKwl9Cit9CisKIHN0YXRpYyB1aW50NjRfdCBfX2NhbV9pc3BfY3R4X2dldF9ldmVudF90cyh1aW50MzJfdCBldnRfaWQsIHZvaWQgKmV2dF9kYXRhKQogewogCXVpbnQ2NF90IHRzID0gMDsKQEAgLTYxLDYgKzE0NiwyMyBAQAogCXJldHVybiB0czsKIH0KIAorc3RhdGljIHZvaWQgX19jYW1faXNwX2N0eF9oYW5kbGVfYnVmX2RvbmVfZmFpbF9sb2coCisJc3RydWN0IGNhbV9pc3BfY3R4X3JlcSAqcmVxX2lzcCkKK3sKKwlpbnQgaTsKKworCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAorCQkiUmVzb3VyY2UgSGFuZGxlcyB0aGF0IGZhaWwgdG8gZ2VuZXJhdGUgYnVmX2RvbmUgaW4gcHJldiBmcmFtZSIpOworCWZvciAoaSA9IDA7IGkgPCByZXFfaXNwLT5udW1fZmVuY2VfbWFwX291dDsgaSsrKSB7CisJCWlmIChyZXFfaXNwLT5mZW5jZV9tYXBfb3V0W2ldLnN5bmNfaWQgIT0gLTEpCisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAorCQkJIlJlc291cmNlX0hhbmRsZTogWyVzXSBTeW5jX0lEOiBbMHgleF0iLAorCQkJX19jYW1faXNwX3Jlc291cmNlX2hhbmRsZV9pZF90b190eXBlKAorCQkJcmVxX2lzcC0+ZmVuY2VfbWFwX291dFtpXS5yZXNvdXJjZV9oYW5kbGUpLAorCQkJcmVxX2lzcC0+ZmVuY2VfbWFwX291dFtpXS5zeW5jX2lkKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19jYW1faXNwX2N0eF9oYW5kbGVfYnVmX2RvbmVfaW5fYWN0aXZhdGVkX3N0YXRlKAogCXN0cnVjdCBjYW1faXNwX2NvbnRleHQgKmN0eF9pc3AsCiAJc3RydWN0IGNhbV9pc3BfaHdfZG9uZV9ldmVudF9kYXRhICpkb25lLApAQCAtMTAzLDggKzIwNSwxMiBAQAogCQlpZiAoIWJ1YmJsZV9zdGF0ZSkgewogCQkJQ0FNX0RCRyhDQU1fSVNQLCAiU3luYyB3aXRoIHN1Y2Nlc3M6IGZkIDB4JXgiLAogCQkJCSAgIHJlcV9pc3AtPmZlbmNlX21hcF9vdXRbal0uc3luY19pZCk7Ci0JCQlyYyA9IGNhbV9zeW5jX3NpZ25hbChyZXFfaXNwLT5mZW5jZV9tYXBfb3V0W2pdLnN5bmNfaWQsCi0JCQkJQ0FNX1NZTkNfU1RBVEVfU0lHTkFMRURfU1VDQ0VTUyk7CisJCQlpZiAocmVxX2lzcC0+ZmVuY2VfbWFwX291dFtqXS5zeW5jX2lkID09IC0xKQorCQkJCV9fY2FtX2lzcF9jdHhfaGFuZGxlX2J1Zl9kb25lX2ZhaWxfbG9nKHJlcV9pc3ApOworCQkJZWxzZQorCQkJCXJjID0gY2FtX3N5bmNfc2lnbmFsKHJlcV9pc3AtPgorCQkJCQlmZW5jZV9tYXBfb3V0W2pdLnN5bmNfaWQsCisJCQkJCUNBTV9TWU5DX1NUQVRFX1NJR05BTEVEX1NVQ0NFU1MpOwogCQkJaWYgKHJjKQogCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIlN5bmMgZmFpbGVkIHdpdGggcmMgPSAlZCIsCiAJCQkJCSByYyk7CkBAIC0yMTksNyArMzI1LDggQEAKIHN0YXRpYyBpbnQgX19jYW1faXNwX2N0eF9ub3RpZnlfc29mX2luX2FjdGl2ZWRfc3RhdGUoCiAJc3RydWN0IGNhbV9pc3BfY29udGV4dCAqY3R4X2lzcCwgdm9pZCAqZXZ0X2RhdGEpCiB7Ci0Jc3RydWN0IGNhbV9yZXFfbWdyX3NvZl9ub3RpZnkgIG5vdGlmeTsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1fcmVxX21ncl90cmlnZ2VyX25vdGlmeSAgbm90aWZ5OwogCXN0cnVjdCBjYW1fY29udGV4dCAqY3R4ID0gY3R4X2lzcC0+YmFzZTsKIAlzdHJ1Y3QgY2FtX2N0eF9yZXF1ZXN0ICAqcmVxOwogCXVpbnQ2NF90ICByZXF1ZXN0X2lkICA9IDA7CkBAIC0yMzEsMTUgKzMzOCwxOCBAQAogCSAqIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IG5vdGlmaWNhdGlvbi4gVGhpcwogCSAqIGhlbHBzIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNhdGNoIHVwIHRoZSBkZWxheS4KIAkgKi8KLQlpZiAoY3R4LT5jdHhfY3JtX2ludGYgJiYgY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV9zb2YgJiYKKwlpZiAoY3R4LT5jdHhfY3JtX2ludGYgJiYgY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV90cmlnZ2VyICYmCiAJCWN0eF9pc3AtPmFjdGl2ZV9yZXFfY250IDw9IDIpIHsKLQkJbm90aWZ5LmxpbmtfaGRsID0gY3R4LT5saW5rX2hkbDsKLQkJbm90aWZ5LmRldl9oZGwgPSBjdHgtPmRldl9oZGw7Ci0JCW5vdGlmeS5mcmFtZV9pZCA9IGN0eF9pc3AtPmZyYW1lX2lkOworCQlpZiAoY3R4X2lzcC0+c3Vic2NyaWJlX2V2ZW50ICYgQ0FNX1RSSUdHRVJfUE9JTlRfU09GKSB7CisJCQlub3RpZnkubGlua19oZGwgPSBjdHgtPmxpbmtfaGRsOworCQkJbm90aWZ5LmRldl9oZGwgPSBjdHgtPmRldl9oZGw7CisJCQlub3RpZnkuZnJhbWVfaWQgPSBjdHhfaXNwLT5mcmFtZV9pZDsKKwkJCW5vdGlmeS50cmlnZ2VyID0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GOwogCi0JCWN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfc29mKCZub3RpZnkpOwotCQlDQU1fREJHKENBTV9JU1AsICJOb3RpZnkgQ1JNICBTT0YgZnJhbWUgJWxsZCIsCi0JCQljdHhfaXNwLT5mcmFtZV9pZCk7CisJCQljdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3RyaWdnZXIoJm5vdGlmeSk7CisJCQlDQU1fREJHKENBTV9JU1AsICJOb3RpZnkgQ1JNICBTT0YgZnJhbWUgJWxsZCIsCisJCQkJY3R4X2lzcC0+ZnJhbWVfaWQpOworCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZjdHgtPmFjdGl2ZV9yZXFfbGlzdCwgbGlzdCkgewogCQkJaWYgKHJlcS0+cmVxdWVzdF9pZCA+IGN0eF9pc3AtPnJlcG9ydGVkX3JlcV9pZCkgewpAQCAtMjUyLDEyICszNjIsNDAgQEAKIAkJX19jYW1faXNwX2N0eF9zZW5kX3NvZl90aW1lc3RhbXAoY3R4X2lzcCwgcmVxdWVzdF9pZCwKIAkJCUNBTV9SRVFfTUdSX1NPRl9FVkVOVF9TVUNDRVNTKTsKIAl9IGVsc2UgewotCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IG5vdGlmeSBTT0YgdG8gQ1JNIik7CisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLCAiQ2FuIG5vdCBub3RpZnkgU09GIHRvIENSTSIpOworCQlyYyA9IC1FRkFVTFQ7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19jYW1faXNwX2N0eF9ub3RpZnlfZW9mX2luX2FjdGl2ZWRfc3RhdGUoCisJc3RydWN0IGNhbV9pc3BfY29udGV4dCAqY3R4X2lzcCwgdm9pZCAqZXZ0X2RhdGEpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgIG5vdGlmeTsKKwlzdHJ1Y3QgY2FtX2NvbnRleHQgKmN0eCA9IGN0eF9pc3AtPmJhc2U7CisKKwlpZiAoIShjdHhfaXNwLT5zdWJzY3JpYmVfZXZlbnQgJiBDQU1fVFJJR0dFUl9QT0lOVF9FT0YpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBub3RpZnkgcmVxbWdyIHdpdGggZW9mIHNpZ25hbCAqLworCWlmIChjdHgtPmN0eF9jcm1faW50ZiAmJiBjdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3RyaWdnZXIpIHsKKwkJbm90aWZ5LmxpbmtfaGRsID0gY3R4LT5saW5rX2hkbDsKKwkJbm90aWZ5LmRldl9oZGwgPSBjdHgtPmRldl9oZGw7CisJCW5vdGlmeS5mcmFtZV9pZCA9IGN0eF9pc3AtPmZyYW1lX2lkOworCQlub3RpZnkudHJpZ2dlciA9IENBTV9UUklHR0VSX1BPSU5UX0VPRjsKKworCQljdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3RyaWdnZXIoJm5vdGlmeSk7CisJCUNBTV9EQkcoQ0FNX0lTUCwgIk5vdGlmeSBDUk0gRU9GIGZyYW1lICVsbGRcbiIsCisJCQljdHhfaXNwLT5mcmFtZV9pZCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBub3RpZnkgRU9GIHRvIENSTSIpOworCQlyYyA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIHJjOworfQogCiBzdGF0aWMgaW50IF9fY2FtX2lzcF9jdHhfc29mX2luX2FjdGl2YXRlZF9zdGF0ZSgKIAlzdHJ1Y3QgY2FtX2lzcF9jb250ZXh0ICpjdHhfaXNwLCB2b2lkICpldnRfZGF0YSkKQEAgLTU0Miw3ICs2ODAsOCBAQAogCSAqLwogCiAJaWYgKGxpc3RfZW1wdHkoJmN0eC0+YWN0aXZlX3JlcV9saXN0KSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJoYW5kbGluZyBlcnJvciB3aXRoIG5vIGFjdGl2ZSByZXF1ZXN0Iik7CisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAorCQkJImhhbmRsaW5nIGVycm9yIHdpdGggbm8gYWN0aXZlIHJlcXVlc3QiKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGVuZDsKIAl9CkBAIC01NTYsMTAgKzY5NSwxMCBAQAogCQlub3RpZnkucmVxX2lkID0gcmVxLT5yZXF1ZXN0X2lkOwogCiAJCWN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfZXJyKCZub3RpZnkpOwotCQlDQU1fRVJSKENBTV9JU1AsICJOb3RpZnkgQ1JNIGFib3V0IEVSUk9SIGZyYW1lICVsbGQiLAorCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwgIk5vdGlmeSBDUk0gYWJvdXQgRVJST1IgZnJhbWUgJWxsZCIsCiAJCQljdHhfaXNwLT5mcmFtZV9pZCk7CiAJfSBlbHNlIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBub3RpZnkgRVJSUk9SIHRvIENSTSIpOworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwgIkNhbiBub3Qgbm90aWZ5IEVSUlJPUiB0byBDUk0iKTsKIAkJcmMgPSAtRUZBVUxUOwogCX0KIApAQCAtNTgxLDcgKzcyMCw3IEBACiAJCQlfX2NhbV9pc3BfY3R4X3NvZl9pbl9hY3RpdmF0ZWRfc3RhdGUsCiAJCQlfX2NhbV9pc3BfY3R4X3JlZ191cGRfaW5fc29mLAogCQkJX19jYW1faXNwX2N0eF9ub3RpZnlfc29mX2luX2FjdGl2ZWRfc3RhdGUsCi0JCQlOVUxMLAorCQkJX19jYW1faXNwX2N0eF9ub3RpZnlfZW9mX2luX2FjdGl2ZWRfc3RhdGUsCiAJCQlOVUxMLAogCQl9LAogCX0sCkBAIC01OTIsNyArNzMxLDcgQEAKIAkJCV9fY2FtX2lzcF9jdHhfc29mX2luX2FjdGl2YXRlZF9zdGF0ZSwKIAkJCV9fY2FtX2lzcF9jdHhfcmVnX3VwZF9pbl9hY3RpdmF0ZWRfc3RhdGUsCiAJCQlfX2NhbV9pc3BfY3R4X2Vwb2NoX2luX2FwcGxpZWQsCi0JCQlOVUxMLAorCQkJX19jYW1faXNwX2N0eF9ub3RpZnlfZW9mX2luX2FjdGl2ZWRfc3RhdGUsCiAJCQlfX2NhbV9pc3BfY3R4X2J1Zl9kb25lX2luX2FwcGxpZWQsCiAJCX0sCiAJfSwKQEAgLTYwMyw3ICs3NDIsNyBAQAogCQkJX19jYW1faXNwX2N0eF9zb2ZfaW5fZXBvY2gsCiAJCQlOVUxMLAogCQkJX19jYW1faXNwX2N0eF9ub3RpZnlfc29mX2luX2FjdGl2ZWRfc3RhdGUsCi0JCQlOVUxMLAorCQkJX19jYW1faXNwX2N0eF9ub3RpZnlfZW9mX2luX2FjdGl2ZWRfc3RhdGUsCiAJCQlfX2NhbV9pc3BfY3R4X2J1Zl9kb25lX2luX2Vwb2NoLAogCQl9LAogCX0sCkBAIC02MTQsNyArNzUzLDcgQEAKIAkJCV9fY2FtX2lzcF9jdHhfc29mX2luX2FjdGl2YXRlZF9zdGF0ZSwKIAkJCU5VTEwsCiAJCQlfX2NhbV9pc3BfY3R4X25vdGlmeV9zb2ZfaW5fYWN0aXZlZF9zdGF0ZSwKLQkJCU5VTEwsCisJCQlfX2NhbV9pc3BfY3R4X25vdGlmeV9lb2ZfaW5fYWN0aXZlZF9zdGF0ZSwKIAkJCV9fY2FtX2lzcF9jdHhfYnVmX2RvbmVfaW5fYnViYmxlLAogCQl9LAogCX0sCkBAIC02NTgsMTQgKzc5Nyw2IEBACiAJICoKIAkgKi8KIAljdHhfaXNwID0gKHN0cnVjdCBjYW1faXNwX2NvbnRleHQgKikgY3R4LT5jdHhfcHJpdjsKLQlpZiAoY3R4X2lzcC0+YWN0aXZlX3JlcV9jbnQgPj0gIDIpIHsKLQkJQ0FNX0RCRyhDQU1fSVNQLAotCQkJIlJlamVjdCBhcHBseSByZXF1ZXN0IGR1ZSB0byBjb25nZXN0aW9uKGNudCA9ICVkKSIsCi0JCQljdHhfaXNwLT5hY3RpdmVfcmVxX2NudCk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlbmQ7Ci0JfQotCiAJcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmY3R4LT5wZW5kaW5nX3JlcV9saXN0LCBzdHJ1Y3QgY2FtX2N0eF9yZXF1ZXN0LAogCQlsaXN0KTsKIApAQCAtNjc0LDYgKzgwNSw5IEBACiAJICogd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGVycm9yIGhhbmRsaW5nLiBOZWVkIHRvIHJlamVjdCB0aGlzIGFwcGx5CiAJICovCiAJaWYgKHJlcS0+cmVxdWVzdF9pZCAhPSBhcHBseS0+cmVxdWVzdF9pZCkgeworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwKKwkJCSJJbnZhbGlkIFJlcXVlc3QgSWQgYXNraW5nICVsbHUgZXhpc3RpbmcgJWxsdSIsCisJCQlhcHBseS0+cmVxdWVzdF9pZCwgcmVxLT5yZXF1ZXN0X2lkKTsKIAkJcmMgPSAtRUZBVUxUOwogCQlnb3RvIGVuZDsKIAl9CkBAIC02ODEsNiArODE1LDE0IEBACiAJQ0FNX0RCRyhDQU1fSVNQLCAiQXBwbHkgcmVxdWVzdCAlbGxkIiwgcmVxLT5yZXF1ZXN0X2lkKTsKIAlyZXFfaXNwID0gKHN0cnVjdCBjYW1faXNwX2N0eF9yZXEgKikgcmVxLT5yZXFfcHJpdjsKIAorCWlmIChjdHhfaXNwLT5hY3RpdmVfcmVxX2NudCA+PSAgMikgeworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwKKwkJCSJSZWplY3QgYXBwbHkgcmVxdWVzdCBkdWUgdG8gY29uZ2VzdGlvbihjbnQgPSAlZCkiLAorCQkJY3R4X2lzcC0+YWN0aXZlX3JlcV9jbnQpOworCQlfX2NhbV9pc3BfY3R4X2hhbmRsZV9idWZfZG9uZV9mYWlsX2xvZyhyZXFfaXNwKTsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGVuZDsKKwl9CiAJcmVxX2lzcC0+YnViYmxlX3JlcG9ydCA9IGFwcGx5LT5yZXBvcnRfaWZfYnViYmxlOwogCiAJY2ZnLmN0eHRfdG9faHdfbWFwID0gY3R4X2lzcC0+aHdfY3R4OwpAQCAtNjg5LDcgKzgzMSw3IEBACiAKIAlyYyA9IGN0eC0+aHdfbWdyX2ludGYtPmh3X2NvbmZpZyhjdHgtPmh3X21ncl9pbnRmLT5od19tZ3JfcHJpdiwgJmNmZyk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgYXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24iKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsICJDYW4gbm90IGFwcGx5IHRoZSBjb25maWd1cmF0aW9uIik7CiAJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrX2JoKCZjdHgtPmxvY2spOwogCQljdHhfaXNwLT5zdWJzdGF0ZV9hY3RpdmF0ZWQgPSBuZXh0X3N0YXRlOwpAQCAtODkwLDcgKzEwMzIsNyBAQAogewogCWludCByYyA9IDA7CiAJc3RydWN0IGNhbV9jb250ZXh0ICAgICAgICAgICAgICAgICAgICAqY3R4ID0gY3R4X2lzcC0+YmFzZTsKLQlzdHJ1Y3QgY2FtX3JlcV9tZ3Jfc29mX25vdGlmeSAgICAgICAgICBub3RpZnk7CisJc3RydWN0IGNhbV9yZXFfbWdyX3RyaWdnZXJfbm90aWZ5ICAgICAgbm90aWZ5OwogCXN0cnVjdCBjYW1faXNwX2h3X3NvZl9ldmVudF9kYXRhICAgICAgKnNvZl9ldmVudF9kYXRhID0gZXZ0X2RhdGE7CiAJdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9pZCAgPSAwOwogCkBAIC05MTEsMTMgKzEwNTMsMTQgQEAKIAkgKiBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBub3RpZmljYXRpb24uIFRoaXMKIAkgKiBoZWxwcyB0aGUgc3RhdGUgbWFjaGluZSB0byBjYXRjaCB1cCB0aGUgZGVsYXkuCiAJICovCi0JaWYgKGN0eC0+Y3R4X2NybV9pbnRmICYmIGN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfc29mICYmCisJaWYgKGN0eC0+Y3R4X2NybV9pbnRmICYmIGN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfdHJpZ2dlciAmJgogCQljdHhfaXNwLT5hY3RpdmVfcmVxX2NudCA8PSAyKSB7CiAJCW5vdGlmeS5saW5rX2hkbCA9IGN0eC0+bGlua19oZGw7CiAJCW5vdGlmeS5kZXZfaGRsID0gY3R4LT5kZXZfaGRsOwogCQlub3RpZnkuZnJhbWVfaWQgPSBjdHhfaXNwLT5mcmFtZV9pZDsKKwkJbm90aWZ5LnRyaWdnZXIgPSBDQU1fVFJJR0dFUl9QT0lOVF9TT0Y7CiAKLQkJY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV9zb2YoJm5vdGlmeSk7CisJCWN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfdHJpZ2dlcigmbm90aWZ5KTsKIAkJQ0FNX0RCRyhDQU1fSVNQLCAiTm90aWZ5IENSTSAgU09GIGZyYW1lICVsbGQiLAogCQkJY3R4X2lzcC0+ZnJhbWVfaWQpOwogCkBAIC05MjgsNyArMTA3MSw3IEBACiAJCV9fY2FtX2lzcF9jdHhfc2VuZF9zb2ZfdGltZXN0YW1wKGN0eF9pc3AsIHJlcXVlc3RfaWQsCiAJCQlDQU1fUkVRX01HUl9TT0ZfRVZFTlRfU1VDQ0VTUyk7CiAJfSBlbHNlIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBub3RpZnkgU09GIHRvIENSTSIpOworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwgIkNhbiBub3Qgbm90aWZ5IFNPRiB0byBDUk0iKTsKIAl9CiAKIAlpZiAobGlzdF9lbXB0eSgmY3R4LT5hY3RpdmVfcmVxX2xpc3QpKQpAQCAtMTAzNyw3ICsxMTgwLDcgQEAKIAl1aW50MzJfdCBpOwogCXN0cnVjdCBjYW1fY3R4X3JlcXVlc3QgICAgICAgICAgICAgICAgKnJlcTsKIAlzdHJ1Y3QgY2FtX2NvbnRleHQgICAgICAgICAgICAgICAgICAgICpjdHggPSBjdHhfaXNwLT5iYXNlOwotCXN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5ICAgICAgICAgIG5vdGlmeTsKKwlzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgICAgICBub3RpZnk7CiAJc3RydWN0IGNhbV9pc3BfaHdfc29mX2V2ZW50X2RhdGEgICAgICAqc29mX2V2ZW50X2RhdGEgPSBldnRfZGF0YTsKIAlzdHJ1Y3QgY2FtX2lzcF9jdHhfcmVxICAgICAgICAgICAgICAgICpyZXFfaXNwOwogCXVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfaWQgID0gMDsKQEAgLTEwNzIsMTIgKzEyMTUsMTMgQEAKIAl9CiAKIAkvKiBub3RpZnkgcmVxbWdyIHdpdGggc29mIHNpZ25hbCAqLwotCWlmIChjdHgtPmN0eF9jcm1faW50ZiAmJiBjdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3NvZikgeworCWlmIChjdHgtPmN0eF9jcm1faW50ZiAmJiBjdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3RyaWdnZXIpIHsKIAkJbm90aWZ5LmxpbmtfaGRsID0gY3R4LT5saW5rX2hkbDsKIAkJbm90aWZ5LmRldl9oZGwgPSBjdHgtPmRldl9oZGw7CiAJCW5vdGlmeS5mcmFtZV9pZCA9IGN0eF9pc3AtPmZyYW1lX2lkOworCQlub3RpZnkudHJpZ2dlciA9IENBTV9UUklHR0VSX1BPSU5UX1NPRjsKIAotCQljdHgtPmN0eF9jcm1faW50Zi0+bm90aWZ5X3NvZigmbm90aWZ5KTsKKwkJY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV90cmlnZ2VyKCZub3RpZnkpOwogCQlDQU1fREJHKENBTV9JU1AsICJOb3RpZnkgQ1JNICBTT0YgZnJhbWUgJWxsZCIsCiAJCQljdHhfaXNwLT5mcmFtZV9pZCk7CiAKQEAgLTExMDYsMTEgKzEyNTAsMTEgQEAKIAlzdHJ1Y3QgY2FtX2N0eF9yZXF1ZXN0ICAqcmVxOwogCXN0cnVjdCBjYW1fY29udGV4dCAgICAgICpjdHggPSBjdHhfaXNwLT5iYXNlOwogCXN0cnVjdCBjYW1faXNwX2N0eF9yZXEgICpyZXFfaXNwOwotCXN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5ICBub3RpZnk7CisJc3RydWN0IGNhbV9yZXFfbWdyX3RyaWdnZXJfbm90aWZ5ICBub3RpZnk7CiAJdWludDY0X3QgIHJlcXVlc3RfaWQgID0gMDsKIAogCS8qIG5vdGlmeSByZXFtZ3Igd2l0aCBzb2Ygc2lnbmFsKi8KLQlpZiAoY3R4LT5jdHhfY3JtX2ludGYgJiYgY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV9zb2YpIHsKKwlpZiAoY3R4LT5jdHhfY3JtX2ludGYgJiYgY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV90cmlnZ2VyKSB7CiAJCWlmIChsaXN0X2VtcHR5KCZjdHgtPnBlbmRpbmdfcmVxX2xpc3QpKSB7CiAJCQlDQU1fRVJSKENBTV9JU1AsICJSZWcgdXBkIGFjayB3aXRoIG5vIHBlbmRpbmcgcmVxdWVzdCIpOwogCQkJZ290byBlcnJvcjsKQEAgLTExMzgsOCArMTI4Miw5IEBACiAJCW5vdGlmeS5saW5rX2hkbCA9IGN0eC0+bGlua19oZGw7CiAJCW5vdGlmeS5kZXZfaGRsID0gY3R4LT5kZXZfaGRsOwogCQlub3RpZnkuZnJhbWVfaWQgPSBjdHhfaXNwLT5mcmFtZV9pZDsKKwkJbm90aWZ5LnRyaWdnZXIgPSBDQU1fVFJJR0dFUl9QT0lOVF9TT0Y7CiAKLQkJY3R4LT5jdHhfY3JtX2ludGYtPm5vdGlmeV9zb2YoJm5vdGlmeSk7CisJCWN0eC0+Y3R4X2NybV9pbnRmLT5ub3RpZnlfdHJpZ2dlcigmbm90aWZ5KTsKIAkJQ0FNX0RCRyhDQU1fSVNQLCAiTm90aWZ5IENSTSAgU09GIGZyYW1lICVsbGQiLAogCQkJY3R4X2lzcC0+ZnJhbWVfaWQpOwogCX0gZWxzZSB7CkBAIC0xNDI4LDYgKzE1NzMsNyBAQAogCQlhZGRfcmVxLmxpbmtfaGRsID0gY3R4LT5saW5rX2hkbDsKIAkJYWRkX3JlcS5kZXZfaGRsICA9IGN0eC0+ZGV2X2hkbDsKIAkJYWRkX3JlcS5yZXFfaWQgICA9IHJlcS0+cmVxdWVzdF9pZDsKKwkJYWRkX3JlcS5za2lwX2JlZm9yZV9hcHBseWluZyA9IDA7CiAJCXJjID0gY3R4LT5jdHhfY3JtX2ludGYtPmFkZF9yZXEoJmFkZF9yZXEpOwogCQlpZiAocmMpIHsKIAkJCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yOiBBZGRpbmcgcmVxdWVzdCBpZD0lbGx1IiwKQEAgLTE0MzksOSArMTU4NSw3IEBACiAJQ0FNX0RCRyhDQU1fSVNQLCAiUGFja2V0IHJlcXVlc3QgaWQgMHglbGx4IiwKIAkJcGFja2V0LT5oZWFkZXIucmVxdWVzdF9pZCk7CiAKLQlzcGluX2xvY2tfYmgoJmN0eC0+bG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmY3R4LT5wZW5kaW5nX3JlcV9saXN0KTsKLQlzcGluX3VubG9ja19iaCgmY3R4LT5sb2NrKTsKKwlfX2NhbV9pc3BfY3R4X2VucXVldWVfcmVxdWVzdF9pbl9vcmRlcihjdHgsIHJlcSk7CiAKIAlDQU1fREJHKENBTV9JU1AsICJQcmVwcm9jZXNzaW5nIENvbmZpZyAlbGxkIHN1Y2Nlc3NmdWwiLAogCQlyZXEtPnJlcXVlc3RfaWQpOwpAQCAtMTYwOCwxMSArMTc1MiwxNCBAQAogCXN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX2Rldl9saW5rX3NldHVwICpsaW5rKQogewogCWludCByYyA9IDA7CisJc3RydWN0IGNhbV9pc3BfY29udGV4dCAqY3R4X2lzcCA9CisJCShzdHJ1Y3QgY2FtX2lzcF9jb250ZXh0ICopIGN0eC0+Y3R4X3ByaXY7CiAKIAlDQU1fREJHKENBTV9JU1AsICJFbnRlci4uLi4uLi4uLiIpOwogCiAJY3R4LT5saW5rX2hkbCA9IGxpbmstPmxpbmtfaGRsOwogCWN0eC0+Y3R4X2NybV9pbnRmID0gbGluay0+Y3JtX2NiOworCWN0eF9pc3AtPnN1YnNjcmliZV9ldmVudCA9IGxpbmstPnN1YnNjcmliZV9ldmVudDsKIAogCS8qIGNoYW5nZSBzdGF0ZSBvbmx5IGlmIHdlIGhhZCB0aGUgaW5pdCBjb25maWcgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cGVuZGluZ19yZXFfbGlzdCkpIHsKQEAgLTE2NDUsNiArMTc5Miw3IEBACiAJc3RybGNweShkZXZfaW5mby0+bmFtZSwgQ0FNX0lTUF9ERVZfTkFNRSwgc2l6ZW9mKGRldl9pbmZvLT5uYW1lKSk7CiAJZGV2X2luZm8tPmRldl9pZCA9IENBTV9SRVFfTUdSX0RFVklDRV9JRkU7CiAJZGV2X2luZm8tPnBfZGVsYXkgPSAxOworCWRldl9pbmZvLT50cmlnZ2VyID0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTgwMSwyNyArMTk0OSwxNCBAQAogCXN0cnVjdCBjYW1fcmVsZWFzZV9kZXZfY21kICpjbWQpCiB7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2FtX2lzcF9jb250ZXh0ICpjdHhfaXNwID0KLQkJKHN0cnVjdCBjYW1faXNwX2NvbnRleHQgKikgY3R4LT5jdHhfcHJpdjsKIAotCV9fY2FtX2lzcF9jdHhfc3RvcF9kZXZfaW5fYWN0aXZhdGVkX3VubG9jayhjdHgpOworCXJjID0gX19jYW1faXNwX2N0eF9zdG9wX2Rldl9pbl9hY3RpdmF0ZWRfdW5sb2NrKGN0eCk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9JU1AsICJTdG9wIGRldmljZSBmYWlsZWQgcmM9JWQiLCByYyk7CiAKLQlpZiAoY3R4X2lzcC0+aHdfY3R4KSB7Ci0JCXN0cnVjdCBjYW1faHdfcmVsZWFzZV9hcmdzICAgYXJnOwotCi0JCWFyZy5jdHh0X3RvX2h3X21hcCA9IGN0eF9pc3AtPmh3X2N0eDsKLQkJY3R4LT5od19tZ3JfaW50Zi0+aHdfcmVsZWFzZShjdHgtPmh3X21ncl9pbnRmLT5od19tZ3JfcHJpdiwKLQkJCSZhcmcpOwotCQljdHhfaXNwLT5od19jdHggPSBOVUxMOwotCX0KLQotCWN0eC0+c2Vzc2lvbl9oZGwgPSAwOwotCWN0eC0+ZGV2X2hkbCA9IDA7Ci0JY3R4LT5saW5rX2hkbCA9IDA7Ci0JY3R4LT5jdHhfY3JtX2ludGYgPSBOVUxMOwotCi0JY3R4LT5zdGF0ZSA9ICBDQU1fQ1RYX0FWQUlMQUJMRTsKLQl0cmFjZV9jYW1fY29udGV4dF9zdGF0ZSgiSVNQIiwgY3R4KTsKKwlyYyA9IF9fY2FtX2lzcF9jdHhfcmVsZWFzZV9kZXZfaW5fdG9wX3N0YXRlKGN0eCwgY21kKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0lTUCwgIlJlbGVhc2UgZGV2aWNlIGZhaWxlZCByYz0lZCIsIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTE4MzMsNyArMTk2OCw3IEBACiAJc3RydWN0IGNhbV9pc3BfY29udGV4dCAqY3R4X2lzcCA9CiAJCShzdHJ1Y3QgY2FtX2lzcF9jb250ZXh0ICopIGN0eC0+Y3R4X3ByaXY7CiAKLQl0cmFjZV9jYW1fYXBwbHlfcmVxKCJJU1AiLCBhcHBseSk7CisJdHJhY2VfY2FtX2FwcGx5X3JlcSgiSVNQIiwgYXBwbHktPnJlcXVlc3RfaWQpOwogCUNBTV9EQkcoQ0FNX0lTUCwgIkVudGVyOiBhcHBseSByZXEgaW4gU3Vic3RhdGUgJWQgcmVxdWVzdCBfaWQ6JWxsZCIsCiAJCSBjdHhfaXNwLT5zdWJzdGF0ZV9hY3RpdmF0ZWQsIGFwcGx5LT5yZXF1ZXN0X2lkKTsKIAlpZiAoY3R4X2lzcC0+c3Vic3RhdGVfbWFjaGluZVtjdHhfaXNwLT5zdWJzdGF0ZV9hY3RpdmF0ZWRdLgpAQCAtMTg0MSwxNCArMTk3NiwxNiBAQAogCQlyYyA9IGN0eF9pc3AtPnN1YnN0YXRlX21hY2hpbmVbY3R4X2lzcC0+c3Vic3RhdGVfYWN0aXZhdGVkXS4KIAkJCWNybV9vcHMuYXBwbHlfcmVxKGN0eCwgYXBwbHkpOwogCX0gZWxzZSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIGhhbmRsZSBmdW5jdGlvbiBpbiBhY3RpdmF0ZWQgc3Vic3RhdGUgJWQiLAotCQkJIGN0eF9pc3AtPnN1YnN0YXRlX2FjdGl2YXRlZCk7CisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAorCQkJIk5vIGhhbmRsZSBmdW5jdGlvbiBpbiBhY3RpdmF0ZWQgc3Vic3RhdGUgJWQiLAorCQkJY3R4X2lzcC0+c3Vic3RhdGVfYWN0aXZhdGVkKTsKIAkJcmMgPSAtRUZBVUxUOwogCX0KIAogCWlmIChyYykKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQXBwbHkgZmFpbGVkIGluIGFjdGl2ZSBzdWJzdGF0ZSAlZCIsCi0JCQkgY3R4X2lzcC0+c3Vic3RhdGVfYWN0aXZhdGVkKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsCisJCQkiQXBwbHkgZmFpbGVkIGluIGFjdGl2ZSBzdWJzdGF0ZSAlZCIsCisJCQljdHhfaXNwLT5zdWJzdGF0ZV9hY3RpdmF0ZWQpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvY2FtX2lzcF9jb250ZXh0LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9jYW1faXNwX2NvbnRleHQuaAppbmRleCBiMGI4ODNjLi42MjFkNjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9jYW1faXNwX2NvbnRleHQuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9jYW1faXNwX2NvbnRleHQuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAgKiBAc29mX3RpbWVzdGFtcF92YWw6ICAgICBDYXB0dXJlZCB0aW1lIHN0YW1wIHZhbHVlIGF0IHNvZiBodyBldmVudAogICogQGFjdGl2ZV9yZXFfY250OiAgICAgICAgQ291bnRlciBmb3IgdGhlIGFjdGl2ZSByZXF1ZXN0CiAgKiBAcmVwb3J0ZWRfcmVxX2lkOiAgICAgICBMYXN0IHJlcG9ydGVkIHJlcXVlc3QgaWQKKyAqIEBzdWJzY3JpYmVfZXZlbnQ6ICAgICAgIFRoZSBpcnEgZXZlbnQgbWFzayB0aGF0IENSTSBzdWJzY3JpYmVzIHRvLCBJRkUgd2lsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlIENSTSBjYiBhdCB0aG9zZSBldmVudC4KKyAqCiAgKi8KIHN0cnVjdCBjYW1faXNwX2NvbnRleHQgewogCXN0cnVjdCBjYW1fY29udGV4dCAgICAgICAgICAgICAgKmJhc2U7CkBAIC0xMjUsNiArMTI4LDcgQEAKIAl1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBzb2ZfdGltZXN0YW1wX3ZhbDsKIAlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfcmVxX2NudDsKIAlpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZF9yZXFfaWQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlX2V2ZW50OwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2NhbV9pZmVfaHdfbWdyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2NhbV9pZmVfaHdfbWdyLmMKaW5kZXggNDg5Mzk2MC4uNjA2MDI3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9jYW1faWZlX2h3X21nci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvY2FtX2lmZV9od19tZ3IuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPHVhcGkvbWVkaWEvY2FtX2lzcC5oPgogI2luY2x1ZGUgImNhbV9zbW11X2FwaS5oIgogI2luY2x1ZGUgImNhbV9yZXFfbWdyX3dvcmtxLmgiCkBAIC02NCwxNiArNjUsMTYgQEAKIAkJc2l6ZW9mKHN0cnVjdCBjYW1faXNwX3F1ZXJ5X2NhcF9jbWQpKSkKIAkJcmMgPSAtRUZBVUxUOwogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiZXhpdCByYyA6JWQgISIsIHJjKTsKKwlDQU1fREJHKENBTV9JU1AsICJleGl0IHJjIDolZCIsIHJjKTsKIAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBjYW1faWZlX2h3X21ncl9pc19yZGlfcmVzKHVpbnQzMl90IGZvcm1hdCkKK3N0YXRpYyBpbnQgY2FtX2lmZV9od19tZ3JfaXNfcmRpX3Jlcyh1aW50MzJfdCByZXNfaWQpCiB7CiAJaW50IHJjID0gMDsKIAotCXN3aXRjaCAoZm9ybWF0KSB7CisJc3dpdGNoIChyZXNfaWQpIHsKIAljYXNlIENBTV9JU1BfSUZFX09VVF9SRVNfUkRJXzA6CiAJY2FzZSBDQU1fSVNQX0lGRV9PVVRfUkVTX1JESV8xOgogCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMjoKQEAgLTExMSw3ICsxMTIsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnI6Ci0JQ0FNX0VSUihDQU1fSVNQLCAiSU5JVCBIVyByZXMgZmFpbGVkISAodHlwZTolZCwgaWQ6JWQpIiwKKwlDQU1fRVJSKENBTV9JU1AsICJJTklUIEhXIHJlcyBmYWlsZWQ6ICh0eXBlOiVkLCBpZDolZCkiLAogCQlpc3BfaHdfcmVzLT5yZXNfdHlwZSwgaXNwX2h3X3Jlcy0+cmVzX2lkKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzIsNyArMTMzLDcgQEAKIAkJCQlpc3BfaHdfcmVzLT5od19yZXNbaV0sCiAJCQkJc2l6ZW9mKHN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUpKTsKIAkJCWlmIChyYykgewotCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSFcgcmVzb3VyY2VzISIpOworCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSFcgcmVzb3VyY2VzIik7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xNDMsNyArMTQ0LDcgQEAKIAogCXJldHVybiAwOwogZXJyOgotCUNBTV9FUlIoQ0FNX0lTUCwgIlN0YXJ0IGh3IHJlcyBmYWlsZWQhICh0eXBlOiVkLCBpZDolZCkiLAorCUNBTV9FUlIoQ0FNX0lTUCwgIlN0YXJ0IGh3IHJlcyBmYWlsZWQgKHR5cGU6JWQsIGlkOiVkKSIsCiAJCWlzcF9od19yZXMtPnJlc190eXBlLCBpc3BfaHdfcmVzLT5yZXNfaWQpOwogCXJldHVybiByYzsKIH0KQEAgLTIxMCw3ICsyMTEsNyBAQAogCQkJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcywgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJnJlc19wdHItPmxpc3QpOwogCX0gZWxzZSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIG1vcmUgZnJlZSBpZmUgaHcgbWdyIGN0eCEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gbW9yZSBmcmVlIGlmZSBodyBtZ3IgY3R4Iik7CiAJCXJjID0gLTE7CiAJfQogCSpyZXMgPSByZXNfcHRyOwpAQCAtMjM1LDcgKzIzNiw3IEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUpKTsKIAkJCWlmIChyYykKIAkJCQlDQU1fRVJSKENBTV9JU1AsCi0JCQkJCSJSZWxlYXNlIGh3IHJlc3JvdWNlIGlkICVkIGZhaWxlZCEiLAorCQkJCQkiUmVsZWFzZSBodyByZXNyb3VjZSBpZCAlZCBmYWlsZWQiLAogCQkJCQlpc3BfaHdfcmVzLT5yZXNfaWQpOwogCQkJaXNwX2h3X3Jlcy0+aHdfcmVzW2ldID0gTlVMTDsKIAkJfSBlbHNlCkBAIC0zNjIsNyArMzYzLDcgQEAKIAkJCXN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHgsIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZjdHhfcHRyLT5saXN0KTsKIAl9IGVsc2UgewotCQlDQU1fRVJSKENBTV9JU1AsICJObyBtb3JlIGZyZWUgaWZlIGh3IG1nciBjdHghIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIG1vcmUgZnJlZSBpZmUgaHcgbWdyIGN0eCIpOwogCQlyYyA9IC0xOwogCX0KIAkqaWZlX2N0eCA9IGN0eF9wdHI7CkBAIC0zNzksMTEgKzM4MCwxMiBAQAogCXVpbnQzMl90ICAgIGk7CiAKIAlpZiAoIWN0eC0+bnVtX2Jhc2UpIHsKLQkJQ0FNX0RCRyhDQU1fSVNQLCAiQWRkIHNwbGl0IGlkID0gJWQgZm9yIGJhc2UgaWR4ID0gJWQiLAotCQkJc3BsaXRfaWQsIGJhc2VfaWR4KTsKIAkJY3R4LT5iYXNlWzBdLnNwbGl0X2lkID0gc3BsaXRfaWQ7CiAJCWN0eC0+YmFzZVswXS5pZHggICAgICA9IGJhc2VfaWR4OwogCQljdHgtPm51bV9iYXNlKys7CisJCUNBTV9EQkcoQ0FNX0lTUCwKKwkJCSJBZGQgc3BsaXQgaWQgPSAlZCBmb3IgYmFzZSBpZHggPSAlZCBudW1fYmFzZT0lZCIsCisJCQlzcGxpdF9pZCwgYmFzZV9pZHgsIGN0eC0+bnVtX2Jhc2UpOwogCX0gZWxzZSB7CiAJCS8qQ2hlY2sgaWYgYmFzZSBpbmRleCBpcyBhbHJlYXkgZXhpc3QgaW4gdGhlIGxpc3QgKi8KIAkJZm9yIChpID0gMDsgaSA8IENBTV9JRkVfSFdfTlVNX01BWDsgaSsrKSB7CkBAIC0zOTgsMTEgKzQwMCwxMiBAQAogCQl9CiAKIAkJaWYgKGkgPT0gQ0FNX0lGRV9IV19OVU1fTUFYKSB7Ci0JCQlDQU1fREJHKENBTV9JU1AsICJBZGQgc3BsaXQgaWQgPSAlZCBmb3IgYmFzZSBpZHggPSAlZCIsCi0JCQkJIHNwbGl0X2lkLCBiYXNlX2lkeCk7CiAJCQljdHgtPmJhc2VbY3R4LT5udW1fYmFzZV0uc3BsaXRfaWQgPSBzcGxpdF9pZDsKIAkJCWN0eC0+YmFzZVtjdHgtPm51bV9iYXNlXS5pZHggICAgICA9IGJhc2VfaWR4OwogCQkJY3R4LT5udW1fYmFzZSsrOworCQkJQ0FNX0RCRyhDQU1fSVNQLAorCQkJCSJBZGQgc3BsaXRfaWQ9JWQgZm9yIGJhc2UgaWR4PSVkIG51bV9iYXNlPSVkIiwKKwkJCQkgc3BsaXRfaWQsIGJhc2VfaWR4LCBjdHgtPm51bV9iYXNlKTsKIAkJfQogCX0KIH0KQEAgLTQxNSw3ICs0MTgsNyBAQAogCXVpbnQzMl90IGk7CiAKIAlpZiAobGlzdF9lbXB0eSgmY3R4LT5yZXNfbGlzdF9pZmVfc3JjKSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJFcnJvciEgTXV4IExpc3QgZW1wdHkiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiTXV4IExpc3QgZW1wdHkiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC00MjcsMTUgKzQzMCwxMiBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQ0FNX0lTUF9IV19TUExJVF9NQVg7IGkrKykgewogCQkJaWYgKCFod19tZ3JfcmVzLT5od19yZXNbaV0pCiAJCQkJY29udGludWU7Ci0JCQlyZXMgPSBod19tZ3JfcmVzLT5od19yZXNbaV07Ci0JCQlpZiAocmVzLT5yZXNfaWQgPT0gQ0FNX0lTUF9IV19WRkVfSU5fQ0FNSUYpCi0JCQkJY2FtX2lmZV9tZ3JfYWRkX2Jhc2VfaW5mbyhjdHgsIGksCi0JCQkJCXJlcy0+aHdfaW50Zi0+aHdfaWR4KTsKIAotCQkJZWxzZQotCQkJCWNhbV9pZmVfbWdyX2FkZF9iYXNlX2luZm8oY3R4LAotCQkJCQkJQ0FNX0lTUF9IV19TUExJVF9NQVgsCi0JCQkJCQlyZXMtPmh3X2ludGYtPmh3X2lkeCk7CisJCQlyZXMgPSBod19tZ3JfcmVzLT5od19yZXNbaV07CisJCQljYW1faWZlX21ncl9hZGRfYmFzZV9pbmZvKGN0eCwgaSwKKwkJCQkJcmVzLT5od19pbnRmLT5od19pZHgpOworCQkJQ0FNX0RCRyhDQU1fSVNQLCAiYWRkIGJhc2UgaW5mbyBmb3IgaHcgJWQiLAorCQkJCXJlcy0+aHdfaW50Zi0+aHdfaWR4KTsKIAkJfQogCX0KIAlDQU1fREJHKENBTV9JU1AsICJjdHggYmFzZSBudW0gPSAlZCIsIGN0eC0+bnVtX2Jhc2UpOwpAQCAtNDc1LDYgKzQ3NSw4IEBACiAJCUNBTV9FUlIoQ0FNX0lTUCwgImludmFsaWQgcmVzb3VyY2UgdHlwZSIpOwogCQlnb3RvIGVycjsKIAl9CisJQ0FNX0RCRyhDQU1fSVNQLCAidmZlX2luX3Jlc19pZCA9ICVkLCB2ZmVfb3V0X3JlZF9pZCA9ICVkIiwKKwkJdmZlX2luX3Jlc19pZCwgdmZlX291dF9yZXNfaWQpOwogCiAJdmZlX2FjcXVpcmUucnNyY190eXBlID0gQ0FNX0lTUF9SRVNPVVJDRV9WRkVfT1VUOwogCXZmZV9hY3F1aXJlLnRhc2tsZXQgPSBpZmVfY3R4LT5jb21tb24udGFza2xldF9pbmZvOwpAQCAtNDgzLDYgKzQ4NSw5IEBACiAJZm9yIChpID0gMDsgaSA8IGluX3BvcnQtPm51bV9vdXRfcmVzOyBpKyspIHsKIAkJb3V0X3BvcnQgPSAmaW5fcG9ydC0+ZGF0YVtpXTsKIAorCQlDQU1fREJHKENBTV9JU1AsICJpID0gJWQsIHZmZV9vdXRfcmVzX2lkID0gJWQsIG91dF9wb3J0OiAlZCIsCisJCQlpLCB2ZmVfb3V0X3Jlc19pZCwgb3V0X3BvcnQtPnJlc190eXBlKTsKKwogCQlpZiAodmZlX291dF9yZXNfaWQgIT0gb3V0X3BvcnQtPnJlc190eXBlKQogCQkJY29udGludWU7CiAKQEAgLTQ5MSw2ICs0OTYsNyBAQAogCQl2ZmVfYWNxdWlyZS52ZmVfb3V0Lm91dF9wb3J0X2luZm8gPSBvdXRfcG9ydDsKIAkJdmZlX2FjcXVpcmUudmZlX291dC5zcGxpdF9pZCA9IENBTV9JU1BfSFdfU1BMSVRfTEVGVDsKIAkJdmZlX2FjcXVpcmUudmZlX291dC51bmlxdWVfaWQgPSBpZmVfY3R4LT5jdHhfaW5kZXg7CisJCXZmZV9hY3F1aXJlLnZmZV9vdXQuaXNfZHVhbCA9IDA7CiAJCWh3X2ludGYgPSBpZmVfc3JjX3Jlcy0+aHdfcmVzWzBdLT5od19pbnRmOwogCQlyYyA9IGh3X2ludGYtPmh3X29wcy5yZXNlcnZlKGh3X2ludGYtPmh3X3ByaXYsCiAJCQkmdmZlX2FjcXVpcmUsCkBAIC01MDQsNyArNTEwLDkgQEAKIAl9CiAKIAlpZiAoaSA9PSBpbl9wb3J0LT5udW1fb3V0X3JlcykgewotCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGFjcXVpcmUgb3V0IHJlc291cmNlIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCSJDYW5ub3QgYWNxdWlyZSBvdXQgcmVzb3VyY2UsIGk9JWQsIG51bV9vdXRfcmVzPSVkIiwKKwkJCWksIGluX3BvcnQtPm51bV9vdXRfcmVzKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC01MTIsNiArNTIwLDcgQEAKIAlpZmVfb3V0X3Jlcy0+aXNfZHVhbF92ZmUgPSAwOwogCWlmZV9vdXRfcmVzLT5yZXNfaWQgPSB2ZmVfb3V0X3Jlc19pZDsKIAlpZmVfb3V0X3Jlcy0+cmVzX3R5cGUgPSBDQU1fSVNQX1JFU09VUkNFX1ZGRV9PVVQ7CisJaWZlX3NyY19yZXMtPmNoaWxkW2lmZV9zcmNfcmVzLT5udW1fY2hpbGRyZW4rK10gPSBpZmVfb3V0X3JlczsKIAogCXJldHVybiAwOwogZXJyOgpAQCAtNjM0LDcgKzY0Myw4IEBACiAJCQkJaWZlX3NyY19yZXMsIGluX3BvcnQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJGYXRhbDogVW5rbm93biBJRkUgU1JDIHJlc291cmNlISIpOworCQkJQ0FNX0VSUihDQU1fSVNQLCAiVW5rbm93biBJRkUgU1JDIHJlc291cmNlOiAlZCIsCisJCQkJaWZlX3NyY19yZXMtPnJlc19pZCk7CiAJCQlicmVhazsKIAkJfQogCQlpZiAocmMpCkBAIC02NjgsNyArNjc4LDcgQEAKIAkJcmMgPSBjYW1faWZlX2h3X21ncl9nZXRfcmVzKCZpZmVfY3R4LT5mcmVlX3Jlc19saXN0LAogCQkJJmlmZV9zcmNfcmVzKTsKIAkJaWYgKHJjKSB7Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJObyBtb3JlIGZyZWUgaHcgbWdyIHJlc291cmNlISIpOworCQkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gbW9yZSBmcmVlIGh3IG1nciByZXNvdXJjZSIpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJY2FtX2lmZV9od19tZ3JfcHV0X3JlcygmaWZlX2N0eC0+cmVzX2xpc3RfaWZlX3NyYywKQEAgLTY3Niw3ICs2ODYsNiBAQAogCiAJCXZmZV9hY3F1aXJlLnJzcmNfdHlwZSA9IENBTV9JU1BfUkVTT1VSQ0VfVkZFX0lOOwogCQl2ZmVfYWNxdWlyZS50YXNrbGV0ID0gaWZlX2N0eC0+Y29tbW9uLnRhc2tsZXRfaW5mbzsKLQkJdmZlX2FjcXVpcmUucnNyY190eXBlID0gQ0FNX0lTUF9SRVNPVVJDRV9WRkVfSU47CiAJCXZmZV9hY3F1aXJlLnZmZV9pbi5jZG1fb3BzID0gaWZlX2N0eC0+Y2RtX29wczsKIAogCQlzd2l0Y2ggKGNzaWRfcmVzLT5yZXNfaWQpIHsKQEAgLTcwOCw3ICs3MTcsNyBAQAogCQkJdmZlX2FjcXVpcmUudmZlX2luLnN5bmNfbW9kZSA9IENBTV9JU1BfSFdfU1lOQ19OT05FOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJXcm9uZyBJRkUgQ1NJRCBSZXNvdXJjZSBOb2RlISIpOworCQkJQ0FNX0VSUihDQU1fSVNQLCAiV3JvbmcgSUZFIENTSUQgUmVzb3VyY2UgTm9kZSIpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJaWZlX3NyY19yZXMtPnJlc190eXBlID0gdmZlX2FjcXVpcmUucnNyY190eXBlOwpAQCAtNzUwLDkgKzc1OSwxMSBAQAogCQkgKiBjc2lkIHJlc291cmNlIGFuZCBpZmUgc291cmNlIHJlc291cmNlCiAJCSAqLwogCQljc2lkX3Jlcy0+Y2hpbGRbMF0gPSBpZmVfc3JjX3JlczsKLQkJY3NpZF9yZXMtPm51bV9jaGlsZHJlbiA9IDE7CiAJCWlmZV9zcmNfcmVzLT5wYXJlbnQgPSBjc2lkX3JlczsKIAkJY3NpZF9yZXMtPmNoaWxkW2NzaWRfcmVzLT5udW1fY2hpbGRyZW4rK10gPSBpZmVfc3JjX3JlczsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiY3NpZF9yZXM9JWQgIG51bV9jaGlsZHJlbj0lZCBpZmVfc3JjX3Jlcz0lZCIsCisJCQljc2lkX3Jlcy0+cmVzX2lkLCBjc2lkX3Jlcy0+bnVtX2NoaWxkcmVuLAorCQkJaWZlX3NyY19yZXMtPnJlc19pZCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03NzgsNyArNzg5LDcgQEAKIAogCXJjID0gY2FtX2lmZV9od19tZ3JfZ2V0X3JlcygmaWZlX2N0eC0+ZnJlZV9yZXNfbGlzdCwgJmNzaWRfcmVzKTsKIAlpZiAocmMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gbW9yZSBmcmVlIGh3IG1nciByZXNvdXJjZSEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gbW9yZSBmcmVlIGh3IG1nciByZXNvdXJjZSIpOwogCQlnb3RvIGVycjsKIAl9CiAJY2FtX2lmZV9od19tZ3JfcHV0X3JlcygmaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2NzaWQsICZjc2lkX3Jlcyk7CkBAIC03ODcsNiArNzk4LDcgQEAKIAljc2lkX2FjcXVpcmUucmVzX2lkID0gQ0FNX0lGRV9QSVhfUEFUSF9SRVNfSVBQOwogCWNzaWRfYWNxdWlyZS5jaWQgPSBjaWRfcmVzX2lkOwogCWNzaWRfYWNxdWlyZS5pbl9wb3J0ID0gaW5fcG9ydDsKKwljc2lkX2FjcXVpcmUub3V0X3BvcnQgPSBpbl9wb3J0LT5kYXRhOwogCiAJaWYgKGluX3BvcnQtPnVzYWdlX3R5cGUpCiAJCWNzaWRfYWNxdWlyZS5zeW5jX21vZGUgPSBDQU1fSVNQX0hXX1NZTkNfTUFTVEVSOwpAQCAtODA5LDExICs4MjEsMTEgQEAKIAl9CiAKIAlpZiAoaSA9PSBDQU1fSUZFX0NTSURfSFdfTlVNX01BWCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgaXBwIHJlc3JvdWNlISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgaXBwIHJlc291cmNlIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCUNBTV9EQkcoQ0FNX0lTUCwgImFjcXVpcmVkIGNzaWQoJWQpIGxlZnQgaXBwIHJlc3JvdWNlIHN1Y2Nlc3NmdWxseSEiLAorCUNBTV9EQkcoQ0FNX0lTUCwgImFjcXVpcmVkIGNzaWQoJWQpIGxlZnQgaXBwIHJlc291cmNlIHN1Y2Nlc3NmdWxseSIsCiAJCSBpKTsKIAogCWNzaWRfcmVzLT5yZXNfdHlwZSA9IENBTV9JU1BfUkVTT1VSQ0VfUElYX1BBVEg7CkBAIC04MjQsNiArODM2LDcgQEAKIAogCWlmIChjc2lkX3Jlcy0+aXNfZHVhbF92ZmUpIHsKIAkJY3NpZF9hY3F1aXJlLnN5bmNfbW9kZSA9IENBTV9JU1BfSFdfU1lOQ19TTEFWRTsKKwkJY3NpZF9hY3F1aXJlLm1hc3Rlcl9pZHggPSBjc2lkX3Jlcy0+aHdfcmVzWzBdLT5od19pbnRmLT5od19pZHg7CiAKIAkJZm9yIChqID0gaSArIDE7IGogPCBDQU1fSUZFX0NTSURfSFdfTlVNX01BWDsgaisrKSB7CiAJCQlpZiAoIWlmZV9od19tZ3ItPmNzaWRfZGV2aWNlc1tqXSkKQEAgLTg0MCwxOCArODUzLDE3IEBACiAKIAkJaWYgKGogPT0gQ0FNX0lGRV9DU0lEX0hXX05VTV9NQVgpIHsKIAkJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCQkiQ2FuIG5vdCBhY3F1aXJlIGlmZSBjc2lkIHJkaSByZXNyb3VjZSEiKTsKKwkJCQkiQ2FuIG5vdCBhY3F1aXJlIGlmZSBjc2lkIHJkaSByZXNyb3VjZSIpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJY3NpZF9yZXMtPmh3X3Jlc1sxXSA9IGNzaWRfYWNxdWlyZS5ub2RlX3JlczsKIAogCQlDQU1fREJHKENBTV9JU1AsCi0JCQkiYWNxdWlyZWQgY3NpZCglZClyaWdodCBpcHAgcmVzcm91Y2Ugc3VjY2Vzc2Z1bGx5ISIsIGopOworCQkJImFjcXVpcmVkIGNzaWQoJWQpcmlnaHQgaXBwIHJlc3JvdWNlIHN1Y2Nlc3NmdWxseSIsIGopOwogCiAJfQogCWNzaWRfcmVzLT5wYXJlbnQgPSAmaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2luOwotCWlmZV9jdHgtPnJlc19saXN0X2lmZV9pbi5jaGlsZFsKLQkJaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2luLm51bV9jaGlsZHJlbisrXSA9IGNzaWRfcmVzOworCUNBTV9EQkcoQ0FNX0lTUCwgImFjcXVpcmUgcmVzICVkIiwgY3NpZF9hY3F1aXJlLnJlc19pZCk7CiAKIAlyZXR1cm4gMDsKIGVycjoKQEAgLTg2Myw3ICs4NzUsNiBAQAogCXVpbnQzMl90ICAgICAgICAgICAgICAgICBvdXRfcG9ydF90eXBlKQogewogCWVudW0gY2FtX2lmZV9waXhfcGF0aF9yZXNfaWQgcGF0aF9pZDsKLQogCXN3aXRjaCAob3V0X3BvcnRfdHlwZSkgewogCWNhc2UgQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMDoKIAkJcGF0aF9pZCA9IENBTV9JRkVfUElYX1BBVEhfUkVTX1JESV8wOwpAQCAtODgzLDYgKzg5NCw4IEBACiAJCWJyZWFrOwogCX0KIAorCUNBTV9EQkcoQ0FNX0lTUCwgIm91dF9wb3J0ICVkIHBhdGhfaWQgJWQiLCBvdXRfcG9ydF90eXBlLCBwYXRoX2lkKTsKKwogCXJldHVybiBwYXRoX2lkOwogfQogCkBAIC05MTAsNyArOTIzLDcgQEAKIAkJcmMgPSBjYW1faWZlX2h3X21ncl9nZXRfcmVzKCZpZmVfY3R4LT5mcmVlX3Jlc19saXN0LAogCQkJJmNzaWRfcmVzKTsKIAkJaWYgKHJjKSB7Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJObyBtb3JlIGZyZWUgaHcgbWdyIHJlc291cmNlISIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJObyBtb3JlIGZyZWUgaHcgbWdyIHJlc291cmNlIiwKIAkJCQlfX2Z1bmNfXyk7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtOTQ2LDcgKzk1OSw3IEBACiAKIAkJaWYgKGogPT0gQ0FNX0lGRV9DU0lEX0hXX05VTV9NQVgpIHsKIAkJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCQkiQ2FuIG5vdCBhY3F1aXJlIGlmZSBjc2lkIHJkaSByZXNyb3VjZSEiKTsKKwkJCQkiQ2FuIG5vdCBhY3F1aXJlIGlmZSBjc2lkIHJkaSByZXNvdXJjZSIpOwogCQkJZ290byBlcnI7CiAJCX0KIApAQCAtOTU1LDEwICs5NjgsOCBAQAogCQljc2lkX3Jlcy0+aXNfZHVhbF92ZmUgPSAwOwogCQljc2lkX3Jlcy0+aHdfcmVzWzBdID0gY3NpZF9hY3F1aXJlLm5vZGVfcmVzOwogCQljc2lkX3Jlcy0+aHdfcmVzWzFdID0gTlVMTDsKLQorCQlDQU1fREJHKENBTV9JU1AsICJhY3F1aXJlIHJlcyAlZCIsIGNzaWRfYWNxdWlyZS5yZXNfaWQpOwogCQljc2lkX3Jlcy0+cGFyZW50ID0gJmlmZV9jdHgtPnJlc19saXN0X2lmZV9pbjsKLQkJaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2luLmNoaWxkWwotCQkJaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2luLm51bV9jaGlsZHJlbisrXSA9IGNzaWRfcmVzOwogCX0KIAogCXJldHVybiAwOwpAQCAtOTc5LDcgKzk5MCw3IEBACiAJCWlmZV9jdHgtPnJlc19saXN0X2lmZV9pbi5yZXNfaWQgPSBpbl9wb3J0LT5yZXNfdHlwZTsKIAkJaWZlX2N0eC0+cmVzX2xpc3RfaWZlX2luLmlzX2R1YWxfdmZlID0gaW5fcG9ydC0+dXNhZ2VfdHlwZTsKIAl9IGVsc2UgaWYgKGlmZV9jdHgtPnJlc19saXN0X2lmZV9pbi5yZXNfaWQgIT0gaW5fcG9ydC0+cmVzX3R5cGUpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gRnJlZSByZXNvdXJjZSBmb3IgdGhpcyBjb250ZXh0ISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJObyBGcmVlIHJlc291cmNlIGZvciB0aGlzIGNvbnRleHQiKTsKIAkJZ290byBlcnI7CiAJfSBlbHNlIHsKIAkJLyogZWxzZSBkbyBub3RoaW5nICovCkBAIC0xMDMwLDE4ICsxMDQxLDExIEBACiAJc3RydWN0IGNhbV9od19pbnRmICAgICAgICAgICAgICAgICAgKmh3X2ludGY7CiAJc3RydWN0IGNhbV9jc2lkX2h3X3Jlc2VydmVfcmVzb3VyY2VfYXJncyAgY3NpZF9hY3F1aXJlOwogCi0JLyogbm8gZHVhbCB2ZmUgZm9yIFRQRyAqLwotCWlmICgoaW5fcG9ydC0+cmVzX3R5cGUgPT0gQ0FNX0lTUF9JRkVfSU5fUkVTX1RQRykgJiYKLQkJKGluX3BvcnQtPnVzYWdlX3R5cGUgIT0gMCkpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gRHVhbCBWRkUgb24gVFBHIGlucHV0ISIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIAlpZmVfaHdfbWdyID0gaWZlX2N0eC0+aHdfbWdyOwogCiAJcmMgPSBjYW1faWZlX2h3X21ncl9nZXRfcmVzKCZpZmVfY3R4LT5mcmVlX3Jlc19saXN0LCAmY2lkX3Jlcyk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIG1vcmUgZnJlZSBodyBtZ3IgcmVzb3VyY2UhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIG1vcmUgZnJlZSBodyBtZ3IgcmVzb3VyY2UiKTsKIAkJZ290byBlcnI7CiAJfQogCWNhbV9pZmVfaHdfbWdyX3B1dF9yZXMoJmlmZV9jdHgtPnJlc19saXN0X2lmZV9jaWQsICZjaWRfcmVzKTsKQEAgLTEwNjMsNyArMTA2Nyw3IEBACiAJfQogCiAJaWYgKGkgPT0gQ0FNX0lGRV9DU0lEX0hXX05VTV9NQVggfHwgIWNzaWRfYWNxdWlyZS5ub2RlX3JlcykgewotCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgcmRpIHJlc3JvdWNlISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgcmRpIHJlc291cmNlIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTA5NCw3ICsxMDk4LDcgQEAKIAogCQlpZiAoaiA9PSBDQU1fSUZFX0NTSURfSFdfTlVNX01BWCkgewogCQkJQ0FNX0VSUihDQU1fSVNQLAotCQkJCSJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgcmRpIHJlc3JvdWNlISIpOworCQkJCSJDYW4gbm90IGFjcXVpcmUgaWZlIGNzaWQgcmRpIHJlc291cmNlIik7CiAJCQlnb3RvIGVycjsKIAkJfQogCQljaWRfcmVzLT5od19yZXNbMV0gPSBjc2lkX2FjcXVpcmUubm9kZV9yZXM7CkBAIC0xMTI0LDE0ICsxMTI4LDE0IEBACiAJLyogZ2V0IHJvb3Qgbm9kZSByZXNvdXJjZSAqLwogCXJjID0gY2FtX2lmZV9od19tZ3JfYWNxdWlyZV9yZXNfcm9vdChpZmVfY3R4LCBpbl9wb3J0KTsKIAlpZiAocmMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBhY3F1aXJlIGNzaWQgcnggcmVzb3VyY2UhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgYWNxdWlyZSBjc2lkIHJ4IHJlc291cmNlIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCS8qIGdldCBjaWQgcmVzb3VyY2UgKi8KIAlyYyA9IGNhbV9pZmVfbWdyX2FjcXVpcmVfY2lkX3JlcyhpZmVfY3R4LCBpbl9wb3J0LCAmY2lkX3Jlc19pZCk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkFjcXVpcmUgSUZFIENJRCByZXNvdXJjZSBGYWlsZWQhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkFjcXVpcmUgSUZFIENJRCByZXNvdXJjZSBGYWlsZWQiKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0xMTM5LDcgKzExNDMsNyBAQAogCQkmcGl4ZWxfY291bnQsICZyZGlfY291bnQpOwogCiAJaWYgKCFwaXhlbF9jb3VudCAmJiAhcmRpX2NvdW50KSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yISBubyBQSVggb3IgUkRJIHJlc291cmNlIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIFBJWCBvciBSREkgcmVzb3VyY2UiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTQ5LDcgKzExNTMsNyBAQAogCQkJCWNpZF9yZXNfaWQpOwogCQlpZiAocmMpIHsKIAkJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCQkiQWNxdWlyZSBJRkUgQ1NJRCBJUFAgcmVzb3VyY2UgRmFpbGVkISIpOworCQkJCSJBY3F1aXJlIElGRSBDU0lEIElQUCByZXNvdXJjZSBGYWlsZWQiKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQpAQCAtMTE2MCw3ICsxMTY0LDcgQEAKIAkJCWNpZF9yZXNfaWQpOwogCQlpZiAocmMpIHsKIAkJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCQkiQWNxdWlyZSBJRkUgQ1NJRCBSREkgcmVzb3VyY2UgRmFpbGVkISIpOworCQkJCSJBY3F1aXJlIElGRSBDU0lEIFJESSByZXNvdXJjZSBGYWlsZWQiKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQpAQCAtMTE2OCwxMyArMTE3MiwxMyBAQAogCS8qIGdldCBpZmUgc3JjIHJlc291cmNlICovCiAJcmMgPSBjYW1faWZlX2h3X21ncl9hY3F1aXJlX3Jlc19pZmVfc3JjKGlmZV9jdHgsIGluX3BvcnQpOwogCWlmIChyYykgewotCQlDQU1fRVJSKENBTV9JU1AsICJBY3F1aXJlIElGRSBTUkMgcmVzb3VyY2UgRmFpbGVkISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJBY3F1aXJlIElGRSBTUkMgcmVzb3VyY2UgRmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJjID0gY2FtX2lmZV9od19tZ3JfYWNxdWlyZV9yZXNfaWZlX291dChpZmVfY3R4LCBpbl9wb3J0KTsKIAlpZiAocmMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQWNxdWlyZSBJRkUgT1VUIHJlc291cmNlIEZhaWxlZCEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQWNxdWlyZSBJRkUgT1VUIHJlc291cmNlIEZhaWxlZCIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTEyMDcsOCArMTIxMSwxMCBAQAogCXN0cnVjdCBjYW1faXNwX2luX3BvcnRfaW5mbyAgICAgICAqaW5fcG9ydCA9IE5VTEw7CiAJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2UgICAgICAgICAgICppc3BfcmVzb3VyY2UgPSBOVUxMOwogCXN0cnVjdCBjYW1fY2RtX2FjcXVpcmVfZGF0YSAgICAgICAgY2RtX2FjcXVpcmU7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGl4X3BvcnQgPSAwOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JkaV9wb3J0ID0gMDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9waXhfcG9ydF9wZXJfaW4gPSAwOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3JkaV9wb3J0X3Blcl9pbiA9IDA7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9waXhfcG9ydCA9IDA7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9yZGlfcG9ydCA9IDA7CiAKIAlDQU1fREJHKENBTV9JU1AsICJFbnRlci4uLiIpOwogCkBAIC0xMjIwLDcgKzEyMjYsNyBAQAogCS8qIGdldCB0aGUgaWZlIGN0eCAqLwogCXJjID0gY2FtX2lmZV9od19tZ3JfZ2V0X2N0eCgmaWZlX2h3X21nci0+ZnJlZV9jdHhfbGlzdCwgJmlmZV9jdHgpOwogCWlmIChyYyB8fCAhaWZlX2N0eCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJHZXQgaWZlIGh3IGNvbnRleHQgZmFpbGVkISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJHZXQgaWZlIGh3IGNvbnRleHQgZmFpbGVkIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTI3Miw3ICsxMjc4LDEwIEBACiAJCQlpc3BfcmVzb3VyY2VbaV0ubGVuZ3RoKTsKIAkJaWYgKGluX3BvcnQgPiAwKSB7CiAJCQlyYyA9IGNhbV9pZmVfbWdyX2FjcXVpcmVfaHdfZm9yX2N0eChpZmVfY3R4LCBpbl9wb3J0LAotCQkJCSZudW1fcGl4X3BvcnQsICZudW1fcmRpX3BvcnQpOworCQkJCSZudW1fcGl4X3BvcnRfcGVyX2luLCAmbnVtX3JkaV9wb3J0X3Blcl9pbik7CisJCQl0b3RhbF9waXhfcG9ydCArPSBudW1fcGl4X3BvcnRfcGVyX2luOworCQkJdG90YWxfcmRpX3BvcnQgKz0gbnVtX3JkaV9wb3J0X3Blcl9pbjsKKwogCQkJa2ZyZWUoaW5fcG9ydCk7CiAJCQlpZiAocmMpIHsKIAkJCQlDQU1fRVJSKENBTV9JU1AsICJjYW4gbm90IGFjcXVpcmUgcmVzb3VyY2UiKTsKQEAgLTEyODAsNyArMTI4OSw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlDQU1fRVJSKENBTV9JU1AsCi0JCQkJImNvcHkgZnJvbSB1c2VyIGZhaWxlZCB3aXRoIGluX3BvcnQgPSAlcEsiLAorCQkJCSJDb3B5IGZyb20gdXNlciBmYWlsZWQgd2l0aCBpbl9wb3J0ID0gJXBLIiwKIAkJCQlpbl9wb3J0KTsKIAkJCXJjID0gLUVGQVVMVDsKIAkJCWdvdG8gZnJlZV9yZXM7CkBAIC0xMjg4LDEzICsxMjk3LDE1IEBACiAJfQogCiAJLyogQ2hlY2sgd2hldGhlciBjb250ZXh0IGhhcyBvbmx5IFJESSByZXNvdXJjZSAqLwotCWlmICghbnVtX3BpeF9wb3J0KQorCWlmICghdG90YWxfcGl4X3BvcnQpIHsKIAkJaWZlX2N0eC0+aXNfcmRpX29ubHlfY29udGV4dCA9IDE7CisJCUNBTV9EQkcoQ0FNX0lTUCwgIlJESSBvbmx5IGNvbnRleHQiKTsKKwl9CiAKIAkvKiBQcm9jZXNzIGJhc2UgaW5mbyAqLwogCXJjID0gY2FtX2lmZV9tZ3JfcHJvY2Vzc19iYXNlX2luZm8oaWZlX2N0eCk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yIHByb2Nlc3MpIGJhc2UgaW5mbyEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiUHJvY2VzcyBiYXNlIGluZm8gZmFpbGVkIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTMwMywxNCArMTMxNCwxNCBAQAogCiAJY2FtX2lmZV9od19tZ3JfcHV0X2N0eCgmaWZlX2h3X21nci0+dXNlZF9jdHhfbGlzdCwgJmlmZV9jdHgpOwogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiRXhpdC4uLihzdWNjZXNzKSEiKTsKKwlDQU1fREJHKENBTV9JU1AsICJFeGl0Li4uKHN1Y2Nlc3MpIik7CiAKIAlyZXR1cm4gMDsKIGZyZWVfcmVzOgogCWNhbV9pZmVfaHdfbWdyX3JlbGVhc2VfaHdfZm9yX2N0eChpZmVfY3R4KTsKIAljYW1faWZlX2h3X21ncl9wdXRfY3R4KCZpZmVfaHdfbWdyLT5mcmVlX2N0eF9saXN0LCAmaWZlX2N0eCk7CiBlcnI6Ci0JQ0FNX0RCRyhDQU1fSVNQLCAiRXhpdC4uLihyYz0lZCkhIiwgcmMpOworCUNBTV9EQkcoQ0FNX0lTUCwgIkV4aXQuLi4ocmM9JWQpIiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTMzMywxNiArMTM0NCwxNyBAQAogCWNmZyA9IGNvbmZpZ19od19hcmdzOwogCWN0eCA9IChzdHJ1Y3QgY2FtX2lmZV9od19tZ3JfY3R4ICopY2ZnLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJGYXRhbDogSW52YWxpZCBjb250ZXh0IGlzIHVzZWQhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCiAJaWYgKCFjdHgtPmN0eF9pbl91c2UgfHwgIWN0eC0+Y2RtX2NtZCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGNvbnRleHQgcGFyYW1ldGVycyAhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29udGV4dCBwYXJhbWV0ZXJzIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiRW50ZXIgY3R4IGlkOiVkIiwgY3R4LT5jdHhfaW5kZXgpOworCUNBTV9EQkcoQ0FNX0lTUCwgIkVudGVyIGN0eCBpZDolZCBudW1faHdfdXBkX2VudHJpZXMgJWQiLAorCQljdHgtPmN0eF9pbmRleCwgY2ZnLT5udW1faHdfdXBkYXRlX2VudHJpZXMpOwogCiAJaWYgKGNmZy0+bnVtX2h3X3VwZGF0ZV9lbnRyaWVzID4gMCkgewogCQljZG1fY21kID0gY3R4LT5jZG1fY21kOwpAQCAtMTM1OSw2ICsxMzcxLDcgQEAKIAkJCWNkbV9jbWQtPmNtZFtpXS5sZW4gPSBjbWQtPmxlbjsKIAkJfQogCisJCUNBTV9EQkcoQ0FNX0lTUCwgIlN1Ym1pdCB0byBDRE0iKTsKIAkJcmMgPSBjYW1fY2RtX3N1Ym1pdF9ibHMoY3R4LT5jZG1faGFuZGxlLCBjZG1fY21kKTsKIAkJaWYgKHJjKQogCQkJQ0FNX0VSUihDQU1fSVNQLCAiRmFpbGVkIHRvIGFwcGx5IHRoZSBjb25maWdzIik7CkBAIC0xMzg1LDcgKzEzOTgsNyBAQAogCX0KIAljdHggPSAoc3RydWN0IGNhbV9pZmVfaHdfbWdyX2N0eCAqKXN0b3BfYXJncy0+Y3R4dF90b19od19tYXA7CiAJaWYgKCFjdHggfHwgIWN0eC0+Y3R4X2luX3VzZSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJGYXRhbDogSW52YWxpZCBjb250ZXh0IGlzIHVzZWQhIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCkBAIC0xMzk0LDcgKzE0MDcsNyBAQAogCiAJLyogc3RvcCByZXNvdXJjZSB3aWxsIHJlbW92ZSB0aGUgaXJxIG1hc2sgZnJvbSB0aGUgaGFyZHdhcmUgKi8KIAlpZiAoIWN0eC0+bnVtX2Jhc2UpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiZXJyb3IgbnVtYmVyIG9mIGJhc2VzIGFyZSB6ZXJvIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIk51bWJlciBvZiBiYXNlcyBhcmUgemVybyIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0NzEsNyArMTQ4NCw3IEBACiAJfQogCWN0eCA9IChzdHJ1Y3QgY2FtX2lmZV9od19tZ3JfY3R4ICopc3RvcF9hcmdzLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCB8fCAhY3R4LT5jdHhfaW5fdXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkZhdGFsOiBJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBjb250ZXh0IGlzIHVzZWQiKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKQEAgLTE0ODEsNyArMTQ5NCw3IEBACiAJLyogTm90ZTpzdG9wIHJlc291cmNlIHdpbGwgcmVtb3ZlIHRoZSBpcnEgbWFzayBmcm9tIHRoZSBoYXJkd2FyZSAqLwogCiAJaWYgKCFjdHgtPm51bV9iYXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgImVycm9yIG51bWJlciBvZiBiYXNlcyBhcmUgemVybyIpOworCQlDQU1fRVJSKENBTV9JU1AsICJudW1iZXIgb2YgYmFzZXMgYXJlIHplcm8iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNjI1LDcgKzE2MzgsNyBAQAogCiAJY3R4ID0gKHN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggKilzdGFydF9hcmdzLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCB8fCAhY3R4LT5jdHhfaW5fdXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCIpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIApAQCAtMTYzNiw3ICsxNjQ5LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQ0FNX0lGRV9IV19PVVRfUkVTX01BWDsgaSsrKSB7CiAJCXJjID0gY2FtX2lmZV9od19tZ3Jfc3RhcnRfaHdfcmVzKCZjdHgtPnJlc19saXN0X2lmZV9vdXRbaV0pOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIE9VVCAoJWQpISIsIGkpOworCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBJRkUgT1VUICglZCkiLCBpKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQpAQCAtMTY0Niw3ICsxNjU5LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3X21ncl9yZXMsICZjdHgtPnJlc19saXN0X2lmZV9zcmMsIGxpc3QpIHsKIAkJcmMgPSBjYW1faWZlX2h3X21ncl9zdGFydF9od19yZXMoaHdfbWdyX3Jlcyk7CiAJCWlmIChyYykgewotCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBJRkUgTVVYICglZCkhIiwKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIE1VWCAoJWQpIiwKIAkJCQkgaHdfbWdyX3Jlcy0+cmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNjU3LDcgKzE2NzAsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdfbWdyX3JlcywgJmN0eC0+cmVzX2xpc3RfaWZlX2NzaWQsIGxpc3QpIHsKIAkJcmMgPSBjYW1faWZlX2h3X21ncl9zdGFydF9od19yZXMoaHdfbWdyX3Jlcyk7CiAJCWlmIChyYykgewotCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBJRkUgQ1NJRCAoJWQpISIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IHN0YXJ0IElGRSBDU0lEICglZCkiLAogCQkJCSBod19tZ3JfcmVzLT5yZXNfaWQpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTE2NjgsNyArMTY4MSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShod19tZ3JfcmVzLCAmY3R4LT5yZXNfbGlzdF9pZmVfY2lkLCBsaXN0KSB7CiAJCXJjID0gY2FtX2lmZV9od19tZ3Jfc3RhcnRfaHdfcmVzKGh3X21ncl9yZXMpOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIENTSUQgKCVkKSEiLAorCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBJRkUgQ1NJRCAoJWQpIiwKIAkJCQkgaHdfbWdyX3Jlcy0+cmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNjk5LDcgKzE3MTIsNyBAQAogCiAJY3R4ID0gKHN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggKilzdGFydF9hcmdzLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCB8fCAhY3R4LT5jdHhfaW5fdXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29udGV4dCBpcyB1c2VkISIpOworCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCIpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIApAQCAtMTcxMCw2ICsxNzIzLDE2IEBACiAKIAljYW1fdGFza2xldF9zdGFydChjdHgtPmNvbW1vbi50YXNrbGV0X2luZm8pOwogCisJLyogc2V0IGN1cnJlbnQgY3NpZCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBDU0lEIEhXICovCisJZm9yIChpID0gMDsgaSA8IENBTV9JRkVfQ1NJRF9IV19OVU1fTUFYOyBpKyspIHsKKwkJaWYgKGdfaWZlX2h3X21nci5jc2lkX2RldmljZXNbaV0pCisJCQlyYyA9IGdfaWZlX2h3X21nci5jc2lkX2RldmljZXNbaV0tPmh3X29wcy5wcm9jZXNzX2NtZCgKKwkJCQlnX2lmZV9od19tZ3IuY3NpZF9kZXZpY2VzW2ldLT5od19wcml2LAorCQkJCUNBTV9JRkVfQ1NJRF9TRVRfQ1NJRF9ERUJVRywKKwkJCQkmZ19pZmVfaHdfbWdyLmRlYnVnX2NmZy5jc2lkX2RlYnVnLAorCQkJCXNpemVvZihnX2lmZV9od19tZ3IuZGVidWdfY2ZnLmNzaWRfZGVidWcpKTsKKwl9CisKIAkvKiBJTklUIElGRSBSb290OiBkbyBub3RoaW5nICovCiAKIAlDQU1fREJHKENBTV9JU1AsICJJTklUIElGRSBDSUQgLi4uIGluIGN0eCBpZDolZCIsCkBAIC0xNzE4LDcgKzE3NDEsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdfbWdyX3JlcywgJmN0eC0+cmVzX2xpc3RfaWZlX2NpZCwgbGlzdCkgewogCQlyYyA9IGNhbV9pZmVfaHdfbWdyX2luaXRfaHdfcmVzKGh3X21ncl9yZXMpOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgQ0lELihpZCA6JWQpISIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IElOSVQgSUZFIENJRChpZCA6JWQpIiwKIAkJCQkgaHdfbWdyX3Jlcy0+cmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNzMyLDcgKzE3NTUsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdfbWdyX3JlcywgJmN0eC0+cmVzX2xpc3RfaWZlX2NzaWQsIGxpc3QpIHsKIAkJcmMgPSBjYW1faWZlX2h3X21ncl9pbml0X2h3X3Jlcyhod19tZ3JfcmVzKTsKIAkJaWYgKHJjKSB7Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IElOSVQgSUZFIENTSUQuKGlkIDolZCkhIiwKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgQ1NJRChpZCA6JWQpIiwKIAkJCQkgaHdfbWdyX3Jlcy0+cmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNzQ0LDcgKzE3NjcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdfbWdyX3JlcywgJmN0eC0+cmVzX2xpc3RfaWZlX3NyYywgbGlzdCkgewogCQlyYyA9IGNhbV9pZmVfaHdfbWdyX2luaXRfaHdfcmVzKGh3X21ncl9yZXMpOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgU1JDICglZCkhIiwKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgU1JDICglZCkiLAogCQkJCSBod19tZ3JfcmVzLT5yZXNfaWQpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTE3NTcsNyArMTc4MCw3IEBACiAJZm9yIChpID0gMDsgaSA8IENBTV9JRkVfSFdfT1VUX1JFU19NQVg7IGkrKykgewogCQlyYyA9IGNhbV9pZmVfaHdfbWdyX2luaXRfaHdfcmVzKCZjdHgtPnJlc19saXN0X2lmZV9vdXRbaV0pOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgT1VUICglZCkhIiwKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3QgSU5JVCBJRkUgT1VUICglZCkiLAogCQkJCSBjdHgtPnJlc19saXN0X2lmZV9vdXRbaV0ucmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNzY2LDcgKzE3ODksNyBAQAogCUNBTV9EQkcoQ0FNX0lTUCwgInN0YXJ0IGNkbSBpbnRlcmZhY2UiKTsKIAlyYyA9IGNhbV9jZG1fc3RyZWFtX29uKGN0eC0+Y2RtX2hhbmRsZSk7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgY2RtICglZCkhIiwKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBjZG0gKCVkKSIsCiAJCQkgY3R4LT5jZG1faGFuZGxlKTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMTc4NSw3ICsxODA4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQ0FNX0lGRV9IV19PVVRfUkVTX01BWDsgaSsrKSB7CiAJCXJjID0gY2FtX2lmZV9od19tZ3Jfc3RhcnRfaHdfcmVzKCZjdHgtPnJlc19saXN0X2lmZV9vdXRbaV0pOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIE9VVCAoJWQpISIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IHN0YXJ0IElGRSBPVVQgKCVkKSIsCiAJCQkJIGkpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTE3OTcsNyArMTgyMCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShod19tZ3JfcmVzLCAmY3R4LT5yZXNfbGlzdF9pZmVfc3JjLCBsaXN0KSB7CiAJCXJjID0gY2FtX2lmZV9od19tZ3Jfc3RhcnRfaHdfcmVzKGh3X21ncl9yZXMpOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIE1VWCAoJWQpISIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IHN0YXJ0IElGRSBNVVggKCVkKSIsCiAJCQkJIGh3X21ncl9yZXMtPnJlc19pZCk7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMTgwOSw3ICsxODMyLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3X21ncl9yZXMsICZjdHgtPnJlc19saXN0X2lmZV9jc2lkLCBsaXN0KSB7CiAJCXJjID0gY2FtX2lmZV9od19tZ3Jfc3RhcnRfaHdfcmVzKGh3X21ncl9yZXMpOwogCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIENTSUQgKCVkKSEiLAorCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ2FuIG5vdCBzdGFydCBJRkUgQ1NJRCAoJWQpIiwKIAkJCQkgaHdfbWdyX3Jlcy0+cmVzX2lkKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xODIxLDcgKzE4NDQsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdfbWdyX3JlcywgJmN0eC0+cmVzX2xpc3RfaWZlX2NpZCwgbGlzdCkgewogCQlyYyA9IGNhbV9pZmVfaHdfbWdyX3N0YXJ0X2h3X3Jlcyhod19tZ3JfcmVzKTsKIAkJaWYgKHJjKSB7Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IHN0YXJ0IElGRSBDU0lEICglZCkhIiwKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNhbiBub3Qgc3RhcnQgSUZFIENTSUQgKCVkKSIsCiAJCQkJIGh3X21ncl9yZXMtPnJlc19pZCk7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMTg2MSw3ICsxODg0LDcgQEAKIAogCWN0eCA9IChzdHJ1Y3QgY2FtX2lmZV9od19tZ3JfY3R4ICopcmVsZWFzZV9hcmdzLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCB8fCAhY3R4LT5jdHhfaW5fdXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkZhdGFsOiBJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBjb250ZXh0IGlzIHVzZWQiKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKQEAgLTE4OTgsNiArMTkyMSw3IEBACiAJc3RydWN0IGNhbV9rbWRfYnVmX2luZm8gICAgICAgICAgIGttZF9idWY7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfZmVuY2UgPSB0cnVlOworCXN0cnVjdCBjYW1faXNwX2dlbmVyaWNfYmxvYl9pbmZvICBibG9iX2luZm87CiAKIAlpZiAoIWh3X21ncl9wcml2IHx8ICFwcmVwYXJlX2h3X3VwZGF0ZV9hcmdzKSB7CiAJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgYXJncyIpOwpAQCAtMTkxMywxOSArMTkzNywyNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiZW50ZXIiKTsKIAkvKiBQcmUgcGFyc2UgdGhlIHBhY2tldCovCiAJcmMgPSBjYW1fcGFja2V0X3V0aWxfZ2V0X2ttZF9idWZmZXIocHJlcGFyZS0+cGFja2V0LCAma21kX2J1Zik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlyYyA9IGNhbV9wYWNrZXRfdXRpbF9wcm9jZXNzX3BhdGNoZXMocHJlcGFyZS0+cGFja2V0LAotCQlod19tZ3ItPm1ncl9jb21tb24uY21kX2lvbW11X2hkbCk7CisJCWh3X21nci0+bWdyX2NvbW1vbi5jbWRfaW9tbXVfaGRsLAorCQlod19tZ3ItPm1ncl9jb21tb24uY21kX2lvbW11X2hkbF9zZWN1cmUpOwogCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9JU1AsICJQYXRjaCBJU1AgcGFja2V0IGZhaWxlZC4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIAorCW1lbXNldCgmYmxvYl9pbmZvLCAweDAsIHNpemVvZihzdHJ1Y3QgY2FtX2lzcF9nZW5lcmljX2Jsb2JfaW5mbykpOworCXJjID0gY2FtX2lzcF9wcm9jZXNzX2dlbmVyaWNfY21kX2J1ZmZlcihwcmVwYXJlLCAmYmxvYl9pbmZvKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiRmFpbGVkIGluIGdlbmVyaWMgYmxvYiBjbWQgYnVmZmVyLCByYz0lZCIsCisJCQlyYyk7CisJCWdvdG8gZW5kOworCX0KKwogCXByZXBhcmUtPm51bV9od191cGRhdGVfZW50cmllcyA9IDA7CiAJcHJlcGFyZS0+bnVtX2luX21hcF9lbnRyaWVzID0gMDsKIAlwcmVwYXJlLT5udW1fb3V0X21hcF9lbnRyaWVzID0gMDsKQEAgLTE5MzYsMjUgKzE5NjgsNTMgQEAKIAkJLyogQWRkIGNoYW5nZSBiYXNlICovCiAJCXJjID0gY2FtX2lzcF9hZGRfY2hhbmdlX2Jhc2UocHJlcGFyZSwgJmN0eC0+cmVzX2xpc3RfaWZlX3NyYywKIAkJCWN0eC0+YmFzZVtpXS5pZHgsICZrbWRfYnVmKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCQkiRmFpbGVkIGluIGNoYW5nZSBiYXNlIGk9JWQsIGlkeD0lZCwgcmM9JWQiLAorCQkJCWksIGN0eC0+YmFzZVtpXS5pZHgsIHJjKTsKKwkJCWdvdG8gZW5kOworCQl9CisKIAogCQkvKiBnZXQgY29tbWFuZCBidWZmZXJzICovCiAJCWlmIChjdHgtPmJhc2VbaV0uc3BsaXRfaWQgIT0gQ0FNX0lTUF9IV19TUExJVF9NQVgpIHsKIAkJCXJjID0gY2FtX2lzcF9hZGRfY29tbWFuZF9idWZmZXJzKHByZXBhcmUsCi0JCQkJY3R4LT5iYXNlW2ldLnNwbGl0X2lkKTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7CisJCQljdHgtPmJhc2VbaV0uc3BsaXRfaWQsIGN0eC0+YmFzZVtpXS5pZHgsCisJCQljdHgtPnJlc19saXN0X2lmZV9vdXQsIENBTV9JRkVfSFdfT1VUX1JFU19NQVgpOworCQkJCWlmIChyYykgeworCQkJCQlDQU1fRVJSKENBTV9JU1AsCisJCQkJCQkiRmFpbGVkIGluIGFkZCBjbWRidWYsIGk9JWQsIHNwbGl0X2lkPSVkLCByYz0lZCIsCisJCQkJCQlpLCBjdHgtPmJhc2VbaV0uc3BsaXRfaWQsIHJjKTsKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQl9CisKKwkJaWYgKGJsb2JfaW5mby5oZnJfY29uZmlnKSB7CisJCQlyYyA9IGNhbV9pc3BfYWRkX2hmcl9jb25maWdfaHdfdXBkYXRlKAorCQkJCWJsb2JfaW5mby5oZnJfY29uZmlnLCBwcmVwYXJlLAorCQkJCWN0eC0+YmFzZVtpXS5pZHgsICZrbWRfYnVmLAorCQkJCWN0eC0+cmVzX2xpc3RfaWZlX291dCwgQ0FNX0lGRV9IV19PVVRfUkVTX01BWCk7CisJCQlpZiAocmMpIHsKKwkJCQlDQU1fRVJSKENBTV9JU1AsCisJCQkJCSJGYWlsZWQgaW4gaGZyIGNvbmZpZywgaT0lZCwgcmM9JWQiLAorCQkJCQlpLCByYyk7CisJCQkJZ290byBlbmQ7CisJCQl9CiAJCX0KIAogCQkvKiBnZXQgSU8gYnVmZmVycyAqLwogCQlyYyA9IGNhbV9pc3BfYWRkX2lvX2J1ZmZlcnMoaHdfbWdyLT5tZ3JfY29tbW9uLmltZ19pb21tdV9oZGwsCi0JCQkJcHJlcGFyZSwgY3R4LT5iYXNlW2ldLmlkeCwKKwkJCWh3X21nci0+bWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsX3NlY3VyZSwKKwkJCXByZXBhcmUsIGN0eC0+YmFzZVtpXS5pZHgsCiAJCQkma21kX2J1ZiwgY3R4LT5yZXNfbGlzdF9pZmVfb3V0LAogCQkJQ0FNX0lGRV9IV19PVVRfUkVTX01BWCwgZmlsbF9mZW5jZSk7CiAKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCQkiRmFpbGVkIGluIGlvIGJ1ZmZlcnMsIGk9JWQsIHJjPSVkIiwKKwkJCQlpLCByYyk7CisJCQlnb3RvIGVuZDsKKwkJfQogCiAJCS8qIGZlbmNlIG1hcCB0YWJsZSBlbnRyaWVzIG5lZWQgdG8gZmlsbCBvbmx5IG9uY2UgaW4gdGhlIGxvb3AgKi8KIAkJaWYgKGZpbGxfZmVuY2UpCkBAIC0xOTY5LDIzICsyMDI5LDMzIEBACiAJICovCiAJaWYgKCgocHJlcGFyZS0+cGFja2V0LT5oZWFkZXIub3BfY29kZSArIDEpICYgMHhGKSA9PQogCQkJCQlDQU1fSVNQX1BBQ0tFVF9JTklUX0RFVikKLQkJcmV0dXJuIHJjOworCQlnb3RvIGVuZDsKIAogCS8qIGFkZCByZWcgdXBkYXRlIGNvbW1hbmRzICovCiAJZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX2Jhc2U7IGkrKykgewogCQkvKiBBZGQgY2hhbmdlIGJhc2UgKi8KIAkJcmMgPSBjYW1faXNwX2FkZF9jaGFuZ2VfYmFzZShwcmVwYXJlLCAmY3R4LT5yZXNfbGlzdF9pZmVfc3JjLAogCQkJY3R4LT5iYXNlW2ldLmlkeCwgJmttZF9idWYpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7CisJCWlmIChyYykgeworCQkJQ0FNX0VSUihDQU1fSVNQLAorCQkJCSJGYWlsZWQgaW4gY2hhbmdlIGJhc2UgYWRkaW5nIHJlZ191cGRhdGUgY21kIGk9JWQsIGlkeD0lZCwgcmM9JWQiLAorCQkJCWksIGN0eC0+YmFzZVtpXS5pZHgsIHJjKTsKKwkJCWdvdG8gZW5kOworCQl9CiAKIAkJLypBZGQgcmVnIHVwZGF0ZSAqLwogCQlyYyA9IGNhbV9pc3BfYWRkX3JlZ191cGRhdGUocHJlcGFyZSwgJmN0eC0+cmVzX2xpc3RfaWZlX3NyYywKIAkJCWN0eC0+YmFzZVtpXS5pZHgsICZrbWRfYnVmKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCQkiQWRkIFJlZ191cGRhdGUgY21kIEZhaWxlZCBpPSVkLCBpZHg9JWQsIHJjPSVkIiwKKwkJCQlpLCBjdHgtPmJhc2VbaV0uaWR4LCByYyk7CisJCQlnb3RvIGVuZDsKKwkJfQogCX0KIAorZW5kOgorCWtmcmVlKGJsb2JfaW5mby5oZnJfY29uZmlnKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIwMDIsNyArMjA3Miw3IEBACiAKIAljdHggPSAoc3RydWN0IGNhbV9pZmVfaHdfbWdyX2N0eCAqKWh3X2NtZF9hcmdzLT5jdHh0X3RvX2h3X21hcDsKIAlpZiAoIWN0eCB8fCAhY3R4LT5jdHhfaW5fdXNlKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkZhdGFsOiBJbnZhbGlkIGNvbnRleHQgaXMgdXNlZCEiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiRmF0YWw6IEludmFsaWQgY29udGV4dCBpcyB1c2VkIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCkBAIC0yMDcwLDcgKzIxNDAsNyBAQAogCX0KIGVuZDoKIAlpZiAocmMpCi0JCUNBTV9FUlIoQ0FNX0lTUCwgImVycm9yIGluIGdldHRpbmcgc29mIHRpbWUgc3RhbXAiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiR2V0dGluZyBzb2YgdGltZSBzdGFtcCBmYWlsZWQiKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTIwODgsNyArMjE1OCw3IEBACiAJc3RydWN0IGNhbV9pZmVfaHdfbWdyX2N0eCAgICAgICAgKmN0eCA9IE5VTEw7CiAKIAkvKiBIZXJlIHJlY292ZXJ5IGlzIHBlcmZvcm1lZCAqLwotCUNBTV9EQkcoQ0FNX0lTUCwgIkVudGVyOiBFcnJvclR5cGUgPSAlZCIsIGVycm9yX3R5cGUpOworCUNBTV9EQkcoQ0FNX0lTUCwgIkVycm9yVHlwZSA9ICVkIiwgZXJyb3JfdHlwZSk7CiAKIAlzd2l0Y2ggKGVycm9yX3R5cGUpIHsKIAljYXNlIENBTV9JU1BfSFdfRVJST1JfT1ZFUkZMT1c6CkBAIC0yNDQ0LDM0ICsyNTE0LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2FtX2lmZV9od19tZ3JfY2hlY2tfZXBvY2hfZm9yX2R1YWxfdmZlKAorc3RhdGljIGludCBjYW1faWZlX2h3X21ncl9jaGVja19pcnFfZm9yX2R1YWxfdmZlKAogCXN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggICAqaWZlX2h3X21ncl9jdHgsCiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkeDAsCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkeDEpCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkeDEsCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBod19ldmVudF90eXBlKQogewogCWludDMyX3QgcmMgPSAtMTsKLQl1aW50MzJfdCAqZXBvY2hfY250ID0gaWZlX2h3X21ncl9jdHgtPmVwb2NoX2NudDsKKwl1aW50MzJfdCAqZXZlbnRfY250ID0gTlVMTDsKIAotCWlmIChlcG9jaF9jbnRbY29yZV9pZHgwXSA9PQotCQkJZXBvY2hfY250W2NvcmVfaWR4MV0pIHsKKwlzd2l0Y2ggKGh3X2V2ZW50X3R5cGUpIHsKKwljYXNlIENBTV9JU1BfSFdfRVZFTlRfU09GOgorCQlldmVudF9jbnQgPSBpZmVfaHdfbWdyX2N0eC0+c29mX2NudDsKKwkJYnJlYWs7CisJY2FzZSBDQU1fSVNQX0hXX0VWRU5UX0VQT0NIOgorCQlldmVudF9jbnQgPSBpZmVfaHdfbWdyX2N0eC0+ZXBvY2hfY250OworCQlicmVhazsKKwljYXNlIENBTV9JU1BfSFdfRVZFTlRfRU9GOgorCQlldmVudF9jbnQgPSBpZmVfaHdfbWdyX2N0eC0+ZW9mX2NudDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogCi0JCWVwb2NoX2NudFtjb3JlX2lkeDBdID0gMDsKLQkJZXBvY2hfY250W2NvcmVfaWR4MV0gPSAwOworCWlmIChldmVudF9jbnRbY29yZV9pZHgwXSA9PQorCQkJZXZlbnRfY250W2NvcmVfaWR4MV0pIHsKKworCQlldmVudF9jbnRbY29yZV9pZHgwXSA9IDA7CisJCWV2ZW50X2NudFtjb3JlX2lkeDFdID0gMDsKIAogCQlyYyA9IDA7CiAJCXJldHVybiByYzsKIAl9CiAKLQlpZiAoKGVwb2NoX2NudFtjb3JlX2lkeDBdIC0gZXBvY2hfY250W2NvcmVfaWR4MV0gPiAxKSB8fAotCQkoZXBvY2hfY250W2NvcmVfaWR4MV0gLSBlcG9jaF9jbnRbY29yZV9pZHgwXSA+IDEpKSB7CisJaWYgKChldmVudF9jbnRbY29yZV9pZHgwXSAmJgorCQkoZXZlbnRfY250W2NvcmVfaWR4MF0gLSBldmVudF9jbnRbY29yZV9pZHgxXSA+IDEpKSB8fAorCQkoZXZlbnRfY250W2NvcmVfaWR4MV0gJiYKKwkJKGV2ZW50X2NudFtjb3JlX2lkeDFdIC0gZXZlbnRfY250W2NvcmVfaWR4MF0gPiAxKSkpIHsKIAogCQlDQU1fV0FSTihDQU1fSVNQLAotCQkJIk9uZSBvZiB0aGUgVkZFIG9mIGR1YWwgVkZFIGNvdW5kIG5vdCBnZW5lcmF0ZSBlcnJvciIpOworCQkJIk9uZSBvZiB0aGUgVkZFIGNvdW5kIG5vdCBnZW5lcmF0ZSBodyBldmVudCAlZCIsCisJCQlod19ldmVudF90eXBlKTsKIAkJcmMgPSAtMTsKIAkJcmV0dXJuIHJjOwogCX0KIAotCUNBTV9EQkcoQ0FNX0lTUCwgIk9ubHkgb25lIGNvcmVfaW5kZXggaGFzIGdpdmVuIEVQT0NIIik7CisJQ0FNX0RCRyhDQU1fSVNQLCAiT25seSBvbmUgY29yZV9pbmRleCBoYXMgZ2l2ZW4gaHcgZXZlbnQgJWQiLAorCQkJaHdfZXZlbnRfdHlwZSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0yNTQ4LDYgKzI2MzcsOCBAQAogCiAJCQkJaWYgKCFlcG9jaF9zdGF0dXMpCiAJCQkJCWlmZV9od3JfbWdyX2N0eC0+ZXBvY2hfY250W2NvcmVfaWR4XSsrOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIFNPRiBjaGVjayBmb3IgUmlnaHQgc2lkZSBWRkUgKi8KQEAgLTI1NTcsMTUgKzI2NDgsMTggQEAKIAogCQkJCWlmICghZXBvY2hfc3RhdHVzKQogCQkJCQlpZmVfaHdyX21ncl9jdHgtPmVwb2NoX2NudFtjb3JlX2lkeF0rKzsKKwkJCQllbHNlCisJCQkJCWJyZWFrOwogCQkJfQogCiAJCQljb3JlX2luZGV4MCA9IGh3X3Jlc19sLT5od19pbnRmLT5od19pZHg7CiAJCQljb3JlX2luZGV4MSA9IGh3X3Jlc19yLT5od19pbnRmLT5od19pZHg7CiAKLQkJCXJjID0gY2FtX2lmZV9od19tZ3JfY2hlY2tfZXBvY2hfZm9yX2R1YWxfdmZlKAorCQkJcmMgPSBjYW1faWZlX2h3X21ncl9jaGVja19pcnFfZm9yX2R1YWxfdmZlKAogCQkJCQlpZmVfaHdyX21ncl9jdHgsCiAJCQkJCWNvcmVfaW5kZXgwLAotCQkJCQljb3JlX2luZGV4MSk7CisJCQkJCWNvcmVfaW5kZXgxLAorCQkJCQlldnRfcGF5bG9hZC0+ZXZ0X2lkKTsKIAogCQkJaWYgKCFyYykKIAkJCQlpZmVfaHdyX2lycV9lcG9jaF9jYigKQEAgLTI1ODgsMzcgKzI2ODIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNhbV9pZmVfaHdfbWdyX2NoZWNrX3NvZl9mb3JfZHVhbF92ZmUoCi0Jc3RydWN0IGNhbV9pZmVfaHdfbWdyX2N0eCAgICppZmVfaHdyX21ncl9jdHgsCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkeDAsCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkeDEpCi17Ci0JdWludDMyX3QgKnNvZl9jbnQgPSBpZmVfaHdyX21ncl9jdHgtPnNvZl9jbnQ7Ci0JaW50MzJfdCByYyA9IC0xOwotCi0JaWYgKHNvZl9jbnRbY29yZV9pZHgwXSA9PQotCQkJc29mX2NudFtjb3JlX2lkeDFdKSB7Ci0KLQkJc29mX2NudFtjb3JlX2lkeDBdID0gMDsKLQkJc29mX2NudFtjb3JlX2lkeDFdID0gMDsKLQotCQlyYyA9IDA7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAoKHNvZl9jbnRbY29yZV9pZHgwXSAtIHNvZl9jbnRbY29yZV9pZHgxXSA+IDEpIHx8Ci0JCShzb2ZfY250W2NvcmVfaWR4MV0gLSBzb2ZfY250W2NvcmVfaWR4MF0gPiAxKSkgewotCi0JCUNBTV9FUlIoQ0FNX0lTUCwgIk9uZSBWRkUgb2YgZHVhbCBWRkUgY291bmQgbm90IGdlbmVyYXRlIFNPRiIpOwotCQlyYyA9IC0xOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JQ0FNX0lORk8oQ0FNX0lTUCwgIk9ubHkgb25lIGNvcmVfaW5kZXggaGFzIGdpdmVuIFNPRiIpOwotCi0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGNhbV9pZmVfaHdfbWdyX3Byb2Nlc3NfY2FtaWZfc29mKAogCXN0cnVjdCBjYW1faWZlX2h3X21ncl9yZXMgICAgICAgICAgICAqaXNwX2lmZV9jYW1pZl9yZXMsCiAJc3RydWN0IGNhbV9pZmVfaHdfbWdyX2N0eCAgICAgICAgICAgICppZmVfaHdyX21ncl9jdHgsCkBAIC0yNjg5LDYgKzI3NTIsOCBAQAogCQkJCWh3X3Jlc19sLCBldnRfcGF5bG9hZCk7CiAJCQlpZiAoIXNvZl9zdGF0dXMpCiAJCQkJaWZlX2h3cl9tZ3JfY3R4LT5zb2ZfY250W2NvcmVfaWR4XSsrOworCQkJZWxzZQorCQkJCWJyZWFrOwogCQl9CiAKIAkJLyogU09GIGNoZWNrIGZvciBSaWdodCBzaWRlIFZGRSAqLwpAQCAtMjcwNCwxMyArMjc2OSwxNSBAQAogCQkJCWV2dF9wYXlsb2FkKTsKIAkJCWlmICghc29mX3N0YXR1cykKIAkJCQlpZmVfaHdyX21ncl9jdHgtPnNvZl9jbnRbY29yZV9pZHhdKys7CisJCQllbHNlCisJCQkJYnJlYWs7CiAJCX0KIAogCQljb3JlX2luZGV4MCA9IGh3X3Jlc19sLT5od19pbnRmLT5od19pZHg7CiAJCWNvcmVfaW5kZXgxID0gaHdfcmVzX3ItPmh3X2ludGYtPmh3X2lkeDsKIAotCQlyYyA9IGNhbV9pZmVfaHdfbWdyX2NoZWNrX3NvZl9mb3JfZHVhbF92ZmUoaWZlX2h3cl9tZ3JfY3R4LAotCQkJY29yZV9pbmRleDAsIGNvcmVfaW5kZXgxKTsKKwkJcmMgPSBjYW1faWZlX2h3X21ncl9jaGVja19pcnFfZm9yX2R1YWxfdmZlKGlmZV9od3JfbWdyX2N0eCwKKwkJCWNvcmVfaW5kZXgwLCBjb3JlX2luZGV4MSwgZXZ0X3BheWxvYWQtPmV2dF9pZCk7CiAKIAkJaWYgKCFyYykKIAkJCWlmZV9od3JfaXJxX3NvZl9jYihpZmVfaHdyX21ncl9jdHgtPmNvbW1vbi5jYl9wcml2LApAQCAtMjcyMyw3ICsyNzkwLDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiRXhpdCAoc29mX3N0YXR1cyA9ICVkKSEiLCBzb2Zfc3RhdHVzKTsKKwlDQU1fREJHKENBTV9JU1AsICJFeGl0IChzb2Zfc3RhdHVzID0gJWQpIiwgc29mX3N0YXR1cyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3ODAsMTAgKzI4NDcsMTAgQEAKIAkJCQkJCWlmZV9od19tZ3JfY3R4LT5jb21tb24uY2JfcHJpdiwKIAkJCQkJCUNBTV9JU1BfSFdfRVZFTlRfU09GLAogCQkJCQkJJnNvZl9kb25lX2V2ZW50X2RhdGEpOworCQkJCQlDQU1fREJHKENBTV9JU1AsICJzb2Zfc3RhdHVzID0gJWQiLAorCQkJCQkJc29mX3N0YXR1cyk7CiAJCQkJfQogCi0JCQkJQ0FNX0RCRyhDQU1fSVNQLCAic29mX3N0YXR1cyA9ICVkIiwgc29mX3N0YXR1cyk7Ci0KIAkJCQkvKiB0aGlzIGlzIFJESSBvbmx5IGNvbnRleHQgc28gZXhpdCBmcm9tIGhlcmUgKi8KIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTI4MDMsNiArMjg3MCwxMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjYW1faWZlX2h3X21ncl9oYW5kbGVfZW9mX2Zvcl9jYW1pZl9od19yZXMoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoYW5kbGVyX3ByaXYsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXlsb2FkKQoreworCWludDMyX3QgcmMgPSAtRUlOVkFMOworCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgICAgICAqaHdfcmVzX2wgPSBOVUxMOworCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgICAgICAqaHdfcmVzX3IgPSBOVUxMOworCXN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggICAgICAgICAgICAqaWZlX2h3cl9tZ3JfY3R4OworCXN0cnVjdCBjYW1fdmZlX3RvcF9pcnFfZXZ0X3BheWxvYWQgICAqZXZ0X3BheWxvYWQ7CisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcyAgICAgICAgICAgICppc3BfaWZlX2NhbWlmX3JlcyA9IE5VTEw7CisJY2FtX2h3X2V2ZW50X2NiX2Z1bmMgICAgICAgICAgICAgICAgICBpZmVfaHdyX2lycV9lb2ZfY2I7CisJc3RydWN0IGNhbV9pc3BfaHdfZW9mX2V2ZW50X2RhdGEgICAgICBlb2ZfZG9uZV9ldmVudF9kYXRhOworCXVpbnQzMl90ICBjb3JlX2lkeDsKKwl1aW50MzJfdCAgZW9mX3N0YXR1cyA9IDA7CisJdWludDMyX3QgIGNvcmVfaW5kZXgwOworCXVpbnQzMl90ICBjb3JlX2luZGV4MTsKKworCUNBTV9EQkcoQ0FNX0lTUCwgIkVudGVyIik7CisKKwlpZmVfaHdyX21ncl9jdHggPSBoYW5kbGVyX3ByaXY7CisJZXZ0X3BheWxvYWQgPSBwYXlsb2FkOworCWlmICghZXZ0X3BheWxvYWQpIHsKKwkJcHJfZXJyKCIlczogbm8gcGF5bG9hZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWNvcmVfaWR4ID0gZXZ0X3BheWxvYWQtPmNvcmVfaW5kZXg7CisJaWZlX2h3cl9pcnFfZW9mX2NiID0KKwkJaWZlX2h3cl9tZ3JfY3R4LT5jb21tb24uZXZlbnRfY2JbQ0FNX0lTUF9IV19FVkVOVF9FT0ZdOworCisJZXZ0X3BheWxvYWQtPmV2dF9pZCA9IENBTV9JU1BfSFdfRVZFTlRfRU9GOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpc3BfaWZlX2NhbWlmX3JlcywKKwkJJmlmZV9od3JfbWdyX2N0eC0+cmVzX2xpc3RfaWZlX3NyYywgbGlzdCkgeworCisJCWlmICgoaXNwX2lmZV9jYW1pZl9yZXMtPnJlc190eXBlID09CisJCQlDQU1fSUZFX0hXX01HUl9SRVNfVU5JTklUKSB8fAorCQkJKGlzcF9pZmVfY2FtaWZfcmVzLT5yZXNfaWQgIT0gQ0FNX0lTUF9IV19WRkVfSU5fQ0FNSUYpKQorCQkJY29udGludWU7CisKKwkJaHdfcmVzX2wgPSBpc3BfaWZlX2NhbWlmX3Jlcy0+aHdfcmVzWzBdOworCQlod19yZXNfciA9IGlzcF9pZmVfY2FtaWZfcmVzLT5od19yZXNbMV07CisKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiaXNfZHVhbF92ZmUgPyA9ICVkIiwKKwkJCQlpc3BfaWZlX2NhbWlmX3Jlcy0+aXNfZHVhbF92ZmUpOworCQlzd2l0Y2ggKGlzcF9pZmVfY2FtaWZfcmVzLT5pc19kdWFsX3ZmZSkgeworCQkvKiBIYW5kbGluZyBTaW5nbGUgVkZFIFNjZW5hcmlvICovCisJCWNhc2UgMDoKKwkJCS8qIEVPRiBjaGVjayBmb3IgTGVmdCBzaWRlIFZGRSAqLworCQkJaWYgKCFod19yZXNfbCkgeworCQkJCXByX2VycigiJXM6IFZGRSBEZXZpY2UgaXMgTlVMTFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWJyZWFrOworCQkJfQorCQkJQ0FNX0RCRyhDQU1fSVNQLCAiY3Vycl9jb3JlX2lkeCA9ICVkLCBjb3JlIGlkeCBodyA9ICVkIiwKKwkJCQkJY29yZV9pZHgsIGh3X3Jlc19sLT5od19pbnRmLT5od19pZHgpOworCisJCQlpZiAoY29yZV9pZHggPT0gaHdfcmVzX2wtPmh3X2ludGYtPmh3X2lkeCkgeworCQkJCWVvZl9zdGF0dXMgPSBod19yZXNfbC0+Ym90dG9tX2hhbGZfaGFuZGxlcigKKwkJCQkJaHdfcmVzX2wsIGV2dF9wYXlsb2FkKTsKKwkJCQlpZiAoIWVvZl9zdGF0dXMpCisJCQkJCWlmZV9od3JfaXJxX2VvZl9jYigKKwkJCQkJCWlmZV9od3JfbWdyX2N0eC0+Y29tbW9uLmNiX3ByaXYsCisJCQkJCQlDQU1fSVNQX0hXX0VWRU5UX0VPRiwKKwkJCQkJCSZlb2ZfZG9uZV9ldmVudF9kYXRhKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCS8qIEhhbmRsaW5nIGR1YWwgVkZFIFNjZW5hcmlvICovCisJCWNhc2UgMToKKwkJCWlmICgoIWh3X3Jlc19sKSB8fCAoIWh3X3Jlc19yKSkgeworCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkR1YWwgVkZFIERldmljZSBpcyBOVUxMIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29yZV9pZHggPT0gaHdfcmVzX2wtPmh3X2ludGYtPmh3X2lkeCkgeworCQkJCWVvZl9zdGF0dXMgPSBod19yZXNfbC0+Ym90dG9tX2hhbGZfaGFuZGxlcigKKwkJCQkJaHdfcmVzX2wsIGV2dF9wYXlsb2FkKTsKKworCQkJCWlmICghZW9mX3N0YXR1cykKKwkJCQkJaWZlX2h3cl9tZ3JfY3R4LT5lb2ZfY250W2NvcmVfaWR4XSsrOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEVPRiBjaGVjayBmb3IgUmlnaHQgc2lkZSBWRkUgKi8KKwkJCWlmIChjb3JlX2lkeCA9PSBod19yZXNfci0+aHdfaW50Zi0+aHdfaWR4KSB7CisJCQkJZW9mX3N0YXR1cyA9IGh3X3Jlc19yLT5ib3R0b21faGFsZl9oYW5kbGVyKAorCQkJCQlod19yZXNfciwgZXZ0X3BheWxvYWQpOworCisJCQkJaWYgKCFlb2Zfc3RhdHVzKQorCQkJCQlpZmVfaHdyX21ncl9jdHgtPmVvZl9jbnRbY29yZV9pZHhdKys7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJY29yZV9pbmRleDAgPSBod19yZXNfbC0+aHdfaW50Zi0+aHdfaWR4OworCQkJY29yZV9pbmRleDEgPSBod19yZXNfci0+aHdfaW50Zi0+aHdfaWR4OworCisJCQlyYyA9IGNhbV9pZmVfaHdfbWdyX2NoZWNrX2lycV9mb3JfZHVhbF92ZmUoCisJCQkJCWlmZV9od3JfbWdyX2N0eCwKKwkJCQkJY29yZV9pbmRleDAsCisJCQkJCWNvcmVfaW5kZXgxLAorCQkJCQlldnRfcGF5bG9hZC0+ZXZ0X2lkKTsKKworCQkJaWYgKCFyYykKKwkJCQlpZmVfaHdyX2lycV9lb2ZfY2IoCisJCQkJCWlmZV9od3JfbWdyX2N0eC0+Y29tbW9uLmNiX3ByaXYsCisJCQkJCUNBTV9JU1BfSFdfRVZFTlRfRU9GLAorCQkJCQkmZW9mX2RvbmVfZXZlbnRfZGF0YSk7CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlDQU1fRVJSKENBTV9JU1AsICJlcnJvciB3aXRoIGh3X3JlcyIpOworCQl9CisJfQorCisJQ0FNX0RCRyhDQU1fSVNQLCAiRXhpdCAoZW9mX3N0YXR1cyA9ICVkKSIsIGVvZl9zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBjYW1faWZlX2h3X21ncl9oYW5kbGVfYnVmX2RvbmVfZm9yX2h3X3JlcygKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZXJfcHJpdiwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBheWxvYWQpCkBAIC0yODQ3LDYgKzMwMzYsOCBAQAogCQkJaHdfcmVzX2wtPmh3X2ludGYtPmh3X2lkeCkpCiAJCQlidWZfZG9uZV9zdGF0dXMgPSBod19yZXNfbC0+Ym90dG9tX2hhbGZfaGFuZGxlcigKIAkJCQlod19yZXNfbCwgZXZ0X3BheWxvYWQpOworCQllbHNlCisJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKGJ1Zl9kb25lX3N0YXR1cykgewogCQljYXNlIENBTV9WRkVfSVJRX1NUQVRVU19FUlJfQ09NUDoKQEAgLTI5MjgsNyArMzExOSw3IEBACiAJICogZm9yIHRoZSBmaXJzdCBwaGFzZSwgd2UgYXJlIGdvaW5nIHRvIHJlc2V0IGVudGlyZSBIVy4KIAkgKi8KIAotCUNBTV9EQkcoQ0FNX0lTUCwgIkV4aXQgKGJ1Zl9kb25lX3N0YXR1cyAoRXJyb3IpID0gJWQpISIsCisJQ0FNX0RCRyhDQU1fSVNQLCAiRXhpdCBidWZfZG9uZV9zdGF0dXMgRXJyb3IgPSAlZCIsCiAJCWJ1Zl9kb25lX3N0YXR1cyk7CiAJcmV0dXJuIHJjOwogfQpAQCAtMjk0Niw3ICszMTM3LDggQEAKIAlldnRfcGF5bG9hZCA9IGV2dF9wYXlsb2FkX3ByaXY7CiAJaWZlX2h3cl9tZ3JfY3R4ID0gKHN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggKilldnRfcGF5bG9hZC0+Y3R4OwogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiYWRkciBvZiBldnRfcGF5bG9hZCA9ICVsbHgiLCAodWludDY0X3QpZXZ0X3BheWxvYWQpOworCUNBTV9EQkcoQ0FNX0lTUCwgImFkZHIgb2YgZXZ0X3BheWxvYWQgPSAlbGx4IGNvcmUgaW5kZXg6MHgleCIsCisJCSh1aW50NjRfdClldnRfcGF5bG9hZCwgZXZ0X3BheWxvYWQtPmNvcmVfaW5kZXgpOwogCUNBTV9EQkcoQ0FNX0lTUCwgImJ1c19pcnFfc3RhdHVzXzA6ID0gJXgiLCBldnRfcGF5bG9hZC0+aXJxX3JlZ192YWxbMF0pOwogCUNBTV9EQkcoQ0FNX0lTUCwgImJ1c19pcnFfc3RhdHVzXzE6ID0gJXgiLCBldnRfcGF5bG9hZC0+aXJxX3JlZ192YWxbMV0pOwogCUNBTV9EQkcoQ0FNX0lTUCwgImJ1c19pcnFfc3RhdHVzXzI6ID0gJXgiLCBldnRfcGF5bG9hZC0+aXJxX3JlZ192YWxbMl0pOwpAQCAtMjk3Niw3ICszMTY4LDkgQEAKIAlldnRfcGF5bG9hZCA9IGV2dF9wYXlsb2FkX3ByaXY7CiAJaWZlX2h3cl9tZ3JfY3R4ID0gKHN0cnVjdCBjYW1faWZlX2h3X21ncl9jdHggKiloYW5kbGVyX3ByaXY7CiAKLQlDQU1fREJHKENBTV9JU1AsICJhZGRyIG9mIGV2dF9wYXlsb2FkID0gJWxseCIsICh1aW50NjRfdClldnRfcGF5bG9hZCk7CisJQ0FNX0RCRyhDQU1fSVNQLCAiYWRkciBvZiBldnRfcGF5bG9hZCA9ICVwSyBjb3JlX2luZGV4OiVkIiwKKwkJKHZvaWQgKilldnRfcGF5bG9hZCwKKwkJZXZ0X3BheWxvYWQtPmNvcmVfaW5kZXgpOwogCUNBTV9EQkcoQ0FNX0lTUCwgImlycV9zdGF0dXNfMDogPSAleCIsIGV2dF9wYXlsb2FkLT5pcnFfcmVnX3ZhbFswXSk7CiAJQ0FNX0RCRyhDQU1fSVNQLCAiaXJxX3N0YXR1c18xOiA9ICV4IiwgZXZ0X3BheWxvYWQtPmlycV9yZWdfdmFsWzFdKTsKIAlDQU1fREJHKENBTV9JU1AsICJWaW9sYXRpb24gcmVnaXN0ZXI6ID0gJXgiLApAQCAtMzAwOSw2ICszMjAzLDggQEAKIAkvKiBFUE9DSCBJUlEgKi8KIAljYW1faWZlX2h3X21ncl9oYW5kbGVfZXBvY2hfZm9yX2NhbWlmX2h3X3JlcyhpZmVfaHdyX21ncl9jdHgsCiAJCWV2dF9wYXlsb2FkX3ByaXYpOworCWNhbV9pZmVfaHdfbWdyX2hhbmRsZV9lb2ZfZm9yX2NhbWlmX2h3X3JlcyhpZmVfaHdyX21ncl9jdHgsCisJCWV2dF9wYXlsb2FkX3ByaXYpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMzA0NSw2ICszMjQxLDUxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY2FtX2lmZV9zZXRfY3NpZF9kZWJ1Zyh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWdfaWZlX2h3X21nci5kZWJ1Z19jZmcuY3NpZF9kZWJ1ZyA9IHZhbDsKKwlDQU1fREJHKENBTV9JU1AsICJTZXQgQ1NJRCBEZWJ1ZyB2YWx1ZSA6JWxsZCIsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FtX2lmZV9nZXRfY3NpZF9kZWJ1Zyh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gZ19pZmVfaHdfbWdyLmRlYnVnX2NmZy5jc2lkX2RlYnVnOworCUNBTV9EQkcoQ0FNX0lTUCwgIkdldCBDU0lEIERlYnVnIHZhbHVlIDolbGxkIiwKKwkJZ19pZmVfaHdfbWdyLmRlYnVnX2NmZy5jc2lkX2RlYnVnKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjYW1faWZlX2NzaWRfZGVidWcsCisJY2FtX2lmZV9nZXRfY3NpZF9kZWJ1ZywKKwljYW1faWZlX3NldF9jc2lkX2RlYnVnLCAiJTE2bGx1Iik7CisKK3N0YXRpYyBpbnQgY2FtX2lmZV9od19tZ3JfZGVidWdfcmVnaXN0ZXIodm9pZCkKK3sKKwlnX2lmZV9od19tZ3IuZGVidWdfY2ZnLmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2FtZXJhX2lmZSIsCisJCU5VTEwpOworCisJaWYgKCFnX2lmZV9od19tZ3IuZGVidWdfY2ZnLmRlbnRyeSkgeworCQlDQU1fRVJSKENBTV9JU1AsICJmYWlsZWQgdG8gY3JlYXRlIGRlbnRyeSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoImlmZV9jc2lkX2RlYnVnIiwKKwkJMDY0NCwKKwkJZ19pZmVfaHdfbWdyLmRlYnVnX2NmZy5kZW50cnksIE5VTEwsCisJCSZjYW1faWZlX2NzaWRfZGVidWcpKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgImZhaWxlZCB0byBjcmVhdGUgY2FtX2lmZV9jc2lkX2RlYnVnIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGdfaWZlX2h3X21nci5kZWJ1Z19jZmcuZGVudHJ5KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogaW50IGNhbV9pZmVfaHdfbWdyX2luaXQoc3RydWN0IGNhbV9od19tZ3JfaW50ZiAqaHdfbWdyX2ludGYpCiB7CiAJaW50IHJjID0gLUVGQVVMVDsKQEAgLTMwNTgsOCArMzI5OSw4IEBACiAJbXV0ZXhfaW5pdCgmZ19pZmVfaHdfbWdyLmN0eF9tdXRleCk7CiAKIAlpZiAoQ0FNX0lGRV9IV19OVU1fTUFYICE9IENBTV9JRkVfQ1NJRF9IV19OVU1fTUFYKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkZhdGFsLCBDU0lEIG51bSBpcyBkaWZmZXJlbnQgdGhlbiBJRkUgbnVtISIpOwotCQlnb3RvIGVuZDsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRCBudW0gaXMgZGlmZmVyZW50IHRoZW4gSUZFIG51bSIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBmaWxsIGlmZSBodyBpbnRmIGluZm9ybWF0aW9uICovCkBAIC0zMDgzLDggKzMzMjQsOCBAQAogCQl9CiAJfQogCWlmIChqID09IDApIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAibm8gdmFsaWQgSUZFIEhXISIpOwotCQlnb3RvIGVuZDsKKwkJQ0FNX0VSUihDQU1fSVNQLCAibm8gdmFsaWQgSUZFIEhXIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGZpbGwgY3NpZCBodyBpbnRmIGluZm9ybWF0aW9uICovCkBAIC0zMDk0LDggKzMzMzUsOCBAQAogCQkJaisrOwogCX0KIAlpZiAoIWopIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAibm8gdmFsaWQgSUZFIENTSUQgSFchIik7Ci0JCWdvdG8gZW5kOworCQlDQU1fRVJSKENBTV9JU1AsICJubyB2YWxpZCBJRkUgQ1NJRCBIVyIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAljYW1faWZlX2h3X21ncl9zb3J0X2Rldl93aXRoX2NhcHMoJmdfaWZlX2h3X21ncik7CkBAIC0zMTEzLDE5ICszMzU0LDI1IEBACiAJICovCiAJaWYgKGNhbV9zbW11X2dldF9oYW5kbGUoImlmZSIsCiAJCSZnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsKSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGdldCBpb21tdSBoYW5kbGUuIik7Ci0JCWdvdG8gZW5kOworCQlDQU1fRVJSKENBTV9JU1AsICJDYW4gbm90IGdldCBpb21tdSBoYW5kbGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGNhbV9zbW11X29wcyhnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsLAogCQlDQU1fU01NVV9BVFRBQ0gpKSB7CiAJCUNBTV9FUlIoQ0FNX0lTUCwgIkF0dGFjaCBpb21tdSBoYW5kbGUgZmFpbGVkLiIpOwotCQlnb3RvIGVuZDsKKwkJZ290byBhdHRhY2hfZmFpbDsKIAl9CiAKLQlDQU1fREJHKENBTV9JU1AsICJnb3QgaW9tbXVfaGFuZGxlPSVkIiwKLQkJZ19pZmVfaHdfbWdyLm1ncl9jb21tb24uaW1nX2lvbW11X2hkbCk7Ci0JZ19pZmVfaHdfbWdyLm1ncl9jb21tb24uaW1nX2lvbW11X2hkbF9zZWN1cmUgPSAtMTsKKwlpZiAoY2FtX3NtbXVfZ2V0X2hhbmRsZSgiY2FtLXNlY3VyZSIsCisJCSZnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsX3NlY3VyZSkpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiRmFpbGVkIHRvIGdldCBzZWN1cmUgaW9tbXUgaGFuZGxlIik7CisJCWdvdG8gc2VjdXJlX2ZhaWw7CisJfQorCisJQ0FNX0RCRyhDQU1fSVNQLCAiaW9tbXVfaGFuZGxlczogbm9uLXNlY3VyZVsweCV4XSwgc2VjdXJlWzB4JXhdIiwKKwkJZ19pZmVfaHdfbWdyLm1ncl9jb21tb24uaW1nX2lvbW11X2hkbCwKKwkJZ19pZmVfaHdfbWdyLm1ncl9jb21tb24uaW1nX2lvbW11X2hkbF9zZWN1cmUpOwogCiAJaWYgKCFjYW1fY2RtX2dldF9pb21tdV9oYW5kbGUoImlmZSIsICZjZG1faGFuZGxlcykpIHsKIAkJQ0FNX0RCRyhDQU1fSVNQLCAiU3VjY2Vzc2Z1bGx5IGFjcXVpcmVkIHRoZSBDRE0gaW9tbXUgaGFuZGxlcyIpOwpAQCAtMzE4Nyw3ICszNDM0LDYgQEAKIAkvKiBDcmVhdGUgV29ya2VyIGZvciBpZmVfaHdfbWdyIHdpdGggMTAgdGFza3MgKi8KIAlyYyA9IGNhbV9yZXFfbWdyX3dvcmtxX2NyZWF0ZSgiY2FtX2lmZV93b3JrZXIiLCAxMCwKIAkJCSZnX2lmZV9od19tZ3Iud29ya3EsIENSTV9XT1JLUV9VU0FHRV9OT05fSVJRKTsKLQogCWlmIChyYyA8IDApIHsKIAkJQ0FNX0VSUihDQU1fSVNQLCAiVW5hYmxlIHRvIGNyZWF0ZSB3b3JrZXIiKTsKIAkJZ290byBlbmQ7CkBAIC0zMjA2LDEzICszNDUyLDI5IEBACiAJaHdfbWdyX2ludGYtPmh3X2NvbmZpZyA9IGNhbV9pZmVfbWdyX2NvbmZpZ19odzsKIAlod19tZ3JfaW50Zi0+aHdfY21kID0gY2FtX2lmZV9tZ3JfY21kOwogCisJY2FtX2lmZV9od19tZ3JfZGVidWdfcmVnaXN0ZXIoKTsKIAlDQU1fREJHKENBTV9JU1AsICJFeGl0Iik7CisKIAlyZXR1cm4gMDsKIGVuZDoKIAlpZiAocmMpIHsKLQkJZm9yIChpID0gMDsgaSA8IENBTV9DVFhfTUFYOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBDQU1fQ1RYX01BWDsgaSsrKSB7CisJCQljYW1fdGFza2xldF9kZWluaXQoCisJCQkJJmdfaWZlX2h3X21nci5tZ3JfY29tbW9uLnRhc2tsZXRfcG9vbFtpXSk7CiAJCQlrZnJlZShnX2lmZV9od19tZ3IuY3R4X3Bvb2xbaV0uY2RtX2NtZCk7CisJCQlnX2lmZV9od19tZ3IuY3R4X3Bvb2xbaV0uY2RtX2NtZCA9IE5VTEw7CisJCQlnX2lmZV9od19tZ3IuY3R4X3Bvb2xbaV0uY29tbW9uLnRhc2tsZXRfaW5mbyA9IE5VTEw7CisJCX0KIAl9CisJY2FtX3NtbXVfZGVzdHJveV9oYW5kbGUoCisJCWdfaWZlX2h3X21nci5tZ3JfY29tbW9uLmltZ19pb21tdV9oZGxfc2VjdXJlKTsKKwlnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsX3NlY3VyZSA9IC0xOworc2VjdXJlX2ZhaWw6CisJY2FtX3NtbXVfb3BzKGdfaWZlX2h3X21nci5tZ3JfY29tbW9uLmltZ19pb21tdV9oZGwsCisJCUNBTV9TTU1VX0RFVEFDSCk7CithdHRhY2hfZmFpbDoKKwljYW1fc21tdV9kZXN0cm95X2hhbmRsZShnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsKTsKKwlnX2lmZV9od19tZ3IubWdyX2NvbW1vbi5pbWdfaW9tbXVfaGRsID0gLTE7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2NhbV9pZmVfaHdfbWdyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2NhbV9pZmVfaHdfbWdyLmgKaW5kZXggNmRmZGIyMS4uMmU2NjIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9jYW1faWZlX2h3X21nci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvY2FtX2lmZV9od19tZ3IuaApAQCAtODEsNiArODEsMTggQEAKIH07CiAKIC8qKgorICogc3RydWN0IGNhbV9pZmVfaHdfbWdyX2RlYnVnIC0gY29udGFpbiB0aGUgZGVidWcgaW5mb3JtYXRpb24KKyAqCisgKiBAZGVudHJ5OiAgICAgICAgICAgICAgRGVidWdmcyBlbnRyeQorICogQGNzaWRfZGVidWc6ICAgICAgICAgIGNzaWQgZGVidWcgaW5mb3JtYXRpb24KKyAqCisgKi8KK3N0cnVjdCBjYW1faWZlX2h3X21ncl9kZWJ1ZyB7CisJc3RydWN0IGRlbnRyeSAgICAgICAgICAgICAgICAgICpkZW50cnk7CisJdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICBjc2lkX2RlYnVnOworfTsKKworLyoqCiAgKiBzdHJ1Y3QgY2FtX3ZmZV9od19tZ3JfY3R4IC0gSUZFIEhXIG1hbmFnZXIgQ29udGV4dCBvYmplY3QKICAqCiAgKiBAbGlzdDogICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgY3R4IGxpc3QuCkBAIC0xMDYsNiArMTE4LDcgQEAKICAqIEBjZG1fY21kICAgICAgICAgICAgICAgICBjZG0gYmFzZSBhbmQgbGVuZ3RoIHJlcXVlc3QgcG9pbnRlcgogICogQHNvZl9jbnQgICAgICAgICAgICAgICAgIHNvZiBjb3VudCB2YWx1ZSBwZXIgY29yZSwgdXNlZCBmb3IgZHVhbCBWRkUKICAqIEBlcG9jaF9jbnQgICAgICAgICAgICAgICBlcG9jaCBjb3VudCB2YWx1ZSBwZXIgY29yZSwgdXNlZCBmb3IgZHVhbCBWRkUKKyAqIEBlb2ZfY250ICAgICAgICAgICAgICAgICBlb2YgY291bnQgdmFsdWUgcGVyIGNvcmUsIHVzZWQgZm9yIGR1YWwgVkZFCiAgKiBAb3ZlcmZsb3dfcGVuZGluZyAgICAgICAgZmxhdCB0byBzcGVjaWZ5IHRoZSBvdmVyZmxvdyBpcyBwZW5kaW5nIGZvciB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0CiAgKiBAaXNfcmRpX29ubHlfY29udGV4dCAgICAgZmxhZyB0byBzcGVjaWZ5IHRoZSBjb250ZXh0IGhhcyBvbmx5IHJkaSByZXNvdXJjZQpAQCAtMTM4LDkgKzE1MSw5IEBACiAKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHNvZl9jbnRbQ0FNX0lGRV9IV19OVU1fTUFYXTsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGVwb2NoX2NudFtDQU1fSUZFX0hXX05VTV9NQVhdOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgZW9mX2NudFtDQU1fSUZFX0hXX05VTV9NQVhdOwogCWF0b21pY190ICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3dfcGVuZGluZzsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JkaV9vbmx5X2NvbnRleHQ7Ci0KIH07CiAKIC8qKgpAQCAtMTc0LDYgKzE4Nyw3IEBACiAJCQkJCQlDQU1fSUZFX0NTSURfSFdfTlVNX01BWF07CiAJc3RydWN0IGNhbV92ZmVfaHdfZ2V0X2h3X2NhcCAgIGlmZV9kZXZfY2Fwc1tDQU1fSUZFX0hXX05VTV9NQVhdOwogCXN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX3dvcmtxICAqd29ya3E7CisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX2RlYnVnICAgICBkZWJ1Z19jZmc7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaHdfdXRpbHMvY2FtX2lzcF9wYWNrZXRfcGFyc2VyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2NhbV9pc3BfcGFja2V0X3BhcnNlci5jCmluZGV4IDBhMGVlY2IuLjVmNjhmMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaHdfdXRpbHMvY2FtX2lzcF9wYWNrZXRfcGFyc2VyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9od191dGlscy9jYW1faXNwX3BhY2tldF9wYXJzZXIuYwpAQCAtODIsMTAgKzgyLDY2IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGNhbV9pc3BfdXBkYXRlX2R1YWxfY29uZmlnKAorCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgKnByZXBhcmUsCisJc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgICAgICAgICAgICAqY21kX2Rlc2MsCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfaWQsCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9pZHgsCisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcyAgICAgICAgICAqcmVzX2xpc3RfaXNwX291dCwKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2lzcF9vdXQpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKwlzdHJ1Y3QgY2FtX2lzcF9kdWFsX2NvbmZpZyAgICAgICAgICAgICAgICAgKmR1YWxfY29uZmlnOworCXN0cnVjdCBjYW1faWZlX2h3X21ncl9yZXMgICAgICAgICAgICAgICAgICAqaHdfbWdyX3JlczsKKwlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICAgICAgICAgKnJlczsKKwlzdHJ1Y3QgY2FtX2lzcF9od19kdWFsX2lzcF91cGRhdGVfYXJncyAgICAgIGR1YWxfaXNwX3VwZGF0ZV9hcmdzOworCXNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNwdV9hZGRyOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgajsKKworCUNBTV9EQkcoQ0FNX1VUSUwsICJjbWQgZGVzIHNpemUgJWQsIGxlbmd0aDogJWQiLAorCQljbWRfZGVzYy0+c2l6ZSwgY21kX2Rlc2MtPmxlbmd0aCk7CisKKwlyYyA9IGNhbV9wYWNrZXRfdXRpbF9nZXRfY21kX21lbV9hZGRyKAorCQljbWRfZGVzYy0+bWVtX2hhbmRsZSwgJmNwdV9hZGRyLCAmbGVuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWNwdV9hZGRyICs9IChjbWRfZGVzYy0+b2Zmc2V0IC8gNCk7CisJZHVhbF9jb25maWcgPSAoc3RydWN0IGNhbV9pc3BfZHVhbF9jb25maWcgKiljcHVfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBkdWFsX2NvbmZpZy0+bnVtX3BvcnRzOyBpKyspIHsKKwkJaHdfbWdyX3JlcyA9ICZyZXNfbGlzdF9pc3Bfb3V0W2ldOworCQlmb3IgKGogPSAwOyBqIDwgQ0FNX0lTUF9IV19TUExJVF9NQVg7IGorKykgeworCQkJaWYgKCFod19tZ3JfcmVzLT5od19yZXNbal0pCisJCQkJY29udGludWU7CisKKwkJCWlmIChod19tZ3JfcmVzLT5od19yZXNbal0tPmh3X2ludGYtPmh3X2lkeCAhPSBiYXNlX2lkeCkKKwkJCQljb250aW51ZTsKKworCQkJcmVzID0gaHdfbWdyX3Jlcy0+aHdfcmVzW2pdOworCQkJZHVhbF9pc3BfdXBkYXRlX2FyZ3Muc3BsaXRfaWQgPSBqOworCQkJZHVhbF9pc3BfdXBkYXRlX2FyZ3MucmVzICAgICAgPSByZXM7CisJCQlkdWFsX2lzcF91cGRhdGVfYXJncy5kdWFsX2NmZyA9IGR1YWxfY29uZmlnOworCQkJcmMgPSByZXMtPmh3X2ludGYtPmh3X29wcy5wcm9jZXNzX2NtZCgKKwkJCQlyZXMtPmh3X2ludGYtPmh3X3ByaXYsCisJCQkJQ0FNX1ZGRV9IV19DTURfU1RSSVBFX1VQREFURSwKKwkJCQkmZHVhbF9pc3BfdXBkYXRlX2FyZ3MsCisJCQkJc2l6ZW9mKHN0cnVjdCBjYW1faXNwX2h3X2R1YWxfaXNwX3VwZGF0ZV9hcmdzKSk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQogCiBpbnQgY2FtX2lzcF9hZGRfY29tbWFuZF9idWZmZXJzKAogCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgKnByZXBhcmUsCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfaWQpCisJZW51bSBjYW1faXNwX2h3X3NwbGl0X2lkICAgICAgICAgICAgc3BsaXRfaWQsCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9pZHgsCisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcyAgICAgICAgICAqcmVzX2xpc3RfaXNwX291dCwKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2lzcF9vdXQpCiB7CiAJaW50IHJjID0gMDsKIAl1aW50MzJfdCAgY21kX21ldGFfZGF0YSwgbnVtX2VudCwgaTsKQEAgLTE2OCw2ICsyMjQsMTYgQEAKIAogCQkJbnVtX2VudCsrOwogCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0lTUF9QQUNLRVRfTUVUQV9EVUFMX0NPTkZJRzoKKwkJCXJjID0gY2FtX2lzcF91cGRhdGVfZHVhbF9jb25maWcocHJlcGFyZSwKKwkJCQkmY21kX2Rlc2NbaV0sIHNwbGl0X2lkLCBiYXNlX2lkeCwKKwkJCQlyZXNfbGlzdF9pc3Bfb3V0LCBzaXplX2lzcF9vdXQpOworCisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0lTUF9QQUNLRVRfTUVUQV9HRU5FUklDX0JMT0I6CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUNBTV9FUlIoQ0FNX0lTUCwgImludmFsaWQgY2RtIGNvbW1hbmQgbWV0YSBkYXRhICVkIiwKIAkJCQljbWRfbWV0YV9kYXRhKTsKQEAgLTE4MCw5ICsyNDYsMjMzIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGNhbV9pc3BfaGFuZGxlX2hmcl9jb25maWcoCisJc3RydWN0IGNhbV9pc3BfZ2VuZXJpY19ibG9iX2luZm8gKmJsb2JfaW5mbywKKwlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9oZnJfY29uZmlnICpoZnJfY29uZmlnLCB1aW50MzJfdCBibG9iX3NpemUpCit7CisJdWludDMyX3QgY2FsX2Jsb2Jfc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9oZnJfY29uZmlnKSArCisJCShzaXplb2Yoc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnKSAqCisJCShoZnJfY29uZmlnLT5udW1faW9fY29uZmlncyAtIDEpKTsKKworCWlmIChjYWxfYmxvYl9zaXplICE9IGJsb2Jfc2l6ZSkgeworCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGJsb2Igc2l6ZSAlZCAlZCIsCisJCQljYWxfYmxvYl9zaXplLCBibG9iX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlDQU1fREJHKENBTV9JU1AsICJIRlIgbnVtX2lvX2NvbmZpZyA9ICVkIiwgaGZyX2NvbmZpZy0+bnVtX2lvX2NvbmZpZ3MpOworCisJaWYgKGJsb2JfaW5mby0+aGZyX2NvbmZpZykgeworCQlDQU1fV0FSTihDQU1fSVNQLAorCQkJIklnbm9yaW5nIHByZXZpb3VzIGhmcl9jb25maWcsIHByZXY9JWQsIGN1cnI9JWQiLAorCQkJYmxvYl9pbmZvLT5oZnJfY29uZmlnLT5udW1faW9fY29uZmlncywKKwkJCWhmcl9jb25maWctPm51bV9pb19jb25maWdzKTsKKwkJa2ZyZWUoYmxvYl9pbmZvLT5oZnJfY29uZmlnKTsKKwl9CisKKwlibG9iX2luZm8tPmhmcl9jb25maWcgPSBremFsbG9jKGJsb2Jfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFibG9iX2luZm8tPmhmcl9jb25maWcpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KGJsb2JfaW5mby0+aGZyX2NvbmZpZywgaGZyX2NvbmZpZywgYmxvYl9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbV9pc3BfcGFja2V0X2dlbmVyaWNfYmxvYl9oYW5kbGVyKHZvaWQgKnVzZXJfZGF0YSwKKwl1aW50MzJfdCBibG9iX3R5cGUsIHVpbnQzMl90IGJsb2Jfc2l6ZSwgdWludDhfdCAqYmxvYl9kYXRhKQoreworCWludCByYyA9IDA7CisKKwlpZiAoIWJsb2JfZGF0YSB8fCAoYmxvYl9zaXplID09IDApKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgYmxvYiBpbmZvICVwSyAlZCIsIGJsb2JfZGF0YSwKKwkJCWJsb2Jfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoYmxvYl90eXBlKSB7CisJY2FzZSBDQU1fSVNQX0dFTkVSSUNfQkxPQl9UWVBFX0hGUl9DT05GSUc6CisJCXJjID0gY2FtX2lzcF9oYW5kbGVfaGZyX2NvbmZpZyh1c2VyX2RhdGEsCisJCQkoc3RydWN0IGNhbV9pc3BfcmVzb3VyY2VfaGZyX2NvbmZpZyAqKWJsb2JfZGF0YSwKKwkJCWJsb2Jfc2l6ZSk7CisJCWlmIChyYykKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkZhaWxlZCBpbiBoYW5kbGluZyBoZnIgY29uZmlnICVkIiwKKwkJCQlyYyk7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0FNX1dBUk4oQ0FNX0lTUCwgIkludmFsaWQgYmxvYiB0eXBlICVkIiwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgY2FtX2lzcF9wcm9jZXNzX2dlbmVyaWNfY21kX2J1ZmZlcigKKwlzdHJ1Y3QgY2FtX2h3X3ByZXBhcmVfdXBkYXRlX2FyZ3MgKnByZXBhcmUsCisJc3RydWN0IGNhbV9pc3BfZ2VuZXJpY19ibG9iX2luZm8gICpibG9iX2luZm8pCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqY21kX2Rlc2MgPSBOVUxMOworCisJLyoKKwkgKiBzZXQgdGhlIGNtZF9kZXNjIHRvIHBvaW50IHRoZSBmaXJzdCBjb21tYW5kIGRlc2NyaXB0b3IgaW4gdGhlCisJICogcGFja2V0CisJICovCisJY21kX2Rlc2MgPSAoc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgKikKKwkJCSgodWludDhfdCAqKSZwcmVwYXJlLT5wYWNrZXQtPnBheWxvYWQgKworCQkJcHJlcGFyZS0+cGFja2V0LT5jbWRfYnVmX29mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJlcGFyZS0+cGFja2V0LT5udW1fY21kX2J1ZjsgaSsrKSB7CisJCWlmICghY21kX2Rlc2NbaV0ubGVuZ3RoKQorCQkJY29udGludWU7CisKKwkJaWYgKGNtZF9kZXNjW2ldLm1ldGFfZGF0YSAhPSBDQU1fSVNQX1BBQ0tFVF9NRVRBX0dFTkVSSUNfQkxPQikKKwkJCWNvbnRpbnVlOworCisJCXJjID0gY2FtX3BhY2tldF91dGlsX3ZhbGlkYXRlX2NtZF9kZXNjKCZjbWRfZGVzY1tpXSk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGNhbV9wYWNrZXRfdXRpbF9wcm9jZXNzX2dlbmVyaWNfY21kX2J1ZmZlcigmY21kX2Rlc2NbaV0sCisJCQljYW1faXNwX3BhY2tldF9nZW5lcmljX2Jsb2JfaGFuZGxlciwgYmxvYl9pbmZvKTsKKwkJaWYgKHJjKQorCQkJQ0FNX0VSUihDQU1fSVNQLCAiRmFpbGVkIGluIHByb2Nlc3NpbmcgYmxvYnMgJWQiLCByYyk7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgY2FtX2lzcF9hZGRfaGZyX2NvbmZpZ19od191cGRhdGUoCisJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2VfaGZyX2NvbmZpZyAgICpoZnJfY29uZmlnLAorCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgICAqcHJlcGFyZSwKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfaWR4LAorCXN0cnVjdCBjYW1fa21kX2J1Zl9pbmZvICAgICAgICAgICAgICAqa21kX2J1Zl9pbmZvLAorCXN0cnVjdCBjYW1faWZlX2h3X21ncl9yZXMgICAgICAgICAgICAqcmVzX2xpc3RfaXNwX291dCwKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfaXNwX291dCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgICAgKnJlczsKKwlzdHJ1Y3QgY2FtX2lmZV9od19tZ3JfcmVzICAgICAgICAgICpod19tZ3JfcmVzOworCXN0cnVjdCBjYW1faXNwX2h3X2dldF9oZnJfdXBkYXRlICAgIHVwZGF0ZV9oZnI7CisJc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnICAgICAqaW9faGZyX2NvbmZpZzsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWRfYnVmX3JlbWFpbl9zaXplOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGo7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX2lkX291dDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZnJfY2ZnX3VzZWRfYnl0ZXMsIG51bV9lbnQ7CisKKwloZnJfY2ZnX3VzZWRfYnl0ZXMgPSAwOworCisJLyogTWF4IG9uZSBodyBlbnRyaWVzIHJlcXVpcmVkIGZvciBoZnIgY29uZmlnIHVwZGF0ZSAqLworCWlmIChwcmVwYXJlLT5udW1faHdfdXBkYXRlX2VudHJpZXMgKyAxID49CisJCQlwcmVwYXJlLT5tYXhfaHdfdXBkYXRlX2VudHJpZXMpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiSW5zdWZmaWNpZW50ICBIVyBlbnRyaWVzIDolZCAlZCIsCisJCQlwcmVwYXJlLT5udW1faHdfdXBkYXRlX2VudHJpZXMsCisJCQlwcmVwYXJlLT5tYXhfaHdfdXBkYXRlX2VudHJpZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlDQU1fREJHKENBTV9JU1AsICJudW1faW9fY29uZmlncz0gJWQiLCBoZnJfY29uZmlnLT5udW1faW9fY29uZmlncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGZyX2NvbmZpZy0+bnVtX2lvX2NvbmZpZ3M7IGkrKykgeworCQlpb19oZnJfY29uZmlnID0gJmhmcl9jb25maWctPmlvX2hmcl9jb25maWdbaV07CisJCXJlc19pZF9vdXQgPSBpb19oZnJfY29uZmlnLT5yZXNvdXJjZV90eXBlICYgMHhGRjsKKworCQlDQU1fREJHKENBTV9JU1AsICJoZnIgY29uZmlnIGlkeCAlZCwgdHlwZT0lZCIsIGksIHJlc19pZF9vdXQpOworCisJCWlmIChyZXNfaWRfb3V0ID49IHNpemVfaXNwX291dCkgeworCQkJQ0FNX0VSUihDQU1fSVNQLCAiaW52YWxpZCBvdXQgcmVzdHlwZToleCIsCisJCQkJaW9faGZyX2NvbmZpZy0+cmVzb3VyY2VfdHlwZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWh3X21ncl9yZXMgPSAmcmVzX2xpc3RfaXNwX291dFtyZXNfaWRfb3V0XTsKKwkJaWYgKGh3X21ncl9yZXMtPnJlc190eXBlID09IENBTV9JRkVfSFdfTUdSX1JFU19VTklOSVQpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgImlvIHJlcyBpZDolZCBub3QgdmFsaWQiLAorCQkJCWlvX2hmcl9jb25maWctPnJlc291cmNlX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgQ0FNX0lTUF9IV19TUExJVF9NQVg7IGorKykgeworCQkJaWYgKCFod19tZ3JfcmVzLT5od19yZXNbal0pCisJCQkJY29udGludWU7CisKKwkJCWlmIChod19tZ3JfcmVzLT5od19yZXNbal0tPmh3X2ludGYtPmh3X2lkeCAhPSBiYXNlX2lkeCkKKwkJCQljb250aW51ZTsKKworCQkJcmVzID0gaHdfbWdyX3Jlcy0+aHdfcmVzW2pdOworCQkJaWYgKHJlcy0+cmVzX2lkICE9CisJCQkJaW9faGZyX2NvbmZpZy0+cmVzb3VyY2VfdHlwZSkgeworCQkJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCQkJIndtIGVyciByZXMgaWQ6JWQgaW8gcmVzIGlkOiVkIiwKKwkJCQkJcmVzLT5yZXNfaWQsCisJCQkJCWlvX2hmcl9jb25maWctPnJlc291cmNlX3R5cGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAoKGttZF9idWZfaW5mby0+dXNlZF9ieXRlcyArIGhmcl9jZmdfdXNlZF9ieXRlcykgPAorCQkJCWttZF9idWZfaW5mby0+c2l6ZSkgeworCQkJCWttZF9idWZfcmVtYWluX3NpemUgPSBrbWRfYnVmX2luZm8tPnNpemUgLQorCQkJCQkoa21kX2J1Zl9pbmZvLT51c2VkX2J5dGVzICsKKwkJCQkJaGZyX2NmZ191c2VkX2J5dGVzKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0FNX0VSUihDQU1fSVNQLAorCQkJCQkibm8gZnJlZSBrbWQgbWVtb3J5IGZvciBiYXNlICVkIiwKKwkJCQkJYmFzZV9pZHgpOworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCXVwZGF0ZV9oZnIuY2RtLnJlcyA9IHJlczsKKwkJCXVwZGF0ZV9oZnIuY2RtLmNtZF9idWZfYWRkciA9IGttZF9idWZfaW5mby0+Y3B1X2FkZHIgKworCQkJCWttZF9idWZfaW5mby0+dXNlZF9ieXRlcy80ICsKKwkJCQkJaGZyX2NmZ191c2VkX2J5dGVzLzQ7CisJCQl1cGRhdGVfaGZyLmNkbS5zaXplID0ga21kX2J1Zl9yZW1haW5fc2l6ZTsKKwkJCXVwZGF0ZV9oZnIuaW9faGZyX2NmZyAgICA9IGlvX2hmcl9jb25maWc7CisKKwkJCUNBTV9EQkcoQ0FNX0lTUCwgImNtZCBidWZmZXIgMHglcEssIHNpemUgJWQiLAorCQkJCXVwZGF0ZV9oZnIuY2RtLmNtZF9idWZfYWRkciwKKwkJCQl1cGRhdGVfaGZyLmNkbS5zaXplKTsKKwkJCXJjID0gcmVzLT5od19pbnRmLT5od19vcHMucHJvY2Vzc19jbWQoCisJCQkJcmVzLT5od19pbnRmLT5od19wcml2LAorCQkJCUNBTV9WRkVfSFdfQ01EX0dFVF9IRlJfVVBEQVRFLCAmdXBkYXRlX2hmciwKKwkJCQlzaXplb2Yoc3RydWN0IGNhbV9pc3BfaHdfZ2V0X2hmcl91cGRhdGUpKTsKKworCQkJaWYgKHJjKSB7CisJCQkJQ0FNX0VSUihDQU1fSVNQLCAiZ2V0IGJ1ZiBjbWQgZXJyb3I6JWQiLAorCQkJCQlyZXMtPnJlc19pZCk7CisJCQkJcmMgPSAtRU5PTUVNOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCWhmcl9jZmdfdXNlZF9ieXRlcyArPSB1cGRhdGVfaGZyLmNkbS51c2VkX2J5dGVzOworCQl9CisJfQorCisJQ0FNX0RCRyhDQU1fSVNQLCAiaGZyX2NmZ191c2VkX2J5dGVzICVkIiwgaGZyX2NmZ191c2VkX2J5dGVzKTsKKwlpZiAoaGZyX2NmZ191c2VkX2J5dGVzKSB7CisJCS8qIFVwZGF0ZSB0aGUgSFcgZW50cmllcyAqLworCQludW1fZW50ID0gcHJlcGFyZS0+bnVtX2h3X3VwZGF0ZV9lbnRyaWVzOworCQlwcmVwYXJlLT5od191cGRhdGVfZW50cmllc1tudW1fZW50XS5oYW5kbGUgPQorCQkJCQlrbWRfYnVmX2luZm8tPmhhbmRsZTsKKwkJcHJlcGFyZS0+aHdfdXBkYXRlX2VudHJpZXNbbnVtX2VudF0ubGVuID0gaGZyX2NmZ191c2VkX2J5dGVzOworCQlwcmVwYXJlLT5od191cGRhdGVfZW50cmllc1tudW1fZW50XS5vZmZzZXQgPQorCQkJa21kX2J1Zl9pbmZvLT5vZmZzZXQ7CisJCW51bV9lbnQrKzsKKworCQlrbWRfYnVmX2luZm8tPnVzZWRfYnl0ZXMgKz0gaGZyX2NmZ191c2VkX2J5dGVzOworCQlrbWRfYnVmX2luZm8tPm9mZnNldCAgICAgKz0gaGZyX2NmZ191c2VkX2J5dGVzOworCQlwcmVwYXJlLT5udW1faHdfdXBkYXRlX2VudHJpZXMgPSBudW1fZW50OworCX0KKworCXJldHVybiByYzsKK30KIAogaW50IGNhbV9pc3BfYWRkX2lvX2J1ZmZlcnMoCiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb21tdV9oZGwsCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfaW9tbXVfaGRsLAogCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgICAqcHJlcGFyZSwKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfaWR4LAogCXN0cnVjdCBjYW1fa21kX2J1Zl9pbmZvICAgICAgICAgICAgICAqa21kX2J1Zl9pbmZvLApAQCAtMjAwLDcgKzQ5MCwxMCBAQAogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIG51bV9vdXRfYnVmLCBudW1faW5fYnVmOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc19pZF9vdXQsIHJlc19pZF9pbiwgcGxhbmVfaWQ7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9fY2ZnX3VzZWRfYnl0ZXMsIG51bV9lbnQ7Ci0Jc2l6ZV90IHNpemU7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGw7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW11X2hkbDsKKwlib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBpc19idWZfc2VjdXJlOwogCiAJaW9fY2ZnID0gKHN0cnVjdCBjYW1fYnVmX2lvX2NmZyAqKSAoKHVpbnQ4X3QgKikKIAkJCSZwcmVwYXJlLT5wYWNrZXQtPnBheWxvYWQgKwpAQCAtMzExLDkgKzYwNCwzMSBAQAogCQkJCWlmICghaW9fY2ZnW2ldLm1lbV9oYW5kbGVbcGxhbmVfaWRdKQogCQkJCQlicmVhazsKIAorCQkJCWhkbCA9IGlvX2NmZ1tpXS5tZW1faGFuZGxlW3BsYW5lX2lkXTsKKwkJCQlpZiAocmVzLT5wcm9jZXNzX2NtZChyZXMsCisJCQkJCQlDQU1fVkZFX0hXX0NNRF9HRVRfU0VDVVJFX01PREUsCisJCQkJCQkmbW9kZSwKKwkJCQkJCXNpemVvZihib29sKSkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaXNfYnVmX3NlY3VyZSA9IGNhbV9tZW1faXNfc2VjdXJlX2J1ZihoZGwpOworCQkJCWlmICgobW9kZSA9PSBDQU1fU0VDVVJFX01PREVfU0VDVVJFKSAmJgorCQkJCQlpc19idWZfc2VjdXJlKSB7CisJCQkJCW1tdV9oZGwgPSBzZWNfaW9tbXVfaGRsOworCQkJCX0gZWxzZSBpZiAoCisJCQkJCShtb2RlID09IENBTV9TRUNVUkVfTU9ERV9OT05fU0VDVVJFKSAmJgorCQkJCQkoIWlzX2J1Zl9zZWN1cmUpKSB7CisJCQkJCW1tdV9oZGwgPSBpb21tdV9oZGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsCisJCQkJCQkiSW52YWxpZCBoZGw6IHBvcnQgbW9kZVsldV0sIGJ1ZiBtb2RlWyV1XSIsCisJCQkJCQltb2RlLCBpc19idWZfc2VjdXJlKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCiAJCQkJcmMgPSBjYW1fbWVtX2dldF9pb19idWYoCiAJCQkJCWlvX2NmZ1tpXS5tZW1faGFuZGxlW3BsYW5lX2lkXSwKLQkJCQkJaW9tbXVfaGRsLCAmaW9fYWRkcltwbGFuZV9pZF0sICZzaXplKTsKKwkJCQkJbW11X2hkbCwgJmlvX2FkZHJbcGxhbmVfaWRdLCAmc2l6ZSk7CiAJCQkJaWYgKHJjKSB7CiAJCQkJCUNBTV9FUlIoQ0FNX0lTUCwKIAkJCQkJCSJubyBpbyBhZGRyIGZvciBwbGFuZSVkIiwKQEAgLTQ3MSw2ICs3ODYsOCBAQAogCQkJaWYgKHJjKQogCQkJCXJldHVybiByYzsKIAorCQkJQ0FNX0RCRyhDQU1fSVNQLCAiUmVnIHVwZGF0ZSBhZGRlZCBmb3IgcmVzICVkIGh3X2lkICVkIiwKKwkJCQlyZXMtPnJlc19pZCwgcmVzLT5od19pbnRmLT5od19pZHgpOwogCQkJcmVnX3VwZGF0ZV9zaXplICs9IGdldF9yZWd1cC51c2VkX2J5dGVzOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9od191dGlscy9pbmNsdWRlL2NhbV9pc3BfcGFja2V0X3BhcnNlci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9od191dGlscy9pbmNsdWRlL2NhbV9pc3BfcGFja2V0X3BhcnNlci5oCmluZGV4IDdhYzcyOWYuLmNjZTAwNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaHdfdXRpbHMvaW5jbHVkZS9jYW1faXNwX3BhY2tldF9wYXJzZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2luY2x1ZGUvY2FtX2lzcF9wYWNrZXRfcGFyc2VyLmgKQEAgLTIxLDYgKzIxLDE2IEBACiAjaW5jbHVkZSAiY2FtX3BhY2tldF91dGlsLmgiCiAKIC8qKgorICogc3RydWN0IGNhbV9pc3BfZ2VuZXJpY19ibG9iX2luZm8gIEdlbmVyaWMgYmxvYiBpbmZvcm1hdGlvbgorICoKKyAqIEBoZnJfY29uZmlnICAgICAgICAgICAgIEluaXRpYWwgY29uZmlndXJhdGlvbiByZXF1aXJlZCB0byBlbmFibGUgSEZSCisgKgorICovCitzdHJ1Y3QgY2FtX2lzcF9nZW5lcmljX2Jsb2JfaW5mbyB7CisJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2VfaGZyX2NvbmZpZyAqaGZyX2NvbmZpZzsKK307CisKKy8qKgogICogQGJyaWVmICAgICAgICAgICAgICAgICAgQWRkIGNoYW5nZSBiYXNlIGluIHRoZSBodyBlbnRyaWVzIGxpc3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlIHRoZSBpc3Agc291cmNlIGxpc3QgZ2V0IHRoZSBjaGFuZ2UgYmFzZSBmcm9tCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBJU1AgSFcgaW5zdGFuY2UKQEAgLTQ0LDE0ICs1NCwxOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBvciByaWdodCBWRkUvSUZFIGluc3RhbmNlLgogICoKICAqIEBwcmVwYXJlOiAgICAgICAgICAgICAgIENvbnRhaW4gdGhlICBwYWNrZXQgYW5kIEhXIHVwZGF0ZSB2YXJpYWJsZXMKLSAqIEBkdWFsX3R5cGU6ICAgICAgICAgICAgIExlZnQgb2YgcmlnaHQgY29tbWFuZCBidWZmZXJzIHRvIGJlIGV4dHJhY3RlZAotICoKKyAqIEBzcGxpdF9pZDogICAgICAgICAgICAgIExlZnQgb3IgcmlnaHQgY29tbWFuZCBidWZmZXJzIHRvIGJlIGV4dHJhY3RlZAorICogQGJhc2VfaWR4OiAgICAgICAgICAgICAgQmFzZSBvciBkZXYgaW5kZXggb2YgdGhlIElGRS9WRkUgSFcgaW5zdGFuY2UKKyAqIEByZXNfbGlzdF9pc3Bfb3V0OiAgICAgIElGRSAvVkZFIG91dCByZXNvdXJjZSBsaXN0CisgKiBAc2l6ZV9pc3Bfb3V0OiAgICAgICAgICBTaXplIG9mIHRoZSByZXNfbGlzdF9pc3Bfb3V0IGFycmF5CiAgKiBAcmV0dXJuOiAgICAgICAgICAgICAgICAwIGZvciBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGZvciBGYWlsCiAgKi8KIGludCBjYW1faXNwX2FkZF9jb21tYW5kX2J1ZmZlcnMoCi0Jc3RydWN0IGNhbV9od19wcmVwYXJlX3VwZGF0ZV9hcmdzICAgICpwcmVwYXJlLAotCWVudW0gY2FtX2lzcF9od19zcGxpdF9pZCAgICAgICAgICAgICAgc3BsaXRfaWQpOworCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgKnByZXBhcmUsCisJZW51bSBjYW1faXNwX2h3X3NwbGl0X2lkICAgICAgICAgICAgc3BsaXRfaWQsCisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9pZHgsCisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcyAgICAgICAgICAqcmVzX2xpc3RfaXNwX291dCwKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2lzcF9vdXQpOwogCiAvKioKICAqIEBicmllZiAgICAgICAgICAgICAgICAgIEFkZCBpbyBidWZmZXIgY29uZmlndXJhdGlvbnMgaW4gdGhlIEhXIGVudHJpZXMgbGlzdApAQCAtNTksNiArNzQsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYW5kIHVwZGF0ZSB0aGUgSFcgZW50cmllcyBsaXN0CiAgKgogICogQGlvbW11X2hkbDogICAgICAgICAgICAgSW9tbXUgaGFuZGxlIHRvIGdldCB0aGUgSU8gYnVmIGZyb20gbWVtb3J5IG1hbmFnZXIKKyAqIEBzZWNfaW9tbXVfaGRsOiAgICAgICAgIFNlY3VyZSBpb21tdSBoYW5kbGUgdG8gZ2V0IHRoZSBJTyBidWYgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IG1hbmFnZXIKICAqIEBwcmVwYXJlOiAgICAgICAgICAgICAgIENvbnRhaW4gdGhlICBwYWNrZXQgYW5kIEhXIHVwZGF0ZSB2YXJpYWJsZXMKICAqIEBiYXNlX2lkeDogICAgICAgICAgICAgIEJhc2Ugb3IgZGV2IGluZGV4IG9mIHRoZSBJRkUvVkZFIEhXIGluc3RhbmNlCiAgKiBAa21kX2J1Zl9pbmZvOiAgICAgICAgICBLbWQgYnVmZmVyIHRvIHN0b3JlIHRoZSBjaGFuZ2UgYmFzZSBjb21tYW5kCkBAIC02OSw3ICs4Niw5IEBACiAgKiBAcmV0dXJuOiAgICAgICAgICAgICAgICAwIGZvciBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGZvciBGYWlsCiAgKi8KLWludCBjYW1faXNwX2FkZF9pb19idWZmZXJzKGludAkgaW9tbXVfaGRsLAoraW50IGNhbV9pc3BfYWRkX2lvX2J1ZmZlcnMoCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb21tdV9oZGwsCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfaW9tbXVfaGRsLAogCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAgICAqcHJlcGFyZSwKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfaWR4LAogCXN0cnVjdCBjYW1fa21kX2J1Zl9pbmZvICAgICAgICAgICAgICAqa21kX2J1Zl9pbmZvLApAQCAtOTYsNSArMTE1LDQwIEBACiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2lkeCwKIAlzdHJ1Y3QgY2FtX2ttZF9idWZfaW5mbyAgICAgICAgICAgICAgKmttZF9idWZfaW5mbyk7CiAKKy8qKgorICogQGJyaWVmICAgICAgICAgICAgICAgICAgQWRkIEhGUiBjb25maWd1cmF0aW9ucyBpbiB0aGUgSFcgZW50cmllcyBsaXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZSB0aGUgaGZyIGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBiYXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBhbmQgdXBkYXRlIHRoZSBIVyBlbnRyaWVzIGxpc3QKKyAqCisgKiBAaGZyX2NvbmZpZzogICAgICAgICAgICBIRlIgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBpbmZvCisgKiBAcHJlcGFyZTogICAgICAgICAgICAgICBDb250YWluIHRoZSAgcGFja2V0IGFuZCBIVyB1cGRhdGUgdmFyaWFibGVzCisgKiBAYmFzZV9pZHg6ICAgICAgICAgICAgICBCYXNlIG9yIGRldiBpbmRleCBvZiB0aGUgSUZFL1ZGRSBIVyBpbnN0YW5jZQorICogQGttZF9idWZfaW5mbzogICAgICAgICAgS21kIGJ1ZmZlciB0byBzdG9yZSB0aGUgY2hhbmdlIGJhc2UgY29tbWFuZAorICogQHJlc19saXN0X2lzcF9vdXQ6ICAgICAgSUZFIC9WRkUgb3V0IHJlc291cmNlIGxpc3QKKyAqIEBzaXplX2lzcF9vdXQ6ICAgICAgICAgIFNpemUgb2YgdGhlIHJlc19saXN0X2lzcF9vdXQgYXJyYXkKKyAqCisgKiBAcmV0dXJuOiAgICAgICAgICAgICAgICAwIGZvciBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGZvciBGYWlsCisgKi8KK2ludCBjYW1faXNwX2FkZF9oZnJfY29uZmlnX2h3X3VwZGF0ZSgKKwlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9oZnJfY29uZmlnICAgKmhmcl9jb25maWcsCisJc3RydWN0IGNhbV9od19wcmVwYXJlX3VwZGF0ZV9hcmdzICAgICpwcmVwYXJlLAorCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9pZHgsCisJc3RydWN0IGNhbV9rbWRfYnVmX2luZm8gICAgICAgICAgICAgICprbWRfYnVmX2luZm8sCisJc3RydWN0IGNhbV9pZmVfaHdfbWdyX3JlcyAgICAgICAgICAgICpyZXNfbGlzdF9pc3Bfb3V0LAorCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9pc3Bfb3V0KTsKKworLyoqCisgKiBAYnJpZWYgICAgICAgICAgICAgICAgICBQcm9jZXNzaW5nIEdlbmVyaWMgY29tbWFuZCBidWZmZXIuCisgKgorICogQHByZXBhcmU6ICAgICAgICAgICAgICAgQ29udGFpbiB0aGUgIHBhY2tldCBhbmQgSFcgdXBkYXRlIHZhcmlhYmxlcworICogQGJsb2JfaW5mbzogICAgICAgICAgICAgSW5mb3JtYXRpb24gZnJvbSBnZW5lcmljIGJsb2IgY29tbWFuZCBidWZmZXIKKyAqCisgKiBAcmV0dXJuOiAgICAgICAgICAgICAgICAwIGZvciBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGZvciBGYWlsCisgKi8KK2ludCBjYW1faXNwX3Byb2Nlc3NfZ2VuZXJpY19jbWRfYnVmZmVyKAorCXN0cnVjdCBjYW1faHdfcHJlcGFyZV91cGRhdGVfYXJncyAqcHJlcGFyZSwKKwlzdHJ1Y3QgY2FtX2lzcF9nZW5lcmljX2Jsb2JfaW5mbyAgKmJsb2JfaW5mbyk7CiAKICNlbmRpZiAvKl9DQU1fSVNQX0hXX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2lycV9jb250cm9sbGVyL2NhbV9pcnFfY29udHJvbGxlci5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9od191dGlscy9pcnFfY29udHJvbGxlci9jYW1faXJxX2NvbnRyb2xsZXIuYwppbmRleCAyMzQxYjM4Li5kY2JlYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2lycV9jb250cm9sbGVyL2NhbV9pcnFfY29udHJvbGxlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaHdfdXRpbHMvaXJxX2NvbnRyb2xsZXIvY2FtX2lycV9jb250cm9sbGVyLmMKQEAgLTMyOSw2ICszMjksMTExIEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgY2FtX2lycV9jb250cm9sbGVyX2VuYWJsZV9pcnEodm9pZCAqaXJxX2NvbnRyb2xsZXIsIHVpbnQzMl90IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgY2FtX2lycV9jb250cm9sbGVyICAqY29udHJvbGxlciAgPSBpcnFfY29udHJvbGxlcjsKKwlzdHJ1Y3QgY2FtX2lycV9ldnRfaGFuZGxlciAqZXZ0X2hhbmRsZXIgPSBOVUxMOworCXN0cnVjdCBjYW1faXJxX2V2dF9oYW5kbGVyICpldnRfaGFuZGxlcl90ZW1wOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBmbGFnczsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgaTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgaXJxX21hc2s7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtRUlOVkFMOworCisJaWYgKCFjb250cm9sbGVyKQorCQlyZXR1cm4gcmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZ0X2hhbmRsZXIsIGV2dF9oYW5kbGVyX3RlbXAsCisJCSZjb250cm9sbGVyLT5ldnRfaGFuZGxlcl9saXN0X2hlYWQsIGxpc3Rfbm9kZSkgeworCQlpZiAoZXZ0X2hhbmRsZXItPmluZGV4ID09IGhhbmRsZSkgeworCQkJQ0FNX0RCRyhDQU1fSVNQLCAiZW5hYmxlIGl0ZW0gJWQiLCBoYW5kbGUpOworCQkJZm91bmQgPSAxOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gcmM7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPnJ3X2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY29udHJvbGxlci0+bnVtX3JlZ2lzdGVyczsgaSsrKSB7CisJCWNvbnRyb2xsZXItPmlycV9yZWdpc3Rlcl9hcnJbaV0uCisJCXRvcF9oYWxmX2VuYWJsZV9tYXNrW2V2dF9oYW5kbGVyLT5wcmlvcml0eV0gfD0KKwkJCWV2dF9oYW5kbGVyLT5ldnRfYml0X21hc2tfYXJyW2ldOworCisJCWlycV9tYXNrID0gY2FtX2lvX3JfbWIoY29udHJvbGxlci0+bWVtX2Jhc2UgKworCQkJY29udHJvbGxlci0+aXJxX3JlZ2lzdGVyX2FycltpXS4KKwkJCW1hc2tfcmVnX29mZnNldCk7CisJCWlycV9tYXNrIHw9IGV2dF9oYW5kbGVyLT5ldnRfYml0X21hc2tfYXJyW2ldOworCisJCWNhbV9pb193X21iKGlycV9tYXNrLCBjb250cm9sbGVyLT5tZW1fYmFzZSArCisJCWNvbnRyb2xsZXItPmlycV9yZWdpc3Rlcl9hcnJbaV0ubWFza19yZWdfb2Zmc2V0KTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmNvbnRyb2xsZXItPnJ3X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworaW50IGNhbV9pcnFfY29udHJvbGxlcl9kaXNhYmxlX2lycSh2b2lkICppcnFfY29udHJvbGxlciwgdWludDMyX3QgaGFuZGxlKQoreworCXN0cnVjdCBjYW1faXJxX2NvbnRyb2xsZXIgICpjb250cm9sbGVyICA9IGlycV9jb250cm9sbGVyOworCXN0cnVjdCBjYW1faXJxX2V2dF9oYW5kbGVyICpldnRfaGFuZGxlciA9IE5VTEw7CisJc3RydWN0IGNhbV9pcnFfZXZ0X2hhbmRsZXIgKmV2dF9oYW5kbGVyX3RlbXA7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGZsYWdzOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBpOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBpcnFfbWFzazsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IC1FSU5WQUw7CisKKwlpZiAoIWNvbnRyb2xsZXIpCisJCXJldHVybiByYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShldnRfaGFuZGxlciwgZXZ0X2hhbmRsZXJfdGVtcCwKKwkJJmNvbnRyb2xsZXItPmV2dF9oYW5kbGVyX2xpc3RfaGVhZCwgbGlzdF9ub2RlKSB7CisJCWlmIChldnRfaGFuZGxlci0+aW5kZXggPT0gaGFuZGxlKSB7CisJCQlDQU1fREJHKENBTV9JU1AsICJkaXNhYmxlIGl0ZW0gJWQiLCBoYW5kbGUpOworCQkJZm91bmQgPSAxOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gcmM7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPnJ3X2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY29udHJvbGxlci0+bnVtX3JlZ2lzdGVyczsgaSsrKSB7CisJCWNvbnRyb2xsZXItPmlycV9yZWdpc3Rlcl9hcnJbaV0uCisJCXRvcF9oYWxmX2VuYWJsZV9tYXNrW2V2dF9oYW5kbGVyLT5wcmlvcml0eV0gJj0KKwkJCX4oZXZ0X2hhbmRsZXItPmV2dF9iaXRfbWFza19hcnJbaV0pOworCisJCWlycV9tYXNrID0gY2FtX2lvX3JfbWIoY29udHJvbGxlci0+bWVtX2Jhc2UgKworCQkJY29udHJvbGxlci0+aXJxX3JlZ2lzdGVyX2FycltpXS4KKwkJCW1hc2tfcmVnX29mZnNldCk7CisJCWlycV9tYXNrICY9IH4oZXZ0X2hhbmRsZXItPmV2dF9iaXRfbWFza19hcnJbaV0pOworCisJCWNhbV9pb193X21iKGlycV9tYXNrLCBjb250cm9sbGVyLT5tZW1fYmFzZSArCisJCQljb250cm9sbGVyLT5pcnFfcmVnaXN0ZXJfYXJyW2ldLgorCQkJbWFza19yZWdfb2Zmc2V0KTsKKworCQkvKiBDbGVhciB0aGUgSVJRIGJpdHMgb2YgdGhpcyBoYW5kbGVyICovCisJCWNhbV9pb193X21iKGV2dF9oYW5kbGVyLT5ldnRfYml0X21hc2tfYXJyW2ldLAorCQkJY29udHJvbGxlci0+bWVtX2Jhc2UgKworCQkJY29udHJvbGxlci0+aXJxX3JlZ2lzdGVyX2FycltpXS4KKwkJCWNsZWFyX3JlZ19vZmZzZXQpOworCisJCWlmIChjb250cm9sbGVyLT5nbG9iYWxfY2xlYXJfb2Zmc2V0KQorCQkJY2FtX2lvX3dfbWIoCisJCQkJY29udHJvbGxlci0+Z2xvYmFsX2NsZWFyX2JpdG1hc2ssCisJCQkJY29udHJvbGxlci0+bWVtX2Jhc2UgKworCQkJCWNvbnRyb2xsZXItPmdsb2JhbF9jbGVhcl9vZmZzZXQpOworCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+cndfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCiBpbnQgY2FtX2lycV9jb250cm9sbGVyX3Vuc3Vic2NyaWJlX2lycSh2b2lkICppcnFfY29udHJvbGxlciwKIAl1aW50MzJfdCBoYW5kbGUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2lycV9jb250cm9sbGVyL2NhbV9pcnFfY29udHJvbGxlci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9od191dGlscy9pcnFfY29udHJvbGxlci9jYW1faXJxX2NvbnRyb2xsZXIuaAppbmRleCAxOTkwYzUxLi43ZTMwN2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2h3X3V0aWxzL2lycV9jb250cm9sbGVyL2NhbV9pcnFfY29udHJvbGxlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaHdfdXRpbHMvaXJxX2NvbnRyb2xsZXIvY2FtX2lycV9jb250cm9sbGVyLmgKQEAgLTIxNCw0ICsyMTQsNDAgQEAKICAqLwogaXJxcmV0dXJuX3QgY2FtX2lycV9jb250cm9sbGVyX2hhbmRsZV9pcnEoaW50IGlycV9udW0sIHZvaWQgKnByaXYpOwogCisvKgorICogY2FtX2lycV9jb250cm9sbGVyX2Rpc2FibGVfaXJxKCkKKyAqCisgKiBAYnJpZWY6ICAgICAgICAgICAgICBEaXNhYmxlIHRoZSBpbnRlcnJ1cHRzIG9uIGdpdmVuIGNvbnRyb2xsZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICBVbnN1YnNjcmliZSB3aWxsIGRpc2FibGUgdGhlIElSUSBieSBkZWZhdWx0LCBzbyB0aGlzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IG5lZWRlZCBpZiBiZXR3ZWVuIHN1YnNjcmliZS91bnN1YnNjcmliZSB0aGVyZSBpcworICogICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBkaXNhYmxlIElSUSBhZ2FpbgorICoKKyAqIEBpcnFfY29udHJvbGxlcjogICAgIFBvaW50ZXIgdG8gSVJRIENvbnRyb2xsZXIgdGhhdCBjb250cm9scyB0aGUgcmVnaXN0ZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHRvIGl0LgorICogQGhhbmRsZTogICAgICAgICAgICAgSGFuZGxlIHJldHVybmVkIG9uIHN1Y2Nlc3NmdWwgc3Vic2NyaWJlLCB1c2VkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmeSB0aGUgaGFuZGxlciBvYmplY3QKKyAqCisgKiBAcmV0dXJuOiAgICAgICAgICAgICAwOiBldmVudHMgZm91bmQgYW5kIGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgICAgICBOZWdhdGl2ZTogZXZlbnRzIG5vdCByZWdpc3RlcmVkIG9uIHRoaXMgY29udHJvbGxlcgorICovCitpbnQgY2FtX2lycV9jb250cm9sbGVyX2Rpc2FibGVfaXJxKHZvaWQgKmlycV9jb250cm9sbGVyLCB1aW50MzJfdCBoYW5kbGUpOworCisvKgorICogY2FtX2lycV9jb250cm9sbGVyX2VuYWJsZV9pcnEoKQorICoKKyAqIEBicmllZjogICAgICAgICAgICAgIEVuYWJsZSB0aGUgaW50ZXJydXB0cyBvbiBnaXZlbiBjb250cm9sbGVyLgorICogICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaWJlIHdpbGwgZW5hYmxlIHRoZSBJUlEgYnkgZGVmYXVsdCwgc28gdGhpcyBpcworICogICAgICAgICAgICAgICAgICAgICAgb25seSBuZWVkZWQgaWYgYmV0d2VlbiBzdWJzY3JpYmUvdW5zdWJzY3JpYmUgdGhlcmUgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gZW5hYmxlIElSUSBhZ2FpbgorICoKKyAqIEBpcnFfY29udHJvbGxlcjogICAgIFBvaW50ZXIgdG8gSVJRIENvbnRyb2xsZXIgdGhhdCBjb250cm9scyB0aGUgcmVnaXN0ZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHRvIGl0LgorICogQGhhbmRsZTogICAgICAgICAgICAgSGFuZGxlIHJldHVybmVkIG9uIHN1Y2Nlc3NmdWwgc3Vic2NyaWJlLCB1c2VkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmeSB0aGUgaGFuZGxlciBvYmplY3QKKyAqCisgKiBAcmV0dXJuOiAgICAgICAgICAgICAwOiBldmVudHMgZm91bmQgYW5kIGVuYWJsZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlOiBldmVudHMgbm90IHJlZ2lzdGVyZWQgb24gdGhpcyBjb250cm9sbGVyCisgKi8KK2ludCBjYW1faXJxX2NvbnRyb2xsZXJfZW5hYmxlX2lycSh2b2lkICppcnFfY29udHJvbGxlciwgdWludDMyX3QgaGFuZGxlKTsKKwogI2VuZGlmIC8qIF9DQU1fSVJRX0NPTlRST0xMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZDE3MC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkMTcwLmgKaW5kZXggOGZmMmE1NS4uYzY4ZGRmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkMTcwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkMTcwLmgKQEAgLTE5OSw3ICsxOTksNyBAQAogCS5jc2lkX2NzaTJfcnhfY2FwdHVyZWRfbG9uZ19wa3RfMF9hZGRyICAgICAgICA9IDB4MTMwLAogCS5jc2lkX2NzaTJfcnhfY2FwdHVyZWRfbG9uZ19wa3RfMV9hZGRyICAgICAgICA9IDB4MTM0LAogCS5jc2lkX2NzaTJfcnhfY2FwdHVyZWRfbG9uZ19wa3RfZnRyX2FkZHIgICAgICA9IDB4MTM4LAotCS5jc2lkX2NzaTJfcnhfY2FwdHVyZWRfY3BoeV9wa3RfZnRyX2FkZHIgICAgICA9IDB4MTNjLAorCS5jc2lkX2NzaTJfcnhfY2FwdHVyZWRfY3BoeV9wa3RfaGRyX2FkZHIgICAgICA9IDB4MTNjLAogCS5jc2lkX2NzaTJfcnhfbGFuZTBfbWlzcl9hZGRyICAgICAgICAgICAgICAgICA9IDB4MTUwLAogCS5jc2lkX2NzaTJfcnhfbGFuZTFfbWlzcl9hZGRyICAgICAgICAgICAgICAgICA9IDB4MTU0LAogCS5jc2lkX2NzaTJfcnhfbGFuZTJfbWlzcl9hZGRyICAgICAgICAgICAgICAgICA9IDB4MTU4LApAQCAtMjEzLDYgKzIxMywxNCBAQAogCS5jc2kyX2lycV9tYXNrX2FsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRkZGRiwKIAkuY3NpMl9taXNyX2VuYWJsZV9zaGlmdF92YWwgICAgICAgICAgICAgICAgICAgPSA2LAogCS5jc2kyX3ZjX21vZGVfc2hpZnRfdmFsICAgICAgICAgICAgICAgICAgICAgICA9IDIsCisJLmNzaTJfY2FwdHVyZV9sb25nX3BrdF9lbl9zaGlmdCAgICAgICAgICAgICAgID0gMCwKKwkuY3NpMl9jYXB0dXJlX3Nob3J0X3BrdF9lbl9zaGlmdCAgICAgICAgICAgICAgPSAxLAorCS5jc2kyX2NhcHR1cmVfY3BoeV9wa3RfZW5fc2hpZnQgICAgICAgICAgICAgICA9IDIsCisJLmNzaTJfY2FwdHVyZV9sb25nX3BrdF9kdF9zaGlmdCAgICAgICAgICAgICAgID0gNCwKKwkuY3NpMl9jYXB0dXJlX2xvbmdfcGt0X3ZjX3NoaWZ0ICAgICAgICAgICAgICAgPSAxMCwKKwkuY3NpMl9jYXB0dXJlX3Nob3J0X3BrdF92Y19zaGlmdCAgICAgICAgICAgICAgPSAxNSwKKwkuY3NpMl9jYXB0dXJlX2NwaHlfcGt0X2R0X3NoaWZ0ICAgICAgICAgICAgICAgPSAyMCwKKwkuY3NpMl9jYXB0dXJlX2NwaHlfcGt0X3ZjX3NoaWZ0ICAgICAgICAgICAgICAgPSAyNiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2FtX2lmZV9jc2lkX2NzaTJfdHBnX3JlZ19vZmZzZXQKQEAgLTIzNiw5ICsyNDQsMTAgQEAKIAkuY3NpZF90cGdfY2dlbl9uX3kxX2FkZHIgICAgICAgICAgICAgICAgICAgICAgPSAweDY2NCwKIAkuY3NpZF90cGdfY2dlbl9uX3kyX2FkZHIgICAgICAgICAgICAgICAgICAgICAgPSAweDY2OCwKIAotCS8qY29uZmlndXJhdGlvbnMgKi8KKwkvKiBjb25maWd1cmF0aW9ucyAqLwogCS50cGdfZHRuX2NmZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YywKIAkudHBnX2NnZW5fY2ZnX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwLAorCS50cGdfY3Bhc19pZmVfcmVnX29mZnNldCAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgsCiB9OwogCiBzdGF0aWMgc3RydWN0IGNhbV9pZmVfY3NpZF9jb21tb25fcmVnX29mZnNldApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9jb3JlLmMKaW5kZXggYTJmNzczZS4uN2Q2ZTc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfY29yZS5jCkBAIC0zMywxMSArMzMsMTEgQEAKICNkZWZpbmUgQ0FNX0lGRV9DU0lEX1RJTUVPVVRfQUxMX1VTICAgICAgICAgICAgICAgICAgICAxMDAwMDAwCiAKIHN0YXRpYyBpbnQgY2FtX2lmZV9jc2lkX2lzX2lwcF9mb3JtYXRfc3VwcG9ydGVkKAotCQkJCXVpbnQzMl90IGRlY29kZV9mbXQpCisJdWludDMyX3QgaW5fZm9ybWF0KQogewogCWludCByYyA9IC1FSU5WQUw7CiAKLQlzd2l0Y2ggKGRlY29kZV9mbXQpIHsKKwlzd2l0Y2ggKGluX2Zvcm1hdCkgewogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV182OgogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV184OgogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xMDoKQEAgLTU5LDEyNyArNTksMjIzIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGNhbV9pZmVfY3NpZF9nZXRfZm9ybWF0KHVpbnQzMl90IGlucHV0X2ZtdCwKLQl1aW50MzJfdCAqcGF0aF9mbXQpCitzdGF0aWMgaW50IGNhbV9pZmVfY3NpZF9nZXRfZm9ybWF0X3JkaSgKKwl1aW50MzJfdCBpbl9mb3JtYXQsIHVpbnQzMl90IG91dF9mb3JtYXQsCisJdWludDMyX3QgKmRlY29kZV9mbXQsIHVpbnQzMl90ICpwbGFpbl9mbXQpCiB7CiAJaW50IHJjID0gMDsKIAotCXN3aXRjaCAoaW5wdXRfZm10KSB7CisJc3dpdGNoIChpbl9mb3JtYXQpIHsKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfNjoKLQkJKnBhdGhfZm10ICA9IDA7CisJCXN3aXRjaCAob3V0X2Zvcm1hdCkgeworCQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfNjoKKwkJCSpkZWNvZGVfZm10ID0gMHhmOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjg6CisJCQkqZGVjb2RlX2ZtdCA9IDB4MDsKKwkJCSpwbGFpbl9mbXQgPSAweDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV184OgotCQkqcGF0aF9mbXQgID0gMTsKKwkJc3dpdGNoIChvdXRfZm9ybWF0KSB7CisJCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV184OgorCQljYXNlIENBTV9GT1JNQVRfUExBSU4xMjg6CisJCQkqZGVjb2RlX2ZtdCA9IDB4ZjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GT1JNQVRfUExBSU44OgorCQkJKmRlY29kZV9mbXQgPSAweDE7CisJCQkqcGxhaW5fZm10ID0gMHgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTA6Ci0JCSpwYXRoX2ZtdCAgPSAyOworCQlzd2l0Y2ggKG91dF9mb3JtYXQpIHsKKwkJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzEwOgorCQljYXNlIENBTV9GT1JNQVRfUExBSU4xMjg6CisJCQkqZGVjb2RlX2ZtdCA9IDB4ZjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xMDoKKwkJCSpkZWNvZGVfZm10ID0gMHgyOworCQkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzEyOgotCQkqcGF0aF9mbXQgID0gMzsKKwkJc3dpdGNoIChvdXRfZm9ybWF0KSB7CisJCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xMjoKKwkJCSpkZWNvZGVfZm10ID0gMHhmOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzEyOgorCQkJKmRlY29kZV9mbXQgPSAweDM7CisJCQkqcGxhaW5fZm10ID0gMHgxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTQ6Ci0JCSpwYXRoX2ZtdCAgPSA0OworCQlzd2l0Y2ggKG91dF9mb3JtYXQpIHsKKwkJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzE0OgorCQkJKmRlY29kZV9mbXQgPSAweGY7CisJCQlicmVhazsKKwkJY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTQ6CisJCQkqZGVjb2RlX2ZtdCA9IDB4NDsKKwkJCSpwbGFpbl9mbXQgPSAweDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xNjoKLQkJKnBhdGhfZm10ICA9IDU7CisJCXN3aXRjaCAob3V0X2Zvcm1hdCkgeworCQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTY6CisJCQkqZGVjb2RlX2ZtdCA9IDB4ZjsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xNjoKKwkJCSpkZWNvZGVfZm10ID0gMHg1OworCQkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzIwOgotCQkqcGF0aF9mbXQgID0gNjsKKwkJc3dpdGNoIChvdXRfZm9ybWF0KSB7CisJCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18yMDoKKwkJCSpkZWNvZGVfZm10ID0gMHhmOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjMyXzIwOgorCQkJKmRlY29kZV9mbXQgPSAweDY7CisJCQkqcGxhaW5fZm10ID0gMHgyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfRFBDTV8xMF82XzEwOgotCQkqcGF0aF9mbXQgID0gNzsKKwkJKmRlY29kZV9mbXQgID0gMHg3OworCQkqcGxhaW5fZm10ID0gMHgxOwogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfRFBDTV8xMF84XzEwOgotCQkqcGF0aF9mbXQgID0gODsKKwkJKmRlY29kZV9mbXQgID0gMHg4OworCQkqcGxhaW5fZm10ID0gMHgxOwogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfRFBDTV8xMl82XzEyOgotCQkqcGF0aF9mbXQgID0gOTsKKwkJKmRlY29kZV9mbXQgID0gMHg5OworCQkqcGxhaW5fZm10ID0gMHgxOwogCQlicmVhazsKIAljYXNlIENBTV9GT1JNQVRfRFBDTV8xMl84XzEyOgotCQkqcGF0aF9mbXQgID0gMHhBOworCQkqZGVjb2RlX2ZtdCAgPSAweEE7CisJCSpwbGFpbl9mbXQgPSAweDE7CiAJCWJyZWFrOwogCWNhc2UgQ0FNX0ZPUk1BVF9EUENNXzE0XzhfMTQ6Ci0JCSpwYXRoX2ZtdCAgPSAweEI7CisJCSpkZWNvZGVfZm10ICA9IDB4QjsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKIAkJYnJlYWs7CiAJY2FzZSBDQU1fRk9STUFUX0RQQ01fMTRfMTBfMTQ6Ci0JCSpwYXRoX2ZtdCAgPSAweEM7CisJCSpkZWNvZGVfZm10ICA9IDB4QzsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCB1biBzdXBwb3J0ZWQgZm9ybWF0IiwKLQkJCWlucHV0X2ZtdCk7CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9JU1AsICJVbnN1cHBvcnRlZCBmb3JtYXQgcGFpciBpbiAlZCBvdXQgJWQiLAorCQkJaW5fZm9ybWF0LCBvdXRfZm9ybWF0KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1faWZlX2NzaWRfZ2V0X2Zvcm1hdF9pcHAoCisJdWludDMyX3QgaW5fZm9ybWF0LAorCXVpbnQzMl90ICpkZWNvZGVfZm10LCB1aW50MzJfdCAqcGxhaW5fZm10KQoreworCWludCByYyA9IDA7CisKKwlDQU1fREJHKENBTV9JU1AsICJpbnB1dCBmb3JtYXQ6JWQiLAorCQkgaW5fZm9ybWF0KTsKKworCXN3aXRjaCAoaW5fZm9ybWF0KSB7CisJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzY6CisJCSpkZWNvZGVfZm10ICA9IDA7CisJCSpwbGFpbl9mbXQgPSAwOworCQlicmVhazsKKwljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfODoKKwkJKmRlY29kZV9mbXQgID0gMHgxOworCQkqcGxhaW5fZm10ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzEwOgorCQkqZGVjb2RlX2ZtdCAgPSAweDI7CisJCSpwbGFpbl9mbXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xMjoKKwkJKmRlY29kZV9mbXQgID0gMHgzOworCQkqcGxhaW5fZm10ID0gMHgxOworCQlicmVhazsKKwljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTQ6CisJCSpkZWNvZGVfZm10ICA9IDB4NDsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJYnJlYWs7CisJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzE2OgorCQkqZGVjb2RlX2ZtdCAgPSAweDU7CisJCSpwbGFpbl9mbXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18yMDoKKwkJKmRlY29kZV9mbXQgID0gMHg2OworCQkqcGxhaW5fZm10ID0gMHgyOworCQlicmVhazsKKwljYXNlIENBTV9GT1JNQVRfRFBDTV8xMF82XzEwOgorCQkqZGVjb2RlX2ZtdCAgPSAweDc7CisJCSpwbGFpbl9mbXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgQ0FNX0ZPUk1BVF9EUENNXzEwXzhfMTA6CisJCSpkZWNvZGVfZm10ICA9IDB4ODsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJYnJlYWs7CisJY2FzZSBDQU1fRk9STUFUX0RQQ01fMTJfNl8xMjoKKwkJKmRlY29kZV9mbXQgID0gMHg5OworCQkqcGxhaW5fZm10ID0gMHgxOworCQlicmVhazsKKwljYXNlIENBTV9GT1JNQVRfRFBDTV8xMl84XzEyOgorCQkqZGVjb2RlX2ZtdCAgPSAweEE7CisJCSpwbGFpbl9mbXQgPSAweDE7CisJCWJyZWFrOworCWNhc2UgQ0FNX0ZPUk1BVF9EUENNXzE0XzhfMTQ6CisJCSpkZWNvZGVfZm10ICA9IDB4QjsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJYnJlYWs7CisJY2FzZSBDQU1fRk9STUFUX0RQQ01fMTRfMTBfMTQ6CisJCSpkZWNvZGVfZm10ICA9IDB4QzsKKwkJKnBsYWluX2ZtdCA9IDB4MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0FNX0VSUihDQU1fSVNQLCAiVW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKKwkJCWluX2Zvcm1hdCk7CiAJCXJjID0gLUVJTlZBTDsKIAl9CiAKKwlDQU1fREJHKENBTV9JU1AsICJkZWNvZGVfZm10OiVkIHBsYWluX2ZtdDolZCIsCisJCSAqZGVjb2RlX2ZtdCwgKnBsYWluX2ZtdCk7CisKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgY2FtX2lmZV9jc2lkX2dldF9yZGlfZm9ybWF0KHVpbnQzMl90IGlucHV0X2ZtdCwKLQl1aW50MzJfdCBvdXRwdXRfZm10LCB1aW50MzJfdCAqcGF0aF9mbXQsIHVpbnQzMl90ICpwbGFpbl9mbXQpCi17Ci0JaW50IHJjID0gMDsKLQotCUNBTV9EQkcoQ0FNX0lTUCwgImlucHV0IGZvcm1hdDolZCBvdXRwdXQgZm9ybWF0OiVkIiwKLQkJIGlucHV0X2ZtdCwgb3V0cHV0X2ZtdCk7Ci0KLQlzd2l0Y2ggKG91dHB1dF9mbXQpIHsKLQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfNjoKLQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfODoKLQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTA6Ci0JY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzEyOgotCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xNDoKLQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTY6Ci0JY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzIwOgotCWNhc2UgQ0FNX0ZPUk1BVF9EUENNXzEwXzZfMTA6Ci0JY2FzZSBDQU1fRk9STUFUX0RQQ01fMTBfOF8xMDoKLQljYXNlIENBTV9GT1JNQVRfRFBDTV8xMl82XzEyOgotCWNhc2UgQ0FNX0ZPUk1BVF9EUENNXzEyXzhfMTI6Ci0JY2FzZSBDQU1fRk9STUFUX0RQQ01fMTRfOF8xNDoKLQljYXNlIENBTV9GT1JNQVRfRFBDTV8xNF8xMF8xNDoKLQkJKnBhdGhfZm10ICA9IDB4RjsKLQkJKnBsYWluX2ZtdCA9IDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBDQU1fRk9STUFUX1BMQUlOODoKLQkJcmMgPSBjYW1faWZlX2NzaWRfZ2V0X2Zvcm1hdChpbnB1dF9mbXQsIHBhdGhfZm10KTsKLQkJaWYgKHJjKQotCQkJZ290byBlcnJvcjsKLQotCQkqcGxhaW5fZm10ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfODoKLQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xMDoKLQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xMjoKLQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xNDoKLQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xNjoKLQkJcmMgPSBjYW1faWZlX2NzaWRfZ2V0X2Zvcm1hdChpbnB1dF9mbXQsIHBhdGhfZm10KTsKLQkJaWYgKHJjKQotCQkJZ290byBlcnJvcjsKLQotCQkqcGxhaW5fZm10ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMzJfMjA6Ci0JCXJjID0gY2FtX2lmZV9jc2lkX2dldF9mb3JtYXQoaW5wdXRfZm10LCBwYXRoX2ZtdCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyb3I7Ci0KLQkJKnBsYWluX2ZtdCA9IDI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCSpwYXRoX2ZtdCAgPSAweEY7Ci0JCSpwbGFpbl9mbXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlDQU1fREJHKENBTV9JU1AsICJwYXRoIGZvcm1hdCB2YWx1ZTolZCBwbGFpbiBmb3JtYXQgdmFsdWU6JWQiLAotCQkgKnBhdGhfZm10LCAqcGxhaW5fZm10KTsKLQotCXJldHVybiAwOwotZXJyb3I6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLQogc3RhdGljIGludCBjYW1faWZlX2NzaWRfY2lkX2dldChzdHJ1Y3QgY2FtX2lmZV9jc2lkX2h3ICpjc2lkX2h3LAogCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgKipyZXMsIGludDMyX3QgdmMsIHVpbnQzMl90IGR0LAogCXVpbnQzMl90IHJlc190eXBlKQpAQCAtNDY2LDcgKzU2Miw3IEBACiAJc3RydWN0IGNhbV9pZmVfY3NpZF9jaWRfZGF0YSAgICAgICAqY2lkX2RhdGE7CiAKIAlDQU1fREJHKENBTV9JU1AsCi0JCSJDU0lEOiVkIHJlc19zZWw6JWQgTGFuZSB0eXBlOiVkIGxhbmVfbnVtOiVkIGR0OiVkIHZjOiVkIiwKKwkJIkNTSUQ6JWQgcmVzX3NlbDoweCV4IExhbmUgdHlwZTolZCBsYW5lX251bTolZCBkdDolZCB2YzolZCIsCiAJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwKIAkJY2lkX3Jlc2Vydi0+aW5fcG9ydC0+cmVzX3R5cGUsCiAJCWNpZF9yZXNlcnYtPmluX3BvcnQtPmxhbmVfdHlwZSwKQEAgLTU0OSw3ICs2NDUsNyBAQAogCQkJCWdvdG8gZW5kOwogCQkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChjc2lkX2h3LT50cGdfY2ZnLmRlY29kZV9mbXQgIT0KKwkJCWlmIChjc2lkX2h3LT50cGdfY2ZnLmluX2Zvcm1hdCAhPQogCQkJCWNpZF9yZXNlcnYtPmluX3BvcnQtPmZvcm1hdCAgICAgfHwKIAkJCQljc2lkX2h3LT50cGdfY2ZnLndpZHRoICE9CiAJCQkJY2lkX3Jlc2Vydi0+aW5fcG9ydC0+bGVmdF93aWR0aCB8fApAQCAtNTg1LDEzICs2ODEsMjYgQEAKIAkJCQlyYyA9IC1FSU5WQUw7CiAJCQkJZ290byBlbmQ7CiAJCQl9Ci0JCQljc2lkX2h3LT50cGdfY2ZnLmRlY29kZV9mbXQgPQorCQkJY3NpZF9ody0+dHBnX2NmZy5pbl9mb3JtYXQgPQogCQkJCWNpZF9yZXNlcnYtPmluX3BvcnQtPmZvcm1hdDsKLQkJCWNzaWRfaHctPnRwZ19jZmcud2lkdGggPQotCQkJCWNpZF9yZXNlcnYtPmluX3BvcnQtPmxlZnRfd2lkdGg7CisJCQljc2lkX2h3LT50cGdfY2ZnLnVzYWdlX3R5cGUgPQorCQkJCWNpZF9yZXNlcnYtPmluX3BvcnQtPnVzYWdlX3R5cGU7CisJCQlpZiAoY2lkX3Jlc2Vydi0+aW5fcG9ydC0+dXNhZ2VfdHlwZSkKKwkJCQljc2lkX2h3LT50cGdfY2ZnLndpZHRoID0KKwkJCQkJKGNpZF9yZXNlcnYtPmluX3BvcnQtPnJpZ2h0X3N0b3AgKyAxKTsKKwkJCWVsc2UKKwkJCQljc2lkX2h3LT50cGdfY2ZnLndpZHRoID0KKwkJCQkJY2lkX3Jlc2Vydi0+aW5fcG9ydC0+bGVmdF93aWR0aDsKKwogCQkJY3NpZF9ody0+dHBnX2NmZy5oZWlnaHQgPSBjaWRfcmVzZXJ2LT5pbl9wb3J0LT5oZWlnaHQ7CiAJCQljc2lkX2h3LT50cGdfY2ZnLnRlc3RfcGF0dGVybiA9CiAJCQkJY2lkX3Jlc2Vydi0+aW5fcG9ydC0+dGVzdF9wYXR0ZXJuOworCisJCQlDQU1fREJHKENBTV9JU1AsICJDU0lEOiVkIFRQRyB3aWR0aDolZCBoZWlnaHQ6JWQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwKKwkJCQljc2lkX2h3LT50cGdfY2ZnLndpZHRoLAorCQkJCWNzaWRfaHctPnRwZ19jZmcuaGVpZ2h0KTsKKwogCQkJY2lkX2RhdGEtPnRwZ19zZXQgPSAxOwogCQl9IGVsc2UgewogCQkJY3NpZF9ody0+Y3NpMl9yeF9jZmcucGh5X3NlbCA9CkBAIC03MTIsMjQgKzgyMSwxNCBAQAogCXJlcy0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9SRVNFUlZFRDsKIAlwYXRoX2RhdGEgPSAoc3RydWN0IGNhbV9pZmVfY3NpZF9wYXRoX2NmZyAgICopcmVzLT5yZXNfcHJpdjsKIAotCS8qIHN0b3JlIHRoZSBvdXRwdXQgZm9ybWF0IGZvciBSREkgKi8KLQlzd2l0Y2ggKHJlc2VydmUtPnJlc19pZCkgewotCWNhc2UgQ0FNX0lGRV9QSVhfUEFUSF9SRVNfUkRJXzA6Ci0JY2FzZSBDQU1fSUZFX1BJWF9QQVRIX1JFU19SRElfMToKLQljYXNlIENBTV9JRkVfUElYX1BBVEhfUkVTX1JESV8yOgotCWNhc2UgQ0FNX0lGRV9QSVhfUEFUSF9SRVNfUkRJXzM6Ci0JCXBhdGhfZGF0YS0+b3V0cHV0X2ZtdCA9IHJlc2VydmUtPm91dF9wb3J0LT5mb3JtYXQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQogCXBhdGhfZGF0YS0+Y2lkID0gcmVzZXJ2ZS0+Y2lkOwotCXBhdGhfZGF0YS0+ZGVjb2RlX2ZtdCA9IHJlc2VydmUtPmluX3BvcnQtPmZvcm1hdDsKKwlwYXRoX2RhdGEtPmluX2Zvcm1hdCA9IHJlc2VydmUtPmluX3BvcnQtPmZvcm1hdDsKKwlwYXRoX2RhdGEtPm91dF9mb3JtYXQgPSByZXNlcnZlLT5vdXRfcG9ydC0+Zm9ybWF0OwogCXBhdGhfZGF0YS0+bWFzdGVyX2lkeCA9IHJlc2VydmUtPm1hc3Rlcl9pZHg7CiAJcGF0aF9kYXRhLT5zeW5jX21vZGUgPSByZXNlcnZlLT5zeW5jX21vZGU7CiAJcGF0aF9kYXRhLT5oZWlnaHQgID0gcmVzZXJ2ZS0+aW5fcG9ydC0+aGVpZ2h0OwogCXBhdGhfZGF0YS0+c3RhcnRfbGluZSA9IHJlc2VydmUtPmluX3BvcnQtPmxpbmVfc3RhcnQ7CisJcGF0aF9kYXRhLT5lbmRfbGluZSA9IHJlc2VydmUtPmluX3BvcnQtPmxpbmVfc3RvcDsKIAlpZiAocmVzZXJ2ZS0+aW5fcG9ydC0+cmVzX3R5cGUgPT0gQ0FNX0lTUF9JRkVfSU5fUkVTX1RQRykgewogCQlwYXRoX2RhdGEtPmR0ID0gQ0FNX0lGRV9DU0lEX1RQR19EVF9WQUw7CiAJCXBhdGhfZGF0YS0+dmMgPSBDQU1fSUZFX0NTSURfVFBHX1ZDX1ZBTDsKQEAgLTc0MSwxNCArODQwLDMzIEBACiAJaWYgKHJlc2VydmUtPnN5bmNfbW9kZSA9PSBDQU1fSVNQX0hXX1NZTkNfTUFTVEVSKSB7CiAJCXBhdGhfZGF0YS0+Y3JvcF9lbmFibGUgPSAxOwogCQlwYXRoX2RhdGEtPnN0YXJ0X3BpeGVsID0gcmVzZXJ2ZS0+aW5fcG9ydC0+bGVmdF9zdGFydDsKKwkJcGF0aF9kYXRhLT5lbmRfcGl4ZWwgPSByZXNlcnZlLT5pbl9wb3J0LT5sZWZ0X3N0b3A7CiAJCXBhdGhfZGF0YS0+d2lkdGggID0gcmVzZXJ2ZS0+aW5fcG9ydC0+bGVmdF93aWR0aDsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRDolZG1hc3RlcjpzdGFydHBpeGVsIDB4JXggZW5kcGl4ZWw6MHgleCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsIHBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwsCisJCQlwYXRoX2RhdGEtPmVuZF9waXhlbCk7CisJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQ6JWRtYXN0ZXI6bGluZSBzdGFydDoweCV4IGxpbmUgZW5kOjB4JXgiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4LCBwYXRoX2RhdGEtPnN0YXJ0X2xpbmUsCisJCQlwYXRoX2RhdGEtPmVuZF9saW5lKTsKIAl9IGVsc2UgaWYgKHJlc2VydmUtPnN5bmNfbW9kZSA9PSBDQU1fSVNQX0hXX1NZTkNfU0xBVkUpIHsKIAkJcGF0aF9kYXRhLT5jcm9wX2VuYWJsZSA9IDE7CiAJCXBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwgPSByZXNlcnZlLT5pbl9wb3J0LT5yaWdodF9zdGFydDsKKwkJcGF0aF9kYXRhLT5lbmRfcGl4ZWwgPSByZXNlcnZlLT5pbl9wb3J0LT5yaWdodF9zdG9wOwogCQlwYXRoX2RhdGEtPndpZHRoICA9IHJlc2VydmUtPmluX3BvcnQtPnJpZ2h0X3dpZHRoOwotCX0gZWxzZQorCQlDQU1fREJHKENBTV9JU1AsICJDU0lEOiVkIHNsYXZlOnN0YXJ0OjB4JXggZW5kOjB4JXggd2lkdGggMHgleCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsIHBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwsCisJCQlwYXRoX2RhdGEtPmVuZF9waXhlbCwgcGF0aF9kYXRhLT53aWR0aCk7CisJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQ6JWRtYXN0ZXI6bGluZSBzdGFydDoweCV4IGxpbmUgZW5kOjB4JXgiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4LCBwYXRoX2RhdGEtPnN0YXJ0X2xpbmUsCisJCQlwYXRoX2RhdGEtPmVuZF9saW5lKTsKKwl9IGVsc2UgewogCQlwYXRoX2RhdGEtPmNyb3BfZW5hYmxlID0gMDsKKwkJcGF0aF9kYXRhLT53aWR0aCAgPSByZXNlcnZlLT5pbl9wb3J0LT5sZWZ0X3dpZHRoOworCQlwYXRoX2RhdGEtPnN0YXJ0X3BpeGVsID0gcmVzZXJ2ZS0+aW5fcG9ydC0+bGVmdF9zdGFydDsKKwl9CiAKKwlDQU1fREJHKENBTV9JU1AsICJSZXMgJWQgd2lkdGggJWQgaGVpZ2h0ICVkIiwgcmVzZXJ2ZS0+cmVzX2lkLAorCQlwYXRoX2RhdGEtPndpZHRoLCBwYXRoX2RhdGEtPmhlaWdodCk7CiAJcmVzZXJ2ZS0+bm9kZV9yZXMgPSByZXM7CiAKIGVuZDoKQEAgLTkwNCw2ICsxMDIyLDcgQEAKIHN0YXRpYyBpbnQgY2FtX2lmZV9jc2lkX3RwZ19zdGFydChzdHJ1Y3QgY2FtX2lmZV9jc2lkX2h3ICAgKmNzaWRfaHcsCiAJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAgICAgICAqcmVzKQogeworCWludCByYyA9IDA7CiAJdWludDMyX3QgIHZhbCA9IDA7CiAJc3RydWN0IGNhbV9od19zb2NfaW5mbyAgICAqc29jX2luZm87CiAKQEAgLTk0OSw2ICsxMDY4LDE1IEBACiAJCQl9CiAJCX0KIAorCQkvKiBFbmFibGUgdGhlIElGRSBmb3JjZSBjbG9jayBvbiBmb3IgZHVhbCBpc3AgY2FzZSAqLworCQlpZiAoY3NpZF9ody0+dHBnX2NmZy51c2FnZV90eXBlKSB7CisJCQlyYyA9IGNhbV9pZmVfY3NpZF9lbmFibGVfaWZlX2ZvcmNlX2Nsb2NrX29uKHNvY19pbmZvLAorCQkJCWNzaWRfaHctPmNzaWRfaW5mby0+Y3NpZF9yZWctPnRwZ19yZWctPgorCQkJCXRwZ19jcGFzX2lmZV9yZWdfb2Zmc2V0KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwogCQlDQU1fREJHKENBTV9JU1AsICI9PT09PT09PT09PT0gVFBHIGNvbnRyb2wgPT09PT09PT09PT09Iik7CiAJCXZhbCA9ICg0IDw8IDIwKTsKIAkJdmFsIHw9ICgweDgwIDw8IDgpOwpAQCAtOTY4LDYgKzEwOTYsNyBAQAogc3RhdGljIGludCBjYW1faWZlX2NzaWRfdHBnX3N0b3Aoc3RydWN0IGNhbV9pZmVfY3NpZF9odyAgICpjc2lkX2h3LAogCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgICAgKnJlcykKIHsKKwlpbnQgcmMgPSAwOwogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICAgKnNvY19pbmZvOwogCiAJaWYgKGNzaWRfaHctPnRwZ19zdGFydF9jbnQpCkBAIC05ODMsNiArMTExMiwxMiBAQAogCQlDQU1fREJHKENBTV9JU1AsICJDU0lEOiVkIHN0b3AgQ1NJRCBUUEciLAogCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKIAorCQkvKiBEaXNhYmxlIHRoZSBJRkUgZm9yY2UgY2xvY2sgb24gZm9yIGR1YWwgaXNwIGNhc2UgKi8KKwkJaWYgKGNzaWRfaHctPnRwZ19jZmcudXNhZ2VfdHlwZSkKKwkJCXJjID0gY2FtX2lmZV9jc2lkX2Rpc2FibGVfaWZlX2ZvcmNlX2Nsb2NrX29uKHNvY19pbmZvLAorCQkJCWNzaWRfaHctPmNzaWRfaW5mby0+Y3NpZF9yZWctPnRwZ19yZWctPgorCQkJCXRwZ19jcGFzX2lmZV9yZWdfb2Zmc2V0KTsKKwogCQkvKnN0b3AgdGhlIFRQRyAqLwogCQljYW1faW9fd19tYigwLCAgc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKwogCQljc2lkX2h3LT5jc2lkX2luZm8tPmNzaWRfcmVnLT50cGdfcmVnLT5jc2lkX3RwZ19jdHJsX2FkZHIpOwpAQCAtMTAxMCw4ICsxMTQ1LDggQEAKIAljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJCWNzaWRfcmVnLT50cGdfcmVnLT5jc2lkX3RwZ192Y19jZmcwX2FkZHIpOwogCi0JLyogdmVydGljYWwgYmxhbmtpbmcgY291bnQgPSAweDc0MCwgaG9yem9udGFsIGJsYW5raW5nIGNvdW50ID0gMHg3NDAqLwotCXZhbCA9ICgweDc0MCA8PCAxMikgfCAweDc0MDsKKwkvKiB2ZXJ0aWNhbCBibGFua2luZyBjb3VudCA9IDB4M0ZGLCBob3J6b250YWwgYmxhbmtpbmcgY291bnQgPSAweDc0MCovCisJdmFsID0gKDB4M0ZGIDw8IDEyKSB8IDB4NzQwOwogCWNhbV9pb193X21iKHZhbCwgc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKwogCQkJY3NpZF9yZWctPnRwZ19yZWctPmNzaWRfdHBnX3ZjX2NmZzFfYWRkcik7CiAKQEAgLTEwMjcsMTAgKzExNjIsMTAgQEAKIAkJY3NpZF9yZWctPnRwZ19yZWctPmNzaWRfdHBnX2R0X25fY2ZnXzFfYWRkcik7CiAKIAkvKgotCSAqIGRlY29kZV9mbXQgaXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHJlc291cmNlIGZvcm1hdC4KKwkgKiBpbl9mb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHJlc291cmNlIGZvcm1hdC4KIAkgKiBpdCBpcyBvbmUgbGFyZ2VyIHRoYW4gdGhlIHJlZ2lzdGVyIHNwZWMgZm9ybWF0LgogCSAqLwotCXZhbCA9ICgoY3NpZF9ody0+dHBnX2NmZy5kZWNvZGVfZm10IC0gMSkgPDwgMTYpIHwgMHg4OworCXZhbCA9ICgoY3NpZF9ody0+dHBnX2NmZy5pbl9mb3JtYXQgLSAxKSA8PCAxNikgfCAweDg7CiAJY2FtX2lvX3dfbWIodmFsLCBzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCWNzaWRfcmVnLT50cGdfcmVnLT5jc2lkX3RwZ19kdF9uX2NmZ18yX2FkZHIpOwogCkBAIC0xMTEzLDYgKzEyNDgsMjggQEAKIAkJQ1NJRF9DU0kyX1JYX0VSUk9SX0NQSFlfRU9UX1JFQ0VQVElPTiB8CiAJCUNTSURfQ1NJMl9SWF9FUlJPUl9DUEhZX1NPVF9SRUNFUFRJT04gfAogCQlDU0lEX0NTSTJfUlhfRVJST1JfQ1BIWV9QSF9DUkM7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCBiYXNlZCBvbiBjc2lkIGRlYnVnIGluZm8gc2V0ICovCisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9TT1RfSVJRKQorCQl2YWwgfD0gQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMF9TT1RfQ0FQVFVSRUQgfAorCQkJQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMV9TT1RfQ0FQVFVSRUQgfAorCQkJQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMl9TT1RfQ0FQVFVSRUQgfAorCQkJQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMM19TT1RfQ0FQVFVSRUQ7CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0VPVF9JUlEpCisJCXZhbCB8PSBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwwX0VPVF9DQVBUVVJFRCB8CisJCQlDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwxX0VPVF9DQVBUVVJFRCB8CisJCQlDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwyX0VPVF9DQVBUVVJFRCB8CisJCQlDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwzX0VPVF9DQVBUVVJFRDsKKworCWlmIChjc2lkX2h3LT5jc2lkX2RlYnVnICYgQ1NJRF9ERUJVR19FTkFCTEVfU0hPUlRfUEtUX0NBUFRVUkUpCisJCXZhbCB8PSBDU0lEX0NTSTJfUlhfSU5GT19TSE9SVF9QS1RfQ0FQVFVSRUQ7CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0xPTkdfUEtUX0NBUFRVUkUpCisJCXZhbCB8PSBDU0lEX0NTSTJfUlhfSU5GT19MT05HX1BLVF9DQVBUVVJFRDsKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0NQSFlfUEtUX0NBUFRVUkUpCisJCXZhbCB8PSBDU0lEX0NTSTJfUlhfSU5GT19DUEhZX1BLVF9IRFJfQ0FQVFVSRUQ7CisKIAljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2lkX2NzaTJfcnhfaXJxX21hc2tfYWRkcik7CiAKQEAgLTExNjAsNyArMTMxNyw3IEBACiAJc3RydWN0IGNhbV9pZmVfY3NpZF9wYXRoX2NmZyAgICAgICAgICAgKnBhdGhfZGF0YTsKIAlzdHJ1Y3QgY2FtX2lmZV9jc2lkX3JlZ19vZmZzZXQgICAgICAgICAqY3NpZF9yZWc7CiAJc3RydWN0IGNhbV9od19zb2NfaW5mbyAgICAgICAgICAgICAgICAgKnNvY19pbmZvOwotCXVpbnQzMl90IHBhdGhfZm9ybWF0ID0gMCwgdmFsID0gMDsKKwl1aW50MzJfdCBkZWNvZGVfZm9ybWF0ID0gMCwgcGxhaW5fZm9ybWF0ID0gMCwgdmFsID0gMDsKIAogCXBhdGhfZGF0YSA9IChzdHJ1Y3QgY2FtX2lmZV9jc2lkX3BhdGhfY2ZnICAqKSByZXMtPnJlc19wcml2OwogCWNzaWRfcmVnID0gY3NpZF9ody0+Y3NpZF9pbmZvLT5jc2lkX3JlZzsKQEAgLTExNzMsOCArMTMzMCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCUNBTV9EQkcoQ0FNX0lTUCwgIkVuYWJsZWQgSVBQIFBhdGguLi4uLi4uIik7Ci0JcmMgPSBjYW1faWZlX2NzaWRfZ2V0X2Zvcm1hdChwYXRoX2RhdGEtPmRlY29kZV9mbXQsICZwYXRoX2Zvcm1hdCk7CisJQ0FNX0RCRyhDQU1fSVNQLCAiQ29uZmlnIElQUCBQYXRoIik7CisJcmMgPSBjYW1faWZlX2NzaWRfZ2V0X2Zvcm1hdF9pcHAocGF0aF9kYXRhLT5pbl9mb3JtYXQsCisJCSZkZWNvZGVfZm9ybWF0LCAmcGxhaW5fZm9ybWF0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMTE4NSwxMCArMTM0MywxMCBAQAogCXZhbCA9IChwYXRoX2RhdGEtPnZjIDw8IGNzaWRfcmVnLT5jbW5fcmVnLT52Y19zaGlmdF92YWwpIHwKIAkJKHBhdGhfZGF0YS0+ZHQgPDwgY3NpZF9yZWctPmNtbl9yZWctPmR0X3NoaWZ0X3ZhbCkgfAogCQkocGF0aF9kYXRhLT5jaWQgPDwgY3NpZF9yZWctPmNtbl9yZWctPmR0X2lkX3NoaWZ0X3ZhbCkgfAotCQkocGF0aF9mb3JtYXQgPDwgY3NpZF9yZWctPmNtbl9yZWctPmZtdF9zaGlmdF92YWwpIHwKLQkJKHBhdGhfZGF0YS0+Y3JvcF9lbmFibGUgJiAxIDw8CisJCShkZWNvZGVfZm9ybWF0IDw8IGNzaWRfcmVnLT5jbW5fcmVnLT5mbXRfc2hpZnRfdmFsKSB8CisJCShwYXRoX2RhdGEtPmNyb3BfZW5hYmxlIDw8CiAJCWNzaWRfcmVnLT5jbW5fcmVnLT5jcm9wX2hfZW5fc2hpZnRfdmFsKSB8Ci0JCShwYXRoX2RhdGEtPmNyb3BfZW5hYmxlICYgMSA8PAorCQkocGF0aF9kYXRhLT5jcm9wX2VuYWJsZSA8PAogCQljc2lkX3JlZy0+Y21uX3JlZy0+Y3JvcF92X2VuX3NoaWZ0X3ZhbCkgfAogCQkoMSA8PCAxKSB8IDE7CiAJdmFsIHw9ICgxIDw8IGNzaWRfcmVnLT5pcHBfcmVnLT5waXhfc3RvcmVfZW5fc2hpZnRfdmFsKTsKQEAgLTEyMDAsMjEgKzEzNTgsMjEgQEAKIAkJY3NpZF9yZWctPmlwcF9yZWctPmNzaWRfaXBwX2NmZzFfYWRkcik7CiAKIAlpZiAocGF0aF9kYXRhLT5jcm9wX2VuYWJsZSkgewotCQl2YWwgPSAoKHBhdGhfZGF0YS0+d2lkdGggKwotCQkJcGF0aF9kYXRhLT5zdGFydF9waXhlbCkgJiAweEZGRkYgPDwKKwkJdmFsID0gKCgocGF0aF9kYXRhLT5lbmRfcGl4ZWwgJiAweEZGRkYpIDw8CiAJCQljc2lkX3JlZy0+Y21uX3JlZy0+Y3JvcF9zaGlmdCkgfAotCQkJKHBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwgJiAweEZGRkYpOwotCisJCQkocGF0aF9kYXRhLT5zdGFydF9waXhlbCAmIDB4RkZGRikpOwogCQljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJCWNzaWRfcmVnLT5pcHBfcmVnLT5jc2lkX2lwcF9oY3JvcF9hZGRyKTsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRDolZCBIb3Jpem9udGFsIGNyb3AgY29uZmlnIHZhbDogMHgleCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsIHZhbCk7CiAKLQkJdmFsID0gKChwYXRoX2RhdGEtPmhlaWdodCArCi0JCQlwYXRoX2RhdGEtPnN0YXJ0X2xpbmUpICYgMHhGRkZGIDw8CisJCXZhbCA9ICgoKHBhdGhfZGF0YS0+ZW5kX2xpbmUgJiAweEZGRkYpIDw8CiAJCQljc2lkX3JlZy0+Y21uX3JlZy0+Y3JvcF9zaGlmdCkgfAotCQkJKHBhdGhfZGF0YS0+c3RhcnRfbGluZSAmIDB4RkZGRik7Ci0KKwkJCShwYXRoX2RhdGEtPnN0YXJ0X2xpbmUgJiAweEZGRkYpKTsKIAkJY2FtX2lvX3dfbWIodmFsLCBzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCQljc2lkX3JlZy0+aXBwX3JlZy0+Y3NpZF9pcHBfdmNyb3BfYWRkcik7CisJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQ6JWQgVmVydGljYWwgQ3JvcCBjb25maWcgdmFsOiAweCV4IiwKKwkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwgdmFsKTsKIAl9CiAKIAkvKiBzZXQgZnJhbWUgZHJvcCBwYXR0ZXJuIHRvIDAgYW5kIHBlcmlvZCB0byAxICovCkBAIC0xMjU5LDYgKzE0MTcsMzQgQEAKIAljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJY3NpZF9yZWctPmlwcF9yZWctPmNzaWRfaXBwX2NmZzBfYWRkcik7CiAKKwkvKiBjb25maWd1cmUgdGhlIHJ4IHBhY2tldCBjYXB0dXJlIGJhc2VkIG9uIGNzaWQgZGVidWcgc2V0ICovCisJdmFsID0gMDsKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NIT1JUX1BLVF9DQVBUVVJFKQorCQl2YWwgPSAoKDEgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX3Nob3J0X3BrdF9lbl9zaGlmdCkgfAorCQkJKHBhdGhfZGF0YS0+dmMgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX3Nob3J0X3BrdF92Y19zaGlmdCkpOworCisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9MT05HX1BLVF9DQVBUVVJFKQorCQl2YWwgfD0gKCgxIDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9sb25nX3BrdF9lbl9zaGlmdCkgfAorCQkJKHBhdGhfZGF0YS0+ZHQgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX2xvbmdfcGt0X2R0X3NoaWZ0KSB8CisJCQkocGF0aF9kYXRhLT52YyA8PAorCQkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2kyX2NhcHR1cmVfbG9uZ19wa3RfdmNfc2hpZnQpKTsKKworCWlmIChjc2lkX2h3LT5jc2lkX2RlYnVnICYgQ1NJRF9ERUJVR19FTkFCTEVfQ1BIWV9QS1RfQ0FQVFVSRSkKKwkJdmFsIHw9ICgoMSA8PAorCQkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2kyX2NhcHR1cmVfY3BoeV9wa3RfZW5fc2hpZnQpIHwKKwkJCShwYXRoX2RhdGEtPmR0IDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9jcGh5X3BrdF9kdF9zaGlmdCkgfAorCQkJKHBhdGhfZGF0YS0+dmMgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX2NwaHlfcGt0X3ZjX3NoaWZ0KSk7CisKKwljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKKwkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2lkX2NzaTJfcnhfY2FwdHVyZV9jdHJsX2FkZHIpOworCUNBTV9EQkcoQ0FNX0lTUCwgInJ4IGNhcHR1cmUgY29udHJvbCB2YWx1ZSAweCV4IiwgdmFsKTsKKwogCXJlcy0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9JTklUX0hXOwogCiAJcmV0dXJuIHJjOwpAQCAtMTMzMCw5ICsxNTE2LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JQ0FNX0RCRyhDQU1fSVNQLCAiZW5hYmxlIElQUCBwYXRoLi4uLi4uLiIpOworCUNBTV9EQkcoQ0FNX0lTUCwgIkVuYWJsZSBJUFAgcGF0aCIpOwogCi0JLypSZXN1bWUgYXQgZnJhbWUgYm91bmRhcnkgKi8KKwkvKiBSZXN1bWUgYXQgZnJhbWUgYm91bmRhcnkgKi8KIAlpZiAocGF0aF9kYXRhLT5zeW5jX21vZGUgPT0gQ0FNX0lTUF9IV19TWU5DX01BU1RFUikgewogCQl2YWwgPSBjYW1faW9fcl9tYihzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCQljc2lkX3JlZy0+aXBwX3JlZy0+Y3NpZF9pcHBfY3RybF9hZGRyKTsKQEAgLTEzNDgsNiArMTUzNCwxMiBAQAogCiAJLyogRW5hYmxlIHRoZSByZXF1aXJlZCBpcHAgaW50ZXJydXB0cyAqLwogCXZhbCA9IENTSURfUEFUSF9JTkZPX1JTVF9ET05FIHwgQ1NJRF9QQVRIX0VSUk9SX0ZJRk9fT1ZFUkZMT1c7CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NPRl9JUlEpCisJCXZhbCB8PSBDU0lEX1BBVEhfSU5GT19JTlBVVF9TT0Y7CisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9FT0ZfSVJRKQorCQl2YWwgfD0gQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GOworCiAJY2FtX2lvX3dfbWIodmFsLCBzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCWNzaWRfcmVnLT5pcHBfcmVnLT5jc2lkX2lwcF9pcnFfbWFza19hZGRyKTsKIApAQCAtMTQzMiw3ICsxNjI0LDcgQEAKIAkJCWNzaWRfcmVnLT5pcHBfcmVnLT5jc2lkX2lwcF9pcnFfbWFza19hZGRyKTsKIAl9IGVsc2UgewogCQl2YWwgJj0gfihDU0lEX1BBVEhfSU5GT19SU1RfRE9ORSB8Ci0JCQkJQ1NJRF9QQVRIX0VSUk9SX0ZJRk9fT1ZFUkZMT1cpOworCQkJQ1NJRF9QQVRIX0VSUk9SX0ZJRk9fT1ZFUkZMT1cpOwogCQljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJCWNzaWRfcmVnLT5pcHBfcmVnLT5jc2lkX2lwcF9pcnFfbWFza19hZGRyKTsKIAl9CkBAIC0xNDYyLDggKzE2NTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYyA9IGNhbV9pZmVfY3NpZF9nZXRfcmRpX2Zvcm1hdChwYXRoX2RhdGEtPmRlY29kZV9mbXQsCi0JCXBhdGhfZGF0YS0+b3V0cHV0X2ZtdCwgJnBhdGhfZm9ybWF0LCAmcGxhaW5fZm10KTsKKwlyYyA9IGNhbV9pZmVfY3NpZF9nZXRfZm9ybWF0X3JkaShwYXRoX2RhdGEtPmluX2Zvcm1hdCwKKwkJcGF0aF9kYXRhLT5vdXRfZm9ybWF0LCAmcGF0aF9mb3JtYXQsICZwbGFpbl9mbXQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC0xNDc2LDkgKzE2NjgsOSBAQAogCQkocGF0aF9kYXRhLT5jaWQgPDwgY3NpZF9yZWctPmNtbl9yZWctPmR0X2lkX3NoaWZ0X3ZhbCkgfAogCQkocGF0aF9mb3JtYXQgPDwgY3NpZF9yZWctPmNtbl9yZWctPmZtdF9zaGlmdF92YWwpIHwKIAkJKHBsYWluX2ZtdCA8PCBjc2lkX3JlZy0+Y21uX3JlZy0+cGxhaW5fZm10X3NoaXRfdmFsKSB8Ci0JCShwYXRoX2RhdGEtPmNyb3BfZW5hYmxlICYgMSA8PAorCQkocGF0aF9kYXRhLT5jcm9wX2VuYWJsZSAgPDwKIAkJCWNzaWRfcmVnLT5jbW5fcmVnLT5jcm9wX2hfZW5fc2hpZnRfdmFsKSB8Ci0JCShwYXRoX2RhdGEtPmNyb3BfZW5hYmxlICYgMSA8PAorCQkocGF0aF9kYXRhLT5jcm9wX2VuYWJsZSAgPDwKIAkJY3NpZF9yZWctPmNtbl9yZWctPmNyb3Bfdl9lbl9zaGlmdF92YWwpIHwKIAkJKDEgPDwgMikgfCAzOwogCkBAIC0xNDkwLDIxICsxNjgyLDIzIEBACiAJCQljc2lkX3JlZy0+cmRpX3JlZ1tpZF0tPmNzaWRfcmRpX2NmZzFfYWRkcik7CiAKIAlpZiAocGF0aF9kYXRhLT5jcm9wX2VuYWJsZSkgewotCQl2YWwgPSAoKHBhdGhfZGF0YS0+d2lkdGggKwotCQkJcGF0aF9kYXRhLT5zdGFydF9waXhlbCkgJiAweEZGRkYgPDwKKwkJdmFsID0gKCgocGF0aF9kYXRhLT5lbmRfcGl4ZWwgJiAweEZGRkYpIDw8CiAJCQljc2lkX3JlZy0+Y21uX3JlZy0+Y3JvcF9zaGlmdCkgfAotCQkJKHBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwgJiAweEZGRkYpOworCQkJKHBhdGhfZGF0YS0+c3RhcnRfcGl4ZWwgJiAweEZGRkYpKTsKIAogCQljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJCWNzaWRfcmVnLT5yZGlfcmVnW2lkXS0+Y3NpZF9yZGlfcnBwX2hjcm9wX2FkZHIpOworCQlDQU1fREJHKENBTV9JU1AsICJDU0lEOiVkIEhvcml6b250YWwgY3JvcCBjb25maWcgdmFsOiAweCV4IiwKKwkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwgdmFsKTsKIAotCQl2YWwgPSAoKHBhdGhfZGF0YS0+aGVpZ2h0ICsKLQkJCXBhdGhfZGF0YS0+c3RhcnRfbGluZSkgJiAweEZGRkYgPDwKKwkJdmFsID0gKCgocGF0aF9kYXRhLT5lbmRfbGluZSAmIDB4RkZGRikgPDwKIAkJCWNzaWRfcmVnLT5jbW5fcmVnLT5jcm9wX3NoaWZ0KSB8Ci0JCQkocGF0aF9kYXRhLT5zdGFydF9saW5lICYgMHhGRkZGKTsKKwkJCShwYXRoX2RhdGEtPnN0YXJ0X2xpbmUgJiAweEZGRkYpKTsKIAogCQljYW1faW9fd19tYih2YWwsIHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlICsKIAkJCWNzaWRfcmVnLT5yZGlfcmVnW2lkXS0+Y3NpZF9yZGlfcnBwX3Zjcm9wX2FkZHIpOworCQlDQU1fREJHKENBTV9JU1AsICJDU0lEOiVkIFZlcnRpY2FsIENyb3AgY29uZmlnIHZhbDogMHgleCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsIHZhbCk7CiAJfQogCS8qIHNldCBmcmFtZSBkcm9wIHBhdHRlcm4gdG8gMCBhbmQgcGVyaW9kIHRvIDEgKi8KIAljYW1faW9fd19tYigxLCBzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCkBAIC0xNTM2LDkgKzE3MzAsMzUgQEAKIAl2YWwgPSBjYW1faW9fcl9tYihzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCWNzaWRfcmVnLT5yZGlfcmVnW2lkXS0+Y3NpZF9yZGlfY2ZnMF9hZGRyKTsKIAl2YWwgfD0gKDEgPDwgY3NpZF9yZWctPmNtbl9yZWctPnBhdGhfZW5fc2hpZnRfdmFsKTsKKwogCWNhbV9pb193X21iKHZhbCwgc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKwogCQljc2lkX3JlZy0+cmRpX3JlZ1tpZF0tPmNzaWRfcmRpX2NmZzBfYWRkcik7CiAKKwkvKiBjb25maWd1cmUgdGhlIHJ4IHBhY2tldCBjYXB0dXJlIGJhc2VkIG9uIGNzaWQgZGVidWcgc2V0ICovCisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9TSE9SVF9QS1RfQ0FQVFVSRSkKKwkJdmFsID0gKCgxIDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9zaG9ydF9wa3RfZW5fc2hpZnQpIHwKKwkJCShwYXRoX2RhdGEtPnZjIDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9zaG9ydF9wa3RfdmNfc2hpZnQpKTsKKworCWlmIChjc2lkX2h3LT5jc2lkX2RlYnVnICYgQ1NJRF9ERUJVR19FTkFCTEVfTE9OR19QS1RfQ0FQVFVSRSkKKwkJdmFsIHw9ICgoMSA8PAorCQkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2kyX2NhcHR1cmVfbG9uZ19wa3RfZW5fc2hpZnQpIHwKKwkJCShwYXRoX2RhdGEtPmR0IDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9sb25nX3BrdF9kdF9zaGlmdCkgfAorCQkJKHBhdGhfZGF0YS0+dmMgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX2xvbmdfcGt0X3ZjX3NoaWZ0KSk7CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0NQSFlfUEtUX0NBUFRVUkUpCisJCXZhbCB8PSAoKDEgPDwKKwkJCWNzaWRfcmVnLT5jc2kyX3JlZy0+Y3NpMl9jYXB0dXJlX2NwaHlfcGt0X2VuX3NoaWZ0KSB8CisJCQkocGF0aF9kYXRhLT5kdCA8PAorCQkJY3NpZF9yZWctPmNzaTJfcmVnLT5jc2kyX2NhcHR1cmVfY3BoeV9wa3RfZHRfc2hpZnQpIHwKKwkJCShwYXRoX2RhdGEtPnZjIDw8CisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaTJfY2FwdHVyZV9jcGh5X3BrdF92Y19zaGlmdCkpOworCWNhbV9pb193X21iKHZhbCwgc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKworCQljc2lkX3JlZy0+Y3NpMl9yZWctPmNzaWRfY3NpMl9yeF9jYXB0dXJlX2N0cmxfYWRkcik7CisKIAlyZXMtPnJlc19zdGF0ZSA9IENBTV9JU1BfUkVTT1VSQ0VfU1RBVEVfSU5JVF9IVzsKIAogCXJldHVybiByYzsKQEAgLTE2MDYsNiArMTgyNiwxMiBAQAogCiAJLyogRW5hYmxlIHRoZSByZXF1aXJlZCBSREkgaW50ZXJydXB0cyAqLwogCXZhbCA9IENTSURfUEFUSF9JTkZPX1JTVF9ET05FIHwgQ1NJRF9QQVRIX0VSUk9SX0ZJRk9fT1ZFUkZMT1c7CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NPRl9JUlEpCisJCXZhbCB8PSBDU0lEX1BBVEhfSU5GT19JTlBVVF9TT0Y7CisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9FT0ZfSVJRKQorCQl2YWwgfD0gQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GOworCiAJY2FtX2lvX3dfbWIodmFsLCBzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCiAJCWNzaWRfcmVnLT5yZGlfcmVnW2lkXS0+Y3NpZF9yZGlfaXJxX21hc2tfYWRkcik7CiAKQEAgLTE3MzcsNiArMTk2MywyMCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgY2FtX2lmZV9jc2lkX3NldF9jc2lkX2RlYnVnKHN0cnVjdCBjYW1faWZlX2NzaWRfaHcgICAqY3NpZF9odywKKwl2b2lkICpjbWRfYXJncykKK3sKKwl1aW50MzJfdCAgKmNzaWRfZGVidWc7CisKKwljc2lkX2RlYnVnID0gKHVpbnQzMl90ICAqKSBjbWRfYXJnczsKKwljc2lkX2h3LT5jc2lkX2RlYnVnID0gKmNzaWRfZGVidWc7CisJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRDolZCBzZXQgY3NpZCBkZWJ1ZyB2YWx1ZTolZCIsCisJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwgY3NpZF9ody0+Y3NpZF9kZWJ1Zyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjYW1faWZlX2NzaWRfcmVzX3dhaXRfZm9yX2hhbHQoCiAJc3RydWN0IGNhbV9pZmVfY3NpZF9odyAgICAgICAgICAqY3NpZF9odywKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICpyZXMpCkBAIC0yMjgwLDYgKzI1MjAsOSBAQAogCWNhc2UgQ0FNX0lGRV9DU0lEX0NNRF9HRVRfVElNRV9TVEFNUDoKIAkJcmMgPSBjYW1faWZlX2NzaWRfZ2V0X3RpbWVfc3RhbXAoY3NpZF9odywgY21kX2FyZ3MpOwogCQlicmVhazsKKwljYXNlIENBTV9JRkVfQ1NJRF9TRVRfQ1NJRF9ERUJVRzoKKwkJcmMgPSBjYW1faWZlX2NzaWRfc2V0X2NzaWRfZGVidWcoY3NpZF9odywgY21kX2FyZ3MpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIHVuIHN1cHBvcnRlZCBjbWQ6JWQiLAogCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4LCBjbWRfdHlwZSk7CkBAIC0yMjk4LDYgKzI1NDEsNyBAQAogCXN0cnVjdCBjYW1faWZlX2NzaWRfcmVnX29mZnNldCAgKmNzaWRfcmVnOwogCXVpbnQzMl90IGksIGlycV9zdGF0dXNfdG9wLCBpcnFfc3RhdHVzX3J4LCBpcnFfc3RhdHVzX2lwcCA9IDAsCiAJCWlycV9zdGF0dXNfcmRpWzRdOworCXVpbnQzMl90IHZhbDsKIAogCWNzaWRfaHcgPSAoc3RydWN0IGNhbV9pZmVfY3NpZF9odyAqKWRhdGE7CiAKQEAgLTIzOTEsNiArMjYzNSw5MyBAQAogCQkJIGNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CiAJfQogCisJaWYgKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9FT1RfSVJRKSB7CisJCWlmIChpcnFfc3RhdHVzX3J4ICYgQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMF9FT1RfQ0FQVFVSRUQpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNTSUQ6JWQgUEhZX0RMMF9FT1RfQ0FQVFVSRUQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CisJCX0KKwkJaWYgKGlycV9zdGF0dXNfcnggJiBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwxX0VPVF9DQVBUVVJFRCkgeworCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBQSFlfREwxX0VPVF9DQVBUVVJFRCIsCisJCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJfQorCQlpZiAoaXJxX3N0YXR1c19yeCAmIENTSURfQ1NJMl9SWF9JTkZPX1BIWV9ETDJfRU9UX0NBUFRVUkVEKSB7CisJCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIFBIWV9ETDJfRU9UX0NBUFRVUkVEIiwKKwkJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgpOworCQl9CisJCWlmIChpcnFfc3RhdHVzX3J4ICYgQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMM19FT1RfQ0FQVFVSRUQpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNTSUQ6JWQgUEhZX0RMM19FT1RfQ0FQVFVSRUQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CisJCX0KKwl9CisKKwlpZiAoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NPVF9JUlEpIHsKKwkJaWYgKGlycV9zdGF0dXNfcnggJiBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwwX1NPVF9DQVBUVVJFRCkgeworCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBQSFlfREwwX1NPVF9DQVBUVVJFRCIsCisJCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJfQorCQlpZiAoaXJxX3N0YXR1c19yeCAmIENTSURfQ1NJMl9SWF9JTkZPX1BIWV9ETDFfU09UX0NBUFRVUkVEKSB7CisJCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIFBIWV9ETDFfU09UX0NBUFRVUkVEIiwKKwkJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgpOworCQl9CisJCWlmIChpcnFfc3RhdHVzX3J4ICYgQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMl9TT1RfQ0FQVFVSRUQpIHsKKwkJCUNBTV9FUlIoQ0FNX0lTUCwgIkNTSUQ6JWQgUEhZX0RMMl9TT1RfQ0FQVFVSRUQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CisJCX0KKwkJaWYgKGlycV9zdGF0dXNfcnggJiBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwzX1NPVF9DQVBUVVJFRCkgeworCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBQSFlfREwzX1NPVF9DQVBUVVJFRCIsCisJCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJfQorCX0KKworCWlmICgoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0xPTkdfUEtUX0NBUFRVUkUpICYmCisJCShpcnFfc3RhdHVzX3J4ICYgQ1NJRF9DU0kyX1JYX0lORk9fTE9OR19QS1RfQ0FQVFVSRUQpKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkNTSUQ6JWQgTE9OR19QS1RfQ0FQVFVSRUQiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJdmFsID0gY2FtX2lvX3JfbWIoc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKworCQkJY3NpZF9yZWctPmNzaTJfcmVnLT4KKwkJCWNzaWRfY3NpMl9yeF9jYXB0dXJlZF9sb25nX3BrdF8wX2FkZHIpOworCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIGxvbmcgcGFja2V0IFZDIDolZCBEVDolZCBXQzolZCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsCisJCQkodmFsID4+IDIyKSwgKCh2YWwgPj4gMTYpICYgMHgzRiksICh2YWwgJiAweEZGRkYpKTsKKwkJdmFsID0gY2FtX2lvX3JfbWIoc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKworCQkJY3NpZF9yZWctPmNzaTJfcmVnLT4KKwkJCWNzaWRfY3NpMl9yeF9jYXB0dXJlZF9sb25nX3BrdF8xX2FkZHIpOworCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIGxvbmcgcGFja2V0IEVDQyA6JWQiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4LCB2YWwpOworCQl2YWwgPSBjYW1faW9fcl9tYihzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPgorCQkJY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2xvbmdfcGt0X2Z0cl9hZGRyKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBsb25nIHBrdCBjYWwgQ1JDOiVkIGV4cGVjdGVkIENSQzolZCIsCisJCQljc2lkX2h3LT5od19pbnRmLT5od19pZHgsICh2YWwgPj4gMTYpLCAodmFsICYgMHhGRkZGKSk7CisJfQorCWlmICgoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NIT1JUX1BLVF9DQVBUVVJFKSAmJgorCQkoaXJxX3N0YXR1c19yeCAmIENTSURfQ1NJMl9SWF9JTkZPX1NIT1JUX1BLVF9DQVBUVVJFRCkpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBTSE9SVF9QS1RfQ0FQVFVSRUQiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJdmFsID0gY2FtX2lvX3JfbWIoc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKworCQkJY3NpZF9yZWctPmNzaTJfcmVnLT4KKwkJCWNzaWRfY3NpMl9yeF9jYXB0dXJlZF9zaG9ydF9wa3RfMF9hZGRyKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBzaG9ydCBwa3QgVkMgOiVkIERUOiVkIExDOiVkIiwKKwkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwKKwkJCSh2YWwgPj4gMjIpLCAoKHZhbCA+PiAxNikgJiAweDFGKSwgKHZhbCAmIDB4RkZGRikpOworCQl2YWwgPSBjYW1faW9fcl9tYihzb2NfaW5mby0+cmVnX21hcFswXS5tZW1fYmFzZSArCisJCQljc2lkX3JlZy0+Y3NpMl9yZWctPgorCQkJY3NpZF9jc2kyX3J4X2NhcHR1cmVkX3Nob3J0X3BrdF8xX2FkZHIpOworCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIHNob3J0IHBhY2tldCBFQ0MgOiVkIiwgdmFsKTsKKwl9CisKKwlpZiAoKGNzaWRfaHctPmNzaWRfZGVidWcgJiBDU0lEX0RFQlVHX0VOQUJMRV9DUEhZX1BLVF9DQVBUVVJFKSAmJgorCQkoaXJxX3N0YXR1c19yeCAmIENTSURfQ1NJMl9SWF9JTkZPX0NQSFlfUEtUX0hEUl9DQVBUVVJFRCkpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRDolZCBDUEhZX1BLVF9IRFJfQ0FQVFVSRUQiLAorCQkJY3NpZF9ody0+aHdfaW50Zi0+aHdfaWR4KTsKKwkJdmFsID0gY2FtX2lvX3JfbWIoc29jX2luZm8tPnJlZ19tYXBbMF0ubWVtX2Jhc2UgKworCQkJY3NpZF9yZWctPmNzaTJfcmVnLT4KKwkJCWNzaWRfY3NpMl9yeF9jYXB0dXJlZF9jcGh5X3BrdF9oZHJfYWRkcik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkNTSUQ6JWQgY3BoeSBwYWNrZXQgVkMgOiVkIERUOiVkIFdDOiVkIiwKKwkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCwKKwkJCSh2YWwgPj4gMjIpLCAoKHZhbCA+PiAxNikgJiAweDFGKSwgKHZhbCAmIDB4RkZGRikpOworCX0KKwogCS8qcmVhZCB0aGUgSVBQIGVycm9ycyAqLwogCWlmIChjc2lkX3JlZy0+Y21uX3JlZy0+bm9fcGl4KSB7CiAJCS8qIElQUCByZXNldCBkb25lIGJpdCAqLwpAQCAtMjM5OSwxNCArMjczMCwxNiBAQAogCQkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRCBJUFAgcmVzZXQgY29tcGxldGUiKTsKIAkJCWNvbXBsZXRlKCZjc2lkX2h3LT5jc2lkX2lwcF9jb21wbGV0ZSk7CiAJCX0KLQkJaWYgKGlycV9zdGF0dXNfaXBwICYgQ1NJRF9QQVRIX0lORk9fSU5QVVRfU09GKQotCQkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRCBJUFAgU09GIHJlY2VpdmVkIik7Ci0JCWlmIChpcnFfc3RhdHVzX2lwcCAmIENTSURfUEFUSF9JTkZPX0lOUFVUX1NPTCkKLQkJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQgSVBQIFNPTCByZWNlaXZlZCIpOwotCQlpZiAoaXJxX3N0YXR1c19pcHAgJiBDU0lEX1BBVEhfSU5GT19JTlBVVF9FT0wpCi0JCQlDQU1fREJHKENBTV9JU1AsICJDU0lEIElQUCBFT0wgcmVjZWl2ZWQiKTsKLQkJaWYgKGlycV9zdGF0dXNfaXBwICYgQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GKQotCQkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRCBJUFAgRU9GIHJlY2VpdmVkIik7CisKKwkJaWYgKChpcnFfc3RhdHVzX2lwcCAmIENTSURfUEFUSF9JTkZPX0lOUFVUX1NPRikgJiYKKwkJCShjc2lkX2h3LT5jc2lkX2RlYnVnICYgQ1NJRF9ERUJVR19FTkFCTEVfU09GX0lSUSkpCisJCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIElQUCBTT0YgcmVjZWl2ZWQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CisKKwkJaWYgKChpcnFfc3RhdHVzX2lwcCAmIENTSURfUEFUSF9JTkZPX0lOUFVUX0VPRikgJiYKKwkJCShjc2lkX2h3LT5jc2lkX2RlYnVnICYgQ1NJRF9ERUJVR19FTkFCTEVfRU9GX0lSUSkpCisJCQlDQU1fRVJSKENBTV9JU1AsICJDU0lEOiVkIElQUCBFT0YgcmVjZWl2ZWQiLAorCQkJCWNzaWRfaHctPmh3X2ludGYtPmh3X2lkeCk7CiAKIAkJaWYgKGlycV9zdGF0dXNfaXBwICYgQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GKQogCQkJY29tcGxldGUoJmNzaWRfaHctPmNzaWRfaXBwX2NvbXBsZXRlKTsKQEAgLTI0MjQsMTQgKzI3NTcsMTcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY3NpZF9yZWctPmNtbl9yZWctPm5vX3JkaXM7IGkrKykgewogCQlpZiAoaXJxX3N0YXR1c19yZGlbaV0gJgogCQkJQklUKGNzaWRfcmVnLT5jbW5fcmVnLT5wYXRoX3JzdF9kb25lX3NoaWZ0X3ZhbCkpIHsKLQkJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQgcmRpJWQgcmVzZXQgY29tcGxldGUiLCBpKTsKKwkJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQgUkRJJWQgcmVzZXQgY29tcGxldGUiLCBpKTsKIAkJCWNvbXBsZXRlKCZjc2lkX2h3LT5jc2lkX3JkaW5fY29tcGxldGVbaV0pOwogCQl9CiAKLQkJaWYgKGlycV9zdGF0dXNfcmRpW2ldICAmIENTSURfUEFUSF9JTkZPX0lOUFVUX1NPRikKLQkJCUNBTV9EQkcoQ0FNX0lTUCwgIkNTSUQgUkRJIFNPRiByZWNlaXZlZCIpOwotCQlpZiAoaXJxX3N0YXR1c19yZGlbaV0gICYgQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GKQotCQkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1NJRCBSREkgRU9GIHJlY2VpdmVkIik7CisJCWlmICgoaXJxX3N0YXR1c19yZGlbaV0gJiBDU0lEX1BBVEhfSU5GT19JTlBVVF9TT0YpICYmCisJCQkoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX1NPRl9JUlEpKQorCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRCBSREk6JWQgU09GIHJlY2VpdmVkIiwgaSk7CisKKwkJaWYgKChpcnFfc3RhdHVzX3JkaVtpXSAgJiBDU0lEX1BBVEhfSU5GT19JTlBVVF9FT0YpICYmCisJCQkoY3NpZF9ody0+Y3NpZF9kZWJ1ZyAmIENTSURfREVCVUdfRU5BQkxFX0VPRl9JUlEpKQorCQkJQ0FNX0VSUihDQU1fSVNQLCAiQ1NJRCBSREk6JWQgRU9GIHJlY2VpdmVkIiwgaSk7CiAKIAkJaWYgKGlycV9zdGF0dXNfcmRpW2ldICYgQ1NJRF9QQVRIX0lORk9fSU5QVVRfRU9GKQogCQkJY29tcGxldGUoJmNzaWRfaHctPmNzaWRfcmRpbl9jb21wbGV0ZVtpXSk7CkBAIC0yNTU5LDYgKzI4OTUsNyBAQAogCQlpZmVfY3NpZF9ody0+cmRpX3Jlc1tpXS5yZXNfcHJpdiA9IHBhdGhfZGF0YTsKIAl9CiAKKwlpZmVfY3NpZF9ody0+Y3NpZF9kZWJ1ZyA9IDA7CiAJcmV0dXJuIDA7CiBlcnI6CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2NvcmUuaAppbmRleCBlZjU4NWMzLi5kZWVmNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfY29yZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9jb3JlLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNkZWZpbmUgQ0FNX0lGRV9DU0lEX1JESV9NQVggICAgICAgICA0CiAKICNkZWZpbmUgQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMF9FT1RfQ0FQVFVSRUQgICAgQklUKDApCi0jZGVmaW5lIENTSURfQ1NJMl9SWF9ORk9fUEhZX0RMMV9FT1RfQ0FQVFVSRUQgICAgIEJJVCgxKQorI2RlZmluZSBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwxX0VPVF9DQVBUVVJFRCAgICBCSVQoMSkKICNkZWZpbmUgQ1NJRF9DU0kyX1JYX0lORk9fUEhZX0RMMl9FT1RfQ0FQVFVSRUQgICAgQklUKDIpCiAjZGVmaW5lIENTSURfQ1NJMl9SWF9JTkZPX1BIWV9ETDNfRU9UX0NBUFRVUkVEICAgIEJJVCgzKQogI2RlZmluZSBDU0lEX0NTSTJfUlhfSU5GT19QSFlfREwwX1NPVF9DQVBUVVJFRCAgICBCSVQoNCkKQEAgLTY1LDYgKzY1LDE4IEBACiAjZGVmaW5lIENTSURfUEFUSF9FUlJPUl9QSVhfQ09VTlQgICAgICAgICAgICAgICAgIEJJVCgxMykKICNkZWZpbmUgQ1NJRF9QQVRIX0VSUk9SX0xJTkVfQ09VTlQgICAgICAgICAgICAgICAgQklUKDE0KQogCisvKgorICogRGVidWcgdmFsdWVzIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHRzIGFuZCBkZWJ1ZyBsb2dzIHByb3ZpZGUKKyAqIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICovCisjZGVmaW5lIENTSURfREVCVUdfRU5BQkxFX1NPRl9JUlEgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBDU0lEX0RFQlVHX0VOQUJMRV9FT0ZfSVJRICAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgQ1NJRF9ERUJVR19FTkFCTEVfU09UX0lSUSAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIENTSURfREVCVUdfRU5BQkxFX0VPVF9JUlEgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBDU0lEX0RFQlVHX0VOQUJMRV9TSE9SVF9QS1RfQ0FQVFVSRSAgICAgICBCSVQoNCkKKyNkZWZpbmUgQ1NJRF9ERUJVR19FTkFCTEVfTE9OR19QS1RfQ0FQVFVSRSAgICAgICAgQklUKDUpCisjZGVmaW5lIENTSURfREVCVUdfRU5BQkxFX0NQSFlfUEtUX0NBUFRVUkUgICAgICAgIEJJVCg2KQorCiAvKiBlbnVtIGNhbV9jc2lkX3BhdGhfaGFsdF9tb2RlIHNlbGVjdCB0aGUgcGF0aCBoYWx0IG1vZGUgY29udHJvbCAqLwogZW51bSBjYW1fY3NpZF9wYXRoX2hhbHRfbW9kZSB7CiAJQ1NJRF9IQUxUX01PREVfSU5URVJOQUwsCkBAIC0xODcsNyArMTk5LDcgQEAKIAl1aW50MzJfdCBjc2lkX2NzaTJfcnhfY2FwdHVyZWRfbG9uZ19wa3RfMF9hZGRyOwogCXVpbnQzMl90IGNzaWRfY3NpMl9yeF9jYXB0dXJlZF9sb25nX3BrdF8xX2FkZHI7CiAJdWludDMyX3QgY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2xvbmdfcGt0X2Z0cl9hZGRyOwotCXVpbnQzMl90IGNzaWRfY3NpMl9yeF9jYXB0dXJlZF9jcGh5X3BrdF9mdHJfYWRkcjsKKwl1aW50MzJfdCBjc2lkX2NzaTJfcnhfY2FwdHVyZWRfY3BoeV9wa3RfaGRyX2FkZHI7CiAJdWludDMyX3QgY3NpZF9jc2kyX3J4X2xhbmUwX21pc3JfYWRkcjsKIAl1aW50MzJfdCBjc2lkX2NzaTJfcnhfbGFuZTFfbWlzcl9hZGRyOwogCXVpbnQzMl90IGNzaWRfY3NpMl9yeF9sYW5lMl9taXNyX2FkZHI7CkBAIC0yMDIsNiArMjE0LDE0IEBACiAJdWludDMyX3QgY3NpMl9pcnFfbWFza19hbGw7CiAJdWludDMyX3QgY3NpMl9taXNyX2VuYWJsZV9zaGlmdF92YWw7CiAJdWludDMyX3QgY3NpMl92Y19tb2RlX3NoaWZ0X3ZhbDsKKwl1aW50MzJfdCBjc2kyX2NhcHR1cmVfbG9uZ19wa3RfZW5fc2hpZnQ7CisJdWludDMyX3QgY3NpMl9jYXB0dXJlX3Nob3J0X3BrdF9lbl9zaGlmdDsKKwl1aW50MzJfdCBjc2kyX2NhcHR1cmVfY3BoeV9wa3RfZW5fc2hpZnQ7CisJdWludDMyX3QgY3NpMl9jYXB0dXJlX2xvbmdfcGt0X2R0X3NoaWZ0OworCXVpbnQzMl90IGNzaTJfY2FwdHVyZV9sb25nX3BrdF92Y19zaGlmdDsKKwl1aW50MzJfdCBjc2kyX2NhcHR1cmVfc2hvcnRfcGt0X3ZjX3NoaWZ0OworCXVpbnQzMl90IGNzaTJfY2FwdHVyZV9jcGh5X3BrdF9kdF9zaGlmdDsKKwl1aW50MzJfdCBjc2kyX2NhcHR1cmVfY3BoeV9wa3RfdmNfc2hpZnQ7CiB9OwogCiBzdHJ1Y3QgY2FtX2lmZV9jc2lkX2NzaTJfdHBnX3JlZ19vZmZzZXQgewpAQCAtMjI2LDYgKzI0Niw3IEBACiAJLypjb25maWd1cmF0aW9ucyAqLwogCXVpbnQzMl90IHRwZ19kdG5fY2ZnX29mZnNldDsKIAl1aW50MzJfdCB0cGdfY2dlbl9jZmdfb2Zmc2V0OworCXVpbnQzMl90IHRwZ19jcGFzX2lmZV9yZWdfb2Zmc2V0OwogCiB9Owogc3RydWN0IGNhbV9pZmVfY3NpZF9jb21tb25fcmVnX29mZnNldCB7CkBAIC0zMjAsMTQgKzM0MSwxNiBAQAogICogQHdpZHRoOiAgICAgICAgICAgIHdpZHRoCiAgKiBAaGVpZ2h0OiAgICAgICAgICAgaGVpZ2h0CiAgKiBAdGVzdF9wYXR0ZXJuIDogICAgcGF0dGVybgotICogQGRlY29kZV9mb3JtYXQ6ICAgIGRlY29kZSBmb3JtYXQKKyAqIEBpbl9mb3JtYXQ6ICAgICAgICBkZWNvZGUgZm9ybWF0CisgKiBAdXNhZ2VfdHlwZTogICAgICAgd2hldGhlciBkdWFsIGlzcCBpcyByZXF1aXJlZAogICoKICAqLwogc3RydWN0IGNhbV9pZmVfY3NpZF90cGdfY2ZnICB7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGF0dGVybjsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9mbXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBpbl9mb3JtYXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZV90eXBlOwogfTsKIAogLyoqCkBAIC0zNTMsMTMgKzM3NiwxNSBAQAogICogQHZjIDogICAgICAgICAgICBWaXJ0dWFsIGNoYW5uZWwgbnVtYmVyCiAgKiBAZHQgOiAgICAgICAgICAgIERhdGEgdHlwZSBudW1iZXIKICAqIEBjaWQgICAgICAgICAgICAgY2lkIG51bWJlciwgaXQgaXMgc2FtZSBhcyBEVF9JRCBudW1iZXIgaW4gSFcKLSAqIEBkZWNvZGVfZm10OiAgICAgaW5wdXQgZGVjb2RlIGZvcm1hdAotICogQG91dHB1dF9mbXQ6ICAgICBvdXRwdXQgcmVzb3VyY2UgZm9ybWF0LCBuZWVkZWQgZm9yIFJESSByZXNvdXJjZQorICogQGluX2Zvcm1hdDogICAgICBpbnB1dCBkZWNvZGUgZm9ybWF0CisgKiBAb3V0X2Zvcm1hdDogICAgIG91dHB1dCBmb3JtYXQKICAqIEBjcm9wX2VuYWJsZTogICAgY3JvcCBpcyBlbmFibGUgb3IgZGlzYWJsZWQsIGlmIGVuYWJsZWQKICAqICAgICAgICAgICAgICAgICAgdGhlbiByZW1haW5pbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQuCiAgKiBAc3RhcnRfcGl4ZWw6ICAgIHN0YXJ0IHBpeGVsCisgKiBAZW5kX3BpeGVsOiAgICAgIGVuZF9waXhlbAogICogQHdpZHRoOiAgICAgICAgICB3aWR0aAogICogQHN0YXJ0X2xpbmU6ICAgICBzdGFydCBsaW5lCisgKiBAZW5kX2xpbmU6ICAgICAgIGVuZF9saW5lCiAgKiBAaGVpZ2h0OiAgICAgICAgIGhlaWd0aAogICogQHN5bmNfbW9kZTogICAgICAgQXBwbGljYWJsZSBmb3IgSVBQL1JESSBwYXRoIHJlc2VydmF0aW9uCiAgKiAgICAgICAgICAgICAgICAgIFJlc2VydmluZyB0aGUgcGF0aCBmb3IgbWFzdGVyIElQUCBvciBzbGF2ZSBJUFAKQEAgLTM3MywxMiArMzk4LDE0IEBACiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICB2YzsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGR0OwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgY2lkOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2ZtdDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBpbl9mb3JtYXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZm9ybWF0OwogCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9lbmFibGU7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9waXhlbDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9waXhlbDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbGluZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9saW5lOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OwogCWVudW0gY2FtX2lzcF9od19zeW5jX21vZGUgICAgICAgc3luY19tb2RlOwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyX2lkeDsKQEAgLTQwMyw2ICs0MzAsOCBAQAogICogQGNzaWRfY3NpMl9yZXNldF9jb21wbGV0ZTogY3NpMiByZXNldCBjb21wbGV0aW9uCiAgKiBAY3NpZF9pcHBfcmVzZXRfY29tcGxldGU6ICBpcHAgcmVzZXQgY29tcGxldGlvbgogICogQGNzaWRfcmRpbl9yZXNldF9jb21wbGV0ZTogcmRpIG4gY29tcGxldGlvbgorICogQGNzaWRfZGVidWc6ICAgICAgICAgICAgICAgY3NpZCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBlbmFibGUgdGhlIFNPVCwgRU9ULAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgU09GLCBFT0YsIG1lYXN1cmUgZXRjIGluIHRoZSBjc2lkIGh3CiAgKgogICovCiBzdHJ1Y3QgY2FtX2lmZV9jc2lkX2h3IHsKQEAgLTQyMiw2ICs0NTEsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgIGNzaWRfY3NpMl9jb21wbGV0ZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgICBjc2lkX2lwcF9jb21wbGV0ZTsKIAlzdHJ1Y3QgY29tcGxldGlvbiAgICBjc2lkX3JkaW5fY29tcGxldGVbQ0FNX0lGRV9DU0lEX1JESV9NQVhdOworCXVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIGNzaWRfZGVidWc7CiB9OwogCiBpbnQgY2FtX2lmZV9jc2lkX2h3X3Byb2JlX2luaXQoc3RydWN0IGNhbV9od19pbnRmICAqY3NpZF9od19pbnRmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2Rldi5jCmluZGV4IDVhNTcwNDYuLjEyOGMwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfZGV2LmMKQEAgLTY5LDYgKzY5LDggQEAKIAogCWNzaWRfaHdfaW5mby0+Y29yZV9pbmZvID0gY3NpZF9kZXY7CiAJY3NpZF9od19pbmZvLT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwljc2lkX2h3X2luZm8tPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJY3NpZF9od19pbmZvLT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJY3NpZF9od19pbmZvLT5zb2NfaW5mby5pbmRleCA9IGNzaWRfZGV2X2lkeDsKIAogCWNzaWRfaHdfZGF0YSA9IChzdHJ1Y3QgY2FtX2lmZV9jc2lkX2h3X2luZm8gICopbWF0Y2hfZGV2LT5kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2xpdGUxNzAuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9saXRlMTcwLmgKaW5kZXggZTg1N2Y4Yi4uOTUyNDI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX2xpdGUxNzAuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfbGl0ZTE3MC5oCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkuY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2xvbmdfcGt0XzBfYWRkciAgICAgICAgPSAweDEzMCwKIAkuY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2xvbmdfcGt0XzFfYWRkciAgICAgICAgPSAweDEzNCwKIAkuY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2xvbmdfcGt0X2Z0cl9hZGRyICAgICAgPSAweDEzOCwKLQkuY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2NwaHlfcGt0X2Z0cl9hZGRyICAgICAgPSAweDEzYywKKwkuY3NpZF9jc2kyX3J4X2NhcHR1cmVkX2NwaHlfcGt0X2hkcl9hZGRyICAgICAgPSAweDEzYywKIAkuY3NpZF9jc2kyX3J4X2xhbmUwX21pc3JfYWRkciAgICAgICAgICAgICAgICAgPSAweDE1MCwKIAkuY3NpZF9jc2kyX3J4X2xhbmUxX21pc3JfYWRkciAgICAgICAgICAgICAgICAgPSAweDE1NCwKIAkuY3NpZF9jc2kyX3J4X2xhbmUyX21pc3JfYWRkciAgICAgICAgICAgICAgICAgPSAweDE1OCwKQEAgLTIyNCw2ICsyMjQsMTQgQEAKIAkuY3NpMl9pcnFfbWFza19hbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweEZGRkZGRkYsCiAJLmNzaTJfbWlzcl9lbmFibGVfc2hpZnRfdmFsICAgICAgICAgICAgICAgICAgID0gNiwKIAkuY3NpMl92Y19tb2RlX3NoaWZ0X3ZhbCAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorCS5jc2kyX2NhcHR1cmVfbG9uZ19wa3RfZW5fc2hpZnQgICAgICAgICAgICAgICA9IDAsCisJLmNzaTJfY2FwdHVyZV9zaG9ydF9wa3RfZW5fc2hpZnQgICAgICAgICAgICAgID0gMSwKKwkuY3NpMl9jYXB0dXJlX2NwaHlfcGt0X2VuX3NoaWZ0ICAgICAgICAgICAgICAgPSAyLAorCS5jc2kyX2NhcHR1cmVfbG9uZ19wa3RfZHRfc2hpZnQgICAgICAgICAgICAgICA9IDQsCisJLmNzaTJfY2FwdHVyZV9sb25nX3BrdF92Y19zaGlmdCAgICAgICAgICAgICAgID0gMTAsCisJLmNzaTJfY2FwdHVyZV9zaG9ydF9wa3RfdmNfc2hpZnQgICAgICAgICAgICAgID0gMTUsCisJLmNzaTJfY2FwdHVyZV9jcGh5X3BrdF9kdF9zaGlmdCAgICAgICAgICAgICAgID0gMjAsCisJLmNzaTJfY2FwdHVyZV9jcGh5X3BrdF92Y19zaGlmdCAgICAgICAgICAgICAgID0gMjYsCiB9OwogCiAKQEAgLTI1Miw2ICsyNjAsNyBAQAogCS8qY29uZmlndXJhdGlvbnMgKi8KIAkudHBnX2R0bl9jZmdfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGMsCiAJLnRwZ19jZ2VuX2NmZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMCwKKwkudHBnX2NwYXNfaWZlX3JlZ19vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgPSAweDI4LAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfc29jLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfc29jLmMKaW5kZXggNzIwNTBhYS4uYzAzNmJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX3NvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9zb2MuYwpAQCAtNzYsNyArNzYsNyBAQAogCXN0cmxjcHkoY3Bhc19yZWdpc3Rlcl9wYXJhbS5pZGVudGlmaWVyLCAiY3NpZCIsCiAJCUNBTV9IV19JREVOVElGSUVSX0xFTkdUSCk7CiAJY3Bhc19yZWdpc3Rlcl9wYXJhbS5jZWxsX2luZGV4ID0gc29jX2luZm8tPmluZGV4OwotCWNwYXNfcmVnaXN0ZXJfcGFyYW0uZGV2ID0gJnNvY19pbmZvLT5wZGV2LT5kZXY7CisJY3Bhc19yZWdpc3Rlcl9wYXJhbS5kZXYgPSBzb2NfaW5mby0+ZGV2OwogCXJjID0gY2FtX2NwYXNfcmVnaXN0ZXJfY2xpZW50KCZjcGFzX3JlZ2lzdGVyX3BhcmFtKTsKIAlpZiAocmMpIHsKIAkJQ0FNX0VSUihDQU1fSVNQLCAiQ1BBUyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkIiwgcmMpOwpAQCAtMTI5LDggKzEyOSw4IEBACiAKIAlhaGJfdm90ZS50eXBlID0gQ0FNX1ZPVEVfQUJTT0xVVEU7CiAJYWhiX3ZvdGUudm90ZS5sZXZlbCA9IENBTV9TVlNfVk9URTsKLQlheGlfdm90ZS5jb21wcmVzc2VkX2J3ID0gNjQwMDAwMDAwOwotCWF4aV92b3RlLnVuY29tcHJlc3NlZF9idyA9IDY0MDAwMDAwMDsKKwlheGlfdm90ZS5jb21wcmVzc2VkX2J3ID0gQ0FNX0NQQVNfREVGQVVMVF9BWElfQlc7CisJYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3ID0gQ0FNX0NQQVNfREVGQVVMVF9BWElfQlc7CiAKIAlDQU1fREJHKENBTV9JU1AsICJjc2lkIHZvdGUgY29tcHJlc3NlZF9idzolbGxkIHVuY29tcHJlc3NlZF9idzolbGxkIiwKIAkJYXhpX3ZvdGUuY29tcHJlc3NlZF9idywgYXhpX3ZvdGUudW5jb21wcmVzc2VkX2J3KTsKQEAgLTE4MSwzICsxODEsNTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBjYW1faWZlX2NzaWRfZW5hYmxlX2lmZV9mb3JjZV9jbG9ja19vbihzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICAqc29jX2luZm8sCisJdWludDMyX3QgY3Bhc19pZmVfYmFzZV9vZmZzZXQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2NzaWRfc29jX3ByaXZhdGUgICAgICAgKnNvY19wcml2YXRlOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bhc3NfaWZlX2ZvcmNlX2Nsa19vZmZzZXQ7CisKKwlpZiAoIXNvY19pbmZvKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yIEludmFsaWQgcGFyYW1zIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNvY19wcml2YXRlID0gc29jX2luZm8tPnNvY19wcml2YXRlOworCWNwYXNzX2lmZV9mb3JjZV9jbGtfb2Zmc2V0ID0KKwkJY3Bhc19pZmVfYmFzZV9vZmZzZXQgKyAoMHg0ICogc29jX2luZm8tPmluZGV4KTsKKwlyYyA9IGNhbV9jcGFzX3JlZ193cml0ZShzb2NfcHJpdmF0ZS0+Y3Bhc19oYW5kbGUsIENBTV9DUEFTX1JFR19DUEFTVE9QLAorCQljcGFzc19pZmVfZm9yY2VfY2xrX29mZnNldCwgMSwgMSk7CisKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0lTUCwgIkNQQVNTIHNldCBJRkU6JWQgRm9yY2UgY2xvY2sgT24gZmFpbGVkIiwKKwkJCXNvY19pbmZvLT5pbmRleCk7CisJZWxzZQorCQlDQU1fREJHKENBTV9JU1AsICJDUEFTUyBzZXQgSUZFOiVkIEZvcmNlIGNsb2NrIE9uIiwKKwkJc29jX2luZm8tPmluZGV4KTsKKworCXJldHVybiByYzsKK30KKworaW50IGNhbV9pZmVfY3NpZF9kaXNhYmxlX2lmZV9mb3JjZV9jbG9ja19vbihzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwl1aW50MzJfdCBjcGFzX2lmZV9iYXNlX29mZnNldCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1fY3NpZF9zb2NfcHJpdmF0ZSAgICAgICAqc29jX3ByaXZhdGU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGFzc19pZmVfZm9yY2VfY2xrX29mZnNldDsKKworCWlmICghc29jX2luZm8pIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IgSW52YWxpZCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc29jX3ByaXZhdGUgPSBzb2NfaW5mby0+c29jX3ByaXZhdGU7CisJY3Bhc3NfaWZlX2ZvcmNlX2Nsa19vZmZzZXQgPQorCQljcGFzX2lmZV9iYXNlX29mZnNldCArICgweDQgKiBzb2NfaW5mby0+aW5kZXgpOworCXJjID0gY2FtX2NwYXNfcmVnX3dyaXRlKHNvY19wcml2YXRlLT5jcGFzX2hhbmRsZSwgQ0FNX0NQQVNfUkVHX0NQQVNUT1AsCisJCWNwYXNzX2lmZV9mb3JjZV9jbGtfb2Zmc2V0LCAgMSwgMCk7CisKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX0lTUCwgIkNQQVNTIHNldCBJRkU6JWQgRm9yY2UgY2xvY2sgT2ZmIGZhaWxlZCIsCisJCQlzb2NfaW5mby0+aW5kZXgpOworCWVsc2UKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiQ1BBU1Mgc2V0IElGRTolZCBGb3JjZSBjbG9jayBvZmYiLAorCQlzb2NfaW5mby0+aW5kZXgpOworCisJcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfc29jLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pZmVfY3NpZF9ody9jYW1faWZlX2NzaWRfc29jLmgKaW5kZXggMWEzMDcyMi4uOGU5NjNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaWZlX2NzaWRfaHcvY2FtX2lmZV9jc2lkX3NvYy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2lmZV9jc2lkX2h3L2NhbV9pZmVfY3NpZF9zb2MuaApAQCAtODIsNCArODIsMzMgQEAKICAqLwogaW50IGNhbV9pZmVfY3NpZF9kaXNhYmxlX3NvY19yZXNvdXJjZXMoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pOwogCisvKioKKyAqIGNhbV9pZmVfY3NpZF9lbmFibGVfaWZlX2ZvcmNlX2Nsb2NrKCkKKyAqCisgKiBAYnJpZWY6ICAgICAgICAgICAgICAgICBpZiBjc2lkIHRlc3RnZW4gdXNlZCBmb3IgZHVhbCBpc3AgY2FzZSwgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBjc2lkIHRlc3QgZ2VuLCBlbmFibGUgaWZlIGZvcmNlIGNsb2NrIG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIGNwYXMKKyAqCisgKiBAc29jX2luZm86ICAgICAgICAgICAgICBzb2MgaW5mbyBzdHJ1Y3R1cmUgcG9pbnRlcgorICogQGNwYXNfaWZlX2Jhc2Vfb2Zmc2V0OiAgY3BhcyBpZmUgZm9yY2UgY2xvY2sgYmFzZSByZWcgb2Zmc2V0IHZhbHVlCisgKgorICovCitpbnQgY2FtX2lmZV9jc2lkX2VuYWJsZV9pZmVfZm9yY2VfY2xvY2tfb24oc3RydWN0IGNhbV9od19zb2NfaW5mbyAgKnNvY19pbmZvLAorCXVpbnQzMl90IGNwYXNfaWZlX2Jhc2Vfb2Zmc2V0KTsKKworLyoqCisgKiBjYW1faWZlX2NzaWRfZGlzYWJsZV9pZmVfZm9yY2VfY2xvY2tfb24oKQorICoKKyAqIEBicmllZjogICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIElGRSBmb3JjZSBjbG9jayBvbiBhZnRlciBkdWFsIElTUAorICogICAgICAgICAgICAgICAgICAgICAgICAgQ1NJRCB0ZXN0IGdlbiBzdG9wCisgKgorICogQHNvY19pbmZvOiAgICAgICAgICAgICAgc29jIGluZm8gc3RydWN0dXJlIHBvaW50ZXIKKyAqIEBjcGFzX2lmZV9iYXNlX29mZnNldDogIGNwYXMgaWZlIGZvcmNlIGNsb2NrIGJhc2UgcmVnIG9mZnNldCB2YWx1ZQorICoKKyAqLworaW50IGNhbV9pZmVfY3NpZF9kaXNhYmxlX2lmZV9mb3JjZV9jbG9ja19vbihzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbywKKwl1aW50MzJfdCBjcGFzX2lmZV9iYXNlX29mZnNldCk7CisKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2luY2x1ZGUvY2FtX2lmZV9jc2lkX2h3X2ludGYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2luY2x1ZGUvY2FtX2lmZV9jc2lkX2h3X2ludGYuaAppbmRleCA1MmI3MTJhLi4zN2UwY2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pbmNsdWRlL2NhbV9pZmVfY3NpZF9od19pbnRmLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaW5jbHVkZS9jYW1faWZlX2NzaWRfaHdfaW50Zi5oCkBAIC0xMCw4ICsxMCw4IEBACiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpZm5kZWYgX19DQU1fQ1NJRF9IV19JTlRGX0hfXwotI2RlZmluZSBfX0NBTV9DU0lEX0hXX0lOVEZfSF9fCisjaWZuZGVmIF9DQU1fQ1NJRF9IV19JTlRGX0hfCisjZGVmaW5lIF9DQU1fQ1NJRF9IV19JTlRGX0hfCiAKICNpbmNsdWRlICJjYW1faXNwX2h3LmgiCiAjaW5jbHVkZSAiY2FtX2h3X2ludGYuaCIKQEAgLTE5LDcgKzE5LDYgQEAKIC8qIE1BWCBJRkUgQ1NJRCBpbnN0YW5jZSAqLwogI2RlZmluZSBDQU1fSUZFX0NTSURfSFdfTlVNX01BWCAgICAgICAgICAgICAgICAgICAgICAgIDQKIAotCiAvKioKICAqIGVudW0gY2FtX2lmZV9waXhfcGF0aF9yZXNfaWQgLSBTcGVjaWZ5IHRoZSBjc2lkIHBhdGNoCiAgKi8KQEAgLTQzLDcgKzQyLDYgQEAKIAlDQU1fSUZFX0NTSURfQ0lEX01BWCwKIH07CiAKLQogLyoqCiAgKiBzdHJ1Y3QgY2FtX2lmZV9jc2lkX2h3X2NhcHMtIGdldCB0aGUgQ1NJRCBodyBjYXBhYmlsaXR5CiAgKiBAbm9fcmRpcyA6ICAgICAgIG51bWJlciBvZiByZGlzIHN1cHBvcnRlZCBieSBDU0lEIEhXIGRldmljZQpAQCAtNjEsNyArNTksNiBAQAogCXVpbnQzMl90ICAgICAgdmVyc2lvbl9pbmNyOwogfTsKIAotCiAvKioKICAqIHN0cnVjdCBjYW1fY3NpZF9od19yZXNlcnZlX3Jlc291cmNlLSBodyByZXNlcnZlCiAgKiBAcmVzX3R5cGUgOiAgcmVvdXJjZSB0eXBlIENJRCBvciBQQVRICkBAIC04OSwxMCArODYsOCBAQAogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl9pZHg7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkOwogCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgICAgICAgICAgKm5vZGVfcmVzOwotCiB9OwogCi0KIC8qKgogICogIGVudW0gY2FtX2lmZV9jc2lkX2hhbHRfY21kIC0gU3BlY2lmeSB0aGUgaGFsdCBjb21tYW5kIHR5cGUKICAqLwpAQCAtMTU2LDYgKzE1MSw3IEBACiAgKi8KIGVudW0gY2FtX2lmZV9jc2lkX2NtZF90eXBlIHsKIAlDQU1fSUZFX0NTSURfQ01EX0dFVF9USU1FX1NUQU1QLAorCUNBTV9JRkVfQ1NJRF9TRVRfQ1NJRF9ERUJVRywKIAlDQU1fSUZFX0NTSURfQ01EX01BWCwKIH07CiAKQEAgLTE3MCw0ICsxNjYsNCBAQAogaW50IGNhbV9pZmVfY3NpZF9od19pbml0KHN0cnVjdCBjYW1faHdfaW50ZiAqKmlmZV9jc2lkX2h3LAogCXVpbnQzMl90IGh3X2lkeCk7CiAKLSNlbmRpZiAvKiBfX0NBTV9DU0lEX0hXX0lOVEZfSF9fICovCisjZW5kaWYgLyogX0NBTV9DU0lEX0hXX0lOVEZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2luY2x1ZGUvY2FtX2lzcF9ody5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaW5jbHVkZS9jYW1faXNwX2h3LmgKaW5kZXggNmM2ZjM4Yi4uM2EwYzZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaW5jbHVkZS9jYW1faXNwX2h3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaW5jbHVkZS9jYW1faXNwX2h3LmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJjYW1faHcuaCIKICNpbmNsdWRlICJjYW1fc29jX3V0aWwuaCIKICNpbmNsdWRlICJjYW1faXJxX2NvbnRyb2xsZXIuaCIKKyNpbmNsdWRlIDx1YXBpL21lZGlhL2NhbV9pc3AuaD4KIAogLyoKICAqIHN0cnVjdCBjYW1faXNwX3RpbWVzdGFtcDoKQEAgLTE2MSw0ICsxNjIsMzMgQEAKIAlzdHJ1Y3QgY2FtX2J1Zl9pb19jZmcgICAgICAgICAgKmlvX2NmZzsKIH07CiAKKy8qCisgKiBzdHJ1Y3QgY2FtX2lzcF9od19nZXRfaGZyX3VwZGF0ZToKKyAqCisgKiBAQnJpZWY6ICAgICAgICAgR2V0IGNkbSBjb21tYW5kcyBmb3IgSEZSIHVwZGF0ZXMuCisgKgorICogQCBjZG06ICAgICAgICAgIENvbW1hbmQgYnVmZmVyIGluZm9ybWF0aW9uCisgKiBAIGlvX2hmcl9jZmc6ICAgSU8gYnVmZmVyIGNvbmZpZyBpbmZvcm1hdGlvbiBzZW50IGZyb20gVU1ECisgKgorICovCitzdHJ1Y3QgY2FtX2lzcF9od19nZXRfaGZyX3VwZGF0ZSB7CisJc3RydWN0IGNhbV9pc3BfaHdfZ2V0X2NkbV9hcmdzICBjZG07CisJc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnICppb19oZnJfY2ZnOworfTsKKworLyoKKyAqIHN0cnVjdCBjYW1faXNwX2h3X2R1YWxfaXNwX3VwZGF0ZV9hcmdzOgorICoKKyAqIEBCcmllZjogICAgICAgIHVwZGF0ZSB0aGUgZHVhbCBpc3Agc3RyaXBpbmcgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAIHNwbGl0X2lkOiAgICBzcGlsdCBpZCB0byBpbmZvcm0gbGVmdCBvciByaWZodAorICogQCByZXM6ICAgICAgICAgcmVzb3VyY2Ugbm9kZQorICogQCBkdWFsX2NmZzogICAgZHVhbCBpc3AgY29uZmlndXJhdGlvbgorICoKKyAqLworc3RydWN0IGNhbV9pc3BfaHdfZHVhbF9pc3BfdXBkYXRlX2FyZ3MgeworCWVudW0gY2FtX2lzcF9od19zcGxpdF9pZCAgICAgICAgIHNwbGl0X2lkOworCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICAgKnJlczsKKwlzdHJ1Y3QgY2FtX2lzcF9kdWFsX2NvbmZpZyAgICAgICpkdWFsX2NmZzsKK307CiAjZW5kaWYgLyogX0NBTV9JU1BfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2luY2x1ZGUvY2FtX3ZmZV9od19pbnRmLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody9pbmNsdWRlL2NhbV92ZmVfaHdfaW50Zi5oCmluZGV4IDQxODI4MGEuLjk2MjYzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L2luY2x1ZGUvY2FtX3ZmZV9od19pbnRmLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvaW5jbHVkZS9jYW1fdmZlX2h3X2ludGYuaApAQCAtNDgsNiArNDgsOSBAQAogCUNBTV9WRkVfSFdfQ01EX0dFVF9DSEFOR0VfQkFTRSwKIAlDQU1fVkZFX0hXX0NNRF9HRVRfQlVGX1VQREFURSwKIAlDQU1fVkZFX0hXX0NNRF9HRVRfUkVHX1VQREFURSwKKwlDQU1fVkZFX0hXX0NNRF9HRVRfSEZSX1VQREFURSwKKwlDQU1fVkZFX0hXX0NNRF9HRVRfU0VDVVJFX01PREUsCisJQ0FNX1ZGRV9IV19DTURfU1RSSVBFX1VQREFURSwKIAlDQU1fVkZFX0hXX0NNRF9NQVgsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvY2FtX3ZmZV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvY2FtX3ZmZV9jb3JlLmMKaW5kZXggZTMzMGM4NC4uNzdiODMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L2NhbV92ZmVfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody9jYW1fdmZlX2NvcmUuYwpAQCAtMTc5LDYgKzE3OSwxMyBAQAogCiAJQ0FNX0RCRyhDQU1fSVNQLCAiRW5hYmxlIHNvYyBkb25lIik7CiAKKwkvKiBEbyBIVyBSZXNldCAqLworCXJjID0gY2FtX3ZmZV9yZXNldChod19wcml2LCBOVUxMLCAwKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiUmVzZXQgRmFpbGVkIHJjPSVkIiwgcmMpOworCQlnb3RvIGRpc2FibGVfc29jOworCX0KKwogCXJjID0gY29yZV9pbmZvLT52ZmVfYnVzLT5od19vcHMuaW5pdChjb3JlX2luZm8tPnZmZV9idXMtPmJ1c19wcml2LAogCQlOVUxMLCAwKTsKIAlpZiAocmMpIHsKQEAgLTE4NiwxOCArMTkzLDcgQEAKIAkJZ290byBkaXNhYmxlX3NvYzsKIAl9CiAKLQkvKiBEbyBIVyBSZXNldCAqLwotCXJjID0gY2FtX3ZmZV9yZXNldChod19wcml2LCBOVUxMLCAwKTsKLQlpZiAocmMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiUmVzZXQgRmFpbGVkIHJjPSVkIiwgcmMpOwotCQlnb3RvIGRlaW5pdF9idXM7Ci0JfQotCiAJcmV0dXJuIDA7Ci0KLWRlaW5pdF9idXM6Ci0JY29yZV9pbmZvLT52ZmVfYnVzLT5od19vcHMuZGVpbml0KGNvcmVfaW5mby0+dmZlX2J1cy0+YnVzX3ByaXYsCi0JCU5VTEwsIDApOwogZGlzYWJsZV9zb2M6CiAJY2FtX3ZmZV9kaXNhYmxlX3NvY19yZXNvdXJjZXMoc29jX2luZm8pOwogZGVjcmVtZW50X29wZW5fY250OgpAQCAtMzUwLDcgKzM0NiwxMSBAQAogCSAqICB3aWxsIGJsb2NrIGV2ZXJ5dGhpbmcuCiAJICovCiAJaWYgKGV2dF9wYXlsb2FkLT5pcnFfcmVnX3ZhbFsxXSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJNYXNrIGFsbCB0aGUgaW50ZXJydXB0cyIpOworCQlDQU1fRVJSKENBTV9JU1AsCisJCQkiRW5jb3VudGVyZWQgRXJyb3IgSXJxX3N0YXR1czE9MHgleC4gU3RvcHBpbmcgZnVydGhlciBJUlEgcHJvY2Vzc2luZyBmcm9tIHRoaXMgSFciLAorCQkJZXZ0X3BheWxvYWQtPmlycV9yZWdfdmFsWzFdKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiVmlvbGF0aW9uIHN0YXR1cyA9ICV4IiwKKwkJCWV2dF9wYXlsb2FkLT5pcnFfcmVnX3ZhbFsyXSk7CiAJCWNhbV9pb193KDAsIGhhbmRsZXJfcHJpdi0+bWVtX2Jhc2UgKyAweDYwKTsKIAkJY2FtX2lvX3coMCwgaGFuZGxlcl9wcml2LT5tZW1fYmFzZSArIDB4NUMpOwogCkBAIC01NTYsNiArNTU2LDggQEAKIAogCQlicmVhazsKIAljYXNlIENBTV9WRkVfSFdfQ01EX0dFVF9CVUZfVVBEQVRFOgorCWNhc2UgQ0FNX1ZGRV9IV19DTURfR0VUX0hGUl9VUERBVEU6CisJY2FzZSBDQU1fVkZFX0hXX0NNRF9TVFJJUEVfVVBEQVRFOgogCQlyYyA9IGNvcmVfaW5mby0+dmZlX2J1cy0+aHdfb3BzLnByb2Nlc3NfY21kKAogCQkJY29yZV9pbmZvLT52ZmVfYnVzLT5idXNfcHJpdiwgY21kX3R5cGUsIGNtZF9hcmdzLAogCQkJYXJnX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L2NhbV92ZmVfZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvY2FtX3ZmZV9kZXYuYwppbmRleCAzZTIzMDdjLi43NDYyN2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvY2FtX3ZmZV9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvY2FtX3ZmZV9kZXYuYwpAQCAtNDUsNiArNDUsOCBAQAogCQlnb3RvIGZyZWVfdmZlX2h3X2ludGY7CiAJfQogCXZmZV9ody0+c29jX2luZm8ucGRldiA9IHBkZXY7CisJdmZlX2h3LT5zb2NfaW5mby5kZXYgPSAmcGRldi0+ZGV2OworCXZmZV9ody0+c29jX2luZm8uZGV2X25hbWUgPSBwZGV2LT5uYW1lOwogCXZmZV9od19pbnRmLT5od19wcml2ID0gdmZlX2h3OwogCXZmZV9od19pbnRmLT5od19vcHMuZ2V0X2h3X2NhcHMgPSBjYW1fdmZlX2dldF9od19jYXBzOwogCXZmZV9od19pbnRmLT5od19vcHMuaW5pdCA9IGNhbV92ZmVfaW5pdF9odzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody9jYW1fdmZlX3NvYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L2NhbV92ZmVfc29jLmMKaW5kZXggM2IyZWFkMi4uYjVjYTQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L2NhbV92ZmVfc29jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L2NhbV92ZmVfc29jLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlzdHJsY3B5KGNwYXNfcmVnaXN0ZXJfcGFyYW0uaWRlbnRpZmllciwgImlmZSIsCiAJCUNBTV9IV19JREVOVElGSUVSX0xFTkdUSCk7CiAJY3Bhc19yZWdpc3Rlcl9wYXJhbS5jZWxsX2luZGV4ID0gc29jX2luZm8tPmluZGV4OwotCWNwYXNfcmVnaXN0ZXJfcGFyYW0uZGV2ID0gJnNvY19pbmZvLT5wZGV2LT5kZXY7CisJY3Bhc19yZWdpc3Rlcl9wYXJhbS5kZXYgPSBzb2NfaW5mby0+ZGV2OwogCXJjID0gY2FtX2NwYXNfcmVnaXN0ZXJfY2xpZW50KCZjcGFzX3JlZ2lzdGVyX3BhcmFtKTsKIAlpZiAocmMpIHsKIAkJQ0FNX0VSUihDQU1fSVNQLCAiQ1BBUyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkIiwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZTE3MC9jYW1fdmZlMTcwLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlMTcwL2NhbV92ZmUxNzAuaAppbmRleCAyNzVjN2I1Li5lM2E2ZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlMTcwL2NhbV92ZmUxNzAuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlMTcwL2NhbV92ZmUxNzAuaApAQCAtNDksNiArNDksNyBAQAogCS5lcG9jaF9pcnEgICAgICAgICAgICAgICAgPSAweDAwMDAwNEEwLAogCS5yYXdfY3JvcF93aWR0aF9jZmcgICAgICAgPSAweDAwMDAwQ0U0LAogCS5yYXdfY3JvcF9oZWlnaHRfY2ZnICAgICAgPSAweDAwMDAwQ0U4LAorCS5yZWdfdXBkYXRlX2NtZCAgICAgICAgICAgPSAweDAwMDAwNEFDLAogfTsKIAogc3RhdGljIHN0cnVjdCBjYW1fdmZlX2NhbWlmX3JlZ19kYXRhIHZmZV8xNzBfY2FtaWZfcmVnX2RhdGEgPSB7CkBAIC02NiwxMCArNjcsMTIgQEAKIAkuZXh0ZXJuX3JlZ191cGRhdGVfbWFzayAgICAgICAgICA9IDEsCiAJLnBpeGVsX3BhdHRlcm5fc2hpZnQgICAgICAgICAgICAgPSAwLAogCS5waXhlbF9wYXR0ZXJuX21hc2sgICAgICAgICAgICAgID0gMHg3LAotCS5lcG9jaF9saW5lX2NmZyAgICAgICAgICAgICAgICAgID0gMHgxNDAwMDAsCisJLnJlZ191cGRhdGVfY21kX2RhdGEgICAgICAgICAgICAgPSAweDEsCisJLmVwb2NoX2xpbmVfY2ZnICAgICAgICAgICAgICAgICAgPSAweDAwMTQwMDE0LAogCS5zb2ZfaXJxX21hc2sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKIAkuZXBvY2gwX2lycV9tYXNrICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCiAJLnJlZ191cGRhdGVfaXJxX21hc2sgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorCS5lb2ZfaXJxX21hc2sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKIH07CiAKIHN0cnVjdCBjYW1fdmZlX3RvcF92ZXIyX3JlZ19vZmZzZXRfbW9kdWxlX2N0cmwgbGVuc18xNzBfcmVnID0gewpAQCAtMjIwLDYgKzIyMyw5IEBACiAJCS5jb21wX292cndyX3N0YXR1cyAgICAgICAgICAgID0gMHgwMDAwMjA3MCwKIAkJLmR1YWxfY29tcF9lcnJvcl9zdGF0dXMgICAgICAgPSAweDAwMDAyMDc0LAogCQkuZHVhbF9jb21wX2Vycm9yX3N0YXR1cyAgICAgICA9IDB4MDAwMDIwNzgsCisJCS5hZGRyX3N5bmNfY2ZnICAgICAgICAgICAgICAgID0gMHgwMDAwMjA3QywKKwkJLmFkZHJfc3luY19mcmFtZV9oZHIgICAgICAgICAgPSAweDAwMDAyMDgwLAorCQkuYWRkcl9zeW5jX25vX3N5bmMgICAgICAgICAgICA9IDB4MDAwMDIwODQsCiAJfSwKIAkuYnVzX2NsaWVudF9yZWcgPSB7CiAJCS8qIEJVUyBDbGllbnQgMCAqLwpAQCAtNjcxLDI2ICs2NzcsMzQgQEAKIAkJLyogQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzAgKi8KIAkJewogCQkJLmNvbXBfbWFzayAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDJDLAorCQkJLmFkZHJfc3luY19tYXNrICAgICAgICAgICAgICAgPSAweDAwMDAyMDg4LAogCQl9LAogCQkvKiBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfMSAqLwogCQl7CiAJCQkuY29tcF9tYXNrICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDIwMzAsCisJCQkuYWRkcl9zeW5jX21hc2sgICAgICAgICAgICAgICA9IDB4MDAwMDIwOEMsCisKIAkJfSwKIAkJLyogQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzIgKi8KIAkJewogCQkJLmNvbXBfbWFzayAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDM0LAorCQkJLmFkZHJfc3luY19tYXNrICAgICAgICAgICAgICAgPSAweDAwMDAyMDkwLAorCiAJCX0sCiAJCS8qIENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8zICovCiAJCXsKIAkJCS5jb21wX21hc2sgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMjAzOCwKKwkJCS5hZGRyX3N5bmNfbWFzayAgICAgICAgICAgICAgID0gMHgwMDAwMjA5NCwKIAkJfSwKIAkJLyogQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzQgKi8KIAkJewogCQkJLmNvbXBfbWFzayAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAyMDNDLAorCQkJLmFkZHJfc3luY19tYXNrICAgICAgICAgICAgICAgPSAweDAwMDAyMDk4LAogCQl9LAogCQkvKiBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfNSAqLwogCQl7CiAJCQkuY29tcF9tYXNrICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDIwNDAsCisJCQkuYWRkcl9zeW5jX21hc2sgICAgICAgICAgICAgICA9IDB4MDAwMDIwOUMsCiAJCX0sCiAJfSwKIAkudmZlX291dF9od19pbmZvID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV9idXMvY2FtX3ZmZV9idXNfdmVyMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV9idXMvY2FtX3ZmZV9idXNfdmVyMi5jCmluZGV4IGMwNDFlZWYuLjAwNWQ3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfYnVzL2NhbV92ZmVfYnVzX3ZlcjIuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX2J1cy9jYW1fdmZlX2J1c192ZXIyLmMKQEAgLTEyLDcgKzEyLDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDx1YXBpL21lZGlhL2NhbV9pc3AuaD4KICNpbmNsdWRlICJjYW1faW9fdXRpbC5oIgorI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCiAjaW5jbHVkZSAiY2FtX2NkbV91dGlsLmgiCiAjaW5jbHVkZSAiY2FtX2h3X2ludGYuaCIKICNpbmNsdWRlICJjYW1faWZlX2h3X21nci5oIgpAQCAtMzMsMTQgKzM1LDE4IEBACiAKICNkZWZpbmUgQ0FNX1ZGRV9CVVNfVkVSMl9QQVlMT0FEX01BWCAgICAgICAgICAgICAyNTYKIAotI2RlZmluZSBDQU1fVkZFX1JESV9CVVNfREVGQVVMVF9XSURUSCAgICAgICAgICAgMHhGRjAxCi0jZGVmaW5lIENBTV9WRkVfUkRJX0JVU19ERUZBVUxUX1NUUklERSAgICAgICAgICAweEZGMDEKKyNkZWZpbmUgQ0FNX1ZGRV9SRElfQlVTX0RFRkFVTFRfV0lEVEggICAgICAgICAgICAgICAweEZGMDEKKyNkZWZpbmUgQ0FNX1ZGRV9SRElfQlVTX0RFRkFVTFRfU1RSSURFICAgICAgICAgICAgICAweEZGMDEKKyNkZWZpbmUgQ0FNX1ZGRV9CVVNfSU5UUkFfQ0xJRU5UX01BU0sgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgQ0FNX1ZGRV9CVVNfQUREUl9TWU5DX0lOVFJBX0NMSUVOVF9TSElGVCAgICA4CisjZGVmaW5lIENBTV9WRkVfQlVTX0FERFJfTk9fU1lOQ19ERUZBVUxUX1ZBTCAgICAgICAgMHhGRkZGRgogCiAjZGVmaW5lIEFMSUdOVVAodmFsdWUsIGFsaWdubWVudCkgXAogCSgodmFsdWUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCkKIAogI2RlZmluZSBNQVhfQlVGX1VQREFURV9SRUdfTlVNICAgXAotCShzaXplb2Yoc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfcmVnX29mZnNldF9idXNfY2xpZW50KS80KQorCSgoc2l6ZW9mKHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3JlZ19vZmZzZXRfYnVzX2NsaWVudCkgKyAgXAorCXNpemVvZihzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9yZWdfb2Zmc2V0X3Vid2NfY2xpZW50KSkvNCkKICNkZWZpbmUgTUFYX1JFR19WQUxfUEFJUl9TSVpFICAgIFwKIAkoTUFYX0JVRl9VUERBVEVfUkVHX05VTSAqIDIgKiBDQU1fUEFDS0VUX01BWF9QTEFORVMpCiAKQEAgLTcwLDYgKzc2LDE2IEBACiAJUEFDS0VSX0ZNVF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgPSAweEYsCiB9OwogCitlbnVtIGNhbV92ZmVfYnVzX2NvbXBfZ3JwX2lkIHsKKwlDQU1fVkZFX0JVU19DT01QX0dST1VQX05PTkUgPSAtRUlOVkFMLAorCUNBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMCA9IDB4MCwKKwlDQU1fVkZFX0JVU19DT01QX0dST1VQX0lEXzEgPSAweDEsCisJQ0FNX1ZGRV9CVVNfQ09NUF9HUk9VUF9JRF8yID0gMHgyLAorCUNBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMyA9IDB4MywKKwlDQU1fVkZFX0JVU19DT01QX0dST1VQX0lEXzQgPSAweDQsCisJQ0FNX1ZGRV9CVVNfQ09NUF9HUk9VUF9JRF81ID0gMHg1LAorfTsKKwogc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfY29tbW9uX2RhdGEgewogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pbmRleDsKIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lbV9iYXNlOwpAQCAtODMsNiArOTksMTAgQEAKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfaXJxX2V2dF9wYXlsb2FkICAgICAgICAgIGV2dF9wYXlsb2FkWwogCQlDQU1fVkZFX0JVU19WRVIyX1BBWUxPQURfTUFYXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGF5bG9hZF9saXN0OworCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzX211dGV4OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX21vZGU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VjX291dDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfbm9fc3luYzsKIH07CiAKIHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3dtX3Jlc291cmNlX2RhdGEgewpAQCAtOTIsNyArMTEyLDggQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3R4OwogCiAJdWludDMyX3QgICAgICAgICAgICAgaXJxX2VuYWJsZWQ7Ci0JdWludDMyX3QgICAgICAgICAgICAgaW5pdF9jZmdfZG9uZTsKKwlib29sICAgICAgICAgICAgICAgICBpbml0X2NmZ19kb25lOworCWJvb2wgICAgICAgICAgICAgICAgIGhmcl9jZmdfZG9uZTsKIAogCXVpbnQzMl90ICAgICAgICAgICAgIG9mZnNldDsKIAl1aW50MzJfdCAgICAgICAgICAgICB3aWR0aDsKQEAgLTEwMiw3ICsxMjMsNiBAQAogCWVudW0gY2FtX3ZmZV9idXNfcGFja2VyX2Zvcm1hdCBwYWNrX2ZtdDsKIAogCXVpbnQzMl90ICAgICAgICAgICAgIGJ1cnN0X2xlbjsKLQl1aW50MzJfdCAgICAgICAgICAgICBmcmFtZV9iYXNlZDsKIAogCXVpbnQzMl90ICAgICAgICAgICAgIGVuX3Vid2M7CiAJdWludDMyX3QgICAgICAgICAgICAgcGFja2VyX2NmZzsKQEAgLTExOSw2ICsxMzksNyBAQAogCXVpbnQzMl90ICAgICAgICAgICAgIGZyYW1lZHJvcF9wYXR0ZXJuOwogCiAJdWludDMyX3QgICAgICAgICAgICAgZW5fY2ZnOworCXVpbnQzMl90ICAgICAgICAgICAgIGlzX2R1YWw7CiB9OwogCiBzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9jb21wX2dycF9kYXRhIHsKQEAgLTEzNCw2ICsxNTUsMTAgQEAKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsX3NsYXZlX2NvcmU7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFfY2xpZW50X21hc2s7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlX21hc2s7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcl9zeW5jX21vZGU7CisKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlX2Rldl9jbnQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX3RyaWdnZXJfY250OwogCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3R4OwogfTsKQEAgLTE1NCw2ICsxNzksNyBAQAogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgIG1heF93aWR0aDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVpZ2h0OwogCXN0cnVjdCBjYW1fY2RtX3V0aWxzX29wcyAgICAgICAgKmNkbV91dGlsX29wczsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfbW9kZTsKIH07CiAKIHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3ByaXYgewpAQCAtMTcwLDYgKzE5NiwxMCBAQAogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycV9oYW5kbGU7CiB9OwogCitzdGF0aWMgaW50IGNhbV92ZmVfYnVzX3Byb2Nlc3NfY21kKAorCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgKnByaXYsCisJdWludDMyX3QgY21kX3R5cGUsIHZvaWQgKmNtZF9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSk7CisKIHN0YXRpYyBpbnQgY2FtX3ZmZV9idXNfZ2V0X2V2dF9wYXlsb2FkKAogCXN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX2NvbW1vbl9kYXRhICAqY29tbW9uX2RhdGEsCiAJc3RydWN0IGNhbV92ZmVfYnVzX2lycV9ldnRfcGF5bG9hZCAgKipldnRfcGF5bG9hZCkKQEAgLTE4Niw2ICsyMTYsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGVudW0gY2FtX3ZmZV9idXNfY29tcF9ncnBfaWQKKwljYW1fdmZlX2J1c19jb21wX2dycF9pZF9jb252ZXJ0KHVpbnQzMl90IGNvbXBfZ3JwKQoreworCXN3aXRjaCAoY29tcF9ncnApIHsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfMDoKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMDsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfMToKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMTsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfMjoKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMjsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfMzoKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfMzsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfNDoKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfNDsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfSURfNToKKwkJcmV0dXJuIENBTV9WRkVfQlVTX0NPTVBfR1JPVVBfSURfNTsKKwljYXNlIENBTV9JU1BfUkVTX0NPTVBfR1JPVVBfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gQ0FNX1ZGRV9CVVNfQ09NUF9HUk9VUF9OT05FOworCX0KK30KKwogc3RhdGljIGludCBjYW1fdmZlX2J1c19wdXRfZXZ0X3BheWxvYWQodm9pZCAgICAgKmNvcmVfaW5mbywKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfaXJxX2V2dF9wYXlsb2FkICAgICAqKmV2dF9wYXlsb2FkKQogewpAQCAtMjQwLDcgKzI5Miw3IEBACiAJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9DT1JFXzA6CiAJCXN3aXRjaCAoZHVhbF9zbGF2ZV9jb3JlKSB7CiAJCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfQ09SRV8xOgotCQkJKmludHJhX2NsaWVudF9tYXNrID0gMHgxOworCQkJKmludHJhX2NsaWVudF9tYXNrID0gMHgzOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfQ09SRV8yOgogCQkJKmludHJhX2NsaWVudF9tYXNrID0gMHgyOwpAQCAtMjkyLDYgKzM0NCwzNCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGJvb2wgY2FtX3ZmZV9idXNfY2FuX2JlX3NlY3VyZSh1aW50MzJfdCBvdXRfdHlwZSkKK3sKKwlzd2l0Y2ggKG91dF90eXBlKSB7CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfRlVMTDoKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9EUzQ6CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfRFMxNjoKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9GRDoKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9SQVdfRFVNUDoKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9SREkwOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1JESTE6CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfUkRJMjoKKwkJcmV0dXJuIHRydWU7CisKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9QREFGOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1NUQVRTX0hEUl9CRToKKwljYXNlIENBTV9WRkVfQlVTX1ZFUjJfVkZFX09VVF9TVEFUU19IRFJfQkhJU1Q6CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfU1RBVFNfVExfQkc6CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfU1RBVFNfQkY6CisJY2FzZSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfU1RBVFNfQVdCX0JHOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1NUQVRTX0JISVNUOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1NUQVRTX1JTOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1NUQVRTX0NTOgorCWNhc2UgQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfT1VUX1NUQVRTX0lISVNUOgorCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBlbnVtIGNhbV92ZmVfYnVzX3ZlcjJfdmZlX291dF90eXBlCiAJY2FtX3ZmZV9idXNfZ2V0X291dF9yZXNfaWQodWludDMyX3QgcmVzX3R5cGUpCiB7CkBAIC0zNTksNyArNDM5LDYgQEAKIAkJY2FzZSBDQU1fRk9STUFUX0RQQ01fMTRfOF8xNDoKIAkJY2FzZSBDQU1fRk9STUFUX0RQQ01fMTRfMTBfMTQ6CiAJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjg6Ci0JCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2Xzg6CiAJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzEwOgogCQljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xMjoKIAkJY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTQ6CkBAIC02NTYsOCArNzM1LDIwIEBACiAJY2FzZSBDQU1fRk9STUFUX1VCV0NfTlYxMjoKIAljYXNlIENBTV9GT1JNQVRfVUJXQ19OVjEyXzRSOgogCQlyZXR1cm4gUEFDS0VSX0ZNVF9QTEFJTl84X0xTQl9NU0JfMTA7CisJY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTY6CisJCXJldHVybiBQQUNLRVJfRk1UX1BMQUlOXzE2XzE2QlBQOwogCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjY0OgogCQlyZXR1cm4gUEFDS0VSX0ZNVF9QTEFJTl82NDsKKwljYXNlIENBTV9GT1JNQVRfUExBSU44OgorCQlyZXR1cm4gUEFDS0VSX0ZNVF9QTEFJTl84OworCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzEwOgorCQlyZXR1cm4gUEFDS0VSX0ZNVF9QTEFJTl8xNl8xMEJQUDsKKwljYXNlIENBTV9GT1JNQVRfUExBSU4xNl8xMjoKKwkJcmV0dXJuIFBBQ0tFUl9GTVRfUExBSU5fMTZfMTJCUFA7CisJY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTQ6CisJCXJldHVybiBQQUNLRVJfRk1UX1BMQUlOXzE2XzE0QlBQOworCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjMyXzIwOgorCQlyZXR1cm4gUEFDS0VSX0ZNVF9QTEFJTl8zMl8yMEJQUDsKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfNjoKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfODoKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTA6CkBAIC02NjUsMjAgKzc1NiwxNiBAQAogCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xNDoKIAljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTY6CiAJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzIwOgotCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjEyODoKLQljYXNlIENBTV9GT1JNQVRfUExBSU44OgogCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2Xzg6Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTA6Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTI6Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTQ6Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMTZfMTY6Ci0JY2FzZSBDQU1fRk9STUFUX1BMQUlOMzJfMjA6CisJY2FzZSBDQU1fRk9STUFUX1BMQUlOMTI4OgogCWNhc2UgQ0FNX0ZPUk1BVF9QRDg6CiAJY2FzZSBDQU1fRk9STUFUX1BEMTA6CiAJCXJldHVybiBQQUNLRVJfRk1UX1BMQUlOXzEyODsKIAljYXNlIENBTV9GT1JNQVRfVUJXQ19UUDEwOgogCWNhc2UgQ0FNX0ZPUk1BVF9UUDEwOgogCQlyZXR1cm4gUEFDS0VSX0ZNVF9UUF8xMDsKKwljYXNlIENBTV9GT1JNQVRfQVJHQl8xNDoKKwkJcmV0dXJuIFBBQ0tFUl9GTVRfQVJHQl8xNDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gUEFDS0VSX0ZNVF9NQVg7CiAJfQpAQCAtNjkxLDEwICs3NzgsMTAgQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjdHgsCiAJZW51bSBjYW1fdmZlX2J1c192ZXIyX3ZmZV9vdXRfdHlwZSAgICAgdmZlX291dF9yZXNfaWQsCiAJZW51bSBjYW1fdmZlX2J1c19wbGFuZV90eXBlICAgICAgICAgICAgcGxhbmUsCi0JZW51bSBjYW1faXNwX2h3X3NwbGl0X2lkICAgICAgICAgICAgICAgc3BsaXRfaWQsCiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlX2lycSwKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICAgKip3bV9yZXMsCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2xpZW50X2RvbmVfbWFzaykKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbGllbnRfZG9uZV9tYXNrLAorCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2R1YWwpCiB7CiAJdWludDMyX3Qgd21faWR4ID0gMDsKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICAgICAgICAqd21fcmVzX2xvY2FsID0gTlVMTDsKQEAgLTcyMywxNCArODEwLDcyIEBACiAKIAlyc3JjX2RhdGEtPndpZHRoID0gb3V0X3BvcnRfaW5mby0+d2lkdGg7CiAJcnNyY19kYXRhLT5oZWlnaHQgPSBvdXRfcG9ydF9pbmZvLT5oZWlnaHQ7CisJcnNyY19kYXRhLT5pc19kdWFsID0gaXNfZHVhbDsKKwkvKiBTZXQgV00gb2Zmc2V0IHZhbHVlIHRvIGRlZmF1bHQgKi8KKwlyc3JjX2RhdGEtPm9mZnNldCAgPSAwOworCUNBTV9EQkcoQ0FNX0lTUCwgIldNICVkIHdpZHRoICVkIGhlaWdodCAlZCIsIHJzcmNfZGF0YS0+aW5kZXgsCisJCXJzcmNfZGF0YS0+d2lkdGgsIHJzcmNfZGF0YS0+aGVpZ2h0KTsKIAogCWlmIChyc3JjX2RhdGEtPmluZGV4IDwgMykgewogCQkvKiBXcml0ZSBtYXN0ZXIgMC0yIHJlZmVycyB0byBSREkgMC8gUkRJIDEvUkRJIDIgKi8KLQkJcnNyY19kYXRhLT53aWR0aCA9IENBTV9WRkVfUkRJX0JVU19ERUZBVUxUX1dJRFRIOwotCQlyc3JjX2RhdGEtPmhlaWdodCA9IDA7Ci0JCXJzcmNfZGF0YS0+c3RyaWRlID0gQ0FNX1ZGRV9SRElfQlVTX0RFRkFVTFRfU1RSSURFOwotCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHgwOwotCQlyc3JjX2RhdGEtPmVuX2NmZyA9IDB4MzsKKwkJc3dpdGNoIChyc3JjX2RhdGEtPmZvcm1hdCkgeworCQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfNjoKKwkJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzg6CisJCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xMDoKKwkJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzEyOgorCQljYXNlIENBTV9GT1JNQVRfTUlQSV9SQVdfMTQ6CisJCWNhc2UgQ0FNX0ZPUk1BVF9NSVBJX1JBV18xNjoKKwkJY2FzZSBDQU1fRk9STUFUX01JUElfUkFXXzIwOgorCQljYXNlIENBTV9GT1JNQVRfUExBSU4xMjg6CisJCQlyc3JjX2RhdGEtPndpZHRoID0gQ0FNX1ZGRV9SRElfQlVTX0RFRkFVTFRfV0lEVEg7CisJCQlyc3JjX2RhdGEtPmhlaWdodCA9IDA7CisJCQlyc3JjX2RhdGEtPnN0cmlkZSA9IENBTV9WRkVfUkRJX0JVU19ERUZBVUxUX1NUUklERTsKKwkJCXJzcmNfZGF0YS0+cGFja19mbXQgPSAweDA7CisJCQlyc3JjX2RhdGEtPmVuX2NmZyA9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIENBTV9GT1JNQVRfUExBSU44OgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHgxOworCQkJcnNyY19kYXRhLT53aWR0aCA9IHJzcmNfZGF0YS0+d2lkdGggKiAyOworCQkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzEwOgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHgyOworCQkJcnNyY19kYXRhLT53aWR0aCA9IHJzcmNfZGF0YS0+d2lkdGggKiAyOworCQkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzEyOgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHgzOworCQkJcnNyY19kYXRhLT53aWR0aCA9IHJzcmNfZGF0YS0+d2lkdGggKiAyOworCQkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzE0OgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHg0OworCQkJcnNyY19kYXRhLT53aWR0aCA9IHJzcmNfZGF0YS0+d2lkdGggKiAyOworCQkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjE2XzE2OgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHg1OworCQkJcnNyY19kYXRhLT53aWR0aCA9IHJzcmNfZGF0YS0+d2lkdGggKiAyOworCQkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjMyXzIwOgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHg5OworCQkJYnJlYWs7CisJCWNhc2UgQ0FNX0ZPUk1BVF9QTEFJTjY0OgorCQkJcnNyY19kYXRhLT5lbl9jZmcgPSAweDE7CisJCQlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMHhBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlDQU1fRVJSKENBTV9JU1AsICJVbnN1cHBvcnRlZCBSREkgZm9ybWF0ICVkIiwKKwkJCQlyc3JjX2RhdGEtPmZvcm1hdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0gZWxzZSBpZiAocnNyY19kYXRhLT5pbmRleCA8IDUgfHwKIAkJcnNyY19kYXRhLT5pbmRleCA9PSA3IHx8IHJzcmNfZGF0YS0+aW5kZXggPT0gOCkgewogCQkvKiBXcml0ZSBtYXN0ZXIgMywgNCAtIGZvciBGdWxsIE9VVCAsIDctOCAgRkQgT1VUICovCkBAIC03NDUsNyArODkwLDcgQEAKIAkJCWNhc2UgUExBTkVfWToKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBwbGFuZSAlZFxuIiwgcGxhbmUpOworCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgcGxhbmUgJWQiLCBwbGFuZSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlicmVhazsKQEAgLTc2MSw3ICs5MDYsNyBAQAogCQkJY2FzZSBQTEFORV9ZOgogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIHBsYW5lICVkXG4iLCBwbGFuZSk7CisJCQkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBwbGFuZSAlZCIsIHBsYW5lKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzc2LDcgKzkyMSw3IEBACiAJCQljYXNlIFBMQU5FX1k6CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgcGxhbmUgJWRcbiIsIHBsYW5lKTsKKwkJCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIHBsYW5lICVkIiwgcGxhbmUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJYnJlYWs7CkBAIC03OTAsMTIgKzkzNSwxMiBAQAogCQkJY2FzZSBQTEFORV9ZOgogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIHBsYW5lICVkXG4iLCBwbGFuZSk7CisJCQkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBwbGFuZSAlZCIsIHBsYW5lKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBmb3JtYXQgJWRcbiIsCisJCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGZvcm1hdCAlZCIsCiAJCQkJcnNyY19kYXRhLT5mb3JtYXQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTgwNiwxNSArOTUxLDE3IEBACiAJCXJzcmNfZGF0YS0+aGVpZ2h0ID0gMDsKIAkJcnNyY19kYXRhLT5zdHJpZGUgPSAxOwogCQlyc3JjX2RhdGEtPmVuX2NmZyA9IDB4MzsKLQl9IGVsc2UgewotCQkvKiBXcml0ZSBtYXN0ZXIgNS02IERTIHBvcnRzICwgOSAtIFJhdyBkdW1wICwgMTAgUERBRiAqLworCX0gIGVsc2UgaWYgKHJzcmNfZGF0YS0+aW5kZXggPT0gOSkgeworCQkvKiBXcml0ZSBtYXN0ZXIgOSAtIFJhdyBkdW1wICovCisJCXJzcmNfZGF0YS0+d2lkdGggPSByc3JjX2RhdGEtPndpZHRoICogMjsKKwkJcnNyY19kYXRhLT5zdHJpZGUgPSByc3JjX2RhdGEtPndpZHRoOworCQlyc3JjX2RhdGEtPmVuX2NmZyA9IDB4MTsKKwl9ICBlbHNlIHsKKwkJLyogV3JpdGUgbWFzdGVyIDUtNiBEUyBwb3J0cywgMTAgUERBRiAqLwogCQlyc3JjX2RhdGEtPndpZHRoID0gcnNyY19kYXRhLT53aWR0aCAqIDQ7CiAJCXJzcmNfZGF0YS0+aGVpZ2h0ID0gcnNyY19kYXRhLT5oZWlnaHQgLyAyOwogCQlyc3JjX2RhdGEtPmVuX2NmZyA9IDB4MTsKIAl9Ci0JaWYgKHZmZV9vdXRfcmVzX2lkID49IENBTV9JU1BfSUZFX09VVF9SRVNfUkRJXzAgJiYKLQkJdmZlX291dF9yZXNfaWQgPD0gQ0FNX0lTUF9JRkVfT1VUX1JFU19SRElfMykKLQkJcnNyY19kYXRhLT5mcmFtZV9iYXNlZCA9IDE7CiAKIAkqY2xpZW50X2RvbmVfbWFzayA9ICgxIDw8IHdtX2lkeCk7CiAJKndtX3JlcyA9IHdtX3Jlc19sb2NhbDsKQEAgLTgzNiw3ICs5ODMsNiBAQAogCXJzcmNfZGF0YS0+Zm9ybWF0ID0gMDsKIAlyc3JjX2RhdGEtPnBhY2tfZm10ID0gMDsKIAlyc3JjX2RhdGEtPmJ1cnN0X2xlbiA9IDA7Ci0JcnNyY19kYXRhLT5mcmFtZV9iYXNlZCA9IDA7CiAJcnNyY19kYXRhLT5pcnFfc3Vic2FtcGxlX3BlcmlvZCA9IDA7CiAJcnNyY19kYXRhLT5pcnFfc3Vic2FtcGxlX3BhdHRlcm4gPSAwOwogCXJzcmNfZGF0YS0+ZnJhbWVkcm9wX3BlcmlvZCA9IDA7CkBAIC04NDksOCArOTk1LDEwIEBACiAJcnNyY19kYXRhLT51YndjX21ldGFfc3RyaWRlID0gMDsKIAlyc3JjX2RhdGEtPnVid2NfbW9kZV9jZmcgPSAwOwogCXJzcmNfZGF0YS0+dWJ3Y19tZXRhX29mZnNldCA9IDA7Ci0JcnNyY19kYXRhLT5pbml0X2NmZ19kb25lID0gMDsKKwlyc3JjX2RhdGEtPmluaXRfY2ZnX2RvbmUgPSBmYWxzZTsKKwlyc3JjX2RhdGEtPmhmcl9jZmdfZG9uZSA9IGZhbHNlOwogCXJzcmNfZGF0YS0+ZW5fY2ZnID0gMDsKKwlyc3JjX2RhdGEtPmlzX2R1YWwgPSAwOwogCiAJd21fcmVzLT50YXNrbGV0X2luZm8gPSBOVUxMOwogCXdtX3Jlcy0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9BVkFJTEFCTEU7CkBAIC05NjUsNyArMTExMyw3IEBACiAKIAl3bV9yZXMgPSB0aF9wYXlsb2FkLT5oYW5kbGVyX3ByaXY7CiAJaWYgKCF3bV9yZXMpIHsKLQkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsICJFcnJvciEgTm8gcmVzb3VyY2VcbiIpOworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwgIkVycm9yOiBObyByZXNvdXJjZSIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTk3Nyw3ICsxMTI1LDcgQEAKIAlyYyAgPSBjYW1fdmZlX2J1c19nZXRfZXZ0X3BheWxvYWQocnNyY19kYXRhLT5jb21tb25fZGF0YSwgJmV2dF9wYXlsb2FkKTsKIAlpZiAocmMpIHsKIAkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsCi0JCQkiTm8gdGFza2xldF9jbWQgaXMgZnJlZSBpbiBxdWV1ZVxuIik7CisJCQkiTm8gdGFza2xldF9jbWQgaXMgZnJlZSBpbiBxdWV1ZSIpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0xMDc0LDEwICsxMjIyLDggQEAKIAogCXJzcmNfZGF0YSA9IHdtX3Jlcy0+cmVzX3ByaXY7CiAJd21fcmVzLT5yZXNfcHJpdiA9IE5VTEw7Ci0JaWYgKCFyc3JjX2RhdGEpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIFdNIHJlcyBwcml2IGlzIE5VTEwiKTsKKwlpZiAoIXJzcmNfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWtmcmVlKHJzcmNfZGF0YSk7CiAKIAlyZXR1cm4gMDsKQEAgLTExMjcsMTYgKzEyNzMsMjMgQEAKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICoqY29tcF9ncnApCiB7CiAJaW50IHJjID0gMDsKKwl1aW50MzJfdCBidXNfY29tcF9ncnBfaWQ7CiAJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAgICAgICAgICAgKmNvbXBfZ3JwX2xvY2FsID0gTlVMTDsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9jb21wX2dycF9kYXRhICAqcnNyY19kYXRhID0gTlVMTDsKIAotCS8qIENoZWNrIGlmIG1hdGNoaW5nIGNvbXBfZ3JwIGFscmVhZHkgYWNxdWlyZWQgKi8KLQljYW1fdmZlX2J1c19tYXRjaF9jb21wX2dycCh2ZXIyX2J1c19wcml2LCAmY29tcF9ncnBfbG9jYWwsCi0JCW91dF9wb3J0X2luZm8tPmNvbXBfZ3JwX2lkLCB1bmlxdWVfaWQpOworCWJ1c19jb21wX2dycF9pZCA9IGNhbV92ZmVfYnVzX2NvbXBfZ3JwX2lkX2NvbnZlcnQoCisJCW91dF9wb3J0X2luZm8tPmNvbXBfZ3JwX2lkKTsKKwkvKiBQZXJmb3JtIG1hdGNoIG9ubHkgaWYgdGhlcmUgaXMgdmFsaWQgY29tcCBncnAgcmVxdWVzdCAqLworCWlmIChvdXRfcG9ydF9pbmZvLT5jb21wX2dycF9pZCAhPSBDQU1fSVNQX1JFU19DT01QX0dST1VQX05PTkUpIHsKKwkJLyogQ2hlY2sgaWYgbWF0Y2hpbmcgY29tcF9ncnAgYWxyZWFkeSBhY3F1aXJlZCAqLworCQljYW1fdmZlX2J1c19tYXRjaF9jb21wX2dycCh2ZXIyX2J1c19wcml2LCAmY29tcF9ncnBfbG9jYWwsCisJCQlidXNfY29tcF9ncnBfaWQsIHVuaXF1ZV9pZCk7CisJfQogCiAJaWYgKCFjb21wX2dycF9sb2NhbCkgewogCQkvKiBGaXJzdCBmaW5kIGEgZnJlZSBncm91cCAqLwogCQlpZiAoaXNfZHVhbCkgeworCQkJQ0FNX0RCRyhDQU1fSVNQLCAiQWNxdWlyZSBkdWFsIGNvbXAgZ3JvdXAiKTsKIAkJCWlmIChsaXN0X2VtcHR5KCZ2ZXIyX2J1c19wcml2LT5mcmVlX2R1YWxfY29tcF9ncnApKSB7CiAJCQkJQ0FNX0VSUihDQU1fSVNQLCAiTm8gRnJlZSBDb21wb3NpdGUgR3JvdXAiKTsKIAkJCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExNDksNyArMTMwMiwxMCBAQAogCQkJCWR1YWxfc2xhdmVfY29yZSwKIAkJCQljb21wX2dycF9sb2NhbC0+aHdfaW50Zi0+aHdfaWR4LAogCQkJCSZyc3JjX2RhdGEtPmludHJhX2NsaWVudF9tYXNrKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CiAJCX0gZWxzZSB7CisJCQlDQU1fREJHKENBTV9JU1AsICJBY3F1aXJlIGNvbXAgZ3JvdXAiKTsKIAkJCWlmIChsaXN0X2VtcHR5KCZ2ZXIyX2J1c19wcml2LT5mcmVlX2NvbXBfZ3JwKSkgewogCQkJCUNBTV9FUlIoQ0FNX0lTUCwgIk5vIEZyZWUgQ29tcG9zaXRlIEdyb3VwIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMTY3LDcgKzEzMjMsMTIgQEAKIAkJcnNyY19kYXRhLT5pc19tYXN0ZXIgPSBpc19tYXN0ZXI7CiAJCXJzcmNfZGF0YS0+Y29tcG9zaXRlX21hc2sgPSAwOwogCQlyc3JjX2RhdGEtPnVuaXF1ZV9pZCA9IHVuaXF1ZV9pZDsKLQkJcnNyY19kYXRhLT5jb21wX2dycF9sb2NhbF9pZHggPSBvdXRfcG9ydF9pbmZvLT5jb21wX2dycF9pZDsKKwkJcnNyY19kYXRhLT5jb21wX2dycF9sb2NhbF9pZHggPSBidXNfY29tcF9ncnBfaWQ7CisKKwkJaWYgKGlzX21hc3RlcikKKwkJCXJzcmNfZGF0YS0+YWRkcl9zeW5jX21vZGUgPSAwOworCQllbHNlCisJCQlyc3JjX2RhdGEtPmFkZHJfc3luY19tb2RlID0gMTsKIAogCQlsaXN0X2FkZF90YWlsKCZjb21wX2dycF9sb2NhbC0+bGlzdCwKIAkJCSZ2ZXIyX2J1c19wcml2LT51c2VkX2NvbXBfZ3JwKTsKQEAgLTExODQsNyArMTM0NSwxMCBAQAogCQl9CiAJfQogCisJQ0FNX0RCRyhDQU1fSVNQLCAiQ29tcCBHcnAgdHlwZSAldSIsIHJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSk7CisKIAlyc3JjX2RhdGEtPmN0eCA9IGN0eDsKKwlyc3JjX2RhdGEtPmFjcXVpcmVfZGV2X2NudCsrOwogCSpjb21wX2dycCA9IGNvbXBfZ3JwX2xvY2FsOwogCiAJcmV0dXJuIHJjOwpAQCAtMTE5OSwxNiArMTM2MywyMyBAQAogCWludCBtYXRjaF9mb3VuZCA9IDA7CiAKIAlpZiAoIWluX2NvbXBfZ3JwKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgUGFyYW1zIENvbXAgR3JwICVwSyIsIGluX3JzcmNfZGF0YSk7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgUGFyYW1zIENvbXAgR3JwICVwSyIsIGluX2NvbXBfZ3JwKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGluX2NvbXBfZ3JwLT5yZXNfc3RhdGUgPT0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9BVkFJTEFCTEUpIHsKLQkJLyogQWxyZWFkeSBSZWxlYXNlZC4gRG8gTm90aGluZyAqLworCQlDQU1fRVJSKENBTV9JU1AsICJBbHJlYWR5IHJlbGVhc2VkIENvbXAgR3JwIik7CiAJCXJldHVybiAwOwogCX0KIAorCWlmIChpbl9jb21wX2dycC0+cmVzX3N0YXRlID09IENBTV9JU1BfUkVTT1VSQ0VfU1RBVEVfU1RSRUFNSU5HKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgU3RhdGUgJWQiLAorCQkJaW5fY29tcF9ncnAtPnJlc19zdGF0ZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJaW5fcnNyY19kYXRhID0gaW5fY29tcF9ncnAtPnJlc19wcml2OworCUNBTV9EQkcoQ0FNX0lTUCwgIkNvbXAgR3JwIHR5cGUgJXUiLCBpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wX2dycCwgJnZlcjJfYnVzX3ByaXYtPnVzZWRfY29tcF9ncnAsIGxpc3QpIHsKIAkJaWYgKGNvbXBfZ3JwID09IGluX2NvbXBfZ3JwKSB7CkBAIC0xMjIzLDIzICsxMzk0LDMyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWluX3JzcmNfZGF0YS0+YWNxdWlyZV9kZXZfY250LS07CisJaWYgKGluX3JzcmNfZGF0YS0+YWNxdWlyZV9kZXZfY250ID09IDApIHsKKwkJbGlzdF9kZWwoJmNvbXBfZ3JwLT5saXN0KTsKIAotCWxpc3RfZGVsKCZjb21wX2dycC0+bGlzdCk7Ci0JaWYgKGluX3JzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA+PSBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfMCAmJgotCQlpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzUpCi0JCWxpc3RfYWRkX3RhaWwoJmNvbXBfZ3JwLT5saXN0LAotCQkJJnZlcjJfYnVzX3ByaXYtPmZyZWVfZHVhbF9jb21wX2dycCk7Ci0JZWxzZSBpZiAoaW5fcnNyY19kYXRhLT5jb21wX2dycF90eXBlID49IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfMAotCQkmJiBpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF81KQotCQlsaXN0X2FkZF90YWlsKCZjb21wX2dycC0+bGlzdCwgJnZlcjJfYnVzX3ByaXYtPmZyZWVfY29tcF9ncnApOworCQlpbl9yc3JjX2RhdGEtPnVuaXF1ZV9pZCA9IDA7CisJCWluX3JzcmNfZGF0YS0+Y29tcF9ncnBfbG9jYWxfaWR4ID0gQ0FNX1ZGRV9CVVNfQ09NUF9HUk9VUF9OT05FOworCQlpbl9yc3JjX2RhdGEtPmNvbXBvc2l0ZV9tYXNrID0gMDsKKwkJaW5fcnNyY19kYXRhLT5kdWFsX3NsYXZlX2NvcmUgPSBDQU1fVkZFX0JVU19WRVIyX1ZGRV9DT1JFX01BWDsKKwkJaW5fcnNyY19kYXRhLT5hZGRyX3N5bmNfbW9kZSA9IDA7CiAKLQlpbl9yc3JjX2RhdGEtPnVuaXF1ZV9pZCA9IDA7Ci0JaW5fcnNyY19kYXRhLT5jb21wX2dycF9sb2NhbF9pZHggPSAwOwotCWluX3JzcmNfZGF0YS0+Y29tcG9zaXRlX21hc2sgPSAwOwotCWluX3JzcmNfZGF0YS0+ZHVhbF9zbGF2ZV9jb3JlID0gQ0FNX1ZGRV9CVVNfVkVSMl9WRkVfQ09SRV9NQVg7CisJCWNvbXBfZ3JwLT50YXNrbGV0X2luZm8gPSBOVUxMOworCQljb21wX2dycC0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9BVkFJTEFCTEU7CiAKLQljb21wX2dycC0+dGFza2xldF9pbmZvID0gTlVMTDsKLQljb21wX2dycC0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9BVkFJTEFCTEU7CisJCWlmIChpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPj0KKwkJCUNBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8wICYmCisJCQlpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0KKwkJCUNBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF81KQorCQkJbGlzdF9hZGRfdGFpbCgmY29tcF9ncnAtPmxpc3QsCisJCQkJJnZlcjJfYnVzX3ByaXYtPmZyZWVfZHVhbF9jb21wX2dycCk7CisJCWVsc2UgaWYgKGluX3JzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA+PQorCQkJQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF8wICYmCisJCQlpbl9yc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0KKwkJCUNBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfNSkKKwkJCWxpc3RfYWRkX3RhaWwoJmNvbXBfZ3JwLT5saXN0LAorCQkJCSZ2ZXIyX2J1c19wcml2LT5mcmVlX2NvbXBfZ3JwKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNDcsNTUgKzE0MjcsMTAzIEBACiBzdGF0aWMgaW50IGNhbV92ZmVfYnVzX3N0YXJ0X2NvbXBfZ3JwKHN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgKmNvbXBfZ3JwKQogewogCWludCByYyA9IDA7CisJdWludDMyX3QgYWRkcl9zeW5jX2NmZzsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9jb21wX2dycF9kYXRhICAgICAgKnJzcmNfZGF0YSA9CiAJCWNvbXBfZ3JwLT5yZXNfcHJpdjsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9jb21tb25fZGF0YSAgICAgICAgKmNvbW1vbl9kYXRhID0KIAkJcnNyY19kYXRhLT5jb21tb25fZGF0YTsKIAl1aW50MzJfdCBidXNfaXJxX3JlZ19tYXNrW0NBTV9WRkVfQlVTX0lSUV9NQVhdID0gezB9OwogCisJQ0FNX0RCRyhDQU1fSVNQLCAiY29tcCBncm91cCBpZDolZCBzdHJlYW1pbmcgc3RhdGU6JWQiLAorCQlyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUsIGNvbXBfZ3JwLT5yZXNfc3RhdGUpOworCiAJY2FtX2lvX3dfbWIocnNyY19kYXRhLT5jb21wb3NpdGVfbWFzaywgY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKIAkJcnNyY19kYXRhLT5od19yZWdzLT5jb21wX21hc2spOworCWlmIChjb21wX2dycC0+cmVzX3N0YXRlID09IENBTV9JU1BfUkVTT1VSQ0VfU1RBVEVfU1RSRUFNSU5HKQorCQlyZXR1cm4gMDsKIAogCUNBTV9EQkcoQ0FNX0lTUCwgImNvbXBvc2l0ZV9tYXNrIGlzIDB4JXgiLCByc3JjX2RhdGEtPmNvbXBvc2l0ZV9tYXNrKTsKIAlDQU1fREJHKENBTV9JU1AsICJjb21wb3NpdGVfbWFzayBhZGRyIDB4JXgiLAogCQlyc3JjX2RhdGEtPmh3X3JlZ3MtPmNvbXBfbWFzayk7CiAKIAlpZiAocnNyY19kYXRhLT5jb21wX2dycF90eXBlID49IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8wICYmCi0JCXJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA8PSBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfNSAmJgotCQlyc3JjX2RhdGEtPmlzX21hc3RlcikgeworCQlyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzUpIHsKIAkJaW50IGR1YWxfY29tcF9ncnAgPSAocnNyY19kYXRhLT5jb21wX2dycF90eXBlIC0KIAkJCUNBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8wKTsKLQkJaW50IGludHJhX2NsaWVudF9lbiA9IGNhbV9pb19yX21iKGNvbW1vbl9kYXRhLT5tZW1fYmFzZSArCi0JCQljb21tb25fZGF0YS0+Y29tbW9uX3JlZy0+ZHVhbF9tYXN0ZXJfY29tcF9jZmcpOwogCi0JCS8qIDIgQml0cyBwZXIgY29tcF9ncnAuIEhlbmNlIGxlZnQgc2hpZnQgYnkgY29tcF9ncnAgKiAyICovCi0JCWludHJhX2NsaWVudF9lbiB8PQotCQkJKHJzcmNfZGF0YS0+aW50cmFfY2xpZW50X21hc2sgPDwgZHVhbF9jb21wX2dycCAqIDIpOworCQlpZiAocnNyY19kYXRhLT5pc19tYXN0ZXIpIHsKKwkJCWludCBpbnRyYV9jbGllbnRfZW4gPSBjYW1faW9fcl9tYigKKwkJCQljb21tb25fZGF0YS0+bWVtX2Jhc2UgKworCQkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5kdWFsX21hc3Rlcl9jb21wX2NmZyk7CiAKLQkJY2FtX2lvX3dfbWIoaW50cmFfY2xpZW50X2VuLCBjb21tb25fZGF0YS0+bWVtX2Jhc2UgKwotCQkJY29tbW9uX2RhdGEtPmNvbW1vbl9yZWctPmR1YWxfbWFzdGVyX2NvbXBfY2ZnKTsKKwkJCS8qCisJCQkgKiAyIEJpdHMgcGVyIGNvbXBfZ3JwLiBIZW5jZSBsZWZ0IHNoaWZ0IGJ5CisJCQkgKiBjb21wX2dycCAqIDIKKwkJCSAqLworCQkJaW50cmFfY2xpZW50X2VuIHw9CisJCQkJKHJzcmNfZGF0YS0+aW50cmFfY2xpZW50X21hc2sgPDwKKwkJCQkJKGR1YWxfY29tcF9ncnAgKiAyKSk7CiAKLQkJYnVzX2lycV9yZWdfbWFza1tDQU1fVkZFX0JVU19JUlFfUkVHMl0gPSAoMSA8PCBkdWFsX2NvbXBfZ3JwKTsKKwkJCWNhbV9pb193X21iKGludHJhX2NsaWVudF9lbiwgY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKKwkJCQljb21tb25fZGF0YS0+Y29tbW9uX3JlZy0+ZHVhbF9tYXN0ZXJfY29tcF9jZmcpOworCisJCQlidXNfaXJxX3JlZ19tYXNrW0NBTV9WRkVfQlVTX0lSUV9SRUcyXSA9CisJCQkJKDEgPDwgZHVhbF9jb21wX2dycCk7CisJCX0KKworCQlDQU1fREJHKENBTV9JU1AsICJhZGRyX3N5bmNfbWFzayBhZGRyIDB4JXgiLAorCQkJcnNyY19kYXRhLT5od19yZWdzLT5hZGRyX3N5bmNfbWFzayk7CisJCWNhbV9pb193X21iKHJzcmNfZGF0YS0+Y29tcG9zaXRlX21hc2ssIGNvbW1vbl9kYXRhLT5tZW1fYmFzZSArCisJCQlyc3JjX2RhdGEtPmh3X3JlZ3MtPmFkZHJfc3luY19tYXNrKTsKKworCQlhZGRyX3N5bmNfY2ZnID0gY2FtX2lvX3JfbWIoY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKKwkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5hZGRyX3N5bmNfY2ZnKTsKKwkJYWRkcl9zeW5jX2NmZyB8PSAocnNyY19kYXRhLT5hZGRyX3N5bmNfbW9kZSA8PCBkdWFsX2NvbXBfZ3JwKTsKKwkJLyoKKwkJICogMiBCaXRzIHBlciBkdWFsX2NvbXBfZ3JwLiBkdWFsX2NvbXBfZ3JwIHN0YXRzIGF0IGJpdCBudW1iZXIKKwkJICogOC4gSGVuY2UgbGVmdCBzaGlmdCBjZHVhbF9jb21wX2dycCBkdWFsIGNvbXBfZ3JwICogMiBhbmQKKwkJICogYWRkIDgKKwkJICovCisJCWFkZHJfc3luY19jZmcgfD0KKwkJCShyc3JjX2RhdGEtPmludHJhX2NsaWVudF9tYXNrIDw8CisJCQkJKChkdWFsX2NvbXBfZ3JwICogMikgKworCQkJCUNBTV9WRkVfQlVTX0FERFJfU1lOQ19JTlRSQV9DTElFTlRfU0hJRlQpKTsKKwkJY2FtX2lvX3dfbWIoYWRkcl9zeW5jX2NmZywgY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKKwkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5hZGRyX3N5bmNfY2ZnKTsKKworCQljb21tb25fZGF0YS0+YWRkcl9ub19zeW5jICY9IH4ocnNyY19kYXRhLT5jb21wb3NpdGVfbWFzayk7CisJCWNhbV9pb193X21iKGNvbW1vbl9kYXRhLT5hZGRyX25vX3N5bmMsIGNvbW1vbl9kYXRhLT5tZW1fYmFzZSArCisJCQljb21tb25fZGF0YS0+Y29tbW9uX3JlZy0+YWRkcl9zeW5jX25vX3N5bmMpOworCQlDQU1fREJHKENBTV9JU1AsICJhZGRyX3N5bmNfY2ZnOiAweCV4IGFkZHJfbm9fc3luY19jZmc6IDB4JXgiLAorCQkJYWRkcl9zeW5jX2NmZywgY29tbW9uX2RhdGEtPmFkZHJfbm9fc3luYyk7CiAJfSBlbHNlIHsKIAkJLyogSVJRIGJpdHMgZm9yIENPTVAgR1JQIHN0YXJ0IGF0IDUuIFNvIGFkZCA1IHRvIHRoZSBzaGlmdCAqLwogCQlidXNfaXJxX3JlZ19tYXNrW0NBTV9WRkVfQlVTX0lSUV9SRUcwXSA9CiAJCQkoMSA8PCAocnNyY19kYXRhLT5jb21wX2dycF90eXBlICsgNSkpOwogCX0KIAotCS8qIFN1YnNjcmliZSBJUlEgKi8KKwkvKgorCSAqIEZvciBEdWFsIGNvbXBvc2l0ZSBzdWJzY3JpYmUgSVJRIG9ubHkgZm9yIG1hc3RlcgorCSAqIEZvciByZWd1bGFyIGNvbXBvc2l0ZSwgc3Vic2NyaWJlIElSUSBhbHdheXMKKwkgKi8KIAlDQU1fREJHKENBTV9JU1AsICJTdWJzY3JpYmUgQ09NUF9HUlAlZCBJUlEiLCByc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUpOwotCWNvbXBfZ3JwLT5pcnFfaGFuZGxlID0gY2FtX2lycV9jb250cm9sbGVyX3N1YnNjcmliZV9pcnEoCi0JCWNvbW1vbl9kYXRhLT5idXNfaXJxX2NvbnRyb2xsZXIsIENBTV9JUlFfUFJJT1JJVFlfMSwKLQkJYnVzX2lycV9yZWdfbWFzaywgY29tcF9ncnAsCi0JCWNvbXBfZ3JwLT50b3BfaGFsZl9oYW5kbGVyLAotCQljYW1faWZlX21ncl9kb190YXNrbGV0X2J1Zl9kb25lLAotCQljb21wX2dycC0+dGFza2xldF9pbmZvLCBjYW1fdGFza2xldF9lbnF1ZXVlX2NtZCk7Ci0JaWYgKGNvbXBfZ3JwLT5pcnFfaGFuZGxlIDwgMCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJTdWJzY3JpYmUgSVJRIGZhaWxlZCBmb3IgY29tcF9ncnAgJWQiLAotCQkJcnNyY19kYXRhLT5jb21wX2dycF90eXBlKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCgocnNyY19kYXRhLT5jb21wX2dycF90eXBlID49IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8wICYmCisJCXJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA8PSBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfNSkgJiYKKwkJKHJzcmNfZGF0YS0+aXNfbWFzdGVyKSkgfHwKKwkJKHJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA+PSBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQXzAgJiYKKwkJcnNyY19kYXRhLT5jb21wX2dycF90eXBlIDw9IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfNSkpIHsKKwkJY29tcF9ncnAtPmlycV9oYW5kbGUgPSBjYW1faXJxX2NvbnRyb2xsZXJfc3Vic2NyaWJlX2lycSgKKwkJCWNvbW1vbl9kYXRhLT5idXNfaXJxX2NvbnRyb2xsZXIsIENBTV9JUlFfUFJJT1JJVFlfMSwKKwkJCWJ1c19pcnFfcmVnX21hc2ssIGNvbXBfZ3JwLAorCQkJY29tcF9ncnAtPnRvcF9oYWxmX2hhbmRsZXIsCisJCQljYW1faWZlX21ncl9kb190YXNrbGV0X2J1Zl9kb25lLAorCQkJY29tcF9ncnAtPnRhc2tsZXRfaW5mbywgY2FtX3Rhc2tsZXRfZW5xdWV1ZV9jbWQpOworCQlpZiAoY29tcF9ncnAtPmlycV9oYW5kbGUgPCAwKSB7CisJCQlDQU1fRVJSKENBTV9JU1AsICJTdWJzY3JpYmUgSVJRIGZhaWxlZCBmb3IgY29tcF9ncnAgJWQiLAorCQkJCXJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQogCX0KLQogCWNvbXBfZ3JwLT5yZXNfc3RhdGUgPSBDQU1fSVNQX1JFU09VUkNFX1NUQVRFX1NUUkVBTUlORzsKIAogCXJldHVybiByYzsKQEAgLTEzMDQsMzIgKzE1MzIsNjUgQEAKIHN0YXRpYyBpbnQgY2FtX3ZmZV9idXNfc3RvcF9jb21wX2dycChzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICpjb21wX2dycCkKIHsKIAlpbnQgcmMgPSAwOworCXVpbnQzMl90IGFkZHJfc3luY19jZmc7CiAJc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfY29tcF9ncnBfZGF0YSAgICAgICpyc3JjX2RhdGEgPQogCQljb21wX2dycC0+cmVzX3ByaXY7CiAJc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfY29tbW9uX2RhdGEgICAgICAgICpjb21tb25fZGF0YSA9CiAJCXJzcmNfZGF0YS0+Y29tbW9uX2RhdGE7CiAKIAkvKiBVbnN1YnNjcmliZSBJUlEgKi8KLQlyYyA9IGNhbV9pcnFfY29udHJvbGxlcl91bnN1YnNjcmliZV9pcnEoCi0JCWNvbW1vbl9kYXRhLT5idXNfaXJxX2NvbnRyb2xsZXIsCi0JCWNvbXBfZ3JwLT5pcnFfaGFuZGxlKTsKKwlpZiAoKChyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPj0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzAgJiYKKwkJcnNyY19kYXRhLT5jb21wX2dycF90eXBlIDw9IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF81KSAmJgorCQkocnNyY19kYXRhLT5pc19tYXN0ZXIpKSB8fAorCQkocnNyY19kYXRhLT5jb21wX2dycF90eXBlID49IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfMCAmJgorCQlyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF81KSkgeworCQlyYyA9IGNhbV9pcnFfY29udHJvbGxlcl91bnN1YnNjcmliZV9pcnEoCisJCQljb21tb25fZGF0YS0+YnVzX2lycV9jb250cm9sbGVyLAorCQkJY29tcF9ncnAtPmlycV9oYW5kbGUpOworCX0KIAogCWNhbV9pb193X21iKHJzcmNfZGF0YS0+Y29tcG9zaXRlX21hc2ssIGNvbW1vbl9kYXRhLT5tZW1fYmFzZSArCiAJCXJzcmNfZGF0YS0+aHdfcmVncy0+Y29tcF9tYXNrKTsKIAlpZiAocnNyY19kYXRhLT5jb21wX2dycF90eXBlID49IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfRFVBTF8wICYmCi0JCXJzcmNfZGF0YS0+Y29tcF9ncnBfdHlwZSA8PSBDQU1fVkZFX0JVU19WRVIyX0NPTVBfR1JQX0RVQUxfNSAmJgotCQlyc3JjX2RhdGEtPmlzX21hc3RlcikgeworCQlyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgPD0gQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzUpIHsKKwogCQlpbnQgZHVhbF9jb21wX2dycCA9IChyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUgLQogCQkJQ0FNX1ZGRV9CVVNfVkVSMl9DT01QX0dSUF9EVUFMXzApOwotCQlpbnQgaW50cmFfY2xpZW50X2VuID0gY2FtX2lvX3JfbWIoY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKLQkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5kdWFsX21hc3Rlcl9jb21wX2NmZyk7CiAKLQkJLyogMiBCaXRzIHBlciBjb21wX2dycC4gSGVuY2UgbGVmdCBzaGlmdCBieSBjb21wX2dycCAqIDIgKi8KLQkJaW50cmFfY2xpZW50X2VuICY9Ci0JCQl+KHJzcmNfZGF0YS0+aW50cmFfY2xpZW50X21hc2sgPDwgZHVhbF9jb21wX2dycCAqIDIpOworCQlpZiAocnNyY19kYXRhLT5pc19tYXN0ZXIpIHsKKwkJCWludCBpbnRyYV9jbGllbnRfZW4gPSBjYW1faW9fcl9tYigKKwkJCQljb21tb25fZGF0YS0+bWVtX2Jhc2UgKworCQkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5kdWFsX21hc3Rlcl9jb21wX2NmZyk7CiAKLQkJY2FtX2lvX3dfbWIoaW50cmFfY2xpZW50X2VuLCBjb21tb25fZGF0YS0+bWVtX2Jhc2UgKwotCQkJY29tbW9uX2RhdGEtPmNvbW1vbl9yZWctPmR1YWxfbWFzdGVyX2NvbXBfY2ZnKTsKKwkJCS8qCisJCQkgKiAyIEJpdHMgcGVyIGNvbXBfZ3JwLiBIZW5jZSBsZWZ0IHNoaWZ0IGJ5CisJCQkgKiBjb21wX2dycCAqIDIKKwkJCSAqLworCQkJaW50cmFfY2xpZW50X2VuICY9CisJCQkJfihyc3JjX2RhdGEtPmludHJhX2NsaWVudF9tYXNrIDw8CisJCQkJCWR1YWxfY29tcF9ncnAgKiAyKTsKKworCQkJY2FtX2lvX3dfbWIoaW50cmFfY2xpZW50X2VuLCBjb21tb25fZGF0YS0+bWVtX2Jhc2UgKworCQkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5kdWFsX21hc3Rlcl9jb21wX2NmZyk7CisJCX0KKworCQlhZGRyX3N5bmNfY2ZnID0gY2FtX2lvX3JfbWIoY29tbW9uX2RhdGEtPm1lbV9iYXNlICsKKwkJCWNvbW1vbl9kYXRhLT5jb21tb25fcmVnLT5hZGRyX3N5bmNfY2ZnKTsKKwkJYWRkcl9zeW5jX2NmZyAmPSB+KDEgPDwgZHVhbF9jb21wX2dycCk7CisJCWFkZHJfc3luY19jZmcgJj0gfihDQU1fVkZFX0JVU19JTlRSQV9DTElFTlRfTUFTSyA8PAorCQkJKChkdWFsX2NvbXBfZ3JwICogMikgKworCQkJQ0FNX1ZGRV9CVVNfQUREUl9TWU5DX0lOVFJBX0NMSUVOVF9TSElGVCkpOworCQljYW1faW9fd19tYihhZGRyX3N5bmNfY2ZnLCBjb21tb25fZGF0YS0+bWVtX2Jhc2UgKworCQkJY29tbW9uX2RhdGEtPmNvbW1vbl9yZWctPmFkZHJfc3luY19jZmcpOworCisJCWNhbV9pb193X21iKDAsIGNvbW1vbl9kYXRhLT5tZW1fYmFzZSArCisJCQlyc3JjX2RhdGEtPmh3X3JlZ3MtPmFkZHJfc3luY19tYXNrKTsKKwkJY29tbW9uX2RhdGEtPmFkZHJfbm9fc3luYyB8PSByc3JjX2RhdGEtPmNvbXBvc2l0ZV9tYXNrOworCQljYW1faW9fd19tYihjb21tb25fZGF0YS0+YWRkcl9ub19zeW5jLCBjb21tb25fZGF0YS0+bWVtX2Jhc2UgKworCQkJY29tbW9uX2RhdGEtPmNvbW1vbl9yZWctPmFkZHJfc3luY19ub19zeW5jKTsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiYWRkcl9zeW5jX2NmZzogMHglIGFkZHJfbm9fc3luY19jZmc6IDB4JXgiLAorCQkJYWRkcl9zeW5jX2NmZywgY29tbW9uX2RhdGEtPmFkZHJfbm9fc3luYyk7CisKIAl9CiAKIAljb21wX2dycC0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9SRVNFUlZFRDsKQEAgLTEzNDgsNyArMTYwOSw3IEBACiAKIAljb21wX2dycCA9IHRoX3BheWxvYWQtPmhhbmRsZXJfcHJpdjsKIAlpZiAoIWNvbXBfZ3JwKSB7Ci0JCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLCAiRXJyb3IhIE5vIHJlc291cmNlXG4iKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsICJObyByZXNvdXJjZSIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEzNTYsMTEgKzE2MTcsMTIgQEAKIAogCUNBTV9EQkcoQ0FNX0lTUCwgIklSUSBzdGF0dXNfMCA9ICV4IiwgdGhfcGF5bG9hZC0+ZXZ0X3N0YXR1c19hcnJbMF0pOwogCUNBTV9EQkcoQ0FNX0lTUCwgIklSUSBzdGF0dXNfMSA9ICV4IiwgdGhfcGF5bG9hZC0+ZXZ0X3N0YXR1c19hcnJbMV0pOworCUNBTV9EQkcoQ0FNX0lTUCwgIklSUSBzdGF0dXNfMiA9ICV4IiwgdGhfcGF5bG9hZC0+ZXZ0X3N0YXR1c19hcnJbMl0pOwogCiAJcmMgID0gY2FtX3ZmZV9idXNfZ2V0X2V2dF9wYXlsb2FkKHJzcmNfZGF0YS0+Y29tbW9uX2RhdGEsICZldnRfcGF5bG9hZCk7CiAJaWYgKHJjKSB7CiAJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAotCQkJIk5vIHRhc2tsZXRfY21kIGlzIGZyZWUgaW4gcXVldWVcbiIpOworCQkJIk5vIHRhc2tsZXRfY21kIGlzIGZyZWUgaW4gcXVldWUiKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTQzMCw4ICsxNjkyLDEzIEBACiAKIAkJLyogUmVndWxhciBDb21wb3NpdGUgU1VDQ0VTUyAqLwogCQlpZiAoc3RhdHVzX3JlZyAmIEJJVChjb21wX2dycF9pZCArIDUpKSB7Ci0JCQljYW1faWZlX2lycV9yZWdzW0NBTV9JRkVfSVJRX0JVU19SRUdfU1RBVFVTMF0gJj0KLQkJCQl+QklUKGNvbXBfZ3JwX2lkICsgNSk7CisJCQlyc3JjX2RhdGEtPmlycV90cmlnZ2VyX2NudCsrOworCQkJaWYgKHJzcmNfZGF0YS0+aXJxX3RyaWdnZXJfY250ID09CisJCQkJcnNyY19kYXRhLT5hY3F1aXJlX2Rldl9jbnQpIHsKKwkJCQljYW1faWZlX2lycV9yZWdzW0NBTV9JRkVfSVJRX0JVU19SRUdfU1RBVFVTMF0gJj0KKwkJCQkJfkJJVChjb21wX2dycF9pZCArIDUpOworCQkJCXJzcmNfZGF0YS0+aXJxX3RyaWdnZXJfY250ID0gMDsKKwkJCX0KIAkJCXJjID0gQ0FNX1ZGRV9JUlFfU1RBVFVTX1NVQ0NFU1M7CiAJCX0KIApAQCAtMTQ2OSwxNSArMTczNiwyMCBAQAogCiAJCS8qIERVQUwgQ29tcG9zaXRlIFNVQ0NFU1MgKi8KIAkJaWYgKHN0YXR1c19yZWcgJiBCSVQoY29tcF9ncnBfaWQpKSB7Ci0JCQljYW1faWZlX2lycV9yZWdzW0NBTV9JRkVfSVJRX0JVU19SRUdfU1RBVFVTMl0gJj0KLQkJCQl+QklUKGNvbXBfZ3JwX2lkICsgNSk7CisJCQlyc3JjX2RhdGEtPmlycV90cmlnZ2VyX2NudCsrOworCQkJaWYgKHJzcmNfZGF0YS0+aXJxX3RyaWdnZXJfY250ID09CisJCQkJcnNyY19kYXRhLT5hY3F1aXJlX2Rldl9jbnQpIHsKKwkJCQljYW1faWZlX2lycV9yZWdzW0NBTV9JRkVfSVJRX0JVU19SRUdfU1RBVFVTMl0gJj0KKwkJCQkJfkJJVChjb21wX2dycF9pZCk7CisJCQkJcnNyY19kYXRhLT5pcnFfdHJpZ2dlcl9jbnQgPSAwOworCQkJfQogCQkJcmMgPSBDQU1fVkZFX0lSUV9TVEFUVVNfU1VDQ0VTUzsKIAkJfQogCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJjID0gQ0FNX1ZGRV9JUlFfU1RBVFVTX0VSUjsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgY29tcF9ncnBfdHlwZSAldSIsCisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgY29tcF9ncnBfdHlwZSAldSIsCiAJCQlyc3JjX2RhdGEtPmNvbXBfZ3JwX3R5cGUpOwogCQlicmVhazsKIAl9CkBAIC0xNDk4LDEwICsxNzcwLDkgQEAKIAogCXJzcmNfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX2NvbXBfZ3JwX2RhdGEpLAogCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXJzcmNfZGF0YSkgewotCQlDQU1fREJHKENBTV9JU1AsICJGYWlsZWQgdG8gYWxsb2MgZm9yIGNvbXBfZ3JwX3ByaXYiKTsKKwlpZiAoIXJzcmNfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJY29tcF9ncnAtPnJlc19wcml2ID0gcnNyY19kYXRhOwogCiAJY29tcF9ncnAtPnJlc19zdGF0ZSA9IENBTV9JU1BfUkVTT1VSQ0VfU1RBVEVfQVZBSUxBQkxFOwpAQCAtMTU0OCw3ICsxODE5LDcgQEAKIAljb21wX2dycC0+cmVzX3ByaXYgPSBOVUxMOwogCiAJaWYgKCFyc3JjX2RhdGEpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIGNvbXBfZ3JwX3ByaXYgaXMgTlVMTCIpOworCQlDQU1fRVJSKENBTV9JU1AsICJjb21wX2dycF9wcml2IGlzIE5VTEwiKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWtmcmVlKHJzcmNfZGF0YSk7CkBAIC0xNTU2LDYgKzE4MjcsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjYW1fdmZlX2J1c19nZXRfc2VjdXJlX21vZGUodm9pZCAqcHJpdiwgdm9pZCAqY21kX2FyZ3MsCisJdWludDMyX3QgYXJnX3NpemUpCit7CisJYm9vbCAqbW9kZSA9IGNtZF9hcmdzOworCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgKnJlcyA9CisJCShzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICopIHByaXY7CisJc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfdmZlX291dF9kYXRhICpyc3JjX2RhdGEgPQorCQkoc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfdmZlX291dF9kYXRhICopcmVzLT5yZXNfcHJpdjsKKworCSptb2RlID0KKwkJKHJzcmNfZGF0YS0+c2VjdXJlX21vZGUgPT0gQ0FNX1NFQ1VSRV9NT0RFX1NFQ1VSRSkgPworCQl0cnVlIDogZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjYW1fdmZlX2J1c19hY3F1aXJlX3ZmZV9vdXQodm9pZCAqYnVzX3ByaXYsIHZvaWQgKmFjcXVpcmVfYXJncywKIAl1aW50MzJfdCBhcmdzX3NpemUpCiB7CkBAIC0xNTYzLDcgKzE4NTAsNyBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwogCWVudW0gY2FtX3ZmZV9idXNfdmVyMl92ZmVfb3V0X3R5cGUgICAgICB2ZmVfb3V0X3Jlc19pZDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd207CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93bTsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlX2lycTsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2RvbmVfbWFzazsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9wcml2ICAgICAgICAgICAqdmVyMl9idXNfcHJpdiA9IGJ1c19wcml2OwpAQCAtMTU3MSw2ICsxODU4LDcgQEAKIAlzdHJ1Y3QgY2FtX3ZmZV9od192ZmVfb3V0X2FjcXVpcmVfYXJncyAqb3V0X2FjcXVpcmVfYXJnczsKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICAgICAqcnNyY19ub2RlID0gTlVMTDsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl92ZmVfb3V0X2RhdGEgICAqcnNyY19kYXRhID0gTlVMTDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX2NhcHMgPSAwLCBtb2RlOwogCiAJaWYgKCFidXNfcHJpdiB8fCAhYWNxdWlyZV9hcmdzKSB7CiAJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgUGFyYW0iKTsKQEAgLTE2MDAsNiArMTg4OCwzMyBAQAogCX0KIAogCXJzcmNfZGF0YSA9IHJzcmNfbm9kZS0+cmVzX3ByaXY7CisJc2VjdXJlX2NhcHMgPSBjYW1fdmZlX2J1c19jYW5fYmVfc2VjdXJlKAorCQlyc3JjX2RhdGEtPm91dF90eXBlKTsKKwltb2RlID0gb3V0X2FjcXVpcmVfYXJncy0+b3V0X3BvcnRfaW5mby0+c2VjdXJlX21vZGU7CisJbXV0ZXhfbG9jaygmcnNyY19kYXRhLT5jb21tb25fZGF0YS0+YnVzX211dGV4KTsKKwlpZiAoc2VjdXJlX2NhcHMpIHsKKwkJaWYgKCFyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5udW1fc2VjX291dCkgeworCQkJcnNyY19kYXRhLT5zZWN1cmVfbW9kZSA9IG1vZGU7CisJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZSA9IG1vZGU7CisJCX0gZWxzZSB7CisJCQlpZiAobW9kZSA9PSByc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZSkgeworCQkJCXJzcmNfZGF0YS0+c2VjdXJlX21vZGUgPQorCQkJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLAorCQkJCQkiTWlzbWF0Y2g6IEFjcXVpcmUgbW9kZVslZF0sIGRydnIgbW9kZVslZF0iLAorCQkJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZSwKKwkJCQkJbW9kZSk7CisJCQkJbXV0ZXhfdW5sb2NrKAorCQkJCQkmcnNyY19kYXRhLT5jb21tb25fZGF0YS0+YnVzX211dGV4KTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5udW1fc2VjX291dCsrOworCX0KKwltdXRleF91bmxvY2soJnJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPmJ1c19tdXRleCk7CisKIAlyc3JjX2RhdGEtPm51bV93bSA9IG51bV93bTsKIAlyc3JjX25vZGUtPnJlc19pZCA9IG91dF9hY3F1aXJlX2FyZ3MtPm91dF9wb3J0X2luZm8tPnJlc190eXBlOwogCXJzcmNfbm9kZS0+dGFza2xldF9pbmZvID0gYWNxX2FyZ3MtPnRhc2tsZXQ7CkBAIC0xNjA3LDEwICsxOTIyLDEyIEBACiAJcnNyY19kYXRhLT5jZG1fdXRpbF9vcHMgPSBvdXRfYWNxdWlyZV9hcmdzLT5jZG1fb3BzOwogCiAJLyogUmVzZXJ2ZSBDb21wb3NpdGUgR3JvdXAgKi8KLQlpZiAobnVtX3dtID4gMSB8fCAob3V0X2FjcXVpcmVfYXJncy0+b3V0X3BvcnRfaW5mby0+Y29tcF9ncnBfaWQgPgotCQlDQU1fSVNQX1JFU19DT01QX0dST1VQX05PTkUgJiYKLQkJb3V0X2FjcXVpcmVfYXJncy0+b3V0X3BvcnRfaW5mby0+Y29tcF9ncnBfaWQgPAotCQlDQU1fSVNQX1JFU19DT01QX0dST1VQX0lEX01BWCkpIHsKKwkJaWYgKG51bV93bSA+IDEgfHwgKG91dF9hY3F1aXJlX2FyZ3MtPmlzX2R1YWwpIHx8CisJCQkob3V0X2FjcXVpcmVfYXJncy0+b3V0X3BvcnRfaW5mby0+Y29tcF9ncnBfaWQgPgorCQkJQ0FNX0lTUF9SRVNfQ09NUF9HUk9VUF9OT05FICYmCisJCQlvdXRfYWNxdWlyZV9hcmdzLT5vdXRfcG9ydF9pbmZvLT5jb21wX2dycF9pZCA8CisJCQlDQU1fSVNQX1JFU19DT01QX0dST1VQX0lEX01BWCkpIHsKKwogCQlyYyA9IGNhbV92ZmVfYnVzX2FjcXVpcmVfY29tcF9ncnAodmVyMl9idXNfcHJpdiwKIAkJCW91dF9hY3F1aXJlX2FyZ3MtPm91dF9wb3J0X2luZm8sCiAJCQlhY3FfYXJncy0+dGFza2xldCwKQEAgLTE2NDEsMTAgKzE5NTgsMTAgQEAKIAkJCW91dF9hY3F1aXJlX2FyZ3MtPmN0eCwKIAkJCXZmZV9vdXRfcmVzX2lkLAogCQkJaSwKLQkJCW91dF9hY3F1aXJlX2FyZ3MtPnNwbGl0X2lkLAogCQkJc3Vic2NyaWJlX2lycSwKIAkJCSZyc3JjX2RhdGEtPndtX3Jlc1tpXSwKLQkJCSZjbGllbnRfZG9uZV9tYXNrKTsKKwkJCSZjbGllbnRfZG9uZV9tYXNrLAorCQkJb3V0X2FjcXVpcmVfYXJncy0+aXNfZHVhbCk7CiAJCWlmIChyYykgewogCQkJQ0FNX0VSUihDQU1fSVNQLAogCQkJCSJWRkUlZCBXTSBhY3F1aXJlIGZhaWxlZCBmb3IgT3V0ICVkIHJjPSVkIiwKQEAgLTE2ODAsNiArMTk5Nyw3IEBACiAJdWludDMyX3QgaTsKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAgICAgICAgICp2ZmVfb3V0ID0gTlVMTDsKIAlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl92ZmVfb3V0X2RhdGEgICpyc3JjX2RhdGEgPSBOVUxMOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZV9jYXBzID0gMDsKIAogCWlmICghYnVzX3ByaXYgfHwgIXJlbGVhc2VfYXJncykgewogCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGlucHV0IGJ1c19wcml2ICVwSyByZWxlYXNlX2FyZ3MgJXBLIiwKQEAgLTE2OTEsNyArMjAwOSw3IEBACiAJcnNyY19kYXRhID0gdmZlX291dC0+cmVzX3ByaXY7CiAKIAlpZiAodmZlX291dC0+cmVzX3N0YXRlICE9IENBTV9JU1BfUkVTT1VSQ0VfU1RBVEVfUkVTRVJWRUQpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgcmVzb3VyY2Ugc3RhdGU6JWQiLAorCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIHJlc291cmNlIHN0YXRlOiVkIiwKIAkJCXZmZV9vdXQtPnJlc19zdGF0ZSk7CiAJfQogCkBAIC0xNzA3LDYgKzIwMjUsMzIgQEAKIAl2ZmVfb3V0LT5jZG1fb3BzID0gTlVMTDsKIAlyc3JjX2RhdGEtPmNkbV91dGlsX29wcyA9IE5VTEw7CiAKKwlzZWN1cmVfY2FwcyA9IGNhbV92ZmVfYnVzX2Nhbl9iZV9zZWN1cmUocnNyY19kYXRhLT5vdXRfdHlwZSk7CisJbXV0ZXhfbG9jaygmcnNyY19kYXRhLT5jb21tb25fZGF0YS0+YnVzX211dGV4KTsKKwlpZiAoc2VjdXJlX2NhcHMpIHsKKwkJaWYgKHJzcmNfZGF0YS0+c2VjdXJlX21vZGUgPT0KKwkJCXJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPnNlY3VyZV9tb2RlKSB7CisJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5udW1fc2VjX291dC0tOworCQkJcnNyY19kYXRhLT5zZWN1cmVfbW9kZSA9CisJCQkJQ0FNX1NFQ1VSRV9NT0RFX05PTl9TRUNVUkU7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIHZhbGlkaXR5IG9mIHRoZSBtb2RlIGlzIHByb3Blcmx5CisJCQkgKiBjaGVja2VkIHdoaWxlIGFjcXVpcmluZyB0aGUgb3V0cHV0IHBvcnQuCisJCQkgKiBub3QgZXhwZWN0ZWQgdG8gcmVhY2ggaGVyZSwgdW5sZXNzIHRoZXJlIGlzCisJCQkgKiBzb21lIGNvcnJ1cHRpb24uCisJCQkgKi8KKwkJCUNBTV9FUlIoQ0FNX0lTUCwgImRyaXZlclslZF0scmVzb3VyY2VbJWRdIG1pc21hdGNoIiwKKwkJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZSwKKwkJCQlyc3JjX2RhdGEtPnNlY3VyZV9tb2RlKTsKKwkJfQorCisJCWlmICghcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bnVtX3NlY19vdXQpCisJCQlyc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5zZWN1cmVfbW9kZSA9CisJCQkJQ0FNX1NFQ1VSRV9NT0RFX05PTl9TRUNVUkU7CisJfQorCW11dGV4X3VubG9jaygmcnNyY19kYXRhLT5jb21tb25fZGF0YS0+YnVzX211dGV4KTsKKwogCWlmICh2ZmVfb3V0LT5yZXNfc3RhdGUgPT0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9SRVNFUlZFRCkKIAkJdmZlX291dC0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9BVkFJTEFCTEU7CiAKQEAgLTE3MzEsNyArMjA3NSw3IEBACiAJQ0FNX0RCRyhDQU1fSVNQLCAiU3RhcnQgcmVzb3VyY2UgaW5kZXggJWQiLCByc3JjX2RhdGEtPm91dF90eXBlKTsKIAogCWlmICh2ZmVfb3V0LT5yZXNfc3RhdGUgIT0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9SRVNFUlZFRCkgewotCQlDQU1fRVJSKENBTV9JU1AsICJFcnJvciEgSW52YWxpZCByZXNvdXJjZSBzdGF0ZTolZCIsCisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgcmVzb3VyY2Ugc3RhdGU6JWQiLAogCQkJdmZlX291dC0+cmVzX3N0YXRlKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQpAQCAtMTc0MiwyOCArMjA4Niw2IEBACiAJaWYgKHJzcmNfZGF0YS0+Y29tcF9ncnApCiAJCXJjID0gY2FtX3ZmZV9idXNfc3RhcnRfY29tcF9ncnAocnNyY19kYXRhLT5jb21wX2dycCk7CiAKLQkvKiBCVVNfV1JfSU5QVVRfSUZfQUREUl9TWU5DX0NGRyAqLwotCWNhbV9pb193X21iKDB4MCwgcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bWVtX2Jhc2UgKyAweDAwMDAyMDdDKTsKLQkvKiAgQlVTX1dSX0lOUFVUX0lGX0FERFJfU1lOQ19GUkFNRV9IRUFERVIgKi8KLQljYW1faW9fd19tYigweDAsIHJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPm1lbV9iYXNlICsgMHgwMDAwMjA4MCk7Ci0JLyogQlVTX1dSX0lOUFVUX0lGX0FERFJfU1lOQ19OT19TWU5DICovCi0JY2FtX2lvX3dfbWIoMHhGRkZGRiwgcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bWVtX2Jhc2UgKyAweDAwMDAyMDg0KTsKLQkvKiAgQlVTX1dSX0lOUFVUX0lGX0FERFJfU1lOQ18wICovCi0JY2FtX2lvX3dfbWIoMHgwLCByc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5tZW1fYmFzZSArIDB4MDAwMDIwODgpOwotCWNhbV9pb193X21iKDB4MCwgcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bWVtX2Jhc2UgKyAweDAwMDAyMDhjKTsKLQljYW1faW9fd19tYigweDAsIHJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPm1lbV9iYXNlICsgMHgwMDAwMjA5MCk7Ci0JY2FtX2lvX3dfbWIoMHgwLCByc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5tZW1fYmFzZSArIDB4MDAwMDIwOTQpOwotCWNhbV9pb193X21iKDB4MCwgcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bWVtX2Jhc2UgKyAweDAwMDAyMDk4KTsKLQljYW1faW9fd19tYigweDAsIHJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPm1lbV9iYXNlICsgMHgwMDAwMjA5Yyk7Ci0JY2FtX2lvX3dfbWIoMHgwLCByc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5tZW1fYmFzZSArIDB4MDAwMDIwYTApOwotCWNhbV9pb193X21iKDB4MCwgcnNyY19kYXRhLT5jb21tb25fZGF0YS0+bWVtX2Jhc2UgKyAweDAwMDAyMGE0KTsKLQotCS8qIG5vIGNsb2NrIGdhdGluZyBhdCBidXMgaW5wdXQgKi8KLQljYW1faW9fd19tYigweEZGRkZGLCByc3JjX2RhdGEtPmNvbW1vbl9kYXRhLT5tZW1fYmFzZSArIDB4MDAwMDIwMEMpOwotCi0JLyogQlVTX1dSX1RFU1RfQlVTX0NUUkwgKi8KLQljYW1faW9fd19tYigweDAsIHJzcmNfZGF0YS0+Y29tbW9uX2RhdGEtPm1lbV9iYXNlICsgMHgwMDAwMjExQyk7Ci0KIAl2ZmVfb3V0LT5yZXNfc3RhdGUgPSBDQU1fSVNQX1JFU09VUkNFX1NUQVRFX1NUUkVBTUlORzsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xNzkyLDcgKzIxMTQsNiBAQAogCWZvciAoaSA9IDA7IGkgPCByc3JjX2RhdGEtPm51bV93bTsgaSsrKQogCQlyYyA9IGNhbV92ZmVfYnVzX3N0b3Bfd20ocnNyY19kYXRhLT53bV9yZXNbaV0pOwogCi0KIAl2ZmVfb3V0LT5yZXNfc3RhdGUgPSBDQU1fSVNQX1JFU09VUkNFX1NUQVRFX1JFU0VSVkVEOwogCXJldHVybiByYzsKIH0KQEAgLTE4MzgsNyArMjE1OSw2IEBACiAJcnNyY19kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfdmZlX291dF9kYXRhKSwKIAkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFyc3JjX2RhdGEpIHsKLQkJQ0FNX0RCRyhDQU1fSVNQLCAiRXJyb3IhIEZhaWxlZCB0byBhbGxvYyBmb3IgdmZlIG91dCBwcml2Iik7CiAJCXJjID0gLUVOT01FTTsKIAkJcmV0dXJuIHJjOwogCX0KQEAgLTE4NTQsMTIgKzIxNzQsMTQgQEAKIAkJdmVyMl9od19pbmZvLT52ZmVfb3V0X2h3X2luZm9baW5kZXhdLm1heF93aWR0aDsKIAlyc3JjX2RhdGEtPm1heF9oZWlnaHQgID0KIAkJdmVyMl9od19pbmZvLT52ZmVfb3V0X2h3X2luZm9baW5kZXhdLm1heF9oZWlnaHQ7CisJcnNyY19kYXRhLT5zZWN1cmVfbW9kZSA9IENBTV9TRUNVUkVfTU9ERV9OT05fU0VDVVJFOwogCiAJdmZlX291dC0+c3RhcnQgPSBjYW1fdmZlX2J1c19zdGFydF92ZmVfb3V0OwogCXZmZV9vdXQtPnN0b3AgPSBjYW1fdmZlX2J1c19zdG9wX3ZmZV9vdXQ7CiAJdmZlX291dC0+dG9wX2hhbGZfaGFuZGxlciA9IGNhbV92ZmVfYnVzX2hhbmRsZV92ZmVfb3V0X2RvbmVfdG9wX2hhbGY7CiAJdmZlX291dC0+Ym90dG9tX2hhbGZfaGFuZGxlciA9CiAJCWNhbV92ZmVfYnVzX2hhbmRsZV92ZmVfb3V0X2RvbmVfYm90dG9tX2hhbGY7CisJdmZlX291dC0+cHJvY2Vzc19jbWQgPSBjYW1fdmZlX2J1c19wcm9jZXNzX2NtZDsKIAl2ZmVfb3V0LT5od19pbnRmID0gdmVyMl9idXNfcHJpdi0+Y29tbW9uX2RhdGEuaHdfaW50ZjsKIAogCXJldHVybiAwOwpAQCAtMTg4MCwxMCArMjIwMiw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJnZmZV9vdXQtPmxpc3QpOwogCXZmZV9vdXQtPnJlc19wcml2ID0gTlVMTDsKIAotCWlmICghcnNyY19kYXRhKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yISB2ZmUgb3V0IHByaXYgaXMgTlVMTCIpOworCWlmICghcnNyY19kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJa2ZyZWUocnNyY19kYXRhKTsKIAogCXJldHVybiAwOwpAQCAtMTkxMiwxMSArMjIzMiw2IEBACiAJdWludDMyX3QgIGksIGosIHNpemUgPSAwOwogCXVpbnQzMl90ICBmcmFtZV9pbmMgPSAwOwogCi0JLyoKLQkgKiBOZWVkIHRoZSBlbnRpcmUgYnVmIGlvIGNvbmZpZyBzbyB3ZSBjYW4gZ2V0IHRoZSBzdHJpZGUgaW5mbwotCSAqIGZvciB0aGUgd20uCi0JICovCi0KIAlidXNfcHJpdiA9IChzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9wcml2ICAqKSBwcml2OwogCXVwZGF0ZV9idWYgPSAgKHN0cnVjdCBjYW1faXNwX2h3X2dldF9idWZfdXBkYXRlICopIGNtZF9hcmdzOwogCkBAIC0xOTQ4LDYgKzIyNjMsMTIgQEAKIAogCQl3bV9kYXRhID0gdmZlX291dF9kYXRhLT53bV9yZXNbaV0tPnJlc19wcml2OwogCisJCS8qIHVwZGF0ZSB3aWR0aCByZWdpc3RlciAqLworCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAorCQkJd21fZGF0YS0+aHdfcmVncy0+YnVmZmVyX3dpZHRoX2NmZywKKwkJCXdtX2RhdGEtPndpZHRoKTsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiaW1hZ2Ugd2lkdGggMHgleCIsIHdtX2RhdGEtPndpZHRoKTsKKwogCQkvKiBGb3IgaW5pdGlhbCBjb25maWd1cmF0aW9uIHByb2dyYW0gYWxsIGJ1cyByZWdpc3RlcnMgKi8KIAkJaWYgKCh3bV9kYXRhLT5zdHJpZGUgIT0gaW9fY2ZnLT5wbGFuZXNbaV0ucGxhbmVfc3RyaWRlIHx8CiAJCQkhd21fZGF0YS0+aW5pdF9jZmdfZG9uZSkgJiYgKHdtX2RhdGEtPmluZGV4ID49IDMpKSB7CkBAIC0xOTU5LDcgKzIyODAsNyBAQAogCQlDQU1fREJHKENBTV9JU1AsICJpbWFnZSBzdHJpZGUgMHgleCIsIHdtX2RhdGEtPnN0cmlkZSk7CiAKIAkJaWYgKHdtX2RhdGEtPmZyYW1lZHJvcF9wYXR0ZXJuICE9IGlvX2NmZy0+ZnJhbWVkcm9wX3BhdHRlcm4gfHwKLQkJCSF3bV9kYXRhLT5pbml0X2NmZ19kb25lKSB7CisJCQkhd21fZGF0YS0+aGZyX2NmZ19kb25lKSB7CiAJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAogCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmZyYW1lZHJvcF9wYXR0ZXJuLAogCQkJCWlvX2NmZy0+ZnJhbWVkcm9wX3BhdHRlcm4pOwpAQCAtMTk2OSw3ICsyMjkwLDcgQEAKIAkJCXdtX2RhdGEtPmZyYW1lZHJvcF9wYXR0ZXJuKTsKIAogCQlpZiAod21fZGF0YS0+ZnJhbWVkcm9wX3BlcmlvZCAhPSBpb19jZmctPmZyYW1lZHJvcF9wZXJpb2QgfHwKLQkJCSF3bV9kYXRhLT5pbml0X2NmZ19kb25lKSB7CisJCQkhd21fZGF0YS0+aGZyX2NmZ19kb25lKSB7CiAJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAogCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmZyYW1lZHJvcF9wZXJpb2QsCiAJCQkJaW9fY2ZnLT5mcmFtZWRyb3BfcGVyaW9kKTsKQEAgLTE5NzksNyArMjMwMCw3IEBACiAJCQl3bV9kYXRhLT5mcmFtZWRyb3BfcGVyaW9kKTsKIAogCQlpZiAod21fZGF0YS0+aXJxX3N1YnNhbXBsZV9wZXJpb2QgIT0gaW9fY2ZnLT5zdWJzYW1wbGVfcGVyaW9kCi0JCQl8fCAhd21fZGF0YS0+aW5pdF9jZmdfZG9uZSkgeworCQkJfHwgIXdtX2RhdGEtPmhmcl9jZmdfZG9uZSkgewogCQkJQ0FNX1ZGRV9BRERfUkVHX1ZBTF9QQUlSKHJlZ192YWxfcGFpciwgaiwKIAkJCQl3bV9kYXRhLT5od19yZWdzLT5pcnFfc3Vic2FtcGxlX3BlcmlvZCwKIAkJCQlpb19jZmctPnN1YnNhbXBsZV9wZXJpb2QpOwpAQCAtMTk5MCw3ICsyMzExLDcgQEAKIAkJCXdtX2RhdGEtPmlycV9zdWJzYW1wbGVfcGVyaW9kKTsKIAogCQlpZiAod21fZGF0YS0+aXJxX3N1YnNhbXBsZV9wYXR0ZXJuICE9IGlvX2NmZy0+c3Vic2FtcGxlX3BhdHRlcm4KLQkJCXx8ICF3bV9kYXRhLT5pbml0X2NmZ19kb25lKSB7CisJCQl8fCAhd21fZGF0YS0+aGZyX2NmZ19kb25lKSB7CiAJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAogCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmlycV9zdWJzYW1wbGVfcGF0dGVybiwKIAkJCQlpb19jZmctPnN1YnNhbXBsZV9wYXR0ZXJuKTsKQEAgLTIwMTgsNyArMjMzOSwxMiBAQAogCQkJQ0FNX0RCRyhDQU1fSVNQLCAicGFja2VyIGNmZyAweCV4IiwKIAkJCQl3bV9kYXRhLT5wYWNrZXJfY2ZnKTsKIAotCQkJaWYgKHdtX2RhdGEtPnRpbGVfY2ZnICE9IGlvX2NmZy0+cGxhbmVzW2ldLnRpbGVfY29uZmlnCisJCQlpZiAod21fZGF0YS0+aXNfZHVhbCkgeworCQkJCUNBTV9WRkVfQUREX1JFR19WQUxfUEFJUihyZWdfdmFsX3BhaXIsIGosCisJCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPnVid2NfcmVncy0+dGlsZV9jZmcsCisJCQkJCXdtX2RhdGEtPnRpbGVfY2ZnKTsKKwkJCX0gZWxzZSBpZiAoKHdtX2RhdGEtPnRpbGVfY2ZnICE9CisJCQkJaW9fY2ZnLT5wbGFuZXNbaV0udGlsZV9jb25maWcpCiAJCQkJfHwgIXdtX2RhdGEtPmluaXRfY2ZnX2RvbmUpIHsKIAkJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAogCQkJCQl3bV9kYXRhLT5od19yZWdzLT51YndjX3JlZ3MtPnRpbGVfY2ZnLApAQCAtMjAyOCw3ICsyMzU0LDIyIEBACiAJCQl9CiAJCQlDQU1fREJHKENBTV9JU1AsICJ0aWxlIGNmZyAweCV4Iiwgd21fZGF0YS0+dGlsZV9jZmcpOwogCi0JCQlpZiAod21fZGF0YS0+aF9pbml0ICE9IGlvX2NmZy0+cGxhbmVzW2ldLmhfaW5pdCB8fAorCQkJaWYgKHdtX2RhdGEtPmlzX2R1YWwpIHsKKwkJCQlpZiAoKHdtX2RhdGEtPmhfaW5pdCAhPSB3bV9kYXRhLT5vZmZzZXQpIHx8CisJCQkJCSF3bV9kYXRhLT5pbml0X2NmZ19kb25lKSB7CisJCQkJLyoKKwkJCQkgKiBGb3IgZHVhbCBpZmUgaCBpbml0IHZhbHVlIG5lZWQgdG8gdGFrZSBmcm9tCisJCQkJICogb2Zmc2V0LlN0cmlwaW5nIGNvbmZpZyB1cGRhdGUgb2Zmc2V0IHZhbHVlCisJCQkJICovCisJCQkJCUNBTV9WRkVfQUREX1JFR19WQUxfUEFJUihyZWdfdmFsX3BhaXIsCisJCQkJCQlqLAorCQkJCQkJd21fZGF0YS0+aHdfcmVncy0+dWJ3Y19yZWdzLT4KKwkJCQkJCWhfaW5pdCwKKwkJCQkJCXdtX2RhdGEtPm9mZnNldCk7CisJCQkJCXdtX2RhdGEtPmhfaW5pdCA9IHdtX2RhdGEtPm9mZnNldDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHdtX2RhdGEtPmhfaW5pdCAhPQorCQkJCWlvX2NmZy0+cGxhbmVzW2ldLmhfaW5pdCB8fAogCQkJCSF3bV9kYXRhLT5pbml0X2NmZ19kb25lKSB7CiAJCQkJQ0FNX1ZGRV9BRERfUkVHX1ZBTF9QQUlSKHJlZ192YWxfcGFpciwgaiwKIAkJCQkJd21fZGF0YS0+aHdfcmVncy0+dWJ3Y19yZWdzLT5oX2luaXQsCkBAIC0yMTAwLDggKzI0NDEsOSBAQAogCQkJCWlvX2NmZy0+cGxhbmVzW2ldLm1ldGFfc2l6ZSkpOwogCQllbHNlCiAJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAotCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmltYWdlX2FkZHIsCi0JCQkJdXBkYXRlX2J1Zi0+aW1hZ2VfYnVmW2ldKTsKKwkJCXdtX2RhdGEtPmh3X3JlZ3MtPmltYWdlX2FkZHIsCisJCQl1cGRhdGVfYnVmLT5pbWFnZV9idWZbaV0gKworCQkJd21fZGF0YS0+b2Zmc2V0KTsKIAogCQlDQU1fREJHKENBTV9JU1AsICJpbWFnZSBhZGRyZXNzIDB4JXgiLCByZWdfdmFsX3BhaXJbai0xXSk7CiAKQEAgLTIxMTcsNyArMjQ1OSw3IEBACiAKIAkJLyogc2V0IGluaXRpYWwgY29uZmlndXJhdGlvbiBkb25lICovCiAJCWlmICghd21fZGF0YS0+aW5pdF9jZmdfZG9uZSkKLQkJCXdtX2RhdGEtPmluaXRfY2ZnX2RvbmUgPSAxOworCQkJd21fZGF0YS0+aW5pdF9jZmdfZG9uZSA9IHRydWU7CiAJfQogCiAJc2l6ZSA9IHZmZV9vdXRfZGF0YS0+Y2RtX3V0aWxfb3BzLT5jZG1fcmVxdWlyZWRfc2l6ZV9yZWdfcmFuZG9tKGovMik7CkBAIC0yMTM5LDYgKzI0ODEsMTUyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY2FtX3ZmZV9idXNfdXBkYXRlX2hmcih2b2lkICpwcml2LCB2b2lkICpjbWRfYXJncywKKwl1aW50MzJfdCBhcmdfc2l6ZSkKK3sKKwlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9wcml2ICAgICAgICAgICAgICpidXNfcHJpdjsKKwlzdHJ1Y3QgY2FtX2lzcF9od19nZXRfaGZyX3VwZGF0ZSAgICAgICAgICp1cGRhdGVfaGZyOworCXN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3ZmZV9vdXRfZGF0YSAgICAgKnZmZV9vdXRfZGF0YSA9IE5VTEw7CisJc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfd21fcmVzb3VyY2VfZGF0YSAqd21fZGF0YSA9IE5VTEw7CisJc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnICAgICAgICAgICAqaGZyX2NmZyA9IE5VTEw7CisJdWludDMyX3QgKnJlZ192YWxfcGFpcjsKKwl1aW50MzJfdCAgaSwgaiwgc2l6ZSA9IDA7CisKKwlidXNfcHJpdiA9IChzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9wcml2ICAqKSBwcml2OworCXVwZGF0ZV9oZnIgPSAgKHN0cnVjdCBjYW1faXNwX2h3X2dldF9oZnJfdXBkYXRlICopIGNtZF9hcmdzOworCisJdmZlX291dF9kYXRhID0gKHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3ZmZV9vdXRfZGF0YSAqKQorCQl1cGRhdGVfaGZyLT5jZG0ucmVzLT5yZXNfcHJpdjsKKworCWlmICghdmZlX291dF9kYXRhIHx8ICF2ZmVfb3V0X2RhdGEtPmNkbV91dGlsX29wcykgeworCQlDQU1fRVJSKENBTV9JU1AsICJGYWlsZWQhIEludmFsaWQgZGF0YSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdfdmFsX3BhaXIgPSAmdmZlX291dF9kYXRhLT5jb21tb25fZGF0YS0+aW9fYnVmX3VwZGF0ZVswXTsKKwloZnJfY2ZnID0gdXBkYXRlX2hmci0+aW9faGZyX2NmZzsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgdmZlX291dF9kYXRhLT5udW1fd207IGkrKykgeworCQlpZiAoaiA+PSAoTUFYX1JFR19WQUxfUEFJUl9TSVpFIC0gTUFYX0JVRl9VUERBVEVfUkVHX05VTSAqIDIpKSB7CisJCQlDQU1fRVJSKENBTV9JU1AsCisJCQkJInJlZ192YWxfcGFpciAlZCBleGNlZWRzIHRoZSBhcnJheSBsaW1pdCAlbHUiLAorCQkJCWosIE1BWF9SRUdfVkFMX1BBSVJfU0laRSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXdtX2RhdGEgPSB2ZmVfb3V0X2RhdGEtPndtX3Jlc1tpXS0+cmVzX3ByaXY7CisKKwkJaWYgKCh3bV9kYXRhLT5mcmFtZWRyb3BfcGF0dGVybiAhPQorCQkJaGZyX2NmZy0+ZnJhbWVkcm9wX3BhdHRlcm4pIHx8CisJCQkhd21fZGF0YS0+aGZyX2NmZ19kb25lKSB7CisJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAorCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmZyYW1lZHJvcF9wYXR0ZXJuLAorCQkJCWhmcl9jZmctPmZyYW1lZHJvcF9wYXR0ZXJuKTsKKwkJCXdtX2RhdGEtPmZyYW1lZHJvcF9wYXR0ZXJuID0gaGZyX2NmZy0+ZnJhbWVkcm9wX3BhdHRlcm47CisJCX0KKwkJQ0FNX0RCRyhDQU1fSVNQLCAiZnJhbWVkcm9wIHBhdHRlcm4gMHgleCIsCisJCQl3bV9kYXRhLT5mcmFtZWRyb3BfcGF0dGVybik7CisKKwkJaWYgKHdtX2RhdGEtPmZyYW1lZHJvcF9wZXJpb2QgIT0gaGZyX2NmZy0+ZnJhbWVkcm9wX3BlcmlvZCB8fAorCQkJIXdtX2RhdGEtPmhmcl9jZmdfZG9uZSkgeworCQkJQ0FNX1ZGRV9BRERfUkVHX1ZBTF9QQUlSKHJlZ192YWxfcGFpciwgaiwKKwkJCQl3bV9kYXRhLT5od19yZWdzLT5mcmFtZWRyb3BfcGVyaW9kLAorCQkJCWhmcl9jZmctPmZyYW1lZHJvcF9wZXJpb2QpOworCQkJd21fZGF0YS0+ZnJhbWVkcm9wX3BlcmlvZCA9IGhmcl9jZmctPmZyYW1lZHJvcF9wZXJpb2Q7CisJCX0KKwkJQ0FNX0RCRyhDQU1fSVNQLCAiZnJhbWVkcm9wIHBlcmlvZCAweCV4IiwKKwkJCXdtX2RhdGEtPmZyYW1lZHJvcF9wZXJpb2QpOworCisJCWlmICh3bV9kYXRhLT5pcnFfc3Vic2FtcGxlX3BlcmlvZCAhPSBoZnJfY2ZnLT5zdWJzYW1wbGVfcGVyaW9kCisJCQl8fCAhd21fZGF0YS0+aGZyX2NmZ19kb25lKSB7CisJCQlDQU1fVkZFX0FERF9SRUdfVkFMX1BBSVIocmVnX3ZhbF9wYWlyLCBqLAorCQkJCXdtX2RhdGEtPmh3X3JlZ3MtPmlycV9zdWJzYW1wbGVfcGVyaW9kLAorCQkJCWhmcl9jZmctPnN1YnNhbXBsZV9wZXJpb2QpOworCQkJd21fZGF0YS0+aXJxX3N1YnNhbXBsZV9wZXJpb2QgPQorCQkJCWhmcl9jZmctPnN1YnNhbXBsZV9wZXJpb2Q7CisJCX0KKwkJQ0FNX0RCRyhDQU1fSVNQLCAiaXJxIHN1YnNhbXBsZSBwZXJpb2QgMHgleCIsCisJCQl3bV9kYXRhLT5pcnFfc3Vic2FtcGxlX3BlcmlvZCk7CisKKwkJaWYgKHdtX2RhdGEtPmlycV9zdWJzYW1wbGVfcGF0dGVybiAhPSBoZnJfY2ZnLT5zdWJzYW1wbGVfcGF0dGVybgorCQkJfHwgIXdtX2RhdGEtPmhmcl9jZmdfZG9uZSkgeworCQkJQ0FNX1ZGRV9BRERfUkVHX1ZBTF9QQUlSKHJlZ192YWxfcGFpciwgaiwKKwkJCQl3bV9kYXRhLT5od19yZWdzLT5pcnFfc3Vic2FtcGxlX3BhdHRlcm4sCisJCQkJaGZyX2NmZy0+c3Vic2FtcGxlX3BhdHRlcm4pOworCQkJd21fZGF0YS0+aXJxX3N1YnNhbXBsZV9wYXR0ZXJuID0KKwkJCQloZnJfY2ZnLT5zdWJzYW1wbGVfcGF0dGVybjsKKwkJfQorCQlDQU1fREJHKENBTV9JU1AsICJpcnEgc3Vic2FtcGxlIHBhdHRlcm4gMHgleCIsCisJCQl3bV9kYXRhLT5pcnFfc3Vic2FtcGxlX3BhdHRlcm4pOworCisJCS8qIHNldCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gZG9uZSAqLworCQlpZiAoIXdtX2RhdGEtPmhmcl9jZmdfZG9uZSkKKwkJCXdtX2RhdGEtPmhmcl9jZmdfZG9uZSA9IHRydWU7CisJfQorCisJc2l6ZSA9IHZmZV9vdXRfZGF0YS0+Y2RtX3V0aWxfb3BzLT5jZG1fcmVxdWlyZWRfc2l6ZV9yZWdfcmFuZG9tKGovMik7CisKKwkvKiBjZG0gdXRpbCByZXR1cm5zIGR3b3JkcywgbmVlZCB0byBjb252ZXJ0IHRvIGJ5dGVzICovCisJaWYgKChzaXplICogNCkgPiB1cGRhdGVfaGZyLT5jZG0uc2l6ZSkgeworCQlDQU1fRVJSKENBTV9JU1AsCisJCQkiRmFpbGVkISBCdWYgc2l6ZTolZCBpbnN1ZmZpY2llbnQsIGV4cGVjdGVkIHNpemU6JWQiLAorCQkJdXBkYXRlX2hmci0+Y2RtLnNpemUsIHNpemUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZmVfb3V0X2RhdGEtPmNkbV91dGlsX29wcy0+Y2RtX3dyaXRlX3JlZ3JhbmRvbSgKKwkJdXBkYXRlX2hmci0+Y2RtLmNtZF9idWZfYWRkciwgai8yLCByZWdfdmFsX3BhaXIpOworCisJLyogY2RtIHV0aWwgcmV0dXJucyBkd29yZHMsIG5lZWQgdG8gY29udmVydCB0byBieXRlcyAqLworCXVwZGF0ZV9oZnItPmNkbS51c2VkX2J5dGVzID0gc2l6ZSAqIDQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fdmZlX2J1c191cGRhdGVfc3RyaXBlX2NmZyh2b2lkICpwcml2LCB2b2lkICpjbWRfYXJncywKKwl1aW50MzJfdCBhcmdfc2l6ZSkKK3sKKwlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9wcml2ICAgICAgICAgICAgICAgICpidXNfcHJpdjsKKwlzdHJ1Y3QgY2FtX2lzcF9od19kdWFsX2lzcF91cGRhdGVfYXJncyAgICAgICpzdHJpcGVfYXJnczsKKwlzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl92ZmVfb3V0X2RhdGEgICAgICAgICp2ZmVfb3V0X2RhdGEgPSBOVUxMOworCXN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3dtX3Jlc291cmNlX2RhdGEgICAgKndtX2RhdGEgPSBOVUxMOworCXN0cnVjdCBjYW1faXNwX2R1YWxfc3RyaXBlX2NvbmZpZyAgICAgICAgICAgKnN0cmlwZV9jb25maWc7CisJdWludDMyX3Qgb3V0cG9ydF9pZCwgcG9ydHNfcGxhbmVfaWR4LCBpOworCisJYnVzX3ByaXYgPSAoc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfcHJpdiAgKikgcHJpdjsKKwlzdHJpcGVfYXJncyA9IChzdHJ1Y3QgY2FtX2lzcF9od19kdWFsX2lzcF91cGRhdGVfYXJncyAqKWNtZF9hcmdzOworCisJdmZlX291dF9kYXRhID0gKHN0cnVjdCBjYW1fdmZlX2J1c192ZXIyX3ZmZV9vdXRfZGF0YSAqKQorCQlzdHJpcGVfYXJncy0+cmVzLT5yZXNfcHJpdjsKKworCWlmICghdmZlX291dF9kYXRhKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkZhaWxlZCEgSW52YWxpZCBkYXRhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW91dHBvcnRfaWQgPSBzdHJpcGVfYXJncy0+cmVzLT5yZXNfaWQgJiAweEZGOworCWlmIChzdHJpcGVfYXJncy0+cmVzLT5yZXNfaWQgPCBDQU1fSVNQX0lGRV9PVVRfUkVTX0JBU0UgfHwKKwkJc3RyaXBlX2FyZ3MtPnJlcy0+cmVzX2lkID49IENBTV9JU1BfSUZFX09VVF9SRVNfTUFYKQorCQlyZXR1cm4gMDsKKworCXBvcnRzX3BsYW5lX2lkeCA9IChzdHJpcGVfYXJncy0+c3BsaXRfaWQgKgorCShzdHJpcGVfYXJncy0+ZHVhbF9jZmctPm51bV9wb3J0cyAqIENBTV9QQUNLRVRfTUFYX1BMQU5FUykpICsKKwkob3V0cG9ydF9pZCAqIENBTV9QQUNLRVRfTUFYX1BMQU5FUyk7CisJZm9yIChpID0gMDsgaSA8IHZmZV9vdXRfZGF0YS0+bnVtX3dtOyBpKyspIHsKKwkJd21fZGF0YSA9IHZmZV9vdXRfZGF0YS0+d21fcmVzW2ldLT5yZXNfcHJpdjsKKwkJc3RyaXBlX2NvbmZpZyA9IChzdHJ1Y3QgY2FtX2lzcF9kdWFsX3N0cmlwZV9jb25maWcgICopCisJCQkmc3RyaXBlX2FyZ3MtPmR1YWxfY2ZnLT5zdHJpcGVzW3BvcnRzX3BsYW5lX2lkeCArIGldOworCQl3bV9kYXRhLT53aWR0aCA9IHN0cmlwZV9jb25maWctPndpZHRoOworCQl3bV9kYXRhLT5vZmZzZXQgPSBzdHJpcGVfY29uZmlnLT5vZmZzZXQ7CisJCXdtX2RhdGEtPnRpbGVfY2ZnID0gc3RyaXBlX2NvbmZpZy0+dGlsZWNvbmZpZzsKKwkJQ0FNX0RCRyhDQU1fSVNQLCAiaWQ6JXggd206JWQgd2lkdGg6MHgleCBvZmZzZXQ6JXggdGlsZWNmZzoleCIsCisJCQlzdHJpcGVfYXJncy0+cmVzLT5yZXNfaWQsIGksIHdtX2RhdGEtPndpZHRoLAorCQkJd21fZGF0YS0+b2Zmc2V0LCB3bV9kYXRhLT50aWxlX2NmZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY2FtX3ZmZV9idXNfc3RhcnRfaHcodm9pZCAqaHdfcHJpdiwKIAl2b2lkICpzdGFydF9od19hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSkKIHsKQEAgLTIxNTgsNyArMjY0Niw3IEBACiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2lycV9yZWdfbWFza1syXSA9IHswfTsKIAogCWlmICghYnVzX3ByaXYpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgYXJncyIpOworCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGFyZ3MiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTc5LDYgKzI2NjcsMjEgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJLyogQlVTX1dSX0lOUFVUX0lGX0FERFJfU1lOQ19GUkFNRV9IRUFERVIgKi8KKwljYW1faW9fd19tYigweDAsIGJ1c19wcml2LT5jb21tb25fZGF0YS5tZW1fYmFzZSArCisJCWJ1c19wcml2LT5jb21tb25fZGF0YS5jb21tb25fcmVnLT5hZGRyX3N5bmNfZnJhbWVfaGRyKTsKKworCS8qIG5vIGNsb2NrIGdhdGluZyBhdCBidXMgaW5wdXQgKi8KKwljYW1faW9fd19tYigweEZGRkZGLCBidXNfcHJpdi0+Y29tbW9uX2RhdGEubWVtX2Jhc2UgKyAweDAwMDAyMDBDKTsKKworCS8qIEJVU19XUl9URVNUX0JVU19DVFJMICovCisJY2FtX2lvX3dfbWIoMHgwLCBidXNfcHJpdi0+Y29tbW9uX2RhdGEubWVtX2Jhc2UgKyAweDAwMDAyMTFDKTsKKworCS8qIGlmIGFkZHJfbm9fc3luYyBoYXMgZGVmYXVsdCB2YWx1ZSB0aGVuIGNvbmZpZyB0aGUgYWRkciBubyBzeW5jIHJlZyAqLworCWNhbV9pb193X21iKENBTV9WRkVfQlVTX0FERFJfTk9fU1lOQ19ERUZBVUxUX1ZBTCwKKwkJYnVzX3ByaXYtPmNvbW1vbl9kYXRhLm1lbV9iYXNlICsKKwkJYnVzX3ByaXYtPmNvbW1vbl9kYXRhLmNvbW1vbl9yZWctPmFkZHJfc3luY19ub19zeW5jKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMTg5LDcgKzI2OTIsNyBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjOwogCiAJaWYgKCFidXNfcHJpdiB8fCAoYnVzX3ByaXYtPmlycV9oYW5kbGUgPD0gMCkpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgYXJncyIpOworCQlDQU1fRVJSKENBTV9JU1AsICJFcnJvcjogSW52YWxpZCBhcmdzIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjIwMiwxMyArMjcwNSwyMCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBjYW1fdmZlX2J1c19wcm9jZXNzX2NtZCh2b2lkICpwcml2LAorc3RhdGljIGludCBfX2NhbV92ZmVfYnVzX3Byb2Nlc3NfY21kKHZvaWQgKnByaXYsCisJdWludDMyX3QgY21kX3R5cGUsIHZvaWQgKmNtZF9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSkKK3sKKwlyZXR1cm4gY2FtX3ZmZV9idXNfcHJvY2Vzc19jbWQocHJpdiwgY21kX3R5cGUsIGNtZF9hcmdzLCBhcmdfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgY2FtX3ZmZV9idXNfcHJvY2Vzc19jbWQoCisJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAqcHJpdiwKIAl1aW50MzJfdCBjbWRfdHlwZSwgdm9pZCAqY21kX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQogewogCWludCByYyA9IC1FSU5WQUw7CiAKIAlpZiAoIXByaXYgfHwgIWNtZF9hcmdzKSB7Ci0JCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgaW5wdXQgYXJndW1lbnRzXG4iKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsICJJbnZhbGlkIGlucHV0IGFyZ3VtZW50cyIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIyMTYsOCArMjcyNiwxNyBAQAogCWNhc2UgQ0FNX1ZGRV9IV19DTURfR0VUX0JVRl9VUERBVEU6CiAJCXJjID0gY2FtX3ZmZV9idXNfdXBkYXRlX2J1Zihwcml2LCBjbWRfYXJncywgYXJnX3NpemUpOwogCQlicmVhazsKKwljYXNlIENBTV9WRkVfSFdfQ01EX0dFVF9IRlJfVVBEQVRFOgorCQlyYyA9IGNhbV92ZmVfYnVzX3VwZGF0ZV9oZnIocHJpdiwgY21kX2FyZ3MsIGFyZ19zaXplKTsKKwkJYnJlYWs7CisJY2FzZSBDQU1fVkZFX0hXX0NNRF9HRVRfU0VDVVJFX01PREU6CisJCXJjID0gY2FtX3ZmZV9idXNfZ2V0X3NlY3VyZV9tb2RlKHByaXYsIGNtZF9hcmdzLCBhcmdfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgQ0FNX1ZGRV9IV19DTURfU1RSSVBFX1VQREFURToKKwkJcmMgPSBjYW1fdmZlX2J1c191cGRhdGVfc3RyaXBlX2NmZyhwcml2LCBjbWRfYXJncywgYXJnX3NpemUpOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0lTUCwgIkludmFsIGNhbWlmIHByb2Nlc3MgY29tbWFuZDolZFxuIiwKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9JU1AsICJJbnZhbGlkIGNhbWlmIHByb2Nlc3MgY29tbWFuZDolZCIsCiAJCQljbWRfdHlwZSk7CiAJCWJyZWFrOwogCX0KQEAgLTIyNjQsMTggKzI3ODMsMjQgQEAKIAl9CiAJdmZlX2J1c19sb2NhbC0+YnVzX3ByaXYgPSBidXNfcHJpdjsKIAorCWJ1c19wcml2LT5jb21tb25fZGF0YS5udW1fc2VjX291dCAgICAgICAgPSAwOworCWJ1c19wcml2LT5jb21tb25fZGF0YS5zZWN1cmVfbW9kZSAgICAgICAgPSBDQU1fU0VDVVJFX01PREVfTk9OX1NFQ1VSRTsKIAlidXNfcHJpdi0+Y29tbW9uX2RhdGEuY29yZV9pbmRleCAgICAgICAgID0gc29jX2luZm8tPmluZGV4OwogCWJ1c19wcml2LT5jb21tb25fZGF0YS5tZW1fYmFzZSAgICAgICAgICAgPQogCQlDQU1fU09DX0dFVF9SRUdfTUFQX1NUQVJUKHNvY19pbmZvLCBWRkVfQ09SRV9CQVNFX0lEWCk7CiAJYnVzX3ByaXYtPmNvbW1vbl9kYXRhLmh3X2ludGYgICAgICAgICAgICA9IGh3X2ludGY7CiAJYnVzX3ByaXYtPmNvbW1vbl9kYXRhLnZmZV9pcnFfY29udHJvbGxlciA9IHZmZV9pcnFfY29udHJvbGxlcjsKIAlidXNfcHJpdi0+Y29tbW9uX2RhdGEuY29tbW9uX3JlZyAgICAgICAgID0gJnZlcjJfaHdfaW5mby0+Y29tbW9uX3JlZzsKKwlidXNfcHJpdi0+Y29tbW9uX2RhdGEuYWRkcl9ub19zeW5jICAgICAgID0KKwkJQ0FNX1ZGRV9CVVNfQUREUl9OT19TWU5DX0RFRkFVTFRfVkFMOworCisJbXV0ZXhfaW5pdCgmYnVzX3ByaXYtPmNvbW1vbl9kYXRhLmJ1c19tdXRleCk7CiAKIAlyYyA9IGNhbV9pcnFfY29udHJvbGxlcl9pbml0KGRydl9uYW1lLCBidXNfcHJpdi0+Y29tbW9uX2RhdGEubWVtX2Jhc2UsCiAJCSZ2ZXIyX2h3X2luZm8tPmNvbW1vbl9yZWcuaXJxX3JlZ19pbmZvLAogCQkmYnVzX3ByaXYtPmNvbW1vbl9kYXRhLmJ1c19pcnFfY29udHJvbGxlcik7CiAJaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yISBjYW1faXJxX2NvbnRyb2xsZXJfaW5pdCBmYWlsZWQiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiY2FtX2lycV9jb250cm9sbGVyX2luaXQgZmFpbGVkIik7CiAJCWdvdG8gZnJlZV9idXNfcHJpdjsKIAl9CiAKQEAgLTIyODcsNyArMjgxMiw3IEBACiAJCXJjID0gY2FtX3ZmZV9idXNfaW5pdF93bV9yZXNvdXJjZShpLCBidXNfcHJpdiwgYnVzX2h3X2luZm8sCiAJCQkmYnVzX3ByaXYtPmJ1c19jbGllbnRbaV0pOwogCQlpZiAocmMgPCAwKSB7Ci0JCQlDQU1fRVJSKENBTV9JU1AsICJFcnJvciEgSW5pdCBXTSBmYWlsZWQgcmM9JWQiLCByYyk7CisJCQlDQU1fRVJSKENBTV9JU1AsICJJbml0IFdNIGZhaWxlZCByYz0lZCIsIHJjKTsKIAkJCWdvdG8gZGVpbml0X3dtOwogCQl9CiAJfQpAQCAtMjMyNSw3ICsyODUwLDcgQEAKIAl2ZmVfYnVzX2xvY2FsLT5od19vcHMuZGVpbml0ICAgICAgID0gY2FtX3ZmZV9idXNfZGVpbml0X2h3OwogCXZmZV9idXNfbG9jYWwtPnRvcF9oYWxmX2hhbmRsZXIgICAgPSBjYW1fdmZlX2J1c192ZXIyX2hhbmRsZV9pcnE7CiAJdmZlX2J1c19sb2NhbC0+Ym90dG9tX2hhbGZfaGFuZGxlciA9IE5VTEw7Ci0JdmZlX2J1c19sb2NhbC0+aHdfb3BzLnByb2Nlc3NfY21kICA9IGNhbV92ZmVfYnVzX3Byb2Nlc3NfY21kOworCXZmZV9idXNfbG9jYWwtPmh3X29wcy5wcm9jZXNzX2NtZCAgPSBfX2NhbV92ZmVfYnVzX3Byb2Nlc3NfY21kOwogCiAJKnZmZV9idXMgPSB2ZmVfYnVzX2xvY2FsOwogCkBAIC0yMzY4LDE0ICsyODkzLDE0IEBACiAJc3RydWN0IGNhbV92ZmVfYnVzICAgICAgICAgICAgICAqdmZlX2J1c19sb2NhbDsKIAogCWlmICghdmZlX2J1cyB8fCAhKnZmZV9idXMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgaW5wdXQiKTsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBpbnB1dCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJdmZlX2J1c19sb2NhbCA9ICp2ZmVfYnVzOwogCiAJYnVzX3ByaXYgPSB2ZmVfYnVzX2xvY2FsLT5idXNfcHJpdjsKIAlpZiAoIWJ1c19wcml2KSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yISBidXNfcHJpdiBpcyBOVUxMIik7CisJCUNBTV9FUlIoQ0FNX0lTUCwgImJ1c19wcml2IGlzIE5VTEwiKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGZyZWVfYnVzX2xvY2FsOwogCX0KQEAgLTIzODgsMjEgKzI5MTMsMjEgQEAKIAkJcmMgPSBjYW1fdmZlX2J1c19kZWluaXRfd21fcmVzb3VyY2UoJmJ1c19wcml2LT5idXNfY2xpZW50W2ldKTsKIAkJaWYgKHJjIDwgMCkKIAkJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCQkiRXJyb3IhIERlaW5pdCBXTSBmYWlsZWQgcmM9JWQiLCByYyk7CisJCQkJIkRlaW5pdCBXTSBmYWlsZWQgcmM9JWQiLCByYyk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IENBTV9WRkVfQlVTX1ZFUjJfQ09NUF9HUlBfTUFYOyBpKyspIHsKIAkJcmMgPSBjYW1fdmZlX2J1c19kZWluaXRfY29tcF9ncnAoJmJ1c19wcml2LT5jb21wX2dycFtpXSk7CiAJCWlmIChyYyA8IDApCiAJCQlDQU1fRVJSKENBTV9JU1AsCi0JCQkJIkVycm9yISBEZWluaXQgQ29tcCBHcnAgZmFpbGVkIHJjPSVkIiwgcmMpOworCQkJCSJEZWluaXQgQ29tcCBHcnAgZmFpbGVkIHJjPSVkIiwgcmMpOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBDQU1fVkZFX0JVU19WRVIyX1ZGRV9PVVRfTUFYOyBpKyspIHsKIAkJcmMgPSBjYW1fdmZlX2J1c19kZWluaXRfdmZlX291dF9yZXNvdXJjZSgmYnVzX3ByaXYtPnZmZV9vdXRbaV0pOwogCQlpZiAocmMgPCAwKQogCQkJQ0FNX0VSUihDQU1fSVNQLAotCQkJCSJFcnJvciEgRGVpbml0IFZGRSBPdXQgZmFpbGVkIHJjPSVkIiwgcmMpOworCQkJCSJEZWluaXQgVkZFIE91dCBmYWlsZWQgcmM9JWQiLCByYyk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJmJ1c19wcml2LT5mcmVlX2NvbXBfZ3JwKTsKQEAgLTI0MTMsOCArMjkzOCw5IEBACiAJCSZidXNfcHJpdi0+Y29tbW9uX2RhdGEuYnVzX2lycV9jb250cm9sbGVyKTsKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX0lTUCwKLQkJCSJFcnJvciEgRGVpbml0IElSUSBDb250cm9sbGVyIGZhaWxlZCByYz0lZCIsIHJjKTsKKwkJCSJEZWluaXQgSVJRIENvbnRyb2xsZXIgZmFpbGVkIHJjPSVkIiwgcmMpOwogCisJbXV0ZXhfZGVzdHJveSgmYnVzX3ByaXYtPmNvbW1vbl9kYXRhLmJ1c19tdXRleCk7CiAJa2ZyZWUodmZlX2J1c19sb2NhbC0+YnVzX3ByaXYpOwogCiBmcmVlX2J1c19sb2NhbDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfYnVzL2NhbV92ZmVfYnVzX3ZlcjIuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfYnVzL2NhbV92ZmVfYnVzX3ZlcjIuaAppbmRleCBiYTk4MDc3Li5jOTBkNGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX2J1cy9jYW1fdmZlX2J1c192ZXIyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV9idXMvY2FtX3ZmZV9idXNfdmVyMi5oCkBAIC04MSw4ICs4MSw4IEBACiAJdWludDMyX3QgZHVhbF9jb21wX2Vycm9yX3N0YXR1czsKIAl1aW50MzJfdCBkdWFsX2NvbXBfb3Zyd3Jfc3RhdHVzOwogCXVpbnQzMl90IGFkZHJfc3luY19jZmc7Ci0JdWludDMyX3QgYWRkcl9zeW5fZnJhbWVfaGRyOwotCXVpbnQzMl90IGFkZHJfc3luX25vX3N5bmM7CisJdWludDMyX3QgYWRkcl9zeW5jX2ZyYW1lX2hkcjsKKwl1aW50MzJfdCBhZGRyX3N5bmNfbm9fc3luYzsKIH07CiAKIC8qCkBAIC0xMzAsOSArMTMwLDEyIEBACiAgKiBzdHJ1Y3QgY2FtX3ZmZV9idXNfdmVyMl9yZWdfb2Zmc2V0X2NvbXBfZ3JwOgogICoKICAqIEBCcmllZjogICAgICAgIFJlZ2lzdGVyIG9mZnNldHMgZm9yIENvbXBvc2l0ZSBHcm91cCByZWdpc3RlcnMKKyAqIGNvbXBfbWFzazogICAgIENvbXAgZ3JvdXAgcmVnaXN0ZXIgYWRkcmVzcworICogYWRkcl9zeW5jX21hc2s6QWRkcmVzcyBzeW5jIGdyb3VwIHJlZ2lzdGVyIGFkZHJlc3MKICAqLwogc3RydWN0IGNhbV92ZmVfYnVzX3ZlcjJfcmVnX29mZnNldF9jb21wX2dycCB7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcF9tYXNrOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfc3luY19tYXNrOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfY2FtaWZfdmVyMi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmMKaW5kZXggZTcwZWNjNS4uZTgxYTlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmMKQEAgLTEwLDE1ICsxMCwxNyBAQAogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0gI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8dWFwaS9tZWRpYS9jYW1faXNwLmg+CiAjaW5jbHVkZSAiY2FtX2lvX3V0aWwuaCIKICNpbmNsdWRlICJjYW1faXNwX2h3X21ncl9pbnRmLmgiCisjaW5jbHVkZSAiY2FtX2lzcF9ody5oIgogI2luY2x1ZGUgImNhbV92ZmVfaHdfaW50Zi5oIgogI2luY2x1ZGUgImNhbV92ZmVfdG9wLmgiCiAjaW5jbHVkZSAiY2FtX3ZmZV90b3BfdmVyMi5oIgogI2luY2x1ZGUgImNhbV92ZmVfY2FtaWZfdmVyMi5oIgogI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCisjaW5jbHVkZSAiY2FtX2NkbV91dGlsLmgiCiAKIHN0cnVjdCBjYW1fdmZlX211eF9jYW1pZl9kYXRhIHsKIAl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZW1fYmFzZTsKQEAgLTU4LDYgKzYwLDU1IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGNhbV92ZmVfY2FtaWZfZ2V0X3JlZ191cGRhdGUoCisJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAgKmNhbWlmX3JlcywKKwl2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpCit7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfdmFsX3BhaXJbMl07CisJc3RydWN0IGNhbV9pc3BfaHdfZ2V0X2NkbV9hcmdzICAgKmNkbV9hcmdzID0gY21kX2FyZ3M7CisJc3RydWN0IGNhbV9jZG1fdXRpbHNfb3BzICAgICAgICAgKmNkbV91dGlsX29wcyA9IE5VTEw7CisJc3RydWN0IGNhbV92ZmVfbXV4X2NhbWlmX2RhdGEgICAgKnJzcmNfZGF0YSA9IE5VTEw7CisKKwlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBjYW1faXNwX2h3X2dldF9jZG1fYXJncykpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLCAiSW52YWxpZCBjbWQgc2l6ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWNkbV9hcmdzIHx8ICFjZG1fYXJncy0+cmVzKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgYXJncyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZG1fdXRpbF9vcHMgPSAoc3RydWN0IGNhbV9jZG1fdXRpbHNfb3BzICopY2RtX2FyZ3MtPnJlcy0+Y2RtX29wczsKKworCWlmICghY2RtX3V0aWxfb3BzKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgQ0RNIG9wcyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzaXplID0gY2RtX3V0aWxfb3BzLT5jZG1fcmVxdWlyZWRfc2l6ZV9yZWdfcmFuZG9tKDEpOworCS8qIHNpbmNlIGNkbSByZXR1cm5zIGR3b3Jkcywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IGludG8gYnl0ZXMgKi8KKwlpZiAoKHNpemUgKiA0KSA+IGNkbV9hcmdzLT5zaXplKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgImJ1ZiBzaXplOiVkIGlzIG5vdCBzdWZmaWNpZW50LCBleHBlY3RlZDogJWQiLAorCQkJY2RtX2FyZ3MtPnNpemUsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc3JjX2RhdGEgPSBjYW1pZl9yZXMtPnJlc19wcml2OworCXJlZ192YWxfcGFpclswXSA9IHJzcmNfZGF0YS0+Y2FtaWZfcmVnLT5yZWdfdXBkYXRlX2NtZDsKKwlyZWdfdmFsX3BhaXJbMV0gPSByc3JjX2RhdGEtPnJlZ19kYXRhLT5yZWdfdXBkYXRlX2NtZF9kYXRhOworCUNBTV9EQkcoQ0FNX0lTUCwgIkNBTUlGIHJlZ191cGRhdGVfY21kICV4IG9mZnNldCAleCIsCisJCXJlZ192YWxfcGFpclsxXSwgcmVnX3ZhbF9wYWlyWzBdKTsKKworCWNkbV91dGlsX29wcy0+Y2RtX3dyaXRlX3JlZ3JhbmRvbShjZG1fYXJncy0+Y21kX2J1Zl9hZGRyLAorCQkxLCByZWdfdmFsX3BhaXIpOworCisJY2RtX2FyZ3MtPnVzZWRfYnl0ZXMgPSBzaXplICogNDsKKworCXJldHVybiAwOworfQorCiBpbnQgY2FtX3ZmZV9jYW1pZl92ZXIyX2FjcXVpcmVfcmVzb3VyY2UoCiAJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAgKmNhbWlmX3JlcywKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNxdWlyZV9wYXJhbSkKQEAgLTEwNyw4ICsxNTgsMTQgQEAKIAkvKmNvbmZpZyB2ZmUgY29yZSovCiAJdmFsID0gKHJzcmNfZGF0YS0+cGl4X3BhdHRlcm4gPDwKIAkJCXJzcmNfZGF0YS0+cmVnX2RhdGEtPnBpeGVsX3BhdHRlcm5fc2hpZnQpOworCWlmIChyc3JjX2RhdGEtPnN5bmNfbW9kZSA9PSBDQU1fSVNQX0hXX1NZTkNfU0xBVkUpCisJCXZhbCB8PSAoMSA8PCByc3JjX2RhdGEtPnJlZ19kYXRhLT5leHRlcm5fcmVnX3VwZGF0ZV9zaGlmdCk7CisKIAljYW1faW9fd19tYih2YWwsIHJzcmNfZGF0YS0+bWVtX2Jhc2UgKyByc3JjX2RhdGEtPmNvbW1vbl9yZWctPmNvcmVfY2ZnKTsKIAorCUNBTV9EQkcoQ0FNX0lTUCwgImh3IGlkOiVkIGNvcmVfY2ZnIHZhbDolZCIsIGNhbWlmX3Jlcy0+aHdfaW50Zi0+aHdfaWR4LAorCQl2YWwpOworCiAJY2FtX2lvX3dfbWIoMHgwMDQwMDA0MCwgcnNyY19kYXRhLT5tZW1fYmFzZSArCiAJCXJzcmNfZGF0YS0+Y2FtaWZfcmVnLT5jYW1pZl9jb25maWcpOwogCWNhbV9pb193X21iKDB4MSwgcnNyY19kYXRhLT5tZW1fYmFzZSArCkBAIC0xMTcsMTUgKzE3NCwxNiBAQAogCQkJcnNyY19kYXRhLT5jYW1pZl9yZWctPnBpeGVsX3NraXBfcGF0dGVybik7CiAKIAkvKiBlcG9jaCBjb25maWcgd2l0aCAyMCBsaW5lICovCi0JY2FtX2lvX3dfbWIoMHgwMDE0MDAxNCwKKwljYW1faW9fd19tYihyc3JjX2RhdGEtPnJlZ19kYXRhLT5lcG9jaF9saW5lX2NmZywKIAkJcnNyY19kYXRhLT5tZW1fYmFzZSArIHJzcmNfZGF0YS0+Y2FtaWZfcmVnLT5lcG9jaF9pcnEpOwogCiAJY2FtaWZfcmVzLT5yZXNfc3RhdGUgPSBDQU1fSVNQX1JFU09VUkNFX1NUQVRFX1NUUkVBTUlORzsKIAogCS8qIFJlZyBVcGRhdGUgKi8KLQljYW1faW9fd19tYigweDEsIHJzcmNfZGF0YS0+bWVtX2Jhc2UgKyAweDRBQyk7CisJY2FtX2lvX3dfbWIocnNyY19kYXRhLT5yZWdfZGF0YS0+cmVnX3VwZGF0ZV9jbWRfZGF0YSwKKwkJcnNyY19kYXRhLT5tZW1fYmFzZSArIHJzcmNfZGF0YS0+Y2FtaWZfcmVnLT5yZWdfdXBkYXRlX2NtZCk7CiAKLQlDQU1fREJHKENBTV9JU1AsICJFeGl0Iik7CisJQ0FNX0RCRyhDQU1fSVNQLCAiU3RhcnQgQ2FtaWYgSUZFICVkIERvbmUiLCBjYW1pZl9yZXMtPmh3X2ludGYtPmh3X2lkeCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1NSwxMCArMjEzLDI4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgY2FtX3ZmZV9jYW1pZl9wcm9jZXNzX2NtZCh2b2lkICpwcml2LAorc3RhdGljIGludCBjYW1fdmZlX2NhbWlmX3Byb2Nlc3NfY21kKHN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgKnJzcmNfbm9kZSwKIAl1aW50MzJfdCBjbWRfdHlwZSwgdm9pZCAqY21kX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQogewotCXJldHVybiAtRVBFUk07CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmICghcnNyY19ub2RlIHx8ICFjbWRfYXJncykgeworCQlDQU1fRVJSKENBTV9JU1AsICJJbnZhbGlkIGlucHV0IGFyZ3VtZW50cyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGNtZF90eXBlKSB7CisJY2FzZSBDQU1fVkZFX0hXX0NNRF9HRVRfUkVHX1VQREFURToKKwkJcmMgPSBjYW1fdmZlX2NhbWlmX2dldF9yZWdfdXBkYXRlKHJzcmNfbm9kZSwgY21kX2FyZ3MsCisJCQlhcmdfc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNBTV9FUlIoQ0FNX0lTUCwKKwkJCSJ1bnN1cHBvcnRlZCBwcm9jZXNzIGNvbW1hbmQ6JWQiLCBjbWRfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBjYW1fdmZlX2NhbWlmX2hhbmRsZV9pcnFfdG9wX2hhbGYodWludDMyX3QgZXZ0X2lkLApAQCAtMjA3LDYgKzI4MywxMiBAQAogCQkJcmV0ID0gQ0FNX1ZGRV9JUlFfU1RBVFVTX1NVQ0NFU1M7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBDQU1fSVNQX0hXX0VWRU5UX0VPRjoKKwkJaWYgKGlycV9zdGF0dXMwICYgY2FtaWZfcHJpdi0+cmVnX2RhdGEtPmVvZl9pcnFfbWFzaykgeworCQkJQ0FNX0RCRyhDQU1fSVNQLCAiUmVjZWl2ZWQgRU9GXG4iKTsKKwkJCXJldCA9IENBTV9WRkVfSVJRX1NUQVRVU19TVUNDRVNTOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTI0MSw2ICszMjMsNyBAQAogCiAJY2FtaWZfbm9kZS0+c3RhcnQgPSBjYW1fdmZlX2NhbWlmX3Jlc291cmNlX3N0YXJ0OwogCWNhbWlmX25vZGUtPnN0b3AgID0gY2FtX3ZmZV9jYW1pZl9yZXNvdXJjZV9zdG9wOworCWNhbWlmX25vZGUtPnByb2Nlc3NfY21kID0gY2FtX3ZmZV9jYW1pZl9wcm9jZXNzX2NtZDsKIAljYW1pZl9ub2RlLT50b3BfaGFsZl9oYW5kbGVyID0gY2FtX3ZmZV9jYW1pZl9oYW5kbGVfaXJxX3RvcF9oYWxmOwogCWNhbWlmX25vZGUtPmJvdHRvbV9oYWxmX2hhbmRsZXIgPSBjYW1fdmZlX2NhbWlmX2hhbmRsZV9pcnFfYm90dG9tX2hhbGY7CiAKQEAgLTI1NCw2ICszMzcsNyBAQAogCiAJY2FtaWZfbm9kZS0+c3RhcnQgPSBOVUxMOwogCWNhbWlmX25vZGUtPnN0b3AgID0gTlVMTDsKKwljYW1pZl9ub2RlLT5wcm9jZXNzX2NtZCA9IE5VTEw7CiAJY2FtaWZfbm9kZS0+dG9wX2hhbGZfaGFuZGxlciA9IE5VTEw7CiAJY2FtaWZfbm9kZS0+Ym90dG9tX2hhbGZfaGFuZGxlciA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfY2FtaWZfdmVyMi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmgKaW5kZXggNTUzYWJmMi4uODQ3YjdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9jYW1pZl92ZXIyLmgKQEAgLTUwLDEwICs1MCwxMiBAQAogCXVpbnQzMl90ICAgICBwaXhlbF9wYXR0ZXJuX3NoaWZ0OwogCXVpbnQzMl90ICAgICBwaXhlbF9wYXR0ZXJuX21hc2s7CiAKKwl1aW50MzJfdCAgICAgcmVnX3VwZGF0ZV9jbWRfZGF0YTsKIAl1aW50MzJfdCAgICAgZXBvY2hfbGluZV9jZmc7CiAJdWludDMyX3QgICAgIHNvZl9pcnFfbWFzazsKIAl1aW50MzJfdCAgICAgZXBvY2gwX2lycV9tYXNrOwogCXVpbnQzMl90ICAgICByZWdfdXBkYXRlX2lycV9tYXNrOworCXVpbnQzMl90ICAgICBlb2ZfaXJxX21hc2s7CiB9OwogCiBzdHJ1Y3QgY2FtX3ZmZV9jYW1pZl92ZXIyX2h3X2luZm8gewpAQCAtNjYsOSArNjgsNiBAQAogCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICpjYW1pZl9yZXMsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKmFjcXVpcmVfcGFyYW0pOwogCi1pbnQgY2FtX3ZmZV9jYW1pZl9wcm9jZXNzX2NtZCh2b2lkICpwcml2LAotCXVpbnQzMl90IGNtZF90eXBlLCB2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpOwotCiBpbnQgY2FtX3ZmZV9jYW1pZl92ZXIyX2luaXQoCiAJc3RydWN0IGNhbV9od19pbnRmICAgICAgICAgICAgKmh3X2ludGYsCiAJc3RydWN0IGNhbV9od19zb2NfaW5mbyAgICAgICAgKnNvY19pbmZvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9yZGkuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfcmRpLmMKaW5kZXggZGY3YjBmOS4uNzk3ODczYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9yZGkuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX3RvcC9jYW1fdmZlX3JkaS5jCkBAIC0xMyw5ICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICJjYW1fdmZlX3JkaS5oIgogI2luY2x1ZGUgImNhbV9pc3BfaHdfbWdyX2ludGYuaCIKKyNpbmNsdWRlICJjYW1faXNwX2h3LmgiCiAjaW5jbHVkZSAiY2FtX3ZmZV9od19pbnRmLmgiCiAjaW5jbHVkZSAiY2FtX2lvX3V0aWwuaCIKICNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgorI2luY2x1ZGUgImNhbV9jZG1fdXRpbC5oIgogCiBzdHJ1Y3QgY2FtX3ZmZV9tdXhfcmRpX2RhdGEgewogCXZvaWQgX19pb21lbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1lbV9iYXNlOwpAQCAtMjcsNiArMjksNTQgQEAKIAllbnVtIGNhbV9pc3BfaHdfc3luY19tb2RlICAgICAgICAgIHN5bmNfbW9kZTsKIH07CiAKK3N0YXRpYyBpbnQgY2FtX3ZmZV9yZGlfZ2V0X3JlZ191cGRhdGUoCisJc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAgKnJkaV9yZXMsCisJdm9pZCAqY21kX2FyZ3MsIHVpbnQzMl90IGFyZ19zaXplKQoreworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnX3ZhbF9wYWlyWzJdOworCXN0cnVjdCBjYW1faXNwX2h3X2dldF9jZG1fYXJncyAgICpjZG1fYXJncyA9IGNtZF9hcmdzOworCXN0cnVjdCBjYW1fY2RtX3V0aWxzX29wcyAgICAgICAgICpjZG1fdXRpbF9vcHMgPSBOVUxMOworCXN0cnVjdCBjYW1fdmZlX211eF9yZGlfZGF0YSAgICAgICpyc3JjX2RhdGEgPSBOVUxMOworCisJaWYgKGFyZ19zaXplICE9IHNpemVvZihzdHJ1Y3QgY2FtX2lzcF9od19nZXRfY2RtX2FyZ3MpKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yIC0gSW52YWxpZCBjbWQgc2l6ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWNkbV9hcmdzIHx8ICFjZG1fYXJncy0+cmVzKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yIC0gSW52YWxpZCBhcmdzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNkbV91dGlsX29wcyA9IChzdHJ1Y3QgY2FtX2NkbV91dGlsc19vcHMgKiljZG1fYXJncy0+cmVzLT5jZG1fb3BzOworCWlmICghY2RtX3V0aWxfb3BzKSB7CisJCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yIC0gSW52YWxpZCBDRE0gb3BzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSBjZG1fdXRpbF9vcHMtPmNkbV9yZXF1aXJlZF9zaXplX3JlZ19yYW5kb20oMSk7CisJLyogc2luY2UgY2RtIHJldHVybnMgZHdvcmRzLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgaW50byBieXRlcyAqLworCWlmICgoc2l6ZSAqIDQpID4gY2RtX2FyZ3MtPnNpemUpIHsKKwkJQ0FNX0VSUihDQU1fSVNQLAorCQkJIkVycm9yIC0gYnVmIHNpemU6JWQgaXMgbm90IHN1ZmZpY2llbnQsIGV4cGVjdGVkOiAlZCIsCisJCQljZG1fYXJncy0+c2l6ZSwgc2l6ZSAqIDQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc3JjX2RhdGEgPSByZGlfcmVzLT5yZXNfcHJpdjsKKwlyZWdfdmFsX3BhaXJbMF0gPSByc3JjX2RhdGEtPnJkaV9yZWctPnJlZ191cGRhdGVfY21kOworCXJlZ192YWxfcGFpclsxXSA9IHJzcmNfZGF0YS0+cmVnX2RhdGEtPnJlZ191cGRhdGVfY21kX2RhdGE7CisJQ0FNX0RCRyhDQU1fSVNQLCAiUkRJJWQgcmVnX3VwZGF0ZV9jbWQgJXgiLAorCQlyZGlfcmVzLT5yZXNfaWQgLSBDQU1fSVNQX0hXX1ZGRV9JTl9SREkwLCByZWdfdmFsX3BhaXJbMV0pOworCisJY2RtX3V0aWxfb3BzLT5jZG1fd3JpdGVfcmVncmFuZG9tKGNkbV9hcmdzLT5jbWRfYnVmX2FkZHIsCisJCTEsIHJlZ192YWxfcGFpcik7CisJY2RtX2FyZ3MtPnVzZWRfYnl0ZXMgPSBzaXplICogNDsKKworCXJldHVybiAwOworfQorCiBpbnQgY2FtX3ZmZV9yZGlfdmVyMl9hY3F1aXJlX3Jlc291cmNlKAogCXN0cnVjdCBjYW1faXNwX3Jlc291cmNlX25vZGUgICpyZGlfcmVzLAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICphY3F1aXJlX3BhcmFtKQpAQCAtNjMsOSArMTEzLDExIEBACiAJcmRpX3Jlcy0+cmVzX3N0YXRlID0gQ0FNX0lTUF9SRVNPVVJDRV9TVEFURV9TVFJFQU1JTkc7CiAKIAkvKiBSZWcgVXBkYXRlICovCi0JY2FtX2lvX3dfbWIoMHgyLCByc3JjX2RhdGEtPm1lbV9iYXNlICsgMHg0QUMpOworCWNhbV9pb193X21iKHJzcmNfZGF0YS0+cmVnX2RhdGEtPnJlZ191cGRhdGVfY21kX2RhdGEsCisJCXJzcmNfZGF0YS0+bWVtX2Jhc2UgKyByc3JjX2RhdGEtPnJkaV9yZWctPnJlZ191cGRhdGVfY21kKTsKIAotCUNBTV9EQkcoQ0FNX0lTUCwgIkV4aXQiKTsKKwlDQU1fREJHKENBTV9JU1AsICJTdGFydCBSREkgJWQiLAorCQlyZGlfcmVzLT5yZXNfaWQgLSBDQU1fSVNQX0hXX1ZGRV9JTl9SREkwKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTk1LDE3ICsxNDcsMjEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBjYW1fdmZlX3JkaV9wcm9jZXNzX2NtZCh2b2lkICpwcml2LAorc3RhdGljIGludCBjYW1fdmZlX3JkaV9wcm9jZXNzX2NtZChzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICpyc3JjX25vZGUsCiAJdWludDMyX3QgY21kX3R5cGUsIHZvaWQgKmNtZF9hcmdzLCB1aW50MzJfdCBhcmdfc2l6ZSkKIHsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCi0JaWYgKCFwcml2IHx8ICFjbWRfYXJncykgeworCWlmICghcnNyY19ub2RlIHx8ICFjbWRfYXJncykgewogCQlDQU1fRVJSKENBTV9JU1AsICJFcnJvciEgSW52YWxpZCBpbnB1dCBhcmd1bWVudHMiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3dpdGNoIChjbWRfdHlwZSkgeworCWNhc2UgQ0FNX1ZGRV9IV19DTURfR0VUX1JFR19VUERBVEU6CisJCXJjID0gY2FtX3ZmZV9yZGlfZ2V0X3JlZ191cGRhdGUocnNyY19ub2RlLCBjbWRfYXJncywKKwkJCWFyZ19zaXplKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQ0FNX0VSUihDQU1fSVNQLAogCQkJInVuc3VwcG9ydGVkIFJESSBwcm9jZXNzIGNvbW1hbmQ6JWQiLCBjbWRfdHlwZSk7CkBAIC0yMTEsNiArMjY3LDcgQEAKIAogCXJkaV9ub2RlLT5zdGFydCA9IGNhbV92ZmVfcmRpX3Jlc291cmNlX3N0YXJ0OwogCXJkaV9ub2RlLT5zdG9wICA9IGNhbV92ZmVfcmRpX3Jlc291cmNlX3N0b3A7CisJcmRpX25vZGUtPnByb2Nlc3NfY21kID0gY2FtX3ZmZV9yZGlfcHJvY2Vzc19jbWQ7CiAJcmRpX25vZGUtPnRvcF9oYWxmX2hhbmRsZXIgPSBjYW1fdmZlX3JkaV9oYW5kbGVfaXJxX3RvcF9oYWxmOwogCXJkaV9ub2RlLT5ib3R0b21faGFsZl9oYW5kbGVyID0gY2FtX3ZmZV9yZGlfaGFuZGxlX2lycV9ib3R0b21faGFsZjsKIApAQCAtMjI3LDYgKzI4NCw3IEBACiAKIAlyZGlfbm9kZS0+c3RhcnQgPSBOVUxMOwogCXJkaV9ub2RlLT5zdG9wICA9IE5VTEw7CisJcmRpX25vZGUtPnByb2Nlc3NfY21kID0gTlVMTDsKIAlyZGlfbm9kZS0+dG9wX2hhbGZfaGFuZGxlciA9IE5VTEw7CiAJcmRpX25vZGUtPmJvdHRvbV9oYWxmX2hhbmRsZXIgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX3RvcC9jYW1fdmZlX3JkaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV9yZGkuaAppbmRleCAwNGU0ZjAyLi4zMmE2N2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX3RvcC9jYW1fdmZlX3JkaS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfcmRpLmgKQEAgLTM4LDkgKzM4LDYgQEAKIAlzdHJ1Y3QgY2FtX2lzcF9yZXNvdXJjZV9ub2RlICAqcmRpX3JlcywKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqYWNxdWlyZV9wYXJhbSk7CiAKLWludCBjYW1fdmZlX3JkaV9wcm9jZXNzX2NtZCh2b2lkICpwcml2LAotCXVpbnQzMl90IGNtZF90eXBlLCB2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpOwotCiBpbnQgY2FtX3ZmZV9yZGlfdmVyMl9pbml0KAogCXN0cnVjdCBjYW1faHdfaW50ZiAgICAgICAgICAgICpod19pbnRmLAogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICAgICAgICpzb2NfaW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfdG9wX3ZlcjIuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1faXNwL2lzcF9od19tZ3IvaXNwX2h3L3ZmZV9ody92ZmVfdG9wL2NhbV92ZmVfdG9wX3ZlcjIuYwppbmRleCAxYTNlZWFlLi5mODc5NTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2lzcC9pc3BfaHdfbWdyL2lzcF9ody92ZmVfaHcvdmZlX3RvcC9jYW1fdmZlX3RvcF92ZXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9pc3AvaXNwX2h3X21nci9pc3BfaHcvdmZlX2h3L3ZmZV90b3AvY2FtX3ZmZV90b3BfdmVyMi5jCkBAIC04MCw1MyArODAsMTMgQEAKIAlzdHJ1Y3QgY2FtX3ZmZV90b3BfdmVyMl9wcml2ICp0b3BfcHJpdiwKIAl2b2lkICpjbWRfYXJncywgdWludDMyX3QgYXJnX3NpemUpCiB7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfdmFsX3BhaXJbMl07CiAJc3RydWN0IGNhbV9pc3BfaHdfZ2V0X2NkbV9hcmdzICAgKmNkbV9hcmdzID0gY21kX2FyZ3M7Ci0Jc3RydWN0IGNhbV9jZG1fdXRpbHNfb3BzICAgICAgICAgKmNkbV91dGlsX29wcyA9IE5VTEw7CiAKLQlpZiAoYXJnX3NpemUgIT0gc2l6ZW9mKHN0cnVjdCBjYW1faXNwX2h3X2dldF9jZG1fYXJncykpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgY21kIHNpemUiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmIChjZG1fYXJncy0+cmVzLT5wcm9jZXNzX2NtZCkKKwkJcmV0dXJuIGNkbV9hcmdzLT5yZXMtPnByb2Nlc3NfY21kKGNkbV9hcmdzLT5yZXMsCisJCQlDQU1fVkZFX0hXX0NNRF9HRVRfUkVHX1VQREFURSwgY21kX2FyZ3MsIGFyZ19zaXplKTsKIAotCWlmICghY2RtX2FyZ3MgfHwgIWNkbV9hcmdzLT5yZXMpIHsKLQkJQ0FNX0VSUihDQU1fSVNQLCAiRXJyb3IhIEludmFsaWQgYXJncyIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljZG1fdXRpbF9vcHMgPSAoc3RydWN0IGNhbV9jZG1fdXRpbHNfb3BzICopY2RtX2FyZ3MtPnJlcy0+Y2RtX29wczsKLQotCWlmICghY2RtX3V0aWxfb3BzKSB7Ci0JCUNBTV9FUlIoQ0FNX0lTUCwgIkVycm9yISBJbnZhbGlkIENETSBvcHMiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc2l6ZSA9IGNkbV91dGlsX29wcy0+Y2RtX3JlcXVpcmVkX3NpemVfcmVnX3JhbmRvbSgxKTsKLQkvKiBzaW5jZSBjZG0gcmV0dXJucyBkd29yZHMsIHdlIG5lZWQgdG8gY29udmVydCBpdCBpbnRvIGJ5dGVzICovCi0JaWYgKChzaXplICogNCkgPiBjZG1fYXJncy0+c2l6ZSkgewotCQlDQU1fRVJSKENBTV9JU1AsICJidWYgc2l6ZTolZCBpcyBub3Qgc3VmZmljaWVudCwgZXhwZWN0ZWQ6ICVkIiwKLQkJCWNkbV9hcmdzLT5zaXplLCBzaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmVnX3ZhbF9wYWlyWzBdID0gdG9wX3ByaXYtPmNvbW1vbl9kYXRhLmNvbW1vbl9yZWctPnJlZ191cGRhdGVfY21kOwotCi0JaWYgKGNkbV9hcmdzLT5yZXMtPnJlc19pZCA9PSBDQU1fSVNQX0hXX1ZGRV9JTl9DQU1JRikKLQkJcmVnX3ZhbF9wYWlyWzFdID0gQklUKDApOwotCWVsc2UgewotCQl1aW50MzJfdCByZGlfbnVtID0gY2RtX2FyZ3MtPnJlcy0+cmVzX2lkIC0KLQkJCUNBTV9JU1BfSFdfVkZFX0lOX1JESTA7Ci0JCS8qIFJESSByZWdfdXBkYXRlIHN0YXJ0cyBhdCBCSVQgMSwgc28gYWRkIDEgKi8KLQkJcmVnX3ZhbF9wYWlyWzFdID0gQklUKHJkaV9udW0gKyAxKTsKLQl9Ci0KLQljZG1fdXRpbF9vcHMtPmNkbV93cml0ZV9yZWdyYW5kb20oY2RtX2FyZ3MtPmNtZF9idWZfYWRkciwKLQkJMSwgcmVnX3ZhbF9wYWlyKTsKLQotCWNkbV9hcmdzLT51c2VkX2J5dGVzID0gc2l6ZSAqIDQ7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogaW50IGNhbV92ZmVfdG9wX2dldF9od19jYXBzKHZvaWQgKmRldmljZV9wcml2LApAQCAtMjU3LDEyICsyMTcsOCBAQAogCXRvcF9wcml2ID0gKHN0cnVjdCBjYW1fdmZlX3RvcF92ZXIyX3ByaXYgICAqKWRldmljZV9wcml2OwogCW11eF9yZXMgPSAoc3RydWN0IGNhbV9pc3BfcmVzb3VyY2Vfbm9kZSAqKXN0YXJ0X2FyZ3M7CiAKLQlpZiAobXV4X3Jlcy0+cmVzX2lkID09IENBTV9JU1BfSFdfVkZFX0lOX0NBTUlGKSB7CisJaWYgKG11eF9yZXMtPnN0YXJ0KSB7CiAJCXJjID0gbXV4X3Jlcy0+c3RhcnQobXV4X3Jlcyk7Ci0JfSBlbHNlIGlmIChtdXhfcmVzLT5yZXNfaWQgPj0gQ0FNX0lTUF9IV19WRkVfSU5fUkRJMCAmJgotCQltdXhfcmVzLT5yZXNfaWQgPD0gQ0FNX0lTUF9IV19WRkVfSU5fUkRJMykgewotCQltdXhfcmVzLT5yZXNfc3RhdGUgPSBDQU1fSVNQX1JFU09VUkNFX1NUQVRFX1NUUkVBTUlORzsKLQkJcmMgPSAwOwogCX0gZWxzZSB7CiAJCUNBTV9FUlIoQ0FNX0lTUCwgIkludmFsaWQgcmVzIGlkOiVkIiwgbXV4X3Jlcy0+cmVzX2lkKTsKIAkJcmMgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvY2FtX2pwZWdfaHdfbWdyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9jYW1fanBlZ19od19tZ3IuYwppbmRleCBiMDZiNWM0Li4yY2Q2YjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9jYW1fanBlZ19od19tZ3IuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9jYW1fanBlZ19od19tZ3IuYwpAQCAtMjE0LDIyICsyMTQsMjIgQEAKIAogCiBzdGF0aWMgaW50IGNhbV9qcGVnX21ncl9yZWxlYXNlX2N0eCgKLQlzdHJ1Y3QgY2FtX2pwZWdfaHdfbWdyICpod19tZ3IsIGludCBjdHhfaWQpCisJc3RydWN0IGNhbV9qcGVnX2h3X21nciAqaHdfbWdyLCBzdHJ1Y3QgY2FtX2pwZWdfaHdfY3R4X2RhdGEgKmN0eF9kYXRhKQogewotCWlmIChjdHhfaWQgPj0gQ0FNX0pQRUdfQ1RYX01BWCkgewotCQlDQU1fRVJSKENBTV9KUEVHLCAiY3R4X2lkIGlzIHdyb25nOiAlZCIsIGN0eF9pZCk7CisJaWYgKCFjdHhfZGF0YSkgeworCQlDQU1fRVJSKENBTV9KUEVHLCAiaW52YWxpZCBjdHhfZGF0YSAlcEsiLCBjdHhfZGF0YSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW11dGV4X2xvY2soJmh3X21nci0+Y3R4X2RhdGFbY3R4X2lkXS5jdHhfbXV0ZXgpOwotCWlmICghaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmluX3VzZSkgewotCQlDQU1fRVJSKENBTV9KUEVHLCAiY3R4IGlzIGFscmVhZHkgaW4gdXNlOiAlZCIsIGN0eF9pZCk7Ci0JCW11dGV4X3VubG9jaygmaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmN0eF9tdXRleCk7CisJbXV0ZXhfbG9jaygmY3R4X2RhdGEtPmN0eF9tdXRleCk7CisJaWYgKCFjdHhfZGF0YS0+aW5fdXNlKSB7CisJCUNBTV9FUlIoQ0FNX0pQRUcsICJjdHggaXMgYWxyZWFkeSB1bi11c2VkOiAlcEsiLCBjdHhfZGF0YSk7CisJCW11dGV4X3VubG9jaygmY3R4X2RhdGEtPmN0eF9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWh3X21nci0+Y3R4X2RhdGFbY3R4X2lkXS5pbl91c2UgPSAwOwotCW11dGV4X3VubG9jaygmaHdfbWdyLT5jdHhfZGF0YVtjdHhfaWRdLmN0eF9tdXRleCk7CisJY3R4X2RhdGEtPmluX3VzZSA9IGZhbHNlOworCW11dGV4X3VubG9jaygmY3R4X2RhdGEtPmN0eF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4MCw3ICsyODAsOCBAQAogCQlod19tZ3ItPmRldl9od19jZmdfYXJnc1twX2NmZ19yZXEtPmRldl90eXBlXVswXSA9IHBfY2ZnX3JlcTsKIAkJbGlzdF9kZWxfaW5pdCgmcF9jZmdfcmVxLT5saXN0KTsKIAl9IGVsc2UgewotCQlDQU1fRVJSKENBTV9KUEVHLCAiTk9UIGRlcXVlaW5nLCBqdXN0IHJldHVybiIpOworCQlDQU1fREJHKENBTV9KUEVHLCAiTm90IGRlcXVlaW5nLCBqdXN0IHJldHVybiIpOworCQltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKIAkJcmMgPSAtRUZBVUxUOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0yODksNyArMjkwLDcgQEAKIAljb25maWdfYXJncyA9IChzdHJ1Y3QgY2FtX2h3X2NvbmZpZ19hcmdzICopJnBfY2ZnX3JlcS0+aHdfY2ZnX2FyZ3M7CiAJcmVxdWVzdF9pZCA9IHRhc2tfZGF0YS0+cmVxdWVzdF9pZDsKIAlpZiAocmVxdWVzdF9pZCAhPSAodWludDY0X3QpY29uZmlnX2FyZ3MtPnByaXYpIHsKLQkJQ0FNX1dBUk4oQ0FNX0pQRUcsICJub3QgYSByZWNlbnQgcmVxICVkICVkIiwKKwkJQ0FNX0RCRyhDQU1fSlBFRywgIm5vdCBhIHJlY2VudCByZXEgJWxsZCAlbGxkIiwKIAkJCXJlcXVlc3RfaWQsICh1aW50NjRfdCljb25maWdfYXJncy0+cHJpdik7CiAJfQogCkBAIC00NzUsOCArNDc2LDggQEAKIAogCXJlcXVlc3RfaWQgPSAodWludDY0X3QpY29uZmlnX2FyZ3MtPnByaXY7CiAJaHdfdXBkYXRlX2VudHJpZXMgPSBjb25maWdfYXJncy0+aHdfdXBkYXRlX2VudHJpZXM7Ci0JQ0FNX0RCRyhDQU1fSlBFRywgImN0eF9kYXRhID0gJXBLIHJlcV9pZCA9ICVkICVwSyIsCi0JCWN0eF9kYXRhLCByZXF1ZXN0X2lkLCBjb25maWdfYXJncy0+cHJpdik7CisJQ0FNX0RCRyhDQU1fSlBFRywgImN0eF9kYXRhID0gJXBLIHJlcV9pZCA9ICVsbGQgJWxsZCIsCisJCWN0eF9kYXRhLCByZXF1ZXN0X2lkLCAodWludDY0X3QpY29uZmlnX2FyZ3MtPnByaXYpOwogCXRhc2sgPSBjYW1fcmVxX21ncl93b3JrcV9nZXRfdGFzayhnX2pwZWdfaHdfbWdyLndvcmtfcHJvY2Vzc19mcmFtZSk7CiAJaWYgKCF0YXNrKSB7CiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJubyBlbXB0eSB0YXNrIik7CkBAIC01NzgsNyArNTc5LDcgQEAKIAkJKHZvaWQgKilwYWNrZXQsICh2b2lkICopY21kX2Rlc2MsCiAJCXNpemVvZihzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYykpOwogCi0JcmMgPSBjYW1fcGFja2V0X3V0aWxfcHJvY2Vzc19wYXRjaGVzKHBhY2tldCwgaHdfbWdyLT5pb21tdV9oZGwpOworCXJjID0gY2FtX3BhY2tldF91dGlsX3Byb2Nlc3NfcGF0Y2hlcyhwYWNrZXQsIGh3X21nci0+aW9tbXVfaGRsLCAtMSk7CiAJaWYgKHJjKSB7CiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJQYXRjaCBwcm9jZXNzaW5nIGZhaWxlZCAlZCIsIHJjKTsKIAkJcmV0dXJuIHJjOwpAQCAtNjMxLDEzICs2MzIsMTIgQEAKIHN0YXRpYyBpbnQgY2FtX2pwZWdfbWdyX3JlbGVhc2VfaHcodm9pZCAqaHdfbWdyX3ByaXYsIHZvaWQgKnJlbGVhc2VfaHdfYXJncykKIHsKIAlpbnQgcmM7Ci0JaW50IGN0eF9pZCA9IDA7CiAJc3RydWN0IGNhbV9od19yZWxlYXNlX2FyZ3MgKnJlbGVhc2VfaHcgPSByZWxlYXNlX2h3X2FyZ3M7CiAJc3RydWN0IGNhbV9qcGVnX2h3X21nciAqaHdfbWdyID0gaHdfbWdyX3ByaXY7CiAJc3RydWN0IGNhbV9qcGVnX2h3X2N0eF9kYXRhICpjdHhfZGF0YSA9IE5VTEw7CiAJdWludDMyX3QgZGV2X3R5cGU7CiAKLQlpZiAoIXJlbGVhc2VfaHcgfHwgIWh3X21ncikgeworCWlmICghaHdfbWdyIHx8ICFyZWxlYXNlX2h3IHx8ICFyZWxlYXNlX2h3LT5jdHh0X3RvX2h3X21hcCkgewogCQlDQU1fRVJSKENBTV9KUEVHLCAiSW52YWxpZCBhcmdzIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTY3MSw3ICs2NzEsNyBAQAogCX0KIAltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKIAotCXJjID0gY2FtX2pwZWdfbWdyX3JlbGVhc2VfY3R4KGh3X21nciwgY3R4X2lkKTsKKwlyYyA9IGNhbV9qcGVnX21ncl9yZWxlYXNlX2N0eChod19tZ3IsIGN0eF9kYXRhKTsKIAlpZiAocmMpIHsKIAkJbXV0ZXhfdW5sb2NrKCZod19tZ3ItPmh3X21ncl9tdXRleCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODM4LDcgKzgzOCw3IEBACiAJY2FtX2NkbV9yZWxlYXNlKGh3X21nci0+Y2RtX2luZm9bZGV2X3R5cGVdWzBdLmNkbV9oYW5kbGUpOwogYWNxX2NkbV9oZGxfZmFpbGVkOgogCWtmcmVlKGN0eF9kYXRhLT5jZG1fY21kKTsKLQljYW1fanBlZ19tZ3JfcmVsZWFzZV9jdHgoaHdfbWdyLCBjdHhfaWQpOworCWNhbV9qcGVnX21ncl9yZWxlYXNlX2N0eChod19tZ3IsIGN0eF9kYXRhKTsKIAltdXRleF91bmxvY2soJmh3X21nci0+aHdfbWdyX211dGV4KTsKIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZG1hX2h3L2pwZWdfZG1hX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZG1hX2h3L2pwZWdfZG1hX2NvcmUuYwppbmRleCAwNWMxYTk1Li4wYTE1ZjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2RtYV9ody9qcGVnX2RtYV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfY29yZS5jCkBAIC01Nyw2ICs1NywxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKworCW11dGV4X2xvY2soJmNvcmVfaW5mby0+Y29yZV9tdXRleCk7CisJaWYgKCsrY29yZV9pbmZvLT5yZWZfY291bnQgPiAxKSB7CisJCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCiAJY3Bhc192b3RlLmFoYl92b3RlLnR5cGUgPSBDQU1fVk9URV9BQlNPTFVURTsKIAljcGFzX3ZvdGUuYWhiX3ZvdGUudm90ZS5sZXZlbCA9IENBTV9TVlNfVk9URTsKIAljcGFzX3ZvdGUuYXhpX3ZvdGUuY29tcHJlc3NlZF9idyA9IEpQRUdfVFVSQk9fVk9URTsKQEAgLTY0LDE1ICs3MSwyNiBAQAogCiAJcmMgPSBjYW1fY3Bhc19zdGFydChjb3JlX2luZm8tPmNwYXNfaGFuZGxlLAogCQkmY3Bhc192b3RlLmFoYl92b3RlLCAmY3Bhc192b3RlLmF4aV92b3RlKTsKLQlpZiAocmMpCisJaWYgKHJjKSB7CiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJjcGFzcyBzdGFydCBmYWlsZWQ6ICVkIiwgcmMpOworCQlnb3RvIGNwYXNfZmFpbGVkOworCX0KIAogCXJjID0gY2FtX2pwZWdfZG1hX2VuYWJsZV9zb2NfcmVzb3VyY2VzKHNvY19pbmZvKTsKIAlpZiAocmMpIHsKIAkJQ0FNX0VSUihDQU1fSlBFRywgInNvYyBlbmFibGUgaXMgZmFpbGVkICVkIiwgcmMpOwotCQljYW1fY3Bhc19zdG9wKGNvcmVfaW5mby0+Y3Bhc19oYW5kbGUpOworCQlnb3RvIHNvY19mYWlsZWQ7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOworCisJcmV0dXJuIDA7CisKK3NvY19mYWlsZWQ6CisJY2FtX2NwYXNfc3RvcChjb3JlX2luZm8tPmNwYXNfaGFuZGxlKTsKK2NwYXNfZmFpbGVkOgorCS0tY29yZV9pbmZvLT5yZWZfY291bnQ7CisJbXV0ZXhfdW5sb2NrKCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIApAQCAtOTgsNiArMTE2LDE5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCW11dGV4X2xvY2soJmNvcmVfaW5mby0+Y29yZV9tdXRleCk7CisJaWYgKC0tY29yZV9pbmZvLT5yZWZfY291bnQgPiAwKSB7CisJCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNvcmVfaW5mby0+cmVmX2NvdW50IDwgMCkgeworCQlDQU1fRVJSKENBTV9KUEVHLCAicmVmIGNudCAlZCIsIGNvcmVfaW5mby0+cmVmX2NvdW50KTsKKwkJY29yZV9pbmZvLT5yZWZfY291bnQgPSAwOworCQltdXRleF91bmxvY2soJmNvcmVfaW5mby0+Y29yZV9tdXRleCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwogCXJjID0gY2FtX2pwZWdfZG1hX2Rpc2FibGVfc29jX3Jlc291cmNlcyhzb2NfaW5mbyk7CiAJaWYgKHJjKQogCQlDQU1fRVJSKENBTV9KUEVHLCAic29jIGVuYWJsZSBmYWlsZWQgJWQiLCByYyk7CkBAIC0xMDYsNiArMTM3LDggQEAKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJjcGFzIHN0b3AgZmFpbGVkOiAlZCIsIHJjKTsKIAorCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2RtYV9ody9qcGVnX2RtYV9jb3JlLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2RtYV9ody9qcGVnX2RtYV9jb3JlLmgKaW5kZXggYmI0ZTM0YS4uMWUwYzJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfY29yZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZG1hX2h3L2pwZWdfZG1hX2NvcmUuaApAQCAtNDEsNiArNDEsOCBAQAogCXN0cnVjdCBjYW1fanBlZ19kbWFfZGV2aWNlX2h3X2luZm8gKmpwZWdfZG1hX2h3X2luZm87CiAJdWludDMyX3QgY3Bhc19oYW5kbGU7CiAJc3RydWN0IGNhbV9qcGVnX2RtYV9zZXRfaXJxX2NiIGlycV9jYjsKKwlpbnQzMl90IHJlZl9jb3VudDsKKwlzdHJ1Y3QgbXV0ZXggY29yZV9tdXRleDsKIH07CiAKIGludCBjYW1fanBlZ19kbWFfaW5pdF9odyh2b2lkICpkZXZpY2VfcHJpdiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZG1hX2h3L2pwZWdfZG1hX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfZGV2LmMKaW5kZXggODI5YmI1MS4uZWQ1OGI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfZGV2LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlzdHJ1Y3QgY2FtX2NwYXNfcmVnaXN0ZXJfcGFyYW1zIGNwYXNfcmVnaXN0ZXJfcGFyYW1zOwogCWludCByYzsKIAotCWNwYXNfcmVnaXN0ZXJfcGFyYW1zLmRldiA9ICZzb2NfaW5mby0+cGRldi0+ZGV2OworCWNwYXNfcmVnaXN0ZXJfcGFyYW1zLmRldiA9IHNvY19pbmZvLT5kZXY7CiAJbWVtY3B5KGNwYXNfcmVnaXN0ZXJfcGFyYW1zLmlkZW50aWZpZXIsICJqcGVnLWRtYSIsCiAJCXNpemVvZigianBlZy1kbWEiKSk7CiAJY3Bhc19yZWdpc3Rlcl9wYXJhbXMuY2FtX2NwYXNfY2xpZW50X2NiID0gTlVMTDsKQEAgLTk5LDYgKzk5LDcgQEAKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX0pQRUcsICIgdW5yZWcgZmFpbGVkIHRvIHJlZyBjcGFzICVkIiwgcmMpOwogCisJbXV0ZXhfZGVzdHJveSgmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKIAlrZnJlZShjb3JlX2luZm8pOwogCiBkZWluaXRfc29jOgpAQCAtMTM2LDYgKzEzNyw4IEBACiAJCWdvdG8gZXJyb3JfYWxsb2NfZGV2OwogCX0KIAlqcGVnX2RtYV9kZXYtPnNvY19pbmZvLnBkZXYgPSBwZGV2OworCWpwZWdfZG1hX2Rldi0+c29jX2luZm8uZGV2ID0gJnBkZXYtPmRldjsKKwlqcGVnX2RtYV9kZXYtPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAlqcGVnX2RtYV9kZXZfaW50Zi0+aHdfcHJpdiA9IGpwZWdfZG1hX2RldjsKIAlqcGVnX2RtYV9kZXZfaW50Zi0+aHdfb3BzLmluaXQgPSBjYW1fanBlZ19kbWFfaW5pdF9odzsKIAlqcGVnX2RtYV9kZXZfaW50Zi0+aHdfb3BzLmRlaW5pdCA9IGNhbV9qcGVnX2RtYV9kZWluaXRfaHc7CkBAIC0xNjMsMTMgKzE2NiwxNCBAQAogCWh3X2luZm8gPSAoc3RydWN0IGNhbV9qcGVnX2RtYV9kZXZpY2VfaHdfaW5mbyAqKW1hdGNoX2Rldi0+ZGF0YTsKIAljb3JlX2luZm8tPmpwZWdfZG1hX2h3X2luZm8gPSBod19pbmZvOwogCWNvcmVfaW5mby0+Y29yZV9zdGF0ZSA9IENBTV9KUEVHX0RNQV9DT1JFX05PVF9SRUFEWTsKKwltdXRleF9pbml0KCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOwogCiAJcmMgPSBjYW1fanBlZ19kbWFfaW5pdF9zb2NfcmVzb3VyY2VzKCZqcGVnX2RtYV9kZXYtPnNvY19pbmZvLAogCQljYW1fanBlZ19kbWFfaXJxLAogCQlqcGVnX2RtYV9kZXYpOwogCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9KUEVHLCAiJWZhaWxlZCB0byBpbml0X3NvYyAlZCIsIHJjKTsKLQkJZ290byBlcnJvcl9tYXRjaF9kZXY7CisJCWdvdG8gZXJyb3JfaW5pdF9zb2M7CiAJfQogCiAJcmMgPSBjYW1fanBlZ19kbWFfcmVnaXN0ZXJfY3BhcygmanBlZ19kbWFfZGV2LT5zb2NfaW5mbywKQEAgLTE4OSw2ICsxOTMsOCBAQAogCiBlcnJvcl9yZWdfY3BhczoKIAlyYyA9IGNhbV9zb2NfdXRpbF9yZWxlYXNlX3BsYXRmb3JtX3Jlc291cmNlKCZqcGVnX2RtYV9kZXYtPnNvY19pbmZvKTsKK2Vycm9yX2luaXRfc29jOgorCW11dGV4X2Rlc3Ryb3koJmNvcmVfaW5mby0+Y29yZV9tdXRleCk7CiBlcnJvcl9tYXRjaF9kZXY6CiAJa2ZyZWUoanBlZ19kbWFfZGV2LT5jb3JlX2luZm8pOwogZXJyb3JfYWxsb2NfY29yZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZG1hX2h3L2pwZWdfZG1hX3NvYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfc29jLmMKaW5kZXggZWZjMTYxYi4uNjNkNTRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfc29jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19kbWFfaHcvanBlZ19kbWFfc29jLmMKQEAgLTU1LDcgKzU1LDcgQEAKIHsKIAlpbnQgcmM7CiAKLQlyYyA9IGNhbV9zb2NfdXRpbF9kaXNhYmxlX3BsYXRmb3JtX3Jlc291cmNlKHNvY19pbmZvLCB0cnVlLCBmYWxzZSk7CisJcmMgPSBjYW1fc29jX3V0aWxfZGlzYWJsZV9wbGF0Zm9ybV9yZXNvdXJjZShzb2NfaW5mbywgdHJ1ZSwgdHJ1ZSk7CiAJaWYgKHJjKQogCQlDQU1fRVJSKENBTV9KUEVHLCAiZGlzYWJsZSBwbGF0Zm9ybSBmYWlsZWQgJWQiLCByYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZW5jX2h3L2pwZWdfZW5jX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZW5jX2h3L2pwZWdfZW5jX2NvcmUuYwppbmRleCAyNTQwNWNmLi4wNmFkMjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19lbmNfaHcvanBlZ19lbmNfY29yZS5jCkBAIC0xMDAsNiArMTAwLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCisJbXV0ZXhfbG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwlpZiAoKytjb3JlX2luZm8tPnJlZl9jb3VudCA+IDEpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKIAljcGFzX3ZvdGUuYWhiX3ZvdGUudHlwZSA9IENBTV9WT1RFX0FCU09MVVRFOwogCWNwYXNfdm90ZS5haGJfdm90ZS52b3RlLmxldmVsID0gQ0FNX1NWU19WT1RFOwogCWNwYXNfdm90ZS5heGlfdm90ZS5jb21wcmVzc2VkX2J3ID0gSlBFR19UVVJCT19WT1RFOwpAQCAtMTA3LDE1ICsxMTQsMjYgQEAKIAogCXJjID0gY2FtX2NwYXNfc3RhcnQoY29yZV9pbmZvLT5jcGFzX2hhbmRsZSwKIAkJJmNwYXNfdm90ZS5haGJfdm90ZSwgJmNwYXNfdm90ZS5heGlfdm90ZSk7Ci0JaWYgKHJjKQorCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9KUEVHLCAiY3Bhc3Mgc3RhcnQgZmFpbGVkOiAlZCIsIHJjKTsKKwkJZ290byBjcGFzX2ZhaWxlZDsKKwl9CiAKIAlyYyA9IGNhbV9qcGVnX2VuY19lbmFibGVfc29jX3Jlc291cmNlcyhzb2NfaW5mbyk7CiAJaWYgKHJjKSB7CiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJzb2MgZW5hYmxlIGlzIGZhaWxlZCAlZCIsIHJjKTsKLQkJY2FtX2NwYXNfc3RvcChjb3JlX2luZm8tPmNwYXNfaGFuZGxlKTsKKwkJZ290byBzb2NfZmFpbGVkOwogCX0KIAorCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKworCXJldHVybiAwOworCitzb2NfZmFpbGVkOgorCWNhbV9jcGFzX3N0b3AoY29yZV9pbmZvLT5jcGFzX2hhbmRsZSk7CitjcGFzX2ZhaWxlZDoKKwktLWNvcmVfaW5mby0+cmVmX2NvdW50OworCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MSw2ICsxNTksMTkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJbXV0ZXhfbG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwlpZiAoLS1jb3JlX2luZm8tPnJlZl9jb3VudCA+IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY29yZV9pbmZvLT5yZWZfY291bnQgPCAwKSB7CisJCUNBTV9FUlIoQ0FNX0pQRUcsICJyZWYgY250ICVkIiwgY29yZV9pbmZvLT5yZWZfY291bnQpOworCQljb3JlX2luZm8tPnJlZl9jb3VudCA9IDA7CisJCW11dGV4X3VubG9jaygmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCiAJcmMgPSBjYW1fanBlZ19lbmNfZGlzYWJsZV9zb2NfcmVzb3VyY2VzKHNvY19pbmZvKTsKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJzb2MgZW5hYmxlIGZhaWxlZCAlZCIsIHJjKTsKQEAgLTE0OSw2ICsxODAsOCBAQAogCWlmIChyYykKIAkJQ0FNX0VSUihDQU1fSlBFRywgImNwYXMgc3RvcCBmYWlsZWQ6ICVkIiwgcmMpOwogCisJbXV0ZXhfdW5sb2NrKCZjb3JlX2luZm8tPmNvcmVfbXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZW5jX2h3L2pwZWdfZW5jX2NvcmUuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fanBlZy9qcGVnX2h3L2pwZWdfZW5jX2h3L2pwZWdfZW5jX2NvcmUuaAppbmRleCA2YWU0Y2RjLi5lYjVjYWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19jb3JlLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19lbmNfaHcvanBlZ19lbmNfY29yZS5oCkBAIC00NSw2ICs0NSw4IEBACiAJc3RydWN0IGNhbV9qcGVnX2VuY19kZXZpY2VfaHdfaW5mbyAqanBlZ19lbmNfaHdfaW5mbzsKIAl1aW50MzJfdCBjcGFzX2hhbmRsZTsKIAlzdHJ1Y3QgY2FtX2pwZWdfZW5jX3NldF9pcnFfY2IgaXJxX2NiOworCWludDMyX3QgcmVmX2NvdW50OworCXN0cnVjdCBtdXRleCBjb3JlX211dGV4OwogfTsKIAogaW50IGNhbV9qcGVnX2VuY19pbml0X2h3KHZvaWQgKmRldmljZV9wcml2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19lbmNfaHcvanBlZ19lbmNfZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19kZXYuYwppbmRleCA1ZGQxZTFmLi41NzBkOWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19kZXYuYwpAQCAtNDIsNyArNDIsNyBAQAogCXN0cnVjdCBjYW1fY3Bhc19yZWdpc3Rlcl9wYXJhbXMgY3Bhc19yZWdpc3Rlcl9wYXJhbXM7CiAJaW50IHJjOwogCi0JY3Bhc19yZWdpc3Rlcl9wYXJhbXMuZGV2ID0gJnNvY19pbmZvLT5wZGV2LT5kZXY7CisJY3Bhc19yZWdpc3Rlcl9wYXJhbXMuZGV2ID0gc29jX2luZm8tPmRldjsKIAltZW1jcHkoY3Bhc19yZWdpc3Rlcl9wYXJhbXMuaWRlbnRpZmllciwgImpwZWctZW5jIiwKIAkJc2l6ZW9mKCJqcGVnLWVuYyIpKTsKIAljcGFzX3JlZ2lzdGVyX3BhcmFtcy5jYW1fY3Bhc19jbGllbnRfY2IgPSBOVUxMOwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJaWYgKHJjKQogCQlDQU1fRVJSKENBTV9KUEVHLCAiIHVucmVnIGZhaWxlZCB0byByZWcgY3BhcyAlZCIsIHJjKTsKIAorCW11dGV4X2Rlc3Ryb3koJmNvcmVfaW5mby0+Y29yZV9tdXRleCk7CiAJa2ZyZWUoY29yZV9pbmZvKTsKIAogZGVpbml0X3NvYzoKQEAgLTE0MCw2ICsxNDEsOCBAQAogCQlnb3RvIGVycm9yX2FsbG9jX2RldjsKIAl9CiAJanBlZ19lbmNfZGV2LT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlqcGVnX2VuY19kZXYtPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJanBlZ19lbmNfZGV2LT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJanBlZ19lbmNfZGV2X2ludGYtPmh3X3ByaXYgPSBqcGVnX2VuY19kZXY7CiAJanBlZ19lbmNfZGV2X2ludGYtPmh3X29wcy5pbml0ID0gY2FtX2pwZWdfZW5jX2luaXRfaHc7CiAJanBlZ19lbmNfZGV2X2ludGYtPmh3X29wcy5kZWluaXQgPSBjYW1fanBlZ19lbmNfZGVpbml0X2h3OwpAQCAtMTY5LDEzICsxNzIsMTQgQEAKIAlod19pbmZvID0gKHN0cnVjdCBjYW1fanBlZ19lbmNfZGV2aWNlX2h3X2luZm8gKiltYXRjaF9kZXYtPmRhdGE7CiAJY29yZV9pbmZvLT5qcGVnX2VuY19od19pbmZvID0gaHdfaW5mbzsKIAljb3JlX2luZm8tPmNvcmVfc3RhdGUgPSBDQU1fSlBFR19FTkNfQ09SRV9OT1RfUkVBRFk7CisJbXV0ZXhfaW5pdCgmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKIAogCXJjID0gY2FtX2pwZWdfZW5jX2luaXRfc29jX3Jlc291cmNlcygmanBlZ19lbmNfZGV2LT5zb2NfaW5mbywKIAkJY2FtX2pwZWdfZW5jX2lycSwKIAkJanBlZ19lbmNfZGV2KTsKIAlpZiAocmMpIHsKIAkJQ0FNX0VSUihDQU1fSlBFRywgIiBmYWlsZWQgdG8gaW5pdF9zb2MgJWQiLCByYyk7Ci0JCWdvdG8gZXJyb3JfbWF0Y2hfZGV2OworCQlnb3RvIGVycm9yX2luaXRfc29jOwogCX0KIAogCXJjID0gY2FtX2pwZWdfZW5jX3JlZ2lzdGVyX2NwYXMoJmpwZWdfZW5jX2Rldi0+c29jX2luZm8sCkBAIC0xOTMsNiArMTk3LDggQEAKIAogZXJyb3JfcmVnX2NwYXM6CiAJY2FtX3NvY191dGlsX3JlbGVhc2VfcGxhdGZvcm1fcmVzb3VyY2UoJmpwZWdfZW5jX2Rldi0+c29jX2luZm8pOworZXJyb3JfaW5pdF9zb2M6CisJbXV0ZXhfZGVzdHJveSgmY29yZV9pbmZvLT5jb3JlX211dGV4KTsKIGVycm9yX21hdGNoX2RldjoKIAlrZnJlZShqcGVnX2VuY19kZXYtPmNvcmVfaW5mbyk7CiBlcnJvcl9hbGxvY19jb3JlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9qcGVnL2pwZWdfaHcvanBlZ19lbmNfaHcvanBlZ19lbmNfc29jLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19zb2MuYwppbmRleCAzZjQ1MGNkLi5kZGYyNDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19zb2MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX2pwZWcvanBlZ19ody9qcGVnX2VuY19ody9qcGVnX2VuY19zb2MuYwpAQCAtNTUsNyArNTUsNyBAQAogewogCWludCByYzsKIAotCXJjID0gY2FtX3NvY191dGlsX2Rpc2FibGVfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8sIHRydWUsIGZhbHNlKTsKKwlyYyA9IGNhbV9zb2NfdXRpbF9kaXNhYmxlX3BsYXRmb3JtX3Jlc291cmNlKHNvY19pbmZvLCB0cnVlLCB0cnVlKTsKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX0pQRUcsICJkaXNhYmxlIHBsYXRmb3JtIGZhaWxlZCAlZCIsIHJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9tZW1fbWdyLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX21lbV9tZ3IuYwppbmRleCBjMTUwMjQ0Li45ZDQ1NGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX21lbV9tZ3IuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX21lbV9tZ3IuYwpAQCAtNTIsNiArNTIsOCBAQAogCQlyYyA9IERNQV9GUk9NX0RFVklDRTsKIAllbHNlIGlmIChmbGFncyAmIENBTV9NRU1fRkxBR19IV19SRUFEX1dSSVRFKQogCQlyYyA9IERNQV9CSURJUkVDVElPTkFMOworCWVsc2UgaWYgKGZsYWdzICYgQ0FNX01FTV9GTEFHX1BST1RFQ1RFRF9NT0RFKQorCQlyYyA9IERNQV9CSURJUkVDVElPTkFMOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjExLDEwICsyMTMsMTYgQEAKIAkJZ290byBoYW5kbGVfbWlzbWF0Y2g7CiAJfQogCi0JcmMgPSBjYW1fc21tdV9nZXRfaW92YShtbXVfaGFuZGxlLAotCQl0YmwuYnVmcVtpZHhdLmZkLAotCQlpb3ZhX3B0ciwKLQkJbGVuX3B0cik7CisJaWYgKENBTV9NRU1fTUdSX0lTX1NFQ1VSRV9IREwoYnVmX2hhbmRsZSkpCisJCXJjID0gY2FtX3NtbXVfZ2V0X3N0YWdlMl9pb3ZhKG1tdV9oYW5kbGUsCisJCQl0YmwuYnVmcVtpZHhdLmZkLAorCQkJaW92YV9wdHIsCisJCQlsZW5fcHRyKTsKKwllbHNlCisJCXJjID0gY2FtX3NtbXVfZ2V0X2lvdmEobW11X2hhbmRsZSwKKwkJCXRibC5idWZxW2lkeF0uZmQsCisJCQlpb3ZhX3B0ciwKKwkJCWxlbl9wdHIpOwogCWlmIChyYyA8IDApCiAJCUNBTV9FUlIoQ0FNX0NSTSwgImZhaWwgdG8gZ2V0IGJ1ZiBoZGwgOiVkIiwgYnVmX2hhbmRsZSk7CiAKQEAgLTM3NiwxMCArMzg0LDEyIEBACiAJdWludDMyX3QgaW9uX2ZsYWcgPSAwOwogCWludCByYzsKIAotCWlmIChjbWQtPmZsYWdzICYgQ0FNX01FTV9GTEFHX1BST1RFQ1RFRF9NT0RFKQorCWlmIChjbWQtPmZsYWdzICYgQ0FNX01FTV9GTEFHX1BST1RFQ1RFRF9NT0RFKSB7CiAJCWhlYXBfaWQgPSBJT05fSEVBUChJT05fU0VDVVJFX0RJU1BMQVlfSEVBUF9JRCk7Ci0JZWxzZQorCQlpb25fZmxhZyB8PSBJT05fRkxBR19TRUNVUkUgfCBJT05fRkxBR19DUF9DQU1FUkE7CisJfSBlbHNlIHsKIAkJaGVhcF9pZCA9IElPTl9IRUFQKElPTl9TWVNURU1fSEVBUF9JRCk7CisJfQogCiAJaWYgKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfQ0FDSEUpCiAJCWlvbl9mbGFnIHw9IElPTl9GTEFHX0NBQ0hFRDsKQEAgLTQ2NiwxMCArNDc2LDExIEBACiAKIAlpZiAoZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpIHsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9oZGxzOyBpKyspIHsKLQkJCXJjID0gY2FtX3NtbXVfbWFwX3NlY19pb3ZhKG1tdV9oZGxzW2ldLAorCQkJcmMgPSBjYW1fc21tdV9tYXBfc3RhZ2UyX2lvdmEobW11X2hkbHNbaV0sCiAJCQkJZmQsCiAJCQkJZGlyLAotCQkJCShkbWFfYWRkcl90ICopaHdfdmFkZHIsCisJCQkJdGJsLmNsaWVudCwKKwkJCQkoaW9uX3BoeXNfYWRkcl90ICopaHdfdmFkZHIsCiAJCQkJbGVuKTsKIAogCQkJaWYgKHJjIDwgMCkgewpAQCAtNDk4LDcgKzUwOSw3IEBACiBtdWx0aV9tYXBfZmFpbDoKIAlpZiAoZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpCiAJCWZvciAoLS1pOyBpID4gMDsgaS0tKQotCQkJY2FtX3NtbXVfdW5tYXBfc2VjX2lvdmEobW11X2hkbHNbaV0sIGZkKTsKKwkJCWNhbV9zbW11X3VubWFwX3N0YWdlMl9pb3ZhKG1tdV9oZGxzW2ldLCBmZCk7CiAJZWxzZQogCQlmb3IgKC0taTsgaSA+IDA7IGktLSkKIAkJCWNhbV9zbW11X3VubWFwX2lvdmEobW11X2hkbHNbaV0sCkBAIC01NDMsOCArNTU0LDkgQEAKIAkJZ290byBzbG90X2ZhaWw7CiAJfQogCi0JaWYgKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfUkVBRF9XUklURSB8fAotCQljbWQtPmZsYWdzICYgQ0FNX01FTV9GTEFHX0hXX1NIQVJFRF9BQ0NFU1MpIHsKKwlpZiAoKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfUkVBRF9XUklURSkgfHwKKwkJKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfU0hBUkVEX0FDQ0VTUykgfHwKKwkJKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpKSB7CiAKIAkJZW51bSBjYW1fc21tdV9yZWdpb25faWQgcmVnaW9uOwogCkBAIC01NzAsNiArNTgyLDggQEAKIAl0YmwuYnVmcVtpZHhdLmZkID0gaW9uX2ZkOwogCXRibC5idWZxW2lkeF0uZmxhZ3MgPSBjbWQtPmZsYWdzOwogCXRibC5idWZxW2lkeF0uYnVmX2hhbmRsZSA9IEdFVF9NRU1fSEFORExFKGlkeCwgaW9uX2ZkKTsKKwlpZiAoY21kLT5mbGFncyAmIENBTV9NRU1fRkxBR19QUk9URUNURURfTU9ERSkKKwkJQ0FNX01FTV9NR1JfU0VUX1NFQ1VSRV9IREwodGJsLmJ1ZnFbaWR4XS5idWZfaGFuZGxlLCB0cnVlKTsKIAl0YmwuYnVmcVtpZHhdLmttZHZhZGRyID0gMDsKIAogCWlmIChjbWQtPm51bV9oZGwgPiAwKQpAQCAtNjMwLDcgKzY0NCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChjbWQtPmZsYWdzICYgQ0FNX01FTV9GTEFHX0hXX1JFQURfV1JJVEUpIHsKKwlpZiAoKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfUkVBRF9XUklURSkgfHwKKwkJKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpKSB7CiAJCXJjID0gY2FtX21lbV91dGlsX21hcF9od192YShjbWQtPmZsYWdzLAogCQkJY21kLT5tbXVfaGRscywKIAkJCWNtZC0+bnVtX2hkbCwKQEAgLTY1Miw2ICs2NjcsOCBAQAogCXRibC5idWZxW2lkeF0uZmQgPSBjbWQtPmZkOwogCXRibC5idWZxW2lkeF0uZmxhZ3MgPSBjbWQtPmZsYWdzOwogCXRibC5idWZxW2lkeF0uYnVmX2hhbmRsZSA9IEdFVF9NRU1fSEFORExFKGlkeCwgY21kLT5mZCk7CisJaWYgKGNtZC0+ZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpCisJCUNBTV9NRU1fTUdSX1NFVF9TRUNVUkVfSERMKHRibC5idWZxW2lkeF0uYnVmX2hhbmRsZSwgdHJ1ZSk7CiAJdGJsLmJ1ZnFbaWR4XS5rbWR2YWRkciA9IDA7CiAKIAlpZiAoY21kLT5udW1faGRsID4gMCkKQEAgLTY5OSw3ICs3MTYsNyBAQAogCiAJaWYgKGZsYWdzICYgQ0FNX01FTV9GTEFHX1BST1RFQ1RFRF9NT0RFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1faGRsczsgaSsrKSB7Ci0JCQlyYyA9IGNhbV9zbW11X3VubWFwX3NlY19pb3ZhKG1tdV9oZGxzW2ldLCBmZCk7CisJCQlyYyA9IGNhbV9zbW11X3VubWFwX3N0YWdlMl9pb3ZhKG1tdV9oZGxzW2ldLCBmZCk7CiAJCQlpZiAocmMgPCAwKQogCQkJCWdvdG8gdW5tYXBfZW5kOwogCQl9CkBAIC03NDEsOCArNzU4LDkgQEAKIAkJCXJlZ2lvbiA9IENBTV9TTU1VX1JFR0lPTl9JTzsKIAl9CiAKLQlpZiAodGJsLmJ1ZnFbaWR4XS5mbGFncyAmIENBTV9NRU1fRkxBR19IV19SRUFEX1dSSVRFIHx8Ci0JCXRibC5idWZxW2lkeF0uZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfU0hBUkVEX0FDQ0VTUykKKwlpZiAoKHRibC5idWZxW2lkeF0uZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfUkVBRF9XUklURSkgfHwKKwkJKHRibC5idWZxW2lkeF0uZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfSFdfU0hBUkVEX0FDQ0VTUykgfHwKKwkJKHRibC5idWZxW2lkeF0uZmxhZ3MgJiBDQU1fTUVNX0ZMQUdfUFJPVEVDVEVEX01PREUpKQogCQlyYyA9IGNhbV9tZW1fdXRpbF91bm1hcF9od192YShpZHgsIHJlZ2lvbik7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9tZW1fbWdyX2FwaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9tZW1fbWdyX2FwaS5oCmluZGV4IDA4NThiOGEuLmFmNzk2MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fbWVtX21ncl9hcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX21lbV9tZ3JfYXBpLmgKQEAgLTk1LDQgKzk1LDkgQEAKIGludCBjYW1fbWVtX2dldF9jcHVfYnVmKGludDMyX3QgYnVmX2hhbmRsZSwgdWludDY0X3QgKnZhZGRyX3B0ciwKIAlzaXplX3QgKmxlbik7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBjYW1fbWVtX2lzX3NlY3VyZV9idWYoaW50MzJfdCBidWZfaGFuZGxlKQoreworCXJldHVybiBDQU1fTUVNX01HUl9JU19TRUNVUkVfSERMKGJ1Zl9oYW5kbGUpOworfQorCiAjZW5kaWYgLyogX0NBTV9NRU1fTUdSX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9jb3JlLmMKaW5kZXggZWZkZGE0Zi4uODU2NWFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfY29yZS5jCkBAIC0xODAsNiArMTgwLDE1IEBACiAJCXRibC0+cGQsIGN1cnJfaWR4LCB0YmwtPnNsb3RbY3Vycl9pZHhdLnN0YXRlLAogCQl0YmwtPnNraXBfdHJhdmVyc2UsIHRyYXZlcnNlX2RhdGEtPmluX3EtPnNsb3RbY3Vycl9pZHhdLnN0YXR1cyk7CiAKKwlpZiAodGJsLT5pbmplY3RfZGVsYXkgPiAwKSB7CisJCUNBTV9EQkcoQ0FNX0NSTSwgIkluamVjdGluZyBEZWxheSBvZiBvbmUgZnJhbWUiKTsKKwkJYXBwbHlfZGF0YVt0YmwtPnBkXS5yZXFfaWQgPSAtMTsKKwkJdGJsLT5pbmplY3RfZGVsYXktLTsKKwkJLyogVGhpcyBwZCB0YWJsZSBpcyBub3QgcmVhZHkgdG8gcHJvY2VlZCB3aXRoIGFza2VkIGlkeCAqLworCQlTRVRfRkFJTFVSRV9CSVQodHJhdmVyc2VfZGF0YS0+cmVzdWx0LCB0YmwtPnBkKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCiAJLyogQ2hlY2sgaWYgcmVxIGlzIHJlYWR5IG9yIGluIHNraXAgbW9kZSBvciBwZCB0YmwgaXMgaW4gc2tpcCBtb2RlICovCiAJaWYgKHRibC0+c2xvdFtjdXJyX2lkeF0uc3RhdGUgPT0gQ1JNX1JFUV9TVEFURV9SRUFEWSB8fAogCQl0cmF2ZXJzZV9kYXRhLT5pbl9xLT5zbG90W2N1cnJfaWR4XS5za2lwX2lkeCA9PSAxIHx8CkBAIC0zNjUsNyArMzc0LDcgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgX19jYW1fcmVxX21ncl9zZW5kX3JlcShzdHJ1Y3QgY2FtX3JlcV9tZ3JfY29yZV9saW5rICpsaW5rLAotCXN0cnVjdCBjYW1fcmVxX21ncl9yZXFfcXVldWUgKmluX3EpCisJc3RydWN0IGNhbV9yZXFfbWdyX3JlcV9xdWV1ZSAqaW5fcSwgdWludDMyX3QgdHJpZ2dlcikKIHsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwLCBwZCwgaSwgaWR4OwogCXN0cnVjdCBjYW1fcmVxX21ncl9jb25uZWN0ZWRfZGV2aWNlICpkZXYgPSBOVUxMOwpAQCAtMzkxLDYgKzQwMCw5IEBACiAJCQkJCWxpbmstPnJlcS5hcHBseV9kYXRhW3BkXS5yZXFfaWQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKCEoZGV2LT5kZXZfaW5mby50cmlnZ2VyICYgdHJpZ2dlcikpCisJCQkJY29udGludWU7CisKIAkJCWFwcGx5X3JlcS5kZXZfaGRsID0gZGV2LT5kZXZfaGRsOwogCQkJYXBwbHlfcmVxLnJlcXVlc3RfaWQgPQogCQkJCWxpbmstPnJlcS5hcHBseV9kYXRhW3BkXS5yZXFfaWQ7CkBAIC00MDAsNiArNDEyLDcgQEAKIAogCQkJdHJhY2VfY2FtX3JlcV9tZ3JfYXBwbHlfcmVxdWVzdChsaW5rLCAmYXBwbHlfcmVxLCBkZXYpOwogCisJCQlhcHBseV9yZXEudHJpZ2dlcl9wb2ludCA9IHRyaWdnZXI7CiAJCQlDQU1fREJHKENBTV9DUk0sICJTRU5EOiBwZCAlZCByZXFfaWQgJWxsZCIsCiAJCQkJcGQsIGFwcGx5X3JlcS5yZXF1ZXN0X2lkKTsKIAkJCWlmIChkZXYtPm9wcyAmJiBkZXYtPm9wcy0+YXBwbHlfcmVxKSB7CkBAIC00MTAsNyArNDIzLDcgQEAKIAkJfQogCX0KIAlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX0NSTSwgIkFQUExZIEZBSUxFRCBwZCAlZCByZXFfaWQgJWxsZCIsCisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fQ1JNLCAiQVBQTFkgRkFJTEVEIHBkICVkIHJlcV9pZCAlbGxkIiwKIAkJCWRldi0+ZGV2X2luZm8ucF9kZWxheSwgYXBwbHlfcmVxLnJlcXVlc3RfaWQpOwogCQkvKiBBcHBseSByZXEgZmFpbGVkIG5vdGlmeSBhbHJlYWR5IGFwcGxpZWQgZGV2cyAqLwogCQlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKQEAgLTQ4OCw3ICs1MDEsOCBAQAogICogQHJldHVybiAgIDogMCBmb3Igc3VjY2VzcywgbmVnYXRpdmUgZm9yIGZhaWx1cmUKICAqCiAgKi8KLXN0YXRpYyBpbnQgX19jYW1fcmVxX21ncl9wcm9jZXNzX3JlcShzdHJ1Y3QgY2FtX3JlcV9tZ3JfY29yZV9saW5rICpsaW5rKQorc3RhdGljIGludCBfX2NhbV9yZXFfbWdyX3Byb2Nlc3NfcmVxKHN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX2xpbmsgKmxpbmssCisJdWludDMyX3QgdHJpZ2dlcikKIHsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwLCBpZHg7CiAJc3RydWN0IGNhbV9yZXFfbWdyX3Nsb3QgICAgICAgICAgICAgKnNsb3QgPSBOVUxMOwpAQCAtNDk5LDcgKzUxMyw3IEBACiAJc2Vzc2lvbiA9IChzdHJ1Y3QgY2FtX3JlcV9tZ3JfY29yZV9zZXNzaW9uICopbGluay0+cGFyZW50OwogCiAJLyoKLQkgKiAxLiBDaGVjayBpZiBuZXcgcmVhZCBpbmRleCwKKwkgKiBDaGVjayBpZiBuZXcgcmVhZCBpbmRleCwKIAkgKiAtIGlmIGluIHBlbmRpbmcgIHN0YXRlLCB0cmF2ZXJzZSBhZ2FpbiB0byBjb21wbGV0ZQogCSAqICAgIHRyYW5zYWN0aW9uIG9mIHRoaXMgcmVhZCBpbmRleC4KIAkgKiAtIGlmIGluIGFwcGxpZWRfc3RhdGUsIHNvbXRoaWduIHdyb25nLgpAQCAtNTE0LDU4ICs1MjgsNzAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmMgPSBfX2NhbV9yZXFfbWdyX2NoZWNrX2xpbmtfaXNfcmVhZHkobGluaywgc2xvdC0+aWR4KTsKLQlpZiAocmMgPj0gMCkgewotCQlyYyA9IF9fY2FtX3JlcV9tZ3Jfc2VuZF9yZXEobGluaywgbGluay0+cmVxLmluX3EpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQkvKiBBcHBseSByZXEgZmFpbGVkIHJldHJ5IGF0IG5leHQgc29mICovCi0JCQlzbG90LT5zdGF0dXMgPSBDUk1fU0xPVF9TVEFUVVNfUkVRX1BFTkRJTkc7Ci0JCX0gZWxzZSB7Ci0JCQlzbG90LT5zdGF0dXMgPSBDUk1fU0xPVF9TVEFUVVNfUkVRX0FQUExJRUQ7CisJaWYgKHRyaWdnZXIgIT0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GICYmCisJCQl0cmlnZ2VyICE9IENBTV9UUklHR0VSX1BPSU5UX0VPRikKKwkJcmV0dXJuIHJjOwogCisJaWYgKHRyaWdnZXIgPT0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GKSB7CisJCWlmIChsaW5rLT50cmlnZ2VyX21hc2spIHsKKwkJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fQ1JNLAorCQkJCSJBcHBseWluZyBmb3IgbGFzdCBFT0YgZmFpbHMiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJjID0gX19jYW1fcmVxX21ncl9jaGVja19saW5rX2lzX3JlYWR5KGxpbmssIHNsb3QtPmlkeCk7CisJCWlmIChyYyA8IDApIHsKKworCQkJIC8qIElmIHRyYXZlcnNlIHJlc3VsdCBpcyBub3Qgc3VjY2VzcywgdGhlbiBzb21lIGRldmljZXMKKwkJCSAgKiBhcmUgbm90IHJlYWR5IHdpdGggcGFja2V0IGZvciB0aGUgYXNrZWQgcmVxdWVzdCBpZCwKKwkJCSAgKiBoZW5jZSB0cnkgYWdhaW4gaW4gbmV4dCBzb2YKKwkJCSAgKi8KKwkJCXNsb3QtPnN0YXR1cyA9IENSTV9TTE9UX1NUQVRVU19SRVFfUEVORElORzsKIAkJCWlmIChsaW5rLT5zdGF0ZSA9PSBDQU1fQ1JNX0xJTktfU1RBVEVfRVJSKSB7Ci0JCQkJQ0FNX1dBUk4oQ0FNX0NSTSwKLQkJCQkJIkVyciByZWNvdmVyeSBkb25lIGlkeCAlZCBzdGF0dXMgJWQiLAorCQkJCS8qCisJCQkJICogRHVyaW5nIGVycm9yIHJlY292ZXJ5IGFsbCB0YWJsZXMgc2hvdWxkIGJlCisJCQkJICogcmVhZHksIGRvbid0IGV4cGVjdCB0byBlbnRlciBoZXJlLgorCQkJCSAqIEBUT0RPOiBncmFjZWZ1bGx5IGhhbmRsZSBpZiByZWNvdmVyeSBmYWlscy4KKwkJCQkgKi8KKwkJCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0NSTSwKKwkJCQkJIkZBVEFMIHJlY292ZXJ5IGNhbnQgZmluaXNoIGlkeCAlZCBzdGF0dXMgJWQiLAogCQkJCQlpbl9xLT5yZF9pZHgsCiAJCQkJCWluX3EtPnNsb3RbaW5fcS0+cmRfaWR4XS5zdGF0dXMpOwotCQkJCW11dGV4X2xvY2soJmxpbmstPmxvY2spOwotCQkJCWxpbmstPnN0YXRlID0gQ0FNX0NSTV9MSU5LX1NUQVRFX1JFQURZOwotCQkJCW11dGV4X3VubG9jaygmbGluay0+bG9jayk7CisJCQkJcmMgPSAtRVBFUk07CiAJCQl9CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJaWYgKHRyaWdnZXIgPT0gQ0FNX1RSSUdHRVJfUE9JTlRfRU9GICYmCisJCQkoIShsaW5rLT50cmlnZ2VyX21hc2sgJiBDQU1fVFJJR0dFUl9QT0lOVF9TT0YpKSkgeworCQlDQU1fREJHKENBTV9DUk0sICJBcHBseWluZyBmb3IgbGFzdCBTT0YgZmFpbHMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JCQkvKgotCQkJICogMi4gQ2hlY2sgaWYgYW55IG5ldyByZXEgaXMgcGVuZGluZyBpbiBpbnB1dCBxdWV1ZSwKLQkJCSAqICAgIGlmIG5vdCBmaW5pc2ggdGhlIGxvd2VyIHBpcGVsaW5lIGRlbGF5IGRldmljZSB3aXRoCi0JCQkgKiAgICBhdmFpbGFibGUgcmVxIGlkcy4KLQkJCSAqLwotCQkJX19jYW1fcmVxX21ncl9jaGVja19uZXh0X3JlcV9zbG90KGluX3EpOworCXJjID0gX19jYW1fcmVxX21ncl9zZW5kX3JlcShsaW5rLCBsaW5rLT5yZXEuaW5fcSwgdHJpZ2dlcik7CisJaWYgKHJjIDwgMCkgeworCQkvKiBBcHBseSByZXEgZmFpbGVkIHJldHJ5IGF0IG5leHQgc29mICovCisJCXNsb3QtPnN0YXR1cyA9IENSTV9TTE9UX1NUQVRVU19SRVFfUEVORElORzsKKwl9IGVsc2UgeworCQlsaW5rLT50cmlnZ2VyX21hc2sgfD0gdHJpZ2dlcjsKIAotCQkJLyoKLQkJCSAqIDMuIE9sZGVyIHJlcSBzbG90cyBjYW4gYmUgc2FmZWx5IHJlc2V0IGFzIG5vIGVyciBhY2suCi0JCQkgKi8KKwkJaWYgKGxpbmstPnN0YXRlID09IENBTV9DUk1fTElOS19TVEFURV9FUlIpIHsKKwkJCUNBTV9XQVJOKENBTV9DUk0sICJFcnIgcmVjb3ZlcnkgZG9uZSBpZHggJWQiLAorCQkJCWluX3EtPnJkX2lkeCk7CisJCQltdXRleF9sb2NrKCZsaW5rLT5sb2NrKTsKKwkJCWxpbmstPnN0YXRlID0gQ0FNX0NSTV9MSU5LX1NUQVRFX1JFQURZOworCQkJbXV0ZXhfdW5sb2NrKCZsaW5rLT5sb2NrKTsKKwkJfQorCQlpZiAobGluay0+dHJpZ2dlcl9tYXNrID09IGxpbmstPnN1YnNjcmliZV9ldmVudCkgeworCQkJc2xvdC0+c3RhdHVzID0gQ1JNX1NMT1RfU1RBVFVTX1JFUV9BUFBMSUVEOworCQkJbGluay0+dHJpZ2dlcl9tYXNrID0gMDsKKwkJCUNBTV9EQkcoQ0FNX0NSTSwgInJlcSBpcyBhcHBsaWVkXG4iKTsKKwogCQkJaWR4ID0gaW5fcS0+cmRfaWR4OwotCQkJX19jYW1fcmVxX21ncl9kZWNfaWR4KCZpZHgsIGxpbmstPm1heF9kZWxheSArIDEsCisJCQlfX2NhbV9yZXFfbWdyX2RlY19pZHgoCisJCQkJJmlkeCwgbGluay0+bWF4X2RlbGF5ICsgMSwKIAkJCQlpbl9xLT5udW1fc2xvdHMpOwogCQkJX19jYW1fcmVxX21ncl9yZXNldF9yZXFfc2xvdChsaW5rLCBpZHgpOwogCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogNC5JZiB0cmF2ZXJzZSByZXN1bHQgaXMgbm90IHN1Y2Nlc3MsIHRoZW4gc29tZSBkZXZpY2VzIGFyZQotCQkgKiAgIG5vdCByZWFkeSB3aXRoIHBhY2tldCBmb3IgdGhlIGFza2VkIHJlcXVlc3QgaWQsCi0JCSAqICAgaGVuY2UgdHJ5IGFnYWluIGluIG5leHQgc29mCi0JCSAqLwotCQlzbG90LT5zdGF0dXMgPSBDUk1fU0xPVF9TVEFUVVNfUkVRX1BFTkRJTkc7Ci0JCWlmIChsaW5rLT5zdGF0ZSA9PSBDQU1fQ1JNX0xJTktfU1RBVEVfRVJSKSB7Ci0JCQkvKgotCQkJICogRHVyaW5nIGVycm9yIHJlY292ZXJ5IGFsbCB0YWJsZXMgc2hvdWxkIGJlIHJlYWR5Ci0JCQkgKiAgIGRvbid0IGV4cGVjdCB0byBlbnRlciBoZXJlLgotCQkJICogQFRPRE86IGdyYWNlZnVsbHkgaGFuZGxlIGlmIHJlY292ZXJ5IGZhaWxzLgotCQkJICovCi0JCQlDQU1fRVJSKENBTV9DUk0sCi0JCQkJIkZBVEFMIHJlY292ZXJ5IGNhbnQgZmluaXNoIGlkeCAlZCBzdGF0dXMgJWQiLAotCQkJCWluX3EtPnJkX2lkeCwgaW5fcS0+c2xvdFtpbl9xLT5yZF9pZHhdLnN0YXR1cyk7Ci0JCQlyYyA9IC1FUEVSTTsKLQkJfQogCX0KIAogCXJldHVybiByYzsKQEAgLTU3Niw3ICs2MDIsNyBAQAogICoKICAqIEBicmllZiAgICA6IEFkZCB0YWJsZSB0byBsaXN0IHVuZGVyIGxpbmsgc29ydGVkIGJ5IHBkIGRlY3JlbWV0aW5nIG9yZGVyCiAgKiBAbF90YmwgICAgOiBsaXN0IG9mIHBpcGVsaW5lIGRlbGF5IHRhYmxlcy4KLSAqIEBuZXdfdGJsIDogbmV3IHRibCB3aGljaCB3aWxsIGJlIGFwcGVuZGVkIHRvIGFib3ZlIGxpc3QgYXMgcGVyIGl0cyBwZCB2YWx1ZQorICogQG5ld190YmwgIDogbmV3IHRibCB3aGljaCB3aWxsIGJlIGFwcGVuZGVkIHRvIGFib3ZlIGxpc3QgYXMgcGVyIGl0cyBwZCB2YWx1ZQogICoKICAqLwogc3RhdGljIHZvaWQgX19jYW1fcmVxX21ncl9hZGRfdGJsX3RvX2xpbmsoc3RydWN0IGNhbV9yZXFfbWdyX3JlcV90YmwgKipsX3RibCwKQEAgLTgyOCw2ICs4NTQsNyBAQAogCWxpbmtfZGF0YS5saW5rX2VuYWJsZSA9IDA7CiAJbGlua19kYXRhLmxpbmtfaGRsID0gbGluay0+bGlua19oZGw7CiAJbGlua19kYXRhLmNybV9jYiA9IE5VTEw7CisJbGlua19kYXRhLnN1YnNjcmliZV9ldmVudCA9IDA7CiAKIAkvKiBVc2luZyBkZXZpY2Ugb3BzIHVubGluayBkZXZpY2VzICovCiAJZm9yIChpID0gMDsgaSA8IGxpbmstPm51bV9kZXZzOyBpKyspIHsKQEAgLTg4NSw3ICs5MTIsMTMgQEAKIAkJQ0FNX0VSUihDQU1fQ1JNLCAiZmFpbGVkIHRvIGNyZWF0ZSBsaW5rLCBubyBtZW0iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWluX3EgPSAmc2Vzc2lvbi0+aW5fcTsKKwlpbl9xID0gKHN0cnVjdCBjYW1fcmVxX21ncl9yZXFfcXVldWUgKikKKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9yZXFfbWdyX3JlcV9xdWV1ZSksIEdGUF9LRVJORUwpOworCWlmICghaW5fcSkgeworCQlDQU1fRVJSKENBTV9DUk0sICJmYWlsZWQgdG8gY3JlYXRlIGlucHV0IHF1ZXVlLCBubyBtZW0iKTsKKwkJa2ZyZWUobGluayk7CisJCXJldHVybiBOVUxMOworCX0KIAltdXRleF9pbml0KCZsaW5rLT5sb2NrKTsKIAogCW11dGV4X2xvY2soJmxpbmstPmxvY2spOwpAQCAtOTExLDcgKzk0NCw3IEBACiB9CiAKIC8qKgotICogX19jYW1fcmVxX21ncl9yZXNlcnZlX2xpbmsoKQorICogX19jYW1fcmVxX21ncl91bnJlc2VydmVfbGluaygpCiAgKgogICogQGJyaWVmICA6IFJlc2VydmVzIG9uZSBsaW5rIGRhdGEgc3RydWN0IHdpdGhpbiBzZXNzaW9uCiAgKiBAc2Vzc2lvbjogc2Vzc2lvbiBpZGVudGlmaWVyCkBAIC05NDMsNiArOTc2LDggQEAKIAkJQ0FNX0RCRyhDQU1fQ1JNLCAiQWN0aXZlIHNlc3Npb24gbGlua3MgKCVkKSIsCiAJCQlzZXNzaW9uLT5udW1fbGlua3MpOwogCX0KKwlrZnJlZSgoKmxpbmspLT5yZXEuaW5fcSk7CisJKCpsaW5rKS0+cmVxLmluX3EgPSBOVUxMOwogCWtmcmVlKCpsaW5rKTsKIAkqbGluayA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKQEAgLTk3Nyw3ICsxMDEyLDcgQEAKIAlzZW5kX3JlcSA9IChzdHJ1Y3QgY2FtX3JlcV9tZ3Jfc2VuZF9yZXF1ZXN0ICopZGF0YTsKIAlpbl9xID0gc2VuZF9yZXEtPmluX3E7CiAKLQlyYyA9IF9fY2FtX3JlcV9tZ3Jfc2VuZF9yZXEobGluaywgaW5fcSk7CisJcmMgPSBfX2NhbV9yZXFfbWdyX3NlbmRfcmVxKGxpbmssIGluX3EsIENBTV9UUklHR0VSX1BPSU5UX1NPRik7CiBlbmQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtMTE2MSw3ICsxMTk2LDcgQEAKIAkJfQogCX0KIAlpZiAoIXRibCkgewotCQlDQU1fRVJSKENBTV9DUk0sICJkZXZfaGRsIG5vdCBmb3VuZCAleCwgJXggJXgiLAorCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0NSTSwgImRldl9oZGwgbm90IGZvdW5kICV4LCAleCAleCIsCiAJCQlhZGRfcmVxLT5kZXZfaGRsLAogCQkJbGluay0+bF9kZXZbMF0uZGV2X2hkbCwKIAkJCWxpbmstPmxfZGV2WzFdLmRldl9oZGwpOwpAQCAtMTE4NCw2ICsxMjE5LDEwIEBACiAJCW11dGV4X3VubG9jaygmbGluay0+cmVxLmxvY2spOwogCQlnb3RvIGVuZDsKIAl9CisKKwlpZiAoYWRkX3JlcS0+c2tpcF9iZWZvcmVfYXBwbHlpbmcgPiB0YmwtPmluamVjdF9kZWxheSkKKwkJdGJsLT5pbmplY3RfZGVsYXkgPSBhZGRfcmVxLT5za2lwX2JlZm9yZV9hcHBseWluZzsKKwogCXNsb3QgPSAmdGJsLT5zbG90W2lkeF07CiAJaWYgKHNsb3QtPnN0YXRlICE9IENSTV9SRVFfU1RBVEVfUEVORElORyAmJgogCQlzbG90LT5zdGF0ZSAhPSBDUk1fUkVRX1NUQVRFX0VNUFRZKSB7CkBAIC0xMjUwLDggKzEyODksOSBAQAogCWlmIChlcnJfaW5mby0+ZXJyb3IgPT0gQ1JNX0tNRF9FUlJfQlVCQkxFKSB7CiAJCWlkeCA9IF9fY2FtX3JlcV9tZ3JfZmluZF9zbG90X2Zvcl9yZXEoaW5fcSwgZXJyX2luZm8tPnJlcV9pZCk7CiAJCWlmIChpZHggPCAwKSB7Ci0JCQlDQU1fRVJSKENBTV9DUk0sICJyZXFfaWQgJWxsZCBub3QgZm91bmQgaW4gaW5wdXQgcXVldWUiLAotCQkJZXJyX2luZm8tPnJlcV9pZCk7CisJCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0NSTSwKKwkJCQkicmVxX2lkICVsbGQgbm90IGZvdW5kIGluIGlucHV0IHF1ZXVlIiwKKwkJCQllcnJfaW5mby0+cmVxX2lkKTsKIAkJfSBlbHNlIHsKIAkJCUNBTV9EQkcoQ0FNX0NSTSwgInJlcV9pZCAlbGxkIGZvdW5kIGF0IGlkeCAlZCIsCiAJCQkJZXJyX2luZm8tPnJlcV9pZCwgaWR4KTsKQEAgLTEzMDIsNyArMTM0Miw3IEBACiB9CiAKIC8qKgotICogY2FtX3JlcV9tZ3JfcHJvY2Vzc19zb2YoKQorICogY2FtX3JlcV9tZ3JfcHJvY2Vzc190cmlnZ2VyKCkKICAqCiAgKiBAYnJpZWY6IFRoaXMgcnVucyBpbiB3b3JrcXVlIHRocmVhZCBjb250ZXh0LiBDYWxsIGNvcmUgZnVuY3MgdG8gY2hlY2sKICAqICAgICAgICAgd2hpY2ggcGVkaW5nIHJlcXVlc3RzIGNhbiBiZSBwcm9jZXNzZWQuCkBAIC0xMzExLDEwICsxMzUxLDEwIEBACiAgKgogICogQHJldHVybjogMCBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgaW50IGNhbV9yZXFfbWdyX3Byb2Nlc3Nfc29mKHZvaWQgKnByaXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGNhbV9yZXFfbWdyX3Byb2Nlc3NfdHJpZ2dlcih2b2lkICpwcml2LCB2b2lkICpkYXRhKQogewogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7Ci0Jc3RydWN0IGNhbV9yZXFfbWdyX3NvZl9ub3RpZnkgICAgICAgKnNvZl9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgICAqdHJpZ2dlcl9kYXRhID0gTlVMTDsKIAlzdHJ1Y3QgY2FtX3JlcV9tZ3JfY29yZV9saW5rICAgICAgICAqbGluayA9IE5VTEw7CiAJc3RydWN0IGNhbV9yZXFfbWdyX3JlcV9xdWV1ZSAgICAgICAgKmluX3EgPSBOVUxMOwogCXN0cnVjdCBjcm1fdGFza19wYXlsb2FkICAgICAgICAgICAgICp0YXNrX2RhdGEgPSBOVUxMOwpAQCAtMTMyNiwxMSArMTM2NiwxMiBAQAogCX0KIAlsaW5rID0gKHN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX2xpbmsgKilwcml2OwogCXRhc2tfZGF0YSA9IChzdHJ1Y3QgY3JtX3Rhc2tfcGF5bG9hZCAqKWRhdGE7Ci0Jc29mX2RhdGEgPSAoc3RydWN0IGNhbV9yZXFfbWdyX3NvZl9ub3RpZnkgKikmdGFza19kYXRhLT51OworCXRyaWdnZXJfZGF0YSA9IChzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgKikmdGFza19kYXRhLT51OwogCi0JQ0FNX0RCRyhDQU1fQ1JNLCAibGlua19oZGwgJXggZnJhbWVfaWQgJWxsZCIsCi0JCXNvZl9kYXRhLT5saW5rX2hkbCwKLQkJc29mX2RhdGEtPmZyYW1lX2lkKTsKKwlDQU1fREJHKENBTV9DUk0sICJsaW5rX2hkbCAleCBmcmFtZV9pZCAlbGxkLCB0cmlnZ2VyICV4XG4iLAorCQl0cmlnZ2VyX2RhdGEtPmxpbmtfaGRsLAorCQl0cmlnZ2VyX2RhdGEtPmZyYW1lX2lkLAorCQl0cmlnZ2VyX2RhdGEtPnRyaWdnZXIpOwogCiAJaW5fcSA9IGxpbmstPnJlcS5pbl9xOwogCkBAIC0xMzUxLDEwICsxMzkyLDE0IEBACiAJCS8qCiAJCSAqIERvIE5PVCByZXNldCByZXEgcSBzbG90IGRhdGEgaGVyZSwgaXQgY2FuIG5vdCBiZSBkb25lCiAJCSAqIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBkYXRhIHRvIGhhbmRsZSBidWJibGUuCisJCSAqCisJCSAqIENoZWNrIGlmIGFueSBuZXcgcmVxIGlzIHBlbmRpbmcgaW4gc2xvdCwgaWYgbm90IGZpbmlzaCB0aGUKKwkJICogbG93ZXIgcGlwZWxpbmUgZGVsYXkgZGV2aWNlIHdpdGggYXZhaWxhYmxlIHJlcSBpZHMuCiAJCSAqLworCQlfX2NhbV9yZXFfbWdyX2NoZWNrX25leHRfcmVxX3Nsb3QoaW5fcSk7CiAJCV9fY2FtX3JlcV9tZ3JfaW5jX2lkeCgmaW5fcS0+cmRfaWR4LCAxLCBpbl9xLT5udW1fc2xvdHMpOwogCX0KLQlyYyA9IF9fY2FtX3JlcV9tZ3JfcHJvY2Vzc19yZXEobGluayk7CisJcmMgPSBfX2NhbV9yZXFfbWdyX3Byb2Nlc3NfcmVxKGxpbmssIHRyaWdnZXJfZGF0YS0+dHJpZ2dlcik7CiAJbXV0ZXhfdW5sb2NrKCZsaW5rLT5yZXEubG9jayk7CiAKIGVuZDoKQEAgLTE0MDgsNyArMTQ1Myw3IEBACiAKIAl0YXNrID0gY2FtX3JlcV9tZ3Jfd29ya3FfZ2V0X3Rhc2sobGluay0+d29ya3EpOwogCWlmICghdGFzaykgewotCQlDQU1fRVJSKENBTV9DUk0sICJubyBlbXB0eSB0YXNrIGRldiAleCByZXEgJWxsZCIsCisJCUNBTV9FUlJfUkFURV9MSU1JVChDQU1fQ1JNLCAibm8gZW1wdHkgdGFzayBkZXYgJXggcmVxICVsbGQiLAogCQkJYWRkX3JlcS0+ZGV2X2hkbCwgYWRkX3JlcS0+cmVxX2lkKTsKIAkJcmMgPSAtRUJVU1k7CiAJCWdvdG8gZW5kOwpAQCAtMTQyMCw2ICsxNDY1LDcgQEAKIAlkZXZfcmVxLT5yZXFfaWQgPSBhZGRfcmVxLT5yZXFfaWQ7CiAJZGV2X3JlcS0+bGlua19oZGwgPSBhZGRfcmVxLT5saW5rX2hkbDsKIAlkZXZfcmVxLT5kZXZfaGRsID0gYWRkX3JlcS0+ZGV2X2hkbDsKKwlkZXZfcmVxLT5za2lwX2JlZm9yZV9hcHBseWluZyA9IGFkZF9yZXEtPnNraXBfYmVmb3JlX2FwcGx5aW5nOwogCXRhc2stPnByb2Nlc3NfY2IgPSAmY2FtX3JlcV9tZ3JfcHJvY2Vzc19hZGRfcmVxOwogCXJjID0gY2FtX3JlcV9tZ3Jfd29ya3FfZW5xdWV1ZV90YXNrKHRhc2ssIGxpbmssIENSTV9UQVNLX1BSSU9SSVRZXzApOwogCUNBTV9EQkcoQ0FNX0NSTSwgIlg6IGRldiAleCBkZXYgcmVxICVsbGQiLApAQCAtMTQ4NCw3ICsxNTMwLDcgQEAKIH0KIAogLyoqCi0gKiBjYW1fcmVxX21ncl9jYl9ub3RpZnlfc29mKCkKKyAqIGNhbV9yZXFfbWdyX2NiX25vdGlmeV90cmlnZ2VyKCkKICAqCiAgKiBAYnJpZWYgICA6IFNPRiByZWNlaXZlZCBmcm9tIGRldmljZSwgc2VuZHMgdHJpZ2dlciB0aHJvdWdoIHdvcmtxdWV1ZQogICogQHNvZl9kYXRhOiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBmcmFtZV9pZCwgbGluayBldGMuCkBAIC0xNDkyLDI1ICsxNTM4LDI1IEBACiAgKiBAcmV0dXJuICA6IDAgb24gc3VjY2VzcwogICoKICAqLwotc3RhdGljIGludCBjYW1fcmVxX21ncl9jYl9ub3RpZnlfc29mKAotCXN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5ICpzb2ZfZGF0YSkKK3N0YXRpYyBpbnQgY2FtX3JlcV9tZ3JfY2Jfbm90aWZ5X3RyaWdnZXIoCisJc3RydWN0IGNhbV9yZXFfbWdyX3RyaWdnZXJfbm90aWZ5ICp0cmlnZ2VyX2RhdGEpCiB7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOwogCXN0cnVjdCBjcm1fd29ya3FfdGFzayAgICAgICAgICAgKnRhc2sgPSBOVUxMOwogCXN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX2xpbmsgICAgKmxpbmsgPSBOVUxMOwotCXN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5ICAgKm5vdGlmeV9zb2Y7CisJc3RydWN0IGNhbV9yZXFfbWdyX3RyaWdnZXJfbm90aWZ5ICAgKm5vdGlmeV90cmlnZ2VyOwogCXN0cnVjdCBjcm1fdGFza19wYXlsb2FkICAgICAgICAgKnRhc2tfZGF0YTsKIAotCWlmICghc29mX2RhdGEpIHsKKwlpZiAoIXRyaWdnZXJfZGF0YSkgewogCQlDQU1fRVJSKENBTV9DUk0sICJzb2ZfZGF0YSBpcyBOVUxMIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlbmQ7CiAJfQogCiAJbGluayA9IChzdHJ1Y3QgY2FtX3JlcV9tZ3JfY29yZV9saW5rICopCi0JCWNhbV9nZXRfZGV2aWNlX3ByaXYoc29mX2RhdGEtPmxpbmtfaGRsKTsKKwkJY2FtX2dldF9kZXZpY2VfcHJpdih0cmlnZ2VyX2RhdGEtPmxpbmtfaGRsKTsKIAlpZiAoIWxpbmspIHsKLQkJQ0FNX0RCRyhDQU1fQ1JNLCAibGluayBwdHIgTlVMTCAleCIsIHNvZl9kYXRhLT5saW5rX2hkbCk7CisJCUNBTV9EQkcoQ0FNX0NSTSwgImxpbmsgcHRyIE5VTEwgJXgiLCB0cmlnZ2VyX2RhdGEtPmxpbmtfaGRsKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0xNTE5LDE3ICsxNTY1LDE4IEBACiAJdGFzayA9IGNhbV9yZXFfbWdyX3dvcmtxX2dldF90YXNrKGxpbmstPndvcmtxKTsKIAlpZiAoIXRhc2spIHsKIAkJQ0FNX0VSUihDQU1fQ1JNLCAibm8gZW1wdHkgdGFzayBmcmFtZSAlbGxkIiwKLQkJCXNvZl9kYXRhLT5mcmFtZV9pZCk7CisJCQl0cmlnZ2VyX2RhdGEtPmZyYW1lX2lkKTsKIAkJcmMgPSAtRUJVU1k7CiAJCWdvdG8gZW5kOwogCX0KIAl0YXNrX2RhdGEgPSAoc3RydWN0IGNybV90YXNrX3BheWxvYWQgKil0YXNrLT5wYXlsb2FkOwogCXRhc2tfZGF0YS0+dHlwZSA9IENSTV9XT1JLUV9UQVNLX05PVElGWV9TT0Y7Ci0Jbm90aWZ5X3NvZiA9IChzdHJ1Y3QgY2FtX3JlcV9tZ3Jfc29mX25vdGlmeSAqKSZ0YXNrX2RhdGEtPnU7Ci0Jbm90aWZ5X3NvZi0+ZnJhbWVfaWQgPSBzb2ZfZGF0YS0+ZnJhbWVfaWQ7Ci0Jbm90aWZ5X3NvZi0+bGlua19oZGwgPSBzb2ZfZGF0YS0+bGlua19oZGw7Ci0Jbm90aWZ5X3NvZi0+ZGV2X2hkbCA9IHNvZl9kYXRhLT5kZXZfaGRsOwotCXRhc2stPnByb2Nlc3NfY2IgPSAmY2FtX3JlcV9tZ3JfcHJvY2Vzc19zb2Y7CisJbm90aWZ5X3RyaWdnZXIgPSAoc3RydWN0IGNhbV9yZXFfbWdyX3RyaWdnZXJfbm90aWZ5ICopJnRhc2tfZGF0YS0+dTsKKwlub3RpZnlfdHJpZ2dlci0+ZnJhbWVfaWQgPSB0cmlnZ2VyX2RhdGEtPmZyYW1lX2lkOworCW5vdGlmeV90cmlnZ2VyLT5saW5rX2hkbCA9IHRyaWdnZXJfZGF0YS0+bGlua19oZGw7CisJbm90aWZ5X3RyaWdnZXItPmRldl9oZGwgPSB0cmlnZ2VyX2RhdGEtPmRldl9oZGw7CisJbm90aWZ5X3RyaWdnZXItPnRyaWdnZXIgPSB0cmlnZ2VyX2RhdGEtPnRyaWdnZXI7CisJdGFzay0+cHJvY2Vzc19jYiA9ICZjYW1fcmVxX21ncl9wcm9jZXNzX3RyaWdnZXI7CiAJcmMgPSBjYW1fcmVxX21ncl93b3JrcV9lbnF1ZXVlX3Rhc2sodGFzaywgbGluaywgQ1JNX1RBU0tfUFJJT1JJVFlfMCk7CiAKIGVuZDoKQEAgLTE1MzcsOSArMTU4NCw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2FtX3JlcV9tZ3JfY3JtX2NiIGNhbV9yZXFfbWdyX29wcyA9IHsKLQkubm90aWZ5X3NvZiA9IGNhbV9yZXFfbWdyX2NiX25vdGlmeV9zb2YsCi0JLm5vdGlmeV9lcnIgPSBjYW1fcmVxX21ncl9jYl9ub3RpZnlfZXJyLAotCS5hZGRfcmVxICAgID0gY2FtX3JlcV9tZ3JfY2JfYWRkX3JlcSwKKwkubm90aWZ5X3RyaWdnZXIgPSBjYW1fcmVxX21ncl9jYl9ub3RpZnlfdHJpZ2dlciwKKwkubm90aWZ5X2VyciAgICAgPSBjYW1fcmVxX21ncl9jYl9ub3RpZnlfZXJyLAorCS5hZGRfcmVxICAgICAgICA9IGNhbV9yZXFfbWdyX2NiX2FkZF9yZXEsCiB9OwogCiAvKioKQEAgLTE1NjEsNiArMTYwOCw3IEBACiAJc3RydWN0IGNhbV9yZXFfbWdyX2Nvbm5lY3RlZF9kZXZpY2UgICAgKmRldjsKIAlzdHJ1Y3QgY2FtX3JlcV9tZ3JfcmVxX3RibCAgICAgICAgICAgICAqcGRfdGJsOwogCWVudW0gY2FtX3BpcGVsaW5lX2RlbGF5ICAgICAgICAgICAgICAgICBtYXhfZGVsYXk7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZV9ldmVudCA9IDA7CiAKIAlpZiAobGlua19pbmZvLT5udW1fZGV2aWNlcyA+IENBTV9SRVFfTUdSX01BWF9IQU5ETEVTKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTU5NCw5ICsxNjQyLDExIEBACiAKIAkJdHJhY2VfY2FtX3JlcV9tZ3JfY29ubmVjdF9kZXZpY2UobGluaywgJmRldi0+ZGV2X2luZm8pOwogCi0JCUNBTV9EQkcoQ0FNX0NSTSwgIiV4OiBjb25uZWN0ZWQ6ICVzLCBpZCAlZCwgZGVsYXkgJWQiLAorCQlDQU1fREJHKENBTV9DUk0sCisJCQkiJXg6IGNvbm5lY3RlZDogJXMsIGlkICVkLCBkZWxheSAlZCwgdHJpZ2dlciAleCIsCiAJCQlsaW5rX2luZm8tPnNlc3Npb25faGRsLCBkZXYtPmRldl9pbmZvLm5hbWUsCi0JCQlkZXYtPmRldl9pbmZvLmRldl9pZCwgZGV2LT5kZXZfaW5mby5wX2RlbGF5KTsKKwkJCWRldi0+ZGV2X2luZm8uZGV2X2lkLCBkZXYtPmRldl9pbmZvLnBfZGVsYXksCisJCQlkZXYtPmRldl9pbmZvLnRyaWdnZXIpOwogCQlpZiAocmMgPCAwIHx8CiAJCQlkZXYtPmRldl9pbmZvLnBfZGVsYXkgPj0KIAkJCUNBTV9QSVBFTElORV9ERUxBWV9NQVggfHwKQEAgLTE2MDksMTggKzE2NTksMTkgQEAKIAkJCQlsaW5rX2luZm8tPnNlc3Npb25faGRsLAogCQkJCWRldi0+ZGV2X2luZm8ubmFtZSwKIAkJCQlkZXYtPmRldl9pbmZvLnBfZGVsYXkpOwotCQkJaWYgKGRldi0+ZGV2X2luZm8ucF9kZWxheSA+Ci0JCQkJbWF4X2RlbGF5KQotCQkJbWF4X2RlbGF5ID0KLQkJCQlkZXYtPmRldl9pbmZvLnBfZGVsYXk7CisJCQlpZiAoZGV2LT5kZXZfaW5mby5wX2RlbGF5ID4gbWF4X2RlbGF5KQorCQkJCW1heF9kZWxheSA9IGRldi0+ZGV2X2luZm8ucF9kZWxheTsKKworCQkJc3Vic2NyaWJlX2V2ZW50IHw9ICh1aW50MzJfdClkZXYtPmRldl9pbmZvLnRyaWdnZXI7CiAJCX0KIAl9CiAKLQorCWxpbmstPnN1YnNjcmliZV9ldmVudCA9IHN1YnNjcmliZV9ldmVudDsKIAlsaW5rX2RhdGEubGlua19lbmFibGUgPSAxOwogCWxpbmtfZGF0YS5saW5rX2hkbCA9IGxpbmstPmxpbmtfaGRsOwogCWxpbmtfZGF0YS5jcm1fY2IgPSAmY2FtX3JlcV9tZ3Jfb3BzOwogCWxpbmtfZGF0YS5tYXhfZGVsYXkgPSBtYXhfZGVsYXk7CisJbGlua19kYXRhLnN1YnNjcmliZV9ldmVudCA9IHN1YnNjcmliZV9ldmVudDsKIAogCWZvciAoaSA9IDA7IGkgPCBsaW5rX2luZm8tPm51bV9kZXZpY2VzOyBpKyspIHsKIAkJZGV2ID0gJmxpbmstPmxfZGV2W2ldOwpAQCAtMTg3NSwxMCArMTkyNiw3IEBACiAJY2FtX2Rlc3Ryb3lfZGV2aWNlX2hkbChsaW5rLT5saW5rX2hkbCk7CiAJbGlua19pbmZvLT5saW5rX2hkbCA9IDA7CiBsaW5rX2hkbF9mYWlsOgotCW11dGV4X2xvY2soJmxpbmstPmxvY2spOwotCWxpbmstPnN0YXRlID0gQ0FNX0NSTV9MSU5LX1NUQVRFX0FWQUlMQUJMRTsKLQltdXRleF91bmxvY2soJmxpbmstPmxvY2spOwotCisJX19jYW1fcmVxX21ncl91bnJlc2VydmVfbGluayhjYW1fc2Vzc2lvbiwgJmxpbmspOwogCW11dGV4X3VubG9jaygmZ19jcm1fY29yZV9kZXYtPmNybV9sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfY29yZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2NvcmUuaAppbmRleCAzZWUwZTJmLi4zNjg3YTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfY29yZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9jb3JlLmgKQEAgLTQ3LDE1ICs0NywxNSBAQAogCiAvKioKICAqIHN0cnVjdCBjcm1fdGFza19wYXlsb2FkCi0gKiBAdHlwZSAgICAgICA6IHRvIGlkZW50aWZ5IHdoaWNoIHR5cGUgb2YgdGFzayBpcyBwcmVzZW50Ci0gKiBAdSAgICAgICAgICA6IHVuaW9uIG9mIHBheWxvYWQgb2YgYWxsIHR5cGVzIG9mIHRhc2tzIHN1cHBvcnRlZAotICogQHNjaGVkX3JlcSAgOiBjb250YWlucyBpbmZvIG9mICBpbmNvbWluZyByZXFlc3QgZnJvbSBDU0wgdG8gQ1JNCi0gKiBAZmx1c2hfaW5mbyA6IGNvbnRhaW5zIGluZm8gb2YgY2FuY2VsbGVkIHJlcWVzdAotICogQGRldl9yZXEgICAgOiBjb250YWlucyB0cmFja2luZyBpbmZvIG9mIGF2YWlsYWJsZSByZXEgaWQgYXQgZGV2aWNlCi0gKiBAc2VuZF9yZXEgICA6IGNvbnRhaW5zIGluZm8gb2YgYXBwbHkgc2V0dGluZ3MgdG8gYmUgc2VudCB0byBkZXZzIGluIGxpbmsKLSAqIEBhcHBseV9yZXEgIDogY29udGFpbnMgaW5mbyBvZiB3aGljaCByZXF1ZXN0IGlzIGFwcGxpZWQgYXQgZGV2aWNlCi0gKiBAbm90aWZ5X3NvZiA6IGNvbnRhaW5zIG5vdGlmaWNhdGlvbiBmcm9tIElGRSB0byBDUk0gYWJvdXQgU09GIHRyaWdnZXIKLSAqIEBub3RpZnlfZXJyIDogY29udGFpbnMgZXJyb3IgaW5mbyBoYXBwZW5lZCB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QKKyAqIEB0eXBlICAgICAgICAgICA6IHRvIGlkZW50aWZ5IHdoaWNoIHR5cGUgb2YgdGFzayBpcyBwcmVzZW50CisgKiBAdSAgICAgICAgICAgICAgOiB1bmlvbiBvZiBwYXlsb2FkIG9mIGFsbCB0eXBlcyBvZiB0YXNrcyBzdXBwb3J0ZWQKKyAqIEBzY2hlZF9yZXEgICAgICA6IGNvbnRhaW5zIGluZm8gb2YgIGluY29taW5nIHJlcWVzdCBmcm9tIENTTCB0byBDUk0KKyAqIEBmbHVzaF9pbmZvICAgICA6IGNvbnRhaW5zIGluZm8gb2YgY2FuY2VsbGVkIHJlcWVzdAorICogQGRldl9yZXEgICAgICAgIDogY29udGFpbnMgdHJhY2tpbmcgaW5mbyBvZiBhdmFpbGFibGUgcmVxIGlkIGF0IGRldmljZQorICogQHNlbmRfcmVxICAgICAgIDogY29udGFpbnMgaW5mbyBvZiBhcHBseSBzZXR0aW5ncyB0byBiZSBzZW50IHRvIGRldnMgaW4gbGluaworICogQGFwcGx5X3JlcSAgICAgIDogY29udGFpbnMgaW5mbyBvZiB3aGljaCByZXF1ZXN0IGlzIGFwcGxpZWQgYXQgZGV2aWNlCisgKiBAbm90aWZ5X3RyaWdnZXIgOiBjb250YWlucyBub3RpZmljYXRpb24gZnJvbSBJRkUgdG8gQ1JNIGFib3V0IHRyaWdnZXIKKyAqIEBub3RpZnlfZXJyICAgICA6IGNvbnRhaW5zIGVycm9yIGluZm8gaGFwcGVuZWQgd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0CiAgKiAtCiAgKi8KIHN0cnVjdCBjcm1fdGFza19wYXlsb2FkIHsKQEAgLTY1LDcgKzY1LDcgQEAKIAkJc3RydWN0IGNhbV9yZXFfbWdyX2ZsdXNoX2luZm8gICAgICAgICAgIGZsdXNoX2luZm87CiAJCXN0cnVjdCBjYW1fcmVxX21ncl9hZGRfcmVxdWVzdCAgICAgICAgICBkZXZfcmVxOwogCQlzdHJ1Y3QgY2FtX3JlcV9tZ3Jfc2VuZF9yZXF1ZXN0ICAgICAgICAgc2VuZF9yZXE7Ci0JCXN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5ICAgICAgICAgICBub3RpZnlfc29mOworCQlzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgICAgICAgbm90aWZ5X3RyaWdnZXI7CiAJCXN0cnVjdCBjYW1fcmVxX21ncl9lcnJvcl9ub3RpZnkgICAgICAgICBub3RpZnlfZXJyOwogCX0gdTsKIH07CkBAIC05MCw4ICs5MCw4IEBACiAgKiBTdGF0ZSBtYWNoaW5lIGZvciBsaWZlIGN5Y2xlIG9mIHJlcXVlc3QgaW4gaW5wdXQgcXVldWUKICAqIE5PX1JFUSAgICAgOiBlbXB0eSBzbG90CiAgKiBSRVFfQURERUQgIDogbmV3IGVudHJ5IGluIHNsb3QKLSAqIElOQ09NUExFVEUgOiB3YWl0aW5nIGZvcgotICogQVBQTElFRCAgICA6IHJlcSBpcyBzZW50IHRvIGRldmljZXMKKyAqIFBFTkRJTkcgICAgOiB3YWl0aW5nIGZvciBuZXh0IHRyaWdnZXIgdG8gYXBwbHkKKyAqIEFQUExJRUQgICAgOiByZXEgaXMgc2VudCB0byBhbGwgZGV2aWNlcwogICogSU5WQUxJRCAgICA6IGludmFsaWQgc3RhdGUKICAqLwogZW51bSBjcm1fc2xvdF9zdGF0dXMgewpAQCAtMTA4LDcgKzEwOCw3IEBACiAgKiBBVkFJTEFCTEUgIDogbGluayBhdmFpbGFibGUKICAqIElETEUgICAgICAgOiBsaW5rIGluaXRpYWxpemVkIGJ1dCBub3QgcmVhZHkgeWV0CiAgKiBSRUFEWSAgICAgIDogbGluayBpcyByZWFkeSBmb3IgdXNlCi0gKiBFUlIJICAgICAgOiBsaW5rIGhhcyBlbmNvdW50ZXJlZCBlcnJvcgorICogRVJSICAgICAgICA6IGxpbmsgaGFzIGVuY291bnRlcmVkIGVycm9yCiAgKiBNQVggICAgICAgIDogaW52YWxpZCBzdGF0ZQogICovCiBlbnVtIGNhbV9yZXFfbWdyX2xpbmtfc3RhdGUgewpAQCAtMTczLDYgKzE3Myw3IEBACiAgKiBAcGRfZGVsdGEgICAgICA6IGRpZmZlcm5jZSBiZXR3ZWVuIHRoaXMgdGFibGUncyBwaXBlbGluZSBkZWxheSBhbmQgbmV4dAogICogQG51bV9zbG90cyAgICAgOiBudW1iZXIgb2YgcmVxdWVzdCBzbG90cyBwcmVzZW50IGluIHRoZSB0YWJsZQogICogQHNsb3QgICAgICAgICAgOiBhcnJheSBvZiBzbG90cyB0cmFja2luZyByZXF1ZXN0cyBhdmFpbGFiaWxpdHkgYXQgZGV2aWNlcworICogQGluamVjdF9kZWxheSAgOiBpbnNlcnQgZXh0cmEgYnViYmxpbmcgZm9yIGZsYXNoIHR5cGUgb2YgdXNlIGNhc2VzCiAgKi8KIHN0cnVjdCBjYW1fcmVxX21ncl9yZXFfdGJsIHsKIAlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgaWQ7CkBAIC0xODQsMTcgKzE4NSwxOCBAQAogCWludDMyX3QgICAgICAgICAgICAgICAgICAgICBwZF9kZWx0YTsKIAlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbnVtX3Nsb3RzOwogCXN0cnVjdCBjYW1fcmVxX21ncl90Ymxfc2xvdCBzbG90W01BWF9SRVFfU0xPVFNdOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBpbmplY3RfZGVsYXk7CiB9OwogCiAvKioKICAqIHN0cnVjdCBjYW1fcmVxX21ncl9zbG90CiAgKiAtIEludGVybmFsIEJvb2sga2VlcGluZwotICogQGlkeCAgICAgIDogc2xvdCBpbmRleAotICogQHNraXBfaWR4IDogaWYgcmVxIGlkIGluIHRoaXMgc2xvdCBuZWVkcyB0byBiZSBza2lwcGVkL25vdCBhcHBsaWVkCi0gKiBAc3RhdHVzICAgOiBzdGF0ZSBtYWNoaW5lIGZvciBsaWZlIGN5Y2xlIG9mIGEgc2xvdAorICogQGlkeCAgICAgICAgICA6IHNsb3QgaW5kZXgKKyAqIEBza2lwX2lkeCAgICAgOiBpZiByZXEgaWQgaW4gdGhpcyBzbG90IG5lZWRzIHRvIGJlIHNraXBwZWQvbm90IGFwcGxpZWQKKyAqIEBzdGF0dXMgICAgICAgOiBzdGF0ZSBtYWNoaW5lIGZvciBsaWZlIGN5Y2xlIG9mIGEgc2xvdAogICogLSBtZW1iZXJzIHVwZGF0ZWQgZHVlIHRvIGV4dGVybmFsIGV2ZW50cwotICogQHJlY292ZXIgIDogaWYgdXNlciBlbmFibGVkIHJlY292ZXJ5IGZvciB0aGlzIHJlcXVlc3QuCi0gKiBAcmVxX2lkICAgOiBtYXNrIHRyYWNraW5nIHdoaWNoIGFsbCBkZXZpY2VzIGhhdmUgcmVxdWVzdCByZWFkeQorICogQHJlY292ZXIgICAgICA6IGlmIHVzZXIgZW5hYmxlZCByZWNvdmVyeSBmb3IgdGhpcyByZXF1ZXN0LgorICogQHJlcV9pZCAgICAgICA6IG1hc2sgdHJhY2tpbmcgd2hpY2ggYWxsIGRldmljZXMgaGF2ZSByZXF1ZXN0IHJlYWR5CiAgKi8KIHN0cnVjdCBjYW1fcmVxX21ncl9zbG90IHsKIAlpbnQzMl90ICAgICAgICAgICAgICAgaWR4OwpAQCAtMjc1LDYgKzI3Nyw5IEBACiAgKiBAc3RhdGUgICAgICAgICAgOiBsaW5rIHN0YXRlIG1hY2hpbmUKICAqIEBwYXJlbnQgICAgICAgICA6IHB2dCBkYXRhIC0gbGluaydzIHBhcmVudCBpcyBzZXNzaW9uCiAgKiBAbG9jayAgICAgICAgICAgOiBtdXRleCBsb2NrIHRvIGd1YXJkIGxpbmsgZGF0YSBvcGVyYXRpb25zCisgKiBAc3Vic2NyaWJlX2V2ZW50OiBpcnFzIHRoYXQgbGluayBzdWJzY3JpYmVzLCBJRkUgc2hvdWxkIHNlbmQgbm90aWZpY2F0aW9uCisgKiB0byBDUk0gYXQgdGhvc2UgaHcgZXZlbnRzLgorICogQHRyaWdnZXJfbWFzayAgIDogbWFzayBvbiB3aGljaCBpcnEgdGhlIHJlcSBpcyBhbHJlYWR5IGFwcGxpZWQKICAqLwogc3RydWN0IGNhbV9yZXFfbWdyX2NvcmVfbGluayB7CiAJaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfaGRsOwpAQCAtMjg5LDYgKzI5NCw4IEBACiAJZW51bSBjYW1fcmVxX21ncl9saW5rX3N0YXRlICAgICAgICAgIHN0YXRlOwogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJlbnQ7CiAJc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2s7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZV9ldmVudDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9tYXNrOwogfTsKIAogLyoqCkBAIC0zMTAsNyArMzE3LDYgQEAKIAlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2hkbDsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBudW1fbGlua3M7CiAJc3RydWN0IGNhbV9yZXFfbWdyX2NvcmVfbGluayAqbGlua3NbTUFYX0xJTktTX1BFUl9TRVNTSU9OXTsKLQlzdHJ1Y3QgY2FtX3JlcV9tZ3JfcmVxX3F1ZXVlICBpbl9xOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgIGVudHJ5OwogCXN0cnVjdCBtdXRleCAgICAgICAgICAgICAgICAgIGxvY2s7CiAJaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VfZXJyX3JlY292ZXJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2NvcmVfZGVmcy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2NvcmVfZGVmcy5oCmluZGV4IGY2MWM0MWUuLjQ3NWI2NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9jb3JlX2RlZnMuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfY29yZV9kZWZzLmgKQEAgLTE1LDEzICsxNSw5IEBACiAjZGVmaW5lIENSTV9UUkFDRV9FTkFCTEUgMAogI2RlZmluZSBDUk1fREVCVUdfTVVURVggMAogCi0jZGVmaW5lIFNFVF9TVUNDRVNTX0JJVChyZXQsIHBkKQl7XAotCShyZXQpIHw9ICgxIDw8IChwZCkpOwlcCi0JfQorI2RlZmluZSBTRVRfU1VDQ0VTU19CSVQocmV0LCBwZCkgIChyZXQgfD0gKDEgPDwgKHBkKSkpCiAKLSNkZWZpbmUgU0VUX0ZBSUxVUkVfQklUKHJldCwgcGQpCXtcCi0JKHJldCkgJj0gKDAgPDwgKHBkKSk7CVwKLQl9CisjZGVmaW5lIFNFVF9GQUlMVVJFX0JJVChyZXQsIHBkKSAgKHJldCAmPSAofigxIDw8IChwZCkpKSkKIAogI2RlZmluZSBDUk1fR0VUX1JFUV9JRChpbl9xLCBpZHgpIGluX3EtPnNsb3RbaWR4XS5yZXFfaWQKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2Rldi5jCmluZGV4IDdhMmJjMDkuLmU0YmM5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfZGV2LmMKQEAgLTUwMCw2ICs1MDAsMTIgQEAKIAlnX2Rldi52aWRlbyA9IE5VTEw7CiB9CiAKK3ZvaWQgY2FtX3JlZ2lzdGVyX3N1YmRldl9mb3BzKHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwkqZm9wcyA9IHY0bDJfc3ViZGV2X2ZvcHM7Cit9CitFWFBPUlRfU1lNQk9MKGNhbV9yZWdpc3Rlcl9zdWJkZXZfZm9wcyk7CisKIGludCBjYW1fcmVnaXN0ZXJfc3ViZGV2KHN0cnVjdCBjYW1fc3ViZGV2ICpjc2QpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl9pbnRlcmZhY2UuaAppbmRleCA4ZmFmMzVhLi5jZThkZmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfaW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX2ludGVyZmFjZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSAiY2FtX3JlcV9tZ3JfY29yZV9kZWZzLmgiCiAjaW5jbHVkZSAiY2FtX3JlcV9tZ3JfdXRpbC5oIgogCi1zdHJ1Y3QgY2FtX3JlcV9tZ3Jfc29mX25vdGlmeTsKK3N0cnVjdCBjYW1fcmVxX21ncl90cmlnZ2VyX25vdGlmeTsKIHN0cnVjdCBjYW1fcmVxX21ncl9lcnJvcl9ub3RpZnk7CiBzdHJ1Y3QgY2FtX3JlcV9tZ3JfYWRkX3JlcXVlc3Q7CiBzdHJ1Y3QgY2FtX3JlcV9tZ3JfZGV2aWNlX2luZm87CkBAIC0yOSwxMyArMjksMTUgQEAKIAogLyogUmVxdWVzdCBNYW5hZ2VyIC0tIGNhbWVyYSBkZXZpY2UgZHJpdmVyIGludGVyZmFjZSAqLwogLyoqCi0gKiBAYnJpZWY6IGNhbWVyYSBrZXJuZWwgZHJpdmVycyAgdG8gY2FtIHJlcSBtZ3IgY29tbXVuaWNhdGlvbgorICogQGJyaWVmOiBjYW1lcmEga2VybmVsIGRyaXZlcnMgdG8gY2FtIHJlcSBtZ3IgY29tbXVuaWNhdGlvbgogICoKLSAqIEBjYW1fcmVxX21ncl9ub3RpZnlfc29mOiBmb3IgZGV2aWNlIHdoaWNoIGdlbmVyYXRlcyBzb2YgdG8gaW5mb3JtIENSTQotICogQGNhbV9yZXFfbWdyX25vdGlmeV9lcnI6IGRldmljZSB1c2UgdGhpcyB0byBpbmZvcm0gYWJvdXQgZGlmZmVyZW50IGVycm9ycy4KLSAqIEBjYW1fcmVxX21ncl9hZGRfcmVxOiB0byBpbmZvIENSbSBhYm91dCBuZXcgcnFldWVzdCByZWNlaXZlZCBmcm9tIHVzZXJzcGFjZQorICogQGNhbV9yZXFfbWdyX25vdGlmeV90cmlnZ2VyOiBmb3IgZGV2aWNlIHdoaWNoIGdlbmVyYXRlcyB0cmlnZ2VyIHRvIGluZm9ybSBDUk0KKyAqIEBjYW1fcmVxX21ncl9ub3RpZnlfZXJyICAgIDogZGV2aWNlIHVzZSB0aGlzIHRvIGluZm9ybSBhYm91dCBkaWZmZXJlbnQgZXJyb3JzCisgKiBAY2FtX3JlcV9tZ3JfYWRkX3JlcSAgICAgICA6IHRvIGluZm8gQ1JtIGFib3V0IG5ldyBycWV1ZXN0IHJlY2VpdmVkIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcnNwYWNlCiAgKi8KLXR5cGVkZWYgaW50ICgqY2FtX3JlcV9tZ3Jfbm90aWZ5X3NvZikoc3RydWN0IGNhbV9yZXFfbWdyX3NvZl9ub3RpZnkgKik7Cit0eXBlZGVmIGludCAoKmNhbV9yZXFfbWdyX25vdGlmeV90cmlnZ2VyKSgKKwlzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkgKik7CiB0eXBlZGVmIGludCAoKmNhbV9yZXFfbWdyX25vdGlmeV9lcnIpKHN0cnVjdCBjYW1fcmVxX21ncl9lcnJvcl9ub3RpZnkgKik7CiB0eXBlZGVmIGludCAoKmNhbV9yZXFfbWdyX2FkZF9yZXEpKHN0cnVjdCBjYW1fcmVxX21ncl9hZGRfcmVxdWVzdCAqKTsKIApAQCAtNTcsMTYgKzU5LDE2IEBACiB0eXBlZGVmIGludCAoKmNhbV9yZXFfbWdyX3Byb2Nlc3NfZXZ0KShzdHJ1Y3QgY2FtX3JlcV9tZ3JfbGlua19ldnRfZGF0YSAqKTsKIAogLyoqCi0gKiBAYnJpZWYgICAgICA6IGNhbV9yZXFfbWdyX2NybV9jYiAtIGZ1bmMgdGFibGUKKyAqIEBicmllZiAgICAgICAgICA6IGNhbV9yZXFfbWdyX2NybV9jYiAtIGZ1bmMgdGFibGUKICAqCi0gKiBAbm90aWZ5X3NvZiA6IHBheWxvYWQgZm9yIHNvZiBpbmRpY2F0aW9uIGV2ZW50Ci0gKiBAbm90aWZ5X2VyciA6IHBheWxvYWQgZm9yIGRpZmZlcmVudCBlcnJvciBvY2N1cnJlZCBhdCBkZXZpY2UKLSAqIEBhZGRfcmVxICAgIDogcGF5bG9hZCB0byBpbmZvcm0gd2hpY2ggZGV2aWNlIGFuZCB3aGF0IHJlcXVlc3QgaXMgcmVjZWl2ZWQKKyAqIEBub3RpZnlfdHJpZ2dlciA6IHBheWxvYWQgZm9yIHRyaWdnZXIgaW5kaWNhdGlvbiBldmVudAorICogQG5vdGlmeV9lcnIgICAgIDogcGF5bG9hZCBmb3IgZGlmZmVyZW50IGVycm9yIG9jY3VycmVkIGF0IGRldmljZQorICogQGFkZF9yZXEgICAgICAgIDogcGF5bG9hZCB0byBpbmZvcm0gd2hpY2ggZGV2aWNlIGFuZCB3aGF0IHJlcXVlc3QgaXMgcmVjZWl2ZWQKICAqLwogc3RydWN0IGNhbV9yZXFfbWdyX2NybV9jYiB7Ci0JY2FtX3JlcV9tZ3Jfbm90aWZ5X3NvZiAgbm90aWZ5X3NvZjsKLQljYW1fcmVxX21ncl9ub3RpZnlfZXJyICBub3RpZnlfZXJyOwotCWNhbV9yZXFfbWdyX2FkZF9yZXEgICAgIGFkZF9yZXE7CisJY2FtX3JlcV9tZ3Jfbm90aWZ5X3RyaWdnZXIgIG5vdGlmeV90cmlnZ2VyOworCWNhbV9yZXFfbWdyX25vdGlmeV9lcnIgICAgICBub3RpZnlfZXJyOworCWNhbV9yZXFfbWdyX2FkZF9yZXEgICAgICAgICBhZGRfcmVxOwogfTsKIAogLyoqCkBAIC0xMDMsNiArMTA1LDEzIEBACiB9OwogCiAvKioKKyAqIEBDQU1fVFJJR0dFUl9QT0lOVF9TT0YgICA6IFRyaWdnZXIgcG9pbnQgZm9yIFNPRgorICogQENBTV9UUklHR0VSX1BPSU5UX0VPRiAgIDogVHJpZ2dlciBwb2ludCBmb3IgRU9GCisgKi8KKyNkZWZpbmUgQ0FNX1RSSUdHRVJfUE9JTlRfU09GICAgICAoMSA8PCAwKQorI2RlZmluZSBDQU1fVFJJR0dFUl9QT0lOVF9FT0YgICAgICgxIDw8IDEpCisKKy8qKgogICogZW51bSBjYW1fcmVxX3N0YXR1cwogICogQGJyaWVmICAgOiBlbnVtZXJhdG9yIGZvciByZXF1ZXN0IHN0YXR1cwogICoKQEAgLTE3NywxNSArMTg2LDE4IEBACiB9OwogCiAvKioKLSAqIHN0cnVjdCBjYW1fcmVxX21ncl9zb2Zfbm90aWZ5CisgKiBzdHJ1Y3QgY2FtX3JlcV9tZ3JfdHJpZ2dlcl9ub3RpZnkKICAqIEBsaW5rX2hkbCA6IGxpbmsgaWRlbnRpZmllcgogICogQGRldl9oZGwgIDogZGV2aWNlIGhhbmRsZSB3aGljaCBoYXMgc2VudCB0aGlzIHJlcSBpZAogICogQGZyYW1lX2lkIDogZnJhbWUgaWQgZm9yIGludGVybmFsIHRyYWNraW5nCisgKiBAdHJpZ2dlciAgOiB0cmlnZ2VyIHBvaW50IG9mIHRoaXMgbm90aWZpY2F0aW9uLCBDUk0gd2lsbCBzZW5kIGFwcGx5CisgKiBvbmx5IHRvIHRoZSBkZXZpY2VzIHdoaWNoIHN1YnNjcmliZSB0byB0aGlzIHBvaW50LgogICovCi1zdHJ1Y3QgY2FtX3JlcV9tZ3Jfc29mX25vdGlmeSB7Ci0JaW50MzJfdCBsaW5rX2hkbDsKLQlpbnQzMl90IGRldl9oZGw7Ci0JaW50NjRfdCBmcmFtZV9pZDsKK3N0cnVjdCBjYW1fcmVxX21ncl90cmlnZ2VyX25vdGlmeSB7CisJaW50MzJfdCAgbGlua19oZGw7CisJaW50MzJfdCAgZGV2X2hkbDsKKwlpbnQ2NF90ICBmcmFtZV9pZDsKKwl1aW50MzJfdCB0cmlnZ2VyOwogfTsKIAogLyoqCkBAIC0yMDQsMTUgKzIxNiwxOCBAQAogCiAvKioKICAqIHN0cnVjdCBjYW1fcmVxX21ncl9hZGRfcmVxdWVzdAotICogQGxpbmtfaGRsIDogbGluayBpZGVudGlmaWVyCi0gKiBAZGV2X2hkbCAgOiBkZXZpY2UgaGFuZGxlIHdoaWNoIGhhcyBzZW50IHRoaXMgcmVxIGlkCi0gKiBAcmVxX2lkICAgOiByZXEgaWQgd2hpY2ggZGV2aWNlIGlzIHJlYWR5IHRvIHByb2Nlc3MKLSAqCisgKiBAbGlua19oZGwgICAgICAgICAgICAgOiBsaW5rIGlkZW50aWZpZXIKKyAqIEBkZXZfaGRsICAgICAgICAgICAgICA6IGRldmljZSBoYW5kbGUgd2hpY2ggaGFzIHNlbnQgdGhpcyByZXEgaWQKKyAqIEByZXFfaWQgICAgICAgICAgICAgICA6IHJlcSBpZCB3aGljaCBkZXZpY2UgaXMgcmVhZHkgdG8gcHJvY2VzcworICogQHNraXBfYmVmb3JlX2FwcGx5aW5nIDogYmVmb3JlIGFwcGx5aW5nIHJlcSBtZ3IgaW50cm9kdWNlIGJ1YmJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgYnkgbm90IHNlbmRpbmcgcmVxdWVzdCB0byBkZXZpY2Uvcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGV4OiBJRkUgYW5kIEZsYXNoCiAgKi8KIHN0cnVjdCBjYW1fcmVxX21ncl9hZGRfcmVxdWVzdCB7CiAJaW50MzJfdCAgbGlua19oZGw7CiAJaW50MzJfdCAgZGV2X2hkbDsKIAl1aW50NjRfdCByZXFfaWQ7CisJdWludDMyX3Qgc2tpcF9iZWZvcmVfYXBwbHlpbmc7CiB9OwogCiAKQEAgLTIyMyw2ICsyMzgsNyBAQAogICogQG5hbWUgICAgOiBsaW5rIGxpbmsgb3IgdW5saW5rCiAgKiBAZGV2X2lkICA6IGRldmljZSBpZCBpbmZvCiAgKiBAcF9kZWxheSA6IGRlbGF5IGJldHdlZW4gdGltZSBzZXR0aW5ncyBhcHBsaWVkIGFuZCB0YWtlIGVmZmVjdAorICogQHRyaWdnZXIgOiBUcmlnZ2VyIHBvaW50IGZvciB0aGUgY2xpZW50CiAgKgogICovCiBzdHJ1Y3QgY2FtX3JlcV9tZ3JfZGV2aWNlX2luZm8gewpAQCAtMjMwLDE1ICsyNDYsMTcgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVsyNTZdOwogCWVudW0gY2FtX3JlcV9tZ3JfZGV2aWNlX2lkICBkZXZfaWQ7CiAJZW51bSBjYW1fcGlwZWxpbmVfZGVsYXkgICAgIHBfZGVsYXk7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHRyaWdnZXI7CiB9OwogCiAvKioKICAqIHN0cnVjdCBjYW1fcmVxX21ncl9jb3JlX2Rldl9saW5rX3NldHVwCi0gKiBAbGlua19lbmFibGUgOiBsaW5rIGxpbmsgb3IgdW5saW5rCi0gKiBAbGlua19oZGwgICAgOiBsaW5rIGlkZW50aWZpZXIKLSAqIEBkZXZfaGRsICAgICA6IGRldmljZSBoYW5kbGUgZm9yIHJlZmVyZW5jZQotICogQG1heF9kZWxheSAgIDogbWF4IHBpcGVsaW5lIGRlbGF5IG9uIHRoaXMgbGluawotICogQGNybV9jYiAgICAgIDogY2FsbGJhY2sgZnVuY3MgdG8gY29tbXVuaWNhdGUgd2l0aCByZXEgbWdyCisgKiBAbGlua19lbmFibGUgICAgIDogbGluayBsaW5rIG9yIHVubGluaworICogQGxpbmtfaGRsICAgICAgICA6IGxpbmsgaWRlbnRpZmllcgorICogQGRldl9oZGwgICAgICAgICA6IGRldmljZSBoYW5kbGUgZm9yIHJlZmVyZW5jZQorICogQG1heF9kZWxheSAgICAgICA6IG1heCBwaXBlbGluZSBkZWxheSBvbiB0aGlzIGxpbmsKKyAqIEBjcm1fY2IgICAgICAgICAgOiBjYWxsYmFjayBmdW5jcyB0byBjb21tdW5pY2F0ZSB3aXRoIHJlcSBtZ3IKKyAqIEBzdWJzY3JpYmVfZXZlbnQgOiB0aGUgbWFzayBvZiB0cmlnZ2VyIHBvaW50cyB0aGlzIGxpbmsgc3Vic2NyaWJlcwogICoKICAqLwogc3RydWN0IGNhbV9yZXFfbWdyX2NvcmVfZGV2X2xpbmtfc2V0dXAgewpAQCAtMjQ3LDYgKzI2NSw3IEBACiAJaW50MzJfdCAgICAgICAgICAgICAgICAgICAgZGV2X2hkbDsKIAllbnVtIGNhbV9waXBlbGluZV9kZWxheSAgICBtYXhfZGVsYXk7CiAJc3RydWN0IGNhbV9yZXFfbWdyX2NybV9jYiAqY3JtX2NiOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZV9ldmVudDsKIH07CiAKIC8qKgpAQCAtMjU1LDYgKzI3NCw3IEBACiAgKiBAZGV2X2hkbCAgICAgICAgICA6IGRldmljZSBoYW5kbGUgZm9yIGNyb3NzIGNoZWNrCiAgKiBAcmVxdWVzdF9pZCAgICAgICA6IHJlcXVlc3QgaWQgc2V0dGluZ3MgdG8gYXBwbHkKICAqIEByZXBvcnRfaWZfYnViYmxlIDogcmVwb3J0IHRvIGNybSBpZiBmYWlsdXJlIGluIGFwcGx5aW5nCisgKiBAdHJpZ2dlcl9wb2ludCAgICA6IHRoZSB0cmlnZ2VyIHBvaW50IG9mIHRoaXMgYXBwbHkKICAqCiAgKi8KIHN0cnVjdCBjYW1fcmVxX21ncl9hcHBseV9yZXF1ZXN0IHsKQEAgLTI2Miw2ICsyODIsNyBAQAogCWludDMyX3QgICAgZGV2X2hkbDsKIAl1aW50NjRfdCAgIHJlcXVlc3RfaWQ7CiAJaW50MzJfdCAgICByZXBvcnRfaWZfYnViYmxlOworCXVpbnQzMl90ICAgdHJpZ2dlcl9wb2ludDsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX3V0aWwuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fcmVxX21ncl91dGlsLmMKaW5kZXggYTkxMzRmYi4uMWQyMTY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9yZXFfbWdyX3V0aWwuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3JlcV9tZ3JfdXRpbC5jCkBAIC0yMDMsMjkgKzIwMywyOSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZoZGxfdGJsX2xvY2spOwogCWlmICghaGRsX3RibCkgewotCQlDQU1fRVJSKENBTV9DUk0sICJIZGwgdGJsIGlzIE5VTEwiKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9DUk0sICJIZGwgdGJsIGlzIE5VTEwiKTsKIAkJZ290byBkZXZpY2VfcHJpdl9mYWlsOwogCX0KIAogCWlkeCA9IENBTV9SRVFfTUdSX0dFVF9IRExfSURYKGRldl9oZGwpOwogCWlmIChpZHggPj0gQ0FNX1JFUV9NR1JfTUFYX0hBTkRMRVMpIHsKLQkJQ0FNX0VSUihDQU1fQ1JNLCAiSW52YWxpZCBpZHgiKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9DUk0sICJJbnZhbGlkIGlkeCIpOwogCQlnb3RvIGRldmljZV9wcml2X2ZhaWw7CiAJfQogCiAJaWYgKGhkbF90YmwtPmhkbFtpZHhdLnN0YXRlICE9IEhETF9BQ1RJVkUpIHsKLQkJQ0FNX0VSUihDQU1fQ1JNLCAiSW52YWxpZCBzdGF0ZSIpOworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0NSTSwgIkludmFsaWQgc3RhdGUiKTsKIAkJZ290byBkZXZpY2VfcHJpdl9mYWlsOwogCX0KIAogCXR5cGUgPSBDQU1fUkVRX01HUl9HRVRfSERMX1RZUEUoZGV2X2hkbCk7CiAJaWYgKEhETF9UWVBFX0RFViAhPSB0eXBlICYmIEhETF9UWVBFX1NFU1NJT04gIT0gdHlwZSkgewotCQlDQU1fRVJSKENBTV9DUk0sICJJbnZhbGlkIHR5cGUiKTsKKwkJQ0FNX0VSUl9SQVRFX0xJTUlUKENBTV9DUk0sICJJbnZhbGlkIHR5cGUiKTsKIAkJZ290byBkZXZpY2VfcHJpdl9mYWlsOwogCX0KIAogCWlmIChoZGxfdGJsLT5oZGxbaWR4XS5oZGxfdmFsdWUgIT0gZGV2X2hkbCkgewotCQlDQU1fRVJSKENBTV9DUk0sICJJbnZhbGlkIGhkbCIpOworCQlDQU1fRVJSX1JBVEVfTElNSVQoQ0FNX0NSTSwgIkludmFsaWQgaGRsIik7CiAJCWdvdG8gZGV2aWNlX3ByaXZfZmFpbDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fc3ViZGV2LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3JlcV9tZ3IvY2FtX3N1YmRldi5oCmluZGV4IDc4ZjIyMjMuLjhjZDMyMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21nci9jYW1fc3ViZGV2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9yZXFfbWdyL2NhbV9zdWJkZXYuaApAQCAtODIsNiArODIsMTUgQEAKIGludCBjYW1fc3ViZGV2X3JlbW92ZShzdHJ1Y3QgY2FtX3N1YmRldiAqc2QpOwogCiAvKioKKyAqIGNhbV9yZWdpc3Rlcl9zdWJkZXZfZm9wcygpCisgKgorICogQGJyaWVmOiAgIFRoaXMgY29tbW9uIHV0aWxpdHkgZnVuY3Rpb24gYXNzaWducyBzdWJkZXYgb3BzCisgKgorICogQGZvcHM6ICAgIHY0bCBmaWxlIG9wZXJhdGlvbnMKKyAqLwordm9pZCBjYW1fcmVnaXN0ZXJfc3ViZGV2X2ZvcHMoc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zICpmb3BzKTsKKworLyoqCiAgKiBjYW1fcmVnaXN0ZXJfc3ViZGV2KCkKICAqCiAgKiBAYnJpZWY6ICAgVGhpcyBpcyB0aGUgY29tbW9uIHV0aWxpdHkgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IGVhY2ggY2FtZXJhCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvTWFrZWZpbGUKaW5kZXggYjY2NDgwYy4uOTRhNTkxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9NYWtlZmlsZQpAQCAtNiwzICs2LDQgQEAKIG9iai0kKENPTkZJR19TUEVDVFJBX0NBTUVSQSkgKz0gY2FtX3NlbnNvci8KIG9iai0kKENPTkZJR19TUEVDVFJBX0NBTUVSQSkgKz0gY2FtX2ZsYXNoLwogb2JqLSQoQ09ORklHX1NQRUNUUkFfQ0FNRVJBKSArPSBjYW1fZWVwcm9tLworb2JqLSQoQ09ORklHX1NQRUNUUkFfQ0FNRVJBKSArPSBjYW1fb2lzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9hY3R1YXRvci9jYW1fYWN0dWF0b3JfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9hY3R1YXRvci9jYW1fYWN0dWF0b3JfY29yZS5jCmluZGV4IDE4MDk3YjAuLmMzNDc1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9jb3JlLmMKQEAgLTE2LDYgKzE2LDcwIEBACiAjaW5jbHVkZSAiY2FtX3NlbnNvcl91dGlsLmgiCiAjaW5jbHVkZSAiY2FtX3RyYWNlLmgiCiAKK3N0YXRpYyBpbnQzMl90IGNhbV9hY3R1YXRvcl9pMmNfbW9kZXNfdXRpbCgKKwlzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqaW9fbWFzdGVyX2luZm8sCisJc3RydWN0IGkyY19zZXR0aW5nc19saXN0ICppMmNfbGlzdCkKK3sKKwlpbnQzMl90IHJjID0gMDsKKwl1aW50MzJfdCBpLCBzaXplOworCisJaWYgKGkyY19saXN0LT5vcF9jb2RlID09IENBTV9TRU5TT1JfSTJDX1dSSVRFX1JBTkRPTSkgeworCQlyYyA9IGNhbWVyYV9pb19kZXZfd3JpdGUoaW9fbWFzdGVyX2luZm8sCisJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsCisJCQkJIkZhaWxlZCB0byByYW5kb20gd3JpdGUgSTJDIHNldHRpbmdzOiAlZCIsCisJCQkJcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIGlmIChpMmNfbGlzdC0+b3BfY29kZSA9PSBDQU1fU0VOU09SX0kyQ19XUklURV9TRVEpIHsKKwkJcmMgPSBjYW1lcmFfaW9fZGV2X3dyaXRlX2NvbnRpbnVvdXMoCisJCQlpb19tYXN0ZXJfaW5mbywKKwkJCSYoaTJjX2xpc3QtPmkyY19zZXR0aW5ncyksCisJCQkwKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsCisJCQkJIkZhaWxlZCB0byBzZXEgd3JpdGUgSTJDIHNldHRpbmdzOiAlZCIsCisJCQkJcmMpOworCQkJcmV0dXJuIHJjOworCQkJfQorCX0gZWxzZSBpZiAoaTJjX2xpc3QtPm9wX2NvZGUgPT0gQ0FNX1NFTlNPUl9JMkNfV1JJVEVfQlVSU1QpIHsKKwkJcmMgPSBjYW1lcmFfaW9fZGV2X3dyaXRlX2NvbnRpbnVvdXMoCisJCQlpb19tYXN0ZXJfaW5mbywKKwkJCSYoaTJjX2xpc3QtPmkyY19zZXR0aW5ncyksCisJCQkxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsCisJCQkJIkZhaWxlZCB0byBidXJzdCB3cml0ZSBJMkMgc2V0dGluZ3M6ICVkIiwKKwkJCQlyYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgaWYgKGkyY19saXN0LT5vcF9jb2RlID09IENBTV9TRU5TT1JfSTJDX1BPTEwpIHsKKwkJc2l6ZSA9IGkyY19saXN0LT5pMmNfc2V0dGluZ3Muc2l6ZTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJcmMgPSBjYW1lcmFfaW9fZGV2X3BvbGwoCisJCQlpb19tYXN0ZXJfaW5mbywKKwkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCisJCQkJcmVnX3NldHRpbmdbaV0ucmVnX2FkZHIsCisJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLgorCQkJCXJlZ19zZXR0aW5nW2ldLnJlZ19kYXRhLAorCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCQlyZWdfc2V0dGluZ1tpXS5kYXRhX21hc2ssCisJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLmFkZHJfdHlwZSwKKwkJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLmRhdGFfdHlwZSwKKwkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCisJCQkJcmVnX3NldHRpbmdbaV0uZGVsYXkpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLAorCQkJCQkiaTJjIHBvbGwgYXBwbHkgc2V0dGluZyBGYWlsOiAlZCIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIGludDMyX3QgY2FtX2FjdHVhdG9yX3NsYXZlSW5mb19wa3RfcGFyc2VyKHN0cnVjdCBjYW1fYWN0dWF0b3JfY3RybF90ICphX2N0cmwsCiAJdWludDMyX3QgKmNtZF9idWYpCiB7CkBAIC0yOCwxMiArOTIsMjMgQEAKIAl9CiAKIAlpMmNfaW5mbyA9IChzdHJ1Y3QgY2FtX2NtZF9pMmNfaW5mbyAqKWNtZF9idWY7Ci0JYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50LT5pMmNfZnJlcV9tb2RlID0KLQkJaTJjX2luZm8tPmkyY19mcmVxX21vZGU7Ci0JYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50LT5zaWQgPQotCQlpMmNfaW5mby0+c2xhdmVfYWRkciA+PiAxOwotCUNBTV9EQkcoQ0FNX0FDVFVBVE9SLCAiU2xhdmUgYWRkcjogMHgleCBGcmVxIE1vZGU6ICVkIiwKLQkJaTJjX2luZm8tPnNsYXZlX2FkZHIsIGkyY19pbmZvLT5pMmNfZnJlcV9tb2RlKTsKKwlpZiAoYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9PSBDQ0lfTUFTVEVSKSB7CisJCWFfY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudC0+Y2NpX2kyY19tYXN0ZXIgPQorCQkJYV9jdHJsLT5jY2lfaTJjX21hc3RlcjsKKwkJYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50LT5pMmNfZnJlcV9tb2RlID0KKwkJCWkyY19pbmZvLT5pMmNfZnJlcV9tb2RlOworCQlhX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNjaV9jbGllbnQtPnNpZCA9CisJCQlpMmNfaW5mby0+c2xhdmVfYWRkciA+PiAxOworCQlDQU1fREJHKENBTV9BQ1RVQVRPUiwgIlNsYXZlIGFkZHI6IDB4JXggRnJlcSBNb2RlOiAlZCIsCisJCQlpMmNfaW5mby0+c2xhdmVfYWRkciwgaTJjX2luZm8tPmkyY19mcmVxX21vZGUpOworCX0gZWxzZSBpZiAoYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9PSBJMkNfTUFTVEVSKSB7CisJCWFfY3RybC0+aW9fbWFzdGVyX2luZm8uY2xpZW50LT5hZGRyID0gaTJjX2luZm8tPnNsYXZlX2FkZHI7CisJCUNBTV9EQkcoQ0FNX0FDVFVBVE9SLCAiU2xhdmUgYWRkcjogMHgleCIsIGkyY19pbmZvLT5zbGF2ZV9hZGRyKTsKKwl9IGVsc2UgeworCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIkludmFsaWQgTWFzdGVyIHR5cGU6ICVkIiwKKwkJCWFfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUpOworCQkgcmMgPSAtRUlOVkFMOworCX0KIAogCXJldHVybiByYzsKIH0KQEAgLTQzLDcgKzExOCw2IEBACiB7CiAJc3RydWN0IGkyY19zZXR0aW5nc19saXN0ICppMmNfbGlzdDsKIAlpbnQzMl90IHJjID0gMDsKLQl1aW50MzJfdCBpLCBzaXplOwogCiAJaWYgKGFfY3RybCA9PSBOVUxMIHx8IGkyY19zZXQgPT0gTlVMTCkgewogCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIkludmFsaWQgQXJncyIpOwpAQCAtNTcsMzUgKzEzMSwxNCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpMmNfbGlzdCwKIAkJJihpMmNfc2V0LT5saXN0X2hlYWQpLCBsaXN0KSB7Ci0JCWlmIChpMmNfbGlzdC0+b3BfY29kZSA9PSAgQ0FNX1NFTlNPUl9JMkNfV1JJVEVfUkFORE9NKSB7Ci0JCQlyYyA9IGNhbWVyYV9pb19kZXZfd3JpdGUoJihhX2N0cmwtPmlvX21hc3Rlcl9pbmZvKSwKLQkJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKLQkJCQkJIkZhaWxlZCBpbiBBcHBseWluZyBpMmMgd3J0IHNldHRpbmdzIik7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9IGVsc2UgaWYgKGkyY19saXN0LT5vcF9jb2RlID09IENBTV9TRU5TT1JfSTJDX1BPTEwpIHsKLQkJCXNpemUgPSBpMmNfbGlzdC0+aTJjX3NldHRpbmdzLnNpemU7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJcmMgPSBjYW1lcmFfaW9fZGV2X3BvbGwoCi0JCQkJCSYoYV9jdHJsLT5pb19tYXN0ZXJfaW5mbyksCi0JCQkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCi0JCQkJCQlyZWdfc2V0dGluZ1tpXS5yZWdfYWRkciwKLQkJCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KLQkJCQkJCXJlZ19zZXR0aW5nW2ldLnJlZ19kYXRhLAotCQkJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLgotCQkJCQkJcmVnX3NldHRpbmdbaV0uZGF0YV9tYXNrLAotCQkJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLmFkZHJfdHlwZSwKLQkJCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy5kYXRhX3R5cGUsCi0JCQkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCi0JCQkJCQlyZWdfc2V0dGluZ1tpXS5kZWxheSk7Ci0JCQkJaWYgKHJjIDwgMCkgewotCQkJCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKLQkJCQkJCSJpMmMgcG9sbCBhcHBseSBzZXR0aW5nIEZhaWwiKTsKLQkJCQkJcmV0dXJuIHJjOwotCQkJCX0KLQkJCX0KKwkJcmMgPSBjYW1fYWN0dWF0b3JfaTJjX21vZGVzX3V0aWwoCisJCQkmKGFfY3RybC0+aW9fbWFzdGVyX2luZm8pLAorCQkJaTJjX2xpc3QpOworCQlpZiAocmMgPCAwKSB7CisJCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKKwkJCQkiRmFpbGVkIHRvIGFwcGx5IHNldHRpbmdzOiAlZCIsCisJCQkJcmMpOworCQkJcmV0dXJuIHJjOwogCQl9CiAJfQogCkBAIC0xMTAsNyArMTYzLDcgQEAKIAl9CiAJcmVxdWVzdF9pZCA9IGFwcGx5LT5yZXF1ZXN0X2lkICUgTUFYX1BFUl9GUkFNRV9BUlJBWTsKIAotCXRyYWNlX2NhbV9hcHBseV9yZXEoIkFjdHVhdG9yIiwgYXBwbHkpOworCXRyYWNlX2NhbV9hcHBseV9yZXEoIkFjdHVhdG9yIiwgYXBwbHktPnJlcXVlc3RfaWQpOwogCiAJQ0FNX0RCRyhDQU1fQUNUVUFUT1IsICJSZXF1ZXN0IElkOiAlbGxkIiwgYXBwbHktPnJlcXVlc3RfaWQpOwogCkBAIC0xODUsNiArMjM4LDcgQEAKIAlpbmZvLT5kZXZfaWQgPSBDQU1fUkVRX01HUl9ERVZJQ0VfQUNUVUFUT1I7CiAJc3RybGNweShpbmZvLT5uYW1lLCBDQU1fQUNUVUFUT1JfTkFNRSwgc2l6ZW9mKGluZm8tPm5hbWUpKTsKIAlpbmZvLT5wX2RlbGF5ID0gMDsKKwlpbmZvLT50cmlnZ2VyID0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTgsNiArMzcyLDcgQEAKIAkJYWRkX3JlcS5saW5rX2hkbCA9IGFfY3RybC0+YnJpZGdlX2ludGYubGlua19oZGw7CiAJCWFkZF9yZXEucmVxX2lkID0gY3NsX3BhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQ7CiAJCWFkZF9yZXEuZGV2X2hkbCA9IGFfY3RybC0+YnJpZGdlX2ludGYuZGV2aWNlX2hkbDsKKwkJYWRkX3JlcS5za2lwX2JlZm9yZV9hcHBseWluZyA9IDA7CiAJCWlmIChhX2N0cmwtPmJyaWRnZV9pbnRmLmNybV9jYiAmJgogCQkJYV9jdHJsLT5icmlkZ2VfaW50Zi5jcm1fY2ItPmFkZF9yZXEpCiAJCQlhX2N0cmwtPmJyaWRnZV9pbnRmLmNybV9jYi0+YWRkX3JlcSgmYWRkX3JlcSk7CkBAIC01MDIsNyArNTU3LDcgQEAKIAljYXNlIENBTV9RVUVSWV9DQVA6IHsKIAkJc3RydWN0IGNhbV9hY3R1YXRvcl9xdWVyeV9jYXAgYWN0dWF0b3JfY2FwID0gezB9OwogCi0JCWFjdHVhdG9yX2NhcC5zbG90X2luZm8gPSBhX2N0cmwtPmlkOworCQlhY3R1YXRvcl9jYXAuc2xvdF9pbmZvID0gYV9jdHJsLT5zb2NfaW5mby5pbmRleDsKIAkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgY21kLT5oYW5kbGUsICZhY3R1YXRvcl9jYXAsCiAJCQlzaXplb2Yoc3RydWN0IGNhbV9hY3R1YXRvcl9xdWVyeV9jYXApKSkgewogCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsICJGYWlsZWQgQ29weSB0byBVc2VyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX2Rldi5jCmluZGV4IDdlYmE5ZDEuLjQ1ZGJiYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX2Rldi5jCkBAIC0zNSwxMSArMzUsOTQgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBjYW1fYWN0dWF0b3JfaW5pdF9zdWJkZXZfZG9faW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2FtX2NvbnRyb2wgY21kX2RhdGE7CisJaW50MzJfdCByYyA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZF9kYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCXNpemVvZihjbWRfZGF0YSkpKSB7CisJCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLAorCQkJIkZhaWxlZCB0byBjb3B5IGZyb20gdXNlcl9wdHI9JXBLIHNpemU9JXp1IiwKKwkJCSh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNtZF9kYXRhKSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfQ0FNX0NPTlRST0w6CisJCWNtZCA9IFZJRElPQ19DQU1fQ09OVFJPTDsKKwkJcmMgPSBjYW1fYWN0dWF0b3Jfc3ViZGV2X2lvY3RsKHNkLCBjbWQsICZjbWRfZGF0YSk7CisJCWlmIChyYykgeworCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsCisJCQkJIkZhaWxlZCBpbiBhY3R1YXRvciBzdWJkZXYgaGFuZGxpbmcgcmM6ICVkIiwKKwkJCQlyYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIkludmFsaWQgY29tcGF0IGlvY3RsOiAlZCIsIGNtZCk7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJjKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmY21kX2RhdGEsCisJCQlzaXplb2YoY21kX2RhdGEpKSkgeworCQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsCisJCQkJIkZhaWxlZCB0byBjb3B5IHRvIHVzZXJfcHRyPSVwSyBzaXplPSV6dSIsCisJCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kX2RhdGEpKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBjYW1fYWN0dWF0b3Jfc3ViZGV2X2NvcmVfb3BzID0geworCS5pb2N0bCA9IGNhbV9hY3R1YXRvcl9zdWJkZXZfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwzMiA9IGNhbV9hY3R1YXRvcl9pbml0X3N1YmRldl9kb19pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgY2FtX2FjdHVhdG9yX3N1YmRldl9vcHMgPSB7CisJLmNvcmUgPSAmY2FtX2FjdHVhdG9yX3N1YmRldl9jb3JlX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIGNhbV9hY3R1YXRvcl9pbnRlcm5hbF9vcHM7CisKK3N0YXRpYyBpbnQgY2FtX2FjdHVhdG9yX2luaXRfc3ViZGV2KHN0cnVjdCBjYW1fYWN0dWF0b3JfY3RybF90ICphX2N0cmwpCit7CisJaW50IHJjID0gMDsKKworCWFfY3RybC0+djRsMl9kZXZfc3RyLmludGVybmFsX29wcyA9CisJCSZjYW1fYWN0dWF0b3JfaW50ZXJuYWxfb3BzOworCWFfY3RybC0+djRsMl9kZXZfc3RyLm9wcyA9CisJCSZjYW1fYWN0dWF0b3Jfc3ViZGV2X29wczsKKwlzdHJsY3B5KGFfY3RybC0+ZGV2aWNlX25hbWUsIENBTVhfQUNUVUFUT1JfREVWX05BTUUsCisJCXNpemVvZihhX2N0cmwtPmRldmljZV9uYW1lKSk7CisJYV9jdHJsLT52NGwyX2Rldl9zdHIubmFtZSA9CisJCWFfY3RybC0+ZGV2aWNlX25hbWU7CisJYV9jdHJsLT52NGwyX2Rldl9zdHIuc2RfZmxhZ3MgPQorCQkoVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUgfCBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKTsKKwlhX2N0cmwtPnY0bDJfZGV2X3N0ci5lbnRfZnVuY3Rpb24gPQorCQlDQU1fQUNUVUFUT1JfREVWSUNFX1RZUEU7CisJYV9jdHJsLT52NGwyX2Rldl9zdHIudG9rZW4gPSBhX2N0cmw7CisKKwlyYyA9IGNhbV9yZWdpc3Rlcl9zdWJkZXYoJihhX2N0cmwtPnY0bDJfZGV2X3N0cikpOworCWlmIChyYykKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiRmFpbCB3aXRoIGNhbV9yZWdpc3Rlcl9zdWJkZXYgcmM6ICVkIiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50MzJfdCBjYW1fYWN0dWF0b3JfZHJpdmVyX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQzMl90IHJjID0gMCwgaSA9IDA7CiAJc3RydWN0IGNhbV9hY3R1YXRvcl9jdHJsX3QgKmFfY3RybDsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICpzb2NfaW5mbyA9IE5VTEw7CiAKIAlpZiAoY2xpZW50ID09IE5VTEwgfHwgaWQgPT0gTlVMTCkgewogCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIkludmFsaWQgQXJncyBjbGllbnQ6ICVwSyBpZDogJXBLIiwKQEAgLTYxLDEzICsxNDQsMjkgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGFfY3RybCk7CiAKKwlhX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudCA9IGNsaWVudDsKKwlzb2NfaW5mbyA9ICZhX2N0cmwtPnNvY19pbmZvOworCXNvY19pbmZvLT5kZXYgPSAmY2xpZW50LT5kZXY7CisJc29jX2luZm8tPmRldl9uYW1lID0gY2xpZW50LT5uYW1lOworCWFfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPSBJMkNfTUFTVEVSOworCisJcmMgPSBjYW1fYWN0dWF0b3JfcGFyc2VfZHQoYV9jdHJsLCAmY2xpZW50LT5kZXYpOworCWlmIChyYyA8IDApIHsKKwkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsICJmYWlsZWQ6IGNhbV9zZW5zb3JfcGFyc2VfZHQgcmMgJWQiLCByYyk7CisJCWdvdG8gZnJlZV9jdHJsOworCX0KKworCXJjID0gY2FtX2FjdHVhdG9yX2luaXRfc3ViZGV2KGFfY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGZyZWVfY3RybDsKKwogCWFfY3RybC0+aTJjX2RhdGEucGVyX2ZyYW1lID0KIAkJKHN0cnVjdCBpMmNfc2V0dGluZ3NfYXJyYXkgKikKIAkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19zZXR0aW5nc19hcnJheSkgKgogCQlNQVhfUEVSX0ZSQU1FX0FSUkFZLCBHRlBfS0VSTkVMKTsKIAlpZiAoYV9jdHJsLT5pMmNfZGF0YS5wZXJfZnJhbWUgPT0gTlVMTCkgewogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV9jdHJsOworCQlnb3RvIHVucmVnX3N1YmRldjsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmKGFfY3RybC0+aTJjX2RhdGEuaW5pdF9zZXR0aW5ncy5saXN0X2hlYWQpKTsKQEAgLTc1LDE4ICsxNzQsMjggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFUl9GUkFNRV9BUlJBWTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgmKGFfY3RybC0+aTJjX2RhdGEucGVyX2ZyYW1lW2ldLmxpc3RfaGVhZCkpOwogCi0JLyogSW5pdGlhbGl6ZSBzZW5zb3IgZGV2aWNlIHR5cGUgKi8KLQlhX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlID0gSTJDX01BU1RFUjsKLQotCXJjID0gY2FtX2FjdHVhdG9yX3BhcnNlX2R0KGFfY3RybCwgJmNsaWVudC0+ZGV2KTsKKwlyYyA9IGNhbV9zb2NfdXRpbF9yZXF1ZXN0X3BsYXRmb3JtX3Jlc291cmNlKCZhX2N0cmwtPnNvY19pbmZvLAorCQlOVUxMLCBOVUxMKTsKIAlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLCAiZmFpbGVkOiBjYW1fc2Vuc29yX3BhcnNlX2R0IHJjICVkIiwgcmMpOworCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKKwkJCSJSZXF1ZXN0aW5nIFBsYXRmb3JtIFJlc291cmNlcyBmYWlsZWQgcmMgJWQiLCByYyk7CiAJCWdvdG8gZnJlZV9tZW07CiAJfQogCisJYV9jdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsID0gLTE7CisJYV9jdHJsLT5icmlkZ2VfaW50Zi5vcHMuZ2V0X2Rldl9pbmZvID0KKwkJY2FtX2FjdHVhdG9yX3B1Ymxpc2hfZGV2X2luZm87CisJYV9jdHJsLT5icmlkZ2VfaW50Zi5vcHMubGlua19zZXR1cCA9CisJCWNhbV9hY3R1YXRvcl9lc3RhYmxpc2hfbGluazsKKwlhX2N0cmwtPmJyaWRnZV9pbnRmLm9wcy5hcHBseV9yZXEgPQorCQljYW1fYWN0dWF0b3JfYXBwbHlfcmVxdWVzdDsKKworCXY0bDJfc2V0X3N1YmRldmRhdGEoJihhX2N0cmwtPnY0bDJfZGV2X3N0ci5zZCksIGFfY3RybCk7CiAJcmV0dXJuIHJjOwogZnJlZV9tZW06CiAJa2ZyZWUoYV9jdHJsLT5pMmNfZGF0YS5wZXJfZnJhbWUpOwordW5yZWdfc3ViZGV2OgorCWNhbV91bnJlZ2lzdGVyX3N1YmRldigmKGFfY3RybC0+djRsMl9kZXZfc3RyKSk7CiBmcmVlX2N0cmw6CiAJa2ZyZWUoYV9jdHJsKTsKIAlyZXR1cm4gcmM7CkBAIC0xMjksNjMgKzIzOCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGxvbmcgY2FtX2FjdHVhdG9yX2luaXRfc3ViZGV2X2RvX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGNhbV9jb250cm9sIGNtZF9kYXRhOwotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbWRfZGF0YSwgKHZvaWQgX191c2VyICopYXJnLAotCQlzaXplb2YoY21kX2RhdGEpKSkgewotCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKLQkJCSJGYWlsZWQgdG8gY29weSBmcm9tIHVzZXJfcHRyPSVwSyBzaXplPSV6dVxuIiwKLQkJCSh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNtZF9kYXRhKSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWSURJT0NfQ0FNX0NPTlRST0w6Ci0JCWNtZCA9IFZJRElPQ19DQU1fQ09OVFJPTDsKLQkJcmMgPSBjYW1fYWN0dWF0b3Jfc3ViZGV2X2lvY3RsKHNkLCBjbWQsICZjbWRfZGF0YSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLAotCQkJCSJGYWlsZWQgaW4gYWN0dWF0b3Igc3VkZGV2IGhhbmRsaW5nIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsICJJbnZhbGlkIGNvbXBhdCBpb2N0bDogJWQiLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFyYykgewotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNtZF9kYXRhLAotCQkJc2l6ZW9mKGNtZF9kYXRhKSkpIHsKLQkJCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLAotCQkJCSJGYWlsZWQgdG8gY29weSB0byB1c2VyX3B0cj0lcEsgc2l6ZT0lenVcbiIsCi0JCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kX2RhdGEpKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGNhbV9hY3R1YXRvcl9zdWJkZXZfY29yZV9vcHMgPSB7Ci0JLmlvY3RsID0gY2FtX2FjdHVhdG9yX3N1YmRldl9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bDMyID0gY2FtX2FjdHVhdG9yX2luaXRfc3ViZGV2X2RvX2lvY3RsLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBjYW1fYWN0dWF0b3Jfc3ViZGV2X29wcyA9IHsKLQkuY29yZSA9ICZjYW1fYWN0dWF0b3Jfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgY2FtX2FjdHVhdG9yX2ludGVybmFsX29wczsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2FtX2FjdHVhdG9yX2RyaXZlcl9kdF9tYXRjaFtdID0gewogCXsuY29tcGF0aWJsZSA9ICJxY29tLGFjdHVhdG9yIn0sCiAJe30KQEAgLTIwNiw3ICsyNTgsOCBAQAogCS8qZmlsbCBpbiBwbGF0Zm9ybSBkZXZpY2UqLwogCWFfY3RybC0+djRsMl9kZXZfc3RyLnBkZXYgPSBwZGV2OwogCWFfY3RybC0+c29jX2luZm8ucGRldiA9IHBkZXY7Ci0KKwlhX2N0cmwtPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJYV9jdHJsLT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAJYV9jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9IENDSV9NQVNURVI7CiAKIAlhX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNjaV9jbGllbnQgPSBremFsbG9jKHNpemVvZigKQEAgLTIzMywzNCArMjg2LDE4IEBACiAJfQogCiAJLyogRmlsbCBwbGF0Zm9ybSBkZXZpY2UgaWQqLwotCXBkZXYtPmlkID0gYV9jdHJsLT5pZDsKKwlwZGV2LT5pZCA9IGFfY3RybC0+c29jX2luZm8uaW5kZXg7CiAKLQlhX2N0cmwtPnY0bDJfZGV2X3N0ci5pbnRlcm5hbF9vcHMgPQotCQkmY2FtX2FjdHVhdG9yX2ludGVybmFsX29wczsKLQlhX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPQotCQkmY2FtX2FjdHVhdG9yX3N1YmRldl9vcHM7Ci0Jc3RybGNweShhX2N0cmwtPmRldmljZV9uYW1lLCBDQU1YX0FDVFVBVE9SX0RFVl9OQU1FLAotCQlzaXplb2YoYV9jdHJsLT5kZXZpY2VfbmFtZSkpOwotCWFfY3RybC0+djRsMl9kZXZfc3RyLm5hbWUgPQotCQlhX2N0cmwtPmRldmljZV9uYW1lOwotCWFfY3RybC0+djRsMl9kZXZfc3RyLnNkX2ZsYWdzID0KLQkJKFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFIHwgVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyk7Ci0JYV9jdHJsLT52NGwyX2Rldl9zdHIuZW50X2Z1bmN0aW9uID0KLQkJQ0FNX0FDVFVBVE9SX0RFVklDRV9UWVBFOwotCWFfY3RybC0+djRsMl9kZXZfc3RyLnRva2VuID0gYV9jdHJsOwotCi0JcmMgPSBjYW1fcmVnaXN0ZXJfc3ViZGV2KCYoYV9jdHJsLT52NGwyX2Rldl9zdHIpKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLCAiRmFpbCB3aXRoIGNhbV9yZWdpc3Rlcl9zdWJkZXYiKTsKKwlyYyA9IGNhbV9hY3R1YXRvcl9pbml0X3N1YmRldihhX2N0cmwpOworCWlmIChyYykKIAkJZ290byBmcmVlX21lbTsKLQl9CiAKIAlyYyA9IGNhbV9zb2NfdXRpbF9yZXF1ZXN0X3BsYXRmb3JtX3Jlc291cmNlKCZhX2N0cmwtPnNvY19pbmZvLAogCQkJTlVMTCwgTlVMTCk7CiAJaWYgKHJjIDwgMCkgewogCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwKIAkJCSJSZXF1ZXN0aW5nIFBsYXRmb3JtIFJlc291cmNlcyBmYWlsZWQgcmMgJWQiLCByYyk7Ci0JCWdvdG8gZnJlZV9jdHJsOworCQlnb3RvIHVucmVnX3N1YmRldjsKIAl9CiAKIAlhX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKQEAgLTI3NSw2ICszMTIsOCBAQAogCXY0bDJfc2V0X3N1YmRldmRhdGEoJmFfY3RybC0+djRsMl9kZXZfc3RyLnNkLCBhX2N0cmwpOwogCiAJcmV0dXJuIHJjOwordW5yZWdfc3ViZGV2OgorCWNhbV91bnJlZ2lzdGVyX3N1YmRldigmKGFfY3RybC0+djRsMl9kZXZfc3RyKSk7CiBmcmVlX21lbToKIAlrZnJlZShhX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZSk7CiBmcmVlX2N0cmw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9kZXYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX2Rldi5oCmluZGV4IGZkZjg4MWYzLi5hZDQyYTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9kZXYuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9kZXYuaApAQCAtNzUsNyArNzUsNiBAQAogICogQGNjaV9pMmNfbWFzdGVyOiBJMkMgc3RydWN0dXJlCiAgKiBAaW9fbWFzdGVyX2luZm86IEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21tdW5pY2F0aW9uIG1hc3RlcgogICogQGFjdHVhdG9yX211dGV4OiBBY3R1YXRvciBtdXRleAotICogQGlkOiBDZWxsIEluZGV4CiAgKiBAYWN0X2FwcGx5X3N0YXRlOiBBY3R1YXRvciBzZXR0aW5ncyBhUmVndWxhdG9yIGNvbmZpZwogICogQGdjb25mOiBHUElPIGNvbmZpZwogICogQHBpbmN0cmxfaW5mbzogUGluY3RybCBpbmZvcm1hdGlvbgpAQCAtOTEsNyArOTAsNiBAQAogCXN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyIGlvX21hc3Rlcl9pbmZvOwogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gc29jX2luZm87CiAJc3RydWN0IG11dGV4IGFjdHVhdG9yX211dGV4OwotCXVpbnQzMl90IGlkOwogCWVudW0gbXNtX2FjdHVhdG9yX3N0YXRlX3QgYWN0X2FwcGx5X3N0YXRlOwogCXN0cnVjdCBtc21fY2FtZXJhX2dwaW9fbnVtX2luZm8gKmdwaW9fbnVtX2luZm87CiAJdWludDhfdCBjYW1fcGluY3RybF9zdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2FjdHVhdG9yL2NhbV9hY3R1YXRvcl9zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX3NvYy5jCmluZGV4IGRkYzg5YTguLmY0N2VjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX3NvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fYWN0dWF0b3IvY2FtX2FjdHVhdG9yX3NvYy5jCkBAIC0yNSwxNSArMjUsNiBAQAogCWludDMyX3QgICAgICAgICAgICAgICAgICAgcmMgPSAwOwogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvID0gJmFfY3RybC0+c29jX2luZm87CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKLQotCWlmICghc29jX2luZm8tPnBkZXYpIHsKLQkJQ0FNX0VSUihDQU1fQUNUVUFUT1IsICJzb2NfaW5mbyBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGRldiA9IHNvY19pbmZvLT5wZGV2OwotCW9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCS8qIEluaXRpYWxpemUgbXV0ZXggKi8KIAltdXRleF9pbml0KCYoYV9jdHJsLT5hY3R1YXRvcl9tdXRleCkpOwpAQCAtNDMsMTQgKzM0LDE5IEBACiAJCUNBTV9FUlIoQ0FNX0FDVFVBVE9SLCAicGFyc2luZyBjb21tb24gc29jIGR0KHJjICVkKSIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJjY2ktbWFzdGVyIiwKLQkJJihhX2N0cmwtPmNjaV9pMmNfbWFzdGVyKSk7Ci0JQ0FNX0RCRyhDQU1fQUNUVUFUT1IsICJjY2ktbWFzdGVyICVkLCByYyAlZCIsCi0JCWFfY3RybC0+Y2NpX2kyY19tYXN0ZXIsIHJjKTsKLQlpZiAocmMgPCAwIHx8IGFfY3RybC0+Y2NpX2kyY19tYXN0ZXIgPj0gTUFTVEVSX01BWCkgewotCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIldyb25nIGluZm8gZnJvbSBkdCBDQ0kgbWFzdGVyIGFzIDogJWQiLAotCQkJYV9jdHJsLT5jY2lfaTJjX21hc3Rlcik7Ci0JCXJldHVybiByYzsKKworCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOworCisJaWYgKGFfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPT0gQ0NJX01BU1RFUikgeworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJjY2ktbWFzdGVyIiwKKwkJCSYoYV9jdHJsLT5jY2lfaTJjX21hc3RlcikpOworCQlDQU1fREJHKENBTV9BQ1RVQVRPUiwgImNjaS1tYXN0ZXIgJWQsIHJjICVkIiwKKwkJCWFfY3RybC0+Y2NpX2kyY19tYXN0ZXIsIHJjKTsKKwkJaWYgKChyYyA8IDApIHx8IChhX2N0cmwtPmNjaV9pMmNfbWFzdGVyID49IE1BU1RFUl9NQVgpKSB7CisJCQlDQU1fRVJSKENBTV9BQ1RVQVRPUiwgIldyb25nIGluZm86IGR0IENDSSBtYXN0ZXI6JWQiLAorCQkJCWFfY3RybC0+Y2NpX2kyY19tYXN0ZXIpOworCQkJcmV0dXJuIHJjOworCQl9CiAJfQogCiAJaWYgKCFzb2NfaW5mby0+Z3Bpb19kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NjaS9jYW1fY2NpX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfY29yZS5jCmluZGV4IDk3NWIzMDEuLmM2MmIyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfY29yZS5jCkBAIC00MjQsNyArNDI0LDggQEAKIAltc2cgPSAmY19jdHJsLT5jZmcuY2NpX2kyY193cml0ZV9jZmc7CiAJKnBhY2sgPSAwOwogCi0JaWYgKGNfY3RybC0+Y21kID09IE1TTV9DQ0lfSTJDX1dSSVRFX1NFUSkgeworCWlmIChjX2N0cmwtPmNtZCA9PSBNU01fQ0NJX0kyQ19XUklURV9TRVEgfHwKKwkJY19jdHJsLT5jbWQgPT0gTVNNX0NDSV9JMkNfV1JJVEVfQlVSU1QpIHsKIAkJYWRkcl9sZW4gPSBjYW1fY2NpX2NvbnZlcnRfdHlwZV90b19udW1fYnl0ZXMobXNnLT5hZGRyX3R5cGUpOwogCQlsZW4gPSAoc2l6ZSArIGFkZHJfbGVuKSA8PSAoY2NpX2Rldi0+cGF5bG9hZF9zaXplKSA/CiAJCQkoc2l6ZSArIGFkZHJfbGVuKTpjY2lfZGV2LT5wYXlsb2FkX3NpemU7CkBAIC03MjUsMjQgKzcyNiwyOSBAQAogCQlkbyB7CiAJCQlpZiAoaTJjX21zZy0+ZGF0YV90eXBlID09IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfQllURSkgewogCQkJCWRhdGFbaSsrXSA9IGkyY19jbWQtPnJlZ19kYXRhOwotCQkJCXJlZ19hZGRyKys7CisJCQkJaWYgKGNfY3RybC0+Y21kID09IE1TTV9DQ0lfSTJDX1dSSVRFX1NFUSkKKwkJCQkJcmVnX2FkZHIrKzsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKChpICsgMSkgPD0gY2NpX2Rldi0+cGF5bG9hZF9zaXplKSB7CiAJCQkJCWRhdGFbaSsrXSA9IChpMmNfY21kLT5yZWdfZGF0YSAmCiAJCQkJCQkweEZGMDApID4+IDg7IC8qIE1TQiAqLwogCQkJCQlkYXRhW2krK10gPSBpMmNfY21kLT5yZWdfZGF0YSAmCiAJCQkJCQkweDAwRkY7IC8qIExTQiAqLwotCQkJCQlyZWdfYWRkcisrOworCQkJCQlpZiAoY19jdHJsLT5jbWQgPT0KKwkJCQkJCU1TTV9DQ0lfSTJDX1dSSVRFX1NFUSkKKwkJCQkJCXJlZ19hZGRyKys7CiAJCQkJfSBlbHNlCiAJCQkJCWJyZWFrOwogCQkJfQogCQkJaTJjX2NtZCsrOwogCQkJLS1jbWRfc2l6ZTsKLQkJfSB3aGlsZSAoKChjX2N0cmwtPmNtZCA9PSBNU01fQ0NJX0kyQ19XUklURV9TRVEpIHx8IHBhY2stLSkgJiYKKwkJfSB3aGlsZSAoKChjX2N0cmwtPmNtZCA9PSBNU01fQ0NJX0kyQ19XUklURV9TRVEgfHwKKwkJCWNfY3RybC0+Y21kID09IE1TTV9DQ0lfSTJDX1dSSVRFX0JVUlNUKSB8fCBwYWNrLS0pICYmCiAJCQkJKGNtZF9zaXplID4gMCkgJiYgKGkgPD0gY2NpX2Rldi0+cGF5bG9hZF9zaXplKSk7CiAJCWZyZWVfc2l6ZSA9IGNhbV9jY2lfZ2V0X3F1ZXVlX2ZyZWVfc2l6ZShjY2lfZGV2LCBtYXN0ZXIsCiAJCQkJcXVldWUpOwotCQlpZiAoKGNfY3RybC0+Y21kID09IE1TTV9DQ0lfSTJDX1dSSVRFX1NFUSkgJiYKKwkJaWYgKChjX2N0cmwtPmNtZCA9PSBNU01fQ0NJX0kyQ19XUklURV9TRVEgfHwKKwkJCWNfY3RybC0+Y21kID09IE1TTV9DQ0lfSTJDX1dSSVRFX0JVUlNUKSAmJgogCQkJKChpLTEpID09IE1TTV9DQ0lfV1JJVEVfREFUQV9QQVlMT0FEX1NJWkVfMTEpICYmCiAJCQljY2lfZGV2LT5zdXBwb3J0X3NlcV93cml0ZSAmJiBjbWRfc2l6ZSA+IDAgJiYKIAkJCWZyZWVfc2l6ZSA+IEJVUlNUX01JTl9GUkVFX1NJWkUpIHsKQEAgLTEyMDUsMTAgKzEyMTEsOCBAQAogCXJjID0gY2FtX2NjaV9zb2NfcmVsZWFzZShjY2lfZGV2KTsKIAlpZiAocmMgPCAwKSB7CiAJCUNBTV9FUlIoQ0FNX0NDSSwgIkZhaWxlZCBpbiByZWxlYXNpbmcgdGhlIGNjaTogJWQiLCByYyk7Ci0JCWNhbV9jcGFzX3N0b3AoY2NpX2Rldi0+Y3Bhc19oYW5kbGUpOwogCQlyZXR1cm4gcmM7CiAJfQotCWNhbV9jcGFzX3N0b3AoY2NpX2Rldi0+Y3Bhc19oYW5kbGUpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTI1Myw2ICsxMjU3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBNU01fQ0NJX0kyQ19XUklURToKIAljYXNlIE1TTV9DQ0lfSTJDX1dSSVRFX1NFUToKKwljYXNlIE1TTV9DQ0lfSTJDX1dSSVRFX0JVUlNUOgogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1FVRVVFUzsgaSsrKSB7CiAJCQlpZiAobXV0ZXhfdHJ5bG9jaygmY2NpX21hc3Rlcl9pbmZvLT5tdXRleF9xW2ldKSkgewogCQkJCXJjID0gY2FtX2NjaV9pMmNfd3JpdGUoc2QsIGNfY3RybCwgaSwKQEAgLTEyOTUsNiArMTMwMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgTVNNX0NDSV9JMkNfV1JJVEU6CiAJY2FzZSBNU01fQ0NJX0kyQ19XUklURV9TRVE6CisJY2FzZSBNU01fQ0NJX0kyQ19XUklURV9CVVJTVDoKIAljYXNlIE1TTV9DQ0lfSTJDX1dSSVRFX1NZTkM6CiAJY2FzZSBNU01fQ0NJX0kyQ19XUklURV9BU1lOQzoKIAljYXNlIE1TTV9DQ0lfSTJDX1dSSVRFX1NZTkNfQkxPQ0s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NjaS9jYW1fY2NpX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kvY2FtX2NjaV9kZXYuYwppbmRleCBkYWQwMmJmLi42Y2ZiOTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NjaS9jYW1fY2NpX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfZGV2LmMKQEAgLTMwLDYgKzMwLDExIEBACiB7CiAJaW50MzJfdCByYyA9IDA7CiAKKwlpZiAoYXJnID09IE5VTEwpIHsKKwkJQ0FNX0VSUihDQU1fQ0NJLCAiSW52YWxpZCBBcmdzIik7CisJCXJldHVybiByYzsKKwl9CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVklESU9DX01TTV9DQ0lfQ0ZHOgogCQlyYyA9IGNhbV9jY2lfY29yZV9jZmcoc2QsIGFyZyk7CkBAIC00NCw2ICs0OSwxNCBAQAogCXJldHVybiByYzsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGNhbV9jY2lfc3ViZGV2X2NvbXBhdF9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBjYW1fY2NpX3N1YmRldl9pb2N0bChzZCwgY21kLCBOVUxMKTsKK30KKyNlbmRpZgorCiBpcnFyZXR1cm5fdCBjYW1fY2NpX2lycShpbnQgaXJxX251bSwgdm9pZCAqZGF0YSkKIHsKIAl1aW50MzJfdCBpcnE7CkBAIC0xNjIsNiArMTc1LDkgQEAKIAogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBjY2lfc3ViZGV2X2NvcmVfb3BzID0gewogCS5pb2N0bCA9IGNhbV9jY2lfc3ViZGV2X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsMzIgPSBjYW1fY2NpX3N1YmRldl9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkuaW50ZXJydXB0X3NlcnZpY2Vfcm91dGluZSA9IGNhbV9jY2lfaXJxX3JvdXRpbmUsCiB9OwogCkBAIC0xNzEsNiArMTg3LDM0IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIGNjaV9zdWJkZXZfaW50ZXJuX29wczsKIAorc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBjY2lfdjRsMl9zdWJkZXZfZm9wczsKKworc3RhdGljIGxvbmcgY2FtX2NjaV9zdWJkZXZfZG9faW9jdGwoCisJc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gdmRldl90b192NGwyX3N1YmRldih2ZGV2KTsKKworCXJldHVybiBjYW1fY2NpX3N1YmRldl9pb2N0bChzZCwgY21kLCBOVUxMKTsKK30KKworc3RhdGljIGxvbmcgY2FtX2NjaV9zdWJkZXZfZm9wc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoZmlsZSwgY21kLCBhcmcsIGNhbV9jY2lfc3ViZGV2X2RvX2lvY3RsKTsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGNhbV9jY2lfc3ViZGV2X2ZvcHNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSB2ZGV2X3RvX3Y0bDJfc3ViZGV2KHZkZXYpOworCisJcmV0dXJuIHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIGlvY3RsLCBjbWQsIE5VTEwpOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgY2FtX2NjaV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBjYW1fY3Bhc19yZWdpc3Rlcl9wYXJhbXMgY3Bhc19wYXJtczsKQEAgLTE4OCw2ICsyMzIsOCBAQAogCW5ld19jY2lfZGV2LT52NGwyX2Rldl9zdHIucGRldiA9IHBkZXY7CiAKIAlzb2NfaW5mby0+cGRldiA9IHBkZXY7CisJc29jX2luZm8tPmRldiA9ICZwZGV2LT5kZXY7CisJc29jX2luZm8tPmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAogCXJjID0gY2FtX2NjaV9wYXJzZV9kdF9pbmZvKHBkZXYsIG5ld19jY2lfZGV2KTsKIAlpZiAocmMgPCAwKSB7CkBAIC0yMjAsNiArMjY2LDEzIEBACiAJdjRsMl9zZXRfc3ViZGV2ZGF0YSgmbmV3X2NjaV9kZXYtPnY0bDJfZGV2X3N0ci5zZCwgbmV3X2NjaV9kZXYpOwogCWdfY2NpX3N1YmRldiA9ICZuZXdfY2NpX2Rldi0+djRsMl9kZXZfc3RyLnNkOwogCisJY2FtX3JlZ2lzdGVyX3N1YmRldl9mb3BzKCZjY2lfdjRsMl9zdWJkZXZfZm9wcyk7CisJY2NpX3Y0bDJfc3ViZGV2X2ZvcHMudW5sb2NrZWRfaW9jdGwgPSBjYW1fY2NpX3N1YmRldl9mb3BzX2lvY3RsOworI2lmZGVmIENPTkZJR19DT01QQVQKKwljY2lfdjRsMl9zdWJkZXZfZm9wcy5jb21wYXRfaW9jdGwzMiA9CisJCWNhbV9jY2lfc3ViZGV2X2ZvcHNfY29tcGF0X2lvY3RsOworI2VuZGlmCisKIAljcGFzX3Bhcm1zLmNhbV9jcGFzX2NsaWVudF9jYiA9IE5VTEw7CiAJY3Bhc19wYXJtcy5jZWxsX2luZGV4ID0gMDsKIAljcGFzX3Bhcm1zLmRldiA9ICZwZGV2LT5kZXY7CkBAIC0yNjksNiArMzIyLDI2IEBACiAJfSwKIH07CiAKK3N0YXRpYyBpbnQgY2FtX2NjaV9hc3NpZ25fZm9wcyh2b2lkKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwlzZCA9IGdfY2NpX3N1YmRldjsKKwlpZiAoIXNkIHx8ICEoc2QtPmRldm5vZGUpKSB7CisJCUNBTV9FUlIoQ0FNX0NSTSwKKwkJCSJJbnZhbGlkIGFyZ3Mgc2Qgbm9kZTogJXBLIiwgc2QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2QtPmRldm5vZGUtPmZvcHMgPSAmY2NpX3Y0bDJfc3ViZGV2X2ZvcHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY2FtX2NjaV9sYXRlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY2FtX2NjaV9hc3NpZ25fZm9wcygpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBjYW1fY2NpX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2NpX2RyaXZlcik7CkBAIC0yODAsNiArMzUzLDcgQEAKIH0KIAogbW9kdWxlX2luaXQoY2FtX2NjaV9pbml0X21vZHVsZSk7CitsYXRlX2luaXRjYWxsKGNhbV9jY2lfbGF0ZV9pbml0KTsKIG1vZHVsZV9leGl0KGNhbV9jY2lfZXhpdF9tb2R1bGUpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gQ0NJIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kvY2FtX2NjaV9kZXYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfZGV2LmgKaW5kZXggY2IwMWM2Yy4uNGM5OTZlMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfZGV2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kvY2FtX2NjaV9kZXYuaApAQCAtOTUsNiArOTUsNyBAQAogCU1TTV9DQ0lfSTJDX1JFQUQsCiAJTVNNX0NDSV9JMkNfV1JJVEUsCiAJTVNNX0NDSV9JMkNfV1JJVEVfU0VRLAorCU1TTV9DQ0lfSTJDX1dSSVRFX0JVUlNULAogCU1TTV9DQ0lfSTJDX1dSSVRFX0FTWU5DLAogCU1TTV9DQ0lfR1BJT19XUklURSwKIAlNU01fQ0NJX0kyQ19XUklURV9TWU5DLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kvY2FtX2NjaV9zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfc29jLmMKaW5kZXggODNjYjQ5ZTMuLjhkZTQ0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY2NpL2NhbV9jY2lfc29jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kvY2FtX2NjaV9zb2MuYwpAQCAtMzkyLDUgKzM5Miw3IEBACiAJY2NpX2Rldi0+Y3ljbGVzX3Blcl91cyA9IDA7CiAJc29jX2luZm8tPnNyY19jbGtfaWR4ID0gMDsKIAorCWNhbV9jcGFzX3N0b3AoY2NpX2Rldi0+Y3Bhc19oYW5kbGUpOworCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jc2lwaHkvY2FtX2NzaXBoeV9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2NvcmUuYwppbmRleCBmY2Y3NmM4Li41N2Q1NzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2NvcmUuYwpAQCAtMTQsOCArMTQsMzQgQEAKICNpbmNsdWRlICJjYW1fY3NpcGh5X2NvcmUuaCIKICNpbmNsdWRlICJjYW1fY3NpcGh5X2Rldi5oIgogI2luY2x1ZGUgImNhbV9jc2lwaHlfc29jLmgiCisKKyNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KICNpbmNsdWRlIDxjYW1fbWVtX21nci5oPgogCisjZGVmaW5lIFNDTV9TVkNfQ0FNRVJBU1MgMHgxOAorI2RlZmluZSBTRUNVUkVfU1lTQ0FMTF9JRCAweDYKKworc3RhdGljIGludCBjc2lwaHlfZHVtcDsKK21vZHVsZV9wYXJhbShjc2lwaHlfZHVtcCwgaW50LCAwNjQ0KTsKKworc3RhdGljIGludCBjYW1fY3NpcGh5X25vdGlmeV9zZWN1cmVfbW9kZShpbnQgcGh5LCBib29sIHByb3RlY3QpCit7CisJc3RydWN0IHNjbV9kZXNjIGRlc2MgPSB7MH07CisKKwlkZXNjLmFyZ2luZm8gPSBTQ01fQVJHUygyLCBTQ01fVkFMLCBTQ01fVkFMKTsKKwlkZXNjLmFyZ3NbMF0gPSBwcm90ZWN0OworCWRlc2MuYXJnc1sxXSA9IHBoeTsKKworCUNBTV9EQkcoQ0FNX0NTSVBIWSwgInBoeSA6ICVkLCBwcm90ZWN0IDogJWQiLCBwaHksIHByb3RlY3QpOworCWlmIChzY21fY2FsbDIoU0NNX1NJUF9GTklEKFNDTV9TVkNfQ0FNRVJBU1MsIFNFQ1VSRV9TWVNDQUxMX0lEKSwKKwkJJmRlc2MpKSB7CisJCUNBTV9FUlIoQ0FNX0NTSVBIWSwgInNjbSBjYWxsIHRvIGh5cGVydmlzb3IgZmFpbGVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiB2b2lkIGNhbV9jc2lwaHlfcXVlcnlfY2FwKHN0cnVjdCBjc2lwaHlfZGV2aWNlICpjc2lwaHlfZGV2LAogCXN0cnVjdCBjYW1fY3NpcGh5X3F1ZXJ5X2NhcCAqY3NpcGh5X2NhcCkKIHsKQEAgLTY3LDE3ICs5MywxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQljc2lwaHlfZGV2LT5jc2lwaHlfaW5mbyA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fY3NpcGh5X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXJjID0gY2FtX21lbV9nZXRfY3B1X2J1ZigoaW50MzJfdCkgY2ZnX2Rldi0+cGFja2V0X2hhbmRsZSwKIAkJKHVpbnQ2NF90ICopJmdlbmVyaWNfcHRyLCAmbGVuKTsKIAlpZiAocmMgPCAwKSB7CiAJCUNBTV9FUlIoQ0FNX0NTSVBIWSwgIkZhaWxlZCB0byBnZXQgcGFja2V0IE1lbSBhZGRyZXNzOiAlZCIsIHJjKTsKLQkJa2ZyZWUoY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8pOwotCQljc2lwaHlfZGV2LT5jc2lwaHlfaW5mbyA9IE5VTEw7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTg1LDggKzEwNCw2IEBACiAJCUNBTV9FUlIoQ0FNX0NTSVBIWSwKIAkJCSJvZmZzZXQgaXMgb3V0IG9mIGJvdW5kczogb2Zmc2V0OiAlbGxkIGxlbjogJXp1IiwKIAkJCWNmZ19kZXYtPm9mZnNldCwgbGVuKTsKLQkJa2ZyZWUoY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8pOwotCQljc2lwaHlfZGV2LT5jc2lwaHlfaW5mbyA9IE5VTEw7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTAxLDggKzExOCw2IEBACiAJaWYgKHJjIDwgMCkgewogCQlDQU1fRVJSKENBTV9DU0lQSFksCiAJCQkiRmFpbGVkIHRvIGdldCBjbWQgYnVmIE1lbSBhZGRyZXNzIDogJWQiLCByYyk7Ci0JCWtmcmVlKGNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvKTsKLQkJY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8gPSBOVUxMOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0xMTAsMTMgKzEyNSwyNiBAQAogCWNtZF9idWYgKz0gY21kX2Rlc2MtPm9mZnNldCAvIDQ7CiAJY2FtX2NtZF9jc2lwaHlfaW5mbyA9IChzdHJ1Y3QgY2FtX2NzaXBoeV9pbmZvICopY21kX2J1ZjsKIAotCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5sYW5lX2NudCA9IGNhbV9jbWRfY3NpcGh5X2luZm8tPmxhbmVfY250OwotCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5sYW5lX21hc2sgPSBjYW1fY21kX2NzaXBoeV9pbmZvLT5sYW5lX21hc2s7Ci0JY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8tPmNzaXBoeV8zcGhhc2UgPQorCWNzaXBoeV9kZXYtPmNvbmZpZ19jb3VudCsrOworCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLmxhbmVfY250ICs9IGNhbV9jbWRfY3NpcGh5X2luZm8tPmxhbmVfY250OworCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLmxhbmVfbWFzayB8PSBjYW1fY21kX2NzaXBoeV9pbmZvLT5sYW5lX21hc2s7CisJY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8uY3NpcGh5XzNwaGFzZSA9CiAJCWNhbV9jbWRfY3NpcGh5X2luZm8tPmNzaXBoeV8zcGhhc2U7Ci0JY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8tPmNvbWJvX21vZGUgPSBjYW1fY21kX2NzaXBoeV9pbmZvLT5jb21ib19tb2RlOwotCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5zZXR0bGVfdGltZSA9IGNhbV9jbWRfY3NpcGh5X2luZm8tPnNldHRsZV90aW1lOwotCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5kYXRhX3JhdGUgPSBjYW1fY21kX2NzaXBoeV9pbmZvLT5kYXRhX3JhdGU7CisJY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8uY29tYm9fbW9kZSB8PSBjYW1fY21kX2NzaXBoeV9pbmZvLT5jb21ib19tb2RlOworCWlmIChjYW1fY21kX2NzaXBoeV9pbmZvLT5jb21ib19tb2RlID09IDEpCisJCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLnNldHRsZV90aW1lX2NvbWJvX3NlbnNvciA9CisJCQljYW1fY21kX2NzaXBoeV9pbmZvLT5zZXR0bGVfdGltZTsKKwllbHNlCisJCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLnNldHRsZV90aW1lID0KKwkJCWNhbV9jbWRfY3NpcGh5X2luZm8tPnNldHRsZV90aW1lOworCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLmRhdGFfcmF0ZSA9IGNhbV9jbWRfY3NpcGh5X2luZm8tPmRhdGFfcmF0ZTsKKwljc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5zZWN1cmVfbW9kZSA9IGNhbV9jbWRfY3NpcGh5X2luZm8tPnNlY3VyZV9tb2RlOworCisJaWYgKGNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLnNlY3VyZV9tb2RlICYmCisJCShjc2lwaHlfZGV2LT5jb25maWdfY291bnQgPT0gMSkpCisJCXJjID0gY2FtX2NzaXBoeV9ub3RpZnlfc2VjdXJlX21vZGUoCisJCQljc2lwaHlfZGV2LT5zb2NfaW5mby5pbmRleCwKKwkJCUNBTV9TRUNVUkVfTU9ERV9TRUNVUkUpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjAyLDE0ICsyMzAsOCBAQAogCXZvaWQgX19pb21lbSAqY3NpcGh5YmFzZTsKIAlzdHJ1Y3QgY3NpcGh5X3JlZ190ICgqcmVnX2FycmF5KVtNQVhfU0VUVElOR1NfUEVSX0xBTkVdOwogCi0JaWYgKGNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvID09IE5VTEwpIHsKLQkJQ0FNX0VSUihDQU1fQ1NJUEhZLCAiY3NpcGh5X2luZm8gaXMgTlVMTCwgTm8vRmFpbCBDT05GSUdfREVWPyIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlsYW5lX2NudCA9IGNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5sYW5lX2NudDsKLQlsYW5lX21hc2sgPSBjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby0+bGFuZV9tYXNrICYgMHgxZjsKLQlzZXR0bGVfY250ID0gKGNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5zZXR0bGVfdGltZSAvIDIwMDAwMDAwMCk7CisJbGFuZV9jbnQgPSBjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5sYW5lX2NudDsKKwlsYW5lX21hc2sgPSBjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5sYW5lX21hc2sgJiAweDFmOwogCWNzaXBoeWJhc2UgPSBjc2lwaHlfZGV2LT5zb2NfaW5mby5yZWdfbWFwWzBdLm1lbV9iYXNlOwogCiAJaWYgKCFjc2lwaHliYXNlKSB7CkBAIC0yMjgsOCArMjUwLDggQEAKIAkJbWFzayA8PD0gMTsKIAl9CiAKLQlpZiAoIWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLT5jc2lwaHlfM3BoYXNlKSB7Ci0JCWlmIChjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby0+Y29tYm9fbW9kZSA9PSAxKQorCWlmICghY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8uY3NpcGh5XzNwaGFzZSkgeworCQlpZiAoY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8uY29tYm9fbW9kZSA9PSAxKQogCQkJcmVnX2FycmF5ID0KIAkJCQljc2lwaHlfZGV2LT5jdHJsX3JlZy0+Y3NpcGh5XzJwaF9jb21ib19tb2RlX3JlZzsKIAkJZWxzZQpAQCAtMjM5LDcgKzI2MSw3IEBACiAJCWNmZ19zaXplID0gY3NpcGh5X2Rldi0+Y3RybF9yZWctPmNzaXBoeV9yZWcuCiAJCQljc2lwaHlfMnBoX2NvbmZpZ19hcnJheV9zaXplOwogCX0gZWxzZSB7Ci0JCWlmIChjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby0+Y29tYm9fbW9kZSA9PSAxKQorCQlpZiAoY3NpcGh5X2Rldi0+Y3NpcGh5X2luZm8uY29tYm9fbW9kZSA9PSAxKQogCQkJcmVnX2FycmF5ID0KIAkJCQljc2lwaHlfZGV2LT5jdHJsX3JlZy0+Y3NpcGh5XzJwaF8zcGhfbW9kZV9yZWc7CiAJCWVsc2UKQEAgLTI4MCw2ICszMDIsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJc2V0dGxlX2NudCA9IChjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5zZXR0bGVfdGltZSAvIDIwMDAwMDAwMCk7CisJCWlmIChjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5jb21ib19tb2RlID09IDEgJiYKKwkJCShsYW5lX3BvcyA+PSAzKSkKKwkJCXNldHRsZV9jbnQgPQorCQkJCShjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby4KKwkJCQlzZXR0bGVfdGltZV9jb21ib19zZW5zb3IgLyAyMDAwMDAwMDApOwogCQlmb3IgKGkgPSAwOyBpIDwgY2ZnX3NpemU7IGkrKykgewogCQkJc3dpdGNoIChyZWdfYXJyYXlbbGFuZV9wb3NdW2ldLmNzaXBoeV9wYXJhbV90eXBlKSB7CiAJCQljYXNlIENTSVBIWV9MQU5FX0VOQUJMRToKQEAgLTM1MCw2ICszNzgsMTQgQEAKIAogCQljc2lwaHlfYWNxX3BhcmFtcy5jb21ib19tb2RlID0gMDsKIAorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNzaXBoeV9hY3FfcGFyYW1zLAorCQkJKHZvaWQgX191c2VyICopY3NpcGh5X2FjcV9kZXYuaW5mb19oYW5kbGUsCisJCQlzaXplb2YoY3NpcGh5X2FjcV9wYXJhbXMpKSkgeworCQkJQ0FNX0VSUihDQU1fQ1NJUEhZLAorCQkJCSJGYWlsZWQgY29weWluZyBmcm9tIFVzZXIiKTsKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwkJfQorCiAJCWlmIChjc2lwaHlfZGV2LT5hY3F1aXJlX2NvdW50ID09IDIpIHsKIAkJCUNBTV9FUlIoQ0FNX0NTSVBIWSwKIAkJCQkJIkNTSVBIWSBkZXZpY2UgZG8gbm90IGFsbG93IG1vcmUgdGhhbiAyIGFjcXVpcmVzIik7CkBAIC0zNTcsNiArMzkzLDI3IEBACiAJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CiAJCX0KIAorCQlpZiAoKGNzaXBoeV9hY3FfcGFyYW1zLmNvbWJvX21vZGUgPT0gMSkgJiYKKwkJCShjc2lwaHlfZGV2LT5pc19hY3F1aXJlZF9kZXZfY29tYm9fbW9kZSA9PSAxKSkgeworCQkJQ0FNX0VSUihDQU1fQ1NJUEhZLAorCQkJCSJNdWx0aXBsZSBDb21ibyBBY3EgYXJlIG5vdCBhbGxvd2VkOiBjbTogJWQsIGFjbTogJWQiLAorCQkJCWNzaXBoeV9hY3FfcGFyYW1zLmNvbWJvX21vZGUsCisJCQkJY3NpcGh5X2Rldi0+aXNfYWNxdWlyZWRfZGV2X2NvbWJvX21vZGUpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisKKwkJaWYgKChjc2lwaHlfYWNxX3BhcmFtcy5jb21ib19tb2RlICE9IDEpICYmCisJCQkoY3NpcGh5X2Rldi0+aXNfYWNxdWlyZWRfZGV2X2NvbWJvX21vZGUgIT0gMSkgJiYKKwkJCShjc2lwaHlfZGV2LT5hY3F1aXJlX2NvdW50ID09IDEpKSB7CisJCQlDQU1fRVJSKENBTV9DU0lQSFksCisJCQkJIk11bHRpcGxlIEFjcXVpcmVzIGFyZSBub3QgYWxsb3dlZCBjbTogJWQgYWNtOiAlZCIsCisJCQkJY3NpcGh5X2FjcV9wYXJhbXMuY29tYm9fbW9kZSwKKwkJCQljc2lwaHlfZGV2LT5pc19hY3F1aXJlZF9kZXZfY29tYm9fbW9kZSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CisJCX0KKwogCQlicmlkZ2VfcGFyYW1zLm9wcyA9IE5VTEw7CiAJCWJyaWRnZV9wYXJhbXMuc2Vzc2lvbl9oZGwgPSBjc2lwaHlfYWNxX2Rldi5zZXNzaW9uX2hhbmRsZTsKIAkJYnJpZGdlX3BhcmFtcy52NGwyX3N1Yl9kZXZfZmxhZyA9IDA7CkBAIC0zODEsNyArNDM4LDkgQEAKIAkJfQogCQlpZiAoY3NpcGh5X2FjcV9wYXJhbXMuY29tYm9fbW9kZSA9PSAxKQogCQkJY3NpcGh5X2Rldi0+aXNfYWNxdWlyZWRfZGV2X2NvbWJvX21vZGUgPSAxOworCiAJCWNzaXBoeV9kZXYtPmFjcXVpcmVfY291bnQrKzsKKwkJY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlID0gQ0FNX0NTSVBIWV9BQ1FVSVJFOwogCX0KIAkJYnJlYWs7CiAJY2FzZSBDQU1fUVVFUllfQ0FQOiB7CkBAIC0zOTcsNiArNDU2LDE5IEBACiAJfQogCQlicmVhazsKIAljYXNlIENBTV9TVE9QX0RFVjogeworCQlpZiAoY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlICE9CisJCQlDQU1fQ1NJUEhZX1NUQVJUKSB7CisJCQlDQU1fRVJSKENBTV9DU0lQSFksICJOb3QgaW4gcmlnaHQgc3RhdGUgdG8gc3RvcCA6ICVkIiwKKwkJCQljc2lwaHlfZGV2LT5jc2lwaHlfc3RhdGUpOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisKKwkJaWYgKC0tY3NpcGh5X2Rldi0+c3RhcnRfZGV2X2NvdW50KSB7CisJCQlDQU1fREJHKENBTV9DU0lQSFksICJTdG9wIERldiByZWYgQ250OiAlZCIsCisJCQkJY3NpcGh5X2Rldi0+c3RhcnRfZGV2X2NvdW50KTsKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwkJfQorCiAJCXJjID0gY2FtX2NzaXBoeV9kaXNhYmxlX2h3KGNzaXBoeV9kZXYpOwogCQlpZiAocmMgPCAwKSB7CiAJCQlDQU1fRVJSKENBTV9DU0lQSFksICJGYWlsZWQgaW4gY3NpcGh5IHJlbGVhc2UiKTsKQEAgLTQwOCw2ICs0ODAsOCBAQAogCQkJQ0FNX0VSUihDQU1fQ1NJUEhZLCAiZGUtdm90aW5nIENQQVM6ICVkIiwgcmMpOwogCQkJZ290byByZWxlYXNlX211dGV4OwogCQl9CisJCWNzaXBoeV9kZXYtPmNzaXBoeV9pbmZvLmNvbWJvX21vZGUgPSAwOworCQljc2lwaHlfZGV2LT5jc2lwaHlfc3RhdGUgPSBDQU1fQ1NJUEhZX1NUT1A7CiAJfQogCQlicmVhazsKIAljYXNlIENBTV9SRUxFQVNFX0RFVjogewpAQCAtNDM4LDggKzUxMiwyMiBAQAogCQkJY3NpcGh5X2Rldi0+YnJpZGdlX2ludGYubGlua19oZGxbMV0gPSAtMTsKIAkJCWNzaXBoeV9kZXYtPmJyaWRnZV9pbnRmLgogCQkJCXNlc3Npb25faGRsWzFdID0gLTE7CisJCQljc2lwaHlfZGV2LT5pc19hY3F1aXJlZF9kZXZfY29tYm9fbW9kZSA9IDA7CiAJCX0KKworCQljc2lwaHlfZGV2LT5jb25maWdfY291bnQtLTsKIAkJY3NpcGh5X2Rldi0+YWNxdWlyZV9jb3VudC0tOworCQlpZiAoY3NpcGh5X2Rldi0+YWNxdWlyZV9jb3VudCA9PSAwKQorCQkJY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlID0gQ0FNX0NTSVBIWV9SRUxFQVNFOworCisJCWlmIChjc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5zZWN1cmVfbW9kZSAmJgorCQkJKCFjc2lwaHlfZGV2LT5jb25maWdfY291bnQpKSB7CisJCQljc2lwaHlfZGV2LT5jc2lwaHlfaW5mby5zZWN1cmVfbW9kZSA9CisJCQkJQ0FNX1NFQ1VSRV9NT0RFX05PTl9TRUNVUkU7CisJCQlyYyA9IGNhbV9jc2lwaHlfbm90aWZ5X3NlY3VyZV9tb2RlKAorCQkJCWNzaXBoeV9kZXYtPnNvY19pbmZvLmluZGV4LAorCQkJCUNBTV9TRUNVUkVfTU9ERV9OT05fU0VDVVJFKTsKKwkJfQogCX0KIAkJYnJlYWs7CiAJY2FzZSBDQU1fQ09ORklHX0RFVjogewpAQCAtNDYxLDYgKzU0OSwxMSBAQAogCQlzdHJ1Y3QgY2FtX2FoYl92b3RlIGFoYl92b3RlOwogCQlzdHJ1Y3QgY2FtX2F4aV92b3RlIGF4aV92b3RlOwogCisJCWNzaXBoeV9kZXYtPnN0YXJ0X2Rldl9jb3VudCsrOworCisJCWlmIChjc2lwaHlfZGV2LT5jc2lwaHlfc3RhdGUgPT0gQ0FNX0NTSVBIWV9TVEFSVCkKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwogCQlhaGJfdm90ZS50eXBlID0gQ0FNX1ZPVEVfQUJTT0xVVEU7CiAJCWFoYl92b3RlLnZvdGUubGV2ZWwgPSBDQU1fU1ZTX1ZPVEU7CiAJCWF4aV92b3RlLmNvbXByZXNzZWRfYncgPSBDQU1fQ1BBU19ERUZBVUxUX0FYSV9CVzsKQEAgLTQ4MCwxMSArNTczLDE1IEBACiAJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CiAJCX0KIAkJcmMgPSBjYW1fY3NpcGh5X2NvbmZpZ19kZXYoY3NpcGh5X2Rldik7CisJCWlmIChjc2lwaHlfZHVtcCA9PSAxKQorCQkJY2FtX2NzaXBoeV9tZW1fZG1wKCZjc2lwaHlfZGV2LT5zb2NfaW5mbyk7CisKIAkJaWYgKHJjIDwgMCkgewogCQkJQ0FNX0VSUihDQU1fQ1NJUEhZLCAiY2FtX2NzaXBoeV9jb25maWdfZGV2IGZhaWxlZCIpOwogCQkJY2FtX2NwYXNfc3RvcChjc2lwaHlfZGV2LT5jcGFzX2hhbmRsZSk7CiAJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CiAJCX0KKwkJY3NpcGh5X2Rldi0+Y3NpcGh5X3N0YXRlID0gQ0FNX0NTSVBIWV9TVEFSVDsKIAl9CiAJCWJyZWFrOwogCWNhc2UgQ0FNX1NEX1NIVVRET1dOOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jc2lwaHkvY2FtX2NzaXBoeV9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY3NpcGh5L2NhbV9jc2lwaHlfZGV2LmMKaW5kZXggMWM5M2ExYS4uYTEzNmZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jc2lwaHkvY2FtX2NzaXBoeV9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2Rldi5jCkBAIC0xMTMsNyArMTEzLDggQEAKIAluZXdfY3NpcGh5X2Rldi0+djRsMl9kZXZfc3RyLnBkZXYgPSBwZGV2OwogCiAJbmV3X2NzaXBoeV9kZXYtPnNvY19pbmZvLnBkZXYgPSBwZGV2OwotCisJbmV3X2NzaXBoeV9kZXYtPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJbmV3X2NzaXBoeV9kZXYtPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAluZXdfY3NpcGh5X2Rldi0+cmVmX2NvdW50ID0gMDsKIAogCXJjID0gY2FtX2NzaXBoeV9wYXJzZV9kdF9pbmZvKHBkZXYsIG5ld19jc2lwaHlfZGV2KTsKQEAgLTE1Niw2ICsxNTcsNyBAQAogCQlOVUxMOwogCiAJbmV3X2NzaXBoeV9kZXYtPmFjcXVpcmVfY291bnQgPSAwOworCW5ld19jc2lwaHlfZGV2LT5zdGFydF9kZXZfY291bnQgPSAwOwogCW5ld19jc2lwaHlfZGV2LT5pc19hY3F1aXJlZF9kZXZfY29tYm9fbW9kZSA9IDA7CiAKIAljcGFzX3Bhcm1zLmNhbV9jcGFzX2NsaWVudF9jYiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2Rldi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jc2lwaHkvY2FtX2NzaXBoeV9kZXYuaAppbmRleCA4ZWQ1YmE0Li4yNTg5MWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X2Rldi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY3NpcGh5L2NhbV9jc2lwaHlfZGV2LmgKQEAgLTY3LDYgKzY3LDEzIEBACiAjZGVmaW5lIENEQkcoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZyhmbXQsICMjYXJncykKICNlbmRpZgogCitlbnVtIGNhbV9jc2lwaHlfc3RhdGUgeworCUNBTV9DU0lQSFlfQUNRVUlSRSwKKwlDQU1fQ1NJUEhZX1JFTEVBU0UsCisJQ0FNX0NTSVBIWV9TVEFSVCwKKwlDQU1fQ1NJUEhZX1NUT1AsCit9OworCiAvKioKICAqIHN0cnVjdCBjc2lwaHlfcmVnX3Bhcm1zX3QKICAqIEBtaXBpX2NzaXBoeV9nbGJsX2lycV9jbWRfYWRkcjogQ1NJUGh5IGlycSBhZGRyCkBAIC0xNTAsNiArMTU3LDMyIEBACiB9OwogCiAvKioKKyAqIGNhbV9jc2lwaHlfcGFyYW06IFByb3ZpZGVzIGNtZGJ1ZmZlciBzdHJ1Y3RyZQorICogQGxhbmVfbWFzayAgICAgOiAgTGFuZSBtYXNrIGRldGFpbHMKKyAqIEBsYW5lX2Fzc2lnbiAgIDogIExhbmUgc2Vuc29yIHdpbGwgYmUgdXNpbmcKKyAqIEBjc2lwaHlfM3BoYXNlIDogIE1lbnRpb25zIERQSFkgb3IgQ1BIWQorICogQGNvbWJvX21vZGUgICAgOiAgSW5mbyByZWdhcmRpbmcgY29tYm9fbW9kZSBpcyBlbmFibGUgLyBkaXNhYmxlCisgKiBAbGFuZV9jbnQgICAgICA6ICBUb3RhbCBudW1iZXIgb2YgbGFuZXMKKyAqIEByZXNlcnZlZAorICogQDNwaGFzZSAgICAgICAgOiAgRGV0YWlscyB3aGV0aGVyIDNQaGFzZSAvIDJQaGFzZSBvcGVyYXRpb24KKyAqIEBzZXR0bGVfdGltZSAgIDogIFNldHRsaW5nIHRpbWUgaW4gbXMKKyAqIEBzZXR0bGVfdGltZV9jb21ib19zZW5zb3IgICA6ICBTZXR0bGluZyB0aW1lIGluIG1zCisgKiBAZGF0YV9yYXRlICAgICA6ICBEYXRhIHJhdGUgaW4gbWJwcworICoKKyAqLworc3RydWN0IGNhbV9jc2lwaHlfcGFyYW0geworCXVpbnQxNl90ICAgIGxhbmVfbWFzazsKKwl1aW50MTZfdCAgICBsYW5lX2Fzc2lnbjsKKwl1aW50OF90ICAgICBjc2lwaHlfM3BoYXNlOworCXVpbnQ4X3QgICAgIGNvbWJvX21vZGU7CisJdWludDhfdCAgICAgbGFuZV9jbnQ7CisJdWludDhfdCAgICAgc2VjdXJlX21vZGU7CisJdWludDY0X3QgICAgc2V0dGxlX3RpbWU7CisJdWludDY0X3QgICAgc2V0dGxlX3RpbWVfY29tYm9fc2Vuc29yOworCXVpbnQ2NF90ICAgIGRhdGFfcmF0ZTsKK307CisKKy8qKgogICogc3RydWN0IGNzaXBoeV9kZXZpY2UKICAqIEBwZGV2OiBQbGF0Zm9ybSBkZXZpY2UKICAqIEBpcnE6IEludGVycnVwdCBzdHJ1Y3R1cmUKQEAgLTE3MSw2ICsyMDQsNyBAQAogICogQHJlZl9jb3VudDogUmVmZXJlbmNlIGNvdW50CiAgKiBAY2xrX2xhbmU6IENsb2NrIGxhbmUKICAqIEBhY3F1aXJlX2NvdW50OiBBY3F1aXJlIGRldmljZSBjb3VudAorICogQHN0YXJ0X2Rldl9jb3VudDogU3RhcnQgY291bnQKICAqIEBpc19hY3F1aXJlZF9kZXZfY29tYm9fbW9kZToKICAqICAgIEZsYWcgdGhhdCBtZW50aW9ucyB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQKICAqICAgZGV2aWNlIGlzIGZvciBjb21ibyBtb2RlCkBAIC0xNzgsNyArMjEyLDcgQEAKIHN0cnVjdCBjc2lwaHlfZGV2aWNlIHsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJdWludDMyX3QgaHdfdmVyc2lvbjsKLQl1aW50MzJfdCBjc2lwaHlfc3RhdGU7CisJZW51bSBjYW1fY3NpcGh5X3N0YXRlIGNzaXBoeV9zdGF0ZTsKIAlzdHJ1Y3QgY3NpcGh5X2N0cmxfdCAqY3RybF9yZWc7CiAJdWludDMyX3QgY3NpcGh5X21heF9jbGs7CiAJc3RydWN0IG1zbV9jYW1fY2xrX2luZm8gY3NpcGh5XzNwX2Nsa19pbmZvWzJdOwpAQCAtMTkwLDE0ICsyMjQsMTYgQEAKIAl1aW50OF90IGlzX2NzaXBoeV8zcGhhc2VfaHc7CiAJdWludDhfdCBudW1faXJxX3JlZ2lzdGVyczsKIAlzdHJ1Y3QgY2FtX3N1YmRldiB2NGwyX2Rldl9zdHI7Ci0Jc3RydWN0IGNhbV9jc2lwaHlfaW5mbyAqY3NpcGh5X2luZm87CisJc3RydWN0IGNhbV9jc2lwaHlfcGFyYW0gY3NpcGh5X2luZm87CiAJc3RydWN0IGludGZfcGFyYW1zIGJyaWRnZV9pbnRmOwogCXVpbnQzMl90IGNsa19sYW5lOwogCXVpbnQzMl90IGFjcXVpcmVfY291bnQ7CisJdWludDMyX3Qgc3RhcnRfZGV2X2NvdW50OwogCWNoYXIgZGV2aWNlX25hbWVbMjBdOwogCXVpbnQzMl90IGlzX2FjcXVpcmVkX2Rldl9jb21ib19tb2RlOwogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICBzb2NfaW5mbzsKIAl1aW50MzJfdCBjcGFzX2hhbmRsZTsKKwl1aW50MzJfdCBjb25maWdfY291bnQ7CiB9OwogCiAjZW5kaWYgLyogX0NBTV9DU0lQSFlfREVWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X3NvYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jc2lwaHkvY2FtX2NzaXBoeV9zb2MuYwppbmRleCBhNzllMGQ0Li5kMmE4NDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2NzaXBoeS9jYW1fY3NpcGh5X3NvYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fY3NpcGh5L2NhbV9jc2lwaHlfc29jLmMKQEAgLTE0LDcgKzE0LDQ3IEBACiAjaW5jbHVkZSAiY2FtX2NzaXBoeV9jb3JlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9jYW1fY3NpcGh5XzFfMF9od3JlZy5oIgogCi0jaWZkZWYgQ0FNX0NTSVBIWV9NRU1fRE1QCisjZGVmaW5lIEJZVEVTX1BFUl9SRUdJU1RFUiAgICAgICAgICAgNAorI2RlZmluZSBOVU1fUkVHSVNURVJfUEVSX0xJTkUgICAgICAgIDQKKyNkZWZpbmUgUkVHX09GRlNFVChfX3N0YXJ0LCBfX2kpICAgICgoX19zdGFydCkgKyAoKF9faSkgKiBCWVRFU19QRVJfUkVHSVNURVIpKQorCitzdGF0aWMgaW50IGNhbV9pb19waHlfZHVtcCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwl1aW50MzJfdCBzdGFydF9vZmZzZXQsIGludCBzaXplKQoreworCWNoYXIgICAgICAgICAgbGluZV9zdHJbMTI4XTsKKwljaGFyICAgICAgICAgKnBfc3RyOworCWludCAgICAgICAgICAgaTsKKwl1aW50MzJfdCAgICAgIGRhdGE7CisKKwlDQU1fSU5GTyhDQU1fQ1NJUEhZLCAiYWRkcj0lcEsgb2Zmc2V0PTB4JXggc2l6ZT0lZCIsCisJCWJhc2VfYWRkciwgc3RhcnRfb2Zmc2V0LCBzaXplKTsKKworCWlmICghYmFzZV9hZGRyIHx8IChzaXplIDw9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxpbmVfc3RyWzBdID0gJ1wwJzsKKwlwX3N0ciA9IGxpbmVfc3RyOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKGkgJSBOVU1fUkVHSVNURVJfUEVSX0xJTkUgPT0gMCkgeworCQkJc25wcmludGYocF9zdHIsIDEyLCAiMHglMDh4OiAiLAorCQkJCVJFR19PRkZTRVQoc3RhcnRfb2Zmc2V0LCBpKSk7CisJCQlwX3N0ciArPSAxMTsKKwkJfQorCQlkYXRhID0gcmVhZGxfcmVsYXhlZChiYXNlX2FkZHIgKyBSRUdfT0ZGU0VUKHN0YXJ0X29mZnNldCwgaSkpOworCQlzbnByaW50ZihwX3N0ciwgOSwgIiUwOHggIiwgZGF0YSk7CisJCXBfc3RyICs9IDg7CisJCWlmICgoaSArIDEpICUgTlVNX1JFR0lTVEVSX1BFUl9MSU5FID09IDApIHsKKwkJCUNBTV9FUlIoQ0FNX0NTSVBIWSwgIiVzIiwgbGluZV9zdHIpOworCQkJbGluZV9zdHJbMF0gPSAnXDAnOworCQkJcF9zdHIgPSBsaW5lX3N0cjsKKwkJfQorCX0KKwlpZiAobGluZV9zdHJbMF0gIT0gJ1wwJykKKwkJQ0FNX0VSUihDQU1fQ1NJUEhZLCAiJXMiLCBsaW5lX3N0cik7CisKKwlyZXR1cm4gMDsKK30KKwogaW50MzJfdCBjYW1fY3NpcGh5X21lbV9kbXAoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pCiB7CiAJaW50MzJfdCByYyA9IDA7CkBAIC0yOCwxNCArNjgsMTMgQEAKIAl9CiAJYWRkciA9IHNvY19pbmZvLT5yZWdfbWFwWzBdLm1lbV9iYXNlOwogCXNpemUgPSByZXNvdXJjZV9zaXplKHNvY19pbmZvLT5tZW1fYmxvY2tbMF0pOwotCXJjID0gY2FtX2lvX2R1bXAoYWRkciwgMCwgKHNpemUgPj4gMikpOworCXJjID0gY2FtX2lvX3BoeV9kdW1wKGFkZHIsIDAsIChzaXplID4+IDIpKTsKIAlpZiAocmMgPCAwKSB7CiAJCUNBTV9FUlIoQ0FNX0NTSVBIWSwgImdlbmVyYXRpbmcgZHVtcCBmYWlsZWQgJWQiLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAJcmV0dXJuIHJjOwogfQotI2VuZGlmCiAKIGludDMyX3QgY2FtX2NzaXBoeV9lbmFibGVfaHcoc3RydWN0IGNzaXBoeV9kZXZpY2UgKmNzaXBoeV9kZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2VlcHJvbS9jYW1fZWVwcm9tX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fY29yZS5jCmluZGV4IDk2Njk3ZjkuLmExNzM5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fY29yZS5jCkBAIC0yNDMsNyArMjQzLDggQEAKIAlzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50ID0gJmVfY3RybC0+aW9fbWFzdGVyX2luZm87CiAJdWludDhfdCAgICAgICAgICAgICAgICAgIGlkWzJdOwogCi0JcmMgPSBjYW1fc3BpX3F1ZXJ5X2lkKGNsaWVudCwgMCwgJmlkWzBdLCAyKTsKKwlyYyA9IGNhbV9zcGlfcXVlcnlfaWQoY2xpZW50LCAwLCBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQsCisJCSZpZFswXSwgMik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJQ0FNX0RCRyhDQU1fRUVQUk9NLCAicmVhZCAweCV4IDB4JXgsIGNoZWNrIDB4JXggMHgleCIsCkBAIC0zMTAsNiArMzExLDggQEAKIGRhdGFfbWVtX2ZyZWU6CiAJa2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhKTsKIAlrZnJlZShlX2N0cmwtPmNhbF9kYXRhLm1hcCk7CisJZV9jdHJsLT5jYWxfZGF0YS5udW1fZGF0YSA9IDA7CisJZV9jdHJsLT5jYWxfZGF0YS5udW1fbWFwID0gMDsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQ4Myw3ICs0ODYsNyBAQAogCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgY21kX2xlbmd0aF9pbl9ieXRlcyA9IDA7CiAJc3RydWN0IGNhbV9jbWRfaTJjX2luZm8gICAgICAgICppMmNfaW5mbyA9IE5VTEw7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fbWFwID0gLTE7Ci0Jc3RydWN0IGNhbV9lZXByb21fbWVtb3J5X21hcF90ICptYXA7CisJc3RydWN0IGNhbV9lZXByb21fbWVtb3J5X21hcF90ICptYXAgPSBOVUxMOwogCXN0cnVjdCBjYW1fZWVwcm9tX3NvY19wcml2YXRlICAqc29jX3ByaXZhdGUgPQogCQkoc3RydWN0IGNhbV9lZXByb21fc29jX3ByaXZhdGUgKillX2N0cmwtPnNvY19pbmZvLnNvY19wcml2YXRlOwogCXN0cnVjdCBjYW1fc2Vuc29yX3Bvd2VyX2N0cmxfdCAqcG93ZXJfaW5mbyA9ICZzb2NfcHJpdmF0ZS0+cG93ZXJfaW5mbzsKQEAgLTYxNyw3ICs2MjAsNyBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCi0JCQlDQU1fRVJSKENBTV9FRVBST00sICJjb3B5IHRoZSBkYXRhLCBsZW46JWQiLAorCQkJQ0FNX0RCRyhDQU1fRUVQUk9NLCAiY29weSB0aGUgZGF0YSwgbGVuOiVkIiwKIAkJCQllX2N0cmwtPmNhbF9kYXRhLm51bV9kYXRhKTsKIAkJCW1lbWNweShyZWFkX2J1ZmZlciwgZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhLAogCQkJCQllX2N0cmwtPmNhbF9kYXRhLm51bV9kYXRhKTsKQEAgLTY2NCw1MyArNjY3LDYwIEBACiAJc3dpdGNoIChjc2xfcGFja2V0LT5oZWFkZXIub3BfY29kZSAmIDB4RkZGRkZGKSB7CiAJY2FzZSBDQU1fRUVQUk9NX1BBQ0tFVF9PUENPREVfSU5JVDoKIAkJaWYgKGVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID09IGZhbHNlKSB7Ci0JCQlyYyA9IGNhbV9lZXByb21fZ2V0X2NhbF9kYXRhKGVfY3RybCwgY3NsX3BhY2tldCk7Ci0JCQlDQU1fRVJSKENBTV9FRVBST00sCi0JCQkJIkVlcHJvbSBhbHJlYWR5IHByb2JlZCBhdCBrZXJuZWwgYm9vdCIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQkJfQotCQlpZiAoZV9jdHJsLT5jYWxfZGF0YS5udW1fZGF0YSA9PSAwKSB7Ci0JCQlyYyA9IGNhbV9lZXByb21faW5pdF9wa3RfcGFyc2VyKGVfY3RybCwgY3NsX3BhY2tldCk7Ci0JCQlpZiAocmMpIHsKLQkJCQlDQU1fRVJSKENBTV9FRVBST00sCi0JCQkJCSJGYWlsZWQgaW4gcGFyc2luZyB0aGUgcGt0Iik7CisJCQlyYyA9IGNhbV9lZXByb21fcGFyc2VfcmVhZF9tZW1vcnlfbWFwKAorCQkJCQllX2N0cmwtPnBkZXYtPmRldi5vZl9ub2RlLCBlX2N0cmwpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgIkZhaWxlZDogcmMgOiAlZCIsIHJjKTsKIAkJCQlyZXR1cm4gcmM7CiAJCQl9Ci0KLQkJCWVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSA9Ci0JCQkJa3phbGxvYyhlX2N0cmwtPmNhbF9kYXRhLm51bV9kYXRhLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhKSB7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0KLQkJCXJjID0gY2FtX2VlcHJvbV9wb3dlcl91cChlX2N0cmwsCi0JCQkJJnNvY19wcml2YXRlLT5wb3dlcl9pbmZvKTsKLQkJCWlmIChyYykgewotCQkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZCByYyAlZCIsIHJjKTsKLQkJCQlnb3RvIG1lbWRhdGFfZnJlZTsKLQkJCX0KLQotCQkJcmMgPSBjYW1fZWVwcm9tX3JlYWRfbWVtb3J5KGVfY3RybCwgJmVfY3RybC0+Y2FsX2RhdGEpOwotCQkJaWYgKHJjKSB7Ci0JCQkJQ0FNX0VSUihDQU1fRUVQUk9NLAotCQkJCQkicmVhZF9lZXByb21fbWVtb3J5IGZhaWxlZCIpOwotCQkJCWdvdG8gcG93ZXJfZG93bjsKLQkJCX0KLQogCQkJcmMgPSBjYW1fZWVwcm9tX2dldF9jYWxfZGF0YShlX2N0cmwsIGNzbF9wYWNrZXQpOwotCQkJcmMgPSBjYW1fZWVwcm9tX3Bvd2VyX2Rvd24oZV9jdHJsKTsKLQkJfSBlbHNlIHsKLQkJCUNBTV9EQkcoQ0FNX0VFUFJPTSwgIkFscmVhZHkgcmVhZCBlZXByb20iKTsKKwkJCWtmcmVlKGVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSk7CisJCQlrZnJlZShlX2N0cmwtPmNhbF9kYXRhLm1hcCk7CisJCQllX2N0cmwtPmNhbF9kYXRhLm51bV9kYXRhID0gMDsKKwkJCWVfY3RybC0+Y2FsX2RhdGEubnVtX21hcCA9IDA7CisJCQlDQU1fREJHKENBTV9FRVBST00sCisJCQkJIlJldHVybmluZyB0aGUgZGF0YSB1c2luZyBrZXJuZWwgcHJvYmUiKTsKKwkJYnJlYWs7CiAJCX0KKwkJcmMgPSBjYW1fZWVwcm9tX2luaXRfcGt0X3BhcnNlcihlX2N0cmwsIGNzbF9wYWNrZXQpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwKKwkJCQkiRmFpbGVkIGluIHBhcnNpbmcgdGhlIHBrdCIpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhID0KKwkJCWt6YWxsb2MoZV9jdHJsLT5jYWxfZGF0YS5udW1fZGF0YSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlyYyA9IGNhbV9lZXByb21fcG93ZXJfdXAoZV9jdHJsLAorCQkJJnNvY19wcml2YXRlLT5wb3dlcl9pbmZvKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQgcmMgJWQiLCByYyk7CisJCQlnb3RvIG1lbWRhdGFfZnJlZTsKKwkJfQorCisJCXJjID0gY2FtX2VlcHJvbV9yZWFkX21lbW9yeShlX2N0cmwsICZlX2N0cmwtPmNhbF9kYXRhKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9FRVBST00sCisJCQkJInJlYWRfZWVwcm9tX21lbW9yeSBmYWlsZWQiKTsKKwkJCWdvdG8gcG93ZXJfZG93bjsKKwkJfQorCisJCXJjID0gY2FtX2VlcHJvbV9nZXRfY2FsX2RhdGEoZV9jdHJsLCBjc2xfcGFja2V0KTsKKwkJcmMgPSBjYW1fZWVwcm9tX3Bvd2VyX2Rvd24oZV9jdHJsKTsKKwkJa2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhKTsKKwkJa2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXApOworCQllX2N0cmwtPmNhbF9kYXRhLm51bV9kYXRhID0gMDsKKwkJZV9jdHJsLT5jYWxfZGF0YS5udW1fbWFwID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCWtmcmVlKGVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSk7Ci0Ja2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXApOwogCXJldHVybiByYzsKIHBvd2VyX2Rvd246CiAJcmMgPSBjYW1fZWVwcm9tX3Bvd2VyX2Rvd24oZV9jdHJsKTsKQEAgLTcxOCw2ICs3MjgsOCBAQAogCWtmcmVlKGVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSk7CiBlcnJvcjoKIAlrZnJlZShlX2N0cmwtPmNhbF9kYXRhLm1hcCk7CisJZV9jdHJsLT5jYWxfZGF0YS5udW1fZGF0YSA9IDA7CisJZV9jdHJsLT5jYWxfZGF0YS5udW1fbWFwID0gMDsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTczMSw3ICs3NDMsNyBAQAogaW50MzJfdCBjYW1fZWVwcm9tX2RyaXZlcl9jbWQoc3RydWN0IGNhbV9lZXByb21fY3RybF90ICplX2N0cmwsIHZvaWQgKmFyZykKIHsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOwotCXN0cnVjdCBjYW1fZWVwcm9tX3F1ZXJ5X2NhcF90ICBlZXByb21fY2FwOworCXN0cnVjdCBjYW1fZWVwcm9tX3F1ZXJ5X2NhcF90ICBlZXByb21fY2FwID0gezB9OwogCXN0cnVjdCBjYW1fY29udHJvbCAgICAgICAgICAgICpjbWQgPSAoc3RydWN0IGNhbV9jb250cm9sICopYXJnOwogCiAJaWYgKCFlX2N0cmwpIHsKQEAgLTc0Miw3ICs3NTQsNyBAQAogCW11dGV4X2xvY2soJihlX2N0cmwtPmVlcHJvbV9tdXRleCkpOwogCXN3aXRjaCAoY21kLT5vcF9jb2RlKSB7CiAJY2FzZSBDQU1fUVVFUllfQ0FQOgotCQllZXByb21fY2FwLnNsb3RfaW5mbyA9IGVfY3RybC0+c3ViZGV2X2lkOworCQllZXByb21fY2FwLnNsb3RfaW5mbyA9IGVfY3RybC0+c29jX2luZm8uaW5kZXg7CiAJCWlmIChlX2N0cmwtPnVzZXJzcGFjZV9wcm9iZSA9PSBmYWxzZSkKIAkJCWVlcHJvbV9jYXAuZWVwcm9tX2tlcm5lbF9wcm9iZSA9IHRydWU7CiAJCWVsc2UKQEAgLTc2NCw2ICs3NzYsMjMgQEAKIAkJCWdvdG8gcmVsZWFzZV9tdXRleDsKIAkJfQogCQlicmVhazsKKwljYXNlIENBTV9SRUxFQVNFX0RFVjoKKwkJaWYgKGVfY3RybC0+YnJpZGdlX2ludGYuZGV2aWNlX2hkbCA9PSAtMSkgeworCQkJQ0FNX0VSUihDQU1fRUVQUk9NLAorCQkJCSJJbnZhbGlkIEhhbmRsZXM6IGxpbmsgaGRsOiAlZCBkZXZpY2UgaGRsOiAlZCIsCisJCQkJZV9jdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsLAorCQkJCWVfY3RybC0+YnJpZGdlX2ludGYubGlua19oZGwpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisJCXJjID0gY2FtX2Rlc3Ryb3lfZGV2aWNlX2hkbChlX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwpOworCQlpZiAocmMgPCAwKQorCQkJQ0FNX0VSUihDQU1fRUVQUk9NLAorCQkJCSJmYWlsZWQgaW4gZGVzdHJveWluZyB0aGUgZGV2aWNlIGhkbCIpOworCQllX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKKwkJZV9jdHJsLT5icmlkZ2VfaW50Zi5saW5rX2hkbCA9IC0xOworCQllX2N0cmwtPmJyaWRnZV9pbnRmLnNlc3Npb25faGRsID0gLTE7CisJCWJyZWFrOwogCWNhc2UgQ0FNX0NPTkZJR19ERVY6CiAJCXJjID0gY2FtX2VlcHJvbV9wa3RfcGFyc2UoZV9jdHJsLCBhcmcpOwogCQlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2VlcHJvbS9jYW1fZWVwcm9tX2Rldi5jCmluZGV4IDgyZGNjOWMuLjg4ZDc2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9kZXYuYwpAQCAtMTExLDEyICsxMTEsMzQgQEAKIAkuY29yZSA9ICZjYW1fZWVwcm9tX3N1YmRldl9jb3JlX29wcywKIH07CiAKK3N0YXRpYyBpbnQgY2FtX2VlcHJvbV9pbml0X3N1YmRldihzdHJ1Y3QgY2FtX2VlcHJvbV9jdHJsX3QgKmVfY3RybCkKK3sKKwlpbnQgcmMgPSAwOworCisJZV9jdHJsLT52NGwyX2Rldl9zdHIuaW50ZXJuYWxfb3BzID0gJmNhbV9lZXByb21faW50ZXJuYWxfb3BzOworCWVfY3RybC0+djRsMl9kZXZfc3RyLm9wcyA9ICZjYW1fZWVwcm9tX3N1YmRldl9vcHM7CisJc3RybGNweShlX2N0cmwtPmRldmljZV9uYW1lLCBDQU1fRUVQUk9NX05BTUUsCisJCXNpemVvZihlX2N0cmwtPmRldmljZV9uYW1lKSk7CisJZV9jdHJsLT52NGwyX2Rldl9zdHIubmFtZSA9IGVfY3RybC0+ZGV2aWNlX25hbWU7CisJZV9jdHJsLT52NGwyX2Rldl9zdHIuc2RfZmxhZ3MgPQorCQkoVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUgfCBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKTsKKwllX2N0cmwtPnY0bDJfZGV2X3N0ci5lbnRfZnVuY3Rpb24gPSBDQU1fRUVQUk9NX0RFVklDRV9UWVBFOworCWVfY3RybC0+djRsMl9kZXZfc3RyLnRva2VuID0gZV9jdHJsOworCisJcmMgPSBjYW1fcmVnaXN0ZXJfc3ViZGV2KCYoZV9jdHJsLT52NGwyX2Rldl9zdHIpKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkZhaWwgd2l0aCBjYW1fcmVnaXN0ZXJfc3ViZGV2Iik7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgY2FtX2VlcHJvbV9pMmNfZHJpdmVyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKIAlzdHJ1Y3QgY2FtX2VlcHJvbV9jdHJsX3QgICAgICAgKmVfY3RybCA9IE5VTEw7CiAJc3RydWN0IGNhbV9lZXByb21fc29jX3ByaXZhdGUgICpzb2NfcHJpdmF0ZSA9IE5VTEw7CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAgICAgICAgICpzb2NfaW5mbyA9IE5VTEw7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewogCQlDQU1fRVJSKENBTV9FRVBST00sICJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWQiKTsKQEAgLTEyOSwyNyArMTUxLDY0IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBwcm9iZV9mYWlsdXJlOwogCX0KLQllX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPSAmY2FtX2VlcHJvbV9zdWJkZXZfb3BzOworCisJc29jX3ByaXZhdGUgPSBremFsbG9jKHNpemVvZigqc29jX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvY19wcml2YXRlKQorCQlnb3RvIGVjdHJsX2ZyZWU7CisKKwllX2N0cmwtPnNvY19pbmZvLnNvY19wcml2YXRlID0gc29jX3ByaXZhdGU7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBlX2N0cmwpOworCisJbXV0ZXhfaW5pdCgmKGVfY3RybC0+ZWVwcm9tX211dGV4KSk7CisKKwlzb2NfaW5mbyA9ICZlX2N0cmwtPnNvY19pbmZvOworCXNvY19pbmZvLT5kZXYgPSAmY2xpZW50LT5kZXY7CisJc29jX2luZm8tPmRldl9uYW1lID0gY2xpZW50LT5uYW1lOworCWVfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPSBJMkNfTUFTVEVSOworCWVfY3RybC0+aW9fbWFzdGVyX2luZm8uY2xpZW50ID0gY2xpZW50OworCWVfY3RybC0+ZWVwcm9tX2RldmljZV90eXBlID0gTVNNX0NBTUVSQV9JMkNfREVWSUNFOworCisJcmMgPSBjYW1fZWVwcm9tX3BhcnNlX2R0KGVfY3RybCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZDogc29jIGluaXQgcmMgJWQiLCByYyk7CisJCWdvdG8gZnJlZV9zb2M7CisJfQorCisJcmMgPSBjYW1fZWVwcm9tX3VwZGF0ZV9pMmNfaW5mbyhlX2N0cmwsICZzb2NfcHJpdmF0ZS0+aTJjX2luZm8pOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQ6IHRvIHVwZGF0ZSBpMmMgaW5mbyByYyAlZCIsIHJjKTsKKwkJZ290byBmcmVlX3NvYzsKKwl9CisKIAlzb2NfcHJpdmF0ZSA9IChzdHJ1Y3QgY2FtX2VlcHJvbV9zb2NfcHJpdmF0ZSAqKShpZC0+ZHJpdmVyX2RhdGEpOwogCWlmICghc29jX3ByaXZhdGUpIHsKIAkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiYm9hcmQgaW5mbyBOVUxMIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlY3RybF9mcmVlOwogCX0KKworCXJjID0gY2FtX2VlcHJvbV9pbml0X3N1YmRldihlX2N0cmwpOworCWlmIChyYykKKwkJZ290byBmcmVlX3NvYzsKKwogCWVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSA9IE5VTEw7CiAJZV9jdHJsLT5jYWxfZGF0YS5tYXAgPSBOVUxMOwogCWVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID0gZmFsc2U7CiAKLQllX2N0cmwtPmVlcHJvbV9kZXZpY2VfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0RFVklDRTsKLQllX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlID0gSTJDX01BU1RFUjsKLQllX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudCA9IGNsaWVudDsKLQogCWlmIChzb2NfcHJpdmF0ZS0+aTJjX2luZm8uc2xhdmVfYWRkciAhPSAwKQogCQllX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudC0+YWRkciA9CiAJCQlzb2NfcHJpdmF0ZS0+aTJjX2luZm8uc2xhdmVfYWRkcjsKIAotCXJldHVybiByYzsKKwllX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKKwllX2N0cmwtPmJyaWRnZV9pbnRmLm9wcy5nZXRfZGV2X2luZm8gPSBOVUxMOworCWVfY3RybC0+YnJpZGdlX2ludGYub3BzLmxpbmtfc2V0dXAgPSBOVUxMOworCWVfY3RybC0+YnJpZGdlX2ludGYub3BzLmFwcGx5X3JlcSA9IE5VTEw7CisJdjRsMl9zZXRfc3ViZGV2ZGF0YSgmZV9jdHJsLT52NGwyX2Rldl9zdHIuc2QsIGVfY3RybCk7CiAKKwlyZXR1cm4gcmM7CitmcmVlX3NvYzoKKwlrZnJlZShzb2NfcHJpdmF0ZSk7CiBlY3RybF9mcmVlOgogCWtmcmVlKGVfY3RybCk7CiBwcm9iZV9mYWlsdXJlOgpAQCAtMTgwLDggKzIzOSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWtmcmVlKGVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSk7Ci0Ja2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXApOwogCWlmIChzb2NfcHJpdmF0ZSkgewogCQlrZnJlZShzb2NfcHJpdmF0ZS0+cG93ZXJfaW5mby5ncGlvX251bV9pbmZvKTsKIAkJa2ZyZWUoc29jX3ByaXZhdGUpOwpAQCAtMTk0LDYgKzI1MSw3IEBACiBzdGF0aWMgaW50IGNhbV9lZXByb21fc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGNhbV9lZXByb21fY3RybF90ICAgICAgICplX2N0cmwgPSBOVUxMOworCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICAgICAgICAqc29jX2luZm8gPSBOVUxMOwogCXN0cnVjdCBjYW1fc2Vuc29yX3NwaV9jbGllbnQgICAqc3BpX2NsaWVudDsKIAlzdHJ1Y3QgY2FtX2VlcHJvbV9zb2NfcHJpdmF0ZSAgKmViX2luZm87CiAJc3RydWN0IGNhbV9zZW5zb3JfcG93ZXJfY3RybF90ICpwb3dlcl9pbmZvID0gTlVMTDsKQEAgLTIwMyw2ICsyNjEsMTAgQEAKIAlpZiAoIWVfY3RybCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzb2NfaW5mbyA9ICZlX2N0cmwtPnNvY19pbmZvOworCXNvY19pbmZvLT5kZXYgPSAmc3BpLT5kZXY7CisJc29jX2luZm8tPmRldl9uYW1lID0gc3BpLT5tb2RhbGlhczsKKwogCWVfY3RybC0+djRsMl9kZXZfc3RyLm9wcyA9ICZjYW1fZWVwcm9tX3N1YmRldl9vcHM7CiAJZV9jdHJsLT51c2Vyc3BhY2VfcHJvYmUgPSBmYWxzZTsKIAllX2N0cmwtPmNhbF9kYXRhLm1hcGRhdGEgPSBOVUxMOwpAQCAtMjM0LDIxICsyOTYsMjggQEAKIAkvKiBJbml0aWFsaXplIG11dGV4ICovCiAJbXV0ZXhfaW5pdCgmKGVfY3RybC0+ZWVwcm9tX211dGV4KSk7CiAKLQlyYyA9IGNhbV9lZXByb21fc3BpX2RyaXZlcl9zb2NfaW5pdChlX2N0cmwpOworCXJjID0gY2FtX2VlcHJvbV9wYXJzZV9kdChlX2N0cmwpOwogCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQ6IHNwaSBzb2MgaW5pdCByYyAlZCIsIHJjKTsKIAkJZ290byBib2FyZF9mcmVlOwogCX0KIAotCWlmIChlX2N0cmwtPnVzZXJzcGFjZV9wcm9iZSA9PSBmYWxzZSkgewotCQlyYyA9IGNhbV9lZXByb21fcGFyc2VfcmVhZF9tZW1vcnlfbWFwKHNwaS0+ZGV2Lm9mX25vZGUsCi0JCQllX2N0cmwpOwotCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZDogcmVhZCBtZW0gbWFwIHJjICVkIiwgcmMpOwotCQkJZ290byBib2FyZF9mcmVlOwotCQl9CisJcmMgPSBjYW1fZWVwcm9tX3NwaV9wYXJzZV9vZihzcGlfY2xpZW50KTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRGV2aWNlIHRyZWUgcGFyc2luZyBlcnJvciIpOworCQlnb3RvIGJvYXJkX2ZyZWU7CiAJfQogCisJcmMgPSBjYW1fZWVwcm9tX2luaXRfc3ViZGV2KGVfY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGJvYXJkX2ZyZWU7CisKKwllX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKKwllX2N0cmwtPmJyaWRnZV9pbnRmLm9wcy5nZXRfZGV2X2luZm8gPSBOVUxMOworCWVfY3RybC0+YnJpZGdlX2ludGYub3BzLmxpbmtfc2V0dXAgPSBOVUxMOworCWVfY3RybC0+YnJpZGdlX2ludGYub3BzLmFwcGx5X3JlcSA9IE5VTEw7CisKKwl2NGwyX3NldF9zdWJkZXZkYXRhKCZlX2N0cmwtPnY0bDJfZGV2X3N0ci5zZCwgZV9jdHJsKTsKIAlyZXR1cm4gcmM7CiAKIGJvYXJkX2ZyZWU6CkBAIC0yOTIsOCArMzYxLDYgQEAKIAl9CiAKIAlrZnJlZShlX2N0cmwtPmlvX21hc3Rlcl9pbmZvLnNwaV9jbGllbnQpOwotCWtmcmVlKGVfY3RybC0+Y2FsX2RhdGEubWFwZGF0YSk7Ci0Ja2ZyZWUoZV9jdHJsLT5jYWxfZGF0YS5tYXApOwogCXNvY19wcml2YXRlID0KIAkJKHN0cnVjdCBjYW1fZWVwcm9tX3NvY19wcml2YXRlICopZV9jdHJsLT5zb2NfaW5mby5zb2NfcHJpdmF0ZTsKIAlpZiAoc29jX3ByaXZhdGUpIHsKQEAgLTMxNyw2ICszODQsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWVfY3RybC0+c29jX2luZm8ucGRldiA9IHBkZXY7CisJZV9jdHJsLT5zb2NfaW5mby5kZXYgPSAmcGRldi0+ZGV2OworCWVfY3RybC0+c29jX2luZm8uZGV2X25hbWUgPSBwZGV2LT5uYW1lOwogCWVfY3RybC0+ZWVwcm9tX2RldmljZV90eXBlID0gTVNNX0NBTUVSQV9QTEFURk9STV9ERVZJQ0U7CiAJZV9jdHJsLT5jYWxfZGF0YS5tYXBkYXRhID0gTlVMTDsKIAllX2N0cmwtPmNhbF9kYXRhLm1hcCA9IE5VTEw7CkBAIC0zMzgsNyArNDA3LDcgQEAKIAogCS8qIEluaXRpYWxpemUgbXV0ZXggKi8KIAltdXRleF9pbml0KCYoZV9jdHJsLT5lZXByb21fbXV0ZXgpKTsKLQlyYyA9IGNhbV9lZXByb21fcGxhdGZvcm1fZHJpdmVyX3NvY19pbml0KGVfY3RybCk7CisJcmMgPSBjYW1fZWVwcm9tX3BhcnNlX2R0KGVfY3RybCk7CiAJaWYgKHJjKSB7CiAJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZDogc29jIGluaXQgcmMgJWQiLCByYyk7CiAJCWdvdG8gZnJlZV9zb2M7CkBAIC0zNDksMzAgKzQxOCw5IEBACiAJCWdvdG8gZnJlZV9zb2M7CiAJfQogCi0JaWYgKGVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID09IGZhbHNlKSB7Ci0JCXJjID0gY2FtX2VlcHJvbV9wYXJzZV9yZWFkX21lbW9yeV9tYXAocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQllX2N0cmwpOwotCQlpZiAocmMpIHsKLQkJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZDogcmVhZCBtZW0gbWFwIHJjICVkIiwgcmMpOwotCQkJZ290byBmcmVlX3NvYzsKLQkJfQotCX0KLQotCWVfY3RybC0+djRsMl9kZXZfc3RyLmludGVybmFsX29wcyA9ICZjYW1fZWVwcm9tX2ludGVybmFsX29wczsKLQllX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPSAmY2FtX2VlcHJvbV9zdWJkZXZfb3BzOwotCXN0cmxjcHkoZV9jdHJsLT5kZXZpY2VfbmFtZSwgQ0FNX0VFUFJPTV9OQU1FLAotCQlzaXplb2YoZV9jdHJsLT5kZXZpY2VfbmFtZSkpOwotCWVfY3RybC0+djRsMl9kZXZfc3RyLm5hbWUgPSBlX2N0cmwtPmRldmljZV9uYW1lOwotCWVfY3RybC0+djRsMl9kZXZfc3RyLnNkX2ZsYWdzID0KLQkJKFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFIHwgVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyk7Ci0JZV9jdHJsLT52NGwyX2Rldl9zdHIuZW50X2Z1bmN0aW9uID0gQ0FNX0VFUFJPTV9ERVZJQ0VfVFlQRTsKLQllX2N0cmwtPnY0bDJfZGV2X3N0ci50b2tlbiA9IGVfY3RybDsKLQotCXJjID0gY2FtX3JlZ2lzdGVyX3N1YmRldigmKGVfY3RybC0+djRsMl9kZXZfc3RyKSk7Ci0JaWYgKHJjKSB7Ci0JCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWwgdG8gY3JlYXRlIHN1YmRldiIpOworCXJjID0gY2FtX2VlcHJvbV9pbml0X3N1YmRldihlX2N0cmwpOworCWlmIChyYykKIAkJZ290byBmcmVlX3NvYzsKLQl9CiAKIAllX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKIAllX2N0cmwtPmJyaWRnZV9pbnRmLm9wcy5nZXRfZGV2X2luZm8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9kZXYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fZGV2LmgKaW5kZXggYTk4YmYwMC4uZTA2ZTIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9kZXYuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2VlcHJvbS9jYW1fZWVwcm9tX2Rldi5oCkBAIC0xNTQsNyArMTU0LDYgQEAKICAqIEBjY2lfaTJjX21hc3RlciAgOiAgIEkyQyBzdHJ1Y3R1cmUKICAqIEB2NGwyX2Rldl9zdHIgICAgOiAgIFY0TDIgZGV2aWNlIHN0cnVjdHVyZQogICogQGJyaWRnZV9pbnRmICAgICA6ICAgYnJpZGdlIGludGVyZmFjZSBwYXJhbXMKLSAqIEBzdWJkZXZfaWQgICAgICAgOiAgIHN1YmRldiBpZAogICogQHVzZXJzcGFjZV9wcm9iZSA6ICAgZmxhZyBpbmRpY2F0ZXMgdXNlcnNwYWNlIG9yIGtlcm5lbCBwcm9iZQogICogQGNhbF9kYXRhICAgICAgICA6ICAgQ2FsaWJyYXRpb24gZGF0YQogICogQGRldmljZV9uYW1lICAgICA6ICAgRGV2aWNlIG5hbWUKQEAgLTE3MSw3ICsxNzAsNiBAQAogCXN0cnVjdCBjYW1fc3ViZGV2IHY0bDJfZGV2X3N0cjsKIAlzdHJ1Y3QgY2FtX2VlcHJvbV9pbnRmX3BhcmFtcyBicmlkZ2VfaW50ZjsKIAllbnVtIG1zbV9jYW1lcmFfZGV2aWNlX3R5cGVfdCBlZXByb21fZGV2aWNlX3R5cGU7Ci0JdWludDMyX3Qgc3ViZGV2X2lkOwogCWJvb2wgdXNlcnNwYWNlX3Byb2JlOwogCXN0cnVjdCBjYW1fZWVwcm9tX21lbW9yeV9ibG9ja190IGNhbF9kYXRhOwogCWNoYXIgZGV2aWNlX25hbWVbMjBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fc29jLmMKaW5kZXggODRlNzIzZi4uNzBjNDBmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9zb2MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2VlcHJvbS9jYW1fZWVwcm9tX3NvYy5jCkBAIC0yMCw2ICsyMCw5NiBAQAogI2luY2x1ZGUgImNhbV9lZXByb21fc29jLmgiCiAjaW5jbHVkZSAiY2FtX2RlYnVnX3V0aWwuaCIKIAorI2RlZmluZSBjYW1fZWVwcm9tX3NwaV9wYXJzZV9jbWQoc3BpX2RldiwgbmFtZSwgb3V0KSAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlzcGlfZGV2LT5jbWRfdGJsLm5hbWUub3Bjb2RlID0gb3V0WzBdOyAgICAgICAgXAorCQlzcGlfZGV2LT5jbWRfdGJsLm5hbWUuYWRkcl9sZW4gPSBvdXRbMV07ICAgICAgXAorCQlzcGlfZGV2LT5jbWRfdGJsLm5hbWUuZHVtbXlfbGVuID0gb3V0WzJdOyAgICAgXAorCQlzcGlfZGV2LT5jbWRfdGJsLm5hbWUuZGVsYXlfaW50diA9IG91dFszXTsgICAgXAorCQlzcGlfZGV2LT5jbWRfdGJsLm5hbWUuZGVsYXlfY291bnQgPSBvdXRbNF07ICAgXAorCX0KKworaW50IGNhbV9lZXByb21fc3BpX3BhcnNlX29mKHN0cnVjdCBjYW1fc2Vuc29yX3NwaV9jbGllbnQgKnNwaV9kZXYpCit7CisJaW50IHJjID0gLUVGQVVMVDsKKwl1aW50MzJfdCB0bXBbNV07CisKKwlyYyAgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShzcGlfZGV2LT5zcGlfbWFzdGVyLT5kZXYub2Zfbm9kZSwKKwkJInNwaW9wLXJlYWQiLCB0bXAsIDUpOworCWlmICghcmMpIHsKKwkJY2FtX2VlcHJvbV9zcGlfcGFyc2VfY21kKHNwaV9kZXYsIHJlYWQsIHRtcCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIGdldCByZWFkIGRhdGEiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShzcGlfZGV2LT5zcGlfbWFzdGVyLT5kZXYub2Zfbm9kZSwKKwkJInNwaW9wLXJlYWRzZXEiLCB0bXAsIDUpOworCWlmICghcmMpIHsKKwkJY2FtX2VlcHJvbV9zcGlfcGFyc2VfY21kKHNwaV9kZXYsIHJlYWRfc2VxLCB0bXApOworCX0gZWxzZSB7CisJCUNBTV9FUlIoQ0FNX0VFUFJPTSwgIkZhaWxlZCB0byBnZXQgcmVhZHNlcSBkYXRhIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoc3BpX2Rldi0+c3BpX21hc3Rlci0+ZGV2Lm9mX25vZGUsCisJCSJzcGlvcC1xdWVyeWlkIiwgdG1wLCA1KTsKKwlpZiAoIXJjKSB7CisJCWNhbV9lZXByb21fc3BpX3BhcnNlX2NtZChzcGlfZGV2LCBxdWVyeV9pZCwgdG1wKTsKKwl9IGVsc2UgeworCQlDQU1fRVJSKENBTV9FRVBST00sICJGYWlsZWQgdG8gZ2V0IHF1ZXJ5aWQgZGF0YSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHNwaV9kZXYtPnNwaV9tYXN0ZXItPmRldi5vZl9ub2RlLAorCQkic3Bpb3AtcHByb2ciLCB0bXAsIDUpOworCWlmICghcmMpIHsKKwkJY2FtX2VlcHJvbV9zcGlfcGFyc2VfY21kKHNwaV9kZXYsIHBhZ2VfcHJvZ3JhbSwgdG1wKTsKKwl9IGVsc2UgeworCQlDQU1fRVJSKENBTV9FRVBST00sICJGYWlsZWQgdG8gZ2V0IHBhZ2UgcHJvZ3JhbSBkYXRhIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoc3BpX2Rldi0+c3BpX21hc3Rlci0+ZGV2Lm9mX25vZGUsCisJCSJzcGlvcC13ZW5hYmxlIiwgdG1wLCA1KTsKKwlpZiAoIXJjKSB7CisJCWNhbV9lZXByb21fc3BpX3BhcnNlX2NtZChzcGlfZGV2LCB3cml0ZV9lbmFibGUsIHRtcCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIGdldCB3cml0ZSBlbmFibGUgZGF0YSIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShzcGlfZGV2LT5zcGlfbWFzdGVyLT5kZXYub2Zfbm9kZSwKKwkJInNwaW9wLXJlYWRzdCIsIHRtcCwgNSk7CisJaWYgKCFyYykgeworCQljYW1fZWVwcm9tX3NwaV9wYXJzZV9jbWQoc3BpX2RldiwgcmVhZF9zdGF0dXMsIHRtcCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIGdldCByZWFkZHN0IGRhdGEiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoc3BpX2Rldi0+c3BpX21hc3Rlci0+ZGV2Lm9mX25vZGUsCisJCSJzcGlvcC1lcmFzZSIsIHRtcCwgNSk7CisJaWYgKCFyYykgeworCQljYW1fZWVwcm9tX3NwaV9wYXJzZV9jbWQoc3BpX2RldiwgZXJhc2UsIHRtcCk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIGdldCBlcmFzZSBkYXRhIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHNwaV9kZXYtPnNwaV9tYXN0ZXItPmRldi5vZl9ub2RlLAorCQkiZWVwcm9tLWlkIiwgdG1wLCAyKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIGdldCBlZXByb20gaWQiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNwaV9kZXYtPm1mcl9pZDAgPSB0bXBbMF07CisJc3BpX2Rldi0+ZGV2aWNlX2lkMCA9IHRtcFsxXTsKKworCXJldHVybiAwOworfQorCiAvKgogICogY2FtX2VlcHJvbV9wYXJzZV9tZW1vcnlfbWFwKCkgLSBwYXJzZSBtZW1vcnkgbWFwIGluIGRldmljZSBub2RlCiAgKiBAb2Y6ICAgICAgICAgZGV2aWNlIG5vZGUKQEAgLTEyMSwyMyArMjExLDcgQEAKIAlzdHJ1Y3QgY2FtX3NlbnNvcl9wb3dlcl9jdHJsX3QgKnBvd2VyX2luZm8gPSAmc29jX3ByaXZhdGUtPnBvd2VyX2luZm87CiAJc3RydWN0IGRldmljZV9ub2RlICAgICAgICAgICAgICpvZl9ub2RlID0gTlVMTDsKIAotCWlmIChlX2N0cmwtPmVlcHJvbV9kZXZpY2VfdHlwZSA9PSBNU01fQ0FNRVJBX1NQSV9ERVZJQ0UpCi0JCW9mX25vZGUgPSBlX2N0cmwtPmlvX21hc3Rlcl9pbmZvLgotCQkJc3BpX2NsaWVudC0+c3BpX21hc3Rlci0+ZGV2Lm9mX25vZGU7Ci0JZWxzZSBpZiAoZV9jdHJsLT5lZXByb21fZGV2aWNlX3R5cGUgPT0gTVNNX0NBTUVSQV9QTEFURk9STV9ERVZJQ0UpCi0JCW9mX25vZGUgPSBzb2NfaW5mby0+cGRldi0+ZGV2Lm9mX25vZGU7Ci0KLQlpZiAoIW9mX25vZGUpIHsKLQkJQ0FNX0VSUihDQU1fRUVQUk9NLCAib2Zfbm9kZSBpcyBOVUxMLCBkZXZpY2UgdHlwZSAlZCIsCi0JCQllX2N0cmwtPmVlcHJvbV9kZXZpY2VfdHlwZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IGNhbV9zb2NfdXRpbF9nZXRfZHRfcHJvcGVydGllcyhzb2NfaW5mbyk7Ci0JaWYgKHJjIDwgMCkgewotCQlDQU1fRVJSKENBTV9FRVBST00sICJjYW1fc29jX3V0aWxfZ2V0X2R0X3Byb3BlcnRpZXMgcmMgJWQiLAotCQkJcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQorCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOwogCiAJaWYgKGVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID09IGZhbHNlKSB7CiAJCXJjID0gY2FtX2dldF9kdF9wb3dlcl9zZXR0aW5nX2RhdGEob2Zfbm9kZSwKQEAgLTIwOSw4MyArMjgzLDMxIEBACiAvKioKICAqIEBlX2N0cmw6IGN0cmwgc3RydWN0dXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjYW1fZWVwcm9tX3NwaV9kcml2ZXJfcHJvYmUsIGl0IHBhcnNlcwotICogdGhlIGVlcHJvbSBkdCBub2RlIGFuZCBkZWNpZGVzIGZvciB1c2Vyc3BhY2Ugb3Iga2VybmVsIHByb2JlLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjYW1fZWVwcm9tX3BsYXRmb3JtL2kyYy9zcGlfZHJpdmVyX3Byb2JlCisgKiBpdCBwYXJzZXMgdGhlIGVlcHJvbSBkdCBub2RlIGFuZCBkZWNpZGVzIGZvciB1c2Vyc3BhY2Ugb3Iga2VybmVsIHByb2JlLgogICovCi1pbnQgY2FtX2VlcHJvbV9zcGlfZHJpdmVyX3NvY19pbml0KHN0cnVjdCBjYW1fZWVwcm9tX2N0cmxfdCAqZV9jdHJsKQotewotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOwotCXN0cnVjdCBjYW1fZWVwcm9tX3NvY19wcml2YXRlICAqc29jX3ByaXZhdGUgPQotCQkoc3RydWN0IGNhbV9lZXByb21fc29jX3ByaXZhdGUgKillX2N0cmwtPnNvY19pbmZvLnNvY19wcml2YXRlOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihlX2N0cmwtPnNwaS0+ZGV2Lm9mX25vZGUsICJjZWxsLWluZGV4IiwKLQkJJmVfY3RybC0+c3ViZGV2X2lkKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX0VFUFJPTSwgImZhaWxlZCByYyAlZCIsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGVfY3RybC0+c3BpLT5kZXYub2Zfbm9kZSwKLQkJImVlcHJvbS1uYW1lIiwgJnNvY19wcml2YXRlLT5lZXByb21fbmFtZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQgcmMgJWQiLCByYyk7Ci0JCWVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID0gdHJ1ZTsKLQl9Ci0KLQlDQU1fREJHKENBTV9FRVBST00sICJlZXByb20tbmFtZSAlcywgcmMgJWQiLCBzb2NfcHJpdmF0ZS0+ZWVwcm9tX25hbWUsCi0JCXJjKTsKLQlyYyA9IGNhbV9lZXByb21fY21tX2R0cyhzb2NfcHJpdmF0ZSwKLQkJZV9jdHJsLT5pb19tYXN0ZXJfaW5mby5zcGlfY2xpZW50LT5zcGlfbWFzdGVyLT5kZXYub2Zfbm9kZSk7Ci0JaWYgKHJjIDwgMCkKLQkJQ0FNX0RCRyhDQU1fRUVQUk9NLCAiTU0gZGF0YSBub3QgYXZhaWxhYmxlIHJjICVkIiwgcmMpOwotCXJjID0gY2FtX2VlcHJvbV9nZXRfZHRfZGF0YShlX2N0cmwpOwotCWlmIChyYyA8IDApCi0JCUNBTV9EQkcoQ0FNX0VFUFJPTSwgImZhaWxlZDogZWVwcm9tIGdldCBkdCBkYXRhIHJjICVkIiwgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIEBlX2N0cmw6IGN0cmwgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBjYW1fZWVwcm9tX3BsYXRmb3JtX2RyaXZlcl9wcm9iZSwgaXQgcGFyc2VzCi0gKiB0aGUgZWVwcm9tIGR0IG5vZGUgYW5kIGRlY2lkZXMgZm9yIHVzZXJzcGFjZSBvciBrZXJuZWwgcHJvYmUuCi0gKi8KLWludCBjYW1fZWVwcm9tX3BsYXRmb3JtX2RyaXZlcl9zb2NfaW5pdChzdHJ1Y3QgY2FtX2VlcHJvbV9jdHJsX3QgKmVfY3RybCkKK2ludCBjYW1fZWVwcm9tX3BhcnNlX2R0KHN0cnVjdCBjYW1fZWVwcm9tX2N0cmxfdCAqZV9jdHJsKQogewogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOwogCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICAgICAgICAqc29jX2luZm8gPSAmZV9jdHJsLT5zb2NfaW5mbzsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgICAgICAgICAgICAgKm9mX25vZGUgPSBOVUxMOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgICAgICAgICAqcGRldiA9IE5VTEw7CiAJc3RydWN0IGNhbV9lZXByb21fc29jX3ByaXZhdGUgICpzb2NfcHJpdmF0ZSA9CiAJCShzdHJ1Y3QgY2FtX2VlcHJvbV9zb2NfcHJpdmF0ZSAqKWVfY3RybC0+c29jX2luZm8uc29jX3ByaXZhdGU7CiAJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOwogCi0JaWYgKCFzb2NfaW5mby0+cGRldikgewotCQlDQU1fRVJSKENBTV9FRVBST00sICJFcnJvcjpzb2NfaW5mbyBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGRldiA9IHNvY19pbmZvLT5wZGV2OwotCW9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlpZiAoIW9mX25vZGUpIHsKLQkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiZGV2Lm9mX25vZGUgTlVMTCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJjZWxsLWluZGV4IiwKLQkJJmVfY3RybC0+c3ViZGV2X2lkKTsKKwlyYyA9IGNhbV9zb2NfdXRpbF9nZXRfZHRfcHJvcGVydGllcyhzb2NfaW5mbyk7CiAJaWYgKHJjIDwgMCkgewotCQlDQU1fRVJSKENBTV9FRVBST00sICJmYWlsZWQgcmMgJWRcbiIsIHJjKTsKKwkJQ0FNX0VSUihDQU1fRUVQUk9NLCAiRmFpbGVkIHRvIHJlYWQgRFQgcHJvcGVydGllcyByYyA6ICVkIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAiY2NpLW1hc3RlciIsCi0JCSZlX2N0cmwtPmNjaV9pMmNfbWFzdGVyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNBTV9EQkcoQ0FNX0VFUFJPTSwgImZhaWxlZCByYyAlZCIsIHJjKTsKLQkJcmV0dXJuIHJjOworCWlmICghc29jX2luZm8tPmRldikgeworCQlDQU1fRVJSKENBTV9FRVBST00sICJEZXYgaXMgTlVMTCIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlvZl9ub2RlID0gc29jX2luZm8tPmRldi0+b2Zfbm9kZTsKKwogCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcob2Zfbm9kZSwgImVlcHJvbS1uYW1lIiwKIAkJJnNvY19wcml2YXRlLT5lZXByb21fbmFtZSk7CiAJaWYgKHJjIDwgMCkgewpAQCAtMjkzLDExICszMTUsMjcgQEAKIAkJZV9jdHJsLT51c2Vyc3BhY2VfcHJvYmUgPSB0cnVlOwogCX0KIAorCWlmIChlX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlID09IENDSV9NQVNURVIpIHsKKwkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAiY2NpLW1hc3RlciIsCisJCQkmZV9jdHJsLT5jY2lfaTJjX21hc3Rlcik7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9EQkcoQ0FNX0VFUFJPTSwgImZhaWxlZCByYyAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCWlmIChlX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlID09IFNQSV9NQVNURVIpIHsKKwkJcmMgPSBjYW1fZWVwcm9tX2NtbV9kdHMoc29jX3ByaXZhdGUsIHNvY19pbmZvLT5kZXYtPm9mX25vZGUpOworCQlpZiAocmMgPCAwKQorCQkJQ0FNX0RCRyhDQU1fRUVQUk9NLCAiTU0gZGF0YSBub3QgYXZhaWxhYmxlIHJjICVkIiwgcmMpOworCX0KKwogCXJjID0gY2FtX2VlcHJvbV9nZXRfZHRfZGF0YShlX2N0cmwpOwogCWlmIChyYyA8IDApCiAJCUNBTV9EQkcoQ0FNX0VFUFJPTSwgImZhaWxlZDogZWVwcm9tIGdldCBkdCBkYXRhIHJjICVkIiwgcmMpOwogCi0JaWYgKGVfY3RybC0+dXNlcnNwYWNlX3Byb2JlID09IGZhbHNlKSB7CisJaWYgKChlX2N0cmwtPnVzZXJzcGFjZV9wcm9iZSA9PSBmYWxzZSkgJiYKKwkJCShlX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlICE9IFNQSV9NQVNURVIpKSB7CiAJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInNsYXZlLWFkZHIiLCAmdGVtcCk7CiAJCWlmIChyYyA8IDApCiAJCQlDQU1fREJHKENBTV9FRVBST00sICJmYWlsZWQ6IG5vIHNsYXZlLWFkZHIgcmMgJWQiLCByYyk7CkBAIC0zMTksNSArMzU3LDYgQEAKIAkJQ0FNX0RCRyhDQU1fRUVQUk9NLCAic2xhdmUtYWRkciA9IDB4JVgiLAogCQkJc29jX3ByaXZhdGUtPmkyY19pbmZvLnNsYXZlX2FkZHIpOwogCX0KKwogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fc29jLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2VlcHJvbS9jYW1fZWVwcm9tX3NvYy5oCmluZGV4IDAyZTU5ZDcuLmQzMTE1NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZWVwcm9tL2NhbV9lZXByb21fc29jLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9lZXByb20vY2FtX2VlcHJvbV9zb2MuaApAQCAtMTQsOSArMTQsMTAgQEAKIAogI2luY2x1ZGUgImNhbV9lZXByb21fZGV2LmgiCiAKK2ludCBjYW1fZWVwcm9tX3NwaV9wYXJzZV9vZihzdHJ1Y3QgY2FtX3NlbnNvcl9zcGlfY2xpZW50ICpjbGllbnQpOworCiBpbnQgY2FtX2VlcHJvbV9wYXJzZV9kdF9tZW1vcnlfbWFwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2YsCiAJc3RydWN0IGNhbV9lZXByb21fbWVtb3J5X2Jsb2NrX3QgKmRhdGEpOwogCi1pbnQgY2FtX2VlcHJvbV9wbGF0Zm9ybV9kcml2ZXJfc29jX2luaXQoc3RydWN0IGNhbV9lZXByb21fY3RybF90ICplX2N0cmwpOwotaW50IGNhbV9lZXByb21fc3BpX2RyaXZlcl9zb2NfaW5pdChzdHJ1Y3QgY2FtX2VlcHJvbV9jdHJsX3QgKmVfY3RybCk7CitpbnQgY2FtX2VlcHJvbV9wYXJzZV9kdChzdHJ1Y3QgY2FtX2VlcHJvbV9jdHJsX3QgKmVfY3RybCk7CiAjZW5kaWYvKiBfQ0FNX0VFUFJPTV9TT0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZmxhc2gvY2FtX2ZsYXNoX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZmxhc2gvY2FtX2ZsYXNoX2NvcmUuYwppbmRleCA3YWY3ZWZjLi5iMGZlMjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2ZsYXNoL2NhbV9mbGFzaF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9mbGFzaC9jYW1fZmxhc2hfY29yZS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJfQogCiAJc29jX3ByaXZhdGUgPSAoc3RydWN0IGNhbV9mbGFzaF9wcml2YXRlX3NvYyAqKQotCQkmZmxhc2hfY3RybC0+c29jX2luZm8uc29jX3ByaXZhdGU7CisJCWZsYXNoX2N0cmwtPnNvY19pbmZvLnNvY19wcml2YXRlOwogCiAJaWYgKG9wID09IENBTUVSQV9TRU5TT1JfRkxBU0hfT1BfRklSRUxPVykgewogCQlmb3IgKGkgPSAwOyBpIDwgZmxhc2hfY3RybC0+dG9yY2hfbnVtX3NvdXJjZXM7IGkrKykgewpAQCAtMzM0LDcgKzMzNCw4IEBACiAJCWZsYXNoX2RhdGEgPSAmZmN0cmwtPnBlcl9mcmFtZVtmcmFtZV9vZmZzZXRdOwogCiAJCWlmICgoZmxhc2hfZGF0YS0+b3Bjb2RlID09IENBTUVSQV9TRU5TT1JfRkxBU0hfT1BfRklSRUhJR0gpICYmCi0JCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIuaXNfc2V0dGluZ3NfdmFsaWQpKSB7CisJCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIuaXNfc2V0dGluZ3NfdmFsaWQpICYmCisJCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIucmVxdWVzdF9pZCA9PSByZXFfaWQpKSB7CiAJCQkvKiBUdXJuIE9uIEZsYXNoICovCiAJCQlpZiAoZmN0cmwtPmZsYXNoX3N0YXRlID09IENBTV9GTEFTSF9TVEFURV9JTklUKSB7CiAJCQkJcmMgPSBjYW1fZmxhc2hfaGlnaChmY3RybCwgZmxhc2hfZGF0YSk7CkBAIC0zNDgsOCArMzQ5LDkgQEAKIAkJCX0KIAkJfSBlbHNlIGlmICgoZmxhc2hfZGF0YS0+b3Bjb2RlID09CiAJCQlDQU1FUkFfU0VOU09SX0ZMQVNIX09QX0ZJUkVMT1cpICYmCi0JCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIuaXNfc2V0dGluZ3NfdmFsaWQpKSB7Ci0JCQkvKiBUdXJuIE9mZiBGbGFzaCAqLworCQkJKGZsYXNoX2RhdGEtPmNtbl9hdHRyLmlzX3NldHRpbmdzX3ZhbGlkKSAmJgorCQkJKGZsYXNoX2RhdGEtPmNtbl9hdHRyLnJlcXVlc3RfaWQgPT0gcmVxX2lkKSkgeworCQkJLyogVHVybiBPbiBUb3JjaCAqLwogCQkJaWYgKGZjdHJsLT5mbGFzaF9zdGF0ZSA9PSBDQU1fRkxBU0hfU1RBVEVfSU5JVCkgewogCQkJCXJjID0gY2FtX2ZsYXNoX2xvdyhmY3RybCwgZmxhc2hfZGF0YSk7CiAJCQkJaWYgKHJjKSB7CkBAIC0zNjEsNyArMzYzLDggQEAKIAkJCQlmY3RybC0+Zmxhc2hfc3RhdGUgPSBDQU1fRkxBU0hfU1RBVEVfTE9XOwogCQkJfQogCQl9IGVsc2UgaWYgKChmbGFzaF9kYXRhLT5vcGNvZGUgPT0gQ0FNRVJBX1NFTlNPUl9GTEFTSF9PUF9PRkYpICYmCi0JCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIuaXNfc2V0dGluZ3NfdmFsaWQpKSB7CisJCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIuaXNfc2V0dGluZ3NfdmFsaWQpICYmCisJCQkoZmxhc2hfZGF0YS0+Y21uX2F0dHIucmVxdWVzdF9pZCA9PSByZXFfaWQpKSB7CiAJCQlpZiAoKGZjdHJsLT5mbGFzaF9zdGF0ZSAhPSBDQU1fRkxBU0hfU1RBVEVfUkVMRUFTRSkgfHwKIAkJCQkoZmN0cmwtPmZsYXNoX3N0YXRlICE9IENBTV9GTEFTSF9TVEFURV9JTklUKSkgewogCQkJCXJjID0gY2FtX2ZsYXNoX29mZihmY3RybCk7CkBAIC0zNzQsMTAgKzM3Nyw3IEBACiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewotCQkJQ0FNX0VSUihDQU1fRkxBU0gsICJXcm9uZyBvcGNvZGUgOiAlZCIsCi0JCQkJZmxhc2hfZGF0YS0+b3Bjb2RlKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gYXBwbHlfc2V0dGluZ19lcnI7CisJCQlDQU1fREJHKENBTV9GTEFTSCwgIk5PUCBvcGNvZGU6IHJlcV9pZDogJXUiLCByZXFfaWQpOwogCQl9CiAJfQogCkBAIC00MjcsNyArNDI3LDE1IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQljc2xfcGFja2V0ID0gKHN0cnVjdCBjYW1fcGFja2V0ICopZ2VuZXJpY19wdHI7CisJaWYgKGNvbmZpZy5vZmZzZXQgPiBsZW5fb2ZfYnVmZmVyKSB7CisJCUNBTV9FUlIoQ0FNX0ZMQVNILAorCQkJIm9mZnNldCBpcyBvdXQgb2YgYm91bmRzOiBvZmZzZXQ6ICVsbGQgbGVuOiAlenUiLAorCQkJY29uZmlnLm9mZnNldCwgbGVuX29mX2J1ZmZlcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEFkZCBvZmZzZXQgdG8gdGhlIGZsYXNoIGNzbCBoZWFkZXIgKi8KKwljc2xfcGFja2V0ID0gKHN0cnVjdCBjYW1fcGFja2V0ICopKGdlbmVyaWNfcHRyICsgY29uZmlnLm9mZnNldCk7CiAKIAlzd2l0Y2ggKGNzbF9wYWNrZXQtPmhlYWRlci5vcF9jb2RlICYgMHhGRkZGRkYpIHsKIAljYXNlIENBTV9GTEFTSF9QQUNLRVRfT1BDT0RFX0lOSVQ6IHsKQEAgLTQ2Miw2ICs0NzAsMTkgQEAKIAkJCWNzbF9wYWNrZXQtPmNtZF9idWZfb2Zmc2V0KTsKIAkJZnJhbWVfb2Zmc2V0ID0gY3NsX3BhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQgJQogCQkJTUFYX1BFUl9GUkFNRV9BUlJBWTsKKwkJaWYgKGZjdHJsLT5wZXJfZnJhbWVbZnJhbWVfb2Zmc2V0XS5jbW5fYXR0ci5pc19zZXR0aW5nc192YWxpZAorCQkJPT0gdHJ1ZSkgeworCQkJZmN0cmwtPnBlcl9mcmFtZVtmcmFtZV9vZmZzZXRdLmNtbl9hdHRyLnJlcXVlc3RfaWQgPSAwOworCQkJZmN0cmwtPnBlcl9mcmFtZVtmcmFtZV9vZmZzZXRdLgorCQkJCWNtbl9hdHRyLmlzX3NldHRpbmdzX3ZhbGlkID0gZmFsc2U7CisJCQlmb3IgKGkgPSAwOworCQkJaSA8IGZjdHJsLT5wZXJfZnJhbWVbZnJhbWVfb2Zmc2V0XS5jbW5fYXR0ci5jb3VudDsKKwkJCWkrKykgeworCQkJCWZjdHJsLT5wZXJfZnJhbWVbZnJhbWVfb2Zmc2V0XS4KKwkJCQkJbGVkX2N1cnJlbnRfbWFbaV0gPSAwOworCQkJfQorCQl9CisKIAkJZmN0cmwtPnBlcl9mcmFtZVtmcmFtZV9vZmZzZXRdLmNtbl9hdHRyLnJlcXVlc3RfaWQgPQogCQkJY3NsX3BhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQ7CiAJCWZjdHJsLT5wZXJfZnJhbWVbZnJhbWVfb2Zmc2V0XS5jbW5fYXR0ci5pc19zZXR0aW5nc192YWxpZCA9CkBAIC00NzEsNiArNDkyLDEwIEBACiAJCQkodWludDY0X3QgKikmZ2VuZXJpY19wdHIsICZsZW5fb2ZfYnVmZmVyKTsKIAkJY21kX2J1ZiA9ICh1aW50MzJfdCAqKSgodWludDhfdCAqKWdlbmVyaWNfcHRyICsKIAkJCWNtZF9kZXNjLT5vZmZzZXQpOworCisJCWlmICghY21kX2J1ZikKKwkJCXJldHVybiAtRUlOVkFMOworCiAJCWNtbl9oZHIgPSAoc3RydWN0IGNvbW1vbl9oZWFkZXIgKiljbWRfYnVmOwogCiAJCXN3aXRjaCAoY21uX2hkci0+Y21kX3R5cGUpIHsKQEAgLTQ3OSw2ICs1MDQsMTEgQEAKIAkJCQkiQ0FNRVJBX0ZMQVNIX0NNRF9UWVBFX09QUyBjYXNlIGNhbGxlZCIpOwogCQkJZmxhc2hfb3BlcmF0aW9uX2luZm8gPQogCQkJCShzdHJ1Y3QgY2FtX2ZsYXNoX3NldF9vbl9vZmYgKikgY21kX2J1ZjsKKwkJCWlmICghZmxhc2hfb3BlcmF0aW9uX2luZm8pIHsKKwkJCQlDQU1fRVJSKENBTV9GTEFTSCwgImZsYXNoX29wZXJhdGlvbl9pbmZvIE51bGwiKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwogCQkJZmN0cmwtPnBlcl9mcmFtZVtmcmFtZV9vZmZzZXRdLm9wY29kZSA9CiAJCQkJZmxhc2hfb3BlcmF0aW9uX2luZm8tPm9wY29kZTsKIAkJCWZjdHJsLT5wZXJfZnJhbWVbZnJhbWVfb2Zmc2V0XS5jbW5fYXR0ci5jb3VudCA9CkBAIC00OTQsNyArNTI0LDYgQEAKIAkJCQljbW5faGRyLT5jbWRfdHlwZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCiAJCWJyZWFrOwogCX0KIAljYXNlIENBTV9GTEFTSF9QQUNLRVRfT1BDT0RFX05PTl9SRUFMVElNRV9TRVRfT1BTOiB7CkBAIC01ODgsNiArNjE3LDggQEAKIAkJYnJlYWs7CiAJfQogCWNhc2UgQ0FNX1BLVF9OT1BfT1BDT0RFOiB7CisJCUNBTV9EQkcoQ0FNX0ZMQVNILCAiTk9QIFBhY2tldCBpcyBSZWNlaXZlZDogcmVxX2lkOiAldSIsCisJCQljc2xfcGFja2V0LT5oZWFkZXIucmVxdWVzdF9pZCk7CiAJCWdvdG8gdXBkYXRlX3JlcV9tZ3I7CiAJfQogCWRlZmF1bHQ6CkBAIC02MDMsNiArNjM0LDEzIEBACiAJCWFkZF9yZXEubGlua19oZGwgPSBmY3RybC0+YnJpZGdlX2ludGYubGlua19oZGw7CiAJCWFkZF9yZXEucmVxX2lkID0gY3NsX3BhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQ7CiAJCWFkZF9yZXEuZGV2X2hkbCA9IGZjdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsOworCisJCWlmICgoY3NsX3BhY2tldC0+aGVhZGVyLm9wX2NvZGUgJiAweEZGRkZGKSA9PQorCQkJQ0FNX0ZMQVNIX1BBQ0tFVF9PUENPREVfU0VUX09QUykKKwkJCWFkZF9yZXEuc2tpcF9iZWZvcmVfYXBwbHlpbmcgPSAxOworCQllbHNlCisJCQlhZGRfcmVxLnNraXBfYmVmb3JlX2FwcGx5aW5nID0gMDsKKwogCQlpZiAoZmN0cmwtPmJyaWRnZV9pbnRmLmNybV9jYiAmJgogCQkJZmN0cmwtPmJyaWRnZV9pbnRmLmNybV9jYi0+YWRkX3JlcSkKIAkJCWZjdHJsLT5icmlkZ2VfaW50Zi5jcm1fY2ItPmFkZF9yZXEoJmFkZF9yZXEpOwpAQCAtNjE3LDYgKzY1NSw3IEBACiAJaW5mby0+ZGV2X2lkID0gQ0FNX1JFUV9NR1JfREVWSUNFX0ZMQVNIOwogCXN0cmxjcHkoaW5mby0+bmFtZSwgQ0FNX0ZMQVNIX05BTUUsIHNpemVvZihpbmZvLT5uYW1lKSk7CiAJaW5mby0+cF9kZWxheSA9IENBTV9GTEFTSF9QSVBFTElORV9ERUxBWTsKKwlpbmZvLT50cmlnZ2VyID0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX2ZsYXNoL2NhbV9mbGFzaF9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZmxhc2gvY2FtX2ZsYXNoX2Rldi5jCmluZGV4IDMyZGYyZjEuLmQ3NDNjZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZmxhc2gvY2FtX2ZsYXNoX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fZmxhc2gvY2FtX2ZsYXNoX2Rldi5jCkBAIC05Myw3ICs5Myw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIENBTV9RVUVSWV9DQVA6IHsKLQkJc3RydWN0IGNhbV9mbGFzaF9xdWVyeV9jYXBfaW5mbyBmbGFzaF9jYXA7CisJCXN0cnVjdCBjYW1fZmxhc2hfcXVlcnlfY2FwX2luZm8gZmxhc2hfY2FwID0gezB9OwogCiAJCUNBTV9EQkcoQ0FNX0ZMQVNILCAiQ0FNX1FVRVJZX0NBUCIpOwogCQlmbGFzaF9jYXAuc2xvdF9pbmZvID0gZmN0cmwtPnNvY19pbmZvLmluZGV4OwpAQCAtMjg2LDYgKzI4Niw4IEBACiAKIAlmbGFzaF9jdHJsLT5wZGV2ID0gcGRldjsKIAlmbGFzaF9jdHJsLT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlmbGFzaF9jdHJsLT5zb2NfaW5mby5kZXYgPSAmcGRldi0+ZGV2OworCWZsYXNoX2N0cmwtPnNvY19pbmZvLmRldl9uYW1lID0gcGRldi0+bmFtZTsKIAogCXJjID0gY2FtX2ZsYXNoX2dldF9kdF9kYXRhKGZsYXNoX2N0cmwsICZmbGFzaF9jdHJsLT5zb2NfaW5mbyk7CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWQyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fY3Bhcy9pbmNsdWRlCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pbworY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fcmVxX21ncgorY2NmbGFncy15ICs9IC1JZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9jY2kKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdS8KKworb2JqLSQoQ09ORklHX1NQRUNUUkFfQ0FNRVJBKSArPSBjYW1fb2lzX2Rldi5vIGNhbV9vaXNfY29yZS5vIGNhbV9vaXNfc29jLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL2NhbV9vaXNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyODNhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL2NhbV9vaXNfY29yZS5jCkBAIC0wLDAgKzEsNTk0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8Y2FtX3NlbnNvcl9jbW5faGVhZGVyLmg+CisjaW5jbHVkZSAiY2FtX29pc19jb3JlLmgiCisjaW5jbHVkZSAiY2FtX29pc19zb2MuaCIKKyNpbmNsdWRlICJjYW1fc2Vuc29yX3V0aWwuaCIKKyNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgorCisvKioKKyAqIGNhbV9vaXNfZ2V0X2Rldl9oYW5kbGUgLSBnZXQgZGV2aWNlIGhhbmRsZQorICogQG9fY3RybDogICAgIGN0cmwgc3RydWN0dXJlCisgKiBAYXJnOiAgICAgICAgQ2FtZXJhIGNvbnRyb2wgY29tbWFuZCBhcmd1bWVudAorICoKKyAqIFJldHVybnMgc3VjY2VzcyBvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgY2FtX29pc19nZXRfZGV2X2hhbmRsZShzdHJ1Y3QgY2FtX29pc19jdHJsX3QgKm9fY3RybCwKKwl2b2lkICphcmcpCit7CisJc3RydWN0IGNhbV9zZW5zb3JfYWNxdWlyZV9kZXYgICAgb2lzX2FjcV9kZXY7CisJc3RydWN0IGNhbV9jcmVhdGVfZGV2X2hkbCAgICAgICAgYnJpZGdlX3BhcmFtczsKKwlzdHJ1Y3QgY2FtX2NvbnRyb2wgICAgICAgICAgICAgICpjbWQgPSAoc3RydWN0IGNhbV9jb250cm9sICopYXJnOworCisJaWYgKG9fY3RybC0+YnJpZGdlX2ludGYuZGV2aWNlX2hkbCAhPSAtMSkgeworCQlDQU1fRVJSKENBTV9PSVMsICJEZXZpY2UgaXMgYWxyZWFkeSBhY3F1aXJlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZvaXNfYWNxX2RldiwgKHZvaWQgX191c2VyICopIGNtZC0+aGFuZGxlLAorCQlzaXplb2Yob2lzX2FjcV9kZXYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlicmlkZ2VfcGFyYW1zLnNlc3Npb25faGRsID0gb2lzX2FjcV9kZXYuc2Vzc2lvbl9oYW5kbGU7CisJYnJpZGdlX3BhcmFtcy5vcHMgPSAmb19jdHJsLT5icmlkZ2VfaW50Zi5vcHM7CisJYnJpZGdlX3BhcmFtcy52NGwyX3N1Yl9kZXZfZmxhZyA9IDA7CisJYnJpZGdlX3BhcmFtcy5tZWRpYV9lbnRpdHlfZmxhZyA9IDA7CisJYnJpZGdlX3BhcmFtcy5wcml2ID0gb19jdHJsOworCisJb2lzX2FjcV9kZXYuZGV2aWNlX2hhbmRsZSA9CisJCWNhbV9jcmVhdGVfZGV2aWNlX2hkbCgmYnJpZGdlX3BhcmFtcyk7CisJb19jdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsID0gb2lzX2FjcV9kZXYuZGV2aWNlX2hhbmRsZTsKKwlvX2N0cmwtPmJyaWRnZV9pbnRmLnNlc3Npb25faGRsID0gb2lzX2FjcV9kZXYuc2Vzc2lvbl9oYW5kbGU7CisKKwlDQU1fREJHKENBTV9PSVMsICJEZXZpY2UgSGFuZGxlOiAlZCIsIG9pc19hY3FfZGV2LmRldmljZV9oYW5kbGUpOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGNtZC0+aGFuZGxlLCAmb2lzX2FjcV9kZXYsCisJCXNpemVvZihzdHJ1Y3QgY2FtX3NlbnNvcl9hY3F1aXJlX2RldikpKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgIkFDUVVJUkVfREVWOiBjb3B5IHRvIHVzZXIgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW1fb2lzX3ZyZWdfY29udHJvbChzdHJ1Y3QgY2FtX29pc19jdHJsX3QgKm9fY3RybCwKKwlpbnQgY29uZmlnKQoreworCWludCByYyA9IDAsIGNudDsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICAqc29jX2luZm87CisKKwlzb2NfaW5mbyA9ICZvX2N0cmwtPnNvY19pbmZvOworCWNudCA9IHNvY19pbmZvLT5udW1fcmdsdHI7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY250ID49IENBTV9TT0NfTUFYX1JFR1VMQVRPUikgeworCQlDQU1fRVJSKENBTV9PSVMsICJSZWd1bGF0b3JzIG1vcmUgdGhhbiBzdXBwb3J0ZWQgJWQiLCBjbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29uZmlnKQorCQlyYyA9IGNhbV9zb2NfdXRpbF9lbmFibGVfcGxhdGZvcm1fcmVzb3VyY2Uoc29jX2luZm8sIGZhbHNlLCAwLAorCQkJZmFsc2UpOworCWVsc2UKKwkJcmMgPSBjYW1fc29jX3V0aWxfZGlzYWJsZV9wbGF0Zm9ybV9yZXNvdXJjZShzb2NfaW5mbywgZmFsc2UsCisJCQlmYWxzZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX29pc19wb3dlcl91cChzdHJ1Y3QgY2FtX29pc19jdHJsX3QgKm9fY3RybCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICpzb2NfaW5mbyA9CisJCSZvX2N0cmwtPnNvY19pbmZvOworCXN0cnVjdCBtc21fY2FtZXJhX2dwaW9fbnVtX2luZm8gKmdwaW9fbnVtX2luZm8gPSBOVUxMOworCisJcmMgPSBjYW1fb2lzX3ZyZWdfY29udHJvbChvX2N0cmwsIDEpOworCWlmIChyYyA8IDApIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiT0lTIFJlZyBGYWlsZWQgJWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlncGlvX251bV9pbmZvID0gb19jdHJsLT5ncGlvX251bV9pbmZvOworCisJaWYgKHNvY19pbmZvLT5ncGlvX2RhdGEgJiYKKwkJZ3Bpb19udW1faW5mbyAmJgorCQlncGlvX251bV9pbmZvLT52YWxpZFtTRU5TT1JfVkFGXSA9PSAxKSB7CisJCXJjID0gY2FtX3NvY191dGlsX3JlcXVlc3RfcGxhdGZvcm1fcmVzb3VyY2UoJm9fY3RybC0+c29jX2luZm8sCisJCQlOVUxMLCBOVUxMKTsKKwkJcmMgPSBjYW1fc29jX3V0aWxfZW5hYmxlX3BsYXRmb3JtX3Jlc291cmNlKCZvX2N0cmwtPnNvY19pbmZvLAorCQkJZmFsc2UsIDAsIGZhbHNlKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fT0lTLCAiRmFpbGVkIGluIHJlcSBncGlvOiAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKAorCQkJZ3Bpb19udW1faW5mby0+Z3Bpb19udW1bU0VOU09SX1ZBRl0sCisJCQkxKTsKKwl9CisKKwkvKiBWUkVHIG5lZWRzIHNvbWUgZGVsYXkgdG8gcG93ZXIgdXAgKi8KKwl1c2xlZXBfcmFuZ2UoMjAwMCwgMjA1MCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2FtX29pc19wb3dlcl9kb3duKHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqb19jdHJsKQoreworCWludDMyX3QgcmMgPSAwOworCXN0cnVjdCBjYW1faHdfc29jX2luZm8gKnNvY19pbmZvID0KKwkJJm9fY3RybC0+c29jX2luZm87CisJc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19udW1faW5mbyAqZ3Bpb19udW1faW5mbyA9IE5VTEw7CisKKwlyYyA9IGNhbV9vaXNfdnJlZ19jb250cm9sKG9fY3RybCwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgJWQiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWdwaW9fbnVtX2luZm8gPSBvX2N0cmwtPmdwaW9fbnVtX2luZm87CisKKwlpZiAoc29jX2luZm8tPmdwaW9fZGF0YSAmJgorCQlncGlvX251bV9pbmZvICYmCisJCWdwaW9fbnVtX2luZm8tPnZhbGlkW1NFTlNPUl9WQUZdID09IDEpIHsKKworCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCgKKwkJCWdwaW9fbnVtX2luZm8tPmdwaW9fbnVtW1NFTlNPUl9WQUZdLAorCQkJR1BJT0ZfT1VUX0lOSVRfTE9XKTsKKworCQlyYyA9IGNhbV9zb2NfdXRpbF9yZWxlYXNlX3BsYXRmb3JtX3Jlc291cmNlKCZvX2N0cmwtPnNvY19pbmZvKTsKKwkJcmMgfD0gY2FtX3NvY191dGlsX2Rpc2FibGVfcGxhdGZvcm1fcmVzb3VyY2UoJm9fY3RybC0+c29jX2luZm8sCisJCQkJCTAsIDApOworCQlpZiAocmMgPCAwKQorCQkJQ0FNX0VSUihDQU1fT0lTLAorCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBwbGF0Zm9ybSByZXNvdXJjZXM6ICVkIiwgcmMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fb2lzX2FwcGx5X3NldHRpbmdzKHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqb19jdHJsLAorCXN0cnVjdCBpMmNfc2V0dGluZ3NfYXJyYXkgKmkyY19zZXQpCit7CisJc3RydWN0IGkyY19zZXR0aW5nc19saXN0ICppMmNfbGlzdDsKKwlpbnQzMl90IHJjID0gMDsKKwl1aW50MzJfdCBpLCBzaXplOworCisJaWYgKG9fY3RybCA9PSBOVUxMIHx8IGkyY19zZXQgPT0gTlVMTCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJJbnZhbGlkIEFyZ3MiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGkyY19zZXQtPmlzX3NldHRpbmdzX3ZhbGlkICE9IDEpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiIEludmFsaWQgc2V0dGluZ3MiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpMmNfbGlzdCwKKwkJJihpMmNfc2V0LT5saXN0X2hlYWQpLCBsaXN0KSB7CisJCWlmIChpMmNfbGlzdC0+b3BfY29kZSA9PSAgQ0FNX1NFTlNPUl9JMkNfV1JJVEVfUkFORE9NKSB7CisJCQlyYyA9IGNhbWVyYV9pb19kZXZfd3JpdGUoJihvX2N0cmwtPmlvX21hc3Rlcl9pbmZvKSwKKwkJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlDQU1fRVJSKENBTV9PSVMsCisJCQkJCSJGYWlsZWQgaW4gQXBwbHlpbmcgaTJjIHdydCBzZXR0aW5ncyIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfSBlbHNlIGlmIChpMmNfbGlzdC0+b3BfY29kZSA9PSBDQU1fU0VOU09SX0kyQ19QT0xMKSB7CisJCQlzaXplID0gaTJjX2xpc3QtPmkyY19zZXR0aW5ncy5zaXplOworCQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCXJjID0gY2FtZXJhX2lvX2Rldl9wb2xsKAorCQkJCQkmKG9fY3RybC0+aW9fbWFzdGVyX2luZm8pLAorCQkJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLgorCQkJCQkJcmVnX3NldHRpbmdbaV0ucmVnX2FkZHIsCisJCQkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCisJCQkJCQlyZWdfc2V0dGluZ1tpXS5yZWdfZGF0YSwKKwkJCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCQkJCXJlZ19zZXR0aW5nW2ldLmRhdGFfbWFzaywKKwkJCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy5hZGRyX3R5cGUsCisJCQkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuZGF0YV90eXBlLAorCQkJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLgorCQkJCQkJcmVnX3NldHRpbmdbaV0uZGVsYXkpOworCQkJCWlmIChyYyA8IDApIHsKKwkJCQkJQ0FNX0VSUihDQU1fT0lTLAorCQkJCQkJImkyYyBwb2xsIGFwcGx5IHNldHRpbmcgRmFpbCIpOworCQkJCQlyZXR1cm4gcmM7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNhbV9vaXNfc2xhdmVJbmZvX3BrdF9wYXJzZXIoc3RydWN0IGNhbV9vaXNfY3RybF90ICpvX2N0cmwsCisJdWludDMyX3QgKmNtZF9idWYpCit7CisJaW50MzJfdCByYyA9IDA7CisJc3RydWN0IGNhbV9jbWRfb2lzX2luZm8gKm9pc19pbmZvOworCisJaWYgKCFvX2N0cmwgfHwgIWNtZF9idWYpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiSW52YWxpZCBBcmdzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9pc19pbmZvID0gKHN0cnVjdCBjYW1fY21kX29pc19pbmZvICopY21kX2J1ZjsKKwlpZiAob19jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9PSBDQ0lfTUFTVEVSKSB7CisJCW9fY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudC0+aTJjX2ZyZXFfbW9kZSA9CisJCQlvaXNfaW5mby0+aTJjX2ZyZXFfbW9kZTsKKwkJb19jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50LT5zaWQgPQorCQkJb2lzX2luZm8tPnNsYXZlX2FkZHIgPj4gMTsKKwkJb19jdHJsLT5vaXNfZndfZmxhZyA9IG9pc19pbmZvLT5vaXNfZndfZmxhZzsKKwkJb19jdHJsLT5pc19vaXNfY2FsaWIgPSBvaXNfaW5mby0+aXNfb2lzX2NhbGliOworCQltZW1jcHkob19jdHJsLT5vaXNfbmFtZSwgb2lzX2luZm8tPm9pc19uYW1lLCAzMik7CisJCW9fY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudC0+cmV0cmllcyA9IDM7CisJCW9fY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudC0+aWRfbWFwID0gMDsKKwkJbWVtY3B5KCYob19jdHJsLT5vcGNvZGUpLCAmKG9pc19pbmZvLT5vcGNvZGUpLAorCQkJc2l6ZW9mKHN0cnVjdCBjYW1fb2lzX29wY29kZSkpOworCQlDQU1fREJHKENBTV9PSVMsICJTbGF2ZSBhZGRyOiAweCV4IEZyZXEgTW9kZTogJWQiLAorCQkJb2lzX2luZm8tPnNsYXZlX2FkZHIsIG9pc19pbmZvLT5pMmNfZnJlcV9tb2RlKTsKKwl9IGVsc2UgaWYgKG9fY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPT0gSTJDX01BU1RFUikgeworCQlvX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudC0+YWRkciA9IG9pc19pbmZvLT5zbGF2ZV9hZGRyOworCQlDQU1fREJHKENBTV9PSVMsICJTbGF2ZSBhZGRyOiAweCV4Iiwgb2lzX2luZm8tPnNsYXZlX2FkZHIpOworCX0gZWxzZSB7CisJCUNBTV9FUlIoQ0FNX09JUywgIkludmFsaWQgTWFzdGVyIHR5cGUgOiAlZCIsCisJCQlvX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fb2lzX2Z3X2Rvd25sb2FkKHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqb19jdHJsKQoreworCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYnl0ZXMgPSAwOworCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gTlVMTDsKKwlpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMCwgY250OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAgICAgICAgICAgICAqZncgPSBOVUxMOworCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAqZndfbmFtZV9wcm9nID0gTlVMTDsKKwljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgKmZ3X25hbWVfY29lZmYgPSBOVUxMOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9wcm9nWzMyXSA9IHswfTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfY29lZmZbMzJdID0gezB9OworCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICAgICAgICAgICAqZGV2ID0gJihvX2N0cmwtPnBkZXYtPmRldik7CisJc3RydWN0IGNhbV9zZW5zb3JfaTJjX3JlZ19zZXR0aW5nICBpMmNfcmVnX3NldHRpbmc7CisKKwlpZiAoIW9fY3RybCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJJbnZhbGlkIEFyZ3MiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25wcmludGYobmFtZV9jb2VmZiwgMzIsICIlcy5jb2VmZiIsIG9fY3RybC0+b2lzX25hbWUpOworCisJc25wcmludGYobmFtZV9wcm9nLCAzMiwgIiVzLnByb2ciLCBvX2N0cmwtPm9pc19uYW1lKTsKKworCS8qIGNhc3QgcG9pbnRlciBhcyBjb25zdCBwb2ludGVyKi8KKwlmd19uYW1lX3Byb2cgPSBuYW1lX3Byb2c7CisJZndfbmFtZV9jb2VmZiA9IG5hbWVfY29lZmY7CisKKwkvKiBMb2FkIEZXICovCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZV9wcm9nLCBkZXYpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgdG8gbG9jYXRlICVzIiwgZndfbmFtZV9wcm9nKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXRvdGFsX2J5dGVzID0gZnctPnNpemU7CisJaTJjX3JlZ19zZXR0aW5nLmFkZHJfdHlwZSA9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfQllURTsKKwlpMmNfcmVnX3NldHRpbmcuZGF0YV90eXBlID0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFOworCWkyY19yZWdfc2V0dGluZy5zaXplID0gdG90YWxfYnl0ZXM7CisJaTJjX3JlZ19zZXR0aW5nLnJlZ19zZXR0aW5nID0gKHN0cnVjdCBjYW1fc2Vuc29yX2kyY19yZWdfYXJyYXkgKikKKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9zZW5zb3JfaTJjX3JlZ19hcnJheSkgKiB0b3RhbF9ieXRlcywKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmNfcmVnX3NldHRpbmcucmVnX3NldHRpbmcpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiRmFpbGVkIGluIGFsbG9jYXRpbmcgaTJjX2FycmF5Iik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGNudCA9IDAsIHB0ciA9ICh1aW50OF90ICopZnctPmRhdGE7IGNudCA8IHRvdGFsX2J5dGVzOworCQljbnQrKywgcHRyKyspIHsKKwkJaTJjX3JlZ19zZXR0aW5nLnJlZ19zZXR0aW5nW2NudF0ucmVnX2FkZHIgPQorCQkJb19jdHJsLT5vcGNvZGUucHJvZzsKKwkJaTJjX3JlZ19zZXR0aW5nLnJlZ19zZXR0aW5nW2NudF0ucmVnX2RhdGEgPSAqcHRyOworCQlpMmNfcmVnX3NldHRpbmcucmVnX3NldHRpbmdbY250XS5kZWxheSA9IDA7CisJCWkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZ1tjbnRdLmRhdGFfbWFzayA9IDA7CisJfQorCisJcmMgPSBjYW1lcmFfaW9fZGV2X3dyaXRlX2NvbnRpbnVvdXMoJihvX2N0cmwtPmlvX21hc3Rlcl9pbmZvKSwKKwkJJmkyY19yZWdfc2V0dGluZywgMSk7CisJaWYgKHJjIDwgMCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJPSVMgRlcgZG93bmxvYWQgZmFpbGVkICVkIiwgcmMpOworCQlnb3RvIHJlbGVhc2VfZmlybXdhcmU7CisJfQorCWtmcmVlKGkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZyk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lX2NvZWZmLCBkZXYpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgdG8gbG9jYXRlICVzIiwgZndfbmFtZV9jb2VmZik7CisJCXJldHVybiByYzsKKwl9CisKKwl0b3RhbF9ieXRlcyA9IGZ3LT5zaXplOworCWkyY19yZWdfc2V0dGluZy5hZGRyX3R5cGUgPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX0JZVEU7CisJaTJjX3JlZ19zZXR0aW5nLmRhdGFfdHlwZSA9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfQllURTsKKwlpMmNfcmVnX3NldHRpbmcuc2l6ZSA9IHRvdGFsX2J5dGVzOworCWkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZyA9IChzdHJ1Y3QgY2FtX3NlbnNvcl9pMmNfcmVnX2FycmF5ICopCisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fc2Vuc29yX2kyY19yZWdfYXJyYXkpICogdG90YWxfYnl0ZXMsCisJCUdGUF9LRVJORUwpOworCWlmICghaTJjX3JlZ19zZXR0aW5nLnJlZ19zZXR0aW5nKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgIkZhaWxlZCBpbiBhbGxvY2F0aW5nIGkyY19hcnJheSIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChjbnQgPSAwLCBwdHIgPSAodWludDhfdCAqKWZ3LT5kYXRhOyBjbnQgPCB0b3RhbF9ieXRlczsKKwkJY250KyssIHB0cisrKSB7CisJCWkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZ1tjbnRdLnJlZ19hZGRyID0KKwkJCW9fY3RybC0+b3Bjb2RlLmNvZWZmOworCQlpMmNfcmVnX3NldHRpbmcucmVnX3NldHRpbmdbY250XS5yZWdfZGF0YSA9ICpwdHI7CisJCWkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZ1tjbnRdLmRlbGF5ID0gMDsKKwkJaTJjX3JlZ19zZXR0aW5nLnJlZ19zZXR0aW5nW2NudF0uZGF0YV9tYXNrID0gMDsKKwl9CisKKwlyYyA9IGNhbWVyYV9pb19kZXZfd3JpdGVfY29udGludW91cygmKG9fY3RybC0+aW9fbWFzdGVyX2luZm8pLAorCQkmaTJjX3JlZ19zZXR0aW5nLCAxKTsKKwlpZiAocmMgPCAwKQorCQlDQU1fRVJSKENBTV9PSVMsICJPSVMgRlcgZG93bmxvYWQgZmFpbGVkICVkIiwgcmMpOworCityZWxlYXNlX2Zpcm13YXJlOgorCWtmcmVlKGkyY19yZWdfc2V0dGluZy5yZWdfc2V0dGluZyk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogY2FtX29pc19wa3RfcGFyc2UgLSBQYXJzZSBjc2wgcGFja2V0CisgKiBAb19jdHJsOiAgICAgY3RybCBzdHJ1Y3R1cmUKKyAqIEBhcmc6ICAgICAgICBDYW1lcmEgY29udHJvbCBjb21tYW5kIGFyZ3VtZW50CisgKgorICogUmV0dXJucyBzdWNjZXNzIG9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBjYW1fb2lzX3BrdF9wYXJzZShzdHJ1Y3QgY2FtX29pc19jdHJsX3QgKm9fY3RybCwgdm9pZCAqYXJnKQoreworCWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworCXVpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY19wdHI7CisJc3RydWN0IGNhbV9jb250cm9sICAgICAgICAgICAgICppb2N0bF9jdHJsID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2NvbmZpZ19kZXZfY21kICAgICAgIGRldl9jb25maWc7CisJc3RydWN0IGkyY19zZXR0aW5nc19hcnJheSAgICAgICppMmNfcmVnX3NldHRpbmdzID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAgICAgICAgKmNtZF9kZXNjID0gTlVMTDsKKwl1aW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNfcGt0X2FkZHI7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuOworCXN0cnVjdCBjYW1fcGFja2V0ICAgICAgICAgICAgICAqY3NsX3BhY2tldCA9IE5VTEw7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5fb2ZfYnVmZiA9IDA7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBOVUxMLCAqY21kX2J1ZjsKKworCWlvY3RsX2N0cmwgPSAoc3RydWN0IGNhbV9jb250cm9sICopYXJnOworCWlmIChjb3B5X2Zyb21fdXNlcigmZGV2X2NvbmZpZywgKHZvaWQgX191c2VyICopIGlvY3RsX2N0cmwtPmhhbmRsZSwKKwkJc2l6ZW9mKGRldl9jb25maWcpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmMgPSBjYW1fbWVtX2dldF9jcHVfYnVmKGRldl9jb25maWcucGFja2V0X2hhbmRsZSwKKwkJKHVpbnQ2NF90ICopJmdlbmVyaWNfcGt0X2FkZHIsICZwa3RfbGVuKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLAorCQkJImVycm9yIGluIGNvbnZlcnRpbmcgY29tbWFuZCBIYW5kbGUgRXJyb3I6ICVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKGRldl9jb25maWcub2Zmc2V0ID4gcGt0X2xlbikgeworCQlDQU1fRVJSKENBTV9PSVMsCisJCQkib2Zmc2V0IGlzIG91dCBvZiBib3VuZDogb2ZmOiAlbGxkIGxlbjogJXp1IiwKKwkJCWRldl9jb25maWcub2Zmc2V0LCBwa3RfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3NsX3BhY2tldCA9IChzdHJ1Y3QgY2FtX3BhY2tldCAqKQorCQkoZ2VuZXJpY19wa3RfYWRkciArIGRldl9jb25maWcub2Zmc2V0KTsKKwlzd2l0Y2ggKGNzbF9wYWNrZXQtPmhlYWRlci5vcF9jb2RlICYgMHhGRkZGRkYpIHsKKwljYXNlIENBTV9PSVNfUEFDS0VUX09QQ09ERV9JTklUOgorCQlvZmZzZXQgPSAodWludDMyX3QgKikmY3NsX3BhY2tldC0+cGF5bG9hZDsKKwkJb2Zmc2V0ICs9IChjc2xfcGFja2V0LT5jbWRfYnVmX29mZnNldCAvIHNpemVvZih1aW50MzJfdCkpOworCQljbWRfZGVzYyA9IChzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqKShvZmZzZXQpOworCisJCWlmICgoY3NsX3BhY2tldC0+bnVtX2NtZF9idWYgPCAyKSAmJgorCQkJKGNzbF9wYWNrZXQtPm51bV9jbWRfYnVmID4gMykpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgIndyb25nIGNtZCBCdWZmZXIgY291bnQ6ICVkIiwKKwkJCQljc2xfcGFja2V0LT5udW1fY21kX2J1Zik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJjID0gY2FtX21lbV9nZXRfY3B1X2J1ZihjbWRfZGVzY1swXS5tZW1faGFuZGxlLAorCQkJKHVpbnQ2NF90ICopJmdlbmVyaWNfcHRyLCAmbGVuX29mX2J1ZmYpOworCQlpZiAocmMgPCAwKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgdG8gZ2V0IGNwdSBidWYiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWNtZF9idWYgPSAodWludDMyX3QgKilnZW5lcmljX3B0cjsKKwkJY21kX2J1ZiArPSBjbWRfZGVzYy0+b2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KTsKKwkJcmMgPSBjYW1fb2lzX3NsYXZlSW5mb19wa3RfcGFyc2VyKG9fY3RybCwgY21kX2J1Zik7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgIkZhaWxlZCBpbiBwYXJzaW5nIHRoZSBwa3QiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWNtZF9idWYgKz0gKHNpemVvZihzdHJ1Y3QgY2FtX2NtZF9pMmNfaW5mbykvc2l6ZW9mKHVpbnQzMl90KSk7CisKKwkJaTJjX3JlZ19zZXR0aW5ncyA9ICYob19jdHJsLT5pMmNfaW5pdF9kYXRhKTsKKwkJaTJjX3JlZ19zZXR0aW5ncy0+aXNfc2V0dGluZ3NfdmFsaWQgPSAxOworCQlpMmNfcmVnX3NldHRpbmdzLT5yZXF1ZXN0X2lkID0gMDsKKwkJcmMgPSBjYW1fc2Vuc29yX2kyY19wa3RfcGFyc2VyKGkyY19yZWdfc2V0dGluZ3MsCisJCQkmY21kX2Rlc2NbMV0sIDEpOworCQlpZiAocmMgPCAwKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJPSVMgcGt0IHBhcnNpbmcgZmFpbGVkOiAlZCIsCisJCQkJcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKG9fY3RybC0+aXNfb2lzX2NhbGliKSB7CisJCQlpMmNfcmVnX3NldHRpbmdzID0gJihvX2N0cmwtPmkyY19jYWxpYl9kYXRhKTsKKwkJCWkyY19yZWdfc2V0dGluZ3MtPmlzX3NldHRpbmdzX3ZhbGlkID0gMTsKKwkJCWkyY19yZWdfc2V0dGluZ3MtPnJlcXVlc3RfaWQgPSAwOworCQkJcmMgPSBjYW1fc2Vuc29yX2kyY19wa3RfcGFyc2VyKGkyY19yZWdfc2V0dGluZ3MsCisJCQkJJmNtZF9kZXNjWzJdLCAxKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlDQU1fRVJSKENBTV9PSVMsCisJCQkJCSJPSVMgcGt0IHBhcnNpbmcgZmFpbGVkOiAlZCIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU1fT0lTX1BBQ0tFVF9PUENPREVfT0lTX0NPTlRST0w6CisJCW9mZnNldCA9ICh1aW50MzJfdCAqKSZjc2xfcGFja2V0LT5wYXlsb2FkOworCQlvZmZzZXQgKz0gKGNzbF9wYWNrZXQtPmNtZF9idWZfb2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJCWNtZF9kZXNjID0gKHN0cnVjdCBjYW1fY21kX2J1Zl9kZXNjICopKG9mZnNldCk7CisJCWkyY19yZWdfc2V0dGluZ3MgPSAmKG9fY3RybC0+aTJjX21vZGVfZGF0YSk7CisJCWkyY19yZWdfc2V0dGluZ3MtPmlzX3NldHRpbmdzX3ZhbGlkID0gMTsKKwkJaTJjX3JlZ19zZXR0aW5ncy0+cmVxdWVzdF9pZCA9IDA7CisJCXJjID0gY2FtX3NlbnNvcl9pMmNfcGt0X3BhcnNlcihpMmNfcmVnX3NldHRpbmdzLAorCQkJY21kX2Rlc2MsIDEpOworCQlpZiAocmMgPCAwKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJPSVMgcGt0IHBhcnNpbmcgZmFpbGVkOiAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJjID0gY2FtX29pc19hcHBseV9zZXR0aW5ncyhvX2N0cmwsIGkyY19yZWdfc2V0dGluZ3MpOworCQlpZiAocmMgPCAwKQorCQkJQ0FNX0VSUihDQU1fT0lTLCAiQ2Fubm90IGFwcGx5IG1vZGUgc2V0dGluZ3MiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworLyoqCisgKiBjYW1fb2lzX2RyaXZlcl9jbWQgLSBIYW5kbGUgb2lzIGNtZHMKKyAqIEBlX2N0cmw6ICAgICBjdHJsIHN0cnVjdHVyZQorICogQGFyZzogICAgICAgIENhbWVyYSBjb250cm9sIGNvbW1hbmQgYXJndW1lbnQKKyAqCisgKiBSZXR1cm5zIHN1Y2Nlc3Mgb3IgZmFpbHVyZQorICovCitpbnQgY2FtX29pc19kcml2ZXJfY21kKHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqb19jdHJsLCB2b2lkICphcmcpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKwlzdHJ1Y3QgY2FtX29pc19xdWVyeV9jYXBfdCAgICAgb2lzX2NhcCA9IHswfTsKKwlzdHJ1Y3QgY2FtX2NvbnRyb2wgICAgICAgICAgICAqY21kID0gKHN0cnVjdCBjYW1fY29udHJvbCAqKWFyZzsKKworCWlmICghb19jdHJsKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgImVfY3RybCBpcyBOVUxMIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJihvX2N0cmwtPm9pc19tdXRleCkpOworCXN3aXRjaCAoY21kLT5vcF9jb2RlKSB7CisJY2FzZSBDQU1fUVVFUllfQ0FQOgorCQlvaXNfY2FwLnNsb3RfaW5mbyA9IG9fY3RybC0+c29jX2luZm8uaW5kZXg7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgY21kLT5oYW5kbGUsCisJCQkmb2lzX2NhcCwKKwkJCXNpemVvZihzdHJ1Y3QgY2FtX29pc19xdWVyeV9jYXBfdCkpKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgQ29weSB0byBVc2VyIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwkJfQorCQlDQU1fREJHKENBTV9PSVMsICJvaXNfY2FwOiBJRDogJWQiLCBvaXNfY2FwLnNsb3RfaW5mbyk7CisJCWJyZWFrOworCWNhc2UgQ0FNX0FDUVVJUkVfREVWOgorCQlyYyA9IGNhbV9vaXNfZ2V0X2Rldl9oYW5kbGUob19jdHJsLCBhcmcpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgIkZhaWxlZCB0byBhY3F1aXJlIGRldiIpOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisJCWJyZWFrOworCWNhc2UgQ0FNX1NUQVJUX0RFVjoKKwkJcmMgPSBjYW1fb2lzX3Bvd2VyX3VwKG9fY3RybCk7CisJCWlmIChyYykgeworCQkJQ0FNX0VSUihDQU1fT0lTLCAiIE9JUyBQb3dlciB1cCBmYWlsZWQiKTsKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwkJfQorCQlyYyA9IGNhbWVyYV9pb19pbml0KCZvX2N0cmwtPmlvX21hc3Rlcl9pbmZvKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJjY2lfaW5pdCBmYWlsZWQiKTsKKwkJCWdvdG8gcHdyX2R3bjsKKwkJfQorCisJCWlmIChvX2N0cmwtPm9pc19md19mbGFnKSB7CisJCQlyYyA9IGNhbV9vaXNfZndfZG93bmxvYWQob19jdHJsKTsKKwkJCWlmIChyYykgeworCQkJCUNBTV9FUlIoQ0FNX09JUywgIkZhaWxlZCBPSVMgRlcgRG93bmxvYWQiKTsKKwkJCQlnb3RvIHB3cl9kd247CisJCQl9CisJCX0KKworCQlyYyA9IGNhbV9vaXNfYXBwbHlfc2V0dGluZ3Mob19jdHJsLCAmb19jdHJsLT5pMmNfaW5pdF9kYXRhKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fT0lTLCAiQ2Fubm90IGFwcGx5IEluaXQgc2V0dGluZ3MiKTsKKwkJCWdvdG8gcHdyX2R3bjsKKwkJfQorCisJCWlmIChvX2N0cmwtPmlzX29pc19jYWxpYikgeworCQkJcmMgPSBjYW1fb2lzX2FwcGx5X3NldHRpbmdzKG9fY3RybCwKKwkJCQkmb19jdHJsLT5pMmNfY2FsaWJfZGF0YSk7CisJCQlpZiAocmMpIHsKKwkJCQlDQU1fRVJSKENBTV9PSVMsICJDYW5ub3QgYXBwbHkgY2FsaWIgZGF0YSIpOworCQkJCWdvdG8gcHdyX2R3bjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIENBTV9DT05GSUdfREVWOgorCQlyYyA9IGNhbV9vaXNfcGt0X3BhcnNlKG9fY3RybCwgYXJnKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9PSVMsICJGYWlsZWQgaW4gb2lzIHBrdCBQYXJzaW5nIik7CisJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDQU1fUkVMRUFTRV9ERVY6CisJCWlmIChvX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPT0gLTEpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgImxpbmsgaGRsOiAlZCBkZXZpY2UgaGRsOiAlZCIsCisJCQkJb19jdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsLAorCQkJCW9fY3RybC0+YnJpZGdlX2ludGYubGlua19oZGwpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisJCXJjID0gY2FtX2Rlc3Ryb3lfZGV2aWNlX2hkbChvX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwpOworCQlpZiAocmMgPCAwKQorCQkJQ0FNX0VSUihDQU1fT0lTLCAiZGVzdHJveWluZyB0aGUgZGV2aWNlIGhkbCIpOworCQlvX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGwgPSAtMTsKKwkJb19jdHJsLT5icmlkZ2VfaW50Zi5saW5rX2hkbCA9IC0xOworCQlvX2N0cmwtPmJyaWRnZV9pbnRmLnNlc3Npb25faGRsID0gLTE7CisJCWJyZWFrOworCWNhc2UgQ0FNX1NUT1BfREVWOgorCQlyYyA9IGNhbWVyYV9pb19yZWxlYXNlKCZvX2N0cmwtPmlvX21hc3Rlcl9pbmZvKTsKKwkJaWYgKHJjIDwgMCkKKwkJCUNBTV9FUlIoQ0FNX09JUywgIkZhaWxlZCBpbiByZWxlYXNpbmcgQ0NJIik7CisJCXJjID0gY2FtX29pc19wb3dlcl9kb3duKG9fY3RybCk7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgIk9JUyBQb3dlciBkb3duIGZhaWxlZCIpOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNBTV9FUlIoQ0FNX09JUywgImludmFsaWQgb3Bjb2RlIik7CisJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwl9Citwd3JfZHduOgorCWNhbV9vaXNfcG93ZXJfZG93bihvX2N0cmwpOworcmVsZWFzZV9tdXRleDoKKwltdXRleF91bmxvY2soJihvX2N0cmwtPm9pc19tdXRleCkpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19jb3JlLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCnJlbmFtZSB0byBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX2NvcmUuaAppbmRleCBiYzFjZDllLi4xM2RhODJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19jb3JlLmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC04LDE1ICs4LDEzIEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KLSNpZm5kZWYgX19EU1BfREVCVUdfSF8KLSNkZWZpbmUgX19EU1BfREVCVUdfSF8KKyNpZm5kZWYgX0NBTV9PSVNfQ09SRV9IXworI2RlZmluZSBfQ0FNX09JU19DT1JFX0hfCiAKLXR5cGVkZWYgaW50ICgqZHNwX3N0YXRlX2NiKShpbnQgc3RhdGUpOwotaW50IGRzcF9kZWJ1Z19yZWdpc3Rlcihkc3Bfc3RhdGVfY2IgcHRyKTsKKyNpbmNsdWRlICJjYW1fb2lzX2Rldi5oIgogCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSEVEICAgICAgICAgMHgwCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSF9EVU1QX0RPTkUgMHgxCitpbnQgY2FtX29pc19kcml2ZXJfY21kKHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqZV9jdHJsLCB2b2lkICphcmcpOwogCiAjZW5kaWYKKy8qIF9DQU1fT0lTX0NPUkVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL2NhbV9vaXNfZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYWIzODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX2Rldi5jCkBAIC0wLDAgKzEsMzYyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImNhbV9vaXNfZGV2LmgiCisjaW5jbHVkZSAiY2FtX3JlcV9tZ3JfZGV2LmgiCisjaW5jbHVkZSAiY2FtX29pc19zb2MuaCIKKyNpbmNsdWRlICJjYW1fb2lzX2NvcmUuaCIKKyNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgorCitzdGF0aWMgbG9uZyBjYW1fb2lzX3N1YmRldl9pb2N0bChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHJjICAgICA9IDA7CisJc3RydWN0IGNhbV9vaXNfY3RybF90ICpvX2N0cmwgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfQ0FNX0NPTlRST0w6CisJCXJjID0gY2FtX29pc19kcml2ZXJfY21kKG9fY3RybCwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludDMyX3QgY2FtX29pc191cGRhdGVfaTJjX2luZm8oc3RydWN0IGNhbV9vaXNfY3RybF90ICpvX2N0cmwsCisJc3RydWN0IGNhbV9vaXNfaTJjX2luZm9fdCAqaTJjX2luZm8pCit7CisJc3RydWN0IGNhbV9zZW5zb3JfY2NpX2NsaWVudCAgICAgICAgKmNjaV9jbGllbnQgPSBOVUxMOworCisJaWYgKG9fY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPT0gQ0NJX01BU1RFUikgeworCQljY2lfY2xpZW50ID0gb19jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50OworCQlpZiAoIWNjaV9jbGllbnQpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywgImZhaWxlZDogY2NpX2NsaWVudCAlcEsiLAorCQkJCWNjaV9jbGllbnQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY2NpX2NsaWVudC0+Y2NpX2kyY19tYXN0ZXIgPSBvX2N0cmwtPmNjaV9pMmNfbWFzdGVyOworCQljY2lfY2xpZW50LT5zaWQgPSAoaTJjX2luZm8tPnNsYXZlX2FkZHIpID4+IDE7CisJCWNjaV9jbGllbnQtPnJldHJpZXMgPSAzOworCQljY2lfY2xpZW50LT5pZF9tYXAgPSAwOworCQljY2lfY2xpZW50LT5pMmNfZnJlcV9tb2RlID0gaTJjX2luZm8tPmkyY19mcmVxX21vZGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBjYW1fb2lzX2luaXRfc3ViZGV2X2RvX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNhbV9jb250cm9sIGNtZF9kYXRhOworCWludDMyX3QgcmMgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWRfZGF0YSwgKHZvaWQgX191c2VyICopYXJnLAorCQlzaXplb2YoY21kX2RhdGEpKSkgeworCQlDQU1fRVJSKENBTV9PSVMsCisJCQkiRmFpbGVkIHRvIGNvcHkgZnJvbSB1c2VyX3B0cj0lcEsgc2l6ZT0lenUiLAorCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kX2RhdGEpKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19DQU1fQ09OVFJPTDoKKwkJcmMgPSBjYW1fb2lzX3N1YmRldl9pb2N0bChzZCwgY21kLCAmY21kX2RhdGEpOworCQlpZiAocmMpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywKKwkJCQkiRmFpbGVkIGluIG9pcyBzdWRkZXYgaGFuZGxpbmcgcmMgJWQiLAorCQkJCXJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlDQU1fRVJSKENBTV9PSVMsICJJbnZhbGlkIGNvbXBhdCBpb2N0bDogJWQiLCBjbWQpOworCQlyYyA9IC1FSU5WQUw7CisJfQorCisJaWYgKCFyYykgeworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNtZF9kYXRhLAorCQkJc2l6ZW9mKGNtZF9kYXRhKSkpIHsKKwkJCUNBTV9FUlIoQ0FNX09JUywKKwkJCQkiRmFpbGVkIHRvIGNvcHkgZnJvbSB1c2VyX3B0cj0lcEsgc2l6ZT0lenUiLAorCQkJCSh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNtZF9kYXRhKSk7CisJCQlyYyA9IC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIGNhbV9vaXNfaW50ZXJuYWxfb3BzOworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGNhbV9vaXNfc3ViZGV2X2NvcmVfb3BzID0geworCS5pb2N0bCA9IGNhbV9vaXNfc3ViZGV2X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsMzIgPSBjYW1fb2lzX2luaXRfc3ViZGV2X2RvX2lvY3RsLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBjYW1fb2lzX3N1YmRldl9vcHMgPSB7CisJLmNvcmUgPSAmY2FtX29pc19zdWJkZXZfY29yZV9vcHMsCit9OworCitzdGF0aWMgaW50IGNhbV9vaXNfaW5pdF9zdWJkZXZfcGFyYW0oc3RydWN0IGNhbV9vaXNfY3RybF90ICpvX2N0cmwpCit7CisJaW50IHJjID0gMDsKKworCW9fY3RybC0+djRsMl9kZXZfc3RyLmludGVybmFsX29wcyA9ICZjYW1fb2lzX2ludGVybmFsX29wczsKKwlvX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPSAmY2FtX29pc19zdWJkZXZfb3BzOworCXN0cmxjcHkob19jdHJsLT5kZXZpY2VfbmFtZSwgQ0FNX09JU19OQU1FLAorCQlzaXplb2Yob19jdHJsLT5kZXZpY2VfbmFtZSkpOworCW9fY3RybC0+djRsMl9kZXZfc3RyLm5hbWUgPSBvX2N0cmwtPmRldmljZV9uYW1lOworCW9fY3RybC0+djRsMl9kZXZfc3RyLnNkX2ZsYWdzID0KKwkJKFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFIHwgVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyk7CisJb19jdHJsLT52NGwyX2Rldl9zdHIuZW50X2Z1bmN0aW9uID0gQ0FNX09JU19ERVZJQ0VfVFlQRTsKKwlvX2N0cmwtPnY0bDJfZGV2X3N0ci50b2tlbiA9IG9fY3RybDsKKworCXJjID0gY2FtX3JlZ2lzdGVyX3N1YmRldigmKG9fY3RybC0+djRsMl9kZXZfc3RyKSk7CisJaWYgKHJjKQorCQlDQU1fRVJSKENBTV9PSVMsICJmYWlsIHRvIGNyZWF0ZSBzdWJkZXYiKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fb2lzX2kyY19kcml2ZXJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworCXN0cnVjdCBjYW1fb2lzX2N0cmxfdCAgICAgICAqb19jdHJsID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX29pc19zb2NfcHJpdmF0ZSAgKnNvY19wcml2YXRlID0gTlVMTDsKKworCWlmIChjbGllbnQgPT0gTlVMTCB8fCBpZCA9PSBOVUxMKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgIkludmFsaWQgQXJncyBjbGllbnQ6ICVwSyBpZDogJXBLIiwKKwkJCWNsaWVudCwgaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQlDQU1fRVJSKENBTV9PSVMsICJpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWQiKTsKKwkJZ290byBwcm9iZV9mYWlsdXJlOworCX0KKworCW9fY3RybCA9IGt6YWxsb2Moc2l6ZW9mKCpvX2N0cmwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9fY3RybCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJremFsbG9jIGZhaWxlZCIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gcHJvYmVfZmFpbHVyZTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBvX2N0cmwpOworCisJb19jdHJsLT5zb2NfaW5mby5kZXYgPSAmY2xpZW50LT5kZXY7CisJb19jdHJsLT5zb2NfaW5mby5kZXZfbmFtZSA9IGNsaWVudC0+bmFtZTsKKwlvX2N0cmwtPm9pc19kZXZpY2VfdHlwZSA9IE1TTV9DQU1FUkFfSTJDX0RFVklDRTsKKwlvX2N0cmwtPmlvX21hc3Rlcl9pbmZvLm1hc3Rlcl90eXBlID0gSTJDX01BU1RFUjsKKwlvX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudCA9IGNsaWVudDsKKworCXNvY19wcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9vaXNfc29jX3ByaXZhdGUpLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNvY19wcml2YXRlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvY3RybF9mcmVlOworCX0KKworCW9fY3RybC0+c29jX2luZm8uc29jX3ByaXZhdGUgPSBzb2NfcHJpdmF0ZTsKKwlyYyA9IGNhbV9vaXNfZHJpdmVyX3NvY19pbml0KG9fY3RybCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgImZhaWxlZDogY2FtX3NlbnNvcl9wYXJzZV9kdCByYyAlZCIsIHJjKTsKKwkJZ290byBvY3RybF9mcmVlOworCX0KKworCXJjID0gY2FtX29pc19pbml0X3N1YmRldl9wYXJhbShvX2N0cmwpOworCWlmIChyYykKKwkJZ290byBvY3RybF9mcmVlOworCisJcmV0dXJuIHJjOworCitvY3RybF9mcmVlOgorCWtmcmVlKG9fY3RybCk7Citwcm9iZV9mYWlsdXJlOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fb2lzX2kyY19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGNhbV9vaXNfY3RybF90ICAgICAgICpvX2N0cmwgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmICghb19jdHJsKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgIm9pcyBkZXZpY2UgaXMgTlVMTCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZnJlZShvX2N0cmwtPnNvY19pbmZvLnNvY19wcml2YXRlKTsKKwlrZnJlZShvX2N0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IGNhbV9vaXNfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisJc3RydWN0IGNhbV9vaXNfY3RybF90ICAgICAgICAgICpvX2N0cmwgPSBOVUxMOworCXN0cnVjdCBjYW1fb2lzX3NvY19wcml2YXRlICAgICAqc29jX3ByaXZhdGUgPSBOVUxMOworCisJb19jdHJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9vaXNfY3RybF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvX2N0cmwpCisJCXJldHVybiAtRU5PTUVNOworCisJb19jdHJsLT5zb2NfaW5mby5wZGV2ID0gcGRldjsKKwlvX2N0cmwtPnNvY19pbmZvLmRldiA9ICZwZGV2LT5kZXY7CisJb19jdHJsLT5zb2NfaW5mby5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CisKKwlvX2N0cmwtPm9pc19kZXZpY2VfdHlwZSA9IE1TTV9DQU1FUkFfUExBVEZPUk1fREVWSUNFOworCisJb19jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9IENDSV9NQVNURVI7CisJb19jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50ID0ga3phbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCBjYW1fc2Vuc29yX2NjaV9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9fY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudCkKKwkJZ290byBmcmVlX29fY3RybDsKKworCXNvY19wcml2YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhbV9vaXNfc29jX3ByaXZhdGUpLAorCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNvY19wcml2YXRlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2NjaV9jbGllbnQ7CisJfQorCW9fY3RybC0+c29jX2luZm8uc29jX3ByaXZhdGUgPSBzb2NfcHJpdmF0ZTsKKworCUlOSVRfTElTVF9IRUFEKCYob19jdHJsLT5pMmNfaW5pdF9kYXRhLmxpc3RfaGVhZCkpOworCUlOSVRfTElTVF9IRUFEKCYob19jdHJsLT5pMmNfY2FsaWJfZGF0YS5saXN0X2hlYWQpKTsKKwlJTklUX0xJU1RfSEVBRCgmKG9fY3RybC0+aTJjX21vZGVfZGF0YS5saXN0X2hlYWQpKTsKKwltdXRleF9pbml0KCYob19jdHJsLT5vaXNfbXV0ZXgpKTsKKwlyYyA9IGNhbV9vaXNfZHJpdmVyX3NvY19pbml0KG9fY3RybCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgImZhaWxlZDogc29jIGluaXQgcmMgJWQiLCByYyk7CisJCWdvdG8gZnJlZV9zb2M7CisJfQorCisJcmMgPSBjYW1fb2lzX2luaXRfc3ViZGV2X3BhcmFtKG9fY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGZyZWVfc29jOworCisJcmMgPSBjYW1fb2lzX3VwZGF0ZV9pMmNfaW5mbyhvX2N0cmwsICZzb2NfcHJpdmF0ZS0+aTJjX2luZm8pOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9PSVMsICJmYWlsZWQ6IHRvIHVwZGF0ZSBpMmMgaW5mbyByYyAlZCIsIHJjKTsKKwkJZ290byB1bnJlZ19zdWJkZXY7CisJfQorCW9fY3RybC0+YnJpZGdlX2ludGYuZGV2aWNlX2hkbCA9IC0xOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgb19jdHJsKTsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKCZvX2N0cmwtPnY0bDJfZGV2X3N0ci5zZCwgb19jdHJsKTsKKworCXJldHVybiByYzsKK3VucmVnX3N1YmRldjoKKwljYW1fdW5yZWdpc3Rlcl9zdWJkZXYoJihvX2N0cmwtPnY0bDJfZGV2X3N0cikpOworZnJlZV9zb2M6CisJa2ZyZWUoc29jX3ByaXZhdGUpOworZnJlZV9jY2lfY2xpZW50OgorCWtmcmVlKG9fY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudCk7CitmcmVlX29fY3RybDoKKwlrZnJlZShvX2N0cmwpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjYW1fb2lzX3BsYXRmb3JtX2RyaXZlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2FtX29pc19jdHJsX3QgICpvX2N0cmw7CisKKwlvX2N0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIW9fY3RybCkgeworCQlDQU1fRVJSKENBTV9PSVMsICJvaXMgZGV2aWNlIGlzIE5VTEwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2ZyZWUob19jdHJsLT5zb2NfaW5mby5zb2NfcHJpdmF0ZSk7CisJa2ZyZWUob19jdHJsLT5pb19tYXN0ZXJfaW5mby5jY2lfY2xpZW50KTsKKwlrZnJlZShvX2N0cmwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjYW1fb2lzX2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG9pcyIgfSwKKwl7IH0KK307CisKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2FtX29pc19kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNhbV9vaXNfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInFjb20sb2lzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGNhbV9vaXNfZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBjYW1fb2lzX3BsYXRmb3JtX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gY2FtX29pc19wbGF0Zm9ybV9kcml2ZXJfcmVtb3ZlLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBjYW1fb2lzX2kyY19pZFtdID0geworCXsgIm1zbV9vaXMiLCAoa2VybmVsX3Vsb25nX3QpTlVMTH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgY2FtX29pc19pMmNfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGNhbV9vaXNfaTJjX2lkLAorCS5wcm9iZSAgPSBjYW1fb2lzX2kyY19kcml2ZXJfcHJvYmUsCisJLnJlbW92ZSA9IGNhbV9vaXNfaTJjX2RyaXZlcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXNtX29pcyIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FtX29pc19yZWdpc3RlcmVkX2RyaXZlcl90IHJlZ2lzdGVyZWRfZHJpdmVyID0geworCTAsIDB9OworCitzdGF0aWMgaW50IF9faW5pdCBjYW1fb2lzX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjYW1fb2lzX3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgInBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlciBmYWlsZWQgcmMgPSAlZCIsCisJCQlyYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3RlcmVkX2RyaXZlci5wbGF0Zm9ybV9kcml2ZXIgPSAxOworCisJcmMgPSBpMmNfYWRkX2RyaXZlcigmY2FtX29pc19pMmNfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiaTJjX2FkZF9kcml2ZXIgZmFpbGVkIHJjID0gJWQiLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3RlcmVkX2RyaXZlci5pMmNfZHJpdmVyID0gMTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjYW1fb2lzX2RyaXZlcl9leGl0KHZvaWQpCit7CisJaWYgKHJlZ2lzdGVyZWRfZHJpdmVyLnBsYXRmb3JtX2RyaXZlcikKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNhbV9vaXNfcGxhdGZvcm1fZHJpdmVyKTsKKworCWlmIChyZWdpc3RlcmVkX2RyaXZlci5pMmNfZHJpdmVyKQorCQlpMmNfZGVsX2RyaXZlcigmY2FtX29pc19pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2FtX29pc19kcml2ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChjYW1fb2lzX2RyaXZlcl9leGl0KTsKK01PRFVMRV9ERVNDUklQVElPTigiQ0FNIE9JUyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL2NhbV9vaXNfZGV2LmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGI2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX2Rldi5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX0NBTV9PSVNfREVWX0hfCisjZGVmaW5lIF9DQU1fT0lTX0RFVl9IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9jYW1fc2Vuc29yLmg+CisjaW5jbHVkZSA8Y2FtX3NlbnNvcl9pMmMuaD4KKyNpbmNsdWRlIDxjYW1fc2Vuc29yX3NwaS5oPgorI2luY2x1ZGUgPGNhbV9zZW5zb3JfaW8uaD4KKyNpbmNsdWRlIDxjYW1fY2NpX2Rldi5oPgorI2luY2x1ZGUgPGNhbV9yZXFfbWdyX3V0aWwuaD4KKyNpbmNsdWRlIDxjYW1fcmVxX21ncl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjYW1fbWVtX21nci5oPgorI2luY2x1ZGUgPGNhbV9zdWJkZXYuaD4KKyNpbmNsdWRlICJjYW1fc29jX3V0aWwuaCIKKworI2RlZmluZSBERUZJTkVfTVNNX01VVEVYKG11dGV4bmFtZSkgXAorCXN0YXRpYyBzdHJ1Y3QgbXV0ZXggbXV0ZXhuYW1lID0gX19NVVRFWF9JTklUSUFMSVpFUihtdXRleG5hbWUpCisKKy8qKgorICogc3RydWN0IGNhbV9vaXNfcmVnaXN0ZXJlZF9kcml2ZXJfdCAtIHJlZ2lzdGVyZWQgZHJpdmVyIGluZm8KKyAqIEBwbGF0Zm9ybV9kcml2ZXIgICAgICA6ICAgZmxhZyBpbmRpY2F0ZXMgaWYgcGxhdGZvcm0gZHJpdmVyIGlzIHJlZ2lzdGVyZWQKKyAqIEBpMmNfZHJpdmVyICAgICAgICAgICA6ICAgZmxhZyBpbmRpY2F0ZXMgaWYgaTJjIGRyaXZlciBpcyByZWdpc3RlcmVkCisgKgorICovCitzdHJ1Y3QgY2FtX29pc19yZWdpc3RlcmVkX2RyaXZlcl90IHsKKwlib29sIHBsYXRmb3JtX2RyaXZlcjsKKwlib29sIGkyY19kcml2ZXI7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fb2lzX2kyY19pbmZvX3QgLSBJMkMgaW5mbworICogQHNsYXZlX2FkZHIgICAgICA6ICAgc2xhdmUgYWRkcmVzcworICogQGkyY19mcmVxX21vZGUgICA6ICAgaTJjIGZyZXF1ZW5jeSBtb2RlCisgKgorICovCitzdHJ1Y3QgY2FtX29pc19pMmNfaW5mb190IHsKKwl1aW50MTZfdCBzbGF2ZV9hZGRyOworCXVpbnQ4X3QgaTJjX2ZyZXFfbW9kZTsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9vaXNfc29jX3ByaXZhdGUgLSBvaXMgc29jIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBvaXNfbmFtZSAgICAgICAgOiAgIG9pcyBuYW1lCisgKiBAaTJjX2luZm8gICAgICAgIDogICBpMmMgaW5mbyBzdHJ1Y3R1cmUKKyAqIEBwb3dlcl9pbmZvICAgICAgOiAgIG9pcyBwb3dlciBpbmZvCisgKgorICovCitzdHJ1Y3QgY2FtX29pc19zb2NfcHJpdmF0ZSB7CisJY29uc3QgY2hhciAqb2lzX25hbWU7CisJc3RydWN0IGNhbV9vaXNfaTJjX2luZm9fdCBpMmNfaW5mbzsKKwlzdHJ1Y3QgY2FtX3NlbnNvcl9wb3dlcl9jdHJsX3QgcG93ZXJfaW5mbzsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9vaXNfaW50Zl9wYXJhbXMgLSBicmlkZ2UgaW50ZXJmYWNlIHBhcmFtcworICogQGRldmljZV9oZGwgICA6IERldmljZSBIYW5kbGUKKyAqIEBzZXNzaW9uX2hkbCAgOiBTZXNzaW9uIEhhbmRsZQorICogQG9wcyAgICAgICAgICA6IEtNRCBvcGVyYXRpb25zCisgKiBAY3JtX2NiICAgICAgIDogQ2FsbGJhY2sgQVBJIHBvaW50ZXJzCisgKi8KK3N0cnVjdCBjYW1fb2lzX2ludGZfcGFyYW1zIHsKKwlpbnQzMl90IGRldmljZV9oZGw7CisJaW50MzJfdCBzZXNzaW9uX2hkbDsKKwlpbnQzMl90IGxpbmtfaGRsOworCXN0cnVjdCBjYW1fcmVxX21ncl9rbWRfb3BzIG9wczsKKwlzdHJ1Y3QgY2FtX3JlcV9tZ3JfY3JtX2NiICpjcm1fY2I7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAtIE9JUyBjdHJsIHByaXZhdGUgZGF0YQorICogQHBkZXYgICAgICAgICAgICA6ICAgcGxhdGZvcm0gZGV2aWNlCisgKiBAb2lzX211dGV4ICAgICAgIDogICBvaXMgbXV0ZXgKKyAqIEBzb2NfaW5mbyAgICAgICAgOiAgIG9pcyBzb2MgcmVsYXRlZCBpbmZvCisgKiBAaW9fbWFzdGVyX2luZm8gIDogICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tbXVuaWNhdGlvbiBtYXN0ZXIKKyAqIEBncGlvX251bV9pbmZvICAgOiAgIGdwaW8gaW5mbworICogQGNjaV9pMmNfbWFzdGVyICA6ICAgSTJDIHN0cnVjdHVyZQorICogQHY0bDJfZGV2X3N0ciAgICA6ICAgVjRMMiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAYnJpZGdlX2ludGYgICAgIDogICBicmlkZ2UgaW50ZXJmYWNlIHBhcmFtcworICogQGkyY19pbml0X2RhdGEgICA6ICAgb2lzIGkyYyBpbml0IHNldHRpbmdzCisgKiBAaTJjX21vZGVfZGF0YSAgIDogICBvaXMgaTJjIG1vZGUgc2V0dGluZ3MKKyAqIEBpMmNfY2FsaWJfZGF0YSAgOiAgIG9pcyBpMmMgY2FsaWIgc2V0dGluZ3MKKyAqIEBvaXNfZGV2aWNlX3R5cGUgOiAgIG9pcyBkZXZpY2UgdHlwZQorICogQG9pc19uYW1lICAgICAgICA6ICAgb2lzIG5hbWUKKyAqIEBvaXNfZndfZmxhZyAgICAgOiAgIGZsYWcgZm9yIGZpcm13YXJlIGRvd25sb2FkCisgKiBAaXNfb2lzX2NhbGliICAgIDogICBmbGFnIGZvciBDYWxpYnJhdGlvbiBkYXRhCisgKiBAb3Bjb2RlICAgICAgICAgIDogICBvaXMgb3Bjb2RlCisgKiBAZGV2aWNlX25hbWUgICAgIDogICBEZXZpY2UgbmFtZQorICoKKyAqLworc3RydWN0IGNhbV9vaXNfY3RybF90IHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBtdXRleCBvaXNfbXV0ZXg7CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyBzb2NfaW5mbzsKKwlzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciBpb19tYXN0ZXJfaW5mbzsKKwlzdHJ1Y3QgbXNtX2NhbWVyYV9ncGlvX251bV9pbmZvICpncGlvX251bV9pbmZvOworCWVudW0gY2NpX2kyY19tYXN0ZXJfdCBjY2lfaTJjX21hc3RlcjsKKwlzdHJ1Y3QgY2FtX3N1YmRldiB2NGwyX2Rldl9zdHI7CisJc3RydWN0IGNhbV9vaXNfaW50Zl9wYXJhbXMgYnJpZGdlX2ludGY7CisJc3RydWN0IGkyY19zZXR0aW5nc19hcnJheSBpMmNfaW5pdF9kYXRhOworCXN0cnVjdCBpMmNfc2V0dGluZ3NfYXJyYXkgaTJjX2NhbGliX2RhdGE7CisJc3RydWN0IGkyY19zZXR0aW5nc19hcnJheSBpMmNfbW9kZV9kYXRhOworCWVudW0gbXNtX2NhbWVyYV9kZXZpY2VfdHlwZV90IG9pc19kZXZpY2VfdHlwZTsKKwljaGFyIGRldmljZV9uYW1lWzIwXTsKKwljaGFyIG9pc19uYW1lWzMyXTsKKwl1aW50OF90IG9pc19md19mbGFnOworCXVpbnQ4X3QgaXNfb2lzX2NhbGliOworCXN0cnVjdCBjYW1fb2lzX29wY29kZSBvcGNvZGU7Cit9OworCisjZW5kaWYgLypfQ0FNX09JU19ERVZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fb2lzL2NhbV9vaXNfc29jLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX3NvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODY0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX29pcy9jYW1fb2lzX3NvYy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGNhbV9zZW5zb3JfY21uX2hlYWRlci5oPgorI2luY2x1ZGUgPGNhbV9zZW5zb3JfdXRpbC5oPgorI2luY2x1ZGUgPGNhbV9zZW5zb3JfaW8uaD4KKyNpbmNsdWRlIDxjYW1fcmVxX21ncl91dGlsLmg+CisKKyNpbmNsdWRlICJjYW1fb2lzX3NvYy5oIgorI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCisKKy8qKgorICogQGVfY3RybDogY3RybCBzdHJ1Y3R1cmUKKyAqCisgKiBQYXJzZXMgb2lzIGR0CisgKi8KK3N0YXRpYyBpbnQgY2FtX29pc19nZXRfZHRfZGF0YShzdHJ1Y3QgY2FtX29pc19jdHJsX3QgKm9fY3RybCkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKwlzdHJ1Y3QgY2FtX2h3X3NvY19pbmZvICAgICAgICAgKnNvY19pbmZvID0gJm9fY3RybC0+c29jX2luZm87CisJc3RydWN0IGNhbV9vaXNfc29jX3ByaXZhdGUgICAgICpzb2NfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgY2FtX29pc19zb2NfcHJpdmF0ZSAqKW9fY3RybC0+c29jX2luZm8uc29jX3ByaXZhdGU7CisJc3RydWN0IGNhbV9zZW5zb3JfcG93ZXJfY3RybF90ICpwb3dlcl9pbmZvID0gJnNvY19wcml2YXRlLT5wb3dlcl9pbmZvOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAgICAgICAgICAgICAqb2Zfbm9kZSA9IE5VTEw7CisKKwlvZl9ub2RlID0gc29jX2luZm8tPmRldi0+b2Zfbm9kZTsKKworCWlmICghb2Zfbm9kZSkgeworCQlDQU1fRVJSKENBTV9PSVMsICJvZl9ub2RlIGlzIE5VTEwsIGRldmljZSB0eXBlICVkIiwKKwkJCW9fY3RybC0+b2lzX2RldmljZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJjID0gY2FtX3NvY191dGlsX2dldF9kdF9wcm9wZXJ0aWVzKHNvY19pbmZvKTsKKwlpZiAocmMgPCAwKSB7CisJCUNBTV9FUlIoQ0FNX09JUywgImNhbV9zb2NfdXRpbF9nZXRfZHRfcHJvcGVydGllcyByYyAlZCIsCisJCQlyYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoIXNvY19pbmZvLT5ncGlvX2RhdGEpIHsKKwkJQ0FNX0lORk8oQ0FNX09JUywgIk5vIEdQSU8gZm91bmQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzb2NfaW5mby0+Z3Bpb19kYXRhLT5jYW1fZ3Bpb19jb21tb25fdGJsX3NpemUpIHsKKwkJQ0FNX0lORk8oQ0FNX09JUywgIk5vIEdQSU8gZm91bmQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBjYW1fc2Vuc29yX3V0aWxfaW5pdF9ncGlvX3Bpbl90Ymwoc29jX2luZm8sCisJCSZwb3dlcl9pbmZvLT5ncGlvX251bV9pbmZvKTsKKwlpZiAoKHJjIDwgMCkgfHwgKCFwb3dlcl9pbmZvLT5ncGlvX251bV9pbmZvKSkgeworCQlDQU1fRVJSKENBTV9PSVMsICJOby9FcnJvciBPSVMgR1BJT3MiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorLyoqCisgKiBAb19jdHJsOiBjdHJsIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gY2FtX29pc19wbGF0Zm9ybS9pMmNfZHJpdmVyX3Byb2JlLCBpdCBwYXJzZXMKKyAqIHRoZSBvaXMgZHQgbm9kZS4KKyAqLworaW50IGNhbV9vaXNfZHJpdmVyX3NvY19pbml0KHN0cnVjdCBjYW1fb2lzX2N0cmxfdCAqb19jdHJsKQoreworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworCXN0cnVjdCBjYW1faHdfc29jX2luZm8gICAgICAgICAqc29jX2luZm8gPSAmb19jdHJsLT5zb2NfaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgICAgICAgICAgICAgKm9mX25vZGUgPSBOVUxMOworCisJaWYgKCFzb2NfaW5mby0+ZGV2KSB7CisJCUNBTV9FUlIoQ0FNX09JUywgInNvY19pbmZvIGlzIG5vdCBpbml0aWFsaXplZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvZl9ub2RlID0gc29jX2luZm8tPmRldi0+b2Zfbm9kZTsKKwlpZiAoIW9mX25vZGUpIHsKKwkJQ0FNX0VSUihDQU1fT0lTLCAiZGV2Lm9mX25vZGUgTlVMTCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAob19jdHJsLT5vaXNfZGV2aWNlX3R5cGUgPT0gTVNNX0NBTUVSQV9QTEFURk9STV9ERVZJQ0UpIHsKKwkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAiY2NpLW1hc3RlciIsCisJCQkmb19jdHJsLT5jY2lfaTJjX21hc3Rlcik7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9EQkcoQ0FNX09JUywgImZhaWxlZCByYyAlZCIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJjID0gY2FtX29pc19nZXRfZHRfZGF0YShvX2N0cmwpOworCWlmIChyYyA8IDApCisJCUNBTV9EQkcoQ0FNX09JUywgImZhaWxlZDogb2lzIGdldCBkdCBkYXRhIHJjICVkIiwgcmMpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19zb2MuaApzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gaW5jbHVkZS9saW51eC9xZHNwNnYyL2RzcF9kZWJ1Zy5oCmNvcHkgdG8gZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19zb2MuaAppbmRleCBiYzFjZDllLi5hZjA0MTM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9vaXMvY2FtX29pc19zb2MuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTgsMTUgKzgsMTIgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKICAqLwotI2lmbmRlZiBfX0RTUF9ERUJVR19IXwotI2RlZmluZSBfX0RTUF9ERUJVR19IXworI2lmbmRlZiBfQ0FNX09JU19TT0NfSF8KKyNkZWZpbmUgX0NBTV9PSVNfU09DX0hfCiAKLXR5cGVkZWYgaW50ICgqZHNwX3N0YXRlX2NiKShpbnQgc3RhdGUpOwotaW50IGRzcF9kZWJ1Z19yZWdpc3Rlcihkc3Bfc3RhdGVfY2IgcHRyKTsKKyNpbmNsdWRlICJjYW1fb2lzX2Rldi5oIgogCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSEVEICAgICAgICAgMHgwCi0jZGVmaW5lIERTUF9TVEFURV9DUkFTSF9EVU1QX0RPTkUgMHgxCitpbnQgY2FtX29pc19kcml2ZXJfc29jX2luaXQoc3RydWN0IGNhbV9vaXNfY3RybF90ICpvX2N0cmwpOwogCi0jZW5kaWYKKyNlbmRpZi8qIF9DQU1fT0lTX1NPQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3IvY2FtX3NlbnNvcl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX2NvcmUuYwppbmRleCBmNmU2YTlhLi5jZDk2MTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX2NvcmUuYwpAQCAtMTE4LDYgKzExOCw3IEBACiAJCUNBTV9EQkcoQ0FNX1NFTlNPUiwgIiBSeGVkIFJlcSBJZDogJWxsZCIsCiAJCQkgY3NsX3BhY2tldC0+aGVhZGVyLnJlcXVlc3RfaWQpOwogCQlhZGRfcmVxLmRldl9oZGwgPSBzX2N0cmwtPmJyaWRnZV9pbnRmLmRldmljZV9oZGw7CisJCWFkZF9yZXEuc2tpcF9iZWZvcmVfYXBwbHlpbmcgPSAwOwogCQlpZiAoc19jdHJsLT5icmlkZ2VfaW50Zi5jcm1fY2IgJiYKIAkJCXNfY3RybC0+YnJpZGdlX2ludGYuY3JtX2NiLT5hZGRfcmVxKQogCQkJc19jdHJsLT5icmlkZ2VfaW50Zi5jcm1fY2ItPmFkZF9yZXEoJmFkZF9yZXEpOwpAQCAtMTI3LDYgKzEyOCw3MCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludDMyX3QgY2FtX3NlbnNvcl9pMmNfbW9kZXNfdXRpbCgKKwlzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqaW9fbWFzdGVyX2luZm8sCisJc3RydWN0IGkyY19zZXR0aW5nc19saXN0ICppMmNfbGlzdCkKK3sKKwlpbnQzMl90IHJjID0gMDsKKwl1aW50MzJfdCBpLCBzaXplOworCisJaWYgKGkyY19saXN0LT5vcF9jb2RlID09IENBTV9TRU5TT1JfSTJDX1dSSVRFX1JBTkRPTSkgeworCQlyYyA9IGNhbWVyYV9pb19kZXZfd3JpdGUoaW9fbWFzdGVyX2luZm8sCisJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJQ0FNX0VSUihDQU1fU0VOU09SLAorCQkJCSJGYWlsZWQgdG8gcmFuZG9tIHdyaXRlIEkyQyBzZXR0aW5nczogJWQiLAorCQkJCXJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSBpZiAoaTJjX2xpc3QtPm9wX2NvZGUgPT0gQ0FNX1NFTlNPUl9JMkNfV1JJVEVfU0VRKSB7CisJCXJjID0gY2FtZXJhX2lvX2Rldl93cml0ZV9jb250aW51b3VzKAorCQkJaW9fbWFzdGVyX2luZm8sCisJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpLAorCQkJMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKKwkJCQkiRmFpbGVkIHRvIHNlcSB3cml0ZSBJMkMgc2V0dGluZ3M6ICVkIiwKKwkJCQlyYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgaWYgKGkyY19saXN0LT5vcF9jb2RlID09IENBTV9TRU5TT1JfSTJDX1dSSVRFX0JVUlNUKSB7CisJCXJjID0gY2FtZXJhX2lvX2Rldl93cml0ZV9jb250aW51b3VzKAorCQkJaW9fbWFzdGVyX2luZm8sCisJCQkmKGkyY19saXN0LT5pMmNfc2V0dGluZ3MpLAorCQkJMSk7CisJCWlmIChyYyA8IDApIHsKKwkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKKwkJCQkiRmFpbGVkIHRvIGJ1cnN0IHdyaXRlIEkyQyBzZXR0aW5nczogJWQiLAorCQkJCXJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSBpZiAoaTJjX2xpc3QtPm9wX2NvZGUgPT0gQ0FNX1NFTlNPUl9JMkNfUE9MTCkgeworCQlzaXplID0gaTJjX2xpc3QtPmkyY19zZXR0aW5ncy5zaXplOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlyYyA9IGNhbWVyYV9pb19kZXZfcG9sbCgKKwkJCWlvX21hc3Rlcl9pbmZvLAorCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCQlyZWdfc2V0dGluZ1tpXS5yZWdfYWRkciwKKwkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuCisJCQkJcmVnX3NldHRpbmdbaV0ucmVnX2RhdGEsCisJCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLgorCQkJCXJlZ19zZXR0aW5nW2ldLmRhdGFfbWFzaywKKwkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuYWRkcl90eXBlLAorCQkJCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuZGF0YV90eXBlLAorCQkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCQlyZWdfc2V0dGluZ1tpXS5kZWxheSk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJQ0FNX0VSUihDQU1fU0VOU09SLAorCQkJCQkiaTJjIHBvbGwgYXBwbHkgc2V0dGluZyBGYWlsOiAlZCIsIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIGludDMyX3QgY2FtX3NlbnNvcl91cGRhdGVfaTJjX2luZm8oc3RydWN0IGNhbV9jbWRfaTJjX2luZm8gKmkyY19pbmZvLAogCXN0cnVjdCBjYW1fc2Vuc29yX2N0cmxfdCAqc19jdHJsKQogewpAQCAtNTg4LDYgKzY1Myw3IEBACiAJaW5mby0+ZGV2X2lkID0gQ0FNX1JFUV9NR1JfREVWSUNFX1NFTlNPUjsKIAlzdHJsY3B5KGluZm8tPm5hbWUsIENBTV9TRU5TT1JfTkFNRSwgc2l6ZW9mKGluZm8tPm5hbWUpKTsKIAlpbmZvLT5wX2RlbGF5ID0gMjsKKwlpbmZvLT50cmlnZ2VyID0gQ0FNX1RSSUdHRVJfUE9JTlRfU09GOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNzE0LDEyICs3ODAsMTMgQEAKIAkJaWYgKGkyY19zZXQtPmlzX3NldHRpbmdzX3ZhbGlkID09IDEpIHsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaTJjX2xpc3QsCiAJCQkJJihpMmNfc2V0LT5saXN0X2hlYWQpLCBsaXN0KSB7Ci0JCQkJcmMgPSBjYW1lcmFfaW9fZGV2X3dyaXRlKAorCQkJCXJjID0gY2FtX3NlbnNvcl9pMmNfbW9kZXNfdXRpbCgKIAkJCQkJJihzX2N0cmwtPmlvX21hc3Rlcl9pbmZvKSwKLQkJCQkJJihpMmNfbGlzdC0+aTJjX3NldHRpbmdzKSk7CisJCQkJCWkyY19saXN0KTsKIAkJCQlpZiAocmMgPCAwKSB7CiAJCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKLQkJCQkJIkZhaWxlZCB0byB3cml0ZSB0aGUgSTJDIHNldHRpbmdzIik7CisJCQkJCQkiRmFpbGVkIHRvIGFwcGx5IHNldHRpbmdzOiAlZCIsCisJCQkJCQlyYyk7CiAJCQkJCXJldHVybiByYzsKIAkJCQl9CiAJCQl9CkBAIC03MzcsMzkgKzgwNCwzNyBAQAogCQkJaTJjX3NldC0+cmVxdWVzdF9pZCA9PSByZXFfaWQpIHsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaTJjX2xpc3QsCiAJCQkJJihpMmNfc2V0LT5saXN0X2hlYWQpLCBsaXN0KSB7Ci0JCQkJcmMgPSBjYW1lcmFfaW9fZGV2X3dyaXRlKAorCQkJCXJjID0gY2FtX3NlbnNvcl9pMmNfbW9kZXNfdXRpbCgKIAkJCQkJJihzX2N0cmwtPmlvX21hc3Rlcl9pbmZvKSwKLQkJCQkJJihpMmNfbGlzdC0+aTJjX3NldHRpbmdzKSk7CisJCQkJCWkyY19saXN0KTsKIAkJCQlpZiAocmMgPCAwKSB7CiAJCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKLQkJCQkJIkZhaWwgdG8gd3JpdGUgdGhlIEkyQyBzZXR0aW5nczogJWQiLAotCQkJCQkJIHJjKTsKKwkJCQkJCSJGYWlsZWQgdG8gYXBwbHkgc2V0dGluZ3M6ICVkIiwKKwkJCQkJCXJjKTsKIAkJCQkJcmV0dXJuIHJjOwogCQkJCX0KIAkJCX0KLQkJCWRlbF9yZXFfaWQgPSAocmVxX2lkICsKLQkJCQlNQVhfUEVSX0ZSQU1FX0FSUkFZIC0KLQkJCQlNQVhfU1lTVEVNX1BJUEVMSU5FX0RFTEFZKSAlCi0JCQkJTUFYX1BFUl9GUkFNRV9BUlJBWTsKLQkJCUNBTV9EQkcoQ0FNX1NFTlNPUiwgIkRlbGV0aW5nIHRoZSBSZXF1ZXN0OiAlZCIsCi0JCQkJZGVsX3JlcV9pZCk7Ci0JCQlpZiAocmVxX2lkID4KLQkJCQlzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZVtkZWxfcmVxX2lkXS4KLQkJCQlyZXF1ZXN0X2lkKSB7Ci0JCQkJc19jdHJsLT5pMmNfZGF0YS5wZXJfZnJhbWVbZGVsX3JlcV9pZF0uCi0JCQkJCXJlcXVlc3RfaWQgPSAwOwotCQkJCXJjID0gZGVsZXRlX3JlcXVlc3QoCi0JCQkJCSYoc19jdHJsLT5pMmNfZGF0YS4KLQkJCQkJcGVyX2ZyYW1lW2RlbF9yZXFfaWRdKSk7Ci0JCQkJaWYgKHJjIDwgMCkKLQkJCQkJQ0FNX0VSUihDQU1fU0VOU09SLAotCQkJCQkJIkRlbGV0ZSByZXF1ZXN0IEZhaWw6JWQgcmM6JWQiLAotCQkJCQkJZGVsX3JlcV9pZCwgcmMpOwotCQkJfQogCQl9IGVsc2UgewogCQkJQ0FNX0RCRyhDQU1fU0VOU09SLAogCQkJCSJJbnZhbGlkL05PUCByZXF1ZXN0IHRvIGFwcGx5OiAlbGxkIiwgcmVxX2lkKTsKIAkJfQorCisJCWRlbF9yZXFfaWQgPSAocmVxX2lkICsgTUFYX1BFUl9GUkFNRV9BUlJBWSAtCisJCQlNQVhfU1lTVEVNX1BJUEVMSU5FX0RFTEFZKSAlIE1BWF9QRVJfRlJBTUVfQVJSQVk7CisJCUNBTV9EQkcoQ0FNX1NFTlNPUiwgIkRlbGV0aW5nIHRoZSBSZXF1ZXN0OiAlZCIsIGRlbF9yZXFfaWQpOworCisJCWlmICgocmVxX2lkID4KKwkJCSBzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZVtkZWxfcmVxX2lkXS5yZXF1ZXN0X2lkKSAmJgorCQkJKHNfY3RybC0+aTJjX2RhdGEucGVyX2ZyYW1lW2RlbF9yZXFfaWRdLgorCQkJCWlzX3NldHRpbmdzX3ZhbGlkID09IDEpKSB7CisJCQlzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZVtkZWxfcmVxX2lkXS5yZXF1ZXN0X2lkID0gMDsKKwkJCXJjID0gZGVsZXRlX3JlcXVlc3QoCisJCQkJJihzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZVtkZWxfcmVxX2lkXSkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlDQU1fRVJSKENBTV9TRU5TT1IsCisJCQkJCSJEZWxldGUgcmVxdWVzdCBGYWlsOiVkIHJjOiVkIiwKKwkJCQkJZGVsX3JlcV9pZCwgcmMpOworCQl9CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTc4OSw3ICs4NTQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJQ0FNX0RCRyhDQU1fU0VOU09SLCAiIFJlcSBJZDogJWxsZCIsIGFwcGx5LT5yZXF1ZXN0X2lkKTsKLQl0cmFjZV9jYW1fYXBwbHlfcmVxKCJTZW5zb3IiLCBhcHBseSk7CisJdHJhY2VfY2FtX2FwcGx5X3JlcSgiU2Vuc29yIiwgYXBwbHktPnJlcXVlc3RfaWQpOwogCXJjID0gY2FtX3NlbnNvcl9hcHBseV9zZXR0aW5ncyhzX2N0cmwsIGFwcGx5LT5yZXF1ZXN0X2lkKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX2Rldi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3IvY2FtX3NlbnNvcl9kZXYuYwppbmRleCA0MGNmNjg5Li4xMjJhYTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yL2NhbV9zZW5zb3JfZGV2LmMKQEAgLTM0LDExICszNCw5MSBAQAogCXJldHVybiByYzsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGNhbV9zZW5zb3JfaW5pdF9zdWJkZXZfZG9faW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2FtX2NvbnRyb2wgY21kX2RhdGE7CisJaW50MzJfdCByYyA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZF9kYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCXNpemVvZihjbWRfZGF0YSkpKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkZhaWxlZCB0byBjb3B5IGZyb20gdXNlcl9wdHI9JXBLIHNpemU9JXp1IiwKKwkJCSh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNtZF9kYXRhKSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWSURJT0NfQ0FNX0NPTlRST0w6CisJCXJjID0gY2FtX3NlbnNvcl9zdWJkZXZfaW9jdGwoc2QsIGNtZCwgJmNtZF9kYXRhKTsKKwkJaWYgKHJjIDwgMCkKKwkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImNhbV9zZW5zb3Jfc3ViZGV2X2lvY3RsIGZhaWxlZCIpOworCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBjb21wYXQgaW9jdGwgY21kX3R5cGU6ICVkIiwgY21kKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCWlmICghcmMpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjbWRfZGF0YSwKKwkJCXNpemVvZihjbWRfZGF0YSkpKSB7CisJCQlDQU1fRVJSKENBTV9TRU5TT1IsCisJCQkJIkZhaWxlZCB0byBjb3B5IHRvIHVzZXJfcHRyPSVwSyBzaXplPSV6dSIsCisJCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kX2RhdGEpKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworI2VuZGlmCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGNhbV9zZW5zb3Jfc3ViZGV2X2NvcmVfb3BzID0geworCS5pb2N0bCA9IGNhbV9zZW5zb3Jfc3ViZGV2X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsMzIgPSBjYW1fc2Vuc29yX2luaXRfc3ViZGV2X2RvX2lvY3RsLAorI2VuZGlmCisJLnNfcG93ZXIgPSBjYW1fc2Vuc29yX3Bvd2VyLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgY2FtX3NlbnNvcl9zdWJkZXZfb3BzID0geworCS5jb3JlID0gJmNhbV9zZW5zb3Jfc3ViZGV2X2NvcmVfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgY2FtX3NlbnNvcl9pbnRlcm5hbF9vcHM7CisKK3N0YXRpYyBpbnQgY2FtX3NlbnNvcl9pbml0X3N1YmRldl9wYXJhbXMoc3RydWN0IGNhbV9zZW5zb3JfY3RybF90ICpzX2N0cmwpCit7CisJaW50IHJjID0gMDsKKworCXNfY3RybC0+djRsMl9kZXZfc3RyLmludGVybmFsX29wcyA9CisJCSZjYW1fc2Vuc29yX2ludGVybmFsX29wczsKKwlzX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPQorCQkmY2FtX3NlbnNvcl9zdWJkZXZfb3BzOworCXN0cmxjcHkoc19jdHJsLT5kZXZpY2VfbmFtZSwgQ0FNWF9TRU5TT1JfREVWX05BTUUsCisJCXNpemVvZihzX2N0cmwtPmRldmljZV9uYW1lKSk7CisJc19jdHJsLT52NGwyX2Rldl9zdHIubmFtZSA9CisJCXNfY3RybC0+ZGV2aWNlX25hbWU7CisJc19jdHJsLT52NGwyX2Rldl9zdHIuc2RfZmxhZ3MgPQorCQkoVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUgfCBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKTsKKwlzX2N0cmwtPnY0bDJfZGV2X3N0ci5lbnRfZnVuY3Rpb24gPQorCQlDQU1fU0VOU09SX0RFVklDRV9UWVBFOworCXNfY3RybC0+djRsMl9kZXZfc3RyLnRva2VuID0gc19jdHJsOworCisJcmMgPSBjYW1fcmVnaXN0ZXJfc3ViZGV2KCYoc19jdHJsLT52NGwyX2Rldl9zdHIpKTsKKwlpZiAocmMpCisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkZhaWwgd2l0aCBjYW1fcmVnaXN0ZXJfc3ViZGV2IHJjOiAlZCIsIHJjKTsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludDMyX3QgY2FtX3NlbnNvcl9kcml2ZXJfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCWludDMyX3QgcmMgPSAwOwotCXN0cnVjdCBjYW1fc2Vuc29yX2N0cmxfdCAqc19jdHJsOworCWludCBpID0gMDsKKwlzdHJ1Y3QgY2FtX3NlbnNvcl9jdHJsX3QgKnNfY3RybCA9IE5VTEw7CisJc3RydWN0IGNhbV9od19zb2NfaW5mbyAgICpzb2NfaW5mbyA9IE5VTEw7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewogCQlDQU1fRVJSKENBTV9TRU5TT1IsCkBAIC01Myw5ICsxMzMsMTUgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHNfY3RybCk7CiAKKwlzX2N0cmwtPmlvX21hc3Rlcl9pbmZvLmNsaWVudCA9IGNsaWVudDsKKwlzb2NfaW5mbyA9ICZzX2N0cmwtPnNvY19pbmZvOworCXNvY19pbmZvLT5kZXYgPSAmY2xpZW50LT5kZXY7CisJc29jX2luZm8tPmRldl9uYW1lID0gY2xpZW50LT5uYW1lOworCiAJLyogSW5pdGlhbGl6ZSBzZW5zb3IgZGV2aWNlIHR5cGUgKi8KIAlzX2N0cmwtPm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwogCXNfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPSBJMkNfTUFTVEVSOworCXNfY3RybC0+aXNfcHJvYmVfc3VjY2VlZCA9IDA7CiAKIAlyYyA9IGNhbV9zZW5zb3JfcGFyc2VfZHQoc19jdHJsKTsKIAlpZiAocmMgPCAwKSB7CkBAIC02Myw3ICsxNDksMzUgQEAKIAkJZ290byBmcmVlX3NfY3RybDsKIAl9CiAKKwlyYyA9IGNhbV9zZW5zb3JfaW5pdF9zdWJkZXZfcGFyYW1zKHNfY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGZyZWVfc19jdHJsOworCisJc19jdHJsLT5pMmNfZGF0YS5wZXJfZnJhbWUgPQorCQkoc3RydWN0IGkyY19zZXR0aW5nc19hcnJheSAqKQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX3NldHRpbmdzX2FycmF5KSAqCisJCU1BWF9QRVJfRlJBTUVfQVJSQVksIEdGUF9LRVJORUwpOworCWlmIChzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byB1bnJlZ19zdWJkZXY7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJihzX2N0cmwtPmkyY19kYXRhLmluaXRfc2V0dGluZ3MubGlzdF9oZWFkKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BFUl9GUkFNRV9BUlJBWTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmKHNfY3RybC0+aTJjX2RhdGEucGVyX2ZyYW1lW2ldLmxpc3RfaGVhZCkpOworCisJc19jdHJsLT5icmlkZ2VfaW50Zi5kZXZpY2VfaGRsID0gLTE7CisJc19jdHJsLT5icmlkZ2VfaW50Zi5vcHMuZ2V0X2Rldl9pbmZvID0gY2FtX3NlbnNvcl9wdWJsaXNoX2Rldl9pbmZvOworCXNfY3RybC0+YnJpZGdlX2ludGYub3BzLmxpbmtfc2V0dXAgPSBjYW1fc2Vuc29yX2VzdGFibGlzaF9saW5rOworCXNfY3RybC0+YnJpZGdlX2ludGYub3BzLmFwcGx5X3JlcSA9IGNhbV9zZW5zb3JfYXBwbHlfcmVxdWVzdDsKKwlzX2N0cmwtPmJyaWRnZV9pbnRmLm9wcy5mbHVzaF9yZXEgPSBjYW1fc2Vuc29yX2ZsdXNoX3JlcXVlc3Q7CisKKwlzX2N0cmwtPnNlbnNvcmRhdGEtPnBvd2VyX2luZm8uZGV2ID0gc29jX2luZm8tPmRldjsKKwl2NGwyX3NldF9zdWJkZXZkYXRhKCYoc19jdHJsLT52NGwyX2Rldl9zdHIuc2QpLCBzX2N0cmwpOwogCXJldHVybiByYzsKK3VucmVnX3N1YmRldjoKKwljYW1fdW5yZWdpc3Rlcl9zdWJkZXYoJihzX2N0cmwtPnY0bDJfZGV2X3N0cikpOwogZnJlZV9zX2N0cmw6CiAJa2ZyZWUoc19jdHJsKTsKIAlyZXR1cm4gcmM7CkBAIC0xMDAsNTkgKzIxNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgbG9uZyBjYW1fc2Vuc29yX2luaXRfc3ViZGV2X2RvX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGNhbV9jb250cm9sIGNtZF9kYXRhOwotCWludDMyX3QgcmMgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbWRfZGF0YSwgKHZvaWQgX191c2VyICopYXJnLAotCQlzaXplb2YoY21kX2RhdGEpKSkgewotCQlDQU1fRVJSKENBTV9TRU5TT1IsICJGYWlsZWQgdG8gY29weSBmcm9tIHVzZXJfcHRyPSVwSyBzaXplPSV6dSIsCi0JCQkodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihjbWRfZGF0YSkpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVklESU9DX0NBTV9DT05UUk9MOgotCQlyYyA9IGNhbV9zZW5zb3Jfc3ViZGV2X2lvY3RsKHNkLCBjbWQsICZjbWRfZGF0YSk7Ci0JCWlmIChyYyA8IDApCi0JCQlDQU1fRVJSKENBTV9TRU5TT1IsICJjYW1fc2Vuc29yX3N1YmRldl9pb2N0bCBmYWlsZWQiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBjb21wYXQgaW9jdGwgY21kX3R5cGU6ICVkIiwgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCWlmICghcmMpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZjbWRfZGF0YSwKLQkJCXNpemVvZihjbWRfZGF0YSkpKSB7Ci0JCQlDQU1fRVJSKENBTV9TRU5TT1IsCi0JCQkJIkZhaWxlZCB0byBjb3B5IHRvIHVzZXJfcHRyPSVwSyBzaXplPSV6dSIsCi0JCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoY21kX2RhdGEpKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGNhbV9zZW5zb3Jfc3ViZGV2X2NvcmVfb3BzID0gewotCS5pb2N0bCA9IGNhbV9zZW5zb3Jfc3ViZGV2X2lvY3RsLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuY29tcGF0X2lvY3RsMzIgPSBjYW1fc2Vuc29yX2luaXRfc3ViZGV2X2RvX2lvY3RsLAotI2VuZGlmCi0JLnNfcG93ZXIgPSBjYW1fc2Vuc29yX3Bvd2VyLAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgY2FtX3NlbnNvcl9zdWJkZXZfb3BzID0gewotCS5jb3JlID0gJmNhbV9zZW5zb3Jfc3ViZGV2X2NvcmVfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgY2FtX3NlbnNvcl9pbnRlcm5hbF9vcHM7Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNhbV9zZW5zb3JfZHJpdmVyX2R0X21hdGNoW10gPSB7CiAJey5jb21wYXRpYmxlID0gInFjb20sY2FtLXNlbnNvciJ9LAogCXt9CkBAIC0xNzMsNiArMjM0LDggQEAKIAogCXNvY19pbmZvID0gJnNfY3RybC0+c29jX2luZm87CiAJc29jX2luZm8tPnBkZXYgPSBwZGV2OworCXNvY19pbmZvLT5kZXYgPSAmcGRldi0+ZGV2OworCXNvY19pbmZvLT5kZXZfbmFtZSA9IHBkZXYtPm5hbWU7CiAKIAkvKiBJbml0aWFsaXplIHNlbnNvciBkZXZpY2UgdHlwZSAqLwogCXNfY3RybC0+b2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwpAQCAtMTkyLDI1ICsyNTUsOSBAQAogCS8qIEZpbGwgcGxhdGZvcm0gZGV2aWNlIGlkKi8KIAlwZGV2LT5pZCA9IHNvY19pbmZvLT5pbmRleDsKIAotCXNfY3RybC0+djRsMl9kZXZfc3RyLmludGVybmFsX29wcyA9Ci0JCSZjYW1fc2Vuc29yX2ludGVybmFsX29wczsKLQlzX2N0cmwtPnY0bDJfZGV2X3N0ci5vcHMgPQotCQkmY2FtX3NlbnNvcl9zdWJkZXZfb3BzOwotCXN0cmxjcHkoc19jdHJsLT5kZXZpY2VfbmFtZSwgQ0FNWF9TRU5TT1JfREVWX05BTUUsCi0JCXNpemVvZihzX2N0cmwtPmRldmljZV9uYW1lKSk7Ci0Jc19jdHJsLT52NGwyX2Rldl9zdHIubmFtZSA9Ci0JCXNfY3RybC0+ZGV2aWNlX25hbWU7Ci0Jc19jdHJsLT52NGwyX2Rldl9zdHIuc2RfZmxhZ3MgPQotCQkoVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREUgfCBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKTsKLQlzX2N0cmwtPnY0bDJfZGV2X3N0ci5lbnRfZnVuY3Rpb24gPQotCQlDQU1fU0VOU09SX0RFVklDRV9UWVBFOwotCXNfY3RybC0+djRsMl9kZXZfc3RyLnRva2VuID0gc19jdHJsOwotCi0JcmMgPSBjYW1fcmVnaXN0ZXJfc3ViZGV2KCYoc19jdHJsLT52NGwyX2Rldl9zdHIpKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkZhaWwgd2l0aCBjYW1fcmVnaXN0ZXJfc3ViZGV2Iik7CisJcmMgPSBjYW1fc2Vuc29yX2luaXRfc3ViZGV2X3BhcmFtcyhzX2N0cmwpOworCWlmIChyYykKIAkJZ290byBmcmVlX3NfY3RybDsKLQl9CiAKIAlzX2N0cmwtPmkyY19kYXRhLnBlcl9mcmFtZSA9CiAJCShzdHJ1Y3QgaTJjX3NldHRpbmdzX2FycmF5ICopCkBAIC0yMTgsNyArMjY1LDcgQEAKIAkJTUFYX1BFUl9GUkFNRV9BUlJBWSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNfY3RybC0+aTJjX2RhdGEucGVyX2ZyYW1lID09IE5VTEwpIHsKIAkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfc19jdHJsOworCQlnb3RvIHVucmVnX3N1YmRldjsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmKHNfY3RybC0+aTJjX2RhdGEuaW5pdF9zZXR0aW5ncy5saXN0X2hlYWQpKTsKQEAgLTIzNyw2ICsyODQsOCBAQAogCXY0bDJfc2V0X3N1YmRldmRhdGEoJihzX2N0cmwtPnY0bDJfZGV2X3N0ci5zZCksIHNfY3RybCk7CiAKIAlyZXR1cm4gcmM7Cit1bnJlZ19zdWJkZXY6CisJY2FtX3VucmVnaXN0ZXJfc3ViZGV2KCYoc19jdHJsLT52NGwyX2Rldl9zdHIpKTsKIGZyZWVfc19jdHJsOgogCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgc19jdHJsKTsKIAlyZXR1cm4gcmM7CkBAIC0yNzMsOSArMzIyLDEyIEBACiAJaW50MzJfdCByYyA9IDA7CiAKIAlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2FtX3NlbnNvcl9wbGF0Zm9ybV9kcml2ZXIpOwotCWlmIChyYykKLQkJQ0FNX0VSUihDQU1fU0VOU09SLCAicGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyIGZhaWxlZCByYyA9ICVkIiwKKwlpZiAocmMgPCAwKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgInBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlciBGYWlsZWQ6IHJjID0gJWQiLAogCQkJcmMpOworCQlyZXR1cm4gcmM7CisJfQorCiAJcmMgPSBpMmNfYWRkX2RyaXZlcigmY2FtX3NlbnNvcl9kcml2ZXJfaTJjKTsKIAlpZiAocmMpCiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImkyY19hZGRfZHJpdmVyIGZhaWxlZCByYyA9ICVkIiwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3IvY2FtX3NlbnNvcl9zb2MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yL2NhbV9zZW5zb3Jfc29jLmMKaW5kZXggYzEwZDYzNC4uMWMzZWFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3IvY2FtX3NlbnNvcl9zb2MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvci9jYW1fc2Vuc29yX3NvYy5jCkBAIC0xNDMsMTQgKzE0MywxNyBAQAogCQlnb3RvIEZSRUVfU0VOU09SX0RBVEE7CiAJfQogCi0JLyogR2V0IENDSSBtYXN0ZXIgKi8KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJjY2ktbWFzdGVyIiwKLQkJJnNfY3RybC0+Y2NpX2kyY19tYXN0ZXIpOwotCUNBTV9EQkcoQ0FNX1NFTlNPUiwgImNjaS1tYXN0ZXIgJWQsIHJjICVkIiwgc19jdHJsLT5jY2lfaTJjX21hc3RlciwgcmMpOwotCWlmIChyYyA8IDApIHsKLQkJLyogU2V0IGRlZmF1bHQgbWFzdGVyIDAgKi8KLQkJc19jdHJsLT5jY2lfaTJjX21hc3RlciA9IE1BU1RFUl8wOwotCQlyYyA9IDA7CisJaWYgKHNfY3RybC0+aW9fbWFzdGVyX2luZm8ubWFzdGVyX3R5cGUgPT0gQ0NJX01BU1RFUikgeworCQkvKiBHZXQgQ0NJIG1hc3RlciAqLworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJjY2ktbWFzdGVyIiwKKwkJCSZzX2N0cmwtPmNjaV9pMmNfbWFzdGVyKTsKKwkJQ0FNX0RCRyhDQU1fU0VOU09SLCAiY2NpLW1hc3RlciAlZCwgcmMgJWQiLAorCQkJc19jdHJsLT5jY2lfaTJjX21hc3RlciwgcmMpOworCQlpZiAocmMgPCAwKSB7CisJCQkvKiBTZXQgZGVmYXVsdCBtYXN0ZXIgMCAqLworCQkJc19jdHJsLT5jY2lfaTJjX21hc3RlciA9IE1BU1RFUl8wOworCQkJcmMgPSAwOworCQl9CiAJfQogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJzZW5zb3ItcG9zaXRpb24tcGl0Y2giLApAQCAtMTk0LDYgKzE5Nyw5IEBACiAJCWlmICghKHNfY3RybC0+aW9fbWFzdGVyX2luZm8uY2NpX2NsaWVudCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAorCX0gZWxzZSBpZiAoc19jdHJsLT5pb19tYXN0ZXJfaW5mby5tYXN0ZXJfdHlwZSA9PSBJMkNfTUFTVEVSKSB7CisJCWlmICghKHNfY3RybC0+aW9fbWFzdGVyX2luZm8uY2xpZW50KSkKKwkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7CiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKIAkJCSJJbnZhbGlkIG1hc3RlciAvIE1hc3RlciB0eXBlIE5vdCBzdXBwb3J0ZWQiKTsKQEAgLTIyMCw3ICsyMjYsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc29jX2luZm8tPm51bV9jbGs7IGkrKykgewotCQlzb2NfaW5mby0+Y2xrW2ldID0gZGV2bV9jbGtfZ2V0KCZzb2NfaW5mby0+cGRldi0+ZGV2LAorCQlzb2NfaW5mby0+Y2xrW2ldID0gZGV2bV9jbGtfZ2V0KHNvY19pbmZvLT5kZXYsCiAJCQkJCXNvY19pbmZvLT5jbGtfbmFtZVtpXSk7CiAJCWlmICghc29jX2luZm8tPmNsa1tpXSkgewogCQkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZ2V0IGZhaWxlZCBmb3IgJXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9jY2lfaTJjLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX2NjaV9pMmMuYwppbmRleCBjYTY0OGYwMS4uMmMxZjUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9jY2lfaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9jY2lfaTJjLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlyYyA9IHY0bDJfc3ViZGV2X2NhbGwoY2NpX2NsaWVudC0+Y2NpX3N1YmRldiwKIAkJY29yZSwgaW9jdGwsIFZJRElPQ19NU01fQ0NJX0NGRywgJmNjaV9jdHJsKTsKIAlpZiAocmMgPCAwKSB7Ci0JCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImxpbmUgJWQgcmMgPSAlZCIsIHJjKTsKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAicmMgPSAlZCIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTQ1LDYgKzE0NSwyMyBAQAogCQlNU01fQ0NJX0kyQ19XUklURSk7CiB9CiAKK2ludDMyX3QgY2FtX2NjaV9pMmNfd3JpdGVfY29udGludW91c190YWJsZSgKKwlzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAorCXN0cnVjdCBjYW1fc2Vuc29yX2kyY19yZWdfc2V0dGluZyAqd3JpdGVfc2V0dGluZywKKwl1aW50OF90IGNhbV9zZW5zb3JfaTJjX3dyaXRlX2ZsYWcpCit7CisJaW50MzJfdCByYyA9IDA7CisKKwlpZiAoY2FtX3NlbnNvcl9pMmNfd3JpdGVfZmxhZyA9PSAxKQorCQlyYyA9IGNhbV9jY2lfaTJjX3dyaXRlX3RhYmxlX2NtZChjbGllbnQsIHdyaXRlX3NldHRpbmcsCisJCQlNU01fQ0NJX0kyQ19XUklURV9CVVJTVCk7CisJZWxzZSBpZiAoY2FtX3NlbnNvcl9pMmNfd3JpdGVfZmxhZyA9PSAwKQorCQlyYyA9IGNhbV9jY2lfaTJjX3dyaXRlX3RhYmxlX2NtZChjbGllbnQsIHdyaXRlX3NldHRpbmcsCisJCQlNU01fQ0NJX0kyQ19XUklURV9TRVEpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50MzJfdCBjYW1fY2NpX2kyY19jb21wYXJlKHN0cnVjdCBjYW1fc2Vuc29yX2NjaV9jbGllbnQgKmNsaWVudCwKIAl1aW50MzJfdCBhZGRyLCB1aW50MTZfdCBkYXRhLCB1aW50MTZfdCBkYXRhX21hc2ssCiAJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGRhdGFfdHlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaTJjLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX2kyYy5oCmluZGV4IDYyMDdhOGEuLjEwYjA3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaTJjLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9pMmMuaApAQCAtNTcsNyArNTcsNyBAQAogCiAvKioKICAqIEBjbGllbnQ6IENDSSBjbGllbnQgc3RydWN0dXJlCi0gKiBAY2NpX2NtZDogQ0NJIGNvbW1hbmQgdHlwZQorICogQHdyaXRlX3NldHRpbmc6IEkyQyByZWdpc3RlciBzZXR0aW5nCiAgKgogICogVGhpcyBBUEkgaGFuZGxlcyBDQ0kgcmFuZG9tIHdyaXRlCiAgKi8KQEAgLTY2LDYgKzY2LDE4IEBACiAJc3RydWN0IGNhbV9zZW5zb3JfaTJjX3JlZ19zZXR0aW5nICp3cml0ZV9zZXR0aW5nKTsKIAogLyoqCisgKiBAY2xpZW50OiBDQ0kgY2xpZW50IHN0cnVjdHVyZQorICogQHdyaXRlX3NldHRpbmc6IEkyQyByZWdpc3RlciBzZXR0aW5nCisgKiBAY2FtX3NlbnNvcl9pMmNfd3JpdGVfZmxhZzogYnVyc3Qgb3Igc2VxIHdyaXRlCisgKgorICogVGhpcyBBUEkgaGFuZGxlcyBDQ0kgY29udGludW91cyB3cml0ZQorICovCitpbnQzMl90IGNhbV9jY2lfaTJjX3dyaXRlX2NvbnRpbnVvdXNfdGFibGUoCisJc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmNsaWVudCwKKwlzdHJ1Y3QgY2FtX3NlbnNvcl9pMmNfcmVnX3NldHRpbmcgKndyaXRlX3NldHRpbmcsCisJdWludDhfdCBjYW1fc2Vuc29yX2kyY193cml0ZV9mbGFnKTsKKworLyoqCiAgKiBAY2NpX2NsaWVudDogQ0NJIGNsaWVudCBzdHJ1Y3R1cmUKICAqIEBjY2lfY21kOiBDQ0kgY29tbWFuZCB0eXBlCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9pby5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9pby5jCmluZGV4IDE1NGY0YWQuLjhlYjA0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX2lvLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAkJCWFkZHIsIGRhdGEsIGFkZHJfdHlwZSwgZGF0YV90eXBlKTsKIAl9IGVsc2UgaWYgKGlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSA9PSBTUElfTUFTVEVSKSB7CiAJCXJldHVybiBjYW1fc3BpX3JlYWQoaW9fbWFzdGVyX2luZm8sCi0JCQlhZGRyLCBkYXRhLCBhZGRyX3R5cGUpOworCQkJYWRkciwgZGF0YSwgYWRkcl90eXBlLCBkYXRhX3R5cGUpOwogCX0gZWxzZSB7CiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkludmFsaWQgQ29tbS4gTWFzdGVyOiVkIiwKIAkJCWlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSk7CkBAIC03OCw4ICs3OCw4IEBACiAJCXJldHVybiBjYW1fcXVwX2kyY19yZWFkX3NlcShpb19tYXN0ZXJfaW5mby0+Y2xpZW50LAogCQkJYWRkciwgZGF0YSwgYWRkcl90eXBlLCBudW1fYnl0ZXMpOwogCX0gZWxzZSBpZiAoaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlID09IFNQSV9NQVNURVIpIHsKLQkJcmV0dXJuIGNhbV9zcGlfcmVhZChpb19tYXN0ZXJfaW5mbywKLQkJCWFkZHIsICh1aW50MzJfdCAqKWRhdGEsIGFkZHJfdHlwZSk7CisJCXJldHVybiBjYW1fc3BpX3JlYWRfc2VxKGlvX21hc3Rlcl9pbmZvLAorCQkJYWRkciwgZGF0YSwgYWRkcl90eXBlLCBudW1fYnl0ZXMpOwogCX0gZWxzZSB7CiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkludmFsaWQgQ29tbS4gTWFzdGVyOiVkIiwKIAkJCWlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSk7CkBAIC0xMDQsNiArMTA0LDM2IEBACiAJfSBlbHNlIGlmIChpb19tYXN0ZXJfaW5mby0+bWFzdGVyX3R5cGUgPT0gSTJDX01BU1RFUikgewogCQlyZXR1cm4gY2FtX3F1cF9pMmNfd3JpdGVfdGFibGUoaW9fbWFzdGVyX2luZm8sCiAJCQl3cml0ZV9zZXR0aW5nKTsKKwl9IGVsc2UgaWYgKGlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSA9PSBTUElfTUFTVEVSKSB7CisJCXJldHVybiBjYW1fc3BpX3dyaXRlX3RhYmxlKGlvX21hc3Rlcl9pbmZvLAorCQkJd3JpdGVfc2V0dGluZyk7CisJfSBlbHNlIHsKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBDb21tLiBNYXN0ZXI6JWQiLAorCQkJaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitpbnQzMl90IGNhbWVyYV9pb19kZXZfd3JpdGVfY29udGludW91cyhzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqaW9fbWFzdGVyX2luZm8sCisJc3RydWN0IGNhbV9zZW5zb3JfaTJjX3JlZ19zZXR0aW5nICp3cml0ZV9zZXR0aW5nLAorCXVpbnQ4X3QgY2FtX3NlbnNvcl9pMmNfd3JpdGVfZmxhZykKK3sKKwlpZiAoIXdyaXRlX3NldHRpbmcgfHwgIWlvX21hc3Rlcl9pbmZvKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKKwkJCSJJbnB1dCBwYXJhbWV0ZXJzIG5vdCB2YWxpZCB3czogJXBLIGlvaW5mbzogJXBLIiwKKwkJCXdyaXRlX3NldHRpbmcsIGlvX21hc3Rlcl9pbmZvKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSA9PSBDQ0lfTUFTVEVSKSB7CisJCXJldHVybiBjYW1fY2NpX2kyY193cml0ZV9jb250aW51b3VzX3RhYmxlKGlvX21hc3Rlcl9pbmZvLAorCQkJd3JpdGVfc2V0dGluZywgY2FtX3NlbnNvcl9pMmNfd3JpdGVfZmxhZyk7CisJfSBlbHNlIGlmIChpb19tYXN0ZXJfaW5mby0+bWFzdGVyX3R5cGUgPT0gSTJDX01BU1RFUikgeworCQlyZXR1cm4gY2FtX3F1cF9pMmNfd3JpdGVfdGFibGUoaW9fbWFzdGVyX2luZm8sCisJCQl3cml0ZV9zZXR0aW5nKTsKKwl9IGVsc2UgaWYgKGlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSA9PSBTUElfTUFTVEVSKSB7CisJCXJldHVybiBjYW1fc3BpX3dyaXRlX3RhYmxlKGlvX21hc3Rlcl9pbmZvLAorCQkJd3JpdGVfc2V0dGluZyk7CiAJfSBlbHNlIHsKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBDb21tLiBNYXN0ZXI6JWQiLAogCQkJaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlKTsKQEAgLTEyMyw2ICsxNTMsOSBAQAogCQkJY2FtX2NjaV9nZXRfc3ViZGV2KCk7CiAJCXJldHVybiBjYW1fc2Vuc29yX2NjaV9pMmNfdXRpbChpb19tYXN0ZXJfaW5mby0+Y2NpX2NsaWVudCwKIAkJCU1TTV9DQ0lfSU5JVCk7CisJfSBlbHNlIGlmICgoaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlID09IEkyQ19NQVNURVIpIHx8CisJCQkoaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlID09IFNQSV9NQVNURVIpKSB7CisJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkludmFsaWQgQ29tbS4gTWFzdGVyOiVkIiwKIAkJCWlvX21hc3Rlcl9pbmZvLT5tYXN0ZXJfdHlwZSk7CkBAIC0xNDAsNiArMTczLDkgQEAKIAlpZiAoaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlID09IENDSV9NQVNURVIpIHsKIAkJcmV0dXJuIGNhbV9zZW5zb3JfY2NpX2kyY191dGlsKGlvX21hc3Rlcl9pbmZvLT5jY2lfY2xpZW50LAogCQkJTVNNX0NDSV9SRUxFQVNFKTsKKwl9IGVsc2UgaWYgKChpb19tYXN0ZXJfaW5mby0+bWFzdGVyX3R5cGUgPT0gSTJDX01BU1RFUikgfHwKKwkJCShpb19tYXN0ZXJfaW5mby0+bWFzdGVyX3R5cGUgPT0gU1BJX01BU1RFUikpIHsKKwkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBDb21tLiBNYXN0ZXI6JWQiLAogCQkJaW9fbWFzdGVyX2luZm8tPm1hc3Rlcl90eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaW8uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaW8uaAppbmRleCA5YTYwZmQwZS4uZjY2MjBjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9pby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3JfaW8uaApAQCAtODcsNiArODcsMTggQEAKIAogLyoqCiAgKiBAaW9fbWFzdGVyX2luZm86IEkyQy9TUEkgbWFzdGVyIGluZm9ybWF0aW9uCisgKiBAd3JpdGVfc2V0dGluZzogd3JpdGUgc2V0dGluZ3MgaW5mb3JtYXRpb24KKyAqIEBjYW1fc2Vuc29yX2kyY193cml0ZV9mbGFnOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYnVyc3QgJiBzZXEKKyAqCisgKiBUaGlzIEFQSSBhYnN0cmFjdHMgd3JpdGUgZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiBtYXN0ZXIgdHlwZSBhbmQKKyAqIHdyaXRlIGZsYWcgZm9yIGNvbnRpbnVvdXMgd3JpdGUKKyAqLworaW50MzJfdCBjYW1lcmFfaW9fZGV2X3dyaXRlX2NvbnRpbnVvdXMoc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmlvX21hc3Rlcl9pbmZvLAorCXN0cnVjdCBjYW1fc2Vuc29yX2kyY19yZWdfc2V0dGluZyAqd3JpdGVfc2V0dGluZywKKwl1aW50OF90IGNhbV9zZW5zb3JfaTJjX3dyaXRlX2ZsYWcpOworCisvKioKKyAqIEBpb19tYXN0ZXJfaW5mbzogSTJDL1NQSSBtYXN0ZXIgaW5mb3JtYXRpb24KICAqIEBhZGRyOiBJMkMgYWRkcmVzcwogICogQGRhdGE6IEkyQyBkYXRhCiAgKiBAZGF0YV9tYXNrOiBJMkMgZGF0YSBtYXNrCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX3NwaS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9zcGkuYwppbmRleCA0MDExYWEwLi4xMzFiMGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX3NwaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3Jfc3BpLmMKQEAgLTU5LDI1ICs1OSwyNyBAQAogICogaW5zdHJ1Y3Rpb24gYW5kIHRoZSBkYXRhIGxlbmd0aC4KICAqLwogc3RhdGljIHZvaWQgY2FtX3NldF9hZGRyKHVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgYWRkcl9sZW4sCi0JZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIHR5cGUsCisJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSwKIAljaGFyICpzdHIpCiB7Ci0JaW50IGksIGxlbjsKLQogCWlmICghYWRkcl9sZW4pCiAJCXJldHVybjsKIAotCWlmIChhZGRyX2xlbiA8IHR5cGUpCi0JCUNBTV9EQkcoQ0FNX0VFUFJPTSwgIm9taXR0aW5nIGhpZ2hlciBiaXRzIGluIGFkZHJlc3MiKTsKLQotCS8qIG9ubHkgc3VwcG9ydCB0cmFuc2ZlciBNU0IgZmlyc3QgZm9yIG5vdyAqLwotCWxlbiA9IGFkZHJfbGVuIC0gdHlwZTsKLQlmb3IgKGkgPSBsZW47IGkgPCBhZGRyX2xlbjsgaSsrKSB7Ci0JCWlmIChpID49IDApCi0JCQlzdHJbaV0gPSAoYWRkciA+PiAoQklUU19QRVJfQllURSAqIChhZGRyX2xlbiAtIGkgLSAxKSkpCi0JCQkJJiAweEZGOworCWlmIChhZGRyX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFKSB7CisJCXN0clswXSA9IGFkZHI7CisJfSBlbHNlIGlmIChhZGRyX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9XT1JEKSB7CisJCXN0clswXSA9IGFkZHIgPj4gODsKKwkJc3RyWzFdID0gYWRkcjsKKwl9IGVsc2UgaWYgKGFkZHJfdHlwZSA9PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFXzNCKSB7CisJCXN0clswXSA9IGFkZHIgPj4gMTY7CisJCXN0clsxXSA9IGFkZHIgPj4gODsKKwkJc3RyWzJdID0gYWRkcjsKKwl9IGVsc2UgeworCQlzdHJbMF0gPSBhZGRyID4+IDI0OworCQlzdHJbMV0gPSBhZGRyID4+IDE2OworCQlzdHJbMl0gPSBhZGRyID4+IDg7CisJCXN0clszXSA9IGFkZHI7CiAJfQotCiB9CiAKIC8qKgpAQCAtMTA1LDYgKzEwNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQzMl90IGNhbV9zcGlfdHhfaGVscGVyKHN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsCiAJc3RydWN0IGNhbV9jYW1lcmFfc3BpX2luc3QgKmluc3QsIHVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgKmRhdGEsCisJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSwKIAl1aW50MzJfdCBudW1fYnl0ZSwgY2hhciAqdHgsIGNoYXIgKnJ4KQogewogCWludDMyX3QgcmMgPSAtRUlOVkFMOwpAQCAtMTEyLDEwICsxMTUsNiBAQAogCWNoYXIgKmN0eCA9IE5VTEwsICpjcnggPSBOVUxMOwogCXVpbnQzMl90IGxlbiwgaGxlbjsKIAl1aW50OF90IHJldHJpZXMgPSBjbGllbnQtPnNwaV9jbGllbnQtPnJldHJpZXM7Ci0JZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSA9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfV09SRDsKLQotCWlmIChhZGRyX3R5cGUgPj0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9NQVgpCi0JCXJldHVybiByYzsKIAogCWhsZW4gPSBjYW1fY2FtZXJhX3NwaV9nZXRfaGxlbihpbnN0KTsKIAlsZW4gPSBobGVuICsgbnVtX2J5dGU7CkBAIC0xNjYsNiArMTY1LDcgQEAKIAogc3RhdGljIGludDMyX3QgY2FtX3NwaV90eF9yZWFkKHN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsCiAJc3RydWN0IGNhbV9jYW1lcmFfc3BpX2luc3QgKmluc3QsIHVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgKmRhdGEsCisJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSwKIAl1aW50MzJfdCBudW1fYnl0ZSwgY2hhciAqdHgsIGNoYXIgKnJ4KQogewogCWludDMyX3QgcmMgPSAtRUlOVkFMOwpAQCAtMTczLDEyICsxNzMsNiBAQAogCWNoYXIgKmN0eCA9IE5VTEwsICpjcnggPSBOVUxMOwogCXVpbnQzMl90IGhsZW47CiAJdWludDhfdCByZXRyaWVzID0gY2xpZW50LT5zcGlfY2xpZW50LT5yZXRyaWVzOwotCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUgPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQ7Ci0KLQlpZiAoKGFkZHJfdHlwZSAhPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQpCi0JCSYmIChhZGRyX3R5cGUgIT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFKQotCQkmJiAoYWRkcl90eXBlICE9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfM0IpKQotCQlyZXR1cm4gcmM7CiAKIAlobGVuID0gY2FtX2NhbWVyYV9zcGlfZ2V0X2hsZW4oaW5zdCk7CiAJaWYgKHR4KSB7CkBAIC0yMDQsMTQgKzE5OCw4IEBACiAJfQogCiAJY3R4WzBdID0gaW5zdC0+b3Bjb2RlOwotCWlmIChhZGRyX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV8zQikgewotCQljYW1fc2V0X2FkZHIoYWRkciwgaW5zdC0+YWRkcl9sZW4sIGFkZHJfdHlwZSwKLQkJCWN0eCArIDEpOwotCX0gZWxzZSB7Ci0JCWN0eFsxXSA9IChhZGRyID4+IEJJVFNfUEVSX0JZVEUpICYgMHhGRjsKLQkJY3R4WzJdID0gKGFkZHIgJiAweEZGKTsKLQkJY3R4WzNdID0gMDsKLQl9CisJY2FtX3NldF9hZGRyKGFkZHIsIGluc3QtPmFkZHJfbGVuLCBhZGRyX3R5cGUsIGN0eCArIDEpOworCiAJQ0FNX0RCRyhDQU1fRUVQUk9NLCAidHgoJXUpOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwgaGxlbiwgY3R4WzBdLAogCQljdHhbMV0sIGN0eFsyXSwJY3R4WzNdKTsKIAl3aGlsZSAoKHJjID0gY2FtX3NwaV90eGZyX3JlYWQoc3BpLCBjdHgsIGNyeCwgaGxlbiwgbnVtX2J5dGUpKQpAQCAtMjM1LDE4ICsyMjMsMjMgQEAKIAogaW50IGNhbV9zcGlfcmVhZChzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAogCXVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpkYXRhLAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUsCiAJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGRhdGFfdHlwZSkKIHsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCXVpbnQ4X3QgdGVtcFtDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWF07CiAKLQlpZiAoKGRhdGFfdHlwZSA8PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX0lOVkFMSUQpCi0JCXx8IChkYXRhX3R5cGUgPj0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9NQVgpKQorCWlmIChhZGRyX3R5cGUgPD0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9JTlZBTElECisJCXx8IGFkZHJfdHlwZSA+PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWAorCQl8fCBkYXRhX3R5cGUgPD0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9JTlZBTElECisJCXx8IGRhdGFfdHlwZSA+PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWCkgeworCQlDQU1fRVJSKENBTV9TRU5TT1IsICJGYWlsZWQgd2l0aCBhZGRyL2RhdGFfdHlwZSB2ZXJpZmljYXRpb24iKTsKIAkJcmV0dXJuIHJjOworCX0KIAogCXJjID0gY2FtX3NwaV90eF9yZWFkKGNsaWVudCwKIAkJJmNsaWVudC0+c3BpX2NsaWVudC0+Y21kX3RibC5yZWFkLCBhZGRyLCAmdGVtcFswXSwKLQkJZGF0YV90eXBlLCBOVUxMLCBOVUxMKTsKKwkJYWRkcl90eXBlLCBkYXRhX3R5cGUsIE5VTEwsIE5VTEwpOwogCWlmIChyYyA8IDApIHsKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZmFpbGVkICVkIiwgcmMpOwogCQlyZXR1cm4gcmM7CkBAIC0yNTQsMjMgKzI0Nyw1MCBAQAogCiAJaWYgKGRhdGFfdHlwZSA9PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX0JZVEUpCiAJCSpkYXRhID0gdGVtcFswXTsKLQllbHNlCisJZWxzZSBpZiAoZGF0YV90eXBlID09IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfV09SRCkKIAkJKmRhdGEgPSAodGVtcFswXSA8PCBCSVRTX1BFUl9CWVRFKSB8IHRlbXBbMV07CisJZWxzZSBpZiAoZGF0YV90eXBlID09IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfM0IpCisJCSpkYXRhID0gKHRlbXBbMF0gPDwgMTYgfCB0ZW1wWzFdIDw8IDggfCB0ZW1wWzJdKTsKKwllbHNlCisJCSpkYXRhID0gKHRlbXBbMF0gPDwgMjQgfCB0ZW1wWzFdIDw8IDE2IHwgdGVtcFsyXSA8PCA4IHwKKwkJCXRlbXBbM10pOwogCiAJQ0FNX0RCRyhDQU1fU0VOU09SLCAiYWRkciAweCV4LCBkYXRhICV1IiwgYWRkciwgKmRhdGEpOwogCXJldHVybiByYzsKIH0KIAoraW50MzJfdCBjYW1fc3BpX3JlYWRfc2VxKHN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsCisJdWludDMyX3QgYWRkciwgdWludDhfdCAqZGF0YSwKKwllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgYWRkcl90eXBlLCBpbnQzMl90IG51bV9ieXRlcykKK3sKKwlpZiAoKGFkZHJfdHlwZSA8PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX0lOVkFMSUQpCisJCXx8IChhZGRyX3R5cGUgPj0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9NQVgpKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkZhaWxlZCB3aXRoIGFkZHJfdHlwZSB2ZXJpZmljYXRpb24iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG51bV9ieXRlcyA9PSAwKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIm51bV9ieXRlOiAweCV4IiwgbnVtX2J5dGVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGNhbV9zcGlfdHhfaGVscGVyKGNsaWVudCwKKwkJJmNsaWVudC0+c3BpX2NsaWVudC0+Y21kX3RibC5yZWFkX3NlcSwgYWRkciwgZGF0YSwKKwkJYWRkcl90eXBlLCBudW1fYnl0ZXMsIE5VTEwsIE5VTEwpOworfQorCiBpbnQgY2FtX3NwaV9xdWVyeV9pZChzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAotCXVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgKmRhdGEsIHVpbnQzMl90IG51bV9ieXRlKQorCXVpbnQzMl90IGFkZHIsIGVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUsCisJdWludDhfdCAqZGF0YSwgdWludDMyX3QgbnVtX2J5dGUpCiB7CiAJcmV0dXJuIGNhbV9zcGlfdHhfaGVscGVyKGNsaWVudCwKLQkJJmNsaWVudC0+c3BpX2NsaWVudC0+Y21kX3RibC5xdWVyeV9pZCwgYWRkciwgZGF0YSwgbnVtX2J5dGUsCi0JCU5VTEwsIE5VTEwpOworCQkmY2xpZW50LT5zcGlfY2xpZW50LT5jbWRfdGJsLnF1ZXJ5X2lkLAorCQlhZGRyLCBkYXRhLCBhZGRyX3R5cGUsIG51bV9ieXRlLCBOVUxMLCBOVUxMKTsKIH0KIAogc3RhdGljIGludDMyX3QgY2FtX3NwaV9yZWFkX3N0YXR1c19yZWcoCi0Jc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmNsaWVudCwgdWludDhfdCAqc3RhdHVzKQorCXN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsIHVpbnQ4X3QgKnN0YXR1cywKKwllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgYWRkcl90eXBlKQogewogCXN0cnVjdCBjYW1fY2FtZXJhX3NwaV9pbnN0ICpycyA9CiAJCSZjbGllbnQtPnNwaV9jbGllbnQtPmNtZF90YmwucmVhZF9zdGF0dXM7CkBAIC0yNzksMTYgKzI5OSwxNyBAQAogCQlDQU1fRVJSKENBTV9TRU5TT1IsICJub3QgaW1wbGVtZW50ZWQgeWV0Iik7CiAJCXJldHVybiAtRU5YSU87CiAJfQotCXJldHVybiBjYW1fc3BpX3R4X2hlbHBlcihjbGllbnQsIHJzLCAwLCBzdGF0dXMsIDEsIE5VTEwsIE5VTEwpOworCXJldHVybiBjYW1fc3BpX3R4X2hlbHBlcihjbGllbnQsIHJzLCAwLCBzdGF0dXMsCisJCWFkZHJfdHlwZSwgMSwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQzMl90IGNhbV9zcGlfZGV2aWNlX2J1c3koc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmNsaWVudCwKLQl1aW50OF90ICpidXN5KQorCXVpbnQ4X3QgKmJ1c3ksIGVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUpCiB7CiAJaW50IHJjOwogCXVpbnQ4X3Qgc3QgPSAwOwogCi0JcmMgPSBjYW1fc3BpX3JlYWRfc3RhdHVzX3JlZyhjbGllbnQsICAmc3QpOworCXJjID0gY2FtX3NwaV9yZWFkX3N0YXR1c19yZWcoY2xpZW50LCAmc3QsIGFkZHJfdHlwZSk7CiAJaWYgKHJjIDwgMCkgewogCQlDQU1fRVJSKENBTV9TRU5TT1IsICJmYWlsZWQgdG8gcmVhZCBzdGF0dXMgcmVnIik7CiAJCXJldHVybiByYzsKQEAgLTI5OCwxNCArMzE5LDE1IEBACiB9CiAKIHN0YXRpYyBpbnQzMl90IGNhbV9zcGlfd2FpdChzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAotCXN0cnVjdCBjYW1fY2FtZXJhX3NwaV9pbnN0ICppbnN0KQorCXN0cnVjdCBjYW1fY2FtZXJhX3NwaV9pbnN0ICppbnN0LAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUpCiB7CiAJdWludDhfdCBidXN5OwogCWludCBpLCByYzsKIAogCUNBTV9EQkcoQ0FNX1NFTlNPUiwgIm9wIDB4JXggd2FpdCBzdGFydCIsIGluc3QtPm9wY29kZSk7CiAJZm9yIChpID0gMDsgaSA8IGluc3QtPmRlbGF5X2NvdW50OyBpKyspIHsKLQkJcmMgPSBjYW1fc3BpX2RldmljZV9idXN5KGNsaWVudCwgJmJ1c3kpOworCQlyYyA9IGNhbV9zcGlfZGV2aWNlX2J1c3koY2xpZW50LCAmYnVzeSwgYWRkcl90eXBlKTsKIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAkJaWYgKCFidXN5KQpAQCAtMzIxLDggKzM0Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQzMl90IGNhbV9zcGlfd3JpdGVfZW5hYmxlKAotCXN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQpCitzdGF0aWMgaW50MzJfdCBjYW1fc3BpX3dyaXRlX2VuYWJsZShzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUpCiB7CiAJc3RydWN0IGNhbV9jYW1lcmFfc3BpX2luc3QgKndlID0KIAkJJmNsaWVudC0+c3BpX2NsaWVudC0+Y21kX3RibC53cml0ZV9lbmFibGU7CkBAIC0zMzQsNyArMzU2LDggQEAKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAibm90IGltcGxlbWVudGVkIHlldCIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmMgPSBjYW1fc3BpX3R4X2hlbHBlcihjbGllbnQsIHdlLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlyYyA9IGNhbV9zcGlfdHhfaGVscGVyKGNsaWVudCwgd2UsIDAsIE5VTEwsIGFkZHJfdHlwZSwKKwkJMCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJjIDwgMCkKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAid3JpdGUgZW5hYmxlIGZhaWxlZCIpOwogCXJldHVybiByYzsKQEAgLTM1NCw3ICszNzcsOSBAQAogICogdXNlZCBvdXRzaWRlIGNhbV9zcGlfd3JpdGVfc2VxKCkuCiAgKi8KIHN0YXRpYyBpbnQzMl90IGNhbV9zcGlfcGFnZV9wcm9ncmFtKHN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsCi0JdWludDMyX3QgYWRkciwgdWludDhfdCAqZGF0YSwgdWludDE2X3QgbGVuLCB1aW50OF90ICp0eCkKKwl1aW50MzJfdCBhZGRyLCB1aW50OF90ICpkYXRhLAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUsCisJdWludDE2X3QgbGVuLCB1aW50OF90ICp0eCkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IGNhbV9jYW1lcmFfc3BpX2luc3QgKnBnID0KQEAgLTM2MiwxMCArMzg3LDkgQEAKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gY2xpZW50LT5zcGlfY2xpZW50LT5zcGlfbWFzdGVyOwogCXVpbnQ4X3QgcmV0cmllcyA9IGNsaWVudC0+c3BpX2NsaWVudC0+cmV0cmllczsKIAl1aW50OF90IGhlYWRlcl9sZW4gPSBzaXplb2YocGctPm9wY29kZSkgKyBwZy0+YWRkcl9sZW4gKyBwZy0+ZHVtbXlfbGVuOwotCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUgPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQ7CiAKIAlDQU1fREJHKENBTV9TRU5TT1IsICJhZGRyIDB4JXgsIHNpemUgMHgleCIsIGFkZHIsIGxlbik7Ci0JcmMgPSBjYW1fc3BpX3dyaXRlX2VuYWJsZShjbGllbnQpOworCXJjID0gY2FtX3NwaV93cml0ZV9lbmFibGUoY2xpZW50LCBhZGRyX3R5cGUpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAltZW1zZXQodHgsIDAsIGhlYWRlcl9sZW4pOwpAQCAtMzc1LDcgKzM5OSw3IEBACiAJQ0FNX0RCRyhDQU1fU0VOU09SLCAidHgoJXUpOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKIAkJbGVuLCB0eFswXSwgdHhbMV0sIHR4WzJdLCB0eFszXSk7CiAJd2hpbGUgKChyYyA9IHNwaV93cml0ZShzcGksIHR4LCBsZW4gKyBoZWFkZXJfbGVuKSkgJiYgcmV0cmllcykgewotCQlyYyA9IGNhbV9zcGlfd2FpdChjbGllbnQsIHBnKTsKKwkJcmMgPSBjYW1fc3BpX3dhaXQoY2xpZW50LCBwZywgYWRkcl90eXBlKTsKIAkJbXNsZWVwKGNsaWVudC0+c3BpX2NsaWVudC0+cmV0cnlfZGVsYXkpOwogCQlyZXRyaWVzLS07CiAJfQpAQCAtMzgzLDQxICs0MDcsNTQgQEAKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZmFpbGVkICVkIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQotCXJjID0gY2FtX3NwaV93YWl0KGNsaWVudCwgcGcpOworCXJjID0gY2FtX3NwaV93YWl0KGNsaWVudCwgcGcsIGFkZHJfdHlwZSk7CiAJCXJldHVybiByYzsKIH0KIAogaW50IGNhbV9zcGlfd3JpdGUoc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmNsaWVudCwKLQl1aW50MzJfdCBhZGRyLCB1aW50MTZfdCBkYXRhLAorCXVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGRhdGEsCisJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSwKIAllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgZGF0YV90eXBlKQogewogCXN0cnVjdCBjYW1fY2FtZXJhX3NwaV9pbnN0ICpwZyA9CiAJCSZjbGllbnQtPnNwaV9jbGllbnQtPmNtZF90YmwucGFnZV9wcm9ncmFtOwogCXVpbnQ4X3QgaGVhZGVyX2xlbiA9IHNpemVvZihwZy0+b3Bjb2RlKSArIHBnLT5hZGRyX2xlbiArIHBnLT5kdW1teV9sZW47CiAJdWludDE2X3QgbGVuID0gMDsKLQljaGFyIGJ1ZlsyXTsKKwljaGFyIGJ1ZltDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWF07CiAJY2hhciAqdHg7CiAJaW50IHJjID0gLUVJTlZBTDsKLQllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgYWRkcl90eXBlID0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9XT1JEOwogCi0JaWYgKChhZGRyX3R5cGUgPj0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9NQVgpCi0JCXx8IChkYXRhX3R5cGUgIT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFCi0JCSYmIGRhdGFfdHlwZSAhPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQpKQorCWlmICgoYWRkcl90eXBlIDw9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfSU5WQUxJRCkKKwkJfHwgKGFkZHJfdHlwZSA+PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWCkKKwkJfHwgKGRhdGFfdHlwZSA8PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX0lOVkFMSUQpCisJCXx8IChkYXRhX3R5cGUgIT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9NQVgpKQogCQlyZXR1cm4gcmM7CisKIAlDQU1fREJHKENBTV9FRVBST00sICJEYXRhOiAweCV4IiwgZGF0YSk7CiAJbGVuID0gaGVhZGVyX2xlbiArICh1aW50OF90KWRhdGFfdHlwZTsKIAl0eCA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJaWYgKCF0eCkKIAkJZ290byBOT01FTTsKKwogCWlmIChkYXRhX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFKSB7CiAJCWJ1ZlswXSA9IGRhdGE7CiAJCUNBTV9EQkcoQ0FNX0VFUFJPTSwgIkJ5dGUgJWQ6IDB4JXgiLCBsZW4sIGJ1ZlswXSk7CiAJfSBlbHNlIGlmIChkYXRhX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9XT1JEKSB7CiAJCWJ1ZlswXSA9IChkYXRhID4+IEJJVFNfUEVSX0JZVEUpICYgMHgwMEZGOwogCQlidWZbMV0gPSAoZGF0YSAmIDB4MDBGRik7CisJfSBlbHNlIGlmIChkYXRhX3R5cGUgPT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV8zQikgeworCQlidWZbMF0gPSAoZGF0YSA+PiAxNikgJiAweDAwRkY7CisJCWJ1ZlsxXSA9IChkYXRhID4+IDgpICYgMHgwMEZGOworCQlidWZbMl0gPSAoZGF0YSAmIDB4MDBGRik7CisJfSBlbHNlIHsKKwkJYnVmWzBdID0gKGRhdGEgPj4gMjQpICYgMHgwMEZGOworCQlidWZbMV0gPSAoZGF0YSA+PiAxNikgJiAweDAwRkY7CisJCWJ1ZlsyXSA9IChkYXRhID4+IDgpICYgMHgwMEZGOworCQlidWZbM10gPSAoZGF0YSAmIDB4MDBGRik7CiAJfQorCiAJcmMgPSBjYW1fc3BpX3BhZ2VfcHJvZ3JhbShjbGllbnQsIGFkZHIsIGJ1ZiwKLQkJKHVpbnQxNl90KWRhdGFfdHlwZSwgdHgpOworCQlhZGRyX3R5cGUsIGRhdGFfdHlwZSwgdHgpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gRVJST1I7CiAJZ290byBPVVQ7CkBAIC00NDIsMTggKzQ3OSwyMiBAQAogCiAJaWYgKCFjbGllbnQgfHwgIXdyaXRlX3NldHRpbmcpCiAJCXJldHVybiByYzsKLQlpZiAod3JpdGVfc2V0dGluZy0+YWRkcl90eXBlID49IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfTUFYCi0JCXx8ICh3cml0ZV9zZXR0aW5nLT5kYXRhX3R5cGUgIT0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9CWVRFCi0JCSYmIHdyaXRlX3NldHRpbmctPmRhdGFfdHlwZSAhPSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX1dPUkQpKQorCisJaWYgKCh3cml0ZV9zZXR0aW5nLT5hZGRyX3R5cGUgPD0gQ0FNRVJBX1NFTlNPUl9JMkNfVFlQRV9JTlZBTElEKQorCQl8fCAod3JpdGVfc2V0dGluZy0+YWRkcl90eXBlID49IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfTUFYKQorCQl8fCAod3JpdGVfc2V0dGluZy0+ZGF0YV90eXBlIDw9IENBTUVSQV9TRU5TT1JfSTJDX1RZUEVfSU5WQUxJRCkKKwkJfHwgKHdyaXRlX3NldHRpbmctPmRhdGFfdHlwZSA+PSBDQU1FUkFfU0VOU09SX0kyQ19UWVBFX01BWCkpCiAJCXJldHVybiByYzsKKwogCXJlZ19zZXR0aW5nID0gd3JpdGVfc2V0dGluZy0+cmVnX3NldHRpbmc7Ci0JY2xpZW50X2FkZHJfdHlwZSA9IGFkZHJfdHlwZTsKKwljbGllbnRfYWRkcl90eXBlID0gd3JpdGVfc2V0dGluZy0+YWRkcl90eXBlOwogCWFkZHJfdHlwZSA9IHdyaXRlX3NldHRpbmctPmFkZHJfdHlwZTsKIAlmb3IgKGkgPSAwOyBpIDwgd3JpdGVfc2V0dGluZy0+c2l6ZTsgaSsrKSB7CiAJCUNBTV9EQkcoQ0FNX1NFTlNPUiwgImFkZHIgJXggZGF0YSAleCIsCiAJCQlyZWdfc2V0dGluZy0+cmVnX2FkZHIsIHJlZ19zZXR0aW5nLT5yZWdfZGF0YSk7Ci0JCXJjID0gY2FtX3NwaV93cml0ZShjbGllbnQsIHJlZ19zZXR0aW5nLT5yZWdfYWRkciwKLQkJCXJlZ19zZXR0aW5nLT5yZWdfZGF0YSwgd3JpdGVfc2V0dGluZy0+ZGF0YV90eXBlKTsKKwkJcmMgPSBjYW1fc3BpX3dyaXRlKGNsaWVudCwKKwkJCXJlZ19zZXR0aW5nLT5yZWdfYWRkciwgcmVnX3NldHRpbmctPnJlZ19kYXRhLAorCQkJd3JpdGVfc2V0dGluZy0+YWRkcl90eXBlLCB3cml0ZV9zZXR0aW5nLT5kYXRhX3R5cGUpOwogCQlpZiAocmMgPCAwKQogCQkJYnJlYWs7CiAJCXJlZ19zZXR0aW5nKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX3NwaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfaW8vY2FtX3NlbnNvcl9zcGkuaAppbmRleCBhNDk3NDkxLi5lYzFiZWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl9pby9jYW1fc2Vuc29yX3NwaS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX2lvL2NhbV9zZW5zb3Jfc3BpLmgKQEAgLTc4LDEzICs3OCwyMiBAQAogCiBpbnQgY2FtX3NwaV9yZWFkKHN0cnVjdCBjYW1lcmFfaW9fbWFzdGVyICpjbGllbnQsCiAJdWludDMyX3QgYWRkciwgdWludDMyX3QgKmRhdGEsCisJZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZSwKIAllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgZGF0YV90eXBlKTsKIAoraW50IGNhbV9zcGlfcmVhZF9zZXEoc3RydWN0IGNhbWVyYV9pb19tYXN0ZXIgKmNsaWVudCwKKwl1aW50MzJfdCBhZGRyLCB1aW50OF90ICpkYXRhLAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUsCisJaW50MzJfdCBudW1fYnl0ZXMpOworCiBpbnQgY2FtX3NwaV9xdWVyeV9pZChzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAotCXVpbnQzMl90IGFkZHIsIHVpbnQ4X3QgKmRhdGEsIHVpbnQzMl90IG51bV9ieXRlKTsKKwl1aW50MzJfdCBhZGRyLAorCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBhZGRyX3R5cGUsCisJdWludDhfdCAqZGF0YSwgdWludDMyX3QgbnVtX2J5dGUpOwogCiBpbnQgY2FtX3NwaV93cml0ZShzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LAotCXVpbnQzMl90IGFkZHIsIHVpbnQxNl90IGRhdGEsCisJdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSwKKwllbnVtIGNhbWVyYV9zZW5zb3JfaTJjX3R5cGUgYWRkcl90eXBlLAogCWVudW0gY2FtZXJhX3NlbnNvcl9pMmNfdHlwZSBkYXRhX3R5cGUpOwogCiBpbnQgY2FtX3NwaV93cml0ZV90YWJsZShzdHJ1Y3QgY2FtZXJhX2lvX21hc3RlciAqY2xpZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl9jbW5faGVhZGVyLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NlbnNvcl9tb2R1bGUvY2FtX3NlbnNvcl91dGlscy9jYW1fc2Vuc29yX2Ntbl9oZWFkZXIuaAppbmRleCA2NTIwMDQyYi4uOTdiNGMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl9jbW5faGVhZGVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl9jbW5faGVhZGVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNkZWZpbmUgQ0FNX0NTSVBIWV9OQU1FICAgICJjYW0tY3NpcGh5IgogI2RlZmluZSBDQU1fRkxBU0hfTkFNRSAgICAgImNhbS1mbGFzaCIKICNkZWZpbmUgQ0FNX0VFUFJPTV9OQU1FICAgICJjYW0tZWVwcm9tIgorI2RlZmluZSBDQU1fT0lTX05BTUUgICAgICAgImNhbS1vaXMiCiAKICNkZWZpbmUgTUFYX1NZU1RFTV9QSVBFTElORV9ERUxBWSAyCiAKQEAgLTE2NSw2ICsxNjYsMTEgQEAKIAlDQU1fRUVQUk9NX1BBQ0tFVF9PUENPREVfSU5JVAogfTsKIAorZW51bSBjYW1fb2lzX3BhY2tldF9vcGNvZGVzIHsKKwlDQU1fT0lTX1BBQ0tFVF9PUENPREVfSU5JVCwKKwlDQU1fT0lTX1BBQ0tFVF9PUENPREVfT0lTX0NPTlRST0wKK307CisKIGVudW0gbXNtX2J1c19wZXJmX3NldHRpbmcgewogCVNfSU5JVCwKIAlTX1BSRVZJRVcsCkBAIC0yMDQsNiArMjEwLDggQEAKIAogZW51bSBjYW1fc2Vuc29yX2kyY19jbWRfdHlwZSB7CiAJQ0FNX1NFTlNPUl9JMkNfV1JJVEVfUkFORE9NLAorCUNBTV9TRU5TT1JfSTJDX1dSSVRFX0JVUlNULAorCUNBTV9TRU5TT1JfSTJDX1dSSVRFX1NFUSwKIAlDQU1fU0VOU09SX0kyQ19SRUFELAogCUNBTV9TRU5TT1JfSTJDX1BPTEwKIH07CkBAIC0yMjQsMTQgKzIzMiw2IEBACiAJZW51bSBjYW1lcmFfdnJlZ190eXBlIHR5cGU7CiB9OwogCi1zdHJ1Y3QgY2FtX3NlbnNvcl9tb2R1bGVfcG93ZXJfc2V0dGluZyB7Ci0JZW51bSBtc21fY2FtZXJhX3Bvd2VyX3NlcV90eXBlIHNlcV90eXBlOwotCXVuc2lnbmVkIHNob3J0IHNlcV92YWw7Ci0JdWludDMyX3QgY29uZmlnX3ZhbF9sb3c7Ci0JdWludDMyX3QgY29uZmlnX3ZhbF9oaWdoOwotCXVuc2lnbmVkIHNob3J0IGRlbGF5OwotfTsKLQogc3RydWN0IG1zbV9jYW1lcmFfZ3Bpb19udW1faW5mbyB7CiAJdWludDE2X3QgZ3Bpb19udW1bU0VOU09SX1NFUV9UWVBFX01BWF07CiAJdWludDhfdCB2YWxpZFtTRU5TT1JfU0VRX1RZUEVfTUFYXTsKQEAgLTMzMywyNiArMzMzLDYgQEAKIAl2b2lkICpkYXRhWzEwXTsKIH07CiAKLXN0cnVjdCBjYW1fc2Vuc29yX3Bvd2VyX3NldHRpbmdfYXJyYXkgewotCXN0cnVjdCBjYW1fc2Vuc29yX3Bvd2VyX3NldHRpbmcgIHBvd2VyX3NldHRpbmdfYVtNQVhfUE9XRVJfQ09ORklHXTsKLQlzdHJ1Y3QgY2FtX3NlbnNvcl9wb3dlcl9zZXR0aW5nICpwb3dlcl9zZXR0aW5nOwotCXVuc2lnbmVkIHNob3J0IHNpemU7Ci0Jc3RydWN0IGNhbV9zZW5zb3JfcG93ZXJfc2V0dGluZyAgcG93ZXJfZG93bl9zZXR0aW5nX2FbTUFYX1BPV0VSX0NPTkZJR107Ci0Jc3RydWN0IGNhbV9zZW5zb3JfcG93ZXJfc2V0dGluZyAqcG93ZXJfZG93bl9zZXR0aW5nOwotCXVuc2lnbmVkIHNob3J0IHNpemVfZG93bjsKLX07Ci0KLXN0cnVjdCBtc21fY2FtZXJhX3NlbnNvcl9zbGF2ZV9pbmZvIHsKLQllbnVtIG1zbV9zZW5zb3JfY2FtZXJhX2lkX3QgY2FtZXJhX2lkOwotCXVuc2lnbmVkIHNob3J0IHNsYXZlX2FkZHI7Ci0JZW51bSBpMmNfZnJlcV9tb2RlIGkyY19mcmVxX21vZGU7Ci0JZW51bSBjYW1lcmFfc2Vuc29yX2kyY190eXBlIGFkZHJfdHlwZTsKLQlzdHJ1Y3QgbXNtX3NlbnNvcl9pZF9pbmZvX3Qgc2Vuc29yX2lkX2luZm87Ci0Jc3RydWN0IGNhbV9zZW5zb3JfcG93ZXJfc2V0dGluZ19hcnJheSBwb3dlcl9zZXR0aW5nX2FycmF5OwotCXVuc2lnbmVkIGNoYXIgIGlzX2luaXRfcGFyYW1zX3ZhbGlkOwotCWVudW0gbXNtX3NlbnNvcl9vdXRwdXRfZm9ybWF0X3Qgb3V0cHV0X2Zvcm1hdDsKLX07Ci0KIHN0cnVjdCBjYW1fc2Vuc29yX2JvYXJkX2luZm8gewogCXN0cnVjdCBjYW1fY2FtZXJhX3NsYXZlX2luZm8gc2xhdmVfaW5mbzsKIAlpbnQzMl90IHNlbnNvcl9tb3VudF9hbmdsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc2Vuc29yX21vZHVsZS9jYW1fc2Vuc29yX3V0aWxzL2NhbV9zZW5zb3JfdXRpbC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl91dGlsLmMKaW5kZXggYjE2OThjYS4uYmNkYWY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl91dGlsLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zZW5zb3JfbW9kdWxlL2NhbV9zZW5zb3JfdXRpbHMvY2FtX3NlbnNvcl91dGlsLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJKHN0cnVjdCBjYW1fY21kX3VuY29uZGl0aW9uYWxfd2FpdCAqKSAqY21kX2J1ZjsKIAlzdHJ1Y3QgaTJjX3NldHRpbmdzX2xpc3QgKmkyY19saXN0ID0gTlVMTDsKIAotCWlmIChpMmNfbGlzdCA9PSBOVUxMKSB7CisJaWYgKGxpc3RfcHRyID09IE5VTEwpIHsKIAkJQ0FNX0VSUihDQU1fU0VOU09SLCAiSW52YWxpZCBsaXN0IHB0ciIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xOTYsNiArMTk2LDU5IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50MzJfdCBjYW1fc2Vuc29yX2hhbmRsZV9jb250aW51b3VzX3dyaXRlKAorCXN0cnVjdCBjYW1fY21kX2kyY19jb250aW51b3VzX3dyICpjYW1fY21kX2kyY19jb250aW51b3VzX3dyLAorCXN0cnVjdCBpMmNfc2V0dGluZ3NfYXJyYXkgKmkyY19yZWdfc2V0dGluZ3MsCisJdWludDE2X3QgKmNtZF9sZW5ndGhfaW5fYnl0ZXMsIGludDMyX3QgKm9mZnNldCwKKwlzdHJ1Y3QgbGlzdF9oZWFkICoqbGlzdCkKK3sKKwlzdHJ1Y3QgaTJjX3NldHRpbmdzX2xpc3QgKmkyY19saXN0OworCWludDMyX3QgcmMgPSAwLCBjbnQ7CisKKwlpMmNfbGlzdCA9IGNhbV9zZW5zb3JfZ2V0X2kyY19wdHIoaTJjX3JlZ19zZXR0aW5ncywKKwkJY2FtX2NtZF9pMmNfY29udGludW91c193ci0+aGVhZGVyLmNvdW50KTsKKwlpZiAoaTJjX2xpc3QgPT0gTlVMTCB8fAorCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLnJlZ19zZXR0aW5nID09IE5VTEwpIHsKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiRmFpbGVkIGluIGFsbG9jYXRpbmcgaTJjX2xpc3QiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKmNtZF9sZW5ndGhfaW5fYnl0ZXMgPSAoc2l6ZW9mKHN0cnVjdCBpMmNfcmR3cl9oZWFkZXIpICsKKwkJc2l6ZW9mKGNhbV9jbWRfaTJjX2NvbnRpbnVvdXNfd3ItPnJlZ19hZGRyKSArCisJCXNpemVvZihzdHJ1Y3QgY2FtX2NtZF9yZWFkKSAqCisJCShjYW1fY21kX2kyY19jb250aW51b3VzX3dyLT5oZWFkZXIuY291bnQpKTsKKwlpZiAoY2FtX2NtZF9pMmNfY29udGludW91c193ci0+aGVhZGVyLm9wX2NvZGUgPT0KKwkJQ0FNRVJBX1NFTlNPUl9JMkNfT1BfQ09OVF9XUl9CUlNUKQorCQlpMmNfbGlzdC0+b3BfY29kZSA9IENBTV9TRU5TT1JfSTJDX1dSSVRFX0JVUlNUOworCWVsc2UgaWYgKGNhbV9jbWRfaTJjX2NvbnRpbnVvdXNfd3ItPmhlYWRlci5vcF9jb2RlID09CisJCUNBTUVSQV9TRU5TT1JfSTJDX09QX0NPTlRfV1JfU0VRTikKKwkJaTJjX2xpc3QtPm9wX2NvZGUgPSBDQU1fU0VOU09SX0kyQ19XUklURV9TRVE7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkyY19saXN0LT5pMmNfc2V0dGluZ3MuYWRkcl90eXBlID0KKwkJY2FtX2NtZF9pMmNfY29udGludW91c193ci0+aGVhZGVyLmFkZHJfdHlwZTsKKwlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLmRhdGFfdHlwZSA9CisJCWNhbV9jbWRfaTJjX2NvbnRpbnVvdXNfd3ItPmhlYWRlci5kYXRhX3R5cGU7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IChjYW1fY21kX2kyY19jb250aW51b3VzX3dyLT5oZWFkZXIuY291bnQpOworCQljbnQrKykgeworCQlpMmNfbGlzdC0+aTJjX3NldHRpbmdzLnJlZ19zZXR0aW5nW2NudF0ucmVnX2FkZHIgPQorCQkJY2FtX2NtZF9pMmNfY29udGludW91c193ci0+CisJCQlyZWdfYWRkcjsKKwkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCXJlZ19zZXR0aW5nW2NudF0ucmVnX2RhdGEgPQorCQkJY2FtX2NtZF9pMmNfY29udGludW91c193ci0+CisJCQlkYXRhX3JlYWRbY250XS5yZWdfZGF0YTsKKwkJaTJjX2xpc3QtPmkyY19zZXR0aW5ncy4KKwkJCXJlZ19zZXR0aW5nW2NudF0uZGF0YV9tYXNrID0gMDsKKwl9CisJKCpvZmZzZXQpICs9IGNudDsKKwkqbGlzdCA9ICYoaTJjX2xpc3QtPmxpc3QpOworCisJcmV0dXJuIHJjOworfQorCiAvKioKICAqIE5hbWUgOiBjYW1fc2Vuc29yX2kyY19wa3RfcGFyc2VyCiAgKiBEZXNjcmlwdGlvbiA6IFBhcnNlIENTTCBDQ0kgcGFja2V0IGFuZCBhcHBseSByZWdpc3RlciBzZXR0aW5ncwpAQCAtMjYwLDcgKzMxMywyOSBAQAogCQkJCQkmY21kX2xlbmd0aF9pbl9ieXRlcywgJmosICZsaXN0KTsKIAkJCQlpZiAocmMgPCAwKSB7CiAJCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKLQkJCQkJCSJGYWlsZWQgaW4gcmFuZG9tIHJlYWQgJWQiLCByYyk7CisJCQkJCSJGYWlsZWQgaW4gcmFuZG9tIHdyaXRlICVkIiwgcmMpOworCQkJCQlyZXR1cm4gcmM7CisJCQkJfQorCisJCQkJY21kX2J1ZiArPSBjbWRfbGVuZ3RoX2luX2J5dGVzIC8KKwkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKKwkJCQlieXRlX2NudCArPSBjbWRfbGVuZ3RoX2luX2J5dGVzOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBDQU1FUkFfU0VOU09SX0NNRF9UWVBFX0kyQ19DT05UX1dSOiB7CisJCQkJdWludDE2X3QgY21kX2xlbmd0aF9pbl9ieXRlcyAgID0gMDsKKwkJCQlzdHJ1Y3QgY2FtX2NtZF9pMmNfY29udGludW91c193cgorCQkJCSpjYW1fY21kX2kyY19jb250aW51b3VzX3dyID0KKwkJCQkoc3RydWN0IGNhbV9jbWRfaTJjX2NvbnRpbnVvdXNfd3IgKikKKwkJCQljbWRfYnVmOworCisJCQkJcmMgPSBjYW1fc2Vuc29yX2hhbmRsZV9jb250aW51b3VzX3dyaXRlKAorCQkJCQljYW1fY21kX2kyY19jb250aW51b3VzX3dyLAorCQkJCQlpMmNfcmVnX3NldHRpbmdzLAorCQkJCQkmY21kX2xlbmd0aF9pbl9ieXRlcywgJmosICZsaXN0KTsKKwkJCQlpZiAocmMgPCAwKSB7CisJCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwKKwkJCQkJIkZhaWxlZCBpbiBjb250aW51b3VzIHdyaXRlICVkIiwgcmMpOwogCQkJCQlyZXR1cm4gcmM7CiAJCQkJfQogCkBAIC0zMjMsNyArMzk4LDcgQEAKIAl1aW50MTZfdCBwb3dlcl9zZXR0aW5nX3NpemUpCiB7CiAJaW50MzJfdCByYyA9IDAsIGogPSAwLCBpID0gMDsKLQl1aW50MzJfdCBudW1fdnJlZzsKKwlpbnQgbnVtX3ZyZWc7CiAKIAkvKiBWYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzICovCiAJaWYgKCFzb2NfaW5mbyB8fCAhcG93ZXJfc2V0dGluZykgewpAQCAtMzM0LDEyICs0MDksMjAgQEAKIAogCW51bV92cmVnID0gc29jX2luZm8tPm51bV9yZ2x0cjsKIAotCWlmIChudW1fdnJlZyA8PSAwKSB7CisJaWYgKChudW1fdnJlZyA8PSAwKSB8fCAobnVtX3ZyZWcgPiBDQU1fU09DX01BWF9SRUdVTEFUT1IpKSB7CiAJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImZhaWxlZDogbnVtX3ZyZWcgJWQiLCBudW1fdnJlZyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBwb3dlcl9zZXR0aW5nX3NpemU7IGkrKykgeworCisJCWlmIChwb3dlcl9zZXR0aW5nW2ldLnNlcV90eXBlIDwgU0VOU09SX01DTEsgfHwKKwkJCXBvd2VyX3NldHRpbmdbaV0uc2VxX3R5cGUgPj0gU0VOU09SX1NFUV9UWVBFX01BWCkgeworCQkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZmFpbGVkOiBJbnZhbGlkIFNlcSB0eXBlXG4iLAorCQkJCXBvd2VyX3NldHRpbmdbaV0uc2VxX3R5cGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQlzd2l0Y2ggKHBvd2VyX3NldHRpbmdbaV0uc2VxX3R5cGUpIHsKIAkJY2FzZSBTRU5TT1JfVkRJRzoKIAkJCWZvciAoaiA9IDA7IGogPCBudW1fdnJlZzsgaisrKSB7CkBAIC00ODgsMTIgKzU3MSw4IEBACiAJCQlpZiAoaiA9PSBudW1fdnJlZykKIAkJCQlwb3dlcl9zZXR0aW5nW2ldLnNlcV92YWwgPSBJTlZBTElEX1ZSRUc7CiAJCQlicmVhazsKLQotCQlkZWZhdWx0OiB7Ci0JCQlDQU1fRVJSKENBTV9TRU5TT1IsICJpbnZhbGlkIHNlcV92YWwgJWQiLAotCQkJCXBvd2VyX3NldHRpbmdbaV0uc2VxX3ZhbCk7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKLQkJCX0KIAkJfQogCX0KIApAQCAtNTA3LDE1ICs1ODYsMjEgQEAKIAl1aW50OF90IHNpemUgPSAwOwogCXN0cnVjdCBjYW1fc29jX2dwaW9fZGF0YSAqZ3Bpb19jb25mID0KIAkJCXNvY19pbmZvLT5ncGlvX2RhdGE7Ci0Jc3RydWN0IGdwaW8gKmdwaW9fdGJsID0gZ3Bpb19jb25mLT5jYW1fZ3Bpb19yZXFfdGJsOworCXN0cnVjdCBncGlvICpncGlvX3RibCA9IE5VTEw7CiAKLQlzaXplID0gZ3Bpb19jb25mLT5jYW1fZ3Bpb19yZXFfdGJsX3NpemU7CisJaWYgKCFncGlvX2NvbmYpIHsKKwkJQ0FNX0lORk8oQ0FNX1NFTlNPUiwgIk5vIEdQSU8gZGF0YSIpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoZ3Bpb19jb25mLT5jYW1fZ3Bpb19jb21tb25fdGJsX3NpemUgPD0gMCkgewogCQlDQU1fSU5GTyhDQU1fU0VOU09SLCAiTm8gR1BJTyBlbnRyeSIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZ3Bpb190YmwgPSBncGlvX2NvbmYtPmNhbV9ncGlvX3JlcV90Ymw7CisJc2l6ZSA9IGdwaW9fY29uZi0+Y2FtX2dwaW9fcmVxX3RibF9zaXplOworCiAJaWYgKCFncGlvX3RibCB8fCAhc2l6ZSkgewogCQlDQU1fRVJSKENBTV9TRU5TT1IsICJpbnZhbGlkIGdwaW9fdGJsICVwSyAvIHNpemUgJWQiLAogCQkJZ3Bpb190YmwsIHNpemUpOwpAQCAtODU3LDEzICs5NDIsMTYgQEAKIHsKIAlpbnQgcmMgPSAwLCB2YWwgPSAwOwogCXVpbnQzMl90IGdwaW9fYXJyYXlfc2l6ZTsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBOVUxMOwogCXN0cnVjdCBjYW1fc29jX2dwaW9fZGF0YSAqZ2NvbmYgPSBOVUxMOwogCXN0cnVjdCBtc21fY2FtZXJhX2dwaW9fbnVtX2luZm8gKmdwaW9fbnVtX2luZm8gPSBOVUxMOwogCi0JcGRldiA9IHNvY19pbmZvLT5wZGV2OwotCW9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpZiAoIXNvY19pbmZvLT5kZXYpIHsKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZGV2aWNlIG5vZGUgTlVMTCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvZl9ub2RlID0gc29jX2luZm8tPmRldi0+b2Zfbm9kZTsKIAogCWdjb25mID0gc29jX2luZm8tPmdwaW9fZGF0YTsKIAlpZiAoIWdjb25mKSB7CkBAIC0xMDk2LDggKzExODQsOCBAQAogCWludCBncGlvX29mZnNldCA9IC0xOwogCiAJaWYgKCFncGlvX251bV9pbmZvKSB7Ci0JCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIklucHV0IFBhcmFtZXRlcnMgYXJlIG5vdCBwcm9wZXIiKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCUNBTV9JTkZPKENBTV9TRU5TT1IsICJJbnB1dCBQYXJhbWV0ZXJzIGFyZSBub3QgcHJvcGVyIik7CisJCXJldHVybiAwOwogCX0KIAogCUNBTV9EQkcoQ0FNX1NFTlNPUiwgIlNlcSB0eXBlOiAlZCwgY29uZmlnOiAlZCIsIHNlcV90eXBlLCB2YWwpOwpAQCAtMTEzMiw4ICsxMjIwLDggQEAKIAlncGlvX251bV9pbmZvID0gY3RybC0+Z3Bpb19udW1faW5mbzsKIAludW1fdnJlZyA9IHNvY19pbmZvLT5udW1fcmdsdHI7CiAKLQlpZiAoKG51bV92cmVnID09IDApIHx8IChudW1fdnJlZyA+IENBTV9TT0NfTUFYX1JFR1VMQVRPUikpIHsKLQkJQ0FNX0VSUihDQU1fU0VOU09SLCAiUmVndWxhdG9ycyBhcmUgbm90IGluaXRpYWxpemVkIik7CisJaWYgKChudW1fdnJlZyA8PSAwKSB8fCAobnVtX3ZyZWcgPiBDQU1fU09DX01BWF9SRUdVTEFUT1IpKSB7CisJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImZhaWxlZDogbnVtX3ZyZWcgJWQiLCBudW1fdnJlZyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTE3Nyw3ICsxMjY1LDcgQEAKIAogCQkJCQlzb2NfaW5mby0+cmdsdHJbal0gPQogCQkJCQlyZWd1bGF0b3JfZ2V0KAotCQkJCQkJJnNvY19pbmZvLT5wZGV2LT5kZXYsCisJCQkJCQlzb2NfaW5mby0+ZGV2LAogCQkJCQkJc29jX2luZm8tPnJnbHRyX25hbWVbal0pOwogCiAJCQkJCWlmIChJU19FUlJfT1JfTlVMTCgKQEAgLTEyMjksMTYgKzEzMTcsMTMgQEAKIAkJCQlDQU1fRVJSKENBTV9TRU5TT1IsICJyZXF1ZXN0IGdwaW8gZmFpbGVkIik7CiAJCQkJcmV0dXJuIG5vX2dwaW87CiAJCQl9Ci0JCQlpZiAocG93ZXJfc2V0dGluZy0+c2VxX3ZhbCA+PSBDQU1fVlJFR19NQVggfHwKLQkJCQkhZ3Bpb19udW1faW5mbykgewotCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgImdwaW8gaW5kZXggJWQgPj0gbWF4ICVkIiwKLQkJCQkJcG93ZXJfc2V0dGluZy0+c2VxX3ZhbCwKLQkJCQkJQ0FNX1ZSRUdfTUFYKTsKKwkJCWlmICghZ3Bpb19udW1faW5mbykgeworCQkJCUNBTV9FUlIoQ0FNX1NFTlNPUiwgIkludmFsaWQgZ3Bpb19udW1faW5mbyIpOwogCQkJCWdvdG8gcG93ZXJfdXBfZmFpbGVkOwogCQkJfQogCQkJQ0FNX0RCRyhDQU1fU0VOU09SLCAiZ3BpbyBzZXQgdmFsICVkIiwKIAkJCQlncGlvX251bV9pbmZvLT5ncGlvX251bQotCQkJCVtwb3dlcl9zZXR0aW5nLT5zZXFfdmFsXSk7CisJCQkJW3Bvd2VyX3NldHRpbmctPnNlcV90eXBlXSk7CiAKIAkJCXJjID0gbXNtX2NhbV9zZW5zb3JfaGFuZGxlX3JlZ19ncGlvKAogCQkJCXBvd2VyX3NldHRpbmctPnNlcV90eXBlLApAQCAtMTI3MCw3ICsxMzU1LDcgQEAKIAkJCQl2cmVnX2lkeCA9IHBvd2VyX3NldHRpbmctPnNlcV92YWw7CiAKIAkJCQlzb2NfaW5mby0+cmdsdHJbdnJlZ19pZHhdID0KLQkJCQkJcmVndWxhdG9yX2dldCgmc29jX2luZm8tPnBkZXYtPmRldiwKKwkJCQkJcmVndWxhdG9yX2dldChzb2NfaW5mby0+ZGV2LAogCQkJCQkJc29jX2luZm8tPnJnbHRyX25hbWVbdnJlZ19pZHhdKTsKIAkJCQlpZiAoSVNfRVJSX09SX05VTEwoCiAJCQkJCXNvY19pbmZvLT5yZ2x0clt2cmVnX2lkeF0pKSB7CkBAIC0xMzM2LDExICsxNDIxLDExIEBACiAJCQlpZiAoIWdwaW9fbnVtX2luZm8pCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWdwaW9fbnVtX2luZm8tPnZhbGlkCi0JCQkJW3Bvd2VyX3NldHRpbmctPnNlcV92YWxdKQorCQkJCVtwb3dlcl9zZXR0aW5nLT5zZXFfdHlwZV0pCiAJCQkJY29udGludWU7CiAJCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcCgKIAkJCQlncGlvX251bV9pbmZvLT5ncGlvX251bQotCQkJCVtwb3dlcl9zZXR0aW5nLT5zZXFfdmFsXSwgR1BJT0ZfT1VUX0lOSVRfTE9XKTsKKwkJCQlbcG93ZXJfc2V0dGluZy0+c2VxX3R5cGVdLCBHUElPRl9PVVRfSU5JVF9MT1cpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0VOU09SX1ZBTkE6CiAJCWNhc2UgU0VOU09SX1ZESUc6CkBAIC0xNDgxLDYgKzE1NjYsMTEgQEAKIAlncGlvX251bV9pbmZvID0gY3RybC0+Z3Bpb19udW1faW5mbzsKIAludW1fdnJlZyA9IHNvY19pbmZvLT5udW1fcmdsdHI7CiAKKwlpZiAoKG51bV92cmVnIDw9IDApIHx8IChudW1fdnJlZyA+IENBTV9TT0NfTUFYX1JFR1VMQVRPUikpIHsKKwkJQ0FNX0VSUihDQU1fU0VOU09SLCAiZmFpbGVkOiBudW1fdnJlZyAlZCIsIG51bV92cmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3RybC0+cG93ZXJfZG93bl9zZXR0aW5nX3NpemU7IGluZGV4KyspIHsKIAkJQ0FNX0RCRyhDQU1fU0VOU09SLCAiaW5kZXggJWQiLCAgaW5kZXgpOwogCQlwZCA9ICZjdHJsLT5wb3dlcl9kb3duX3NldHRpbmdbaW5kZXhdOwpAQCAtMTUwNiwxMiArMTU5NiwxMiBAQAogCQljYXNlIFNFTlNPUl9DVVNUT01fR1BJTzE6CiAJCWNhc2UgU0VOU09SX0NVU1RPTV9HUElPMjoKIAotCQkJaWYgKCFncGlvX251bV9pbmZvLT52YWxpZFtwZC0+c2VxX3ZhbF0pCisJCQlpZiAoIWdwaW9fbnVtX2luZm8tPnZhbGlkW3BkLT5zZXFfdHlwZV0pCiAJCQkJY29udGludWU7CiAKIAkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKAogCQkJCWdwaW9fbnVtX2luZm8tPmdwaW9fbnVtCi0JCQkJW3BkLT5zZXFfdmFsXSwKKwkJCQlbcGQtPnNlcV90eXBlXSwKIAkJCQkoaW50KSBwZC0+Y29uZmlnX3ZhbCk7CiAKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zbW11L2NhbV9zbW11X2FwaS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zbW11L2NhbV9zbW11X2FwaS5jCmluZGV4IGZmN2EwZTUuLmNiZjU0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdS9jYW1fc21tdV9hcGkuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NtbXUvY2FtX3NtbXVfYXBpLmMKQEAgLTIxLDcgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9tc21fZG1hX2lvbW11X21hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgotCisjaW5jbHVkZSA8c29jL3Fjb20vc2NtLmg+CisjaW5jbHVkZSA8c29jL3Fjb20vc2VjdXJlX2J1ZmZlci5oPgogI2luY2x1ZGUgImNhbV9zbW11X2FwaS5oIgogI2luY2x1ZGUgImNhbV9kZWJ1Z191dGlsLmgiCiAKQEAgLTExOCw2ICsxMTksNyBAQAogCQlpbnQsIHZvaWQqKTsKIAl2b2lkICp0b2tlbltDQU1fU01NVV9DQl9NQVhdOwogCWludCBjYl9jb3VudDsKKwlpbnQgc2VjdXJlX2NvdW50OwogfTsKIAogc3RydWN0IGNhbV9pb21tdV9jYl9zZXQgewpAQCAtMTUxLDYgKzE1MywxNyBAQAogCXNpemVfdCBwaHlzX2xlbjsKIH07CiAKK3N0cnVjdCBjYW1fc2VjX2J1ZmZfaW5mbyB7CisJc3RydWN0IGlvbl9oYW5kbGUgKmlfaGRsOworCXN0cnVjdCBpb25fY2xpZW50ICppX2NsaWVudDsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisJaW50IHJlZl9jb3VudDsKKwlkbWFfYWRkcl90IHBhZGRyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgaW9uX2ZkOworCXNpemVfdCBsZW47Cit9OworCiBzdGF0aWMgc3RydWN0IGNhbV9pb21tdV9jYl9zZXQgaW9tbXVfY2Jfc2V0OwogCiBzdGF0aWMgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gY2FtX3NtbXVfdHJhbnNsYXRlX2RpcigKQEAgLTE2Niw2ICsxNzksOSBAQAogc3RhdGljIHN0cnVjdCBjYW1fZG1hX2J1ZmZfaW5mbyAqY2FtX3NtbXVfZmluZF9tYXBwaW5nX2J5X2lvbl9pbmRleChpbnQgaWR4LAogCWludCBpb25fZmQpOwogCitzdGF0aWMgc3RydWN0IGNhbV9zZWNfYnVmZl9pbmZvICpjYW1fc21tdV9maW5kX21hcHBpbmdfYnlfc2VjX2J1Zl9pZHgoaW50IGlkeCwKKwlpbnQgaW9uX2ZkKTsKKwogc3RhdGljIGludCBjYW1fc21tdV9pbml0X3NjcmF0Y2hfbWFwKHN0cnVjdCBzY3JhdGNoX21hcHBpbmcgKnNjcmF0Y2hfbWFwLAogCWRtYV9hZGRyX3QgYmFzZSwgc2l6ZV90IHNpemUsCiAJaW50IG9yZGVyKTsKQEAgLTU0NCw3ICs1NjAsMTUgQEAKIAkJCQkJIkVycm9yOiAlcyBhbHJlYWR5IGdvdCBoYW5kbGUgMHgleCIsCiAJCQkJCW5hbWUsCiAJCQkJCWlvbW11X2NiX3NldC5jYl9pbmZvW2ldLmhhbmRsZSk7CisKKwkJCQlpZiAoaW9tbXVfY2Jfc2V0LmNiX2luZm9baV0uaXNfc2VjdXJlKQorCQkJCQlpb21tdV9jYl9zZXQuY2JfaW5mb1tpXS5zZWN1cmVfY291bnQrKzsKKwogCQkJCW11dGV4X3VubG9jaygmaW9tbXVfY2Jfc2V0LmNiX2luZm9baV0ubG9jayk7CisJCQkJaWYgKGlvbW11X2NiX3NldC5jYl9pbmZvW2ldLmlzX3NlY3VyZSkgeworCQkJCQkqaGRsID0gaW9tbXVfY2Jfc2V0LmNiX2luZm9baV0uaGFuZGxlOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKQEAgLTU1Niw2ICs1ODAsOCBAQAogCQkJLyogcHV0IGhhbmRsZSBpbiB0aGUgdGFibGUgKi8KIAkJCWlvbW11X2NiX3NldC5jYl9pbmZvW2ldLmhhbmRsZSA9IGhhbmRsZTsKIAkJCWlvbW11X2NiX3NldC5jYl9pbmZvW2ldLmNiX2NvdW50ID0gMDsKKwkJCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpXS5pc19zZWN1cmUpCisJCQkJaW9tbXVfY2Jfc2V0LmNiX2luZm9baV0uc2VjdXJlX2NvdW50Kys7CiAJCQkqaGRsID0gaGFuZGxlOwogCQkJQ0FNX0RCRyhDQU1fU01NVSwgIiVzIGNyZWF0ZXMgaGFuZGxlIDB4JXgiLAogCQkJCW5hbWUsIGhhbmRsZSk7CkBAIC02OTMsNiArNzE5LDI0IEBACiAKIAlDQU1fRVJSKENBTV9TTU1VLCAiRXJyb3I6IENhbm5vdCBmaW5kIGZkICVkIGJ5IGluZGV4ICVkIiwKIAkJaW9uX2ZkLCBpZHgpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FtX3NlY19idWZmX2luZm8gKmNhbV9zbW11X2ZpbmRfbWFwcGluZ19ieV9zZWNfYnVmX2lkeChpbnQgaWR4LAorCWludCBpb25fZmQpCit7CisJc3RydWN0IGNhbV9zZWNfYnVmZl9pbmZvICptYXBwaW5nOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXBwaW5nLCAmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5zbW11X2J1Zl9saXN0LAorCQlsaXN0KSB7CisJCWlmIChtYXBwaW5nLT5pb25fZmQgPT0gaW9uX2ZkKSB7CisJCQlDQU1fREJHKENBTV9TTU1VLCAiZmluZCBpb25fZmQgJWQiLCBpb25fZmQpOworCQkJcmV0dXJuIG1hcHBpbmc7CisJCX0KKwl9CisJQ0FNX0VSUihDQU1fU01NVSwgIkVycm9yOiBDYW5ub3QgZmluZCBmZCAlZCBieSBpbmRleCAlZCIsCisJCWlvbl9mZCwgaWR4KTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTMzOSw2ICsxMzgzLDI1IEBACiAJcmV0dXJuIENBTV9TTU1VX0JVRkZfTk9UX0VYSVNUOwogfQogCitzdGF0aWMgZW51bSBjYW1fc21tdV9idWZfc3RhdGUgY2FtX3NtbXVfY2hlY2tfc2VjdXJlX2ZkX2luX2xpc3QoaW50IGlkeCwKKwkJCQkJaW50IGlvbl9mZCwgZG1hX2FkZHJfdCAqcGFkZHJfcHRyLAorCQkJCQlzaXplX3QgKmxlbl9wdHIpCit7CisJc3RydWN0IGNhbV9zZWNfYnVmZl9pbmZvICptYXBwaW5nOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXBwaW5nLAorCQkJJmlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uc21tdV9idWZfbGlzdCwKKwkJCWxpc3QpIHsKKwkJaWYgKG1hcHBpbmctPmlvbl9mZCA9PSBpb25fZmQpIHsKKwkJCSpwYWRkcl9wdHIgPSBtYXBwaW5nLT5wYWRkcjsKKwkJCSpsZW5fcHRyID0gbWFwcGluZy0+bGVuOworCQkJcmV0dXJuIENBTV9TTU1VX0JVRkZfRVhJU1Q7CisJCX0KKwl9CisKKwlyZXR1cm4gQ0FNX1NNTVVfQlVGRl9OT1RfRVhJU1Q7Cit9CisKIGludCBjYW1fc21tdV9nZXRfaGFuZGxlKGNoYXIgKmlkZW50aWZpZXIsIGludCAqaGFuZGxlX3B0cikKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTE3MjIsMTQgKzE3ODUsMjAwIEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgY2FtX3NtbXVfbWFwX3NlY19pb3ZhKGludCBoYW5kbGUsIGludCBpb25fZmQsCi0JZW51bSBjYW1fc21tdV9tYXBfZGlyIGRpciwgZG1hX2FkZHJfdCAqcGFkZHJfcHRyLAotCXNpemVfdCAqbGVuX3B0cikKK3N0YXRpYyBpbnQgY2FtX3NtbXVfbWFwX3N0YWdlMl9idWZmZXJfYW5kX2FkZF90b19saXN0KGludCBpZHgsIGludCBpb25fZmQsCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkbWFfZGlyLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAorCQkgZG1hX2FkZHJfdCAqcGFkZHJfcHRyLAorCQkgc2l6ZV90ICpsZW5fcHRyKQogewotCS8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQlyZXR1cm4gLUVQRVJNOworCWludCByYyA9IDA7CisJc3RydWN0IGlvbl9oYW5kbGUgKmlfaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgY2FtX3NlY19idWZmX2luZm8gKm1hcHBpbmdfaW5mbzsKKworCS8qIGNsZWFuIHRoZSBjb250ZW50IGZyb20gY2xpZW50cyAqLworCSpwYWRkcl9wdHIgPSAoZG1hX2FkZHJfdClOVUxMOworCSpsZW5fcHRyID0gKHNpemVfdCkwOworCisJaV9oYW5kbGUgPSBpb25faW1wb3J0X2RtYV9idWZfZmQoY2xpZW50LCBpb25fZmQpOworCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKShpX2hhbmRsZSkpKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsICJpb24gaW1wb3J0IGRtYSBidWZmZXIgZmFpbGVkIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHJldHVybiBhZGRyIGFuZCBsZW4gdG8gY2xpZW50ICovCisJcmMgPSBpb25fcGh5cyhjbGllbnQsIGlfaGFuZGxlLCBwYWRkcl9wdHIsIGxlbl9wdHIpOworCWlmIChyYykgeworCQlDQU1fRVJSKENBTV9TTU1VLCAiSU9OIEdldCBQaHlzaWNhbCBmYWlsZWQsIHJjOiAlZCIsCisJCQlyYyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBmaWxsIHVwIG1hcHBpbmdfaW5mbyAqLworCW1hcHBpbmdfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYW1fc2VjX2J1ZmZfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbWFwcGluZ19pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hcHBpbmdfaW5mby0+aW9uX2ZkID0gaW9uX2ZkOworCW1hcHBpbmdfaW5mby0+cGFkZHIgPSAqcGFkZHJfcHRyOworCW1hcHBpbmdfaW5mby0+bGVuID0gKmxlbl9wdHI7CisJbWFwcGluZ19pbmZvLT5kaXIgPSBkbWFfZGlyOworCW1hcHBpbmdfaW5mby0+cmVmX2NvdW50ID0gMTsKKwltYXBwaW5nX2luZm8tPmlfaGRsID0gaV9oYW5kbGU7CisJbWFwcGluZ19pbmZvLT5pX2NsaWVudCA9IGNsaWVudDsKKworCUNBTV9EQkcoQ0FNX1NNTVUsICJpb25fZmQgPSAlZCwgZGV2ID0gJXBLLCBwYWRkcj0gJXBLLCBsZW4gPSAldSIsCisJCQlpb25fZmQsCisJCQkodm9pZCAqKWlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uZGV2LAorCQkJKHZvaWQgKikqcGFkZHJfcHRyLCAodW5zaWduZWQgaW50KSpsZW5fcHRyKTsKKworCS8qIGFkZCB0byB0aGUgbGlzdCAqLworCWxpc3RfYWRkKCZtYXBwaW5nX2luZm8tPmxpc3QsICZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLnNtbXVfYnVmX2xpc3QpOworCisJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChjYW1fc21tdV9tYXBfc2VjX2lvdmEpOworCitpbnQgY2FtX3NtbXVfbWFwX3N0YWdlMl9pb3ZhKGludCBoYW5kbGUsCisJCWludCBpb25fZmQsIGVudW0gY2FtX3NtbXVfbWFwX2RpciBkaXIsCisJCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGlvbl9waHlzX2FkZHJfdCAqcGFkZHJfcHRyLAorCQlzaXplX3QgKmxlbl9wdHIpCit7CisJaW50IGlkeCwgcmM7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcjsKKwllbnVtIGNhbV9zbW11X2J1Zl9zdGF0ZSBidWZfc3RhdGU7CisKKwlpZiAoIXBhZGRyX3B0ciB8fCAhbGVuX3B0cikgeworCQlDQU1fRVJSKENBTV9TTU1VLAorCQkJIkVycm9yOiBJbnZhbGlkIGlucHV0cywgcGFkZHJfcHRyOiVwSywgbGVuX3B0cjogJXBLIiwKKwkJCXBhZGRyX3B0ciwgbGVuX3B0cik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBjbGVhbiB0aGUgY29udGVudCBmcm9tIGNsaWVudHMgKi8KKwkqcGFkZHJfcHRyID0gKGRtYV9hZGRyX3QpTlVMTDsKKwkqbGVuX3B0ciA9IChzaXplX3QpMDsKKworCWRtYV9kaXIgPSBjYW1fc21tdV90cmFuc2xhdGVfZGlyKGRpcik7CisJaWYgKGRtYV9kaXIgPT0gRE1BX05PTkUpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogdHJhbnNsYXRlIGRpcmVjdGlvbiBmYWlsZWQuIGRpciA9ICVkIiwgZGlyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWR4ID0gR0VUX1NNTVVfVEFCTEVfSURYKGhhbmRsZSk7CisJaWYgKChoYW5kbGUgPT0gSEFORExFX0lOSVQpIHx8CisJCShpZHggPCAwKSB8fAorCQkoaWR4ID49IGlvbW11X2NiX3NldC5jYl9udW0pKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsCisJCQkiRXJyb3I6IGhhbmRsZSBvciBpbmRleCBpbnZhbGlkLiBpZHggPSAlZCBoZGwgPSAleCIsCisJCQlpZHgsIGhhbmRsZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5pc19zZWN1cmUpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogY2FuJ3QgbWFwIHNlY3VyZSBtZW0gdG8gbm9uIHNlY3VyZSBjYiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOworCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogaGRsIGlzIG5vdCB2YWxpZCwgdGFibGVfaGRsID0gJXgsIGhkbCA9ICV4IiwKKwkJCWlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaGFuZGxlLCBoYW5kbGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZ2V0X2FkZHJfZW5kOworCX0KKworCWJ1Zl9zdGF0ZSA9IGNhbV9zbW11X2NoZWNrX3NlY3VyZV9mZF9pbl9saXN0KGlkeCwgaW9uX2ZkLCBwYWRkcl9wdHIsCisJCQlsZW5fcHRyKTsKKwlpZiAoYnVmX3N0YXRlID09IENBTV9TTU1VX0JVRkZfRVhJU1QpIHsKKwkJQ0FNX0RCRyhDQU1fU01NVSwgImZkOiVkIGFscmVhZHkgaW4gbGlzdCwgZ2l2ZSBzYW1lIGFkZHIgYmFjayIsCisJCQlpb25fZmQpOworCQlyYyA9IDA7CisJCWdvdG8gZ2V0X2FkZHJfZW5kOworCX0KKwlyYyA9IGNhbV9zbW11X21hcF9zdGFnZTJfYnVmZmVyX2FuZF9hZGRfdG9fbGlzdChpZHgsIGlvbl9mZCwgZG1hX2RpciwKKwkJCWNsaWVudCwgcGFkZHJfcHRyLCBsZW5fcHRyKTsKKwlpZiAocmMgPCAwKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsICJFcnJvcjogbWFwcGluZyBvciBhZGQgbGlzdCBmYWlsIik7CisJCWdvdG8gZ2V0X2FkZHJfZW5kOworCX0KKworZ2V0X2FkZHJfZW5kOgorCW11dGV4X3VubG9jaygmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGNhbV9zbW11X21hcF9zdGFnZTJfaW92YSk7CisKK3N0YXRpYyBpbnQgY2FtX3NtbXVfc2VjdXJlX3VubWFwX2J1Zl9hbmRfcmVtb3ZlX2Zyb21fbGlzdCgKKwkJc3RydWN0IGNhbV9zZWNfYnVmZl9pbmZvICptYXBwaW5nX2luZm8sCisJCWludCBpZHgpCit7CisJaWYgKCFtYXBwaW5nX2luZm8pIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwgIkVycm9yOiBMaXN0IGRvZXNuJ3QgZXhpc3QiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlvbl9mcmVlKG1hcHBpbmdfaW5mby0+aV9jbGllbnQsIG1hcHBpbmdfaW5mby0+aV9oZGwpOworCWxpc3RfZGVsX2luaXQoJm1hcHBpbmdfaW5mby0+bGlzdCk7CisKKwlDQU1fREJHKENBTV9TTU1VLCAidW5tYXAgZmQ6ICVkLCBpZHggOiAlZCIsIG1hcHBpbmdfaW5mby0+aW9uX2ZkLCBpZHgpOworCisJLyogZnJlZSBvbmUgYnVmZmVyICovCisJa2ZyZWUobWFwcGluZ19pbmZvKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNhbV9zbW11X3VubWFwX3N0YWdlMl9pb3ZhKGludCBoYW5kbGUsIGludCBpb25fZmQpCit7CisJaW50IGlkeCwgcmM7CisJc3RydWN0IGNhbV9zZWNfYnVmZl9pbmZvICptYXBwaW5nX2luZm87CisKKwkvKiBmaW5kIGluZGV4IGluIHRoZSBpb21tdV9jYl9zZXQuY2JfaW5mbyAqLworCWlkeCA9IEdFVF9TTU1VX1RBQkxFX0lEWChoYW5kbGUpOworCWlmICgoaGFuZGxlID09IEhBTkRMRV9JTklUKSB8fAorCQkoaWR4IDwgMCkgfHwKKwkJKGlkeCA+PSBpb21tdV9jYl9zZXQuY2JfbnVtKSkgeworCQlDQU1fRVJSKENBTV9TTU1VLAorCQkJIkVycm9yOiBoYW5kbGUgb3IgaW5kZXggaW52YWxpZC4gaWR4ID0gJWQgaGRsID0gJXgiLAorCQkJaWR4LCBoYW5kbGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaXNfc2VjdXJlKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsCisJCQkiRXJyb3I6IGNhbid0IHVubWFwIHNlY3VyZSBtZW0gZnJvbSBub24gc2VjdXJlIGNiIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0ubG9jayk7CisJaWYgKGlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaGFuZGxlICE9IGhhbmRsZSkgeworCQlDQU1fRVJSKENBTV9TTU1VLAorCQkJIkVycm9yOiBoZGwgaXMgbm90IHZhbGlkLCB0YWJsZV9oZGwgPSAleCwgaGRsID0gJXgiLAorCQkJaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5oYW5kbGUsIGhhbmRsZSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBwdXRfYWRkcl9lbmQ7CisJfQorCisJLyogYmFzZWQgb24gaW9uIGZkIGFuZCBpbmRleCwgd2UgY2FuIGZpbmQgbWFwcGluZyBpbmZvIG9mIGJ1ZmZlciAqLworCW1hcHBpbmdfaW5mbyA9IGNhbV9zbW11X2ZpbmRfbWFwcGluZ19ieV9zZWNfYnVmX2lkeChpZHgsIGlvbl9mZCk7CisJaWYgKCFtYXBwaW5nX2luZm8pIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogSW52YWxpZCBwYXJhbXMhIGlkeCA9ICVkLCBmZCA9ICVkIiwKKwkJCWlkeCwgaW9uX2ZkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIHB1dF9hZGRyX2VuZDsKKwl9CisKKwkvKiB1bm1hcHBpbmcgb25lIGJ1ZmZlciBmcm9tIGRldmljZSAqLworCXJjID0gY2FtX3NtbXVfc2VjdXJlX3VubWFwX2J1Zl9hbmRfcmVtb3ZlX2Zyb21fbGlzdChtYXBwaW5nX2luZm8sIGlkeCk7CisJaWYgKHJjKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsICJFcnJvcjogdW5tYXAgb3IgcmVtb3ZlIGxpc3QgZmFpbCIpOworCQlnb3RvIHB1dF9hZGRyX2VuZDsKKwl9CisKK3B1dF9hZGRyX2VuZDoKKwltdXRleF91bmxvY2soJmlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0ubG9jayk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChjYW1fc21tdV91bm1hcF9zdGFnZTJfaW92YSk7CiAKIGludCBjYW1fc21tdV9tYXBfaW92YShpbnQgaGFuZGxlLCBpbnQgaW9uX2ZkLAogCWVudW0gY2FtX3NtbXVfbWFwX2RpciBkaXIsIGRtYV9hZGRyX3QgKnBhZGRyX3B0ciwKQEAgLTE3NjcsNiArMjAxNiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5pc19zZWN1cmUpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogY2FuJ3QgbWFwIG5vbi1zZWN1cmUgbWVtIHRvIHNlY3VyZSBjYiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltdXRleF9sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOwogCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKIAkJQ0FNX0VSUihDQU1fU01NVSwgImhkbCBpcyBub3QgdmFsaWQsIHRhYmxlX2hkbCA9ICV4LCBoZGwgPSAleCIsCkBAIC0xNzg2LDkgKzIwNDEsNyBAQAogCWJ1Zl9zdGF0ZSA9IGNhbV9zbW11X2NoZWNrX2ZkX2luX2xpc3QoaWR4LCBpb25fZmQsIHBhZGRyX3B0ciwKIAkJbGVuX3B0cik7CiAJaWYgKGJ1Zl9zdGF0ZSA9PSBDQU1fU01NVV9CVUZGX0VYSVNUKSB7Ci0JCUNBTV9FUlIoQ0FNX1NNTVUsCi0JCQkiaW9uX2ZkOiVkIGFscmVhZHkgaW4gdGhlIGxpc3QsIGdpdmUgc2FtZSBhZGRyIGJhY2siLAotCQkJIGlvbl9mZCk7CisJCUNBTV9FUlIoQ0FNX1NNTVUsICJpb25fZmQ6JWQgYWxyZWFkeSBpbiB0aGUgbGlzdCIsIGlvbl9mZCk7CiAJCXJjID0gLUVBTFJFQURZOwogCQlnb3RvIGdldF9hZGRyX2VuZDsKIAl9CkBAIC0xODMyLDYgKzIwODUsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaXNfc2VjdXJlKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsCisJCQkiRXJyb3I6IGNhbid0IGdldCBub24tc2VjdXJlIG1lbSBmcm9tIHNlY3VyZSBjYiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltdXRleF9sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOwogCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKIAkJQ0FNX0VSUihDQU1fU01NVSwKQEAgLTE4NTQsMTIgKzIxMTMsNjUgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2FtX3NtbXVfZ2V0X2lvdmEpOwogCi1pbnQgY2FtX3NtbXVfdW5tYXBfc2VjX2lvdmEoaW50IGhhbmRsZSwgaW50IGlvbl9mZCkKK2ludCBjYW1fc21tdV9nZXRfc3RhZ2UyX2lvdmEoaW50IGhhbmRsZSwgaW50IGlvbl9mZCwKKwlkbWFfYWRkcl90ICpwYWRkcl9wdHIsIHNpemVfdCAqbGVuX3B0cikKIHsKLQkvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCi0JcmV0dXJuIC1FUEVSTTsKKwlpbnQgaWR4LCByYyA9IDA7CisJZW51bSBjYW1fc21tdV9idWZfc3RhdGUgYnVmX3N0YXRlOworCisJaWYgKCFwYWRkcl9wdHIgfHwgIWxlbl9wdHIpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwgIkVycm9yOiBJbnB1dCBwb2ludGVycyBhcmUgaW52YWxpZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaGFuZGxlID09IEhBTkRMRV9JTklUKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsICJFcnJvcjogSW52YWxpZCBoYW5kbGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2xlYW4gdGhlIGNvbnRlbnQgZnJvbSBjbGllbnRzICovCisJKnBhZGRyX3B0ciA9IChkbWFfYWRkcl90KU5VTEw7CisJKmxlbl9wdHIgPSAoc2l6ZV90KTA7CisKKwlpZHggPSBHRVRfU01NVV9UQUJMRV9JRFgoaGFuZGxlKTsKKwlpZiAoaWR4IDwgMCB8fCBpZHggPj0gaW9tbXVfY2Jfc2V0LmNiX251bSkgeworCQlDQU1fRVJSKENBTV9TTU1VLAorCQkJIkVycm9yOiBoYW5kbGUgb3IgaW5kZXggaW52YWxpZC4gaWR4ID0gJWQgaGRsID0gJXgiLAorCQkJaWR4LCBoYW5kbGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaXNfc2VjdXJlKSB7CisJCUNBTV9FUlIoQ0FNX1NNTVUsCisJCQkiRXJyb3I6IGNhbid0IGdldCBzZWN1cmUgbWVtIGZyb20gbm9uIHNlY3VyZSBjYiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOworCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKKwkJQ0FNX0VSUihDQU1fU01NVSwKKwkJCSJFcnJvcjogaGRsIGlzIG5vdCB2YWxpZCwgdGFibGVfaGRsID0gJXgsIGhkbCA9ICV4IiwKKwkJCWlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uaGFuZGxlLCBoYW5kbGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZ2V0X2FkZHJfZW5kOworCX0KKworCWJ1Zl9zdGF0ZSA9IGNhbV9zbW11X2NoZWNrX3NlY3VyZV9mZF9pbl9saXN0KGlkeCwKKwkJaW9uX2ZkLAorCQlwYWRkcl9wdHIsCisJCWxlbl9wdHIpOworCisJaWYgKGJ1Zl9zdGF0ZSA9PSBDQU1fU01NVV9CVUZGX05PVF9FWElTVCkgeworCQlDQU1fRVJSKENBTV9TTU1VLCAiaW9uX2ZkOiVkIG5vdCBpbiB0aGUgbWFwcGVkIGxpc3QiLCBpb25fZmQpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZ2V0X2FkZHJfZW5kOworCX0KKworZ2V0X2FkZHJfZW5kOgorCW11dGV4X3VubG9jaygmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5sb2NrKTsKKwlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhbV9zbW11X3VubWFwX3NlY19pb3ZhKTsKK0VYUE9SVF9TWU1CT0woY2FtX3NtbXVfZ2V0X3N0YWdlMl9pb3ZhKTsKIAogaW50IGNhbV9zbW11X3VubWFwX2lvdmEoaW50IGhhbmRsZSwKIAlpbnQgaW9uX2ZkLApAQCAtMTg4Miw2ICsyMTk0LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmlzX3NlY3VyZSkgeworCQlDQU1fRVJSKENBTV9TTU1VLAorCQkJIkVycm9yOiBjYW4ndCB1bm1hcCBub24tc2VjdXJlIG1lbSBmcm9tIHNlY3VyZSBjYiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAltdXRleF9sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOwogCWlmIChpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSAhPSBoYW5kbGUpIHsKIAkJQ0FNX0VSUihDQU1fU01NVSwKQEAgLTE5ODksNiArMjMwNywyMiBAQAogCQljYW1fc21tdV9jbGVhbl9idWZmZXJfbGlzdChpZHgpOwogCX0KIAorCWlmICgmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5pc19zZWN1cmUpIHsKKwkJaWYgKGlvbW11X2NiX3NldC5jYl9pbmZvW2lkeF0uc2VjdXJlX2NvdW50ID09IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5sb2NrKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQlpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLnNlY3VyZV9jb3VudC0tOworCQlpZiAoaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5zZWN1cmVfY291bnQgPT0gMCkgeworCQkJaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5jYl9jb3VudCA9IDA7CisJCQlpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSA9IEhBTkRMRV9JTklUOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKIAlpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmNiX2NvdW50ID0gMDsKIAlpb21tdV9jYl9zZXQuY2JfaW5mb1tpZHhdLmhhbmRsZSA9IEhBTkRMRV9JTklUOwogCW11dGV4X3VubG9jaygmaW9tbXVfY2Jfc2V0LmNiX2luZm9baWR4XS5sb2NrKTsKQEAgLTIxNjgsNyArMjUwMiwxNSBAQAogCX0KIAogCW1lbV9tYXBfbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG9mX25vZGUsICJpb3ZhLW1lbS1tYXAiKTsKKwljYi0+aXNfc2VjdXJlID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG9mX25vZGUsICJxY29tLHNlY3VyZS1jYiIpOworCisJLyoKKwkgKiBXZSBhbHdheXMgZXhwZWN0IGEgbWVtb3J5IG1hcCBub2RlLCBleGNlcHQgd2hlbiBpdCBpcyBhIHNlY3VyZQorCSAqIGNvbnRleHQgYmFuay4KKwkgKi8KIAlpZiAoIW1lbV9tYXBfbm9kZSkgeworCQlpZiAoY2ItPmlzX3NlY3VyZSkKKwkJCXJldHVybiAwOwogCQlDQU1fRVJSKENBTV9TTU1VLCAiaW92YS1tZW0tbWFwIG5vdCBwcmVzZW50Iik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIyOTIsNiArMjYzNCwxMiBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJaWYgKGNiLT5pc19zZWN1cmUpIHsKKwkJLyogaW5jcmVtZW50IGNvdW50IHRvIG5leHQgYmFuayAqLworCQlpb21tdV9jYl9zZXQuY2JfaW5pdF9jb3VudCsrOworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBzZXQgdXAgdGhlIGlvbW11IG1hcHBpbmcgZm9yIHRoZSAgY29udGV4dCBiYW5rICovCiAJaWYgKHR5cGUgPT0gQ0FNX1FTTU1VKSB7CiAJCUNBTV9FUlIoQ0FNX1NNTVUsICJFcnJvcjogUVNNTVUgY3R4IG5vdCBzdXBwb3J0ZWQgZm9yIDogJXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zbW11L2NhbV9zbW11X2FwaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV9zbW11L2NhbV9zbW11X2FwaS5oCmluZGV4IDIwNDQ1ZjMuLjRjYjZlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fc21tdS9jYW1fc21tdV9hcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3NtbXUvY2FtX3NtbXVfYXBpLmgKQEAgLTIwNCw2ICsyMDQsMTkgQEAKICAqLwogaW50IGNhbV9zbW11X2dldF9pb3ZhKGludCBoYW5kbGUsIGludCBpb25fZmQsCiAJZG1hX2FkZHJfdCAqcGFkZHJfcHRyLCBzaXplX3QgKmxlbl9wdHIpOworCisvKioKKyAqIEBicmllZiBNYXBzIG1lbW9yeSBmcm9tIGFuIElPTiBmZCBpbnRvIElPVkEgc3BhY2UKKyAqCisgKiBAcGFyYW0gaGFuZGxlOiBTTU1VIGhhbmRsZSBpZGVudGlmeWluZyB0aGUgc2VjdXJlIGNvbnRleHQgYmFuayB0byBtYXAgdG8KKyAqIEBwYXJhbSBpb25fZmQ6IElPTiBmZCBvZiBtZW1vcnkgdG8gbWFwIHRvCisgKiBAcGFyYW0gcGFkZHJfcHRyOiBQb2ludGVyIElPVkEgYWRkcmVzcyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKKyAqIEBwYXJhbSBsZW5fcHRyOiBMZW5ndGggb2YgbWVtb3J5IG1hcHBlZAorICoKKyAqIEByZXR1cm4gU3RhdHVzIG9mIG9wZXJhdGlvbi4gTmVnYXRpdmUgaW4gY2FzZSBvZiBlcnJvci4gWmVybyBvdGhlcndpc2UuCisgKi8KK2ludCBjYW1fc21tdV9nZXRfc3RhZ2UyX2lvdmEoaW50IGhhbmRsZSwgaW50IGlvbl9mZCwKKwlkbWFfYWRkcl90ICpwYWRkcl9wdHIsIHNpemVfdCAqbGVuX3B0cik7CiAvKioKICAqIEBicmllZiBVbm1hcHMgbWVtb3J5IGZyb20gY29udGV4dCBiYW5rCiAgKgpAQCAtMjE3LDI3ICsyMzAsMjggQEAKIC8qKgogICogQGJyaWVmIE1hcHMgc2VjdXJlIG1lbW9yeSBmb3IgU01NVSBoYW5kbGUKICAqCi0gKiBAcGFyYW0gaGFuZGxlOiBTTU1VIGhhbmRsZSBpZGVudGlmeWluZyBjb250ZXh0IGJhbmsKKyAqIEBwYXJhbSBoYW5kbGU6IFNNTVUgaGFuZGxlIGlkZW50aWZ5aW5nIHNlY3VyZSBjb250ZXh0IGJhbmsKICAqIEBwYXJhbSBpb25fZmQ6IElPTiBmZCB0byBtYXAgc2VjdXJlbHkKICAqIEBwYXJhbSBkaXI6IERNQSBEaXJlY3Rpb24gZm9yIHRoZSBtYXBwaW5nCisgKiBAcGFyYW0gY2xpZW50OiBJb24gY2xpZW50IHBhc3NlZCBieSBjYWxsZXIKICAqIEBwYXJhbSBkbWFfYWRkcjogUmV0dXJuZWQgSU9WQSBhZGRyZXNzIGFmdGVyIG1hcHBpbmcKICAqIEBwYXJhbSBsZW5fcHRyOiBMZW5ndGggb2YgbWVtb3J5IG1hcHBlZAogICoKICAqIEByZXR1cm4gU3RhdHVzIG9mIG9wZXJhdGlvbi4gTmVnYXRpdmUgaW4gY2FzZSBvZiBlcnJvci4gWmVybyBvdGhlcndpc2UuCiAgKi8KLWludCBjYW1fc21tdV9tYXBfc2VjX2lvdmEoaW50IGhhbmRsZSwKLQlpbnQgaW9uX2ZkLCBlbnVtIGNhbV9zbW11X21hcF9kaXIgZGlyLAotCWRtYV9hZGRyX3QgKmRtYV9hZGRyLCBzaXplX3QgKmxlbl9wdHIpOworaW50IGNhbV9zbW11X21hcF9zdGFnZTJfaW92YShpbnQgaGFuZGxlLAorCWludCBpb25fZmQsIGVudW0gY2FtX3NtbXVfbWFwX2RpciBkaXIsIHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJaW9uX3BoeXNfYWRkcl90ICpkbWFfYWRkciwgc2l6ZV90ICpsZW5fcHRyKTsKIAogLyoqCiAgKiBAYnJpZWYgVW5tYXBzIHNlY3VyZSBtZW1vcHJ5IGZvciBTTU1VIGhhbmRsZQogICoKLSAqIEBwYXJhbSBoYW5kbGU6IFNNTVUgaGFuZGxlIGlkZW50aWZ5aW5nIGNvbnRleHQgYmFuaworICogQHBhcmFtIGhhbmRsZTogU01NVSBoYW5kbGUgaWRlbnRpZnlpbmcgc2VjdXJlIGNvbnRleHQgYmFuawogICogQHBhcmFtIGlvbl9mZDogSU9OIGZkIHRvIHVubWFwCiAgKgogICogQHJldHVybiBTdGF0dXMgb2Ygb3BlcmF0aW9uLiBOZWdhdGl2ZSBpbiBjYXNlIG9mIGVycm9yLiBaZXJvIG90aGVyd2lzZS4KICAqLwotaW50IGNhbV9zbW11X3VubWFwX3NlY19pb3ZhKGludCBoYW5kbGUsIGludCBpb25fZmQpOworaW50IGNhbV9zbW11X3VubWFwX3N0YWdlMl9pb3ZhKGludCBoYW5kbGUsIGludCBpb25fZmQpOwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fZGVidWdfdXRpbC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fZGVidWdfdXRpbC5jCmluZGV4IDIxZjkwY2EuLmY0NTExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX2RlYnVnX3V0aWwuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9kZWJ1Z191dGlsLmMKQEAgLTgzLDYgKzgzLDkgQEAKIAljYXNlIENBTV9IRkk6CiAJCW5hbWUgPSAiQ0FNLUhGSSI7CiAJCWJyZWFrOworCWNhc2UgQ0FNX09JUzoKKwkJbmFtZSA9ICJDQU0tT0lTIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbmFtZSA9ICJDQU0iOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX2RlYnVnX3V0aWwuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX2RlYnVnX3V0aWwuaAppbmRleCA3Mjc1ZDU2Li40MGRiZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9kZWJ1Z191dGlsLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fZGVidWdfdXRpbC5oCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIENBTV9VVElMICAgICAgICgxIDw8IDE3KQogI2RlZmluZSBDQU1fSEZJICAgICAgICAoMSA8PCAxOCkKICNkZWZpbmUgQ0FNX0NUWFQgICAgICAgKDEgPDwgMTkpCisjZGVmaW5lIENBTV9PSVMgICAgICAgICgxIDw8IDIwKQogCiAjZGVmaW5lIFNUUl9CVUZGRVJfTUFYX0xFTkdUSCAgMTAyNAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9wYWNrZXRfdXRpbC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fcGFja2V0X3V0aWwuYwppbmRleCBhMWNkZmU5Li5hZWNjZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9wYWNrZXRfdXRpbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX3BhY2tldF91dGlsLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJjYW1fcGFja2V0X3V0aWwuaCIKICNpbmNsdWRlICJjYW1fZGVidWdfdXRpbC5oIgogCi1zdGF0aWMgaW50IGNhbV9wYWNrZXRfdXRpbF9nZXRfY21kX21lbV9hZGRyKGludCBoYW5kbGUsIHVpbnQzMl90ICoqYnVmX2FkZHIsCitpbnQgY2FtX3BhY2tldF91dGlsX2dldF9jbWRfbWVtX2FkZHIoaW50IGhhbmRsZSwgdWludDMyX3QgKipidWZfYWRkciwKIAlzaXplX3QgKmxlbikKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMTI0LDcgKzEyNCw3IEBACiB9CiAKIGludCBjYW1fcGFja2V0X3V0aWxfcHJvY2Vzc19wYXRjaGVzKHN0cnVjdCBjYW1fcGFja2V0ICpwYWNrZXQsCi0JaW50MzJfdCBpb21tdV9oZGwpCisJaW50MzJfdCBpb21tdV9oZGwsIGludDMyX3Qgc2VjX21tdV9oZGwpCiB7CiAJc3RydWN0IGNhbV9wYXRjaF9kZXNjICpwYXRjaF9kZXNjID0gTlVMTDsKIAl1aW50NjRfdCAgIGlvdmFfYWRkcjsKQEAgLTEzNiw2ICsxMzYsNyBAQAogCXNpemVfdCAgICAgc3JjX2J1Zl9zaXplOwogCWludCAgICAgICAgaTsKIAlpbnQgICAgICAgIHJjID0gMDsKKwlpbnQzMl90ICAgIGhkbDsKIAogCS8qIHByb2Nlc3MgcGF0Y2ggZGVzY3JpcHRvciAqLwogCXBhdGNoX2Rlc2MgPSAoc3RydWN0IGNhbV9wYXRjaF9kZXNjICopCkBAIC0xNDYsOCArMTQ3LDExIEBACiAJCQlzaXplb2Yoc3RydWN0IGNhbV9wYXRjaF9kZXNjKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5udW1fcGF0Y2hlczsgaSsrKSB7CisKKwkJaGRsID0gY2FtX21lbV9pc19zZWN1cmVfYnVmKHBhdGNoX2Rlc2NbaV0uc3JjX2J1Zl9oZGwpID8KKwkJCXNlY19tbXVfaGRsIDogaW9tbXVfaGRsOwogCQlyYyA9IGNhbV9tZW1fZ2V0X2lvX2J1ZihwYXRjaF9kZXNjW2ldLnNyY19idWZfaGRsLAotCQkJaW9tbXVfaGRsLCAmaW92YV9hZGRyLCAmc3JjX2J1Zl9zaXplKTsKKwkJCWhkbCwgJmlvdmFfYWRkciwgJnNyY19idWZfc2l6ZSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNBTV9FUlIoQ0FNX1VUSUwsICJ1bmFibGUgdG8gZ2V0IHNyYyBidWYgYWRkcmVzcyIpOwogCQkJcmV0dXJuIHJjOwpAQCAtMTgyLDMgKzE4Niw3OCBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGNhbV9wYWNrZXRfdXRpbF9wcm9jZXNzX2dlbmVyaWNfY21kX2J1ZmZlcigKKwlzdHJ1Y3QgY2FtX2NtZF9idWZfZGVzYyAqY21kX2J1ZiwKKwljYW1fcGFja2V0X2dlbmVyaWNfYmxvYl9oYW5kbGVyIGJsb2JfaGFuZGxlcl9jYiwgdm9pZCAqdXNlcl9kYXRhKQoreworCWludCAgICAgICByYzsKKwl1aW50NjRfdCAgY3B1X2FkZHI7CisJc2l6ZV90ICAgIGJ1Zl9zaXplOworCXVpbnQzMl90ICpibG9iX3B0cjsKKwl1aW50MzJfdCAgYmxvYl90eXBlLCBibG9iX3NpemUsIGJsb2JfYmxvY2tfc2l6ZSwgbGVuX3JlYWQ7CisKKwlpZiAoIWNtZF9idWYgfHwgIWJsb2JfaGFuZGxlcl9jYikgeworCQlDQU1fRVJSKENBTV9VVElMLCAiSW52YWxpZCBhcmdzICVwSyAlcEsiLAorCQkJY21kX2J1ZiwgYmxvYl9oYW5kbGVyX2NiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFjbWRfYnVmLT5sZW5ndGggfHwgIWNtZF9idWYtPnNpemUpIHsKKwkJQ0FNX0VSUihDQU1fVVRJTCwgIkludmFsaWQgY21kIGJ1ZiBzaXplICVkICVkIiwKKwkJCWNtZF9idWYtPmxlbmd0aCwgY21kX2J1Zi0+c2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2FtX21lbV9nZXRfY3B1X2J1ZihjbWRfYnVmLT5tZW1faGFuZGxlLCAmY3B1X2FkZHIsICZidWZfc2l6ZSk7CisJaWYgKHJjIHx8ICFjcHVfYWRkciB8fCAoYnVmX3NpemUgPT0gMCkpIHsKKwkJQ0FNX0VSUihDQU1fVVRJTCwgIkZhaWxlZCBpbiBHZXQgY3B1IGFkZHIsIHJjPSVkLCBjcHVfYWRkcj0lcEsiLAorCQkJcmMsIGNwdV9hZGRyKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWJsb2JfcHRyID0gKHVpbnQzMl90ICopKCh1aW50OF90ICopY3B1X2FkZHIgKyBjbWRfYnVmLT5vZmZzZXQpOworCisJQ0FNX0RCRyhDQU1fVVRJTCwKKwkJIkdlbmVyaWNDbWRCdWZmZXIgY3B1YWRkcj0lcEssIGJsb2JwdHI9JXBLLCBsZW49JWQiLAorCQljcHVfYWRkciwgYmxvYl9wdHIsIGNtZF9idWYtPmxlbmd0aCk7CisKKwlsZW5fcmVhZCA9IDA7CisJd2hpbGUgKGxlbl9yZWFkIDwgY21kX2J1Zi0+bGVuZ3RoKSB7CisJCWJsb2JfdHlwZSA9CisJCQkoKCpibG9iX3B0cikgJiBDQU1fR0VORVJJQ19CTE9CX0NNREJVRkZFUl9UWVBFX01BU0spID4+CisJCQlDQU1fR0VORVJJQ19CTE9CX0NNREJVRkZFUl9UWVBFX1NISUZUOworCQlibG9iX3NpemUgPQorCQkJKCgqYmxvYl9wdHIpICYgQ0FNX0dFTkVSSUNfQkxPQl9DTURCVUZGRVJfU0laRV9NQVNLKSA+PgorCQkJQ0FNX0dFTkVSSUNfQkxPQl9DTURCVUZGRVJfU0laRV9TSElGVDsKKworCQlibG9iX2Jsb2NrX3NpemUgPSBzaXplb2YodWludDMyX3QpICsKKwkJCSgoKGJsb2Jfc2l6ZSArIHNpemVvZih1aW50MzJfdCkgLSAxKSAvCisJCQlzaXplb2YodWludDMyX3QpKSAqIHNpemVvZih1aW50MzJfdCkpOworCisJCUNBTV9EQkcoQ0FNX1VUSUwsCisJCQkiQmxvYiB0eXBlPSVkIHNpemU9JWQgYmxvY2tfc2l6ZT0lZCBsZW5fcmVhZD0lZCB0b3RhbD0lZCIsCisJCQlibG9iX3R5cGUsIGJsb2Jfc2l6ZSwgYmxvYl9ibG9ja19zaXplLCBsZW5fcmVhZCwKKwkJCWNtZF9idWYtPmxlbmd0aCk7CisKKwkJaWYgKGxlbl9yZWFkICsgYmxvYl9ibG9ja19zaXplID4gY21kX2J1Zi0+bGVuZ3RoKSB7CisJCQlDQU1fRVJSKENBTV9VVElMLCAiSW52YWxpZCBCbG9iICVkICVkICVkICVkIiwKKwkJCQlibG9iX3R5cGUsIGJsb2Jfc2l6ZSwgbGVuX3JlYWQsCisJCQkJY21kX2J1Zi0+bGVuZ3RoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbGVuX3JlYWQgKz0gYmxvYl9ibG9ja19zaXplOworCisJCXJjID0gYmxvYl9oYW5kbGVyX2NiKHVzZXJfZGF0YSwgYmxvYl90eXBlLCBibG9iX3NpemUsCisJCQkodWludDhfdCAqKShibG9iX3B0ciArIDEpKTsKKwkJaWYgKHJjKSB7CisJCQlDQU1fRVJSKENBTV9VVElMLCAiRXJyb3IgaW4gaGFuZGxpbmcgYmxvYiB0eXBlICVkICVkIiwKKwkJCQlibG9iX3R5cGUsIGJsb2Jfc2l6ZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlibG9iX3B0ciArPSAoYmxvYl9ibG9ja19zaXplIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9wYWNrZXRfdXRpbC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fcGFja2V0X3V0aWwuaAppbmRleCA4YjU5MGE3Li45NGQyNjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9wYWNrZXRfdXRpbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX3BhY2tldF91dGlsLmgKQEAgLTMzLDYgKzMzLDI1IEBACiAJdWludDMyX3QgICB1c2VkX2J5dGVzOwogfTsKIAorLyogR2VuZXJpYyBDbWQgQnVmZmVyIGJsb2IgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZSAqLwordHlwZWRlZiBpbnQgKCpjYW1fcGFja2V0X2dlbmVyaWNfYmxvYl9oYW5kbGVyKSh2b2lkICp1c2VyX2RhdGEsCisJdWludDMyX3QgYmxvYl90eXBlLCB1aW50MzJfdCBibG9iX3NpemUsIHVpbnQ4X3QgKmJsb2JfZGF0YSk7CisKKy8qKgorICogY2FtX3BhY2tldF91dGlsX2dldF9jbWRfbWVtX2FkZHIoKQorICoKKyAqIEBicmllZiAgICAgICAgICAgICAgICAgIEdldCBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzCisgKgorICogQGhhbmRsZTogICAgICAgICAgICAgICAgQ29tbWFuZCBidWZmZXIgbWVtb3J5IGhhbmRsZQorICogQGJ1Zl9hZGRyOiAgICAgICAgICAgICAgQ29tbWFuZCBidWZmZXIgY3B1IG1hcHBlZCBhZGRyZXNzCisgKiBAbGVuOiAgICAgICAgICAgICAgICAgICBDb21tYW5kIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBAcmV0dXJuOiAgICAgICAgICAgICAgICAwIGZvciBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGZvciBGYWlsCisgKi8KK2ludCBjYW1fcGFja2V0X3V0aWxfZ2V0X2NtZF9tZW1fYWRkcihpbnQgaGFuZGxlLCB1aW50MzJfdCAqKmJ1Zl9hZGRyLAorCXNpemVfdCAqbGVuKTsKKwogLyoqCiAgKiBjYW1fcGFja2V0X3V0aWxfdmFsaWRhdGVfcGFja2V0KCkKICAqCkBAIC03OSwxMSArOTgsMzMgQEAKICAqCiAgKiBAcGFja2V0OiAgICAgICAgICAgICBJbnB1dCBwYWNrZXQgY29udGFpbmluZyBDb21tYW5kIEJ1ZmZlcnMgYW5kIFBhdGNoZXMKICAqIEBpb21tdV9oZGw6ICAgICAgICAgIElPTU1VIGhhbmRsZSBvZiB0aGUgSFcgRGV2aWNlIHRoYXQgcmVjZWl2ZWQgdGhlIHBhY2tldAorICogQHNlY19pb21tdV9oZGw6ICAgICAgU2VjdXJlIElPTU1VIGhhbmRsZSBvZiB0aGUgSFcgRGV2aWNlIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHRoZSBwYWNrZXQKICAqCiAgKiBAcmV0dXJuOiAgICAgICAgICAgICAwOiBTdWNjZXNzCiAgKiAgICAgICAgICAgICAgICAgICAgICBOZWdhdGl2ZTogRmFpbHVyZQogICovCiBpbnQgY2FtX3BhY2tldF91dGlsX3Byb2Nlc3NfcGF0Y2hlcyhzdHJ1Y3QgY2FtX3BhY2tldCAqcGFja2V0LAotCWludDMyX3QgaW9tbXVfaGRsKTsKKwlpbnQzMl90IGlvbW11X2hkbCwgaW50MzJfdCBzZWNfbW11X2hkbCk7CisKKy8qKgorICogY2FtX3BhY2tldF91dGlsX3Byb2Nlc3NfZ2VuZXJpY19jbWRfYnVmZmVyKCkKKyAqCisgKiBAYnJpZWY6ICAgICAgICAgICAgICBQcm9jZXNzIEdlbmVyaWMgQmxvYiBjb21tYW5kIGJ1ZmZlci4gVGhpcyB1dGlsaXR5CisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwcm9jZXNzIHRoZSBjb21tYW5kIGJ1ZmZlciBhbmQgY2FsbHMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBibG9iX2hhbmRsZV9jYiBjYWxsYmFjayBmb3IgZWFjaCBibG9iIHRoYXQgZXhpc3RzCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgY29tbWFuZCBidWZmZXIuCisgKgorICogQGNtZF9idWY6ICAgICAgICAgICAgR2VuZXJpYyBCbG9iIENtZCBCdWZmZXIgaGFuZGxlCisgKiBAYmxvYl9oYW5kbGVyX2NiOiAgICBDYWxsYmFjayBwb2ludGVyIHRvIGNhbGwgZm9yIGVhY2ggYmxvYiBleGlzdHMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGJ1ZmZlcgorICogQHVzZXJfZGF0YTogICAgICAgICAgVXNlciBkYXRhIHRvIGJlIHBhc3NlZCB3aGlsZSBjYWxsYmFjaworICoKKyAqIEByZXR1cm46ICAgICAgICAgICAgIDA6IFN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlOiBGYWlsdXJlCisgKi8KK2ludCBjYW1fcGFja2V0X3V0aWxfcHJvY2Vzc19nZW5lcmljX2NtZF9idWZmZXIoCisJc3RydWN0IGNhbV9jbWRfYnVmX2Rlc2MgKmNtZF9idWYsCisJY2FtX3BhY2tldF9nZW5lcmljX2Jsb2JfaGFuZGxlciBibG9iX2hhbmRsZXJfY2IsIHZvaWQgKnVzZXJfZGF0YSk7CiAKICNlbmRpZiAvKiBfQ0FNX1BBQ0tFVF9VVElMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9zb2NfdXRpbC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fc29jX3V0aWwuYwppbmRleCBlNWM3ZGJiLi43NDNkZmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9zb2NfdXRpbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX3NvY191dGlsLmMKQEAgLTMxNSwxNyArMzE1LDE0IEBACiAJaW50IG51bV9jbGtfcmF0ZXMsIG51bV9jbGtfbGV2ZWxzOwogCWludCBpLCBqLCByYzsKIAlpbnQzMl90IG51bV9jbGtfbGV2ZWxfc3RyaW5nczsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gTlVMTDsKIAljb25zdCBjaGFyICpzcmNfY2xrX3N0ciA9IE5VTEw7CiAJY29uc3QgY2hhciAqY2xrX2NudGxfbHZsX3N0cmluZyA9IE5VTEw7CiAJZW51bSBjYW1fdm90ZV9sZXZlbCBsZXZlbDsKIAotCWlmICghc29jX2luZm8gfHwgIXNvY19pbmZvLT5wZGV2KQorCWlmICghc29jX2luZm8gfHwgIXNvY19pbmZvLT5kZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGRldiA9IHNvY19pbmZvLT5wZGV2OwotCi0Jb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOwogCiAJY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG9mX25vZGUsICJjbG9jay1uYW1lcyIpOwogCkBAIC01NjMsMTMgKzU2MCwxMSBAQAogCWludDE2X3QgZ3Bpb19hcnJheV9zaXplID0gMDsKIAlzdHJ1Y3QgY2FtX3NvY19ncGlvX2RhdGEgKmdjb25mID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBOVUxMOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBOVUxMOwogCi0JaWYgKCFzb2NfaW5mbyB8fCAhc29jX2luZm8tPnBkZXYpCisJaWYgKCFzb2NfaW5mbyB8fCAhc29jX2luZm8tPmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwZGV2ID0gc29jX2luZm8tPnBkZXY7Ci0Jb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOwogCiAJLyogVmFsaWRhdGUgaW5wdXQgcGFyYW1ldGVycyAqLwogCWlmICghb2Zfbm9kZSkgewpAQCAtNjg1LDE1ICs2ODAsMTMgQEAKIHsKIAlpbnQgcmMgPSAwLCBjb3VudCA9IDAsIGkgPSAwOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IE5VTEw7CiAKLQlpZiAoIXNvY19pbmZvIHx8ICFzb2NfaW5mby0+cGRldikgeworCWlmICghc29jX2luZm8gfHwgIXNvY19pbmZvLT5kZXYpIHsKIAkJQ0FNX0VSUihDQU1fVVRJTCwgIkludmFsaWQgcGFyYW1ldGVycyIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwZGV2ID0gc29jX2luZm8tPnBkZXY7Ci0Jb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOwogCiAJc29jX2luZm8tPm51bV9yZ2x0ciA9IDA7CiAJY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG9mX25vZGUsICJyZWd1bGF0b3ItbmFtZXMiKTsKQEAgLTc1OCwyMCArNzUxLDE5IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gTlVMTDsKIAlpbnQgY291bnQgPSAwLCBpID0gMCwgcmMgPSAwOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBOVUxMOwogCi0JaWYgKCFzb2NfaW5mbyB8fCAhc29jX2luZm8tPnBkZXYpCisJaWYgKCFzb2NfaW5mbyB8fCAhc29jX2luZm8tPmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwZGV2ID0gc29jX2luZm8tPnBkZXY7Ci0Jb2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCW9mX25vZGUgPSBzb2NfaW5mby0+ZGV2LT5vZl9ub2RlOwogCiAJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2RlLCAiY2VsbC1pbmRleCIsICZzb2NfaW5mby0+aW5kZXgpOwogCWlmIChyYykgewogCQlDQU1fRVJSKENBTV9VVElMLCAiZGV2aWNlICVzIGZhaWxlZCB0byByZWFkIGNlbGwtaW5kZXgiLAotCQkJcGRldi0+bmFtZSk7CisJCQlzb2NfaW5mby0+ZGV2X25hbWUpOwogCQlyZXR1cm4gcmM7CiAJfQorCiAJY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG9mX25vZGUsICJyZWctbmFtZXMiKTsKIAlpZiAoY291bnQgPD0gMCkgewogCQlDQU1fRVJSKENBTV9VVElMLCAibm8gcmVnLW5hbWVzIGZvdW5kIik7CkBAIC03ODcsOCArNzc5LDggQEAKIAkJCXJldHVybiByYzsKIAkJfQogCQlzb2NfaW5mby0+bWVtX2Jsb2NrW2ldID0KLQkJCXBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQlzb2NfaW5mby0+bWVtX2Jsb2NrX25hbWVbaV0pOworCQkJcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShzb2NfaW5mby0+cGRldiwKKwkJCUlPUkVTT1VSQ0VfTUVNLCBzb2NfaW5mby0+bWVtX2Jsb2NrX25hbWVbaV0pOwogCiAJCWlmICghc29jX2luZm8tPm1lbV9ibG9ja1tpXSkgewogCQkJQ0FNX0VSUihDQU1fVVRJTCwgIm5vIG1lbSByZXNvdXJjZSBieSBuYW1lICVzIiwKQEAgLTgxMyw3ICs4MDUsOCBAQAogCQlDQU1fV0FSTihDQU1fVVRJTCwgIk5vIGludGVycnVwdCBsaW5lIHByZXNlbnQiKTsKIAkJcmMgPSAwOwogCX0gZWxzZSB7Ci0JCXNvY19pbmZvLT5pcnFfbGluZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJc29jX2luZm8tPmlycV9saW5lID0KKwkJCXBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUoc29jX2luZm8tPnBkZXYsCiAJCQlJT1JFU09VUkNFX0lSUSwgc29jX2luZm8tPmlycV9uYW1lKTsKIAkJaWYgKCFzb2NfaW5mby0+aXJxX2xpbmUpIHsKIAkJCUNBTV9FUlIoQ0FNX1VUSUwsICJubyBpcnEgcmVzb3VyY2UiKTsKQEAgLTg0MiwxNyArODM1LDE3IEBACiAgKgogICogQGJyaWVmOiAgICAgICAgICAgICAgR2V0IHJlZ3VsYXRvciByZXNvdXJjZSBuYW1lZCB2ZGQKICAqCi0gKiBAcGRldjogICAgICAgICAgICAgICBQbGF0Zm9ybSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHJlZ3VsYXRvcgorICogQGRldjogICAgICAgICAgICAgICAgRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCByZWd1bGF0b3IKICAqIEByZWc6ICAgICAgICAgICAgICAgIFJldHVybiBwb2ludGVyIHRvIGJlIGZpbGxlZCB3aXRoIHJlZ3VsYXRvciBvbiBzdWNjZXNzCiAgKiBAcmdsdHJfbmFtZTogICAgICAgICBOYW1lIG9mIHJlZ3VsYXRvciB0byBnZXQKICAqCiAgKiBAcmV0dXJuOiAgICAgICAgICAgICAwIGZvciBTdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQogICovCi1zdGF0aWMgaW50IGNhbV9zb2NfdXRpbF9nZXRfcmVndWxhdG9yKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCitzdGF0aWMgaW50IGNhbV9zb2NfdXRpbF9nZXRfcmVndWxhdG9yKHN0cnVjdCBkZXZpY2UgKmRldiwKIAlzdHJ1Y3QgcmVndWxhdG9yICoqcmVnLCBjb25zdCBjaGFyICpyZ2x0cl9uYW1lKQogewogCWludCByYyA9IDA7Ci0JKnJlZyA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgcmdsdHJfbmFtZSk7CisJKnJlZyA9IHJlZ3VsYXRvcl9nZXQoZGV2LCByZ2x0cl9uYW1lKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoKnJlZykpIHsKIAkJcmMgPSBQVFJfRVJSKCpyZWcpOwogCQlyYyA9IHJjID8gcmMgOiAtRUlOVkFMOwpAQCAtOTQ1LDcgKzkzOCw3IEBACiAJc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pIHsKIAogCXN0cnVjdCBjYW1fc29jX3BpbmN0cmxfaW5mbyAqZGV2aWNlX3BjdHJsID0gJnNvY19pbmZvLT5waW5jdHJsX2luZm87Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnNvY19pbmZvLT5wZGV2LT5kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc29jX2luZm8tPmRldjsKIAogCWRldmljZV9wY3RybC0+cGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoZGV2KTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZGV2aWNlX3BjdHJsLT5waW5jdHJsKSkgewpAQCAtMTA0NiwyMyArMTAzOSwxOSBAQAogCWlycV9oYW5kbGVyX3QgaGFuZGxlciwgdm9pZCAqaXJxX2RhdGEpCiB7CiAJaW50IGkgPSAwLCByYyA9IDA7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IE5VTEw7CiAKLQotCWlmICghc29jX2luZm8gfHwgIXNvY19pbmZvLT5wZGV2KSB7CisJaWYgKCFzb2NfaW5mbyB8fCAhc29jX2luZm8tPmRldikgewogCQlDQU1fRVJSKENBTV9VVElMLCAiSW52YWxpZCBwYXJhbWV0ZXJzIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBkZXYgPSBzb2NfaW5mby0+cGRldjsKLQogCWZvciAoaSA9IDA7IGkgPCBzb2NfaW5mby0+bnVtX21lbV9ibG9jazsgaSsrKSB7CiAJCWlmIChzb2NfaW5mby0+cmVzZXJ2ZV9tZW0pIHsKIAkJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHNvY19pbmZvLT5tZW1fYmxvY2tbaV0tPnN0YXJ0LAogCQkJCXJlc291cmNlX3NpemUoc29jX2luZm8tPm1lbV9ibG9ja1tpXSksCiAJCQkJc29jX2luZm8tPm1lbV9ibG9ja19uYW1lW2ldKSl7CiAJCQkJQ0FNX0VSUihDQU1fVVRJTCwKLQkJCQkJIkVycm9yIE1lbSBSZWdpb24gcmVxdWVzdCBGYWlsZWQ6JXMiLAorCQkJCQkiRXJyb3IgTWVtIHJlZ2lvbiByZXF1ZXN0IEZhaWxlZDolcyIsCiAJCQkJCXNvY19pbmZvLT5tZW1fYmxvY2tfbmFtZVtpXSk7CiAJCQkJcmMgPSAtRU5PTUVNOwogCQkJCWdvdG8gdW5tYXBfYmFzZTsKQEAgLTEwODksMTQgKzEwNzgsMTUgQEAKIAkJCWdvdG8gcHV0X3JlZ3VsYXRvcjsKIAkJfQogCi0JCXJjID0gY2FtX3NvY191dGlsX2dldF9yZWd1bGF0b3IocGRldiwgJnNvY19pbmZvLT5yZ2x0cltpXSwKKwkJcmMgPSBjYW1fc29jX3V0aWxfZ2V0X3JlZ3VsYXRvcihzb2NfaW5mby0+ZGV2LAorCQkJJnNvY19pbmZvLT5yZ2x0cltpXSwKIAkJCXNvY19pbmZvLT5yZ2x0cl9uYW1lW2ldKTsKIAkJaWYgKHJjKQogCQkJZ290byBwdXRfcmVndWxhdG9yOwogCX0KIAogCWlmIChzb2NfaW5mby0+aXJxX2xpbmUpIHsKLQkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHNvY19pbmZvLT5pcnFfbGluZS0+c3RhcnQsCisJCXJjID0gZGV2bV9yZXF1ZXN0X2lycShzb2NfaW5mby0+ZGV2LCBzb2NfaW5mby0+aXJxX2xpbmUtPnN0YXJ0LAogCQkJaGFuZGxlciwgSVJRRl9UUklHR0VSX1JJU0lORywKIAkJCXNvY19pbmZvLT5pcnFfbmFtZSwgaXJxX2RhdGEpOwogCQlpZiAocmMpIHsKQEAgLTExMTAsNyArMTEwMCw3IEBACiAKIAkvKiBHZXQgQ2xvY2sgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc29jX2luZm8tPm51bV9jbGs7IGkrKykgewotCQlzb2NfaW5mby0+Y2xrW2ldID0gY2xrX2dldCgmc29jX2luZm8tPnBkZXYtPmRldiwKKwkJc29jX2luZm8tPmNsa1tpXSA9IGNsa19nZXQoc29jX2luZm8tPmRldiwKIAkJCXNvY19pbmZvLT5jbGtfbmFtZVtpXSk7CiAJCWlmICghc29jX2luZm8tPmNsa1tpXSkgewogCQkJQ0FNX0VSUihDQU1fVVRJTCwgImdldCBmYWlsZWQgZm9yICVzIiwKQEAgLTExNDQsNyArMTEzNCw3IEBACiAKIAlpZiAoc29jX2luZm8tPmlycV9saW5lKSB7CiAJCWRpc2FibGVfaXJxKHNvY19pbmZvLT5pcnFfbGluZS0+c3RhcnQpOwotCQlkZXZtX2ZyZWVfaXJxKCZzb2NfaW5mby0+cGRldi0+ZGV2LAorCQlkZXZtX2ZyZWVfaXJxKHNvY19pbmZvLT5kZXYsCiAJCQlzb2NfaW5mby0+aXJxX2xpbmUtPnN0YXJ0LCBpcnFfZGF0YSk7CiAJfQogCkBAIC0xMTc3LDE2ICsxMTY3LDEyIEBACiBpbnQgY2FtX3NvY191dGlsX3JlbGVhc2VfcGxhdGZvcm1fcmVzb3VyY2Uoc3RydWN0IGNhbV9od19zb2NfaW5mbyAqc29jX2luZm8pCiB7CiAJaW50IGk7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IE5VTEw7CiAKLQlpZiAoIXNvY19pbmZvIHx8ICFzb2NfaW5mby0+cGRldikgeworCWlmICghc29jX2luZm8gfHwgIXNvY19pbmZvLT5kZXYpIHsKIAkJQ0FNX0VSUihDQU1fVVRJTCwgIkludmFsaWQgcGFyYW1ldGVyIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCi0JcGRldiA9IHNvY19pbmZvLT5wZGV2OwotCiAJZm9yIChpID0gc29jX2luZm8tPm51bV9jbGsgLSAxOyBpID49IDA7IGktLSkgewogCQljbGtfcHV0KHNvY19pbmZvLT5jbGtbaV0pOwogCQlzb2NfaW5mby0+Y2xrW2ldID0gTlVMTDsKQEAgLTEyMDcsNyArMTE5Myw3IEBACiAKIAlpZiAoc29jX2luZm8tPmlycV9saW5lKSB7CiAJCWRpc2FibGVfaXJxKHNvY19pbmZvLT5pcnFfbGluZS0+c3RhcnQpOwotCQlkZXZtX2ZyZWVfaXJxKCZzb2NfaW5mby0+cGRldi0+ZGV2LAorCQlkZXZtX2ZyZWVfaXJxKHNvY19pbmZvLT5kZXYsCiAJCQlzb2NfaW5mby0+aXJxX2xpbmUtPnN0YXJ0LCBzb2NfaW5mby0+aXJxX2RhdGEpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fc29jX3V0aWwuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX3NvY191dGlsLmgKaW5kZXggYWU5MmNhYi4uODZjMjczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fc29jX3V0aWwuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV9zb2NfdXRpbC5oCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsvcWNvbS5oPgogCkBAIC0xMTMsOCArMTE1LDEwIEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhIGhhcmR3YXJlIGRyaXZlciBtb2R1bGUKICAqCiAgKiBAcGRldjogICAgICAgICAgICAgICAgICAgUGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIEBkZXZpY2U6ICAgICAgICAgICAgICAgICBEZXZpY2UgcG9pbnRlcgogICogQGh3X3ZlcnNpb246ICAgICAgICAgICAgIENhbWVyYSBkZXZpY2UgdmVyc2lvbgogICogQGluZGV4OiAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGlkIGZvciB0aGUgY2FtZXJhIGRldmljZQorICogQGRldl9uYW1lOiAgICAgICAgICAgICAgIERldmljZSBOYW1lCiAgKiBAaXJxX25hbWU6ICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgaXJxIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCiAgKiBAaXJxX2xpbmU6ICAgICAgICAgICAgICAgSXJxIHJlc291cmNlCiAgKiBAaXJxX2RhdGE6ICAgICAgICAgICAgICAgUHJpdmF0ZSBkYXRhIHRoYXQgaXMgcGFzc2VkIHdoZW4gSVJRIGlzIHJlcXVlc3RlZApAQCAtMTQ3LDEyICsxNTEsMTMgQEAKICAqIEBncGlvX2RhdGE6ICAgICAgICAgICAgICBQb2ludGVyIHRvIGdwaW8gaW5mbwogICogQHBpbmN0cmxfaW5mbzogICAgICAgICAgIFBvaW50ZXIgdG8gcGluY3RybCBpbmZvCiAgKiBAc29jX3ByaXZhdGU6ICAgICAgICAgICAgU29jIHByaXZhdGUgZGF0YQotICoKICAqLwogc3RydWN0IGNhbV9od19zb2NfaW5mbyB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAgICAgICAgICpwZGV2OworCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICAgICAgICAqZGV2OwogCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgaHdfdmVyc2lvbjsKIAl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCWNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAgICAqZGV2X25hbWU7CiAJY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICppcnFfbmFtZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICAgICAgICAgKmlycV9saW5lOwogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXJxX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV90cmFjZS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vY2FtZXJhL2NhbV91dGlscy9jYW1fdHJhY2UuaAppbmRleCAyZTllNjFmLi5mNGY4NWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9jYW1lcmEvY2FtX3V0aWxzL2NhbV90cmFjZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2NhbWVyYS9jYW1fdXRpbHMvY2FtX3RyYWNlLmgKQEAgLTkyLDE1ICs5MiwxNSBAQAogKTsKIAogVFJBQ0VfRVZFTlQoY2FtX2FwcGx5X3JlcSwKLQlUUF9QUk9UTyhjb25zdCBjaGFyICplbnRpdHksIHN0cnVjdCBjYW1fcmVxX21ncl9hcHBseV9yZXF1ZXN0ICpyZXEpLAotCVRQX0FSR1MoZW50aXR5LCByZXEpLAorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmVudGl0eSwgdWludDY0X3QgcmVxX2lkKSwKKwlUUF9BUkdTKGVudGl0eSwgcmVxX2lkKSwKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX3N0cmluZyhlbnRpdHksIGVudGl0eSkKIAkJX19maWVsZCh1aW50NjRfdCwgcmVxX2lkKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCiAJCV9fYXNzaWduX3N0cihlbnRpdHksIGVudGl0eSk7Ci0JCV9fZW50cnktPnJlcV9pZCA9IHJlcS0+cmVxdWVzdF9pZDsKKwkJX19lbnRyeS0+cmVxX2lkID0gcmVxX2lkOwogCSksCiAJVFBfcHJpbnRrKAogCQkiJThzOiBBcHBseVJlcXVlc3QgcmVxdWVzdD0lbGx1IiwKQEAgLTIxNyw2ICsyMTcsNzUgQEAKIAkJCV9fZW50cnktPmRldmljZW1hcCwgX19lbnRyeS0+bGluaywgX19lbnRyeS0+c2Vzc2lvbgogCSkKICk7CisKK1RSQUNFX0VWRU5UKGNhbV9zdWJtaXRfdG9faHcsCisJVFBfUFJPVE8oY29uc3QgY2hhciAqZW50aXR5LCB1aW50NjRfdCByZXFfaWQpLAorCVRQX0FSR1MoZW50aXR5LCByZXFfaWQpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKGVudGl0eSwgZW50aXR5KQorCQlfX2ZpZWxkKHVpbnQ2NF90LCByZXFfaWQpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKGVudGl0eSwgZW50aXR5KTsKKwkJX19lbnRyeS0+cmVxX2lkID0gcmVxX2lkOworCSksCisJVFBfcHJpbnRrKAorCQkiJThzOiBzdWJtaXQgcmVxdWVzdD0lbGx1IiwKKwkJCV9fZ2V0X3N0cihlbnRpdHkpLCBfX2VudHJ5LT5yZXFfaWQKKwkpCispOworCitUUkFDRV9FVkVOVChjYW1faXJxX2FjdGl2YXRlZCwKKwlUUF9QUk9UTyhjb25zdCBjaGFyICplbnRpdHksIHVpbnQzMl90IGlycV90eXBlKSwKKwlUUF9BUkdTKGVudGl0eSwgaXJxX3R5cGUpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKGVudGl0eSwgZW50aXR5KQorCQlfX2ZpZWxkKHVpbnQzMl90LCBpcnFfdHlwZSkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIoZW50aXR5LCBlbnRpdHkpOworCQlfX2VudHJ5LT5pcnFfdHlwZSA9IGlycV90eXBlOworCSksCisJVFBfcHJpbnRrKAorCQkiJThzOiBnb3QgaXJxIHR5cGU9JWQiLAorCQkJX19nZXRfc3RyKGVudGl0eSksIF9fZW50cnktPmlycV90eXBlCisJKQorKTsKKworVFJBQ0VfRVZFTlQoY2FtX2lycV9oYW5kbGVkLAorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmVudGl0eSwgdWludDMyX3QgaXJxX3R5cGUpLAorCVRQX0FSR1MoZW50aXR5LCBpcnFfdHlwZSksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoZW50aXR5LCBlbnRpdHkpCisJCV9fZmllbGQodWludDMyX3QsIGlycV90eXBlKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihlbnRpdHksIGVudGl0eSk7CisJCV9fZW50cnktPmlycV90eXBlID0gaXJxX3R5cGU7CisJKSwKKwlUUF9wcmludGsoCisJCSIlOHM6IGhhbmRsZWQgaXJxIHR5cGU9JWQiLAorCQkJX19nZXRfc3RyKGVudGl0eSksIF9fZW50cnktPmlycV90eXBlCisJKQorKTsKKworVFJBQ0VfRVZFTlQoY2FtX2NkbV9jYiwKKwlUUF9QUk9UTyhjb25zdCBjaGFyICplbnRpdHksIHVpbnQzMl90IHN0YXR1cyksCisJVFBfQVJHUyhlbnRpdHksIHN0YXR1cyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoZW50aXR5LCBlbnRpdHkpCisJCV9fZmllbGQodWludDMyX3QsIHN0YXR1cykKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIoZW50aXR5LCBlbnRpdHkpOworCQlfX2VudHJ5LT5zdGF0dXMgPSBzdGF0dXM7CisJKSwKKwlUUF9wcmludGsoCisJCSIlOHM6IGNkbSBjYiBzdGF0dXM9JWQiLAorCQkJX19nZXRfc3RyKGVudGl0eSksIF9fZW50cnktPnN0YXR1cworCSkKKyk7CisKICNlbmRpZiAvKiBfQ0FNX1RSQUNFX0ggKi8KIAogLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9kdmIvZGVtdXgvbXBxX2RteF9wbHVnaW5fY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9kdmIvZGVtdXgvbXBxX2RteF9wbHVnaW5fY29tbW9uLmMKaW5kZXggZjE2YzFiYS4uMzk3OTNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vZHZiL2RlbXV4L21wcV9kbXhfcGx1Z2luX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL2R2Yi9kZW11eC9tcHFfZG14X3BsdWdpbl9jb21tb24uYwpAQCAtNTIzLDEzICs1MjMsMTcgQEAKIAlpbnQgbGV2ZWw7CiAJc3RydWN0IG1wcV9kZW11eCAqbXBxX2RlbXV4ID0gZnAtPnByaXZhdGVfZGF0YTsKIAotCWlmIChjb3VudCA+PSAxNikKKwlpZiAoY291bnQgPT0gMCB8fCBjb3VudCA+PSAxNikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXRfY291bnQgPSBzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKHVzZXJfc3RyLCAxNiwgcG9zaXRpb24sIHVzZXJfYnVmZmVyLAorCW1lbXNldCh1c2VyX3N0ciwgJ1wwJywgc2l6ZW9mKHVzZXJfc3RyKSk7CisKKwlyZXRfY291bnQgPSBzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKHVzZXJfc3RyLCAxNSwgcG9zaXRpb24sIHVzZXJfYnVmZmVyLAogCQljb3VudCk7CiAJaWYgKHJldF9jb3VudCA8IDApCiAJCXJldHVybiByZXRfY291bnQ7CisJZWxzZSBpZiAocmV0X2NvdW50ID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0ID0ga3N0cnRvaW50KHVzZXJfc3RyLCAwLCAmbGV2ZWwpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9iYXNlLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9iYXNlLmgKaW5kZXggYjE0MzhkNS4uNDAwZjUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfYmFzZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX2Jhc2UuaApAQCAtMzksNiArMzksNyBAQAogI2RlZmluZSBTREVfTURQX0hXX1JFVl8zMDAJU0RFX01EUF9SRVYoMywgMCwgMCkJLyogODk5OCB2MS4wICovCiAjZGVmaW5lIFNERV9NRFBfSFdfUkVWXzMwMQlTREVfTURQX1JFVigzLCAwLCAxKQkvKiA4OTk4IHYxLjEgKi8KICNkZWZpbmUgU0RFX01EUF9IV19SRVZfNDAwCVNERV9NRFBfUkVWKDQsIDAsIDApCS8qIHNkbTg0NSB2MS4wICovCisjZGVmaW5lIFNERV9NRFBfSFdfUkVWXzQxMAlTREVfTURQX1JFVig0LCAxLCAwKQkvKiBzZG02NzAgdjEuMCAqLwogCiAjZGVmaW5lIFNERV9NRFBfVkJJRl80X0xFVkVMX1JFTUFQUEVSCTQKICNkZWZpbmUgU0RFX01EUF9WQklGXzhfTEVWRUxfUkVNQVBQRVIJOApAQCAtMTU3LDYgKzE1OCw3IEBACiAJc3RydWN0IHJlZ19idXNfY2xpZW50ICpyZWdfYnVzX2NsdDsKIAlib29sIGRvbWFpbl9hdHRhY2hlZDsKIAlpbnQgZG9tYWluOworCXUzMiBzaWQ7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfY29yZS5jCmluZGV4IDA3MDQ2MDIuLmE1NGYwMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9jb3JlLmMKQEAgLTQ1LDE4ICs0NSwxMiBAQAogLyogUm90YXRvciBkZXZpY2UgaWQgdG8gYmUgdXNlZCBpbiBTQ00gY2FsbCAqLwogI2RlZmluZSBTREVfUk9UQVRPUl9ERVZJQ0UJMjEKIAotI2lmbmRlZiBWTUlEX0NQX0NBTUVSQV9QUkVWSUVXCi0jZGVmaW5lIFZNSURfQ1BfQ0FNRVJBX1BSRVZJRVcJVk1JRF9JTlZBTAotI2VuZGlmCi0KLS8qIFNDTSBjYWxsIGZ1bmN0aW9uIGlkIHRvIGJlIHVzZWQgZm9yIHN3aXRjaGluZyBiZXR3ZWVuIHNlY3VyZSBhbmQgbm9uCisvKgorICogU0NNIGNhbGwgZnVuY3Rpb24gaWQgdG8gYmUgdXNlZCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gc2VjdXJlIGFuZCBub24KICAqIHNlY3VyZSBjb250ZXh0CiAgKi8KICNkZWZpbmUgTUVNX1BST1RFQ1RfU0RfQ1RSTF9TV0lUQ0ggMHgxOAogCi0vKiBSb3RhdG9yIHNlY3VyZSBTSUQgKi8KLSNkZWZpbmUgU0RFX1JPVEFUT1JfU0VDVVJFX1NJRCAgMHhlMDEKLQogLyogd2FpdGluZyBmb3IgaHcgdGltZSBvdXQsIDMgdnN5bmMgZm9yIDMwZnBzKi8KICNkZWZpbmUgUk9UX0hXX0FDUVVJUkVfVElNRU9VVF9JTl9NUyAxMDAKIApAQCAtNzEsNiArNjUsOSBAQAogI2RlZmluZSBST1RfT1ZFUkhFQURfTlVNRVJBVE9SCQkyNwogI2RlZmluZSBST1RfT1ZFUkhFQURfREVOT01JTkFUT1IJMTAwMDAKIAorLyogTWluaW11bSBSb3RhdG9yIENsb2NrIHZhbHVlICovCisjZGVmaW5lIFJPVF9NSU5fUk9UX0NMSwkJCTIwMDAwMDAwCisKIC8qIGRlZmF1bHQgbWluaW11bSBiYW5kd2lkdGggdm90ZSAqLwogI2RlZmluZSBST1RfRU5BQkxFX0JXX1ZPVEUJCTY0MDAwCiAvKgpAQCAtNjAxLDcgKzU5OCw3IEBACiAKIAlpZiAodGVzdF9iaXQoU0RFX0NBUFNfU0VDX0FUVEFDSF9ERVRBQ0hfU01NVSwKIAkJbWRhdGEtPnNkZV9jYXBzX21hcCkpIHsKLQkJc2lkX2luZm8gPSBTREVfUk9UQVRPUl9TRUNVUkVfU0lEOworCQlzaWRfaW5mbyA9IG1kYXRhLT5zZGVfc21tdVtTREVfSU9NTVVfRE9NQUlOX1JPVF9TRUNVUkVdLnNpZDsKIAkJZGVzYy5hcmdpbmZvID0gU0NNX0FSR1MoNCwgU0NNX1ZBTCwgU0NNX1JXLCBTQ01fVkFMLCBTQ01fVkFMKTsKIAkJZGVzYy5hcmdzWzBdID0gU0RFX1JPVEFUT1JfREVWSUNFOwogCQlkZXNjLmFyZ3NbMV0gPSBTQ01fQlVGRkVSX1BIWVMoJnNpZF9pbmZvKTsKQEAgLTYzMSw5ICs2MjgsMTIgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAotCQkJU0RFUk9UX0RCRygic2NtX2NhbGwoMSkgcmV0PSVkLCByZXNwPSV4IiwKKwkJCVNERVJPVF9EQkcoCisJCQkgICJzY20oMSkgc2lkMHgleCBkZXYweCVsbHggdm1pZDB4JWxseCByZXQlZCByZXNwJXhcbiIsCisJCQkJc2lkX2luZm8sIGRlc2MuYXJnc1swXSwgZGVzYy5hcmdzWzNdLAogCQkJCXJldCwgcmVzcCk7Ci0JCQlTREVST1RfRVZUTE9HKDEpOworCQkJU0RFUk9UX0VWVExPRygxLCBzaWRfaW5mbywgZGVzYy5hcmdzWzBdLCBkZXNjLmFyZ3NbM10sCisJCQkJCXJldCwgcmVzcCk7CiAJCX0gZWxzZSBpZiAobWRhdGEtPnNlY19jYW1fZW4gJiYgIWVuYWJsZSkgewogCQkJLyoKIAkJCSAqIERpc2FibGUgc2VjdXJlIGNhbWVyYSBvcGVyYXRpb24KQEAgLTY0OCwxMiArNjQ4LDE2IEBACiAJCQkJTUVNX1BST1RFQ1RfU0RfQ1RSTF9TV0lUQ0gpLCAmZGVzYyk7CiAJCQlyZXNwID0gZGVzYy5yZXRbMF07CiAKLQkJCVNERVJPVF9EQkcoInNjbV9jYWxsKDApOiByZXQ9JWQsIHJlc3A9JXgiLAorCQkJU0RFUk9UX0RCRygKKwkJCSAgInNjbSgwKSBzaWQweCV4IGRldjB4JWxseCB2bWlkMHglbGx4IHJldCVkIHJlc3AlZFxuIiwKKwkJCQlzaWRfaW5mbywgZGVzYy5hcmdzWzBdLCBkZXNjLmFyZ3NbM10sCiAJCQkJcmV0LCByZXNwKTsKIAogCQkJLyogZm9yY2Ugc21tdSB0byByZWF0dGFjaCAqLwogCQkJc2RlX3NtbXVfc2VjdXJlX2N0cmwoMSk7Ci0JCQlTREVST1RfRVZUTE9HKDApOworCisJCQlTREVST1RfRVZUTE9HKDAsIHNpZF9pbmZvLCBkZXNjLmFyZ3NbMF0sIGRlc2MuYXJnc1szXSwKKwkJCQkJcmV0LCByZXNwKTsKIAkJfQogCX0gZWxzZSB7CiAJCXJldHVybiAwOwpAQCAtMTM3Nyw2ICsxMzgxLDkgQEAKIAlpZiAocm90X2Rldi0+bWluX3JvdF9jbGsgPiBwZXJmLT5jbGtfcmF0ZSkKIAkJcGVyZi0+Y2xrX3JhdGUgPSByb3RfZGV2LT5taW5fcm90X2NsazsKIAorCWlmIChtZ3ItPm1pbl9yb3RfY2xrID4gcGVyZi0+Y2xrX3JhdGUpCisJCXBlcmYtPmNsa19yYXRlID0gbWdyLT5taW5fcm90X2NsazsKKwogCXJlYWRfYncgPSAgc2RlX3JvdGF0b3JfY2FsY19idWZfYncoaW5fZm10LCBjb25maWctPmlucHV0LndpZHRoLAogCQkJCWNvbmZpZy0+aW5wdXQuaGVpZ2h0LCBtYXhfZnBzKTsKIApAQCAtMjM4MiwxMSArMjM4OSwxNSBAQAogCX0KIAogCVNERVJPVF9EQkcoCi0JCSJyZWNvbmZpZyBzZXNzaW9uIGlkPSV1IGlueyV1LCV1fWY6JXUgb3V0eyV1LCV1fWY6JXUgZnBzOiVkIGNsazolbHUsIGJ3OiVsbHVcbiIsCisJCSJyZWNvbmZpZyBzZXNzaW9uIGlkPSV1IGlueyV1LCV1fWY6JXggb3V0eyV1LCV1fWY6JXggZnBzOiVkIGNsazolbHUgYnc6JWxsdVxuIiwKIAkJY29uZmlnLT5zZXNzaW9uX2lkLCBjb25maWctPmlucHV0LndpZHRoLCBjb25maWctPmlucHV0LmhlaWdodCwKIAkJY29uZmlnLT5pbnB1dC5mb3JtYXQsIGNvbmZpZy0+b3V0cHV0LndpZHRoLAogCQljb25maWctPm91dHB1dC5oZWlnaHQsIGNvbmZpZy0+b3V0cHV0LmZvcm1hdCwKIAkJY29uZmlnLT5mcmFtZV9yYXRlLCBwZXJmLT5jbGtfcmF0ZSwgcGVyZi0+YncpOworCVNERVJPVF9FVlRMT0coY29uZmlnLT5zZXNzaW9uX2lkLCBjb25maWctPmlucHV0LndpZHRoLAorCQkJY29uZmlnLT5pbnB1dC5oZWlnaHQsIGNvbmZpZy0+aW5wdXQuZm9ybWF0LAorCQkJY29uZmlnLT5vdXRwdXQud2lkdGgsIGNvbmZpZy0+b3V0cHV0LmhlaWdodCwKKwkJCWNvbmZpZy0+b3V0cHV0LmZvcm1hdCwgY29uZmlnLT5mcmFtZV9yYXRlKTsKIGRvbmU6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTMwNzksOCArMzA5MCwxMSBAQAogCX0gZWxzZSBpZiAoSVNfU0RFX01BSk9SX01JTk9SX1NBTUUobWRhdGEtPm1kc3NfdmVyc2lvbiwKIAkJCVNERV9NRFBfSFdfUkVWXzMwMCkgfHwKIAkJSVNfU0RFX01BSk9SX01JTk9SX1NBTUUobWRhdGEtPm1kc3NfdmVyc2lvbiwKLQkJCVNERV9NRFBfSFdfUkVWXzQwMCkpIHsKKwkJCVNERV9NRFBfSFdfUkVWXzQwMCkgfHwKKwkJSVNfU0RFX01BSk9SX01JTk9SX1NBTUUobWRhdGEtPm1kc3NfdmVyc2lvbiwKKwkJCVNERV9NRFBfSFdfUkVWXzQxMCkpIHsKIAkJbWdyLT5vcHNfaHdfaW5pdCA9IHNkZV9yb3RhdG9yX3IzX2luaXQ7CisJCW1nci0+bWluX3JvdF9jbGsgPSBST1RfTUlOX1JPVF9DTEs7CiAJfSBlbHNlIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJU0RFUk9UX0VSUigidW5zdXBwb3J0ZWQgc2RlIHZlcnNpb24gJXhcbiIsCkBAIC0zMzk1LDMgKzM0MDksMzggQEAKIAogCXJldHVybiBzZGVfcm90YXRvcl9jb25maWdfc2Vzc2lvbihtZ3IsIHByaXZhdGUsIGNvbmZpZyk7CiB9CisKKy8qCisgKiBzZGVfcm90YXRvcl9zZXNzaW9uX3ZhbGlkYXRlIC0gdmFsaWRhdGUgc2Vzc2lvbgorICovCitpbnQgc2RlX3JvdGF0b3Jfc2Vzc2lvbl92YWxpZGF0ZShzdHJ1Y3Qgc2RlX3JvdF9tZ3IgKm1nciwKKwlzdHJ1Y3Qgc2RlX3JvdF9maWxlX3ByaXZhdGUgKnByaXZhdGUsCisJc3RydWN0IHNkZV9yb3RhdGlvbl9jb25maWcgKmNvbmZpZykKK3sKKwlpbnQgcmV0OworCisJaWYgKCFtZ3IgfHwgIXByaXZhdGUgfHwgIWNvbmZpZykgeworCQlTREVST1RfRVJSKCJudWxsIHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlTREVST1RfREJHKAorCQkidmFsaWRhdGUgc2Vzc2lvbiBpZD0ldSBpbnsldSwldX1mOiV4IG91dHsldSwldX1mOiV4IGZwczolZFxuIiwKKwkJY29uZmlnLT5zZXNzaW9uX2lkLCBjb25maWctPmlucHV0LndpZHRoLCBjb25maWctPmlucHV0LmhlaWdodCwKKwkJY29uZmlnLT5pbnB1dC5mb3JtYXQsIGNvbmZpZy0+b3V0cHV0LndpZHRoLAorCQljb25maWctPm91dHB1dC5oZWlnaHQsIGNvbmZpZy0+b3V0cHV0LmZvcm1hdCwKKwkJY29uZmlnLT5mcmFtZV9yYXRlKTsKKworCXJldCA9IHNkZV9yb3RhdG9yX3ZlcmlmeV9jb25maWdfYWxsKG1nciwgY29uZmlnKTsKKwlpZiAocmV0KSB7CisJCVNERVJPVF9XQVJOKCJyb3RhdG9yIHZlcmlmeSBmb3JtYXQgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChjb25maWctPm91dHB1dC5zYnVmICYmIG1nci0+c2J1Zl9jdHggIT0gcHJpdmF0ZSAmJiBtZ3ItPnNidWZfY3R4KSB7CisJCVNERVJPVF9XQVJOKCJ0b28gbWFueSBzYnVmIHNlc3Npb25zXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX2NvcmUuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX2NvcmUuaAppbmRleCBlYjhjYjg4Li5lMmY1NDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9jb3JlLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfY29yZS5oCkBAIC0zOTYsNiArMzk2LDcgQEAKICAqIEBwaXhlbF9wZXJfY2xrOiByb3RhdG9yIGhhcmR3YXJlIHBlcmZvcm1hbmNlIGluIHBpeGVsIGZvciBjbG9jawogICogQGZ1ZGdlX2ZhY3RvcjogZnVkZ2UgZmFjdG9yIGZvciBjbG9jayBjYWxjdWxhdGlvbgogICogQG92ZXJoZWFkOiBzb2Z0d2FyZSBvdmVyaGVhZCBmb3Igb2ZmbGluZSByb3RhdGlvbiBpbiBtc2VjCisgKiBAbWluX3JvdF9jbGs6IG1pbmltdW0gcm90YXRvciBjbG9jayByYXRlCiAgKiBAc2J1Zl9jdHg6IHBvaW50ZXIgdG8gc2J1ZiBzZXNzaW9uIGNvbnRleHQKICAqIEBvcHNfeHh4OiBmdW5jdGlvbiBwb2ludGVycyBvZiByb3RhdG9yIEhBTCBsYXllcgogICogQGh3X2RhdGE6IHByaXZhdGUgaGFuZGxlIG9mIHJvdGF0b3IgSEFMIGxheWVyCkBAIC00NDMsNiArNDQ0LDcgQEAKIAlzdHJ1Y3Qgc2RlX211bHRfZmFjdG9yIHBpeGVsX3Blcl9jbGs7CiAJc3RydWN0IHNkZV9tdWx0X2ZhY3RvciBmdWRnZV9mYWN0b3I7CiAJc3RydWN0IHNkZV9tdWx0X2ZhY3RvciBvdmVyaGVhZDsKKwl1bnNpZ25lZCBsb25nIG1pbl9yb3RfY2xrOwogCiAJc3RydWN0IHNkZV9yb3RfZmlsZV9wcml2YXRlICpzYnVmX2N0eDsKIApAQCAtNjAyLDYgKzYwNCwxNyBAQAogCXN0cnVjdCBzZGVfcm90YXRpb25fY29uZmlnICpjb25maWcpOwogCiAvKgorICogc2RlX3JvdGF0b3Jfc2Vzc2lvbl92YWxpZGF0ZSAtIHZhbGlkYXRlIHNlc3Npb24gY29uZmlndXJhdGlvbgorICogQG1ncjogUG9pbnRlciB0byByb3RhdG9yIG1hbmFnZXIKKyAqIEBwcml2YXRlOiBQb2ludGVyIHRvIHBlciBmaWxlIHNlc3Npb24KKyAqIEBjb25maWc6IFBvaW50ZXIgdG8gcm90YXRvciBjb25maWd1cmF0aW9uCisgKiByZXR1cm46IDAgaWYgc3VjY2VzczsgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IHNkZV9yb3RhdG9yX3Nlc3Npb25fdmFsaWRhdGUoc3RydWN0IHNkZV9yb3RfbWdyICptZ3IsCisJc3RydWN0IHNkZV9yb3RfZmlsZV9wcml2YXRlICpwcml2YXRlLAorCXN0cnVjdCBzZGVfcm90YXRpb25fY29uZmlnICpjb25maWcpOworCisvKgogICogc2RlX3JvdGF0b3JfcmVxX2luaXQgLSBhbGxvY2F0ZSBhIG5ldyByZXF1ZXN0IGFuZCBpbml0aWFsemllIHdpdGggZ2l2ZW4KICAqCWFycmF5IG9mIHJvdGF0aW9uIGl0ZW1zCiAgKiBAcm90X2RldjogUG9pbnRlciB0byByb3RhdG9yIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfZGV2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9kZXYuYwppbmRleCA0YWQ5NjBkOC4uZjgxY2QyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfZGV2LmMKQEAgLTE0NjAsOSArMTQ2MCwxMCBAQAogCXN0cnVjdCBzZGVfcm90YXRvcl9kZXZpY2UgKnJvdF9kZXY7CiAJc3RydWN0IHNkZV9yb3RhdG9yX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwogCXN0cnVjdCBzZGVfcm90X2VudHJ5X2NvbnRhaW5lciAqcmVxID0gTlVMTDsKKwlzdHJ1Y3Qgc2RlX3JvdGF0aW9uX2NvbmZpZyByb3RjZmc7CiAJa3RpbWVfdCAqdHM7CiAJdTMyIGZsYWdzID0gMDsKLQlpbnQgaSwgcmV0OworCWludCBpLCByZXQgPSAwOwogCiAJaWYgKCFoYW5kbGUgfHwgIWNtZCkgewogCQlTREVST1RfRVJSKCJpbnZhbGlkIHJvdGF0b3IgaGFuZGxlL2NtZFxuIik7CkBAIC0xNDc4LDcgKzE0NzksNyBAQAogCX0KIAogCVNERVJPVF9EQkcoCi0JCSJzOiVkLiV1IHNyYzooJXUsJXUsJXUsJXUpLyV1eCV1LyVjJWMlYyVjIGRzdDooJXUsJXUsJXUsJXUpLyVjJWMlYyVjIHI6JWQgZjolZC8lZCBzOiVkIGZwczoldSBjbGs6JWxsdSBidzolbGx1IHdiOiVkIHZpZDolZCBjbWQ6JWRcbiIsCisJCSJzOiVkLiV1IHNyYzooJXUsJXUsJXUsJXUpLyV1eCV1LyVjJWMlYyVjIGRzdDooJXUsJXUsJXUsJXUpLyVjJWMlYyVjIHI6JWQgZjolZC8lZCBzOiVkIGZwczoldSBjbGs6JWxsdSBidzolbGx1IHByZWZpbGw6JWxsdSB3YjolZCB2aWQ6JWQgY21kOiVkXG4iLAogCQljdHgtPnNlc3Npb25faWQsIGNtZC0+c2VxdWVuY2VfaWQsCiAJCWNtZC0+c3JjX3JlY3RfeCwgY21kLT5zcmNfcmVjdF95LAogCQljbWQtPnNyY19yZWN0X3csIGNtZC0+c3JjX3JlY3RfaCwKQEAgLTE0OTAsNyArMTQ5MSw3IEBACiAJCWNtZC0+ZHN0X3BpeGZtdCA+PiAwLCBjbWQtPmRzdF9waXhmbXQgPj4gOCwKIAkJY21kLT5kc3RfcGl4Zm10ID4+IDE2LCBjbWQtPmRzdF9waXhmbXQgPj4gMjQsCiAJCWNtZC0+cm90OTAsIGNtZC0+aGZsaXAsIGNtZC0+dmZsaXAsIGNtZC0+c2VjdXJlLCBjbWQtPmZwcywKLQkJY21kLT5jbGtyYXRlLCBjbWQtPmRhdGFfYncsCisJCWNtZC0+Y2xrcmF0ZSwgY21kLT5kYXRhX2J3LCBjbWQtPnByZWZpbGxfYncsCiAJCWNtZC0+ZHN0X3dyaXRlYmFjaywgY21kLT52aWRlb19tb2RlLCBjbWRfdHlwZSk7CiAJU0RFUk9UX0VWVExPRyhjdHgtPnNlc3Npb25faWQsIGNtZC0+c2VxdWVuY2VfaWQsCiAJCWNtZC0+c3JjX3JlY3RfeCwgY21kLT5zcmNfcmVjdF95LApAQCAtMTQ5OCwxMSArMTQ5OSwxMSBAQAogCQljbWQtPnNyY19waXhmbXQsCiAJCWNtZC0+ZHN0X3JlY3RfdywgY21kLT5kc3RfcmVjdF9oLAogCQljbWQtPmRzdF9waXhmbXQsCisJCWNtZC0+ZnBzLCBjbWQtPmNsa3JhdGUsIGNtZC0+ZGF0YV9idywgY21kLT5wcmVmaWxsX2J3LAogCQkoY21kLT5yb3Q5MCA8PCAwKSB8IChjbWQtPmhmbGlwIDw8IDEpIHwgKGNtZC0+dmZsaXAgPDwgMikgfAogCQkoY21kLT5zZWN1cmUgPDwgMykgfCAoY21kLT5kc3Rfd3JpdGViYWNrIDw8IDQpIHwKLQkJKGNtZC0+dmlkZW9fbW9kZSA8PCA1KSwKLQkJY21kLT5mcHMsIGNtZC0+Y2xrcmF0ZSwgY21kLT5kYXRhX2J3LAotCQljbWRfdHlwZSk7CisJCShjbWQtPnZpZGVvX21vZGUgPDwgNSkgfAorCQkoY21kX3R5cGUgPDwgMjQpKTsKIAogCXNkZV9yb3RfbWdyX2xvY2socm90X2Rldi0+bWdyKTsKIApAQCAtMTU4NCwxMSArMTU4NSw4IEBACiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBlcnJvcl9pbml0X3JlcXVlc3Q7CiAJCX0KLQl9CiAKLQlpZiAoY21kX3R5cGUgPT0gU0RFX1JPVEFUT1JfSU5MSU5FX0NNRF9WQUxJREFURSkgewotCQlzdHJ1Y3Qgc2RlX3JvdGF0aW9uX2NvbmZpZyByb3RjZmc7Ci0KKwkJLyogaW5pdGlhbGl6ZSBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gKi8KIAkJbWVtc2V0KCZyb3RjZmcsIDAsIHNpemVvZihzdHJ1Y3Qgc2RlX3JvdGF0aW9uX2NvbmZpZykpOwogCQlyb3RjZmcuZmxhZ3MgPSBmbGFnczsKIAkJcm90Y2ZnLmZyYW1lX3JhdGUgPSBjbWQtPmZwczsKQEAgLTE2MDYsMjUgKzE2MDQsMTYgQEAKIAkJcm90Y2ZnLm91dHB1dC5jb21wX3JhdGlvLm51bWVyID0gMTsKIAkJcm90Y2ZnLm91dHB1dC5jb21wX3JhdGlvLmRlbm9tID0gMTsKIAkJcm90Y2ZnLm91dHB1dC5zYnVmID0gdHJ1ZTsKKwl9CiAKLQkJaWYgKG1lbWNtcCgmcm90Y2ZnLCAmY3R4LT5yb3RjZmcsIHNpemVvZihyb3RjZmcpKSkgewotCQkJcmV0ID0gc2RlX3JvdGF0b3Jfc2Vzc2lvbl9jb25maWcocm90X2Rldi0+bWdyLAotCQkJCQljdHgtPnByaXZhdGUsICZyb3RjZmcpOwotCQkJaWYgKHJldCkgewotCQkJCVNERVJPVF9XQVJOKCJmYWlsIHNlc3Npb24gY29uZmlnIHM6JWRcbiIsCi0JCQkJCQljdHgtPnNlc3Npb25faWQpOwotCQkJCWdvdG8gZXJyb3Jfc2Vzc2lvbl9jb25maWc7Ci0JCQl9CisJaWYgKGNtZF90eXBlID09IFNERV9ST1RBVE9SX0lOTElORV9DTURfVkFMSURBVEUpIHsKIAotCQkJY3R4LT5yb3RjZmcgPSByb3RjZmc7Ci0JCX0KLQotCQlyZXQgPSBzZGVfcm90YXRvcl92YWxpZGF0ZV9yZXF1ZXN0KHJvdF9kZXYtPm1nciwgY3R4LT5wcml2YXRlLAotCQkJCXJlcSk7CisJCXJldCA9IHNkZV9yb3RhdG9yX3Nlc3Npb25fdmFsaWRhdGUocm90X2Rldi0+bWdyLAorCQkJCWN0eC0+cHJpdmF0ZSwgJnJvdGNmZyk7CiAJCWlmIChyZXQpIHsKLQkJCVNERVJPVF9XQVJOKCJmYWlsIHZhbGlkYXRlIHJlcXVlc3QgczolZFxuIiwKKwkJCVNERVJPVF9XQVJOKCJmYWlsIHNlc3Npb24gdmFsaWRhdGlvbiBzOiVkXG4iLAogCQkJCQljdHgtPnNlc3Npb25faWQpOwotCQkJZ290byBlcnJvcl92YWxpZGF0ZV9yZXF1ZXN0OworCQkJZ290byBlcnJvcl9zZXNzaW9uX3ZhbGlkYXRlOwogCQl9CiAKIAkJZGV2bV9rZnJlZShyb3RfZGV2LT5kZXYsIHJlcSk7CkBAIC0xNjMyLDYgKzE2MjEsMTggQEAKIAogCX0gZWxzZSBpZiAoY21kX3R5cGUgPT0gU0RFX1JPVEFUT1JfSU5MSU5FX0NNRF9DT01NSVQpIHsKIAorCQlpZiAobWVtY21wKCZyb3RjZmcsICZjdHgtPnJvdGNmZywgc2l6ZW9mKHJvdGNmZykpKSB7CisJCQlyZXQgPSBzZGVfcm90YXRvcl9zZXNzaW9uX2NvbmZpZyhyb3RfZGV2LT5tZ3IsCisJCQkJCWN0eC0+cHJpdmF0ZSwgJnJvdGNmZyk7CisJCQlpZiAocmV0KSB7CisJCQkJU0RFUk9UX0VSUigiZmFpbCBzZXNzaW9uIGNvbmZpZyBzOiVkXG4iLAorCQkJCQkJY3R4LT5zZXNzaW9uX2lkKTsKKwkJCQlnb3RvIGVycm9yX3Nlc3Npb25fY29uZmlnOworCQkJfQorCisJCQljdHgtPnJvdGNmZyA9IHJvdGNmZzsKKwkJfQorCiAJCXJlcXVlc3QgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmN0eC0+cmV0aXJlZF9saXN0LAogCQkJCXN0cnVjdCBzZGVfcm90YXRvcl9yZXF1ZXN0LCBsaXN0KTsKIAkJaWYgKCFyZXF1ZXN0KSB7CkBAIC0xNzQ1LDcgKzE3NDYsNyBAQAogCXNkZV9yb3RhdG9yX3VwZGF0ZV9yZXRpcmVfc2VxdWVuY2UocmVxdWVzdCk7CiAJc2RlX3JvdGF0b3JfcmV0aXJlX3JlcXVlc3QocmVxdWVzdCk7CiBlcnJvcl9yZXRpcmVkX2xpc3Q6Ci1lcnJvcl92YWxpZGF0ZV9yZXF1ZXN0OgorZXJyb3Jfc2Vzc2lvbl92YWxpZGF0ZToKIGVycm9yX3Nlc3Npb25fY29uZmlnOgogCWRldm1fa2ZyZWUocm90X2Rldi0+ZGV2LCByZXEpOwogZXJyb3JfaW52YWxpZF9oYW5kbGU6CkBAIC0yMTgzLDYgKzIxODQsNyBAQAogCWlmIChyZXQgPCAwKQogCQlTREVERVZfRVJSKGN0eC0+cm90X2Rldi0+ZGV2LCAiZmFpbCBxYnVmIHM6JWQgdDolZCByOiVkXG4iLAogCQkJCWN0eC0+c2Vzc2lvbl9pZCwgYnVmLT50eXBlLCByZXQpOworCVNERVJPVF9FVlRMT0coYnVmLT50eXBlLCBidWYtPmJ5dGVzdXNlZCwgYnVmLT5sZW5ndGgsIGJ1Zi0+bS5mZCwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzY1LDYgKzIzNjcsNyBAQAogCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvciA9IDE7CiAJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IgPSAxOwogCisJU0RFUk9UX0VWVExPRyhmb3JtYXQtPmZtdC5waXgud2lkdGgsIGZvcm1hdC0+Zm10LnBpeC5oZWlnaHQsIGEtPnR5cGUpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjE0LDEzICsyNjE3LDYgQEAKIAkJCX0KIAogCQkJLyoqCi0JCQkgKiBMb29zZSBhbnkgcmVmZXJlbmNlIHRvIHN5bmMgZmVuY2Ugb25jZSB3ZSBwYXNzCi0JCQkgKiBpdCB0byB1c2VyLiBEcml2ZXIgZG9lcyBub3QgY2xlYW4gdXAgdXNlcgotCQkJICogdW5jbG9zZWQgZmVuY2UgZGVzY3JpcHRvcnMuCi0JCQkgKi8KLQkJCXZiaW5mby0+ZmVuY2UgPSBOVUxMOwotCi0JCQkvKioKIAkJCSAqIENhY2hlIGZlbmNlIGRlc2NyaXB0b3IgaW4gY2FzZSB1c2VyIGNhbGxzIHRoaXMKIAkJCSAqIGlvY3RsIG11bHRpcGxlIHRpbWVzLiBDYWNoZWQgdmFsdWUgd291bGQgYmUgc3RhbGUKIAkJCSAqIGlmIHVzZXIgZHVwbGljYXRlZCBhbmQgY2xvc2VkIG9sZCBkZXNjcmlwdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfcjMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX3IzLmMKaW5kZXggMmYyYTQzOS4uMzIwNjg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfcjMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9yMy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAic2RlX3JvdGF0b3JfZGVidWcuaCIKIAogI2RlZmluZSBSRVNfVUhEICAgICAgICAgICAgICAoMzg0MCoyMTYwKQorI2RlZmluZSBNU19UT19VUyh0KSAoKHQpICogVVNFQ19QRVJfTVNFQykKIAogLyogdHJhZmZpYyBzaGFwaW5nIGNsb2NrIHRpY2tzID0gZmluaXNoX3RpbWUgeCAxOS4yTUh6ICovCiAjZGVmaW5lIFRSQUZGSUNfU0hBUEVfQ0xLVElDS18xNE1TICAgMjY4ODAwCkBAIC00OCw3ICs0OSw3IEBACiAjZGVmaW5lIFhJTl9XUklURUJBQ0sJCTEKIAogLyogd2FpdCBmb3IgYXQgbW9zdCAyIHZzeW5jIGZvciBsb3dlc3QgcmVmcmVzaCByYXRlICgyNGh6KSAqLwotI2RlZmluZSBLT0ZGX1RJTUVPVVQJCSg0MiAqIDMyKQorI2RlZmluZSBLT0ZGX1RJTUVPVVQJCSg0MiAqIDgpCiAKIC8qIGRlZmF1bHQgc3RyZWFtIGJ1ZmZlciBoZWFkcm9vbSBpbiBsaW5lcyAqLwogI2RlZmluZSBERUZBVUxUX1NCVUZfSEVBRFJPT00JMjAKQEAgLTY1LDM1ICs2Niw1NCBAQAogCWRvIHsgXAogCQlTREVST1RfREJHKCJTREVSRUcuVzpbJXM6MHglWF0gPD0gMHglWFxuIiwgI29mZiwgKG9mZiksXAogCQkJCSh1MzIpKGRhdGEpKTtcCi0JCSpwKysgPSBSRUdETUFfT1BfUkVHV1JJVEUgfCBcCi0JCQkoKG9mZikgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7IFwKLQkJKnArKyA9IChkYXRhKTsgXAorCQl3cml0ZWxfcmVsYXhlZF9ub19sb2coIFwKKwkJCQkoUkVHRE1BX09QX1JFR1dSSVRFIHwgXAorCQkJCSAoKG9mZikgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSykpLCBcCisJCQkJcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAorCQl3cml0ZWxfcmVsYXhlZF9ub19sb2coZGF0YSwgcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgU0RFX1JFR0RNQV9NT0RJRlkocCwgb2ZmLCBtYXNrLCBkYXRhKSBcCiAJZG8geyBcCiAJCVNERVJPVF9EQkcoIlNERVJFRy5NOlslczoweCVYXSA8PSAweCVYXG4iLCAjb2ZmLCAob2ZmKSxcCiAJCQkJKHUzMikoZGF0YSkpO1wKLQkJKnArKyA9IFJFR0RNQV9PUF9SRUdNT0RJRlkgfCBcCi0JCQkoKG9mZikgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7IFwKLQkJKnArKyA9IChtYXNrKTsgXAotCQkqcCsrID0gKGRhdGEpOyBcCisJCXdyaXRlbF9yZWxheGVkX25vX2xvZyggXAorCQkJCShSRUdETUFfT1BfUkVHTU9ESUZZIHwgXAorCQkJCSAoKG9mZikgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSykpLCBcCisJCQkJcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAorCQl3cml0ZWxfcmVsYXhlZF9ub19sb2cobWFzaywgcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAorCQl3cml0ZWxfcmVsYXhlZF9ub19sb2coZGF0YSwgcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgU0RFX1JFR0RNQV9CTEtXUklURV9JTkMocCwgb2ZmLCBsZW4pIFwKIAlkbyB7IFwKIAkJU0RFUk9UX0RCRygiU0RFUkVHLkI6WyVzOjB4JVg6MHglWF1cbiIsICNvZmYsIChvZmYpLFwKIAkJCQkodTMyKShsZW4pKTtcCi0JCSpwKysgPSBSRUdETUFfT1BfQkxLV1JJVEVfSU5DIHwgXAotCQkJKChvZmYpICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spOyBcCi0JCSpwKysgPSAobGVuKTsgXAorCQl3cml0ZWxfcmVsYXhlZF9ub19sb2coIFwKKwkJCQkoUkVHRE1BX09QX0JMS1dSSVRFX0lOQyB8IFwKKwkJCQkgKChvZmYpICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spKSwgXAorCQkJCXApOyBcCisJCXAgKz0gc2l6ZW9mKHUzMik7IFwKKwkJd3JpdGVsX3JlbGF4ZWRfbm9fbG9nKGxlbiwgcCk7IFwKKwkJcCArPSBzaXplb2YodTMyKTsgXAogCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgU0RFX1JFR0RNQV9CTEtXUklURV9EQVRBKHAsIGRhdGEpIFwKIAlkbyB7IFwKIAkJU0RFUk9UX0RCRygiU0RFUkVHLkk6WzpdIDw9IDB4JVhcbiIsICh1MzIpKGRhdGEpKTtcCi0JCSoocCkgPSAoZGF0YSk7IFwKLQkJKHApKys7IFwKKwkJd3JpdGVsX3JlbGF4ZWRfbm9fbG9nKGRhdGEsIHApOyBcCisJCXAgKz0gc2l6ZW9mKHUzMik7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFNERV9SRUdETUFfUkVBRChwLCBkYXRhKSBcCisJZG8geyBcCisJCWRhdGEgPSByZWFkbF9yZWxheGVkX25vX2xvZyhwKTsgXAorCQlwICs9IHNpemVvZih1MzIpOyBcCiAJfSB3aGlsZSAoMCkKIAogLyogTWFjcm8gZm9yIGRpcmVjdGx5IGFjY2Vzc2luZyBtYXBwZWQgcmVnaXN0ZXJzICovCkBAIC02NDcsMTIgKzY2Nyw5OSBAQAogfQogCiAvKioKKyAqIHNkZV9od19yb3RhdG9yX3Jlc2V0IC0gUmVzZXQgcm90YXRvciBoYXJkd2FyZQorICogQHJvdDogcG9pbnRlciB0byBodyByb3RhdG9yCisgKiBAY3R4OiBwb2ludGVyIHRvIGN1cnJlbnQgcm90YXRvciBjb250ZXh0IGR1cmluZyB0aGUgaHcgaGFuZworICovCitzdGF0aWMgaW50IHNkZV9od19yb3RhdG9yX3Jlc2V0KHN0cnVjdCBzZGVfaHdfcm90YXRvciAqcm90LAorCQlzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3JfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBzZGVfaHdfcm90YXRvcl9jb250ZXh0ICpyY3R4ID0gTlVMTDsKKwl1MzIgaW50X21hc2sgPSAoUkVHRE1BX0lOVF8wX01BU0sgfCBSRUdETUFfSU5UXzFfTUFTSyB8CisJCQlSRUdETUFfSU5UXzJfTUFTSyk7CisJdTMyIGxhc3RfdHNbUk9UX1FVRVVFX01BWF0gPSB7MCx9OworCXUzMiBsYXRlc3RfdHM7CisJaW50IGVsYXBzZWRfdGltZSwgdDsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFyb3QgfHwgIWN0eCkgeworCQlTREVST1RfRVJSKCJOVUxMIHJvdGF0b3IgY29udGV4dFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjdHgtPnFfaWQgPj0gUk9UX1FVRVVFX01BWCkgeworCQlTREVST1RfRVJSKCJjb250ZXh0IHFfaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgY3R4LT5xX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3cgcmVzZXQgdGhlIGh3IHJvdGF0b3IgKi8KKwlTREVfUk9UUkVHX1dSSVRFKHJvdC0+bWRzc19iYXNlLCBST1RUT1BfU1dfUkVTRVRfT1ZFUlJJREUsIDEpOworCXVzbGVlcF9yYW5nZShNU19UT19VUygxMCksIE1TX1RPX1VTKDIwKSk7CisJU0RFX1JPVFJFR19XUklURShyb3QtPm1kc3NfYmFzZSwgUk9UVE9QX1NXX1JFU0VUX09WRVJSSURFLCAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyb3QtPnJvdGlzcl9sb2NrLCBmbGFncyk7CisKKwkvKiB1cGRhdGUgdGltZXN0YW1wIHJlZ2lzdGVyIHdpdGggY3VycmVudCBjb250ZXh0ICovCisJbGFzdF90c1tjdHgtPnFfaWRdID0gY3R4LT50aW1lc3RhbXA7CisJc2RlX2h3X3JvdGF0b3JfdXBkYXRlX3N3dHMocm90LCBjdHgsIGN0eC0+dGltZXN0YW1wKTsKKwlTREVST1RfRVZUTE9HKGN0eC0+dGltZXN0YW1wKTsKKworCS8qCisJICogU2VhcmNoIGZvciBhbnkgcGVuZGluZyByb3Qgc2Vzc2lvbiwgYW5kIGxvb2sgZm9yIGxhc3QgdGltZXN0YW1wCisJICogcGVyIGh3IHF1ZXVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBST1RfUVVFVUVfTUFYOyBpKyspIHsKKwkJbGF0ZXN0X3RzID0gYXRvbWljX3JlYWQoJnJvdC0+dGltZXN0YW1wW2ldKTsKKwkJbGF0ZXN0X3RzICY9IFNERV9SRUdETUFfU1dUU19NQVNLOworCQllbGFwc2VkX3RpbWUgPSBzZGVfaHdfcm90YXRvcl9lbGFwc2VkX3N3dHMobGF0ZXN0X3RzLAorCQkJbGFzdF90c1tpXSk7CisKKwkJZm9yIChqID0gMDsgaiA8IFNERV9IV19ST1RfUkVHRE1BX1RPVEFMX0NUWDsgaisrKSB7CisJCQlyY3R4ID0gcm90LT5yb3RDdHhbaV1bal07CisJCQlpZiAocmN0eCAmJiByY3R4ICE9IGN0eCkgeworCQkJCXJjdHgtPmxhc3RfcmVnZG1hX2lzcl9zdGF0dXMgPSBpbnRfbWFzazsKKwkJCQlyY3R4LT5sYXN0X3JlZ2RtYV90aW1lc3RhbXAgID0gcmN0eC0+dGltZXN0YW1wOworCisJCQkJdCA9IHNkZV9od19yb3RhdG9yX2VsYXBzZWRfc3d0cyhsYXRlc3RfdHMsCisJCQkJCQkJcmN0eC0+dGltZXN0YW1wKTsKKwkJCQlpZiAodCA8IGVsYXBzZWRfdGltZSkgeworCQkJCQllbGFwc2VkX3RpbWUgPSB0OworCQkJCQlsYXN0X3RzW2ldID0gcmN0eC0+dGltZXN0YW1wOworCQkJCQlzZGVfaHdfcm90YXRvcl91cGRhdGVfc3d0cyhyb3QsIHJjdHgsCisJCQkJCQkJbGFzdF90c1tpXSk7CisJCQkJfQorCisJCQkJU0RFUk9UX0RCRygicm90Y3R4WyVkXVslZF0sIHRzOiVkXG4iLAorCQkJCQkJaSwgaiwgcmN0eC0+dGltZXN0YW1wKTsKKwkJCQlTREVST1RfRVZUTE9HKGksIGosIHJjdHgtPnRpbWVzdGFtcCwKKwkJCQkJCWxhc3RfdHNbaV0pOworCQkJfQorCQl9CisJfQorCisJLyogRmluYWxseSB3YWtldXAgYWxsIHBlbmRpbmcgcm90YXRvciBjb250ZXh0IGluIHF1ZXVlICovCisJZm9yIChpID0gMDsgaSA8IFJPVF9RVUVVRV9NQVg7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYOyBqKyspIHsKKwkJCXJjdHggPSByb3QtPnJvdEN0eFtpXVtqXTsKKwkJCWlmIChyY3R4ICYmIHJjdHggIT0gY3R4KQorCQkJCXdha2VfdXBfYWxsKCZyY3R4LT5yZWdkbWFfd2FpdHEpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm90LT5yb3Rpc3JfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogc2RlX2h3X3JvdGF0b3JfZHVtcF9zdGF0dXMgLSBEdW1wIGh3IHJvdGF0b3Igc3RhdHVzIG9uIGVycm9yCiAgKiBAcm90OiBQb2ludGVyIHRvIGh3IHJvdGF0b3IKICAqLwotc3RhdGljIHZvaWQgc2RlX2h3X3JvdGF0b3JfZHVtcF9zdGF0dXMoc3RydWN0IHNkZV9od19yb3RhdG9yICpyb3QpCitzdGF0aWMgdm9pZCBzZGVfaHdfcm90YXRvcl9kdW1wX3N0YXR1cyhzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3IgKnJvdCwgdTMyICp1YndjZXJyKQogewogCXN0cnVjdCBzZGVfcm90X2RhdGFfdHlwZSAqbWRhdGEgPSBzZGVfcm90X2dldF9tZGF0YSgpOworCXUzMiByZWcgPSAwOwogCiAJU0RFUk9UX0VSUigKIAkJIm9wX21vZGUgPSAleCwgaW50X2VuID0gJXgsIGludF9zdGF0dXMgPSAleFxuIiwKQEAgLTY4MSw5ICs3ODgsMTEgQEAKIAkJU0RFX1JPVFJFR19SRUFEKHJvdC0+bWRzc19iYXNlLAogCQkJUkVHRE1BX0NTUl9SRUdETUFfRlNNX1NUQVRFKSk7CiAKKwlyZWcgPSBTREVfUk9UUkVHX1JFQUQocm90LT5tZHNzX2Jhc2UsIFJPVF9TU1BQX1VCV0NfRVJST1JfU1RBVFVTKTsKKwlpZiAodWJ3Y2VycikKKwkJKnVid2NlcnIgPSByZWc7CiAJU0RFUk9UX0VSUigKLQkJIlVCV0MgZGVjb2RlIHN0YXR1cyA9ICV4LCBVQldDIGVuY29kZSBzdGF0dXMgPSAleFxuIiwKLQkJU0RFX1JPVFJFR19SRUFEKHJvdC0+bWRzc19iYXNlLCBST1RfU1NQUF9VQldDX0VSUk9SX1NUQVRVUyksCisJCSJVQldDIGRlY29kZSBzdGF0dXMgPSAleCwgVUJXQyBlbmNvZGUgc3RhdHVzID0gJXhcbiIsIHJlZywKIAkJU0RFX1JPVFJFR19SRUFEKHJvdC0+bWRzc19iYXNlLCBST1RfV0JfVUJXQ19FUlJPUl9TVEFUVVMpKTsKIAogCVNERVJPVF9FUlIoIlZCSUYgWElOIEhBTFQgc3RhdHVzID0gJXggVkJJRiBBWEkgSEFMVCBzdGF0dXMgPSAleFxuIiwKQEAgLTg1MSw3ICs5NjAsNyBAQAogc3RhdGljIHZvaWQgc2RlX2h3X3JvdGF0b3Jfc2V0dXBfdGltZXN0YW1wX3BhY2tldCgKIAkJc3RydWN0IHNkZV9od19yb3RhdG9yX2NvbnRleHQgKmN0eCwgdTMyIG1hc2ssIHUzMiBzd3RzKQogewotCXUzMiAqd3JwdHI7CisJY2hhciBfX2lvbWVtICp3cnB0cjsKIAogCXdycHRyID0gc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50KGN0eCk7CiAKQEAgLTkwOCw3ICsxMDE3LDcgQEAKIAkJc3RydWN0IHNkZV9yb3RfY2RwX3BhcmFtcyAqcGFyYW1zKQogewogCWludCByZWdfdmFsOwotCXUzMiAqd3JwdHIgPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnQoY3R4KTsKKwljaGFyIF9faW9tZW0gKndycHRyID0gc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50KGN0eCk7CiAKIAlpZiAoIXBhcmFtcy0+ZW5hYmxlKSB7CiAJCVNERV9SRUdETUFfV1JJVEUod3JwdHIsIHBhcmFtcy0+b2Zmc2V0LCAweDApOwpAQCAtOTQyLDcgKzEwNTEsNyBAQAogc3RhdGljIHZvaWQgc2RlX2h3X3JvdGF0b3Jfc2V0dXBfcW9zX2x1dF93cihzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3JfY29udGV4dCAqY3R4KQogewogCXN0cnVjdCBzZGVfcm90X2RhdGFfdHlwZSAqbWRhdGEgPSBzZGVfcm90X2dldF9tZGF0YSgpOwotCXUzMiAqd3JwdHIgPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnQoY3R4KTsKKwljaGFyIF9faW9tZW0gKndycHRyID0gc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50KGN0eCk7CiAKIAkvKiBPZmZsaW5lIHJvdGF0aW9uIHNldHRpbmcgKi8KIAlpZiAoIWN0eC0+c2J1Zl9tb2RlKSB7CkBAIC0xMDAwLDcgKzExMDksNyBAQAogc3RhdGljIHZvaWQgc2RlX2h3X3JvdGF0b3Jfc2V0dXBfcW9zX2x1dF9yZChzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3JfY29udGV4dCAqY3R4KQogewogCXN0cnVjdCBzZGVfcm90X2RhdGFfdHlwZSAqbWRhdGEgPSBzZGVfcm90X2dldF9tZGF0YSgpOwotCXUzMiAqd3JwdHIgPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnQoY3R4KTsKKwljaGFyIF9faW9tZW0gKndycHRyID0gc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50KGN0eCk7CiAKIAkvKiBPZmZsaW5lIHJvdGF0aW9uIHNldHRpbmcgKi8KIAlpZiAoIWN0eC0+c2J1Zl9tb2RlKSB7CkBAIC0xMDcwLDcgKzExNzksNyBAQAogCXN0cnVjdCBzZGVfbWRwX2RhdGEgKmRhdGE7CiAJc3RydWN0IHNkZV9yb3RfY2RwX3BhcmFtcyBjZHBfcGFyYW1zID0gezB9OwogCXN0cnVjdCBzZGVfcm90X2RhdGFfdHlwZSAqbWRhdGEgPSBzZGVfcm90X2dldF9tZGF0YSgpOwotCXUzMiAqd3JwdHI7CisJY2hhciBfX2lvbWVtICp3cnB0cjsKIAl1MzIgb3Btb2RlID0gMDsKIAl1MzIgY2hyb21hX3NhbXAgPSAwOwogCXUzMiBzcmNfZm9ybWF0ID0gMDsKQEAgLTEwODEsOCArMTE5MCwxMCBAQAogCWludCBpOwogCiAJaWYgKGN0eC0+cm90LT5tb2RlID09IFJPVF9SRUdETUFfT04pIHsKLQkJU0RFX1JPVFJFR19XUklURShyb3QtPm1kc3NfYmFzZSwgUkVHRE1BX0NTUl9SRUdETUFfSU5UX0VOLAotCQkJCVJFR0RNQV9JTlRfTUFTSyk7CisJCWlmIChyb3QtPmlycV9udW0gPj0gMCkKKwkJCVNERV9ST1RSRUdfV1JJVEUocm90LT5tZHNzX2Jhc2UsCisJCQkJCVJFR0RNQV9DU1JfUkVHRE1BX0lOVF9FTiwKKwkJCQkJUkVHRE1BX0lOVF9NQVNLKTsKIAkJU0RFX1JPVFJFR19XUklURShyb3QtPm1kc3NfYmFzZSwgUkVHRE1BX0NTUl9SRUdETUFfT1BfTU9ERSwKIAkJCQlSRUdETUFfRU4pOwogCX0KQEAgLTEyODksNyArMTQwMCw3IEBACiAJc3RydWN0IHNkZV9yb3RfZGF0YV90eXBlICptZGF0YSA9IHNkZV9yb3RfZ2V0X21kYXRhKCk7CiAJc3RydWN0IHNkZV9tZHBfZm9ybWF0X3BhcmFtcyAqZm10OwogCXN0cnVjdCBzZGVfcm90X2NkcF9wYXJhbXMgY2RwX3BhcmFtcyA9IHswfTsKLQl1MzIgKndycHRyOworCWNoYXIgX19pb21lbSAqd3JwdHI7CiAJdTMyIHBhY2sgPSAwOwogCXUzMiBkc3RfZm9ybWF0ID0gMDsKIAl1MzIgbm9fcGFydGlhbF93cml0ZXMgPSAwOwpAQCAtMTQzNSw4ICsxNTQ2LDcgQEAKIAl3cnB0ciA9IHNkZV9od19yb3RhdG9yX2dldF9yZWdkbWFfc2VnbWVudChjdHgpOwogCiAJLyogc2V0dXAgdHJhZmZpYyBzaGFwZXIgZm9yIDRrIDMwZnBzIGNvbnRlbnQgb3IgaWYgcHJlZmlsbF9idyBpcyBzZXQgKi8KLQlpZiAoIWN0eC0+c2J1Zl9tb2RlICYmCi0JCQkoY3R4LT5pc190cmFmZmljX3NoYXBpbmcgfHwgY2ZnLT5wcmVmaWxsX2J3KSkgeworCWlmIChjdHgtPmlzX3RyYWZmaWNfc2hhcGluZyB8fCBjZmctPnByZWZpbGxfYncpIHsKIAkJdTMyIGJ3OwogCiAJCS8qCkBAIC0xNDg3LDEzICsxNTk3LDE4IEBACiAJCWVudW0gc2RlX3JvdF9xdWV1ZV9wcmlvIHF1ZXVlX2lkKQogewogCXN0cnVjdCBzZGVfaHdfcm90YXRvciAqcm90ID0gY3R4LT5yb3Q7Ci0JdTMyICp3cnB0cjsKLQl1MzIgKnJkcHRyOwotCXU4ICphZGRyOworCWNoYXIgX19pb21lbSAqd3JwdHI7CisJY2hhciBfX2lvbWVtICptZW1fcmRwdHI7CisJY2hhciBfX2lvbWVtICphZGRyOwogCXUzMiBtYXNrOworCXUzMiBjbWQwLCBjbWQxLCBjbWQyOwogCXUzMiBibGtzaXplOwogCi0JcmRwdHIgPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnRfYmFzZShjdHgpOworCS8qCisJICogd2hlbiByZWdkbWEgaXMgbm90IHVzaW5nLCB0aGUgcmVnZG1hIHNlZ21lbnQgaXMganVzdCBhIG5vcm1hbAorCSAqIERSQU0sIGFuZCBub3QgYW4gaW9tZW0uCisJICovCisJbWVtX3JkcHRyID0gc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50X2Jhc2UoY3R4KTsKIAl3cnB0ciA9IHNkZV9od19yb3RhdG9yX2dldF9yZWdkbWFfc2VnbWVudChjdHgpOwogCiAJaWYgKHJvdC0+aXJxX251bSA+PSAwKSB7CkBAIC0xNTExLDU0ICsxNjI2LDY1IEBACiAJU0RFUk9UX0RCRygiQkVHSU4gJWRcbiIsIGN0eC0+dGltZXN0YW1wKTsKIAkvKiBXcml0ZSBhbGwgY29tbWFuZCBzdHJlYW0gdG8gUm90YXRvciBibG9ja3MgKi8KIAkvKiBSb3RhdG9yIHdpbGwgc3RhcnQgcmlnaHQgYXdheSBhZnRlciBjb21tYW5kIHN0cmVhbSBmaW5pc2ggd3JpdGluZyAqLwotCXdoaWxlIChyZHB0ciA8IHdycHRyKSB7Ci0JCXUzMiBvcCA9IFJFR0RNQV9PUF9NQVNLICYgKnJkcHRyOworCXdoaWxlIChtZW1fcmRwdHIgPCB3cnB0cikgeworCQl1MzIgb3AgPSBSRUdETUFfT1BfTUFTSyAmIHJlYWRsX3JlbGF4ZWRfbm9fbG9nKG1lbV9yZHB0cik7CiAKIAkJc3dpdGNoIChvcCkgewogCQljYXNlIFJFR0RNQV9PUF9OT1A6CiAJCQlTREVST1RfREJHKCJOT1BcbiIpOwotCQkJcmRwdHIrKzsKKwkJCW1lbV9yZHB0ciArPSBzaXplb2YodTMyKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFR0RNQV9PUF9SRUdXUklURToKKwkJCVNERV9SRUdETUFfUkVBRChtZW1fcmRwdHIsIGNtZDApOworCQkJU0RFX1JFR0RNQV9SRUFEKG1lbV9yZHB0ciwgY21kMSk7CiAJCQlTREVST1RfREJHKCJSRUdXICU2LjZ4ICU4Ljh4XG4iLAotCQkJCQlyZHB0clswXSAmIFJFR0RNQV9BRERSX09GRlNFVF9NQVNLLAotCQkJCQlyZHB0clsxXSk7CisJCQkJCWNtZDAgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSywKKwkJCQkJY21kMSk7CiAJCQlhZGRyID0gIHJvdC0+bWRzc19iYXNlICsKLQkJCQkoKnJkcHRyKysgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7Ci0JCQl3cml0ZWxfcmVsYXhlZCgqcmRwdHIrKywgYWRkcik7CisJCQkJKGNtZDAgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7CisJCQl3cml0ZWxfcmVsYXhlZChjbWQxLCBhZGRyKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFR0RNQV9PUF9SRUdNT0RJRlk6CisJCQlTREVfUkVHRE1BX1JFQUQobWVtX3JkcHRyLCBjbWQwKTsKKwkJCVNERV9SRUdETUFfUkVBRChtZW1fcmRwdHIsIGNtZDEpOworCQkJU0RFX1JFR0RNQV9SRUFEKG1lbV9yZHB0ciwgY21kMik7CiAJCQlTREVST1RfREJHKCJSRUdNICU2LjZ4ICU4Ljh4ICU4Ljh4XG4iLAotCQkJCQlyZHB0clswXSAmIFJFR0RNQV9BRERSX09GRlNFVF9NQVNLLAotCQkJCQlyZHB0clsxXSwgcmRwdHJbMl0pOworCQkJCQljbWQwICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0ssCisJCQkJCWNtZDEsIGNtZDIpOwogCQkJYWRkciA9ICByb3QtPm1kc3NfYmFzZSArCi0JCQkJKCpyZHB0cisrICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spOwotCQkJbWFzayA9ICpyZHB0cisrOwotCQkJd3JpdGVsX3JlbGF4ZWQoKHJlYWRsX3JlbGF4ZWQoYWRkcikgJiBtYXNrKSB8ICpyZHB0cisrLAorCQkJCShjbWQwICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spOworCQkJbWFzayA9IGNtZDE7CisJCQl3cml0ZWxfcmVsYXhlZCgocmVhZGxfcmVsYXhlZChhZGRyKSAmIG1hc2spIHwgY21kMiwKIAkJCQkJYWRkcik7CiAJCQlicmVhazsKIAkJY2FzZSBSRUdETUFfT1BfQkxLV1JJVEVfU0lOR0xFOgorCQkJU0RFX1JFR0RNQV9SRUFEKG1lbV9yZHB0ciwgY21kMCk7CisJCQlTREVfUkVHRE1BX1JFQUQobWVtX3JkcHRyLCBjbWQxKTsKIAkJCVNERVJPVF9EQkcoIkJMS1dTICU2LjZ4ICU2LjZ4XG4iLAotCQkJCQlyZHB0clswXSAmIFJFR0RNQV9BRERSX09GRlNFVF9NQVNLLAotCQkJCQlyZHB0clsxXSk7CisJCQkJCWNtZDAgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSywKKwkJCQkJY21kMSk7CiAJCQlhZGRyID0gIHJvdC0+bWRzc19iYXNlICsKLQkJCQkoKnJkcHRyKysgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7Ci0JCQlibGtzaXplID0gKnJkcHRyKys7CisJCQkJKGNtZDAgJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSyk7CisJCQlibGtzaXplID0gY21kMTsKIAkJCXdoaWxlIChibGtzaXplLS0pIHsKLQkJCQlTREVST1RfREJHKCJEQVRBICU4Ljh4XG4iLCByZHB0clswXSk7Ci0JCQkJd3JpdGVsX3JlbGF4ZWQoKnJkcHRyKyssIGFkZHIpOworCQkJCVNERV9SRUdETUFfUkVBRChtZW1fcmRwdHIsIGNtZDApOworCQkJCVNERVJPVF9EQkcoIkRBVEEgJTguOHhcbiIsIGNtZDApOworCQkJCXdyaXRlbF9yZWxheGVkKGNtZDAsIGFkZHIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUkVHRE1BX09QX0JMS1dSSVRFX0lOQzoKKwkJCVNERV9SRUdETUFfUkVBRChtZW1fcmRwdHIsIGNtZDApOworCQkJU0RFX1JFR0RNQV9SRUFEKG1lbV9yZHB0ciwgY21kMSk7CiAJCQlTREVST1RfREJHKCJCTEtXSSAlNi42eCAlNi42eFxuIiwKLQkJCQkJcmRwdHJbMF0gJiBSRUdETUFfQUREUl9PRkZTRVRfTUFTSywKLQkJCQkJcmRwdHJbMV0pOworCQkJCQljbWQwICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0ssCisJCQkJCWNtZDEpOwogCQkJYWRkciA9ICByb3QtPm1kc3NfYmFzZSArCi0JCQkJKCpyZHB0cisrICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spOwotCQkJYmxrc2l6ZSA9ICpyZHB0cisrOworCQkJCShjbWQwICYgUkVHRE1BX0FERFJfT0ZGU0VUX01BU0spOworCQkJYmxrc2l6ZSA9IGNtZDE7CiAJCQl3aGlsZSAoYmxrc2l6ZS0tKSB7Ci0JCQkJU0RFUk9UX0RCRygiREFUQSAlOC44eFxuIiwgcmRwdHJbMF0pOwotCQkJCXdyaXRlbF9yZWxheGVkKCpyZHB0cisrLCBhZGRyKTsKKwkJCQlTREVfUkVHRE1BX1JFQUQobWVtX3JkcHRyLCBjbWQwKTsKKwkJCQlTREVST1RfREJHKCJEQVRBICU4Ljh4XG4iLCBjbWQwKTsKKwkJCQl3cml0ZWxfcmVsYXhlZChjbWQwLCBhZGRyKTsKIAkJCQlhZGRyICs9IDQ7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE1NjcsNyArMTY5Myw3IEBACiAJCQkgKiBTa2lwIGRhdGEgZm9yIG5vdyBmb3IgdW5yZWdvbml6ZWQgT1AgbW9kZQogCQkJICovCiAJCQlTREVST1RfREJHKCJVTkRFRklORURcbiIpOwotCQkJcmRwdHIrKzsKKwkJCW1lbV9yZHB0ciArPSBzaXplb2YodTMyKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTU4NSwxMSArMTcxMSwxMSBAQAogCQllbnVtIHNkZV9yb3RfcXVldWVfcHJpbyBxdWV1ZV9pZCkKIHsKIAlzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3IgKnJvdCA9IGN0eC0+cm90OwotCXUzMiAqd3JwdHI7CisJY2hhciBfX2lvbWVtICp3cnB0cjsKIAl1MzIgIHJlZ2RtYVNsb3Q7CiAJdTMyICBvZmZzZXQ7Ci0JbG9uZyBsZW5ndGg7Ci0JbG9uZyB0c19sZW5ndGg7CisJdTMyICBsZW5ndGg7CisJdTMyICB0c19sZW5ndGg7CiAJdTMyICBlbmFibGVJbnQ7CiAJdTMyICBzd3RzID0gMDsKIAl1MzIgIG1hc2sgPSAwOwpAQCAtMTYwOCwxNSArMTczNCwxNSBAQAogCSAqIFN0YXJ0IFJFR0RNQSB3aXRoIGNvbW1hbmQgb2Zmc2V0IGFuZCBzaXplCiAJICovCiAJcmVnZG1hU2xvdCA9IHNkZV9od19yb3RhdG9yX2dldF9yZWdkbWFfY3R4aWR4KGN0eCk7Ci0JbGVuZ3RoID0gKChsb25nKXdycHRyIC0gKGxvbmcpY3R4LT5yZWdkbWFfYmFzZSkgLyA0OwotCW9mZnNldCA9ICh1MzIpKGN0eC0+cmVnZG1hX2Jhc2UgLSAodTMyICopKHJvdC0+bWRzc19iYXNlICsKLQkJCQlSRUdETUFfUkFNX1JFR0RNQV9DTURfUkFNKSk7CisJbGVuZ3RoID0gKHdycHRyIC0gY3R4LT5yZWdkbWFfYmFzZSkgLyA0OworCW9mZnNldCA9IChjdHgtPnJlZ2RtYV9iYXNlIC0gKHJvdC0+bWRzc19iYXNlICsKKwkJCQlSRUdETUFfUkFNX1JFR0RNQV9DTURfUkFNKSkgLyBzaXplb2YodTMyKTsKIAllbmFibGVJbnQgPSAoKGN0eC0+dGltZXN0YW1wICYgMSkgKyAxKSA8PCAzMDsKIAl0cmlnX3NlbCA9IGN0eC0+c2J1Zl9tb2RlID8gUkVHRE1BX0NNRF9UUklHX1NFTF9NRFBfRkxVU0ggOgogCQkJUkVHRE1BX0NNRF9UUklHX1NFTF9TV19TVEFSVDsKIAogCVNERVJPVF9EQkcoCi0JCSJyZWdkbWEoJWQpWyVkXSA8PT0gSU5UOjB4JVh8bGVuZ3RoOiVsZHxvZmZzZXQ6MHglWCwgdHM6JVhcbiIsCisJCSJyZWdkbWEoJWQpWyVkXSA8PT0gSU5UOjB4JVh8bGVuZ3RoOiVkfG9mZnNldDoweCVYLCB0czolWFxuIiwKIAkJcXVldWVfaWQsIHJlZ2RtYVNsb3QsIGVuYWJsZUludCwgbGVuZ3RoLCBvZmZzZXQsCiAJCWN0eC0+dGltZXN0YW1wKTsKIApAQCAtMTY0Niw2ICsxNzcyLDcgQEAKIAkJc2RlX2h3X3JvdGF0b3Jfc2V0dXBfdGltZXN0YW1wX3BhY2tldChjdHgsIG1hc2ssIHN3dHMpOwogCQlvZmZzZXQgKz0gbGVuZ3RoOwogCQl0c19sZW5ndGggPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnQoY3R4KSAtIHdycHRyOworCQl0c19sZW5ndGggLz0gc2l6ZW9mKHUzMik7CiAJCVdBUk5fT04oKGxlbmd0aCArIHRzX2xlbmd0aCkgPiBTREVfSFdfUk9UX1JFR0RNQV9TRUdfU0laRSk7CiAKIAkJLyogZW5zdXJlIGNvbW1hbmQgcGFja2V0IGlzIGlzc3VlIGJlZm9yZSB0aGUgc3VibWl0IGNvbW1hbmQgKi8KQEAgLTE3NTEsNiArMTg3OCw3IEBACiAJdTMyIGludF9pZDsKIAl1MzIgc3d0czsKIAl1MzIgc3RzID0gMDsKKwl1MzIgdWJ3Y2VyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChyb3QtPmlycV9udW0gPj0gMCkgewpAQCAtMTc4Nyw4ICsxOTE1LDI2IEBACiAJCQllbHNlIGlmIChzdGF0dXMgJiBSRUdETUFfSU5WQUxJRF9DTUQpCiAJCQkJU0RFUk9UX0VSUigiUkVHRE1BIGludmFsaWQgY29tbWFuZFxuIik7CiAKLQkJCXNkZV9od19yb3RhdG9yX2R1bXBfc3RhdHVzKHJvdCk7Ci0JCQlzdGF0dXMgPSBST1RfRVJST1JfQklUOworCQkJc2RlX2h3X3JvdGF0b3JfZHVtcF9zdGF0dXMocm90LCAmdWJ3Y2Vycik7CisKKwkJCWlmICh1YndjZXJyKSB7CisJCQkJLyoKKwkJCQkgKiBQZXJmb3JtIHJlY292ZXJ5IGZvciBST1QgU1NQUCBVQldDIGRlY29kZQorCQkJCSAqIGVycm9yLgorCQkJCSAqIC0gU1cgcmVzZXQgcm90YXRvciBodyBibG9jaworCQkJCSAqIC0gcmVzZXQgVFMgbG9naWMgc28gYWxsIHBlbmRpbmcgcm90YXRpb24KKwkJCQkgKiAgIGluIGh3IHF1ZXVlIGdvdCBkb25lIHNpZ25hbGxlZAorCQkJCSAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJvdC0+cm90aXNyX2xvY2ssCisJCQkJCQlmbGFncyk7CisJCQkJaWYgKCFzZGVfaHdfcm90YXRvcl9yZXNldChyb3QsIGN0eCkpCisJCQkJCXN0YXR1cyA9IFJFR0RNQV9JTkNPTVBMRVRFX0NNRDsKKwkJCQllbHNlCisJCQkJCXN0YXR1cyA9IFJPVF9FUlJPUl9CSVQ7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJvdC0+cm90aXNyX2xvY2ssIGZsYWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gUk9UX0VSUk9SX0JJVDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChyYyA9PSAxKQogCQkJCVNERVJPVF9XQVJOKApAQCAtMTgxNCwxMiArMTk2MCwxMiBAQAogCQlpZiAobGFzdF9pc3IgJiBSRUdETUFfSU5UX0VSUl9NQVNLKSB7CiAJCQlTREVST1RfRVJSKCJSb3RhdG9yIGVycm9yLCB0czoweCVYLzB4JVggc3RhdHVzOiV4XG4iLAogCQkJCWN0eC0+dGltZXN0YW1wLCBzd3RzLCBsYXN0X2lzcik7Ci0JCQlzZGVfaHdfcm90YXRvcl9kdW1wX3N0YXR1cyhyb3QpOworCQkJc2RlX2h3X3JvdGF0b3JfZHVtcF9zdGF0dXMocm90LCBOVUxMKTsKIAkJCXN0YXR1cyA9IFJPVF9FUlJPUl9CSVQ7CiAJCX0gZWxzZSBpZiAocGVuZGluZykgewogCQkJU0RFUk9UX0VSUigiUm90YXRvciB0aW1lb3V0LCB0czoweCVYLzB4JVggc3RhdHVzOiV4XG4iLAogCQkJCWN0eC0+dGltZXN0YW1wLCBzd3RzLCBsYXN0X2lzcik7Ci0JCQlzZGVfaHdfcm90YXRvcl9kdW1wX3N0YXR1cyhyb3QpOworCQkJc2RlX2h3X3JvdGF0b3JfZHVtcF9zdGF0dXMocm90LCBOVUxMKTsKIAkJCXN0YXR1cyA9IFJPVF9FUlJPUl9CSVQ7CiAJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSAwOwpAQCAtMTgyOSw3ICsxOTc1LDcgQEAKIAkJCQlsYXN0X2lzcik7CiAJfQogCi0Jc3RzID0gKHN0YXR1cyAmIFJPVF9FUlJPUl9CSVQpID8gLUVOT0RFViA6IDA7CisJc3RzID0gKHN0YXR1cyAmIChST1RfRVJST1JfQklUIHwgUkVHRE1BX0lOQ09NUExFVEVfQ01EKSkgPyAtRU5PREVWIDogMDsKIAogCWlmIChzdGF0dXMgJiBST1RfRVJST1JfQklUKQogCQlTREVST1RfRVZUTE9HX1RPVVRfSEFORExFUigicm90IiwgInJvdF9kYmdfYnVzIiwKQEAgLTIzMjIsNyArMjQ2OCw3IEBACiAJCQkJaWYgKHN0YXR1cyAmIEJJVCgwKSkgewogCQkJCQlTREVST1RfRVJSKCJyb3RhdG9yIGJ1c3kgMHgleFxuIiwKIAkJCQkJCQlzdGF0dXMpOwotCQkJCQlzZGVfaHdfcm90YXRvcl9kdW1wX3N0YXR1cyhyb3QpOworCQkJCQlzZGVfaHdfcm90YXRvcl9kdW1wX3N0YXR1cyhyb3QsIE5VTEwpOwogCQkJCQlTREVST1RfRVZUTE9HX1RPVVRfSEFORExFUigicm90IiwKIAkJCQkJCQkidmJpZl9kYmdfYnVzIiwKIAkJCQkJCQkicGFuaWMiKTsKQEAgLTI2OTgsNyArMjg0NCw5IEBACiAJU0RFX1JPVFJFR19XUklURShyb3QtPm1kc3NfYmFzZSwgUkVHRE1BX1RJTUVTVEFNUF9SRUcsIDApOwogCiAJLyogZmVhdHVyZXMgZXhwb3NlZCB2aWEgbWRzcyBoL3cgdmVyc2lvbiAqLwotCWlmIChJU19TREVfTUFKT1JfTUlOT1JfU0FNRShtZGF0YS0+bWRzc192ZXJzaW9uLCBTREVfTURQX0hXX1JFVl80MDApKSB7CisJaWYgKElTX1NERV9NQUpPUl9NSU5PUl9TQU1FKG1kYXRhLT5tZHNzX3ZlcnNpb24sIFNERV9NRFBfSFdfUkVWXzQwMCkgfHwKKwkJSVNfU0RFX01BSk9SX01JTk9SX1NBTUUobWRhdGEtPm1kc3NfdmVyc2lvbiwKKwkJCVNERV9NRFBfSFdfUkVWXzQxMCkpIHsKIAkJU0RFUk9UX0RCRygiU3VwcG9ydGluZyBzeXMgY2FjaGUgaW5saW5lIHJvdGF0aW9uXG4iKTsKIAkJc2V0X2JpdChTREVfQ0FQU19TQlVGXzEsICBtZGF0YS0+c2RlX2NhcHNfbWFwKTsKIAkJc2V0X2JpdChTREVfQ0FQU19VQldDXzIsICBtZGF0YS0+c2RlX2NhcHNfbWFwKTsKQEAgLTM0MzIsMjEgKzM1ODAsMjIgQEAKIAkvKiBSRUdETUEgaW5pdGlhbGl6YXRpb24gKi8KIAlpZiAocm90LT5tb2RlID09IFJPVF9SRUdETUFfT0ZGKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBTREVfSFdfUk9UX1JFR0RNQV9UT1RBTF9DVFg7IGkrKykKLQkJCXJvdC0+Y21kX3dyX3B0clswXVtpXSA9ICZyb3QtPmNtZF9xdWV1ZVsKLQkJCQlTREVfSFdfUk9UX1JFR0RNQV9TRUdfU0laRSAqIGldOworCQkJcm90LT5jbWRfd3JfcHRyWzBdW2ldID0gKGNoYXIgX19pb21lbSAqKSgKKwkJCQkJJnJvdC0+Y21kX3F1ZXVlWworCQkJCQlTREVfSFdfUk9UX1JFR0RNQV9TRUdfU0laRSAqIGldKTsKIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYOyBpKyspCiAJCQlyb3QtPmNtZF93cl9wdHJbUk9UX1FVRVVFX0hJR0hfUFJJT1JJVFldW2ldID0KLQkJCQkodTMyICopKHJvdC0+bWRzc19iYXNlICsKKwkJCQlyb3QtPm1kc3NfYmFzZSArCiAJCQkJCVJFR0RNQV9SQU1fUkVHRE1BX0NNRF9SQU0gKwotCQkJCQlTREVfSFdfUk9UX1JFR0RNQV9TRUdfU0laRSAqIDQgKiBpKTsKKwkJCQkJU0RFX0hXX1JPVF9SRUdETUFfU0VHX1NJWkUgKiA0ICogaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYOyBpKyspCiAJCQlyb3QtPmNtZF93cl9wdHJbUk9UX1FVRVVFX0xPV19QUklPUklUWV1baV0gPQotCQkJCSh1MzIgKikocm90LT5tZHNzX2Jhc2UgKworCQkJCXJvdC0+bWRzc19iYXNlICsKIAkJCQkJUkVHRE1BX1JBTV9SRUdETUFfQ01EX1JBTSArCiAJCQkJCVNERV9IV19ST1RfUkVHRE1BX1NFR19TSVpFICogNCAqCi0JCQkJCShpICsgU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYKSk7CisJCQkJCShpICsgU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYKTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgUk9UX1FVRVVFX01BWDsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9yM19pbnRlcm5hbC5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfcjNfaW50ZXJuYWwuaAppbmRleCA0YzEzMTZjLi44YjM5MWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9yM19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX3IzX2ludGVybmFsLmgKQEAgLTIxOCw4ICsyMTgsOCBAQAogCWVudW0gICBzZGVfcm90X3F1ZXVlX3ByaW8gcV9pZDsKIAl1MzIgICAgc2Vzc2lvbl9pZDsKIAl1MzIgICAgc2VxdWVuY2VfaWQ7Ci0JdTMyICAgICpyZWdkbWFfYmFzZTsKLQl1MzIgICAgKnJlZ2RtYV93cnB0cjsKKwljaGFyIF9faW9tZW0gKnJlZ2RtYV9iYXNlOworCWNoYXIgX19pb21lbSAqcmVnZG1hX3dycHRyOwogCXUzMiAgICB0aW1lc3RhbXA7CiAJc3RydWN0IGNvbXBsZXRpb24gcm90X2NvbXA7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVnZG1hX3dhaXRxOwpAQCAtMjgwLDcgKzI4MCw3IEBACiAJdTMyICAgIGNtZF9xdWV1ZVtTREVfSFdfUk9UX1JFR0RNQV9SQU1fU0laRV07CiAKIAkvKiBDbWQgUXVldWUgV3JpdGUgUHRyICovCi0JdTMyICAgKmNtZF93cl9wdHJbUk9UX1FVRVVFX01BWF1bU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYXTsKKwljaGFyIF9faW9tZW0gKmNtZF93cl9wdHJbUk9UX1FVRVVFX01BWF1bU0RFX0hXX1JPVF9SRUdETUFfVE9UQUxfQ1RYXTsKIAogCS8qIFJvdGF0b3IgQ29udGV4dCAqLwogCXN0cnVjdCBzZGVfaHdfcm90YXRvcl9jb250ZXh0CkBAIC0zNDksNyArMzQ5LDcgQEAKICAqIEBjdHg6IFJvdGF0b3IgQ29udGV4dAogICogcmV0dXJuOiBiYXNlIHNlZ21lbnQgYWRkcmVzcwogICovCi1zdGF0aWMgaW5saW5lIHUzMiAqc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50X2Jhc2UoCitzdGF0aWMgaW5saW5lIGNoYXIgX19pb21lbSAqc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50X2Jhc2UoCiAJCXN0cnVjdCBzZGVfaHdfcm90YXRvcl9jb250ZXh0ICpjdHgpCiB7CiAJU0RFUk9UX0RCRygicmVnZG1hIGJhc2UgQHNsb3RbJWRdOiAlcFxuIiwKQEAgLTM2NSwxMSArMzY1LDExIEBACiAgKiBAY3R4OiBSb3RhdG9yIENvbnRleHQKICAqIHJldHVybjogc2VnbWVudCBhZGRyZXNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdTMyICpzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX3NlZ21lbnQoCitzdGF0aWMgaW5saW5lIGNoYXIgX19pb21lbSAqc2RlX2h3X3JvdGF0b3JfZ2V0X3JlZ2RtYV9zZWdtZW50KAogCQlzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3JfY29udGV4dCAqY3R4KQogewogCXUzMiBpZHggPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX2N0eGlkeChjdHgpOwotCXUzMiAqYWRkciA9IGN0eC0+cmVnZG1hX3dycHRyOworCWNoYXIgX19pb21lbSAqYWRkciA9IGN0eC0+cmVnZG1hX3dycHRyOwogCiAJU0RFUk9UX0RCRygicmVnZG1hIHNsb3RbJWRdID09PiAlcFxuIiwgaWR4LCBhZGRyKTsKIAlyZXR1cm4gYWRkcjsKQEAgLTM4Myw3ICszODMsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2RlX2h3X3JvdGF0b3JfcHV0X3JlZ2RtYV9zZWdtZW50KAogCQlzdHJ1Y3Qgc2RlX2h3X3JvdGF0b3JfY29udGV4dCAqY3R4LAotCQl1MzIgKndycHRyKQorCQljaGFyIF9faW9tZW0gKndycHRyKQogewogCXUzMiBpZHggPSBzZGVfaHdfcm90YXRvcl9nZXRfcmVnZG1hX2N0eGlkeChjdHgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9zbW11LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl9zbW11LmMKaW5kZXggOWU0NzE4Ny4uY2MxNDA3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3Jfc21tdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX3NtbXUuYwpAQCAtNTE3LDYgKzUxNyw3IEBACiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IHNkZV9tb2R1bGVfcG93ZXIgKm1wOwogCWNoYXIgbmFtZVtNQVhfQ0xJRU5UX05BTUVfTEVOXTsKKwl1MzIgc2lkID0gMDsKIAogCWlmICghbWRhdGEpIHsKIAkJU0RFUk9UX0lORk8oCkBAIC01MzgsNiArNTM5LDExIEBACiAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwgImlvbW11cyIsIE5VTEwpKSB7CiAJCWRldiA9ICZwZGV2LT5kZXY7CisJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgocGRldi0+ZGV2Lm9mX25vZGUsICJpb21tdXMiLAorCQkJMSwgJnNpZCk7CisJCWlmIChyYykKKwkJCVNERVJPVF9EQkcoIlNJRCBub3QgZGVmaW5lZCBmb3IgZG9tYWluOiVkIiwKKwkJCQkJc21tdV9kb21haW4uZG9tYWluKTsKIAl9IGVsc2UgewogCQlTREVST1RfRVJSKCJJbnZhbGlkIFNNTVUgY3R4IGZvciBkb21haW46JWRcbiIsCiAJCQkJc21tdV9kb21haW4uZG9tYWluKTsKQEAgLTU0Niw2ICs1NTIsNyBAQAogCiAJc2RlX3NtbXUgPSAmbWRhdGEtPnNkZV9zbW11W3NtbXVfZG9tYWluLmRvbWFpbl07CiAJc2RlX3NtbXUtPmRvbWFpbiA9IHNtbXVfZG9tYWluLmRvbWFpbjsKKwlzZGVfc21tdS0+c2lkID0gc2lkOwogCW1wID0gJnNkZV9zbW11LT5tcDsKIAltZW1zZXQobXAsIDAsIHNpemVvZihzdHJ1Y3Qgc2RlX21vZHVsZV9wb3dlcikpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl91dGlsLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS9zZGUvcm90YXRvci9zZGVfcm90YXRvcl91dGlsLmMKaW5kZXggOWVmNDI4Mi4uYWM0YWI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vc2RlL3JvdGF0b3Ivc2RlX3JvdGF0b3JfdXRpbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3NkZS9yb3RhdG9yL3NkZV9yb3RhdG9yX3V0aWwuYwpAQCAtMzUsNiArMzUsNyBAQAogCiAjaW5jbHVkZSAic2RlX3JvdGF0b3JfdXRpbC5oIgogI2luY2x1ZGUgInNkZV9yb3RhdG9yX3NtbXUuaCIKKyNpbmNsdWRlICJzZGVfcm90YXRvcl9kZWJ1Zy5oIgogCiAjZGVmaW5lIFlfVElMRVdJRFRIICAgICA0OAogI2RlZmluZSBZX1RJTEVIRUlHSFQgICAgNApAQCAtMTAzOCw2ICsxMDM5LDggQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCVNERVJPVF9FVlRMT0coZGF0YS0+bnVtX3BsYW5lcywgZGlyLCBkYXRhLT5wWzBdLmFkZHIsIGRhdGEtPnBbMF0ubGVuLAorCQkJZGF0YS0+cFswXS5tYXBwZWQpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9oZmlfcGFja2V0aXphdGlvbi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9oZmlfcGFja2V0aXphdGlvbi5jCmluZGV4IDg1ZGI2ZjAuLmNmMDQxM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvaGZpX3BhY2tldGl6YXRpb24uYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL2hmaV9wYWNrZXRpemF0aW9uLmMKQEAgLTU4LDYgKzU4LDggQEAKIAlbaWxvZzIoSEFMX0NPTE9SX0ZPUk1BVF9OVjEyX1VCV0MpXSA9ICBIRklfQ09MT1JfRk9STUFUX05WMTJfVUJXQywKIAlbaWxvZzIoSEFMX0NPTE9SX0ZPUk1BVF9OVjEyX1RQMTBfVUJXQyldID0KIAkJCUhGSV9DT0xPUl9GT1JNQVRfWVVWNDIwX1RQMTBfVUJXQywKKwkvKlAwMTAgMTBiaXQgZm9ybWF0Ki8KKwlbaWxvZzIoSEFMX0NPTE9SX0ZPUk1BVF9QMDEwKV0gPSAgSEZJX0NPTE9SX0ZPUk1BVF9QMDEwLAogfTsKIAogc3RhdGljIGludCBuYWxfdHlwZVtdID0gewpAQCAtNjY0LDYgKzY2NiwyNiBAQAogCXJldHVybiBsdHJtb2RlOwogfQogCitzdGF0aWMgdTMyIGdldF9oZmlfd29ya19tb2RlKGVudW0gaGFsX3dvcmtfbW9kZSB3b3JrX21vZGUpCit7CisJdTMyIGhmaV93b3JrX21vZGU7CisKKwlzd2l0Y2ggKHdvcmtfbW9kZSkgeworCWNhc2UgVklEQ19XT1JLX01PREVfMToKKwkJaGZpX3dvcmtfbW9kZSA9IEhGSV9XT1JLTU9ERV8xOworCQlicmVhazsKKwljYXNlIFZJRENfV09SS19NT0RFXzI6CisJCWhmaV93b3JrX21vZGUgPSBIRklfV09SS01PREVfMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZHByaW50ayhWSURDX0VSUiwgIkludmFsaWQgd29yayBtb2RlOiAlI3hcbiIsCisJCQl3b3JrX21vZGUpOworCQloZmlfd29ya19tb2RlID0gSEZJX1dPUktNT0RFXzI7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gaGZpX3dvcmtfbW9kZTsKK30KKwogaW50IGNyZWF0ZV9wa3RfY21kX3Nlc3Npb25fc2V0X2J1ZmZlcnMoCiAJCXN0cnVjdCBoZmlfY21kX3Nlc3Npb25fc2V0X2J1ZmZlcnNfcGFja2V0ICpwa3QsCiAJCXN0cnVjdCBoYWxfc2Vzc2lvbiAqc2Vzc2lvbiwKQEAgLTEzOTgsNiArMTQyMCw5IEBACiAJCWNhc2UgSEFMX0ZMSVBfVkVSVElDQUw6CiAJCQloZmktPmZsaXAgPSBIRklfRkxJUF9WRVJUSUNBTDsKIAkJCWJyZWFrOworCQljYXNlIEhBTF9GTElQX0JPVEg6CisJCQloZmktPmZsaXAgPSBIRklfRkxJUF9IT1JJWk9OVEFMIHwgSEZJX0ZMSVBfVkVSVElDQUw7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRwcmludGsoVklEQ19FUlIsICJJbnZhbGlkIGZsaXAgc2V0dGluZzogJSN4XG4iLAogCQkJCXByb3AtPmZsaXApOwpAQCAtMTg0NCw3ICsxODY5LDggQEAKIAkJCShzdHJ1Y3QgaGZpX3ZpZGVvX3dvcmtfbW9kZSAqKQogCQkJJnBrdC0+cmdfcHJvcGVydHlfZGF0YVsxXTsKIAotCQl3b3JrX21vZGUtPnZpZGVvX3dvcmtfbW9kZSA9IGhhbC0+dmlkZW9fd29ya19tb2RlOworCQl3b3JrX21vZGUtPnZpZGVvX3dvcmtfbW9kZSA9IGdldF9oZmlfd29ya19tb2RlKAorCQkJCQkJaGFsLT52aWRlb193b3JrX21vZGUpOwogCiAJCXBrdC0+cmdfcHJvcGVydHlfZGF0YVswXSA9CiAJCQlIRklfUFJPUEVSVFlfUEFSQU1fV09SS19NT0RFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fc21lbS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fc21lbS5jCmluZGV4IDliMjMzNzYuLjUxOThiYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3NtZW0uYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV9zbWVtLmMKQEAgLTgwLDYgKzgwLDggQEAKIAkJCWRwcmludGsoVklEQ19FUlIsCiAJCQkJIlNpemUgbWlzbWF0Y2ghIERtYWJ1ZiBzaXplOiAlenUgRXhwZWN0ZWQgU2l6ZTogJWx1IiwKIAkJCQlidWYtPnNpemUsICpidWZmZXJfc2l6ZSk7CisJCQltc21fdmlkY19yZXNfaGFuZGxlX2ZhdGFsX2h3X2Vycm9yKHNtZW1fY2xpZW50LT5yZXMsCisJCQkJCXRydWUpOwogCQkJZ290byBtZW1fYnVmX3NpemVfbWlzbWF0Y2g7CiAJCX0KIAkJLyogUHJlcGFyZSBhIGRtYSBidWYgZm9yIGRtYSBvbiB0aGUgZ2l2ZW4gZGV2aWNlICovCkBAIC0zMjcsNiArMzI5LDcgQEAKIAlpZiAoaW9uX2ZsYWdzICYgSU9OX0ZMQUdfU0VDVVJFKQogCQlzbWVtLT5mbGFncyB8PSBTTUVNX1NFQ1VSRTsKIAorCWJ1ZmZlcl9zaXplID0gc21lbS0+c2l6ZTsKIAlyYyA9IG1zbV9pb25fZ2V0X2RldmljZV9hZGRyZXNzKGluc3QtPm1lbV9jbGllbnQsIGlvbl9oYW5kbGUsCiAJCQlhbGlnbiwgJmlvdmEsICZidWZmZXJfc2l6ZSwgc21lbS0+ZmxhZ3MsCiAJCQlzbWVtLT5idWZmZXJfdHlwZSwgJnNtZW0tPm1hcHBpbmdfaW5mbyk7CkBAIC02MDMsMjIgKzYwNiwyNSBAQAogCQlfX2Z1bmNfXywgbWVtLT5oYW5kbGUsIG1lbS0+ZGV2aWNlX2FkZHIsIG1lbS0+c2l6ZSwKIAkJbWVtLT5rdmFkZHIsIG1lbS0+YnVmZmVyX3R5cGUpOwogCi0JaWYgKG1lbS0+ZGV2aWNlX2FkZHIpCisJaWYgKG1lbS0+ZGV2aWNlX2FkZHIpIHsKIAkJbXNtX2lvbl9wdXRfZGV2aWNlX2FkZHJlc3MoY2xpZW50LCBtZW0tPmhhbmRsZSwgbWVtLT5mbGFncywKIAkJCSZtZW0tPm1hcHBpbmdfaW5mbywgbWVtLT5idWZmZXJfdHlwZSk7CisJCW1lbS0+ZGV2aWNlX2FkZHIgPSAweDA7CisJfQogCi0JaWYgKG1lbS0+a3ZhZGRyKQorCWlmIChtZW0tPmt2YWRkcikgewogCQlpb25fdW5tYXBfa2VybmVsKGNsaWVudC0+Y2xudCwgbWVtLT5oYW5kbGUpOworCQltZW0tPmt2YWRkciA9IE5VTEw7CisJfQogCiAJaWYgKG1lbS0+aGFuZGxlKSB7CiAJCXRyYWNlX21zbV9zbWVtX2J1ZmZlcl9pb25fb3Bfc3RhcnQoIkZSRUUiLAogCQkJCSh1MzIpbWVtLT5idWZmZXJfdHlwZSwgLTEsIG1lbS0+c2l6ZSwgLTEsCiAJCQkJbWVtLT5mbGFncywgLTEpOwogCQlpb25fZnJlZShjbGllbnQtPmNsbnQsIG1lbS0+aGFuZGxlKTsKKwkJbWVtLT5oYW5kbGUgPSBOVUxMOwogCQl0cmFjZV9tc21fc21lbV9idWZmZXJfaW9uX29wX2VuZCgiRlJFRSIsICh1MzIpbWVtLT5idWZmZXJfdHlwZSwKIAkJCS0xLCBtZW0tPnNpemUsIC0xLCBtZW0tPmZsYWdzLCAtMSk7Ci0JfSBlbHNlIHsKLQkJZHByaW50ayhWSURDX0VSUiwgIiVzOiBpbnZhbGlkIGlvbl9oYW5kbGVcbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92NGwyX3ZpZGMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCmluZGV4IDRiMTZhZjYuLmZhNDAwOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3Y0bDJfdmlkYy5jCkBAIC00NDgsMTQgKzQ0OCwxNCBAQAogc3RhdGljIERFVklDRV9BVFRSKHRoZXJtYWxfbGV2ZWwsIDA2NDQsIHNob3dfdGhlcm1hbF9sZXZlbCwKIAkJc3RvcmVfdGhlcm1hbF9sZXZlbCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcGxhdGZvcm1fdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBzaG93X3NrdV92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQiLAotCQkJdmlkY19kcml2ZXItPnBsYXRmb3JtX3ZlcnNpb24pOworCQkJdmlkY19kcml2ZXItPnNrdV92ZXJzaW9uKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcGxhdGZvcm1fdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBzdG9yZV9za3VfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKIHsKQEAgLTQ2MywxMyArNDYzLDEzIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIocGxhdGZvcm1fdmVyc2lvbiwgMDQ0NCwgc2hvd19wbGF0Zm9ybV92ZXJzaW9uLAotCQlzdG9yZV9wbGF0Zm9ybV92ZXJzaW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihza3VfdmVyc2lvbiwgMDQ0NCwgc2hvd19za3VfdmVyc2lvbiwKKwkJc3RvcmVfc2t1X3ZlcnNpb24pOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbXNtX3ZpZGNfY29yZV9hdHRyc1tdID0gewogCQkmZGV2X2F0dHJfcHdyX2NvbGxhcHNlX2RlbGF5LmF0dHIsCiAJCSZkZXZfYXR0cl90aGVybWFsX2xldmVsLmF0dHIsCi0JCSZkZXZfYXR0cl9wbGF0Zm9ybV92ZXJzaW9uLmF0dHIsCisJCSZkZXZfYXR0cl9za3VfdmVyc2lvbi5hdHRyLAogCQlOVUxMCiB9OwogCkBAIC00ODcsOCArNDg3LDYgQEAKIHN0YXRpYyBpbnQgbXNtX3ZpZGNfcHJvYmVfdmlkY19kZXZpY2Uoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmMgPSAwOwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgbXNtX3ZpZGNfY29yZSAqY29yZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IG5yID0gQkFTRV9ERVZJQ0VfTlVNQkVSOwpAQCAtNjA1LDMyICs2MDMsNyBAQAogCWNvcmUtPmRlYnVnZnNfcm9vdCA9IG1zbV92aWRjX2RlYnVnZnNfaW5pdF9jb3JlKAogCQljb3JlLCB2aWRjX2RyaXZlci0+ZGVidWdmc19yb290KTsKIAotCXZpZGNfZHJpdmVyLT5wbGF0Zm9ybV92ZXJzaW9uID0gMDsKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiZWZ1c2UiKTsKLQlpZiAoIXJlcykgewotCQlkcHJpbnRrKFZJRENfREJHLCAiZmFpbGVkIHRvIGdldCBlZnVzZSByZXNvdXJjZVxuIik7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCQlpZiAoIWJhc2UpIHsKLQkJCWRwcmludGsoVklEQ19FUlIsCi0JCQkJImZhaWxlZCBlZnVzZSBpb3JlbWFwOiByZXMtPnN0YXJ0ICUjeCwgc2l6ZSAlZFxuIiwKLQkJCQkodTMyKXJlcy0+c3RhcnQsICh1MzIpcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQkJfSBlbHNlIHsKLQkJCXUzMiBlZnVzZSA9IDA7Ci0JCQlzdHJ1Y3QgcGxhdGZvcm1fdmVyc2lvbl90YWJsZSAqcGZfdmVyX3RibCA9Ci0JCQkJY29yZS0+cmVzb3VyY2VzLnBmX3Zlcl90Ymw7Ci0KLQkJCWVmdXNlID0gcmVhZGxfcmVsYXhlZChiYXNlKTsKLQkJCXZpZGNfZHJpdmVyLT5wbGF0Zm9ybV92ZXJzaW9uID0KLQkJCQkoZWZ1c2UgJiBwZl92ZXJfdGJsLT52ZXJzaW9uX21hc2spID4+Ci0JCQkJcGZfdmVyX3RibC0+dmVyc2lvbl9zaGlmdDsKLQkJCWRwcmludGsoVklEQ19EQkcsCi0JCQkJImVmdXNlIDB4JXgsIHBsYXRmb3JtIHZlcnNpb24gMHgleFxuIiwKLQkJCQllZnVzZSwgdmlkY19kcml2ZXItPnBsYXRmb3JtX3ZlcnNpb24pOwotCi0JCQlkZXZtX2lvdW5tYXAoJnBkZXYtPmRldiwgYmFzZSk7Ci0JCX0KLQl9CisJdmlkY19kcml2ZXItPnNrdV92ZXJzaW9uID0gY29yZS0+cmVzb3VyY2VzLnNrdV92ZXJzaW9uOwogCiAJZHByaW50ayhWSURDX0RCRywgInBvcHVsYXRpbmcgc3ViIGRldmljZXNcbiIpOwogCS8qCkBAIC04MTYsNyArNzg5LDYgQEAKIAlpZiAocmMpIHsKIAkJZHByaW50ayhWSURDX0VSUiwKIAkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyXG4iKTsKLQkJbXNtX3ZpZGNfZGVidWdmc19kZWluaXRfZHJ2KCk7CiAJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh2aWRjX2RyaXZlci0+ZGVidWdmc19yb290KTsKIAkJa2ZyZWUodmlkY19kcml2ZXIpOwogCQl2aWRjX2RyaXZlciA9IE5VTEw7CkBAIC04MjgsNyArODAwLDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtc21fdmlkY19leGl0KHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV92aWRjX2RyaXZlcik7Ci0JbXNtX3ZpZGNfZGVidWdmc19kZWluaXRfZHJ2KCk7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZpZGNfZHJpdmVyLT5kZWJ1Z2ZzX3Jvb3QpOwogCW11dGV4X2Rlc3Ryb3koJnZpZGNfZHJpdmVyLT5sb2NrKTsKIAlrZnJlZSh2aWRjX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92ZGVjLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92ZGVjLmMKaW5kZXggYWEyMGEwNy4uMjg2YTY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmRlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZkZWMuYwpAQCAtNDEzLDcgKzQxMywxNiBAQAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gSU5UX01BWCwKIAkJLmRlZmF1bHRfdmFsdWUgPSAwLAotCQkuc3RlcCA9IE9QRVJBVElOR19GUkFNRV9SQVRFX1NURVAsCisJCS5zdGVwID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZSQU1FX1JBVEUsCisJCS5uYW1lID0gIlNldCBEZWNvZGVyIEZyYW1lIHJhdGUiLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSBJTlRfTUFYLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS5zdGVwID0gMSwKIAl9LAogCXsKIAkJLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xPV0xBVEVOQ1lfTU9ERSwKQEAgLTQ4MCw2ICs0ODksMTMgQEAKIAkJLnR5cGUgPSBDQVBUVVJFX1BPUlQsCiAJfSwKIAl7CisJCS5uYW1lID0gIllDYkNyIFNlbWlwbGFuYXIgNDoyOjAgMTBiaXQiLAorCQkuZGVzY3JpcHRpb24gPSAiWS9DYkNyIDQ6MjowIDEwYml0IiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9TREVfWV9DQkNSX0gyVjJfUDAxMCwKKwkJLmdldF9mcmFtZV9zaXplID0gZ2V0X2ZyYW1lX3NpemVfcDAxMCwKKwkJLnR5cGUgPSBDQVBUVVJFX1BPUlQsCisJfSwKKwl7CiAJCS5uYW1lID0gIlVCV0MgWUNiQ3IgU2VtaXBsYW5hciA0OjI6MCIsCiAJCS5kZXNjcmlwdGlvbiA9ICJVQldDIFkvQ2JDciA0OjI6MCIsCiAJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMl9VQldDLApAQCAtNTIxLDcgKzUzNyw3IEBACiAJCS5uYW1lID0gIlZQOCIsCiAJCS5kZXNjcmlwdGlvbiA9ICJWUDggY29tcHJlc3NlZCBmb3JtYXQiLAogCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1ZQOCwKLQkJLmdldF9mcmFtZV9zaXplID0gZ2V0X2ZyYW1lX3NpemVfY29tcHJlc3NlZCwKKwkJLmdldF9mcmFtZV9zaXplID0gZ2V0X2ZyYW1lX3NpemVfY29tcHJlc3NlZF9mdWxsX3l1diwKIAkJLnR5cGUgPSBPVVRQVVRfUE9SVCwKIAkJLmRlZmVyX291dHB1dHMgPSBmYWxzZSwKIAl9LApAQCAtNTc0LDYgKzU5MCwxMyBAQAogCiAJCWluc3QtPnByb3Aud2lkdGhbQ0FQVFVSRV9QT1JUXSA9IGYtPmZtdC5waXhfbXAud2lkdGg7CiAJCWluc3QtPnByb3AuaGVpZ2h0W0NBUFRVUkVfUE9SVF0gPSBmLT5mbXQucGl4X21wLmhlaWdodDsKKwkJcmMgPSBtc21fdmlkY19jaGVja19zZXNzaW9uX3N1cHBvcnRlZChpbnN0KTsKKwkJaWYgKHJjKSB7CisJCQlkcHJpbnRrKFZJRENfRVJSLAorCQkJCSIlczogc2Vzc2lvbiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9pbnZhbGlkX2ZtdDsKKwkJfQorCiAJCW1zbV9jb21tX3NldF9jb2xvcl9mb3JtYXQoaW5zdCwKIAkJCQltc21fY29tbV9nZXRfaGFsX291dHB1dF9idWZmZXIoaW5zdCksCiAJCQkJZi0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCk7CkBAIC02NDEsNiArNjY0LDEyIEBACiAJCX0KIAkJaW5zdC0+cHJvcC53aWR0aFtPVVRQVVRfUE9SVF0gPSBmLT5mbXQucGl4X21wLndpZHRoOwogCQlpbnN0LT5wcm9wLmhlaWdodFtPVVRQVVRfUE9SVF0gPSBmLT5mbXQucGl4X21wLmhlaWdodDsKKwkJcmMgPSBtc21fdmlkY19jaGVja19zZXNzaW9uX3N1cHBvcnRlZChpbnN0KTsKKwkJaWYgKHJjKSB7CisJCQlkcHJpbnRrKFZJRENfRVJSLAorCQkJCSIlczogc2Vzc2lvbiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9pbnZhbGlkX2ZtdDsKKwkJfQogCiAJCWZyYW1lX3N6LmJ1ZmZlcl90eXBlID0gSEFMX0JVRkZFUl9JTlBVVDsKIAkJZnJhbWVfc3oud2lkdGggPSBpbnN0LT5wcm9wLndpZHRoW09VVFBVVF9QT1JUXTsKQEAgLTExMDcsMTEgKzExMzYsMjcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19PUEVSQVRJTkdfUkFURToKLQkJZHByaW50ayhWSURDX0RCRywKLQkJCSJpbnN0KCVwSykgb3BlcmF0aW5nIHJhdGUgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAotCQkJaW5zdCwgaW5zdC0+Y2xrX2RhdGEub3BlcmF0aW5nX3JhdGUgPj4gMTYsCi0JCQkJY3RybC0+dmFsID4+IDE2KTsKLQkJaW5zdC0+Y2xrX2RhdGEub3BlcmF0aW5nX3JhdGUgPSBjdHJsLT52YWw7CisJCWlmICgoKGN0cmwtPnZhbCA+PiAxNikgPCBpbnN0LT5jYXBhYmlsaXR5LmZyYW1lX3JhdGUubWluIHx8CisJCQkoY3RybC0+dmFsID4+IDE2KSA+IGluc3QtPmNhcGFiaWxpdHkuZnJhbWVfcmF0ZS5tYXgpICYmCisJCQljdHJsLT52YWwgIT0gSU5UX01BWCkgeworCQkJZHByaW50ayhWSURDX0VSUiwgIkludmFsaWQgb3BlcmF0aW5nIHJhdGUgJXVcbiIsCisJCQkJKGN0cmwtPnZhbCA+PiAxNikpOworCQkJcmMgPSAtRU5PVFNVUFA7CisJCX0gZWxzZSBpZiAoY3RybC0+dmFsID09IElOVF9NQVgpIHsKKwkJCWRwcmludGsoVklEQ19EQkcsCisJCQkJImluc3QoJXBLKSBSZXF1ZXN0IGZvciB0dXJibyBtb2RlXG4iLCBpbnN0KTsKKwkJCWluc3QtPmNsa19kYXRhLnR1cmJvX21vZGUgPSB0cnVlOworCQl9IGVsc2UgaWYgKG1zbV92aWRjX3ZhbGlkYXRlX29wZXJhdGluZ19yYXRlKGluc3QsIGN0cmwtPnZhbCkpIHsKKwkJCWRwcmludGsoVklEQ19FUlIsICJGYWlsZWQgdG8gc2V0IG9wZXJhdGluZyByYXRlXG4iKTsKKwkJCXJjID0gLUVOT1RTVVBQOworCQl9IGVsc2UgeworCQkJZHByaW50ayhWSURDX0RCRywKKwkJCQkiaW5zdCglcEspIG9wZXJhdGluZyByYXRlIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQlpbnN0LCBpbnN0LT5jbGtfZGF0YS5vcGVyYXRpbmdfcmF0ZSA+PiAxNiwKKwkJCQkJY3RybC0+dmFsID4+IDE2KTsKKwkJCWluc3QtPmNsa19kYXRhLm9wZXJhdGluZ19yYXRlID0gY3RybC0+dmFsOworCQkJaW5zdC0+Y2xrX2RhdGEudHVyYm9fbW9kZSA9IGZhbHNlOworCQl9CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0xPV0xBVEVOQ1lfTU9ERToKIAkJaWYgKGN0cmwtPnZhbCA9PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmVuYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmVuYy5jCmluZGV4IGRmYjJhZDUuLjIyYzBkZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZlbmMuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92ZW5jLmMKQEAgLTYxLDYgKzYxLDE0IEBACiAJTlVMTAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1wZWdfdmlkZW9fZmxpcFtdID0geworCSJObyBGbGlwIiwKKwkiSG9yaXpvbnRhbCBGbGlwIiwKKwkiVmVydGljYWwgRmxpcCIsCisJIkJvdGgiLAorCU5VTEwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBoMjY0X3ZpZGVvX2VudHJvcHlfY2FiYWNfbW9kZWxbXSA9IHsKIAkiTW9kZWwgMCIsCiAJIk1vZGVsIDEiLApAQCAtOTA5LDcgKzkxNywxNiBAQAogCQkubWluaW11bSA9IDAsCiAJCS5tYXhpbXVtID0gSU5UX01BWCwKIAkJLmRlZmF1bHRfdmFsdWUgPSAwLAotCQkuc3RlcCA9IE9QRVJBVElOR19GUkFNRV9SQVRFX1NURVAsCisJCS5zdGVwID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZSQU1FX1JBVEUsCisJCS5uYW1lID0gIlNldCBFbmNvZGVyIEZyYW1lIHJhdGUiLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSBJTlRfTUFYLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS5zdGVwID0gMSwKIAl9LAogCXsKIAkJLmlkID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1ZFTkNfQklUUkFURV9UWVBFLApAQCAtMTAzNiw2ICsxMDUzLDIxIEBACiAJCS5kZWZhdWx0X3ZhbHVlID0gMCwKIAkJLnN0ZXAgPSAxLAogCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUCwKKwkJLm5hbWUgPSAiRmxpcCIsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm1pbmltdW0gPSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUF9OT05FLAorCQkubWF4aW11bSA9IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX0JPVEgsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZMSVBfTk9ORSwKKwkJLm1lbnVfc2tpcF9tYXNrID0gfigKKwkJKDEgPDwgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZMSVBfTk9ORSkgfAorCQkoMSA8PCBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUF9IT1JJKSB8CisJCSgxIDw8IFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX1ZFUlQpIHwKKwkJKDEgPDwgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZMSVBfQk9USCkKKwkJKSwKKwkJLnFtZW51ID0gbXBlZ192aWRlb19mbGlwLAorCX0sCiAKIH07CiAKQEAgLTExMTIsNiArMTE0NCwxMyBAQAogCQkuZ2V0X2ZyYW1lX3NpemUgPSBnZXRfZnJhbWVfc2l6ZV9jb21wcmVzc2VkLAogCQkudHlwZSA9IENBUFRVUkVfUE9SVCwKIAl9LAorCXsKKwkJLm5hbWUgPSAiWUNiQ3IgU2VtaXBsYW5hciA0OjI6MCAxMGJpdCIsCisJCS5kZXNjcmlwdGlvbiA9ICJZL0NiQ3IgNDoyOjAgMTBiaXQiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1NERV9ZX0NCQ1JfSDJWMl9QMDEwLAorCQkuZ2V0X2ZyYW1lX3NpemUgPSBnZXRfZnJhbWVfc2l6ZV9wMDEwLAorCQkudHlwZSA9IE9VVFBVVF9QT1JULAorCX0sCiB9OwogCiBzdGF0aWMgaW50IG1zbV92ZW5jX3NldF9jc2Moc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QsCkBAIC0xNDIwLDExICsxNDU5LDI3IEBACiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JPVEFUSU9OOgogCXsKKwkJdGVtcF9jdHJsID0gVFJZX0dFVF9DVFJMKFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQKTsKIAkJcHJvcGVydHlfaWQgPSBIQUxfUEFSQU1fVlBFX1JPVEFUSU9OOwogCQl2cGVfcm90YXRpb24ucm90YXRlID0gbXNtX2NvbW1fdjRsMl90b19oYWwoCiAJCQkJVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JPVEFUSU9OLAogCQkJCWN0cmwtPnZhbCk7Ci0JCXZwZV9yb3RhdGlvbi5mbGlwID0gSEFMX0ZMSVBfTk9ORTsKKwkJdnBlX3JvdGF0aW9uLmZsaXAgPSBtc21fY29tbV92NGwyX3RvX2hhbCgKKwkJCQlWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUCwKKwkJCQl0ZW1wX2N0cmwtPnZhbCk7CisJCXBkYXRhID0gJnZwZV9yb3RhdGlvbjsKKwkJYnJlYWs7CisJfQorCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZMSVA6CisJeworCQl0ZW1wX2N0cmwgPSBUUllfR0VUX0NUUkwoVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JPVEFUSU9OKTsKKwkJcHJvcGVydHlfaWQgPSBIQUxfUEFSQU1fVlBFX1JPVEFUSU9OOworCQl2cGVfcm90YXRpb24ucm90YXRlID0gbXNtX2NvbW1fdjRsMl90b19oYWwoCisJCQkJVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX1JPVEFUSU9OLAorCQkJCXRlbXBfY3RybC0+dmFsKTsKKwkJdnBlX3JvdGF0aW9uLmZsaXAgPSBtc21fY29tbV92NGwyX3RvX2hhbCgKKwkJCQlWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUCwKKwkJCQljdHJsLT52YWwpOwogCQlwZGF0YSA9ICZ2cGVfcm90YXRpb247CiAJCWJyZWFrOwogCX0KQEAgLTE0NjQsMTMgKzE1MTksMTQgQEAKIAkJcGRhdGEgPSAmbXVsdGlfc2xpY2VfY29udHJvbDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX0RFTElWRVJZX01PREU6IHsKLQkJYm9vbCBjb2RlY19hdmMgPQorCQlib29sIGNvZGVjc19zdXBwb3J0ZWQgPQorCQkJaW5zdC0+Zm10c1tDQVBUVVJFX1BPUlRdLmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSEVWQyB8fAogCQkJaW5zdC0+Zm10c1tDQVBUVVJFX1BPUlRdLmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSDI2NCB8fAogCQkJaW5zdC0+Zm10c1tDQVBUVVJFX1BPUlRdLmZvdXJjYyA9PQogCQkJCQkJCVY0TDJfUElYX0ZNVF9IMjY0X05PX1NDOwogCiAJCXRlbXBfY3RybCA9IFRSWV9HRVRfQ1RSTChWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREUpOwotCQlpZiAoY29kZWNfYXZjICYmIHRlbXBfY3RybC0+dmFsID09CisJCWlmIChjb2RlY3Nfc3VwcG9ydGVkICYmIHRlbXBfY3RybC0+dmFsID09CiAJCQkJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIpIHsKIAkJCXByb3BlcnR5X2lkID0gSEFMX1BBUkFNX1ZFTkNfU0xJQ0VfREVMSVZFUllfTU9ERTsKIAkJCWVuYWJsZS5lbmFibGUgPSB0cnVlOwpAQCAtMTgxNywxMiArMTg3MywyNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX09QRVJBVElOR19SQVRFOgotCQlkcHJpbnRrKFZJRENfREJHLAotCQkJImluc3QoJXBLKSBvcGVyYXRpbmcgcmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCi0JCQlpbnN0LCBpbnN0LT5jbGtfZGF0YS5vcGVyYXRpbmdfcmF0ZSA+PiAxNiwKKwkJaWYgKCgoY3RybC0+dmFsID4+IDE2KSA8IGluc3QtPmNhcGFiaWxpdHkuZnJhbWVfcmF0ZS5taW4gfHwKKwkJCSAoY3RybC0+dmFsID4+IDE2KSA+IGluc3QtPmNhcGFiaWxpdHkuZnJhbWVfcmF0ZS5tYXgpICYmCisJCQkgIGN0cmwtPnZhbCAhPSBJTlRfTUFYKSB7CisJCQlkcHJpbnRrKFZJRENfRVJSLCAiSW52YWxpZCBvcGVyYXRpbmcgcmF0ZSAldVxuIiwKKwkJCQkoY3RybC0+dmFsID4+IDE2KSk7CisJCQlyYyA9IC1FTk9UU1VQUDsKKwkJfSBlbHNlIGlmIChjdHJsLT52YWwgPT0gSU5UX01BWCkgeworCQkJZHByaW50ayhWSURDX0RCRywgImluc3QoJXBLKSBSZXF1ZXN0IGZvciB0dXJibyBtb2RlXG4iLAorCQkJCWluc3QpOworCQkJaW5zdC0+Y2xrX2RhdGEudHVyYm9fbW9kZSA9IHRydWU7CisJCX0gZWxzZSBpZiAobXNtX3ZpZGNfdmFsaWRhdGVfb3BlcmF0aW5nX3JhdGUoaW5zdCwgY3RybC0+dmFsKSkgeworCQkJZHByaW50ayhWSURDX0VSUiwgIkZhaWxlZCB0byBzZXQgb3BlcmF0aW5nIHJhdGVcbiIpOworCQkJcmMgPSAtRU5PVFNVUFA7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKFZJRENfREJHLAorCQkJCSJpbnN0KCVwSykgb3BlcmF0aW5nIHJhdGUgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJCWluc3QsIGluc3QtPmNsa19kYXRhLm9wZXJhdGluZ19yYXRlID4+IDE2LAogCQkJCWN0cmwtPnZhbCA+PiAxNik7Ci0JCWluc3QtPmNsa19kYXRhLm9wZXJhdGluZ19yYXRlID0gY3RybC0+dmFsOwotCisJCQlpbnN0LT5jbGtfZGF0YS5vcGVyYXRpbmdfcmF0ZSA9IGN0cmwtPnZhbDsKKwkJCWluc3QtPmNsa19kYXRhLnR1cmJvX21vZGUgPSBmYWxzZTsKKwkJfQogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WRU5DX0JJVFJBVEVfVFlQRToKIAl7CkBAIC0yMzg1LDYgKzI0NTYsMTIgQEAKIAogCQlpbnN0LT5wcm9wLndpZHRoW0NBUFRVUkVfUE9SVF0gPSBmLT5mbXQucGl4X21wLndpZHRoOwogCQlpbnN0LT5wcm9wLmhlaWdodFtDQVBUVVJFX1BPUlRdID0gZi0+Zm10LnBpeF9tcC5oZWlnaHQ7CisJCXJjID0gbXNtX3ZpZGNfY2hlY2tfc2Vzc2lvbl9zdXBwb3J0ZWQoaW5zdCk7CisJCWlmIChyYykgeworCQkJZHByaW50ayhWSURDX0VSUiwKKwkJCQkiJXM6IHNlc3Npb24gbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBleGl0OworCQl9CiAKIAkJZnJhbWVfc3ouYnVmZmVyX3R5cGUgPSBIQUxfQlVGRkVSX09VVFBVVDsKIAkJZnJhbWVfc3oud2lkdGggPSBpbnN0LT5wcm9wLndpZHRoW0NBUFRVUkVfUE9SVF07CkBAIC0yNDQzLDYgKzI1MjAsMTIgQEAKIAogCQlpbnN0LT5wcm9wLndpZHRoW09VVFBVVF9QT1JUXSA9IGYtPmZtdC5waXhfbXAud2lkdGg7CiAJCWluc3QtPnByb3AuaGVpZ2h0W09VVFBVVF9QT1JUXSA9IGYtPmZtdC5waXhfbXAuaGVpZ2h0OworCQlyYyA9IG1zbV92aWRjX2NoZWNrX3Nlc3Npb25fc3VwcG9ydGVkKGluc3QpOworCQlpZiAocmMpIHsKKwkJCWRwcmludGsoVklEQ19FUlIsCisJCQkJIiVzOiBzZXNzaW9uIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQogCiAJCWZyYW1lX3N6LmJ1ZmZlcl90eXBlID0gSEFMX0JVRkZFUl9JTlBVVDsKIAkJZnJhbWVfc3oud2lkdGggPSBpbnN0LT5wcm9wLndpZHRoW09VVFBVVF9QT1JUXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGMuYwppbmRleCA5MjBlOTFhLi5hZTJhMmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkYy5jCkBAIC0xNzksNiArMTc5LDEwIEBACiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9CWVRFUzoKIAkJbXNtX3ZpZGNfY3RybF9nZXRfcmFuZ2UoY3RybCwgJmluc3QtPmNhcGFiaWxpdHkuc2xpY2VfYnl0ZXMpOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GUkFNRV9SQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX09QRVJBVElOR19SQVRFOgorCQltc21fdmlkY19jdHJsX2dldF9yYW5nZShjdHJsLCAmaW5zdC0+Y2FwYWJpbGl0eS5mcmFtZV9yYXRlKTsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRToKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19IRVZDX1BST0ZJTEU6CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTVBFRzJfUFJPRklMRToKQEAgLTI3Nyw2ICsyODEsOSBAQAogCWNhc2UgVjRMMl9QSVhfRk1UX05WMTJfVFAxMF9VQldDOgogCQljb2xvcl9mb3JtYXQgPSBDT0xPUl9GTVRfTlYxMl9CUFAxMF9VQldDOwogCQlicmVhazsKKwljYXNlIFY0TDJfUElYX0ZNVF9TREVfWV9DQkNSX0gyVjJfUDAxMDoKKwkJY29sb3JfZm9ybWF0ID0gQ09MT1JfRk1UX1AwMTA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRwcmludGsoVklEQ19EQkcsCiAJCQkiSW52YWxpZCA6IGdfZm10IGNhbGxlZCBvbiAlcyBwb3J0IHdpdGggSW52YWxpZCBmb3VyY2MgMHgleFxuIiwKQEAgLTUxMCw2ICs1MTcsMTIgQEAKIAkJbXNtX2NvbW1fdXBkYXRlX2lucHV0X2NyKGluc3QsIGItPmluZGV4LCBjcik7CiAJfQogCisJaWYgKGluc3QtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19ERUNPREVSICYmCisJCQliLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQltc21fY29tbV9zdG9yZV9tYXJrX2RhdGEoJmluc3QtPmV0Yl9kYXRhLCBiLT5pbmRleCwKKwkJCWItPm0ucGxhbmVzWzBdLnJlc2VydmVkWzNdLCBiLT5tLnBsYW5lc1swXS5yZXNlcnZlZFs0XSk7CisJfQorCiAJcSA9IG1zbV9jb21tX2dldF92YjJxKGluc3QsIGItPnR5cGUpOwogCWlmICghcSkgewogCQlkcHJpbnRrKFZJRENfRVJSLApAQCAtNTYyLDYgKzU3NSwxMyBAQAogCQliLT5tLnBsYW5lc1tpXS5yZXNlcnZlZFsxXSA9IGItPm0ucGxhbmVzW2ldLmRhdGFfb2Zmc2V0OwogCX0KIAorCWlmIChpbnN0LT5zZXNzaW9uX3R5cGUgPT0gTVNNX1ZJRENfREVDT0RFUiAmJgorCQkJYi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCW1zbV9jb21tX2ZldGNoX21hcmtfZGF0YSgmaW5zdC0+ZmJkX2RhdGEsIGItPmluZGV4LAorCQkJJmItPm0ucGxhbmVzWzBdLnJlc2VydmVkWzNdLAorCQkJJmItPm0ucGxhbmVzWzBdLnJlc2VydmVkWzRdKTsKKwl9CisKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKG1zbV92aWRjX2RxYnVmKTsKQEAgLTg2OCw2ICs4ODgsMTMgQEAKIAkJZ290byBmYWlsX3N0YXJ0OwogCX0KIAorCXJjID0gbXNtX3ZpZGNfY2hlY2tfc2NhbGluZ19zdXBwb3J0ZWQoaW5zdCk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoVklEQ19FUlIsCisJCQkiVGhpcyBzZXNzaW9uIHNjYWxpbmcgaXMgbm90IHN1cHBvcnRlZCAlcEtcbiIsIGluc3QpOworCQlnb3RvIGZhaWxfc3RhcnQ7CisJfQorCiAJLyogRGVjaWRlIHdvcmsgbW9kZSBmb3IgY3VycmVudCBzZXNzaW9uICovCiAJcmMgPSBtc21fdmlkY19kZWNpZGVfd29ya19tb2RlKGluc3QpOwogCWlmIChyYykgewpAQCAtMTU2Niw2ICsxNTkzLDggQEAKIAlJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPnJlZ2lzdGVyZWRidWZzKTsKIAlJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPnJlY29uYnVmcyk7CiAJSU5JVF9NU01fVklEQ19MSVNUKCZpbnN0LT5lb3NidWZzKTsKKwlJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmV0Yl9kYXRhKTsKKwlJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmZiZF9kYXRhKTsKIAogCWtyZWZfaW5pdCgmaW5zdC0+a3JlZik7CiAKQEAgLTE2NzMsNiArMTcwMiw4IEBACiAJREVJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmVvc2J1ZnMpOwogCURFSU5JVF9NU01fVklEQ19MSVNUKCZpbnN0LT5mcmVxcyk7CiAJREVJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmlucHV0X2Nycyk7CisJREVJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmV0Yl9kYXRhKTsKKwlERUlOSVRfTVNNX1ZJRENfTElTVCgmaW5zdC0+ZmJkX2RhdGEpOwogCiAJa2ZyZWUoaW5zdCk7CiAJaW5zdCA9IE5VTEw7CkBAIC0xNjg0LDYgKzE3MTUsNyBAQAogc3RhdGljIHZvaWQgbXNtX3ZpZGNfY2xlYW51cF9pbnN0YW5jZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCkKIHsKIAlzdHJ1Y3QgbXNtX3ZpZGNfYnVmZmVyICp0ZW1wLCAqZHVtbXk7CisJc3RydWN0IGdldHByb3BfYnVmICp0ZW1wX3Byb3AsICpkdW1teV9wcm9wOwogCiAJaWYgKCFpbnN0KSB7CiAJCWRwcmludGsoVklEQ19FUlIsICIlczogaW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKQEAgLTE3MTYsNiArMTc0OCwxMCBAQAogCQlkcHJpbnRrKFZJRENfRVJSLAogCQkJIkZhaWxlZCB0byByZWxlYXNlIHBlcnNpc3QgYnVmZmVyc1xuIik7CiAKKwlpZiAobXNtX2NvbW1fcmVsZWFzZV9tYXJrX2RhdGEoaW5zdCkpCisJCWRwcmludGsoVklEQ19FUlIsCisJCQkiRmFpbGVkIHRvIHJlbGVhc2UgbWFya19kYXRhIGJ1ZmZlcnNcbiIpOworCiAJLyoKIAkgKiBBdCB0aGlzIHBvaW50IGFsbCBidWZmZXMgc2hvdWxkIGJlIHdpdGggZHJpdmVyCiAJICogaXJyZXNwZWN0aXZlIG9mIHNjZW5hcmlvCkBAIC0xNzMxLDEwICsxNzY3LDE4IEBACiAJaWYgKGluc3QtPmV4dHJhZGF0YV9oYW5kbGUpCiAJCW1zbV9jb21tX3NtZW1fZnJlZShpbnN0LCBpbnN0LT5leHRyYWRhdGFfaGFuZGxlKTsKIAotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpbnN0LT5kZWJ1Z2ZzX3Jvb3QpOwotCiAJbXV0ZXhfbG9jaygmaW5zdC0+cGVuZGluZ19nZXRwcm9wcS5sb2NrKTsKLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZpbnN0LT5wZW5kaW5nX2dldHByb3BxLmxpc3QpKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmluc3QtPnBlbmRpbmdfZ2V0cHJvcHEubGlzdCkpIHsKKwkJZHByaW50ayhWSURDX0VSUiwKKwkJCSJwZW5kaW5nX2dldHByb3BxIG5vdCBlbXB0eSBmb3IgaW5zdGFuY2UgJXBLXG4iLAorCQkJaW5zdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0ZW1wX3Byb3AsIGR1bW15X3Byb3AsCisJCQkmaW5zdC0+cGVuZGluZ19nZXRwcm9wcS5saXN0LCBsaXN0KSB7CisJCQlrZnJlZSh0ZW1wX3Byb3AtPmRhdGEpOworCQkJbGlzdF9kZWwoJnRlbXBfcHJvcC0+bGlzdCk7CisJCQlrZnJlZSh0ZW1wX3Byb3ApOworCQl9CisJfQogCW11dGV4X3VubG9jaygmaW5zdC0+cGVuZGluZ19nZXRwcm9wcS5sb2NrKTsKIH0KIApAQCAtMTc3MSwxMiArMTgxNSwxNiBAQAogCURFSU5JVF9NU01fVklEQ19MSVNUKCZpbnN0LT5lb3NidWZzKTsKIAlERUlOSVRfTVNNX1ZJRENfTElTVCgmaW5zdC0+ZnJlcXMpOwogCURFSU5JVF9NU01fVklEQ19MSVNUKCZpbnN0LT5pbnB1dF9jcnMpOworCURFSU5JVF9NU01fVklEQ19MSVNUKCZpbnN0LT5ldGJfZGF0YSk7CisJREVJTklUX01TTV9WSURDX0xJU1QoJmluc3QtPmZiZF9kYXRhKTsKIAogCW11dGV4X2Rlc3Ryb3koJmluc3QtPnN5bmNfbG9jayk7CiAJbXV0ZXhfZGVzdHJveSgmaW5zdC0+YnVmcVtDQVBUVVJFX1BPUlRdLmxvY2spOwogCW11dGV4X2Rlc3Ryb3koJmluc3QtPmJ1ZnFbT1VUUFVUX1BPUlRdLmxvY2spOwogCW11dGV4X2Rlc3Ryb3koJmluc3QtPmxvY2spOwogCisJbXNtX3ZpZGNfZGVidWdmc19kZWluaXRfaW5zdChpbnN0KTsKKwogCXByX2luZm8oVklEQ19EQkdfVEFHICJDbG9zZWQgdmlkZW8gaW5zdGFuY2U6ICVwS1xuIiwKIAkJCVZJRENfTVNHX1BSSU8yU1RSSU5HKFZJRENfSU5GTyksIGluc3QpOwogCWtmcmVlKGluc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jbG9ja3MuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfY2xvY2tzLmMKaW5kZXggZDU1Nzk1OS4uZjJmNmQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jbG9ja3MuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2Nsb2Nrcy5jCkBAIC01NTMsNyArNTUzLDggQEAKIHN0YXRpYyBpbnQgbXNtX3ZpZGNfc2V0X2Nsb2NrcyhzdHJ1Y3QgbXNtX3ZpZGNfY29yZSAqY29yZSkKIHsKIAlzdHJ1Y3QgaGZpX2RldmljZSAqaGRldjsKLQl1bnNpZ25lZCBsb25nIGZyZXEgPSAwLCByYXRlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZyZXFfY29yZV8xID0gMCwgZnJlcV9jb3JlXzIgPSAwLCByYXRlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZyZXFfY29yZV9tYXggPSAwOwogCXN0cnVjdCBtc21fdmlkY19pbnN0ICp0ZW1wID0gTlVMTDsKIAlpbnQgcmMgPSAwLCBpID0gMDsKIAlzdHJ1Y3QgYWxsb3dlZF9jbG9ja19yYXRlc190YWJsZSAqYWxsb3dlZF9jbGtzX3RibCA9IE5VTEw7CkBAIC01NjgsMTQgKzU2OSwzMyBAQAogCiAJbXV0ZXhfbG9jaygmY29yZS0+bG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmY29yZS0+aW5zdGFuY2VzLCBsaXN0KSB7Ci0JCWZyZXEgKz0gdGVtcC0+Y2xrX2RhdGEuY3Vycl9mcmVxOworCisJCWlmICh0ZW1wLT5jbGtfZGF0YS5jb3JlX2lkID09IFZJRENfQ09SRV9JRF8xKQorCQkJZnJlcV9jb3JlXzEgKz0gdGVtcC0+Y2xrX2RhdGEubWluX2ZyZXE7CisJCWVsc2UgaWYgKHRlbXAtPmNsa19kYXRhLmNvcmVfaWQgPT0gVklEQ19DT1JFX0lEXzIpCisJCQlmcmVxX2NvcmVfMiArPSB0ZW1wLT5jbGtfZGF0YS5taW5fZnJlcTsKKwkJZWxzZSBpZiAodGVtcC0+Y2xrX2RhdGEuY29yZV9pZCA9PSBWSURDX0NPUkVfSURfMykgeworCQkJZnJlcV9jb3JlXzEgKz0gdGVtcC0+Y2xrX2RhdGEubWluX2ZyZXEgLyAyOworCQkJZnJlcV9jb3JlXzIgKz0gdGVtcC0+Y2xrX2RhdGEubWluX2ZyZXEgLyAyOworCQl9CisKKwkJZnJlcV9jb3JlX21heCA9IG1heF90KHVuc2lnbmVkIGxvbmcsIGZyZXFfY29yZV8xLCBmcmVxX2NvcmVfMik7CisKKwkJaWYgKHRlbXAtPmNsa19kYXRhLnR1cmJvX21vZGUpIHsKKwkJCWRwcmludGsoVklEQ19QUk9GLAorCQkJCSJGb3VuZCBhbiBpbnN0YW5jZSB3aXRoIFR1cmJvIHJlcXVlc3RcbiIpOworCQkJZnJlcV9jb3JlX21heCA9IG1zbV92aWRjX21heF9mcmVxKGNvcmUpOworCQkJYnJlYWs7CisJCX0KIAl9CisKIAlmb3IgKGkgPSBjb3JlLT5yZXNvdXJjZXMuYWxsb3dlZF9jbGtzX3RibF9zaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJcmF0ZSA9IGFsbG93ZWRfY2xrc190YmxbaV0uY2xvY2tfcmF0ZTsKLQkJaWYgKHJhdGUgPj0gZnJlcSkKKwkJaWYgKHJhdGUgPj0gZnJlcV9jb3JlX21heCkKIAkJCWJyZWFrOwogCX0KLQljb3JlLT5taW5fZnJlcSA9IGZyZXE7CisKKwljb3JlLT5taW5fZnJlcSA9IGZyZXFfY29yZV9tYXg7CiAJY29yZS0+Y3Vycl9mcmVxID0gcmF0ZTsKIAltdXRleF91bmxvY2soJmNvcmUtPmxvY2spOwogCkBAIC01ODcsMTkgKzYwNywyMiBAQAogCXJldHVybiByYzsKIH0KIAotaW50IG1zbV92aWRjX3VwZGF0ZV9vcGVyYXRpbmdfcmF0ZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCkKK2ludCBtc21fdmlkY192YWxpZGF0ZV9vcGVyYXRpbmdfcmF0ZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwKKwl1MzIgb3BlcmF0aW5nX3JhdGUpCiB7Ci0Jc3RydWN0IHY0bDJfY3RybCAqY3RybCA9IE5VTEw7CiAJc3RydWN0IG1zbV92aWRjX2luc3QgKnRlbXA7CiAJc3RydWN0IG1zbV92aWRjX2NvcmUgKmNvcmU7CiAJdW5zaWduZWQgbG9uZyBtYXhfZnJlcSwgZnJlcV9sZWZ0LCBvcHNfbGVmdCwgbG9hZCwgY3ljbGVzLCBmcmVxID0gMDsKIAl1bnNpZ25lZCBsb25nIG1ic19wZXJfc2Vjb25kOworCWludCByYyA9IDA7CisJdTMyIGN1cnJfb3BlcmF0aW5nX3JhdGUgPSAwOwogCiAJaWYgKCFpbnN0IHx8ICFpbnN0LT5jb3JlKSB7CiAJCWRwcmludGsoVklEQ19FUlIsICIlcyBJbnZhbGlkIGFyZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWNvcmUgPSBpbnN0LT5jb3JlOworCWN1cnJfb3BlcmF0aW5nX3JhdGUgPSBpbnN0LT5jbGtfZGF0YS5vcGVyYXRpbmdfcmF0ZSA+PiAxNjsKIAogCW11dGV4X2xvY2soJmNvcmUtPmxvY2spOwogCW1heF9mcmVxID0gbXNtX3ZpZGNfbWF4X2ZyZXEoY29yZSk7CkBAIC02MTQsNTEgKzYzNywzNSBAQAogCiAJZnJlcV9sZWZ0ID0gbWF4X2ZyZXEgLSBmcmVxOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmY29yZS0+aW5zdGFuY2VzLCBsaXN0KSB7Ci0KLQkJaWYgKCF0ZW1wIHx8Ci0JCQkJdGVtcC0+c3RhdGUgPCBNU01fVklEQ19TVEFSVF9ET05FIHx8Ci0JCQkJdGVtcC0+c3RhdGUgPj0gTVNNX1ZJRENfUkVMRUFTRV9SRVNPVVJDRVNfRE9ORSkKLQkJCWNvbnRpbnVlOwotCi0JCW1ic19wZXJfc2Vjb25kID0gbXNtX2NvbW1fZ2V0X2luc3RfbG9hZF9wZXJfY29yZSh0ZW1wLAorCW1ic19wZXJfc2Vjb25kID0gbXNtX2NvbW1fZ2V0X2luc3RfbG9hZF9wZXJfY29yZShpbnN0LAogCQlMT0FEX0NBTENfTk9fUVVJUktTKTsKIAotCQljeWNsZXMgPSB0ZW1wLT5jbGtfZGF0YS5lbnRyeS0+dnBwX2N5Y2xlczsKLQkJaWYgKHRlbXAtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19FTkNPREVSKQotCQkJY3ljbGVzID0gdGVtcC0+ZmxhZ3MgJiBWSURDX0xPV19QT1dFUiA/Ci0JCQkJdGVtcC0+Y2xrX2RhdGEuZW50cnktPmxvd19wb3dlcl9jeWNsZXMgOgotCQkJCWN5Y2xlczsKKwljeWNsZXMgPSBpbnN0LT5jbGtfZGF0YS5lbnRyeS0+dnBwX2N5Y2xlczsKKwlpZiAoaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIpCisJCWN5Y2xlcyA9IGluc3QtPmZsYWdzICYgVklEQ19MT1dfUE9XRVIgPworCQkJaW5zdC0+Y2xrX2RhdGEuZW50cnktPmxvd19wb3dlcl9jeWNsZXMgOgorCQkJY3ljbGVzOwogCi0JCWxvYWQgPSBjeWNsZXMgKiBtYnNfcGVyX3NlY29uZDsKKwlsb2FkID0gY3ljbGVzICogbWJzX3Blcl9zZWNvbmQ7CiAKLQkJb3BzX2xlZnQgPSBsb2FkID8gKGZyZXFfbGVmdCAvIGxvYWQpIDogMDsKLQkJLyogQ29udmVydCByZW1haW5pbmcgb3BlcmF0aW5nIHJhdGUgdG8gUTE2IGZvcm1hdCAqLwotCQlvcHNfbGVmdCA9IG9wc19sZWZ0IDw8IDE2OworCW9wc19sZWZ0ID0gbG9hZCA/IChmcmVxX2xlZnQgLyBsb2FkKSA6IDA7CiAKLQkJY3RybCA9IHY0bDJfY3RybF9maW5kKCZ0ZW1wLT5jdHJsX2hhbmRsZXIsCi0JCQlWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fT1BFUkFUSU5HX1JBVEUpOwotCQlpZiAoY3RybCkgewotCQkJZHByaW50ayhWSURDX0RCRywKLQkJCQkiJXM6IEJlZm9yZSBSYW5nZSA9ICVsbGQgLS0+ICVsbGRcbiIsCi0JCQkJY3RybC0+bmFtZSwgY3RybC0+bWluaW11bSwgY3RybC0+bWF4aW11bSk7Ci0JCQlkcHJpbnRrKFZJRENfREJHLAotCQkJCSIlczogQmVmb3JlIERlZiB2YWx1ZSA9ICVsbGQgQ3VyIHZhbCA9ICVkXG4iLAotCQkJCWN0cmwtPm5hbWUsIGN0cmwtPmRlZmF1bHRfdmFsdWUsIGN0cmwtPnZhbCk7Ci0JCQl2NGwyX2N0cmxfbW9kaWZ5X3JhbmdlKGN0cmwsIGN0cmwtPm1pbmltdW0sCi0JCQkJY3RybC0+dmFsICsgb3BzX2xlZnQsIGN0cmwtPnN0ZXAsCi0JCQkJY3RybC0+ZGVmYXVsdF92YWx1ZSk7Ci0JCQlkcHJpbnRrKFZJRENfREJHLAotCQkJCSIlczogVXBkYXRlZCBSYW5nZSA9ICVsbGQgLS0+ICVsbGRcbiIsCi0JCQkJY3RybC0+bmFtZSwgY3RybC0+bWluaW11bSwgY3RybC0+bWF4aW11bSk7Ci0JCQlkcHJpbnRrKFZJRENfREJHLAotCQkJCSIlczogVXBkYXRlZCBEZWYgdmFsdWUgPSAlbGxkIEN1ciB2YWwgPSAlZFxuIiwKLQkJCQljdHJsLT5uYW1lLCBjdHJsLT5kZWZhdWx0X3ZhbHVlLCBjdHJsLT52YWwpOwotCQl9CisJb3BlcmF0aW5nX3JhdGUgPSBvcGVyYXRpbmdfcmF0ZSA+PiAxNjsKKworCWlmICgoY3Vycl9vcGVyYXRpbmdfcmF0ZSArIG9wc19sZWZ0KSA+PSBvcGVyYXRpbmdfcmF0ZSkgeworCQlkcHJpbnRrKFZJRENfREJHLAorCQkJIlJlcXVlc3RkIG9wZXJhdGluZyByYXRlIGlzIHZhbGlkICV1XG4iLAorCQkJb3BlcmF0aW5nX3JhdGUpOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJZHByaW50ayhWSURDX0RCRywKKwkJCSJDdXJyZW50IGxvYWQgaXMgaGlnaCBmb3IgcmVxdWVzdGVkIHNldHRpbmdzLiBDYW5ub3Qgc2V0IG9wZXJhdGluZyByYXRlIHRvICV1XG4iLAorCQkJb3BlcmF0aW5nX3JhdGUpOworCQlyYyA9IC1FSU5WQUw7CiAJfQogCW11dGV4X3VubG9jaygmY29yZS0+bG9jayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiB9CiAKIGludCBtc21fY29tbV9zY2FsZV9jbG9ja3Moc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpCkBAIC03MDEsOSArNzA4LDkgQEAKIAogCWlmIChpbnN0LT5jbGtfZGF0YS5idWZmZXJfY291bnRlciA8IERDVlNfRlRCX1dJTkRPVyB8fAogCQkhbXNtX3ZpZGNfY2xvY2tfc2NhbGluZykKLQkJaW5zdC0+Y2xrX2RhdGEuY3Vycl9mcmVxID0gbXNtX3ZpZGNfbWF4X2ZyZXEoaW5zdC0+Y29yZSk7CisJCWluc3QtPmNsa19kYXRhLm1pbl9mcmVxID0gbXNtX3ZpZGNfbWF4X2ZyZXEoaW5zdC0+Y29yZSk7CiAJZWxzZQotCQlpbnN0LT5jbGtfZGF0YS5jdXJyX2ZyZXEgPSBmcmVxOworCQlpbnN0LT5jbGtfZGF0YS5taW5fZnJlcSA9IGZyZXE7CiAKIAltc21fdmlkY19zZXRfY2xvY2tzKGluc3QtPmNvcmUpOwogCkBAIC05ODAsOCArOTg3LDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCW1ic19wZXJfZnJhbWUgPSBtc21fdmlkY19nZXRfbWJzX3Blcl9mcmFtZShpbnN0KTsKLQlpZiAobWJzX3Blcl9mcmFtZSA+PSBpbnN0LT5jb3JlLT5yZXNvdXJjZXMubWF4X2hxX21ic19wZXJfZnJhbWUgfHwKLQkJaW5zdC0+cHJvcC5mcHMgPj0gaW5zdC0+Y29yZS0+cmVzb3VyY2VzLm1heF9ocV9mcHMpIHsKKwlpZiAobWJzX3Blcl9mcmFtZSA+IGluc3QtPmNvcmUtPnJlc291cmNlcy5tYXhfaHFfbWJzX3Blcl9mcmFtZSB8fAorCQlpbnN0LT5wcm9wLmZwcyA+IGluc3QtPmNvcmUtPnJlc291cmNlcy5tYXhfaHFfZnBzKSB7CiAJCWVuYWJsZSA9IHRydWU7CiAJfQogCkBAIC0xMDI1LDE3ICsxMDMyLDIxIEBACiB9CiAKIHN0YXRpYyB1MzIgZ2V0X2NvcmVfbG9hZChzdHJ1Y3QgbXNtX3ZpZGNfY29yZSAqY29yZSwKLQl1MzIgY29yZV9pZCwgYm9vbCBscF9tb2RlKQorCXUzMiBjb3JlX2lkLCBib29sIGxwX21vZGUsIGJvb2wgcmVhbF90aW1lKQogewogCXN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0ID0gTlVMTDsKIAl1MzIgY3VycmVudF9pbnN0X21ic19wZXJfc2VjID0gMCwgbG9hZCA9IDA7CisJYm9vbCByZWFsX3RpbWVfbW9kZSA9IGZhbHNlOwogCiAJbXV0ZXhfbG9jaygmY29yZS0+bG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnN0LCAmY29yZS0+aW5zdGFuY2VzLCBsaXN0KSB7CiAJCXUzMiBjeWNsZXMsIGxwX2N5Y2xlczsKIAorCQlyZWFsX3RpbWVfbW9kZSA9IGluc3QtPmZsYWdzICYgVklEQ19SRUFMVElNRSA/IHRydWUgOiBmYWxzZTsKIAkJaWYgKCEoaW5zdC0+Y2xrX2RhdGEuY29yZV9pZCAmIGNvcmVfaWQpKQogCQkJY29udGludWU7CisJCWlmIChyZWFsX3RpbWVfbW9kZSAhPSByZWFsX3RpbWUpCisJCQljb250aW51ZTsKIAkJaWYgKGluc3QtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19ERUNPREVSKSB7CiAJCQljeWNsZXMgPSBscF9jeWNsZXMgPSBpbnN0LT5jbGtfZGF0YS5lbnRyeS0+dnBwX2N5Y2xlczsKIAkJfSBlbHNlIGlmIChpbnN0LT5zZXNzaW9uX3R5cGUgPT0gTVNNX1ZJRENfRU5DT0RFUikgewpAQCAtMTA4MCwxMCArMTA5MSwxMCBAQAogCW1heF9mcmVxID0gbXNtX3ZpZGNfbWF4X2ZyZXEoaW5zdC0+Y29yZSk7CiAJaW5zdC0+Y2xrX2RhdGEuY29yZV9pZCA9IDA7CiAKLQljb3JlMF9sb2FkID0gZ2V0X2NvcmVfbG9hZChjb3JlLCBWSURDX0NPUkVfSURfMSwgZmFsc2UpOwotCWNvcmUxX2xvYWQgPSBnZXRfY29yZV9sb2FkKGNvcmUsIFZJRENfQ09SRV9JRF8yLCBmYWxzZSk7Ci0JY29yZTBfbHBfbG9hZCA9IGdldF9jb3JlX2xvYWQoY29yZSwgVklEQ19DT1JFX0lEXzEsIHRydWUpOwotCWNvcmUxX2xwX2xvYWQgPSBnZXRfY29yZV9sb2FkKGNvcmUsIFZJRENfQ09SRV9JRF8yLCB0cnVlKTsKKwljb3JlMF9sb2FkID0gZ2V0X2NvcmVfbG9hZChjb3JlLCBWSURDX0NPUkVfSURfMSwgZmFsc2UsIHRydWUpOworCWNvcmUxX2xvYWQgPSBnZXRfY29yZV9sb2FkKGNvcmUsIFZJRENfQ09SRV9JRF8yLCBmYWxzZSwgdHJ1ZSk7CisJY29yZTBfbHBfbG9hZCA9IGdldF9jb3JlX2xvYWQoY29yZSwgVklEQ19DT1JFX0lEXzEsIHRydWUsIHRydWUpOworCWNvcmUxX2xwX2xvYWQgPSBnZXRfY29yZV9sb2FkKGNvcmUsIFZJRENfQ09SRV9JRF8yLCB0cnVlLCB0cnVlKTsKIAogCW1pbl9sb2FkID0gbWluKGNvcmUwX2xvYWQsIGNvcmUxX2xvYWQpOwogCW1pbl9jb3JlX2lkID0gY29yZTBfbG9hZCA8IGNvcmUxX2xvYWQgPwpAQCAtMTA5NSw2ICsxMTA2LDE2IEBACiAJbHBfY3ljbGVzID0gaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIgPwogCQkJaW5zdC0+Y2xrX2RhdGEuZW50cnktPmxvd19wb3dlcl9jeWNsZXMgOgogCQkJaW5zdC0+Y2xrX2RhdGEuZW50cnktPnZwcF9jeWNsZXM7CisJLyoKKwkgKiBJbmNhc2UgdGhlcmUgaXMgb25seSAxIGNvcmUgZW5hYmxlZCwgbWFyayBpdCBhcyB0aGUgY29yZQorCSAqIHdpdGggbWluIGxvYWQuIFRoaXMgZW5zdXJlcyB0aGF0IHRoaXMgY29yZSBpcyBzZWxlY3RlZCBhbmQKKwkgKiB2aWRlbyBzZXNzaW9uIGlzIHNldCB0byBydW4gb24gdGhlIGVuYWJsZWQgY29yZS4KKwkgKi8KKwlpZiAoaW5zdC0+Y2FwYWJpbGl0eS5tYXhfdmlkZW9fY29yZXMubWF4IDw9IFZJRENfQ09SRV9JRF8xKSB7CisJCW1pbl9jb3JlX2lkID0gbWluX2xwX2NvcmVfaWQgPSBWSURDX0NPUkVfSURfMTsKKwkJbWluX2xvYWQgPSBjb3JlMF9sb2FkOworCQltaW5fbHBfbG9hZCA9IGNvcmUwX2xwX2xvYWQ7CisJfQogCiAJY3VycmVudF9pbnN0X2xvYWQgPSBtc21fY29tbV9nZXRfaW5zdF9sb2FkKGluc3QsIExPQURfQ0FMQ19OT19RVUlSS1MpICoKIAkJaW5zdC0+Y2xrX2RhdGEuZW50cnktPnZwcF9jeWNsZXM7CkBAIC0xMTAyLDkgKzExMjMsOSBAQAogCWN1cnJlbnRfaW5zdF9scF9sb2FkID0gbXNtX2NvbW1fZ2V0X2luc3RfbG9hZChpbnN0LAogCQlMT0FEX0NBTENfTk9fUVVJUktTKSAqIGxwX2N5Y2xlczsKIAotCWRwcmludGsoVklEQ19EQkcsICJDb3JlIDAgTG9hZCA9ICVkIENvcmUgMSBMb2FkID0gJWRcbiIsCisJZHByaW50ayhWSURDX0RCRywgIkNvcmUgMCBSVCBMb2FkID0gJWQgQ29yZSAxIFJUIExvYWQgPSAlZFxuIiwKIAkJIGNvcmUwX2xvYWQsIGNvcmUxX2xvYWQpOwotCWRwcmludGsoVklEQ19EQkcsICJDb3JlIDAgTFAgTG9hZCA9ICVkIENvcmUgMSBMUCBMb2FkID0gJWRcbiIsCisJZHByaW50ayhWSURDX0RCRywgIkNvcmUgMCBSVCBMUCBMb2FkID0gJWQgQ29yZSAxIFJUIExQIExvYWQgPSAlZFxuIiwKIAkJY29yZTBfbHBfbG9hZCwgY29yZTFfbHBfbG9hZCk7CiAJZHByaW50ayhWSURDX0RCRywgIk1heCBMb2FkID0gJWx1XG4iLCBtYXhfZnJlcSk7CiAJZHByaW50ayhWSURDX0RCRywgIkN1cnJlbnQgTG9hZCA9ICVkIEN1cnJlbnQgTFAgTG9hZCA9ICVkXG4iLApAQCAtMTExOCw3ICsxMTM5LDggQEAKIAkJVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0hZQlJJRF9ISUVSUF9NT0RFKTsKIAogCS8qIFRyeSBmb3IgcHJlZmVycmVkIGNvcmUgYmFzZWQgb24gc2V0dGluZ3MuICovCi0JaWYgKGluc3QtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19FTkNPREVSICYmIGhpZXJfbW9kZSkgeworCWlmIChpbnN0LT5zZXNzaW9uX3R5cGUgPT0gTVNNX1ZJRENfRU5DT0RFUiAmJiBoaWVyX21vZGUgJiYKKwkJaW5zdC0+Y2FwYWJpbGl0eS5tYXhfdmlkZW9fY29yZXMubWF4ID49IFZJRENfQ09SRV9JRF8zKSB7CiAJCWlmIChjdXJyZW50X2luc3RfbG9hZCAvIDIgKyBjb3JlMF9sb2FkIDw9IG1heF9mcmVxICYmCiAJCQljdXJyZW50X2luc3RfbG9hZCAvIDIgKyBjb3JlMV9sb2FkIDw9IG1heF9mcmVxKSB7CiAJCQlpZiAoaW5zdC0+Y2xrX2RhdGEud29ya19tb2RlID09IFZJRENfV09SS19NT0RFXzIpIHsKQEAgLTExMjksNyArMTE1MSw4IEBACiAJCX0KIAl9CiAKLQlpZiAoaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIgJiYgaGllcl9tb2RlKSB7CisJaWYgKGluc3QtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19FTkNPREVSICYmIGhpZXJfbW9kZSAmJgorCQlpbnN0LT5jYXBhYmlsaXR5Lm1heF92aWRlb19jb3Jlcy5tYXggPj0gVklEQ19DT1JFX0lEXzMpIHsKIAkJaWYgKGN1cnJlbnRfaW5zdF9scF9sb2FkIC8gMiArCiAJCQkJY29yZTBfbHBfbG9hZCA8PSBtYXhfZnJlcSAmJgogCQkJY3VycmVudF9pbnN0X2xwX2xvYWQgLyAyICsKQEAgLTExODQsNyArMTIwNywzOCBAQAogCiAJcmMgPSBtc21fY29tbV9zY2FsZV9jbG9ja3NfYW5kX2J1cyhpbnN0KTsKIAorCW1zbV9wcmludF9jb3JlX3N0YXR1cyhjb3JlLCBWSURDX0NPUkVfSURfMSk7CisJbXNtX3ByaW50X2NvcmVfc3RhdHVzKGNvcmUsIFZJRENfQ09SRV9JRF8yKTsKKwogCXJldHVybiByYzsKIH0KIAordm9pZCBtc21fcHJpbnRfY29yZV9zdGF0dXMoc3RydWN0IG1zbV92aWRjX2NvcmUgKmNvcmUsIHUzMiBjb3JlX2lkKQoreworCXN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0ID0gTlVMTDsKIAorCWRwcmludGsoVklEQ19QUk9GLCAiSW5zdGFuY2VzIHJ1bm5pbmcgb24gY29yZSAldSIsIGNvcmVfaWQpOworCW11dGV4X2xvY2soJmNvcmUtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5zdCwgJmNvcmUtPmluc3RhbmNlcywgbGlzdCkgeworCisJCWlmICgoaW5zdC0+Y2xrX2RhdGEuY29yZV9pZCAhPSBjb3JlX2lkKSAmJgorCQkJKGluc3QtPmNsa19kYXRhLmNvcmVfaWQgIT0gVklEQ19DT1JFX0lEXzMpKQorCQkJY29udGludWU7CisKKwkJZHByaW50ayhWSURDX1BST0YsCisJCQkiaW5zdCAlcEsgKCU0dXglNHUpIHRvICglNHV4JTR1KSAlM3UgJXMgJXMgJXMgJXMgJWx1XG4iLAorCQkJaW5zdCwKKwkJCWluc3QtPnByb3Aud2lkdGhbT1VUUFVUX1BPUlRdLAorCQkJaW5zdC0+cHJvcC5oZWlnaHRbT1VUUFVUX1BPUlRdLAorCQkJaW5zdC0+cHJvcC53aWR0aFtDQVBUVVJFX1BPUlRdLAorCQkJaW5zdC0+cHJvcC5oZWlnaHRbQ0FQVFVSRV9QT1JUXSwKKwkJCWluc3QtPnByb3AuZnBzLAorCQkJaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIgPyAiRU5DIiA6ICJERUMiLAorCQkJaW5zdC0+Y2xrX2RhdGEud29ya19tb2RlID09IFZJRENfV09SS19NT0RFXzEgPworCQkJCSJXT1JLX01PREVfMSIgOiAiV09SS19NT0RFXzIiLAorCQkJaW5zdC0+ZmxhZ3MgJiBWSURDX0xPV19QT1dFUiA/ICJMUCIgOiAiSFEiLAorCQkJaW5zdC0+ZmxhZ3MgJiBWSURDX1JFQUxUSU1FID8gIlJlYWxUaW1lIiA6ICJOb25SVGltZSIsCisJCQlpbnN0LT5jbGtfZGF0YS5taW5fZnJlcSk7CisJfQorCW11dGV4X3VubG9jaygmY29yZS0+bG9jayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2Nsb2Nrcy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jbG9ja3MuaAppbmRleCA3MDdmMDM0Li4xNDJkNjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2Nsb2Nrcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfY2xvY2tzLmgKQEAgLTIyLDcgKzIyLDggQEAKICNkZWZpbmUgRENWU19ERUNfRVhUUkFfT1VUUFVUX0JVRkZFUlMgNAogCiB2b2lkIG1zbV9jbG9ja19kYXRhX3Jlc2V0KHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KTsKLWludCBtc21fdmlkY191cGRhdGVfb3BlcmF0aW5nX3JhdGUoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpOworaW50IG1zbV92aWRjX3ZhbGlkYXRlX29wZXJhdGluZ19yYXRlKHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0LAorCXUzMiBvcGVyYXRpbmdfcmF0ZSk7CiBpbnQgbXNtX3ZpZGNfZ2V0X2V4dHJhX2J1ZmZfY291bnQoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QsCiAJZW51bSBoYWxfYnVmZmVyIGJ1ZmZlcl90eXBlKTsKIGludCBtc21fZGN2c190cnlfZW5hYmxlKHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KTsKQEAgLTMxLDYgKzMyLDcgQEAKIHZvaWQgbXNtX2NvbW1fZnJlZV9mcmVxX3RhYmxlKHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KTsKIGludCBtc21fdmlkY19kZWNpZGVfd29ya19tb2RlKHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KTsKIGludCBtc21fdmlkY19kZWNpZGVfY29yZV9hbmRfcG93ZXJfbW9kZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCk7Cit2b2lkIG1zbV9wcmludF9jb3JlX3N0YXR1cyhzdHJ1Y3QgbXNtX3ZpZGNfY29yZSAqY29yZSwgdTMyIGNvcmVfaWQpOwogdm9pZCBtc21fdmlkY19jbGVhcl9mcmVxX2VudHJ5KHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0LAogCXUzMiBkZXZpY2VfYWRkcik7CiB2b2lkIG1zbV9jb21tX2ZyZWVfaW5wdXRfY3JfdGFibGUoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfY29tbW9uLmMKaW5kZXggOGZkMWRkMS4uZjhjNTc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2NvbW1vbi5jCkBAIC03MCwxMSArNzAsNiBAQAogCSJFeHRyYWRhdGEgVUJXQyBDUiBzdGF0cyBpbmZvIiwKIH07CiAKLXN0cnVjdCBnZXRwcm9wX2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXZvaWQgKmRhdGE7Ci19OwotCiBzdGF0aWMgdm9pZCBtc21fY29tbV9nZW5lcmF0ZV9zZXNzaW9uX2Vycm9yKHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KTsKIHN0YXRpYyB2b2lkIG1zbV9jb21tX2dlbmVyYXRlX3N5c19lcnJvcihzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfc2Vzc2lvbl9lcnJvcihlbnVtIGhhbF9jb21tYW5kX3Jlc3BvbnNlIGNtZCwgdm9pZCAqZGF0YSk7CkBAIC01NjUsNiArNTYwLDE5IEBACiAJCWRlZmF1bHQ6CiAJCQlnb3RvIHVua25vd25fdmFsdWU7CiAJCX0KKwljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQOgorCQlzd2l0Y2ggKHZhbHVlKSB7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZMSVBfTk9ORToKKwkJCXJldHVybiBIQUxfRkxJUF9OT05FOworCQljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX0hPUkk6CisJCQlyZXR1cm4gSEFMX0ZMSVBfSE9SSVpPTlRBTDsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fRkxJUF9WRVJUOgorCQkJcmV0dXJuIEhBTF9GTElQX1ZFUlRJQ0FMOworCQljYXNlIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX0JPVEg6CisJCQlyZXR1cm4gSEFMX0ZMSVBfQk9USDsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gdW5rbm93bl92YWx1ZTsKKwkJfQogCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREU6CiAJCXN3aXRjaCAodmFsdWUpIHsKIAkJY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEOgpAQCAtOTU1LDYgKzk2Myw5IEBACiAJY2FzZSBWNEwyX1BJWF9GTVRfTlYxMl9UUDEwX1VCV0M6CiAJCWZvcm1hdCA9IEhBTF9DT0xPUl9GT1JNQVRfTlYxMl9UUDEwX1VCV0M7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9QSVhfRk1UX1NERV9ZX0NCQ1JfSDJWMl9QMDEwOgorCQlmb3JtYXQgPSBIQUxfQ09MT1JfRk9STUFUX1AwMTA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWZvcm1hdCA9IEhBTF9VTlVTRURfQ09MT1I7CiAJCWJyZWFrOwpAQCAtMTQzOSw2ICsxNDUwLDkgQEAKIAkJCQlWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fTlVNX0JfRlJBTUVTLAogCQkJCSZpbnN0LT5jYXBhYmlsaXR5LmJmcmFtZSk7CiAJfQorCW1zbV92aWRjX2NvbW1fdXBkYXRlX2N0cmwoaW5zdCwKKwkJVjRMMl9DSURfTVBFR19WSURDX1ZJREVPX0ZSQU1FX1JBVEUsCisJCSZpbnN0LT5jYXBhYmlsaXR5LmZyYW1lX3JhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfc2Vzc2lvbl9pbml0X2RvbmUoZW51bSBoYWxfY29tbWFuZF9yZXNwb25zZSBjbWQsIHZvaWQgKmRhdGEpCkBAIC0xNjcyLDYgKzE2ODYsMTEgQEAKIAkJZXZlbnRfbm90aWZ5LT5jcm9wX2RhdGEuaGVpZ2h0OwogCWluc3QtPnByb3AuY3JvcF9pbmZvLndpZHRoID0KIAkJZXZlbnRfbm90aWZ5LT5jcm9wX2RhdGEud2lkdGg7CisJLyogSFcgcmV0dXJucyBwcm9ncmVzc2l2ZV9vbmx5IGZsYWcgaW4gcGljX3N0cnVjdC4gKi8KKwlpbnN0LT5waWNfc3RydWN0ID0KKwkJZXZlbnRfbm90aWZ5LT5waWNfc3RydWN0ID8KKwkJTVNNX1ZJRENfUElDX1NUUlVDVF9QUk9HUkVTU0lWRSA6CisJCU1TTV9WSURDX1BJQ19TVFJVQ1RfTUFZQkVfSU5URVJMQUNFRDsKIAogCXB0ciA9ICh1MzIgKilzZXFfY2hhbmdlZF9ldmVudC51LmRhdGE7CiAJcHRyWzBdID0gZXZlbnRfbm90aWZ5LT5oZWlnaHQ7CkBAIC0yMTYzLDYgKzIxODIsNyBAQAogCQkJCSJHb3QgU1lTX0VSUiBidXQgdW5hYmxlIHRvIGlkZW50aWZ5IGNvcmVcbiIpOwogCQlyZXR1cm47CiAJfQorCWhkZXYgPSBjb3JlLT5kZXZpY2U7CiAKIAltdXRleF9sb2NrKCZjb3JlLT5sb2NrKTsKIAlpZiAoY29yZS0+c3RhdGUgPT0gVklEQ19DT1JFX1VOSU5JVCkgewpAQCAtMjE4MSw5ICsyMjAxLDkgQEAKIAkJCSIlczogU2VuZCBzeXMgZXJyb3IgZm9yIGluc3QgJXBLXG4iLCBfX2Z1bmNfXywgaW5zdCk7CiAJCWNoYW5nZV9pbnN0X3N0YXRlKGluc3QsIE1TTV9WSURDX0NPUkVfSU5WQUxJRCk7CiAJCW1zbV92aWRjX3F1ZXVlX3Y0bDJfZXZlbnQoaW5zdCwgVjRMMl9FVkVOVF9NU01fVklEQ19TWVNfRVJST1IpOwotCQltc21fY29tbV9wcmludF9pbnN0X2luZm8oaW5zdCk7CisJCWlmICghY29yZS0+dHJpZ2dlcl9zc3IpCisJCQltc21fY29tbV9wcmludF9pbnN0X2luZm8oaW5zdCk7CiAJfQotCWhkZXYgPSBjb3JlLT5kZXZpY2U7CiAJZHByaW50ayhWSURDX0RCRywgIkNhbGxpbmcgY29yZV9yZWxlYXNlXG4iKTsKIAlyYyA9IGNhbGxfaGZpX29wKGhkZXYsIGNvcmVfcmVsZWFzZSwgaGRldi0+aGZpX2RldmljZV9kYXRhKTsKIAlpZiAocmMpIHsKQEAgLTIyNzQsNiArMjI5NCw4IEBACiAJbXV0ZXhfbG9jaygmaW5zdC0+YnVmcVtwb3J0XS5sb2NrKTsKIAlmb3VuZCA9IGZhbHNlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodmIsICZxLT5xdWV1ZWRfbGlzdCwgcXVldWVkX2VudHJ5KSB7CisJCWlmICh2Yi0+c3RhdGUgIT0gVkIyX0JVRl9TVEFURV9BQ1RJVkUpCisJCQljb250aW51ZTsKIAkJaWYgKG1zbV9jb21tX2NvbXBhcmVfdmIyX3BsYW5lcyhpbnN0LCBtYnVmLCB2YikpIHsKIAkJCWZvdW5kID0gdHJ1ZTsKIAkJCWJyZWFrOwpAQCAtMjU2OSw2ICsyNTkxLDExIEBACiAJfQogCXZiLT50aW1lc3RhbXAgPSAodGltZV91c2VjICogTlNFQ19QRVJfVVNFQyk7CiAKKwlpZiAoaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0RFQ09ERVIpIHsKKwkJbXNtX2NvbW1fc3RvcmVfbWFya19kYXRhKCZpbnN0LT5mYmRfZGF0YSwgdmItPmluZGV4LAorCQkJZmlsbF9idWZfZG9uZS0+bWFya19kYXRhLCBmaWxsX2J1Zl9kb25lLT5tYXJrX3RhcmdldCk7CisJfQorCiAJZXh0cmFfaWR4ID0gRVhUUkFEQVRBX0lEWChpbnN0LT5idWZxW0NBUFRVUkVfUE9SVF0ubnVtX3BsYW5lcyk7CiAJaWYgKGV4dHJhX2lkeCAmJiBleHRyYV9pZHggPCBWSURFT19NQVhfUExBTkVTKQogCQl2Yi0+cGxhbmVzW2V4dHJhX2lkeF0uYnl0ZXN1c2VkID0gdmItPnBsYW5lc1tleHRyYV9pZHhdLmxlbmd0aDsKQEAgLTMwMDgsNiArMzAzNSwyMyBAQAogCXJldHVybiBtc21fdmlkY19kZWluaXRfY29yZShpbnN0KTsKIH0KIAorc3RhdGljIGludCBtc21fY29tbV9zZXNzaW9uX2luaXRfZG9uZShpbnQgZmxpcHBlZF9zdGF0ZSwKKwlzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCkKK3sKKwlpbnQgcmM7CisKKwlkcHJpbnRrKFZJRENfREJHLCAiaW5zdCAlcEs6IHdhaXRpbmcgZm9yIHNlc3Npb24gaW5pdCBkb25lXG4iLCBpbnN0KTsKKwlyYyA9IHdhaXRfZm9yX3N0YXRlKGluc3QsIGZsaXBwZWRfc3RhdGUsIE1TTV9WSURDX09QRU5fRE9ORSwKKwkJCUhBTF9TRVNTSU9OX0lOSVRfRE9ORSk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoVklEQ19FUlIsICJTZXNzaW9uIGluaXQgZmFpbGVkIGZvciBpbnN0ICVwS1xuIiwgaW5zdCk7CisJCW1zbV9jb21tX2dlbmVyYXRlX3N5c19lcnJvcihpbnN0KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBtc21fY29tbV9zZXNzaW9uX2luaXQoaW50IGZsaXBwZWRfc3RhdGUsCiAJc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpCiB7CkBAIC0zMzQ1LDcgKzMzODksNyBAQAogCWVudW0gaGFsX2J1ZmZlciBidWZmZXJfdHlwZSkKIHsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCBpbnRlcm5hbF9idWYgKmJpbmZvOworCXN0cnVjdCBpbnRlcm5hbF9idWYgKmJpbmZvID0gTlVMTDsKIAl1MzIgc21lbV9mbGFncyA9IDAsIGJ1ZmZlcl9zaXplOwogCXN0cnVjdCBoYWxfYnVmZmVyX3JlcXVpcmVtZW50cyAqb3V0cHV0X2J1ZiwgKmV4dHJhZGF0YV9idWY7CiAJaW50IGk7CkBAIC0zNDU0LDEwICszNDk4LDEwIEBACiAJfQogCXJldHVybiByYzsKIGZhaWxfc2V0X2J1ZmZlcnM6Ci0Ja2ZyZWUoYmluZm8pOwotZmFpbF9remFsbG9jOgogCW1zbV9jb21tX3NtZW1fZnJlZShpbnN0LCAmYmluZm8tPnNtZW0pOwogZXJyX25vX21lbToKKwlrZnJlZShiaW5mbyk7CitmYWlsX2t6YWxsb2M6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zNjkwLDggKzM3MzQsNyBAQAogCQlpZiAocmMgfHwgc3RhdGUgPD0gZ2V0X2ZsaXBwZWRfc3RhdGUoaW5zdC0+c3RhdGUsIHN0YXRlKSkKIAkJCWJyZWFrOwogCWNhc2UgTVNNX1ZJRENfT1BFTl9ET05FOgotCQlyYyA9IHdhaXRfZm9yX3N0YXRlKGluc3QsIGZsaXBwZWRfc3RhdGUsIE1TTV9WSURDX09QRU5fRE9ORSwKLQkJCUhBTF9TRVNTSU9OX0lOSVRfRE9ORSk7CisJCXJjID0gbXNtX2NvbW1fc2Vzc2lvbl9pbml0X2RvbmUoZmxpcHBlZF9zdGF0ZSwgaW5zdCk7CiAJCWlmIChyYyB8fCBzdGF0ZSA8PSBnZXRfZmxpcHBlZF9zdGF0ZShpbnN0LT5zdGF0ZSwgc3RhdGUpKQogCQkJYnJlYWs7CiAJY2FzZSBNU01fVklEQ19MT0FEX1JFU09VUkNFUzoKQEAgLTM4NzEsMTggKzM5MTQsMTMgQEAKIAkJcmMgPSBtc21fY29tbV9zZXNzaW9uX2NvbnRpbnVlKGluc3QpOwogCQlicmVhazsKIAl9CisJLyogVGhpcyBjYXNlIGFsc28gZm9yIFY0TDJfRU5DX0NNRF9TVE9QICovCiAJY2FzZSBWNEwyX0RFQ19DTURfU1RPUDoKIAl7CiAJCXN0cnVjdCBlb3NfYnVmICpiaW5mbyA9IE5VTEw7CiAJCXUzMiBzbWVtX2ZsYWdzID0gMDsKIAogCQlnZXRfaW5zdChpbnN0LT5jb3JlLCBpbnN0KTsKLQkJaWYgKGluc3QtPnNlc3Npb25fdHlwZSAhPSBNU01fVklEQ19ERUNPREVSKSB7Ci0JCQlkcHJpbnRrKFZJRENfREJHLAotCQkJCSJOb24tRGVjb2RlciBzZXNzaW9uLiBERUNfU1RPUCBpcyBub3QgdmFsaWRcbiIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9CiAKIAkJYmluZm8gPSBremFsbG9jKHNpemVvZigqYmluZm8pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFiaW5mbykgewpAQCAtMzk1NSw5ICszOTkzLDYgQEAKIAlkYXRhLT5jbG50X2RhdGEgPSBkYXRhLT5kZXZpY2VfYWRkcjsKIAogCWlmICh2Yi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKLQkJYm9vbCBwaWNfZGVjb2RpbmdfbW9kZSA9IG1zbV9jb21tX2dfY3RybF9mb3JfaWQoaW5zdCwKLQkJCQlWNEwyX0NJRF9NUEVHX1ZJRENfVklERU9fUElDVFlQRV9ERUNfTU9ERSk7Ci0KIAkJZGF0YS0+YnVmZmVyX3R5cGUgPSBIQUxfQlVGRkVSX0lOUFVUOwogCQlkYXRhLT5maWxsZWRfbGVuID0gdmItPnBsYW5lc1swXS5ieXRlc3VzZWQ7CiAJCWRhdGEtPm9mZnNldCA9IHZiLT5wbGFuZXNbMF0uZGF0YV9vZmZzZXQ7CkBAIC0zOTc0LDEzICs0MDA5LDEwIEBACiAJCWlmICh2YnVmLT5mbGFncyAmIFY0TDJfUUNPTV9CVUZfVElNRVNUQU1QX0lOVkFMSUQpCiAJCQlkYXRhLT50aW1lc3RhbXAgPSBMTE9OR19NQVg7CiAKLQkJLyogWFhYOiBUaGlzIGlzIGEgZGlydHkgaGFjayBuZWNlc3NpdGF0ZWQgYnkgdGhlIGZpcm13YXJlLAotCQkgKiB3aGljaCByZWZ1c2VzIHRvIGlzc3VlIEZCRHMgZm9yIG5vbiBJLWZyYW1lcyBpbiBQaWN0dXJlIFR5cGUKLQkJICogRGVjb2RpbmcgbW9kZSwgdW5sZXNzIHdlIHBhc3MgaW4gbm9uLXplcm8gdmFsdWUgaW4gbWFya19kYXRhCi0JCSAqIGFuZCBtYXJrX3RhcmdldC4KLQkJICovCi0JCWRhdGEtPm1hcmtfZGF0YSA9IGRhdGEtPm1hcmtfdGFyZ2V0ID0KLQkJCXBpY19kZWNvZGluZ19tb2RlID8gMHhkZWFkYmVlZiA6IDA7CisJCWlmIChpbnN0LT5zZXNzaW9uX3R5cGUgPT0gTVNNX1ZJRENfREVDT0RFUikgeworCQkJbXNtX2NvbW1fZmV0Y2hfbWFya19kYXRhKCZpbnN0LT5ldGJfZGF0YSwgdmItPmluZGV4LAorCQkJCSZkYXRhLT5tYXJrX2RhdGEsICZkYXRhLT5tYXJrX3RhcmdldCk7CisJCX0KIAogCX0gZWxzZSBpZiAodmItPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgewogCQlkYXRhLT5idWZmZXJfdHlwZSA9IG1zbV9jb21tX2dldF9oYWxfb3V0cHV0X2J1ZmZlcihpbnN0KTsKQEAgLTQ3NTAsNiArNDc4Miw3IEBACiAJbXV0ZXhfbG9jaygmaW5zdC0+ZW9zYnVmcy5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmLCBuZXh0LCAmaW5zdC0+ZW9zYnVmcy5saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZidWYtPmxpc3QpOworCQltc21fY29tbV9zbWVtX2ZyZWUoaW5zdCwgJmJ1Zi0+c21lbSk7CiAJCWtmcmVlKGJ1Zik7CiAJfQogCUlOSVRfTElTVF9IRUFEKCZpbnN0LT5lb3NidWZzLmxpc3QpOwpAQCAtNTI5Nyw4ICs1MzMwLDcgQEAKIAkJTE9BRF9DQUxDX0lHTk9SRV9OT05fUkVBTFRJTUVfTE9BRDsKIAogCWlmIChpbnN0LT5zdGF0ZSA9PSBNU01fVklEQ19PUEVOX0RPTkUpIHsKLQkJbWF4X2xvYWRfYWRqID0gaW5zdC0+Y29yZS0+cmVzb3VyY2VzLm1heF9sb2FkICsKLQkJCWluc3QtPmNhcGFiaWxpdHkubWJzX3Blcl9mcmFtZS5tYXg7CisJCW1heF9sb2FkX2FkaiA9IGluc3QtPmNvcmUtPnJlc291cmNlcy5tYXhfbG9hZDsKIAkJbnVtX21ic19wZXJfc2VjID0gbXNtX2NvbW1fZ2V0X2xvYWQoaW5zdC0+Y29yZSwKIAkJCQkJTVNNX1ZJRENfREVDT0RFUiwgcXVpcmtzKTsKIAkJbnVtX21ic19wZXJfc2VjICs9IG1zbV9jb21tX2dldF9sb2FkKGluc3QtPmNvcmUsCkBAIC01NDgwLDEwICs1NTEyLDYgQEAKIAkJCWNhcGFiaWxpdHktPndpZHRoLm1heCwgY2FwYWJpbGl0eS0+aGVpZ2h0Lm1heCk7CiAJCQlyYyA9IC1FTk9UU1VQUDsKIAkJfQotCi0JCWlmICghcmMgJiYgbXNtX3ZpZGNfY2hlY2tfc2NhbGluZ19zdXBwb3J0ZWQoaW5zdCkpIHsKLQkJCXJjID0gLUVOT1RTVVBQOwotCQl9CiAJfQogCWlmIChyYykgewogCQlkcHJpbnRrKFZJRENfRVJSLApAQCAtNTk3MSw2ICs1OTk5LDEwIEBACiAJCQlnb3RvIHNlc3NfY29udGludWVfZmFpbDsKIAkJfQogCQlpbnN0LT5pbl9yZWNvbmZpZyA9IGZhbHNlOworCQlpbnN0LT5wcm9wLmhlaWdodFtDQVBUVVJFX1BPUlRdID0gaW5zdC0+cmVjb25maWdfaGVpZ2h0OworCQlpbnN0LT5wcm9wLndpZHRoW0NBUFRVUkVfUE9SVF0gPSBpbnN0LT5yZWNvbmZpZ193aWR0aDsKKwkJaW5zdC0+cHJvcC5oZWlnaHRbT1VUUFVUX1BPUlRdID0gaW5zdC0+cmVjb25maWdfaGVpZ2h0OworCQlpbnN0LT5wcm9wLndpZHRoW09VVFBVVF9QT1JUXSA9IGluc3QtPnJlY29uZmlnX3dpZHRoOwogCX0gZWxzZSBpZiAoaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIpIHsKIAkJZHByaW50ayhWSURDX0RCRywKIAkJCQkic2Vzc2lvbl9jb250aW51ZSBub3Qgc3VwcG9ydGVkIGZvciBlbmNvZGVyIik7CkBAIC02MDA5LDYgKzYwNDEsMTEgQEAKIAlyZXR1cm4gVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTJfQlBQMTBfVUJXQywgd2lkdGgsIGhlaWdodCk7CiB9CiAKK3UzMiBnZXRfZnJhbWVfc2l6ZV9wMDEwKGludCBwbGFuZSwgdTMyIGhlaWdodCwgdTMyIHdpZHRoKQoreworCXJldHVybiBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfUDAxMCwgd2lkdGgsIGhlaWdodCk7Cit9CisKIAogdm9pZCBwcmludF92aWRjX2J1ZmZlcih1MzIgdGFnLCBjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0LAogCQlzdHJ1Y3QgbXNtX3ZpZGNfYnVmZmVyICptYnVmKQpAQCAtNjI5NywxMCArNjMzNCwyNiBAQAogCX0KIAogCW11dGV4X2xvY2soJmluc3QtPnJlZ2lzdGVyZWRidWZzLmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobWJ1ZiwgJmluc3QtPnJlZ2lzdGVyZWRidWZzLmxpc3QsIGxpc3QpIHsKLQkJaWYgKG1zbV9jb21tX2NvbXBhcmVfZG1hX3BsYW5lcyhpbnN0LCBtYnVmLCBkbWFfcGxhbmVzKSkgewotCQkJZm91bmQgPSB0cnVlOwotCQkJYnJlYWs7CisJaWYgKGluc3QtPnNlc3Npb25fdHlwZSA9PSBNU01fVklEQ19ERUNPREVSKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobWJ1ZiwgJmluc3QtPnJlZ2lzdGVyZWRidWZzLmxpc3QsIGxpc3QpIHsKKwkJCWlmIChtc21fY29tbV9jb21wYXJlX2RtYV9wbGFuZXMoaW5zdCwgbWJ1ZiwKKwkJCQkJZG1hX3BsYW5lcykpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBmb3IgZW5jb2RlciwgY2xpZW50IG1heSBxdWV1ZSB0aGUgc2FtZSBidWZmZXIgd2l0aCBkaWZmZXJlbnQKKwkJICogZmQgYmVmb3JlIGRyaXZlciByZXR1cm5lZCBvbGQgYnVmZmVyIHRvIHRoZSBjbGllbnQuIFRoaXMKKwkJICogYnVmZmVyIHNob3VsZCBiZSB0cmVhdGVkIGFzIG5ldyBidWZmZXIuIFNlYXJjaCB0aGUgbGlzdCB3aXRoCisJCSAqIGZkIHNvIHRoYXQgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIG5ldyBtc21fdmlkY19idWZmZXIuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1idWYsICZpbnN0LT5yZWdpc3RlcmVkYnVmcy5saXN0LCBsaXN0KSB7CisJCQlpZiAobXNtX2NvbW1fY29tcGFyZV92YjJfcGxhbmVzKGluc3QsIG1idWYsIHZiMikpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTY2MTAsMyArNjY2Myw5MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgbXNtX2NvbW1fc3RvcmVfbWFya19kYXRhKHN0cnVjdCBtc21fdmlkY19saXN0ICpkYXRhX2xpc3QsCisJCXUzMiBpbmRleCwgdTMyIG1hcmtfZGF0YSwgdTMyIG1hcmtfdGFyZ2V0KQoreworCXN0cnVjdCBtc21fdmlkY19idWZfZGF0YSAqcGRhdGEgPSBOVUxMOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWlmICghZGF0YV9saXN0KSB7CisJCWRwcmludGsoVklEQ19FUlIsICIlczogaW52YWxpZCBwYXJhbXMgJXBLXG4iLAorCQkJX19mdW5jX18sIGRhdGFfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZkYXRhX2xpc3QtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGRhdGEsICZkYXRhX2xpc3QtPmxpc3QsIGxpc3QpIHsKKwkJaWYgKHBkYXRhLT5pbmRleCA9PSBpbmRleCkgeworCQkJcGRhdGEtPm1hcmtfZGF0YSA9IG1hcmtfZGF0YTsKKwkJCXBkYXRhLT5tYXJrX3RhcmdldCA9IG1hcmtfdGFyZ2V0OworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGRhdGEpICB7CisJCQlkcHJpbnRrKFZJRENfV0FSTiwgIiVzOiBtYWxsb2MgZmFpbHVyZS5cbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQlwZGF0YS0+aW5kZXggPSBpbmRleDsKKwkJcGRhdGEtPm1hcmtfZGF0YSA9IG1hcmtfZGF0YTsKKwkJcGRhdGEtPm1hcmtfdGFyZ2V0ID0gbWFya190YXJnZXQ7CisJCWxpc3RfYWRkX3RhaWwoJnBkYXRhLT5saXN0LCAmZGF0YV9saXN0LT5saXN0KTsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhX2xpc3QtPmxvY2spOworfQorCit2b2lkIG1zbV9jb21tX2ZldGNoX21hcmtfZGF0YShzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCAqZGF0YV9saXN0LAorCQl1MzIgaW5kZXgsIHUzMiAqbWFya19kYXRhLCB1MzIgKm1hcmtfdGFyZ2V0KQoreworCXN0cnVjdCBtc21fdmlkY19idWZfZGF0YSAqcGRhdGEgPSBOVUxMOworCisJaWYgKCFkYXRhX2xpc3QgfHwgIW1hcmtfZGF0YSB8fCAhbWFya190YXJnZXQpIHsKKwkJZHByaW50ayhWSURDX0VSUiwgIiVzOiBpbnZhbGlkIHBhcmFtcyAlcEsgJXBLICVwS1xuIiwKKwkJCV9fZnVuY19fLCBkYXRhX2xpc3QsIG1hcmtfZGF0YSwgbWFya190YXJnZXQpOworCQlyZXR1cm47CisJfQorCisJKm1hcmtfZGF0YSA9ICptYXJrX3RhcmdldCA9IDA7CisJbXV0ZXhfbG9jaygmZGF0YV9saXN0LT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkYXRhLCAmZGF0YV9saXN0LT5saXN0LCBsaXN0KSB7CisJCWlmIChwZGF0YS0+aW5kZXggPT0gaW5kZXgpIHsKKwkJCSptYXJrX2RhdGEgPSBwZGF0YS0+bWFya19kYXRhOworCQkJKm1hcmtfdGFyZ2V0ID0gcGRhdGEtPm1hcmtfdGFyZ2V0OworCQkJLyogY2xlYXIgYWZ0ZXIgZmV0Y2ggKi8KKwkJCXBkYXRhLT5tYXJrX2RhdGEgPSBwZGF0YS0+bWFya190YXJnZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZkYXRhX2xpc3QtPmxvY2spOworfQorCitpbnQgbXNtX2NvbW1fcmVsZWFzZV9tYXJrX2RhdGEoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpCit7CisJc3RydWN0IG1zbV92aWRjX2J1Zl9kYXRhICpwZGF0YSwgKm5leHQ7CisKKwlpZiAoIWluc3QpIHsKKwkJZHByaW50ayhWSURDX0VSUiwgIiVzOiBpbnZhbGlkIHBhcmFtcyAlcEtcbiIsCisJCQlfX2Z1bmNfXywgaW5zdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmluc3QtPmV0Yl9kYXRhLmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZGF0YSwgbmV4dCwgJmluc3QtPmV0Yl9kYXRhLmxpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnBkYXRhLT5saXN0KTsKKwkJa2ZyZWUocGRhdGEpOworCX0KKwltdXRleF91bmxvY2soJmluc3QtPmV0Yl9kYXRhLmxvY2spOworCisJbXV0ZXhfbG9jaygmaW5zdC0+ZmJkX2RhdGEubG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBkYXRhLCBuZXh0LCAmaW5zdC0+ZmJkX2RhdGEubGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcGRhdGEtPmxpc3QpOworCQlrZnJlZShwZGF0YSk7CisJfQorCW11dGV4X3VubG9jaygmaW5zdC0+ZmJkX2RhdGEubG9jayk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfY29tbW9uLmgKaW5kZXggMDVlMmI5MS4uNzlmM2M2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2NvbW1vbi5oCkBAIC0yMCw2ICsyMCwxMSBAQAogCXN0cnVjdCB2YjJfYnVmZmVyICp2YjsKIH07CiAKK3N0cnVjdCBnZXRwcm9wX2J1ZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXZvaWQgKmRhdGE7Cit9OworCiBleHRlcm4gY29uc3QgY2hhciAqY29uc3QgbXBlZ192aWRlb192aWRjX2V4dHJhZGF0YVtdOwogCiBlbnVtIGxvYWRfY2FsY19xdWlya3MgewpAQCAtMTE0LDYgKzExOSw3IEBACiB1MzIgZ2V0X2ZyYW1lX3NpemVfcmdiYShpbnQgcGxhbmUsIHUzMiBoZWlnaHQsIHUzMiB3aWR0aCk7CiB1MzIgZ2V0X2ZyYW1lX3NpemVfbnYyMShpbnQgcGxhbmUsIHUzMiBoZWlnaHQsIHUzMiB3aWR0aCk7CiB1MzIgZ2V0X2ZyYW1lX3NpemVfdHAxMF91YndjKGludCBwbGFuZSwgdTMyIGhlaWdodCwgdTMyIHdpZHRoKTsKK3UzMiBnZXRfZnJhbWVfc2l6ZV9wMDEwKGludCBwbGFuZSwgdTMyIGhlaWdodCwgdTMyIHdpZHRoKTsKIHN0cnVjdCB2YjJfYnVmZmVyICptc21fY29tbV9nZXRfdmJfdXNpbmdfdmlkY19idWZmZXIoCiAJCXN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0LCBzdHJ1Y3QgbXNtX3ZpZGNfYnVmZmVyICptYnVmKTsKIHN0cnVjdCBtc21fdmlkY19idWZmZXIgKm1zbV9jb21tX2dldF9idWZmZXJfdXNpbmdfZGV2aWNlX3BsYW5lcygKQEAgLTE1NCw1ICsxNjAsMTAgQEAKIAkJc3RydWN0IHY0bDJfYnVmZmVyICp2NGwyKTsKIHZvaWQga3JlZl9wdXRfbWJ1ZihzdHJ1Y3QgbXNtX3ZpZGNfYnVmZmVyICptYnVmKTsKIGJvb2wga3JlZl9nZXRfbWJ1ZihzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwgc3RydWN0IG1zbV92aWRjX2J1ZmZlciAqbWJ1Zik7Cit2b2lkIG1zbV9jb21tX3N0b3JlX21hcmtfZGF0YShzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCAqZGF0YV9saXN0LAorCQl1MzIgaW5kZXgsIHUzMiBtYXJrX2RhdGEsIHUzMiBtYXJrX3RhcmdldCk7Cit2b2lkIG1zbV9jb21tX2ZldGNoX21hcmtfZGF0YShzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCAqZGF0YV9saXN0LAorCQl1MzIgaW5kZXgsIHUzMiAqbWFya19kYXRhLCB1MzIgKm1hcmtfdGFyZ2V0KTsKK2ludCBtc21fY29tbV9yZWxlYXNlX21hcmtfZGF0YShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19kZWJ1Zy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19kZWJ1Zy5jCmluZGV4IDk4MTIwYWMuLjIxNWJiNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfZGVidWcuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2RlYnVnLmMKQEAgLTMzLDQ0ICszMywzMSBAQAogCiAjZGVmaW5lIE1BWF9EQkdfQlVGX1NJWkUgNDA5NgogCi1zdHJ1Y3QgZGVidWdfYnVmZmVyIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQljaGFyIHB0cltNQVhfREJHX0JVRl9TSVpFXTsKLQljaGFyICpjdXJyOwotCXUzMiBmaWxsZWRfc2l6ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfYnVmZmVyIGRiZ19idWY7Ci0KLSNkZWZpbmUgSU5JVF9EQkdfQlVGKF9fYnVmKSAoeyBcCi0JX19idWYuY3VyciA9IF9fYnVmLnB0cjtcCi0JX19idWYuZmlsbGVkX3NpemUgPSAwOyBcCi19KQotCiAjZGVmaW5lIERZTkFNSUNfQlVGX09XTkVSKF9fYmluZm8pICh7IFwKIAlhdG9taWNfcmVhZCgmX19iaW5mby0+cmVmX2NvdW50KSA+PSAyID8gInZpZGVvIGRyaXZlciIgOiAiZmlybXdhcmUiO1wKIH0pCiAKK3N0cnVjdCBjb3JlX2luc3RfcGFpciB7CisJc3RydWN0IG1zbV92aWRjX2NvcmUgKmNvcmU7CisJc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3Q7Cit9OworCiBzdGF0aWMgaW50IGNvcmVfaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgd3JpdGVfc3RyKHN0cnVjdCBkZWJ1Z19idWZmZXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqZm10LCAuLi4pCitzdGF0aWMgdTMyIHdyaXRlX3N0cihjaGFyICpidWZmZXIsCisJCXNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7Ci0JdTMyIHNpemU7Ci0KLQljaGFyICpjdXJyID0gYnVmZmVyLT5jdXJyOwotCWNoYXIgKmVuZCA9IGJ1ZmZlci0+cHRyICsgTUFYX0RCR19CVUZfU0laRTsKKwl1MzIgbGVuOwogCiAJdmFfc3RhcnQoYXJncywgZm10KTsKLQlzaXplID0gdnNjbnByaW50ZihjdXJyLCBlbmQgLSBjdXJyLCBmbXQsIGFyZ3MpOworCWxlbiA9IHZzY25wcmludGYoYnVmZmVyLCBzaXplLCBmbXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKLQlidWZmZXItPmN1cnIgKz0gc2l6ZTsKLQlidWZmZXItPmZpbGxlZF9zaXplICs9IHNpemU7Ci0JcmV0dXJuIHNpemU7CisJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgY29yZV9pbmZvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCkBAIC03OSw2ICs2Niw3IEBACiAJc3RydWN0IG1zbV92aWRjX2NvcmUgKmNvcmUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhmaV9kZXZpY2UgKmhkZXY7CiAJc3RydWN0IGhhbF9md19pbmZvIGZ3X2luZm8gPSB7IHswfSB9OworCWNoYXIgKmRidWYsICpjdXIsICplbmQ7CiAJaW50IGkgPSAwLCByYyA9IDA7CiAJc3NpemVfdCBsZW4gPSAwOwogCkBAIC04NiwzNiArNzQsNDYgQEAKIAkJZHByaW50ayhWSURDX0VSUiwgIkludmFsaWQgcGFyYW1zLCBjb3JlOiAlcEtcbiIsIGNvcmUpOwogCQlyZXR1cm4gMDsKIAl9CisKKwlkYnVmID0ga3phbGxvYyhNQVhfREJHX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRidWYpIHsKKwkJZHByaW50ayhWSURDX0VSUiwgIiVzOiBBbGxvY2F0aW9uIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWN1ciA9IGRidWY7CisJZW5kID0gY3VyICsgTUFYX0RCR19CVUZfU0laRTsKIAloZGV2ID0gY29yZS0+ZGV2aWNlOwogCi0JbXV0ZXhfbG9jaygmZGJnX2J1Zi5sb2NrKTsKLQlJTklUX0RCR19CVUYoZGJnX2J1Zik7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiQ09SRSAlZDogJXBLXG4iLCBjb3JlLT5pZCwgY29yZSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiQ29yZSBzdGF0ZTogJWRcbiIsIGNvcmUtPnN0YXRlKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIkNPUkUgJWQ6ICVwS1xuIiwgY29yZS0+aWQsIGNvcmUpOworCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAiQ29yZSBzdGF0ZTogJWRcbiIsIGNvcmUtPnN0YXRlKTsKIAlyYyA9IGNhbGxfaGZpX29wKGhkZXYsIGdldF9md19pbmZvLCBoZGV2LT5oZmlfZGV2aWNlX2RhdGEsICZmd19pbmZvKTsKIAlpZiAocmMpIHsKIAkJZHByaW50ayhWSURDX1dBUk4sICJGYWlsZWQgdG8gcmVhZCBGVyBpbmZvXG4iKTsKIAkJZ290byBlcnJfZndfaW5mbzsKIAl9CiAKLQl3cml0ZV9zdHIoJmRiZ19idWYsICJGVyB2ZXJzaW9uIDogJXNcbiIsICZmd19pbmZvLnZlcnNpb24pOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgImJhc2UgYWRkcjogMHgleFxuIiwgZndfaW5mby5iYXNlX2FkZHIpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgInJlZ2lzdGVyX2Jhc2U6IDB4JXhcbiIsIGZ3X2luZm8ucmVnaXN0ZXJfYmFzZSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAicmVnaXN0ZXJfc2l6ZTogJXVcbiIsIGZ3X2luZm8ucmVnaXN0ZXJfc2l6ZSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiaXJxOiAldVxuIiwgZndfaW5mby5pcnEpOworCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsCisJCSJGVyB2ZXJzaW9uIDogJXNcbiIsICZmd19pbmZvLnZlcnNpb24pOworCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsCisJCSJiYXNlIGFkZHI6IDB4JXhcbiIsIGZ3X2luZm8uYmFzZV9hZGRyKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLAorCQkicmVnaXN0ZXJfYmFzZTogMHgleFxuIiwgZndfaW5mby5yZWdpc3Rlcl9iYXNlKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLAorCQkicmVnaXN0ZXJfc2l6ZTogJXVcbiIsIGZ3X2luZm8ucmVnaXN0ZXJfc2l6ZSk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImlycTogJXVcbiIsIGZ3X2luZm8uaXJxKTsKIAogZXJyX2Z3X2luZm86CiAJZm9yIChpID0gU1lTX01TR19TVEFSVDsgaSA8IFNZU19NU0dfRU5EOyBpKyspIHsKLQkJd3JpdGVfc3RyKCZkYmdfYnVmLCAiY29tcGxldGlvbnNbJWRdOiAlc1xuIiwgaSwKKwkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImNvbXBsZXRpb25zWyVkXTogJXNcbiIsIGksCiAJCQljb21wbGV0aW9uX2RvbmUoJmNvcmUtPmNvbXBsZXRpb25zW1NZU19NU0dfSU5ERVgoaSldKSA/CiAJCQkicGVuZGluZyIgOiAiZG9uZSIpOwogCX0KIAlsZW4gPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLAotCQkJZGJnX2J1Zi5wdHIsIGRiZ19idWYuZmlsbGVkX3NpemUpOworCQkJZGJ1ZiwgY3VyIC0gZGJ1Zik7CiAKLQltdXRleF91bmxvY2soJmRiZ19idWYubG9jayk7CisJa2ZyZWUoZGJ1Zik7CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMTc1LDcgKzE3Myw2IEBACiAJYm9vbCBvayA9IGZhbHNlOwogCXN0cnVjdCBkZW50cnkgKmRpciA9IE5VTEw7CiAKLQltdXRleF9pbml0KCZkYmdfYnVmLmxvY2spOwogCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigibXNtX3ZpZGMiLCBOVUxMKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoZGlyKSkgewogCQlkaXIgPSBOVUxMOwpAQCAtMjU2LDEzICsyNTMsMTYgQEAKIAogc3RhdGljIGludCBpbnN0X2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlkcHJpbnRrKFZJRENfSU5GTywgIk9wZW4gaW5vZGUgcHRyOiAlcEtcbiIsIGlub2RlLT5pX3ByaXZhdGUpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHVibGlzaF91bnJlbGVhc2VkX3JlZmVyZW5jZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCkKK3N0YXRpYyBpbnQgcHVibGlzaF91bnJlbGVhc2VkX3JlZmVyZW5jZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwKKwkJY2hhciAqKmRidWYsIGNoYXIgKmVuZCkKIHsKIAlzdHJ1Y3QgbXNtX3ZpZGNfYnVmZmVyICp0ZW1wID0gTlVMTDsKKwljaGFyICpjdXIgPSAqZGJ1ZjsKIAogCWlmICghaW5zdCkgewogCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IGludmFsaWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKQEAgLTI3MCwxNCArMjcwLDE0IEBACiAJfQogCiAJaWYgKGluc3QtPmJ1ZmZlcl9tb2RlX3NldFtDQVBUVVJFX1BPUlRdID09IEhBTF9CVUZGRVJfTU9ERV9EWU5BTUlDKSB7Ci0JCXdyaXRlX3N0cigmZGJnX2J1ZiwgIlBlbmRpbmcgYnVmZmVyIHJlZmVyZW5jZXM6XG4iKTsKKwkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIlBlbmRpbmcgYnVmZmVyIHJlZmVyZW5jZXNcbiIpOwogCiAJCW11dGV4X2xvY2soJmluc3QtPnJlZ2lzdGVyZWRidWZzLmxvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXAsICZpbnN0LT5yZWdpc3RlcmVkYnVmcy5saXN0LCBsaXN0KSB7CiAJCQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIyID0gJnRlbXAtPnZ2Yi52YjJfYnVmOwogCiAJCQlpZiAodmIyLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKLQkJCQl3cml0ZV9zdHIoJmRiZ19idWYsCisJCQkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwKIAkJCQkiXHRidWZmZXI6ICUjeCBmZFswXSA9ICVkIHNpemUgJWQgcmVmY291bnQgPSAlZFxuIiwKIAkJCQl0ZW1wLT5zbWVtWzBdLmRldmljZV9hZGRyLAogCQkJCXZiMi0+cGxhbmVzWzBdLm0uZmQsCkBAIC0yODcsMTEwICsyODcsMjA2IEBACiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZpbnN0LT5yZWdpc3RlcmVkYnVmcy5sb2NrKTsKIAl9CisKKwkqZGJ1ZiA9IGN1cjsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcHV0X2luc3RfaGVscGVyKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0ID0gY29udGFpbmVyX29mKGtyZWYsCisJCQlzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCwga3JlZik7CisKKwltc21fdmlkY19kZXN0cm95KGluc3QpOworfQorCiBzdGF0aWMgc3NpemVfdCBpbnN0X2luZm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvcmVfaW5zdF9wYWlyICppZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXNtX3ZpZGNfY29yZSAqY29yZTsKKwlzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwgKnRlbXAgPSBOVUxMOworCWNoYXIgKmRidWYsICpjdXIsICplbmQ7CiAJaW50IGksIGo7CiAJc3NpemVfdCBsZW4gPSAwOwogCi0JaWYgKCFpbnN0KSB7Ci0JCWRwcmludGsoVklEQ19FUlIsICJJbnZhbGlkIHBhcmFtcywgaW5zdCAlcEtcbiIsIGluc3QpOworCWlmICghaWRhdGEgfHwgIWlkYXRhLT5jb3JlIHx8ICFpZGF0YS0+aW5zdCkgeworCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAotCW11dGV4X2xvY2soJmRiZ19idWYubG9jayk7Ci0JSU5JVF9EQkdfQlVGKGRiZ19idWYpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgIklOU1RBTkNFOiAlcEsgKCVzKVxuIiwgaW5zdCwKKwljb3JlID0gaWRhdGEtPmNvcmU7CisJaW5zdCA9IGlkYXRhLT5pbnN0OworCisJbXV0ZXhfbG9jaygmY29yZS0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmY29yZS0+aW5zdGFuY2VzLCBsaXN0KSB7CisJCWlmICh0ZW1wID09IGluc3QpCisJCQlicmVhazsKKwl9CisJaW5zdCA9ICgodGVtcCA9PSBpbnN0KSAmJiBrcmVmX2dldF91bmxlc3NfemVybygmaW5zdC0+a3JlZikpID8KKwkJaW5zdCA6IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZjb3JlLT5sb2NrKTsKKworCWlmICghaW5zdCkgeworCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IEluc3RhbmNlIGhhcyBiZWNvbWUgb2Jzb2xldGUiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWRidWYgPSBremFsbG9jKE1BWF9EQkdfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGJ1ZikgeworCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IEFsbG9jYXRpb24gZmFpbGVkIVxuIiwgX19mdW5jX18pOworCQlsZW4gPSAtRU5PTUVNOworCQlnb3RvIGZhaWxlZF9hbGxvYzsKKwl9CisJY3VyID0gZGJ1ZjsKKwllbmQgPSBjdXIgKyBNQVhfREJHX0JVRl9TSVpFOworCisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIklOU1RBTkNFOiAlcEsgKCVzKVxuIiwgaW5zdCwKIAkJaW5zdC0+c2Vzc2lvbl90eXBlID09IE1TTV9WSURDX0VOQ09ERVIgPyAiRW5jb2RlciIgOiAiRGVjb2RlciIpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgImNvcmU6ICVwS1xuIiwgaW5zdC0+Y29yZSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiaGVpZ2h0OiAlZFxuIiwgaW5zdC0+cHJvcC5oZWlnaHRbQ0FQVFVSRV9QT1JUXSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAid2lkdGg6ICVkXG4iLCBpbnN0LT5wcm9wLndpZHRoW0NBUFRVUkVfUE9SVF0pOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgImZwczogJWRcbiIsIGluc3QtPnByb3AuZnBzKTsKLQl3cml0ZV9zdHIoJmRiZ19idWYsICJzdGF0ZTogJWRcbiIsIGluc3QtPnN0YXRlKTsKLQl3cml0ZV9zdHIoJmRiZ19idWYsICJzZWN1cmU6ICVkXG4iLCAhIShpbnN0LT5mbGFncyAmIFZJRENfU0VDVVJFKSk7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiLS0tLS0tLS0tLS1Gb3JtYXRzLS0tLS0tLS0tLS0tLVxuIik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImNvcmU6ICVwS1xuIiwgaW5zdC0+Y29yZSk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImhlaWdodDogJWRcbiIsCisJCWluc3QtPnByb3AuaGVpZ2h0W0NBUFRVUkVfUE9SVF0pOworCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsICJ3aWR0aDogJWRcbiIsCisJCWluc3QtPnByb3Aud2lkdGhbQ0FQVFVSRV9QT1JUXSk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImZwczogJWRcbiIsIGluc3QtPnByb3AuZnBzKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAic3RhdGU6ICVkXG4iLCBpbnN0LT5zdGF0ZSk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgInNlY3VyZTogJWRcbiIsCisJCSEhKGluc3QtPmZsYWdzICYgVklEQ19TRUNVUkUpKTsKKwljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAiLS0tLS0tLS0tLS1Gb3JtYXRzLS0tLS0tLS0tLS0tLVxuIik7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUX05VTTsgaSsrKSB7Ci0JCXdyaXRlX3N0cigmZGJnX2J1ZiwgImNhcGFiaWxpdHk6ICVzXG4iLCBpID09IE9VVFBVVF9QT1JUID8KKwkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImNhcGFiaWxpdHk6ICVzXG4iLAorCQkJaSA9PSBPVVRQVVRfUE9SVCA/ICJPdXRwdXQiIDogIkNhcHR1cmUiKTsKKwkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIm5hbWUgOiAlc1xuIiwKKwkJCWluc3QtPmZtdHNbaV0ubmFtZSk7CisJCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsICJwbGFuZXMgOiAlZFxuIiwKKwkJCWluc3QtPmJ1ZnFbaV0ubnVtX3BsYW5lcyk7CisJCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsCisJCQkidHlwZTogJXNcbiIsIGluc3QtPmZtdHNbaV0udHlwZSA9PSBPVVRQVVRfUE9SVCA/CiAJCQkiT3V0cHV0IiA6ICJDYXB0dXJlIik7Ci0JCXdyaXRlX3N0cigmZGJnX2J1ZiwgIm5hbWUgOiAlc1xuIiwgaW5zdC0+Zm10c1tpXS5uYW1lKTsKLQkJd3JpdGVfc3RyKCZkYmdfYnVmLCAicGxhbmVzIDogJWRcbiIsIGluc3QtPmJ1ZnFbaV0ubnVtX3BsYW5lcyk7Ci0JCXdyaXRlX3N0cigKLQkJJmRiZ19idWYsICJ0eXBlOiAlc1xuIiwgaW5zdC0+Zm10c1tpXS50eXBlID09IE9VVFBVVF9QT1JUID8KLQkJIk91dHB1dCIgOiAiQ2FwdHVyZSIpOwogCQlzd2l0Y2ggKGluc3QtPmJ1ZmZlcl9tb2RlX3NldFtpXSkgewogCQljYXNlIEhBTF9CVUZGRVJfTU9ERV9TVEFUSUM6Ci0JCQl3cml0ZV9zdHIoJmRiZ19idWYsICJidWZmZXIgbW9kZSA6ICVzXG4iLCAic3RhdGljIik7CisJCQljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLAorCQkJCSJidWZmZXIgbW9kZSA6ICVzXG4iLCAic3RhdGljIik7CiAJCQlicmVhazsKIAkJY2FzZSBIQUxfQlVGRkVSX01PREVfRFlOQU1JQzoKLQkJCXdyaXRlX3N0cigmZGJnX2J1ZiwgImJ1ZmZlciBtb2RlIDogJXNcbiIsICJkeW5hbWljIik7CisJCQljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLAorCQkJCSJidWZmZXIgbW9kZSA6ICVzXG4iLCAiZHluYW1pYyIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQl3cml0ZV9zdHIoJmRiZ19idWYsICJidWZmZXIgbW9kZSA6IHVuc3VwcG9ydGVkXG4iKTsKKwkJCWN1ciArPSB3cml0ZV9zdHIoY3VyLCBlbmQgLSBjdXIsCisJCQkJImJ1ZmZlciBtb2RlIDogdW5zdXBwb3J0ZWRcbiIpOwogCQl9CiAKLQkJd3JpdGVfc3RyKCZkYmdfYnVmLCAiY291bnQ6ICV1XG4iLAorCQljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAiY291bnQ6ICV1XG4iLAogCQkJCWluc3QtPmJ1ZnFbaV0udmIyX2J1ZnEubnVtX2J1ZmZlcnMpOwogCiAJCWZvciAoaiA9IDA7IGogPCBpbnN0LT5idWZxW2ldLm51bV9wbGFuZXM7IGorKykKLQkJCXdyaXRlX3N0cigmZGJnX2J1ZiwgInNpemUgZm9yIHBsYW5lICVkOiAldVxuIiwgaiwKLQkJCWluc3QtPmJ1ZnFbaV0ucGxhbmVfc2l6ZXNbal0pOworCQkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwKKwkJCQkic2l6ZSBmb3IgcGxhbmUgJWQ6ICV1XG4iLAorCQkJCWosIGluc3QtPmJ1ZnFbaV0ucGxhbmVfc2l6ZXNbal0pOwogCiAJCWlmIChpIDwgTUFYX1BPUlRfTlVNIC0gMSkKLQkJCXdyaXRlX3N0cigmZGJnX2J1ZiwgIlxuIik7CisJCQljdXIgKz0gd3JpdGVfc3RyKGN1ciwgZW5kIC0gY3VyLCAiXG4iKTsKIAl9Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCWZvciAoaSA9IFNFU1NJT05fTVNHX1NUQVJUOyBpIDwgU0VTU0lPTl9NU0dfRU5EOyBpKyspIHsKLQkJd3JpdGVfc3RyKCZkYmdfYnVmLCAiY29tcGxldGlvbnNbJWRdOiAlc1xuIiwgaSwKKwkJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgImNvbXBsZXRpb25zWyVkXTogJXNcbiIsIGksCiAJCWNvbXBsZXRpb25fZG9uZSgmaW5zdC0+Y29tcGxldGlvbnNbU0VTU0lPTl9NU0dfSU5ERVgoaSldKSA/CiAJCSJwZW5kaW5nIiA6ICJkb25lIik7CiAJfQotCXdyaXRlX3N0cigmZGJnX2J1ZiwgIkVUQiBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmV0Yik7Ci0Jd3JpdGVfc3RyKCZkYmdfYnVmLCAiRUJEIENvdW50OiAlZFxuIiwgaW5zdC0+Y291bnQuZWJkKTsKLQl3cml0ZV9zdHIoJmRiZ19idWYsICJGVEIgQ291bnQ6ICVkXG4iLCBpbnN0LT5jb3VudC5mdGIpOwotCXdyaXRlX3N0cigmZGJnX2J1ZiwgIkZCRCBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmZiZCk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIkVUQiBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmV0Yik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIkVCRCBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmViZCk7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIkZUQiBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmZ0Yik7CisJY3VyICs9IHdyaXRlX3N0cihjdXIsIGVuZCAtIGN1ciwgIkZCRCBDb3VudDogJWRcbiIsIGluc3QtPmNvdW50LmZiZCk7CiAKLQlwdWJsaXNoX3VucmVsZWFzZWRfcmVmZXJlbmNlKGluc3QpOwotCisJcHVibGlzaF91bnJlbGVhc2VkX3JlZmVyZW5jZShpbnN0LCAmY3VyLCBlbmQpOwogCWxlbiA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsCi0JCWRiZ19idWYucHRyLCBkYmdfYnVmLmZpbGxlZF9zaXplKTsKLQltdXRleF91bmxvY2soJmRiZ19idWYubG9jayk7CisJCWRidWYsIGN1ciAtIGRidWYpOworCisJa2ZyZWUoZGJ1Zik7CitmYWlsZWRfYWxsb2M6CisJa3JlZl9wdXQoJmluc3QtPmtyZWYsIHB1dF9pbnN0X2hlbHBlcik7CiAJcmV0dXJuIGxlbjsKIH0KIAorc3RhdGljIGludCBpbnN0X2luZm9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkcHJpbnRrKFZJRENfSU5GTywgIlJlbGVhc2UgaW5vZGUgcHRyOiAlcEtcbiIsIGlub2RlLT5pX3ByaXZhdGUpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGluc3RfaW5mb19mb3BzID0gewogCS5vcGVuID0gaW5zdF9pbmZvX29wZW4sCiAJLnJlYWQgPSBpbnN0X2luZm9fcmVhZCwKKwkucmVsZWFzZSA9IGluc3RfaW5mb19yZWxlYXNlLAogfTsKIAogc3RydWN0IGRlbnRyeSAqbXNtX3ZpZGNfZGVidWdmc19pbml0X2luc3Qoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QsCiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmRpciA9IE5VTEwsICppbmZvID0gTlVMTDsKIAljaGFyIGRlYnVnZnNfbmFtZVtNQVhfREVCVUdGU19OQU1FXTsKKwlzdHJ1Y3QgY29yZV9pbnN0X3BhaXIgKmlkYXRhID0gTlVMTDsKIAogCWlmICghaW5zdCkgewogCQlkcHJpbnRrKFZJRENfRVJSLCAiSW52YWxpZCBwYXJhbXMsIGluc3Q6ICVwS1xuIiwgaW5zdCk7Ci0JCWdvdG8gZmFpbGVkX2NyZWF0ZV9kaXI7CisJCWdvdG8gZXhpdDsKIAl9CiAJc25wcmludGYoZGVidWdmc19uYW1lLCBNQVhfREVCVUdGU19OQU1FLCAiaW5zdF8lcCIsIGluc3QpOworCisJaWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29yZV9pbnN0X3BhaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlkYXRhKSB7CisJCWRwcmludGsoVklEQ19FUlIsICIlczogQWxsb2NhdGlvbiBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZGF0YS0+Y29yZSA9IGluc3QtPmNvcmU7CisJaWRhdGEtPmluc3QgPSBpbnN0OworCiAJZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRlYnVnZnNfbmFtZSwgcGFyZW50KTsKIAlpZiAoIWRpcikgewogCQlkcHJpbnRrKFZJRENfRVJSLCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZvciBtc21fdmlkY1xuIik7CiAJCWdvdG8gZmFpbGVkX2NyZWF0ZV9kaXI7CiAJfQotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiaW5mbyIsIDA0NDQsIGRpciwgaW5zdCwgJmluc3RfaW5mb19mb3BzKSkgeworCisJaW5mbyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImluZm8iLCAwNDQ0LCBkaXIsCisJCQlpZGF0YSwgJmluc3RfaW5mb19mb3BzKTsKKwlpZiAoIWluZm8pIHsKIAkJZHByaW50ayhWSURDX0VSUiwgImRlYnVnZnNfY3JlYXRlX2ZpbGU6IGZhaWxcbiIpOwotCQlnb3RvIGZhaWxlZF9jcmVhdGVfZGlyOworCQlnb3RvIGZhaWxlZF9jcmVhdGVfZmlsZTsKIAl9CisKKwlkaXItPmRfaW5vZGUtPmlfcHJpdmF0ZSA9IGluZm8tPmRfaW5vZGUtPmlfcHJpdmF0ZTsKIAlpbnN0LT5kZWJ1Zy5wZGF0YVtGUkFNRV9QUk9DRVNTSU5HXS5zYW1wbGluZyA9IHRydWU7Ci1mYWlsZWRfY3JlYXRlX2RpcjoKIAlyZXR1cm4gZGlyOworCitmYWlsZWRfY3JlYXRlX2ZpbGU6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CisJZGlyID0gTlVMTDsKK2ZhaWxlZF9jcmVhdGVfZGlyOgorCWtmcmVlKGlkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGRpcjsKK30KKwordm9pZCBtc21fdmlkY19kZWJ1Z2ZzX2RlaW5pdF9pbnN0KHN0cnVjdCBtc21fdmlkY19pbnN0ICppbnN0KQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7CisKKwlpZiAoIWluc3QgfHwgIWluc3QtPmRlYnVnZnNfcm9vdCkKKwkJcmV0dXJuOworCisJZGVudHJ5ID0gaW5zdC0+ZGVidWdmc19yb290OworCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJZHByaW50ayhWSURDX0lORk8sICJEZXN0cm95ICVwS1xuIiwgZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUpOworCQlrZnJlZShkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSk7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlID0gTlVMTDsKKwl9CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRlbnRyeSk7CisJaW5zdC0+ZGVidWdmc19yb290ID0gTlVMTDsKIH0KIAogdm9pZCBtc21fdmlkY19kZWJ1Z2ZzX3VwZGF0ZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwKQEAgLTQ0MSw4ICs1MzcsMyBAQAogCX0KIH0KIAotdm9pZCBtc21fdmlkY19kZWJ1Z2ZzX2RlaW5pdF9kcnYodm9pZCkKLXsKLQltdXRleF9kZXN0cm95KCZkYmdfYnVmLmxvY2spOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2RlYnVnLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2RlYnVnLmgKaW5kZXggN2E3M2E1MC4uZGJlYmU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfZGVidWcuaApAQCAtMTEzLDcgKzExMyw2IEBACiAKICNkZWZpbmUgTVNNX1ZJRENfRVJST1IodmFsdWUpCQkJCQlcCiAJZG8gewkJCQkJCQlcCi0JCWRwcmludGsoVklEQ19EQkcsICJGYXRhbCBMZXZlbCA9ICVkXG4iLCB2YWx1ZSk7XAogCQlCVUdfT04odmFsdWUpOwkJCQkJXAogCX0gd2hpbGUgKDApCiAKQEAgLTEyMyw5ICsxMjIsOSBAQAogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpOwogc3RydWN0IGRlbnRyeSAqbXNtX3ZpZGNfZGVidWdmc19pbml0X2luc3Qoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QsCiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudCk7Cit2b2lkIG1zbV92aWRjX2RlYnVnZnNfZGVpbml0X2luc3Qoc3RydWN0IG1zbV92aWRjX2luc3QgKmluc3QpOwogdm9pZCBtc21fdmlkY19kZWJ1Z2ZzX3VwZGF0ZShzdHJ1Y3QgbXNtX3ZpZGNfaW5zdCAqaW5zdCwKIAkJZW51bSBtc21fdmlkY19kZWJ1Z2ZzX2V2ZW50IGUpOwotdm9pZCBtc21fdmlkY19kZWJ1Z2ZzX2RlaW5pdF9kcnYodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWMoc3RydWN0IG1zbV92aWRjX2luc3QgKmksIGVudW0gcHJvZmlsaW5nX3BvaW50cyBwLAogCQkJCSBjaGFyICpiKQpAQCAtMTc5LDExICsxNzgsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fdmlkY19yZXNfaGFuZGxlX2ZhdGFsX2h3X2Vycm9yKAorCXN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9yZXNvdXJjZXMgKnJlc291cmNlcywKKwlib29sIGVuYWJsZV9mYXRhbCkKK3sKKwllbmFibGVfZmF0YWwgJj0gcmVzb3VyY2VzLT5kZWJ1Z190aW1lb3V0OworCU1TTV9WSURDX0VSUk9SKGVuYWJsZV9mYXRhbCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtc21fdmlkY19oYW5kbGVfaHdfZXJyb3Ioc3RydWN0IG1zbV92aWRjX2NvcmUgKmNvcmUpCiB7Ci0JYm9vbCBlbmFibGVfZmF0YWw7Ci0KLQllbmFibGVfZmF0YWwgPSBjb3JlLT5yZXNvdXJjZXMuZGVidWdfdGltZW91dDsKKwlib29sIGVuYWJsZV9mYXRhbCA9IHRydWU7CiAKIAkvKgogCSAqIEluIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlci1pbml0aWF0ZWQgU1NSIHRyaWdnZXJzCkBAIC0yMDAsOCArMjA1LDcgQEAKIAkgKiBiYXNlZCBvbiBtdWx0aXBsZSBmYWN0b3JzLiBUaGlzIGNvbmRpdGlvbiBjaGVjayB3aWxsCiAJICogYmUgZW5oYW5jZWQgbGF0ZXIuCiAJICovCi0KLQlNU01fVklEQ19FUlJPUihlbmFibGVfZmF0YWwpOworCW1zbV92aWRjX3Jlc19oYW5kbGVfZmF0YWxfaHdfZXJyb3IoJmNvcmUtPnJlc291cmNlcywgZW5hYmxlX2ZhdGFsKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2ludGVybmFsLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX2ludGVybmFsLmgKaW5kZXggYmEwNTA1OS4uMzc2NDVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfaW50ZXJuYWwuaApAQCAtMTc1LDYgKzE3NSwxMyBAQAogCXUzMiAqdnBlX2NzY19jdXN0b21fbGltaXRfY29lZmY7CiB9OwogCitzdHJ1Y3QgbXNtX3ZpZGNfYnVmX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MzIgaW5kZXg7CisJdTMyIG1hcmtfZGF0YTsKKwl1MzIgbWFya190YXJnZXQ7Cit9OworCiBzdHJ1Y3QgbXNtX3ZpZGNfY29tbW9uX2RhdGEgewogCWNoYXIga2V5WzEyOF07CiAJaW50IHZhbHVlOwpAQCAtMTg4LDEyICsxOTUsMzMgQEAKIAlpbnQgbG93X3Bvd2VyX2N5Y2xlczsKIH07CiAKK2VudW0gZWZ1c2VfcHVycG9zZSB7CisJU0tVX1ZFUlNJT04gPSAwLAorfTsKKworZW51bSBza3VfdmVyc2lvbiB7CisJU0tVX1ZFUlNJT05fMCA9IDAsCisJU0tVX1ZFUlNJT05fMSwKKwlTS1VfVkVSU0lPTl8yLAorfTsKKworc3RydWN0IG1zbV92aWRjX2VmdXNlX2RhdGEgeworCXUzMiBzdGFydF9hZGRyZXNzOworCXUzMiBzaXplOworCXUzMiBtYXNrOworCXUzMiBzaGlmdDsKKwllbnVtIGVmdXNlX3B1cnBvc2UgcHVycG9zZTsKK307CisKIHN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgbXNtX3ZpZGNfY29tbW9uX2RhdGEgKmNvbW1vbl9kYXRhOwogCXVuc2lnbmVkIGludCBjb21tb25fZGF0YV9sZW5ndGg7CiAJc3RydWN0IG1zbV92aWRjX2NvZGVjX2RhdGEgKmNvZGVjX2RhdGE7CiAJdW5zaWduZWQgaW50IGNvZGVjX2RhdGFfbGVuZ3RoOwogCXN0cnVjdCBtc21fdmlkY19jc2NfY29lZmYgY3NjX2RhdGE7CisJc3RydWN0IG1zbV92aWRjX2VmdXNlX2RhdGEgKmVmdXNlX2RhdGE7CisJdW5zaWduZWQgaW50IGVmdXNlX2RhdGFfbGVuZ3RoOworCXVuc2lnbmVkIGludCBza3VfdmVyc2lvbjsKIH07CiAKIHN0cnVjdCBtc21fdmlkY19mb3JtYXQgewpAQCAtMjExLDcgKzIzOSw3IEBACiAJaW50IG51bV9jb3JlczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Jvb3Q7CiAJaW50IHRoZXJtYWxfbGV2ZWw7Ci0JdTMyIHBsYXRmb3JtX3ZlcnNpb247CisJdTMyIHNrdV92ZXJzaW9uOwogfTsKIAogc3RydWN0IG1zbV92aWRlb19kZXZpY2UgewpAQCAtMjc5LDYgKzMwNyw3IEBACiAJdTMyIG9wYl9mb3VyY2M7CiAJZW51bSBoYWxfd29ya19tb2RlIHdvcmtfbW9kZTsKIAlib29sIGxvd19sYXRlbmN5X21vZGU7CisJYm9vbCB0dXJib19tb2RlOwogfTsKIAogc3RydWN0IHByb2ZpbGVfZGF0YSB7CkBAIC0zNDksNiArMzc4LDggQEAKIAlzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCByZWNvbmJ1ZnM7CiAJc3RydWN0IG1zbV92aWRjX2xpc3QgZW9zYnVmczsKIAlzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCByZWdpc3RlcmVkYnVmczsKKwlzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCBldGJfZGF0YTsKKwlzdHJ1Y3QgbXNtX3ZpZGNfbGlzdCBmYmRfZGF0YTsKIAlzdHJ1Y3QgYnVmZmVyX3JlcXVpcmVtZW50cyBidWZmX3JlcTsKIAlzdHJ1Y3Qgc21lbV9jbGllbnQgKm1lbV9jbGllbnQ7CiAJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxfaGFuZGxlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcGxhdGZvcm0uYwppbmRleCAwZmUwOWUyLi41NjUyNGNjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX3BsYXRmb3JtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJtc21fdmlkY19pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1zbV92aWRjX2RlYnVnLmgiCiAKIAogI2RlZmluZSBDT0RFQ19FTlRSWShuLCBwLCB2c3AsIHZwcCwgbHApIFwKQEAgLTM1LDYgKzM2LDE1IEBACiAJLmxvd19wb3dlcl9jeWNsZXMgPSBscAlcCiB9CiAKKyNkZWZpbmUgRUZVU0VfRU5UUlkoc2EsIHMsIG0sIHNoLCBwKSBcCit7CVwKKwkuc3RhcnRfYWRkcmVzcyA9IHNhLAkJXAorCS5zaXplID0gcywJXAorCS5tYXNrID0gbSwJXAorCS5zaGlmdCA9IHNoLAlcCisJLnB1cnBvc2UgPSBwCVwKK30KKwogc3RhdGljIHN0cnVjdCBtc21fdmlkY19jb2RlY19kYXRhIGRlZmF1bHRfY29kZWNfZGF0YVtdID0gIHsKIAlDT0RFQ19FTlRSWShWNEwyX1BJWF9GTVRfSDI2NCwgTVNNX1ZJRENfRU5DT0RFUiwgMTI1LCA2NzUsIDMyMCksCiAJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX0gyNjQsIE1TTV9WSURDX0RFQ09ERVIsIDEyNSwgNjc1LCAzMjApLApAQCAtNDQsNyArNTQsMTggQEAKIAlDT0RFQ19FTlRSWShWNEwyX1BJWF9GTVRfSDI2NCwgTVNNX1ZJRENfRU5DT0RFUiwgMTI1LCA2NzUsIDMyMCksCiAJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX0hFVkMsIE1TTV9WSURDX0VOQ09ERVIsIDEyNSwgNjc1LCAzMjApLAogCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9WUDgsIE1TTV9WSURDX0VOQ09ERVIsIDEyNSwgNjc1LCAzMjApLAotCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9UTUUsIE1TTV9WSURDX0VOQ09ERVIsIDEyNSwgNjc1LCAzMjApLAorCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9UTUUsIE1TTV9WSURDX0VOQ09ERVIsIDAsIDU0MCwgNTQwKSwKKwlDT0RFQ19FTlRSWShWNEwyX1BJWF9GTVRfTVBFRzIsIE1TTV9WSURDX0RFQ09ERVIsIDUwLCAyMDAsIDIwMCksCisJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX0gyNjQsIE1TTV9WSURDX0RFQ09ERVIsIDUwLCAyMDAsIDIwMCksCisJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX0hFVkMsIE1TTV9WSURDX0RFQ09ERVIsIDUwLCAyMDAsIDIwMCksCisJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX1ZQOCwgTVNNX1ZJRENfREVDT0RFUiwgNTAsIDIwMCwgMjAwKSwKKwlDT0RFQ19FTlRSWShWNEwyX1BJWF9GTVRfVlA5LCBNU01fVklEQ19ERUNPREVSLCA1MCwgMjAwLCAyMDApLAorfTsKKworc3RhdGljIHN0cnVjdCBtc21fdmlkY19jb2RlY19kYXRhIHNkbTY3MF9jb2RlY19kYXRhW10gPSAgeworCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9IMjY0LCBNU01fVklEQ19FTkNPREVSLCAxMjUsIDY3NSwgMzIwKSwKKwlDT0RFQ19FTlRSWShWNEwyX1BJWF9GTVRfSEVWQywgTVNNX1ZJRENfRU5DT0RFUiwgMTI1LCA2NzUsIDMyMCksCisJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX1ZQOCwgTVNNX1ZJRENfRU5DT0RFUiwgMTI1LCA2NzUsIDMyMCksCiAJQ09ERUNfRU5UUlkoVjRMMl9QSVhfRk1UX01QRUcyLCBNU01fVklEQ19ERUNPREVSLCA1MCwgMjAwLCAyMDApLAogCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9IMjY0LCBNU01fVklEQ19ERUNPREVSLCA1MCwgMjAwLCAyMDApLAogCUNPREVDX0VOVFJZKFY0TDJfUElYX0ZNVF9IRVZDLCBNU01fVklEQ19ERUNPREVSLCA1MCwgMjAwLCAyMDApLApAQCAtOTgsNyArMTE5LDcgQEAKIAl9LAogCXsKIAkJLmtleSA9ICJxY29tLG1heC1ody1sb2FkIiwKLQkJLnZhbHVlID0gMjU2MzIwMCwKKwkJLnZhbHVlID0gMzExMDQwMCwJLyogNDA5NngyMTYwQDkwICovCiAJfSwKIAl7CiAJCS5rZXkgPSAicWNvbSxtYXgtaHEtbWJzLXBlci1mcmFtZSIsCkBAIC0xMzAsNiArMTUxLDk1IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXNtX3ZpZGNfY29tbW9uX2RhdGEgc2RtNjcwX2NvbW1vbl9kYXRhX3YwW10gPSB7CisJeworCQkua2V5ID0gInFjb20sbmV2ZXItdW5sb2FkLWZ3IiwKKwkJLnZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLHN3LXBvd2VyLWNvbGxhcHNlIiwKKwkJLnZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1zZWN1cmUtaW5zdGFuY2VzIiwKKwkJLnZhbHVlID0gNSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ody1sb2FkIiwKKwkJLnZhbHVlID0gMTk0NDAwMCwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ocS1tYnMtcGVyLWZyYW1lIiwKKwkJLnZhbHVlID0gODE2MCwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ocS1mcmFtZXMtcGVyLXNlYyIsCisJCS52YWx1ZSA9IDYwLAorCX0sCisJeworCQkua2V5ID0gInFjb20sbWF4LWItZnJhbWUtc2l6ZSIsCisJCS52YWx1ZSA9IDgxNjAsCisJfSwKKwl7CisJCS5rZXkgPSAicWNvbSxtYXgtYi1mcmFtZXMtcGVyLXNlYyIsCisJCS52YWx1ZSA9IDYwLAorCX0sCisJeworCQkua2V5ID0gInFjb20scG93ZXItY29sbGFwc2UtZGVsYXkiLAorCQkudmFsdWUgPSA1MDAsCisJfSwKKwl7CisJCS5rZXkgPSAicWNvbSxody1yZXNwLXRpbWVvdXQiLAorCQkudmFsdWUgPSAyNTAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX3ZpZGNfY29tbW9uX2RhdGEgc2RtNjcwX2NvbW1vbl9kYXRhX3YxW10gPSB7CisJeworCQkua2V5ID0gInFjb20sbmV2ZXItdW5sb2FkLWZ3IiwKKwkJLnZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLHN3LXBvd2VyLWNvbGxhcHNlIiwKKwkJLnZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1zZWN1cmUtaW5zdGFuY2VzIiwKKwkJLnZhbHVlID0gNSwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ody1sb2FkIiwKKwkJLnZhbHVlID0gMTIxNjgwMCwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ocS1tYnMtcGVyLWZyYW1lIiwKKwkJLnZhbHVlID0gODE2MCwKKwl9LAorCXsKKwkJLmtleSA9ICJxY29tLG1heC1ocS1mcmFtZXMtcGVyLXNlYyIsCisJCS52YWx1ZSA9IDYwLAorCX0sCisJeworCQkua2V5ID0gInFjb20sbWF4LWItZnJhbWUtc2l6ZSIsCisJCS52YWx1ZSA9IDgxNjAsCisJfSwKKwl7CisJCS5rZXkgPSAicWNvbSxtYXgtYi1mcmFtZXMtcGVyLXNlYyIsCisJCS52YWx1ZSA9IDYwLAorCX0sCisJeworCQkua2V5ID0gInFjb20scG93ZXItY29sbGFwc2UtZGVsYXkiLAorCQkudmFsdWUgPSA1MDAsCisJfSwKKwl7CisJCS5rZXkgPSAicWNvbSxody1yZXNwLXRpbWVvdXQiLAorCQkudmFsdWUgPSAyNTAsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX3ZpZGNfZWZ1c2VfZGF0YSBzZG02NzBfZWZ1c2VfZGF0YVtdID0geworCUVGVVNFX0VOVFJZKDB4MDA3ODAxQTAsIDQsIDB4MDAwMDgwMDAsIDB4MGYsIFNLVV9WRVJTSU9OKSwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgbXNtX3ZpZGNfcGxhdGZvcm1fZGF0YSBkZWZhdWx0X2RhdGEgPSB7CiAJLmNvZGVjX2RhdGEgPSBkZWZhdWx0X2NvZGVjX2RhdGEsCkBAIC0xMzksNiArMjQ5LDkgQEAKIAkuY3NjX2RhdGEudnBlX2NzY19jdXN0b21fYmlhc19jb2VmZiA9IHZwZV9jc2NfY3VzdG9tX2JpYXNfY29lZmYsCiAJLmNzY19kYXRhLnZwZV9jc2NfY3VzdG9tX21hdHJpeF9jb2VmZiA9IHZwZV9jc2NfY3VzdG9tX21hdHJpeF9jb2VmZiwKIAkuY3NjX2RhdGEudnBlX2NzY19jdXN0b21fbGltaXRfY29lZmYgPSB2cGVfY3NjX2N1c3RvbV9saW1pdF9jb2VmZiwKKwkuZWZ1c2VfZGF0YSA9IE5VTEwsCisJLmVmdXNlX2RhdGFfbGVuZ3RoID0gMCwKKwkuc2t1X3ZlcnNpb24gPSAwLAogfTsKIAogc3RhdGljIHN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9kYXRhIHNkbTg0NV9kYXRhID0gewpAQCAtMTQ5LDYgKzI2MiwyMiBAQAogCS5jc2NfZGF0YS52cGVfY3NjX2N1c3RvbV9iaWFzX2NvZWZmID0gdnBlX2NzY19jdXN0b21fYmlhc19jb2VmZiwKIAkuY3NjX2RhdGEudnBlX2NzY19jdXN0b21fbWF0cml4X2NvZWZmID0gdnBlX2NzY19jdXN0b21fbWF0cml4X2NvZWZmLAogCS5jc2NfZGF0YS52cGVfY3NjX2N1c3RvbV9saW1pdF9jb2VmZiA9IHZwZV9jc2NfY3VzdG9tX2xpbWl0X2NvZWZmLAorCS5lZnVzZV9kYXRhID0gTlVMTCwKKwkuZWZ1c2VfZGF0YV9sZW5ndGggPSAwLAorCS5za3VfdmVyc2lvbiA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IG1zbV92aWRjX3BsYXRmb3JtX2RhdGEgc2RtNjcwX2RhdGEgPSB7CisJLmNvZGVjX2RhdGEgPSBzZG02NzBfY29kZWNfZGF0YSwKKwkuY29kZWNfZGF0YV9sZW5ndGggPSAgQVJSQVlfU0laRShzZG02NzBfY29kZWNfZGF0YSksCisJLmNvbW1vbl9kYXRhID0gc2RtNjcwX2NvbW1vbl9kYXRhX3YwLAorCS5jb21tb25fZGF0YV9sZW5ndGggPSAgQVJSQVlfU0laRShzZG02NzBfY29tbW9uX2RhdGFfdjApLAorCS5jc2NfZGF0YS52cGVfY3NjX2N1c3RvbV9iaWFzX2NvZWZmID0gdnBlX2NzY19jdXN0b21fYmlhc19jb2VmZiwKKwkuY3NjX2RhdGEudnBlX2NzY19jdXN0b21fbWF0cml4X2NvZWZmID0gdnBlX2NzY19jdXN0b21fbWF0cml4X2NvZWZmLAorCS5jc2NfZGF0YS52cGVfY3NjX2N1c3RvbV9saW1pdF9jb2VmZiA9IHZwZV9jc2NfY3VzdG9tX2xpbWl0X2NvZWZmLAorCS5lZnVzZV9kYXRhID0gc2RtNjcwX2VmdXNlX2RhdGEsCisJLmVmdXNlX2RhdGFfbGVuZ3RoID0gQVJSQVlfU0laRShzZG02NzBfZWZ1c2VfZGF0YSksCisJLnNrdV92ZXJzaW9uID0gMCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV92aWRjX2R0X21hdGNoW10gPSB7CkBAIC0xNTYsMTUgKzI4NSw2MyBAQAogCQkuY29tcGF0aWJsZSA9ICJxY29tLHNkbTg0NS12aWRjIiwKIAkJLmRhdGEgPSAmc2RtODQ1X2RhdGEsCiAJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20sc2RtNjcwLXZpZGMiLAorCQkuZGF0YSA9ICZzZG02NzBfZGF0YSwKKwl9LAogCXt9LAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX3ZpZGNfZHRfbWF0Y2gpOwogCitzdGF0aWMgaW50IG1zbV92aWRjX3JlYWRfZWZ1c2UoCisJCXN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9kYXRhICpkYXRhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVpbnQzMl90IGk7CisJc3RydWN0IG1zbV92aWRjX2VmdXNlX2RhdGEgKmVmdXNlX2RhdGEgPSBkYXRhLT5lZnVzZV9kYXRhOworCXVpbnQzMl90IGVmdXNlX2RhdGFfY291bnQgPSBkYXRhLT5lZnVzZV9kYXRhX2xlbmd0aDsKKworCWZvciAoaSA9IDA7IGkgPCBlZnVzZV9kYXRhX2NvdW50OyBpKyspIHsKKworCQlzd2l0Y2ggKChlZnVzZV9kYXRhW2ldKS5wdXJwb3NlKSB7CisKKwkJY2FzZSBTS1VfVkVSU0lPTjoKKwkJCWJhc2UgPSBkZXZtX2lvcmVtYXAoZGV2LCAoZWZ1c2VfZGF0YVtpXSkuc3RhcnRfYWRkcmVzcywKKwkJCQkJKGVmdXNlX2RhdGFbaV0pLnNpemUpOworCQkJaWYgKCFiYXNlKSB7CisJCQkJZHByaW50ayhWSURDX0VSUiwKKwkJCQkJImZhaWxlZCBlZnVzZSBpb3JlbWFwOiByZXMtPnN0YXJ0ICUjeCwgc2l6ZSAlZFxuIiwKKwkJCQkJKGVmdXNlX2RhdGFbaV0pLnN0YXJ0X2FkZHJlc3MsCisJCQkJCShlZnVzZV9kYXRhW2ldKS5zaXplKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXUzMiBlZnVzZSA9IDA7CisKKwkJCQllZnVzZSA9IHJlYWRsX3JlbGF4ZWQoYmFzZSk7CisJCQkJZGF0YS0+c2t1X3ZlcnNpb24gPQorCQkJCQkoZWZ1c2UgJiAoZWZ1c2VfZGF0YVtpXSkubWFzaykgPj4KKwkJCQkJKGVmdXNlX2RhdGFbaV0pLnNoaWZ0OworCQkJCWRwcmludGsoVklEQ19EQkcsCisJCQkJCSJlZnVzZSAweCV4LCBwbGF0Zm9ybSB2ZXJzaW9uIDB4JXhcbiIsCisJCQkJCWVmdXNlLCBkYXRhLT5za3VfdmVyc2lvbik7CisKKwkJCQlkZXZtX2lvdW5tYXAoZGV2LCBiYXNlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogdm9pZCAqdmlkY19nZXRfZHJ2X2RhdGEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9kYXRhICpkcml2ZXJfZGF0YSA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJaW50IHJjID0gMDsKIAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFkZXYtPm9mX25vZGUpIHsKIAkJZHJpdmVyX2RhdGEgPSAmZGVmYXVsdF9kYXRhOwpAQCAtMTc2LDYgKzM1MywyMSBAQAogCWlmIChtYXRjaCkKIAkJZHJpdmVyX2RhdGEgPSAoc3RydWN0IG1zbV92aWRjX3BsYXRmb3JtX2RhdGEgKiltYXRjaC0+ZGF0YTsKIAorCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJza3UtaW5kZXgiLCBOVUxMKSB8fAorCQkJIWRyaXZlcl9kYXRhKSB7CisJCWdvdG8gZXhpdDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobWF0Y2gtPmNvbXBhdGlibGUsICJxY29tLHNkbTY3MC12aWRjIikpIHsKKwkJcmMgPSBtc21fdmlkY19yZWFkX2VmdXNlKGRyaXZlcl9kYXRhLCBkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIGV4aXQ7CisKKwkJaWYgKGRyaXZlcl9kYXRhLT5za3VfdmVyc2lvbiA9PSBTS1VfVkVSU0lPTl8xKSB7CisJCQlkcml2ZXJfZGF0YS0+Y29tbW9uX2RhdGEgPSBzZG02NzBfY29tbW9uX2RhdGFfdjE7CisJCQlkcml2ZXJfZGF0YS0+Y29tbW9uX2RhdGFfbGVuZ3RoID0KKwkJCQkJQVJSQVlfU0laRShzZG02NzBfY29tbW9uX2RhdGFfdjEpOworCQl9CisJfQorCiBleGl0OgogCXJldHVybiBkcml2ZXJfZGF0YTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcmVzX3BhcnNlLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX3Jlc19wYXJzZS5jCmluZGV4IGYzNDM5MzkuLmEwMjE0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcmVzX3BhcnNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19yZXNfcGFyc2UuYwpAQCAtNzMsMTIgKzczLDYgQEAKIAlyZXMtPmNsb2NrX2ZyZXFfdGJsLmNsa19wcm9mX2VudHJpZXMgPSBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNtX3ZpZGNfZnJlZV9wbGF0Zm9ybV92ZXJzaW9uX3RhYmxlKAotCQlzdHJ1Y3QgbXNtX3ZpZGNfcGxhdGZvcm1fcmVzb3VyY2VzICpyZXMpCi17Ci0JcmVzLT5wZl92ZXJfdGJsID0gTlVMTDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIG1zbV92aWRjX2ZyZWVfcmVnX3RhYmxlKAogCQkJc3RydWN0IG1zbV92aWRjX3BsYXRmb3JtX3Jlc291cmNlcyAqcmVzKQogewpAQCAtMTMzLDcgKzEyNyw2IEBACiB7CiAJbXNtX3ZpZGNfZnJlZV9jbG9ja190YWJsZShyZXMpOwogCW1zbV92aWRjX2ZyZWVfcmVndWxhdG9yX3RhYmxlKHJlcyk7Ci0JbXNtX3ZpZGNfZnJlZV9wbGF0Zm9ybV92ZXJzaW9uX3RhYmxlKHJlcyk7CiAJbXNtX3ZpZGNfZnJlZV9hbGxvd2VkX2Nsb2Nrc190YWJsZShyZXMpOwogCW1zbV92aWRjX2ZyZWVfcmVnX3RhYmxlKHJlcyk7CiAJbXNtX3ZpZGNfZnJlZV9xZHNzX2FkZHJfdGFibGUocmVzKTsKQEAgLTM0NCwzMyArMzM3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobXNtX3ZpZGNfbG9hZF91MzJfdGFibGUpOwogCi1zdGF0aWMgaW50IG1zbV92aWRjX2xvYWRfcGxhdGZvcm1fdmVyc2lvbl90YWJsZSgKLQkJc3RydWN0IG1zbV92aWRjX3BsYXRmb3JtX3Jlc291cmNlcyAqcmVzKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHJlcy0+cGRldjsKLQotCWlmICghb2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLHBsYXRmb3JtLXZlcnNpb24iLCBOVUxMKSkgewotCQlkcHJpbnRrKFZJRENfREJHLCAicWNvbSxwbGF0Zm9ybS12ZXJzaW9uIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJjID0gbXNtX3ZpZGNfbG9hZF91MzJfdGFibGUocGRldiwgcGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxwbGF0Zm9ybS12ZXJzaW9uIiwKLQkJCXNpemVvZigqcmVzLT5wZl92ZXJfdGJsKSwKLQkJCSh1MzIgKiopJnJlcy0+cGZfdmVyX3RibCwKLQkJCU5VTEwpOwotCWlmIChyYykgewotCQlkcHJpbnRrKFZJRENfRVJSLAotCQkJIiVzOiBmYWlsZWQgdG8gcmVhZCBwbGF0Zm9ybSB2ZXJzaW9uIHRhYmxlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIEEgY29tcGFyYXRvciB0byBjb21wYXJlIGxvYWRzIChuZWVkZWQgbGF0ZXIgb24pICovCiBzdGF0aWMgaW50IGNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQogewpAQCAtNzEyLDYgKzY3OCwyOSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBtc21fZGVjaWRlX2R0X25vZGUoCisJCXN0cnVjdCBtc21fdmlkY19wbGF0Zm9ybV9yZXNvdXJjZXMgKnJlcykgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSByZXMtPnBkZXY7CisJaW50IHJjID0gMDsKKwl1MzIgc2t1X2luZGV4ID0gMDsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJza3UtaW5kZXgiLAorCQkJJnNrdV9pbmRleCk7CisJaWYgKHJjKSB7CisJCWRwcmludGsoVklEQ19EQkcsICInc2t1X2luZGV4JyBub3QgZm91bmQgaW4gbm9kZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChza3VfaW5kZXggIT0gcmVzLT5za3VfdmVyc2lvbikgeworCQlkcHJpbnRrKFZJRENfREJHLAorCQkJIkZhaWxlZCB0byBwYXJzZXIgZHQ6IHNrdV9pbmRleCAlZCByZXMtPnNrdV92ZXJzaW9uIC0gJWRcbiIsCisJCQlza3VfaW5kZXgsIHJlcy0+c2t1X3ZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmaW5kX2tleV92YWx1ZShzdHJ1Y3QgbXNtX3ZpZGNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YSwKIAljb25zdCBjaGFyICprZXkpCiB7CkBAIC03NDMsNiArNzMyLDggQEAKIAlyZXMtPmNvZGVjX2RhdGFfY291bnQgPSBwbGF0Zm9ybV9kYXRhLT5jb2RlY19kYXRhX2xlbmd0aDsKIAlyZXMtPmNvZGVjX2RhdGEgPSBwbGF0Zm9ybV9kYXRhLT5jb2RlY19kYXRhOwogCisJcmVzLT5za3VfdmVyc2lvbiA9IHBsYXRmb3JtX2RhdGEtPnNrdV92ZXJzaW9uOworCiAJcmVzLT5md19uYW1lID0gInZlbnVzIjsKIAogCWRwcmludGsoVklEQ19EQkcsICJGaXJtd2FyZSBmaWxlbmFtZTogJXNcbiIsIHJlcy0+ZndfbmFtZSk7CkBAIC04MDUsNiArNzk2LDExIEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAorCXJjID0gbXNtX2RlY2lkZV9kdF9ub2RlKHJlcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwogCUlOSVRfTElTVF9IRUFEKCZyZXMtPmNvbnRleHRfYmFua3MpOwogCiAJcmVzLT5maXJtd2FyZV9iYXNlID0gKHBoeXNfYWRkcl90KWZpcm13YXJlX2Jhc2U7CkBAIC04MTYsMTAgKzgxMiw2IEBACiAJa3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CiAJcmVzLT5pcnEgPSBrcmVzID8ga3Jlcy0+c3RhcnQgOiAtMTsKIAotCXJjID0gbXNtX3ZpZGNfbG9hZF9wbGF0Zm9ybV92ZXJzaW9uX3RhYmxlKHJlcyk7Ci0JaWYgKHJjKQotCQlkcHJpbnRrKFZJRENfRVJSLCAiRmFpbGVkIHRvIGxvYWQgcGYgdmVyc2lvbiB0YWJsZTogJWRcbiIsIHJjKTsKLQogCXJjID0gbXNtX3ZpZGNfbG9hZF9zdWJjYWNoZV9pbmZvKHJlcyk7CiAJaWYgKHJjKQogCQlkcHJpbnRrKFZJRENfV0FSTiwgIkZhaWxlZCB0byBsb2FkIHN1YmNhY2hlIGluZm86ICVkXG4iLCByYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX3Jlc291cmNlcy5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy9tc21fdmlkY19yZXNvdXJjZXMuaAppbmRleCA4MzA5ZmNlLi45OWI0ZTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL21zbV92aWRjX3Jlc291cmNlcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvbXNtX3ZpZGNfcmVzb3VyY2VzLmgKQEAgLTIxLDExICsyMSw2IEBACiAKICNkZWZpbmUgTUFYX0JVRkZFUl9UWVBFUyAzMgogCi1zdHJ1Y3QgcGxhdGZvcm1fdmVyc2lvbl90YWJsZSB7Ci0JdTMyIHZlcnNpb25fbWFzazsKLQl1MzIgdmVyc2lvbl9zaGlmdDsKLX07Ci0KIHN0cnVjdCBkY3ZzX3RhYmxlIHsKIAl1MzIgbG9hZDsKIAl1MzIgbG9hZF9sb3c7CkBAIC0xNTMsNyArMTQ4LDcgQEAKIAlwaHlzX2FkZHJfdCByZWdpc3Rlcl9iYXNlOwogCXVpbnQzMl90IHJlZ2lzdGVyX3NpemU7CiAJdWludDMyX3QgaXJxOwotCXN0cnVjdCBwbGF0Zm9ybV92ZXJzaW9uX3RhYmxlICpwZl92ZXJfdGJsOworCXVpbnQzMl90IHNrdV92ZXJzaW9uOwogCXN0cnVjdCBhbGxvd2VkX2Nsb2NrX3JhdGVzX3RhYmxlICphbGxvd2VkX2Nsa3NfdGJsOwogCXUzMiBhbGxvd2VkX2Nsa3NfdGJsX3NpemU7CiAJc3RydWN0IGNsb2NrX2ZyZXFfdGFibGUgY2xvY2tfZnJlcV90Ymw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZlbnVzX2hmaS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy92ZW51c19oZmkuYwppbmRleCA0N2ZmMWRiLi5lMjYwODg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZlbnVzX2hmaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvdmVudXNfaGZpLmMKQEAgLTExMCw3ICsxMTAsOCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zdHJpY3RfY2hlY2soc3RydWN0IHZlbnVzX2hmaV9kZXZpY2UgKmRldmljZSkKIHsKLQlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmRldmljZS0+bG9jaykpOworCW1zbV92aWRjX3Jlc19oYW5kbGVfZmF0YWxfaHdfZXJyb3IoZGV2aWNlLT5yZXMsCisJCSFtdXRleF9pc19sb2NrZWQoJmRldmljZS0+bG9jaykpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfc3RhdGUoc3RydWN0IHZlbnVzX2hmaV9kZXZpY2UgKmRldmljZSwKQEAgLTIzOCw3ICsyMzksOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2FjcXVpcmVfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfaW5mbyAqcmluZm8pCitzdGF0aWMgaW50IF9fYWNxdWlyZV9yZWd1bGF0b3Ioc3RydWN0IHJlZ3VsYXRvcl9pbmZvICpyaW5mbywKKwkJCQlzdHJ1Y3QgdmVudXNfaGZpX2RldmljZSAqZGV2aWNlKQogewogCWludCByYyA9IDA7CiAKQEAgLTI2Niw3ICsyNjgsNyBAQAogCWlmICghcmVndWxhdG9yX2lzX2VuYWJsZWQocmluZm8tPnJlZ3VsYXRvcikpIHsKIAkJZHByaW50ayhWSURDX1dBUk4sICJSZWd1bGF0b3IgaXMgbm90IGVuYWJsZWQgJXNcbiIsCiAJCQlyaW5mby0+bmFtZSk7Ci0JCVdBUk5fT04oMSk7CisJCW1zbV92aWRjX3Jlc19oYW5kbGVfZmF0YWxfaHdfZXJyb3IoZGV2aWNlLT5yZXMsIHRydWUpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTMxMiw3ICszMTQsNyBAQAogCXJldHVybiByYzsKIGVycl9yZWdfaGFuZG9mZl9mYWlsZWQ6CiAJdmVudXNfaGZpX2Zvcl9lYWNoX3JlZ3VsYXRvcl9yZXZlcnNlX2NvbnRpbnVlKGRldmljZSwgcmluZm8sIGMpCi0JCV9fYWNxdWlyZV9yZWd1bGF0b3IocmluZm8pOworCQlfX2FjcXVpcmVfcmVndWxhdG9yKHJpbmZvLCBkZXZpY2UpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNjI0LDcgKzYyNiw3IEBACiAJaWYgKCFkZXZpY2UtPnBvd2VyX2VuYWJsZWQpIHsKIAkJZHByaW50ayhWSURDX1dBUk4sCiAJCQkiSEZJIFdyaXRlIHJlZ2lzdGVyIGZhaWxlZCA6IFBvd2VyIGlzIE9GRlxuIik7Ci0JCVdBUk5fT04oMSk7CisJCW1zbV92aWRjX3Jlc19oYW5kbGVfZmF0YWxfaHdfZXJyb3IoZGV2aWNlLT5yZXMsIHRydWUpOwogCQlyZXR1cm47CiAJfQogCkBAIC02NTUsNyArNjU3LDcgQEAKIAlpZiAoIWRldmljZS0+cG93ZXJfZW5hYmxlZCkgewogCQlkcHJpbnRrKFZJRENfV0FSTiwKIAkJCSJIRkkgUmVhZCByZWdpc3RlciBmYWlsZWQgOiBQb3dlciBpcyBPRkZcbiIpOwotCQlXQVJOX09OKDEpOworCQltc21fdmlkY19yZXNfaGFuZGxlX2ZhdGFsX2h3X2Vycm9yKGRldmljZS0+cmVzLCB0cnVlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMDQ1LDkgKzEwNDcsOSBAQAogCiAJbXV0ZXhfbG9jaygmZGV2aWNlLT5sb2NrKTsKIAotCWlmIChkZXZpY2UtPnBvd2VyX2VuYWJsZWQpIHsKLQkJZHByaW50ayhWSURDX0RCRywgIlZlbnVzIGlzIGJ1c3lcbiIpOwotCQlyYyA9IC1FQlVTWTsKKwlpZiAoIWRldmljZS0+cG93ZXJfZW5hYmxlZCkgeworCQlkcHJpbnRrKFZJRENfV0FSTiwgIiVzOiB2ZW51cyBwb3dlciBvZmZcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CiAJfQogCV9fZmx1c2hfZGVidWdfcXVldWUoZGV2aWNlLCBOVUxMKTsKQEAgLTE2OTEsNiArMTY5MywxMiBAQAogCiAJZGV2LT5idXNfdm90ZS5kYXRhID0KIAkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHZpZGNfYnVzX3ZvdGVfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5idXNfdm90ZS5kYXRhKSB7CisJCWRwcmludGsoVklEQ19FUlIsICJCdXMgdm90ZSBkYXRhIG1lbW9yeSBpcyBub3QgYWxsb2NhdGVkXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub19tZW07CisJfQorCiAJZGV2LT5idXNfdm90ZS5kYXRhX2NvdW50ID0gMTsKIAlkZXYtPmJ1c192b3RlLmRhdGEtPnBvd2VyX21vZGUgPSBWSURDX1BPV0VSX1RVUkJPOwogCkBAIC0xNzQ5LDkgKzE3NTcsOCBAQAogCWlmIChyYyB8fCBfX2lmYWNlX2NtZHFfd3JpdGUoZGV2LCAmdmVyc2lvbl9wa3QpKQogCQlkcHJpbnRrKFZJRENfV0FSTiwgIkZhaWxlZCB0byBzZW5kIGltYWdlIHZlcnNpb24gcGt0IHRvIGYvd1xuIik7CiAKLQlyYyA9IF9fZW5hYmxlX3N1YmNhY2hlcyhkZXZpY2UpOwotCWlmICghcmMpCi0JCV9fc2V0X3N1YmNhY2hlcyhkZXZpY2UpOworCV9fZW5hYmxlX3N1YmNhY2hlcyhkZXZpY2UpOworCV9fc2V0X3N1YmNhY2hlcyhkZXZpY2UpOwogCiAJaWYgKGRldi0+cmVzLT5wbV9xb3NfbGF0ZW5jeV91cykgewogI2lmZGVmIENPTkZJR19TTVAKQEAgLTE3NjgsNiArMTc3NSw3IEBACiAJX19zZXRfc3RhdGUoZGV2LCBWRU5VU19TVEFURV9ERUlOSVQpOwogCV9fdW5sb2FkX2Z3KGRldik7CiBlcnJfbG9hZF9mdzoKK2Vycl9ub19tZW06CiAJZHByaW50ayhWSURDX0VSUiwgIkNvcmUgaW5pdCBmYWlsZWRcbiIpOwogCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAlyZXR1cm4gcmM7CkBAIC0zMDY1LDcgKzMwNzMsMTEgQEAKIAkJaWYgKHNlc3Npb25faWQpIHsKIAkJCXN0cnVjdCBoYWxfc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CiAKLQkJCVdBUk5fT04odXBwZXJfMzJfYml0cygodWludHB0cl90KSpzZXNzaW9uX2lkKSAhPSAwKTsKKwkJCWlmICh1cHBlcl8zMl9iaXRzKCh1aW50cHRyX3QpKnNlc3Npb25faWQpICE9IDApIHsKKwkJCQlkcHJpbnRrKFZJRENfRVJSLAorCQkJCQkiVXBwZXIgMzItYml0cyAhPSAwIGZvciBzZXNzX2lkPSVwS1xuIiwKKwkJCQkJKnNlc3Npb25faWQpOworCQkJfQogCQkJc2Vzc2lvbiA9IF9fZ2V0X3Nlc3Npb24oZGV2aWNlLAogCQkJCQkodTMyKSh1aW50cHRyX3QpKnNlc3Npb25faWQpOwogCQkJaWYgKCFzZXNzaW9uKSB7CkBAIC0zNjY4LDcgKzM2ODAsOCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBfX2Rpc2FibGVfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfaW5mbyAqcmluZm8pCitzdGF0aWMgaW50IF9fZGlzYWJsZV9yZWd1bGF0b3Ioc3RydWN0IHJlZ3VsYXRvcl9pbmZvICpyaW5mbywKKwkJCQlzdHJ1Y3QgdmVudXNfaGZpX2RldmljZSAqZGV2aWNlKQogewogCWludCByYyA9IDA7CiAKQEAgLTM2ODAsNyArMzY5Myw3IEBACiAJICogaXMgdW5rbm93bi4KIAkgKi8KIAotCXJjID0gX19hY3F1aXJlX3JlZ3VsYXRvcihyaW5mbyk7CisJcmMgPSBfX2FjcXVpcmVfcmVndWxhdG9yKHJpbmZvLCBkZXZpY2UpOwogCWlmIChyYykgewogCQkvKgogCQkgKiBUaGlzIGlzIHNvbWV3aGF0IGZhdGFsLCBidXQgbm90aGluZyB3ZSBjYW4gZG8KQEAgLTM3MDYsNyArMzcxOSw3IEBACiBkaXNhYmxlX3JlZ3VsYXRvcl9mYWlsZWQ6CiAKIAkvKiBCcmluZyBhdHRlbnRpb24gdG8gdGhpcyBpc3N1ZSAqLwotCVdBUk5fT04oMSk7CisJbXNtX3ZpZGNfcmVzX2hhbmRsZV9mYXRhbF9od19lcnJvcihkZXZpY2UtPnJlcywgdHJ1ZSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zNzUyLDcgKzM3NjUsNyBAQAogCiBlcnJfcmVnX2VuYWJsZV9mYWlsZWQ6CiAJdmVudXNfaGZpX2Zvcl9lYWNoX3JlZ3VsYXRvcl9yZXZlcnNlX2NvbnRpbnVlKGRldmljZSwgcmluZm8sIGMpCi0JCV9fZGlzYWJsZV9yZWd1bGF0b3IocmluZm8pOworCQlfX2Rpc2FibGVfcmVndWxhdG9yKHJpbmZvLCBkZXZpY2UpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMzc2NSw3ICszNzc4LDcgQEAKIAlkcHJpbnRrKFZJRENfREJHLCAiRGlzYWJsaW5nIHJlZ3VsYXRvcnNcbiIpOwogCiAJdmVudXNfaGZpX2Zvcl9lYWNoX3JlZ3VsYXRvcl9yZXZlcnNlKGRldmljZSwgcmluZm8pCi0JCV9fZGlzYWJsZV9yZWd1bGF0b3IocmluZm8pOworCQlfX2Rpc2FibGVfcmVndWxhdG9yKHJpbmZvLCBkZXZpY2UpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMzc4Myw4ICszNzk2LDkgQEAKIAl2ZW51c19oZmlfZm9yX2VhY2hfc3ViY2FjaGUoZGV2aWNlLCBzaW5mbykgewogCQlyYyA9IGxsY2Nfc2xpY2VfYWN0aXZhdGUoc2luZm8tPnN1YmNhY2hlKTsKIAkJaWYgKHJjKSB7Ci0JCQlkcHJpbnRrKFZJRENfRVJSLCAiRmFpbGVkIHRvIGFjdGl2YXRlICVzOiAlZFxuIiwKKwkJCWRwcmludGsoVklEQ19XQVJOLCAiRmFpbGVkIHRvIGFjdGl2YXRlICVzOiAlZFxuIiwKIAkJCQlzaW5mby0+bmFtZSwgcmMpOworCQkJbXNtX3ZpZGNfcmVzX2hhbmRsZV9mYXRhbF9od19lcnJvcihkZXZpY2UtPnJlcywgdHJ1ZSk7CiAJCQlnb3RvIGVycl9hY3RpdmF0ZV9mYWlsOwogCQl9CiAJCXNpbmZvLT5pc2FjdGl2ZSA9IHRydWU7CkBAIC0zNzk5LDcgKzM4MTMsNyBAQAogZXJyX2FjdGl2YXRlX2ZhaWw6CiAJX19yZWxlYXNlX3N1YmNhY2hlcyhkZXZpY2UpOwogCV9fZGlzYWJsZV9zdWJjYWNoZXMoZGV2aWNlKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX3NldF9zdWJjYWNoZXMoc3RydWN0IHZlbnVzX2hmaV9kZXZpY2UgKmRldmljZSkKQEAgLTM4NDEsMjUgKzM4NTUsMjUgQEAKIAogCQlyYyA9IF9fY29yZV9zZXRfcmVzb3VyY2UoZGV2aWNlLCAmcmhkciwgKHZvaWQgKilzY19yZXNfaW5mbyk7CiAJCWlmIChyYykgewotCQkJZHByaW50ayhWSURDX0VSUiwgIkZhaWxlZCB0byBzZXQgc3ViY2FjaGVzICVkXG4iLCByYyk7CisJCQlkcHJpbnRrKFZJRENfV0FSTiwgIkZhaWxlZCB0byBzZXQgc3ViY2FjaGVzICVkXG4iLCByYyk7CiAJCQlnb3RvIGVycl9mYWlsX3NldF9zdWJhY2FjaGVzOwogCQl9Ci0JfQogCi0JdmVudXNfaGZpX2Zvcl9lYWNoX3N1YmNhY2hlKGRldmljZSwgc2luZm8pIHsKLQkJaWYgKHNpbmZvLT5pc2FjdGl2ZSA9PSB0cnVlKQotCQkJc2luZm8tPmlzc2V0ID0gdHJ1ZTsKLQl9CisJCXZlbnVzX2hmaV9mb3JfZWFjaF9zdWJjYWNoZShkZXZpY2UsIHNpbmZvKSB7CisJCQlpZiAoc2luZm8tPmlzYWN0aXZlID09IHRydWUpCisJCQkJc2luZm8tPmlzc2V0ID0gdHJ1ZTsKKwkJfQogCi0JZHByaW50ayhWSURDX0RCRywgIlNldCBTdWJjYWNoZXMgZG9uZSB0byBWZW51c1xuIik7Ci0JZGV2aWNlLT5yZXMtPnN5c19jYWNoZV9yZXNfc2V0ID0gdHJ1ZTsKKwkJZHByaW50ayhWSURDX0RCRywgIlNldCBTdWJjYWNoZXMgZG9uZSB0byBWZW51c1xuIik7CisJCWRldmljZS0+cmVzLT5zeXNfY2FjaGVfcmVzX3NldCA9IHRydWU7CisJfQogCiAJcmV0dXJuIDA7CiAKIGVycl9mYWlsX3NldF9zdWJhY2FjaGVzOgogCV9fZGlzYWJsZV9zdWJjYWNoZXMoZGV2aWNlKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX3JlbGVhc2Vfc3ViY2FjaGVzKHN0cnVjdCB2ZW51c19oZmlfZGV2aWNlICpkZXZpY2UpCkBAIC0zODk4LDEzICszOTEyLDEzIEBACiAKIAkJcmMgPSBfX2NvcmVfcmVsZWFzZV9yZXNvdXJjZShkZXZpY2UsICZyaGRyKTsKIAkJaWYgKHJjKQotCQkJZHByaW50ayhWSURDX0VSUiwKKwkJCWRwcmludGsoVklEQ19XQVJOLAogCQkJCSJGYWlsZWQgdG8gcmVsZWFzZSAlZCBzdWJjYWNoZXNcbiIsIGMpOwogCX0KIAogCWRldmljZS0+cmVzLT5zeXNfY2FjaGVfcmVzX3NldCA9IGZhbHNlOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGlzYWJsZV9zdWJjYWNoZXMoc3RydWN0IHZlbnVzX2hmaV9kZXZpY2UgKmRldmljZSkKQEAgLTM5MjIsNyArMzkzNiw3IEBACiAJCQkJc2luZm8tPm5hbWUpOwogCQkJcmMgPSBsbGNjX3NsaWNlX2RlYWN0aXZhdGUoc2luZm8tPnN1YmNhY2hlKTsKIAkJCWlmIChyYykgewotCQkJCWRwcmludGsoVklEQ19FUlIsCisJCQkJZHByaW50ayhWSURDX1dBUk4sCiAJCQkJCSJGYWlsZWQgdG8gZGUtYWN0aXZhdGUgJXM6ICVkXG4iLAogCQkJCQlzaW5mby0+bmFtZSwgcmMpOwogCQkJfQpAQCAtMzkzMCw3ICszOTQ0LDcgQEAKIAkJfQogCX0KIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX3ZlbnVzX3Bvd2VyX29uKHN0cnVjdCB2ZW51c19oZmlfZGV2aWNlICpkZXZpY2UpCkBAIC00MTA0LDkgKzQxMTgsOCBAQAogCiAJX19zeXNfc2V0X2RlYnVnKGRldmljZSwgbXNtX3ZpZGNfZndfZGVidWcpOwogCi0JcmMgPSBfX2VuYWJsZV9zdWJjYWNoZXMoZGV2aWNlKTsKLQlpZiAoIXJjKQotCQlfX3NldF9zdWJjYWNoZXMoZGV2aWNlKTsKKwlfX2VuYWJsZV9zdWJjYWNoZXMoZGV2aWNlKTsKKwlfX3NldF9zdWJjYWNoZXMoZGV2aWNlKTsKIAogCWRwcmludGsoVklEQ19QUk9GLCAiUmVzdW1lZCBmcm9tIHBvd2VyIGNvbGxhcHNlXG4iKTsKIGV4aXQ6CkBAIC00Mjc1LDEwICs0Mjg4LDY1IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCBfX25vY19lcnJvcl9pbmZvKHN0cnVjdCB2ZW51c19oZmlfZGV2aWNlICpkZXZpY2UsIHUzMiBjb3JlX251bSkKK3sKKwl1MzIgdmNvZGVjX2NvcmVfdmlkZW9fbm9jX2Jhc2Vfb2ZmcywgdmFsOworCisJaWYgKCFkZXZpY2UpIHsKKwkJZHByaW50ayhWSURDX0VSUiwgIiVzOiBudWxsIGRldmljZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICghY29yZV9udW0pIHsKKwkJdmNvZGVjX2NvcmVfdmlkZW9fbm9jX2Jhc2Vfb2ZmcyA9CisJCQlWQ09ERUNfQ09SRTBfVklERU9fTk9DX0JBU0VfT0ZGUzsKKwl9IGVsc2UgaWYgKGNvcmVfbnVtID09IDEpIHsKKwkJdmNvZGVjX2NvcmVfdmlkZW9fbm9jX2Jhc2Vfb2ZmcyA9CisJCQlWQ09ERUNfQ09SRTFfVklERU9fTk9DX0JBU0VfT0ZGUzsKKwl9IGVsc2UgeworCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IGludmFsaWQgY29yZV9udW0gJXVcbiIsCisJCQlfX2Z1bmNfXywgY29yZV9udW0pOworCQlyZXR1cm47CisJfQorCisJdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgdmNvZGVjX2NvcmVfdmlkZW9fbm9jX2Jhc2Vfb2ZmcyArCisJCQlWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9TV0lEX0xPV19PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfU1dJRF9MT1c6ICAgICAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworCXZhbCA9IF9fcmVhZF9yZWdpc3RlcihkZXZpY2UsIHZjb2RlY19jb3JlX3ZpZGVvX25vY19iYXNlX29mZnMgKworCQkJVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfU1dJRF9ISUdIX09GRlMpOworCWRwcmludGsoVklEQ19FUlIsICJDT1JFJWRfTk9DX0VSUl9TV0lEX0hJR0g6ICAgICUjeFxuIiwgY29yZV9udW0sIHZhbCk7CisJdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgdmNvZGVjX2NvcmVfdmlkZW9fbm9jX2Jhc2Vfb2ZmcyArCisJCQlWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9NQUlOQ1RMX0xPV19PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfTUFJTkNUTF9MT1c6ICAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworCXZhbCA9IF9fcmVhZF9yZWdpc3RlcihkZXZpY2UsIHZjb2RlY19jb3JlX3ZpZGVvX25vY19iYXNlX29mZnMgKworCQkJVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HMF9MT1dfT0ZGUyk7CisJZHByaW50ayhWSURDX0VSUiwgIkNPUkUlZF9OT0NfRVJSX0VSUkxPRzBfTE9XOiAgJSN4XG4iLCBjb3JlX251bSwgdmFsKTsKKwl2YWwgPSBfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCB2Y29kZWNfY29yZV92aWRlb19ub2NfYmFzZV9vZmZzICsKKwkJCVZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzBfSElHSF9PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfRVJSTE9HMF9ISUdIOiAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworCXZhbCA9IF9fcmVhZF9yZWdpc3RlcihkZXZpY2UsIHZjb2RlY19jb3JlX3ZpZGVvX25vY19iYXNlX29mZnMgKworCQkJVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HMV9MT1dfT0ZGUyk7CisJZHByaW50ayhWSURDX0VSUiwgIkNPUkUlZF9OT0NfRVJSX0VSUkxPRzFfTE9XOiAgJSN4XG4iLCBjb3JlX251bSwgdmFsKTsKKwl2YWwgPSBfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCB2Y29kZWNfY29yZV92aWRlb19ub2NfYmFzZV9vZmZzICsKKwkJCVZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzFfSElHSF9PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfRVJSTE9HMV9ISUdIOiAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworCXZhbCA9IF9fcmVhZF9yZWdpc3RlcihkZXZpY2UsIHZjb2RlY19jb3JlX3ZpZGVvX25vY19iYXNlX29mZnMgKworCQkJVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HMl9MT1dfT0ZGUyk7CisJZHByaW50ayhWSURDX0VSUiwgIkNPUkUlZF9OT0NfRVJSX0VSUkxPRzJfTE9XOiAgJSN4XG4iLCBjb3JlX251bSwgdmFsKTsKKwl2YWwgPSBfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCB2Y29kZWNfY29yZV92aWRlb19ub2NfYmFzZV9vZmZzICsKKwkJCVZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzJfSElHSF9PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfRVJSTE9HMl9ISUdIOiAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworCXZhbCA9IF9fcmVhZF9yZWdpc3RlcihkZXZpY2UsIHZjb2RlY19jb3JlX3ZpZGVvX25vY19iYXNlX29mZnMgKworCQkJVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HM19MT1dfT0ZGUyk7CisJZHByaW50ayhWSURDX0VSUiwgIkNPUkUlZF9OT0NfRVJSX0VSUkxPRzNfTE9XOiAgJSN4XG4iLCBjb3JlX251bSwgdmFsKTsKKwl2YWwgPSBfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCB2Y29kZWNfY29yZV92aWRlb19ub2NfYmFzZV9vZmZzICsKKwkJCVZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzNfSElHSF9PRkZTKTsKKwlkcHJpbnRrKFZJRENfRVJSLCAiQ09SRSVkX05PQ19FUlJfRVJSTE9HM19ISUdIOiAlI3hcbiIsIGNvcmVfbnVtLCB2YWwpOworfQorCiBzdGF0aWMgaW50IHZlbnVzX2hmaV9ub2NfZXJyb3JfaW5mbyh2b2lkICpkZXYpCiB7CiAJc3RydWN0IHZlbnVzX2hmaV9kZXZpY2UgKmRldmljZTsKLQl1MzIgdmFsID0gMDsKKwljb25zdCB1MzIgY29yZTAgPSAwLCBjb3JlMSA9IDE7CiAKIAlpZiAoIWRldikgewogCQlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IG51bGwgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CkBAIC00Mjg5LDQ0ICs0MzU3LDEzIEBACiAJbXV0ZXhfbG9jaygmZGV2aWNlLT5sb2NrKTsKIAlkcHJpbnRrKFZJRENfRVJSLCAiJXM6IG5vbiBlcnJvciBpbmZvcm1hdGlvblxuIiwgX19mdW5jX18pOwogCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUwMCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfU1dJRF9MT1coMHgwMEFBMEM1MDApOiAgICAgJSN4XG4iLCB2YWwpOworCWlmIChfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCBWQ09ERUNfQ09SRTBfVklERU9fTk9DX0JBU0VfT0ZGUyArCisJCQlWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJWTERfTE9XX09GRlMpKQorCQlfX25vY19lcnJvcl9pbmZvKGRldmljZSwgY29yZTApOwogCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUwNCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfU1dJRF9ISUdIKDB4MDBBQTBDNTA0KTogICAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUwOCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfTUFJTkNUTF9MT1coMHgwMEFBMEM1MDgpOiAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUxMCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSVkxEX0xPVygweDAwQUEwQzUxMCk6ICAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUxOCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSQ0xSX0xPVygweDAwQUEwQzUxOCk6ICAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUyMCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMF9MT1coMHgwMEFBMEM1MjApOiAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUyNCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMF9ISUdIKDB4MDBBQTBDNTI0KTogJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUyOCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMV9MT1coMHgwMEFBMEM1MjgpOiAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUyQyk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMV9ISUdIKDB4MDBBQTBDNTJDKTogJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUzMCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMl9MT1coMHgwMEFBMEM1MzApOiAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUzNCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HMl9ISUdIKDB4MDBBQTBDNTM0KTogJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUzOCk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HM19MT1coMHgwMEFBMEM1MzgpOiAgJSN4XG4iLCB2YWwpOwotCi0JdmFsID0gX19yZWFkX3JlZ2lzdGVyKGRldmljZSwgMHgwQzUzQyk7Ci0JZHByaW50ayhWSURDX0VSUiwgIk5PQ19FUlJfRVJSTE9HM19ISUdIKDB4MDBBQTBDNTNDKTogJSN4XG4iLCB2YWwpOworCWlmIChfX3JlYWRfcmVnaXN0ZXIoZGV2aWNlLCBWQ09ERUNfQ09SRTFfVklERU9fTk9DX0JBU0VfT0ZGUyArCisJCQlWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJWTERfTE9XX09GRlMpKQorCQlfX25vY19lcnJvcl9pbmZvKGRldmljZSwgY29yZTEpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZpZGNfaGZpX2FwaS5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy92aWRjX2hmaV9hcGkuaAppbmRleCBmZjQzZTNkLi41M2RmOTBmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy92aWRjX2hmaV9hcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZpZGNfaGZpX2FwaS5oCkBAIC00MzMsNiArNDMzLDcgQEAKIAlIQUxfQ09MT1JfRk9STUFUX05WMTJfVFAxMF9VQldDID0gMHgwMDAwNDAwMCwKIAlIQUxfQ09MT1JfRk9STUFUX1JHQkE4ODg4ICAgICAgID0gMHgwMDAwODAwMCwKIAlIQUxfQ09MT1JfRk9STUFUX1JHQkE4ODg4X1VCV0MgID0gMHgwMDAxMDAwMCwKKwlIQUxfQ09MT1JfRk9STUFUX1AwMTAgICAgICAgICAgID0gMHgwMDAyMDAwMCwKIAlIQUxfVU5VU0VEX0NPTE9SICAgICAgICAgICAgICAgID0gMHgxMDAwMDAwMCwKIH07CiAKQEAgLTY1OSw2ICs2NjAsNyBAQAogCUhBTF9GTElQX05PTkUsCiAJSEFMX0ZMSVBfSE9SSVpPTlRBTCwKIAlIQUxfRkxJUF9WRVJUSUNBTCwKKwlIQUxfRkxJUF9CT1RILAogCUhBTF9VTlVTRURfRkxJUCA9IDB4MTAwMDAwMDAsCiB9OwogCkBAIC04NjYsOCArODY4LDggQEAKIH07CiAKIGVudW0gaGFsX3dvcmtfbW9kZSB7Ci0JVklEQ19XT1JLX01PREVfMSwKLQlWSURDX1dPUktfTU9ERV8yLAorCVZJRENfV09SS19NT0RFXzEgPSAxLAorCVZJRENfV09SS19NT0RFXzIgPSAyLAogCVZJRENfV09SS19NT0RFX1VOVVNFRCA9IDB4MTAwMDAwMDAsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZpZGNfaGZpX2lvLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL21zbS92aWRjL3ZpZGNfaGZpX2lvLmgKaW5kZXggZmMzMmQ3My4uMzQzMzQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tc20vdmlkYy92aWRjX2hmaV9pby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXNtL3ZpZGMvdmlkY19oZmlfaW8uaApAQCAtMTkwLDQgKzE5MCwyNSBAQAogI2RlZmluZSBWSURDX1VDX1JFR0lPTl9BRERSIDB4MDAwRDIwNjQKICNkZWZpbmUgVklEQ19VQ19SRUdJT05fU0laRSAweDAwMEQyMDY4CiAKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTU9EVUxFOiB2Y29kZWMgbm9jIGVycm9yIGxvZyByZWdpc3RlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgVkNPREVDX0NPUkUwX1ZJREVPX05PQ19CQVNFX09GRlMJCTB4MDAwMDQwMDAKKyNkZWZpbmUgVkNPREVDX0NPUkUxX1ZJREVPX05PQ19CQVNFX09GRlMJCTB4MDAwMEMwMDAKKyNkZWZpbmUgVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfU1dJRF9MT1dfT0ZGUwkweDA1MDAKKyNkZWZpbmUgVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfU1dJRF9ISUdIX09GRlMJMHgwNTA0CisjZGVmaW5lIFZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX01BSU5DVExfTE9XX09GRlMJMHgwNTA4CisjZGVmaW5lIFZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUlZMRF9MT1dfT0ZGUwkweDA1MTAKKyNkZWZpbmUgVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSQ0xSX0xPV19PRkZTCTB4MDUxOAorI2RlZmluZSBWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJMT0cwX0xPV19PRkZTCTB4MDUyMAorI2RlZmluZSBWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJMT0cwX0hJR0hfT0ZGUwkweDA1MjQKKyNkZWZpbmUgVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HMV9MT1dfT0ZGUwkweDA1MjgKKyNkZWZpbmUgVkNPREVDX0NPUkVYX1ZJREVPX05PQ19FUlJfRVJSTE9HMV9ISUdIX09GRlMJMHgwNTJDCisjZGVmaW5lIFZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzJfTE9XX09GRlMJMHgwNTMwCisjZGVmaW5lIFZDT0RFQ19DT1JFWF9WSURFT19OT0NfRVJSX0VSUkxPRzJfSElHSF9PRkZTCTB4MDUzNAorI2RlZmluZSBWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJMT0czX0xPV19PRkZTCTB4MDUzOAorI2RlZmluZSBWQ09ERUNfQ09SRVhfVklERU9fTk9DX0VSUl9FUlJMT0czX0hJR0hfT0ZGUwkweDA1M0MKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItbGlyYy1jb2RlYy5jCmluZGV4IGMzMjc3MzA4Li5iNDlmODBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBMSVJDX0dFVF9SRUNfUkVTT0xVVElPTjoKLQkJdmFsID0gZGV2LT5yeF9yZXNvbHV0aW9uOworCQl2YWwgPSBkZXYtPnJ4X3Jlc29sdXRpb24gLyAxMDAwOwogCQlicmVhazsKIAogCWNhc2UgTElSQ19TRVRfV0lERUJBTkRfUkVDRUlWRVI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCA3MTM0MWE3Li41MjFiNjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTE2MzYsMjAgKzE2MzYsNiBAQAogCSAgcG93ZXIgc3VwcGx5IGVuYWJsZSBvciBkaXNhYmxlLiBUaGlzIGRyaXZlciBhY3RzIGFzIGludGVyZmFjZQogCSAgYmV0d2VlbiBjb2RlYyBhbmQgcmVndWxhdG9yIGZyYW1ld29yay4KIAotY29uZmlnIFdDRDlYWFhfQ09ERUNfQ09SRQotCXRyaXN0YXRlICJXQ0Q5WFhYIENvZGVjIENvcmUiCi0Jc2VsZWN0IFNMSU1CVVMKLQlzZWxlY3QgU09VTkRXSVJFX1dDRF9DVFJMCi0Jc2VsZWN0IE1TTV9DRENfU1VQUExZCi0Jc2VsZWN0IE1TTV9DRENfUElOQ1RSTAotCXNlbGVjdCBSRUdNQVBfQUxMT1dfV1JJVEVfREVCVUdGUwotCXNlbGVjdCBQSU5DVFJMX1dDRAotCWhlbHAKLQkgIFdDRDlYWFggQ29yZSBkcml2ZXIgcHJvdmlkZXMgQVBJcyBmb3IgV0NEIGRyaXZlcnMgdG8gcmVzZXQsCi0JICBzdXNwZW5kL3Jlc3VtZSwgcmVnbWFwIGJ1cyBjYWxsYmFjayBmdW5jdGlvbnMgYW5kIHJlYWQvd3JpdGUKLQkgIGZ1bmN0aW9ucy4gVGhpcyBkcml2ZXIgYWxzbyBoaWRlcyB0aGUgdW5kZXJseWluZyBidXMgcmVsYXRlZAotCSAgZnVuY3Rpb25hbGl0aWVzLgotCiBtZW51ICJNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDBjZTcwZjMuLmVhZTY0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0yMDUsMTMgKzIwNSw2IEBACiBvYmotJChDT05GSUdfTUZEX0RMTjIpCQkrPSBkbG4yLm8KIG9iai0kKENPTkZJR19NRkRfUlQ1MDMzKQkrPSBydDUwMzMubwogb2JqLSQoQ09ORklHX01GRF9TS1k4MTQ1MikJKz0gc2t5ODE0NTIubwotd2NkLWNvcmUtb2JqcwkJCTo9IHdjZDl4eHgtcnN0Lm8gd2NkOXh4eC1jb3JlLWluaXQubyBcCi0JCQkJICAgd2NkOXh4eC1jb3JlLm8gd2NkOXh4eC1pcnEubyBcCi0JCQkJICAgd2NkOXh4eC1zbGltc2xhdmUubyB3Y2Q5eHh4LXV0aWxzLm8gXAotCQkJCSAgIHdjZDkzNHgtcmVnbWFwLm8gd2NkOTM0eC10YWJsZXMubyBcCi0JCQkJICAgd2NkOTMzNS1yZWdtYXAubyB3Y2Q5MzM1LXRhYmxlcy5vIFwKLQkJCQkgICBtc20tY2RjLXBpbmN0cmwubyBtc20tY2RjLXN1cHBseS5vCi1vYmotJChDT05GSUdfV0NEOVhYWF9DT0RFQ19DT1JFKSArPSB3Y2QtY29yZS5vCiBpbnRlbC1zb2MtcG1pYy1vYmpzCQk6PSBpbnRlbF9zb2NfcG1pY19jb3JlLm8gaW50ZWxfc29jX3BtaWNfY3JjLm8KIGludGVsLXNvYy1wbWljLSQoQ09ORklHX0lOVEVMX1BNQ19JUEMpCSs9IGludGVsX3NvY19wbWljX2J4dHdjLm8KIG9iai0kKENPTkZJR19JTlRFTF9TT0NfUE1JQykJKz0gaW50ZWwtc29jLXBtaWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbXNtLWNkYy1waW5jdHJsLmMgYi9kcml2ZXJzL21mZC9tc20tY2RjLXBpbmN0cmwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZmZkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC9tc20tY2RjLXBpbmN0cmwuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmg+Ci0KLXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyB7Ci0Jc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7Ci0Jc3RydWN0IHBpbmN0cmxfc3RhdGUgKnBpbmN0cmxfYWN0aXZlOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpwaW5jdHJsX3NsZWVwOwotCWludCBncGlvOwotCWJvb2wgc3RhdGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvICptc21fY2RjX3BpbmN0cmxfZ2V0X2dwaW9kYXRhKAotCQkJCQkJc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOwotCi0JaWYgKCFucCkgewotCQlwcl9lcnIoIiVzOiBkZXZpY2Ugbm9kZSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKLQlpZiAoIXBkZXYpIHsKLQkJcHJfZXJyKCIlczogcGxhdGZvcm0gZGV2aWNlIG5vdCBmb3VuZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCWlmICghZ3Bpb19kYXRhKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY2Fubm90IGZpbmQgY2RjIGdwaW8gaW5mb1xuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiBncGlvX2RhdGE7Ci19Ci0KLS8qCi0gKiBtc21fY2RjX2dldF9ncGlvX3N0YXRlOiBzZWxlY3QgcGluY3RybCBzbGVlcCBzdGF0ZQotICogQG5wOiBwb2ludGVyIHRvIHN0cnVjdCBkZXZpY2Vfbm9kZQotICoKLSAqIFJldHVybnMgZXJyb3IgY29kZSBmb3IgZmFpbHVyZSBhbmQgR1BJTyB2YWx1ZSBvbiBzdWNjZXNzCi0gKi8KLWludCBtc21fY2RjX2dldF9ncGlvX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvICpncGlvX2RhdGE7Ci0JaW50IHZhbHVlID0gLUVJTlZBTDsKLQotCWdwaW9fZGF0YSA9IG1zbV9jZGNfcGluY3RybF9nZXRfZ3Bpb2RhdGEobnApOwotCWlmICghZ3Bpb19kYXRhKQotCQlyZXR1cm4gdmFsdWU7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChncGlvX2RhdGEtPmdwaW8pKQotCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKGdwaW9fZGF0YS0+Z3Bpbyk7Ci0KLQlyZXR1cm4gdmFsdWU7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jZGNfZ2V0X2dwaW9fc3RhdGUpOwotCi0vKgotICogbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZTogc2VsZWN0IHBpbmN0cmwgc2xlZXAgc3RhdGUKLSAqIEBucDogcG9pbnRlciB0byBzdHJ1Y3QgZGV2aWNlX25vZGUKLSAqCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKLSAqLwotaW50IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8gKmdwaW9fZGF0YTsKLQotCWdwaW9fZGF0YSA9IG1zbV9jZGNfcGluY3RybF9nZXRfZ3Bpb2RhdGEobnApOwotCWlmICghZ3Bpb19kYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZ3Bpb19kYXRhLT5waW5jdHJsX3NsZWVwKSB7Ci0JCXByX2VycigiJXM6IHBpbmN0cmwgc2xlZXAgc3RhdGUgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZ3Bpb19kYXRhLT5zdGF0ZSA9IGZhbHNlOwotCi0JcmV0dXJuIHBpbmN0cmxfc2VsZWN0X3N0YXRlKGdwaW9fZGF0YS0+cGluY3RybCwKLQkJCQkgICAgZ3Bpb19kYXRhLT5waW5jdHJsX3NsZWVwKTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSk7Ci0KLS8qCi0gKiBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZTogc2VsZWN0IHBpbmN0cmwgYWN0aXZlIHN0YXRlCi0gKiBAbnA6IHBvaW50ZXIgdG8gc3RydWN0IGRldmljZV9ub2RlCi0gKgotICogUmV0dXJucyBlcnJvciBjb2RlIGZvciBmYWlsdXJlCi0gKi8KLWludCBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOwotCi0JZ3Bpb19kYXRhID0gbXNtX2NkY19waW5jdHJsX2dldF9ncGlvZGF0YShucCk7Ci0JaWYgKCFncGlvX2RhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFncGlvX2RhdGEtPnBpbmN0cmxfYWN0aXZlKSB7Ci0JCXByX2VycigiJXM6IHBpbmN0cmwgYWN0aXZlIHN0YXRlIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWdwaW9fZGF0YS0+c3RhdGUgPSB0cnVlOwotCi0JcmV0dXJuIHBpbmN0cmxfc2VsZWN0X3N0YXRlKGdwaW9fZGF0YS0+cGluY3RybCwKLQkJCQkgICAgZ3Bpb19kYXRhLT5waW5jdHJsX2FjdGl2ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKTsKLQotLyoKLSAqIG1zbV9jZGNfcGluY3RybF9nZXRfc3RhdGU6IGdldCBjdXJyZW4gcGluY3RybCBzdGF0ZQotICogQG5wOiBwb2ludGVyIHRvIHN0cnVjdCBkZXZpY2Vfbm9kZQotICoKLSAqIFJldHVybnMgMCBmb3Igc2xlZXAgc3RhdGUsIDEgZm9yIGFjdGl2ZSBzdGF0ZQotICovCi1ib29sIG1zbV9jZGNfcGluY3RybF9nZXRfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8gKmdwaW9fZGF0YTsKLQotCWdwaW9fZGF0YSA9IG1zbV9jZGNfcGluY3RybF9nZXRfZ3Bpb2RhdGEobnApOwotCWlmICghZ3Bpb19kYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBncGlvX2RhdGEtPnN0YXRlOwotfQotRVhQT1JUX1NZTUJPTChtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKTsKLQotc3RhdGljIGludCBtc21fY2RjX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX2NkY19waW5jdHJsX2luZm8gKmdwaW9fZGF0YTsKLQotCWdwaW9fZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9jZGNfcGluY3RybF9pbmZvKSwKLQkJCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFncGlvX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZ3Bpb19kYXRhLT5waW5jdHJsID0gZGV2bV9waW5jdHJsX2dldCgmcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSX09SX05VTEwoZ3Bpb19kYXRhLT5waW5jdHJsKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2Fubm90IGdldCBjZGMgZ3BpbyBwaW5jdHJsOiVsZFxuIiwKLQkJCV9fZnVuY19fLCBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybCkpOwotCQlyZXQgPSBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybCk7Ci0JCWdvdG8gZXJyX3BjdHJsX2dldDsKLQl9Ci0KLQlncGlvX2RhdGEtPnBpbmN0cmxfYWN0aXZlID0gcGluY3RybF9sb29rdXBfc3RhdGUoCi0JCQkJCWdwaW9fZGF0YS0+cGluY3RybCwgImF1ZF9hY3RpdmUiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoZ3Bpb19kYXRhLT5waW5jdHJsX2FjdGl2ZSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENhbm5vdCBnZXQgYXVkX2FjdGl2ZSBwaW5jdHJsIHN0YXRlOiVsZFxuIiwKLQkJCV9fZnVuY19fLCBQVFJfRVJSKGdwaW9fZGF0YS0+cGluY3RybF9hY3RpdmUpKTsKLQkJcmV0ID0gUFRSX0VSUihncGlvX2RhdGEtPnBpbmN0cmxfYWN0aXZlKTsKLQkJZ290byBlcnJfbG9va3VwX3N0YXRlOwotCX0KLQotCWdwaW9fZGF0YS0+cGluY3RybF9zbGVlcCA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKAotCQkJCQlncGlvX2RhdGEtPnBpbmN0cmwsICJhdWRfc2xlZXAiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoZ3Bpb19kYXRhLT5waW5jdHJsX3NsZWVwKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2Fubm90IGdldCBhdWRfc2xlZXAgcGluY3RybCBzdGF0ZTolbGRcbiIsCi0JCQlfX2Z1bmNfXywgUFRSX0VSUihncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApKTsKLQkJcmV0ID0gUFRSX0VSUihncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApOwotCQlnb3RvIGVycl9sb29rdXBfc3RhdGU7Ci0JfQotCS8qIHNraXAgc2V0dGluZyB0byBzbGVlcCBzdGF0ZSBmb3IgTFBJX1RMTU0gR1BJT3MgKi8KLQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgInFjb20sbHBpLWdwaW9zIikpIHsKLQkJLyogU2V0IHBpbmN0cmwgc3RhdGUgdG8gYXVkX3NsZWVwIGJ5IGRlZmF1bHQgKi8KLQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUoZ3Bpb19kYXRhLT5waW5jdHJsLAotCQkJCQkgICBncGlvX2RhdGEtPnBpbmN0cmxfc2xlZXApOwotCQlpZiAocmV0KQotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHNldCBjZGMgZ3BpbyBzbGVlcCBzdGF0ZSBmYWlsOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0KLQlncGlvX2RhdGEtPmdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJICAgICJxY29tLGNkYy1yc3Qtbi1ncGlvIiwgMCk7Ci0JaWYgKGdwaW9faXNfdmFsaWQoZ3Bpb19kYXRhLT5ncGlvKSkgewotCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb19kYXRhLT5ncGlvLCAiTVNNX0NEQ19SRVNFVCIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIHJlcXVlc3QgZ3BpbyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZ3Bpb19kYXRhLT5ncGlvKTsKLQkJCWdvdG8gZXJyX2xvb2t1cF9zdGF0ZTsKLQkJfQotCX0KLQotCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBncGlvX2RhdGEpOwotCXJldHVybiAwOwotCi1lcnJfbG9va3VwX3N0YXRlOgotCWRldm1fcGluY3RybF9wdXQoZ3Bpb19kYXRhLT5waW5jdHJsKTsKLWVycl9wY3RybF9nZXQ6Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBncGlvX2RhdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NkY19waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fY2RjX3BpbmN0cmxfaW5mbyAqZ3Bpb19kYXRhOwotCi0JZ3Bpb19kYXRhID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCi0JLyogdG8gZnJlZSB0aGUgcmVxdWVzdGVkIGdwaW8gYmVmb3JlIGV4aXRpbmcgKi8KLQlpZiAoZ3Bpb19kYXRhKSB7Ci0JCWlmIChncGlvX2lzX3ZhbGlkKGdwaW9fZGF0YS0+Z3BpbykpCi0JCQlncGlvX2ZyZWUoZ3Bpb19kYXRhLT5ncGlvKTsKLQotCQlpZiAoZ3Bpb19kYXRhLT5waW5jdHJsKQotCQkJZGV2bV9waW5jdHJsX3B1dChncGlvX2RhdGEtPnBpbmN0cmwpOwotCX0KLQotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZ3Bpb19kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fY2RjX3BpbmN0cmxfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tY2RjLXBpbmN0cmwifSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NkY19waW5jdHJsX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tY2RjLXBpbmN0cmwiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2NkY19waW5jdHJsX21hdGNoLAotCX0sCi0JLnByb2JlID0gbXNtX2NkY19waW5jdHJsX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fY2RjX3BpbmN0cmxfcmVtb3ZlLAotfTsKLQotaW50IG1zbV9jZGNfcGluY3RybF9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9jZGNfcGluY3RybF9kcml2ZXIpOwotfQotCi12b2lkIG1zbV9jZGNfcGluY3RybF9kcnZfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fY2RjX3BpbmN0cmxfZHJpdmVyKTsKLX0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIENPREVDIHBpbiBjb250cm9sIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbXNtLWNkYy1zdXBwbHkuYyBiL2RyaXZlcnMvbWZkL21zbS1jZGMtc3VwcGx5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljN2ViZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvbXNtLWNkYy1zdXBwbHkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLQotI2RlZmluZSBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFIDQwCi0KLXN0YXRpYyBpbnQgbXNtX2NkY19kdF9wYXJzZV92cmVnX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX29uZCkKLXsKLQljaGFyIHByb3BfbmFtZVtDT0RFQ19EVF9NQVhfUFJPUF9TSVpFXTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ3VsYXRvcl9ub2RlID0gTlVMTDsKLQljb25zdCBfX2JlMzIgKnByb3A7Ci0JaW50IGxlbiwgcmM7Ci0JdTMyIHByb3BfdmFsOwotCi0JLyogUGFyc2Ugc3VwcGx5IG5hbWUgKi8KLQlzbnByaW50Zihwcm9wX25hbWUsIENPREVDX0RUX01BWF9QUk9QX1NJWkUsICIlcy1zdXBwbHkiLCBuYW1lKTsKLQotCXJlZ3VsYXRvcl9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgMCk7Ci0JaWYgKCFyZWd1bGF0b3Jfbm9kZSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKLQkJCV9fZnVuY19fLCBwcm9wX25hbWUsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWNkY192cmVnLT5uYW1lID0gbmFtZTsKLQljZGNfdnJlZy0+b25kZW1hbmQgPSBpc19vbmQ7Ci0KLQkvKiBQYXJzZSBzdXBwbHkgLSB2b2x0YWdlICovCi0Jc25wcmludGYocHJvcF9uYW1lLCBDT0RFQ19EVF9NQVhfUFJPUF9TSVpFLCAicWNvbSwlcy12b2x0YWdlIiwgbmFtZSk7Ci0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgJmxlbik7Ci0JaWYgKCFwcm9wIHx8IChsZW4gIT0gKDIgKiBzaXplb2YoX19iZTMyKSkpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6ICVzICVzIHByb3BlcnR5XG4iLCBfX2Z1bmNfXywKLQkJCXByb3AgPyAiaW52YWxpZCBmb3JtYXQiIDogIm5vIiwgcHJvcF9uYW1lKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJY2RjX3ZyZWctPm1pbl91ViA9IGJlMzJfdG9fY3B1cCgmcHJvcFswXSk7Ci0JCWNkY192cmVnLT5tYXhfdVYgPSBiZTMyX3RvX2NwdXAoJnByb3BbMV0pOwotCX0KLQotCS8qIFBhcnNlIHN1cHBseSAtIGN1cnJlbnQgKi8KLQlzbnByaW50Zihwcm9wX25hbWUsIENPREVDX0RUX01BWF9QUk9QX1NJWkUsICJxY29tLCVzLWN1cnJlbnQiLCBuYW1lKTsKLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgcHJvcF9uYW1lLCAmcHJvcF92YWwpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKLQkJCV9fZnVuY19fLCBwcm9wX25hbWUsIGRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZ290byBkb25lOwotCX0KLQljZGNfdnJlZy0+b3B0aW11bV91QSA9IHByb3BfdmFsOwotCi0JZGV2X2luZm8oZGV2LCAiJXM6ICVzOiB2b2w9WyVkICVkXXVWLCBjdXJyPVslZF11QSwgb25kICVkXG4iLAotCQkgX19mdW5jX18sIGNkY192cmVnLT5uYW1lLCBjZGNfdnJlZy0+bWluX3VWLCBjZGNfdnJlZy0+bWF4X3VWLAotCQkgY2RjX3ZyZWctPm9wdGltdW1fdUEsIGNkY192cmVnLT5vbmRlbWFuZCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jZGNfcGFyc2Vfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY19yZWcsCi0JCQkJICBjb25zdCBjaGFyICpzdXBfbGlzdCwgaW50IHN1cF9jbnQsCi0JCQkJICBib29sIGlzX29uZCkKLXsKLQlpbnQgaWR4LCByYyA9IDA7Ci0JY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHN1cF9jbnQ7IGlkeCsrKSB7Ci0JCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLCBzdXBfbGlzdCwgaWR4LAotCQkJCQkJICAgJm5hbWUpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IHJlYWQgc3RyaW5nICVzWyVkXSBlcnJvciAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBzdXBfbGlzdCwgaWR4LCByYyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlkZXZfZGJnKGRldiwgIiVzOiBGb3VuZCBjZGMgc3VwcGx5ICVzIGFzIHBhcnQgb2YgJXNcbiIsCi0JCQlfX2Z1bmNfXywgbmFtZSwgc3VwX2xpc3QpOwotCi0JCXJjID0gbXNtX2NkY19kdF9wYXJzZV92cmVnX2luZm8oZGV2LCAmY2RjX3JlZ1tpZHhdLCBuYW1lLAotCQkJCQkJaXNfb25kKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiBwYXJzZSAlcyB2cmVnIGluZm8gZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIG5hbWUsIHJjKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NkY19jaGVja19zdXBwbHlfcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKLQkJCQkgICAgICBpbnQgbnVtX3N1cHBsaWVzKQotewotCWlmICghZGV2KSB7Ci0JCXByX2VycigiJXM6IGRldmljZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghY2RjX3ZyZWcgfHwgKG51bV9zdXBwbGllcyA8PSAwKSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBzdXBwbHkgY2hlY2sgZmFpbGVkOiB2cmVnOiAlcEssIG51bV9zdXBwbGllczogJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2RjX3ZyZWcsIG51bV9zdXBwbGllcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogbXNtX2NkY19kaXNhYmxlX3N0YXRpY19zdXBwbGllczoKLSAqCURpc2FibGUgY29kZWMgc3RhdGljIHN1cHBsaWVzCi0gKgotICogQGRldjogcG9pbnRlciB0byBjb2RlYyBkZXZpY2UKLSAqIEBzdXBwbGllczogcG9pbnRlciB0byByZWd1bGF0b3IgYnVsayBkYXRhCi0gKiBAY2RjX3ZyZWc6IHBvaW50ZXIgdG8gcGxhdGZvcm0gcmVndWxhdG9yIGRhdGEKLSAqIEBudW1fc3VwcGxpZXM6IG51bWJlciBvZiBzdXBwbGllcwotICoKLSAqIFJldHVybiBlcnJvciBjb2RlIGlmIHN1cHBseSBkaXNhYmxlIGlzIGZhaWxlZAotICovCi1pbnQgbXNtX2NkY19kaXNhYmxlX3N0YXRpY19zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllcywKLQkJCQkgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAotCQkJCSAgICBpbnQgbnVtX3N1cHBsaWVzKQotewotCWludCByYywgaTsKLQotCWlmICgoIWRldikgfHwgKCFzdXBwbGllcykgfHwgKCFjZGNfdnJlZykpIHsKLQkJcHJfZXJyKCIlczogZWl0aGVyIGRldiBvciBzdXBwbGllcyBvciBjZGNfdnJlZyBpcyBOVUxMXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0JcmMgPSBtc21fY2RjX2NoZWNrX3N1cHBseV9wYXJhbShkZXYsIGNkY192cmVnLCBudW1fc3VwcGxpZXMpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9zdXBwbGllczsgaSsrKSB7Ci0JCWlmIChjZGNfdnJlZ1tpXS5vbmRlbWFuZCkKLQkJCWNvbnRpbnVlOwotCi0JCXJjID0gcmVndWxhdG9yX2Rpc2FibGUoc3VwcGxpZXNbaV0uY29uc3VtZXIpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gZGlzYWJsZSBzdXBwbHkgJXMsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgc3VwcGxpZXNbaV0uc3VwcGx5LCByYyk7Ci0JCWVsc2UKLQkJCWRldl9kYmcoZGV2LCAiJXM6IGRpc2FibGVkIHJlZ3VsYXRvciAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgc3VwcGxpZXNbaV0uc3VwcGx5KTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMpOwotCi0vKgotICogbXNtX2NkY19yZWxlYXNlX3N1cHBsaWVzOgotICoJUmVsZWFzZSBjb2RlYyBwb3dlciBzdXBwbGllcwotICoKLSAqIEBkZXY6IHBvaW50ZXIgdG8gY29kZWMgZGV2aWNlCi0gKiBAc3VwcGxpZXM6IHBvaW50ZXIgdG8gcmVndWxhdG9yIGJ1bGsgZGF0YQotICogQGNkY192cmVnOiBwb2ludGVyIHRvIHBsYXRmb3JtIHJlZ3VsYXRvciBkYXRhCi0gKiBAbnVtX3N1cHBsaWVzOiBudW1iZXIgb2Ygc3VwcGxpZXMKLSAqCi0gKiBSZXR1cm4gZXJyb3IgY29kZSBpZiBzdXBwbHkgZGlzYWJsZSBpcyBmYWlsZWQKLSAqLwotaW50IG1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllcywKLQkJCSAgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAotCQkJICAgICBpbnQgbnVtX3N1cHBsaWVzKQotewotCWludCByYyA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAoKCFkZXYpIHx8ICghc3VwcGxpZXMpIHx8ICghY2RjX3ZyZWcpKSB7Ci0JCXByX2VycigiJXM6IGVpdGhlciBkZXYgb3Igc3VwcGxpZXMgb3IgY2RjX3ZyZWcgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCXJjID0gbXNtX2NkY19jaGVja19zdXBwbHlfcGFyYW0oZGV2LCBjZGNfdnJlZywgbnVtX3N1cHBsaWVzKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCW1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMoZGV2LCBzdXBwbGllcywgY2RjX3ZyZWcsCi0JCQkJCW51bV9zdXBwbGllcyk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9zdXBwbGllczsgaSsrKSB7Ci0JCWlmIChyZWd1bGF0b3JfY291bnRfdm9sdGFnZXMoc3VwcGxpZXNbaV0uY29uc3VtZXIpIDwgMCkKLQkJCWNvbnRpbnVlOwotCi0JCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdXBwbGllc1tpXS5jb25zdW1lciwgMCwKLQkJCQkgICAgICBjZGNfdnJlZ1tpXS5tYXhfdVYpOwotCQlyZWd1bGF0b3Jfc2V0X2xvYWQoc3VwcGxpZXNbaV0uY29uc3VtZXIsIDApOwotCQlkZXZtX3JlZ3VsYXRvcl9wdXQoc3VwcGxpZXNbaV0uY29uc3VtZXIpOwotCQlzdXBwbGllc1tpXS5jb25zdW1lciA9IE5VTEw7Ci0JfQotCWRldm1fa2ZyZWUoZGV2LCBzdXBwbGllcyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyk7Ci0KLS8qCi0gKiBtc21fY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXM6Ci0gKglFbmFibGUgY29kZWMgc3RhdGljIHN1cHBsaWVzCi0gKgotICogQGRldjogcG9pbnRlciB0byBjb2RlYyBkZXZpY2UKLSAqIEBzdXBwbGllczogcG9pbnRlciB0byByZWd1bGF0b3IgYnVsayBkYXRhCi0gKiBAY2RjX3ZyZWc6IHBvaW50ZXIgdG8gcGxhdGZvcm0gcmVndWxhdG9yIGRhdGEKLSAqIEBudW1fc3VwcGxpZXM6IG51bWJlciBvZiBzdXBwbGllcwotICoKLSAqIFJldHVybiBlcnJvciBjb2RlIGlmIHN1cHBseSBlbmFibGUgaXMgZmFpbGVkCi0gKi8KLWludCBtc21fY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllcywKLQkJCQkgICBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3ZyZWcsCi0JCQkJICAgaW50IG51bV9zdXBwbGllcykKLXsKLQlpbnQgcmMsIGk7Ci0KLQlpZiAoKCFkZXYpIHx8ICghc3VwcGxpZXMpIHx8ICghY2RjX3ZyZWcpKSB7Ci0JCXByX2VycigiJXM6IGVpdGhlciBkZXYgb3Igc3VwcGxpZXMgb3IgY2RjX3ZyZWcgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBpbnB1dCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCXJjID0gbXNtX2NkY19jaGVja19zdXBwbHlfcGFyYW0oZGV2LCBjZGNfdnJlZywgbnVtX3N1cHBsaWVzKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc3VwcGxpZXM7IGkrKykgewotCQlpZiAoY2RjX3ZyZWdbaV0ub25kZW1hbmQpCi0JCQljb250aW51ZTsKLQotCQlyYyA9IHJlZ3VsYXRvcl9lbmFibGUoc3VwcGxpZXNbaV0uY29uc3VtZXIpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBlbmFibGUgc3VwcGx5ICVzLCByYzogJWRcbiIsCi0JCQkJX19mdW5jX18sIHN1cHBsaWVzW2ldLnN1cHBseSwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl3aGlsZSAocmMgJiYgaS0tKQotCQlpZiAoIWNkY192cmVnW2ldLm9uZGVtYW5kKQotCQkJcmVndWxhdG9yX2Rpc2FibGUoc3VwcGxpZXNbaV0uY29uc3VtZXIpOwotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChtc21fY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMpOwotCi0vKgotICogbXNtX2NkY19pbml0X3N1cHBsaWVzOgotICoJSW5pdGlhbGl6ZSBjb2RlYyBzdGF0aWMgc3VwcGxpZXMgd2l0aCByZWd1bGF0b3IgZ2V0Ci0gKgotICogQGRldjogcG9pbnRlciB0byBjb2RlYyBkZXZpY2UKLSAqIEBzdXBwbGllczogcG9pbnRlciB0byByZWd1bGF0b3IgYnVsayBkYXRhCi0gKiBAY2RjX3ZyZWc6IHBvaW50ZXIgdG8gcGxhdGZvcm0gcmVndWxhdG9yIGRhdGEKLSAqIEBudW1fc3VwcGxpZXM6IG51bWJlciBvZiBzdXBwbGllcwotICoKLSAqIFJldHVybiBlcnJvciBjb2RlIGlmIHN1cHBseSBpbml0IGlzIGZhaWxlZAotICovCi1pbnQgbXNtX2NkY19pbml0X3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKipzdXBwbGllcywKLQkJCSAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAotCQkJICBpbnQgbnVtX3N1cHBsaWVzKQotewotCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICp2c3VwOwotCWludCByYzsKLQlpbnQgaTsKLQotCWlmICghZGV2IHx8ICFjZGNfdnJlZykgewotCQlwcl9lcnIoIiVzOiBkZXZpY2UgcG9pbnRlciBvciBkY2VfdnJlZyBpcyBOVUxMXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIGlucHV0IHBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0JcmMgPSBtc21fY2RjX2NoZWNrX3N1cHBseV9wYXJhbShkZXYsIGNkY192cmVnLCBudW1fc3VwcGxpZXMpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JdnN1cCA9IGRldm1fa2NhbGxvYyhkZXYsIG51bV9zdXBwbGllcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghdnN1cCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cHBsaWVzOyBpKyspIHsKLQkJaWYgKCFjZGNfdnJlZ1tpXS5uYW1lKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiBzdXBwbHkgbmFtZSBub3QgZGVmaW5lZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9zdXBwbHk7Ci0JCX0KLQkJdnN1cFtpXS5zdXBwbHkgPSBjZGNfdnJlZ1tpXS5uYW1lOwotCX0KLQotCXJjID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoZGV2LCBudW1fc3VwcGxpZXMsIHZzdXApOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gZ2V0IHN1cHBsaWVzICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycl9zdXBwbHk7Ci0JfQotCi0JLyogU2V0IHZvbHRhZ2UgYW5kIGN1cnJlbnQgb24gcmVndWxhdG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fc3VwcGxpZXM7IGkrKykgewotCQlpZiAocmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKHZzdXBbaV0uY29uc3VtZXIpIDwgMCkKLQkJCWNvbnRpbnVlOwotCi0JCXJjID0gcmVndWxhdG9yX3NldF92b2x0YWdlKHZzdXBbaV0uY29uc3VtZXIsCi0JCQkJCSAgIGNkY192cmVnW2ldLm1pbl91ViwKLQkJCQkJICAgY2RjX3ZyZWdbaV0ubWF4X3VWKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiBzZXQgcmVndWxhdG9yIHZvbHRhZ2UgZmFpbGVkIGZvciAlcywgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCB2c3VwW2ldLnN1cHBseSwgcmMpOwotCQkJZ290byBlcnJfc2V0X3N1cHBseTsKLQkJfQotCQlyYyA9IHJlZ3VsYXRvcl9zZXRfbG9hZCh2c3VwW2ldLmNvbnN1bWVyLAotCQkJCQljZGNfdnJlZ1tpXS5vcHRpbXVtX3VBKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGV2X2VycihkZXYsICIlczogc2V0IHJlZ3VsYXRvciBvcHRpbXVtIG1vZGUgZmFpbGVkIGZvciAlcywgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCB2c3VwW2ldLnN1cHBseSwgcmMpOwotCQkJZ290byBlcnJfc2V0X3N1cHBseTsKLQkJfQotCX0KLQotCSpzdXBwbGllcyA9IHZzdXA7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3NldF9zdXBwbHk6Ci0JZm9yIChpID0gMDsgaSA8IG51bV9zdXBwbGllczsgaSsrKQotCQlkZXZtX3JlZ3VsYXRvcl9wdXQodnN1cFtpXS5jb25zdW1lcik7Ci1lcnJfc3VwcGx5OgotCWRldm1fa2ZyZWUoZGV2LCB2c3VwKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jZGNfaW5pdF9zdXBwbGllcyk7Ci0KLS8qCi0gKiBtc21fY2RjX2dldF9wb3dlcl9zdXBwbGllczoKLSAqCUdldCBjb2RlYyBwb3dlciBzdXBwbGllcyBmcm9tIGRldmljZSB0cmVlLgotICoJQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgcmVndWxhdG9yIGRhdGEgZm9yCi0gKglhbGwgcG93ZXIgc3VwcGxpZXMuCi0gKgotICogQGRldjogcG9pbnRlciB0byBjb2RlYyBkZXZpY2UKLSAqIEBjZGNfdnJlZzogcG9pbnRlciB0byBjb2RlYyByZWd1bGF0b3IKLSAqIEB0b3RhbF9udW1fc3VwcGxpZXM6IHRvdGFsIG51bWJlciBvZiBzdXBwbGllcyByZWFkIGZyb20gRFQKLSAqCi0gKiBSZXR1cm4gZXJyb3IgY29kZSBpZiBzdXBwbHkgZGlzYWJsZSBpcyBmYWlsZWQKLSAqLwotaW50IG1zbV9jZGNfZ2V0X3Bvd2VyX3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqKmNkY192cmVnLAotCQkJICAgICAgIGludCAqdG90YWxfbnVtX3N1cHBsaWVzKQotewotCWNvbnN0IGNoYXIgKnN0YXRpY19wcm9wX25hbWUgPSAicWNvbSxjZGMtc3RhdGljLXN1cHBsaWVzIjsKLQljb25zdCBjaGFyICpvbmRfcHJvcF9uYW1lID0gInFjb20sY2RjLW9uLWRlbWFuZC1zdXBwbGllcyI7Ci0JY29uc3QgY2hhciAqY3BfcHJvcF9uYW1lID0gInFjb20sY2RjLWNwLXN1cHBsaWVzIjsKLQlpbnQgc3RhdGljX3N1cF9jbnQgPSAwOwotCWludCBvbmRfc3VwX2NudCA9IDA7Ci0JaW50IGNwX3N1cF9jbnQgPSAwOwotCWludCBudW1fc3VwcGxpZXMgPSAwOwotCXN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfcmVnOwotCWludCByYzsKLQotCWlmICghZGV2KSB7Ci0JCXByX2VycigiJXM6IGRldmljZSBwb2ludGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN0YXRpY19zdXBfY250ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhkZXYtPm9mX25vZGUsCi0JCQkJCQkgICBzdGF0aWNfcHJvcF9uYW1lKTsKLQlpZiAoc3RhdGljX3N1cF9jbnQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgc3RhdGljIHN1cHBsaWVzKCVkKVxuIiwKLQkJCV9fZnVuY19fLCBzdGF0aWNfc3VwX2NudCk7Ci0JCXJjID0gc3RhdGljX3N1cF9jbnQ7Ci0JCWdvdG8gZXJyX3N1cHBseV9jbnQ7Ci0JfQotCW9uZF9zdXBfY250ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhkZXYtPm9mX25vZGUsIG9uZF9wcm9wX25hbWUpOwotCWlmIChvbmRfc3VwX2NudCA8IDApCi0JCW9uZF9zdXBfY250ID0gMDsKLQotCWNwX3N1cF9jbnQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAgICAgIGNwX3Byb3BfbmFtZSk7Ci0JaWYgKGNwX3N1cF9jbnQgPCAwKQotCQljcF9zdXBfY250ID0gMDsKLQotCW51bV9zdXBwbGllcyA9IHN0YXRpY19zdXBfY250ICsgb25kX3N1cF9jbnQgKyBjcF9zdXBfY250OwotCWlmIChudW1fc3VwcGxpZXMgPD0gMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBzdXBwbHkgY291bnQgaXMgMCBvciBuZWdhdGl2ZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3N1cHBseV9jbnQ7Ci0JfQotCi0JY2RjX3JlZyA9IGRldm1fa2NhbGxvYyhkZXYsIG51bV9zdXBwbGllcywKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNkY19yZWd1bGF0b3IpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghY2RjX3JlZykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX21lbV9hbGxvYzsKLQl9Ci0KLQlyYyA9IG1zbV9jZGNfcGFyc2Vfc3VwcGxpZXMoZGV2LCBjZGNfcmVnLCBzdGF0aWNfcHJvcF9uYW1lLAotCQkJCSAgICBzdGF0aWNfc3VwX2NudCwgZmFsc2UpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gcGFyc2Ugc3RhdGljIHN1cHBsaWVzKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycl9zdXA7Ci0JfQotCi0JcmMgPSBtc21fY2RjX3BhcnNlX3N1cHBsaWVzKGRldiwgJmNkY19yZWdbc3RhdGljX3N1cF9jbnRdLAotCQkJCSAgICBvbmRfcHJvcF9uYW1lLCBvbmRfc3VwX2NudCwKLQkJCQkgICAgdHJ1ZSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBwYXJzZSBkZW1hbmQgc3VwcGxpZXMoJWQpXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX3N1cDsKLQl9Ci0KLQlyYyA9IG1zbV9jZGNfcGFyc2Vfc3VwcGxpZXMoZGV2LAotCQkJCSAgICAmY2RjX3JlZ1tzdGF0aWNfc3VwX2NudCArIG9uZF9zdXBfY250XSwKLQkJCQkgICAgY3BfcHJvcF9uYW1lLCBjcF9zdXBfY250LCB0cnVlKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIHBhcnNlIGNwIHN1cHBsaWVzKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycl9zdXA7Ci0JfQotCi0JKmNkY192cmVnID0gY2RjX3JlZzsKLQkqdG90YWxfbnVtX3N1cHBsaWVzID0gbnVtX3N1cHBsaWVzOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9zdXA6Ci0JZGV2bV9rZnJlZShkZXYsIGNkY19yZWcpOwotZXJyX3N1cHBseV9jbnQ6Ci1lcnJfbWVtX2FsbG9jOgotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2NkY19nZXRfcG93ZXJfc3VwcGxpZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcWNvbS1pMmMtcG1pYy5jIGIvZHJpdmVycy9tZmQvcWNvbS1pMmMtcG1pYy5jCmluZGV4IDU5MGU0YzEuLjI4YzMzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3Fjb20taTJjLXBtaWMuYworKysgYi9kcml2ZXJzL21mZC9xY29tLWkyYy1wbWljLmMKQEAgLTYyLDggKzYyLDEyIEBACiAJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKIAlzdHJ1Y3QgaTJjX3BtaWNfcGVyaXBoCSpwZXJpcGg7CiAJc3RydWN0IHBpbmN0cmwJCSpwaW5jdHJsOworCXN0cnVjdCBtdXRleAkJaXJxX2NvbXBsZXRlOwogCWNvbnN0IGNoYXIJCSpwaW5jdHJsX25hbWU7CiAJaW50CQkJbnVtX3BlcmlwaHM7CisJaW50CQkJc3VtbWFyeV9pcnE7CisJYm9vbAkJCXJlc3VtZV9jb21wbGV0ZWQ7CisJYm9vbAkJCWlycV93YWl0aW5nOwogfTsKIAogc3RhdGljIHZvaWQgaTJjX3BtaWNfaXJxX2J1c19sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTQwMCw2ICs0MDQsMTYgQEAKIAl1bnNpZ25lZCBpbnQgc3VtbWFyeV9zdGF0dXM7CiAJaW50IHJjLCBpOwogCisJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2NvbXBsZXRlKTsKKwljaGlwLT5pcnFfd2FpdGluZyA9IHRydWU7CisJaWYgKCFjaGlwLT5yZXN1bWVfY29tcGxldGVkKSB7CisJCXByX2RlYnVnKCJJUlEgdHJpZ2dlcmVkIGJlZm9yZSBkZXZpY2UtcmVzdW1lXG4iKTsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJCW11dGV4X3VubG9jaygmY2hpcC0+aXJxX2NvbXBsZXRlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwljaGlwLT5pcnFfd2FpdGluZyA9IGZhbHNlOworCiAJZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChjaGlwLT5udW1fcGVyaXBocywgQklUU19QRVJfQllURSk7IGkrKykgewogCQlyYyA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgSTJDX0lOVFJfU1RBVFVTX0JBU0UgKyBpLAogCQkJCSZzdW1tYXJ5X3N0YXR1cyk7CkBAIC00MTYsNiArNDMwLDggQEAKIAkJaTJjX3BtaWNfc3VtbWFyeV9zdGF0dXNfaGFuZGxlcihjaGlwLCBwZXJpcGgsIHN1bW1hcnlfc3RhdHVzKTsKIAl9CiAKKwltdXRleF91bmxvY2soJmNoaXAtPmlycV9jb21wbGV0ZSk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTU1OSw2ICs1NzUsOSBAQAogCQl9CiAJfQogCisJY2hpcC0+cmVzdW1lX2NvbXBsZXRlZCA9IHRydWU7CisJbXV0ZXhfaW5pdCgmY2hpcC0+aXJxX2NvbXBsZXRlKTsKKwogCXJjID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xpZW50LT5kZXYsIGNsaWVudC0+aXJxLCBOVUxMLAogCQkJCSAgICAgICBpMmNfcG1pY19pcnFfaGFuZGxlciwKIAkJCQkgICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9TSEFSRUQsCkBAIC01NjgsNiArNTg3LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAorCWNoaXAtPnN1bW1hcnlfaXJxID0gY2xpZW50LT5pcnE7CiAJZW5hYmxlX2lycV93YWtlKGNsaWVudC0+aXJxKTsKIAogcHJvYmVfY2hpbGRyZW46CkBAIC01OTQsNiArNjE0LDE3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgaTJjX3BtaWNfc3VzcGVuZF9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19wbWljICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoY2hpcC0+aXJxX3dhaXRpbmcpIHsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJBYm9ydGluZyBzdXNwZW5kLCBhbiBpbnRlcnJ1cHQgd2FzIGRldGVjdGVkIHdoaWxlIHN1c3BlbmRpbmdcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpMmNfcG1pY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJjX3BtaWMgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTYxOCw2ICs2NDksMTEgQEAKIAkJCXByX2Vycl9yYXRlbGltaXRlZCgiQ291bGRuJ3QgZW5hYmxlIDB4JTA0eCB3YWtlIGlycXMgMHglMDJ4IHJjPSVkXG4iLAogCQkJICAgICAgIHBlcmlwaC0+YWRkciwgcGVyaXBoLT53YWtlLCByYyk7CiAJfQorCWlmICghcmMpIHsKKwkJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2NvbXBsZXRlKTsKKwkJY2hpcC0+cmVzdW1lX2NvbXBsZXRlZCA9IGZhbHNlOworCQltdXRleF91bmxvY2soJmNoaXAtPmlycV9jb21wbGV0ZSk7CisJfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtNjQ3LDEwICs2ODMsMzggQEAKIAkJCSAgICAgICBwZXJpcGgtPmFkZHIsIHBlcmlwaC0+c3luY2VkW0lSUV9FTl9TRVRdLCByYyk7CiAJfQogCisJbXV0ZXhfbG9jaygmY2hpcC0+aXJxX2NvbXBsZXRlKTsKKwljaGlwLT5yZXN1bWVfY29tcGxldGVkID0gdHJ1ZTsKKwlpZiAoY2hpcC0+aXJxX3dhaXRpbmcpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pcnFfY29tcGxldGUpOworCQkvKiBpcnEgd2FzIHBlbmRpbmcsIGNhbGwgdGhlIGhhbmRsZXIgKi8KKwkJaTJjX3BtaWNfaXJxX2hhbmRsZXIoY2hpcC0+c3VtbWFyeV9pcnEsIGNoaXApOworCQllbmFibGVfaXJxKGNoaXAtPnN1bW1hcnlfaXJxKTsKKwl9IGVsc2UgeworCQltdXRleF91bmxvY2soJmNoaXAtPmlycV9jb21wbGV0ZSk7CisJfQorCiAJcmV0dXJuIHJjOwogfQorI2Vsc2UKK3N0YXRpYyBpbnQgaTJjX3BtaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGkyY19wbWljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGkyY19wbWljX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwCit9CiAjZW5kaWYKLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhpMmNfcG1pY19wbV9vcHMsIGkyY19wbWljX3N1c3BlbmQsIGkyY19wbWljX3Jlc3VtZSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaTJjX3BtaWNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gaTJjX3BtaWNfc3VzcGVuZCwKKwkuc3VzcGVuZF9ub2lycQk9IGkyY19wbWljX3N1c3BlbmRfbm9pcnEsCisJLnJlc3VtZQkJPSBpMmNfcG1pY19yZXN1bWUsCit9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfcG1pY19tYXRjaF90YWJsZVtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxpMmMtcG1pYyIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5MzM1LXJlZ21hcC5jIGIvZHJpdmVycy9tZmQvd2NkOTMzNS1yZWdtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2MjM3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC93Y2Q5MzM1LXJlZ21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlICJ3Y2Q5eHh4LXJlZ21hcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB3Y2Q5MzM1XzFfeF9kZWZhdWx0c1tdID0gewotCXsgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX0dBVEUsICAgICAgICAgICAgICAgICAgICAgMHgwMywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sICAgICAgIDB4MWYsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTAsICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgwX0lOUF9DRkcsICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMV9JTlBfQ0ZHLCAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDJfSU5QX0NGRywgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgzX0lOUF9DRkcsICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19DUEFSTUFEX0JVRlJEWV9JTlRfUEVSSU9ELCAgICAgICAweDE0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0ssICAgICAgICAgICAgICAgMHgzZiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1ZBTCwgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0JJQVNfVkJHX0ZJTkVfQURKLCAgICAgICAgICAgICAgICAgICAgICAweDU1LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHg2YywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MmQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfOCwgICAgICAgICAgICAgICAgICAgICAgICAweDZjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzEwLCAgICAgICAgICAgICAgICAgICAgICAgMHg2YywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8yLCAgICAgICAgICAgICAgICAgICAgIDB4NzcsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMywgICAgICAgICAgICAgICAgICAgICAweDc3LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTUJIQ19aREVUX0FOQV9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X01CSENfRlNNX0RFQlVHLCAgICAgICAgICAgICAgICAgICAgICAgICAweGMwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9UWF8xXzJfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfM180X0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1RYXzVfNl9BVEVTVF9SRUZDVEwsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8xLCAgICAgICAgICAgICAgICAgICAgMHg2NywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCwgICAgICAgICAgICAgICAgICAgIDB4NWYsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzksICAgICAgICAgICAgICAgICAgICAweDUwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMSwgICAgICAgICAgICAgICAgMHg2NSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQsICAgICAgICAgICAgICAgIDB4NDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1BBLCAgICAgICAgICAgICAgICAgICAgICAgICAweGFhLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9SWF9CSUFTX0hQSF9MT1dQT1dFUiwgICAgICAgICAgICAgICAgICAgMHg2MiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1BBX0NUTDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0hQSF9MX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9IUEhfUl9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1JfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0hQSF9SREFDX0xET19DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDcsICAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MGMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDA0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgwZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDBlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwNCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MGUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLCAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSwgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzIsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd2NkOTMzNV8yXzBfZGVmYXVsdHNbXSA9IHsKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFLCAgICAgICAgICAgICAgICAgICAgIDB4MDcsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLCAgICAgICAweDNmLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwLCAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMLCAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMF9JTlBfQ0ZHLCAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDFfSU5QX0NGRywgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgyX0lOUF9DRkcsICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYM19JTlBfQ0ZHLCAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCwgICAgICAgMHgxMywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLLCAgICAgICAgICAgICAgIDB4ZmYsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAweDQwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9CSUFTX1ZCR19GSU5FX0FESiwgICAgICAgICAgICAgICAgICAgICAgMHhjNSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAweDM1LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzgsICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8xMCwgICAgICAgICAgICAgICAgICAgICAgIDB4NmUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMiwgICAgICAgICAgICAgICAgICAgICAweDU1LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzMsICAgICAgICAgICAgICAgICAgICAgMHg1NSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX1RFU1RfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MGYsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDBmLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9UWF8xXzJfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwYSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfM180X0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgIDB4MGEsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1RYXzVfNl9BVEVTVF9SRUZDVEwsICAgICAgICAgICAgICAgICAgICAweDBhLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8xLCAgICAgICAgICAgICAgICAgICAgMHhlYiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCwgICAgICAgICAgICAgICAgICAgIDB4N2YsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzksICAgICAgICAgICAgICAgICAgICAweDY0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMSwgICAgICAgICAgICAgICAgMHhlZCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19IUEhfUEEsICAgICAgICAgICAgICAgICAgICAgICAgIDB4OWEsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xPV1BPV0VSLCAgICAgICAgICAgICAgICAgICAweDgyLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX0xfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0hQSF9SX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9IUEhfUl9BVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MzMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAweDEwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MTAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMiwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDIsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDAyLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDEsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAweDAxLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgMHgwMSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAweDNjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgMHgzYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4M2MsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDcsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNywgICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDcsICAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4NDQsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAweDFlLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgMHhmYywgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHg0NCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgIDB4MWUsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAweGZjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgIDB4MDgsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAweDQ0LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgMHgxZSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4ZmMsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAweDA4LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgMHgwOCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1BMSU5FX1NSQzBfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgIDB4MjAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NQTElORV9TUkMxX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAweDIwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgMHgyMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1BMSU5FX1NSQzNfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgIDB4MjAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wsICAgICAgICAweDBjLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xLCAgICAgICAgICAgICAgMHgxMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMiwgICAgICAgICAgICAgIDB4NjAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMsICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9EQVRBX0hVQl9OQVRJVkVfRklGT19TVEFUVVMsICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9ELCAgICAgICAgICAgIDB4NjAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19UWF9QUF9DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDNDLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfU1NfU1ZBX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTUJIQ19GU01fU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0ZMWUJBQ0tfQ1RSTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1LCAgMHgwMCB9LAotCXsgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNywgICAgICAgICAgICAgICAgICAgMHgyNSwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1BMSU5FX1NSQzBfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NQTElORV9TUkMxX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAweDAwLCAgMHgwMCB9LAotCXsgV0NEOTMzNV9TUExJTkVfU1JDMl9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgMHgwMCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1BMSU5FX1NSQzNfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAsICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTF9SRVBFQVRfUEFULCAgICAweDAwLCAgMHgwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCB3Y2Q5MzM1X2RlZmF1bHRzW10gPSB7Ci0JLyogUGFnZSAjMCByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTBfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0NMS19CWVBBU1MsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8xLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8yLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8zLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfSVJBTV9TSFVURE9XTiwgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMSwgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMiwgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9NQVNLLCAgICAgICAgICAgICAgICAgICAgIDB4M2YgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9TVEFUVVMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9DTEVBUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMiwgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMywgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDAsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDEsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDAsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDIsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDMsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDQsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDUsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDYsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDcsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDgsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDksICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEwLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEyLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEzLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0LCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE1LCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08sICAgIDB4MGQgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzEsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQU5BX1dBSVRfU1RBVEVfQ1RMLCAgICAgIDB4Q0MgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NUTCwgICAgICAgICAgIDB4MDYgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX1NUQVRVUywgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NOVF9NU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NOVF9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX0NUTCwgICAgICAgICAgIDB4MDYgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX1NUQVRVUywgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX0NOVF9NU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX0NOVF9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NUTCwgICAgICAgICAgIDB4MDYgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX1NUQVRVUywgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9NU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCwgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX0NUTCwgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfSTJTX0NMSywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg0X0lOUF9DRkcsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg1X0lOUF9DRkcsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg2X0lOUF9DRkcsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg3X0lOUF9DRkcsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxX0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg0X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg3X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxMF9JTlBfQ0ZHLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxMV9JTlBfQ0ZHLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxNF9JTlBfQ0ZHLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxNV9JTlBfQ0ZHLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMF9MX0NGRywgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMF9SX0NGRywgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9MX0NGRywgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9SX0NGRywgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9DTFJfQ09NTUlULCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX01BU0swLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX01BU0sxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX01BU0syLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX01BU0szLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX01BU0swLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX01BU0sxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX01BU0syLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX01BU0szLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9MRVZFTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzMzVfSU5UUl9MRVZFTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKLQl7IFdDRDkzMzVfSU5UUl9MRVZFTDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfSU5UUl9MRVZFTDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfSU5UUl9CWVBBU1MwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9CWVBBU1MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9CWVBBU1MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9CWVBBU1MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9TRVQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9TRVQxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9TRVQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSU5UUl9TRVQzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMxIHJlZ2lzdGVycyAqLwotCXsgV0NEOTMzNV9QQUdFMV9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg3MSB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgzNCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwYiB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzksICAgICAgICAgICAgICAgICAgICAgMHg3MCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0xfVkFMX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0RTTV9GUkFDX0NUTF8xLCAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgMHg2YiB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMSwgICAgICAgICAgICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMiwgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfNCwgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgzMyB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgMHg1ZiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzksICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0RTTV9GUkFDX0NUTF8wLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xLCAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgMHg2YiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMSwgICAgICAgICAgICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMiwgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfNCwgICAgICAgICAgICAgICAgICAgMHgzMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOCwgICAgICAgICAgICAgICAgICAgICAgMHg1ZSB9LAotCXsgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOSwgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTMzNV9TQl9GTExfTF9WQUxfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTMzNV9TQl9GTExfTF9WQUxfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzAsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEsICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgMHg2YiB9LAotCXsgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF80LCAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfRkxMX01PREUsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzAsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCS8qIFBhZ2UgIzIgcmVnaXN0ZXJzICovCi0JeyBXQ0Q5MzM1X1BBR0UyX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwgICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18wLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS180LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS181LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS182LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS183LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS184LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS185LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xNCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfVFJHLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfVFJHLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfOCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfOSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTUsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzUsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzYsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzgsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzksICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzEwLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzExLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzEyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzEzLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzE0LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzE1LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfOCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfOSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTUsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzUsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzYsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzgsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzksICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEwLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzExLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEzLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzE0LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzE1LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxX0FDSywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyX0FDSywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19FQ19CVUZfSU5UX1BFUklPRCwgICAgICAgICAgICAgICAweDNjIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19VU19CVUZfSU5UX1BFUklPRCwgICAgICAgICAgICAgICAweDYwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19VU19FQ19NVVhfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19NQURfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19DUEFSX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19ETUlDMF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19ETUlDMl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19ETUlDX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19DUEFSX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19XRE9HX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19CQUNLVVBfSU5ULCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19DUEVfT0NEX0NGRywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVIsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzMsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzQsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzgsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fSUlSX0NUTF9QVFIsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8yLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8zLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF80LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF81LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF82LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF83LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF84LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzM1X1NPQ19NQURfSU5QX1NFTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JLyogUGFnZSAjNiByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTZfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0JJQVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0NMS19UT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX1JDTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAgfSwKLQl7IFdDRDkzMzVfQU5BX0JVQ0tfVk9VVF9BLCAgICAgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKLQl7IFdDRDkzMzVfQU5BX0JVQ0tfVk9VVF9ELCAgICAgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKLQl7IFdDRDkzMzVfQU5BX0JVQ0tfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0JVQ0tfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKLQl7IFdDRDkzMzVfQU5BX1JYX1NVUFBMSUVTLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0hQSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0VBUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0xPXzFfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0xPXzNfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01BRF9TRVRVUCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODEgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUMxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUMzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUM0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUM1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQU5BX0FNSUM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfTUVDSCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzkgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfWkRFVCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlROMCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlROMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlROMiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlROMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlRONCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlRONSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlRONiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQU5BX01CSENfQlRONywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKLQl7IFdDRDkzMzVfQU5BX01JQ0IxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfQU5BX01JQ0IyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfQU5BX01JQ0IyX1JBTVAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQU5BX01JQ0IzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfQU5BX01JQ0I0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzMzVfQU5BX1ZCQURDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQklBU19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKLQl7IFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NUUkxfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQgfSwKLQl7IFdDRDkzMzVfUkNPX0NUUkxfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX1RFU1RfQ1RSTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF9PVVRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF9PVVRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF9PVVRfMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF9PVVRfNCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUkNPX0NBTF9PVVRfNSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX01PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4ODQgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX01PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4ZmUgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX01PREVfMywgICAgICAgICAgICAgICAgICAgICAgIDB4ZjYgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX01PREVfNCwgICAgICAgICAgICAgICAgICAgICAgIDB4NTYgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX1ZDTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX1ZDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX1ZDTF8zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTcgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF80LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NjEgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF81LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF82LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF83LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmYgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NDTF85LCAgICAgICAgICAgICAgICAgICAgICAgIDB4NmUgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8xLCAgICAgICAgICAgICAgICAgICAgIDB4OTIgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8yLCAgICAgICAgICAgICAgICAgICAgIDB4NTQgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8xLCAgICAgICAgICAgICAgICAgICAgIDB4NzcgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX0VYVF8xLCAgICAgICAgICAgICAgIDB4OWMgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX0VYVF8yLCAgICAgICAgICAgICAgIDB4ODIgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX09VVF8xLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX09VVF8yLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0lET19TSURPX1RFU1RfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTUJIQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIgfSwKLQl7IFdDRDkzMzVfTUJIQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwsICAgICAgICAgICAgICAgICAgIDB4NjkgfSwKLQl7IFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTUJIQ19URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVkJBRENfU1VCQkxPQ0tfRU4sICAgICAgICAgICAgICAgICAgICAgIDB4ZmUgfSwKLQl7IFdDRDkzMzVfVkJBRENfSUJJQVNfRkUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQgfSwKLQl7IFdDRDkzMzVfVkJBRENfQklBU19BREMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEgfSwKLQl7IFdDRDkzMzVfVkJBRENfRkVfQ1RSTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWMgfSwKLQl7IFdDRDkzMzVfVkJBRENfQURDX1JFRiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfVkJBRENfQURDX0lPLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfVkJBRENfQURDX1NBUiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfVkJBRENfREVCVUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVkJBRENfQURDX0RPVVRNU0IsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVkJBRENfQURDX0RPVVRMU0IsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTERPSF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MmIgfSwKLQl7IFdDRDkzMzVfTERPSF9CSUFTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKLQl7IFdDRDkzMzVfTERPSF9TVEJfTE9BRFMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfTERPSF9TTE9XUkFNUCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4YTQgfSwKLQl7IFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MjQgfSwKLQl7IFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4YTQgfSwKLQl7IFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4YTQgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX0FEQ19WQ00sICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzkgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX0JJQVNfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgIDB4YzAgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX0FEQ19JTlQxX0lCLCAgICAgICAgICAgICAgICAgICAgIDB4NmYgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX0FEQ19JTlQyX0lCLCAgICAgICAgICAgICAgICAgICAgIDB4NGYgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MmUgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX1NUQVJULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX1NUT1BfOVA2TSwgICAgICAgICAgICAgIDB4YzcgfSwKLQl7IFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX1NUT1BfMTJQMjg4TSwgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1RFU1RfRU4sICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2MgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX0FEQ19JQiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzggfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1RFU1RfQkxLX0VOLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1RYRkVfQ0xLRElWLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1NBUjFfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfMV8yX1NBUjJfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfM180X1RFU1RfRU4sICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2MgfSwKLQl7IFdDRDkzMzVfVFhfM180X0FEQ19JQiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzMzVfVFhfM180X1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzggfSwKLQl7IFdDRDkzMzVfVFhfM180X1RFU1RfQkxLX0VOLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfVFhfM180X1RYRkVfQ0xLRElWLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfM180X1NBUjFfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfM180X1NBUjJfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfNV82X1RFU1RfRU4sICAgICAgICAgICAgICAgICAgICAgICAgIDB4Y2MgfSwKLQl7IFdDRDkzMzVfVFhfNV82X0FEQ19JQiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzMzVfVFhfNV82X1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MzggfSwKLQl7IFdDRDkzMzVfVFhfNV82X1RFU1RfQkxLX0VOLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfVFhfNV82X1RYRkVfQ0xLRElWLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfNV82X1NBUjFfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfVFhfNV82X1NBUjJfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX01PREVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX01PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2EgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX01PREVfMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4YTIgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4NTEgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4NTEgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwsICAgICAgICAgICAgICAgIDB4NzcgfSwKLQl7IFdDRDkzMzVfQ0xBU1NIX1NQQVJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NGUgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMiwgICAgICAgICAgICAgICAgICAgIDB4NDUgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMywgICAgICAgICAgICAgICAgICAgIDB4NzQgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNSwgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNiwgICAgICAgICAgICAgICAgICAgIDB4OTggfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNywgICAgICAgICAgICAgICAgICAgIDB4YTkgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfOCwgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzIsICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzMsICAgICAgICAgICAgICAgIDB4YTYgfSwKLQl7IFdDRDkzMzVfRkxZQkFDS19URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUlhfQVVYX1NXX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUlhfUEFfQVVYX0lOX0NPTk4sICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfUlhfVElNRVJfRElWLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzQgfSwKLQl7IFdDRDkzMzVfUlhfT0NQX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYgfSwKLQl7IFdDRDkzMzVfUlhfT0NQX0NPVU5ULCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzcgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19FQVJfREFDLCAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19FQVJfQU1QLCAgICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19IUEhfTERPLCAgICAgICAgICAgICAgICAgICAgICAgIDB4YTkgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMiwgICAgICAgICAgICAgIDB4OGEgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ19MRE8sICAgICAgICAgICAgICAgICAgIDB4ODggfSwKLQl7IFdDRDkzMzVfUlhfQklBU19IUEhfQ05QMSwgICAgICAgICAgICAgICAgICAgICAgIDB4ODYgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUEEsICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUkVGLCAgICAgICAgICAgICAgICAgICAgIDB4ODggfSwKLQl7IFdDRDkzMzVfUlhfQklBU19ESUZGTE9fTERPLCAgICAgICAgICAgICAgICAgICAgIDB4ODggfSwKLQl7IFdDRDkzMzVfUlhfQklBU19TRUxPX0RBQ19QQSwgICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzMzVfUlhfQklBU19CVUNLX1JTVCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzMzVfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QLCAgICAgICAgICAgICAgIDB4NDQgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19GTFlCX0VSUkFNUCwgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYsICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKLQl7IFdDRDkzMzVfUlhfQklBU19GTFlCX01JRF9SU1QsICAgICAgICAgICAgICAgICAgIDB4NDQgfSwKLQl7IFdDRDkzMzVfSFBIX0xfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfSFBIX1JfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfSFBIX0NOUF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZGEgfSwKLQl7IFdDRDkzMzVfSFBIX0NOUF9XR19USU1FLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUgfSwKLQl7IFdDRDkzMzVfSFBIX09DUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKLQl7IFdDRDkzMzVfSFBIX0FVVE9fQ0hPUCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIgfSwKLQl7IFdDRDkzMzVfSFBIX0NIT1BfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKLQl7IFdDRDkzMzVfSFBIX1BBX0NUTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDYgfSwKLQl7IFdDRDkzMzVfSFBIX0xfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX0xfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzMzVfSFBIX1JfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDEsICAgICAgICAgICAgICAgICAgICAgIDB4OTkgfSwKLQl7IFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDIsICAgICAgICAgICAgICAgICAgICAgIDB4OWIgfSwKLQl7IFdDRDkzMzVfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1JFRkJVRkZfVUhRQV9DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX0xfREFDX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfSFBIX1JfREFDX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRUFSX0VOX1JFRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfRUFSX0NNQlVGRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQgfSwKLQl7IFdDRDkzMzVfRUFSX0lDVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfRUFSX0VOX0RCR19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRUFSX0NOUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKLQl7IFdDRDkzMzVfRUFSX0RBQ19DVExfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRUFSX1NUQVRVU19SRUcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfRUFSX09VVF9TSE9SVCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19NSVNDLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19MTzJfQ09NUEFOREVSLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19DT01NT04sICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19CWVBBU1NfRU4sICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19DTlAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19DT1JFX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19MRE9fT1VUX1BST0csICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19DT01fU1dDQVBfUkVGQlVGX0ZSRVEsICAgICAgICAgIDB4OWIgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19DT01fUEFfRlJFUSwgICAgICAgICAgICAgICAgICAgIDB4YjAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19SRVNFUlZFRF9SRUcsICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19MTzFfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfRElGRl9MT19MTzFfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0VfTE9fQ09NMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfU0VfTE9fQ09NMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE8zX0dBSU4sICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE8zX0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE80X0dBSU4sICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE80X0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE8zX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU0VfTE9fTE80X1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMxMCByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTEwX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8yX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRkZfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRkJfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZGX0FfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZGX0JfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZCX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfU01MUEZfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRENGTFRfU0hJRlRfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzJfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRkZfQV9HQUlOX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRkZfQl9HQUlOX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzBfRkJfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8xX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRkZfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRkJfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0FfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0JfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZCX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfU01MUEZfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0FEQVBUX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzFfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRkZfQV9HQUlOX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRkZfQl9HQUlOX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0FOQzFfRkJfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMxMSByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTExX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMCwgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMSwgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMiwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMywgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNCwgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMxMiByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTEyX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfQ1JDLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfRExZX0NUUkwsICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfREVDQVlfQ1RSTCwgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSFBIX1ZfUEEsICAgICAgICAgICAgICAgICAgICAgIDB4MWMgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfRUFSX1ZfUEEsICAgICAgICAgICAgICAgICAgICAgIDB4MzkgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSFBIX1ZfSEQsICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfRUFSX1ZfSEQsICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSzFfTVNCLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSzFfTFNCLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSzJfTVNCLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSzJfTFNCLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9DVFJMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9IUEgsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9FQVIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDEsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMU0hfT1ZSX1ZSRUYsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DVEwsICAgICAgICAgICAgICAgICAgIDB4YjIgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcxLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcyLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DVEwsICAgICAgICAgICAgICAgICAgIDB4YjIgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcxLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8yLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8xLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8yLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8xLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8yLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRywgICAgICAgICAgICAgIDB4MGYgfSwKLQl7IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX1NUQVRVUywgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcsICAgICAgICAgICAgICAgICAgICAgIDB4MGEgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMiwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMywgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxLCAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QyLCAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QzLCAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSwgICAgICAgICAgICAgICAgIDB4MmEgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMiwgICAgICAgICAgICAgICAgIDB4ODYgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMxLCAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMyLCAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMzLCAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUM0LCAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDEsICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDIsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDMsICAgICAgICAgICAgICAgIDB4NjQgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDQsICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9ERUJVRzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRF9NT04sICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMLCAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSwgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ1RMLCAgICAgIDB4MDQgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ0ZHMSwgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMxMyByZWdpc3RlcnMgKi8KLQl7IFdDRDkzMzVfUEFHRTEzX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNV9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNV9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzEsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzMsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzQsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX1NSQ19DRkcwLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzAsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzAsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzMsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzAsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzIsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMsIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMLCAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QwLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QxLCAgICAgIDB4NGIgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTFNCLCAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTVNCLCAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU1RBVFVTLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9DVFJMLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQiwgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQiwgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQl9SRCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQl9SRCwgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX1BBVEhfQ1RMLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjZfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjdfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCwgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fVElNRVJfQ1RMLCAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX1BBVEhfQ1RMLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjVfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjZfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjhfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NUTCwgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMLCAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjFfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMywgICAgICAgICAgICAgICAgICAgICAgIDB4MTggfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfTFVULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTFNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfTFVULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTFNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX01TQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX01TQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX01TQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX0xVVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX01TQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQkvKiBQYWdlICMweDgwIHJlZ2lzdGVycyAqLwotCXsgV0NEOTMzNV9QQUdFODBfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0JJU1RfTU9ERV9QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX1JGX1BBX09OX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0lOVFIxX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0lOVFIyX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX1NXUl9EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX1NXUl9DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyQ19DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyQ19EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19SWF9TRDBfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19SWF9TRDFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19SWF9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19SWF9XU19QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19UWF9TRDBfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19UWF9TRDFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19UWF9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0kyU19UWF9XU19QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMxX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMxX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMyX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMyX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMzX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0RNSUMzX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0pURElfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0pURE9fUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0pUTVNfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0pUQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9UTE1NX0pUUlNUX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMSwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8xLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8yLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BBRF9EUlZDVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9TVEFUVVMsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX01FTV9DVFJMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0JVU19TRUwsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0pUQUcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzEsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzIsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzMsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotfTsKLQotLyoKLSAqIHdjZDkzMzVfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoOiBVcGRhdGUgcmVnaXN0ZXIgZGVmYXVsdHMgYmFzZWQgb24gdmVyc2lvbgotICogQHJlZ21hcDogaGFuZGxlIHRvIHdjZDl4eHggcmVnbWFwCi0gKiBAdmVyc2lvbjogd2NkOTMzNSB2ZXJzaW9uCi0gKgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBvciAwIGZvciBzdWNjZXNzCi0gKi8KLWludCB3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCB2ZXJzaW9uKQotewotCWludCByYzsKLQotCWlmICghcmVnbWFwKSB7Ci0JCXByX2VycigiJXM6IHJlZ21hcCBzdHJ1Y3QgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKHZlcnNpb24pIHsKLQljYXNlIFRBU0hBX1ZFUlNJT05fMV8wOgotCWNhc2UgVEFTSEFfVkVSU0lPTl8xXzE6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkocmVnbWFwLCB0cnVlKTsKLQkJcmMgPSByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHJlZ21hcCwgd2NkOTMzNV8xX3hfZGVmYXVsdHMsCi0JCQkJCSAgICBBUlJBWV9TSVpFKHdjZDkzMzVfMV94X2RlZmF1bHRzKSk7Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkocmVnbWFwLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWNhc2UgVEFTSEFfVkVSU0lPTl8yXzA6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkocmVnbWFwLCB0cnVlKTsKLQkJcmMgPSByZWdtYXBfbXVsdGlfcmVnX3dyaXRlKHJlZ21hcCwgd2NkOTMzNV8yXzBfZGVmYXVsdHMsCi0JCQkJCSAgICBBUlJBWV9TSVpFKHdjZDkzMzVfMl8wX2RlZmF1bHRzKSk7Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkocmVnbWFwLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gdmVyc2lvbjogJWRcbiIsIF9fZnVuY19fLCB2ZXJzaW9uKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDkzMzVfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKTsKLQotc3RhdGljIGJvb2wgd2NkOTMzNV9pc19yZWFkYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JdTggcGdfbnVtLCByZWdfb2Zmc2V0OwotCWNvbnN0IHU4ICpyZWdfdGJsID0gTlVMTDsKLQotCS8qCi0JICogR2V0IHRoZSBwYWdlIG51bWJlciBmcm9tIE1TQiBvZiBjb2RlYyByZWdpc3Rlci4gSWYgaXRzIDB4ODAsIGFzc2lnbgotCSAqIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgaW5kZXggUEFHRV8weDgwLgotCSAqLwotCXBnX251bSA9IHJlZyA+PiAweDg7Ci0JaWYgKHBnX251bSA9PSAweDgwKQotCQlwZ19udW0gPSBQQUdFXzBYODA7Ci0JZWxzZSBpZiAocGdfbnVtID49IDB4RSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmVnX3RibCA9IHdjZDkzMzVfcmVnW3BnX251bV07Ci0JcmVnX29mZnNldCA9IHJlZyAmIDB4RkY7Ci0KLQlpZiAocmVnX3RibCkKLQkJcmV0dXJuIHJlZ190YmxbcmVnX29mZnNldF07Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHdjZDkzMzVfaXNfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQotewotCS8qCi0JICogcmVnaXN0ZXJzIGZyb20gMHgwMDAgdG8gMHgwRkYgYXJlIHZvbGF0aWxlIGJlY2F1c2UKLQkgKiB0aGlzIHNwYWNlIGNvbnRhaW5zIHJlZ2lzdGVycyByZWxhdGVkIHRvIGludGVycnVwdAotCSAqIHN0YXR1cywgbWFzayBldGMKLQkgKi8KLQlpZiAocmVnIDwgMHgxMDApCi0JCXJldHVybiB0cnVlOwotCi0JLyogSUlSIENvZWZmIHJlZ2lzdGVycyBhcmUgbm90IGNhY2hlYWJsZSAqLwotCWlmICgocmVnID49IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMKSAmJgotCSAgICAocmVnIDw9IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoKHJlZyA+PSBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCkgJiYKLQkgICAgKHJlZyA8PSBXQ0Q5MzM1X0NEQ19BTkMwX0ZCX0dBSU5fQ1RMKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoKHJlZyA+PSBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9DT0VGRl8xX0NUTCkgJiYKLQkgICAgKHJlZyA8PSBXQ0Q5MzM1X0NEQ19BTkMxX0ZCX0dBSU5fQ1RMKSkKLQkJcmV0dXJuIHRydWU7Ci0JLyoKLQkgKiBDUEUgaW5ib3ggYW5kIG91dGJveCByZWdpc3RlcnMgYXJlIHZvbGF0aWxlCi0JICogc2luY2UgdGhleSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgY29kZWMgaGFyZHdhcmUKLQkgKiB0byBpbmRpY2F0ZSBDUEUgc3RhdHVzCi0JICovCi0JaWYgKHJlZyA+PSBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzAgJiYKLQkgICAgcmVnIDw9IFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfQUNLKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmIChyZWcgPj0gV0NEOTMzNV9SQ09fQ0FMX09VVF8xICYmCi0JICAgIHJlZyA8PSBXQ0Q5MzM1X1JDT19DQUxfT1VUXzUpCi0JCXJldHVybiB0cnVlOwotCi0Jc3dpdGNoIChyZWcpIHsKLQljYXNlIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV9UUkc6Ci0JY2FzZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfVFJHOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzA6Ci0JY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMToKLQljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8yOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzM6Ci0JY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMDoKLQljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8xOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzI6Ci0JY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMzoKLQljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzE6Ci0JY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMjoKLQljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8zOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzA6Ci0JY2FzZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMToKLQljYXNlIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yOgotCWNhc2UgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzM6Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9CSUFTOgotCWNhc2UgV0NEOTMzNV9BTkFfQ0xLX1RPUDoKLQljYXNlIFdDRDkzMzVfQU5BX1JDTzoKLQljYXNlIFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0w6Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zOgotCWNhc2UgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMjoKLQljYXNlIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzE6Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0g6Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNUOgotCWNhc2UgV0NEOTMzNV9BTkFfTUJIQ19aREVUOgotCWNhc2UgV0NEOTMzNV9BTkFfTUlDQjI6Ci0JY2FzZSBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTOgotCWNhc2UgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0s6Ci0JY2FzZSBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVI6Ci0JY2FzZSBXQ0Q5MzM1X0NQRV9TU19TVEFUVVM6Ci0JY2FzZSBXQ0Q5MzM1X0NQRV9TU19CQUNLVVBfSU5UOgotCWNhc2UgV0NEOTMzNV9DUEVfU1NfQ0ZHOgotCWNhc2UgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzE6Ci0JY2FzZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzM6Ci0JY2FzZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzQ6Ci0JY2FzZSBXQ0Q5MzM1X0ZMWUJBQ0tfRU46Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9SWF9TVVBQTElFUzoKLQljYXNlIFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTDoKLQljYXNlIFdDRDkzMzVfU0lET19TSURPX0NDTF8yOgotCWNhc2UgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzQ6Ci0JY2FzZSBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NUQVRVUzoKLQljYXNlIFdDRDkzMzVfTUJIQ19GU01fU1RBVFVTOgotCWNhc2UgV0NEOTMzNV9TUExJTkVfU1JDMF9TVEFUVVM6Ci0JY2FzZSBXQ0Q5MzM1X1NQTElORV9TUkMxX1NUQVRVUzoKLQljYXNlIFdDRDkzMzVfU1BMSU5FX1NSQzJfU1RBVFVTOgotCWNhc2UgV0NEOTMzNV9TUExJTkVfU1JDM19TVEFUVVM6Ci0JY2FzZSBXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzI6Ci0JY2FzZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfODoKLQljYXNlIFdDRDkzMzVfQklBU19WQkdfRklORV9BREo6Ci0JY2FzZSBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCOgotCWNhc2UgV0NEOTMzNV9WQkFEQ19BRENfRE9VVExTQjoKLQljYXNlIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUw6Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9CVUNLX0NUTDoKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOTMzNV9yZWdtYXBfY29uZmlnID0gewotCS5yZWdfYml0cyA9IDE2LAotCS52YWxfYml0cyA9IDgsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCi0JLnJlZ19kZWZhdWx0cyA9IHdjZDkzMzVfZGVmYXVsdHMsCi0JLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHdjZDkzMzVfZGVmYXVsdHMpLAotCS5tYXhfcmVnaXN0ZXIgPSBXQ0Q5MzM1X01BWF9SRUdJU1RFUiwKLQkudm9sYXRpbGVfcmVnID0gd2NkOTMzNV9pc192b2xhdGlsZV9yZWdpc3RlciwKLQkucmVhZGFibGVfcmVnID0gd2NkOTMzNV9pc19yZWFkYWJsZV9yZWdpc3RlciwKLQkuY2FuX211bHRpX3dyaXRlID0gdHJ1ZSwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5MzM1LXRhYmxlcy5jIGIvZHJpdmVycy9tZmQvd2NkOTMzNS10YWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjMzJlZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC93Y2Q5MzM1LXRhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmg+Ci0KLSNkZWZpbmUgV0NEOTMzNV9SRUcocmVnKSAgKChyZWcpICYgMHhGRikKLQotY29uc3QgdTggd2NkOTMzNV9wYWdlMF9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UwX1BBR0VfUkVHSVNURVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0NMS19CWVBBU1MpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfTUNMS19DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9ERUVQU0xQXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9JUkFNX1NIVVRET1dOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0xX1NIVVRET1dOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DT0RFQ19SUE1fSU5UX01BU0spXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9TVEFUVVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9DTEVBUildID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQU5BX1dBSVRfU1RBVEVfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19BQ1RJVkUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMV9NT05fU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTFNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fQ05UX01TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fQ05UX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DM19NT05fQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9TVEFUVVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9NU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX0kyU19DTEspXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgwX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgxX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgyX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgzX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg0X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg1X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg2X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg3X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg0X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg3X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxMF9JTlBfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEzX0lOUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxNF9JTlBfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX0xfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9MX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QxX1JfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQ0xSX0NPTU1JVCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX01BU0sxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIxKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjIpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX01BU0sxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1BJTjJfQ0xFQVIxKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjIpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0xFVkVMMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0JZUEFTUzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9CWVBBU1MxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfQllQQVNTMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX0JZUEFTUzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9TRVQwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0lOVFJfU0VUMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JTlRSX1NFVDIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSU5UUl9TRVQzKV0gPSAxLAotfTsKLQotY29uc3QgdTggd2NkOTMzNV9wYWdlMV9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxX1BBR0VfUkVHSVNURVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF82KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzgpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF85KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF82KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfRlJFUV9DVExfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9GTExfU1RBVFVTXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF81KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF84KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfTF9WQUxfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF81KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfRlJFUV9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfRkxMX01PREUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0kyU19GTExfU1RBVFVTXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfTF9WQUxfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0xfVkFMX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9EU01fRlJBQ19DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9DT05GSUdfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF81KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF82KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF83KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX0ZMTF9NT0RFKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TQl9GTExfU1RBVFVTXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0JfRkxMX1NUQVRVU18yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMyldID0gMSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzMzVfcGFnZTJfcmVnX3JlYWRhYmxlW1dDRDkzMzVfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9QQUdFMl9QQUdFX1JFR0lTVEVSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzExKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzE0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxX1RSRyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyX1RSRyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzApXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMildID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzMpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV80KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNSldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzYpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV83KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfOCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzkpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzExKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTIpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE0KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTUpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV83KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzgpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzApXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMildID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzMpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl80KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNSldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzYpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl83KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfOCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzkpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMCldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzExKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTIpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMyldID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzE0KV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTUpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl83KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzgpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfOSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV9BQ0spXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfQUNLKV0gPSAwLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19FQ19CVUZfSU5UX1BFUklPRCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfVVNfQlVGX0lOVF9QRVJJT0QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfVVNfRUNfTVVYX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfTUFEX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9EKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19UWF9QUF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0RNSUMwX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfRE1JQzFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19ETUlDMl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0RNSUNfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TVkFfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19DUEFSX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfV0RPR19DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX0JBQ0tVUF9JTlQpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DUEVfU1NfQ1BFX09DRF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVIpXSA9IDAsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF83KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzgpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF82KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfOCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TT0NfTUFEX0lOUF9TRUwpXSA9IDEsCi19OwotCi1jb25zdCB1OCB3Y2Q5MzM1X3BhZ2U2X3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTZfUEFHRV9SRUdJU1RFUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQklBUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQ0xLX1RPUCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfUkNPKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfQSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQlVDS19WT1VUX0QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0JVQ0tfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9CVUNLX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfUlhfU1VQUExJRVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0hQSCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfRUFSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9MT18xXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0xPXzNfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUFEX1NFVFVQKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9BTUlDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQU1JQzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0FNSUMzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9BTUlDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfQU1JQzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX0FNSUM2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfRUxFQ1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfWkRFVCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE4wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfQlROMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE4zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01CSENfQlRONSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUJIQ19CVE42KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NQkhDX0JUTjcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01JQ0IxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9NSUNCMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9BTkFfTUlDQjMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQU5BX01JQ0I0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0FOQV9WQkFEQyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9CSUFTX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9CSUFTX1ZCR19GSU5FX0FESildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DTE9DS19URVNUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ1RSTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19DVFJMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19URVNUX0NUUkwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF9PVVRfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMX09VVF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JDT19DQUxfT1VUXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUkNPX0NBTF9PVVRfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SQ09fQ0FMX09VVF81KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX01PREVfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fTU9ERV8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX1ZDTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fVkNMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF80KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF83KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfOCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzkpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NDTF8xMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fRklMVEVSXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fQ0FMX0NPREVfRVhUXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX09VVF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9PVVRfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NJRE9fU0lET19URVNUXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUJIQ19DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfUExVR19ERVRFQ1RfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01CSENfWkRFVF9SQU1QX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX0ZTTV9ERUJVRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NQkhDX1RFU1RfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0lCSUFTX0ZFKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0JJQVNfQURDKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1ZCQURDX0ZFX0NUUkwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVkJBRENfQURDX1JFRildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfSU8pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVkJBRENfQURDX1NBUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19ERUJVRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfRE9VVE1TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9WQkFEQ19BRENfRE9VVExTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9MRE9IX01PREUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTERPSF9CSUFTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0xET0hfU1RCX0xPQURTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0xET0hfU0xPV1JBTVApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCMV9URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCMl9URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCM19URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9NSUNCNF9URVNUX0NUTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0FEQ19WQ00pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0JJQVNfQVRFU1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfQ09NX0FEQ19JTlQxX0lCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9BRENfSU5UMl9JQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVEFSVCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzEyUDI4OE0pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX1RFU1RfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX0FEQ19JQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfQVRFU1RfUkVGQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzFfMl9URVNUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfVEVTVF9CTEtfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfMV8yX1RYRkVfQ0xLRElWKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzFfMl9TQVIxX0VSUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8xXzJfU0FSMl9FUlIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X1RFU1RfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X0FEQ19JQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfQVRFU1RfUkVGQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzNfNF9URVNUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfVEVTVF9CTEtfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfM180X1RYRkVfQ0xLRElWKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzNfNF9TQVIxX0VSUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF8zXzRfU0FSMl9FUlIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X1RFU1RfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X0FEQ19JQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfQVRFU1RfUkVGQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzVfNl9URVNUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfVEVTVF9CTEtfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVFhfNV82X1RYRkVfQ0xLRElWKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RYXzVfNl9TQVIxX0VSUildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UWF81XzZfU0FSMl9FUlIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX01PREVfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DTEFTU0hfTU9ERV8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NMQVNTSF9NT0RFXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0xBU1NIX1NQQVJFKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfRU4pXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF81KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF84KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzkpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRkxZQkFDS19URVNUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9BVVhfU1dfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX1BBX0FVWF9JTl9DT05OKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX1RJTUVSX0RJVildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9PQ1BfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX09DUF9DT1VOVCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0VBUl9EQUMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19FQVJfQU1QKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xETyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0hQSF9QQSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDQlVGRl9DTlAyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfSFBIX0NOUDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19IUEhfTE9XUE9XRVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUEEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUkVGKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX0xETyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9SWF9CSUFTX1NFTE9fREFDX1BBKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfQlVDS19SU1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9FUlJBTVApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19GTFlCX0JVRkYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUlhfQklBU19GTFlCX01JRF9SU1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX0xfU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfQ05QX0VOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DTlBfV0dfVElNRSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfT0NQX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfQVVUT19DSE9QKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9DSE9QX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUEFfQ1RMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUEFfQ1RMMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfTF9FTildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfTF9URVNUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9MX0FURVNUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX0VOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9SX1RFU1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JfQVRFU1QpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfQ0xLX0NUTDIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9IUEhfUkRBQ19DSE9QX0NMS19MUF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JFRkJVRkZfVUhRQV9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfSFBIX1JfREFDX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfRU5fUkVHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0VBUl9DTUJVRkYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0lDVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0VOX0RCR19DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRUFSX0NOUCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfREFDX0NUTF9BVEVTVCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfU1RBVFVTX1JFRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9FQVJfT1VUX1NIT1JUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTUlTQyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0xPMl9DT01QQU5ERVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ09NTU9OKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQllQQVNTX0VOKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ05QKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fQ09SRV9PVVRfUFJPRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0xET19PVVRfUFJPRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9ESUZGX0xPX0NPTV9QQV9GUkVRKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fUkVTRVJWRURfUkVHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NFX0xPX0NPTTEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU0VfTE9fQ09NMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfR0FJTildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfQ1RSTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzRfR0FJTildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzRfQ1RSTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TRV9MT19MTzNfU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NFX0xPX0xPNF9TVEFUVVMpXSA9IDEsCi19OwotCi1jb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMF9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMF9QQUdFX1JFR0lTVEVSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9NT0RFXzJfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZGX1NISUZUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZCX1NISUZUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9BX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9MUEZfRkZfQl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZCX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9TTUxQRl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfRENGTFRfU0hJRlRfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzBfRkJfR0FJTl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9NT0RFXzFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkZfU0hJRlQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkJfU0hJRlQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0FfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GRl9CX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9MUEZfRkJfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX1NNTFBGX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9EQ0ZMVF9TSElGVF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0FEQVBUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0FOQzFfRkZfQl9HQUlOX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQU5DMV9GQl9HQUlOX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDBfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDFfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDJfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDNfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDRfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDVfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDZfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDdfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDhfVFhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfMTkyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfMTkyX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IDEsCi19OwotCi1jb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMV9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMV9QQUdFX1JFR0lTVEVSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEwyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEw2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEwxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw3KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEwyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEw2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEwxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw3KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1ZPTF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM0KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM3KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM3KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzUpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM2KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM3KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzEpXSA9IDEsCi19OwotCi1jb25zdCB1OCB3Y2Q5MzM1X3BhZ2UxMl9yZWdfcmVhZGFibGVbV0NEOTMzNV9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1BBR0UxMl9QQUdFX1JFR0lTVEVSKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0NSQyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9ETFlfQ1RSTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9ERUNBWV9DVFJMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX1BBKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX1BBKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0hQSF9WX0hEKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX0hEKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0sxX01TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9LMV9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSzJfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTFNIX0syX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xTSF9JRExFX0NUUkwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9IUEgpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9FQVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0NMU0hfT1ZSX1ZSRUYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfU1RBVFVTKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0FEQ19DQUwyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BLX0VTVDMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1JGX1BST0MyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX1RBQzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMzKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBENCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTildID0gMCwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fTU9OX1ZBTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMwX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMxX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMyX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1NQTElORV9TUkMzX1NUQVRVUyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ0ZHMSldID0gMSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzMzVfcGFnZTEzX3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTEzX1BBR0VfUkVHSVNURVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX1NSQ19DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1BPTExfUEVSSU9EMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTFNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX01TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TVEFUVVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9DVFJMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCX1JEKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0JfUkQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX1BBVEhfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNV9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjZfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I3X0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9COF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX1RJTUVSX0NUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMV9DVEwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzApXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX1RPUF9DRkcyKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX1RPUF9DRkc1KV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzYpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9XUl9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX0xVVCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9SRF9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9XUl9NU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfTFVUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9SRF9NU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1dSX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9MVVQpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX1JEX0xTQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9XUl9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX01TQildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9DRENfVE9QX0RJRkZSX0NPTVBfTFVUKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9SRF9MU0IpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX01TQildID0gMSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzMzVfcGFnZV8weDgwX3JlZ19yZWFkYWJsZVtXQ0Q5MzM1X1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfUEFHRTgwX1BBR0VfUkVHSVNURVIpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9CSVNUX01PREVfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fUkZfUEFfT05fUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSU5UUjFfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSU5UUjJfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fU1dSX0RBVEFfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fU1dSX0NMS19QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyQ19DTEtfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJDX0RBVEFfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1JYX1NEMF9QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9JMlNfUlhfU0QxX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19SWF9TQ0tfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1JYX1dTX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19UWF9TRDBfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSTJTX1RYX1NEMV9QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9JMlNfVFhfU0NLX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0kyU19UWF9XU19QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDMV9DTEtfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzFfREFUQV9QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDMl9DTEtfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzJfREFUQV9QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9ETUlDM19DTEtfUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fRE1JQzNfREFUQV9QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9KVERJX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0pURE9fUElOQ0ZHKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RMTU1fSlRNU19QSU5DRkcpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVExNTV9KVENLX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9UTE1NX0pUUlNUX1BJTkNGRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMildID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfUEFEX0RSVkNUTCldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9TVEFUVVMpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfTUVNX0NUUkwpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19CVVNfU0VMKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfSlRBRyldID0gMSwKLQlbV0NEOTMzNV9SRUcoV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzEpXSA9IDEsCi0JW1dDRDkzMzVfUkVHKFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8yKV0gPSAxLAotCVtXQ0Q5MzM1X1JFRyhXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfRU5fMyldID0gMSwKLX07Ci0KLWNvbnN0IHU4ICp3Y2Q5MzM1X3JlZ1tXQ0Q5MzM1X05VTV9QQUdFU10gPSB7Ci0JW1BBR0VfMF0gPSB3Y2Q5MzM1X3BhZ2UwX3JlZ19yZWFkYWJsZSwKLQlbUEFHRV8xXSA9IHdjZDkzMzVfcGFnZTFfcmVnX3JlYWRhYmxlLAotCVtQQUdFXzJdID0gd2NkOTMzNV9wYWdlMl9yZWdfcmVhZGFibGUsCi0JW1BBR0VfNl0gPSB3Y2Q5MzM1X3BhZ2U2X3JlZ19yZWFkYWJsZSwKLQlbUEFHRV8xMF0gPSB3Y2Q5MzM1X3BhZ2UxMF9yZWdfcmVhZGFibGUsCi0JW1BBR0VfMTFdID0gd2NkOTMzNV9wYWdlMTFfcmVnX3JlYWRhYmxlLAotCVtQQUdFXzEyXSA9IHdjZDkzMzVfcGFnZTEyX3JlZ19yZWFkYWJsZSwKLQlbUEFHRV8xM10gPSB3Y2Q5MzM1X3BhZ2UxM19yZWdfcmVhZGFibGUsCi0JW1BBR0VfMFg4MF0gPSB3Y2Q5MzM1X3BhZ2VfMHg4MF9yZWdfcmVhZGFibGUsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd2NkOTM0eC1yZWdtYXAuYyBiL2RyaXZlcnMvbWZkL3djZDkzNHgtcmVnbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjQ5ZWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvd2NkOTM0eC1yZWdtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSAid2NkOXh4eC1yZWdtYXAuaCIKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB3Y2Q5MzR4XzFfMV9kZWZhdWx0c1tdID0gewotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwLCAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0JJQVNfVkJHX0ZJTkVfQURKLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NzUgfSwKLQl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwRSB9LAotCXsgV0NEOTM0WF9FQVJfREFDX0NUTF9BVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQLCAgICAgICAgICAgICAgICAgIDB4MTcgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfTCwgICAgICAgICAgICAgICAweDgxIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTF9SLCAgICAgICAgICAgICAgIDB4ODEgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgd2NkOTM0eF9kZWZhdWx0c1tdID0gewotCXsgV0NEOTM0WF9QQUdFMF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfQllQQVNTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAgICAgICAgICAgICAgICAgICAgICAgMHgxZiB9LAotCXsgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMSzJfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQ09ERUNfUlBNX0kyU19EU0RfQ0xLX1NFTCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUxLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTIsICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMywgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QwLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDEsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDIsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMywgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ0LCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDUsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNiwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ3LCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDgsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMywgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0LCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTUsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1NUQVRVUywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08sICAgICAgMHgwZCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8yLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTkFfV0FJVF9TVEFURV9DVEwsICAgICAgICAweGNjIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX1NMTlFfV0FJVF9TVEFURV9DVEwsICAgICAgIDB4Y2MgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTFRfRlVOQ19FTiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0dQSU9fQ1RMX09FLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfREFUQSwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDBfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYMV9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfUlgyX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDNfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYNF9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfUlg1X0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9SWDZfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1JYN19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDFfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMl9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDRfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNV9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDdfSU5QX0NGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYOF9JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDEwX0lOUF9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDE0X0lOUF9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMF9DRkcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfVFgxXzBfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDFfMV9DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfMV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18yX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzNfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfQ0xLU1JDX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfVERNX0NUTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9EQVRBX0hVQl9JMlNfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8wLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzAsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8xLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzEsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8yLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzIsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8zLCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzMsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BX0NUTF80LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV80LCAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzQsICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0RNQV9SRE1BNF9QUlRfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfUkRNQV9TQlRYMF83X0NGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX1JETUFfU0JUWDhfMTFfQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8wLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfV0RNQV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX1dETUFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8yLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8zLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfV0RNQV9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV80LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfNCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX1dETUEwX1BSVF9DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0RNQV9XRE1BM19QUlRfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ETUFfV0RNQTRfUFJUMF8zX0NGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRE1BX1dETUE0X1BSVDRfN19DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1BBR0UxX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4NzEgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDM0IH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwYiB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF80LCAgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNSwgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzYsICAgICAgICAgICAgICAgICAgICAgIDB4NmUgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF83LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfOCwgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzksICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAweDUzIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfTF9WQUxfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMSwgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgMHg2YiB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMSwgICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfNCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHgzMyB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9GUkVRX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUsICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18wLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDQxIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgIDB4NWYgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfTF9WQUxfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfRFNNX0ZSQUNfQ1RMXzEsICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgIDB4NmIgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAweDMwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAotCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4OTQgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzUsICAgICAgICAgICAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF82LCAgICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzgsICAgICAgICAgICAgICAgICAgICAgICAweDVlIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF85LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9TQl9GTExfTF9WQUxfQ1RMXzAsICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX0xfVkFMX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9EU01fRlJBQ19DVExfMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEsICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMCwgICAgICAgICAgICAgICAgICAgICAweDZiIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8wLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8zLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX0ZMTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TQl9GTExfU1RBVFVTXzEsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0JfRkxMX1NUQVRVU18yLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFMl9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMCwgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzEsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVGTExfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzAsICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8xLCAgICAgICAgIDB4MGYgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfT1ZFUlJJREUsICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLCAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMSwgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzIsICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8zLCAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fNCwgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzUsICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLCAgICAgICAgICAgMHgwNyB9LAotCXsgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9PVkVSUklERV9DVEwsICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfT1ZFUlJJREVfQ1RMMSwgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfVVNfQlVGX0lOVF9QRVJJT0QsICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX0NQQVJNQURfQlVGUkRZX0lOVF9QRVJJT0QsICAgICAgICAweDEzIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSB9LAotCXsgV0NEOTM0WF9DUEVfU1NfVVNfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfRE1JQzBfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX0RNSUMxX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19ETUlDMl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfRE1JQ19DRkcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRywgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DUEVfU1NfQkFDS1VQX0lOVCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19DUEVfT0NEX0NGRywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEsICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCLCAgICAgICAgICAgICAweDNmIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18xQSwgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMUIsICAgICAgICAgICAgIDB4M2YgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEEsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBCLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18xQSwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMUIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMEEsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBCLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8xQSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMUIsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9NQUlOX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF81LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF84LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfMywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF81LCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzcsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8yLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzQsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF81LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF84LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1BUUiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU09DX01BRF9CRUFDT05fSUlSX0NUTF9WQUwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NPQ19NQURfSU5QX1NFTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFNF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9DRkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfQ0xSX0NPTU1JVCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfSU5UUl9QSU4xX01BU0sxLCAgICAgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMiwgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjAsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX1BJTjJfTUFTSzMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfSU5UUl9QSU4yX1NUQVRVUzMsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfUElOMl9DTEVBUjMsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX01BU0syLCAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9NQVNLMywgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfU1RBVFVTMiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX1NUQVRVUzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9DTEVBUjIsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfQ0xFQVIzLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX0xFVkVMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfSU5UUl9MRVZFTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfTEVWRUwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5NCB9LAotCXsgV0NEOTM0WF9JTlRSX0xFVkVMMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzNFhfSU5UUl9CWVBBU1MwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfQllQQVNTMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX0JZUEFTUzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9CWVBBU1MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfU0VUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX1NFVDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSU5UUl9TRVQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfU0VUMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgICAgICAgICAgICAgICAgICAgIDB4N2YgfSwKLQl7IFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX1NUQVRVUywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19DTEVBUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFNV9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfREVWSUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAweDQ5IH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1JFVklTSU9OLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19IX0NPTU1BTkQsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfTlVNQkVSX09GX0JZVEVfTVNCLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX05VTUJFUl9PRl9CWVRFX0xTQiwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19NQVNURVJfQUREUkVTU19NU0IsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfTUFTVEVSX0FERFJFU1NfTFNCLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NMQVZFX0FERFJFU1NfTVNCLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TTEFWRV9BRERSRVNTX0xTQiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfVElNRVIwX0lOVEVSUlVQVF9NU0IsICAgICAgICAgICAweDQwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMF9JTlRFUlJVUFRfTFNCLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19USU1FUjFfSU5URVJSVVBUX01TQiwgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfVElNRVIxX0lOVEVSUlVQVF9MU0IsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMl9JTlRFUlJVUFRfTVNCLCAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19USU1FUjJfSU5URVJSVVBUX0xTQiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfQ09NTV9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0ZSQU1FX0NUUkwsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fMk5EX0RBVEFfQ0gxXzIsICAgICAgICAgICAgIDB4NzcgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NIM180LCAgICAgICAgICAgICAweDc3IH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDUsICAgICAgICAgICAgICAgMHg3MCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TV19FVkVOVF9SRCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1dfRVZFTlRfQ1RSTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMSwgICAgICAgICAgICAgICAgICAgMHgxMiB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzIsICAgICAgICAgICAgICAgICAgIDB4MzQgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX1NFTEVDVF8zLCAgICAgICAgICAgICAgICAgICAweDU1IH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TQU1QTElOR19GUkVRLCAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVkVSU0lPTl9DVEwsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZFUlNJT05fU0VMLCAgICAgICAgICAweDExIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQV9NU0IsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEFfTFNCLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hCX01TQiwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQl9MU0IsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19SQU1fQ05UUkwsICAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CQU5LLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8wLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV82LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzgsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV85LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0IsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9DLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0UsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9GLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTAsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzExLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE0LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE3LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xOCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTksICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFBLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFELCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUYsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIzLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI2LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjgsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI5LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJDLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkUsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJGLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM1LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM4LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zOSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0EsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNCLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0QsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNFLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19UT1BfQ1RSTDEsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfVE9QX0NUUkwyLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX1BETV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19QRE1fTVVURV9DVFJMLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19DVFJMLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfU1RBVFVTLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0ZTLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19JTl9TRUwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0dQT1VUX0VOQUJMRSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19HUE9VVF9WQUwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9NQVNLLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfU1RBVFVTLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19BTkFfSU5URVJSVVBUX0NMUiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSVBfVEVTVElORywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRSTCwgICAgICAgICAgICAgICAgMHgwZiB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05ULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVF9NU0IsICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRfTFNCLCAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzAsICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0sxLCAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLMiwgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzMsICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0s0LCAgICAgICAgICAgICAgICAweDFmIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMwLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMSwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzIsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMzLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTNCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjAsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIxLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSMiwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjMsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFI0LCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9BTkFfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX0JJQVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9SQ08sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9BTkFfUEFHRTZfU1BBUkUyLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX1BBR0U2X1NQQVJFMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9BTkFfQlVDS19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9IUEgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAotCXsgV0NEOTM0WF9BTkFfRUFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX0xPXzFfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNjIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQURfU0VUVVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9BTkFfQU1JQzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQU5BX0FNSUMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9BTUlDMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9BTkFfQU1JQzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX01CSENfTUVDSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM5IH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzEsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8yLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQU5BX01CSENfQlROMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9BTkFfTUJIQ19CVE4yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQU5BX01CSENfQlROMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9BTkFfTUJIQ19CVE41LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzNFhfQU5BX01CSENfQlRONiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjcsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MCB9LAotCXsgV0NEOTM0WF9BTkFfTUlDQjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQU5BX01JQ0IyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9NSUNCMl9SQU1QLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9BTkFfTUlDQjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQU5BX01JQ0I0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9WQkFEQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9CSUFTX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKLQl7IFdDRDkzNFhfQklBU19WQkdfRklORV9BREosICAgICAgICAgICAgICAgICAgICAgICAweDY1IH0sCi0JeyBXQ0Q5MzRYX1JDT19DVFJMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NCB9LAotCXsgV0NEOTM0WF9SQ09fQ1RSTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDggfSwKLQl7IFdDRDkzNFhfUkNPX0NBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1JDT19DQUxfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9SQ09fQ0FMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUkNPX1RFU1RfQ1RSTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1JDT19DQUxfT1VUXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9SQ09fQ0FMX09VVF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUkNPX0NBTF9PVVRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1JDT19DQUxfT1VUXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9SQ09fQ0FMX09VVF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lET19NT0RFXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZSB9LAotCXsgV0NEOTM0WF9TSURPX01PREVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjYgfSwKLQl7IFdDRDkzNFhfU0lET19NT0RFXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU2IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fVkNMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURPX1ZDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmMgfSwKLQl7IFdDRDkzNFhfU0lET19WQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0NMXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NyB9LAotCXsgV0NEOTM0WF9TSURPX0NDTF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIgfSwKLQl7IFdDRDkzNFhfU0lET19DQ0xfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0NMXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MSB9LAotCXsgV0NEOTM0WF9TSURPX0NDTF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmQgfSwKLQl7IFdDRDkzNFhfU0lET19DQ0xfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0NMXzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ZiB9LAotCXsgV0NEOTM0WF9TSURPX0NDTF84LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NmYgfSwKLQl7IFdDRDkzNFhfU0lET19DQ0xfOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0NMXzEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNiB9LAotCXsgV0NEOTM0WF9TSURPX0ZJTFRFUl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIgfSwKLQl7IFdDRDkzNFhfU0lET19GSUxURVJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU0IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fRFJJVkVSXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NyB9LAotCXsgV0NEOTM0WF9TSURPX0RSSVZFUl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTUgfSwKLQl7IFdDRDkzNFhfU0lET19EUklWRVJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDU1IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfRVhUXzEsICAgICAgICAgICAgICAgICAgICAgMHg5YyB9LAotCXsgV0NEOTM0WF9TSURPX0NBTF9DT0RFX0VYVF8yLCAgICAgICAgICAgICAgICAgICAgIDB4ODIgfSwKLQl7IFdDRDkzNFhfU0lET19DQUxfQ09ERV9PVVRfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfT1VUXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURPX1RFU1RfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lET19URVNUXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01CSENfQ1RMX0NMSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMCB9LAotCXsgV0NEOTM0WF9NQkhDX0NUTF9BTkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUJIQ19DVExfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01CSENfQ1RMX1NQQVJFXzIsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NQkhDX0NUTF9CQ1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUJIQ19TVEFUVVNfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01CSENfVEVTVF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9WQkFEQ19TVUJCTE9DS19FTiwgICAgICAgICAgICAgICAgICAgICAgIDB4ZGUgfSwKLQl7IFdDRDkzNFhfVkJBRENfSUJJQVNfRkUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4IH0sCi0JeyBXQ0Q5MzRYX1ZCQURDX0JJQVNfQURDLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MSB9LAotCXsgV0NEOTM0WF9WQkFEQ19GRV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWMgfSwKLQl7IFdDRDkzNFhfVkJBRENfQURDX1JFRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX1ZCQURDX0FEQ19JTywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAotCXsgV0NEOTM0WF9WQkFEQ19BRENfU0FSLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfVkJBRENfREVCVUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0xET0hfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyYiB9LAotCXsgV0NEOTM0WF9MRE9IX0JJQVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKLQl7IFdDRDkzNFhfTERPSF9TVEJfTE9BRFMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0xET0hfU0xPV1JBTVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAotCXsgV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCi0JeyBXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAotCXsgV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCi0JeyBXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAotCXsgV0NEOTM0WF9NSUNCM19URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCi0JeyBXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAotCXsgV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8xLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMiwgICAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCi0JeyBXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzMsICAgICAgICAgICAgICAgICAgICAgICAgMHhhNCB9LAotCXsgV0NEOTM0WF9UWF9DT01fQURDX1ZDTSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzkgfSwKLQl7IFdDRDkzNFhfVFhfQ09NX0JJQVNfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAweGMwIH0sCi0JeyBXQ0Q5MzRYX1RYX0NPTV9BRENfSU5UMV9JQiwgICAgICAgICAgICAgICAgICAgICAgMHg2ZiB9LAotCXsgV0NEOTM0WF9UWF9DT01fQURDX0lOVDJfSUIsICAgICAgICAgICAgICAgICAgICAgIDB4NGYgfSwKLQl7IFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDJlIH0sCi0JeyBXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVEFSVCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNLCAgICAgICAgICAgICAgIDB4YzcgfSwKLQl7IFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX1NUT1BfMTJQMjg4TSwgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX1RYXzFfMl9URVNUX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhjYyB9LAotCXsgV0NEOTM0WF9UWF8xXzJfQURDX0lCLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzNFhfVFhfMV8yX0FURVNUX1JFRkNUTCwgICAgICAgICAgICAgICAgICAgICAweDBhIH0sCi0JeyBXQ0Q5MzRYX1RYXzFfMl9URVNUX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOCB9LAotCXsgV0NEOTM0WF9UWF8xXzJfVEVTVF9CTEtfRU4sICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfVFhfMV8yX1RYRkVfQ0xLRElWLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RYXzFfMl9TQVIxX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UWF8xXzJfU0FSMl9FUlIsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVFhfM180X1RFU1RfRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAweGNjIH0sCi0JeyBXQ0Q5MzRYX1RYXzNfNF9BRENfSUIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSB9LAotCXsgV0NEOTM0WF9UWF8zXzRfQVRFU1RfUkVGQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MGEgfSwKLQl7IFdDRDkzNFhfVFhfM180X1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAweDM4IH0sCi0JeyBXQ0Q5MzRYX1RYXzNfNF9URVNUX0JMS19FTiwgICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9UWF8zXzRfVFhGRV9DTEtESVYsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVFhfM180X1NBUjFfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RYXzNfNF9TQVIyX0VSUiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEFTU0hfTU9ERV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfQ0xBU1NIX01PREVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNhIH0sCi0JeyBXQ0Q5MzRYX0NMQVNTSF9NT0RFXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9WQ0xfMSwgICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKLQl7IFdDRDkzNFhfQ0xBU1NIX0NUUkxfVkNMXzIsICAgICAgICAgICAgICAgICAgICAgICAweDgyIH0sCi0JeyBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8xLCAgICAgICAgICAgICAgICAgICAgICAgMHgzMSB9LAotCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMiwgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzMsICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCi0JeyBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF80LCAgICAgICAgICAgICAgICAgICAgICAgMHg1MSB9LAotCXsgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfNSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xBU1NIX0JVQ0tfVE1VWF9BX0QsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMQVNTSF9CVUNLX1NXX0RSVl9DTlRMLCAgICAgICAgICAgICAgICAgMHg3NyB9LAotCXsgV0NEOTM0WF9DTEFTU0hfU1BBUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRkxZQkFDS19FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDRlIH0sCi0JeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsICAgICAgICAgICAgICAgICAgICAgMHgwYiB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8yLCAgICAgICAgICAgICAgICAgICAgIDB4NDUgfSwKLQl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMywgICAgICAgICAgICAgICAgICAgICAweDc0IH0sCi0JeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzQsICAgICAgICAgICAgICAgICAgICAgMHg3ZiB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF81LCAgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKLQl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNiwgICAgICAgICAgICAgICAgICAgICAweDk4IH0sCi0JeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzcsICAgICAgICAgICAgICAgICAgICAgMHhhOSB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF84LCAgICAgICAgICAgICAgICAgICAgIDB4NjggfSwKLQl7IFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfOSwgICAgICAgICAgICAgICAgICAgICAweDY0IH0sCi0JeyBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzEsICAgICAgICAgICAgICAgICAgMHhlZCB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8yLCAgICAgICAgICAgICAgICAgIDB4ZjAgfSwKLQl7IFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMywgICAgICAgICAgICAgICAgICAweGE2IH0sCi0JeyBXQ0Q5MzRYX0ZMWUJBQ0tfQ1RSTF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NSB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1RFU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUlhfQVVYX1NXX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1JYX1BBX0FVWF9JTl9DT05OLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9SWF9USU1FUl9ESVYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzIgfSwKLQl7IFdDRDkzNFhfUlhfT0NQX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmIH0sCi0JeyBXQ0Q5MzRYX1JYX09DUF9DT1VOVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NyB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0VBUl9EQUMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19FQVJfQU1QLCAgICAgICAgICAgICAgICAgICAgICAgICAweGFhIH0sCi0JeyBXQ0Q5MzRYX1JYX0JJQVNfSFBIX0xETywgICAgICAgICAgICAgICAgICAgICAgICAgMHhhOSB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0hQSF9QQSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMiwgICAgICAgICAgICAgICAweDhhIH0sCi0JeyBXQ0Q5MzRYX1JYX0JJQVNfSFBIX1JEQUNfTERPLCAgICAgICAgICAgICAgICAgICAgMHg4OCB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0hQSF9DTlAxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsICAgICAgICAgICAgICAgICAgICAweDgyIH0sCi0JeyBXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX1BBLCAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19SRUYsICAgICAgICAgICAgICAgICAgICAgIDB4ODggfSwKLQl7IFdDRDkzNFhfUlhfQklBU19ESUZGTE9fTERPLCAgICAgICAgICAgICAgICAgICAgICAweDg4IH0sCi0JeyBXQ0Q5MzRYX1JYX0JJQVNfU0VMT19EQUNfUEEsICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0JVQ0tfUlNULCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfUlhfQklBU19CVUNLX1ZSRUZfRVJSQU1QLCAgICAgICAgICAgICAgICAweDQ0IH0sCi0JeyBXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9FUlJBTVAsICAgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9SWF9CSUFTX0ZMWUJfQlVGRiwgICAgICAgICAgICAgICAgICAgICAgIDB4YWEgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19GTFlCX01JRF9SU1QsICAgICAgICAgICAgICAgICAgICAweDE0IH0sCi0JeyBXQ0Q5MzRYX0hQSF9MX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9IUEhfUl9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfSFBIX0NOUF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YSB9LAotCXsgV0NEOTM0WF9IUEhfQ05QX1dHX1RJTUUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQgfSwKLQl7IFdDRDkzNFhfSFBIX09DUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4IH0sCi0JeyBXQ0Q5MzRYX0hQSF9BVVRPX0NIT1AsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiB9LAotCXsgV0NEOTM0WF9IUEhfQ0hPUF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMgfSwKLQl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ2IH0sCi0JeyBXQ0Q5MzRYX0hQSF9QQV9DVEwyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAotCXsgV0NEOTM0WF9IUEhfTF9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzNFhfSFBIX0xfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9MX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MCB9LAotCXsgV0NEOTM0WF9IUEhfUl9FTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfSwKLQl7IFdDRDkzNFhfSFBIX1JfVEVTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGUwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9SX0FURVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCB9LAotCXsgV0NEOTM0WF9IUEhfUkRBQ19DTEtfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgIDB4OTkgfSwKLQl7IFdDRDkzNFhfSFBIX1JEQUNfQ0xLX0NUTDIsICAgICAgICAgICAgICAgICAgICAgICAweDliIH0sCi0JeyBXQ0Q5MzRYX0hQSF9SREFDX0xET19DVEwsICAgICAgICAgICAgICAgICAgICAgICAgMHgzMyB9LAotCXsgV0NEOTM0WF9IUEhfUkRBQ19DSE9QX0NMS19MUF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfVUhRQV9DVEwsICAgICAgICAgICAgICAgICAgICAweGE4IH0sCi0JeyBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwYSB9LAotCXsgV0NEOTM0WF9IUEhfTF9EQUNfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX1JfREFDX0NUTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VBUl9FTl9SRUcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAotCXsgV0NEOTM0WF9FQVJfQ01CVUZGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfRUFSX0lDVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCi0JeyBXQ0Q5MzRYX0VBUl9FTl9EQkdfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9FQVJfQ05QLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZTAgfSwKLQl7IFdDRDkzNFhfRUFSX0RBQ19DVExfQVRFU1QsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VBUl9TVEFUVVNfUkVHLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9FQVJfRUFSX01JU0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjggfSwKLQl7IFdDRDkzNFhfRElGRl9MT19NSVNDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0RJRkZfTE9fTE8yX0NPTVBBTkRFUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ESUZGX0xPX0xPMV9DT01QQU5ERVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRElGRl9MT19DT01NT04sICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCi0JeyBXQ0Q5MzRYX0RJRkZfTE9fQllQQVNTX0VOLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ESUZGX0xPX0NOUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfRElGRl9MT19DT1JFX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgICAweGEwIH0sCi0JeyBXQ0Q5MzRYX0RJRkZfTE9fTERPX09VVF9QUk9HLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSwgICAgICAgICAgIDB4OGIgfSwKLQl7IFdDRDkzNFhfRElGRl9MT19DT01fUEFfRlJFUSwgICAgICAgICAgICAgICAgICAgICAweGIwIH0sCi0JeyBXQ0Q5MzRYX0RJRkZfTE9fUkVTRVJWRURfUkVHLCAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAotCXsgV0NEOTM0WF9ESUZGX0xPX0xPMV9TVEFUVVNfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRElGRl9MT19MTzFfU1RBVFVTXzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0FOQV9ORVdfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfQU5BX0VOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9TTE5RX0FOQV9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9BTkFfTERPX0NPTkZJRywgICAgICAgICAgICAgICAgICAgICAweGVhIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfQU5BX0xET19PQ1BfQ09ORklHLCAgICAgICAgICAgICAgICAgMHg5NSB9LAotCXsgV0NEOTM0WF9TTE5RX0FOQV9UWF9MRE9fQ09ORklHLCAgICAgICAgICAgICAgICAgIDB4YjYgfSwKLQl7IFdDRDkzNFhfU0xOUV9BTkFfVFhfRFJWX0NPTkZJRywgICAgICAgICAgICAgICAgICAweDI2IH0sCi0JeyBXQ0Q5MzRYX1NMTlFfQU5BX1JYX0NPTkZJR18xLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTM0WF9TTE5RX0FOQV9SWF9DT05GSUdfMiwgICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9BTkFfUExMX0VOQUJMRVMsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9QUkVTRVQsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9TTE5RX0FOQV9QTExfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19QTExfRU5BQkxFUywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfUExMX1BSRVNFVCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX1BMTF9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzIsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19YT19QUkcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfWE9fQ0FQX1hUUCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX1hPX0NBUF9YVE0sICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQk9PU1RfQlNUX0VOX0RMWSwgICAgICAgICAgICAgICAgICAgICAgICAweDQwIH0sCi0JeyBXQ0Q5MzRYX0JPT1NUX0NUUkxfSUxJTSwgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YyB9LAotCXsgV0NEOTM0WF9CT09TVF9WT1VUX1NFVFRJTkcsICAgICAgICAgICAgICAgICAgICAgIDB4Y2EgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfVk9VVF9BX1NUQVJUVVAsICAgICAgICAgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9TVEFSVFVQLCAgICAgICAgICAgICAgICAgMHgwZCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTEsICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX0ZSRVEyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01CSENfTkVXX0VMRUNUX1JFTV9DTEFNUF9DVEwsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NQkhDX05FV19DVExfMSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX01CSENfTkVXX1BMVUdfREVURUNUX0NUTCwgICAgICAgICAgICAgICAgMHhlOSB9LAotCXsgV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwsICAgICAgICAgICAgICAgICAgIDB4MGYgfSwKLQl7IFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9SQU1QX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01CSENfTkVXX0ZTTV9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NQkhDX05FV19BRENfUkVTVUxULCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVFhfTkVXX0FNSUNfNF81X1NFTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1ZCQURDX05FV19BRENfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9WQkFEQ19ORVdfQURDX0RPVVRNU0IsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVkJBRENfTkVXX0FEQ19ET1VUTFNCLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVEwsICAgICAgICAgICAgICAgIDB4YTAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19WUkVGX0NUTCwgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfT1ZFUlJJREVfQ1RMLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX01JU0MxLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzEsICAgICAgICAgICAgICAgICAgICAweDIyIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgICAgICAgICAgICAgICAgICAweGZlIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIsICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzLCAgICAgICAgICAgICAgICAgIDB4NGUgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCwgICAgICAgICAgICAgICAgICAweDU0IH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MzLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19CSUFTX0xPSElGSSwgICAgICAgICAweDYyIH0sCi0JeyBXQ0Q5MzRYX1JYX05FV19JTlRfSFBIX1JEQUNfQklBU19VTFAsICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0xET19MUCwgICAgICAgICAgICAgIDB4MTEgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fVEVTVCwgICAgICAgICAgICAgICAweDBkIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfTERPX0RFQlVHXzEsICAgICAgICAgICAgMHg4NSB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18yLCAgICAgICAgICAgIDB4YjQgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9UWF9MRE9fVEVTVCwgICAgICAgICAgICAweDE2IH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfVFhfRFJWX1RFU1QsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX1RFU1QsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUX1NUQVRVUywgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfREVCVUdfMSwgICAgICAgICAgICAgMHg1MCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX0RFQlVHXzIsICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9DTEtfQ1RSTCwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUkVTRVJWRURfMSwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzIsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUE9TVF9ESVZfUkVHMCwgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzEsICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9SRUZfRElWX1JFRzAsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUkVGX0RJVl9SRUcxLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0ZJTFRFUl9SRUcwLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9GSUxURVJfUkVHMSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTF9WQUwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX01fVkFMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9OX1ZBTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcwLCAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BGRF9DUF9EU01fUFJPRywgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9WQ09fUFJPRywgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcxLCAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0xET19MT0NLX0NGRywgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9ESUdfTE9DS19ERVRfQ0ZHLCAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUE9TVF9ESVZfUkVHMCwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzEsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9SRUZfRElWX1JFRzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0ZJTFRFUl9SRUcwLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMSwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfUExMX0xfVkFMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9NX1ZBTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTl9WQUwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcwLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BGRF9DUF9EU01fUFJPRywgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9WQ09fUFJPRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0xET19MT0NLX0NGRywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9ESUdfTE9DS19ERVRfQ0ZHLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QxLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DTEtfU1lTX0lOVF9DTEtfVEVTVDMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0xLX1NZU19JTlRfWE9fVEVTVDEsICAgICAgICAgICAgICAgICAgICAweDk4IH0sCi0JeyBXQ0Q5MzRYX0NMS19TWVNfSU5UX1hPX1RFU1QyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9CT09TVF9JTlRfVkNPTVBfSFlTVCwgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQk9PU1RfSU5UX1ZMT09QX0ZJTFRFUiwgICAgICAgICAgICAgICAgICAweGVmIH0sCi0JeyBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX0lERUxUQSwgICAgICAgICAgICAgICAgICAgMHhhOCB9LAotCXsgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JTElNX1NUQVJUVVAsICAgICAgICAgICAgIDB4MTcgfSwKLQl7IFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfTUlOX09OVElNRSwgICAgICAgICAgICAgICAweDVmIH0sCi0JeyBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX01BWF9PTlRJTUUsICAgICAgICAgICAgICAgMHg4OCB9LAotCXsgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9USU1JTkcsICAgICAgICAgICAgICAgICAgIDB4MGEgfSwKLQl7IFdDRDkzNFhfQk9PU1RfSU5UX1RNVVhfQV9ELCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0JPT1NUX0lOVF9TV19EUlZfQ05UTCwgICAgICAgICAgICAgICAgICAgMHhmOCB9LAotCXsgV0NEOTM0WF9CT09TVF9JTlRfU1BBUkUxLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQk9PU1RfSU5UX1NQQVJFMiwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX1NUQVRVUywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19JTlRfU1BBUkVfMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX1ZPVVRfU0VUVElOR19BLCAgICAgICAweDY0IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfRCwgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9JTkNfV0FJVCwgICAgICAgICAgICAgIDB4MjQgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfQ1RMLCAgICAgICAgICAweDA5IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0lCTEVFRF9DVEwsICAgICAgICAgICAgMHg3ZCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19JTlRfREVCVUdfQ1BST1ZSX1RFU1QsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfQ1RMX0EsICAgICAgICAgICAgICAgICAweDE0IH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0NUTF9ELCAgICAgICAgICAgICAgICAgMHgxNCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9USU1FT1VUX1BFUklPRCwgICAgICAgIDB4MzMgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzEsICAgICAweDNmIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkcyLCAgICAgMHg3NCB9LAotCXsgV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMywgICAgIDB4MzMgfSwKLQl7IFdDRDkzNFhfU0lET19ORVdfSU5UX0hJR0hfQUNDVV9NT0RFX1NFTDEsICAgICAgICAweDFkIH0sCi0JeyBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ISUdIX0FDQ1VfTU9ERV9TRUwyLCAgICAgICAgMHgwYSB9LAotCXsgV0NEOTM0WF9NQkhDX05FV19JTlRfU0xOUV9IUEYsICAgICAgICAgICAgICAgICAgIDB4NTAgfSwKLQl7IFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfUkVGLCAgICAgICAgICAgICAgICAgICAweDI0IH0sCi0JeyBXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX0NPTVAsICAgICAgICAgICAgICAgICAgMHg1MCB9LAotCXsgV0NEOTM0WF9NQkhDX05FV19JTlRfU1BBUkVfMiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUEFHRTEwX1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9NT0RFXzFfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8yX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0ZGX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9GQl9TSElGVCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfTFBGX0ZGX0FfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9CX0NUTCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9MUEZfRkJfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfU01MUEZfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0RDRkxUX1NISUZUX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfRkZfQl9HQUlOX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX0ZCX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9SQ19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfRklGT19DT01NT05fQ1RMLCAgICAgICAgICAgICAgICAweDg4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX1JDMF9TVEFUVVNfRk1JTl9DTlRSLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNSU5fQ05UUiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzBfUkMwX1NUQVRVU19GTUFYX0NOVFIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMwX1JDMV9TVEFUVVNfRk1BWF9DTlRSLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMV9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfRkZfU0hJRlQsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX0ZCX1NISUZULCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9MUEZfRkZfQV9DVEwsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfTFBGX0ZGX0JfQ1RMLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GQl9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9TTUxQRl9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9BREFQVF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9GRl9CX0dBSU5fQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfRkJfR0FJTl9DVEwsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX1JDX0NPTU1PTl9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9GSUZPX0NPTU1PTl9DVEwsICAgICAgICAgICAgICAgIDB4ODggfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUlOX0NOVFIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX1JDMV9TVEFUVVNfRk1JTl9DTlRSLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQU5DMV9SQzBfU1RBVFVTX0ZNQVhfQ05UUiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0FOQzFfUkMxX1NUQVRVU19GTUFYX0NOVFIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19BTkMxX1NUQVRVU19GSUZPLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgICAweDI1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAotCXsgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfVFgyX1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYM19UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAotCXsgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfVFg1X1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF8xOTJfQ1RMLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MTAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgzYyB9LAotCXsgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNCwgICAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfVFg4X1RYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF8xOTJfQ0ZHLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4M2MgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsICAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAgICAgICAgICAgICAweDAyIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFMTFfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMCwgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDEsICAgICAgICAgICAgICAgICAgICAgMHhkYiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwyLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMywgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDQsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw1LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNiwgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDcsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwwLCAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAweGRiIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDIsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwzLCAgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNCwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw2LCAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDMsICAgICAgICAgICAgICAgICAgICAgMHgzNSB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw0LCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDYsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw3LCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMCwgICAgICAgICAgICAgICAgICAgICAweDYwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDEsICAgICAgICAgICAgICAgICAgICAgMHhkYiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwyLCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMywgICAgICAgICAgICAgICAgICAgICAweDM1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDQsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw1LCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNiwgICAgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDcsICAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwwLCAgICAgICAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAweGRiIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDIsICAgICAgICAgICAgICAgICAgICAgMHhmZiB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwzLCAgICAgICAgICAgICAgICAgICAgIDB4MzUgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNCwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDUsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw2LCAgICAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHg2MCB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4ZGIgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMiwgICAgICAgICAgICAgICAgICAgICAweGZmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMsICAgICAgICAgICAgICAgICAgICAgMHgzNSB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw0LCAgICAgICAgICAgICAgICAgICAgIDB4ZmYgfSwKLQl7IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDYsICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw3LCAgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4NjQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgICAweDhmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgICAweDdlIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4ZmMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzUsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM2LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwLCAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfRFNNREVNX0NUTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMSwgICAgICAgICAgICAgICAgICAgIDB4NjQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsICAgICAgICAgICAgICAgICAgICAweDhmIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX0NUTCwgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsICAgICAgICAgICAgICAgICAweDdlIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMCwgICAgICAgICAgICAgICAgICAgIDB4ZmMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsICAgICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzQsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM1LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCwgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzEsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0RTTURFTV9DVEwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDY0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcyLCAgICAgICAgICAgICAgICAgICAgMHg4ZiB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9DVEwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsICAgICAgICAgICAgICAgICAweDA0IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAgICAgICAgICAgICAgICAgMHg3ZSB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzAsICAgICAgICAgICAgICAgICAgICAweGZjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMxLCAgICAgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzMsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM0LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHhmYyB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHhmYyB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ1RMLCAgICAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzAsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAgICAgICAgICAgICAgICAgICAgMHg2NCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMiwgICAgICAgICAgICAgICAgICAgIDB4OGYgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLCAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRywgICAgICAgICAgICAgICAgIDB4N2UgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMwLCAgICAgICAgICAgICAgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMSwgICAgICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMzLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNSwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzYsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM3LCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsICAgICAgICAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMxLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9EU01ERU1fQ1RMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFMTJfUEFHRV9SRUdJU1RFUiwgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfQ1JDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX0RMWV9DVFJMLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfQ0xTSF9ERUNBWV9DVFJMLCAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfUEEsICAgICAgICAgICAgICAgICAgICAgICAweDFjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX0VBUl9WX1BBLCAgICAgICAgICAgICAgICAgICAgICAgMHgzOSB9LAotCXsgV0NEOTM0WF9DRENfQ0xTSF9IUEhfVl9IRCwgICAgICAgICAgICAgICAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfRUFSX1ZfSEQsICAgICAgICAgICAgICAgICAgICAgICAweDBjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX0sxX01TQiwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfQ0xTSF9LMV9MU0IsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfSzJfTVNCLCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX0syX0xTQiwgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB9LAotCXsgV0NEOTM0WF9DRENfQ0xTSF9JRExFX0NUUkwsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfSURMRV9IUEgsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfRUFSLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQ0xTSF9URVNUMCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDEsICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTFNIX09WUl9WUkVGLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DVEwsICAgICAgICAgICAgICAgICAgICAweGIyIH0sCi0JeyBXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ0ZHMSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHhiMiB9LAotCXsgV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzEsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0NGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MWEgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwzLCAgICAgICAgICAgICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxLCAgICAgICAgICAgICAgICAgICAweGUwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEtfRVNUMiwgICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDMsICAgICAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSwgICAgICAgICAgICAgICAgICAweDJhIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIsICAgICAgICAgICAgICAgICAgMHg4NiB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzEsICAgICAgICAgICAgICAgICAgICAgIDB4NzAgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9UQUMyLCAgICAgICAgICAgICAgICAgICAgICAweDE4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMywgICAgICAgICAgICAgICAgICAgICAgMHgxOCB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzQsICAgICAgICAgICAgICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDEsICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMywgICAgICAgICAgICAgICAgIDB4NjQgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDQsICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfREVCVUcxLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTiwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQkFOLCAgICAgICAgICAgICAgICAgICAgICAgMHgwYyB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzJfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NUTDAsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwxLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfRklGT19DVEwsICAgICAgICAgICAgICAgICAgIDB4YTggfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRklGTywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMywgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzAsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRywgICAgICAgICAgICAgICAweDBmIH0sCi0JeyBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVMsICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwsICAgICAgIDB4MDQgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSwgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwgICAgICAgMHgwNCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DRkcxLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfRklGT19DVEwsICAgICAgICAgICAgICAgICAweGE4IH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRklGTywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NUTDAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DVEwxLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfRklGT19DVEwsICAgICAgICAgICAgICAgICAweGE4IH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCLCAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiwgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IsICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCLCAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRklGTywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfUkVGX0hRMF9FQ19SRUZfSFFfUEFUSF9DVEwsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX1JFRl9IUTBfRUNfUkVGX0hRX0NGRzAsICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9FQ19SRUZfSFExX0VDX1JFRl9IUV9QQVRIX0NUTCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfUkVGX0hRMV9FQ19SRUZfSFFfQ0ZHMCwgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMwX0NMS19SU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMF9DVEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzBfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMwX0ZJRk9fQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZJRk8sICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMxX0NMS19SU1RfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMV9DVEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzFfQ1RMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMxX0ZJRk9fQ1RMLCAgICAgICAgICAgICAgICAgICAgICAgMHhhOCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQiwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZJRk8sICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1BBR0UxM19QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMSwgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0VDX1JFRl9IUV9DRkcwLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNV9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYOF9DRkcwLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwLCAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMSwgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIsICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczLCAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMCwgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEsICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyLCAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMywgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMywgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLCAgICAgICAgIDB4MGMgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0FTUkNfU0hBUkVfQ09OVFJPTCwgICAgIDB4MGYgfSwKLQl7IFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9HRk1fQ09OVFJPTCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTCwgICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDAsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QxLCAgICAgICAweDRiIH0sCi0JeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQiwgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9NU0IsICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU1RBVFVTLCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCwgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCLCAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQiwgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQsICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTVNCX1JELCAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQsICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCwgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMV9DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNF9DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CN19DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwsICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwsICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMLCAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMLCAgICAgICAgICAgICAgIDB4NDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMLCAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IxX0NUTCwgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMl9DVEwsICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCwgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzEsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX1RPUF9DRkc3LCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX01TQiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9MVVQsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX01TQiwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9XUl9MU0IsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCwgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9SRF9MU0IsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9XUl9NU0IsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfTFVULCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9SRF9NU0IsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfRFNEMF9DRkcyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIgfSwKLQl7IFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiB9LAotCXsgV0NEOTM0WF9DRENfRFNEMF9DRkc1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfRFNEMV9DRkcxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyIH0sCi0JeyBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfRFNEMV9DRkc0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIgfSwKLQl7IFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9QQVRIX0NUTCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMCwgICAgICAgICAgICAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzEsICAgICAgICAgICAgICAgICAgICAweDNjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcyLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUEFHRTE0X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9QVUxTRV9TVVBSX0NUTCwgICAgICAgICAweDA2IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVElNRVIsICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0JXX1NXLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9USFJFU0gsICAgICAgICAgICAgICAgICAweGEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfQ1RSTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX1RJTUVSMiwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlcxLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMiwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzMsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlc0LCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXNSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMSwgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzIsICAgICAgICAgMHgwNyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlczLCAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXNCwgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzUsICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzEsICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlcyLCAgICAgICAweDA3IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMywgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzQsICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlc1LCAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMSwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzIsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlczLCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXNCwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzUsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9STUFYX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1JTl9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1BIX0RFVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0NMUiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfTUJfU1dfU1RBVEUsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX01BU1RfRElBR19TVEFURSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF83XzAsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMTVfOCwgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzIzXzE2LCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8zMV8yNCwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzlfMzIsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzQwXzQzLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9DTEtfUlNUX0NUTCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ1RMLCAgICAgICAgICAgICAgICAgICAgMHgwOSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1BVTFNFX1NVUFJfQ1RMLCAgICAgICAgIDB4MDYgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9USU1FUiwgICAgICAgICAgICAgICAgICAweDAxIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQldfU1csICAgICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1RIUkVTSCwgICAgICAgICAgICAgICAgIDB4YTAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9TVEFUVVMsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19DVFJMLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfVElNRVIyLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzEsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlcyLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMywgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzQsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlc1LCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlcxLCAgICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMiwgICAgICAgICAweDA3IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzMsICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlc0LCAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNSwgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMSwgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzIsICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlczLCAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXNCwgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzUsICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlcxLCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMiwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzMsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlc0LCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNSwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JNQVhfRElBRywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9STUlOX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUEhfREVULCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ0xSLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9NQl9TV19TVEFURSwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfTUFTVF9ESUFHX1NUQVRFLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzdfMCwgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8xNV84LCAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMjNfMTYsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzMxXzI0LCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8zOV8zMiwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfNDBfNDMsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0NMS19SU1RfQ1RMLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9DVEwsICAgICAgICAgICAgICAgICAgICAweDA5IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUFVMU0VfU1VQUl9DVEwsICAgICAgICAgMHgwNiB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1RJTUVSLCAgICAgICAgICAgICAgICAgIDB4MDEgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9CV19TVywgICAgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfVEhSRVNILCAgICAgICAgICAgICAgICAgMHhhMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1NUQVRVUywgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0NUUkwsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19USU1FUjIsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzIsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlczLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXNCwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzUsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzEsICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcyLCAgICAgICAgIDB4MDcgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlUX0JXMywgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzQsICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc1LCAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlcxLCAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMiwgICAgICAgMHgwNyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzMsICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlc0LCAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNSwgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzEsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlcyLCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMywgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzQsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlc1LCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUk1BWF9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JNSU5fRElBRywgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9QSF9ERVQsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DTFIsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX01CX1NXX1NUQVRFLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQVNUX0RJQUdfU1RBVEUsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfN18wLCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzE1XzgsICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8yM18xNiwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMzFfMjQsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzM5XzMyLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF80MF80MywgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfQ0xLX1JTVF9DVEwsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NUTCwgICAgICAgICAgICAgICAgICAgIDB4MDkgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9QVUxTRV9TVVBSX0NUTCwgICAgICAgICAweDA2IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVElNRVIsICAgICAgICAgICAgICAgICAgMHgwMSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0JXX1NXLCAgICAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9USFJFU0gsICAgICAgICAgICAgICAgICAweGEwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfQ1RSTCwgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX1RJTUVSMiwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlcxLCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMiwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzMsICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlc0LCAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXNSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMSwgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzIsICAgICAgICAgMHgwNyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlczLCAgICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXNCwgICAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzUsICAgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzEsICAgICAgIDB4MDggfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlcyLCAgICAgICAweDA3IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMywgICAgICAgMHgwNSB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzQsICAgICAgIDB4MDUgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlc1LCAgICAgICAweDA1IH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMSwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzIsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlczLCAgICAgICAgICAweDAzIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXNCwgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzUsICAgICAgICAgIDB4MDMgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9STUFYX0RJQUcsICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1JTl9ESUFHLCAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1BIX0RFVCwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0NMUiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfTUJfU1dfU1RBVEUsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX01BU1RfRElBR19TVEFURSwgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF83XzAsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMTVfOCwgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzIzXzE2LCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8zMV8yNCwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzlfMzIsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzQwXzQzLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfUEFHRTE1X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9TUExJTkVfU1JDMF9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCwgICAgICAgICAgICAgICAweDIwIH0sCi0JeyBXQ0Q5MzRYX1NQTElORV9TUkMxX1NUQVRVUywgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wLCAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfU1BMSU5FX1NSQzJfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAsICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9TUExJTkVfU1JDM19TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMCwgICAgICAgICAgICAgICAweDExIH0sCi0JeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzEsICAgICAgICAgICAgICAgMHgyMCB9LAotCXsgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcyLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMywgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzAsICAgICAgICAgICAgICAgMHgxMSB9LAotCXsgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcxLCAgICAgICAgICAgICAgIDB4MjAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMiwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzMsICAgICAgICAgICAgICAgMHgwOCB9LAotCXsgV0NEOTM0WF9DRENfREVCVUdfU1BMSU5FX1NSQ19ERUJVR19DRkcwLCAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX1NQTElORV9TUkNfREVCVUdfQ0ZHMSwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NEQ19ERUJVR19SQ19SRV9BU1JDX0RFQlVHX0NGRzAsICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DRENfREVCVUdfQU5DMF9SQzBfRklGT19DVEwsICAgICAgICAgICAgIDB4NGMgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX0FOQzBfUkMxX0ZJRk9fQ1RMLCAgICAgICAgICAgICAweDRjIH0sCi0JeyBXQ0Q5MzRYX0NEQ19ERUJVR19BTkMxX1JDMF9GSUZPX0NUTCwgICAgICAgICAgICAgMHg0YyB9LAotCXsgV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzFfRklGT19DVEwsICAgICAgICAgICAgIDB4NGMgfSwKLQl7IFdDRDkzNFhfQ0RDX0RFQlVHX0FOQ19SQ19SU1RfREJHX0NOVFIsICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1BBR0U4MF9QQUdFX1JFR0lTVEVSLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzEsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8yLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMywgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzAsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8xLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMiwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzMsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8wLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMSwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzIsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8zLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX0FDQ0VTU19DRkcsICAgICAgICAgICAgICAgICAgICAweDBmIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfU1RBVFVTLCAgICAgICAgICAgICAgICAgMHgwMyB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX0NYX1ZERCwgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19DWF9WREQsICAgICAgICAgICAgICAgICAgICAweDVjIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERCwgICAgICAgICAgICAgICAgICAgMHg0MCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX01YX1ZERCwgICAgICAgICAgICAgICAgICAgIDB4YjQgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19NWF9WREQsICAgICAgICAgICAgICAgICAgICAweGI0IH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01YX1ZERCwgICAgICAgICAgICAgICAgICAgMHhhMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NSU5fQ1hfVkRELCAgICAgICAgICAgICAgIDB4MjggfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX01BWF9TVlMyX1NURVAsICAgICAgICAgICAgICAgICAweDA4IH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9DVEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9DT0RFQ19DUFJfU1dfTU9ERUNITkdfU1RBVFVTLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVJULCAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX0NPREVDX0NQUl9DUFJfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9QQUdFMTI4X1BBR0VfUkVHSVNURVIsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9CSVNUX01PREVfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fUkZfUEFfT05fUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0lOVFIxX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9JTlRSMl9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fU1dSX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX1NXUl9DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9JMlNfMl9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fU0xJTUJVU19EQVRBMV9QSU5DRkcsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9TTElNQlVTX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fSTJDX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0kyQ19EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9JMlNfMF9SWF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fSTJTXzBfVFhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0kyU18wX1NDS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9JMlNfMF9XU19QSU5DRkcsICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fSTJTXzFfUlhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0kyU18xX1RYX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9JMlNfMV9TQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fSTJTXzFfV1NfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0RNSUMxX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9ETUlDMV9EQVRBX1BJTkNGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fRE1JQzJfQ0xLX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0RNSUMyX0RBVEFfUElOQ0ZHLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9ETUlDM19DTEtfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcsICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0pUQ0tfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9HUElPMV9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fR1BJTzJfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0dQSU8zX1BJTkNGRywgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9HUElPNF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fU1BJX1NfQ1NOX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX1NQSV9TX0NMS19QSU5DRkcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9TUElfU19ET1VUX1BJTkNGRywgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fU1BJX1NfRElOX1BJTkNGRywgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0JBX05fUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVExNTV9HUElPMF9QSU5DRkcsICAgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RMTU1fSTJTXzJfUlhfUElOQ0ZHLCAgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9UTE1NX0kyU18yX1dTX1BJTkNGRywgICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzAsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8xLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMiwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzMsICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV80LCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzIsICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfNCwgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0RSVkNUTF8wLCAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMSwgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fU1RBVFVTLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEsICAgICAgICAgICAgICAgMHgxMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yLCAgICAgICAgICAgICAgIDB4NjAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19NRU1fQ1RSTCwgICAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfQlVTX1NFTCwgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0pUQUcsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8xLCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fMiwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzMsICAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl80LCAgICAgICAgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fNSwgICAgICAgICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX0FOQV9EVEVTVF9ESVIsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMCwgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzEsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8yLCAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMywgICAgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzQsICAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1NZU01FTV9DVFJMLCAgICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19TT0NfU1dfUFdSX1NFUV9ERUxBWSwgICAgICAgICAweDAwIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fTE9XLCAgICAgICAgICAgICAgICAgMHg5NiB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0hJR0gsICAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0xPVywgICAgICAgICAgICAweDUzIH0sCi0JeyBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9TVlNfU1ZTMl9ISUdILCAgICAgICAgICAgMHgwMCB9LAotCXsgV0NEOTM0WF9URVNUX0RFQlVHX1NQSV9TTEFWRV9DSEFSLCAgICAgICAgICAgICAgIDB4MDAgfSwKLQl7IFdDRDkzNFhfVEVTVF9ERUJVR19DT0RFQ19ESUFHUywgICAgICAgICAgICAgICAgICAweDAwIH0sCi19OwotCi0vKgotICogd2NkOTM0eF9yZWdtYXBfcmVnaXN0ZXJfcGF0Y2g6IFVwZGF0ZSByZWdpc3RlciBkZWZhdWx0cyBiYXNlZCBvbiB2ZXJzaW9uCi0gKiBAcmVnbWFwOiBoYW5kbGUgdG8gd2NkOXh4eCByZWdtYXAKLSAqIEB2ZXJzaW9uOiB3Y2Q5MzR4IHZlcnNpb24KLSAqCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIG9yIDAgZm9yIHN1Y2Nlc3MKLSAqLwotaW50IHdjZDkzNHhfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50IHJldmlzaW9uKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoIXJlZ21hcCkgewotCQlwcl9lcnIoIiVzOiByZWdtYXAgc3RydWN0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChyZXZpc2lvbikgewotCWNhc2UgVEFWSUxfVkVSU0lPTl8xXzE6Ci0JY2FzZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8xOgotCWNhc2UgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMToKLQkJcmVnY2FjaGVfY2FjaGVfb25seShyZWdtYXAsIHRydWUpOwotCQlyYyA9IHJlZ21hcF9tdWx0aV9yZWdfd3JpdGUocmVnbWFwLCB3Y2Q5MzR4XzFfMV9kZWZhdWx0cywKLQkJCQkJICAgIEFSUkFZX1NJWkUod2NkOTM0eF8xXzFfZGVmYXVsdHMpKTsKLQkJcmVnY2FjaGVfY2FjaGVfb25seShyZWdtYXAsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5MzR4X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaCk7Ci0KLXN0YXRpYyBib29sIHdjZDkzNHhfaXNfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQotewotCXU4IHBnX251bSwgcmVnX29mZnNldDsKLQljb25zdCB1OCAqcmVnX3RibCA9IE5VTEw7Ci0KLQkvKgotCSAqIEdldCB0aGUgcGFnZSBudW1iZXIgZnJvbSBNU0Igb2YgY29kZWMgcmVnaXN0ZXIuIElmIGl0cyAweDgwLCBhc3NpZ24KLQkgKiB0aGUgY29ycmVzcG9uZGluZyBwYWdlIGluZGV4IFBBR0VfMHg4MC4KLQkgKi8KLQlwZ19udW0gPSByZWcgPj4gMHg4OwotCWlmIChwZ19udW0gPT0gMHg4MCkKLQkJcGdfbnVtID0gV0NEOTM0WF9QQUdFXzBYODA7Ci0JZWxzZSBpZiAocGdfbnVtID09IDB4NTApCi0JCXBnX251bSA9IFdDRDkzNFhfUEFHRV8weDUwOwotCWVsc2UgaWYgKHBnX251bSA+IDB4RikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmVnX3RibCA9IHdjZDkzNHhfcmVnW3BnX251bV07Ci0JcmVnX29mZnNldCA9IHJlZyAmIDB4RkY7Ci0KLQlpZiAocmVnX3RibCAmJiByZWdfdGJsW3JlZ19vZmZzZXRdKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgd2NkOTM0eF9pc192b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JdTggcGdfbnVtLCByZWdfb2Zmc2V0OwotCWNvbnN0IHU4ICpyZWdfdGJsID0gTlVMTDsKLQotCXBnX251bSA9IHJlZyA+PiAweDg7Ci0JaWYgKHBnX251bSA9PSAweDgwKQotCQlwZ19udW0gPSBXQ0Q5MzRYX1BBR0VfMFg4MDsKLQllbHNlIGlmIChwZ19udW0gPT0gMHg1MCkKLQkJcGdfbnVtID0gV0NEOTM0WF9QQUdFXzB4NTA7Ci0JZWxzZSBpZiAocGdfbnVtID4gMHhGKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZWdfdGJsID0gd2NkOTM0eF9yZWdbcGdfbnVtXTsKLQlyZWdfb2Zmc2V0ID0gcmVnICYgMHhGRjsKLQotCWlmIChyZWdfdGJsICYmIHJlZ190YmxbcmVnX29mZnNldF0gPT0gV0NEOTM0WF9SRUFEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIElJUiBDb2VmZiByZWdpc3RlcnMgYXJlIG5vdCBjYWNoZWFibGUgKi8KLQlpZiAoKHJlZyA+PSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCkgJiYKLQkgICAgKHJlZyA8PSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IyX0NUTCkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKChyZWcgPj0gV0NEOTM0WF9DRENfQU5DMF9JSVJfQ09FRkZfMV9DVEwpICYmCi0JICAgIChyZWcgPD0gV0NEOTM0WF9DRENfQU5DMF9GQl9HQUlOX0NUTCkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKChyZWcgPj0gV0NEOTM0WF9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwpICYmCi0JICAgIChyZWcgPD0gV0NEOTM0WF9DRENfQU5DMV9GQl9HQUlOX0NUTCkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKChyZWcgPj0gV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wKSAmJgotCSAgICAocmVnIDw9IFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMykpCi0JCXJldHVybiB0cnVlOwotCi0JLyoKLQkgKiBOZWVkIHRvIG1hcmsgdm9sYXRpbGUgZm9yIHJlZ2lzdGVycyB0aGF0IGFyZSB3cml0YWJsZSBidXQKLQkgKiBvbmx5IGZldyBiaXRzIGFyZSByZWFkLW9ubHkKLQkgKi8KLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTDoKLQljYXNlIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wOgotCWNhc2UgV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzE6Ci0JY2FzZSBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTDoKLQljYXNlIFdDRDkzNFhfQ1BFX1NTX1NUQVRVUzoKLQljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEw6Ci0JY2FzZSBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQOgotCWNhc2UgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfU1RBUlRVUDoKLQljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTDoKLQljYXNlIFdDRDkzNFhfQU5BX01CSENfTUVDSDoKLQljYXNlIFdDRDkzNFhfQU5BX01CSENfRUxFQ1Q6Ci0JY2FzZSBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQ6Ci0JY2FzZSBXQ0Q5MzRYX0FOQV9NSUNCMjoKLQljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRzoKLQljYXNlIFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRzoKLQljYXNlIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMOgotCWNhc2UgV0NEOTM0WF9BTkFfQklBUzoKLQljYXNlIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMOgotCWNhc2UgV0NEOTM0WF9BTkFfUkNPOgotCWNhc2UgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTDoKLQljYXNlIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFOgotCWNhc2UgV0NEOTM0WF9CSUFTX1ZCR19GSU5FX0FESjoKLQljYXNlIFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19DWF9WREQ6Ci0JY2FzZSBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERDoKLQljYXNlIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTDoKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3Y2Q5MzR4X3JlZ21hcF9jb25maWcgPSB7Ci0JLnJlZ19iaXRzID0gMTYsCi0JLnZhbF9iaXRzID0gOCwKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKLQkucmVnX2RlZmF1bHRzID0gd2NkOTM0eF9kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod2NkOTM0eF9kZWZhdWx0cyksCi0JLm1heF9yZWdpc3RlciA9IFdDRDkzNFhfTUFYX1JFR0lTVEVSLAotCS52b2xhdGlsZV9yZWcgPSB3Y2Q5MzR4X2lzX3ZvbGF0aWxlX3JlZ2lzdGVyLAotCS5yZWFkYWJsZV9yZWcgPSB3Y2Q5MzR4X2lzX3JlYWRhYmxlX3JlZ2lzdGVyLAotCS5jYW5fbXVsdGlfd3JpdGUgPSB0cnVlLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDkzNHgtdGFibGVzLmMgYi9kcml2ZXJzL21mZC93Y2Q5MzR4LXRhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk2M2QwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDkzNHgtdGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+Ci0KLSNkZWZpbmUgV0NEOTM0WF9SRUcocmVnKSAgKChyZWcpICYgMHhGRikKLQotY29uc3QgdTggd2NkOTM0eF9wYWdlMF9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMF9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfUlBNX0NMS19CWVBBU1MpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLMl9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fSTJTX0RTRF9DTEtfU0VMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUzKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQwKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQzKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDQpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ2KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDcpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUOCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ5KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEwKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEyKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEzKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE1KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08pXSA9Ci0JCQkJCQkJCVdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8zKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTkFfV0FJVF9TVEFURV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX1NMTlFfV0FJVF9TVEFURV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19BQ1RJVkUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9BTFRfRlVOQ19FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0dQSU9fQ1RMX09FKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfREFUQSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlgwX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1JYMV9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9SWDJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlgzX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1JYNF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9SWDVfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfUlg2X0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1JYN19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDBfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMV9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDNfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNF9JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDZfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYN19JTlBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDlfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTBfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTNfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTRfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTVfSU5QX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDBfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMV8wX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDFfMV9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfMF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfMV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfMl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfM19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9EQVRBX0hVQl9JMlNfQ0xLU1JDX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU19DT01NT05fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfVERNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RBVEFfSFVCX0kyU19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfUkRNQV9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfUkRNQV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1JETUFfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19SRE1BXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19SRE1BXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfUkRNQV9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1JETUFfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfUkRNQV80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1JETUE0X1BSVF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfUkRNQV9TQlRYMF83X0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9SRE1BX1NCVFg4XzExX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUFfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQV9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUFfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQTBfUFJUX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RNQV9XRE1BM19QUlRfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRE1BX1dETUE0X1BSVDBfM19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ETUFfV0RNQTRfUFJUNF83X0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotfTsKLQotY29uc3QgdTggd2NkOTM0eF9wYWdlMV9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMV9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF85KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9MX1ZBTF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfTF9WQUxfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0RTTV9GUkFDX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18wKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18zKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF85KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9MX1ZBTF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfTF9WQUxfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0RTTV9GUkFDX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9EU01fRlJBQ19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfRkxMX01PREUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18wKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18zKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfTF9WQUxfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfTF9WQUxfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRFNNX0ZSQUNfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRFNNX0ZSQUNfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfRkxMX01PREUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1RBVFVTXzApXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1RBVFVTXzEpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1RBVFVTXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TQl9GTExfU1RBVFVTXzMpXSA9IFdDRDkzNFhfUkVBRCwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTJfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTJfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19DUEVfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFRkxMX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQX09WRVJSSURFKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8yKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl81KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9EUkFNMV9TSFVURE9XTildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfT1ZFUlJJREVfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX09WRVJSSURFX0NUTDEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19VU19CVUZfSU5UX1BFUklPRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19DUEFSTUFEX0JVRlJEWV9JTlRfUEVSSU9EKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1ZBX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19VU19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfTUFEX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19ETUlDMF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfRE1JQzFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX0RNSUMyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19ETUlDX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19DUEFSX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19CQUNLVVBfSU5UKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfQ1BFX09DRF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzFBKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMUIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBBKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMEIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18xQSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzFCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8wQSldID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBCKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMUEpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8xQildID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9QVFIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF83KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfOCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU09DX01BRF9CRUFDT05fSUlSX0NUTF9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TT0NfTUFEX0lOUF9TRUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTRfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTRfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DTFJfQ09NTUlUKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMwKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzEpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMzKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMCldID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIxKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjIpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMyldID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjJfTUFTSzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX1BJTjJfU1RBVFVTMyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfUElOMl9DTEVBUjMpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9NQVNLMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfTUFTSzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX1NUQVRVUzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX1NUQVRVUzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX0NMRUFSMildID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX0NMRUFSMyldID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0xFVkVMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfTEVWRUwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9MRVZFTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9JTlRSX0xFVkVMMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQllQQVNTMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQllQQVNTMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQllQQVNTMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQllQQVNTMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfU0VUMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfU0VUMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfU0VUMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfU0VUMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19NQVNLKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19DTEVBUildID0gV0NEOTM0WF9XUklURSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTVfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTVfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0RFVklDRSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1JFVklTSU9OKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSF9DT01NQU5EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfTlVNQkVSX09GX0JZVEVfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfTlVNQkVSX09GX0JZVEVfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfTUFTVEVSX0FERFJFU1NfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfTUFTVEVSX0FERFJFU1NfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU0xBVkVfQUREUkVTU19NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TTEFWRV9BRERSRVNTX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMF9JTlRFUlJVUFRfTVNCKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19USU1FUjBfSU5URVJSVVBUX0xTQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfVElNRVIxX0lOVEVSUlVQVF9NU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMV9JTlRFUlJVUFRfTFNCKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19USU1FUjJfSU5URVJSVVBUX01TQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfVElNRVIyX0lOVEVSUlVQVF9MU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0NPTU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfRlJBTUVfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDNfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TV19FVkVOVF9SRCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NXX0VWRU5UX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fU0FNUExJTkdfRlJFUSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WRVJTSU9OX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZFUlNJT05fU0VMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEFfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hBX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfUkFNX0NOVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CQU5LKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV84KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9CKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0MpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9FKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0YpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzkpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0EpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0MpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0UpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0YpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19UT1BfQ1RSTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19UT1BfQ1RSTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19QRE1fQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX1BETV9NVVRFX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX1NUQVRVUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfRlMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX0lOX1NFTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0dQT1VUX0VOQUJMRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0dQT1VUX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfTUFTSyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9DTFIpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSVBfVEVTVElORyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05UX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRfTFNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0swKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0sxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0syKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0szKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0s0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzApXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMyKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTNCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIwKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIxKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIyKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIzKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFI0KV0gPSBXQ0Q5MzRYX1dSSVRFLAotfTsKLQotY29uc3QgdTggd2NkOTM0eF9wYWdlNl9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9CSUFTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX1JDTyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9QQUdFNl9TUEFSRTIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfUEFHRTZfU1BBUkUzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0JVQ0tfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0JVQ0tfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX0hQSCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9FQVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTE9fMV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01BRF9TRVRVUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9BTUlDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9BTUlDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9BTUlDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9BTUlDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX1pERVQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8yKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE4wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfQlROMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0JUTjIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE4zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfQlRONCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NQkhDX0JUTjUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9BTkFfTUJIQ19CVE42KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01CSENfQlRONyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NSUNCMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NSUNCMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0FOQV9NSUNCMl9SQU1QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01JQ0IzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX01JQ0I0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX1ZCQURDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQklBU19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CSUFTX1ZCR19GSU5FX0FESildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DVFJMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ1RSTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DQUxfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DQUxfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19URVNUX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ0FMX09VVF8xKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTF9PVVRfMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JDT19DQUxfT1VUXzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SQ09fQ0FMX09VVF80KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUkNPX0NBTF9PVVRfNSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTU9ERV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19NT0RFXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX01PREVfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTU9ERV80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19WQ0xfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fVkNMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX1ZDTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0NMXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NDTF85KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQ0xfMTApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0ZJTFRFUl8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19GSUxURVJfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fRFJJVkVSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0RSSVZFUl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19EUklWRVJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfRVhUXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX0NBTF9DT0RFX0VYVF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19DQUxfQ09ERV9PVVRfMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfT1VUXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX1RFU1RfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fVEVTVF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19DVExfQ0xLKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19DVExfQU5BKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19DVExfU1BBUkVfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfQ1RMX1NQQVJFXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX0NUTF9CQ1MpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX1NUQVRVU19TUEFSRV8xKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19URVNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX1NVQkJMT0NLX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfSUJJQVNfRkUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9WQkFEQ19CSUFTX0FEQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX0ZFX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9WQkFEQ19BRENfUkVGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfQURDX0lPKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVkJBRENfQURDX1NBUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX0RFQlVHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTERPSF9NT0RFKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTERPSF9CSUFTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTERPSF9TVEJfTE9BRFMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9MRE9IX1NMT1dSQU1QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCM19URVNUX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfQ09NX0FEQ19WQ00pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9DT01fQklBU19BVEVTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9BRENfSU5UMV9JQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9BRENfSU5UMl9JQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RBUlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RPUF85UDZNKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX1NUT1BfMTJQMjg4TSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX1RFU1RfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8xXzJfQURDX0lCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfMV8yX0FURVNUX1JFRkNUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9URVNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9URVNUX0JMS19FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9UWEZFX0NMS0RJVildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9TQVIxX0VSUildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzFfMl9TQVIyX0VSUildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9URVNUX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfM180X0FEQ19JQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RYXzNfNF9BVEVTVF9SRUZDVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfVEVTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfVEVTVF9CTEtfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfVFhGRV9DTEtESVYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfU0FSMV9FUlIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UWF8zXzRfU0FSMl9FUlIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfTU9ERV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX01PREVfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9NT0RFXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQ1RSTF9WQ0xfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9DVFJMX1ZDTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMQVNTSF9CVUNLX1RNVVhfQV9EKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEFTU0hfU1BBUkUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF82KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzgpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF85KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRkxZQkFDS19DVFJMXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9GTFlCQUNLX1RFU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQVVYX1NXX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX1BBX0FVWF9JTl9DT05OKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfVElNRVJfRElWKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfT0NQX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX09DUF9DT1VOVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRUFSX0RBQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRUFSX0FNUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfSFBIX0xETyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfSFBIX1BBKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfSFBIX1JEQUNfTERPKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19IUEhfQ05QMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfSFBIX0xPV1BPV0VSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19ESUZGTE9fUEEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19SRUYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19MRE8pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX1NFTE9fREFDX1BBKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfQklBU19CVUNLX1JTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfQlVDS19WUkVGX0VSUkFNUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9FUlJBTVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9SWF9CSUFTX0ZMWUJfQlVGRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9NSURfUlNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0xfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0NOUF9FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0NOUF9XR19USU1FKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX09DUF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfQVVUT19DSE9QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0NIT1BfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1BBX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUEFfQ1RMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9MX0VOKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0xfVEVTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9MX0FURVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUl9URVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JfQVRFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfUkRBQ19DTEtfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JEQUNfTERPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SREFDX0NIT1BfQ0xLX0xQX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SRUZCVUZGX1VIUUFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX0xfREFDX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9SX0RBQ19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfRU5fUkVHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUFSX0NNQlVGRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VBUl9JQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUFSX0VOX0RCR19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfQ05QKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUFSX0RBQ19DVExfQVRFU1QpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQVJfU1RBVFVTX1JFRyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VBUl9FQVJfTUlTQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fTUlTQyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fTE8yX0NPTVBBTkRFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fTE8xX0NPTVBBTkRFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fQ09NTU9OKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19CWVBBU1NfRU4pXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ESUZGX0xPX0NOUCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fQ09SRV9PVVRfUFJPRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fTERPX09VVF9QUk9HKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19DT01fU1dDQVBfUkVGQlVGX0ZSRVEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fQ09NX1BBX0ZSRVEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9ESUZGX0xPX1JFU0VSVkVEX1JFRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0RJRkZfTE9fTE8xX1NUQVRVU18xKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRElGRl9MT19MTzFfU1RBVFVTXzIpXSA9IFdDRDkzNFhfUkVBRCwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTdfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQU5BX05FV19QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9FTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX0xET19DT05GSUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9MRE9fT0NQX0NPTkZJRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1RYX0xET19DT05GSUcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9UWF9EUlZfQ09ORklHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfUlhfQ09ORklHXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0FOQV9SWF9DT05GSUdfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9FTkFCTEVTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9BTkFfUExMX1BSRVNFVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX1BMTF9FTkFCTEVTKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19QTExfUFJFU0VUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19QTExfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfWE9fUFJHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19YT19DQVBfWFRQKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19YT19DQVBfWFRNKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfQlNUX0VOX0RMWSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0NUUkxfSUxJTSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX1ZPVVRfU0VUVElORyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX1NUQVJUVVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19FTEVDVF9SRU1fQ0xBTVBfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19DVExfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0NUTF8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfUExVR19ERVRFQ1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9SQU1QX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0ZTTV9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19BRENfUkVTVUxUKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVFhfTkVXX0FNSUNfNF81X1NFTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX05FV19BRENfTU9ERSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX05FV19BRENfRE9VVE1TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1ZCQURDX05FV19BRENfRE9VVExTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX1ZSRUZfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19PVkVSUklERV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfTUlTQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9NSVNDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19CSUFTX0xPSElGSSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19CSUFTX1VMUCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19MRE9fTFApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19URVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fREVCVUdfMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fREVCVUdfMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9UWF9MRE9fVEVTVCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9UWF9EUlZfVEVTVCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfREVCVUdfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfREVCVUdfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfQ0xLX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9QT1NUX0RJVl9SRUcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9QT1NUX0RJVl9SRUcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9SRUZfRElWX1JFRzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1JFRl9ESVZfUkVHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfRklMVEVSX1JFRzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0ZJTFRFUl9SRUcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9MX1ZBTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX01fVkFMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTl9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9URVNUX1JFRzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BGRF9DUF9EU01fUFJPRyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVkNPX1BST0cpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1RFU1RfUkVHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTERPX0xPQ0tfQ0ZHKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9ESUdfTE9DS19ERVRfQ0ZHKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QT1NUX0RJVl9SRUcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfUE9TVF9ESVZfUkVHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1JFRl9ESVZfUkVHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1JFRl9ESVZfUkVHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0ZJTFRFUl9SRUcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfRklMVEVSX1JFRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTF9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTV9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTl9WQUwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9URVNUX1JFRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9QRkRfQ1BfRFNNX1BST0cpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DTEtfU1lTX0lOVF9WQ09fUFJPRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0xET19MT0NLX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0RJR19MT0NLX0RFVF9DRkcpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NMS19TWVNfSU5UX1hPX1RFU1QxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0xLX1NZU19JTlRfWE9fVEVTVDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfVkNPTVBfSFlTVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9WTE9PUF9GSUxURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JREVMVEEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JTElNX1NUQVJUVVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9NSU5fT05USU1FKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfTUFYX09OVElNRSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX1RJTUlORyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9UTVVYX0FfRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9TV19EUlZfQ05UTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0JPT1NUX0lOVF9TUEFSRTEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9CT09TVF9JTlRfU1BBUkUyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1NQQVJFXzEpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfREVCVUdfVk9VVF9TRVRUSU5HX0EpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfRCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfSU5DX1dBSVQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0lCTEVFRF9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19DUFJPVlJfVEVTVCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfQ1RMX0EpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9DVExfRCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX1RJTUVPVVRfUEVSSU9EKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURPX05FV19JTlRfSElHSF9BQ0NVX01PREVfU0VMMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lET19ORVdfSU5UX0hJR0hfQUNDVV9NT0RFX1NFTDIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX0hQRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX1JFRildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX0NPTVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NQkhDX05FV19JTlRfU1BBUkVfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCi19OwotCi1jb25zdCB1OCB3Y2Q5MzR4X3BhZ2UxMF9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMTBfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9NT0RFXzFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8yX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0ZGX1NISUZUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRkJfU0hJRlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9MUEZfRkZfQV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9MUEZfRkZfQl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9MUEZfRkJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfU01MUEZfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRENGTFRfU0hJRlRfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX0ZGX0FfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9GRl9CX0dBSU5fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRkJfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9SQ19DT01NT05fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfRklGT19DT01NT05fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfUkMwX1NUQVRVU19GTUlOX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNSU5fQ05UUildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMwX1JDMF9TVEFUVVNfRk1BWF9DTlRSKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzBfUkMxX1NUQVRVU19GTUFYX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMF9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0NMS19SRVNFVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9NT0RFXzFfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfTU9ERV8yX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0ZGX1NISUZUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRkJfU0hJRlQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9MUEZfRkZfQV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9MUEZfRkZfQl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9MUEZfRkJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfU01MUEZfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0FEQVBUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9DT0VGRl8xX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9DT0VGRl8yX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9GRl9CX0dBSU5fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRkJfR0FJTl9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9SQ19DT01NT05fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfRklGT19DT01NT05fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUlOX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9SQzFfU1RBVFVTX0ZNSU5fQ05UUildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19BTkMxX1JDMF9TVEFUVVNfRk1BWF9DTlRSKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0FOQzFfUkMxX1NUQVRVU19GTUFYX0NOVFIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQU5DMV9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF8xOTJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF8xOTJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF8xOTJfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF8xOTJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfMTkyX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTExX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxMV9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw2KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDYpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw2KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDYpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9WT0xfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0RTTURFTV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfVk9MX01JWF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzYpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9EU01ERU1fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM2KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfRFNNREVNX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzUpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM3KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0RTTURFTV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTEyX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxMl9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfQ1JDKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfRExZX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9ERUNBWV9DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfUEEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9FQVJfVl9QQSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0hQSF9WX0hEKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfRUFSX1ZfSEQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9LMV9NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9LMV9MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9LMl9NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9LMl9MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9JRExFX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9JRExFX0hQSCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfRUFSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xTSF9URVNUMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTFNIX09WUl9WUkVGKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QzKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBENCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfREVCVUcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRF9NT04pXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVkJBVF9WQkFUX0JBTildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ0xLX1JTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX0ZJRk9fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GSUZPKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1BWF9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1BWF9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNSU5fQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNQVhfQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNQVhfQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzEpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1dSX0FIQl9CUklER0VfQUNDRVNTX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMwX1NUX1NSQ19QQVRIX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DRkcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DTEtfUlNUX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NUTDApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DVEwxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19SRUZfSFEwX0VDX1JFRl9IUV9QQVRIX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfUkVGX0hRMF9FQ19SRUZfSFFfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX1JFRl9IUTFfRUNfUkVGX0hRX1BBVEhfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19SRUZfSFExX0VDX1JFRl9IUV9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfQ0xLX1JTVF9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9DVEwwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfQ1RMMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMwX0ZJRk9fQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRklGTyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX0NMS19SU1RfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfQ1RMMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX0NUTDEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMV9GSUZPX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZJRk8pXSA9IFdDRDkzNFhfUkVBRCwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTEzX3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxM19QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSU5QX01VWF9FQ19SRUZfSFFfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzApXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0RTRF9DT05UUk9MKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0FTUkNfU0hBUkVfQ09OVFJPTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9HRk1fQ09OVFJPTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTVNCKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0NUUkwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0IpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9NU0JfUkQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTF9SRVBFQVRfUEFUKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNl9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I3X0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fVElNRVJfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX1BBVEhfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNF9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjZfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CN19DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX1RJTUVSX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjFfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMl9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHNyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX0xVVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX01TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1dSX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1dSX01TQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX0xVVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1JEX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX1JEX01TQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9XUl9MU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9SRF9MU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9XUl9NU0IpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfTFVUKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9SRF9NU0IpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QwX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMF9DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QwX0NGRzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMF9DRkc0KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHNSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QxX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMV9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19EU0QxX0NGRzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfRFNEMV9DRkc1KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX1BBVEhfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcyKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLX07Ci0KLWNvbnN0IHU4IHdjZDkzNHhfcGFnZTE0X3JlZ19hY2Nlc3NbV0NEOTM0WF9QQUdFX1NJWkVdID0gewotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1BBR0UxNF9QQUdFX1JFR0lTVEVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9DTEtfUlNUX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1BVTFNFX1NVUFJfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1RJTUVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9CV19TVyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVEhSRVNIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19USU1FUjIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzUpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlc1KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JNQVhfRElBRyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1JTl9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9QSF9ERVQpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfQ0xSKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfTUJfU1dfU1RBVEUpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX01BU1RfRElBR19TVEFURSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfN18wKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8xNV84KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8yM18xNildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzFfMjQpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzM5XzMyKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF80MF80MyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ0xLX1JTVF9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9QVUxTRV9TVVBSX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9USU1FUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQldfU1cpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1RIUkVTSCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0NUUkwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfVElNRVIyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzUpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzUpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlc1KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9STUFYX0RJQUcpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JNSU5fRElBRyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUEhfREVUKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0NMUildID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX01CX1NXX1NUQVRFKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9NQVNUX0RJQUdfU1RBVEUpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzdfMCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMTVfOCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMjNfMTYpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzMxXzI0KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8zOV8zMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfNDBfNDMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0NMS19SU1RfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUFVMU0VfU1VQUl9DVEwpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfVElNRVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0JXX1NXKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9USFJFU0gpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX1RJTUVSMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlc1KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc1KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzEpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlczKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzQpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzUpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUk1BWF9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9STUlOX0RJQUcpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1BIX0RFVCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DTFIpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQl9TV19TVEFURSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfTUFTVF9ESUFHX1NUQVRFKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF83XzApXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzE1XzgpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzIzXzE2KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8zMV8yNCldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMzlfMzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzQwXzQzKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9DTEtfUlNUX0NUTCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1BVTFNFX1NVUFJfQ1RMKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1RJTUVSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9CV19TVyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVEhSRVNIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19USU1FUjIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXNSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzIpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlc0KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzUpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlcyKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzMpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlc1KV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JNQVhfRElBRyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1JTl9ESUFHKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9QSF9ERVQpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfQ0xSKV0gPSBXQ0Q5MzRYX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfTUJfU1dfU1RBVEUpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX01BU1RfRElBR19TVEFURSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfN18wKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8xNV84KV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8yM18xNildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzFfMjQpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzM5XzMyKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF80MF80MyldID0gV0NEOTM0WF9SRUFELAotfTsKLQotY29uc3QgdTggd2NkOTM0eF9wYWdlMTVfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTE1X1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1BMSU5FX1NSQzBfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NQTElORV9TUkMxX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDMl9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfU1BMSU5FX1NSQzNfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcyKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcxKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfU1BMSU5FX1NSQ19ERUJVR19DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfU1BMSU5FX1NSQ19ERUJVR19DRkcxKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfUkNfUkVfQVNSQ19ERUJVR19DRkcwKV0gPQotCQkJCQkJCVdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfQU5DMF9SQzBfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfQU5DMF9SQzFfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzBfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzFfRklGT19DVEwpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DRENfREVCVUdfQU5DX1JDX1JTVF9EQkdfQ05UUildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi19OwotCi1jb25zdCB1OCB3Y2Q5MzR4X3BhZ2VfMHg1MF9yZWdfYWNjZXNzW1dDRDkzNFhfUEFHRV9TSVpFXSA9IHsKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFODBfUEFHRV9SRUdJU1RFUildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzApXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8xKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMildID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQUNDRVNTX0NGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX05PTV9DWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9OT01fTVhfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19NWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NSU5fQ1hfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX01BWF9TVlMyX1NURVApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQ1RMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TV19NT0RFQ0hOR19TVEFSVCldID0gV0NEOTM0WF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQ1BSX1NUQVRVUyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotfTsKLQotY29uc3QgdTggd2NkOTM0eF9wYWdlXzB4ODBfcmVnX2FjY2Vzc1tXQ0Q5MzRYX1BBR0VfU0laRV0gPSB7Ci0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfUEFHRTgwX1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzApXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMildID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8wKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMSldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzIpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8zKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX0FDQ0VTU19DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfQUNDRVNTX1NUQVRVUyldID0gV0NEOTM0WF9SRUFELAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9OT01fQ1hfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19DWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9DWF9WREQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfTk9NX01YX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TVlNfTVhfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfTVhfVkREKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfTUlOX0NYX1ZERCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9NQVhfU1ZTMl9TVEVQKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX0NUTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX0NPREVDX0NQUl9TV19NT0RFQ0hOR19TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRCwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9DT0RFQ19DUFJfU1dfTU9ERUNITkdfU1RBUlQpXSA9IFdDRDkzNFhfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfQ09ERUNfQ1BSX0NQUl9TVEFUVVMpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9QQUdFMTI4X1BBR0VfUkVHSVNURVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0JJU1RfTU9ERV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1JGX1BBX09OX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSU5UUjFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JTlRSMl9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NXUl9EQVRBX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fU1dSX0NMS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18yX1NDS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TTElNQlVTX0RBVEEyX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fU0xJTUJVU19DTEtfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMkNfQ0xLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJDX0RBVEFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMF9SWF9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18wX1RYX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzBfU0NLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzBfV1NfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMV9SWF9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0kyU18xX1RYX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzFfU0NLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzFfV1NfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9ETUlDMV9DTEtfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9ETUlDMV9EQVRBX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fRE1JQzJfQ0xLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fRE1JQzJfREFUQV9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0RNSUMzX0NMS19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0RNSUMzX0RBVEFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9KVENLX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fR1BJTzFfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9HUElPMl9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0dQSU8zX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fR1BJTzRfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TUElfU19DU05fUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TUElfU19DTEtfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9TUElfU19ET1VUX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fU1BJX1NfRElOX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fQkFfTl9QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9UTE1NX0dQSU8wX1BJTkNGRyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RMTU1fSTJTXzJfUlhfUElOQ0ZHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVExNTV9JMlNfMl9XU19QSU5DRkcpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzEpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMyldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzQpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0RSVkNUTF8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fU1RBVFVTKV0gPSBXQ0Q5MzRYX1JFQUQsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX01FTV9DVFJMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19CVVNfU0VMKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19KVEFHKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8xKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8yKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8zKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl80KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl81KV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19BTkFfRFRFU1RfRElSKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMSldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMildID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfNCldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19TWVNNRU1fQ1RSTCldID0gV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfU09DX1NXX1BXUl9TRVFfREVMQVkpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fTE9XKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX05PTV9ISUdIKV0gPSBXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0xPVyldID0KLQkJCQkJCQlXQ0Q5MzRYX1JFQURfV1JJVEUsCi0JW1dDRDkzNFhfUkVHKFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0hJR0gpXSA9Ci0JCQkJCQkJV0NEOTM0WF9SRUFEX1dSSVRFLAotCVtXQ0Q5MzRYX1JFRyhXQ0Q5MzRYX1RFU1RfREVCVUdfU1BJX1NMQVZFX0NIQVIpXSA9IFdDRDkzNFhfUkVBRF9XUklURSwKLQlbV0NEOTM0WF9SRUcoV0NEOTM0WF9URVNUX0RFQlVHX0NPREVDX0RJQUdTKV0gPSBXQ0Q5MzRYX1JFQUQsCi19OwotCi1jb25zdCB1OCAqIGNvbnN0IHdjZDkzNHhfcmVnW1dDRDkzNFhfTlVNX1BBR0VTXSA9IHsKLQlbV0NEOTM0WF9QQUdFXzBdID0gd2NkOTM0eF9wYWdlMF9yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfMV0gPSB3Y2Q5MzR4X3BhZ2UxX3JlZ19hY2Nlc3MsCi0JW1dDRDkzNFhfUEFHRV8yXSA9IHdjZDkzNHhfcGFnZTJfcmVnX2FjY2VzcywKLQlbV0NEOTM0WF9QQUdFXzRdID0gd2NkOTM0eF9wYWdlNF9yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfNV0gPSB3Y2Q5MzR4X3BhZ2U1X3JlZ19hY2Nlc3MsCi0JW1dDRDkzNFhfUEFHRV82XSA9IHdjZDkzNHhfcGFnZTZfcmVnX2FjY2VzcywKLQlbV0NEOTM0WF9QQUdFXzddID0gd2NkOTM0eF9wYWdlN19yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfMTBdID0gd2NkOTM0eF9wYWdlMTBfcmVnX2FjY2VzcywKLQlbV0NEOTM0WF9QQUdFXzExXSA9IHdjZDkzNHhfcGFnZTExX3JlZ19hY2Nlc3MsCi0JW1dDRDkzNFhfUEFHRV8xMl0gPSB3Y2Q5MzR4X3BhZ2UxMl9yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfMTNdID0gd2NkOTM0eF9wYWdlMTNfcmVnX2FjY2VzcywKLQlbV0NEOTM0WF9QQUdFXzE0XSA9IHdjZDkzNHhfcGFnZTE0X3JlZ19hY2Nlc3MsCi0JW1dDRDkzNFhfUEFHRV8xNV0gPSB3Y2Q5MzR4X3BhZ2UxNV9yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfMHg1MF0gPSB3Y2Q5MzR4X3BhZ2VfMHg1MF9yZWdfYWNjZXNzLAotCVtXQ0Q5MzRYX1BBR0VfMFg4MF0gPSB3Y2Q5MzR4X3BhZ2VfMHg4MF9yZWdfYWNjZXNzLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDl4eHgtY29yZS1pbml0LmMgYi9kcml2ZXJzL21mZC93Y2Q5eHh4LWNvcmUtaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkzMzk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDl4eHgtY29yZS1pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LWlycS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KLQotI2RlZmluZSBOVU1fRFJJVkVSU19SRUdfUkVUIDMKLQotc3RhdGljIGludCBfX2luaXQgd2NkOXh4eF9jb3JlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0W05VTV9EUklWRVJTX1JFR19SRVRdID0gezB9OwotCWludCBpID0gMDsKLQotCXJldFswXSA9IG1zbV9jZGNfcGluY3RybF9kcnZfaW5pdCgpOwotCWlmIChyZXRbMF0pCi0JCXByX2VycigiJXM6IEZhaWxlZCBpbml0IHBpbmN0cmwgZHJ2OiAlZFxuIiwgX19mdW5jX18sIHJldFswXSk7Ci0KLQlyZXRbMV0gPSB3Y2Q5eHh4X2lycV9kcnZfaW5pdCgpOwotCWlmIChyZXRbMV0pCi0JCXByX2VycigiJXM6IEZhaWxlZCBpbml0IGlycSBkcnY6ICVkXG4iLCBfX2Z1bmNfXywgcmV0WzFdKTsKLQotCXJldFsyXSA9IHdjZDl4eHhfaW5pdCgpOwotCWlmIChyZXRbMl0pCi0JCXByX2VycigiJXM6IEZhaWxlZCB3Y2QgY29yZSBkcnY6ICVkXG4iLCBfX2Z1bmNfXywgcmV0WzJdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fRFJJVkVSU19SRUdfUkVUOyBpKyspIHsKLQkJaWYgKHJldFtpXSkKLQkJCXJldHVybiByZXRbaV07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdCh3Y2Q5eHh4X2NvcmVfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3Y2Q5eHh4X2NvcmVfZXhpdCh2b2lkKQotewotCXdjZDl4eHhfZXhpdCgpOwotCXdjZDl4eHhfaXJxX2Rydl9leGl0KCk7Ci0JbXNtX2NkY19waW5jdHJsX2Rydl9leGl0KCk7Ci19Ci1tb2R1bGVfZXhpdCh3Y2Q5eHh4X2NvcmVfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiV0NEOVhYWCBDT0RFQyBjb3JlIGluaXQgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5eHh4LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3djZDl4eHgtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzZkM2RjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDl4eHgtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1zbGltc2xhdmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtdXRpbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAid2NkOXh4eC1yZWdtYXAuaCIKLQotI2RlZmluZSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCAweDgwMAotI2RlZmluZSBXQ0Q5WFhYX1NMSU1fUldfTUFYX1RSSUVTIDMKLSNkZWZpbmUgU0xJTUJVU19QUkVTRU5UX1RJTUVPVVQgMTAwCi0KLSNkZWZpbmUgTUFYX1dDRDlYWFhfREVWSUNFCTQKLSNkZWZpbmUgV0NEOVhYWF9JMkNfR1NCSV9TTEFWRV9JRCAiMy0wMDBkIgotI2RlZmluZSBXQ0Q5WFhYX0kyQ19UT1BfU0xBVkVfQUREUgkweDBkCi0jZGVmaW5lIFdDRDlYWFhfQU5BTE9HX0kyQ19TTEFWRV9BRERSCTB4NzcKLSNkZWZpbmUgV0NEOVhYWF9ESUdJVEFMMV9JMkNfU0xBVkVfQUREUgkweDY2Ci0jZGVmaW5lIFdDRDlYWFhfRElHSVRBTDJfSTJDX1NMQVZFX0FERFIJMHg1NQotI2RlZmluZSBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUwJMAotI2RlZmluZSBXQ0Q5WFhYX0kyQ19BTkFMT0cJMQotI2RlZmluZSBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzEJMgotI2RlZmluZSBXQ0Q5WFhYX0kyQ19ESUdJVEFMXzIJMwotCi0vKgotICogTnVtYmVyIG9mIHJldHVybiB2YWx1ZXMgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgZWFjaAotICogcmVnaXN0cmF0aW9uIG9mIFNsaW1idXMgb2YgSTJDIGJ1cyBmb3IgZWFjaCBjb2RlYwotICovCi0jZGVmaW5lIE5VTV9XQ0Q5WFhYX1JFR19SRVQJNAotCi0jZGVmaW5lIFNMSU1fVVNSX01DX1JFUEVBVF9DSEFOR0VfVkFMVUUgMHgwCi0jZGVmaW5lIFNMSU1fUkVQRUFUX1dSSVRFX01BWF9TTElDRSAxNgotI2RlZmluZSBSRUdfQllURVMgMgotI2RlZmluZSBWQUxfQllURVMgMQotI2RlZmluZSBXQ0Q5WFhYX1BBR0VfTlVNKHJlZykgICAgKCgocmVnKSA+PiA4KSAmIDB4ZmYpCi0jZGVmaW5lIFdDRDlYWFhfUEFHRV9TSVpFIDI1NgotCi1zdHJ1Y3Qgd2NkOXh4eF9pMmMgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGkyY19tc2cgeGZlcl9tc2dbMl07Ci0Jc3RydWN0IG11dGV4IHhmZXJfbG9jazsKLQlpbnQgbW9kX2lkOwotfTsKLQotc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHdjZDl4eHhfYmFzZV9yZWdtYXBfY29uZmlnID0gewotCS5yZWdfYml0cyA9IDE2LAotCS52YWxfYml0cyA9IDgsCi0JLmNhbl9tdWx0aV93cml0ZSA9IHRydWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOXh4eF9pMmNfYmFzZV9yZWdtYXBfY29uZmlnID0gewotCS5yZWdfYml0cyA9IDE2LAotCS52YWxfYml0cyA9IDgsCi0JLmNhbl9tdWx0aV93cml0ZSA9IGZhbHNlLAotCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyB1OCB3Y2Q5eHh4X3BnZF9sYTsKLXN0YXRpYyB1OCB3Y2Q5eHh4X2luZl9sYTsKLQotc3RhdGljIGNvbnN0IGludCB3Y2Q5eHh4X2NkY190eXBlc1tdID0gewotCVtXQ0Q5WFhYXSA9IFdDRDlYWFgsCi0JW1dDRDkzMzBdID0gV0NEOTMzMCwKLQlbV0NEOTMzNV0gPSBXQ0Q5MzM1LAotCVtXQ0Q5MzRYXSA9IFdDRDkzNFgsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3Y2Q5eHh4X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHRhc2hhLWkyYy1wZ2QiLAotCSAgLmRhdGEgPSAodm9pZCAqKSZ3Y2Q5eHh4X2NkY190eXBlc1tXQ0Q5MzM1XX0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaTJjIiwKLQkgIC5kYXRhID0gKHZvaWQgKikmd2NkOXh4eF9jZGNfdHlwZXNbV0NEOTMzMF19LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdjZDl4eHhfb2ZfbWF0Y2gpOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9kZXZpY2VfdXAoc3RydWN0IHNsaW1fZGV2aWNlICpzbGRldik7Ci1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9kZXZpY2VfZG93bihzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsZGV2KTsKLQotc3RydWN0IHdjZDl4eHhfaTJjIHdjZDl4eHhfbW9kdWxlc1tNQVhfV0NEOVhYWF9ERVZJQ0VdOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9tdWx0aV9yZWdfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1OCB2YWxbV0NEOVhYWF9QQUdFX1NJWkVdOwotCWludCByZXQgPSAwOwotCWludCBpID0gMDsKLQlpbnQgbiA9IDA7Ci0JdW5zaWduZWQgaW50IHBhZ2VfbnVtOwotCXNpemVfdCBudW1fcmVncyA9IChjb3VudCAvIChSRUdfQllURVMgKyBWQUxfQllURVMpKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsICpidWxrX3JlZzsKLQl1OCAqYnVmOwotCi0JZGV2ID0gd2NkOXh4eC0+ZGV2OwotCWlmICghZGF0YSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChudW1fcmVncyA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJ1bGtfcmVnID0ga3phbGxvYyhudW1fcmVncyAqIChzaXplb2Yoc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCkpLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWxrX3JlZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlidWYgPSAodTggKilkYXRhOwotCXJlZyA9ICoodTE2ICopYnVmOwotCXBhZ2VfbnVtID0gV0NEOVhYWF9QQUdFX05VTShyZWcpOwotCWZvciAoaSA9IDAsIG4gPSAwOyBuIDwgbnVtX3JlZ3M7IGkrKywgbisrKSB7Ci0JCXJlZyA9ICoodTE2ICopYnVmOwotCQlpZiAocGFnZV9udW0gIT0gV0NEOVhYWF9QQUdFX05VTShyZWcpKSB7Ci0JCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywKLQkJCQkJCSAgICAgIGksIGZhbHNlKTsKLQkJCXBhZ2VfbnVtID0gV0NEOVhYWF9QQUdFX05VTShyZWcpOwotCQkJaSA9IDA7Ci0JCX0KLQkJYnVmICs9IFJFR19CWVRFUzsKLQkJdmFsW2ldID0gKmJ1ZjsKLQkJYnVmICs9IFZBTF9CWVRFUzsKLQkJYnVsa19yZWdbaV0ucmVnID0gcmVnOwotCQlidWxrX3JlZ1tpXS5idWYgPSAmdmFsW2ldOwotCQlidWxrX3JlZ1tpXS5ieXRlcyA9IDE7Ci0JfQotCXJldCA9IHdjZDl4eHhfc2xpbV9idWxrX3dyaXRlKHdjZDl4eHgsIGJ1bGtfcmVnLAotCQkJCSAgICAgIGksIGZhbHNlKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGRldiwgIiVzOiBlcnJvciB3cml0aW5nIGJ1bGsgcmVnc1xuIiwKLQkJCV9fZnVuY19fKTsKLQotCWtmcmVlKGJ1bGtfcmVnKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQ6IFJlYWQgc2xpbSBpbnRlcmZhY2UgcmVnaXN0ZXJzCi0gKgotICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gd2NkOXh4eCBzdHJ1Y3R1cmUKLSAqIEByZWc6IHJlZ2lzdGVyIGFkZGVyc3MKLSAqCi0gKiBSZXR1cm5zIHJlZ2lzdGVyIHZhbHVlIGluIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnKQotewotCXU4IHZhbDsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0JcmV0ID0gd2NkOXh4eC0+cmVhZF9kZXYod2NkOXh4eCwgcmVnLCAxLCAodm9pZCAqKSZ2YWwsCi0JCQkJdHJ1ZSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IENvZGVjIHJlYWQgMHgleCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVnKTsKLQllbHNlCi0JCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IFJlYWQgMHglMDJ4IGZyb20gMHgleFxuIiwKLQkJCV9fZnVuY19fLCB2YWwsIHJlZyk7Ci0KLQltdXRleF91bmxvY2soJndjZDl4eHgtPmlvX2xvY2spOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gdmFsOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGU6IFdyaXRlIHNsaW0gaW50ZXJmYWNlIHJlZ2lzdGVycwotICoKLSAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCi0gKiBAcmVnOiByZWdpc3RlciBhZGRlcnNzCi0gKiBAdmFsOiB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkgICAgIHU4IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0JcmV0ID0gd2NkOXh4eC0+d3JpdGVfZGV2KHdjZDl4eHgsIHJlZywgMSwgKHZvaWQgKikmdmFsLCB0cnVlKTsKLQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiBXcml0ZSAlMDJ4IHRvIDB4JXggcmV0KCVkKVxuIiwKLQkJX19mdW5jX18sIHZhbCwgcmVnLCByZXQpOwotCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUpOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9yZWFkX2RldmljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJCWludCBieXRlcywgdm9pZCAqZGVzdCwgYm9vbCBpbnRlcmZhY2UpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc2xpbV9lbGVfYWNjZXNzIG1zZzsKLQlpbnQgc2xpbV9yZWFkX3RyaWVzID0gV0NEOVhYWF9TTElNX1JXX01BWF9UUklFUzsKLQotCW1zZy5zdGFydF9vZmZzZXQgPSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIHJlZzsKLQltc2cubnVtX2J5dGVzID0gYnl0ZXM7Ci0JbXNnLmNvbXAgPSBOVUxMOwotCi0JaWYgKCF3Y2Q5eHh4LT5kZXZfdXApIHsKLQkJZGV2X2RiZ19yYXRlbGltaXRlZCgKLQkJCXdjZDl4eHgtPmRldiwgIiVzOiBObyByZWFkIGFsbG93ZWQuIGRldl91cCA9ICVsdVxuIiwKLQkJCV9fZnVuY19fLCB3Y2Q5eHh4LT5kZXZfdXApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAoMSkgewotCQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT54ZmVyX2xvY2spOwotCQlyZXQgPSBzbGltX3JlcXVlc3RfdmFsX2VsZW1lbnQoaW50ZXJmYWNlID8KLQkJCSAgICAgICB3Y2Q5eHh4LT5zbGltX3NsYXZlIDogd2NkOXh4eC0+c2xpbSwKLQkJCSAgICAgICAmbXNnLCBkZXN0LCBieXRlcyk7Ci0JCW11dGV4X3VubG9jaygmd2NkOXh4eC0+eGZlcl9sb2NrKTsKLQkJaWYgKGxpa2VseShyZXQgPT0gMCkgfHwgKC0tc2xpbV9yZWFkX3RyaWVzID09IDApKQotCQkJYnJlYWs7Ci0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKLQl9Ci0KLQlpZiAocmV0KQotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBFcnJvciwgQ29kZWMgcmVhZCBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEludGVyZmFjZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgd3JpdGUgaXMgdG8gdGhlIGludGVyZmFjZSBvciBnZW5lcmFsCi0gKiByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyBpbnQgd2NkOXh4eF9zbGltX3dyaXRlX2RldmljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJdW5zaWduZWQgc2hvcnQgcmVnLCBpbnQgYnl0ZXMsIHZvaWQgKnNyYywgYm9vbCBpbnRlcmZhY2UpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc2xpbV9lbGVfYWNjZXNzIG1zZzsKLQlpbnQgc2xpbV93cml0ZV90cmllcyA9IFdDRDlYWFhfU0xJTV9SV19NQVhfVFJJRVM7Ci0KLQltc2cuc3RhcnRfb2Zmc2V0ID0gV0NEOVhYWF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyByZWc7Ci0JbXNnLm51bV9ieXRlcyA9IGJ5dGVzOwotCW1zZy5jb21wID0gTlVMTDsKLQotCWlmICghd2NkOXh4eC0+ZGV2X3VwKSB7Ci0JCWRldl9kYmdfcmF0ZWxpbWl0ZWQoCi0JCQl3Y2Q5eHh4LT5kZXYsICIlczogTm8gd3JpdGUgYWxsb3dlZC4gZGV2X3VwID0gJWx1XG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXdoaWxlICgxKSB7Ci0JCW11dGV4X2xvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JCXJldCA9IHNsaW1fY2hhbmdlX3ZhbF9lbGVtZW50KGludGVyZmFjZSA/Ci0JCQkgICAgICB3Y2Q5eHh4LT5zbGltX3NsYXZlIDogd2NkOXh4eC0+c2xpbSwKLQkJCSAgICAgICZtc2csIHNyYywgYnl0ZXMpOwotCQltdXRleF91bmxvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JCWlmIChsaWtlbHkocmV0ID09IDApIHx8ICgtLXNsaW1fd3JpdGVfdHJpZXMgPT0gMCkpCi0JCQlicmVhazsKLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCX0KLQotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEVycm9yLCBDb2RlYyB3cml0ZSBmYWlsZWQgKCVkKVxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9nZXRfYWxsb3dlZF9zbGljZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCQkJICBpbnQgYnl0ZXMpCi17Ci0JaW50IGFsbG93ZWRfc3ogPSBieXRlczsKLQotCWlmIChsaWtlbHkoYnl0ZXMgPT0gU0xJTV9SRVBFQVRfV1JJVEVfTUFYX1NMSUNFKSkKLQkJYWxsb3dlZF9zeiA9IDE2OwotCWVsc2UgaWYgKGJ5dGVzID49IDEyKQotCQlhbGxvd2VkX3N6ID0gMTI7Ci0JZWxzZSBpZiAoYnl0ZXMgPj0gOCkKLQkJYWxsb3dlZF9zeiA9IDg7Ci0JZWxzZSBpZiAoYnl0ZXMgPj0gNikKLQkJYWxsb3dlZF9zeiA9IDY7Ci0JZWxzZSBpZiAoYnl0ZXMgPj0gNCkKLQkJYWxsb3dlZF9zeiA9IDQ7Ci0JZWxzZQotCQlhbGxvd2VkX3N6ID0gYnl0ZXM7Ci0KLQlyZXR1cm4gYWxsb3dlZF9zejsKLX0KLQotLyoKLSAqIHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQ6IFdyaXRlIHRoZSBzYW1lIHJlZ2lzdGVyIHdpdGggbXVsdGlwbGUgdmFsdWVzCi0gKiBAd2NkOXh4eDogaGFuZGxlIHRvIHdjZCBjb3JlCi0gKiBAcmVnOiByZWdpc3RlciB0byBiZSB3cml0dGVuCi0gKiBAYnl0ZXM6IG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHJlZwotICogQHNyYzogYnVmZmVyIHdpdGggZGF0YSBjb250ZW50IHRvIGJlIHdyaXR0ZW4gdG8gcmVnCi0gKiBUaGlzIEFQSSB3aWxsIHdyaXRlIHJlZyB3aXRoIGJ5dGVzIGZyb20gc3JjIGluIGEgc2luZ2xlIHNsaW1idXMKLSAqIHRyYW5zYWN0aW9uLiBBbGwgdmFsdWVzIGZyb20gMSB0byAxNiBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgQVBJLgotICovCi1pbnQgd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJICAgICAgaW50IGJ5dGVzLCB2b2lkICpzcmMpCi17Ci0JaW50IHJldCA9IDAsIGJ5dGVzX3RvX3dyaXRlID0gYnl0ZXMsIGJ5dGVzX2FsbG93ZWQ7Ci0Jc3RydWN0IHNsaW1fZWxlX2FjY2VzcyBzbGltX21zZzsKLQotCW11dGV4X2xvY2soJndjZDl4eHgtPmlvX2xvY2spOwotCWlmICh3Y2Q5eHh4LT50eXBlID09IFdDRDkzMzUgfHwgd2NkOXh4eC0+dHlwZSA9PSBXQ0Q5MzRYKSB7Ci0JCXJldCA9IHdjZDl4eHhfcGFnZV93cml0ZSh3Y2Q5eHh4LCAmcmVnKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbGltX21zZy5zdGFydF9vZmZzZXQgPSBXQ0Q5WFhYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIHJlZzsKLQlzbGltX21zZy5jb21wID0gTlVMTDsKLQotCWlmICh1bmxpa2VseShieXRlcyA+IFNMSU1fUkVQRUFUX1dSSVRFX01BWF9TTElDRSkpIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogc2l6ZSAlZCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGJ5dGVzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghd2NkOXh4eC0+ZGV2X3VwKSB7Ci0JCWRldl9kYmdfcmF0ZWxpbWl0ZWQoCi0JCQl3Y2Q5eHh4LT5kZXYsICIlczogTm8gd3JpdGUgYWxsb3dlZC4gZGV2X3VwID0gJWx1XG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl3aGlsZSAoYnl0ZXNfdG9fd3JpdGUgPiAwKSB7Ci0JCWJ5dGVzX2FsbG93ZWQgPSB3Y2Q5eHh4X3NsaW1fZ2V0X2FsbG93ZWRfc2xpY2Uod2NkOXh4eCwKLQkJCQkgICAgICAgYnl0ZXNfdG9fd3JpdGUpOwotCi0JCXNsaW1fbXNnLm51bV9ieXRlcyA9IGJ5dGVzX2FsbG93ZWQ7Ci0JCW11dGV4X2xvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JCXJldCA9IHNsaW1fdXNlcl9tc2cod2NkOXh4eC0+c2xpbSwgd2NkOXh4eC0+c2xpbS0+bGFkZHIsCi0JCQkJICAgIFNMSU1fTVNHX01UX0RFU1RfUkVGRVJSRURfVVNFUiwKLQkJCQkgICAgU0xJTV9VU1JfTUNfUkVQRUFUX0NIQU5HRV9WQUxVRSwKLQkJCQkgICAgJnNsaW1fbXNnLCBzcmMsIGJ5dGVzX2FsbG93ZWQpOwotCQltdXRleF91bmxvY2soJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogZmFpbGVkLCByZXQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnl0ZXNfdG9fd3JpdGUgPSBieXRlc190b193cml0ZSAtIGJ5dGVzX2FsbG93ZWQ7Ci0JCXNyYyA9ICgodTggKilzcmMpICsgYnl0ZXNfYWxsb3dlZDsKLQl9Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQpOwotCi0vKgotICogd2NkOXh4eF9zbGltX3Jlc2VydmVfYnc6IEFQSSB0byByZXNlcnZlIHRoZSBzbGltYnVzIGJhbmR3aWR0aAotICogQHdjZDl4eHg6IEhhbmRsZSB0byB0aGUgd2NkOXh4eCBjb3JlCi0gKiBAYndfb3BzOiB2YWx1ZSBvZiB0aGUgYmFuZHdpZHRoIHRoYXQgaXMgcmVxdWVzdGVkCi0gKiBAY29tbWl0OiBGbGFnIHRvIGluZGljYXRlIGlmIGJhbmR3aWR0aCBjaGFuZ2UgaXMgdG8gYmUgY29tbWl0dGVkCi0gKgkgICAgcmlnaHQgYXdheQotICovCi1pbnQgd2NkOXh4eF9zbGltX3Jlc2VydmVfYncoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCXUzMiBid19vcHMsIGJvb2wgY29tbWl0KQotewotCWlmICghd2NkOXh4eCB8fCAhd2NkOXh4eC0+c2xpbSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byAlc1xuIiwKLQkJCV9fZnVuY19fLAotCQkJKCF3Y2Q5eHh4KSA/ICJ3Y2Q5eHh4IiA6ICJzbGltX2RldmljZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gc2xpbV9yZXNlcnZlbXNnX2J3KHdjZDl4eHgtPnNsaW0sIGJ3X29wcywgY29tbWl0KTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9zbGltX3Jlc2VydmVfYncpOwotCi0vKgotICogd2NkOXh4eF9zbGltX2J1bGtfd3JpdGU6IEFQSSB0byB3cml0ZSBtdWx0aXBsZSByZWdpc3RlcnMgd2l0aCBvbmUgZGVzY3JpcHRvcgotICogQHdjZDl4eHg6IEhhbmRsZSB0byB0aGUgd2NkOXh4eCBjb3JlCi0gKiBAd2NkOXh4eF9yZWdfdmFsOiBzdHJ1Y3R1cmUgaG9sZGluZyByZWdpc3RlciBhbmQgdmFsdWVzIHRvIGJlIHdyaXR0ZW4KLSAqIEBzaXplOiBJbmRpY2F0ZXMgbnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvbmUgZGVzY3JpcHRvcgotICogQGlzX2ludGVyZmFjZTogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlZ2lzdGVyIGlzIGZvciBzbGltIGludGVyZmFjZSBvciBmb3IKLSAqCSAgICAgICBnZW5lcmFsIHJlZ2lzdGVycy4KLSAqIEByZXR1cm46IHJldHVybnMgMCBpZiBzdWNjZXNzIG9yIGVycm9yIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIgaW4gY2FzZQotICoJICAgIG9mIGZhaWx1cmUuCi0gKi8KLWludCB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCSAgICBzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsICpidWxrX3JlZywKLQkJCSAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBpc19pbnRlcmZhY2UpCi17Ci0JaW50IHJldCwgaTsKLQlzdHJ1Y3Qgc2xpbV92YWxfaW5mICptc2dzOwotCXVuc2lnbmVkIHNob3J0IHJlZzsKLQotCWlmICghYnVsa19yZWcgfHwgIXNpemUgfHwgIXdjZDl4eHgpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghd2NkOXh4eC0+ZGV2X3VwKSB7Ci0JCWRldl9kYmdfcmF0ZWxpbWl0ZWQoCi0JCQl3Y2Q5eHh4LT5kZXYsICIlczogTm8gd3JpdGUgYWxsb3dlZC4gZGV2X3VwID0gJWx1XG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1zZ3MgPSBremFsbG9jKHNpemUgKiAoc2l6ZW9mKHN0cnVjdCBzbGltX3ZhbF9pbmYpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc2dzKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gbWVtX2ZhaWw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0JcmVnID0gYnVsa19yZWctPnJlZzsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCW1zZ3NbaV0uc3RhcnRfb2Zmc2V0ID0gV0NEOVhYWF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKwotCQkJCQkoYnVsa19yZWctPnJlZyAmIDB4RkYpOwotCQltc2dzW2ldLm51bV9ieXRlcyA9IGJ1bGtfcmVnLT5ieXRlczsKLQkJbXNnc1tpXS53YnVmID0gYnVsa19yZWctPmJ1ZjsKLQkJYnVsa19yZWcrKzsKLQl9Ci0JcmV0ID0gd2NkOXh4eF9wYWdlX3dyaXRlKHdjZDl4eHgsICZyZWcpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogUGFnZSB3cml0ZSBlcnJvciBmb3IgcmVnOiAweCV4XG4iLAotCQkJX19mdW5jX18sIHJlZyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IHNsaW1fYnVsa19tc2dfd3JpdGUoaXNfaW50ZXJmYWNlID8KLQkJCQkgIHdjZDl4eHgtPnNsaW1fc2xhdmUgOiB3Y2Q5eHh4LT5zbGltLAotCQkJCSAgU0xJTV9NU0dfTVRfQ09SRSwKLQkJCQkgIFNMSU1fTVNHX01DX0NIQU5HRV9WQUxVRSwgbXNncywgc2l6ZSwKLQkJCQkgIE5VTEwsIE5VTEwpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEVycm9yLCBDb2RlYyBidWxrIHdyaXRlIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JLyogMTAwIHVzZWMgc2xlZXAgaXMgbmVlZGVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLwotCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7Ci1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQlrZnJlZShtc2dzKTsKLW1lbV9mYWlsOgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfc2xpbV9idWxrX3dyaXRlKTsKLQotc3RhdGljIGludCB3Y2Q5eHh4X251bV9pcnFfcmVncyhjb25zdCBzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlyZXR1cm4gKHdjZDl4eHgtPmNvZGVjX3R5cGUtPm51bV9pcnFzIC8gOCkgKwotCQkoKHdjZDl4eHgtPmNvZGVjX3R5cGUtPm51bV9pcnFzICUgOCkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9yZWdtYXBfaW5pdF9jYWNoZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqcmVnbWFwX2NvbmZpZzsKLQlpbnQgcmM7Ci0KLQlyZWdtYXBfY29uZmlnID0gd2NkOXh4eF9nZXRfcmVnbWFwX2NvbmZpZyh3Y2Q5eHh4LT50eXBlKTsKLQlpZiAoIXJlZ21hcF9jb25maWcpIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICJyZWdtYXAgY29uZmlnIGlzIG5vdCBkZWZpbmVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmMgPSByZWdtYXBfcmVpbml0X2NhY2hlKHdjZDl4eHgtPnJlZ21hcCwgcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKHJjICE9IDApIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczpGYWlsZWQgdG8gcmVpbml0IHJlZ2lzdGVyIGNhY2hlOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfZGV2aWNlX2luaXQoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCi17Ci0JaW50IHJldCA9IDAsIGk7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPSAmd2NkOXh4eC0+Y29yZV9yZXM7Ci0JcmVnbWFwX3BhdGNoX2ZwdHIgcmVnbWFwX2FwcGx5X3BhdGNoID0gTlVMTDsKLQotCW11dGV4X2luaXQoJndjZDl4eHgtPmlvX2xvY2spOwotCW11dGV4X2luaXQoJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmd2NkOXh4eC0+cmVzZXRfbG9jayk7Ci0KLQlyZXQgPSB3Y2Q5eHh4X2JyaW5ndXAod2NkOXh4eC0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gZXJyX2JyaW5nX3VwOwotCX0KLQotCXdjZDl4eHgtPmNvZGVjX3R5cGUgPSBkZXZtX2t6YWxsb2Mod2NkOXh4eC0+ZGV2LAotCQkJc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdjZDl4eHgtPmNvZGVjX3R5cGUpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYnJpbmdfdXA7Ci0JfQotCXJldCA9IHdjZDl4eHhfZ2V0X2NvZGVjX2luZm8od2NkOXh4eC0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gZmFpbF9jZGNfZmlsbDsKLQl9Ci0Jd2NkOXh4eC0+dmVyc2lvbiA9IHdjZDl4eHgtPmNvZGVjX3R5cGUtPnZlcnNpb247Ci0JaWYgKCF3Y2Q5eHh4LT5jb2RlY190eXBlLT5kZXYgfHwgIXdjZDl4eHgtPmNvZGVjX3R5cGUtPnNpemUpCi0JCWdvdG8gZmFpbF9jZGNfZmlsbDsKLQotCWNvcmVfcmVzLT5wYXJlbnQgPSB3Y2Q5eHh4OwotCWNvcmVfcmVzLT5kZXYgPSB3Y2Q5eHh4LT5kZXY7Ci0JY29yZV9yZXMtPmludHJfdGFibGUgPSB3Y2Q5eHh4LT5jb2RlY190eXBlLT5pbnRyX3RibDsKLQljb3JlX3Jlcy0+aW50cl90YWJsZV9zaXplID0gd2NkOXh4eC0+Y29kZWNfdHlwZS0+aW50cl90Ymxfc2l6ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBXQ0Q5WFhYX0lOVFJfUkVHX01BWDsgaSsrKQotCQl3Y2Q5eHh4LT5jb3JlX3Jlcy5pbnRyX3JlZ1tpXSA9Ci0JCQl3Y2Q5eHh4LT5jb2RlY190eXBlLT5pbnRyX3JlZ1tpXTsKLQotCXdjZDl4eHhfY29yZV9yZXNfaW5pdCgmd2NkOXh4eC0+Y29yZV9yZXMsCi0JCQkgICAgICB3Y2Q5eHh4LT5jb2RlY190eXBlLT5udW1faXJxcywKLQkJCSAgICAgIHdjZDl4eHhfbnVtX2lycV9yZWdzKHdjZDl4eHgpLAotCQkJICAgICAgd2NkOXh4eC0+cmVnbWFwKTsKLQotCWlmICh3Y2Q5eHh4X2NvcmVfaXJxX2luaXQoJndjZDl4eHgtPmNvcmVfcmVzKSkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSB3Y2Q5eHh4X3JlZ21hcF9pbml0X2NhY2hlKHdjZDl4eHgpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2lycTsKLQotCXJlZ21hcF9hcHBseV9wYXRjaCA9IHdjZDl4eHhfZ2V0X3JlZ21hcF9yZWdfcGF0Y2goCi0JCQl3Y2Q5eHh4LT50eXBlKTsKLQlpZiAocmVnbWFwX2FwcGx5X3BhdGNoKSB7Ci0JCXJldCA9IHJlZ21hcF9hcHBseV9wYXRjaCh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJd2NkOXh4eC0+dmVyc2lvbik7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwKLQkJCQkJIkZhaWxlZCB0byByZWdpc3RlciBwYXRjaDogJWRcbiIsIHJldCk7Ci0JfQotCi0JcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdjZDl4eHgtPmRldiwgLTEsIHdjZDl4eHgtPmNvZGVjX3R5cGUtPmRldiwKLQkJCSAgICAgIHdjZDl4eHgtPmNvZGVjX3R5cGUtPnNpemUsIE5VTEwsIDAsIE5VTEwpOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIkZhaWxlZCB0byBhZGQgY2hpbGRyZW46ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JcmV0ID0gZGV2aWNlX2luaXRfd2FrZXVwKHdjZDl4eHgtPmRldiwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIkRldmljZSB3YWtldXAgaW5pdCBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9pcnE7Ci0JfQotCi0JcmV0dXJuIHJldDsKLWVycl9pcnE6Ci0Jd2NkOXh4eF9pcnFfZXhpdCgmd2NkOXh4eC0+Y29yZV9yZXMpOwotZmFpbF9jZGNfZmlsbDoKLQlkZXZtX2tmcmVlKHdjZDl4eHgtPmRldiwgd2NkOXh4eC0+Y29kZWNfdHlwZSk7Ci0Jd2NkOXh4eC0+Y29kZWNfdHlwZSA9IE5VTEw7Ci1lcnI6Ci0Jd2NkOXh4eF9icmluZ2Rvd24od2NkOXh4eC0+ZGV2KTsKLQl3Y2Q5eHh4X2NvcmVfcmVzX2RlaW5pdCgmd2NkOXh4eC0+Y29yZV9yZXMpOwotZXJyX2JyaW5nX3VwOgotCW11dGV4X2Rlc3Ryb3koJndjZDl4eHgtPmlvX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+cmVzZXRfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9kZXZpY2VfZXhpdChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlkZXZpY2VfaW5pdF93YWtldXAod2NkOXh4eC0+ZGV2LCBmYWxzZSk7Ci0Jd2NkOXh4eF9pcnFfZXhpdCgmd2NkOXh4eC0+Y29yZV9yZXMpOwotCW1mZF9yZW1vdmVfZGV2aWNlcyh3Y2Q5eHh4LT5kZXYpOwotCXdjZDl4eHhfYnJpbmdkb3duKHdjZDl4eHgtPmRldik7Ci0Jd2NkOXh4eF9yZXNldF9sb3cod2NkOXh4eC0+ZGV2KTsKLQl3Y2Q5eHh4X2NvcmVfcmVzX2RlaW5pdCgmd2NkOXh4eC0+Y29yZV9yZXMpOwotCW11dGV4X2Rlc3Ryb3koJndjZDl4eHgtPmlvX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJndjZDl4eHgtPnhmZXJfbG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmd2NkOXh4eC0+cmVzZXRfbG9jayk7Ci0JaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykKLQkJc2xpbV9yZW1vdmVfZGV2aWNlKHdjZDl4eHgtPnNsaW1fc2xhdmUpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0cnVjdCB3Y2Q5eHh4ICpkZWJ1Z0NvZGVjOwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc193Y2Q5eHh4X2RlbnQ7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19wZWVrOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG9rZTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Bvd2VyX3N0YXRlOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcmVnX2R1bXA7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfZGF0YTsKLQotc3RhdGljIGludCBjb2RlY19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3BhcmFtZXRlcnMoY2hhciAqYnVmLCBsb25nIGludCAqcGFyYW0xLCBpbnQgbnVtX29mX3BhcikKLXsKLQljaGFyICp0b2tlbjsKLQlpbnQgYmFzZSwgY250OwotCi0JdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQotCWZvciAoY250ID0gMDsgY250IDwgbnVtX29mX3BhcjsgY250KyspIHsKLQkJaWYgKHRva2VuICE9IE5VTEwpIHsKLQkJCWlmICgodG9rZW5bMV0gPT0gJ3gnKSB8fCAodG9rZW5bMV0gPT0gJ1gnKSkKLQkJCQliYXNlID0gMTY7Ci0JCQllbHNlCi0JCQkJYmFzZSA9IDEwOwotCi0JCQlpZiAoa3N0cnRvdWwodG9rZW4sIGJhc2UsICZwYXJhbTFbY250XSkgIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdjZDl4eHhfc2xpbXNsYXZlX3JlZ19zaG93KGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgbG9mZl90ICpwcG9zKQotewotCWludCBpLCByZWdfdmFsLCBsZW47Ci0Jc3NpemVfdCB0b3RhbCA9IDA7Ci0JY2hhciB0bXBfYnVmWzI1XTsgLyogZWFjaCBsaW5lIGlzIDEyIGJ5dGVzIGJ1dCAyNSBmb3IgbWFyZ2luIG9mIGVycm9yICovCi0KLQlmb3IgKGkgPSAoaW50KSAqcHBvcyAvIDEyOyBpIDw9IFNMSU1fTUFYX1JFR19BRERSOyBpKyspIHsKLQkJcmVnX3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKGRlYnVnQ29kZWMsIGkpOwotCQlsZW4gPSBzbnByaW50Zih0bXBfYnVmLCBzaXplb2YodG1wX2J1ZiksCi0JCQkiMHglLjN4OiAweCUuMnhcbiIsIGksIHJlZ192YWwpOwotCi0JCWlmICgodG90YWwgKyBsZW4pID49IGNvdW50IC0gMSkKLQkJCWJyZWFrOwotCQlpZiAoY29weV90b191c2VyKCh1YnVmICsgdG90YWwpLCB0bXBfYnVmLCBsZW4pKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGNvcHkgcmVnIGR1bXBcbiIsIF9fZnVuY19fKTsKLQkJCXRvdGFsID0gLUVGQVVMVDsKLQkJCWdvdG8gY29weV9lcnI7Ci0JCX0KLQkJKnBwb3MgKz0gbGVuOwotCQl0b3RhbCArPSBsZW47Ci0JfQotCi1jb3B5X2VycjoKLQlyZXR1cm4gdG90YWw7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNvZGVjX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgbGJ1Zls4XTsKLQljaGFyICphY2Nlc3Nfc3RyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNzaXplX3QgcmV0X2NudDsKLQotCWlmICgqcHBvcyA8IDAgfHwgIWNvdW50KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzbGltc2xhdmVfcGVlayIpKSB7Ci0JCXNucHJpbnRmKGxidWYsIHNpemVvZihsYnVmKSwgIjB4JXhcbiIsIHJlYWRfZGF0YSk7Ci0JCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgbGJ1ZiwKLQkJCQkJICAgICAgIHN0cm5sZW4obGJ1ZiwgNykpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic2xpbXNsYXZlX3JlZ19kdW1wIikpIHsKLQkJcmV0X2NudCA9IHdjZDl4eHhfc2xpbXNsYXZlX3JlZ19zaG93KHVidWYsIGNvdW50LCBwcG9zKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiAlcyBub3QgcGVybWl0dGVkIHRvIHJlYWRcbiIsIF9fZnVuY19fLCBhY2Nlc3Nfc3RyKTsKLQkJcmV0X2NudCA9IC1FUEVSTTsKLQl9Ci0KLQlyZXR1cm4gcmV0X2NudDsKLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9zZXRfcmVzZXRfcGluX3N0YXRlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJCQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEsCi0JCQkJCWJvb2wgYWN0aXZlKQotewotCWlmICh3Y2Q5eHh4LT53Y2RfcnN0X25wKSB7Ci0JCWlmIChhY3RpdmUpCi0JCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZSgKLQkJCQkJCXdjZDl4eHgtPndjZF9yc3RfbnApOwotCQllbHNlCi0JCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKAotCQkJCQkJd2NkOXh4eC0+d2NkX3JzdF9ucCk7Ci0KLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoZ3Bpb19pc192YWxpZCh3Y2Q5eHh4LT5yZXNldF9ncGlvKSkgewotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQod2NkOXh4eC0+cmVzZXRfZ3BpbywKLQkJCQkgICAgICAoYWN0aXZlID09IHRydWUgPyAxIDogMCkpOwotCX0KLX0KLQotc3RhdGljIGludCBjb2RlY19kZWJ1Z19wcm9jZXNzX2NkY19wb3dlcihjaGFyICpsYnVmKQotewotCWxvbmcgaW50IHBhcmFtOwotCWludCByYzsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7Ci0KLQlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKSB7Ci0JCXByX2VycigiJXM6IENPREVDIGlzIG5vdCBpbiBTTElNQlVTIG1vZGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVBFUk07Ci0JCWdvdG8gZXJyb3JfaW50ZjsKLQl9Ci0KLQlyYyA9IGdldF9wYXJhbWV0ZXJzKGxidWYsICZwYXJhbSwgMSk7Ci0KLQlpZiAobGlrZWx5KCFyYykpIHsKLQkJcGRhdGEgPSBkZWJ1Z0NvZGVjLT5zbGltLT5kZXYucGxhdGZvcm1fZGF0YTsKLQkJaWYgKHBhcmFtID09IDApIHsKLQkJCXdjZDl4eHhfc2xpbV9kZXZpY2VfZG93bihkZWJ1Z0NvZGVjLT5zbGltKTsKLQkJCW1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMoZGVidWdDb2RlYy0+ZGV2LAotCQkJCQkJCWRlYnVnQ29kZWMtPnN1cHBsaWVzLAotCQkJCQkJCXBkYXRhLT5yZWd1bGF0b3IsCi0JCQkJCQkJcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0JCQl3Y2Q5eHh4X3NldF9yZXNldF9waW5fc3RhdGUoZGVidWdDb2RlYywgcGRhdGEsIGZhbHNlKTsKLQkJfSBlbHNlIGlmIChwYXJhbSA9PSAxKSB7Ci0JCQltc21fY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMoZGVidWdDb2RlYy0+ZGV2LAotCQkJCQkJICAgICAgIGRlYnVnQ29kZWMtPnN1cHBsaWVzLAotCQkJCQkJICAgICAgIHBkYXRhLT5yZWd1bGF0b3IsCi0JCQkJCQkgICAgICAgcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JCQl3Y2Q5eHh4X3NldF9yZXNldF9waW5fc3RhdGUoZGVidWdDb2RlYywgcGRhdGEsIGZhbHNlKTsKLQkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQkJCXdjZDl4eHhfc2V0X3Jlc2V0X3Bpbl9zdGF0ZShkZWJ1Z0NvZGVjLCBwZGF0YSwgdHJ1ZSk7Ci0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JCQl3Y2Q5eHh4X3NsaW1fZGV2aWNlX3VwKGRlYnVnQ29kZWMtPnNsaW0pOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBjb21tYW5kICVsZFxuIiwgX19mdW5jX18sIHBhcmFtKTsKLQkJfQotCX0KLQotZXJyb3JfaW50ZjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNvZGVjX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAotCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciAqYWNjZXNzX3N0ciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQljaGFyIGxidWZbMzJdOwotCWludCByYzsKLQlsb25nIGludCBwYXJhbVs1XTsKLQotCWlmIChjbnQgPiBzaXplb2YobGJ1ZikgLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKLQlpZiAocmMpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbGJ1ZltjbnRdID0gJ1wwJzsKLQotCWlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzbGltc2xhdmVfcG9rZSIpKSB7Ci0JCS8qIHdyaXRlICovCi0JCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDIpOwotCQlpZiAoKHBhcmFtWzBdIDw9IDB4M0ZGKSAmJiAocGFyYW1bMV0gPD0gMHhGRikgJiYKLQkJCShyYyA9PSAwKSkKLQkJCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZShkZWJ1Z0NvZGVjLCBwYXJhbVswXSwKLQkJCQlwYXJhbVsxXSk7Ci0JCWVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInNsaW1zbGF2ZV9wZWVrIikpIHsKLQkJLyogcmVhZCAqLwotCQlyYyA9IGdldF9wYXJhbWV0ZXJzKGxidWYsIHBhcmFtLCAxKTsKLQkJaWYgKChwYXJhbVswXSA8PSAweDNGRikgJiYgKHJjID09IDApKQotCQkJcmVhZF9kYXRhID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoZGVidWdDb2RlYywKLQkJCQlwYXJhbVswXSk7Ci0JCWVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInBvd2VyX3N0YXRlIikpIHsKLQkJcmMgPSBjb2RlY19kZWJ1Z19wcm9jZXNzX2NkY19wb3dlcihsYnVmKTsKLQl9Ci0KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBjbnQ7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb2RlY19kZWJ1Z19vcHMgPSB7Ci0JLm9wZW4gPSBjb2RlY19kZWJ1Z19vcGVuLAotCS53cml0ZSA9IGNvZGVjX2RlYnVnX3dyaXRlLAotCS5yZWFkID0gY29kZWNfZGVidWdfcmVhZAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHdjZDl4eHhfaTJjICp3Y2Q5eHh4X2kyY19nZXRfZGV2aWNlX2luZm8oc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkJCQl1MTYgcmVnKQotewotCXUxNiBtYXNrID0gMHgwZjAwOwotCWludCB2YWx1ZSA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfaTJjICp3Y2Q5eHh4X2kyYyA9IE5VTEw7Ci0KLQlpZiAod2NkOXh4eC0+dHlwZSA9PSBXQ0Q5MzM1KSB7Ci0JCXdjZDl4eHhfaTJjID0gJndjZDl4eHhfbW9kdWxlc1swXTsKLQl9IGVsc2UgewotCQl2YWx1ZSA9ICgocmVnICYgbWFzaykgPj4gOCkgJiAweDAwMGY7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSAwOgotCQkJd2NkOXh4eF9pMmMgPSAmd2NkOXh4eF9tb2R1bGVzWzBdOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXdjZDl4eHhfaTJjID0gJndjZDl4eHhfbW9kdWxlc1sxXTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQl3Y2Q5eHh4X2kyYyA9ICZ3Y2Q5eHh4X21vZHVsZXNbMl07Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJd2NkOXh4eF9pMmMgPSAmd2NkOXh4eF9tb2R1bGVzWzNdOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiB3Y2Q5eHh4X2kyYzsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X2kyY193cml0ZV9kZXZpY2Uoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHUxNiByZWcsIHU4ICp2YWx1ZSwKLQkJCQl1MzIgYnl0ZXMpCi17Ci0KLQlzdHJ1Y3QgaTJjX21zZyAqbXNnOwotCWludCByZXQgPSAwOwotCXU4IHJlZ19hZGRyID0gMDsKLQl1OCBkYXRhW2J5dGVzICsgMV07Ci0Jc3RydWN0IHdjZDl4eHhfaTJjICp3Y2Q5eHh4X2kyYzsKLQotCXdjZDl4eHhfaTJjID0gd2NkOXh4eF9pMmNfZ2V0X2RldmljZV9pbmZvKHdjZDl4eHgsIHJlZyk7Ci0JaWYgKHdjZDl4eHhfaTJjID09IE5VTEwgfHwgd2NkOXh4eF9pMmMtPmNsaWVudCA9PSBOVUxMKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIGdldCBkZXZpY2UgaW5mb1xuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZWdfYWRkciA9ICh1OClyZWc7Ci0JbXNnID0gJndjZDl4eHhfaTJjLT54ZmVyX21zZ1swXTsKLQltc2ctPmFkZHIgPSB3Y2Q5eHh4X2kyYy0+Y2xpZW50LT5hZGRyOwotCW1zZy0+bGVuID0gYnl0ZXMgKyAxOwotCW1zZy0+ZmxhZ3MgPSAwOwotCWRhdGFbMF0gPSByZWc7Ci0JZGF0YVsxXSA9ICp2YWx1ZTsKLQltc2ctPmJ1ZiA9IGRhdGE7Ci0JcmV0ID0gaTJjX3RyYW5zZmVyKHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkYXB0ZXIsCi0JCQkgICB3Y2Q5eHh4X2kyYy0+eGZlcl9tc2csIDEpOwotCS8qIFRyeSBhZ2FpbiBpZiB0aGUgd3JpdGUgZmFpbHMgKi8KLQlpZiAocmV0ICE9IDEpIHsKLQkJcmV0ID0gaTJjX3RyYW5zZmVyKHdjZDl4eHhfaTJjLT5jbGllbnQtPmFkYXB0ZXIsCi0JCQkJCQl3Y2Q5eHh4X2kyYy0+eGZlcl9tc2csIDEpOwotCQlpZiAocmV0ICE9IDEpIHsKLQkJCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIHRoZSBkZXZpY2VcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlwcl9kZWJ1Zygid3JpdGUgc3VjY2VzcyByZWdpc3RlciA9ICV4IHZhbCA9ICV4XG4iLCByZWcsIGRhdGFbMV0pOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgd2NkOXh4eF9pMmNfcmVhZF9kZXZpY2Uoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCQkgIGludCBieXRlcywgdW5zaWduZWQgY2hhciAqZGVzdCkKLXsKLQlzdHJ1Y3QgaTJjX21zZyAqbXNnOwotCWludCByZXQgPSAwOwotCXU4IHJlZ19hZGRyID0gMDsKLQlzdHJ1Y3Qgd2NkOXh4eF9pMmMgKndjZDl4eHhfaTJjOwotCXU4IGkgPSAwOwotCi0Jd2NkOXh4eF9pMmMgPSB3Y2Q5eHh4X2kyY19nZXRfZGV2aWNlX2luZm8od2NkOXh4eCwgcmVnKTsKLQlpZiAod2NkOXh4eF9pMmMgPT0gTlVMTCB8fCB3Y2Q5eHh4X2kyYy0+Y2xpZW50ID09IE5VTEwpIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IGRldmljZSBpbmZvXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7Ci0JCXJlZ19hZGRyID0gKHU4KXJlZysrOwotCQltc2cgPSAmd2NkOXh4eF9pMmMtPnhmZXJfbXNnWzBdOwotCQltc2ctPmFkZHIgPSB3Y2Q5eHh4X2kyYy0+Y2xpZW50LT5hZGRyOwotCQltc2ctPmxlbiA9IDE7Ci0JCW1zZy0+ZmxhZ3MgPSAwOwotCQltc2ctPmJ1ZiA9ICZyZWdfYWRkcjsKLQotCQltc2cgPSAmd2NkOXh4eF9pMmMtPnhmZXJfbXNnWzFdOwotCQltc2ctPmFkZHIgPSB3Y2Q5eHh4X2kyYy0+Y2xpZW50LT5hZGRyOwotCQltc2ctPmxlbiA9IDE7Ci0JCW1zZy0+ZmxhZ3MgPSBJMkNfTV9SRDsKLQkJbXNnLT5idWYgPSBkZXN0Kys7Ci0JCXJldCA9IGkyY190cmFuc2Zlcih3Y2Q5eHh4X2kyYy0+Y2xpZW50LT5hZGFwdGVyLAotCQkJCXdjZDl4eHhfaTJjLT54ZmVyX21zZywgMik7Ci0KLQkJLyogVHJ5IGFnYWluIGlmIHJlYWQgZmFpbHMgZmlyc3QgdGltZSAqLwotCQlpZiAocmV0ICE9IDIpIHsKLQkJCXJldCA9IGkyY190cmFuc2Zlcih3Y2Q5eHh4X2kyYy0+Y2xpZW50LT5hZGFwdGVyLAotCQkJCQkgICB3Y2Q5eHh4X2kyYy0+eGZlcl9tc2csIDIpOwotCQkJaWYgKHJldCAhPSAyKSB7Ci0JCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVhZCB3Y2Q5eHh4IHJlZ2lzdGVyXG4iKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgd2NkOXh4eF9pMmNfcmVhZChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJaW50IGJ5dGVzLCB2b2lkICpkZXN0LCBib29sIGludGVyZmFjZV9yZWcpCi17Ci0JcmV0dXJuIHdjZDl4eHhfaTJjX3JlYWRfZGV2aWNlKHdjZDl4eHgsIHJlZywgYnl0ZXMsIGRlc3QpOwotfQotCi1pbnQgd2NkOXh4eF9pMmNfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCSBpbnQgYnl0ZXMsIHZvaWQgKnNyYywgYm9vbCBpbnRlcmZhY2VfcmVnKQotewotCXJldHVybiB3Y2Q5eHh4X2kyY193cml0ZV9kZXZpY2Uod2NkOXh4eCwgcmVnLCBzcmMsIGJ5dGVzKTsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X2kyY19nZXRfY2xpZW50X2luZGV4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJCWludCAqd2NkOXh4X2luZGV4KQotewotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChjbGllbnQtPmFkZHIpIHsKLQljYXNlIFdDRDlYWFhfSTJDX1RPUF9TTEFWRV9BRERSOgotCQkqd2NkOXh4X2luZGV4ID0gV0NEOVhYWF9JMkNfVE9QX0xFVkVMOwotCWJyZWFrOwotCWNhc2UgV0NEOVhYWF9BTkFMT0dfSTJDX1NMQVZFX0FERFI6Ci0JCSp3Y2Q5eHhfaW5kZXggPSBXQ0Q5WFhYX0kyQ19BTkFMT0c7Ci0JYnJlYWs7Ci0JY2FzZSBXQ0Q5WFhYX0RJR0lUQUwxX0kyQ19TTEFWRV9BRERSOgotCQkqd2NkOXh4X2luZGV4ID0gV0NEOVhYWF9JMkNfRElHSVRBTF8xOwotCWJyZWFrOwotCWNhc2UgV0NEOVhYWF9ESUdJVEFMMl9JMkNfU0xBVkVfQUREUjoKLQkJKndjZDl4eF9pbmRleCA9IFdDRDlYWFhfSTJDX0RJR0lUQUxfMjsKLQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBOVUxMOwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IE5VTEw7Ci0JaW50IHZhbCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHdjZDl4eF9pbmRleCA9IDA7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCBpbnRmX3R5cGU7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7Ci0KLQlpbnRmX3R5cGUgPSB3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKTsKLQotCXByX2RlYnVnKCIlczogaW50ZXJmYWNlIHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIGludGZfdHlwZSk7Ci0JaWYgKGludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczpDb2RlYyBpcyBkZXRlY3RlZCBpbiBzbGltYnVzIG1vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0gZWxzZSBpZiAoaW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7Ci0JCXJldCA9IHdjZDl4eHhfaTJjX2dldF9jbGllbnRfaW5kZXgoY2xpZW50LCAmd2NkOXh4X2luZGV4KTsKLQkJaWYgKHJldCAhPSAwKQotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogSTJDIHNldCBjb2RlYyBJMkNcbiIKLQkJCQkiY2xpZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQllbHNlIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6cHJvYmUgZm9yIG90aGVyIHNsYXZlc1xuIgotCQkJCSJkZXZpY2VzIG9mIGNvZGVjIEkyQyBzbGF2ZSBBZGRyID0gJXhcbiIsCi0JCQkJX19mdW5jX18sIGNsaWVudC0+YWRkcik7Ci0JCQl3Y2Q5eHh4X21vZHVsZXNbd2NkOXh4X2luZGV4XS5jbGllbnQgPSBjbGllbnQ7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgaWYgKGludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1BST0JJTkcpIHsKLQkJZGV2ID0gJmNsaWVudC0+ZGV2OwotCQlpZiAoY2xpZW50LT5kZXYub2Zfbm9kZSkgewotCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhXG4iCi0JCQkJImZyb20gZGV2aWNlIHRyZWVcbiIsIF9fZnVuY19fKTsKLQkJCXBkYXRhID0gd2NkOXh4eF9wb3B1bGF0ZV9kdF9kYXRhKCZjbGllbnQtPmRldik7Ci0JCQlpZiAoIXBkYXRhKSB7Ci0JCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkJCSIlczogRmFpbCB0byBvYnRhaW4gcGRhdGEgZnJvbSBkZXZpY2UgdHJlZVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZyb21cbiIKLQkJCQkiYm9hcmQgZmlsZVxuIiwgX19mdW5jX18pOwotCQkJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCQl9Ci0JCXdjZDl4eHggPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHdjZDl4eHgpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCF3Y2Q5eHh4KSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJaWYgKCFwZGF0YSkgewotCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhP1xuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXdjZDl4eHgtPnR5cGUgPSBXQ0Q5WFhYOwotCQlpZiAoY2xpZW50LT5kZXYub2Zfbm9kZSkgewotCQkJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uod2NkOXh4eF9vZl9tYXRjaCwgJmNsaWVudC0+ZGV2KTsKLQkJCWlmIChvZl9pZCkgewotCQkJCXdjZDl4eHgtPnR5cGUgPSAqKChpbnQgKilvZl9pZC0+ZGF0YSk7Ci0JCQkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXM6IGNvZGVjIHR5cGUgaXMgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgd2NkOXh4eC0+dHlwZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlczogZGV2Lm9mX25vZGUgaXMgTlVMTCwgZGVmYXVsdCB0byBXQ0Q5WFhYXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQl3Y2Q5eHh4LT50eXBlID0gV0NEOVhYWDsKLQkJfQotCQl3Y2Q5eHh4LT5yZWdtYXAgPSB3Y2Q5eHh4X3JlZ21hcF9pbml0KCZjbGllbnQtPmRldiwKLQkJCQkmd2NkOXh4eF9pMmNfYmFzZV9yZWdtYXBfY29uZmlnKTsKLQkJaWYgKElTX0VSUih3Y2Q5eHh4LT5yZWdtYXApKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHdjZDl4eHgtPnJlZ21hcCk7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycl9jb2RlYzsKLQkJfQotCQl3Y2Q5eHh4LT5yZXNldF9ncGlvID0gcGRhdGEtPnJlc2V0X2dwaW87Ci0JCXdjZDl4eHgtPndjZF9yc3RfbnAgPSBwZGF0YS0+d2NkX3JzdF9ucDsKLQotCQlpZiAoIXdjZDl4eHgtPndjZF9yc3RfbnApIHsKLQkJCXBkYXRhLT51c2VfcGluY3RybCA9IGZhbHNlOwotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogcGluY3RybCBub3QgdXNlZCBmb3IgcnN0X25cbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBlcnJfY29kZWM7Ci0JCX0KLQotCQlpZiAoaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAotCQkJCQkgICAgSTJDX0ZVTkNfSTJDKSA9PSAwKSB7Ci0JCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImNhbid0IHRhbGsgSTJDP1xuIik7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWRldl9zZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYsIHdjZDl4eHgpOwotCQl3Y2Q5eHh4LT5kZXYgPSAmY2xpZW50LT5kZXY7Ci0JCXdjZDl4eHgtPmRldl91cCA9IHRydWU7Ci0JCWlmIChjbGllbnQtPmRldi5vZl9ub2RlKQotCQkJd2NkOXh4eC0+bWNsa19yYXRlID0gcGRhdGEtPm1jbGtfcmF0ZTsKLQotCQl3Y2Q5eHh4LT5udW1fb2Zfc3VwcGxpZXMgPSBwZGF0YS0+bnVtX3N1cHBsaWVzOwotCQlyZXQgPSBtc21fY2RjX2luaXRfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LCAmd2NkOXh4eC0+c3VwcGxpZXMsCi0JCQkJCSAgICBwZGF0YS0+cmVndWxhdG9yLAotCQkJCQkgICAgcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0JCWlmICghd2NkOXh4eC0+c3VwcGxpZXMpIHsKLQkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IENhbm5vdCBpbml0IHdjZCBzdXBwbGllc1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycl9jb2RlYzsKLQkJfQotCQlyZXQgPSBtc21fY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LAotCQkJCQkJICAgICB3Y2Q5eHh4LT5zdXBwbGllcywKLQkJCQkJCSAgICAgcGRhdGEtPnJlZ3VsYXRvciwKLQkJCQkJCSAgICAgcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZCBzdGF0aWMgc3VwcGx5IGVuYWJsZSBmYWlsZWQhXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXJyX2NvZGVjOwotCQl9Ci0JCS8qIEZvciBXQ0Q5MzM1LCBpdCB0YWtlcyBhYm91dCA2MDB1cyBmb3IgdGhlIFZvdXRfQSBhbmQKLQkJICogVm91dF9EIHRvIGJlIHJlYWR5IGFmdGVyIEJVQ0tfU0lETyBpcyBwb3dlcmVkIHVwXAotCQkgKiBTWVNfUlNUX04gc2hvdWxkbid0IGJlIHB1bGxlZCBoaWdoIGR1cmluZyB0aGlzIHRpbWUKLQkJICovCi0JCWlmICh3Y2Q5eHh4LT50eXBlID09IFdDRDkzMzUpCi0JCQl1c2xlZXBfcmFuZ2UoNjAwLCA2NTApOwotCQllbHNlCi0JCQl1c2xlZXBfcmFuZ2UoNSwgMTApOwotCi0JCXJldCA9IHdjZDl4eHhfcmVzZXQod2NkOXh4eC0+ZGV2KTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogUmVzZXR0aW5nIENvZGVjIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJfc3VwcGxpZXM7Ci0JCX0KLQotCQlyZXQgPSB3Y2Q5eHh4X2kyY19nZXRfY2xpZW50X2luZGV4KGNsaWVudCwgJndjZDl4eF9pbmRleCk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJcHJfZXJyKCIlczpTZXQgY29kZWMgSTJDIGNsaWVudCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyX3N1cHBsaWVzOwotCQl9Ci0KLQkJd2NkOXh4eF9tb2R1bGVzW3djZDl4eF9pbmRleF0uY2xpZW50ID0gY2xpZW50OwotCQl3Y2Q5eHh4LT5yZWFkX2RldiA9IHdjZDl4eHhfaTJjX3JlYWQ7Ci0JCXdjZDl4eHgtPndyaXRlX2RldiA9IHdjZDl4eHhfaTJjX3dyaXRlOwotCQlpZiAoIXdjZDl4eHgtPmRldi0+b2Zfbm9kZSkKLQkJCXdjZDl4eHhfYXNzaWduX2lycSgmd2NkOXh4eC0+Y29yZV9yZXMsCi0JCQkJCXBkYXRhLT5pcnEsIHBkYXRhLT5pcnFfYmFzZSk7Ci0KLQkJcmV0ID0gd2NkOXh4eF9kZXZpY2VfaW5pdCh3Y2Q5eHh4KTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZXJyb3IsIGluaXRpYWxpemluZyBkZXZpY2UgZmFpbGVkICglZClcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycl9kZXZpY2VfaW5pdDsKLQkJfQotCi0JCXJldCA9IHdjZDl4eHhfaTJjX3JlYWQod2NkOXh4eCwgV0NEOVhYWF9BX0NISVBfU1RBVFVTLCAxLAotCQkJCSAgICAgICAmdmFsLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVhZCB0aGUgd2NkOXh4eCBzdGF0dXMgKCVkKVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJaWYgKHZhbCAhPSB3Y2Q5eHh4LT5jb2RlY190eXBlLT5pMmNfY2hpcF9zdGF0dXMpCi0JCQlwcl9lcnIoIiVzOiB1bmtub3duIGNoaXAgc3RhdHVzIDB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOwotCi0JCXdjZDl4eHhfc2V0X2ludGZfdHlwZShXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQyk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcl9lcnIoIiVzOiBJMkMgcHJvYmUgaW4gd3Jvbmcgc3RhdGVcbiIsIF9fZnVuY19fKTsKLQotCi1lcnJfZGV2aWNlX2luaXQ6Ci0Jd2NkOXh4eF9yZXNldF9sb3cod2NkOXh4eC0+ZGV2KTsKLWVycl9zdXBwbGllczoKLQltc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LCB3Y2Q5eHh4LT5zdXBwbGllcywKLQkJCQkgcGRhdGEtPnJlZ3VsYXRvciwKLQkJCQkgcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0JcGRhdGEtPnJlZ3VsYXRvciA9IE5VTEw7Ci0JcGRhdGEtPm51bV9zdXBwbGllcyA9IDA7Ci1lcnJfY29kZWM6Ci0JZGV2bV9rZnJlZSgmY2xpZW50LT5kZXYsIHdjZDl4eHgpOwotCWRldl9zZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYsIE5VTEwpOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7Ci0JbXNtX2NkY19yZWxlYXNlX3N1cHBsaWVzKHdjZDl4eHgtPmRldiwgd2NkOXh4eC0+c3VwcGxpZXMsCi0JCQkJIHBkYXRhLT5yZWd1bGF0b3IsCi0JCQkJIHBkYXRhLT5udW1fc3VwcGxpZXMpOwotCXdjZDl4eHhfZGV2aWNlX2V4aXQod2NkOXh4eCk7Ci0JZGV2X3NldF9kcnZkYXRhKCZjbGllbnQtPmRldiwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9kdF9wYXJzZV9zbGltX2ludGVyZmFjZV9kZXZfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsaW1faWZkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLXNsaW0taWZkIiwKLQkJCQkgICAgICAmc2xpbV9pZmQtPm5hbWUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKLQkJCSJxY29tLGNkYy1zbGltLWlmZC1kZXYiLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsCi0JCQkicWNvbSxjZGMtc2xpbS1pZmQtZWxlbWVudGFsLWFkZHIiLCBOVUxMKTsKLQlpZiAoIXByb3ApIHsKLQkJZGV2X2VycihkZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKLQkJCSJxY29tLGNkYy1zbGltLWlmZC1lbGVtZW50YWwtYWRkciIsCi0JCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0gZWxzZSBpZiAocHJvcC0+bGVuZ3RoICE9IDYpIHsKLQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGNvZGVjIHNsaW0gaWZkIGFkZHIuIGFkZHIgbGVuZ3RoID0gJWRcbiIsCi0JCQkgICAgICBwcm9wLT5sZW5ndGgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JbWVtY3B5KHNsaW1faWZkLT5lX2FkZHIsIHByb3AtPnZhbHVlLCA2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9nZXRfbGFkZHIoc3RydWN0IHNsaW1fZGV2aWNlICpzYiwKLQkJCQkgIGNvbnN0IHU4ICplX2FkZHIsIHU4IGVfbGVuLCB1OCAqbGFkZHIpCi17Ci0JaW50IHJldDsKLQljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsKLQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFNMSU1CVVNfUFJFU0VOVF9USU1FT1VUKTsKLQotCWRvIHsKLQkJcmV0ID0gc2xpbV9nZXRfbG9naWNhbF9hZGRyKHNiLCBlX2FkZHIsIGVfbGVuLCBsYWRkcik7Ci0JCWlmICghcmV0KQotCQkJYnJlYWs7Ci0JCS8qIEdpdmUgU0xJTUJVUyB0aW1lIHRvIHJlcG9ydCBwcmVzZW50IGFuZCBiZSByZWFkeS4gKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQlwcl9kZWJ1Z19yYXRlbGltaXRlZCgiJXM6IHJldHlyaW5nIGdldCBsb2dpY2FsIGFkZHJcbiIsCi0JCQkJICAgICBfX2Z1bmNfXyk7Ci0JfSB3aGlsZSB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9zbGltX3Byb2JlKHN0cnVjdCBzbGltX2RldmljZSAqc2xpbSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGE7Ci0JY29uc3Qgc3RydWN0IHNsaW1fZGV2aWNlX2lkICpkZXZpY2VfaWQ7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGludGZfdHlwZTsKLQotCWludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOwotCi0Jd2NkOXh4eCA9IGRldm1fa3phbGxvYygmc2xpbS0+ZGV2LCBzaXplb2Yoc3RydWN0IHdjZDl4eHgpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghd2NkOXh4eCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAoIXNsaW0pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykgewotCQlkZXZfZGJnKCZzbGltLT5kZXYsICIlczpDb2RlYyBpcyBkZXRlY3RlZCBpbiBJMkMgbW9kZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChzbGltLT5kZXYub2Zfbm9kZSkgewotCQlkZXZfaW5mbygmc2xpbS0+ZGV2LCAiUGxhdGZvcm0gZGF0YSBmcm9tIGRldmljZSB0cmVlXG4iKTsKLQkJcGRhdGEgPSB3Y2Q5eHh4X3BvcHVsYXRlX2R0X2RhdGEoJnNsaW0tPmRldik7Ci0JCWlmICghcGRhdGEpIHsKLQkJCWRldl9lcnIoJnNsaW0tPmRldiwKLQkJCQkiJXM6IEZhaWwgdG8gb2J0YWluIHBkYXRhIGZyb20gZGV2aWNlIHRyZWVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJcmV0ID0gd2NkOXh4eF9kdF9wYXJzZV9zbGltX2ludGVyZmFjZV9kZXZfaW5mbygmc2xpbS0+ZGV2LAotCQkJCSZwZGF0YS0+c2xpbWJ1c19zbGF2ZV9kZXZpY2UpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZzbGltLT5kZXYsICJFcnJvciwgcGFyc2luZyBzbGltIGludGVyZmFjZVxuIik7Ci0JCQlkZXZtX2tmcmVlKCZzbGltLT5kZXYsIHBkYXRhKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlzbGltLT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwotCi0JfSBlbHNlIHsKLQkJZGV2X2luZm8oJnNsaW0tPmRldiwgIlBsYXRmb3JtIGRhdGEgZnJvbSBib2FyZCBmaWxlXG4iKTsKLQkJcGRhdGEgPSBzbGltLT5kZXYucGxhdGZvcm1fZGF0YTsKLQl9Ci0KLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIkVycm9yLCBubyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKCFzbGltLT5jdHJsKSB7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBFcnJvciwgbm8gU0xJTUJVUyBjb250cm9sIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2NvZGVjOwotCX0KLQotCWlmIChwZGF0YS0+aGFzX2J1Y2tfdnNlbF9ncGlvKQotCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZShwZGF0YS0+YnVja192c2VsX2N0bF9ucCk7Ci0KLQlkZXZpY2VfaWQgPSBzbGltX2dldF9kZXZpY2VfaWQoc2xpbSk7Ci0JaWYgKCFkZXZpY2VfaWQpIHsKLQkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IEVycm9yLCBubyBkZXZpY2UgaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0Jd2NkOXh4eC0+dHlwZSA9IGRldmljZV9pZC0+ZHJpdmVyX2RhdGE7Ci0JZGV2X2luZm8oJnNsaW0tPmRldiwgIiVzOiBwcm9iaW5nIGZvciB3Y2QgdHlwZTogJWQsIG5hbWU6ICVzXG4iLAotCQkgX19mdW5jX18sIHdjZDl4eHgtPnR5cGUsIGRldmljZV9pZC0+bmFtZSk7Ci0KLQkvKiB3Y2Q5eHh4IG1lbWJlcnMgaW5pdCAqLwotCXdjZDl4eHgtPm11bHRpX3JlZ193cml0ZSA9IHdjZDl4eHhfc2xpbV9tdWx0aV9yZWdfd3JpdGU7Ci0Jd2NkOXh4eC0+c2xpbSA9IHNsaW07Ci0Jc2xpbV9zZXRfY2xpZW50ZGF0YShzbGltLCB3Y2Q5eHh4KTsKLQl3Y2Q5eHh4LT5yZXNldF9ncGlvID0gcGRhdGEtPnJlc2V0X2dwaW87Ci0Jd2NkOXh4eC0+ZGV2ID0gJnNsaW0tPmRldjsKLQl3Y2Q5eHh4LT5tY2xrX3JhdGUgPSBwZGF0YS0+bWNsa19yYXRlOwotCXdjZDl4eHgtPmRldl91cCA9IHRydWU7Ci0Jd2NkOXh4eC0+d2NkX3JzdF9ucCA9IHBkYXRhLT53Y2RfcnN0X25wOwotCi0Jd2NkOXh4eC0+cmVnbWFwID0gd2NkOXh4eF9yZWdtYXBfaW5pdCgmc2xpbS0+ZGV2LAotCQkJCQkgICAgICAmd2NkOXh4eF9iYXNlX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIod2NkOXh4eC0+cmVnbWFwKSkgewotCQlyZXQgPSBQVFJfRVJSKHdjZDl4eHgtPnJlZ21hcCk7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9jb2RlYzsKLQl9Ci0KLQlpZiAoIXdjZDl4eHgtPndjZF9yc3RfbnApIHsKLQkJcGRhdGEtPnVzZV9waW5jdHJsID0gZmFsc2U7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBwaW5jdHJsIG5vdCB1c2VkIGZvciByc3RfblxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnJfY29kZWM7Ci0JfQotCi0Jd2NkOXh4eC0+bnVtX29mX3N1cHBsaWVzID0gcGRhdGEtPm51bV9zdXBwbGllczsKLQlyZXQgPSBtc21fY2RjX2luaXRfc3VwcGxpZXMoJnNsaW0tPmRldiwgJndjZDl4eHgtPnN1cHBsaWVzLAotCQkJCSAgICBwZGF0YS0+cmVndWxhdG9yLAotCQkJCSAgICBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKLQlpZiAoIXdjZDl4eHgtPnN1cHBsaWVzKSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IENhbm5vdCBpbml0IHdjZCBzdXBwbGllc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnJfY29kZWM7Ci0JfQotCXJldCA9IG1zbV9jZGNfZW5hYmxlX3N0YXRpY19zdXBwbGllcyh3Y2Q5eHh4LT5kZXYsCi0JCQkJCSAgICAgd2NkOXh4eC0+c3VwcGxpZXMsCi0JCQkJCSAgICAgcGRhdGEtPnJlZ3VsYXRvciwKLQkJCQkJICAgICBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZCBzdGF0aWMgc3VwcGx5IGVuYWJsZSBmYWlsZWQhXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9jb2RlYzsKLQl9Ci0KLQkvKgotCSAqIEZvciBXQ0Q5MzM1LCBpdCB0YWtlcyBhYm91dCA2MDB1cyBmb3IgdGhlIFZvdXRfQSBhbmQKLQkgKiBWb3V0X0QgdG8gYmUgcmVhZHkgYWZ0ZXIgQlVDS19TSURPIGlzIHBvd2VyZWQgdXAuCi0JICogU1lTX1JTVF9OIHNob3VsZG4ndCBiZSBwdWxsZWQgaGlnaCBkdXJpbmcgdGhpcyB0aW1lCi0JICovCi0JaWYgKHdjZDl4eHgtPnR5cGUgPT0gV0NEOTMzNSB8fCB3Y2Q5eHh4LT50eXBlID09IFdDRDkzNFgpCi0JCXVzbGVlcF9yYW5nZSg2MDAsIDY1MCk7Ci0JZWxzZQotCQl1c2xlZXBfcmFuZ2UoNSwgMTApOwotCi0JcmV0ID0gd2NkOXh4eF9yZXNldCgmc2xpbS0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBSZXNldHRpbmcgQ29kZWMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3N1cHBsaWVzOwotCX0KLQotCXJldCA9IHdjZDl4eHhfc2xpbV9nZXRfbGFkZHIod2NkOXh4eC0+c2xpbSwgd2NkOXh4eC0+c2xpbS0+ZV9hZGRyLAotCQkJCSAgICAgQVJSQVlfU0laRSh3Y2Q5eHh4LT5zbGltLT5lX2FkZHIpLAotCQkJCSAgICAgJndjZDl4eHgtPnNsaW0tPmxhZGRyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBmYWlsZWQgdG8gZ2V0IHNsaW1idXMgJXMgbG9naWNhbCBhZGRyZXNzOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCB3Y2Q5eHh4LT5zbGltLT5uYW1lLCByZXQpOwotCQlnb3RvIGVycl9yZXNldDsKLQl9Ci0Jd2NkOXh4eC0+cmVhZF9kZXYgPSB3Y2Q5eHh4X3NsaW1fcmVhZF9kZXZpY2U7Ci0Jd2NkOXh4eC0+d3JpdGVfZGV2ID0gd2NkOXh4eF9zbGltX3dyaXRlX2RldmljZTsKLQl3Y2Q5eHh4X3BnZF9sYSA9IHdjZDl4eHgtPnNsaW0tPmxhZGRyOwotCXdjZDl4eHgtPnNsaW1fc2xhdmUgPSAmcGRhdGEtPnNsaW1idXNfc2xhdmVfZGV2aWNlOwotCWlmICghd2NkOXh4eC0+ZGV2LT5vZl9ub2RlKQotCQl3Y2Q5eHh4X2Fzc2lnbl9pcnEoJndjZDl4eHgtPmNvcmVfcmVzLAotCQkJCQlwZGF0YS0+aXJxLCBwZGF0YS0+aXJxX2Jhc2UpOwotCi0JcmV0ID0gc2xpbV9hZGRfZGV2aWNlKHNsaW0tPmN0cmwsIHdjZDl4eHgtPnNsaW1fc2xhdmUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IGVycm9yLCBhZGRpbmcgU0xJTUJVUyBkZXZpY2UgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9yZXNldDsKLQl9Ci0KLQlyZXQgPSB3Y2Q5eHh4X3NsaW1fZ2V0X2xhZGRyKHdjZDl4eHgtPnNsaW1fc2xhdmUsCi0JCQkJICAgICB3Y2Q5eHh4LT5zbGltX3NsYXZlLT5lX2FkZHIsCi0JCQkJICAgICBBUlJBWV9TSVpFKHdjZDl4eHgtPnNsaW1fc2xhdmUtPmVfYWRkciksCi0JCQkJICAgICAmd2NkOXh4eC0+c2xpbV9zbGF2ZS0+bGFkZHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmc2xpbS0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgc2xpbWJ1cyAlcyBsb2dpY2FsIGFkZHJlc3M6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHdjZDl4eHgtPnNsaW0tPm5hbWUsIHJldCk7Ci0JCWdvdG8gZXJyX3NsaW1fYWRkOwotCX0KLQl3Y2Q5eHh4X2luZl9sYSA9IHdjZDl4eHgtPnNsaW1fc2xhdmUtPmxhZGRyOwotCXdjZDl4eHhfc2V0X2ludGZfdHlwZShXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpOwotCi0JcmV0ID0gd2NkOXh4eF9kZXZpY2VfaW5pdCh3Y2Q5eHh4KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNsaW0tPmRldiwgIiVzOiBlcnJvciwgaW5pdGlhbGl6aW5nIGRldmljZSBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9zbGltX2FkZDsKLQl9Ci0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZGVidWdDb2RlYyA9IHdjZDl4eHg7Ci0KLQlkZWJ1Z2ZzX3djZDl4eHhfZGVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcgotCQkoIndjZDl4eHhfY29yZSIsIDApOwotCWlmICghSVNfRVJSKGRlYnVnZnNfd2NkOXh4eF9kZW50KSkgewotCQlkZWJ1Z2ZzX3BlZWsgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzbGltc2xhdmVfcGVlayIsCi0JCVNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3djZDl4eHhfZGVudCwKLQkJKHZvaWQgKikgInNsaW1zbGF2ZV9wZWVrIiwgJmNvZGVjX2RlYnVnX29wcyk7Ci0KLQkJZGVidWdmc19wb2tlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2xpbXNsYXZlX3Bva2UiLAotCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc193Y2Q5eHh4X2RlbnQsCi0JCSh2b2lkICopICJzbGltc2xhdmVfcG9rZSIsICZjb2RlY19kZWJ1Z19vcHMpOwotCi0JCWRlYnVnZnNfcG93ZXJfc3RhdGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwb3dlcl9zdGF0ZSIsCi0JCVNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3djZDl4eHhfZGVudCwKLQkJKHZvaWQgKikgInBvd2VyX3N0YXRlIiwgJmNvZGVjX2RlYnVnX29wcyk7Ci0KLQkJZGVidWdmc19yZWdfZHVtcCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInNsaW1zbGF2ZV9yZWdfZHVtcCIsCi0JCVNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3djZDl4eHhfZGVudCwKLQkJKHZvaWQgKikgInNsaW1zbGF2ZV9yZWdfZHVtcCIsICZjb2RlY19kZWJ1Z19vcHMpOwotCX0KLSNlbmRpZgotCi0JcmV0dXJuIHJldDsKLQotZXJyX3NsaW1fYWRkOgotCXNsaW1fcmVtb3ZlX2RldmljZSh3Y2Q5eHh4LT5zbGltX3NsYXZlKTsKLWVycl9yZXNldDoKLQl3Y2Q5eHh4X3Jlc2V0X2xvdyh3Y2Q5eHh4LT5kZXYpOwotZXJyX3N1cHBsaWVzOgotCW1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyh3Y2Q5eHh4LT5kZXYsIHdjZDl4eHgtPnN1cHBsaWVzLAotCQkJCSBwZGF0YS0+cmVndWxhdG9yLAotCQkJCSBwZGF0YS0+bnVtX3N1cHBsaWVzKTsKLWVycl9jb2RlYzoKLQlzbGltX3NldF9jbGllbnRkYXRhKHNsaW0sIE5VTEwpOwotZXJyOgotCWRldm1fa2ZyZWUoJnNsaW0tPmRldiwgd2NkOXh4eCk7Ci0JcmV0dXJuIHJldDsKLX0KLXN0YXRpYyBpbnQgd2NkOXh4eF9zbGltX3JlbW92ZShzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGVidWdmc193Y2Q5eHh4X2RlbnQpOwotI2VuZGlmCi0Jd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEocGRldik7Ci0Jd2NkOXh4eF9kZWluaXRfc2xpbXNsYXZlKHdjZDl4eHgpOwotCXNsaW1fcmVtb3ZlX2RldmljZSh3Y2Q5eHh4LT5zbGltX3NsYXZlKTsKLQltc21fY2RjX3JlbGVhc2Vfc3VwcGxpZXMod2NkOXh4eC0+ZGV2LCB3Y2Q5eHh4LT5zdXBwbGllcywKLQkJCQkgcGRhdGEtPnJlZ3VsYXRvciwKLQkJCQkgcGRhdGEtPm51bV9zdXBwbGllcyk7Ci0Jd2NkOXh4eF9kZXZpY2VfZXhpdCh3Y2Q5eHh4KTsKLQlzbGltX3NldF9jbGllbnRkYXRhKHBkZXYsIE5VTEwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfZGV2aWNlX3VwKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOwotCi0JZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IGNvZGVjIGJyaW5nIHVwXG4iLCBfX2Z1bmNfXyk7Ci0Jd2NkOXh4eF9icmluZ3VwKHdjZDl4eHgtPmRldik7Ci0JcmV0ID0gd2NkOXh4eF9pcnFfaW5pdCh3Y2Q5eHh4X3Jlcyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB3Y2Q5eHhfaXJxX2luaXQgZmFpbGVkIDogJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCX0gZWxzZSB7Ci0JCWlmICh3Y2Q5eHh4LT5wb3N0X3Jlc2V0KQotCQkJcmV0ID0gd2NkOXh4eC0+cG9zdF9yZXNldCh3Y2Q5eHh4KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fZGV2aWNlX3Jlc2V0KHN0cnVjdCBzbGltX2RldmljZSAqc2xkZXYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEoc2xkZXYpOwotCi0JaWYgKCF3Y2Q5eHh4KSB7Ci0JCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIFdhaXQgZm9yIDUwMCBtcyBmb3IgZGV2aWNlIGRvd24gdG8gY29tcGxldGUuIE9ic2VydmVkIGRlbGF5Ci0JICogIG9mIH4yMDBtcyBmb3IgZGV2aWNlIGRvd24gdG8gY29tcGxldGUgYWZ0ZXIgYmVpbmcgY2FsbGVkLAotCSAqIGR1ZSB0byBjb250ZXh0IHN3aXRjaCBpc3N1ZS4KLQkgKi8KLQlyZXQgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZ3Y2Q5eHh4LT5kZXZfdXAsIDAsCi0JCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IHNsaW0gZGV2aWNlIGRvd24gbm90IGNvbXBsZXRlIGluIDUwMCBtc2VjXG4iLAotCQkJCV9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJndjZDl4eHgtPnJlc2V0X2xvY2spOwotCi0JZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IGRldmljZSByZXNldCwgZGV2X3VwID0gJWx1XG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7Ci0JaWYgKHdjZDl4eHgtPmRldl91cCkgewotCQltdXRleF91bmxvY2soJndjZDl4eHgtPnJlc2V0X2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSB3Y2Q5eHh4X3Jlc2V0KHdjZDl4eHgtPmRldik7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogUmVzZXR0aW5nIENvZGVjIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCW11dGV4X3VubG9jaygmd2NkOXh4eC0+cmVzZXRfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfc2xpbV9kZXZpY2VfdXAoc3RydWN0IHNsaW1fZGV2aWNlICpzbGRldikKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEoc2xkZXYpOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF3Y2Q5eHh4KSB7Ci0JCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHNsaW0gZGV2aWNlIHVwLCBkZXZfdXAgPSAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgd2NkOXh4eC0+ZGV2X3VwKTsKLQlpZiAod2NkOXh4eC0+ZGV2X3VwKQotCQlyZXR1cm4gMDsKLQotCXdjZDl4eHgtPmRldl91cCA9IHRydWU7Ci0KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5yZXNldF9sb2NrKTsKLQlyZXQgPSB3Y2Q5eHh4X2RldmljZV91cCh3Y2Q5eHh4KTsKLQltdXRleF91bmxvY2soJndjZDl4eHgtPnJlc2V0X2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fZGV2aWNlX2Rvd24oc3RydWN0IHNsaW1fZGV2aWNlICpzbGRldikKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHNsaW1fZ2V0X2RldmljZWRhdGEoc2xkZXYpOwotCi0JaWYgKCF3Y2Q5eHh4KSB7Ci0JCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5yZXNldF9sb2NrKTsKLQotCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiBkZXZpY2UgZG93biwgZGV2X3VwID0gJWx1XG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHgtPmRldl91cCk7Ci0JaWYgKCF3Y2Q5eHh4LT5kZXZfdXApIHsKLQkJbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5yZXNldF9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHdjZDl4eHgtPmRldl9kb3duKQotCQl3Y2Q5eHh4LT5kZXZfZG93bih3Y2Q5eHh4KTsKLQl3Y2Q5eHh4X2lycV9leGl0KCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7Ci0Jd2NkOXh4eF9yZXNldF9sb3cod2NkOXh4eC0+ZGV2KTsKLQl3Y2Q5eHh4LT5kZXZfdXAgPSBmYWxzZTsKLQltdXRleF91bmxvY2soJndjZDl4eHgtPnJlc2V0X2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9zbGltX3Jlc3VtZShzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gc2xpbV9nZXRfZGV2aWNlZGF0YShzbGRldik7Ci0KLQlyZXR1cm4gd2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUoJndjZDl4eHgtPmNvcmVfcmVzKTsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X2kyY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAod2NkOXh4eCkKLQkJcmV0dXJuIHdjZDl4eHhfY29yZV9yZXNfcmVzdW1lKCZ3Y2Q5eHh4LT5jb3JlX3Jlcyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3Y2Q5eHh4X3NsaW1fc3VzcGVuZChzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsZGV2LCBwbV9tZXNzYWdlX3QgcG1lc2cpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBzbGltX2dldF9kZXZpY2VkYXRhKHNsZGV2KTsKLQotCXJldHVybiB3Y2Q5eHh4X2NvcmVfcmVzX3N1c3BlbmQoJndjZDl4eHgtPmNvcmVfcmVzLCBwbWVzZyk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlwbV9tZXNzYWdlX3QgcG1lc2cgPSB7MH07Ci0KLQlpZiAod2NkOXh4eCkKLQkJcmV0dXJuIHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCgmd2NkOXh4eC0+Y29yZV9yZXMsIHBtZXNnKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNsaW1fZGV2aWNlX2lkIHdjZF9zbGltX2RldmljZV9pZFtdID0gewotCXsic2l0YXItc2xpbSIsIDB9LAotCXsic2l0YXIxcDEtc2xpbSIsIDB9LAotCXsidGFibGEtc2xpbSIsIDB9LAotCXsidGFibGEyeC1zbGltIiwgMH0sCi0JeyJ0YWlrby1zbGltLXBnZCIsIDB9LAotCXsidGFwYW4tc2xpbS1wZ2QiLCAwfSwKLQl7InRvbXRvbS1zbGltLXBnZCIsIFdDRDkzMzB9LAotCXsidGFzaGEtc2xpbS1wZ2QiLCBXQ0Q5MzM1fSwKLQl7InRhdmlsLXNsaW0tcGdkIiwgV0NEOTM0WH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2xpbV9kcml2ZXIgd2NkX3NsaW1fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndjZC1zbGltIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUgPSB3Y2Q5eHh4X3NsaW1fcHJvYmUsCi0JLnJlbW92ZSA9IHdjZDl4eHhfc2xpbV9yZW1vdmUsCi0JLmlkX3RhYmxlID0gd2NkX3NsaW1fZGV2aWNlX2lkLAotCS5yZXN1bWUgPSB3Y2Q5eHh4X3NsaW1fcmVzdW1lLAotCS5zdXNwZW5kID0gd2NkOXh4eF9zbGltX3N1c3BlbmQsCi0JLmRldmljZV91cCA9IHdjZDl4eHhfc2xpbV9kZXZpY2VfdXAsCi0JLnJlc2V0X2RldmljZSA9IHdjZDl4eHhfc2xpbV9kZXZpY2VfcmVzZXQsCi0JLmRldmljZV9kb3duID0gd2NkOXh4eF9zbGltX2RldmljZV9kb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdjZDl4eHhfaWRfdGFibGVbXSA9IHsKLQl7IndjZDl4eHgtaTJjIiwgV0NEOVhYWF9JMkNfVE9QX0xFVkVMfSwKLQl7IndjZDl4eHgtaTJjIiwgV0NEOVhYWF9JMkNfQU5BTE9HfSwKLQl7IndjZDl4eHgtaTJjIiwgV0NEOVhYWF9JMkNfRElHSVRBTF8xfSwKLQl7IndjZDl4eHgtaTJjIiwgV0NEOVhYWF9JMkNfRElHSVRBTF8yfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRhc2hhX2lkX3RhYmxlW10gPSB7Ci0JeyJ0YXNoYS1pMmMtcGdkIiwgV0NEOVhYWF9JMkNfVE9QX0xFVkVMfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRhYmxhX2lkX3RhYmxlW10gPSB7Ci0JeyJ0YWJsYSB0b3AgbGV2ZWwiLCBXQ0Q5WFhYX0kyQ19UT1BfTEVWRUx9LAotCXsidGFibGEgYW5hbG9nIiwgV0NEOVhYWF9JMkNfQU5BTE9HfSwKLQl7InRhYmxhIGRpZ2l0YWwxIiwgV0NEOVhYWF9JMkNfRElHSVRBTF8xfSwKLQl7InRhYmxhIGRpZ2l0YWwyIiwgV0NEOVhYWF9JMkNfRElHSVRBTF8yfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0YWJsYV9pZF90YWJsZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB3Y2Q5eHh4X2kyY19wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSB3Y2Q5eHh4X2kyY19zdXNwZW5kLAotCS5yZXN1bWUJPSB3Y2Q5eHh4X2kyY19yZXN1bWUsCi19OwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdGFibGFfaTJjX2RyaXZlciA9IHsKLQkuZHJpdmVyICAgICAgICAgICAgICAgICA9IHsKLQkJLm93bmVyICAgICAgICAgID0gICAgICAgVEhJU19NT0RVTEUsCi0JCS5uYW1lICAgICAgICAgICA9ICAgICAgICJ0YWJsYS1pMmMtY29yZSIsCi0JCS5wbQkJPQkmd2NkOXh4eF9pMmNfcG1fb3BzLAotCX0sCi0JLmlkX3RhYmxlICAgICAgICAgICAgICAgPSAgICAgICB0YWJsYV9pZF90YWJsZSwKLQkucHJvYmUgICAgICAgICAgICAgICAgICA9ICAgICAgIHdjZDl4eHhfaTJjX3Byb2JlLAotCS5yZW1vdmUgICAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pMmNfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdjZDl4eHhfaTJjX2RyaXZlciA9IHsKLQkuZHJpdmVyICAgICAgICAgICAgICAgICA9IHsKLQkJLm93bmVyICAgICAgICAgID0gICAgICAgVEhJU19NT0RVTEUsCi0JCS5uYW1lICAgICAgICAgICA9ICAgICAgICJ3Y2Q5eHh4LWkyYy1jb3JlIiwKLQkJLnBtCQk9CSZ3Y2Q5eHh4X2kyY19wbV9vcHMsCi0JfSwKLQkuaWRfdGFibGUgICAgICAgICAgICAgICA9ICAgICAgIHdjZDl4eHhfaWRfdGFibGUsCi0JLnByb2JlICAgICAgICAgICAgICAgICAgPSAgICAgICB3Y2Q5eHh4X2kyY19wcm9iZSwKLQkucmVtb3ZlICAgICAgICAgICAgICAgICA9ICAgICAgIHdjZDl4eHhfaTJjX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB3Y2Q5MzM1X2kyY19kcml2ZXIgPSB7Ci0JLmRyaXZlcgkgICAgICAgICAgICAgICAgPSB7Ci0JCS5vd25lcgkgICAgICAgID0gICAgICAgVEhJU19NT0RVTEUsCi0JCS5uYW1lICAgICAgICAgICA9ICAgICAgICJ0YXNoYS1pMmMtY29yZSIsCi0JCS5wbQkJPQkmd2NkOXh4eF9pMmNfcG1fb3BzLAotCX0sCi0JLmlkX3RhYmxlICAgICAgICAgICAgICAgPSAgICAgICB0YXNoYV9pZF90YWJsZSwKLQkucHJvYmUgICAgICAgICAgICAgICAgICA9ICAgICAgIHdjZDl4eHhfaTJjX3Byb2JlLAotCS5yZW1vdmUgICAgICAgICAgICAgICAgID0gICAgICAgd2NkOXh4eF9pMmNfcmVtb3ZlLAotfTsKLQotaW50IHdjZDl4eHhfaW5pdCh2b2lkKQotewotCWludCByZXRbTlVNX1dDRDlYWFhfUkVHX1JFVF0gPSB7MH07Ci0JaW50IGkgPSAwOwotCi0Jd2NkOXh4eF9zZXRfaW50Zl90eXBlKFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfUFJPQklORyk7Ci0KLQlyZXRbMF0gPSBpMmNfYWRkX2RyaXZlcigmdGFibGFfaTJjX2RyaXZlcik7Ci0JaWYgKHJldFswXSkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFkZCB0aGUgdGFibGEyeCBJMkMgZHJpdmVyOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXRbMF0pOwotCi0JcmV0WzFdID0gaTJjX2FkZF9kcml2ZXIoJndjZDl4eHhfaTJjX2RyaXZlcik7Ci0JaWYgKHJldFsxXSkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFkZCB0aGUgd2NkOXh4eCBJMkMgZHJpdmVyOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXRbMV0pOwotCi0JcmV0WzJdID0gaTJjX2FkZF9kcml2ZXIoJndjZDkzMzVfaTJjX2RyaXZlcik7Ci0JaWYgKHJldFsyXSkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFkZCB0aGUgd2NkOTMzNSBJMkMgZHJpdmVyOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXRbMl0pOwotCi0JcmV0WzNdID0gc2xpbV9kcml2ZXJfcmVnaXN0ZXIoJndjZF9zbGltX2RyaXZlcik7Ci0JaWYgKHJldFszXSkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIHdjZCBTQiBkcml2ZXI6ICVkXG4iLAotCQkJX19mdW5jX18sIHJldFszXSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1dDRDlYWFhfUkVHX1JFVDsgaSsrKSB7Ci0JCWlmIChyZXRbaV0pCi0JCQlyZXR1cm4gcmV0W2ldOwotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIHdjZDl4eHhfZXhpdCh2b2lkKQotewotCXdjZDl4eHhfc2V0X2ludGZfdHlwZShXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1BST0JJTkcpOwotCi0JaTJjX2RlbF9kcml2ZXIoJnRhYmxhX2kyY19kcml2ZXIpOwotCWkyY19kZWxfZHJpdmVyKCZ3Y2Q5eHh4X2kyY19kcml2ZXIpOwotCWkyY19kZWxfZHJpdmVyKCZ3Y2Q5MzM1X2kyY19kcml2ZXIpOwotCXNsaW1fZHJpdmVyX3VucmVnaXN0ZXIoJndjZF9zbGltX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQ29kZWMgY29yZSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDl4eHgtaXJxLmMgYi9kcml2ZXJzL21mZC93Y2Q5eHh4LWlycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjk4MDgzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDl4eHgtaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotI2luY2x1ZGUgPHNvYy9xY29tL3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLQotI2RlZmluZSBCWVRFX0JJVF9NQVNLKG5yKQkJKDFVTCA8PCAoKG5yKSAlIEJJVFNfUEVSX0JZVEUpKQotI2RlZmluZSBCSVRfQllURShucikJCQkoKG5yKSAvIEJJVFNfUEVSX0JZVEUpCi0KLSNkZWZpbmUgV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMgMTAwCi0KLSNpZm5kZWYgTk9fSVJRCi0jZGVmaW5lIE5PX0lSUQkoLTEpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19PRgotc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhIHsKLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOwotCWludCBpcnE7Ci19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgdmlycV90b19waHlpcnEoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCB2aXJxKTsKLXN0YXRpYyBpbnQgcGh5aXJxX3RvX3ZpcnEoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBpcnEpOwotc3RhdGljIHVuc2lnbmVkIGludCB3Y2Q5eHh4X2lycV9nZXRfdXBzdHJlYW1faXJxKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKLXN0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX3B1dF9kb3duc3RyZWFtX2lycSgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7Ci1zdGF0aWMgdm9pZCB3Y2Q5eHh4X2lycV9wdXRfdXBzdHJlYW1faXJxKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKLXN0YXRpYyBpbnQgd2NkOXh4eF9tYXBfaXJxKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxKTsKLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQotCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JbXV0ZXhfbG9jaygmd2NkOXh4eF9yZXMtPmlycV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0KLQkJCWlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWludCBpOwotCi0JaWYgKChBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKSA+Ci0JICAgICBXQ0Q5WFhYX01BWF9JUlFfUkVHUykgfHwKLQkgICAgIChBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY2FjaGUpID4KLQkgICAgICBXQ0Q5WFhYX01BWF9JUlFfUkVHUykpIHsKLQkJcHJfZXJyKCIlczogQXJyYXkgU2l6ZSBvdXQgb2YgYm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKLQkJcHJfZXJyKCIlczogQ29kZWMgY29yZSByZWdtYXAgbm90IGRlZmluZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cik7IGkrKykgewotCQkvKiBJZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIG1hc2sgd3JpdGUgaXQgYmFjawotCQkgKiB0byB0aGUgaGFyZHdhcmUuCi0JCSAqLwotCQlpZiAod2NkOXh4eF9yZXMtPmlycV9tYXNrc19jdXJbaV0gIT0KLQkJCQkJd2NkOXh4eF9yZXMtPmlycV9tYXNrc19jYWNoZVtpXSkgewotCi0JCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2NhY2hlW2ldID0KLQkJCQkJd2NkOXh4eF9yZXMtPmlycV9tYXNrc19jdXJbaV07Ci0JCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSArIGksCi0JCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cltpXSk7Ci0JCX0KLQl9Ci0KLQltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5pcnFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQotCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JaW50IHdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7Ci0JaW50IGJ5dGUgPSBCSVRfQllURSh3Y2Q5eHh4X2lycSk7Ci0JaW50IHNpemUgPSBBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKTsKLQotCWlmICgoYnl0ZSA8IHNpemUpICYmIChieXRlID49IDApKSB7Ci0JCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW2J5dGVdICY9Ci0JCQl+KEJZVEVfQklUX01BU0sod2NkOXh4eF9pcnEpKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBBcnJheSBzaXplIGlzICVkIGJ1dCBpbmRleCBpcyAlZDogT3V0IG9mIHJhbmdlXG4iLAotCQkJX19mdW5jX18sIHNpemUsIGJ5dGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPQotCQkJaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JaW50IHdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7Ci0JaW50IGJ5dGUgPSBCSVRfQllURSh3Y2Q5eHh4X2lycSk7Ci0JaW50IHNpemUgPSBBUlJBWV9TSVpFKHdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyKTsKLQotCWlmICgoYnl0ZSA8IHNpemUpICYmIChieXRlID49IDApKSB7Ci0JCXdjZDl4eHhfcmVzLT5pcnFfbWFza3NfY3VyW2J5dGVdCi0JCQl8PSBCWVRFX0JJVF9NQVNLKHdjZDl4eHhfaXJxKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBBcnJheSBzaXplIGlzICVkIGJ1dCBpbmRleCBpcyAlZDogT3V0IG9mIHJhbmdlXG4iLAotCQkJX19mdW5jX18sIHNpemUsIGJ5dGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlpbnQgd2NkOXh4eF9pcnEgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzID0KLQkJCWlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCi0JaWYgKHdjZDl4eHhfcmVzID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogd2NkOXh4eF9yZXMgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCXdjZDl4eHhfaXJxID0gdmlycV90b19waHlpcnEod2NkOXh4eF9yZXMsIGRhdGEtPmlycSk7Ci0JcHJfZGVidWcoIiVzOiBJUlFfQUNLIGNhbGxlZCBmb3IgV0NEOVhYWCBJUlE6ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3Y2Q5eHh4X2lycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCS8qIGRvIG5vdGhpbmcgYnV0IHJlcXVpcmVkIGFzIGxpbnV4IGNhbGxzIGlycV9tYXNrIHdpdGhvdXQgTlVMTCBjaGVjayAqLwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHdjZDl4eHhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgPSAid2NkOXh4eCIsCi0JLmlycV9idXNfbG9jayA9IHdjZDl4eHhfaXJxX2xvY2ssCi0JLmlycV9idXNfc3luY191bmxvY2sgPSB3Y2Q5eHh4X2lycV9zeW5jX3VubG9jaywKLQkuaXJxX2Rpc2FibGUgPSB3Y2Q5eHh4X2lycV9kaXNhYmxlLAotCS5pcnFfZW5hYmxlID0gd2NkOXh4eF9pcnFfZW5hYmxlLAotCS5pcnFfbWFzayA9IHdjZDl4eHhfaXJxX21hc2ssCi0JLmlycV9hY2sgPSB3Y2Q5eHh4X2lycV9hY2ssCi19OwotCi1ib29sIHdjZDl4eHhfbG9ja19zbGVlcCgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQllbnVtIHdjZDl4eHhfcG1fc3RhdGUgb3M7Ci0KLQkvKgotCSAqIHdjZDl4eHhfe2xvY2svdW5sb2NrfV9zbGVlcCB3aWxsIGJlIGNhbGxlZCBieSB3Y2Q5eHh4X2lycV90aHJlYWQKLQkgKiBhbmQgaXRzIHN1YnJvdXRpbmVzIG9ubHkgbW90bHkuCi0JICogYnV0IGJ0bjBfbHByZXNzX2ZuIGlzIG5vdCB3Y2Q5eHh4X2lycV90aHJlYWQncyBzdWJyb3V0aW5lIGFuZAotCSAqIEl0IGNhbiByYWNlIHdpdGggd2NkOXh4eF9pcnFfdGhyZWFkLgotCSAqIFNvIG5lZWQgdG8gZW1icmFjZSB3bG9ja19ob2xkZXJzIHdpdGggbXV0ZXguCi0JICoKLQkgKiBJZiBzeXN0ZW0gZGlkbid0IHJlc3VtZSwgd2UgY2FuIHNpbXBseSByZXR1cm4gZmFsc2Ugc28gY29kZWMgZHJpdmVyJ3MKLQkgKiBJUlEgaGFuZGxlciBjYW4gcmV0dXJuIHdpdGhvdXQgaGFuZGxpbmcgSVJRLgotCSAqIEFzIGludGVycnVwdCBsaW5lIGlzIHN0aWxsIGFjdGl2ZSwgY29kZWMgd2lsbCBoYXZlIGFub3RoZXIgSVJRIHRvCi0JICogcmV0cnkgc2hvcnRseS4KLQkgKi8KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4X3Jlcy0+cG1fbG9jayk7Ci0JaWYgKHdjZDl4eHhfcmVzLT53bG9ja19ob2xkZXJzKysgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IGhvbGRpbmcgd2FrZSBsb2NrXG4iLCBfX2Z1bmNfXyk7Ci0JCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmd2NkOXh4eF9yZXMtPnBtX3Fvc19yZXEsCi0JCQkJICAgICAgbXNtX2NwdWlkbGVfZ2V0X2RlZXBfaWRsZV9sYXRlbmN5KCkpOwotCQlwbV9zdGF5X2F3YWtlKHdjZDl4eHhfcmVzLT5kZXYpOwotCX0KLQltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5wbV9sb2NrKTsKLQotCWlmICghd2FpdF9ldmVudF90aW1lb3V0KHdjZDl4eHhfcmVzLT5wbV93cSwKLQkJCQkoKG9zID0gIHdjZDl4eHhfcG1fY21weGNoZyh3Y2Q5eHh4X3JlcywKLQkJCQkJCSAgV0NEOVhYWF9QTV9TTEVFUEFCTEUsCi0JCQkJCQkgIFdDRDlYWFhfUE1fQVdBS0UpKSA9PQotCQkJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFIHx8Ci0JCQkJCShvcyA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSksCi0JCQkJbXNlY3NfdG9famlmZmllcygKLQkJCQkJV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMpKSkgewotCQlwcl93YXJuKCIlczogc3lzdGVtIGRpZG4ndCByZXN1bWUgd2l0aGluICVkbXMsIHMgJWQsIHcgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCVdDRDlYWFhfU1lTVEVNX1JFU1VNRV9USU1FT1VUX01TLCB3Y2Q5eHh4X3Jlcy0+cG1fc3RhdGUsCi0JCQl3Y2Q5eHh4X3Jlcy0+d2xvY2tfaG9sZGVycyk7Ci0JCXdjZDl4eHhfdW5sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQl3YWtlX3VwX2FsbCgmd2NkOXh4eF9yZXMtPnBtX3dxKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9sb2NrX3NsZWVwKTsKLQotdm9pZCB3Y2Q5eHh4X3VubG9ja19zbGVlcCgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQltdXRleF9sb2NrKCZ3Y2Q5eHh4X3Jlcy0+cG1fbG9jayk7Ci0JaWYgKC0td2NkOXh4eF9yZXMtPndsb2NrX2hvbGRlcnMgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2luZyB3YWtlIGxvY2sgcG1fc3RhdGUgJWQgLT4gJWRcbiIsCi0JCQkgX19mdW5jX18sIHdjZDl4eHhfcmVzLT5wbV9zdGF0ZSwgV0NEOVhYWF9QTV9TTEVFUEFCTEUpOwotCQkvKgotCQkgKiBpZiB3Y2Q5eHh4X2xvY2tfc2xlZXAgZmFpbGVkLCBwbV9zdGF0ZSB3b3VsZCBiZSBzdGlsbAotCQkgKiBXQ0Q5WFhYX1BNX0FTTEVFUCwgZG9uJ3Qgb3ZlcndyaXRlCi0JCSAqLwotCQlpZiAobGlrZWx5KHdjZDl4eHhfcmVzLT5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSkKLQkJCXdjZDl4eHhfcmVzLT5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOwotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJndjZDl4eHhfcmVzLT5wbV9xb3NfcmVxLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJcG1fcmVsYXgod2NkOXh4eF9yZXMtPmRldik7Ci0JfQotCW11dGV4X3VubG9jaygmd2NkOXh4eF9yZXMtPnBtX2xvY2spOwotCXdha2VfdXBfYWxsKCZ3Y2Q5eHh4X3Jlcy0+cG1fd3EpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3VubG9ja19zbGVlcCk7Ci0KLXZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2soc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpCi17Ci0JbXV0ZXhfbG9jaygmd2NkOXh4eF9yZXMtPm5lc3RlZF9pcnFfbG9jayk7Ci19Ci0KLXZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX3VubG9jayhzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQltdXRleF91bmxvY2soJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOwotfQotCi0KLXN0YXRpYyB2b2lkIHdjZDl4eHhfaXJxX2Rpc3BhdGNoKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAotCQkJc3RydWN0IGludHJfZGF0YSAqaXJxZGF0YSkKLXsKLQlpbnQgaXJxYml0ID0gaXJxZGF0YS0+aW50cl9udW07Ci0KLQlpZiAoIXdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXApIHsKLQkJcHJfZXJyKCIlczogY29kZWMgY29yZSByZWdtYXAgbm90IGRlZmluZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXJxZGF0YS0+Y2xlYXJfZmlyc3QpIHsKLQkJd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2sod2NkOXh4eF9yZXMpOwotCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gKwotCQkJCQkgICAgICBCSVRfQllURShpcnFiaXQpLAotCQkJQllURV9CSVRfTUFTSyhpcnFiaXQpKTsKLQotCQlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCi0JCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCQl3Y2Q5eHh4X3Jlcy0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0NMUl9DT01NSVRdLAotCQkJCTB4MDIpOwotCQloYW5kbGVfbmVzdGVkX2lycShwaHlpcnFfdG9fdmlycSh3Y2Q5eHh4X3JlcywgaXJxYml0KSk7Ci0JCXdjZDl4eHhfbmVzdGVkX2lycV91bmxvY2sod2NkOXh4eF9yZXMpOwotCX0gZWxzZSB7Ci0JCXdjZDl4eHhfbmVzdGVkX2lycV9sb2NrKHdjZDl4eHhfcmVzKTsKLQkJaGFuZGxlX25lc3RlZF9pcnEocGh5aXJxX3RvX3ZpcnEod2NkOXh4eF9yZXMsIGlycWJpdCkpOwotCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gKwotCQkJCQkgICAgICBCSVRfQllURShpcnFiaXQpLAotCQkJQllURV9CSVRfTUFTSyhpcnFiaXQpKTsKLQkJaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQotCQkJcmVnbWFwX3dyaXRlKHdjZDl4eHhfcmVzLT53Y2RfY29yZV9yZWdtYXAsCi0JCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTFJfQ09NTUlUXSwKLQkJCQkweDAyKTsKLQotCQl3Y2Q5eHh4X25lc3RlZF9pcnFfdW5sb2NrKHdjZDl4eHhfcmVzKTsKLQl9Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCXN0cnVjdCBpbnRyX2RhdGEgaXJxZGF0YTsKLQljaGFyIGxpbmVidWZbMTI4XTsKLQlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUgKiBIWiwgMSk7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMgPSBkYXRhOwotCWludCBudW1faXJxX3JlZ3MgPSB3Y2Q5eHh4X3Jlcy0+bnVtX2lycV9yZWdzOwotCXU4IHN0YXR1c1s0XSwgc3RhdHVzMVs0XSA9IHswfSwgdW5tYXNrX3N0YXR1c1s0XSA9IHswfTsKLQotCWlmICh1bmxpa2VseSh3Y2Q5eHh4X2xvY2tfc2xlZXAod2NkOXh4eF9yZXMpID09IGZhbHNlKSkgewotCQlkZXZfZXJyKHdjZDl4eHhfcmVzLT5kZXYsICJGYWlsZWQgdG8gaG9sZCBzdXNwZW5kXG4iKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCWlmICghd2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCkgewotCQlkZXZfZXJyKHdjZDl4eHhfcmVzLT5kZXYsCi0JCQkiJXM6IENvZGVjIGNvcmUgcmVnbWFwIG5vdCBzdXBwbGllZFxuIiwKLQkJCSAgIF9fZnVuY19fKTsKLQkJZ290byBlcnJfZGlzYWJsZV9pcnE7Ci0JfQotCi0JbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOwotCXJldCA9IHJlZ21hcF9idWxrX3JlYWQod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9TVEFUVVNfQkFTRV0sCi0JCXN0YXR1cywgbnVtX2lycV9yZWdzKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKLQkJCQkiRmFpbGVkIHRvIHJlYWQgaW50ZXJydXB0IHN0YXR1czogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfaXJxOwotCX0KLQkvKgotCSAqIElmIHN0YXR1cyBpcyAwIHJldHVybiB3aXRob3V0IGNsZWFyaW5nLgotCSAqIHN0YXR1cyBjb250YWluczogSFcgc3RhdHVzIC0gbWFza2VkIGludGVycnVwdHMKLQkgKiBzdGF0dXMxIGNvbnRhaW5zOiB1bmhhbmRsZWQgaW50ZXJydXB0cyAtIG1hc2tlZCBpbnRlcnJ1cHRzCi0JICogdW5tYXNrZWRfc3RhdHVzIGNvbnRhaW5zOiB1bmhhbmRsZWQgaW50ZXJydXB0cwotCSAqLwotCWlmICh1bmxpa2VseSghbWVtY21wKHN0YXR1cywgc3RhdHVzMSwgc2l6ZW9mKHN0YXR1cykpKSkgewotCQlwcl9kZWJ1ZygiJXM6IHN0YXR1cyBpcyAwXG4iLCBfX2Z1bmNfXyk7Ci0JCXdjZDl4eHhfdW5sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCS8qCi0JICogQ29weSBzdGF0dXMgdG8gdW5tYXNrX3N0YXR1cyBiZWZvcmUgbWFza2luZywgb3RoZXJ3aXNlIFNXIG1heSBtaXNzCi0JICogdG8gY2xlYXIgbWFza2VkIGludGVycnVwdCBpbiBjb3JuZXIgY2FzZS4KLQkgKi8KLQltZW1jcHkodW5tYXNrX3N0YXR1cywgc3RhdHVzLCBzaXplb2YodW5tYXNrX3N0YXR1cykpOwotCi0JLyogQXBwbHkgbWFza2luZyAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1faXJxX3JlZ3M7IGkrKykKLQkJc3RhdHVzW2ldICY9IH53Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cltpXTsKLQotCW1lbWNweShzdGF0dXMxLCBzdGF0dXMsIHNpemVvZihzdGF0dXMxKSk7Ci0KLQkvKiBGaW5kIG91dCB3aGljaCBpbnRlcnJ1cHQgd2FzIHRyaWdnZXJlZCBhbmQgY2FsbCB0aGF0IGludGVycnVwdCdzCi0JICogaGFuZGxlciBmdW5jdGlvbgotCSAqCi0JICogU2luY2UgY29kZWMgaGFzIG9ubHkgb25lIGhhcmR3YXJlIGlycSBsaW5lIHdoaWNoIGlzIHNoYXJlZCBieQotCSAqIGNvZGVjJ3MgZGlmZmVyZW50IGludGVybmFsIGludGVycnVwdHMsIHNvIGl0J3MgcG9zc2libGUgbWFzdGVyIGlycQotCSAqIGhhbmRsZXIgZGlzcGF0Y2hlcyBtdWx0aXBsZSBuZXN0ZWQgaXJxIGhhbmRsZXJzIGFmdGVyIGJyZWFraW5nCi0JICogb3JkZXIuICBEaXNwYXRjaCBpbnRlcnJ1cHRzIGluIHRoZSBvcmRlciB0aGF0IGlzIG1haW50YWluZWQgYnkKLQkgKiB0aGUgaW50ZXJydXB0IHRhYmxlLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCB3Y2Q5eHh4X3Jlcy0+aW50cl90YWJsZV9zaXplOyBpKyspIHsKLQkJaXJxZGF0YSA9IHdjZDl4eHhfcmVzLT5pbnRyX3RhYmxlW2ldOwotCQlpZiAoc3RhdHVzW0JJVF9CWVRFKGlycWRhdGEuaW50cl9udW0pXSAmCi0JCQlCWVRFX0JJVF9NQVNLKGlycWRhdGEuaW50cl9udW0pKSB7Ci0JCQl3Y2Q5eHh4X2lycV9kaXNwYXRjaCh3Y2Q5eHh4X3JlcywgJmlycWRhdGEpOwotCQkJc3RhdHVzMVtCSVRfQllURShpcnFkYXRhLmludHJfbnVtKV0gJj0KLQkJCQkJfkJZVEVfQklUX01BU0soaXJxZGF0YS5pbnRyX251bSk7Ci0JCQl1bm1hc2tfc3RhdHVzW0JJVF9CWVRFKGlycWRhdGEuaW50cl9udW0pXSAmPQotCQkJCQl+QllURV9CSVRfTUFTSyhpcnFkYXRhLmludHJfbnVtKTsKLQkJfQotCX0KLQotCS8qCi0JICogQXMgYSBmYWlsc2FmZSBpZiB1bmhhbmRsZWQgaXJxIGlzIGZvdW5kLCBjbGVhciBpdCB0byBwcmV2ZW50Ci0JICogaW50ZXJydXB0IHN0b3JtLgotCSAqIE5vdGUgdGhhdCB3ZSBjYW4gc2F5IHRoZXJlIHdhcyBhbiB1bmhhbmRsZWQgaXJxIG9ubHkgd2hlbiBubyBpcnEKLQkgKiBoYW5kbGVkIGJ5IG5lc3RlZCBpcnEgaGFuZGxlciBzaW5jZSBUYWlrbyBzdXBwb3J0cyBxZHNwIGFzIGlycXMnCi0JICogZGVzdGluYXRpb24gZm9yIGZldyBpcnFzLiAgVGhlcmVmb3JlIGRyaXZlciBzaG91bGRuJ3QgY2xlYXIgcGVuZGluZwotCSAqIGlycXMgd2hlbiBmZXcgaGFuZGxlZCB3aGlsZSBmZXcgb3RoZXJzIG5vdC4KLQkgKi8KLQlpZiAodW5saWtlbHkoIW1lbWNtcChzdGF0dXMsIHN0YXR1czEsIHNpemVvZihzdGF0dXMpKSkpIHsKLQkJaWYgKF9fcmF0ZWxpbWl0KCZyYXRlbGltaXQpKSB7Ci0JCQlwcl93YXJuKCIlczogVW5oYW5kbGVkIGlycSBmb3VuZFxuIiwgX19mdW5jX18pOwotCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHN0YXR1cywgc2l6ZW9mKHN0YXR1cyksIDE2LCAxLAotCQkJCQkgICBsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIGZhbHNlKTsKLQkJCXByX3dhcm4oIiVzOiBzdGF0dXMwIDogJXNcbiIsIF9fZnVuY19fLCBsaW5lYnVmKTsKLQkJCWhleF9kdW1wX3RvX2J1ZmZlcihzdGF0dXMxLCBzaXplb2Yoc3RhdHVzMSksIDE2LCAxLAotCQkJCQkgICBsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIGZhbHNlKTsKLQkJCXByX3dhcm4oIiVzOiBzdGF0dXMxIDogJXNcbiIsIF9fZnVuY19fLCBsaW5lYnVmKTsKLQkJfQotCQkvKgotCQkgKiB1bm1hc2tfc3RhdHVzIGNvbnRhaW5zIHVuaGFuZGxlZCBpbnRlcnJ1cHRzLCBoZW5jZSBjbGVhciBhbGwKLQkJICogdW5oYW5kbGVkIGludGVycnVwdHMuCi0JCSAqLwotCQlyZXQgPSByZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwLAotCQkJd2NkOXh4eF9yZXMtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTEVBUl9CQVNFXSwKLQkJCXVubWFza19zdGF0dXMsIG51bV9pcnFfcmVncyk7Ci0JCWlmICh3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykKLQkJCXJlZ21hcF93cml0ZSh3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwLAotCQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xSX0NPTU1JVF0sCi0JCQkJMHgwMik7Ci0JfQotCXdjZDl4eHhfdW5sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLQotZXJyX2Rpc2FibGVfaXJxOgotCQlkZXZfZXJyKHdjZDl4eHhfcmVzLT5kZXYsCi0JCQkJIkRpc2FibGUgaXJxICVkXG4iLCB3Y2Q5eHh4X3Jlcy0+aXJxKTsKLQotCQlkaXNhYmxlX2lycV93YWtlKHdjZDl4eHhfcmVzLT5pcnEpOwotCQlkaXNhYmxlX2lycV9ub3N5bmMod2NkOXh4eF9yZXMtPmlycSk7Ci0JCXdjZDl4eHhfdW5sb2NrX3NsZWVwKHdjZDl4eHhfcmVzKTsKLQkJcmV0dXJuIElSUV9OT05FOwotfQotCi0vKioKLSAqIHdjZDl4eHhfZnJlZV9pcnEKLSAqCi0gKiBAd2NkOXh4eF9yZXM6IHBvaW50ZXIgdG8gY29yZSByZXNvdXJjZQotICogaXJxOiBpcnEgbnVtYmVyCi0gKiBAZGF0YTogZGF0YSBwb2ludGVyCi0gKgotICovCi12b2lkIHdjZDl4eHhfZnJlZV9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCi0JCQlpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCWZyZWVfaXJxKHBoeWlycV90b192aXJxKHdjZDl4eHhfcmVzLCBpcnEpLCBkYXRhKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9mcmVlX2lycSk7Ci0KLS8qKgotICogd2NkOXh4eF9lbmFibGVfaXJxCi0gKgotICogQHdjZDl4eHhfcmVzOiBwb2ludGVyIHRvIGNvcmUgcmVzb3VyY2UKLSAqIGlycTogaXJxIG51bWJlcgotICoKLSAqLwotdm9pZCB3Y2Q5eHh4X2VuYWJsZV9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBpcnEpCi17Ci0JaWYgKHdjZDl4eHhfcmVzLT5pcnEpCi0JCWVuYWJsZV9pcnEocGh5aXJxX3RvX3ZpcnEod2NkOXh4eF9yZXMsIGlycSkpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2VuYWJsZV9pcnEpOwotCi0vKioKLSAqIHdjZDl4eHhfZGlzYWJsZV9pcnEKLSAqCi0gKiBAd2NkOXh4eF9yZXM6IHBvaW50ZXIgdG8gY29yZSByZXNvdXJjZQotICogaXJxOiBpcnEgbnVtYmVyCi0gKgotICovCi12b2lkIHdjZDl4eHhfZGlzYWJsZV9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBpcnEpCi17Ci0JaWYgKHdjZDl4eHhfcmVzLT5pcnEpCi0JCWRpc2FibGVfaXJxX25vc3luYyhwaHlpcnFfdG9fdmlycSh3Y2Q5eHh4X3JlcywgaXJxKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfZGlzYWJsZV9pcnEpOwotCi0vKioKLSAqIHdjZDl4eHhfZGlzYWJsZV9pcnFfc3luYwotICoKLSAqIEB3Y2Q5eHh4X3JlczogcG9pbnRlciB0byBjb3JlIHJlc291cmNlCi0gKiBpcnE6IGlycSBudW1iZXIKLSAqCi0gKi8KLXZvaWQgd2NkOXh4eF9kaXNhYmxlX2lycV9zeW5jKAotCQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBpcnEpCi17Ci0JaWYgKHdjZDl4eHhfcmVzLT5pcnEpCi0JCWRpc2FibGVfaXJxKHBoeWlycV90b192aXJxKHdjZDl4eHhfcmVzLCBpcnEpKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9kaXNhYmxlX2lycV9zeW5jKTsKLQotc3RhdGljIGludCB3Y2Q5eHh4X2lycV9zZXR1cF9kb3duc3RyZWFtX2lycSgKLQkJCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQotewotCWludCBpcnEsIHZpcnEsIHJldDsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWZvciAoaXJxID0gMDsgaXJxIDwgd2NkOXh4eF9yZXMtPm51bV9pcnFzOyBpcnErKykgewotCQkvKiBNYXAgT0YgaXJxICovCi0JCXZpcnEgPSB3Y2Q5eHh4X21hcF9pcnEod2NkOXh4eF9yZXMsIGlycSk7Ci0JCXByX2RlYnVnKCIlczogaXJxICVkIC0+ICVkXG4iLCBfX2Z1bmNfXywgaXJxLCB2aXJxKTsKLQkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7Ci0JCQlwcl9lcnIoIiVzLCBObyBpbnRlcnJ1cHQgc3BlY2lmaWVyIGZvciBpcnEgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlycSk7Ci0JCQlyZXR1cm4gTk9fSVJROwotCQl9Ci0KLQkJcmV0ID0gaXJxX3NldF9jaGlwX2RhdGEodmlycSwgd2NkOXh4eF9yZXMpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIGlycSAlZCAoJWQpXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBpcnEsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJaWYgKHdjZDl4eHhfcmVzLT5pcnFfbGV2ZWxfaGlnaFtpcnFdKQotCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZ3Y2Q5eHh4X2lycV9jaGlwLAotCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwotCQllbHNlCi0JCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJndjZDl4eHhfaXJxX2NoaXAsCi0JCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQotCQlpcnFfc2V0X25lc3RlZF90aHJlYWQodmlycSwgMSk7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogd2NkOXh4eF9pcnFfaW5pdAotICoKLSAqIEB3Y2Q5eHh4X3JlczogcG9pbnRlciB0byBjb3JlIHJlc291cmNlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCi0gKi8KLWludCB3Y2Q5eHh4X2lycV9pbml0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQotewotCWludCBpLCByZXQ7Ci0JdTggaXJxX2xldmVsW3djZDl4eHhfcmVzLT5udW1faXJxX3JlZ3NdOwotCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwbm9kZTsKLQotCW11dGV4X2luaXQoJndjZDl4eHhfcmVzLT5pcnFfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmd2NkOXh4eF9yZXMtPm5lc3RlZF9pcnFfbG9jayk7Ci0KLQlwbm9kZSA9IG9mX2lycV9maW5kX3BhcmVudCh3Y2Q5eHh4X3Jlcy0+ZGV2LT5vZl9ub2RlKTsKLQlpZiAodW5saWtlbHkoIXBub2RlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkb21haW4gPSBpcnFfZmluZF9ob3N0KHBub2RlKTsKLQlpZiAodW5saWtlbHkoIWRvbWFpbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2NkOXh4eF9yZXMtPmRvbWFpbiA9IGRvbWFpbjsKLQotCXdjZDl4eHhfcmVzLT5pcnEgPSB3Y2Q5eHh4X2lycV9nZXRfdXBzdHJlYW1faXJxKHdjZDl4eHhfcmVzKTsKLQlpZiAoIXdjZDl4eHhfcmVzLT5pcnEpIHsKLQkJcHJfd2FybigiJXM6IGlycSBkcml2ZXIgaXMgbm90IHlldCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+aXJxX2xvY2spOwotCQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCXByX2RlYnVnKCIlczogcHJvYmVkIGlycSAlZFxuIiwgX19mdW5jX18sIHdjZDl4eHhfcmVzLT5pcnEpOwotCi0JLyogU2V0dXAgZG93bnN0cmVhbSBJUlFzICovCi0JcmV0ID0gd2NkOXh4eF9pcnFfc2V0dXBfZG93bnN0cmVhbV9pcnEod2NkOXh4eF9yZXMpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldHVwIGRvd25zdHJlYW0gSVJRXG4iLCBfX2Z1bmNfXyk7Ci0JCXdjZDl4eHhfaXJxX3B1dF91cHN0cmVhbV9pcnEod2NkOXh4eF9yZXMpOwotCQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+aXJxX2xvY2spOwotCQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBBbGwgb3RoZXIgd2NkOXh4eCBpbnRlcnJ1cHRzIGFyZSBlZGdlIHRyaWdnZXJlZCAqLwotCXdjZDl4eHhfcmVzLT5pcnFfbGV2ZWxfaGlnaFswXSA9IHRydWU7Ci0KLQkvKiBtYXNrIGFsbCB0aGUgaW50ZXJydXB0cyAqLwotCW1lbXNldChpcnFfbGV2ZWwsIDAsIHdjZDl4eHhfcmVzLT5udW1faXJxX3JlZ3MpOwotCWZvciAoaSA9IDA7IGkgPCB3Y2Q5eHh4X3Jlcy0+bnVtX2lycXM7IGkrKykgewotCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cltCSVRfQllURShpKV0gfD0gQllURV9CSVRfTUFTSyhpKTsKLQkJd2NkOXh4eF9yZXMtPmlycV9tYXNrc19jYWNoZVtCSVRfQllURShpKV0gfD0gQllURV9CSVRfTUFTSyhpKTsKLQkJaXJxX2xldmVsW0JJVF9CWVRFKGkpXSB8PQotCQkgICAgd2NkOXh4eF9yZXMtPmlycV9sZXZlbF9oaWdoW2ldIDw8IChpICUgQklUU19QRVJfQllURSk7Ci0JfQotCi0JaWYgKCF3Y2Q5eHh4X3Jlcy0+d2NkX2NvcmVfcmVnbWFwKSB7Ci0JCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKLQkJCSIlczogQ29kZWMgY29yZSByZWdtYXAgbm90IGRlZmluZWRcbiIsCi0JCQkgICBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9pcnFfaW5pdDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgd2NkOXh4eF9yZXMtPm51bV9pcnFfcmVnczsgaSsrKSB7Ci0JCS8qIEluaXRpYWxpemUgaW50ZXJydXB0IG1hc2sgYW5kIGxldmVsIHJlZ2lzdGVycyAqLwotCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTEVWRUxfQkFTRV0gKyBpLAotCQkJCQlpcnFfbGV2ZWxbaV0pOwotCQlyZWdtYXBfd3JpdGUod2NkOXh4eF9yZXMtPndjZF9jb3JlX3JlZ21hcCwKLQkJCXdjZDl4eHhfcmVzLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSArIGksCi0JCQl3Y2Q5eHh4X3Jlcy0+aXJxX21hc2tzX2N1cltpXSk7Ci0JfQotCi0JcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod2NkOXh4eF9yZXMtPmlycSwgTlVMTCwgd2NkOXh4eF9pcnFfdGhyZWFkLAotCQkJCSAgIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAotCQkJCSAgICJ3Y2Q5eHh4Iiwgd2NkOXh4eF9yZXMpOwotCWlmIChyZXQgIT0gMCkKLQkJZGV2X2Vycih3Y2Q5eHh4X3Jlcy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwKLQkJCXdjZDl4eHhfcmVzLT5pcnEsIHJldCk7Ci0JZWxzZSB7Ci0JCXJldCA9IGVuYWJsZV9pcnFfd2FrZSh3Y2Q5eHh4X3Jlcy0+aXJxKTsKLQkJaWYgKHJldCkKLQkJCWRldl9lcnIod2NkOXh4eF9yZXMtPmRldiwKLQkJCQkiRmFpbGVkIHRvIHNldCB3YWtlIGludGVycnVwdCBvbiBJUlEgJWQ6ICVkXG4iLAotCQkJCXdjZDl4eHhfcmVzLT5pcnEsIHJldCk7Ci0JCWlmIChyZXQpCi0JCQlmcmVlX2lycSh3Y2Q5eHh4X3Jlcy0+aXJxLCB3Y2Q5eHh4X3Jlcyk7Ci0JfQotCi0JaWYgKHJldCkKLQkJZ290byBmYWlsX2lycV9pbml0OwotCi0JcmV0dXJuIHJldDsKLQotZmFpbF9pcnFfaW5pdDoKLQlkZXZfZXJyKHdjZDl4eHhfcmVzLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBpbml0IHdjZDl4eHggaXJxXG4iLCBfX2Z1bmNfXyk7Ci0Jd2NkOXh4eF9pcnFfcHV0X3Vwc3RyZWFtX2lycSh3Y2Q5eHh4X3Jlcyk7Ci0JbXV0ZXhfZGVzdHJveSgmd2NkOXh4eF9yZXMtPmlycV9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+bmVzdGVkX2lycV9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2lycV9pbml0KTsKLQotaW50IHdjZDl4eHhfcmVxdWVzdF9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCi0JCQlpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQotewotCWludCB2aXJxOwotCi0JdmlycSA9IHBoeWlycV90b192aXJxKHdjZDl4eHhfcmVzLCBpcnEpOwotCi0JcmV0dXJuIHJlcXVlc3RfdGhyZWFkZWRfaXJxKHZpcnEsIE5VTEwsIGhhbmRsZXIsIElSUUZfVFJJR0dFUl9SSVNJTkcsCi0JCQkJICAgIG5hbWUsIGRhdGEpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3JlcXVlc3RfaXJxKTsKLQotdm9pZCB3Y2Q5eHh4X2lycV9leGl0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQotewotCWRldl9kYmcod2NkOXh4eF9yZXMtPmRldiwgIiVzOiBDbGVhbmluZyB1cCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQl3Y2Q5eHh4X3Jlcy0+aXJxKTsKLQotCWlmICh3Y2Q5eHh4X3Jlcy0+aXJxKSB7Ci0JCWRpc2FibGVfaXJxX3dha2Uod2NkOXh4eF9yZXMtPmlycSk7Ci0JCWZyZWVfaXJxKHdjZDl4eHhfcmVzLT5pcnEsIHdjZDl4eHhfcmVzKTsKLQkJd2NkOXh4eF9yZXMtPmlycSA9IDA7Ci0JCXdjZDl4eHhfaXJxX3B1dF9kb3duc3RyZWFtX2lycSh3Y2Q5eHh4X3Jlcyk7Ci0JCXdjZDl4eHhfaXJxX3B1dF91cHN0cmVhbV9pcnEod2NkOXh4eF9yZXMpOwotCX0KLQltdXRleF9kZXN0cm95KCZ3Y2Q5eHh4X3Jlcy0+aXJxX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJndjZDl4eHhfcmVzLT5uZXN0ZWRfaXJxX2xvY2spOwotfQotCi0jaWZuZGVmIENPTkZJR19PRgotc3RhdGljIGludCBwaHlpcnFfdG9fdmlycSgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywKLQlpbnQgb2Zmc2V0KQotewotCXJldHVybiB3Y2Q5eHh4X3Jlcy0+aXJxX2Jhc2UgKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmlycV90b19waHlpcnEoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCi0JaW50IHZpcnEpCi17Ci0JcmV0dXJuIHZpcnEgLSB3Y2Q5eHh4X3Jlcy0+aXJxX2Jhc2U7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgd2NkOXh4eF9pcnFfZ2V0X3Vwc3RyZWFtX2lycSgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQlyZXR1cm4gd2NkOXh4eF9yZXMtPmlycTsKLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfcHV0X3Vwc3RyZWFtX2lycSgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQkvKiBEbyBub3RoaW5nICovCi19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9tYXBfaXJxKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsIGludCBpcnEpCi17Ci0JcmV0dXJuIHBoeWlycV90b192aXJxKHdjZDl4eHhfY29yZV9yZXMsIGlycSk7Ci19Ci0jZWxzZQotc3RhdGljIHN0cnVjdCB3Y2Q5eHh4X2lycV9kcnZfZGF0YSAqCi13Y2Q5eHh4X2lycV9hZGRfZG9tYWluKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKmRhdGEgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBub2RlICVzLCBub2RlIHBhcmVudCAlc1xuIiwgX19mdW5jX18sCi0JCSBub2RlLT5uYW1lLCBub2RlLT5wYXJlbnQtPm5hbWUpOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qCi0JICogd2NkOXh4eF9pbnRjIGludGVycnVwdCBjb250cm9sbGVyIHN1cHBvcnRzIE4gdG8gTiBpcnEgbWFwcGluZyB3aXRoCi0JICogc2luZ2xlIGNlbGwgYmluZGluZyB3aXRoIGlycSBudW1iZXJzKG9mZnNldHMpIG9ubHkuCi0JICogVXNlIGlycV9kb21haW5fc2ltcGxlX29wcyB0aGF0IGhhcyBpcnFfZG9tYWluX3NpbXBsZV9tYXAgYW5kCi0JICogaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsLgotCSAqLwotCWRhdGEtPmRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBXQ0Q5WFhYX01BWF9OVU1fSVJRUywKLQkJCQkJICAgICAmaXJxX2RvbWFpbl9zaW1wbGVfb3BzLCBkYXRhKTsKLQlpZiAoIWRhdGEtPmRvbWFpbikgewotCQlrZnJlZShkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKgotd2NkOXh4eF9nZXRfaXJxX2Rydl9kKGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQotewotCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci0KLQlkb21haW4gPSB3Y2Q5eHh4X3Jlcy0+ZG9tYWluOwotCi0JaWYgKGRvbWFpbikKLQkJcmV0dXJuIGRvbWFpbi0+aG9zdF9kYXRhOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcGh5aXJxX3RvX3ZpcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhICpkYXRhOwotCi0JZGF0YSA9IHdjZDl4eHhfZ2V0X2lycV9kcnZfZCh3Y2Q5eHh4X3Jlcyk7Ci0JaWYgKCFkYXRhKSB7Ci0JCXByX3dhcm4oIiVzOiBub3QgcmVnaXN0ZXJlZCB0byBpbnRlcnJ1cHQgY29udHJvbGxlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChkYXRhLT5kb21haW4sIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlycV90b19waHlpcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsIGludCB2aXJxKQotewotCXN0cnVjdCBpcnFfZGF0YSAqaXJxX2RhdGEgPSBpcnFfZ2V0X2lycV9kYXRhKHZpcnEpOwotCi0JaWYgKHVubGlrZWx5KCFpcnFfZGF0YSkpIHsKLQkJcHJfZXJyKCIlczogaXJxX2RhdGEgaXMgTlVMTCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBpcnFfZGF0YS0+aHdpcnE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgd2NkOXh4eF9pcnFfZ2V0X3Vwc3RyZWFtX2lycSgKLQkJCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQlzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKmRhdGE7Ci0KLQlkYXRhID0gd2NkOXh4eF9nZXRfaXJxX2Rydl9kKHdjZDl4eHhfcmVzKTsKLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCIlczogaW50ZXJydXB0IGNvbnRyb2xsZXIgaXMgbm90IHJlZ2lzdGVyZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIE1ha2Ugc3VyZSBkYXRhIGlzIHVwZGF0ZWQgYmVmb3JlIHJldHVybi4gKi8KLQlybWIoKTsKLQlyZXR1cm4gZGF0YS0+aXJxOwotfQotCi1zdGF0aWMgdm9pZCB3Y2Q5eHh4X2lycV9wdXRfZG93bnN0cmVhbV9pcnEoCi0JCQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcykKLXsKLQlpbnQgaXJxLCB2aXJxLCByZXQ7Ci0KLQkvKgotCSAqIElSUSBtaWdyYXRpb24gaGl0cyBlcnJvciBpZiB0aGUgY2hpcCBkYXRhIGFuZCBoYW5kbGVzCi0JICogYXJlIG5vdCBtYWRlIE5VTEwuIG1ha2UgYXNzb2NpYXRlZCBkYXRhIGFuZCBoYW5kbGVzCi0JICogdG8gTlVMTCBhdCBpcnFfZXhpdAotCSAqLwotCWZvciAoaXJxID0gMDsgaXJxIDwgd2NkOXh4eF9yZXMtPm51bV9pcnFzOyBpcnErKykgewotCQl2aXJxID0gd2NkOXh4eF9tYXBfaXJxKHdjZDl4eHhfcmVzLCBpcnEpOwotCQlwcl9kZWJ1ZygiJXM6IGlycSAlZCAtPiAlZFxuIiwgX19mdW5jX18sIGlycSwgdmlycSk7Ci0JCXJldCA9IGlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIGlycSAlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBpcnEsIHJldCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2NkOXh4eF9pcnFfcHV0X3Vwc3RyZWFtX2lycSgKLQkJCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKQotewotCXdjZDl4eHhfcmVzLT5kb21haW4gPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfbWFwX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSkKLXsKLQlyZXR1cm4gb2ZfaXJxX3RvX3Jlc291cmNlKHdjZDl4eHhfcmVzLT5kZXYtPm9mX25vZGUsIGlycSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9pcnFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgaXJxLCBkaXJfYXBwc19pcnEgPSAtRUlOVkFMOwotCXN0cnVjdCB3Y2Q5eHh4X2lycV9kcnZfZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWlycSA9IG9mX2dldF9uYW1lZF9ncGlvKG5vZGUsICJxY29tLGdwaW8tY29ubmVjdCIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChpcnEpKQotCQlkaXJfYXBwc19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAid2NkX2lycSIpOwotCi0JaWYgKCFncGlvX2lzX3ZhbGlkKGlycSkgJiYgZGlyX2FwcHNfaXJxIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUTE1NIGNvbm5lY3QgZ3BpbyBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKLQl9Ci0JaWYgKGRpcl9hcHBzX2lycSA+IDApIHsKLQkJaXJxID0gZGlyX2FwcHNfaXJxOwotCX0gZWxzZSB7Ci0JCWlycSA9IGdwaW9fdG9faXJxKGlycSk7Ci0JCWlmIChpcnEgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gY29uZmlndXJlIGlycVxuIik7Ci0JCQlyZXR1cm4gaXJxOwotCQl9Ci0JfQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiB2aXJxID0gJWRcbiIsIF9fZnVuY19fLCBpcnEpOwotCWRhdGEgPSB3Y2Q5eHh4X2lycV9hZGRfZG9tYWluKG5vZGUsIG5vZGUtPnBhcmVudCk7Ci0JaWYgKCFkYXRhKSB7Ci0JCXByX2VycigiJXM6IGlycV9hZGRfZG9tYWluIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGF0YS0+aXJxID0gaXJxOwotCi0JLyogTWFrZSBzdXJlIGlycSBpcyBzYXZlZCBiZWZvcmUgcmV0dXJuLiAqLwotCXdtYigpOwotCXJldCA9IDA7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZDl4eHhfaXJxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci0Jc3RydWN0IHdjZDl4eHhfaXJxX2Rydl9kYXRhICpkYXRhOwotCi0JZG9tYWluID0gaXJxX2ZpbmRfaG9zdChwZGV2LT5kZXYub2Zfbm9kZSk7Ci0JaWYgKHVubGlrZWx5KCFkb21haW4pKSB7Ci0JCXByX2VycigiJXM6IGRvbWFpbiBpcyBOVUxMIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGF0YSA9IChzdHJ1Y3Qgd2NkOXh4eF9pcnFfZHJ2X2RhdGEgKilkb21haW4tPmhvc3RfZGF0YTsKLQlkYXRhLT5pcnEgPSAwOwotCi0JLyogTWFrZSBzdXJlIGlycSB2YXJpYWJsZSBpcyB1cGRhdGVkIGluIGRhdGEsIGJlZm9yZSBpcnEgcmVtb3ZhbC4gKi8KLQl3bWIoKTsKLQlpcnFfZG9tYWluX3JlbW92ZShkYXRhLT5kb21haW4pOwotCWtmcmVlKGRhdGEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjZDl4eHgtaXJxIiB9LAotCXsgfQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2NkOXh4eF9pcnFfZHJpdmVyID0gewotCS5wcm9iZSA9IHdjZDl4eHhfaXJxX3Byb2JlLAotCS5yZW1vdmUgPSB3Y2Q5eHh4X2lycV9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid2NkOXh4eF9pbnRjIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9tYXRjaCksCi0JfSwKLX07Ci0KLWludCB3Y2Q5eHh4X2lycV9kcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJndjZDl4eHhfaXJxX2RyaXZlcik7Ci19Ci0KLXZvaWQgd2NkOXh4eF9pcnFfZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmd2NkOXh4eF9pcnFfZHJpdmVyKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDl4eHgtcmVnbWFwLmggYi9kcml2ZXJzL21mZC93Y2Q5eHh4LXJlZ21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDRlOGIxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDl4eHgtcmVnbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfV0NEOVhYWF9SRUdNQVBfCi0jZGVmaW5lIF9XQ0Q5WFhYX1JFR01BUF8KLQotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KLQotdHlwZWRlZiBpbnQgKCpyZWdtYXBfcGF0Y2hfZnB0cikoc3RydWN0IHJlZ21hcCAqLCBpbnQpOwotCi1leHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgd2NkOTM0eF9yZWdtYXBfY29uZmlnOwotZXh0ZXJuIGludCB3Y2Q5MzR4X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCi0JCQkJCSBpbnQgdmVyc2lvbik7Ci0KLWV4dGVybiBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3Y2Q5MzM1X3JlZ21hcF9jb25maWc7Ci1leHRlcm4gaW50IHdjZDkzMzVfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJCQkJIGludCB2ZXJzaW9uKTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqd2NkOXh4eF9nZXRfcmVnbWFwX2NvbmZpZyhpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqcmVnbWFwX2NvbmZpZzsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgV0NEOTM0WDoKLQkJcmVnbWFwX2NvbmZpZyA9ICZ3Y2Q5MzR4X3JlZ21hcF9jb25maWc7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNToKLQkJcmVnbWFwX2NvbmZpZyA9ICZ3Y2Q5MzM1X3JlZ21hcF9jb25maWc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJlZ21hcF9jb25maWcgPSBOVUxMOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJlZ21hcF9jb25maWc7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgcmVnbWFwX3BhdGNoX2ZwdHIgd2NkOXh4eF9nZXRfcmVnbWFwX3JlZ19wYXRjaChpbnQgdHlwZSkKLXsKLQlyZWdtYXBfcGF0Y2hfZnB0ciBhcHBseV9wYXRjaDsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgV0NEOTMzNToKLQkJYXBwbHlfcGF0Y2ggPSB3Y2Q5MzM1X3JlZ21hcF9yZWdpc3Rlcl9wYXRjaDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzRYOgotCQlhcHBseV9wYXRjaCA9IHdjZDkzNHhfcmVnbWFwX3JlZ2lzdGVyX3BhdGNoOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhcHBseV9wYXRjaCA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBhcHBseV9wYXRjaDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5eHh4LXJzdC5jIGIvZHJpdmVycy9tZmQvd2NkOXh4eC1yc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMGIzNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21mZC93Y2Q5eHh4LXJzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtdXRpbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9pcnEuaD4KLQotLyogd2NkOTMzNSBpbnRlcnJ1cHQgdGFibGUgICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGludHJfZGF0YSB3Y2Q5MzM1X2ludHJfdGFibGVbXSA9IHsKLQl7V0NEOVhYWF9JUlFfU0xJTUJVUywgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9NQkhDX1NXX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzMzVfSVJRX01CSENfQlVUVE9OX1BSRVNTX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzMzVfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULCB0cnVlfSwKLQl7V0NEOTMzNV9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULCB0cnVlfSwKLQl7V0NEOTMzNV9JUlFfRkxMX0xPQ0tfTE9TUywgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9IUEhfUEFfQ05QTF9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9IUEhfUEFfQ05QUl9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9FQVJfUEFfQ05QX0NPTVBMRVRFLCBmYWxzZX0sCi0Je1dDRDkzMzVfSVJRX0xJTkVfUEExX0NOUF9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9MSU5FX1BBMl9DTlBfQ09NUExFVEUsIGZhbHNlfSwKLQl7V0NEOTMzNV9JUlFfTElORV9QQTNfQ05QX0NPTVBMRVRFLCBmYWxzZX0sCi0Je1dDRDkzMzVfSVJRX0xJTkVfUEE0X0NOUF9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9FQVJfUEFfT0NQX0ZBVUxULCBmYWxzZX0sCi0Je1dDRDkzMzVfSVJRX1NPVU5EV0lSRSwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9WRERfRElHX1JBTVBfQ09NUExFVEUsIGZhbHNlfSwKLQl7V0NEOTMzNV9JUlFfUkNPX0VSUk9SLCBmYWxzZX0sCi0Je1dDRDkzMzVfSVJRX1NWQV9FUlJPUiwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9NQURfQVVESU8sIGZhbHNlfSwKLQl7V0NEOTMzNV9JUlFfTUFEX0JFQUNPTiwgZmFsc2V9LAotCXtXQ0Q5MzM1X0lSUV9TVkFfT1VUQk9YMSwgdHJ1ZX0sCi0Je1dDRDkzMzVfSVJRX1NWQV9PVVRCT1gyLCB0cnVlfSwKLQl7V0NEOTMzNV9JUlFfTUFEX1VMVFJBU09VTkQsIGZhbHNlfSwKLQl7V0NEOTMzNV9JUlFfVkJBVF9BVFRBQ0ssIGZhbHNlfSwKLQl7V0NEOTMzNV9JUlFfVkJBVF9SRVNUT1JFLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGludHJfZGF0YSB3Y2Q5MzR4X2ludHJfdGFibGVbXSA9IHsKLQl7V0NEOVhYWF9JUlFfU0xJTUJVUywgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9NQkhDX1NXX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzNFhfSVJRX01CSENfQlVUVE9OX1BSRVNTX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzNFhfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULCB0cnVlfSwKLQl7V0NEOTM0WF9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0RFVCwgdHJ1ZX0sCi0Je1dDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULCB0cnVlfSwKLQl7V0NEOTM0WF9JUlFfTUlTQywgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfQ05QTF9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfQ05QUl9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9FQVJfUEFfQ05QX0NPTVBMRVRFLCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX0xJTkVfUEExX0NOUF9DT01QTEVURSwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9MSU5FX1BBMl9DTlBfQ09NUExFVEUsIGZhbHNlfSwKLQl7V0NEOTM0WF9JUlFfU0xOUV9BTkFMT0dfRVJST1IsIGZhbHNlfSwKLQl7V0NEOTM0WF9JUlFfUkVTRVJWRURfMywgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9FQVJfUEFfT0NQX0ZBVUxULCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX1NPVU5EV0lSRSwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9WRERfRElHX1JBTVBfQ09NUExFVEUsIGZhbHNlfSwKLQl7V0NEOTM0WF9JUlFfUkNPX0VSUk9SLCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX0NQRV9FUlJPUiwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9NQURfQVVESU8sIGZhbHNlfSwKLQl7V0NEOTM0WF9JUlFfTUFEX0JFQUNPTiwgZmFsc2V9LAotCXtXQ0Q5MzRYX0lSUV9DUEUxX0lOVFIsIHRydWV9LAotCXtXQ0Q5MzRYX0lSUV9SRVNFUlZFRF80LCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX01BRF9VTFRSQVNPVU5ELCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX1ZCQVRfQVRUQUNLLCBmYWxzZX0sCi0Je1dDRDkzNFhfSVJRX1ZCQVRfUkVTVE9SRSwgZmFsc2V9LAotfTsKLQotLyoKLSAqIHdjZDkzMzVfYnJpbmdfZG93bjogQnJpbmdkb3duIFdDRCBDb2RlYwotICoKLSAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCB3Y2Q5MzM1X2JyaW5nX2Rvd24oc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCi17Ci0JaWYgKCF3Y2Q5eHh4IHx8ICF3Y2Q5eHh4LT5yZWdtYXApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVnbWFwX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkgICAgIDB4MDQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB3Y2Q5MzM1X2JyaW5nX3VwOiBCcmluZ3VwIFdDRCBDb2RlYwotICoKLSAqIEB3Y2Q5eHh4OiBQb2ludGVyIHRvIHRoZSB3Y2Q5eHh4IHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgd2NkOTMzNV9icmluZ191cChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdmFsLCBieXRlMDsKLQlzdHJ1Y3QgcmVnbWFwICp3Y2RfcmVnbWFwOwotCi0JaWYgKCF3Y2Q5eHh4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghd2NkOXh4eC0+cmVnbWFwKSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggcmVnbWFwIGlzIG51bGwhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jd2NkX3JlZ21hcCA9IHdjZDl4eHgtPnJlZ21hcDsKLQotCXJlZ21hcF9yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDAsICZ2YWwpOwotCXJlZ21hcF9yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwgJmJ5dGUwKTsKLQotCWlmICgodmFsIDwgMCkgfHwgKGJ5dGUwIDwgMCkpIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogdGFzaGEgY29kZWMgdmVyc2lvbiBkZXRlY3Rpb24gZmFpbCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoKHZhbCAmIDB4ODApICYmIChieXRlMCA9PSAweDApKSB7Ci0JCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5MzM1IGNvZGVjIHZlcnNpb24gaXMgdjEuMVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzM1X0NPREVDX1JQTV9SU1RfQ1RMLCAweDAxKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF8yLCAweEZDKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF80LCAweDIxKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKLQkJCSAgICAgMHg1KTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKLQkJCSAgICAgMHg3KTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwKLQkJCSAgICAgMHgzKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4Myk7Ci0JfSBlbHNlIGlmIChieXRlMCA9PSAweDEpIHsKLQkJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDkzMzUgY29kZWMgdmVyc2lvbiBpcyB2Mi4wXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDEpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8yLCAweDAwKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfU0lET19TSURPX0NDTF84LCAweDZGKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQklBU19WQkdfRklORV9BREosIDB4NjUpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJICAgICAweDUpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJICAgICAweDcpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJICAgICAweDMpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgzKTsKLQl9IGVsc2UgaWYgKChieXRlMCA9PSAwKSAmJiAoISh2YWwgJiAweDgwKSkpIHsKLQkJZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDkzMzUgY29kZWMgdmVyc2lvbiBpcyB2MS4wXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDEpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzIsIDB4RkMpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzQsIDB4MjEpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJICAgICAweDMpOwotCQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTMzNV9DT0RFQ19SUE1fUlNUX0NUTCwgMHgzKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB0YXNoYSBjb2RlYyB2ZXJzaW9uIHVua25vd25cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZDkzMzVfZ2V0X2NkY19pbmZvOiBHZXQgY29kZWMgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAqCi0gKiBAd2NkOXh4eDogcG9pbnRlciB0byB3Y2Q5eHh4IHN0cnVjdHVyZQotICogQHdjZF90eXBlOiBwb2ludGVyIHRvIHdjZDl4eHhfY29kZWNfdHlwZSBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQotICovCi1zdGF0aWMgaW50IHdjZDkzMzVfZ2V0X2NkY19pbmZvKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqd2NkX3R5cGUpCi17Ci0JdTE2IGlkX21pbm9yLCBpZF9tYWpvcjsKLQlzdHJ1Y3QgcmVnbWFwICp3Y2RfcmVnbWFwOwotCWludCByYywgdmFsLCB2ZXJzaW9uID0gMDsKLQotCWlmICghd2NkOXh4eCB8fCAhd2NkX3R5cGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF3Y2Q5eHh4LT5yZWdtYXApIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkOXh4eCByZWdtYXAgaXMgbnVsbCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl3Y2RfcmVnbWFwID0gd2NkOXh4eC0+cmVnbWFwOwotCi0JcmMgPSByZWdtYXBfYnVsa19yZWFkKHdjZF9yZWdtYXAsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCwKLQkJCSh1OCAqKSZpZF9taW5vciwgc2l6ZW9mKHUxNikpOwotCWlmIChyYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYyA9IHJlZ21hcF9idWxrX3JlYWQod2NkX3JlZ21hcCwgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUyLAotCQkJICAgICAgKHU4ICopJmlkX21ham9yLCBzaXplb2YodTE2KSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9pbmZvKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5eHh4IGNoaXAgaWQgbWFqb3IgMHgleCwgbWlub3IgMHgleFxuIiwKLQkJIF9fZnVuY19fLCBpZF9tYWpvciwgaWRfbWlub3IpOwotCi0JLyogVmVyc2lvbiBkZXRlY3Rpb24gKi8KLQlpZiAoaWRfbWFqb3IgPT0gVEFTSEFfTUFKT1IpIHsKLQkJcmVnbWFwX3JlYWQod2NkX3JlZ21hcCwgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCwKLQkJCSAgICAmdmFsKTsKLQkJdmVyc2lvbiA9ICgodTgpdmFsICYgMHg4MCkgPj4gNzsKLQl9IGVsc2UgaWYgKGlkX21ham9yID09IFRBU0hBMlAwX01BSk9SKQotCQl2ZXJzaW9uID0gMjsKLQllbHNlCi0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDkzMzUgdmVyc2lvbiB1bmtub3duIChtYWpvciAweCV4LCBtaW5vciAweCV4KVxuIiwKLQkJCV9fZnVuY19fLCBpZF9tYWpvciwgaWRfbWlub3IpOwotCi0JLyogRmlsbCBjb2RlYyB0eXBlIGluZm8gKi8KLQl3Y2RfdHlwZS0+aWRfbWFqb3IgPSBpZF9tYWpvcjsKLQl3Y2RfdHlwZS0+aWRfbWlub3IgPSBpZF9taW5vcjsKLQl3Y2RfdHlwZS0+bnVtX2lycXMgPSBXQ0Q5MzM1X05VTV9JUlFTOwotCXdjZF90eXBlLT52ZXJzaW9uID0gdmVyc2lvbjsKLQl3Y2RfdHlwZS0+c2xpbV9zbGF2ZV90eXBlID0gV0NEOVhYWF9TTElNX1NMQVZFX0FERFJfVFlQRV8xOwotCXdjZF90eXBlLT5pMmNfY2hpcF9zdGF0dXMgPSAweDAxOwotCXdjZF90eXBlLT5pbnRyX3RibCA9IHdjZDkzMzVfaW50cl90YWJsZTsKLQl3Y2RfdHlwZS0+aW50cl90Ymxfc2l6ZSA9IEFSUkFZX1NJWkUod2NkOTMzNV9pbnRyX3RhYmxlKTsKLQotCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfU1RBVFVTX0JBU0VdID0KLQkJCQkJCVdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzA7Ci0Jd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTEVBUl9CQVNFXSA9Ci0JCQkJCQlXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjA7Ci0Jd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9NQVNLX0JBU0VdID0KLQkJCQkJCVdDRDkzMzVfSU5UUl9QSU4xX01BU0swOwotCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTEVWRUxfQkFTRV0gPQotCQkJCQkJV0NEOTMzNV9JTlRSX0xFVkVMMDsKLQl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0NMUl9DT01NSVRdID0KLQkJCQkJCVdDRDkzMzVfSU5UUl9DTFJfQ09NTUlUOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogd2NkOTM0eF9icmluZ19kb3duOiBCcmluZ2Rvd24gV0NEIENvZGVjCi0gKgotICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gd2NkOXh4eCBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQotICovCi1zdGF0aWMgaW50IHdjZDkzNHhfYnJpbmdfZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlpZiAoIXdjZDl4eHggfHwgIXdjZDl4eHgtPnJlZ21hcCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZWdtYXBfd3JpdGUod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsCi0JCSAgICAgMHgwNCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHdjZDkzNHhfYnJpbmdfdXA6IEJyaW5ndXAgV0NEIENvZGVjCi0gKgotICogQHdjZDl4eHg6IFBvaW50ZXIgdG8gdGhlIHdjZDl4eHggc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCB3Y2Q5MzR4X2JyaW5nX3VwKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQotewotCXN0cnVjdCByZWdtYXAgKndjZF9yZWdtYXA7Ci0KLQlpZiAoIXdjZDl4eHgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF3Y2Q5eHh4LT5yZWdtYXApIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogd2NkOXh4eCByZWdtYXAgaXMgbnVsbCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl3Y2RfcmVnbWFwID0gd2NkOXh4eC0+cmVnbWFwOwotCi0JcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDEpOwotCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQLCAweDE5KTsKLQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfU1RBUlRVUCwgMHgxNSk7Ci0JLyogQWRkIDFtc2VjIGRlbGF5IGZvciBWT1VUIHRvIHNldHRsZSAqLwotCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQlyZWdtYXBfd3JpdGUod2NkX3JlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDUpOwotCXJlZ21hcF93cml0ZSh3Y2RfcmVnbWFwLCBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4Nyk7Ci0JcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEwsIDB4Myk7Ci0JcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX1JTVF9DVEwsIDB4Nyk7Ci0JcmVnbWFwX3dyaXRlKHdjZF9yZWdtYXAsIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHgzKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogd2NkOTM0eF9nZXRfY2RjX2luZm86IEdldCBjb2RlYyBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICoKLSAqIEB3Y2Q5eHh4OiBwb2ludGVyIHRvIHdjZDl4eHggc3RydWN0dXJlCi0gKiBAd2NkX3R5cGU6IHBvaW50ZXIgdG8gd2NkOXh4eF9jb2RlY190eXBlIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgd2NkOTM0eF9nZXRfY2RjX2luZm8oc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkgICBzdHJ1Y3Qgd2NkOXh4eF9jb2RlY190eXBlICp3Y2RfdHlwZSkKLXsKLQl1MTYgaWRfbWlub3IsIGlkX21ham9yOwotCXN0cnVjdCByZWdtYXAgKndjZF9yZWdtYXA7Ci0JaW50IHJjLCB2ZXJzaW9uID0gLTE7Ci0KLQlpZiAoIXdjZDl4eHggfHwgIXdjZF90eXBlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghd2NkOXh4eC0+cmVnbWFwKSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggcmVnbWFwIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXdjZF9yZWdtYXAgPSB3Y2Q5eHh4LT5yZWdtYXA7Ci0KLQlyYyA9IHJlZ21hcF9idWxrX3JlYWQod2NkX3JlZ21hcCwgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUwLAotCQkJICAgICAgKHU4ICopJmlkX21pbm9yLCBzaXplb2YodTE2KSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJjID0gcmVnbWFwX2J1bGtfcmVhZCh3Y2RfcmVnbWFwLCBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTIsCi0JCQkgICAgICAodTggKikmaWRfbWFqb3IsIHNpemVvZih1MTYpKTsKLQlpZiAocmMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2luZm8od2NkOXh4eC0+ZGV2LCAiJXM6IHdjZDl4eHggY2hpcCBpZCBtYWpvciAweCV4LCBtaW5vciAweCV4XG4iLAotCQkgX19mdW5jX18sIGlkX21ham9yLCBpZF9taW5vcik7Ci0KLQlpZiAoaWRfbWFqb3IgIT0gVEFWSUxfTUFKT1IpCi0JCWdvdG8gdmVyc2lvbl91bmtub3duOwotCi0JLyoKLQkgKiBBcyBmaW5lIHZlcnNpb24gaW5mbyBjYW5ub3QgYmUgcmV0cmlldmVkIGJlZm9yZSB0YXZpbCBwcm9iZS4KLQkgKiBBc3NpZ24gY29hcnNlIHZlcnNpb25zIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIGJlZm9yZSB0YXZpbCBwcm9iZS4KLQkgKi8KLQlpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMCkpCi0JCXZlcnNpb24gPSBUQVZJTF9WRVJTSU9OXzFfMDsKLQllbHNlIGlmIChpZF9taW5vciA9PSBjcHVfdG9fbGUxNigweDAxKSkKLQkJdmVyc2lvbiA9IFRBVklMX1ZFUlNJT05fMV8xOwotCi12ZXJzaW9uX3Vua25vd246Ci0JaWYgKHZlcnNpb24gPCAwKQotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiB3Y2Q5MzR4IHZlcnNpb24gdW5rbm93blxuIiwKLQkJCV9fZnVuY19fKTsKLQotCS8qIEZpbGwgY29kZWMgdHlwZSBpbmZvICovCi0Jd2NkX3R5cGUtPmlkX21ham9yID0gaWRfbWFqb3I7Ci0Jd2NkX3R5cGUtPmlkX21pbm9yID0gaWRfbWlub3I7Ci0Jd2NkX3R5cGUtPm51bV9pcnFzID0gV0NEOTM0WF9OVU1fSVJRUzsKLQl3Y2RfdHlwZS0+dmVyc2lvbiA9IHZlcnNpb247Ci0Jd2NkX3R5cGUtPnNsaW1fc2xhdmVfdHlwZSA9IFdDRDlYWFhfU0xJTV9TTEFWRV9BRERSX1RZUEVfMTsKLQl3Y2RfdHlwZS0+aTJjX2NoaXBfc3RhdHVzID0gMHgwMTsKLQl3Y2RfdHlwZS0+aW50cl90YmwgPSB3Y2Q5MzR4X2ludHJfdGFibGU7Ci0Jd2NkX3R5cGUtPmludHJfdGJsX3NpemUgPSBBUlJBWV9TSVpFKHdjZDkzNHhfaW50cl90YWJsZSk7Ci0KLQl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX1NUQVRVU19CQVNFXSA9Ci0JCQkJCQlXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMwOwotCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRV0gPQotCQkJCQkJV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIwOwotCXdjZF90eXBlLT5pbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFXSA9Ci0JCQkJCQlXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMDsKLQl3Y2RfdHlwZS0+aW50cl9yZWdbV0NEOVhYWF9JTlRSX0xFVkVMX0JBU0VdID0KLQkJCQkJCVdDRDkzNFhfSU5UUl9MRVZFTDA7Ci0Jd2NkX3R5cGUtPmludHJfcmVnW1dDRDlYWFhfSU5UUl9DTFJfQ09NTUlUXSA9Ci0JCQkJCQlXQ0Q5MzRYX0lOVFJfQ0xSX0NPTU1JVDsKLQotCXJldHVybiByYzsKLX0KLQotY29kZWNfYnJpbmdkb3duX2ZuIHdjZDl4eHhfYnJpbmdkb3duX2ZuKGludCB0eXBlKQotewotCWNvZGVjX2JyaW5nZG93bl9mbiBjZGNfYmRvd25fZm47Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdDRDkzNFg6Ci0JCWNkY19iZG93bl9mbiA9IHdjZDkzNHhfYnJpbmdfZG93bjsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1OgotCQljZGNfYmRvd25fZm4gPSB3Y2Q5MzM1X2JyaW5nX2Rvd247Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWNkY19iZG93bl9mbiA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBjZGNfYmRvd25fZm47Ci19Ci0KLWNvZGVjX2JyaW5ndXBfZm4gd2NkOXh4eF9icmluZ3VwX2ZuKGludCB0eXBlKQotewotCWNvZGVjX2JyaW5ndXBfZm4gY2RjX2J1cF9mbjsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgV0NEOTM0WDoKLQkJY2RjX2J1cF9mbiA9IHdjZDkzNHhfYnJpbmdfdXA7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNToKLQkJY2RjX2J1cF9mbiA9IHdjZDkzMzVfYnJpbmdfdXA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWNkY19idXBfZm4gPSBOVUxMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gY2RjX2J1cF9mbjsKLX0KLQotY29kZWNfdHlwZV9mbiB3Y2Q5eHh4X2dldF9jb2RlY19pbmZvX2ZuKGludCB0eXBlKQotewotCWNvZGVjX3R5cGVfZm4gY2RjX3R5cGVfZm47Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdDRDkzNFg6Ci0JCWNkY190eXBlX2ZuID0gd2NkOTM0eF9nZXRfY2RjX2luZm87Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNToKLQkJY2RjX3R5cGVfZm4gPSB3Y2Q5MzM1X2dldF9jZGNfaW5mbzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJY2RjX3R5cGVfZm4gPSBOVUxMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gY2RjX3R5cGVfZm47Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3djZDl4eHgtc2xpbXNsYXZlLmMgYi9kcml2ZXJzL21mZC93Y2Q5eHh4LXNsaW1zbGF2ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlhZDVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL3djZDl4eHgtc2xpbXNsYXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXNsaW1zbGF2ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+Ci0KLXN0cnVjdCB3Y2Q5eHh4X3NsaW1fc2NoIHsKLQl1MTYgcnhfcG9ydF9jaF9yZWdfYmFzZTsKLQl1MTYgcG9ydF90eF9jZmdfcmVnX2Jhc2U7Ci0JdTE2IHBvcnRfcnhfY2ZnX3JlZ19iYXNlOwotfTsKLQotc3RhdGljIHN0cnVjdCB3Y2Q5eHh4X3NsaW1fc2NoIHNoX2NoOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfYWxsb2Nfc2xpbV9zaF9jaChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCQkgICAgdTggd2NkOXh4eF9wZ2RfbGEsIHUzMiBjbnQsCi0JCQkJICAgIHN0cnVjdCB3Y2Q5eHh4X2NoICpjaGFubmVscywgdTMyIHBhdGgpOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfZGVhbGxvY19zbGltX3NoX2NoKHN0cnVjdCBzbGltX2RldmljZSAqc2xpbSwKLQkJCQkgICAgICB1MzIgY250LCBzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2hhbm5lbHMpOwotCi1zdGF0aWMgaW50IHdjZDl4eHhfY29uZmlndXJlX3BvcnRzKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KQotewotCWlmICh3Y2Q5eHh4LT5jb2RlY190eXBlLT5zbGltX3NsYXZlX3R5cGUgPT0KLQkgICAgV0NEOVhYWF9TTElNX1NMQVZFX0FERFJfVFlQRV8wKSB7Ci0JCXNoX2NoLnJ4X3BvcnRfY2hfcmVnX2Jhc2UgPSAweDE4MDsKLQkJc2hfY2gucG9ydF9yeF9jZmdfcmVnX2Jhc2UgPSAweDA0MDsKLQkJc2hfY2gucG9ydF90eF9jZmdfcmVnX2Jhc2UgPSAweDA0MDsKLQl9IGVsc2UgewotCQlzaF9jaC5yeF9wb3J0X2NoX3JlZ19iYXNlID0KLQkJCTB4MTgwIC0gKFRBSUtPX1NCX1BHRF9PRkZTRVRfT0ZfUlhfU0xBVkVfREVWX1BPUlRTICogNCk7Ci0JCXNoX2NoLnBvcnRfcnhfY2ZnX3JlZ19iYXNlID0KLQkJCTB4MDQwIC0gVEFJS09fU0JfUEdEX09GRlNFVF9PRl9SWF9TTEFWRV9ERVZfUE9SVFM7Ci0JCXNoX2NoLnBvcnRfdHhfY2ZnX3JlZ19iYXNlID0gMHgwNTA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogd2NkOXh4eF9pbml0X3NsaW1zbGF2ZQotICoKLSAqIEB3Y2Q5eHh4OiBwb2ludGVyIHRvIHdjZDl4eHggc3RydWN0Ci0gKiBAd2NkOXh4eF9wZ2RfbGE6IHBnZF9sYSB2YWx1ZQotICogQHR4X251bTogdHggbnVtYmVyCi0gKiBAcnhfbnVtOiByeCBudW1iZXIKLSAqIEB0eF9zbG90OiBwb2ludGVyIHRvIHR4IHNsb3QKLSAqIEByeF9zbG90OiBwb2ludGVyIHRvIHJ4IHNsb3QKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqLwotaW50IHdjZDl4eHhfaW5pdF9zbGltc2xhdmUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHU4IHdjZDl4eHhfcGdkX2xhLAotCQkJICAgdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAotCQkJICAgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotewotCWludCByZXQgPSAwOwotCWludCBpOwotCi0JcmV0ID0gd2NkOXh4eF9jb25maWd1cmVfcG9ydHMod2NkOXh4eCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0XG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAoIXJ4X251bSB8fCByeF9udW0gPiB3Y2Q5eHh4LT5udW1fcnhfcG9ydCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHJ4IG51bSAlZFxuIiwgX19mdW5jX18sIHJ4X251bSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAod2NkOXh4eC0+cnhfY2hzKSB7Ci0JCXdjZDl4eHgtPm51bV9yeF9wb3J0ID0gcnhfbnVtOwotCQlmb3IgKGkgPSAwOyBpIDwgcnhfbnVtOyBpKyspIHsKLQkJCXdjZDl4eHgtPnJ4X2Noc1tpXS5jaF9udW0gPSByeF9zbG90W2ldOwotCQkJSU5JVF9MSVNUX0hFQUQoJndjZDl4eHgtPnJ4X2Noc1tpXS5saXN0KTsKLQkJfQotCQlyZXQgPSB3Y2Q5eHh4X2FsbG9jX3NsaW1fc2hfY2god2NkOXh4eCwgd2NkOXh4eF9wZ2RfbGEsCi0JCQkJCQl3Y2Q5eHh4LT5udW1fcnhfcG9ydCwKLQkJCQkJCXdjZDl4eHgtPnJ4X2NocywKLQkJCQkJCVNMSU1fU0lOSyk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvYyAlZCByeCBzbGltYnVzIGNoYW5uZWxzXG4iLAotCQkJCV9fZnVuY19fLCB3Y2Q5eHh4LT5udW1fcnhfcG9ydCk7Ci0JCQlrZnJlZSh3Y2Q5eHh4LT5yeF9jaHMpOwotCQkJd2NkOXh4eC0+cnhfY2hzID0gTlVMTDsKLQkJCXdjZDl4eHgtPm51bV9yeF9wb3J0ID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IGFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlZCBzbGltYnVzIHJ4IHBvcnRzXG4iLAotCQkJd2NkOXh4eC0+bnVtX3J4X3BvcnQpOwotCX0KLQotCWlmICghdHhfbnVtIHx8IHR4X251bSA+IHdjZDl4eHgtPm51bV90eF9wb3J0KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgdHggbnVtICVkXG4iLCBfX2Z1bmNfXywgdHhfbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICh3Y2Q5eHh4LT50eF9jaHMpIHsKLQkJd2NkOXh4eC0+bnVtX3R4X3BvcnQgPSB0eF9udW07Ci0JCWZvciAoaSA9IDA7IGkgPCB0eF9udW07IGkrKykgewotCQkJd2NkOXh4eC0+dHhfY2hzW2ldLmNoX251bSA9IHR4X3Nsb3RbaV07Ci0JCQlJTklUX0xJU1RfSEVBRCgmd2NkOXh4eC0+dHhfY2hzW2ldLmxpc3QpOwotCQl9Ci0JCXJldCA9IHdjZDl4eHhfYWxsb2Nfc2xpbV9zaF9jaCh3Y2Q5eHh4LCB3Y2Q5eHh4X3BnZF9sYSwKLQkJCQkJCXdjZDl4eHgtPm51bV90eF9wb3J0LAotCQkJCQkJd2NkOXh4eC0+dHhfY2hzLAotCQkJCQkJU0xJTV9TUkMpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2MgJWQgdHggc2xpbWJ1cyBjaGFubmVsc1xuIiwKLQkJCQlfX2Z1bmNfXywgd2NkOXh4eC0+bnVtX3R4X3BvcnQpOwotCQkJa2ZyZWUod2NkOXh4eC0+dHhfY2hzKTsKLQkJCXdjZDl4eHgtPnR4X2NocyA9IE5VTEw7Ci0JCQl3Y2Q5eHh4LT5udW1fdHhfcG9ydCA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIk5vdCBhYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJWQgc2xpbWJ1cyB0eCBwb3J0c1xuIiwKLQkJCXdjZDl4eHgtPm51bV90eF9wb3J0KTsKLQl9Ci0JcmV0dXJuIDA7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9pbml0X3NsaW1zbGF2ZSk7Ci0KLWludCB3Y2Q5eHh4X2RlaW5pdF9zbGltc2xhdmUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpCi17Ci0JaWYgKHdjZDl4eHgtPm51bV9yeF9wb3J0KSB7Ci0JCXdjZDl4eHhfZGVhbGxvY19zbGltX3NoX2NoKHdjZDl4eHgtPnNsaW0sCi0JCQkJCXdjZDl4eHgtPm51bV9yeF9wb3J0LAotCQkJCQl3Y2Q5eHh4LT5yeF9jaHMpOwotCQl3Y2Q5eHh4LT5udW1fcnhfcG9ydCA9IDA7Ci0JfQotCWlmICh3Y2Q5eHh4LT5udW1fdHhfcG9ydCkgewotCQl3Y2Q5eHh4X2RlYWxsb2Nfc2xpbV9zaF9jaCh3Y2Q5eHh4LT5zbGltLAotCQkJCQl3Y2Q5eHh4LT5udW1fdHhfcG9ydCwKLQkJCQkJd2NkOXh4eC0+dHhfY2hzKTsKLQkJd2NkOXh4eC0+bnVtX3R4X3BvcnQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHdjZDl4eHhfYWxsb2Nfc2xpbV9zaF9jaChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCQkgICAgdTggd2NkOXh4eF9wZ2RfbGEsIHUzMiBjbnQsCi0JCQkJICAgIHN0cnVjdCB3Y2Q5eHh4X2NoICpjaGFubmVscywgdTMyIHBhdGgpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGNoX2lkeDsKLQotCS8qIFRoZSBzbGltYnVzIGNoYW5uZWwgYWxsb2NhdGlvbiBzZWVtIHRha2UgbG9uZ2VyIHRpbWUKLQkgKiBzbyBkbyB0aGUgYWxsb2NhdGlvbiB1cCBmcm9udCB0byBhdm9pZCBkZWxheSBpbiBzdGFydCBvZgotCSAqIHBsYXliYWNrCi0JICovCi0JcHJfZGVidWcoIiVzOiBwZ2RfbGFbJWRdXG4iLCBfX2Z1bmNfXywgd2NkOXh4eF9wZ2RfbGEpOwotCWZvciAoY2hfaWR4ID0gMDsgY2hfaWR4IDwgY250OyBjaF9pZHgrKykgewotCQlyZXQgPSBzbGltX2dldF9zbGF2ZXBvcnQod2NkOXh4eF9wZ2RfbGEsCi0JCQkJCWNoYW5uZWxzW2NoX2lkeF0ucG9ydCwKLQkJCQkJJmNoYW5uZWxzW2NoX2lkeF0uc3BoLCBwYXRoKTsKLQkJcHJfZGVidWcoIiVzOiBwZ2RfbGFbJWRdIGNoYW5uZWxzWyVkXS5wb3J0WyVkXVxuIgotCQkJImNoYW5uZWxzWyVkXS5zcGhbJWRdIHBhdGhbJWRdXG4iLAotCQkJX19mdW5jX18sIHdjZDl4eHhfcGdkX2xhLCBjaF9pZHgsCi0JCQljaGFubmVsc1tjaF9pZHhdLnBvcnQsCi0JCQljaF9pZHgsIGNoYW5uZWxzW2NoX2lkeF0uc3BoLCBwYXRoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHNsYXZlIHBvcnQgZmFpbHVyZSBpZFslZF0gcmV0WyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgY2hhbm5lbHNbY2hfaWR4XS5jaF9udW0sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCXJldCA9IHNsaW1fcXVlcnlfY2god2NkOXh4eC0+c2xpbSwKLQkJCQkgICAgY2hhbm5lbHNbY2hfaWR4XS5jaF9udW0sCi0JCQkJICAgICZjaGFubmVsc1tjaF9pZHhdLmNoX2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogc2xpbV9xdWVyeV9jaCBmYWlsZWQgY2gtbnVtWyVkXSByZXRbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVsc1tjaF9pZHhdLmNoX251bSwgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkOXh4eF9kZWFsbG9jX3NsaW1fc2hfY2goc3RydWN0IHNsaW1fZGV2aWNlICpzbGltLAotCQkJdTMyIGNudCwgc3RydWN0IHdjZDl4eHhfY2ggKmNoYW5uZWxzKQotewotCWludCBpZHggPSAwOwotCWludCByZXQgPSAwOwotCS8qIHNsaW1fZGVhbGxvY19jaCAqLwotCWZvciAoaWR4ID0gMDsgaWR4IDwgY250OyBpZHgrKykgewotCQlyZXQgPSBzbGltX2RlYWxsb2NfY2goc2xpbSwgY2hhbm5lbHNbaWR4XS5jaF9oKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHNsaW1fZGVhbGxvY19jaCBmYWlsIHJldFslZF0gY2hfaFslZF1cbiIsCi0JCQkJX19mdW5jX18sIHJldCwgY2hhbm5lbHNbaWR4XS5jaF9oKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBFbmFibGUgc2xpbWJ1cyBzbGF2ZSBkZXZpY2UgZm9yIFJYIHBhdGggKi8KLWludCB3Y2Q5eHh4X2NmZ19zbGltX3NjaF9yeChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsCi0JCQkgICAgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBiaXRfd2lkdGgsCi0JCQkgICAgdTE2ICpncnBoKQotewotCXU4IGNoX2NudCA9IDA7Ci0JdTE2IGNoX2hbU0xJTV9NQVhfUlhfUE9SVFNdID0gezB9OwotCXU4ICBwYXlsb2FkID0gMDsKLQl1MTYgY29kZWNfcG9ydCA9IDA7Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc2xpbV9jaCBwcm9wOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpyeDsKLQlpbnQgc2l6ZSA9IEFSUkFZX1NJWkUoY2hfaCk7Ci0KLQkvKiBDb25maWd1cmUgc2xhdmUgaW50ZXJmYWNlIGRldmljZSAqLwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCXBheWxvYWQgfD0gMSA8PCByeC0+c2hpZnQ7Ci0JCWlmIChjaF9jbnQgPCBzaXplKSB7Ci0JCQljaF9oW2NoX2NudF0gPSByeC0+Y2hfaDsKLQkJCWNoX2NudCsrOwotCQkJcHJfZGVidWcoImxpc3QgY2gtPmNoX2ggJWQgY2gtPnNwaCAlZFxuIiwKLQkJCQkgcngtPmNoX2gsIHJ4LT5zcGgpOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogYWxsb2NhdGVkIGNoYW5uZWwgbnVtYmVyICV1IGlzIG91dCBvZiBtYXggcmFuZ2FlICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjaF9jbnQsCi0JCQkgICAgICAgc2l6ZSk7Ci0JCQlyZXQgPSBFSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQlwcl9kZWJ1ZygiJXM6IGNoX2NudFslZF0gcmF0ZT0lZCBXQVRFUl9NQVJLX1ZBTCAlZFxuIiwKLQkJIF9fZnVuY19fLCBjaF9jbnQsIHJhdGUsIFdBVEVSX01BUktfVkFMKTsKLQkvKiBzbGltX2RlZmluZV9jaCBhcGkgKi8KLQlwcm9wLnByb3QgPSBTTElNX0FVVE9fSVNPOwotCWlmICgocmF0ZSA9PSA0NDEwMCkgfHwgKHJhdGUgPT0gODgyMDApIHx8IChyYXRlID09IDE3NjQwMCkgfHwKLQkgICAgKHJhdGUgPT0gMzUyODAwKSkgewotCQlwcm9wLmJhc2VyID0gU0xJTV9SQVRFXzExMDI1SFo7Ci0JCXByb3AucmF0ZW0gPSAocmF0ZS8xMTAyNSk7Ci0JfSBlbHNlIHsKLQkJcHJvcC5iYXNlciA9IFNMSU1fUkFURV80MDAwSFo7Ci0JCXByb3AucmF0ZW0gPSAocmF0ZS80MDAwKTsKLQl9Ci0JcHJvcC5kYXRhZiA9IFNMSU1fQ0hfREFUQUZfTk9UX0RFRklORUQ7Ci0JcHJvcC5hdXhmID0gU0xJTV9DSF9BVVhGX05PVF9BUFBMSUNBQkxFOwotCXByb3Auc2FtcGxlc3piaXRzID0gYml0X3dpZHRoOwotCi0JcHJfZGVidWcoIkJlZm9yZSBzbGltX2RlZmluZV9jaDpcbiIKLQkJICJjaF9jbnQgJWQsY2hfaFswXSAlZCBjaF9oWzFdICVkLCBncnBoICVkXG4iLAotCQkgY2hfY250LCBjaF9oWzBdLCBjaF9oWzFdLCAqZ3JwaCk7Ci0JcmV0ID0gc2xpbV9kZWZpbmVfY2god2NkOXh4eC0+c2xpbSwgJnByb3AsIGNoX2gsIGNoX2NudCwKLQkJCSAgICAgdHJ1ZSwgZ3JwaCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogc2xpbV9kZWZpbmVfY2ggZmFpbGVkIHJldFslZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCWNvZGVjX3BvcnQgPSByeC0+cG9ydDsKLQkJcHJfZGVidWcoIiVzOiBjb2RlY19wb3J0ICVkIHJ4IDB4JXAsIHBheWxvYWQgJWRcbiIKLQkJCSAic2hfY2gucnhfcG9ydF9jaF9yZWdfYmFzZTAgMHgleFxuIgotCQkJICJzaF9jaC5wb3J0X3J4X2NmZ19yZWdfYmFzZSAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBjb2RlY19wb3J0LCByeCwgcGF5bG9hZCwKLQkJCSBzaF9jaC5yeF9wb3J0X2NoX3JlZ19iYXNlLAotCQkJc2hfY2gucG9ydF9yeF9jZmdfcmVnX2Jhc2UpOwotCi0JCS8qIGxvb2sgZm9yIHRoZSB2YWxpZCBwb3J0IHJhbmdlIGFuZCBjaG9zZSB0aGUKLQkJICogcGF5bG9hZCBhY2NvcmRpbmdseQotCQkgKi8KLQkJLyogd3JpdGUgdG8gaW50ZXJmYWNlIGRldmljZSAqLwotCQlyZXQgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUod2NkOXh4eCwKLQkJCQlTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoCi0JCQkJc2hfY2gucnhfcG9ydF9jaF9yZWdfYmFzZSwgY29kZWNfcG9ydCksCi0JCQkJcGF5bG9hZCk7Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6SW50Zi1kZXYgZmFpbCByZWdbJWRdIHBheWxvYWRbJWRdIHJldFslZF1cbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJU0JfUEdEX1JYX1BPUlRfTVVMVElfQ0hBTk5FTF8wKAotCQkJCXNoX2NoLnJ4X3BvcnRfY2hfcmVnX2Jhc2UsIGNvZGVjX3BvcnQpLAotCQkJCXBheWxvYWQsIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQkvKiBjb25maWd1cmUgdGhlIHNsYXZlIHBvcnQgZm9yIHdhdGVyIG1hcmsgYW5kIGVuYWJsZSovCi0JCXJldCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAotCQkJCVNCX1BHRF9QT1JUX0NGR19CWVRFX0FERFIoCi0JCQkJc2hfY2gucG9ydF9yeF9jZmdfcmVnX2Jhc2UsIGNvZGVjX3BvcnQpLAotCQkJCVdBVEVSX01BUktfVkFMKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6d2F0ZXJtYXJrIHNldCBmYWlsdXJlIGZvciBwb3J0WyVkXSByZXRbJWRdIiwKLQkJCQlfX2Z1bmNfXywgY29kZWNfcG9ydCwgcmV0KTsKLQkJfQotCi0JCXJldCA9IHNsaW1fY29ubmVjdF9zaW5rKHdjZDl4eHgtPnNsaW0sICZyeC0+c3BoLCAxLCByeC0+Y2hfaCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBzbGltX2Nvbm5lY3Rfc2luayBmYWlsZWQgcmV0WyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2Nsb3NlX3NsaW1fc2NoOwotCQl9Ci0JfQotCS8qIHNsaW1fY29udHJvbF9jaCAqLwotCXJldCA9IHNsaW1fY29udHJvbF9jaCh3Y2Q5eHh4LT5zbGltLCAqZ3JwaCwgU0xJTV9DSF9BQ1RJVkFURSwKLQkJCSAgICAgIHRydWUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNsaW1fY29udHJvbF9jaCBmYWlsZWQgcmV0WyVkXVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9jbG9zZV9zbGltX3NjaDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycl9jbG9zZV9zbGltX3NjaDoKLQkvKiAgcmVsZWFzZSBhbGwgYWNxdWlyZWQgaGFuZGxlcyAqLwotCXdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfcngod2NkOXh4eCwgd2NkOXh4eF9jaF9saXN0LCAqZ3JwaCk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9jZmdfc2xpbV9zY2hfcngpOwotCi0vKiBFbmFibGUgc2xpbWJ1cyBzbGF2ZSBkZXZpY2UgZm9yIFJYIHBhdGggKi8KLWludCB3Y2Q5eHh4X2NmZ19zbGltX3NjaF90eChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsCi0JCQkgICAgdW5zaWduZWQgaW50IHJhdGUsIHVuc2lnbmVkIGludCBiaXRfd2lkdGgsCi0JCQkgICAgdTE2ICpncnBoKQotewotCXUxNiBjaF9jbnQgPSAwOwotCXUxNiBwYXlsb2FkID0gMDsKLQl1MTYgY2hfaFtTTElNX01BWF9UWF9QT1JUU10gPSB7MH07Ci0JdTE2IGNvZGVjX3BvcnQ7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKnR4OwotCWludCBzaXplID0gQVJSQVlfU0laRShjaF9oKTsKLQotCXN0cnVjdCBzbGltX2NoIHByb3A7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR4LCB3Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJcGF5bG9hZCB8PSAxIDw8IHR4LT5zaGlmdDsKLQkJaWYgKGNoX2NudCA8IHNpemUpIHsKLQkJCWNoX2hbY2hfY250XSA9IHR4LT5jaF9oOwotCQkJY2hfY250Kys7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBhbGxvY2F0ZWQgY2hhbm5lbCBudW1iZXIgJXUgaXMgb3V0IG9mIG1heCByYW5nYWUgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNoX2NudCwKLQkJCSAgICAgICBzaXplKTsKLQkJCXJldCA9IEVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JLyogc2xpbV9kZWZpbmVfY2ggYXBpICovCi0JcHJvcC5wcm90ID0gU0xJTV9BVVRPX0lTTzsKLQlwcm9wLmJhc2VyID0gU0xJTV9SQVRFXzQwMDBIWjsKLQlwcm9wLmRhdGFmID0gU0xJTV9DSF9EQVRBRl9OT1RfREVGSU5FRDsKLQlwcm9wLmF1eGYgPSBTTElNX0NIX0FVWEZfTk9UX0FQUExJQ0FCTEU7Ci0JcHJvcC5yYXRlbSA9IChyYXRlLzQwMDApOwotCXByb3Auc2FtcGxlc3piaXRzID0gYml0X3dpZHRoOwotCXJldCA9IHNsaW1fZGVmaW5lX2NoKHdjZDl4eHgtPnNsaW0sICZwcm9wLCBjaF9oLCBjaF9jbnQsCi0JCQkgICAgIHRydWUsIGdycGgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNsaW1fZGVmaW5lX2NoIGZhaWxlZCByZXRbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXByX2RlYnVnKCIlczogY2hfY250WyVkXSByYXRlWyVkXSBiaXR3aWR0aFsldV1cbiIsIF9fZnVuY19fLCBjaF9jbnQsCi0JCSByYXRlLCBiaXRfd2lkdGgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodHgsIHdjZDl4eHhfY2hfbGlzdCwgbGlzdCkgewotCQljb2RlY19wb3J0ID0gdHgtPnBvcnQ7Ci0JCXByX2RlYnVnKCIlczogY29kZWNfcG9ydCAlZCB0eCAweCVwLCBwYXlsb2FkIDB4JXhcbiIsCi0JCQkgX19mdW5jX18sIGNvZGVjX3BvcnQsIHR4LCBwYXlsb2FkKTsKLQkJLyogd3JpdGUgdG8gaW50ZXJmYWNlIGRldmljZSAqLwotCQlyZXQgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUod2NkOXh4eCwKLQkJCQlTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoY29kZWNfcG9ydCksCi0JCQkJcGF5bG9hZCAmIDB4MDBGRik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOkludGYtZGV2IGZhaWwgcmVnWyVkXSBwYXlsb2FkWyVkXSByZXRbJWRdXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCVNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMChjb2RlY19wb3J0KSwKLQkJCQlwYXlsb2FkLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJLyogcG9ydHMgOCw5ICovCi0JCXJldCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh3Y2Q5eHh4LAotCQkJCVNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMShjb2RlY19wb3J0KSwKLQkJCQkocGF5bG9hZCAmIDB4RkYwMCk+PjgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczpJbnRmLWRldiBmYWlsIHJlZ1slZF0gcGF5bG9hZFslZF0gcmV0WyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzEoY29kZWNfcG9ydCksCi0JCQkJcGF5bG9hZCwgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCS8qIGNvbmZpZ3VyZSB0aGUgc2xhdmUgcG9ydCBmb3Igd2F0ZXIgbWFyayBhbmQgZW5hYmxlKi8KLQkJcmV0ID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHdjZDl4eHgsCi0JCQkJU0JfUEdEX1BPUlRfQ0ZHX0JZVEVfQUREUigKLQkJCQlzaF9jaC5wb3J0X3R4X2NmZ19yZWdfYmFzZSwgY29kZWNfcG9ydCksCi0JCQkJV0FURVJfTUFSS19WQUwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczp3YXRlcm1hcmsgc2V0IGZhaWx1cmUgZm9yIHBvcnRbJWRdIHJldFslZF0iLAotCQkJCV9fZnVuY19fLCBjb2RlY19wb3J0LCByZXQpOwotCQl9Ci0KLQkJcmV0ID0gc2xpbV9jb25uZWN0X3NyYyh3Y2Q5eHh4LT5zbGltLCB0eC0+c3BoLCB0eC0+Y2hfaCk7Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHNsaW1fY29ubmVjdF9zcmMgZmFpbGVkIHJldFslZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQkvKiBzbGltX2NvbnRyb2xfY2ggKi8KLQlyZXQgPSBzbGltX2NvbnRyb2xfY2god2NkOXh4eC0+c2xpbSwgKmdycGgsIFNMSU1fQ0hfQUNUSVZBVEUsCi0JCQkgICAgICB0cnVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBzbGltX2NvbnRyb2xfY2ggZmFpbGVkIHJldFslZF1cbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCXJldHVybiAwOwotZXJyOgotCS8qIHJlbGVhc2UgYWxsIGFjcXVpcmVkIGhhbmRsZXMgKi8KLQl3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KHdjZDl4eHgsIHdjZDl4eHhfY2hfbGlzdCwgKmdycGgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KTsKLQotaW50IHdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfcngoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsIHUxNiBncnBoKQotewotCXUzMiBzcGhbU0xJTV9NQVhfUlhfUE9SVFNdID0gezB9OwotCWludCBjaF9jbnQgPSAwOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpyeDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocngsIHdjZDl4eHhfY2hfbGlzdCwgbGlzdCkKLQkJc3BoW2NoX2NudCsrXSA9IHJ4LT5zcGg7Ci0KLQlwcl9kZWJ1ZygiJXMgY2hfY2h0ICVkLCBzcGhbMF0gJWQgc3BoWzFdICVkXG4iLCBfX2Z1bmNfXywgY2hfY250LAotCQlzcGhbMF0sIHNwaFsxXSk7Ci0KLQkvKiBzbGltX2NvbnRyb2xfY2ggKFJFTU9WRSkgKi8KLQlwcl9kZWJ1ZygiJXMgYmVmb3JlIHNsaW1fY29udHJvbF9jaCBncnBoICVkXG4iLCBfX2Z1bmNfXywgZ3JwaCk7Ci0JcmV0ID0gc2xpbV9jb250cm9sX2NoKHdjZDl4eHgtPnNsaW0sIGdycGgsIFNMSU1fQ0hfUkVNT1ZFLCB0cnVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBzbGltX2NvbnRyb2xfY2ggZmFpbGVkIHJldFslZF1cbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9jbG9zZV9zbGltX3NjaF9yeCk7Ci0KLWludCB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqd2NkOXh4eF9jaF9saXN0LAotCQkJICAgICAgdTE2IGdycGgpCi17Ci0JdTMyIHNwaFtTTElNX01BWF9UWF9QT1JUU10gPSB7MH07Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNoX2NudCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKnR4OwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0eCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KQotCQlzcGhbY2hfY250KytdID0gdHgtPnNwaDsKLQotCXByX2RlYnVnKCIlcyBjaF9jaHQgJWQsIHNwaFswXSAlZCBzcGhbMV0gJWRcbiIsCi0JCV9fZnVuY19fLCBjaF9jbnQsIHNwaFswXSwgc3BoWzFdKTsKLQkvKiBzbGltX2NvbnRyb2xfY2ggKFJFTU9WRSkgKi8KLQlyZXQgPSBzbGltX2NvbnRyb2xfY2god2NkOXh4eC0+c2xpbSwgZ3JwaCwgU0xJTV9DSF9SRU1PVkUsIHRydWUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNsaW1fY29udHJvbF9jaCBmYWlsZWQgcmV0WyVkXVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eCk7Ci0KLWludCB3Y2Q5eHh4X2dldF9zbGF2ZV9wb3J0KHVuc2lnbmVkIGludCBjaF9udW0pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSAoY2hfbnVtIC0gQkFTRV9DSF9OVU0pOwotCXByX2RlYnVnKCIlczogY2hfbnVtWyVkXSBzbGF2ZSBwb3J0WyVkXVxuIiwgX19mdW5jX18sIGNoX251bSwgcmV0KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvcjotIEludmFsaWQgc2xhdmUgcG9ydCBmb3VuZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2dldF9zbGF2ZV9wb3J0KTsKLQotaW50IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwgdTE2IGdycGgpCi17Ci0JdTMyIHNwaFtTTElNX01BWF9UWF9QT1JUUyArIFNMSU1fTUFYX1JYX1BPUlRTXSA9IHswfTsKLQlpbnQgY2hfY250ID0gMDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqc2xpbV9jaDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2xpbV9jaCwgd2NkOXh4eF9jaF9saXN0LCBsaXN0KQotCQlzcGhbY2hfY250KytdID0gc2xpbV9jaC0+c3BoOwotCi0JLyogc2xpbV9kaXNjb25uZWN0X3BvcnQgKi8KLQlyZXQgPSBzbGltX2Rpc2Nvbm5lY3RfcG9ydHMod2NkOXh4eC0+c2xpbSwgc3BoLCBjaF9jbnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNsaW1fZGlzY29ubmVjdF9wb3J0cyBmYWlsZWQgcmV0WyVkXVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2Rpc2Nvbm5lY3RfcG9ydCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggbXV0ZXggYWNxdWlyZWQgKi8KLWludCB3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24odTMyIHBvcnRfaWQsCi0JCQkJc3RydWN0IGxpc3RfaGVhZCAqY29kZWNfZGFpX2xpc3QpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkICV1XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLAotCQljb2RlY19kYWlfbGlzdCwgbGlzdCkgewotCQlwcl9kZWJ1ZygiJXM6IGNoLT5wb3J0ICV1XG4iLCBfX2Z1bmNfXywgY2gtPnBvcnQpOwotCQlpZiAoY2gtPnBvcnQgPT0gcG9ydF9pZCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbik7Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBtdXRleCBhY3F1aXJlZCAqLwotaW50IHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbih1MzIgdGFibGUsIHUzMiBwb3J0X2lkLAotCQkJCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpjb2RlY19kYWksCi0JCQkJdTMyIG51bV9jb2RlY19kYWlzKQotewotCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyB2dGFibGUgPSB0YWJsZTsKLQl1MzIgc2l6ZSA9IHNpemVvZih0YWJsZSkgKiBCSVRTX1BFUl9CWVRFOwotCi0JcHJfZGVidWcoIiVzOiB2dGFibGUgMHglbHggcG9ydF9pZCAldSBzaXplICVkXG4iLCBfX2Z1bmNfXywKLQkJIHZ0YWJsZSwgcG9ydF9pZCwgc2l6ZSk7Ci0JZm9yX2VhY2hfc2V0X2JpdChpbmRleCwgJnZ0YWJsZSwgc2l6ZSkgewotCQlpZiAoaW5kZXggPCBudW1fY29kZWNfZGFpcykgewotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwKLQkJCQkJJmNvZGVjX2RhaVtpbmRleF0ud2NkOXh4eF9jaF9saXN0LAotCQkJCQlsaXN0KSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBpbmRleCAldSBjaC0+cG9ydCAldSB2dGFibGUgMHglbHhcbiIsCi0JCQkJCQlfX2Z1bmNfXywgaW5kZXgsIGNoLT5wb3J0LAotCQkJCQkJdnRhYmxlKTsKLQkJCQlpZiAoY2gtPnBvcnQgPT0gcG9ydF9pZCkgewotCQkJCQlwcl9lcnIoIiVzOiBUWCV1IGlzIHVzZWQgYnkgQUlGJXVfQ0FQIE1peGVyXG4iLAotCQkJCQkJCV9fZnVuY19fLCBwb3J0X2lkICsgMSwKLQkJCQkJCQkoaW5kZXggKyAxKS8yKTsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBpbmRleCAlZCBvZiBjb2RlYyBkYWkiLAotCQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93Y2Q5eHh4LXV0aWxzLmMgYi9kcml2ZXJzL21mZC93Y2Q5eHh4LXV0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjU4NWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvd2NkOXh4eC11dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LWlycS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXN1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXV0aWxzLmg+Ci0KLSNkZWZpbmUgUkVHX0JZVEVTIDIKLSNkZWZpbmUgVkFMX0JZVEVTIDEKLS8qCi0gKiBQYWdlIFJlZ2lzdGVyIEFkZHJlc3MgdGhhdCBBUFAgUHJvYyB1c2VzIHRvCi0gKiBhY2Nlc3MgV0NEOTMzNSBDb2RlYyByZWdpc3RlcnMgaXMgaWRlbnRpZmllZAotICogYXMgMHgwMAotICovCi0jZGVmaW5lIFBBR0VfUkVHX0FERFIgMHgwMAotCi1zdGF0aWMgZW51bSB3Y2Q5eHh4X2ludGZfc3RhdHVzIHdjZDl4eHhfaW50ZiA9IC0xOwotCi1zdGF0aWMgc3RydWN0IG1mZF9jZWxsIHRhdmlsX2RldnNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInFjb20td2NkLXBpbmN0cmwiLAotCQkub2ZfY29tcGF0aWJsZSA9ICJxY29tLHdjZC1waW5jdHJsIiwKLQl9LAotCXsKLQkJLm5hbWUgPSAidGF2aWxfY29kZWMiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1mZF9jZWxsIHRhc2hhX2RldnNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInRhc2hhX2NvZGVjIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0b210b21fZGV2c1tdID0gewotCXsKLQkJLm5hbWUgPSAidG9tdG9tX2NvZGVjIiwKLQl9LAotfTsKLQotc3RhdGljIGludCB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJdTMyICp2YWwpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCBuYW1lLCB2YWwpOwotCWlmIChyYykKLQkJZGV2X2VycihkZXYsICIlczogTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCi0JCQlfX2Z1bmNfXywgbmFtZSwgZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB3Y2Q5eHh4X2R0X3BhcnNlX21pY2JpYXNfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IHdjZDl4eHhfbWljYmlhc19zZXR0aW5nICptYikKLXsKLQl1MzIgcHJvcF92YWw7Ci0JaW50IHJjOwotCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhcy1sZG9oLXYiLCBOVUxMKSkgewotCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAotCQkJCQkJICAicWNvbSxjZGMtbWljYmlhcy1sZG9oLXYiLAotCQkJCQkJICAmcHJvcF92YWwpOwotCQlpZiAoIXJjKQotCQkJbWItPmxkb2hfdiAgPSAgKHU4KXByb3BfdmFsOwotCX0KLQotCS8qIE1CMSAqLwotCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQxLW12IiwKLQkJCSAgICAgTlVMTCkpIHsKLQkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKLQkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQxLW12IiwKLQkJCQkJCSAgICZwcm9wX3ZhbCk7Ci0JCWlmICghcmMpCi0JCQltYi0+Y2ZpbHQxX212ID0gcHJvcF92YWw7Ci0KLQkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKLQkJCQkJCSJxY29tLGNkYy1taWNiaWFzMS1jZmlsdC1zZWwiLAotCQkJCQkJJnByb3BfdmFsKTsKLQkJaWYgKCFyYykKLQkJCW1iLT5iaWFzMV9jZmlsdF9zZWwgPSAodTgpcHJvcF92YWw7Ci0KLQl9IGVsc2UgaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhczEtbXYiLAotCQkJCSAgICBOVUxMKSkgewotCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAotCQkJCQkJICAicWNvbSxjZGMtbWljYmlhczEtbXYiLAotCQkJCQkJICAmcHJvcF92YWwpOwotCQlpZiAoIXJjKQotCQkJbWItPm1pY2IxX212ID0gcHJvcF92YWw7Ci0JfSBlbHNlIHsKLQkJZGV2X2luZm8oZGV2LCAiJXM6IE1pY2JpYXMxIERUIHByb3BlcnR5IG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQl9Ci0KLQkvKiBNQjIgKi8KLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzLWNmaWx0Mi1tdiIsCi0JCQkgICAgIE5VTEwpKSB7Ci0JCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCi0JCQkJCQkgICJxY29tLGNkYy1taWNiaWFzLWNmaWx0Mi1tdiIsCi0JCQkJCQkgICAmcHJvcF92YWwpOwotCQlpZiAoIXJjKQotCQkJbWItPmNmaWx0Ml9tdiA9IHByb3BfdmFsOwotCi0JCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCi0JCQkJCQkicWNvbSxjZGMtbWljYmlhczItY2ZpbHQtc2VsIiwKLQkJCQkJCSZwcm9wX3ZhbCk7Ci0JCWlmICghcmMpCi0JCQltYi0+YmlhczJfY2ZpbHRfc2VsID0gKHU4KXByb3BfdmFsOwotCi0JfSBlbHNlIGlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMyLW12IiwKLQkJCQkgICAgTlVMTCkpIHsKLQkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKLQkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXMyLW12IiwKLQkJCQkJCSAgJnByb3BfdmFsKTsKLQkJaWYgKCFyYykKLQkJCW1iLT5taWNiMl9tdiA9IHByb3BfdmFsOwotCX0gZWxzZSB7Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBNaWNiaWFzMiBEVCBwcm9wZXJ0eSBub3QgZm91bmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotCi0JLyogTUIzICovCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhcy1jZmlsdDMtbXYiLAotCQkJICAgICBOVUxMKSkgewotCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAotCQkJCQkJICAicWNvbSxjZGMtbWljYmlhcy1jZmlsdDMtbXYiLAotCQkJCQkJICAgJnByb3BfdmFsKTsKLQkJaWYgKCFyYykKLQkJCW1iLT5jZmlsdDNfbXYgPSBwcm9wX3ZhbDsKLQotCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAotCQkJCQkJInFjb20sY2RjLW1pY2JpYXMzLWNmaWx0LXNlbCIsCi0JCQkJCQkmcHJvcF92YWwpOwotCQlpZiAoIXJjKQotCQkJbWItPmJpYXMzX2NmaWx0X3NlbCA9ICh1OClwcm9wX3ZhbDsKLQotCX0gZWxzZSBpZiAob2ZfZmluZF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzMy1tdiIsCi0JCQkJICAgIE5VTEwpKSB7Ci0JCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCi0JCQkJCQkgICJxY29tLGNkYy1taWNiaWFzMy1tdiIsCi0JCQkJCQkgICZwcm9wX3ZhbCk7Ci0JCWlmICghcmMpCi0JCQltYi0+bWljYjNfbXYgPSBwcm9wX3ZhbDsKLQl9IGVsc2UgewotCQlkZXZfaW5mbyhkZXYsICIlczogTWljYmlhczMgRFQgcHJvcGVydHkgbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18pOwotCX0KLQotCS8qIE1CNCAqLwotCWlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXM0LWNmaWx0LXNlbCIsCi0JCQkgICAgIE5VTEwpKSB7Ci0JCXJjID0gd2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsCi0JCQkJCQkicWNvbSxjZGMtbWljYmlhczQtY2ZpbHQtc2VsIiwKLQkJCQkJCSZwcm9wX3ZhbCk7Ci0JCWlmICghcmMpCi0JCQltYi0+YmlhczRfY2ZpbHRfc2VsID0gKHU4KXByb3BfdmFsOwotCi0JfSBlbHNlIGlmIChvZl9maW5kX3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXM0LW12IiwKLQkJCQkgICAgTlVMTCkpIHsKLQkJcmMgPSB3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwKLQkJCQkJCSAgInFjb20sY2RjLW1pY2JpYXM0LW12IiwKLQkJCQkJCSAgJnByb3BfdmFsKTsKLQkJaWYgKCFyYykKLQkJCW1iLT5taWNiNF9tdiA9IHByb3BfdmFsOwotCX0gZWxzZSB7Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBNaWNiaWFzNCBEVCBwcm9wZXJ0eSBub3QgZm91bmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotCi0JbWItPmJpYXMxX2NhcF9tb2RlID0KLQkgICAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXMxLWV4dC1jYXAiKSA/Ci0JIE1JQ0JJQVNfRVhUX0JZUF9DQVAgOiBNSUNCSUFTX05PX0VYVF9CWVBfQ0FQKTsKLQltYi0+YmlhczJfY2FwX21vZGUgPQotCSAgIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtbWljYmlhczItZXh0LWNhcCIpID8KLQkgICAgTUlDQklBU19FWFRfQllQX0NBUCA6IE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVApOwotCW1iLT5iaWFzM19jYXBfbW9kZSA9Ci0JICAgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLGNkYy1taWNiaWFzMy1leHQtY2FwIikgPwotCSAgICBNSUNCSUFTX0VYVF9CWVBfQ0FQIDogTUlDQklBU19OT19FWFRfQllQX0NBUCk7Ci0JbWItPmJpYXM0X2NhcF9tb2RlID0KLQkgICAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sY2RjLW1pY2JpYXM0LWV4dC1jYXAiKSA/Ci0JICAgIE1JQ0JJQVNfRVhUX0JZUF9DQVAgOiBNSUNCSUFTX05PX0VYVF9CWVBfQ0FQKTsKLQotCW1iLT5iaWFzMl9pc19oZWFkc2V0X29ubHkgPQotCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCSAgICAgICJxY29tLGNkYy1taWNiaWFzMi1oZWFkc2V0LW9ubHkiKTsKLQotCS8qIFByaW50IG1pY2JpYXMgaW5mbyAqLwotCWRldl9kYmcoZGV2LCAiJXM6IGxkb2hfdiAgJXUgY2ZpbHQxX212ICV1IGNmaWx0Ml9tdiAldSBjZmlsdDNfbXYgJXUiLAotCQlfX2Z1bmNfXywgKHUzMiltYi0+bGRvaF92LCAodTMyKW1iLT5jZmlsdDFfbXYsCi0JCSh1MzIpbWItPmNmaWx0Ml9tdiwgKHUzMiltYi0+Y2ZpbHQzX212KTsKLQotCWRldl9kYmcoZGV2LCAiJXM6IG1pY2IxX212ICV1IG1pY2IyX212ICV1IG1pY2IzX212ICV1IG1pY2I0X212ICV1IiwKLQkJX19mdW5jX18sIG1iLT5taWNiMV9tdiwgbWItPm1pY2IyX212LAotCQltYi0+bWljYjNfbXYsIG1iLT5taWNiNF9tdik7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBiaWFzMV9jZmlsdF9zZWwgJXUgYmlhczJfY2ZpbHRfc2VsICV1XG4iLAotCQlfX2Z1bmNfXywgKHUzMiltYi0+YmlhczFfY2ZpbHRfc2VsLCAodTMyKW1iLT5iaWFzMl9jZmlsdF9zZWwpOwotCi0JZGV2X2RiZyhkZXYsICIlczogYmlhczNfY2ZpbHRfc2VsICV1IGJpYXM0X2NmaWx0X3NlbCAldVxuIiwKLQkJX19mdW5jX18sICh1MzIpbWItPmJpYXMzX2NmaWx0X3NlbCwgKHUzMiltYi0+YmlhczRfY2ZpbHRfc2VsKTsKLQotCWRldl9kYmcoZGV2LCAiJXM6IGJpYXMxX2V4dF9jYXAgJWQgYmlhczJfZXh0X2NhcCAlZFxuIiwKLQkJX19mdW5jX18sIG1iLT5iaWFzMV9jYXBfbW9kZSwgbWItPmJpYXMyX2NhcF9tb2RlKTsKLQotCWRldl9kYmcoZGV2LCAiJXM6IGJpYXMzX2V4dF9jYXAgJWQgYmlhczRfZXh0X2NhcCAlZFxuIiwKLQkJX19mdW5jX18sIG1iLT5iaWFzM19jYXBfbW9kZSwgbWItPmJpYXM0X2NhcF9tb2RlKTsKLQotCWRldl9kYmcoZGV2LCAiJXM6IGJpYXMyX2lzX2hlYWRzZXRfb25seSAlZFxuIiwKLQkJX19mdW5jX18sIG1iLT5iaWFzMl9pc19oZWFkc2V0X29ubHkpOwotfQotCi0vKgotICogd2NkOXh4eF92YWxpZGF0ZV9kbWljX3NhbXBsZV9yYXRlOgotICoJR2l2ZW4gdGhlIGRtaWNfc2FtcGxlX3JhdGUgYW5kIG1jbGsgcmF0ZSwgdmFsaWRhdGUgdGhlCi0gKglkbWljX3NhbXBsZV9yYXRlLiBJZiBkbWljIHJhdGUgaXMgZm91bmQgdG8gYmUgaW52YWxpZCwKLSAqCWFzc2lnbiB0aGUgZG1pYyByYXRlIGFzIHVuZGVmaW5lZCwgc28gaW5kaXZpZHVhbCBjb2RlYwotICoJZHJpdmVycyBjYW4gdXNlIHRoZWlyIG93biBkZWZhdWx0cwotICogQGRldjogdGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIGRtaWMgaXMgdG8gYmUgY29uZmlndXJlZAotICogQGRtaWNfc2FtcGxlX3JhdGU6IFRoZSBpbnB1dCBkbWljX3NhbXBsZV9yYXRlCi0gKiBAbWNsa19yYXRlOiBUaGUgaW5wdXQgY29kZWMgbWNsayByYXRlCi0gKiBAZG1pY19yYXRlX3R5cGU6IFN0cmluZyB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBkbWljIHNhbXBsZQotICoJCSAgICByYXRlLCB1c2VkIGZvciBkZWJ1Zy9lcnJvciBsb2dnaW5nLgotICovCi1zdGF0aWMgdTMyIHdjZDl4eHhfdmFsaWRhdGVfZG1pY19zYW1wbGVfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXUzMiBkbWljX3NhbXBsZV9yYXRlLCB1MzIgbWNsa19yYXRlLAotCQljb25zdCBjaGFyICpkbWljX3JhdGVfdHlwZSkKLXsKLQl1MzIgZGl2X2ZhY3RvcjsKLQotCWlmIChkbWljX3NhbXBsZV9yYXRlID09IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQgfHwKLQkgICAgbWNsa19yYXRlICUgZG1pY19zYW1wbGVfcmF0ZSAhPSAwKQotCQlnb3RvIHVuZGVmaW5lZF9yYXRlOwotCi0JZGl2X2ZhY3RvciA9IG1jbGtfcmF0ZSAvIGRtaWNfc2FtcGxlX3JhdGU7Ci0KLQlzd2l0Y2ggKGRpdl9mYWN0b3IpIHsKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNDoKLQljYXNlIDg6Ci0JY2FzZSAxNjoKLQkJLyogVmFsaWQgZG1pYyBESVYgZmFjdG9ycyAqLwotCQlkZXZfZGJnKGRldiwgIiVzOiBETUlDX0RJViA9ICV1LCBtY2xrX3JhdGUgPSAldVxuIiwKLQkJCV9fZnVuY19fLCBkaXZfZmFjdG9yLCBtY2xrX3JhdGUpOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCS8qCi0JCSAqIERJViA2IGlzIHZhbGlkIGZvciBib3RoIDkuNk1IeiBhbmQgMTIuMjg4TUh6Ci0JCSAqIE1DTEsgb24gVGF2aWwuIE9sZGVyIGNvZGVjcyBzdXBwb3J0IERJVjYgb25seQotCQkgKiBmb3IgMTIuMjg4TUh6IE1DTEsuCi0JCSAqLwotCQlpZiAoKG1jbGtfcmF0ZSA9PSBXQ0Q5WFhYX01DTEtfQ0xLXzlQNkhaKSAmJgotCQkgICAgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAgICAicWNvbSx0YXZpbC1zbGltLXBnZCIpKSkKLQkJCWRldl9kYmcoZGV2LCAiJXM6IERNSUNfRElWID0gJXUsIG1jbGtfcmF0ZSA9ICV1XG4iLAotCQkJCV9fZnVuY19fLCBkaXZfZmFjdG9yLCBtY2xrX3JhdGUpOwotCQllbHNlIGlmIChtY2xrX3JhdGUgIT0gV0NEOVhYWF9NQ0xLX0NMS18xMlAyODhNSFopCi0JCQlnb3RvIHVuZGVmaW5lZF9yYXRlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBBbnkgb3RoZXIgRElWIGZhY3RvciBpcyBpbnZhbGlkICovCi0JCWdvdG8gdW5kZWZpbmVkX3JhdGU7Ci0JfQotCi0JcmV0dXJuIGRtaWNfc2FtcGxlX3JhdGU7Ci0KLXVuZGVmaW5lZF9yYXRlOgotCWRldl9kYmcoZGV2LCAiJXM6IEludmFsaWQgJXMgPSAlZCwgZm9yIG1jbGsgJWRcbiIsCi0JCSBfX2Z1bmNfXywgZG1pY19yYXRlX3R5cGUsIGRtaWNfc2FtcGxlX3JhdGUsIG1jbGtfcmF0ZSk7Ci0JZG1pY19zYW1wbGVfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQ7Ci0KLQlyZXR1cm4gZG1pY19zYW1wbGVfcmF0ZTsKLX0KLQotLyoKLSAqIHdjZDl4eHhfcG9wdWxhdGVfZHRfZGF0YToKLSAqCVBhcnNlIGRldmljZSB0cmVlIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBjb2RlYyBkZXZpY2UKLSAqCi0gKiBAZGV2OiBwb2ludGVyIHRvIGNvZGVjIGRldmljZQotICoKLSAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgcGxhdGZvcm0gZGF0YSByZXN1bHRpbmcgZnJvbSBwYXJzaW5nCi0gKiBkZXZpY2UgdHJlZS4KLSAqLwotc3RydWN0IHdjZDl4eHhfcGRhdGEgKndjZDl4eHhfcG9wdWxhdGVfZHRfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhOwotCXUzMiBkbWljX3NhbXBsZV9yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRDsKLQl1MzIgbWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEOwotCXUzMiBlY3BwX2RtaWNfc2FtcGxlX3JhdGUgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEOwotCXUzMiBkbWljX2Nsa19kcml2ZSA9IFdDRDlYWFhfRE1JQ19DTEtfRFJJVkVfVU5ERUZJTkVEOwotCXUzMiBwcm9wX3ZhbDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+b2Zfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSksCi0JCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpCi0JCXJldHVybiBOVUxMOwotCi0JLyogUGFyc2UgcG93ZXIgc3VwcGxpZXMgKi8KLQltc21fY2RjX2dldF9wb3dlcl9zdXBwbGllcyhkZXYsICZwZGF0YS0+cmVndWxhdG9yLAotCQkJCSAgICZwZGF0YS0+bnVtX3N1cHBsaWVzKTsKLQlpZiAoIXBkYXRhLT5yZWd1bGF0b3IgfHwgKHBkYXRhLT5udW1fc3VwcGxpZXMgPD0gMCkpIHsKLQkJZGV2X2VycihkZXYsICIlczogbm8gcG93ZXIgc3VwcGxpZXMgZGVmaW5lZCBmb3IgY29kZWNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3Bvd2VyX3N1cDsKLQl9Ci0KLQkvKiBQYXJzZSBtaWNiaWFzIGluZm8gKi8KLQl3Y2Q5eHh4X2R0X3BhcnNlX21pY2JpYXNfaW5mbyhkZXYsICZwZGF0YS0+bWljYmlhcyk7Ci0KLQlwZGF0YS0+d2NkX3JzdF9ucCA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLAotCQkJCQkgICAgICJxY29tLHdjZC1yc3QtZ3Bpby1ub2RlIiwgMCk7Ci0JaWYgKCFwZGF0YS0+d2NkX3JzdF9ucCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sICJxY29tLHdjZC1yc3QtZ3Bpby1ub2RlIiwKLQkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZ290byBlcnJfcGFyc2VfZHRfcHJvcDsKLQl9Ci0KLQlwZGF0YS0+aGFzX2J1Y2tfdnNlbF9ncGlvID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJCSJxY29tLGhhcy1idWNrLXZzZWwtZ3BpbyIpOwotCWlmIChwZGF0YS0+aGFzX2J1Y2tfdnNlbF9ncGlvKSB7Ci0JCXBkYXRhLT5idWNrX3ZzZWxfY3RsX25wID0gb2ZfcGFyc2VfcGhhbmRsZShkZXYtPm9mX25vZGUsCi0JCQkJInFjb20sYnVjay12c2VsLWdwaW8tbm9kZSIsIDApOwotCQlpZiAoIXBkYXRhLT5idWNrX3ZzZWxfY3RsX25wKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzIE5vIGVudHJ5IGZvciAlcyBwcm9wZXJ0eSBpbiBub2RlICVzXG4iLAotCQkJCV9fZnVuY19fLCAicWNvbSxidWNrLXZzZWwtZ3Bpby1ub2RlIiwKLQkJCQlkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCQlnb3RvIGVycl9wYXJzZV9kdF9wcm9wOwotCQl9Ci0JfQotCi0JaWYgKCEod2NkOXh4eF9yZWFkX29mX3Byb3BlcnR5X3UzMihkZXYsICJxY29tLGNkYy1tY2xrLWNsay1yYXRlIiwKLQkJCQkJICAgJnByb3BfdmFsKSkpCi0JCXBkYXRhLT5tY2xrX3JhdGUgPSBwcm9wX3ZhbDsKLQotCWlmIChwZGF0YS0+bWNsa19yYXRlICE9IFdDRDlYWFhfTUNMS19DTEtfOVA2SFogJiYKLQkgICAgcGRhdGEtPm1jbGtfcmF0ZSAhPSBXQ0Q5WFhYX01DTEtfQ0xLXzEyUDI4OE1IWikgewotCQlkZXZfZXJyKGRldiwgIiVzOiBJbnZhbGlkIG1jbGtfcmF0ZSA9ICV1XG4iLCBfX2Z1bmNfXywKLQkJCXBkYXRhLT5tY2xrX3JhdGUpOwotCQlnb3RvIGVycl9wYXJzZV9kdF9wcm9wOwotCX0KLQotCWlmICghKHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LCAicWNvbSxjZGMtZG1pYy1zYW1wbGUtcmF0ZSIsCi0JCQkJCSAgICZwcm9wX3ZhbCkpKQotCQlkbWljX3NhbXBsZV9yYXRlID0gcHJvcF92YWw7Ci0KLQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9IHdjZDl4eHhfdmFsaWRhdGVfZG1pY19zYW1wbGVfcmF0ZShkZXYsCi0JCQkJCQkJZG1pY19zYW1wbGVfcmF0ZSwKLQkJCQkJCQlwZGF0YS0+bWNsa19yYXRlLAotCQkJCQkJCSJhdWRpb19kbWljX3JhdGUiKTsKLQlpZiAoISh3Y2Q5eHh4X3JlYWRfb2ZfcHJvcGVydHlfdTMyKGRldiwgInFjb20sY2RjLW1hZC1kbWljLXJhdGUiLAotCQkJCQkgICAmcHJvcF92YWwpKSkKLQkJbWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBwcm9wX3ZhbDsKLQotCXBkYXRhLT5tYWRfZG1pY19zYW1wbGVfcmF0ZSA9IHdjZDl4eHhfdmFsaWRhdGVfZG1pY19zYW1wbGVfcmF0ZShkZXYsCi0JCQkJCQkJbWFkX2RtaWNfc2FtcGxlX3JhdGUsCi0JCQkJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQkJCQkibWFkX2RtaWNfcmF0ZSIpOwotCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCAicWNvbSxjZGMtZWNwcC1kbWljLXJhdGUiLCBOVUxMKSkgewotCQlyYyA9IHdjZDl4eHhfcmVhZF9vZl9wcm9wZXJ0eV91MzIoZGV2LAotCQkJCQkJICAicWNvbSxjZGMtZWNwcC1kbWljLXJhdGUiLAotCQkJCQkJICAmcHJvcF92YWwpOwotCQlpZiAoIXJjKQotCQkJZWNwcF9kbWljX3NhbXBsZV9yYXRlID0gcHJvcF92YWw7Ci0JfQotCi0JcGRhdGEtPmVjcHBfZG1pY19zYW1wbGVfcmF0ZSA9IHdjZDl4eHhfdmFsaWRhdGVfZG1pY19zYW1wbGVfcmF0ZShkZXYsCi0JCQkJCQkJZWNwcF9kbWljX3NhbXBsZV9yYXRlLAotCQkJCQkJCXBkYXRhLT5tY2xrX3JhdGUsCi0JCQkJCQkJImVjcHBfZG1pY19yYXRlIik7Ci0KLQlpZiAoIShvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsCi0JCQkJICAgInFjb20sY2RjLWRtaWMtY2xrLWRydi1zdHJlbmd0aCIsCi0JCQkJICAgJnByb3BfdmFsKSkpIHsKLQkJZG1pY19jbGtfZHJpdmUgPSBwcm9wX3ZhbDsKLQotCQlpZiAoZG1pY19jbGtfZHJpdmUgIT0gMiAmJiBkbWljX2Nsa19kcml2ZSAhPSA0ICYmCi0JCSAgICBkbWljX2Nsa19kcml2ZSAhPSA4ICYmIGRtaWNfY2xrX2RyaXZlICE9IDE2KQotCQkJZGV2X2VycihkZXYsICJJbnZhbGlkIGNkYy1kbWljLWNsay1kcnYtc3RyZW5ndGggJWRcbiIsCi0JCQkJZG1pY19jbGtfZHJpdmUpOwotCX0KLQotCXBkYXRhLT5kbWljX2Nsa19kcnYgPSBkbWljX2Nsa19kcml2ZTsKLQotCXJldHVybiBwZGF0YTsKLQotZXJyX3BhcnNlX2R0X3Byb3A6Ci0JZGV2bV9rZnJlZShkZXYsIHBkYXRhLT5yZWd1bGF0b3IpOwotCXBkYXRhLT5yZWd1bGF0b3IgPSBOVUxMOwotCXBkYXRhLT5udW1fc3VwcGxpZXMgPSAwOwotZXJyX3Bvd2VyX3N1cDoKLQlkZXZtX2tmcmVlKGRldiwgcGRhdGEpOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3BvcHVsYXRlX2R0X2RhdGEpOwotCi1zdGF0aWMgYm9vbCBpc193Y2Q5eHh4X3JlZ19wb3dlcl9kb3duKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1MTYgcnJlZykKLXsKLQlib29sIHJldCA9IGZhbHNlOwotCWludCBpOwotCXN0cnVjdCB3Y2Q5eHh4X3Bvd2VyX3JlZ2lvbiAqd2NkOXh4eF9wd3I7Ci0KLQlpZiAoIXdjZDl4eHgpCi0JCXJldHVybiByZXQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0NEOVhYWF9NQVhfUFdSX1JFR0lPTlM7IGkrKykgewotCQl3Y2Q5eHh4X3B3ciA9IHdjZDl4eHgtPndjZDl4eHhfcHdyW2ldOwotCQlpZiAoIXdjZDl4eHhfcHdyKQotCQkJY29udGludWU7Ci0JCWlmICgoKHdjZDl4eHhfcHdyLT5wd3JfY29sbGFwc2VfcmVnX21pbiA9PSAwKSAmJgotCQkgICAgICh3Y2Q5eHh4X3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19tYXggPT0gMCkpIHx8Ci0JCSAgICAod2NkOXh4eF9wd3ItPnBvd2VyX3N0YXRlID09Ci0JCSAgICAgV0NEX1JFR0lPTl9QT1dFUl9DT0xMQVBTRV9SRU1PVkUpKQotCQkJcmV0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKCgod2NkOXh4eF9wd3ItPnBvd2VyX3N0YXRlID09Ci0JCQkgICBXQ0RfUkVHSU9OX1BPV0VSX0RPV04pIHx8Ci0JCQkgICh3Y2Q5eHh4X3B3ci0+cG93ZXJfc3RhdGUgPT0KLQkJCSAgIFdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfQkVHSU4pKSAmJgotCQkJIChycmVnID49IHdjZDl4eHhfcHdyLT5wd3JfY29sbGFwc2VfcmVnX21pbikgJiYKLQkJCSAocnJlZyA8PSB3Y2Q5eHh4X3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19tYXgpKQotCQkJcmV0ID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZDl4eHhfcGFnZV93cml0ZToKLSAqCVJldHJpZXZlIHBhZ2UgbnVtYmVyIGZyb20gcmVnaXN0ZXIgYW5kCi0gKgl3cml0ZSB0aGF0IHBhZ2UgbnVtYmVyIHRvIHRoZSBwYWdlIGFkZHJlc3MuCi0gKglDYWxsZWQgdW5kZXIgaW9fbG9jayBhY3F1aXNpdGlvbi4KLSAqCi0gKiBAd2NkOXh4eDogcG9pbnRlciB0byB3Y2Q5eHh4Ci0gKiBAcmVnOiBSZWdpc3RlciBhZGRyZXNzIGZyb20gd2hpY2ggcGFnZSBudW1iZXIgaXMgcmV0cmlldmVkCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgotICovCi1pbnQgd2NkOXh4eF9wYWdlX3dyaXRlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1bnNpZ25lZCBzaG9ydCAqcmVnKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIHNob3J0IGNfcmVnLCByZWdfYWRkcjsKLQl1OCBwZ19udW0sIHByZXZfcGdfbnVtOwotCi0JaWYgKHdjZDl4eHgtPnR5cGUgIT0gV0NEOTMzNSAmJiB3Y2Q5eHh4LT50eXBlICE9IFdDRDkzNFgpCi0JCXJldHVybiByZXQ7Ci0KLQljX3JlZyA9ICpyZWc7Ci0JcGdfbnVtID0gY19yZWcgPj4gODsKLQlyZWdfYWRkciA9IGNfcmVnICYgMHhmZjsKLQlpZiAod2NkOXh4eC0+cHJldl9wZ192YWxpZCkgewotCQlwcmV2X3BnX251bSA9IHdjZDl4eHgtPnByZXZfcGc7Ci0JCWlmIChwcmV2X3BnX251bSAhPSBwZ19udW0pIHsKLQkJCXJldCA9IHdjZDl4eHgtPndyaXRlX2RldigKLQkJCQkJd2NkOXh4eCwgUEFHRV9SRUdfQUREUiwgMSwKLQkJCQkJKHZvaWQgKikgJnBnX251bSwgZmFsc2UpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcHJfZXJyKCJwYWdlIHdyaXRlIGVycm9yLCBwZ19udW06IDB4JXhcbiIsCi0JCQkJCXBnX251bSk7Ci0JCQllbHNlIHsKLQkJCQl3Y2Q5eHh4LT5wcmV2X3BnID0gcGdfbnVtOwotCQkJCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IFBhZ2UgMHgleCBXcml0ZSB0byAweDAwXG4iLAotCQkJCQlfX2Z1bmNfXywgcGdfbnVtKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IHdjZDl4eHgtPndyaXRlX2RldigKLQkJCQl3Y2Q5eHh4LCBQQUdFX1JFR19BRERSLCAxLCAodm9pZCAqKSAmcGdfbnVtLAotCQkJCWZhbHNlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoInBhZ2Ugd3JpdGUgZXJyb3IsIHBnX251bTogMHgleFxuIiwgcGdfbnVtKTsKLQkJZWxzZSB7Ci0JCQl3Y2Q5eHh4LT5wcmV2X3BnID0gcGdfbnVtOwotCQkJd2NkOXh4eC0+cHJldl9wZ192YWxpZCA9IHRydWU7Ci0JCQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiBQYWdlIDB4JXggV3JpdGUgdG8gMHgwMFxuIiwKLQkJCQlfX2Z1bmNfXywgcGdfbnVtKTsKLQkJfQotCX0KLQkqcmVnID0gcmVnX2FkZHI7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9wYWdlX3dyaXRlKTsKLQotc3RhdGljIGludCByZWdtYXBfYnVzX3JlYWQodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkgICB2b2lkICp2YWwsIHNpemVfdCB2YWxfc2l6ZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgc2hvcnQgY19yZWcsIHJyZWc7Ci0JaW50IHJldCwgaTsKLQotCWlmICghd2NkOXh4eCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiB3Y2Q5eHh4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghcmVnIHx8ICF2YWwpIHsKLQkJZGV2X2VycihkZXYsICIlczogcmVnIG9yIHZhbCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChyZWdfc2l6ZSAhPSBSRUdfQllURVMpIHsKLQkJZGV2X2VycihkZXYsICIlczogcmVnaXN0ZXIgc2l6ZSAlemQgYnl0ZXMsIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVnX3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQljX3JlZyA9ICoodTE2ICopcmVnOwotCXJyZWcgPSBjX3JlZzsKLQotCWlmIChpc193Y2Q5eHh4X3JlZ19wb3dlcl9kb3duKHdjZDl4eHgsIHJyZWcpKSB7Ci0JCXJldCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCB2YWxfc2l6ZTsgaSsrKQotCQkJKCh1OCAqKXZhbClbaV0gPSAwOwotCQlnb3RvIGVycjsKLQl9Ci0JcmV0ID0gd2NkOXh4eF9wYWdlX3dyaXRlKHdjZDl4eHgsICZjX3JlZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0JcmV0ID0gd2NkOXh4eC0+cmVhZF9kZXYod2NkOXh4eCwgY19yZWcsIHZhbF9zaXplLCB2YWwsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICIlczogQ29kZWMgcmVhZCBmYWlsZWQgKCVkKSwgcmVnOiAweCV4LCBzaXplOiV6ZFxuIiwKLQkJCV9fZnVuY19fLCByZXQsIHJyZWcsIHZhbF9zaXplKTsKLQllbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IHZhbF9zaXplOyBpKyspCi0JCQlkZXZfZGJnKGRldiwgIiVzOiBSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sICgodTggKil2YWwpW2ldLCBycmVnICsgaSk7Ci0JfQotZXJyOgotCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlZ21hcF9idXNfZ2F0aGVyX3dyaXRlKHZvaWQgKmNvbnRleHQsCi0JCQkJICAgY29uc3Qgdm9pZCAqcmVnLCBzaXplX3QgcmVnX3NpemUsCi0JCQkJICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIHNob3J0IGNfcmVnLCBycmVnOwotCWludCByZXQsIGk7Ci0KLQlpZiAoIXdjZDl4eHgpIHsKLQkJZGV2X2VycihkZXYsICIlczogd2NkOXh4eCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXJlZyB8fCAhdmFsKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZyBvciB2YWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHJlZ19zaXplICE9IFJFR19CWVRFUykgewotCQlkZXZfZXJyKGRldiwgIiVzOiByZWdpc3RlciBzaXplICV6ZCBieXRlcywgbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCByZWdfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQljX3JlZyA9ICoodTE2ICopcmVnOwotCXJyZWcgPSBjX3JlZzsKLQotCWlmIChpc193Y2Q5eHh4X3JlZ19wb3dlcl9kb3duKHdjZDl4eHgsIHJyZWcpKSB7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSB3Y2Q5eHh4X3BhZ2Vfd3JpdGUod2NkOXh4eCwgJmNfcmVnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCB2YWxfc2l6ZTsgaSsrKQotCQlkZXZfZGJnKGRldiwgIldyaXRlICUwMnggdG8gMHgleFxuIiwgKCh1OCAqKXZhbClbaV0sCi0JCQlycmVnICsgaSk7Ci0KLQlyZXQgPSB3Y2Q5eHh4LT53cml0ZV9kZXYod2NkOXh4eCwgY19yZWcsIHZhbF9zaXplLCAodm9pZCAqKSB2YWwsCi0JCQkJIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICIlczogQ29kZWMgd3JpdGUgZmFpbGVkICglZCksIHJlZzoweCV4LCBzaXplOiV6ZFxuIiwKLQkJCV9fZnVuY19fLCByZXQsIHJyZWcsIHZhbF9zaXplKTsKLQotZXJyOgotCW11dGV4X3VubG9jaygmd2NkOXh4eC0+aW9fbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWdtYXBfYnVzX3dyaXRlKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoIXdjZDl4eHgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JV0FSTl9PTihjb3VudCA8IFJFR19CWVRFUyk7Ci0KLQlpZiAoY291bnQgPiAoUkVHX0JZVEVTICsgVkFMX0JZVEVTKSkgewotCQlpZiAod2NkOXh4eC0+bXVsdGlfcmVnX3dyaXRlKQotCQkJcmV0dXJuIHdjZDl4eHgtPm11bHRpX3JlZ193cml0ZSh3Y2Q5eHh4LAotCQkJCQkJCWRhdGEsIGNvdW50KTsKLQl9IGVsc2UKLQkJcmV0dXJuIHJlZ21hcF9idXNfZ2F0aGVyX3dyaXRlKGNvbnRleHQsIGRhdGEsIFJFR19CWVRFUywKLQkJCQkJICAgICAgIGRhdGEgKyBSRUdfQllURVMsCi0JCQkJCSAgICAgICBjb3VudCAtIFJFR19CWVRFUyk7Ci0KLQlkZXZfZXJyKGRldiwgIiVzOiBidXMgbXVsdGkgcmVnIHdyaXRlIGZhaWx1cmVcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9idXMgcmVnbWFwX2J1c19jb25maWcgPSB7Ci0JLndyaXRlID0gcmVnbWFwX2J1c193cml0ZSwKLQkuZ2F0aGVyX3dyaXRlID0gcmVnbWFwX2J1c19nYXRoZXJfd3JpdGUsCi0JLnJlYWQgPSByZWdtYXBfYnVzX3JlYWQsCi0JLnJlZ19mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKLQkudmFsX2Zvcm1hdF9lbmRpYW5fZGVmYXVsdCA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAotfTsKLQotLyoKLSAqIHdjZDl4eHhfcmVnbWFwX2luaXQ6Ci0gKglJbml0aWFsaXplIHdjZDl4eHggcmVnaXN0ZXIgbWFwCi0gKgotICogQGRldjogcG9pbnRlciB0byB3Y2QgZGV2aWNlCi0gKiBAY29uZmlnOiBwb2ludGVyIHRvIHJlZ2lzdGVyIG1hcCBjb25maWcKLSAqCi0gKiBSZXR1cm5zIHBvaW50ZXIgdG8gcmVnbWFwIHN0cnVjdHVyZSBmb3Igc3VjY2VzcwotICogb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuCi0gKi8KLXN0cnVjdCByZWdtYXAgKndjZDl4eHhfcmVnbWFwX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpCi17Ci0JcmV0dXJuIGRldm1fcmVnbWFwX2luaXQoZGV2LCAmcmVnbWFwX2J1c19jb25maWcsIGRldiwgY29uZmlnKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9yZWdtYXBfaW5pdCk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X3Jlc2V0OgotICoJUmVzZXQgd2NkOXh4eCBjb2RlYwotICoKLSAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgd2NkOXh4eF9yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0JaW50IHJjOwotCWludCB2YWx1ZTsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoIXdjZDl4eHgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF3Y2Q5eHh4LT53Y2RfcnN0X25wKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlc2V0IGdwaW8gZGV2aWNlIG5vZGUgbm90IHNwZWNpZmllZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdmFsdWUgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHdjZDl4eHgtPndjZF9yc3RfbnApOwotCWlmICh2YWx1ZSA+IDApIHsKLQkJd2NkOXh4eC0+YXZvaWRfY2RjX3JzdGxvdyA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJjID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSh3Y2Q5eHh4LT53Y2RfcnN0X25wKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihkZXYsICIlczogd2NkIHNsZWVwIHN0YXRlIHJlcXVlc3QgZmFpbCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiAyMG1zIHNsZWVwIHJlcXVpcmVkIGFmdGVyIHB1bGxpbmcgdGhlIHJlc2V0IGdwaW8gdG8gTE9XICovCi0JbXNsZWVwKDIwKTsKLQotCXJjID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUod2NkOXh4eC0+d2NkX3JzdF9ucCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHdjZCBhY3RpdmUgc3RhdGUgcmVxdWVzdCBmYWlsIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQltc2xlZXAoMjApOwotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3Jlc2V0KTsKLQotLyoKLSAqIHdjZDl4eHhfcmVzZXRfbG93OgotICoJUHVsbCB0aGUgd2NkOXh4eCBjb2RlYyByZXNldF9uIHRvIGxvdwotICoKLSAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgd2NkOXh4eF9yZXNldF9sb3coc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCWludCByYzsKLQotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoIXdjZDl4eHgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCF3Y2Q5eHh4LT53Y2RfcnN0X25wKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlc2V0IGdwaW8gZGV2aWNlIG5vZGUgbm90IHNwZWNpZmllZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICh3Y2Q5eHh4LT5hdm9pZF9jZGNfcnN0bG93KSB7Ci0JCXdjZDl4eHgtPmF2b2lkX2NkY19yc3Rsb3cgPSAwOwotCQlkZXZfZGJnKGRldiwgIiVzOiBhdm9pZCBwdWxsIGRvd24gb2YgcmVzZXQgR1BJT1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYyA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUod2NkOXh4eC0+d2NkX3JzdF9ucCk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKGRldiwgIiVzOiB3Y2Qgc2xlZXAgc3RhdGUgcmVxdWVzdCBmYWlsIVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9yZXNldF9sb3cpOwotCi0vKgotICogd2NkOXh4eF9icmluZ3VwOgotICoJVG9nZ2xlIHJlc2V0IGFuYWxvZyBhbmQgZGlnaXRhbCBjb3JlcyBvZiB3Y2Q5eHh4IGNvZGVjCi0gKgotICogQGRldjogcG9pbnRlciB0byB3Y2QgZGV2aWNlCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB3Y2Q5eHh4X2JyaW5ndXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCWludCByYzsKLQljb2RlY19icmluZ3VwX2ZuIGNkY19idXBfZm47Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCF3Y2Q5eHh4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNkY19idXBfZm4gPSB3Y2Q5eHh4X2JyaW5ndXBfZm4od2NkOXh4eC0+dHlwZSk7Ci0JaWYgKCFjZGNfYnVwX2ZuKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIGJyaW5ndXAgZm4gTlVMTCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IGNkY19idXBfZm4od2NkOXh4eCk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyBicmluZ3VwIGVycm9yLCByYzogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X2JyaW5ndXApOwotCi0vKgotICogd2NkOXh4eF9icmluZ3VwOgotICoJU2V0IGFuYWxvZyBhbmQgZGlnaXRhbCBjb3JlcyBvZiB3Y2Q5eHh4IGNvZGVjIGluIHJlc2V0IHN0YXRlCi0gKgotICogQGRldjogcG9pbnRlciB0byB3Y2QgZGV2aWNlCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB3Y2Q5eHh4X2JyaW5nZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0JaW50IHJjOwotCWNvZGVjX2JyaW5nZG93bl9mbiBjZGNfYmRvd25fZm47Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCF3Y2Q5eHh4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNkY19iZG93bl9mbiA9IHdjZDl4eHhfYnJpbmdkb3duX2ZuKHdjZDl4eHgtPnR5cGUpOwotCWlmICghY2RjX2Jkb3duX2ZuKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIGJyaW5nIGRvd24gZm4gTlVMTCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IGNkY19iZG93bl9mbih3Y2Q5eHh4KTsKLQlpZiAocmMpCi0JCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIGJyaW5nIGRvd24gZXJyb3IsIHJjOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfYnJpbmdkb3duKTsKLQotLyoKLSAqIHdjZDl4eHhfZ2V0X2NvZGVjX2luZm86Ci0gKglGaWxsIGNvZGVjIHNwZWNpZmljIGluZm9ybWF0aW9uIGxpa2UgaW50ZXJydXB0cywgdmVyc2lvbgotICoKLSAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgd2NkOXh4eF9nZXRfY29kZWNfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0JaW50IHJjOwotCWNvZGVjX3R5cGVfZm4gY2RjX3R5cGVfZm47Ci0Jc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqY2luZm87Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCF3Y2Q5eHh4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNkY190eXBlX2ZuID0gd2NkOXh4eF9nZXRfY29kZWNfaW5mb19mbih3Y2Q5eHh4LT50eXBlKTsKLQlpZiAoIWNkY190eXBlX2ZuKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIGZpbGwgdHlwZSBmbiBOVUxMIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2luZm8gPSB3Y2Q5eHh4LT5jb2RlY190eXBlOwotCWlmICghY2luZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmMgPSBjZGNfdHlwZV9mbih3Y2Q5eHh4LCBjaW5mbyk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IENvZGVjIHR5cGUgZmlsbCBmYWlsZWQsIHJjOiVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCi0JfQotCi0Jc3dpdGNoICh3Y2Q5eHh4LT50eXBlKSB7Ci0JY2FzZSBXQ0Q5MzRYOgotCQljaW5mby0+ZGV2ID0gdGF2aWxfZGV2czsKLQkJY2luZm8tPnNpemUgPSBBUlJBWV9TSVpFKHRhdmlsX2RldnMpOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzU6Ci0JCWNpbmZvLT5kZXYgPSB0YXNoYV9kZXZzOwotCQljaW5mby0+c2l6ZSA9IEFSUkFZX1NJWkUodGFzaGFfZGV2cyk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzMDoKLQkJY2luZm8tPmRldiA9IHRvbXRvbV9kZXZzOwotCQljaW5mby0+c2l6ZSA9IEFSUkFZX1NJWkUodG9tdG9tX2RldnMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljaW5mby0+ZGV2ID0gTlVMTDsKLQkJY2luZm8tPnNpemUgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfZ2V0X2NvZGVjX2luZm8pOwotCi0vKgotICogd2NkOXh4eF9jb3JlX2lycV9pbml0OgotICoJSW5pdGlhbGl6ZSB3Y2Q5eHh4IGNvZGVjIGlycSBpbnN0YW5jZQotICoKLSAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB3Y2Q5eHh4X2NvcmVfaXJxX2luaXQoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghd2NkOXh4eF9jb3JlX3JlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAod2NkOXh4eF9jb3JlX3Jlcy0+aXJxICE9IDEpIHsKLQkJcmV0ID0gd2NkOXh4eF9pcnFfaW5pdCh3Y2Q5eHh4X2NvcmVfcmVzKTsKLQkJaWYgKHJldCkKLQkJCXByX2VycigiSVJRIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9jb3JlX2lycV9pbml0KTsKLQotLyoKLSAqIHdjZDl4eHhfYXNzaWduX2lycToKLSAqCUFzc2lnbiBpcnEgYW5kIGlycV9iYXNlIHRvIHdjZDl4eHggY29yZSByZXNvdXJjZQotICoKLSAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCi0gKiBAaXJxOiBpcnEgbnVtYmVyCi0gKiBAaXJxX2Jhc2U6IGJhc2UgaXJxIG51bWJlcgotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgd2NkOXh4eF9hc3NpZ25faXJxKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsCi0JdW5zaWduZWQgaW50IGlycSwKLQl1bnNpZ25lZCBpbnQgaXJxX2Jhc2UpCi17Ci0JaWYgKCF3Y2Q5eHh4X2NvcmVfcmVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdjZDl4eHhfY29yZV9yZXMtPmlycSA9IGlycTsKLQl3Y2Q5eHh4X2NvcmVfcmVzLT5pcnFfYmFzZSA9IGlycV9iYXNlOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfYXNzaWduX2lycSk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2NvcmVfcmVzX2luaXQ6Ci0gKglJbml0aWFsaXplIHdjZCBjb3JlIHJlc291cmNlIGluc3RhbmNlCi0gKgotICogQHdjZDl4eHhfY29yZV9yZXM6IHBvaW50ZXIgdG8gd2NkIGNvcmUgcmVzb3VyY2UKLSAqIEBudW1faXJxczogbnVtYmVyIG9mIGlycXMgZm9yIHdjZDl4eHggY29yZQotICogQG51bV9pcnFfcmVnczogbnVtYmVyIG9mIGlycSByZWdpc3RlcnMKLSAqIEB3Y2RfcmVnbWFwOiBwb2ludGVyIHRvIHRoZSB3Y2QgcmVnaXN0ZXIgbWFwCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB3Y2Q5eHh4X2NvcmVfcmVzX2luaXQoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKLQlpbnQgbnVtX2lycXMsIGludCBudW1faXJxX3JlZ3MsIHN0cnVjdCByZWdtYXAgKndjZF9yZWdtYXApCi17Ci0JaWYgKCF3Y2Q5eHh4X2NvcmVfcmVzIHx8ICF3Y2RfcmVnbWFwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2luaXQoJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOwotCXdjZDl4eHhfY29yZV9yZXMtPndsb2NrX2hvbGRlcnMgPSAwOwotCXdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID0gV0NEOVhYWF9QTV9TTEVFUEFCTEU7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fd3EpOwotCXBtX3Fvc19hZGRfcmVxdWVzdCgmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fcW9zX3JlcSwKLQkJCQlQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQotCXdjZDl4eHhfY29yZV9yZXMtPm51bV9pcnFzID0gbnVtX2lycXM7Ci0Jd2NkOXh4eF9jb3JlX3Jlcy0+bnVtX2lycV9yZWdzID0gbnVtX2lycV9yZWdzOwotCXdjZDl4eHhfY29yZV9yZXMtPndjZF9jb3JlX3JlZ21hcCA9IHdjZF9yZWdtYXA7Ci0KLQlwcl9pbmZvKCIlczogbnVtX2lycXMgPSAlZCwgbnVtX2lycV9yZWdzID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2NkOXh4eF9jb3JlX3Jlcy0+bnVtX2lycXMsCi0JCQl3Y2Q5eHh4X2NvcmVfcmVzLT5udW1faXJxX3JlZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfY29yZV9yZXNfaW5pdCk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2NvcmVfcmVzX2RlaW5pdDoKLSAqCURlaW5pdCB3Y2QgY29yZSByZXNvdXJjZSBpbnN0YW5jZQotICoKLSAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCi0gKi8KLXZvaWQgd2NkOXh4eF9jb3JlX3Jlc19kZWluaXQoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcykKLXsKLQlpZiAoIXdjZDl4eHhfY29yZV9yZXMpCi0JCXJldHVybjsKLQotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fcW9zX3JlcSk7Ci0JbXV0ZXhfZGVzdHJveSgmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfY29yZV9yZXNfZGVpbml0KTsKLQotLyoKLSAqIHdjZDl4eHhfcG1fY21weGNoZzoKLSAqCUNoZWNrIG9sZCBzdGF0ZSBhbmQgZXhjaGFuZ2Ugd2l0aCBwbSBuZXcgc3RhdGUKLSAqCWlmIG9sZCBzdGF0ZSBtYXRjaGVzIHdpdGggY3VycmVudCBzdGF0ZQotICoKLSAqIEB3Y2Q5eHh4X2NvcmVfcmVzOiBwb2ludGVyIHRvIHdjZCBjb3JlIHJlc291cmNlCi0gKiBAbzogcG0gb2xkIHN0YXRlCi0gKiBAbjogcG0gbmV3IHN0YXRlCi0gKgotICogUmV0dXJucyBvbGQgc3RhdGUKLSAqLwotZW51bSB3Y2Q5eHh4X3BtX3N0YXRlIHdjZDl4eHhfcG1fY21weGNoZygKLQkJc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKLQkJZW51bSB3Y2Q5eHh4X3BtX3N0YXRlIG8sCi0JCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBuKQotewotCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBvbGQ7Ci0KLQlpZiAoIXdjZDl4eHhfY29yZV9yZXMpCi0JCXJldHVybiBvOwotCi0JbXV0ZXhfbG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7Ci0Jb2xkID0gd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGU7Ci0JaWYgKG9sZCA9PSBvKQotCQl3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSA9IG47Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKLQotCXJldHVybiBvbGQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfcG1fY21weGNoZyk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2NvcmVfcmVzX3N1c3BlbmQ6Ci0gKglTdXNwZW5kIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3Y2Q5eHh4IGNvcmUKLSAqCi0gKiBAd2NkOXh4eF9jb3JlX3JlczogcG9pbnRlciB0byB3Y2QgY29yZSByZXNvdXJjZQotICogQHBtX21lc3NhZ2VfdDogcG0gbWVzc2FnZQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlL2J1c3kKLSAqLwotaW50IHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzLAotCXBtX21lc3NhZ2VfdCBwbWVzZykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQkvKgotCSAqIHBtX3Fvc191cGRhdGVfcmVxdWVzdCgpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBzdXNwZW5kIGNoYWluIGNhbGwKLQkgKiBzdGFydGVkLiB0aHVzIHN1c3BlbmQgY2FuIGJlIGNhbGxlZCB3aGlsZSBsb2NrIGlzIGJlaW5nIGhlbGQKLQkgKi8KLQltdXRleF9sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKLQlpZiAod2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9TTEVFUEFCTEUpIHsKLQkJcHJfZGVidWcoIiVzOiBzdXNwZW5kaW5nIHN5c3RlbSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLAotCQkJIF9fZnVuY19fLCB3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSwKLQkJCSB3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKLQkJd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPSBXQ0Q5WFhYX1BNX0FTTEVFUDsKLQl9IGVsc2UgaWYgKHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlID09IFdDRDlYWFhfUE1fQVdBS0UpIHsKLQkJLyoKLQkJICogdW5sb2NrIHRvIHdhaXQgZm9yIHBtX3N0YXRlID09IFdDRDlYWFhfUE1fU0xFRVBBQkxFCi0JCSAqIHRoZW4gc2V0IHRvIFdDRDlYWFhfUE1fQVNMRUVQCi0JCSAqLwotCQlwcl9kZWJ1ZygiJXM6IHdhaXRpbmcgdG8gc3VzcGVuZCBzeXN0ZW0sIHN0YXRlICVkLCB3bG9jayAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCi0JCQkgd2NkOXh4eF9jb3JlX3Jlcy0+d2xvY2tfaG9sZGVycyk7Ci0JCW11dGV4X3VubG9jaygmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fbG9jayk7Ci0JCWlmICghKHdhaXRfZXZlbnRfdGltZW91dCh3Y2Q5eHh4X2NvcmVfcmVzLT5wbV93cSwKLQkJCQkJIHdjZDl4eHhfcG1fY21weGNoZyh3Y2Q5eHh4X2NvcmVfcmVzLAotCQkJCQkJICBXQ0Q5WFhYX1BNX1NMRUVQQUJMRSwKLQkJCQkJCSAgV0NEOVhYWF9QTV9BU0xFRVApID09Ci0JCQkJCQkJV0NEOVhYWF9QTV9TTEVFUEFCTEUsCi0JCQkJCSBIWikpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHN1c3BlbmQgZmFpbGVkIHN0YXRlICVkLCB3bG9jayAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHdjZDl4eHhfY29yZV9yZXMtPnBtX3N0YXRlLAotCQkJCSB3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKLQkJCXJldCA9IC1FQlVTWTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogZG9uZSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCi0JCQkJIHdjZDl4eHhfY29yZV9yZXMtPndsb2NrX2hvbGRlcnMpOwotCQl9Ci0JCW11dGV4X2xvY2soJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOwotCX0gZWxzZSBpZiAod2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9BU0xFRVApIHsKLQkJcHJfd2FybigiJXM6IHN5c3RlbSBpcyBhbHJlYWR5IHN1c3BlbmRlZCwgc3RhdGUgJWQsIHdsb2NrICVkbiIsCi0JCQlfX2Z1bmNfXywgd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUsCi0JCQl3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfY29yZV9yZXNfc3VzcGVuZCk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2NvcmVfcmVzX3Jlc3VtZToKLSAqCVJlc3VtZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2NkOXh4eCBjb3JlCi0gKgotICogQHdjZDl4eHhfY29yZV9yZXM6IHBvaW50ZXIgdG8gd2NkIGNvcmUgcmVzb3VyY2UKLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZS9idXN5Ci0gKi8KLWludCB3Y2Q5eHh4X2NvcmVfcmVzX3Jlc3VtZSgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCW11dGV4X2xvY2soJndjZDl4eHhfY29yZV9yZXMtPnBtX2xvY2spOwotCWlmICh3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FTTEVFUCkgewotCQlwcl9kZWJ1ZygiJXM6IHJlc3VtaW5nIHN5c3RlbSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLCBfX2Z1bmNfXywKLQkJCQl3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSwKLQkJCQl3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKLQkJd2NkOXh4eF9jb3JlX3Jlcy0+cG1fc3RhdGUgPSBXQ0Q5WFhYX1BNX1NMRUVQQUJMRTsKLQl9IGVsc2UgewotCQlwcl93YXJuKCIlczogc3lzdGVtIGlzIGFscmVhZHkgYXdha2UsIHN0YXRlICVkIHdsb2NrICVkXG4iLAotCQkJCV9fZnVuY19fLCB3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9zdGF0ZSwKLQkJCQl3Y2Q5eHh4X2NvcmVfcmVzLT53bG9ja19ob2xkZXJzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4X2NvcmVfcmVzLT5wbV9sb2NrKTsKLQl3YWtlX3VwX2FsbCgmd2NkOXh4eF9jb3JlX3Jlcy0+cG1fd3EpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9jb3JlX3Jlc19yZXN1bWUpOwotCi0vKgotICogd2NkOXh4eF9nZXRfaW50Zl90eXBlOgotICoJR2V0IGludGVyZmFjZSB0eXBlIG9mIHdjZDl4eHggY29yZQotICoKLSAqIFJldHVybnMgaW50ZXJmYWNlIHR5cGUKLSAqLwotZW51bSB3Y2Q5eHh4X2ludGZfc3RhdHVzIHdjZDl4eHhfZ2V0X2ludGZfdHlwZSh2b2lkKQotewotCXJldHVybiB3Y2Q5eHh4X2ludGY7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X3NldF9pbnRmX3R5cGU6Ci0gKglTZXQgaW50ZXJmYWNlIHR5cGUgb2Ygd2NkOXh4eCBjb3JlCi0gKgotICovCi12b2lkIHdjZDl4eHhfc2V0X2ludGZfdHlwZShlbnVtIHdjZDl4eHhfaW50Zl9zdGF0dXMgaW50Zl9zdGF0dXMpCi17Ci0Jd2NkOXh4eF9pbnRmID0gaW50Zl9zdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfc2V0X2ludGZfdHlwZSk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZTogc2V0IHBvd2VyIHN0YXRlIGZvciB0aGUgcmVnaW9uCi0gKiBAd2NkOXh4eDogaGFuZGxlIHRvIHdjZCBjb3JlCi0gKiBAc3RhdGU6IHBvd2VyIHN0YXRlIHRvIGJlIHNldAotICogQHJlZ2lvbjogcmVnaW9uIGluZGV4Ci0gKgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBvciAwIGZvciBzdWNjZXNzCi0gKi8KLWludCB3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCSAgICBlbnVtIGNvZGVjX3Bvd2VyX3N0YXRlcyBzdGF0ZSwKLQkJCSAgICBlbnVtIHdjZF9wb3dlcl9yZWdpb25zIHJlZ2lvbikKLXsKLQlpZiAoIXdjZDl4eHgpIHsKLQkJcHJfZXJyKCIlczogd2NkOXh4eCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgocmVnaW9uIDwgMCkgfHwgKHJlZ2lvbiA+PSBXQ0Q5WFhYX01BWF9QV1JfUkVHSU9OUykpIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogcmVnaW9uIGluZGV4ICVkIG91dCBvZiBib3VuZHNcbiIsCi0JCQlfX2Z1bmNfXywgcmVnaW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghd2NkOXh4eC0+d2NkOXh4eF9wd3JbcmVnaW9uXSkgewotCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBtZW1vcnkgbm90IGNyZWF0ZWQgZm9yIHJlZ2lvbjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVnaW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW11dGV4X2xvY2soJndjZDl4eHgtPmlvX2xvY2spOwotCXdjZDl4eHgtPndjZDl4eHhfcHdyW3JlZ2lvbl0tPnBvd2VyX3N0YXRlID0gc3RhdGU7Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSk7Ci0KLS8qCi0gKiB3Y2Q5eHh4X2dldF9jdXJyZW50X3Bvd2VyX3N0YXRlOiBHZXQgcG93ZXIgc3RhdGUgb2YgdGhlIHJlZ2lvbgotICogQHdjZDl4eHg6IGhhbmRsZSB0byB3Y2QgY29yZQotICogQHJlZ2lvbjogcmVnaW9uIGluZGV4Ci0gKgotICogUmV0dXJucyBjdXJyZW50IHBvd2VyIHN0YXRlIG9mIHRoZSByZWdpb24gb3IgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQotICovCi1pbnQgd2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCQkgICAgZW51bSB3Y2RfcG93ZXJfcmVnaW9ucyByZWdpb24pCi17Ci0JaW50IHN0YXRlOwotCi0JaWYgKCF3Y2Q5eHh4KSB7Ci0JCXByX2VycigiJXM6IHdjZDl4eHggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKHJlZ2lvbiA8IDApIHx8IChyZWdpb24gPj0gV0NEOVhYWF9NQVhfUFdSX1JFR0lPTlMpKSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHJlZ2lvbiBpbmRleCAlZCBvdXQgb2YgYm91bmRzXG4iLAotCQkJX19mdW5jX18sIHJlZ2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXdjZDl4eHgtPndjZDl4eHhfcHdyW3JlZ2lvbl0pIHsKLQkJZGV2X2Vycih3Y2Q5eHh4LT5kZXYsICIlczogbWVtb3J5IG5vdCBjcmVhdGVkIGZvciByZWdpb246ICVkXG4iLAotCQkJX19mdW5jX18sIHJlZ2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJndjZDl4eHgtPmlvX2xvY2spOwotCXN0YXRlID0gd2NkOXh4eC0+d2NkOXh4eF9wd3JbcmVnaW9uXS0+cG93ZXJfc3RhdGU7Ci0JbXV0ZXhfdW5sb2NrKCZ3Y2Q5eHh4LT5pb19sb2NrKTsKLQotCXJldHVybiBzdGF0ZTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDJlNWRhNTQuLmUzZjRjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC03OTEsNiArNzkxLDEzIEBACiAJICBQZXIgVUlEIGJhc2VkIGlvIHN0YXRpc3RpY3MgZXhwb3J0ZWQgdG8gL3Byb2MvdWlkX2lvCiAJICBQZXIgVUlEIGJhc2VkIHByb2NzdGF0IGNvbnRyb2wgaW4gL3Byb2MvdWlkX3Byb2NzdGF0CiAKK2NvbmZpZyBVSURfU1lTX1NUQVRTX0RFQlVHCisJYm9vbCAiUGVyLVRBU0sgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIFVJRF9TWVNfU1RBVFMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBQZXIgVEFTSyBiYXNlZCBpbyBzdGF0aXN0aWNzIGV4cG9ydGVkIHRvIC9wcm9jL3VpZF9pbworCiBjb25maWcgTUVNT1JZX1NUQVRFX1RJTUUKIAl0cmlzdGF0ZSAiTWVtb3J5IGZyZXEvYmFuZHdpZHRoIHRpbWUgc3RhdGlzdGljcyIKIAlkZXBlbmRzIG9uIFBST0ZJTElORwpAQCAtODE0LDcgKzgyMSw2IEBACiBzb3VyY2UgImRyaXZlcnMvbWlzYy9hbHRlcmEtc3RhcGwvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL21laS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2Mvdm13X3ZtY2kvS2NvbmZpZyIKLXNvdXJjZSAiZHJpdmVycy9taXNjL3Fjb20vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9taXNjL21pYy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21pc2MvZ2Vud3FlL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWlzYy9lY2hvL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKaW5kZXggY2ZlYTRhNS4uNzQ0MDAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQpAQCAtNTYsNyArNTYsNiBAQAogb2JqLSQoQ09ORklHX0NYTF9CQVNFKQkJKz0gY3hsLwogb2JqLSQoQ09ORklHX1BBTkVMKSAgICAgICAgICAgICArPSBwYW5lbC5vCiBvYmotJChDT05GSUdfUVBOUF9NSVNDKSAJKz0gcXBucC1taXNjLm8KLW9iai15CQkJCSs9IHFjb20vCiBvYmotJChDT05GSUdfTUVNT1JZX1NUQVRFX1RJTUUpCSs9IG1lbW9yeV9zdGF0ZV90aW1lLm8KIAogb2JqLSQoQ09ORklHX1VJRF9TWVNfU1RBVFMpCSs9IHVpZF9zeXNfc3RhdHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9xY29tL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTc5NjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWNvbmZpZyBNU01fUURTUDZWMl9DT0RFQ1MKLQlib29sICJBdWRpbyBRRFNQNlYyIEFQUiBzdXBwb3J0IgotCXNlbGVjdCBTTkRfU09DX1FEU1A2VjIKLQloZWxwCi0JICBFbmFibGUgQXVkaW8gY29kZWNzIHdpdGggQVBSIElQQyBwcm90b2NvbCBzdXBwb3J0IGJldHdlZW4KLQkgIGFwcGxpY2F0aW9uIHByb2Nlc3NvciBhbmQgUURTUDYgZm9yIEItZmFtaWx5LiBBUFIgaXMKLQkgIHVzZWQgYnkgYXVkaW8gZHJpdmVyIHRvIGNvbmZpZ3VyZSBRRFNQNidzCi0JICBBU00sIEFETSBhbmQgQUZFLgotCi1jb25maWcgTVNNX1VMVFJBU09VTkQKLQlib29sICJRRFNQNlYyIEhXIFVsdHJhc291bmQgc3VwcG9ydCIKLQlzZWxlY3QgU05EX1NPQ19RRFNQNlYyCi0JaGVscAotCSAgRW5hYmxlIEhXIFVsdHJhc291bmQgc3VwcG9ydCBpbiBRRFNQNlYyLgotCSAgUURTUDZWMiBjYW4gc3VwcG9ydCBIVyBlbmNvZGVyICYgZGVjb2RlciBhbmQKLQkgIHVsdHJhc291bmQgcHJvY2Vzc2luZy4gSXQgd2lsbCBlbmFibGUKLQkgIHVsdHJhc291bmQgZGF0YSBwYXRocyBiZXR3ZWVuCi0JICBIVyBhbmQgc2VydmljZXMsIGNhbGN1bGF0aW5nIGlucHV0IGV2ZW50cwotCSAgdXBvbiB0aGUgdWx0cmFzb3VuZCBkYXRhLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vTWFrZWZpbGUgYi9kcml2ZXJzL21pc2MvcWNvbS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYmRkZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9iai15CQkrPSBxZHNwNnYyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTEyM2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotb2JqLSQoQ09ORklHX01TTV9RRFNQNlYyX0NPREVDUykgKz0gYWFjX2luLm8gcWNlbHBfaW4ubyBldnJjX2luLm8gYW1ybmJfaW4ubyBnNzExbWxhd19pbi5vIGc3MTFhbGF3X2luLm8gYXVkaW9fdXRpbHMubwotb2JqLSQoQ09ORklHX01TTV9RRFNQNlYyX0NPREVDUykgKz0gYXVkaW9fd21hLm8gYXVkaW9fd21hcHJvLm8gYXVkaW9fYWFjLm8gYXVkaW9fbXVsdGlfYWFjLm8gYXVkaW9fYWxhYy5vIGF1ZGlvX2FwZS5vIGF1ZGlvX3V0aWxzX2Fpby5vCi1vYmotJChDT05GSUdfTVNNX1FEU1A2VjJfQ09ERUNTKSArPSBxNmF1ZGlvX3YyLm8gcTZhdWRpb192Ml9haW8ubwotb2JqLSQoQ09ORklHX01TTV9RRFNQNlYyX0NPREVDUykgKz0gYXVkaW9fZzcxMW1sYXcubyBhdWRpb19nNzExYWxhdy5vCi1vYmotJChDT05GSUdfTVNNX1FEU1A2VjJfQ09ERUNTKSAgKz0gYXVkaW9fbXAzLm8gYXVkaW9fYW1ybmIubyBhdWRpb19hbXJ3Yi5vIGF1ZGlvX2FtcndicGx1cy5vIGF1ZGlvX2V2cmMubyBhdWRpb19xY2VscC5vIGFtcndiX2luLm8gYXVkaW9faHdhY2NfZWZmZWN0cy5vCi1vYmotJChDT05GSUdfTVNNX1VMVFJBU09VTkQpICs9IHVsdHJhc291bmQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2FhY19pbi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hYWNfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MjhkYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2FhY19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FhYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlICJhdWRpb191dGlscy5oIgotCi0KLS8qIEJ1ZmZlciB3aXRoIG1ldGEqLwotI2RlZmluZSBQQ01fQlVGX1NJWkUJCSg0MDk2ICsgc2l6ZW9mKHN0cnVjdCBtZXRhX2luKSkKLQotLyogTWF4aW11bSA1IGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgxNTM2K3NpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkgKiA1KSkKLQotI2RlZmluZSBBQUNfRk9STUFUX0FEVFMgNjU1MzUKLQotI2RlZmluZSBNQVhfU0FNUExFX1JBVEVfMzg0SyAzODQwMDAKLQotc3RhdGljIGxvbmcgYWFjX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICplbmNfY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7Ci0JCXVpbnQzMl90IGFhY19tb2RlID0gQUFDX0VOQ19NT0RFX0FBQ19MQzsKLQotCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7Ci0JCWFhY19jb25maWcgPSBhdWRpby0+Y29kZWNfY2ZnOwotCQkvKiBFTkNPREUgQ0ZHIChhZnRlciBuZXcgc2V0IG9mIEFQSSdzIGFyZSBwdWJsaXNoZWQgKWJoYXJhdGgqLwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOwotCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgewotCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBzdGFydGluZyBpbiBub25fdHVubmVsIG1vZGUiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLAotCQkJCQlGT1JNQVRfTVBFRzRfQUFDLCBGT1JNQVRfTElORUFSX1BDTSk7Ci0JCQkJaWYgKHJjIDwgMCkgewotCQkJCQlwcl9lcnIoIiVzOm9wZW4gcmVhZCB3cml0ZSBmYWlsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gVFVOTkVMX01PREUpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IHN0YXJ0aW5nIGluIHR1bm5lbCBtb2RlIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywKLQkJCQkJCQlGT1JNQVRfTVBFRzRfQUFDKTsKLQotCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJcHJfZXJyKCIlczpvcGVuIHJlYWQgZmFpbGVkXG4iLAotCQkJCQkJCV9fZnVuY19fKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOnNicl9wc19mbGFnID0gJWQsIHNicl9mbGFnID0gJWRcbiIsIF9fZnVuY19fLAotCQkJYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWcsIGFhY19jb25maWctPnNicl9vbl9mbGFnKTsKLQkJaWYgKGFhY19jb25maWctPnNicl9wc19vbl9mbGFnKQotCQkJYWFjX21vZGUgPSBBQUNfRU5DX01PREVfRUFBQ19QOwotCQllbHNlIGlmIChhYWNfY29uZmlnLT5zYnJfb25fZmxhZykKLQkJCWFhY19tb2RlID0gQUFDX0VOQ19NT0RFX0FBQ19QOwotCQllbHNlCi0JCQlhYWNfbW9kZSA9IEFBQ19FTkNfTU9ERV9BQUNfTEM7Ci0KLQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19hYWMoYXVkaW8tPmFjLAotCQkJCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiwKLQkJCQkJZW5jX2NmZy0+c2FtcGxlX3JhdGUsCi0JCQkJCWVuY19jZmctPmNoYW5uZWxzLAotCQkJCQllbmNfY2ZnLT5iaXRfcmF0ZSwKLQkJCQkJYWFjX21vZGUsCi0JCQkJCWVuY19jZmctPnN0cmVhbV9mb3JtYXQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhdWRpby0+YWMsCi0JCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCi0JCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBSeGVkIEFVRElPX1NUT1BcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQUFDX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyAqY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCWNmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICopYXJnOwotCQlpZiAoY2ZnID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXIgZm9yICVzXG4iLAotCQkJX19mdW5jX18sICJBVURJT19HRVRfQUFDX0NPTkZJRyIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJbWVtc2V0KGNmZywgMCwgc2l6ZW9mKCpjZmcpKTsKLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlpZiAoZW5jX2NmZy0+Y2hhbm5lbHMgPT0gQ0hfTU9ERV9NT05PKQotCQkJY2ZnLT5jaGFubmVscyA9IDE7Ci0JCWVsc2UKLQkJCWNmZy0+Y2hhbm5lbHMgPSAyOwotCi0JCWNmZy0+c2FtcGxlX3JhdGUgPSBlbmNfY2ZnLT5zYW1wbGVfcmF0ZTsKLQkJY2ZnLT5iaXRfcmF0ZSA9IGVuY19jZmctPmJpdF9yYXRlOwotCQlzd2l0Y2ggKGVuY19jZmctPnN0cmVhbV9mb3JtYXQpIHsKLQkJY2FzZSAweDAwOgotCQkJY2ZnLT5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9BRFRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMToKLQkJCWNmZy0+c3RyZWFtX2Zvcm1hdCA9IEFVRElPX0FBQ19GT1JNQVRfTE9BUzsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDI6Ci0JCQljZmctPnN0cmVhbV9mb3JtYXQgPSBBVURJT19BQUNfRk9STUFUX0FESUY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJY2FzZSAweDAzOgotCQkJY2ZnLT5zdHJlYW1fZm9ybWF0ID0gQVVESU9fQUFDX0ZPUk1BVF9SQVc7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEdldC1hYWMtY2ZnOiBmb3JtYXQ9JWQgc3I9JWQgYml0cmF0ZT0lZFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQljZmctPnN0cmVhbV9mb3JtYXQsIGNmZy0+c2FtcGxlX3JhdGUsIGNmZy0+Yml0X3JhdGUpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyAqY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnICplbmNfY2ZnOwotCQl1aW50MzJfdCBtaW5fYml0cmF0ZSwgbWF4X2JpdHJhdGU7Ci0KLQkJY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKilhcmc7Ci0JCWlmIChjZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlciBmb3IgJXNcbiIsCi0JCQkiQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogU2V0LWFhYy1jZmc6IHN0cmVhbT0lZFxuIiwgX19mdW5jX18sCi0JCQlhdWRpby0+YWMtPnNlc3Npb24sIGNmZy0+c3RyZWFtX2Zvcm1hdCk7Ci0KLQkJc3dpdGNoIChjZmctPnN0cmVhbV9mb3JtYXQpIHsKLQkJY2FzZSBBVURJT19BQUNfRk9STUFUX0FEVFM6Ci0JCQllbmNfY2ZnLT5zdHJlYW1fZm9ybWF0ID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfTE9BUzoKLQkJCWVuY19jZmctPnN0cmVhbV9mb3JtYXQgPSAweDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9BRElGOgotCQkJZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCA9IDB4MDI7Ci0JCQlicmVhazsKLQkJY2FzZSBBVURJT19BQUNfRk9STUFUX1JBVzoKLQkJCWVuY19jZmctPnN0cmVhbV9mb3JtYXQgPSAweDAzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IHVuc3VwcG9ydGVkIEFBQyBmb3JtYXQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQljZmctPnN0cmVhbV9mb3JtYXQpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY2ZnLT5jaGFubmVscyA9PSAxKSB7Ci0JCQljZmctPmNoYW5uZWxzID0gQ0hfTU9ERV9NT05POwotCQl9IGVsc2UgaWYgKGNmZy0+Y2hhbm5lbHMgPT0gMikgewotCQkJY2ZnLT5jaGFubmVscyA9IENIX01PREVfU1RFUkVPOwotCQl9IGVsc2UgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY2ZnLT5zYW1wbGVfcmF0ZSA+IE1BWF9TQU1QTEVfUkFURV8zODRLKSB7Ci0JCQlwcl9lcnIoIiVzOiBFUlJPUjogaW52YWxpZCBzYW1wbGUgcmF0ZSA9ICV1IiwKLQkJCQlfX2Z1bmNfXywgY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCW1pbl9iaXRyYXRlID0gKChjZmctPnNhbXBsZV9yYXRlKSooY2ZnLT5jaGFubmVscykpLzI7Ci0JCS8qIFRoaXMgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGJhc2VkIG9uIEFBQyBtb2RlLiBCdXQgd2UgY2Fubm90Ci0JCSAqIGdldCBBQUMgbW9kZSBpbiB0aGlzIHNldGNvbmZpZy4gbWluX2JpdHJhdGUncyBsb2dpY2FsIG1heAotCQkgKiB2YWx1ZSBpcyAyNDAwMC4gU28gaWYgbWluX2JpdHJhdGUgaXMgaGlnaGVyIHRoYW4gMjQwMDAsCi0JCSAqIGNob29zZSAyNDAwMC4KLQkJICovCi0JCWlmIChtaW5fYml0cmF0ZSA+IDI0MDAwKQotCQkJbWluX2JpdHJhdGUgPSAyNDAwMDsKLQkJbWF4X2JpdHJhdGUgPSA2KihjZmctPnNhbXBsZV9yYXRlKSooY2ZnLT5jaGFubmVscyk7Ci0JCWlmIChtYXhfYml0cmF0ZSA+IDE5MjAwMCkKLQkJCW1heF9iaXRyYXRlID0gMTkyMDAwOwotCQlpZiAoKGNmZy0+Yml0X3JhdGUgPCBtaW5fYml0cmF0ZSkgfHwKLQkJCShjZmctPmJpdF9yYXRlID4gbWF4X2JpdHJhdGUpKSB7Ci0JCQlwcl9lcnIoIiVzOiBiaXRyYXRlIHBlcm1pc3NpYmxlOiBtYXg9JWQsIG1pbj0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgbWF4X2JpdHJhdGUsIG1pbl9iaXRyYXRlKTsKLQkJCXByX2VycigiJXM6IEVSUk9SIGluIHNldHRpbmcgYml0cmF0ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBjZmctPmJpdF9yYXRlKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWVuY19jZmctPnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKLQkJZW5jX2NmZy0+Y2hhbm5lbHMgPSBjZmctPmNoYW5uZWxzOwotCQllbmNfY2ZnLT5iaXRfcmF0ZSA9IGNmZy0+Yml0X3JhdGU7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBTZXQtYWFjLWNmZzpTUj0gMHgleCBjaD0weCV4IGJpdHJhdGU9MHgleCwgZm9ybWF0KGFkdHMvcmF3KSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgZW5jX2NmZy0+c2FtcGxlX3JhdGUsCi0JCQllbmNfY2ZnLT5jaGFubmVscywgZW5jX2NmZy0+Yml0X3JhdGUsCi0JCQllbmNfY2ZnLT5zdHJlYW1fZm9ybWF0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FBQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmF1ZGlvX2FhY19jZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlhdWRpb19hYWNfY2ZnID0gYXVkaW8tPmNvZGVjX2NmZzsKLQkJYWFjX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKilhcmc7Ci0KLQkJaWYgKGFhY19jZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlciAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgIkFVRElPX1NFVF9BQUNfQ09ORklHIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU0VUX0FBQ19DT05GSUc6IHNicl9mbGFnID0gJWQgc2JyX3BzX2ZsYWcgPSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhYWNfY2ZnLT5zYnJfb25fZmxhZywKLQkJCSBhYWNfY2ZnLT5zYnJfcHNfb25fZmxhZyk7Ci0JCWF1ZGlvX2FhY19jZmctPnNicl9vbl9mbGFnID0gYWFjX2NmZy0+c2JyX29uX2ZsYWc7Ci0JCWF1ZGlvX2FhY19jZmctPnNicl9wc19vbl9mbGFnID0gYWFjX2NmZy0+c2JyX3BzX29uX2ZsYWc7Ci0JCWlmICgoYXVkaW9fYWFjX2NmZy0+c2JyX29uX2ZsYWcgPT0gMSkgfHwKLQkJCSAoYXVkaW9fYWFjX2NmZy0+c2JyX3BzX29uX2ZsYWcgPT0gMSkpIHsKLQkJCWlmIChlbmNfY2ZnLT5zYW1wbGVfcmF0ZSA8IDI0MDAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRVJST1IgaW4gc2V0dGluZyBzYW1wbGVyYXRlID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBlbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhYWNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIGNmZzsKLQotCQlyYyA9IGFhY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmY2ZnKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOkFVRElPX0dFVF9BQUNfRU5DX0NPTkZJRyBmYWlsZWQuIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGFhY19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmY2ZnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0VOQ19DT05GSUcgZmFpbGVkLiByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQUFDX0NPTkZJRzogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPmNvZGVjX2NmZywKLQkJCQkgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BQUNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFhY19jZmcsICh2b2lkICopYXJnLAotCQkJCSBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fU0VUX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBhYWNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmFhY19jZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kPSVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnMzIgewotCXUzMiBjaGFubmVsczsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGJpdF9yYXRlOwotCXUzMiBzdHJlYW1fZm9ybWF0OwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgewotCXMxNiBmb3JtYXQ7Ci0JdTE2IGF1ZGlvX29iamVjdDsKLQl1MTYgZXBfY29uZmlnOyAgICAgICAvKiAwIH4gMyB1c2VmdWwgb25seSBvYmogPSBFUkxDICovCi0JdTE2IGFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCXUxNiBhYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdTE2IGFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQl1MTYgc2JyX29uX2ZsYWc7Ci0JdTE2IHNicl9wc19vbl9mbGFnOwotCXUxNiBkdWFsX21vbm9fbW9kZTsKLQl1MTYgY2hhbm5lbF9jb25maWd1cmF0aW9uOwotCXUxNiBzYW1wbGVfcmF0ZTsKLX07Ci0KLWVudW0gewotCUFVRElPX1NFVF9BQUNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIpLAotCUFVRElPX0dFVF9BQUNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIpLAotCUFVRElPX1NFVF9BQUNfRU5DX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMyksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWczMiksCi0JQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSs0KSwgc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZzMyKQotfTsKLQotc3RhdGljIGxvbmcgYWFjX2luX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIE5VTEwpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQUFDX0VOQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZyBjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWczMiBjZmdfMzI7Ci0KLQkJbWVtc2V0KCZjZmdfMzIsIDAsIHNpemVvZihjZmdfMzIpKTsKLQotCQljbWQgPSBBVURJT19HRVRfQUFDX0VOQ19DT05GSUc7Ci0JCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmcpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6QVVESU9fR0VUX0FBQ19FTkNfQ09ORklHXzMyIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQljZmdfMzIuY2hhbm5lbHMgPSBjZmcuY2hhbm5lbHM7Ci0JCWNmZ18zMi5zYW1wbGVfcmF0ZSA9IGNmZy5zYW1wbGVfcmF0ZTsKLQkJY2ZnXzMyLmJpdF9yYXRlID0gY2ZnLmJpdF9yYXRlOwotCQljZmdfMzIuc3RyZWFtX2Zvcm1hdCA9IGNmZy5zdHJlYW1fZm9ybWF0OwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLCBzaXplb2YoY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FBQ19FTkNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnMzIgY2ZnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19FTkNfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQljZmcuY2hhbm5lbHMgPSBjZmdfMzIuY2hhbm5lbHM7Ci0JCWNmZy5zYW1wbGVfcmF0ZSA9IGNmZ18zMi5zYW1wbGVfcmF0ZTsKLQkJY2ZnLmJpdF9yYXRlID0gY2ZnXzMyLmJpdF9yYXRlOwotCQljZmcuc3RyZWFtX2Zvcm1hdCA9IGNmZ18zMi5zdHJlYW1fZm9ybWF0OwotCQkvKiBUaGUgY29tbWFuZCBzaG91bGQgYmUgY29udmVydGVkIGZyb20gMzIgYml0IHRvIG5vcm1hbAotCQkgKiBiZWZvcmUgdGhlIHNoYXJlZCBpb2N0bCBpcyBjYWxsZWQgYXMgc2hhcmVkIGlvY3RsCi0JCSAqIGNhbiBwcm9jZXNzIG9ubHkgbm9ybWFsIGNvbW1hbmRzCi0JCSAqLwotCQljbWQgPSBBVURJT19TRVRfQUFDX0VOQ19DT05GSUc7Ci0JCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfRU5DX0NPTkZJR18zMiBmYWlsZWQuIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgYWFjX2NvbmZpZ18zMjsKLQotCQlhYWNfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFhY19jb25maWdfMzIuZm9ybWF0ID0gYWFjX2NvbmZpZy0+Zm9ybWF0OwotCQlhYWNfY29uZmlnXzMyLmF1ZGlvX29iamVjdCA9IGFhY19jb25maWctPmF1ZGlvX29iamVjdDsKLQkJYWFjX2NvbmZpZ18zMi5lcF9jb25maWcgPSBhYWNfY29uZmlnLT5lcF9jb25maWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCWFhY19jb25maWctPmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NvbmZpZ18zMi5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY29uZmlnXzMyLnNicl9vbl9mbGFnID0gYWFjX2NvbmZpZy0+c2JyX29uX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuc2JyX3BzX29uX2ZsYWcgPSBhYWNfY29uZmlnLT5zYnJfcHNfb25fZmxhZzsKLQkJYWFjX2NvbmZpZ18zMi5kdWFsX21vbm9fbW9kZSA9IGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlOwotCQlhYWNfY29uZmlnXzMyLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9Ci0JCQkJYWFjX2NvbmZpZy0+Y2hhbm5lbF9jb25maWd1cmF0aW9uOwotCQlhYWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFhY19jb25maWdfMzIsCi0JCQkJIHNpemVvZihhYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyBhYWNfY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiBhYWNfY2ZnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjX2NmZ18zMiwgKHZvaWQgKilhcmcsCi0JCQkJCXNpemVvZihhYWNfY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYWFjX2NmZy5mb3JtYXQgPSBhYWNfY2ZnXzMyLmZvcm1hdDsKLQkJYWFjX2NmZy5hdWRpb19vYmplY3QgPSBhYWNfY2ZnXzMyLmF1ZGlvX29iamVjdDsKLQkJYWFjX2NmZy5lcF9jb25maWcgPSBhYWNfY2ZnXzMyLmVwX2NvbmZpZzsKLQkJYWFjX2NmZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlhYWNfY2ZnXzMyLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY2ZnLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlhYWNfY2ZnXzMyLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NmZy5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NmZ18zMi5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jZmcuc2JyX29uX2ZsYWcgPSBhYWNfY2ZnXzMyLnNicl9vbl9mbGFnOwotCQlhYWNfY2ZnLnNicl9wc19vbl9mbGFnID0gYWFjX2NmZ18zMi5zYnJfcHNfb25fZmxhZzsKLQkJYWFjX2NmZy5kdWFsX21vbm9fbW9kZSA9IGFhY19jZmdfMzIuZHVhbF9tb25vX21vZGU7Ci0JCWFhY19jZmcuY2hhbm5lbF9jb25maWd1cmF0aW9uID0KLQkJCQlhYWNfY2ZnXzMyLmNoYW5uZWxfY29uZmlndXJhdGlvbjsKLQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSA9IGFhY19jZmdfMzIuc2FtcGxlX3JhdGU7Ci0KLQkJY21kID0gQVVESU9fU0VUX0FBQ19DT05GSUc7Ci0JCXJjID0gYWFjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZhYWNfY2ZnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYWFjX2luX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhYWNfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOwotCXN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcgKmVuY19jZmc7Ci0Jc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOwotCWludCByYyA9IDA7Ci0KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2luKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoYXVkaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGVuY29kZXIgY29uZmlnIHBhcmFtICovCi0JYXVkaW8tPmVuY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoYXVkaW8tPmVuY19jZmcgPT0gTlVMTCkgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7Ci0KLQlhdWRpby0+Y29kZWNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYWFjX2NvbmZpZyA9IGF1ZGlvLT5jb2RlY19jZmc7Ci0KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMTUzNjsKLQlhdWRpby0+bWF4X2ZyYW1lc19wZXJfYnVmID0gNTsKLQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JZW5jX2NmZy0+Y2hhbm5lbHMgPSAxOwotCWVuY19jZmctPmJpdF9yYXRlID0gMTYwMDA7Ci0JZW5jX2NmZy0+c3RyZWFtX2Zvcm1hdCA9IDB4MDA7LyogMDpBRFRTLCAzOlJBVyAqLwotCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmICAgPSAweDAxOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgID0gUENNX0JVRl9TSVpFOwotCWFhY19jb25maWctPmZvcm1hdCA9IEFVRElPX0FBQ19GT1JNQVRfQURUUzsKLQlhYWNfY29uZmlnLT5hdWRpb19vYmplY3QgPSBBVURJT19BQUNfT0JKRUNUX0xDOwotCWFhY19jb25maWctPnNicl9vbl9mbGFnID0gMDsKLQlhYWNfY29uZmlnLT5zYnJfcHNfb25fZmxhZyA9IDA7Ci0JYWFjX2NvbmZpZy0+Y2hhbm5lbF9jb25maWd1cmF0aW9uID0gMTsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKXE2YXNtX2luX2NiLAotCQkJCQkJCSh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJX19mdW5jX18pOwotCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQkvKiBvcGVuIGFhYyBlbmNvZGVyIGluIHR1bm5lbCBtb2RlICovCi0JYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOwotCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTVBFRzRfQUFDLAotCQkJCQkJRk9STUFUX0xJTkVBUl9QQ00pOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgT3BlbiBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBOVCBtb2RlIGVuY29kZXIgc3VjY2Vzc1xuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsIEZPUk1BVF9NUEVHNF9BQUMpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVHVubmVsIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQkvKiByZWdpc3RlciBmb3IgdHggb3ZlcmZsb3cgKHZhbGlkIGZvciB0dW5uZWwgbW9kZSBvbmx5KSAqLwotCQlyYyA9IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhhdWRpby0+YWMsIDB4MDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFRYIE92ZXJmbG93IHJlZ2lzdHJhdGlvbiBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFVuZXhwZWN0ZWQgbW9kZVxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7Ci0JYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBhYWNfaW5fY29tcGF0X2lvY3RsOwotCWF1ZGlvLT5lbmNfaW9jdGwgPSBhYWNfaW5faW9jdGw7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0KLQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gYWFjX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAotCS5jb21wYXRfaW9jdGwJPSBhdWRpb19pbl9jb21wYXRfaW9jdGwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FhY19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fYWFjX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWFjX2luX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYWFjX2luX21pc2MpOwotfQotZGV2aWNlX2luaXRjYWxsKGFhY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYW1ybmJfaW4uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYW1ybmJfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhZmRlMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2Ftcm5iX2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIsIDIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYW1ybmIuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKLQotLyogQnVmZmVyIHdpdGggbWV0YSovCi0jZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQotCi0vKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgzMitzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpICogMTApKQotCi1zdGF0aWMgbG9uZyBhbXJuYl9pbl9pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOwotCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgewotCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX2Ftcm5iKGF1ZGlvLT5hYywKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmLAotCQkJZW5jX2NmZy0+YmFuZF9tb2RlLAotCQkJZW5jX2NmZy0+ZHR4X2VuYWJsZSk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgYW1ybmIgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYXVkaW8tPmFjLAotCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAotCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCi0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJYXVkaW8tPmVuYWJsZWQpOwotCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCi0JCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLwotCQlyYyA9IDA7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXByX2RlYnVnKCIlczpBVURJT19TVE9QXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgKmNmZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyICplbmNfY2ZnOwotCi0JCWNmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgKilhcmc7Ci0JCWlmIChjZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlciBmb3IgJXNcbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQkiQVVESU9fU0VUX0FNUk5CX0VOQ19DT05GSUdfVjIiKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlpZiAoY2ZnLT5iYW5kX21vZGUgPiA4IHx8Ci0JCQkgY2ZnLT5iYW5kX21vZGUgPCAxKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGludmFsaWQgYmFuZCBtb2RlXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogQU1SIE5CIGVuY29kZXIgYWNjZXB0cyB2YWx1ZXMgYmV0d2VlbiAwLTcKLQkJICogd2hpbGUgb3Blbm1heCBwcm92aWRlcyB2YWx1ZSBiZXR3ZWVuIDEtOAotCQkgKiBhcyBwZXIgc3BlYwotCQkgKi8KLQkJZW5jX2NmZy0+YmFuZF9tb2RlID0gKGNmZy0+YmFuZF9tb2RlIC0gMSk7Ci0JCWVuY19jZmctPmR0eF9lbmFibGUgPSAoY2ZnLT5kdHhfZW5hYmxlID8gMSA6IDApOwotCQllbmNfY2ZnLT5mcmFtZV9mb3JtYXQgPSAwOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogYmFuZF9tb2RlID0gMHgleCBkdHhfZW5hYmxlPTB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQllbmNfY2ZnLT5iYW5kX21vZGUsIGVuY19jZmctPmR0eF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYW1ybmJfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9ICBhbXJuYl9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBOVUxMKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0FNUk5CX0VOQ19DT05GSUdfVjI6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUk5CX0VOQ19DT05GSUdfVjIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgY2ZnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FNUk5CX0VOQ19DT05GSUdfVjIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYW1ybmJfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmNmZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyIGZhaWxlZC4gcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kPSVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyXzMyIHsKLQl1MzIgYmFuZF9tb2RlOwotCXUzMiBkdHhfZW5hYmxlOwotCXUzMiBmcmFtZV9mb3JtYXQ7Ci19OwotCi1lbnVtIHsKLQlBVURJT19HRVRfQU1STkJfRU5DX0NPTkZJR19WMl8zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsyKSwKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyXzMyKSwKLQlBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMl8zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCi0JCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyXzMyKQotfTsKLQotc3RhdGljIGxvbmcgYW1ybmJfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSAgYW1ybmJfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BTVJOQl9FTkNfQ09ORklHX1YyXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqYW1ybmJfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjJfMzIgYW1ybmJfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmYW1ybmJfY29uZmlnXzMyLCAwLCBzaXplb2YoYW1ybmJfY29uZmlnXzMyKSk7Ci0KLQkJYW1ybmJfY29uZmlnID0KLQkJKHN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiAqKWF1ZGlvLT5lbmNfY2ZnOwotCQlhbXJuYl9jb25maWdfMzIuYmFuZF9tb2RlID0gYW1ybmJfY29uZmlnLT5iYW5kX21vZGU7Ci0JCWFtcm5iX2NvbmZpZ18zMi5kdHhfZW5hYmxlID0gYW1ybmJfY29uZmlnLT5kdHhfZW5hYmxlOwotCQlhbXJuYl9jb25maWdfMzIuZnJhbWVfZm9ybWF0ID0gYW1ybmJfY29uZmlnLT5mcmFtZV9mb3JtYXQ7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFtcm5iX2NvbmZpZ18zMiwKLQkJCXNpemVvZihhbXJuYl9jb25maWdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQU1STkJfRU5DX0NPTkZJR19WMl8zMiBmYWlsZWQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMl8zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjJfMzIgY2ZnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FNUk5CX0VOQ19DT05GSUdfVjJfMzIgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQljbWQgPSBBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMjsKLQkJcmMgPSBhbXJuYl9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmY2ZnXzMyKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQU1STkJfRU5DX0NPTkZJR19WMiBmYWlsZWQgcmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYW1ybmJfaW5fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFtcm5iX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIgKmVuY19jZmc7Ci0JaW50IHJjID0gMDsKLQotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jb2RlciBjb25maWcgcGFyYW0gKi8KLQlhdWRpby0+ZW5jX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGF1ZGlvLT5lbmNfY2ZnID09IE5VTEwpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDMyOwotCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSAxMDsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZfU0laRTsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOwotCWVuY19jZmctPmJhbmRfbW9kZSA9IDc7Ci0JZW5jX2NmZy0+ZHR4X2VuYWJsZSA9IDA7Ci0JYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKXE2YXNtX2luX2NiLAotCQkJCSh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJX19mdW5jX18pOwotCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogb3BlbiBhbXJuYiBlbmNvZGVyIGluIFQvTlQgbW9kZSAqLwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FNUk5CLAotCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWQoYXVkaW8tPmFjLCBGT1JNQVRfQU1STkIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KLQkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7Ci0JYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBhbXJuYl9pbl9jb21wYXRfaW9jdGw7Ci0JYXVkaW8tPmVuY19pb2N0bCA9IGFtcm5iX2luX2lvY3RsOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCi0JcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogc3VjY2Vzc1xuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmVuY19jZmcpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGFtcm5iX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgICA9IGF1ZGlvX2luX2NvbXBhdF9pb2N0bAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2Ftcm5iX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYW1ybmJfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJuYl9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGFtcm5iX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hbXJ3Yl9pbi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hbXJ3Yl9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGMxOTExLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYW1yd2JfaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgMjAxNCwgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbXJ3Yi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzLmgiCi0KLS8qIEJ1ZmZlciB3aXRoIG1ldGEqLwotI2RlZmluZSBQQ01fQlVGX1NJWkUJCSg0MDk2ICsgc2l6ZW9mKHN0cnVjdCBtZXRhX2luKSkKLQotLyogTWF4aW11bSAxMCBmcmFtZXMgaW4gYnVmZmVyIHdpdGggbWV0YSAqLwotI2RlZmluZSBGUkFNRV9TSVpFCQkoMSArICgoNjErc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKLQotc3RhdGljIGxvbmcgYW1yd2JfaW5faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOwotCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgewotCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX2FtcndiKGF1ZGlvLT5hYywKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmLAotCQkJZW5jX2NmZy0+YmFuZF9tb2RlLAotCQkJZW5jX2NmZy0+ZHR4X2VuYWJsZSk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgYW1yd2IgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYXVkaW8tPmFjLAotCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAotCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCi0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJYXVkaW8tPmVuYWJsZWQpOwotCQlyYyA9IGF1ZGlvX2luX2VuYWJsZShhdWRpbyk7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCi0JCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLwotCQlyYyA9IDA7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXByX2RlYnVnKCIlczpBVURJT19TVE9QXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKmNmZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKLQkJY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyAqKWFyZzsKLQkJaWYgKGNmZyA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBOVUxMIGNvbmZpZyBwb2ludGVyIGZvciAlc1xuIiwKLQkJCQkJX19mdW5jX18sICJBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJRyIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY2ZnLT5iYW5kX21vZGUgPiA4KSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGludmFsaWQgYmFuZCBtb2RlXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogVG9EbzogQU1SIFdCIGVuY29kZXIgYWNjZXB0cyB2YWx1ZXMgYmV0d2VlbiAwLTgKLQkJICogd2hpbGUgb3Blbm1heCBwcm92aWRlcyB2YWx1ZSBiZXR3ZWVuIDktMTcKLQkJICogYXMgcGVyIHNwZWMKLQkJICovCi0JCWVuY19jZmctPmJhbmRfbW9kZSA9IGNmZy0+YmFuZF9tb2RlOwotCQllbmNfY2ZnLT5kdHhfZW5hYmxlID0gKGNmZy0+ZHR4X2VuYWJsZSA/IDEgOiAwKTsKLQkJLyogQ3VycmVudGx5IERTUCBkb2VzIG5vdCBzdXBwb3J0IGRpZmZlcmVudCBmcmFtZWZvcm1hdCAqLwotCQllbmNfY2ZnLT5mcmFtZV9mb3JtYXQgPSAwOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogYmFuZF9tb2RlID0gMHgleCBkdHhfZW5hYmxlPTB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQllbmNfY2ZnLT5iYW5kX21vZGUsIGVuY19jZmctPmR0eF9lbmFibGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYW1yd2JfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXJjID0gYW1yd2JfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgTlVMTCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BTVJXQl9FTkNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5lbmNfY2ZnLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcpKSkKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCX0VOQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FNUldCX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihjZmcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGFtcndiX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRyBmYWlsZWQuIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnXzMyIHsKLQl1MzIgYmFuZF9tb2RlOwotCXUzMiBkdHhfZW5hYmxlOwotCXUzMiBmcmFtZV9mb3JtYXQ7Ci19OwotCi1lbnVtIHsKLQlBVURJT19HRVRfQU1SV0JfRU5DX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnXzMyKSwKLQlBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCi0JCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnXzMyKQotfTsKLQotc3RhdGljIGxvbmcgYW1yd2JfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGFtcndiX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIE5VTEwpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQU1SV0JfRU5DX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKmFtcndiX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnXzMyIGFtcndiX2NvbmZpZ18zMjsKLQotCQltZW1zZXQoJmFtcndiX2NvbmZpZ18zMiwgMCwgc2l6ZW9mKGFtcndiX2NvbmZpZ18zMikpOwotCi0JCWFtcndiX2NvbmZpZyA9Ci0JCShzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKLQkJYW1yd2JfY29uZmlnXzMyLmJhbmRfbW9kZSA9IGFtcndiX2NvbmZpZy0+YmFuZF9tb2RlOwotCQlhbXJ3Yl9jb25maWdfMzIuZHR4X2VuYWJsZSA9IGFtcndiX2NvbmZpZy0+ZHR4X2VuYWJsZTsKLQkJYW1yd2JfY29uZmlnXzMyLmZyYW1lX2Zvcm1hdCA9IGFtcndiX2NvbmZpZy0+ZnJhbWVfZm9ybWF0OwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhbXJ3Yl9jb25maWdfMzIsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQU1SV0JfRU5DX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgY2ZnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FNUldCX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNtZCA9IEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHOwotCQlyYyA9IGFtcndiX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZjZmdfMzIpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRyBmYWlsZWQuIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYW1yd2JfaW5fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFtcndiX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgKmVuY19jZmc7Ci0JaW50IHJjID0gMDsKLQotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9faW4pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jb2RlciBjb25maWcgcGFyYW0gKi8KLQlhdWRpby0+ZW5jX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JfZW5jX2NvbmZpZyksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGF1ZGlvLT5lbmNfY2ZnID09IE5VTEwpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCi0JbXV0ZXhfaW5pdCgmYXVkaW8tPmxvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+cmVhZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDMyOwotCWF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYgPSAxMDsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZfU0laRTsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOwotCWVuY19jZmctPmJhbmRfbW9kZSA9IDg7Ci0JZW5jX2NmZy0+ZHR4X2VuYWJsZSA9IDA7Ci0JYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSAxNjAwMDsKLQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYilxNmFzbV9pbl9jYiwKLQkJCQkodm9pZCAqKWF1ZGlvKTsKLQotCWlmICghYXVkaW8tPmFjKSB7Ci0JCXByX2VycigiJXM6YXVkaW9bJXBLXTogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJX19mdW5jX18sIGF1ZGlvKTsKLQkJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIG9wZW4gYW1yd2IgZW5jb2RlciBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOwotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9BTVJXQiwKLQkJCQkJRk9STUFUX0xJTkVBUl9QQ00pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IE5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IE5UIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCX0gZWxzZSBpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkKGF1ZGlvLT5hYywgRk9STUFUX0FNUldCKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCS8qIHJlZ2lzdGVyIGZvciB0eCBvdmVyZmxvdyAodmFsaWQgZm9yIHR1bm5lbCBtb2RlIG9ubHkpICovCi0JCXJjID0gcTZhc21fcmVnX3R4X292ZXJmbG93KGF1ZGlvLT5hYywgMHgwMSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVFggT3ZlcmZsb3cgcmVnaXN0cmF0aW9uIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCXJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBUIG1vZGUgZW5jb2RlciBzdWNjZXNzXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOwotCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gYW1yd2JfaW5fY29tcGF0X2lvY3RsOwotCWF1ZGlvLT5lbmNfaW9jdGwgPSBhbXJ3Yl9pbl9pb2N0bDsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQotCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCXJldHVybiAwOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBhbXJ3Yl9pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pbl9pb2N0bCwKLQkuY29tcGF0X2lvY3RsICAgPSBhdWRpb19pbl9jb21wYXRfaW9jdGwKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FtcndiX2luX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9hbXJ3Yl9pbiIsCi0JLmZvcHMJPSAmYXVkaW9faW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFtcndiX2luX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fYW1yd2JfaW5fbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhbXJ3Yl9pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWFjLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FhYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3MWZkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyogYWFjIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotI2RlZmluZSBBVURJT19BQUNfRFVBTF9NT05PX0lOVkFMSUQgLTEKLSNkZWZpbmUgUENNX0JVRlNaX01JTl9BQUMJKCg4KjEwMjQpICsgc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpKQotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYWFjX21pc2M7Ci1zdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb19hYWNfd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hYWNfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl2b2lkICphcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXN0cnVjdCBhc21fYWFjX2NmZyBhYWNfY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7Ci0JCXVpbnQzMl90IHNicl9wcyA9IDB4MDA7Ci0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCi0JCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsIDAsIDApOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiB0dXJuIG9uIGJvdGggc2JyIGFuZCBwcyAqLwotCQlyYyA9IHE2YXNtX2VuYWJsZV9zYnJwcyhhdWRpby0+YWMsIHNicl9wcyk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoInNici1wcyBlbmFibGUgZmFpbGVkXG4iKTsKLQkJYWFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKilhdWRpby0+Y29kZWNfY2ZnOwotCQlpZiAoYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWcpCi0JCQlhYWNfY2ZnLmFvdCA9IEFBQ19FTkNfTU9ERV9FQUFDX1A7Ci0JCWVsc2UgaWYgKGFhY19jb25maWctPnNicl9vbl9mbGFnKQotCQkJYWFjX2NmZy5hb3QgPSBBQUNfRU5DX01PREVfQUFDX1A7Ci0JCWVsc2UKLQkJCWFhY19jZmcuYW90ID0gQUFDX0VOQ19NT0RFX0FBQ19MQzsKLQotCQlzd2l0Y2ggKGFhY19jb25maWctPmZvcm1hdCkgewotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfQURUUzoKLQkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfTE9BUzoKLQkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMTsKLQkJCWJyZWFrOwotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfQURJRjoKLQkJCWFhY19jZmcuZm9ybWF0ID0gMHgwMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQljYXNlIEFVRElPX0FBQ19GT1JNQVRfUkFXOgotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAzOwotCQl9Ci0JCWFhY19jZmcuZXBfY29uZmlnID0gYWFjX2NvbmZpZy0+ZXBfY29uZmlnOwotCQlhYWNfY2ZnLnNlY3Rpb25fZGF0YV9yZXNpbGllbmNlID0KLQkJCWFhY19jb25maWctPmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY2ZnLnNjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZSA9Ci0JCQlhYWNfY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jZmcuc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlID0KLQkJCWFhY19jb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NmZy5jaF9jZmcgPSBhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50OwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IFRVTk5FTF9NT0RFKSB7Ci0JCQlhYWNfY2ZnLnNhbXBsZV9yYXRlID0gYWFjX2NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0JCQlhYWNfY2ZnLmNoX2NmZyA9IGFhY19jb25maWctPmNoYW5uZWxfY29uZmlndXJhdGlvbjsKLQkJfSBlbHNlIHsKLQkJCWFhY19jZmcuc2FtcGxlX3JhdGUgPSAgYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGU7Ci0JCQlhYWNfY2ZnLmNoX2NmZyA9IGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQ7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6Zm9ybWF0PSV4IGFvdD0lZCAgY2g9JWQgc3I9JWRcbiIsCi0JCQlfX2Z1bmNfXywgYWFjX2NmZy5mb3JtYXQsCi0JCQlhYWNfY2ZnLmFvdCwgYWFjX2NmZy5jaF9jZmcsCi0JCQlhYWNfY2ZnLnNhbXBsZV9yYXRlKTsKLQotCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCi0JCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FhYyhhdWRpby0+YWMsICZhYWNfY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJjbWQgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCXJjID0gZW5hYmxlX3ZvbHVtZV9yYW1wKGF1ZGlvKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZW5hYmxlIHZvbHVtZSByYW1wXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2luZm8oIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uaWRbJWRdZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJCQlhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7Ci0JCXVpbnQxNl90IHNjZV9sZWZ0ID0gMSwgc2NlX3JpZ2h0ID0gMjsKLQotCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NFVF9BQUNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7Ci0JCWFhY19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICopYXJnOwotCQlpZiAoYWFjX2NvbmZpZyA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbmZpZyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jcHkoYXVkaW8tPmNvZGVjX2NmZywgYWFjX2NvbmZpZywKLQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKSk7Ci0JCS8qIFBMX1BSIGlzIDAgb25seSBuZWVkIHRvIGNoZWNrIFBMX1NSICovCi0JCWlmIChhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSA+Ci0JCSAgICBBVURJT19BQUNfRFVBTF9NT05PX1BMX1NSKSB7Ci0JCQlwcl9lcnIoIiVzOkludmFsaWQgZHVhbF9tb25vIG1vZGUgPSVkXG4iLCBfX2Z1bmNfXywKLQkJCWFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGNvbnZlcnQgdGhlIGRhdGEgZnJvbSB1c2VyIGludG8gc2NlX2xlZnQKLQkJCSAqIGFuZCBzY2VfcmlnaHQgYmFzZWQgb24gdGhlIGRlZmluaXRpb25zCi0JCQkgKi8KLQkJCXByX2RlYnVnKCIlczogbW9kaWZ5IGR1YWxfbW9ubyBtb2RlID0lZFxuIiwgX19mdW5jX18sCi0JCQkJIGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKTsKLQkJCXN3aXRjaCAoYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUpIHsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9QUjoKLQkJCQlzY2VfbGVmdCA9IDE7Ci0JCQkJc2NlX3JpZ2h0ID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9TUjoKLQkJCQlzY2VfbGVmdCA9IDI7Ci0JCQkJc2NlX3JpZ2h0ID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9QUjoKLQkJCQlzY2VfbGVmdCA9IDI7Ci0JCQkJc2NlX3JpZ2h0ID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUjoKLQkJCWRlZmF1bHQ6Ci0JCQkJc2NlX2xlZnQgPSAxOwotCQkJCXNjZV9yaWdodCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyYyA9IHE2YXNtX2NmZ19kdWFsX21vbm9fYWFjKGF1ZGlvLT5hYywKLQkJCQkJCXNjZV9sZWZ0LCBzY2VfcmlnaHQpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIiVzOmFzbSBjbWQgZHVhbG1vbm8gZmFpbGVkIHJjPSVkXG4iLAotCQkJCQkgX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQUFDX0NPTkZJRzogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+Y29kZWNfY2ZnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BQUNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NvbmZpZzsKLQotCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NFVF9BQUNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWFjX2NvbmZpZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2YoYWFjX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0FBQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmFhY19jb25maWcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlc1slcEtdOkZhaWxlZCBpbiB1dGlsc19pb2N0bDogJWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7Ci0JfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiB7Ci0JczE2IGZvcm1hdDsKLQl1MTYgYXVkaW9fb2JqZWN0OwotCXUxNiBlcF9jb25maWc7CS8qIDAgfiAzIHVzZWZ1bCBvbmx5IG9iaiA9IEVSTEMgKi8KLQl1MTYgYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdTE2IGFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQl1MTYgYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCXUxNiBzYnJfb25fZmxhZzsKLQl1MTYgc2JyX3BzX29uX2ZsYWc7Ci0JdTE2IGR1YWxfbW9ub19tb2RlOwotCXUxNiBjaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JdTE2IHNhbXBsZV9yYXRlOwotfTsKLQotZW51bSB7Ci0JQVVESU9fU0VUX0FBQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiksCi0JQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMikKLX07Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIgYWFjX2NvbmZpZ18zMjsKLQotCQlhYWNfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFhY19jb25maWdfMzIuZm9ybWF0ID0gYWFjX2NvbmZpZy0+Zm9ybWF0OwotCQlhYWNfY29uZmlnXzMyLmF1ZGlvX29iamVjdCA9IGFhY19jb25maWctPmF1ZGlvX29iamVjdDsKLQkJYWFjX2NvbmZpZ18zMi5lcF9jb25maWcgPSBhYWNfY29uZmlnLT5lcF9jb25maWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCSBhYWNfY29uZmlnLT5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCWFhY19jb25maWctPmFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NvbmZpZ18zMi5zYnJfb25fZmxhZyA9IGFhY19jb25maWctPnNicl9vbl9mbGFnOwotCQlhYWNfY29uZmlnXzMyLnNicl9wc19vbl9mbGFnID0gYWFjX2NvbmZpZy0+c2JyX3BzX29uX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuZHVhbF9tb25vX21vZGUgPSBhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZTsKLQkJYWFjX2NvbmZpZ18zMi5jaGFubmVsX2NvbmZpZ3VyYXRpb24gPQotCQkJCQlhYWNfY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JCWFhY19jb25maWdfMzIuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWFjX2NvbmZpZ18zMiwKLQkJCXNpemVvZihhYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyBhYWNfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiBhYWNfY29uZmlnXzMyOwotCi0JCXByX2RlYnVnKCIlczogQVVESU9fU0VUX0FBQ19DT05GSUdcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWNfY29uZmlnXzMyLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihhYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYWFjX2NvbmZpZy5mb3JtYXQgPSBhYWNfY29uZmlnXzMyLmZvcm1hdDsKLQkJYWFjX2NvbmZpZy5hdWRpb19vYmplY3QgPSBhYWNfY29uZmlnXzMyLmF1ZGlvX29iamVjdDsKLQkJYWFjX2NvbmZpZy5lcF9jb25maWcgPSBhYWNfY29uZmlnXzMyLmVwX2NvbmZpZzsKLQkJYWFjX2NvbmZpZy5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlhYWNfY29uZmlnXzMyLmFhY19zZWN0aW9uX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY29uZmlnLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZyA9Ci0JCQlhYWNfY29uZmlnXzMyLmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NvbmZpZy5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZ18zMi5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWcuc2JyX29uX2ZsYWcgPSBhYWNfY29uZmlnXzMyLnNicl9vbl9mbGFnOwotCQlhYWNfY29uZmlnLnNicl9wc19vbl9mbGFnID0gYWFjX2NvbmZpZ18zMi5zYnJfcHNfb25fZmxhZzsKLQkJYWFjX2NvbmZpZy5kdWFsX21vbm9fbW9kZSA9IGFhY19jb25maWdfMzIuZHVhbF9tb25vX21vZGU7Ci0JCWFhY19jb25maWcuY2hhbm5lbF9jb25maWd1cmF0aW9uID0KLQkJCQlhYWNfY29uZmlnXzMyLmNoYW5uZWxfY29uZmlndXJhdGlvbjsKLQkJYWFjX2NvbmZpZy5zYW1wbGVfcmF0ZSA9IGFhY19jb25maWdfMzIuc2FtcGxlX3JhdGU7Ci0KLQkJY21kID0gQVVESU9fU0VUX0FBQ19DT05GSUc7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmFhY19jb25maWcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzWyVwS106RmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnID0gTlVMTDsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FhY18iICsgNV07Ci0jZW5kaWYKLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXVkaW8tPmNvZGVjX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyksCi0JCQkJCUdGUF9LRVJORUwpOwotCWlmIChhdWRpby0+Y29kZWNfY2ZnID09IE5VTEwpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JYWFjX2NvbmZpZyA9IGF1ZGlvLT5jb2RlY19jZmc7Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU5fQUFDOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX2FhY19taXNjOwotCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOwotCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fYWFjX3dzX21ncjsKLQlhYWNfY29uZmlnLT5kdWFsX21vbm9fbW9kZSA9IEFVRElPX0FBQ19EVUFMX01PTk9fSU5WQUxJRDsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKLQkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKLQotCWlmICghYXVkaW8tPmFjKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKLQkJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCSAgIEZPUk1BVF9NUEVHNF9BQUMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gQUFDIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMQotCQkgKiBhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCSAqLwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX01QRUc0X0FBQyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FhY18lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKLQkJCQkJICAgIE5VTEwsICh2b2lkICopYXVkaW8sCi0JCQkJCSAgICAmYXVkaW9fYWFjX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotCXByX2luZm8oIiVzOmFhY2RlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmZlZWRiYWNrLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gcmM7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hYWNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FhYyIsCi0JLmZvcHMgPSAmYXVkaW9fYWFjX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19hYWNfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hYWNfbWlzYyk7Ci0KLQlpZiAocmV0ID09IDApCi0JCWRldmljZV9pbml0X3dha2V1cChhdWRpb19hYWNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fYWFjX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19hYWNfd3NfbWdyLndzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2FhY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYWxhYy5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbGFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjg2YzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbGFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hbGFjLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbGFjX21pc2M7Ci1zdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb19hbGFjX3dzX21ncjsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWxhY19kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjb25maWdfZGVidWdmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQotewotCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCU5VTEwsICh2b2lkICopZGF0YSwgJmF1ZGlvX2FsYWNfZGVidWdfZm9wcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWxhY19jaGFubmVsX21hcCh1OCAqY2hhbm5lbF9tYXBwaW5nLCB1aW50MzJfdCBjaGFubmVscyk7Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJCXZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJc3RydWN0IGFzbV9hbGFjX2NmZyBhbGFjX2NmZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZyAqYWxhY19jb25maWc7Ci0JCXU4IGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07Ci0KLQkJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JCWlmIChhbGFjX2NoYW5uZWxfbWFwKGNoYW5uZWxfbWFwcGluZywKLQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGNoYW5uZWwgbWFwIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCi0JCQkJCTE2LCAvKmJpdHMgcGVyIHNhbXBsZSovCi0JCQkJCWZhbHNlLCBmYWxzZSwgY2hhbm5lbF9tYXBwaW5nKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYWxhY19jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFsYWNfY2ZnLmZyYW1lX2xlbmd0aCA9IGFsYWNfY29uZmlnLT5mcmFtZUxlbmd0aDsKLQkJYWxhY19jZmcuY29tcGF0aWJsZV92ZXJzaW9uID0gYWxhY19jb25maWctPmNvbXBhdFZlcnNpb247Ci0JCWFsYWNfY2ZnLmJpdF9kZXB0aCA9IGFsYWNfY29uZmlnLT5iaXREZXB0aDsKLQkJYWxhY19jZmcucGIgPSBhbGFjX2NvbmZpZy0+cGI7Ci0JCWFsYWNfY2ZnLm1iID0gYWxhY19jb25maWctPm1iOwotCQlhbGFjX2NmZy5rYiA9IGFsYWNfY29uZmlnLT5rYjsKLQkJYWxhY19jZmcubnVtX2NoYW5uZWxzID0gYWxhY19jb25maWctPmNoYW5uZWxDb3VudDsKLQkJYWxhY19jZmcubWF4X3J1biA9IGFsYWNfY29uZmlnLT5tYXhSdW47Ci0JCWFsYWNfY2ZnLm1heF9mcmFtZV9ieXRlcyA9IGFsYWNfY29uZmlnLT5tYXhTaXplOwotCQlhbGFjX2NmZy5hdmdfYml0X3JhdGUgPSBhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGU7Ci0JCWFsYWNfY2ZnLnNhbXBsZV9yYXRlID0gYWxhY19jb25maWctPnNhbXBsZVJhdGU7Ci0JCWFsYWNfY2ZnLmNoYW5uZWxfbGF5b3V0X3RhZyA9IGFsYWNfY29uZmlnLT5jaGFubmVsTGF5b3V0OwotCQlwcl9kZWJ1ZygiJXM6IGZyYW1lX2xlbmd0aCAlZCBjb21wYXRpYmxlX3ZlcnNpb24gJWQgYml0X2RlcHRoICVkIHBiICVkIG1iICVkIGtiICVkIG51bV9jaGFubmVscyAlZCBtYXhfcnVuICVkIG1heF9mcmFtZV9ieXRlcyAlZCBhdmdfYml0X3JhdGUgJWQgc2FtcGxlX3JhdGUgJWQgY2hhbm5lbF9sYXlvdXRfdGFnICVkXG4iLAotCQkJCV9fZnVuY19fLCBhbGFjX2NvbmZpZy0+ZnJhbWVMZW5ndGgsCi0JCQkJYWxhY19jb25maWctPmNvbXBhdFZlcnNpb24sCi0JCQkJYWxhY19jb25maWctPmJpdERlcHRoLCBhbGFjX2NvbmZpZy0+cGIsCi0JCQkJYWxhY19jb25maWctPm1iLCBhbGFjX2NvbmZpZy0+a2IsCi0JCQkJYWxhY19jb25maWctPmNoYW5uZWxDb3VudCwgYWxhY19jb25maWctPm1heFJ1biwKLQkJCQlhbGFjX2NvbmZpZy0+bWF4U2l6ZSwKLQkJCQlhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGUsCi0JCQkJYWxhY19jb25maWctPnNhbXBsZVJhdGUsCi0JCQkJYWxhY19jb25maWctPmNoYW5uZWxMYXlvdXQpOwotCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCi0JCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FsYWMoYXVkaW8tPmFjLCAmYWxhY19jZmcsCi0JCQkJCQkJYXVkaW8tPmFjLT5zdHJlYW1faWQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoImNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJaWYgKCFyYykgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQUxBQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmNvZGVjX2NmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnKSkpIHsKLQkJCXByX2VycigiJXM6Y29weV90b191c2VyIGZvciBBVURJT19HRVRfQUxBQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BTEFDX0NPTkZJRzogewotCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOmNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUxBQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZ18zMiB7Ci0JdTMyIGZyYW1lTGVuZ3RoOwotCXU4IGNvbXBhdFZlcnNpb247Ci0JdTggYml0RGVwdGg7Ci0JdTggcGI7Ci0JdTggbWI7Ci0JdTgga2I7Ci0JdTggY2hhbm5lbENvdW50OwotCXUxNiBtYXhSdW47Ci0JdTMyIG1heFNpemU7Ci0JdTMyIGF2ZXJhZ2VCaXRSYXRlOwotCXUzMiBzYW1wbGVSYXRlOwotCXUzMiBjaGFubmVsTGF5b3V0OwotfTsKLQotZW51bSB7Ci0JQVVESU9fR0VUX0FMQUNfQ09ORklHXzMyID0gIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnXzMyKSwKLQlBVURJT19TRVRfQUxBQ19DT05GSUdfMzIgPSAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWdfMzIpCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BTEFDX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICphbGFjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hbGFjX2NvbmZpZ18zMiBhbGFjX2NvbmZpZ18zMjsKLQotCQltZW1zZXQoJmFsYWNfY29uZmlnXzMyLCAwLCBzaXplb2YoYWxhY19jb25maWdfMzIpKTsKLQotCQlhbGFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJYWxhY19jb25maWdfMzIuZnJhbWVMZW5ndGggPSBhbGFjX2NvbmZpZy0+ZnJhbWVMZW5ndGg7Ci0JCWFsYWNfY29uZmlnXzMyLmNvbXBhdFZlcnNpb24gPQotCQkJCWFsYWNfY29uZmlnLT5jb21wYXRWZXJzaW9uOwotCQlhbGFjX2NvbmZpZ18zMi5iaXREZXB0aCA9IGFsYWNfY29uZmlnLT5iaXREZXB0aDsKLQkJYWxhY19jb25maWdfMzIucGIgPSBhbGFjX2NvbmZpZy0+cGI7Ci0JCWFsYWNfY29uZmlnXzMyLm1iID0gYWxhY19jb25maWctPm1iOwotCQlhbGFjX2NvbmZpZ18zMi5rYiA9IGFsYWNfY29uZmlnLT5rYjsKLQkJYWxhY19jb25maWdfMzIuY2hhbm5lbENvdW50ID0gYWxhY19jb25maWctPmNoYW5uZWxDb3VudDsKLQkJYWxhY19jb25maWdfMzIubWF4UnVuID0gYWxhY19jb25maWctPm1heFJ1bjsKLQkJYWxhY19jb25maWdfMzIubWF4U2l6ZSA9IGFsYWNfY29uZmlnLT5tYXhTaXplOwotCQlhbGFjX2NvbmZpZ18zMi5hdmVyYWdlQml0UmF0ZSA9IGFsYWNfY29uZmlnLT5hdmVyYWdlQml0UmF0ZTsKLQkJYWxhY19jb25maWdfMzIuc2FtcGxlUmF0ZSA9IGFsYWNfY29uZmlnLT5zYW1wbGVSYXRlOwotCQlhbGFjX2NvbmZpZ18zMi5jaGFubmVsTGF5b3V0ID0gYWxhY19jb25maWctPmNoYW5uZWxMYXlvdXQ7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFsYWNfY29uZmlnXzMyLAotCQkJc2l6ZW9mKGFsYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgR0VUX0FMQUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FMQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWcgKmFsYWNfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnXzMyIGFsYWNfY29uZmlnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWxhY19jb25maWdfMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKGFsYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBTRVRfQUxBQ19DT05GSUdfMzIgZmFpbGVkXG4iCi0JCQkJLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhbGFjX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJYWxhY19jb25maWctPmZyYW1lTGVuZ3RoID0gYWxhY19jb25maWdfMzIuZnJhbWVMZW5ndGg7Ci0JCWFsYWNfY29uZmlnLT5jb21wYXRWZXJzaW9uID0KLQkJCQlhbGFjX2NvbmZpZ18zMi5jb21wYXRWZXJzaW9uOwotCQlhbGFjX2NvbmZpZy0+Yml0RGVwdGggPSBhbGFjX2NvbmZpZ18zMi5iaXREZXB0aDsKLQkJYWxhY19jb25maWctPnBiID0gYWxhY19jb25maWdfMzIucGI7Ci0JCWFsYWNfY29uZmlnLT5tYiA9IGFsYWNfY29uZmlnXzMyLm1iOwotCQlhbGFjX2NvbmZpZy0+a2IgPSBhbGFjX2NvbmZpZ18zMi5rYjsKLQkJYWxhY19jb25maWctPmNoYW5uZWxDb3VudCA9IGFsYWNfY29uZmlnXzMyLmNoYW5uZWxDb3VudDsKLQkJYWxhY19jb25maWctPm1heFJ1biA9IGFsYWNfY29uZmlnXzMyLm1heFJ1bjsKLQkJYWxhY19jb25maWctPm1heFNpemUgPSBhbGFjX2NvbmZpZ18zMi5tYXhTaXplOwotCQlhbGFjX2NvbmZpZy0+YXZlcmFnZUJpdFJhdGUgPSBhbGFjX2NvbmZpZ18zMi5hdmVyYWdlQml0UmF0ZTsKLQkJYWxhY19jb25maWctPnNhbXBsZVJhdGUgPSBhbGFjX2NvbmZpZ18zMi5zYW1wbGVSYXRlOwotCQlhbGFjX2NvbmZpZy0+Y2hhbm5lbExheW91dCA9IGFsYWNfY29uZmlnXzMyLmNoYW5uZWxMYXlvdXQ7Ci0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2FsYWNfIiArIDVdOwotCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdWRpby0+Y29kZWNfY2ZnKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX2FsYWNfbWlzYzsKLQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKLQlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FsYWNfd3NfbWdyOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAotCQkJCQkgICAgICh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOwotCQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQkJICAgRk9STUFUX0FMQUMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gQUxBQyBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfQUxBQyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FsYWNfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JYXVkaW8tPmRlbnRyeSA9IGNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsICh2b2lkICopYXVkaW8pOwotCi0JaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5kZW50cnkpKQotCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotCXByX2RlYnVnKCIlczphbGFjZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+ZmVlZGJhY2ssCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCXJldHVybiByYzsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGFsYWNfY2hhbm5lbF9tYXAodTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMpCi17Ci0JdTggKmxjaGFubmVsX21hcHBpbmc7Ci0KLQlsY2hhbm5lbF9tYXBwaW5nID0gY2hhbm5lbF9tYXBwaW5nOwotCXByX2RlYnVnKCIlczogIGNoYW5uZWxzIHBhc3NlZDogJWRcbiIsIF9fZnVuY19fLCBjaGFubmVscyk7Ci0JaWYgKGNoYW5uZWxzID09IDEpICB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDIpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSAzKSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA0KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9DUzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDUpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA2KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTEZFOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNykgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX0NTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfTEZFOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gOCkgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTEM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s3XSA9IFBDTV9DSEFOTkVMX0xGRTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBFUlJPUi51bnN1cHBvcnRlZCBudW1fY2ggPSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FsYWNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCi0JLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FsYWNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FsYWMiLAotCS5mb3BzID0gJmF1ZGlvX2FsYWNfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2FsYWNfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbGFjX21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fYWxhY19taXNjLnRoaXNfZGV2aWNlLCB0cnVlKTsKLQlhdWRpb19hbGFjX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19hbGFjX3dzX21nci53c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19hbGFjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJuYi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJuYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAwOThiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYW1ybmIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBhbXJuYiBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2Ftcm5iX3dzX21ncjsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1ybmJfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJaWYgKCFyYykgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLwotCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAotCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogcGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIiVzOiBBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiQVVESU9fU1RBUlQgc3VjY2VzcyBlbmFibGVbJWRdXG4iLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgY29tcGF0IGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9hbXJuYl8iICsgNV07Ci0jZW5kaWYKLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX2Ftcm5iX21pc2M7Ci0JYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb19hbXJuYl93c19tZ3I7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCi0JCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCSAgIEZPUk1BVF9BTVJOQik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FNUk5CKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fYW1ybmJfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCi0JCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAotCQkJCQkgICAgJmF1ZGlvX2Ftcm5iX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotCXByX2luZm8oIiVzOmFtcm5iIGRlY29kZXIgb3BlbiBzdWNjZXNzLCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIHJjOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2Ftcm5iX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fYW1ybmJfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2Ftcm5iIiwKLQkuZm9wcyA9ICZhdWRpb19hbXJuYl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fYW1ybmJfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJuYl9taXNjKTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX2Ftcm5iX21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX2Ftcm5iX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19hbXJuYl93c19tZ3Iud3NfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9fYW1ybmJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FtcndiLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FtcndiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNWRiMGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJ3Yi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qIGFtcndiIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3Yl9taXNjOwotc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fYW1yd2Jfd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hbXJ3Yl9kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLwotCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAotCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCQkJYXVkaW8tPmVuYWJsZWQpOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IHBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZCByYz0lZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJaWYgKCFyYykgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCIlczogQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uaWRbJWRdZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCWF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCi0JCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyBjb21wYXQgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9hbXJ3Yl8iICsgNV07Ci0jZW5kaWYKLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX2FtcndiX21pc2M7Ci0JYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb19hbXJ3Yl93c19tZ3I7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCi0JCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQkJICAgRk9STUFUX0FNUldCKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfQU1SV0IpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9hbXJ3Yl8lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKLQkJCQkJICAgIE5VTEwsICh2b2lkICopYXVkaW8sCi0JCQkJCSAgICAmYXVkaW9fYW1yd2JfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0JcHJfaW5mbygiJXM6IEFNUldCIGRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmZlZWRiYWNrLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hbXJ3Yl9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKLQkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FtcndiX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9hbXJ3YiIsCi0JLmZvcHMgPSAmYXVkaW9fYW1yd2JfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2FtcndiX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fYW1yd2JfbWlzYyk7Ci0KLQlpZiAocmV0ID09IDApCi0JCWRldmljZV9pbml0X3dha2V1cChhdWRpb19hbXJ3Yl9taXNjLnRoaXNfZGV2aWNlLCB0cnVlKTsKLQlhdWRpb19hbXJ3Yl93c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fYW1yd2Jfd3NfbWdyLndzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2FtcndiX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJ3YnBsdXMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYW1yd2JwbHVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OGE4MGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19hbXJ3YnBsdXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKiBhbXItd2JwbHVzIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fYW1yd2JwbHVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3YnBsdXNfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2FtcndicGx1c193c19tZ3I7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2FtcndicGx1c19kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKLX07Ci1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlpZiAoYXVkaW8gIT0gTlVMTCkgewotCQljaGFyIG5hbWVbc2l6ZW9mKCJtc21fYW1yd2JwbHVzXyIpICsgNV07Ci0KLQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FtcndicGx1c18lMDR4IiwKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCQkJTlVMTCwgKHZvaWQgKilhdWRpbywKLQkJCQkJCSZhdWRpb19hbXJ3YnBsdXNfZGVidWdfZm9wcyk7Ci0JCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnMoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLX0KLSNlbmRpZgotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCXZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgYXNtX2FtcndicGx1c19jZmcgcTZfYW1yd2JwbHVzX2NmZzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgKmFtcndicGx1c19kcnZfY29uZmlnOwotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQkJcHJfZXJyKCIlc1slcEtdOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCi0JCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsCi0JCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZyA9Ci0JCShzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgKilhdWRpby0+Y29kZWNfY2ZnOwotCi0JCXE2X2FtcndicGx1c19jZmcuc2l6ZV9ieXRlcyAgICAgPQotCQkJYW1yd2JwbHVzX2Rydl9jb25maWctPnNpemVfYnl0ZXM7Ci0JCXE2X2FtcndicGx1c19jZmcudmVyc2lvbiAgICAgICAgPQotCQkJYW1yd2JwbHVzX2Rydl9jb25maWctPnZlcnNpb247Ci0JCXE2X2FtcndicGx1c19jZmcubnVtX2NoYW5uZWxzICAgPQotCQkJYW1yd2JwbHVzX2Rydl9jb25maWctPm51bV9jaGFubmVsczsKLQkJcTZfYW1yd2JwbHVzX2NmZy5hbXJfYmFuZF9tb2RlICA9Ci0JCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZy0+YW1yX2JhbmRfbW9kZTsKLQkJcTZfYW1yd2JwbHVzX2NmZy5hbXJfZHR4X21vZGUgICA9Ci0JCQlhbXJ3YnBsdXNfZHJ2X2NvbmZpZy0+YW1yX2R0eF9tb2RlOwotCQlxNl9hbXJ3YnBsdXNfY2ZnLmFtcl9mcmFtZV9mbXQgID0KLQkJCWFtcndicGx1c19kcnZfY29uZmlnLT5hbXJfZnJhbWVfZm10OwotCQlxNl9hbXJ3YnBsdXNfY2ZnLmFtcl9sc2ZfaWR4ICAgID0KLQkJCWFtcndicGx1c19kcnZfY29uZmlnLT5hbXJfbHNmX2lkeDsKLQotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hbXJ3YnBsdXMoYXVkaW8tPmFjLAotCQkJCQkJCSZxNl9hbXJ3YnBsdXNfY2ZnKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYW1yd2IrIGZhaWxlZC4uLlxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOkFVRElPX1NUQVJUIHNlc3Npb25pZFslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCWF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCi0JCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfQU1SV0JQTFVTX0NPTkZJR19WMjogewotCQlpZiAoKGF1ZGlvKSAmJiAoYXJnKSAmJiAoYXVkaW8tPmNvZGVjX2NmZykpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjIgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9IGVsc2UgewotCQkJCXByX2VycigiJXM6IHdiKyBjb25maWcgdjIgaW52YWxpZCBwYXJhbWV0ZXJzXG4iCi0JCQkJCSwgX19mdW5jX18pOwotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FNUldCUExVU19DT05GSUdfVjI6IHsKLQkJaWYgKChhdWRpbykgJiYgKGFyZykgJiYgKGF1ZGlvLT5jb2RlY19jZmcpKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1SV0JQTFVTX0NPTkZJR19WMiBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZXJyKCIlczogd2IrIGNvbmZpZyBpbnZhbGlkIHBhcmFtZXRlcnNcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMiB7Ci0JdTMyIHNpemVfYnl0ZXM7Ci0JdTMyIHZlcnNpb247Ci0JdTMyIG51bV9jaGFubmVsczsKLQl1MzIgYW1yX2JhbmRfbW9kZTsKLQl1MzIgYW1yX2R0eF9tb2RlOwotCXUzMiBhbXJfZnJhbWVfZm10OwotCXUzMiBhbXJfbHNmX2lkeDsKLX07Ci0KLWVudW0gewotCUFVRElPX0dFVF9BTVJXQlBMVVNfQ09ORklHX1YyXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzIpLAotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIpLAotCUFVRElPX1NFVF9BTVJXQlBMVVNfQ09ORklHX1YyXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKLQkJKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzMpLAotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIpCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjJfMzI6IHsKLQkJaWYgKGF1ZGlvICYmIGFyZyAmJiAoYXVkaW8tPmNvZGVjX2NmZykpIHsKLQkJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MiAqYW1yd2JwbHVzX2NvbmZpZzsKLQkJCXN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMgotCQkJCQkJYW1yd2JwbHVzX2NvbmZpZ18zMjsKLQotCQkJbWVtc2V0KCZhbXJ3YnBsdXNfY29uZmlnXzMyLCAwLAotCQkJCQlzaXplb2YoYW1yd2JwbHVzX2NvbmZpZ18zMikpOwotCi0JCQlhbXJ3YnBsdXNfY29uZmlnID0KLQkJCQkoc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyICopCi0JCQkJYXVkaW8tPmNvZGVjX2NmZzsKLQkJCWFtcndicGx1c19jb25maWdfMzIuc2l6ZV9ieXRlcyA9Ci0JCQkJCWFtcndicGx1c19jb25maWctPnNpemVfYnl0ZXM7Ci0JCQlhbXJ3YnBsdXNfY29uZmlnXzMyLnZlcnNpb24gPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT52ZXJzaW9uOwotCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5udW1fY2hhbm5lbHMgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5udW1fY2hhbm5lbHM7Ci0JCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9iYW5kX21vZGUgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfYmFuZF9tb2RlOwotCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5hbXJfZHR4X21vZGUgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZHR4X21vZGU7Ci0JCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9mcmFtZV9mbXQgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZnJhbWVfZm10OwotCQkJYW1yd2JwbHVzX2NvbmZpZ18zMi5hbXJfbHNmX2lkeCA9Ci0JCQkJCWFtcndicGx1c19jb25maWctPmFtcl9sc2ZfaWR4OwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYW1yd2JwbHVzX2NvbmZpZ18zMiwKLQkJCQlzaXplb2YoYW1yd2JwbHVzX2NvbmZpZ18zMikpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjJfMzIgZmFpbGVkXG4iCi0JCQkJCSwgX19mdW5jX18pOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogd2IrIEdldCBjb25maWcgdjIgaW52YWxpZCBwYXJhbWV0ZXJzXG4iCi0JCQkJLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0FNUldCUExVU19DT05GSUdfVjJfMzI6IHsKLQkJaWYgKChhdWRpbykgJiYgKGFyZykgJiYgKGF1ZGlvLT5jb2RlY19jZmcpKSB7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIgKmFtcndicGx1c19jb25maWc7Ci0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjJfMzIKLQkJCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmFtcndicGx1c19jb25maWdfMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192Ml8zMikpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQU1SV0JQTFVTX0NPTkZJR19WMl8zMiBmYWlsZWRcbiIKLQkJCQkJLCBfX2Z1bmNfXyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhbXJ3YnBsdXNfY29uZmlnID0KLQkJCSAoc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyICopCi0JCQkJCQlhdWRpby0+Y29kZWNfY2ZnOwotCQkJYW1yd2JwbHVzX2NvbmZpZy0+c2l6ZV9ieXRlcyA9Ci0JCQkJCWFtcndicGx1c19jb25maWdfMzIuc2l6ZV9ieXRlczsKLQkJCWFtcndicGx1c19jb25maWctPnZlcnNpb24gPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLnZlcnNpb247Ci0JCQlhbXJ3YnBsdXNfY29uZmlnLT5udW1fY2hhbm5lbHMgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLm51bV9jaGFubmVsczsKLQkJCWFtcndicGx1c19jb25maWctPmFtcl9iYW5kX21vZGUgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9iYW5kX21vZGU7Ci0JCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfZHR4X21vZGUgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9kdHhfbW9kZTsKLQkJCWFtcndicGx1c19jb25maWctPmFtcl9mcmFtZV9mbXQgPQotCQkJCQlhbXJ3YnBsdXNfY29uZmlnXzMyLmFtcl9mcmFtZV9mbXQ7Ci0JCQlhbXJ3YnBsdXNfY29uZmlnLT5hbXJfbHNmX2lkeCA9Ci0JCQkJCWFtcndicGx1c19jb25maWdfMzIuYW1yX2xzZl9pZHg7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB3YisgY29uZmlnIGludmFsaWQgcGFyYW1ldGVyc1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoYXVkaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdWRpby0+Y29kZWNfY2ZnID0KLQlremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndicGx1c19jb25maWdfdjIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19hbXJ3YnBsdXNfbWlzYzsKLQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKLQlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2FtcndicGx1c193c19tZ3I7Ci0KLQlhdWRpby0+YWMgPQotCXE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7Ci0JCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCUZPUk1BVF9BTVJfV0JfUExVUyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiYW1yd2JwbHVzIE5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9BTVJfV0JfUExVUyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2Vycigid2IrIFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoImF1ZGlvX2FtcndicGx1cyBOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQljb25maWdfZGVidWdfZnMoYXVkaW8pOwotCXByX2RlYnVnKCIlczogQU1SV0JQTFVTIGRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAotCQlhdWRpby0+ZmVlZGJhY2ssCi0JCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYW1yd2JwbHVzX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hbXJ3YnBsdXNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FtcndicGx1cyIsCi0JLmZvcHMgPSAmYXVkaW9fYW1yd2JwbHVzX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19hbXJ3YnBsdXNfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hbXJ3YnBsdXNfbWlzYyk7Ci0KLQlpZiAocmV0ID09IDApCi0JCWRldmljZV9pbml0X3dha2V1cChhdWRpb19hbXJ3YnBsdXNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fYW1yd2JwbHVzX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19hbXJ3YnBsdXNfd3NfbWdyLndzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2FtcndicGx1c19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYXBlLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2FwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RjMDY0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fYXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19hcGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2FwZV9taXNjOwotc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fYXBlX3dzX21ncjsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYXBlX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAotfTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjb25maWdfZGVidWdmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKQotewotCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJTlVMTCwgKHZvaWQgKilkYXRhLCAmYXVkaW9fYXBlX2RlYnVnX2ZvcHMpOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl2b2lkICphcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXN0cnVjdCBhc21fYXBlX2NmZyBhcGVfY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcgKmFwZV9jb25maWc7Ci0KLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhcGVfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFwZV9jZmcuY29tcGF0aWJsZV92ZXJzaW9uID0gYXBlX2NvbmZpZy0+Y29tcGF0aWJsZVZlcnNpb247Ci0JCWFwZV9jZmcuY29tcHJlc3Npb25fbGV2ZWwgPSBhcGVfY29uZmlnLT5jb21wcmVzc2lvbkxldmVsOwotCQlhcGVfY2ZnLmZvcm1hdF9mbGFncyA9IGFwZV9jb25maWctPmZvcm1hdEZsYWdzOwotCQlhcGVfY2ZnLmJsb2Nrc19wZXJfZnJhbWUgPSBhcGVfY29uZmlnLT5ibG9ja3NQZXJGcmFtZTsKLQkJYXBlX2NmZy5maW5hbF9mcmFtZV9ibG9ja3MgPSBhcGVfY29uZmlnLT5maW5hbEZyYW1lQmxvY2tzOwotCQlhcGVfY2ZnLnRvdGFsX2ZyYW1lcyA9IGFwZV9jb25maWctPnRvdGFsRnJhbWVzOwotCQlhcGVfY2ZnLmJpdHNfcGVyX3NhbXBsZSA9IGFwZV9jb25maWctPmJpdHNQZXJTYW1wbGU7Ci0JCWFwZV9jZmcubnVtX2NoYW5uZWxzID0gYXBlX2NvbmZpZy0+bnVtQ2hhbm5lbHM7Ci0JCWFwZV9jZmcuc2FtcGxlX3JhdGUgPSBhcGVfY29uZmlnLT5zYW1wbGVSYXRlOwotCQlhcGVfY2ZnLnNlZWtfdGFibGVfcHJlc2VudCA9IGFwZV9jb25maWctPnNlZWtUYWJsZVByZXNlbnQ7Ci0JCXByX2RlYnVnKCIlczogY29tcGF0aWJsZVZlcnNpb24gJWQgY29tcHJlc3Npb25MZXZlbCAlZCBmb3JtYXRGbGFncyAlZCBibG9ja3NQZXJGcmFtZSAlZCBmaW5hbEZyYW1lQmxvY2tzICVkIHRvdGFsRnJhbWVzICVkIGJpdHNQZXJTYW1wbGUgJWQgbnVtQ2hhbm5lbHMgJWQgc2FtcGxlUmF0ZSAlZCBzZWVrVGFibGVQcmVzZW50ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhcGVfY29uZmlnLT5jb21wYXRpYmxlVmVyc2lvbiwKLQkJCQlhcGVfY29uZmlnLT5jb21wcmVzc2lvbkxldmVsLAotCQkJCWFwZV9jb25maWctPmZvcm1hdEZsYWdzLAotCQkJCWFwZV9jb25maWctPmJsb2Nrc1BlckZyYW1lLAotCQkJCWFwZV9jb25maWctPmZpbmFsRnJhbWVCbG9ja3MsCi0JCQkJYXBlX2NvbmZpZy0+dG90YWxGcmFtZXMsCi0JCQkJYXBlX2NvbmZpZy0+Yml0c1BlclNhbXBsZSwKLQkJCQlhcGVfY29uZmlnLT5udW1DaGFubmVscywKLQkJCQlhcGVfY29uZmlnLT5zYW1wbGVSYXRlLAotCQkJCWFwZV9jb25maWctPnNlZWtUYWJsZVByZXNlbnQpOwotCQkvKiBDb25maWd1cmUgTWVkaWEgZm9ybWF0IGJsb2NrICovCi0JCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwZShhdWRpby0+YWMsICZhcGVfY2ZnLAotCQkJCQkJCWF1ZGlvLT5hYy0+c3RyZWFtX2lkKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJjbWQgbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIkFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0FQRV9DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmNvZGVjX2NmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczpjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9BUEVfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQVBFX0NPTkZJRzogewotCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnKSkpIHsKLQkJCXByX2VycigiJXM6Y29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BUEVfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIkZhaWxlZCBpbiB1dGlsc19pb2N0bDogJWRcbiIsIHJjKTsKLQkJYnJlYWs7Ci0JfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWdfMzIgewotCXUxNiBjb21wYXRpYmxlVmVyc2lvbjsKLQl1MTYgY29tcHJlc3Npb25MZXZlbDsKLQl1MzIgZm9ybWF0RmxhZ3M7Ci0JdTMyIGJsb2Nrc1BlckZyYW1lOwotCXUzMiBmaW5hbEZyYW1lQmxvY2tzOwotCXUzMiB0b3RhbEZyYW1lczsKLQl1MTYgYml0c1BlclNhbXBsZTsKLQl1MTYgbnVtQ2hhbm5lbHM7Ci0JdTMyIHNhbXBsZVJhdGU7Ci0JdTMyIHNlZWtUYWJsZVByZXNlbnQ7Ci0KLX07Ci0KLWVudW0gewotCUFVRElPX0dFVF9BUEVfQ09ORklHXzMyID0gIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWdfMzIpLAotCUFVRElPX1NFVF9BUEVfQ09ORklHXzMyID0gIF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWdfMzIpCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BUEVfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyAqYXBlX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnXzMyIGFwZV9jb25maWdfMzI7Ci0KLQkJbWVtc2V0KCZhcGVfY29uZmlnXzMyLCAwLCBzaXplb2YoYXBlX2NvbmZpZ18zMikpOwotCi0JCWFwZV9jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJYXBlX2NvbmZpZ18zMi5jb21wYXRpYmxlVmVyc2lvbiA9IGFwZV9jb25maWctPmNvbXBhdGlibGVWZXJzaW9uOwotCQlhcGVfY29uZmlnXzMyLmNvbXByZXNzaW9uTGV2ZWwgPQotCQkJCWFwZV9jb25maWctPmNvbXByZXNzaW9uTGV2ZWw7Ci0JCWFwZV9jb25maWdfMzIuZm9ybWF0RmxhZ3MgPSBhcGVfY29uZmlnLT5mb3JtYXRGbGFnczsKLQkJYXBlX2NvbmZpZ18zMi5ibG9ja3NQZXJGcmFtZSA9IGFwZV9jb25maWctPmJsb2Nrc1BlckZyYW1lOwotCQlhcGVfY29uZmlnXzMyLmZpbmFsRnJhbWVCbG9ja3MgPSBhcGVfY29uZmlnLT5maW5hbEZyYW1lQmxvY2tzOwotCQlhcGVfY29uZmlnXzMyLnRvdGFsRnJhbWVzID0gYXBlX2NvbmZpZy0+dG90YWxGcmFtZXM7Ci0JCWFwZV9jb25maWdfMzIuYml0c1BlclNhbXBsZSA9IGFwZV9jb25maWctPmJpdHNQZXJTYW1wbGU7Ci0JCWFwZV9jb25maWdfMzIubnVtQ2hhbm5lbHMgPSBhcGVfY29uZmlnLT5udW1DaGFubmVsczsKLQkJYXBlX2NvbmZpZ18zMi5zYW1wbGVSYXRlID0gYXBlX2NvbmZpZy0+c2FtcGxlUmF0ZTsKLQkJYXBlX2NvbmZpZ18zMi5zZWVrVGFibGVQcmVzZW50ID0gYXBlX2NvbmZpZy0+c2Vla1RhYmxlUHJlc2VudDsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXBlX2NvbmZpZ18zMiwKLQkJCXNpemVvZihhcGVfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgR0VUX0FQRV9DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQVBFX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcgKmFwZV9jb25maWc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZ18zMiBhcGVfY29uZmlnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXBlX2NvbmZpZ18zMiwgKHZvaWQgKilhcmcsCi0JCQlzaXplb2YoYXBlX2NvbmZpZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgU0VUX0FQRV9DT05GSUdfMzIgZmFpbGVkXG4iCi0JCQkJLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhcGVfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFwZV9jb25maWctPmNvbXBhdGlibGVWZXJzaW9uID0gYXBlX2NvbmZpZ18zMi5jb21wYXRpYmxlVmVyc2lvbjsKLQkJYXBlX2NvbmZpZy0+Y29tcHJlc3Npb25MZXZlbCA9Ci0JCQkJYXBlX2NvbmZpZ18zMi5jb21wcmVzc2lvbkxldmVsOwotCQlhcGVfY29uZmlnLT5mb3JtYXRGbGFncyA9IGFwZV9jb25maWdfMzIuZm9ybWF0RmxhZ3M7Ci0JCWFwZV9jb25maWctPmJsb2Nrc1BlckZyYW1lID0gYXBlX2NvbmZpZ18zMi5ibG9ja3NQZXJGcmFtZTsKLQkJYXBlX2NvbmZpZy0+ZmluYWxGcmFtZUJsb2NrcyA9IGFwZV9jb25maWdfMzIuZmluYWxGcmFtZUJsb2NrczsKLQkJYXBlX2NvbmZpZy0+dG90YWxGcmFtZXMgPSBhcGVfY29uZmlnXzMyLnRvdGFsRnJhbWVzOwotCQlhcGVfY29uZmlnLT5iaXRzUGVyU2FtcGxlID0gYXBlX2NvbmZpZ18zMi5iaXRzUGVyU2FtcGxlOwotCQlhcGVfY29uZmlnLT5udW1DaGFubmVscyA9IGFwZV9jb25maWdfMzIubnVtQ2hhbm5lbHM7Ci0JCWFwZV9jb25maWctPnNhbXBsZVJhdGUgPSBhcGVfY29uZmlnXzMyLnNhbXBsZVJhdGU7Ci0JCWFwZV9jb25maWctPnNlZWtUYWJsZVByZXNlbnQgPSBhcGVfY29uZmlnXzMyLnNlZWtUYWJsZVByZXNlbnQ7Ci0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiRmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwgcmMpOwotCQlicmVhazsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9hcGVfIiArIDVdOwotCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvLT5jb2RlY19jZmcpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JYXVkaW8tPm1pc2NkZXZpY2UgPSAmYXVkaW9fYXBlX21pc2M7Ci0JYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb19hcGVfd3NfbWdyOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAotCQkJCQkgICAgICh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOwotCQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQkJICAgRk9STUFUX0FQRSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJLyogb3BlbiBBUEUgZGVjb2RlciwgZXhwZWN0ZWQgZnJhbWVzIGlzIGFsd2F5cyAxKi8KLQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0FQRSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2FwZV8lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlhdWRpby0+ZGVudHJ5ID0gY29uZmlnX2RlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoSVNfRVJSX09SX05VTEwoYXVkaW8tPmRlbnRyeSkpCi0JCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0JcHJfZGVidWcoIiVzOmFwZWRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmZlZWRiYWNrLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gcmM7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYXBlX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19hcGVfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2FwZSIsCi0JLmZvcHMgPSAmYXVkaW9fYXBlX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19hcGVfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19hcGVfbWlzYyk7Ci0KLQlpZiAocmV0ID09IDApCi0JCWRldmljZV9pbml0X3dha2V1cChhdWRpb19hcGVfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fYXBlX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19hcGVfd3NfbWdyLndzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2FwZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZXZyYy5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19ldnJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzYyMzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19ldnJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyogZXZyYyBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2V2cmNfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2V2cmNfd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19ldnJjX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpbywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJCS8qIENvbmZpZ3VyZSBQQ00gb3V0cHV0IGJsb2NrICovCi0JCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShhdWRpby0+YWMsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAotCQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiQXVkaW8gU3RhcnQgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uaWRbJWRdZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJCQlhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2V2cmNfIiArIDVdOwotI2VuZGlmCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19ldnJjX21pc2M7Ci0JYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb19ldnJjX3dzX21ncjsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKLQkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKLQotCWlmICghYXVkaW8tPmFjKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAotCQkJCQkgICBGT1JNQVRfRVZSQyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSAweDAxOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0VWUkMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV9ldnJjXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCQkgICAgTlVMTCwgKHZvaWQgKilhdWRpbywKLQkJCQkJICAgICZhdWRpb19ldnJjX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotCXByX2luZm8oIiVzOmRlYyBzdWNjZXNzIG1vZGVbJWRdc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmZlZWRiYWNrLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gcmM7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZXZyY19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19ldnJjX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9ldnJjIiwKLQkuZm9wcyA9ICZhdWRpb19ldnJjX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19ldnJjX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fZXZyY19taXNjKTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX2V2cmNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fZXZyY193c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fZXZyY193c19tZ3Iud3NfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9fZXZyY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMWFsYXcuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMWFsYXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmODdlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2c3MTFhbGF3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19nNzExX2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZzcxMWFsYXdfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2c3MTFfd3NfbWdyOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19nNzExX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCi0JCQkJTlVMTCwgKHZvaWQgKilkYXRhLCAmYXVkaW9fZzcxMV9kZWJ1Z19mb3BzKTsKLX0KLQotc3RhdGljIGludCBnNzExX2NoYW5uZWxfbWFwKHU4ICpjaGFubmVsX21hcHBpbmcsIHVpbnQzMl90IGNoYW5uZWxzKTsKLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJdm9pZCAqYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgYXNtX2c3MTFfZGVjX2NmZyBnNzExX2RlY19jZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICpnNzExX2RlY19jb25maWc7Ci0JCXU4IGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07Ci0KLQkJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCQltZW1zZXQoJmc3MTFfZGVjX2NmZywgMCwgc2l6ZW9mKGc3MTFfZGVjX2NmZykpOwotCi0JCWlmIChnNzExX2NoYW5uZWxfbWFwKGNoYW5uZWxfbWFwcGluZywKLQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGNoYW5uZWwgbWFwIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCi0JCQkJCTE2LCAvKmJpdHMgcGVyIHNhbXBsZSovCi0JCQkJCWZhbHNlLCBmYWxzZSwgY2hhbm5lbF9tYXBwaW5nKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQkgX19mdW5jX18sIHJjKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlnNzExX2RlY19jb25maWcgPQotCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJZzcxMV9kZWNfY2ZnLnNhbXBsZV9yYXRlID0gZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLwotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKGF1ZGlvLT5hYywgJmc3MTFfZGVjX2NmZywKLQkJCQkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiJXM6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJCSBfX2Z1bmNfXywgYXVkaW8tPmVuYWJsZWQpOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRzogewotCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW8tPmNvZGVjX2NmZywgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IEZhaWxlZCBpbiBhdWRpb19haW9faW9jdGw6ICVkIGNtZD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMsIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuICByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnXzMyIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1lbnVtIHsKLQlBVURJT19TRVRfRzcxMV9ERUNfQ09ORklHXzMyID0gIF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMiksCi0JQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJR18zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIpCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7Ci0KLQkJZzcxMV9kZWNfY29uZmlnID0KLQkJCShzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmc3MTFfZGVjX2NvbmZpZ18zMiwKLQkJCXNpemVvZihnNzExX2RlY19jb25maWdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZnNzExX2RlY19jb25maWdfMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKGc3MTFfZGVjX2NvbmZpZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlnNzExX2RlY19jb25maWcgPQotCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZTsKLQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgaW4gYXVkaW9fYWlvX2NvbXBhdF9pb2N0bDogJWQgY21kPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZWxzZQotI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX2c3MTFfIiArIDVdOwotCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYXVkaW8pCi0JCXJldHVybiAtRU5PTUVNOwotCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyksCi0JCQkJCUdGUF9LRVJORUwpOwotCWlmICghYXVkaW8tPmNvZGVjX2NmZykgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19nNzExYWxhd19taXNjOwotCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOwotCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fZzcxMV93c19tZ3I7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCi0JCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsOwotCX0KLQkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLyAvKmZvcmFtdDpHNzExX0FMQVcqLwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAotCQkJCQkgICBGT1JNQVRfRzcxMV9BTEFXX0ZTKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gRzcxMSBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9BTEFXX0ZTKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiAlZCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgbW9kZVxuIiwKLQkJCQlfX2Z1bmNfXywgZmlsZS0+Zl9tb2RlKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX2c3MTFfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JYXVkaW8tPmRlbnRyeSA9IGNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsICh2b2lkICopYXVkaW8pOwotCi0JaWYgKElTX0VSUl9PUl9OVUxMKGF1ZGlvLT5kZW50cnkpKQotCQlwcl9kZWJ1ZygiJXM6IGRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcHJfZGVidWcoIiVzOiBnNzExZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+ZmVlZGJhY2ssCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCXJldHVybiByYzsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGc3MTFfY2hhbm5lbF9tYXAodTggKmNoYW5uZWxfbWFwcGluZywgdWludDMyX3QgY2hhbm5lbHMpCi17Ci0JdTggKmxjaGFubmVsX21hcHBpbmc7Ci0KLQlsY2hhbm5lbF9tYXBwaW5nID0gY2hhbm5lbF9tYXBwaW5nOwotCXByX2RlYnVnKCIlczogY2hhbm5lbHMgcGFzc2VkOiAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWxzKTsKLQlpZiAoY2hhbm5lbHMgPT0gMSkgIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDMpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDQpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0NTOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNSkgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDYpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA3KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gUENNX0NIQU5ORUxfQ1M7Ci0JCWxjaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA4KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s2XSA9IFBDTV9DSEFOTkVMX1JTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzddID0gUENNX0NIQU5ORUxfTEZFOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IEVSUk9SLnVuc3VwcG9ydGVkIG51bV9jaCA9ICV1XG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fZzcxMV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotfTsKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2c3MTFhbGF3X21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9nNzExYWxhdyIsCi0JLmZvcHMgPSAmYXVkaW9fZzcxMV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fZzcxMWFsYXdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19nNzExYWxhd19taXNjKTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX2c3MTFhbGF3X21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX2c3MTFfd3NfbWdyLnJlZl9jbnQgPSAwOwotCW11dGV4X2luaXQoJmF1ZGlvX2c3MTFfd3NfbWdyLndzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19nNzExYWxhd19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZhdWRpb19nNzExYWxhd19taXNjKTsKLQltdXRleF9kZXN0cm95KCZhdWRpb19nNzExX3dzX21nci53c19sb2NrKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGF1ZGlvX2c3MTFhbGF3X2luaXQpOwotX19leGl0Y2FsbChhdWRpb19nNzExYWxhd19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMW1sYXcuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fZzcxMW1sYXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkMzY4MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2c3MTFtbGF3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19nNzExX2RlYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZzcxMW1sYXdfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX2c3MTFfd3NfbWdyOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19nNzExX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvbmZpZ19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCi0JCQkJTlVMTCwgKHZvaWQgKilkYXRhLCAmYXVkaW9fZzcxMV9kZWJ1Z19mb3BzKTsKLX0KLQotc3RhdGljIGludCBnNzExX2NoYW5uZWxfbWFwKHU4ICpjaGFubmVsX21hcHBpbmcsIHVpbnQzMl90IGNoYW5uZWxzKTsKLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJdm9pZCAqYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgYXNtX2c3MTFfZGVjX2NmZyBnNzExX2RlY19jZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICpnNzExX2RlY19jb25maWc7Ci0JCXU4IGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07Ci0KLQkJbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCQltZW1zZXQoJmc3MTFfZGVjX2NmZywgMCwgc2l6ZW9mKGc3MTFfZGVjX2NmZykpOwotCi0JCWlmIChnNzExX2NoYW5uZWxfbWFwKGNoYW5uZWxfbWFwcGluZywKLQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXR0aW5nIGNoYW5uZWwgbWFwIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCi0JCQkJCTE2LCAvKmJpdHMgcGVyIHNhbXBsZSovCi0JCQkJCWZhbHNlLCBmYWxzZSwgY2hhbm5lbF9tYXBwaW5nKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQkgX19mdW5jX18sIHJjKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlnNzExX2RlY19jb25maWcgPQotCQkJKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJZzcxMV9kZWNfY2ZnLnNhbXBsZV9yYXRlID0gZzcxMV9kZWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLwotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKGF1ZGlvLT5hYywgJmc3MTFfZGVjX2NmZywKLQkJCQkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IGNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2Fpb19lbmFibGUoYXVkaW8pOwotCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCWlmICghcmMpIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMTsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJCXByX2VycigiJXM6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmVuYWJsZWQpOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF1ZGlvLT5jb2RlY19jZmcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnKSkpIHsKLQkJCXByX2VycigiJXM6IEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IEZhaWxlZCBpbiBhdWRpb19haW9faW9jdGw6ICVkIGNtZD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMsIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuICByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnXzMyIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1lbnVtIHsKLQlBVURJT19TRVRfRzcxMV9ERUNfQ09ORklHXzMyID0gIF9JT1coQVVESU9fSU9DVExfTUFHSUMsCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZ18zMiksCi0JQVVESU9fR0VUX0c3MTFfREVDX0NPTkZJR18zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIpCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7Ci0KLQkJZzcxMV9kZWNfY29uZmlnID0KLQkJCShzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWc3MTFfZGVjX2NvbmZpZ18zMi5zYW1wbGVfcmF0ZSA9IGc3MTFfZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmc3MTFfZGVjX2NvbmZpZ18zMiwKLQkJCXNpemVvZihnNzExX2RlY19jb25maWdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRzcxMV9ERUNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcgKmc3MTFfZGVjX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWdfMzIgZzcxMV9kZWNfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmZzcxMV9kZWNfY29uZmlnXzMyLCAwLCBzaXplb2YoZzcxMV9kZWNfY29uZmlnXzMyKSk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZnNzExX2RlY19jb25maWdfMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKGc3MTFfZGVjX2NvbmZpZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0c3MTFfREVDX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJZzcxMV9kZWNfY29uZmlnID0KLQkJCShzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWc3MTFfZGVjX2NvbmZpZy0+c2FtcGxlX3JhdGUgPSBnNzExX2RlY19jb25maWdfMzIuc2FtcGxlX3JhdGU7Ci0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogRmFpbGVkIGluIGF1ZGlvX2Fpb19jb21wYXRfaW9jdGw6ICVkIGNtZD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMsIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotI2Vsc2UKLSNkZWZpbmUgYXVkaW9fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9nNzExXyIgKyA1XTsKLQotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWF1ZGlvKQotCQlyZXR1cm4gLUVOT01FTTsKLQlhdWRpby0+Y29kZWNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2RlY19jb25maWcpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWF1ZGlvLT5jb2RlY19jZmcpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IFBDTV9CVUZTWl9NSU47Ci0JYXVkaW8tPm1pc2NkZXZpY2UgPSAmYXVkaW9fZzcxMW1sYXdfbWlzYzsKLQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKLQlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX2c3MTFfd3NfbWdyOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAotCQkJCQkgICAgICh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsOwotCX0KLQkvKiBvcGVuIGluIFQvTlQgbW9kZSAqLyAvKmZvcmFtdDpHNzExX0FMQVcqLwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9MSU5FQVJfUENNLAotCQkJCQkgICBGT1JNQVRfRzcxMV9NTEFXX0ZTKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gRzcxMSBkZWNvZGVyLCBleHBlY3RlZCBmcmFtZXMgaXMgYWx3YXlzIDEqLwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9NTEFXX0ZTKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiAlZCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLAotCQkJCQlmaWxlLT5mX21vZGUpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fZzcxMV8lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlhdWRpby0+ZGVudHJ5ID0gY29uZmlnX2RlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoSVNfRVJSX09SX05VTEwoYXVkaW8tPmRlbnRyeSkpCi0JCXByX2RlYnVnKCIlczogZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlwcl9kZWJ1ZygiJXM6IGc3MTFkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKLQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIHJjOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgZzcxMV9jaGFubmVsX21hcCh1OCAqY2hhbm5lbF9tYXBwaW5nLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQl1OCAqbGNoYW5uZWxfbWFwcGluZzsKLQotCWxjaGFubmVsX21hcHBpbmcgPSBjaGFubmVsX21hcHBpbmc7Ci0JcHJfZGVidWcoIiVzOiBjaGFubmVscyBwYXNzZWQ6ICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbHMpOwotCWlmIChjaGFubmVscyA9PSAxKSAgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSAyKSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMykgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNCkgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfQ1M7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA1KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNikgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX0xGRTsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDcpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzRdID0gUENNX0NIQU5ORUxfUlM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9DUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s2XSA9IFBDTV9DSEFOTkVMX0xGRTsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDgpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRkxDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRlJDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX0xTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfUlM7Ci0JCWxjaGFubmVsX21hcHBpbmdbN10gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogRVJST1IudW5zdXBwb3J0ZWQgbnVtX2NoID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19nNzExX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmNvbXBhdF9pb2N0bCA9IGF1ZGlvX2NvbXBhdF9pb2N0bCwKLQkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZzcxMW1sYXdfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2c3MTFtbGF3IiwKLQkuZm9wcyA9ICZhdWRpb19nNzExX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19nNzExbWxhd19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2c3MTFtbGF3X21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fZzcxMW1sYXdfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fZzcxMV93c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fZzcxMV93c19tZ3Iud3NfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9fZzcxMW1sYXdfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYXVkaW9fZzcxMW1sYXdfbWlzYyk7Ci0JbXV0ZXhfZGVzdHJveSgmYXVkaW9fZzcxMV93c19tZ3Iud3NfbG9jayk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19nNzExbWxhd19pbml0KTsKLV9fZXhpdGNhbGwoYXVkaW9fZzcxMW1sYXdfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX2h3YWNjX2VmZmVjdHMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9faHdhY2NfZWZmZWN0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjBiNTE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9faHdhY2NfZWZmZWN0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgInE2YXVkaW9fY29tbW9uLmgiCi0jaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCi0jaW5jbHVkZSA8c291bmQvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuaD4KLQotI2RlZmluZSBNQVhfQ0hBTk5FTFNfU1VQUE9SVEVECQk4Ci0jZGVmaW5lIFdBSVRfVElNRURPVVRfRFVSQVRJT05fU0VDUwkxCi0KLXN0cnVjdCBxNmF1ZGlvX2VmZmVjdHMgewotCXdhaXRfcXVldWVfaGVhZF90CQlyZWFkX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJCXdyaXRlX3dhaXQ7Ci0KLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICAgICAgICAgICAgICphYzsKLQlzdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnICBjb25maWc7Ci0KLQlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOwotCi0JYXRvbWljX3QJCQlpbl9jb3VudDsKLQlhdG9taWNfdAkJCW91dF9jb3VudDsKLQotCWludAkJCQlvcGVuZWQ7Ci0JaW50CQkJCXN0YXJ0ZWQ7Ci0JaW50CQkJCWJ1Zl9hbGxvYzsKLQlzdHJ1Y3QgbXNtX250X2VmZl9hbGxfY29uZmlnIGF1ZGlvX2VmZmVjdHM7Ci19OwotCi1zdGF0aWMgdm9pZCBhdWRpb19lZmZlY3RzX2luaXRfcHAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyBzb2Z0dm9sID0gewotCQkucGVyaW9kID0gU09GVF9WT0xVTUVfUEVSSU9ELAotCQkuc3RlcCA9IFNPRlRfVk9MVU1FX1NURVAsCi0JCS5yYW1waW5nY3VydmUgPSBTT0ZUX1ZPTFVNRV9DVVJWRV9MSU5FQVIsCi0JfTsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IG51bGwgdG8gaW5pdCBwcFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCXJldCA9IHE2YXNtX3NldF9zb2Z0dm9sdW1lX3YyKGFjLCAmc29mdHZvbCwKLQkJCQkgICAgICBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0Vm9sdW1lIFBhcmFtIGZhaWxlZCByZXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZWZmZWN0c19kZWluaXRfcHAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgbnVsbCB0byBkZWluaXQgcHBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZWZmZWN0c19ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCi0JCQkJIHVpbnQzMl90ICpwYXlsb2FkLCAgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzOwotCi0JaWYgKCFwYXlsb2FkIHx8ICFwcml2KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGF0YSB0byBoYW5kbGUgZXZlbnRzLCBwYXlsb2FkOiAlcEssIHByaXY6ICVwS1xuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkLCBwcml2KTsKLQkJcmV0dXJuOwotCX0KLQotCWVmZmVjdHMgPSAoc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqKXByaXY7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6IHsKLQkJYXRvbWljX2luYygmZWZmZWN0cy0+b3V0X2NvdW50KTsKLQkJd2FrZV91cCgmZWZmZWN0cy0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMjogewotCQlhdG9taWNfaW5jKCZlZmZlY3RzLT5pbl9jb3VudCk7Ci0JCXdha2VfdXAoJmVmZmVjdHMtPnJlYWRfd2FpdCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOiB7Ci0JCXByX2RlYnVnKCIlczogQVBSX0JBU0lDX1JTUF9SRVNVTFQgQ21kWzB4JXhdIFN0YXR1c1sweCV4XVxuIiwKLQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCXN3aXRjaCAocGF5bG9hZFswXSkgewotCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI6Ci0JCQlwcl9kZWJ1ZygiQVNNX1NFU1NJT05fQ01EX1JVTl9WMlxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogUGF5bG9hZCA9IFsweCV4XSBzdGF0WzB4JXhdXG4iLAotCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBVbmhhbmRsZWQgRXZlbnQgMHgleCB0b2tlbiA9IDB4JXhcbiIsCi0JCQkgX19mdW5jX18sIG9wY29kZSwgdG9rZW4pOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZWZmZWN0c19zaGFyZWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqZWZmZWN0cyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXByX2RlYnVnKCIlczogQVVESU9fU1RBUlRcbiIsIF9fZnVuY19fKTsKLQotCQltdXRleF9sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZV92MihlZmZlY3RzLT5hYywKLQkJCQkJRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCUZPUk1BVF9NVUxUSV9DSEFOTkVMX0xJTkVBUl9QQ00sCi0JCQkJCWVmZmVjdHMtPmNvbmZpZy5tZXRhX21vZGVfZW5hYmxlZCwKLQkJCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5iaXRzX3Blcl9zYW1wbGUsCi0JCQkJCXRydWUgLypvdmVyd3JpdGUgdG9wb2xvZ3kqLywKLQkJCQkJQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX0hQWF9NQVNURVIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBPcGVuIGZhaWxlZCBmb3IgaHcgYWNjZWxlcmF0ZWQgZWZmZWN0czpyYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJfQotCQllZmZlY3RzLT5vcGVuZWQgPSAxOwotCi0JCXByX2RlYnVnKCIlczogZGVjIGJ1ZiBzaXplOiAlZCwgbnVtX2J1ZjogJWQsIGVuYyBidWYgc2l6ZTogJWQsIG51bV9idWY6ICVkXG4iLAotCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcub3V0cHV0LmJ1Zl9zaXplLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2J1ZiwKLQkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQuYnVmX3NpemUsCi0JCQkgZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9idWYpOwotCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhJTiwgZWZmZWN0cy0+YWMsCi0JCQkJCWVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuYnVmX3NpemUsCi0JCQkJCWVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2J1Zik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IFdyaXRlIGJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJZ290byBpb2N0bF9mYWlsOwotCQl9Ci0JCWF0b21pY19zZXQoJmVmZmVjdHMtPmluX2NvdW50LCBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2J1Zik7Ci0JCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvY19jb250aWd1b3VzKE9VVCwgZWZmZWN0cy0+YWMsCi0JCQkJCWVmZmVjdHMtPmNvbmZpZy5pbnB1dC5idWZfc2l6ZSwKLQkJCQkJZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9idWYpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWFkIGJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJZ290byByZWFkYnVmX2ZhaWw7Ci0JCX0KLQkJYXRvbWljX3NldCgmZWZmZWN0cy0+b3V0X2NvdW50LCBlZmZlY3RzLT5jb25maWcub3V0cHV0Lm51bV9idWYpOwotCQllZmZlY3RzLT5idWZfYWxsb2MgPSAxOwotCi0JCXByX2RlYnVnKCIlczogZW5jOiBzYW1wbGVfcmF0ZTogJWQsIG51bV9jaGFubmVsczogJWRcbiIsCi0JCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5zYW1wbGVfcmF0ZSwKLQkJCWVmZmVjdHMtPmNvbmZpZy5pbnB1dC5udW1fY2hhbm5lbHMpOwotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbShlZmZlY3RzLT5hYywKLQkJCQkJICAgZWZmZWN0cy0+Y29uZmlnLmlucHV0LnNhbXBsZV9yYXRlLAotCQkJCQkgICBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2NoYW5uZWxzKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogcGNtIHJlYWQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gY2ZnX2ZhaWw7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBkZWM6IHNhbXBsZV9yYXRlOiAlZCwgbnVtX2NoYW5uZWxzOiAlZCwgYml0X3dpZHRoOiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5zYW1wbGVfcmF0ZSwKLQkJCWVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2NoYW5uZWxzLAotCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5iaXRzX3Blcl9zYW1wbGUpOwotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnQoCi0JCQkJZWZmZWN0cy0+YWMsIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQuc2FtcGxlX3JhdGUsCi0JCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5udW1fY2hhbm5lbHMsCi0JCQkJZWZmZWN0cy0+Y29uZmlnLm91dHB1dC5iaXRzX3Blcl9zYW1wbGUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBwY20gd3JpdGUgZm9ybWF0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gY2ZnX2ZhaWw7Ci0JCX0KLQotCQlhdWRpb19lZmZlY3RzX2luaXRfcHAoZWZmZWN0cy0+YWMpOwotCi0JCXJjID0gcTZhc21fcnVuKGVmZmVjdHMtPmFjLCAweDAwLCAweDAwLCAweDAwKTsKLQkJaWYgKCFyYykKLQkJCWVmZmVjdHMtPnN0YXJ0ZWQgPSAxOwotCQllbHNlIHsKLQkJCWVmZmVjdHMtPnN0YXJ0ZWQgPSAwOwotCQkJcHJfZXJyKCIlczogQVNNIHJ1biBzdGF0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJfQotCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19FRkZFQ1RTX1dSSVRFOiB7Ci0JCWNoYXIgKmJ1ZnB0ciA9IE5VTEw7Ci0JCXVpbnQzMl90IGlkeCA9IDA7Ci0JCXVpbnQzMl90IHNpemUgPSAwOwotCi0JCW11dGV4X2xvY2soJmVmZmVjdHMtPmxvY2spOwotCi0JCWlmICghZWZmZWN0cy0+c3RhcnRlZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJfQotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGVmZmVjdHMtPndyaXRlX3dhaXQsCi0JCQkJCWF0b21pY19yZWFkKCZlZmZlY3RzLT5vdXRfY291bnQpLAotCQkJCQlXQUlUX1RJTUVET1VUX0RVUkFUSU9OX1NFQ1MgKiBIWik7Ci0JCWlmICghcmMpIHsKLQkJCXByX2VycigiJXM6IHdyaXRlIHdhaXRfZXZlbnRfdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJIG11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCQlnb3RvIGlvY3RsX2ZhaWw7Ci0JCX0KLQkJaWYgKCFhdG9taWNfcmVhZCgmZWZmZWN0cy0+b3V0X2NvdW50KSkgewotCQkJcHJfZXJyKCIlczogcGNtIHN0b3BwZWQgb3V0X2NvdW50IDBcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCQlnb3RvIGlvY3RsX2ZhaWw7Ci0JCX0KLQotCQlidWZwdHIgPSBxNmFzbV9pc19jcHVfYnVmX2F2YWlsKElOLCBlZmZlY3RzLT5hYywgJnNpemUsICZpZHgpOwotCQlpZiAoYnVmcHRyKSB7Ci0JCQlpZiAoKGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4gPiBzaXplKSB8fAotCQkJCWNvcHlfZnJvbV91c2VyKGJ1ZnB0ciwgKHZvaWQgKilhcmcsCi0JCQkJCWVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4pKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCW11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCQkJZ290byBpb2N0bF9mYWlsOwotCQkJfQotCQkJcmMgPSBxNmFzbV93cml0ZShlZmZlY3RzLT5hYywKLQkJCQkJIGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4sCi0JCQkJCSAwLCAwLCBOT19USU1FU1RBTVApOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJCX0KLQkJCWF0b21pY19kZWMoJmVmZmVjdHMtPm91dF9jb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBBVURJT19FRkZFQ1RTX1dSSVRFOiBCdWZmZXIgZHJvcHBlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRUZGRUNUU19SRUFEOiB7Ci0JCWNoYXIgKmJ1ZnB0ciA9IE5VTEw7Ci0JCXVpbnQzMl90IGlkeCA9IDA7Ci0JCXVpbnQzMl90IHNpemUgPSAwOwotCi0JCW11dGV4X2xvY2soJmVmZmVjdHMtPmxvY2spOwotCi0JCWlmICghZWZmZWN0cy0+c3RhcnRlZCkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJfQotCi0JCWF0b21pY19zZXQoJmVmZmVjdHMtPmluX2NvdW50LCAwKTsKLQotCQlxNmFzbV9yZWFkX3YyKGVmZmVjdHMtPmFjLCBlZmZlY3RzLT5jb25maWcuYnVmX2NmZy5pbnB1dF9sZW4pOwotCQkvKiBSZWFkIG1pZ2h0IGZhaWwgaW5pdGlhbGx5LCBkb24ndCBlcnJvciBvdXQgKi8KLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZWZmZWN0cy0+cmVhZF93YWl0LAotCQkJCQlhdG9taWNfcmVhZCgmZWZmZWN0cy0+aW5fY291bnQpLAotCQkJCQlXQUlUX1RJTUVET1VUX0RVUkFUSU9OX1NFQ1MgKiBIWik7Ci0JCWlmICghcmMpIHsKLQkJCXByX2VycigiJXM6IHJlYWQgd2FpdF9ldmVudF90aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJZ290byBpb2N0bF9mYWlsOwotCQl9Ci0JCWlmICghYXRvbWljX3JlYWQoJmVmZmVjdHMtPmluX2NvdW50KSkgewotCQkJcHJfZXJyKCIlczogcGNtIHN0b3BwZWQgaW5fY291bnQgMFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJfQotCi0JCWJ1ZnB0ciA9IHE2YXNtX2lzX2NwdV9idWZfYXZhaWwoT1VULCBlZmZlY3RzLT5hYywgJnNpemUsICZpZHgpOwotCQlpZiAoYnVmcHRyKSB7Ci0JCQlpZiAoISgodm9pZCAqKWFyZykpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCQlnb3RvIGlvY3RsX2ZhaWw7Ci0JCQl9Ci0JCQlpZiAoKGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLmlucHV0X2xlbiA+IHNpemUpIHx8Ci0JCQkJY29weV90b191c2VyKCh2b2lkICopYXJnLCBidWZwdHIsCi0JCQkJCSAgZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcuaW5wdXRfbGVuKSkgewotCQkJCXJjID0gLUVGQVVMVDsKLQkJCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJCWdvdG8gaW9jdGxfZmFpbDsKLQkJCX0KLQkJfQotCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBlZmZlY3RzIGNvbmZpZyBtb2R1bGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci1pb2N0bF9mYWlsOgotCXJldHVybiByYzsKLXJlYWRidWZfZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhJTiwKLQkJCQkJZWZmZWN0cy0+YWMpOwotCXJldHVybiByYzsKLWNmZ19mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKElOLAotCQkJCQllZmZlY3RzLT5hYyk7Ci0JcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoT1VULAotCQkJCQllZmZlY3RzLT5hYyk7Ci0JZWZmZWN0cy0+YnVmX2FsbG9jID0gMDsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2VmZmVjdHNfc2V0X3BwX3BhcmFtKHN0cnVjdCBxNmF1ZGlvX2VmZmVjdHMgKmVmZmVjdHMsCi0JCQkJbG9uZyAqdmFsdWVzKQotewotCWludCByYyA9IDA7Ci0JaW50IGVmZmVjdHNfbW9kdWxlID0gdmFsdWVzWzBdOwotCi0Jc3dpdGNoIChlZmZlY3RzX21vZHVsZSkgewotCWNhc2UgVklSVFVBTElaRVJfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IFZJUlRVQUxJWkVSX01PRFVMRVxuIiwgX19mdW5jX18pOwotCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKAotCQkJZWZmZWN0c19tb2R1bGUsIGVmZmVjdHMtPmFjLT50b3BvbG9neSkpCi0JCQltc21fYXVkaW9fZWZmZWN0c192aXJ0dWFsaXplcl9oYW5kbGVyKAotCQkJCWVmZmVjdHMtPmFjLAotCQkJCSYoZWZmZWN0cy0+YXVkaW9fZWZmZWN0cy52aXJ0dWFsaXplciksCi0JCQkJKGxvbmcgKikmdmFsdWVzWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRVZFUkJfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKG1zbV9hdWRpb19lZmZlY3RzX2lzX2VmZm1vZHVsZV9zdXBwX2luX3RvcCgKLQkJCWVmZmVjdHNfbW9kdWxlLCBlZmZlY3RzLT5hYy0+dG9wb2xvZ3kpKQotCQkJbXNtX2F1ZGlvX2VmZmVjdHNfcmV2ZXJiX2hhbmRsZXIoZWZmZWN0cy0+YWMsCi0JCQkJICYoZWZmZWN0cy0+YXVkaW9fZWZmZWN0cy5yZXZlcmIpLAotCQkJCSAobG9uZyAqKSZ2YWx1ZXNbMV0pOwotCQlicmVhazsKLQljYXNlIEJBU1NfQk9PU1RfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IEJBU1NfQk9PU1RfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoCi0JCQllZmZlY3RzX21vZHVsZSwgZWZmZWN0cy0+YWMtPnRvcG9sb2d5KSkKLQkJCW1zbV9hdWRpb19lZmZlY3RzX2Jhc3NfYm9vc3RfaGFuZGxlcigKLQkJCQllZmZlY3RzLT5hYywKLQkJCQkmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMuYmFzc19ib29zdCksCi0JCQkJKGxvbmcgKikmdmFsdWVzWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBQQkVfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IFBCRV9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKG1zbV9hdWRpb19lZmZlY3RzX2lzX2VmZm1vZHVsZV9zdXBwX2luX3RvcCgKLQkJCWVmZmVjdHNfbW9kdWxlLCBlZmZlY3RzLT5hYy0+dG9wb2xvZ3kpKQotCQkJbXNtX2F1ZGlvX2VmZmVjdHNfcGJlX2hhbmRsZXIoCi0JCQkJZWZmZWN0cy0+YWMsCi0JCQkJJihlZmZlY3RzLT5hdWRpb19lZmZlY3RzLnBiZSksCi0JCQkJKGxvbmcgKikmdmFsdWVzWzFdKTsKLQkJYnJlYWs7Ci0JY2FzZSBFUV9NT0RVTEU6Ci0JCXByX2RlYnVnKCIlczogRVFfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoCi0JCQllZmZlY3RzX21vZHVsZSwgZWZmZWN0cy0+YWMtPnRvcG9sb2d5KSkKLQkJCW1zbV9hdWRpb19lZmZlY3RzX3BvcGxlc3NfZXFfaGFuZGxlcigKLQkJCQllZmZlY3RzLT5hYywKLQkJCQkmKGVmZmVjdHMtPmF1ZGlvX2VmZmVjdHMuZXF1YWxpemVyKSwKLQkJCQkobG9uZyAqKSZ2YWx1ZXNbMV0pOwotCQlicmVhazsKLQljYXNlIFNPRlRfVk9MVU1FX01PRFVMRToKLQkJcHJfZGVidWcoIiVzOiBTQSBQTFVTIFZPTFVNRV9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJbXNtX2F1ZGlvX2VmZmVjdHNfdm9sdW1lX2hhbmRsZXJfdjIoZWZmZWN0cy0+YWMsCi0JCQkJJihlZmZlY3RzLT5hdWRpb19lZmZlY3RzLnNhcGx1c192b2wpLAotCQkJCShsb25nICopJnZhbHVlc1sxXSwgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMSk7Ci0JCWJyZWFrOwotCWNhc2UgU09GVF9WT0xVTUUyX01PRFVMRToKLQkJcHJfZGVidWcoIiVzOiBUT1BPTE9HWSBTV0lUQ0ggVk9MVU1FIE1PRFVMRVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoCi0JCQllZmZlY3RzX21vZHVsZSwgZWZmZWN0cy0+YWMtPnRvcG9sb2d5KSkKLQkJCW1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyX3YyKGVmZmVjdHMtPmFjLAotCQkJICAgICAgJihlZmZlY3RzLT5hdWRpb19lZmZlY3RzLnRvcG9fc3dpdGNoX3ZvbCksCi0JCQkgICAgICAobG9uZyAqKSZ2YWx1ZXNbMV0sIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGVmZmVjdHMgY29uZmlnIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fZWZmZWN0c19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0JbG9uZyBhcmd2YWx1ZXNbTUFYX1BQX1BBUkFNU19TWl0gPSB7MH07Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHOiB7Ci0JCXByX2RlYnVnKCIlczogQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHXG4iLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X2xvY2soJmVmZmVjdHMtPmxvY2spOwotCQltZW1zZXQoJmVmZmVjdHMtPmNvbmZpZywgMCwgc2l6ZW9mKGVmZmVjdHMtPmNvbmZpZykpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVmZmVjdHMtPmNvbmZpZywgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKGVmZmVjdHMtPmNvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmb3IgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiB3cml0ZSBidWZfc2l6ZTogJWQsIG51bV9idWY6ICVkLCBzYW1wbGVfcmF0ZTogJWQsIGNoYW5uZWw6ICVkXG4iLAotCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcub3V0cHV0LmJ1Zl9zaXplLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2J1ZiwKLQkJCSBlZmZlY3RzLT5jb25maWcub3V0cHV0LnNhbXBsZV9yYXRlLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2NoYW5uZWxzKTsKLQkJcHJfZGVidWcoIiVzOiByZWFkIGJ1Zl9zaXplOiAlZCwgbnVtX2J1ZjogJWQsIHNhbXBsZV9yYXRlOiAlZCwgY2hhbm5lbDogJWRcbiIsCi0JCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5idWZfc2l6ZSwKLQkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQubnVtX2J1ZiwKLQkJCSBlZmZlY3RzLT5jb25maWcuaW5wdXQuc2FtcGxlX3JhdGUsCi0JCQkgZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9jaGFubmVscyk7Ci0JCW11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU46IHsKLQkJbXV0ZXhfbG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcsICh2b2lkICopYXJnLAotCQkJCSAgIHNpemVvZihlZmZlY3RzLT5jb25maWcuYnVmX2NmZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmb3IgQVVESU9fRUZGRUNUU19TRVRfQlVGX0xFTiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCXByX2RlYnVnKCIlczogd3JpdGUgYnVmIGxlbjogJWQsIHJlYWQgYnVmIGxlbjogJWRcbiIsCi0JCQkgX19mdW5jX18sIGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLm91dHB1dF9sZW4sCi0JCQkgZWZmZWN0cy0+Y29uZmlnLmJ1Zl9jZmcuaW5wdXRfbGVuKTsKLQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRUZGRUNUU19HRVRfQlVGX0FWQUlMOiB7Ci0JCXN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsIGJ1Zl9hdmFpbDsKLQotCQlidWZfYXZhaWwuaW5wdXRfbnVtX2F2YWlsID0gYXRvbWljX3JlYWQoJmVmZmVjdHMtPmluX2NvdW50KTsKLQkJYnVmX2F2YWlsLm91dHB1dF9udW1fYXZhaWwgPSBhdG9taWNfcmVhZCgmZWZmZWN0cy0+b3V0X2NvdW50KTsKLQkJbXV0ZXhfbG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCXByX2RlYnVnKCIlczogd3JpdGUgYnVmIGF2YWlsOiAlZCwgcmVhZCBidWYgYXZhaWw6ICVkXG4iLAotCQkJIF9fZnVuY19fLCBidWZfYXZhaWwub3V0cHV0X251bV9hdmFpbCwKLQkJCSBidWZfYXZhaWwuaW5wdXRfbnVtX2F2YWlsKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmJ1Zl9hdmFpbCwKLQkJCQkgICBzaXplb2YoYnVmX2F2YWlsKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmb3IgQVVESU9fRUZGRUNUU19HRVRfTlVNX0JVRl9BVkFJTCBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCW11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0VGRkVDVFNfU0VUX1BQX1BBUkFNUzogewotCQltdXRleF9sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGFyZ3ZhbHVlcywgKHZvaWQgKilhcmcsCi0JCQkJICAgTUFYX1BQX1BBUkFNU19TWipzaXplb2YobG9uZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmb3IgcHAgcGFyYW1zIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJcmMgPSBhdWRpb19lZmZlY3RzX3NldF9wcF9wYXJhbShlZmZlY3RzLCBhcmd2YWx1ZXMpOwotCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBDYWxsaW5nIHNoYXJlZCBpb2N0bFxuIiwgX19mdW5jX18pOwotCQlyYyA9IGF1ZGlvX2VmZmVjdHNfc2hhcmVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWlmIChyYykKLQkJcHJfZXJyKCIlczogY21kIDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2h3YWNjX2RhdGFfY29uZmlnMzIgewotCV9fdTMyIGJ1Zl9zaXplOwotCV9fdTMyIG51bV9idWY7Ci0JX191MzIgbnVtX2NoYW5uZWxzOwotCV9fdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxTX1NVUFBPUlRFRF07Ci0JX191MzIgc2FtcGxlX3JhdGU7Ci0JX191MzIgYml0c19wZXJfc2FtcGxlOwotfTsKLQotc3RydWN0IG1zbV9od2FjY19idWZfY2ZnMzIgewotCV9fdTMyIGlucHV0X2xlbjsKLQlfX3UzMiBvdXRwdXRfbGVuOwotfTsKLQotc3RydWN0IG1zbV9od2FjY19idWZfYXZhaWwzMiB7Ci0JX191MzIgaW5wdXRfbnVtX2F2YWlsOwotCV9fdTMyIG91dHB1dF9udW1fYXZhaWw7Ci19OwotCi1zdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnMzIgewotCXN0cnVjdCBtc21faHdhY2NfZGF0YV9jb25maWczMiBpbnB1dDsKLQlzdHJ1Y3QgbXNtX2h3YWNjX2RhdGFfY29uZmlnMzIgb3V0cHV0OwotCXN0cnVjdCBtc21faHdhY2NfYnVmX2NmZzMyIGJ1Zl9jZmc7Ci0JX191MzIgbWV0YV9tb2RlX2VuYWJsZWQ7Ci0JX191MzIgb3ZlcndyaXRlX3RvcG9sb2d5OwotCV9fczMyIHRvcG9sb2d5OwotfTsKLQotZW51bSB7Ci0JQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5OSwKLQkJCQkJICBzdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnMzIpLAotCUFVRElPX0VGRkVDVFNfU0VUX0JVRl9MRU4zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMCwKLQkJCQkJICAgc3RydWN0IG1zbV9od2FjY19idWZfY2ZnMzIpLAotCUFVRElPX0VGRkVDVFNfR0VUX0JVRl9BVkFJTDMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTAxLAotCQkJCQkgICAgIHN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsMzIpLAotCUFVRElPX0VGRkVDVFNfV1JJVEUzMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMiwgY29tcGF0X3VwdHJfdCksCi0JQVVESU9fRUZGRUNUU19SRUFEMzIgPSBfSU9XUihBVURJT19JT0NUTF9NQUdJQywgMTAzLCBjb21wYXRfdXB0cl90KSwKLQlBVURJT19FRkZFQ1RTX1NFVF9QUF9QQVJBTVMzMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwNCwKLQkJCQkJICAgY29tcGF0X3VwdHJfdCksCi0JQVVESU9fU1RBUlQzMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDAsIHVuc2lnbmVkIGludCksCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19lZmZlY3RzX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqZWZmZWN0cyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwLCBpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NFVF9FRkZFQ1RTX0NPTkZJRzMyOiB7Ci0JCXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWczMiBjb25maWczMjsKLQkJc3RydWN0IG1zbV9od2FjY19lZmZlY3RzX2NvbmZpZyAqY29uZmlnID0gJmVmZmVjdHMtPmNvbmZpZzsKLQotCQltdXRleF9sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJbWVtc2V0KCZlZmZlY3RzLT5jb25maWcsIDAsIHNpemVvZihlZmZlY3RzLT5jb25maWcpKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25maWczMiwgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKGNvbmZpZzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmb3IgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJY29uZmlnLT5pbnB1dC5idWZfc2l6ZSA9IGNvbmZpZzMyLmlucHV0LmJ1Zl9zaXplOwotCQljb25maWctPmlucHV0Lm51bV9idWYgPSBjb25maWczMi5pbnB1dC5udW1fYnVmOwotCQljb25maWctPmlucHV0Lm51bV9jaGFubmVscyA9IGNvbmZpZzMyLmlucHV0Lm51bV9jaGFubmVsczsKLQkJY29uZmlnLT5pbnB1dC5zYW1wbGVfcmF0ZSA9IGNvbmZpZzMyLmlucHV0LnNhbXBsZV9yYXRlOwotCQljb25maWctPmlucHV0LmJpdHNfcGVyX3NhbXBsZSA9IGNvbmZpZzMyLmlucHV0LmJpdHNfcGVyX3NhbXBsZTsKLQkJY29uZmlnLT5pbnB1dC5idWZfc2l6ZSA9IGNvbmZpZzMyLmlucHV0LmJ1Zl9zaXplOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTX1NVUFBPUlRFRDsgaSsrKQotCQkJY29uZmlnLT5pbnB1dC5jaGFubmVsX21hcFtpXSA9Ci0JCQkJCQljb25maWczMi5pbnB1dC5jaGFubmVsX21hcFtpXTsKLQkJY29uZmlnLT5vdXRwdXQuYnVmX3NpemUgPSBjb25maWczMi5vdXRwdXQuYnVmX3NpemU7Ci0JCWNvbmZpZy0+b3V0cHV0Lm51bV9idWYgPSBjb25maWczMi5vdXRwdXQubnVtX2J1ZjsKLQkJY29uZmlnLT5vdXRwdXQubnVtX2NoYW5uZWxzID0gY29uZmlnMzIub3V0cHV0Lm51bV9jaGFubmVsczsKLQkJY29uZmlnLT5vdXRwdXQuc2FtcGxlX3JhdGUgPSBjb25maWczMi5vdXRwdXQuc2FtcGxlX3JhdGU7Ci0JCWNvbmZpZy0+b3V0cHV0LmJpdHNfcGVyX3NhbXBsZSA9Ci0JCQkJCSBjb25maWczMi5vdXRwdXQuYml0c19wZXJfc2FtcGxlOwotCQljb25maWctPm91dHB1dC5idWZfc2l6ZSA9IGNvbmZpZzMyLm91dHB1dC5idWZfc2l6ZTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOTkVMU19TVVBQT1JURUQ7IGkrKykKLQkJCWNvbmZpZy0+b3V0cHV0LmNoYW5uZWxfbWFwW2ldID0KLQkJCQkJCWNvbmZpZzMyLm91dHB1dC5jaGFubmVsX21hcFtpXTsKLQkJY29uZmlnLT5idWZfY2ZnLmlucHV0X2xlbiA9IGNvbmZpZzMyLmJ1Zl9jZmcuaW5wdXRfbGVuOwotCQljb25maWctPmJ1Zl9jZmcub3V0cHV0X2xlbiA9IGNvbmZpZzMyLmJ1Zl9jZmcub3V0cHV0X2xlbjsKLQkJY29uZmlnLT5tZXRhX21vZGVfZW5hYmxlZCA9IGNvbmZpZzMyLm1ldGFfbW9kZV9lbmFibGVkOwotCQljb25maWctPm92ZXJ3cml0ZV90b3BvbG9neSA9IGNvbmZpZzMyLm92ZXJ3cml0ZV90b3BvbG9neTsKLQkJY29uZmlnLT50b3BvbG9neSA9IGNvbmZpZzMyLnRvcG9sb2d5OwotCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1Zl9zaXplOiAlZCwgbnVtX2J1ZjogJWQsIHNhbXBsZV9yYXRlOiAlZCwgY2hhbm5lbHM6ICVkXG4iLAotCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcub3V0cHV0LmJ1Zl9zaXplLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2J1ZiwKLQkJCSBlZmZlY3RzLT5jb25maWcub3V0cHV0LnNhbXBsZV9yYXRlLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5vdXRwdXQubnVtX2NoYW5uZWxzKTsKLQkJcHJfZGVidWcoIiVzOiByZWFkIGJ1Zl9zaXplOiAlZCwgbnVtX2J1ZjogJWQsIHNhbXBsZV9yYXRlOiAlZCwgY2hhbm5lbHM6ICVkXG4iLAotCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcuaW5wdXQuYnVmX3NpemUsCi0JCQkgZWZmZWN0cy0+Y29uZmlnLmlucHV0Lm51bV9idWYsCi0JCQkgZWZmZWN0cy0+Y29uZmlnLmlucHV0LnNhbXBsZV9yYXRlLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5pbnB1dC5udW1fY2hhbm5lbHMpOwotCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19FRkZFQ1RTX1NFVF9CVUZfTEVOMzI6IHsKLQkJc3RydWN0IG1zbV9od2FjY19idWZfY2ZnMzIgYnVmX2NmZzMyOwotCQlzdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnICpjb25maWcgPSAmZWZmZWN0cy0+Y29uZmlnOwotCi0JCW11dGV4X2xvY2soJmVmZmVjdHMtPmxvY2spOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9jZmczMiwgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKGJ1Zl9jZmczMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmb3IgQVVESU9fRUZGRUNUU19TRVRfQlVGX0xFTiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNvbmZpZy0+YnVmX2NmZy5pbnB1dF9sZW4gPSBidWZfY2ZnMzIuaW5wdXRfbGVuOwotCQljb25maWctPmJ1Zl9jZmcub3V0cHV0X2xlbiA9IGJ1Zl9jZmczMi5vdXRwdXRfbGVuOwotCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1ZiBsZW46ICVkLCByZWFkIGJ1ZiBsZW46ICVkXG4iLAotCQkJIF9fZnVuY19fLCBlZmZlY3RzLT5jb25maWcuYnVmX2NmZy5vdXRwdXRfbGVuLAotCQkJIGVmZmVjdHMtPmNvbmZpZy5idWZfY2ZnLmlucHV0X2xlbik7Ci0JCW11dGV4X3VubG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0VGRkVDVFNfR0VUX0JVRl9BVkFJTDMyOiB7Ci0JCXN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsMzIgYnVmX2F2YWlsOwotCi0JCW1lbXNldCgmYnVmX2F2YWlsLCAwLCBzaXplb2YoYnVmX2F2YWlsKSk7Ci0KLQkJbXV0ZXhfbG9jaygmZWZmZWN0cy0+bG9jayk7Ci0JCWJ1Zl9hdmFpbC5pbnB1dF9udW1fYXZhaWwgPSBhdG9taWNfcmVhZCgmZWZmZWN0cy0+aW5fY291bnQpOwotCQlidWZfYXZhaWwub3V0cHV0X251bV9hdmFpbCA9IGF0b21pY19yZWFkKCZlZmZlY3RzLT5vdXRfY291bnQpOwotCQlwcl9kZWJ1ZygiJXM6IHdyaXRlIGJ1ZiBhdmFpbDogJWQsIHJlYWQgYnVmIGF2YWlsOiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgYnVmX2F2YWlsLm91dHB1dF9udW1fYXZhaWwsCi0JCQkgYnVmX2F2YWlsLmlucHV0X251bV9hdmFpbCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZidWZfYXZhaWwsCi0JCQkJICAgc2l6ZW9mKGJ1Zl9hdmFpbCkpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IHRvIHVzZXIgZm9yIEFVRElPX0VGRkVDVFNfR0VUX05VTV9CVUZfQVZBSUwgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19FRkZFQ1RTX1NFVF9QUF9QQVJBTVMzMjogewotCQlsb25nIGFyZ3ZhbHVlc1tNQVhfUFBfUEFSQU1TX1NaXSA9IHswfTsKLQkJaW50IGFyZ3ZhbHVlczMyW01BWF9QUF9QQVJBTVNfU1pdID0gezB9OwotCi0JCW11dGV4X2xvY2soJmVmZmVjdHMtPmxvY2spOwotCQlpZiAoY29weV9mcm9tX3VzZXIoYXJndmFsdWVzMzIsICh2b2lkICopYXJnLAotCQkJCSAgIE1BWF9QUF9QQVJBTVNfU1oqc2l6ZW9mKGludCkpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQgZm9yIHBwIHBhcmFtc1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJmVmZmVjdHMtPmxvY2spOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9QUF9QQVJBTVNfU1o7IGkrKykKLQkJCWFyZ3ZhbHVlc1tpXSA9IGFyZ3ZhbHVlczMyW2ldOwotCi0JCXJjID0gYXVkaW9fZWZmZWN0c19zZXRfcHBfcGFyYW0oZWZmZWN0cywgYXJndmFsdWVzKTsKLQkJbXV0ZXhfdW5sb2NrKCZlZmZlY3RzLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RBUlQzMjogewotCQlyYyA9IGF1ZGlvX2VmZmVjdHNfc2hhcmVkX2lvY3RsKGZpbGUsIEFVRElPX1NUQVJULCBhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19FRkZFQ1RTX1dSSVRFMzI6IHsKLQkJcmMgPSBhdWRpb19lZmZlY3RzX3NoYXJlZF9pb2N0bChmaWxlLCBBVURJT19FRkZFQ1RTX1dSSVRFLCBhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19FRkZFQ1RTX1JFQUQzMjogewotCQlyYyA9IGF1ZGlvX2VmZmVjdHNfc2hhcmVkX2lvY3RsKGZpbGUsIEFVRElPX0VGRkVDVFNfUkVBRCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIGlvY3RsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGF1ZGlvX2VmZmVjdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19lZmZlY3RzICplZmZlY3RzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWVmZmVjdHMpIHsKLQkJcHJfZXJyKCIlczogZWZmZWN0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChlZmZlY3RzLT5vcGVuZWQpIHsKLQkJcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoZWZmZWN0cy0+d3JpdGVfd2FpdCwKLQkJCQkJYXRvbWljX3JlYWQoJmVmZmVjdHMtPm91dF9jb3VudCksCi0JCQkJCVdBSVRfVElNRURPVVRfRFVSQVRJT05fU0VDUyAqIEhaKTsKLQkJaWYgKCFyYykKLQkJCXByX2VycigiJXM6IHdyaXRlIHdhaXRfZXZlbnRfdGltZW91dCBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChlZmZlY3RzLT5yZWFkX3dhaXQsCi0JCQkJCWF0b21pY19yZWFkKCZlZmZlY3RzLT5pbl9jb3VudCksCi0JCQkJCVdBSVRfVElNRURPVVRfRFVSQVRJT05fU0VDUyAqIEhaKTsKLQkJaWYgKCFyYykKLQkJCXByX2VycigiJXM6IHJlYWQgd2FpdF9ldmVudF90aW1lb3V0IGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJjID0gcTZhc21fY21kKGVmZmVjdHMtPmFjLCBDTURfQ0xPU0UpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlc1slcEtdOkZhaWxlZCB0byBjbG9zZSB0aGUgc2Vzc2lvbiByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgZWZmZWN0cywgcmMpOwotCQllZmZlY3RzLT5vcGVuZWQgPSAwOwotCQllZmZlY3RzLT5zdGFydGVkID0gMDsKLQotCQlhdWRpb19lZmZlY3RzX2RlaW5pdF9wcChlZmZlY3RzLT5hYyk7Ci0JfQotCi0JaWYgKGVmZmVjdHMtPmJ1Zl9hbGxvYykgewotCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhJTiwgZWZmZWN0cy0+YWMpOwotCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhPVVQsIGVmZmVjdHMtPmFjKTsKLQl9Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoZWZmZWN0cy0+YWMpOwotCi0JbXV0ZXhfZGVzdHJveSgmZWZmZWN0cy0+bG9jayk7Ci0Ja2ZyZWUoZWZmZWN0cyk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNsb3NlIHNlc3Npb24gc3VjY2Vzc1xuIiwgX19mdW5jX18pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19lZmZlY3RzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fZWZmZWN0cyAqZWZmZWN0czsKLQlpbnQgcmMgPSAwOwotCi0JZWZmZWN0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2VmZmVjdHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVmZmVjdHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZWZmZWN0cy0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCi0JCQkJCShhcHBfY2IpYXVkaW9fZWZmZWN0c19ldmVudF9oYW5kbGVyLAotCQkJCQkodm9pZCAqKWVmZmVjdHMpOwotCWlmICghZWZmZWN0cy0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJX19mdW5jX18pOwotCQlrZnJlZShlZmZlY3RzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZWZmZWN0cy0+cmVhZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlZmZlY3RzLT53cml0ZV93YWl0KTsKLQltdXRleF9pbml0KCZlZmZlY3RzLT5sb2NrKTsKLQotCWVmZmVjdHMtPm9wZW5lZCA9IDA7Ci0JZWZmZWN0cy0+c3RhcnRlZCA9IDA7Ci0JZWZmZWN0cy0+YnVmX2FsbG9jID0gMDsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBlZmZlY3RzOwotCXByX2RlYnVnKCIlczogb3BlbiBzZXNzaW9uIHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2VmZmVjdHNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX2VmZmVjdHNfb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2VmZmVjdHNfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19lZmZlY3RzX2lvY3RsLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuY29tcGF0X2lvY3RsID0gYXVkaW9fZWZmZWN0c19jb21wYXRfaW9jdGwsCi0jZW5kaWYKLX07Ci0KLXN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX2VmZmVjdHNfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX2h3ZWZmZWN0cyIsCi0JLmZvcHMgPSAmYXVkaW9fZWZmZWN0c19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fZWZmZWN0c19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2VmZmVjdHNfbWlzYyk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19lZmZlY3RzX2luaXQpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBdWRpbyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBlZmZlY3RzIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tcDMuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fbXAzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTBjN2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tcDMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKiBtcDMgYXVkaW8gb3V0cHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXVkaW9fdXRpbHNfYWlvLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19tcDNfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX21wM193c19tZ3I7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX21wM19kZWJ1Z19mb3BzID0gewotCS5yZWFkID0gYXVkaW9fYWlvX2RlYnVnX3JlYWQsCi0JLm9wZW4gPSBhdWRpb19haW9fZGVidWdfb3BlbiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLwotCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAotCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlyYyA9IGVuYWJsZV92b2x1bWVfcmFtcChhdWRpbyk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGVuYWJsZSB2b2x1bWUgcmFtcFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJfQotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9pbmZvKCIlczogQVVESU9fU1RBUlQgc2Vzc2lvbmlkWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCQkJYXVkaW8tPmVuYWJsZWQpOwotCQlpZiAoYXVkaW8tPnN0b3BwZWQgPT0gMSkKLQkJCWF1ZGlvLT5zdG9wcGVkID0gMDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV9tcDNfIiArIDVdOwotI2VuZGlmCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19tcDNfbWlzYzsKLQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKLQlhdWRpby0+YXVkaW9fd3NfbWdyID0gJmF1ZGlvX21wM193c19tZ3I7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCi0JCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQkJICAgRk9STUFUX01QMyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJLyogb3BlbiBNUDMgZGVjb2RlciwgZXhwZWN0ZWQgZnJhbWVzIGlzIGFsd2F5cyAxCi0JCSAqIGF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQkJICovCi0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTVAzKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fbXAzXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCQkgICAgTlVMTCwgKHZvaWQgKilhdWRpbywKLQkJCQkJICAgICZhdWRpb19tcDNfZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0JcHJfaW5mbygiJXM6bXAzZGVjIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+ZmVlZGJhY2ssCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCXJldHVybiByYzsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19tcDNfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fbXAzX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV9tcDMiLAotCS5mb3BzID0gJmF1ZGlvX21wM19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fbXAzX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fbXAzX21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fbXAzX21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX21wM193c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fbXAzX3dzX21nci53c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19tcDNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX211bHRpX2FhYy5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tdWx0aV9hYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjM2RjNWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19tdWx0aV9hYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKiBhYWMgYXVkaW8gb3V0cHV0IGRldmljZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2FhYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPHNvYy9xY29tL3NvY2luZm8uaD4KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotI2RlZmluZSBBVURJT19BQUNfRFVBTF9NT05PX0lOVkFMSUQgLTEKLQotCi0vKiBEZWZhdWx0IG51bWJlciBvZiBwcmUtYWxsb2NhdGVkIGV2ZW50IHBhY2tldHMgKi8KLSNkZWZpbmUgUENNX0JVRlNaX01JTl9BQUNNCSgoOCoxMDI0KSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfb3V0KSkKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19tdWx0aWFhY19taXNjOwotc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fbXVsdGlhYWNfd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19hYWNfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJCXZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJc3RydWN0IGFzbV9hYWNfY2ZnIGFhY19jZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqYWFjX2NvbmZpZzsKLQkJdWludDMyX3Qgc2JyX3BzID0gMHgwMDsKLQotCQlhYWNfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gVFVOTkVMX01PREUpIHsKLQkJCWFhY19jZmcuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQkJCWFhY19jZmcuY2hfY2ZnID0gYWFjX2NvbmZpZy0+Y2hhbm5lbF9jb25maWd1cmF0aW9uOwotCQl9IGVsc2UgewotCQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSA9ICBhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZTsKLQkJCWFhY19jZmcuY2hfY2ZnID0gYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLwotCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fbmF0aXZlKGF1ZGlvLT5hYywKLQkJCQlhYWNfY2ZnLnNhbXBsZV9yYXRlLAotCQkJCWFhY19jZmcuY2hfY2ZnKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoInBjbSBvdXRwdXQgYmxvY2sgY29uZmlnIGZhaWxlZFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogdHVybiBvbiBib3RoIHNiciBhbmQgcHMgKi8KLQkJcmMgPSBxNmFzbV9lbmFibGVfc2JycHMoYXVkaW8tPmFjLCBzYnJfcHMpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCJzYnItcHMgZW5hYmxlIGZhaWxlZFxuIik7Ci0JCWlmIChhYWNfY29uZmlnLT5zYnJfcHNfb25fZmxhZykKLQkJCWFhY19jZmcuYW90ID0gQUFDX0VOQ19NT0RFX0VBQUNfUDsKLQkJZWxzZSBpZiAoYWFjX2NvbmZpZy0+c2JyX29uX2ZsYWcpCi0JCQlhYWNfY2ZnLmFvdCA9IEFBQ19FTkNfTU9ERV9BQUNfUDsKLQkJZWxzZQotCQkJYWFjX2NmZy5hb3QgPSBBQUNfRU5DX01PREVfQUFDX0xDOwotCi0JCXN3aXRjaCAoYWFjX2NvbmZpZy0+Zm9ybWF0KSB7Ci0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9BRFRTOgotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9MT0FTOgotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9BRElGOgotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgQVVESU9fQUFDX0ZPUk1BVF9SQVc6Ci0JCQlhYWNfY2ZnLmZvcm1hdCA9IDB4MDM7Ci0JCX0KLQkJYWFjX2NmZy5lcF9jb25maWcgPSBhYWNfY29uZmlnLT5lcF9jb25maWc7Ci0JCWFhY19jZmcuc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2UgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jZmcuc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlID0KLQkJCWFhY19jb25maWctPmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NmZy5zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2UgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCi0JCXByX2RlYnVnKCIlczpmb3JtYXQ9JXggYW90PSVkICBjaD0lZCBzcj0lZFxuIiwKLQkJCV9fZnVuY19fLCBhYWNfY2ZnLmZvcm1hdCwKLQkJCWFhY19jZmcuYW90LCBhYWNfY2ZnLmNoX2NmZywKLQkJCWFhY19jZmcuc2FtcGxlX3JhdGUpOwotCi0JCS8qIENvbmZpZ3VyZSBNZWRpYSBmb3JtYXQgYmxvY2sgKi8KLQkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKGF1ZGlvLT5hYywgJmFhY19jZmcpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoImNtZCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gcTZhc21fc2V0X2VuY2RlY19jaGFuX21hcChhdWRpby0+YWMsIDIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBjbWQgc2V0IGVuY2RlY19jaGFuX21hcCBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2luZm8oIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uaWRbJWRdZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJCQlhdWRpby0+ZW5hYmxlZCk7Ci0JCWlmIChhdWRpby0+c3RvcHBlZCA9PSAxKQotCQkJYXVkaW8tPnN0b3BwZWQgPSAwOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgKmFhY19jb25maWc7Ci0JCXVpbnQxNl90IHNjZV9sZWZ0ID0gMSwgc2NlX3JpZ2h0ID0gMjsKLQotCQlpZiAoYXJnID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbWNweShhdWRpby0+Y29kZWNfY2ZnLCBhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZykpOwotCQlhYWNfY29uZmlnID0gYXVkaW8tPmNvZGVjX2NmZzsKLQkJaWYgKGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlID4KLQkJICAgIEFVRElPX0FBQ19EVUFMX01PTk9fUExfU1IpIHsKLQkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19DT05GSUc6IEludmFsaWQgZHVhbF9tb25vIG1vZGUgPSVkXG4iLAotCQkJCSBfX2Z1bmNfXywgYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUpOwotCQl9IGVsc2UgewotCQkJLyogY29udmVydCB0aGUgZGF0YSBmcm9tIHVzZXIgaW50byBzY2VfbGVmdAotCQkJICogYW5kIHNjZV9yaWdodCBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbnMKLQkJCSAqLwotCQkJcHJfZGVidWcoIiVzOiBBVURJT19TRVRfQUFDX0NPTkZJRzogbW9kaWZ5IGR1YWxfbW9ubyBtb2RlID0lZFxuIiwKLQkJCQkgX19mdW5jX18sIGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlKTsKLQkJCXN3aXRjaCAoYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUpIHsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9QUjoKLQkJCQlzY2VfbGVmdCA9IDE7Ci0JCQkJc2NlX3JpZ2h0ID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9TUjoKLQkJCQlzY2VfbGVmdCA9IDI7Ci0JCQkJc2NlX3JpZ2h0ID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19TTF9QUjoKLQkJCQlzY2VfbGVmdCA9IDI7Ci0JCQkJc2NlX3JpZ2h0ID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9TUjoKLQkJCWRlZmF1bHQ6Ci0JCQkJc2NlX2xlZnQgPSAxOwotCQkJCXNjZV9yaWdodCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyYyA9IHE2YXNtX2NmZ19kdWFsX21vbm9fYWFjKGF1ZGlvLT5hYywKLQkJCQkJCXNjZV9sZWZ0LCBzY2VfcmlnaHQpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIiVzOiBhc20gY21kIGR1YWxtb25vIGZhaWxlZCByYz0lZFxuIiwKLQkJCQkJCQkgX19mdW5jX18sIHJjKTsKLQkJfQkJCWJyZWFrOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX01JWF9DT05GSUc6CXsKLQkJdTMyICptaXhfY29lZmYgPSAodTMyICopYXJnOwotCi0JCWlmICghYXJnKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtIGZvciAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgIkFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRyIpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzLCBBVURJT19TRVRfQUFDX01JWF9DT05GSUciLCBfX2Z1bmNfXyk7Ci0JCXByX2RlYnVnKCIlcywgdmFsdWUgb2YgY29lZmYgPSAlZCIsCi0JCQkJCV9fZnVuY19fLCAqbWl4X2NvZWZmKTsKLQkJcTZhc21fY2ZnX2FhY19zZWxfbWl4X2NvZWYoYXVkaW8tPmFjLCAqbWl4X2NvZWZmKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXMgYXNtIGFhY19zZWxfbWl4X2NvZWYgZmFpbGVkIHJjPSVkXG4iLAotCQkJCSBfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9BQUNfQ09ORklHOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19DT05GSUcgZmFpbGVkXG4iCi0JCQkJLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWcgYWFjX2NvbmZpZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFhY19jb25maWcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKGFhY19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZFxuIgotCQkJCSwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJmFhY19jb25maWcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRzoJewotCQl1MzIgbWl4X2NvbmZpZzsKLQotCQlwcl9kZWJ1ZygiJXMsIEFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRyIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtaXhfY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZih1MzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAmbWl4X2NvbmZpZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6QVVESU9fU0VUX0FBQ19DT05GSUcgZmFpbGVkLiBSYz0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDogewotCQlwcl9kZWJ1ZygiQ2FsbGluZyB1dGlscyBpb2N0bFxuIik7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZzMyIHsKLQlzMTYgZm9ybWF0OwotCXUxNiBhdWRpb19vYmplY3Q7Ci0JdTE2IGVwX2NvbmZpZzsgIC8qIDAgfiAzIHVzZWZ1bCBvbmx5IG9iaiA9IEVSTEMgKi8KLQl1MTYgYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdTE2IGFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQl1MTYgYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCXUxNiBzYnJfb25fZmxhZzsKLQl1MTYgc2JyX3BzX29uX2ZsYWc7Ci0JdTE2IGR1YWxfbW9ub19tb2RlOwotCXUxNiBjaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JdTE2IHNhbXBsZV9yYXRlOwotfTsKLQotZW51bSB7Ci0JQVVESU9fU0VUX0FBQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfQUFDX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsCi0JCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnMzIpLAotfTsKLQotc3RhdGljIGxvbmcgYXVkaW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0FBQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiBhYWNfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmYWFjX2NvbmZpZ18zMiwgMCwgc2l6ZW9mKGFhY19jb25maWdfMzIpKTsKLQotCQlhYWNfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWFhY19jb25maWdfMzIuZm9ybWF0ID0gYWFjX2NvbmZpZy0+Zm9ybWF0OwotCQlhYWNfY29uZmlnXzMyLmF1ZGlvX29iamVjdCA9IGFhY19jb25maWctPmF1ZGlvX29iamVjdDsKLQkJYWFjX2NvbmZpZ18zMi5lcF9jb25maWcgPSBhYWNfY29uZmlnLT5lcF9jb25maWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCWFhY19jb25maWctPmFhY19zY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NvbmZpZ18zMi5hYWNfc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZy0+YWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY29uZmlnXzMyLnNicl9vbl9mbGFnID0gYWFjX2NvbmZpZy0+c2JyX29uX2ZsYWc7Ci0JCWFhY19jb25maWdfMzIuc2JyX3BzX29uX2ZsYWcgPSBhYWNfY29uZmlnLT5zYnJfcHNfb25fZmxhZzsKLQkJYWFjX2NvbmZpZ18zMi5kdWFsX21vbm9fbW9kZSA9IGFhY19jb25maWctPmR1YWxfbW9ub19tb2RlOwotCQlhYWNfY29uZmlnXzMyLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9Ci0JCQlhYWNfY29uZmlnLT5jaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JCWFhY19jb25maWdfMzIuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnLT5zYW1wbGVfcmF0ZTsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWFjX2NvbmZpZ18zMiwKLQkJCXNpemVvZihhYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0FBQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9BQUNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyBhYWNfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2FhY19jb25maWczMiBhYWNfY29uZmlnXzMyOwotCi0JCXByX2RlYnVnKCIlczogQVVESU9fU0VUX0FBQ19DT05GSUdcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYWNfY29uZmlnXzMyLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihhYWNfY29uZmlnXzMyKSkpIHsKLQkJCXByX2VycigKLQkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQUFDX0NPTkZJR18zMiBmYWlsZWQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWFhY19jb25maWcuZm9ybWF0ID0gYWFjX2NvbmZpZ18zMi5mb3JtYXQ7Ci0JCWFhY19jb25maWcuYXVkaW9fb2JqZWN0ID0gYWFjX2NvbmZpZ18zMi5hdWRpb19vYmplY3Q7Ci0JCWFhY19jb25maWcuZXBfY29uZmlnID0gYWFjX2NvbmZpZ18zMi5lcF9jb25maWc7Ci0JCWFhY19jb25maWcuYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZ18zMi5hYWNfc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQkJYWFjX2NvbmZpZy5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWcgPQotCQkJYWFjX2NvbmZpZ18zMi5hYWNfc2NhbGVmYWN0b3JfZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JCWFhY19jb25maWcuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnID0KLQkJCWFhY19jb25maWdfMzIuYWFjX3NwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCQlhYWNfY29uZmlnLnNicl9vbl9mbGFnID0gYWFjX2NvbmZpZ18zMi5zYnJfb25fZmxhZzsKLQkJYWFjX2NvbmZpZy5zYnJfcHNfb25fZmxhZyA9IGFhY19jb25maWdfMzIuc2JyX3BzX29uX2ZsYWc7Ci0JCWFhY19jb25maWcuZHVhbF9tb25vX21vZGUgPSBhYWNfY29uZmlnXzMyLmR1YWxfbW9ub19tb2RlOwotCQlhYWNfY29uZmlnLmNoYW5uZWxfY29uZmlndXJhdGlvbiA9Ci0JCQkJYWFjX2NvbmZpZ18zMi5jaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JCWFhY19jb25maWcuc2FtcGxlX3JhdGUgPSBhYWNfY29uZmlnXzMyLnNhbXBsZV9yYXRlOwotCi0JCWNtZCA9IEFVRElPX1NFVF9BQUNfQ09ORklHOwotCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICZhYWNfY29uZmlnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19TRVRfQUFDX0NPTkZJRyBmYWlsZWQuIHJjPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQUFDX01JWF9DT05GSUc6IHsKLQkJdTMyIG1peF9jb25maWc7Ci0KLQkJcHJfZGVidWcoIiVzLCBBVURJT19TRVRfQUFDX01JWF9DT05GSUdcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtaXhfY29uZmlnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZih1MzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9BQUNfTUlYX0NPTkZJRyBmYWlsZWRcbiIKLQkJCQksIF9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgJm1peF9jb25maWcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9BQUNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXByX2RlYnVnKCJDYWxsaW5nIHV0aWxzIGlvY3RsXG4iKTsKLQkJcmMgPSBhdWRpby0+Y29kZWNfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnICphYWNfY29uZmlnID0gTlVMTDsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCS8qIDQgYnl0ZXMgcmVwcmVzZW50cyBkZWNvZGVyIG51bWJlciwgMSBieXRlIGZvciB0ZXJtaW5hdGUgc3RyaW5nICovCi0JY2hhciBuYW1lW3NpemVvZiAibXNtX211bHRpX2FhY18iICsgNV07Ci0jZW5kaWYKLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2FpbyksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXVkaW8tPmNvZGVjX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyksCi0JCQkJCUdGUF9LRVJORUwpOwotCWlmIChhdWRpby0+Y29kZWNfY2ZnID09IE5VTEwpIHsKLQkJa2ZyZWUoYXVkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhYWNfY29uZmlnID0gYXVkaW8tPmNvZGVjX2NmZzsKLQotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTl9BQUNNOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX211bHRpYWFjX21pc2M7Ci0JYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JYXVkaW8tPmF1ZGlvX3dzX21nciA9ICZhdWRpb19tdWx0aWFhY193c19tZ3I7Ci0JYWFjX2NvbmZpZy0+ZHVhbF9tb25vX21vZGUgPSBBVURJT19BQUNfRFVBTF9NT05PX0lOVkFMSUQ7Ci0KLQlhdWRpby0+YWMgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoKGFwcF9jYikgcTZfYXVkaW9fY2IsCi0JCQkJCSAgICAgKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGF1ZGlvIGNsaWVudFxuIik7Ci0JCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCSAgIEZPUk1BVF9NUEVHNF9NVUxUSV9BQUMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gQUFDIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMQotCQkgKiBhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCSAqLwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQl9IGVsc2UgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJCSEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX01QRUc0X01VTFRJX0FBQyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX211bHRpX2FhY18lMDR4IiwgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlhdWRpby0+ZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHIHwgMDQ0NCwKLQkJCQkJICAgIE5VTEwsICh2b2lkICopYXVkaW8sCi0JCQkJCSAgICAmYXVkaW9fYWFjX2RlYnVnX2ZvcHMpOwotCi0JaWYgKElTX0VSUihhdWRpby0+ZGVudHJ5KSkKLQkJcHJfZGVidWcoImRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkXG4iKTsKLSNlbmRpZgotCXByX2luZm8oIiVzOkFBQyA1LjEgRGVjb2RlciBPUEVOIHN1Y2Nlc3MgbW9kZVslZF1zZXNzaW9uWyVkXVxuIiwKLQkJX19mdW5jX18sIGF1ZGlvLT5mZWVkYmFjaywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gcmM7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fYWFjX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBhdWRpb19vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fYWlvX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9faW9jdGwsCi0JLmZzeW5jID0gYXVkaW9fYWlvX2ZzeW5jLAotCS5jb21wYXRfaW9jdGwgPSBhdWRpb19jb21wYXRfaW9jdGwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19tdWx0aWFhY19taXNjID0gewotCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZSA9ICJtc21fbXVsdGlfYWFjIiwKLQkuZm9wcyA9ICZhdWRpb19hYWNfZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX2FhY19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX211bHRpYWFjX21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fbXVsdGlhYWNfbWlzYy50aGlzX2RldmljZSwgdHJ1ZSk7Ci0JYXVkaW9fbXVsdGlhYWNfd3NfbWdyLnJlZl9jbnQgPSAwOwotCW11dGV4X2luaXQoJmF1ZGlvX211bHRpYWFjX3dzX21nci53c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb19hYWNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3FjZWxwLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3FjZWxwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjUxMWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb19xY2VscC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIHFjZWxwKHYxM2spIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotCi0jZGVmaW5lIEZSQU1FX1NJWkVfREVDX1FDRUxQICAoKDMyKSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfaW4pKQotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfbWlzYzsKLXN0YXRpYyBzdHJ1Y3Qgd3NfbWdyIGF1ZGlvX3FjZWxwX3dzX21ncjsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcWNlbHBfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX1NUQVJUIHNlc3Npb25faWRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJaWYgKCFyYykgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCJBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IEFVRElPX1NUQVJUIHNlc3Npb25pZFslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQkJCWF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCi0JCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQ2FsbGluZyB1dGlscyBpb2N0bFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJcmMgPSBhdWRpby0+Y29kZWNfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KLQljaGFyIG5hbWVbc2l6ZW9mICJtc21fcWNlbHBfIiArIDVdOwotI2VuZGlmCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRV9ERUNfUUNFTFA7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOwotCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gODAwMDsKLQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMTsKLQlhdWRpby0+bWlzY2RldmljZSA9ICZhdWRpb19xY2VscF9taXNjOwotCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOwotCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fcWNlbHBfd3NfbWdyOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpIHE2X2F1ZGlvX2NiLAotCQkJCQkgICAgICh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhdWRpbyBjbGllbnRcbiIpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyYyA9IGF1ZGlvX2Fpb19vcGVuKGF1ZGlvLCBmaWxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2Fpb19vcGVuIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCSAgIEZPUk1BVF9WMTNLKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCX0gZWxzZSBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlyYyA9IHE2YXNtX29wZW5fd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfVjEzSyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXVkaW8tPmZlZWRiYWNrID0gVFVOTkVMX01PREU7Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiTm90IHN1cHBvcnRlZCBtb2RlXG4iKTsKLQkJcmMgPSAtRUFDQ0VTOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibXNtX3FjZWxwXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCQkgICAgTlVMTCwgKHZvaWQgKilhdWRpbywKLQkJCQkJICAgICZhdWRpb19xY2VscF9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQlwcl9pbmZvKCIlczpkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKLQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fcWNlbHBfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX29wZW4sCi0JLnJlbGVhc2UgPSBhdWRpb19haW9fcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pb2N0bCwKLQkuZnN5bmMgPSBhdWRpb19haW9fZnN5bmMsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfbWlzYyA9IHsKLQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUgPSAibXNtX3FjZWxwIiwKLQkuZm9wcyA9ICZhdWRpb19xY2VscF9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fcWNlbHBfaW5pdCh2b2lkKQotewotCWludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZhdWRpb19xY2VscF9taXNjKTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZGV2aWNlX2luaXRfd2FrZXVwKGF1ZGlvX3FjZWxwX21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX3FjZWxwX3dzX21nci5yZWZfY250ID0gMDsKLQltdXRleF9pbml0KCZhdWRpb19xY2VscF93c19tZ3Iud3NfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYXVkaW9fcWNlbHBfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWU5ZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTU0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlICJhdWRpb191dGlscy5oIgotCi0vKgotICogRGVmaW5lIG1heGltdW0gYnVmZmVyIHNpemUuIEJlbG93IHZhbHVlcyBhcmUgY2hvc2VuIGNvbnNpZGVyaW5nIHRoZSBoaWdoZXIKLSAqIHZhbHVlcyB1c2VkIGFtb25nIGFsbCBuYXRpdmUgZHJpdmVycy4KLSAqLwotI2RlZmluZSBNQVhfRlJBTUVfU0laRQkxNTM2Ci0jZGVmaW5lIE1BWF9GUkFNRVMJNQotI2RlZmluZSBNRVRBX1NJWkUJKHNpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkKLSNkZWZpbmUgTUFYX0JVRkZFUl9TSVpFCSgxICsgKChNQVhfRlJBTUVfU0laRSArIE1FVEFfU0laRSkgKiBNQVhfRlJBTUVTKSkKLQotc3RhdGljIGludCBhdWRpb19pbl9wYXVzZShzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvKQotewotCWludCByYzsKLQotCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX1BBVVNFKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IHBhdXNlIGNtZCBmYWlsZWQgcmM9JWRcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2luX2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8pCi17Ci0JaW50IHJjOwotCi0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGZsdXNoXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkvKiBGbHVzaCBpZiBzZXNzaW9uIHJ1bm5pbmcgKi8KLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJLyogSW1wbGljaXRseSBpc3N1ZSBhIHBhdXNlIHRvIHRoZSBlbmNvZGVyIGJlZm9yZSBmbHVzaGluZyAqLwotCQlyYyA9IGF1ZGlvX2luX3BhdXNlKGF1ZGlvKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBwYXVzZSBjbWQgZmFpbGVkIHJjPSVkXG4iLAotCQkJCSBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlyYyA9IHE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9GTFVTSCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogZmx1c2ggY21kIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJLyogMm5kIGFyZzogMCAtPiBydW4gaW1tZWRpYXRlbHkKLQkJICogM3JkIGFyZzogMCAtPiBtc3dfdHMsCi0JCSAqIDR0aCBhcmc6IDAgLT5sc3dfdHMKLQkJICovCi0JCXE2YXNtX3J1bihhdWRpby0+YWMsIDB4MDAsIDB4MDAsIDB4MDApOwotCQlwcl9kZWJ1ZygiUmVydW4gdGhlIHNlc3Npb25cbiIpOwotCX0KLQlhdWRpby0+cmZsdXNoID0gMTsKLQlhdWRpby0+d2ZsdXNoID0gMTsKLQltZW1zZXQoYXVkaW8tPm91dF9mcmFtZV9pbmZvLCAwLCBzaXplb2YoYXVkaW8tPm91dF9mcmFtZV9pbmZvKSk7Ci0Jd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JLyogZ2V0IHJlYWRfbG9jayB0byBlbnN1cmUgbm8gbW9yZSB3YWl0aW5nIHJlYWQgdGhyZWFkICovCi0JbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JYXVkaW8tPnJmbHVzaCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JLyogZ2V0IHdyaXRlX2xvY2sgdG8gZW5zdXJlIG5vIG1vcmUgd2FpdGluZyB3cml0ZSB0aHJlYWQgKi8KLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkaW8tPndmbHVzaCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGluX2J5dGVzICVkXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcykpOwotCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBpbl9zYW1wbGVzICVkXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKSk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX2J5dGVzLCAwKTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fc2FtcGxlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotaW50IGF1ZGlvX2luX2VuYWJsZShzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiAybmQgYXJnOiAwIC0+IHJ1biBpbW1lZGlhdGVseQotCSAqIDNyZCBhcmc6IDAgLT4gbXN3X3RzLAotCSAqIDR0aCBhcmc6IDAgLT5sc3dfdHMKLQkgKi8KLQlyZXR1cm4gcTZhc21fcnVuKGF1ZGlvLT5hYywgMHgwMCwgMHgwMCwgMHgwMCk7Ci19Ci0KLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggYXVkaW8tPmxvY2sgaGVsZCAqLwotaW50IGF1ZGlvX2luX2Rpc2FibGUoc3RydWN0IHE2YXVkaW9faW4gICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhdWRpby0+c3RvcHBlZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5vcGVuZWQgPSAwOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogaW5ieXRlc1slZF0gaW5zYW1wbGVzWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCWF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpLAotCQkJCWF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCi0JCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0NMT1NFKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogRmFpbGVkIHRvIGNsb3NlIHRoZSBzZXNzaW9uIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJcmMpOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCW1lbXNldChhdWRpby0+b3V0X2ZyYW1lX2luZm8sIDAsCi0JCQkJc2l6ZW9mKGF1ZGlvLT5vdXRfZnJhbWVfaW5mbykpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCX0KLQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZW5hYmxlZFslZF1cbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkaW9faW5fYnVmX2FsbG9jKHN0cnVjdCBxNmF1ZGlvX2luICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChhdWRpby0+YnVmX2FsbG9jKSB7Ci0JY2FzZSBOT19CVUZfQUxMT0M6Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoSU4sCi0JCQkJYXVkaW8tPmFjLAotCQkJCUFMSUdOX0JVRl9TSVpFKGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplKSwKLQkJCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQnVmZmVyIEFsbG9jIGZhaWxlZFxuIiwKLQkJCQkJCV9fZnVuY19fLAotCQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+YnVmX2FsbG9jIHw9IEJVRl9BTExPQ19JTjsKLQkJfQotCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoT1VULCBhdWRpby0+YWMsCi0JCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUpLAotCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQnVmZmVyIEFsbG9jIGZhaWxlZCByYz0lZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmJ1Zl9hbGxvYyB8PSBCVUZfQUxMT0NfT1VUOwotCQlicmVhazsKLQljYXNlIEJVRl9BTExPQ19JTjoKLQkJcmMgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jKE9VVCwgYXVkaW8tPmFjLAotCQkJCUFMSUdOX0JVRl9TSVpFKGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplKSwKLQkJCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEJ1ZmZlciBBbGxvYyBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX09VVDsKLQkJYnJlYWs7Ci0JY2FzZSBCVUZfQUxMT0NfT1VUOgotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJcmMgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jKElOLCBhdWRpby0+YWMsCi0JCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUpLAotCQkJCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdWRpby0+YnVmX2FsbG9jIHw9IEJVRl9BTExPQ19JTjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogYnVmWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkaW9faW5fc2V0X2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgKmNmZykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoYXVkaW8tPmZlZWRiYWNrICE9IE5PTl9UVU5ORUxfTU9ERSkgewotCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IE5vdCBzdWZmaWNpZW50IHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSByZWNvcmQgbW9kZVxuIiwKLQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gcmV0OwotCX0KLQlpZiAoKGNmZy0+YnVmZmVyX2NvdW50ID4gUENNX0JVRl9DT1VOVCkgfHwKLQkJKGNmZy0+YnVmZmVyX2NvdW50ID09IDEpKQotCQljZmctPmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0KLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBjZmctPmJ1ZmZlcl9jb3VudDsKLQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSAgPSBjZmctPmJ1ZmZlcl9zaXplOwotCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSBjZmctPmNoYW5uZWxfY291bnQ7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSBjZmctPnNhbXBsZV9yYXRlOwotCWlmIChhdWRpby0+b3BlbmVkICYmIGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJcmMgPSBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2FsbG9jKElOLCBhdWRpby0+YWMsCi0JCQlBTElHTl9CVUZfU0laRShhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSksCi0JCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEJ1ZmZlciBBbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHJldDsKLQkJfQotCX0KLQlhdWRpby0+YnVmX2FsbG9jIHw9IEJVRl9BTExPQ19JTjsKLQlyYyA9IDA7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NFVF9DT05GSUcgJWQgJWRcbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQsCi0JCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSk7Ci1yZXQ6Ci0JcmV0dXJuIHJjOwotfQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgbG9uZyBhdWRpb19pbl9pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0ZMVVNIOiB7Ci0JCS8qIE1ha2Ugc3VyZSB3ZSdyZSBzdG9wcGVkIGFuZCB3ZSB3YWtlIGFueSB0aHJlYWRzCi0JCSAqIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBob2xkaW5nIHRoZSByZWFkX2xvY2suCi0JCSAqIFdoaWxlIGF1ZGlvLT5zdG9wcGVkIHJlYWQgdGhyZWFkcyB3aWxsIGFsd2F5cwotCQkgKiBleGl0IGltbWVkaWF0ZWx5LgotCQkgKi8KLQkJcmMgPSBhdWRpb19pbl9mbHVzaChhdWRpbyk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEZsdXNoIEZhaWwgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQllbHNlIHsgLyogUmVnaXN0ZXIgYmFjayB0aGUgZmx1c2hlZCByZWFkIGJ1ZmZlciB3aXRoIERTUCAqLwotCQkJaW50IGNudCA9IDA7Ci0KLQkJCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKLQkJCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLwotCQkJcHJfZGVidWcoInJlZ2lzdGVyIHRoZSByZWFkIGJ1ZmZlclxuIik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fUEFVU0U6IHsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1BBVVNFXG4iLCBfX2Z1bmNfXywKLQkJCQkJYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJaWYgKGF1ZGlvLT5lbmFibGVkKQotCQkJYXVkaW9faW5fcGF1c2UoYXVkaW8pOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCXNpemVvZih1MTYpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfU0VTU0lPTl9JRCBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1sb25nIGF1ZGlvX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMgc3RhdHM7Ci0KLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fRkxVU0g6Ci0JY2FzZSBBVURJT19QQVVTRToKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCQlyYyA9IGF1ZGlvX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1NUUkVBTV9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKQotCQkJcmMgPSAtRUZBVUxUOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fR0VUX1NUUkVBTV9DT05GSUcgJWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLmJ1ZmZlcl9zaXplLAotCQkJCWNmZy5idWZmZXJfY291bnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1NUUkVBTV9DT05GSUcgZmFpbGVkXG4iCi0JCQkJLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBNaW5pbXVtIHNpbmdsZSBmcmFtZSBzaXplLAotCQkgKiBidXQgd2l0aCBpbiBtYXhpbXVtIGZyYW1lcyBudW1iZXIKLQkJICovCi0JCWlmICgoY2ZnLmJ1ZmZlcl9zaXplIDwgKGF1ZGlvLT5taW5fZnJhbWVfc2l6ZSArCi0JCQlzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpKSB8fAotCQkJKGNmZy5idWZmZXJfY291bnQgPCBGUkFNRV9OVU0pKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLmJ1ZmZlcl9zaXplID4gTUFYX0JVRkZFUl9TSVpFKSB7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IGNmZy5idWZmZXJfc2l6ZTsKLQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJaWYgKGF1ZGlvLT5vcGVuZWQpIHsKLQkJCXJjID0gcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyhPVVQsIGF1ZGlvLT5hYywKLQkJCQlBTElHTl9CVUZfU0laRShhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSksCi0JCQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBzZXNzaW9uIGlkICVkOiBCdWZmZXIgQWxsb2MgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQkJcmMgPSAtRU5PTUVNOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWF1ZGlvLT5idWZfYWxsb2MgfD0gQlVGX0FMTE9DX09VVDsKLQkJcmMgPSAwOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU0VUX1NUUkVBTV9DT05GSUcgJWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSwKLQkJCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQlVGX0NGRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKilhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSAmJgotCQkJIWNmZy5tZXRhX2luZm9fZW5hYmxlKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFJlc3RyaWN0IHRoZSBudW0gb2YgZnJhbWVzIHBlciBidWYgdG8gY29pbmNpZGUgd2l0aAotCQkgKiBkZWZhdWx0IGJ1ZiBzaXplCi0JCSAqLwotCQlpZiAoY2ZnLmZyYW1lc19wZXJfYnVmID4gYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZikgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IGNmZy5tZXRhX2luZm9fZW5hYmxlOwotCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IGNmZy5mcmFtZXNfcGVyX2J1ZjsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IFNldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLm1ldGFfaW5mb19lbmFibGUsCi0JCQkJY2ZnLmZyYW1lc19wZXJfYnVmKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0JVRl9DRkc6IHsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEdldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAotCQkJX19mdW5jX18sCi0JCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUsCi0JCQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1Zik7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5idWZfY2ZnLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnKSkpCi0JCQlyYyA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5wY21fY2ZnLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19jb25maWcpKSkKLQkJCXJjID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0KLQl9Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKilhcmcsIHNpemVvZihjZmcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gYXVkaW9faW5fc2V0X2NvbmZpZyhmaWxlLCAmY2ZnKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCS8qIGNhbGwgY29kZWMgc3BlY2lmaWMgaW9jdGwgKi8KLQkJcmMgPSBhdWRpby0+ZW5jX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IG1zbV9hdWRpb19zdGF0czMyIHsKLQl1MzIgYnl0ZV9jb3VudDsKLQl1MzIgc2FtcGxlX2NvdW50OwotCXUzMiB1bnVzZWRbMl07Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWczMiB7Ci0JdTMyIGJ1ZmZlcl9zaXplOwotCXUzMiBidWZmZXJfY291bnQ7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyIHsKLQl1MzIgYnVmZmVyX3NpemU7Ci0JdTMyIGJ1ZmZlcl9jb3VudDsKLQl1MzIgY2hhbm5lbF9jb3VudDsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIHR5cGU7Ci0JdTMyIG1ldGFfZmllbGQ7Ci0JdTMyIGJpdHM7Ci0JdTMyIHVudXNlZFszXTsKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyIHsKLQl1MzIgbWV0YV9pbmZvX2VuYWJsZTsKLQl1MzIgZnJhbWVzX3Blcl9idWY7Ci19OwotCi1lbnVtIHsKLQlBVURJT19HRVRfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywgMywKLQkJCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnMzIpLAotCUFVRElPX1NFVF9DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA0LAotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiksCi0JQVVESU9fR0VUX1NUQVRTXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywgNSwKLQkJCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMzMiksCi0JQVVESU9fU0VUX1NUUkVBTV9DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4MCwKLQkJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfU1RSRUFNX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDgxLAotCQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIpLAotCUFVRElPX1NFVF9CVUZfQ0ZHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTQsCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiksCi0JQVVESU9fR0VUX0JVRl9DRkdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MywKLQkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyKSwKLX07Ci0KLWxvbmcgYXVkaW9faW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbWQgPT0gQVVESU9fR0VUX1NUQVRTXzMyKSB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RhdHMzMiBzdGF0c18zMjsKLQotCQltZW1zZXQoJnN0YXRzXzMyLCAwLCBzaXplb2Yoc3RhdHNfMzIpKTsKLQkJc3RhdHNfMzIuYnl0ZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fYnl0ZXMpOwotCQlzdGF0c18zMi5zYW1wbGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJnN0YXRzXzMyLCBzaXplb2Yoc3RhdHNfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZCBmb3IgQVVESU9fR0VUX1NUQVRTXzMyXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0ZMVVNIOgotCWNhc2UgQVVESU9fUEFVU0U6Ci0JY2FzZSBBVURJT19HRVRfU0VTU0lPTl9JRDoKLQkJcmMgPSBhdWRpb19pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCBhcmcpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIGNmZ18zMjsKLQotCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOwotCQljZmdfMzIuYnVmZmVyX3NpemUgPSBhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJY2ZnXzMyLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZ18zMiwgc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX0dFVF9TVFJFQU1fQ09ORklHICVkICVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJY2ZnXzMyLmJ1ZmZlcl9zaXplLAotCQkJCWNmZ18zMi5idWZmZXJfY291bnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWczMiBjZmdfMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfU1RSRUFNX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2ZnLmJ1ZmZlcl9zaXplID0gY2ZnXzMyLmJ1ZmZlcl9zaXplOwotCQljZmcuYnVmZmVyX2NvdW50ID0gY2ZnXzMyLmJ1ZmZlcl9jb3VudDsKLQkJLyogTWluaW11bSBzaW5nbGUgZnJhbWUgc2l6ZSwKLQkJICogYnV0IHdpdGggaW4gbWF4aW11bSBmcmFtZXMgbnVtYmVyCi0JCSAqLwotCQlpZiAoKGNmZy5idWZmZXJfc2l6ZSA8IChhdWRpby0+bWluX2ZyYW1lX3NpemUgKwotCQkJc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSkgfHwKLQkJCShjZmcuYnVmZmVyX2NvdW50IDwgRlJBTUVfTlVNKSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUgPSBjZmcuYnVmZmVyX3NpemU7Ci0JCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCA9IGNmZy5idWZmZXJfY291bnQ7Ci0JCWlmIChhdWRpby0+b3BlbmVkKSB7Ci0JCQlyYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2MoT1VULCBhdWRpby0+YWMsCi0JCQkJQUxJR05fQlVGX1NJWkUoYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUpLAotCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogc2Vzc2lvbiBpZCAlZDpcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJCXByX2VycigiQnVmZmVyIEFsbG9jIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJCXJjID0gLUVOT01FTTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhdWRpby0+YnVmX2FsbG9jIHw9IEJVRl9BTExPQ19PVVQ7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TRVRfU1RSRUFNX0NPTkZJRyAlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplLAotCQkJCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9CVUZfQ0ZHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyIGNmZ18zMjsKLQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9CVUdfQ0ZHXzMyIGZhaWxlZCIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2ZnLm1ldGFfaW5mb19lbmFibGUgPSBjZmdfMzIubWV0YV9pbmZvX2VuYWJsZTsKLQkJY2ZnLmZyYW1lc19wZXJfYnVmID0gY2ZnXzMyLmZyYW1lc19wZXJfYnVmOwotCi0JCWlmICgoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgJiYKLQkJCSFjZmcubWV0YV9pbmZvX2VuYWJsZSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBSZXN0cmljdCB0aGUgbnVtIG9mIGZyYW1lcyBwZXIgYnVmIHRvIGNvaW5jaWRlIHdpdGgKLQkJICogZGVmYXVsdCBidWYgc2l6ZQotCQkgKi8KLQkJaWYgKGNmZy5mcmFtZXNfcGVyX2J1ZiA+IGF1ZGlvLT5tYXhfZnJhbWVzX3Blcl9idWYpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSBjZmcubWV0YV9pbmZvX2VuYWJsZTsKLQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYgPSBjZmcuZnJhbWVzX3Blcl9idWY7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBTZXQtYnVmLWNmZzogbWV0YVslZF0gZnJhbWVzcGVyYnVmWyVkXVxuIiwKLQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIGNmZy5tZXRhX2luZm9fZW5hYmxlLAotCQkJY2ZnLmZyYW1lc19wZXJfYnVmKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0JVRl9DRkdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIgY2ZnXzMyOwotCi0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBHZXQtYnVmLWNmZzogbWV0YVslZF0gZnJhbWVzcGVyYnVmWyVkXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlLAotCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYpOwotCQljZmdfMzIubWV0YV9pbmZvX2VuYWJsZSA9IGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGU7Ci0JCWNmZ18zMi5mcmFtZXNfcGVyX2J1ZiA9IGF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmdfMzIsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIpKSkgewotCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiBjZmdfMzI7Ci0KLQkJbWVtc2V0KCZjZmdfMzIsIDAsIHNpemVvZihjZmdfMzIpKTsKLQkJY2ZnXzMyLmJ1ZmZlcl9zaXplID0gYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemU7Ci0JCWNmZ18zMi5idWZmZXJfY291bnQgPSBhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQ7Ci0JCWNmZ18zMi5jaGFubmVsX2NvdW50ID0gYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudDsKLQkJY2ZnXzMyLnNhbXBsZV9yYXRlID0gYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGU7Ci0JCWNmZ18zMi50eXBlID0gYXVkaW8tPnBjbV9jZmcudHlwZTsKLQkJY2ZnXzMyLm1ldGFfZmllbGQgPSBhdWRpby0+cGNtX2NmZy5tZXRhX2ZpZWxkOwotCQljZmdfMzIuYml0cyA9IGF1ZGlvLT5wY21fY2ZnLmJpdHM7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZ18zMiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fY29uZmlnMzIpKSkgewotCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiBjZmdfMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGNmZ18zMi5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IGNmZ18zMi5idWZmZXJfY291bnQ7Ci0JCWNmZy5jaGFubmVsX2NvdW50ID0gY2ZnXzMyLmNoYW5uZWxfY291bnQ7Ci0JCWNmZy5zYW1wbGVfcmF0ZSA9IGNmZ18zMi5zYW1wbGVfcmF0ZTsKLQkJY2ZnLnR5cGUgPSBjZmdfMzIudHlwZTsKLQkJY2ZnLm1ldGFfZmllbGQgPSBjZmdfMzIubWV0YV9maWVsZDsKLQkJY2ZnLmJpdHMgPSBjZmdfMzIuYml0czsKLQkJcmMgPSBhdWRpb19pbl9zZXRfY29uZmlnKGZpbGUsICZjZmcpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJICAvKiBjYWxsIGNvZGVjIHNwZWNpZmljIGlvY3RsICovCi0JCSAgcmMgPSBhdWRpby0+ZW5jX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JfQotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zc2l6ZV90IGF1ZGlvX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciBfX3VzZXIgKnN0YXJ0ID0gYnVmOwotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0JdWludDMyX3Qgb2Zmc2V0ID0gMDsKLQl1aW50MzJfdCBzaXplID0gMDsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGlkeDsKLQlzdHJ1Y3QgbWV0YV9vdXRfZHNwIG1ldGE7Ci0JdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IDA7Ci0JdWludDMyX3QgbWZpZWxkX3NpemUgPSAoYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9PSAwKSA/IDAgOgotCQkoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICsKLQkJKHNpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSooYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYpKSk7Ci0KLQltZW1zZXQoJm1ldGEsIDAsIHNpemVvZihtZXRhKSk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHJlYWQgLSAlemRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sCi0JCQljb3VudCk7Ci0JaWYgKGF1ZGlvLT5yZXNldF9ldmVudCkKLQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0KLQlpZiAoIWF1ZGlvLT5lbmFibGVkKQotCQlyZXR1cm4gLUVGQVVMVDsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAotCQkJYXVkaW8tPnJlYWRfd2FpdCwKLQkJCSgoYXRvbWljX3JlYWQoJmF1ZGlvLT5vdXRfY291bnQpID4gMCkgfHwKLQkJCShhdWRpby0+c3RvcHBlZCkgfHwKLQkJCSBhdWRpby0+cmZsdXNoIHx8IGF1ZGlvLT5lb3NfcnNwIHx8Ci0JCQlhdWRpby0+ZXZlbnRfYWJvcnQpKTsKLQotCQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCi0KLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCWlmICgoYXVkaW8tPnN0b3BwZWQgJiYgIShhdG9taWNfcmVhZCgmYXVkaW8tPm91dF9jb3VudCkpKSB8fAotCQkJYXVkaW8tPnJmbHVzaCkgewotCQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGRyaXZlciBpbiBzdG9wIHN0YXRlIG9yIGZsdXNoLE5vIG1vcmUgYnVmIHRvIHJlYWQiLAotCQkJCV9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IDA7LyogRW5kIG9mIEZpbGUgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghKGF0b21pY19yZWFkKCZhdWRpby0+b3V0X2NvdW50KSkgJiYKLQkJCShhdWRpby0+ZW9zX3JzcCA9PSAxKSAmJgotCQkJKGNvdW50ID49IChzaXplb2YodW5zaWduZWQgY2hhcikgKwotCQkJCXNpemVvZihzdHJ1Y3QgbWV0YV9vdXRfZHNwKSkpKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIG51bV9vZl9mcmFtZXM7Ci0KLQkJCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IGVvcyAlZCBhdCBvdXRwdXRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVvc19yc3ApOwotCQkJaWYgKGJ1ZiAhPSBzdGFydCkKLQkJCQlicmVhazsKLQkJCW51bV9vZl9mcmFtZXMgPSAweEZGOwotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZudW1fb2ZfZnJhbWVzLAotCQkJCQlzaXplb2YodW5zaWduZWQgY2hhcikpKSB7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnVmICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLQkJCW1ldGEuZnJhbWVfc2l6ZSA9IDB4RkZGRjsKLQkJCW1ldGEuZW5jb2RlZF9wY21fc2FtcGxlcyA9IDB4RkZGRjsKLQkJCW1ldGEubXN3X3RzID0gMHgwMDsKLQkJCW1ldGEubHN3X3RzID0gMHgwMDsKLQkJCW1ldGEubmZsYWdzID0gQVVEX0VPU19TRVQ7Ci0JCQlhdWRpby0+ZW9zX3JzcCA9IDA7Ci0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJm1ldGEsIHNpemVvZihtZXRhKSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWYgKz0gc2l6ZW9mKG1ldGEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopcTZhc21faXNfY3B1X2J1Zl9hdmFpbChPVVQsIGF1ZGlvLT5hYywKLQkJCQkJCSZzaXplLCAmaWR4KTsKLQkJaWYgKChjb3VudCA+PSAoc2l6ZSArIG1maWVsZF9zaXplKSkgJiYgZGF0YSkgewotCQkJaWYgKGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUpIHsKLQkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwKLQkJCQkJJmF1ZGlvLT5vdXRfZnJhbWVfaW5mb1tpZHhdWzBdLAotCQkJCQlzaXplb2YodW5zaWduZWQgY2hhcikpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJ5dGVzX3RvX2NvcHkgPQotCQkJCQkoc2l6ZSArIGF1ZGlvLT5vdXRfZnJhbWVfaW5mb1tpZHhdWzFdKTsKLQkJCQkvKiBOdW1iZXIgb2YgZnJhbWVzIGluZm9ybWF0aW9uIGNvcGllZCAqLwotCQkJCWJ1ZiArPSBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0JCQkJY291bnQgLT0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlvZmZzZXQgPSBhdWRpby0+b3V0X2ZyYW1lX2luZm9baWR4XVsxXTsKLQkJCQlieXRlc190b19jb3B5ID0gc2l6ZTsKLQkJCX0KLQotCQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IG9mZnNldD0lZCBuciBvZiBmcmFtZXM9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCQlhdWRpby0+b3V0X2ZyYW1lX2luZm9baWR4XVsxXSwKLQkJCQkJYXVkaW8tPm91dF9mcmFtZV9pbmZvW2lkeF1bMF0pOwotCi0JCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmRhdGFbb2Zmc2V0XSwgYnl0ZXNfdG9fY29weSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljb3VudCAtPSBieXRlc190b19jb3B5OwotCQkJYnVmICs9IGJ5dGVzX3RvX2NvcHk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IHNob3J0IHJlYWQgZGF0YVslcEtdIGJ5dGVzYXZhaWxbJWRdYnl0ZXNyZXF1ZXN0WyV6ZF1cbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCWRhdGEsIHNpemUsIGNvdW50KTsKLQkJfQotCQlhdG9taWNfZGVjKCZhdWRpby0+b3V0X2NvdW50KTsKLQkJcTZhc21fcmVhZChhdWRpby0+YWMpOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQotCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiByZWFkOiAlemQgYnl0ZXNcbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCAoYnVmLXN0YXJ0KSk7Ci0JaWYgKGJ1ZiA+IHN0YXJ0KQotCQlyZXR1cm4gYnVmIC0gc3RhcnQ7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGV4dHJhY3RfbWV0YV9pbmZvKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyAqbXN3X3RzLAotCQl1bnNpZ25lZCBsb25nICpsc3dfdHMsIHVuc2lnbmVkIGludCAqZmxhZ3MpCi17Ci0Jc3RydWN0IG1ldGFfaW4gKm1ldGEgPSAoc3RydWN0IG1ldGFfaW4gKilidWY7Ci0JKm1zd190cyA9IG1ldGEtPm50aW1lc3RhbXAuaGlnaHBhcnQ7Ci0JKmxzd190cyA9IG1ldGEtPm50aW1lc3RhbXAubG93cGFydDsKLQkqZmxhZ3MgPSBtZXRhLT5uZmxhZ3M7Ci0JcmV0dXJuIDA7Ci19Ci0KLXNzaXplX3QgYXVkaW9faW5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCWNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNvbnN0IGNoYXIgX191c2VyICpzdGFydCA9IGJ1ZjsKLQlzaXplX3QgeGZlciA9IDA7Ci0JY2hhciAqY3B5X3B0cjsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0JdWludDMyX3Qgc2l6ZSA9IDA7Ci0JdWludDMyX3QgaWR4ID0gMDsKLQl1aW50MzJfdCBuZmxhZ3MgPSAwOwotCXVuc2lnbmVkIGxvbmcgbXN3X3RzID0gMDsKLQl1bnNpZ25lZCBsb25nIGxzd190cyA9IDA7Ci0JdWludDMyX3QgbWZpZWxkX3NpemUgPSAoYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9PSAwKSA/IDAgOgotCQkJc2l6ZW9mKHN0cnVjdCBtZXRhX2luKTsKLQotCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiB0byB3cml0ZVslemRdXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgY291bnQpOwotCWlmIChhdWRpby0+cmVzZXRfZXZlbnQpCi0JCXJldHVybiAtRU5FVFJFU0VUOwotCi0JaWYgKCFhdWRpby0+ZW5hYmxlZCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCi0Jd2hpbGUgKGNvdW50ID4gMCkgewotCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkgICAgICgoYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9jb3VudCkgPiAwKSB8fAotCQkJCSAgICAgIChhdWRpby0+c3RvcHBlZCkgfHwKLQkJCQkgICAgICAoYXVkaW8tPndmbHVzaCkgfHwgKGF1ZGlvLT5ldmVudF9hYm9ydCkpKTsKLQotCQlpZiAoYXVkaW8tPmV2ZW50X2Fib3J0KSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJCXByX2RlYnVnKCIlczogc2Vzc2lvbiBpZCAlZDogc3RvcCBvciBmbHVzaFxuIiwgX19mdW5jX18sCi0JCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FQlVTWTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGlmIG5vIFBDTSBkYXRhLCBtaWdodCBoYXZlIG9ubHkgZW9zIGJ1ZmZlcgotCQkgKiBzdWNoIGNhc2UgZG8gbm90IGhvbGQgY3B1IGJ1ZmZlcgotCQkgKi8KLQkJaWYgKChidWYgPT0gc3RhcnQpICYmIChjb3VudCA9PSBtZmllbGRfc2l6ZSkpIHsKLQkJCWNoYXIgZW9zX2J1ZltzaXplb2Yoc3RydWN0IG1ldGFfaW4pXTsKLQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoZW9zX2J1ZiwgYnVmLCBtZmllbGRfc2l6ZSkpIHsKLQkJCQlyYyA9IC1FRkFVTFQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBDaGVjayBpZiBFT1MgZmxhZyBpcyBzZXQgYW5kIGJ1ZmZlciBoYXMKLQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJICovCi0JCQlleHRyYWN0X21ldGFfaW5mbyhlb3NfYnVmLCAmbXN3X3RzLCAmbHN3X3RzLAotCQkJCQkJJm5mbGFncyk7Ci0JCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkvKiBzZW5kIHRoZSBFT1MgYW5kIHJldHVybiAqLwotCQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHNlbmQgRU9TIDB4JTh4XG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgbmZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRhdGEgPSAodW5zaWduZWQgY2hhciAqKXE2YXNtX2lzX2NwdV9idWZfYXZhaWwoSU4sIGF1ZGlvLT5hYywKLQkJCQkJCSZzaXplLCAmaWR4KTsKLQkJaWYgKCFkYXRhKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogTm8gYnVmIGF2YWlsYWJsZVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWNweV9wdHIgPSBkYXRhOwotCQlpZiAoYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSkgewotCQkJaWYgKGJ1ZiA9PSBzdGFydCkgewotCQkJCS8qIFByb2Nlc3NpbmcgYmVnaW5uaW5nIG9mIHVzZXIgYnVmZmVyICovCi0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNweV9wdHIsIGJ1ZiwgbWZpZWxkX3NpemUpKSB7Ci0JCQkJCXJjID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8qIENoZWNrIGlmIEVPUyBmbGFnIGlzIHNldCBhbmQgYnVmZmVyIGhhcwotCQkJCSAqIGNvbnRhaW5zIGp1c3QgbWV0YSBmaWVsZAotCQkJCSAqLwotCQkJCWV4dHJhY3RfbWV0YV9pbmZvKGNweV9wdHIsICZtc3dfdHMsICZsc3dfdHMsCi0JCQkJCQkmbmZsYWdzKTsKLQkJCQlidWYgKz0gbWZpZWxkX3NpemU7Ci0JCQkJY291bnQgLT0gbWZpZWxkX3NpemU7Ci0JCQl9IGVsc2UgewotCQkJCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBjb250aW51b3VzIGJ1ZmZlclxuIiwKLQkJCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJfQotCQl9Ci0JCXhmZXIgPSAoY291bnQgPiAoYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUpKSA/Ci0JCQkJKGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplKSA6IGNvdW50OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihjcHlfcHRyLCBidWYsIHhmZXIpKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IHE2YXNtX3dyaXRlKGF1ZGlvLT5hYywgeGZlciwgbXN3X3RzLCBsc3dfdHMsIDB4MDApOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlhdG9taWNfZGVjKCZhdWRpby0+aW5fY291bnQpOwotCQljb3VudCAtPSB4ZmVyOwotCQlidWYgKz0geGZlcjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGVvc19jb25kaXRpb24gMHgleCBidWZbMHglcEtdIHN0YXJ0WzB4JXBLXVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCW5mbGFncywgYnVmLCBzdGFydCk7Ci0JaWYgKG5mbGFncyAmIEFVRF9FT1NfU0VUKSB7Ci0JCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0VPUyk7Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IGVvcyAlZCBhdCBpbnB1dFxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW9zX3JzcCk7Ci0JfQotCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBXcml0dGVuICV6ZCBBdmFpbCBCdWZbJWRdIiwgX19mdW5jX18sCi0JCQlhdWRpby0+YWMtPnNlc3Npb24sIChidWYgLSBzdGFydCAtIG1maWVsZF9zaXplKSwKLQkJCWF0b21pY19yZWFkKCZhdWRpby0+aW5fY291bnQpKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChidWYgPiBzdGFydCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYXVkaW9faW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JcHJfaW5mbygiJXM6IHNlc3Npb24gaWQgJWRcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpb19pbl9kaXNhYmxlKGF1ZGlvKTsKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKLQlrZnJlZShhdWRpby0+Y29kZWNfY2ZnKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmggYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTE3ZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSAicTZhdWRpb19jb21tb24uaCIKLQotI2RlZmluZSBGUkFNRV9OVU0JKDgpCi0KLSNkZWZpbmUgUENNX0JVRl9DT1VOVAkJKDIpCi0KLSNkZWZpbmUgQVVEX0VPU19TRVQgIDB4MDEKLSNkZWZpbmUgVFVOTkVMX01PREUgICAgIDB4MDAwMAotI2RlZmluZSBOT05fVFVOTkVMX01PREUgMHgwMDAxCi0KLSNkZWZpbmUgTk9fQlVGX0FMTE9DCTB4MDAKLSNkZWZpbmUgQlVGX0FMTE9DX0lOICAgIDB4MDEKLSNkZWZpbmUgQlVGX0FMTE9DX09VVCAgIDB4MDIKLSNkZWZpbmUgQlVGX0FMTE9DX0lOT1VUIDB4MDMKLSNkZWZpbmUgQUxJR05fQlVGX1NJWkUoc2l6ZSkgKChzaXplICsgNDA5NSkgJiAofjQwOTUpKQotCi1zdHJ1Y3QgdGltZXN0YW1wIHsKLQl1MzIgbG93cGFydDsKLQl1MzIgaGlnaHBhcnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbWV0YV9pbiB7Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCXN0cnVjdCB0aW1lc3RhbXAgbnRpbWVzdGFtcDsKLQl1bnNpZ25lZCBpbnQgbmZsYWdzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG1ldGFfb3V0X2RzcCB7Ci0JdTMyIG9mZnNldF90b19mcmFtZTsKLQl1MzIgZnJhbWVfc2l6ZTsKLQl1MzIgZW5jb2RlZF9wY21fc2FtcGxlczsKLQl1MzIgbXN3X3RzOwotCXUzMiBsc3dfdHM7Ci0JdTMyIG5mbGFnczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtZXRhX291dCB7Ci0JdW5zaWduZWQgY2hhciBudW1fb2ZfZnJhbWVzOwotCXN0cnVjdCBtZXRhX291dF9kc3AgbWV0YV9vdXRfZHNwW107Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcTZhdWRpb19pbiB7Ci0Jc3BpbmxvY2tfdAkJCWRzcF9sb2NrOwotCWF0b21pY190CQkJaW5fYnl0ZXM7Ci0JYXRvbWljX3QJCQlpbl9zYW1wbGVzOwotCi0Jc3RydWN0IG11dGV4CQkJbG9jazsKLQlzdHJ1Y3QgbXV0ZXgJCQlyZWFkX2xvY2s7Ci0Jc3RydWN0IG11dGV4CQkJd3JpdGVfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdAkJcmVhZF93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90CQl3cml0ZV93YWl0OwotCi0Jc3RydWN0IGF1ZGlvX2NsaWVudCAgICAgICAgICAgICAqYWM7Ci0Jc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnICBzdHJfY2ZnOwotCXZvaWQJCQkJKmVuY19jZmc7Ci0Jc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnICAgICAgICBidWZfY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnCQlwY21fY2ZnOwotCXZvaWQJCQkJKmNvZGVjX2NmZzsKLQotCS8qIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byByZWFkL3dyaXRlICovCi0JYXRvbWljX3QJCQlpbl9jb3VudDsKLQlhdG9taWNfdAkJCW91dF9jb3VudDsKLQotCS8qIGZpcnN0IGlkeDogbnVtIG9mIGZyYW1lcyBwZXIgYnVmLCBzZWNvbmQgaWR4OiBvZmZzZXQgdG8gZnJhbWUgKi8KLQl1aW50MzJfdAkJCW91dF9mcmFtZV9pbmZvW0ZSQU1FX05VTV1bMl07Ci0JaW50CQkJCWVvc19yc3A7Ci0JaW50CQkJCW9wZW5lZDsKLQlpbnQJCQkJZW5hYmxlZDsKLQlpbnQJCQkJc3RvcHBlZDsKLQlpbnQJCQkJZXZlbnRfYWJvcnQ7Ci0JaW50CQkJCWZlZWRiYWNrOyAvKiBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHVzZWQKLQkJCQkJCSAgICogaW4gTm9uIFR1bm5lbCBtb2RlCi0JCQkJCQkgICAqLwotCWludAkJCQlyZmx1c2g7Ci0JaW50CQkJCXdmbHVzaDsKLQlpbnQJCQkJYnVmX2FsbG9jOwotCXVpbnQxNl90CQkJbWluX2ZyYW1lX3NpemU7Ci0JdWludDE2X3QJCQltYXhfZnJhbWVzX3Blcl9idWY7Ci0JYm9vbAkJCQlyZXNldF9ldmVudDsKLQlsb25nICgqZW5jX2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotCWxvbmcgKCplbmNfY29tcGF0X2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotfTsKLQotaW50IGF1ZGlvX2luX2VuYWJsZShzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvKTsKLWludCBhdWRpb19pbl9kaXNhYmxlKHN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8pOwotaW50IGF1ZGlvX2luX2J1Zl9hbGxvYyhzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8pOwotbG9uZyBhdWRpb19pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotI2lmZGVmIENPTkZJR19DT01QQVQKLWxvbmcgYXVkaW9faW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci0jZWxzZQotI2RlZmluZSBhdWRpb19pbl9jb21wYXRfaW9jdGwgTlVMTAotI2VuZGlmCi1zc2l6ZV90IGF1ZGlvX2luX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpOwotc3NpemVfdCBhdWRpb19pbl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcyk7Ci1pbnQgYXVkaW9faW5fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1pbnQgYXVkaW9faW5fc2V0X2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IG1zbV9hdWRpb19jb25maWcgKmNmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlsc19haW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDRhNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotI2lmZGVmIENPTkZJR19VU0VfREVWX0NUUkxfVk9MVU1FCi0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19kZXZfY3RsLmg+Ci0jZW5kaWYgLypDT05GSUdfVVNFX0RFVl9DVFJMX1ZPTFVNRSovCi1zdGF0aWMgREVGSU5FX01VVEVYKGxvY2spOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCi1pbnQgYXVkaW9fYWlvX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3NpemVfdCBhdWRpb19haW9fZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljb25zdCBpbnQgZGVidWdfYnVmbWF4ID0gNDA5NjsKLQlzdGF0aWMgY2hhciBidWZmZXJbNDA5Nl07Ci0JaW50IG4gPSAwOwotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW87Ci0KLQltdXRleF9sb2NrKCZsb2NrKTsKLQlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpIHsKLQkJYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJbiA9IHNjbnByaW50ZihidWZmZXIsIGRlYnVnX2J1Zm1heCwgIm9wZW5lZCAlZFxuIiwKLQkJCQlhdWRpby0+b3BlbmVkKTsKLQkJbiArPSBzY25wcmludGYoYnVmZmVyICsgbiwgZGVidWdfYnVmbWF4IC0gbiwKLQkJCQkiZW5hYmxlZCAlZFxuIiwgYXVkaW8tPmVuYWJsZWQpOwotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJzdG9wcGVkICVkXG4iLCBhdWRpby0+c3RvcHBlZCk7Ci0JCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCi0JCQkJImZlZWRiYWNrICVkXG4iLCBhdWRpby0+ZmVlZGJhY2spOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJLyogRm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgb25seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB3aGVuCi0JCSAqIHdoZW4gcGxheWJhY2sgaGFsdHMgdW5leHBlY3RlZGx5LiBUaHVzLCBubyBtdXR1YWwgZXhjbHVzaW9uCi0JCSAqIGVuZm9yY2VkCi0JCSAqLwotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJ3Zmx1c2ggJWRcbiIsIGF1ZGlvLT53Zmx1c2gpOwotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJyZmx1c2ggJWRcbiIsIGF1ZGlvLT5yZmx1c2gpOwotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJpbnF1ZXVlIGVtcHR5ICVkXG4iLAotCQkJCWxpc3RfZW1wdHkoJmF1ZGlvLT5pbl9xdWV1ZSkpOwotCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLAotCQkJCSJvdXRxdWV1ZSBlbXB0eSAlZFxuIiwKLQkJCQlsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSk7Ci0JfQotCW11dGV4X3VubG9jaygmbG9jayk7Ci0JYnVmZmVyW25dID0gMDsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLCBuKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgbG9uZyBhdWRpb19haW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBsb25nIGF1ZGlvX2Fpb19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotI2Vsc2UKLSNkZWZpbmUgYXVkaW9fYWlvX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLWludCBpbnNlcnRfZW9zX2J1ZihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAotCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZSkKLXsKLQlzdHJ1Y3QgZGVjX21ldGFfb3V0ICplb3NfYnVmID0gYnVmX25vZGUtPmt2YWRkcjsKLQotCXByX2RlYnVnKCIlc1slcEtdOmluc2VydF9lb3NfYnVmXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCWVvc19idWYtPm51bV9vZl9mcmFtZXMgPSAweEZGRkZGRkZGOwotCWVvc19idWYtPm1ldGFfb3V0X2RzcFswXS5vZmZzZXRfdG9fZnJhbWUgPSAweDA7Ci0JZW9zX2J1Zi0+bWV0YV9vdXRfZHNwWzBdLm5mbGFncyA9IEFVRElPX0RFQ19FT1NfU0VUOwotCXJldHVybiBzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCkgKwotCQlzaXplb2YoZW9zX2J1Zi0+bWV0YV9vdXRfZHNwWzBdKTsKLX0KLQotLyogUm91dGluZSB3aGljaCB1cGRhdGVzIHJlYWQgYnVmZmVycyBvZiBkcml2ZXIvZHNwLAotICogZm9yIGZsdXNoIG9wZXJhdGlvbiBhcyBEU1Agb3V0cHV0IG1pZ2h0IG5vdCBoYXZlIHByb3BlcgotICogdmFsdWUgc2V0Ci0gKi8KLXN0YXRpYyBpbnQgaW5zZXJ0X21ldGFfZGF0YV9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAotCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlKQotewotCXN0cnVjdCBkZWNfbWV0YV9vdXQgKm1ldGFfZGF0YSA9IGJ1Zl9ub2RlLT5rdmFkZHI7Ci0KLQltZXRhX2RhdGEtPm51bV9vZl9mcmFtZXMgPSAweDA7Ci0JbWV0YV9kYXRhLT5tZXRhX291dF9kc3BbMF0ub2Zmc2V0X3RvX2ZyYW1lID0gMHgwOwotCW1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLm5mbGFncyA9IDB4MDsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpICsKLQkJc2l6ZW9mKG1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9faW9uX2xvb2t1cF92YWRkcihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB2b2lkICphZGRyLAotCQkJCQl1bnNpZ25lZCBsb25nIGxlbiwKLQkJCQkJc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uICoqcmVnaW9uKQotewotCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQotCWludCBtYXRjaF9jb3VudCA9IDA7Ci0KLQkqcmVnaW9uID0gTlVMTDsKLQotCS8qIHJldHVybnMgcGh5c2ljYWwgYWRkcmVzcyBvciB6ZXJvICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKGFkZHIgPj0gcmVnaW9uX2VsdC0+dmFkZHIgJiYKLQkJCWFkZHIgPCByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkJYWRkciArIGxlbiA8PSByZWdpb25fZWx0LT52YWRkciArIHJlZ2lvbl9lbHQtPmxlbiAmJgotCQkJYWRkciArIGxlbiA+IGFkZHIpIHsKLQkJCS8qIHRvIGF2b2lkIGludGVnZXIgYWRkaXRpb24gb3ZlcmZsb3cgKi8KLQotCQkJLyogb2Zmc2V0IHNpbmNlIHdlIGNvdWxkIHBhc3MgdmFkZHIgaW5zaWRlIGEgcmVnaXN0ZXJlZAotCQkJICogaW9uIGJ1ZmZlcgotCQkJICovCi0KLQkJCW1hdGNoX2NvdW50Kys7Ci0JCQlpZiAoISpyZWdpb24pCi0JCQkJKnJlZ2lvbiA9IHJlZ2lvbl9lbHQ7Ci0JCX0KLQl9Ci0KLQlpZiAobWF0Y2hfY291bnQgPiAxKSB7Ci0JCXByX2VycigiJXNbJXBLXTptdWx0aXBsZSBoaXRzIGZvciB2YWRkciAlcEssIGxlbiAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGFkZHIsIGxlbik7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocmVnaW9uX2VsdCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlLAotCQkJCQlsaXN0KSB7Ci0JCQlpZiAoYWRkciA+PSByZWdpb25fZWx0LT52YWRkciAmJgotCQkJYWRkciA8IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuICYmCi0JCQlhZGRyICsgbGVuIDw9IHJlZ2lvbl9lbHQtPnZhZGRyICsgcmVnaW9uX2VsdC0+bGVuICYmCi0JCQlhZGRyICsgbGVuID4gYWRkcikKLQkJCQlwcl9lcnIoIlx0JXNbJXBLXTolcEssICVsZCAtLT4gJXBLXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sCi0JCQkJCXJlZ2lvbl9lbHQtPnZhZGRyLAotCQkJCQlyZWdpb25fZWx0LT5sZW4sCi0JCQkJCSZyZWdpb25fZWx0LT5wYWRkcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKnJlZ2lvbiA/IDAgOiAtMTsKLX0KLQotc3RhdGljIHBoeXNfYWRkcl90IGF1ZGlvX2Fpb19pb25fZml4dXAoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdm9pZCAqYWRkciwKLQkJCQl1bnNpZ25lZCBsb25nIGxlbiwgaW50IHJlZl91cCwgdm9pZCAqKmt2YWRkcikKLXsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlwaHlzX2FkZHJfdCBwYWRkcjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXVkaW9fYWlvX2lvbl9sb29rdXBfdmFkZHIoYXVkaW8sIGFkZHIsIGxlbiwgJnJlZ2lvbik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzWyVwS106bG9va3VwICglcEssICVsZCkgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbywgYWRkciwgbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChyZWZfdXApCi0JCXJlZ2lvbi0+cmVmX2NudCsrOwotCWVsc2UKLQkJcmVnaW9uLT5yZWZfY250LS07Ci0JcHJfZGVidWcoIiVzWyVwS106Zm91bmQgcmVnaW9uICVwSyByZWZfY250ICVkXG4iLAotCQkJX19mdW5jX18sIGF1ZGlvLCByZWdpb24sIHJlZ2lvbi0+cmVmX2NudCk7Ci0JcGFkZHIgPSByZWdpb24tPnBhZGRyICsgKGFkZHIgLSByZWdpb24tPnZhZGRyKTsKLQkvKiBwcm92aWRlIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyBtZXRhIGluZm9ybWF0aW9uICovCi0JaWYgKGt2YWRkcikKLQkJKmt2YWRkciA9ICh2b2lkICopIChyZWdpb24tPmt2YWRkciArIChhZGRyIC0gcmVnaW9uLT52YWRkcikpOwotCXJldHVybiBwYWRkcjsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9fcGF1c2Uoc3RydWN0IHE2YXVkaW9fYWlvICAqYXVkaW8pCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCXByX2RlYnVnKCIlc1slcEtdLCBlbmFibGVkID0gJWRcbiIsIF9fZnVuY19fLCBhdWRpbywKLQkJCWF1ZGlvLT5lbmFibGVkKTsKLQlpZiAoYXVkaW8tPmVuYWJsZWQpIHsKLQkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfUEFVU0UpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlc1slcEtdOiBwYXVzZSBjbWQgZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOwotCi0JCWlmIChyYyA9PSAwKSB7Ci0JCQkvKiBTZW5kIHN1c3BlbmQgb25seSBpZiBwYXVzZSB3YXMgc3VjY2Vzc2Z1bCAqLwotCQkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfU1VTUEVORCk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXByX2VycigiJXNbJXBLXTogc3VzcGVuZCBjbWQgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzWyVwS106IG5vdCBzZW5kaW5nIHN1c3BlbmQgc2luY2UgcGF1c2UgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0KLQl9IGVsc2UKLQkJcHJfZXJyKCIlc1slcEtdOiBEcml2ZXIgbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2Fpb19mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGF1ZGlvLT5lbmFibGVkKSB7Ci0JCS8qIEltcGxpY2l0bHkgaXNzdWUgYSBwYXVzZSB0byB0aGUgZGVjb2RlciBiZWZvcmUgZmx1c2hpbmcgaWYKLQkJICogaXQgaXMgbm90IGluIHBhdXNlIHN0YXRlCi0JCSAqLwotCQlpZiAoIShhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX1BBVVNFKSkgewotCQkJcmMgPSBhdWRpb19haW9fcGF1c2UoYXVkaW8pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIiVzWyVwS306IHBhdXNlIGNtZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCQkJcmMpOwotCQkJZWxzZQotCQkJCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX1BBVVNFOwotCQl9Ci0JCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0ZMVVNIKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXNbJXBLXTogZmx1c2ggY21kIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJLyogTm90IGluIHN0b3Agc3RhdGUsIHJlZW5hYmxlIHRoZSBzdHJlYW0gKi8KLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDApIHsKLQkJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCQlpZiAocmMpCi0JCQkJcHJfZXJyKCIlc1slcEtdOmF1ZGlvIHJlLWVuYWJsZSBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQllbHNlIHsKLQkJCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfUEFVU0UpCi0JCQkJCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19QQVVTRTsKLQkJCX0KLQkJfQotCX0KLQlwcl9kZWJ1ZygiJXNbJXBLXTppbl9ieXRlcyAlZFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcykpOwotCXByX2RlYnVnKCIlc1slcEtdOmluX3NhbXBsZXMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcykpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9ieXRlcywgMCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPmluX3NhbXBsZXMsIDApOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9fb3V0cG9ydF9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCWludCByYzsKLQotCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX09VVF9GTFVTSCk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCIlc1slcEt9OiBvdXRwdXQgcG9ydCBmbHVzaCBjbWQgZmFpbGVkIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKiBXcml0ZSBidWZmZXIgdG8gRFNQIC8gSGFuZGxlIEFjayBmcm9tIERTUCAqLwotdm9pZCBhdWRpb19haW9fYXN5bmNfd3JpdGVfYWNrKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIHVpbnQzMl90IHRva2VuLAotCQkJCXVpbnQzMl90ICpwYXlsb2FkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZXZlbnRfcGF5bG9hZDsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICp1c2VkX2J1ZjsKLQotCS8qIE5vIGFjdGl2ZSBmbHVzaCBpbiBwcm9ncmVzcyAqLwotCWlmIChhdWRpby0+d2ZsdXNoKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JaWYgKGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKSB7Ci0JCXByX3dhcm4oIiVzOiBpZ25vcmUgdW5leHBlY3RlZCBldmVudCBmcm9tIGRzcFxuIiwgX19mdW5jX18pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQl1c2VkX2J1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5vdXRfcXVldWUsCi0JCQkJCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUsIGxpc3QpOwotCWlmICh0b2tlbiA9PSB1c2VkX2J1Zi0+dG9rZW4pIHsKLQkJbGlzdF9kZWwoJnVzZWRfYnVmLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCXByX2RlYnVnKCIlc1slcEtdOmNvbnN1bWVkIGJ1ZmZlclxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmID0gdXNlZF9idWYtPmJ1ZjsKLQkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCi0JCQkJCWV2ZW50X3BheWxvYWQpOwotCQlrZnJlZSh1c2VkX2J1Zik7Ci0JCWlmIChsaXN0X2VtcHR5KCZhdWRpby0+b3V0X3F1ZXVlKSAmJgotCQkJKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpKSB7Ci0JCQlwcl9kZWJ1ZygiJXNbJXBLXTogbGlzdCBpcyBlbXB0eSwgcmVhY2hlZCBFT1MgaW4gVHVubmVsXG4iLAotCQkJCSBfX2Z1bmNfXywgYXVkaW8pOwotCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlc1slcEtdOmV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgdXNlZF9idWYtPnRva2VuLCB0b2tlbik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIGF1ZGlvX2Fpb19hc3luY19vdXRfZmx1c2goc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlc1slcEt9XG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCS8qIEVPUyBmb2xsb3dlZCBieSBmbHVzaCwgRU9TIHJlc3BvbnNlIG5vdCBndXJhbnRlZWQsIGZyZWUgRU9TIGkvcAotCSAqIGJ1ZmZlcgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQotCWlmIChhdWRpby0+ZW9zX2ZsYWcgJiYgKGF1ZGlvLT5lb3Nfd3JpdGVfcGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyKSkgewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogRU9TIGZvbGxvd2VkIGJ5IGZsdXNoIHJlY2VpdmVkLGFja25vd2xlZGdlIGVvcyBpL3AgYnVmZmVyIGltbWVkaWF0ZWx5XG4iLAotCQkJX19mdW5jX18sIGF1ZGlvKTsKLQkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1dSSVRFX0RPTkUsCi0JCQkJYXVkaW8tPmVvc193cml0ZV9wYXlsb2FkKTsKLQkJbWVtc2V0KCZhdWRpby0+ZW9zX3dyaXRlX3BheWxvYWQsIDAsCi0JCQlzaXplb2YodW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5vdXRfcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCWF1ZGlvX2Fpb19wb3N0X2V2ZW50KGF1ZGlvLCBBVURJT19FVkVOVF9XUklURV9ET05FLCBwYXlsb2FkKTsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlwcl9kZWJ1ZygiJXNbJXBLXTogUHJvcGFnYXRlIFdSSVRFX0RPTkUgZHVyaW5nIGZsdXNoXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JfQotfQotCi12b2lkIGF1ZGlvX2Fpb19hc3luY19pbl9mbHVzaChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLQotCXByX2RlYnVnKCIlc1slcEtdXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW5fcXVldWUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCS8qIEZvcmNlZnVsbCBzZW5kIG8vcCBlb3MgYnVmZmVyIGFmdGVyIGZsdXNoLCBpZiBubyBlb3MgcmVzcG9uc2UKLQkJICogcmVjZWl2ZWQgYnkgZHNwIGV2ZW4gYWZ0ZXIgc2VuZGluZyBlb3MgY29tbWFuZAotCQkgKi8KLQkJaWYgKChhdWRpby0+ZW9zX3JzcCAhPSAxKSAmJiBhdWRpby0+ZW9zX2ZsYWcpIHsKLQkJCXByX2RlYnVnKCIlc1slcEtdOiBzZW5kIGVvcyBvbiBvL3AgYnVmZmVyIGR1cmluZyBmbHVzaFxuIiwKLQkJCQkgX19mdW5jX18sIGF1ZGlvKTsKLQkJCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCQlwYXlsb2FkLmFpb19idWYuZGF0YV9sZW4gPQotCQkJCQlpbnNlcnRfZW9zX2J1ZihhdWRpbywgYnVmX25vZGUpOwotCQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJfSBlbHNlIHsKLQkJCXBheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCQlwYXlsb2FkLmFpb19idWYuZGF0YV9sZW4gPQotCQkJCQlpbnNlcnRfbWV0YV9kYXRhX2ZsdXNoKGF1ZGlvLCBidWZfbm9kZSk7Ci0JCX0KLQkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sIEFVRElPX0VWRU5UX1JFQURfRE9ORSwgcGF5bG9hZCk7Ci0JCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJcHJfZGVidWcoIiVzWyVwS106IFByb3BhZ2F0ZSBSRUFEX0RPTkUgZHVyaW5nIGZsdXNoXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JfQotfQotCi1pbnQgYXVkaW9fYWlvX2VuYWJsZShzdHJ1Y3QgcTZhdWRpb19haW8gICphdWRpbykKLXsKLQkvKiAybmQgYXJnOiAwIC0+IHJ1biBpbW1lZGlhdGVseQotCSAqIDNyZCBhcmc6IDAgLT4gbXN3X3RzLAotCSAqIDR0aCBhcmc6IDAgLT5sc3dfdHMKLQkgKi8KLQlyZXR1cm4gcTZhc21fcnVuKGF1ZGlvLT5hYywgMHgwMCwgMHgwMCwgMHgwMCk7Ci19Ci0KLWludCBhdWRpb19haW9fZGlzYWJsZShzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoYXVkaW8tPm9wZW5lZCkgewotCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCWF1ZGlvLT5vcGVuZWQgPSAwOwotCQlwcl9kZWJ1ZygiJXNbJXBLXTogaW5ieXRlc1slZF0gaW5zYW1wbGVzWyVkXVxuIiwgX19mdW5jX18sCi0JCQlhdWRpbywgYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyksCi0JCQlhdG9taWNfcmVhZCgmYXVkaW8tPmluX3NhbXBsZXMpKTsKLQkJLyogQ2xvc2UgdGhlIHNlc3Npb24gKi8KLQkJcmMgPSBxNmFzbV9jbWQoYXVkaW8tPmFjLCBDTURfQ0xPU0UpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlc1slcEtdOkZhaWxlZCB0byBjbG9zZSB0aGUgc2Vzc2lvbiByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT5jbWRfd2FpdCk7Ci0JfQotCXByX2RlYnVnKCIlc1slcEtdOmVuYWJsZWRbJWRdXG4iLCBfX2Z1bmNfXywgYXVkaW8sIGF1ZGlvLT5lbmFibGVkKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgYXVkaW9fYWlvX3Jlc2V0X2lvbl9yZWdpb24oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKSB7Ci0JCXJlZ2lvbiA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24sIGxpc3QpOwotCQlsaXN0X2RlbCgmcmVnaW9uLT5saXN0KTsKLQkJbXNtX2F1ZGlvX2lvbl9mcmVlX2xlZ2FjeShhdWRpby0+Y2xpZW50LCByZWdpb24tPmhhbmRsZSk7Ci0JCWtmcmVlKHJlZ2lvbik7Ci0JfQotfQotCi12b2lkIGF1ZGlvX2Fpb19yZXNldF9ldmVudF9xdWV1ZShzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGF1ZGlvX2Fpb19ldmVudCAqZHJ2X2V2dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5ldmVudF9xdWV1ZSkgewotCQlkcnZfZXZ0ID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmV2ZW50X3F1ZXVlLAotCQkJCSAgIHN0cnVjdCBhdWRpb19haW9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpIHsKLQkJZHJ2X2V2dCA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCSAgIHN0cnVjdCBhdWRpb19haW9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JCWtmcmVlKGRydl9ldnQpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19haW9fdW5tYXBfaW9uX3JlZ2lvbihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCXByX2RlYnVnKCIlc1slcEtdOlxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUpIHsKLQkJcmVnaW9uID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiwgbGlzdCk7Ci0JCWlmIChyZWdpb24gIT0gTlVMTCkgewotCQkJcHJfZGVidWcoIiVzWyVwS106IHBoeV9hZGRyZXNzID0gMHglcEtcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLCAmcmVnaW9uLT5wYWRkcik7Ci0JCQlyYyA9IHE2YXNtX21lbW9yeV91bm1hcChhdWRpby0+YWMsCi0JCQkJCQlyZWdpb24tPnBhZGRyLCBJTik7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXByX2VycigiJXNbJXBLXTogbWVtb3J5IHVubWFwIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvKTsKLQkJfQotCX0KLX0KLQotI2lmZGVmIENPTkZJR19VU0VfREVWX0NUUkxfVk9MVU1FCi0KLXN0YXRpYyB2b2lkIGF1ZGlvX2Fpb19saXN0bmVyKHUzMiBldnRfaWQsIHVuaW9uIGF1ZGRldl9ldnRfZGF0YSAqZXZ0X3BheWxvYWQsCi0JCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IChzdHJ1Y3QgcTZhdWRpb19haW8gKikgcHJpdmF0ZV9kYXRhOwotCWludCByYyAgPSAwOwotCi0Jc3dpdGNoIChldnRfaWQpIHsKLQljYXNlIEFVRERFVl9FVlRfU1RSRUFNX1ZPTF9DSEc6Ci0JCWF1ZGlvLT52b2x1bWUgPSBldnRfcGF5bG9hZC0+c2Vzc2lvbl92b2w7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBBVURERVZfRVZUX1NUUkVBTV9WT0xfQ0hHLCBzdHJlYW0gdm9sICVkLCBlbmFibGVkID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGF1ZGlvLT52b2x1bWUsIGF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5lbmFibGVkID09IDEpIHsKLQkJCWlmIChhdWRpby0+YWMpIHsKLQkJCQlyYyA9IHE2YXNtX3NldF92b2x1bWUoYXVkaW8tPmFjLCBhdWRpby0+dm9sdW1lKTsKLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCXByX2VycigiJXNbJXBLXTogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlc1slcEtdOkVSUk9SOndyb25nIGV2ZW50XG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlicmVhazsKLQl9Ci19Ci0KLWludCByZWdpc3Rlcl92b2x1bWVfbGlzdGVuZXIoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlpbnQgcmMgID0gMDsKLQotCWF1ZGlvLT5kZXZpY2VfZXZlbnRzID0gQVVEREVWX0VWVF9TVFJFQU1fVk9MX0NIRzsKLQlhdWRpby0+ZHJ2X3N0YXR1cyAmPSB+QURSVl9TVEFUVVNfUEFVU0U7Ci0KLQlyYyA9IGF1ZGRldl9yZWdpc3Rlcl9ldnRfbGlzdG5lcihhdWRpby0+ZGV2aWNlX2V2ZW50cywKLQkJCQkJQVVEREVWX0NMTlRfREVDLAotCQkJCQlhdWRpby0+YWMtPnNlc3Npb24sCi0JCQkJCWF1ZGlvX2Fpb19saXN0bmVyLAotCQkJCQkodm9pZCAqKWF1ZGlvKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXNbJXBLXTogRXZlbnQgbGlzdGVuZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JfQotCXJldHVybiByYzsKLX0KLXZvaWQgdW5yZWdpc3Rlcl92b2x1bWVfbGlzdGVuZXIoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlhdWRkZXZfdW5yZWdpc3Rlcl9ldnRfbGlzdG5lcihBVURERVZfQ0xOVF9ERUMsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci19Ci0KLWludCBlbmFibGVfdm9sdW1lX3JhbXAoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhc21fc29mdHBhdXNlX3BhcmFtcyBzb2Z0cGF1c2U7Ci0Jc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyBzb2Z0dm9sOwotCi0JaWYgKGF1ZGlvLT5hYyA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlwcl9kZWJ1ZygiJXNbJXBLXVxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQlzb2Z0cGF1c2UuZW5hYmxlID0gU09GVF9QQVVTRV9FTkFCTEU7Ci0Jc29mdHBhdXNlLnBlcmlvZCA9IFNPRlRfUEFVU0VfUEVSSU9EOwotCXNvZnRwYXVzZS5zdGVwID0gU09GVF9QQVVTRV9TVEVQOwotCXNvZnRwYXVzZS5yYW1waW5nY3VydmUgPSBTT0ZUX1BBVVNFX0NVUlZFX0xJTkVBUjsKLQotCXNvZnR2b2wucGVyaW9kID0gU09GVF9WT0xVTUVfUEVSSU9EOwotCXNvZnR2b2wuc3RlcCA9IFNPRlRfVk9MVU1FX1NURVA7Ci0Jc29mdHZvbC5yYW1waW5nY3VydmUgPSBTT0ZUX1ZPTFVNRV9DVVJWRV9MSU5FQVI7Ci0KLQlpZiAoc29mdHBhdXNlLnJhbXBpbmdjdXJ2ZSA9PSBTT0ZUX1BBVVNFX0NVUlZFX0xJTkVBUikKLQkJc29mdHBhdXNlLnN0ZXAgPSBTT0ZUX1BBVVNFX1NURVBfTElORUFSOwotCWlmIChzb2Z0dm9sLnJhbXBpbmdjdXJ2ZSA9PSBTT0ZUX1ZPTFVNRV9DVVJWRV9MSU5FQVIpCi0JCXNvZnR2b2wuc3RlcCA9IFNPRlRfVk9MVU1FX1NURVBfTElORUFSOwotCXJjID0gcTZhc21fc2V0X3ZvbHVtZShhdWRpby0+YWMsIGF1ZGlvLT52b2x1bWUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXJjID0gcTZhc21fc2V0X3NvZnRwYXVzZShhdWRpby0+YWMsICZzb2Z0cGF1c2UpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0UGF1c2UgUGFyYW0gZmFpbGVkIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlyYyA9IHE2YXNtX3NldF9zb2Z0dm9sdW1lKGF1ZGlvLT5hYywgJnNvZnR2b2wpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0Vm9sdW1lIFBhcmFtIGZhaWxlZCByYz0lZFxuIiwKLQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQkvKiBkaXNhYmxlIG11dGUgYnkgZGVmYXVsdCAqLwotCXJjID0gcTZhc21fc2V0X211dGUoYXVkaW8tPmFjLCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IFNlbmQgbXV0ZSBjb21tYW5kIGZhaWxlZCByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jZWxzZSAvKkNPTkZJR19VU0VfREVWX0NUUkxfVk9MVU1FKi8KLWludCByZWdpc3Rlcl92b2x1bWVfbGlzdGVuZXIoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlyZXR1cm4gMDsvKiBkbyBub3RoaW5nICovCi19Ci12b2lkIHVucmVnaXN0ZXJfdm9sdW1lX2xpc3RlbmVyKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pCi17Ci0JcmV0dXJuOy8qIGRvIG5vdGhpbmcgKi8KLX0KLWludCBlbmFibGVfdm9sdW1lX3JhbXAoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQlyZXR1cm4gMDsgLyogZG8gbm90aGluZyAqLwotfQotI2VuZGlmIC8qQ09ORklHX1VTRV9ERVZfQ1RSTF9WT0xVTUUqLwotCi1pbnQgYXVkaW9fYWlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXByX2RlYnVnKCIlc1slcEtdXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCW11dGV4X2xvY2soJmxvY2spOwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JYXVkaW8tPndmbHVzaCA9IDE7Ci0JaWYgKGF1ZGlvLT53YWtlbG9ja192b3RlZCAmJgotCQkoYXVkaW8tPmF1ZGlvX3dzX21nciAhPSBOVUxMKSAmJgotCQkoYXVkaW8tPm1pc2NkZXZpY2UgIT0gTlVMTCkpIHsKLQkJYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gZmFsc2U7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5hdWRpb193c19tZ3ItPndzX2xvY2spOwotCQlpZiAoKGF1ZGlvLT5hdWRpb193c19tZ3ItPnJlZl9jbnQgPiAwKSAmJgotCQkJCSgtLWF1ZGlvLT5hdWRpb193c19tZ3ItPnJlZl9jbnQgPT0gMCkpIHsKLQkJCXBtX3JlbGF4KGF1ZGlvLT5taXNjZGV2aWNlLT50aGlzX2RldmljZSk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+YXVkaW9fd3NfbWdyLT53c19sb2NrKTsKLQl9Ci0JaWYgKGF1ZGlvLT5lbmFibGVkKQotCQlhdWRpb19haW9fZmx1c2goYXVkaW8pOwotCWF1ZGlvLT53Zmx1c2ggPSAwOwotCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JYXVkaW8tPmRydl9vcHMuaW5fZmx1c2goYXVkaW8pOwotCWF1ZGlvX2Fpb19kaXNhYmxlKGF1ZGlvKTsKLQlhdWRpb19haW9fdW5tYXBfaW9uX3JlZ2lvbihhdWRpbyk7Ci0JYXVkaW9fYWlvX3Jlc2V0X2lvbl9yZWdpb24oYXVkaW8pOwotCW1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koYXVkaW8tPmNsaWVudCk7Ci0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQl3YWtlX3VwKCZhdWRpby0+ZXZlbnRfd2FpdCk7Ci0JYXVkaW9fYWlvX3Jlc2V0X2V2ZW50X3F1ZXVlKGF1ZGlvKTsKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmYXVkaW8tPmxvY2spOwotCW11dGV4X2Rlc3Ryb3koJmF1ZGlvLT5yZWFkX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZhdWRpby0+Z2V0X2V2ZW50X2xvY2spOwotCXVucmVnaXN0ZXJfdm9sdW1lX2xpc3RlbmVyKGF1ZGlvKTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCWRlYnVnZnNfcmVtb3ZlKGF1ZGlvLT5kZW50cnkpOwotI2VuZGlmCi0Ja2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGF1ZGlvX2Fpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFhdWRpby0+ZW5hYmxlZCB8fCBhdWRpby0+ZmVlZGJhY2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQmxvY2tpbmcgY2xpZW50IHNlbmRzIG1vcmUgZGF0YSAqLwotCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQlhdWRpby0+ZHJ2X3N0YXR1cyB8PSBBRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCXByX2RlYnVnKCIlc1slcEtdOlxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQotCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQotCXByX2RlYnVnKCIlc1slcEtdV2FpdCBmb3Igd3JpdGUgZG9uZSBmcm9tIERTUFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJKGxpc3RfZW1wdHkoJmF1ZGlvLT5vdXRfcXVldWUpKSB8fAotCQkJCQlhdWRpby0+d2ZsdXNoIHx8IGF1ZGlvLT5zdG9wcGVkKTsKLQotCWlmIChhdWRpby0+c3RvcHBlZCB8fCBhdWRpby0+d2ZsdXNoKSB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBBdWRpbyBGbHVzaGVkIG9yIFN0b3BwZWQsdGhpcyBpcyBub3QgRU9TXG4iCi0JCQksIF9fZnVuY19fLCBhdWRpbyk7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAwOwotCQlyYyA9IC1FQlVTWTsKLQl9Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXNbJXBLXTogd2FpdCBldmVudCBmb3IgbGlzdF9lbXB0eSBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gcTZhc21fY21kKGF1ZGlvLT5hYywgQ01EX0VPUyk7Ci0JcHJfZGVidWcoIiVzWyVwS106IEVPUyBjbWQgc2VudCB0byBEU1BcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0KLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzWyVwS106IHE2YXNtX2NtZCBmYWlsZWQsIHJjID0gJWQiLAotCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7Ci0KLQlwcl9kZWJ1ZygiJXNbJXBLXTogd2FpdCBmb3IgUkVOREVSRURfRU9TIGZyb20gRFNQXG4iCi0JCSwgX19mdW5jX18sIGF1ZGlvKTsKLQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhdWRpby0+d3JpdGVfd2FpdCwKLQkJCQkJKGF1ZGlvLT5lb3NfcnNwIHx8IGF1ZGlvLT53Zmx1c2ggfHwKLQkJCQkJYXVkaW8tPnN0b3BwZWQpKTsKLQotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlc1slcEtdOiB3YWl0IGV2ZW50IGZvciBlb3NfcnNwIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGF1ZGlvLT5zdG9wcGVkIHx8IGF1ZGlvLT53Zmx1c2gpIHsKLQkJYXVkaW8tPndmbHVzaCA9IDA7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBBdWRpbyBGbHVzaGVkIG9yIFN0b3BwZWQsdGhpcyBpcyBub3QgRU9TXG4iCi0JCQksIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gLUVCVVNZOwotCX0KLQotCWlmIChhdWRpby0+ZW9zX3JzcCA9PSAxKQotCQlwcl9kZWJ1ZygiJXNbJXBLXTogRU9TXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCi0KLWRvbmU6Ci0JbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19GU1lOQzsKLQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9fZXZlbnRzX3BlbmRpbmcoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlbXB0eTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCWVtcHR5ID0gIWxpc3RfZW1wdHkoJmF1ZGlvLT5ldmVudF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gZW1wdHkgfHwgYXVkaW8tPmV2ZW50X2Fib3J0IHx8IGF1ZGlvLT5yZXNldF9ldmVudDsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxX2NvbW1vbihzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAotCQkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50ICp1c3JfZXZ0KQotewotCWxvbmcgcmM7Ci0Jc3RydWN0IGF1ZGlvX2Fpb19ldmVudCAqZHJ2X2V2dCA9IE5VTEw7Ci0JaW50IHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXRpbWVvdXQgPSB1c3JfZXZ0LT50aW1lb3V0X21zOwotCi0JaWYgKHRpbWVvdXQgPiAwKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXVkaW8tPmV2ZW50X3dhaXQsCi0JCQkJCQlhdWRpb19haW9fZXZlbnRzX3BlbmRpbmcKLQkJCQkJCShhdWRpbyksCi0JCQkJCQltc2Vjc190b19qaWZmaWVzCi0JCQkJCQkodGltZW91dCkpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGF1ZGlvLT5ldmVudF93YWl0LAotCQlhdWRpb19haW9fZXZlbnRzX3BlbmRpbmcoYXVkaW8pKTsKLQl9Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKGF1ZGlvLT5yZXNldF9ldmVudCkgewotCQlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKLQkJcHJfZXJyKCJJbiBTU1IsIHBvc3QgRU5FVFJFU0VUIGVyclxuIik7Ci0JCXJldHVybiAtRU5FVFJFU0VUOwotCX0KLQotCWlmIChhdWRpby0+ZXZlbnRfYWJvcnQpIHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmMgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZhdWRpby0+ZXZlbnRfcXVldWUpKSB7Ci0JCWRydl9ldnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZXZlbnRfcXVldWUsCi0JCSAgIHN0cnVjdCBhdWRpb19haW9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZHJ2X2V2dC0+bGlzdCk7Ci0JfQotCWlmIChkcnZfZXZ0KSB7Ci0JCXVzcl9ldnQtPmV2ZW50X3R5cGUgPSBkcnZfZXZ0LT5ldmVudF90eXBlOwotCQl1c3JfZXZ0LT5ldmVudF9wYXlsb2FkID0gZHJ2X2V2dC0+cGF5bG9hZDsKLQkJbGlzdF9hZGRfdGFpbCgmZHJ2X2V2dC0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzWyVwS106VW5leHBlY3RlZCBwYXRoXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZXZlbnRfcXVldWVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGRydl9ldnQtPmV2ZW50X3R5cGUgPT0gQVVESU9fRVZFTlRfV1JJVEVfRE9ORSkgewotCQlwcl9kZWJ1ZygiJXNbJXBLXTpwb3N0ZWQgQVVESU9fRVZFTlRfV1JJVEVfRE9ORSB0byB1c2VyXG4iLAotCQkJX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQlhdWRpb19haW9faW9uX2ZpeHVwKGF1ZGlvLCBkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIsCi0JCWRydl9ldnQtPnBheWxvYWQuYWlvX2J1Zi5idWZfbGVuLCAwLCAwKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JfSBlbHNlIGlmIChkcnZfZXZ0LT5ldmVudF90eXBlID09IEFVRElPX0VWRU5UX1JFQURfRE9ORSkgewotCQlwcl9kZWJ1ZygiJXNbJXBLXTpwb3N0ZWQgQVVESU9fRVZFTlRfUkVBRF9ET05FIHRvIHVzZXJcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8pOwotCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJYXVkaW9fYWlvX2lvbl9maXh1cChhdWRpbywgZHJ2X2V2dC0+cGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyLAotCQlkcnZfZXZ0LT5wYXlsb2FkLmFpb19idWYuYnVmX2xlbiwgMCwgMCk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JfQotCi0JLyogU29tZSByZWFkIGJ1ZmZlciBtaWdodCBiZSBoZWxkIHVwIGluIERTUCxyZWxlYXNlIGFsbAotCSAqIE9uY2UgRU9TIGluZGljYXRlZAotCSAqLwotCWlmIChhdWRpby0+ZW9zX3JzcCAmJiAhbGlzdF9lbXB0eSgmYXVkaW8tPmluX3F1ZXVlKSkgewotCQlwcl9kZWJ1ZygiJXNbJXBLXTpTZW5kIGZsdXNoIGNvbW1hbmQgdG8gcmVsZWFzZSByZWFkIGJ1ZmZlcnMgaGVsZCB1cCBpbiBEU1BcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8pOwotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWF1ZGlvX2Fpb19mbHVzaChhdWRpbyk7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCQkJCXZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzcl9ldnQsIGFyZywgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQpKSkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXFfY29tbW9uKGF1ZGlvLCAmdXNyX2V2dCk7Ci0KLQlpZiAoY29weV90b191c2VyKGFyZywgJnVzcl9ldnQsIHNpemVvZih1c3JfZXZ0KSkpIHsKLQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfQotCXJldHVybiByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotc3RydWN0IG1zbV9hdWRpb19haW9fYnVmMzIgewotCWNvbXBhdF91cHRyX3QgYnVmX2FkZHI7Ci0JdTMyIGJ1Zl9sZW47Ci0JdTMyIGRhdGFfbGVuOwotCWNvbXBhdF91cHRyX3QgcHJpdmF0ZV9kYXRhOwotCXUxNiBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2luZm8zMiB7Ci0JdTMyIGNvZGVjX3R5cGU7Ci0JdTMyIGNoYW5faW5mbzsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGJpdF9zdHJlYW1faW5mbzsKLQl1MzIgYml0X3JhdGU7Ci0JdTMyIHVudXNlZFszXTsKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8zMiB7Ci0JdTMyIGRlY19pZDsKLQl1MzIgZXJyX21zZ19pbmRpY2F0b3I7Ci0JdTMyIGVycl90eXBlOwotfTsKLQotdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQzMiB7Ci0Jc3RydWN0IG1zbV9hdWRpb19haW9fYnVmMzIgYWlvX2J1ZjsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvMzIgc3RyZWFtX2luZm87Ci0Jc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1fZXJyb3JfaW5mbzMyIGVycm9yX2luZm87Ci0JczMyIHJlc2VydmVkOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19ldmVudDMyIHsKLQlzMzIgZXZlbnRfdHlwZTsKLQlzMzIgdGltZW91dF9tczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZDMyIGV2ZW50X3BheWxvYWQ7Ci19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXFfY29tcGF0KHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCQkJCXZvaWQgX191c2VyICphcmcpCi17Ci0JbG9uZyByYzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50MzIgdXNyX2V2dF8zMjsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHVzcl9ldnQ7Ci0JbWVtc2V0KCZ1c3JfZXZ0LCAwLCBzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldmVudCkpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1c3JfZXZ0XzMyLCBhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fZXZlbnQzMikpKSB7Ci0JCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JdXNyX2V2dC50aW1lb3V0X21zID0gdXNyX2V2dF8zMi50aW1lb3V0X21zOwotCi0JcmMgPSBhdWRpb19haW9fcHJvY2Vzc19ldmVudF9yZXFfY29tbW9uKGF1ZGlvLCAmdXNyX2V2dCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBwcm9jZXNzIGV2ZW50IGZhaWxlZCwgcmMgPSAlbGQiLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXVzcl9ldnRfMzIuZXZlbnRfdHlwZSA9IHVzcl9ldnQuZXZlbnRfdHlwZTsKLQlzd2l0Y2ggKHVzcl9ldnRfMzIuZXZlbnRfdHlwZSkgewotCWNhc2UgQVVESU9fRVZFTlRfU1VTUEVORDoKLQljYXNlIEFVRElPX0VWRU5UX1JFU1VNRToKLQljYXNlIEFVRElPX0VWRU5UX1dSSVRFX0RPTkU6Ci0JY2FzZSBBVURJT19FVkVOVF9SRUFEX0RPTkU6Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyID0KLQkJCXB0cl90b19jb21wYXQodXNyX2V2dC5ldmVudF9wYXlsb2FkLmFpb19idWYuYnVmX2FkZHIpOwotCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5idWZfbGVuID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5haW9fYnVmLmJ1Zl9sZW47Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuOwotCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5wcml2YXRlX2RhdGEgPQotCQlwdHJfdG9fY29tcGF0KHVzcl9ldnQuZXZlbnRfcGF5bG9hZC5haW9fYnVmLnByaXZhdGVfZGF0YSk7Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5haW9fYnVmLm1maWVsZF9zeiA9Ci0JCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuYWlvX2J1Zi5tZmllbGRfc3o7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fRVZFTlRfU1RSRUFNX0lORk86Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5jb2RlY190eXBlID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5jb2RlY190eXBlOwotCQl1c3JfZXZ0XzMyLmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uY2hhbl9pbmZvID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5jaGFuX2luZm87Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSA9Ci0JCQl1c3JfZXZ0LmV2ZW50X3BheWxvYWQuc3RyZWFtX2luZm8uc2FtcGxlX3JhdGU7Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5iaXRfc3RyZWFtX2luZm8gPQotCQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkLnN0cmVhbV9pbmZvLmJpdF9zdHJlYW1faW5mbzsKLQkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLnN0cmVhbV9pbmZvLmJpdF9yYXRlID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5zdHJlYW1faW5mby5iaXRfcmF0ZTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19FVkVOVF9CSVRTVFJFQU1fRVJST1JfSU5GTzoKLQkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLmVycm9yX2luZm8uZGVjX2lkID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmRlY19pZDsKLQkJdXNyX2V2dF8zMi5ldmVudF9wYXlsb2FkLmVycm9yX2luZm8uZXJyX21zZ19pbmRpY2F0b3IgPQotCQkJdXNyX2V2dC5ldmVudF9wYXlsb2FkLmVycm9yX2luZm8uZXJyX21zZ19pbmRpY2F0b3I7Ci0JCXVzcl9ldnRfMzIuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmVycl90eXBlID0KLQkJCXVzcl9ldnQuZXZlbnRfcGF5bG9hZC5lcnJvcl9pbmZvLmVycl90eXBlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiJXM6IHVua25vd24gYXVkaW8gZXZlbnQgdHlwZSA9ICVkIHJjID0gJWxkIiwKLQkJCSBfX2Z1bmNfXywgdXNyX2V2dF8zMi5ldmVudF90eXBlLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ1c3JfZXZ0XzMyLCBzaXplb2YodXNyX2V2dF8zMikpKSB7Ci0JCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19haW9faW9uX2NoZWNrKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCQkJdm9pZCAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotCXN0cnVjdCBhdWRpb19haW9faW9uX3JlZ2lvbiAqcmVnaW9uX2VsdDsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gdCA9IHsudmFkZHIgPSB2YWRkciwgLmxlbiA9IGxlbiB9OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb25fZWx0LCAmYXVkaW8tPmlvbl9yZWdpb25fcXVldWUsIGxpc3QpIHsKLQkJaWYgKENPTlRBSU5TKHJlZ2lvbl9lbHQsICZ0KSB8fCBDT05UQUlOUygmdCwgcmVnaW9uX2VsdCkgfHwKLQkJCU9WRVJMQVBTKHJlZ2lvbl9lbHQsICZ0KSkgewotCQkJcHJfZXJyKCIlc1slcEtdOnJlZ2lvbiAodmFkZHIgJXBLIGxlbiAlbGQpIGNsYXNoZXMgd2l0aCByZWdpc3RlcmVkIHJlZ2lvbiAodmFkZHIgJXBLIHBhZGRyICVwSyBsZW4gJWxkKVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8sIHZhZGRyLCBsZW4sCi0JCQkJcmVnaW9uX2VsdC0+dmFkZHIsCi0JCQkJJnJlZ2lvbl9lbHQtPnBhZGRyLCByZWdpb25fZWx0LT5sZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9faW9uX2FkZChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAotCQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gKmluZm8pCi17Ci0JaW9uX3BoeXNfYWRkcl90IHBhZGRyID0gMDsKLQlzaXplX3QgbGVuID0gMDsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gKnJlZ2lvbjsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZzsKLQl2b2lkICprdmFkZHIgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzWyVwS106XG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCXJlZ2lvbiA9IGttYWxsb2Moc2l6ZW9mKCpyZWdpb24pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcmVnaW9uKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcmMgPSBtc21fYXVkaW9faW9uX2ltcG9ydF9sZWdhY3koIkF1ZGlvX0RlY19DbGllbnQiLCBhdWRpby0+Y2xpZW50LAotCQkJCSZoYW5kbGUsIGluZm8tPmZkLCAmaW9uZmxhZywKLQkJCQkwLCAmcGFkZHIsICZsZW4sICZrdmFkZHIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBtc20gYXVkaW8gaW9uIGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGltcG9ydF9lcnJvcjsKLQl9Ci0KLQlyYyA9IGF1ZGlvX2Fpb19pb25fY2hlY2soYXVkaW8sIGluZm8tPnZhZGRyLCBsZW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX2lvbl9jaGVjayBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBpb25fZXJyb3I7Ci0JfQotCi0JcmVnaW9uLT5oYW5kbGUgPSBoYW5kbGU7Ci0JcmVnaW9uLT52YWRkciA9IGluZm8tPnZhZGRyOwotCXJlZ2lvbi0+ZmQgPSBpbmZvLT5mZDsKLQlyZWdpb24tPnBhZGRyID0gcGFkZHI7Ci0JcmVnaW9uLT5rdmFkZHIgPSBrdmFkZHI7Ci0JcmVnaW9uLT5sZW4gPSBsZW47Ci0JcmVnaW9uLT5yZWZfY250ID0gMDsKLQlwcl9kZWJ1ZygiJXNbJXBLXTphZGQgcmVnaW9uIHBhZGRyICVwSyB2YWRkciAlcEssIGxlbiAlbHUga3ZhZGRyICVwS1xuIiwKLQkJX19mdW5jX18sIGF1ZGlvLAotCQkmcmVnaW9uLT5wYWRkciwgcmVnaW9uLT52YWRkciwgcmVnaW9uLT5sZW4sCi0JCXJlZ2lvbi0+a3ZhZGRyKTsKLQlsaXN0X2FkZF90YWlsKCZyZWdpb24tPmxpc3QsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSk7Ci0JcmMgPSBxNmFzbV9tZW1vcnlfbWFwKGF1ZGlvLT5hYywgIHBhZGRyLCBJTiwgbGVuLCAxKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXNbJXBLXTogbWVtb3J5IG1hcCBmYWlsZWRcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCWdvdG8gbW1hcF9lcnJvcjsKLQl9IGVsc2UgewotCQlnb3RvIGVuZDsKLQl9Ci1tbWFwX2Vycm9yOgotCWxpc3RfZGVsKCZyZWdpb24tPmxpc3QpOwotaW9uX2Vycm9yOgotCW1zbV9hdWRpb19pb25fZnJlZV9sZWdhY3koYXVkaW8tPmNsaWVudCwgaGFuZGxlKTsKLWltcG9ydF9lcnJvcjoKLQlrZnJlZShyZWdpb24pOwotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9faW9uX3JlbW92ZShzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLAotCQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uICpyZWdpb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JcHJfZGVidWcoIiVzWyVwS106aW5mbyBmZCAlZCB2YWRkciAlcEtcbiIsCi0JCV9fZnVuY19fLCBhdWRpbywgaW5mby0+ZmQsIGluZm8tPnZhZGRyKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhdWRpby0+aW9uX3JlZ2lvbl9xdWV1ZSkgewotCQlyZWdpb24gPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGF1ZGlvX2Fpb19pb25fcmVnaW9uLCBsaXN0KTsKLQotCQlpZiAoKHJlZ2lvbi0+ZmQgPT0gaW5mby0+ZmQpICYmCi0JCQkocmVnaW9uLT52YWRkciA9PSBpbmZvLT52YWRkcikpIHsKLQkJCWlmIChyZWdpb24tPnJlZl9jbnQpIHsKLQkJCQlwcl9kZWJ1ZygiJXNbJXBLXTpyZWdpb24gJXBLIGluIHVzZSByZWZfY250ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJlZ2lvbiwKLQkJCQkJcmVnaW9uLT5yZWZfY250KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXByX2RlYnVnKCIlc1slcEtdOnJlbW92ZSByZWdpb24gZmQgJWQgdmFkZHIgJXBLXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbywgaW5mby0+ZmQsIGluZm8tPnZhZGRyKTsKLQkJCXJjID0gcTZhc21fbWVtb3J5X3VubWFwKGF1ZGlvLT5hYywKLQkJCQkJCXJlZ2lvbi0+cGFkZHIsIElOKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcHJfZXJyKCIlc1slcEtdOiBtZW1vcnkgdW5tYXAgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8pOwotCi0JCQlsaXN0X2RlbCgmcmVnaW9uLT5saXN0KTsKLQkJCW1zbV9hdWRpb19pb25fZnJlZV9sZWdhY3koYXVkaW8tPmNsaWVudCwKLQkJCQkJCSByZWdpb24tPmhhbmRsZSk7Ci0JCQlrZnJlZShyZWdpb24pOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fYWlvX2FzeW5jX3dyaXRlKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCQkJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGUpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXN0cnVjdCBhdWRpb19haW9fd3JpdGVfcGFyYW0gcGFyYW07Ci0KLQltZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YocGFyYW0pKTsKLQotCWlmICghYXVkaW8gfHwgIWJ1Zl9ub2RlKSB7Ci0JCXByX2VycigiJXMgTlVMTCBwb2ludGVyIGF1ZGlvPVsweCVwS10sIGJ1Zl9ub2RlPVsweCVwS11cbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGJ1Zl9ub2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlc1slcEtdOiBTZW5kIHdyaXRlIGJ1ZmYgJXBLIHBoeSAlcEsgbGVuICVkIG1ldGFfZW5hYmxlID0gJWRcbiIsCi0JCV9fZnVuY19fLCBhdWRpbywgYnVmX25vZGUsICZidWZfbm9kZS0+cGFkZHIsCi0JCWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4sCi0JCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUpOwotCXByX2RlYnVnKCIlc1slcEtdOiBmbGFncyA9IDB4JXhcbiIsIF9fZnVuY19fLCBhdWRpbywKLQkJYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm5mbGFncyk7Ci0KLQlhYyA9IGF1ZGlvLT5hYzsKLQkvKiBPZmZzZXQgd2l0aCAgYXBwcm9wcmlhdGUgbWV0YSAqLwotCWlmIChhdWRpby0+ZmVlZGJhY2spIHsKLQkJLyogTm9uIFR1bm5lbCBtb2RlICovCi0JCXBhcmFtLnBhZGRyID0gYnVmX25vZGUtPnBhZGRyICsgc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9pbik7Ci0JCXBhcmFtLmxlbiA9IGJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4gLSBzaXplb2Yoc3RydWN0IGRlY19tZXRhX2luKTsKLQl9IGVsc2UgewotCQkvKiBUdW5uZWwgbW9kZSAqLwotCQlwYXJhbS5wYWRkciA9IGJ1Zl9ub2RlLT5wYWRkcjsKLQkJcGFyYW0ubGVuID0gYnVmX25vZGUtPmJ1Zi5kYXRhX2xlbjsKLQl9Ci0JcGFyYW0ubXN3X3RzID0gYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm50aW1lc3RhbXAuaGlnaHBhcnQ7Ci0JcGFyYW0ubHN3X3RzID0gYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm50aW1lc3RhbXAubG93cGFydDsKLQlwYXJhbS5mbGFncyAgPSBidWZfbm9kZS0+bWV0YV9pbmZvLm1ldGFfaW4ubmZsYWdzOwotCS8qIElmIG5vIG1ldGFfaW5mbyBlbmFsZWQsIGluZGljYXRlIG5vIHRpbWUgc3RhbXAgdmFsaWQgKi8KLQlpZiAoIWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUpCi0JCXBhcmFtLmZsYWdzID0gMHhGRjAwOwotCi0JaWYgKGJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbi5uZmxhZ3MgJiBBVURJT19ERUNfRU9GX1NFVCkKLQkJcGFyYW0uZmxhZ3MgfD0gQVVESU9fREVDX0VPRl9TRVQ7Ci0KLQlwYXJhbS51aWQgPSBhYy0+c2Vzc2lvbjsKLQkvKiBSZWFkIGNvbW1hbmQgd2lsbCBwb3B1bGF0ZSBzZXNzaW9uIGlkIGFzIHRva2VuICovCi0JYnVmX25vZGUtPnRva2VuID0gYWMtPnNlc3Npb247Ci0JcmMgPSBxNmFzbV9hc3luY193cml0ZShhYywgJnBhcmFtKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzWyVwS106ZmFpbGVkXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBhdWRpb19haW9fcG9zdF9ldmVudChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHBheWxvYWQpCi17Ci0Jc3RydWN0IGF1ZGlvX2Fpb19ldmVudCAqZV9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSkgewotCQllX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhdWRpby0+ZnJlZV9ldmVudF9xdWV1ZSwKLQkJCQkJc3RydWN0IGF1ZGlvX2Fpb19ldmVudCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZlX25vZGUtPmxpc3QpOwotCX0gZWxzZSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19haW9fZXZlbnQpLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFlX25vZGUpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQllX25vZGUtPmV2ZW50X3R5cGUgPSB0eXBlOwotCWVfbm9kZS0+cGF5bG9hZCA9IHBheWxvYWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlX25vZGUtPmxpc3QsICZhdWRpby0+ZXZlbnRfcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5ldmVudF9xdWV1ZV9sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2Fpb19hc3luY19yZWFkKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCQkJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGUpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0Jc3RydWN0IGF1ZGlvX2Fpb19yZWFkX3BhcmFtIHBhcmFtOwotCWludCByYzsKLQotCXByX2RlYnVnKCIlc1slcEtdOiBTZW5kIHJlYWQgYnVmZiAlcEsgcGh5ICVwSyBsZW4gJWRcbiIsCi0JCV9fZnVuY19fLCBhdWRpbywgYnVmX25vZGUsCi0JCSZidWZfbm9kZS0+cGFkZHIsIGJ1Zl9ub2RlLT5idWYuYnVmX2xlbik7Ci0JYWMgPSBhdWRpby0+YWM7Ci0JLyogUHJvdmlkZSBhZGRyZXNzIHNvIGRyaXZlciBjYW4gYXBwZW5kIG5yIGZyYW1lcyBpbmZvcm1hdGlvbiAqLwotCXBhcmFtLnBhZGRyID0gYnVmX25vZGUtPnBhZGRyICsKLQkJc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9vdXQpOwotCXBhcmFtLmxlbiA9IGJ1Zl9ub2RlLT5idWYuYnVmX2xlbiAtCi0JCXNpemVvZihzdHJ1Y3QgZGVjX21ldGFfb3V0KTsKLQlwYXJhbS51aWQgPSBhYy0+c2Vzc2lvbjsKLQkvKiBXcml0ZSBjb21tYW5kIHdpbGwgcG9wdWxhdGUgc2Vzc2lvbl9pZCBhcyB0b2tlbiAqLwotCWJ1Zl9ub2RlLT50b2tlbiA9IGFjLT5zZXNzaW9uOwotCXJjID0gcTZhc21fYXN5bmNfcmVhZChhYywgJnBhcmFtKTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzWyVwS106ZmFpbGVkXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdWRpb19haW9fYnVmX2FkZF9zaGFyZWQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdTMyIGRpciwKLQkJCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzWyVwS106bm9kZSAlcEsgZGlyICV4IGJ1Zl9hZGRyICVwSyBidWZfbGVuICVkIGRhdGFfbGVuICVkXG4iLAotCQkgX19mdW5jX18sIGF1ZGlvLCBidWZfbm9kZSwgZGlyLCBidWZfbm9kZS0+YnVmLmJ1Zl9hZGRyLAotCQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sIGJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4pOwotCWJ1Zl9ub2RlLT5wYWRkciA9IGF1ZGlvX2Fpb19pb25fZml4dXAoYXVkaW8sIGJ1Zl9ub2RlLT5idWYuYnVmX2FkZHIsCi0JCQkJCQlidWZfbm9kZS0+YnVmLmJ1Zl9sZW4sIDEsCi0JCQkJCQkmYnVmX25vZGUtPmt2YWRkcik7Ci0JaWYgKGRpcikgewotCQkvKiB3cml0ZSAqLwotCQlpZiAoIWJ1Zl9ub2RlLT5wYWRkciB8fAotCQkJKGJ1Zl9ub2RlLT5wYWRkciAmIDB4MSkgfHwKLQkJCSghYXVkaW8tPmZlZWRiYWNrICYmICFidWZfbm9kZS0+YnVmLmRhdGFfbGVuKSkgewotCQkJa2ZyZWUoYnVmX25vZGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZXh0cmFjdF9tZXRhX291dF9pbmZvKGF1ZGlvLCBidWZfbm9kZSwgMSk7Ci0JCS8qIE5vdCBhIEVPUyBidWZmZXIgKi8KLQkJaWYgKCEoYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm5mbGFncyAmIEFVRElPX0RFQ19FT1NfU0VUKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJcmV0ID0gYXVkaW9fYWlvX2FzeW5jX3dyaXRlKGF1ZGlvLCBidWZfbm9kZSk7Ci0JCQkvKiBFT1MgYnVmZmVyIGhhbmRsZWQgaW4gZHJpdmVyICovCi0JCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmF1ZGlvLT5vdXRfcXVldWUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZSBpZiAoYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm5mbGFncwotCQkJCSAgICYgQVVESU9fREVDX0VPU19TRVQpIHsKLQkJCWlmICghYXVkaW8tPndmbHVzaCkgewotCQkJCXByX2RlYnVnKCIlc1slcEtdOlNlbmQgRU9TIGNtZCBhdCBpL3BcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQkJLyogRHJpdmVyIHdpbGwgZm9yY2VmdWxseSBwb3N0IHdyaXRlZG9uZSBldmVudAotCQkJCSAqIG9uY2UgZW9zIGFjayByZWNpdmVkIGZyb20gRFNQCi0JCQkJICovCi0JCQkJYXVkaW8tPmVvc193cml0ZV9wYXlsb2FkLmFpb19idWYgPQotCQkJCQlidWZfbm9kZS0+YnVmOwotCQkJCWF1ZGlvLT5lb3NfZmxhZyA9IDE7Ci0JCQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQkJCXE2YXNtX2NtZChhdWRpby0+YWMsIENNRF9FT1MpOwotCQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCX0gZWxzZSB7IC8qIEZsdXNoIGluIHByb2dyZXNzLCBzZW5kIGJhY2sgaS9wCi0JCQkJICAqIEVPUyBidWZmZXIgYXMgaXMKLQkJCQkgICovCi0JCQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZXZlbnRfcGF5bG9hZDsKLQotCQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1ZiA9IGJ1Zl9ub2RlLT5idWY7Ci0JCQkJYXVkaW9fYWlvX3Bvc3RfZXZlbnQoYXVkaW8sCi0JCQkJCQlBVURJT19FVkVOVF9XUklURV9ET05FLAotCQkJCQkJZXZlbnRfcGF5bG9hZCk7Ci0JCQkJa2ZyZWUoYnVmX25vZGUpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogcmVhZCAqLwotCQlpZiAoIWJ1Zl9ub2RlLT5wYWRkciB8fAotCQkJKGJ1Zl9ub2RlLT5wYWRkciAmIDB4MSkgfHwKLQkJCShidWZfbm9kZS0+YnVmLmJ1Zl9sZW4gPCBQQ01fQlVGU1pfTUlOKSkgewotCQkJa2ZyZWUoYnVmX25vZGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJLyogTm8gRU9TIHJlYWNoZWQgKi8KLQkJaWYgKCFhdWRpby0+ZW9zX3JzcCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQkJcmV0ID0gYXVkaW9fYWlvX2FzeW5jX3JlYWQoYXVkaW8sIGJ1Zl9ub2RlKTsKLQkJCS8qIEVPUyBidWZmZXIgaGFuZGxlZCBpbiBkcml2ZXIgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmYXVkaW8tPmluX3F1ZXVlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotCQl9Ci0JCS8qIEVPUyByZWFjaGVkIGF0IGlucHV0IHNpZGUgZmFrZSBhbGwgdXBjb21pbmcgcmVhZCBidWZmZXIgdG8KLQkJICogaW5kaWNhdGUgdGhlIHNhbWUKLQkJICovCi0JCWVsc2UgewotCQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgZXZlbnRfcGF5bG9hZDsKLQotCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmID0gYnVmX25vZGUtPmJ1ZjsKLQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9Ci0JCQkJaW5zZXJ0X2Vvc19idWYoYXVkaW8sIGJ1Zl9ub2RlKTsKLQkJCXByX2RlYnVnKCIlc1slcEtdOiBwcm9wYWdhdGUgUkVBRF9ET05FIGFzIEVPUyBkb25lXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfUkVBRF9ET05FLAotCQkJCQlldmVudF9wYXlsb2FkKTsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgYXVkaW9fYWlvX2J1Zl9hZGRfY29tcGF0KHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIHUzMiBkaXIsCi0JCQkJdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlICpidWZfbm9kZTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYzMiBhaW9fYnVmXzMyOwotCi0JYnVmX25vZGUgPSBremFsbG9jKHNpemVvZigqYnVmX25vZGUpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmX25vZGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZhaW9fYnVmXzMyLCBhcmcsIHNpemVvZihhaW9fYnVmXzMyKSkpIHsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JYnVmX25vZGUtPmJ1Zi5idWZfYWRkciA9IGNvbXBhdF9wdHIoYWlvX2J1Zl8zMi5idWZfYWRkcik7Ci0JYnVmX25vZGUtPmJ1Zi5idWZfbGVuID0gYWlvX2J1Zl8zMi5idWZfbGVuOwotCWJ1Zl9ub2RlLT5idWYuZGF0YV9sZW4gPSBhaW9fYnVmXzMyLmRhdGFfbGVuOwotCWJ1Zl9ub2RlLT5idWYucHJpdmF0ZV9kYXRhID0gY29tcGF0X3B0cihhaW9fYnVmXzMyLnByaXZhdGVfZGF0YSk7Ci0JYnVmX25vZGUtPmJ1Zi5tZmllbGRfc3ogPSBhaW9fYnVmXzMyLm1maWVsZF9zejsKLQotCXJldHVybiBhdWRpb19haW9fYnVmX2FkZF9zaGFyZWQoYXVkaW8sIGRpciwgYnVmX25vZGUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXVkaW9fYWlvX2J1Zl9hZGQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdTMyIGRpciwKLQkJCQl2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlOwotCi0JYnVmX25vZGUgPSBremFsbG9jKHNpemVvZigqYnVmX25vZGUpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmX25vZGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+YnVmLCBhcmcsIHNpemVvZihidWZfbm9kZS0+YnVmKSkpIHsKLQkJa2ZyZWUoYnVmX25vZGUpOwotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIGF1ZGlvX2Fpb19idWZfYWRkX3NoYXJlZChhdWRpbywgZGlyLCBidWZfbm9kZSk7Ci19Ci0KLXZvaWQgYXVkaW9fYWlvX2lvcG9ydF9yZXNldChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKQotewotCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0FJT19JTlRGKSB7Ci0JCS8qIElmIGZzeW5jIGlzIGluIHByb2dyZXNzLCBtYWtlIHN1cmUKLQkJICogcmV0dXJuIHZhbHVlIG9mIGZzeW5jIGluZGljYXRlcwotCQkgKiBhYm9ydCBkdWUgdG8gZmx1c2gKLQkJICovCi0JCWlmIChhdWRpby0+ZHJ2X3N0YXR1cyAmIEFEUlZfU1RBVFVTX0ZTWU5DKSB7Ci0JCQlwcl9kZWJ1ZygiJXNbJXBLXTpmc3luYyBpbiBwcm9ncmVzc1xuIiwKLQkJCQkgX19mdW5jX18sIGF1ZGlvKTsKLQkJCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaChhdWRpbyk7Ci0JCX0gZWxzZQotCQkJYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpCi0JCQlhdWRpby0+ZHJ2X29wcy5pbl9mbHVzaChhdWRpbyk7Ci0JfQotfQotCi1pbnQgYXVkaW9fYWlvX29wZW4oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50ICplX25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQkvKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gMjsKLQotCS8qIE9ubHkgQUlPIGludGVyZmFjZSAqLwotCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQlwcl9kZWJ1ZygiJXNbJXBLXTpzZXQgdG8gYWlvIGludGVyZmFjZVxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJYXVkaW8tPmRydl9zdGF0dXMgfD0gQURSVl9TVEFUVVNfQUlPX0lOVEY7Ci0JCWF1ZGlvLT5kcnZfb3BzLm91dF9mbHVzaCA9IGF1ZGlvX2Fpb19hc3luY19vdXRfZmx1c2g7Ci0JCWF1ZGlvLT5kcnZfb3BzLmluX2ZsdXNoID0gYXVkaW9fYWlvX2FzeW5jX2luX2ZsdXNoOwotCQlxNmFzbV9zZXRfaW9fbW9kZShhdWRpby0+YWMsIEFTWU5DX0lPX01PREUpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXNbJXBLXTpTSU8gaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGFsbCBsb2NrcyBvZiBhdWRpbyBpbnN0YW5jZSAqLwotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYXVkaW8tPmV2ZW50X3F1ZXVlX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5jbWRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5ldmVudF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5pbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmF1ZGlvLT5pb25fcmVnaW9uX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmYXVkaW8tPmZyZWVfZXZlbnRfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZhdWRpby0+ZXZlbnRfcXVldWUpOwotCi0JYXVkaW8tPmRydl9vcHMub3V0X2ZsdXNoKGF1ZGlvKTsKLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQlhdWRpby0+Y29kZWNfaW9jdGwgPSBhdWRpb19haW9faW9jdGw7Ci0JYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bCA9IGF1ZGlvX2Fpb19jb21wYXRfaW9jdGw7Ci0JZm9yIChpID0gMDsgaSA8IEFVRElPX0VWRU5UX05VTTsgaSsrKSB7Ci0JCWVfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19haW9fZXZlbnQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGVfbm9kZSkKLQkJCWxpc3RfYWRkX3RhaWwoJmVfbm9kZS0+bGlzdCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKTsKLQkJZWxzZSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQl9Ci0JYXVkaW8tPmNsaWVudCA9IG1zbV9hdWRpb19pb25fY2xpZW50X2NyZWF0ZSgiQXVkaW9fRGVjX0NsaWVudCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhdWRpby0+Y2xpZW50KSkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBjcmVhdGUgSU9OIGNsaWVudFxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQlwcl9kZWJ1ZygiSW9uIGNsaWVudCBjcmVhdGUgaW4gYXVkaW9fYWlvX29wZW4gJXBLIiwgYXVkaW8tPmNsaWVudCk7Ci0KLQlyYyA9IHJlZ2lzdGVyX3ZvbHVtZV9saXN0ZW5lcihhdWRpbyk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBpb25fY2xlYW51cDsKLQotCXJldHVybiAwOwotaW9uX2NsZWFudXA6Ci0JbXNtX2F1ZGlvX2lvbl9jbGllbnRfZGVzdHJveShhdWRpby0+Y2xpZW50KTsKLQlhdWRpby0+Y2xpZW50ID0gTlVMTDsKLWNsZWFudXA6Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlKSB7Ci0JCWVfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmF1ZGlvLT5mcmVlX2V2ZW50X3F1ZXVlLAotCQkJCSAgIHN0cnVjdCBhdWRpb19haW9fZXZlbnQsIGxpc3QpOwotCQlsaXN0X2RlbCgmZV9ub2RlLT5saXN0KTsKLQkJa2ZyZWUoZV9ub2RlKTsKLQl9Ci1mYWlsOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9fYWlvX3NoYXJlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19BQk9SVF9HRVRfRVZFTlQ6IHsKLQkJYXVkaW8tPmV2ZW50X2Fib3J0ID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19PVVRQT1JUX0ZMVVNIOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX09VVFBPUlRfRkxVU0hcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQlyYyA9IGF1ZGlvX2Fpb19vdXRwb3J0X2ZsdXNoKGF1ZGlvKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlc1slcEtdOiBBVURJT19PVVRQT1JUX0ZMVVNIIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8pOwotCQkJcmMgPSAtRUlOVFI7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RPUDogewotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RPUCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYXVkaW8tPnN0b3BwZWQgPSAxOwotCQlyYyA9IGF1ZGlvX2Fpb19mbHVzaChhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXNbJXBLXTpBdWRpbyBTdG9wIHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLCByYyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWF1ZGlvLT5lbmFibGVkID0gMDsKLQkJYXVkaW8tPmRydl9zdGF0dXMgJj0gfkFEUlZfU1RBVFVTX1BBVVNFOwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykgewotCQkJcHJfZGVidWcoIiVzWyVwS10gV2FraW5nIHVwIHRoZSBhdWRpb19haW9fZnN5bmNcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1BBVVNFOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX1BBVVNFICVsZFxuIiwgX19mdW5jX18sIGF1ZGlvLCBhcmcpOwotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWlmIChhcmcgPT0gMSkgewotCQkJcmMgPSBhdWRpb19haW9fcGF1c2UoYXVkaW8pOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXNbJXBLXTogcGF1c2UgRkFJTEVEIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8sIHJjKTsKLQkJCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWF1ZGlvLT5kcnZfc3RhdHVzIHw9IEFEUlZfU1RBVFVTX1BBVVNFOwotCQl9IGVsc2UgaWYgKGFyZyA9PSAwKSB7Ci0JCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19QQVVTRSkgewotCQkJCXJjID0gYXVkaW9fYWlvX2VuYWJsZShhdWRpbyk7Ci0JCQkJaWYgKHJjKQotCQkJCQlwcl9lcnIoIiVzWyVwS106IGF1ZGlvIGVuYWJsZSBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWF1ZGlvLT5kcnZfc3RhdHVzICY9IH5BRFJWX1NUQVRVU19QQVVTRTsKLQkJCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fRkxVU0g6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IEFVRElPX0ZMVVNIIHNlc3Npb25pZFslZF1cbiIsIF9fZnVuY19fLAotCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYXVkaW8tPnJmbHVzaCA9IDE7Ci0JCWF1ZGlvLT53Zmx1c2ggPSAxOwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykgewotCQkJcHJfZGVidWcoIiVzWyVwS10gV2FraW5nIHVwIHRoZSBhdWRpb19haW9fZnN5bmNcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvKTsKLQkJCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJfQotCQkvKiBGbHVzaCBEU1AgKi8KLQkJcmMgPSBhdWRpb19haW9fZmx1c2goYXVkaW8pOwotCQkvKiBGbHVzaCBpbnB1dCAvIE91dHB1dCBidWZmZXIgaW4gc29mdHdhcmUqLwotCQlhdWRpb19haW9faW9wb3J0X3Jlc2V0KGF1ZGlvKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlc1slcEtdOkFVRElPX0ZMVVNIIGludGVycnVwdGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQlyYyA9IC1FSU5UUjsKLQkJfSBlbHNlIHsKLQkJCWF1ZGlvLT5yZmx1c2ggPSAwOwotCQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpCi0JCQkJd2FrZV91cCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCQkJZWxzZQotCQkJCWF1ZGlvLT53Zmx1c2ggPSAwOwotCi0JCX0KLQkJYXVkaW8tPmVvc19mbGFnID0gMDsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1NFU1NJT05fSUQ6IHsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJc2l6ZW9mKHUxNikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9TRVNTSU9OX0lEIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1BNX0FXQUtFOiB7Ci0JCWlmICgoYXVkaW8tPmF1ZGlvX3dzX21nciA9PSAgTlVMTCkgfHwKLQkJCQkoYXVkaW8tPm1pc2NkZXZpY2UgPT0gTlVMTCkpIHsKLQkJCXByX2VycigiJXNbJXBLXTogaW52YWxpZCB3c19tZ3Igb3IgbWlzY2RldmljZSIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQlyYyA9IC1FQUNDRVM7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiJXNbJXBLXTpBVURJT19QTV9BV0FLRVxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoIWF1ZGlvLT53YWtlbG9ja192b3RlZCkgewotCQkJYXVkaW8tPndha2Vsb2NrX3ZvdGVkID0gdHJ1ZTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5hdWRpb193c19tZ3ItPndzX2xvY2spOwotCQkJaWYgKGF1ZGlvLT5hdWRpb193c19tZ3ItPnJlZl9jbnQrKyA9PSAwKQotCQkJCXBtX3N0YXlfYXdha2UoYXVkaW8tPm1pc2NkZXZpY2UtPnRoaXNfZGV2aWNlKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmF1ZGlvX3dzX21nci0+d3NfbG9jayk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1BNX1JFTEFYOiB7Ci0JCWlmICgoYXVkaW8tPmF1ZGlvX3dzX21nciA9PSAgTlVMTCkgfHwKLQkJCQkoYXVkaW8tPm1pc2NkZXZpY2UgPT0gTlVMTCkpIHsKLQkJCXByX2VycigiJXNbJXBLXTogaW52YWxpZCB3c19tZ3Igb3IgbWlzY2RldmljZSIsCi0JCQkJCV9fZnVuY19fLCBhdWRpbyk7Ci0JCQlyYyA9IC1FQUNDRVM7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiJXNbJXBLXTpBVURJT19QTV9SRUxBWFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoYXVkaW8tPndha2Vsb2NrX3ZvdGVkKSB7Ci0JCQlhdWRpby0+d2FrZWxvY2tfdm90ZWQgPSBmYWxzZTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT5hdWRpb193c19tZ3ItPndzX2xvY2spOwotCQkJaWYgKChhdWRpby0+YXVkaW9fd3NfbWdyLT5yZWZfY250ID4gMCkgJiYKLQkJCQkJKC0tYXVkaW8tPmF1ZGlvX3dzX21nci0+cmVmX2NudCA9PSAwKSkgewotCQkJCXBtX3JlbGF4KGF1ZGlvLT5taXNjZGV2aWNlLT50aGlzX2RldmljZSk7Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5hdWRpb193c19tZ3ItPndzX2xvY2spOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9ICAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci0KLQotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19haW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0FCT1JUX0dFVF9FVkVOVDoKLQljYXNlIEFVRElPX09VVFBPUlRfRkxVU0g6Ci0JY2FzZSBBVURJT19TVE9QOgotCWNhc2UgQVVESU9fUEFVU0U6Ci0JY2FzZSBBVURJT19GTFVTSDoKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCWNhc2UgQVVESU9fUE1fQVdBS0U6Ci0JY2FzZSBBVURJT19QTV9SRUxBWDoKLQkJcmMgPSBhdWRpb19haW9fc2hhcmVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU1RBVFM6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0cyBzdGF0czsKLQkJdWludDY0X3QgdGltZXN0YW1wOwotCi0JCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzKSk7Ci0JCXN0YXRzLmJ5dGVfY291bnQgPSBhdG9taWNfcmVhZCgmYXVkaW8tPmluX2J5dGVzKTsKLQkJc3RhdHMuc2FtcGxlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQkJcmMgPSBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lKGF1ZGlvLT5hYywgJnRpbWVzdGFtcCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJbWVtY3B5KCZzdGF0cy51bnVzZWRbMF0sICZ0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApKTsKLQkJZWxzZQotCQkJcHJfZGVidWcoIkVycm9yIHdoaWxlIGdldHRpbmcgdGltZXN0YW1wXG4iKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm1fdXNlciBmb3IgQVVESU9fR0VUX1NUQVRTIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0VWRU5UOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX0dFVF9FVkVOVFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxKGF1ZGlvLAotCQkJCQkJKHZvaWQgX191c2VyICopYXJnKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmdldF9ldmVudF9sb2NrKTsKLQkJfSBlbHNlCi0JCQlyYyA9IC1FQlVTWTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fQVNZTkNfV1JJVEU6IHsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQlpZiAoYXVkaW8tPmRydl9zdGF0dXMgJiBBRFJWX1NUQVRVU19GU1lOQykKLQkJCXJjID0gLUVCVVNZOwotCQllbHNlIHsKLQkJCWlmIChhdWRpby0+ZW5hYmxlZCkKLQkJCQlyYyA9IGF1ZGlvX2Fpb19idWZfYWRkKGF1ZGlvLCAxLAotCQkJCQkJKHZvaWQgX191c2VyICopYXJnKTsKLQkJCWVsc2UKLQkJCQlyYyA9IC1FUEVSTTsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fQVNZTkNfUkVBRDogewotCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJaWYgKGF1ZGlvLT5mZWVkYmFjaykKLQkJCXJjID0gYXVkaW9fYWlvX2J1Zl9hZGQoYXVkaW8sIDAsCi0JCQkJCSh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWVsc2UKLQkJCXJjID0gLUVQRVJNOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBjZmc7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOwotCQljZmcuYnVmZmVyX3NpemUgPSBhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJcHJfZGVidWcoIiVzWyVwS106R0VUIFNUUkVBTSBDRkcgJWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8sIGNmZy5idWZmZXJfc2l6ZSwgY2ZnLmJ1ZmZlcl9jb3VudCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjZmcsIHNpemVvZihjZmcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfU1RSRUFNX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfU1RSRUFNX0NPTkZJRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcgY2ZnOwotCi0JCXByX2RlYnVnKCIlc1slcEtdOlNFVCBTVFJFQU0gQ09ORklHXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX1NUUkVBTV9DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUgPSBGUkFNRV9TSVpFOwotCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCXJjID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcgY2ZnOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmF1ZGlvLT5wY21fY2ZnLCBzaXplb2YoY2ZnKSkpIHsKLQkJCXByX2VycigKLQkJCQkiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQotCQlwcl9lcnIoIiVzWyVwS106QVVESU9fU0VUX0NPTkZJR1xuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZywgKHZvaWQgKilhcmcsIHNpemVvZihjb25maWcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayAhPSBOT05fVFVOTkVMX01PREUpIHsKLQkJCXByX2VycigiJXNbJXBLXTpOb3Qgc3VmZmljaWVudCBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgcGxheWJhY2sgbW9kZVxuIiwKLQkJCQkgX19mdW5jX18sIGF1ZGlvKTsKLQkJCXJjID0gLUVBQ0NFUzsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChjb25maWcuYnVmZmVyX2NvdW50ID4gUENNX0JVRl9DT1VOVCkgfHwKLQkJCShjb25maWcuYnVmZmVyX2NvdW50ID09IDEpKQotCQkJY29uZmlnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0KLQkJaWYgKGNvbmZpZy5idWZmZXJfc2l6ZSA8IFBDTV9CVUZTWl9NSU4pCi0JCQljb25maWcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCi0JCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IGNvbmZpZy5idWZmZXJfY291bnQ7Ci0JCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gY29uZmlnLmJ1ZmZlcl9zaXplOwotCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gY29uZmlnLmNoYW5uZWxfY291bnQ7Ci0JCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotCQlyYyA9IDA7Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQlVGX0NGRzogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgIGNmZzsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKWFyZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fR0VUX0JVRiBDT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSAmJgotCQkJIWNmZy5tZXRhX2luZm9fZW5hYmxlKSB7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IGNmZy5tZXRhX2luZm9fZW5hYmxlOwotCQlwcl9kZWJ1ZygiJXNbJXBLXTpzZXNzaW9uIGlkICVkOiBTZXQtYnVmLWNmZzogbWV0YVslZF0iLAotCQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGNmZy5tZXRhX2luZm9fZW5hYmxlKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9CVUZfQ0ZHOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOnNlc3Npb24gaWQgJWQ6IEdldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAotCQkJIF9fZnVuY19fLCBhdWRpbywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSwKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmKTsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhdWRpby0+YnVmX2NmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfQlVGX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19SRUdJU1RFUl9JT046IHsKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyBpbmZvOwotCi0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX1JFR0lTVEVSX0lPTlxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkICopYXJnLCBzaXplb2YoaW5mbykpKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fUkVHSVNURVJfSU9OIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJCXJjID0gYXVkaW9fYWlvX2lvbl9hZGQoYXVkaW8sICZpbmZvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fREVSRUdJU1RFUl9JT046IHsKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbyBpbmZvOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fREVSRUdJU1RFUl9JT05cbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgKilhcmcsIHNpemVvZihpbmZvKSkpIHsKLQkJCXByX2VycigKLQkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19ERVJFR0lTVEVSX0lPTiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9IGVsc2UgewotCQkJbXV0ZXhfbG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+d3JpdGVfbG9jayk7Ci0JCQlyYyA9IGF1ZGlvX2Fpb19pb25fcmVtb3ZlKGF1ZGlvLCAmaW5mbyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPnJlYWRfbG9jayk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gIC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIHsKLQl1MzIgYnVmZmVyX3NpemU7Ci0JdTMyIGJ1ZmZlcl9jb3VudDsKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fc3RhdHMzMiB7Ci0JdTMyIGJ5dGVfY291bnQ7Ci0JdTMyIHNhbXBsZV9jb3VudDsKLQl1MzIgdW51c2VkWzJdOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19jb25maWczMiB7Ci0JdTMyIGJ1ZmZlcl9zaXplOwotCXUzMiBidWZmZXJfY291bnQ7Ci0JdTMyIGNoYW5uZWxfY291bnQ7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiB0eXBlOwotCXUzMiBtZXRhX2ZpZWxkOwotCXUzMiBiaXRzOwotCXUzMiB1bnVzZWRbM107Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiB7Ci0JdTMyIG1ldGFfaW5mb19lbmFibGU7Ci0JdTMyIGZyYW1lc19wZXJfYnVmOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19pb25faW5mbzMyIHsKLQlpbnQgZmQ7Ci0JY29tcGF0X3VwdHJfdCB2YWRkcjsKLX07Ci0KLWVudW0gewotCUFVRElPX0dFVF9DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCAzLAotCQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiksCi0JQVVESU9fU0VUX0NPTkZJR18zMiA9IF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDQsCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfU1RBVFNfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCA1LAotCQkJc3RydWN0IG1zbV9hdWRpb19zdGF0czMyKSwKLQlBVURJT19HRVRfRVZFTlRfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCAxMywKLQkJCXN0cnVjdCBtc21fYXVkaW9fZXZlbnQzMiksCi0JQVVESU9fQVNZTkNfV1JJVEVfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxNywKLQkJCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZjMyKSwKLQlBVURJT19BU1lOQ19SRUFEXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTgsCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYzMiksCi0JQVVESU9fU0VUX1NUUkVBTV9DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4MCwKLQkJCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfU1RSRUFNX0NPTkZJR18zMiA9IF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDgxLAotCQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnMzIpLAotCUFVRElPX0dFVF9CVUZfQ0ZHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTMsCi0JCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmczMiksCi0JQVVESU9fU0VUX0JVRl9DRkdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5NCwKLQkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyKSwKLQlBVURJT19SRUdJU1RFUl9JT05fMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5NywKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8zMiksCi0JQVVESU9fREVSRUdJU1RFUl9JT05fMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5OCwKLQkJCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8zMiksCi19OwotCi1zdGF0aWMgbG9uZyBhdWRpb19haW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0FCT1JUX0dFVF9FVkVOVDoKLQljYXNlIEFVRElPX09VVFBPUlRfRkxVU0g6Ci0JY2FzZSBBVURJT19TVE9QOgotCWNhc2UgQVVESU9fUEFVU0U6Ci0JY2FzZSBBVURJT19GTFVTSDoKLQljYXNlIEFVRElPX0dFVF9TRVNTSU9OX0lEOgotCWNhc2UgQVVESU9fUE1fQVdBS0U6Ci0JY2FzZSBBVURJT19QTV9SRUxBWDoKLQkJcmMgPSBhdWRpb19haW9fc2hhcmVkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfU1RBVFNfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19zdGF0czMyIHN0YXRzOwotCQl1aW50NjRfdCB0aW1lc3RhbXA7Ci0KLQkJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fc3RhdHMzMikpOwotCQlzdGF0cy5ieXRlX2NvdW50ID0gYXRvbWljX3JlYWQoJmF1ZGlvLT5pbl9ieXRlcyk7Ci0JCXN0YXRzLnNhbXBsZV9jb3VudCA9IGF0b21pY19yZWFkKCZhdWRpby0+aW5fc2FtcGxlcyk7Ci0JCXJjID0gcTZhc21fZ2V0X3Nlc3Npb25fdGltZShhdWRpby0+YWMsICZ0aW1lc3RhbXApOwotCQlpZiAocmMgPj0gMCkKLQkJCW1lbWNweSgmc3RhdHMudW51c2VkWzBdLCAmdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSk7Ci0JCWVsc2UKLQkJCXByX2RlYnVnKCJFcnJvciB3aGlsZSBnZXR0aW5nIHRpbWVzdGFtcFxuIik7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpIHsKLQkJCXByX2VycigKLQkJCQkiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1NUQVRTXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0VWRU5UXzMyOiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX0dFVF9FVkVOVFxuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJaWYgKG11dGV4X3RyeWxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jaykpIHsKLQkJCXJjID0gYXVkaW9fYWlvX3Byb2Nlc3NfZXZlbnRfcmVxX2NvbXBhdChhdWRpbywKLQkJCQkJCSh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5nZXRfZXZlbnRfbG9jayk7Ci0JCX0gZWxzZQotCQkJcmMgPSAtRUJVU1k7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0FTWU5DX1dSSVRFXzMyOiB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJaWYgKGF1ZGlvLT5kcnZfc3RhdHVzICYgQURSVl9TVEFUVVNfRlNZTkMpCi0JCQlyYyA9IC1FQlVTWTsKLQkJZWxzZSB7Ci0JCQlpZiAoYXVkaW8tPmVuYWJsZWQpCi0JCQkJcmMgPSBhdWRpb19haW9fYnVmX2FkZF9jb21wYXQoYXVkaW8sIDEsCi0JCQkJCQkodm9pZCBfX3VzZXIgKilhcmcpOwotCQkJZWxzZQotCQkJCXJjID0gLUVQRVJNOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19BU1lOQ19SRUFEXzMyOiB7Ci0JCW11dGV4X2xvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrKQotCQkJcmMgPSBhdWRpb19haW9fYnVmX2FkZF9jb21wYXQoYXVkaW8sIDAsCi0JCQkJCSh2b2lkIF9fdXNlciAqKWFyZyk7Ci0JCWVsc2UKLQkJCXJjID0gLUVQRVJNOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5yZWFkX2xvY2spOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIGNmZzsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplOwotCQljZmcuYnVmZmVyX2NvdW50ID0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50OwotCQlwcl9kZWJ1ZygiJXNbJXBLXTpHRVQgU1RSRUFNIENGRyAlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgY2ZnLmJ1ZmZlcl9zaXplLCBjZmcuYnVmZmVyX2NvdW50KTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZywgc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZzMyIGNmZ18zMjsKLQkJc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIGNmZzsKLQotCQlwcl9kZWJ1ZygiJXNbJXBLXTpTRVQgU1RSRUFNIENPTkZJR1xuIiwgX19mdW5jX18sIGF1ZGlvKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNmZy5idWZmZXJfc2l6ZSA9IGNmZ18zMi5idWZmZXJfc2l6ZTsKLQkJY2ZnLmJ1ZmZlcl9jb3VudCA9IGNmZ18zMi5idWZmZXJfY291bnQ7Ci0KLQkJYXVkaW8tPnN0cl9jZmcuYnVmZmVyX3NpemUgPSBGUkFNRV9TSVpFOwotCQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JCXJjID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiBjZmdfMzI7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOwotCQljZmdfMzIuYnVmZmVyX3NpemUgPSBhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZTsKLQkJY2ZnXzMyLmJ1ZmZlcl9jb3VudCA9IGF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudDsKLQkJY2ZnXzMyLmNoYW5uZWxfY291bnQgPSBhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50OwotCQljZmdfMzIuc2FtcGxlX3JhdGUgPSBhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZTsKLQkJY2ZnXzMyLnR5cGUgPSBhdWRpby0+cGNtX2NmZy50eXBlOwotCQljZmdfMzIubWV0YV9maWVsZCA9IGF1ZGlvLT5wY21fY2ZnLm1ldGFfZmllbGQ7Ci0JCWNmZ18zMi5iaXRzID0gYXVkaW8tPnBjbV9jZmcuYml0czsKLQotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLCBzaXplb2YoY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnIGNvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWczMiBjb25maWdfMzI7Ci0KLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCi0JCWlmIChhdWRpby0+ZmVlZGJhY2sgIT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQlwcl9lcnIoIiVzWyVwS106Tm90IHN1ZmZpY2llbnQgcGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlIHBsYXliYWNrIG1vZGVcbiIsCi0JCQkJIF9fZnVuY19fLCBhdWRpbyk7Ci0JCQlyYyA9IC1FQUNDRVM7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2VycigiJXNbJXBLXTpBVURJT19TRVRfQ09ORklHXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbmZpZ18zMiwgKHZvaWQgKilhcmcsCi0JCQkJCXNpemVvZihjb25maWdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gY29uZmlnXzMyLmJ1ZmZlcl9zaXplOwotCQljb25maWcuYnVmZmVyX2NvdW50ID0gY29uZmlnXzMyLmJ1ZmZlcl9jb3VudDsKLQkJY29uZmlnLmNoYW5uZWxfY291bnQgPSBjb25maWdfMzIuY2hhbm5lbF9jb3VudDsKLQkJY29uZmlnLnNhbXBsZV9yYXRlID0gY29uZmlnXzMyLnNhbXBsZV9yYXRlOwotCQljb25maWcudHlwZSA9IGNvbmZpZ18zMi50eXBlOwotCQljb25maWcubWV0YV9maWVsZCA9IGNvbmZpZ18zMi5tZXRhX2ZpZWxkOwotCQljb25maWcuYml0cyA9IGNvbmZpZ18zMi5iaXRzOwotCi0JCWlmICgoY29uZmlnLmJ1ZmZlcl9jb3VudCA+IFBDTV9CVUZfQ09VTlQpIHx8Ci0JCQkoY29uZmlnLmJ1ZmZlcl9jb3VudCA9PSAxKSkKLQkJCWNvbmZpZy5idWZmZXJfY291bnQgPSBQQ01fQlVGX0NPVU5UOwotCi0JCWlmIChjb25maWcuYnVmZmVyX3NpemUgPCBQQ01fQlVGU1pfTUlOKQotCQkJY29uZmlnLmJ1ZmZlcl9zaXplID0gUENNX0JVRlNaX01JTjsKLQotCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfY291bnQgPSBjb25maWcuYnVmZmVyX2NvdW50OwotCQlhdWRpby0+cGNtX2NmZy5idWZmZXJfc2l6ZSA9IGNvbmZpZy5idWZmZXJfc2l6ZTsKLQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IGNvbmZpZy5jaGFubmVsX2NvdW50OwotCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLQkJcmMgPSAwOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0JVRl9DRkdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnIGNmZzsKLQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIgY2ZnXzMyOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvLT5sb2NrKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopYXJnLCBzaXplb2YoY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNmZy5tZXRhX2luZm9fZW5hYmxlID0gY2ZnXzMyLm1ldGFfaW5mb19lbmFibGU7Ci0JCWNmZy5mcmFtZXNfcGVyX2J1ZiA9IGNmZ18zMi5mcmFtZXNfcGVyX2J1ZjsKLQotCQlpZiAoKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpICYmCi0JCQkhY2ZnLm1ldGFfaW5mb19lbmFibGUpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPmxvY2spOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gY2ZnLm1ldGFfaW5mb19lbmFibGU7Ci0JCXByX2RlYnVnKCIlc1slcEtdOnNlc3Npb24gaWQgJWQ6IFNldC1idWYtY2ZnOiBtZXRhWyVkXSIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgY2ZnLm1ldGFfaW5mb19lbmFibGUpOwotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0JVRl9DRkdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19idWZfY2ZnMzIgY2ZnXzMyOwotCi0JCXByX2RlYnVnKCIlc1slcEtdOnNlc3Npb24gaWQgJWQ6IEdldC1idWYtY2ZnOiBtZXRhWyVkXSBmcmFtZXNwZXJidWZbJWRdXG4iLAotCQkJIF9fZnVuY19fLCBhdWRpbywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSwKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmKTsKLQkJbXV0ZXhfbG9jaygmYXVkaW8tPmxvY2spOwotCQltZW1zZXQoJmNmZ18zMiwgMCwgc2l6ZW9mKGNmZ18zMikpOwotCQljZmdfMzIubWV0YV9pbmZvX2VuYWJsZSA9IGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGU7Ci0JCWNmZ18zMi5mcmFtZXNfcGVyX2J1ZiA9IGF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX0JVRl9DRkdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fUkVHSVNURVJfSU9OXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8zMiBpbmZvXzMyOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIGluZm87Ci0KLQkJcHJfZGVidWcoIiVzWyVwS106QVVESU9fUkVHSVNURVJfSU9OXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mb18zMiwgKHZvaWQgKilhcmcsIHNpemVvZihpbmZvXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19SRUdJU1RFUl9JT05fMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfSBlbHNlIHsKLQkJCWluZm8uZmQgPSBpbmZvXzMyLmZkOwotCQkJaW5mby52YWRkciA9IGNvbXBhdF9wdHIoaW5mb18zMi52YWRkcik7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJCXJjID0gYXVkaW9fYWlvX2lvbl9hZGQoYXVkaW8sICZpbmZvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fREVSRUdJU1RFUl9JT05fMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbzMyIGluZm9fMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9faW9uX2luZm8gaW5mbzsKLQotCQltdXRleF9sb2NrKCZhdWRpby0+bG9jayk7Ci0JCXByX2RlYnVnKCIlc1slcEtdOkFVRElPX0RFUkVHSVNURVJfSU9OXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm9fMzIsICh2b2lkICopYXJnLCBzaXplb2YoaW5mb18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IJQVVESU9fREVSRUdJU1RFUl9JT05fMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfSBlbHNlIHsKLQkJCWluZm8uZmQgPSBpbmZvXzMyLmZkOwotCQkJaW5mby52YWRkciA9IGNvbXBhdF9wdHIoaW5mb18zMi52YWRkcik7Ci0JCQltdXRleF9sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJCW11dGV4X2xvY2soJmF1ZGlvLT53cml0ZV9sb2NrKTsKLQkJCXJjID0gYXVkaW9fYWlvX2lvbl9yZW1vdmUoYXVkaW8sICZpbmZvKTsKLQkJCW11dGV4X3VubG9jaygmYXVkaW8tPndyaXRlX2xvY2spOwotCQkJbXV0ZXhfdW5sb2NrKCZhdWRpby0+cmVhZF9sb2NrKTsKLQkJfQotCQltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAgLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5oIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb191dGlsc19haW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzNzRmOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3V0aWxzX2Fpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIVEMgQ29ycG9yYXRpb24KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgInE2YXVkaW9fY29tbW9uLmgiCi0KLSNkZWZpbmUgVFVOTkVMX01PREUgICAgIDB4MDAwMAotI2RlZmluZSBOT05fVFVOTkVMX01PREUgMHgwMDAxCi0KLSNkZWZpbmUgQURSVl9TVEFUVVNfQUlPX0lOVEYgMHgwMDAwMDAwMSAvKiBBSU8gaW50ZXJmYWNlICovCi0jZGVmaW5lIEFEUlZfU1RBVFVTX0ZTWU5DIDB4MDAwMDAwMDgKLSNkZWZpbmUgQURSVl9TVEFUVVNfUEFVU0UgMHgwMDAwMDAxMAotI2RlZmluZSBBVURJT19ERUNfRU9TX1NFVCAgMHgwMDAwMDAwMQotI2RlZmluZSBBVURJT19ERUNfRU9GX1NFVCAgMHgwMDAwMDAxMAotI2RlZmluZSBBVURJT19FVkVOVF9OVU0JCTEwCi0KLSNkZWZpbmUgX19DT05UQUlOUyhyLCB2LCBsKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdHlwZW9mKHIpIF9fciA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdHlwZW9mKHYpIF9fdiA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdHlwZW9mKHYpIF9fZSA9IF9fdiArIGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaW50IHJlcyA9ICgoX192ID49IF9fci0+dmFkZHIpICYmICAgICAgICAgICAgICAgICAgICAgICBcCi0JCShfX2UgPD0gX19yLT52YWRkciArIF9fci0+bGVuKSk7ICAgICAgICAgICAgICAgIFwKLQlyZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0KLSNkZWZpbmUgQ09OVEFJTlMocjEsIHIyKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JdHlwZW9mKHIyKSBfX3IyID0gcjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX19DT05UQUlOUyhyMSwgX19yMi0+dmFkZHIsIF9fcjItPmxlbik7ICAgICAgICAgICAgICAgICBcCi19KQotCi0jZGVmaW5lIElOX1JBTkdFKHIsIHYpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZihyKSBfX3IgPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZih2KSBfX3Z2ID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWludCByZXMgPSAoKF9fdnYgPj0gX19yLT52YWRkcikgJiYgICAgICAgICAgICAgICAgICAgICAgXAotCQkoX192diA8IChfX3ItPnZhZGRyICsgX19yLT5sZW4pKSk7ICAgICAgICAgICAgICBcCi0JcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19KQotCi0jZGVmaW5lIE9WRVJMQVBTKHIxLCByMikgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZihyMSkgX19yMSA9IHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZihyMikgX19yMiA9IHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZihfX3IyLT52YWRkcikgX192ID0gX19yMi0+dmFkZHI7ICAgICAgICAgICAgICAgICAgXAotCXR5cGVvZihfX3YpIF9fZSA9IF9fdiArIF9fcjItPmxlbiAtIDE7ICAgICAgICAgICAgICAgICAgXAotCWludCByZXMgPSAoSU5fUkFOR0UoX19yMSwgX192KSB8fCBJTl9SQU5HRShfX3IxLCBfX2UpKTsgXAotCXJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSkKLQotc3RydWN0IHRpbWVzdGFtcCB7Ci0JdTMyIGxvd3BhcnQ7Ci0JdTMyIGhpZ2hwYXJ0OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG1ldGFfb3V0X2RzcCB7Ci0JdTMyIG9mZnNldF90b19mcmFtZTsKLQl1MzIgZnJhbWVfc2l6ZTsKLQl1MzIgZW5jb2RlZF9wY21fc2FtcGxlczsKLQl1MzIgbXN3X3RzOwotCXUzMiBsc3dfdHM7Ci0JdTMyIG5mbGFnczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBkZWNfbWV0YV9pbiB7Ci0JdW5zaWduZWQgY2hhciByZXNlcnZlZFsxOF07Ci0JdW5zaWduZWQgc2hvcnQgb2Zmc2V0OwotCXN0cnVjdCB0aW1lc3RhbXAgbnRpbWVzdGFtcDsKLQl1bnNpZ25lZCBpbnQgbmZsYWdzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGRlY19tZXRhX291dCB7Ci0JdW5zaWduZWQgaW50IHJlc2VydmVkWzddOwotCXVuc2lnbmVkIGludCBudW1fb2ZfZnJhbWVzOwotCXN0cnVjdCBtZXRhX291dF9kc3AgbWV0YV9vdXRfZHNwW107Ci19IF9fcGFja2VkOwotCi0vKiBHZW5lcmFsIG1ldGEgZmllbGQgdG8gc3RvcmUgbWV0YSBpbmZvIGxvY2FsbHkgKi8KLXVuaW9uICBtZXRhX2RhdGEgewotCXN0cnVjdCBkZWNfbWV0YV9vdXQgbWV0YV9vdXQ7Ci0Jc3RydWN0IGRlY19tZXRhX2luIG1ldGFfaW47Ci19IF9fcGFja2VkOwotCi0vKiBwZXIgZGV2aWNlIHdha2V1cCBzb3VyY2UgbWFuYWdlciAqLwotc3RydWN0IHdzX21nciB7Ci0Jc3RydWN0IG11dGV4ICAgICAgIHdzX2xvY2s7Ci0JdWludDMyX3QgICAgICAgICAgIHJlZl9jbnQ7Ci19OwotCi0jZGVmaW5lIFBDTV9CVUZfQ09VTlQgICAgICAgICAgICgyKQotLyogQnVmZmVyIHdpdGggbWV0YSAqLwotI2RlZmluZSBQQ01fQlVGU1pfTUlOICAgICAgICAgICAoKDQqMTAyNCkgKyBzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCkpCi0KLS8qIEZSQU1FX05VTSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCi0jZGVmaW5lIEZSQU1FX05VTSAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBGUkFNRV9TSVpFCSgoNCoxNTM2KSArIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfaW4pKQotCi1zdHJ1Y3QgYXVkaW9fYWlvX2lvbl9yZWdpb24gewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCWludCBmZDsKLQl2b2lkICp2YWRkcjsKLQlwaHlzX2FkZHJfdCBwYWRkcjsKLQl2b2lkICprdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0JdW5zaWduZWQgaW50IHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fYWlvX2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JaW50IGV2ZW50X3R5cGU7Ci0JdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYgYnVmOwotCXVuc2lnbmVkIGxvbmcgcGFkZHI7Ci0JdWludDMyX3QgdG9rZW47Ci0Jdm9pZCAgICAgICAgICAgICprdmFkZHI7Ci0JdW5pb24gbWV0YV9kYXRhIG1ldGFfaW5mbzsKLX07Ci0KLXN0cnVjdCBxNmF1ZGlvX2FpbzsKLXN0cnVjdCBhdWRpb19haW9fZHJ2X29wZXJhdGlvbnMgewotCXZvaWQgKCpvdXRfZmx1c2gpKHN0cnVjdCBxNmF1ZGlvX2FpbyAqKTsKLQl2b2lkICgqaW5fZmx1c2gpKHN0cnVjdCBxNmF1ZGlvX2FpbyAqKTsKLX07Ci0KLXN0cnVjdCBxNmF1ZGlvX2FpbyB7Ci0JYXRvbWljX3QgaW5fYnl0ZXM7Ci0JYXRvbWljX3QgaW5fc2FtcGxlczsKLQotCXN0cnVjdCBtc21fYXVkaW9fc3RyZWFtX2NvbmZpZyBzdHJfY2ZnOwotCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZyAgICAgICAgYnVmX2NmZzsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyBwY21fY2ZnOwotCXZvaWQgKmNvZGVjX2NmZzsKLQotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlYWRfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggZ2V0X2V2ZW50X2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgY21kX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF93YWl0OwotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0Jc3BpbmxvY2tfdCBldmVudF9xdWV1ZV9sb2NrOwotCi0Jc3RydWN0IG1pc2NkZXZpY2UgKm1pc2NkZXZpY2U7Ci0JdWludDMyX3Qgd2FrZWxvY2tfdm90ZWQ7Ci0Jc3RydWN0IHdzX21nciAqYXVkaW9fd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotI2VuZGlmCi0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7ICAgICAvKiBxdWV1ZSB0byByZXRhaW4gb3V0cHV0IGJ1ZmZlcnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGluX3F1ZXVlOyAgICAgIC8qIHF1ZXVlIHRvIHJldGFpbiBpbnB1dCBidWZmZXJzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2V2ZW50X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBpb25fcmVnaW9uX3F1ZXVlOyAgICAgLyogcHJvdGVjdGVkIGJ5IGxvY2sgKi8KLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBhdWRpb19haW9fZHJ2X29wZXJhdGlvbnMgZHJ2X29wczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBlb3Nfd3JpdGVfcGF5bG9hZDsKLQl1aW50MzJfdCBkZXZpY2VfZXZlbnRzOwotCXVpbnQxNl90IHZvbHVtZTsKLQl1aW50MzJfdCBkcnZfc3RhdHVzOwotCWludCBldmVudF9hYm9ydDsKLQlpbnQgZW9zX3JzcDsKLQlpbnQgZW9zX2ZsYWc7Ci0JaW50IG9wZW5lZDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgc3RvcHBlZDsKLQlpbnQgZmVlZGJhY2s7Ci0JaW50IHJmbHVzaDsgICAgICAgICAgICAgLyogUmVhZCAgZmx1c2ggKi8KLQlpbnQgd2ZsdXNoOyAgICAgICAgICAgICAvKiBXcml0ZSBmbHVzaCAqLwotCWJvb2wgcmVzZXRfZXZlbnQ7Ci0JbG9uZyAoKmNvZGVjX2lvY3RsKShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotCWxvbmcgKCpjb2RlY19jb21wYXRfaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci19OwotCi12b2lkIGF1ZGlvX2Fpb19hc3luY193cml0ZV9hY2soc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgdWludDMyX3QgdG9rZW4sCi0JCQkJdWludDMyX3QgKnBheWxvYWQpOwotCi12b2lkIGF1ZGlvX2Fpb19hc3luY19yZWFkX2FjayhzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCB1aW50MzJfdCB0b2tlbiwKLQkJCXVpbnQzMl90ICpwYXlsb2FkKTsKLQotaW50IGluc2VydF9lb3NfYnVmKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlKTsKLQotdm9pZCBleHRyYWN0X21ldGFfb3V0X2luZm8oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywKLQkJc3RydWN0IGF1ZGlvX2Fpb19idWZmZXJfbm9kZSAqYnVmX25vZGUsIGludCBkaXIpOwotCi1pbnQgYXVkaW9fYWlvX29wZW4oc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbywgc3RydWN0IGZpbGUgKmZpbGUpOwotaW50IGF1ZGlvX2Fpb19lbmFibGUoc3RydWN0IHE2YXVkaW9fYWlvICAqYXVkaW8pOwotdm9pZCBhdWRpb19haW9fcG9zdF9ldmVudChzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvLCBpbnQgdHlwZSwKLQkJdW5pb24gbXNtX2F1ZGlvX2V2ZW50X3BheWxvYWQgcGF5bG9hZCk7Ci1pbnQgYXVkaW9fYWlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotaW50IGF1ZGlvX2Fpb19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpOwotdm9pZCBhdWRpb19haW9fYXN5bmNfb3V0X2ZsdXNoKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pOwotdm9pZCBhdWRpb19haW9fYXN5bmNfaW5fZmx1c2goc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyk7Ci12b2lkIGF1ZGlvX2Fpb19pb3BvcnRfcmVzZXQoc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyk7Ci1pbnQgZW5hYmxlX3ZvbHVtZV9yYW1wKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8pOwotI2lmZGVmIENPTkZJR19ERUJVR19GUwotaW50IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXNzaXplX3QgYXVkaW9fYWlvX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fd21hLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3dtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzUzMzRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvYXVkaW9fd21hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyogd21hIGF1ZGlvIG91dHB1dCBkZXZpY2UKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggSFRDIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX3dtYS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzX2Fpby5oIgotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hX21pc2M7Ci1zdGF0aWMgc3RydWN0IHdzX21nciBhdWRpb193bWFfd3NfbWdyOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb193bWFfZGVidWdfZm9wcyA9IHsKLQkucmVhZCA9IGF1ZGlvX2Fpb19kZWJ1Z19yZWFkLAotCS5vcGVuID0gYXVkaW9fYWlvX2RlYnVnX29wZW4sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJCXZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJc3RydWN0IGFzbV93bWFfY2ZnIHdtYV9jZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiAqd21hX2NvbmZpZzsKLQotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVVESU9fU1RBUlQgc2Vzc2lvbl9pZFslZF1cbiIsIF9fZnVuY19fLAotCQkJCQkJYXVkaW8sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQkvKiBDb25maWd1cmUgUENNIG91dHB1dCBibG9jayAqLwotCQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oYXVkaW8tPmFjLAotCQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCJwY20gb3V0cHV0IGJsb2NrIGNvbmZpZyBmYWlsZWRcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXdtYV9jb25maWcgPSAoc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJd21hX2NmZy5mb3JtYXRfdGFnID0gd21hX2NvbmZpZy0+Zm9ybWF0X3RhZzsKLQkJd21hX2NmZy5jaF9jZmcgPSB3bWFfY29uZmlnLT5udW1jaGFubmVsczsKLQkJd21hX2NmZy5zYW1wbGVfcmF0ZSA9ICB3bWFfY29uZmlnLT5zYW1wbGluZ3JhdGU7Ci0JCXdtYV9jZmcuYXZnX2J5dGVzX3Blcl9zZWMgPSB3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKLQkJd21hX2NmZy5ibG9ja19hbGlnbiA9IHdtYV9jb25maWctPmJsb2NrX2FsaWduOwotCQl3bWFfY2ZnLnZhbGlkX2JpdHNfcGVyX3NhbXBsZSA9Ci0JCQkJd21hX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlOwotCQl3bWFfY2ZnLmNoX21hc2sgPSAgd21hX2NvbmZpZy0+Y2hhbm5lbG1hc2s7Ci0JCXdtYV9jZmcuZW5jb2RlX29wdCA9IHdtYV9jb25maWctPmVuY29kZW9wdDsKLQkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLwotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWEoYXVkaW8tPmFjLCAmd21hX2NmZywKLQkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiY21kIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCi0JCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9XTUFfQ09ORklHX1YyOiB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsIGF1ZGlvLT5jb2RlY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyKSkpIHsKLQkJCXByX2VycigiJXM6Y29weV90b191c2VyIGZvciBBVURJT19TRVRfV01BX0NPTkZJR19WMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1dNQV9DT05GSUdfVjI6IHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGF1ZGlvLT5jb2RlY19jZmcsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MikpKSB7Ci0JCQlwcl9lcnIoIiVzOmNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfV01BX0NPTkZJR19WMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyIHsKLQl1MTYgZm9ybWF0X3RhZzsKLQl1MTYgbnVtY2hhbm5lbHM7Ci0JdTMyIHNhbXBsaW5ncmF0ZTsKLQl1MzIgYXZnYnl0ZXNwZXJzZWNvbmQ7Ci0JdTE2IGJsb2NrX2FsaWduOwotCXUxNiB2YWxpZGJpdHNwZXJzYW1wbGU7Ci0JdTMyIGNoYW5uZWxtYXNrOwotCXUxNiBlbmNvZGVvcHQ7Ci19OwotCi1lbnVtIHsKLQlBVURJT19HRVRfV01BX0NPTkZJR19WMl8zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsyKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyKSwKLQlBVURJT19TRVRfV01BX0NPTkZJR19WMl8zMiA9ICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyXzMyKQotfTsKLQotc3RhdGljIGxvbmcgYXVkaW9fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXJjID0gYXVkaW9faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHZvaWQgKilhcmcpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfV01BX0NPTkZJR19WMl8zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIgKndtYV9jb25maWc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192Ml8zMiB3bWFfY29uZmlnXzMyOwotCi0JCW1lbXNldCgmd21hX2NvbmZpZ18zMiwgMCwgc2l6ZW9mKHdtYV9jb25maWdfMzIpKTsKLQotCQl3bWFfY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCXdtYV9jb25maWdfMzIuZm9ybWF0X3RhZyA9IHdtYV9jb25maWctPmZvcm1hdF90YWc7Ci0JCXdtYV9jb25maWdfMzIubnVtY2hhbm5lbHMgPSB3bWFfY29uZmlnLT5udW1jaGFubmVsczsKLQkJd21hX2NvbmZpZ18zMi5zYW1wbGluZ3JhdGUgPSB3bWFfY29uZmlnLT5zYW1wbGluZ3JhdGU7Ci0JCXdtYV9jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQgPSB3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZDsKLQkJd21hX2NvbmZpZ18zMi5ibG9ja19hbGlnbiA9IHdtYV9jb25maWctPmJsb2NrX2FsaWduOwotCQl3bWFfY29uZmlnXzMyLnZhbGlkYml0c3BlcnNhbXBsZSA9Ci0JCQkJCXdtYV9jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZTsKLQkJd21hX2NvbmZpZ18zMi5jaGFubmVsbWFzayA9IHdtYV9jb25maWctPmNoYW5uZWxtYXNrOwotCQl3bWFfY29uZmlnXzMyLmVuY29kZW9wdCA9IHdtYV9jb25maWctPmVuY29kZW9wdDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJndtYV9jb25maWdfMzIsCi0JCQlzaXplb2Yod21hX2NvbmZpZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEdFVF9XTUFfQ09ORklHX1YyXzMyIGZhaWxlZFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1dNQV9DT05GSUdfVjJfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyICp3bWFfY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjJfMzIgd21hX2NvbmZpZ18zMjsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJndtYV9jb25maWdfMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHdtYV9jb25maWdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIFNFVF9XTUFfQ09ORklHX1YyXzMyIGZhaWxlZFxuIgotCQkJCSwgX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJd21hX2NvbmZpZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIgKilhdWRpby0+Y29kZWNfY2ZnOwotCQl3bWFfY29uZmlnLT5mb3JtYXRfdGFnID0gd21hX2NvbmZpZ18zMi5mb3JtYXRfdGFnOwotCQl3bWFfY29uZmlnLT5udW1jaGFubmVscyA9IHdtYV9jb25maWdfMzIubnVtY2hhbm5lbHM7Ci0JCXdtYV9jb25maWctPnNhbXBsaW5ncmF0ZSA9IHdtYV9jb25maWdfMzIuc2FtcGxpbmdyYXRlOwotCQl3bWFfY29uZmlnLT5hdmdieXRlc3BlcnNlY29uZCA9IHdtYV9jb25maWdfMzIuYXZnYnl0ZXNwZXJzZWNvbmQ7Ci0JCXdtYV9jb25maWctPmJsb2NrX2FsaWduID0gd21hX2NvbmZpZ18zMi5ibG9ja19hbGlnbjsKLQkJd21hX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlID0KLQkJCQl3bWFfY29uZmlnXzMyLnZhbGlkYml0c3BlcnNhbXBsZTsKLQkJd21hX2NvbmZpZy0+Y2hhbm5lbG1hc2sgPSB3bWFfY29uZmlnXzMyLmNoYW5uZWxtYXNrOwotCQl3bWFfY29uZmlnLT5lbmNvZGVvcHQgPSB3bWFfY29uZmlnXzMyLmVuY29kZW9wdDsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2NvbXBhdF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiRmFpbGVkIGluIHV0aWxzX2lvY3RsOiAlZFxuIiwgcmMpOwotCQlicmVhazsKLQl9Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGF1ZGlvX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBhdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBOVUxMOwotCWludCByYyA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQkvKiA0IGJ5dGVzIHJlcHJlc2VudHMgZGVjb2RlciBudW1iZXIsIDEgYnl0ZSBmb3IgdGVybWluYXRlIHN0cmluZyAqLwotCWNoYXIgbmFtZVtzaXplb2YgIm1zbV93bWFfIiArIDVdOwotI2VuZGlmCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19haW8pLCBHRlBfS0VSTkVMKTsKLQotCWlmIChhdWRpbyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWF1ZGlvLT5jb2RlY19jZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWdfdjIpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoYXVkaW8tPmNvZGVjX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX3dtYV9taXNjOwotCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOwotCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fd21hX3dzX21ncjsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKLQkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKLQotCWlmICghYXVkaW8tPmFjKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKLQkJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXJjID0gYXVkaW9fYWlvX29wZW4oYXVkaW8sIGZpbGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW9fYWlvX29wZW4gcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfQotCS8qIG9wZW4gaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0xJTkVBUl9QQ00sCi0JCQkJCSAgIEZPUk1BVF9XTUFfVjkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gV01BIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMSovCi0JCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9XTUFfVjkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIk5vdCBzdXBwb3J0ZWQgbW9kZVxuIik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1zbV93bWFfJTA0eCIsIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JYXVkaW8tPmRlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IDA0NDQsCi0JCQkJCSAgICBOVUxMLCAodm9pZCAqKWF1ZGlvLAotCQkJCQkgICAgJmF1ZGlvX3dtYV9kZWJ1Z19mb3BzKTsKLQotCWlmIChJU19FUlIoYXVkaW8tPmRlbnRyeSkpCi0JCXByX2RlYnVnKCJkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQlwcl9pbmZvKCIlczp3bWFkZWMgc3VjY2VzcyBtb2RlWyVkXXNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWF1ZGlvLT5mZWVkYmFjaywKLQkJCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIHJjOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3dtYV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKLQkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV93bWEiLAotCS5mb3BzID0gJmF1ZGlvX3dtYV9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fd21hX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fd21hX21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fd21hX21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX3dtYV93c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fd21hX3dzX21nci53c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb193bWFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3dtYXByby5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9hdWRpb193bWFwcm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiOWRiMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3dtYXByby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qIHdtYXBybyBhdWRpbyBvdXRwdXQgZGV2aWNlCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb193bWFwcm8uaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGF1ZGlvX3dtYXByb19taXNjOwotc3RhdGljIHN0cnVjdCB3c19tZ3IgYXVkaW9fd21hcHJvX3dzX21ncjsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9fd21hcHJvX2RlYnVnX2ZvcHMgPSB7Ci0JLnJlYWQgPSBhdWRpb19haW9fZGVidWdfcmVhZCwKLQkub3BlbiA9IGF1ZGlvX2Fpb19kZWJ1Z19vcGVuLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgbG9uZyBhdWRpb19pb2N0bF9zaGFyZWQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJCQl2b2lkICphcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOiB7Ci0JCXN0cnVjdCBhc21fd21hcHJvX2NmZyB3bWFwcm9fY2ZnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcgKndtYXByb19jb25maWc7Ci0KLQkJcHJfZGVidWcoIiVzOiBBVURJT19TVEFSVCBzZXNzaW9uX2lkWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJLyogQ29uZmlndXJlIFBDTSBvdXRwdXQgYmxvY2sgKi8KLQkJCXJjID0gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGF1ZGlvLT5hYywKLQkJCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQsCi0JCQkJCTE2LCAvKiBiaXRzIHBlciBzYW1wbGUgKi8KLQkJCQkJdHJ1ZSwgLyogdXNlIGRlZmF1bHQgY2hhbm5lbCBtYXAgKi8KLQkJCQkJdHJ1ZSwgLyogdXNlIGJhY2sgY2hhbm5lbCBtYXAgZmxhdm9yICovCi0JCQkJCU5VTEwpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigicGNtIG91dHB1dCBibG9jayBjb25maWcgZmFpbGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3bWFwcm9fY29uZmlnID0gKHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZyAqKQotCQkJCWF1ZGlvLT5jb2RlY19jZmc7Ci0JCWlmICgod21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnID09IDB4MTYyKSB8fAotCQkod21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnID09IDB4MTYzKSB8fAotCQkod21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnID09IDB4MTY2KSB8fAotCQkod21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnID09IDB4MTY3KSkgewotCQkJd21hcHJvX2NmZy5mb3JtYXRfdGFnID0gd21hcHJvX2NvbmZpZy0+Zm9ybWF0dGFnOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczpBVURJT19TVEFSVCBmYWlsZWQ6IGZvcm1hdHRhZyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWcpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHdtYXByb19jb25maWctPm51bWNoYW5uZWxzID4gMCkgewotCQkJd21hcHJvX2NmZy5jaF9jZmcgPSB3bWFwcm9fY29uZmlnLT5udW1jaGFubmVsczsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6QVVESU9fU1RBUlQgZmFpbGVkOiBjaGFubmVscyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3bWFwcm9fY29uZmlnLT5udW1jaGFubmVscyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAod21hcHJvX2NvbmZpZy0+c2FtcGxpbmdyYXRlID4gMCkgewotCQkJd21hcHJvX2NmZy5zYW1wbGVfcmF0ZSA9IHdtYXByb19jb25maWctPnNhbXBsaW5ncmF0ZTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6QVVESU9fU1RBUlQgZmFpbGVkOiBzYW1wbGVfcmF0ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3bWFwcm9fY29uZmlnLT5zYW1wbGluZ3JhdGUpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJd21hcHJvX2NmZy5hdmdfYnl0ZXNfcGVyX3NlYyA9Ci0JCQkJd21hcHJvX2NvbmZpZy0+YXZnYnl0ZXNwZXJzZWNvbmQ7Ci0JCWlmICgod21hcHJvX2NvbmZpZy0+YXNmcGFja2V0bGVuZ3RoIDw9IDEzMzc2KSB8fAotCQkod21hcHJvX2NvbmZpZy0+YXNmcGFja2V0bGVuZ3RoID4gMCkpIHsKLQkJCXdtYXByb19jZmcuYmxvY2tfYWxpZ24gPQotCQkJCXdtYXByb19jb25maWctPmFzZnBhY2tldGxlbmd0aDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6QVVESU9fU1RBUlQgZmFpbGVkOiBibG9ja19hbGlnbiA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3bWFwcm9fY29uZmlnLT5hc2ZwYWNrZXRsZW5ndGgpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCh3bWFwcm9fY29uZmlnLT52YWxpZGJpdHNwZXJzYW1wbGUgPT0gMTYpIHx8Ci0JCQkod21hcHJvX2NvbmZpZy0+dmFsaWRiaXRzcGVyc2FtcGxlID09IDI0KSkgewotCQkJd21hcHJvX2NmZy52YWxpZF9iaXRzX3Blcl9zYW1wbGUgPQotCQkJCXdtYXByb19jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6QVVESU9fU1RBUlQgZmFpbGVkOiBiaXRzcGVyc2FtcGxlID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHdtYXByb19jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQl3bWFwcm9fY2ZnLmNoX21hc2sgPSB3bWFwcm9fY29uZmlnLT5jaGFubmVsbWFzazsKLQkJd21hcHJvX2NmZy5lbmNvZGVfb3B0ID0gd21hcHJvX2NvbmZpZy0+ZW5jb2Rlb3B0OwotCQl3bWFwcm9fY2ZnLmFkdl9lbmNvZGVfb3B0ID0KLQkJCQl3bWFwcm9fY29uZmlnLT5hZHZhbmNlZGVuY29kZW9wdDsKLQkJd21hcHJvX2NmZy5hZHZfZW5jb2RlX29wdDIgPQotCQkJCXdtYXByb19jb25maWctPmFkdmFuY2VkZW5jb2Rlb3B0MjsKLQkJLyogQ29uZmlndXJlIE1lZGlhIGZvcm1hdCBibG9jayAqLwotCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWFwcm8oYXVkaW8tPmFjLCAmd21hcHJvX2NmZywKLQkJCQlhdWRpby0+YWMtPnN0cmVhbV9pZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiY21kIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBhdWRpb19haW9fZW5hYmxlKGF1ZGlvKTsKLQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQlhdWRpby0+ZW9zX2ZsYWcgPSAwOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIkF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCJBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsIGF1ZGlvLT5lbmFibGVkKTsKLQkJaWYgKGF1ZGlvLT5zdG9wcGVkID09IDEpCi0JCQlhdWRpby0+c3RvcHBlZCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCAlZFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGxvbmcgYXVkaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19HRVRfV01BUFJPX0NPTkZJRzogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+Y29kZWNfY2ZnLAotCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfV01BUFJPX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9XTUFQUk9fQ09ORklHOiB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihhdWRpby0+Y29kZWNfY2ZnLCAodm9pZCAqKWFyZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9XTUFQUk9fQ09ORklHX1YyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlyYyA9IGF1ZGlvX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh2b2lkICopYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6IHsKLQkJcHJfZGVidWcoIiVzWyVwS106IENhbGxpbmcgdXRpbHMgaW9jdGxcbiIsIF9fZnVuY19fLCBhdWRpbyk7Ci0JCXJjID0gYXVkaW8tPmNvZGVjX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCJGYWlsZWQgaW4gdXRpbHNfaW9jdGw6ICVkXG4iLCByYyk7Ci0JCWJyZWFrOwotCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMiB7Ci0JdTE2IGFybWRhdGFyZXF0aHI7Ci0JdTggIHZhbGlkYml0c3BlcnNhbXBsZTsKLQl1OCAgbnVtY2hhbm5lbHM7Ci0JdTE2IGZvcm1hdHRhZzsKLQl1MzIgc2FtcGxpbmdyYXRlOwotCXUzMiBhdmdieXRlc3BlcnNlY29uZDsKLQl1MTYgYXNmcGFja2V0bGVuZ3RoOwotCXUzMiBjaGFubmVsbWFzazsKLQl1MTYgZW5jb2Rlb3B0OwotCXUxNiBhZHZhbmNlZGVuY29kZW9wdDsKLQl1MzIgYWR2YW5jZWRlbmNvZGVvcHQyOwotfTsKLQotZW51bSB7Ci0JQVVESU9fR0VUX1dNQVBST19DT05GSUdfMzIgPSBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMiksCi0JQVVESU9fU0VUX1dNQVBST19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMikKLX07Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0dFVF9XTUFQUk9fQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZyAqd21hcHJvX2NvbmZpZzsKLQkJc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnMzIgd21hcHJvX2NvbmZpZ18zMjsKLQotCQltZW1zZXQoJndtYXByb19jb25maWdfMzIsIDAsIHNpemVvZih3bWFwcm9fY29uZmlnXzMyKSk7Ci0KLQkJd21hcHJvX2NvbmZpZyA9Ci0JCQkoc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnICopYXVkaW8tPmNvZGVjX2NmZzsKLQkJd21hcHJvX2NvbmZpZ18zMi5hcm1kYXRhcmVxdGhyID0gd21hcHJvX2NvbmZpZy0+YXJtZGF0YXJlcXRocjsKLQkJd21hcHJvX2NvbmZpZ18zMi52YWxpZGJpdHNwZXJzYW1wbGUgPQotCQkJCQl3bWFwcm9fY29uZmlnLT52YWxpZGJpdHNwZXJzYW1wbGU7Ci0JCXdtYXByb19jb25maWdfMzIubnVtY2hhbm5lbHMgPSB3bWFwcm9fY29uZmlnLT5udW1jaGFubmVsczsKLQkJd21hcHJvX2NvbmZpZ18zMi5mb3JtYXR0YWcgPSB3bWFwcm9fY29uZmlnLT5mb3JtYXR0YWc7Ci0JCXdtYXByb19jb25maWdfMzIuc2FtcGxpbmdyYXRlID0gd21hcHJvX2NvbmZpZy0+c2FtcGxpbmdyYXRlOwotCQl3bWFwcm9fY29uZmlnXzMyLmF2Z2J5dGVzcGVyc2Vjb25kID0KLQkJCQkJd21hcHJvX2NvbmZpZy0+YXZnYnl0ZXNwZXJzZWNvbmQ7Ci0JCXdtYXByb19jb25maWdfMzIuYXNmcGFja2V0bGVuZ3RoID0KLQkJCQkJd21hcHJvX2NvbmZpZy0+YXNmcGFja2V0bGVuZ3RoOwotCQl3bWFwcm9fY29uZmlnXzMyLmNoYW5uZWxtYXNrID0gd21hcHJvX2NvbmZpZy0+Y2hhbm5lbG1hc2s7Ci0JCXdtYXByb19jb25maWdfMzIuZW5jb2Rlb3B0ID0gd21hcHJvX2NvbmZpZy0+ZW5jb2Rlb3B0OwotCQl3bWFwcm9fY29uZmlnXzMyLmFkdmFuY2VkZW5jb2Rlb3B0ID0KLQkJCQkJd21hcHJvX2NvbmZpZy0+YWR2YW5jZWRlbmNvZGVvcHQ7Ci0JCXdtYXByb19jb25maWdfMzIuYWR2YW5jZWRlbmNvZGVvcHQyID0KLQkJCQkJd21hcHJvX2NvbmZpZy0+YWR2YW5jZWRlbmNvZGVvcHQyOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZ3bWFwcm9fY29uZmlnXzMyLAotCQkJIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9XTUFQUk9fQ09ORklHX1YyXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1dNQVBST19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnICp3bWFwcm9fY29uZmlnOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWczMiB3bWFwcm9fY29uZmlnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmd21hcHJvX2NvbmZpZ18zMiwgKHZvaWQgKilhcmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnMzIpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9XTUFQUk9fQ09ORkdfVjJfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXdtYXByb19jb25maWcgPQotCQkJKHN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZyAqKWF1ZGlvLT5jb2RlY19jZmc7Ci0JCXdtYXByb19jb25maWctPmFybWRhdGFyZXF0aHIgPSB3bWFwcm9fY29uZmlnXzMyLmFybWRhdGFyZXF0aHI7Ci0JCXdtYXByb19jb25maWctPnZhbGlkYml0c3BlcnNhbXBsZSA9Ci0JCQkJCXdtYXByb19jb25maWdfMzIudmFsaWRiaXRzcGVyc2FtcGxlOwotCQl3bWFwcm9fY29uZmlnLT5udW1jaGFubmVscyA9IHdtYXByb19jb25maWdfMzIubnVtY2hhbm5lbHM7Ci0JCXdtYXByb19jb25maWctPmZvcm1hdHRhZyA9IHdtYXByb19jb25maWdfMzIuZm9ybWF0dGFnOwotCQl3bWFwcm9fY29uZmlnLT5zYW1wbGluZ3JhdGUgPSB3bWFwcm9fY29uZmlnXzMyLnNhbXBsaW5ncmF0ZTsKLQkJd21hcHJvX2NvbmZpZy0+YXZnYnl0ZXNwZXJzZWNvbmQgPQotCQkJCQl3bWFwcm9fY29uZmlnXzMyLmF2Z2J5dGVzcGVyc2Vjb25kOwotCQl3bWFwcm9fY29uZmlnLT5hc2ZwYWNrZXRsZW5ndGggPQotCQkJCQl3bWFwcm9fY29uZmlnXzMyLmFzZnBhY2tldGxlbmd0aDsKLQkJd21hcHJvX2NvbmZpZy0+Y2hhbm5lbG1hc2sgPSB3bWFwcm9fY29uZmlnXzMyLmNoYW5uZWxtYXNrOwotCQl3bWFwcm9fY29uZmlnLT5lbmNvZGVvcHQgPSB3bWFwcm9fY29uZmlnXzMyLmVuY29kZW9wdDsKLQkJd21hcHJvX2NvbmZpZy0+YWR2YW5jZWRlbmNvZGVvcHQgPQotCQkJCQl3bWFwcm9fY29uZmlnXzMyLmFkdmFuY2VkZW5jb2Rlb3B0OwotCQl3bWFwcm9fY29uZmlnLT5hZHZhbmNlZGVuY29kZW9wdDIgPQotCQkJCQl3bWFwcm9fY29uZmlnXzMyLmFkdmFuY2VkZW5jb2Rlb3B0MjsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJcmMgPSBhdWRpb19pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodm9pZCAqKWFyZyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OiB7Ci0JCXByX2RlYnVnKCIlc1slcEtdOiBDYWxsaW5nIHV0aWxzIGlvY3RsXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlyYyA9IGF1ZGlvLT5jb2RlY19jb21wYXRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIkZhaWxlZCBpbiB1dGlsc19pb2N0bDogJWRcbiIsIHJjKTsKLQkJYnJlYWs7Ci0JfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZWxzZQotI2RlZmluZSBhdWRpb19jb21wYXRfaW9jdGwgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYXVkaW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JLyogNCBieXRlcyByZXByZXNlbnRzIGRlY29kZXIgbnVtYmVyLCAxIGJ5dGUgZm9yIHRlcm1pbmF0ZSBzdHJpbmcgKi8KLQljaGFyIG5hbWVbc2l6ZW9mICJtc21fd21hcHJvXyIgKyA1XTsKLSNlbmRpZgotCWF1ZGlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHE2YXVkaW9fYWlvKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoYXVkaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdWRpby0+Y29kZWNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGF1ZGlvLT5jb2RlY19jZmcgPT0gTlVMTCkgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCi0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGU1pfTUlOOwotCWF1ZGlvLT5taXNjZGV2aWNlID0gJmF1ZGlvX3dtYXByb19taXNjOwotCWF1ZGlvLT53YWtlbG9ja192b3RlZCA9IGZhbHNlOwotCWF1ZGlvLT5hdWRpb193c19tZ3IgPSAmYXVkaW9fd21hcHJvX3dzX21ncjsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKSBxNl9hdWRpb19jYiwKLQkJCQkJICAgICAodm9pZCAqKWF1ZGlvKTsKLQotCWlmICghYXVkaW8tPmFjKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iKTsKLQkJa2ZyZWUoYXVkaW8tPmNvZGVjX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmMgPSBhdWRpb19haW9fb3BlbihhdWRpbywgZmlsZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19haW9fb3BlbiByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogb3BlbiBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQkJICAgRk9STUFUX1dNQV9WMTBQUk8pOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIk5UIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCS8qIG9wZW4gV01BIGRlY29kZXIsIGV4cGVjdGVkIGZyYW1lcyBpcyBhbHdheXMgMSovCi0JCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDE7Ci0JfSBlbHNlIGlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCXJjID0gcTZhc21fb3Blbl93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9XTUFfVjEwUFJPKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCJUIG1vZGUgT3BlbiBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJYXVkaW8tPmJ1Zl9jZmcubWV0YV9pbmZvX2VuYWJsZSA9IDB4MDA7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJOb3Qgc3VwcG9ydGVkIG1vZGVcbiIpOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJtc21fd21hcHJvXyUwNHgiLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCWF1ZGlvLT5kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCAwNDQ0LAotCQkJCQkgICAgTlVMTCwgKHZvaWQgKilhdWRpbywKLQkJCQkJICAgICZhdWRpb193bWFwcm9fZGVidWdfZm9wcyk7Ci0KLQlpZiAoSVNfRVJSKGF1ZGlvLT5kZW50cnkpKQotCQlwcl9kZWJ1ZygiZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWRcbiIpOwotI2VuZGlmCi0JcHJfaW5mbygiJXM6d21hcHJvIGRlY29kZXIgb3BlbiBzdWNjZXNzLCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIHJjOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvLT5jb2RlY19jZmcpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX3dtYXByb19mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYXVkaW9fb3BlbiwKLQkucmVsZWFzZSA9IGF1ZGlvX2Fpb19yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IGF1ZGlvX2lvY3RsLAotCS5mc3luYyA9IGF1ZGlvX2Fpb19mc3luYywKLQkuY29tcGF0X2lvY3RsID0gYXVkaW9fY29tcGF0X2lvY3RsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fd21hcHJvX21pc2MgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gIm1zbV93bWFwcm8iLAotCS5mb3BzID0gJmF1ZGlvX3dtYXByb19mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fd21hcHJvX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gbWlzY19yZWdpc3RlcigmYXVkaW9fd21hcHJvX21pc2MpOwotCi0JaWYgKHJldCA9PSAwKQotCQlkZXZpY2VfaW5pdF93YWtldXAoYXVkaW9fd21hcHJvX21pc2MudGhpc19kZXZpY2UsIHRydWUpOwotCWF1ZGlvX3dtYXByb193c19tZ3IucmVmX2NudCA9IDA7Ci0JbXV0ZXhfaW5pdCgmYXVkaW9fd21hcHJvX3dzX21nci53c19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhdWRpb193bWFwcm9faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2V2cmNfaW4uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZXZyY19pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAyNzFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZXZyY19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19xY3AuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKLQotLyogQnVmZmVyIHdpdGggbWV0YSovCi0jZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQotCi0vKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgyMytzaXplb2Yoc3RydWN0IG1ldGFfb3V0X2RzcCkpICogMTApKQotCi1zdGF0aWMgbG9uZyBldnJjX2luX2lvY3RsX3NoYXJlZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0JaW50IGNudCA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOwotCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgewotCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiByYXRlX21vZHVsYXRpb25fY21kIHNldCB0byB6ZXJvCi0JCSAqIGN1cnJlbnRseSBub3QgY29uZmlndXJhYmxlIGZyb20gdXNlciBzcGFjZQotCQkgKi8KLQkJcmMgPSBxNmFzbV9lbmNfY2ZnX2Jsa19ldnJjKGF1ZGlvLT5hYywKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmLAotCQkJZW5jX2NmZy0+bWluX2JpdF9yYXRlLAotCQkJZW5jX2NmZy0+bWF4X2JpdF9yYXRlLCAwKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBldnJjIG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF1ZGlvLT5mZWVkYmFjayA9PSBOT05fVFVOTkVMX01PREUpIHsKLQkJCXJjID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShhdWRpby0+YWMsCi0JCQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUsCi0JCQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0KLQkJCWlmIChyYyA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IG1lZGlhIGZvcm1hdCBibG9jayBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKLQkJcmMgPSBhdWRpb19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKLQkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCi0JCXJjID0gMDsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUT1BcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnICpjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKLQkJY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnICopYXJnOwotCQlpZiAoY2ZnID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IE5VTEwgY29uZmlnIHBvaW50ZXIgZm9yICVzXG4iLAotCQkJCQlfX2Z1bmNfXywgIkFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUciKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZmctPm1pbl9iaXRfcmF0ZSA+IDQgfHwKLQkJCSBjZmctPm1pbl9iaXRfcmF0ZSA8IDEgfHwKLQkJCSAoY2ZnLT5taW5fYml0X3JhdGUgPT0gMikpIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBtaW4gYml0cmF0ZVxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY2ZnLT5tYXhfYml0X3JhdGUgPiA0IHx8Ci0JCQkgY2ZnLT5tYXhfYml0X3JhdGUgPCAxIHx8Ci0JCQkgKGNmZy0+bWF4X2JpdF9yYXRlID09IDIpKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGludmFsaWQgbWF4IGJpdHJhdGVcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQllbmNfY2ZnLT5taW5fYml0X3JhdGUgPSBjZmctPm1pbl9iaXRfcmF0ZTsKLQkJZW5jX2NmZy0+bWF4X2JpdF9yYXRlID0gY2ZnLT5tYXhfYml0X3JhdGU7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBtaW5fYml0X3JhdGU9IDB4JXggbWF4X2JpdF9yYXRlPTB4JXhcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgZW5jX2NmZy0+bWluX2JpdF9yYXRlLAotCQkJZW5jX2NmZy0+bWF4X2JpdF9yYXRlKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBsb25nIGV2cmNfaW5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGV2cmNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0VWUkNfRU5DX0NPTkZJRzogewotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCBhdWRpby0+ZW5jX2NmZywKLQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRVZSQ19FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBldnJjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZzMyIHsKLQl1MzIgY2RtYV9yYXRlOwotCXUzMiBtaW5fYml0X3JhdGU7Ci0JdTMyIG1heF9iaXRfcmF0ZTsKLX07Ci0KLWVudW0gewotCUFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUdfMzIgPSAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywKLQkJMiwgc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWczMiksCi0JQVVESU9fR0VUX0VWUkNfRU5DX0NPTkZJR18zMiA9ICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLAotCQkzLCBzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZzMyKQotfTsKLQotc3RhdGljIGxvbmcgZXZyY19pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IGV2cmNfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX0VWUkNfRU5DX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZzMyIGNmZ18zMjsKLQkJc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgKmVuY19jZmc7Ci0KLQkJbWVtc2V0KCZjZmdfMzIsIDAsIHNpemVvZihjZmdfMzIpKTsKLQotCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7Ci0JCWNmZ18zMi5jZG1hX3JhdGUgPSBlbmNfY2ZnLT5jZG1hX3JhdGU7Ci0JCWNmZ18zMi5taW5fYml0X3JhdGUgPSBlbmNfY2ZnLT5taW5fYml0X3JhdGU7Ci0JCWNmZ18zMi5tYXhfYml0X3JhdGUgPSBlbmNfY2ZnLT5tYXhfYml0X3JhdGU7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZ18zMiwKLQkJCXNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfRVZSQ19FTkNfQ09ORklHXzMyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyBjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnMzIgY2ZnXzMyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnXzMyLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2ZnLmNkbWFfcmF0ZSA9IGNmZ18zMi5jZG1hX3JhdGU7Ci0JCWNmZy5taW5fYml0X3JhdGUgPSBjZmdfMzIubWluX2JpdF9yYXRlOwotCQljZmcubWF4X2JpdF9yYXRlID0gY2ZnXzMyLm1heF9iaXRfcmF0ZTsKLQkJY21kID0gQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRzsKLQkJcmMgPSBldnJjX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9FVlJDX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZWxzZQotI2RlZmluZSBldnJjX2luX2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBldnJjX2luX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gKmF1ZGlvID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZyAqZW5jX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19pbiksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLwotCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmIChhdWRpby0+ZW5jX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMjM7Ci0JYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZiA9IDEwOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRl9TSVpFOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0JZW5jX2NmZy0+bWluX2JpdF9yYXRlID0gNDsKLQllbmNfY2ZnLT5tYXhfYml0X3JhdGUgPSA0OwotCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSAxOwotCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gODAwMDsKLQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKXE2YXNtX2luX2NiLAotCQkJCSh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIG9wZW4gZXZyYyBlbmNvZGVyIGluIFQvTlQgbW9kZSAqLwotCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+ZmVlZGJhY2sgPSBOT05fVFVOTkVMX01PREU7Ci0JCXJjID0gcTZhc21fb3Blbl9yZWFkX3dyaXRlKGF1ZGlvLT5hYywgRk9STUFUX0VWUkMsCi0JCQkJCUZPUk1BVF9MSU5FQVJfUENNKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBOVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWQoYXVkaW8tPmFjLCBGT1JNQVRfRVZSQyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KLQkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7Ci0JYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBldnJjX2luX2NvbXBhdF9pb2N0bDsKLQlhdWRpby0+ZW5jX2lvY3RsID0gZXZyY19pbl9pb2N0bDsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhdWRpbzsKLQotCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCXJldHVybiAwOwotZmFpbDoKLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShhdWRpby0+YWMpOwotCWtmcmVlKGF1ZGlvLT5lbmNfY2ZnKTsKLQlrZnJlZShhdWRpbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19pbl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBldnJjX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgICA9IGF1ZGlvX2luX2NvbXBhdF9pb2N0bAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fZXZyY19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZXZyY19pbiIsCi0JLmZvcHMJPSAmYXVkaW9faW5fZm9wcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGV2cmNfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19ldnJjX2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZXZyY19pbl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZzcxMWFsYXdfaW4uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvZzcxMWFsYXdfaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4YzBhMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFhbGF3X2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2c3MTEuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKLQotLyogQnVmZmVyIHdpdGggbWV0YSovCi0jZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQotCi0vKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgzMjArc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKLXN0YXRpYyBsb25nIGc3MTFfaW5faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyAqZW5jX2NmZzsKLQotCQllbmNfY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICopYXVkaW8tPmVuY19jZmc7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBkZWZhdWx0IGJ1ZiBhbGxvY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7Ci0JCWlmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSB7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGUgJWQiLCBfX2Z1bmNfXywgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOwotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX2c3MTEoYXVkaW8tPmFjLAotCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYsCi0JCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgZzcxMSBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKGF1ZGlvLT5hYywKLQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKLQotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZCByYz0lZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKLQkJcmMgPSBhdWRpb19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKLQkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCi0JCXJjID0gMDsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUT1BcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCQlyYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICpjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCWVuY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKLQotCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhcmc7Ci0JCWlmIChjZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy0+c2FtcGxlX3JhdGUgIT0gODAwMCAmJgotCQkJIGNmZy0+c2FtcGxlX3JhdGUgIT0gMTYwMDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBzYW1wbGUgcmF0ZVxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IGNmZy0+c2FtcGxlX3JhdGU7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBzYW1wbGVfcmF0ZT0gMHgleCIsCi0JCQlfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBnNzExX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfZzcxMV9FTkNfQ09ORklHIGZhaWxlZCIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgY2ZnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJRyBmYWlsZWQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gZzcxMV9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIHsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLX07Ci0KLWVudW0gewotCUFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMikKLX07Ci0KLXN0YXRpYyBsb25nIGc3MTFfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMiBjZmdfMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyICopYXVkaW8tPmVuY19jZmc7Ci0JCWNmZ18zMi5zYW1wbGVfcmF0ZSA9IGVuY19jZmctPnNhbXBsZV9yYXRlOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLAotCQkJc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgY2ZnXzMyOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNmZy5zYW1wbGVfcmF0ZSA9IGNmZ18zMi5zYW1wbGVfcmF0ZTsKLQkJY21kID0gQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJRzsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9HNzExX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRU5PSU9DVExDTUQ7Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGc3MTFfaW5fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGc3MTFfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOwotCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2luKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoYXVkaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLwotCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmIChhdWRpby0+ZW5jX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCi0JLyoKLQkgKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDMyMDsKLQlhdWRpby0+bWF4X2ZyYW1lc19wZXJfYnVmID0gMTA7Ci0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGX1NJWkU7Ci0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKLQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpcTZhc21faW5fY2IsCi0JCQkJKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogb3BlbiBnNzExIGVuY29kZXIgaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9BTEFXX0ZTLAotCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsIEZPUk1BVF9HNzExX0FMQVdfRlMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KLQkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOwotCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gZzcxMV9pbl9jb21wYXRfaW9jdGw7Ci0JYXVkaW8tPmVuY19pb2N0bCA9IGc3MTFfaW5faW9jdGw7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0KLQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gZzcxMV9pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwJPSBhdWRpb19pbl9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bCAgID0gYXVkaW9faW5fY29tcGF0X2lvY3RsLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19nNzExYWxhd19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZzcxMWFsYXdfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBnNzExYWxhd19pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2c3MTFhbGF3X2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZzcxMWFsYXdfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFtbGF3X2luLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL2c3MTFtbGF3X2luLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmM0NDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9nNzExbWxhd19pbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19nNzExLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzLmgiCi0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0jdW5kZWYgUFJPQ19BREQKLSNlbmRpZgotLyogQnVmZmVyIHdpdGggbWV0YSovCi0jZGVmaW5lIFBDTV9CVUZfU0laRQkJKDQwOTYgKyBzaXplb2Yoc3RydWN0IG1ldGFfaW4pKQotCi0vKiBNYXhpbXVtIDEwIGZyYW1lcyBpbiBidWZmZXIgd2l0aCBtZXRhICovCi0jZGVmaW5lIEZSQU1FX1NJWkUJCSgxICsgKCgzMjArc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKLXN0YXRpYyBsb25nIGc3MTFfaW5faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyAqZW5jX2NmZzsKLQotCQllbmNfY2ZnID0gKHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICopYXVkaW8tPmVuY19jZmc7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBkZWZhdWx0IGJ1ZiBhbGxvY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmJ1Zl9hbGxvYyk7Ci0JCWlmIChhdWRpby0+ZW5hYmxlZCA9PSAxKSB7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGUgJWQiLCBfX2Z1bmNfXywgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOwotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX2c3MTEoYXVkaW8tPmFjLAotCQkJYXVkaW8tPmJ1Zl9jZmcuZnJhbWVzX3Blcl9idWYsCi0JCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBjbWQgZzcxMSBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYXVkaW8tPmZlZWRiYWNrID09IE5PTl9UVU5ORUxfTU9ERSkgewotCQkJcmMgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKGF1ZGlvLT5hYywKLQkJCQlhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50KTsKLQotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogbWVkaWEgZm9ybWF0IGJsb2NrIGZhaWxlZCByYz0lZFxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBlbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5lbmFibGVkKTsKLQkJcmMgPSBhdWRpb19pbl9lbmFibGUoYXVkaW8pOwotCQlpZiAoIXJjKSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlhdWRpby0+ZW5hYmxlZCA9IDA7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0YXJ0IHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXdoaWxlIChjbnQrKyA8IGF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9jb3VudCkKLQkJCXE2YXNtX3JlYWQoYXVkaW8tPmFjKTsgLyogUHVzaCBidWZmZXIgdG8gRFNQICovCi0JCXJjID0gMDsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUQVJUIHN1Y2Nlc3MgZW5hYmxlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IEFVRElPX1NUT1BcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gYXVkaW9faW5fZGlzYWJsZShhdWRpbyk7Ci0JCWlmIChyYyAgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IEF1ZGlvIFN0b3AgcHJvY2VkdXJlIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLAotCQkJCQlyYyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICpjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCWVuY19jZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKLQotCQljZmcgPSAoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgKilhcmc7Ci0JCWlmIChjZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy0+c2FtcGxlX3JhdGUgIT0gODAwMCAmJgotCQkJIGNmZy0+c2FtcGxlX3JhdGUgIT0gMTYwMDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBzYW1wbGUgcmF0ZVxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IGNmZy0+c2FtcGxlX3JhdGU7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBzYW1wbGVfcmF0ZT0gMHgleCIsCi0JCQlfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgZW5jX2NmZy0+c2FtcGxlX3JhdGUpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FTk9JT0NUTENNRDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBnNzExX2luX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfZzcxMV9FTkNfQ09ORklHIGZhaWxlZCIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcgY2ZnOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCAodm9pZCAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNmZykpKSB7Ci0JCQlwcl9lcnIoCi0JCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3IgQVVESU9fR0VUX0c3MTFfRU5DX0NPTkZJRyBmYWlsZWQiLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gZzcxMV9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHIGZhaWxlZC4gUmM9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIHsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLX07Ci0KLWVudW0gewotCUFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgPSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyKSwKLQlBVURJT19HRVRfRzcxMV9FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMikKLX07Ci0KLXN0YXRpYyBsb25nIGc3MTFfaW5fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDoKLQljYXNlIEFVRElPX1NUT1A6IHsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzI6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWczMiBjZmdfMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyICopYXVkaW8tPmVuY19jZmc7Ci0JCWNmZ18zMi5zYW1wbGVfcmF0ZSA9IGVuY19jZmctPnNhbXBsZV9yYXRlOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY2ZnXzMyLAotCQkJc2l6ZW9mKGNmZ18zMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZm9yIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfRzcxMV9FTkNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnMzIgY2ZnXzMyOwotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZzMyIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZ18zMiwgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUdfMzIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWNmZy5zYW1wbGVfcmF0ZSA9IGNmZ18zMi5zYW1wbGVfcmF0ZTsKLQkJY21kID0gQVVESU9fU0VUX0c3MTFfRU5DX0NPTkZJRzsKLQkJcmMgPSBnNzExX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsICh1bnNpZ25lZCBsb25nKSZjZmcpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOkFVRElPX1NFVF9HNzExX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRU5PSU9DVExDTUQ7Ci0JfQotCXJldHVybiByYzsKLX0KLSNlbHNlCi0jZGVmaW5lIGc3MTFfaW5fY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGc3MTFfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOwotCXN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnICplbmNfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlhdWRpbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxNmF1ZGlvX2luKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoYXVkaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLwotCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19nNzExX2VuY19jb25maWcpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmIChhdWRpby0+ZW5jX2NmZyA9PSBOVUxMKSB7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVuY19jZmcgPSBhdWRpby0+ZW5jX2NmZzsKLQotCW11dGV4X2luaXQoJmF1ZGlvLT5sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+cmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZhdWRpby0+d3JpdGVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmF1ZGlvLT5kc3BfbG9jayk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXVkaW8tPndyaXRlX3dhaXQpOwotCi0JLyoKLQkgKiBTZXR0aW5ncyB3aWxsIGJlIHJlLWNvbmZpZyBhdCBBVURJT19TRVRfQ09ORklHLAotCSAqIGJ1dCBhdCBsZWFzdCB3ZSBuZWVkIHRvIGhhdmUgaW5pdGlhbCBjb25maWcKLQkgKi8KLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfc2l6ZSA9IEZSQU1FX1NJWkU7Ci0JYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50ID0gRlJBTUVfTlVNOwotCWF1ZGlvLT5taW5fZnJhbWVfc2l6ZSA9IDMyMDsKLQlhdWRpby0+bWF4X2ZyYW1lc19wZXJfYnVmID0gMTA7Ci0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX3NpemUgPSBQQ01fQlVGX1NJWkU7Ci0JYXVkaW8tPnBjbV9jZmcuYnVmZmVyX2NvdW50ID0gUENNX0JVRl9DT1VOVDsKLQllbmNfY2ZnLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0JYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCA9IDE7Ci0JYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSA4MDAwOwotCWF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUgPSAweDAxOwotCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmID0gMHgwMTsKLQlhdWRpby0+ZXZlbnRfYWJvcnQgPSAwOwotCi0JYXVkaW8tPmFjID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKChhcHBfY2IpcTZhc21faW5fY2IsCi0JCQkJKHZvaWQgKilhdWRpbyk7Ci0KLQlpZiAoIWF1ZGlvLT5hYykgewotCQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0JCWtmcmVlKGF1ZGlvKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogb3BlbiBnNzExIGVuY29kZXIgaW4gVC9OVCBtb2RlICovCi0JaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKLQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IE5PTl9UVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWRfd3JpdGUoYXVkaW8tPmFjLCBGT1JNQVRfRzcxMV9NTEFXX0ZTLAotCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9IGVsc2UgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkJKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCWF1ZGlvLT5mZWVkYmFjayA9IFRVTk5FTF9NT0RFOwotCQlyYyA9IHE2YXNtX29wZW5fcmVhZChhdWRpby0+YWMsIEZPUk1BVF9HNzExX01MQVdfRlMpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJLyogcmVnaXN0ZXIgZm9yIHR4IG92ZXJmbG93ICh2YWxpZCBmb3IgdHVubmVsIG1vZGUgb25seSkgKi8KLQkJcmMgPSBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coYXVkaW8tPmFjLCAweDAxKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBUWCBPdmVyZmxvdyByZWdpc3RyYXRpb24gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVW5leHBlY3RlZCBtb2RlXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCQlyYyA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlhdWRpby0+b3BlbmVkID0gMTsKLQlhdWRpby0+cmVzZXRfZXZlbnQgPSBmYWxzZTsKLQlhdG9taWNfc2V0KCZhdWRpby0+aW5fY291bnQsIFBDTV9CVUZfQ09VTlQpOwotCWF0b21pY19zZXQoJmF1ZGlvLT5vdXRfY291bnQsIDB4MDApOwotCWF1ZGlvLT5lbmNfY29tcGF0X2lvY3RsID0gZzcxMV9pbl9jb21wYXRfaW9jdGw7Ci0JYXVkaW8tPmVuY19pb2N0bCA9IGc3MTFfaW5faW9jdGw7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYXVkaW87Ci0KLQlwcl9pbmZvKCIlczpzZXNzaW9uIGlkICVkOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYXVkaW8tPmFjKTsKLQlrZnJlZShhdWRpby0+ZW5jX2NmZyk7Ci0Ja2ZyZWUoYXVkaW8pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gZzcxMV9pbl9vcGVuLAotCS5yZWxlYXNlCT0gYXVkaW9faW5fcmVsZWFzZSwKLQkucmVhZAkJPSBhdWRpb19pbl9yZWFkLAotCS53cml0ZQkJPSBhdWRpb19pbl93cml0ZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBhdWRpb19pbl9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bCAgID0gYXVkaW9faW5fY29tcGF0X2lvY3RsLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19nNzExbWxhd19pbl9taXNjID0gewotCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQk9ICJtc21fZzcxMW1sYXdfaW4iLAotCS5mb3BzCT0gJmF1ZGlvX2luX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBnNzExbWxhd19pbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmF1ZGlvX2c3MTFtbGF3X2luX21pc2MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoZzcxMW1sYXdfaW5faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fY29tbW9uLmggYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Yjg4YjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xNmF1ZGlvX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotCi0vKiBGb3IgRGVjb2RlcnMgKi8KLSNpZm5kZWYgX19RNl9BVURJT19DT01NT05fSF9fCi0jZGVmaW5lIF9fUTZfQVVESU9fQ09NTU9OX0hfXwotCi0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KLQotCi12b2lkIHE2X2F1ZGlvX2NiKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCi0JCXVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KTsKLQotdm9pZCBhdWRpb19haW9fY2IodWludDMyX3Qgb3Bjb2RlLCB1aW50MzJfdCB0b2tlbiwKLQkJCXVpbnQzMl90ICpwYXlsb2FkLCAgdm9pZCAqYXVkaW8pOwotCi0KLS8qIEZvciBFbmNvZGVycyAqLwotdm9pZCBxNmFzbV9pbl9jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdik7Ci0KLXZvaWQgIGF1ZGlvX2luX2dldF9kc3BfZnJhbWVzKHZvaWQgKmF1ZGlvLAotCQl1aW50MzJfdCB0b2tlbiwJdWludDMyX3QgKnBheWxvYWQpOwotCi0jZW5kaWYgLypfX1E2X0FVRElPX0NPTU1PTl9IX18qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xNmF1ZGlvX3YyLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwNTE2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSAiYXVkaW9fdXRpbHMuaCIKLQotdm9pZCBxNmFzbV9pbl9jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IHE2YXVkaW9faW4gKilwcml2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgb3Bjb2RlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOgotCQlhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyhhdWRpbywgdG9rZW4sIHBheWxvYWQpOwotCQlicmVhazsKLQljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6Ci0JCWF0b21pY19pbmMoJmF1ZGlvLT5pbl9jb3VudCk7Ci0JCXdha2VfdXAoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1M6Ci0JCWF1ZGlvLT5lb3NfcnNwID0gMTsKLQkJd2FrZV91cCgmYXVkaW8tPnJlYWRfd2FpdCk7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX1NUUkVBTV9DTURSU1BfR0VUX1BQX1BBUkFNU19WMjoKLQkJYnJlYWs7Ci0JY2FzZSBBU01fU0VTU0lPTl9FVkVOVFhfT1ZFUkZMT1c6Ci0JCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogQVNNX1NFU1NJT05fRVZFTlRfVFhfT1ZFUkZMT1dcbiIsCi0JCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRVNFVF9FVkVOVFM6Ci0JCXByX2RlYnVnKCIlczpyZWNlaXZlZCBSRVNFVCBFVkVOVFNcbiIsIF9fZnVuY19fKTsKLQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQlhdWRpby0+c3RvcHBlZCA9IDE7Ci0JCWF1ZGlvLT5ldmVudF9hYm9ydCA9IDE7Ci0JCWF1ZGlvLT5yZXNldF9ldmVudCA9IHRydWU7Ci0JCXdha2VfdXAoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBJZ25vcmUgb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgb3Bjb2RlKTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1ZGlvLT5kc3BfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkICBhdWRpb19pbl9nZXRfZHNwX2ZyYW1lcyh2b2lkICpwcml2LAotCXVpbnQzMl90IHRva2VuLAl1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSAoc3RydWN0IHE2YXVkaW9faW4gKilwcml2OwotCXVpbnQzMl90IGluZGV4OwotCi0JaW5kZXggPSBxNmFzbV9nZXRfYnVmX2luZGV4X2Zyb21fdG9rZW4odG9rZW4pOwotCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBpbmRleD0lZCBuciBmcmFtZXM9JWQgb2Zmc2V0WyVkXVxuIiwKLQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHRva2VuLCBwYXlsb2FkWzldLAotCQkJcGF5bG9hZFs1XSk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHRpbWVtc3c9JWQgbHN3PSVkXG4iLCBfX2Z1bmNfXywKLQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbiwgcGF5bG9hZFs3XSwgcGF5bG9hZFs2XSk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IHVmbGFncz0weCU4eCB1aWQ9MHglOHhcbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBwYXlsb2FkWzhdLCBwYXlsb2FkWzEwXSk7Ci0JcHJfZGVidWcoIiVzOnNlc3Npb24gaWQgJWQ6IGVuY19mcmFtZXNvdGFsX3NpemU9MHglOHhcbiIsIF9fZnVuY19fLAotCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBwYXlsb2FkWzRdKTsKLQotCS8qIEVuc3VyZSB0aGUgaW5kZXggaXMgd2l0aGluIG1heCBhcnJheSBzaXplOiBGUkFNRV9OVU0gKi8KLQlpZiAoaW5kZXggPj0gRlJBTUVfTlVNKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaW5kZXggJWRcbiIsCi0JCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JYXVkaW8tPm91dF9mcmFtZV9pbmZvW2luZGV4XVswXSA9IHBheWxvYWRbOV07Ci0JYXVkaW8tPm91dF9mcmFtZV9pbmZvW2luZGV4XVsxXSA9IHBheWxvYWRbNV07Ci0KLQkvKiBzdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKHBheWxvYWRbNF0sICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQocGF5bG9hZFs5XSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmYXVkaW8tPm91dF9jb3VudCkgPD0gYXVkaW8tPnN0cl9jZmcuYnVmZmVyX2NvdW50KSB7Ci0JCWF0b21pY19pbmMoJmF1ZGlvLT5vdXRfY291bnQpOwotCQl3YWtlX3VwKCZhdWRpby0+cmVhZF93YWl0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjJfYWlvLmMgYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3E2YXVkaW9fdjJfYWlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzY0NTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xNmF1ZGlvX3YyX2Fpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLSNpbmNsdWRlICJhdWRpb191dGlsc19haW8uaCIKLQotdm9pZCBxNl9hdWRpb19jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQl1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvID0gKHN0cnVjdCBxNmF1ZGlvX2FpbyAqKXByaXY7Ci0KLQlwcl9kZWJ1ZygiJXM6b3Bjb2RlID0gJXggdG9rZW4gPSAweCV4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlLCB0b2tlbik7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjI6Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1M6Ci0JY2FzZSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjoKLQljYXNlIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU06Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZOgotCWNhc2UgQVNNX0RBVEFfRVZFTlRfRU5DX1NSX0NNX0NIQU5HRV9OT1RJRlk6Ci0JY2FzZSBSRVNFVF9FVkVOVFM6Ci0JCWF1ZGlvX2Fpb19jYihvcGNvZGUsIHRva2VuLCBwYXlsb2FkLCBhdWRpbyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczpVbmhhbmRsZWQgZXZlbnQgPSAweCU4eFxuIiwgX19mdW5jX18sIG9wY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBhdWRpb19haW9fY2IodWludDMyX3Qgb3Bjb2RlLCB1aW50MzJfdCB0b2tlbiwKLQkJdWludDMyX3QgKnBheWxvYWQsICB2b2lkICpwcml2LypzdHJ1Y3QgcTZhdWRpb19haW8gKmF1ZGlvKi8pCi17Ci0Jc3RydWN0IHE2YXVkaW9fYWlvICphdWRpbyA9IChzdHJ1Y3QgcTZhdWRpb19haW8gKilwcml2OwotCXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIGVfcGF5bG9hZDsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyOgotCQlwcl9kZWJ1ZygiJXNbJXBLXTpBU01fREFUQV9FVkVOVF9XUklURV9ET05FIHRva2VuID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgdG9rZW4pOwotCQlhdWRpb19haW9fYXN5bmNfd3JpdGVfYWNrKGF1ZGlvLCB0b2tlbiwgcGF5bG9hZCk7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOgotCQlwcl9kZWJ1ZygiJXNbJXBLXTpBU01fREFUQV9FVkVOVF9SRUFEX0RPTkUgdG9rZW4gPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGF1ZGlvLCB0b2tlbik7Ci0JCWF1ZGlvX2Fpb19hc3luY19yZWFkX2FjayhhdWRpbywgdG9rZW4sIHBheWxvYWQpOwotCQlicmVhazsKLQljYXNlIEFTTV9EQVRBX0VWRU5UX1JFTkRFUkVEX0VPUzoKLQkJLyogRU9TIEhhbmRsZSAqLwotCQlwcl9kZWJ1ZygiJXNbJXBLXTpBU01fREFUQV9DTURSU1BfRU9TXG4iLCBfX2Z1bmNfXywgYXVkaW8pOwotCQlpZiAoYXVkaW8tPmZlZWRiYWNrKSB7IC8qIE5vbi1UdW5uZWwgbW9kZSAqLwotCQkJYXVkaW8tPmVvc19yc3AgPSAxOwotCQkJLyogcHJvcGFnYXRlIGlucHV0IEVPUyBpL3AgYnVmZmVyLAotCQkJICogYWZ0ZXIgcmVjZWl2aW5nIERTUCBhY2tub3dsZWRnbWVudAotCQkJICovCi0JCQlpZiAoYXVkaW8tPmVvc19mbGFnICYmCi0JCQkJKGF1ZGlvLT5lb3Nfd3JpdGVfcGF5bG9hZC5haW9fYnVmLmJ1Zl9hZGRyKSkgewotCQkJCWF1ZGlvX2Fpb19wb3N0X2V2ZW50KGF1ZGlvLAotCQkJCQkJQVVESU9fRVZFTlRfV1JJVEVfRE9ORSwKLQkJCQkJCWF1ZGlvLT5lb3Nfd3JpdGVfcGF5bG9hZCk7Ci0JCQkJbWVtc2V0KCZhdWRpby0+ZW9zX3dyaXRlX3BheWxvYWQsIDAsCi0JCQkJCXNpemVvZih1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCkpOwotCQkJCWF1ZGlvLT5lb3NfZmxhZyA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qIFR1bm5lbCBtb2RlICovCi0JCQlhdWRpby0+ZW9zX3JzcCA9IDE7Ci0JCQl3YWtlX3VwKCZhdWRpby0+d3JpdGVfd2FpdCk7Ci0JCQl3YWtlX3VwKCZhdWRpby0+Y21kX3dhaXQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI6Ci0JY2FzZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOgotCQlwcl9kZWJ1ZygiJXNbJXBLXTpwYXlsb2FkMFsleF0gcGF5bG9hMWRbJXhdb3Bjb2RlPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGF1ZGlvLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLCBvcGNvZGUpOwotCQlicmVhazsKLQljYXNlIEFTTV9EQVRBX0VWRU5UX1NSX0NNX0NIQU5HRV9OT1RJRlk6Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9FTkNfU1JfQ01fQ0hBTkdFX05PVElGWToKLQkJcHJfZGVidWcoIiVzWyVwS106IEFTTV9EQVRBX0VWRU5UX1NSX0NNX0NIQU5HRV9OT1RJRlksIHBheWxvYWRbMF0tc3IgPSAlZCwgcGF5bG9hZFsxXS1jaGwgPSAlZCwgcGF5bG9hZFsyXSA9ICVkLCBwYXlsb2FkWzNdID0gJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgYXVkaW8sIHBheWxvYWRbMF0sCi0JCQkJCSBwYXlsb2FkWzFdLCBwYXlsb2FkWzJdLCBwYXlsb2FkWzNdKTsKLQotCQlwcl9kZWJ1ZygiJXNbJXBLXTogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSwgc3IocHJldikgPSAlZCwgY2hsKHByZXYpID0gJWQsIiwKLQkJX19mdW5jX18sIGF1ZGlvLCBhdWRpby0+cGNtX2NmZy5zYW1wbGVfcmF0ZSwKLQkJYXVkaW8tPnBjbV9jZmcuY2hhbm5lbF9jb3VudCk7Ci0KLQkJYXVkaW8tPnBjbV9jZmcuc2FtcGxlX3JhdGUgPSBwYXlsb2FkWzBdOwotCQlhdWRpby0+cGNtX2NmZy5jaGFubmVsX2NvdW50ID0gcGF5bG9hZFsxXSAmIDB4RkZGRjsKLQkJZV9wYXlsb2FkLnN0cmVhbV9pbmZvLmNoYW5faW5mbyA9IGF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQ7Ci0JCWVfcGF5bG9hZC5zdHJlYW1faW5mby5zYW1wbGVfcmF0ZSA9IGF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlOwotCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfU1RSRUFNX0lORk8sIGVfcGF5bG9hZCk7Ci0JCWJyZWFrOwotCWNhc2UgUkVTRVRfRVZFTlRTOgotCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvcGNvZGU6MHgleFxuIiwgX19mdW5jX18sIG9wY29kZSk7Ci0JCWF1ZGlvLT5zdG9wcGVkID0gMTsKLQkJYXVkaW8tPnJlc2V0X2V2ZW50ID0gdHJ1ZTsKLQkJd2FrZV91cCgmYXVkaW8tPmV2ZW50X3dhaXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXZvaWQgZXh0cmFjdF9tZXRhX291dF9pbmZvKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sCi0JCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlLCBpbnQgZGlyKQotewotCXN0cnVjdCBkZWNfbWV0YV9vdXQgKm1ldGFfZGF0YSA9IGJ1Zl9ub2RlLT5rdmFkZHI7Ci0JdWludDMyX3QgdGVtcDsKLQotCWlmIChkaXIpIHsgLyogaW5wdXQgYnVmZmVyIC0gV3JpdGUgKi8KLQkJaWYgKGF1ZGlvLT5idWZfY2ZnLm1ldGFfaW5mb19lbmFibGUpCi0JCQltZW1jcHkoJmJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbiwKLQkJCShjaGFyICopYnVmX25vZGUtPmt2YWRkciwgc2l6ZW9mKHN0cnVjdCBkZWNfbWV0YV9pbikpOwotCQllbHNlCi0JCQltZW1zZXQoJmJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbiwKLQkJCTAsIHNpemVvZihzdHJ1Y3QgZGVjX21ldGFfaW4pKTsKLQkJcHJfZGVidWcoIiVzWyVwS106aS9wOiBtc3dfdHMgJWQgbHN3X3RzICVkIG5mbGFncyAweCU4eFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCWJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbi5udGltZXN0YW1wLmhpZ2hwYXJ0LAotCQkJYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX2luLm50aW1lc3RhbXAubG93cGFydCwKLQkJCWJ1Zl9ub2RlLT5tZXRhX2luZm8ubWV0YV9pbi5uZmxhZ3MpOwotCX0gZWxzZSB7IC8qIG91dHB1dCBidWZmZXIgLSBSZWFkICovCi0JCW1lbWNweSgoY2hhciAqKWJ1Zl9ub2RlLT5rdmFkZHIsCi0JCQkmYnVmX25vZGUtPm1ldGFfaW5mby5tZXRhX291dCwKLQkJCXNpemVvZihzdHJ1Y3QgZGVjX21ldGFfb3V0KSk7Ci0JCW1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLm5mbGFncyA9IDB4MDAwMDAwMDA7Ci0JCXRlbXAgPSBtZXRhX2RhdGEtPm1ldGFfb3V0X2RzcFswXS5tc3dfdHM7Ci0JCW1ldGFfZGF0YS0+bWV0YV9vdXRfZHNwWzBdLm1zd190cyA9Ci0JCQkJbWV0YV9kYXRhLT5tZXRhX291dF9kc3BbMF0ubHN3X3RzOwotCQltZXRhX2RhdGEtPm1ldGFfb3V0X2RzcFswXS5sc3dfdHMgPSB0ZW1wOwotCi0JCXByX2RlYnVnKCIlc1slcEtdOm8vcDogbXN3X3RzICVkIGxzd190cyAlZCBuZmxhZ3MgMHglOHgsIG51bV9mcmFtZXMgPSAlZFxuIiwKLQkJX19mdW5jX18sIGF1ZGlvLAotCQkoKHN0cnVjdCBkZWNfbWV0YV9vdXQgKilidWZfbm9kZS0+a3ZhZGRyKS0+Ci0JCQltZXRhX291dF9kc3BbMF0ubXN3X3RzLAotCQkoKHN0cnVjdCBkZWNfbWV0YV9vdXQgKilidWZfbm9kZS0+a3ZhZGRyKS0+Ci0JCQltZXRhX291dF9kc3BbMF0ubHN3X3RzLAotCQkoKHN0cnVjdCBkZWNfbWV0YV9vdXQgKilidWZfbm9kZS0+a3ZhZGRyKS0+Ci0JCQltZXRhX291dF9kc3BbMF0ubmZsYWdzLAotCQkoKHN0cnVjdCBkZWNfbWV0YV9vdXQgKilidWZfbm9kZS0+a3ZhZGRyKS0+bnVtX29mX2ZyYW1lcyk7Ci0JfQotfQotCi0vKiBSZWFkIGJ1ZmZlciBmcm9tIERTUCAvIEhhbmRsZSBBY2sgZnJvbSBEU1AgKi8KLXZvaWQgYXVkaW9fYWlvX2FzeW5jX3JlYWRfYWNrKHN0cnVjdCBxNmF1ZGlvX2FpbyAqYXVkaW8sIHVpbnQzMl90IHRva2VuLAotCQkJdWludDMyX3QgKnBheWxvYWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOwotCXN0cnVjdCBhdWRpb19haW9fYnVmZmVyX25vZGUgKmZpbGxlZF9idWY7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIE5vIGFjdGl2ZSBmbHVzaCBpbiBwcm9ncmVzcyAqLwotCWlmIChhdWRpby0+cmZsdXNoKQotCQlyZXR1cm47Ci0KLQkvKiBTdGF0aXN0aWNzIG9mIHJlYWQgKi8KLQlhdG9taWNfYWRkKHBheWxvYWRbNF0sICZhdWRpby0+aW5fYnl0ZXMpOwotCWF0b21pY19hZGQocGF5bG9hZFs5XSwgJmF1ZGlvLT5pbl9zYW1wbGVzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmYXVkaW8tPmluX3F1ZXVlKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJcHJfd2FybigiJXMgdW5leHBlY3RlZCBhY2sgZnJvbSBkc3BcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlmaWxsZWRfYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmYXVkaW8tPmluX3F1ZXVlLAotCQkJCQlzdHJ1Y3QgYXVkaW9fYWlvX2J1ZmZlcl9ub2RlLCBsaXN0KTsKLQotCXByX2RlYnVnKCIlcyB0b2tlbjogMHhbJXhdLCBmaWxsZWRfYnVmLT50b2tlbjogMHhbJXhdIiwKLQkJCQkgX19mdW5jX18sIHRva2VuLCBmaWxsZWRfYnVmLT50b2tlbik7Ci0JaWYgKHRva2VuID09IChmaWxsZWRfYnVmLT50b2tlbikpIHsKLQkJbGlzdF9kZWwoJmZpbGxlZF9idWYtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdWRpby0+ZHNwX2xvY2ssIGZsYWdzKTsKLQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmID0gZmlsbGVkX2J1Zi0+YnVmOwotCQkvKiBSZWFkIGRvbmUgQnVmZmVyIGR1ZSB0byBmbHVzaC9ub3JtYWwgY29uZGl0aW9uCi0JCSAqIGFmdGVyIEVPUyBldmVudCwgc28gYXBwZW5kIEVPUyBidWZmZXIKLQkJICovCi0JCWlmIChhdWRpby0+ZW9zX3JzcCA9PSAweDEpIHsKLQkJCWV2ZW50X3BheWxvYWQuYWlvX2J1Zi5kYXRhX2xlbiA9Ci0JCQlpbnNlcnRfZW9zX2J1ZihhdWRpbywgZmlsbGVkX2J1Zik7Ci0JCQkvKiBSZXNldCBmbGFnIGJhY2sgdG8gaW5kaWNhdGUgZW9zIGludGltYXRlZCAqLwotCQkJYXVkaW8tPmVvc19yc3AgPSAwOwotCQl9IGVsc2UgewotCQkJZmlsbGVkX2J1Zi0+bWV0YV9pbmZvLm1ldGFfb3V0Lm51bV9vZl9mcmFtZXMKLQkJCQkJCQkgPSBwYXlsb2FkWzldOwotCQkJZXZlbnRfcGF5bG9hZC5haW9fYnVmLmRhdGFfbGVuID0gcGF5bG9hZFs0XQotCQkJCSArIHBheWxvYWRbNV0gKyBzaXplb2Yoc3RydWN0IGRlY19tZXRhX291dCk7Ci0JCQlwcl9kZWJ1ZygiJXNbJXBLXTpuciBvZiBmcmFtZXMgMHglOHggbGVuPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpbywKLQkJCQlmaWxsZWRfYnVmLT5tZXRhX2luZm8ubWV0YV9vdXQubnVtX29mX2ZyYW1lcywKLQkJCQlldmVudF9wYXlsb2FkLmFpb19idWYuZGF0YV9sZW4pOwotCQkJZXh0cmFjdF9tZXRhX291dF9pbmZvKGF1ZGlvLCBmaWxsZWRfYnVmLCAwKTsKLQkJCWF1ZGlvLT5lb3NfcnNwID0gMDsKLQkJfQotCQlwcl9kZWJ1ZygiJXMsIHBvc3RpbmcgcmVhZCBkb25lIHRvIHRoZSBhcHAgaGVyZVxuIiwgX19mdW5jX18pOwotCQlhdWRpb19haW9fcG9zdF9ldmVudChhdWRpbywgQVVESU9fRVZFTlRfUkVBRF9ET05FLAotCQkJCQlldmVudF9wYXlsb2FkKTsKLQkJa2ZyZWUoZmlsbGVkX2J1Zik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlc1slcEtdOmV4cGVjdGVkPSV4IHJldD0leFxuIiwKLQkJCV9fZnVuY19fLCBhdWRpbywgZmlsbGVkX2J1Zi0+dG9rZW4sIHRva2VuKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXVkaW8tPmRzcF9sb2NrLCBmbGFncyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xY2VscF9pbi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi9xY2VscF9pbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTU1MjBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvcWNlbHBfaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fcWNwLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotI2luY2x1ZGUgImF1ZGlvX3V0aWxzLmgiCi0KLS8qIEJ1ZmZlciB3aXRoIG1ldGEqLwotI2RlZmluZSBQQ01fQlVGX1NJWkUJCSg0MDk2ICsgc2l6ZW9mKHN0cnVjdCBtZXRhX2luKSkKLQotLyogTWF4aW11bSAxMCBmcmFtZXMgaW4gYnVmZmVyIHdpdGggbWV0YSAqLwotI2RlZmluZSBGUkFNRV9TSVpFCQkoMSArICgoMzUrc2l6ZW9mKHN0cnVjdCBtZXRhX291dF9kc3ApKSAqIDEwKSkKLQotc3RhdGljIGxvbmcgcWNlbHBfaW5faW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBxNmF1ZGlvX2luICAqYXVkaW8gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBBVURJT19TVEFSVDogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgKmVuY19jZmc7Ci0KLQkJZW5jX2NmZyA9IGF1ZGlvLT5lbmNfY2ZnOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogZGVmYXVsdCBidWYgYWxsb2NbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24sIGF1ZGlvLT5idWZfYWxsb2MpOwotCQlpZiAoYXVkaW8tPmVuYWJsZWQgPT0gMSkgewotCQkJcHJfaW5mbygiJXM6QVVESU9fU1RBUlQgYWxyZWFkeSBvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IGF1ZGlvX2luX2J1Zl9hbGxvYyhhdWRpbyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiByZWR1Y2VkX3JhdGVfbGV2ZWwsIHJhdGVfbW9kdWxhdGlvbl9jbWQgc2V0IHRvIHplcm8KLQkJICogY3VycmVudGx5IG5vdCBjb25maWd1cmFibGUgZnJvbSB1c2VyIHNwYWNlCi0JCSAqLwotCQlyYyA9IHE2YXNtX2VuY19jZmdfYmxrX3FjZWxwKGF1ZGlvLT5hYywKLQkJCWF1ZGlvLT5idWZfY2ZnLmZyYW1lc19wZXJfYnVmLAotCQkJZW5jX2NmZy0+bWluX2JpdF9yYXRlLAotCQkJZW5jX2NmZy0+bWF4X2JpdF9yYXRlLCAwLCAwKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IGNtZCBxY2VscCBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChhdWRpby0+ZmVlZGJhY2sgPT0gTk9OX1RVTk5FTF9NT0RFKSB7Ci0JCQlyYyA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYXVkaW8tPmFjLAotCQkJCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlLAotCQkJCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQpOwotCi0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBtZWRpYSBmb3JtYXQgYmxvY2sgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogQVVESU9fU1RBUlQgZW5hYmxlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJYXVkaW8tPmFjLT5zZXNzaW9uLCBhdWRpby0+ZW5hYmxlZCk7Ci0JCXJjID0gYXVkaW9faW5fZW5hYmxlKGF1ZGlvKTsKLQkJaWYgKCFyYykgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAxOwotCQl9IGVsc2UgewotCQkJYXVkaW8tPmVuYWJsZWQgPSAwOwotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdGFydCBwcm9jZWR1cmUgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAoY250KysgPCBhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQpCi0JCQlxNmFzbV9yZWFkKGF1ZGlvLT5hYyk7IC8qIFB1c2ggYnVmZmVyIHRvIERTUCAqLwotCQlyYyA9IDA7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVEFSVCBzdWNjZXNzIGVuYWJsZVslZF1cbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgYXVkaW8tPmVuYWJsZWQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXByX2RlYnVnKCIlczpzZXNzaW9uIGlkICVkOiBBVURJT19TVE9QXG4iLCBfX2Z1bmNfXywKLQkJCQlhdWRpby0+YWMtPnNlc3Npb24pOwotCQlyYyA9IGF1ZGlvX2luX2Rpc2FibGUoYXVkaW8pOwotCQlpZiAocmMgIDwgMCkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBBdWRpbyBTdG9wIHByb2NlZHVyZSBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwKLQkJCQkJcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnICpjZmc7Ci0JCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyAqZW5jX2NmZzsKLQotCQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7Ci0JCWNmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgKilhcmc7Ci0JCWlmIChjZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogTlVMTCBjb25maWcgcG9pbnRlclxuIiwgX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNmZy0+bWluX2JpdF9yYXRlID4gNCB8fAotCQkJIGNmZy0+bWluX2JpdF9yYXRlIDwgMSkgewotCQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBpbnZhbGlkIG1pbiBiaXRyYXRlXG4iLAotCQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjZmctPm1heF9iaXRfcmF0ZSA+IDQgfHwKLQkJCSBjZmctPm1heF9iaXRfcmF0ZSA8IDEpIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogaW52YWxpZCBtYXggYml0cmF0ZVxuIiwKLQkJCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQllbmNfY2ZnLT5jZG1hX3JhdGUgPSBjZmctPmNkbWFfcmF0ZTsKLQkJZW5jX2NmZy0+bWluX2JpdF9yYXRlID0gY2ZnLT5taW5fYml0X3JhdGU7Ci0JCWVuY19jZmctPm1heF9iaXRfcmF0ZSA9IGNmZy0+bWF4X2JpdF9yYXRlOwotCQlwcl9kZWJ1ZygiJXM6c2Vzc2lvbiBpZCAlZDogbWluX2JpdF9yYXRlPSAweCV4IG1heF9iaXRfcmF0ZT0weCV4XG4iLAotCQkJX19mdW5jX18sCi0JCQlhdWRpby0+YWMtPnNlc3Npb24sIGVuY19jZmctPm1pbl9iaXRfcmF0ZSwKLQkJCWVuY19jZmctPm1heF9iaXRfcmF0ZSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGlvY3RsIGNtZCA9ICVkIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgbG9uZyBxY2VscF9pbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAgKmF1ZGlvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fU1RBUlQ6Ci0JY2FzZSBBVURJT19TVE9QOiB7Ci0JCXJjID0gcWNlbHBfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUc6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgYXVkaW8tPmVuY19jZmcsCi0JCQlzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnKSkpIHsKLQkJCXByX2VycigKLQkJCQkiJXM6IGNvcHlfdG9fdXNlciBmb3IgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUcgZmFpbGVkIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUc6IHsKLQkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnIGNmZzsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgKHZvaWQgKikgYXJnLAotCQkJCXNpemVvZihjZmcpKSkgewotCQkJcHJfZXJyKAotCQkJCSIlczogY29weV9mcm9tX3VzZXIgZm9yIEFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHIGZhaWxlZCIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmMgPSBxY2VscF9pbl9pb2N0bF9zaGFyZWQoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykmY2ZnKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczpBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJRyBmYWlsZWQuIFJjPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogVW5rbm93biBpb2N0bCBjbWQgPSAlZCIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByYzsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZzMyIHsKLQl1MzIgY2RtYV9yYXRlOwotCXUzMiBtaW5fYml0X3JhdGU7Ci0JdTMyIG1heF9iaXRfcmF0ZTsKLX07Ci0KLWVudW0gewotCUFVRElPX1NFVF9RQ0VMUF9FTkNfQ09ORklHXzMyID0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywKLQkJMCwgc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnMzIpLAotCUFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHXzMyID0gX0lPUihBVURJT19JT0NUTF9NQUdJQywKLQkJMSwgc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnMzIpCi19OwotCi1zdGF0aWMgbG9uZyBxY2VscF9pbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHE2YXVkaW9faW4gICphdWRpbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NUQVJUOgotCWNhc2UgQVVESU9fU1RPUDogewotCQlyYyA9IHFjZWxwX2luX2lvY3RsX3NoYXJlZChmaWxlLCBjbWQsIGFyZyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFVRElPX0dFVF9RQ0VMUF9FTkNfQ09ORklHXzMyOiB7Ci0JCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZzMyIGNmZ18zMjsKLQkJc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnICplbmNfY2ZnOwotCi0JCW1lbXNldCgmY2ZnXzMyLCAwLCBzaXplb2YoY2ZnXzMyKSk7Ci0KLQkJZW5jX2NmZyA9IChzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgKilhdWRpby0+ZW5jX2NmZzsKLQkJY2ZnXzMyLmNkbWFfcmF0ZSA9IGVuY19jZmctPmNkbWFfcmF0ZTsKLQkJY2ZnXzMyLm1pbl9iaXRfcmF0ZSA9IGVuY19jZmctPm1pbl9iaXRfcmF0ZTsKLQkJY2ZnXzMyLm1heF9iaXRfcmF0ZSA9IGVuY19jZmctPm1heF9iaXRfcmF0ZTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNmZ18zMiwKLQkJCXNpemVvZihjZmdfMzIpKSkgewotCQkJcHJfZXJyKCIlczogY29weV90b191c2VyIGZvciBBVURJT19HRVRfUUNFTFBfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJR18zMjogewotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWczMiBjZmdfMzI7Ci0JCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyBjZmc7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmdfMzIsICh2b2lkICopIGFyZywKLQkJCQlzaXplb2YoY2ZnXzMyKSkpIHsKLQkJCXByX2VycigiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBBVURJT19TRVRfUUNFTFBfRU5DX0NPTkZJR18zMiBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2ZnLmNkbWFfcmF0ZSA9IGNmZ18zMi5jZG1hX3JhdGU7Ci0JCWNmZy5taW5fYml0X3JhdGUgPSBjZmdfMzIubWluX2JpdF9yYXRlOwotCQljZmcubWF4X2JpdF9yYXRlID0gY2ZnXzMyLm1heF9iaXRfcmF0ZTsKLQkJY21kID0gQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUc7Ci0JCXJjID0gcWNlbHBfaW5faW9jdGxfc2hhcmVkKGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmNmZyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6QVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUcgZmFpbGVkLiByYz0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gaW9jdGwgY21kID0gJWQiLCBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0jZWxzZQotI2RlZmluZSBxY2VscF9pbl9jb21wYXRfaW9jdGwgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcWNlbHBfaW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgcTZhdWRpb19pbiAqYXVkaW8gPSBOVUxMOwotCXN0cnVjdCBtc21fYXVkaW9fcWNlbHBfZW5jX2NvbmZpZyAqZW5jX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JYXVkaW8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcTZhdWRpb19pbiksIEdGUF9LRVJORUwpOwotCi0JaWYgKGF1ZGlvID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVyIGNvbmZpZyBwYXJhbSAqLwotCWF1ZGlvLT5lbmNfY2ZnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpb19xY2VscF9lbmNfY29uZmlnKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoYXVkaW8tPmVuY19jZmcgPT0gTlVMTCkgewotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQllbmNfY2ZnID0gYXVkaW8tPmVuY19jZmc7Ci0KLQltdXRleF9pbml0KCZhdWRpby0+bG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPnJlYWRfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmYXVkaW8tPndyaXRlX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhdWRpby0+ZHNwX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT5yZWFkX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF1ZGlvLT53cml0ZV93YWl0KTsKLQotCS8qIFNldHRpbmdzIHdpbGwgYmUgcmUtY29uZmlnIGF0IEFVRElPX1NFVF9DT05GSUcsCi0JICogYnV0IGF0IGxlYXN0IHdlIG5lZWQgdG8gaGF2ZSBpbml0aWFsIGNvbmZpZwotCSAqLwotCWF1ZGlvLT5zdHJfY2ZnLmJ1ZmZlcl9zaXplID0gRlJBTUVfU0laRTsKLQlhdWRpby0+c3RyX2NmZy5idWZmZXJfY291bnQgPSBGUkFNRV9OVU07Ci0JYXVkaW8tPm1pbl9mcmFtZV9zaXplID0gMzU7Ci0JYXVkaW8tPm1heF9mcmFtZXNfcGVyX2J1ZiA9IDEwOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9zaXplID0gUENNX0JVRl9TSVpFOwotCWF1ZGlvLT5wY21fY2ZnLmJ1ZmZlcl9jb3VudCA9IFBDTV9CVUZfQ09VTlQ7Ci0JZW5jX2NmZy0+bWluX2JpdF9yYXRlID0gNDsKLQllbmNfY2ZnLT5tYXhfYml0X3JhdGUgPSA0OwotCWF1ZGlvLT5wY21fY2ZnLmNoYW5uZWxfY291bnQgPSAxOwotCWF1ZGlvLT5wY21fY2ZnLnNhbXBsZV9yYXRlID0gODAwMDsKLQlhdWRpby0+YnVmX2NmZy5tZXRhX2luZm9fZW5hYmxlID0gMHgwMTsKLQlhdWRpby0+YnVmX2NmZy5mcmFtZXNfcGVyX2J1ZiA9IDB4MDE7Ci0JYXVkaW8tPmV2ZW50X2Fib3J0ID0gMDsKLQotCWF1ZGlvLT5hYyA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygoYXBwX2NiKXE2YXNtX2luX2NiLAotCQkJCSh2b2lkICopYXVkaW8pOwotCi0JaWYgKCFhdWRpby0+YWMpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYXVkaW8gY2xpZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJa2ZyZWUoYXVkaW8tPmVuY19jZmcpOwotCQlrZnJlZShhdWRpbyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIG9wZW4gcWNlbHAgZW5jb2RlciBpbiBUL05UIG1vZGUgKi8KLQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJYXVkaW8tPmZlZWRiYWNrID0gTk9OX1RVTk5FTF9NT0RFOwotCQlyYyA9IHE2YXNtX29wZW5fcmVhZF93cml0ZShhdWRpby0+YWMsIEZPUk1BVF9WMTNLLAotCQkJCQlGT1JNQVRfTElORUFSX1BDTSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBPcGVuIGZhaWxlZCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgYXVkaW8tPmFjLT5zZXNzaW9uLCByYyk7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogTlQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgotCQkJCShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgewotCQlhdWRpby0+ZmVlZGJhY2sgPSBUVU5ORUxfTU9ERTsKLQkJcmMgPSBxNmFzbV9vcGVuX3JlYWQoYXVkaW8tPmFjLCBGT1JNQVRfVjEzSyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6c2Vzc2lvbiBpZCAlZDogVCBtb2RlIE9wZW4gZmFpbGVkIHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdWRpby0+YWMtPnNlc3Npb24sIHJjKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQkvKiByZWdpc3RlciBmb3IgdHggb3ZlcmZsb3cgKHZhbGlkIGZvciB0dW5uZWwgbW9kZSBvbmx5KSAqLwotCQlyYyA9IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhhdWRpby0+YWMsIDB4MDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnNlc3Npb24gaWQgJWQ6IFRYIE92ZXJmbG93IHJlZ2lzdHJhdGlvbiBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbiwgcmMpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXByX2luZm8oIiVzOnNlc3Npb24gaWQgJWQ6IFQgbW9kZSBlbmNvZGVyIHN1Y2Nlc3NcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczpzZXNzaW9uIGlkICVkOiBVbmV4cGVjdGVkIG1vZGVcbiIsIF9fZnVuY19fLAotCQkJCWF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JCXJjID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotCWF1ZGlvLT5vcGVuZWQgPSAxOwotCWF1ZGlvLT5yZXNldF9ldmVudCA9IGZhbHNlOwotCWF0b21pY19zZXQoJmF1ZGlvLT5pbl9jb3VudCwgUENNX0JVRl9DT1VOVCk7Ci0JYXRvbWljX3NldCgmYXVkaW8tPm91dF9jb3VudCwgMHgwMCk7Ci0JYXVkaW8tPmVuY19jb21wYXRfaW9jdGwgPSBxY2VscF9pbl9jb21wYXRfaW9jdGw7Ci0JYXVkaW8tPmVuY19pb2N0bCA9IHFjZWxwX2luX2lvY3RsOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGF1ZGlvOwotCi0JcHJfaW5mbygiJXM6c2Vzc2lvbiBpZCAlZDogc3VjY2Vzc1xuIiwgX19mdW5jX18sIGF1ZGlvLT5hYy0+c2Vzc2lvbik7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGF1ZGlvLT5hYyk7Ci0Ja2ZyZWUoYXVkaW8tPmVuY19jZmcpOwotCWtmcmVlKGF1ZGlvKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1ZGlvX2luX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHFjZWxwX2luX29wZW4sCi0JLnJlbGVhc2UJPSBhdWRpb19pbl9yZWxlYXNlLAotCS5yZWFkCQk9IGF1ZGlvX2luX3JlYWQsCi0JLndyaXRlCQk9IGF1ZGlvX2luX3dyaXRlLAotCS51bmxvY2tlZF9pb2N0bAk9IGF1ZGlvX2luX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgICA9IGF1ZGlvX2luX2NvbXBhdF9pb2N0bAotfTsKLQotc3RydWN0IG1pc2NkZXZpY2UgYXVkaW9fcWNlbHBfaW5fbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX3FjZWxwX2luIiwKLQkuZm9wcwk9ICZhdWRpb19pbl9mb3BzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcWNlbHBfaW5faW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZhdWRpb19xY2VscF9pbl9taXNjKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHFjZWxwX2luX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY2MTRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotY2NmbGFncy15IDo9IC1JJChzcmMpLy4uCi1vYmotJChDT05GSUdfTVNNX1VMVFJBU09VTkQpICs9IHVzZi5vIHVzZmNkZXYubyBxNnVzbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9xNnVzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBmMzM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC9xNnVzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwcl91cy5oPgotI2luY2x1ZGUgInE2dXNtLmgiCi0KLSNkZWZpbmUgQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MIDMKLQotI2RlZmluZSBNRU1fNEtfT0ZGU0VUIDQwOTUKLSNkZWZpbmUgTUVNXzRLX01BU0sgMHhmZmZmZjAwMAotCi0jZGVmaW5lIFVTTV9TRVNTSU9OX01BWCAweDAyIC8qIGFEU1A6VVNNIGxpbWl0ICovCi0KLSNkZWZpbmUgUkVBRERPTkVfSURYX1NUQVRVUyAgICAgMAotCi0jZGVmaW5lIFdSSVRFRE9ORV9JRFhfU1RBVFVTICAgIDAKLQotLyogU3RhbmRhcmQgdGltZW91dCBpbiB0aGUgYXN5bmNocm9ub3VzIG9wcyAqLwotI2RlZmluZSBRNlVTTV9USU1FT1VUX0pJRkZJRVMJKDEqSFopIC8qIDEgc2VjICovCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoc2Vzc2lvbl9sb2NrKTsKLQotc3RhdGljIHN0cnVjdCB1c19jbGllbnQgKnNlc3Npb25bVVNNX1NFU1NJT05fTUFYXTsKLXN0YXRpYyBpbnQzMl90IHE2dXNtX21tYXBjYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKLXN0YXRpYyBpbnQzMl90IHE2dXNtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOwotc3RhdGljIHZvaWQgcTZ1c21fYWRkX2hkcihzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHN0cnVjdCBhcHJfaGRyICpoZHIsCi0JCQkgIHVpbnQzMl90IHBrdF9zaXplLCBib29sIGNtZF9mbGcpOwotCi1zdHJ1Y3QgdXNtX21tYXAgewotCWF0b21pY190IHJlZl9jbnQ7Ci0JYXRvbWljX3QgY21kX3N0YXRlOwotCXdhaXRfcXVldWVfaGVhZF90IGNtZF93YWl0OwotCXZvaWQgKmFwcjsKLQlpbnQgbWVtX2hhbmRsZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNtX21tYXAgdGhpc19tbWFwOwotCi1zdGF0aWMgdm9pZCBxNnVzbV9hZGRfbW1hcGhkcihzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJICAgICAgdWludDMyX3QgcGt0X3NpemUsIGJvb2wgY21kX2ZsZywgdTMyIHRva2VuKQotewotCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkgICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWhkci0+c3JjX3BvcnQgPSAwOwotCWhkci0+ZGVzdF9wb3J0ID0gMDsKLQlpZiAoY21kX2ZsZykgewotCQloZHItPnRva2VuID0gdG9rZW47Ci0JCWF0b21pY19zZXQoJnRoaXNfbW1hcC5jbWRfc3RhdGUsIDEpOwotCX0KLQloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOwotfQotCi1zdGF0aWMgaW50IHE2dXNtX21lbW9yeV9tYXAocGh5c19hZGRyX3QgYnVmX2FkZCwgaW50IGRpciwgdWludDMyX3QgYnVmc3osCi0JCXVpbnQzMl90IGJ1ZmNudCwgdWludDMyX3Qgc2Vzc2lvbiwgdWludDMyX3QgKm1lbV9oYW5kbGUpCi17Ci0Jc3RydWN0IHVzbV9jbWRfbWVtb3J5X21hcF9yZWdpb24gbWVtX3JlZ2lvbl9tYXA7Ci0JaW50IHJjID0gMDsKLQotCWlmICh0aGlzX21tYXAuYXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXE2dXNtX2FkZF9tbWFwaGRyKCZtZW1fcmVnaW9uX21hcC5oZHIsCi0JCQkgIHNpemVvZihzdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfbWFwX3JlZ2lvbiksIHRydWUsCi0JCQkgICgoc2Vzc2lvbiA8PCA4KSB8IGRpcikpOwotCi0JbWVtX3JlZ2lvbl9tYXAuaGRyLm9wY29kZSA9IFVTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OOwotCW1lbV9yZWdpb25fbWFwLm1lbXBvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0KLQltZW1fcmVnaW9uX21hcC5udW1fcmVnaW9ucyA9IDE7Ci0JbWVtX3JlZ2lvbl9tYXAuZmxhZ3MgPSAwOwotCi0JbWVtX3JlZ2lvbl9tYXAuc2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkKTsKLQltZW1fcmVnaW9uX21hcC5zaG1fYWRkcl9tc3cgPQotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX2FkZCk7Ci0JbWVtX3JlZ2lvbl9tYXAubWVtX3NpemVfYnl0ZXMgPSBidWZzeiAqIGJ1ZmNudDsKLQotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfbW1hcC5hcHIsICh1aW50MzJfdCAqKSAmbWVtX3JlZ2lvbl9tYXApOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogbWVtX21hcCBvcFsweCV4XXJjWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtZW1fcmVnaW9uX21hcC5oZHIub3Bjb2RlLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX21tYXAuY21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZ0aGlzX21tYXAuY21kX3N0YXRlKSA9PSAwKSwKLQkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOwotCWlmICghcmMpIHsKLQkJcmMgPSAtRVRJTUU7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X21hcFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCSptZW1faGFuZGxlID0gdGhpc19tbWFwLm1lbV9oYW5kbGU7Ci0JCXJjID0gMDsKLQl9Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNnVzbV9tZW1vcnlfdW5tYXAocGh5c19hZGRyX3QgYnVmX2FkZCwgaW50IGRpciwgdWludDMyX3Qgc2Vzc2lvbiwKLQkJCXVpbnQzMl90IG1lbV9oYW5kbGUpCi17Ci0Jc3RydWN0IHVzbV9jbWRfbWVtb3J5X3VubWFwX3JlZ2lvbiBtZW1fdW5tYXA7Ci0JaW50IHJjID0gMDsKLQotCWlmICh0aGlzX21tYXAuYXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXE2dXNtX2FkZF9tbWFwaGRyKCZtZW1fdW5tYXAuaGRyLAotCQkJICBzaXplb2Yoc3RydWN0IHVzbV9jbWRfbWVtb3J5X3VubWFwX3JlZ2lvbiksIHRydWUsCi0JCQkgICgoc2Vzc2lvbiA8PCA4KSB8IGRpcikpOwotCW1lbV91bm1hcC5oZHIub3Bjb2RlID0gVVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTjsKLQltZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPSBtZW1faGFuZGxlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QodGhpc19tbWFwLmFwciwgKHVpbnQzMl90ICopICZtZW1fdW5tYXApOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogbWVtX3VubWFwIG9wWzB4JXhdIHJjWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtZW1fdW5tYXAuaGRyLm9wY29kZSwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfbW1hcC5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJnRoaXNfbW1hcC5jbWRfc3RhdGUpID09IDApLAotCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7Ci0JaWYgKCFyYykgewotCQlyYyA9IC1FVElNRTsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfdW5tYXBcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UKLQkJcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2dXNtX3Nlc3Npb25fYWxsb2Moc3RydWN0IHVzX2NsaWVudCAqdXNjKQotewotCWludCBpbmQgPSAwOwotCi0JbXV0ZXhfbG9jaygmc2Vzc2lvbl9sb2NrKTsKLQlmb3IgKGluZCA9IDA7IGluZCA8IFVTTV9TRVNTSU9OX01BWDsgKytpbmQpIHsKLQkJaWYgKCFzZXNzaW9uW2luZF0pIHsKLQkJCXNlc3Npb25baW5kXSA9IHVzYzsKLQkJCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJCSsraW5kOyAvKiBzZXNzaW9uIGlkOiAwIHJlc2VydmVkICovCi0JCQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIHdhcyBhbGxvY2F0ZWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgaW5kKTsKLQkJCXJldHVybiBpbmQ7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBxNnVzbV9zZXNzaW9uX2ZyZWUoc3RydWN0IHVzX2NsaWVudCAqdXNjKQotewotCS8qIFNlc3Npb24gaW5kZXggd2FzIGluY3JlbWVudGVkIGR1cmluZyBhbGxvY2F0aW9uICovCi0JdWludDE2X3QgaW5kID0gKHVpbnQxNl90KXVzYy0+c2Vzc2lvbiAtIDE7Ci0KLQlwcl9kZWJ1ZygiJXM6IHRvIGZyZWUgc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBpbmQpOwotCWlmIChpbmQgPCBVU01fU0VTU0lPTl9NQVgpIHsKLQkJbXV0ZXhfbG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJc2Vzc2lvbltpbmRdID0gTlVMTDsKLQkJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotCX0KLX0KLQotc3RhdGljIGludCBxNnVzbV91c19jbGllbnRfYnVmX2ZyZWUodW5zaWduZWQgaW50IGRpciwKLQkJCSAgICAgc3RydWN0IHVzX2NsaWVudCAqdXNjKQotewotCXN0cnVjdCB1c19wb3J0X2RhdGEgKnBvcnQ7Ci0JaW50IHJjID0gMDsKLQotCWlmICgodXNjID09IE5VTEwpIHx8Ci0JICAgICgoZGlyICE9IElOKSAmJiAoZGlyICE9IE9VVCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnVzYy0+Y21kX2xvY2spOwotCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07Ci0JaWYgKHBvcnQgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocG9ydC0+ZGF0YSA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJjID0gcTZ1c21fbWVtb3J5X3VubWFwKHBvcnQtPnBoeXMsIGRpciwgdXNjLT5zZXNzaW9uLAotCQkJCSooKHVpbnQzMl90ICopcG9ydC0+ZXh0KSk7Ci0JcHJfZGVidWcoIiVzOiBkYXRhWyVwS11waHlzWyVsbHhdWyVwS11cbiIsIF9fZnVuY19fLAotCQkgKHZvaWQgKilwb3J0LT5kYXRhLCAodTY0KXBvcnQtPnBoeXMsICh2b2lkICopJnBvcnQtPnBoeXMpOwotCi0JbXNtX2F1ZGlvX2lvbl9mcmVlKHBvcnQtPmNsaWVudCwgcG9ydC0+aGFuZGxlKTsKLQotCXBvcnQtPmRhdGEgPSBOVUxMOwotCXBvcnQtPnBoeXMgPSAwOwotCXBvcnQtPmJ1Zl9zaXplID0gMDsKLQlwb3J0LT5idWZfY250ID0gMDsKLQlwb3J0LT5jbGllbnQgPSBOVUxMOwotCXBvcnQtPmhhbmRsZSA9IE5VTEw7Ci0KLQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotaW50IHE2dXNtX3VzX3BhcmFtX2J1Zl9mcmVlKHVuc2lnbmVkIGludCBkaXIsCi0JCQlzdHJ1Y3QgdXNfY2xpZW50ICp1c2MpCi17Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwKLQkJKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKLQlpZiAocG9ydCA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChwb3J0LT5wYXJhbV9idWYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYyA9IHE2dXNtX21lbW9yeV91bm1hcChwb3J0LT5wYXJhbV9waHlzLCBkaXIsIHVzYy0+c2Vzc2lvbiwKLQkJCQkqKCh1aW50MzJfdCAqKXBvcnQtPnBhcmFtX2J1Zl9tZW1faGFuZGxlKSk7Ci0JcHJfZGVidWcoIiVzOiBkYXRhWyVwS11waHlzWyVsbHhdWyVwS11cbiIsIF9fZnVuY19fLAotCQkgKHZvaWQgKilwb3J0LT5wYXJhbV9idWYsICh1NjQpcG9ydC0+cGFyYW1fcGh5cywKLQkJICh2b2lkICopJnBvcnQtPnBhcmFtX3BoeXMpOwotCi0JbXNtX2F1ZGlvX2lvbl9mcmVlKHBvcnQtPnBhcmFtX2NsaWVudCwgcG9ydC0+cGFyYW1faGFuZGxlKTsKLQotCXBvcnQtPnBhcmFtX2J1ZiA9IE5VTEw7Ci0JcG9ydC0+cGFyYW1fcGh5cyA9IDA7Ci0JcG9ydC0+cGFyYW1fYnVmX3NpemUgPSAwOwotCXBvcnQtPnBhcmFtX2NsaWVudCA9IE5VTEw7Ci0JcG9ydC0+cGFyYW1faGFuZGxlID0gTlVMTDsKLQotCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIHE2dXNtX3VzX2NsaWVudF9mcmVlKHN0cnVjdCB1c19jbGllbnQgKnVzYykKLXsKLQlpbnQgbG9vcGNudCA9IDA7Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydDsKLQl1aW50MzJfdCAqcF9tZW1faGFuZGxlID0gTlVMTDsKLQotCWlmICgodXNjID09IE5VTEwpIHx8Ci0JICAgICEodXNjLT5zZXNzaW9uKSkKLQkJcmV0dXJuOwotCi0JZm9yIChsb29wY250ID0gMDsgbG9vcGNudCA8PSBPVVQ7ICsrbG9vcGNudCkgewotCQlwb3J0ID0gJnVzYy0+cG9ydFtsb29wY250XTsKLQkJaWYgKHBvcnQtPmRhdGEgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlwcl9kZWJ1ZygiJXM6IGxvb3BjbnQgPSAlZFxuIiwgX19mdW5jX18sIGxvb3BjbnQpOwotCQlxNnVzbV91c19jbGllbnRfYnVmX2ZyZWUobG9vcGNudCwgdXNjKTsKLQkJcTZ1c21fdXNfcGFyYW1fYnVmX2ZyZWUobG9vcGNudCwgdXNjKTsKLQl9Ci0JcTZ1c21fc2Vzc2lvbl9mcmVlKHVzYyk7Ci0JYXByX2RlcmVnaXN0ZXIodXNjLT5hcHIpOwotCi0JcHJfZGVidWcoIiVzOiBBUFIgRGUtUmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKLQotCWlmIChhdG9taWNfcmVhZCgmdGhpc19tbWFwLnJlZl9jbnQpIDw9IDApIHsKLQkJcHJfZXJyKCIlczogQVBSIENvbW1vbiBQb3J0IEFscmVhZHkgQ2xvc2VkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdG9taWNfZGVjKCZ0aGlzX21tYXAucmVmX2NudCk7Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX21tYXAucmVmX2NudCkgPT0gMCkgewotCQlhcHJfZGVyZWdpc3Rlcih0aGlzX21tYXAuYXByKTsKLQkJcHJfZGVidWcoIiVzOiBBUFIgRGUtUmVnaXN0ZXIgY29tbW9uIHBvcnRcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLWRvbmU6Ci0JcF9tZW1faGFuZGxlID0gKHVpbnQzMl90ICopdXNjLT5wb3J0W0lOXS5leHQ7Ci0Ja2ZyZWUocF9tZW1faGFuZGxlKTsKLQlrZnJlZSh1c2MpOwotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RydWN0IHVzX2NsaWVudCAqcTZ1c21fdXNfY2xpZW50X2FsbG9jKAotCXZvaWQgKCpjYikodWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCAqLCB2b2lkICopLAotCXZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHVzX2NsaWVudCAqdXNjOwotCXVpbnQzMl90ICpwX21lbV9oYW5kbGUgPSBOVUxMOwotCWludCBuOwotCWludCBsY250ID0gMDsKLQotCXVzYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAodXNjID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcF9tZW1faGFuZGxlID0ga3phbGxvYyhzaXplb2YodWludDMyX3QpICogNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBfbWVtX2hhbmRsZSA9PSBOVUxMKSB7Ci0JCWtmcmVlKHVzYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCW4gPSBxNnVzbV9zZXNzaW9uX2FsbG9jKHVzYyk7Ci0JaWYgKG4gPD0gMCkKLQkJZ290byBmYWlsX3Nlc3Npb247Ci0JdXNjLT5zZXNzaW9uID0gbjsKLQl1c2MtPmNiID0gY2I7Ci0JdXNjLT5wcml2ID0gcHJpdjsKLQl1c2MtPmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJVU00iLAotCQkJCShhcHJfZm4pcTZ1c21fY2FsbGJhY2ssCi0JCQkJKCh1c2MtPnNlc3Npb24pIDw8IDggfCAweDAwMDEpLAotCQkJCXVzYyk7Ci0KLQlpZiAodXNjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBSZWdpc3RyYXRpb24gd2l0aCBBUFIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyB0aGUgY29tbW9uIHBvcnQgd2l0aCBBUFJcbiIsIF9fZnVuY19fKTsKLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfbW1hcC5yZWZfY250KSA9PSAwKSB7Ci0JCXRoaXNfbW1hcC5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiVVNNIiwKLQkJCQkJICAgICAoYXByX2ZuKXE2dXNtX21tYXBjYWxsYmFjaywKLQkJCQkJICAgICAweDBGRkZGRkZGRiwgJnRoaXNfbW1hcCk7Ci0JCWlmICh0aGlzX21tYXAuYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVTTSBwb3J0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JYXRvbWljX2luYygmdGhpc19tbWFwLnJlZl9jbnQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVzYy0+Y21kX3dhaXQpOwotCW11dGV4X2luaXQoJnVzYy0+Y21kX2xvY2spOwotCWZvciAobGNudCA9IDA7IGxjbnQgPD0gT1VUOyArK2xjbnQpIHsKLQkJbXV0ZXhfaW5pdCgmdXNjLT5wb3J0W2xjbnRdLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmdXNjLT5wb3J0W2xjbnRdLmRzcF9sb2NrKTsKLQkJdXNjLT5wb3J0W2xjbnRdLmV4dCA9ICh2b2lkICopcF9tZW1faGFuZGxlKys7Ci0JCXVzYy0+cG9ydFtsY250XS5wYXJhbV9idWZfbWVtX2hhbmRsZSA9ICh2b2lkICopcF9tZW1faGFuZGxlKys7Ci0JCXByX2VycigiJXM6IHVzYy0+cG9ydFslZF0uZXh0PSVwSztcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbGNudCwgdXNjLT5wb3J0W2xjbnRdLmV4dCk7Ci0JfQotCWF0b21pY19zZXQoJnVzYy0+Y21kX3N0YXRlLCAwKTsKLQotCXJldHVybiB1c2M7Ci1mYWlsOgotCWtmcmVlKHBfbWVtX2hhbmRsZSk7Ci0JcTZ1c21fdXNfY2xpZW50X2ZyZWUodXNjKTsKLQlyZXR1cm4gTlVMTDsKLWZhaWxfc2Vzc2lvbjoKLQlrZnJlZShwX21lbV9oYW5kbGUpOwotCWtmcmVlKHVzYyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBxNnVzbV91c19jbGllbnRfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBkaXIsCi0JCQkgICAgICBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmc3osCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmY250KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHNpemUgPSBidWZzeipidWZjbnQ7Ci0Jc2l6ZV90IGxlbjsKLQotCWlmICgodXNjID09IE5VTEwpIHx8Ci0JICAgICgoZGlyICE9IElOKSAmJiAoZGlyICE9IE9VVCkpIHx8IChzaXplID09IDApIHx8Ci0JICAgICh1c2MtPnNlc3Npb24gPD0gMCB8fCB1c2MtPnNlc3Npb24gPiBVU01fU0VTU0lPTl9NQVgpKSB7Ci0JCXByX2VycigiJXM6IHdyb25nIHBhcmFtZXRlcnM6IHNpemU9JWQ7IGJ1ZmNudD0lZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzaXplLCBidWZjbnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLQotCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07Ci0KLQkvKiBUaGUgc2l6ZSB0byBhbGxvY2F0ZSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNEsgYnl0ZXMgKi8KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygidWx0cmFzb3VuZF9jbGllbnQiLAotCQkmcG9ydC0+Y2xpZW50LCAmcG9ydC0+aGFuZGxlLAotCQlzaXplLCAmcG9ydC0+cGh5cywKLQkJJmxlbiwgJnBvcnQtPmRhdGEpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IFVTIElPTiBhbGxvY2F0aW9uIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBvcnQtPmJ1Zl9jbnQgPSBidWZjbnQ7Ci0JcG9ydC0+YnVmX3NpemUgPSBidWZzejsKLQlwcl9kZWJ1ZygiJXM6IGRhdGFbJXBLXTsgcGh5c1slbGx4XTsgWyVwS11cbiIsIF9fZnVuY19fLAotCQkgKHZvaWQgKilwb3J0LT5kYXRhLAotCQkgKHU2NClwb3J0LT5waHlzLAotCQkgKHZvaWQgKikmcG9ydC0+cGh5cyk7Ci0KLQlyYyA9IHE2dXNtX21lbW9yeV9tYXAocG9ydC0+cGh5cywgZGlyLCBzaXplLCAxLCB1c2MtPnNlc3Npb24sCi0JCQkJKHVpbnQzMl90ICopcG9ydC0+ZXh0KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENNRCBNZW1vcnlfbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOwotCQlxNnVzbV91c19jbGllbnRfYnVmX2ZyZWUoZGlyLCB1c2MpOwotCQlxNnVzbV91c19wYXJhbV9idWZfZnJlZShkaXIsIHVzYyk7Ci0JfSBlbHNlIHsKLQkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLQkJcmMgPSAwOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IHE2dXNtX3VzX3BhcmFtX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQkJdW5zaWduZWQgaW50IGJ1ZnN6KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHNpemUgPSBidWZzejsKLQlzaXplX3QgbGVuOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwKLQkJKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkgfHwKLQkJKHVzYy0+c2Vzc2lvbiA8PSAwIHx8IHVzYy0+c2Vzc2lvbiA+IFVTTV9TRVNTSU9OX01BWCkpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgcGFyYW1ldGVyczogZGlyZWN0aW9uPSVkLCBidWZzej0lZFxuIiwKLQkJCV9fZnVuY19fLCBkaXIsIGJ1ZnN6KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdXNjLT5jbWRfbG9jayk7Ci0KLQlwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOwotCi0JaWYgKGJ1ZnN6ID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBidWZzej0wLCBnZXQvc2V0IHBhcmFtIGNvbW1hbmRzIGFyZSBmb3JiaWRkZW5cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXBvcnQtPnBhcmFtX2J1ZiA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmdXNjLT5jbWRfbG9jayk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBUaGUgc2l6ZSB0byBhbGxvY2F0ZSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNEsgYnl0ZXMgKi8KLQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygidWx0cmFzb3VuZF9jbGllbnQiLAotCQkmcG9ydC0+cGFyYW1fY2xpZW50LCAmcG9ydC0+cGFyYW1faGFuZGxlLAotCQlzaXplLCAmcG9ydC0+cGFyYW1fcGh5cywKLQkJJmxlbiwgJnBvcnQtPnBhcmFtX2J1Zik7Ci0KLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogVVMgSU9OIGFsbG9jYXRpb24gZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcG9ydC0+cGFyYW1fYnVmX3NpemUgPSBidWZzejsKLQlwcl9kZWJ1ZygiJXM6IHBhcmFtX2J1ZlslcEtdOyBwYXJhbV9waHlzWyVsbHhdOyBbJXBLXVxuIiwgX19mdW5jX18sCi0JCSAodm9pZCAqKXBvcnQtPnBhcmFtX2J1ZiwKLQkJICh1NjQpcG9ydC0+cGFyYW1fcGh5cywKLQkJICh2b2lkICopJnBvcnQtPnBhcmFtX3BoeXMpOwotCi0JcmMgPSBxNnVzbV9tZW1vcnlfbWFwKHBvcnQtPnBhcmFtX3BoeXMsIChJTiB8IE9VVCksIHNpemUsIDEsCi0JCQl1c2MtPnNlc3Npb24sICh1aW50MzJfdCAqKXBvcnQtPnBhcmFtX2J1Zl9tZW1faGFuZGxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENNRCBNZW1vcnlfbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnVzYy0+Y21kX2xvY2spOwotCQlxNnVzbV91c19jbGllbnRfYnVmX2ZyZWUoZGlyLCB1c2MpOwotCQlxNnVzbV91c19wYXJhbV9idWZfZnJlZShkaXIsIHVzYyk7Ci0JfSBlbHNlIHsKLQkJbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLQkJcmMgPSAwOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludDMyX3QgcTZ1c21fbW1hcGNhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgdG9rZW47Ci0JdWludDMyX3QgKnBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOwotCi0JcHJfZGVidWcoIiVzOiBwdHIwWzB4JXhdOyBwdHIxWzB4JXhdOyBvcGNvZGVbMHgleF1cbiIsCi0JCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwgZGF0YS0+b3Bjb2RlKTsKLQlwcl9kZWJ1ZygiJXM6IHRva2VuWzB4JXhdOyBwYXlsb2FkX3NpemVbJWRdOyBzcmNbJWRdOyBkZXN0WyVkXTtcbiIsCi0JCSBfX2Z1bmNfXywgZGF0YS0+dG9rZW4sIGRhdGEtPnBheWxvYWRfc2l6ZSwKLQkJIGRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgewotCQkvKiBzdGF0dXMgZmllbGQgY2hlY2sgKi8KLQkJaWYgKHBheWxvYWRbMV0pIHsKLQkJCXByX2VycigiJXM6IHdyb25nIHJlc3BvbnNlWyVkXSBvbiBjbWQgWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcGF5bG9hZFsxXSwgcGF5bG9hZFswXSk7Ci0JCX0gZWxzZSB7Ci0JCQl0b2tlbiA9IGRhdGEtPnRva2VuOwotCQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7Ci0JCQljYXNlIFVTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT046Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZ0aGlzX21tYXAuY21kX3N0YXRlKSkgewotCQkJCQlhdG9taWNfc2V0KCZ0aGlzX21tYXAuY21kX3N0YXRlLCAwKTsKLQkJCQkJd2FrZV91cCgmdGhpc19tbWFwLmNtZF93YWl0KTsKLQkJCQl9Ci0JCQkJLyogZmFsbHRocm91Z2ggKi8KLQkJCWNhc2UgVVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT046Ci0JCQkJLyogRm9yIE1FTV9NQVAsIGFkZGl0aW9uYWwgYW5zd2VyIGlzIHdhaXRlZCwgKi8KLQkJCQkvKiB0aGVyZm9yZSwgbm8gd2FrZS11cCBoZXJlICovCi0JCQkJcHJfZGVidWcoIiVzOiBjbWRbMHgleF07IHJlc3VsdFsweCV4XVxuIiwKLQkJCQkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJfZGVidWcoIiVzOiB3cm9uZyBjb21tYW5kWzB4JXhdXG4iLAotCQkJCQkgX19mdW5jX18sIHBheWxvYWRbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGRhdGEtPm9wY29kZSA9PSBVU01fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTikgewotCQkJdGhpc19tbWFwLm1lbV9oYW5kbGUgPSBwYXlsb2FkWzBdOwotCQkJcHJfZGVidWcoIiVzOiBtZW1vcnkgbWFwIGhhbmRsZSA9IDB4JXgiLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmdGhpc19tbWFwLmNtZF9zdGF0ZSkpIHsKLQkJCQlhdG9taWNfc2V0KCZ0aGlzX21tYXAuY21kX3N0YXRlLCAwKTsKLQkJCQl3YWtlX3VwKCZ0aGlzX21tYXAuY21kX3dhaXQpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQzMl90IHE2dXNtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHVzX2NsaWVudCAqdXNjID0gKHN0cnVjdCB1c19jbGllbnQgKilwcml2OwotCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOwotCXVpbnQzMl90ICpwYXlsb2FkID0gZGF0YS0+cGF5bG9hZDsKLQl1aW50MzJfdCB0b2tlbiA9IGRhdGEtPnRva2VuOwotCXVpbnQzMl90IG9wY29kZSA9IFE2VVNNX0VWRU5UX1VOREVGOwotCi0JaWYgKHVzYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNsaWVudCBpbmZvIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgewotCQkvKiBzdGF0dXMgZmllbGQgY2hlY2sgKi8KLQkJaWYgKHBheWxvYWRbMV0pIHsKLQkJCXByX2VycigiJXM6IHdyb25nIHJlc3BvbnNlWyVkXSBvbiBjbWQgWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcGF5bG9hZFsxXSwgcGF5bG9hZFswXSk7Ci0JCQlpZiAodXNjLT5jYikKLQkJCQl1c2MtPmNiKGRhdGEtPm9wY29kZSwgdG9rZW4sCi0JCQkJCSh1aW50MzJfdCAqKWRhdGEtPnBheWxvYWQsIHVzYy0+cHJpdik7Ci0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJCWNhc2UgVVNNX1NFU1NJT05fQ01EX1JVTjoKLQkJCWNhc2UgVVNNX1NUUkVBTV9DTURfQ0xPU0U6Ci0JCQkJaWYgKHRva2VuICE9IHVzYy0+c2Vzc2lvbikgewotCQkJCQlwcl9lcnIoIiVzOiB3cm9uZyB0b2tlblslZF0iLAotCQkJCQkgICAgICAgX19mdW5jX18sIHRva2VuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJY2FzZSBVU01fU1RSRUFNX0NNRF9PUEVOX1JFQUQ6Ci0JCQljYXNlIFVTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEU6Ci0JCQljYXNlIFVTTV9TVFJFQU1fQ01EX1NFVF9FTkNfUEFSQU06Ci0JCQljYXNlIFVTTV9EQVRBX0NNRF9NRURJQV9GT1JNQVRfVVBEQVRFOgotCQkJY2FzZSBVU01fU0VTU0lPTl9DTURfU0lHTkFMX0RFVEVDVF9NT0RFOgotCQkJY2FzZSBVU01fU1RSRUFNX0NNRF9TRVRfUEFSQU06Ci0JCQljYXNlIFVTTV9TVFJFQU1fQ01EX0dFVF9QQVJBTToKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSkgewotCQkJCQlhdG9taWNfc2V0KCZ1c2MtPmNtZF9zdGF0ZSwgMCk7Ci0JCQkJCXdha2VfdXAoJnVzYy0+Y21kX3dhaXQpOwotCQkJCX0KLQkJCQlpZiAodXNjLT5jYikKLQkJCQkJdXNjLT5jYihkYXRhLT5vcGNvZGUsIHRva2VuLAotCQkJCQkJKHVpbnQzMl90ICopZGF0YS0+cGF5bG9hZCwKLQkJCQkJCXVzYy0+cHJpdik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoZGF0YS0+b3Bjb2RlKSB7Ci0JY2FzZSBSRVNFVF9FVkVOVFM6IHsKLQkJcHJfZXJyKCIlczogUmVzZXQgZXZlbnQgaXMgcmVjZWl2ZWQ6ICVkICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWRhdGEtPnJlc2V0X2V2ZW50LAotCQkJCWRhdGEtPnJlc2V0X3Byb2MpOwotCi0JCW9wY29kZSA9IFJFU0VUX0VWRU5UUzsKLQotCQlhcHJfcmVzZXQodGhpc19tbWFwLmFwcik7Ci0JCXRoaXNfbW1hcC5hcHIgPSBOVUxMOwotCi0JCWFwcl9yZXNldCh1c2MtPmFwcik7Ci0JCXVzYy0+YXByID0gTlVMTDsKLQotCQlicmVhazsKLQl9Ci0KLQotCWNhc2UgVVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FOiB7Ci0JCXN0cnVjdCB1c19wb3J0X2RhdGEgKnBvcnQgPSAmdXNjLT5wb3J0W09VVF07Ci0KLQkJb3Bjb2RlID0gUTZVU01fRVZFTlRfUkVBRF9ET05FOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCWlmIChwYXlsb2FkW1JFQURET05FX0lEWF9TVEFUVVNdKSB7Ci0JCQlwcl9lcnIoIiVzOiB3cm9uZyBSRUFERE9ORVslZF07IHRva2VuWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICBwYXlsb2FkW1JFQURET05FX0lEWF9TVEFUVVNdLAotCQkJICAgICAgIHRva2VuKTsKLQkJCXRva2VuID0gVVNNX1dST05HX1RPS0VOOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssCi0JCQkJCSAgICAgICBkc3BfZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocG9ydC0+ZXhwZWN0ZWRfdG9rZW4gIT0gdG9rZW4pIHsKLQkJCXUzMiBjcHVfYnVmID0gcG9ydC0+Y3B1X2J1ZjsKLQotCQkJcHJfZXJyKCIlczogZXhwZWN0ZWRbJWRdICE9IHRva2VuWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydC0+ZXhwZWN0ZWRfdG9rZW4sIHRva2VuKTsKLQkJCXByX2RlYnVnKCIlczogZHNwX2J1Zj0lZDsgY3B1X2J1Zj0lZDtcbiIsCi0JCQkJX19mdW5jX18sICAgcG9ydC0+ZHNwX2J1ZiwgY3B1X2J1Zik7Ci0KLQkJCXRva2VuID0gVVNNX1dST05HX1RPS0VOOwotCQkJLyogVG8gcHJldmVudCBkYXRhIGhhbmRsZSBjb250aW5pdWUgKi8KLQkJCXBvcnQtPmV4cGVjdGVkX3Rva2VuID0gVVNNX1dST05HX1RPS0VOOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssCi0JCQkJCSAgICAgICBkc3BfZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0gLyogcG9ydC0+ZXhwZWN0ZWRfdG9rZW4gIT0gZGF0YS0+dG9rZW4gKi8KLQotCQlwb3J0LT5leHBlY3RlZF90b2tlbiA9IHRva2VuICsgMTsKLQkJaWYgKHBvcnQtPmV4cGVjdGVkX3Rva2VuID09IHBvcnQtPmJ1Zl9jbnQpCi0JCQlwb3J0LT5leHBlY3RlZF90b2tlbiA9IDA7Ci0KLQkJLyogZ2FwIHN1cHBvcnQgKi8KLQkJaWYgKHBvcnQtPmV4cGVjdGVkX3Rva2VuICE9IHBvcnQtPmNwdV9idWYpIHsKLQkJCXBvcnQtPmRzcF9idWYgPSBwb3J0LT5leHBlY3RlZF90b2tlbjsKLQkJCXRva2VuID0gcG9ydC0+ZHNwX2J1ZjsgLyogZm9yIGNhbGxiYWNrICovCi0JCX0gZWxzZQotCQkJcG9ydC0+ZHNwX2J1ZiA9IHRva2VuOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlicmVhazsKLQl9IC8qIGNhc2UgVVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FICovCi0KLQljYXNlIFVTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkU6IHsKLQkJc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9ICZ1c2MtPnBvcnRbSU5dOwotCi0JCW9wY29kZSA9IFE2VVNNX0VWRU5UX1dSSVRFX0RPTkU7Ci0JCWlmIChwYXlsb2FkW1dSSVRFRE9ORV9JRFhfU1RBVFVTXSkgewotCQkJcHJfZXJyKCIlczogd3JvbmcgV1JJVEVET05FX0lEWF9TVEFUVVNbJWRdXG4iLAotCQkJICAgICAgIF9fZnVuY19fLAotCQkJICAgICAgIHBheWxvYWRbV1JJVEVET05FX0lEWF9TVEFUVVNdKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlwb3J0LT5kc3BfYnVmID0gdG9rZW4gKyAxOwotCQlpZiAocG9ydC0+ZHNwX2J1ZiA9PSBwb3J0LT5idWZfY250KQotCQkJcG9ydC0+ZHNwX2J1ZiA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCi0JCWJyZWFrOwotCX0gLyogY2FzZSBVU01fREFUQV9FVkVOVF9XUklURV9ET05FICovCi0KLQljYXNlIFVTTV9TRVNTSU9OX0VWRU5UX1NJR05BTF9ERVRFQ1RfUkVTVUxUOiB7Ci0JCXByX2RlYnVnKCIlczogVVMgZGV0ZWN0IHJlc3VsdDogcmVzdWx0PSVkIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSBwYXlsb2FkWzBdKTsKLQkJb3Bjb2RlID0gUTZVU01fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQ7Ci0KLQkJYnJlYWs7Ci0JfSAvKiBjYXNlIFVTTV9TRVNTSU9OX0VWRU5UX1NJR05BTF9ERVRFQ1RfUkVTVUxUICovCi0KLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQotCX0gLyogc3dpdGNoICovCi0KLQlpZiAodXNjLT5jYikKLQkJdXNjLT5jYihvcGNvZGUsIHRva2VuLAotCQkJZGF0YS0+cGF5bG9hZCwgdXNjLT5wcml2KTsKLQotCXJldHVybiAwOwotfQotCi11aW50MzJfdCBxNnVzbV9nZXRfdmlydHVhbF9hZGRyZXNzKGludCBkaXIsCi0JCQkJICAgc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQkJCSAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1zKQotewotCXVpbnQzMl90IHJldCA9IDB4ZmZmZmZmZmY7Ci0KLQlpZiAodm1zICYmICh1c2MgIT0gTlVMTCkgJiYgKChkaXIgPT0gSU4pIHx8IChkaXIgPT0gT1VUKSkpIHsKLQkJc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9ICZ1c2MtPnBvcnRbZGlyXTsKLQkJaW50IHNpemUgPSBQQUdFX0FMSUdOKHBvcnQtPmJ1Zl9zaXplICogcG9ydC0+YnVmX2NudCk7Ci0JCXN0cnVjdCBhdWRpb19idWZmZXIgYWI7Ci0KLQkJYWIucGh5cyA9IHBvcnQtPnBoeXM7Ci0JCWFiLmRhdGEgPSBwb3J0LT5kYXRhOwotCQlhYi51c2VkID0gMTsKLQkJYWIuc2l6ZSA9IHNpemU7Ci0JCWFiLmFjdHVhbF9zaXplID0gc2l6ZTsKLQkJYWIuaGFuZGxlID0gcG9ydC0+aGFuZGxlOwotCQlhYi5jbGllbnQgPSBwb3J0LT5jbGllbnQ7Ci0KLQkJcmV0ID0gbXNtX2F1ZGlvX2lvbl9tbWFwKCZhYiwgdm1zKTsKLQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBxNnVzbV9hZGRfaGRyKHN0cnVjdCB1c19jbGllbnQgKnVzYywgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCSAgdWludDMyX3QgcGt0X3NpemUsIGJvb2wgY21kX2ZsZykKLXsKLQltdXRleF9sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLQloZHItPmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJICAgICAgIEFQUl9IRFJfTEVOKHNpemVvZihzdHJ1Y3QgYXByX2hkcikpLAotCQkJCSAgICAgICBBUFJfUEtUX1ZFUik7Ci0JaGRyLT5zcmNfc3ZjID0gKChzdHJ1Y3QgYXByX3N2YyAqKXVzYy0+YXByKS0+aWQ7Ci0JaGRyLT5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWhkci0+ZGVzdF9zdmMgPSBBUFJfU1ZDX1VTTTsKLQloZHItPmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWhkci0+c3JjX3BvcnQgPSAodXNjLT5zZXNzaW9uIDw8IDgpIHwgMHgwMDAxOwotCWhkci0+ZGVzdF9wb3J0ID0gKHVzYy0+c2Vzc2lvbiA8PCA4KSB8IDB4MDAwMTsKLQlpZiAoY21kX2ZsZykgewotCQloZHItPnRva2VuID0gdXNjLT5zZXNzaW9uOwotCQlhdG9taWNfc2V0KCZ1c2MtPmNtZF9zdGF0ZSwgMSk7Ci0JfQotCWhkci0+cGt0X3NpemUgID0gcGt0X3NpemU7Ci0JbXV0ZXhfdW5sb2NrKCZ1c2MtPmNtZF9sb2NrKTsKLX0KLQotc3RhdGljIHVpbnQzMl90IHE2dXNtX2V4dDJpbnRfZm9ybWF0KHVpbnQzMl90IGV4dF9mb3JtYXQpCi17Ci0JdWludDMyX3QgaW50X2Zvcm1hdCA9IElOVkFMSURfRk9STUFUOwotCi0Jc3dpdGNoIChleHRfZm9ybWF0KSB7Ci0JY2FzZSBGT1JNQVRfVVNQU19FUE9TOgotCQlpbnRfZm9ybWF0ID0gVVNfUE9JTlRfRVBPU19GT1JNQVRfVjI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1VTUkFXOgotCQlpbnRfZm9ybWF0ID0gVVNfUkFXX0ZPUk1BVF9WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfVVNQUk9YOgotCQlpbnRfZm9ybWF0ID0gVVNfUFJPWF9GT1JNQVRfVjQ7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1VTR0VTX1NZTkM6Ci0JCWludF9mb3JtYXQgPSBVU19HRVNfU1lOQ19GT1JNQVQ7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1VTUkFXX1NZTkM6Ci0JCWludF9mb3JtYXQgPSBVU19SQVdfU1lOQ19GT1JNQVQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0WyVkXVxuIiwgX19mdW5jX18sIGV4dF9mb3JtYXQpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaW50X2Zvcm1hdDsKLX0KLQotaW50IHE2dXNtX29wZW5fcmVhZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCi0JCSAgICB1aW50MzJfdCBmb3JtYXQpCi17Ci0JdWludDMyX3QgaW50X2Zvcm1hdCA9IElOVkFMSURfRk9STUFUOwotCWludCByYyA9IDB4MDA7Ci0Jc3RydWN0IHVzbV9zdHJlYW1fY21kX29wZW5fcmVhZCBvcGVuOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IGNsaWVudCBvciBpdHMgYXByIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXSIsIF9fZnVuY19fLCB1c2MtPnNlc3Npb24pOwotCi0JcTZ1c21fYWRkX2hkcih1c2MsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCB0cnVlKTsKLQlvcGVuLmhkci5vcGNvZGUgPSBVU01fU1RSRUFNX0NNRF9PUEVOX1JFQUQ7Ci0Jb3Blbi5zcmNfZW5kcG9pbnQgPSAwOyAvKiBBRkUgKi8KLQlvcGVuLnByZV9wcm9jX3RvcCA9IDA7IC8qIE5vIHByZXByb2Nlc3NpbmcgcmVxdWlyZWQgKi8KLQotCWludF9mb3JtYXQgPSBxNnVzbV9leHQyaW50X2Zvcm1hdChmb3JtYXQpOwotCWlmIChpbnRfZm9ybWF0ID09IElOVkFMSURfRk9STUFUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9wZW4udU1vZGUgPSBTVFJFQU1fUFJJT1JJVFlfTk9STUFMOwotCW9wZW4uZm9ybWF0ID0gaW50X2Zvcm1hdDsKLQotCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJm9wZW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogb3BlbiBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZ1c2MtPmNtZF9zdGF0ZSkgPT0gMCksCi0JCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKLQlpZiAoIXJjKSB7Ci0JCXJjID0gLUVUSU1FOwotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCB3YWl0ZWQgZm9yIE9QRU5fUkVBRCByY1slZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0gZWxzZQotCQlyYyA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotaW50IHE2dXNtX2VuY19jZmdfYmxrKHN0cnVjdCB1c19jbGllbnQgKnVzYywgc3RydWN0IHVzX2VuY2RlY19jZmcgKnVzX2NmZykKLXsKLQl1aW50MzJfdCBpbnRfZm9ybWF0ID0gSU5WQUxJRF9GT1JNQVQ7Ci0Jc3RydWN0IHVzbV9zdHJlYW1fY21kX2VuY2RlY19jZmdfYmxrICBlbmNfY2ZnX29iajsKLQlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NmZ19ibGsgICplbmNfY2ZnID0gJmVuY19jZmdfb2JqOwotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdG90YWxfY2ZnX3NpemUgPQotCQlzaXplb2Yoc3RydWN0IHVzbV9zdHJlYW1fY21kX2VuY2RlY19jZmdfYmxrKTsKLQl1aW50MzJfdCByb3VuZF9wYXJhbXNfc2l6ZSA9IDA7Ci0JdWludDhfdCAgaXNfYWxsb2NhdGVkID0gMDsKLQotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzX2NmZyA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW50X2Zvcm1hdCA9IHE2dXNtX2V4dDJpbnRfZm9ybWF0KHVzX2NmZy0+Zm9ybWF0X2lkKTsKLQlpZiAoaW50X2Zvcm1hdCA9PSBJTlZBTElEX0ZPUk1BVCkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dCBmb3JtYXRbJWRdIiwKLQkJICAgICAgIF9fZnVuY19fLCB1c19jZmctPmZvcm1hdF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFRyYW5zcGFyZW50IGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBhZnRlciBlbmNfY2ZnICovCi0JLyogSW50ZWdlciBudW1iZXIgb2YgdTMycyBpcyByZXF1aXJlZCAqLwotCXJvdW5kX3BhcmFtc19zaXplID0gKCh1c19jZmctPnBhcmFtc19zaXplICsgMykvNCkgKiA0OwotCWlmIChyb3VuZF9wYXJhbXNfc2l6ZSA+IFVTTV9NQVhfQ0ZHX0RBVEFfU0laRSkgewotCQkvKiBEeW5hbWljIGFsbG9jYXRlZCBlbmNkZWNfY2ZnX2JsayBpcyByZXF1aXJlZCAqLwotCQkvKiBzdGF0aWMgcGFydCB1c2UgKi8KLQkJcm91bmRfcGFyYW1zX3NpemUgLT0gVVNNX01BWF9DRkdfREFUQV9TSVpFOwotCQl0b3RhbF9jZmdfc2l6ZSArPSByb3VuZF9wYXJhbXNfc2l6ZTsKLQkJZW5jX2NmZyA9IGt6YWxsb2ModG90YWxfY2ZnX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoZW5jX2NmZyA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBlbmNfY2ZnWyVkXSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgdG90YWxfY2ZnX3NpemUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJaXNfYWxsb2NhdGVkID0gMTsKLQl9IGVsc2UKLQkJcm91bmRfcGFyYW1zX3NpemUgPSAwOwotCi0JcTZ1c21fYWRkX2hkcih1c2MsICZlbmNfY2ZnLT5oZHIsIHRvdGFsX2NmZ19zaXplLCB0cnVlKTsKLQotCWVuY19jZmctPmhkci5vcGNvZGUgPSBVU01fU1RSRUFNX0NNRF9TRVRfRU5DX1BBUkFNOwotCWVuY19jZmctPnBhcmFtX2lkID0gVVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMSzsKLQllbmNfY2ZnLT5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCB1c21fZW5jb2RlX2NmZ19ibGspKwotCQkJCXJvdW5kX3BhcmFtc19zaXplOwotCWVuY19jZmctPmVuY19ibGsuZnJhbWVzX3Blcl9idWYgPSAxOwotCWVuY19jZmctPmVuY19ibGsuZm9ybWF0X2lkID0gaW50X2Zvcm1hdDsKLQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19zaXplID0gc2l6ZW9mKHN0cnVjdCB1c21fY2ZnX2NvbW1vbikrCi0JCQkJICAgIFVTTV9NQVhfQ0ZHX0RBVEFfU0laRSArCi0JCQkJICAgIHJvdW5kX3BhcmFtc19zaXplOwotCW1lbWNweSgmKGVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbiksICYodXNfY2ZnLT5jZmdfY29tbW9uKSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1c21fY2ZnX2NvbW1vbikpOwotCi0JLyogVHJhbnNwYXJlbnQgZGF0YSBjb3B5ICovCi0JbWVtY3B5KGVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGEsIHVzX2NmZy0+cGFyYW1zLAotCSAgICAgICB1c19jZmctPnBhcmFtc19zaXplKTsKLQlwcl9kZWJ1ZygiJXM6IGNmZ19zaXplWyVkXSwgcGFyYW1zX3NpemVbJWRdXG4iLAotCQlfX2Z1bmNfXywKLQkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfc2l6ZSwKLQkJdXNfY2ZnLT5wYXJhbXNfc2l6ZSk7Ci0JcHJfZGVidWcoIiVzOiBwYXJhbXNbJWQsJWQsJWQsJWQsICVkLCVkLCVkLCVkXVxuIiwKLQkJX19mdW5jX18sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbMF0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbMV0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbMl0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbM10sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbNF0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbNV0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbNl0sCi0JCWVuY19jZmctPmVuY19ibGsudHJhbnNwX2RhdGFbN10KLQkgICAgICAgKTsKLQlwcl9kZWJ1ZygiJXM6IHNyYXRlOiVkLCBjaD0lZCwgYnBzPSAlZDtcbiIsCi0JCV9fZnVuY19fLCBlbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uc2FtcGxlX3JhdGUsCi0JCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5jaF9jZmcsCi0JCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5iaXRzX3Blcl9zYW1wbGUpOwotCXByX2RlYnVnKCJkbWFwOlsweCV4LDB4JXgsMHgleCwweCV4LDB4JXgsMHgleCwweCV4LDB4JXhdOyBkZXZfaWQ9MHgleFxuIiwKLQkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRhdGFfbWFwWzBdLAotCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbMV0sCi0JCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kYXRhX21hcFsyXSwKLQkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRhdGFfbWFwWzNdLAotCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbNF0sCi0JCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kYXRhX21hcFs1XSwKLQkJZW5jX2NmZy0+ZW5jX2Jsay5jZmdfY29tbW9uLmRhdGFfbWFwWzZdLAotCQllbmNfY2ZnLT5lbmNfYmxrLmNmZ19jb21tb24uZGF0YV9tYXBbN10sCi0JCWVuY19jZmctPmVuY19ibGsuY2ZnX2NvbW1vbi5kZXZfaWQpOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSBlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6Q29tYW1uZCBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZ1c2MtPmNtZF9zdGF0ZSkgPT0gMCksCi0JCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKLQlpZiAoIXJjKSB7Ci0JCXJjID0gLUVUSU1FOwotCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBlbmNfY2ZnLT5oZHIub3Bjb2RlKTsKLQl9IGVsc2UKLQkJcmMgPSAwOwotCi1mYWlsX2NtZDoKLQlpZiAoaXNfYWxsb2NhdGVkID09IDEpCi0JCWtmcmVlKGVuY19jZmcpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZ1c21fZGVjX2NmZ19ibGsoc3RydWN0IHVzX2NsaWVudCAqdXNjLCBzdHJ1Y3QgdXNfZW5jZGVjX2NmZyAqdXNfY2ZnKQotewotCi0JdWludDMyX3QgaW50X2Zvcm1hdCA9IElOVkFMSURfRk9STUFUOwotCXN0cnVjdCB1c21fc3RyZWFtX21lZGlhX2Zvcm1hdF91cGRhdGUgZGVjX2NmZ19vYmo7Ci0Jc3RydWN0IHVzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X3VwZGF0ZSAqZGVjX2NmZyA9ICZkZWNfY2ZnX29iajsKLQotCWludCByYyA9IDA7Ci0JdWludDMyX3QgdG90YWxfY2ZnX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X3VwZGF0ZSk7Ci0JdWludDMyX3Qgcm91bmRfcGFyYW1zX3NpemUgPSAwOwotCXVpbnQ4X3QgIGlzX2FsbG9jYXRlZCA9IDA7Ci0KLQotCWlmICgodXNjID09IE5VTEwpIHx8ICh1c19jZmcgPT0gTlVMTCkpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW5wdXQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWludF9mb3JtYXQgPSBxNnVzbV9leHQyaW50X2Zvcm1hdCh1c19jZmctPmZvcm1hdF9pZCk7Ci0JaWYgKGludF9mb3JtYXQgPT0gSU5WQUxJRF9GT1JNQVQpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW5wdXQgZm9ybWF0WyVkXSIsCi0JCSAgICAgICBfX2Z1bmNfXywgdXNfY2ZnLT5mb3JtYXRfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBUcmFuc3BhcmVudCBjb25maWd1cmF0aW9uIGRhdGEgaXMgYWZ0ZXIgZW5jX2NmZyAqLwotCS8qIEludGVnZXIgbnVtYmVyIG9mIHUzMnMgaXMgcmVxdWlyZWQgKi8KLQlyb3VuZF9wYXJhbXNfc2l6ZSA9ICgodXNfY2ZnLT5wYXJhbXNfc2l6ZSArIDMpLzQpICogNDsKLQlpZiAocm91bmRfcGFyYW1zX3NpemUgPiBVU01fTUFYX0NGR19EQVRBX1NJWkUpIHsKLQkJLyogRHluYW1pYyBhbGxvY2F0ZWQgZW5jZGVjX2NmZ19ibGsgaXMgcmVxdWlyZWQgKi8KLQkJLyogc3RhdGljIHBhcnQgdXNlICovCi0JCXJvdW5kX3BhcmFtc19zaXplIC09IFVTTV9NQVhfQ0ZHX0RBVEFfU0laRTsKLQkJdG90YWxfY2ZnX3NpemUgKz0gcm91bmRfcGFyYW1zX3NpemU7Ci0JCWRlY19jZmcgPSBremFsbG9jKHRvdGFsX2NmZ19zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGRlY19jZmcgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczpkZWNfY2ZnWyVkXSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgdG90YWxfY2ZnX3NpemUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJaXNfYWxsb2NhdGVkID0gMTsKLQl9IGVsc2UgeyAvKiBzdGF0aWMgdHJhbnNwX2RhdGEgaXMgZW5vdWdoICovCi0JCXJvdW5kX3BhcmFtc19zaXplID0gMDsKLQl9Ci0KLQlxNnVzbV9hZGRfaGRyKHVzYywgJmRlY19jZmctPmhkciwgdG90YWxfY2ZnX3NpemUsIHRydWUpOwotCi0JZGVjX2NmZy0+aGRyLm9wY29kZSA9IFVTTV9EQVRBX0NNRF9NRURJQV9GT1JNQVRfVVBEQVRFOwotCWRlY19jZmctPmZvcm1hdF9pZCA9IGludF9mb3JtYXQ7Ci0JZGVjX2NmZy0+Y2ZnX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzbV9jZmdfY29tbW9uKSArCi0JCQkgICAgVVNNX01BWF9DRkdfREFUQV9TSVpFICsKLQkJCSAgICByb3VuZF9wYXJhbXNfc2l6ZTsKLQltZW1jcHkoJihkZWNfY2ZnLT5jZmdfY29tbW9uKSwgJih1c19jZmctPmNmZ19jb21tb24pLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHVzbV9jZmdfY29tbW9uKSk7Ci0JLyogVHJhbnNwYXJlbnQgZGF0YSBjb3B5ICovCi0JbWVtY3B5KGRlY19jZmctPnRyYW5zcF9kYXRhLCB1c19jZmctPnBhcmFtcywgdXNfY2ZnLT5wYXJhbXNfc2l6ZSk7Ci0JcHJfZGVidWcoIiVzOiBjZmdfc2l6ZVslZF0sIHBhcmFtc19zaXplWyVkXTsgcGFyYW1ieXRlc1slZCwlZCwlZCwlZF1cbiIsCi0JCV9fZnVuY19fLAotCQlkZWNfY2ZnLT5jZmdfc2l6ZSwKLQkJdXNfY2ZnLT5wYXJhbXNfc2l6ZSwKLQkJZGVjX2NmZy0+dHJhbnNwX2RhdGFbMF0sCi0JCWRlY19jZmctPnRyYW5zcF9kYXRhWzFdLAotCQlkZWNfY2ZnLT50cmFuc3BfZGF0YVsyXSwKLQkJZGVjX2NmZy0+dHJhbnNwX2RhdGFbM10KLQkgICAgICAgKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgZGVjX2NmZyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOkNvbWFtbmQgb3BlbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpID09IDApLAotCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7Ci0JaWYgKCFyYykgewotCQlyYyA9IC1FVElNRTsKLQkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZGVjX2NmZy0+aGRyLm9wY29kZSk7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQotZmFpbF9jbWQ6Ci0JaWYgKGlzX2FsbG9jYXRlZCA9PSAxKQotCQlrZnJlZShkZWNfY2ZnKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IHE2dXNtX29wZW5fd3JpdGUoc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQkgICAgIHVpbnQzMl90IGZvcm1hdCkKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQzMl90IGludF9mb3JtYXQgPSBJTlZBTElEX0ZPUk1BVDsKLQlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfb3Blbl93cml0ZSBvcGVuOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIHVzYy0+c2Vzc2lvbik7Ci0KLQlxNnVzbV9hZGRfaGRyKHVzYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIHRydWUpOwotCW9wZW4uaGRyLm9wY29kZSA9IFVTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEU7Ci0KLQlpbnRfZm9ybWF0ID0gcTZ1c21fZXh0MmludF9mb3JtYXQoZm9ybWF0KTsKLQlpZiAoaW50X2Zvcm1hdCA9PSBJTlZBTElEX0ZPUk1BVCkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBmb3JtYXRbJWRdIiwgX19mdW5jX18sIGZvcm1hdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW9wZW4uZm9ybWF0ID0gaW50X2Zvcm1hdDsKLQotCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJm9wZW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczpvcGVuIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKLQkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOwotCWlmICghcmMpIHsKLQkJcmMgPSAtRVRJTUU7Ci0JCXByX2VycigiJXM6dGltZW91dC4gd2FpdGVkIGZvciBPUEVOX1dSSVRSIHJjWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZ1c21fcnVuKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3QgZmxhZ3MsCi0JICAgICAgdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMpCi17Ci0Jc3RydWN0IHVzbV9zdHJlYW1fY21kX3J1biBydW47Ci0JaW50IHJjID0gMDsKLQotCWlmICgodXNjID09IE5VTEwpIHx8ICh1c2MtPmFwciA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXE2dXNtX2FkZF9oZHIodXNjLCAmcnVuLmhkciwgc2l6ZW9mKHJ1biksIHRydWUpOwotCi0JcnVuLmhkci5vcGNvZGUgPSBVU01fU0VTU0lPTl9DTURfUlVOOwotCXJ1bi5mbGFncyAgICA9IGZsYWdzOwotCXJ1bi5tc3dfdHMgICA9IG1zd190czsKLQlydW4ubHN3X3RzICAgPSBsc3dfdHM7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopICZydW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbW1hbmQgcnVuIGZhaWxlZFslZF1cbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKLQkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOwotCWlmICghcmMpIHsKLQkJcmMgPSAtRVRJTUU7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgcnVuIHN1Y2Nlc3MgcmNbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQl9IGVsc2UKLQkJcmMgPSAwOwotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotCi1pbnQgcTZ1c21fcmVhZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHVpbnQzMl90IHJlYWRfaW5kKQotewotCXN0cnVjdCB1c21fc3RyZWFtX2NtZF9yZWFkIHJlYWQ7Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQl1MzIgcmVhZF9jb3VudGVyID0gMDsKLQl1MzIgbG9vcF9pbmQgPSAwOwotCXU2NCBidWZfYWRkciA9IDA7Ci0KLQlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwb3J0ID0gJnVzYy0+cG9ydFtPVVRdOwotCi0JaWYgKHJlYWRfaW5kID4gcG9ydC0+YnVmX2NudCkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyByZWFkX2luZFslZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmVhZF9pbmQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHJlYWRfaW5kID09IHBvcnQtPmNwdV9idWYpIHsKLQkJcHJfZXJyKCIlczogbm8gZnJlZSByZWdpb25cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHJlYWRfaW5kID4gcG9ydC0+Y3B1X2J1ZikgeyAvKiAxIHJhbmdlICovCi0JCXJlYWRfY291bnRlciA9IHJlYWRfaW5kIC0gcG9ydC0+Y3B1X2J1ZjsKLQl9IGVsc2UgeyAvKiAyIHJhbmdlcyAqLwotCQlyZWFkX2NvdW50ZXIgPSAocG9ydC0+YnVmX2NudCAtIHBvcnQtPmNwdV9idWYpICsgcmVhZF9pbmQ7Ci0JfQotCi0JcTZ1c21fYWRkX2hkcih1c2MsICZyZWFkLmhkciwgc2l6ZW9mKHJlYWQpLCBmYWxzZSk7Ci0KLQlyZWFkLmhkci5vcGNvZGUgPSBVU01fREFUQV9DTURfUkVBRDsKLQlyZWFkLmJ1Zl9zaXplID0gcG9ydC0+YnVmX3NpemU7Ci0JYnVmX2FkZHIgPSAodTY0KShwb3J0LT5waHlzKSArIHBvcnQtPmJ1Zl9zaXplICogKHBvcnQtPmNwdV9idWYpOwotCXJlYWQuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcik7Ci0JcmVhZC5idWZfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkcik7Ci0JcmVhZC5tZW1fbWFwX2hhbmRsZSA9ICooKHVpbnQzMl90ICopKHBvcnQtPmV4dCkpOwotCi0JZm9yIChsb29wX2luZCA9IDA7IGxvb3BfaW5kIDwgcmVhZF9jb3VudGVyOyArK2xvb3BfaW5kKSB7Ci0JCXUzMiB0ZW1wX2NwdV9idWYgPSBwb3J0LT5jcHVfYnVmOwotCi0JCWJ1Zl9hZGRyID0gKHU2NCkocG9ydC0+cGh5cykgKwotCQkJCXBvcnQtPmJ1Zl9zaXplICogKHBvcnQtPmNwdV9idWYpOwotCQlyZWFkLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2FkZHIpOwotCQlyZWFkLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKLQkJcmVhZC5zZXFfaWQgPSBwb3J0LT5jcHVfYnVmOwotCQlyZWFkLmhkci50b2tlbiA9IHBvcnQtPmNwdV9idWY7Ci0JCXJlYWQuY291bnRlciA9IDE7Ci0KLQkJKysocG9ydC0+Y3B1X2J1Zik7Ci0JCWlmIChwb3J0LT5jcHVfYnVmID09IHBvcnQtPmJ1Zl9jbnQpCi0JCQlwb3J0LT5jcHVfYnVmID0gMDsKLQotCQlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopICZyZWFkKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlwb3J0LT5jcHVfYnVmID0gdGVtcF9jcHVfYnVmOwotCi0JCQlwcl9lcnIoIiVzOnJlYWQgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJlYWQuaGRyLm9wY29kZSwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyYyA9IDA7Ci0JfSAvKiBidWZzIGxvb3AgKi8KLQotCXJldHVybiByYzsKLX0KLQotaW50IHE2dXNtX3dyaXRlKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3Qgd3JpdGVfaW5kKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHVzbV9zdHJlYW1fY21kX3dyaXRlIGNtZF93cml0ZTsKLQlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKLQl1MzIgY3VycmVudF9kc3BfYnVmID0gMDsKLQl1NjQgYnVmX2FkZHIgPSAwOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcG9ydCA9ICZ1c2MtPnBvcnRbSU5dOwotCi0JY3VycmVudF9kc3BfYnVmID0gcG9ydC0+ZHNwX2J1ZjsKLQkvKiBmcmVlIHJlZ2lvbiwgY2F1c2VkIGJ5IG5ldyBkc3BfYnVmIHJlcG9ydCBmcm9tIERTUCwgKi8KLQkvKiBjYW4gYmUgb25seSBleHRlbmRlZCAqLwotCWlmIChwb3J0LT5jcHVfYnVmID49IGN1cnJlbnRfZHNwX2J1ZikgewotCQkvKiAyIC1wYXJ0IGZyZWUgcmVnaW9uLCBpbmNsdWRpbmcgZW1wdHkgYnVmZmVyICovCi0JCWlmICgod3JpdGVfaW5kIDw9IHBvcnQtPmNwdV9idWYpICAmJgotCQkgICAgKHdyaXRlX2luZCA+IGN1cnJlbnRfZHNwX2J1ZikpIHsKLQkJCXByX2VycigiJXM6IHdyb25nIHdfaW5kWyVkXTsgZF9idWY9JWQ7IGNfYnVmPSVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCB3cml0ZV9pbmQsCi0JCQkgICAgICAgY3VycmVudF9kc3BfYnVmLCBwb3J0LT5jcHVfYnVmKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogMSAtcGFydCBmcmVlIHJlZ2lvbiAqLwotCQlpZiAoKHdyaXRlX2luZCA8PSBwb3J0LT5jcHVfYnVmKSAgfHwKLQkJICAgICh3cml0ZV9pbmQgPiBjdXJyZW50X2RzcF9idWYpKSB7Ci0JCQlwcl9lcnIoIiVzOiB3cm9uZyB3X2luZFslZF07IGRfYnVmPSVkOyBjX2J1Zj0lZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgd3JpdGVfaW5kLAotCQkJICAgICAgIGN1cnJlbnRfZHNwX2J1ZiwgcG9ydC0+Y3B1X2J1Zik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXE2dXNtX2FkZF9oZHIodXNjLCAmY21kX3dyaXRlLmhkciwgc2l6ZW9mKGNtZF93cml0ZSksIGZhbHNlKTsKLQotCWNtZF93cml0ZS5oZHIub3Bjb2RlID0gVVNNX0RBVEFfQ01EX1dSSVRFOwotCWNtZF93cml0ZS5idWZfc2l6ZSA9IHBvcnQtPmJ1Zl9zaXplOwotCWJ1Zl9hZGRyID0gKHU2NCkocG9ydC0+cGh5cykgKyBwb3J0LT5idWZfc2l6ZSAqIChwb3J0LT5jcHVfYnVmKTsKLQljbWRfd3JpdGUuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcik7Ci0JY21kX3dyaXRlLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRyKTsKLQljbWRfd3JpdGUubWVtX21hcF9oYW5kbGUgPSAqKCh1aW50MzJfdCAqKShwb3J0LT5leHQpKTsKLQljbWRfd3JpdGUucmVzMCA9IDA7Ci0JY21kX3dyaXRlLnJlczEgPSAwOwotCWNtZF93cml0ZS5yZXMyID0gMDsKLQotCXdoaWxlIChwb3J0LT5jcHVfYnVmICE9IHdyaXRlX2luZCkgewotCQl1MzIgdGVtcF9jcHVfYnVmID0gcG9ydC0+Y3B1X2J1ZjsKLQotCQlidWZfYWRkciA9ICh1NjQpKHBvcnQtPnBoeXMpICsKLQkJCQlwb3J0LT5idWZfc2l6ZSAqIChwb3J0LT5jcHVfYnVmKTsKLQkJY21kX3dyaXRlLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2FkZHIpOwotCQljbWRfd3JpdGUuYnVmX2FkZHJfbXN3ID0KLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkcik7Ci0JCWNtZF93cml0ZS5zZXFfaWQgPSBwb3J0LT5jcHVfYnVmOwotCQljbWRfd3JpdGUuaGRyLnRva2VuID0gcG9ydC0+Y3B1X2J1ZjsKLQotCQkrKyhwb3J0LT5jcHVfYnVmKTsKLQkJaWYgKHBvcnQtPmNwdV9idWYgPT0gcG9ydC0+YnVmX2NudCkKLQkJCXBvcnQtPmNwdV9idWYgPSAwOwotCi0JCXJjID0gYXByX3NlbmRfcGt0KHVzYy0+YXByLCAodWludDMyX3QgKikgJmNtZF93cml0ZSk7Ci0KLQkJaWYgKHJjIDwgMCkgewotCQkJcG9ydC0+Y3B1X2J1ZiA9IHRlbXBfY3B1X2J1ZjsKLQkJCXByX2VycigiJXM6d3JpdGUgb3BbMHgleF07cmNbJWRdO2NwdV9idWZbJWRdXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjbWRfd3JpdGUuaGRyLm9wY29kZSwKLQkJCSAgICAgICByYywgcG9ydC0+Y3B1X2J1Zik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJjID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWJvb2wgcTZ1c21faXNfd3JpdGVfYnVmX2Z1bGwoc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCAqZnJlZV9yZWdpb24pCi17Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0JdTMyIGNwdV9idWYgPSAwOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgIWZyZWVfcmVnaW9uKSB7Ci0JCXByX2VycigiJXM6IGlucHV0IGRhdGEgd3JvbmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwb3J0ID0gJnVzYy0+cG9ydFtJTl07Ci0JY3B1X2J1ZiA9IHBvcnQtPmNwdV9idWYgKyAxOwotCWlmIChjcHVfYnVmID09IHBvcnQtPmJ1Zl9jbnQpCi0JCWNwdV9idWYgPSAwOwotCi0JKmZyZWVfcmVnaW9uID0gcG9ydC0+ZHNwX2J1ZjsKLQotCXJldHVybiBjcHVfYnVmID09ICpmcmVlX3JlZ2lvbjsKLX0KLQotaW50IHE2dXNtX2NtZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIGludCBjbWQpCi17Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCWludCByYyA9IDA7Ci0JYXRvbWljX3QgKnN0YXRlOwotCi0JaWYgKCh1c2MgPT0gTlVMTCkgfHwgKHVzYy0+YXByID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcTZ1c21fYWRkX2hkcih1c2MsICZoZHIsIHNpemVvZihoZHIpLCB0cnVlKTsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQ01EX0NMT1NFOgotCQloZHIub3Bjb2RlID0gVVNNX1NUUkVBTV9DTURfQ0xPU0U7Ci0JCXN0YXRlID0gJnVzYy0+Y21kX3N0YXRlOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6SW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgY21kKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopICZoZHIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18sIGhkci5vcGNvZGUpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LCAoYXRvbWljX3JlYWQoc3RhdGUpID09IDApLAotCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7Ci0JaWYgKCFyYykgewotCQlyYyA9IC1FVElNRTsKLQkJcHJfZXJyKCIlczp0aW1lb3V0LiB3YWl0ZWQgZm9yIHJlc3BvbnNlIG9wY29kZVsweCV4XVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBoZHIub3Bjb2RlKTsKLQl9IGVsc2UKLQkJcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZ1c21fc2V0X3VzX2RldGVjdGlvbihzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCi0JCQkgICBzdHJ1Y3QgdXNtX3Nlc3Npb25fY21kX2RldGVjdF9pbmZvICpkZXRlY3RfaW5mbywKLQkJCSAgIHVpbnQxNl90IGRldGVjdF9pbmZvX3NpemUpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICgodXNjID09IE5VTEwpIHx8Ci0JICAgIChkZXRlY3RfaW5mb19zaXplID09IDApIHx8Ci0JICAgIChkZXRlY3RfaW5mbyA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBpbnB1dDogdXNjPTB4JXBLLCBpbmZfc2l6ZT0lZDsgaW5mbz0weCVwSyIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgIHVzYywKLQkJICAgICAgIGRldGVjdF9pbmZvX3NpemUsCi0JCSAgICAgICBkZXRlY3RfaW5mbyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXE2dXNtX2FkZF9oZHIodXNjLCAmZGV0ZWN0X2luZm8tPmhkciwgZGV0ZWN0X2luZm9fc2l6ZSwgdHJ1ZSk7Ci0KLQlkZXRlY3RfaW5mby0+aGRyLm9wY29kZSA9IFVTTV9TRVNTSU9OX0NNRF9TSUdOQUxfREVURUNUX01PREU7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopZGV0ZWN0X2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczpDb21hbW5kIHNpZ25hbCBkZXRlY3QgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh1c2MtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmdXNjLT5jbWRfc3RhdGUpID09IDApLAotCQkJCVE2VVNNX1RJTUVPVVRfSklGRklFUyk7Ci0JaWYgKCFyYykgewotCQlyYyA9IC1FVElNRTsKLQkJcHJfZXJyKCIlczogQ01EX1NJR05BTF9ERVRFQ1RfTU9ERTogdGltZW91dD0lZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBRNlVTTV9USU1FT1VUX0pJRkZJRVMpOwotCX0gZWxzZQotCQlyYyA9IDA7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNnVzbV9zZXRfdXNfc3RyZWFtX3BhcmFtKGludCBkaXIsIHN0cnVjdCB1c19jbGllbnQgKnVzYywKLQkJdWludDMyX3QgbW9kdWxlX2lkLCB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgYnVmX3NpemUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfc2V0X3BhcmFtIGNtZF9zZXRfcGFyYW07Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0KLQlpZiAoKHVzYyA9PSBOVUxMKSB8fCAodXNjLT5hcHIgPT0gTlVMTCkpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOwotCi0JcTZ1c21fYWRkX2hkcih1c2MsICZjbWRfc2V0X3BhcmFtLmhkciwgc2l6ZW9mKGNtZF9zZXRfcGFyYW0pLCB0cnVlKTsKLQotCWNtZF9zZXRfcGFyYW0uaGRyLm9wY29kZSA9IFVTTV9TVFJFQU1fQ01EX1NFVF9QQVJBTTsKLQljbWRfc2V0X3BhcmFtLmJ1Zl9zaXplID0gYnVmX3NpemU7Ci0JY21kX3NldF9wYXJhbS5idWZfYWRkcl9tc3cgPQotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMocG9ydC0+cGFyYW1fcGh5cyk7Ci0JY21kX3NldF9wYXJhbS5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKHBvcnQtPnBhcmFtX3BoeXMpOwotCWNtZF9zZXRfcGFyYW0ubWVtX21hcF9oYW5kbGUgPQotCQkJKigodWludDMyX3QgKikocG9ydC0+cGFyYW1fYnVmX21lbV9oYW5kbGUpKTsKLQljbWRfc2V0X3BhcmFtLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKLQljbWRfc2V0X3BhcmFtLnBhcmFtX2lkID0gcGFyYW1faWQ7Ci0JY21kX3NldF9wYXJhbS5oZHIudG9rZW4gPSAwOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QodXNjLT5hcHIsICh1aW50MzJfdCAqKSAmY21kX3NldF9wYXJhbSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6d3JpdGUgb3BbMHgleF07cmNbJWRdXG4iLAotCQkJX19mdW5jX18sIGNtZF9zZXRfcGFyYW0uaGRyLm9wY29kZSwgcmMpOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHVzYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZ1c2MtPmNtZF9zdGF0ZSkgPT0gMCksCi0JCQkJUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKLQlpZiAoIXJjKSB7Ci0JCXJjID0gLUVUSU1FOwotCQlwcl9lcnIoIiVzOiBDTURfU0VUX1BBUkFNOiB0aW1lb3V0PSVkXG4iLAotCQkJX19mdW5jX18sIFE2VVNNX1RJTUVPVVRfSklGRklFUyk7Ci0JfSBlbHNlCi0JCXJjID0gMDsKLQotCXJldHVybiByYzsKLX0KLQotaW50IHE2dXNtX2dldF91c19zdHJlYW1fcGFyYW0oaW50IGRpciwgc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQl1aW50MzJfdCBtb2R1bGVfaWQsIHVpbnQzMl90IHBhcmFtX2lkLCB1aW50MzJfdCBidWZfc2l6ZSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCB1c21fc3RyZWFtX2NtZF9nZXRfcGFyYW0gY21kX2dldF9wYXJhbTsKLQlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKLQotCWlmICgodXNjID09IE5VTEwpIHx8ICh1c2MtPmFwciA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07Ci0KLQlxNnVzbV9hZGRfaGRyKHVzYywgJmNtZF9nZXRfcGFyYW0uaGRyLCBzaXplb2YoY21kX2dldF9wYXJhbSksIHRydWUpOwotCi0JY21kX2dldF9wYXJhbS5oZHIub3Bjb2RlID0gVVNNX1NUUkVBTV9DTURfR0VUX1BBUkFNOwotCWNtZF9nZXRfcGFyYW0uYnVmX3NpemUgPSBidWZfc2l6ZTsKLQljbWRfZ2V0X3BhcmFtLmJ1Zl9hZGRyX21zdyA9Ci0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhwb3J0LT5wYXJhbV9waHlzKTsKLQljbWRfZ2V0X3BhcmFtLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMocG9ydC0+cGFyYW1fcGh5cyk7Ci0JY21kX2dldF9wYXJhbS5tZW1fbWFwX2hhbmRsZSA9Ci0JCQkqKCh1aW50MzJfdCAqKShwb3J0LT5wYXJhbV9idWZfbWVtX2hhbmRsZSkpOwotCWNtZF9nZXRfcGFyYW0ubW9kdWxlX2lkID0gbW9kdWxlX2lkOwotCWNtZF9nZXRfcGFyYW0ucGFyYW1faWQgPSBwYXJhbV9pZDsKLQljbWRfZ2V0X3BhcmFtLmhkci50b2tlbiA9IDA7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdCh1c2MtPmFwciwgKHVpbnQzMl90ICopICZjbWRfZ2V0X3BhcmFtKTsKLQotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczp3cml0ZSBvcFsweCV4XTtyY1slZF1cbiIsCi0JCQlfX2Z1bmNfXywgY21kX2dldF9wYXJhbS5oZHIub3Bjb2RlLCByYyk7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodXNjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJnVzYy0+Y21kX3N0YXRlKSA9PSAwKSwKLQkJCQlRNlVTTV9USU1FT1VUX0pJRkZJRVMpOwotCWlmICghcmMpIHsKLQkJcmMgPSAtRVRJTUU7Ci0JCXByX2VycigiJXM6IENNRF9HRVRfUEFSQU06IHRpbWVvdXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgUTZVU01fVElNRU9VVF9KSUZGSUVTKTsKLQl9IGVsc2UKLQkJcmMgPSAwOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBxNnVzbV9pbml0KHZvaWQpCi17Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpc19tbWFwLmNtZF93YWl0KTsKLQltZW1zZXQoc2Vzc2lvbiwgMCwgc2l6ZW9mKHNlc3Npb24pKTsKLQlyZXR1cm4gMDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHE2dXNtX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL3E2dXNtLmggYi9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1ZDE2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvcTZ1c20uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19RNl9VU01fSF9fCi0jZGVmaW5lIF9fUTZfVVNNX0hfXwotCi0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHJfdXMuaD4KLQotI2RlZmluZSBRNlVTTV9FVkVOVF9VTkRFRiAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFE2VVNNX0VWRU5UX1JFQURfRE9ORSAgICAgICAgICAgIDEKLSNkZWZpbmUgUTZVU01fRVZFTlRfV1JJVEVfRE9ORSAgICAgICAgICAgMgotI2RlZmluZSBRNlVTTV9FVkVOVF9TSUdOQUxfREVURUNUX1JFU1VMVCAzCi0KLS8qIGN5Y2xpYyBidWZmZXIgd2l0aCAxIGdhcCBzdXBwb3J0ICovCi0jZGVmaW5lIFVTTV9NSU5fQlVGX0NOVCAzCi0KLSNkZWZpbmUgRk9STUFUX1VTUFNfRVBPUwkweDAwMDAwMDAwCi0jZGVmaW5lIEZPUk1BVF9VU1JBVwkJMHgwMDAwMDAwMQotI2RlZmluZSBGT1JNQVRfVVNQUk9YCQkweDAwMDAwMDAyCi0jZGVmaW5lIEZPUk1BVF9VU0dFU19TWU5DCTB4MDAwMDAwMDMKLSNkZWZpbmUgRk9STUFUX1VTUkFXX1NZTkMJMHgwMDAwMDAwNAotI2RlZmluZSBJTlZBTElEX0ZPUk1BVAkJMHhmZmZmZmZmZgotCi0jZGVmaW5lIElOCQkJMHgwMDAKLSNkZWZpbmUgT1VUCQkJMHgwMDEKLQotI2RlZmluZSBVU01fV1JPTkdfVE9LRU4JCTB4ZmZmZmZmZmYKLSNkZWZpbmUgVVNNX1VOREVGX1RPS0VOCQkweGZmZmZmZmZlCi0KLSNkZWZpbmUgQ01EX0NMT1NFCQkweDAwMDQKLQotLyogYml0IDA6MSByZXByZXNlbnRzIHByaW9yaXR5IG9mIHN0cmVhbSAqLwotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfTk9STUFMCTB4MDAwMAotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfTE9XCTB4MDAwMQotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfSElHSAkweDAwMDIKLQotLyogYml0IDQgcmVwcmVzZW50cyBNRVRBIGVuYWJsZSBvZiBlbmNvZGVkIGRhdGEgYnVmZmVyICovCi0jZGVmaW5lIEJVRkZFUl9NRVRBX0VOQUJMRQkweDAwMTAKLQotc3RydWN0IHVzX3BvcnRfZGF0YSB7Ci0JZG1hX2FkZHJfdAlwaHlzOwotCS8qIGN5Y2xpYyByZWdpb24gb2YgYnVmZmVycyB3aXRoIDEgZ2FwICovCi0Jdm9pZAkJKmRhdGE7Ci0JLyogbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIHJlZ2lvbiAqLwotCXVpbnQzMl90CWJ1Zl9jbnQ7Ci0JLyogc2l6ZSBvZiBidWZmZXIgKi8KLQlzaXplX3QJCWJ1Zl9zaXplOwotCS8qIHdyaXRlIGluZGV4ICovCi0JdWludDMyX3QJZHNwX2J1ZjsKLQkvKiByZWFkIGluZGV4ICovCi0JdWludDMyX3QJY3B1X2J1ZjsKLQkvKiBleHBlY3RlZCB0b2tlbiBmcm9tIGRzcCAqLwotCXVpbnQzMl90CWV4cGVjdGVkX3Rva2VuOwotCS8qIHJlYWQgb3Igd3JpdGUgbG9ja3MgKi8KLQlzdHJ1Y3QgbXV0ZXgJbG9jazsKLQlzcGlubG9ja190CWRzcF9sb2NrOwotCS8qIElPTiBtZW1vcnkgaGFuZGxlICovCi0Jc3RydWN0ICAgICAgaW9uX2hhbmRsZSAqaGFuZGxlOwotCS8qIElPTiBtZW1vcnkgY2xpZW50ICovCi0Jc3RydWN0ICAgICAgaW9uX2NsaWVudCAqY2xpZW50OwotCS8qIGV4dGVuZGVkIHBhcmFtZXRlcnMsIHJlbGF0ZWQgdG8gcTYgdmFyaWFudHMgKi8KLQl2b2lkCQkqZXh0OwotCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcGFyYW1ldGVyIGJ1ZmZlciAqLwotCWRtYV9hZGRyX3QJcGFyYW1fcGh5czsKLQkvKiBidWZmZXIgd2hpY2ggc3RvcmVzIHRoZSBwYXJhbWV0ZXIgZGF0YSAqLwotCXZvaWQJCSpwYXJhbV9idWY7Ci0JLyogc2l6ZSBvZiBwYXJhbWV0ZXIgYnVmZmVyICovCi0JdWludDMyX3QJcGFyYW1fYnVmX3NpemU7Ci0JLyogcGFyYW1ldGVyIGJ1ZmZlciBtZW1vcnkgaGFuZGxlICovCi0Jdm9pZAkJKnBhcmFtX2J1Zl9tZW1faGFuZGxlOwotCS8qIElPTiBtZW1vcnkgaGFuZGxlIGZvciBwYXJhbWV0ZXIgYnVmZmVyICovCi0Jc3RydWN0ICAgICAgaW9uX2hhbmRsZSAqcGFyYW1faGFuZGxlOwotCS8qIElPTiBtZW1vcnkgY2xpZW50IGZvciBwYXJhbWV0ZXIgYnVmZmVyICovCi0Jc3RydWN0ICAgICAgaW9uX2NsaWVudCAqcGFyYW1fY2xpZW50OwotfTsKLQotc3RydWN0IHVzX2NsaWVudCB7Ci0JaW50CQkJc2Vzc2lvbjsKLQkvKiBpZHg6MSBvdXQgcG9ydCwgMDogaW4gcG9ydCovCi0Jc3RydWN0IHVzX3BvcnRfZGF0YQlwb3J0WzJdOwotCi0Jc3RydWN0IGFwcl9zdmMJCSphcHI7Ci0Jc3RydWN0IG11dGV4CQljbWRfbG9jazsKLQotCWF0b21pY190CQljbWRfc3RhdGU7Ci0JYXRvbWljX3QJCWVvc19zdGF0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAljbWRfd2FpdDsKLQotCXZvaWQgKCpjYikodWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCAqLCB2b2lkICopOwotCXZvaWQJCQkqcHJpdjsKLX07Ci0KLWludCBxNnVzbV9ydW4oc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCBmbGFncywKLQkgICAgICB1aW50MzJfdCBtc3dfdHMsIHVpbnQzMl90IGxzd190cyk7Ci1pbnQgcTZ1c21fY21kKHN0cnVjdCB1c19jbGllbnQgKnVzYywgaW50IGNtZCk7Ci1pbnQgcTZ1c21fdXNfY2xpZW50X2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgZGlyLCBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmc3osIHVuc2lnbmVkIGludCBidWZjbnQpOwotaW50IHE2dXNtX3VzX3BhcmFtX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgZGlyLCBzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmc3opOwotaW50IHE2dXNtX2VuY19jZmdfYmxrKHN0cnVjdCB1c19jbGllbnQgKnVzYywgc3RydWN0IHVzX2VuY2RlY19jZmcgKnVzX2NmZyk7Ci1pbnQgcTZ1c21fZGVjX2NmZ19ibGsoc3RydWN0IHVzX2NsaWVudCAqdXNjLCBzdHJ1Y3QgdXNfZW5jZGVjX2NmZyAqdXNfY2ZnKTsKLWludCBxNnVzbV9yZWFkKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3QgcmVhZF9pbmQpOwotc3RydWN0IHVzX2NsaWVudCAqcTZ1c21fdXNfY2xpZW50X2FsbG9jKAotCXZvaWQgKCpjYikodWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCAqLCB2b2lkICopLAotCXZvaWQgKnByaXYpOwotaW50IHE2dXNtX29wZW5fcmVhZChzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsIHVpbnQzMl90IGZvcm1hdCk7Ci12b2lkIHE2dXNtX3VzX2NsaWVudF9mcmVlKHN0cnVjdCB1c19jbGllbnQgKnVzYyk7Ci11aW50MzJfdCBxNnVzbV9nZXRfdmlydHVhbF9hZGRyZXNzKGludCBkaXIsIHN0cnVjdCB1c19jbGllbnQgKnVzYywKLQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtcyk7Ci1pbnQgcTZ1c21fb3Blbl93cml0ZShzdHJ1Y3QgdXNfY2xpZW50ICp1c2MsICB1aW50MzJfdCBmb3JtYXQpOwotaW50IHE2dXNtX3dyaXRlKHN0cnVjdCB1c19jbGllbnQgKnVzYywgdWludDMyX3Qgd3JpdGVfaW5kKTsKLWJvb2wgcTZ1c21faXNfd3JpdGVfYnVmX2Z1bGwoc3RydWN0IHVzX2NsaWVudCAqdXNjLCB1aW50MzJfdCAqZnJlZV9yZWdpb24pOwotaW50IHE2dXNtX3NldF91c19kZXRlY3Rpb24oc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQkJICAgc3RydWN0IHVzbV9zZXNzaW9uX2NtZF9kZXRlY3RfaW5mbyAqZGV0ZWN0X2luZm8sCi0JCQkgICB1aW50MTZfdCBkZXRlY3RfaW5mb19zaXplKTsKLWludCBxNnVzbV9zZXRfdXNfc3RyZWFtX3BhcmFtKGludCBkaXIsIHN0cnVjdCB1c19jbGllbnQgKnVzYywKLQkJdWludDMyX3QgbW9kdWxlX2lkLCB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgYnVmX3NpemUpOwotaW50IHE2dXNtX2dldF91c19zdHJlYW1fcGFyYW0oaW50IGRpciwgc3RydWN0IHVzX2NsaWVudCAqdXNjLAotCQl1aW50MzJfdCBtb2R1bGVfaWQsIHVpbnQzMl90IHBhcmFtX2lkLCB1aW50MzJfdCBidWZfc2l6ZSk7Ci0KLSNlbmRpZiAvKiBfX1E2X1VTTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2YuYyBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNDZiNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDY1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3VzZi5oPgotI2luY2x1ZGUgInE2dXNtLmgiCi0jaW5jbHVkZSAidXNmY2Rldi5oIgotCi0vKiBUaGUgZHJpdmVyIHZlcnNpb24qLwotI2RlZmluZSBEUlZfVkVSU0lPTiAiMS43LjEiCi0jZGVmaW5lIFVTRl9WRVJTSU9OX0lEIDB4MDE3MQotCi0vKiBTdGFuZGFyZCB0aW1lb3V0IGluIHRoZSBhc3luY2hyb25vdXMgb3BzICovCi0jZGVmaW5lIFVTRl9USU1FT1VUX0pJRkZJRVMgKDEqSFopIC8qIDEgc2VjICovCi0KLS8qIFVuZGVmaW5lZCBVU0YgZGV2aWNlICovCi0jZGVmaW5lIFVTRl9VTkRFRl9ERVZfSUQgMHhmZmZmCi0KLS8qIFRYIG1lbW9yeSBtYXBwaW5nIGZsYWcgKi8KLSNkZWZpbmUgVVNGX1ZNX1JFQUQgMQotLyogUlggbWVtb3J5IG1hcHBpbmcgZmxhZyAqLwotI2RlZmluZSBVU0ZfVk1fV1JJVEUgMgotCi0vKiBOdW1iZXIgb2YgZXZlbnRzLCBjb3BpZWQgZnJvbSB0aGUgdXNlciBzcGFjZSB0byBrZXJuZWwgb25lICovCi0jZGVmaW5lIFVTRl9FVkVOVFNfUE9SVElPTl9TSVpFIDIwCi0KLS8qIEluZGV4ZXMgaW4gcmFuZ2UgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgTUlOX0lORCAwCi0jZGVmaW5lIE1BWF9JTkQgMQotCi0vKiBUaGUgY29vcmRpbmF0ZXMgaW5kZXhlcyAqLwotI2RlZmluZSBYX0lORCAwCi0jZGVmaW5lIFlfSU5EIDEKLSNkZWZpbmUgWl9JTkQgMgotCi0vKiBTaGFyZWQgbWVtb3J5IGxpbWl0cyAqLwotLyogbWF4X2J1Zl9zaXplID0gKHBvcnRfc2l6ZSg2NTUzNSoyKSAqIHBvcnRfbnVtKDgpICogZ3JvdXBfc2l6ZSgzKSAqLwotI2RlZmluZSBVU0ZfTUFYX0JVRl9TSVpFIDMxNDU2ODAKLSNkZWZpbmUgVVNGX01BWF9CVUZfTlVNICAzMgotCi0vKiBtYXggc2l6ZSBmb3IgYnVmZmVyIHNldCBmcm9tIHVzZXIgc3BhY2UgKi8KLSNkZWZpbmUgVVNGX01BWF9VU0VSX0JVRl9TSVpFIDEwMDAwMAotCi0vKiBQbGFjZSBmb3Igb3ByZWF0aW9uIHJlc3VsdCwgcmVjZWl2ZWQgZnJvbSBRRFNQNiAqLwotI2RlZmluZSBBUFJfUkVTVUxUX0lORCAxCi0KLS8qIFBsYWNlIGZvciBVUyBkZXRlY3Rpb24gcmVzdWx0LCByZWNlaXZlZCBmcm9tIFFEU1A2ICovCi0jZGVmaW5lIEFQUl9VU19ERVRFQ1RfUkVTVUxUX0lORCAwCi0KLSNkZWZpbmUgQklUU19JTl9CWVRFIDgKLQotLyogVGltZSB0byBzdGF5IGF3YWtlIGFmdGVyIHR4IHJlYWQgZXZlbnQgKGUuZy4sIHByb3hpbWl0eSkgKi8KLSNkZWZpbmUgU1RBWV9BV0FLRV9BRlRFUl9SRUFEX01TRUNTIDMwMDAKLQotLyogVGhlIGRyaXZlciBzdGF0ZXMgKi8KLWVudW0gdXNmX3N0YXRlX3R5cGUgewotCVVTRl9JRExFX1NUQVRFLAotCVVTRl9PUEVORURfU1RBVEUsCi0JVVNGX0NPTkZJR1VSRURfU1RBVEUsCi0JVVNGX1dPUktfU1RBVEUsCi0JVVNGX0FEU1BfUkVTVEFSVF9TVEFURSwKLQlVU0ZfRVJST1JfU1RBVEUKLX07Ci0KLS8qIFRoZSBVUyBkZXRlY3Rpb24gc3RhdHVzIHVwb24gRlcvSFcgYmFzZWQgVVMgZGV0ZWN0aW9uIHJlc3VsdHMgKi8KLWVudW0gdXNmX3VzX2RldGVjdF90eXBlIHsKLQlVU0ZfVVNfREVURUNUX1VOREVGLAotCVVTRl9VU19ERVRFQ1RfWUVTLAotCVVTRl9VU19ERVRFQ1RfTk8KLX07Ci0KLXN0cnVjdCB1c2ZfeHhfdHlwZSB7Ci0JLyogTmFtZSBvZiB0aGUgY2xpZW50IC0gZXZlbnQgY2FsY3VsYXRvciAqLwotCWNoYXIgY2xpZW50X25hbWVbVVNGX01BWF9DTElFTlRfTkFNRV9TSVpFXTsKLQkvKiBUaGUgZHJpdmVyIHN0YXRlIGluIFRYIG9yIFJYIGRpcmVjdGlvbiAqLwotCWVudW0gdXNmX3N0YXRlX3R5cGUgdXNmX3N0YXRlOwotCS8qIHdhaXQgZm9yIHE2IGV2ZW50cyBtZWNoYW5pc20gKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwotCS8qIElGIHdpdGggcTZ1c20gaW5mbyAqLwotCXN0cnVjdCB1c19jbGllbnQgKnVzYzsKLQkvKiBRNjpVU00nIEVuY29kZXIvZGVjb2RlciBjb25maWd1cmF0aW9uICovCi0Jc3RydWN0IHVzX2VuY2RlY19jZmcgZW5jZGVjX2NmZzsKLQkvKiBTaGFyZWQgYnVmZmVyICh3aXRoIFE2OlVTTSkgc2l6ZSAqLwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOwotCS8qIE51bWJlciBvZiB0aGUgc2hhcmVkIGJ1ZmZlcnMgKHdpdGggUTY6VVNNKSAqLwotCXVpbnQzMl90IGJ1ZmZlcl9jb3VudDsKLQkvKiBTaGFyZWQgbWVtb3J5IChDeWNsaWMgYnVmZmVyIHdpdGggMSBnYXApIGNvbnRyb2wgKi8KLQl1aW50MzJfdCBuZXdfcmVnaW9uOwotCXVpbnQzMl90IHByZXZfcmVnaW9uOwotCS8qIFE2OlVTTSdzIGV2ZW50cyBoYW5kbGVyICovCi0Jdm9pZCAoKmNiKSh1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90ICosIHZvaWQgKik7Ci0JLyogVVMgZGV0ZWN0aW9uIHJlc3VsdCAqLwotCWVudW0gdXNmX3VzX2RldGVjdF90eXBlIHVzX2RldGVjdF90eXBlOwotCS8qIFVzZXIncyB1cGRhdGUgaW5mbyBpc24ndCBhY2NlcHRhYmxlICovCi0JdTggdXNlcl91cGRfaW5mb19uYTsKLX07Ci0KLXN0cnVjdCB1c2ZfdHlwZSB7Ci0JLyogVFggZGV2aWNlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uICYgY29udHJvbCAqLwotCXN0cnVjdCB1c2ZfeHhfdHlwZSB1c2ZfdHg7Ci0JLyogUlggZGV2aWNlIGNvbXBvbmVudCBjb25maWd1cmF0aW9uICYgY29udHJvbCAqLwotCXN0cnVjdCB1c2ZfeHhfdHlwZSB1c2Zfcng7Ci0JLyogSW5kZXggaW50byB0aGUgb3BlbmVkIGRldmljZSBjb250YWluZXIgKi8KLQkvKiBUbyBwcmV2ZW50IG11dHVhbCB1c2FnZSBvZiB0aGUgc2FtZSBkZXZpY2UgKi8KLQl1aW50MTZfdCBkZXZfaW5kOwotCS8qIEV2ZW50IHR5cGVzLCBzdXBwb3J0ZWQgYnkgZGV2aWNlICovCi0JdWludDE2X3QgZXZlbnRfdHlwZXM7Ci0JLyogIFRoZSBpbnB1dCBkZXZpY2VzIGFyZSAiaW5wdXQiIG1vZHVsZSByZWdpc3RlcmVkIGNsaWVudHMgKi8KLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9pZnNbVVNGX01BWF9FVkVOVF9JTkRdOwotCS8qIEJpdG1hcCBvZiB0eXBlcyBvZiBldmVudHMsIGNvbmZsaWN0aW5nIHRvIFVTRidzIG9uZXMgKi8KLQl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF90eXBlczsKLQkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIGZyb20gZGV2cywgY29uZmxpY3Rpbmcgd2l0aCBVU0YgKi8KLQl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF9maWx0ZXJzOwotCS8qIFRoZSByZXF1ZXN0ZWQgYnV0dG9ucyBiaXRtYXAgKi8KLQl1aW50MTZfdCByZXFfYnV0dG9uc19iaXRtYXA7Ci0JLyogTXV0ZXggZm9yIGV4Y2x1c2l2ZSBvcGVyYXRpb25zIChhbGwgcHVibGljIEFQSXMpICovCi0Jc3RydWN0IG11dGV4IG11dGV4OwotfTsKLQotc3RydWN0IHVzZl9pbnB1dF9kZXZfdHlwZSB7Ci0JLyogSW5wdXQgZXZlbnQgdHlwZSwgc3VwcG9ydGVkIGJ5IHRoZSBpbnB1dCBkZXZpY2UgKi8KLQl1aW50MTZfdCBldmVudF90eXBlOwotCS8qIElucHV0IGRldmljZSBuYW1lICovCi0JY29uc3QgY2hhciAqaW5wdXRfZGV2X25hbWU7Ci0JLyogSW5wdXQgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiAqLwotCWludCAoKnByZXBhcmVfZGV2KSh1aW50MTZfdCwgc3RydWN0IHVzZl90eXBlICosCi0JCQkgICAgc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSAqLAotCQkJICAgY29uc3QgY2hhciAqKTsKLQkvKiBJbnB1dCBldmVudCBub3RpZmljYXRpb24gZnVuY3Rpb24gKi8KLQl2b2lkICgqbm90aWZ5X2V2ZW50KShzdHJ1Y3QgdXNmX3R5cGUgKiwKLQkJCSAgICAgdWludDE2X3QsCi0JCQkgICAgIHN0cnVjdCB1c2ZfZXZlbnRfdHlwZSAqCi0JCQkgICAgICk7Ci19OwotCi0KLS8qIFRoZSBNQVggbnVtYmVyIG9mIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyAqLwotI2RlZmluZSBNQVhfREVWU19OVU1CRVIJMQotCi0vKgotICogY29kZSBmb3IgYSBzcGVjaWFsIGJ1dHRvbiB0aGF0IGlzIHVzZWQgdG8gc2hvdy9oaWRlIGEKLSAqIGhvdmVyaW5nIGN1cnNvciBpbiB0aGUgaW5wdXQgZnJhbWV3b3JrLiBNdXN0IGJlIGluCi0gKiBzeW5jIHdpdGggdGhlIGJ1dHRvbiBjb2RlIGRlZmluaXRpb24gaW4gdGhlIGZyYW1ld29yawotICogKEV2ZW50SHViLmgpCi0gKi8KLSNkZWZpbmUgQlROX1VTRl9IT1ZFUklOR19DVVJTT1IgICAgICAgICAweDIzMAotCi0vKiBTdXBwb3J0ZWQgYnV0dG9ucyBjb250YWluZXIgKi8KLXN0YXRpYyBjb25zdCBpbnQgc19idXR0b25fbWFwW10gPSB7Ci0JQlROX1NUWUxVUywKLQlCVE5fU1RZTFVTMiwKLQlCVE5fVE9PTF9QRU4sCi0JQlROX1RPT0xfUlVCQkVSLAotCUJUTl9UT09MX0ZJTkdFUiwKLQlCVE5fVVNGX0hPVkVSSU5HX0NVUlNPUgotfTsKLQotLyogVGhlIG9wZW5lZCBkZXZpY2VzIGNvbnRhaW5lciAqLwotc3RhdGljIGF0b21pY190IHNfb3BlbmVkX2RldnNbTUFYX0RFVlNfTlVNQkVSXTsKLQotc3RhdGljIHN0cnVjdCB3YWtldXBfc291cmNlIHVzZl93YWtldXBfc291cmNlOwotCi0jZGVmaW5lIFVTRl9OQU1FX1BSRUZJWCAidXNmXyIKLSNkZWZpbmUgVVNGX05BTUVfUFJFRklYX1NJWkUgNAotCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICphbGxvY2F0ZV9kZXYodWludDE2X3QgaW5kLCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmluX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCi0JaWYgKGluX2RldiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGlucHV0X2FsbG9jYXRlX2RldmljZSgpIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCS8qIENvbW1vbiBwYXJ0IGNvbmZpZ3VyYXRpb24gKi8KLQkJaW5fZGV2LT5uYW1lID0gbmFtZTsKLQkJaW5fZGV2LT5waHlzID0gTlVMTDsKLQkJaW5fZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7Ci0JCWluX2Rldi0+aWQudmVuZG9yICA9IDB4MDAwMTsKLQkJaW5fZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOwotCQlpbl9kZXYtPmlkLnZlcnNpb24gPSBVU0ZfVkVSU0lPTl9JRDsKLQl9Ci0JcmV0dXJuIGluX2RldjsKLX0KLQotc3RhdGljIGludCBwcmVwYXJlX3RzY19pbnB1dF9kZXZpY2UodWludDE2X3QgaW5kLAotCQkJCXN0cnVjdCB1c2ZfdHlwZSAqdXNmX2luZm8sCi0JCQkJc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSAqaW5wdXRfaW5mbywKLQkJCQljb25zdCBjaGFyICpuYW1lKQotewotCWludCBpID0gMDsKLQotCWludCBudW1fYnV0dG9ucyA9IG1pbihBUlJBWV9TSVpFKHNfYnV0dG9uX21hcCksCi0JCXNpemVvZihpbnB1dF9pbmZvLT5yZXFfYnV0dG9uc19iaXRtYXApICoKLQkJQklUU19JTl9CWVRFKTsKLQl1aW50MTZfdCBtYXhfYnV0dG9uc19iaXRtYXAgPSAoKDEgPDwgQVJSQVlfU0laRShzX2J1dHRvbl9tYXApKSAtIDEpOwotCi0Jc3RydWN0IGlucHV0X2RldiAqaW5fZGV2ID0gYWxsb2NhdGVfZGV2KGluZCwgbmFtZSk7Ci0KLQlpZiAoaW5fZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGlucHV0X2luZm8tPnJlcV9idXR0b25zX2JpdG1hcCA+IG1heF9idXR0b25zX2JpdG1hcCkgewotCQlwcl9lcnIoIiVzOiBSZXF1ZXN0ZWQgYnV0dG9uc1slZF0gZXhjZWVkcyBtYXggYnV0dG9ucyBhdmFpbGFibGVbJWRdXG4iLAotCQlfX2Z1bmNfXywKLQkJaW5wdXRfaW5mby0+cmVxX2J1dHRvbnNfYml0bWFwLAotCQltYXhfYnV0dG9uc19iaXRtYXApOwotCQlpbnB1dF9mcmVlX2RldmljZShpbl9kZXYpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl1c2ZfaW5mby0+aW5wdXRfaWZzW2luZF0gPSBpbl9kZXY7Ci0JdXNmX2luZm8tPnJlcV9idXR0b25zX2JpdG1hcCA9Ci0JCWlucHV0X2luZm8tPnJlcV9idXR0b25zX2JpdG1hcDsKLQlpbl9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7Ci0JaW5fZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9idXR0b25zOyBpKyspCi0JCWlmIChpbnB1dF9pbmZvLT5yZXFfYnV0dG9uc19iaXRtYXAgJiAoMSA8PCBpKSkKLQkJCWluX2Rldi0+a2V5Yml0W0JJVF9XT1JEKHNfYnV0dG9uX21hcFtpXSldIHw9Ci0JCQlCSVRfTUFTSyhzX2J1dHRvbl9tYXBbaV0pOwotCi0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5fZGV2LCBBQlNfWCwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3hfZGltW01JTl9JTkRdLAotCQkJICAgICBpbnB1dF9pbmZvLT50c2NfeF9kaW1bTUFYX0lORF0sCi0JCQkgICAgIDAsIDApOwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGluX2RldiwgQUJTX1ksCi0JCQkgICAgIGlucHV0X2luZm8tPnRzY195X2RpbVtNSU5fSU5EXSwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3lfZGltW01BWF9JTkRdLAotCQkJICAgICAwLCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbl9kZXYsIEFCU19ESVNUQU5DRSwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3pfZGltW01JTl9JTkRdLAotCQkJICAgICBpbnB1dF9pbmZvLT50c2Nfel9kaW1bTUFYX0lORF0sCi0JCQkgICAgIDAsIDApOwotCi0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5fZGV2LCBBQlNfUFJFU1NVUkUsCi0JCQkgICAgIGlucHV0X2luZm8tPnRzY19wcmVzc3VyZVtNSU5fSU5EXSwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3ByZXNzdXJlW01BWF9JTkRdLAotCQkJICAgICAwLCAwKTsKLQotCWlucHV0X3NldF9hYnNfcGFyYW1zKGluX2RldiwgQUJTX1RJTFRfWCwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3hfdGlsdFtNSU5fSU5EXSwKLQkJCSAgICAgaW5wdXRfaW5mby0+dHNjX3hfdGlsdFtNQVhfSU5EXSwKLQkJCSAgICAgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5fZGV2LCBBQlNfVElMVF9ZLAotCQkJICAgICBpbnB1dF9pbmZvLT50c2NfeV90aWx0W01JTl9JTkRdLAotCQkJICAgICBpbnB1dF9pbmZvLT50c2NfeV90aWx0W01BWF9JTkRdLAotCQkJICAgICAwLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByZXBhcmVfbW91c2VfaW5wdXRfZGV2aWNlKHVpbnQxNl90IGluZCwgc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKLQkJCXN0cnVjdCB1c19pbnB1dF9pbmZvX3R5cGUgKmlucHV0X2luZm8sCi0JCQljb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmluX2RldiA9IGFsbG9jYXRlX2RldihpbmQsIG5hbWUpOwotCi0JaWYgKGluX2RldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXVzZl9pbmZvLT5pbnB1dF9pZnNbaW5kXSA9IGluX2RldjsKLQlpbl9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRUwpOwotCi0JaW5fZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTEVGVCkgfAotCQkJCQkJQklUX01BU0soQlROX1JJR0hUKSB8Ci0JCQkJCQlCSVRfTUFTSyhCVE5fTUlERExFKTsKLQlpbl9kZXYtPnJlbGJpdFswXSA9ICBCSVRfTUFTSyhSRUxfWCkgfAotCQkJCUJJVF9NQVNLKFJFTF9ZKSB8Ci0JCQkJQklUX01BU0soUkVMX1opOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJlcGFyZV9rZXlib2FyZF9pbnB1dF9kZXZpY2UoCi0JCQkJCXVpbnQxNl90IGluZCwKLQkJCQkJc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKLQkJCQkJc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSAqaW5wdXRfaW5mbywKLQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbl9kZXYgPSBhbGxvY2F0ZV9kZXYoaW5kLCBuYW1lKTsKLQotCWlmIChpbl9kZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl1c2ZfaW5mby0+aW5wdXRfaWZzW2luZF0gPSBpbl9kZXY7Ci0JaW5fZGV2LT5ldmJpdFswXSB8PSBCSVRfTUFTSyhFVl9LRVkpOwotCS8qIEFsbCBrZXlzIGFyZSBwZXJtaXR0ZWQgKi8KLQltZW1zZXQoaW5fZGV2LT5rZXliaXQsIDB4ZmYsIHNpemVvZihpbl9kZXYtPmtleWJpdCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGlmeV90c2NfZXZlbnQoc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKLQkJCSAgICAgdWludDE2X3QgaWZfaW5kLAotCQkJICAgICBzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgKmV2ZW50KQotCi17Ci0JaW50IGkgPSAwOwotCWludCBudW1fYnV0dG9ucyA9IG1pbihBUlJBWV9TSVpFKHNfYnV0dG9uX21hcCksCi0JCXNpemVvZih1c2ZfaW5mby0+cmVxX2J1dHRvbnNfYml0bWFwKSAqCi0JCUJJVFNfSU5fQllURSk7Ci0KLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9pZiA9IHVzZl9pbmZvLT5pbnB1dF9pZnNbaWZfaW5kXTsKLQlzdHJ1Y3QgcG9pbnRfZXZlbnRfdHlwZSAqcGUgPSAmKGV2ZW50LT5ldmVudF9kYXRhLnBvaW50X2V2ZW50KTsKLQotCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaWYsIEFCU19YLCBwZS0+Y29vcmRpbmF0ZXNbWF9JTkRdKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2lmLCBBQlNfWSwgcGUtPmNvb3JkaW5hdGVzW1lfSU5EXSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9pZiwgQUJTX0RJU1RBTkNFLCBwZS0+Y29vcmRpbmF0ZXNbWl9JTkRdKTsKLQotCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfaWYsIEFCU19USUxUX1gsIHBlLT5pbmNsaW5hdGlvbnNbWF9JTkRdKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2lmLCBBQlNfVElMVF9ZLCBwZS0+aW5jbGluYXRpb25zW1lfSU5EXSk7Ci0KLQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2lmLCBBQlNfUFJFU1NVUkUsIHBlLT5wcmVzc3VyZSk7Ci0JaW5wdXRfcmVwb3J0X2tleShpbnB1dF9pZiwgQlROX1RPVUNILCAhIShwZS0+cHJlc3N1cmUpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYnV0dG9uczsgaSsrKSB7Ci0JCXVpbnQxNl90IG1hc2sgPSAoMSA8PCBpKSwKLQkJYnRuX3N0YXRlID0gISEocGUtPmJ1dHRvbnNfc3RhdGVfYml0bWFwICYgbWFzayk7Ci0JCWlmICh1c2ZfaW5mby0+cmVxX2J1dHRvbnNfYml0bWFwICYgbWFzaykKLQkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfaWYsIHNfYnV0dG9uX21hcFtpXSwgYnRuX3N0YXRlKTsKLQl9Ci0KLQlpbnB1dF9zeW5jKGlucHV0X2lmKTsKLQotCXByX2RlYnVnKCIlczogVFNDIGV2ZW50OiB4eXpbJWQ7JWQ7JWRdLCBpbmNsWyVkOyVkXSwgcHJlc3N1cmVbJWRdLCBidXR0b25zWyVkXVxuIiwKLQkJIF9fZnVuY19fLAotCQkgcGUtPmNvb3JkaW5hdGVzW1hfSU5EXSwKLQkJIHBlLT5jb29yZGluYXRlc1tZX0lORF0sCi0JCSBwZS0+Y29vcmRpbmF0ZXNbWl9JTkRdLAotCQkgcGUtPmluY2xpbmF0aW9uc1tYX0lORF0sCi0JCSBwZS0+aW5jbGluYXRpb25zW1lfSU5EXSwKLQkJIHBlLT5wcmVzc3VyZSwKLQkJIHBlLT5idXR0b25zX3N0YXRlX2JpdG1hcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGlmeV9tb3VzZV9ldmVudChzdHJ1Y3QgdXNmX3R5cGUgKnVzZl9pbmZvLAotCQkJICAgICAgIHVpbnQxNl90IGlmX2luZCwKLQkJCSAgICAgICBzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgKmV2ZW50KQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2lmID0gdXNmX2luZm8tPmlucHV0X2lmc1tpZl9pbmRdOwotCXN0cnVjdCBtb3VzZV9ldmVudF90eXBlICptZSA9ICYoZXZlbnQtPmV2ZW50X2RhdGEubW91c2VfZXZlbnQpOwotCi0JaW5wdXRfcmVwb3J0X3JlbChpbnB1dF9pZiwgUkVMX1gsIG1lLT5yZWxzW1hfSU5EXSk7Ci0JaW5wdXRfcmVwb3J0X3JlbChpbnB1dF9pZiwgUkVMX1ksIG1lLT5yZWxzW1lfSU5EXSk7Ci0JaW5wdXRfcmVwb3J0X3JlbChpbnB1dF9pZiwgUkVMX1osIG1lLT5yZWxzW1pfSU5EXSk7Ci0KLQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2lmLCBCVE5fTEVGVCwKLQkJCSBtZS0+YnV0dG9uc19zdGF0ZXMgJiBVU0ZfQlVUVE9OX0xFRlRfTUFTSyk7Ci0JaW5wdXRfcmVwb3J0X2tleShpbnB1dF9pZiwgQlROX01JRERMRSwKLQkJCSBtZS0+YnV0dG9uc19zdGF0ZXMgJiBVU0ZfQlVUVE9OX01JRERMRV9NQVNLKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2lmLCBCVE5fUklHSFQsCi0JCQkgbWUtPmJ1dHRvbnNfc3RhdGVzICYgVVNGX0JVVFRPTl9SSUdIVF9NQVNLKTsKLQotCWlucHV0X3N5bmMoaW5wdXRfaWYpOwotCi0JcHJfZGVidWcoIiVzOiBtb3VzZSBldmVudDogZHhbJWRdLCBkeVslZF0sIGJ1dHRvbnNfc3RhdGVzWyVkXVxuIiwKLQkJIF9fZnVuY19fLCBtZS0+cmVsc1tYX0lORF0sCi0JCSBtZS0+cmVsc1tZX0lORF0sIG1lLT5idXR0b25zX3N0YXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGlmeV9rZXlfZXZlbnQoc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKLQkJCSAgICAgdWludDE2X3QgaWZfaW5kLAotCQkJICAgICBzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgKmV2ZW50KQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2lmID0gdXNmX2luZm8tPmlucHV0X2lmc1tpZl9pbmRdOwotCXN0cnVjdCBrZXlfZXZlbnRfdHlwZSAqa2UgPSAmKGV2ZW50LT5ldmVudF9kYXRhLmtleV9ldmVudCk7Ci0KLQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0X2lmLCBrZS0+a2V5LCBrZS0+a2V5X3N0YXRlKTsKLQlpbnB1dF9zeW5jKGlucHV0X2lmKTsKLQlwcl9kZWJ1ZygiJXM6IGtleSBldmVudDoga2V5WyVkXSwgc3RhdGVbJWRdXG4iLAotCQkgX19mdW5jX18sCi0JCSBrZS0+a2V5LAotCQkga2UtPmtleV9zdGF0ZSk7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCB1c2ZfaW5wdXRfZGV2X3R5cGUgc191c2ZfaW5wdXRfZGV2c1tdID0gewotCXtVU0ZfVFNDX0VWRU5ULCAidXNmX3RzYyIsCi0JCXByZXBhcmVfdHNjX2lucHV0X2RldmljZSwgbm90aWZ5X3RzY19ldmVudH0sCi0Je1VTRl9UU0NfUFRSX0VWRU5ULCAidXNmX3RzY19wdHIiLAotCQlwcmVwYXJlX3RzY19pbnB1dF9kZXZpY2UsIG5vdGlmeV90c2NfZXZlbnR9LAotCXtVU0ZfTU9VU0VfRVZFTlQsICJ1c2ZfbW91c2UiLAotCQlwcmVwYXJlX21vdXNlX2lucHV0X2RldmljZSwgbm90aWZ5X21vdXNlX2V2ZW50fSwKLQl7VVNGX0tFWUJPQVJEX0VWRU5ULCAidXNmX2tiIiwKLQkJcHJlcGFyZV9rZXlib2FyZF9pbnB1dF9kZXZpY2UsIG5vdGlmeV9rZXlfZXZlbnR9LAotCXtVU0ZfVFNDX0VYVF9FVkVOVCwgInVzZl90c2NfZXh0IiwKLQkJcHJlcGFyZV90c2NfaW5wdXRfZGV2aWNlLCBub3RpZnlfdHNjX2V2ZW50fSwKLX07Ci0KLXN0YXRpYyB2b2lkIHVzZl9yeF9jYih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQkgICAgICB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9IChzdHJ1Y3QgdXNmX3h4X3R5cGUgKikgcHJpdjsKLQotCWlmICh1c2ZfeHggPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB0aGUgcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBRNlVTTV9FVkVOVF9XUklURV9ET05FOgotCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOwotCQlicmVhazsKLQotCWNhc2UgUkVTRVRfRVZFTlRTOgotCQlwcl9lcnIoIiVzOiByZWNlaXZlZCBSRVNFVF9FVkVOVFNcbiIsIF9fZnVuY19fKTsKLQkJdXNmX3h4LT51c2Zfc3RhdGUgPSBVU0ZfQURTUF9SRVNUQVJUX1NUQVRFOwotCQl3YWtlX3VwKCZ1c2ZfeHgtPndhaXQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNmX3R4X2NiKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCi0JCSAgICAgIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KQotewotCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gKHN0cnVjdCB1c2ZfeHhfdHlwZSAqKSBwcml2OwotCi0JaWYgKHVzZl94eCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHRoZSBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIFE2VVNNX0VWRU5UX1JFQURfRE9ORToKLQkJcHJfZGVidWcoIiVzOiBhY3F1aXJpbmcgJWQgbXNlYyB3YWtlIGxvY2tcbiIsIF9fZnVuY19fLAotCQkJCVNUQVlfQVdBS0VfQUZURVJfUkVBRF9NU0VDUyk7Ci0JCV9fcG1fd2FrZXVwX2V2ZW50KCZ1c2Zfd2FrZXVwX3NvdXJjZSwKLQkJCQkgIFNUQVlfQVdBS0VfQUZURVJfUkVBRF9NU0VDUyk7Ci0JCWlmICh0b2tlbiA9PSBVU01fV1JPTkdfVE9LRU4pCi0JCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9FUlJPUl9TVEFURTsKLQkJdXNmX3h4LT5uZXdfcmVnaW9uID0gdG9rZW47Ci0JCXdha2VfdXAoJnVzZl94eC0+d2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBRNlVTTV9FVkVOVF9TSUdOQUxfREVURUNUX1JFU1VMVDoKLQkJdXNmX3h4LT51c19kZXRlY3RfdHlwZSA9IChwYXlsb2FkW0FQUl9VU19ERVRFQ1RfUkVTVUxUX0lORF0pID8KLQkJCQkJVVNGX1VTX0RFVEVDVF9ZRVMgOgotCQkJCQlVU0ZfVVNfREVURUNUX05POwotCi0JCXdha2VfdXAoJnVzZl94eC0+d2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDoKLQkJaWYgKHBheWxvYWRbQVBSX1JFU1VMVF9JTkRdKSB7Ci0JCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9FUlJPUl9TVEFURTsKLQkJCXVzZl94eC0+bmV3X3JlZ2lvbiA9IFVTTV9XUk9OR19UT0tFTjsKLQkJCXdha2VfdXAoJnVzZl94eC0+d2FpdCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFJFU0VUX0VWRU5UUzoKLQkJcHJfZXJyKCIlczogcmVjZWl2ZWQgUkVTRVRfRVZFTlRTXG4iLCBfX2Z1bmNfXyk7Ci0JCXVzZl94eC0+dXNmX3N0YXRlID0gVVNGX0FEU1BfUkVTVEFSVF9TVEFURTsKLQkJd2FrZV91cCgmdXNmX3h4LT53YWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfeHgoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgpCi17Ci0JaWYgKHVzZl94eCAhPSBOVUxMKSB7Ci0JCWlmICh1c2ZfeHgtPnVzYykgewotCQkJcTZ1c21fdXNfY2xpZW50X2ZyZWUodXNmX3h4LT51c2MpOwotCQkJdXNmX3h4LT51c2MgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMgIT0gTlVMTCkgewotCQkJa2ZyZWUodXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyk7Ci0JCQl1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zID0gTlVMTDsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNmX2Rpc2FibGUoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgpCi17Ci0JaWYgKHVzZl94eCAhPSBOVUxMKSB7Ci0JCWlmICgodXNmX3h4LT51c2Zfc3RhdGUgIT0gVVNGX0lETEVfU1RBVEUpICYmCi0JCSAgICAodXNmX3h4LT51c2Zfc3RhdGUgIT0gVVNGX09QRU5FRF9TVEFURSkpIHsKLQkJCSh2b2lkKXE2dXNtX2NtZCh1c2ZfeHgtPnVzYywgQ01EX0NMT1NFKTsKLQkJCXVzZl94eC0+dXNmX3N0YXRlID0gVVNGX09QRU5FRF9TVEFURTsKLQkJCXdha2VfdXAoJnVzZl94eC0+d2FpdCk7Ci0JCX0KLQkJcmVsZWFzZV94eCh1c2ZfeHgpOwotCX0KLX0KLQotc3RhdGljIGludCBjb25maWdfeHgoc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsIHN0cnVjdCB1c194eF9pbmZvX3R5cGUgKmNvbmZpZykKLXsKLQlpbnQgcmMgPSAwOwotCXVpbnQxNl90IGRhdGFfbWFwX3NpemUgPSAwOwotCXVpbnQxNl90IG1pbl9tYXBfc2l6ZSA9IDA7Ci0KLQlpZiAoKHVzZl94eCA9PSBOVUxMKSB8fAotCSAgICAoY29uZmlnID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgoY29uZmlnLT5idWZfc2l6ZSA9PSAwKSB8fAotCSAgICAoY29uZmlnLT5idWZfc2l6ZSA+IFVTRl9NQVhfQlVGX1NJWkUpIHx8Ci0JICAgIChjb25maWctPmJ1Zl9udW0gPT0gMCkgfHwKLQkgICAgKGNvbmZpZy0+YnVmX251bSA+IFVTRl9NQVhfQlVGX05VTSkpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgcGFyYW1zOiBidWZfc2l6ZT0lZDsgYnVmX251bT0lZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjb25maWctPmJ1Zl9zaXplLCBjb25maWctPmJ1Zl9udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYXRhX21hcF9zaXplID0gc2l6ZW9mKHVzZl94eC0+ZW5jZGVjX2NmZy5jZmdfY29tbW9uLmRhdGFfbWFwKTsKLQltaW5fbWFwX3NpemUgPSBtaW4oZGF0YV9tYXBfc2l6ZSwgY29uZmlnLT5wb3J0X2NudCk7Ci0KLQlpZiAoY29uZmlnLT5jbGllbnRfbmFtZSAhPSBOVUxMKSB7Ci0JCWlmIChzdHJuY3B5X2Zyb21fdXNlcih1c2ZfeHgtPmNsaWVudF9uYW1lLAotCQkJCSAgICAgIChjaGFyIF9fdXNlciAqKWNvbmZpZy0+Y2xpZW50X25hbWUsCi0JCQkJICAgICAgc2l6ZW9mKHVzZl94eC0+Y2xpZW50X25hbWUpIC0gMSkgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBnZXQgY2xpZW50IG5hbWUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXByX2RlYnVnKCIlczogbmFtZT0lczsgYnVmX3NpemU6JWQ7IGRldl9pZDoweCV4OyBzYW1wbGVfcmF0ZTolZFxuIiwKLQkJX19mdW5jX18sIHVzZl94eC0+Y2xpZW50X25hbWUsIGNvbmZpZy0+YnVmX3NpemUsCi0JCWNvbmZpZy0+ZGV2X2lkLCBjb25maWctPnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogYnVmX251bTolZDsgZm9ybWF0OiVkOyBwb3J0X2NudDolZDsgZGF0YV9zaXplPSVkXG4iLAotCQlfX2Z1bmNfXywgY29uZmlnLT5idWZfbnVtLCBjb25maWctPnN0cmVhbV9mb3JtYXQsCi0JCWNvbmZpZy0+cG9ydF9jbnQsIGNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkWzBdPSVkLCBpZFsxXT0lZCwgaWRbMl09JWQsIGlkWzNdPSVkLCBpZFs0XT0lZCxcbiIsCi0JCV9fZnVuY19fLAotCQljb25maWctPnBvcnRfaWRbMF0sCi0JCWNvbmZpZy0+cG9ydF9pZFsxXSwKLQkJY29uZmlnLT5wb3J0X2lkWzJdLAotCQljb25maWctPnBvcnRfaWRbM10sCi0JCWNvbmZpZy0+cG9ydF9pZFs0XSk7Ci0KLQlwcl9kZWJ1ZygiaWRbNV09JWQsIGlkWzZdPSVkLCBpZFs3XT0lZFxuIiwKLQkJY29uZmlnLT5wb3J0X2lkWzVdLAotCQljb25maWctPnBvcnRfaWRbNl0sCi0JCWNvbmZpZy0+cG9ydF9pZFs3XSk7Ci0KLQkvKiBxNnVzbSBhbGxvY2F0aW9uICYgY29uZmlndXJhdGlvbiAqLwotCXVzZl94eC0+YnVmZmVyX3NpemUgPSBjb25maWctPmJ1Zl9zaXplOwotCXVzZl94eC0+YnVmZmVyX2NvdW50ID0gY29uZmlnLT5idWZfbnVtOwotCXVzZl94eC0+ZW5jZGVjX2NmZy5jZmdfY29tbW9uLmJpdHNfcGVyX3NhbXBsZSA9Ci0JCQkJY29uZmlnLT5iaXRzX3Blcl9zYW1wbGU7Ci0JdXNmX3h4LT5lbmNkZWNfY2ZnLmNmZ19jb21tb24uc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwotCS8qIEFGRSBwb3J0IGUuZy4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzFfUlggKi8KLQl1c2ZfeHgtPmVuY2RlY19jZmcuY2ZnX2NvbW1vbi5kZXZfaWQgPSBjb25maWctPmRldl9pZDsKLQotCXVzZl94eC0+ZW5jZGVjX2NmZy5jZmdfY29tbW9uLmNoX2NmZyA9IGNvbmZpZy0+cG9ydF9jbnQ7Ci0JbWVtY3B5KCh2b2lkICopJnVzZl94eC0+ZW5jZGVjX2NmZy5jZmdfY29tbW9uLmRhdGFfbWFwLAotCSAgICAgICAodm9pZCAqKWNvbmZpZy0+cG9ydF9pZCwKLQkgICAgICAgbWluX21hcF9zaXplKTsKLQotCXVzZl94eC0+ZW5jZGVjX2NmZy5mb3JtYXRfaWQgPSBjb25maWctPnN0cmVhbV9mb3JtYXQ7Ci0JdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtc19zaXplID0gY29uZmlnLT5wYXJhbXNfZGF0YV9zaXplOwotCXVzZl94eC0+dXNlcl91cGRfaW5mb19uYSA9IDE7IC8qIGl0J3MgdXNlZCBpbiBVU19HRVRfVFhfVVBEQVRFICovCi0KLQlpZiAoY29uZmlnLT5wYXJhbXNfZGF0YV9zaXplID4gMCkgeyAvKiB0cmFuc3BhcmVudCBkYXRhIGNvcHkgKi8KLQkJdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyA9IGt6YWxsb2MoY29uZmlnLT5wYXJhbXNfZGF0YV9zaXplLAotCQkJCQkJICAgIEdGUF9LRVJORUwpOwotCQkvKiBGYWxzZSBtZW1vcnkgbGVhayBoZXJlIC0gcG9pbnRlciBpbiBwYWNrZWQgc3RydWN0Ci0JCSAqIGlzIHVuZGV0ZWN0ZWQgYnkga21lbWxlYWsgdG9vbAotCQkgKi8KLQkJa21lbWxlYWtfaWdub3JlKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMpOwotCQlpZiAodXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBwYXJhbXMgbWVtb3J5IGFsbG9jWyVkXSBmYWlsdXJlXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlyYyA9IGNvcHlfZnJvbV91c2VyKHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXMsCi0JCQkJICAgICh1aW50OF90IF9fdXNlciAqKWNvbmZpZy0+cGFyYW1zX2RhdGEsCi0JCQkJICAgIGNvbmZpZy0+cGFyYW1zX2RhdGFfc2l6ZSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogdHJhbnNwYXJlbnQgZGF0YSBjb3B5IGZhaWx1cmVcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJa2ZyZWUodXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtcyk7Ci0JCQl1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zID0gTlVMTDsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXByX2RlYnVnKCIlczogcGFyYW1zX3NpemVbJWRdOyBwYXJhbXNbJWQsJWQsJWQsJWQsICVkXVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSBjb25maWctPnBhcmFtc19kYXRhX3NpemUsCi0JCQkgdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtc1swXSwKLQkJCSB1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zWzFdLAotCQkJIHVzZl94eC0+ZW5jZGVjX2NmZy5wYXJhbXNbMl0sCi0JCQkgdXNmX3h4LT5lbmNkZWNfY2ZnLnBhcmFtc1szXSwKLQkJCSB1c2ZfeHgtPmVuY2RlY19jZmcucGFyYW1zWzRdCi0JCQkpOwotCX0KLQotCXVzZl94eC0+dXNjID0gcTZ1c21fdXNfY2xpZW50X2FsbG9jKHVzZl94eC0+Y2IsICh2b2lkICopdXNmX3h4KTsKLQlpZiAoIXVzZl94eC0+dXNjKSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBxNnVzbSBjbGllbnRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGJvb2wgdXNmX21hdGNoKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kLCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCi17Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0JcmMgPSAoZXZlbnRfdHlwZV9pbmQgPCBNQVhfRVZFTlRfVFlQRV9OVU0pICYmCi0JCSgoZGV2LT5uYW1lID09IE5VTEwpIHx8Ci0JCXN0cmNtcChkZXYtPm5hbWUsIFVTRl9OQU1FX1BSRUZJWCkpOwotCXByX2RlYnVnKCIlczogbmFtZT1bJXNdOyByYz0lZFxuIiwKLQkJIF9fZnVuY19fLCBkZXYtPm5hbWUsIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGJvb2wgdXNmX3JlZ2lzdGVyX2NvbmZsaWN0aW5nX2V2ZW50cyh1aW50MTZfdCBldmVudF90eXBlcykKLXsKLQlib29sIHJjID0gdHJ1ZTsKLQl1aW50MTZfdCBpbmQgPSAwOwotCXVpbnQxNl90IG1hc2sgPSAxOwotCi0JZm9yIChpbmQgPSAwOyBpbmQgPCBNQVhfRVZFTlRfVFlQRV9OVU07ICsraW5kKSB7Ci0JCWlmIChldmVudF90eXBlcyAmIG1hc2spIHsKLQkJCXJjID0gdXNmY2Rldl9yZWdpc3RlcihpbmQsIHVzZl9tYXRjaCk7Ci0JCQlpZiAoIXJjKQotCQkJCWJyZWFrOwotCQl9Ci0JCW1hc2sgPSBtYXNrIDw8IDE7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB1c2ZfdW5yZWdpc3Rlcl9jb25mbGljdGluZ19ldmVudHModWludDE2X3QgZXZlbnRfdHlwZXMpCi17Ci0JdWludDE2X3QgaW5kID0gMDsKLQl1aW50MTZfdCBtYXNrID0gMTsKLQotCWZvciAoaW5kID0gMDsgaW5kIDwgTUFYX0VWRU5UX1RZUEVfTlVNOyArK2luZCkgewotCQlpZiAoZXZlbnRfdHlwZXMgJiBtYXNrKQotCQkJdXNmY2Rldl91bnJlZ2lzdGVyKGluZCk7Ci0JCW1hc2sgPSBtYXNrIDw8IDE7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1c2Zfc2V0X2V2ZW50X2ZpbHRlcnMoc3RydWN0IHVzZl90eXBlICp1c2YsIHVpbnQxNl90IGV2ZW50X2ZpbHRlcnMpCi17Ci0JdWludDE2X3QgaW5kID0gMDsKLQl1aW50MTZfdCBtYXNrID0gMTsKLQotCWlmICh1c2YtPmNvbmZsaWN0aW5nX2V2ZW50X2ZpbHRlcnMgIT0gZXZlbnRfZmlsdGVycykgewotCQlmb3IgKGluZCA9IDA7IGluZCA8IE1BWF9FVkVOVF9UWVBFX05VTTsgKytpbmQpIHsKLQkJCWlmICh1c2YtPmNvbmZsaWN0aW5nX2V2ZW50X3R5cGVzICYgbWFzaykKLQkJCQl1c2ZjZGV2X3NldF9maWx0ZXIoaW5kLCBldmVudF9maWx0ZXJzJm1hc2spOwotCQkJbWFzayA9IG1hc2sgPDwgMTsKLQkJfQotCQl1c2YtPmNvbmZsaWN0aW5nX2V2ZW50X2ZpbHRlcnMgPSBldmVudF9maWx0ZXJzOwotCX0KLX0KLQotc3RhdGljIGludCByZWdpc3Rlcl9pbnB1dF9kZXZpY2Uoc3RydWN0IHVzZl90eXBlICp1c2ZfaW5mbywKLQkJCQkgc3RydWN0IHVzX2lucHV0X2luZm9fdHlwZSAqaW5wdXRfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCWJvb2wgcmV0ID0gdHJ1ZTsKLQl1aW50MTZfdCBpbmQgPSAwOwotCi0JaWYgKCh1c2ZfaW5mbyA9PSBOVUxMKSB8fAotCSAgICAoaW5wdXRfaW5mbyA9PSBOVUxMKSB8fAotCSAgICAhKGlucHV0X2luZm8tPmV2ZW50X3R5cGVzICYgVVNGX0FMTF9FVkVOVFMpKSB7Ci0JCXByX2VycigiJXM6IHdyb25nIGlucHV0IHBhcmFtZXRlcihzKVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGluZCA9IDA7IGluZCA8IFVTRl9NQVhfRVZFTlRfSU5EOyArK2luZCkgewotCQlpZiAodXNmX2luZm8tPmlucHV0X2lmc1tpbmRdICE9IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IGlucHV0X2lmWyVkXSBpcyBhbHJlYWR5IGFsbG9jYXRlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmICgoaW5wdXRfaW5mby0+ZXZlbnRfdHlwZXMgJgotCQkJc191c2ZfaW5wdXRfZGV2c1tpbmRdLmV2ZW50X3R5cGUpICYmCi0JCSAgICAgc191c2ZfaW5wdXRfZGV2c1tpbmRdLnByZXBhcmVfZGV2KSB7Ci0JCQlyYyA9ICgqc191c2ZfaW5wdXRfZGV2c1tpbmRdLnByZXBhcmVfZGV2KSgKLQkJCQlpbmQsCi0JCQkJdXNmX2luZm8sCi0JCQkJaW5wdXRfaW5mbywKLQkJCQlzX3VzZl9pbnB1dF9kZXZzW2luZF0uaW5wdXRfZGV2X25hbWUpOwotCQkJaWYgKHJjKQotCQkJCXJldHVybiByYzsKLQotCQkJcmMgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodXNmX2luZm8tPmlucHV0X2lmc1tpbmRdKTsKLQkJCWlmIChyYykgewotCQkJCXByX2VycigiJXM6IGlucHV0X3JlZ19kZXYoKSBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCWlucHV0X2ZyZWVfZGV2aWNlKHVzZl9pbmZvLT5pbnB1dF9pZnNbaW5kXSk7Ci0JCQkJdXNmX2luZm8tPmlucHV0X2lmc1tpbmRdID0gTlVMTDsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNmX2luZm8tPmV2ZW50X3R5cGVzIHw9Ci0JCQkJCXNfdXNmX2lucHV0X2RldnNbaW5kXS5ldmVudF90eXBlOwotCQkJCXByX2RlYnVnKCIlczogaW5wdXQgZGV2aWNlWyVzXSB3YXMgcmVnaXN0ZXJlZFxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCXNfdXNmX2lucHV0X2RldnNbaW5kXS5pbnB1dF9kZXZfbmFtZSk7Ci0JCQl9Ci0JCX0gLyogc3VwcG9ydGVkIGV2ZW50ICovCi0JfSAvKiBldmVudCB0eXBlcyBsb29wICovCi0KLQlyZXQgPSB1c2ZfcmVnaXN0ZXJfY29uZmxpY3RpbmdfZXZlbnRzKAotCQkJaW5wdXRfaW5mby0+Y29uZmxpY3RpbmdfZXZlbnRfdHlwZXMpOwotCWlmIChyZXQpCi0JCXVzZl9pbmZvLT5jb25mbGljdGluZ19ldmVudF90eXBlcyA9Ci0JCQlpbnB1dF9pbmZvLT5jb25mbGljdGluZ19ldmVudF90eXBlczsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGhhbmRsZV9pbnB1dF9ldmVudChzdHJ1Y3QgdXNmX3R5cGUgKnVzZl9pbmZvLAotCQkJICAgICAgIHVpbnQxNl90IGV2ZW50X2NvdW50ZXIsCi0JCQkgICAgICAgc3RydWN0IHVzZl9ldmVudF90eXBlIF9fdXNlciAqZXZlbnQpCi17Ci0JdWludDE2X3QgaW5kID0gMDsKLQl1aW50MTZfdCBldmVudHNfbnVtID0gMDsKLQlzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgdXNmX2V2ZW50c1tVU0ZfRVZFTlRTX1BPUlRJT05fU0laRV07Ci0JaW50IHJjID0gMDsKLQotCWlmICgodXNmX2luZm8gPT0gTlVMTCkgfHwKLQkgICAgKGV2ZW50ID09IE5VTEwpIHx8ICghZXZlbnRfY291bnRlcikpIHsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlIChldmVudF9jb3VudGVyID4gMCkgewotCQlpZiAoZXZlbnRfY291bnRlciA+IFVTRl9FVkVOVFNfUE9SVElPTl9TSVpFKSB7Ci0JCQlldmVudHNfbnVtID0gVVNGX0VWRU5UU19QT1JUSU9OX1NJWkU7Ci0JCQlldmVudF9jb3VudGVyIC09IFVTRl9FVkVOVFNfUE9SVElPTl9TSVpFOwotCQl9IGVsc2UgewotCQkJZXZlbnRzX251bSA9IGV2ZW50X2NvdW50ZXI7Ci0JCQlldmVudF9jb3VudGVyID0gMDsKLQkJfQotCQlyYyA9IGNvcHlfZnJvbV91c2VyKHVzZl9ldmVudHMsCi0JCQkJKHN0cnVjdCB1c2ZfZXZlbnRfdHlwZSBfX3VzZXIgKilldmVudCwKLQkJCQlldmVudHNfbnVtICogc2l6ZW9mKHN0cnVjdCB1c2ZfZXZlbnRfdHlwZSkpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IGNvcHkgdXBkX3J4X2luZm8gZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW5kID0gMDsgaW5kIDwgZXZlbnRzX251bTsgKytpbmQpIHsKLQkJCXN0cnVjdCB1c2ZfZXZlbnRfdHlwZSAqcF9ldmVudCA9ICZ1c2ZfZXZlbnRzW2luZF07Ci0JCQl1aW50MTZfdCBpZl9pbmQgPSBwX2V2ZW50LT5ldmVudF90eXBlX2luZDsKLQotCQkJaWYgKChpZl9pbmQgPj0gVVNGX01BWF9FVkVOVF9JTkQpIHx8Ci0JCQkgICAgKHVzZl9pbmZvLT5pbnB1dF9pZnNbaWZfaW5kXSA9PSBOVUxMKSkKLQkJCQljb250aW51ZTsgLyogZXZlbnQgaXNuJ3Qgc3VwcG9ydGVkICovCi0KLQkJCWlmIChzX3VzZl9pbnB1dF9kZXZzW2lmX2luZF0ubm90aWZ5X2V2ZW50KQotCQkJCSgqc191c2ZfaW5wdXRfZGV2c1tpZl9pbmRdLm5vdGlmeV9ldmVudCkoCi0JCQkJCQkJCXVzZl9pbmZvLAotCQkJCQkJCQlpZl9pbmQsCi0JCQkJCQkJCXBfZXZlbnQpOwotCQl9IC8qIGxvb3AgaW4gdGhlIHBvcnRpb24gKi8KLQl9IC8qIGFsbCBldmVudHMgbG9vcCAqLwotfQotCi1zdGF0aWMgaW50IHVzZl9zdGFydF90eChzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCkKLXsKLQlpbnQgcmMgPSBxNnVzbV9ydW4odXNmX3h4LT51c2MsIDAsIDAsIDApOwotCi0JcHJfZGVidWcoIiVzOiB0eDogcTZ1c21fcnVuOyByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlpZiAoIXJjKSB7Ci0JCWlmICh1c2ZfeHgtPmJ1ZmZlcl9jb3VudCA+PSBVU01fTUlOX0JVRl9DTlQpIHsKLQkJCS8qIHN1cHBseSBhbGwgYnVmZmVycyAqLwotCQkJcmMgPSBxNnVzbV9yZWFkKHVzZl94eC0+dXNjLAotCQkJCQl1c2ZfeHgtPmJ1ZmZlcl9jb3VudCk7Ci0JCQlwcl9kZWJ1ZygiJXM6IHE2dXNtX3JlYWRbJWRdXG4iLAotCQkJCSBfX2Z1bmNfXywgcmMpOwotCi0JCQlpZiAocmMpCi0JCQkJcHJfZXJyKCIlczogYnVmIHJlYWQgZmFpbGVkIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJZWxzZQotCQkJCXVzZl94eC0+dXNmX3N0YXRlID0KLQkJCQkJVVNGX1dPUktfU1RBVEU7Ci0JCX0gZWxzZQotCQkJdXNmX3h4LT51c2Zfc3RhdGUgPQotCQkJCVVTRl9XT1JLX1NUQVRFOwotCX0KLQotCXJldHVybiByYzsKLX0gLyogdXNmX3N0YXJ0X3R4ICovCi0KLXN0YXRpYyBpbnQgdXNmX3N0YXJ0X3J4KHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4KQotewotCWludCByYyA9IHE2dXNtX3J1bih1c2ZfeHgtPnVzYywgMCwgMCwgMCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJ4OiBxNnVzbV9ydW47IHJjPSVkXG4iLAotCQkgX19mdW5jX18sIHJjKTsKLQlpZiAoIXJjKQotCQl1c2ZfeHgtPnVzZl9zdGF0ZSA9IFVTRl9XT1JLX1NUQVRFOwotCi0JcmV0dXJuIHJjOwotfSAvKiB1c2Zfc3RhcnRfcnggKi8KLQotc3RhdGljIGludCBfX3VzZl9zZXRfdXNfZGV0ZWN0aW9uKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLAotCQkJCSAgc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUgKmRldGVjdF9pbmZvKQotewotCXVpbnQzMl90IHRpbWVvdXQgPSAwOwotCXN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8gKnBfYWxsb2NhdGVkX21lbW9yeSA9IE5VTEw7Ci0Jc3RydWN0IHVzbV9zZXNzaW9uX2NtZF9kZXRlY3RfaW5mbyB1c21fZGV0ZWN0X2luZm87Ci0Jc3RydWN0IHVzbV9zZXNzaW9uX2NtZF9kZXRlY3RfaW5mbyAqcF91c21fZGV0ZWN0X2luZm8gPQotCQkJCQkJJnVzbV9kZXRlY3RfaW5mbzsKLQl1aW50MzJfdCBkZXRlY3RfaW5mb19zaXplID0gc2l6ZW9mKHN0cnVjdCB1c21fc2Vzc2lvbl9jbWRfZGV0ZWN0X2luZm8pOwotCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gICZ1c2YtPnVzZl90eDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGRldGVjdF9pbmZvLT51c19kZXRlY3RvciAhPSBVU19ERVRFQ1RfRlcpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgZGV0ZWN0b3I6ICVkXG4iLAotCQkJX19mdW5jX18sIGRldGVjdF9pbmZvLT51c19kZXRlY3Rvcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgoZGV0ZWN0X2luZm8tPnBhcmFtc19kYXRhX3NpemUgIT0gMCkgJiYKLQkgICAgKGRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YSAhPSBOVUxMKSkgewotCQl1aW50OF90ICpwX2RhdGEgPSBOVUxMOwotCi0JCWRldGVjdF9pbmZvX3NpemUgKz0gZGV0ZWN0X2luZm8tPnBhcmFtc19kYXRhX3NpemU7Ci0JCSBwX2FsbG9jYXRlZF9tZW1vcnkgPSBremFsbG9jKGRldGVjdF9pbmZvX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAocF9hbGxvY2F0ZWRfbWVtb3J5ID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IGRldGVjdF9pbmZvWyVkXSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgZGV0ZWN0X2luZm9fc2l6ZSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlwX3VzbV9kZXRlY3RfaW5mbyA9IHBfYWxsb2NhdGVkX21lbW9yeTsKLQkJcF9kYXRhID0gKHVpbnQ4X3QgKilwX3VzbV9kZXRlY3RfaW5mbyArCi0JCQlzaXplb2Yoc3RydWN0IHVzbV9zZXNzaW9uX2NtZF9kZXRlY3RfaW5mbyk7Ci0KLQkJcmMgPSBjb3B5X2Zyb21fdXNlcihwX2RhdGEsCi0JCQkodWludDhfdCBfX3VzZXIgKikoZGV0ZWN0X2luZm8tPnBhcmFtc19kYXRhKSwKLQkJCWRldGVjdF9pbmZvLT5wYXJhbXNfZGF0YV9zaXplKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IHBhcmFtcyBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlrZnJlZShwX2FsbG9jYXRlZF9tZW1vcnkpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJcF91c21fZGV0ZWN0X2luZm8tPmFsZ29yaXRobV9jZmdfc2l6ZSA9Ci0JCQkJZGV0ZWN0X2luZm8tPnBhcmFtc19kYXRhX3NpemU7Ci0JfSBlbHNlCi0JCXVzbV9kZXRlY3RfaW5mby5hbGdvcml0aG1fY2ZnX3NpemUgPSAwOwotCi0JcF91c21fZGV0ZWN0X2luZm8tPmRldGVjdF9tb2RlID0gZGV0ZWN0X2luZm8tPnVzX2RldGVjdF9tb2RlOwotCXBfdXNtX2RldGVjdF9pbmZvLT5za2lwX2ludGVydmFsID0gZGV0ZWN0X2luZm8tPnNraXBfdGltZTsKLQotCXVzZl94eC0+dXNfZGV0ZWN0X3R5cGUgPSBVU0ZfVVNfREVURUNUX1VOREVGOwotCi0JcmMgPSBxNnVzbV9zZXRfdXNfZGV0ZWN0aW9uKHVzZl94eC0+dXNjLAotCQkJCSAgICBwX3VzbV9kZXRlY3RfaW5mbywKLQkJCQkgICAgZGV0ZWN0X2luZm9fc2l6ZSk7Ci0JaWYgKHJjIHx8IChkZXRlY3RfaW5mby0+ZGV0ZWN0X3RpbWVvdXQgPT0gVVNGX05PX1dBSVRfVElNRU9VVCkpIHsKLQkJa2ZyZWUocF9hbGxvY2F0ZWRfbWVtb3J5KTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIEdldCBVUyBkZXRlY3Rpb24gcmVzdWx0ICovCi0JaWYgKGRldGVjdF9pbmZvLT5kZXRlY3RfdGltZW91dCA9PSBVU0ZfSU5GSU5JVElWRV9USU1FT1VUKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVzZl94eC0+d2FpdCwKLQkJCQkJCSh1c2ZfeHgtPnVzX2RldGVjdF90eXBlICE9Ci0JCQkJCQlVU0ZfVVNfREVURUNUX1VOREVGKSB8fAotCQkJCQkJKHVzZl94eC0+dXNmX3N0YXRlID09Ci0JCQkJCQlVU0ZfQURTUF9SRVNUQVJUX1NUQVRFKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGRldGVjdF9pbmZvLT5kZXRlY3RfdGltZW91dCA9PSBVU0ZfREVGQVVMVF9USU1FT1VUKQotCQkJdGltZW91dCA9IFVTRl9USU1FT1VUX0pJRkZJRVM7Ci0JCWVsc2UKLQkJCXRpbWVvdXQgPSBkZXRlY3RfaW5mby0+ZGV0ZWN0X3RpbWVvdXQgKiBIWjsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh1c2ZfeHgtPndhaXQsCi0JCQkJCSh1c2ZfeHgtPnVzX2RldGVjdF90eXBlICE9Ci0JCQkJCVVTRl9VU19ERVRFQ1RfVU5ERUYpIHx8Ci0JCQkJCSh1c2ZfeHgtPnVzZl9zdGF0ZSA9PQotCQkJCQlVU0ZfQURTUF9SRVNUQVJUX1NUQVRFKSwgdGltZW91dCk7Ci0KLQkvKiBJbiB0aGUgY2FzZSBvZiBhRFNQIHJlc3RhcnQsICJubyBVUyIgaXMgYXNzdW1lZCAqLwotCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfQURTUF9SRVNUQVJUX1NUQVRFKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQkvKiBJbiB0aGUgY2FzZSBvZiB0aW1lb3V0LCAibm8gVVMiIGlzIGFzc3VtZWQgKi8KLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBHZXR0aW5nIFVTIGRldGVjdGlvbiBmYWlsZWQgcmNbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQllbHNlIHsKLQkJdXNmLT51c2ZfcngudXNfZGV0ZWN0X3R5cGUgPSB1c2YtPnVzZl90eC51c19kZXRlY3RfdHlwZTsKLQkJZGV0ZWN0X2luZm8tPmlzX3VzID0KLQkJCSh1c2ZfeHgtPnVzX2RldGVjdF90eXBlID09IFVTRl9VU19ERVRFQ1RfWUVTKTsKLQl9Ci0KLQlrZnJlZShwX2FsbG9jYXRlZF9tZW1vcnkpOwotCi0JcmV0dXJuIHJjOwotfSAvKiBfX3VzZl9zZXRfdXNfZGV0ZWN0aW9uICovCi0KLXN0YXRpYyBpbnQgdXNmX3NldF91c19kZXRlY3Rpb24oc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c19kZXRlY3RfaW5mb190eXBlIGRldGVjdF9pbmZvOwotCi0JaW50IHJjID0gY29weV9mcm9tX3VzZXIoJmRldGVjdF9pbmZvLAotCQkJCShzdHJ1Y3QgdXNfZGV0ZWN0X2luZm9fdHlwZSBfX3VzZXIgKikgYXJnLAotCQkJCXNpemVvZihkZXRlY3RfaW5mbykpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgZGV0ZWN0X2luZm8gZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmIChkZXRlY3RfaW5mby5wYXJhbXNfZGF0YV9zaXplID4gVVNGX01BWF9VU0VSX0JVRl9TSVpFKSB7Ci0JCXByX2VycigiJXM6IHVzZXIgYnVmZmVyIHNpemUgZXhjZWVkcyBtYXhpbXVtXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IF9fdXNmX3NldF91c19kZXRlY3Rpb24odXNmLCAmZGV0ZWN0X2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogc2V0IHVzIGRldGVjdGlvbiBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKLQkJCSAgJmRldGVjdF9pbmZvLAotCQkJICBzaXplb2YoZGV0ZWN0X2luZm8pKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSBkZXRlY3RfaW5mbyB0byB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9zZXRfdXNfZGV0ZWN0aW9uICovCi0KLXN0YXRpYyBpbnQgX191c2Zfc2V0X3R4X2luZm8oc3RydWN0IHVzZl90eXBlICp1c2YsCi0JCQkgICAgIHN0cnVjdCB1c190eF9pbmZvX3R5cGUgKmNvbmZpZ190eCkKLXsKLQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICAmdXNmLT51c2ZfdHg7Ci0JaW50IHJjID0gMDsKLQotCXVzZl94eC0+bmV3X3JlZ2lvbiA9IFVTTV9VTkRFRl9UT0tFTjsKLQl1c2ZfeHgtPnByZXZfcmVnaW9uID0gVVNNX1VOREVGX1RPS0VOOwotCXVzZl94eC0+Y2IgPSB1c2ZfdHhfY2I7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1c2ZfeHgtPndhaXQpOwotCi0JaWYgKGNvbmZpZ190eC0+dXNfeHhfaW5mby5jbGllbnRfbmFtZSAhPSBOVUxMKSB7Ci0JCWludCByZXMgPSBzdHJuY3B5X2Zyb21fdXNlcigKLQkJCXVzZl94eC0+Y2xpZW50X25hbWUsCi0JCQkoY2hhciBfX3VzZXIgKikoY29uZmlnX3R4LT51c194eF9pbmZvLmNsaWVudF9uYW1lKSwKLQkJCXNpemVvZih1c2ZfeHgtPmNsaWVudF9uYW1lKS0xKTsKLQkJaWYgKHJlcyA8IDApIHsKLQkJCXByX2VycigiJXM6IGdldCBjbGllbnQgbmFtZSBmYWlsZWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyYyA9IGNvbmZpZ194eCh1c2ZfeHgsICYoY29uZmlnX3R4LT51c194eF9pbmZvKSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHE2dXNtX29wZW5fcmVhZCh1c2ZfeHgtPnVzYywKLQkJCSAgICAgdXNmX3h4LT5lbmNkZWNfY2ZnLmZvcm1hdF9pZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHE2dXNtX3VzX2NsaWVudF9idWZfYWxsb2MoT1VULCB1c2ZfeHgtPnVzYywKLQkJCQkgICAgICAgdXNmX3h4LT5idWZmZXJfc2l6ZSwKLQkJCQkgICAgICAgdXNmX3h4LT5idWZmZXJfY291bnQpOwotCWlmIChyYykgewotCQkodm9pZClxNnVzbV9jbWQodXNmX3h4LT51c2MsIENNRF9DTE9TRSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IHE2dXNtX3VzX3BhcmFtX2J1Zl9hbGxvYyhPVVQsIHVzZl94eC0+dXNjLAotCQkJY29uZmlnX3R4LT51c194eF9pbmZvLm1heF9nZXRfc2V0X3BhcmFtX2J1Zl9zaXplKTsKLQlpZiAocmMpIHsKLQkJKHZvaWQpcTZ1c21fY21kKHVzZl94eC0+dXNjLCBDTURfQ0xPU0UpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBxNnVzbV9lbmNfY2ZnX2Jsayh1c2ZfeHgtPnVzYywKLQkJCSAgICAgICAmdXNmX3h4LT5lbmNkZWNfY2ZnKTsKLQlpZiAoIXJjICYmCi0JICAgICAoY29uZmlnX3R4LT5pbnB1dF9pbmZvLmV2ZW50X3R5cGVzICE9IFVTRl9OT19FVkVOVCkpIHsKLQkJcmMgPSByZWdpc3Rlcl9pbnB1dF9kZXZpY2UodXNmLAotCQkJCQkgICAmKGNvbmZpZ190eC0+aW5wdXRfaW5mbykpOwotCX0KLQotCWlmIChyYykKLQkJKHZvaWQpcTZ1c21fY21kKHVzZl94eC0+dXNjLCBDTURfQ0xPU0UpOwotCWVsc2UKLQkJdXNmX3h4LT51c2Zfc3RhdGUgPSBVU0ZfQ09ORklHVVJFRF9TVEFURTsKLQotCXJldHVybiByYzsKLX0gLyogX191c2Zfc2V0X3R4X2luZm8gKi8KLQotc3RhdGljIGludCB1c2Zfc2V0X3R4X2luZm8oc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c190eF9pbmZvX3R5cGUgY29uZmlnX3R4OwotCi0JaW50IHJjID0gY29weV9mcm9tX3VzZXIoJmNvbmZpZ190eCwKLQkJCSAgICAoc3RydWN0IHVzX3R4X2luZm9fdHlwZSBfX3VzZXIgKikgYXJnLAotCQkJICAgIHNpemVvZihjb25maWdfdHgpKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IGNvbmZpZ190eCBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGNvbmZpZ190eC51c194eF9pbmZvLnBhcmFtc19kYXRhX3NpemUgPiBVU0ZfTUFYX1VTRVJfQlVGX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogdXNlciBidWZmZXIgc2l6ZSBleGNlZWRzIG1heGltdW1cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiBfX3VzZl9zZXRfdHhfaW5mbyh1c2YsICZjb25maWdfdHgpOwotfSAvKiB1c2Zfc2V0X3R4X2luZm8gKi8KLQotc3RhdGljIGludCBfX3VzZl9zZXRfcnhfaW5mbyhzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwKLQkJCSAgICAgc3RydWN0IHVzX3J4X2luZm9fdHlwZSAqY29uZmlnX3J4KQotewotCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gICZ1c2YtPnVzZl9yeDsKLQlpbnQgcmMgPSAwOwotCi0JdXNmX3h4LT5uZXdfcmVnaW9uID0gVVNNX1VOREVGX1RPS0VOOwotCXVzZl94eC0+cHJldl9yZWdpb24gPSBVU01fVU5ERUZfVE9LRU47Ci0KLQl1c2ZfeHgtPmNiID0gdXNmX3J4X2NiOwotCi0JcmMgPSBjb25maWdfeHgodXNmX3h4LCAmKGNvbmZpZ19yeC0+dXNfeHhfaW5mbykpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmMgPSBxNnVzbV9vcGVuX3dyaXRlKHVzZl94eC0+dXNjLAotCQkJICAgICAgdXNmX3h4LT5lbmNkZWNfY2ZnLmZvcm1hdF9pZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IHE2dXNtX3VzX2NsaWVudF9idWZfYWxsb2MoCi0JCQkJSU4sCi0JCQkJdXNmX3h4LT51c2MsCi0JCQkJdXNmX3h4LT5idWZmZXJfc2l6ZSwKLQkJCQl1c2ZfeHgtPmJ1ZmZlcl9jb3VudCk7Ci0JaWYgKHJjKSB7Ci0JCSh2b2lkKXE2dXNtX2NtZCh1c2ZfeHgtPnVzYywgQ01EX0NMT1NFKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gcTZ1c21fdXNfcGFyYW1fYnVmX2FsbG9jKElOLCB1c2ZfeHgtPnVzYywKLQkJCWNvbmZpZ19yeC0+dXNfeHhfaW5mby5tYXhfZ2V0X3NldF9wYXJhbV9idWZfc2l6ZSk7Ci0JaWYgKHJjKSB7Ci0JCSh2b2lkKXE2dXNtX2NtZCh1c2ZfeHgtPnVzYywgQ01EX0NMT1NFKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gcTZ1c21fZGVjX2NmZ19ibGsodXNmX3h4LT51c2MsCi0JCQkgICAgICAgJnVzZl94eC0+ZW5jZGVjX2NmZyk7Ci0JaWYgKHJjKQotCQkodm9pZClxNnVzbV9jbWQodXNmX3h4LT51c2MsIENNRF9DTE9TRSk7Ci0JZWxzZSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnVzZl94eC0+d2FpdCk7Ci0JCXVzZl94eC0+dXNmX3N0YXRlID0gVVNGX0NPTkZJR1VSRURfU1RBVEU7Ci0JfQotCi0JcmV0dXJuIHJjOwotfSAvKiBfX3VzZl9zZXRfcnhfaW5mbyAqLwotCi1zdGF0aWMgaW50IHVzZl9zZXRfcnhfaW5mbyhzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHVzX3J4X2luZm9fdHlwZSBjb25maWdfcng7Ci0KLQlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmY29uZmlnX3J4LAotCQkJCShzdHJ1Y3QgdXNfcnhfaW5mb190eXBlIF9fdXNlciAqKSBhcmcsCi0JCQkJc2l6ZW9mKGNvbmZpZ19yeCkpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgY29uZmlnX3J4IGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoY29uZmlnX3J4LnVzX3h4X2luZm8ucGFyYW1zX2RhdGFfc2l6ZSA+IFVTRl9NQVhfVVNFUl9CVUZfU0laRSkgewotCQlwcl9lcnIoIiVzOiB1c2VyIGJ1ZmZlciBzaXplIGV4Y2VlZHMgbWF4aW11bVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIF9fdXNmX3NldF9yeF9pbmZvKHVzZiwgJmNvbmZpZ19yeCk7Ci19IC8qIHVzZl9zZXRfcnhfaW5mbyAqLwotCi1zdGF0aWMgaW50IF9fdXNmX2dldF90eF91cGRhdGUoc3RydWN0IHVzZl90eXBlICp1c2YsCi0JCQlzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZSAqdXBkX3R4X2luZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBwcmV2X2ppZmZpZXMgPSAwOwotCXVpbnQzMl90IHRpbWVvdXQgPSAwOwotCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gICZ1c2YtPnVzZl90eDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCF1c2ZfeHgtPnVzZXJfdXBkX2luZm9fbmEpIHsKLQkJdXNmX3NldF9ldmVudF9maWx0ZXJzKHVzZiwgdXBkX3R4X2luZm8tPmV2ZW50X2ZpbHRlcnMpOwotCQloYW5kbGVfaW5wdXRfZXZlbnQodXNmLAotCQkJCSAgIHVwZF90eF9pbmZvLT5ldmVudF9jb3VudGVyLAotCQkJCSAgIHVwZF90eF9pbmZvLT5ldmVudCk7Ci0KLQkJLyogUmVsZWFzZSBhdmFpbGFibGUgcmVnaW9ucyAqLwotCQlyYyA9IHE2dXNtX3JlYWQodXNmX3h4LT51c2MsCi0JCQkJdXBkX3R4X2luZm8tPmZyZWVfcmVnaW9uKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0gZWxzZQotCQl1c2ZfeHgtPnVzZXJfdXBkX2luZm9fbmEgPSAwOwotCi0JLyogR2V0IGRhdGEgcmVhZHkgcmVnaW9ucyAqLwotCWlmICh1cGRfdHhfaW5mby0+dGltZW91dCA9PSBVU0ZfSU5GSU5JVElWRV9USU1FT1VUKSB7Ci0JCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHVzZl94eC0+d2FpdCwKLQkJCSAgICh1c2ZfeHgtPnByZXZfcmVnaW9uICE9Ci0JCQkgICAgdXNmX3h4LT5uZXdfcmVnaW9uKSB8fAotCQkJICAgKHVzZl94eC0+dXNmX3N0YXRlICE9Ci0JCQkgICAgVVNGX1dPUktfU1RBVEUpKTsKLQl9IGVsc2UgewotCQlpZiAodXBkX3R4X2luZm8tPnRpbWVvdXQgPT0gVVNGX05PX1dBSVRfVElNRU9VVCkKLQkJCXJjID0gKHVzZl94eC0+cHJldl9yZWdpb24gIT0gdXNmX3h4LT5uZXdfcmVnaW9uKTsKLQkJZWxzZSB7Ci0JCQlwcmV2X2ppZmZpZXMgPSBqaWZmaWVzOwotCQkJaWYgKHVwZF90eF9pbmZvLT50aW1lb3V0ID09IFVTRl9ERUZBVUxUX1RJTUVPVVQpIHsKLQkJCQl0aW1lb3V0ID0gVVNGX1RJTUVPVVRfSklGRklFUzsKLQkJCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCgKLQkJCQkJCXVzZl94eC0+d2FpdCwKLQkJCQkJCSh1c2ZfeHgtPnByZXZfcmVnaW9uICE9Ci0JCQkJCQkgdXNmX3h4LT5uZXdfcmVnaW9uKSB8fAotCQkJCQkJKHVzZl94eC0+dXNmX3N0YXRlICE9Ci0JCQkJCQkgVVNGX1dPUktfU1RBVEUpLAotCQkJCQkJdGltZW91dCk7Ci0JCQl9IGVsc2UgewotCQkJCXRpbWVvdXQgPSB1cGRfdHhfaW5mby0+dGltZW91dCAqIEhaOwotCQkJCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQkJCQl1c2ZfeHgtPndhaXQsCi0JCQkJCQkodXNmX3h4LT5wcmV2X3JlZ2lvbiAhPQotCQkJCQkJIHVzZl94eC0+bmV3X3JlZ2lvbikgfHwKLQkJCQkJCSh1c2ZfeHgtPnVzZl9zdGF0ZSAhPQotCQkJCQkJIFVTRl9XT1JLX1NUQVRFKSwKLQkJCQkJCXRpbWVvdXQpOwotCQkJfQotCQl9Ci0JCWlmICghcmMpIHsKLQkJCXByX2RlYnVnKCIlczogdGltZW91dC4gcHJldl9qPSVsdTsgaj0lbHVcbiIsCi0JCQkJX19mdW5jX18sIHByZXZfamlmZmllcywgamlmZmllcyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IHRpbWVvdXQuIHByZXY9JWQ7IG5ldz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgdXNmX3h4LT5wcmV2X3JlZ2lvbiwKLQkJCQl1c2ZfeHgtPm5ld19yZWdpb24pOwotCQkJcHJfZGVidWcoIiVzOiB0aW1lb3V0LiBmcmVlX3JlZ2lvbj0lZDtcbiIsCi0JCQkJX19mdW5jX18sIHVwZF90eF9pbmZvLT5mcmVlX3JlZ2lvbik7Ci0JCQlpZiAodXNmX3h4LT5wcmV2X3JlZ2lvbiA9PQotCQkJICAgIHVzZl94eC0+bmV3X3JlZ2lvbikgewotCQkJCXByX2VycigiJXM6cmVhZCBkYXRhOiB0aW1lb3V0XG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIC1FVElNRTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICgodXNmX3h4LT51c2Zfc3RhdGUgIT0gVVNGX1dPUktfU1RBVEUpIHx8Ci0JICAgIChyYyA9PSAtRVJFU1RBUlRTWVMpKSB7Ci0JCXByX2VycigiJXM6IEdldCByZWFkeSByZWdpb24gZmFpbHVyZTsgc3RhdGVbJWRdOyByY1slZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdXNmX3h4LT51c2Zfc3RhdGUsIHJjKTsKLQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci0KLQl1cGRfdHhfaW5mby0+cmVhZHlfcmVnaW9uID0gdXNmX3h4LT5uZXdfcmVnaW9uOwotCXVzZl94eC0+cHJldl9yZWdpb24gPSB1cGRfdHhfaW5mby0+cmVhZHlfcmVnaW9uOwotCi0JaWYgKHVwZF90eF9pbmZvLT5yZWFkeV9yZWdpb24gPT0gVVNNX1dST05HX1RPS0VOKSB7Ci0JCXByX2VycigiJXM6IFRYIHBhdGggY29ycnVwdGVkOyBwcmV2PSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHVzZl94eC0+cHJldl9yZWdpb24pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIF9fdXNmX2dldF90eF91cGRhdGUgKi8KLQotc3RhdGljIGludCB1c2ZfZ2V0X3R4X3VwZGF0ZShzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUgdXBkX3R4X2luZm87Ci0KLQlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmdXBkX3R4X2luZm8sCi0JCQkJKHN0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlIF9fdXNlciAqKSBhcmcsCi0JCQkJc2l6ZW9mKHVwZF90eF9pbmZvKSk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgdXBkX3R4X2luZm8gZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJjID0gX191c2ZfZ2V0X3R4X3VwZGF0ZSh1c2YsICZ1cGRfdHhfaW5mbyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBnZXQgdHggdXBkYXRlIGZhaWxlZDsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAotCQkJICAmdXBkX3R4X2luZm8sCi0JCQkgIHNpemVvZih1cGRfdHhfaW5mbykpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF90eF9pbmZvIHRvIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUZBVUxUOwotCX0KLQotCXJldHVybiByYzsKLX0gLyogdXNmX2dldF90eF91cGRhdGUgKi8KLQotc3RhdGljIGludCBfX3VzZl9zZXRfcnhfdXBkYXRlKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LAotCQkJICAgICAgIHN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlICp1cGRfcnhfaW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JLyogU2VuZCBhdmFpbGFibGUgZGF0YSByZWdpb25zICovCi0JaWYgKHVwZF9yeF9pbmZvLT5yZWFkeV9yZWdpb24gIT0KLQkgICAgdXNmX3h4LT5idWZmZXJfY291bnQpIHsKLQkJcmMgPSBxNnVzbV93cml0ZSgKLQkJCXVzZl94eC0+dXNjLAotCQkJdXBkX3J4X2luZm8tPnJlYWR5X3JlZ2lvbik7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQl9Ci0KLQkvKiBHZXQgZnJlZSByZWdpb25zICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoCi0JCXVzZl94eC0+d2FpdCwKLQkJIXE2dXNtX2lzX3dyaXRlX2J1Zl9mdWxsKAotCQkJdXNmX3h4LT51c2MsCi0JCQkmKHVwZF9yeF9pbmZvLT5mcmVlX3JlZ2lvbikpIHx8Ci0JCSh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfSURMRV9TVEFURSksCi0JCVVTRl9USU1FT1VUX0pJRkZJRVMpOwotCi0JaWYgKCFyYykgewotCQlyYyA9IC1FVElNRTsKLQkJcHJfZXJyKCIlczp0aW1lb3V0LiB3YWl0IGZvciB3cml0ZSBidWYgbm90IGZ1bGxcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHVzZl94eC0+dXNmX3N0YXRlICE9Ci0JCSAgICBVU0ZfV09SS19TVEFURSkgewotCQkJcHJfZXJyKCIlczogUlg6IHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyYyA9IC1FSU5UUjsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0gLyogX191c2Zfc2V0X3J4X3VwZGF0ZSAqLwotCi1zdGF0aWMgaW50IHVzZl9zZXRfcnhfdXBkYXRlKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgdXNfcnhfdXBkYXRlX2luZm9fdHlwZSB1cGRfcnhfaW5mbzsKLQotCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZ1cGRfcnhfaW5mbywKLQkJCQkoc3RydWN0IHVzX3J4X3VwZGF0ZV9pbmZvX3R5cGUgX191c2VyICopIGFyZywKLQkJCQlzaXplb2YodXBkX3J4X2luZm8pKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF9yeF9pbmZvIGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IF9fdXNmX3NldF9yeF91cGRhdGUodXNmX3h4LCAmdXBkX3J4X2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogc2V0IHJ4IHVwZGF0ZSBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKLQkJCSZ1cGRfcnhfaW5mbywKLQkJCXNpemVvZih1cGRfcnhfaW5mbykpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHJ4X2luZm8gdG8gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIHJjOwotfSAvKiB1c2Zfc2V0X3J4X3VwZGF0ZSAqLwotCi1zdGF0aWMgdm9pZCB1c2ZfcmVsZWFzZV9pbnB1dChzdHJ1Y3QgdXNmX3R5cGUgKnVzZikKLXsKLQl1aW50MTZfdCBpbmQgPSAwOwotCi0JdXNmX3VucmVnaXN0ZXJfY29uZmxpY3RpbmdfZXZlbnRzKAotCQkJCQl1c2YtPmNvbmZsaWN0aW5nX2V2ZW50X3R5cGVzKTsKLQl1c2YtPmNvbmZsaWN0aW5nX2V2ZW50X3R5cGVzID0gMDsKLQlmb3IgKGluZCA9IDA7IGluZCA8IFVTRl9NQVhfRVZFTlRfSU5EOyArK2luZCkgewotCQlpZiAodXNmLT5pbnB1dF9pZnNbaW5kXSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHVzZi0+aW5wdXRfaWZzW2luZF0pOwotCQl1c2YtPmlucHV0X2lmc1tpbmRdID0gTlVMTDsKLQkJcHJfZGVidWcoIiVzIGlucHV0X3VucmVnaXN0ZXJfZGV2aWNlWyVzXVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSBzX3VzZl9pbnB1dF9kZXZzW2luZF0uaW5wdXRfZGV2X25hbWUpOwotCX0KLX0gLyogdXNmX3JlbGVhc2VfaW5wdXQgKi8KLQotc3RhdGljIGludCB1c2Zfc3RvcF90eChzdHJ1Y3QgdXNmX3R5cGUgKnVzZikKLXsKLQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICAmdXNmLT51c2ZfdHg7Ci0KLQl1c2ZfcmVsZWFzZV9pbnB1dCh1c2YpOwotCXVzZl9kaXNhYmxlKHVzZl94eCk7Ci0KLQlyZXR1cm4gMDsKLX0gLyogdXNmX3N0b3BfdHggKi8KLQotc3RhdGljIGludCBfX3VzZl9nZXRfdmVyc2lvbihzdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUgKnZlcnNpb25faW5mbykKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHZlcnNpb25faW5mby0+YnVmX3NpemUgPCBzaXplb2YoRFJWX1ZFUlNJT04pKSB7Ci0JCXByX2VycigiJXM6IGJ1Zl9zaXplICglZCkgPCB2ZXJzaW9uIHN0cmluZyBzaXplICglenUpXG4iLAotCQkJX19mdW5jX18sIHZlcnNpb25faW5mby0+YnVmX3NpemUsIHNpemVvZihEUlZfVkVSU0lPTikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodmVyc2lvbl9pbmZvLT5wYnVmKSwKLQkJCSAgRFJWX1ZFUlNJT04sCi0JCQkgIHNpemVvZihEUlZfVkVSU0lPTikpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHRvIHZlcnNpb25faW5mby5wYnVmOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIF9fdXNmX2dldF92ZXJzaW9uICovCi0KLXN0YXRpYyBpbnQgdXNmX2dldF92ZXJzaW9uKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZSB2ZXJzaW9uX2luZm87Ci0KLQlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmdmVyc2lvbl9pbmZvLAotCQkJCShzdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUgX191c2VyICopIGFyZywKLQkJCQlzaXplb2YodmVyc2lvbl9pbmZvKSk7Ci0KLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSB2ZXJzaW9uX2luZm8gZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJjID0gX191c2ZfZ2V0X3ZlcnNpb24oJnZlcnNpb25faW5mbyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBnZXQgdmVyc2lvbiBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKLQkJCSAgJnZlcnNpb25faW5mbywKLQkJCSAgc2l6ZW9mKHZlcnNpb25faW5mbykpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHZlcnNpb25faW5mbyB0byB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9nZXRfdmVyc2lvbiAqLwotCi1zdGF0aWMgaW50IF9fdXNmX3NldF9zdHJlYW1fcGFyYW0oc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlICpzZXRfc3RyZWFtX3BhcmFtLAotCQkJCWludCBkaXIpCi17Ci0Jc3RydWN0IHVzX2NsaWVudCAqdXNjID0gdXNmX3h4LT51c2M7Ci0Jc3RydWN0IHVzX3BvcnRfZGF0YSAqcG9ydDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHVzYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHVzYyBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlwb3J0ID0gJnVzYy0+cG9ydFtkaXJdOwotCWlmIChwb3J0ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogcG9ydCBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAocG9ydC0+cGFyYW1fYnVmID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogcGFyYW1ldGVyIGJ1ZmZlciBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoc2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUgPiBwb3J0LT5wYXJhbV9idWZfc2l6ZSkgewotCQlwcl9lcnIoIiVzOiBidWZfc2l6ZSAoJWQpID4gbWF4aW11bSBidWYgc2l6ZSAoJWQpXG4iLAotCQkJX19mdW5jX18sIHNldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplLAotCQkJcG9ydC0+cGFyYW1fYnVmX3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBidWZfc2l6ZSBpcyAwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gY29weV9mcm9tX3VzZXIocG9ydC0+cGFyYW1fYnVmLAotCQkJKHVpbnQ4X3QgX191c2VyICopIHNldF9zdHJlYW1fcGFyYW0tPnBidWYsCi0JCQlzZXRfc3RyZWFtX3BhcmFtLT5idWZfc2l6ZSk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgcGFyYW0gYnVmIGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IHE2dXNtX3NldF91c19zdHJlYW1fcGFyYW0oZGlyLCB1c2MsIHNldF9zdHJlYW1fcGFyYW0tPm1vZHVsZV9pZCwKLQkJCQkJc2V0X3N0cmVhbV9wYXJhbS0+cGFyYW1faWQsCi0JCQkJCXNldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogcTZ1c21fc2V0X3VzX3N0cmVhbV9wYXJhbSBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHVzZl9zZXRfc3RyZWFtX3BhcmFtKHN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4LAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnLCBpbnQgZGlyKQotewotCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBzZXRfc3RyZWFtX3BhcmFtOwotCWludCByYyA9IDA7Ci0KLQlyYyA9IGNvcHlfZnJvbV91c2VyKCZzZXRfc3RyZWFtX3BhcmFtLAotCQkJKHN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSBfX3VzZXIgKikgYXJnLAotCQkJc2l6ZW9mKHNldF9zdHJlYW1fcGFyYW0pKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHNldF9zdHJlYW1fcGFyYW0gZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXJldHVybiBfX3VzZl9zZXRfc3RyZWFtX3BhcmFtKHVzZl94eCwgJnNldF9zdHJlYW1fcGFyYW0sIGRpcik7Ci19IC8qIHVzZl9zZXRfc3RyZWFtX3BhcmFtICovCi0KLXN0YXRpYyBpbnQgX191c2ZfZ2V0X3N0cmVhbV9wYXJhbShzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwKLQkJCQlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUgKmdldF9zdHJlYW1fcGFyYW0sCi0JCQkJaW50IGRpcikKLXsKLQlzdHJ1Y3QgdXNfY2xpZW50ICp1c2MgPSB1c2ZfeHgtPnVzYzsKLQlzdHJ1Y3QgdXNfcG9ydF9kYXRhICpwb3J0OwotCWludCByYyA9IDA7Ci0KLQlpZiAodXNjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdXNfY2xpZW50IGlzIG51bGxcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXBvcnQgPSAmdXNjLT5wb3J0W2Rpcl07Ci0KLQlpZiAocG9ydC0+cGFyYW1fYnVmID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogcGFyYW1ldGVyIGJ1ZmZlciBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoZ2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUgPiBwb3J0LT5wYXJhbV9idWZfc2l6ZSkgewotCQlwcl9lcnIoIiVzOiBidWZfc2l6ZSAoJWQpID4gbWF4aW11bSBidWYgc2l6ZSAoJWQpXG4iLAotCQkJX19mdW5jX18sIGdldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplLAotCQkJcG9ydC0+cGFyYW1fYnVmX3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZ2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBidWZfc2l6ZSBpcyAwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gcTZ1c21fZ2V0X3VzX3N0cmVhbV9wYXJhbShkaXIsIHVzYywgZ2V0X3N0cmVhbV9wYXJhbS0+bW9kdWxlX2lkLAotCQkJCQlnZXRfc3RyZWFtX3BhcmFtLT5wYXJhbV9pZCwKLQkJCQkJZ2V0X3N0cmVhbV9wYXJhbS0+YnVmX3NpemUpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBxNnVzbV9nZXRfdXNfc3RyZWFtX3BhcmFtIGZhaWxlZDsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IGNvcHlfdG9fdXNlcigodWludDhfdCBfX3VzZXIgKikgZ2V0X3N0cmVhbV9wYXJhbS0+cGJ1ZiwKLQkJCXBvcnQtPnBhcmFtX2J1ZiwKLQkJCWdldF9zdHJlYW1fcGFyYW0tPmJ1Zl9zaXplKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSBwYXJhbSBidWYgdG8gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdXNmX2dldF9zdHJlYW1fcGFyYW0oc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHgsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcsIGludCBkaXIpCi17Ci0Jc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlIGdldF9zdHJlYW1fcGFyYW07Ci0JaW50IHJjID0gMDsKLQotCXJjID0gY29weV9mcm9tX3VzZXIoJmdldF9zdHJlYW1fcGFyYW0sCi0JCQkoc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlIF9fdXNlciAqKSBhcmcsCi0JCQlzaXplb2YoZ2V0X3N0cmVhbV9wYXJhbSkpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgZ2V0X3N0cmVhbV9wYXJhbSBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIF9fdXNmX2dldF9zdHJlYW1fcGFyYW0odXNmX3h4LCAmZ2V0X3N0cmVhbV9wYXJhbSwgZGlyKTsKLX0gLyogdXNmX2dldF9zdHJlYW1fcGFyYW0gKi8KLQotc3RhdGljIGxvbmcgX191c2ZfaW9jdGwoc3RydWN0IHVzZl90eXBlICp1c2YsCi0JCXVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCi0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVVNfU1RBUlRfVFg6IHsKLQkJdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX0NPTkZJR1VSRURfU1RBVEUpCi0JCQlyYyA9IHVzZl9zdGFydF90eCh1c2ZfeHgpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHN0YXJ0X3R4OiB3cm9uZyBzdGF0ZVslZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sCi0JCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOwotCQkJcmV0dXJuIC1FQkFERkQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBVU19TVEFSVF9SWDogewotCQl1c2ZfeHggPSAmdXNmLT51c2Zfcng7Ci0JCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfQ09ORklHVVJFRF9TVEFURSkKLQkJCXJjID0gdXNmX3N0YXJ0X3J4KHVzZl94eCk7Ci0JCWVsc2UgewotCQkJcHJfZXJyKCIlczogc3RhcnRfcng6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQl1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyZXR1cm4gLUVCQURGRDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFVTX1NFVF9UWF9JTkZPOiB7Ci0JCXVzZl94eCA9ICZ1c2YtPnVzZl90eDsKLQkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9PUEVORURfU1RBVEUpCi0JCQlyYyA9IHVzZl9zZXRfdHhfaW5mbyh1c2YsIGFyZyk7Ci0JCWVsc2UgewotCQkJcHJfZXJyKCIlczogc2V0X3R4X2luZm86IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyZXR1cm4gLUVCQURGRDsKLQkJfQotCi0JCWJyZWFrOwotCX0gLyogVVNfU0VUX1RYX0lORk8gKi8KLQotCWNhc2UgVVNfU0VUX1JYX0lORk86IHsKLQkJdXNmX3h4ID0gJnVzZi0+dXNmX3J4OwotCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX09QRU5FRF9TVEFURSkKLQkJCXJjID0gdXNmX3NldF9yeF9pbmZvKHVzZiwgYXJnKTsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXRfcnhfaW5mbzogd3Jvbmcgc3RhdGVbJWRdXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCXVzZl94eC0+dXNmX3N0YXRlKTsKLQkJCXJldHVybiAtRUJBREZEOwotCQl9Ci0KLQkJYnJlYWs7Ci0JfSAvKiBVU19TRVRfUlhfSU5GTyAqLwotCi0JY2FzZSBVU19HRVRfVFhfVVBEQVRFOiB7Ci0JCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCi0JCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfV09SS19TVEFURSkKLQkJCXJjID0gdXNmX2dldF90eF91cGRhdGUodXNmLCBhcmcpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IGdldF90eF91cGRhdGU6IHdyb25nIHN0YXRlWyVkXVxuIiwgX19mdW5jX18sCi0JCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOwotCQkJcmMgPSAtRUJBREZEOwotCQl9Ci0JCWJyZWFrOwotCX0gLyogVVNfR0VUX1RYX1VQREFURSAqLwotCi0JY2FzZSBVU19TRVRfUlhfVVBEQVRFOiB7Ci0JCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gJnVzZi0+dXNmX3J4OwotCi0JCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfV09SS19TVEFURSkKLQkJCXJjID0gdXNmX3NldF9yeF91cGRhdGUodXNmX3h4LCBhcmcpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHNldF9yeF91cGRhdGU6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyYyA9IC1FQkFERkQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfSAvKiBVU19TRVRfUlhfVVBEQVRFICovCi0KLQljYXNlIFVTX1NUT1BfVFg6IHsKLQkJdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCQlpZiAoKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9XT1JLX1NUQVRFKQotCQkJfHwgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9BRFNQX1JFU1RBUlRfU1RBVEUpKQotCQkJcmMgPSB1c2Zfc3RvcF90eCh1c2YpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHN0b3BfdHg6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyZXR1cm4gLUVCQURGRDsKLQkJfQotCQlicmVhazsKLQl9IC8qIFVTX1NUT1BfVFggKi8KLQotCWNhc2UgVVNfU1RPUF9SWDogewotCQl1c2ZfeHggPSAmdXNmLT51c2Zfcng7Ci0JCWlmICgodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCi0JCQl8fCAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX0FEU1BfUkVTVEFSVF9TVEFURSkpCi0JCQl1c2ZfZGlzYWJsZSh1c2ZfeHgpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHN0b3Bfcng6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyZXR1cm4gLUVCQURGRDsKLQkJfQotCQlicmVhazsKLQl9IC8qIFVTX1NUT1BfUlggKi8KLQotCWNhc2UgVVNfU0VUX0RFVEVDVElPTjogewotCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl90eDsKLQotCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCi0JCQlyYyA9IHVzZl9zZXRfdXNfZGV0ZWN0aW9uKHVzZiwgYXJnKTsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXQgdXMgZGV0ZWN0aW9uOiB3cm9uZyBzdGF0ZVslZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sCi0JCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOwotCQkJcmMgPSAtRUJBREZEOwotCQl9Ci0JCWJyZWFrOwotCX0gLyogVVNfU0VUX0RFVEVDVElPTiAqLwotCi0JY2FzZSBVU19HRVRfVkVSU0lPTjogewotCQlyYyA9IHVzZl9nZXRfdmVyc2lvbihhcmcpOwotCQlicmVhazsKLQl9IC8qIFVTX0dFVF9WRVJTSU9OICovCi0KLQljYXNlIFVTX1NFVF9UWF9TVFJFQU1fUEFSQU06IHsKLQkJcmMgPSB1c2Zfc2V0X3N0cmVhbV9wYXJhbSgmdXNmLT51c2ZfdHgsIGFyZywgT1VUKTsKLQkJYnJlYWs7Ci0JfSAvKiBVU19TRVRfVFhfU1RSRUFNX1BBUkFNICovCi0KLQljYXNlIFVTX0dFVF9UWF9TVFJFQU1fUEFSQU06IHsKLQkJcmMgPSB1c2ZfZ2V0X3N0cmVhbV9wYXJhbSgmdXNmLT51c2ZfdHgsIGFyZywgT1VUKTsKLQkJYnJlYWs7Ci0JfSAvKiBVU19HRVRfVFhfU1RSRUFNX1BBUkFNICovCi0KLQljYXNlIFVTX1NFVF9SWF9TVFJFQU1fUEFSQU06IHsKLQkJcmMgPSB1c2Zfc2V0X3N0cmVhbV9wYXJhbSgmdXNmLT51c2ZfcngsIGFyZywgSU4pOwotCQlicmVhazsKLQl9IC8qIFVTX1NFVF9SWF9TVFJFQU1fUEFSQU0gKi8KLQotCWNhc2UgVVNfR0VUX1JYX1NUUkVBTV9QQVJBTTogewotCQlyYyA9IHVzZl9nZXRfc3RyZWFtX3BhcmFtKCZ1c2YtPnVzZl9yeCwgYXJnLCBJTik7Ci0JCWJyZWFrOwotCX0gLyogVVNfR0VUX1JYX1NUUkVBTV9QQVJBTSAqLwotCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgSU9DVEwgY29tbWFuZCBbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICBjbWQpOwotCQlyYyA9IC1FTk9UVFk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChyYyAmJgotCSAgICAoKGNtZCA9PSBVU19TRVRfVFhfSU5GTykgfHwKLQkgICAgIChjbWQgPT0gVVNfU0VUX1JYX0lORk8pKSkKLQkJcmVsZWFzZV94eCh1c2ZfeHgpOwotCi0JcmV0dXJuIHJjOwotfSAvKiBfX3VzZl9pb2N0bCAqLwotCi1zdGF0aWMgbG9uZyB1c2ZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c2ZfdHlwZSAqdXNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQltdXRleF9sb2NrKCZ1c2YtPm11dGV4KTsKLQlyYyA9IF9fdXNmX2lvY3RsKHVzZiwgY21kLCBhcmcpOwotCW11dGV4X3VubG9jaygmdXNmLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9pb2N0bCAqLwotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCi0jZGVmaW5lIFVTX1NFVF9UWF9JTkZPMzIgICBfSU9XKFVTRl9JT0NUTF9NQUdJQywgMCwgXAotCQkJCXN0cnVjdCB1c190eF9pbmZvX3R5cGUzMikKLSNkZWZpbmUgVVNfR0VUX1RYX1VQREFURTMyIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgMiwgXAotCQkJCXN0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlMzIpCi0jZGVmaW5lIFVTX1NFVF9SWF9JTkZPMzIgICBfSU9XKFVTRl9JT0NUTF9NQUdJQywgMywgXAotCQkJCXN0cnVjdCB1c19yeF9pbmZvX3R5cGUzMikKLSNkZWZpbmUgVVNfU0VUX1JYX1VQREFURTMyIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgNCwgXAotCQkJCXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlMzIpCi0jZGVmaW5lIFVTX1NFVF9ERVRFQ1RJT04zMiBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDgsIFwKLQkJCQlzdHJ1Y3QgdXNfZGV0ZWN0X2luZm9fdHlwZTMyKQotI2RlZmluZSBVU19HRVRfVkVSU0lPTjMyICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDksIFwKLQkJCQlzdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUzMikKLSNkZWZpbmUgVVNfU0VUX1RYX1NUUkVBTV9QQVJBTTMyICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEwLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIpCi0jZGVmaW5lIFVTX0dFVF9UWF9TVFJFQU1fUEFSQU0zMiAgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCAxMSwgXAotCQkJCXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZTMyKQotI2RlZmluZSBVU19TRVRfUlhfU1RSRUFNX1BBUkFNMzIgICBfSU9XKFVTRl9JT0NUTF9NQUdJQywgMTIsIFwKLQkJCQlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMikKLSNkZWZpbmUgVVNfR0VUX1JYX1NUUkVBTV9QQVJBTTMyICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDEzLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIpCi0KLS8qIEluZm8gc3RydWN0dXJlIGNvbW1vbiBmb3IgVFggYW5kIFJYICovCi1zdHJ1Y3QgdXNfeHhfaW5mb190eXBlMzIgewotLyogSW5wdXQ6ICBnZW5lcmFsIGluZm8gKi8KLS8qIE5hbWUgb2YgdGhlIGNsaWVudCAtIGV2ZW50IGNhbGN1bGF0b3IsIHB0ciB0byBjaGFyICovCi0JY29uc3QgY29tcGF0X3VwdHJfdCBjbGllbnRfbmFtZTsKLS8qIFNlbGVjdGVkIGRldmljZSBpZGVudGlmaWNhdGlvbiwgYWNjZXB0ZWQgaW4gdGhlIGtlcm5lbCdzIENBRCAqLwotCXVpbnQzMl90IGRldl9pZDsKLS8qIDAgLSBwb2ludF9lcG9zIHR5cGU7IChlLmcuIDEgLSBncl9tbXJkKSAqLwotCXVpbnQzMl90IHN0cmVhbV9mb3JtYXQ7Ci0vKiBSZXF1aXJlZCBzYW1wbGUgcmF0ZSBpbiBIeiAqLwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotLyogU2l6ZSBvZiBhIGJ1ZmZlciAoYnl0ZXMpIGZvciBVUyBkYXRhIHRyYW5zZmVyIGJldHdlZW4gdGhlIG1vZHVsZSBhbmQgVVNGICovCi0JdWludDMyX3QgYnVmX3NpemU7Ci0vKiBOdW1iZXIgb2YgdGhlIGJ1ZmZlcnMgZm9yIHRoZSBVUyBkYXRhIHRyYW5zZmVyICovCi0JdWludDE2X3QgYnVmX251bTsKLS8qIE51bWJlciBvZiB0aGUgbWljcm9waG9uZXMgKFRYKSBvciBzcGVha2VycyhSWCkgKi8KLQl1aW50MTZfdCBwb3J0X2NudDsKLS8qIE1pY3JvcGhvbmVzKFRYKSBvciBzcGVha2VycyhSWCkgaW5kZXhlcyBpbiB0aGVpciBlbnVtZXJhdGlvbiAqLwotCXVpbnQ4X3QgIHBvcnRfaWRbVVNGX01BWF9QT1JUX05VTV07Ci0vKiBCaXRzIHBlciBzYW1wbGUgMTYgb3IgMzIgKi8KLQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7Ci0vKiBJbnB1dDogIFRyYW5zcGFyZW50IGluZm8gZm9yIGVuY29kZXIgaW4gdGhlIExQQVNTICovCi0vKiBQYXJhbWV0ZXJzIGRhdGEgc2l6ZSBpbiBieXRlcyAqLwotCXVpbnQxNl90IHBhcmFtc19kYXRhX3NpemU7Ci0vKiBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzLCBwdHIgdG8gdWludDhfdCAqLwotCWNvbXBhdF91cHRyX3QgcGFyYW1zX2RhdGE7Ci0vKiBNYXggc2l6ZSBvZiBidWZmZXIgZm9yIGdldCBhbmQgc2V0IHBhcmFtZXRlciAqLwotCXVpbnQzMl90IG1heF9nZXRfc2V0X3BhcmFtX2J1Zl9zaXplOwotfTsKLQotc3RydWN0IHVzX3R4X2luZm9fdHlwZTMyIHsKLS8qIENvbW1vbiBpbmZvLiBUaGlzIHN0cnVjdCBpbmNsdWRlcyBwdHIgYW5kIHRoZXJlZm9yZSB0aGUgMzIgdmVyc2lvbiAqLwotCXN0cnVjdCB1c194eF9pbmZvX3R5cGUzMiB1c194eF9pbmZvOwotLyogSW5mbyBzcGVjaWZpYyBmb3IgVFguIFRoaXMgc3RydWN0IGRvZXNuJ3QgaW5jbHVkZSBsb25nIG9yIHB0cgotICogYW5kIHRoZXJlZm9yZSBubyAzMiB2ZXJzaW9uCi0gKi8KLQlzdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlIGlucHV0X2luZm87Ci19OwotCi1zdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZTMyIHsKLS8qIElucHV0ICBnZW5lcmFsOiAqLwotLyogTnVtYmVyIG9mIGNhbGN1bGF0ZWQgZXZlbnRzICovCi0JdWludDE2X3QgZXZlbnRfY291bnRlcjsKLS8qIENhbGN1bGF0ZWQgZXZlbnRzIG9yIE5VTEwsIHB0ciB0byBzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgKi8KLQljb21wYXRfdXB0cl90IGV2ZW50OwotLyogUG9pbnRlciAocmVhZCBpbmRleCkgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgcmVnaW9uICovCi0vKiBpbiB0aGUgc2hhcmVkIFVTIGRhdGEgbWVtb3J5ICovCi0JdWludDMyX3QgZnJlZV9yZWdpb247Ci0vKiBUaW1lIChzZWMpIHRvIHdhaXQgZm9yIGRhdGEgb3Igc3BlY2lhbCB2YWx1ZXM6ICovCi0vKiBVU0ZfTk9fV0FJVF9USU1FT1VULCBVU0ZfSU5GSU5JVElWRV9USU1FT1VULCBVU0ZfREVGQVVMVF9USU1FT1VUICovCi0JdWludDMyX3QgdGltZW91dDsKLS8qIEV2ZW50cyAoZnJvbSBjb25mbGljdGluZyBkZXZzKSB0byBiZSBkaXNhYmxlZC9lbmFibGVkICovCi0JdWludDE2X3QgZXZlbnRfZmlsdGVyczsKLQotLyogSW5wdXQgIHRyYW5zcGFyZW50IGRhdGE6ICovCi0vKiBQYXJhbWV0ZXJzIHNpemUgKi8KLQl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOwotLyogUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycywgcHRyIHRvIHVpbnQ4X3QgKi8KLQljb21wYXRfdXB0cl90IHBhcmFtc19kYXRhOwotLyogT3V0cHV0IHBhcmFtZXRlcnM6ICovCi0vKiBQb2ludGVyICh3cml0ZSBpbmRleCkgdG8gdGhlIGVuZCBvZiByZWFkeSBVUyBkYXRhIHJlZ2lvbiAqLwotLyogaW4gdGhlIHNoYXJlZCBtZW1vcnkgKi8KLQl1aW50MzJfdCByZWFkeV9yZWdpb247Ci19OwotCi1zdHJ1Y3QgdXNfcnhfaW5mb190eXBlMzIgewotCS8qIENvbW1vbiBpbmZvICovCi0Jc3RydWN0IHVzX3h4X2luZm9fdHlwZTMyIHVzX3h4X2luZm87Ci0JLyogSW5mbyBzcGVjaWZpYyBmb3IgUlgqLwotfTsKLQotc3RydWN0IHVzX3J4X3VwZGF0ZV9pbmZvX3R5cGUzMiB7Ci0vKiBJbnB1dCAgZ2VuZXJhbDogKi8KLS8qIFBvaW50ZXIgKHdyaXRlIGluZGV4KSB0byB0aGUgZW5kIG9mIHJlYWR5IFVTIGRhdGEgcmVnaW9uICovCi0vKiBpbiB0aGUgc2hhcmVkIG1lbW9yeSAqLwotCXVpbnQzMl90IHJlYWR5X3JlZ2lvbjsKLS8qIElucHV0ICB0cmFuc3BhcmVudCBkYXRhOiAqLwotLyogUGFyYW1ldGVycyBzaXplICovCi0JdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKLS8qIHBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzLCBwdHIgdG8gdWludDhfdCAqLwotCWNvbXBhdF91cHRyX3QgcGFyYW1zX2RhdGE7Ci0vKiBPdXRwdXQgcGFyYW1ldGVyczogKi8KLS8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLwotLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLwotCXVpbnQzMl90IGZyZWVfcmVnaW9uOwotfTsKLQotc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUzMiB7Ci0vKiBVUyBkZXRlY3Rpb24gcGxhY2UgKEhXfEZXKSAqLwotLyogTkEgaW4gdGhlIEFjdGl2ZSBhbmQgT0ZGIHN0YXRlcyAqLwotCWVudW0gdXNfZGV0ZWN0X3BsYWNlX2VudW0gdXNfZGV0ZWN0b3I7Ci0vKiBVUyBkZXRlY3Rpb24gbW9kZSAqLwotCWVudW0gdXNfZGV0ZWN0X21vZGVfZW51bSAgdXNfZGV0ZWN0X21vZGU7Ci0vKiBVUyBkYXRhIGRyb3BwZWQgZHVyaW5nIHRoaXMgdGltZSAobXNlYykgKi8KLQl1aW50MzJfdCBza2lwX3RpbWU7Ci0vKiBUcmFuc3BhcmVudCBkYXRhIHNpemUgKi8KLQl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOwotLyogUG9pbnRlciB0byB0aGUgdHJhbnNwYXJlbnQgZGF0YSwgcHRyIHRvIHVpbnQ4X3QgKi8KLQljb21wYXRfdXB0cl90IHBhcmFtc19kYXRhOwotLyogVGltZSAoc2VjKSB0byB3YWl0IGZvciBVUyBwcmVzZW5jZSBldmVudCAqLwotCXVpbnQzMl90IGRldGVjdF90aW1lb3V0OwotLyogT3V0IHBhcmFtZXRlcjogVVMgcHJlc2VuY2UgKi8KLQlib29sIGlzX3VzOwotfTsKLQotc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlMzIgewotLyogU2l6ZSBvZiBtZW1vcnkgZm9yIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCXVpbnQxNl90IGJ1Zl9zaXplOwotLyogUG9pbnRlciB0byB0aGUgbWVtb3J5IGZvciB0aGUgdmVyc2lvbiBzdHJpbmcsIHB0ciB0byBjaGFyICovCi0JY29tcGF0X3VwdHJfdCBwYnVmOwotfTsKLQotc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlMzIgewotLyogSWQgb2YgbW9kdWxlICovCi0JdWludDMyX3QgbW9kdWxlX2lkOwotLyogSWQgb2YgcGFyYW1ldGVyICovCi0JdWludDMyX3QgcGFyYW1faWQ7Ci0vKiBTaXplIG9mIG1lbW9yeSBvZiB0aGUgcGFyYW1ldGVyIGJ1ZmZlciAqLwotCXVpbnQzMl90IGJ1Zl9zaXplOwotLyogUG9pbnRlciB0byB0aGUgbWVtb3J5IG9mIHRoZSBwYXJhbWV0ZXIgYnVmZmVyICovCi0JY29tcGF0X3VwdHJfdCBwYnVmOwotfTsKLQotc3RhdGljIHZvaWQgdXNmX2NvbXBhdF94eF9pbmZvX3R5cGUoc3RydWN0IHVzX3h4X2luZm9fdHlwZTMyICp1c194eF9pbmZvMzIsCi0JCQkJICAgc3RydWN0IHVzX3h4X2luZm9fdHlwZSAqdXNfeHhfaW5mbykKLXsKLQlpbnQgaSA9IDA7Ci0KLQl1c194eF9pbmZvLT5jbGllbnRfbmFtZSA9IGNvbXBhdF9wdHIodXNfeHhfaW5mbzMyLT5jbGllbnRfbmFtZSk7Ci0JdXNfeHhfaW5mby0+ZGV2X2lkID0gdXNfeHhfaW5mbzMyLT5kZXZfaWQ7Ci0JdXNfeHhfaW5mby0+c3RyZWFtX2Zvcm1hdCA9IHVzX3h4X2luZm8zMi0+c3RyZWFtX2Zvcm1hdDsKLQl1c194eF9pbmZvLT5zYW1wbGVfcmF0ZSA9IHVzX3h4X2luZm8zMi0+c2FtcGxlX3JhdGU7Ci0JdXNfeHhfaW5mby0+YnVmX3NpemUgPSB1c194eF9pbmZvMzItPmJ1Zl9zaXplOwotCXVzX3h4X2luZm8tPmJ1Zl9udW0gPSB1c194eF9pbmZvMzItPmJ1Zl9udW07Ci0JdXNfeHhfaW5mby0+cG9ydF9jbnQgPSB1c194eF9pbmZvMzItPnBvcnRfY250OwotCWZvciAoaSA9IDA7IGkgPCBVU0ZfTUFYX1BPUlRfTlVNOyBpKyspCi0JCXVzX3h4X2luZm8tPnBvcnRfaWRbaV0gPSB1c194eF9pbmZvMzItPnBvcnRfaWRbaV07Ci0JdXNfeHhfaW5mby0+Yml0c19wZXJfc2FtcGxlID0gdXNfeHhfaW5mbzMyLT5iaXRzX3Blcl9zYW1wbGU7Ci0JdXNfeHhfaW5mby0+cGFyYW1zX2RhdGFfc2l6ZSA9IHVzX3h4X2luZm8zMi0+cGFyYW1zX2RhdGFfc2l6ZTsKLQl1c194eF9pbmZvLT5wYXJhbXNfZGF0YSA9IGNvbXBhdF9wdHIodXNfeHhfaW5mbzMyLT5wYXJhbXNfZGF0YSk7Ci0JdXNfeHhfaW5mby0+bWF4X2dldF9zZXRfcGFyYW1fYnVmX3NpemUgPQotCQkJICAgIHVzX3h4X2luZm8zMi0+bWF4X2dldF9zZXRfcGFyYW1fYnVmX3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQgdXNmX3NldF90eF9pbmZvMzIoc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c190eF9pbmZvX3R5cGUzMiBjb25maWdfdHgzMjsKLQlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlIGNvbmZpZ190eDsKLQotCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZjb25maWdfdHgzMiwKLQkJCSAgICAoc3RydWN0IHVzX3R4X2luZm9fdHlwZTMyIF9fdXNlciAqKSBhcmcsCi0JCQkgICAgc2l6ZW9mKGNvbmZpZ190eDMyKSk7Ci0KLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSBjb25maWdfdHggZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQltZW1zZXQoJmNvbmZpZ190eCwgMCwgc2l6ZW9mKGNvbmZpZ190eCkpOwotCXVzZl9jb21wYXRfeHhfaW5mb190eXBlKCYoY29uZmlnX3R4MzIudXNfeHhfaW5mbyksCi0JCQkJJihjb25maWdfdHgudXNfeHhfaW5mbykpOwotCWNvbmZpZ190eC5pbnB1dF9pbmZvID0gY29uZmlnX3R4MzIuaW5wdXRfaW5mbzsKLQotCXJldHVybiBfX3VzZl9zZXRfdHhfaW5mbyh1c2YsICZjb25maWdfdHgpOwotfSAvKiB1c2Zfc2V0X3R4X2luZm8gMzIqLwotCi1zdGF0aWMgaW50IHVzZl9zZXRfcnhfaW5mbzMyKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgdXNfcnhfaW5mb190eXBlMzIgY29uZmlnX3J4MzI7Ci0Jc3RydWN0IHVzX3J4X2luZm9fdHlwZSBjb25maWdfcng7Ci0KLQlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmY29uZmlnX3J4MzIsCi0JCQkJKHN0cnVjdCB1c19yeF9pbmZvX3R5cGUzMiBfX3VzZXIgKikgYXJnLAotCQkJCXNpemVvZihjb25maWdfcngzMikpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgY29uZmlnX3J4IGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JbWVtc2V0KCZjb25maWdfcngsIDAsIHNpemVvZihjb25maWdfcngpKTsKLQl1c2ZfY29tcGF0X3h4X2luZm9fdHlwZSgmKGNvbmZpZ19yeDMyLnVzX3h4X2luZm8pLAotCQkJCSYoY29uZmlnX3J4LnVzX3h4X2luZm8pKTsKLQotCXJldHVybiBfX3VzZl9zZXRfcnhfaW5mbyh1c2YsICZjb25maWdfcngpOwotfSAvKiB1c2Zfc2V0X3J4X2luZm8zMiAqLwotCi1zdGF0aWMgaW50IHVzZl9nZXRfdHhfdXBkYXRlMzIoc3RydWN0IHVzZl90eXBlICp1c2YsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlMzIgdXBkX3R4X2luZm8zMjsKLQlzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZSB1cGRfdHhfaW5mbzsKLQotCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZ1cGRfdHhfaW5mbzMyLAotCQkJCShzdHJ1Y3QgdXNfdHhfdXBkYXRlX2luZm9fdHlwZTMyIF9fdXNlciAqKSBhcmcsCi0JCQkJc2l6ZW9mKHVwZF90eF9pbmZvMzIpKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHVwZF90eF9pbmZvMzIgZnJvbSB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCW1lbXNldCgmdXBkX3R4X2luZm8sIDAsIHNpemVvZih1cGRfdHhfaW5mbykpOwotCXVwZF90eF9pbmZvLmV2ZW50X2NvdW50ZXIgPSB1cGRfdHhfaW5mbzMyLmV2ZW50X2NvdW50ZXI7Ci0JdXBkX3R4X2luZm8uZXZlbnQgPSBjb21wYXRfcHRyKHVwZF90eF9pbmZvMzIuZXZlbnQpOwotCXVwZF90eF9pbmZvLmZyZWVfcmVnaW9uID0gdXBkX3R4X2luZm8zMi5mcmVlX3JlZ2lvbjsKLQl1cGRfdHhfaW5mby50aW1lb3V0ID0gdXBkX3R4X2luZm8zMi50aW1lb3V0OwotCXVwZF90eF9pbmZvLmV2ZW50X2ZpbHRlcnMgPSB1cGRfdHhfaW5mbzMyLmV2ZW50X2ZpbHRlcnM7Ci0JdXBkX3R4X2luZm8ucGFyYW1zX2RhdGFfc2l6ZSA9IHVwZF90eF9pbmZvMzIucGFyYW1zX2RhdGFfc2l6ZTsKLQl1cGRfdHhfaW5mby5wYXJhbXNfZGF0YSA9IGNvbXBhdF9wdHIodXBkX3R4X2luZm8zMi5wYXJhbXNfZGF0YSk7Ci0JdXBkX3R4X2luZm8ucmVhZHlfcmVnaW9uID0gdXBkX3R4X2luZm8zMi5yZWFkeV9yZWdpb247Ci0KLQlyYyA9IF9fdXNmX2dldF90eF91cGRhdGUodXNmLCAmdXBkX3R4X2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZ2V0IHR4IHVwZGF0ZSBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIFVwZGF0ZSBvbmx5IHRoZSBmaWVsZHMgdGhhdCB3ZXJlIGNoYW5nZWQgKi8KLQl1cGRfdHhfaW5mbzMyLnJlYWR5X3JlZ2lvbiA9IHVwZF90eF9pbmZvLnJlYWR5X3JlZ2lvbjsKLQotCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnVwZF90eF9pbmZvMzIsCi0JCQkgIHNpemVvZih1cGRfdHhfaW5mbzMyKSk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgdXBkX3R4X2luZm8zMiB0byB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9nZXRfdHhfdXBkYXRlICovCi0KLXN0YXRpYyBpbnQgdXNmX3NldF9yeF91cGRhdGUzMihzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHVzX3J4X3VwZGF0ZV9pbmZvX3R5cGUzMiB1cGRfcnhfaW5mbzMyOwotCXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlIHVwZF9yeF9pbmZvOwotCi0JaW50IHJjID0gY29weV9mcm9tX3VzZXIoJnVwZF9yeF9pbmZvMzIsCi0JCQkJKHN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlMzIgX191c2VyICopIGFyZywKLQkJCQlzaXplb2YodXBkX3J4X2luZm8zMikpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgdXBkX3J4X2luZm8zMiBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbWVtc2V0KCZ1cGRfcnhfaW5mbywgMCwgc2l6ZW9mKHVwZF9yeF9pbmZvKSk7Ci0JdXBkX3J4X2luZm8ucmVhZHlfcmVnaW9uID0gdXBkX3J4X2luZm8zMi5yZWFkeV9yZWdpb247Ci0JdXBkX3J4X2luZm8ucGFyYW1zX2RhdGFfc2l6ZSA9IHVwZF9yeF9pbmZvMzIucGFyYW1zX2RhdGFfc2l6ZTsKLQl1cGRfcnhfaW5mby5wYXJhbXNfZGF0YSA9IGNvbXBhdF9wdHIodXBkX3J4X2luZm8zMi5wYXJhbXNfZGF0YSk7Ci0JdXBkX3J4X2luZm8uZnJlZV9yZWdpb24gPSB1cGRfcnhfaW5mbzMyLmZyZWVfcmVnaW9uOwotCi0JcmMgPSBfX3VzZl9zZXRfcnhfdXBkYXRlKHVzZl94eCwgJnVwZF9yeF9pbmZvKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNldCByeCB1cGRhdGUgZmFpbGVkOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBVcGRhdGUgb25seSB0aGUgZmllbGRzIHRoYXQgd2VyZSBjaGFuZ2VkICovCi0JdXBkX3J4X2luZm8zMi5mcmVlX3JlZ2lvbiA9IHVwZF9yeF9pbmZvLmZyZWVfcmVnaW9uOwotCi0JcmMgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLAotCQkJJnVwZF9yeF9pbmZvMzIsCi0JCQlzaXplb2YodXBkX3J4X2luZm8zMikpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHJ4X2luZm8zMiB0byB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9zZXRfcnhfdXBkYXRlMzIgKi8KLQotc3RhdGljIGludCB1c2Zfc2V0X3VzX2RldGVjdGlvbjMyKHN0cnVjdCB1c2ZfdHlwZSAqdXNmLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgdXNfZGV0ZWN0X2luZm9fdHlwZTMyIGRldGVjdF9pbmZvMzI7Ci0Jc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUgZGV0ZWN0X2luZm87Ci0KLQlpbnQgcmMgPSBjb3B5X2Zyb21fdXNlcigmZGV0ZWN0X2luZm8zMiwKLQkJCQkoc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUzMiBfX3VzZXIgKikgYXJnLAotCQkJCXNpemVvZihkZXRlY3RfaW5mbzMyKSk7Ci0KLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSBkZXRlY3RfaW5mbzMyIGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoZGV0ZWN0X2luZm8zMi5wYXJhbXNfZGF0YV9zaXplID4gVVNGX01BWF9VU0VSX0JVRl9TSVpFKSB7Ci0JCXByX2VycigiJXM6IHVzZXIgYnVmZmVyIHNpemUgZXhjZWVkcyBtYXhpbXVtXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQltZW1zZXQoJmRldGVjdF9pbmZvLCAwLCBzaXplb2YoZGV0ZWN0X2luZm8pKTsKLQlkZXRlY3RfaW5mby51c19kZXRlY3RvciA9IGRldGVjdF9pbmZvMzIudXNfZGV0ZWN0b3I7Ci0JZGV0ZWN0X2luZm8udXNfZGV0ZWN0X21vZGUgPSBkZXRlY3RfaW5mbzMyLnVzX2RldGVjdF9tb2RlOwotCWRldGVjdF9pbmZvLnNraXBfdGltZSA9IGRldGVjdF9pbmZvMzIuc2tpcF90aW1lOwotCWRldGVjdF9pbmZvLnBhcmFtc19kYXRhX3NpemUgPSBkZXRlY3RfaW5mbzMyLnBhcmFtc19kYXRhX3NpemU7Ci0JZGV0ZWN0X2luZm8ucGFyYW1zX2RhdGEgPSBjb21wYXRfcHRyKGRldGVjdF9pbmZvMzIucGFyYW1zX2RhdGEpOwotCWRldGVjdF9pbmZvLmRldGVjdF90aW1lb3V0ID0gZGV0ZWN0X2luZm8zMi5kZXRlY3RfdGltZW91dDsKLQlkZXRlY3RfaW5mby5pc191cyA9IGRldGVjdF9pbmZvMzIuaXNfdXM7Ci0KLQlyYyA9IF9fdXNmX3NldF91c19kZXRlY3Rpb24odXNmLCAmZGV0ZWN0X2luZm8pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogc2V0IHVzIGRldGVjdGlvbiBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIFVwZGF0ZSBvbmx5IHRoZSBmaWVsZHMgdGhhdCB3ZXJlIGNoYW5nZWQgKi8KLQlkZXRlY3RfaW5mbzMyLmlzX3VzID0gZGV0ZWN0X2luZm8uaXNfdXM7Ci0KLQlyYyA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCi0JCQkgICZkZXRlY3RfaW5mbzMyLAotCQkJICBzaXplb2YoZGV0ZWN0X2luZm8zMikpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IGRldGVjdF9pbmZvMzIgdG8gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIHJjOwotfSAvKiB1c2Zfc2V0X3VzX2RldGVjdGlvbjMyICovCi0KLXN0YXRpYyBpbnQgdXNmX2dldF92ZXJzaW9uMzIodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlMzIgdmVyc2lvbl9pbmZvMzI7Ci0Jc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlIHZlcnNpb25faW5mbzsKLQotCWludCByYyA9IGNvcHlfZnJvbV91c2VyKCZ2ZXJzaW9uX2luZm8zMiwKLQkJCQkoc3RydWN0IHVzX3ZlcnNpb25faW5mb190eXBlMzIgX191c2VyICopIGFyZywKLQkJCQlzaXplb2YodmVyc2lvbl9pbmZvMzIpKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBjb3B5IHZlcnNpb25faW5mbzMyIGZyb20gdXNlcjsgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQltZW1zZXQoJnZlcnNpb25faW5mbywgMCwgc2l6ZW9mKHZlcnNpb25faW5mbykpOwotCXZlcnNpb25faW5mby5idWZfc2l6ZSA9IHZlcnNpb25faW5mbzMyLmJ1Zl9zaXplOwotCXZlcnNpb25faW5mby5wYnVmID0gY29tcGF0X3B0cih2ZXJzaW9uX2luZm8zMi5wYnVmKTsKLQotCXJjID0gX191c2ZfZ2V0X3ZlcnNpb24oJnZlcnNpb25faW5mbyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBnZXQgdmVyc2lvbiBmYWlsZWQ7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIE5vbmUgb2YgdGhlIGZpZWxkcyB3ZXJlIGNoYW5nZWQgKi8KLQotCXJjID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKLQkJCSAgJnZlcnNpb25faW5mbzMyLAotCQkJICBzaXplb2YodmVyc2lvbl9pbmZvMzIpKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY29weSB2ZXJzaW9uX2luZm8zMiB0byB1c2VyOyByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9nZXRfdmVyc2lvbjMyICovCi0KLXN0YXRpYyBpbnQgdXNmX3NldF9zdHJlYW1fcGFyYW0zMihzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZywgaW50IGRpcikKLXsKLQlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMiBzZXRfc3RyZWFtX3BhcmFtMzI7Ci0Jc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlIHNldF9zdHJlYW1fcGFyYW07Ci0JaW50IHJjID0gMDsKLQotCXJjID0gY29weV9mcm9tX3VzZXIoJnNldF9zdHJlYW1fcGFyYW0zMiwKLQkJCShzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMiBfX3VzZXIgKikgYXJnLAotCQkJc2l6ZW9mKHNldF9zdHJlYW1fcGFyYW0zMikpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgc2V0X3N0cmVhbV9wYXJhbSBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbWVtc2V0KCZzZXRfc3RyZWFtX3BhcmFtLCAwLCBzaXplb2Yoc2V0X3N0cmVhbV9wYXJhbSkpOwotCXNldF9zdHJlYW1fcGFyYW0ubW9kdWxlX2lkID0gc2V0X3N0cmVhbV9wYXJhbTMyLm1vZHVsZV9pZDsKLQlzZXRfc3RyZWFtX3BhcmFtLnBhcmFtX2lkID0gc2V0X3N0cmVhbV9wYXJhbTMyLnBhcmFtX2lkOwotCXNldF9zdHJlYW1fcGFyYW0uYnVmX3NpemUgPSBzZXRfc3RyZWFtX3BhcmFtMzIuYnVmX3NpemU7Ci0Jc2V0X3N0cmVhbV9wYXJhbS5wYnVmID0gY29tcGF0X3B0cihzZXRfc3RyZWFtX3BhcmFtMzIucGJ1Zik7Ci0KLQlyZXR1cm4gX191c2Zfc2V0X3N0cmVhbV9wYXJhbSh1c2ZfeHgsICZzZXRfc3RyZWFtX3BhcmFtLCBkaXIpOwotfSAvKiB1c2Zfc2V0X3N0cmVhbV9wYXJhbTMyICovCi0KLXN0YXRpYyBpbnQgdXNmX2dldF9zdHJlYW1fcGFyYW0zMihzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZywgaW50IGRpcikKLXsKLQlzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMiBnZXRfc3RyZWFtX3BhcmFtMzI7Ci0Jc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlIGdldF9zdHJlYW1fcGFyYW07Ci0JaW50IHJjID0gMDsKLQotCXJjID0gY29weV9mcm9tX3VzZXIoJmdldF9zdHJlYW1fcGFyYW0zMiwKLQkJCShzdHJ1Y3QgdXNfc3RyZWFtX3BhcmFtX3R5cGUzMiBfX3VzZXIgKikgYXJnLAotCQkJc2l6ZW9mKGdldF9zdHJlYW1fcGFyYW0zMikpOwotCi0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgZ2V0X3N0cmVhbV9wYXJhbSBmcm9tIHVzZXI7IHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbWVtc2V0KCZnZXRfc3RyZWFtX3BhcmFtLCAwLCBzaXplb2YoZ2V0X3N0cmVhbV9wYXJhbSkpOwotCWdldF9zdHJlYW1fcGFyYW0ubW9kdWxlX2lkID0gZ2V0X3N0cmVhbV9wYXJhbTMyLm1vZHVsZV9pZDsKLQlnZXRfc3RyZWFtX3BhcmFtLnBhcmFtX2lkID0gZ2V0X3N0cmVhbV9wYXJhbTMyLnBhcmFtX2lkOwotCWdldF9zdHJlYW1fcGFyYW0uYnVmX3NpemUgPSBnZXRfc3RyZWFtX3BhcmFtMzIuYnVmX3NpemU7Ci0JZ2V0X3N0cmVhbV9wYXJhbS5wYnVmID0gY29tcGF0X3B0cihnZXRfc3RyZWFtX3BhcmFtMzIucGJ1Zik7Ci0KLQlyZXR1cm4gX191c2ZfZ2V0X3N0cmVhbV9wYXJhbSh1c2ZfeHgsICZnZXRfc3RyZWFtX3BhcmFtLCBkaXIpOwotfSAvKiB1c2ZfZ2V0X3N0cmVhbV9wYXJhbTMyICovCi0KLXN0YXRpYyBsb25nIF9fdXNmX2NvbXBhdF9pb2N0bChzdHJ1Y3QgdXNmX3R5cGUgKnVzZiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9IE5VTEw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVVNfU1RBUlRfVFg6Ci0JY2FzZSBVU19TVEFSVF9SWDoKLQljYXNlIFVTX1NUT1BfVFg6Ci0JY2FzZSBVU19TVE9QX1JYOiB7Ci0JCXJldHVybiBfX3VzZl9pb2N0bCh1c2YsIGNtZCwgYXJnKTsKLQl9Ci0KLQljYXNlIFVTX1NFVF9UWF9JTkZPMzI6IHsKLQkJdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX09QRU5FRF9TVEFURSkKLQkJCXJjID0gdXNmX3NldF90eF9pbmZvMzIodXNmLCBhcmcpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHNldF90eF9pbmZvMzI6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyZXR1cm4gLUVCQURGRDsKLQkJfQotCi0JCWJyZWFrOwotCX0gLyogVVNfU0VUX1RYX0lORk8zMiAqLwotCi0JY2FzZSBVU19TRVRfUlhfSU5GTzMyOiB7Ci0JCXVzZl94eCA9ICZ1c2YtPnVzZl9yeDsKLQkJaWYgKHVzZl94eC0+dXNmX3N0YXRlID09IFVTRl9PUEVORURfU1RBVEUpCi0JCQlyYyA9IHVzZl9zZXRfcnhfaW5mbzMyKHVzZiwgYXJnKTsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXRfcnhfaW5mbzMyOiB3cm9uZyBzdGF0ZVslZF1cbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJdXNmX3h4LT51c2Zfc3RhdGUpOwotCQkJcmV0dXJuIC1FQkFERkQ7Ci0JCX0KLQotCQlicmVhazsKLQl9IC8qIFVTX1NFVF9SWF9JTkZPMzIgKi8KLQotCWNhc2UgVVNfR0VUX1RYX1VQREFURTMyOiB7Ci0JCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCi0JCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfV09SS19TVEFURSkKLQkJCXJjID0gdXNmX2dldF90eF91cGRhdGUzMih1c2YsIGFyZyk7Ci0JCWVsc2UgewotCQkJcHJfZXJyKCIlczogZ2V0X3R4X3VwZGF0ZTMyOiB3cm9uZyBzdGF0ZVslZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sCi0JCQkgICAgICAgdXNmX3h4LT51c2Zfc3RhdGUpOwotCQkJcmMgPSAtRUJBREZEOwotCQl9Ci0JCWJyZWFrOwotCX0gLyogVVNfR0VUX1RYX1VQREFURTMyICovCi0KLQljYXNlIFVTX1NFVF9SWF9VUERBVEUzMjogewotCQlzdHJ1Y3QgdXNmX3h4X3R5cGUgKnVzZl94eCA9ICZ1c2YtPnVzZl9yeDsKLQotCQlpZiAodXNmX3h4LT51c2Zfc3RhdGUgPT0gVVNGX1dPUktfU1RBVEUpCi0JCQlyYyA9IHVzZl9zZXRfcnhfdXBkYXRlMzIodXNmX3h4LCBhcmcpOwotCQllbHNlIHsKLQkJCXByX2VycigiJXM6IHNldF9yeF91cGRhdGU6IHdyb25nIHN0YXRlWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCSAgICAgICB1c2ZfeHgtPnVzZl9zdGF0ZSk7Ci0JCQlyYyA9IC1FQkFERkQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfSAvKiBVU19TRVRfUlhfVVBEQVRFMzIgKi8KLQotCWNhc2UgVVNfU0VUX0RFVEVDVElPTjMyOiB7Ci0JCXN0cnVjdCB1c2ZfeHhfdHlwZSAqdXNmX3h4ID0gJnVzZi0+dXNmX3R4OwotCi0JCWlmICh1c2ZfeHgtPnVzZl9zdGF0ZSA9PSBVU0ZfV09SS19TVEFURSkKLQkJCXJjID0gdXNmX3NldF91c19kZXRlY3Rpb24zMih1c2YsIGFyZyk7Ci0JCWVsc2UgewotCQkJcHJfZXJyKCIlczogc2V0IHVzIGRldGVjdGlvbjogd3Jvbmcgc3RhdGVbJWRdXG4iLAotCQkJICAgICAgIF9fZnVuY19fLAotCQkJICAgICAgIHVzZl94eC0+dXNmX3N0YXRlKTsKLQkJCXJjID0gLUVCQURGRDsKLQkJfQotCQlicmVhazsKLQl9IC8qIFVTX1NFVF9ERVRFQ1RJT04zMiAqLwotCi0JY2FzZSBVU19HRVRfVkVSU0lPTjMyOiB7Ci0JCXJjID0gdXNmX2dldF92ZXJzaW9uMzIoYXJnKTsKLQkJYnJlYWs7Ci0JfSAvKiBVU19HRVRfVkVSU0lPTjMyICovCi0KLQljYXNlIFVTX1NFVF9UWF9TVFJFQU1fUEFSQU0zMjogewotCQlyYyA9IHVzZl9zZXRfc3RyZWFtX3BhcmFtMzIoJnVzZi0+dXNmX3R4LCBhcmcsIE9VVCk7Ci0JCWJyZWFrOwotCX0gLyogVVNfU0VUX1RYX1NUUkVBTV9QQVJBTTMyICovCi0KLQljYXNlIFVTX0dFVF9UWF9TVFJFQU1fUEFSQU0zMjogewotCQlyYyA9IHVzZl9nZXRfc3RyZWFtX3BhcmFtMzIoJnVzZi0+dXNmX3R4LCBhcmcsIE9VVCk7Ci0JCWJyZWFrOwotCX0gLyogVVNfR0VUX1RYX1NUUkVBTV9QQVJBTTMyICovCi0KLQljYXNlIFVTX1NFVF9SWF9TVFJFQU1fUEFSQU0zMjogewotCQlyYyA9IHVzZl9zZXRfc3RyZWFtX3BhcmFtMzIoJnVzZi0+dXNmX3J4LCBhcmcsIElOKTsKLQkJYnJlYWs7Ci0JfSAvKiBVU19TRVRfUlhfU1RSRUFNX1BBUkFNMzIgKi8KLQotCWNhc2UgVVNfR0VUX1JYX1NUUkVBTV9QQVJBTTMyOiB7Ci0JCXJjID0gdXNmX2dldF9zdHJlYW1fcGFyYW0zMigmdXNmLT51c2ZfcngsIGFyZywgSU4pOwotCQlicmVhazsKLQl9IC8qIFVTX0dFVF9SWF9TVFJFQU1fUEFSQU0zMiAqLwotCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgSU9DVEwgY29tbWFuZCBbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICBjbWQpOwotCQlyYyA9IC1FTk9UVFk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChyYyAmJgotCSAgICAoKGNtZCA9PSBVU19TRVRfVFhfSU5GTykgfHwKLQkgICAgIChjbWQgPT0gVVNfU0VUX1JYX0lORk8pKSkKLQkJcmVsZWFzZV94eCh1c2ZfeHgpOwotCi0JcmV0dXJuIHJjOwotfSAvKiBfX3VzZl9jb21wYXRfaW9jdGwgKi8KLQotc3RhdGljIGxvbmcgdXNmX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHVzZl90eXBlICp1c2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJnVzZi0+bXV0ZXgpOwotCXJjID0gX191c2ZfY29tcGF0X2lvY3RsKHVzZiwgY21kLCBhcmcpOwotCW11dGV4X3VubG9jaygmdXNmLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19IC8qIHVzZl9jb21wYXRfaW9jdGwgKi8KLSNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCi0KLXN0YXRpYyBpbnQgdXNmX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1zKQotewotCXN0cnVjdCB1c2ZfdHlwZSAqdXNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBkaXIgPSBPVVQ7Ci0Jc3RydWN0IHVzZl94eF90eXBlICp1c2ZfeHggPSAmdXNmLT51c2ZfdHg7Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJnVzZi0+bXV0ZXgpOwotCWlmICh2bXMtPnZtX2ZsYWdzICYgVVNGX1ZNX1dSSVRFKSB7IC8qIFJYIGJ1ZiBtYXBwaW5nICovCi0JCWRpciA9IElOOwotCQl1c2ZfeHggPSAmdXNmLT51c2Zfcng7Ci0JfQotCXJjID0gcTZ1c21fZ2V0X3ZpcnR1YWxfYWRkcmVzcyhkaXIsIHVzZl94eC0+dXNjLCB2bXMpOwotCW11dGV4X3VubG9jaygmdXNmLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBhZGRfb3BlbmVkX2RldihpbnQgbWlub3IpCi17Ci0JdWludDE2X3QgaW5kID0gMDsKLQotCWZvciAoaW5kID0gMDsgaW5kIDwgTUFYX0RFVlNfTlVNQkVSOyArK2luZCkgewotCQlpZiAobWlub3IgPT0gYXRvbWljX2NtcHhjaGcoJnNfb3BlbmVkX2RldnNbaW5kXSwgMCwgbWlub3IpKSB7Ci0JCQlwcl9lcnIoIiVzOiBkZXZpY2UgJWQgaXMgYWxyZWFkeSBvcGVuZWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIG1pbm9yKTsKLQkJCXJldHVybiBVU0ZfVU5ERUZfREVWX0lEOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiBkZXZpY2UgJWQgaXMgYWRkZWQ7IGluZD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgbWlub3IsIGluZCk7Ci0JCQlyZXR1cm4gaW5kOwotCQl9Ci0JfQotCi0JcHJfZXJyKCIlczogdGhlcmUgaXMgbm8gcGxhY2UgZm9yIGRldmljZSAlZFxuIiwKLQkgICAgICAgX19mdW5jX18sIG1pbm9yKTsKLQlyZXR1cm4gVVNGX1VOREVGX0RFVl9JRDsKLX0KLQotc3RhdGljIGludCB1c2Zfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdXNmX3R5cGUgKnVzZiA9ICBOVUxMOwotCXVpbnQxNl90IGRldl9pbmQgPSAwOwotCWludCBtaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOwotCi0JZGV2X2luZCA9IGFkZF9vcGVuZWRfZGV2KG1pbm9yKTsKLQlpZiAoZGV2X2luZCA9PSBVU0ZfVU5ERUZfREVWX0lEKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JdXNmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzZl90eXBlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVzZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdha2V1cF9zb3VyY2VfaW5pdCgmdXNmX3dha2V1cF9zb3VyY2UsICJ1c2YiKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHVzZjsKLQl1c2YtPmRldl9pbmQgPSBkZXZfaW5kOwotCi0JdXNmLT51c2ZfdHgudXNmX3N0YXRlID0gVVNGX09QRU5FRF9TVEFURTsKLQl1c2YtPnVzZl9yeC51c2Zfc3RhdGUgPSBVU0ZfT1BFTkVEX1NUQVRFOwotCi0JdXNmLT51c2ZfdHgudXNfZGV0ZWN0X3R5cGUgPSBVU0ZfVVNfREVURUNUX1VOREVGOwotCXVzZi0+dXNmX3J4LnVzX2RldGVjdF90eXBlID0gVVNGX1VTX0RFVEVDVF9VTkRFRjsKLQotCW11dGV4X2luaXQoJnVzZi0+bXV0ZXgpOwotCi0JcHJfZGVidWcoIiVzOnVzZiBpbiBvcGVuXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHVzZl90eXBlICp1c2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2UgZW50cnlcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnVzZi0+bXV0ZXgpOwotCXVzZl9yZWxlYXNlX2lucHV0KHVzZik7Ci0KLQl1c2ZfZGlzYWJsZSgmdXNmLT51c2ZfdHgpOwotCXVzZl9kaXNhYmxlKCZ1c2YtPnVzZl9yeCk7Ci0KLQlhdG9taWNfc2V0KCZzX29wZW5lZF9kZXZzW3VzZi0+ZGV2X2luZF0sIDApOwotCi0Jd2FrZXVwX3NvdXJjZV90cmFzaCgmdXNmX3dha2V1cF9zb3VyY2UpOwotCW11dGV4X3VubG9jaygmdXNmLT5tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmdXNmLT5tdXRleCk7Ci0Ja2ZyZWUodXNmKTsKLQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2UgZXhpdFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1leHRlcm4gbG9uZyB1c2ZfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzZl9mb3BzID0gewotCS5vd25lciAgICAgICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgICAgICAgICAgICAgICAgPSB1c2Zfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgICAgICAgICA9IHVzZl9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bCA9IHVzZl9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bCA9IHVzZl9jb21wYXRfaW9jdGwsCi0jZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwotCS5tbWFwICAgICAgICAgICAgICAgICAgID0gdXNmX21tYXAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdXNmX21pc2NbTUFYX0RFVlNfTlVNQkVSXSA9IHsKLQl7Ci0JCS5taW5vciAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JCS5uYW1lICAgPSAidXNmMSIsCi0JCS5mb3BzICAgPSAmdXNmX2ZvcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHVzZl9pbml0KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQl1aW50MTZfdCBpbmQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBVU0YgU1cgdmVyc2lvbiAlcy5cbiIsIF9fZnVuY19fLCBEUlZfVkVSU0lPTik7Ci0JcHJfZGVidWcoIiVzOiBNYXggJWQgZGV2cyByZWdpc3RyYXRpb25cbiIsIF9fZnVuY19fLCBNQVhfREVWU19OVU1CRVIpOwotCi0JZm9yIChpbmQgPSAwOyBpbmQgPCBNQVhfREVWU19OVU1CRVI7ICsraW5kKSB7Ci0JCXJjID0gbWlzY19yZWdpc3RlcigmdXNmX21pc2NbaW5kXSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogbWlzY19yZWdpc3RlcigpIGZhaWxlZCBpbmQ9JWQ7IHJjID0gJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGluZCwgcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWRldmljZV9pbml0Y2FsbCh1c2ZfaW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVWx0cmFzb3VuZCBmcmFtZXdvcmsgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5jIGIvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL3VzZmNkZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4YWFlMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvcWNvbS9xZHNwNnYyL3VsdHJhc291bmQvdXNmY2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCAyMDE2LTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgInVzZmNkZXYuaCIKLQotI2RlZmluZSBVTkRFRl9JRCAgICAweGZmZmZmZmZmCi0jZGVmaW5lIFNMT1RfQ01EX0lEIDAKLSNkZWZpbmUgTUFYX1JFVFJJRVMgMTAKLQotZW51bSB1c2Rldl9ldmVudF9zdGF0dXMgewotCVVTRkNERVZfRVZFTlRfRU5BQkxFRCwKLQlVU0ZDREVWX0VWRU5UX0RJU0FCTElORywKLQlVU0ZDREVWX0VWRU5UX0RJU0FCTEVELAotfTsKLQotc3RydWN0IHVzZmNkZXZfZXZlbnQgewotCWJvb2wgKCptYXRjaF9jYikodWludDE2X3QsIHN0cnVjdCBpbnB1dF9kZXYgKmRldik7Ci0JYm9vbCByZWdpc3RlcmVkX2V2ZW50OwotCWJvb2wgaW50ZXJsZWF2ZWQ7Ci0JZW51bSB1c2Rldl9ldmVudF9zdGF0dXMgZXZlbnRfc3RhdHVzOwotfTsKLXN0YXRpYyBzdHJ1Y3QgdXNmY2Rldl9ldmVudCBzX3VzZmNkZXZfZXZlbnRzW01BWF9FVkVOVF9UWVBFX05VTV07Ci0KLXN0cnVjdCB1c2ZjZGV2X2lucHV0X2NvbW1hbmQgewotCXVuc2lnbmVkIGludCB0eXBlOwotCXVuc2lnbmVkIGludCBjb2RlOwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBsb25nICBzX3VzZl9waWQ7Ci0KLXN0YXRpYyBib29sIHVzZmNkZXZfZmlsdGVyKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwKLQkJCSB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSk7Ci1zdGF0aWMgYm9vbCB1c2ZjZGV2X21hdGNoKHN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyLAotCQkJCXN0cnVjdCBpbnB1dF9kZXYgKmRldik7Ci1zdGF0aWMgaW50IHVzZmNkZXZfY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlciAqaGFuZGxlciwKLQkJCQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCi0JCQkJY29uc3Qgc3RydWN0IGlucHV0X2RldmljZV9pZCAqaWQpOwotc3RhdGljIHZvaWQgdXNmY2Rldl9kaXNjb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5wdXRfZGV2aWNlX2lkIHVzZmNfdHNjX2lkc1tdID0gewotCXsKLQkJLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwKLQkJCUlOUFVUX0RFVklDRV9JRF9NQVRDSF9LRVlCSVQgfAotCQkJSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKLQkJLmV2Yml0ID0geyBCSVRfTUFTSyhFVl9BQlMpIHwgQklUX01BU0soRVZfS0VZKSB9LAotCQkua2V5Yml0ID0geyBbQklUX1dPUkQoQlROX1RPVUNIKV0gPSBCSVRfTUFTSyhCVE5fVE9VQ0gpIH0sCi0JCS8qIGFzc3VtcHRpb246IEFCU19YICYgQUJTX1kgYXJlIGluIHRoZSBzYW1lIGxvbmcgKi8KLQkJLmFic2JpdCA9IHsgW0JJVF9XT1JEKEFCU19YKV0gPSBCSVRfTUFTSyhBQlNfWCkgfAotCQkJCQkJQklUX01BU0soQUJTX1kpIH0sCi0JfSwKLQl7Ci0JCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8Ci0JCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfS0VZQklUIHwKLQkJCUlOUFVUX0RFVklDRV9JRF9NQVRDSF9BQlNCSVQsCi0JCS5ldmJpdCA9IHsgQklUX01BU0soRVZfQUJTKSB8IEJJVF9NQVNLKEVWX0tFWSkgfSwKLQkJLmtleWJpdCA9IHsgW0JJVF9XT1JEKEJUTl9UT1VDSCldID0gQklUX01BU0soQlROX1RPVUNIKSB9LAotCQkvKiBhc3N1bXB0aW9uOiBNVF8uLl9YICYgTVRfLi5fWSBhcmUgaW4gdGhlIHNhbWUgbG9uZyAqLwotCQkuYWJzYml0ID0geyBbQklUX1dPUkQoQUJTX01UX1BPU0lUSU9OX1gpXSA9Ci0JCQlCSVRfTUFTSyhBQlNfTVRfUE9TSVRJT05fWCkgfAotCQkJQklUX01BU0soQUJTX01UX1BPU0lUSU9OX1kpIH0sCi0JfSwKLQl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaW5wdXQsIHVzZmNfdHNjX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfaGFuZGxlciBzX3VzZmNfaGFuZGxlcnNbTUFYX0VWRU5UX1RZUEVfTlVNXSA9IHsKLQl7IC8qIFRTQyBoYW5kbGVyICovCi0JCS5maWx0ZXIgICAgICAgICA9IHVzZmNkZXZfZmlsdGVyLAotCQkubWF0Y2ggICAgICAgICAgPSB1c2ZjZGV2X21hdGNoLAotCQkuY29ubmVjdCAgICAgICAgPSB1c2ZjZGV2X2Nvbm5lY3QsCi0JCS5kaXNjb25uZWN0ICAgICA9IHVzZmNkZXZfZGlzY29ubmVjdCwKLQkJLyogLm1pbm9yIGNhbiBiZSB1c2VkIGFzIGluZGV4IGluIHRoZSBjb250YWluZXIsICovCi0JCS8qICBiZWNhdXNlIC5mb3BzIGlzbid0IHN1cHBvcnRlZCAqLwotCQkubWlub3IgICAgICAgICAgPSBUU0NfRVZFTlRfVFlQRV9JTkQsCi0JCS5uYW1lICAgICAgICAgICA9ICJ1c2ZjX3RzY19oYW5kbGVyIiwKLQkJLmlkX3RhYmxlICAgICAgID0gdXNmY190c2NfaWRzLAotCX0sCi19OwotCi0vKgotICogRm9yIGVhY2ggZXZlbnQgdHlwZSwgdGhlcmUgYXJlIGEgbnVtYmVyIGNvbmZsaWN0aW5nIGRldmljZXMgKGhhbmRsZXMpCi0gKiBUaGUgZmlyc3QgcmVnaXN0ZXJlZCBkZXZpY2UgKHByaW1hcnkpIGlzIHJlYWwgVFNDIGRldmljZTsgaXQncyBtYW5kYXRvcnkKLSAqIE9wdGlvbmFsbHksIGxhdGVyIHJlZ2lzdGVyZWQgZGV2aWNlcyBhcmUgc2ltdWxhdGVkIG9uZXMuCi0gKiBUaGV5IGFyZSBkeW5hbWljYWxseSBtYW5hZ2VkCi0gKiBUaGUgcHJpbWFyeSBkZXZpY2UncyBoYW5kbGVzIGFyZSBzdG9yZWQgaW4gdGhlIGJlbG93IHN0YXRpYyBhcnJheQotICovCi1zdGF0aWMgc3RydWN0IGlucHV0X2hhbmRsZSBzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW01BWF9FVkVOVF9UWVBFX05VTV0gPSB7Ci0JeyAvKiBUU0MgaGFuZGxlICovCi0JCS5oYW5kbGVyCT0gJnNfdXNmY19oYW5kbGVyc1tUU0NfRVZFTlRfVFlQRV9JTkRdLAotCQkubmFtZQkJPSAidXNmY190c2NfaGFuZGxlIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2ZjZGV2X2lucHV0X2NvbW1hbmQgaW5pdGlhbF9jbGVhcl9jbWRzW10gPSB7Ci0Je0VWX0FCUywgQUJTX1BSRVNTVVJFLCAgICAgICAgICAgICAgIDB9LAotCXtFVl9LRVksIEJUTl9UT1VDSCwgICAgICAgICAgICAgICAgICAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNmY2Rldl9pbnB1dF9jb21tYW5kIHNsb3RfY2xlYXJfY21kc1tdID0gewotCXtFVl9BQlMsIEFCU19NVF9TTE9ULCAgICAgICAgICAgICAgIDB9LAotCXtFVl9BQlMsIEFCU19NVF9UUkFDS0lOR19JRCwgVU5ERUZfSUR9LAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2ZjZGV2X2lucHV0X2NvbW1hbmQgbm9fZmlsdGVyX2NtZHNbXSA9IHsKLQl7RVZfQUJTLCBBQlNfTVRfU0xPVCwgICAgICAgICAgICAgICAwfSwKLQl7RVZfQUJTLCBBQlNfTVRfVFJBQ0tJTkdfSUQsIFVOREVGX0lEfSwKLQl7RVZfU1lOLCBTWU5fUkVQT1JULCAgICAgICAgICAgICAgICAwfSwKLX07Ci0KLXN0YXRpYyBib29sIHVzZmNkZXZfbWF0Y2goc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsIHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQlib29sIHJjID0gZmFsc2U7Ci0JaW50IGluZCA9IGhhbmRsZXItPm1pbm9yOwotCi0JcHJfZGVidWcoIiVzOiBuYW1lPVslc107IGluZD0lZFxuIiwgX19mdW5jX18sIGRldi0+bmFtZSwgaW5kKTsKLQotCWlmIChzX3VzZmNkZXZfZXZlbnRzW2luZF0ucmVnaXN0ZXJlZF9ldmVudCAmJgotCQlzX3VzZmNkZXZfZXZlbnRzW2luZF0ubWF0Y2hfY2IpIHsKLQkJcmMgPSAoKnNfdXNmY2Rldl9ldmVudHNbaW5kXS5tYXRjaF9jYikoKHVpbnQxNl90KWluZCwgZGV2KTsKLQkJcHJfZGVidWcoIiVzOiBbJXNdOyByYz0lZFxuIiwgX19mdW5jX18sIGRldi0+bmFtZSwgcmMpOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdXNmY2Rldl9jb25uZWN0KHN0cnVjdCBpbnB1dF9oYW5kbGVyICpoYW5kbGVyLCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCi0JCQkJY29uc3Qgc3RydWN0IGlucHV0X2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0JdWludDE2X3QgaW5kID0gaGFuZGxlci0+bWlub3I7Ci0Jc3RydWN0IGlucHV0X2hhbmRsZSAqdXNmY19oYW5kbGUgPSBOVUxMOwotCi0JaWYgKHNfdXNmY19wcmltYXJ5X2hhbmRsZXNbaW5kXS5kZXYgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IHByaW1hcnkgZGV2aWNlOyBpbmQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWluZCk7Ci0JCXVzZmNfaGFuZGxlID0gJnNfdXNmY19wcmltYXJ5X2hhbmRsZXNbaW5kXTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IHNlY29uZGFyeSBkZXZpY2U7IGluZD0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJaW5kKTsKLQkJdXNmY19oYW5kbGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXNmY19oYW5kbGUpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQl1c2ZjX2hhbmRsZS0+aGFuZGxlciA9ICZzX3VzZmNfaGFuZGxlcnNbaW5kXTsKLQkJdXNmY19oYW5kbGUtPm5hbWUgPSBzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2luZF0ubmFtZTsKLQl9Ci0JdXNmY19oYW5kbGUtPmRldiA9IGRldjsKLQlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9oYW5kbGUodXNmY19oYW5kbGUpOwotCXByX2RlYnVnKCIlczogbmFtZT1bJXNdOyBpbmQ9JWQ7IGRldj0weCVwS1xuIiwKLQkJIF9fZnVuY19fLAotCQlkZXYtPm5hbWUsCi0JCWluZCwKLQkJdXNmY19oYW5kbGUtPmRldik7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogaW5wdXRfcmVnaXN0ZXJfaGFuZGxlWyVkXSBmYWlsZWQ6IHJldD0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJaW5kLAotCQkJcmV0KTsKLQllbHNlIHsKLQkJcmV0ID0gaW5wdXRfb3Blbl9kZXZpY2UodXNmY19oYW5kbGUpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnB1dF9vcGVuX2RldmljZVslZF0gZmFpbGVkOiByZXQ9JWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJaW5kLAotCQkJCXJldCk7Ci0JCQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZSh1c2ZjX2hhbmRsZSk7Ci0JCX0gZWxzZQotCQkJcHJfZGVidWcoIiVzOiBkZXZpY2VbJWRdIGlzIG9wZW5lZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlpbmQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzZmNkZXZfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCi17Ci0JaW50IGluZCA9IGhhbmRsZS0+aGFuZGxlci0+bWlub3I7Ci0KLQlpbnB1dF9jbG9zZV9kZXZpY2UoaGFuZGxlKTsKLQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZShoYW5kbGUpOwotCXByX2RlYnVnKCIlczogaGFuZGxlWyVkXSwgbmFtZT1bJXNdIGlzIGRpc2Nvbm5lY3RlZFxuIiwKLQkJX19mdW5jX18sCi0JCWluZCwKLQkJaGFuZGxlLT5kZXYtPm5hbWUpOwotCWlmIChzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2luZF0uZGV2ID09IGhhbmRsZS0+ZGV2KQotCQlzX3VzZmNfcHJpbWFyeV9oYW5kbGVzW2luZF0uZGV2ID0gTlVMTDsKLQllbHNlCi0JCWtmcmVlKGhhbmRsZSk7Ci19Ci0KLXN0YXRpYyBib29sIHVzZmNkZXZfZmlsdGVyKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSwKLQkJCXVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQotewotCXVpbnQxNl90IGkgPSAwOwotCXVpbnQxNl90IGluZCA9ICh1aW50MTZfdCloYW5kbGUtPmhhbmRsZXItPm1pbm9yOwotCWJvb2wgcmMgPSAoc191c2ZjZGV2X2V2ZW50c1tpbmRdLmV2ZW50X3N0YXR1cyAhPSBVU0ZDREVWX0VWRU5UX0VOQUJMRUQpOwotCi0JaWYgKHNfdXNmX3BpZCA9PSBzeXNfZ2V0cGlkKCkpIHsKLQkJLyogUGFzcyBldmVudHMgZnJvbSB1c2ZjZGV2IGRyaXZlciAqLwotCQlyYyA9IGZhbHNlOwotCQlwcl9kZWJ1ZygiJXM6IGV2ZW50X3R5cGU9JWQ7IHR5cGU9JWQ7IGNvZGU9JWQ7IHZhbD0lZCIsCi0JCQlfX2Z1bmNfXywKLQkJCWluZCwKLQkJCXR5cGUsCi0JCQljb2RlLAotCQkJdmFsdWUpOwotCX0gZWxzZSBpZiAoc191c2ZjZGV2X2V2ZW50c1tpbmRdLmV2ZW50X3N0YXR1cyA9PQotCQkJCQkJVVNGQ0RFVl9FVkVOVF9ESVNBQkxJTkcpIHsKLQkJdWludDMyX3QgdV92YWx1ZSA9IHZhbHVlOwotCi0JCXNfdXNmY2Rldl9ldmVudHNbaW5kXS5pbnRlcmxlYXZlZCA9IHRydWU7Ci0JCS8qIFBhc3MgZXZlbnRzIGZvciBmcmVlaW5nIHNsb3RzIGZyb20gVFNDIGRyaXZlciAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShub19maWx0ZXJfY21kcyk7ICsraSkgewotCQkJaWYgKChub19maWx0ZXJfY21kc1tpXS50eXBlID09IHR5cGUpICYmCi0JCQkgICAgKG5vX2ZpbHRlcl9jbWRzW2ldLmNvZGUgPT0gY29kZSkgJiYKLQkJCSAgICAobm9fZmlsdGVyX2NtZHNbaV0udmFsdWUgPD0gdV92YWx1ZSkpIHsKLQkJCQlyYyA9IGZhbHNlOwotCQkJCXByX2RlYnVnKCIlczogbm9fZmlsdGVyX2NtZHNbJWRdOyAlZCIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQlpLAotCQkJCQlub19maWx0ZXJfY21kc1tpXS52YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWJvb2wgdXNmY2Rldl9yZWdpc3RlcigKLQl1aW50MTZfdCBldmVudF90eXBlX2luZCwKLQlib29sICgqbWF0Y2hfY2IpKHVpbnQxNl90LCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpKQotewotCWludCByZXQgPSAwOwotCWJvb2wgcmMgPSBmYWxzZTsKLQotCWlmICgoZXZlbnRfdHlwZV9pbmQgPj0gTUFYX0VWRU5UX1RZUEVfTlVNKSB8fCAhbWF0Y2hfY2IpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW5wdXQ6IGV2ZW50X3R5cGVfaW5kPSVkOyBtYXRjaF9jYj0weCVwS1xuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQsCi0JCQltYXRjaF9jYik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCkgewotCQlwcl9pbmZvKCIlczogaGFuZGxlclslZF0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5yZWdpc3RlcmVkX2V2ZW50ID0gdHJ1ZTsKLQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5tYXRjaF9jYiA9IG1hdGNoX2NiOwotCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmV2ZW50X3N0YXR1cyA9IFVTRkNERVZfRVZFTlRfRU5BQkxFRDsKLQlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9oYW5kbGVyKCZzX3VzZmNfaGFuZGxlcnNbZXZlbnRfdHlwZV9pbmRdKTsKLQlpZiAoIXJldCkgewotCQlyYyA9IHRydWU7Ci0JCXByX2RlYnVnKCIlczogaGFuZGxlclslZF0gd2FzIHJlZ2lzdGVyZWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWV2ZW50X3R5cGVfaW5kKTsKLQl9IGVsc2UgewotCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5yZWdpc3RlcmVkX2V2ZW50ID0gZmFsc2U7Ci0JCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLm1hdGNoX2NiID0gTlVMTDsKLQkJcHJfZXJyKCIlczogaGFuZGxlclslZF0gcmVnaXN0cmF0aW9uIGZhaWxlZDogcmV0PSVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlldmVudF90eXBlX2luZCwKLQkJCXJldCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi12b2lkIHVzZmNkZXZfdW5yZWdpc3Rlcih1aW50MTZfdCBldmVudF90eXBlX2luZCkKLXsKLQlpZiAoZXZlbnRfdHlwZV9pbmQgPj0gTUFYX0VWRU5UX1RZUEVfTlVNKSB7Ci0JCXByX2VycigiJXM6IHdyb25nIGlucHV0OiBldmVudF90eXBlX2luZD0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQpOwotCQlyZXR1cm47Ci0JfQotCWlmIChzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5yZWdpc3RlcmVkX2V2ZW50KSB7Ci0JCWlucHV0X3VucmVnaXN0ZXJfaGFuZGxlcigmc191c2ZjX2hhbmRsZXJzW2V2ZW50X3R5cGVfaW5kXSk7Ci0JCXByX2RlYnVnKCIlczogaGFuZGxlclslZF0gd2FzIHVucmVnaXN0ZXJlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQpOwotCQlzX3VzZmNkZXZfZXZlbnRzW2V2ZW50X3R5cGVfaW5kXS5yZWdpc3RlcmVkX2V2ZW50ID0gZmFsc2U7Ci0JCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLm1hdGNoX2NiID0gTlVMTDsKLQkJc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0uZXZlbnRfc3RhdHVzID0KLQkJCQkJCQlVU0ZDREVWX0VWRU5UX0VOQUJMRUQ7Ci0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1c2ZjZGV2X3NlbmRfY21kKAotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiwKLQlzdHJ1Y3QgdXNmY2Rldl9pbnB1dF9jb21tYW5kIGNtZCkKLXsKLQlpbnB1dF9ldmVudChkZXYsIGNtZC50eXBlLCBjbWQuY29kZSwgY21kLnZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgdXNmY2Rldl9jbGVhbl9kZXYodWludDE2X3QgZXZlbnRfdHlwZV9pbmQpCi17Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaTsKLQlpbnQgajsKLQlpbnQgcmV0cmllcyA9IDA7Ci0KLQlpZiAoZXZlbnRfdHlwZV9pbmQgPj0gTUFYX0VWRU5UX1RZUEVfTlVNKSB7Ci0JCXByX2VycigiJXM6IHdyb25nIGlucHV0OiBldmVudF90eXBlX2luZD0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQpOwotCQlyZXR1cm47Ci0JfQotCS8qIE9ubHkgcHJpbWFyeSBkZXZpY2UgbXVzdCBleGlzdCAqLwotCWRldiA9IHNfdXNmY19wcmltYXJ5X2hhbmRsZXNbZXZlbnRfdHlwZV9pbmRdLmRldjsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBwcmltYXJ5IGRldmljZVxuIiwKLQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdGlhbF9jbGVhcl9jbWRzKTsgaSsrKQotCQl1c2ZjZGV2X3NlbmRfY21kKGRldiwgaW5pdGlhbF9jbGVhcl9jbWRzW2ldKTsKLQlpbnB1dF9zeW5jKGRldik7Ci0KLQkvKiBTZW5kIGNvbW1hbmRzIHRvIGZyZWUgYWxsIHNsb3RzICovCi0JZm9yIChpID0gMDsgaSA8IGRldi0+bXQtPm51bV9zbG90czsgaSsrKSB7Ci0JCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmludGVybGVhdmVkID0gZmFsc2U7Ci0JCWlmIChpbnB1dF9tdF9nZXRfdmFsdWUoJmRldi0+bXQtPnNsb3RzW2ldLAotCQkJCQlBQlNfTVRfVFJBQ0tJTkdfSUQpIDwgMCkgewotCQkJcHJfZGVidWcoIiVzOiBza2lwcGluZyBzbG90ICVkIiwKLQkJCQlfX2Z1bmNfXywgaSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlzbG90X2NsZWFyX2NtZHNbU0xPVF9DTURfSURdLnZhbHVlID0gaTsKLQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc2xvdF9jbGVhcl9jbWRzKTsgaisrKQotCQkJdXNmY2Rldl9zZW5kX2NtZChkZXYsIHNsb3RfY2xlYXJfY21kc1tqXSk7Ci0KLQkJaWYgKHNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmludGVybGVhdmVkKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGludGVybGVhdmVkKCVkKTogc2xvdCglZCkiLAotCQkJCV9fZnVuY19fLCBpLCBkZXYtPm10LT5zbG90KTsKLQkJCWlmIChyZXRyaWVzKysgPCBNQVhfUkVUUklFUykgewotCQkJCS0taTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXByX3dhcm4oIiVzOiBpbmRleCglZCkgcmVhY2hlZCBtYXggcmV0aXJlcyIsCi0JCQkJX19mdW5jX18sIGkpOwotCQl9Ci0KLQkJcmV0cmllcyA9IDA7Ci0JCWlucHV0X3N5bmMoZGV2KTsKLQl9Ci19Ci0KLWJvb2wgdXNmY2Rldl9zZXRfZmlsdGVyKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kLCBib29sIGZpbHRlcikKLXsKLQlib29sIHJjID0gdHJ1ZTsKLQotCWlmIChldmVudF90eXBlX2luZCA+PSBNQVhfRVZFTlRfVFlQRV9OVU0pIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW5wdXQ6IGV2ZW50X3R5cGVfaW5kPSVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlldmVudF90eXBlX2luZCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoc191c2ZjZGV2X2V2ZW50c1tldmVudF90eXBlX2luZF0ucmVnaXN0ZXJlZF9ldmVudCkgewotCi0JCXByX2RlYnVnKCIlczogZXZlbnRfdHlwZVslZF07IGZpbHRlcj0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQsCi0JCQlmaWx0ZXIKLQkJCSk7Ci0JCWlmIChmaWx0ZXIpIHsKLQkJCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmV2ZW50X3N0YXR1cyA9Ci0JCQkJCQlVU0ZDREVWX0VWRU5UX0RJU0FCTElORzsKLQkJCXNfdXNmX3BpZCA9IHN5c19nZXRwaWQoKTsKLQkJCXVzZmNkZXZfY2xlYW5fZGV2KGV2ZW50X3R5cGVfaW5kKTsKLQkJCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmV2ZW50X3N0YXR1cyA9Ci0JCQkJCQlVU0ZDREVWX0VWRU5UX0RJU0FCTEVEOwotCQl9IGVsc2UKLQkJCXNfdXNmY2Rldl9ldmVudHNbZXZlbnRfdHlwZV9pbmRdLmV2ZW50X3N0YXR1cyA9Ci0JCQkJCQlVU0ZDREVWX0VWRU5UX0VOQUJMRUQ7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogZXZlbnRfdHlwZVslZF0gaXNuJ3QgcmVnaXN0ZXJlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJZXZlbnRfdHlwZV9pbmQpOwotCQlyYyA9IGZhbHNlOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdXNmY2Rldl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWRldmljZV9pbml0Y2FsbCh1c2ZjZGV2X2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkhhbmRsZSBvZiBldmVudHMgZnJvbSBkZXZpY2VzLCBjb25mbGljdGluZyB3aXRoIFVTRiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL3VzZmNkZXYuaCBiL2RyaXZlcnMvbWlzYy9xY29tL3Fkc3A2djIvdWx0cmFzb3VuZC91c2ZjZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjYyYzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3Fjb20vcWRzcDZ2Mi91bHRyYXNvdW5kL3VzZmNkZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19VU0ZDREVWX0hfXwotI2RlZmluZSBfX1VTRkNERVZfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotCi0vKiBUU0MgZXZlbnQgdHlwZSBpbmRleCBpbiB0aGUgY29udGFpbmVycyBvZiB0aGUgaGFuZGxlcnMgJiBoYW5kbGVzICovCi0jZGVmaW5lIFRTQ19FVkVOVF9UWVBFX0lORCAwCi0vKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIGV2ZW50IHR5cGVzIHRvIGJlIGZpbHRlcmVkICovCi0jZGVmaW5lIE1BWF9FVkVOVF9UWVBFX05VTSAxCi0KLWJvb2wgdXNmY2Rldl9yZWdpc3RlcigKLQl1aW50MTZfdCBldmVudF90eXBlX2luZCwKLQlib29sICgqbWF0Y2hfY2IpKHVpbnQxNl90LCBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpKTsKLXZvaWQgdXNmY2Rldl91bnJlZ2lzdGVyKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kKTsKLWJvb2wgdXNmY2Rldl9zZXRfZmlsdGVyKHVpbnQxNl90IGV2ZW50X3R5cGVfaW5kLCBib29sIGZpbHRlcik7Ci0jZW5kaWYgLyogX19VU0ZDREVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3FwbnAtbWlzYy5jIGIvZHJpdmVycy9taXNjL3FwbnAtbWlzYy5jCmluZGV4IDNjMTFkZTAuLjY5MGIyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9xcG5wLW1pc2MuYworKysgYi9kcml2ZXJzL21pc2MvcXBucC1taXNjLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXN0cnVjdCBxcG5wX21pc2NfZGV2ICptZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcXBucF9taXNjX2RldiAqbWRldl9mb3VuZCA9IE5VTEw7CiAJaW50IHJjOwotCXU4IHRlbXA7CisJdTggdGVtcCA9IDA7CiAKIAlpZiAoSVNfRVJSX09SX05VTEwobm9kZSkpIHsKIAkJcHJfZXJyKCJJbnZhbGlkIGRldmljZSBub2RlIHBvaW50ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3FzZWVjb20uYyBiL2RyaXZlcnMvbWlzYy9xc2VlY29tLmMKaW5kZXggNzA3N2IzMC4uNzU2N2Y4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3FzZWVjb20uYworKysgYi9kcml2ZXJzL21pc2MvcXNlZWNvbS5jCkBAIC0zMTI2LDYgKzMxMjYsNyBAQAogCQkJCXN0cnVjdCBxc2VlY29tX3NlbmRfY21kX3JlcSAqcmVxKQogewogCWludCByZXQgPSAwOworCWludCByZXQyID0gMDsKIAl1MzIgcmVxZF9sZW5fc2JfaW4gPSAwOwogCXN0cnVjdCBxc2VlY29tX2NsaWVudF9zZW5kX2RhdGFfaXJlcSBzZW5kX2RhdGFfcmVxID0gezB9OwogCXN0cnVjdCBxc2VlY29tX2NsaWVudF9zZW5kX2RhdGFfNjRiaXRfaXJlcSBzZW5kX2RhdGFfcmVxXzY0Yml0ID0gezB9OwpAQCAtMzIyNCwzMiArMzIyNSwzOCBAQAogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJzY21fY2FsbCgpIGZhaWxlZCB3aXRoIGVycjogJWQgKGFwcF9pZCA9ICVkKVxuIiwKIAkJCQkJcmV0LCBkYXRhLT5jbGllbnQuYXBwX2lkKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBleGl0OwogCX0KIAogCWlmIChxc2VlY29tLnFzZWVfcmVlbnRyYW5jeV9zdXBwb3J0KSB7CiAJCXJldCA9IF9fcXNlZWNvbV9wcm9jZXNzX3JlZW50cmFuY3koJnJlc3AsIHB0cl9hcHAsIGRhdGEpOworCQlpZiAocmV0KQorCQkJZ290byBleGl0OwogCX0gZWxzZSB7CiAJCWlmIChyZXNwLnJlc3VsdCA9PSBRU0VPU19SRVNVTFRfSU5DT01QTEVURSkgewogCQkJcmV0ID0gX19xc2VlY29tX3Byb2Nlc3NfaW5jb21wbGV0ZV9jbWQoZGF0YSwgJnJlc3ApOwogCQkJaWYgKHJldCkgewogCQkJCXByX2VycigicHJvY2Vzc19pbmNvbXBsZXRlX2NtZCBmYWlsZWQgZXJyOiAlZFxuIiwKIAkJCQkJCXJldCk7Ci0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAocmVzcC5yZXN1bHQgIT0gUVNFT1NfUkVTVUxUX1NVQ0NFU1MpIHsKIAkJCQlwcl9lcnIoIlJlc3BvbnNlIHJlc3VsdCAlZCBub3Qgc3VwcG9ydGVkXG4iLAogCQkJCQkJCQlyZXNwLnJlc3VsdCk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAJCX0KIAl9Ci0JcmV0ID0gbXNtX2lvbl9kb19jYWNoZV9vcChxc2VlY29tLmlvbl9jbG50LCBkYXRhLT5jbGllbnQuaWhhbmRsZSwKK2V4aXQ6CisJcmV0MiA9IG1zbV9pb25fZG9fY2FjaGVfb3AocXNlZWNvbS5pb25fY2xudCwgZGF0YS0+Y2xpZW50LmloYW5kbGUsCiAJCQkJZGF0YS0+Y2xpZW50LnNiX3ZpcnQsIGRhdGEtPmNsaWVudC5zYl9sZW5ndGgsCiAJCQkJSU9OX0lPQ19JTlZfQ0FDSEVTKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoImNhY2hlIG9wZXJhdGlvbiBmYWlsZWQgJWRcbiIsIHJldCk7CisJaWYgKHJldDIpIHsKKwkJcHJfZXJyKCJjYWNoZSBvcGVyYXRpb24gZmFpbGVkICVkXG4iLCByZXQyKTsKKwkJcmV0dXJuIHJldDI7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY1NzUsNiArNjU4Miw3IEBACiAJYm9vbCBmb3VuZF9hcHAgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOworCWludCByZXQyID0gMDsKIAl1aW50MzJfdCByZXFkX2xlbl9zYl9pbiA9IDA7CiAJdm9pZCAqY21kX2J1ZiA9IE5VTEw7CiAJc2l6ZV90IGNtZF9sZW47CkBAIC02Njg0LDQzICs2NjkyLDQ3IEBACiAJaWYgKHJldCkgewogCQlwcl9lcnIoInNjbV9jYWxsKCkgZmFpbGVkIHdpdGggZXJyOiAlZCAoYXBwX2lkID0gJWQpXG4iLAogCQkJCQlyZXQsIGRhdGEtPmNsaWVudC5hcHBfaWQpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGV4aXQ7CiAJfQogCiAJaWYgKHFzZWVjb20ucXNlZV9yZWVudHJhbmN5X3N1cHBvcnQpIHsKIAkJcmV0ID0gX19xc2VlY29tX3Byb2Nlc3NfcmVlbnRyYW5jeSgmcmVzcCwgcHRyX2FwcCwgZGF0YSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIHsKIAkJaWYgKHJlc3AucmVzdWx0ID09IFFTRU9TX1JFU1VMVF9JTkNPTVBMRVRFKSB7CiAJCQlyZXQgPSBfX3FzZWVjb21fcHJvY2Vzc19pbmNvbXBsZXRlX2NtZChkYXRhLCAmcmVzcCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJcHJfZXJyKCJwcm9jZXNzX2luY29tcGxldGVfY21kIGZhaWxlZCBlcnI6ICVkXG4iLAogCQkJCQkJcmV0KTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChyZXNwLnJlc3VsdCAhPSBRU0VPU19SRVNVTFRfU1VDQ0VTUykgewogCQkJCXByX2VycigiUmVzcG9uc2UgcmVzdWx0ICVkIG5vdCBzdXBwb3J0ZWRcbiIsCiAJCQkJCQkJCXJlc3AucmVzdWx0KTsKIAkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdDsKIAkJCX0KIAkJfQogCX0KLQlyZXQgPSBtc21faW9uX2RvX2NhY2hlX29wKHFzZWVjb20uaW9uX2NsbnQsIGRhdGEtPmNsaWVudC5paGFuZGxlLAorZXhpdDoKKwlyZXQyID0gbXNtX2lvbl9kb19jYWNoZV9vcChxc2VlY29tLmlvbl9jbG50LCBkYXRhLT5jbGllbnQuaWhhbmRsZSwKIAkJCQlkYXRhLT5jbGllbnQuc2JfdmlydCwgZGF0YS0+Y2xpZW50LnNiX2xlbmd0aCwKIAkJCQlJT05fSU9DX0lOVl9DQUNIRVMpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0MikgewogCQlwcl9lcnIoImNhY2hlIG9wZXJhdGlvbiBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiByZXQyOwogCX0KIAogCWlmICgoY21kX2lkID09IFFTRU9TX1RFRV9PUEVOX1NFU1NJT04pIHx8CiAJCQkoY21kX2lkID09IFFTRU9TX1RFRV9SRVFVRVNUX0NBTkNFTExBVElPTikpIHsKLQkJcmV0ID0gX19xc2VlY29tX3VwZGF0ZV9xdGVlY19yZXFfYnVmKAorCQlyZXQyID0gX19xc2VlY29tX3VwZGF0ZV9xdGVlY19yZXFfYnVmKAogCQkJKHN0cnVjdCBxc2VlY29tX3F0ZWVjX21vZGZkX3JlcSAqKXJlcSwgZGF0YSwgdHJ1ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlpZiAocmV0MikKKwkJCXJldHVybiByZXQyOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHFzZWVjb21fcXRlZWNfb3Blbl9zZXNzaW9uKHN0cnVjdCBxc2VlY29tX2Rldl9oYW5kbGUgKmRhdGEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdWlkX3N5c19zdGF0cy5jIGIvZHJpdmVycy9taXNjL3VpZF9zeXNfc3RhdHMuYwppbmRleCA4YmY0YzU3Li43ZDY5ZGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvdWlkX3N5c19zdGF0cy5jCisrKyBiL2RyaXZlcnMvbWlzYy91aWRfc3lzX3N0YXRzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ydG11dGV4Lmg+CkBAIC01Myw2ICs1NCwxNSBAQAogI2RlZmluZSBVSURfU1RBVEVfREVBRF9UQVNLUwk0CiAjZGVmaW5lIFVJRF9TVEFURV9TSVpFCQk1CiAKKyNkZWZpbmUgTUFYX1RBU0tfQ09NTV9MRU4gMjU2CisKK3N0cnVjdCB0YXNrX2VudHJ5IHsKKwljaGFyIGNvbW1bTUFYX1RBU0tfQ09NTV9MRU5dOworCXBpZF90IHBpZDsKKwlzdHJ1Y3QgaW9fc3RhdHMgaW9bVUlEX1NUQVRFX1NJWkVdOworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2g7Cit9OworCiBzdHJ1Y3QgdWlkX2VudHJ5IHsKIAl1aWRfdCB1aWQ7CiAJY3B1dGltZV90IHV0aW1lOwpAQCAtNjIsOCArNzIsMjMxIEBACiAJaW50IHN0YXRlOwogCXN0cnVjdCBpb19zdGF0cyBpb1tVSURfU1RBVEVfU0laRV07CiAJc3RydWN0IGhsaXN0X25vZGUgaGFzaDsKKyNpZmRlZiBDT05GSUdfVUlEX1NZU19TVEFUU19ERUJVRworCURFQ0xBUkVfSEFTSFRBQkxFKHRhc2tfZW50cmllcywgVUlEX0hBU0hfQklUUyk7CisjZW5kaWYKIH07CiAKK3N0YXRpYyB1NjQgY29tcHV0ZV93cml0ZV9ieXRlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKHRhc2stPmlvYWMud3JpdGVfYnl0ZXMgPD0gdGFzay0+aW9hYy5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRhc2stPmlvYWMud3JpdGVfYnl0ZXMgLSB0YXNrLT5pb2FjLmNhbmNlbGxlZF93cml0ZV9ieXRlczsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9pb19idWNrZXRfc3RhdHMoc3RydWN0IGlvX3N0YXRzICppb19idWNrZXQsCisJCQkJCXN0cnVjdCBpb19zdGF0cyAqaW9fY3VyciwKKwkJCQkJc3RydWN0IGlvX3N0YXRzICppb19sYXN0LAorCQkJCQlzdHJ1Y3QgaW9fc3RhdHMgKmlvX2RlYWQpCit7CisJLyogdGFza3MgY291bGQgc3dpdGNoIHRvIGFub3RoZXIgdWlkIGdyb3VwLCBidXQgaXRzIGlvX2xhc3QgaW4gdGhlCisJICogcHJldmlvdXMgdWlkIGdyb3VwIGNvdWxkIHN0aWxsIGJlIHBvc2l0aXZlLgorCSAqIHRoZXJlZm9yZSBiZWZvcmUgZWFjaCB1cGRhdGUsIGRvIGFuIG92ZXJmbG93IGNoZWNrIGZpcnN0CisJICovCisJaW50NjRfdCBkZWx0YTsKKworCWRlbHRhID0gaW9fY3Vyci0+cmVhZF9ieXRlcyArIGlvX2RlYWQtPnJlYWRfYnl0ZXMgLQorCQlpb19sYXN0LT5yZWFkX2J5dGVzOworCWlvX2J1Y2tldC0+cmVhZF9ieXRlcyArPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDA7CisJZGVsdGEgPSBpb19jdXJyLT53cml0ZV9ieXRlcyArIGlvX2RlYWQtPndyaXRlX2J5dGVzIC0KKwkJaW9fbGFzdC0+d3JpdGVfYnl0ZXM7CisJaW9fYnVja2V0LT53cml0ZV9ieXRlcyArPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDA7CisJZGVsdGEgPSBpb19jdXJyLT5yY2hhciArIGlvX2RlYWQtPnJjaGFyIC0gaW9fbGFzdC0+cmNoYXI7CisJaW9fYnVja2V0LT5yY2hhciArPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDA7CisJZGVsdGEgPSBpb19jdXJyLT53Y2hhciArIGlvX2RlYWQtPndjaGFyIC0gaW9fbGFzdC0+d2NoYXI7CisJaW9fYnVja2V0LT53Y2hhciArPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDA7CisJZGVsdGEgPSBpb19jdXJyLT5mc3luYyArIGlvX2RlYWQtPmZzeW5jIC0gaW9fbGFzdC0+ZnN5bmM7CisJaW9fYnVja2V0LT5mc3luYyArPSBkZWx0YSA+IDAgPyBkZWx0YSA6IDA7CisKKwlpb19sYXN0LT5yZWFkX2J5dGVzID0gaW9fY3Vyci0+cmVhZF9ieXRlczsKKwlpb19sYXN0LT53cml0ZV9ieXRlcyA9IGlvX2N1cnItPndyaXRlX2J5dGVzOworCWlvX2xhc3QtPnJjaGFyID0gaW9fY3Vyci0+cmNoYXI7CisJaW9fbGFzdC0+d2NoYXIgPSBpb19jdXJyLT53Y2hhcjsKKwlpb19sYXN0LT5mc3luYyA9IGlvX2N1cnItPmZzeW5jOworCisJbWVtc2V0KGlvX2RlYWQsIDAsIHNpemVvZihzdHJ1Y3QgaW9fc3RhdHMpKTsKK30KKworI2lmZGVmIENPTkZJR19VSURfU1lTX1NUQVRTX0RFQlVHCitzdGF0aWMgdm9pZCBnZXRfZnVsbF90YXNrX2NvbW0oc3RydWN0IHRhc2tfZW50cnkgKnRhc2tfZW50cnksCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpbnQgaSA9IDAsIG9mZnNldCA9IDAsIGxlbiA9IDA7CisJLyogc2F2ZSBvbmUgYnl0ZSBmb3IgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KKwlpbnQgdW51c2VkX2xlbiA9IE1BWF9UQVNLX0NPTU1fTEVOIC0gVEFTS19DT01NX0xFTiAtIDE7CisJY2hhciBidWZbdW51c2VkX2xlbl07CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0YXNrLT5tbTsKKworCS8qIGZpbGwgdGhlIGZpcnN0IFRBU0tfQ09NTV9MRU4gYnl0ZXMgd2l0aCB0aHJlYWQgbmFtZSAqLworCWdldF90YXNrX2NvbW0odGFza19lbnRyeS0+Y29tbSwgdGFzayk7CisJaSA9IHN0cmxlbih0YXNrX2VudHJ5LT5jb21tKTsKKwl3aGlsZSAoaSA8IFRBU0tfQ09NTV9MRU4pCisJCXRhc2tfZW50cnktPmNvbW1baSsrXSA9ICcgJzsKKworCS8qIG5leHQgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lICovCisJaWYgKG1tKSB7CisJCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJaWYgKG1tLT5leGVfZmlsZSkgeworCQkJY2hhciAqcGF0aG5hbWUgPSBkX3BhdGgoJm1tLT5leGVfZmlsZS0+Zl9wYXRoLCBidWYsCisJCQkJCXVudXNlZF9sZW4pOworCisJCQlpZiAoIUlTX0VSUihwYXRobmFtZSkpIHsKKwkJCQlsZW4gPSBzdHJsY3B5KHRhc2tfZW50cnktPmNvbW0gKyBpLCBwYXRobmFtZSwKKwkJCQkJCXVudXNlZF9sZW4pOworCQkJCWkgKz0gbGVuOworCQkJCXRhc2tfZW50cnktPmNvbW1baSsrXSA9ICcgJzsKKwkJCQl1bnVzZWRfbGVuLS07CisJCQl9CisJCX0KKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwl9CisJdW51c2VkX2xlbiAtPSBsZW47CisKKwkvKiBmaWxsIHRoZSByZXN0IHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50CisJICogcmVwbGFjZSBlYWNoIG51bGwgb3IgbmV3IGxpbmUgY2hhcmFjdGVyCisJICogYmV0d2VlbiBhcmdzIGluIGFyZ3Ygd2l0aCB3aGl0ZXNwYWNlICovCisJbGVuID0gZ2V0X2NtZGxpbmUodGFzaywgYnVmLCB1bnVzZWRfbGVuKTsKKwl3aGlsZSAob2Zmc2V0IDwgbGVuKSB7CisJCWlmIChidWZbb2Zmc2V0XSAhPSAnXDAnICYmIGJ1ZltvZmZzZXRdICE9ICdcbicpCisJCQl0YXNrX2VudHJ5LT5jb21tW2krK10gPSBidWZbb2Zmc2V0XTsKKwkJZWxzZQorCQkJdGFza19lbnRyeS0+Y29tbVtpKytdID0gJyAnOworCQlvZmZzZXQrKzsKKwl9CisKKwkvKiBnZXQgcmlkIG9mIHRyYWlsaW5nIHdoaXRlc3BhY2VzIGluIGNhc2Ugd2hlbiBhcmcgaXMgbWVtc2V0IHRvCisJICogemVybyBiZWZvcmUgYmVpbmcgcmVzZXQgaW4gdXNlcnNwYWNlCisJICovCisJd2hpbGUgKHRhc2tfZW50cnktPmNvbW1baS0xXSA9PSAnICcpCisJCWktLTsKKwl0YXNrX2VudHJ5LT5jb21tW2ldID0gJ1wwJzsKK30KKworc3RhdGljIHN0cnVjdCB0YXNrX2VudHJ5ICpmaW5kX3Rhc2tfZW50cnkoc3RydWN0IHVpZF9lbnRyeSAqdWlkX2VudHJ5LAorCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHRhc2tfZW50cnkgKnRhc2tfZW50cnk7CisKKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlKHVpZF9lbnRyeS0+dGFza19lbnRyaWVzLCB0YXNrX2VudHJ5LCBoYXNoLAorCQkJdGFzay0+cGlkKSB7CisJCWlmICh0YXNrLT5waWQgPT0gdGFza19lbnRyeS0+cGlkKSB7CisJCQkvKiBpZiB0aHJlYWQgbmFtZSBjaGFuZ2VkLCB1cGRhdGUgdGhlIGVudGlyZSBjb21tYW5kICovCisJCQlpbnQgbGVuID0gc3RybmNocih0YXNrX2VudHJ5LT5jb21tLCAnICcsIFRBU0tfQ09NTV9MRU4pCisJCQkJLSB0YXNrX2VudHJ5LT5jb21tOworCisJCQlpZiAoc3RybmNtcCh0YXNrX2VudHJ5LT5jb21tLCB0YXNrLT5jb21tLCBsZW4pKQorCQkJCWdldF9mdWxsX3Rhc2tfY29tbSh0YXNrX2VudHJ5LCB0YXNrKTsKKwkJCXJldHVybiB0YXNrX2VudHJ5OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfZW50cnkgKmZpbmRfb3JfcmVnaXN0ZXJfdGFzayhzdHJ1Y3QgdWlkX2VudHJ5ICp1aWRfZW50cnksCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgdGFza19lbnRyeSAqdGFza19lbnRyeTsKKwlwaWRfdCBwaWQgPSB0YXNrLT5waWQ7CisKKwl0YXNrX2VudHJ5ID0gZmluZF90YXNrX2VudHJ5KHVpZF9lbnRyeSwgdGFzayk7CisJaWYgKHRhc2tfZW50cnkpCisJCXJldHVybiB0YXNrX2VudHJ5OworCisJdGFza19lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YXNrX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0YXNrX2VudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCWdldF9mdWxsX3Rhc2tfY29tbSh0YXNrX2VudHJ5LCB0YXNrKTsKKworCXRhc2tfZW50cnktPnBpZCA9IHBpZDsKKwloYXNoX2FkZCh1aWRfZW50cnktPnRhc2tfZW50cmllcywgJnRhc2tfZW50cnktPmhhc2gsICh1bnNpZ25lZCBpbnQpcGlkKTsKKworCXJldHVybiB0YXNrX2VudHJ5OworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfdWlkX3Rhc2tzKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkKK3sKKwlzdHJ1Y3QgdGFza19lbnRyeSAqdGFza19lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGJrdF90YXNrOworCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfdGFzazsKKworCWhhc2hfZm9yX2VhY2hfc2FmZSh1aWRfZW50cnktPnRhc2tfZW50cmllcywgYmt0X3Rhc2ssCisJCQl0bXBfdGFzaywgdGFza19lbnRyeSwgaGFzaCkgeworCQloYXNoX2RlbCgmdGFza19lbnRyeS0+aGFzaCk7CisJCWtmcmVlKHRhc2tfZW50cnkpOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2lvX3VpZF90YXNrc196ZXJvKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkKK3sKKwlzdHJ1Y3QgdGFza19lbnRyeSAqdGFza19lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGJrdF90YXNrOworCisJaGFzaF9mb3JfZWFjaCh1aWRfZW50cnktPnRhc2tfZW50cmllcywgYmt0X3Rhc2ssIHRhc2tfZW50cnksIGhhc2gpIHsKKwkJbWVtc2V0KCZ0YXNrX2VudHJ5LT5pb1tVSURfU1RBVEVfVE9UQUxfQ1VSUl0sIDAsCisJCQlzaXplb2Yoc3RydWN0IGlvX3N0YXRzKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfdWlkX3Rhc2tzX2lvX3N0YXRzKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSwKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgc2xvdCkKK3sKKwlzdHJ1Y3QgdGFza19lbnRyeSAqdGFza19lbnRyeSA9IGZpbmRfb3JfcmVnaXN0ZXJfdGFzayh1aWRfZW50cnksIHRhc2spOworCXN0cnVjdCBpb19zdGF0cyAqdGFza19pb19zbG90ID0gJnRhc2tfZW50cnktPmlvW3Nsb3RdOworCisJdGFza19pb19zbG90LT5yZWFkX2J5dGVzICs9IHRhc2stPmlvYWMucmVhZF9ieXRlczsKKwl0YXNrX2lvX3Nsb3QtPndyaXRlX2J5dGVzICs9IGNvbXB1dGVfd3JpdGVfYnl0ZXModGFzayk7CisJdGFza19pb19zbG90LT5yY2hhciArPSB0YXNrLT5pb2FjLnJjaGFyOworCXRhc2tfaW9fc2xvdC0+d2NoYXIgKz0gdGFzay0+aW9hYy53Y2hhcjsKKwl0YXNrX2lvX3Nsb3QtPmZzeW5jICs9IHRhc2stPmlvYWMuc3lzY2ZzOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2lvX3VpZF90YXNrcyhzdHJ1Y3QgdWlkX2VudHJ5ICp1aWRfZW50cnkpCit7CisJc3RydWN0IHRhc2tfZW50cnkgKnRhc2tfZW50cnk7CisJdW5zaWduZWQgbG9uZyBia3RfdGFzazsKKworCWhhc2hfZm9yX2VhY2godWlkX2VudHJ5LT50YXNrX2VudHJpZXMsIGJrdF90YXNrLCB0YXNrX2VudHJ5LCBoYXNoKSB7CisJCWNvbXB1dGVfaW9fYnVja2V0X3N0YXRzKCZ0YXNrX2VudHJ5LT5pb1t1aWRfZW50cnktPnN0YXRlXSwKKwkJCQkJJnRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9UT1RBTF9DVVJSXSwKKwkJCQkJJnRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9UT1RBTF9MQVNUXSwKKwkJCQkJJnRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9ERUFEX1RBU0tTXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2lvX3VpZF90YXNrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkKK3sKKwlzdHJ1Y3QgdGFza19lbnRyeSAqdGFza19lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGJrdF90YXNrOworCisJaGFzaF9mb3JfZWFjaCh1aWRfZW50cnktPnRhc2tfZW50cmllcywgYmt0X3Rhc2ssIHRhc2tfZW50cnksIGhhc2gpIHsKKwkJLyogU2VwYXJhdGVkIGJ5IGNvbW1hIGJlY2F1c2Ugc3BhY2UgZXhpc3RzIGluIHRhc2sgY29tbSAqLworCQlzZXFfcHJpbnRmKG0sICJ0YXNrLCVzLCVsdSwlbGx1LCVsbHUsJWxsdSwlbGx1LCVsbHUsJWxsdSwlbGx1LCVsbHUsJWxsdSwlbGx1XG4iLAorCQkJCXRhc2tfZW50cnktPmNvbW0sCisJCQkJKHVuc2lnbmVkIGxvbmcpdGFza19lbnRyeS0+cGlkLAorCQkJCXRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9GT1JFR1JPVU5EXS5yY2hhciwKKwkJCQl0YXNrX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ud2NoYXIsCisJCQkJdGFza19lbnRyeS0+aW9bVUlEX1NUQVRFX0ZPUkVHUk9VTkRdLnJlYWRfYnl0ZXMsCisJCQkJdGFza19lbnRyeS0+aW9bVUlEX1NUQVRFX0ZPUkVHUk9VTkRdLndyaXRlX2J5dGVzLAorCQkJCXRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS5yY2hhciwKKwkJCQl0YXNrX2VudHJ5LT5pb1tVSURfU1RBVEVfQkFDS0dST1VORF0ud2NoYXIsCisJCQkJdGFza19lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLnJlYWRfYnl0ZXMsCisJCQkJdGFza19lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLndyaXRlX2J5dGVzLAorCQkJCXRhc2tfZW50cnktPmlvW1VJRF9TVEFURV9GT1JFR1JPVU5EXS5mc3luYywKKwkJCQl0YXNrX2VudHJ5LT5pb1tVSURfU1RBVEVfQkFDS0dST1VORF0uZnN5bmMpOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCByZW1vdmVfdWlkX3Rhc2tzKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkge307CitzdGF0aWMgdm9pZCBzZXRfaW9fdWlkX3Rhc2tzX3plcm8oc3RydWN0IHVpZF9lbnRyeSAqdWlkX2VudHJ5KSB7fTsKK3N0YXRpYyB2b2lkIGFkZF91aWRfdGFza3NfaW9fc3RhdHMoc3RydWN0IHVpZF9lbnRyeSAqdWlkX2VudHJ5LAorCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBzbG90KSB7fTsKK3N0YXRpYyB2b2lkIGNvbXB1dGVfaW9fdWlkX3Rhc2tzKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkge307CitzdGF0aWMgdm9pZCBzaG93X2lvX3VpZF90YXNrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCXN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSkge30KKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHVpZF9lbnRyeSAqZmluZF91aWRfZW50cnkodWlkX3QgdWlkKQogewogCXN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeTsKQEAgLTg3LDcgKzMyMCw5IEBACiAJCXJldHVybiBOVUxMOwogCiAJdWlkX2VudHJ5LT51aWQgPSB1aWQ7Ci0KKyNpZmRlZiBDT05GSUdfVUlEX1NZU19TVEFUU19ERUJVRworCWhhc2hfaW5pdCh1aWRfZW50cnktPnRhc2tfZW50cmllcyk7CisjZW5kaWYKIAloYXNoX2FkZChoYXNoX3RhYmxlLCAmdWlkX2VudHJ5LT5oYXNoLCB1aWQpOwogCiAJcmV0dXJuIHVpZF9lbnRyeTsKQEAgLTE5Myw2ICs0MjgsNyBAQAogCQloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlX3NhZmUoaGFzaF90YWJsZSwgdWlkX2VudHJ5LCB0bXAsCiAJCQkJCQkJaGFzaCwgKHVpZF90KXVpZF9zdGFydCkgewogCQkJaWYgKHVpZF9zdGFydCA9PSB1aWRfZW50cnktPnVpZCkgeworCQkJCXJlbW92ZV91aWRfdGFza3ModWlkX2VudHJ5KTsKIAkJCQloYXNoX2RlbCgmdWlkX2VudHJ5LT5oYXNoKTsKIAkJCQlrZnJlZSh1aWRfZW50cnkpOwogCQkJfQpAQCAtMjA5LDEzICs0NDUsNiBAQAogCS53cml0ZQkJPSB1aWRfcmVtb3ZlX3dyaXRlLAogfTsKIAotc3RhdGljIHU2NCBjb21wdXRlX3dyaXRlX2J5dGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlpZiAodGFzay0+aW9hYy53cml0ZV9ieXRlcyA8PSB0YXNrLT5pb2FjLmNhbmNlbGxlZF93cml0ZV9ieXRlcykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gdGFzay0+aW9hYy53cml0ZV9ieXRlcyAtIHRhc2stPmlvYWMuY2FuY2VsbGVkX3dyaXRlX2J5dGVzOwotfQogCiBzdGF0aWMgdm9pZCBhZGRfdWlkX2lvX3N0YXRzKHN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeSwKIAkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHNsb3QpCkBAIC0yMjcsMjggKzQ1Niw4IEBACiAJaW9fc2xvdC0+cmNoYXIgKz0gdGFzay0+aW9hYy5yY2hhcjsKIAlpb19zbG90LT53Y2hhciArPSB0YXNrLT5pb2FjLndjaGFyOwogCWlvX3Nsb3QtPmZzeW5jICs9IHRhc2stPmlvYWMuc3lzY2ZzOwotfQogCi1zdGF0aWMgdm9pZCBjb21wdXRlX3VpZF9pb19idWNrZXRfc3RhdHMoc3RydWN0IGlvX3N0YXRzICppb19idWNrZXQsCi0JCQkJCXN0cnVjdCBpb19zdGF0cyAqaW9fY3VyciwKLQkJCQkJc3RydWN0IGlvX3N0YXRzICppb19sYXN0LAotCQkJCQlzdHJ1Y3QgaW9fc3RhdHMgKmlvX2RlYWQpCi17Ci0JaW9fYnVja2V0LT5yZWFkX2J5dGVzICs9IGlvX2N1cnItPnJlYWRfYnl0ZXMgKyBpb19kZWFkLT5yZWFkX2J5dGVzIC0KLQkJaW9fbGFzdC0+cmVhZF9ieXRlczsKLQlpb19idWNrZXQtPndyaXRlX2J5dGVzICs9IGlvX2N1cnItPndyaXRlX2J5dGVzICsgaW9fZGVhZC0+d3JpdGVfYnl0ZXMgLQotCQlpb19sYXN0LT53cml0ZV9ieXRlczsKLQlpb19idWNrZXQtPnJjaGFyICs9IGlvX2N1cnItPnJjaGFyICsgaW9fZGVhZC0+cmNoYXIgLSBpb19sYXN0LT5yY2hhcjsKLQlpb19idWNrZXQtPndjaGFyICs9IGlvX2N1cnItPndjaGFyICsgaW9fZGVhZC0+d2NoYXIgLSBpb19sYXN0LT53Y2hhcjsKLQlpb19idWNrZXQtPmZzeW5jICs9IGlvX2N1cnItPmZzeW5jICsgaW9fZGVhZC0+ZnN5bmMgLSBpb19sYXN0LT5mc3luYzsKLQotCWlvX2xhc3QtPnJlYWRfYnl0ZXMgPSBpb19jdXJyLT5yZWFkX2J5dGVzOwotCWlvX2xhc3QtPndyaXRlX2J5dGVzID0gaW9fY3Vyci0+d3JpdGVfYnl0ZXM7Ci0JaW9fbGFzdC0+cmNoYXIgPSBpb19jdXJyLT5yY2hhcjsKLQlpb19sYXN0LT53Y2hhciA9IGlvX2N1cnItPndjaGFyOwotCWlvX2xhc3QtPmZzeW5jID0gaW9fY3Vyci0+ZnN5bmM7Ci0KLQltZW1zZXQoaW9fZGVhZCwgMCwgc2l6ZW9mKHN0cnVjdCBpb19zdGF0cykpOworCWFkZF91aWRfdGFza3NfaW9fc3RhdHModWlkX2VudHJ5LCB0YXNrLCBzbG90KTsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2lvX3N0YXRzX2FsbF9sb2NrZWQodm9pZCkKQEAgLTI1OSw5ICs0NjgsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGJrdDsKIAl1aWRfdCB1aWQ7CiAKLQloYXNoX2Zvcl9lYWNoKGhhc2hfdGFibGUsIGJrdCwgdWlkX2VudHJ5LCBoYXNoKQorCWhhc2hfZm9yX2VhY2goaGFzaF90YWJsZSwgYmt0LCB1aWRfZW50cnksIGhhc2gpIHsKIAkJbWVtc2V0KCZ1aWRfZW50cnktPmlvW1VJRF9TVEFURV9UT1RBTF9DVVJSXSwgMCwKIAkJCXNpemVvZihzdHJ1Y3QgaW9fc3RhdHMpKTsKKwkJc2V0X2lvX3VpZF90YXNrc196ZXJvKHVpZF9lbnRyeSk7CisJfQogCiAJcmN1X3JlYWRfbG9jaygpOwogCWRvX2VhY2hfdGhyZWFkKHRlbXAsIHRhc2spIHsKQEAgLTI3NSwxMCArNDg2LDExIEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAloYXNoX2Zvcl9lYWNoKGhhc2hfdGFibGUsIGJrdCwgdWlkX2VudHJ5LCBoYXNoKSB7Ci0JCWNvbXB1dGVfdWlkX2lvX2J1Y2tldF9zdGF0cygmdWlkX2VudHJ5LT5pb1t1aWRfZW50cnktPnN0YXRlXSwKKwkJY29tcHV0ZV9pb19idWNrZXRfc3RhdHMoJnVpZF9lbnRyeS0+aW9bdWlkX2VudHJ5LT5zdGF0ZV0sCiAJCQkJCSZ1aWRfZW50cnktPmlvW1VJRF9TVEFURV9UT1RBTF9DVVJSXSwKIAkJCQkJJnVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX1RPVEFMX0xBU1RdLAogCQkJCQkmdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfREVBRF9UQVNLU10pOworCQljb21wdXRlX2lvX3VpZF90YXNrcyh1aWRfZW50cnkpOwogCX0KIH0KIApAQCAtMjg5LDYgKzUwMSw3IEBACiAKIAltZW1zZXQoJnVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX1RPVEFMX0NVUlJdLCAwLAogCQlzaXplb2Yoc3RydWN0IGlvX3N0YXRzKSk7CisJc2V0X2lvX3VpZF90YXNrc196ZXJvKHVpZF9lbnRyeSk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZG9fZWFjaF90aHJlYWQodGVtcCwgdGFzaykgewpAQCAtMjk4LDEyICs1MTEsMTQgQEAKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKHRlbXAsIHRhc2spOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JY29tcHV0ZV91aWRfaW9fYnVja2V0X3N0YXRzKCZ1aWRfZW50cnktPmlvW3VpZF9lbnRyeS0+c3RhdGVdLAorCWNvbXB1dGVfaW9fYnVja2V0X3N0YXRzKCZ1aWRfZW50cnktPmlvW3VpZF9lbnRyeS0+c3RhdGVdLAogCQkJCSZ1aWRfZW50cnktPmlvW1VJRF9TVEFURV9UT1RBTF9DVVJSXSwKIAkJCQkmdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfVE9UQUxfTEFTVF0sCiAJCQkJJnVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0RFQURfVEFTS1NdKTsKKwljb21wdXRlX2lvX3VpZF90YXNrcyh1aWRfZW50cnkpOwogfQogCisKIHN0YXRpYyBpbnQgdWlkX2lvX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCB1aWRfZW50cnkgKnVpZF9lbnRyeTsKQEAgLTMxNSwyMSArNTMwLDIyIEBACiAKIAloYXNoX2Zvcl9lYWNoKGhhc2hfdGFibGUsIGJrdCwgdWlkX2VudHJ5LCBoYXNoKSB7CiAJCXNlcV9wcmludGYobSwgIiVkICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHVcbiIsCi0JCQl1aWRfZW50cnktPnVpZCwKLQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0ZPUkVHUk9VTkRdLnJjaGFyLAotCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ud2NoYXIsCi0JCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9GT1JFR1JPVU5EXS5yZWFkX2J5dGVzLAotCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ud3JpdGVfYnl0ZXMsCi0JCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS5yY2hhciwKLQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLndjaGFyLAotCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfQkFDS0dST1VORF0ucmVhZF9ieXRlcywKLQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLndyaXRlX2J5dGVzLAotCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0uZnN5bmMsCi0JCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS5mc3luYyk7CisJCQkJdWlkX2VudHJ5LT51aWQsCisJCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ucmNoYXIsCisJCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ud2NoYXIsCisJCQkJdWlkX2VudHJ5LT5pb1tVSURfU1RBVEVfRk9SRUdST1VORF0ucmVhZF9ieXRlcywKKwkJCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9GT1JFR1JPVU5EXS53cml0ZV9ieXRlcywKKwkJCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS5yY2hhciwKKwkJCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS53Y2hhciwKKwkJCQl1aWRfZW50cnktPmlvW1VJRF9TVEFURV9CQUNLR1JPVU5EXS5yZWFkX2J5dGVzLAorCQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLndyaXRlX2J5dGVzLAorCQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0ZPUkVHUk9VTkRdLmZzeW5jLAorCQkJCXVpZF9lbnRyeS0+aW9bVUlEX1NUQVRFX0JBQ0tHUk9VTkRdLmZzeW5jKTsKKworCQlzaG93X2lvX3VpZF90YXNrcyhtLCB1aWRfZW50cnkpOwogCX0KIAogCXJ0X211dGV4X3VubG9jaygmdWlkX2xvY2spOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCAxMjBmZDU0Li5lYjE0ZjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0zNTE4LDE1ICszNTE4LDIzIEBACiAJLyogUkVEIGVycm9yIC0gRmF0YWw6IHJlcXVpcmVzIHJlc2V0ICovCiAJaWYgKG1ycS0+Y21kcV9yZXEtPnJlc3BfZXJyKSB7CiAJCWVyciA9IG1ycS0+Y21kcV9yZXEtPnJlc3BfZXJyOworCQlnb3RvIHJlc2V0OworCX0KKworCS8qCisJICogVElNRU9VVCBlcnJyb3JzIGNhbiBoYXBwZW4gYmVjYXVzZSBvZiBleGVjdXRpb24gZXJyb3IKKwkgKiBpbiB0aGUgbGFzdCBjb21tYW5kLiBTbyBzZW5kIGNtZCAxMyB0byBnZXQgZGV2aWNlIHN0YXR1cworCSAqLworCWlmICgobXJxLT5jbWQgJiYgKG1ycS0+Y21kLT5lcnJvciA9PSAtRVRJTUVET1VUKSkgfHwKKwkJCShtcnEtPmRhdGEgJiYgKG1ycS0+ZGF0YS0+ZXJyb3IgPT0gLUVUSU1FRE9VVCkpKSB7CiAJCWlmIChtbWNfaG9zdF9oYWx0KGhvc3QpIHx8IG1tY19ob3N0X2NxX2Rpc2FibGUoaG9zdCkpIHsKIAkJCXJldCA9IGdldF9jYXJkX3N0YXR1cyhob3N0LT5jYXJkLCAmc3RhdHVzLCAwKTsKIAkJCWlmIChyZXQpCiAJCQkJcHJfZXJyKCIlczogQ01EMTMgZmFpbGVkIHdpdGggZXJyICVkXG4iLAogCQkJCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCByZXQpOwogCQl9Ci0JCXByX2VycigiJXM6IFJlc3BvbnNlIGVycm9yIGRldGVjdGVkIHdpdGggZGV2aWNlIHN0YXR1cyAweCUwOHhcbiIsCisJCXByX2VycigiJXM6IFRpbWVvdXQgZXJyb3IgZGV0ZWN0ZWQgd2l0aCBkZXZpY2Ugc3RhdHVzIDB4JTA4eFxuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0KSwgc3RhdHVzKTsKLQkJZ290byByZXNldDsKIAl9CiAKIAkvKgpAQCAtMzU3Miw3ICszNTgwLDcgQEAKIAllbHNlIGlmIChtcnEtPmRhdGEgJiYgbXJxLT5kYXRhLT5lcnJvcikKIAkJZXJyID0gbXJxLT5kYXRhLT5lcnJvcjsKIAotCWlmIChlcnIgfHwgY21kcV9yZXEtPnJlc3BfZXJyKSB7CisJaWYgKChlcnIgfHwgY21kcV9yZXEtPnJlc3BfZXJyKSAmJiAhY21kcV9yZXEtPnNraXBfZXJyX2hhbmRsaW5nKSB7CiAJCXByX2VycigiJXM6ICVzOiB0eGZyIGVycm9yKCVkKS9yZXNwX2VyciglZClcbiIsCiAJCQkJbW1jX2hvc3RuYW1lKG1ycS0+aG9zdCksIF9fZnVuY19fLCBlcnIsCiAJCQkJY21kcV9yZXEtPnJlc3BfZXJyKTsKQEAgLTM2MDksNiArMzYxNywxNyBAQAogCQlibGtfZW5kX3JlcXVlc3RfYWxsKHJxLCBlcnIpOwogCQlnb3RvIG91dDsKIAl9CisJLyoKKwkgKiBJbiBjYXNlIG9mIGVycm9yLCBjbWRxX3JlcS0+ZGF0YS5ieXRlc194ZmVyZWQgaXMgc2V0IHRvIDAuCisJICogSWYgd2UgY2FsbCBibGtfZW5kX3JlcXVlc3QoKSB3aXRoIG5yX2J5dGVzIGFzIDAgdGhlbiB0aGUgcmVxdWVzdAorCSAqIG5ldmVyIGdldHMgY29tcGxldGVkLiBTbyBpbiBjYXNlIG9mIGVycm9yLCB0byBjb21wbGV0ZSBhIHJlcXVlc3QKKwkgKiB3aXRoIGVycm9yIHdlIHNob3VsZCB1c2UgYmxrX2VuZF9yZXF1ZXN0X2FsbCgpLgorCSAqLworCWlmIChlcnIgJiYgY21kcV9yZXEtPnNraXBfZXJyX2hhbmRsaW5nKSB7CisJCWNtZHFfcmVxLT5za2lwX2Vycl9oYW5kbGluZyA9IGZhbHNlOworCQlibGtfZW5kX3JlcXVlc3RfYWxsKHJxLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CiAKIAlibGtfZW5kX3JlcXVlc3QocnEsIGVyciwgY21kcV9yZXEtPmRhdGEuYnl0ZXNfeGZlcmVkKTsKIApAQCAtMzg4OSw2ICszOTA4LDcgQEAKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OwogCXN0cnVjdCBtbWNfY21kcV9jb250ZXh0X2luZm8gKmN0eCA9ICZob3N0LT5jbWRxX2N0eDsKIAl1OCBwYXJ0X2NvbmZpZyA9IGNhcmQtPmV4dF9jc2QucGFydF9jb25maWc7CisJaW50IHJldCA9IDAsIGVyciA9IDA7CiAKIAlpZiAoKG1haW5fbWQtPnBhcnRfY3VyciA9PSBtZC0+cGFydF90eXBlKSAmJgogCSAgICAoY2FyZC0+cGFydF9jdXJyID09IG1kLT5wYXJ0X3R5cGUpKQpAQCAtMzg5OCw0MCArMzkxOCw3MCBAQAogCQkgY2FyZC0+ZXh0X2NzZC5jbWRxX3N1cHBvcnQgJiYKIAkJIChtZC0+ZmxhZ3MgJiBNTUNfQkxLX0NNRF9RVUVVRSkpKTsKIAotCWlmICghdGVzdF9iaXQoQ01EUV9TVEFURV9IQUxULCAmY3R4LT5jdXJyX3N0YXRlKSkKLQkJV0FSTl9PTihtbWNfY21kcV9oYWx0KGhvc3QsIHRydWUpKTsKKwlpZiAoIXRlc3RfYml0KENNRFFfU1RBVEVfSEFMVCwgJmN0eC0+Y3Vycl9zdGF0ZSkpIHsKKwkJcmV0ID0gbW1jX2NtZHFfaGFsdChob3N0LCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogJXM6IGhhbHQ6IGZhaWxlZDogJWRcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBfX2Z1bmNfXywgIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KIAogCS8qIGRpc2FibGUgQ1EgbW9kZSBpbiBjYXJkICovCiAJaWYgKG1tY19jYXJkX2NtZHEoY2FyZCkpIHsKLQkJV0FSTl9PTihtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJCXJldCA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKIAkJCQkgRVhUX0NTRF9DTURRLCAwLAotCQkJCSAgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSkpOworCQkJCSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogJXM6IGNtZHEgbW9kZSBkaXNhYmxlIGZhaWxlZCAlZFxuIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdCksIF9fZnVuY19fLCByZXQpOworCQkJZ290byBjbWRxX3VuaGFsdDsKKwkJfQogCQltbWNfY2FyZF9jbHJfY21kcShjYXJkKTsKIAl9CiAKIAlwYXJ0X2NvbmZpZyAmPSB+RVhUX0NTRF9QQVJUX0NPTkZJR19BQ0NfTUFTSzsKIAlwYXJ0X2NvbmZpZyB8PSBtZC0+cGFydF90eXBlOwogCi0JV0FSTl9PTihtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCisJcmV0ID0gbW1jX3N3aXRjaChjYXJkLCBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMLAogCQkJIEVYVF9DU0RfUEFSVF9DT05GSUcsIHBhcnRfY29uZmlnLAotCQkJICBjYXJkLT5leHRfY3NkLnBhcnRfdGltZSkpOworCQkJIGNhcmQtPmV4dF9jc2QucGFydF90aW1lKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6ICVzOiBtbWNfc3dpdGNoIGZhaWx1cmUsICVkIC0+ICVkICwgZXJyID0gJWRcbiIsCisJCQltbWNfaG9zdG5hbWUoaG9zdCksIF9fZnVuY19fLCBtYWluX21kLT5wYXJ0X2N1cnIsCisJCQltZC0+cGFydF90eXBlLCByZXQpOworCQlnb3RvIGNtZHFfc3dpdGNoOworCX0KIAogCWNhcmQtPmV4dF9jc2QucGFydF9jb25maWcgPSBwYXJ0X2NvbmZpZzsKIAljYXJkLT5wYXJ0X2N1cnIgPSBtZC0+cGFydF90eXBlOwogCiAJbWFpbl9tZC0+cGFydF9jdXJyID0gbWQtPnBhcnRfdHlwZTsKIAotCVdBUk5fT04obW1jX2Jsa19jbWRxX3N3aXRjaChjYXJkLCBtZCwgdHJ1ZSkpOwotCVdBUk5fT04obW1jX2NtZHFfaGFsdChob3N0LCBmYWxzZSkpOwotCi0JcmV0dXJuIDA7CitjbWRxX3N3aXRjaDoKKwllcnIgPSBtbWNfYmxrX2NtZHFfc3dpdGNoKGNhcmQsIG1kLCB0cnVlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiJXM6ICVzOiBtbWNfYmxrX2NtZHFfc3dpdGNoIGZhaWxlZDogJWRcbiIsCisJCQltbWNfaG9zdG5hbWUoaG9zdCksIF9fZnVuY19fLCAgZXJyKTsKKwkJcmV0ID0gZXJyOworCX0KK2NtZHFfdW5oYWx0OgorCWVyciA9IG1tY19jbWRxX2hhbHQoaG9zdCwgZmFsc2UpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIlczogJXM6IHVuaGFsdDogZmFpbGVkOiAlZFxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0KSwgX19mdW5jX18sICBlcnIpOworCQlyZXQgPSBlcnI7CisJfQorb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbW1jX2Jsa19jbWRxX2lzc3VlX3JxKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewotCWludCByZXQ7CisJaW50IHJldCwgZXJyID0gMDsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOworCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAKIAltbWNfZ2V0X2NhcmQoY2FyZCk7CiAKQEAgLTM5NTIsOSArNDAwMiwyMCBAQAogCiAJcmV0ID0gbW1jX2Jsa19jbWRxX3BhcnRfc3dpdGNoKGNhcmQsIG1kKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6ICVzOiBwYXJ0aXRpb24gc3dpdGNoIGZhaWxlZCAlZFxuIiwKKwkJcHJfZXJyKCIlczogJXM6IHBhcnRpdGlvbiBzd2l0Y2ggZmFpbGVkICVkLCByZXNldHRpbmcgY21kcVxuIiwKIAkJCQltZC0+ZGlzay0+ZGlza19uYW1lLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBvdXQ7CisKKwkJbW1jX2Jsa19jbWRxX3Jlc2V0KGhvc3QsIGZhbHNlKTsKKwkJZXJyID0gbW1jX2Jsa19jbWRxX3BhcnRfc3dpdGNoKGNhcmQsIG1kKTsKKwkJaWYgKCFlcnIpIHsKKwkJCXByX2VycigiJXM6ICVzOiBwYXJ0aXRpb24gc3dpdGNoIHN1Y2Nlc3MgZXJyID0gJWRcbiIsCisJCQkJbWQtPmRpc2stPmRpc2tfbmFtZSwgX19mdW5jX18sIGVycik7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIiVzOiAlczogcGFydGl0aW9uIHN3aXRjaCBmYWlsZWQgZXJyID0gJWRcbiIsCisJCQkJbWQtPmRpc2stPmRpc2tfbmFtZSwgX19mdW5jX18sIGVycik7CisJCQlyZXQgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWlmIChyZXEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMgYi9kcml2ZXJzL21tYy9jb3JlL2J1cy5jCmluZGV4IGE1MzFjYjQuLmEzNzhiOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvYnVzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9idXMuYwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJCXJldHVybiByZXQ7CiAKIAltbWNfY2FyZF9zZXRfcHJlc2VudChjYXJkKTsKKwlkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoJmNhcmQtPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggOTc4ZGQ5YS4uNzI3YjMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTM0MDcsNiArMzQwNywxMyBAQAogCQlwbV93YWtldXBfZXZlbnQobW1jX2Rldihob3N0KSwgNTAwMCk7CiAKIAlob3N0LT5kZXRlY3RfY2hhbmdlID0gMTsKKwkvKgorCSAqIENoYW5nZSBpbiBjZF9ncGlvIHN0YXRlLCBzbyBtYWtlIHN1cmUgZGV0ZWN0aW9uIHBhcnQgaXMKKwkgKiBub3Qgb3ZlcmlkZWQgYmVjYXVzZSBvZiBtYW51YWwgcmVzdW1lLgorCSAqLworCWlmIChjZF9pcnEgJiYgbW1jX2J1c19tYW51YWxfcmVzdW1lKGhvc3QpKQorCQlob3N0LT5pZ25vcmVfYnVzX3Jlc3VtZV9mbGFncyA9IHRydWU7CisKIAltbWNfc2NoZWR1bGVfZGVsYXllZF93b3JrKCZob3N0LT5kZXRlY3QsIGRlbGF5KTsKIH0KIApAQCAtNDM4Nyw2ICs0Mzk0LDggQEAKIAkJaG9zdC0+YnVzX29wcy0+ZGV0ZWN0KGhvc3QpOwogCiAJaG9zdC0+ZGV0ZWN0X2NoYW5nZSA9IDA7CisJaWYgKGhvc3QtPmlnbm9yZV9idXNfcmVzdW1lX2ZsYWdzKQorCQlob3N0LT5pZ25vcmVfYnVzX3Jlc3VtZV9mbGFncyA9IGZhbHNlOwogCiAJLyoKIAkgKiBMZXQgbW1jX2J1c19wdXQoKSBmcmVlIHRoZSBidXMvYnVzX29wcyBpZiB3ZSd2ZSBmb3VuZCB0aGF0CkBAIC00NjQzLDcgKzQ2NTIsOCBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCWhvc3QtPnJlc2Nhbl9kaXNhYmxlID0gMDsKLQkJaWYgKG1tY19idXNfbWFudWFsX3Jlc3VtZShob3N0KSkgeworCQlpZiAobW1jX2J1c19tYW51YWxfcmVzdW1lKGhvc3QpICYmCisJCQkJIWhvc3QtPmlnbm9yZV9idXNfcmVzdW1lX2ZsYWdzKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9ob3N0LmMgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwppbmRleCAxMjdhYjBmLi42NGM4NzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYwpAQCAtNDgyLDE5ICs0ODIsMTcgQEAKICAqLwogaW50IG1tY19vZl9wYXJzZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBob3N0LT5wYXJlbnQ7CiAJdTMyIGJ1c193aWR0aDsKIAlpbnQgcmV0OwogCWJvb2wgY2RfY2FwX2ludmVydCwgY2RfZ3Bpb19pbnZlcnQgPSBmYWxzZTsKIAlib29sIHJvX2NhcF9pbnZlcnQsIHJvX2dwaW9faW52ZXJ0ID0gZmFsc2U7CiAKLQlpZiAoIWhvc3QtPnBhcmVudCB8fCAhaG9zdC0+cGFyZW50LT5vZl9ub2RlKQorCWlmICghZGV2IHx8ICFkZXZfZndub2RlKGRldikpCiAJCXJldHVybiAwOwogCi0JbnAgPSBob3N0LT5wYXJlbnQtPm9mX25vZGU7Ci0KIAkvKiAiYnVzLXdpZHRoIiBpcyB0cmFuc2xhdGVkIHRvIE1NQ19DQVBfKl9CSVRfREFUQSBmbGFncyAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImJ1cy13aWR0aCIsICZidXNfd2lkdGgpIDwgMCkgeworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiYnVzLXdpZHRoIiwgJmJ1c193aWR0aCkgPCAwKSB7CiAJCWRldl9kYmcoaG9zdC0+cGFyZW50LAogCQkJIlwiYnVzLXdpZHRoXCIgcHJvcGVydHkgaXMgbWlzc2luZywgYXNzdW1pbmcgMSBiaXQuXG4iKTsKIAkJYnVzX3dpZHRoID0gMTsKQEAgLTUxNiw3ICs1MTQsNyBAQAogCX0KIAogCS8qIGZfbWF4IGlzIG9idGFpbmVkIGZyb20gdGhlIG9wdGlvbmFsICJtYXgtZnJlcXVlbmN5IiBwcm9wZXJ0eSAqLwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4LWZyZXF1ZW5jeSIsICZob3N0LT5mX21heCk7CisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgIm1heC1mcmVxdWVuY3kiLCAmaG9zdC0+Zl9tYXgpOwogCiAJLyoKIAkgKiBDb25maWd1cmUgQ0QgYW5kIFdQIHBpbnMuIFRoZXkgYXJlIGJvdGggYnkgZGVmYXVsdCBhY3RpdmUgbG93IHRvCkBAIC01MzEsMTIgKzUyOSwxMiBAQAogCSAqLwogCiAJLyogUGFyc2UgQ2FyZCBEZXRlY3Rpb24gKi8KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAibm9uLXJlbW92YWJsZSIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibm9uLXJlbW92YWJsZSIpKSB7CiAJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9OT05SRU1PVkFCTEU7CiAJfSBlbHNlIHsKLQkJY2RfY2FwX2ludmVydCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNkLWludmVydGVkIik7CisJCWNkX2NhcF9pbnZlcnQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImNkLWludmVydGVkIik7CiAKLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImJyb2tlbi1jZCIpKQorCQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJicm9rZW4tY2QiKSkKIAkJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9ORUVEU19QT0xMOwogCiAJCXJldCA9IG1tY19ncGlvZF9yZXF1ZXN0X2NkKGhvc3QsICJjZCIsIDAsIHRydWUsCkBAIC01NjIsNyArNTYwLDcgQEAKIAl9CiAKIAkvKiBQYXJzZSBXcml0ZSBQcm90ZWN0aW9uICovCi0Jcm9fY2FwX2ludmVydCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIndwLWludmVydGVkIik7CisJcm9fY2FwX2ludmVydCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAid3AtaW52ZXJ0ZWQiKTsKIAogCXJldCA9IG1tY19ncGlvZF9yZXF1ZXN0X3JvKGhvc3QsICJ3cCIsIDAsIGZhbHNlLCAwLCAmcm9fZ3Bpb19pbnZlcnQpOwogCWlmICghcmV0KQpAQCAtNTcwLDYyICs1NjgsNjIgQEAKIAllbHNlIGlmIChyZXQgIT0gLUVOT0VOVCAmJiByZXQgIT0gLUVOT1NZUykKIAkJcmV0dXJuIHJldDsKIAotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkaXNhYmxlLXdwIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiZGlzYWJsZS13cCIpKQogCQlob3N0LT5jYXBzMiB8PSBNTUNfQ0FQMl9OT19XUklURV9QUk9URUNUOwogCiAJLyogU2VlIHRoZSBjb21tZW50IG9uIENEIGludmVyc2lvbiBhYm92ZSAqLwogCWlmIChyb19jYXBfaW52ZXJ0IF4gcm9fZ3Bpb19pbnZlcnQpCiAJCWhvc3QtPmNhcHMyIHw9IE1NQ19DQVAyX1JPX0FDVElWRV9ISUdIOwogCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNhcC1zZC1oaWdoc3BlZWQiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJjYXAtc2QtaGlnaHNwZWVkIikpCiAJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9TRF9ISUdIU1BFRUQ7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNhcC1tbWMtaGlnaHNwZWVkIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiY2FwLW1tYy1oaWdoc3BlZWQiKSkKIAkJaG9zdC0+Y2FwcyB8PSBNTUNfQ0FQX01NQ19ISUdIU1BFRUQ7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInNkLXVocy1zZHIxMiIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgInNkLXVocy1zZHIxMiIpKQogCQlob3N0LT5jYXBzIHw9IE1NQ19DQVBfVUhTX1NEUjEyOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzZC11aHMtc2RyMjUiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJzZC11aHMtc2RyMjUiKSkKIAkJaG9zdC0+Y2FwcyB8PSBNTUNfQ0FQX1VIU19TRFIyNTsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic2QtdWhzLXNkcjUwIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAic2QtdWhzLXNkcjUwIikpCiAJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9VSFNfU0RSNTA7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInNkLXVocy1zZHIxMDQiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJzZC11aHMtc2RyMTA0IikpCiAJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9VSFNfU0RSMTA0OwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzZC11aHMtZGRyNTAiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJzZC11aHMtZGRyNTAiKSkKIAkJaG9zdC0+Y2FwcyB8PSBNTUNfQ0FQX1VIU19ERFI1MDsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiY2FwLXBvd2VyLW9mZi1jYXJkIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiY2FwLXBvd2VyLW9mZi1jYXJkIikpCiAJCWhvc3QtPmNhcHMgfD0gTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRDsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiY2FwLW1tYy1ody1yZXNldCIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImNhcC1tbWMtaHctcmVzZXQiKSkKIAkJaG9zdC0+Y2FwcyB8PSBNTUNfQ0FQX0hXX1JFU0VUOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJjYXAtc2Rpby1pcnEiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJjYXAtc2Rpby1pcnEiKSkKIAkJaG9zdC0+Y2FwcyB8PSBNTUNfQ0FQX1NESU9fSVJROwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmdWxsLXB3ci1jeWNsZSIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImZ1bGwtcHdyLWN5Y2xlIikpCiAJCWhvc3QtPmNhcHMyIHw9IE1NQ19DQVAyX0ZVTExfUFdSX0NZQ0xFOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJrZWVwLXBvd2VyLWluLXN1c3BlbmQiKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJrZWVwLXBvd2VyLWluLXN1c3BlbmQiKSkKIAkJaG9zdC0+cG1fY2FwcyB8PSBNTUNfUE1fS0VFUF9QT1dFUjsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAid2FrZXVwLXNvdXJjZSIpIHx8Ci0JICAgIG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImVuYWJsZS1zZGlvLXdha2V1cCIpKSAvKiBsZWdhY3kgKi8KKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJ3YWtldXAtc291cmNlIikgfHwKKwkgICAgZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJlbmFibGUtc2Rpby13YWtldXAiKSkgLyogbGVnYWN5ICovCiAJCWhvc3QtPnBtX2NhcHMgfD0gTU1DX1BNX1dBS0VfU0RJT19JUlE7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1tYy1kZHItMV84diIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIm1tYy1kZHItMV84diIpKQogCQlob3N0LT5jYXBzIHw9IE1NQ19DQVBfMV84Vl9ERFI7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1tYy1kZHItMV8ydiIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIm1tYy1kZHItMV8ydiIpKQogCQlob3N0LT5jYXBzIHw9IE1NQ19DQVBfMV8yVl9ERFI7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1tYy1oczIwMC0xXzh2IikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibW1jLWhzMjAwLTFfOHYiKSkKIAkJaG9zdC0+Y2FwczIgfD0gTU1DX0NBUDJfSFMyMDBfMV84Vl9TRFI7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1tYy1oczIwMC0xXzJ2IikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibW1jLWhzMjAwLTFfMnYiKSkKIAkJaG9zdC0+Y2FwczIgfD0gTU1DX0NBUDJfSFMyMDBfMV8yVl9TRFI7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1tYy1oczQwMC0xXzh2IikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibW1jLWhzNDAwLTFfOHYiKSkKIAkJaG9zdC0+Y2FwczIgfD0gTU1DX0NBUDJfSFM0MDBfMV84ViB8IE1NQ19DQVAyX0hTMjAwXzFfOFZfU0RSOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJtbWMtaHM0MDAtMV8ydiIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIm1tYy1oczQwMC0xXzJ2IikpCiAJCWhvc3QtPmNhcHMyIHw9IE1NQ19DQVAyX0hTNDAwXzFfMlYgfCBNTUNfQ0FQMl9IUzIwMF8xXzJWX1NEUjsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAibW1jLWhzNDAwLWVuaGFuY2VkLXN0cm9iZSIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIm1tYy1oczQwMC1lbmhhbmNlZC1zdHJvYmUiKSkKIAkJaG9zdC0+Y2FwczIgfD0gTU1DX0NBUDJfSFM0MDBfRVM7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm5vLXNkaW8iKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJuby1zZGlvIikpCiAJCWhvc3QtPmNhcHMyIHw9IE1NQ19DQVAyX05PX1NESU87Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm5vLXNkIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAibm8tc2QiKSkKIAkJaG9zdC0+Y2FwczIgfD0gTU1DX0NBUDJfTk9fU0Q7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm5vLW1tYyIpKQorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIm5vLW1tYyIpKQogCQlob3N0LT5jYXBzMiB8PSBNTUNfQ0FQMl9OT19NTUM7CiAKLQlob3N0LT5kc3JfcmVxID0gIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZHNyIiwgJmhvc3QtPmRzcik7CisJaG9zdC0+ZHNyX3JlcSA9ICFkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiZHNyIiwgJmhvc3QtPmRzcik7CiAJaWYgKGhvc3QtPmRzcl9yZXEgJiYgKGhvc3QtPmRzciAmIH4weGZmZmYpKSB7CiAJCWRldl9lcnIoaG9zdC0+cGFyZW50LAogCQkJImRldmljZSB0cmVlIHNwZWNpZmllZCBicm9rZW4gdmFsdWUgZm9yIERTUjogMHgleCwgaWdub3JpbmdcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwppbmRleCA0MDk3MThiLi4zNjI5NWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKQEAgLTEzNTcsMTAgKzEzNTcsNiBAQAogCWludCBlcnI7CiAJdTggdmFsOwogCi0JLyogUmVkdWNlIGZyZXF1ZW5jeSB0byBIUyAqLwotCW1heF9kdHIgPSBjYXJkLT5leHRfY3NkLmhzX21heF9kdHI7Ci0JbW1jX3NldF9jbG9jayhob3N0LCBtYXhfZHRyKTsKLQogCS8qIFN3aXRjaCBIUzQwMCB0byBIUyBERFIgKi8KIAl2YWwgPSBFWFRfQ1NEX1RJTUlOR19IUzsKIAllcnIgPSBfX21tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwgRVhUX0NTRF9IU19USU1JTkcsCkBAIC0xMzcxLDYgKzEzNjcsMTAgQEAKIAogCW1tY19zZXRfdGltaW5nKGhvc3QsIE1NQ19USU1JTkdfTU1DX0REUjUyKTsKIAorCS8qIFJlZHVjZSBmcmVxdWVuY3kgdG8gSFMgKi8KKwltYXhfZHRyID0gY2FyZC0+ZXh0X2NzZC5oc19tYXhfZHRyOworCW1tY19zZXRfY2xvY2soaG9zdCwgbWF4X2R0cik7CisKIAllcnIgPSBtbWNfc3dpdGNoX3N0YXR1cyhjYXJkLCBmYWxzZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZXJyOwpAQCAtMTQxNiw3ICsxNDE2LDcgQEAKIHN0YXRpYyBpbnQgbW1jX3NlbGVjdF9oczQwMGVzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OwotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAtRUlOVkFMOwogCXU4IHZhbDsKIAogCWlmICghKGhvc3QtPmNhcHMgJiBNTUNfQ0FQXzhfQklUX0RBVEEpKSB7CkBAIC0yMTQ4LDcgKzIxNDgsNyBAQAogCQllcnIgPSBtbWNfc2VsZWN0X2hzNDAwKGNhcmQpOwogCQlpZiAoZXJyKQogCQkJZ290byBmcmVlX2NhcmQ7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKCFtbWNfY2FyZF9oczQwMGVzKGNhcmQpKSB7CiAJCS8qIFNlbGVjdCB0aGUgZGVzaXJlZCBidXMgd2lkdGggb3B0aW9uYWxseSAqLwogCQllcnIgPSBtbWNfc2VsZWN0X2J1c193aWR0aChjYXJkKTsKIAkJaWYgKGVyciA+IDAgJiYgbW1jX2NhcmRfaHMoY2FyZCkpIHsKQEAgLTIxNTksMTEgKzIxNTksMTEgQEAKIAl9CiAKIAljYXJkLT5jbGtfc2NhbGluZ19sb3dlc3QgPSBob3N0LT5mX21pbjsKLQlpZiAoKGNhcmQtPm1tY19hdmFpbF90eXBlIHwgRVhUX0NTRF9DQVJEX1RZUEVfSFM0MDApIHx8Ci0JCQkoY2FyZC0+bW1jX2F2YWlsX3R5cGUgfCBFWFRfQ1NEX0NBUkRfVFlQRV9IUzIwMCkpCisJaWYgKChjYXJkLT5tbWNfYXZhaWxfdHlwZSAmIEVYVF9DU0RfQ0FSRF9UWVBFX0hTNDAwKSB8fAorCQkJKGNhcmQtPm1tY19hdmFpbF90eXBlICYgRVhUX0NTRF9DQVJEX1RZUEVfSFMyMDApKQogCQljYXJkLT5jbGtfc2NhbGluZ19oaWdoZXN0ID0gY2FyZC0+ZXh0X2NzZC5oczIwMF9tYXhfZHRyOwotCWVsc2UgaWYgKChjYXJkLT5tbWNfYXZhaWxfdHlwZSB8IEVYVF9DU0RfQ0FSRF9UWVBFX0hTKSB8fAotCQkJKGNhcmQtPm1tY19hdmFpbF90eXBlIHwgRVhUX0NTRF9DQVJEX1RZUEVfRERSXzUyKSkKKwllbHNlIGlmICgoY2FyZC0+bW1jX2F2YWlsX3R5cGUgJiBFWFRfQ1NEX0NBUkRfVFlQRV9IUykgfHwKKwkJCShjYXJkLT5tbWNfYXZhaWxfdHlwZSAmIEVYVF9DU0RfQ0FSRF9UWVBFX0REUl81MikpCiAJCWNhcmQtPmNsa19zY2FsaW5nX2hpZ2hlc3QgPSBjYXJkLT5leHRfY3NkLmhzX21heF9kdHI7CiAJZWxzZQogCQljYXJkLT5jbGtfc2NhbGluZ19oaWdoZXN0ID0gY2FyZC0+Y3NkLm1heF9kdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKaW5kZXggNjUwZjY1OC4uZDU5MWRlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwpAQCAtMTI3NSw3ICsxMjc1LDEwIEBACiAJaWYgKCFlcnIpIHsKIAkJcG1fcnVudGltZV9kaXNhYmxlKCZob3N0LT5jYXJkLT5kZXYpOwogCQlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoJmhvc3QtPmNhcmQtPmRldik7Ci0JfQorCS8qIGlmIHN1c3BlbmQgZmFpbHMsIGZvcmNlIG1tY19kZXRlY3RfY2hhbmdlIGR1cmluZyByZXN1bWUgKi8KKwl9IGVsc2UgaWYgKG1tY19idXNfbWFudWFsX3Jlc3VtZShob3N0KSkKKwkJaG9zdC0+aWdub3JlX2J1c19yZXN1bWVfZmxhZ3MgPSB0cnVlOworCiAJTU1DX1RSQUNFKGhvc3QsICIlczogRXhpdCBlcnI6ICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2NtZHFfaGNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L2NtZHFfaGNpLmMKaW5kZXggN2MzNjM4Yy4uNTkxZDZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9jbWRxX2hjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvY21kcV9oY2kuYwpAQCAtMTQ1LDYgKzE0NSwyOSBAQAogCW1iKCk7CiB9CiAKK3N0YXRpYyBpbnQgY21kcV9jbGVhcl90YXNrX3BvbGwoc3RydWN0IGNtZHFfaG9zdCAqY3FfaG9zdCwgdW5zaWduZWQgaW50IHRhZykKK3sKKwlpbnQgcmV0cmllcyA9IDEwMDsKKworCWNtZHFfY2xlYXJfc2V0X2lycXMoY3FfaG9zdCwgQ1FJU19UQ0wsIDApOworCWNtZHFfd3JpdGVsKGNxX2hvc3QsIDE8PHRhZywgQ1FUQ0xSKTsKKwl3aGlsZSAocmV0cmllcykgeworCQkvKgorCQkgKiBUYXNrIENsZWFyIHJlZ2lzdGVyIGFuZCBkb29yYmVsbCwKKwkJICogYm90aCBzaG91bGQgaW5kaWNhdGUgdGhhdCB0YXNrIGlzIGNsZWFyZWQKKwkJICovCisJCWlmICgoY21kcV9yZWFkbChjcV9ob3N0LCBDUVRDTFIpICYgMTw8dGFnKSB8fAorCQkJKGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FUREJSKSAmIDE8PHRhZykpIHsKKwkJCXVkZWxheSg1KTsKKwkJCXJldHJpZXMtLTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWNtZHFfY2xlYXJfc2V0X2lycXMoY3FfaG9zdCwgMCwgQ1FJU19UQ0wpOworCXJldHVybiByZXRyaWVzID8gMCA6IC1FVElNRURPVVQ7Cit9CiAKICNkZWZpbmUgRFJWX05BTUUgImNtZHEtaG9zdCIKIApAQCAtMTk3LDYgKzIyMCwxMCBAQAogc3RhdGljIHZvaWQgY21kcV9kdW1wcmVncyhzdHJ1Y3QgY21kcV9ob3N0ICpjcV9ob3N0KQogewogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gY3FfaG9zdC0+bW1jOworCWludCBvZmZzZXQgPSAwOworCisJaWYgKGNxX2hvc3QtPm9mZnNldF9jaGFuZ2VkKQorCQlvZmZzZXQgPSBDUV9WNV9WRU5ET1JfQ0ZHOwogCiAJTU1DX1RSQUNFKG1tYywKIAkiJXM6IDB4MEM9MHglMDh4IDB4MTA9MHglMDh4IDB4MTQ9MHglMDh4IDB4MTg9MHglMDh4IDB4Mjg9MHglMDh4IDB4MkM9MHglMDh4IDB4MzA9MHglMDh4IDB4MzQ9MHglMDh4IDB4NTQ9MHglMDh4IDB4NTg9MHglMDh4IDB4NUM9MHglMDh4IDB4NDg9MHglMDh4XG4iLApAQCAtMjQzLDcgKzI3MCw3IEBACiAJCWNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FDUkkpLAogCQljbWRxX3JlYWRsKGNxX2hvc3QsIENRQ1JBKSk7CiAJcHJfZXJyKERSVl9OQU1FIjogVmVuZG9yIGNmZyAweCUwOHhcbiIsCi0JICAgICAgIGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FfVkVORE9SX0NGRykpOworCSAgICAgICBjbWRxX3JlYWRsKGNxX2hvc3QsIENRX1ZFTkRPUl9DRkcgKyBvZmZzZXQpKTsKIAlwcl9lcnIoRFJWX05BTUUgIjogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAKIAljbWRxX2R1bXBfdGFza19oaXN0b3J5KGNxX2hvc3QpOwpAQCAtMzQ1LDYgKzM3Miw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAJdTMyIGNxY2ZnOworCXUzMiBjcWNhcCA9IDA7CiAJYm9vbCBkY21kX2VuYWJsZTsKIAlzdHJ1Y3QgY21kcV9ob3N0ICpjcV9ob3N0ID0gbW1jX2NtZHFfcHJpdmF0ZShtbWMpOwogCkBAIC0zNzMsNiArNDAxLDI0IEBACiAJY3FjZmcgPSAoKGNxX2hvc3QtPmNhcHMgJiBDTURRX1RBU0tfREVTQ19TWl8xMjggPyBDUV9UQVNLX0RFU0NfU1ogOiAwKSB8CiAJCQkoZGNtZF9lbmFibGUgPyBDUV9EQ01EIDogMCkpOwogCisJY3FjYXAgPSBjbWRxX3JlYWRsKGNxX2hvc3QsIENRQ0FQKTsKKwlpZiAoY3FjYXAgJiBDUUNBUF9DUykgeworCQkvKgorCQkgKiBJbiBjYXNlIGhvc3QgY29udHJvbGxlciBzdXBwb3J0cyBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnMKKwkJICogdGhlbiwgaXQgdXNlcyAxMjhiaXQgdGFzayBkZXNjcmlwdG9yLiBVcHBlciA2NCBiaXRzIG9mIHRhc2sKKwkJICogZGVzY3JpcHRvciB3b3VsZCBiZSB1c2VkIHRvIHBhc3MgY3J5cHRvIHNwZWNpZmljIGluZm9ybWF0b24uCisJCSAqLworCQljcV9ob3N0LT5jYXBzIHw9IENNRFFfQ0FQX0NSWVBUT19TVVBQT1JUIHwKKwkJCQkgQ01EUV9UQVNLX0RFU0NfU1pfMTI4OworCQljcWNmZyB8PSBDUV9JQ0VfRU5BQkxFOworCQkvKgorCQkgKiBGb3IgU0RIQyB2NS4wIG9ud2FyZHMsIElDRSAzLjAgc3BlY2lmaWMgcmVnaXN0ZXJzIGFyZSBhZGRlZAorCQkgKiBpbiBDUSByZWdpc3RlciBzcGFjZSwgZHVlIHRvIHdoaWNoIGZldyBDUSByZWdpc3RlcnMgYXJlCisJCSAqIHNoaWZ0ZWQuIFNldCBvZmZzZXRfY2hhbmdlZCBib29sZWFuIHRvIHVzZSB1cGRhdGVkIGFkZHJlc3MuCisJCSAqLworCQljcV9ob3N0LT5vZmZzZXRfY2hhbmdlZCA9IHRydWU7CisJfQorCiAJY21kcV93cml0ZWwoY3FfaG9zdCwgY3FjZmcsIENRQ0ZHKTsKIAkvKiBlbmFibGUgQ1FfSE9TVCAqLwogCWNtZHFfd3JpdGVsKGNxX2hvc3QsIGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FDRkcpIHwgQ1FfRU5BQkxFLApAQCAtNjg4LDYgKzczNCwzMCBAQAogCQl1cHBlcl8zMl9iaXRzKCp0YXNrX2Rlc2MpKTsKIH0KIAorc3RhdGljIGlubGluZQordm9pZCBjbWRxX3ByZXBfY3J5cHRvX2Rlc2Moc3RydWN0IGNtZHFfaG9zdCAqY3FfaG9zdCwgdTY0ICp0YXNrX2Rlc2MsCisJCQl1NjQgaWNlX2N0eCkKK3sKKwl1NjQgKmljZV9kZXNjID0gTlVMTDsKKworCWlmIChjcV9ob3N0LT5jYXBzICYgQ01EUV9DQVBfQ1JZUFRPX1NVUFBPUlQpIHsKKwkJLyoKKwkJICogR2V0IHRoZSBhZGRyZXNzIG9mIGljZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gdGFzayBkZXNjcmlwdG9yLgorCQkgKiBpY2UgY29udGV4dCBpcyBwcmVzZW50IGluIHRoZSB1cHBlciA2NGJpdHMgb2YgdGFzayBkZXNjcmlwdG9yCisJCSAqIGljZV9jb25leHRfYmFzZV9hZGRyZXNzID0gdGFza19kZXNjICsgOC1ieXRlcworCQkgKi8KKwkJaWNlX2Rlc2MgPSAoX19sZTY0ICopKCh1OCAqKXRhc2tfZGVzYyArCisJCQkJCQlDUV9UQVNLX0RFU0NfVEFTS19QQVJBTVNfU0laRSk7CisJCW1lbXNldChpY2VfZGVzYywgMCwgQ1FfVEFTS19ERVNDX0lDRV9QQVJBTVNfU0laRSk7CisKKwkJLyoKKwkJICogIEFzc2lnbiB1cHBlciA2NGJpdHMgZGF0YSBvZiB0YXNrIGRlc2NyaXRvciB3aXRoIGljZSBjb250ZXh0CisJCSAqLworCQlpZiAoaWNlX2N0eCkKKwkJCSppY2VfZGVzYyA9IGNwdV90b19sZTY0KGljZV9jdHgpOworCX0KK30KKwogc3RhdGljIHZvaWQgY21kcV9wbV9xb3Nfdm90ZShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwpAQCAtNzExLDYgKzc4MSw3IEBACiAJdTMyIHRhZyA9IG1ycS0+Y21kcV9yZXEtPnRhZzsKIAlzdHJ1Y3QgY21kcV9ob3N0ICpjcV9ob3N0ID0gKHN0cnVjdCBjbWRxX2hvc3QgKiltbWNfY21kcV9wcml2YXRlKG1tYyk7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXU2NCBpY2VfY3R4ID0gMDsKIAogCWlmICghY3FfaG9zdC0+ZW5hYmxlZCkgewogCQlwcl9lcnIoIiVzOiBDTURRIGhvc3Qgbm90IGVuYWJsZWQgeWV0ICEhIVxuIiwKQEAgLTczMCw3ICs4MDEsNyBAQAogCX0KIAogCWlmIChjcV9ob3N0LT5vcHMtPmNyeXB0b19jZmcpIHsKLQkJZXJyID0gY3FfaG9zdC0+b3BzLT5jcnlwdG9fY2ZnKG1tYywgbXJxLCB0YWcpOworCQllcnIgPSBjcV9ob3N0LT5vcHMtPmNyeXB0b19jZmcobW1jLCBtcnEsIHRhZywgJmljZV9jdHgpOwogCQlpZiAoZXJyKSB7CiAJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY29uZmlndXJlIGNyeXB0bzogZXJyICVkIHRhZyAlZFxuIiwKIAkJCQkJbW1jX2hvc3RuYW1lKG1tYyksIGVyciwgdGFnKTsKQEAgLTc0Myw2ICs4MTQsOSBAQAogCWNtZHFfcHJlcF90YXNrX2Rlc2MobXJxLCAmZGF0YSwgMSwKIAkJCSAgICAobXJxLT5jbWRxX3JlcS0+Y21kcV9yZXFfZmxhZ3MgJiBRQlIpKTsKIAkqdGFza19kZXNjID0gY3B1X3RvX2xlNjQoZGF0YSk7CisKKwljbWRxX3ByZXBfY3J5cHRvX2Rlc2MoY3FfaG9zdCwgdGFza19kZXNjLCBpY2VfY3R4KTsKKwogCWNtZHFfbG9nX3Rhc2tfZGVzY19oaXN0b3J5KGNxX2hvc3QsICp0YXNrX2Rlc2MsIGZhbHNlKTsKIAogCWVyciA9IGNtZHFfcHJlcF90cmFuX2Rlc2MobXJxLCBjcV9ob3N0LCB0YWcpOwpAQCAtNzc3LDE3ICs4NTEsMzEgQEAKIHsKIAlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycTsKIAlzdHJ1Y3QgY21kcV9ob3N0ICpjcV9ob3N0ID0gKHN0cnVjdCBjbWRxX2hvc3QgKiltbWNfY21kcV9wcml2YXRlKG1tYyk7CisJaW50IG9mZnNldCA9IDA7CisJaW50IGVyciA9IDA7CiAKKwlpZiAoY3FfaG9zdC0+b2Zmc2V0X2NoYW5nZWQpCisJCW9mZnNldCA9IENRX1Y1X1ZFTkRPUl9DRkc7CiAJbXJxID0gZ2V0X3JlcV9ieV90YWcoY3FfaG9zdCwgdGFnKTsKIAlpZiAodGFnID09IGNxX2hvc3QtPmRjbWRfc2xvdCkKIAkJbXJxLT5jbWQtPnJlc3BbMF0gPSBjbWRxX3JlYWRsKGNxX2hvc3QsIENRQ1JEQ1QpOwogCiAJaWYgKG1ycS0+Y21kcV9yZXEtPmNtZHFfcmVxX2ZsYWdzICYgRENNRCkKLQkJY21kcV93cml0ZWwoY3FfaG9zdCwgY21kcV9yZWFkbChjcV9ob3N0LCBDUV9WRU5ET1JfQ0ZHKSB8Ci0JCQkgICAgQ01EUV9TRU5EX1NUQVRVU19UUklHR0VSLCBDUV9WRU5ET1JfQ0ZHKTsKKwkJY21kcV93cml0ZWwoY3FfaG9zdCwKKwkJCWNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FfVkVORE9SX0NGRyArIG9mZnNldCkgfAorCQkJQ01EUV9TRU5EX1NUQVRVU19UUklHR0VSLCBDUV9WRU5ET1JfQ0ZHICsgb2Zmc2V0KTsKIAogCWNtZHFfcnVudGltZV9wbV9wdXQoY3FfaG9zdCk7Ci0JaWYgKGNxX2hvc3QtPm9wcy0+Y3J5cHRvX2NmZ19yZXNldCkKKworCWlmIChjcV9ob3N0LT5vcHMtPmNyeXB0b19jZmdfZW5kKSB7CisJCWVyciA9IGNxX2hvc3QtPm9wcy0+Y3J5cHRvX2NmZ19lbmQobW1jLCBtcnEpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5kIGljZSBjb25maWc6IGVyciAlZCB0YWcgJWRcbiIsCisJCQkJCW1tY19ob3N0bmFtZShtbWMpLCBlcnIsIHRhZyk7CisJCX0KKwl9CisJaWYgKCEoY3FfaG9zdC0+Y2FwcyAmIENNRFFfQ0FQX0NSWVBUT19TVVBQT1JUKSAmJgorCQkJY3FfaG9zdC0+b3BzLT5jcnlwdG9fY2ZnX3Jlc2V0KQogCQljcV9ob3N0LT5vcHMtPmNyeXB0b19jZmdfcmVzZXQobW1jLCB0YWcpOwogCW1ycS0+ZG9uZShtcnEpOwogfQpAQCAtODAxLDYgKzg4OSw4IEBACiAJc3RydWN0IG1tY19yZXF1ZXN0ICptcnE7CiAJaW50IHJldDsKIAl1MzIgZGJyX3NldCA9IDA7CisJdTMyIGRldl9wZW5kX3NldCA9IDA7CisJaW50IHN0YXRfZXJyID0gMDsKIAogCXN0YXR1cyA9IGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FJUyk7CiAKQEAgLTgwOSw3ICs4OTksOSBAQAogCU1NQ19UUkFDRShtbWMsICIlczogQ1FJUzogMHgleCBlcnI6ICVkXG4iLAogCQlfX2Z1bmNfXywgc3RhdHVzLCBlcnIpOwogCi0JaWYgKGVyciB8fCAoc3RhdHVzICYgQ1FJU19SRUQpKSB7CisJc3RhdF9lcnIgPSBzdGF0dXMgJiAoQ1FJU19SRUQgfCBDUUlTX0dDRSB8IENRSVNfSUNDRSk7CisKKwlpZiAoZXJyIHx8IHN0YXRfZXJyKSB7CiAJCWVycl9pbmZvID0gY21kcV9yZWFkbChjcV9ob3N0LCBDUVRFUlJJKTsKIAkJcHJfZXJyKCIlczogZXJyOiAlZCBzdGF0dXM6IDB4JTA4eCB0YXNrLWVyci1pbmZvICgweCUwOGx4KVxuIiwKIAkJICAgICAgIG1tY19ob3N0bmFtZShtbWMpLCBlcnIsIHN0YXR1cywgZXJyX2luZm8pOwpAQCAtOTEyLDcgKzEwMDQsNyBAQAogCQkgKiBDUUUgZGV0ZWN0ZWQgYSByZXNwb25zZSBlcnJvciBmcm9tIGRldmljZQogCQkgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIHdvdWxkIHJlcXVpcmUgYSByZXNldC4KIAkJICovCi0JCWlmIChzdGF0dXMgJiBDUUlTX1JFRCkgeworCQlpZiAoc3RhdF9lcnIgJiBDUUlTX1JFRCkgewogCQkJLyoKIAkJCSAqIHdpbGwgY2hlY2sgaWYgdGhlIFJFRCBlcnJvciBpcyBkdWUgdG8gYSBia29wcwogCQkJICogZXhjZXB0aW9uIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5CkBAIC05MzEsNiArMTAyMyw2MiBAQAogCQkJbXJxLT5jbWRxX3JlcS0+cmVzcF9hcmcgPSBjbWRxX3JlYWRsKGNxX2hvc3QsIENRQ1JBKTsKIAkJfQogCisJCS8qCisJCSAqIEdlbmVyaWMgQ3J5cHRvIGVycm9yIGRldGVjdGVkIGJ5IENRRS4KKwkJICogSXRzIGEgZmF0YWwsIHdvdWxkIHJlcXVpcmUgY21kcSByZXNldC4KKwkJICovCisJCWlmIChzdGF0X2VyciAmIENRSVNfR0NFKSB7CisJCQlpZiAobXJxLT5kYXRhKQorCQkJCW1ycS0+ZGF0YS0+ZXJyb3IgPSAtRUlPOworCQkJcHJfZXJyKCIlczogQ3J5cHRvIGdlbmVyaWMgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyB0YXNrICVsdSEiLAorCQkJCW1tY19ob3N0bmFtZShtbWMpLCB0YWcpOworCQkJTU1DX1RSQUNFKG1tYywgIiVzOiBHQ0UgZXJyb3IgZGV0ZWN0ZWQgd2l0aCB0YWcgJWx1XG4iLAorCQkJCQlfX2Z1bmNfXywgdGFnKTsKKwkJfQorCQkvKgorCQkgKiBJbnZhbGlkIGNyeXB0byBjb25maWcgZXJyb3IgZGV0ZWN0ZWQgYnkgQ1FFLCBjbGVhciB0aGUgdGFzay4KKwkJICogVGFzayBjYW4gYmUgY2xlYXJlZCBvbmx5IHdoZW4gQ1FFIGlzIGhhbHQgc3RhdGUuCisJCSAqLworCQlpZiAoc3RhdF9lcnIgJiBDUUlTX0lDQ0UpIHsKKwkJCS8qCisJCQkgKiBJbnZhbGlkIENyeXB0byBDb25maWcgRXJyb3IgaXMgZGV0ZWN0ZWQgYXQgdGhlCisJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zZmVyIGJlZm9yZSB0aGUgYWN0dWFsIGV4ZWN1dGlvbgorCQkJICogc3RhcnRlZC4gU28ganVzdCBjbGVhciB0aGUgdGFzayBpbiBDUUUuIE5vIG5lZWQgdG8KKwkJCSAqIGNsZWFyIGluIGRldmljZS4gT25seSB0aGUgdGFzayB3aGljaCBjYXVzZWQgSUNDRSBoYXMKKwkJCSAqIHRvIGJlIGNsZWFyZWQuIE90aGVyIHRhc2tzIGNhbiBiZSBjb250aW51ZSBwcm9jZXNzaW5nCisJCQkgKiBUaGUgZmlyc3QgdGFzayB3aGljaCBpcyBhYm91dCB0byBiZSBwcmVwYXJlZCB3b3VsZAorCQkJICogY2F1c2UgSUNDRSBFcnJvci4KKwkJCSAqLworCQkJZGJyX3NldCA9IGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FUREJSKTsKKwkJCWRldl9wZW5kX3NldCA9IGNtZHFfcmVhZGwoY3FfaG9zdCwgQ1FEUFQpOworCQkJaWYgKGRicl9zZXQgXiBkZXZfcGVuZF9zZXQpCisJCQkJdGFnID0gZmZzKGRicl9zZXQgXiBkZXZfcGVuZF9zZXQpIC0gMTsKKwkJCW1ycSA9IGdldF9yZXFfYnlfdGFnKGNxX2hvc3QsIHRhZyk7CisJCQlwcl9lcnIoIiVzOiBDcnlwdG8gY29uZmlnIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGFzayAlbHUhIiwKKwkJCQltbWNfaG9zdG5hbWUobW1jKSwgdGFnKTsKKwkJCU1NQ19UUkFDRShtbWMsICIlczogSUNDRSBlcnJvciB3aXRoIHRhZyAlbHVcbiIsCisJCQkJCQlfX2Z1bmNfXywgdGFnKTsKKwkJCWlmIChtcnEtPmRhdGEpCisJCQkJbXJxLT5kYXRhLT5lcnJvciA9IC1FSU87CisJCQllbHNlIGlmIChtcnEtPmNtZCkKKwkJCQltcnEtPmNtZC0+ZXJyb3IgPSAtRUlPOworCQkJLyoKKwkJCSAqIElmIENRRSBpcyBoYWx0ZWQgYW5kIHRhZyBpcyB2YWxpZCB0aGVuIGNsZWFyIHRoZSB0YXNrCisJCQkgKiB0aGVuIHVuLWhhbHQgQ1FFIGFuZCBzZXQgZmxhZyB0byBza2lwIGVycm9yIHJlY292ZXJ5LgorCQkJICogSWYgYW55IG9mIHRoZSBjb25kdGlvbnMgaXMgbm90IG1ldCB0aGVuZSBpdCB3aWxsCisJCQkgKiBlbnRlciBpbnRvIGRlZmF1bHQgZXJyb3IgcmVjb3ZlcnkgcGF0aC4KKwkJCSAqLworCQkJaWYgKCFyZXQgJiYgKGRicl9zZXQgXiBkZXZfcGVuZF9zZXQpKSB7CisJCQkJcmV0ID0gY21kcV9jbGVhcl90YXNrX3BvbGwoY3FfaG9zdCwgdGFnKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCXByX2VycigiJXM6ICVzOiB0YXNrWyVsdV0gY2xlYXIgZmFpbGVkIHJldD0lZFxuIiwKKwkJCQkJCW1tY19ob3N0bmFtZShtbWMpLAorCQkJCQkJX19mdW5jX18sIHRhZywgcmV0KTsKKwkJCQl9IGVsc2UgaWYgKCFjbWRxX2hhbHRfcG9sbChtbWMsIGZhbHNlKSkgeworCQkJCQltcnEtPmNtZHFfcmVxLT5za2lwX2Vycl9oYW5kbGluZyA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CiAJCWNtZHFfZmluaXNoX2RhdGEobW1jLCB0YWcpOwogCX0gZWxzZSB7CiAJCWNtZHFfd3JpdGVsKGNxX2hvc3QsIHN0YXR1cywgQ1FJUyk7CkBAIC0xMDAxLDYgKzExNDksNyBAQAogCQkJY3FfaG9zdC0+b3BzLT5jbGVhcl9zZXRfaXJxcyhtbWMsIHRydWUpOwogCQljbWRxX3dyaXRlbChjcV9ob3N0LCBjbWRxX3JlYWRsKGNxX2hvc3QsIENRQ1RMKSAmIH5IQUxULAogCQkJICAgIENRQ1RMKTsKKwkJbW1jX2hvc3RfY2xyX2hhbHQobW1jKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2NtZHFfaGNpLmggYi9kcml2ZXJzL21tYy9ob3N0L2NtZHFfaGNpLmgKaW5kZXggOGU5Zjc2NS4uMWFhYmNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9jbWRxX2hjaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvY21kcV9oY2kuaApAQCAtMTgsMTEgKzE4LDEzIEBACiAjZGVmaW5lIENRVkVSCQkweDAwCiAvKiBjYXBhYmlsaXRpZXMgKi8KICNkZWZpbmUgQ1FDQVAJCTB4MDQKKyNkZWZpbmUgQ1FDQVBfQ1MJKDEgPDwgMjgpCiAvKiBjb25maWd1cmF0aW9uICovCiAjZGVmaW5lIENRQ0ZHCQkweDA4CiAjZGVmaW5lIENRX0RDTUQJCTB4MDAwMDEwMDAKICNkZWZpbmUgQ1FfVEFTS19ERVNDX1NaIDB4MDAwMDAxMDAKICNkZWZpbmUgQ1FfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1FfSUNFX0VOQUJMRQkweDAwMDAwMDAyCiAKIC8qIGNvbnRyb2wgKi8KICNkZWZpbmUgQ1FDVEwJCTB4MEMKQEAgLTM1LDYgKzM3LDggQEAKICNkZWZpbmUgQ1FJU19UQ0MJKDEgPDwgMSkKICNkZWZpbmUgQ1FJU19SRUQJKDEgPDwgMikKICNkZWZpbmUgQ1FJU19UQ0wJKDEgPDwgMykKKyNkZWZpbmUgQ1FJU19HQ0UJKDEgPDwgNCkKKyNkZWZpbmUgQ1FJU19JQ0NFCSgxIDw8IDUpCiAKIC8qIGludGVycnVwdCBzdGF0dXMgZW5hYmxlICovCiAjZGVmaW5lIENRSVNURQkJMHgxNApAQCAtMTEwLDcgKzExNCw3IEBACiAvKiBjb21tYW5kIHJlc3BvbnNlIGFyZ3VtZW50ICovCiAjZGVmaW5lIENRQ1JBCQkweDVDCiAKLSNkZWZpbmUgQ1FfSU5UX0FMTAkweEYKKyNkZWZpbmUgQ1FfSU5UX0FMTAkweDNGCiAjZGVmaW5lIENRSUNfREVGQVVMVF9JQ0NUSCAzMQogI2RlZmluZSBDUUlDX0RFRkFVTFRfSUNUT1ZBTCAxCiAKQEAgLTE0MSw5ICsxNDUsMTcgQEAKICNkZWZpbmUgREFUX0FERFJfTE8oeCkJKCh4ICYgMHhGRkZGRkZGRikgPDwgMzIpCiAjZGVmaW5lIERBVF9BRERSX0hJKHgpCSgoeCAmIDB4RkZGRkZGRkYpIDw8IDApCiAKKy8qCisgKiBBZGQgbmV3IG1hY3JvIGZvciB1cGRhdGVkIENRIHZlbmRvciBzcGVjaWZpYworICogcmVnaXN0ZXIgYWRkcmVzcyBmb3IgU0RIQyB2NS4wIG9ud2FyZHMuCisgKi8KKyNkZWZpbmUgQ1FfVjVfVkVORE9SX0NGRwkweDkwMAogI2RlZmluZSBDUV9WRU5ET1JfQ0ZHCTB4MTAwCiAjZGVmaW5lIENNRFFfU0VORF9TVEFUVVNfVFJJR0dFUiAoMSA8PCAzMSkKIAorI2RlZmluZSBDUV9UQVNLX0RFU0NfVEFTS19QQVJBTVNfU0laRQk4CisjZGVmaW5lIENRX1RBU0tfREVTQ19JQ0VfUEFSQU1TX1NJWkUJOAorCiBzdHJ1Y3QgdGFza19oaXN0b3J5IHsKIAl1NjQgdGFzazsKIAlib29sIGlzX2RjbWQ7CkBAIC0xNjEsNiArMTczLDcgQEAKIAl1MzIgZGNtZF9zbG90OwogCXUzMiBjYXBzOwogI2RlZmluZSBDTURRX1RBU0tfREVTQ19TWl8xMjggMHgxCisjZGVmaW5lIENNRFFfQ0FQX0NSWVBUT19TVVBQT1JUIDB4MgogCiAJdTMyIHF1aXJrczsKICNkZWZpbmUgQ01EUV9RVUlSS19TSE9SVF9UWEZSX0RFU0NfU1ogMHgxCkBAIC0xNjksNiArMTgyLDcgQEAKIAlib29sIGVuYWJsZWQ7CiAJYm9vbCBoYWx0ZWQ7CiAJYm9vbCBpbml0X2RvbmU7CisJYm9vbCBvZmZzZXRfY2hhbmdlZDsKIAogCXU4ICpkZXNjX2Jhc2U7CiAKQEAgLTIwOSw3ICsyMjMsOCBAQAogCWludCAoKnJlc2V0KShzdHJ1Y3QgbW1jX2hvc3QgKm1tYyk7CiAJdm9pZCAoKnBvc3RfY3FlX2hhbHQpKHN0cnVjdCBtbWNfaG9zdCAqbW1jKTsKIAlpbnQgKCpjcnlwdG9fY2ZnKShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsCi0JCQkJdTMyIHNsb3QpOworCQkJCXUzMiBzbG90LCB1NjQgKmljZV9jdHgpOworCWludCAoKmNyeXB0b19jZmdfZW5kKShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpOwogCXZvaWQgKCpjcnlwdG9fY2ZnX3Jlc2V0KShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgdW5zaWduZWQgaW50IHNsb3QpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKaW5kZXggZGY0NzhhZS4uZjgxZjQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCkBAIC0yNjEwLDggKzI2MTAsOCBAQAogCWhvc3QtPnNsb3RbaWRdID0gc2xvdDsKIAogCW1tYy0+b3BzID0gJmR3X21jaV9vcHM7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGhvc3QtPmRldi0+b2Zfbm9kZSwKLQkJCQkgICAgICAgImNsb2NrLWZyZXEtbWluLW1heCIsIGZyZXEsIDIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShob3N0LT5kZXYsICJjbG9jay1mcmVxLW1pbi1tYXgiLAorCQkJCQkgICBmcmVxLCAyKSkgewogCQltbWMtPmZfbWluID0gRFdfTUNJX0ZSRVFfTUlOOwogCQltbWMtPmZfbWF4ID0gRFdfTUNJX0ZSRVFfTUFYOwogCX0gZWxzZSB7CkBAIC0yNzA5LDcgKzI3MDksNiBAQAogewogCWludCBhZGRyX2NvbmZpZzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBob3N0LT5kZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAogCS8qCiAJKiBDaGVjayB0YW5zZmVyIG1vZGUgZnJvbSBIQ09OWzE3OjE2XQpAQCAtMjc3MCw4ICsyNzY5LDkgQEAKIAkJZGV2X2luZm8oaG9zdC0+ZGV2LCAiVXNpbmcgaW50ZXJuYWwgRE1BIGNvbnRyb2xsZXIuXG4iKTsKIAl9IGVsc2UgewogCQkvKiBUUkFOU19NT0RFX0VETUFDOiBjaGVjayBkbWEgYmluZGluZ3MgYWdhaW4gKi8KLQkJaWYgKChvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG5wLCAiZG1hLW5hbWVzIikgPCAwKSB8fAotCQkgICAgKCFvZl9maW5kX3Byb3BlcnR5KG5wLCAiZG1hcyIsIE5VTEwpKSkgeworCQlpZiAoKGRldmljZV9wcm9wZXJ0eV9yZWFkX3N0cmluZ19hcnJheShkZXYsICJkbWEtbmFtZXMiLAorCQkJCQkJICAgICAgIE5VTEwsIDApIDwgMCkgfHwKKwkJICAgICFkZXZpY2VfcHJvcGVydHlfcHJlc2VudChkZXYsICJkbWFzIikpIHsKIAkJCWdvdG8gbm9fZG1hOwogCQl9CiAJCWhvc3QtPmRtYV9vcHMgPSAmZHdfbWNpX2VkbWFjX29wczsKQEAgLTI5MzEsNyArMjkzMSw2IEBACiB7CiAJc3RydWN0IGR3X21jaV9ib2FyZCAqcGRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaG9zdC0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJY29uc3Qgc3RydWN0IGR3X21jaV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBob3N0LT5kcnZfZGF0YTsKIAlpbnQgcmV0OwogCXUzMiBjbG9ja19mcmVxdWVuY3k7CkBAIC0yOTQ4LDE1ICsyOTQ3LDE2IEBACiAJfQogCiAJLyogZmluZCBvdXQgbnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZCAqLwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtLXNsb3RzIiwgJnBkYXRhLT5udW1fc2xvdHMpOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJudW0tc2xvdHMiLCAmcGRhdGEtPm51bV9zbG90cyk7CiAKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmaWZvLWRlcHRoIiwgJnBkYXRhLT5maWZvX2RlcHRoKSkKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgImZpZm8tZGVwdGgiLCAmcGRhdGEtPmZpZm9fZGVwdGgpKQogCQlkZXZfaW5mbyhkZXYsCiAJCQkgImZpZm8tZGVwdGggcHJvcGVydHkgbm90IGZvdW5kLCB1c2luZyB2YWx1ZSBvZiBGSUZPVEggcmVnaXN0ZXIgYXMgZGVmYXVsdFxuIik7CiAKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNhcmQtZGV0ZWN0LWRlbGF5IiwgJnBkYXRhLT5kZXRlY3RfZGVsYXlfbXMpOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJjYXJkLWRldGVjdC1kZWxheSIsCisJCQkJICZwZGF0YS0+ZGV0ZWN0X2RlbGF5X21zKTsKIAotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmY2xvY2tfZnJlcXVlbmN5KSkKKwlpZiAoIWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJjbG9jay1mcmVxdWVuY3kiLCAmY2xvY2tfZnJlcXVlbmN5KSkKIAkJcGRhdGEtPmJ1c19oeiA9IGNsb2NrX2ZyZXF1ZW5jeTsKIAogCWlmIChkcnZfZGF0YSAmJiBkcnZfZGF0YS0+cGFyc2VfZHQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLWljZS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20taWNlLmMKaW5kZXggZDYyNGI0OC4uZjg2Y2U1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20taWNlLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20taWNlLmMKQEAgLTI3Niw2ICsyNzYsNTggQEAKIAltYigpOwogfQogCitzdGF0aWMgaW5saW5lCit2b2lkIHNkaGNpX21zbV9pY2VfaGNpX3VwZGF0ZV9jbWRxX2NmZyh1NjQgZHVuLCB1bnNpZ25lZCBpbnQgYnlwYXNzLAorCQkJCXNob3J0IGtleV9pbmRleCwgdTY0ICppY2VfY3R4KQoreworCS8qCisJICogVGhlIG5hbWluZyBjb252ZW50aW9uIGdvdCBjaGFuZ2VkIGJldHdlZW4gSUNFMi4wIGFuZCBJQ0UzLjAKKwkgKiByZWdpc3RlcnMgZmllbGRzLiBCZWxvdyBpcyB0aGUgZXF1aXZhbGVudCBuYW1lcyBmb3IKKwkgKiBJQ0UzLjAgVnMgSUNFMi4wOgorCSAqICAgRGF0YSBVbml0IE51bWJlcihEVU4pID09IExvZ2ljYWwgQmFzZSBhZGRyZXNzKExCQSkKKwkgKiAgIENyeXB0byBDb25maWd1cmF0aW9uIGluZGV4IChDQ0kpID09IEtleSBJbmRleAorCSAqICAgQ3J5cHRvIEVuYWJsZSAoQ0UpID09ICFCWVBBU1MKKwkgKi8KKwlpZiAoaWNlX2N0eCkKKwkJKmljZV9jdHggPSBEQVRBX1VOSVRfTlVNKGR1bikgfAorCQkJQ1JZUFRPX0NPTkZJR19JTkRFWChrZXlfaW5kZXgpIHwKKwkJCUNSWVBUT19FTkFCTEUoIWJ5cGFzcyk7Cit9CisKK3N0YXRpYwordm9pZCBzZGhjaV9tc21faWNlX2hjaV91cGRhdGVfbm9uY3FfY2ZnKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQl1NjQgZHVuLCB1bnNpZ25lZCBpbnQgYnlwYXNzLCBzaG9ydCBrZXlfaW5kZXgpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9tc21faG9zdCAqbXNtX2hvc3QgPSBwbHRmbV9ob3N0LT5wcml2OworCXVuc2lnbmVkIGludCBjcnlwdG9fcGFyYW1zID0gMDsKKwkvKgorCSAqIFRoZSBuYW1pbmcgY29udmVudGlvbiBnb3QgY2hhbmdlZCBiZXR3ZWVuIElDRTIuMCBhbmQgSUNFMy4wCisJICogcmVnaXN0ZXJzIGZpZWxkcy4gQmVsb3cgaXMgdGhlIGVxdWl2YWxlbnQgbmFtZXMgZm9yCisJICogSUNFMy4wIFZzIElDRTIuMDoKKwkgKiAgIERhdGEgVW5pdCBOdW1iZXIoRFVOKSA9PSBMb2dpY2FsIEJhc2UgYWRkcmVzcyhMQkEpCisJICogICBDcnlwdG8gQ29uZmlndXJhdGlvbiBpbmRleCAoQ0NJKSA9PSBLZXkgSW5kZXgKKwkgKiAgIENyeXB0byBFbmFibGUgKENFKSA9PSAhQllQQVNTCisJICovCisJLyogQ29uZmlndXJlIElDRSBieXBhc3MgbW9kZSAqLworCWNyeXB0b19wYXJhbXMgfD0KKwkJKCFieXBhc3MgJiBNQVNLX1NESENJX01TTV9JQ0VfSENJX1BBUkFNX0NFKQorCQkJPDwgT0ZGU0VUX1NESENJX01TTV9JQ0VfSENJX1BBUkFNX0NFOworCS8qIENvbmZpZ3VyZSBDcnlwdG8gQ29uZmlndXJlIEluZGV4IChDQ0kpICovCisJY3J5cHRvX3BhcmFtcyB8PSAoa2V5X2luZGV4ICYKKwkJCSBNQVNLX1NESENJX01TTV9JQ0VfSENJX1BBUkFNX0NDSSkKKwkJCSA8PCBPRkZTRVRfU0RIQ0lfTVNNX0lDRV9IQ0lfUEFSQU1fQ0NJOworCisJd3JpdGVsX3JlbGF4ZWQoKGNyeXB0b19wYXJhbXMgJiAweEZGRkZGRkZGKSwKKwkJbXNtX2hvc3QtPmNyeXB0b2lvICsgSUNFX05PTkNRX0NSWVBUT19QQVJBTVMpOworCisJLyogVXBkYXRlIERVTiAqLworCXdyaXRlbF9yZWxheGVkKChkdW4gJiAweEZGRkZGRkZGKSwKKwkJbXNtX2hvc3QtPmNyeXB0b2lvICsgSUNFX05PTkNRX0NSWVBUT19EVU4pOworCS8qIEVuc3VyZSBJQ0UgcmVnaXN0ZXJzIGFyZSBjb25maWd1cmVkIGJlZm9yZSBpc3N1aW5nIFNESENJIHJlcXVlc3QgKi8KKwltYigpOworfQorCiBpbnQgc2RoY2lfbXNtX2ljZV9jZmcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLAogCQkJdTMyIHNsb3QpCiB7CkBAIC0zMDgsNyArMzYwLDg4IEBACiAJCQkJc2xvdCwgYnlwYXNzLCBrZXlfaW5kZXgpOwogCX0KIAotCXNkaGNpX21zbV9pY2VfdXBkYXRlX2NmZyhob3N0LCBsYmEsIHNsb3QsIGJ5cGFzcywga2V5X2luZGV4KTsKKwlpZiAobXNtX2hvc3QtPmljZV9oY2lfc3VwcG9ydCkgeworCQkvKiBGb3IgSUNFIEhDSSAvIElDRTMuMCAqLworCQlzZGhjaV9tc21faWNlX2hjaV91cGRhdGVfbm9uY3FfY2ZnKGhvc3QsIGxiYSwgYnlwYXNzLAorCQkJCQkJa2V5X2luZGV4KTsKKwl9IGVsc2UgeworCQkvKiBGb3IgSUNFIHZlcnNpb25zIGVhcmxpZXIgdG8gSUNFMy4wICovCisJCXNkaGNpX21zbV9pY2VfdXBkYXRlX2NmZyhob3N0LCBsYmEsIHNsb3QsIGJ5cGFzcywga2V5X2luZGV4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZGhjaV9tc21faWNlX2NtZHFfY2ZnKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsIHUzMiBzbG90LCB1NjQgKmljZV9jdHgpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBzZGhjaV9tc21faG9zdCAqbXNtX2hvc3QgPSBwbHRmbV9ob3N0LT5wcml2OworCWludCBlcnIgPSAwOworCXNob3J0IGtleV9pbmRleCA9IDA7CisJc2VjdG9yX3QgbGJhID0gMDsKKwl1bnNpZ25lZCBpbnQgYnlwYXNzID0gU0RIQ0lfTVNNX0lDRV9FTkFCTEVfQllQQVNTOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwlpZiAobXNtX2hvc3QtPmljZS5zdGF0ZSAhPSBTREhDSV9NU01fSUNFX1NUQVRFX0FDVElWRSkgeworCQlwcl9lcnIoIiVzOiBpY2UgaXMgaW4gaW52YWxpZCBzdGF0ZSAlZFxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBtc21faG9zdC0+aWNlLnN0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJV0FSTl9PTighbXJxKTsKKwlpZiAoIW1ycSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmVxID0gbXJxLT5yZXE7CisJaWYgKHJlcSkgeworCQlsYmEgPSByZXEtPl9fc2VjdG9yOworCQllcnIgPSBzZGhjaV9tc21faWNlX2dldF9jZmcobXNtX2hvc3QsIHJlcSwgJmJ5cGFzcywgJmtleV9pbmRleCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlwcl9kZWJ1ZygiJXM6ICVzOiBzbG90ICVkIGJ5cGFzcyAlZCBrZXlfaW5kZXggJWRcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksCisJCQkJKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpID8gIldSSVRFIiA6ICJSRUFEIiwKKwkJCQlzbG90LCBieXBhc3MsIGtleV9pbmRleCk7CisJfQorCisJaWYgKG1zbV9ob3N0LT5pY2VfaGNpX3N1cHBvcnQpIHsKKwkJLyogRm9yIElDRSBIQ0kgLyBJQ0UzLjAgKi8KKwkJc2RoY2lfbXNtX2ljZV9oY2lfdXBkYXRlX2NtZHFfY2ZnKGxiYSwgYnlwYXNzLCBrZXlfaW5kZXgsCisJCQkJCQlpY2VfY3R4KTsKKwl9IGVsc2UgeworCQkvKiBGb3IgSUNFIHZlcnNpb25zIGVhcmxpZXIgdG8gSUNFMy4wICovCisJCXNkaGNpX21zbV9pY2VfdXBkYXRlX2NmZyhob3N0LCBsYmEsIHNsb3QsIGJ5cGFzcywga2V5X2luZGV4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZGhjaV9tc21faWNlX2NmZ19lbmQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc2RoY2lfbXNtX2hvc3QgKm1zbV9ob3N0ID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJaWYgKCFob3N0LT5pc19jcnlwdG9fZW4pCisJCXJldHVybiAwOworCisJaWYgKG1zbV9ob3N0LT5pY2Uuc3RhdGUgIT0gU0RIQ0lfTVNNX0lDRV9TVEFURV9BQ1RJVkUpIHsKKwkJcHJfZXJyKCIlczogaWNlIGlzIGluIGludmFsaWQgc3RhdGUgJWRcbiIsCisJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgbXNtX2hvc3QtPmljZS5zdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcSA9IG1ycS0+cmVxOworCWlmIChyZXEpIHsKKwkJaWYgKG1zbV9ob3N0LT5pY2Uudm9wcy0+Y29uZmlnX2VuZCkgeworCQkJZXJyID0gbXNtX2hvc3QtPmljZS52b3BzLT5jb25maWdfZW5kKHJlcSk7CisJCQlpZiAoZXJyKSB7CisJCQkJcHJfZXJyKCIlczogaWNlIGNvbmZpZyBlbmQgZmFpbGVkICVkXG4iLAorCQkJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGVycik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS1pY2UuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLWljZS5oCmluZGV4IDIzOTIyY2YuLjYyOTYxNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLWljZS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLWljZS5oCkBAIC00Miw2ICs0Miw4IEBACiAjZGVmaW5lIElDRV9IQ0lfU1VQUE9SVAkJKDEgPDwgMjgpCiAjZGVmaW5lIElDRV9DUV9DT05GSUcJCTB4MDgKICNkZWZpbmUgQ1JZUFRPX0dFTkVSQUxfRU5BQkxFCSgxIDw8IDEpCisjZGVmaW5lIElDRV9OT05DUV9DUllQVE9fUEFSQU1TCTB4NzAKKyNkZWZpbmUgSUNFX05PTkNRX0NSWVBUT19EVU4JMHg3NAogCiAvKiBJQ0UzLjAgcmVnaXN0ZXIgd2hpY2ggZ290IGFkZGVkIGhjIHJlZyBzcGFjZSAqLwogI2RlZmluZSBIQ19WRU5ET1JfU1BFQ0lGSUNfRlVOQzQJMHgyNjAKQEAgLTUyLDggKzU0LDEwIEBACiAvKiBTREhDSSBNU00gSUNFIENUUkwgSW5mbyByZWdpc3RlciBvZmZzZXQgKi8KIGVudW0gewogCU9GRlNFVF9TREhDSV9NU01fSUNFX0NUUkxfSU5GT19CWVBBU1MgICAgID0gMCwKLQlPRkZTRVRfU0RIQ0lfTVNNX0lDRV9DVFJMX0lORk9fS0VZX0lOREVYICA9IDB4MSwKLQlPRkZTRVRfU0RIQ0lfTVNNX0lDRV9DVFJMX0lORk9fQ0RVICAgICAgICA9IDB4NiwKKwlPRkZTRVRfU0RIQ0lfTVNNX0lDRV9DVFJMX0lORk9fS0VZX0lOREVYICA9IDEsCisJT0ZGU0VUX1NESENJX01TTV9JQ0VfQ1RSTF9JTkZPX0NEVSAgICAgICAgPSA2LAorCU9GRlNFVF9TREhDSV9NU01fSUNFX0hDSV9QQVJBTV9DQ0kJICA9IDAsCisJT0ZGU0VUX1NESENJX01TTV9JQ0VfSENJX1BBUkFNX0NFCSAgPSA4LAogfTsKIAogLyogU0RIQ0kgTVNNIElDRSBDVFJMIEluZm8gcmVnaXN0ZXIgbWFza3MgKi8KQEAgLTYxLDYgKzY1LDggQEAKIAlNQVNLX1NESENJX01TTV9JQ0VfQ1RSTF9JTkZPX0JZUEFTUyAgICAgPSAweDEsCiAJTUFTS19TREhDSV9NU01fSUNFX0NUUkxfSU5GT19LRVlfSU5ERVggID0gMHgxRiwKIAlNQVNLX1NESENJX01TTV9JQ0VfQ1RSTF9JTkZPX0NEVSAgICAgICAgPSAweDcsCisJTUFTS19TREhDSV9NU01fSUNFX0hDSV9QQVJBTV9DRQkJPSAweDEsCisJTUFTS19TREhDSV9NU01fSUNFX0hDSV9QQVJBTV9DQ0kJPSAweGZmCiB9OwogCiAvKiBTREhDSSBNU00gSUNFIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBieXBhc3Mgc3RhdGUgKi8KQEAgLTk5LDYgKzEwNSw5IEBACiB2b2lkIHNkaGNpX21zbV9pY2VfY2ZnX3Jlc2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgc2xvdCk7CiBpbnQgc2RoY2lfbXNtX2ljZV9jZmcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLAogCQkJdTMyIHNsb3QpOworaW50IHNkaGNpX21zbV9pY2VfY21kcV9jZmcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCisJCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwgdTMyIHNsb3QsIHU2NCAqaWNlX2N0eCk7CitpbnQgc2RoY2lfbXNtX2ljZV9jZmdfZW5kKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSk7CiBpbnQgc2RoY2lfbXNtX2ljZV9yZXNldChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiBpbnQgc2RoY2lfbXNtX2ljZV9yZXN1bWUoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogaW50IHNkaGNpX21zbV9pY2Vfc3VzcGVuZChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CkBAIC0xMzAsNiArMTM5LDE2IEBACiB7CiAJcmV0dXJuIDA7CiB9CitzdGF0aWMgaW5saW5lIGludCBzZGhjaV9tc21faWNlX2NtZHFfY2ZnKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwgdTMyIHNsb3QsIHU2NCAqaWNlX2N0eCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHNkaGNpX21zbV9pY2VfY2ZnX2VuZChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKKwkJCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXJldHVybiAwOworfQogaW5saW5lIGludCBzZGhjaV9tc21faWNlX3Jlc2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmMKaW5kZXggMWUyNWIzMS4uNTVkOWNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jCkBAIC0xNDYsNiArMTQ2LDcgQEAKICNkZWZpbmUgQ09SRV9TVEFSVF9DRENfVFJBRkZJQwkJKDEgPDwgNikKIAogI2RlZmluZSBDT1JFX1BXUlNBVkVfRExMCSgxIDw8IDMpCisjZGVmaW5lIENPUkVfRklGT19BTFRfRU4JKDEgPDwgMTApCiAjZGVmaW5lIENPUkVfQ01ERU5fSFM0MDBfSU5QVVRfTUFTS19DTlQgKDEgPDwgMTMpCiAKICNkZWZpbmUgQ09SRV9ERFJfQ0FMX0VOCQkoMSA8PCAwKQpAQCAtMTE0Myw2ICsxMTQ0LDcgQEAKIAlib29sIGRydl90eXBlX2NoYW5nZWQgPSBmYWxzZTsKIAlzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQgPSBob3N0LT5tbWMtPmNhcmQ7CiAJaW50IHN0c19yZXRyeTsKKwl1OCBsYXN0X2dvb2RfcGhhc2UgPSAwOwogCiAJLyoKIAkgKiBUdW5pbmcgaXMgcmVxdWlyZWQgZm9yIFNEUjEwNCwgSFMyMDAgYW5kIEhTNDAwIGNhcmRzIGFuZApAQCAtMTIyOCw2ICsxMjMwLDIyIEBACiAJCW1tY193YWl0X2Zvcl9yZXEobW1jLCAmbXJxKTsKIAogCQlpZiAoY2FyZCAmJiAoY21kLmVycm9yIHx8IGRhdGEuZXJyb3IpKSB7CisJCQkvKgorCQkJICogU2V0IHRoZSBkbGwgdG8gbGFzdCBrbm93biBnb29kIHBoYXNlIHdoaWxlIHNlbmRpbmcKKwkJCSAqIHN0YXR1cyBjb21tYW5kIHRvIGVuc3VyZSB0aGF0IHN0YXR1cyBjb21tYW5kIHdvbid0CisJCQkgKiBmYWlsIGR1ZSB0byBiYWQgcGhhc2UuCisJCQkgKi8KKwkJCWlmICh0dW5lZF9waGFzZV9jbnQpCisJCQkJbGFzdF9nb29kX3BoYXNlID0KKwkJCQkJdHVuZWRfcGhhc2VzW3R1bmVkX3BoYXNlX2NudC0xXTsKKwkJCWVsc2UgaWYgKG1zbV9ob3N0LT5zYXZlZF90dW5pbmdfcGhhc2UgIT0KKwkJCQkJSU5WQUxJRF9UVU5JTkdfUEhBU0UpCisJCQkJbGFzdF9nb29kX3BoYXNlID0gbXNtX2hvc3QtPnNhdmVkX3R1bmluZ19waGFzZTsKKworCQkJcmMgPSBtc21fY29uZmlnX2NtX2RsbF9waGFzZShob3N0LCBsYXN0X2dvb2RfcGhhc2UpOworCQkJaWYgKHJjKQorCQkJCWdvdG8ga2ZyZWU7CisKIAkJCXN0c19jbWQub3Bjb2RlID0gTU1DX1NFTkRfU1RBVFVTOwogCQkJc3RzX2NtZC5hcmcgPSBjYXJkLT5yY2EgPDwgMTY7CiAJCQlzdHNfY21kLmZsYWdzID0gTU1DX1JTUF9SMSB8IE1NQ19DTURfQUM7CkBAIC0xODg0LDggKzE5MDIsMTYgQEAKIAkJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBjbG9jayB0YWJsZVxuIik7CiAJCQlnb3RvIG91dDsKIAkJfQorCQlpZiAoaWNlX2Nsa190YWJsZV9sZW4gIT0gMikgeworCQkJZGV2X2VycihkZXYsICJOZWVkIG1heCBhbmQgbWluIGZyZXF1ZW5jaWVzIGluIHRoZSB0YWJsZVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQogCQlwZGF0YS0+c3VwX2ljZV9jbGtfdGFibGUgPSBpY2VfY2xrX3RhYmxlOwogCQlwZGF0YS0+c3VwX2ljZV9jbGtfY250ID0gaWNlX2Nsa190YWJsZV9sZW47CisJCXBkYXRhLT5pY2VfY2xrX21heCA9IHBkYXRhLT5zdXBfaWNlX2Nsa190YWJsZVswXTsKKwkJcGRhdGEtPmljZV9jbGtfbWluID0gcGRhdGEtPnN1cF9pY2VfY2xrX3RhYmxlWzFdOworCQlkZXZfZGJnKGRldiwgInN1cHBvcnRlZCBJQ0UgY2xvY2sgcmF0ZXMgKEh6KTogbWF4OiAldSBtaW46ICV1XG4iLAorCQkJCXBkYXRhLT5pY2VfY2xrX21heCwgcGRhdGEtPmljZV9jbGtfbWluKTsKIAl9CiAKIAlwZGF0YS0+dnJlZ19kYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdApAQCAtMzM5MCw2ICszNDE2LDggQEAKIAkvKiByZWdpc3RlcnMgb2Zmc2V0IGNoYW5nZWQgc3RhcnRpbmcgZnJvbSA0LjIuMCAqLwogCWludCBvZmZzZXQgPSBtaW5vciA+PSBTREhDSV9NU01fVkVSXzQyMCA/IDAgOiAweDQ4OwogCisJaWYgKGNxX2hvc3QtPm9mZnNldF9jaGFuZ2VkKQorCQlvZmZzZXQgKz0gQ1FfVjVfVkVORE9SX0NGRzsKIAlwcl9lcnIoIi0tLS0gRGVidWcgUkFNIGR1bXAgLS0tLVxuIik7CiAJcHJfZXJyKERSVl9OQU1FICI6IERlYnVnIFJBTSB3cmFwLWFyb3VuZDogMHglMDh4IHwgRGVidWcgUkFNIG92ZXJsYXA6IDB4JTA4eFxuIiwKIAkgICAgICAgY21kcV9yZWFkbChjcV9ob3N0LCBDUV9DTURfREJHX1JBTV9XQSArIG9mZnNldCksCkBAIC00MDk1LDggKzQxMjMsMzcgQEAKIAlyZXR1cm4gbWF4X2N1cnI7CiB9CiAKK3N0YXRpYyBpbnQgc2RoY2lfbXNtX25vdGlmeV9sb2FkKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBlbnVtIG1tY19sb2FkIHN0YXRlKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc2RoY2lfbXNtX2hvc3QgKm1zbV9ob3N0ID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgY2xrX3JhdGUgPSAwOworCisJaWYgKCFJU19FUlIobXNtX2hvc3QtPmljZV9jbGspKSB7CisJCWNsa19yYXRlID0gKHN0YXRlID09IE1NQ19MT0FEX0xPVykgPworCQkJbXNtX2hvc3QtPnBkYXRhLT5pY2VfY2xrX21pbiA6CisJCQltc21faG9zdC0+cGRhdGEtPmljZV9jbGtfbWF4OworCQlpZiAobXNtX2hvc3QtPmljZV9jbGtfcmF0ZSA9PSBjbGtfcmF0ZSkKKwkJCXJldHVybiAwOworCQlwcl9kZWJ1ZygiJXM6IGNoYW5naW5nIElDRSBjbGsgcmF0ZSB0byAldVxuIiwKKwkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgY2xrX3JhdGUpOworCQlyZXQgPSBjbGtfc2V0X3JhdGUobXNtX2hvc3QtPmljZV9jbGssIGNsa19yYXRlKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCIlczogSUNFX0NMSyByYXRlIHNldCBmYWlsZWQgKCVkKSBmb3IgJXVcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIHJldCwgY2xrX3JhdGUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltc21faG9zdC0+aWNlX2Nsa19yYXRlID0gY2xrX3JhdGU7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9tc21fb3BzID0gewogCS5jcnlwdG9fZW5naW5lX2NmZyA9IHNkaGNpX21zbV9pY2VfY2ZnLAorCS5jcnlwdG9fZW5naW5lX2NtZHFfY2ZnID0gc2RoY2lfbXNtX2ljZV9jbWRxX2NmZywKKwkuY3J5cHRvX2VuZ2luZV9jZmdfZW5kID0gc2RoY2lfbXNtX2ljZV9jZmdfZW5kLAorCS5jcnlwdG9fY2ZnX3Jlc2V0ID0gc2RoY2lfbXNtX2ljZV9jZmdfcmVzZXQsCiAJLmNyeXB0b19lbmdpbmVfcmVzZXQgPSBzZGhjaV9tc21faWNlX3Jlc2V0LAogCS5zZXRfdWhzX3NpZ25hbGluZyA9IHNkaGNpX21zbV9zZXRfdWhzX3NpZ25hbGluZywKIAkuY2hlY2tfcG93ZXJfc3RhdHVzID0gc2RoY2lfbXNtX2NoZWNrX3Bvd2VyX3N0YXR1cywKQEAgLTQxMTksNiArNDE3Niw3IEBACiAJLnByZV9yZXEgPSBzZGhjaV9tc21fcHJlX3JlcSwKIAkucG9zdF9yZXEgPSBzZGhjaV9tc21fcG9zdF9yZXEsCiAJLmdldF9jdXJyZW50X2xpbWl0ID0gc2RoY2lfbXNtX2dldF9jdXJyZW50X2xpbWl0LAorCS5ub3RpZnlfbG9hZCA9IHNkaGNpX21zbV9ub3RpZnlfbG9hZCwKIH07CiAKIHN0YXRpYyB2b2lkIHNkaGNpX3NldF9kZWZhdWx0X2h3X2NhcHMoc3RydWN0IHNkaGNpX21zbV9ob3N0ICptc21faG9zdCwKQEAgLTQxOTYsNyArNDI1NCw3IEBACiAJICogc3RhcnRzIGNvbWluZy4KIAkgKi8KIAlpZiAoKG1ham9yID09IDEpICYmICgobWlub3IgPT0gMHg0MikgfHwgKG1pbm9yID09IDB4NDYpIHx8Ci0JCQkJKG1pbm9yID09IDB4NDkpKSkKKwkJCQkobWlub3IgPT0gMHg0OSkgfHwgKG1pbm9yID49IDB4NmIpKSkKIAkJbXNtX2hvc3QtPnVzZV8xNGxwcF9kbGwgPSB0cnVlOwogCiAJLyogRmFrZSAzLjBWIHN1cHBvcnQgZm9yIFNESU8gZGV2aWNlcyB3aGljaCByZXF1aXJlcyBzdWNoIHZvbHRhZ2UgKi8KQEAgLTQyMjEsOCArNDI3OSwxMCBAQAogCS8qIGtlZXAgdHJhY2sgb2YgdGhlIHZhbHVlIGluIFNESENJX0NBUEFCSUxJVElFUyAqLwogCW1zbV9ob3N0LT5jYXBzXzAgPSBjYXBzOwogCi0JaWYgKChtYWpvciA9PSAxKSAmJiAobWlub3IgPj0gMHg2YikpCisJaWYgKChtYWpvciA9PSAxKSAmJiAobWlub3IgPj0gMHg2YikpIHsKIAkJbXNtX2hvc3QtPmljZV9oY2lfc3VwcG9ydCA9IHRydWU7CisJCWhvc3QtPmNkcl9zdXBwb3J0ID0gdHJ1ZTsKKwl9CiB9CiAKICNpZmRlZiBDT05GSUdfTU1DX0NRX0hDSQpAQCAtNDI4OSw2ICs0MzQ5LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnRsbW1fbWVtcmVzID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKnRsbW1fbWVtOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBmb3JjZV9wcm9iZTsKIAogCXByX2RlYnVnKCIlczogRW50ZXIgJXNcbiIsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBfX2Z1bmNfXyk7CiAJbXNtX2hvc3QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzZGhjaV9tc21faG9zdCksCkBAIC00MzI4LDcgKzQzODksNyBAQAogCQkgKi8KIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHJlcXVpcmVkIElDRSBkZXZpY2Ugbm90IHByb2JlZCB5ZXQgZXJyID0gJWRcbiIsCiAJCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBvdXRfaG9zdF9mcmVlOworCQlnb3RvIHBsdGZtX2ZyZWU7CiAKIAl9IGVsc2UgaWYgKHJldCA9PSAtRU5PREVWKSB7CiAJCS8qCkBAIC00MzQwLDcgKzQ0MDEsNyBAQAogCX0gZWxzZSBpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzZGhjaV9tc21faWNlX2dldF9kZXYgZmFpbGVkICVkXG4iLAogCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gb3V0X2hvc3RfZnJlZTsKKwkJZ290byBwbHRmbV9mcmVlOwogCX0KIAogCS8qIEV4dHJhY3QgcGxhdGZvcm0gZGF0YSAqLwpAQCAtNDM1Miw4ICs0NDEzLDEzIEBACiAJCQlnb3RvIHBsdGZtX2ZyZWU7CiAJCX0KIAorCQkvKiBSZWFkIHByb3BlcnR5IHRvIGRldGVybWluZSBpZiB0aGUgcHJvYmUgaXMgZm9yY2VkICovCisJCWZvcmNlX3Byb2JlID0gb2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCSJxY29tLGZvcmNlLXNkaGMxLXByb2JlIiwgTlVMTCk7CisKIAkJLyogc2tpcCB0aGUgcHJvYmUgaWYgZU1NQyBpc24ndCBhIGJvb3QgZGV2aWNlICovCi0JCWlmICgocmV0ID09IDEpICYmICFzZGhjaV9tc21faXNfYm9vdGRldmljZSgmcGRldi0+ZGV2KSkgeworCQlpZiAoKHJldCA9PSAxKSAmJiAhc2RoY2lfbXNtX2lzX2Jvb3RkZXZpY2UoJnBkZXYtPmRldikKKwkJICAgICYmICFmb3JjZV9wcm9iZSkgewogCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWdvdG8gcGx0Zm1fZnJlZTsKIAkJfQpAQCAtNDQwOCwxMSArNDQ3NCwxMSBAQAogCQlpZiAoIUlTX0VSUihtc21faG9zdC0+aWNlX2NsaykpIHsKIAkJCS8qIElDRSBjb3JlIGhhcyBvbmx5IG9uZSBjbG9jayBmcmVxdWVuY3kgZm9yIG5vdyAqLwogCQkJcmV0ID0gY2xrX3NldF9yYXRlKG1zbV9ob3N0LT5pY2VfY2xrLAotCQkJCQltc21faG9zdC0+cGRhdGEtPnN1cF9pY2VfY2xrX3RhYmxlWzBdKTsKKwkJCQkJbXNtX2hvc3QtPnBkYXRhLT5pY2VfY2xrX21heCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSUNFX0NMSyByYXRlIHNldCBmYWlsZWQgKCVkKSBmb3IgJXVcbiIsCiAJCQkJCXJldCwKLQkJCQkJbXNtX2hvc3QtPnBkYXRhLT5zdXBfaWNlX2Nsa190YWJsZVswXSk7CisJCQkJCW1zbV9ob3N0LT5wZGF0YS0+aWNlX2Nsa19tYXgpOwogCQkJCWdvdG8gcGNsa19kaXNhYmxlOwogCQkJfQogCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5pY2VfY2xrKTsKQEAgLTQ0MjAsNyArNDQ4Niw3IEBACiAJCQkJZ290byBwY2xrX2Rpc2FibGU7CiAKIAkJCW1zbV9ob3N0LT5pY2VfY2xrX3JhdGUgPQotCQkJCW1zbV9ob3N0LT5wZGF0YS0+c3VwX2Nsa190YWJsZVswXTsKKwkJCQltc21faG9zdC0+cGRhdGEtPmljZV9jbGtfbWF4OwogCQl9CiAJfQogCkBAIC00NTE4LDYgKzQ1ODQsMTQgQEAKIAl3cml0ZWxfcmVsYXhlZChDT1JFX1ZFTkRPUl9TUEVDX1BPUl9WQUwsCiAJaG9zdC0+aW9hZGRyICsgbXNtX2hvc3Rfb2Zmc2V0LT5DT1JFX1ZFTkRPUl9TUEVDKTsKIAorCS8qCisJICogRW5zdXJlIFNESENJIEZJRk8gaXMgZW5hYmxlZCBieSBkaXNhYmxpbmcgYWx0ZXJuYXRpdmUgRklGTworCSAqLworCXdyaXRlbF9yZWxheGVkKChyZWFkbF9yZWxheGVkKGhvc3QtPmlvYWRkciArCisJCQltc21faG9zdF9vZmZzZXQtPkNPUkVfVkVORE9SX1NQRUMzKSAmCisJCQl+Q09SRV9GSUZPX0FMVF9FTiksIGhvc3QtPmlvYWRkciArCisJCQltc21faG9zdF9vZmZzZXQtPkNPUkVfVkVORE9SX1NQRUMzKTsKKwogCWlmICghbXNtX2hvc3QtPm1jaV9yZW1vdmVkKSB7CiAJCS8qIFNldCBIQ19NT0RFX0VOIGJpdCBpbiBIQ19NT0RFIHJlZ2lzdGVyICovCiAJCXdyaXRlbF9yZWxheGVkKEhDX01PREVfRU4sIChtc21faG9zdC0+Y29yZV9tZW0gKyBDT1JFX0hDX01PREUpKTsKQEAgLTQ5MTQsOCArNDk4OCw2IEBACiAJCWlmIChtc21faG9zdC0+bXNtX2J1c192b3RlLmNsaWVudF9oYW5kbGUpCiAJCQlzZGhjaV9tc21fYnVzX2NhbmNlbF93b3JrX2FuZF9zZXRfdm90ZShob3N0LCAwKTsKIAl9Ci0JdHJhY2Vfc2RoY2lfbXNtX3J1bnRpbWVfc3VzcGVuZChtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgMCwKLQkJCWt0aW1lX3RvX3VzKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgc3RhcnQpKSk7CiAKIAlpZiAoaG9zdC0+aXNfY3J5cHRvX2VuKSB7CiAJCXJldCA9IHNkaGNpX21zbV9pY2Vfc3VzcGVuZChob3N0KTsKQEAgLTQ5MjMsNiArNDk5NSw4IEBACiAJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc3VzcGVuZCBjcnlwdG8gZW5naW5lICVkXG4iLAogCQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgcmV0KTsKIAl9CisJdHJhY2Vfc2RoY2lfbXNtX3J1bnRpbWVfc3VzcGVuZChtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgMCwKKwkJCWt0aW1lX3RvX3VzKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgc3RhcnQpKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUwNTAsNyArNTEyNCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzZGhjaV9tc21fcG1vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoc2RoY2lfbXNtX3N1c3BlbmQsIHNkaGNpX21zbV9yZXN1bWUpCisJU0VUX0xBVEVfU1lTVEVNX1NMRUVQX1BNX09QUyhzZGhjaV9tc21fc3VzcGVuZCwgc2RoY2lfbXNtX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMoc2RoY2lfbXNtX3J1bnRpbWVfc3VzcGVuZCwgc2RoY2lfbXNtX3J1bnRpbWVfcmVzdW1lLAogCQkJICAgTlVMTCkKIAkuc3VzcGVuZF9ub2lycSA9IHNkaGNpX21zbV9zdXNwZW5kX25vaXJxLApAQCAtNTA3NCw2ICs1MTQ4LDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2lfbXNtIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wcm9iZV90eXBlID0gUFJPQkVfUFJFRkVSX0FTWU5DSFJPTk9VUywKIAkJLm9mX21hdGNoX3RhYmxlID0gc2RoY2lfbXNtX2R0X21hdGNoLAogCQkucG0JPSBTREhDSV9NU01fUE1PUFMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5oCmluZGV4IGNkYmFhYTkuLjdjMGI4NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uaApAQCAtMTUxLDYgKzE1MSw4IEBACiAJdW5zaWduZWQgY2hhciBzdXBfaWNlX2Nsa19jbnQ7CiAJc3RydWN0IHNkaGNpX21zbV9wbV9xb3NfZGF0YSBwbV9xb3NfZGF0YTsKIAlib29sIHNkcjEwNF93YTsKKwl1MzIgaWNlX2Nsa19tYXg7CisJdTMyIGljZV9jbGtfbWluOwogfTsKIAogc3RydWN0IHNkaGNpX21zbV9idXNfdm90ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWF0OTEuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXQ5MS5jCmluZGV4IGE4YjQzMGYuLjgzYjg0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXQ5MS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXQ5MS5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNkZWZpbmUgU0RNTUNfTUMxUgkweDIwNAogI2RlZmluZQkJU0RNTUNfTUMxUl9ERFIJCUJJVCgzKQorI2RlZmluZQkJU0RNTUNfTUMxUl9GQ0QJCUJJVCg3KQogI2RlZmluZSBTRE1NQ19DQUNSCTB4MjMwCiAjZGVmaW5lCQlTRE1NQ19DQUNSX0NBUFdSRU4JQklUKDApCiAjZGVmaW5lCQlTRE1NQ19DQUNSX0tFWQkJKDB4NDYgPDwgOCkKQEAgLTQzLDYgKzQ0LDE1IEBACiAJc3RydWN0IGNsayAqbWFpbmNrOwogfTsKIAorc3RhdGljIHZvaWQgc2RoY2lfYXQ5MV9zZXRfZm9yY2VfY2FyZF9kZXRlY3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJdTggbWMxcjsKKworCW1jMXIgPSByZWFkYihob3N0LT5pb2FkZHIgKyBTRE1NQ19NQzFSKTsKKwltYzFyIHw9IFNETU1DX01DMVJfRkNEOworCXdyaXRlYihtYzFyLCBob3N0LT5pb2FkZHIgKyBTRE1NQ19NQzFSKTsKK30KKwogc3RhdGljIHZvaWQgc2RoY2lfYXQ5MV9zZXRfY2xvY2soc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCBjbG9jaykKIHsKIAl1MTYgY2xrOwpAQCAtMTEyLDEwICsxMjIsMTggQEAKIAlzZGhjaV9zZXRfdWhzX3NpZ25hbGluZyhob3N0LCB0aW1pbmcpOwogfQogCitzdGF0aWMgdm9pZCBzZGhjaV9hdDkxX3Jlc2V0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1OCBtYXNrKQoreworCXNkaGNpX3Jlc2V0KGhvc3QsIG1hc2spOworCisJaWYgKGhvc3QtPm1tYy0+Y2FwcyAmIE1NQ19DQVBfTk9OUkVNT1ZBQkxFKQorCQlzZGhjaV9hdDkxX3NldF9mb3JjZV9jYXJkX2RldGVjdChob3N0KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfYXQ5MV9zYW1hNWQyX29wcyA9IHsKIAkuc2V0X2Nsb2NrCQk9IHNkaGNpX2F0OTFfc2V0X2Nsb2NrLAogCS5zZXRfYnVzX3dpZHRoCQk9IHNkaGNpX3NldF9idXNfd2lkdGgsCi0JLnJlc2V0CQkJPSBzZGhjaV9yZXNldCwKKwkucmVzZXQJCQk9IHNkaGNpX2F0OTFfcmVzZXQsCiAJLnNldF91aHNfc2lnbmFsaW5nCT0gc2RoY2lfYXQ5MV9zZXRfdWhzX3NpZ25hbGluZywKIAkuc2V0X3Bvd2VyCQk9IHNkaGNpX2F0OTFfc2V0X3Bvd2VyLAogfTsKQEAgLTMyMiw2ICszNDAsMjEgQEAKIAkJaG9zdC0+cXVpcmtzICY9IH5TREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT047CiAJfQogCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBNTUMgYnVzIGlzIG5vdCByZW1vdmFibGUsIGl0IGlzIHNhZmVyCisJICogdG8gc2V0IHRoZSBGb3JjZSBDYXJkIERldGVjdCBiaXQuIFBlb3BsZSBvZnRlbiBkb24ndCBjb25uZWN0IHRoZQorCSAqIGNhcmQgZGV0ZWN0IHNpZ25hbCBhbmQgdXNlIHRoaXMgcGluIGZvciBhbm90aGVyIHB1cnBvc2UuIElmIHRoZSBjYXJkCisJICogZGV0ZWN0IHBpbiBpcyBub3QgbXV4ZWQgdG8gU0RIQ0kgY29udHJvbGxlciwgYSBkZWZhdWx0IHZhbHVlIGlzCisJICogdXNlZC4gVGhpcyB2YWx1ZSBjYW4gYmUgZGlmZmVyZW50IGZyb20gYSBTb0MgcmV2aXNpb24gdG8gYW5vdGhlcgorCSAqIG9uZS4gUHJvYmxlbXMgY29tZSB3aGVuIHRoaXMgZGVmYXVsdCB2YWx1ZSBpcyBub3QgY2FyZCBwcmVzZW50LiBUbworCSAqIGF2b2lkIHRoaXMgY2FzZSwgaWYgdGhlIGRldmljZSBpcyBub24gcmVtb3ZhYmxlIHRoZW4gdGhlIGNhcmQKKwkgKiBkZXRlY3Rpb24gcHJvY2VkdXJlIHVzaW5nIHRoZSBTRE1DQ19DRCBzaWduYWwgaXMgYnlwYXNzZWQuCisJICogVGhpcyBiaXQgaXMgcmVzZXQgd2hlbiBhIHNvZnR3YXJlIHJlc2V0IGZvciBhbGwgY29tbWFuZCBpcyBwZXJmb3JtZWQKKwkgKiBzbyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgb3duIHJlc2V0IGZ1bmN0aW9uIHRvIHNldCBiYWNrIHRoaXMgYml0LgorCSAqLworCWlmIChob3N0LT5tbWMtPmNhcHMgJiBNTUNfQ0FQX05PTlJFTU9WQUJMRSkKKwkJc2RoY2lfYXQ5MV9zZXRfZm9yY2VfY2FyZF9kZXRlY3QoaG9zdCk7CisKIAlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IDY4ZTQ5YmIuLjQ0NzZlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTE3ODUsNiArMTc4NSwyMiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgc2RoY2lfY3J5cHRvX2NmZ19lbmQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCisJCQkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoaG9zdC0+b3BzLT5jcnlwdG9fZW5naW5lX2NmZ19lbmQpIHsKKwkJZXJyID0gaG9zdC0+b3BzLT5jcnlwdG9fZW5naW5lX2NmZ19lbmQoaG9zdCwgbXJxKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNvbmZpZ3VyZSBjcnlwdG9cbiIsCisJCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHNkaGNpX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwpAQCAtMjg3Niw2ICsyODkyLDcgQEAKIAltbWlvd2IoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKKwlzZGhjaV9jcnlwdG9fY2ZnX2VuZChob3N0LCBtcnEpOwogCW1tY19yZXF1ZXN0X2RvbmUoaG9zdC0+bW1jLCBtcnEpOwogCiAJcmV0dXJuIGZhbHNlOwpAQCAtMzA4OCwxMiArMzEwNSw2IEBACiAJCSAqIGFib3ZlIGluIHNkaGNpX2NtZF9pcnEoKS4KIAkJICovCiAJCWlmIChkYXRhX2NtZCAmJiAoZGF0YV9jbWQtPmZsYWdzICYgTU1DX1JTUF9CVVNZKSkgewotCQkJaWYgKGludG1hc2sgJiBTREhDSV9JTlRfREFUQV9USU1FT1VUKSB7Ci0JCQkJaG9zdC0+ZGF0YV9jbWQgPSBOVUxMOwotCQkJCWRhdGFfY21kLT5lcnJvciA9IC1FVElNRURPVVQ7Ci0JCQkJc2RoY2lfZmluaXNoX21ycShob3N0LCBkYXRhX2NtZC0+bXJxKTsKLQkJCQlyZXR1cm47Ci0JCQl9CiAJCQlpZiAoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX0VORCkgewogCQkJCWhvc3QtPmRhdGFfY21kID0gTlVMTDsKIAkJCQkvKgpAQCAtMzEwOCw4ICszMTE5LDIxIEBACiAJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKGhvc3QtPnF1aXJrczIgJgotCQkJCVNESENJX1FVSVJLMl9JR05PUkVfREFUQVRPVVRfRk9SX1IxQkNNRCkKKwkJCQlTREhDSV9RVUlSSzJfSUdOT1JFX0RBVEFUT1VUX0ZPUl9SMUJDTUQpIHsKKwkJCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIiVzOiAlczogaWdub3JpbmcgaW50ZXJydXB0OiAweCUwOHggZHVlIHRvIERBVEFUT1VUX0ZPUl9SMUIgcXVpcmtcbiIsCisJCQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwKKwkJCQkJCV9fZnVuY19fLCBpbnRtYXNrKTsKKwkJCQlNTUNfVFJBQ0UoaG9zdC0+bW1jLAorCQkJCQkiJXM6IFF1aXJrIGlnbm9yaW5nIGludHI6IDB4JTA4eFxuIiwKKwkJCQkJCV9fZnVuY19fLCBpbnRtYXNrKTsKIAkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoaW50bWFzayAmIFNESENJX0lOVF9EQVRBX1RJTUVPVVQpIHsKKwkJCQlob3N0LT5kYXRhX2NtZCA9IE5VTEw7CisJCQkJZGF0YV9jbWQtPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJCQlzZGhjaV9maW5pc2hfbXJxKGhvc3QsIGRhdGFfY21kLT5tcnEpOworCQkJCXJldHVybjsKKwkJCX0KIAkJfQogCiAJCS8qCkBAIC0zNjg5LDcgKzM3MTMsNyBAQAogCQkJY3RybCB8PSBTREhDSV9DVFJMX0FETUEzMjsKIAkJc2RoY2lfd3JpdGViKGhvc3QsIGN0cmwsIFNESENJX0hPU1RfQ09OVFJPTCk7CiAJfQotCWlmIChob3N0LT5vcHMtPnRvZ2dsZV9jZHIpCisJaWYgKGhvc3QtPm9wcy0+dG9nZ2xlX2NkciAmJiAhaG9zdC0+Y2RyX3N1cHBvcnQpCiAJCWhvc3QtPm9wcy0+dG9nZ2xlX2Nkcihob3N0LCBmYWxzZSk7CiB9CiAKQEAgLTM3NjgsMTQgKzM3OTIsNDYgQEAKIAlzZGhjaV93cml0ZWwoaG9zdCwgU0RIQ0lfSU5UX1JFU1BPTlNFLCBTREhDSV9JTlRfU1RBVFVTKTsKIH0KIHN0YXRpYyBpbnQgc2RoY2lfY21kcV9jcnlwdG9fY2ZnKHN0cnVjdCBtbWNfaG9zdCAqbW1jLAotCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwgdTMyIHNsb3QpCisJCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLCB1MzIgc2xvdCwgdTY0ICppY2VfY3R4KQoreworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghaG9zdC0+aXNfY3J5cHRvX2VuKQorCQlyZXR1cm4gMDsKKworCWlmIChob3N0LT5jcnlwdG9fcmVzZXRfcmVxZCAmJiBob3N0LT5vcHMtPmNyeXB0b19lbmdpbmVfcmVzZXQpIHsKKwkJZXJyID0gaG9zdC0+b3BzLT5jcnlwdG9fZW5naW5lX3Jlc2V0KGhvc3QpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiVzOiBjcnlwdG8gcmVzZXQgZmFpbGVkXG4iLAorCQkJCQltbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlob3N0LT5jcnlwdG9fcmVzZXRfcmVxZCA9IGZhbHNlOworCX0KKworCWlmIChob3N0LT5vcHMtPmNyeXB0b19lbmdpbmVfY21kcV9jZmcpIHsKKwkJZXJyID0gaG9zdC0+b3BzLT5jcnlwdG9fZW5naW5lX2NtZHFfY2ZnKGhvc3QsIG1ycSwKKwkJCQlzbG90LCBpY2VfY3R4KTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNvbmZpZ3VyZSBjcnlwdG9cbiIsCisJCQkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2RoY2lfY21kcV9jcnlwdG9fY2ZnX2VuZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywKKwkJCQkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwogCiAJaWYgKCFob3N0LT5pc19jcnlwdG9fZW4pCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHNkaGNpX2NyeXB0b19jZmcoaG9zdCwgbXJxLCBzbG90KTsKKwlyZXR1cm4gc2RoY2lfY3J5cHRvX2NmZ19lbmQoaG9zdCwgbXJxKTsKIH0KIAogc3RhdGljIHZvaWQgc2RoY2lfY21kcV9jcnlwdG9fY2ZnX3Jlc2V0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCB1bnNpZ25lZCBpbnQgc2xvdCkKQEAgLTM4MzUsNyArMzg5MSwxMyBAQAogfQogCiBzdGF0aWMgaW50IHNkaGNpX2NtZHFfY3J5cHRvX2NmZyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywKLQkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsIHUzMiBzbG90KQorCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwgdTMyIHNsb3QsIHU2NCAqaWNlX2N0eCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZGhjaV9jbWRxX2NyeXB0b19jZmdfZW5kKHN0cnVjdCBtbWNfaG9zdCAqbW1jLAorCQkJCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCXJldHVybiAwOwogfQpAQCAtMzg1Niw2ICszOTE4LDcgQEAKIAkucG9zdF9jcWVfaGFsdCA9IHNkaGNpX2NtZHFfcG9zdF9jcWVfaGFsdCwKIAkuc2V0X3RyYW5zZmVyX3BhcmFtcyA9IHNkaGNpX2NtZHFfc2V0X3RyYW5zZmVyX3BhcmFtcywKIAkuY3J5cHRvX2NmZwk9IHNkaGNpX2NtZHFfY3J5cHRvX2NmZywKKwkuY3J5cHRvX2NmZ19lbmQJPSBzZGhjaV9jbWRxX2NyeXB0b19jZmdfZW5kLAogCS5jcnlwdG9fY2ZnX3Jlc2V0CT0gc2RoY2lfY21kcV9jcnlwdG9fY2ZnX3Jlc2V0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCmluZGV4IDA0ZTgwNmMuLjJiNjdkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKQEAgLTUxOCw3ICs1MTgsNyBAQAogICogU29tZSBjb250cm9sbGVycyBtYXkgdXNlIFBJTyBtb2RlIHRvIHdvcmthcm91bmQgSFcgaXNzdWVzIGluIEFETUEgZm9yCiAgKiBlTU1DIHR1bmluZyBjb21tYW5kcy4KICAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfVVNFX1BJT19GT1JfRU1NQ19UVU5JTkcgKDEgPDwgMjMpCisjZGVmaW5lIFNESENJX1FVSVJLMl9VU0VfUElPX0ZPUl9FTU1DX1RVTklORyAoMSA8PCAyOSkKIAogCiAJaW50IGlycTsJCS8qIERldmljZSBJUlEgKi8KQEAgLTU2OSw2ICs1NjksNyBAQAogCWJvb2wgYnVzX29uOwkJLyogQnVzIHBvd2VyIHByZXZlbnRzIHJ1bnRpbWUgc3VzcGVuZCAqLwogCWJvb2wgcHJlc2V0X2VuYWJsZWQ7CS8qIFByZXNldCBpcyBlbmFibGVkICovCiAJYm9vbCBwZW5kaW5nX3Jlc2V0OwkvKiBDbWQvZGF0YSByZXNldCBpcyBwZW5kaW5nICovCisJYm9vbCBjZHJfc3VwcG9ydDsKIAogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxc19kb25lW1NESENJX01BWF9NUlFTXTsJLyogUmVxdWVzdHMgZG9uZSAqLwogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwkvKiBDdXJyZW50IHJlcXVlc3QgKi8KQEAgLTY3MCw2ICs2NzEsMTAgQEAKIAlpbnQJKCpwbGF0Zm9ybV9leGVjdXRlX3R1bmluZykoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiBvcGNvZGUpOwogCWludAkoKmNyeXB0b19lbmdpbmVfY2ZnKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKIAkJCQlzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSwgdTMyIHNsb3QpOworCWludAkoKmNyeXB0b19lbmdpbmVfY21kcV9jZmcpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJc3RydWN0IG1tY19yZXF1ZXN0ICptcnEsIHUzMiBzbG90LCB1NjQgKmljZV9jdHgpOworCWludAkoKmNyeXB0b19lbmdpbmVfY2ZnX2VuZCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCisJCQkJCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKTsKIAlpbnQJKCpjcnlwdG9fZW5naW5lX3Jlc2V0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAJdm9pZAkoKmNyeXB0b19jZmdfcmVzZXQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgc2xvdCk7CiAJdm9pZAkoKnNldF91aHNfc2lnbmFsaW5nKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdW5zaWduZWQgaW50IHVocyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKaW5kZXggZDdmNzI0Yi4uMGM4NGVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwpAQCAtODc3LDYgKzg3Nyw4IEBACiAJfQogfQogCisjZGVmaW5lIE1YQ19WMV9FQ0NCWVRFUwkJNQorCiBzdGF0aWMgaW50IG14Y192MV9vb2JsYXlvdXRfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgc2VjdGlvbiwKIAkJCQlzdHJ1Y3QgbXRkX29vYl9yZWdpb24gKm9vYnJlZ2lvbikKIHsKQEAgLTg4Niw3ICs4ODgsNyBAQAogCQlyZXR1cm4gLUVSQU5HRTsKIAogCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKHNlY3Rpb24gKiAxNikgKyA2OwotCW9vYnJlZ2lvbi0+bGVuZ3RoID0gbmFuZF9jaGlwLT5lY2MuYnl0ZXM7CisJb29icmVnaW9uLT5sZW5ndGggPSBNWENfVjFfRUNDQllURVM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkwOCw4ICs5MTAsNyBAQAogCQkJb29icmVnaW9uLT5sZW5ndGggPSA0OwogCQl9CiAJfSBlbHNlIHsKLQkJb29icmVnaW9uLT5vZmZzZXQgPSAoKHNlY3Rpb24gLSAxKSAqIDE2KSArCi0JCQkJICAgIG5hbmRfY2hpcC0+ZWNjLmJ5dGVzICsgNjsKKwkJb29icmVnaW9uLT5vZmZzZXQgPSAoKHNlY3Rpb24gLSAxKSAqIDE2KSArIE1YQ19WMV9FQ0NCWVRFUyArIDY7CiAJCWlmIChzZWN0aW9uIDwgbmFuZF9jaGlwLT5lY2Muc3RlcHMpCiAJCQlvb2JyZWdpb24tPmxlbmd0aCA9IChzZWN0aW9uICogMTYpICsgNiAtCiAJCQkJCSAgICBvb2JyZWdpb24tPm9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IGYyMjJmOGEuLjMxYTZlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtNjQsOCArNjQsMTQgQEAKIAogCWlmICghc2VjdGlvbikgewogCQlvb2JyZWdpb24tPm9mZnNldCA9IDA7Ci0JCW9vYnJlZ2lvbi0+bGVuZ3RoID0gNDsKKwkJaWYgKG10ZC0+b29ic2l6ZSA9PSAxNikKKwkJCW9vYnJlZ2lvbi0+bGVuZ3RoID0gNDsKKwkJZWxzZQorCQkJb29icmVnaW9uLT5sZW5ndGggPSAzOwogCX0gZWxzZSB7CisJCWlmIChtdGQtPm9vYnNpemUgPT0gOCkKKwkJCXJldHVybiAtRVJBTkdFOworCiAJCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gNjsKIAkJb29icmVnaW9uLT5sZW5ndGggPSBlY2MtPnRvdGFsIC0gNDsKIAl9CkBAIC0xMDgxLDcgKzEwODcsOSBAQAogCSAqIEVuc3VyZSB0aGUgdGltaW5nIG1vZGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgY2hpcCBzaWRlCiAJICogYmVmb3JlIGNoYW5naW5nIHRpbWluZ3Mgb24gdGhlIGNvbnRyb2xsZXIgc2lkZS4KIAkgKi8KLQlpZiAoY2hpcC0+b25maV92ZXJzaW9uKSB7CisJaWYgKGNoaXAtPm9uZmlfdmVyc2lvbiAmJgorCSAgICAobGUxNl90b19jcHUoY2hpcC0+b25maV9wYXJhbXMub3B0X2NtZCkgJgorCSAgICAgT05GSV9PUFRfQ01EX1NFVF9HRVRfRkVBVFVSRVMpKSB7CiAJCXU4IHRtb2RlX3BhcmFtW09ORklfU1VCRkVBVFVSRV9QQVJBTV9MRU5dID0gewogCQkJY2hpcC0+b25maV90aW1pbmdfbW9kZV9kZWZhdWx0LAogCQl9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9xY29tX25hbmRjLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Fjb21fbmFuZGMuYwppbmRleCA1N2Q0ODNhLi42ZjBmZDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3Fjb21fbmFuZGMuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL3Fjb21fbmFuZGMuYwpAQCAtMTA5LDcgKzEwOSwxMSBAQAogI2RlZmluZQlSRUFEX0FERFIJCQkwCiAKIC8qIE5BTkRfREVWX0NNRF9WTEQgYml0cyAqLwotI2RlZmluZQlSRUFEX1NUQVJUX1ZMRAkJCTAKKyNkZWZpbmUJUkVBRF9TVEFSVF9WTEQJCQlCSVQoMCkKKyNkZWZpbmUJUkVBRF9TVE9QX1ZMRAkJCUJJVCgxKQorI2RlZmluZQlXUklURV9TVEFSVF9WTEQJCQlCSVQoMikKKyNkZWZpbmUJRVJBU0VfU1RBUlRfVkxECQkJQklUKDMpCisjZGVmaW5lCVNFUV9SRUFEX1NUQVJUX1ZMRAkJQklUKDQpCiAKIC8qIE5BTkRfRUJJMl9FQ0NfQlVGX0NGRyBiaXRzICovCiAjZGVmaW5lCU5VTV9TVEVQUwkJCTAKQEAgLTE0OCw2ICsxNTIsMTAgQEAKICNkZWZpbmUJRkVUQ0hfSUQJCQkweGIKICNkZWZpbmUJUkVTRVRfREVWSUNFCQkJMHhkCiAKKy8qIERlZmF1bHQgVmFsdWUgZm9yIE5BTkRfREVWX0NNRF9WTEQgKi8KKyNkZWZpbmUgTkFORF9ERVZfQ01EX1ZMRF9WQUwJCShSRUFEX1NUQVJUX1ZMRCB8IFdSSVRFX1NUQVJUX1ZMRCB8IFwKKwkJCQkJIEVSQVNFX1NUQVJUX1ZMRCB8IFNFUV9SRUFEX1NUQVJUX1ZMRCkKKwogLyoKICAqIHRoZSBOQU5EIGNvbnRyb2xsZXIgcGVyZm9ybXMgcmVhZHMvd3JpdGVzIHdpdGggRUNDIGluIDUxNiBieXRlIGNodW5rcy4KICAqIHRoZSBkcml2ZXIgY2FsbHMgdGhlIGNodW5rcyAnc3RlcCcgb3IgJ2NvZGV3b3JkJyBpbnRlcmNoYW5nZWFibHkKQEAgLTY3Miw4ICs2ODAsNyBAQAogCiAJLyogY29uZmlndXJlIENNRDEgYW5kIFZMRCBmb3IgT05GSSBwYXJhbSBwcm9iaW5nICovCiAJbmFuZGNfc2V0X3JlZyhuYW5kYywgTkFORF9ERVZfQ01EX1ZMRCwKLQkJICAgICAgKG5hbmRjLT52bGQgJiB+KDEgPDwgUkVBRF9TVEFSVF9WTEQpKQotCQkgICAgICB8IDAgPDwgUkVBRF9TVEFSVF9WTEQpOworCQkgICAgICAobmFuZGMtPnZsZCAmIH5SRUFEX1NUQVJUX1ZMRCkpOwogCW5hbmRjX3NldF9yZWcobmFuZGMsIE5BTkRfREVWX0NNRDEsCiAJCSAgICAgIChuYW5kYy0+Y21kMSAmIH4oMHhGRiA8PCBSRUFEX0FERFIpKQogCQkgICAgICB8IE5BTkRfQ01EX1BBUkFNIDw8IFJFQURfQUREUik7CkBAIC0xODkzLDcgKzE5MDAsNyBAQAogCQkJCXwgd2lkZV9idXMgPDwgV0lERV9GTEFTSAogCQkJCXwgMSA8PCBERVYwX0NGRzFfRUNDX0RJU0FCTEU7CiAKLQlob3N0LT5lY2NfYmNoX2NmZyA9IGhvc3QtPmJjaF9lbmFibGVkIDw8IEVDQ19DRkdfRUNDX0RJU0FCTEUKKwlob3N0LT5lY2NfYmNoX2NmZyA9ICFob3N0LT5iY2hfZW5hYmxlZCA8PCBFQ0NfQ0ZHX0VDQ19ESVNBQkxFCiAJCQkJfCAwIDw8IEVDQ19TV19SRVNFVAogCQkJCXwgaG9zdC0+Y3dfZGF0YSA8PCBFQ0NfTlVNX0RBVEFfQllURVMKIAkJCQl8IDEgPDwgRUNDX0ZPUkNFX0NMS19PUEVOCkBAIC0xOTcyLDEzICsxOTc5LDE0IEBACiB7CiAJLyoga2lsbCBvbmVuYW5kICovCiAJbmFuZGNfd3JpdGUobmFuZGMsIFNGTEFTSENfQlVSU1RfQ0ZHLCAwKTsKKwluYW5kY193cml0ZShuYW5kYywgTkFORF9ERVZfQ01EX1ZMRCwgTkFORF9ERVZfQ01EX1ZMRF9WQUwpOwogCiAJLyogZW5hYmxlIEFETSBETUEgKi8KIAluYW5kY193cml0ZShuYW5kYywgTkFORF9GTEFTSF9DSElQX1NFTEVDVCwgRE1fRU4pOwogCiAJLyogc2F2ZSB0aGUgb3JpZ2luYWwgdmFsdWVzIG9mIHRoZXNlIHJlZ2lzdGVycyAqLwogCW5hbmRjLT5jbWQxID0gbmFuZGNfcmVhZChuYW5kYywgTkFORF9ERVZfQ01EMSk7Ci0JbmFuZGMtPnZsZCA9IG5hbmRjX3JlYWQobmFuZGMsIE5BTkRfREVWX0NNRF9WTEQpOworCW5hbmRjLT52bGQgPSBOQU5EX0RFVl9DTURfVkxEX1ZBTDsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYwppbmRleCA5NDdhZGRhLi4zZWM1NzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYwpAQCAtMTU1OCw2ICsxNTU4LDcgQEAKIAkJLmRldl9uYW1lID0gIkJDTTUzMTI1IiwKIAkJLnZsYW5zID0gNDA5NiwKIAkJLmVuYWJsZWRfcG9ydHMgPSAweGZmLAorCQkuYXJsX2VudHJpZXMgPSA0LAogCQkuY3B1X3BvcnQgPSBCNTNfQ1BVX1BPUlQsCiAJCS52dGFfcmVncyA9IEI1M19WVEFfUkVHUywKIAkJLmR1cGxleF9yZWcgPSBCNTNfRFVQTEVYX1NUQVRfR0UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdXJvcmEvbmI4ODAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdXJvcmEvbmI4ODAwLmMKaW5kZXggZTA3OGQ4ZC4uMjlkMjlhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXVyb3JhL25iODgwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F1cm9yYS9uYjg4MDAuYwpAQCAtNjA5LDcgKzYwOSw3IEBACiAJCW1hY19tb2RlIHw9IEhBTEZfRFVQTEVYOwogCiAJaWYgKGdpZ2FiaXQpIHsKLQkJaWYgKHByaXYtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkKKwkJaWYgKHBoeV9pbnRlcmZhY2VfaXNfcmdtaWkoZGV2LT5waHlkZXYpKQogCQkJbWFjX21vZGUgfD0gUkdNSUlfTU9ERTsKIAogCQltYWNfbW9kZSB8PSBHTUFDX01PREU7CkBAIC0xMjc3LDExICsxMjc3LDEwIEBACiAJCWJyZWFrOwogCiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6Ci0JCXBhZF9tb2RlID0gUEFEX01PREVfUkdNSUk7Ci0JCWJyZWFrOwotCisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQ6CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRDoKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEOgotCQlwYWRfbW9kZSA9IFBBRF9NT0RFX1JHTUlJIHwgUEFEX01PREVfR1RYX0NMS19ERUxBWTsKKwkJcGFkX21vZGUgPSBQQURfTU9ERV9SR01JSTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwppbmRleCBhOTI3YTczLi5lZGFlMmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwpAQCAtODcyMCwxMSArODcyMCwxNCBAQAogCXRnM19tZW1fcnhfcmVsZWFzZSh0cCk7CiAJdGczX21lbV90eF9yZWxlYXNlKHRwKTsKIAorCS8qIFByb3RlY3QgdGczX2dldF9zdGF0czY0KCkgZnJvbSByZWFkaW5nIGZyZWVkIHRwLT5od19zdGF0cy4gKi8KKwl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAlpZiAodHAtPmh3X3N0YXRzKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZ0cC0+cGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cyksCiAJCQkJICB0cC0+aHdfc3RhdHMsIHRwLT5zdGF0c19tYXBwaW5nKTsKIAkJdHAtPmh3X3N0YXRzID0gTlVMTDsKIAl9CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYwppbmRleCBlODEzOTUxLi45ZTA3M2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jCkBAIC0zMTcsMTIgKzMxNywxMiBAQAogCiAJaWYgKHYgIT0gTUJPWF9PV05FUl9EUlYpIHsKIAkJcmV0ID0gKHYgPT0gTUJPWF9PV05FUl9GVykgPyAtRUJVU1kgOiAtRVRJTUVET1VUOwotCQl0NF9yZWNvcmRfbWJveChhZGFwLCBjbWQsIE1CT1hfTEVOLCBhY2Nlc3MsIHJldCk7CisJCXQ0X3JlY29yZF9tYm94KGFkYXAsIGNtZCwgc2l6ZSwgYWNjZXNzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIENvcHkgaW4gdGhlIG5ldyBtYWlsYm94IGNvbW1hbmQgYW5kIHNlbmQgaXQgb24gaXRzIHdheSAuLi4gKi8KLQl0NF9yZWNvcmRfbWJveChhZGFwLCBjbWQsIE1CT1hfTEVOLCBhY2Nlc3MsIDApOworCXQ0X3JlY29yZF9tYm94KGFkYXAsIGNtZCwgc2l6ZSwgYWNjZXNzLCAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSA4KQogCQl0NF93cml0ZV9yZWc2NChhZGFwLCBkYXRhX3JlZyArIGksIGJlNjRfdG9fY3B1KCpwKyspKTsKIApAQCAtMzcxLDcgKzM3MSw3IEBACiAJfQogCiAJcmV0ID0gKHBjaWVfZncgJiBQQ0lFX0ZXX0VSUl9GKSA/IC1FTlhJTyA6IC1FVElNRURPVVQ7Ci0JdDRfcmVjb3JkX21ib3goYWRhcCwgY21kLCBNQk9YX0xFTiwgYWNjZXNzLCByZXQpOworCXQ0X3JlY29yZF9tYm94KGFkYXAsIGNtZCwgc2l6ZSwgYWNjZXNzLCByZXQpOwogCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsICJjb21tYW5kICUjeCBpbiBtYWlsYm94ICVkIHRpbWVkIG91dFxuIiwKIAkJKihjb25zdCB1OCAqKWNtZCwgbWJveCk7CiAJdDRfcmVwb3J0X2Z3X2Vycm9yKGFkYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKaW5kZXggYjNjOWNiZS4uNTYyNjkwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCkBAIC01MTg2LDcgKzUxODYsOSBAQAogCSAgICBza2ItPmlubmVyX3Byb3RvY29sX3R5cGUgIT0gRU5DQVBfVFlQRV9FVEhFUiB8fAogCSAgICBza2ItPmlubmVyX3Byb3RvY29sICE9IGh0b25zKEVUSF9QX1RFQikgfHwKIAkgICAgc2tiX2lubmVyX21hY19oZWFkZXIoc2tiKSAtIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgIT0KLQkgICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgc2l6ZW9mKHN0cnVjdCB2eGxhbmhkcikpCisJCXNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIHNpemVvZihzdHJ1Y3QgdnhsYW5oZHIpIHx8CisJICAgICFhZGFwdGVyLT52eGxhbl9wb3J0IHx8CisJICAgIHVkcF9oZHIoc2tiKS0+ZGVzdCAhPSBhZGFwdGVyLT52eGxhbl9wb3J0KQogCQlyZXR1cm4gZmVhdHVyZXMgJiB+KE5FVElGX0ZfQ1NVTV9NQVNLIHwgTkVUSUZfRl9HU09fTUFTSyk7CiAKIAlyZXR1cm4gZmVhdHVyZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZm1hbi9tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL21hYy5jCmluZGV4IDczNmRiOWQuLjgxMDIxZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL21hYy5jCkBAIC02MjIsNiArNjIyLDkgQEAKIAkJZ290byBub19tZW07CiAJfQogCisJcGRldi0+ZGV2Lm9mX25vZGUgPSBub2RlOworCXBkZXYtPmRldi5wYXJlbnQgPSBwcml2LT5kZXY7CisKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwppbmRleCAzZjRlNzExLi5mZDIwNjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKQEAgLTM2OTAsNyArMzY5MCw3IEBACiAJCXUzMiB0ZW1wdmFsMSA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMSk7CiAJCXUzMiB0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcyKTsKIAkJdTMyIGVjbnRybCA9IGdmYXJfcmVhZCgmcmVncy0+ZWNudHJsKTsKLQkJdTMyIHR4X2Zsb3dfb2xkdmFsID0gKHRlbXB2YWwgJiBNQUNDRkcxX1RYX0ZMT1cpOworCQl1MzIgdHhfZmxvd19vbGR2YWwgPSAodGVtcHZhbDEgJiBNQUNDRkcxX1RYX0ZMT1cpOwogCiAJCWlmIChwaHlkZXYtPmR1cGxleCAhPSBwcml2LT5vbGRkdXBsZXgpIHsKIAkJCWlmICghKHBoeWRldi0+ZHVwbGV4KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYwppbmRleCA1ZDQ4NDU4Li5iY2JiODBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCkBAIC03MjQsMTYgKzcyNCwyMSBAQAogICogaGVhZGVyLCB0aGUgSFcgYWRkcyBpdC4gVG8gYWRkcmVzcyB0aGF0LCB3ZSBhcmUgc3VidHJhY3RpbmcgdGhlIHBzZXVkbwogICogaGVhZGVyIGNoZWNrc3VtIGZyb20gdGhlIGNoZWNrc3VtIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBIVy4KICAqLwotc3RhdGljIHZvaWQgZ2V0X2ZpeGVkX2lwdjRfY3N1bShfX3dzdW0gaHdfY2hlY2tzdW0sIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IGlwaGRyICppcGgpCitzdGF0aWMgaW50IGdldF9maXhlZF9pcHY0X2NzdW0oX193c3VtIGh3X2NoZWNrc3VtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBpcGhkciAqaXBoKQogewogCV9fdTE2IGxlbmd0aF9mb3JfY3N1bSA9IDA7CiAJX193c3VtIGNzdW1fcHNldWRvX2hlYWRlciA9IDA7CisJX191OCBpcHByb3RvID0gaXBoLT5wcm90b2NvbDsKKworCWlmICh1bmxpa2VseShpcHByb3RvID09IElQUFJPVE9fU0NUUCkpCisJCXJldHVybiAtMTsKIAogCWxlbmd0aF9mb3JfY3N1bSA9IChiZTE2X3RvX2NwdShpcGgtPnRvdF9sZW4pIC0gKGlwaC0+aWhsIDw8IDIpKTsKIAljc3VtX3BzZXVkb19oZWFkZXIgPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkJCWxlbmd0aF9mb3JfY3N1bSwgaXBoLT5wcm90b2NvbCwgMCk7CisJCQkJCQlsZW5ndGhfZm9yX2NzdW0sIGlwcHJvdG8sIDApOwogCXNrYi0+Y3N1bSA9IGNzdW1fc3ViKGh3X2NoZWNrc3VtLCBjc3VtX3BzZXVkb19oZWFkZXIpOworCXJldHVybiAwOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKQEAgLTc0NCwxNyArNzQ5LDIwIEBACiBzdGF0aWMgaW50IGdldF9maXhlZF9pcHY2X2NzdW0oX193c3VtIGh3X2NoZWNrc3VtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgIHN0cnVjdCBpcHY2aGRyICppcHY2aCkKIHsKKwlfX3U4IG5leHRoZHIgPSBpcHY2aC0+bmV4dGhkcjsKIAlfX3dzdW0gY3N1bV9wc2V1ZG9faGRyID0gMDsKIAotCWlmICh1bmxpa2VseShpcHY2aC0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UIHx8Ci0JCSAgICAgaXB2NmgtPm5leHRoZHIgPT0gSVBQUk9UT19IT1BPUFRTKSkKKwlpZiAodW5saWtlbHkobmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UIHx8CisJCSAgICAgbmV4dGhkciA9PSBJUFBST1RPX0hPUE9QVFMgfHwKKwkJICAgICBuZXh0aGRyID09IElQUFJPVE9fU0NUUCkpCiAJCXJldHVybiAtMTsKLQlod19jaGVja3N1bSA9IGNzdW1fYWRkKGh3X2NoZWNrc3VtLCAoX19mb3JjZSBfX3dzdW0paHRvbnMoaXB2NmgtPm5leHRoZHIpKTsKKwlod19jaGVja3N1bSA9IGNzdW1fYWRkKGh3X2NoZWNrc3VtLCAoX19mb3JjZSBfX3dzdW0paHRvbnMobmV4dGhkcikpOwogCiAJY3N1bV9wc2V1ZG9faGRyID0gY3N1bV9wYXJ0aWFsKCZpcHY2aC0+c2FkZHIsCiAJCQkJICAgICAgIHNpemVvZihpcHY2aC0+c2FkZHIpICsgc2l6ZW9mKGlwdjZoLT5kYWRkciksIDApOwogCWNzdW1fcHNldWRvX2hkciA9IGNzdW1fYWRkKGNzdW1fcHNldWRvX2hkciwgKF9fZm9yY2UgX193c3VtKWlwdjZoLT5wYXlsb2FkX2xlbik7Ci0JY3N1bV9wc2V1ZG9faGRyID0gY3N1bV9hZGQoY3N1bV9wc2V1ZG9faGRyLCAoX19mb3JjZSBfX3dzdW0pbnRvaHMoaXB2NmgtPm5leHRoZHIpKTsKKwljc3VtX3BzZXVkb19oZHIgPSBjc3VtX2FkZChjc3VtX3BzZXVkb19oZHIsCisJCQkJICAgKF9fZm9yY2UgX193c3VtKWh0b25zKG5leHRoZHIpKTsKIAogCXNrYi0+Y3N1bSA9IGNzdW1fc3ViKGh3X2NoZWNrc3VtLCBjc3VtX3BzZXVkb19oZHIpOwogCXNrYi0+Y3N1bSA9IGNzdW1fYWRkKHNrYi0+Y3N1bSwgY3N1bV9wYXJ0aWFsKGlwdjZoLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpLCAwKSk7CkBAIC03NzcsMTEgKzc4NSwxMCBAQAogCX0KIAogCWlmIChjcWUtPnN0YXR1cyAmIGNwdV90b19iZTE2KE1MWDRfQ1FFX1NUQVRVU19JUFY0KSkKLQkJZ2V0X2ZpeGVkX2lwdjRfY3N1bShod19jaGVja3N1bSwgc2tiLCBoZHIpOworCQlyZXR1cm4gZ2V0X2ZpeGVkX2lwdjRfY3N1bShod19jaGVja3N1bSwgc2tiLCBoZHIpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JZWxzZSBpZiAoY3FlLT5zdGF0dXMgJiBjcHVfdG9fYmUxNihNTFg0X0NRRV9TVEFUVVNfSVBWNikpCi0JCWlmICh1bmxpa2VseShnZXRfZml4ZWRfaXB2Nl9jc3VtKGh3X2NoZWNrc3VtLCBza2IsIGhkcikpKQotCQkJcmV0dXJuIC0xOworCWlmIChjcWUtPnN0YXR1cyAmIGNwdV90b19iZTE2KE1MWDRfQ1FFX1NUQVRVU19JUFY2KSkKKwkJcmV0dXJuIGdldF9maXhlZF9pcHY2X2NzdW0oaHdfY2hlY2tzdW0sIHNrYiwgaGRyKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9pY20uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvaWNtLmMKaW5kZXggMmE5ZGQ0Ni4uZTFmOWU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9pY20uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ljbS5jCkBAIC0xMTgsOCArMTE4LDEzIEBACiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKG9mZnNldF9pbl9wYWdlKGJ1ZikpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJICBidWYsIHNnX2RtYV9hZGRyZXNzKG1lbSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlzZ19zZXRfYnVmKG1lbSwgYnVmLCBQQUdFX1NJWkUgPDwgb3JkZXIpOwotCUJVR19PTihtZW0tPm9mZnNldCk7CiAJc2dfZG1hX2xlbihtZW0pID0gUEFHRV9TSVpFIDw8IG9yZGVyOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwppbmRleCBiMmNhOGE2Li5iYTY1MmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9kZXZsaW5rLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2RldmljZS5oPgpAQCAtNDI5LDcgKzQzMCw3IEBACiAJCS8qIFZpcnR1YWwgUENJIGZ1bmN0aW9uIG5lZWRzIHRvIGRldGVybWluZSBVQVIgcGFnZSBzaXplIGZyb20KIAkJICogZmlybXdhcmUuIE9ubHkgbWFzdGVyIFBDSSBmdW5jdGlvbiBjYW4gc2V0IHRoZSB1YXIgcGFnZSBzaXplCiAJCSAqLwotCQlpZiAoZW5hYmxlXzRrX3VhcikKKwkJaWYgKGVuYWJsZV80a191YXIgfHwgIWRldi0+cGVyc2lzdC0+bnVtX3ZmcykKIAkJCWRldi0+dWFyX3BhZ2Vfc2hpZnQgPSBERUZBVUxUX1VBUl9QQUdFX1NISUZUOwogCQllbHNlCiAJCQlkZXYtPnVhcl9wYWdlX3NoaWZ0ID0gUEFHRV9TSElGVDsKQEAgLTc4Miw2ICs3ODMsMjMgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWx4NF9pc19zbGF2ZV9hY3RpdmUpOwogCit2b2lkIG1seDRfaGFuZGxlX2V0aF9oZWFkZXJfbWNhc3RfcHJpbyhzdHJ1Y3QgbWx4NF9uZXRfdHJhbnNfcnVsZV9od19jdHJsICpjdHJsLAorCQkJCSAgICAgICBzdHJ1Y3QgX3J1bGVfaHcgKmV0aF9oZWFkZXIpCit7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aF9oZWFkZXItPmV0aC5kc3RfbWFjKSB8fAorCSAgICBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihldGhfaGVhZGVyLT5ldGguZHN0X21hYykpIHsKKwkJc3RydWN0IG1seDRfbmV0X3RyYW5zX3J1bGVfaHdfZXRoICpldGggPQorCQkJKHN0cnVjdCBtbHg0X25ldF90cmFuc19ydWxlX2h3X2V0aCAqKWV0aF9oZWFkZXI7CisJCXN0cnVjdCBfcnVsZV9odyAqbmV4dF9ydWxlID0gKHN0cnVjdCBfcnVsZV9odyAqKShldGggKyAxKTsKKwkJYm9vbCBsYXN0X3J1bGUgPSBuZXh0X3J1bGUtPnNpemUgPT0gMCAmJiBuZXh0X3J1bGUtPmlkID09IDAgJiYKKwkJCW5leHRfcnVsZS0+cnN2ZCA9PSAwOworCisJCWlmIChsYXN0X3J1bGUpCisJCQljdHJsLT5wcmlvID0gY3B1X3RvX2JlMTYoTUxYNF9ET01BSU5fTklDKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKG1seDRfaGFuZGxlX2V0aF9oZWFkZXJfbWNhc3RfcHJpbyk7CisKIHN0YXRpYyB2b2lkIHNsYXZlX2FkanVzdF9zdGVlcmluZ19tb2RlKHN0cnVjdCBtbHg0X2RldiAqZGV2LAogCQkJCSAgICAgICBzdHJ1Y3QgbWx4NF9kZXZfY2FwICpkZXZfY2FwLAogCQkJCSAgICAgICBzdHJ1Y3QgbWx4NF9pbml0X2hjYV9wYXJhbSAqaGNhX3BhcmFtKQpAQCAtMjI1MSw3ICsyMjY5LDcgQEAKIAogCQlkZXYtPmNhcHMubWF4X2Ztcl9tYXBzID0gKDEgPDwgKDMyIC0gaWxvZzIoZGV2LT5jYXBzLm51bV9tcHRzKSkpIC0gMTsKIAotCQlpZiAoZW5hYmxlXzRrX3VhcikgeworCQlpZiAoZW5hYmxlXzRrX3VhciB8fCAhZGV2LT5wZXJzaXN0LT5udW1fdmZzKSB7CiAJCQlpbml0X2hjYS5sb2dfdWFyX3N6ID0gaWxvZzIoZGV2LT5jYXBzLm51bV91YXJzKSArCiAJCQkJCQkgICAgUEFHRV9TSElGVCAtIERFRkFVTFRfVUFSX1BBR0VfU0hJRlQ7CiAJCQlpbml0X2hjYS51YXJfcGFnZV9zeiA9IERFRkFVTFRfVUFSX1BBR0VfU0hJRlQgLSAxMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcmVzb3VyY2VfdHJhY2tlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMKaW5kZXggMzJmNzZiZi4uMTgyMjM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMKQEAgLTQxNjUsMjIgKzQxNjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfZXRoX2hlYWRlcl9tY2FzdF9wcmlvKHN0cnVjdCBtbHg0X25ldF90cmFuc19ydWxlX2h3X2N0cmwgKmN0cmwsCi0JCQkJCSBzdHJ1Y3QgX3J1bGVfaHcgKmV0aF9oZWFkZXIpCi17Ci0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGV0aF9oZWFkZXItPmV0aC5kc3RfbWFjKSB8fAotCSAgICBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihldGhfaGVhZGVyLT5ldGguZHN0X21hYykpIHsKLQkJc3RydWN0IG1seDRfbmV0X3RyYW5zX3J1bGVfaHdfZXRoICpldGggPQotCQkJKHN0cnVjdCBtbHg0X25ldF90cmFuc19ydWxlX2h3X2V0aCAqKWV0aF9oZWFkZXI7Ci0JCXN0cnVjdCBfcnVsZV9odyAqbmV4dF9ydWxlID0gKHN0cnVjdCBfcnVsZV9odyAqKShldGggKyAxKTsKLQkJYm9vbCBsYXN0X3J1bGUgPSBuZXh0X3J1bGUtPnNpemUgPT0gMCAmJiBuZXh0X3J1bGUtPmlkID09IDAgJiYKLQkJCW5leHRfcnVsZS0+cnN2ZCA9PSAwOwotCi0JCWlmIChsYXN0X3J1bGUpCi0JCQljdHJsLT5wcmlvID0gY3B1X3RvX2JlMTYoTUxYNF9ET01BSU5fTklDKTsKLQl9Ci19Ci0KIC8qCiAgKiBJbiBjYXNlIG9mIG1pc3NpbmcgZXRoIGhlYWRlciwgYXBwZW5kIGV0aCBoZWFkZXIgd2l0aCBhIE1BQyBhZGRyZXNzCiAgKiBhc3NpZ25lZCB0byB0aGUgVkYuCkBAIC00MzY0LDEwICs0MzQ4LDcgQEAKIAloZWFkZXJfaWQgPSBtYXBfaHdfdG9fc3dfaWQoYmUxNl90b19jcHUocnVsZV9oZWFkZXItPmlkKSk7CiAKIAlpZiAoaGVhZGVyX2lkID09IE1MWDRfTkVUX1RSQU5TX1JVTEVfSURfRVRIKQotCQloYW5kbGVfZXRoX2hlYWRlcl9tY2FzdF9wcmlvKGN0cmwsIHJ1bGVfaGVhZGVyKTsKLQotCWlmIChzbGF2ZSA9PSBkZXYtPmNhcHMuZnVuY3Rpb24pCi0JCWdvdG8gZXhlY3V0ZTsKKwkJbWx4NF9oYW5kbGVfZXRoX2hlYWRlcl9tY2FzdF9wcmlvKGN0cmwsIHJ1bGVfaGVhZGVyKTsKIAogCXN3aXRjaCAoaGVhZGVyX2lkKSB7CiAJY2FzZSBNTFg0X05FVF9UUkFOU19SVUxFX0lEX0VUSDoKQEAgLTQzOTUsNyArNDM3Niw2IEBACiAJCWdvdG8gZXJyX3B1dF9xcDsKIAl9CiAKLWV4ZWN1dGU6CiAJZXJyID0gbWx4NF9jbWRfaW1tKGRldiwgaW5ib3gtPmRtYSwgJnZoY3ItPm91dF9wYXJhbSwKIAkJCSAgIHZoY3ItPmluX21vZGlmaWVyLCAwLAogCQkJICAgTUxYNF9RUF9GTE9XX1NURUVSSU5HX0FUVEFDSCwgTUxYNF9DTURfVElNRV9DTEFTU19BLApAQCAtNDQ3NCw2ICs0NDU0LDcgQEAKIAlzdHJ1Y3QgcmVzX3FwICpycXA7CiAJc3RydWN0IHJlc19mc19ydWxlICpycnVsZTsKIAl1NjQgbWlycl9yZWdfaWQ7CisJaW50IHFwbjsKIAogCWlmIChkZXYtPmNhcHMuc3RlZXJpbmdfbW9kZSAhPQogCSAgICBNTFg0X1NURUVSSU5HX01PREVfREVWSUNFX01BTkFHRUQpCkBAIC00NDkwLDEwICs0NDcxLDExIEBACiAJfQogCW1pcnJfcmVnX2lkID0gcnJ1bGUtPm1pcnJfcnVsZV9pZDsKIAlrZnJlZShycnVsZS0+bWlycl9tYm94KTsKKwlxcG4gPSBycnVsZS0+cXBuOwogCiAJLyogUmVsZWFzZSB0aGUgcnVsZSBmb3JtIGJ1c3kgc3RhdGUgYmVmb3JlIHJlbW92YWwgKi8KIAlwdXRfcmVzKGRldiwgc2xhdmUsIHZoY3ItPmluX3BhcmFtLCBSRVNfRlNfUlVMRSk7Ci0JZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBycnVsZS0+cXBuLCBSRVNfUVAsICZycXApOworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgcXBuLCBSRVNfUVAsICZycXApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTQ1MTgsNyArNDUwMCw3IEBACiAJaWYgKCFlcnIpCiAJCWF0b21pY19kZWMoJnJxcC0+cmVmX2NvdW50KTsKIG91dDoKLQlwdXRfcmVzKGRldiwgc2xhdmUsIHJydWxlLT5xcG4sIFJFU19RUCk7CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jCmluZGV4IGNiNDUzOTAuLmY3ZmFiZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMKQEAgLTc3MCw2ICs3NzAsMTAgQEAKIAltbHg1X2NtZF9jb21wX2hhbmRsZXIoZGV2LCAxVUwgPDwgZW50LT5pZHgsIHRydWUpOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX21zZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jbWRfbXNnICptc2cpOworc3RhdGljIHZvaWQgbWx4NV9mcmVlX2NtZF9tc2coc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBtbHg1X2NtZF9tc2cgKm1zZyk7CisKIHN0YXRpYyB2b2lkIGNtZF93b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBtbHg1X2NtZF93b3JrX2VudCAqZW50ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtbHg1X2NtZF93b3JrX2VudCwgd29yayk7CkBAIC03NzksMTYgKzc4MywyNyBAQAogCXN0cnVjdCBtbHg1X2NtZF9sYXlvdXQgKmxheTsKIAlzdHJ1Y3Qgc2VtYXBob3JlICpzZW07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWxsb2NfcmV0OwogCiAJc2VtID0gZW50LT5wYWdlX3F1ZXVlID8gJmNtZC0+cGFnZXNfc2VtIDogJmNtZC0+c2VtOwogCWRvd24oc2VtKTsKIAlpZiAoIWVudC0+cGFnZV9xdWV1ZSkgewotCQllbnQtPmlkeCA9IGFsbG9jX2VudChjbWQpOwotCQlpZiAoZW50LT5pZHggPCAwKSB7CisJCWFsbG9jX3JldCA9IGFsbG9jX2VudChjbWQpOworCQlpZiAoYWxsb2NfcmV0IDwgMCkgeworCQkJaWYgKGVudC0+Y2FsbGJhY2spIHsKKwkJCQllbnQtPmNhbGxiYWNrKC1FQUdBSU4sIGVudC0+Y29udGV4dCk7CisJCQkJbWx4NV9mcmVlX2NtZF9tc2coZGV2LCBlbnQtPm91dCk7CisJCQkJZnJlZV9tc2coZGV2LCBlbnQtPmluKTsKKwkJCQlmcmVlX2NtZChlbnQpOworCQkJfSBlbHNlIHsKKwkJCQllbnQtPnJldCA9IC1FQUdBSU47CisJCQkJY29tcGxldGUoJmVudC0+ZG9uZSk7CisJCQl9CiAJCQltbHg1X2NvcmVfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBjb21tYW5kIGVudHJ5XG4iKTsKIAkJCXVwKHNlbSk7CiAJCQlyZXR1cm47CiAJCX0KKwkJZW50LT5pZHggPSBhbGxvY19yZXQ7CiAJfSBlbHNlIHsKIAkJZW50LT5pZHggPSBjbWQtPm1heF9yZWdfY21kczsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNtZC0+YWxsb2NfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2Nsb2NrLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYwppbmRleCAxM2RjMzg4Li4xNjEyZWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYwpAQCAtNjIsMTIgKzYyLDE0IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CiAJc3RydWN0IG1seDVlX3RzdGFtcCAqdHN0YW1wID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgbWx4NWVfdHN0YW1wLAogCQkJCQkJICAgb3ZlcmZsb3dfd29yayk7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YodHN0YW1wLCBzdHJ1Y3QgbWx4NWVfcHJpdiwgdHN0YW1wKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZ0c3RhbXAtPmxvY2ssIGZsYWdzKTsKIAl0aW1lY291bnRlcl9yZWFkKCZ0c3RhbXAtPmNsb2NrKTsKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdHN0YW1wLT5sb2NrLCBmbGFncyk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0c3RhbXAtPm92ZXJmbG93X3dvcmssIHRzdGFtcC0+b3ZlcmZsb3dfcGVyaW9kKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d3EsICZ0c3RhbXAtPm92ZXJmbG93X3dvcmssCisJCQkgICBtc2Vjc190b19qaWZmaWVzKHRzdGFtcC0+b3ZlcmZsb3dfcGVyaW9kICogMTAwMCkpOwogfQogCiBpbnQgbWx4NWVfaHdzdGFtcF9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCkBAIC0yNjMsNyArMjY1LDcgQEAKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZ0c3RhbXAtPm92ZXJmbG93X3dvcmssIG1seDVlX3RpbWVzdGFtcF9vdmVyZmxvdyk7CiAJaWYgKHRzdGFtcC0+b3ZlcmZsb3dfcGVyaW9kKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRzdGFtcC0+b3ZlcmZsb3dfd29yaywgMCk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53cSwgJnRzdGFtcC0+b3ZlcmZsb3dfd29yaywgMCk7CiAJZWxzZQogCQltbHg1X2NvcmVfd2Fybihwcml2LT5tZGV2LCAiaW52YWxpZCBvdmVyZmxvdyBwZXJpb2QsIG92ZXJmbG93X3dvcmsgaXMgbm90IHNjaGVkdWxlZFxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9mc19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZnNfZXRodG9vbC5jCmluZGV4IGUwMzRkYmMuLmNmMDcwZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9mc19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2ZzX2V0aHRvb2wuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAKIHN0YXRpYyBib29sIG91dGVyX2hlYWRlcl96ZXJvKHUzMiAqbWF0Y2hfY3JpdGVyaWEpCiB7Ci0JaW50IHNpemUgPSBNTFg1X1NUX1NaX0JZVEVTKGZ0ZV9tYXRjaF9wYXJhbSk7CisJaW50IHNpemUgPSBNTFg1X0ZMRF9TWl9CWVRFUyhmdGVfbWF0Y2hfcGFyYW0sIG91dGVyX2hlYWRlcnMpOwogCWNoYXIgKm91dGVyX2hlYWRlcnNfYyA9IE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfcGFyYW0sIG1hdGNoX2NyaXRlcmlhLAogCQkJCQkgICAgIG91dGVyX2hlYWRlcnMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaF9vZmZsb2Fkcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2hfb2ZmbG9hZHMuYwppbmRleCBiMDhiOWUyLi41MmEzODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaF9vZmZsb2Fkcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoX29mZmxvYWRzLmMKQEAgLTY1MSw5ICs2NTEsMTQgQEAKIAlpbnQgdnBvcnQ7CiAJaW50IGVycjsKIAorCS8qIGRpc2FibGUgUEYgUm9DRSBzbyBtaXNzZWQgcGFja2V0cyBkb24ndCBnbyB0aHJvdWdoIFJvQ0Ugc3RlZXJpbmcgKi8KKwltbHg1X2Rldl9saXN0X2xvY2soKTsKKwltbHg1X3JlbW92ZV9kZXZfYnlfcHJvdG9jb2woZXN3LT5kZXYsIE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKTsKKwltbHg1X2Rldl9saXN0X3VubG9jaygpOworCiAJZXJyID0gZXN3X2NyZWF0ZV9vZmZsb2Fkc19mZGJfdGFibGUoZXN3LCBudnBvcnRzKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGNyZWF0ZV9mZGJfZXJyOwogCiAJZXJyID0gZXN3X2NyZWF0ZV9vZmZsb2Fkc190YWJsZShlc3cpOwogCWlmIChlcnIpCkBAIC02NzIsNiArNjc3LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX3JlcHM7CiAJfQorCiAJcmV0dXJuIDA7CiAKIGVycl9yZXBzOgpAQCAtNjg4LDYgKzY5NCwxMyBAQAogCiBjcmVhdGVfZnRfZXJyOgogCWVzd19kZXN0cm95X29mZmxvYWRzX2ZkYl90YWJsZShlc3cpOworCitjcmVhdGVfZmRiX2VycjoKKwkvKiBlbmFibGUgYmFjayBQRiBSb0NFICovCisJbWx4NV9kZXZfbGlzdF9sb2NrKCk7CisJbWx4NV9hZGRfZGV2X2J5X3Byb3RvY29sKGVzdy0+ZGV2LCBNTFg1X0lOVEVSRkFDRV9QUk9UT0NPTF9JQik7CisJbWx4NV9kZXZfbGlzdF91bmxvY2soKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTcwNCw2ICs3MTcsMTEgQEAKIAkJCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldHRpbmcgZXN3aXRjaCBiYWNrIHRvIG9mZmxvYWRzLCBlcnIgJWRcbiIsIGVycik7CiAJfQogCisJLyogZW5hYmxlIGJhY2sgUEYgUm9DRSAqLworCW1seDVfZGV2X2xpc3RfbG9jaygpOworCW1seDVfYWRkX2Rldl9ieV9wcm90b2NvbChlc3ctPmRldiwgTUxYNV9JTlRFUkZBQ0VfUFJPVE9DT0xfSUIpOworCW1seDVfZGV2X2xpc3RfdW5sb2NrKCk7CisKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbGFnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbGFnLmMKaW5kZXggYjVkNTUxOS4uMGNhNDYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2xhZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9sYWcuYwpAQCAtMTU3LDIyICsxNTcsMTcgQEAKIHN0YXRpYyB2b2lkIG1seDVfaW5mZXJfdHhfYWZmaW5pdHlfbWFwcGluZyhzdHJ1Y3QgbGFnX3RyYWNrZXIgKnRyYWNrZXIsCiAJCQkJCSAgIHU4ICpwb3J0MSwgdTggKnBvcnQyKQogewotCWlmICh0cmFja2VyLT50eF90eXBlID09IE5FVERFVl9MQUdfVFhfVFlQRV9BQ1RJVkVCQUNLVVApIHsKLQkJaWYgKHRyYWNrZXItPm5ldGRldl9zdGF0ZVswXS50eF9lbmFibGVkKSB7Ci0JCQkqcG9ydDEgPSAxOwotCQkJKnBvcnQyID0gMTsKLQkJfSBlbHNlIHsKLQkJCSpwb3J0MSA9IDI7Ci0JCQkqcG9ydDIgPSAyOwotCQl9Ci0JfSBlbHNlIHsKLQkJKnBvcnQxID0gMTsKLQkJKnBvcnQyID0gMjsKLQkJaWYgKCF0cmFja2VyLT5uZXRkZXZfc3RhdGVbMF0ubGlua191cCkKLQkJCSpwb3J0MSA9IDI7Ci0JCWVsc2UgaWYgKCF0cmFja2VyLT5uZXRkZXZfc3RhdGVbMV0ubGlua191cCkKLQkJCSpwb3J0MiA9IDE7CisJKnBvcnQxID0gMTsKKwkqcG9ydDIgPSAyOworCWlmICghdHJhY2tlci0+bmV0ZGV2X3N0YXRlWzBdLnR4X2VuYWJsZWQgfHwKKwkgICAgIXRyYWNrZXItPm5ldGRldl9zdGF0ZVswXS5saW5rX3VwKSB7CisJCSpwb3J0MSA9IDI7CisJCXJldHVybjsKIAl9CisKKwlpZiAoIXRyYWNrZXItPm5ldGRldl9zdGF0ZVsxXS50eF9lbmFibGVkIHx8CisJICAgICF0cmFja2VyLT5uZXRkZXZfc3RhdGVbMV0ubGlua191cCkKKwkJKnBvcnQyID0gMTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NV9hY3RpdmF0ZV9sYWcoc3RydWN0IG1seDVfbGFnICpsZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmMKaW5kZXggZjkwMmM0ZC4uMTgwNmIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5jCkBAIC00MTcyLDYgKzQxNzIsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICghaW5mby0+bGlua2luZykKIAkJCWJyZWFrOworCQlpZiAobmV0ZGV2X2hhc19hbnlfdXBwZXJfZGV2KHVwcGVyX2RldikpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogSFcgbGltaXRhdGlvbiBmb3JiaWRzIHRvIHB1dCBwb3J0cyB0byBtdWx0aXBsZSBicmlkZ2VzLiAqLwogCQlpZiAobmV0aWZfaXNfYnJpZGdlX21hc3Rlcih1cHBlcl9kZXYpICYmCiAJCSAgICAhbWx4c3dfc3BfbWFzdGVyX2JyaWRnZV9jaGVjayhtbHhzd19zcCwgdXBwZXJfZGV2KSkKQEAgLTQxODUsNiArNDE4NywxMCBAQAogCQlpZiAobmV0aWZfaXNfbGFnX3BvcnQoZGV2KSAmJiBpc192bGFuX2Rldih1cHBlcl9kZXYpICYmCiAJCSAgICAhbmV0aWZfaXNfbGFnX21hc3Rlcih2bGFuX2Rldl9yZWFsX2Rldih1cHBlcl9kZXYpKSkKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWluZm8tPmxpbmtpbmcpCisJCQlicmVhazsKKwkJaWYgKG5ldGRldl9oYXNfYW55X3VwcGVyX2Rldih1cHBlcl9kZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWNhc2UgTkVUREVWX0NIQU5HRVVQUEVSOgogCQl1cHBlcl9kZXYgPSBpbmZvLT51cHBlcl9kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY29tbW9uLmMKaW5kZXggYWVlM2ZkMi4uNGNhODJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jb21tb24uYwpAQCAtODcxLDggKzg3MSw3IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZXJyX3VubWFwOgotCS0tZjsKLQl3aGlsZSAoZiA+PSAwKSB7CisJd2hpbGUgKC0tZiA+PSAwKSB7CiAJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKIAkJZG1hX3VubWFwX3BhZ2UoJm5uLT5wZGV2LT5kZXYsCiAJCQkgICAgICAgdHhfcmluZy0+dHhidWZzW3dyX2lkeF0uZG1hX2FkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX2RiZy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9kYmcuYwppbmRleCA4MjliZTIxLi5iZTI1OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX2RiZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfZGJnLmMKQEAgLTcyNCw3ICs3MjQsNyBAQAogCXNlZ19oZHItPmNvb2tpZSA9IE1QSV9DT1JFRFVNUF9DT09LSUU7CiAJc2VnX2hkci0+c2VnTnVtID0gc2VnX251bWJlcjsKIAlzZWdfaGRyLT5zZWdTaXplID0gc2VnX3NpemU7Ci0JbWVtY3B5KHNlZ19oZHItPmRlc2NyaXB0aW9uLCBkZXNjLCAoc2l6ZW9mKHNlZ19oZHItPmRlc2NyaXB0aW9uKSkgLSAxKTsKKwlzdHJuY3B5KHNlZ19oZHItPmRlc2NyaXB0aW9uLCBkZXNjLCAoc2l6ZW9mKHNlZ19oZHItPmRlc2NyaXB0aW9uKSkgLSAxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYwppbmRleCBiZjAwMGQ4Li4yYzQzNTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9yODE2OS5jCkBAIC0zMjYsNiArMzI2LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydGw4MTY5X3BjaV90YmxbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxMjkpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxMzYpLCAwLCAwLCBSVExfQ0ZHXzIgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjEpLCAwLCAwLCBSVExfQ0ZHXzEgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjcpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjgpLCAwLCAwLCBSVExfQ0ZHXzEgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLAkweDgxNjkpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCmluZGV4IGEyZDIxOGIuLjIxNDBkZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYwpAQCAtNTc0LDYgKzU3NCw3IEBACiAJLnJwYWRpcl92YWx1ZSAgID0gMiA8PCAxNiwKIAkubm9fdHJpbWQJPSAxLAogCS5ub19hZGUJCT0gMSwKKwkuaHdfY3JjCQk9IDEsCiAJLnRzdQkJPSAxLAogCS5zZWxlY3RfbWlpCT0gMSwKIAkuc2hpZnRfcmQwCT0gMSwKQEAgLTgwMiw3ICs4MDMsNyBAQAogCiAJLmVjc3JfdmFsdWUJPSBFQ1NSX0lDRCB8IEVDU1JfTVBELAogCS5lY3NpcHJfdmFsdWUJPSBFQ1NJUFJfTENITkdJUCB8IEVDU0lQUl9JQ0RJUCB8IEVDU0lQUl9NUERJUCwKLQkuZWVzaXByX3ZhbHVlCT0gRE1BQ19NX1JGUk1FUiB8IERNQUNfTV9FQ0kgfCAweDAwM2ZmZmZmLAorCS5lZXNpcHJfdmFsdWUJPSBETUFDX01fUkZSTUVSIHwgRE1BQ19NX0VDSSB8IDB4MDAzZjA3ZmYsCiAKIAkudHhfY2hlY2sJPSBFRVNSX1RDMSB8IEVFU1JfRlRDLAogCS5lZXNyX2Vycl9jaGVjawk9IEVFU1JfVFdCMSB8IEVFU1JfVFdCIHwgRUVTUl9UQUJUIHwgRUVTUl9SQUJUIHwKQEAgLTgxOSw2ICs4MjAsNyBAQAogCS50c3UJCT0gMSwKIAkuaHdfY3JjCQk9IDEsCiAJLnNlbGVjdF9taWkJPSAxLAorCS5zaGlmdF9yZDAJPSAxLAogfTsKIAogLyogU0g3NzYzICovCkBAIC04MzEsNyArODMzLDcgQEAKIAogCS5lY3NyX3ZhbHVlCT0gRUNTUl9JQ0QgfCBFQ1NSX01QRCwKIAkuZWNzaXByX3ZhbHVlCT0gRUNTSVBSX0xDSE5HSVAgfCBFQ1NJUFJfSUNESVAgfCBFQ1NJUFJfTVBESVAsCi0JLmVlc2lwcl92YWx1ZQk9IERNQUNfTV9SRlJNRVIgfCBETUFDX01fRUNJIHwgMHgwMDNmZmZmZiwKKwkuZWVzaXByX3ZhbHVlCT0gRE1BQ19NX1JGUk1FUiB8IERNQUNfTV9FQ0kgfCAweDAwM2YwN2ZmLAogCiAJLnR4X2NoZWNrCT0gRUVTUl9UQzEgfCBFRVNSX0ZUQywKIAkuZWVzcl9lcnJfY2hlY2sJPSBFRVNSX1RXQjEgfCBFRVNSX1RXQiB8IEVFU1JfVEFCVCB8IEVFU1JfUkFCVCB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYwppbmRleCBmZjAzOGU1Li4zNmEwNGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKQEAgLTEwODQsNyArMTA4NCwxMiBAQAogCWJvb2wgbm90aWZ5ID0gZmFsc2UsIHJlc2NoZWR1bGUgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBuZXh0X3JlY29uZmlnLCBkZWxheTsKIAotCXJ0bmxfbG9jaygpOworCS8qIGlmIGNoYW5nZXMgYXJlIGhhcHBlbmluZywgY29tZWJhY2sgbGF0ZXIgKi8KKwlpZiAoIXJ0bmxfdHJ5bG9jaygpKSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmRldl9jdHgtPmR3b3JrLCBMSU5LQ0hBTkdFX0lOVCk7CisJCXJldHVybjsKKwl9CisKIAlpZiAobmRldl9jdHgtPnN0YXJ0X3JlbW92ZSkKIAkJZ290byBvdXRfdW5sb2NrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCmluZGV4IGJjYTZhMWUuLmUxYmI4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCkBAIC0xNDEsOSArMTQxLDE5IEBACiBzdGF0aWMgaW50IG1jc19nZXRfcmVnKHN0cnVjdCBtY3NfY2IgKm1jcywgX191MTYgcmVnLCBfX3UxNiAqIHZhbCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gbWNzLT51c2JkZXY7Ci0JaW50IHJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCBNQ1NfUkRSRVEsCi0JCQkJICBNQ1NfUkRfUlRZUEUsIDAsIHJlZywgdmFsLCAyLAotCQkJCSAgbXNlY3NfdG9famlmZmllcyhNQ1NfQ1RSTF9USU1FT1VUKSk7CisJdm9pZCAqZG1hYnVmOworCWludCByZXQ7CisKKwlkbWFidWYgPSBrbWFsbG9jKHNpemVvZihfX3UxNiksIEdGUF9LRVJORUwpOworCWlmICghZG1hYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCBNQ1NfUkRSRVEsCisJCQkgICAgICBNQ1NfUkRfUlRZUEUsIDAsIHJlZywgZG1hYnVmLCAyLAorCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhNQ1NfQ1RSTF9USU1FT1VUKSk7CisKKwltZW1jcHkodmFsLCBkbWFidWYsIHNpemVvZihfX3UxNikpOworCWtmcmVlKGRtYWJ1Zik7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc2VjLmMgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwppbmRleCBhNWQ2NmUyLi4yY2FhYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNzZWMuYworKysgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwpAQCAtMzUxMCw2ICszNTEwLDcgQEAKIG1vZHVsZV9leGl0KG1hY3NlY19leGl0KTsKIAogTU9EVUxFX0FMSUFTX1JUTkxfTElOSygibWFjc2VjIik7CitNT0RVTEVfQUxJQVNfR0VOTF9GQU1JTFkoIm1hY3NlYyIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1BQ3NlYyBJRUVFIDgwMi4xQUUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9kcDgzODY3LmMgYi9kcml2ZXJzL25ldC9waHkvZHA4Mzg2Ny5jCmluZGV4IDRjYWQ5NTUuLjAxY2YwOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9kcDgzODY3LmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L2RwODM4NjcuYwpAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBNSUlfRFA4Mzg2N19NSUNSCTB4MTIKICNkZWZpbmUgTUlJX0RQODM4NjdfSVNSCQkweDEzCiAjZGVmaW5lIERQODM4NjdfQ1RSTAkJMHgxZgorI2RlZmluZSBEUDgzODY3X0NGRzMJCTB4MWUKIAogLyogRXh0ZW5kZWQgUmVnaXN0ZXJzICovCiAjZGVmaW5lIERQODM4NjdfUkdNSUlDVEwJMHgwMDMyCkBAIC05MCw2ICs5MSw4IEBACiAJCW1pY3Jfc3RhdHVzIHw9CiAJCQkoTUlJX0RQODM4NjdfTUlDUl9BTl9FUlJfSU5UX0VOIHwKIAkJCU1JSV9EUDgzODY3X01JQ1JfU1BFRURfQ0hOR19JTlRfRU4gfAorCQkJTUlJX0RQODM4NjdfTUlDUl9BVVRPTkVHX0NPTVBfSU5UX0VOIHwKKwkJCU1JSV9EUDgzODY3X01JQ1JfTElOS19TVFNfQ0hOR19JTlRfRU4gfAogCQkJTUlJX0RQODM4NjdfTUlDUl9EVVBfTU9ERV9DSE5HX0lOVF9FTiB8CiAJCQlNSUlfRFA4Mzg2N19NSUNSX1NMRUVQX01PREVfQ0hOR19JTlRfRU4pOwogCkBAIC0xOTAsNiArMTkzLDEzIEBACiAJCQkJICAgICAgIERQODM4NjdfREVWQUREUiwgZGVsYXkpOwogCX0KIAorCS8qIEVuYWJsZSBJbnRlcnJ1cHQgb3V0cHV0IElOVF9PRSBpbiBDRkczIHJlZ2lzdGVyICovCisJaWYgKHBoeV9pbnRlcnJ1cHRfaXNfdmFsaWQocGh5ZGV2KSkgeworCQl2YWwgPSBwaHlfcmVhZChwaHlkZXYsIERQODM4NjdfQ0ZHMyk7CisJCXZhbCB8PSBCSVQoNyk7CisJCXBoeV93cml0ZShwaHlkZXYsIERQODM4NjdfQ0ZHMywgdmFsKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IGVkZDMwZWIuLjZlMTI0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5LmMKQEAgLTEwNjAsNiArMTA2MCwxNSBAQAogCQkJaWYgKG9sZF9saW5rICE9IHBoeWRldi0+bGluaykKIAkJCQlwaHlkZXYtPnN0YXRlID0gUEhZX0NIQU5HRUxJTks7CiAJCX0KKwkJLyoKKwkJICogRmFpbHNhZmU6IGNoZWNrIHRoYXQgbm9ib2R5IHNldCBwaHlkZXYtPmxpbms9MCBiZXR3ZWVuIHR3bworCQkgKiBwb2xsIGN5Y2xlcywgb3RoZXJ3aXNlIHdlIHdvbid0IGxlYXZlIFJVTk5JTkcgc3RhdGUgYXMgbG9uZworCQkgKiBhcyBsaW5rIHJlbWFpbnMgZG93bi4KKwkJICovCisJCWlmICghcGh5ZGV2LT5saW5rICYmIHBoeWRldi0+c3RhdGUgPT0gUEhZX1JVTk5JTkcpIHsKKwkJCXBoeWRldi0+c3RhdGUgPSBQSFlfQ0hBTkdFTElOSzsKKwkJCXBoeWRldl9lcnIocGh5ZGV2LCAibm8gbGluayBpbiBQSFlfUlVOTklOR1xuIik7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBQSFlfQ0hBTkdFTElOSzoKIAkJZXJyID0gcGh5X3JlYWRfc3RhdHVzKHBoeWRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwppbmRleCAzMmI1NTVhLi5iZjAyZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKQEAgLTE3MTQsNiArMTcxNCw4IEBACiB7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHRvX3BoeV9kZXZpY2UoZGV2KTsKIAorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGh5ZGV2LT5zdGF0ZV9xdWV1ZSk7CisKIAltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOwogCXBoeWRldi0+c3RhdGUgPSBQSFlfRE9XTjsKIAltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CkBAIC0xNzkyLDcgKzE3OTQsNyBAQAogCS5waHlfaWQJCT0gMHhmZmZmZmZmZiwKIAkucGh5X2lkX21hc2sJPSAweGZmZmZmZmZmLAogCS5uYW1lCQk9ICJHZW5lcmljIFBIWSIsCi0JLnNvZnRfcmVzZXQJPSBnZW5waHlfc29mdF9yZXNldCwKKwkuc29mdF9yZXNldAk9IGdlbnBoeV9ub19zb2Z0X3Jlc2V0LAogCS5jb25maWdfaW5pdAk9IGdlbnBoeV9jb25maWdfaW5pdCwKIAkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9NSUkgfAogCQkJICBTVVBQT1JURURfQVVJIHwgU1VQUE9SVEVEX0ZJQlJFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKaW5kZXggNTQ4OWMwZS4uOTZmYTBlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKQEAgLTExOSw2ICsxMTksNyBAQAogCWludAkJbl9jaGFubmVsczsJLyogaG93IG1hbnkgY2hhbm5lbHMgYXJlIGF0dGFjaGVkIDU0ICovCiAJc3BpbmxvY2tfdAlybG9jazsJCS8qIGxvY2sgZm9yIHJlY2VpdmUgc2lkZSA1OCAqLwogCXNwaW5sb2NrX3QJd2xvY2s7CQkvKiBsb2NrIGZvciB0cmFuc21pdCBzaWRlIDVjICovCisJaW50CQkqeG1pdF9yZWN1cnNpb24gX19wZXJjcHU7IC8qIHhtaXQgcmVjdXJzaW9uIGRldGVjdCAqLwogCWludAkJbXJ1OwkJLyogbWF4IHJlY2VpdmUgdW5pdCA2MCAqLwogCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIGNvbnRyb2wgYml0cyA2NCAqLwogCXVuc2lnbmVkIGludAl4c3RhdGU7CQkvKiB0cmFuc21pdCBzdGF0ZSBiaXRzIDY4ICovCkBAIC0xMDI0LDYgKzEwMjUsNyBAQAogCXN0cnVjdCBwcHAgKnBwcCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGluZHg7CiAJaW50IGVycjsKKwlpbnQgY3B1OwogCiAJcHBwLT5kZXYgPSBkZXY7CiAJcHBwLT5wcHBfbmV0ID0gc3JjX25ldDsKQEAgLTEwMzgsNiArMTA0MCwxNSBAQAogCUlOSVRfTElTVF9IRUFEKCZwcHAtPmNoYW5uZWxzKTsKIAlzcGluX2xvY2tfaW5pdCgmcHBwLT5ybG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnBwcC0+d2xvY2spOworCisJcHBwLT54bWl0X3JlY3Vyc2lvbiA9IGFsbG9jX3BlcmNwdShpbnQpOworCWlmICghcHBwLT54bWl0X3JlY3Vyc2lvbikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCSgqcGVyX2NwdV9wdHIocHBwLT54bWl0X3JlY3Vyc2lvbiwgY3B1KSkgPSAwOworCiAjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKIAlwcHAtPm1pbnNlcSA9IC0xOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBwcC0+bXJxKTsKQEAgLTEwNDksMTEgKzEwNjAsMTUgQEAKIAogCWVyciA9IHBwcF91bml0X3JlZ2lzdGVyKHBwcCwgY29uZi0+dW5pdCwgY29uZi0+aWZuYW1lX2lzX3NldCk7CiAJaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyMjsKIAogCWNvbmYtPmZpbGUtPnByaXZhdGVfZGF0YSA9ICZwcHAtPmZpbGU7CiAKIAlyZXR1cm4gMDsKK2VycjI6CisJZnJlZV9wZXJjcHUocHBwLT54bWl0X3JlY3Vyc2lvbik7CitlcnIxOgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBwcHBfbmxfcG9saWN5W0lGTEFfUFBQX01BWCArIDFdID0gewpAQCAtMTM5OSwxOCArMTQxNCwxNiBAQAogCXBwcF94bWl0X3VubG9jayhwcHApOwogfQogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwcHBfeG1pdF9yZWN1cnNpb24pOwotCiBzdGF0aWMgdm9pZCBwcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCkKIHsKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAKLQlpZiAodW5saWtlbHkoX190aGlzX2NwdV9yZWFkKHBwcF94bWl0X3JlY3Vyc2lvbikpKQorCWlmICh1bmxpa2VseSgqdGhpc19jcHVfcHRyKHBwcC0+eG1pdF9yZWN1cnNpb24pKSkKIAkJZ290byBlcnI7CiAKLQlfX3RoaXNfY3B1X2luYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCSgqdGhpc19jcHVfcHRyKHBwcC0+eG1pdF9yZWN1cnNpb24pKSsrOwogCV9fcHBwX3htaXRfcHJvY2VzcyhwcHApOwotCV9fdGhpc19jcHVfZGVjKHBwcF94bWl0X3JlY3Vyc2lvbik7CisJKCp0aGlzX2NwdV9wdHIocHBwLT54bWl0X3JlY3Vyc2lvbikpLS07CiAKIAlsb2NhbF9iaF9lbmFibGUoKTsKIApAQCAtMTkwMSwyMyArMTkxNCwyMyBAQAogCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKIAkvKiBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgZnJvbSB0aGUgYXR0YWNoZWQgdW5pdCB0byBiZSBzZW50ICovCiAJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcGNoLT5maWxlLnhxKSkgewotCQlyZWFkX2xvY2tfYmgoJnBjaC0+dXBsKTsKIAkJcHBwID0gcGNoLT5wcHA7CiAJCWlmIChwcHApCiAJCQlfX3BwcF94bWl0X3Byb2Nlc3MocHBwKTsKLQkJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHBwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKIHsKLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0KLQlfX3RoaXNfY3B1X2luYyhwcHBfeG1pdF9yZWN1cnNpb24pOwotCV9fcHBwX2NoYW5uZWxfcHVzaChwY2gpOwotCV9fdGhpc19jcHVfZGVjKHBwcF94bWl0X3JlY3Vyc2lvbik7Ci0KLQlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZWFkX2xvY2tfYmgoJnBjaC0+dXBsKTsKKwlpZiAocGNoLT5wcHApIHsKKwkJKCp0aGlzX2NwdV9wdHIocGNoLT5wcHAtPnhtaXRfcmVjdXJzaW9uKSkrKzsKKwkJX19wcHBfY2hhbm5lbF9wdXNoKHBjaCk7CisJCSgqdGhpc19jcHVfcHRyKHBjaC0+cHBwLT54bWl0X3JlY3Vyc2lvbikpLS07CisJfSBlbHNlIHsKKwkJX19wcHBfY2hhbm5lbF9wdXNoKHBjaCk7CisJfQorCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CiB9CiAKIC8qCkBAIC0zMDU2LDYgKzMwNjksNyBAQAogI2VuZGlmIC8qIENPTkZJR19QUFBfRklMVEVSICovCiAKIAlrZnJlZV9za2IocHBwLT54bWl0X3BlbmRpbmcpOworCWZyZWVfcGVyY3B1KHBwcC0+eG1pdF9yZWN1cnNpb24pOwogCiAJZnJlZV9uZXRkZXYocHBwLT5kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jCmluZGV4IGRjN2I2MzkuLjUwNzM3ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMKQEAgLTEzNjksNiArMTM2OSw3IEBACiAJLnByb2JlID0JdXNibmV0X3Byb2JlLAogCS5zdXNwZW5kID0JYXNpeF9zdXNwZW5kLAogCS5yZXN1bWUgPQlhc2l4X3Jlc3VtZSwKKwkucmVzZXRfcmVzdW1lID0JYXNpeF9yZXN1bWUsCiAJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKIAkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9xbWlfd3dhbi5jIGIvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMKaW5kZXggMmYyNjBjNi4uNDlhMjdkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMKQEAgLTg3Niw2ICs4NzYsNyBAQAogCXtRTUlfRklYRURfSU5URigweDE5ZDIsIDB4MTQyOCwgMil9LAkvKiBUZWxld2VsbCBUVy1MVEUgNEcgdjIgKi8KIAl7UU1JX0ZJWEVEX0lOVEYoMHgxOWQyLCAweDIwMDIsIDQpfSwJLyogWlRFIChWb2RhZm9uZSkgSzM3NjUtWiAqLwogCXtRTUlfRklYRURfSU5URigweDIwMDEsIDB4N2UxOSwgNCl9LAkvKiBELUxpbmsgRFdNLTIyMSBCMSAqLworCXtRTUlfRklYRURfSU5URigweDIwMDEsIDB4N2UzNSwgNCl9LAkvKiBELUxpbmsgRFdNLTIyMiAqLwogCXtRTUlfRklYRURfSU5URigweDBmM2QsIDB4NjhhMiwgOCl9LCAgICAvKiBTaWVycmEgV2lyZWxlc3MgTUM3NzAwICovCiAJe1FNSV9GSVhFRF9JTlRGKDB4MTE0ZiwgMHg2OGEyLCA4KX0sICAgIC8qIFNpZXJyYSBXaXJlbGVzcyBNQzc3NTAgKi8KIAl7UU1JX0ZJWEVEX0lOVEYoMHgxMTk5LCAweDY4YTIsIDgpfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DNzcxMCBpbiBRTUkgbW9kZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwppbmRleCA5NzJiNWUyLi4zNjZkM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwpAQCAtMTg1Miw2ICsxODUyLDEyIEBACiAJCWdvdG8gZXJyX3dtaV9kZXRhY2g7CiAJfQogCisJLyogSWYgZmlybXdhcmUgaW5kaWNhdGVzIEZ1bGwgUnggUmVvcmRlciBzdXBwb3J0IGl0IG11c3QgYmUgdXNlZCBpbiBhCisJICogc2xpZ2h0bHkgZGlmZmVyZW50IG1hbm5lci4gTGV0IEhUVCBjb2RlIGtub3cuCisJICovCisJYXItPmh0dC5yeF9yaW5nLmluX29yZF9yeCA9ICEhKHRlc3RfYml0KFdNSV9TRVJWSUNFX1JYX0ZVTExfUkVPUkRFUiwKKwkJCQkJCWFyLT53bWkuc3ZjX21hcCkpOworCiAJc3RhdHVzID0gYXRoMTBrX2h0dF9yeF9hbGxvYygmYXItPmh0dCk7CiAJaWYgKHN0YXR1cykgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGFsbG9jIGh0dCByeDogJWRcbiIsIHN0YXR1cyk7CkBAIC0xOTY0LDEyICsxOTcwLDYgQEAKIAkJfQogCX0KIAotCS8qIElmIGZpcm13YXJlIGluZGljYXRlcyBGdWxsIFJ4IFJlb3JkZXIgc3VwcG9ydCBpdCBtdXN0IGJlIHVzZWQgaW4gYQotCSAqIHNsaWdodGx5IGRpZmZlcmVudCBtYW5uZXIuIExldCBIVFQgY29kZSBrbm93LgotCSAqLwotCWFyLT5odHQucnhfcmluZy5pbl9vcmRfcnggPSAhISh0ZXN0X2JpdChXTUlfU0VSVklDRV9SWF9GVUxMX1JFT1JERVIsCi0JCQkJCQlhci0+d21pLnN2Y19tYXApKTsKLQogCXN0YXR1cyA9IGF0aDEwa19odHRfcnhfcmluZ19yZWZpbGwoYXIpOwogCWlmIChzdGF0dXMpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byByZWZpbGwgaHR0IHJ4IHJpbmc6ICVkXG4iLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAppbmRleCBjOWE4YmIxLi5jNzk1NmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaApAQCAtNjYwLDYgKzY2MCw5IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MzIgY21kX2lkOwogCisJaWYgKCFhci0+d21pLm9wcy0+Z2VuX3ZkZXZfc3BlY3RyYWxfY29uZikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJc2tiID0gYXItPndtaS5vcHMtPmdlbl92ZGV2X3NwZWN0cmFsX2NvbmYoYXIsIGFyZyk7CiAJaWYgKElTX0VSUihza2IpKQogCQlyZXR1cm4gUFRSX0VSUihza2IpOwpAQCAtNjc1LDYgKzY3OCw5IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MzIgY21kX2lkOwogCisJaWYgKCFhci0+d21pLm9wcy0+Z2VuX3ZkZXZfc3BlY3RyYWxfZW5hYmxlKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlza2IgPSBhci0+d21pLm9wcy0+Z2VuX3ZkZXZfc3BlY3RyYWxfZW5hYmxlKGFyLCB2ZGV2X2lkLCB0cmlnZ2VyLAogCQkJCQkJICAgIGVuYWJsZSk7CiAJaWYgKElTX0VSUihza2IpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCmluZGV4IGI3ZmUwYWYuLjYzNzU0ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKQEAgLTgwNyw5ICs4MDcsMTUgQEAKIAkJCQkJV0xBTl9TVEFUVVNfU1VDQ0VTUywgR0ZQX0tFUk5FTCk7CiAJCWNmZzgwMjExX3B1dF9ic3MoYXItPndpcGh5LCBic3MpOwogCX0gZWxzZSBpZiAodmlmLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RFRCkgeworCQlzdHJ1Y3QgY2ZnODAyMTFfcm9hbV9pbmZvIHJvYW1faW5mbyA9IHsKKwkJCS5ic3MgPSBic3MsCisJCQkucmVxX2llID0gYXNzb2NfcmVxX2llLAorCQkJLnJlcV9pZV9sZW4gPSBhc3NvY19yZXFfbGVuLAorCQkJLnJlc3BfaWUgPSBhc3NvY19yZXNwX2llLAorCQkJLnJlc3BfaWVfbGVuID0gYXNzb2NfcmVzcF9sZW4sCisJCX07CiAJCS8qIGluZm9ybSByb2FtIGV2ZW50IHRvIGNmZzgwMjExICovCi0JCWNmZzgwMjExX3JvYW1lZF9ic3ModmlmLT5uZGV2LCBic3MsIGFzc29jX3JlcV9pZSwgYXNzb2NfcmVxX2xlbiwKLQkJCQkgICAgYXNzb2NfcmVzcF9pZSwgYXNzb2NfcmVzcF9sZW4sIEdGUF9LRVJORUwpOworCQljZmc4MDIxMV9yb2FtZWQodmlmLT5uZGV2LCAmcm9hbV9pbmZvLCBHRlBfS0VSTkVMKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9LY29uZmlnCmluZGV4IDBlNjYzNDguLjJhYjZjNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvS2NvbmZpZwpAQCAtNjAsMyArNjAsMTUgQEAKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB3aWw2MjEwIGRyaXZlciBzdXBwb3J0IGZvciBNU00KIAkgIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzCisKK2NvbmZpZyBXSUw2MjEwX0RFQlVHRlMKKwlib29sICJ3aWw2MjEwIGRlYnVnZnMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFdJTDYyMTAKKwlkZXBlbmRzIG9uIERFQlVHX0ZTCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgd2lsNjIxMCBkZWJ1Z2ZzIHN1cHBvcnQsIHVzaW5nIHRoZQorCSAga2VybmVsIGRlYnVnZnMgaW5mcmFzdHJ1Y3R1cmUuIFNlbGVjdCB0aGlzCisJICBvcHRpb24gaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGRlYnVnZ2luZyB0aGUgZHJpdmVyLgorCisJICBJZiB1bnN1cmUsIHNheSBZIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlYnVnIHByb2JsZW1zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9NYWtlZmlsZQppbmRleCA0ODc0YzViLi45NGRmMWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIHdpbDYyMTAteSArPSBuZXRkZXYubwogd2lsNjIxMC15ICs9IGNmZzgwMjExLm8KIHdpbDYyMTAteSArPSBwY2llX2J1cy5vCi13aWw2MjEwLXkgKz0gZGVidWdmcy5vCit3aWw2MjEwLSQoQ09ORklHX1dJTDYyMTBfREVCVUdGUykgKz0gZGVidWdmcy5vCiB3aWw2MjEwLXkgKz0gc3lzZnMubwogd2lsNjIxMC15ICs9IHdtaS5vCiB3aWw2MjEwLXkgKz0gaW50ZXJydXB0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCmluZGV4IDcwMzc5YzguLmUyYTQ1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYwpAQCAtMzUwLDEyICszNTAsMTIgQEAKIAogCXdpbF9kYmdfd21pKHdpbCwgIkxpbmsgc3RhdHVzIGZvciBDSUQgJWQ6IHtcbiIKIAkJICAgICIgIE1DUyAlZCBUU0YgMHglMDE2bGx4XG4iCi0JCSAgICAiICBCRiBzdGF0dXMgMHglMDh4IFNOUiAweCUwOHggU1FJICVkJSVcbiIKKwkJICAgICIgIEJGIHN0YXR1cyAweCUwOHggUlNTSSAlZCBTUUkgJWQlJVxuIgogCQkgICAgIiAgVHggVHB0ICVkIGdvb2RwdXQgJWQgUnggZ29vZHB1dCAlZFxuIgogCQkgICAgIiAgU2VjdG9ycyhyeDp0eCkgbXkgJWQ6JWQgcGVlciAlZDolZFxuIiJ9XG4iLAogCQkgICAgY2lkLCBsZTE2X3RvX2NwdShyZXBseS5ldnQuYmZfbWNzKSwKIAkJICAgIGxlNjRfdG9fY3B1KHJlcGx5LmV2dC50c2YpLCByZXBseS5ldnQuc3RhdHVzLAotCQkgICAgbGUzMl90b19jcHUocmVwbHkuZXZ0LnNucl92YWwpLAorCQkgICAgcmVwbHkuZXZ0LnJzc2ksCiAJCSAgICByZXBseS5ldnQuc3FpLAogCQkgICAgbGUzMl90b19jcHUocmVwbHkuZXZ0LnR4X3RwdCksCiAJCSAgICBsZTMyX3RvX2NwdShyZXBseS5ldnQudHhfZ29vZHB1dCksCkBAIC0zODksNyArMzg5LDExIEBACiAKIAlpZiAodGVzdF9iaXQod2lsX3N0YXR1c19md2Nvbm5lY3RlZCwgd2lsLT5zdGF0dXMpKSB7CiAJCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fU0lHTkFMKTsKLQkJc2luZm8tPnNpZ25hbCA9IHJlcGx5LmV2dC5zcWk7CisJCWlmICh0ZXN0X2JpdChXTUlfRldfQ0FQQUJJTElUWV9SU1NJX1JFUE9SVElORywKKwkJCSAgICAgd2lsLT5md19jYXBhYmlsaXRpZXMpKQorCQkJc2luZm8tPnNpZ25hbCA9IHJlcGx5LmV2dC5yc3NpOworCQllbHNlCisJCQlzaW5mby0+c2lnbmFsID0gcmVwbHkuZXZ0LnNxaTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC00NTAsNiArNDU0LDM0IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IHdpbF9jZmc4MDIxMV9zdGFydF9wMnBfZGV2aWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHdpcGh5X3RvX3dpbCh3aXBoeSk7CisKKwl3aWxfZGJnX21pc2Mod2lsLCAic3RhcnRfcDJwX2RldmljZTogZW50ZXJlZFxuIik7CisJd2lsLT5wMnAucDJwX2Rldl9zdGFydGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2lsX2NmZzgwMjExX3N0b3BfcDJwX2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKK3sKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aXBoeV90b193aWwod2lwaHkpOworCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKKworCWlmICghcDJwLT5wMnBfZGV2X3N0YXJ0ZWQpCisJCXJldHVybjsKKworCXdpbF9kYmdfbWlzYyh3aWwsICJzdG9wX3AycF9kZXZpY2U6IGVudGVyZWRcbiIpOworCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOworCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOworCXdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHdpbCk7CisJcDJwLT5wMnBfZGV2X3N0YXJ0ZWQgPSAwOworCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKK30KKwogc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKgogd2lsX2NmZzgwMjExX2FkZF9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLApAQCAtNDk4LDYgKzUzMCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXdpbF9jZmc4MDIxMV9zdG9wX3AycF9kZXZpY2Uod2lwaHksIHdkZXYpOwogCXdpbF9wMnBfd2Rldl9mcmVlKHdpbCk7CiAKIAlyZXR1cm4gMDsKQEAgLTg4Miw3ICs5MTUsNyBAQAogCQl3aWwtPmJzcyA9IGJzczsKIAkJLyogQ29ubmVjdCBjYW4gdGFrZSBsb3RzIG9mIHRpbWUgKi8KIAkJbW9kX3RpbWVyKCZ3aWwtPmNvbm5lY3RfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOwogCX0gZWxzZSB7CiAJCWNsZWFyX2JpdCh3aWxfc3RhdHVzX2Z3Y29ubmVjdGluZywgd2lsLT5zdGF0dXMpOwogCX0KQEAgLTE3MzIsMzQgKzE3NjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdpbF9jZmc4MDIxMV9zdGFydF9wMnBfZGV2aWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQotewotCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHdpcGh5X3RvX3dpbCh3aXBoeSk7Ci0KLQl3aWxfZGJnX21pc2Mod2lsLCAic3RhcnRfcDJwX2RldmljZTogZW50ZXJlZFxuIik7Ci0Jd2lsLT5wMnAucDJwX2Rldl9zdGFydGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd2lsX2NmZzgwMjExX3N0b3BfcDJwX2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKLXsKLQlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aXBoeV90b193aWwod2lwaHkpOwotCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKLQotCWlmICghcDJwLT5wMnBfZGV2X3N0YXJ0ZWQpCi0JCXJldHVybjsKLQotCXdpbF9kYmdfbWlzYyh3aWwsICJzdG9wX3AycF9kZXZpY2U6IGVudGVyZWRcbiIpOwotCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwotCXdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHdpbCk7Ci0JcDJwLT5wMnBfZGV2X3N0YXJ0ZWQgPSAwOwotCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKLX0KLQogc3RhdGljIGludCB3aWxfY2ZnODAyMTFfc2V0X3Bvd2VyX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgYm9vbCBlbmFibGVkLCBpbnQgdGltZW91dCkKQEAgLTE3OTcsOSArMTgwMiwxMyBAQAogCiAJd2lsX2RiZ19wbSh3aWwsICJzdXNwZW5kaW5nXG4iKTsKIAorCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwogCXdpbF9wMnBfc3RvcF9kaXNjb3Zlcnkod2lsKTsKIAorCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCXdpbF9hYm9ydF9zY2FuKHdpbCwgdHJ1ZSk7CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKKwltdXRleF91bmxvY2soJndpbC0+bXV0ZXgpOwogCiBvdXQ6CiAJcmV0dXJuIHJjOwpAQCAtMTg3NSw3ICsxODg0LDcgQEAKIAogCXdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfNjBHSFpdID0gJndpbF9iYW5kXzYwZ2h6OwogCi0JLyogVE9ETzogZmlndXJlIHRoaXMgb3V0ICovCisJLyogbWF5IGNoYW5nZSBhZnRlciByZWFkaW5nIEZXIGNhcGFiaWxpdGllcyAqLwogCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX1VOU1BFQzsKIAogCXdpcGh5LT5jaXBoZXJfc3VpdGVzID0gd2lsX2NpcGhlcl9zdWl0ZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKaW5kZXggYTBhNjc2Yi4uODMxNzgwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2RlYnVnZnMuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotCiAjaW5jbHVkZSAid2lsNjIxMC5oIgogI2luY2x1ZGUgIndtaS5oIgogI2luY2x1ZGUgInR4cnguaCIKQEAgLTMwLDcgKzI5LDYgQEAKIHN0YXRpYyB1MzIgbWVtX2FkZHI7CiBzdGF0aWMgdTMyIGRiZ190eGRlc2NfaW5kZXg7CiBzdGF0aWMgdTMyIGRiZ192cmluZ19pbmRleDsgLyogMjQrIGZvciBSeCwgMC4uMjMgZm9yIFR4ICovCi11MzIgdnJpbmdfaWRsZV90cnNoID0gMTY7IC8qIEhXIGZldGNoZXMgdXAgdG8gMTYgZGVzY3JpcHRvcnMgYXQgb25jZSAqLwogCiBlbnVtIGRiZ19vZmZfdHlwZSB7CiAJZG9mZl91MzIgPSAwLApAQCAtMjQ0LDEyICsyNDIsMTkgQEAKIHN0YXRpYyBpbnQgd2lsX21ib3hfZGVidWdmc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBzLT5wcml2YXRlOworCWludCByZXQ7CisKKwlyZXQgPSB3aWxfcG1fcnVudGltZV9nZXQod2lsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXdpbF9wcmludF9yaW5nKHMsICJ0eCIsIHdpbC0+Y3NyICsgSE9TVF9NQk9YICsKIAkJICAgICAgIG9mZnNldG9mKHN0cnVjdCB3aWw2MjEwX21ib3hfY3RsLCB0eCkpOwogCXdpbF9wcmludF9yaW5nKHMsICJyeCIsIHdpbC0+Y3NyICsgSE9TVF9NQk9YICsKIAkJICAgICAgIG9mZnNldG9mKHN0cnVjdCB3aWw2MjEwX21ib3hfY3RsLCByeCkpOwogCisJd2lsX3BtX3J1bnRpbWVfcHV0KHdpbCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjY3LDE1ICsyNzIsMzggQEAKIAogc3RhdGljIGludCB3aWxfZGVidWdmc19pb21lbV94MzJfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7Ci0Jd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKWRhdGEpOworCXN0cnVjdCB3aWxfZGVidWdmc19pb21lbV9kYXRhICpkID0gKHN0cnVjdAorCQkJCQkgICAgd2lsX2RlYnVnZnNfaW9tZW1fZGF0YSAqKWRhdGE7CisJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gZC0+d2lsOworCWludCByZXQ7CisKKwlyZXQgPSB3aWxfcG1fcnVudGltZV9nZXQod2lsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXdyaXRlbF9yZWxheGVkKHZhbCwgKHZvaWQgX19pb21lbSAqKWQtPm9mZnNldCk7CisKIAl3bWIoKTsgLyogbWFrZSBzdXJlIHdyaXRlIHByb3BhZ2F0ZWQgdG8gSFcgKi8KIAorCXdpbF9wbV9ydW50aW1lX3B1dCh3aWwpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd2lsX2RlYnVnZnNfaW9tZW1feDMyX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKIHsKLQkqdmFsID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKWRhdGEpOworCXN0cnVjdCB3aWxfZGVidWdmc19pb21lbV9kYXRhICpkID0gKHN0cnVjdAorCQkJCQkgICAgd2lsX2RlYnVnZnNfaW9tZW1fZGF0YSAqKWRhdGE7CisJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gZC0+d2lsOworCWludCByZXQ7CisKKwlyZXQgPSB3aWxfcG1fcnVudGltZV9nZXQod2lsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSByZWFkbF9yZWxheGVkKCh2b2lkIF9faW9tZW0gKilkLT5vZmZzZXQpOworCisJd2lsX3BtX3J1bnRpbWVfcHV0KHdpbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NiwxMCArMzE0LDIxIEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqd2lsX2RlYnVnZnNfY3JlYXRlX2lvbWVtX3gzMihjb25zdCBjaGFyICpuYW1lLAogCQkJCQkJICAgdW1vZGVfdCBtb2RlLAogCQkJCQkJICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAotCQkJCQkJICAgdm9pZCAqdmFsdWUpCisJCQkJCQkgICB2b2lkICp2YWx1ZSwKKwkJCQkJCSAgIHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLAotCQkJCSAgICZmb3BzX2lvbWVtX3gzMik7CisJc3RydWN0IGRlbnRyeSAqZmlsZTsKKwlzdHJ1Y3Qgd2lsX2RlYnVnZnNfaW9tZW1fZGF0YSAqZGF0YSA9ICZ3aWwtPmRiZ19kYXRhLmRhdGFfYXJyWworCQkJCQkgICAgICB3aWwtPmRiZ19kYXRhLmlvbWVtX2RhdGFfY291bnRdOworCisJZGF0YS0+d2lsID0gd2lsOworCWRhdGEtPm9mZnNldCA9IHZhbHVlOworCisJZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgbW9kZSwgcGFyZW50LCBkYXRhLCAmZm9wc19pb21lbV94MzIpOworCWlmICghSVNfRVJSX09SX05VTEwoZmlsZSkpCisJCXdpbC0+ZGJnX2RhdGEuaW9tZW1fZGF0YV9jb3VudCsrOworCisJcmV0dXJuIGZpbGU7CiB9CiAKIHN0YXRpYyBpbnQgd2lsX2RlYnVnZnNfdWxvbmdfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCkBAIC0zNDgsNyArMzg3LDggQEAKIAkJY2FzZSBkb2ZmX2lvMzI6CiAJCQlmID0gd2lsX2RlYnVnZnNfY3JlYXRlX2lvbWVtX3gzMih0YmxbaV0ubmFtZSwKIAkJCQkJCQkgdGJsW2ldLm1vZGUsIGRiZywKLQkJCQkJCQkgYmFzZSArIHRibFtpXS5vZmYpOworCQkJCQkJCSBiYXNlICsgdGJsW2ldLm9mZiwKKwkJCQkJCQkgd2lsKTsKIAkJCWJyZWFrOwogCQljYXNlIGRvZmZfdTg6CiAJCQlmID0gZGVidWdmc19jcmVhdGVfdTgodGJsW2ldLm5hbWUsIHRibFtpXS5tb2RlLCBkYmcsCkBAIC00NzcsMTMgKzUxNywyMiBAQAogc3RhdGljIGludCB3aWxfbWVtcmVhZF9kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHMtPnByaXZhdGU7Ci0Jdm9pZCBfX2lvbWVtICphID0gd21pX2J1ZmZlcih3aWwsIGNwdV90b19sZTMyKG1lbV9hZGRyKSk7CisJdm9pZCBfX2lvbWVtICphOworCWludCByZXQ7CisKKwlyZXQgPSB3aWxfcG1fcnVudGltZV9nZXQod2lsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWEgPSB3bWlfYnVmZmVyKHdpbCwgY3B1X3RvX2xlMzIobWVtX2FkZHIpKTsKIAogCWlmIChhKQogCQlzZXFfcHJpbnRmKHMsICJbMHglMDh4XSA9IDB4JTA4eFxuIiwgbWVtX2FkZHIsIHJlYWRsKGEpKTsKIAllbHNlCiAJCXNlcV9wcmludGYocywgIlsweCUwOHhdID0gSU5WQUxJRFxuIiwgbWVtX2FkZHIpOwogCisJd2lsX3BtX3J1bnRpbWVfcHV0KHdpbCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA0LDEwICs1NTMsMTIgQEAKIHsKIAllbnVtIHsgbWF4X2NvdW50ID0gNDA5NiB9OwogCXN0cnVjdCB3aWxfYmxvYl93cmFwcGVyICp3aWxfYmxvYiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aWxfYmxvYi0+d2lsOwogCWxvZmZfdCBwb3MgPSAqcHBvczsKIAlzaXplX3QgYXZhaWxhYmxlID0gd2lsX2Jsb2ItPmJsb2Iuc2l6ZTsKIAl2b2lkICpidWY7CiAJc2l6ZV90IHJldDsKKwlpbnQgcmM7CiAKIAlpZiAodGVzdF9iaXQod2lsX3N0YXR1c19zdXNwZW5kaW5nLCB3aWxfYmxvYi0+d2lsLT5zdGF0dXMpIHx8CiAJICAgIHRlc3RfYml0KHdpbF9zdGF0dXNfc3VzcGVuZGVkLCB3aWxfYmxvYi0+d2lsLT5zdGF0dXMpKQpAQCAtNTI4LDEwICs1NzksMTkgQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyYyA9IHdpbF9wbV9ydW50aW1lX2dldCh3aWwpOworCWlmIChyYyA8IDApIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIHJjOworCX0KKwogCXdpbF9tZW1jcHlfZnJvbWlvXzMyKGJ1ZiwgKGNvbnN0IHZvaWQgX19pb21lbSAqKQogCQkJICAgICB3aWxfYmxvYi0+YmxvYi5kYXRhICsgcG9zLCBjb3VudCk7CiAKIAlyZXQgPSBjb3B5X3RvX3VzZXIodXNlcl9idWYsIGJ1ZiwgY291bnQpOworCisJd2lsX3BtX3J1bnRpbWVfcHV0KHdpbCk7CisKIAlrZnJlZShidWYpOwogCWlmIChyZXQgPT0gY291bnQpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTAyMSw2ICsxMDgxLDcgQEAKIAkJCSAgICIgIFRTRiA9IDB4JTAxNmxseFxuIgogCQkJICAgIiAgVHhNQ1MgPSAlMmQgVHhUcHQgPSAlNGRcbiIKIAkJCSAgICIgIFNRSSA9ICU0ZFxuIgorCQkJICAgIiAgUlNTSSA9ICU0ZFxuIgogCQkJICAgIiAgU3RhdHVzID0gMHglMDh4ICVzXG4iCiAJCQkgICAiICBTZWN0b3JzKHJ4OnR4KSBteSAlMmQ6JTJkIHBlZXIgJTJkOiUyZFxuIgogCQkJICAgIiAgR29vZHB1dChyeDp0eCkgJTRkOiU0ZFxuIgpAQCAtMTAzMCw2ICsxMDkxLDcgQEAKIAkJCSAgIGxlMTZfdG9fY3B1KHJlcGx5LmV2dC5iZl9tY3MpLAogCQkJICAgbGUzMl90b19jcHUocmVwbHkuZXZ0LnR4X3RwdCksCiAJCQkgICByZXBseS5ldnQuc3FpLAorCQkJICAgcmVwbHkuZXZ0LnJzc2ksCiAJCQkgICBzdGF0dXMsIHdpbF9iZnN0YXR1c19zdHIoc3RhdHVzKSwKIAkJCSAgIGxlMTZfdG9fY3B1KHJlcGx5LmV2dC5teV9yeF9zZWN0b3IpLAogCQkJICAgbGUxNl90b19jcHUocmVwbHkuZXZ0Lm15X3R4X3NlY3RvciksCkBAIC0xNjIwLDYgKzE2ODIsOCBAQAogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCW1lbXNldCgmd2lsLT5zdXNwZW5kX3N0YXRzLCAwLCBzaXplb2Yod2lsLT5zdXNwZW5kX3N0YXRzKSk7CisJd2lsLT5zdXNwZW5kX3N0YXRzLm1pbl9zdXNwZW5kX3RpbWUgPSBVTE9OR19NQVg7CisJd2lsLT5zdXNwZW5kX3N0YXRzLmNvbGxlY3Rpb25fc3RhcnQgPSBrdGltZV9nZXQoKTsKIAogCXJldHVybiBsZW47CiB9CkBAIC0xNjMxLDE4ICsxNjk1LDI3IEBACiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0YXRpYyBjaGFyIHRleHRbNDAwXTsKIAlpbnQgbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhdHNfY29sbGVjdGlvbl90aW1lID0KKwkJa3RpbWVfdG9fdXMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLAorCQkJCSAgICAgIHdpbC0+c3VzcGVuZF9zdGF0cy5jb2xsZWN0aW9uX3N0YXJ0KSk7CiAKIAluID0gc25wcmludGYodGV4dCwgc2l6ZW9mKHRleHQpLAogCQkgICAgICJTdXNwZW5kIHN0YXRpc3RpY3M6XG4iCiAJCSAgICAgInN1Y2Nlc3NmdWwgc3VzcGVuZHM6JWxkIGZhaWxlZCBzdXNwZW5kczolbGRcbiIKIAkJICAgICAic3VjY2Vzc2Z1bCByZXN1bWVzOiVsZCBmYWlsZWQgcmVzdW1lczolbGRcbiIKLQkJICAgICAicmVqZWN0ZWQgYnkgaG9zdDolbGQgcmVqZWN0ZWQgYnkgZGV2aWNlOiVsZFxuIiwKKwkJICAgICAicmVqZWN0ZWQgYnkgaG9zdDolbGQgcmVqZWN0ZWQgYnkgZGV2aWNlOiVsZFxuIgorCQkgICAgICJ0b3RhbCBzdXNwZW5kIHRpbWU6JWxsZCBtaW4gc3VzcGVuZCB0aW1lOiVsbGRcbiIKKwkJICAgICAibWF4IHN1c3BlbmQgdGltZTolbGxkIHN0YXRzIGNvbGxlY3Rpb24gdGltZTogJWxsZFxuIiwKIAkJICAgICB3aWwtPnN1c3BlbmRfc3RhdHMuc3VjY2Vzc2Z1bF9zdXNwZW5kcywKIAkJICAgICB3aWwtPnN1c3BlbmRfc3RhdHMuZmFpbGVkX3N1c3BlbmRzLAogCQkgICAgIHdpbC0+c3VzcGVuZF9zdGF0cy5zdWNjZXNzZnVsX3Jlc3VtZXMsCiAJCSAgICAgd2lsLT5zdXNwZW5kX3N0YXRzLmZhaWxlZF9yZXN1bWVzLAogCQkgICAgIHdpbC0+c3VzcGVuZF9zdGF0cy5yZWplY3RlZF9ieV9ob3N0LAotCQkgICAgIHdpbC0+c3VzcGVuZF9zdGF0cy5yZWplY3RlZF9ieV9kZXZpY2UpOworCQkgICAgIHdpbC0+c3VzcGVuZF9zdGF0cy5yZWplY3RlZF9ieV9kZXZpY2UsCisJCSAgICAgd2lsLT5zdXNwZW5kX3N0YXRzLnRvdGFsX3N1c3BlbmRfdGltZSwKKwkJICAgICB3aWwtPnN1c3BlbmRfc3RhdHMubWluX3N1c3BlbmRfdGltZSwKKwkJICAgICB3aWwtPnN1c3BlbmRfc3RhdHMubWF4X3N1c3BlbmRfdGltZSwKKwkJICAgICBzdGF0c19jb2xsZWN0aW9uX3RpbWUpOwogCiAJbiA9IG1pbl90KGludCwgbiwgc2l6ZW9mKHRleHQpKTsKIApAQCAtMTc1NSw2ICsxODI4LDcgQEAKIAlXSUxfRklFTEQoY2hpcF9yZXZpc2lvbiwgMDQ0NCwJZG9mZl91OCksCiAJV0lMX0ZJRUxEKGFiZnRfbGVuLCAwNjQ0LAkJZG9mZl91OCksCiAJV0lMX0ZJRUxEKHdha2V1cF90cmlnZ2VyLCAwNjQ0LAkJZG9mZl91OCksCisJV0lMX0ZJRUxEKHZyaW5nX2lkbGVfdHJzaCwgMDY0NCwJZG9mZl91MzIpLAogCXt9LAogfTsKIApAQCAtMTc3MCwxMiArMTg0NCwxNyBAQAogCXsiZGVzY19pbmRleCIsCTA2NDQsICh1bG9uZykmZGJnX3R4ZGVzY19pbmRleCwgZG9mZl91MzJ9LAogCXsidnJpbmdfaW5kZXgiLAkwNjQ0LCAodWxvbmcpJmRiZ192cmluZ19pbmRleCwgZG9mZl91MzJ9LAogCXsibWVtX2FkZHIiLAkwNjQ0LCAodWxvbmcpJm1lbV9hZGRyLCBkb2ZmX3UzMn0sCi0JeyJ2cmluZ19pZGxlX3Ryc2giLCAwNjQ0LCAodWxvbmcpJnZyaW5nX2lkbGVfdHJzaCwKLQkgZG9mZl91MzJ9LAogCXsibGVkX3BvbGFyaXR5IiwgMDY0NCwgKHVsb25nKSZsZWRfcG9sYXJpdHksIGRvZmZfdTh9LAogCXt9LAogfTsKIAorc3RhdGljIGNvbnN0IGludCBkYmdfb2ZmX2NvdW50ID0gNCAqIChBUlJBWV9TSVpFKGlzcl9vZmYpIC0gMSkgKworCQkJCUFSUkFZX1NJWkUoZGJnX3dpbF9yZWdzKSAtIDEgKworCQkJCUFSUkFZX1NJWkUocHNldWRvX2lzcl9vZmYpIC0gMSArCisJCQkJQVJSQVlfU0laRShsZ2NfaXRyX2NudF9vZmYpIC0gMSArCisJCQkJQVJSQVlfU0laRSh0eF9pdHJfY250X29mZikgLSAxICsKKwkJCQlBUlJBWV9TSVpFKHJ4X2l0cl9jbnRfb2ZmKSAtIDE7CisKIGludCB3aWw2MjEwX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCiB7CiAJc3RydWN0IGRlbnRyeSAqZGJnID0gd2lsLT5kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2RpcihXSUxfTkFNRSwKQEAgLTE3ODQsNiArMTg2MywxNyBAQAogCWlmIChJU19FUlJfT1JfTlVMTChkYmcpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXdpbC0+ZGJnX2RhdGEuZGF0YV9hcnIgPSBrY2FsbG9jKGRiZ19vZmZfY291bnQsCisJCQkJCSBzaXplb2Yoc3RydWN0IHdpbF9kZWJ1Z2ZzX2lvbWVtX2RhdGEpLAorCQkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCF3aWwtPmRiZ19kYXRhLmRhdGFfYXJyKSB7CisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkYmcpOworCQl3aWwtPmRlYnVnID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2lsLT5kYmdfZGF0YS5pb21lbV9kYXRhX2NvdW50ID0gMDsKKwogCXdpbF9wbWNfaW5pdCh3aWwpOwogCiAJd2lsNjIxMF9kZWJ1Z2ZzX2luaXRfZmlsZXMod2lsLCBkYmcpOwpAQCAtMTc5OCw2ICsxODg4LDggQEAKIAogCXdpbDYyMTBfZGVidWdmc19jcmVhdGVfSVRSX0NOVCh3aWwsIGRiZyk7CiAKKwl3aWwtPnN1c3BlbmRfc3RhdHMuY29sbGVjdGlvbl9zdGFydCA9IGt0aW1lX2dldCgpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MDYsNiArMTg5OCw4IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHdpbC0+ZGVidWcpOwogCXdpbC0+ZGVidWcgPSBOVUxMOwogCisJa2ZyZWUod2lsLT5kYmdfZGF0YS5kYXRhX2Fycik7CisKIAkvKiBmcmVlIHBtYyBtZW1vcnkgd2l0aG91dCBzZW5kaW5nIGNvbW1hbmQgdG8gZncsIGFzIGl0IHdpbGwKIAkgKiBiZSByZXNldCBvbiB0aGUgd2F5IGRvd24gYW55d2F5CiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9ldGh0b29sLmMKaW5kZXggYWRjZmVmNC4uNjYyMDBmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2V0aHRvb2wuYwpAQCAtNDcsOSArNDcsMTQgQEAKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBuZGV2X3RvX3dpbChuZGV2KTsKIAl1MzIgdHhfaXRyX2VuLCB0eF9pdHJfdmFsID0gMDsKIAl1MzIgcnhfaXRyX2VuLCByeF9pdHJfdmFsID0gMDsKKwlpbnQgcmV0OwogCiAJd2lsX2RiZ19taXNjKHdpbCwgImV0aHRvb2xvcHNfZ2V0X2NvYWxlc2NlXG4iKTsKIAorCXJldCA9IHdpbF9wbV9ydW50aW1lX2dldCh3aWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJdHhfaXRyX2VuID0gd2lsX3Iod2lsLCBSR0ZfRE1BX0lUUl9UWF9DTlRfQ1RMKTsKIAlpZiAodHhfaXRyX2VuICYgQklUX0RNQV9JVFJfVFhfQ05UX0NUTF9FTikKIAkJdHhfaXRyX3ZhbCA9IHdpbF9yKHdpbCwgUkdGX0RNQV9JVFJfVFhfQ05UX1RSU0gpOwpAQCAtNTgsNiArNjMsOCBAQAogCWlmIChyeF9pdHJfZW4gJiBCSVRfRE1BX0lUUl9SWF9DTlRfQ1RMX0VOKQogCQlyeF9pdHJfdmFsID0gd2lsX3Iod2lsLCBSR0ZfRE1BX0lUUl9SWF9DTlRfVFJTSCk7CiAKKwl3aWxfcG1fcnVudGltZV9wdXQod2lsKTsKKwogCWNwLT50eF9jb2FsZXNjZV91c2VjcyA9IHR4X2l0cl92YWw7CiAJY3AtPnJ4X2NvYWxlc2NlX3VzZWNzID0gcnhfaXRyX3ZhbDsKIAlyZXR1cm4gMDsKQEAgLTY3LDYgKzc0LDcgQEAKIAkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNwKQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IG5kZXZfdG9fd2lsKG5kZXYpOworCWludCByZXQ7CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAiZXRodG9vbG9wc19zZXRfY29hbGVzY2U6IHJ4ICVkIHVzZWMsIHR4ICVkIHVzZWNcbiIsCiAJCSAgICAgY3AtPnJ4X2NvYWxlc2NlX3VzZWNzLCBjcC0+dHhfY29hbGVzY2VfdXNlY3MpOwpAQCAtODYsOCArOTQsMTUgQEAKIAogCXdpbC0+dHhfbWF4X2J1cnN0X2R1cmF0aW9uID0gY3AtPnR4X2NvYWxlc2NlX3VzZWNzOwogCXdpbC0+cnhfbWF4X2J1cnN0X2R1cmF0aW9uID0gY3AtPnJ4X2NvYWxlc2NlX3VzZWNzOworCisJcmV0ID0gd2lsX3BtX3J1bnRpbWVfZ2V0KHdpbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAl3aWxfY29uZmlndXJlX2ludGVycnVwdF9tb2RlcmF0aW9uKHdpbCk7CiAKKwl3aWxfcG1fcnVudGltZV9wdXQod2lsKTsKKwogCXJldHVybiAwOwogCiBvdXRfYmFkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZnRtLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdG0uYwppbmRleCBmOTRjODk0Li42ZGU4ZTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdG0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdG0uYwpAQCAtNjgzLDYgKzY4MywxMCBAQAogCWludCBkYXRhX2xlbiA9IGxlbiAtIG9mZnNldG9mKHN0cnVjdCB3bWlfYW9hX21lYXNfZXZlbnQsIG1lYXNfZGF0YSk7CiAJc3RydWN0IHdpbF9hb2FfbWVhc19yZXN1bHQgKnJlczsKIAorCWlmIChkYXRhX2xlbiA8IDApIHsKKwkJd2lsX2Vycih3aWwsICJBT0EgZXZlbnQgdG9vIHNob3J0ICglZClcbiIsIGxlbik7CisJCXJldHVybjsKKwl9CiAJZGF0YV9sZW4gPSBtaW5fdChpbnQsIGxlMTZfdG9fY3B1KGV2dC0+bGVuZ3RoKSwgZGF0YV9sZW4pOwogCiAJcmVzID0ga21hbGxvYyhzaXplb2YoKnJlcykgKyBkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9md19pbmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCmluZGV4IGUwMWFjYWMuLjdhMzM3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCkBAIC0xMjQsMjQgKzEyNCwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZ3X2hhbmRsZV9jb21tZW50KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgICAgc2l6ZV90IHNpemUpCi17Ci0Jd2lsX2hleF9kdW1wX2Z3KCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBkYXRhLCBzaXplLCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50Ci1md19oYW5kbGVfY2FwYWJpbGl0aWVzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKLQkJICAgICAgIHNpemVfdCBzaXplKQorZndfaGFuZGxlX2NvbW1lbnQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkgIHNpemVfdCBzaXplKQogewogCWNvbnN0IHN0cnVjdCB3aWxfZndfcmVjb3JkX2NhcGFiaWxpdGllcyAqcmVjID0gZGF0YTsKIAlzaXplX3QgY2FwYV9zaXplOwogCiAJaWYgKHNpemUgPCBzaXplb2YoKnJlYykgfHwKLQkgICAgbGUzMl90b19jcHUocmVjLT5tYWdpYykgIT0gV0lMX0ZXX0NBUEFCSUxJVElFU19NQUdJQykKKwkgICAgbGUzMl90b19jcHUocmVjLT5tYWdpYykgIT0gV0lMX0ZXX0NBUEFCSUxJVElFU19NQUdJQykgeworCQl3aWxfaGV4X2R1bXBfZncoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsCisJCQkJZGF0YSwgc2l6ZSwgdHJ1ZSk7CiAJCXJldHVybiAwOworCX0KIAogCWNhcGFfc2l6ZSA9IHNpemUgLSBvZmZzZXRvZihzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9jYXBhYmlsaXRpZXMsCiAJCQkJICAgIGNhcGFiaWxpdGllcyk7CkBAIC00MjIsNyArNDE3LDcgQEAKIAlpbnQgKCpwYXJzZV9oYW5kbGVyKShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgICAgIHNpemVfdCBzaXplKTsKIH0gd2lsX2Z3X2hhbmRsZXJzW10gPSB7Ci0Je3dpbF9md190eXBlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50LCBmd19oYW5kbGVfY2FwYWJpbGl0aWVzfSwKKwl7d2lsX2Z3X3R5cGVfY29tbWVudCwgZndfaGFuZGxlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50fSwKIAl7d2lsX2Z3X3R5cGVfZGF0YSwgZndfaGFuZGxlX2RhdGEsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKIAl7d2lsX2Z3X3R5cGVfZmlsbCwgZndfaGFuZGxlX2ZpbGwsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKIAkvKiB3aWxfZndfdHlwZV9hY3Rpb24gKi8KQEAgLTUxNyw3ICs1MTIsNyBAQAogCiAJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgd2lsX3RvX2Rldih3aWwpKTsKIAlpZiAocmMpIHsKLQkJd2lsX2Vycl9mdyh3aWwsICJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwgbmFtZSk7CisJCXdpbF9lcnJfZncod2lsLCAiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXMgcmMgJWRcbiIsIG5hbWUsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAl3aWxfZGJnX2Z3KHdpbCwgIkxvYWRpbmcgPCVzPiwgJXp1IGJ5dGVzXG4iLCBuYW1lLCBmdy0+c2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCmluZGV4IGNhZDhhOTVjNC4uNTlkZWY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCXdpbF9kYmdfaXJxKHdpbCwgIklTUiBSWCAweCUwOHhcbiIsIGlzcik7CiAKIAlpZiAodW5saWtlbHkoIWlzcikpIHsKLQkJd2lsX2Vycih3aWwsICJzcHVyaW91cyBJUlE6IFJYXG4iKTsKKwkJd2lsX2Vycl9yYXRlbGltaXRlZCh3aWwsICJzcHVyaW91cyBJUlE6IFJYXG4iKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMjY5LDExICsyNjksMTIgQEAKIAkJCQluZWVkX3VubWFzayA9IGZhbHNlOwogCQkJCW5hcGlfc2NoZWR1bGUoJndpbC0+bmFwaV9yeCk7CiAJCQl9IGVsc2UgewotCQkJCXdpbF9lcnIod2lsLAorCQkJCXdpbF9lcnJfcmF0ZWxpbWl0ZWQoCisJCQkJCXdpbCwKIAkJCQkJIkdvdCBSeCBpbnRlcnJ1cHQgd2hpbGUgc3RvcHBpbmcgaW50ZXJmYWNlXG4iKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXdpbF9lcnIod2lsLCAiR290IFJ4IGludGVycnVwdCB3aGlsZSBpbiByZXNldFxuIik7CisJCQl3aWxfZXJyX3JhdGVsaW1pdGVkKHdpbCwgIkdvdCBSeCBpbnRlcnJ1cHQgd2hpbGUgaW4gcmVzZXRcbiIpOwogCQl9CiAJfQogCkBAIC0zMDIsNyArMzAzLDcgQEAKIAl3aWxfZGJnX2lycSh3aWwsICJJU1IgVFggMHglMDh4XG4iLCBpc3IpOwogCiAJaWYgKHVubGlrZWx5KCFpc3IpKSB7Ci0JCXdpbF9lcnIod2lsLCAic3B1cmlvdXMgSVJROiBUWFxuIik7CisJCXdpbF9lcnJfcmF0ZWxpbWl0ZWQod2lsLCAic3B1cmlvdXMgSVJROiBUWFxuIik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTMxOCwxMiArMzE5LDEzIEBACiAJCQluZWVkX3VubWFzayA9IGZhbHNlOwogCQkJbmFwaV9zY2hlZHVsZSgmd2lsLT5uYXBpX3R4KTsKIAkJfSBlbHNlIHsKLQkJCXdpbF9lcnIod2lsLCAiR290IFR4IGludGVycnVwdCB3aGlsZSBpbiByZXNldFxuIik7CisJCQl3aWxfZXJyX3JhdGVsaW1pdGVkKHdpbCwgIkdvdCBUeCBpbnRlcnJ1cHQgd2hpbGUgaW4gcmVzZXRcbiIpOwogCQl9CiAJfQogCiAJaWYgKHVubGlrZWx5KGlzcikpCi0JCXdpbF9lcnIod2lsLCAidW4taGFuZGxlZCBUWCBJU1IgYml0cyAweCUwOHhcbiIsIGlzcik7CisJCXdpbF9lcnJfcmF0ZWxpbWl0ZWQod2lsLCAidW4taGFuZGxlZCBUWCBJU1IgYml0cyAweCUwOHhcbiIsCisJCQkJICAgIGlzcik7CiAKIAkvKiBUeCBJUlEgd2lsbCBiZSBlbmFibGVkIHdoZW4gTkFQSSBwcm9jZXNzaW5nIGZpbmlzaGVkICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pb2N0bC5jCmluZGV4IGY4ZDJjMjAuLjI1YmM0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW9jdGwuYwpAQCAtMjIxLDYgKzIyMSwxMCBAQAogewogCWludCByZXQ7CiAKKwlyZXQgPSB3aWxfcG1fcnVudGltZV9nZXQod2lsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBXSUxfSU9DVExfTUVNSU86CiAJCXJldCA9IHdpbF9pb2NfbWVtaW9fZHdvcmQod2lsLCBkYXRhKTsKQEAgLTIzMyw5ICsyMzcsMTIgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJd2lsX2RiZ19pb2N0bCh3aWwsICJVbnN1cHBvcnRlZCBJT0NUTCAweCUwNHhcbiIsIGNtZCk7CisJCXdpbF9wbV9ydW50aW1lX3B1dCh3aWwpOwogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIAorCXdpbF9wbV9ydW50aW1lX3B1dCh3aWwpOworCiAJd2lsX2RiZ19pb2N0bCh3aWwsICJpb2N0bCgweCUwNHgpIC0+ICVkXG4iLCBjbWQsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYwppbmRleCBhZmY4YjFiLi5jNGZhYTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCkBAIC0zOTUsMTAgKzM5NSwxMSBAQAogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2lsNjIxMF9wcml2LAogCQkJCQkJZndfZXJyb3Jfd29ya2VyKTsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsLT53ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gd2lsX3RvX25kZXYod2lsKTsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICJmdyBlcnJvciB3b3JrZXJcbiIpOwogCi0JaWYgKCFuZXRpZl9ydW5uaW5nKHdpbF90b19uZGV2KHdpbCkpKSB7CisJaWYgKCEobmRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CiAJCXdpbF9pbmZvKHdpbCwgIk5vIHJlY292ZXJ5IC0gaW50ZXJmYWNlIGlzIGRvd25cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtNTgxLDYgKzU4Miw5IEBACiAKIAl3aWwtPndha2V1cF90cmlnZ2VyID0gV01JX1dBS0VVUF9UUklHR0VSX1VDQVNUIHwKIAkJCSAgICAgIFdNSV9XQUtFVVBfVFJJR0dFUl9CQ0FTVDsKKwltZW1zZXQoJndpbC0+c3VzcGVuZF9zdGF0cywgMCwgc2l6ZW9mKHdpbC0+c3VzcGVuZF9zdGF0cykpOworCXdpbC0+c3VzcGVuZF9zdGF0cy5taW5fc3VzcGVuZF90aW1lID0gVUxPTkdfTUFYOworCXdpbC0+dnJpbmdfaWRsZV90cnNoID0gMTY7CiAKIAlyZXR1cm4gMDsKIApAQCAtNzYxLDYgKzc2NSw4IEBACiAJdTggcmV0cnlfc2hvcnQ7CiAJaW50IHJjOwogCisJd2lsX3JlZnJlc2hfZndfY2FwYWJpbGl0aWVzKHdpbCk7CisKIAlyYyA9IHdtaV9nZXRfbWdtdF9yZXRyeSh3aWwsICZyZXRyeV9zaG9ydCk7CiAJaWYgKCFyYykgewogCQl3aXBoeS0+cmV0cnlfc2hvcnQgPSByZXRyeV9zaG9ydDsKQEAgLTc2OCw2ICs3NzQsMjUgQEAKIAl9CiB9CiAKK3ZvaWQgd2lsX3JlZnJlc2hfZndfY2FwYWJpbGl0aWVzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2lsX3RvX3dpcGh5KHdpbCk7CisKKwl3aWwtPmtlZXBfcmFkaW9fb25fZHVyaW5nX3NsZWVwID0KKwkJd2lsLT5wbGF0Zm9ybV9vcHMua2VlcF9yYWRpb19vbl9kdXJpbmdfc2xlZXAgJiYKKwkJd2lsLT5wbGF0Zm9ybV9vcHMua2VlcF9yYWRpb19vbl9kdXJpbmdfc2xlZXAoCisJCQl3aWwtPnBsYXRmb3JtX2hhbmRsZSkgJiYKKwkJdGVzdF9iaXQoV01JX0ZXX0NBUEFCSUxJVFlfRDNfU1VTUEVORCwgd2lsLT5md19jYXBhYmlsaXRpZXMpOworCisJd2lsX2luZm8od2lsLCAia2VlcF9yYWRpb19vbl9kdXJpbmdfc2xlZXAgKCVkKVxuIiwKKwkJIHdpbC0+a2VlcF9yYWRpb19vbl9kdXJpbmdfc2xlZXApOworCisJaWYgKHRlc3RfYml0KFdNSV9GV19DQVBBQklMSVRZX1JTU0lfUkVQT1JUSU5HLCB3aWwtPmZ3X2NhcGFiaWxpdGllcykpCisJCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKKwllbHNlCisJCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX1VOU1BFQzsKK30KKwogdm9pZCB3aWxfbWJveF9yaW5nX2xlMmNwdXMoc3RydWN0IHdpbDYyMTBfbWJveF9yaW5nICpyKQogewogCWxlMzJfdG9fY3B1cygmci0+YmFzZSk7CkBAIC05MzAsNiArOTU1LDI5IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgdm9pZCB3aWxfcHJlX2Z3X2NvbmZpZyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCit7CisJLyogTWFyayBGVyBhcyBsb2FkZWQgZnJvbSBob3N0ICovCisJd2lsX3Mod2lsLCBSR0ZfVVNFUl9VU0FHRV82LCAxKTsKKworCS8qIGNsZWFyIGFueSBpbnRlcnJ1cHRzIHdoaWNoIG9uLWNhcmQtZmlybXdhcmUKKwkgKiBtYXkgaGF2ZSBzZXQKKwkgKi8KKwl3aWw2MjEwX2NsZWFyX2lycSh3aWwpOworCS8qIENBRl9JQ1IgLSBjbGVhciBhbmQgbWFzayAqLworCS8qIGl0IGlzIFcxQywgY2xlYXIgYnkgd3JpdGluZyBiYWNrIHNhbWUgdmFsdWUgKi8KKwl3aWxfcyh3aWwsIFJHRl9DQUZfSUNSICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUiksIDApOworCXdpbF93KHdpbCwgUkdGX0NBRl9JQ1IgKyBvZmZzZXRvZihzdHJ1Y3QgUkdGX0lDUiwgSU1WKSwgfjApOworCS8qIGNsZWFyIFBBTF9VTklUX0lDUiAocG90ZW50aWFsIEQwLT5EMyBsZWZ0b3ZlcikgKi8KKwl3aWxfcyh3aWwsIFJHRl9QQUxfVU5JVF9JQ1IgKyBvZmZzZXRvZihzdHJ1Y3QgUkdGX0lDUiwgSUNSKSwgMCk7CisKKwlpZiAod2lsLT5md19jYWxpYl9yZXN1bHQgPiAwKSB7CisJCV9fbGUzMiB2YWwgPSBjcHVfdG9fbGUzMih3aWwtPmZ3X2NhbGliX3Jlc3VsdCB8CisJCQkJCQkoQ0FMSUJfUkVTVUxUX1NJR05BVFVSRSA8PCA4KSk7CisJCXdpbF93KHdpbCwgUkdGX1VTRVJfRldfQ0FMSUJfUkVTVUxULCAodTMyIF9fZm9yY2UpdmFsKTsKKwl9Cit9CisKIC8qCiAgKiBXZSByZXNldCBhbGwgdGhlIHN0cnVjdHVyZXMsIGFuZCB3ZSByZXNldCB0aGUgVU1BQy4KICAqIEFmdGVyIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB5b3UncmUgZXhwZWN0ZWQgdG8gcmVsb2FkCkBAIC0xMDI3LDE4ICsxMDc1LDcgQEAKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCi0JCS8qIE1hcmsgRlcgYXMgbG9hZGVkIGZyb20gaG9zdCAqLwotCQl3aWxfcyh3aWwsIFJHRl9VU0VSX1VTQUdFXzYsIDEpOwotCi0JCS8qIGNsZWFyIGFueSBpbnRlcnJ1cHRzIHdoaWNoIG9uLWNhcmQtZmlybXdhcmUKLQkJICogbWF5IGhhdmUgc2V0Ci0JCSAqLwotCQl3aWw2MjEwX2NsZWFyX2lycSh3aWwpOwotCQkvKiBDQUZfSUNSIC0gY2xlYXIgYW5kIG1hc2sgKi8KLQkJLyogaXQgaXMgVzFDLCBjbGVhciBieSB3cml0aW5nIGJhY2sgc2FtZSB2YWx1ZSAqLwotCQl3aWxfcyh3aWwsIFJHRl9DQUZfSUNSICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUiksIDApOwotCQl3aWxfdyh3aWwsIFJHRl9DQUZfSUNSICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElNViksIH4wKTsKLQorCQl3aWxfcHJlX2Z3X2NvbmZpZyh3aWwpOwogCQl3aWxfcmVsZWFzZV9jcHUod2lsKTsKIAl9CiAKQEAgLTEwNjQsMTQgKzExMDEsMTQgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCisJCXdpbF9jb2xsZWN0X2Z3X2luZm8od2lsKTsKKwogCQlpZiAod2lsLT5wc19wcm9maWxlICE9IFdNSV9QU19QUk9GSUxFX1RZUEVfREVGQVVMVCkKIAkJCXdpbF9wc191cGRhdGUod2lsLCB3aWwtPnBzX3Byb2ZpbGUpOwogCiAJCWlmICh3aWwtPnR0X2RhdGFfc2V0KQogCQkJd21pX3NldF90dF9jZmcod2lsLCAmd2lsLT50dF9kYXRhKTsKIAotCQl3aWxfY29sbGVjdF9md19pbmZvKHdpbCk7Ci0KIAkJaWYgKHdpbC0+cGxhdGZvcm1fb3BzLm5vdGlmeSkgewogCQkJcmMgPSB3aWwtPnBsYXRmb3JtX29wcy5ub3RpZnkod2lsLT5wbGF0Zm9ybV9oYW5kbGUsCiAJCQkJCQkgICAgICBXSUxfUExBVEZPUk1fRVZUX0ZXX1JEWSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCmluZGV4IGQ4MGU3ZjQuLjQwY2QzMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCkBAIC0yNiw2ICsyNiw3IEBACiBzdGF0aWMgaW50IHdpbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IG5kZXZfdG9fd2lsKG5kZXYpOworCWludCByYzsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICJvcGVuXG4iKTsKIApAQCAtMzUsMTYgKzM2LDI5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiB3aWxfdXAod2lsKTsKKwlyYyA9IHdpbF9wbV9ydW50aW1lX2dldCh3aWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0gd2lsX3VwKHdpbCk7CisJaWYgKHJjKQorCQl3aWxfcG1fcnVudGltZV9wdXQod2lsKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCB3aWxfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBuZGV2X3RvX3dpbChuZGV2KTsKKwlpbnQgcmM7CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAic3RvcFxuIik7CiAKLQlyZXR1cm4gd2lsX2Rvd24od2lsKTsKKwlyYyA9IHdpbF9kb3duKHdpbCk7CisJaWYgKCFyYykKKwkJd2lsX3BtX3J1bnRpbWVfcHV0KHdpbCk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgd2lsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBuZXdfbXR1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKaW5kZXggY2YzZmFkYy4uNjYzZTE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgIndpbDYyMTAuaCIKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKIHN0YXRpYyBib29sIHVzZV9tc2kgPSB0cnVlOwogbW9kdWxlX3BhcmFtKHVzZV9tc2ksIGJvb2wsIDA0NDQpOwpAQCAtODQsNiArODUsNyBAQAogCiAJLyogZXh0cmFjdCBGVyBjYXBhYmlsaXRpZXMgZnJvbSBmaWxlIHdpdGhvdXQgbG9hZGluZyB0aGUgRlcgKi8KIAl3aWxfcmVxdWVzdF9maXJtd2FyZSh3aWwsIHdpbC0+d2lsX2Z3X25hbWUsIGZhbHNlKTsKKwl3aWxfcmVmcmVzaF9md19jYXBhYmlsaXRpZXMod2lsKTsKIH0KIAogdm9pZCB3aWxfZGlzYWJsZV9pcnEoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQpAQCAtMjg2LDE1ICsyODgsNiBAQAogCXdpbF9zZXRfY2FwYWJpbGl0aWVzKHdpbCk7CiAJd2lsNjIxMF9jbGVhcl9pcnEod2lsKTsKIAotCXdpbC0+a2VlcF9yYWRpb19vbl9kdXJpbmdfc2xlZXAgPQotCQl3aWwtPnBsYXRmb3JtX29wcy5rZWVwX3JhZGlvX29uX2R1cmluZ19zbGVlcCAmJgotCQl3aWwtPnBsYXRmb3JtX29wcy5rZWVwX3JhZGlvX29uX2R1cmluZ19zbGVlcCgKLQkJCXdpbC0+cGxhdGZvcm1faGFuZGxlKSAmJgotCQl0ZXN0X2JpdChXTUlfRldfQ0FQQUJJTElUWV9EM19TVVNQRU5ELCB3aWwtPmZ3X2NhcGFiaWxpdGllcyk7Ci0KLQl3aWxfaW5mbyh3aWwsICJrZWVwX3JhZGlvX29uX2R1cmluZ19zbGVlcCAoJWQpXG4iLAotCQkgd2lsLT5rZWVwX3JhZGlvX29uX2R1cmluZ19zbGVlcCk7Ci0KIAkvKiBGVyBzaG91bGQgcmFpc2UgSVJRIHdoZW4gcmVhZHkgKi8KIAlyYyA9IHdpbF9pZl9wY2llX2VuYWJsZSh3aWwpOwogCWlmIChyYykgewpAQCAtMzI0LDYgKzMxNyw4IEBACiAJd2lsNjIxMF9kZWJ1Z2ZzX2luaXQod2lsKTsKIAl3aWw2MjEwX3N5c2ZzX2luaXQod2lsKTsKIAorCXdpbF9wbV9ydW50aW1lX2FsbG93KHdpbCk7CisKIAlyZXR1cm4gMDsKIAogYnVzX2Rpc2FibGU6CkBAIC0zNTYsNiArMzUxLDggQEAKICNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAorCXdpbF9wbV9ydW50aW1lX2ZvcmJpZCh3aWwpOworCiAJd2lsNjIxMF9zeXNmc19yZW1vdmUod2lsKTsKIAl3aWw2MjEwX2RlYnVnZnNfcmVtb3ZlKHdpbCk7CiAJcnRubF9sb2NrKCk7CkBAIC00ODUsMTAgKzQ4Miw0MCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCitzdGF0aWMgaW50IHdpbDYyMTBfcG1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwl3aWxfZGJnX3BtKHdpbCwgIlJ1bnRpbWUgaWRsZVxuIik7CisKKwlyZXR1cm4gd2lsX2Nhbl9zdXNwZW5kKHdpbCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd2lsNjIxMF9wbV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHdpbDYyMTBfcmVzdW1lKGRldiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd2lsNjIxMF9wbV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICh0ZXN0X2JpdCh3aWxfc3RhdHVzX3N1c3BlbmRlZCwgd2lsLT5zdGF0dXMpKSB7CisJCXdpbF9kYmdfcG0od2lsLCAidHJ5aW5nIHRvIHN1c3BlbmQgd2hpbGUgc3VzcGVuZGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIHdpbDYyMTBfc3VzcGVuZChkZXYsIHRydWUpOworfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd2lsNjIxMF9wbV9vcHMgPSB7CiAJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMod2lsNjIxMF9wbV9zdXNwZW5kLCB3aWw2MjEwX3BtX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMod2lsNjIxMF9wbV9ydW50aW1lX3N1c3BlbmQsCisJCQkgICB3aWw2MjEwX3BtX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgd2lsNjIxMF9wbV9ydW50aW1lX2lkbGUpCiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgd2lsNjIxMF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcG0uYwppbmRleCBjZTFmMzg0Li4yZWYyZjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BtLmMKQEAgLTE2LDE1ICsxNiwyNyBAQAogCiAjaW5jbHVkZSAid2lsNjIxMC5oIgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNkZWZpbmUgV0lMNjIxMF9BVVRPU1VTUEVORF9ERUxBWV9NUyAoMTAwMCkKIAogaW50IHdpbF9jYW5fc3VzcGVuZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSkKIHsKIAlpbnQgcmMgPSAwOwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3aWxfdG9fbmRldih3aWwpOworCWJvb2wgd21pX29ubHkgPSB0ZXN0X2JpdChXTUlfRldfQ0FQQUJJTElUWV9XTUlfT05MWSwKKwkJCQkgd2lsLT5md19jYXBhYmlsaXRpZXMpOwogCiAJd2lsX2RiZ19wbSh3aWwsICJjYW5fc3VzcGVuZDogJXNcbiIsIGlzX3J1bnRpbWUgPyAicnVudGltZSIgOiAic3lzdGVtIik7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcod2lsX3RvX25kZXYod2lsKSkpIHsKKwlpZiAod21pX29ubHkgfHwgZGVidWdfZncpIHsKKwkJd2lsX2RiZ19wbSh3aWwsICJEZW55IGFueSBzdXNwZW5kIC0gJXMgbW9kZVxuIiwKKwkJCSAgIHdtaV9vbmx5ID8gIndtaV9vbmx5IiA6ICJkZWJ1Z19mdyIpOworCQlyYyA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghKG5kZXYtPmZsYWdzICYgSUZGX1VQKSkgewogCQkvKiBjYW4gYWx3YXlzIHNsZWVwIHdoZW4gZG93biAqLwogCQl3aWxfZGJnX3BtKHdpbCwgIkludGVyZmFjZSBpcyBkb3duXG4iKTsKIAkJZ290byBvdXQ7CkBAIC00Myw2ICs1NSwxMCBAQAogCS8qIGludGVyZmFjZSBpcyBydW5uaW5nICovCiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJCXdpbF9kYmdfcG0od2lsLCAiU25pZmZlclxuIik7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwkvKiBmb3IgU1RBLWxpa2UgaW50ZXJmYWNlLCBkb24ndCBydW50aW1lIHN1c3BlbmQgKi8KIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgogCQlpZiAodGVzdF9iaXQod2lsX3N0YXR1c19md2Nvbm5lY3RpbmcsIHdpbC0+c3RhdHVzKSkgewpAQCAtNTAsNiArNjYsMTIgQEAKIAkJCXJjID0gLUVCVVNZOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJLyogUnVudGltZSBwbSBub3Qgc3VwcG9ydGVkIGluIGNhc2UgdGhlIGludGVyZmFjZSBpcyB1cCAqLworCQlpZiAoaXNfcnVudGltZSkgeworCQkJd2lsX2RiZ19wbSh3aWwsICJTVEEtbGlrZSBpbnRlcmZhY2VcbiIpOworCQkJcmMgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQogCQlicmVhazsKIAkvKiBBUC1saWtlIGludGVyZmFjZSAtIGNhbid0IHN1c3BlbmQgKi8KIAlkZWZhdWx0OgpAQCAtODUsNyArMTA3LDkgQEAKIAkvKiBTZW5kIFdNSSByZXN1bWUgcmVxdWVzdCB0byB0aGUgZGV2aWNlICovCiAJcmMgPSB3bWlfcmVzdW1lKHdpbCk7CiAJaWYgKHJjKSB7Ci0JCXdpbF9lcnIod2lsLCAiZGV2aWNlIGZhaWxlZCB0byByZXN1bWUgKCVkKSwgcmVzZXR0aW5nXG4iLCByYyk7CisJCXdpbF9lcnIod2lsLCAiZGV2aWNlIGZhaWxlZCB0byByZXN1bWUgKCVkKVxuIiwgcmMpOworCQlpZiAobm9fZndfcmVjb3ZlcnkpCisJCQlnb3RvIG91dDsKIAkJcmMgPSB3aWxfZG93bih3aWwpOwogCQlpZiAocmMpIHsKIAkJCXdpbF9lcnIod2lsLCAid2lsX2Rvd24gZmFpbGVkICglZClcbiIsIHJjKTsKQEAgLTI5OCw2ICszMjIsOSBAQAogCXdpbF9kYmdfcG0od2lsLCAic3VzcGVuZDogJXMgPT4gJWRcbiIsCiAJCSAgIGlzX3J1bnRpbWUgPyAicnVudGltZSIgOiAic3lzdGVtIiwgcmMpOwogCisJaWYgKCFyYykKKwkJd2lsLT5zdXNwZW5kX3N0YXRzLnN1c3BlbmRfc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMDcsNiArMzM0LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CiAJYm9vbCBrZWVwX3JhZGlvX29uID0gbmRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYKIAkJCSAgICAgd2lsLT5rZWVwX3JhZGlvX29uX2R1cmluZ19zbGVlcDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3VzcGVuZF90aW1lX3VzZWMgPSAwOwogCiAJd2lsX2RiZ19wbSh3aWwsICJyZXN1bWU6ICVzXG4iLCBpc19ydW50aW1lID8gInJ1bnRpbWUiIDogInN5c3RlbSIpOwogCkBAIC0zMjQsOCArMzUyLDYxIEBACiAJZWxzZQogCQlyYyA9IHdpbF9yZXN1bWVfcmFkaW9fb2ZmKHdpbCk7CiAKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJc3VzcGVuZF90aW1lX3VzZWMgPQorCQlrdGltZV90b191cyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksCisJCQkJICAgICAgd2lsLT5zdXNwZW5kX3N0YXRzLnN1c3BlbmRfc3RhcnRfdGltZSkpOworCXdpbC0+c3VzcGVuZF9zdGF0cy50b3RhbF9zdXNwZW5kX3RpbWUgKz0gc3VzcGVuZF90aW1lX3VzZWM7CisJaWYgKHN1c3BlbmRfdGltZV91c2VjIDwgd2lsLT5zdXNwZW5kX3N0YXRzLm1pbl9zdXNwZW5kX3RpbWUpCisJCXdpbC0+c3VzcGVuZF9zdGF0cy5taW5fc3VzcGVuZF90aW1lID0gc3VzcGVuZF90aW1lX3VzZWM7CisJaWYgKHN1c3BlbmRfdGltZV91c2VjID4gd2lsLT5zdXNwZW5kX3N0YXRzLm1heF9zdXNwZW5kX3RpbWUpCisJCXdpbC0+c3VzcGVuZF9zdGF0cy5tYXhfc3VzcGVuZF90aW1lID0gc3VzcGVuZF90aW1lX3VzZWM7CisKIG91dDoKLQl3aWxfZGJnX3BtKHdpbCwgInJlc3VtZTogJXMgPT4gJWRcbiIsCi0JCSAgIGlzX3J1bnRpbWUgPyAicnVudGltZSIgOiAic3lzdGVtIiwgcmMpOworCXdpbF9kYmdfcG0od2lsLCAicmVzdW1lOiAlcyA9PiAlZCwgc3VzcGVuZCB0aW1lICVsbGQgdXNlY1xuIiwKKwkJICAgaXNfcnVudGltZSA/ICJydW50aW1lIiA6ICJzeXN0ZW0iLCByYywgc3VzcGVuZF90aW1lX3VzZWMpOwogCXJldHVybiByYzsKIH0KKwordm9pZCB3aWxfcG1fcnVudGltZV9hbGxvdyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2lsX3RvX2Rldih3aWwpOworCisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBXSUw2MjEwX0FVVE9TVVNQRU5EX0RFTEFZX01TKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfYWxsb3coZGV2KTsKK30KKwordm9pZCB3aWxfcG1fcnVudGltZV9mb3JiaWQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbF90b19kZXYod2lsKTsKKworCXBtX3J1bnRpbWVfZm9yYmlkKGRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKK30KKworaW50IHdpbF9wbV9ydW50aW1lX2dldChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCit7CisJaW50IHJjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbF90b19kZXYod2lsKTsKKworCXJjID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyYyA8IDApIHsKKwkJd2lsX2Vycih3aWwsICJwbV9ydW50aW1lX2dldF9zeW5jKCkgZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd2lsX3BtX3J1bnRpbWVfcHV0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aWxfdG9fZGV2KHdpbCk7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwppbmRleCA4ZjFlNzliNC4uOGZlMjIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwpAQCAtMTY2Niw3ICsxNjY2LDcgQEAKIAogCS8qIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KIAl1c2VkID0gd2lsX3ZyaW5nX3VzZWRfdHgodnJpbmcpOwotCWlmICh3aWxfdmFsX2luX3JhbmdlKHZyaW5nX2lkbGVfdHJzaCwKKwlpZiAod2lsX3ZhbF9pbl9yYW5nZSh3aWwtPnZyaW5nX2lkbGVfdHJzaCwKIAkJCSAgICAgdXNlZCwgdXNlZCArIGRlc2NzX3VzZWQpKSB7CiAJCXR4ZGF0YS0+aWRsZSArPSBnZXRfY3ljbGVzKCkgLSB0eGRhdGEtPmxhc3RfaWRsZTsKIAkJd2lsX2RiZ190eHJ4KHdpbCwgICJSaW5nWyUyZF0gbm90IGlkbGUgJWQgLT4gJWRcbiIsCkBAIC0xODEzLDcgKzE4MTMsNyBAQAogCiAJLyogcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqLwogCXVzZWQgPSB3aWxfdnJpbmdfdXNlZF90eCh2cmluZyk7Ci0JaWYgKHdpbF92YWxfaW5fcmFuZ2UodnJpbmdfaWRsZV90cnNoLAorCWlmICh3aWxfdmFsX2luX3JhbmdlKHdpbC0+dnJpbmdfaWRsZV90cnNoLAogCQkJICAgICB1c2VkLCB1c2VkICsgbnJfZnJhZ3MgKyAxKSkgewogCQl0eGRhdGEtPmlkbGUgKz0gZ2V0X2N5Y2xlcygpIC0gdHhkYXRhLT5sYXN0X2lkbGU7CiAJCXdpbF9kYmdfdHhyeCh3aWwsICAiUmluZ1slMmRdIG5vdCBpZGxlICVkIC0+ICVkXG4iLApAQCAtMjE3NSw3ICsyMTc1LDcgQEAKIAogCS8qIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KIAl1c2VkX25ldyA9IHdpbF92cmluZ191c2VkX3R4KHZyaW5nKTsKLQlpZiAod2lsX3ZhbF9pbl9yYW5nZSh2cmluZ19pZGxlX3Ryc2gsCisJaWYgKHdpbF92YWxfaW5fcmFuZ2Uod2lsLT52cmluZ19pZGxlX3Ryc2gsCiAJCQkgICAgIHVzZWRfbmV3LCB1c2VkX2JlZm9yZV9jb21wbGV0ZSkpIHsKIAkJd2lsX2RiZ190eHJ4KHdpbCwgIlJpbmdbJTJkXSBpZGxlICVkIC0+ICVkXG4iLAogCQkJICAgICByaW5naWQsIHVzZWRfYmVmb3JlX2NvbXBsZXRlLCB1c2VkX25ldyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKaW5kZXggZWNhNTY4NS4uODYxNmY4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaApAQCAtMzEsNyArMzEsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBtdHVfbWF4OwogZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHJ4X3Jpbmdfb3ZlcmZsb3dfdGhyc2g7CiBleHRlcm4gaW50IGFnZ193c2l6ZTsKLWV4dGVybiB1MzIgdnJpbmdfaWRsZV90cnNoOwogZXh0ZXJuIGJvb2wgcnhfYWxpZ25fMjsKIGV4dGVybiBib29sIHJ4X2xhcmdlX2J1ZjsKIGV4dGVybiBib29sIGRlYnVnX2Z3OwpAQCAtOTEsNiArOTAsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZhaWxlZF9yZXN1bWVzOwogCXVuc2lnbmVkIGxvbmcgcmVqZWN0ZWRfYnlfZGV2aWNlOwogCXVuc2lnbmVkIGxvbmcgcmVqZWN0ZWRfYnlfaG9zdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfc3VzcGVuZF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fc3VzcGVuZF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXhfc3VzcGVuZF90aW1lOworCWt0aW1lX3QgY29sbGVjdGlvbl9zdGFydDsKKwlrdGltZV90IHN1c3BlbmRfc3RhcnRfdGltZTsKIH07CiAKIC8qIENhbGN1bGF0ZSBNQUMgYnVmZmVyIHNpemUgZm9yIHRoZSBmaXJtd2FyZS4gSXQgaW5jbHVkZXMgYWxsIG92ZXJoZWFkLApAQCAtMTcwLDYgKzE3NCwxMCBAQAogI2RlZmluZSBSR0ZfVVNFUl9VU0VSX1NDUkFUQ0hfUEFECSgweDg4MDJiYykKICNkZWZpbmUgUkdGX1VTRVJfQkwJCQkoMHg4ODBBM0MpIC8qIEJvb3QgTG9hZGVyICovCiAjZGVmaW5lIFJHRl9VU0VSX0ZXX1JFVl9JRAkJKDB4ODgwYThjKSAvKiBjaGlwIHJldmlzaW9uICovCisjZGVmaW5lIFJHRl9VU0VSX0ZXX0NBTElCX1JFU1VMVAkoMHg4ODBhOTApIC8qIGIwLTc6cmVzdWx0CisJCQkJCQkgICAgKiBiOC0xNTpzaWduYXR1cmUKKwkJCQkJCSAgICAqLworCSNkZWZpbmUgQ0FMSUJfUkVTVUxUX1NJR05BVFVSRQkoMHgxMSkKICNkZWZpbmUgUkdGX1VTRVJfQ0xLU19DVExfMAkJKDB4ODgwYWJjKQogCSNkZWZpbmUgQklUX1VTRVJfQ0xLU19DQVJfQUhCX1NXX1NFTAlCSVQoMSkgLyogcmVmIGNsay9QTEwgKi8KIAkjZGVmaW5lIEJJVF9VU0VSX0NMS1NfUlNUX1BXR0QJQklUKDExKSAvKiByZXNldCBvbiAicG93ZXIgZ29vZCIgKi8KQEAgLTI2NCw2ICsyNzIsNyBAQAogCSNkZWZpbmUgQklUX0RNQV9QU0VVRE9fQ0FVU0VfTUlTQwlCSVQoMikKIAogI2RlZmluZSBSR0ZfSFBfQ1RSTAkJCSgweDg4MjY1YykKKyNkZWZpbmUgUkdGX1BBTF9VTklUX0lDUgkJKDB4ODgyNjZjKSAvKiBzdHJ1Y3QgUkdGX0lDUiAqLwogI2RlZmluZSBSR0ZfUENJRV9MT1NfQ09VTlRFUl9DVEwJKDB4ODgyZGM0KQogCiAvKiBNQUMgdGltZXIsIHVzZWMsIGZvciBwYWNrZXQgbGlmZXRpbWUgKi8KQEAgLTYxMiw2ICs2MjEsMTYgQEAKIAl1MzIgb2ZmX21zOwogfTsKIAorc3RydWN0IHdpbF9kZWJ1Z2ZzX2lvbWVtX2RhdGEgeworCXZvaWQgKm9mZnNldDsKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWw7Cit9OworCitzdHJ1Y3Qgd2lsX2RlYnVnZnNfZGF0YSB7CisJc3RydWN0IHdpbF9kZWJ1Z2ZzX2lvbWVtX2RhdGEgKmRhdGFfYXJyOworCWludCBpb21lbV9kYXRhX2NvdW50OworfTsKKwogZXh0ZXJuIHN0cnVjdCBibGlua19vbl9vZmZfdGltZSBsZWRfYmxpbmtfdGltZVtXSUxfTEVEX1RJTUVfTEFTVF07CiBleHRlcm4gdTggbGVkX2lkOwogZXh0ZXJuIHU4IGxlZF9wb2xhcml0eTsKQEAgLTY4OSw2ICs3MDgsNyBAQAogCXU4IHZyaW5nMmNpZF90aWRbV0lMNjIxMF9NQVhfVFhfUklOR1NdWzJdOyAvKiBbMF0gLSBDSUQsIFsxXSAtIFRJRCAqLwogCXN0cnVjdCB3aWxfc3RhX2luZm8gc3RhW1dJTDYyMTBfTUFYX0NJRF07CiAJaW50IGJjYXN0X3ZyaW5nOworCXUzMiB2cmluZ19pZGxlX3Ryc2g7IC8qIEhXIGZldGNoZXMgdXAgdG8gMTYgZGVzY3JpcHRvcnMgYXQgb25jZSAgKi8KIAlib29sIHVzZV9leHRlbmRlZF9kbWFfYWRkcjsgLyogaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIHVzaW5nIDQ4IGJpdHMgKi8KIAkvKiBzY2FuICovCiAJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OwpAQCAtNzAzLDYgKzcyMyw3IEBACiAJdTggYWJmdF9sZW47CiAJdTggd2FrZXVwX3RyaWdnZXI7CiAJc3RydWN0IHdpbF9zdXNwZW5kX3N0YXRzIHN1c3BlbmRfc3RhdHM7CisJc3RydWN0IHdpbF9kZWJ1Z2ZzX2RhdGEgZGJnX2RhdGE7CiAKIAl2b2lkICpwbGF0Zm9ybV9oYW5kbGU7CiAJc3RydWN0IHdpbF9wbGF0Zm9ybV9vcHMgcGxhdGZvcm1fb3BzOwpAQCAtNzI4LDYgKzc0OSw4IEBACiAJYm9vbCB0dF9kYXRhX3NldDsKIAlzdHJ1Y3Qgd21pX3R0X2RhdGEgdHRfZGF0YTsKIAorCWludCBmd19jYWxpYl9yZXN1bHQ7CisKICNpZmRlZiBDT05GSUdfUE0KICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcG1fbm90aWZ5OwpAQCAtODU4LDYgKzg4MSw3IEBACiBpbnQgX193aWxfdXAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIGludCB3aWxfZG93bihzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogaW50IF9fd2lsX2Rvd24oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKK3ZvaWQgd2lsX3JlZnJlc2hfZndfY2FwYWJpbGl0aWVzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiB2b2lkIHdpbF9tYm94X3JpbmdfbGUyY3B1cyhzdHJ1Y3Qgd2lsNjIxMF9tYm94X3JpbmcgKnIpOwogaW50IHdpbF9maW5kX2NpZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHU4ICptYWMpOwogdm9pZCB3aWxfc2V0X2V0aHRvb2xvcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwpAQCAtOTQwLDggKzk2NCwxMyBAQAogCQkJIHN0cnVjdCBjZmc4MDIxMV9tZ210X3R4X3BhcmFtcyAqcGFyYW1zLAogCQkJIHU2NCAqY29va2llKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX1dJTDYyMTBfREVCVUdGUykKIGludCB3aWw2MjEwX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogdm9pZCB3aWw2MjEwX2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgd2lsNjIxMF9kZWJ1Z2ZzX2luaXQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgd2lsNjIxMF9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpIHt9CisjZW5kaWYKIGludCB3aWw2MjEwX3N5c2ZzX2luaXQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIHZvaWQgd2lsNjIxMF9zeXNmc19yZW1vdmUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIGludCB3aWxfY2lkX2ZpbGxfc2luZm8oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgY2lkLApAQCAtOTk3LDYgKzEwMjYsMTEgQEAKIAkJCSBib29sIGxvYWQpOwogYm9vbCB3aWxfZndfdmVyaWZ5X2ZpbGVfZXhpc3RzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgY2hhciAqbmFtZSk7CiAKK3ZvaWQgd2lsX3BtX3J1bnRpbWVfYWxsb3coc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKK3ZvaWQgd2lsX3BtX3J1bnRpbWVfZm9yYmlkKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CitpbnQgd2lsX3BtX3J1bnRpbWVfZ2V0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7Cit2b2lkIHdpbF9wbV9ydW50aW1lX3B1dChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOworCiBpbnQgd2lsX2Nhbl9zdXNwZW5kKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgYm9vbCBpc19ydW50aW1lKTsKIGludCB3aWxfc3VzcGVuZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSk7CiBpbnQgd2lsX3Jlc3VtZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCmluZGV4IDMwMjhmMTguLjQzY2RhZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCkBAIC0zNDUsNiArMzQ1LDExIEBACiAJc3RybGNweSh3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiwgd2lsLT5md192ZXJzaW9uLAogCQlzaXplb2Yod2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24pKTsKIAorCWlmIChsZW4gPiBvZmZzZXRvZihzdHJ1Y3Qgd21pX3JlYWR5X2V2ZW50LCByZmNfcmVhZF9jYWxpYl9yZXN1bHQpKSB7CisJCXdpbF9kYmdfd21pKHdpbCwgInJmYyBjYWxpYnJhdGlvbiByZXN1bHQgJWRcbiIsCisJCQkgICAgZXZ0LT5yZmNfcmVhZF9jYWxpYl9yZXN1bHQpOworCQl3aWwtPmZ3X2NhbGliX3Jlc3VsdCA9IGV2dC0+cmZjX3JlYWRfY2FsaWJfcmVzdWx0OworCX0KIAl3aWxfc2V0X3JlY292ZXJ5X3N0YXRlKHdpbCwgZndfcmVjb3ZlcnlfaWRsZSk7CiAJc2V0X2JpdCh3aWxfc3RhdHVzX2Z3cmVhZHksIHdpbC0+c3RhdHVzKTsKIAkvKiBsZXQgdGhlIHJlc2V0IHNlcXVlbmNlIGNvbnRpbnVlICovCkBAIC0zODIsMTIgKzM4NywxNSBAQAogCWNoX25vID0gZGF0YS0+aW5mby5jaGFubmVsICsgMTsKIAlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoX25vLCBOTDgwMjExX0JBTkRfNjBHSFopOwogCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOwotCXNpZ25hbCA9IGRhdGEtPmluZm8uc3FpOworCWlmICh0ZXN0X2JpdChXTUlfRldfQ0FQQUJJTElUWV9SU1NJX1JFUE9SVElORywgd2lsLT5md19jYXBhYmlsaXRpZXMpKQorCQlzaWduYWwgPSAxMDAgKiBkYXRhLT5pbmZvLnJzc2k7CisJZWxzZQorCQlzaWduYWwgPSBkYXRhLT5pbmZvLnNxaTsKIAlkX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGRhdGEtPmluZm8uc3RhdHVzKTsKIAlmYyA9IHJ4X21nbXRfZnJhbWUtPmZyYW1lX2NvbnRyb2w7CiAKLQl3aWxfZGJnX3dtaSh3aWwsICJNR01UIFJ4OiBjaGFubmVsICVkIE1DUyAlZCBTTlIgJWQgU1FJICVkJSVcbiIsCi0JCSAgICBkYXRhLT5pbmZvLmNoYW5uZWwsIGRhdGEtPmluZm8ubWNzLCBkYXRhLT5pbmZvLnNuciwKKwl3aWxfZGJnX3dtaSh3aWwsICJNR01UIFJ4OiBjaGFubmVsICVkIE1DUyAlZCBSU1NJICVkIFNRSSAlZCUlXG4iLAorCQkgICAgZGF0YS0+aW5mby5jaGFubmVsLCBkYXRhLT5pbmZvLm1jcywgZGF0YS0+aW5mby5yc3NpLAogCQkgICAgZGF0YS0+aW5mby5zcWkpOwogCXdpbF9kYmdfd21pKHdpbCwgInN0YXR1cyAweCUwNHggbGVuICVkIGZjIDB4JTA0eFxuIiwgZF9zdGF0dXMsIGRfbGVuLAogCQkgICAgbGUxNl90b19jcHUoZmMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmgKaW5kZXggMjU2ZjYzYy4uNTI2M2VlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmgKQEAgLTM2LDYgKzM2LDExIEBACiAjZGVmaW5lIFdNSV9QUk9YX1JBTkdFX05VTQkJKDMpCiAjZGVmaW5lIFdNSV9NQVhfTE9TU19ETUdfQkVBQ09OUwkoMjApCiAjZGVmaW5lIE1BWF9OVU1fT0ZfU0VDVE9SUwkJKDEyOCkKKyNkZWZpbmUgV01JX1NDSEVEX01BWF9BTExPQ1NfUEVSX0NNRAkoNCkKKyNkZWZpbmUgV01JX1JGX0RUWVBFX0xFTkdUSAkJKDMpCisjZGVmaW5lIFdNSV9SRl9FVFlQRV9MRU5HVEgJCSgzKQorI2RlZmluZSBXTUlfUkZfUlgyVFhfTEVOR1RICQkoMykKKyNkZWZpbmUgV01JX1JGX0VUWVBFX1ZBTF9QRVJfUkFOR0UJKDUpCiAKIC8qIE1haWxib3ggaW50ZXJmYWNlCiAgKiB1c2VkIGZvciBjb21tYW5kcyBhbmQgZXZlbnRzCkBAIC01MiwxNCArNTcsMjAgQEAKICAqIHRoZSBob3N0CiAgKi8KIGVudW0gd21pX2Z3X2NhcGFiaWxpdHkgewotCVdNSV9GV19DQVBBQklMSVRZX0ZUTQkJCT0gMCwKLQlXTUlfRldfQ0FQQUJJTElUWV9QU19DT05GSUcJCT0gMSwKLQlXTUlfRldfQ0FQQUJJTElUWV9SRl9TRUNUT1JTCQk9IDIsCi0JV01JX0ZXX0NBUEFCSUxJVFlfTUdNVF9SRVRSWV9MSU1JVAk9IDMsCi0JV01JX0ZXX0NBUEFCSUxJVFlfRElTQUJMRV9BUF9TTUUJPSA0LAotCVdNSV9GV19DQVBBQklMSVRZX1dNSV9PTkxZCQk9IDUsCi0JV01JX0ZXX0NBUEFCSUxJVFlfVEhFUk1BTF9USFJPVFRMSU5HCT0gNywKLQlXTUlfRldfQ0FQQUJJTElUWV9EM19TVVNQRU5ECQk9IDgsCisJV01JX0ZXX0NBUEFCSUxJVFlfRlRNCQkJCT0gMCwKKwlXTUlfRldfQ0FQQUJJTElUWV9QU19DT05GSUcJCQk9IDEsCisJV01JX0ZXX0NBUEFCSUxJVFlfUkZfU0VDVE9SUwkJCT0gMiwKKwlXTUlfRldfQ0FQQUJJTElUWV9NR01UX1JFVFJZX0xJTUlUCQk9IDMsCisJV01JX0ZXX0NBUEFCSUxJVFlfRElTQUJMRV9BUF9TTUUJCT0gNCwKKwlXTUlfRldfQ0FQQUJJTElUWV9XTUlfT05MWQkJCT0gNSwKKwlXTUlfRldfQ0FQQUJJTElUWV9USEVSTUFMX1RIUk9UVExJTkcJCT0gNywKKwlXTUlfRldfQ0FQQUJJTElUWV9EM19TVVNQRU5ECQkJPSA4LAorCVdNSV9GV19DQVBBQklMSVRZX0xPTkdfUkFOR0UJCQk9IDksCisJV01JX0ZXX0NBUEFCSUxJVFlfRklYRURfU0NIRURVTElORwkJPSAxMCwKKwlXTUlfRldfQ0FQQUJJTElUWV9NVUxUSV9ESVJFQ1RFRF9PTU5JUwkJPSAxMSwKKwlXTUlfRldfQ0FQQUJJTElUWV9SU1NJX1JFUE9SVElORwkJPSAxMiwKKwlXTUlfRldfQ0FQQUJJTElUWV9TRVRfU0lMRU5UX1JTU0lfVEFCTEUJCT0gMTMsCisJV01JX0ZXX0NBUEFCSUxJVFlfTE9fUE9XRVJfQ0FMSUJfRlJPTV9PVFAJPSAxNCwKIAlXTUlfRldfQ0FQQUJJTElUWV9NQVgsCiB9OwogCkBAIC03OSw2ICs5MCw3IEBACiAJV01JX1NUQVJUX1NDQU5fQ01ESUQJCQkJPSAweDA3LAogCVdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRAkJCT0gMHgwOSwKIAlXTUlfU0VUX1BST0JFRF9TU0lEX0NNRElECQkJPSAweDBBLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfU0VUX0xJU1RFTl9JTlRfQ01ESUQJCQk9IDB4MEIsCiAJV01JX0JDT05fQ1RSTF9DTURJRAkJCQk9IDB4MEYsCiAJV01JX0FERF9DSVBIRVJfS0VZX0NNRElECQkJPSAweDE2LApAQCAtOTMsMjYgKzEwNSwyOCBAQAogCVdNSV9FQ0hPX0NNRElECQkJCQk9IDB4ODAzLAogCVdNSV9ERUVQX0VDSE9fQ01ESUQJCQkJPSAweDgwNCwKIAlXTUlfQ09ORklHX01BQ19DTURJRAkJCQk9IDB4ODA1LAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfQ09ORklHX1BIWV9ERUJVR19DTURJRAkJCT0gMHg4MDYsCiAJV01JX0FERF9ERUJVR19UWF9QQ0tUX0NNRElECQkJPSAweDgwOCwKIAlXTUlfUEhZX0dFVF9TVEFUSVNUSUNTX0NNRElECQkJPSAweDgwOSwKKwkvKiBkZXByZWNhdGVkICovCiAJV01JX0ZTX1RVTkVfQ01ESUQJCQkJPSAweDgwQSwKKwkvKiBkZXByZWNhdGVkICovCiAJV01JX0NPUlJfTUVBU1VSRV9DTURJRAkJCQk9IDB4ODBCLAogCVdNSV9SRUFEX1JTU0lfQ01ESUQJCQkJPSAweDgwQywKIAlXTUlfVEVNUF9TRU5TRV9DTURJRAkJCQk9IDB4ODBFLAogCVdNSV9EQ19DQUxJQl9DTURJRAkJCQk9IDB4ODBGLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfU0VORF9UT05FX0NNRElECQkJCT0gMHg4MTAsCisJLyogZGVwcmVjYXRlZCAqLwogCVdNSV9JUV9UWF9DQUxJQl9DTURJRAkJCQk9IDB4ODExLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfSVFfUlhfQ0FMSUJfQ01ESUQJCQkJPSAweDgxMiwKLQlXTUlfU0VUX1VDT0RFX0lETEVfQ01ESUQJCQk9IDB4ODEzLAogCVdNSV9TRVRfV09SS19NT0RFX0NNRElECQkJCT0gMHg4MTUsCiAJV01JX0xPX0xFQUtBR0VfQ0FMSUJfQ01ESUQJCQk9IDB4ODE2LAotCVdNSV9NQVJMT05fUl9SRUFEX0NNRElECQkJCT0gMHg4MTgsCi0JV01JX01BUkxPTl9SX1dSSVRFX0NNRElECQkJPSAweDgxOSwKLQlXTUlfTUFSTE9OX1JfVFhSWF9TRUxfQ01ESUQJCQk9IDB4ODFBLAotCU1BQ19JT19TVEFUSUNfUEFSQU1TX0NNRElECQkJPSAweDgxQiwKLQlNQUNfSU9fRFlOQU1JQ19QQVJBTVNfQ01ESUQJCQk9IDB4ODFDLAorCVdNSV9MT19QT1dFUl9DQUxJQl9GUk9NX09UUF9DTURJRAkJPSAweDgxNywKIAlXTUlfU0lMRU5UX1JTU0lfQ0FMSUJfQ01ESUQJCQk9IDB4ODFELAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfUkZfUlhfVEVTVF9DTURJRAkJCQk9IDB4ODFFLAogCVdNSV9DRkdfUlhfQ0hBSU5fQ01ESUQJCQkJPSAweDgyMCwKIAlXTUlfVlJJTkdfQ0ZHX0NNRElECQkJCT0gMHg4MjEsCkBAIC0xMjYsMTEgKzE0MCw2IEBACiAJV01JX1NFVF9QQ1BfQ0hBTk5FTF9DTURJRAkJCT0gMHg4MjksCiAJV01JX0dFVF9QQ1BfQ0hBTk5FTF9DTURJRAkJCT0gMHg4MkEsCiAJV01JX1NXX1RYX1JFUV9DTURJRAkJCQk9IDB4ODJCLAotCVdNSV9SRUFEX01BQ19SWFFfQ01ESUQJCQkJPSAweDgzMCwKLQlXTUlfUkVBRF9NQUNfVFhRX0NNRElECQkJCT0gMHg4MzEsCi0JV01JX1dSSVRFX01BQ19SWFFfQ01ESUQJCQkJPSAweDgzMiwKLQlXTUlfV1JJVEVfTUFDX1RYUV9DTURJRAkJCQk9IDB4ODMzLAotCVdNSV9XUklURV9NQUNfWFFfRklFTERfQ01ESUQJCQk9IDB4ODM0LAogCVdNSV9NTE1FX1BVU0hfQ01ESUQJCQkJPSAweDgzNSwKIAlXTUlfQkVBTUZPUk1JTkdfTUdNVF9DTURJRAkJCT0gMHg4MzYsCiAJV01JX0JGX1RYU1NfTUdNVF9DTURJRAkJCQk9IDB4ODM3LApAQCAtMTQ0LDkgKzE1MywxMyBAQAogCVdNSV9NQUlOVEFJTl9SRVNVTUVfQ01ESUQJCQk9IDB4ODUxLAogCVdNSV9SU19NR01UX0NNRElECQkJCT0gMHg4NTIsCiAJV01JX1JGX01HTVRfQ01ESUQJCQkJPSAweDg1MywKLQlXTUlfT1RQX1JFQURfQ01ESUQJCQkJPSAweDg1NiwKLQlXTUlfT1RQX1dSSVRFX0NNRElECQkJCT0gMHg4NTcsCisJV01JX1JGX1hQTV9SRUFEX0NNRElECQkJCT0gMHg4NTYsCisJV01JX1JGX1hQTV9XUklURV9DTURJRAkJCQk9IDB4ODU3LAogCVdNSV9MRURfQ0ZHX0NNRElECQkJCT0gMHg4NTgsCisJV01JX1NFVF9DT05ORUNUX1NOUl9USFJfQ01ESUQJCQk9IDB4ODVCLAorCVdNSV9TRVRfQUNUSVZFX1NJTEVOVF9SU1NJX1RBQkxFX0NNRElECQk9IDB4ODVDLAorCVdNSV9SRl9QV1JfT05fREVMQVlfQ01ESUQJCQk9IDB4ODVELAorCVdNSV9TRVRfSElHSF9QT1dFUl9UQUJMRV9QQVJBTVNfQ01ESUQJCT0gMHg4NUUsCiAJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBjb21tYW5kcyAqLwogCVdNSV9CRl9DVFJMX0NNRElECQkJCT0gMHg4NjIsCiAJV01JX05PVElGWV9SRVFfQ01ESUQJCQkJPSAweDg2MywKQEAgLTE1NCw3ICsxNjcsNiBAQAogCVdNSV9HRVRfUkZfU1RBVFVTX0NNRElECQkJCT0gMHg4NjYsCiAJV01JX0dFVF9CQVNFQkFORF9UWVBFX0NNRElECQkJPSAweDg2NywKIAlXTUlfVU5JVF9URVNUX0NNRElECQkJCT0gMHg5MDAsCi0JV01JX0hJQ0NVUF9DTURJRAkJCQk9IDB4OTAxLAogCVdNSV9GTEFTSF9SRUFEX0NNRElECQkJCT0gMHg5MDIsCiAJV01JX0ZMQVNIX1dSSVRFX0NNRElECQkJCT0gMHg5MDMsCiAJLyogUG93ZXIgbWFuYWdlbWVudCAqLwpAQCAtMTc0LDE2ICsxODYsNiBAQAogCVdNSV9HRVRfUENQX0ZBQ1RPUl9DTURJRAkJCT0gMHg5MUIsCiAJLyogUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uIENvbW1hbmRzICovCiAJV01JX1BTX0RFVl9QUk9GSUxFX0NGR19DTURJRAkJCT0gMHg5MUMsCi0JLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KLQlXTUlfUFNfREVWX0NGR19DTURJRAkJCQk9IDB4OTFELAotCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JV01JX1BTX0RFVl9DRkdfUkVBRF9DTURJRAkJCT0gMHg5MUUsCi0JLyogUGVyIE1BQyBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gY29tbWFuZHMKLQkgKiBOb3Qgc3VwcG9ydGVkIHlldAotCSAqLwotCVdNSV9QU19NSURfQ0ZHX0NNRElECQkJCT0gMHg5MUYsCi0JLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KLQlXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECQkJPSAweDkyMCwKIAlXTUlfUlNfQ0ZHX0NNRElECQkJCT0gMHg5MjEsCiAJV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfQ01ESUQJCQk9IDB4OTIyLAogCVdNSV9BT0FfTUVBU19DTURJRAkJCQk9IDB4OTIzLApAQCAtMTk0LDEzICsxOTYsMTYgQEAKIAlXTUlfREVMX1NUQV9DTURJRAkJCQk9IDB4OTM2LAogCVdNSV9TRVRfVEhFUk1BTF9USFJPVFRMSU5HX0NGR19DTURJRAkJPSAweDk0MCwKIAlXTUlfR0VUX1RIRVJNQUxfVEhST1RUTElOR19DRkdfQ01ESUQJCT0gMHg5NDEsCisJLyogUmVhZCBQb3dlciBTYXZlIHByb2ZpbGUgdHlwZSAqLworCVdNSV9QU19ERVZfUFJPRklMRV9DRkdfUkVBRF9DTURJRAkJPSAweDk0MiwKIAlXTUlfVE9GX1NFU1NJT05fU1RBUlRfQ01ESUQJCQk9IDB4OTkxLAogCVdNSV9UT0ZfR0VUX0NBUEFCSUxJVElFU19DTURJRAkJCT0gMHg5OTIsCiAJV01JX1RPRl9TRVRfTENSX0NNRElECQkJCT0gMHg5OTMsCiAJV01JX1RPRl9TRVRfTENJX0NNRElECQkJCT0gMHg5OTQsCi0JV01JX1RPRl9DSEFOTkVMX0lORk9fQ01ESUQJCQk9IDB4OTk1LAorCVdNSV9UT0ZfQ0ZHX1JFU1BPTkRFUl9DTURJRAkJCT0gMHg5OTYsCiAJV01JX1RPRl9TRVRfVFhfUlhfT0ZGU0VUX0NNRElECQkJPSAweDk5NywKIAlXTUlfVE9GX0dFVF9UWF9SWF9PRkZTRVRfQ01ESUQJCQk9IDB4OTk4LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0NNRElECQkJPSAweDk5OSwKIAlXTUlfR0VUX1JGX1NFQ1RPUl9QQVJBTVNfQ01ESUQJCQk9IDB4OUEwLAogCVdNSV9TRVRfUkZfU0VDVE9SX1BBUkFNU19DTURJRAkJCT0gMHg5QTEsCiAJV01JX0dFVF9TRUxFQ1RFRF9SRl9TRUNUT1JfSU5ERVhfQ01ESUQJCT0gMHg5QTIsCkBAIC0yMDksMTIgKzIxNCwyMCBAQAogCVdNSV9QUklPX1RYX1NFQ1RPUlNfT1JERVJfQ01ESUQJCQk9IDB4OUE1LAogCVdNSV9QUklPX1RYX1NFQ1RPUlNfTlVNQkVSX0NNRElECQk9IDB4OUE2LAogCVdNSV9QUklPX1RYX1NFQ1RPUlNfU0VUX0RFRkFVTFRfQ0ZHX0NNRElECT0gMHg5QTcsCisJV01JX1NDSEVEVUxJTkdfU0NIRU1FX0NNRElECQkJPSAweEEwMSwKKwlXTUlfRklYRURfU0NIRURVTElOR19DT05GSUdfQ01ESUQJCT0gMHhBMDIsCisJV01JX0VOQUJMRV9GSVhFRF9TQ0hFRFVMSU5HX0NNRElECQk9IDB4QTAzLAorCVdNSV9TRVRfTVVMVElfRElSRUNURURfT01OSVNfQ09ORklHX0NNRElECT0gMHhBMDQsCisJV01JX1NFVF9MT05HX1JBTkdFX0NPTkZJR19DTURJRAkJCT0gMHhBMDUsCiAJV01JX1NFVF9NQUNfQUREUkVTU19DTURJRAkJCT0gMHhGMDAzLAogCVdNSV9BQk9SVF9TQ0FOX0NNRElECQkJCT0gMHhGMDA3LAogCVdNSV9TRVRfUFJPTUlTQ1VPVVNfTU9ERV9DTURJRAkJCT0gMHhGMDQxLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfR0VUX1BNS19DTURJRAkJCQk9IDB4RjA0OCwKIAlXTUlfU0VUX1BBU1NQSFJBU0VfQ01ESUQJCQk9IDB4RjA0OSwKKwkvKiBkZXByZWNhdGVkICovCiAJV01JX1NFTkRfQVNTT0NfUkVTX0NNRElECQkJPSAweEYwNEEsCisJLyogZGVwcmVjYXRlZCAqLwogCVdNSV9TRVRfQVNTT0NfUkVRX1JFTEFZX0NNRElECQkJPSAweEYwNEIsCiAJV01JX01BQ19BRERSX1JFUV9DTURJRAkJCQk9IDB4RjA0RCwKIAlXTUlfRldfVkVSX0NNRElECQkJCT0gMHhGMDRFLApAQCAtNDQwLDExICs0NTMsNiBAQAogCV9fbGUzMiByZl9tZ210X3R5cGU7CiB9IF9fcGFja2VkOwogCi0vKiBXTUlfUkZfUlhfVEVTVF9DTURJRCAqLwotc3RydWN0IHdtaV9yZl9yeF90ZXN0X2NtZCB7Ci0JX19sZTMyIHNlY3RvcjsKLX0gX19wYWNrZWQ7Ci0KIC8qIFdNSV9DT1JSX01FQVNVUkVfQ01ESUQgKi8KIHN0cnVjdCB3bWlfY29ycl9tZWFzdXJlX2NtZCB7CiAJX19sZTMyIGZyZXFfbWh6OwpAQCAtNjU3LDYgKzY2NSwyMCBAQAogCXN0cnVjdCB3bWlfYmNhc3RfdnJpbmdfY2ZnIHZyaW5nX2NmZzsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9MT19QT1dFUl9DQUxJQl9GUk9NX09UUF9DTURJRCAqLworc3RydWN0IHdtaV9sb19wb3dlcl9jYWxpYl9mcm9tX290cF9jbWQgeworCS8qIGluZGV4IHRvIHJlYWQgZnJvbSBPVFAuIHplcm8gYmFzZWQgKi8KKwl1OCBpbmRleDsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MT19QT1dFUl9DQUxJQl9GUk9NX09UUF9FVkVOVElEICovCitzdHJ1Y3Qgd21pX2xvX3Bvd2VyX2NhbGliX2Zyb21fb3RwX2V2ZW50IHsKKwkvKiB3bWlfZndfc3RhdHVzICovCisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKwogLyogV01JX1ZSSU5HX0JBX0VOX0NNRElEICovCiBzdHJ1Y3Qgd21pX3ZyaW5nX2JhX2VuX2NtZCB7CiAJdTggcmluZ2lkOwpAQCAtNjkyLDYgKzcxNCwyNCBAQAogCVdNSV9TTklGRkVSX09OCT0gMHgwMSwKIH07CiAKKy8qIFdNSV9TSUxFTlRfUlNTSV9UQUJMRSAqLworZW51bSB3bWlfc2lsZW50X3Jzc2lfdGFibGUgeworCVJGX1RFTVBFUkFUVVJFX0NBTElCX0RFRkFVTFRfREIJCT0gMHgwMCwKKwlSRl9URU1QRVJBVFVSRV9DQUxJQl9ISUdIX1BPV0VSX0RCCT0gMHgwMSwKK307CisKKy8qIFdNSV9TSUxFTlRfUlNTSV9TVEFUVVMgKi8KK2VudW0gd21pX3NpbGVudF9yc3NpX3N0YXR1cyB7CisJU0lMRU5UX1JTU0lfU1VDQ0VTUwk9IDB4MDAsCisJU0lMRU5UX1JTU0lfRkFJTFVSRQk9IDB4MDEsCit9OworCisvKiBXTUlfU0VUX0FDVElWRV9TSUxFTlRfUlNTSV9UQUJMRV9DTURJRCAqLworc3RydWN0IHdtaV9zZXRfYWN0aXZlX3NpbGVudF9yc3NpX3RhYmxlX2NtZCB7CisJLyogZW51bSB3bWlfc2lsZW50X3Jzc2lfdGFibGUgKi8KKwlfX2xlMzIgdGFibGU7Cit9IF9fcGFja2VkOworCiBlbnVtIHdtaV9zbmlmZmVyX2NmZ19waHlfaW5mb19tb2RlIHsKIAlXTUlfU05JRkZFUl9QSFlfSU5GT19ESVNBQkxFRAk9IDB4MDAsCiAJV01JX1NOSUZGRVJfUEhZX0lORk9fRU5BQkxFRAk9IDB4MDEsCkBAIC04MzUsMTggKzg3NSw4NSBAQAogCV9fbGUzMiB2YWx1ZTsKIH0gX19wYWNrZWQ7CiAKLS8qIFdNSV9PVFBfUkVBRF9DTURJRCAqLwotc3RydWN0IHdtaV9vdHBfcmVhZF9jbWQgewotCV9fbGUzMiBhZGRyOwotCV9fbGUzMiBzaXplOwotCV9fbGUzMiB2YWx1ZXM7CisvKiBXTUlfUkZfUFdSX09OX0RFTEFZX0NNRElECisgKiBzZXQgRlcgdGltZSBwYXJhbWV0ZXJzIHVzZWQgdGhyb3VnaCBSRiByZXNldHRpbmcKKyAqICBSRiByZXNldCBjb25zaXN0cyBvZiBicmluZ2luZyBpdHMgcG93ZXIgZG93biBmb3IgYSBwZXJpb2Qgb2YgdGltZSwgdGhlbgorICogYnJpbmdpbmcgdGhlIHBvd2VyIHVwCisgKiBSZXR1cm5lZCBldmVudDogV01JX1JGX1BXUl9PTl9ERUxBWV9SU1BfRVZFTlRJRAorICovCitzdHJ1Y3Qgd21pX3JmX3B3cl9vbl9kZWxheV9jbWQgeworCS8qIHRpbWUgaW4gdXNlYyB0aGUgRlcgd2FpdHMgYWZ0ZXIgYnJpbmdpbmcgdGhlIFJGIFBXUiBkb3duLAorCSAqIHNldCAwIGZvciBkZWZhdWx0CisJICovCisJX19sZTE2IGRvd25fZGVsYXlfdXNlYzsKKwkvKiB0aW1lIGluIHVzZWMgdGhlIEZXIHdhaXRzIGFmdGVyIGJyaW5naW5nIHRoZSBSRiBQV1IgdXAsCisJICogc2V0IDAgZm9yIGRlZmF1bHQKKwkgKi8KKwlfX2xlMTYgdXBfZGVsYXlfdXNlYzsKIH0gX19wYWNrZWQ7CiAKLS8qIFdNSV9PVFBfV1JJVEVfQ01ESUQgKi8KLXN0cnVjdCB3bWlfb3RwX3dyaXRlX2NtZCB7Ci0JX19sZTMyIGFkZHI7Ci0JX19sZTMyIHNpemU7Ci0JX19sZTMyIHZhbHVlczsKKy8qIFxXTUlfU0VUX0hJR0hfUE9XRVJfVEFCTEVfUEFSQU1TX0NNRElECisgKiBUaGlzIEFQSSBjb250cm9scyB0aGUgVHggYW5kIFJ4IGdhaW4gb3ZlciB0ZW1wZXJhdHVyZS4KKyAqIEl0IGNvbnRyb2xzIHRoZSBUeCBELXR5cGUsIFJ4IEQtdHlwZSBhbmQgUnggRS10eXBlIGFtcGxpZmllcnMuCisgKiBJdCBhbHNvIGNvbnRyb2xzIHRoZSBUeCBnYWluIGluZGV4LCBieSBjb250cm9sbGluZyB0aGUgUnggdG8gVHggZ2FpbiBpbmRleAorICogb2Zmc2V0LgorICogVGhlIGNvbnRyb2wgaXMgZGl2aWRlZCBieSAzIHRlbXBlcmF0dXJlIHZhbHVlcyB0byA0IHRlbXBlcmF0dXJlIHJhbmdlcy4KKyAqIEVhY2ggcGFyYW1ldGVyIHVzZXMgaXRzIG93biB0ZW1wZXJhdHVyZSB2YWx1ZXMuCisgKiBSZXR1cm5lZCBldmVudDogV01JX1NFVF9ISUdIX1BPV0VSX1RBQkxFX1BBUkFNU19FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfc2V0X2hpZ2hfcG93ZXJfdGFibGVfcGFyYW1zX2NtZCB7CisJLyogVGVtcGVyYXR1cmUgcmFuZ2UgZm9yIFR4IEQtdHlwZSBwYXJhbWV0ZXJzICovCisJdTggdHhfZHR5cGVfdGVtcFtXTUlfUkZfRFRZUEVfTEVOR1RIXTsKKwl1OCByZXNlcnZlZDA7CisJLyogVHggRC10eXBlIHZhbHVlcyB0byBiZSB1c2VkIGZvciBlYWNoIHRlbXBlcmF0dXJlIHJhbmdlICovCisJX19sZTMyIHR4X2R0eXBlX2NvbmZbV01JX1JGX0RUWVBFX0xFTkdUSCArIDFdOworCS8qIFRlbXBlcmF0dXJlIHJhbmdlIGZvciBSeCBELXR5cGUgcGFyYW1ldGVycyAqLworCXU4IHJ4X2R0eXBlX3RlbXBbV01JX1JGX0RUWVBFX0xFTkdUSF07CisJdTggcmVzZXJ2ZWQxOworCS8qIFJ4IEQtdHlwZSB2YWx1ZXMgdG8gYmUgdXNlZCBmb3IgZWFjaCB0ZW1wZXJhdHVyZSByYW5nZSAqLworCV9fbGUzMiByeF9kdHlwZV9jb25mW1dNSV9SRl9EVFlQRV9MRU5HVEggKyAxXTsKKwkvKiBUZW1wZXJhdHVyZSByYW5nZSBmb3IgUnggRS10eXBlIHBhcmFtZXRlcnMgKi8KKwl1OCByeF9ldHlwZV90ZW1wW1dNSV9SRl9FVFlQRV9MRU5HVEhdOworCXU4IHJlc2VydmVkMjsKKwkvKiBSeCBFLXR5cGUgdmFsdWVzIHRvIGJlIHVzZWQgZm9yIGVhY2ggdGVtcGVyYXR1cmUgcmFuZ2UuCisJICogVGhlIGxhc3QgNCB2YWx1ZXMgb2YgYW55IHJhbmdlIGFyZSB0aGUgZmlyc3QgNCB2YWx1ZXMgb2YgdGhlIG5leHQKKwkgKiByYW5nZSBhbmQgc28gb24KKwkgKi8KKwlfX2xlMzIgcnhfZXR5cGVfY29uZltXTUlfUkZfRVRZUEVfVkFMX1BFUl9SQU5HRSArIFdNSV9SRl9FVFlQRV9MRU5HVEhdOworCS8qIFRlbXBlcmF0dXJlIHJhbmdlIGZvciByeF8yX3R4X29mZnMgcGFyYW1ldGVycyAqLworCXU4IHJ4XzJfdHhfdGVtcFtXTUlfUkZfUlgyVFhfTEVOR1RIXTsKKwl1OCByZXNlcnZlZDM7CisJLyogUnggdG8gVHggZ2FpbiBpbmRleCBvZmZzZXQgKi8KKwlzOCByeF8yX3R4X29mZnNbV01JX1JGX1JYMlRYX0xFTkdUSCArIDFdOworfSBfX3BhY2tlZDsKKworLyogQ01EOiBXTUlfUkZfWFBNX1JFQURfQ01ESUQgKi8KK3N0cnVjdCB3bWlfcmZfeHBtX3JlYWRfY21kIHsKKwl1OCByZl9pZDsKKwl1OCByZXNlcnZlZFszXTsKKwkvKiBYUE0gYml0IHN0YXJ0IGFkZHJlc3MgaW4gcmFuZ2UgWzAsODE5MV1iaXRzIC0gcm91bmRlZCBieSBGVyB0bworCSAqIG11bHRpcGxlIG9mIDhiaXRzCisJICovCisJX19sZTMyIHhwbV9iaXRfYWRkcmVzczsKKwlfX2xlMzIgbnVtX2J5dGVzOworfSBfX3BhY2tlZDsKKworLyogQ01EOiBXTUlfUkZfWFBNX1dSSVRFX0NNRElEICovCitzdHJ1Y3Qgd21pX3JmX3hwbV93cml0ZV9jbWQgeworCXU4IHJmX2lkOworCXU4IHJlc2VydmVkMFszXTsKKwkvKiBYUE0gYml0IHN0YXJ0IGFkZHJlc3MgaW4gcmFuZ2UgWzAsODE5MV1iaXRzIC0gcm91bmRlZCBieSBGVyB0bworCSAqIG11bHRpcGxlIG9mIDhiaXRzCisJICovCisJX19sZTMyIHhwbV9iaXRfYWRkcmVzczsKKwlfX2xlMzIgbnVtX2J5dGVzOworCS8qIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgRlcgc2hvdWxkIHZlcmlmeSB0aGUgd3JpdGUKKwkgKiBvcGVyYXRpb24KKwkgKi8KKwl1OCB2ZXJpZnk7CisJdTggcmVzZXJ2ZWQxWzNdOworCS8qIGFjdHVhbCBzaXplPW51bV9ieXRlcyAqLworCXU4IGRhdGFfYnl0ZXNbMF07CiB9IF9fcGFja2VkOwogCiAvKiBXTUlfVEVNUF9TRU5TRV9DTURJRApAQCAtOTg5LDE5ICsxMDk2LDI2IEBACiAJICovCiAJX19sZTE2IGJ1cnN0X3BlcmlvZDsKIAl1OCBkc3RfbWFjW1dNSV9NQUNfTEVOXTsKLQlfX2xlMTYgcmVzZXJ2ZWQ7CisJdTggcmVzZXJ2ZWQ7CisJdTggbnVtX2J1cnN0X3Blcl9hb2FfbWVhczsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9DTURJRCAqLwogc3RydWN0IHdtaV90b2Zfc2Vzc2lvbl9zdGFydF9jbWQgewogCV9fbGUzMiBzZXNzaW9uX2lkOwotCXU4IG51bV9vZl9hb2FfbWVhc3VyZXM7CisJdTggcmVzZXJ2ZWQxOwogCXU4IGFvYV90eXBlOwogCV9fbGUxNiBudW1fb2ZfZGVzdDsKIAl1OCByZXNlcnZlZFs0XTsKIAlzdHJ1Y3Qgd21pX2Z0bV9kZXN0X2luZm8gZnRtX2Rlc3RfaW5mb1swXTsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9UT0ZfQ0ZHX1JFU1BPTkRFUl9DTURJRCAqLworc3RydWN0IHdtaV90b2ZfY2ZnX3Jlc3BvbmRlcl9jbWQgeworCXU4IGVuYWJsZTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKIGVudW0gd21pX3RvZl9jaGFubmVsX2luZm9fcmVwb3J0X3R5cGUgewogCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1RZUEVfQ0lSCQkJPSAweDEsCiAJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9SU1NJCQkJPSAweDIsCkBAIC0xMDIyLDcgKzExMzYsOTkgQEAKIAlfX2xlMzIgdHhfb2Zmc2V0OwogCS8qIFJYIGRlbGF5IG9mZnNldCAqLwogCV9fbGUzMiByeF9vZmZzZXQ7Ci0JX19sZTMyIHJlc2VydmVkWzJdOworCS8qIE1hc2sgdG8gZGVmaW5lIHdoaWNoIFJGcyB0byBjb25maWd1cmUuIDAgbWVhbnMgYWxsIFJGcyAqLworCV9fbGUzMiByZl9tYXNrOworCS8qIE9mZnNldCB0byBzdHJvbmdlc3QgdGFwIG9mIENJUiAqLworCV9fbGUzMiBwcmVjdXJzb3I7Cit9IF9fcGFja2VkOworCisvKiBXTUlfVE9GX0dFVF9UWF9SWF9PRkZTRVRfQ01ESUQgKi8KK3N0cnVjdCB3bWlfdG9mX2dldF90eF9yeF9vZmZzZXRfY21kIHsKKwkvKiByZiBpbmRleCB0byByZWFkIG9mZnNldHMgZnJvbSAqLworCXU4IHJmX2luZGV4OworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworLyogV01JX0ZJWEVEX1NDSEVEVUxJTkdfQ09ORklHX0NNRElEICovCitzdHJ1Y3Qgd21pX21hcF9tY3NfdG9fc2NoZF9wYXJhbXMgeworCXU4IG1jczsKKwkvKiB0aW1lIGluIHVzZWMgZnJvbSBzdGFydCBzbG90IHRvIHN0YXJ0IHR4IGZsb3cgLSBkZWZhdWx0IDE1ICovCisJdTggdGltZV9pbl91c2VjX2JlZm9yZV9pbml0aWF0ZV90eDsKKwkvKiBSRCBlbmFibGUgLSBpZiB5ZXMgY29uc2lkZXIgUkQgYWNjb3JkaW5nIHRvIFNUQSBtY3MgKi8KKwl1OCByZF9lbmFibGVkOworCXU4IHJlc2VydmVkOworCS8qIHRpbWUgaW4gdXNlYyBmcm9tIHN0YXJ0IHNsb3QgdG8gc3RvcCB2cmluZyAqLworCV9fbGUxNiB0aW1lX2luX3VzZWNfdG9fc3RvcF92cmluZzsKKwkvKiB0aW1lb3V0IHRvIGZvcmNlIGZsdXNoIGZyb20gc3RhcnQgb2Ygc2xvdCAqLworCV9fbGUxNiBmbHVzaF90b19pbl91c2VjOworCS8qIHBlciBtY3MgdGhlIG1hYyBidWZmZXIgbGltaXQgc2l6ZSBpbiBieXRlcyAqLworCV9fbGUzMiBtYWNfYnVmZl9zaXplX2luX2J5dGVzOworfSBfX3BhY2tlZDsKKworLyogV01JX0ZJWEVEX1NDSEVEVUxJTkdfQ09ORklHX0NPTVBMRVRFX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfZml4ZWRfc2NoZWR1bGluZ19jb25maWdfY29tcGxldGVfZXZlbnQgeworCS8qIHdtaV9md19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFdNSV9OVU1fTUNTCSgxMykKKworLyogV01JX0ZJWEVEX1NDSEVEVUxJTkdfQ09ORklHX0NNRElEICovCitzdHJ1Y3Qgd21pX2ZpeGVkX3NjaGVkdWxpbmdfY29uZmlnX2NtZCB7CisJLyogZGVmYXVsdHMgaW4gdGhlIFNBUyB0YWJsZSAqLworCXN0cnVjdCB3bWlfbWFwX21jc190b19zY2hkX3BhcmFtcyBtY3NfdG9fc2NoZF9wYXJhbXNfbWFwW1dNSV9OVU1fTUNTXTsKKwkvKiBkZWZhdWx0IDE1MCB1U2VjICovCisJX19sZTE2IG1heF9zdGFfcmRfcHBkdV9kdXJhdGlvbl9pbl91c2VjOworCS8qIGRlZmF1bHQgMzAwIHVTZWMgKi8KKwlfX2xlMTYgbWF4X3N0YV9ncmFudF9wcGR1X2R1cmF0aW9uX2luX3VzZWM7CisJLyogZGVmYXVsdCAxMDAwIHVTZWMgKi8KKwlfX2xlMTYgYXNzb2Nfc2xvdF9kdXJhdGlvbl9pbl91c2VjOworCS8qIGRlZmF1bHQgMzYwIHVTZWMgKi8KKwlfX2xlMTYgdmlydHVhbF9zbG90X2R1cmF0aW9uX2luX3VzZWM7CisJLyogZWFjaCB0aGlzIGZpZWxkIHZhbHVlIHNsb3RzIHN0YXJ0IHdpdGggZ3JhbnQgZnJhbWUgdG8gdGhlIHN0YXRpb24KKwkgKiAtIGRlZmF1bHQgMgorCSAqLworCXU4IG51bWJlcl9vZl9hcF9zbG90c19mb3JfaW5pdGlhdGVfZ3JhbnQ7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBXTUlfRU5BQkxFX0ZJWEVEX1NDSEVEVUxJTkdfQ01ESUQgKi8KK3N0cnVjdCB3bWlfZW5hYmxlX2ZpeGVkX3NjaGVkdWxpbmdfY21kIHsKKwlfX2xlMzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfRU5BQkxFX0ZJWEVEX1NDSEVEVUxJTkdfQ09NUExFVEVfRVZFTlRJRCAqLworc3RydWN0IHdtaV9lbmFibGVfZml4ZWRfc2NoZWR1bGluZ19jb21wbGV0ZV9ldmVudCB7CisJLyogd21pX2Z3X3N0YXR1cyAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9TRVRfTVVMVElfRElSRUNURURfT01OSVNfQ09ORklHX0NNRElEICovCitzdHJ1Y3Qgd21pX3NldF9tdWx0aV9kaXJlY3RlZF9vbW5pc19jb25maWdfY21kIHsKKwkvKiBudW1iZXIgb2YgZGlyZWN0ZWQgb21uaXMgYXQgZGVzdGluYXRpb24gQVAgKi8KKwl1OCBkZXN0X2FwX251bV9kaXJlY3RlZF9vbW5pczsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9TRVRfTVVMVElfRElSRUNURURfT01OSVNfQ09ORklHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfc2V0X211bHRpX2RpcmVjdGVkX29tbmlzX2NvbmZpZ19ldmVudCB7CisJLyogd21pX2Z3X3N0YXR1cyAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9TRVRfTE9OR19SQU5HRV9DT05GSUdfQ01ESUQgKi8KK3N0cnVjdCB3bWlfc2V0X2xvbmdfcmFuZ2VfY29uZmlnX2NtZCB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyogV01JX1NFVF9MT05HX1JBTkdFX0NPTkZJR19DT01QTEVURV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3NldF9sb25nX3JhbmdlX2NvbmZpZ19jb21wbGV0ZV9ldmVudCB7CisJLyogd21pX2Z3X3N0YXR1cyAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSSBFdmVudHMKQEAgLTEwMzgsMTkgKzEyNDQsMjIgQEAKIAlXTUlfRldfUkVBRFlfRVZFTlRJRAkJCQk9IDB4MTgwMSwKIAlXTUlfRVhJVF9GQVNUX01FTV9BQ0NfTU9ERV9FVkVOVElECQk9IDB4MjAwLAogCVdNSV9FQ0hPX1JTUF9FVkVOVElECQkJCT0gMHgxODAzLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfRlNfVFVORV9ET05FX0VWRU5USUQJCQk9IDB4MTgwQSwKKwkvKiBkZXByZWNhdGVkICovCiAJV01JX0NPUlJfTUVBU1VSRV9FVkVOVElECQkJPSAweDE4MEIsCiAJV01JX1JFQURfUlNTSV9FVkVOVElECQkJCT0gMHgxODBDLAogCVdNSV9URU1QX1NFTlNFX0RPTkVfRVZFTlRJRAkJCT0gMHgxODBFLAogCVdNSV9EQ19DQUxJQl9ET05FX0VWRU5USUQJCQk9IDB4MTgwRiwKKwkvKiBkZXByZWNhdGVkICovCiAJV01JX0lRX1RYX0NBTElCX0RPTkVfRVZFTlRJRAkJCT0gMHgxODExLAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfSVFfUlhfQ0FMSUJfRE9ORV9FVkVOVElECQkJPSAweDE4MTIsCiAJV01JX1NFVF9XT1JLX01PREVfRE9ORV9FVkVOVElECQkJPSAweDE4MTUsCiAJV01JX0xPX0xFQUtBR0VfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxNiwKLQlXTUlfTUFSTE9OX1JfUkVBRF9ET05FX0VWRU5USUQJCQk9IDB4MTgxOCwKLQlXTUlfTUFSTE9OX1JfV1JJVEVfRE9ORV9FVkVOVElECQkJPSAweDE4MTksCi0JV01JX01BUkxPTl9SX1RYUlhfU0VMX0RPTkVfRVZFTlRJRAkJPSAweDE4MUEsCisJV01JX0xPX1BPV0VSX0NBTElCX0ZST01fT1RQX0VWRU5USUQJCT0gMHgxODE3LAogCVdNSV9TSUxFTlRfUlNTSV9DQUxJQl9ET05FX0VWRU5USUQJCT0gMHgxODFELAorCS8qIGRlcHJlY2F0ZWQgKi8KIAlXTUlfUkZfUlhfVEVTVF9ET05FX0VWRU5USUQJCQk9IDB4MTgxRSwKIAlXTUlfQ0ZHX1JYX0NIQUlOX0RPTkVfRVZFTlRJRAkJCT0gMHgxODIwLAogCVdNSV9WUklOR19DRkdfRE9ORV9FVkVOVElECQkJPSAweDE4MjEsCkBAIC0xMDYxLDExICsxMjcwLDYgQEAKIAlXTUlfR0VUX1NTSURfRVZFTlRJRAkJCQk9IDB4MTgyOCwKIAlXTUlfR0VUX1BDUF9DSEFOTkVMX0VWRU5USUQJCQk9IDB4MTgyQSwKIAlXTUlfU1dfVFhfQ09NUExFVEVfRVZFTlRJRAkJCT0gMHgxODJCLAotCVdNSV9SRUFEX01BQ19SWFFfRVZFTlRJRAkJCT0gMHgxODMwLAotCVdNSV9SRUFEX01BQ19UWFFfRVZFTlRJRAkJCT0gMHgxODMxLAotCVdNSV9XUklURV9NQUNfUlhRX0VWRU5USUQJCQk9IDB4MTgzMiwKLQlXTUlfV1JJVEVfTUFDX1RYUV9FVkVOVElECQkJPSAweDE4MzMsCi0JV01JX1dSSVRFX01BQ19YUV9GSUVMRF9FVkVOVElECQkJPSAweDE4MzQsCiAJV01JX0JFQU1GT1JNSU5HX01HTVRfRE9ORV9FVkVOVElECQk9IDB4MTgzNiwKIAlXTUlfQkZfVFhTU19NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODM3LAogCVdNSV9CRl9SWFNTX01HTVRfRE9ORV9FVkVOVElECQkJPSAweDE4MzksCkBAIC0xMDc2LDggKzEyODAsMTIgQEAKIAlXTUlfVFhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJCT0gMHgxODQxLAogCVdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9ET05FX0VWRU5USUQJPSAweDE4NDIsCiAJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfRE9ORV9FVkVOVElECQk9IDB4MTg0MywKLQlXTUlfT1RQX1JFQURfUkVTVUxUX0VWRU5USUQJCQk9IDB4MTg1NiwKKwlXTUlfUkZfWFBNX1JFQURfUkVTVUxUX0VWRU5USUQJCQk9IDB4MTg1NiwKKwlXTUlfUkZfWFBNX1dSSVRFX1JFU1VMVF9FVkVOVElECQkJPSAweDE4NTcsCiAJV01JX0xFRF9DRkdfRE9ORV9FVkVOVElECQkJPSAweDE4NTgsCisJV01JX1NFVF9TSUxFTlRfUlNTSV9UQUJMRV9ET05FX0VWRU5USUQJCT0gMHgxODVDLAorCVdNSV9SRl9QV1JfT05fREVMQVlfUlNQX0VWRU5USUQJCQk9IDB4MTg1RCwKKwlXTUlfU0VUX0hJR0hfUE9XRVJfVEFCTEVfUEFSQU1TX0VWRU5USUQJCT0gMHgxODVFLAogCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZXZlbnRzICovCiAJV01JX0RBVEFfUE9SVF9PUEVOX0VWRU5USUQJCQk9IDB4MTg2MCwKIAlXTUlfV0JFX0xJTktfRE9XTl9FVkVOVElECQkJPSAweDE4NjEsCkBAIC0xMTA2LDE0ICsxMzE0LDYgQEAKIAlXTUlfUENQX0ZBQ1RPUl9FVkVOVElECQkJCT0gMHgxOTFBLAogCS8qIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbiBFdmVudHMgKi8KIAlXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0VWRU5USUQJCQk9IDB4MTkxQywKLQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLwotCVdNSV9QU19ERVZfQ0ZHX0VWRU5USUQJCQkJPSAweDE5MUQsCi0JLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KLQlXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQJCQk9IDB4MTkxRSwKLQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLwotCVdNSV9QU19NSURfQ0ZHX0VWRU5USUQJCQkJPSAweDE5MUYsCi0JLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KLQlXTUlfUFNfTUlEX0NGR19SRUFEX0VWRU5USUQJCQk9IDB4MTkyMCwKIAlXTUlfUlNfQ0ZHX0RPTkVfRVZFTlRJRAkJCQk9IDB4MTkyMSwKIAlXTUlfR0VUX0RFVEFJTEVEX1JTX1JFU19FVkVOVElECQkJPSAweDE5MjIsCiAJV01JX0FPQV9NRUFTX0VWRU5USUQJCQkJPSAweDE5MjMsCkBAIC0xMTIyLDE0ICsxMzIyLDE3IEBACiAJV01JX0dFVF9NR01UX1JFVFJZX0xJTUlUX0VWRU5USUQJCT0gMHgxOTMxLAogCVdNSV9TRVRfVEhFUk1BTF9USFJPVFRMSU5HX0NGR19FVkVOVElECQk9IDB4MTk0MCwKIAlXTUlfR0VUX1RIRVJNQUxfVEhST1RUTElOR19DRkdfRVZFTlRJRAkJPSAweDE5NDEsCisJLyogcmV0dXJuIHRoZSBQb3dlciBTYXZlIHByb2ZpbGUgKi8KKwlXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX1JFQURfRVZFTlRJRAkJPSAweDE5NDIsCiAJV01JX1RPRl9TRVNTSU9OX0VORF9FVkVOVElECQkJPSAweDE5OTEsCiAJV01JX1RPRl9HRVRfQ0FQQUJJTElUSUVTX0VWRU5USUQJCT0gMHgxOTkyLAogCVdNSV9UT0ZfU0VUX0xDUl9FVkVOVElECQkJCT0gMHgxOTkzLAogCVdNSV9UT0ZfU0VUX0xDSV9FVkVOVElECQkJCT0gMHgxOTk0LAogCVdNSV9UT0ZfRlRNX1BFUl9ERVNUX1JFU19FVkVOVElECQk9IDB4MTk5NSwKLQlXTUlfVE9GX0NIQU5ORUxfSU5GT19FVkVOVElECQkJPSAweDE5OTYsCisJV01JX1RPRl9DRkdfUkVTUE9OREVSX0VWRU5USUQJCQk9IDB4MTk5NiwKIAlXTUlfVE9GX1NFVF9UWF9SWF9PRkZTRVRfRVZFTlRJRAkJPSAweDE5OTcsCiAJV01JX1RPRl9HRVRfVFhfUlhfT0ZGU0VUX0VWRU5USUQJCT0gMHgxOTk4LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0VWRU5USUQJCQk9IDB4MTk5OSwKIAlXTUlfR0VUX1JGX1NFQ1RPUl9QQVJBTVNfRE9ORV9FVkVOVElECQk9IDB4MTlBMCwKIAlXTUlfU0VUX1JGX1NFQ1RPUl9QQVJBTVNfRE9ORV9FVkVOVElECQk9IDB4MTlBMSwKIAlXTUlfR0VUX1NFTEVDVEVEX1JGX1NFQ1RPUl9JTkRFWF9ET05FX0VWRU5USUQJPSAweDE5QTIsCkBAIC0xMTM4LDEyICsxMzQxLDE4IEBACiAJV01JX1BSSU9fVFhfU0VDVE9SU19PUkRFUl9FVkVOVElECQk9IDB4MTlBNSwKIAlXTUlfUFJJT19UWF9TRUNUT1JTX05VTUJFUl9FVkVOVElECQk9IDB4MTlBNiwKIAlXTUlfUFJJT19UWF9TRUNUT1JTX1NFVF9ERUZBVUxUX0NGR19FVkVOVElECT0gMHgxOUE3LAorCVdNSV9TQ0hFRFVMSU5HX1NDSEVNRV9FVkVOVElECQkJPSAweDFBMDEsCisJV01JX0ZJWEVEX1NDSEVEVUxJTkdfQ09ORklHX0NPTVBMRVRFX0VWRU5USUQJPSAweDFBMDIsCisJV01JX0VOQUJMRV9GSVhFRF9TQ0hFRFVMSU5HX0NPTVBMRVRFX0VWRU5USUQJPSAweDFBMDMsCisJV01JX1NFVF9NVUxUSV9ESVJFQ1RFRF9PTU5JU19DT05GSUdfRVZFTlRJRAk9IDB4MUEwNCwKKwlXTUlfU0VUX0xPTkdfUkFOR0VfQ09ORklHX0NPTVBMRVRFX0VWRU5USUQJPSAweDFBMDUsCiAJV01JX1NFVF9DSEFOTkVMX0VWRU5USUQJCQkJPSAweDkwMDAsCiAJV01JX0FTU09DX1JFUV9FVkVOVElECQkJCT0gMHg5MDAxLAogCVdNSV9FQVBPTF9SWF9FVkVOVElECQkJCT0gMHg5MDAyLAogCVdNSV9NQUNfQUREUl9SRVNQX0VWRU5USUQJCQk9IDB4OTAwMywKIAlXTUlfRldfVkVSX0VWRU5USUQJCQkJPSAweDkwMDQsCiAJV01JX0FDU19QQVNTSVZFX1NDQU5fQ09NUExFVEVfRVZFTlRJRAkJPSAweDkwMDUsCisJV01JX0NPTU1BTkRfTk9UX1NVUFBPUlRFRF9FVkVOVElECQk9IDB4RkZGRiwKIH07CiAKIC8qIEV2ZW50cyBkYXRhIHN0cnVjdHVyZXMgKi8KQEAgLTEyMDAsNyArMTQwOSw3IEBACiAJX19sZTMyIGJsX21pbm9yOwogCV9fbGUzMiBibF9zdWJtaW5vcjsKIAlfX2xlMzIgYmxfYnVpbGQ7Ci0JLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBGVyBjYXBhYmlsaWVzIGFycmF5ICovCisJLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBGVyBjYXBhYmlsaXRpZXMgYXJyYXkgKi8KIAl1OCBmd19jYXBhYmlsaXRpZXNfbGVuOwogCXU4IHJlc2VydmVkWzNdOwogCS8qIEZXIGNhcGFiaWxpdGllcyBpbmZvCkBAIC0xMjQ1LDcgKzE0NTQsOSBAQAogCV9fbGUzMiBib2FyZF9maWxlX3BsYXRmb3JtX3R5cGU7CiAJLyogYm9hcmQgZmlsZSB2ZXJzaW9uICovCiAJX19sZTMyIGJvYXJkX2ZpbGVfdmVyc2lvbjsKLQlfX2xlMzIgcmVzZXJ2ZWRbMl07CisJLyogZW5hYmxlZCBYSUZzIGJpdCB2ZWN0b3IgKi8KKwlfX2xlMzIgZW5hYmxlZF94aWZfdmVjdG9yOworCV9fbGUzMiByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElEICovCkBAIC0xMjk5LDYgKzE1MTAsOSBAQAogCS8qIGVudW0gd21pX3BoeV9jYXBhYmlsaXR5ICovCiAJdTggcGh5X2NhcGFiaWxpdHk7CiAJdTggbnVtb2ZfYWRkaXRpb25hbF9taWRzOworCS8qIHJmYyByZWFkIGNhbGlicmF0aW9uIHJlc3VsdC4gNS4uMTUgKi8KKwl1OCByZmNfcmVhZF9jYWxpYl9yZXN1bHQ7CisJdTggcmVzZXJ2ZWRbM107CiB9IF9fcGFja2VkOwogCiAvKiBXTUlfTk9USUZZX1JFUV9ET05FX0VWRU5USUQgKi8KQEAgLTEzMDYsNyArMTUyMCw4IEBACiAJLyogYmVhbWZvcm1pbmcgc3RhdHVzLCAwOiBmYWlsOyAxOiBPSzsgMjogcmV0cnlpbmcgKi8KIAlfX2xlMzIgc3RhdHVzOwogCV9fbGU2NCB0c2Y7Ci0JX19sZTMyIHNucl92YWw7CisJczggcnNzaTsKKwl1OCByZXNlcnZlZDBbM107CiAJX19sZTMyIHR4X3RwdDsKIAlfX2xlMzIgdHhfZ29vZHB1dDsKIAlfX2xlMzIgcnhfZ29vZHB1dDsKQEAgLTE1NzYsNyArMTc5MSw3IEBACiAJdTggcmVzZXJ2ZWRbM107CiB9IF9fcGFja2VkOwogCi0vKiBXTUlfQ09SUl9NRUFTVVJFX0VWRU5USUQgKi8KKy8qIFdNSV9DT1JSX01FQVNVUkVfRVZFTlRJRCAtIGRlcHJlY2F0ZWQgKi8KIHN0cnVjdCB3bWlfY29ycl9tZWFzdXJlX2V2ZW50IHsKIAkvKiBzaWduZWQgKi8KIAlfX2xlMzIgaTsKQEAgLTE2MDIsMzEgKzE4MTcsMzUgQEAKIC8qIHdtaV9yeF9tZ210X2luZm8gKi8KIHN0cnVjdCB3bWlfcnhfbWdtdF9pbmZvIHsKIAl1OCBtY3M7Ci0Jczggc25yOworCXM4IHJzc2k7CiAJdTggcmFuZ2U7CiAJdTggc3FpOwogCV9fbGUxNiBzdHlwZTsKIAlfX2xlMTYgc3RhdHVzOwogCV9fbGUzMiBsZW47Ci0JLyogTm90IHJlc29sdmVkIHdoZW4gPT0gMHhGRkZGRkZGRiAgPT0+IEJyb2FkY2FzdCB0byBhbGwgTUlEUyAqLworCS8qIE5vdCByZXNvbHZlZCB3aGVuID09IDB4RkZGRkZGRkYgPT0gPiBCcm9hZGNhc3QgdG8gYWxsIE1JRFMgKi8KIAl1OCBxaWQ7Ci0JLyogTm90IHJlc29sdmVkIHdoZW4gPT0gMHhGRkZGRkZGRiAgPT0+IEJyb2FkY2FzdCB0byBhbGwgTUlEUyAqLworCS8qIE5vdCByZXNvbHZlZCB3aGVuID09IDB4RkZGRkZGRkYgPT0gPiBCcm9hZGNhc3QgdG8gYWxsIE1JRFMgKi8KIAl1OCBtaWQ7CiAJdTggY2lkOwogCS8qIEZyb20gUmFkaW8gTU5HUiAqLwogCXU4IGNoYW5uZWw7CiB9IF9fcGFja2VkOwogCi0vKiB3bWlfb3RwX3JlYWRfd3JpdGVfY21kICovCi1zdHJ1Y3Qgd21pX290cF9yZWFkX3dyaXRlX2NtZCB7Ci0JX19sZTMyIGFkZHI7Ci0JX19sZTMyIHNpemU7Ci0JdTggdmFsdWVzWzBdOworLyogRVZFTlQ6IFdNSV9SRl9YUE1fUkVBRF9SRVNVTFRfRVZFTlRJRCAqLworc3RydWN0IHdtaV9yZl94cG1fcmVhZF9yZXN1bHRfZXZlbnQgeworCS8qIGVudW0gd21pX2Z3X3N0YXR1c19lIC0gc3VjY2Vzcz0wIG9yIGZhaWw9MSAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKKwkvKiByZXF1ZXN0ZWQgbnVtX2J5dGVzIG9mIGRhdGEgKi8KKwl1OCBkYXRhX2J5dGVzWzBdOwogfSBfX3BhY2tlZDsKIAotLyogV01JX09UUF9SRUFEX1JFU1VMVF9FVkVOVElEICovCi1zdHJ1Y3Qgd21pX290cF9yZWFkX3Jlc3VsdF9ldmVudCB7Ci0JdTggcGF5bG9hZFswXTsKKy8qIEVWRU5UOiBXTUlfUkZfWFBNX1dSSVRFX1JFU1VMVF9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3JmX3hwbV93cml0ZV9yZXN1bHRfZXZlbnQgeworCS8qIGVudW0gd21pX2Z3X3N0YXR1c19lIC0gc3VjY2Vzcz0wIG9yIGZhaWw9MSAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9UWF9NR01UX1BBQ0tFVF9FVkVOVElEICovCkBAIC0xNjQ1LDYgKzE4NjQsMjAgQEAKIAlfX2xlMzIgZWNob2VkX3ZhbHVlOwogfSBfX3BhY2tlZDsKIAorLyogV01JX1JGX1BXUl9PTl9ERUxBWV9SU1BfRVZFTlRJRCAqLworc3RydWN0IHdtaV9yZl9wd3Jfb25fZGVsYXlfcnNwX2V2ZW50IHsKKwkvKiB3bWlfZndfc3RhdHVzICovCisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworLyogV01JX1NFVF9ISUdIX1BPV0VSX1RBQkxFX1BBUkFNU19FVkVOVElEICovCitzdHJ1Y3Qgd21pX3NldF9oaWdoX3Bvd2VyX3RhYmxlX3BhcmFtc19ldmVudCB7CisJLyogd21pX2Z3X3N0YXR1cyAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKIC8qIFdNSV9URU1QX1NFTlNFX0RPTkVfRVZFTlRJRAogICoKICAqIE1lYXN1cmUgTUFDIGFuZCByYWRpbyB0ZW1wZXJhdHVyZXMKQEAgLTE3MjIsMTQgKzE5NTUsMjIgQEAKIAl1OCByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKKy8qIFxXTUlfU0VUX0NPTk5FQ1RfU05SX1RIUl9DTURJRCAqLworc3RydWN0IHdtaV9zZXRfY29ubmVjdF9zbnJfdGhyX2NtZCB7CisJdTggZW5hYmxlOworCXU4IHJlc2VydmVkOworCS8qIDEvNCBEYiB1bml0cyAqLworCV9fbGUxNiBvbW5pX3Nucl90aHI7CisJLyogMS80IERiIHVuaXRzICovCisJX19sZTE2IGRpcmVjdF9zbnJfdGhyOworfSBfX3BhY2tlZDsKKwogLyogV01JX0xFRF9DRkdfRE9ORV9FVkVOVElEICovCiBzdHJ1Y3Qgd21pX2xlZF9jZmdfZG9uZV9ldmVudCB7CiAJLyogbGVkIGNvbmZpZyBzdGF0dXMgKi8KIAlfX2xlMzIgc3RhdHVzOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBXTUlfTlVNX01DUwkoMTMpCi0KIC8qIFJhdGUgc2VhcmNoIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbiBwZXIgY29ubmVjdGlvbiAqLwogc3RydWN0IHdtaV9yc19jZmcgewogCS8qIFRoZSBtYXhpbWFsIGFsbG93ZWQgUEVSIGZvciBlYWNoIE1DUwpAQCAtMTc1NCw2ICsxOTk1LDk4IEBACiAJX19sZTMyIG1jc19lbl92ZWM7CiB9IF9fcGFja2VkOwogCisvKiBTbG90IHR5cGVzICovCitlbnVtIHdtaV9zY2hlZF9zY2hlbWVfc2xvdF90eXBlIHsKKwlXTUlfU0NIRURfU0xPVF9TUAkJPSAweDAsCisJV01JX1NDSEVEX1NMT1RfQ0JBUAkJPSAweDEsCisJV01JX1NDSEVEX1NMT1RfSURMRQkJPSAweDIsCisJV01JX1NDSEVEX1NMT1RfQU5OT1VOQ0VfTk9fQUNLCT0gMHgzLAorCVdNSV9TQ0hFRF9TTE9UX0RJU0NPVkVSWQk9IDB4NCwKK307CisKK2VudW0gd21pX3NjaGVkX3NjaGVtZV9zbG90X2ZsYWdzIHsKKwlXTUlfU0NIRURfU0NIRU1FX1NMT1RfUEVSSU9ESUMJPSAweDEsCit9OworCitzdHJ1Y3Qgd21pX3NjaGVkX3NjaGVtZV9zbG90IHsKKwkvKiBpbiBtaWNyb3NlY29uZCAqLworCV9fbGUzMiB0YnR0X29mZnNldDsKKwkvKiB3bWlfc2NoZWRfc2NoZW1lX3Nsb3RfZmxhZ3MgKi8KKwl1OCBmbGFnczsKKwkvKiB3bWlfc2NoZWRfc2NoZW1lX3Nsb3RfdHlwZSAqLworCXU4IHR5cGU7CisJLyogaW4gbWljcm9zZWNvbmQgKi8KKwlfX2xlMTYgZHVyYXRpb247CisJLyogZnJhbWVfZXhjaGFuZ2Vfc2VxdWVuY2VfZHVyYXRpb24gKi8KKwlfX2xlMTYgdHhfb3A7CisJLyogdGltZSBpbiBtaWNyb3NlY29uZHMgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgc2xvdHMKKwkgKiByZWxldmFudCBvbmx5IGlmIGZsYWcgV01JX1NDSEVEX1NDSEVNRV9TTE9UX1BFUklPRElDIHNldAorCSAqLworCV9fbGUxNiBwZXJpb2Q7CisJLyogcmVsZXZhbnQgb25seSBpZiBmbGFnIFdNSV9TQ0hFRF9TQ0hFTUVfU0xPVF9QRVJJT0RJQyBzZXQKKwkgKiBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IGFsbG9jYXRpb24KKwkgKi8KKwl1OCBudW1fb2ZfYmxvY2tzOworCS8qIHJlbGV2YW50IG9ubHkgaWYgZmxhZyBXTUlfU0NIRURfU0NIRU1FX1NMT1RfUEVSSU9ESUMgc2V0CisJICogZXZlcnkgaWRsZV9wZXJpb2QgYWxsb2NhdGlvbiB3aWxsIGJlIGlkbGUKKwkgKi8KKwl1OCBpZGxlX3BlcmlvZDsKKwl1OCBzcmNfYWlkOworCXU4IGRlc3RfYWlkOworCV9fbGUzMiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3NjaGVkX3NjaGVtZV9mbGFncyB7CisJLyogc2hvdWxkIG5vdCBiZSBzZXQgd2hlbiBjbGVhcmluZyBzY2hlZHVsaW5nIHNjaGVtZSAqLworCVdNSV9TQ0hFRF9TQ0hFTUVfRU5BQkxFCQk9IDB4MDEsCisJV01JX1NDSEVEX1BST1RFQ1RFRF9TUAkJPSAweDAyLAorCS8qIHNob3VsZCBiZSBzZXQgb25seSBvbiBmaXJzdCBXTUkgZnJhZ21lbnQgb2Ygc2NoZW1lICovCisJV01JX1NDSEVEX0ZJUlNUCQkJPSAweDA0LAorCS8qIHNob3VsZCBiZSBzZXQgb25seSBvbiBsYXN0IFdNSSBmcmFnbWVudCBvZiBzY2hlbWUgKi8KKwlXTUlfU0NIRURfTEFTVAkJCT0gMHgwOCwKKwlXTUlfU0NIRURfSU1NRURJQVRFX1NUQVJUCT0gMHgxMCwKK307CisKK2VudW0gd21pX3NjaGVkX3NjaGVtZV9hZHZlcnRpc21lbnQgeworCS8qIEVTRSBpcyBub3QgYWR2ZXJ0aXNlZCBhdCBhbGwsIFNUQSBoYXMgdG8gYmUgY29uZmlndXJlZCB3aXRoIFdNSQorCSAqIGFsc28KKwkgKi8KKwlXTUlfQURWRVJUSVNFX0VTRV9ESVNBQkxFRAkJPSAweDAsCisJV01JX0FEVkVSVElTRV9FU0VfSU5fQkVBQ09OCQk9IDB4MSwKKwlXTUlfQURWRVJUSVNFX0VTRV9JTl9BTk5PVU5DRV9GUkFNRQk9IDB4MiwKK307CisKKy8qIFdNSV9TQ0hFRFVMSU5HX1NDSEVNRV9DTUQgKi8KK3N0cnVjdCB3bWlfc2NoZWR1bGluZ19zY2hlbWVfY21kIHsKKwl1OCBzZXJpYWxfbnVtOworCS8qIHdtaV9zY2hlZF9zY2hlbWVfYWR2ZXJ0aXNtZW50ICovCisJdTggZXNlX2FkdmVydGlzbWVudDsKKwkvKiB3bWlfc2NoZWRfc2NoZW1lX2ZsYWdzICovCisJX19sZTE2IGZsYWdzOworCXU4IG51bV9hbGxvY3M7CisJdTggcmVzZXJ2ZWRbM107CisJX19sZTY0IHN0YXJ0X3RidHQ7CisJLyogYWxsb2NhdGlvbnMgbGlzdCAqLworCXN0cnVjdCB3bWlfc2NoZWRfc2NoZW1lX3Nsb3QgYWxsb2NzW1dNSV9TQ0hFRF9NQVhfQUxMT0NTX1BFUl9DTURdOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfc2NoZWRfc2NoZW1lX2ZhaWx1cmVfdHlwZSB7CisJV01JX1NDSEVEX1NDSEVNRV9GQUlMVVJFX05PX0VSUk9SCQk9IDB4MDAsCisJV01JX1NDSEVEX1NDSEVNRV9GQUlMVVJFX09MRF9TVEFSVF9UU0ZfRVJSCT0gMHgwMSwKK307CisKKy8qIFdNSV9TQ0hFRFVMSU5HX1NDSEVNRV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3NjaGVkdWxpbmdfc2NoZW1lX2V2ZW50IHsKKwkvKiB3bWlfZndfc3RhdHVzX2UgKi8KKwl1OCBzdGF0dXM7CisJLyogc2VyaWFsIG51bWJlciBnaXZlbiBpbiBjb21tYW5kICovCisJdTggc2VyaWFsX251bTsKKwkvKiB3bWlfc2NoZWRfc2NoZW1lX2ZhaWx1cmVfdHlwZSAqLworCXU4IGZhaWx1cmVfdHlwZTsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbMV07Cit9IF9fcGFja2VkOworCiAvKiBXTUlfUlNfQ0ZHX0NNRElEICovCiBzdHJ1Y3Qgd21pX3JzX2NmZ19jbWQgewogCS8qIGNvbm5lY3Rpb24gaWQgKi8KQEAgLTE5NzEsNiArMjMwNCwxOSBAQAogCVdNSV9QU19QUk9GSUxFX1RZUEVfTE9XX0xBVEVOQ1lfUFMJPSAweDAzLAogfTsKIAorLyogV01JX1BTX0RFVl9QUk9GSUxFX0NGR19SRUFEX0NNRElEICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9wcm9maWxlX2NmZ19yZWFkX2NtZCB7CisJLyogcmVzZXJ2ZWQgKi8KKwlfX2xlMzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX1JFQURfRVZFTlRJRCAqLworc3RydWN0IHdtaV9wc19kZXZfcHJvZmlsZV9jZmdfcmVhZF9ldmVudCB7CisJLyogd21pX3BzX3Byb2ZpbGVfdHlwZV9lICovCisJdTggcHNfcHJvZmlsZTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKIC8qIFdNSV9QU19ERVZfUFJPRklMRV9DRkdfQ01ESUQKICAqCiAgKiBQb3dlciBzYXZlIHByb2ZpbGUgdG8gYmUgdXNlZCBieSB0aGUgZGV2aWNlCkBAIC0yMDE5LDE1NyArMjM2NSw2IEBACiAJV01JX1BTX0QzX1JFU1BfUE9MSUNZX0FQUFJPVkVECT0gMHgwMiwKIH07CiAKLS8qIERldmljZSBjb21tb24gcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9ucyAqLwotc3RydWN0IHdtaV9wc19kZXZfY2ZnIHsKLQkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSB1bmFzc29jaWF0ZWQsIGVudW0gd21pX3BzX2xldmVsX2UKLQkgKi8KLQl1OCBwc191bmFzc29jX21pbl9sZXZlbDsKLQkvKiBsb3dlc3QgZGVlcCBzbGVlcCBjbG9jayBsZXZlbCB3aGlsZSBub25hc3NvYywgZW51bQotCSAqIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lCi0JICovCi0JdTggcHNfdW5hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKLQkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSBhc3NvY2lhdGVkLCBlbnVtIHdtaV9wc19sZXZlbF9lICovCi0JdTggcHNfYXNzb2NfbWluX2xldmVsOwotCS8qIGxvd2VzdCBkZWVwIHNsZWVwIGNsb2NrIGxldmVsIHdoaWxlIGFzc29jLCBlbnVtCi0JICogd21pX3BzX2RlZXBfc2xlZXBfY2xrX2xldmVsX2UKLQkgKi8KLQl1OCBwc19hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKLQkvKiBlbnVtIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lICovCi0JdTggcHNfYXNzb2NfbG93X2xhdGVuY3lfZHNfbWluX2xldmVsOwotCS8qIGVudW0gd21pX3BzX2QzX3Jlc3BfcG9saWN5X2UgKi8KLQl1OCBwc19EM19yZXNwb25zZV9wb2xpY3k7Ci0JLyogQk9PTCAqLwotCXU4IHBzX0QzX3BtX3BtZV9lbmFibGVkOwotCS8qIEJPT0wgKi8KLQl1OCBwc19oYWxwX2VuYWJsZTsKLQl1OCBwc19kZWVwX3NsZWVwX2VudGVyX3RocmVzaF9tc2VjOwotCS8qIEJPT0wgKi8KLQl1OCBwc192b2x0YWdlX3NjYWxpbmdfZW47Ci19IF9fcGFja2VkOwotCi0vKiBXTUlfUFNfREVWX0NGR19DTURJRAotICoKLSAqIENvbmZpZ3VyZSBjb21tb24gUG93ZXIgU2F2ZSBwYXJhbWV0ZXJzIG9mIHRoZSBkZXZpY2UgYW5kIGFsbCBNSURzLgotICoKLSAqIFJldHVybmVkIGV2ZW50OgotICogLSBXTUlfUFNfREVWX0NGR19FVkVOVElECi0gKi8KLXN0cnVjdCB3bWlfcHNfZGV2X2NmZ19jbWQgewotCS8qIERldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gYmUgYXBwbGllZCAqLwotCXN0cnVjdCB3bWlfcHNfZGV2X2NmZyBwc19kZXZfY2ZnOwotCS8qIGFsaWdubWVudCB0byAzMmIgKi8KLQl1OCByZXNlcnZlZFsyXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdNSV9QU19ERVZfQ0ZHX0VWRU5USUQgKi8KLXN0cnVjdCB3bWlfcHNfZGV2X2NmZ19ldmVudCB7Ci0JLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KLQlfX2xlMzIgc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotLyogV01JX1BTX0RFVl9DRkdfUkVBRF9DTURJRAotICoKLSAqIHJlcXVlc3QgdG8gcmV0cmlldmUgIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24KLSAqIChXTUlfUFNfREVWX0NGR19DTUQgcGFyYW1zKQotICoKLSAqIFJldHVybmVkIGV2ZW50OgotICogLSBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQKLSAqLwotc3RydWN0IHdtaV9wc19kZXZfY2ZnX3JlYWRfY21kIHsKLQlfX2xlMzIgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQgKi8KLXN0cnVjdCB3bWlfcHNfZGV2X2NmZ19yZWFkX2V2ZW50IHsKLQkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLwotCV9fbGUzMiBzdGF0dXM7Ci0JLyogUmV0cmlldmVkIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gKFdNSV9QU19ERVZfQ0ZHX0NNRAotCSAqIHBhcmFtcykKLQkgKi8KLQlzdHJ1Y3Qgd21pX3BzX2Rldl9jZmcgZGV2X3BzX2NmZzsKLQkvKiBhbGlnbm1lbnQgdG8gMzJiICovCi0JdTggcmVzZXJ2ZWRbMl07Ci19IF9fcGFja2VkOwotCi0vKiBQZXIgTWFjIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbnMgKi8KLXN0cnVjdCB3bWlfcHNfbWlkX2NmZyB7Ci0JLyogTG93IHBvd2VyIFJYIGluIEJUSSBpcyBlbmFibGVkLCBCT09MICovCi0JdTggYmVhY29uX2xwcnhfZW5hYmxlOwotCS8qIFN5bmMgdG8gc2VjdG9yIElEIGVuYWJsZWQsIEJPT0wgKi8KLQl1OCBiZWFjb25fc3luY190b19zZWN0b3JJZF9lbmFibGU7Ci0JLyogTG93IHBvd2VyIFJYIGluIERUSSBpcyBlbmFibGVkLCBCT09MICovCi0JdTggZnJhbWVfZXhjaGFuZ2VfbHByeF9lbmFibGU7Ci0JLyogU2xlZXAgQ3ljbGUgd2hpbGUgaW4gc2NoZWR1bGVkIFBTLCAxLTMxICovCi0JdTggc2NoZWR1bGVkX3NsZWVwX2N5Y2xlX3BvdzI7Ci0JLyogU3RheSBBd2FrZSBmb3IgayBCSXMgZXZlcnkgKHNsZWVwX2N5Y2xlIC0gaykgQklzLCAxLTMxICovCi0JdTggc2NoZWR1bGVkX251bV9vZl9hd2FrZV9iaXM7Ci0JdTggYW1fdG9fdHJhZmZpY19sb2FkX3RocmVzaF9tYnA7Ci0JdTggdHJhZmZpY190b19hbV9sb2FkX3RocmVzaF9tYnBzOwotCXU4IHRyYWZmaWNfdG9fYW1fbnVtX29mX25vX3RyYWZmaWNfYmlzOwotCS8qIEJPT0wgKi8KLQl1OCBjb250aW51b3VzX3RyYWZmaWNfcHNtOwotCV9fbGUxNiBub190cmFmZmljX3RvX21pbl91c2VjOwotCV9fbGUxNiBub190cmFmZmljX3RvX21heF91c2VjOwotCV9fbGUxNiBzbm9vemluZ19zbGVlcF9pbnRlcnZhbF9taWxpc2VjOwotCXU4IG1heF9ub19kYXRhX2F3YWtlX2V2ZW50czsKLQkvKiBUcmlnZ2VyIFdFQiBhZnRlciBrIGZhaWxlZCBiZWFjb25zICovCi0JdTggbnVtX29mX2ZhaWxlZF9iZWFjb25zX3J4X3RvX3RyaWdnZXJfd2ViOwotCS8qIFRyaWdnZXIgQkYgYWZ0ZXIgayBmYWlsZWQgYmVhY29ucyAqLwotCXU4IG51bV9vZl9mYWlsZWRfYmVhY29uc19yeF90b190cmlnZ2VyX2JmOwotCS8qIFRyaWdnZXIgU09CIGFmdGVyIGsgc3VjY2Vzc2Z1bCBiZWFjb25zICovCi0JdTggbnVtX29mX3N1Y2Nlc3NmdWxfYmVhY29uc19yeF90b190cmlnZ2VyX3NvYjsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdNSV9QU19NSURfQ0ZHX0NNRElECi0gKgotICogQ29uZmlndXJlIFBvd2VyIFNhdmUgcGFyYW1ldGVycyBvZiBhIHNwZWNpZmljIE1JRC4KLSAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgQlNTIHRoaXMgTUlEIGJlbG9uZ3MgdG8uCi0gKgotICogUmV0dXJuZWQgZXZlbnQ6Ci0gKiAtIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQKLSAqLwotc3RydWN0IHdtaV9wc19taWRfY2ZnX2NtZCB7Ci0JLyogTUFDIElEICovCi0JdTggbWlkOwotCS8qIG1pZCBQUyBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQgKi8KLQlzdHJ1Y3Qgd21pX3BzX21pZF9jZmcgcHNfbWlkX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQgKi8KLXN0cnVjdCB3bWlfcHNfbWlkX2NmZ19ldmVudCB7Ci0JLyogTUFDIElEICovCi0JdTggbWlkOwotCS8qIGFsaWdubWVudCB0byAzMmIgKi8KLQl1OCByZXNlcnZlZFszXTsKLQkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLwotCV9fbGUzMiBzdGF0dXM7Ci19IF9fcGFja2VkOwotCi0vKiBXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECi0gKgotICogcmVxdWVzdCB0byByZXRyaWV2ZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gb2YgbWlkCi0gKiAoV01JX1BTX01JRF9DRkdfQ01EIHBhcmFtcykKLSAqCi0gKiBSZXR1cm5lZCBldmVudDoKLSAqIC0gV01JX1BTX01JRF9DRkdfUkVBRF9FVkVOVElECi0gKi8KLXN0cnVjdCB3bWlfcHNfbWlkX2NmZ19yZWFkX2NtZCB7Ci0JLyogTUFDIElEICovCi0JdTggbWlkOwotCS8qIGFsaWdubWVudCB0byAzMmIgKi8KLQl1OCByZXNlcnZlZFszXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIFdNSV9QU19NSURfQ0ZHX1JFQURfRVZFTlRJRCAqLwotc3RydWN0IHdtaV9wc19taWRfY2ZnX3JlYWRfZXZlbnQgewotCS8qIE1BQyBJRCAqLwotCXU4IG1pZDsKLQkvKiBSZXRyaWV2ZWQgTUlEIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbihXTUlfUFNfTUlEX0NGR19DTUQgcGFyYW1zKSAqLwotCXN0cnVjdCB3bWlfcHNfbWlkX2NmZyBtaWRfcHNfY2ZnOwotCS8qIHdtaV9wc19jZmdfY21kX3N0YXR1c19lICovCi0JX19sZTMyIHN0YXR1czsKLX0gX19wYWNrZWQ7Ci0KICNkZWZpbmUgV01JX0FPQV9NQVhfREFUQV9TSVpFCSgxMjgpCiAKIGVudW0gd21pX2FvYV9tZWFzX3N0YXR1cyB7CkBAIC0yMjYwLDYgKzI0NTUsMjAgQEAKIAl1OCByZXNlcnZlZFszXTsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9UT0ZfU0VUX0xDSV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3RvZl9zZXRfbGNpX2V2ZW50IHsKKwkvKiBlbnVtIHdtaV9md19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBXTUlfVE9GX1NFVF9MQ1JfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2Zfc2V0X2xjcl9ldmVudCB7CisJLyogZW51bSB3bWlfZndfc3RhdHVzICovCisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKwogLyogUmVzcG9uZGVyIEZUTSBSZXN1bHRzICovCiBzdHJ1Y3Qgd21pX3Jlc3BvbmRlcl9mdG1fcmVzIHsKIAl1OCB0MVs2XTsKQEAgLTIzMTMsMTAgKzI1MjIsMTkgQEAKIAlfX2xlMzIgdHNmX3N5bmM7CiAJLyogYWN0dWFsIHJlY2VpdmVkIGZ0bSBwZXIgYnVyc3QgKi8KIAl1OCBhY3R1YWxfZnRtX3Blcl9idXJzdDsKLQl1OCByZXNlcnZlZDBbN107CisJLyogTWVhc3VybWVudHMgYXJlIGZyb20gUkZzLCBkZWZpbmVkIGJ5IHRoZSBtYXNrICovCisJX19sZTMyIG1lYXNfcmZfbWFzazsKKwl1OCByZXNlcnZlZDBbM107CiAJc3RydWN0IHdtaV9yZXNwb25kZXJfZnRtX3JlcyByZXNwb25kZXJfZnRtX3Jlc1swXTsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9UT0ZfQ0ZHX1JFU1BPTkRFUl9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3RvZl9jZmdfcmVzcG9uZGVyX2V2ZW50IHsKKwkvKiBlbnVtIHdtaV9md19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCiBlbnVtIHdtaV90b2ZfY2hhbm5lbF9pbmZvX3R5cGUgewogCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0FPQQkJPSAweDAwLAogCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0xDSQkJPSAweDAxLApAQCAtMjM1MywxMiArMjU3MSwxNSBAQAogc3RydWN0IHdtaV90b2ZfZ2V0X3R4X3J4X29mZnNldF9ldmVudCB7CiAJLyogZW51bSB3bWlfZndfc3RhdHVzICovCiAJdTggc3RhdHVzOwotCXU4IHJlc2VydmVkMVszXTsKKwkvKiBSRiBpbmRleCB1c2VkIHRvIHJlYWQgdGhlIG9mZnNldHMgKi8KKwl1OCByZl9pbmRleDsKKwl1OCByZXNlcnZlZDFbMl07CiAJLyogVFggZGVsYXkgb2Zmc2V0ICovCiAJX19sZTMyIHR4X29mZnNldDsKIAkvKiBSWCBkZWxheSBvZmZzZXQgKi8KIAlfX2xlMzIgcnhfb2Zmc2V0OwotCV9fbGUzMiByZXNlcnZlZDJbMl07CisJLyogT2Zmc2V0IHRvIHN0cm9uZ2VzdCB0YXAgb2YgQ0lSICovCisJX19sZTMyIHByZWN1cnNvcjsKIH0gX19wYWNrZWQ7CiAKIC8qIFJlc3VsdCBzdGF0dXMgY29kZXMgZm9yIFdNSSBjb21tYW5kcyAqLwpAQCAtMjYyMSw0ICsyODQyLDIzIEBACiAJdTggcmVzZXJ2ZWRbM107CiB9IF9fcGFja2VkOwogCisvKiBXTUlfU0VUX1NJTEVOVF9SU1NJX1RBQkxFX0RPTkVfRVZFTlRJRCAqLworc3RydWN0IHdtaV9zZXRfc2lsZW50X3Jzc2lfdGFibGVfZG9uZV9ldmVudCB7CisJLyogZW51bSB3bWlfc2lsZW50X3Jzc2lfc3RhdHVzICovCisJX19sZTMyIHN0YXR1czsKKwkvKiBlbnVtIHdtaV9zaWxlbnRfcnNzaV90YWJsZSAqLworCV9fbGUzMiB0YWJsZTsKK30gX19wYWNrZWQ7CisKKy8qIFxXTUlfQ09NTUFORF9OT1RfU1VQUE9SVEVEX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfY29tbWFuZF9ub3Rfc3VwcG9ydGVkX2V2ZW50IHsKKwkvKiBkZXZpY2UgaWQgKi8KKwl1OCBtaWQ7CisJdTggcmVzZXJ2ZWQwOworCV9fbGUxNiBjb21tYW5kX2lkOworCS8qIGZvciBVVCBjb21tYW5kIG9ubHksIG90aGVyd2lzZSByZXNlcnZlZCAqLworCV9fbGUxNiBjb21tYW5kX3N1YnR5cGU7CisJX19sZTE2IHJlc2VydmVkMTsKK30gX19wYWNrZWQ7CisKICNlbmRpZiAvKiBfX1dJTE9DSVRZX1dNSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmMKaW5kZXggYjg1Mzk4Yy4uMjYxYTBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmMKQEAgLTU0MTksNiArNTQxOSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZDsKIAlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKmJpOwogCXN0cnVjdCBicmNtdV9jaGFuIGNoOworCXN0cnVjdCBjZmc4MDIxMV9yb2FtX2luZm8gcm9hbV9pbmZvID0ge307CiAJdTMyIGZyZXE7CiAJczMyIGVyciA9IDA7CiAJdTggKmJ1ZjsKQEAgLTU0NTcsOSArNTQ1OCwxNSBAQAogCiBkb25lOgogCWtmcmVlKGJ1Zik7Ci0JY2ZnODAyMTFfcm9hbWVkKG5kZXYsIG5vdGlmeV9jaGFubmVsLCAodTggKilwcm9maWxlLT5ic3NpZCwKLQkJCWNvbm5faW5mby0+cmVxX2llLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCi0JCQljb25uX2luZm8tPnJlc3BfaWUsIGNvbm5faW5mby0+cmVzcF9pZV9sZW4sIEdGUF9LRVJORUwpOworCisJcm9hbV9pbmZvLmNoYW5uZWwgPSBub3RpZnlfY2hhbm5lbDsKKwlyb2FtX2luZm8uYnNzaWQgPSBwcm9maWxlLT5ic3NpZDsKKwlyb2FtX2luZm8ucmVxX2llID0gY29ubl9pbmZvLT5yZXFfaWU7CisJcm9hbV9pbmZvLnJlcV9pZV9sZW4gPSBjb25uX2luZm8tPnJlcV9pZV9sZW47CisJcm9hbV9pbmZvLnJlc3BfaWUgPSBjb25uX2luZm8tPnJlc3BfaWU7CisJcm9hbV9pbmZvLnJlc3BfaWVfbGVuID0gY29ubl9pbmZvLT5yZXNwX2llX2xlbjsKKworCWNmZzgwMjExX3JvYW1lZChuZGV2LCAmcm9hbV9pbmZvLCBHRlBfS0VSTkVMKTsKIAlicmNtZl9kYmcoQ09OTiwgIlJlcG9ydCByb2FtaW5nIHJlc3VsdFxuIik7CiAKIAlzZXRfYml0KEJSQ01GX1ZJRl9TVEFUVVNfQ09OTkVDVEVELCAmaWZwLT52aWYtPnNtZV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uYwppbmRleCA4NzQ0YjliLi44ZTNjNmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMKQEAgLTQxNjEsMTEgKzQxNjEsNiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JLyogYWxsb2NhdGUgc2NhdHRlci1nYXRoZXIgdGFibGUuIHNnIHN1cHBvcnQKLQkgKiB3aWxsIGJlIGRpc2FibGVkIHVwb24gYWxsb2NhdGlvbiBmYWlsdXJlLgotCSAqLwotCWJyY21mX3NkaW9kX3NndGFibGVfYWxsb2MoYnVzLT5zZGlvZGV2KTsKLQogCS8qIFF1ZXJ5IHRoZSBGMiBibG9jayBzaXplLCBzZXQgcm91bmR1cCBhY2NvcmRpbmdseSAqLwogCWJ1cy0+YmxvY2tzaXplID0gYnVzLT5zZGlvZGV2LT5mdW5jWzJdLT5jdXJfYmxrc2l6ZTsKIAlidXMtPnJvdW5kdXAgPSBtaW4obWF4X3JvdW5kdXAsIGJ1cy0+YmxvY2tzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvZHZtL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS90eC5jCmluZGV4IDRiOTczNzEuLjgzODk0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvZHZtL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9kdm0vdHguYwpAQCAtMTE5MCwxMSArMTE5MCwxMSBAQAogCQkJCW5leHRfcmVjbGFpbWVkOwogCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJOZXh0IHJlY2xhaW1lZCBwYWNrZXQ6JWRcbiIsCiAJCQkJCQkgIG5leHRfcmVjbGFpbWVkKTsKKwkJCWl3bGFnbl9jaGVja19yYXRpZF9lbXB0eShwcml2LCBzdGFfaWQsIHRpZCk7CiAJCX0KIAogCQlpd2xfdHJhbnNfcmVjbGFpbShwcml2LT50cmFucywgdHhxX2lkLCBzc24sICZza2JzKTsKIAotCQlpd2xhZ25fY2hlY2tfcmF0aWRfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQpOwogCQlmcmVlZCA9IDA7CiAKIAkJLyogcHJvY2VzcyBmcmFtZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYwppbmRleCAyZjgxMzRiLi4xNzdmZDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jCkBAIC00MjksNiArNDI5LDcgQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVCLCAweDUyMEEsIGl3bDcyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA5NUEsIDB4OTAwMCwgaXdsNzI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg5NDAwLCBpd2w3MjY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgwOTVBLCAweDlFMTAsIGl3bDcyNjVfMmFjX2NmZyl9LAogCiAvKiA4MDAwIFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4MDAxMCwgaXdsODI2MF8yYWNfY2ZnKX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9wNTQvZndpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvcDU0L2Z3aW8uYwppbmRleCAyNTdhOWVhLi40YWM2NzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9wNTQvZndpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL3A1NC9md2lvLmMKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCiAJCQllbnRyeSArPSBzaXplb2YoX19sZTE2KTsKIAkJCWNoYW4tPnBhX3BvaW50c19wZXJfY3VydmUgPSA4OwotCQkJbWVtc2V0KGNoYW4tPmN1cnZlX2RhdGEsIDAsIHNpemVvZigqY2hhbi0+Y3VydmVfZGF0YSkpOworCQkJbWVtc2V0KGNoYW4tPmN1cnZlX2RhdGEsIDAsIHNpemVvZihjaGFuLT5jdXJ2ZV9kYXRhKSk7CiAJCQltZW1jcHkoY2hhbi0+Y3VydmVfZGF0YSwgZW50cnksCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwNTRfcGFfY3VydmVfZGF0YV9zYW1wbGUpICoKIAkJCSAgICAgICBtaW4oKHU4KTgsIGN1cnZlX2RhdGEtPnBvaW50c19wZXJfY2hhbm5lbCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwppbmRleCBhZmRiYmY1Li44Njc3YTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwpAQCAtNDE4OCw3ICs0MTg4LDcgQEAKIAlpZiAoYWRhcHRlci0+Y29uZmlnX2JhbmRzICYgQkFORF9BKQogCQluX2NoYW5uZWxzX2EgPSBtd2lmaWV4X2JhbmRfNWdoei5uX2NoYW5uZWxzOwogCi0JYWRhcHRlci0+bnVtX2luX2NoYW5fc3RhdHMgPSBtYXhfdCh1MzIsIG5fY2hhbm5lbHNfYmcsIG5fY2hhbm5lbHNfYSk7CisJYWRhcHRlci0+bnVtX2luX2NoYW5fc3RhdHMgPSBuX2NoYW5uZWxzX2JnICsgbl9jaGFubmVsc19hOwogCWFkYXB0ZXItPmNoYW5fc3RhdHMgPSB2bWFsbG9jKHNpemVvZigqYWRhcHRlci0+Y2hhbl9zdGF0cykgKgogCQkJCSAgICAgIGFkYXB0ZXItPm51bV9pbl9jaGFuX3N0YXRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMKaW5kZXggOTdjOTc2NS4uNzhkNTlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Nhbi5jCkBAIC0yNDc5LDYgKzI0NzksMTIgQEAKIAkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2NoYW5fc3RhdHMpOwogCiAJZm9yIChpID0gMCA7IGkgPCBudW1fY2hhbjsgaSsrKSB7CisJCWlmIChhZGFwdGVyLT5zdXJ2ZXlfaWR4ID49IGFkYXB0ZXItPm51bV9pbl9jaGFuX3N0YXRzKSB7CisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBXQVJOLAorCQkJCSAgICAiRlcgcmVwb3J0ZWQgdG9vIG1hbnkgY2hhbm5lbCByZXN1bHRzIChtYXggJWQpXG4iLAorCQkJCSAgICBhZGFwdGVyLT5udW1faW5fY2hhbl9zdGF0cyk7CisJCQlyZXR1cm47CisJCX0KIAkJY2hhbl9zdGF0cy5jaGFuX251bSA9IGZ3X2NoYW5fc3RhdHMtPmNoYW5fbnVtOwogCQljaGFuX3N0YXRzLmJhbmRjZmcgPSBmd19jaGFuX3N0YXRzLT5iYW5kY2ZnOwogCQljaGFuX3N0YXRzLmZsYWdzID0gZndfY2hhbl9zdGF0cy0+ZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMKaW5kZXggNWJlNGZjOS4uNzVmZmVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9wY2kuYwpAQCAtMjI2OSw3ICsyMjY5LDcgQEAKIAkvKiBmaW5kIGFkYXB0ZXIgKi8KIAlpZiAoIV9ydGxfcGNpX2ZpbmRfYWRhcHRlcihwZGV2LCBodykpIHsKIAkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBmYWlsMzsKKwkJZ290byBmYWlsMjsKIAl9CiAKIAkvKiBJbml0IElPIGhhbmRsZXIgKi8KQEAgLTIzMzksMTAgKzIzMzksMTAgQEAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJcnRsX2RlaW5pdF9jb3JlKGh3KTsKIAorZmFpbDI6CiAJaWYgKHJ0bHByaXYtPmlvLnBjaV9tZW1fc3RhcnQgIT0gMCkKIAkJcGNpX2lvdW5tYXAocGRldiwgKHZvaWQgX19pb21lbSAqKXJ0bHByaXYtPmlvLnBjaV9tZW1fc3RhcnQpOwogCi1mYWlsMjoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCWNvbXBsZXRlKCZydGxwcml2LT5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCmluZGV4IDYwM2M5MDQuLjI4MDE5NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKQEAgLTI4MzAsMTUgKzI4MzAsMjIgQEAKIAl9CiAKIAlpZiAocHJpdi0+aW5mcmFfbW9kZSA9PSBORElTXzgwMjExX0lORlJBX0lORlJBKSB7Ci0JCWlmICghcm9hbWVkKQorCQlpZiAoIXJvYW1lZCkgewogCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQodXNiZGV2LT5uZXQsIGJzc2lkLCByZXFfaWUsCiAJCQkJCQlyZXFfaWVfbGVuLCByZXNwX2llLAogCQkJCQkJcmVzcF9pZV9sZW4sIDAsIEdGUF9LRVJORUwpOwotCQllbHNlCi0JCQljZmc4MDIxMV9yb2FtZWQodXNiZGV2LT5uZXQsCi0JCQkJCWdldF9jdXJyZW50X2NoYW5uZWwodXNiZGV2LCBOVUxMKSwKLQkJCQkJYnNzaWQsIHJlcV9pZSwgcmVxX2llX2xlbiwKLQkJCQkJcmVzcF9pZSwgcmVzcF9pZV9sZW4sIEdGUF9LRVJORUwpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyByb2FtX2luZm8gPSB7CisJCQkJLmNoYW5uZWwgPSBnZXRfY3VycmVudF9jaGFubmVsKHVzYmRldiwgTlVMTCksCisJCQkJLmJzc2lkID0gYnNzaWQsCisJCQkJLnJlcV9pZSA9IHJlcV9pZSwKKwkJCQkucmVxX2llX2xlbiA9IHJlcV9pZV9sZW4sCisJCQkJLnJlc3BfaWUgPSByZXNwX2llLAorCQkJCS5yZXNwX2llX2xlbiA9IHJlc3BfaWVfbGVuLAorCQkJfTsKKworCQkJY2ZnODAyMTFfcm9hbWVkKHVzYmRldi0+bmV0LCAmcm9hbV9pbmZvLCBHRlBfS0VSTkVMKTsKKwkJfQogCX0gZWxzZSBpZiAocHJpdi0+aW5mcmFfbW9kZSA9PSBORElTXzgwMjExX0lORlJBX0FESE9DKQogCQljZmc4MDIxMV9pYnNzX2pvaW5lZCh1c2JkZXYtPm5ldCwgYnNzaWQsCiAJCQkJICAgICBnZXRfY3VycmVudF9jaGFubmVsKHVzYmRldiwgTlVMTCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL21haW4uYwppbmRleCBiYmY3NjA0Li4xYzUzOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9tYWluLmMKQEAgLTE1NzEsNiArMTU3MSw3IEBACiAKIAl3bC0+c3RhdGUgPSBXTDEyNTFfU1RBVEVfT0ZGOwogCW11dGV4X2luaXQoJndsLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJndsLT53bF9sb2NrKTsKIAogCXdsLT50eF9tZ210X2ZybV9yYXRlID0gREVGQVVMVF9IV19HRU5fVFhfUkFURTsKIAl3bC0+dHhfbWdtdF9mcm1fbW9kID0gREVGQVVMVF9IV19HRU5fTU9EVUxBVElPTl9UWVBFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmggYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAppbmRleCAzY2UxZjdkLi5jYjczNjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaApAQCAtMTk5LDYgKzE5OSw3IEBACiAJdW5zaWduZWQgbG9uZyAgIHJlbWFpbmluZ19jcmVkaXQ7CiAJc3RydWN0IHRpbWVyX2xpc3QgY3JlZGl0X3RpbWVvdXQ7CiAJdTY0IGNyZWRpdF93aW5kb3dfc3RhcnQ7CisJYm9vbCByYXRlX2xpbWl0ZWQ7CiAKIAkvKiBTdGF0aXN0aWNzICovCiAJc3RydWN0IHhlbnZpZl9zdGF0cyBzdGF0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKaW5kZXggYjAwOWQ3OS4uNWJmYWY1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMKQEAgLTEwNSw3ICsxMDUsMTEgQEAKIAogCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyhxdWV1ZSk7CisJCS8qIElmIHRoZSBxdWV1ZSBpcyByYXRlLWxpbWl0ZWQsIGl0IHNoYWxsIGJlCisJCSAqIHJlc2NoZWR1bGVkIGluIHRoZSB0aW1lciBjYWxsYmFjay4KKwkJICovCisJCWlmIChsaWtlbHkoIXF1ZXVlLT5yYXRlX2xpbWl0ZWQpKQorCQkJeGVudmlmX25hcGlfc2NoZWR1bGVfb3JfZW5hYmxlX2V2ZW50cyhxdWV1ZSk7CiAJfQogCiAJcmV0dXJuIHdvcmtfZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYwppbmRleCA0N2I0ODEwLi5kOWI1YjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCkBAIC0xNzksNiArMTc5LDcgQEAKIAkJbWF4X2NyZWRpdCA9IFVMT05HX01BWDsgLyogd3JhcHBlZDogY2xhbXAgdG8gVUxPTkdfTUFYICovCiAKIAlxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCA9IG1pbihtYXhfY3JlZGl0LCBtYXhfYnVyc3QpOworCXF1ZXVlLT5yYXRlX2xpbWl0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCB4ZW52aWZfdHhfY3JlZGl0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTY4NSw4ICs2ODYsMTAgQEAKIAkJbXNlY3NfdG9famlmZmllcyhxdWV1ZS0+Y3JlZGl0X3VzZWMgLyAxMDAwKTsKIAogCS8qIFRpbWVyIGNvdWxkIGFscmVhZHkgYmUgcGVuZGluZyBpbiByYXJlIGNhc2VzLiAqLwotCWlmICh0aW1lcl9wZW5kaW5nKCZxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQpKQorCWlmICh0aW1lcl9wZW5kaW5nKCZxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQpKSB7CisJCXF1ZXVlLT5yYXRlX2xpbWl0ZWQgPSB0cnVlOwogCQlyZXR1cm4gdHJ1ZTsKKwl9CiAKIAkvKiBQYXNzZWQgdGhlIHBvaW50IHdoZXJlIHdlIGNhbiByZXBsZW5pc2ggY3JlZGl0PyAqLwogCWlmICh0aW1lX2FmdGVyX2VxNjQobm93LCBuZXh0X2NyZWRpdCkpIHsKQEAgLTcwMSw2ICs3MDQsNyBAQAogCQltb2RfdGltZXIoJnF1ZXVlLT5jcmVkaXRfdGltZW91dCwKIAkJCSAgbmV4dF9jcmVkaXQpOwogCQlxdWV1ZS0+Y3JlZGl0X3dpbmRvd19zdGFydCA9IG5leHRfY3JlZGl0OworCQlxdWV1ZS0+cmF0ZV9saW1pdGVkID0gdHJ1ZTsKIAogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9mZHAvaTJjLmMgYi9kcml2ZXJzL25mYy9mZHAvaTJjLmMKaW5kZXggNWU3OTdkNS4uZmJkMjZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvZmRwL2kyYy5jCisrKyBiL2RyaXZlcnMvbmZjL2ZkcC9pMmMuYwpAQCAtMTc3LDYgKzE3NywxNiBAQAogCQkvKiBQYWNrZXQgdGhhdCBjb250YWlucyBhIGxlbmd0aCAqLwogCQlpZiAodG1wWzBdID09IDAgJiYgdG1wWzFdID09IDApIHsKIAkJCXBoeS0+bmV4dF9yZWFkX3NpemUgPSAodG1wWzJdIDw8IDgpICsgdG1wWzNdICsgMzsKKwkJCS8qCisJCQkgKiBFbnN1cmUgbmV4dF9yZWFkX3NpemUgZG9lcyBub3QgZXhjZWVkIHNpemVvZih0bXApCisJCQkgKiBmb3IgcmVhZGluZyB0aGF0IG1hbnkgYnl0ZXMgZHVyaW5nIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCWlmIChwaHktPm5leHRfcmVhZF9zaXplID4gRkRQX05DSV9JMkNfTUFYX1BBWUxPQUQpIHsKKwkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiBjb3JydXB0ZWQgcGFja2V0XG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcGh5LT5uZXh0X3JlYWRfc2l6ZSA9IDU7CisJCQkJZ290byBmbHVzaDsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCXBoeS0+bmV4dF9yZWFkX3NpemUgPSBGRFBfTkNJX0kyQ19NSU5fUEFZTE9BRDsKIApAQCAtMjEwLDE0ICsyMjAsMTQgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByOwogCi0JY2xpZW50ID0gcGh5LT5pMmNfZGV2OwotCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCWlmICghcGh5IHx8IGlycSAhPSBwaHktPmkyY19kZXYtPmlycSkgewogCQlXQVJOX09OX09OQ0UoMSk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKKwljbGllbnQgPSBwaHktPmkyY19kZXY7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCiAJciA9IGZkcF9uY2lfaTJjX3JlYWQocGh5LCAmc2tiKTsKIAogCWlmIChyID09IC1FUkVNT1RFSU8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9ucS1uY2kuYyBiL2RyaXZlcnMvbmZjL25xLW5jaS5jCmluZGV4IGJhYTRmOTQuLmVhNGJlZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL25xLW5jaS5jCisrKyBiL2RyaXZlcnMvbmZjL25xLW5jaS5jCkBAIC0zNTQsNiArMzU0LDcgQEAKIAkJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CiAJCQl9CiAJCQlncGlvX3NldF92YWx1ZShucXhfZGV2LT5lc2VfZ3BpbywgMSk7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CiAJCQlpZiAoZ3Bpb19nZXRfdmFsdWUobnF4X2Rldi0+ZXNlX2dwaW8pKSB7CiAJCQkJZGV2X2RiZygmbnF4X2Rldi0+Y2xpZW50LT5kZXYsICJlc2VfZ3BpbyBpcyBlbmFibGVkXG4iKTsKIAkJCQlyID0gMDsKQEAgLTQwNiw2ICs0MDcsNyBAQAogCQkJICogdGhlcmUncyBubyBuZWVkIHRvIHNlbmQgdGhlIGkyYyBjb21tYW5kcwogCQkJICovCiAJCQlncGlvX3NldF92YWx1ZShucXhfZGV2LT5lc2VfZ3BpbywgMCk7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CiAJCX0KIAogCQlpZiAoIWdwaW9fZ2V0X3ZhbHVlKG5xeF9kZXYtPmVzZV9ncGlvKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG9ydDEwMC5jIGIvZHJpdmVycy9uZmMvcG9ydDEwMC5jCmluZGV4IDJiMjMzMGIuLjA3M2U0YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL3BvcnQxMDAuYworKysgYi9kcml2ZXJzL25mYy9wb3J0MTAwLmMKQEAgLTcyNSwyMyArNzI1LDMzIEBACiAKIHN0YXRpYyBpbnQgcG9ydDEwMF9zZW5kX2FjayhzdHJ1Y3QgcG9ydDEwMCAqZGV2KQogewotCWludCByYzsKKwlpbnQgcmMgPSAwOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5vdXRfdXJiX2xvY2spOwogCi0JaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jYW5jZWxfZG9uZSk7Ci0KLQl1c2Jfa2lsbF91cmIoZGV2LT5vdXRfdXJiKTsKLQotCWRldi0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gYWNrX2ZyYW1lOwotCWRldi0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemVvZihhY2tfZnJhbWUpOwotCXJjID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5vdXRfdXJiLCBHRlBfS0VSTkVMKTsKLQotCS8qIFNldCB0aGUgY21kX2NhbmNlbCBmbGFnIG9ubHkgaWYgdGhlIFVSQiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiBzdWJtaXR0ZWQuIEl0IHdpbGwgYmUgcmVzZXQgYnkgdGhlIG91dCBVUkIgY29tcGxldGlvbiBjYWxsYmFjawotCSAqIHBvcnQxMDBfc2VuZF9jb21wbGV0ZSgpLgorCS8qCisJICogSWYgcHJpb3IgY2FuY2VsIGlzIGluLWZsaWdodCAoZGV2LT5jbWRfY2FuY2VsID09IHRydWUpLCB3ZQorCSAqIGNhbiBza2lwIHRvIHNlbmQgY2FuY2VsLiBUaGVuIHRoaXMgd2lsbCB3YWl0IHRoZSBwcmlvcgorCSAqIGNhbmNlbCwgb3IgbWVyZ2VkIGludG8gdGhlIG5leHQgY2FuY2VsIHJhcmVseSBpZiBuZXh0CisJICogY2FuY2VsIHdhcyBzdGFydGVkIGJlZm9yZSB3YWl0aW5nIGRvbmUuIEluIGFueSBjYXNlLCB0aGlzCisJICogd2lsbCBiZSB3YWtlZCB1cCBzb29uIG9yIGxhdGVyLgogCSAqLwotCWRldi0+Y21kX2NhbmNlbCA9ICFyYzsKKwlpZiAoIWRldi0+Y21kX2NhbmNlbCkgeworCQlyZWluaXRfY29tcGxldGlvbigmZGV2LT5jbWRfY2FuY2VsX2RvbmUpOworCisJCXVzYl9raWxsX3VyYihkZXYtPm91dF91cmIpOworCisJCWRldi0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gYWNrX2ZyYW1lOworCQlkZXYtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBzaXplb2YoYWNrX2ZyYW1lKTsKKwkJcmMgPSB1c2Jfc3VibWl0X3VyYihkZXYtPm91dF91cmIsIEdGUF9LRVJORUwpOworCisJCS8qCisJCSAqIFNldCB0aGUgY21kX2NhbmNlbCBmbGFnIG9ubHkgaWYgdGhlIFVSQiBoYXMgYmVlbgorCQkgKiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkLiBJdCB3aWxsIGJlIHJlc2V0IGJ5IHRoZSBvdXQKKwkJICogVVJCIGNvbXBsZXRpb24gY2FsbGJhY2sgcG9ydDEwMF9zZW5kX2NvbXBsZXRlKCkuCisJCSAqLworCQlkZXYtPmNtZF9jYW5jZWwgPSAhcmM7CisJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm91dF91cmJfbG9jayk7CiAKQEAgLTkyOCw4ICs5MzgsOCBAQAogCXN0cnVjdCBwb3J0MTAwICpkZXYgPSB1cmItPmNvbnRleHQ7CiAKIAlpZiAoZGV2LT5jbWRfY2FuY2VsKSB7CisJCWNvbXBsZXRlX2FsbCgmZGV2LT5jbWRfY2FuY2VsX2RvbmUpOwogCQlkZXYtPmNtZF9jYW5jZWwgPSBmYWxzZTsKLQkJY29tcGxldGUoJmRldi0+Y21kX2NhbmNlbF9kb25lKTsKIAl9CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CkBAIC0xNTQzLDYgKzE1NTMsNyBAQAogCQkJICAgIFBPUlQxMDBfQ09NTV9SRl9IRUFEX01BWF9MRU47CiAJZGV2LT5za2JfdGFpbHJvb20gPSBQT1JUMTAwX0ZSQU1FX1RBSUxfTEVOOwogCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jYW5jZWxfZG9uZSk7CiAJSU5JVF9XT1JLKCZkZXYtPmNtZF9jb21wbGV0ZV93b3JrLCBwb3J0MTAwX3dxX2NtZF9jb21wbGV0ZSk7CiAKIAkvKiBUaGUgZmlyc3QgdGhpbmcgdG8gZG8gd2l0aCB0aGUgUG9ydC0xMDAgaXMgdG8gc2V0IHRoZSBjb21tYW5kIHR5cGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3N0MjFuZmNhL2RlcC5jIGIvZHJpdmVycy9uZmMvc3QyMW5mY2EvZGVwLmMKaW5kZXggNzk4YTMyYi4uMjA2Mjg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvc3QyMW5mY2EvZGVwLmMKKysrIGIvZHJpdmVycy9uZmMvc3QyMW5mY2EvZGVwLmMKQEAgLTIxNyw3ICsyMTcsOCBAQAogCiAJYXRyX3JlcSA9IChzdHJ1Y3Qgc3QyMW5mY2FfYXRyX3JlcSAqKXNrYi0+ZGF0YTsKIAotCWlmIChhdHJfcmVxLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IHN0MjFuZmNhX2F0cl9yZXEpKSB7CisJaWYgKGF0cl9yZXEtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc3QyMW5mY2FfYXRyX3JlcSkgfHwKKwkgICAgYXRyX3JlcS0+bGVuZ3RoID4gc2tiLT5sZW4pIHsKIAkJciA9IC1FUFJPVE87CiAJCWdvdG8gZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zZS5jIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Evc2UuYwppbmRleCAzYTk4NTYzLi42ZTg0ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zZS5jCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL3NlLmMKQEAgLTMyMCwyMyArMzIwLDMzIEBACiAJCSAqIEFJRAkJODEJNSB0byAxNgogCQkgKiBQQVJBTUVURVJTCTgyCTAgdG8gMjU1CiAJCSAqLwotCQlpZiAoc2tiLT5sZW4gPCBORkNfTUlOX0FJRF9MRU5HVEggKyAyICYmCisJCWlmIChza2ItPmxlbiA8IE5GQ19NSU5fQUlEX0xFTkdUSCArIDIgfHwKIAkJICAgIHNrYi0+ZGF0YVswXSAhPSBORkNfRVZUX1RSQU5TQUNUSU9OX0FJRF9UQUcpCiAJCQlyZXR1cm4gLUVQUk9UTzsKIAorCQkvKgorCQkgKiBCdWZmZXIgc2hvdWxkIGhhdmUgZW5vdWdoIHNwYWNlIGZvciBhdCBsZWFzdAorCQkgKiB0d28gdGFnIGZpZWxkcyArIHR3byBsZW5ndGggZmllbGRzICsgYWlkX2xlbiAoc2tiLT5kYXRhWzFdKQorCQkgKi8KKwkJaWYgKHNrYi0+bGVuIDwgc2tiLT5kYXRhWzFdICsgNCkKKwkJCXJldHVybiAtRVBST1RPOworCiAJCXRyYW5zYWN0aW9uID0gKHN0cnVjdCBuZmNfZXZ0X3RyYW5zYWN0aW9uICopZGV2bV9remFsbG9jKGRldiwKIAkJCQkJCSAgIHNrYi0+bGVuIC0gMiwgR0ZQX0tFUk5FTCk7CiAKIAkJdHJhbnNhY3Rpb24tPmFpZF9sZW4gPSBza2ItPmRhdGFbMV07CiAJCW1lbWNweSh0cmFuc2FjdGlvbi0+YWlkLCAmc2tiLT5kYXRhWzJdLAogCQkgICAgICAgdHJhbnNhY3Rpb24tPmFpZF9sZW4pOwotCi0JCS8qIENoZWNrIG5leHQgYnl0ZSBpcyBQQVJBTUVURVJTIHRhZyAoODIpICovCi0JCWlmIChza2ItPmRhdGFbdHJhbnNhY3Rpb24tPmFpZF9sZW4gKyAyXSAhPQotCQkgICAgTkZDX0VWVF9UUkFOU0FDVElPTl9QQVJBTVNfVEFHKQotCQkJcmV0dXJuIC1FUFJPVE87Ci0KIAkJdHJhbnNhY3Rpb24tPnBhcmFtc19sZW4gPSBza2ItPmRhdGFbdHJhbnNhY3Rpb24tPmFpZF9sZW4gKyAzXTsKKworCQkvKiBDaGVjayBuZXh0IGJ5dGUgaXMgUEFSQU1FVEVSUyB0YWcgKDgyKSBhbmQgdGhlIGxlbmd0aCBmaWVsZCAqLworCQlpZiAoc2tiLT5kYXRhW3RyYW5zYWN0aW9uLT5haWRfbGVuICsgMl0gIT0KKwkJICAgIE5GQ19FVlRfVFJBTlNBQ1RJT05fUEFSQU1TX1RBRyB8fAorCQkgICAgc2tiLT5sZW4gPCB0cmFuc2FjdGlvbi0+YWlkX2xlbiArIHRyYW5zYWN0aW9uLT5wYXJhbXNfbGVuICsgNCkgeworCQkJZGV2bV9rZnJlZShkZXYsIHRyYW5zYWN0aW9uKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisKIAkJbWVtY3B5KHRyYW5zYWN0aW9uLT5wYXJhbXMsIHNrYi0+ZGF0YSArCiAJCSAgICAgICB0cmFuc2FjdGlvbi0+YWlkX2xlbiArIDQsIHRyYW5zYWN0aW9uLT5wYXJhbXNfbGVuKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jCmluZGV4IGMyMzRlZTQzLi4yNDIyMmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL250Yi9udGJfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jCkBAIC0xNzYsMTQgKzE3NiwxMiBAQAogCXU2NCByeF9lcnJfdmVyOwogCXU2NCByeF9tZW1jcHk7CiAJdTY0IHJ4X2FzeW5jOwotCXU2NCBkbWFfcnhfcHJlcF9lcnI7CiAJdTY0IHR4X2J5dGVzOwogCXU2NCB0eF9wa3RzOwogCXU2NCB0eF9yaW5nX2Z1bGw7CiAJdTY0IHR4X2Vycl9ub19idWY7CiAJdTY0IHR4X21lbWNweTsKIAl1NjQgdHhfYXN5bmM7Ci0JdTY0IGRtYV90eF9wcmVwX2VycjsKIH07CiAKIHN0cnVjdCBudGJfdHJhbnNwb3J0X213IHsKQEAgLTI1Niw4ICsyNTQsNiBAQAogI2RlZmluZSBRUF9UT19NVyhudCwgcXApCSgocXApICUgbnQtPm13X2NvdW50KQogI2RlZmluZSBOVEJfUVBfREVGX05VTV9FTlRSSUVTCTEwMAogI2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQJMTAKLSNkZWZpbmUgRE1BX1JFVFJJRVMJCTIwCi0jZGVmaW5lIERNQV9PVVRfUkVTT1VSQ0VfVE8JbXNlY3NfdG9famlmZmllcyg1MCkKIAogc3RhdGljIHZvaWQgbnRiX3RyYW5zcG9ydF9yeGNfZGIodW5zaWduZWQgbG9uZyBkYXRhKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbnRiX2N0eF9vcHMgbnRiX3RyYW5zcG9ydF9vcHM7CkBAIC01MTgsMTIgKzUxNCw2IEBACiAJb3V0X29mZnNldCArPSBzbnByaW50ZihidWYgKyBvdXRfb2Zmc2V0LCBvdXRfY291bnQgLSBvdXRfb2Zmc2V0LAogCQkJICAgICAgICJmcmVlIHR4IC0gXHQldVxuIiwKIAkJCSAgICAgICBudGJfdHJhbnNwb3J0X3R4X2ZyZWVfZW50cnkocXApKTsKLQlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCi0JCQkgICAgICAgIkRNQSB0eCBwcmVwIGVyciAtIFx0JWxsdVxuIiwKLQkJCSAgICAgICBxcC0+ZG1hX3R4X3ByZXBfZXJyKTsKLQlvdXRfb2Zmc2V0ICs9IHNucHJpbnRmKGJ1ZiArIG91dF9vZmZzZXQsIG91dF9jb3VudCAtIG91dF9vZmZzZXQsCi0JCQkgICAgICAgIkRNQSByeCBwcmVwIGVyciAtIFx0JWxsdVxuIiwKLQkJCSAgICAgICBxcC0+ZG1hX3J4X3ByZXBfZXJyKTsKIAogCW91dF9vZmZzZXQgKz0gc25wcmludGYoYnVmICsgb3V0X29mZnNldCwgb3V0X2NvdW50IC0gb3V0X29mZnNldCwKIAkJCSAgICAgICAiXG4iKTsKQEAgLTYyNSw3ICs2MTUsNyBAQAogCWlmICghbXctPnZpcnRfYWRkcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAocXBfY291bnQgJSBtd19jb3VudCAmJiBtd19udW0gKyAxIDwgcXBfY291bnQgLyBtd19jb3VudCkKKwlpZiAobXdfbnVtIDwgcXBfY291bnQgJSBtd19jb3VudCkKIAkJbnVtX3Fwc19tdyA9IHFwX2NvdW50IC8gbXdfY291bnQgKyAxOwogCWVsc2UKIAkJbnVtX3Fwc19tdyA9IHFwX2NvdW50IC8gbXdfY291bnQ7CkBAIC03NzAsOCArNzYwLDYgQEAKIAlxcC0+dHhfZXJyX25vX2J1ZiA9IDA7CiAJcXAtPnR4X21lbWNweSA9IDA7CiAJcXAtPnR4X2FzeW5jID0gMDsKLQlxcC0+ZG1hX3R4X3ByZXBfZXJyID0gMDsKLQlxcC0+ZG1hX3J4X3ByZXBfZXJyID0gMDsKIH0KIAogc3RhdGljIHZvaWQgbnRiX3FwX2xpbmtfY2xlYW51cChzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXApCkBAIC05MzMsMTAgKzkyMSw4IEBACiAJCW50Yl9mcmVlX213KG50LCBpKTsKIAogCS8qIGlmIHRoZXJlJ3MgYW4gYWN0dWFsIGZhaWx1cmUsIHdlIHNob3VsZCBqdXN0IGJhaWwgKi8KLQlpZiAocmMgPCAwKSB7Ci0JCW50Yl9saW5rX2Rpc2FibGUobmRldik7CisJaWYgKHJjIDwgMCkKIAkJcmV0dXJuOwotCX0KIAogb3V0OgogCWlmIChudGJfbGlua19pc191cChuZGV2LCBOVUxMLCBOVUxMKSA9PSAxKQpAQCAtMTAwMiw3ICs5ODgsNyBAQAogCXFwLT5ldmVudF9oYW5kbGVyID0gTlVMTDsKIAludGJfcXBfbGlua19kb3duX3Jlc2V0KHFwKTsKIAotCWlmIChxcF9jb3VudCAlIG13X2NvdW50ICYmIG13X251bSArIDEgPCBxcF9jb3VudCAvIG13X2NvdW50KQorCWlmIChtd19udW0gPCBxcF9jb3VudCAlIG13X2NvdW50KQogCQludW1fcXBzX213ID0gcXBfY291bnQgLyBtd19jb3VudCArIDE7CiAJZWxzZQogCQludW1fcXBzX213ID0gcXBfY291bnQgLyBtd19jb3VudDsKQEAgLTExMjUsOCArMTExMSw4IEBACiAJcXBfY291bnQgPSBpbG9nMihxcF9iaXRtYXApOwogCWlmIChtYXhfbnVtX2NsaWVudHMgJiYgbWF4X251bV9jbGllbnRzIDwgcXBfY291bnQpCiAJCXFwX2NvdW50ID0gbWF4X251bV9jbGllbnRzOwotCWVsc2UgaWYgKG13X2NvdW50IDwgcXBfY291bnQpCi0JCXFwX2NvdW50ID0gbXdfY291bnQ7CisJZWxzZSBpZiAobnQtPm13X2NvdW50IDwgcXBfY291bnQpCisJCXFwX2NvdW50ID0gbnQtPm13X2NvdW50OwogCiAJcXBfYml0bWFwICY9IEJJVF9VTEwocXBfY291bnQpIC0gMTsKIApAQCAtMTMxNCw3ICsxMzAwLDYgQEAKIAlzdHJ1Y3QgZG1hZW5naW5lX3VubWFwX2RhdGEgKnVubWFwOwogCWRtYV9jb29raWVfdCBjb29raWU7CiAJdm9pZCAqYnVmID0gZW50cnktPmJ1ZjsKLQlpbnQgcmV0cmllcyA9IDA7CiAKIAlsZW4gPSBlbnRyeS0+bGVuOwogCWRldmljZSA9IGNoYW4tPmRldmljZTsKQEAgLTEzNDMsMjIgKzEzMjgsMTEgQEAKIAogCXVubWFwLT5mcm9tX2NudCA9IDE7CiAKLQlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgRE1BX1JFVFJJRVM7IHJldHJpZXMrKykgewotCQl0eGQgPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwKLQkJCQkJCSAgICAgdW5tYXAtPmFkZHJbMV0sCi0JCQkJCQkgICAgIHVubWFwLT5hZGRyWzBdLCBsZW4sCi0JCQkJCQkgICAgIERNQV9QUkVQX0lOVEVSUlVQVCk7Ci0JCWlmICh0eGQpCi0JCQlicmVhazsKLQotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KERNQV9PVVRfUkVTT1VSQ0VfVE8pOwotCX0KLQotCWlmICghdHhkKSB7Ci0JCXFwLT5kbWFfcnhfcHJlcF9lcnIrKzsKKwl0eGQgPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwgdW5tYXAtPmFkZHJbMV0sCisJCQkJCSAgICAgdW5tYXAtPmFkZHJbMF0sIGxlbiwKKwkJCQkJICAgICBETUFfUFJFUF9JTlRFUlJVUFQpOworCWlmICghdHhkKQogCQlnb3RvIGVycl9nZXRfdW5tYXA7Ci0JfQogCiAJdHhkLT5jYWxsYmFja19yZXN1bHQgPSBudGJfcnhfY29weV9jYWxsYmFjazsKIAl0eGQtPmNhbGxiYWNrX3BhcmFtID0gZW50cnk7CkBAIC0xNjAzLDcgKzE1NzcsNiBAQAogCXN0cnVjdCBkbWFlbmdpbmVfdW5tYXBfZGF0YSAqdW5tYXA7CiAJZG1hX2FkZHJfdCBkZXN0OwogCWRtYV9jb29raWVfdCBjb29raWU7Ci0JaW50IHJldHJpZXMgPSAwOwogCiAJZGV2aWNlID0gY2hhbi0+ZGV2aWNlOwogCWRlc3QgPSBxcC0+dHhfbXdfcGh5cyArIHFwLT50eF9tYXhfZnJhbWUgKiBlbnRyeS0+dHhfaW5kZXg7CkBAIC0xNjI1LDIxICsxNTk4LDEwIEBACiAKIAl1bm1hcC0+dG9fY250ID0gMTsKIAotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBETUFfUkVUUklFUzsgcmV0cmllcysrKSB7Ci0JCXR4ZCA9IGRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweShjaGFuLCBkZXN0LAotCQkJCQkJICAgICB1bm1hcC0+YWRkclswXSwgbGVuLAotCQkJCQkJICAgICBETUFfUFJFUF9JTlRFUlJVUFQpOwotCQlpZiAodHhkKQotCQkJYnJlYWs7Ci0KLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChETUFfT1VUX1JFU09VUkNFX1RPKTsKLQl9Ci0KLQlpZiAoIXR4ZCkgewotCQlxcC0+ZG1hX3R4X3ByZXBfZXJyKys7CisJdHhkID0gZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGNoYW4sIGRlc3QsIHVubWFwLT5hZGRyWzBdLCBsZW4sCisJCQkJCSAgICAgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlpZiAoIXR4ZCkKIAkJZ290byBlcnJfZ2V0X3VubWFwOwotCX0KIAogCXR4ZC0+Y2FsbGJhY2tfcmVzdWx0ID0gbnRiX3R4X2NvcHlfY2FsbGJhY2s7CiAJdHhkLT5jYWxsYmFja19wYXJhbSA9IGVudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5jIGIvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5jCmluZGV4IDVhM2YwMDguLmVlZjFhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuYworKysgYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAlrcmVmX2luaXQoJmhvc3QtPnJlZik7CiAJdXVpZF9iZV9nZW4oJmhvc3QtPmlkKTsKIAlzbnByaW50Zihob3N0LT5ucW4sIE5WTUZfTlFOX1NJWkUsCi0JCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczpOVk1mOnV1aWQ6JXBVYiIsICZob3N0LT5pZCk7CisJCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczp1dWlkOiVwVWIiLCAmaG9zdC0+aWQpOwogCiAJbXV0ZXhfbG9jaygmbnZtZl9ob3N0c19tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmaG9zdC0+bGlzdCwgJm52bWZfaG9zdHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lbS9pbXgtb2NvdHAuYyBiL2RyaXZlcnMvbnZtZW0vaW14LW9jb3RwLmMKaW5kZXggYWMyN2I5Yi4uOGU3YjEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lbS9pbXgtb2NvdHAuYworKysgYi9kcml2ZXJzL252bWVtL2lteC1vY290cC5jCkBAIC03MSw3ICs3MSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF9vY290cF9kdF9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1vY290cCIsICAodm9pZCAqKTEyOCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZzbC1vY290cCIsICh2b2lkICopMzIgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2c2wtb2NvdHAiLCAodm9pZCAqKTY0IH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnN4LW9jb3RwIiwgKHZvaWQgKikxMjggfSwKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvZGluby5jIGIvZHJpdmVycy9wYXJpc2MvZGluby5jCmluZGV4IDVjNjNiOTIuLmVkOTJjMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYworKysgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKQEAgLTk1Niw3ICs5NTYsNyBAQAogCiAJZGlub19kZXYtPmhiYS5kZXYgPSBkZXY7CiAJZGlub19kZXYtPmhiYS5iYXNlX2FkZHIgPSBpb3JlbWFwX25vY2FjaGUoaHBhLCA0MDk2KTsKLQlkaW5vX2Rldi0+aGJhLmxtbWlvX3NwYWNlX29mZnNldCA9IDA7CS8qIENQVSBhZGRycyA9PSBidXMgYWRkcnMgKi8KKwlkaW5vX2Rldi0+aGJhLmxtbWlvX3NwYWNlX29mZnNldCA9IFBDSV9GX0VYVEVORDsKIAlzcGluX2xvY2tfaW5pdCgmZGlub19kZXYtPmRpbm9zYXVyX3Blbik7CiAJZGlub19kZXYtPmhiYS5pb21tdSA9IGNjaW9fZ2V0X2lvbW11KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW1zbS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXNtLmMKaW5kZXggMDQ5MWE4Ni4uNTdkYzRhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXNtLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXNtLmMKQEAgLTU3LDE1ICs1NywxOSBAQAogCiAjZGVmaW5lIFBDU19CQVNFIDB4ODAwCiAKLSNkZWZpbmUgUENTX1BPUlQobiwgbSkgKFBDU19CQVNFICsgbiAqIG0gKiAweDEwMDApCisjZGVmaW5lIFBDU19QT1JUKG4pIChQQ1NfQkFTRSArIG4gKiAweDEwMDApCiAKLSNkZWZpbmUgUENJRV9OX1NXX1JFU0VUKG4sIG0pCQkJKFBDU19QT1JUKG4sIG0pICsgMHgwMCkKLSNkZWZpbmUgUENJRV9OX1BPV0VSX0RPV05fQ09OVFJPTChuLCBtKQkJKFBDU19QT1JUKG4sIG0pICsgMHgwNCkKLSNkZWZpbmUgUENJRV9OX1BDU19TVEFUVVMobiwgbSkJCQkoUENTX1BPUlQobiwgbSkgKyAweDE3NCkKKyNkZWZpbmUgUENJRV9OX1NXX1JFU0VUKG4pCQkJKFBDU19QT1JUKG4pICsgMHgwMCkKKyNkZWZpbmUgUENJRV9OX1BPV0VSX0RPV05fQ09OVFJPTChuKQkJKFBDU19QT1JUKG4pICsgMHgwNCkKKyNkZWZpbmUgUENJRV9OX1BDU19TVEFUVVMobikJCQkoUENTX1BPUlQobikgKyAweDE3NCkKIAotI2RlZmluZSBQQ0lFX0NPTV9TV19SRVNFVAkJMHg0MDAKLSNkZWZpbmUgUENJRV9DT01fUE9XRVJfRE9XTl9DT05UUk9MCTB4NDA0Ci0jZGVmaW5lIFBDSUVfQ09NX1BDU19SRUFEWV9TVEFUVVMJMHg0NDgKKyNkZWZpbmUgUENJRV9HRU4zX0NPTV9JTlRFR0xPT1BfR0FJTjFfTU9ERTAJMHgwMTU0CisjZGVmaW5lIFBDSUVfR0VOM19MMF9EUlZSX0NUUkwwCQkJMHgwODBjCisjZGVmaW5lIFBDSUVfR0VOM19MMF9SRVNFVF9HRU4JCQkweDA4OTAKKyNkZWZpbmUgUENJRV9HRU4zX0wwX0JJU1RfRVJSX0NOVDFfU1RBVFVTCTB4MDhhOAorI2RlZmluZSBQQ0lFX0dFTjNfTDBfQklTVF9FUlJfQ05UMl9TVEFUVVMJMHgwOGFjCisjZGVmaW5lIFBDSUVfR0VOM19MMF9ERUJVR19CVVNfU1RBVFVTNAkJMHgwOGJjCisjZGVmaW5lIFBDSUVfR0VOM19QQ0lFX1BIWV9QQ1NfU1RBVFVTCQkweDFhYWMKIAogI2RlZmluZSBQQ0lFMjBfUEFSRl9TWVNfQ1RSTAkgICAgIDB4MDAKICNkZWZpbmUgUENJRTIwX1BBUkZfUE1fQ1RSTAkJMHgyMApAQCAtMTUxLDYgKzE1NSwxMCBAQAogI2RlZmluZSBMSU5LRE9XTl9XQUlUSU5HX1VTX01BWAkgICA1MTAwCiAjZGVmaW5lIExJTktET1dOX1dBSVRJTkdfQ09VTlQJICAgIDIwMAogCisjZGVmaW5lIEdFTjFfU1BFRUQgMHgxCisjZGVmaW5lIEdFTjJfU1BFRUQgMHgyCisjZGVmaW5lIEdFTjNfU1BFRUQgMHgzCisKICNkZWZpbmUgUEhZX1JFQURZX1RJTUVPVVRfQ09VTlQJCSAgIDEwCiAjZGVmaW5lIFhNTEhfTElOS19VUAkJCQkgIDB4NDAwCiAjZGVmaW5lIE1BWF9MSU5LX1JFVFJJRVMgNQpAQCAtNDgxLDEwICs0ODksMTEgQEAKIAlib29sCQkJCXNtbXVfZXhpc3Q7CiAJdWludDMyX3QJCQlzbW11X3NpZF9iYXNlOwogCXVpbnQzMl90CQkJICAgbl9mdHM7CisJdWludDMyX3QJCQltYXhfbGlua19zcGVlZDsKIAlib29sCQkJCSBleHRfcmVmX2NsazsKLQlib29sCQkJCWNvbW1vbl9waHk7CiAJdWludDMyX3QJCQkgICBlcF9sYXRlbmN5OwogCXVpbnQzMl90CQkJd3JfaGFsdF9zaXplOworCXVpbnQzMl90CQkJc2x2X2FkZHJfc3BhY2Vfc2l6ZTsKIAl1aW50MzJfdAkJCWNwbF90aW1lb3V0OwogCXVpbnQzMl90CQkJY3VycmVudF9iZGY7CiAJdWludDMyX3QJCQlwZXJzdF9kZWxheV91c19taW47CkBAIC01MTgsOSArNTI3LDcgQEAKIAl1MzIJCQkJbnVtX2VwOwogCWJvb2wJCQkJcGVuZGluZ19lcF9yZWc7CiAJdTMyCQkJCXBoeV9sZW47Ci0JdTMyCQkJCXBvcnRfcGh5X2xlbjsKIAlzdHJ1Y3QgbXNtX3BjaWVfcGh5X2luZm9fdAkqcGh5X3NlcXVlbmNlOwotCXN0cnVjdCBtc21fcGNpZV9waHlfaW5mb190CSpwb3J0X3BoeV9zZXF1ZW5jZTsKIAl1MzIJCWVwX3NoYWRvd1tNQVhfREVWSUNFX05VTV1bUENJRV9DT05GX1NQQUNFX0RXXTsKIAl1MzIJCQkJICByY19zaGFkb3dbUENJRV9DT05GX1NQQUNFX0RXXTsKIAlib29sCQkJCSBzaGFkb3dfZW47CkBAIC01NTMsMTIgKzU2MCw2IEBACiBzdGF0aWMgdTMyIHdyX3ZhbHVlOwogc3RhdGljIHVsb25nIGNvcnJfY291bnRlcl9saW1pdCA9IDU7CiAKLS8qIGNvdW50ZXIgdG8ga2VlcCB0cmFjayBpZiBjb21tb24gUEhZIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgKi8KLXN0YXRpYyB1MzIgbnVtX3JjX29uOwotCi0vKiBnbG9iYWwgbG9jayBmb3IgUENJZSBjb21tb24gUEhZICovCi1zdGF0aWMgc3RydWN0IG11dGV4IGNvbV9waHlfbG9jazsKLQogLyogVGFibGUgdG8gdHJhY2sgaW5mbyBvZiBQQ0llIGRldmljZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgbXNtX3BjaWVfZGV2aWNlX2luZm8KIAltc21fcGNpZV9kZXZfdGJsW01BWF9SQ19OVU0gKiBNQVhfREVWSUNFX05VTV07CkBAIC04NTMsNDEgKzg1NCwxMyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcGNpZV9wY3NfcG9ydF9waHlfaW5pdChzdHJ1Y3QgbXNtX3BjaWVfZGV2X3QgKmRldikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbXNtX3BjaWVfcGh5X2luZm9fdCAqcGh5X3NlcTsKLQotCVBDSUVfREJHKGRldiwgIlJDJWQ6IEluaXRpYWxpemluZyBQQ0llIFBIWSBQb3J0XG4iLCBkZXYtPnJjX2lkeCk7Ci0KLQlpZiAoZGV2LT5wb3J0X3BoeV9zZXF1ZW5jZSkgewotCQlpID0gIGRldi0+cG9ydF9waHlfbGVuOwotCQlwaHlfc2VxID0gZGV2LT5wb3J0X3BoeV9zZXF1ZW5jZTsKLQkJd2hpbGUgKGktLSkgewotCQkJbXNtX3BjaWVfd3JpdGVfcmVnKGRldi0+cGh5LAotCQkJCXBoeV9zZXEtPm9mZnNldCwKLQkJCQlwaHlfc2VxLT52YWwpOwotCQkJaWYgKHBoeV9zZXEtPmRlbGF5KQotCQkJCXVzbGVlcF9yYW5nZShwaHlfc2VxLT5kZWxheSwKLQkJCQkJcGh5X3NlcS0+ZGVsYXkgKyAxKTsKLQkJCXBoeV9zZXErKzsKLQkJfQotCX0KLQotfQotCiBzdGF0aWMgYm9vbCBwY2llX3BoeV9pc19yZWFkeShzdHJ1Y3QgbXNtX3BjaWVfZGV2X3QgKmRldikKIHsKLQlpZiAoZGV2LT5waHlfdmVyID49IDB4MjApIHsKLQkJaWYgKHJlYWRsX3JlbGF4ZWQoZGV2LT5waHkgKwotCQkJUENJRV9OX1BDU19TVEFUVVMoZGV2LT5yY19pZHgsIGRldi0+Y29tbW9uX3BoeSkpICYKLQkJCQkJQklUKDYpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9CisJdTMyIHBvcyA9IChkZXYtPm1heF9saW5rX3NwZWVkID09IEdFTjJfU1BFRUQpID8KKwkJUENJRV9OX1BDU19TVEFUVVMoZGV2LT5yY19pZHgpIDoKKwkJUENJRV9HRU4zX1BDSUVfUEhZX1BDU19TVEFUVVM7CiAKLQlpZiAoIShyZWFkbF9yZWxheGVkKGRldi0+cGh5ICsgUENJRV9DT01fUENTX1JFQURZX1NUQVRVUykgJiAweDEpKQorCWlmIChyZWFkbF9yZWxheGVkKGRldi0+cGh5ICsgcG9zKSAmIEJJVCg2KSkKIAkJcmV0dXJuIGZhbHNlOwogCWVsc2UKIAkJcmV0dXJuIHRydWU7CkBAIC0xMDkzLDggKzEwNjYsNiBAQAogCQlkZXYtPnBlbmRpbmdfZXBfcmVnID8gInRydWUiIDogImZhbHNlIik7CiAJUENJRV9EQkdfRlMoZGV2LCAicGh5X2xlbiBpcyAlZCIsCiAJCWRldi0+cGh5X2xlbik7Ci0JUENJRV9EQkdfRlMoZGV2LCAicG9ydF9waHlfbGVuIGlzICVkIiwKLQkJZGV2LT5wb3J0X3BoeV9sZW4pOwogCVBDSUVfREJHX0ZTKGRldiwgImRpc2FibGVfcGMgaXMgJWQiLAogCQlkZXYtPmRpc2FibGVfcGMpOwogCVBDSUVfREJHX0ZTKGRldiwgImwwc19zdXBwb3J0ZWQgaXMgJXMgc3VwcG9ydGVkXG4iLApAQCAtMTEzOSwxMiArMTExMCwxMiBAQAogCQlkZXYtPnNtbXVfc2lkX2Jhc2UpOwogCVBDSUVfREJHX0ZTKGRldiwgIm5fZnRzOiAlZFxuIiwKIAkJZGV2LT5uX2Z0cyk7Ci0JUENJRV9EQkdfRlMoZGV2LCAiY29tbW9uX3BoeTogJWRcbiIsCi0JCWRldi0+Y29tbW9uX3BoeSk7CiAJUENJRV9EQkdfRlMoZGV2LCAiZXBfbGF0ZW5jeTogJWRtc1xuIiwKIAkJZGV2LT5lcF9sYXRlbmN5KTsKIAlQQ0lFX0RCR19GUyhkZXYsICJ3cl9oYWx0X3NpemU6IDB4JXhcbiIsCiAJCWRldi0+d3JfaGFsdF9zaXplKTsKKwlQQ0lFX0RCR19GUyhkZXYsICJzbHZfYWRkcl9zcGFjZV9zaXplOiAweCV4XG4iLAorCQlkZXYtPnNsdl9hZGRyX3NwYWNlX3NpemUpOwogCVBDSUVfREJHX0ZTKGRldiwgImNwbF90aW1lb3V0OiAweCV4XG4iLAogCQlkZXYtPmNwbF90aW1lb3V0KTsKIAlQQ0lFX0RCR19GUyhkZXYsICJjdXJyZW50X2JkZjogMHgleFxuIiwKQEAgLTExNzEsNiArMTE0Miw4IEBACiAJCWRldi0+bGlua2Rvd25fY291bnRlcik7CiAJUENJRV9EQkdfRlMoZGV2LCAid2FrZV9jb3VudGVyOiAlbHVcbiIsCiAJCWRldi0+d2FrZV9jb3VudGVyKTsKKwlQQ0lFX0RCR19GUyhkZXYsICJtYXhfbGlua19zcGVlZDogMHgleFxuIiwKKwkJZGV2LT5tYXhfbGlua19zcGVlZCk7CiAJUENJRV9EQkdfRlMoZGV2LCAibGlua190dXJuZWRfb25fY291bnRlcjogJWx1XG4iLAogCQlkZXYtPmxpbmtfdHVybmVkX29uX2NvdW50ZXIpOwogCVBDSUVfREJHX0ZTKGRldiwgImxpbmtfdHVybmVkX29mZl9jb3VudGVyOiAlbHVcbiIsCkBAIC0zNDAwLDMxICszMzczLDYgQEAKIAkJCWRldi0+cmNfaWR4KTsKIAl9CiAKLQlvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJxY29tLHBvcnQtcGh5LXNlcXVlbmNlIiwgJnNpemUpOwotCWlmIChzaXplKSB7Ci0JCWRldi0+cG9ydF9waHlfc2VxdWVuY2UgPSAoc3RydWN0IG1zbV9wY2llX3BoeV9pbmZvX3QgKikKLQkJCWRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAoZGV2LT5wb3J0X3BoeV9zZXF1ZW5jZSkgewotCQkJZGV2LT5wb3J0X3BoeV9sZW4gPQotCQkJCXNpemUgLyBzaXplb2YoKmRldi0+cG9ydF9waHlfc2VxdWVuY2UpOwotCi0JCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkicWNvbSxwb3J0LXBoeS1zZXF1ZW5jZSIsCi0JCQkJKHVuc2lnbmVkIGludCAqKWRldi0+cG9ydF9waHlfc2VxdWVuY2UsCi0JCQkJc2l6ZSAvIHNpemVvZihkZXYtPnBvcnRfcGh5X3NlcXVlbmNlLT5vZmZzZXQpKTsKLQkJfSBlbHNlIHsKLQkJCVBDSUVfRVJSKGRldiwKLQkJCQkiUkMlZDogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcG9ydCBwaHkgaW5pdCBzZXF1ZW5jZS5cbiIsCi0JCQkJZGV2LT5yY19pZHgpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJUENJRV9EQkcoZGV2LCAiUkMlZDogcG9ydCBwaHkgc2VxdWVuY2UgaXMgbm90IHByZXNlbnQgaW4gRFRcbiIsCi0JCQlkZXYtPnJjX2lkeCk7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IE1TTV9QQ0lFX01BWF9DTEs7IGkrKykgewogCQljbGtfaW5mbyA9ICZkZXYtPmNsa1tpXTsKIApAQCAtMzYzOCw2ICszNTg2LDM2IEBACiAJZGV2LT5kZXZfaW9fcmVzID0gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgbXNtX3BjaWVfc2V0dXBfZ2VuMyhzdHJ1Y3QgbXNtX3BjaWVfZGV2X3QgKmRldikKK3sKKwlQQ0lFX0RCRyhkZXYsICJQQ0llOiBSQyVkOiBTZXR0aW5nIHVwIEdlbjNcbiIsIGRldi0+cmNfaWR4KTsKKworCW1zbV9wY2llX3dyaXRlX3JlZ19maWVsZChkZXYtPmRtX2NvcmUsCisJCVBDSUVfR0VOM19MMF9EUlZSX0NUUkwwLCAweDFmZjAwLCBCSVQoMCkpOworCisJbXNtX3BjaWVfd3JpdGVfcmVnKGRldi0+ZG1fY29yZSwKKwkJUENJRV9HRU4zX0wwX0JJU1RfRVJSX0NOVDJfU1RBVFVTLAorCQkoMHgwNSA8PCAxNCkgfCAoMHgwNSA8PCAxMCkgfCAoMHgwZCA8PCAgNSkpOworCisJbXNtX3BjaWVfd3JpdGVfbWFzayhkZXYtPmRtX2NvcmUgKworCQlQQ0lFX0dFTjNfTDBfQklTVF9FUlJfQ05UMV9TVEFUVVMsIEJJVCg0KSwgMCk7CisKKwltc21fcGNpZV93cml0ZV9tYXNrKGRldi0+ZG1fY29yZSArCisJCVBDSUVfR0VOM19MMF9SRVNFVF9HRU4sIEJJVCgwKSwgMCk7CisKKwkvKiBjb25maWd1cmUgUENJZSBwcmVzZXQgKi8KKwltc21fcGNpZV93cml0ZV9yZWcoZGV2LT5kbV9jb3JlLAorCQlQQ0lFX0dFTjNfTDBfREVCVUdfQlVTX1NUQVRVUzQsIDEpOworCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPmRtX2NvcmUsCisJCVBDSUVfR0VOM19DT01fSU5URUdMT09QX0dBSU4xX01PREUwLCAweDc3Nzc3Nzc3KTsKKwltc21fcGNpZV93cml0ZV9yZWcoZGV2LT5kbV9jb3JlLAorCQlQQ0lFX0dFTjNfTDBfREVCVUdfQlVTX1NUQVRVUzQsIDEpOworCisJbXNtX3BjaWVfd3JpdGVfcmVnX2ZpZWxkKGRldi0+ZG1fY29yZSwKKwkJUENJRTIwX0NBUCArIFBDSV9FWFBfTE5LQ1RMMiwKKwkJUENJX0VYUF9MTktDQVBfU0xTLCBHRU4zX1NQRUVEKTsKK30KKwogc3RhdGljIGludCBtc21fcGNpZV9lbmFibGUoc3RydWN0IG1zbV9wY2llX2Rldl90ICpkZXYsIHUzMiBvcHRpb25zKQogewogCWludCByZXQgPSAwOwpAQCAtMzcyNiwxNSArMzcwNCw4IEBACiAJCQlyZWFkbF9yZWxheGVkKGRldi0+cGFyZiArIFBDSUUyMF9QQVJGX0lOVF9BTExfTUFTSykpOwogCX0KIAotCWlmIChkZXYtPmRldl9tZW1fcmVzLT5lbmQgLSBkZXYtPmRldl9tZW1fcmVzLT5zdGFydCA+IFNaXzE2TSkKLQkJd3JpdGVsX3JlbGF4ZWQoU1pfMzJNLCBkZXYtPnBhcmYgKwotCQkJUENJRTIwX1BBUkZfU0xWX0FERFJfU1BBQ0VfU0laRSk7Ci0JZWxzZSBpZiAoZGV2LT5kZXZfbWVtX3Jlcy0+ZW5kIC0gZGV2LT5kZXZfbWVtX3Jlcy0+c3RhcnQgPiBTWl84TSkKLQkJd3JpdGVsX3JlbGF4ZWQoU1pfMTZNLCBkZXYtPnBhcmYgKwotCQkJUENJRTIwX1BBUkZfU0xWX0FERFJfU1BBQ0VfU0laRSk7Ci0JZWxzZQotCQl3cml0ZWxfcmVsYXhlZChTWl84TSwgZGV2LT5wYXJmICsKLQkJCVBDSUUyMF9QQVJGX1NMVl9BRERSX1NQQUNFX1NJWkUpOworCXdyaXRlbF9yZWxheGVkKGRldi0+c2x2X2FkZHJfc3BhY2Vfc2l6ZSwgZGV2LT5wYXJmICsKKwkJUENJRTIwX1BBUkZfU0xWX0FERFJfU1BBQ0VfU0laRSk7CiAKIAlpZiAoZGV2LT51c2VfbXNpKSB7CiAJCVBDSUVfREJHKGRldiwgIlJDJWQ6IGVuYWJsZSBXUiBoYWx0LlxuIiwgZGV2LT5yY19pZHgpOwpAQCAtMzc1MywxMyArMzcyNCw4IEBACiAJCQkJUENJRTIwX1BBUkZfQVhJX01TVFJfV1JfQUREUl9IQUxUKSk7CiAJfQogCi0JbXV0ZXhfbG9jaygmY29tX3BoeV9sb2NrKTsKIAkvKiBpbml0IFBDSWUgUEhZICovCi0JaWYgKCFudW1fcmNfb24pCi0JCXBjaWVfcGh5X2luaXQoZGV2KTsKLQotCW51bV9yY19vbisrOwotCW11dGV4X3VubG9jaygmY29tX3BoeV9sb2NrKTsKKwlwY2llX3BoeV9pbml0KGRldik7CiAKIAlpZiAob3B0aW9ucyAmIFBNX1BJUEVfQ0xLKSB7CiAJCXVzbGVlcF9yYW5nZShQSFlfU1RBQklMSVpBVElPTl9ERUxBWV9VU19NSU4sCkBAIC0zNzcyLDYgKzM3MzgsMTIgQEAKIAkJCWdvdG8gbGlua19mYWlsOwogCX0KIAorCS8qIGNoZWNrIGNhcGFiaWxpdHkgZm9yIG1heCBsaW5rIHNwZWVkICovCisJaWYgKCFkZXYtPm1heF9saW5rX3NwZWVkKSB7CisJCXZhbCA9IHJlYWRsX3JlbGF4ZWQoZGV2LT5kbV9jb3JlICsgUENJRTIwX0NBUCArIFBDSV9FWFBfTE5LQ0FQKTsKKwkJZGV2LT5tYXhfbGlua19zcGVlZCA9IHZhbCAmIFBDSV9FWFBfTE5LQ0FQX1NMUzsKKwl9CisKIAlQQ0lFX0RCRyhkZXYsICJSQyVkOiB3YWl0aW5nIGZvciBwaHkgcmVhZHkuLi5cbiIsIGRldi0+cmNfaWR4KTsKIAogCWRvIHsKQEAgLTM3OTUsOCArMzc2Nyw2IEBACiAJCWdvdG8gbGlua19mYWlsOwogCX0KIAotCXBjaWVfcGNzX3BvcnRfcGh5X2luaXQoZGV2KTsKLQogCWlmIChkZXYtPmVwX2xhdGVuY3kpCiAJCXVzbGVlcF9yYW5nZShkZXYtPmVwX2xhdGVuY3kgKiAxMDAwLCBkZXYtPmVwX2xhdGVuY3kgKiAxMDAwKTsKIApAQCAtMzgxMiw2ICszNzgyLDEwIEBACiAJCQkJMSAtIGRldi0+Z3Bpb1tNU01fUENJRV9HUElPX1BFUlNUXS5vbik7CiAJdXNsZWVwX3JhbmdlKGRldi0+cGVyc3RfZGVsYXlfdXNfbWluLCBkZXYtPnBlcnN0X2RlbGF5X3VzX21heCk7CiAKKwkvKiBzZXR1cCBHZW4zIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zICovCisJaWYgKGRldi0+bWF4X2xpbmtfc3BlZWQgPT0gR0VOM19TUEVFRCkKKwkJbXNtX3BjaWVfc2V0dXBfZ2VuMyhkZXYpOworCiAJLyogc2V0IG1heCB0bHAgcmVhZCBzaXplICovCiAJbXNtX3BjaWVfd3JpdGVfcmVnX2ZpZWxkKGRldi0+ZG1fY29yZSwgUENJRTIwX0RFVklDRV9DT05UUk9MX1NUQVRVUywKIAkJCQkweDcwMDAsIGRldi0+dGxwX3JkX3NpemUpOwpAQCAtMzg2OCwyMCArMzg0MiwxMyBAQAogCWlmIChkZXYtPmdwaW9bTVNNX1BDSUVfR1BJT19FUF0ubnVtKQogCQlncGlvX3NldF92YWx1ZShkZXYtPmdwaW9bTVNNX1BDSUVfR1BJT19FUF0ubnVtLAogCQkJCTEgLSBkZXYtPmdwaW9bTVNNX1BDSUVfR1BJT19FUF0ub24pOwotCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKLQkJUENJRV9OX1NXX1JFU0VUKGRldi0+cmNfaWR4LCBkZXYtPmNvbW1vbl9waHkpLCAweDEpOwotCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKLQkJUENJRV9OX1BPV0VSX0RPV05fQ09OVFJPTChkZXYtPnJjX2lkeCwgZGV2LT5jb21tb25fcGh5KSwgMCk7CiAKLQltdXRleF9sb2NrKCZjb21fcGh5X2xvY2spOwotCW51bV9yY19vbi0tOwotCWlmICghbnVtX3JjX29uICYmIGRldi0+Y29tbW9uX3BoeSkgewotCQlQQ0lFX0RCRyhkZXYsICJQQ0llOiBSQyVkIGlzIHBvd2VyaW5nIGRvd24gdGhlIGNvbW1vbiBwaHlcbiIsCi0JCQlkZXYtPnJjX2lkeCk7Ci0JCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwgUENJRV9DT01fU1dfUkVTRVQsIDB4MSk7Ci0JCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwgUENJRV9DT01fUE9XRVJfRE9XTl9DT05UUk9MLCAwKTsKKwlpZiAoZGV2LT5tYXhfbGlua19zcGVlZCAhPSBHRU4zX1NQRUVEKSB7CisJCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKKwkJCVBDSUVfTl9TV19SRVNFVChkZXYtPnJjX2lkeCksIDB4MSk7CisJCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKKwkJCVBDSUVfTl9QT1dFUl9ET1dOX0NPTlRST0woZGV2LT5yY19pZHgpLCAwKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZjb21fcGh5X2xvY2spOwogCiAJbXNtX3BjaWVfcGlwZV9jbGtfZGVpbml0KGRldik7CiAJbXNtX3BjaWVfY2xrX2RlaW5pdChkZXYpOwpAQCAtMzkxOSwyMCArMzg4NiwxMiBAQAogCWdwaW9fc2V0X3ZhbHVlKGRldi0+Z3Bpb1tNU01fUENJRV9HUElPX1BFUlNUXS5udW0sCiAJCQkJZGV2LT5ncGlvW01TTV9QQ0lFX0dQSU9fUEVSU1RdLm9uKTsKIAotCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKLQkJUENJRV9OX1NXX1JFU0VUKGRldi0+cmNfaWR4LCBkZXYtPmNvbW1vbl9waHkpLCAweDEpOwotCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKLQkJUENJRV9OX1BPV0VSX0RPV05fQ09OVFJPTChkZXYtPnJjX2lkeCwgZGV2LT5jb21tb25fcGh5KSwgMCk7Ci0KLQltdXRleF9sb2NrKCZjb21fcGh5X2xvY2spOwotCW51bV9yY19vbi0tOwotCWlmICghbnVtX3JjX29uICYmIGRldi0+Y29tbW9uX3BoeSkgewotCQlQQ0lFX0RCRyhkZXYsICJQQ0llOiBSQyVkIGlzIHBvd2VyaW5nIGRvd24gdGhlIGNvbW1vbiBwaHlcbiIsCi0JCQlkZXYtPnJjX2lkeCk7Ci0JCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwgUENJRV9DT01fU1dfUkVTRVQsIDB4MSk7Ci0JCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwgUENJRV9DT01fUE9XRVJfRE9XTl9DT05UUk9MLCAwKTsKKwlpZiAoZGV2LT5tYXhfbGlua19zcGVlZCAhPSBHRU4zX1NQRUVEKSB7CisJCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKKwkJCVBDSUVfTl9TV19SRVNFVChkZXYtPnJjX2lkeCksIDB4MSk7CisJCW1zbV9wY2llX3dyaXRlX3JlZyhkZXYtPnBoeSwKKwkJCVBDSUVfTl9QT1dFUl9ET1dOX0NPTlRST0woZGV2LT5yY19pZHgpLCAwKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZjb21fcGh5X2xvY2spOwogCiAJaWYgKG9wdGlvbnMgJiBQTV9DTEspIHsKIAkJbXNtX3BjaWVfd3JpdGVfbWFzayhkZXYtPnBhcmYgKyBQQ0lFMjBfUEFSRl9QSFlfQ1RSTCwgMCwKQEAgLTUzODIsMTIgKzUzNDEsMTIgQEAKIAkJUENJRV9EQkcoJm1zbV9wY2llX2RldltyY19pZHhdLCAibi1mdHM6IDB4JXguXG4iLAogCQkJCW1zbV9wY2llX2RldltyY19pZHhdLm5fZnRzKTsKIAotCW1zbV9wY2llX2RldltyY19pZHhdLmNvbW1vbl9waHkgPQotCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woKCZwZGV2LT5kZXYpLT5vZl9ub2RlLAotCQkJCSJxY29tLGNvbW1vbi1waHkiKTsKLQlQQ0lFX0RCRygmbXNtX3BjaWVfZGV2W3JjX2lkeF0sCi0JCSJQQ0llOiBSQyVkOiBDb21tb24gUEhZIGRvZXMgJXMgZXhpc3QuXG4iLAotCQlyY19pZHgsIG1zbV9wY2llX2RldltyY19pZHhdLmNvbW1vbl9waHkgPyAiIiA6ICJub3QiKTsKKwltc21fcGNpZV9kZXZbcmNfaWR4XS5tYXhfbGlua19zcGVlZCA9IEdFTjJfU1BFRUQ7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJInFjb20sbWF4LWxpbmstc3BlZWQiLAorCQkJCSZtc21fcGNpZV9kZXZbcmNfaWR4XS5tYXhfbGlua19zcGVlZCk7CisJUENJRV9EQkcoJm1zbV9wY2llX2RldltyY19pZHhdLCAiUENJZTogUkMlZDogbWF4LWxpbmstc3BlZWQ6IDB4JXguXG4iLAorCQlyY19pZHgsIG1zbV9wY2llX2RldltyY19pZHhdLm1heF9saW5rX3NwZWVkKTsKIAogCW1zbV9wY2llX2RldltyY19pZHhdLmV4dF9yZWZfY2xrID0KIAkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKCgmcGRldi0+ZGV2KS0+b2Zfbm9kZSwKQEAgLTU0MTksNiArNTM3OCwxNCBAQAogCQlQQ0lFX0RCRygmbXNtX3BjaWVfZGV2W3JjX2lkeF0sICJSQyVkOiB3ci1oYWx0LXNpemU6IDB4JXguXG4iLAogCQkJcmNfaWR4LCBtc21fcGNpZV9kZXZbcmNfaWR4XS53cl9oYWx0X3NpemUpOwogCisJbXNtX3BjaWVfZGV2W3JjX2lkeF0uc2x2X2FkZHJfc3BhY2Vfc2l6ZSA9IFNaXzE2TTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkicWNvbSxzbHYtYWRkci1zcGFjZS1zaXplIiwKKwkJCQkmbXNtX3BjaWVfZGV2W3JjX2lkeF0uc2x2X2FkZHJfc3BhY2Vfc2l6ZSk7CisJUENJRV9EQkcoJm1zbV9wY2llX2RldltyY19pZHhdLAorCQkiUkMlZDogc2x2LWFkZHItc3BhY2Utc2l6ZTogMHgleC5cbiIsCisJCXJjX2lkeCwgbXNtX3BjaWVfZGV2W3JjX2lkeF0uc2x2X2FkZHJfc3BhY2Vfc2l6ZSk7CisKIAltc21fcGNpZV9kZXZbcmNfaWR4XS5jcGxfdGltZW91dCA9IDA7CiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoKCZwZGV2LT5kZXYpLT5vZl9ub2RlLAogCQkJCSJxY29tLGNwbC10aW1lb3V0IiwKQEAgLTU1MTksOSArNTQ4Niw3IEBACiAJbXNtX3BjaWVfZGV2W3JjX2lkeF0ubnVtX2VwID0gMDsKIAltc21fcGNpZV9kZXZbcmNfaWR4XS5wZW5kaW5nX2VwX3JlZyA9IGZhbHNlOwogCW1zbV9wY2llX2RldltyY19pZHhdLnBoeV9sZW4gPSAwOwotCW1zbV9wY2llX2RldltyY19pZHhdLnBvcnRfcGh5X2xlbiA9IDA7CiAJbXNtX3BjaWVfZGV2W3JjX2lkeF0ucGh5X3NlcXVlbmNlID0gTlVMTDsKLQltc21fcGNpZV9kZXZbcmNfaWR4XS5wb3J0X3BoeV9zZXF1ZW5jZSA9IE5VTEw7CiAJbXNtX3BjaWVfZGV2W3JjX2lkeF0uZXZlbnRfcmVnID0gTlVMTDsKIAltc21fcGNpZV9kZXZbcmNfaWR4XS5saW5rZG93bl9jb3VudGVyID0gMDsKIAltc21fcGNpZV9kZXZbcmNfaWR4XS5saW5rX3R1cm5lZF9vbl9jb3VudGVyID0gMDsKQEAgLTU3MzAsNyArNTY5NSw2IEBACiAKIAlwY2llX2Rydi5yY19udW0gPSAwOwogCW11dGV4X2luaXQoJnBjaWVfZHJ2LmRydl9sb2NrKTsKLQltdXRleF9pbml0KCZjb21fcGh5X2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9SQ19OVU07IGkrKykgewogCQlzbnByaW50ZihyY19uYW1lLCBNQVhfUkNfTkFNRV9MRU4sICJwY2llJWQtc2hvcnQiLCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYwppbmRleCA5OTMxYmU2Li4wNGQ2ZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1tZXJyaWZpZWxkLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jCkBAIC0zNDMsOSArMzQzLDkgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtcmZsZF9zZGlvX3BpbnNbXSA9IHsgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXJmbGRfc3BpNV9waW5zW10gPSB7IDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQwX3BpbnNbXSA9IHsgMTI0LCAxMjUsIDEyNiwgMTI3IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQxX3BpbnNbXSA9IHsgMTI4LCAxMjksIDEzMCwgMTMxIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQyX3BpbnNbXSA9IHsgMTMyLCAxMzMsIDEzNCwgMTM1IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQwX3BpbnNbXSA9IHsgMTE1LCAxMTYsIDExNywgMTE4IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQxX3BpbnNbXSA9IHsgMTE5LCAxMjAsIDEyMSwgMTIyIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3VhcnQyX3BpbnNbXSA9IHsgMTIzLCAxMjQsIDEyNSwgMTI2IH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1yZmxkX3B3bTBfcGluc1tdID0geyAxNDQgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXJmbGRfcHdtMV9waW5zW10gPSB7IDE0NSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtcmZsZF9wd20yX3BpbnNbXSA9IHsgMTMyIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMKaW5kZXggYzM5MjhhYS4uNzUxMTcyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24tZ3hiYi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLWd4YmIuYwpAQCAtODUsNiArODUsNyBAQAogCU1FU09OX1BJTihHUElPRFZfMTUsIEVFX09GRiksCiAJTUVTT05fUElOKEdQSU9EVl8xNiwgRUVfT0ZGKSwKIAlNRVNPTl9QSU4oR1BJT0RWXzE3LCBFRV9PRkYpLAorCU1FU09OX1BJTihHUElPRFZfMTgsIEVFX09GRiksCiAJTUVTT05fUElOKEdQSU9EVl8xOSwgRUVfT0ZGKSwKIAlNRVNPTl9QSU4oR1BJT0RWXzIwLCBFRV9PRkYpLAogCU1FU09OX1BJTihHUElPRFZfMjEsIEVFX09GRiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vS2NvbmZpZwppbmRleCAwMmIyOGJkLi5kMzlhMTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL0tjb25maWcKQEAgLTc5LDYgKzc5LDE2IEBACiAJICBUaGlzIGlzIHRoZSBwaW5jdHJsLCBwaW5tdXgsIHBpbmNvbmYgYW5kIGdwaW9saWIgZHJpdmVyIGZvciB0aGUKIAkgIFF1YWxjb21tIFRMTU0gYmxvY2sgZm91bmQgb24gdGhlIFF1YWxjb21tIDg5MTYgcGxhdGZvcm0uCiAKK2NvbmZpZyBQSU5DVFJMX01TTTg5NTMKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzIEluYyBNU004OTUzIHBpbiBjb250cm9sbGVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YKKwlzZWxlY3QgUElOQ1RSTF9NU00KKwloZWxwCisJICBUaGlzIGlzIHRoZSBwaW5jdHJsLCBwaW5tdXgsIHBpbmNvbmYgYW5kIGdwaW9saWIgZHJpdmVyIGZvciB0aGUKKwkgIFF1YWxjb21tIFRlY2hub2xvZ2llcyBJbmMgVExNTSBibG9jayBmb3VuZCBvbiB0aGUgUXVhbGNvbW0KKwkgIFRlY2hub2xvZ2llcyBJbmMgTVNNODk1MyBwbGF0Zm9ybS4KKwkgIElmIHVuc3VyZSBzYXkgTi4KKwogY29uZmlnIFBJTkNUUkxfU0RNODQ1CiAJdHJpc3RhdGUgIlF1YWxjb21tIFRlY2hub2xvZ2llcyBJbmMgU0RNODQ1IHBpbiBjb250cm9sbGVyIGRyaXZlciIKIAlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YKQEAgLTE0OCwxOCArMTU4LDQgQEAKICAgICAgICAgIHdoaWNoIGFyZSB1c2luZyBTU0JJIGZvciBjb21tdW5pY2F0aW9uIHdpdGggU29DLiBFeGFtcGxlIFBNSUMncwogICAgICAgICAgZGV2aWNlcyBhcmUgcG04MDU4IGFuZCBwbTg5MjEuCiAKLWNvbmZpZyBQSU5DVFJMX1dDRAotCXRyaXN0YXRlICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYyBXQ0QgcGluIGNvbnRyb2xsZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gV0NEOVhYWF9DT0RFQ19DT1JFCi0JaGVscAotCSAgVGhpcyBpcyB0aGUgcGluY3RybCwgcGlubXV4LCBwaW5jb25mIGFuZCBncGlvbGliIGRyaXZlciBmb3IgdGhlCi0JICBXQ0QgZ3BpbyBjb250cm9sbGVyIGJsb2NrLgotCi1jb25maWcgUElOQ1RSTF9MUEkKLQl0cmlzdGF0ZSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMgTFBJIHBpbiBjb250cm9sbGVyIGRyaXZlciIKLQlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgT0YKLQloZWxwCi0JICBUaGlzIGlzIHRoZSBwaW5jdHJsLCBwaW5tdXgsIHBpbmNvbmYgYW5kIGdwaW9saWIgZHJpdmVyIGZvciB0aGUKLQkgIExQSSBncGlvIGNvbnRyb2xsZXIgYmxvY2suCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9xY29tL01ha2VmaWxlCmluZGV4IDZhNDk2NzEuLmQ5MmRiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL01ha2VmaWxlCkBAIC0xMSwxMiArMTEsMTEgQEAKIG9iai0kKENPTkZJR19QSU5DVFJMX01TTTg5OTYpICAgKz0gcGluY3RybC1tc204OTk2Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1FERjJYWFgpCSs9IHBpbmN0cmwtcWRmMnh4eC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9NRE05NjE1KQkrPSBwaW5jdHJsLW1kbTk2MTUubworb2JqLSQoQ09ORklHX1BJTkNUUkxfTVNNODk1MykgICArPSBwaW5jdHJsLW1zbTg5NTMubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUUNPTV9TUE1JX1BNSUMpICs9IHBpbmN0cmwtc3BtaS1ncGlvLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1FDT01fU1BNSV9QTUlDKSArPSBwaW5jdHJsLXNwbWktbXBwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1FDT01fU1NCSV9QTUlDKSArPSBwaW5jdHJsLXNzYmktZ3Bpby5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9RQ09NX1NTQklfUE1JQykgKz0gcGluY3RybC1zc2JpLW1wcC5vCi1vYmotJChDT05GSUdfUElOQ1RSTF9TRE04NDUpICs9IHBpbmN0cmwtc2RtODQ1Lm8KK29iai0kKENPTkZJR19QSU5DVFJMX1NETTg0NSkgKz0gcGluY3RybC1zZG04NDUubyBwaW5jdHJsLXNkbTg0NS12Mi5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9TRE02NzApICs9IHBpbmN0cmwtc2RtNjcwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1NEWFBPT1JXSUxMUykJKz0gcGluY3RybC1zZHhwb29yd2lsbHMubwotb2JqLSQoQ09ORklHX1BJTkNUUkxfV0NEKQkrPSBwaW5jdHJsLXdjZC5vCi1vYmotJChDT05GSUdfUElOQ1RSTF9MUEkpCSs9IHBpbmN0cmwtbHBpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbHBpLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLWxwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWMzNWI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbHBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlICIuLi9jb3JlLmgiCi0jaW5jbHVkZSAiLi4vcGluY3RybC11dGlscy5oIgotCi0jZGVmaW5lIExQSV9BRERSRVNTX1NJWkUJCQkweDIwMDAwCi0KLSNkZWZpbmUgTFBJX0dQSU9fUkVHX1ZBTF9DVEwJCQkweDAwCi0jZGVmaW5lIExQSV9HUElPX1JFR19ESVJfQ1RMCQkJMHgwNAotCi0jZGVmaW5lIExQSV9HUElPX1JFR19QVUxMX1NISUZUCQkJMHgwCi0jZGVmaW5lIExQSV9HUElPX1JFR19QVUxMX01BU0sJCQkweDMKLQotI2RlZmluZSBMUElfR1BJT19SRUdfRlVOQ1RJT05fU0hJRlQJCTB4MgotI2RlZmluZSBMUElfR1BJT19SRUdfRlVOQ1RJT05fTUFTSwkJMHgzQwotCi0jZGVmaW5lIExQSV9HUElPX1JFR19PVVRfU1RSRU5HVEhfU0hJRlQJCTB4NgotI2RlZmluZSBMUElfR1BJT19SRUdfT1VUX1NUUkVOR1RIX01BU0sJCTB4MUMwCi0KLSNkZWZpbmUgTFBJX0dQSU9fUkVHX09FX1NISUZUCQkJMHg5Ci0jZGVmaW5lIExQSV9HUElPX1JFR19PRV9NQVNLCQkJMHgyMDAKLQotI2RlZmluZSBMUElfR1BJT19SRUdfRElSX1NISUZUCQkJMHgxCi0jZGVmaW5lIExQSV9HUElPX1JFR19ESVJfTUFTSwkJCTB4MgotCi0jZGVmaW5lIExQSV9HUElPX0JJQVNfRElTQUJMRQkJCTB4MAotI2RlZmluZSBMUElfR1BJT19QVUxMX0RPV04JCQkweDEKLSNkZWZpbmUgTFBJX0dQSU9fS0VFUEVSCQkJCTB4MgotI2RlZmluZSBMUElfR1BJT19QVUxMX1VQCQkJMHgzCi0KLSNkZWZpbmUgTFBJX0dQSU9fRlVOQ19HUElPCQkJImdwaW8iCi0jZGVmaW5lIExQSV9HUElPX0ZVTkNfRlVOQzEJCQkiZnVuYzEiCi0jZGVmaW5lIExQSV9HUElPX0ZVTkNfRlVOQzIJCQkiZnVuYzIiCi0jZGVmaW5lIExQSV9HUElPX0ZVTkNfRlVOQzMJCQkiZnVuYzMiCi0jZGVmaW5lIExQSV9HUElPX0ZVTkNfRlVOQzQJCQkiZnVuYzQiCi0jZGVmaW5lIExQSV9HUElPX0ZVTkNfRlVOQzUJCQkiZnVuYzUiCi0KLXN0YXRpYyBib29sIGxwaV9kZXZfdXA7Ci0KLS8qIFRoZSBpbmRleCBvZiBlYWNoIGZ1bmN0aW9uIGluIGxwaV9ncGlvX2Z1bmN0aW9uc1tdIGFycmF5ICovCi1lbnVtIGxwaV9ncGlvX2Z1bmNfaW5kZXggewotCUxQSV9HUElPX0ZVTkNfSU5ERVhfR1BJTwk9IDB4MDAsCi0JTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DMQk9IDB4MDEsCi0JTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DMgk9IDB4MDIsCi0JTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DMwk9IDB4MDMsCi0JTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DNAk9IDB4MDQsCi0JTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DNQk9IDB4MDUsCi19OwotCi0vKioKLSAqIHN0cnVjdCBscGlfZ3Bpb19wYWQgLSBrZWVwIGN1cnJlbnQgR1BJTyBzZXR0aW5ncwotICogQG9mZnNldDogTnRoIEdQSU8gaW4gc3VwcG9ydGVkIEdQSU9zLgotICogQG91dHB1dF9lbmFibGVkOiBTZXQgdG8gdHJ1ZSBpZiBHUElPIG91dHB1dCBsb2dpYyBpcyBlbmFibGVkLgotICogQHZhbHVlOiB2YWx1ZSBvZiBhIHBpbgotICogQGJhc2U6IEFkZHJlc3MgYmFzZSBvZiBMUEkgR1BJTyBQQUQuCi0gKiBAcHVsbHVwOiBDb25zdGFudCBjdXJyZW50IHdoaWNoIGZsb3cgdGhyb3VnaCBHUElPIG91dHB1dCBidWZmZXIuCi0gKiBAc3RyZW5ndGg6IE5vLCBMb3csIE1lZGl1bSwgSGlnaAotICogQGZ1bmN0aW9uOiBTZWUgbHBpX2dwaW9fZnVuY3Rpb25zW10KLSAqLwotc3RydWN0IGxwaV9ncGlvX3BhZCB7Ci0JdTE2CQlvZmZzZXQ7Ci0JYm9vbAkJb3V0cHV0X2VuYWJsZWQ7Ci0JYm9vbAkJdmFsdWU7Ci0JY2hhciBfX2lvbWVtCSpiYXNlOwotCXVuc2lnbmVkIGludAlwdWxsdXA7Ci0JdW5zaWduZWQgaW50CXN0cmVuZ3RoOwotCXVuc2lnbmVkIGludAlmdW5jdGlvbjsKLX07Ci0KLXN0cnVjdCBscGlfZ3Bpb19zdGF0ZSB7Ci0Jc3RydWN0IGRldmljZQkqZGV2OwotCXN0cnVjdCBwaW5jdHJsX2RldiAqY3RybDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci0JY2hhciBfX2lvbWVtCSpiYXNlOwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxwaV9ncGlvX2dyb3Vwc1tdID0gewotCSJncGlvMCIsICJncGlvMSIsICJncGlvMiIsICJncGlvMyIsICJncGlvNCIsICJncGlvNSIsICJncGlvNiIsICJncGlvNyIsCi0JImdwaW84IiwgImdwaW85IiwgImdwaW8xMCIsICJncGlvMTEiLCAiZ3BpbzEyIiwgImdwaW8xMyIsICJncGlvMTQiLAotCSJncGlvMTUiLCAiZ3BpbzE2IiwgImdwaW8xNyIsICJncGlvMTgiLCAiZ3BpbzE5IiwgImdwaW8yMCIsICJncGlvMjEiLAotCSJncGlvMjIiLCAiZ3BpbzIzIiwgImdwaW8yNCIsICJncGlvMjUiLCAiZ3BpbzI2IiwgImdwaW8yNyIsICJncGlvMjgiLAotCSJncGlvMjkiLCAiZ3BpbzMwIiwgImdwaW8zMSIsCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIGxwaV9vZmZzZXRbXSA9IHsKLQkweDAwMDAwMDAwLAotCTB4MDAwMDEwMDAsCi0JMHgwMDAwMjAwMCwKLQkweDAwMDAzMDAwLAotCTB4MDAwMDQwMDAsCi0JMHgwMDAwNTAwMCwKLQkweDAwMDA2MDAwLAotCTB4MDAwMDcwMDAsCi0JMHgwMDAwODAwMCwKLQkweDAwMDA5MDAwLAotCTB4MDAwMEEwMDAsCi0JMHgwMDAwQjAwMCwKLQkweDAwMDBDMDAwLAotCTB4MDAwMEQwMDAsCi0JMHgwMDAwRTAwMCwKLQkweDAwMDBGMDAwLAotCTB4MDAwMTAwMDAsCi0JMHgwMDAxMTAwMCwKLQkweDAwMDEyMDAwLAotCTB4MDAwMTMwMDAsCi0JMHgwMDAxNDAwMCwKLQkweDAwMDE1MDAwLAotCTB4MDAwMTYwMDAsCi0JMHgwMDAxNzAwMCwKLQkweDAwMDE4MDAwLAotCTB4MDAwMTkwMDAsCi0JMHgwMDAxQTAwMCwKLQkweDAwMDFCMDAwLAotCTB4MDAwMUMwMDAsCi0JMHgwMDAxRDAwMCwKLQkweDAwMDFFMDAwLAotCTB4MDAwMUYwMDAsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbHBpX2dwaW9fZnVuY3Rpb25zW10gPSB7Ci0JW0xQSV9HUElPX0ZVTkNfSU5ERVhfR1BJT10JPSBMUElfR1BJT19GVU5DX0dQSU8sCi0JW0xQSV9HUElPX0ZVTkNfSU5ERVhfRlVOQzFdCT0gTFBJX0dQSU9fRlVOQ19GVU5DMSwKLQlbTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DMl0JPSBMUElfR1BJT19GVU5DX0ZVTkMyLAotCVtMUElfR1BJT19GVU5DX0lOREVYX0ZVTkMzXQk9IExQSV9HUElPX0ZVTkNfRlVOQzMsCi0JW0xQSV9HUElPX0ZVTkNfSU5ERVhfRlVOQzRdCT0gTFBJX0dQSU9fRlVOQ19GVU5DNCwKLQlbTFBJX0dQSU9fRlVOQ19JTkRFWF9GVU5DNV0JPSBMUElfR1BJT19GVU5DX0ZVTkM1LAotfTsKLQotc3RhdGljIGludCBscGlfZ3Bpb19yZWFkKHN0cnVjdCBscGlfZ3Bpb19wYWQgKnBhZCwgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0JaW50IHJldDsKLQotCWlmICghbHBpX2Rldl91cCkgewotCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIiVzOiBBRFNQIGlzIGRvd24gZHVlIHRvIFNTUiwgcmV0dXJuXG4iLAotCQkJCSAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0ID0gaW9yZWFkMzIocGFkLT5iYXNlICsgcGFkLT5vZmZzZXQgKyBhZGRyKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogcmVhZCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18sIGFkZHIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBscGlfZ3Bpb193cml0ZShzdHJ1Y3QgbHBpX2dwaW9fcGFkICpwYWQsIHVuc2lnbmVkIGludCBhZGRyLAotCQkJICB1bnNpZ25lZCBpbnQgdmFsKQotewotCWlmICghbHBpX2Rldl91cCkgewotCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIiVzOiBBRFNQIGlzIGRvd24gZHVlIHRvIFNTUiwgcmV0dXJuXG4iLAotCQkJCSAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaW93cml0ZTMyKHZhbCwgcGFkLT5iYXNlICsgcGFkLT5vZmZzZXQgKyBhZGRyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBscGlfZ3Bpb19nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKLXsKLQkvKiBFdmVyeSBQSU4gaXMgYSBncm91cCAqLwotCXJldHVybiBwY3RsZGV2LT5kZXNjLT5ucGluczsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxwaV9ncGlvX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkJICAgdW5zaWduZWQgaW50IHBpbikKLXsKLQlyZXR1cm4gcGN0bGRldi0+ZGVzYy0+cGluc1twaW5dLm5hbWU7Ci19Ci0KLXN0YXRpYyBpbnQgbHBpX2dwaW9fZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCSAgIHVuc2lnbmVkIGludCBwaW4sCi0JCQkJICAgY29uc3QgdW5zaWduZWQgaW50ICoqcGlucywKLQkJCQkgICB1bnNpZ25lZCBpbnQgKm51bV9waW5zKQotewotCSpwaW5zID0gJnBjdGxkZXYtPmRlc2MtPnBpbnNbcGluXS5udW1iZXI7Ci0JKm51bV9waW5zID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX29wcyBscGlfZ3Bpb19waW5jdHJsX29wcyA9IHsKLQkuZ2V0X2dyb3Vwc19jb3VudAk9IGxwaV9ncGlvX2dldF9ncm91cHNfY291bnQsCi0JLmdldF9ncm91cF9uYW1lCQk9IGxwaV9ncGlvX2dldF9ncm91cF9uYW1lLAotCS5nZXRfZ3JvdXBfcGlucwkJPSBscGlfZ3Bpb19nZXRfZ3JvdXBfcGlucywKLQkuZHRfbm9kZV90b19tYXAJCT0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX2dyb3VwLAotCS5kdF9mcmVlX21hcAkJPSBwaW5jdHJsX3V0aWxzX2ZyZWVfbWFwLAotfTsKLQotc3RhdGljIGludCBscGlfZ3Bpb19nZXRfZnVuY3Rpb25zX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShscGlfZ3Bpb19mdW5jdGlvbnMpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbHBpX2dwaW9fZ2V0X2Z1bmN0aW9uX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCi17Ci0JcmV0dXJuIGxwaV9ncGlvX2Z1bmN0aW9uc1tmdW5jdGlvbl07Ci19Ci0KLXN0YXRpYyBpbnQgbHBpX2dwaW9fZ2V0X2Z1bmN0aW9uX2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCi0JCQkJCXVuc2lnbmVkIGludCBmdW5jdGlvbiwKLQkJCQkJY29uc3QgY2hhciAqY29uc3QgKipncm91cHMsCi0JCQkJCXVuc2lnbmVkICpjb25zdCBudW1fcWdyb3VwcykKLXsKLQkqZ3JvdXBzID0gbHBpX2dwaW9fZ3JvdXBzOwotCSpudW1fcWdyb3VwcyA9IHBjdGxkZXYtPmRlc2MtPm5waW5zOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxwaV9ncGlvX3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCi0JCQkgICAgdW5zaWduZWQgaW50IHBpbikKLXsKLQlzdHJ1Y3QgbHBpX2dwaW9fcGFkICpwYWQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXBhZCA9IHBjdGxkZXYtPmRlc2MtPnBpbnNbcGluXS5kcnZfZGF0YTsKLQotCXBhZC0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQotCXZhbCA9IGxwaV9ncGlvX3JlYWQocGFkLCBMUElfR1BJT19SRUdfVkFMX0NUTCk7Ci0JdmFsICY9IH4oTFBJX0dQSU9fUkVHX0ZVTkNUSU9OX01BU0spOwotCXZhbCB8PSBwYWQtPmZ1bmN0aW9uIDw8IExQSV9HUElPX1JFR19GVU5DVElPTl9TSElGVDsKLQlscGlfZ3Bpb193cml0ZShwYWQsIExQSV9HUElPX1JFR19WQUxfQ1RMLCB2YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgbHBpX2dwaW9fcGlubXV4X29wcyA9IHsKLQkuZ2V0X2Z1bmN0aW9uc19jb3VudAk9IGxwaV9ncGlvX2dldF9mdW5jdGlvbnNfY291bnQsCi0JLmdldF9mdW5jdGlvbl9uYW1lCT0gbHBpX2dwaW9fZ2V0X2Z1bmN0aW9uX25hbWUsCi0JLmdldF9mdW5jdGlvbl9ncm91cHMJPSBscGlfZ3Bpb19nZXRfZnVuY3Rpb25fZ3JvdXBzLAotCS5zZXRfbXV4CQk9IGxwaV9ncGlvX3NldF9tdXgsCi19OwotCi1zdGF0aWMgaW50IGxwaV9jb25maWdfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCSAgdW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQotewotCXVuc2lnbmVkIGludCBwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKCpjb25maWcpOwotCXN0cnVjdCBscGlfZ3Bpb19wYWQgKnBhZDsKLQl1bnNpZ25lZCBpbnQgYXJnOwotCi0JcGFkID0gcGN0bGRldi0+ZGVzYy0+cGluc1twaW5dLmRydl9kYXRhOwotCi0Jc3dpdGNoIChwYXJhbSkgewotCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6Ci0JCWFyZyA9IHBhZC0+cHVsbHVwID0gTFBJX0dQSU9fQklBU19ESVNBQkxFOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX0RPV046Ci0JCWFyZyA9IHBhZC0+cHVsbHVwID09IExQSV9HUElPX1BVTExfRE9XTjsKLQkJYnJlYWs7Ci0JY2FzZSBQSU5fQ09ORklHX0JJQVNfQlVTX0hPTEQ6Ci0JCWFyZyA9IHBhZC0+cHVsbHVwID0gTFBJX0dQSU9fS0VFUEVSOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgotCQlhcmcgPSBwYWQtPnB1bGx1cCA9PSBMUElfR1BJT19QVUxMX1VQOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgotCWNhc2UgUElOX0NPTkZJR19PVVRQVVQ6Ci0JCWFyZyA9IHBhZC0+b3V0cHV0X2VuYWJsZWQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSpjb25maWcgPSBwaW5jb25mX3RvX2NvbmZpZ19wYWNrZWQocGFyYW0sIGFyZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbHBpX2RyaXZlX3RvX3JlZ3ZhbCh1MzIgYXJnKQotewotCXJldHVybiAoYXJnLzIgLSAxKTsKLX0KLQotc3RhdGljIGludCBscGlfY29uZmlnX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGludCBwaW4sCi0JCQkgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZ3MsIHVuc2lnbmVkIGludCBuY29uZnMpCi17Ci0Jc3RydWN0IGxwaV9ncGlvX3BhZCAqcGFkOwotCXVuc2lnbmVkIGludCBwYXJhbSwgYXJnOwotCWludCBpLCByZXQgPSAwLCB2YWw7Ci0KLQlwYWQgPSBwY3RsZGV2LT5kZXNjLT5waW5zW3Bpbl0uZHJ2X2RhdGE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbmNvbmZzOyBpKyspIHsKLQkJcGFyYW0gPSBwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKTsKLQkJYXJnID0gcGluY29uZl90b19jb25maWdfYXJndW1lbnQoY29uZmlnc1tpXSk7Ci0KLQkJZGV2X2RiZyhwY3RsZGV2LT5kZXYsICIlczogcGFyYW06ICVkIGFyZzogJWQgcGluOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXJhbSwgYXJnLCBwaW4pOwotCi0JCXN3aXRjaCAocGFyYW0pIHsKLQkJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKLQkJCXBhZC0+cHVsbHVwID0gTFBJX0dQSU9fQklBU19ESVNBQkxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKLQkJCXBhZC0+cHVsbHVwID0gTFBJX0dQSU9fUFVMTF9ET1dOOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19CSUFTX0JVU19IT0xEOgotCQkJcGFkLT5wdWxsdXAgPSBMUElfR1BJT19LRUVQRVI7Ci0JCQlicmVhazsKLQkJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKLQkJCXBhZC0+cHVsbHVwID0gTFBJX0dQSU9fUFVMTF9VUDsKLQkJCWJyZWFrOwotCQljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgotCQkJcGFkLT5vdXRwdXRfZW5hYmxlZCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19PVVRQVVQ6Ci0JCQlwYWQtPm91dHB1dF9lbmFibGVkID0gdHJ1ZTsKLQkJCXBhZC0+dmFsdWUgPSBhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgotCQkJcGFkLT5zdHJlbmd0aCA9IGFyZzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCXZhbCA9IGxwaV9ncGlvX3JlYWQocGFkLCBMUElfR1BJT19SRUdfVkFMX0NUTCk7Ci0JdmFsICY9IH4oTFBJX0dQSU9fUkVHX1BVTExfTUFTSyB8IExQSV9HUElPX1JFR19PVVRfU1RSRU5HVEhfTUFTSyB8Ci0JCSBMUElfR1BJT19SRUdfT0VfTUFTSyk7Ci0JdmFsIHw9IHBhZC0+cHVsbHVwIDw8IExQSV9HUElPX1JFR19QVUxMX1NISUZUOwotCXZhbCB8PSBscGlfZHJpdmVfdG9fcmVndmFsKHBhZC0+c3RyZW5ndGgpIDw8Ci0JCUxQSV9HUElPX1JFR19PVVRfU1RSRU5HVEhfU0hJRlQ7Ci0JaWYgKHBhZC0+b3V0cHV0X2VuYWJsZWQpCi0JCXZhbCB8PSBwYWQtPnZhbHVlIDw8IExQSV9HUElPX1JFR19PRV9TSElGVDsKLQotCWxwaV9ncGlvX3dyaXRlKHBhZCwgTFBJX0dQSU9fUkVHX1ZBTF9DVEwsIHZhbCk7Ci0JbHBpX2dwaW9fd3JpdGUocGFkLCBMUElfR1BJT19SRUdfRElSX0NUTCwKLQkJICAgICAgIHBhZC0+b3V0cHV0X2VuYWJsZWQgPDwgTFBJX0dQSU9fUkVHX0RJUl9TSElGVCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY29uZl9vcHMgbHBpX2dwaW9fcGluY29uZl9vcHMgPSB7Ci0JLmlzX2dlbmVyaWMJCQk9IHRydWUsCi0JLnBpbl9jb25maWdfZ3JvdXBfZ2V0CQk9IGxwaV9jb25maWdfZ2V0LAotCS5waW5fY29uZmlnX2dyb3VwX3NldAkJPSBscGlfY29uZmlnX3NldCwKLX07Ci0KLXN0YXRpYyBpbnQgbHBpX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaW4pCi17Ci0Jc3RydWN0IGxwaV9ncGlvX3N0YXRlICpzdGF0ZSA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCXVuc2lnbmVkIGxvbmcgY29uZmlnOwotCi0JY29uZmlnID0gcGluY29uZl90b19jb25maWdfcGFja2VkKFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFLCAxKTsKLQotCXJldHVybiBscGlfY29uZmlnX3NldChzdGF0ZS0+Y3RybCwgcGluLCAmY29uZmlnLCAxKTsKLX0KLQotc3RhdGljIGludCBscGlfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgcGluLCBpbnQgdmFsKQotewotCXN0cnVjdCBscGlfZ3Bpb19zdGF0ZSAqc3RhdGUgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZzsKLQotCWNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChQSU5fQ09ORklHX09VVFBVVCwgdmFsKTsKLQotCXJldHVybiBscGlfY29uZmlnX3NldChzdGF0ZS0+Y3RybCwgcGluLCAmY29uZmlnLCAxKTsKLX0KLQotc3RhdGljIGludCBscGlfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpbikKLXsKLQlzdHJ1Y3QgbHBpX2dwaW9fc3RhdGUgKnN0YXRlID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7Ci0Jc3RydWN0IGxwaV9ncGlvX3BhZCAqcGFkOwotCWludCB2YWx1ZTsKLQotCXBhZCA9IHN0YXRlLT5jdHJsLT5kZXNjLT5waW5zW3Bpbl0uZHJ2X2RhdGE7Ci0KLQl2YWx1ZSA9IGxwaV9ncGlvX3JlYWQocGFkLCBMUElfR1BJT19SRUdfVkFMX0NUTCk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBscGlfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpbiwgaW50IHZhbHVlKQotewotCXN0cnVjdCBscGlfZ3Bpb19zdGF0ZSAqc3RhdGUgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZzsKLQotCWNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChQSU5fQ09ORklHX09VVFBVVCwgdmFsdWUpOwotCi0JbHBpX2NvbmZpZ19zZXQoc3RhdGUtPmN0cmwsIHBpbiwgJmNvbmZpZywgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgbHBpX25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpwdHIpCi17Ci0Jc3RhdGljIGJvb2wgaW5pdGlhbF9ib290ID0gdHJ1ZTsKLQotCXByX2RlYnVnKCIlczogU2VydmljZSBvcGNvZGUgMHglbHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOwotCi0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjoKLQkJaWYgKGluaXRpYWxfYm9vdCkgewotCQkJaW5pdGlhbF9ib290ID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlscGlfZGV2X3VwID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKLQkJaWYgKGluaXRpYWxfYm9vdCkKLQkJCWluaXRpYWxfYm9vdCA9IGZhbHNlOwotCQlscGlfZGV2X3VwID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2VydmljZV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCAgPSBscGlfbm90aWZpZXJfc2VydmljZV9jYiwKLQkucHJpb3JpdHkgPSAtSU5UX01BWCwKLX07Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGxwaV9yZWd2YWxfdG9fZHJpdmUodTMyIHZhbCkKLXsKLQlyZXR1cm4gKHZhbCArIDEpICogMjsKLX0KLQotc3RhdGljIHZvaWQgbHBpX2dwaW9fZGJnX3Nob3dfb25lKHN0cnVjdCBzZXFfZmlsZSAqcywKLQkJCQkgIHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkgIHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCQkJCSAgdW5zaWduZWQgaW50IGdwaW8pCi17Ci0Jc3RydWN0IGxwaV9ncGlvX3N0YXRlICpzdGF0ZSA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCXN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIHBpbmRlc2M7Ci0Jc3RydWN0IGxwaV9ncGlvX3BhZCAqcGFkOwotCXVuc2lnbmVkIGludCBmdW5jOwotCWludCBpc19vdXQ7Ci0JaW50IGRyaXZlOwotCWludCBwdWxsOwotCXUzMiBjdGxfcmVnOwotCi0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwdWxsc1tdID0gewotCQkibm8gcHVsbCIsCi0JCSJwdWxsIGRvd24iLAotCQkia2VlcGVyIiwKLQkJInB1bGwgdXAiCi0JfTsKLQotCXBjdGxkZXYgPSBwY3RsZGV2ID8gOiBzdGF0ZS0+Y3RybDsKLQlwaW5kZXNjID0gcGN0bGRldi0+ZGVzYy0+cGluc1tvZmZzZXRdOwotCXBhZCA9IHBjdGxkZXYtPmRlc2MtPnBpbnNbb2Zmc2V0XS5kcnZfZGF0YTsKLQljdGxfcmVnID0gbHBpX2dwaW9fcmVhZChwYWQsIExQSV9HUElPX1JFR19ESVJfQ1RMKTsKLQlpc19vdXQgPSAoY3RsX3JlZyAmIExQSV9HUElPX1JFR19ESVJfTUFTSykgPj4gTFBJX0dQSU9fUkVHX0RJUl9TSElGVDsKLQljdGxfcmVnID0gbHBpX2dwaW9fcmVhZChwYWQsIExQSV9HUElPX1JFR19WQUxfQ1RMKTsKLQotCWZ1bmMgPSAoY3RsX3JlZyAmIExQSV9HUElPX1JFR19GVU5DVElPTl9NQVNLKSA+PgotCQlMUElfR1BJT19SRUdfRlVOQ1RJT05fU0hJRlQ7Ci0JZHJpdmUgPSAoY3RsX3JlZyAmIExQSV9HUElPX1JFR19PVVRfU1RSRU5HVEhfTUFTSykgPj4KLQkJIExQSV9HUElPX1JFR19PVVRfU1RSRU5HVEhfU0hJRlQ7Ci0JcHVsbCA9IChjdGxfcmVnICYgTFBJX0dQSU9fUkVHX1BVTExfTUFTSykgPj4gTFBJX0dQSU9fUkVHX1BVTExfU0hJRlQ7Ci0KLQlzZXFfcHJpbnRmKHMsICIgJS04czogJS0zcyAlZCIsCi0JCSAgIHBpbmRlc2MubmFtZSwgaXNfb3V0ID8gIm91dCIgOiAiaW4iLCBmdW5jKTsKLQlzZXFfcHJpbnRmKHMsICIgJWRtQSIsIGxwaV9yZWd2YWxfdG9fZHJpdmUoZHJpdmUpKTsKLQlzZXFfcHJpbnRmKHMsICIgJXMiLCBwdWxsc1twdWxsXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwaV9ncGlvX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKLXsKLQl1bnNpZ25lZCBpbnQgZ3BpbyA9IGNoaXAtPmJhc2U7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bmdwaW87IGkrKywgZ3BpbysrKSB7Ci0JCWxwaV9ncGlvX2RiZ19zaG93X29uZShzLCBOVUxMLCBjaGlwLCBpLCBncGlvKTsKLQkJc2VxX3B1dHMocywgIlxuIik7Ci0JfQotfQotCi0jZWxzZQotI2RlZmluZSBscGlfZ3Bpb19kYmdfc2hvdyBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgbHBpX2dwaW9fdGVtcGxhdGUgPSB7Ci0JLmRpcmVjdGlvbl9pbnB1dAk9IGxwaV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IGxwaV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCi0JLmdldAkJCT0gbHBpX2dwaW9fZ2V0LAotCS5zZXQJCQk9IGxwaV9ncGlvX3NldCwKLQkucmVxdWVzdAkJPSBncGlvY2hpcF9nZW5lcmljX3JlcXVlc3QsCi0JLmZyZWUJCQk9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZSwKLQkuZGJnX3Nob3cJCT0gbHBpX2dwaW9fZGJnX3Nob3csCi19OwotCi1zdGF0aWMgaW50IGxwaV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluZGVzYzsKLQlzdHJ1Y3QgcGluY3RybF9kZXNjICpwY3RybGRlc2M7Ci0Jc3RydWN0IGxwaV9ncGlvX3BhZCAqcGFkLCAqcGFkczsKLQlzdHJ1Y3QgbHBpX2dwaW9fc3RhdGUgKnN0YXRlOwotCWludCByZXQsIG5waW5zLCBpOwotCWNoYXIgX19pb21lbSAqbHBpX2Jhc2U7Ci0JdTMyIHJlZzsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInJlZyIsICZyZWcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAibWlzc2luZyBiYXNlIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInFjb20sbnVtLWdwaW9zIiwgJm5waW5zKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCVdBUk5fT04obnBpbnMgPiBBUlJBWV9TSVpFKGxwaV9ncGlvX2dyb3VwcykpOwotCi0Jc3RhdGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzdGF0ZSk7Ci0KLQlzdGF0ZS0+ZGV2ID0gJnBkZXYtPmRldjsKLQotCXBpbmRlc2MgPSBkZXZtX2tjYWxsb2MoZGV2LCBucGlucywgc2l6ZW9mKCpwaW5kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaW5kZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBhZHMgPSBkZXZtX2tjYWxsb2MoZGV2LCBucGlucywgc2l6ZW9mKCpwYWRzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWRzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjdHJsZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGN0cmxkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY3RybGRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGN0cmxkZXNjLT5wY3Rsb3BzID0gJmxwaV9ncGlvX3BpbmN0cmxfb3BzOwotCXBjdHJsZGVzYy0+cG14b3BzID0gJmxwaV9ncGlvX3Bpbm11eF9vcHM7Ci0JcGN0cmxkZXNjLT5jb25mb3BzID0gJmxwaV9ncGlvX3BpbmNvbmZfb3BzOwotCXBjdHJsZGVzYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlwY3RybGRlc2MtPm5hbWUgPSBkZXZfbmFtZShkZXYpOwotCXBjdHJsZGVzYy0+cGlucyA9IHBpbmRlc2M7Ci0JcGN0cmxkZXNjLT5ucGlucyA9IG5waW5zOwotCi0JbHBpX2Jhc2UgPSBkZXZtX2lvcmVtYXAoZGV2LCByZWcsIExQSV9BRERSRVNTX1NJWkUpOwotCWlmIChscGlfYmFzZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgZGV2bV9pb3JlbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzdGF0ZS0+YmFzZSA9IGxwaV9iYXNlOwotCi0JZm9yIChpID0gMDsgaSA8IG5waW5zOyBpKyssIHBpbmRlc2MrKykgewotCQlwYWQgPSAmcGFkc1tpXTsKLQkJcGluZGVzYy0+ZHJ2X2RhdGEgPSBwYWQ7Ci0JCXBpbmRlc2MtPm51bWJlciA9IGk7Ci0JCXBpbmRlc2MtPm5hbWUgPSBscGlfZ3Bpb19ncm91cHNbaV07Ci0KLQkJcGFkLT5iYXNlID0gbHBpX2Jhc2U7Ci0JCXBhZC0+b2Zmc2V0ID0gbHBpX29mZnNldFtpXTsKLQl9Ci0KLQlzdGF0ZS0+Y2hpcCA9IGxwaV9ncGlvX3RlbXBsYXRlOwotCXN0YXRlLT5jaGlwLnBhcmVudCA9IGRldjsKLQlzdGF0ZS0+Y2hpcC5iYXNlID0gLTE7Ci0Jc3RhdGUtPmNoaXAubmdwaW8gPSBucGluczsKLQlzdGF0ZS0+Y2hpcC5sYWJlbCA9IGRldl9uYW1lKGRldik7Ci0Jc3RhdGUtPmNoaXAub2ZfZ3Bpb19uX2NlbGxzID0gMjsKLQlzdGF0ZS0+Y2hpcC5jYW5fc2xlZXAgPSBmYWxzZTsKLQotCXN0YXRlLT5jdHJsID0gZGV2bV9waW5jdHJsX3JlZ2lzdGVyKGRldiwgcGN0cmxkZXNjLCBzdGF0ZSk7Ci0JaWYgKElTX0VSUihzdGF0ZS0+Y3RybCkpCi0JCXJldHVybiBQVFJfRVJSKHN0YXRlLT5jdHJsKTsKLQotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZzdGF0ZS0+Y2hpcCwgc3RhdGUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzdGF0ZS0+ZGV2LCAiY2FuJ3QgYWRkIGdwaW8gY2hpcFxuIik7Ci0JCWdvdG8gZXJyX2NoaXA7Ci0JfQotCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX3Bpbl9yYW5nZSgmc3RhdGUtPmNoaXAsIGRldl9uYW1lKGRldiksIDAsIDAsIG5waW5zKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBwaW4gcmFuZ2VcbiIpOwotCQlnb3RvIGVycl9yYW5nZTsKLQl9Ci0KLQlscGlfZGV2X3VwID0gdHJ1ZTsKLQlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3RlcigibHBpX3RsbW0iLCBBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTiwKLQkJCQkgICAgICAmc2VydmljZV9uYik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogQXVkaW8gbm90aWZpZXIgcmVnaXN0ZXIgZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3JhbmdlOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfcmFuZ2U6Ci0JZ3Bpb2NoaXBfcmVtb3ZlKCZzdGF0ZS0+Y2hpcCk7Ci1lcnJfY2hpcDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxwaV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBscGlfZ3Bpb19zdGF0ZSAqc3RhdGUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmc3RhdGUtPmNoaXApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBscGlfcGluY3RybF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxscGktcGluY3RybCIgfSwgLyogR2VuZXJpYyAqLwotCXsgfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGxwaV9waW5jdHJsX29mX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbHBpX3BpbmN0cmxfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInFjb20tbHBpLXBpbmN0cmwiLAotCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBscGlfcGluY3RybF9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IGxwaV9waW5jdHJsX3Byb2JlLAotCS5yZW1vdmUgPSBscGlfcGluY3RybF9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGxwaV9waW5jdHJsX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUVRJIExQSSBHUElPIHBpbiBjb250cm9sIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uYyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMKaW5kZXggMTY2OTM1ZWMuLjEzZTlhMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uYwpAQCAtMzksNyArMzksNiBAQAogCiAjZGVmaW5lIE1BWF9OUl9HUElPIDMwMAogI2RlZmluZSBQU19IT0xEX09GRlNFVCAweDgyMAotI2RlZmluZSBTVEFUVVNfT0ZGU0VUIDB4MTAKIAogLyoqCiAgKiBzdHJ1Y3QgbXNtX3BpbmN0cmwgLSBzdGF0ZSBmb3IgYSBwaW5jdHJsLW1zbSBkZXZpY2UKQEAgLTcyLDM1ICs3MSw2IEBACiAJdm9pZCBfX2lvbWVtICpyZWdzOwogfTsKIAotc3RhdGljIHUzMiBtc21fcGluY3RybF9maW5kX2Jhc2UoY29uc3Qgc3RydWN0IG1zbV9waW5jdHJsICpwY3RybCwgdTMyIGdwaW9faWQpCi17Ci0JaW50IGk7Ci0JdTMyIHZhbDsKLQljb25zdCBzdHJ1Y3QgbXNtX3BpbmN0cmxfc29jX2RhdGEgKnNvY19kYXRhID0gcGN0cmwtPnNvYzsKLQotCWlmIChncGlvX2lkID49IHNvY19kYXRhLT5uZ3Bpb3MgfHwgIXNvY19kYXRhLT5waW5fYmFzZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc29jX2RhdGEtPnBpbl9iYXNlW2dwaW9faWRdKQotCQlyZXR1cm4gc29jX2RhdGEtPnBpbl9iYXNlW2dwaW9faWRdOwotCi0JZm9yIChpID0gMDsgaSA8IHNvY19kYXRhLT5uX3RpbGVfb2Zmc2V0czsgaSsrKSB7Ci0JCXZhbCA9IHJlYWRsX3JlbGF4ZWQocGN0cmwtPnJlZ3MgKwotCQkJc29jX2RhdGEtPnRpbGVfb2Zmc2V0c1tpXSArIFNUQVRVU19PRkZTRVQKLQkJCSsgc29jX2RhdGEtPnJlZ19zaXplICogZ3Bpb19pZCk7Ci0JCWlmICh2YWwpIHsKLQkJCXNvY19kYXRhLT5waW5fYmFzZVtncGlvX2lkXSA9IHNvY19kYXRhLT50aWxlX29mZnNldHNbaV07Ci0JCQlyZXR1cm4gc29jX2RhdGEtPnRpbGVfb2Zmc2V0c1tpXTsKLQkJfQotCX0KLQotCS8qIEluIHRoZSBjYXNlIHRoYXQgdGhlIHNvY19kYXRhIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBiYXNlCi0JICogZGV0ZWN0aW9uLCB3ZSByZXR1cm4gMCBoZXJlLgotCSAqLwotCVdBUk5fT05DRSgxLCAiJXM6RHluYW1pYyBiYXNlIGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXNtX2dldF9ncm91cHNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQogewogCXN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKQEAgLTE3MCwxMSArMTQwLDEwIEBACiAJc3RydWN0IG1zbV9waW5jdHJsICpwY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBtYXNrLCBiYXNlOworCXUzMiB2YWwsIG1hc2s7CiAJaW50IGk7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tncm91cF07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZ3JvdXApOwogCW1hc2sgPSBHRU5NQVNLKGctPm11eF9iaXQgKyBvcmRlcl9iYXNlXzIoZy0+bmZ1bmNzKSAtIDEsIGctPm11eF9iaXQpOwogCiAJZm9yIChpID0gMDsgaSA8IGctPm5mdW5jczsgaSsrKSB7CkBAIC0xODcsMTAgKzE1NiwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCXZhbCAmPSB+bWFzazsKIAl2YWwgfD0gaSA8PCBnLT5tdXhfYml0OwotCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmN0bF9yZWcpOworCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCkBAIC0yNTUsMTYgKzIyNCwxNSBAQAogCXVuc2lnbmVkIGFyZzsKIAl1bnNpZ25lZCBiaXQ7CiAJaW50IHJldDsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tncm91cF07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZ3JvdXApOwogCiAJcmV0ID0gbXNtX2NvbmZpZ19yZWcocGN0cmwsIGcsIHBhcmFtLCAmbWFzaywgJmJpdCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCWFyZyA9ICh2YWwgPj4gYml0KSAmIG1hc2s7CiAKIAkvKiBDb252ZXJ0IHJlZ2lzdGVyIHZhbHVlIHRvIHBpbmNvbmYgdmFsdWUgKi8KQEAgLTI4OSw3ICsyNTcsNyBAQAogCQlpZiAoIWFyZykKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmlvX3JlZyk7CisJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAkJYXJnID0gISEodmFsICYgQklUKGctPmluX2JpdCkpOwogCQlicmVhazsKIAljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgpAQCAtMzIwLDEyICsyODgsMTEgQEAKIAl1bnNpZ25lZCBhcmc7CiAJdW5zaWduZWQgYml0OwogCWludCByZXQ7Ci0JdTMyIHZhbCwgYmFzZTsKKwl1MzIgdmFsOwogCWludCBpOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbZ3JvdXBdOwogCi0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZ3JvdXApOwogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7CiAJCXBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSk7CiAJCWFyZyA9IHBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pOwpAQCAtMzU4LDEyICszMjUsMTIgQEAKIAkJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKIAkJCS8qIHNldCBvdXRwdXQgdmFsdWUgKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwotCQkJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW9fcmVnKTsKKwkJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAkJCWlmIChhcmcpCiAJCQkJdmFsIHw9IEJJVChnLT5vdXRfYml0KTsKIAkJCWVsc2UKIAkJCQl2YWwgJj0gfkJJVChnLT5vdXRfYml0KTsKLQkJCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmlvX3JlZyk7CisJCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCiAJCQkvKiBlbmFibGUgb3V0cHV0ICovCkBAIC0zODYsMTAgKzM1MywxMCBAQAogCQl9CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7Ci0JCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmN0bF9yZWcpOworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCQl2YWwgJj0gfihtYXNrIDw8IGJpdCk7CiAJCXZhbCB8PSBhcmcgPDwgYml0OwotCQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwkJd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTQxNCwxNiArMzgxLDE1IEBACiAJY29uc3Qgc3RydWN0IG1zbV9waW5ncm91cCAqZzsKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tvZmZzZXRdOwotCWJhc2UgPSBtc21fcGluY3RybF9maW5kX2Jhc2UocGN0cmwsIG9mZnNldCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIAotCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmN0bF9yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+Y3RsX3JlZyk7CiAJdmFsICY9IH5CSVQoZy0+b2VfYml0KTsKLQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNDM1LDIzICs0MDEsMjIgQEAKIAljb25zdCBzdHJ1Y3QgbXNtX3Bpbmdyb3VwICpnOwogCXN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB2YWwsIGJhc2U7CisJdTMyIHZhbDsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgb2Zmc2V0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCi0JdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW9fcmVnKTsKKwl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CiAJaWYgKHZhbHVlKQogCQl2YWwgfD0gQklUKGctPm91dF9iaXQpOwogCWVsc2UKIAkJdmFsICY9IH5CSVQoZy0+b3V0X2JpdCk7Ci0Jd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW9fcmVnKTsKKwl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmlvX3JlZyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCXZhbCB8PSBCSVQoZy0+b2VfYml0KTsKLQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKIApAQCAtNDYyLDEyICs0MjcsMTEgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbXNtX3Bpbmdyb3VwICpnOwogCXN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tvZmZzZXRdOwotCWJhc2UgPSBtc21fcGluY3RybF9maW5kX2Jhc2UocGN0cmwsIG9mZnNldCk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pb19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAlyZXR1cm4gISEodmFsICYgQklUKGctPmluX2JpdCkpOwogfQogCkBAIC00NzYsMTkgKzQ0MCwxOCBAQAogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJc3RydWN0IG1zbV9waW5jdHJsICpwY3RybCA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHZhbCwgYmFzZTsKKwl1MzIgdmFsOwogCiAJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbb2Zmc2V0XTsKLQliYXNlID0gbXNtX3BpbmN0cmxfZmluZF9iYXNlKHBjdHJsLCBvZmZzZXQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pb19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAlpZiAodmFsdWUpCiAJCXZhbCB8PSBCSVQoZy0+b3V0X2JpdCk7CiAJZWxzZQogCQl2YWwgJj0gfkJJVChnLT5vdXRfYml0KTsKLQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pb19yZWcpOworCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiB9CkBAIC01MDgsNyArNDcxLDcgQEAKIAlpbnQgaXNfb3V0OwogCWludCBkcml2ZTsKIAlpbnQgcHVsbDsKLQl1MzIgY3RsX3JlZywgYmFzZTsKKwl1MzIgY3RsX3JlZzsKIAogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHVsbHNbXSA9IHsKIAkJIm5vIHB1bGwiLApAQCAtNTE4LDkgKzQ4MSw3IEBACiAJfTsKIAogCWcgPSAmcGN0cmwtPnNvYy0+Z3JvdXBzW29mZnNldF07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgb2Zmc2V0KTsKLQotCWN0bF9yZWcgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5jdGxfcmVnKTsKKwljdGxfcmVnID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKIAogCWlzX291dCA9ICEhKGN0bF9yZWcgJiBCSVQoZy0+b2VfYml0KSk7CiAJZnVuYyA9IChjdGxfcmVnID4+IGctPm11eF9iaXQpICYgNzsKQEAgLTU3OSwyMSArNTQwLDIxIEBACiAgKi8KIHN0YXRpYyB2b2lkIG1zbV9ncGlvX3VwZGF0ZV9kdWFsX2VkZ2VfcG9zKHN0cnVjdCBtc21fcGluY3RybCAqcGN0cmwsCiAJCQkJCSAgY29uc3Qgc3RydWN0IG1zbV9waW5ncm91cCAqZywKLQkJCQkJICBzdHJ1Y3QgaXJxX2RhdGEgKmQsIHUzMiBiYXNlKQorCQkJCQkgIHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlpbnQgbG9vcF9saW1pdCA9IDEwMDsKIAl1bnNpZ25lZCB2YWwsIHZhbDIsIGludHN0YXQ7CiAJdW5zaWduZWQgcG9sOwogCiAJZG8gewotCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pb19yZWcpICYgQklUKGctPmluX2JpdCk7CisJCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKSAmIEJJVChnLT5pbl9iaXQpOwogCi0JCXBvbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmludHJfY2ZnX3JlZyk7CisJCXBvbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl9jZmdfcmVnKTsKIAkJcG9sIF49IEJJVChnLT5pbnRyX3BvbGFyaXR5X2JpdCk7Ci0JCXdyaXRlbChwb2wsIHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmludHJfY2ZnX3JlZyk7CisJCXdyaXRlbChwb2wsIHBjdHJsLT5yZWdzICsgZy0+aW50cl9jZmdfcmVnKTsKIAotCQl2YWwyID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW9fcmVnKSAmIEJJVChnLT5pbl9iaXQpOwotCQlpbnRzdGF0ID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW50cl9zdGF0dXNfcmVnKTsKKwkJdmFsMiA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW9fcmVnKSAmIEJJVChnLT5pbl9iaXQpOworCQlpbnRzdGF0ID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5pbnRyX3N0YXR1c19yZWcpOwogCQlpZiAoaW50c3RhdCB8fCAodmFsID09IHZhbDIpKQogCQkJcmV0dXJuOwogCX0gd2hpbGUgKGxvb3BfbGltaXQtLSA+IDApOwpAQCAtNjA3LDE2ICs1NjgsMTUgQEAKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZC0+aHdpcnEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX2NmZ19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl9jZmdfcmVnKTsKIAl2YWwgJj0gfkJJVChnLT5pbnRyX2VuYWJsZV9iaXQpOwotCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmludHJfY2ZnX3JlZyk7CisJd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBnLT5pbnRyX2NmZ19yZWcpOwogCiAJY2xlYXJfYml0KGQtPmh3aXJxLCBwY3RybC0+ZW5hYmxlZF9pcnFzKTsKIApAQCAtNjI5LDE2ICs1ODksMTUgQEAKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZC0+aHdpcnEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX2NmZ19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl9jZmdfcmVnKTsKIAl2YWwgfD0gQklUKGctPmludHJfZW5hYmxlX2JpdCk7Ci0Jd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBiYXNlICsgZy0+aW50cl9jZmdfcmVnKTsKKwl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmludHJfY2ZnX3JlZyk7CiAKIAlzZXRfYml0KGQtPmh3aXJxLCBwY3RybC0+ZW5hYmxlZF9pcnFzKTsKIApAQCAtNjUxLDIyICs2MTAsMjEgQEAKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZC0+aHdpcnEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX3N0YXR1c19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl9zdGF0dXNfcmVnKTsKIAlpZiAoZy0+aW50cl9hY2tfaGlnaCkKIAkJdmFsIHw9IEJJVChnLT5pbnRyX3N0YXR1c19iaXQpOwogCWVsc2UKIAkJdmFsICY9IH5CSVQoZy0+aW50cl9zdGF0dXNfYml0KTsKLQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX3N0YXR1c19yZWcpOworCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+aW50cl9zdGF0dXNfcmVnKTsKIAogCWlmICh0ZXN0X2JpdChkLT5od2lycSwgcGN0cmwtPmR1YWxfZWRnZV9pcnFzKSkKLQkJbXNtX2dwaW9fdXBkYXRlX2R1YWxfZWRnZV9wb3MocGN0cmwsIGcsIGQsIGJhc2UpOworCQltc21fZ3Bpb191cGRhdGVfZHVhbF9lZGdlX3BvcyhwY3RybCwgZywgZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogfQpAQCAtNjc3LDEwICs2MzUsMTAgQEAKIAlzdHJ1Y3QgbXNtX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgKmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAKIAlnID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tkLT5od2lycV07Ci0JYmFzZSA9IG1zbV9waW5jdHJsX2ZpbmRfYmFzZShwY3RybCwgZC0+aHdpcnEpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKIAkvKgpAQCAtNjkyLDE3ICs2NTAsMTcgQEAKIAkJY2xlYXJfYml0KGQtPmh3aXJxLCBwY3RybC0+ZHVhbF9lZGdlX2lycXMpOwogCiAJLyogUm91dGUgaW50ZXJydXB0cyB0byBhcHBsaWNhdGlvbiBjcHUgKi8KLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX3RhcmdldF9yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl90YXJnZXRfcmVnKTsKIAl2YWwgJj0gfig3IDw8IGctPmludHJfdGFyZ2V0X2JpdCk7CiAJdmFsIHw9IGctPmludHJfdGFyZ2V0X2twc3NfdmFsIDw8IGctPmludHJfdGFyZ2V0X2JpdDsKLQl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX3RhcmdldF9yZWcpOworCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgZy0+aW50cl90YXJnZXRfcmVnKTsKIAogCS8qIFVwZGF0ZSBjb25maWd1cmF0aW9uIGZvciBncGlvLgogCSAqIFJBV19TVEFUVVNfRU4gaXMgbGVmdCBvbiBmb3IgYWxsIGdwaW8gaXJxcy4gRHVlIHRvIHRoZQogCSAqIGludGVybmFsIGNpcmN1aXRyeSBvZiBUTE1NLCB0b2dnbGluZyB0aGUgUkFXX1NUQVRVUwogCSAqIGNvdWxkIGNhdXNlIHRoZSBJTlRSX1NUQVRVUyB0byBiZSBzZXQgZm9yIEVER0UgaW50ZXJydXB0cy4KIAkgKi8KLQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX2NmZ19yZWcpOworCXZhbCA9IHJlYWRsKHBjdHJsLT5yZWdzICsgZy0+aW50cl9jZmdfcmVnKTsKIAl2YWwgfD0gQklUKGctPmludHJfcmF3X3N0YXR1c19iaXQpOwogCWlmIChnLT5pbnRyX2RldGVjdGlvbl93aWR0aCA9PSAyKSB7CiAJCXZhbCAmPSB+KDMgPDwgZy0+aW50cl9kZXRlY3Rpb25fYml0KTsKQEAgLTc1MCwxMCArNzA4LDEwIEBACiAJfSBlbHNlIHsKIAkJQlVHKCk7CiAJfQotCXdyaXRlbCh2YWwsIHBjdHJsLT5yZWdzICsgYmFzZSArIGctPmludHJfY2ZnX3JlZyk7CisJd3JpdGVsKHZhbCwgcGN0cmwtPnJlZ3MgKyBnLT5pbnRyX2NmZ19yZWcpOwogCiAJaWYgKHRlc3RfYml0KGQtPmh3aXJxLCBwY3RybC0+ZHVhbF9lZGdlX2lycXMpKQotCQltc21fZ3Bpb191cGRhdGVfZHVhbF9lZGdlX3BvcyhwY3RybCwgZywgZCwgYmFzZSk7CisJCW1zbV9ncGlvX3VwZGF0ZV9kdWFsX2VkZ2VfcG9zKHBjdHJsLCBnLCBkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CiAKQEAgLTg4Miw3ICs4NDAsNyBAQAogCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwogCWludCBpcnFfcGluOwogCWludCBoYW5kbGVkID0gMDsKLQl1MzIgdmFsLCBiYXNlOworCXUzMiB2YWw7CiAJaW50IGk7CiAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKQEAgLTg5Myw4ICs4NTEsNyBAQAogCSAqLwogCWZvcl9lYWNoX3NldF9iaXQoaSwgcGN0cmwtPmVuYWJsZWRfaXJxcywgcGN0cmwtPmNoaXAubmdwaW8pIHsKIAkJZyA9ICZwY3RybC0+c29jLT5ncm91cHNbaV07Ci0JCWJhc2UgPSBtc21fcGluY3RybF9maW5kX2Jhc2UocGN0cmwsIGkpOwotCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGJhc2UgKyBnLT5pbnRyX3N0YXR1c19yZWcpOworCQl2YWwgPSByZWFkbChwY3RybC0+cmVncyArIGctPmludHJfc3RhdHVzX3JlZyk7CiAJCWlmICh2YWwgJiBCSVQoZy0+aW50cl9zdGF0dXNfYml0KSkgewogCQkJaXJxX3BpbiA9IGlycV9maW5kX21hcHBpbmcoZ2MtPmlycWRvbWFpbiwgaSk7CiAJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX3Bpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5oIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uaAppbmRleCA3ZmZjMmUzLi45ODhiN2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmgKQEAgLTEyOSwxMCArMTI5LDYgQEAKIAl1bnNpZ25lZCBuZ3Bpb3M7CiAJY29uc3Qgc3RydWN0IG1zbV9kaXJfY29ubiAqZGlyX2Nvbm47CiAJdW5zaWduZWQgaW50IG5fZGlyX2Nvbm5zOwotCWNvbnN0IHUzMiAqdGlsZV9vZmZzZXRzOwotCXVuc2lnbmVkIGludCBuX3RpbGVfb2Zmc2V0czsKLQl1MzIgKnBpbl9iYXNlOwotCXVuc2lnbmVkIGludCByZWdfc2l6ZTsKIH07CiAKIGludCBtc21fcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc204OTUzLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbTg5NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFjYWQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc204OTUzLmMKQEAgLTAsMCArMSwxNjg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLW1zbS5oIgorCisjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCSAgICAgICAgICAgICAgICBcCisJW21zbV9tdXhfIyNmbmFtZV0gPSB7CQkgICAgICAgICAgICAgICAgXAorCQkubmFtZSA9ICNmbmFtZSwJCQkJXAorCQkuZ3JvdXBzID0gZm5hbWUjI19ncm91cHMsICAgICAgICAgICAgICAgXAorCQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoZm5hbWUjI19ncm91cHMpLAlcCisJfQorCisjZGVmaW5lIFJFR19TSVpFIDB4MTAwMAorI2RlZmluZSBQSU5HUk9VUChpZCwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4LCBmOSkJXAorCXsJCQkJCSAgICAgICAgXAorCQkubmFtZSA9ICJncGlvIiAjaWQsCQkJXAorCQkucGlucyA9IGdwaW8jI2lkIyNfcGlucywJCVwKKwkJLm5waW5zID0gKHVuc2lnbmVkIGludClBUlJBWV9TSVpFKGdwaW8jI2lkIyNfcGlucyksCVwKKwkJLmZ1bmNzID0gKGludFtdKXsJCQlcCisJCQltc21fbXV4X2dwaW8sIC8qIGdwaW8gbW9kZSAqLwlcCisJCQltc21fbXV4XyMjZjEsCQkJXAorCQkJbXNtX211eF8jI2YyLAkJCVwKKwkJCW1zbV9tdXhfIyNmMywJCQlcCisJCQltc21fbXV4XyMjZjQsCQkJXAorCQkJbXNtX211eF8jI2Y1LAkJCVwKKwkJCW1zbV9tdXhfIyNmNiwJCQlcCisJCQltc21fbXV4XyMjZjcsCQkJXAorCQkJbXNtX211eF8jI2Y4LAkJCVwKKwkJCW1zbV9tdXhfIyNmOQkJCVwKKwkJfSwJCQkJICAgICAgICBcCisJCS5uZnVuY3MgPSAxMCwJCQkJXAorCQkuY3RsX3JlZyA9IFJFR19TSVpFICogaWQsCQkJXAorCQkuaW9fcmVnID0gMHg0ICsgUkVHX1NJWkUgKiBpZCwJCVwKKwkJLmludHJfY2ZnX3JlZyA9IDB4OCArIFJFR19TSVpFICogaWQsCQlcCisJCS5pbnRyX3N0YXR1c19yZWcgPSAweGMgKyBSRUdfU0laRSAqIGlkLAlcCisJCS5pbnRyX3RhcmdldF9yZWcgPSAweDggKyBSRUdfU0laRSAqIGlkLAlcCisJCS5tdXhfYml0ID0gMiwJCQlcCisJCS5wdWxsX2JpdCA9IDAsCQkJXAorCQkuZHJ2X2JpdCA9IDYsCQkJXAorCQkub2VfYml0ID0gOSwJCQlcCisJCS5pbl9iaXQgPSAwLAkJCVwKKwkJLm91dF9iaXQgPSAxLAkJCVwKKwkJLmludHJfZW5hYmxlX2JpdCA9IDAsCQlcCisJCS5pbnRyX3N0YXR1c19iaXQgPSAwLAkJXAorCQkuaW50cl90YXJnZXRfYml0ID0gNSwJCVwKKwkJLmludHJfdGFyZ2V0X2twc3NfdmFsID0gNCwJXAorCQkuaW50cl9yYXdfc3RhdHVzX2JpdCA9IDQsCVwKKwkJLmludHJfcG9sYXJpdHlfYml0ID0gMSwJCVwKKwkJLmludHJfZGV0ZWN0aW9uX2JpdCA9IDIsCVwKKwkJLmludHJfZGV0ZWN0aW9uX3dpZHRoID0gMiwJXAorCX0KKworI2RlZmluZSBTRENfUURTRF9QSU5HUk9VUChwZ19uYW1lLCBjdGwsIHB1bGwsIGRydikJXAorCXsJCQkJCSAgICAgICAgXAorCQkubmFtZSA9ICNwZ19uYW1lLAkJCVwKKwkJLnBpbnMgPSBwZ19uYW1lIyNfcGlucywJCQlcCisJCS5ucGlucyA9ICh1bnNpZ25lZCBpbnQpQVJSQVlfU0laRShwZ19uYW1lIyNfcGlucyksCVwKKwkJLmN0bF9yZWcgPSBjdGwsCQkJCVwKKwkJLmlvX3JlZyA9IDAsCQkJCVwKKwkJLmludHJfY2ZnX3JlZyA9IDAsCQkJXAorCQkuaW50cl9zdGF0dXNfcmVnID0gMCwJCQlcCisJCS5pbnRyX3RhcmdldF9yZWcgPSAwLAkJCVwKKwkJLm11eF9iaXQgPSAtMSwJCQkJXAorCQkucHVsbF9iaXQgPSBwdWxsLAkJCVwKKwkJLmRydl9iaXQgPSBkcnYsCQkJCVwKKwkJLm9lX2JpdCA9IC0xLAkJCQlcCisJCS5pbl9iaXQgPSAtMSwJCQkJXAorCQkub3V0X2JpdCA9IC0xLAkJCQlcCisJCS5pbnRyX2VuYWJsZV9iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3N0YXR1c19iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3RhcmdldF9iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3Jhd19zdGF0dXNfYml0ID0gLTEsCQlcCisJCS5pbnRyX3BvbGFyaXR5X2JpdCA9IC0xLAkJXAorCQkuaW50cl9kZXRlY3Rpb25fYml0ID0gLTEsCQlcCisJCS5pbnRyX2RldGVjdGlvbl93aWR0aCA9IC0xLAkJXAorCX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBtc204OTUzX3BpbnNbXSA9IHsKKwlQSU5DVFJMX1BJTigwLCAiR1BJT18wIiksCisJUElOQ1RSTF9QSU4oMSwgIkdQSU9fMSIpLAorCVBJTkNUUkxfUElOKDIsICJHUElPXzIiKSwKKwlQSU5DVFJMX1BJTigzLCAiR1BJT18zIiksCisJUElOQ1RSTF9QSU4oNCwgIkdQSU9fNCIpLAorCVBJTkNUUkxfUElOKDUsICJHUElPXzUiKSwKKwlQSU5DVFJMX1BJTig2LCAiR1BJT182IiksCisJUElOQ1RSTF9QSU4oNywgIkdQSU9fNyIpLAorCVBJTkNUUkxfUElOKDgsICJHUElPXzgiKSwKKwlQSU5DVFJMX1BJTig5LCAiR1BJT185IiksCisJUElOQ1RSTF9QSU4oMTAsICJHUElPXzEwIiksCisJUElOQ1RSTF9QSU4oMTEsICJHUElPXzExIiksCisJUElOQ1RSTF9QSU4oMTIsICJHUElPXzEyIiksCisJUElOQ1RSTF9QSU4oMTMsICJHUElPXzEzIiksCisJUElOQ1RSTF9QSU4oMTQsICJHUElPXzE0IiksCisJUElOQ1RSTF9QSU4oMTUsICJHUElPXzE1IiksCisJUElOQ1RSTF9QSU4oMTYsICJHUElPXzE2IiksCisJUElOQ1RSTF9QSU4oMTcsICJHUElPXzE3IiksCisJUElOQ1RSTF9QSU4oMTgsICJHUElPXzE4IiksCisJUElOQ1RSTF9QSU4oMTksICJHUElPXzE5IiksCisJUElOQ1RSTF9QSU4oMjAsICJHUElPXzIwIiksCisJUElOQ1RSTF9QSU4oMjEsICJHUElPXzIxIiksCisJUElOQ1RSTF9QSU4oMjIsICJHUElPXzIyIiksCisJUElOQ1RSTF9QSU4oMjMsICJHUElPXzIzIiksCisJUElOQ1RSTF9QSU4oMjQsICJHUElPXzI0IiksCisJUElOQ1RSTF9QSU4oMjUsICJHUElPXzI1IiksCisJUElOQ1RSTF9QSU4oMjYsICJHUElPXzI2IiksCisJUElOQ1RSTF9QSU4oMjcsICJHUElPXzI3IiksCisJUElOQ1RSTF9QSU4oMjgsICJHUElPXzI4IiksCisJUElOQ1RSTF9QSU4oMjksICJHUElPXzI5IiksCisJUElOQ1RSTF9QSU4oMzAsICJHUElPXzMwIiksCisJUElOQ1RSTF9QSU4oMzEsICJHUElPXzMxIiksCisJUElOQ1RSTF9QSU4oMzIsICJHUElPXzMyIiksCisJUElOQ1RSTF9QSU4oMzMsICJHUElPXzMzIiksCisJUElOQ1RSTF9QSU4oMzQsICJHUElPXzM0IiksCisJUElOQ1RSTF9QSU4oMzUsICJHUElPXzM1IiksCisJUElOQ1RSTF9QSU4oMzYsICJHUElPXzM2IiksCisJUElOQ1RSTF9QSU4oMzcsICJHUElPXzM3IiksCisJUElOQ1RSTF9QSU4oMzgsICJHUElPXzM4IiksCisJUElOQ1RSTF9QSU4oMzksICJHUElPXzM5IiksCisJUElOQ1RSTF9QSU4oNDAsICJHUElPXzQwIiksCisJUElOQ1RSTF9QSU4oNDEsICJHUElPXzQxIiksCisJUElOQ1RSTF9QSU4oNDIsICJHUElPXzQyIiksCisJUElOQ1RSTF9QSU4oNDMsICJHUElPXzQzIiksCisJUElOQ1RSTF9QSU4oNDQsICJHUElPXzQ0IiksCisJUElOQ1RSTF9QSU4oNDUsICJHUElPXzQ1IiksCisJUElOQ1RSTF9QSU4oNDYsICJHUElPXzQ2IiksCisJUElOQ1RSTF9QSU4oNDcsICJHUElPXzQ3IiksCisJUElOQ1RSTF9QSU4oNDgsICJHUElPXzQ4IiksCisJUElOQ1RSTF9QSU4oNDksICJHUElPXzQ5IiksCisJUElOQ1RSTF9QSU4oNTAsICJHUElPXzUwIiksCisJUElOQ1RSTF9QSU4oNTEsICJHUElPXzUxIiksCisJUElOQ1RSTF9QSU4oNTIsICJHUElPXzUyIiksCisJUElOQ1RSTF9QSU4oNTMsICJHUElPXzUzIiksCisJUElOQ1RSTF9QSU4oNTQsICJHUElPXzU0IiksCisJUElOQ1RSTF9QSU4oNTUsICJHUElPXzU1IiksCisJUElOQ1RSTF9QSU4oNTYsICJHUElPXzU2IiksCisJUElOQ1RSTF9QSU4oNTcsICJHUElPXzU3IiksCisJUElOQ1RSTF9QSU4oNTgsICJHUElPXzU4IiksCisJUElOQ1RSTF9QSU4oNTksICJHUElPXzU5IiksCisJUElOQ1RSTF9QSU4oNjAsICJHUElPXzYwIiksCisJUElOQ1RSTF9QSU4oNjEsICJHUElPXzYxIiksCisJUElOQ1RSTF9QSU4oNjIsICJHUElPXzYyIiksCisJUElOQ1RSTF9QSU4oNjMsICJHUElPXzYzIiksCisJUElOQ1RSTF9QSU4oNjQsICJHUElPXzY0IiksCisJUElOQ1RSTF9QSU4oNjUsICJHUElPXzY1IiksCisJUElOQ1RSTF9QSU4oNjYsICJHUElPXzY2IiksCisJUElOQ1RSTF9QSU4oNjcsICJHUElPXzY3IiksCisJUElOQ1RSTF9QSU4oNjgsICJHUElPXzY4IiksCisJUElOQ1RSTF9QSU4oNjksICJHUElPXzY5IiksCisJUElOQ1RSTF9QSU4oNzAsICJHUElPXzcwIiksCisJUElOQ1RSTF9QSU4oNzEsICJHUElPXzcxIiksCisJUElOQ1RSTF9QSU4oNzIsICJHUElPXzcyIiksCisJUElOQ1RSTF9QSU4oNzMsICJHUElPXzczIiksCisJUElOQ1RSTF9QSU4oNzQsICJHUElPXzc0IiksCisJUElOQ1RSTF9QSU4oNzUsICJHUElPXzc1IiksCisJUElOQ1RSTF9QSU4oNzYsICJHUElPXzc2IiksCisJUElOQ1RSTF9QSU4oNzcsICJHUElPXzc3IiksCisJUElOQ1RSTF9QSU4oNzgsICJHUElPXzc4IiksCisJUElOQ1RSTF9QSU4oNzksICJHUElPXzc5IiksCisJUElOQ1RSTF9QSU4oODAsICJHUElPXzgwIiksCisJUElOQ1RSTF9QSU4oODEsICJHUElPXzgxIiksCisJUElOQ1RSTF9QSU4oODIsICJHUElPXzgyIiksCisJUElOQ1RSTF9QSU4oODMsICJHUElPXzgzIiksCisJUElOQ1RSTF9QSU4oODQsICJHUElPXzg0IiksCisJUElOQ1RSTF9QSU4oODUsICJHUElPXzg1IiksCisJUElOQ1RSTF9QSU4oODYsICJHUElPXzg2IiksCisJUElOQ1RSTF9QSU4oODcsICJHUElPXzg3IiksCisJUElOQ1RSTF9QSU4oODgsICJHUElPXzg4IiksCisJUElOQ1RSTF9QSU4oODksICJHUElPXzg5IiksCisJUElOQ1RSTF9QSU4oOTAsICJHUElPXzkwIiksCisJUElOQ1RSTF9QSU4oOTEsICJHUElPXzkxIiksCisJUElOQ1RSTF9QSU4oOTIsICJHUElPXzkyIiksCisJUElOQ1RSTF9QSU4oOTMsICJHUElPXzkzIiksCisJUElOQ1RSTF9QSU4oOTQsICJHUElPXzk0IiksCisJUElOQ1RSTF9QSU4oOTUsICJHUElPXzk1IiksCisJUElOQ1RSTF9QSU4oOTYsICJHUElPXzk2IiksCisJUElOQ1RSTF9QSU4oOTcsICJHUElPXzk3IiksCisJUElOQ1RSTF9QSU4oOTgsICJHUElPXzk4IiksCisJUElOQ1RSTF9QSU4oOTksICJHUElPXzk5IiksCisJUElOQ1RSTF9QSU4oMTAwLCAiR1BJT18xMDAiKSwKKwlQSU5DVFJMX1BJTigxMDEsICJHUElPXzEwMSIpLAorCVBJTkNUUkxfUElOKDEwMiwgIkdQSU9fMTAyIiksCisJUElOQ1RSTF9QSU4oMTAzLCAiR1BJT18xMDMiKSwKKwlQSU5DVFJMX1BJTigxMDQsICJHUElPXzEwNCIpLAorCVBJTkNUUkxfUElOKDEwNSwgIkdQSU9fMTA1IiksCisJUElOQ1RSTF9QSU4oMTA2LCAiR1BJT18xMDYiKSwKKwlQSU5DVFJMX1BJTigxMDcsICJHUElPXzEwNyIpLAorCVBJTkNUUkxfUElOKDEwOCwgIkdQSU9fMTA4IiksCisJUElOQ1RSTF9QSU4oMTA5LCAiR1BJT18xMDkiKSwKKwlQSU5DVFJMX1BJTigxMTAsICJHUElPXzExMCIpLAorCVBJTkNUUkxfUElOKDExMSwgIkdQSU9fMTExIiksCisJUElOQ1RSTF9QSU4oMTEyLCAiR1BJT18xMTIiKSwKKwlQSU5DVFJMX1BJTigxMTMsICJHUElPXzExMyIpLAorCVBJTkNUUkxfUElOKDExNCwgIkdQSU9fMTE0IiksCisJUElOQ1RSTF9QSU4oMTE1LCAiR1BJT18xMTUiKSwKKwlQSU5DVFJMX1BJTigxMTYsICJHUElPXzExNiIpLAorCVBJTkNUUkxfUElOKDExNywgIkdQSU9fMTE3IiksCisJUElOQ1RSTF9QSU4oMTE4LCAiR1BJT18xMTgiKSwKKwlQSU5DVFJMX1BJTigxMTksICJHUElPXzExOSIpLAorCVBJTkNUUkxfUElOKDEyMCwgIkdQSU9fMTIwIiksCisJUElOQ1RSTF9QSU4oMTIxLCAiR1BJT18xMjEiKSwKKwlQSU5DVFJMX1BJTigxMjIsICJHUElPXzEyMiIpLAorCVBJTkNUUkxfUElOKDEyMywgIkdQSU9fMTIzIiksCisJUElOQ1RSTF9QSU4oMTI0LCAiR1BJT18xMjQiKSwKKwlQSU5DVFJMX1BJTigxMjUsICJHUElPXzEyNSIpLAorCVBJTkNUUkxfUElOKDEyNiwgIkdQSU9fMTI2IiksCisJUElOQ1RSTF9QSU4oMTI3LCAiR1BJT18xMjciKSwKKwlQSU5DVFJMX1BJTigxMjgsICJHUElPXzEyOCIpLAorCVBJTkNUUkxfUElOKDEyOSwgIkdQSU9fMTI5IiksCisJUElOQ1RSTF9QSU4oMTMwLCAiR1BJT18xMzAiKSwKKwlQSU5DVFJMX1BJTigxMzEsICJHUElPXzEzMSIpLAorCVBJTkNUUkxfUElOKDEzMiwgIkdQSU9fMTMyIiksCisJUElOQ1RSTF9QSU4oMTMzLCAiR1BJT18xMzMiKSwKKwlQSU5DVFJMX1BJTigxMzQsICJHUElPXzEzNCIpLAorCVBJTkNUUkxfUElOKDEzNSwgIkdQSU9fMTM1IiksCisJUElOQ1RSTF9QSU4oMTM2LCAiR1BJT18xMzYiKSwKKwlQSU5DVFJMX1BJTigxMzcsICJHUElPXzEzNyIpLAorCVBJTkNUUkxfUElOKDEzOCwgIkdQSU9fMTM4IiksCisJUElOQ1RSTF9QSU4oMTM5LCAiR1BJT18xMzkiKSwKKwlQSU5DVFJMX1BJTigxNDAsICJHUElPXzE0MCIpLAorCVBJTkNUUkxfUElOKDE0MSwgIkdQSU9fMTQxIiksCisJUElOQ1RSTF9QSU4oMTQyLCAiU0RDMV9DTEsiKSwKKwlQSU5DVFJMX1BJTigxNDMsICJTREMxX0NNRCIpLAorCVBJTkNUUkxfUElOKDE0NCwgIlNEQzFfREFUQSIpLAorCVBJTkNUUkxfUElOKDE0NSwgIlNEQzFfUkNMSyIpLAorCVBJTkNUUkxfUElOKDE0NiwgIlNEQzJfQ0xLIiksCisJUElOQ1RSTF9QSU4oMTQ3LCAiU0RDMl9DTUQiKSwKKwlQSU5DVFJMX1BJTigxNDgsICJTREMyX0RBVEEiKSwKKwlQSU5DVFJMX1BJTigxNDksICJRRFNEX0NMSyIpLAorCVBJTkNUUkxfUElOKDE1MCwgIlFEU0RfQ01EIiksCisJUElOQ1RSTF9QSU4oMTUxLCAiUURTRF9EQVRBMCIpLAorCVBJTkNUUkxfUElOKDE1MiwgIlFEU0RfREFUQTEiKSwKKwlQSU5DVFJMX1BJTigxNTMsICJRRFNEX0RBVEEyIiksCisJUElOQ1RSTF9QSU4oMTU0LCAiUURTRF9EQVRBMyIpLAorfTsKKworI2RlZmluZSBERUNMQVJFX01TTV9HUElPX1BJTlMocGluKSBcCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBncGlvIyNwaW4jI19waW5zW10gPSB7IHBpbiB9CitERUNMQVJFX01TTV9HUElPX1BJTlMoMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDIwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDIzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDI2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDI5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDMyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDM1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDM4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0Mik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQ0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0NSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQ3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0OCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDUwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1MSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDUzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1NCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDU2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1Nyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDU5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2MCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDYyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2Myk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDY1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2Nik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDY4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2OSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDcxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3Mik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDc0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3NSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDc3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3OCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDgwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4MSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDgzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4NCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDg2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4Nyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDg5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5MCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDkyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5Myk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDk1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5Nik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDk4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5OSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTAwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTAzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTA2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTA5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTEyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTE1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTE4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTIxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTI0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTI3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTM2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTM5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNDApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0MSk7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjMV9jbGtfcGluc1tdID0geyAxNDIgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjMV9jbWRfcGluc1tdID0geyAxNDMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjMV9kYXRhX3BpbnNbXSA9IHsgMTQ0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfcmNsa19waW5zW10gPSB7IDE0NSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2Nsa19waW5zW10gPSB7IDE0NiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2NtZF9waW5zW10gPSB7IDE0NyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2RhdGFfcGluc1tdID0geyAxNDggfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcWRzZF9jbGtfcGluc1tdID0geyAxNDkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcWRzZF9jbWRfcGluc1tdID0geyAxNTAgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcWRzZF9kYXRhMF9waW5zW10gPSB7IDE1MSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxZHNkX2RhdGExX3BpbnNbXSA9IHsgMTUyIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFkc2RfZGF0YTJfcGluc1tdID0geyAxNTMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcWRzZF9kYXRhM19waW5zW10gPSB7IDE1NCB9OworCitlbnVtIG1zbTg5NTNfZnVuY3Rpb25zIHsKKwltc21fbXV4X2dwaW8sCisJbXNtX211eF9ibHNwX3NwaTEsCisJbXNtX211eF9zbWJfaW50LAorCW1zbV9tdXhfYWRzcF9leHQsCisJbXNtX211eF9wcm5nX3Jvc2MsCisJbXNtX211eF9ibHNwX2kyYzEsCisJbXNtX211eF9xZHNzX2N0aV90cmlnX291dF9iMCwKKwltc21fbXV4X3Fkc3NfY3RpX3RyaWdfb3V0X2ExLAorCW1zbV9tdXhfYmxzcF9zcGkyLAorCW1zbV9tdXhfYmxzcF91YXJ0MiwKKwltc21fbXV4X2xkb191cGRhdGUsCisJbXNtX211eF9kYWNfY2FsaWIwLAorCW1zbV9tdXhfbGRvX2VuLAorCW1zbV9tdXhfYmxzcF9pMmMyLAorCW1zbV9tdXhfZ2NjX2dwMV9jbGtfYiwKKwltc21fbXV4X2F0ZXN0X2dwc2FkY19kdGVzdDBfbmF0aXZlLAorCW1zbV9tdXhfYmxzcF9zcGkzLAorCW1zbV9tdXhfcWRzc190cmFjZWRhdGFfYiwKKwltc21fbXV4X3B3cl9tb2RlbV9lbmFibGVkX2IsCisJbXNtX211eF9ibHNwX2kyYzMsCisJbXNtX211eF9nY2NfZ3AyX2Nsa19iLAorCW1zbV9tdXhfZ2NjX2dwM19jbGtfYiwKKwltc21fbXV4X2hhbGxfaW50LAorCW1zbV9tdXhfYmxzcF9zcGk0LAorCW1zbV9tdXhfYmxzcF91YXJ0NCwKKwltc21fbXV4X3B3cl9uYXZfZW5hYmxlZF9iLAorCW1zbV9tdXhfZGFjX2NhbGliMSwKKwltc21fbXV4X2NhcF9pbnQsCisJbXNtX211eF9wd3JfY3J5cHRvX2VuYWJsZWRfYiwKKwltc21fbXV4X2RhY19jYWxpYjIsCisJbXNtX211eF9ibHNwX2kyYzQsCisJbXNtX211eF9uZmNfZGlzYWJsZSwKKwltc21fbXV4X2Jsc3Bfc3BpNSwKKwltc21fbXV4X2Jsc3BfdWFydDUsCisJbXNtX211eF9xZHNzX3RyYWNlY2xrX2EsCisJbXNtX211eF9hdGVzdF9iYnJ4MSwKKwltc21fbXV4X25mY19pcnEsCisJbXNtX211eF9tX3ZvYywKKwltc21fbXV4X3Fkc3NfY3RpX3RyaWdfaW5fYTAsCisJbXNtX211eF9hdGVzdF9iYnJ4MCwKKwltc21fbXV4X2Jsc3BfaTJjNSwKKwltc21fbXV4X3Fkc3NfdHJhY2VjdGxfYSwKKwltc21fbXV4X2F0ZXN0X2dwc2FkY19kdGVzdDFfbmF0aXZlLAorCW1zbV9tdXhfcWRzc190cmFjZWRhdGFfYSwKKwltc21fbXV4X2Jsc3Bfc3BpNiwKKwltc21fbXV4X2Jsc3BfdWFydDYsCisJbXNtX211eF9xZHNzX3RyYWNlY3RsX2IsCisJbXNtX211eF9kYWNfY2FsaWIxNSwKKwltc21fbXV4X3Fkc3NfY3RpX3RyaWdfaW5fYjAsCisJbXNtX211eF9kYWNfY2FsaWIxNiwKKwltc21fbXV4X2Jsc3BfaTJjNiwKKwltc21fbXV4X3Fkc3NfdHJhY2VjbGtfYiwKKwltc21fbXV4X2F0ZXN0X3dsYW4wLAorCW1zbV9tdXhfYXRlc3Rfd2xhbjEsCisJbXNtX211eF9tZHBfdnN5bmMsCisJbXNtX211eF9wcmlfbWkyc19tY2xrX2EsCisJbXNtX211eF9zZWNfbWkyc19tY2xrX2EsCisJbXNtX211eF9xZHNzX2N0aV90cmlnX291dF9iMSwKKwltc21fbXV4X2NhbV9tY2xrLAorCW1zbV9tdXhfZGFjX2NhbGliMywKKwltc21fbXV4X2NjaV9pMmMsCisJbXNtX211eF9wd3JfbW9kZW1fZW5hYmxlZF9hLAorCW1zbV9tdXhfZGFjX2NhbGliNCwKKwltc21fbXV4X2RhY19jYWxpYjE5LAorCW1zbV9tdXhfZmxhc2hfc3Ryb2JlLAorCW1zbV9tdXhfY2NpX3RpbWVyMCwKKwltc21fbXV4X2NjaV90aW1lcjEsCisJbXNtX211eF9jYW1faXJxLAorCW1zbV9tdXhfY2NpX3RpbWVyMiwKKwltc21fbXV4X2Jsc3AxX3NwaSwKKwltc21fbXV4X3B3cl9uYXZfZW5hYmxlZF9hLAorCW1zbV9tdXhfb2lzX3N5bmMsCisJbXNtX211eF9jY2lfdGltZXIzLAorCW1zbV9tdXhfY2NpX3RpbWVyNCwKKwltc21fbXV4X2Jsc3AzX3NwaSwKKwltc21fbXV4X3Fkc3NfY3RpX3RyaWdfb3V0X2EwLAorCW1zbV9tdXhfZGFjX2NhbGliNywKKwltc21fbXV4X2FjY2VsX2ludCwKKwltc21fbXV4X2djY19ncDFfY2xrX2EsCisJbXNtX211eF9kYWNfY2FsaWI4LAorCW1zbV9tdXhfYWxzcF9pbnQsCisJbXNtX211eF9nY2NfZ3AyX2Nsa19hLAorCW1zbV9tdXhfZGFjX2NhbGliOSwKKwltc21fbXV4X21hZ19pbnQsCisJbXNtX211eF9nY2NfZ3AzX2Nsa19hLAorCW1zbV9tdXhfcHdyX2NyeXB0b19lbmFibGVkX2EsCisJbXNtX211eF9jY2lfYXN5bmMsCisJbXNtX211eF9jYW0xX3N0YW5kYnksCisJbXNtX211eF9kYWNfY2FsaWI1LAorCW1zbV9tdXhfY2FtMV9yc3QsCisJbXNtX211eF9kYWNfY2FsaWI2LAorCW1zbV9tdXhfZGFjX2NhbGliMTAsCisJbXNtX211eF9neXJvX2ludCwKKwltc21fbXV4X2RhY19jYWxpYjExLAorCW1zbV9tdXhfcHJlc3N1cmVfaW50LAorCW1zbV9tdXhfZGFjX2NhbGliMTIsCisJbXNtX211eF9ibHNwNl9zcGksCisJbXNtX211eF9kYWNfY2FsaWIxMywKKwltc21fbXV4X2ZwX2ludCwKKwltc21fbXV4X3Fkc3NfY3RpX3RyaWdfaW5fYjEsCisJbXNtX211eF9kYWNfY2FsaWIxNCwKKwltc21fbXV4X3VpbV9iYXR0LAorCW1zbV9tdXhfY2FtMF9sZG8sCisJbXNtX211eF9zZF93cml0ZSwKKwltc21fbXV4X3VpbTFfZGF0YSwKKwltc21fbXV4X3VpbTFfY2xrLAorCW1zbV9tdXhfdWltMV9yZXNldCwKKwltc21fbXV4X3VpbTFfcHJlc2VudCwKKwltc21fbXV4X3VpbTJfZGF0YSwKKwltc21fbXV4X3VpbTJfY2xrLAorCW1zbV9tdXhfdWltMl9yZXNldCwKKwltc21fbXV4X3VpbTJfcHJlc2VudCwKKwltc21fbXV4X3RzX3h2ZGQsCisJbXNtX211eF9taXBpX2RzaTAsCisJbXNtX211eF9uZmNfZHdsLAorCW1zbV9tdXhfdXNfZXVybywKKwltc21fbXV4X2F0ZXN0X2NoYXIzLAorCW1zbV9tdXhfZGJnX291dCwKKwltc21fbXV4X2JpbWNfZHRlMCwKKwltc21fbXV4X3RzX3Jlc291dCwKKwltc21fbXV4X3RzX3NhbXBsZSwKKwltc21fbXV4X3NlY19taTJzX21jbGtfYiwKKwltc21fbXV4X3ByaV9taTJzLAorCW1zbV9tdXhfY29kZWNfcmVzZXQsCisJbXNtX211eF9jZGNfcGRtMCwKKwltc21fbXV4X2F0ZXN0X2NoYXIxLAorCW1zbV9tdXhfZWJpX2NkYywKKwltc21fbXV4X2RhY19jYWxpYjE3LAorCW1zbV9tdXhfdXNfZW1pdHRlciwKKwltc21fbXV4X2F0ZXN0X2NoYXIwLAorCW1zbV9tdXhfcHJpX21pMnNfbWNsa19iLAorCW1zbV9tdXhfbHBhc3Nfc2xpbWJ1cywKKwltc21fbXV4X2xwYXNzX3NsaW1idXMwLAorCW1zbV9tdXhfbHBhc3Nfc2xpbWJ1czEsCisJbXNtX211eF9jb2RlY19pbnQxLAorCW1zbV9tdXhfY29kZWNfaW50MiwKKwltc21fbXV4X3djc3NfYnQsCisJbXNtX211eF9hdGVzdF9jaGFyMiwKKwltc21fbXV4X2ViaV9jaDAsCisJbXNtX211eF93Y3NzX3dsYW4yLAorCW1zbV9tdXhfd2Nzc193bGFuMSwKKwltc21fbXV4X3djc3Nfd2xhbjAsCisJbXNtX211eF93Y3NzX3dsYW4sCisJbXNtX211eF93Y3NzX2ZtLAorCW1zbV9tdXhfZXh0X2xwYXNzLAorCW1zbV9tdXhfbXNzX2x0ZSwKKwltc21fbXV4X2tleV92b2xwLAorCW1zbV9tdXhfcGJzMCwKKwltc21fbXV4X2NyaV90cm5nMCwKKwltc21fbXV4X2tleV9zbmFwc2hvdCwKKwltc21fbXV4X3BiczEsCisJbXNtX211eF9jcmlfdHJuZzEsCisJbXNtX211eF9rZXlfZm9jdXMsCisJbXNtX211eF9wYnMyLAorCW1zbV9tdXhfY3JpX3RybmcsCisJbXNtX211eF9nY2NfdGxtbSwKKwltc21fbXV4X2tleV9ob21lLAorCW1zbV9tdXhfcHdyX2Rvd24sCisJbXNtX211eF9kbWljMF9jbGssCisJbXNtX211eF9ibHNwN19zcGksCisJbXNtX211eF9oZG1pX2ludCwKKwltc21fbXV4X2RtaWMwX2RhdGEsCisJbXNtX211eF9xZHNzX2N0aV90cmlnX2luX2ExLAorCW1zbV9tdXhfcHJpX21pMnNfd3MsCisJbXNtX211eF93c2FfaW8sCisJbXNtX211eF93c2FfZW4sCisJbXNtX211eF9ibHNwX3NwaTgsCisJbXNtX211eF93c2FfaXJxLAorCW1zbV9tdXhfYmxzcF9pMmM4LAorCW1zbV9tdXhfZ2NjX3BsbHRlc3QsCisJbXNtX211eF9uYXZfcHBzX2luX2EsCisJbXNtX211eF9wYV9pbmRpY2F0b3IsCisJbXNtX211eF9uYXZfcHBzX2luX2IsCisJbXNtX211eF9uYXZfcHBzLAorCW1zbV9tdXhfbW9kZW1fdHN5bmMsCisJbXNtX211eF9uYXZfdHN5bmMsCisJbXNtX211eF9zc2JpX3d0cjEsCisJbXNtX211eF9nc20xX3R4LAorCW1zbV9tdXhfZGFjX2NhbGliMTgsCisJbXNtX211eF9nc20wX3R4LAorCW1zbV9tdXhfYXRlc3RfY2hhciwKKwltc21fbXV4X2F0ZXN0X3RzZW5zLAorCW1zbV9tdXhfYmltY19kdGUxLAorCW1zbV9tdXhfZGFjX2NhbGliMjAsCisJbXNtX211eF9jYW0yX3JzdCwKKwltc21fbXV4X2Rkcl9iaXN0LAorCW1zbV9tdXhfZGFjX2NhbGliMjEsCisJbXNtX211eF9jYW0yX3N0YW5kYnksCisJbXNtX211eF9kYWNfY2FsaWIyMiwKKwltc21fbXV4X2NhbTNfcnN0LAorCW1zbV9tdXhfZGFjX2NhbGliMjMsCisJbXNtX211eF9jYW0zX3N0YW5kYnksCisJbXNtX211eF9kYWNfY2FsaWIyNCwKKwltc21fbXV4X3NkY2FyZF9kZXQsCisJbXNtX211eF9kYWNfY2FsaWIyNSwKKwltc21fbXV4X2NhbTFfbGRvLAorCW1zbV9tdXhfc2VjX21pMnMsCisJbXNtX211eF9ibHNwX3NwaTcsCisJbXNtX211eF9ibHNwX2kyYzcsCisJbXNtX211eF9zc19zd2l0Y2gsCisJbXNtX211eF90c2Vuc19tYXgsCisJbXNtX211eF9OQSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3Bpb19ncm91cHNbXSA9IHsKKwkiZ3BpbzAiLCAiZ3BpbzEiLCAiZ3BpbzIiLCAiZ3BpbzMiLCAiZ3BpbzQiLCAiZ3BpbzUiLCAiZ3BpbzYiLCAiZ3BpbzciLAorCSJncGlvOCIsICJncGlvOSIsICJncGlvMTAiLCAiZ3BpbzExIiwgImdwaW8xMiIsICJncGlvMTMiLCAiZ3BpbzE0IiwKKwkiZ3BpbzE1IiwgImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsICJncGlvMjAiLCAiZ3BpbzIxIiwKKwkiZ3BpbzIyIiwgImdwaW8yMyIsICJncGlvMjQiLCAiZ3BpbzI1IiwgImdwaW8yNiIsICJncGlvMjciLCAiZ3BpbzI4IiwKKwkiZ3BpbzI5IiwgImdwaW8zMCIsICJncGlvMzEiLCAiZ3BpbzMyIiwgImdwaW8zMyIsICJncGlvMzQiLCAiZ3BpbzM1IiwKKwkiZ3BpbzM2IiwgImdwaW8zNyIsICJncGlvMzgiLCAiZ3BpbzM5IiwgImdwaW80MCIsICJncGlvNDEiLCAiZ3BpbzQyIiwKKwkiZ3BpbzQzIiwgImdwaW80NCIsICJncGlvNDUiLCAiZ3BpbzQ2IiwgImdwaW80NyIsICJncGlvNDgiLCAiZ3BpbzQ5IiwKKwkiZ3BpbzUwIiwgImdwaW81MSIsICJncGlvNTIiLCAiZ3BpbzUzIiwgImdwaW81NCIsICJncGlvNTUiLCAiZ3BpbzU2IiwKKwkiZ3BpbzU3IiwgImdwaW81OCIsICJncGlvNTkiLCAiZ3BpbzYwIiwgImdwaW82MSIsICJncGlvNjIiLCAiZ3BpbzYzIiwKKwkiZ3BpbzY0IiwgImdwaW82NSIsICJncGlvNjYiLCAiZ3BpbzY3IiwgImdwaW82OCIsICJncGlvNjkiLCAiZ3BpbzcwIiwKKwkiZ3BpbzcxIiwgImdwaW83MiIsICJncGlvNzMiLCAiZ3Bpbzc0IiwgImdwaW83NSIsICJncGlvNzYiLCAiZ3Bpbzc3IiwKKwkiZ3Bpbzc4IiwgImdwaW83OSIsICJncGlvODAiLCAiZ3BpbzgxIiwgImdwaW84MiIsICJncGlvODMiLCAiZ3Bpbzg0IiwKKwkiZ3Bpbzg1IiwgImdwaW84NiIsICJncGlvODciLCAiZ3Bpbzg4IiwgImdwaW84OSIsICJncGlvOTAiLCAiZ3BpbzkxIiwKKwkiZ3BpbzkyIiwgImdwaW85MyIsICJncGlvOTQiLCAiZ3Bpbzk1IiwgImdwaW85NiIsICJncGlvOTciLCAiZ3Bpbzk4IiwKKwkiZ3Bpbzk5IiwgImdwaW8xMDAiLCAiZ3BpbzEwMSIsICJncGlvMTAyIiwgImdwaW8xMDMiLCAiZ3BpbzEwNCIsCisJImdwaW8xMDUiLCAiZ3BpbzEwNiIsICJncGlvMTA3IiwgImdwaW8xMDgiLCAiZ3BpbzEwOSIsICJncGlvMTEwIiwKKwkiZ3BpbzExMSIsICJncGlvMTEyIiwgImdwaW8xMTMiLCAiZ3BpbzExNCIsICJncGlvMTE1IiwgImdwaW8xMTYiLAorCSJncGlvMTE3IiwgImdwaW8xMTgiLCAiZ3BpbzExOSIsICJncGlvMTIwIiwgImdwaW8xMjEiLCAiZ3BpbzEyMiIsCisJImdwaW8xMjMiLCAiZ3BpbzEyNCIsICJncGlvMTI1IiwgImdwaW8xMjYiLCAiZ3BpbzEyNyIsICJncGlvMTI4IiwKKwkiZ3BpbzEyOSIsICJncGlvMTMwIiwgImdwaW8xMzEiLCAiZ3BpbzEzMiIsICJncGlvMTMzIiwgImdwaW8xMzQiLAorCSJncGlvMTM1IiwgImdwaW8xMzYiLCAiZ3BpbzEzNyIsICJncGlvMTM4IiwgImdwaW8xMzkiLCAiZ3BpbzE0MCIsCisJImdwaW8xNDEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9zcGkxX2dyb3Vwc1tdID0geworCSJncGlvMCIsICJncGlvMSIsICJncGlvMiIsICJncGlvMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWJfaW50X2dyb3Vwc1tdID0geworCSJncGlvMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhZHNwX2V4dF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJuZ19yb3NjX2dyb3Vwc1tdID0geworCSJncGlvMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX2kyYzFfZ3JvdXBzW10gPSB7CisJImdwaW8yIiwgImdwaW8zIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfY3RpX3RyaWdfb3V0X2IwX2dyb3Vwc1tdID0geworCSJncGlvMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2N0aV90cmlnX291dF9hMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9zcGkyX2dyb3Vwc1tdID0geworCSJncGlvNCIsICJncGlvNSIsICJncGlvNiIsICJncGlvNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3VhcnQyX2dyb3Vwc1tdID0geworCSJncGlvNCIsICJncGlvNSIsICJncGlvNiIsICJncGlvNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZG9fdXBkYXRlX2dyb3Vwc1tdID0geworCSJncGlvNCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIwX2dyb3Vwc1tdID0geworCSJncGlvNCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZG9fZW5fZ3JvdXBzW10gPSB7CisJImdwaW81IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzYiLCAiZ3BpbzciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ2NjX2dwMV9jbGtfYl9ncm91cHNbXSA9IHsKKwkiZ3BpbzYiLCAiZ3BpbzQxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X2dwc2FkY19kdGVzdDBfbmF0aXZlX2dyb3Vwc1tdID0geworCSJncGlvNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaTNfZ3JvdXBzW10gPSB7CisJImdwaW84IiwgImdwaW85IiwgImdwaW8xMCIsICJncGlvMTEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc190cmFjZWRhdGFfYl9ncm91cHNbXSA9IHsKKwkiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzEyIiwgImdwaW8xMyIsICJncGlvMjMiLCAiZ3BpbzQyIiwgImdwaW80MyIsCisJImdwaW80NCIsICJncGlvNDUiLCAiZ3BpbzQ2IiwgImdwaW80NyIsICJncGlvNjYiLCAiZ3Bpbzg2IiwgImdwaW84NyIsCisJImdwaW84OCIsICJncGlvOTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX21vZGVtX2VuYWJsZWRfYl9ncm91cHNbXSA9IHsKKwkiZ3BpbzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9pMmMzX2dyb3Vwc1tdID0geworCSJncGlvMTAiLCAiZ3BpbzExIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19ncDJfY2xrX2JfZ3JvdXBzW10gPSB7CisJImdwaW8xMCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfZ3AzX2Nsa19iX2dyb3Vwc1tdID0geworCSJncGlvMTEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGFsbF9pbnRfZ3JvdXBzW10gPSB7CisJImdwaW8xMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaTRfZ3JvdXBzW10gPSB7CisJImdwaW8xMiIsICJncGlvMTMiLCAiZ3BpbzE0IiwgImdwaW8xNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3VhcnQ0X2dyb3Vwc1tdID0geworCSJncGlvMTIiLCAiZ3BpbzEzIiwgImdwaW8xNCIsICJncGlvMTUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX25hdl9lbmFibGVkX2JfZ3JvdXBzW10gPSB7CisJImdwaW8xMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIxX2dyb3Vwc1tdID0geworCSJncGlvMTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FwX2ludF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3cl9jcnlwdG9fZW5hYmxlZF9iX2dyb3Vwc1tdID0geworCSJncGlvMTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzE0IiwgImdwaW8xNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuZmNfZGlzYWJsZV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpNV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE2IiwgImdwaW8xNyIsICJncGlvMTgiLCAiZ3BpbzE5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDVfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3RyYWNlY2xrX2FfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9iYnJ4MV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5mY19pcnFfZ3JvdXBzW10gPSB7CisJImdwaW8xNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtX3ZvY19ncm91cHNbXSA9IHsKKwkiZ3BpbzE3IiwgImdwaW8yMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2N0aV90cmlnX2luX2EwX2dyb3Vwc1tdID0geworCSJncGlvMTciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfYmJyeDBfZ3JvdXBzW10gPSB7CisJImdwaW8xNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX2kyYzVfZ3JvdXBzW10gPSB7CisJImdwaW8xOCIsICJncGlvMTkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc190cmFjZWN0bF9hX2dyb3Vwc1tdID0geworCSJncGlvMTgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfZ3BzYWRjX2R0ZXN0MV9uYXRpdmVfZ3JvdXBzW10gPSB7CisJImdwaW8xOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3RyYWNlZGF0YV9hX2dyb3Vwc1tdID0geworCSJncGlvMTkiLCAiZ3BpbzI2IiwgImdwaW8yNyIsICJncGlvMjgiLCAiZ3BpbzI5IiwgImdwaW8zMCIsICJncGlvMzEiLAorCSJncGlvMzIiLCAiZ3BpbzMzIiwgImdwaW8zNCIsICJncGlvMzUiLCAiZ3BpbzM2IiwgImdwaW8zOCIsICJncGlvMzkiLAorCSJncGlvNDAiLCAiZ3BpbzUwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpNl9ncm91cHNbXSA9IHsKKwkiZ3BpbzIwIiwgImdwaW8yMSIsICJncGlvMjIiLCAiZ3BpbzIzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDZfZ3JvdXBzW10gPSB7CisJImdwaW8yMCIsICJncGlvMjEiLCAiZ3BpbzIyIiwgImdwaW8yMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3RyYWNlY3RsX2JfZ3JvdXBzW10gPSB7CisJImdwaW8yMCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIxNV9ncm91cHNbXSA9IHsKKwkiZ3BpbzIwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfY3RpX3RyaWdfaW5fYjBfZ3JvdXBzW10gPSB7CisJImdwaW8yMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIxNl9ncm91cHNbXSA9IHsKKwkiZ3BpbzIxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfaTJjNl9ncm91cHNbXSA9IHsKKwkiZ3BpbzIyIiwgImdwaW8yMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3RyYWNlY2xrX2JfZ3JvdXBzW10gPSB7CisJImdwaW8yMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF93bGFuMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzIyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3dsYW4xX2dyb3Vwc1tdID0geworCSJncGlvMjMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRwX3ZzeW5jX2dyb3Vwc1tdID0geworCSJncGlvMjQiLCAiZ3BpbzI1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaV9taTJzX21jbGtfYV9ncm91cHNbXSA9IHsKKwkiZ3BpbzI1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlY19taTJzX21jbGtfYV9ncm91cHNbXSA9IHsKKwkiZ3BpbzI1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfY3RpX3RyaWdfb3V0X2IxX2dyb3Vwc1tdID0geworCSJncGlvMjUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtX21jbGtfZ3JvdXBzW10gPSB7CisJImdwaW8yNiIsICJncGlvMjciLCAiZ3BpbzI4IiwgImdwaW8xMjgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliM19ncm91cHNbXSA9IHsKKwkiZ3BpbzI4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV9pMmNfZ3JvdXBzW10gPSB7CisJImdwaW8yOSIsICJncGlvMzAiLCAiZ3BpbzMxIiwgImdwaW8zMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd3JfbW9kZW1fZW5hYmxlZF9hX2dyb3Vwc1tdID0geworCSJncGlvMjkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzI5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhY19jYWxpYjE5X2dyb3Vwc1tdID0geworCSJncGlvMzAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmxhc2hfc3Ryb2JlX2dyb3Vwc1tdID0geworCSJncGlvMzMiLCAiZ3BpbzM0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV90aW1lcjBfZ3JvdXBzW10gPSB7CisJImdwaW8zMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfdGltZXIxX2dyb3Vwc1tdID0geworCSJncGlvMzQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtX2lycV9ncm91cHNbXSA9IHsKKwkiZ3BpbzM1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV90aW1lcjJfZ3JvdXBzW10gPSB7CisJImdwaW8zNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwMV9zcGlfZ3JvdXBzW10gPSB7CisJImdwaW8zNSIsICJncGlvMzYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX25hdl9lbmFibGVkX2FfZ3JvdXBzW10gPSB7CisJImdwaW8zNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvaXNfc3luY19ncm91cHNbXSA9IHsKKwkiZ3BpbzM2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV90aW1lcjNfZ3JvdXBzW10gPSB7CisJImdwaW8zNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfdGltZXI0X2dyb3Vwc1tdID0geworCSJncGlvNDEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcDNfc3BpX2dyb3Vwc1tdID0geworCSJncGlvNDEiLCAiZ3BpbzUwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfY3RpX3RyaWdfb3V0X2EwX2dyb3Vwc1tdID0geworCSJncGlvNDEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliN19ncm91cHNbXSA9IHsKKwkiZ3BpbzQxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFjY2VsX2ludF9ncm91cHNbXSA9IHsKKwkiZ3BpbzQyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19ncDFfY2xrX2FfZ3JvdXBzW10gPSB7CisJImdwaW80MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWI4X2dyb3Vwc1tdID0geworCSJncGlvNDIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxzcF9pbnRfZ3JvdXBzW10gPSB7CisJImdwaW80MyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfZ3AyX2Nsa19hX2dyb3Vwc1tdID0geworCSJncGlvNDMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliOV9ncm91cHNbXSA9IHsKKwkiZ3BpbzQzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1hZ19pbnRfZ3JvdXBzW10gPSB7CisJImdwaW80NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfZ3AzX2Nsa19hX2dyb3Vwc1tdID0geworCSJncGlvNDQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX2NyeXB0b19lbmFibGVkX2FfZ3JvdXBzW10gPSB7CisJImdwaW8zNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfYXN5bmNfZ3JvdXBzW10gPSB7CisJImdwaW8zOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW0xX3N0YW5kYnlfZ3JvdXBzW10gPSB7CisJImdwaW8zOSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWI1X2dyb3Vwc1tdID0geworCSJncGlvMzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtMV9yc3RfZ3JvdXBzW10gPSB7CisJImdwaW80MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWI2X2dyb3Vwc1tdID0geworCSJncGlvNDAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMTBfZ3JvdXBzW10gPSB7CisJImdwaW80NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBneXJvX2ludF9ncm91cHNbXSA9IHsKKwkiZ3BpbzQ1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhY19jYWxpYjExX2dyb3Vwc1tdID0geworCSJncGlvNDUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJlc3N1cmVfaW50X2dyb3Vwc1tdID0geworCSJncGlvNDYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMTJfZ3JvdXBzW10gPSB7CisJImdwaW80NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwNl9zcGlfZ3JvdXBzW10gPSB7CisJImdwaW80NyIsICJncGlvNDgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMTNfZ3JvdXBzW10gPSB7CisJImdwaW80NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmcF9pbnRfZ3JvdXBzW10gPSB7CisJImdwaW80OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2N0aV90cmlnX2luX2IxX2dyb3Vwc1tdID0geworCSJncGlvNDgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMTRfZ3JvdXBzW10gPSB7CisJImdwaW80OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW1fYmF0dF9ncm91cHNbXSA9IHsKKwkiZ3BpbzQ5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbTBfbGRvX2dyb3Vwc1tdID0geworCSJncGlvNTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2Rfd3JpdGVfZ3JvdXBzW10gPSB7CisJImdwaW81MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX2RhdGFfZ3JvdXBzW10gPSB7CisJImdwaW81MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX2Nsa19ncm91cHNbXSA9IHsKKwkiZ3BpbzUyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTFfcmVzZXRfZ3JvdXBzW10gPSB7CisJImdwaW81MyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX3ByZXNlbnRfZ3JvdXBzW10gPSB7CisJImdwaW81NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX2RhdGFfZ3JvdXBzW10gPSB7CisJImdwaW81NSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX2Nsa19ncm91cHNbXSA9IHsKKwkiZ3BpbzU2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTJfcmVzZXRfZ3JvdXBzW10gPSB7CisJImdwaW81NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX3ByZXNlbnRfZ3JvdXBzW10gPSB7CisJImdwaW81OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0c194dmRkX2dyb3Vwc1tdID0geworCSJncGlvNjAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwaV9kc2kwX2dyb3Vwc1tdID0geworCSJncGlvNjEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmZjX2R3bF9ncm91cHNbXSA9IHsKKwkiZ3BpbzYyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzX2V1cm9fZ3JvdXBzW10gPSB7CisJImdwaW82MyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyM19ncm91cHNbXSA9IHsKKwkiZ3BpbzYzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRiZ19vdXRfZ3JvdXBzW10gPSB7CisJImdwaW82MyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiaW1jX2R0ZTBfZ3JvdXBzW10gPSB7CisJImdwaW82MyIsICJncGlvNjUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNfcmVzb3V0X2dyb3Vwc1tdID0geworCSJncGlvNjQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNfc2FtcGxlX2dyb3Vwc1tdID0geworCSJncGlvNjUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2VjX21pMnNfbWNsa19iX2dyb3Vwc1tdID0geworCSJncGlvNjYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJpX21pMnNfZ3JvdXBzW10gPSB7CisJImdwaW82NiIsICJncGlvODgiLCAiZ3BpbzkxIiwgImdwaW85MyIsICJncGlvOTQiLCAiZ3Bpbzk1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvZGVjX3Jlc2V0X2dyb3Vwc1tdID0geworCSJncGlvNjciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX3BkbTBfZ3JvdXBzW10gPSB7CisJImdwaW82NyIsICJncGlvNjgiLCAiZ3BpbzY5IiwgImdwaW83MCIsICJncGlvNzEiLCAiZ3BpbzcyIiwgImdwaW83MyIsCisJImdwaW83NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzY3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGViaV9jZGNfZ3JvdXBzW10gPSB7CisJImdwaW82NyIsICJncGlvNjkiLCAiZ3BpbzExOCIsICJncGlvMTE5IiwgImdwaW8xMjAiLCAiZ3BpbzEyMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIxN19ncm91cHNbXSA9IHsKKwkiZ3BpbzY3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzX2VtaXR0ZXJfZ3JvdXBzW10gPSB7CisJImdwaW82OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzY4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaV9taTJzX21jbGtfYl9ncm91cHNbXSA9IHsKKwkiZ3BpbzY5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxwYXNzX3NsaW1idXNfZ3JvdXBzW10gPSB7CisJImdwaW83MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscGFzc19zbGltYnVzMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzcxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxwYXNzX3NsaW1idXMxX2dyb3Vwc1tdID0geworCSJncGlvNzIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY29kZWNfaW50MV9ncm91cHNbXSA9IHsKKwkiZ3BpbzczIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvZGVjX2ludDJfZ3JvdXBzW10gPSB7CisJImdwaW83NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3Y3NzX2J0X2dyb3Vwc1tdID0geworCSJncGlvNzUiLCAiZ3BpbzgzIiwgImdwaW84NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMl9ncm91cHNbXSA9IHsKKwkiZ3Bpbzc1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGViaV9jaDBfZ3JvdXBzW10gPSB7CisJImdwaW83NSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3Y3NzX3dsYW4yX2dyb3Vwc1tdID0geworCSJncGlvNzYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2Nzc193bGFuMV9ncm91cHNbXSA9IHsKKwkiZ3Bpbzc3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdjc3Nfd2xhbjBfZ3JvdXBzW10gPSB7CisJImdwaW83OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3Y3NzX3dsYW5fZ3JvdXBzW10gPSB7CisJImdwaW83OSIsICJncGlvODAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2Nzc19mbV9ncm91cHNbXSA9IHsKKwkiZ3BpbzgxIiwgImdwaW84MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRfbHBhc3NfZ3JvdXBzW10gPSB7CisJImdwaW84MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc3NfbHRlX2dyb3Vwc1tdID0geworCSJncGlvODIiLCAiZ3BpbzgzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleV92b2xwX2dyb3Vwc1tdID0geworCSJncGlvODUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGJzMF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNyaV90cm5nMF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleV9zbmFwc2hvdF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBiczFfZ3JvdXBzW10gPSB7CisJImdwaW84NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcmlfdHJuZzFfZ3JvdXBzW10gPSB7CisJImdwaW84NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlfZm9jdXNfZ3JvdXBzW10gPSB7CisJImdwaW84NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwYnMyX2dyb3Vwc1tdID0geworCSJncGlvODciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3JpX3RybmdfZ3JvdXBzW10gPSB7CisJImdwaW84NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfdGxtbV9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleV9ob21lX2dyb3Vwc1tdID0geworCSJncGlvODgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdyX2Rvd25fZ3JvdXBzW10gPSB7CisJImdwaW84OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkbWljMF9jbGtfZ3JvdXBzW10gPSB7CisJImdwaW84OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwN19zcGlfZ3JvdXBzW10gPSB7CisJImdwaW84OSIsICJncGlvOTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRtaV9pbnRfZ3JvdXBzW10gPSB7CisJImdwaW85MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkbWljMF9kYXRhX2dyb3Vwc1tdID0geworCSJncGlvOTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19jdGlfdHJpZ19pbl9hMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzkxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaV9taTJzX3dzX2dyb3Vwc1tdID0geworCSJncGlvOTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd3NhX2lvX2dyb3Vwc1tdID0geworCSJncGlvOTQiLCAiZ3Bpbzk1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYV9lbl9ncm91cHNbXSA9IHsKKwkiZ3Bpbzk2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpOF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzk2IiwgImdwaW85NyIsICJncGlvOTgiLCAiZ3Bpbzk5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYV9pcnFfZ3JvdXBzW10gPSB7CisJImdwaW85NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX2kyYzhfZ3JvdXBzW10gPSB7CisJImdwaW85OCIsICJncGlvOTkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ2NjX3BsbHRlc3RfZ3JvdXBzW10gPSB7CisJImdwaW85OCIsICJncGlvOTkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF2X3Bwc19pbl9hX2dyb3Vwc1tdID0geworCSJncGlvMTExIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBhX2luZGljYXRvcl9ncm91cHNbXSA9IHsKKwkiZ3BpbzExMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXZfcHBzX2luX2JfZ3JvdXBzW10gPSB7CisJImdwaW8xMTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF2X3Bwc19ncm91cHNbXSA9IHsKKwkiZ3BpbzExMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtb2RlbV90c3luY19ncm91cHNbXSA9IHsKKwkiZ3BpbzExMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXZfdHN5bmNfZ3JvdXBzW10gPSB7CisJImdwaW8xMTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3NiaV93dHIxX2dyb3Vwc1tdID0geworCSJncGlvMTE0IiwgImdwaW8xMjMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3NtMV90eF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIxOF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnc20wX3R4X2dyb3Vwc1tdID0geworCSJncGlvMTE3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X2NoYXJfZ3JvdXBzW10gPSB7CisJImdwaW8xMjAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfdHNlbnNfZ3JvdXBzW10gPSB7CisJImdwaW8xMjAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmltY19kdGUxX2dyb3Vwc1tdID0geworCSJncGlvMTIxIiwgImdwaW8xMjIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMjBfZ3JvdXBzW10gPSB7CisJImdwaW8xMjgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtMl9yc3RfZ3JvdXBzW10gPSB7CisJImdwaW8xMjkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGRyX2Jpc3RfZ3JvdXBzW10gPSB7CisJImdwaW8xMjkiLCAiZ3BpbzEzMCIsICJncGlvMTMxIiwgImdwaW8xMzIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGFjX2NhbGliMjFfZ3JvdXBzW10gPSB7CisJImdwaW8xMjkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtMl9zdGFuZGJ5X2dyb3Vwc1tdID0geworCSJncGlvMTMwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhY19jYWxpYjIyX2dyb3Vwc1tdID0geworCSJncGlvMTMwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbTNfcnN0X2dyb3Vwc1tdID0geworCSJncGlvMTMxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhY19jYWxpYjIzX2dyb3Vwc1tdID0geworCSJncGlvMTMxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbTNfc3RhbmRieV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYWNfY2FsaWIyNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzMiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGNhcmRfZGV0X2dyb3Vwc1tdID0geworCSJncGlvMTMzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhY19jYWxpYjI1X2dyb3Vwc1tdID0geworCSJncGlvMTMzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbTFfbGRvX2dyb3Vwc1tdID0geworCSJncGlvMTM0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlY19taTJzX2dyb3Vwc1tdID0geworCSJncGlvMTM1IiwgImdwaW8xMzYiLCAiZ3BpbzEzNyIsICJncGlvMTM4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpN19ncm91cHNbXSA9IHsKKwkiZ3BpbzEzNSIsICJncGlvMTM2IiwgImdwaW8xMzciLCAiZ3BpbzEzOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX2kyYzdfZ3JvdXBzW10gPSB7CisJImdwaW8xMzUiLCAiZ3BpbzEzNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzc19zd2l0Y2hfZ3JvdXBzW10gPSB7CisJImdwaW8xMzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNlbnNfbWF4X2dyb3Vwc1tdID0geworCSJncGlvMTM5IiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNtX2Z1bmN0aW9uIG1zbTg5NTNfZnVuY3Rpb25zW10gPSB7CisJRlVOQ1RJT04oZ3BpbyksCisJRlVOQ1RJT04oYmxzcF9zcGkxKSwKKwlGVU5DVElPTihzbWJfaW50KSwKKwlGVU5DVElPTihhZHNwX2V4dCksCisJRlVOQ1RJT04ocHJuZ19yb3NjKSwKKwlGVU5DVElPTihibHNwX2kyYzEpLAorCUZVTkNUSU9OKHFkc3NfY3RpX3RyaWdfb3V0X2IwKSwKKwlGVU5DVElPTihxZHNzX2N0aV90cmlnX291dF9hMSksCisJRlVOQ1RJT04oYmxzcF9zcGkyKSwKKwlGVU5DVElPTihibHNwX3VhcnQyKSwKKwlGVU5DVElPTihsZG9fdXBkYXRlKSwKKwlGVU5DVElPTihkYWNfY2FsaWIwKSwKKwlGVU5DVElPTihsZG9fZW4pLAorCUZVTkNUSU9OKGJsc3BfaTJjMiksCisJRlVOQ1RJT04oZ2NjX2dwMV9jbGtfYiksCisJRlVOQ1RJT04oYXRlc3RfZ3BzYWRjX2R0ZXN0MF9uYXRpdmUpLAorCUZVTkNUSU9OKGJsc3Bfc3BpMyksCisJRlVOQ1RJT04ocWRzc190cmFjZWRhdGFfYiksCisJRlVOQ1RJT04ocHdyX21vZGVtX2VuYWJsZWRfYiksCisJRlVOQ1RJT04oYmxzcF9pMmMzKSwKKwlGVU5DVElPTihnY2NfZ3AyX2Nsa19iKSwKKwlGVU5DVElPTihnY2NfZ3AzX2Nsa19iKSwKKwlGVU5DVElPTihoYWxsX2ludCksCisJRlVOQ1RJT04oYmxzcF9zcGk0KSwKKwlGVU5DVElPTihibHNwX3VhcnQ0KSwKKwlGVU5DVElPTihwd3JfbmF2X2VuYWJsZWRfYiksCisJRlVOQ1RJT04oZGFjX2NhbGliMSksCisJRlVOQ1RJT04oY2FwX2ludCksCisJRlVOQ1RJT04ocHdyX2NyeXB0b19lbmFibGVkX2IpLAorCUZVTkNUSU9OKGRhY19jYWxpYjIpLAorCUZVTkNUSU9OKGJsc3BfaTJjNCksCisJRlVOQ1RJT04obmZjX2Rpc2FibGUpLAorCUZVTkNUSU9OKGJsc3Bfc3BpNSksCisJRlVOQ1RJT04oYmxzcF91YXJ0NSksCisJRlVOQ1RJT04ocWRzc190cmFjZWNsa19hKSwKKwlGVU5DVElPTihhdGVzdF9iYnJ4MSksCisJRlVOQ1RJT04obmZjX2lycSksCisJRlVOQ1RJT04obV92b2MpLAorCUZVTkNUSU9OKHFkc3NfY3RpX3RyaWdfaW5fYTApLAorCUZVTkNUSU9OKGF0ZXN0X2JicngwKSwKKwlGVU5DVElPTihibHNwX2kyYzUpLAorCUZVTkNUSU9OKHFkc3NfdHJhY2VjdGxfYSksCisJRlVOQ1RJT04oYXRlc3RfZ3BzYWRjX2R0ZXN0MV9uYXRpdmUpLAorCUZVTkNUSU9OKHFkc3NfdHJhY2VkYXRhX2EpLAorCUZVTkNUSU9OKGJsc3Bfc3BpNiksCisJRlVOQ1RJT04oYmxzcF91YXJ0NiksCisJRlVOQ1RJT04ocWRzc190cmFjZWN0bF9iKSwKKwlGVU5DVElPTihkYWNfY2FsaWIxNSksCisJRlVOQ1RJT04ocWRzc19jdGlfdHJpZ19pbl9iMCksCisJRlVOQ1RJT04oZGFjX2NhbGliMTYpLAorCUZVTkNUSU9OKGJsc3BfaTJjNiksCisJRlVOQ1RJT04ocWRzc190cmFjZWNsa19iKSwKKwlGVU5DVElPTihhdGVzdF93bGFuMCksCisJRlVOQ1RJT04oYXRlc3Rfd2xhbjEpLAorCUZVTkNUSU9OKG1kcF92c3luYyksCisJRlVOQ1RJT04ocHJpX21pMnNfbWNsa19hKSwKKwlGVU5DVElPTihzZWNfbWkyc19tY2xrX2EpLAorCUZVTkNUSU9OKHFkc3NfY3RpX3RyaWdfb3V0X2IxKSwKKwlGVU5DVElPTihjYW1fbWNsayksCisJRlVOQ1RJT04oZGFjX2NhbGliMyksCisJRlVOQ1RJT04oY2NpX2kyYyksCisJRlVOQ1RJT04ocHdyX21vZGVtX2VuYWJsZWRfYSksCisJRlVOQ1RJT04oZGFjX2NhbGliNCksCisJRlVOQ1RJT04oZGFjX2NhbGliMTkpLAorCUZVTkNUSU9OKGZsYXNoX3N0cm9iZSksCisJRlVOQ1RJT04oY2NpX3RpbWVyMCksCisJRlVOQ1RJT04oY2NpX3RpbWVyMSksCisJRlVOQ1RJT04oY2FtX2lycSksCisJRlVOQ1RJT04oY2NpX3RpbWVyMiksCisJRlVOQ1RJT04oYmxzcDFfc3BpKSwKKwlGVU5DVElPTihwd3JfbmF2X2VuYWJsZWRfYSksCisJRlVOQ1RJT04ob2lzX3N5bmMpLAorCUZVTkNUSU9OKGNjaV90aW1lcjMpLAorCUZVTkNUSU9OKGNjaV90aW1lcjQpLAorCUZVTkNUSU9OKGJsc3AzX3NwaSksCisJRlVOQ1RJT04ocWRzc19jdGlfdHJpZ19vdXRfYTApLAorCUZVTkNUSU9OKGRhY19jYWxpYjcpLAorCUZVTkNUSU9OKGFjY2VsX2ludCksCisJRlVOQ1RJT04oZ2NjX2dwMV9jbGtfYSksCisJRlVOQ1RJT04oZGFjX2NhbGliOCksCisJRlVOQ1RJT04oYWxzcF9pbnQpLAorCUZVTkNUSU9OKGdjY19ncDJfY2xrX2EpLAorCUZVTkNUSU9OKGRhY19jYWxpYjkpLAorCUZVTkNUSU9OKG1hZ19pbnQpLAorCUZVTkNUSU9OKGdjY19ncDNfY2xrX2EpLAorCUZVTkNUSU9OKHB3cl9jcnlwdG9fZW5hYmxlZF9hKSwKKwlGVU5DVElPTihjY2lfYXN5bmMpLAorCUZVTkNUSU9OKGNhbTFfc3RhbmRieSksCisJRlVOQ1RJT04oZGFjX2NhbGliNSksCisJRlVOQ1RJT04oY2FtMV9yc3QpLAorCUZVTkNUSU9OKGRhY19jYWxpYjYpLAorCUZVTkNUSU9OKGRhY19jYWxpYjEwKSwKKwlGVU5DVElPTihneXJvX2ludCksCisJRlVOQ1RJT04oZGFjX2NhbGliMTEpLAorCUZVTkNUSU9OKHByZXNzdXJlX2ludCksCisJRlVOQ1RJT04oZGFjX2NhbGliMTIpLAorCUZVTkNUSU9OKGJsc3A2X3NwaSksCisJRlVOQ1RJT04oZGFjX2NhbGliMTMpLAorCUZVTkNUSU9OKGZwX2ludCksCisJRlVOQ1RJT04ocWRzc19jdGlfdHJpZ19pbl9iMSksCisJRlVOQ1RJT04oZGFjX2NhbGliMTQpLAorCUZVTkNUSU9OKHVpbV9iYXR0KSwKKwlGVU5DVElPTihjYW0wX2xkbyksCisJRlVOQ1RJT04oc2Rfd3JpdGUpLAorCUZVTkNUSU9OKHVpbTFfZGF0YSksCisJRlVOQ1RJT04odWltMV9jbGspLAorCUZVTkNUSU9OKHVpbTFfcmVzZXQpLAorCUZVTkNUSU9OKHVpbTFfcHJlc2VudCksCisJRlVOQ1RJT04odWltMl9kYXRhKSwKKwlGVU5DVElPTih1aW0yX2NsayksCisJRlVOQ1RJT04odWltMl9yZXNldCksCisJRlVOQ1RJT04odWltMl9wcmVzZW50KSwKKwlGVU5DVElPTih0c194dmRkKSwKKwlGVU5DVElPTihtaXBpX2RzaTApLAorCUZVTkNUSU9OKG5mY19kd2wpLAorCUZVTkNUSU9OKHVzX2V1cm8pLAorCUZVTkNUSU9OKGF0ZXN0X2NoYXIzKSwKKwlGVU5DVElPTihkYmdfb3V0KSwKKwlGVU5DVElPTihiaW1jX2R0ZTApLAorCUZVTkNUSU9OKHRzX3Jlc291dCksCisJRlVOQ1RJT04odHNfc2FtcGxlKSwKKwlGVU5DVElPTihzZWNfbWkyc19tY2xrX2IpLAorCUZVTkNUSU9OKHByaV9taTJzKSwKKwlGVU5DVElPTihjb2RlY19yZXNldCksCisJRlVOQ1RJT04oY2RjX3BkbTApLAorCUZVTkNUSU9OKGF0ZXN0X2NoYXIxKSwKKwlGVU5DVElPTihlYmlfY2RjKSwKKwlGVU5DVElPTihkYWNfY2FsaWIxNyksCisJRlVOQ1RJT04odXNfZW1pdHRlciksCisJRlVOQ1RJT04oYXRlc3RfY2hhcjApLAorCUZVTkNUSU9OKHByaV9taTJzX21jbGtfYiksCisJRlVOQ1RJT04obHBhc3Nfc2xpbWJ1cyksCisJRlVOQ1RJT04obHBhc3Nfc2xpbWJ1czApLAorCUZVTkNUSU9OKGxwYXNzX3NsaW1idXMxKSwKKwlGVU5DVElPTihjb2RlY19pbnQxKSwKKwlGVU5DVElPTihjb2RlY19pbnQyKSwKKwlGVU5DVElPTih3Y3NzX2J0KSwKKwlGVU5DVElPTihhdGVzdF9jaGFyMiksCisJRlVOQ1RJT04oZWJpX2NoMCksCisJRlVOQ1RJT04od2Nzc193bGFuMiksCisJRlVOQ1RJT04od2Nzc193bGFuMSksCisJRlVOQ1RJT04od2Nzc193bGFuMCksCisJRlVOQ1RJT04od2Nzc193bGFuKSwKKwlGVU5DVElPTih3Y3NzX2ZtKSwKKwlGVU5DVElPTihleHRfbHBhc3MpLAorCUZVTkNUSU9OKG1zc19sdGUpLAorCUZVTkNUSU9OKGtleV92b2xwKSwKKwlGVU5DVElPTihwYnMwKSwKKwlGVU5DVElPTihjcmlfdHJuZzApLAorCUZVTkNUSU9OKGtleV9zbmFwc2hvdCksCisJRlVOQ1RJT04ocGJzMSksCisJRlVOQ1RJT04oY3JpX3RybmcxKSwKKwlGVU5DVElPTihrZXlfZm9jdXMpLAorCUZVTkNUSU9OKHBiczIpLAorCUZVTkNUSU9OKGNyaV90cm5nKSwKKwlGVU5DVElPTihnY2NfdGxtbSksCisJRlVOQ1RJT04oa2V5X2hvbWUpLAorCUZVTkNUSU9OKHB3cl9kb3duKSwKKwlGVU5DVElPTihkbWljMF9jbGspLAorCUZVTkNUSU9OKGJsc3A3X3NwaSksCisJRlVOQ1RJT04oaGRtaV9pbnQpLAorCUZVTkNUSU9OKGRtaWMwX2RhdGEpLAorCUZVTkNUSU9OKHFkc3NfY3RpX3RyaWdfaW5fYTEpLAorCUZVTkNUSU9OKHByaV9taTJzX3dzKSwKKwlGVU5DVElPTih3c2FfaW8pLAorCUZVTkNUSU9OKHdzYV9lbiksCisJRlVOQ1RJT04oYmxzcF9zcGk4KSwKKwlGVU5DVElPTih3c2FfaXJxKSwKKwlGVU5DVElPTihibHNwX2kyYzgpLAorCUZVTkNUSU9OKGdjY19wbGx0ZXN0KSwKKwlGVU5DVElPTihuYXZfcHBzX2luX2EpLAorCUZVTkNUSU9OKHBhX2luZGljYXRvciksCisJRlVOQ1RJT04obmF2X3Bwc19pbl9iKSwKKwlGVU5DVElPTihuYXZfcHBzKSwKKwlGVU5DVElPTihtb2RlbV90c3luYyksCisJRlVOQ1RJT04obmF2X3RzeW5jKSwKKwlGVU5DVElPTihzc2JpX3d0cjEpLAorCUZVTkNUSU9OKGdzbTFfdHgpLAorCUZVTkNUSU9OKGRhY19jYWxpYjE4KSwKKwlGVU5DVElPTihnc20wX3R4KSwKKwlGVU5DVElPTihhdGVzdF9jaGFyKSwKKwlGVU5DVElPTihhdGVzdF90c2VucyksCisJRlVOQ1RJT04oYmltY19kdGUxKSwKKwlGVU5DVElPTihkYWNfY2FsaWIyMCksCisJRlVOQ1RJT04oY2FtMl9yc3QpLAorCUZVTkNUSU9OKGRkcl9iaXN0KSwKKwlGVU5DVElPTihkYWNfY2FsaWIyMSksCisJRlVOQ1RJT04oY2FtMl9zdGFuZGJ5KSwKKwlGVU5DVElPTihkYWNfY2FsaWIyMiksCisJRlVOQ1RJT04oY2FtM19yc3QpLAorCUZVTkNUSU9OKGRhY19jYWxpYjIzKSwKKwlGVU5DVElPTihjYW0zX3N0YW5kYnkpLAorCUZVTkNUSU9OKGRhY19jYWxpYjI0KSwKKwlGVU5DVElPTihzZGNhcmRfZGV0KSwKKwlGVU5DVElPTihkYWNfY2FsaWIyNSksCisJRlVOQ1RJT04oY2FtMV9sZG8pLAorCUZVTkNUSU9OKHNlY19taTJzKSwKKwlGVU5DVElPTihibHNwX3NwaTcpLAorCUZVTkNUSU9OKGJsc3BfaTJjNyksCisJRlVOQ1RJT04oc3Nfc3dpdGNoKSwKKwlGVU5DVElPTih0c2Vuc19tYXgpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgbXNtODk1M19ncm91cHNbXSA9IHsKKwlQSU5HUk9VUCgwLCBibHNwX3NwaTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMSwgYmxzcF9zcGkxLCBhZHNwX2V4dCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDIsIGJsc3Bfc3BpMSwgYmxzcF9pMmMxLCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsCisJCSBxZHNzX2N0aV90cmlnX291dF9iMCwgTkEsIE5BKSwKKwlQSU5HUk9VUCgzLCBibHNwX3NwaTEsIGJsc3BfaTJjMSwgTkEsIE5BLCBOQSwgcWRzc19jdGlfdHJpZ19vdXRfYTEsIE5BLAorCQkgTkEsIE5BKSwKKwlQSU5HUk9VUCg0LCBibHNwX3NwaTIsIGJsc3BfdWFydDIsIGxkb191cGRhdGUsIE5BLCBkYWNfY2FsaWIwLCBOQSwgTkEsCisJCSBOQSwgTkEpLAorCVBJTkdST1VQKDUsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwgbGRvX2VuLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg2LCBibHNwX3NwaTIsIGJsc3BfdWFydDIsIGJsc3BfaTJjMiwgZ2NjX2dwMV9jbGtfYiwgTkEsIE5BLAorCQkgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNywgYmxzcF9zcGkyLCBibHNwX3VhcnQyLCBibHNwX2kyYzIsIE5BLAorCQkgYXRlc3RfZ3BzYWRjX2R0ZXN0MF9uYXRpdmUsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4LCBibHNwX3NwaTMsIE5BLCBOQSwgcWRzc190cmFjZWRhdGFfYiwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg5LCBibHNwX3NwaTMsIHB3cl9tb2RlbV9lbmFibGVkX2IsIE5BLCBOQSwgcWRzc190cmFjZWRhdGFfYiwKKwkJIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMCwgYmxzcF9zcGkzLCBibHNwX2kyYzMsIGdjY19ncDJfY2xrX2IsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJIE5BKSwKKwlQSU5HUk9VUCgxMSwgYmxzcF9zcGkzLCBibHNwX2kyYzMsIGdjY19ncDNfY2xrX2IsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJIE5BKSwKKwlQSU5HUk9VUCgxMiwgYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBwd3JfbmF2X2VuYWJsZWRfYiwgTkEsIE5BLAorCQkgcWRzc190cmFjZWRhdGFfYiwgTkEsIGRhY19jYWxpYjEsIE5BKSwKKwlQSU5HUk9VUCgxMywgYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBwd3JfY3J5cHRvX2VuYWJsZWRfYiwgTkEsIE5BLCBOQSwKKwkJIHFkc3NfdHJhY2VkYXRhX2IsIE5BLCBkYWNfY2FsaWIyKSwKKwlQSU5HUk9VUCgxNCwgYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBibHNwX2kyYzQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDE1LCBibHNwX3NwaTQsIGJsc3BfdWFydDQsIGJsc3BfaTJjNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTYsIGJsc3Bfc3BpNSwgYmxzcF91YXJ0NSwgTkEsIE5BLCBxZHNzX3RyYWNlY2xrX2EsIE5BLAorCQkgYXRlc3RfYmJyeDEsIE5BLCBOQSksCisJUElOR1JPVVAoMTcsIGJsc3Bfc3BpNSwgYmxzcF91YXJ0NSwgbV92b2MsIHFkc3NfY3RpX3RyaWdfaW5fYTAsIE5BLAorCQkgYXRlc3RfYmJyeDAsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDE4LCBibHNwX3NwaTUsIGJsc3BfdWFydDUsIGJsc3BfaTJjNSwgcWRzc190cmFjZWN0bF9hLCBOQSwKKwkJIGF0ZXN0X2dwc2FkY19kdGVzdDFfbmF0aXZlLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxOSwgYmxzcF9zcGk1LCBibHNwX3VhcnQ1LCBibHNwX2kyYzUsIHFkc3NfdHJhY2VkYXRhX2EsIE5BLAorCQkgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDIwLCBibHNwX3NwaTYsIGJsc3BfdWFydDYsIE5BLCBOQSwgTkEsIHFkc3NfdHJhY2VjdGxfYiwgTkEsCisJCSBkYWNfY2FsaWIxNSwgTkEpLAorCVBJTkdST1VQKDIxLCBibHNwX3NwaTYsIGJsc3BfdWFydDYsIG1fdm9jLCBOQSwgTkEsIE5BLAorCQkgcWRzc19jdGlfdHJpZ19pbl9iMCwgTkEsIGRhY19jYWxpYjE2KSwKKwlQSU5HUk9VUCgyMiwgYmxzcF9zcGk2LCBibHNwX3VhcnQ2LCBibHNwX2kyYzYsIHFkc3NfdHJhY2VjbGtfYiwgTkEsCisJCSBhdGVzdF93bGFuMCwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMjMsIGJsc3Bfc3BpNiwgYmxzcF91YXJ0NiwgYmxzcF9pMmM2LCBxZHNzX3RyYWNlZGF0YV9iLCBOQSwKKwkJIGF0ZXN0X3dsYW4xLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgyNCwgbWRwX3ZzeW5jLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDI1LCBtZHBfdnN5bmMsIHByaV9taTJzX21jbGtfYSwgc2VjX21pMnNfbWNsa19hLAorCQkgcWRzc19jdGlfdHJpZ19vdXRfYjEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMjYsIGNhbV9tY2xrLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMjcsIGNhbV9tY2xrLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMjgsIGNhbV9tY2xrLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgZGFjX2NhbGliMywKKwkJIE5BLCBOQSksCisJUElOR1JPVVAoMjksIGNjaV9pMmMsIHB3cl9tb2RlbV9lbmFibGVkX2EsIE5BLCBOQSwgTkEsCisJCSBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgZGFjX2NhbGliNCwgTkEpLAorCVBJTkdST1VQKDMwLCBjY2lfaTJjLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgZGFjX2NhbGliMTksCisJCSBOQSwgTkEpLAorCVBJTkdST1VQKDMxLCBjY2lfaTJjLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMzIsIGNjaV9pMmMsIE5BLCBOQSwgTkEsIHFkc3NfdHJhY2VkYXRhX2EsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgzMywgY2NpX3RpbWVyMCwgTkEsIE5BLCBOQSwgTkEsIHFkc3NfdHJhY2VkYXRhX2EsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDM0LCBjY2lfdGltZXIxLCBOQSwgTkEsIE5BLCBOQSwgcWRzc190cmFjZWRhdGFfYSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMzUsIGNjaV90aW1lcjIsIGJsc3AxX3NwaSwgcHdyX25hdl9lbmFibGVkX2EsIE5BLCBOQSwgTkEsCisJCSBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgTkEpLAorCVBJTkdST1VQKDM2LCBjY2lfdGltZXIzLCBibHNwMV9zcGksIE5BLCBwd3JfY3J5cHRvX2VuYWJsZWRfYSwgTkEsIE5BLAorCQkgTkEsIHFkc3NfdHJhY2VkYXRhX2EsIE5BKSwKKwlQSU5HUk9VUCgzNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMzgsIGNjaV9hc3luYywgTkEsIHFkc3NfdHJhY2VkYXRhX2EsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDM5LCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9hLCBOQSwgZGFjX2NhbGliNSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDAsIE5BLCBOQSwgcWRzc190cmFjZWRhdGFfYSwgTkEsIGRhY19jYWxpYjYsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg0MSwgY2NpX3RpbWVyNCwgYmxzcDNfc3BpLCBnY2NfZ3AxX2Nsa19iLCBOQSwgTkEsCisJCSBxZHNzX2N0aV90cmlnX291dF9hMCwgTkEsIGRhY19jYWxpYjcsIE5BKSwKKwlQSU5HUk9VUCg0MiwgZ2NjX2dwMV9jbGtfYSwgcWRzc190cmFjZWRhdGFfYiwgTkEsIGRhY19jYWxpYjgsIE5BLCBOQSwKKwkJIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDQzLCBnY2NfZ3AyX2Nsa19hLCBxZHNzX3RyYWNlZGF0YV9iLCBOQSwgZGFjX2NhbGliOSwgTkEsIE5BLAorCQkgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDQsIGdjY19ncDNfY2xrX2EsIHFkc3NfdHJhY2VkYXRhX2IsIE5BLCBkYWNfY2FsaWIxMCwgTkEsIE5BLAorCQkgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDUsIE5BLCBxZHNzX3RyYWNlZGF0YV9iLCBOQSwgZGFjX2NhbGliMTEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDYsIHFkc3NfdHJhY2VkYXRhX2IsIE5BLCBkYWNfY2FsaWIxMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNDcsIGJsc3A2X3NwaSwgcWRzc190cmFjZWRhdGFfYiwgTkEsIGRhY19jYWxpYjEzLCBOQSwgTkEsIE5BLAorCQkgTkEsIE5BKSwKKwlQSU5HUk9VUCg0OCwgYmxzcDZfc3BpLCBOQSwgcWRzc19jdGlfdHJpZ19pbl9iMSwgTkEsIGRhY19jYWxpYjE0LCBOQSwKKwkJIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDQ5LCB1aW1fYmF0dCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg1MCwgYmxzcDNfc3BpLCBzZF93cml0ZSwgTkEsIE5BLCBOQSwgcWRzc190cmFjZWRhdGFfYSwgTkEsIE5BLAorCQkgTkEpLAorCVBJTkdST1VQKDUxLCB1aW0xX2RhdGEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNTIsIHVpbTFfY2xrLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDUzLCB1aW0xX3Jlc2V0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDU0LCB1aW0xX3ByZXNlbnQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNTUsIHVpbTJfZGF0YSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg1NiwgdWltMl9jbGssIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNTcsIHVpbTJfcmVzZXQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNTgsIHVpbTJfcHJlc2VudCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg1OSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNjAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDYxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg2MiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNjMsIGF0ZXN0X2NoYXIzLCBkYmdfb3V0LCBiaW1jX2R0ZTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDY0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg2NSwgYmltY19kdGUwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDY2LCBzZWNfbWkyc19tY2xrX2IsIHByaV9taTJzLCBOQSwgcWRzc190cmFjZWRhdGFfYiwgTkEsIE5BLAorCQkgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNjcsIGNkY19wZG0wLCBhdGVzdF9jaGFyMSwgZWJpX2NkYywgTkEsIGRhY19jYWxpYjE3LCBOQSwgTkEsCisJCSBOQSwgTkEpLAorCVBJTkdST1VQKDY4LCBjZGNfcGRtMCwgYXRlc3RfY2hhcjAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg2OSwgY2RjX3BkbTAsIHByaV9taTJzX21jbGtfYiwgZWJpX2NkYywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkgTkEpLAorCVBJTkdST1VQKDcwLCBscGFzc19zbGltYnVzLCBjZGNfcGRtMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDcxLCBscGFzc19zbGltYnVzMCwgY2RjX3BkbTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg3MiwgbHBhc3Nfc2xpbWJ1czEsIGNkY19wZG0wLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoNzMsIGNkY19wZG0wLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDc0LCBjZGNfcGRtMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg3NSwgd2Nzc19idCwgYXRlc3RfY2hhcjIsIE5BLCBlYmlfY2gwLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDc2LCB3Y3NzX3dsYW4yLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDc3LCB3Y3NzX3dsYW4xLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDc4LCB3Y3NzX3dsYW4wLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDc5LCB3Y3NzX3dsYW4sIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoODAsIHdjc3Nfd2xhbiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4MSwgd2Nzc19mbSwgZXh0X2xwYXNzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoODIsIHdjc3NfZm0sIG1zc19sdGUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4Mywgd2Nzc19idCwgbXNzX2x0ZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDg0LCB3Y3NzX2J0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDg1LCBwYnMwLCBjcmlfdHJuZzAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4NiwgcGJzMSwgY3JpX3RybmcxLCBxZHNzX3RyYWNlZGF0YV9iLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4NywgcGJzMiwgY3JpX3RybmcsIHFkc3NfdHJhY2VkYXRhX2IsIGdjY190bG1tLCBOQSwgTkEsIE5BLAorCQkgTkEsIE5BKSwKKwlQSU5HUk9VUCg4OCwgcHJpX21pMnMsIE5BLCBOQSwgTkEsIHFkc3NfdHJhY2VkYXRhX2IsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg4OSwgZG1pYzBfY2xrLCBibHNwN19zcGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg5MCwgZG1pYzBfZGF0YSwgYmxzcDdfc3BpLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTEsIHByaV9taTJzLCBOQSwgTkEsIE5BLCBxZHNzX2N0aV90cmlnX2luX2ExLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTIsIHByaV9taTJzX3dzLCBOQSwgTkEsIE5BLCBxZHNzX3RyYWNlZGF0YV9iLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTMsIHByaV9taTJzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDk0LCB3c2FfaW8sIHByaV9taTJzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTUsIHdzYV9pbywgcHJpX21pMnMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCg5NiwgYmxzcF9zcGk4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDk3LCBibHNwX3NwaTgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTgsIGJsc3BfaTJjOCwgYmxzcF9zcGk4LCBnY2NfcGxsdGVzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoOTksIGJsc3BfaTJjOCwgYmxzcF9zcGk4LCBnY2NfcGxsdGVzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTAwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMDEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEwMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTAzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMDQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEwNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEwOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTA5LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDExMSwgTkEsIE5BLCBuYXZfcHBzX2luX2EsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDExMiwgTkEsIHBhX2luZGljYXRvciwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDExMywgTkEsIG5hdl9wcHNfaW5fYiwgbmF2X3BwcywgbW9kZW1fdHN5bmMsIG5hdl90c3luYywgTkEsCisJCSBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMTQsIE5BLCBzc2JpX3d0cjEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMTUsIE5BLCBnc20xX3R4LCBOQSwgZGFjX2NhbGliMTgsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTE2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMTcsIGdzbTBfdHgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTE4LCBOQSwgZWJpX2NkYywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDExOSwgTkEsIGViaV9jZGMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjAsIE5BLCBhdGVzdF9jaGFyLCBlYmlfY2RjLCBOQSwgYXRlc3RfdHNlbnMsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjEsIE5BLCBOQSwgTkEsIGJpbWNfZHRlMSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjIsIE5BLCBOQSwgTkEsIGJpbWNfZHRlMSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjMsIE5BLCBzc2JpX3d0cjEsIGViaV9jZGMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEyNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTI1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEyNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTI4LCBjYW1fbWNsaywgTkEsIGRhY19jYWxpYjIwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMjksIGRkcl9iaXN0LCBOQSwgZGFjX2NhbGliMjEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEzMCwgZGRyX2Jpc3QsIE5BLCBkYWNfY2FsaWIyMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTMxLCBkZHJfYmlzdCwgTkEsIGRhY19jYWxpYjIzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMzIsIGRkcl9iaXN0LCBOQSwgZGFjX2NhbGliMjQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEzMywgTkEsIGRhY19jYWxpYjI1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTM0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlQSU5HUk9VUCgxMzUsIHNlY19taTJzLCBibHNwX3NwaTcsIGJsc3BfaTJjNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTM2LCBzZWNfbWkycywgYmxzcF9zcGk3LCBibHNwX2kyYzcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEzNywgc2VjX21pMnMsIGJsc3Bfc3BpNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEzOCwgc2VjX21pMnMsIGJsc3Bfc3BpNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDEzOSwgdHNlbnNfbWF4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVBJTkdST1VQKDE0MCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJUElOR1JPVVAoMTQxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlTRENfUURTRF9QSU5HUk9VUChzZGMxX2NsaywgMHgxMGEwMDAsIDEzLCA2KSwKKwlTRENfUURTRF9QSU5HUk9VUChzZGMxX2NtZCwgMHgxMGEwMDAsIDExLCAzKSwKKwlTRENfUURTRF9QSU5HUk9VUChzZGMxX2RhdGEsIDB4MTBhMDAwLCA5LCAwKSwKKwlTRENfUURTRF9QSU5HUk9VUChzZGMxX3JjbGssIDB4MTBhMDAwLCAxNSwgMCksCisJU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9jbGssIDB4MTA5MDAwLCAxNCwgNiksCisJU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9jbWQsIDB4MTA5MDAwLCAxMSwgMyksCisJU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9kYXRhLCAweDEwOTAwMCwgOSwgMCksCisJU0RDX1FEU0RfUElOR1JPVVAocWRzZF9jbGssIDB4MTljMDAwLCAzLCAwKSwKKwlTRENfUURTRF9QSU5HUk9VUChxZHNkX2NtZCwgMHgxOWMwMDAsIDgsIDUpLAorCVNEQ19RRFNEX1BJTkdST1VQKHFkc2RfZGF0YTAsIDB4MTljMDAwLCAxMywgMTApLAorCVNEQ19RRFNEX1BJTkdST1VQKHFkc2RfZGF0YTEsIDB4MTljMDAwLCAxOCwgMTUpLAorCVNEQ19RRFNEX1BJTkdST1VQKHFkc2RfZGF0YTIsIDB4MTljMDAwLCAyMywgMjApLAorCVNEQ19RRFNEX1BJTkdST1VQKHFkc2RfZGF0YTMsIDB4MTljMDAwLCAyOCwgMjUpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fcGluY3RybF9zb2NfZGF0YSBtc204OTUzX3BpbmN0cmwgPSB7CisJLnBpbnMgPSBtc204OTUzX3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRShtc204OTUzX3BpbnMpLAorCS5mdW5jdGlvbnMgPSBtc204OTUzX2Z1bmN0aW9ucywKKwkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUobXNtODk1M19mdW5jdGlvbnMpLAorCS5ncm91cHMgPSBtc204OTUzX2dyb3VwcywKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUobXNtODk1M19ncm91cHMpLAorCS5uZ3Bpb3MgPSAxNDIsCit9OworCitzdGF0aWMgaW50IG1zbTg5NTNfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtc21fcGluY3RybF9wcm9iZShwZGV2LCAmbXNtODk1M19waW5jdHJsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtODk1M19waW5jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5NTMtcGluY3RybCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtODk1M19waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc204OTUzLXBpbmN0cmwiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXNtODk1M19waW5jdHJsX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gbXNtODk1M19waW5jdHJsX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fcGluY3RybF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc204OTUzX3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbTg5NTNfcGluY3RybF9kcml2ZXIpOworfQorYXJjaF9pbml0Y2FsbChtc204OTUzX3BpbmN0cmxfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc204OTUzX3BpbmN0cmxfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc204OTUzX3BpbmN0cmxfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1zbTg5NTNfcGluY3RybF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRVEkgbXNtODk1MyBwaW5jdHJsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtODk1M19waW5jdHJsX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc2RtNjcwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkbTY3MC5jCmluZGV4IGI0NTRjYzQ0Mi4uODc0OTY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zZG02NzAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkbTY3MC5jCkBAIC0yNSw4ICsyNSwxMyBAQAogCQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoZm5hbWUjI19ncm91cHMpLAlcCiAJfQogCisjZGVmaW5lIE5PUlRICTB4MDA1MDAwMDAKKyNkZWZpbmUgU09VVEgJMHgwMDkwMDAwMAorI2RlZmluZSBXRVNUCTB4MDAxMDAwMDAKKworI2RlZmluZSBEVU1NWQkweDAKICNkZWZpbmUgUkVHX1NJWkUgMHgxMDAwCi0jZGVmaW5lIFBJTkdST1VQKGlkLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgsIGY5KQlcCisjZGVmaW5lIFBJTkdST1VQKGlkLCBiYXNlLCBmMSwgZjIsIGYzLCBmNCwgZjUsIGY2LCBmNywgZjgsIGY5KQlcCiAJewkJCQkJCVwKIAkJLm5hbWUgPSAiZ3BpbyIgI2lkLAkJCVwKIAkJLnBpbnMgPSBncGlvIyNpZCMjX3BpbnMsCQlcCkBAIC00NCwxMSArNDksMTEgQEAKIAkJCW1zbV9tdXhfIyNmOQkJCVwKIAkJfSwJCQkJCVwKIAkJLm5mdW5jcyA9IDEwLAkJCQlcCi0JCS5jdGxfcmVnID0gUkVHX1NJWkUgKiBpZCwJCVwKLQkJLmlvX3JlZyA9IDB4NCArIFJFR19TSVpFICogaWQsCQlcCi0JCS5pbnRyX2NmZ19yZWcgPSAweDggKyBSRUdfU0laRSAqIGlkLAlcCi0JCS5pbnRyX3N0YXR1c19yZWcgPSAweGMgKyBSRUdfU0laRSAqIGlkLAlcCi0JCS5pbnRyX3RhcmdldF9yZWcgPSAweDggKyBSRUdfU0laRSAqIGlkLAlcCisJCS5jdGxfcmVnID0gYmFzZSArIFJFR19TSVpFICogaWQsCQlcCisJCS5pb19yZWcgPSBiYXNlICsgMHg0ICsgUkVHX1NJWkUgKiBpZCwJCVwKKwkJLmludHJfY2ZnX3JlZyA9IGJhc2UgKyAweDggKyBSRUdfU0laRSAqIGlkLAlcCisJCS5pbnRyX3N0YXR1c19yZWcgPSBiYXNlICsgMHhjICsgUkVHX1NJWkUgKiBpZCwJXAorCQkuaW50cl90YXJnZXRfcmVnID0gYmFzZSArIDB4OCArIFJFR19TSVpFICogaWQsCVwKIAkJLm11eF9iaXQgPSAyLAkJCVwKIAkJLnB1bGxfYml0ID0gMCwJCQlcCiAJCS5kcnZfYml0ID0gNiwJCQlcCkBAIC0xMTQsMTAgKzExOSw2IEBACiAJCS5pbnRyX2RldGVjdGlvbl9iaXQgPSAtMSwJCVwKIAkJLmludHJfZGV0ZWN0aW9uX3dpZHRoID0gLTEsCQlcCiAJfQotCi1zdGF0aWMgY29uc3QgdTMyIHNkbTY3MF90aWxlX29mZnNldHNbXSA9IHsweDEwMDAwMCwgMHg1MDAwMDAsIDB4OTAwMDAwfTsKLXN0YXRpYyB1MzIgc2RtNjcwX3Bpbl9iYXNlWzE1MF07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBzZG02NzBfcGluc1tdID0gewogCVBJTkNUUkxfUElOKDAsICJHUElPXzAiKSwKIAlQSU5DVFJMX1BJTigxLCAiR1BJT18xIiksCkBAIC0xMzMyLDI1OSArMTMzMywyNTggQEAKICAqIENsaWVudHMgd291bGQgbm90IGJlIGFibGUgdG8gcmVxdWVzdCB0aGVzZSBkdW1teSBwaW4gZ3JvdXBzLgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9waW5ncm91cCBzZG02NzBfZ3JvdXBzW10gPSB7Ci0JWzBdID0gUElOR1JPVVAoMCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMV0gPSBQSU5HUk9VUCgxLCBxdXAwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsyXSA9IFBJTkdST1VQKDIsIHF1cDAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzNdID0gUElOR1JPVVAoMywgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNF0gPSBQSU5HUk9VUCg0LCBxdXA5LCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs1XSA9IFBJTkdST1VQKDUsIHF1cDksIHFkc3NfY3RpLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzZdID0gUElOR1JPVVAoNiwgcXVwOSwgTkEsIGRkcl9weGkwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbN10gPSBQSU5HUk9VUCg3LCBxdXA5LCBkZHJfYmlzdCwgTkEsIGF0ZXN0X3RzZW5zMiwKKwlbMF0gPSBQSU5HUk9VUCgwLCBTT1VUSCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMV0gPSBQSU5HUk9VUCgxLCBTT1VUSCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMl0gPSBQSU5HUk9VUCgyLCBTT1VUSCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbM10gPSBQSU5HUk9VUCgzLCBTT1VUSCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNF0gPSBQSU5HUk9VUCg0LCBOT1JUSCwgcXVwOSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNV0gPSBQSU5HUk9VUCg1LCBOT1JUSCwgcXVwOSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNl0gPSBQSU5HUk9VUCg2LCBOT1JUSCwgcXVwOSwgTkEsIGRkcl9weGkwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbN10gPSBQSU5HUk9VUCg3LCBOT1JUSCwgcXVwOSwgZGRyX2Jpc3QsIE5BLCBhdGVzdF90c2VuczIsCiAJCSAgICAgICB2c2Vuc2VfdHJpZ2dlciwgYXRlc3RfdXNiMSwgZGRyX3B4aTAsIE5BLCBOQSksCi0JWzhdID0gUElOR1JPVVAoOCwgcXVwX2w0LCBHUF9QRE0xLCBkZHJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVs4XSA9IFBJTkdST1VQKDgsIFdFU1QsIHF1cF9sNCwgR1BfUERNMSwgZGRyX2Jpc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJICAgICAgIE5BKSwKLQlbOV0gPSBQSU5HUk9VUCg5LCBxdXBfbDUsIGRkcl9iaXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEwXSA9IFBJTkdST1VQKDEwLCBtZHBfdnN5bmMsIHF1cF9sNiwgZGRyX2Jpc3QsIHdsYW4yX2FkYzEsCisJWzldID0gUElOR1JPVVAoOSwgV0VTVCwgcXVwX2w1LCBkZHJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMF0gPSBQSU5HUk9VUCgxMCwgTk9SVEgsIG1kcF92c3luYywgcXVwX2w2LCBkZHJfYmlzdCwgd2xhbjJfYWRjMSwKIAkJCWF0ZXN0X3VzYjExLCBkZHJfcHhpMiwgTkEsIE5BLCBOQSksCi0JWzExXSA9IFBJTkdST1VQKDExLCBtZHBfdnN5bmMsIGVkcF9sY2QsIGRiZ19vdXQsIHdsYW4yX2FkYzAsCisJWzExXSA9IFBJTkdST1VQKDExLCBOT1JUSCwgbWRwX3ZzeW5jLCBlZHBfbGNkLCBkYmdfb3V0LCB3bGFuMl9hZGMwLAogCQkJYXRlc3RfdXNiMTAsIGRkcl9weGkyLCBOQSwgTkEsIE5BKSwKLQlbMTJdID0gUElOR1JPVVAoMTIsIG1kcF92c3luYywgbV92b2MsIHRzaWYxX3N5bmMsIGRkcl9weGkzLCBOQSwKKwlbMTJdID0gUElOR1JPVVAoMTIsIFNPVVRILCBtZHBfdnN5bmMsIG1fdm9jLCB0c2lmMV9zeW5jLCBkZHJfcHhpMywgTkEsCiAJCQlOQSwgTkEsIE5BLCBOQSksCi0JWzEzXSA9IFBJTkdST1VQKDEzLCBjYW1fbWNsaywgcGxsX2J5cGFzc25sLCBxZHNzX2dwaW8wLCBkZHJfcHhpMywKKwlbMTNdID0gUElOR1JPVVAoMTMsIFdFU1QsIGNhbV9tY2xrLCBwbGxfYnlwYXNzbmwsIHFkc3NfZ3BpbzAsIGRkcl9weGkzLAogCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTRdID0gUElOR1JPVVAoMTQsIGNhbV9tY2xrLCBwbGxfcmVzZXQsIHFkc3NfZ3BpbzEsIE5BLCBOQSwgTkEsCisJWzE0XSA9IFBJTkdST1VQKDE0LCBXRVNULCBjYW1fbWNsaywgcGxsX3Jlc2V0LCBxZHNzX2dwaW8xLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BLCBOQSksCi0JWzE1XSA9IFBJTkdST1VQKDE1LCBjYW1fbWNsaywgcWRzc19ncGlvMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTVdID0gUElOR1JPVVAoMTUsIFdFU1QsIGNhbV9tY2xrLCBxZHNzX2dwaW8yLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEpLAotCVsxNl0gPSBQSU5HUk9VUCgxNiwgY2FtX21jbGssIHFkc3NfZ3BpbzMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzE2XSA9IFBJTkdST1VQKDE2LCBXRVNULCBjYW1fbWNsaywgcWRzc19ncGlvMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbMTddID0gUElOR1JPVVAoMTcsIGNjaV9pMmMsIHF1cDEsIHFkc3NfZ3BpbzQsIE5BLCBOQSwgTkEsIE5BLAorCVsxN10gPSBQSU5HUk9VUCgxNywgV0VTVCwgY2NpX2kyYywgcXVwMSwgcWRzc19ncGlvNCwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVsxOF0gPSBQSU5HUk9VUCgxOCwgY2NpX2kyYywgcXVwMSwgTkEsIHFkc3NfZ3BpbzUsIE5BLCBOQSwgTkEsCisJWzE4XSA9IFBJTkdST1VQKDE4LCBXRVNULCBjY2lfaTJjLCBxdXAxLCBOQSwgcWRzc19ncGlvNSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSksCi0JWzE5XSA9IFBJTkdST1VQKDE5LCBjY2lfaTJjLCBxdXAxLCBOQSwgcWRzc19ncGlvNiwgTkEsIE5BLCBOQSwKKwlbMTldID0gUElOR1JPVVAoMTksIFdFU1QsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbMjBdID0gUElOR1JPVVAoMjAsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW83LCBOQSwgTkEsIE5BLAorCVsyMF0gPSBQSU5HUk9VUCgyMCwgV0VTVCwgY2NpX2kyYywgcXVwMSwgTkEsIHFkc3NfZ3BpbzcsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVsyMV0gPSBQSU5HUk9VUCgyMSwgY2NpX3RpbWVyMCwgZ2NjX2dwMiwgcWRzc19ncGlvOCwgTkEsIE5BLCBOQSwKKwlbMjFdID0gUElOR1JPVVAoMjEsIFdFU1QsIGNjaV90aW1lcjAsIGdjY19ncDIsIHFkc3NfZ3BpbzgsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEsIE5BKSwKLQlbMjJdID0gUElOR1JPVVAoMjIsIGNjaV90aW1lcjEsIGdjY19ncDMsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKKwlbMjJdID0gUElOR1JPVVAoMjIsIFdFU1QsIGNjaV90aW1lcjEsIGdjY19ncDMsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEpLAotCVsyM10gPSBQSU5HUk9VUCgyMywgY2NpX3RpbWVyMiwgcWRzc19ncGlvOSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsyM10gPSBQSU5HUk9VUCgyMywgV0VTVCwgY2NpX3RpbWVyMiwgcWRzc19ncGlvOSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbMjRdID0gUElOR1JPVVAoMjQsIGNjaV90aW1lcjMsIGNjaV9hc3luYywgcWRzc19ncGlvMTAsIE5BLCBOQSwKKwlbMjRdID0gUElOR1JPVVAoMjQsIFdFU1QsIGNjaV90aW1lcjMsIGNjaV9hc3luYywgcWRzc19ncGlvMTAsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbMjVdID0gUElOR1JPVVAoMjUsIGNjaV90aW1lcjQsIGNjaV9hc3luYywgcWRzc19ncGlvMTEsIE5BLCBOQSwKKwlbMjVdID0gUElOR1JPVVAoMjUsIFdFU1QsIGNjaV90aW1lcjQsIGNjaV9hc3luYywgcWRzc19ncGlvMTEsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbMjZdID0gUElOR1JPVVAoMjYsIGNjaV9hc3luYywgcWRzc19ncGlvMTIsIEpJVFRFUl9CSVNULCBOQSwgTkEsCisJWzI2XSA9IFBJTkdST1VQKDI2LCBXRVNULCBjY2lfYXN5bmMsIHFkc3NfZ3BpbzEyLCBKSVRURVJfQklTVCwgTkEsIE5BLAogCQkJTkEsIE5BLCBOQSwgTkEpLAotCVsyN10gPSBQSU5HUk9VUCgyNywgcXVwMiwgcWRzc19ncGlvMTMsIFBMTF9CSVNULCBOQSwgTkEsIE5BLCBOQSwKKwlbMjddID0gUElOR1JPVVAoMjcsIFdFU1QsIHF1cDIsIHFkc3NfZ3BpbzEzLCBQTExfQklTVCwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVsyOF0gPSBQSU5HUk9VUCgyOCwgcXVwMiwgcWRzc19ncGlvMTQsIEFHRVJBX1BMTCwgTkEsIE5BLCBOQSwgTkEsCisJWzI4XSA9IFBJTkdST1VQKDI4LCBXRVNULCBxdXAyLCBxZHNzX2dwaW8xNCwgQUdFUkFfUExMLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSksCi0JWzI5XSA9IFBJTkdST1VQKDI5LCBxdXAyLCBOQSwgcGhhc2VfZmxhZzEsIHFkc3NfZ3BpbzE1LAorCVsyOV0gPSBQSU5HUk9VUCgyOSwgV0VTVCwgcXVwMiwgTkEsIHBoYXNlX2ZsYWcxLCBxZHNzX2dwaW8xNSwKIAkJCWF0ZXN0X3RzZW5zLCBOQSwgTkEsIE5BLCBOQSksCi0JWzMwXSA9IFBJTkdST1VQKDMwLCBxdXAyLCBwaGFzZV9mbGFnMiwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwKKwlbMzBdID0gUElOR1JPVVAoMzAsIFdFU1QsIHF1cDIsIHBoYXNlX2ZsYWcyLCBxZHNzX2dwaW8sIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbMzFdID0gUElOR1JPVVAoMzEsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVszMl0gPSBQSU5HUk9VUCgzMiwgcXVwMTEsIHF1cDE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzMzXSA9IFBJTkdST1VQKDMzLCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMzRdID0gUElOR1JPVVAoMzQsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVszNV0gPSBQSU5HUk9VUCgzNSwgcGNpX2UwLCBRVVBfTDQsIEpJVFRFUl9CSVNULCBOQSwgTkEsIE5BLCBOQSwKKwlbMzFdID0gUElOR1JPVVAoMzEsIFdFU1QsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszMl0gPSBQSU5HUk9VUCgzMiwgV0VTVCwgcXVwMTEsIHF1cDE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzMzXSA9IFBJTkdST1VQKDMzLCBXRVNULCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMzRdID0gUElOR1JPVVAoMzQsIFdFU1QsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszNV0gPSBQSU5HUk9VUCgzNSwgTk9SVEgsIHBjaV9lMCwgUVVQX0w0LCBKSVRURVJfQklTVCwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVszNl0gPSBQSU5HUk9VUCgzNiwgcGNpX2UwLCBRVVBfTDUsIFBMTF9CSVNULCBOQSwgTkEsIE5BLCBOQSwKKwlbMzZdID0gUElOR1JPVVAoMzYsIE5PUlRILCBwY2lfZTAsIFFVUF9MNSwgUExMX0JJU1QsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbMzddID0gUElOR1JPVVAoMzcsIFFVUF9MNiwgQUdFUkFfUExMLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVszN10gPSBQSU5HUk9VUCgzNywgTk9SVEgsIFFVUF9MNiwgQUdFUkFfUExMLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEpLAotCVszOF0gPSBQSU5HUk9VUCgzOCwgdXNiX3BoeSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMzldID0gUElOR1JPVVAoMzksIGxwYXNzX3NsaW1idXMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVszOF0gPSBQSU5HUk9VUCgzOCwgTk9SVEgsIHVzYl9waHksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzM5XSA9IFBJTkdST1VQKDM5LCBOT1JUSCwgbHBhc3Nfc2xpbWJ1cywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSksCi0JWzQwXSA9IFBJTkdST1VQKDQwLCBzZF93cml0ZSwgdHNpZjFfZXJyb3IsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbNDBdID0gUElOR1JPVVAoNDAsIE5PUlRILCBzZF93cml0ZSwgdHNpZjFfZXJyb3IsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSksCi0JWzQxXSA9IFBJTkdST1VQKDQxLCBxdXAzLCBOQSwgcWRzc19ncGlvNiwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVs0MV0gPSBQSU5HUk9VUCg0MSwgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSksCi0JWzQyXSA9IFBJTkdST1VQKDQyLCBxdXAzLCBOQSwgcWRzc19ncGlvNywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVs0Ml0gPSBQSU5HUk9VUCg0MiwgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW83LCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSksCi0JWzQzXSA9IFBJTkdST1VQKDQzLCBxdXAzLCBOQSwgcWRzc19ncGlvMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbNDNdID0gUElOR1JPVVAoNDMsIFNPVVRILCBxdXAzLCBOQSwgcWRzc19ncGlvMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbNDRdID0gUElOR1JPVVAoNDQsIHF1cDMsIE5BLCBxZHNzX2dwaW8xNSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVs0NF0gPSBQSU5HUk9VUCg0NCwgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW8xNSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEpLAotCVs0NV0gPSBQSU5HUk9VUCg0NSwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNDZdID0gUElOR1JPVVAoNDYsIHF1cDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzQ3XSA9IFBJTkdST1VQKDQ3LCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs0OF0gPSBQSU5HUk9VUCg0OCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNDldID0gUElOR1JPVVAoNDksIHF1cDEyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs1MF0gPSBQSU5HUk9VUCg1MCwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzUxXSA9IFBJTkdST1VQKDUxLCBxdXAxMiwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNTJdID0gUElOR1JPVVAoNTIsIHF1cDEyLCBwaGFzZV9mbGFnMTYsIHFkc3NfY3RpLCBOQSwgTkEsIE5BLAorCVs0NV0gPSBQSU5HUk9VUCg0NSwgU09VVEgsIHF1cDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ2XSA9IFBJTkdST1VQKDQ2LCBTT1VUSCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNDddID0gUElOR1JPVVAoNDcsIFNPVVRILCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs0OF0gPSBQSU5HUk9VUCg0OCwgU09VVEgsIHF1cDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ5XSA9IFBJTkdST1VQKDQ5LCBOT1JUSCwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzUwXSA9IFBJTkdST1VQKDUwLCBOT1JUSCwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzUxXSA9IFBJTkdST1VQKDUxLCBOT1JUSCwgcXVwMTIsIHFkc3NfY3RpLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzUyXSA9IFBJTkdST1VQKDUyLCBOT1JUSCwgcXVwMTIsIHBoYXNlX2ZsYWcxNiwgcWRzc19jdGksIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEsIE5BKSwKLQlbNTNdID0gUElOR1JPVVAoNTMsIHF1cDEwLCBwaGFzZV9mbGFnMTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzUzXSA9IFBJTkdST1VQKDUzLCBOT1JUSCwgcXVwMTAsIHBoYXNlX2ZsYWcxMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbNTRdID0gUElOR1JPVVAoNTQsIHF1cDEwLCBHUF9QRE0wLCBwaGFzZV9mbGFnMTIsIE5BLAorCVs1NF0gPSBQSU5HUk9VUCg1NCwgTk9SVEgsIHF1cDEwLCBHUF9QRE0wLCBwaGFzZV9mbGFnMTIsIE5BLAogCQkJd2xhbjFfYWRjMSwgYXRlc3RfdXNiMTMsIGRkcl9weGkxLCBOQSwgTkEpLAotCVs1NV0gPSBQSU5HUk9VUCg1NSwgcXVwMTAsIHBoYXNlX2ZsYWcxMywgTkEsIHdsYW4xX2FkYzAsCisJWzU1XSA9IFBJTkdST1VQKDU1LCBOT1JUSCwgcXVwMTAsIHBoYXNlX2ZsYWcxMywgTkEsIHdsYW4xX2FkYzAsCiAJCQlhdGVzdF91c2IxMiwgZGRyX3B4aTEsIE5BLCBOQSwgTkEpLAotCVs1Nl0gPSBQSU5HUk9VUCg1NiwgcXVwMTAsIHBoYXNlX2ZsYWcxNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbNTZdID0gUElOR1JPVVAoNTYsIE5PUlRILCBxdXAxMCwgcGhhc2VfZmxhZzE3LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEpLAotCVs1N10gPSBQSU5HUk9VUCg1NywgcXVhX21pMnMsIGdjY19ncDEsIHBoYXNlX2ZsYWcxOCwgTkEsIE5BLCBOQSwKKwlbNTddID0gUElOR1JPVVAoNTcsIE5PUlRILCBxdWFfbWkycywgZ2NjX2dwMSwgcGhhc2VfZmxhZzE4LCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BLCBOQSksCi0JWzU4XSA9IFBJTkdST1VQKDU4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNTldID0gUElOR1JPVVAoNTksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs2MF0gPSBQSU5HUk9VUCg2MCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzYxXSA9IFBJTkdST1VQKDYxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNjJdID0gUElOR1JPVVAoNjIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs2M10gPSBQSU5HUk9VUCg2MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzY0XSA9IFBJTkdST1VQKDY0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNjVdID0gUElOR1JPVVAoNjUsIHByaV9taTJzLCBxdXA4LCB3c2FfY2xrLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzU4XSA9IFBJTkdST1VQKDU4LCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzU5XSA9IFBJTkdST1VQKDU5LCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYwXSA9IFBJTkdST1VQKDYwLCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYxXSA9IFBJTkdST1VQKDYxLCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYyXSA9IFBJTkdST1VQKDYyLCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYzXSA9IFBJTkdST1VQKDYzLCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzY0XSA9IFBJTkdST1VQKDY0LCBEVU1NWSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzY1XSA9IFBJTkdST1VQKDY1LCBOT1JUSCwgcHJpX21pMnMsIHF1cDgsIHdzYV9jbGssIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbNjZdID0gUElOR1JPVVAoNjYsIHByaV9taTJzX3dzLCBxdXA4LCB3c2FfZGF0YSwgR1BfUERNMSwgTkEsCisJWzY2XSA9IFBJTkdST1VQKDY2LCBOT1JUSCwgcHJpX21pMnNfd3MsIHF1cDgsIHdzYV9kYXRhLCBHUF9QRE0xLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbNjddID0gUElOR1JPVVAoNjcsIHByaV9taTJzLCBxdXA4LCBOQSwgYXRlc3RfdXNiMiwgTkEsIE5BLCBOQSwKKwlbNjddID0gUElOR1JPVVAoNjcsIE5PUlRILCBwcmlfbWkycywgcXVwOCwgTkEsIGF0ZXN0X3VzYjIsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVs2OF0gPSBQSU5HUk9VUCg2OCwgcHJpX21pMnMsIHF1cDgsIE5BLCBhdGVzdF91c2IyMywgTkEsIE5BLCBOQSwKKwlbNjhdID0gUElOR1JPVVAoNjgsIE5PUlRILCBwcmlfbWkycywgcXVwOCwgTkEsIGF0ZXN0X3VzYjIzLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbNjldID0gUElOR1JPVVAoNjksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs3MF0gPSBQSU5HUk9VUCg3MCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzcxXSA9IFBJTkdST1VQKDcxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNzJdID0gUElOR1JPVVAoNzIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs3M10gPSBQSU5HUk9VUCg3MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzc0XSA9IFBJTkdST1VQKDc0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNzVdID0gUElOR1JPVVAoNzUsIHRlcl9taTJzLCBwaGFzZV9mbGFnOCwgcWRzc19ncGlvOCwKKwlbNjldID0gUElOR1JPVVAoNjksIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzBdID0gUElOR1JPVVAoNzAsIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzFdID0gUElOR1JPVVAoNzEsIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzJdID0gUElOR1JPVVAoNzIsIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzNdID0gUElOR1JPVVAoNzMsIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzRdID0gUElOR1JPVVAoNzQsIERVTU1ZLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzVdID0gUElOR1JPVVAoNzUsIE5PUlRILCB0ZXJfbWkycywgcGhhc2VfZmxhZzgsIHFkc3NfZ3BpbzgsCiAJCQlhdGVzdF91c2IyMiwgUVVQX0w0LCBOQSwgTkEsIE5BLCBOQSksCi0JWzc2XSA9IFBJTkdST1VQKDc2LCB0ZXJfbWkycywgcGhhc2VfZmxhZzksIHFkc3NfZ3BpbzksCisJWzc2XSA9IFBJTkdST1VQKDc2LCBOT1JUSCwgdGVyX21pMnMsIHBoYXNlX2ZsYWc5LCBxZHNzX2dwaW85LAogCQkJYXRlc3RfdXNiMjEsIFFVUF9MNSwgTkEsIE5BLCBOQSwgTkEpLAotCVs3N10gPSBQSU5HUk9VUCg3NywgdGVyX21pMnMsIHBoYXNlX2ZsYWc0LCBxZHNzX2dwaW8xMCwKKwlbNzddID0gUElOR1JPVVAoNzcsIE5PUlRILCB0ZXJfbWkycywgcGhhc2VfZmxhZzQsIHFkc3NfZ3BpbzEwLAogCQkJYXRlc3RfdXNiMjAsIFFVUF9MNiwgTkEsIE5BLCBOQSwgTkEpLAotCVs3OF0gPSBQSU5HUk9VUCg3OCwgdGVyX21pMnMsIGdjY19ncDEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzc4XSA9IFBJTkdST1VQKDc4LCBOT1JUSCwgdGVyX21pMnMsIGdjY19ncDEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSksCi0JWzc5XSA9IFBJTkdST1VQKDc5LCBzZWNfbWkycywgR1BfUERNMiwgTkEsIHFkc3NfZ3BpbzExLCBOQSwgTkEsCisJWzc5XSA9IFBJTkdST1VQKDc5LCBOT1JUSCwgc2VjX21pMnMsIEdQX1BETTIsIE5BLCBxZHNzX2dwaW8xMSwgTkEsIE5BLAogCQkJTkEsIE5BLCBOQSksCi0JWzgwXSA9IFBJTkdST1VQKDgwLCBzZWNfbWkycywgTkEsIHFkc3NfZ3BpbzEyLCBOQSwgTkEsIE5BLCBOQSwKKwlbODBdID0gUElOR1JPVVAoODAsIE5PUlRILCBzZWNfbWkycywgTkEsIHFkc3NfZ3BpbzEyLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSksCi0JWzgxXSA9IFBJTkdST1VQKDgxLCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbODJdID0gUElOR1JPVVAoODIsIHNlY19taTJzLCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs4M10gPSBQSU5HUk9VUCg4Mywgc2VjX21pMnMsIHF1cDE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzg0XSA9IFBJTkdST1VQKDg0LCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbODVdID0gUElOR1JPVVAoODUsIHF1cDUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzg2XSA9IFBJTkdST1VQKDg2LCBxdXA1LCBjb3B5X2dwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzg3XSA9IFBJTkdST1VQKDg3LCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs4OF0gPSBQSU5HUk9VUCg4OCwgcXVwNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbODldID0gUElOR1JPVVAoODksIHRzaWYxX2NsaywgcXVwNCwgdGd1X2NoMywgcGhhc2VfZmxhZzEwLCBOQSwKKwlbODFdID0gUElOR1JPVVAoODEsIE5PUlRILCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODJdID0gUElOR1JPVVAoODIsIE5PUlRILCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODNdID0gUElOR1JPVVAoODMsIE5PUlRILCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODRdID0gUElOR1JPVVAoODQsIE5PUlRILCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODVdID0gUElOR1JPVVAoODUsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4Nl0gPSBQSU5HUk9VUCg4NiwgU09VVEgsIHF1cDUsIGNvcHlfZ3AsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODddID0gUElOR1JPVVAoODcsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4OF0gPSBQSU5HUk9VUCg4OCwgU09VVEgsIHF1cDUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzg5XSA9IFBJTkdST1VQKDg5LCBTT1VUSCwgdHNpZjFfY2xrLCBxdXA0LCB0Z3VfY2gzLCBwaGFzZV9mbGFnMTAsIE5BLAogCQkJTkEsIE5BLCBOQSwgTkEpLAotCVs5MF0gPSBQSU5HUk9VUCg5MCwgdHNpZjFfZW4sIG1kcF92c3luYzAsIHF1cDQsIG1kcF92c3luYzEsCisJWzkwXSA9IFBJTkdST1VQKDkwLCBTT1VUSCwgdHNpZjFfZW4sIG1kcF92c3luYzAsIHF1cDQsIG1kcF92c3luYzEsCiAJCQltZHBfdnN5bmMyLCBtZHBfdnN5bmMzLCB0Z3VfY2gwLCBwaGFzZV9mbGFnMCwgcWRzc19jdGkpLAotCVs5MV0gPSBQSU5HUk9VUCg5MSwgdHNpZjFfZGF0YSwgc2RjNF9jbWQsIHF1cDQsIHRndV9jaDEsIE5BLAorCVs5MV0gPSBQSU5HUk9VUCg5MSwgU09VVEgsIHRzaWYxX2RhdGEsIHNkYzRfY21kLCBxdXA0LCB0Z3VfY2gxLCBOQSwKIAkJCXFkc3NfY3RpLCBOQSwgTkEsIE5BKSwKLQlbOTJdID0gUElOR1JPVVAoOTIsIHRzaWYyX2Vycm9yLCBzZGM0MywgcXVwNCwgdmZyXzEsIHRndV9jaDIsCisJWzkyXSA9IFBJTkdST1VQKDkyLCBTT1VUSCwgdHNpZjJfZXJyb3IsIHNkYzQzLCBxdXA0LCB2ZnJfMSwgdGd1X2NoMiwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbOTNdID0gUElOR1JPVVAoOTMsIHRzaWYyX2Nsaywgc2RjNF9jbGssIHF1cDcsIE5BLCBxZHNzX2dwaW8xMywKKwlbOTNdID0gUElOR1JPVVAoOTMsIFNPVVRILCB0c2lmMl9jbGssIHNkYzRfY2xrLCBxdXA3LCBOQSwgcWRzc19ncGlvMTMsCiAJCQlOQSwgTkEsIE5BLCBOQSksCi0JWzk0XSA9IFBJTkdST1VQKDk0LCB0c2lmMl9lbiwgc2RjNDIsIHF1cDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbOTRdID0gUElOR1JPVVAoOTQsIFNPVVRILCB0c2lmMl9lbiwgc2RjNDIsIHF1cDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbOTVdID0gUElOR1JPVVAoOTUsIHRzaWYyX2RhdGEsIHNkYzQxLCBxdXA3LCBHUF9QRE0wLCBOQSwgTkEsCisJWzk1XSA9IFBJTkdST1VQKDk1LCBTT1VUSCwgdHNpZjJfZGF0YSwgc2RjNDEsIHF1cDcsIEdQX1BETTAsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEpLAotCVs5Nl0gPSBQSU5HUk9VUCg5NiwgdHNpZjJfc3luYywgc2RjNDAsIHF1cDcsIHBoYXNlX2ZsYWczLCBOQSwKKwlbOTZdID0gUElOR1JPVVAoOTYsIFNPVVRILCB0c2lmMl9zeW5jLCBzZGM0MCwgcXVwNywgcGhhc2VfZmxhZzMsIE5BLAogCQkJTkEsIE5BLCBOQSwgTkEpLAotCVs5N10gPSBQSU5HUk9VUCg5NywgTkEsIE5BLCBtZHBfdnN5bmMsIGxkb19lbiwgTkEsIE5BLCBOQSwgTkEsCisJWzk3XSA9IFBJTkdST1VQKDk3LCBXRVNULCBOQSwgTkEsIG1kcF92c3luYywgbGRvX2VuLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BKSwKLQlbOThdID0gUElOR1JPVVAoOTgsIE5BLCBtZHBfdnN5bmMsIGxkb191cGRhdGUsIE5BLCBOQSwgTkEsIE5BLAorCVs5OF0gPSBQSU5HUk9VUCg5OCwgV0VTVCwgTkEsIG1kcF92c3luYywgbGRvX3VwZGF0ZSwgTkEsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEpLAotCVs5OV0gPSBQSU5HUk9VUCg5OSwgcGhhc2VfZmxhZzE0LCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbOTldID0gUElOR1JPVVAoOTksIE5PUlRILCBwaGFzZV9mbGFnMTQsIHBybmdfcm9zYywgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BKSwKLQlbMTAwXSA9IFBJTkdST1VQKDEwMCwgcGhhc2VfZmxhZzE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTAwXSA9IFBJTkdST1VQKDEwMCwgV0VTVCwgcGhhc2VfZmxhZzE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSksCi0JWzEwMV0gPSBQSU5HUk9VUCgxMDEsIE5BLCBwaGFzZV9mbGFnNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTAxXSA9IFBJTkdST1VQKDEwMSwgV0VTVCwgTkEsIHBoYXNlX2ZsYWc1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTAyXSA9IFBJTkdST1VQKDEwMiwgcGNpX2UxLCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzEwMl0gPSBQSU5HUk9VUCgxMDIsIFdFU1QsIHBjaV9lMSwgcHJuZ19yb3NjLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTAzXSA9IFBJTkdST1VQKDEwMywgcGNpX2UxLCBDT1BZX1BIQVNFLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsxMDNdID0gUElOR1JPVVAoMTAzLCBXRVNULCBwY2lfZTEsIENPUFlfUEhBU0UsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMDRdID0gUElOR1JPVVAoMTA0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTA1XSA9IFBJTkdST1VQKDEwNSwgdWltMl9kYXRhLCBxdXAxMywgcXVwX2w0LCBOQSwgTkEsIE5BLCBOQSwKKwlbMTA0XSA9IFBJTkdST1VQKDEwNCwgRFVNTVksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMDVdID0gUElOR1JPVVAoMTA1LCBOT1JUSCwgdWltMl9kYXRhLCBxdXAxMywgcXVwX2w0LCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEpLAotCVsxMDZdID0gUElOR1JPVVAoMTA2LCB1aW0yX2NsaywgcXVwMTMsIHF1cF9sNSwgTkEsIE5BLCBOQSwgTkEsCisJWzEwNl0gPSBQSU5HUk9VUCgxMDYsIE5PUlRILCB1aW0yX2NsaywgcXVwMTMsIHF1cF9sNSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEsIE5BKSwKLQlbMTA3XSA9IFBJTkdST1VQKDEwNywgdWltMl9yZXNldCwgcXVwMTMsIHF1cF9sNiwgTkEsIE5BLCBOQSwgTkEsCisJWzEwN10gPSBQSU5HUk9VUCgxMDcsIE5PUlRILCB1aW0yX3Jlc2V0LCBxdXAxMywgcXVwX2w2LCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEpLAotCVsxMDhdID0gUElOR1JPVVAoMTA4LCB1aW0yX3ByZXNlbnQsIHF1cDEzLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzEwOF0gPSBQSU5HUk9VUCgxMDgsIE5PUlRILCB1aW0yX3ByZXNlbnQsIHF1cDEzLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEsIE5BKSwKLQlbMTA5XSA9IFBJTkdST1VQKDEwOSwgdWltMV9kYXRhLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMTBdID0gUElOR1JPVVAoMTEwLCB1aW0xX2NsaywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTExXSA9IFBJTkdST1VQKDExMSwgdWltMV9yZXNldCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzEwOV0gPSBQSU5HUk9VUCgxMDksIE5PUlRILCB1aW0xX2RhdGEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzExMF0gPSBQSU5HUk9VUCgxMTAsIE5PUlRILCB1aW0xX2NsaywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTExXSA9IFBJTkdST1VQKDExMSwgTk9SVEgsIHVpbTFfcmVzZXQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTEyXSA9IFBJTkdST1VQKDExMiwgdWltMV9wcmVzZW50LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTEyXSA9IFBJTkdST1VQKDExMiwgTk9SVEgsIHVpbTFfcHJlc2VudCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMTNdID0gUElOR1JPVVAoMTEzLCB1aW1fYmF0dCwgZWRwX2hvdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTEzXSA9IFBJTkdST1VQKDExMywgTk9SVEgsIHVpbV9iYXR0LCBlZHBfaG90LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTE0XSA9IFBJTkdST1VQKDExNCwgTkEsIE5BVl9QUFMsIE5BVl9QUFMsIEdQU19UWCwgTkEsIE5BLCBOQSwKKwlbMTE0XSA9IFBJTkdST1VQKDExNCwgV0VTVCwgTkEsIE5BVl9QUFMsIE5BVl9QUFMsIEdQU19UWCwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEpLAotCVsxMTVdID0gUElOR1JPVVAoMTE1LCBOQSwgTkFWX1BQUywgTkFWX1BQUywgR1BTX1RYLCBOQSwgTkEsIE5BLAorCVsxMTVdID0gUElOR1JPVVAoMTE1LCBXRVNULCBOQSwgTkFWX1BQUywgTkFWX1BQUywgR1BTX1RYLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSksCi0JWzExNl0gPSBQSU5HUk9VUCgxMTYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMTddID0gUElOR1JPVVAoMTE3LCBOQSwgcWRzc19ncGlvMCwgYXRlc3RfY2hhciwgTkEsIE5BLCBOQSwKKwlbMTE2XSA9IFBJTkdST1VQKDExNiwgU09VVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMTddID0gUElOR1JPVVAoMTE3LCBOT1JUSCwgTkEsIHFkc3NfZ3BpbzAsIGF0ZXN0X2NoYXIsIE5BLCBOQSwgTkEsCiAJCQkgTkEsIE5BLCBOQSksCi0JWzExOF0gPSBQSU5HUk9VUCgxMTgsIGFkc3BfZXh0LCBOQSwgcWRzc19ncGlvMSwgYXRlc3RfY2hhcjMsIE5BLAorCVsxMThdID0gUElOR1JPVVAoMTE4LCBOT1JUSCwgYWRzcF9leHQsIE5BLCBxZHNzX2dwaW8xLCBhdGVzdF9jaGFyMywgTkEsCiAJCQkgTkEsIE5BLCBOQSwgTkEpLAotCVsxMTldID0gUElOR1JPVVAoMTE5LCBOQSwgcWRzc19ncGlvMiwgYXRlc3RfY2hhcjIsIE5BLCBOQSwgTkEsCisJWzExOV0gPSBQSU5HUk9VUCgxMTksIE5PUlRILCBOQSwgcWRzc19ncGlvMiwgYXRlc3RfY2hhcjIsIE5BLCBOQSwgTkEsCiAJCQkgTkEsIE5BLCBOQSksCi0JWzEyMF0gPSBQSU5HUk9VUCgxMjAsIE5BLCBxZHNzX2dwaW8zLCBhdGVzdF9jaGFyMSwgTkEsIE5BLCBOQSwKKwlbMTIwXSA9IFBJTkdST1VQKDEyMCwgTk9SVEgsIE5BLCBxZHNzX2dwaW8zLCBhdGVzdF9jaGFyMSwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEsIE5BKSwKLQlbMTIxXSA9IFBJTkdST1VQKDEyMSwgTkEsIHFkc3NfZ3BpbzQsIGF0ZXN0X2NoYXIwLCBOQSwgTkEsIE5BLAorCVsxMjFdID0gUElOR1JPVVAoMTIxLCBOT1JUSCwgTkEsIHFkc3NfZ3BpbzQsIGF0ZXN0X2NoYXIwLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSwgTkEpLAotCVsxMjJdID0gUElOR1JPVVAoMTIyLCBOQSwgcWRzc19ncGlvNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTIyXSA9IFBJTkdST1VQKDEyMiwgTk9SVEgsIE5BLCBxZHNzX2dwaW81LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTIzXSA9IFBJTkdST1VQKDEyMywgcXVwX2w0LCBOQSwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzEyM10gPSBQSU5HUk9VUCgxMjMsIE5PUlRILCBxdXBfbDQsIE5BLCBxZHNzX2dwaW8sIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSksCi0JWzEyNF0gPSBQSU5HUk9VUCgxMjQsIHF1cF9sNSwgTkEsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsxMjRdID0gUElOR1JPVVAoMTI0LCBOT1JUSCwgcXVwX2w1LCBOQSwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMjVdID0gUElOR1JPVVAoMTI1LCBxdXBfbDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEyNl0gPSBQSU5HUk9VUCgxMjYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMjddID0gUElOR1JPVVAoMTI3LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTI4XSA9IFBJTkdST1VQKDEyOCwgTkFWX1BQUywgTkFWX1BQUywgR1BTX1RYLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTI1XSA9IFBJTkdST1VQKDEyNSwgTk9SVEgsIHF1cF9sNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTI2XSA9IFBJTkdST1VQKDEyNiwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMjddID0gUElOR1JPVVAoMTI3LCBXRVNULCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTI4XSA9IFBJTkdST1VQKDEyOCwgV0VTVCwgTkFWX1BQUywgTkFWX1BQUywgR1BTX1RYLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEpLAotCVsxMjldID0gUElOR1JPVVAoMTI5LCBOQVZfUFBTLCBOQVZfUFBTLCBHUFNfVFgsIE5BLCBOQSwgTkEsIE5BLAorCVsxMjldID0gUElOR1JPVVAoMTI5LCBXRVNULCBOQVZfUFBTLCBOQVZfUFBTLCBHUFNfVFgsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSksCi0JWzEzMF0gPSBQSU5HUk9VUCgxMzAsIHFsaW5rX3JlcXVlc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsxMzBdID0gUElOR1JPVVAoMTMwLCBXRVNULCBxbGlua19yZXF1ZXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSksCi0JWzEzMV0gPSBQSU5HUk9VUCgxMzEsIHFsaW5rX2VuYWJsZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzEzMV0gPSBQSU5HUk9VUCgxMzEsIFdFU1QsIHFsaW5rX2VuYWJsZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMzJdID0gUElOR1JPVVAoMTMyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTMzXSA9IFBJTkdST1VQKDEzMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEzNF0gPSBQSU5HUk9VUCgxMzQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMzVdID0gUElOR1JPVVAoMTM1LCBOQSwgcGFfaW5kaWNhdG9yLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsxMzJdID0gUElOR1JPVVAoMTMyLCBXRVNULCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTMzXSA9IFBJTkdST1VQKDEzMywgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMzRdID0gUElOR1JPVVAoMTM0LCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzNV0gPSBQSU5HUk9VUCgxMzUsIFdFU1QsIE5BLCBwYV9pbmRpY2F0b3IsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMzZdID0gUElOR1JPVVAoMTM2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTM3XSA9IFBJTkdST1VQKDEzNywgTkEsIE5BLCBwaGFzZV9mbGFnMjYsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTM2XSA9IFBJTkdST1VQKDEzNiwgV0VTVCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzN10gPSBQSU5HUk9VUCgxMzcsIFdFU1QsIE5BLCBOQSwgcGhhc2VfZmxhZzI2LCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxMzhdID0gUElOR1JPVVAoMTM4LCBOQSwgTkEsIHBoYXNlX2ZsYWcyNywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsxMzhdID0gUElOR1JPVVAoMTM4LCBXRVNULCBOQSwgTkEsIHBoYXNlX2ZsYWcyNywgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTM5XSA9IFBJTkdST1VQKDEzOSwgTkEsIHBoYXNlX2ZsYWcyOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTM5XSA9IFBJTkdST1VQKDEzOSwgV0VTVCwgTkEsIHBoYXNlX2ZsYWcyOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSksCi0JWzE0MF0gPSBQSU5HUk9VUCgxNDAsIE5BLCBOQSwgcGhhc2VfZmxhZzYsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTQwXSA9IFBJTkdST1VQKDE0MCwgV0VTVCwgTkEsIE5BLCBwaGFzZV9mbGFnNiwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BKSwKLQlbMTQxXSA9IFBJTkdST1VQKDE0MSwgTkEsIHBoYXNlX2ZsYWcyOSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTQxXSA9IFBJTkdST1VQKDE0MSwgV0VTVCwgTkEsIHBoYXNlX2ZsYWcyOSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCSBOQSksCi0JWzE0Ml0gPSBQSU5HUk9VUCgxNDIsIE5BLCBwaGFzZV9mbGFnMzAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJWzE0Ml0gPSBQSU5HUk9VUCgxNDIsIFdFU1QsIE5BLCBwaGFzZV9mbGFnMzAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxNDNdID0gUElOR1JPVVAoMTQzLCBOQSwgTkFWX1BQUywgTkFWX1BQUywgR1BTX1RYLCBwaGFzZV9mbGFnMzEsCisJWzE0M10gPSBQSU5HUk9VUCgxNDMsIFdFU1QsIE5BLCBOQVZfUFBTLCBOQVZfUFBTLCBHUFNfVFgsIHBoYXNlX2ZsYWczMSwKIAkJCSBOQSwgTkEsIE5BLCBOQSksCi0JWzE0NF0gPSBQSU5HUk9VUCgxNDQsIG1zc19sdGUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzE0NV0gPSBQSU5HUk9VUCgxNDUsIG1zc19sdGUsIEdQU19UWCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwlbMTQ0XSA9IFBJTkdST1VQKDE0NCwgU09VVEgsIG1zc19sdGUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0NV0gPSBQSU5HUk9VUCgxNDUsIFNPVVRILCBtc3NfbHRlLCBHUFNfVFgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEpLAotCVsxNDZdID0gUElOR1JPVVAoMTQ2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTQ3XSA9IFBJTkdST1VQKDE0NywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzE0OF0gPSBQSU5HUk9VUCgxNDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxNDldID0gUElOR1JPVVAoMTQ5LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTUwXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzFfcmNsaywgMHg1OTkwMDAsIDE1LCAwKSwKLQlbMTUxXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzFfY2xrLCAweDU5OTAwMCwgMTMsIDYpLAotCVsxNTJdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMV9jbWQsIDB4NTk5MDAwLCAxMSwgMyksCi0JWzE1M10gPSBTRENfUURTRF9QSU5HUk9VUChzZGMxX2RhdGEsIDB4NTk5MDAwLCA5LCAwKSwKLQlbMTU0XSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzJfY2xrLCAweDk5YTAwMCwgMTQsIDYpLAotCVsxNTVdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9jbWQsIDB4OTlhMDAwLCAxMSwgMyksCi0JWzE1Nl0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2RhdGEsIDB4OTlhMDAwLCA5LCAwKSwKLQlbMTU3XSA9IFVGU19SRVNFVCh1ZnNfcmVzZXQsIDB4OTlmMDAwKSwKKwlbMTQ2XSA9IFBJTkdST1VQKDE0NiwgV0VTVCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0N10gPSBQSU5HUk9VUCgxNDcsIFdFU1QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxNDhdID0gUElOR1JPVVAoMTQ4LCBXRVNULCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTQ5XSA9IFBJTkdST1VQKDE0OSwgV0VTVCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE1MF0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMxX3JjbGssIDB4OTkwMDAsIDE1LCAwKSwKKwlbMTUxXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzFfY2xrLCAweDk5MDAwLCAxMywgNiksCisJWzE1Ml0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMxX2NtZCwgMHg5OTAwMCwgMTEsIDMpLAorCVsxNTNdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMV9kYXRhLCAweDk5MDAwLCA5LCAwKSwKKwlbMTU0XSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzJfY2xrLCAweDlhMDAwLCAxNCwgNiksCisJWzE1NV0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2NtZCwgMHg5YTAwMCwgMTEsIDMpLAorCVsxNTZdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9kYXRhLCAweDlhMDAwLCA5LCAwKSwKKwlbMTU3XSA9IFVGU19SRVNFVCh1ZnNfcmVzZXQsIDB4OWYwMDApLAogfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fZGlyX2Nvbm4gc2RtNjcwX2Rpcl9jb25uW10gPSB7CiAJezEsIDUxMH0sCiAJezMsIDUxMX0sCkBAIC0xNjYzLDEwICsxNjYzLDYgQEAKIAkubmdwaW9zID0gMTUwLAogCS5kaXJfY29ubiA9IHNkbTY3MF9kaXJfY29ubiwKIAkubl9kaXJfY29ubnMgPSBBUlJBWV9TSVpFKHNkbTY3MF9kaXJfY29ubiksCi0JLnRpbGVfb2Zmc2V0cyA9IHNkbTY3MF90aWxlX29mZnNldHMsCi0JLm5fdGlsZV9vZmZzZXRzID0gQVJSQVlfU0laRShzZG02NzBfdGlsZV9vZmZzZXRzKSwKLQkucGluX2Jhc2UgPSBzZG02NzBfcGluX2Jhc2UsCi0JLnJlZ19zaXplID0gUkVHX1NJWkUsCiB9OwogCiBzdGF0aWMgaW50IHNkbTY3MF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkbTg0NS12Mi5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zZG04NDUtdjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q1NTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zZG04NDUtdjIuYwpAQCAtMCwwICsxLDE4MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLW1zbS5oIgorCisjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAorCVttc21fbXV4XyMjZm5hbWVdID0gewkJCQlcCisJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCisJCS5ncm91cHMgPSBmbmFtZSMjX2dyb3VwcywJCVwKKwkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGZuYW1lIyNfZ3JvdXBzKSwJXAorCX0KKworI2RlZmluZSBOT1JUSAkweDAwNTAwMDAwCisjZGVmaW5lIFNPVVRICTB4MDA5MDAwMDAKKyNkZWZpbmUgRUFTVAkweDAwMTAwMDAwCisjZGVmaW5lIFJFR19TSVpFIDB4MTAwMAorI2RlZmluZSBQSU5HUk9VUChpZCwgYmFzZSwgZjEsIGYyLCBmMywgZjQsIGY1LCBmNiwgZjcsIGY4LCBmOSwgZjEwKQlcCisJewkJCQkJCVwKKwkJLm5hbWUgPSAiZ3BpbyIgI2lkLAkJCVwKKwkJLnBpbnMgPSBncGlvIyNpZCMjX3BpbnMsCQlcCisJCS5ucGlucyA9ICh1bnNpZ25lZCBpbnQpQVJSQVlfU0laRShncGlvIyNpZCMjX3BpbnMpLAlcCisJCS5mdW5jcyA9IChpbnRbXSl7CQkJXAorCQkJbXNtX211eF9ncGlvLCAvKiBncGlvIG1vZGUgKi8JXAorCQkJbXNtX211eF8jI2YxLAkJCVwKKwkJCW1zbV9tdXhfIyNmMiwJCQlcCisJCQltc21fbXV4XyMjZjMsCQkJXAorCQkJbXNtX211eF8jI2Y0LAkJCVwKKwkJCW1zbV9tdXhfIyNmNSwJCQlcCisJCQltc21fbXV4XyMjZjYsCQkJXAorCQkJbXNtX211eF8jI2Y3LAkJCVwKKwkJCW1zbV9tdXhfIyNmOCwJCQlcCisJCQltc21fbXV4XyMjZjksCQkJXAorCQkJbXNtX211eF8jI2YxMAkJCVwKKwkJfSwJCQkJCVwKKwkJLm5mdW5jcyA9IDExLAkJCQlcCisJCS5jdGxfcmVnID0gYmFzZSArIFJFR19TSVpFICogaWQsCQlcCisJCS5pb19yZWcgPSBiYXNlICsgMHg0ICsgUkVHX1NJWkUgKiBpZCwJCVwKKwkJLmludHJfY2ZnX3JlZyA9IGJhc2UgKyAweDggKyBSRUdfU0laRSAqIGlkLAlcCisJCS5pbnRyX3N0YXR1c19yZWcgPSBiYXNlICsgMHhjICsgUkVHX1NJWkUgKiBpZCwJXAorCQkuaW50cl90YXJnZXRfcmVnID0gYmFzZSArIDB4OCArIFJFR19TSVpFICogaWQsCVwKKwkJLm11eF9iaXQgPSAyLAkJCVwKKwkJLnB1bGxfYml0ID0gMCwJCQlcCisJCS5kcnZfYml0ID0gNiwJCQlcCisJCS5vZV9iaXQgPSA5LAkJCVwKKwkJLmluX2JpdCA9IDAsCQkJXAorCQkub3V0X2JpdCA9IDEsCQkJXAorCQkuaW50cl9lbmFibGVfYml0ID0gMCwJCVwKKwkJLmludHJfc3RhdHVzX2JpdCA9IDAsCQlcCisJCS5pbnRyX3RhcmdldF9iaXQgPSA1LAkJXAorCQkuaW50cl90YXJnZXRfa3Bzc192YWwgPSAzLAlcCisJCS5pbnRyX3Jhd19zdGF0dXNfYml0ID0gNCwJXAorCQkuaW50cl9wb2xhcml0eV9iaXQgPSAxLAkJXAorCQkuaW50cl9kZXRlY3Rpb25fYml0ID0gMiwJXAorCQkuaW50cl9kZXRlY3Rpb25fd2lkdGggPSAyLAlcCisJfQorCisjZGVmaW5lIFNEQ19RRFNEX1BJTkdST1VQKHBnX25hbWUsIGN0bCwgcHVsbCwgZHJ2KQlcCisJewkJCQkJCVwKKwkJLm5hbWUgPSAjcGdfbmFtZSwJCQlcCisJCS5waW5zID0gcGdfbmFtZSMjX3BpbnMsCQkJXAorCQkubnBpbnMgPSAodW5zaWduZWQgaW50KUFSUkFZX1NJWkUocGdfbmFtZSMjX3BpbnMpLAlcCisJCS5jdGxfcmVnID0gY3RsLAkJCQlcCisJCS5pb19yZWcgPSAwLAkJCQlcCisJCS5pbnRyX2NmZ19yZWcgPSAwLAkJCVwKKwkJLmludHJfc3RhdHVzX3JlZyA9IDAsCQkJXAorCQkuaW50cl90YXJnZXRfcmVnID0gMCwJCQlcCisJCS5tdXhfYml0ID0gLTEsCQkJCVwKKwkJLnB1bGxfYml0ID0gcHVsbCwJCQlcCisJCS5kcnZfYml0ID0gZHJ2LAkJCQlcCisJCS5vZV9iaXQgPSAtMSwJCQkJXAorCQkuaW5fYml0ID0gLTEsCQkJCVwKKwkJLm91dF9iaXQgPSAtMSwJCQkJXAorCQkuaW50cl9lbmFibGVfYml0ID0gLTEsCQkJXAorCQkuaW50cl9zdGF0dXNfYml0ID0gLTEsCQkJXAorCQkuaW50cl90YXJnZXRfYml0ID0gLTEsCQkJXAorCQkuaW50cl9yYXdfc3RhdHVzX2JpdCA9IC0xLAkJXAorCQkuaW50cl9wb2xhcml0eV9iaXQgPSAtMSwJCVwKKwkJLmludHJfZGV0ZWN0aW9uX2JpdCA9IC0xLAkJXAorCQkuaW50cl9kZXRlY3Rpb25fd2lkdGggPSAtMSwJCVwKKwl9CisKKyNkZWZpbmUgVUZTX1JFU0VUKHBnX25hbWUsIG9mZnNldCkJCQkJXAorCXsJCQkJCQlcCisJCS5uYW1lID0gI3BnX25hbWUsCQkJXAorCQkucGlucyA9IHBnX25hbWUjI19waW5zLAkJCVwKKwkJLm5waW5zID0gKHVuc2lnbmVkIGludClBUlJBWV9TSVpFKHBnX25hbWUjI19waW5zKSwJXAorCQkuY3RsX3JlZyA9IG9mZnNldCwJCQlcCisJCS5pb19yZWcgPSBvZmZzZXQgKyAweDQsCQkJXAorCQkuaW50cl9jZmdfcmVnID0gMCwJCQlcCisJCS5pbnRyX3N0YXR1c19yZWcgPSAwLAkJCVwKKwkJLmludHJfdGFyZ2V0X3JlZyA9IDAsCQkJXAorCQkubXV4X2JpdCA9IC0xLAkJCQlcCisJCS5wdWxsX2JpdCA9IDMsCQkJCVwKKwkJLmRydl9iaXQgPSAwLAkJCQlcCisJCS5vZV9iaXQgPSAtMSwJCQkJXAorCQkuaW5fYml0ID0gLTEsCQkJCVwKKwkJLm91dF9iaXQgPSAwLAkJCQlcCisJCS5pbnRyX2VuYWJsZV9iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3N0YXR1c19iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3RhcmdldF9iaXQgPSAtMSwJCQlcCisJCS5pbnRyX3Jhd19zdGF0dXNfYml0ID0gLTEsCQlcCisJCS5pbnRyX3BvbGFyaXR5X2JpdCA9IC0xLAkJXAorCQkuaW50cl9kZXRlY3Rpb25fYml0ID0gLTEsCQlcCisJCS5pbnRyX2RldGVjdGlvbl93aWR0aCA9IC0xLAkJXAorCX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBzZG04NDVfcGluc1tdID0geworCVBJTkNUUkxfUElOKDAsICJHUElPXzAiKSwKKwlQSU5DVFJMX1BJTigxLCAiR1BJT18xIiksCisJUElOQ1RSTF9QSU4oMiwgIkdQSU9fMiIpLAorCVBJTkNUUkxfUElOKDMsICJHUElPXzMiKSwKKwlQSU5DVFJMX1BJTig0LCAiR1BJT180IiksCisJUElOQ1RSTF9QSU4oNSwgIkdQSU9fNSIpLAorCVBJTkNUUkxfUElOKDYsICJHUElPXzYiKSwKKwlQSU5DVFJMX1BJTig3LCAiR1BJT183IiksCisJUElOQ1RSTF9QSU4oOCwgIkdQSU9fOCIpLAorCVBJTkNUUkxfUElOKDksICJHUElPXzkiKSwKKwlQSU5DVFJMX1BJTigxMCwgIkdQSU9fMTAiKSwKKwlQSU5DVFJMX1BJTigxMSwgIkdQSU9fMTEiKSwKKwlQSU5DVFJMX1BJTigxMiwgIkdQSU9fMTIiKSwKKwlQSU5DVFJMX1BJTigxMywgIkdQSU9fMTMiKSwKKwlQSU5DVFJMX1BJTigxNCwgIkdQSU9fMTQiKSwKKwlQSU5DVFJMX1BJTigxNSwgIkdQSU9fMTUiKSwKKwlQSU5DVFJMX1BJTigxNiwgIkdQSU9fMTYiKSwKKwlQSU5DVFJMX1BJTigxNywgIkdQSU9fMTciKSwKKwlQSU5DVFJMX1BJTigxOCwgIkdQSU9fMTgiKSwKKwlQSU5DVFJMX1BJTigxOSwgIkdQSU9fMTkiKSwKKwlQSU5DVFJMX1BJTigyMCwgIkdQSU9fMjAiKSwKKwlQSU5DVFJMX1BJTigyMSwgIkdQSU9fMjEiKSwKKwlQSU5DVFJMX1BJTigyMiwgIkdQSU9fMjIiKSwKKwlQSU5DVFJMX1BJTigyMywgIkdQSU9fMjMiKSwKKwlQSU5DVFJMX1BJTigyNCwgIkdQSU9fMjQiKSwKKwlQSU5DVFJMX1BJTigyNSwgIkdQSU9fMjUiKSwKKwlQSU5DVFJMX1BJTigyNiwgIkdQSU9fMjYiKSwKKwlQSU5DVFJMX1BJTigyNywgIkdQSU9fMjciKSwKKwlQSU5DVFJMX1BJTigyOCwgIkdQSU9fMjgiKSwKKwlQSU5DVFJMX1BJTigyOSwgIkdQSU9fMjkiKSwKKwlQSU5DVFJMX1BJTigzMCwgIkdQSU9fMzAiKSwKKwlQSU5DVFJMX1BJTigzMSwgIkdQSU9fMzEiKSwKKwlQSU5DVFJMX1BJTigzMiwgIkdQSU9fMzIiKSwKKwlQSU5DVFJMX1BJTigzMywgIkdQSU9fMzMiKSwKKwlQSU5DVFJMX1BJTigzNCwgIkdQSU9fMzQiKSwKKwlQSU5DVFJMX1BJTigzNSwgIkdQSU9fMzUiKSwKKwlQSU5DVFJMX1BJTigzNiwgIkdQSU9fMzYiKSwKKwlQSU5DVFJMX1BJTigzNywgIkdQSU9fMzciKSwKKwlQSU5DVFJMX1BJTigzOCwgIkdQSU9fMzgiKSwKKwlQSU5DVFJMX1BJTigzOSwgIkdQSU9fMzkiKSwKKwlQSU5DVFJMX1BJTig0MCwgIkdQSU9fNDAiKSwKKwlQSU5DVFJMX1BJTig0MSwgIkdQSU9fNDEiKSwKKwlQSU5DVFJMX1BJTig0MiwgIkdQSU9fNDIiKSwKKwlQSU5DVFJMX1BJTig0MywgIkdQSU9fNDMiKSwKKwlQSU5DVFJMX1BJTig0NCwgIkdQSU9fNDQiKSwKKwlQSU5DVFJMX1BJTig0NSwgIkdQSU9fNDUiKSwKKwlQSU5DVFJMX1BJTig0NiwgIkdQSU9fNDYiKSwKKwlQSU5DVFJMX1BJTig0NywgIkdQSU9fNDciKSwKKwlQSU5DVFJMX1BJTig0OCwgIkdQSU9fNDgiKSwKKwlQSU5DVFJMX1BJTig0OSwgIkdQSU9fNDkiKSwKKwlQSU5DVFJMX1BJTig1MCwgIkdQSU9fNTAiKSwKKwlQSU5DVFJMX1BJTig1MSwgIkdQSU9fNTEiKSwKKwlQSU5DVFJMX1BJTig1MiwgIkdQSU9fNTIiKSwKKwlQSU5DVFJMX1BJTig1MywgIkdQSU9fNTMiKSwKKwlQSU5DVFJMX1BJTig1NCwgIkdQSU9fNTQiKSwKKwlQSU5DVFJMX1BJTig1NSwgIkdQSU9fNTUiKSwKKwlQSU5DVFJMX1BJTig1NiwgIkdQSU9fNTYiKSwKKwlQSU5DVFJMX1BJTig1NywgIkdQSU9fNTciKSwKKwlQSU5DVFJMX1BJTig1OCwgIkdQSU9fNTgiKSwKKwlQSU5DVFJMX1BJTig1OSwgIkdQSU9fNTkiKSwKKwlQSU5DVFJMX1BJTig2MCwgIkdQSU9fNjAiKSwKKwlQSU5DVFJMX1BJTig2MSwgIkdQSU9fNjEiKSwKKwlQSU5DVFJMX1BJTig2MiwgIkdQSU9fNjIiKSwKKwlQSU5DVFJMX1BJTig2MywgIkdQSU9fNjMiKSwKKwlQSU5DVFJMX1BJTig2NCwgIkdQSU9fNjQiKSwKKwlQSU5DVFJMX1BJTig2NSwgIkdQSU9fNjUiKSwKKwlQSU5DVFJMX1BJTig2NiwgIkdQSU9fNjYiKSwKKwlQSU5DVFJMX1BJTig2NywgIkdQSU9fNjciKSwKKwlQSU5DVFJMX1BJTig2OCwgIkdQSU9fNjgiKSwKKwlQSU5DVFJMX1BJTig2OSwgIkdQSU9fNjkiKSwKKwlQSU5DVFJMX1BJTig3MCwgIkdQSU9fNzAiKSwKKwlQSU5DVFJMX1BJTig3MSwgIkdQSU9fNzEiKSwKKwlQSU5DVFJMX1BJTig3MiwgIkdQSU9fNzIiKSwKKwlQSU5DVFJMX1BJTig3MywgIkdQSU9fNzMiKSwKKwlQSU5DVFJMX1BJTig3NCwgIkdQSU9fNzQiKSwKKwlQSU5DVFJMX1BJTig3NSwgIkdQSU9fNzUiKSwKKwlQSU5DVFJMX1BJTig3NiwgIkdQSU9fNzYiKSwKKwlQSU5DVFJMX1BJTig3NywgIkdQSU9fNzciKSwKKwlQSU5DVFJMX1BJTig3OCwgIkdQSU9fNzgiKSwKKwlQSU5DVFJMX1BJTig3OSwgIkdQSU9fNzkiKSwKKwlQSU5DVFJMX1BJTig4MCwgIkdQSU9fODAiKSwKKwlQSU5DVFJMX1BJTig4MSwgIkdQSU9fODEiKSwKKwlQSU5DVFJMX1BJTig4MiwgIkdQSU9fODIiKSwKKwlQSU5DVFJMX1BJTig4MywgIkdQSU9fODMiKSwKKwlQSU5DVFJMX1BJTig4NCwgIkdQSU9fODQiKSwKKwlQSU5DVFJMX1BJTig4NSwgIkdQSU9fODUiKSwKKwlQSU5DVFJMX1BJTig4NiwgIkdQSU9fODYiKSwKKwlQSU5DVFJMX1BJTig4NywgIkdQSU9fODciKSwKKwlQSU5DVFJMX1BJTig4OCwgIkdQSU9fODgiKSwKKwlQSU5DVFJMX1BJTig4OSwgIkdQSU9fODkiKSwKKwlQSU5DVFJMX1BJTig5MCwgIkdQSU9fOTAiKSwKKwlQSU5DVFJMX1BJTig5MSwgIkdQSU9fOTEiKSwKKwlQSU5DVFJMX1BJTig5MiwgIkdQSU9fOTIiKSwKKwlQSU5DVFJMX1BJTig5MywgIkdQSU9fOTMiKSwKKwlQSU5DVFJMX1BJTig5NCwgIkdQSU9fOTQiKSwKKwlQSU5DVFJMX1BJTig5NSwgIkdQSU9fOTUiKSwKKwlQSU5DVFJMX1BJTig5NiwgIkdQSU9fOTYiKSwKKwlQSU5DVFJMX1BJTig5NywgIkdQSU9fOTciKSwKKwlQSU5DVFJMX1BJTig5OCwgIkdQSU9fOTgiKSwKKwlQSU5DVFJMX1BJTig5OSwgIkdQSU9fOTkiKSwKKwlQSU5DVFJMX1BJTigxMDAsICJHUElPXzEwMCIpLAorCVBJTkNUUkxfUElOKDEwMSwgIkdQSU9fMTAxIiksCisJUElOQ1RSTF9QSU4oMTAyLCAiR1BJT18xMDIiKSwKKwlQSU5DVFJMX1BJTigxMDMsICJHUElPXzEwMyIpLAorCVBJTkNUUkxfUElOKDEwNCwgIkdQSU9fMTA0IiksCisJUElOQ1RSTF9QSU4oMTA1LCAiR1BJT18xMDUiKSwKKwlQSU5DVFJMX1BJTigxMDYsICJHUElPXzEwNiIpLAorCVBJTkNUUkxfUElOKDEwNywgIkdQSU9fMTA3IiksCisJUElOQ1RSTF9QSU4oMTA4LCAiR1BJT18xMDgiKSwKKwlQSU5DVFJMX1BJTigxMDksICJHUElPXzEwOSIpLAorCVBJTkNUUkxfUElOKDExMCwgIkdQSU9fMTEwIiksCisJUElOQ1RSTF9QSU4oMTExLCAiR1BJT18xMTEiKSwKKwlQSU5DVFJMX1BJTigxMTIsICJHUElPXzExMiIpLAorCVBJTkNUUkxfUElOKDExMywgIkdQSU9fMTEzIiksCisJUElOQ1RSTF9QSU4oMTE0LCAiR1BJT18xMTQiKSwKKwlQSU5DVFJMX1BJTigxMTUsICJHUElPXzExNSIpLAorCVBJTkNUUkxfUElOKDExNiwgIkdQSU9fMTE2IiksCisJUElOQ1RSTF9QSU4oMTE3LCAiR1BJT18xMTciKSwKKwlQSU5DVFJMX1BJTigxMTgsICJHUElPXzExOCIpLAorCVBJTkNUUkxfUElOKDExOSwgIkdQSU9fMTE5IiksCisJUElOQ1RSTF9QSU4oMTIwLCAiR1BJT18xMjAiKSwKKwlQSU5DVFJMX1BJTigxMjEsICJHUElPXzEyMSIpLAorCVBJTkNUUkxfUElOKDEyMiwgIkdQSU9fMTIyIiksCisJUElOQ1RSTF9QSU4oMTIzLCAiR1BJT18xMjMiKSwKKwlQSU5DVFJMX1BJTigxMjQsICJHUElPXzEyNCIpLAorCVBJTkNUUkxfUElOKDEyNSwgIkdQSU9fMTI1IiksCisJUElOQ1RSTF9QSU4oMTI2LCAiR1BJT18xMjYiKSwKKwlQSU5DVFJMX1BJTigxMjcsICJHUElPXzEyNyIpLAorCVBJTkNUUkxfUElOKDEyOCwgIkdQSU9fMTI4IiksCisJUElOQ1RSTF9QSU4oMTI5LCAiR1BJT18xMjkiKSwKKwlQSU5DVFJMX1BJTigxMzAsICJHUElPXzEzMCIpLAorCVBJTkNUUkxfUElOKDEzMSwgIkdQSU9fMTMxIiksCisJUElOQ1RSTF9QSU4oMTMyLCAiR1BJT18xMzIiKSwKKwlQSU5DVFJMX1BJTigxMzMsICJHUElPXzEzMyIpLAorCVBJTkNUUkxfUElOKDEzNCwgIkdQSU9fMTM0IiksCisJUElOQ1RSTF9QSU4oMTM1LCAiR1BJT18xMzUiKSwKKwlQSU5DVFJMX1BJTigxMzYsICJHUElPXzEzNiIpLAorCVBJTkNUUkxfUElOKDEzNywgIkdQSU9fMTM3IiksCisJUElOQ1RSTF9QSU4oMTM4LCAiR1BJT18xMzgiKSwKKwlQSU5DVFJMX1BJTigxMzksICJHUElPXzEzOSIpLAorCVBJTkNUUkxfUElOKDE0MCwgIkdQSU9fMTQwIiksCisJUElOQ1RSTF9QSU4oMTQxLCAiR1BJT18xNDEiKSwKKwlQSU5DVFJMX1BJTigxNDIsICJHUElPXzE0MiIpLAorCVBJTkNUUkxfUElOKDE0MywgIkdQSU9fMTQzIiksCisJUElOQ1RSTF9QSU4oMTQ0LCAiR1BJT18xNDQiKSwKKwlQSU5DVFJMX1BJTigxNDUsICJHUElPXzE0NSIpLAorCVBJTkNUUkxfUElOKDE0NiwgIkdQSU9fMTQ2IiksCisJUElOQ1RSTF9QSU4oMTQ3LCAiR1BJT18xNDciKSwKKwlQSU5DVFJMX1BJTigxNDgsICJHUElPXzE0OCIpLAorCVBJTkNUUkxfUElOKDE0OSwgIkdQSU9fMTQ5IiksCisJUElOQ1RSTF9QSU4oMTUwLCAiU0RDMl9DTEsiKSwKKwlQSU5DVFJMX1BJTigxNTEsICJTREMyX0NNRCIpLAorCVBJTkNUUkxfUElOKDE1MiwgIlNEQzJfREFUQSIpLAorCVBJTkNUUkxfUElOKDE1MywgIlVGU19SRVNFVCIpLAorfTsKKworI2RlZmluZSBERUNMQVJFX01TTV9HUElPX1BJTlMocGluKSBcCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBncGlvIyNwaW4jI19waW5zW10gPSB7IHBpbiB9CitERUNMQVJFX01TTV9HUElPX1BJTlMoMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDIwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDIzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDI2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygyNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMjgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDI5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDMyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDM1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMzcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDM4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygzOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0Mik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQ0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0NSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDQ3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg0OCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNDkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDUwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1MSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDUzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1NCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDU2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg1Nyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNTgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDU5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2MCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDYyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2Myk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDY1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2Nik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNjcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDY4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg2OSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDcxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3Mik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDc0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3NSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDc3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg3OCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoNzkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDgwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4MSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDgzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4NCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDg2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg4Nyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoODgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDg5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5MCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDkyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5Myk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDk1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5Nik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoOTcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDk4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUyg5OSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTAwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTAzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTA2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMDcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEwOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTA5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExMSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTEyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExNCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTE1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDExNyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTE4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMTkpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyMCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTIxKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjIpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyMyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTI0KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjUpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyNik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTI3KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMjgpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEyOSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMwKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzEpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzMik7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTMzKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzQpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzNSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTM2KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxMzcpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDEzOCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTM5KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNDApOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0MSk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTQyKTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNDMpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0NCk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTQ1KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNDYpOworREVDTEFSRV9NU01fR1BJT19QSU5TKDE0Nyk7CitERUNMQVJFX01TTV9HUElPX1BJTlMoMTQ4KTsKK0RFQ0xBUkVfTVNNX0dQSU9fUElOUygxNDkpOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzJfY2xrX3BpbnNbXSA9IHsgMTUwIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzJfY21kX3BpbnNbXSA9IHsgMTUxIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzJfZGF0YV9waW5zW10gPSB7IDE1MiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1ZnNfcmVzZXRfcGluc1tdID0geyAxNTMgfTsKKworZW51bSBzZG04NDVfZnVuY3Rpb25zIHsKKwltc21fbXV4X2Rkcl9weGkzLAorCW1zbV9tdXhfY2FtX21jbGssCisJbXNtX211eF9wbGxfYnlwYXNzbmwsCisJbXNtX211eF9xZHNzX2dwaW8wLAorCW1zbV9tdXhfcGxsX3Jlc2V0LAorCW1zbV9tdXhfcWRzc19ncGlvMSwKKwltc21fbXV4X3Fkc3NfZ3BpbzIsCisJbXNtX211eF9xZHNzX2dwaW8zLAorCW1zbV9tdXhfY2NpX2kyYywKKwltc21fbXV4X3F1cDEsCisJbXNtX211eF9xZHNzX2dwaW80LAorCW1zbV9tdXhfcWRzc19ncGlvNSwKKwltc21fbXV4X3Fkc3NfZ3BpbzYsCisJbXNtX211eF9xZHNzX2dwaW83LAorCW1zbV9tdXhfY2NpX3RpbWVyMCwKKwltc21fbXV4X2djY19ncDIsCisJbXNtX211eF9xZHNzX2dwaW84LAorCW1zbV9tdXhfY2NpX3RpbWVyMSwKKwltc21fbXV4X2djY19ncDMsCisJbXNtX211eF9xZHNzX2dwaW8sCisJbXNtX211eF9jY2lfdGltZXIyLAorCW1zbV9tdXhfcWRzc19ncGlvOSwKKwltc21fbXV4X2NjaV90aW1lcjMsCisJbXNtX211eF9jY2lfYXN5bmMsCisJbXNtX211eF9xZHNzX2dwaW8xMCwKKwltc21fbXV4X2NjaV90aW1lcjQsCisJbXNtX211eF9xZHNzX2dwaW8xMSwKKwltc21fbXV4X3Fkc3NfZ3BpbzEyLAorCW1zbV9tdXhfcXVwMiwKKwltc21fbXV4X3Fkc3NfZ3BpbzEzLAorCW1zbV9tdXhfcWRzc19ncGlvMTQsCisJbXNtX211eF9waGFzZV9mbGFnMSwKKwltc21fbXV4X3Fkc3NfZ3BpbzE1LAorCW1zbV9tdXhfcGhhc2VfZmxhZzIsCisJbXNtX211eF9xdXAxMSwKKwltc21fbXV4X3F1cDE0LAorCW1zbV9tdXhfcGNpX2UwLAorCW1zbV9tdXhfaml0dGVyX2Jpc3QsCisJbXNtX211eF9wbGxfYmlzdCwKKwltc21fbXV4X2F0ZXN0X3RzZW5zLAorCW1zbV9tdXhfYWdlcmFfcGxsLAorCW1zbV9tdXhfdXNiX3BoeSwKKwltc21fbXV4X2xwYXNzX3NsaW1idXMsCisJbXNtX211eF9zZF93cml0ZSwKKwltc21fbXV4X3RzaWYxX2Vycm9yLAorCW1zbV9tdXhfcXVwMywKKwltc21fbXV4X3F1cDYsCisJbXNtX211eF9xdXAxMiwKKwltc21fbXV4X3BoYXNlX2ZsYWcxNiwKKwltc21fbXV4X3F1cDEwLAorCW1zbV9tdXhfcGhhc2VfZmxhZzExLAorCW1zbV9tdXhfcGhhc2VfZmxhZzEyLAorCW1zbV9tdXhfcGhhc2VfZmxhZzEzLAorCW1zbV9tdXhfcGhhc2VfZmxhZzE3LAorCW1zbV9tdXhfcXVhX21pMnMsCisJbXNtX211eF9nY2NfZ3AxLAorCW1zbV9tdXhfcGhhc2VfZmxhZzE4LAorCW1zbV9tdXhfcGhhc2VfZmxhZzE5LAorCW1zbV9tdXhfcGhhc2VfZmxhZzIwLAorCW1zbV9tdXhfY3JpX3RybmcwLAorCW1zbV9tdXhfcGhhc2VfZmxhZzIxLAorCW1zbV9tdXhfY3JpX3RybmcxLAorCW1zbV9tdXhfcGhhc2VfZmxhZzIyLAorCW1zbV9tdXhfY3JpX3RybmcsCisJbXNtX211eF9waGFzZV9mbGFnMjMsCisJbXNtX211eF9waGFzZV9mbGFnMjQsCisJbXNtX211eF9wcmlfbWkycywKKwltc21fbXV4X3NwX2NtdSwKKwltc21fbXV4X3BoYXNlX2ZsYWcyNSwKKwltc21fbXV4X3F1cDgsCisJbXNtX211eF9wcmlfbWkyc193cywKKwltc21fbXV4X3Nwa3JfaTJzLAorCW1zbV9tdXhfYXVkaW9fcmVmLAorCW1zbV9tdXhfdHNlbnNlX3B3bTEsCisJbXNtX211eF90c2Vuc2VfcHdtMiwKKwltc21fbXV4X2J0Zm1fc2xpbWJ1cywKKwltc21fbXV4X2F0ZXN0X3VzYjIsCisJbXNtX211eF90ZXJfbWkycywKKwltc21fbXV4X3BoYXNlX2ZsYWc3LAorCW1zbV9tdXhfYXRlc3RfdXNiMjMsCisJbXNtX211eF9waGFzZV9mbGFnOCwKKwltc21fbXV4X2F0ZXN0X3VzYjIyLAorCW1zbV9tdXhfcGhhc2VfZmxhZzksCisJbXNtX211eF9hdGVzdF91c2IyMSwKKwltc21fbXV4X3BoYXNlX2ZsYWc0LAorCW1zbV9tdXhfYXRlc3RfdXNiMjAsCisJbXNtX211eF9zZWNfbWkycywKKwltc21fbXV4X3F1cDE1LAorCW1zbV9tdXhfcXVwNSwKKwltc21fbXV4X3RzaWYxX2NsaywKKwltc21fbXV4X3F1cDQsCisJbXNtX211eF9xc3BpX2NzLAorCW1zbV9tdXhfdGd1X2NoMywKKwltc21fbXV4X3BoYXNlX2ZsYWcxMCwKKwltc21fbXV4X3RzaWYxX2VuLAorCW1zbV9tdXhfbWRwX3ZzeW5jMCwKKwltc21fbXV4X21kcF92c3luYzEsCisJbXNtX211eF9tZHBfdnN5bmMyLAorCW1zbV9tdXhfbWRwX3ZzeW5jMywKKwltc21fbXV4X3RndV9jaDAsCisJbXNtX211eF9waGFzZV9mbGFnMCwKKwltc21fbXV4X3RzaWYxX2RhdGEsCisJbXNtX211eF9zZGM0X2NtZCwKKwltc21fbXV4X3FzcGkwLAorCW1zbV9tdXhfdGd1X2NoMSwKKwltc21fbXV4X3RzaWYyX2Vycm9yLAorCW1zbV9tdXhfc2RjNDMsCisJbXNtX211eF9xc3BpMSwKKwltc21fbXV4X3Zmcl8xLAorCW1zbV9tdXhfdGd1X2NoMiwKKwltc21fbXV4X3RzaWYyX2NsaywKKwltc21fbXV4X3NkYzRfY2xrLAorCW1zbV9tdXhfcXVwNywKKwltc21fbXV4X3FzcGkyLAorCW1zbV9tdXhfdHNpZjJfZW4sCisJbXNtX211eF9zZGM0MiwKKwltc21fbXV4X3FzcGkzLAorCW1zbV9tdXhfdHNpZjJfZGF0YSwKKwltc21fbXV4X3NkYzQxLAorCW1zbV9tdXhfcXNwaV9jbGssCisJbXNtX211eF90c2lmMl9zeW5jLAorCW1zbV9tdXhfc2RjNDAsCisJbXNtX211eF9waGFzZV9mbGFnMywKKwltc21fbXV4X2xkb19lbiwKKwltc21fbXV4X2xkb191cGRhdGUsCisJbXNtX211eF9waGFzZV9mbGFnMTQsCisJbXNtX211eF9waGFzZV9mbGFnMTUsCisJbXNtX211eF9wY2lfZTEsCisJbXNtX211eF9wcm5nX3Jvc2MsCisJbXNtX211eF9waGFzZV9mbGFnNSwKKwltc21fbXV4X3VpbTJfZGF0YSwKKwltc21fbXV4X3F1cDEzLAorCW1zbV9tdXhfdWltMl9jbGssCisJbXNtX211eF91aW0yX3Jlc2V0LAorCW1zbV9tdXhfdWltMl9wcmVzZW50LAorCW1zbV9tdXhfdWltMV9kYXRhLAorCW1zbV9tdXhfdWltMV9jbGssCisJbXNtX211eF91aW0xX3Jlc2V0LAorCW1zbV9tdXhfdWltMV9wcmVzZW50LAorCW1zbV9tdXhfdWltX2JhdHQsCisJbXNtX211eF9lZHBfaG90LAorCW1zbV9tdXhfbmF2X3BwcywKKwltc21fbXV4X2F0ZXN0X2NoYXIsCisJbXNtX211eF9hZHNwX2V4dCwKKwltc21fbXV4X2F0ZXN0X2NoYXIzLAorCW1zbV9tdXhfYXRlc3RfY2hhcjIsCisJbXNtX211eF9hdGVzdF9jaGFyMSwKKwltc21fbXV4X2F0ZXN0X2NoYXIwLAorCW1zbV9tdXhfcWxpbmtfcmVxdWVzdCwKKwltc21fbXV4X3FsaW5rX2VuYWJsZSwKKwltc21fbXV4X3BhX2luZGljYXRvciwKKwltc21fbXV4X3BoYXNlX2ZsYWcyNiwKKwltc21fbXV4X3BoYXNlX2ZsYWcyNywKKwltc21fbXV4X3BoYXNlX2ZsYWcyOCwKKwltc21fbXV4X3BoYXNlX2ZsYWc2LAorCW1zbV9tdXhfcGhhc2VfZmxhZzI5LAorCW1zbV9tdXhfcGhhc2VfZmxhZzMwLAorCW1zbV9tdXhfcGhhc2VfZmxhZzMxLAorCW1zbV9tdXhfbXNzX2x0ZSwKKwltc21fbXV4X3F1cDAsCisJbXNtX211eF9ncGlvLAorCW1zbV9tdXhfcXVwOSwKKwltc21fbXV4X3Fkc3NfY3RpLAorCW1zbV9tdXhfZGRyX3B4aTAsCisJbXNtX211eF9kZHJfYmlzdCwKKwltc21fbXV4X2F0ZXN0X3RzZW5zMiwKKwltc21fbXV4X3ZzZW5zZV90cmlnZ2VyLAorCW1zbV9tdXhfYXRlc3RfdXNiMSwKKwltc21fbXV4X3F1cF9sNCwKKwltc21fbXV4X3dsYW4xX2FkYzEsCisJbXNtX211eF9hdGVzdF91c2IxMywKKwltc21fbXV4X2Rkcl9weGkxLAorCW1zbV9tdXhfcXVwX2w1LAorCW1zbV9tdXhfd2xhbjFfYWRjMCwKKwltc21fbXV4X2F0ZXN0X3VzYjEyLAorCW1zbV9tdXhfbWRwX3ZzeW5jLAorCW1zbV9tdXhfcXVwX2w2LAorCW1zbV9tdXhfd2xhbjJfYWRjMSwKKwltc21fbXV4X2F0ZXN0X3VzYjExLAorCW1zbV9tdXhfZGRyX3B4aTIsCisJbXNtX211eF9lZHBfbGNkLAorCW1zbV9tdXhfZGJnX291dCwKKwltc21fbXV4X3dsYW4yX2FkYzAsCisJbXNtX211eF9hdGVzdF91c2IxMCwKKwltc21fbXV4X21fdm9jLAorCW1zbV9tdXhfdHNpZjFfc3luYywKKwltc21fbXV4X05BLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZHJfcHhpM19ncm91cHNbXSA9IHsKKwkiZ3BpbzEyIiwgImdwaW8xMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW1fbWNsa19ncm91cHNbXSA9IHsKKwkiZ3BpbzEzIiwgImdwaW8xNCIsICJncGlvMTUiLCAiZ3BpbzE2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbF9ieXBhc3NubF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzBfZ3JvdXBzW10gPSB7CisJImdwaW8xMyIsICJncGlvMTE3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbF9yZXNldF9ncm91cHNbXSA9IHsKKwkiZ3BpbzE0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzFfZ3JvdXBzW10gPSB7CisJImdwaW8xNCIsICJncGlvMTE4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzJfZ3JvdXBzW10gPSB7CisJImdwaW8xNSIsICJncGlvMTE5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzNfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsICJncGlvMTIwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV9pMmNfZ3JvdXBzW10gPSB7CisJImdwaW8xNyIsICJncGlvMTgiLCAiZ3BpbzE5IiwgImdwaW8yMCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXAxX2dyb3Vwc1tdID0geworCSJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsICJncGlvMjAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzE3IiwgImdwaW8xMjEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvNV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE4IiwgImdwaW8xMjIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvNl9ncm91cHNbXSA9IHsKKwkiZ3BpbzE5IiwgImdwaW80MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2dwaW83X2dyb3Vwc1tdID0geworCSJncGlvMjAiLCAiZ3BpbzQyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNjaV90aW1lcjBfZ3JvdXBzW10gPSB7CisJImdwaW8yMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfZ3AyX2dyb3Vwc1tdID0geworCSJncGlvMjEiLCAiZ3BpbzU4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzhfZ3JvdXBzW10gPSB7CisJImdwaW8yMSIsICJncGlvNzUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2NpX3RpbWVyMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzIyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19ncDNfZ3JvdXBzW10gPSB7CisJImdwaW8yMiIsICJncGlvNTkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvX2dyb3Vwc1tdID0geworCSJncGlvMjIiLCAiZ3BpbzMwIiwgImdwaW8xMjMiLCAiZ3BpbzEyNCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfdGltZXIyX2dyb3Vwc1tdID0geworCSJncGlvMjMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvOV9ncm91cHNbXSA9IHsKKwkiZ3BpbzIzIiwgImdwaW83NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfdGltZXIzX2dyb3Vwc1tdID0geworCSJncGlvMjQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2NpX2FzeW5jX2dyb3Vwc1tdID0geworCSJncGlvMjQiLCAiZ3BpbzI1IiwgImdwaW8yNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2dwaW8xMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzI0IiwgImdwaW83NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjY2lfdGltZXI0X2dyb3Vwc1tdID0geworCSJncGlvMjUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvMTFfZ3JvdXBzW10gPSB7CisJImdwaW8yNSIsICJncGlvNzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvMTJfZ3JvdXBzW10gPSB7CisJImdwaW8yNiIsICJncGlvODAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzI3IiwgImdwaW8yOCIsICJncGlvMjkiLCAiZ3BpbzMwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzEzX2dyb3Vwc1tdID0geworCSJncGlvMjciLCAiZ3BpbzkzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfZ3BpbzE0X2dyb3Vwc1tdID0geworCSJncGlvMjgiLCAiZ3BpbzQzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxX2dyb3Vwc1tdID0geworCSJncGlvMjkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19ncGlvMTVfZ3JvdXBzW10gPSB7CisJImdwaW8yOSIsICJncGlvNDQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzJfZ3JvdXBzW10gPSB7CisJImdwaW8zMCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXAxMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzMxIiwgImdwaW8zMiIsICJncGlvMzMiLCAiZ3BpbzM0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cDE0X2dyb3Vwc1tdID0geworCSJncGlvMzEiLCAiZ3BpbzMyIiwgImdwaW8zMyIsICJncGlvMzQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpX2UwX2dyb3Vwc1tdID0geworCSJncGlvMzUiLCAiZ3BpbzM2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGppdHRlcl9iaXN0X2dyb3Vwc1tdID0geworCSJncGlvMzUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsX2Jpc3RfZ3JvdXBzW10gPSB7CisJImdwaW8zNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF90c2Vuc19ncm91cHNbXSA9IHsKKwkiZ3BpbzM2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFnZXJhX3BsbF9ncm91cHNbXSA9IHsKKwkiZ3BpbzM3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYl9waHlfZ3JvdXBzW10gPSB7CisJImdwaW8zOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBscGFzc19zbGltYnVzX2dyb3Vwc1tdID0geworCSJncGlvMzkiLCAiZ3BpbzcwIiwgImdwaW83MSIsICJncGlvNzIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2Rfd3JpdGVfZ3JvdXBzW10gPSB7CisJImdwaW80MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0c2lmMV9lcnJvcl9ncm91cHNbXSA9IHsKKwkiZ3BpbzQwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cDNfZ3JvdXBzW10gPSB7CisJImdwaW80MSIsICJncGlvNDIiLCAiZ3BpbzQzIiwgImdwaW80NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXA2X2dyb3Vwc1tdID0geworCSJncGlvNDUiLCAiZ3BpbzQ2IiwgImdwaW80NyIsICJncGlvNDgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwMTJfZ3JvdXBzW10gPSB7CisJImdwaW80OSIsICJncGlvNTAiLCAiZ3BpbzUxIiwgImdwaW81MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMTZfZ3JvdXBzW10gPSB7CisJImdwaW81MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXAxMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzUzIiwgImdwaW81NCIsICJncGlvNTUiLCAiZ3BpbzU2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzUzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzU0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxM19ncm91cHNbXSA9IHsKKwkiZ3BpbzU1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxN19ncm91cHNbXSA9IHsKKwkiZ3BpbzU2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1YV9taTJzX2dyb3Vwc1tdID0geworCSJncGlvNTciLCAiZ3BpbzU4IiwgImdwaW81OSIsICJncGlvNjAiLCAiZ3BpbzYxIiwgImdwaW82MiIsICJncGlvNjMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ2NjX2dwMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzU3IiwgImdwaW83OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMThfZ3JvdXBzW10gPSB7CisJImdwaW81NyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMTlfZ3JvdXBzW10gPSB7CisJImdwaW81OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMjBfZ3JvdXBzW10gPSB7CisJImdwaW81OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcmlfdHJuZzBfZ3JvdXBzW10gPSB7CisJImdwaW82MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMjFfZ3JvdXBzW10gPSB7CisJImdwaW82MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcmlfdHJuZzFfZ3JvdXBzW10gPSB7CisJImdwaW82MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMjJfZ3JvdXBzW10gPSB7CisJImdwaW82MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcmlfdHJuZ19ncm91cHNbXSA9IHsKKwkiZ3BpbzYyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcyM19ncm91cHNbXSA9IHsKKwkiZ3BpbzYyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcyNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzYzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaV9taTJzX2dyb3Vwc1tdID0geworCSJncGlvNjQiLCAiZ3BpbzY1IiwgImdwaW82NyIsICJncGlvNjgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BfY211X2dyb3Vwc1tdID0geworCSJncGlvNjQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzI1X2dyb3Vwc1tdID0geworCSJncGlvNjQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwOF9ncm91cHNbXSA9IHsKKwkiZ3BpbzY1IiwgImdwaW82NiIsICJncGlvNjciLCAiZ3BpbzY4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByaV9taTJzX3dzX2dyb3Vwc1tdID0geworCSJncGlvNjYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3Brcl9pMnNfZ3JvdXBzW10gPSB7CisJImdwaW82OSIsICJncGlvNzAiLCAiZ3BpbzcxIiwgImdwaW83MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19yZWZfZ3JvdXBzW10gPSB7CisJImdwaW82OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0c2Vuc2VfcHdtMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzcxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzZW5zZV9wd20yX2dyb3Vwc1tdID0geworCSJncGlvNzEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnRmbV9zbGltYnVzX2dyb3Vwc1tdID0geworCSJncGlvNzMiLCAiZ3Bpbzc0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3VzYjJfZ3JvdXBzW10gPSB7CisJImdwaW83MyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXJfbWkyc19ncm91cHNbXSA9IHsKKwkiZ3Bpbzc0IiwgImdwaW83NSIsICJncGlvNzYiLCAiZ3Bpbzc3IiwgImdwaW83OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnN19ncm91cHNbXSA9IHsKKwkiZ3Bpbzc0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3VzYjIzX2dyb3Vwc1tdID0geworCSJncGlvNzQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzhfZ3JvdXBzW10gPSB7CisJImdwaW83NSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF91c2IyMl9ncm91cHNbXSA9IHsKKwkiZ3Bpbzc1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWc5X2dyb3Vwc1tdID0geworCSJncGlvNzYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfdXNiMjFfZ3JvdXBzW10gPSB7CisJImdwaW83NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnNF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzc3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3VzYjIwX2dyb3Vwc1tdID0geworCSJncGlvNzciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2VjX21pMnNfZ3JvdXBzW10gPSB7CisJImdwaW83OSIsICJncGlvODAiLCAiZ3BpbzgxIiwgImdwaW84MiIsICJncGlvODMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwMTVfZ3JvdXBzW10gPSB7CisJImdwaW84MSIsICJncGlvODIiLCAiZ3BpbzgzIiwgImdwaW84NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXA1X2dyb3Vwc1tdID0geworCSJncGlvODUiLCAiZ3Bpbzg2IiwgImdwaW84NyIsICJncGlvODgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNpZjFfY2xrX2dyb3Vwc1tdID0geworCSJncGlvODkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwNF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg5IiwgImdwaW85MCIsICJncGlvOTEiLCAiZ3BpbzkyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfY3NfZ3JvdXBzW10gPSB7CisJImdwaW84OSIsICJncGlvOTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGd1X2NoM19ncm91cHNbXSA9IHsKKwkiZ3Bpbzg5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcxMF9ncm91cHNbXSA9IHsKKwkiZ3Bpbzg5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaWYxX2VuX2dyb3Vwc1tdID0geworCSJncGlvOTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRwX3ZzeW5jMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzkwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1kcF92c3luYzFfZ3JvdXBzW10gPSB7CisJImdwaW85MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZHBfdnN5bmMyX2dyb3Vwc1tdID0geworCSJncGlvOTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRwX3ZzeW5jM19ncm91cHNbXSA9IHsKKwkiZ3BpbzkwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRndV9jaDBfZ3JvdXBzW10gPSB7CisJImdwaW85MCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzkwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaWYxX2RhdGFfZ3JvdXBzW10gPSB7CisJImdwaW85MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGM0X2NtZF9ncm91cHNbXSA9IHsKKwkiZ3BpbzkxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGkwX2dyb3Vwc1tdID0geworCSJncGlvOTEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGd1X2NoMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzkxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaWYyX2Vycm9yX2dyb3Vwc1tdID0geworCSJncGlvOTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RjNDNfZ3JvdXBzW10gPSB7CisJImdwaW85MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxc3BpMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzkyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZmcl8xX2dyb3Vwc1tdID0geworCSJncGlvOTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGd1X2NoMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzkyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaWYyX2Nsa19ncm91cHNbXSA9IHsKKwkiZ3BpbzkzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkYzRfY2xrX2dyb3Vwc1tdID0geworCSJncGlvOTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXVwN19ncm91cHNbXSA9IHsKKwkiZ3BpbzkzIiwgImdwaW85NCIsICJncGlvOTUiLCAiZ3Bpbzk2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGkyX2dyb3Vwc1tdID0geworCSJncGlvOTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNpZjJfZW5fZ3JvdXBzW10gPSB7CisJImdwaW85NCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGM0Ml9ncm91cHNbXSA9IHsKKwkiZ3Bpbzk0IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGkzX2dyb3Vwc1tdID0geworCSJncGlvOTQiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHNpZjJfZGF0YV9ncm91cHNbXSA9IHsKKwkiZ3Bpbzk1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkYzQxX2dyb3Vwc1tdID0geworCSJncGlvOTUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcXNwaV9jbGtfZ3JvdXBzW10gPSB7CisJImdwaW85NSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0c2lmMl9zeW5jX2dyb3Vwc1tdID0geworCSJncGlvOTYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RjNDBfZ3JvdXBzW10gPSB7CisJImdwaW85NiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnM19ncm91cHNbXSA9IHsKKwkiZ3Bpbzk2IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkb19lbl9ncm91cHNbXSA9IHsKKwkiZ3Bpbzk3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkb191cGRhdGVfZ3JvdXBzW10gPSB7CisJImdwaW85OCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMTRfZ3JvdXBzW10gPSB7CisJImdwaW85OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMTVfZ3JvdXBzW10gPSB7CisJImdwaW8xMDAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpX2UxX2dyb3Vwc1tdID0geworCSJncGlvMTAyIiwgImdwaW8xMDMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJuZ19yb3NjX2dyb3Vwc1tdID0geworCSJncGlvMTAyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWc1X2dyb3Vwc1tdID0geworCSJncGlvMTAzIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTJfZGF0YV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEwNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxdXAxM19ncm91cHNbXSA9IHsKKwkiZ3BpbzEwNSIsICJncGlvMTA2IiwgImdwaW8xMDciLCAiZ3BpbzEwOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX2Nsa19ncm91cHNbXSA9IHsKKwkiZ3BpbzEwNiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX3Jlc2V0X2dyb3Vwc1tdID0geworCSJncGlvMTA3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTJfcHJlc2VudF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEwOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX2RhdGFfZ3JvdXBzW10gPSB7CisJImdwaW8xMDkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWltMV9jbGtfZ3JvdXBzW10gPSB7CisJImdwaW8xMTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWltMV9yZXNldF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX3ByZXNlbnRfZ3JvdXBzW10gPSB7CisJImdwaW8xMTIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWltX2JhdHRfZ3JvdXBzW10gPSB7CisJImdwaW8xMTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWRwX2hvdF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXZfcHBzX2dyb3Vwc1tdID0geworCSJncGlvMTE0IiwgImdwaW8xMTQiLCAiZ3BpbzExNSIsICJncGlvMTE1IiwgImdwaW8xMjgiLCAiZ3BpbzEyOCIsCisJImdwaW8xMjkiLCAiZ3BpbzEyOSIsICJncGlvMTQzIiwgImdwaW8xNDMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfY2hhcl9ncm91cHNbXSA9IHsKKwkiZ3BpbzExNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhZHNwX2V4dF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyM19ncm91cHNbXSA9IHsKKwkiZ3BpbzExOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzExOSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEyMCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzEyMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxbGlua19yZXF1ZXN0X2dyb3Vwc1tdID0geworCSJncGlvMTMwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFsaW5rX2VuYWJsZV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEzMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwYV9pbmRpY2F0b3JfZ3JvdXBzW10gPSB7CisJImdwaW8xMzUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzI2X2dyb3Vwc1tdID0geworCSJncGlvMTM3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWcyN19ncm91cHNbXSA9IHsKKwkiZ3BpbzEzOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMjhfZ3JvdXBzW10gPSB7CisJImdwaW8xMzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzZfZ3JvdXBzW10gPSB7CisJImdwaW8xNDAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGhhc2VfZmxhZzI5X2dyb3Vwc1tdID0geworCSJncGlvMTQxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBoYXNlX2ZsYWczMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzE0MiIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGFzZV9mbGFnMzFfZ3JvdXBzW10gPSB7CisJImdwaW8xNDMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNzX2x0ZV9ncm91cHNbXSA9IHsKKwkiZ3BpbzE0NCIsICJncGlvMTQ1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cDBfZ3JvdXBzW10gPSB7CisJImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fZ3JvdXBzW10gPSB7CisJImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiwgImdwaW80IiwgImdwaW81IiwgImdwaW82IiwgImdwaW83IiwKKwkiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzEwIiwgImdwaW8xMSIsICJncGlvMTIiLCAiZ3BpbzEzIiwgImdwaW8xNCIsCisJImdwaW8xNSIsICJncGlvMTYiLCAiZ3BpbzE3IiwgImdwaW8xOCIsICJncGlvMTkiLCAiZ3BpbzIwIiwgImdwaW8yMSIsCisJImdwaW8yMiIsICJncGlvMjMiLCAiZ3BpbzI0IiwgImdwaW8yNSIsICJncGlvMjYiLCAiZ3BpbzI3IiwgImdwaW8yOCIsCisJImdwaW8yOSIsICJncGlvMzAiLCAiZ3BpbzMxIiwgImdwaW8zMiIsICJncGlvMzMiLCAiZ3BpbzM0IiwgImdwaW8zNSIsCisJImdwaW8zNiIsICJncGlvMzciLCAiZ3BpbzM4IiwgImdwaW8zOSIsICJncGlvNDAiLCAiZ3BpbzQxIiwgImdwaW80MiIsCisJImdwaW80MyIsICJncGlvNDQiLCAiZ3BpbzQ1IiwgImdwaW80NiIsICJncGlvNDciLCAiZ3BpbzQ4IiwgImdwaW80OSIsCisJImdwaW81MCIsICJncGlvNTEiLCAiZ3BpbzUyIiwgImdwaW81MyIsICJncGlvNTQiLCAiZ3BpbzU1IiwgImdwaW81NiIsCisJImdwaW81NyIsICJncGlvNTgiLCAiZ3BpbzU5IiwgImdwaW82MCIsICJncGlvNjEiLCAiZ3BpbzYyIiwgImdwaW82MyIsCisJImdwaW82NCIsICJncGlvNjUiLCAiZ3BpbzY2IiwgImdwaW82NyIsICJncGlvNjgiLCAiZ3BpbzY5IiwgImdwaW83MCIsCisJImdwaW83MSIsICJncGlvNzIiLCAiZ3BpbzczIiwgImdwaW83NCIsICJncGlvNzUiLCAiZ3Bpbzc2IiwgImdwaW83NyIsCisJImdwaW83OCIsICJncGlvNzkiLCAiZ3BpbzgwIiwgImdwaW84MSIsICJncGlvODIiLCAiZ3BpbzgzIiwgImdwaW84NCIsCisJImdwaW84NSIsICJncGlvODYiLCAiZ3Bpbzg3IiwgImdwaW84OCIsICJncGlvODkiLCAiZ3BpbzkwIiwgImdwaW85MSIsCisJImdwaW85MiIsICJncGlvOTMiLCAiZ3Bpbzk0IiwgImdwaW85NSIsICJncGlvOTYiLCAiZ3Bpbzk3IiwgImdwaW85OCIsCisJImdwaW85OSIsICJncGlvMTAwIiwgImdwaW8xMDEiLCAiZ3BpbzEwMiIsICJncGlvMTAzIiwgImdwaW8xMDQiLAorCSJncGlvMTA1IiwgImdwaW8xMDYiLCAiZ3BpbzEwNyIsICJncGlvMTA4IiwgImdwaW8xMDkiLCAiZ3BpbzExMCIsCisJImdwaW8xMTEiLCAiZ3BpbzExMiIsICJncGlvMTEzIiwgImdwaW8xMTQiLCAiZ3BpbzExNSIsICJncGlvMTE2IiwKKwkiZ3BpbzExNyIsICJncGlvMTE4IiwgImdwaW8xMTkiLCAiZ3BpbzEyMCIsICJncGlvMTIxIiwgImdwaW8xMjIiLAorCSJncGlvMTIzIiwgImdwaW8xMjQiLCAiZ3BpbzEyNSIsICJncGlvMTI2IiwgImdwaW8xMjciLCAiZ3BpbzEyOCIsCisJImdwaW8xMjkiLCAiZ3BpbzEzMCIsICJncGlvMTMxIiwgImdwaW8xMzIiLCAiZ3BpbzEzMyIsICJncGlvMTM0IiwKKwkiZ3BpbzEzNSIsICJncGlvMTM2IiwgImdwaW8xMzciLCAiZ3BpbzEzOCIsICJncGlvMTM5IiwgImdwaW8xNDAiLAorCSJncGlvMTQxIiwgImdwaW8xNDIiLCAiZ3BpbzE0MyIsICJncGlvMTQ0IiwgImdwaW8xNDUiLCAiZ3BpbzE0NiIsCisJImdwaW8xNDciLCAiZ3BpbzE0OCIsICJncGlvMTQ5IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cDlfZ3JvdXBzW10gPSB7CisJImdwaW80IiwgImdwaW81IiwgImdwaW82IiwgImdwaW83IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfY3RpX2dyb3Vwc1tdID0geworCSJncGlvNCIsICJncGlvNSIsICJncGlvNTEiLCAiZ3BpbzUyIiwgImdwaW82MiIsICJncGlvNjMiLCAiZ3BpbzkwIiwKKwkiZ3BpbzkxIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRkcl9weGkwX2dyb3Vwc1tdID0geworCSJncGlvNiIsICJncGlvNyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZHJfYmlzdF9ncm91cHNbXSA9IHsKKwkiZ3BpbzciLCAiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzEwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3RzZW5zMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdnNlbnNlX3RyaWdnZXJfZ3JvdXBzW10gPSB7CisJImdwaW83IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3VzYjFfZ3JvdXBzW10gPSB7CisJImdwaW83IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cF9sNF9ncm91cHNbXSA9IHsKKwkiZ3BpbzgiLCAiZ3BpbzM1IiwgImdwaW8xMDUiLCAiZ3BpbzEyMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3bGFuMV9hZGMxX2dyb3Vwc1tdID0geworCSJncGlvOCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF91c2IxM19ncm91cHNbXSA9IHsKKwkiZ3BpbzgiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGRyX3B4aTFfZ3JvdXBzW10gPSB7CisJImdwaW84IiwgImdwaW85IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cF9sNV9ncm91cHNbXSA9IHsKKwkiZ3BpbzkiLCAiZ3BpbzM2IiwgImdwaW8xMDYiLCAiZ3BpbzEyNCIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3bGFuMV9hZGMwX2dyb3Vwc1tdID0geworCSJncGlvOSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF91c2IxMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRwX3ZzeW5jX2dyb3Vwc1tdID0geworCSJncGlvMTAiLCAiZ3BpbzExIiwgImdwaW8xMiIsICJncGlvOTciLCAiZ3Bpbzk4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHF1cF9sNl9ncm91cHNbXSA9IHsKKwkiZ3BpbzEwIiwgImdwaW8zNyIsICJncGlvMTA3IiwgImdwaW8xMjUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd2xhbjJfYWRjMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzEwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X3VzYjExX2dyb3Vwc1tdID0geworCSJncGlvMTAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGRyX3B4aTJfZ3JvdXBzW10gPSB7CisJImdwaW8xMCIsICJncGlvMTEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZWRwX2xjZF9ncm91cHNbXSA9IHsKKwkiZ3BpbzExIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRiZ19vdXRfZ3JvdXBzW10gPSB7CisJImdwaW8xMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3bGFuMl9hZGMwX2dyb3Vwc1tdID0geworCSJncGlvMTEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXRlc3RfdXNiMTBfZ3JvdXBzW10gPSB7CisJImdwaW8xMSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtX3ZvY19ncm91cHNbXSA9IHsKKwkiZ3BpbzEyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaWYxX3N5bmNfZ3JvdXBzW10gPSB7CisJImdwaW8xMiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9mdW5jdGlvbiBzZG04NDVfZnVuY3Rpb25zW10gPSB7CisJRlVOQ1RJT04oZGRyX3B4aTMpLAorCUZVTkNUSU9OKGNhbV9tY2xrKSwKKwlGVU5DVElPTihwbGxfYnlwYXNzbmwpLAorCUZVTkNUSU9OKHFkc3NfZ3BpbzApLAorCUZVTkNUSU9OKHBsbF9yZXNldCksCisJRlVOQ1RJT04ocWRzc19ncGlvMSksCisJRlVOQ1RJT04ocWRzc19ncGlvMiksCisJRlVOQ1RJT04ocWRzc19ncGlvMyksCisJRlVOQ1RJT04oY2NpX2kyYyksCisJRlVOQ1RJT04ocXVwMSksCisJRlVOQ1RJT04ocWRzc19ncGlvNCksCisJRlVOQ1RJT04ocWRzc19ncGlvNSksCisJRlVOQ1RJT04ocWRzc19ncGlvNiksCisJRlVOQ1RJT04ocWRzc19ncGlvNyksCisJRlVOQ1RJT04oY2NpX3RpbWVyMCksCisJRlVOQ1RJT04oZ2NjX2dwMiksCisJRlVOQ1RJT04ocWRzc19ncGlvOCksCisJRlVOQ1RJT04oY2NpX3RpbWVyMSksCisJRlVOQ1RJT04oZ2NjX2dwMyksCisJRlVOQ1RJT04ocWRzc19ncGlvKSwKKwlGVU5DVElPTihjY2lfdGltZXIyKSwKKwlGVU5DVElPTihxZHNzX2dwaW85KSwKKwlGVU5DVElPTihjY2lfdGltZXIzKSwKKwlGVU5DVElPTihjY2lfYXN5bmMpLAorCUZVTkNUSU9OKHFkc3NfZ3BpbzEwKSwKKwlGVU5DVElPTihjY2lfdGltZXI0KSwKKwlGVU5DVElPTihxZHNzX2dwaW8xMSksCisJRlVOQ1RJT04ocWRzc19ncGlvMTIpLAorCUZVTkNUSU9OKHF1cDIpLAorCUZVTkNUSU9OKHFkc3NfZ3BpbzEzKSwKKwlGVU5DVElPTihxZHNzX2dwaW8xNCksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzEpLAorCUZVTkNUSU9OKHFkc3NfZ3BpbzE1KSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMiksCisJRlVOQ1RJT04ocXVwMTEpLAorCUZVTkNUSU9OKHF1cDE0KSwKKwlGVU5DVElPTihwY2lfZTApLAorCUZVTkNUSU9OKGppdHRlcl9iaXN0KSwKKwlGVU5DVElPTihwbGxfYmlzdCksCisJRlVOQ1RJT04oYXRlc3RfdHNlbnMpLAorCUZVTkNUSU9OKGFnZXJhX3BsbCksCisJRlVOQ1RJT04odXNiX3BoeSksCisJRlVOQ1RJT04obHBhc3Nfc2xpbWJ1cyksCisJRlVOQ1RJT04oc2Rfd3JpdGUpLAorCUZVTkNUSU9OKHRzaWYxX2Vycm9yKSwKKwlGVU5DVElPTihxdXAzKSwKKwlGVU5DVElPTihxdXA2KSwKKwlGVU5DVElPTihxdXAxMiksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzE2KSwKKwlGVU5DVElPTihxdXAxMCksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzExKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMTIpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWcxMyksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzE3KSwKKwlGVU5DVElPTihxdWFfbWkycyksCisJRlVOQ1RJT04oZ2NjX2dwMSksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzE4KSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMTkpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWcyMCksCisJRlVOQ1RJT04oY3JpX3RybmcwKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMjEpLAorCUZVTkNUSU9OKGNyaV90cm5nMSksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzIyKSwKKwlGVU5DVElPTihjcmlfdHJuZyksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzIzKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMjQpLAorCUZVTkNUSU9OKHByaV9taTJzKSwKKwlGVU5DVElPTihzcF9jbXUpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWcyNSksCisJRlVOQ1RJT04ocXVwOCksCisJRlVOQ1RJT04ocHJpX21pMnNfd3MpLAorCUZVTkNUSU9OKHNwa3JfaTJzKSwKKwlGVU5DVElPTihhdWRpb19yZWYpLAorCUZVTkNUSU9OKHRzZW5zZV9wd20xKSwKKwlGVU5DVElPTih0c2Vuc2VfcHdtMiksCisJRlVOQ1RJT04oYnRmbV9zbGltYnVzKSwKKwlGVU5DVElPTihhdGVzdF91c2IyKSwKKwlGVU5DVElPTih0ZXJfbWkycyksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzcpLAorCUZVTkNUSU9OKGF0ZXN0X3VzYjIzKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnOCksCisJRlVOQ1RJT04oYXRlc3RfdXNiMjIpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWc5KSwKKwlGVU5DVElPTihhdGVzdF91c2IyMSksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzQpLAorCUZVTkNUSU9OKGF0ZXN0X3VzYjIwKSwKKwlGVU5DVElPTihzZWNfbWkycyksCisJRlVOQ1RJT04ocXVwMTUpLAorCUZVTkNUSU9OKHF1cDUpLAorCUZVTkNUSU9OKHRzaWYxX2NsayksCisJRlVOQ1RJT04ocXVwNCksCisJRlVOQ1RJT04ocXNwaV9jcyksCisJRlVOQ1RJT04odGd1X2NoMyksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzEwKSwKKwlGVU5DVElPTih0c2lmMV9lbiksCisJRlVOQ1RJT04obWRwX3ZzeW5jMCksCisJRlVOQ1RJT04obWRwX3ZzeW5jMSksCisJRlVOQ1RJT04obWRwX3ZzeW5jMiksCisJRlVOQ1RJT04obWRwX3ZzeW5jMyksCisJRlVOQ1RJT04odGd1X2NoMCksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzApLAorCUZVTkNUSU9OKHRzaWYxX2RhdGEpLAorCUZVTkNUSU9OKHNkYzRfY21kKSwKKwlGVU5DVElPTihxc3BpMCksCisJRlVOQ1RJT04odGd1X2NoMSksCisJRlVOQ1RJT04odHNpZjJfZXJyb3IpLAorCUZVTkNUSU9OKHNkYzQzKSwKKwlGVU5DVElPTihxc3BpMSksCisJRlVOQ1RJT04odmZyXzEpLAorCUZVTkNUSU9OKHRndV9jaDIpLAorCUZVTkNUSU9OKHRzaWYyX2NsayksCisJRlVOQ1RJT04oc2RjNF9jbGspLAorCUZVTkNUSU9OKHF1cDcpLAorCUZVTkNUSU9OKHFzcGkyKSwKKwlGVU5DVElPTih0c2lmMl9lbiksCisJRlVOQ1RJT04oc2RjNDIpLAorCUZVTkNUSU9OKHFzcGkzKSwKKwlGVU5DVElPTih0c2lmMl9kYXRhKSwKKwlGVU5DVElPTihzZGM0MSksCisJRlVOQ1RJT04ocXNwaV9jbGspLAorCUZVTkNUSU9OKHRzaWYyX3N5bmMpLAorCUZVTkNUSU9OKHNkYzQwKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMyksCisJRlVOQ1RJT04obGRvX2VuKSwKKwlGVU5DVElPTihsZG9fdXBkYXRlKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMTQpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWcxNSksCisJRlVOQ1RJT04ocGNpX2UxKSwKKwlGVU5DVElPTihwcm5nX3Jvc2MpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWc1KSwKKwlGVU5DVElPTih1aW0yX2RhdGEpLAorCUZVTkNUSU9OKHF1cDEzKSwKKwlGVU5DVElPTih1aW0yX2NsayksCisJRlVOQ1RJT04odWltMl9yZXNldCksCisJRlVOQ1RJT04odWltMl9wcmVzZW50KSwKKwlGVU5DVElPTih1aW0xX2RhdGEpLAorCUZVTkNUSU9OKHVpbTFfY2xrKSwKKwlGVU5DVElPTih1aW0xX3Jlc2V0KSwKKwlGVU5DVElPTih1aW0xX3ByZXNlbnQpLAorCUZVTkNUSU9OKHVpbV9iYXR0KSwKKwlGVU5DVElPTihlZHBfaG90KSwKKwlGVU5DVElPTihuYXZfcHBzKSwKKwlGVU5DVElPTihhdGVzdF9jaGFyKSwKKwlGVU5DVElPTihhZHNwX2V4dCksCisJRlVOQ1RJT04oYXRlc3RfY2hhcjMpLAorCUZVTkNUSU9OKGF0ZXN0X2NoYXIyKSwKKwlGVU5DVElPTihhdGVzdF9jaGFyMSksCisJRlVOQ1RJT04oYXRlc3RfY2hhcjApLAorCUZVTkNUSU9OKHFsaW5rX3JlcXVlc3QpLAorCUZVTkNUSU9OKHFsaW5rX2VuYWJsZSksCisJRlVOQ1RJT04ocGFfaW5kaWNhdG9yKSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMjYpLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWcyNyksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzI4KSwKKwlGVU5DVElPTihwaGFzZV9mbGFnNiksCisJRlVOQ1RJT04ocGhhc2VfZmxhZzI5KSwKKwlGVU5DVElPTihwaGFzZV9mbGFnMzApLAorCUZVTkNUSU9OKHBoYXNlX2ZsYWczMSksCisJRlVOQ1RJT04obXNzX2x0ZSksCisJRlVOQ1RJT04ocXVwMCksCisJRlVOQ1RJT04oZ3BpbyksCisJRlVOQ1RJT04ocXVwOSksCisJRlVOQ1RJT04ocWRzc19jdGkpLAorCUZVTkNUSU9OKGRkcl9weGkwKSwKKwlGVU5DVElPTihkZHJfYmlzdCksCisJRlVOQ1RJT04oYXRlc3RfdHNlbnMyKSwKKwlGVU5DVElPTih2c2Vuc2VfdHJpZ2dlciksCisJRlVOQ1RJT04oYXRlc3RfdXNiMSksCisJRlVOQ1RJT04ocXVwX2w0KSwKKwlGVU5DVElPTih3bGFuMV9hZGMxKSwKKwlGVU5DVElPTihhdGVzdF91c2IxMyksCisJRlVOQ1RJT04oZGRyX3B4aTEpLAorCUZVTkNUSU9OKHF1cF9sNSksCisJRlVOQ1RJT04od2xhbjFfYWRjMCksCisJRlVOQ1RJT04oYXRlc3RfdXNiMTIpLAorCUZVTkNUSU9OKG1kcF92c3luYyksCisJRlVOQ1RJT04ocXVwX2w2KSwKKwlGVU5DVElPTih3bGFuMl9hZGMxKSwKKwlGVU5DVElPTihhdGVzdF91c2IxMSksCisJRlVOQ1RJT04oZGRyX3B4aTIpLAorCUZVTkNUSU9OKGVkcF9sY2QpLAorCUZVTkNUSU9OKGRiZ19vdXQpLAorCUZVTkNUSU9OKHdsYW4yX2FkYzApLAorCUZVTkNUSU9OKGF0ZXN0X3VzYjEwKSwKKwlGVU5DVElPTihtX3ZvYyksCisJRlVOQ1RJT04odHNpZjFfc3luYyksCit9OworCisvKiBFdmVyeSBwaW4gaXMgbWFpbnRhaW5lZCBhcyBhIHNpbmdsZSBncm91cCwgYW5kIG1pc3Npbmcgb3Igbm9uLWV4aXN0aW5nIHBpbgorICogd291bGQgYmUgbWFpbnRhaW5lZCBhcyBkdW1teSBncm91cCB0byBzeW5jaHJvbml6ZSBwaW4gZ3JvdXAgaW5kZXggd2l0aAorICogcGluIGRlc2NyaXB0b3IgcmVnaXN0ZXJlZCB3aXRoIHBpbmN0cmwgY29yZS4KKyAqIENsaWVudHMgd291bGQgbm90IGJlIGFibGUgdG8gcmVxdWVzdCB0aGVzZSBkdW1teSBwaW4gZ3JvdXBzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9waW5ncm91cCBzZG04NDVfZ3JvdXBzW10gPSB7CisJWzBdID0gUElOR1JPVVAoMCwgRUFTVCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzFdID0gUElOR1JPVVAoMSwgRUFTVCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzJdID0gUElOR1JPVVAoMiwgRUFTVCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzNdID0gUElOR1JPVVAoMywgRUFTVCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzRdID0gUElOR1JPVVAoNCwgTk9SVEgsIHF1cDksIHFkc3NfY3RpLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJICAgICAgIE5BKSwKKwlbNV0gPSBQSU5HUk9VUCg1LCBOT1JUSCwgcXVwOSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkgICAgICAgTkEpLAorCVs2XSA9IFBJTkdST1VQKDYsIE5PUlRILCBxdXA5LCBOQSwgZGRyX3B4aTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCSAgICAgICBOQSksCisJWzddID0gUElOR1JPVVAoNywgTk9SVEgsIHF1cDksIGRkcl9iaXN0LCBOQSwgYXRlc3RfdHNlbnMyLAorCQkgICAgICAgdnNlbnNlX3RyaWdnZXIsIGF0ZXN0X3VzYjEsIGRkcl9weGkwLCBOQSwgTkEsIE5BKSwKKwlbOF0gPSBQSU5HUk9VUCg4LCBFQVNULCBxdXBfbDQsIE5BLCBkZHJfYmlzdCwgTkEsIE5BLCB3bGFuMV9hZGMxLAorCQkgICAgICAgYXRlc3RfdXNiMTMsIGRkcl9weGkxLCBOQSwgTkEpLAorCVs5XSA9IFBJTkdST1VQKDksIEVBU1QsIHF1cF9sNSwgZGRyX2Jpc3QsIE5BLCB3bGFuMV9hZGMwLCBhdGVzdF91c2IxMiwKKwkJICAgICAgIGRkcl9weGkxLCBOQSwgTkEsIE5BLCBOQSksCisJWzEwXSA9IFBJTkdST1VQKDEwLCBFQVNULCBtZHBfdnN5bmMsIHF1cF9sNiwgZGRyX2Jpc3QsIHdsYW4yX2FkYzEsCisJCQlhdGVzdF91c2IxMSwgZGRyX3B4aTIsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTFdID0gUElOR1JPVVAoMTEsIEVBU1QsIG1kcF92c3luYywgZWRwX2xjZCwgZGJnX291dCwgd2xhbjJfYWRjMCwKKwkJCWF0ZXN0X3VzYjEwLCBkZHJfcHhpMiwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMl0gPSBQSU5HUk9VUCgxMiwgU09VVEgsIG1kcF92c3luYywgbV92b2MsIHRzaWYxX3N5bmMsIGRkcl9weGkzLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzXSA9IFBJTkdST1VQKDEzLCBTT1VUSCwgY2FtX21jbGssIHBsbF9ieXBhc3NubCwgcWRzc19ncGlvMCwKKwkJCWRkcl9weGkzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTRdID0gUElOR1JPVVAoMTQsIFNPVVRILCBjYW1fbWNsaywgcGxsX3Jlc2V0LCBxZHNzX2dwaW8xLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVsxNV0gPSBQSU5HUk9VUCgxNSwgU09VVEgsIGNhbV9tY2xrLCBxZHNzX2dwaW8yLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMTZdID0gUElOR1JPVVAoMTYsIFNPVVRILCBjYW1fbWNsaywgcWRzc19ncGlvMywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzE3XSA9IFBJTkdST1VQKDE3LCBTT1VUSCwgY2NpX2kyYywgcXVwMSwgcWRzc19ncGlvNCwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMThdID0gUElOR1JPVVAoMTgsIFNPVVRILCBjY2lfaTJjLCBxdXAxLCBOQSwgcWRzc19ncGlvNSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVsxOV0gPSBQSU5HUk9VUCgxOSwgU09VVEgsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzIwXSA9IFBJTkdST1VQKDIwLCBTT1VUSCwgY2NpX2kyYywgcXVwMSwgTkEsIHFkc3NfZ3BpbzcsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMjFdID0gUElOR1JPVVAoMjEsIFNPVVRILCBjY2lfdGltZXIwLCBnY2NfZ3AyLCBxZHNzX2dwaW84LCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVsyMl0gPSBQSU5HUk9VUCgyMiwgU09VVEgsIGNjaV90aW1lcjEsIGdjY19ncDMsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BKSwKKwlbMjNdID0gUElOR1JPVVAoMjMsIFNPVVRILCBjY2lfdGltZXIyLCBxZHNzX2dwaW85LCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMjRdID0gUElOR1JPVVAoMjQsIFNPVVRILCBjY2lfdGltZXIzLCBjY2lfYXN5bmMsIHFkc3NfZ3BpbzEwLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsyNV0gPSBQSU5HUk9VUCgyNSwgU09VVEgsIGNjaV90aW1lcjQsIGNjaV9hc3luYywgcWRzc19ncGlvMTEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzI2XSA9IFBJTkdST1VQKDI2LCBTT1VUSCwgY2NpX2FzeW5jLCBxZHNzX2dwaW8xMiwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzI3XSA9IFBJTkdST1VQKDI3LCBFQVNULCBxdXAyLCBxZHNzX2dwaW8xMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzI4XSA9IFBJTkdST1VQKDI4LCBFQVNULCBxdXAyLCBxZHNzX2dwaW8xNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzI5XSA9IFBJTkdST1VQKDI5LCBFQVNULCBxdXAyLCBOQSwgcGhhc2VfZmxhZzEsIHFkc3NfZ3BpbzE1LCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzMwXSA9IFBJTkdST1VQKDMwLCBFQVNULCBxdXAyLCBwaGFzZV9mbGFnMiwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVszMV0gPSBQSU5HUk9VUCgzMSwgTk9SVEgsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzMyXSA9IFBJTkdST1VQKDMyLCBOT1JUSCwgcXVwMTEsIHF1cDE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbMzNdID0gUElOR1JPVVAoMzMsIE5PUlRILCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVszNF0gPSBQSU5HUk9VUCgzNCwgTk9SVEgsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzM1XSA9IFBJTkdST1VQKDM1LCBTT1VUSCwgcGNpX2UwLCBxdXBfbDQsIGppdHRlcl9iaXN0LCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVszNl0gPSBQSU5HUk9VUCgzNiwgU09VVEgsIHBjaV9lMCwgcXVwX2w1LCBwbGxfYmlzdCwgTkEsIGF0ZXN0X3RzZW5zLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMzddID0gUElOR1JPVVAoMzcsIFNPVVRILCBxdXBfbDYsIGFnZXJhX3BsbCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzM4XSA9IFBJTkdST1VQKDM4LCBOT1JUSCwgdXNiX3BoeSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzM5XSA9IFBJTkdST1VQKDM5LCBFQVNULCBscGFzc19zbGltYnVzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzQwXSA9IFBJTkdST1VQKDQwLCBTT1VUSCwgc2Rfd3JpdGUsIHRzaWYxX2Vycm9yLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbNDFdID0gUElOR1JPVVAoNDEsIEVBU1QsIHF1cDMsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs0Ml0gPSBQSU5HUk9VUCg0MiwgRUFTVCwgcXVwMywgTkEsIHFkc3NfZ3BpbzcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzQzXSA9IFBJTkdST1VQKDQzLCBFQVNULCBxdXAzLCBOQSwgcWRzc19ncGlvMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzQ0XSA9IFBJTkdST1VQKDQ0LCBFQVNULCBxdXAzLCBOQSwgcWRzc19ncGlvMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzQ1XSA9IFBJTkdST1VQKDQ1LCBFQVNULCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNDZdID0gUElOR1JPVVAoNDYsIEVBU1QsIHF1cDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs0N10gPSBQSU5HUk9VUCg0NywgRUFTVCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ4XSA9IFBJTkdST1VQKDQ4LCBFQVNULCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNDldID0gUElOR1JPVVAoNDksIE5PUlRILCBxdXAxMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzUwXSA9IFBJTkdST1VQKDUwLCBOT1JUSCwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs1MV0gPSBQSU5HUk9VUCg1MSwgTk9SVEgsIHF1cDEyLCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzUyXSA9IFBJTkdST1VQKDUyLCBOT1JUSCwgcXVwMTIsIHBoYXNlX2ZsYWcxNiwgcWRzc19jdGksIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzUzXSA9IFBJTkdST1VQKDUzLCBOT1JUSCwgcXVwMTAsIHBoYXNlX2ZsYWcxMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzU0XSA9IFBJTkdST1VQKDU0LCBOT1JUSCwgcXVwMTAsIE5BLCBwaGFzZV9mbGFnMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzU1XSA9IFBJTkdST1VQKDU1LCBOT1JUSCwgcXVwMTAsIHBoYXNlX2ZsYWcxMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzU2XSA9IFBJTkdST1VQKDU2LCBOT1JUSCwgcXVwMTAsIHBoYXNlX2ZsYWcxNywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzU3XSA9IFBJTkdST1VQKDU3LCBOT1JUSCwgcXVhX21pMnMsIGdjY19ncDEsIHBoYXNlX2ZsYWcxOCwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BKSwKKwlbNThdID0gUElOR1JPVVAoNTgsIE5PUlRILCBxdWFfbWkycywgZ2NjX2dwMiwgcGhhc2VfZmxhZzE5LCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs1OV0gPSBQSU5HUk9VUCg1OSwgTk9SVEgsIHF1YV9taTJzLCBnY2NfZ3AzLCBwaGFzZV9mbGFnMjAsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzYwXSA9IFBJTkdST1VQKDYwLCBOT1JUSCwgcXVhX21pMnMsIGNyaV90cm5nMCwgcGhhc2VfZmxhZzIxLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs2MV0gPSBQSU5HUk9VUCg2MSwgTk9SVEgsIHF1YV9taTJzLCBjcmlfdHJuZzEsIHBoYXNlX2ZsYWcyMiwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNjJdID0gUElOR1JPVVAoNjIsIE5PUlRILCBxdWFfbWkycywgY3JpX3RybmcsIHBoYXNlX2ZsYWcyMywgcWRzc19jdGksCisJCQlOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNjNdID0gUElOR1JPVVAoNjMsIE5PUlRILCBxdWFfbWkycywgTkEsIHBoYXNlX2ZsYWcyNCwgcWRzc19jdGksIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNjRdID0gUElOR1JPVVAoNjQsIE5PUlRILCBwcmlfbWkycywgc3BfY211LCBwaGFzZV9mbGFnMjUsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzY1XSA9IFBJTkdST1VQKDY1LCBOT1JUSCwgcHJpX21pMnMsIHF1cDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs2Nl0gPSBQSU5HUk9VUCg2NiwgTk9SVEgsIHByaV9taTJzX3dzLCBxdXA4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNjddID0gUElOR1JPVVAoNjcsIE5PUlRILCBwcmlfbWkycywgcXVwOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzY4XSA9IFBJTkdST1VQKDY4LCBOT1JUSCwgcHJpX21pMnMsIHF1cDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs2OV0gPSBQSU5HUk9VUCg2OSwgRUFTVCwgc3Brcl9pMnMsIGF1ZGlvX3JlZiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzcwXSA9IFBJTkdST1VQKDcwLCBFQVNULCBscGFzc19zbGltYnVzLCBzcGtyX2kycywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzcxXSA9IFBJTkdST1VQKDcxLCBFQVNULCBscGFzc19zbGltYnVzLCBzcGtyX2kycywgdHNlbnNlX3B3bTEsCisJCQl0c2Vuc2VfcHdtMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzcyXSA9IFBJTkdST1VQKDcyLCBFQVNULCBscGFzc19zbGltYnVzLCBzcGtyX2kycywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzczXSA9IFBJTkdST1VQKDczLCBFQVNULCBidGZtX3NsaW1idXMsIGF0ZXN0X3VzYjIsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs3NF0gPSBQSU5HUk9VUCg3NCwgRUFTVCwgYnRmbV9zbGltYnVzLCB0ZXJfbWkycywgcGhhc2VfZmxhZzcsCisJCQlhdGVzdF91c2IyMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzc1XSA9IFBJTkdST1VQKDc1LCBFQVNULCB0ZXJfbWkycywgcGhhc2VfZmxhZzgsIHFkc3NfZ3BpbzgsCisJCQlhdGVzdF91c2IyMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzc2XSA9IFBJTkdST1VQKDc2LCBFQVNULCB0ZXJfbWkycywgcGhhc2VfZmxhZzksIHFkc3NfZ3BpbzksCisJCQlhdGVzdF91c2IyMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzc3XSA9IFBJTkdST1VQKDc3LCBFQVNULCB0ZXJfbWkycywgcGhhc2VfZmxhZzQsIHFkc3NfZ3BpbzEwLAorCQkJYXRlc3RfdXNiMjAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs3OF0gPSBQSU5HUk9VUCg3OCwgRUFTVCwgdGVyX21pMnMsIGdjY19ncDEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs3OV0gPSBQSU5HUk9VUCg3OSwgTk9SVEgsIHNlY19taTJzLCBOQSwgTkEsIHFkc3NfZ3BpbzExLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzgwXSA9IFBJTkdST1VQKDgwLCBOT1JUSCwgc2VjX21pMnMsIE5BLCBxZHNzX2dwaW8xMiwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbODFdID0gUElOR1JPVVAoODEsIE5PUlRILCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs4Ml0gPSBQSU5HUk9VUCg4MiwgTk9SVEgsIHNlY19taTJzLCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzgzXSA9IFBJTkdST1VQKDgzLCBOT1JUSCwgc2VjX21pMnMsIHF1cDE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbODRdID0gUElOR1JPVVAoODQsIE5PUlRILCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzg1XSA9IFBJTkdST1VQKDg1LCBFQVNULCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODZdID0gUElOR1JPVVAoODYsIEVBU1QsIHF1cDUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4N10gPSBQSU5HUk9VUCg4NywgRUFTVCwgcXVwNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzg4XSA9IFBJTkdST1VQKDg4LCBFQVNULCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODldID0gUElOR1JPVVAoODksIFNPVVRILCB0c2lmMV9jbGssIHF1cDQsIHFzcGlfY3MsIHRndV9jaDMsCisJCQlwaGFzZV9mbGFnMTAsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzkwXSA9IFBJTkdST1VQKDkwLCBTT1VUSCwgdHNpZjFfZW4sIG1kcF92c3luYzAsIHF1cDQsIHFzcGlfY3MsCisJCQltZHBfdnN5bmMxLCBtZHBfdnN5bmMyLCBtZHBfdnN5bmMzLCB0Z3VfY2gwLAorCQkJcGhhc2VfZmxhZzAsIHFkc3NfY3RpKSwKKwlbOTFdID0gUElOR1JPVVAoOTEsIFNPVVRILCB0c2lmMV9kYXRhLCBzZGM0X2NtZCwgcXVwNCwgcXNwaTAsIHRndV9jaDEsCisJCQlOQSwgcWRzc19jdGksIE5BLCBOQSwgTkEpLAorCVs5Ml0gPSBQSU5HUk9VUCg5MiwgU09VVEgsIHRzaWYyX2Vycm9yLCBzZGM0MywgcXVwNCwgcXNwaTEsIHZmcl8xLAorCQkJdGd1X2NoMiwgTkEsIE5BLCBOQSwgTkEpLAorCVs5M10gPSBQSU5HUk9VUCg5MywgU09VVEgsIHRzaWYyX2Nsaywgc2RjNF9jbGssIHF1cDcsIHFzcGkyLCBOQSwKKwkJCXFkc3NfZ3BpbzEzLCBOQSwgTkEsIE5BLCBOQSksCisJWzk0XSA9IFBJTkdST1VQKDk0LCBTT1VUSCwgdHNpZjJfZW4sIHNkYzQyLCBxdXA3LCBxc3BpMywgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs5NV0gPSBQSU5HUk9VUCg5NSwgU09VVEgsIHRzaWYyX2RhdGEsIHNkYzQxLCBxdXA3LCBxc3BpX2NsaywgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs5Nl0gPSBQSU5HUk9VUCg5NiwgU09VVEgsIHRzaWYyX3N5bmMsIHNkYzQwLCBxdXA3LCBwaGFzZV9mbGFnMywgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs5N10gPSBQSU5HUk9VUCg5NywgTk9SVEgsIE5BLCBOQSwgbWRwX3ZzeW5jLCBsZG9fZW4sIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbOThdID0gUElOR1JPVVAoOTgsIE5PUlRILCBOQSwgbWRwX3ZzeW5jLCBsZG9fdXBkYXRlLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs5OV0gPSBQSU5HUk9VUCg5OSwgTk9SVEgsIHBoYXNlX2ZsYWcxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVsxMDBdID0gUElOR1JPVVAoMTAwLCBOT1JUSCwgcGhhc2VfZmxhZzE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMDFdID0gUElOR1JPVVAoMTAxLCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMDJdID0gUElOR1JPVVAoMTAyLCBOT1JUSCwgcGNpX2UxLCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTAzXSA9IFBJTkdST1VQKDEwMywgTk9SVEgsIHBjaV9lMSwgcGhhc2VfZmxhZzUsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BKSwKKwlbMTA0XSA9IFBJTkdST1VQKDEwNCwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTA1XSA9IFBJTkdST1VQKDEwNSwgTk9SVEgsIHVpbTJfZGF0YSwgcXVwMTMsIHF1cF9sNCwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSksCisJWzEwNl0gPSBQSU5HUk9VUCgxMDYsIE5PUlRILCB1aW0yX2NsaywgcXVwMTMsIHF1cF9sNSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSksCisJWzEwN10gPSBQSU5HUk9VUCgxMDcsIE5PUlRILCB1aW0yX3Jlc2V0LCBxdXAxMywgcXVwX2w2LCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BKSwKKwlbMTA4XSA9IFBJTkdST1VQKDEwOCwgTk9SVEgsIHVpbTJfcHJlc2VudCwgcXVwMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BKSwKKwlbMTA5XSA9IFBJTkdST1VQKDEwOSwgTk9SVEgsIHVpbTFfZGF0YSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BKSwKKwlbMTEwXSA9IFBJTkdST1VQKDExMCwgTk9SVEgsIHVpbTFfY2xrLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEpLAorCVsxMTFdID0gUElOR1JPVVAoMTExLCBOT1JUSCwgdWltMV9yZXNldCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTEyXSA9IFBJTkdST1VQKDExMiwgTk9SVEgsIHVpbTFfcHJlc2VudCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTEzXSA9IFBJTkdST1VQKDExMywgTk9SVEgsIHVpbV9iYXR0LCBlZHBfaG90LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNF0gPSBQSU5HUk9VUCgxMTQsIE5PUlRILCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNV0gPSBQSU5HUk9VUCgxMTUsIE5PUlRILCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNl0gPSBQSU5HUk9VUCgxMTYsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzExN10gPSBQSU5HUk9VUCgxMTcsIE5PUlRILCBOQSwgcWRzc19ncGlvMCwgYXRlc3RfY2hhciwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BLCBOQSksCisJWzExOF0gPSBQSU5HUk9VUCgxMTgsIE5PUlRILCBhZHNwX2V4dCwgTkEsIHFkc3NfZ3BpbzEsIGF0ZXN0X2NoYXIzLCBOQSwKKwkJCSBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMTldID0gUElOR1JPVVAoMTE5LCBOT1JUSCwgTkEsIHFkc3NfZ3BpbzIsIGF0ZXN0X2NoYXIyLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTIwXSA9IFBJTkdST1VQKDEyMCwgTk9SVEgsIE5BLCBxZHNzX2dwaW8zLCBhdGVzdF9jaGFyMSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BLCBOQSksCisJWzEyMV0gPSBQSU5HUk9VUCgxMjEsIE5PUlRILCBOQSwgcWRzc19ncGlvNCwgYXRlc3RfY2hhcjAsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSwgTkEpLAorCVsxMjJdID0gUElOR1JPVVAoMTIyLCBFQVNULCBOQSwgcWRzc19ncGlvNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEpLAorCVsxMjNdID0gUElOR1JPVVAoMTIzLCBFQVNULCBxdXBfbDQsIE5BLCBxZHNzX2dwaW8sIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMjRdID0gUElOR1JPVVAoMTI0LCBFQVNULCBxdXBfbDUsIE5BLCBxZHNzX2dwaW8sIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMjVdID0gUElOR1JPVVAoMTI1LCBFQVNULCBxdXBfbDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMjZdID0gUElOR1JPVVAoMTI2LCBFQVNULCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEyN10gPSBQSU5HUk9VUCgxMjcsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEyOF0gPSBQSU5HUk9VUCgxMjgsIE5PUlRILCBuYXZfcHBzLCBuYXZfcHBzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEyOV0gPSBQSU5HUk9VUCgxMjksIE5PUlRILCBuYXZfcHBzLCBuYXZfcHBzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzMF0gPSBQSU5HUk9VUCgxMzAsIE5PUlRILCBxbGlua19yZXF1ZXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMzFdID0gUElOR1JPVVAoMTMxLCBOT1JUSCwgcWxpbmtfZW5hYmxlLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMzJdID0gUElOR1JPVVAoMTMyLCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMzNdID0gUElOR1JPVVAoMTMzLCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMzRdID0gUElOR1JPVVAoMTM0LCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMzVdID0gUElOR1JPVVAoMTM1LCBOT1JUSCwgTkEsIHBhX2luZGljYXRvciwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMzZdID0gUElOR1JPVVAoMTM2LCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMzddID0gUElOR1JPVVAoMTM3LCBOT1JUSCwgTkEsIE5BLCBwaGFzZV9mbGFnMjYsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMzhdID0gUElOR1JPVVAoMTM4LCBOT1JUSCwgTkEsIE5BLCBwaGFzZV9mbGFnMjcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMzldID0gUElOR1JPVVAoMTM5LCBOT1JUSCwgTkEsIHBoYXNlX2ZsYWcyOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxNDBdID0gUElOR1JPVVAoMTQwLCBOT1JUSCwgTkEsIE5BLCBwaGFzZV9mbGFnNiwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzE0MV0gPSBQSU5HUk9VUCgxNDEsIE5PUlRILCBOQSwgcGhhc2VfZmxhZzI5LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzE0Ml0gPSBQSU5HUk9VUCgxNDIsIE5PUlRILCBOQSwgcGhhc2VfZmxhZzMwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzE0M10gPSBQSU5HUk9VUCgxNDMsIE5PUlRILCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIHBoYXNlX2ZsYWczMSwKKwkJCSBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxNDRdID0gUElOR1JPVVAoMTQ0LCBOT1JUSCwgbXNzX2x0ZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BKSwKKwlbMTQ1XSA9IFBJTkdST1VQKDE0NSwgTk9SVEgsIG1zc19sdGUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSksCisJWzE0Nl0gPSBQSU5HUk9VUCgxNDYsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0N10gPSBQSU5HUk9VUCgxNDcsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0OF0gPSBQSU5HUk9VUCgxNDgsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0OV0gPSBQSU5HUk9VUCgxNDksIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE1MF0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2NsaywgMHg5OWEwMDAsIDE0LCA2KSwKKwlbMTUxXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzJfY21kLCAweDk5YTAwMCwgMTEsIDMpLAorCVsxNTJdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9kYXRhLCAweDk5YTAwMCwgOSwgMCksCisJWzE1M10gPSBVRlNfUkVTRVQodWZzX3Jlc2V0LCAweDk5ZjAwMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9kaXJfY29ubiBzZG04NDVfZGlyX2Nvbm5bXSA9IHsKKwl7MSwgNTEwfSwKKwl7MywgNTExfSwKKwl7NSwgNTEyfSwKKwl7MTAsIDUxM30sCisJezExLCA1MTR9LAorCXsyMCwgNTE1fSwKKwl7MjIsIDUxNn0sCisJezI0LCA1MTd9LAorCXsyNiwgNTE4fSwKKwl7MzAsIDUxOX0sCisJezMxLCA2Mzl9LAorCXszMiwgNTIxfSwKKwl7MzQsIDUyMn0sCisJezM2LCA1MjN9LAorCXszNywgNTI0fSwKKwl7MzgsIDUyNX0sCisJezM5LCA1MjZ9LAorCXs0MCwgNTI3fSwKKwl7NDEsIDYzN30sCisJezQzLCA1Mjl9LAorCXs0NCwgNTMwfSwKKwl7NDYsIDUzMX0sCisJezQ4LCA1MzJ9LAorCXs0OSwgNjQwfSwKKwl7NTIsIDUzNH0sCisJezUzLCA1MzV9LAorCXs1NCwgNTM2fSwKKwl7NTYsIDUzN30sCisJezU3LCA1Mzh9LAorCXs1OCwgNTM5fSwKKwl7NTksIDU0MH0sCisJezYwLCA1NDF9LAorCXs2MSwgNTQyfSwKKwl7NjIsIDU0M30sCisJezYzLCA1NDR9LAorCXs2NCwgNTQ1fSwKKwl7NjYsIDU0Nn0sCisJezY4LCA1NDd9LAorCXs3MSwgNTQ4fSwKKwl7NzMsIDU0OX0sCisJezc3LCA1NTB9LAorCXs3OCwgNTUxfSwKKwl7NzksIDU1Mn0sCisJezgwLCA1NTN9LAorCXs4NCwgNTU0fSwKKwl7ODUsIDU1NX0sCisJezg2LCA1NTZ9LAorCXs4OCwgNTU3fSwKKwl7ODksIDYzOH0sCisJezkxLCA1NTl9LAorCXs5MiwgNTYwfSwKKwl7OTUsIDU2MX0sCisJezk2LCA1NjJ9LAorCXs5NywgNTYzfSwKKwl7MTAxLCA1NjR9LAorCXsxMDMsIDU2NX0sCisJezEwNCwgNTY2fSwKKwl7MTE1LCA1NzB9LAorCXsxMTYsIDU3MX0sCisJezExNywgNTcyfSwKKwl7MTE4LCA1NzN9LAorCXsxMTksIDYwOX0sCisJezEyMCwgNjEwfSwKKwl7MTIxLCA2MTF9LAorCXsxMjIsIDYxMn0sCisJezEyMywgNjEzfSwKKwl7MTI0LCA2MTR9LAorCXsxMjUsIDYxNX0sCisJezEyNywgNjE3fSwKKwl7MTI4LCA2MTh9LAorCXsxMjksIDYxOX0sCisJezEzMCwgNjIwfSwKKwl7MTMyLCA2MjF9LAorCXsxMzMsIDYyMn0sCisJezE0NSwgNjIzfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNtX3BpbmN0cmxfc29jX2RhdGEgc2RtODQ1X3BpbmN0cmwgPSB7CisJLnBpbnMgPSBzZG04NDVfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKHNkbTg0NV9waW5zKSwKKwkuZnVuY3Rpb25zID0gc2RtODQ1X2Z1bmN0aW9ucywKKwkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUoc2RtODQ1X2Z1bmN0aW9ucyksCisJLmdyb3VwcyA9IHNkbTg0NV9ncm91cHMsCisJLm5ncm91cHMgPSBBUlJBWV9TSVpFKHNkbTg0NV9ncm91cHMpLAorCS5uZ3Bpb3MgPSAxNTAsCisJLmRpcl9jb25uID0gc2RtODQ1X2Rpcl9jb25uLAorCS5uX2Rpcl9jb25ucyA9IEFSUkFZX1NJWkUoc2RtODQ1X2Rpcl9jb25uKSwKK307CisKK3N0YXRpYyBpbnQgc2RtODQ1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gbXNtX3BpbmN0cmxfcHJvYmUocGRldiwgJnNkbTg0NV9waW5jdHJsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RtODQ1X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc2RtODQ1LXBpbmN0cmwtdjIiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkbTg0NV9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzZG04NDUtdjItcGluY3RybCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzZG04NDVfcGluY3RybF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHNkbTg0NV9waW5jdHJsX3Byb2JlLAorCS5yZW1vdmUgPSBtc21fcGluY3RybF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZG04NDVfcGluY3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2RtODQ1X3BpbmN0cmxfZHJpdmVyKTsKK30KK2FyY2hfaW5pdGNhbGwoc2RtODQ1X3BpbmN0cmxfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZG04NDVfcGluY3RybF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNkbTg0NV9waW5jdHJsX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzZG04NDVfcGluY3RybF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRVEkgc2RtODQ1LXYyIHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZG04NDVfcGluY3RybF9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkbTg0NS5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zZG04NDUuYwppbmRleCA4ZmFhYmIwLi5iN2UwNmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkbTg0NS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc2RtODQ1LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC0yNSw4ICsyNSwxMCBAQAogCQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoZm5hbWUjI19ncm91cHMpLAlcCiAJfQogCisjZGVmaW5lIE5PUlRICTB4MDA1MDAwMDAKKyNkZWZpbmUgU09VVEgJMHgwMDkwMDAwMAogI2RlZmluZSBSRUdfU0laRSAweDEwMDAKLSNkZWZpbmUgUElOR1JPVVAoaWQsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjkpCVwKKyNkZWZpbmUgUElOR1JPVVAoaWQsIGJhc2UsIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYsIGY3LCBmOCwgZjksIGYxMCkJXAogCXsJCQkJCQlcCiAJCS5uYW1lID0gImdwaW8iICNpZCwJCQlcCiAJCS5waW5zID0gZ3BpbyMjaWQjI19waW5zLAkJXApAQCAtNDEsMTQgKzQzLDE1IEBACiAJCQltc21fbXV4XyMjZjYsCQkJXAogCQkJbXNtX211eF8jI2Y3LAkJCVwKIAkJCW1zbV9tdXhfIyNmOCwJCQlcCi0JCQltc21fbXV4XyMjZjkJCQlcCisJCQltc21fbXV4XyMjZjksCQkJXAorCQkJbXNtX211eF8jI2YxMAkJCVwKIAkJfSwJCQkJCVwKLQkJLm5mdW5jcyA9IDEwLAkJCQlcCi0JCS5jdGxfcmVnID0gUkVHX1NJWkUgKiBpZCwJCVwKLQkJLmlvX3JlZyA9IDB4NCArIFJFR19TSVpFICogaWQsCQlcCi0JCS5pbnRyX2NmZ19yZWcgPSAweDggKyBSRUdfU0laRSAqIGlkLAlcCi0JCS5pbnRyX3N0YXR1c19yZWcgPSAweGMgKyBSRUdfU0laRSAqIGlkLAlcCi0JCS5pbnRyX3RhcmdldF9yZWcgPSAweDggKyBSRUdfU0laRSAqIGlkLAlcCisJCS5uZnVuY3MgPSAxMSwJCQkJXAorCQkuY3RsX3JlZyA9IGJhc2UgKyBSRUdfU0laRSAqIGlkLAkJXAorCQkuaW9fcmVnID0gYmFzZSArIDB4NCArIFJFR19TSVpFICogaWQsCQlcCisJCS5pbnRyX2NmZ19yZWcgPSBiYXNlICsgMHg4ICsgUkVHX1NJWkUgKiBpZCwJXAorCQkuaW50cl9zdGF0dXNfcmVnID0gYmFzZSArIDB4YyArIFJFR19TSVpFICogaWQsCVwKKwkJLmludHJfdGFyZ2V0X3JlZyA9IGJhc2UgKyAweDggKyBSRUdfU0laRSAqIGlkLAlcCiAJCS5tdXhfYml0ID0gMiwJCQlcCiAJCS5wdWxsX2JpdCA9IDAsCQkJXAogCQkuZHJ2X2JpdCA9IDYsCQkJXApAQCAtMTE0LDEwICsxMTcsNiBAQAogCQkuaW50cl9kZXRlY3Rpb25fYml0ID0gLTEsCQlcCiAJCS5pbnRyX2RldGVjdGlvbl93aWR0aCA9IC0xLAkJXAogCX0KLQotc3RhdGljIGNvbnN0IHUzMiBzZG04NDVfdGlsZV9vZmZzZXRzW10gPSB7MHg1MDAwMDAsIDB4OTAwMDAwLCAweDEwMDAwMH07Ci1zdGF0aWMgdTMyIHNkbTg0NV9waW5fYmFzZVsxNTBdOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2Mgc2RtODQ1X3BpbnNbXSA9IHsKIAlQSU5DVFJMX1BJTigwLCAiR1BJT18wIiksCiAJUElOQ1RSTF9QSU4oMSwgIkdQSU9fMSIpLApAQCAtMTM3MSwyNTUgKzEzNzAsMjc4IEBACiAgKiBDbGllbnRzIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlcXVlc3QgdGhlc2UgZHVtbXkgcGluIGdyb3Vwcy4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgc2RtODQ1X2dyb3Vwc1tdID0gewotCVswXSA9IFBJTkdST1VQKDAsIHF1cDAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzFdID0gUElOR1JPVVAoMSwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMl0gPSBQSU5HUk9VUCgyLCBxdXAwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVszXSA9IFBJTkdST1VQKDMsIHF1cDAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzRdID0gUElOR1JPVVAoNCwgcXVwOSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNV0gPSBQSU5HUk9VUCg1LCBxdXA5LCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs2XSA9IFBJTkdST1VQKDYsIHF1cDksIE5BLCBkZHJfcHhpMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzddID0gUElOR1JPVVAoNywgcXVwOSwgZGRyX2Jpc3QsIE5BLCBhdGVzdF90c2VuczIsCi0JCSAgICAgICB2c2Vuc2VfdHJpZ2dlciwgYXRlc3RfdXNiMSwgZGRyX3B4aTAsIE5BLCBOQSksCi0JWzhdID0gUElOR1JPVVAoOCwgcXVwX2w0LCBOQSwgZGRyX2Jpc3QsIE5BLCBOQSwgd2xhbjFfYWRjMSwKLQkJICAgICAgIGF0ZXN0X3VzYjEzLCBkZHJfcHhpMSwgTkEpLAotCVs5XSA9IFBJTkdST1VQKDksIHF1cF9sNSwgZGRyX2Jpc3QsIE5BLCB3bGFuMV9hZGMwLCBhdGVzdF91c2IxMiwKLQkJICAgICAgIGRkcl9weGkxLCBOQSwgTkEsIE5BKSwKLQlbMTBdID0gUElOR1JPVVAoMTAsIG1kcF92c3luYywgcXVwX2w2LCBkZHJfYmlzdCwgd2xhbjJfYWRjMSwKLQkJCWF0ZXN0X3VzYjExLCBkZHJfcHhpMiwgTkEsIE5BLCBOQSksCi0JWzExXSA9IFBJTkdST1VQKDExLCBtZHBfdnN5bmMsIGVkcF9sY2QsIGRiZ19vdXQsIHdsYW4yX2FkYzAsCi0JCQlhdGVzdF91c2IxMCwgZGRyX3B4aTIsIE5BLCBOQSwgTkEpLAotCVsxMl0gPSBQSU5HUk9VUCgxMiwgbWRwX3ZzeW5jLCBtX3ZvYywgdHNpZjFfc3luYywgZGRyX3B4aTMsIE5BLAotCQkJTkEsIE5BLCBOQSwgTkEpLAotCVsxM10gPSBQSU5HUk9VUCgxMywgY2FtX21jbGssIHBsbF9ieXBhc3NubCwgcWRzc19ncGlvMCwKLQkJCWRkcl9weGkzLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxNF0gPSBQSU5HUk9VUCgxNCwgY2FtX21jbGssIHBsbF9yZXNldCwgcWRzc19ncGlvMSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSwgTkEpLAotCVsxNV0gPSBQSU5HUk9VUCgxNSwgY2FtX21jbGssIHFkc3NfZ3BpbzIsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSksCi0JWzE2XSA9IFBJTkdST1VQKDE2LCBjYW1fbWNsaywgcWRzc19ncGlvMywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMTddID0gUElOR1JPVVAoMTcsIGNjaV9pMmMsIHF1cDEsIHFkc3NfZ3BpbzQsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMThdID0gUElOR1JPVVAoMTgsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW81LCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMTldID0gUElOR1JPVVAoMTksIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMjBdID0gUElOR1JPVVAoMjAsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW83LCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMjFdID0gUElOR1JPVVAoMjEsIGNjaV90aW1lcjAsIGdjY19ncDIsIHFkc3NfZ3BpbzgsIE5BLCBOQSwgTkEsCi0JCQlOQSwgTkEsIE5BKSwKLQlbMjJdID0gUElOR1JPVVAoMjIsIGNjaV90aW1lcjEsIGdjY19ncDMsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSwgTkEpLAotCVsyM10gPSBQSU5HUk9VUCgyMywgY2NpX3RpbWVyMiwgcWRzc19ncGlvOSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbMjRdID0gUElOR1JPVVAoMjQsIGNjaV90aW1lcjMsIGNjaV9hc3luYywgcWRzc19ncGlvMTAsIE5BLCBOQSwKLQkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbMjVdID0gUElOR1JPVVAoMjUsIGNjaV90aW1lcjQsIGNjaV9hc3luYywgcWRzc19ncGlvMTEsIE5BLCBOQSwKLQkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbMjZdID0gUElOR1JPVVAoMjYsIGNjaV9hc3luYywgcWRzc19ncGlvMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSksCi0JWzI3XSA9IFBJTkdST1VQKDI3LCBxdXAyLCBxZHNzX2dwaW8xMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbMjhdID0gUElOR1JPVVAoMjgsIHF1cDIsIHFkc3NfZ3BpbzE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEpLAotCVsyOV0gPSBQSU5HUk9VUCgyOSwgcXVwMiwgTkEsIHBoYXNlX2ZsYWcxLCBxZHNzX2dwaW8xNSwgTkEsIE5BLAotCQkJTkEsIE5BLCBOQSksCi0JWzMwXSA9IFBJTkdST1VQKDMwLCBxdXAyLCBwaGFzZV9mbGFnMiwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSksCi0JWzMxXSA9IFBJTkdST1VQKDMxLCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMzJdID0gUElOR1JPVVAoMzIsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVszM10gPSBQSU5HUk9VUCgzMywgcXVwMTEsIHF1cDE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzM0XSA9IFBJTkdST1VQKDM0LCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMzVdID0gUElOR1JPVVAoMzUsIHBjaV9lMCwgcXVwX2w0LCBqaXR0ZXJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSwgTkEpLAotCVszNl0gPSBQSU5HUk9VUCgzNiwgcGNpX2UwLCBxdXBfbDUsIHBsbF9iaXN0LCBOQSwgYXRlc3RfdHNlbnMsCi0JCQlOQSwgTkEsIE5BLCBOQSksCi0JWzM3XSA9IFBJTkdST1VQKDM3LCBxdXBfbDYsIGFnZXJhX3BsbCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbMzhdID0gUElOR1JPVVAoMzgsIHVzYl9waHksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzM5XSA9IFBJTkdST1VQKDM5LCBscGFzc19zbGltYnVzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbNDBdID0gUElOR1JPVVAoNDAsIHNkX3dyaXRlLCB0c2lmMV9lcnJvciwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbNDFdID0gUElOR1JPVVAoNDEsIHF1cDMsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNDJdID0gUElOR1JPVVAoNDIsIHF1cDMsIE5BLCBxZHNzX2dwaW83LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNDNdID0gUElOR1JPVVAoNDMsIHF1cDMsIE5BLCBxZHNzX2dwaW8xNCwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEpLAotCVs0NF0gPSBQSU5HUk9VUCg0NCwgcXVwMywgTkEsIHFkc3NfZ3BpbzE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSksCi0JWzQ1XSA9IFBJTkdST1VQKDQ1LCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs0Nl0gPSBQSU5HUk9VUCg0NiwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNDddID0gUElOR1JPVVAoNDcsIHF1cDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzQ4XSA9IFBJTkdST1VQKDQ4LCBxdXA2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs0OV0gPSBQSU5HUk9VUCg0OSwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzUwXSA9IFBJTkdST1VQKDUwLCBxdXAxMiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNTFdID0gUElOR1JPVVAoNTEsIHF1cDEyLCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs1Ml0gPSBQSU5HUk9VUCg1MiwgcXVwMTIsIHBoYXNlX2ZsYWcxNiwgcWRzc19jdGksIE5BLCBOQSwgTkEsCi0JCQlOQSwgTkEsIE5BKSwKLQlbNTNdID0gUElOR1JPVVAoNTMsIHF1cDEwLCBwaGFzZV9mbGFnMTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSksCi0JWzU0XSA9IFBJTkdST1VQKDU0LCBxdXAxMCwgTkEsIHBoYXNlX2ZsYWcxMiwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEpLAotCVs1NV0gPSBQSU5HUk9VUCg1NSwgcXVwMTAsIHBoYXNlX2ZsYWcxMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbNTZdID0gUElOR1JPVVAoNTYsIHF1cDEwLCBwaGFzZV9mbGFnMTcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSksCi0JWzU3XSA9IFBJTkdST1VQKDU3LCBxdWFfbWkycywgZ2NjX2dwMSwgcGhhc2VfZmxhZzE4LCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BLCBOQSksCi0JWzU4XSA9IFBJTkdST1VQKDU4LCBxdWFfbWkycywgZ2NjX2dwMiwgcGhhc2VfZmxhZzE5LCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BLCBOQSksCi0JWzU5XSA9IFBJTkdST1VQKDU5LCBxdWFfbWkycywgZ2NjX2dwMywgcGhhc2VfZmxhZzIwLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BLCBOQSksCi0JWzYwXSA9IFBJTkdST1VQKDYwLCBxdWFfbWkycywgY3JpX3RybmcwLCBwaGFzZV9mbGFnMjEsIE5BLCBOQSwKLQkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbNjFdID0gUElOR1JPVVAoNjEsIHF1YV9taTJzLCBjcmlfdHJuZzEsIHBoYXNlX2ZsYWcyMiwgTkEsIE5BLAotCQkJTkEsIE5BLCBOQSwgTkEpLAotCVs2Ml0gPSBQSU5HUk9VUCg2MiwgcXVhX21pMnMsIGNyaV90cm5nLCBwaGFzZV9mbGFnMjMsIHFkc3NfY3RpLAorCVswXSA9IFBJTkdST1VQKDAsIE5PUlRILCBxdXAwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMV0gPSBQSU5HUk9VUCgxLCBOT1JUSCwgcXVwMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzJdID0gUElOR1JPVVAoMiwgTk9SVEgsIHF1cDAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszXSA9IFBJTkdST1VQKDMsIE5PUlRILCBxdXAwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNF0gPSBQSU5HUk9VUCg0LCBOT1JUSCwgcXVwOSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkgICAgICAgTkEpLAorCVs1XSA9IFBJTkdST1VQKDUsIE5PUlRILCBxdXA5LCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCSAgICAgICBOQSksCisJWzZdID0gUElOR1JPVVAoNiwgTk9SVEgsIHF1cDksIE5BLCBkZHJfcHhpMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJICAgICAgIE5BKSwKKwlbN10gPSBQSU5HUk9VUCg3LCBOT1JUSCwgcXVwOSwgZGRyX2Jpc3QsIE5BLCBhdGVzdF90c2VuczIsCisJCSAgICAgICB2c2Vuc2VfdHJpZ2dlciwgYXRlc3RfdXNiMSwgZGRyX3B4aTAsIE5BLCBOQSwgTkEpLAorCVs4XSA9IFBJTkdST1VQKDgsIE5PUlRILCBxdXBfbDQsIE5BLCBkZHJfYmlzdCwgTkEsIE5BLCB3bGFuMV9hZGMxLAorCQkgICAgICAgYXRlc3RfdXNiMTMsIGRkcl9weGkxLCBOQSwgTkEpLAorCVs5XSA9IFBJTkdST1VQKDksIE5PUlRILCBxdXBfbDUsIGRkcl9iaXN0LCBOQSwgd2xhbjFfYWRjMCwgYXRlc3RfdXNiMTIsCisJCSAgICAgICBkZHJfcHhpMSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMF0gPSBQSU5HUk9VUCgxMCwgTk9SVEgsIG1kcF92c3luYywgcXVwX2w2LCBkZHJfYmlzdCwgd2xhbjJfYWRjMSwKKwkJCWF0ZXN0X3VzYjExLCBkZHJfcHhpMiwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMV0gPSBQSU5HUk9VUCgxMSwgTk9SVEgsIG1kcF92c3luYywgZWRwX2xjZCwgZGJnX291dCwgd2xhbjJfYWRjMCwKKwkJCWF0ZXN0X3VzYjEwLCBkZHJfcHhpMiwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMl0gPSBQSU5HUk9VUCgxMiwgU09VVEgsIG1kcF92c3luYywgbV92b2MsIHRzaWYxX3N5bmMsIGRkcl9weGkzLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzYzXSA9IFBJTkdST1VQKDYzLCBxdWFfbWkycywgTkEsIHBoYXNlX2ZsYWcyNCwgcWRzc19jdGksIE5BLAorCVsxM10gPSBQSU5HUk9VUCgxMywgU09VVEgsIGNhbV9tY2xrLCBwbGxfYnlwYXNzbmwsIHFkc3NfZ3BpbzAsCisJCQlkZHJfcHhpMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0XSA9IFBJTkdST1VQKDE0LCBTT1VUSCwgY2FtX21jbGssIHBsbF9yZXNldCwgcWRzc19ncGlvMSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbNjRdID0gUElOR1JPVVAoNjQsIHByaV9taTJzLCBzcF9jbXUsIHBoYXNlX2ZsYWcyNSwgTkEsIE5BLCBOQSwKKwlbMTVdID0gUElOR1JPVVAoMTUsIFNPVVRILCBjYW1fbWNsaywgcWRzc19ncGlvMiwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEsIE5BLCBOQSksCi0JWzY1XSA9IFBJTkdST1VQKDY1LCBwcmlfbWkycywgcXVwOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs2Nl0gPSBQSU5HUk9VUCg2NiwgcHJpX21pMnNfd3MsIHF1cDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSksCi0JWzY3XSA9IFBJTkdST1VQKDY3LCBwcmlfbWkycywgcXVwOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs2OF0gPSBQSU5HUk9VUCg2OCwgcHJpX21pMnMsIHF1cDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNjldID0gUElOR1JPVVAoNjksIHNwa3JfaTJzLCBhdWRpb19yZWYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSksCi0JWzcwXSA9IFBJTkdST1VQKDcwLCBscGFzc19zbGltYnVzLCBzcGtyX2kycywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEsIE5BKSwKLQlbNzFdID0gUElOR1JPVVAoNzEsIGxwYXNzX3NsaW1idXMsIHNwa3JfaTJzLCB0c2Vuc2VfcHdtMSwKLQkJCXRzZW5zZV9wd20yLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs3Ml0gPSBQSU5HUk9VUCg3MiwgbHBhc3Nfc2xpbWJ1cywgc3Brcl9pMnMsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSksCi0JWzczXSA9IFBJTkdST1VQKDczLCBidGZtX3NsaW1idXMsIGF0ZXN0X3VzYjIsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BLCBOQSksCi0JWzc0XSA9IFBJTkdST1VQKDc0LCBidGZtX3NsaW1idXMsIHRlcl9taTJzLCBwaGFzZV9mbGFnNywKLQkJCWF0ZXN0X3VzYjIzLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs3NV0gPSBQSU5HUk9VUCg3NSwgdGVyX21pMnMsIHBoYXNlX2ZsYWc4LCBxZHNzX2dwaW84LAotCQkJYXRlc3RfdXNiMjIsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzc2XSA9IFBJTkdST1VQKDc2LCB0ZXJfbWkycywgcGhhc2VfZmxhZzksIHFkc3NfZ3BpbzksCi0JCQlhdGVzdF91c2IyMSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNzddID0gUElOR1JPVVAoNzcsIHRlcl9taTJzLCBwaGFzZV9mbGFnNCwgcWRzc19ncGlvMTAsCi0JCQlhdGVzdF91c2IyMCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbNzhdID0gUElOR1JPVVAoNzgsIHRlcl9taTJzLCBnY2NfZ3AxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEpLAotCVs3OV0gPSBQSU5HUk9VUCg3OSwgc2VjX21pMnMsIE5BLCBOQSwgcWRzc19ncGlvMTEsIE5BLCBOQSwgTkEsCi0JCQlOQSwgTkEpLAotCVs4MF0gPSBQSU5HUk9VUCg4MCwgc2VjX21pMnMsIE5BLCBxZHNzX2dwaW8xMiwgTkEsIE5BLCBOQSwgTkEsCi0JCQlOQSwgTkEpLAotCVs4MV0gPSBQSU5HUk9VUCg4MSwgc2VjX21pMnMsIHF1cDE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzgyXSA9IFBJTkdST1VQKDgyLCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbODNdID0gUElOR1JPVVAoODMsIHNlY19taTJzLCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs4NF0gPSBQSU5HUk9VUCg4NCwgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzg1XSA9IFBJTkdST1VQKDg1LCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs4Nl0gPSBQSU5HUk9VUCg4NiwgcXVwNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbODddID0gUElOR1JPVVAoODcsIHF1cDUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzg4XSA9IFBJTkdST1VQKDg4LCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVs4OV0gPSBQSU5HUk9VUCg4OSwgdHNpZjFfY2xrLCBxdXA0LCB0Z3VfY2gzLCBwaGFzZV9mbGFnMTAsIE5BLAorCVsxNl0gPSBQSU5HUk9VUCgxNiwgU09VVEgsIGNhbV9tY2xrLCBxZHNzX2dwaW8zLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMTddID0gUElOR1JPVVAoMTcsIFNPVVRILCBjY2lfaTJjLCBxdXAxLCBxZHNzX2dwaW80LCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVsxOF0gPSBQSU5HUk9VUCgxOCwgU09VVEgsIGNjaV9pMmMsIHF1cDEsIE5BLCBxZHNzX2dwaW81LCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzE5XSA9IFBJTkdST1VQKDE5LCBTT1VUSCwgY2NpX2kyYywgcXVwMSwgTkEsIHFkc3NfZ3BpbzYsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMjBdID0gUElOR1JPVVAoMjAsIFNPVVRILCBjY2lfaTJjLCBxdXAxLCBOQSwgcWRzc19ncGlvNywgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVsyMV0gPSBQSU5HUk9VUCgyMSwgU09VVEgsIGNjaV90aW1lcjAsIGdjY19ncDIsIHFkc3NfZ3BpbzgsIE5BLCBOQSwgTkEsCiAJCQlOQSwgTkEsIE5BLCBOQSksCi0JWzkwXSA9IFBJTkdST1VQKDkwLCB0c2lmMV9lbiwgbWRwX3ZzeW5jMCwgcXVwNCwgbWRwX3ZzeW5jMSwKLQkJCW1kcF92c3luYzIsIG1kcF92c3luYzMsIHRndV9jaDAsIHBoYXNlX2ZsYWcwLCBxZHNzX2N0aSksCi0JWzkxXSA9IFBJTkdST1VQKDkxLCB0c2lmMV9kYXRhLCBzZGM0X2NtZCwgcXVwNCwgdGd1X2NoMSwgTkEsCi0JCQlxZHNzX2N0aSwgTkEsIE5BLCBOQSksCi0JWzkyXSA9IFBJTkdST1VQKDkyLCB0c2lmMl9lcnJvciwgc2RjNDMsIHF1cDQsIHZmcl8xLCB0Z3VfY2gyLAorCVsyMl0gPSBQSU5HUk9VUCgyMiwgU09VVEgsIGNjaV90aW1lcjEsIGdjY19ncDMsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbOTNdID0gUElOR1JPVVAoOTMsIHRzaWYyX2Nsaywgc2RjNF9jbGssIHF1cDcsIE5BLCBxZHNzX2dwaW8xMywKLQkJCU5BLCBOQSwgTkEsIE5BKSwKLQlbOTRdID0gUElOR1JPVVAoOTQsIHRzaWYyX2VuLCBzZGM0MiwgcXVwNywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJTkEpLAotCVs5NV0gPSBQSU5HUk9VUCg5NSwgdHNpZjJfZGF0YSwgc2RjNDEsIHF1cDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbOTZdID0gUElOR1JPVVAoOTYsIHRzaWYyX3N5bmMsIHNkYzQwLCBxdXA3LCBwaGFzZV9mbGFnMywgTkEsCi0JCQlOQSwgTkEsIE5BLCBOQSksCi0JWzk3XSA9IFBJTkdST1VQKDk3LCBOQSwgTkEsIG1kcF92c3luYywgbGRvX2VuLCBOQSwgTkEsIE5BLCBOQSwKLQkJCU5BKSwKLQlbOThdID0gUElOR1JPVVAoOTgsIE5BLCBtZHBfdnN5bmMsIGxkb191cGRhdGUsIE5BLCBOQSwgTkEsIE5BLAorCVsyM10gPSBQSU5HUk9VUCgyMywgU09VVEgsIGNjaV90aW1lcjIsIHFkc3NfZ3BpbzksIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVsyNF0gPSBQSU5HUk9VUCgyNCwgU09VVEgsIGNjaV90aW1lcjMsIGNjaV9hc3luYywgcWRzc19ncGlvMTAsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzI1XSA9IFBJTkdST1VQKDI1LCBTT1VUSCwgY2NpX3RpbWVyNCwgY2NpX2FzeW5jLCBxZHNzX2dwaW8xMSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMjZdID0gUElOR1JPVVAoMjYsIFNPVVRILCBjY2lfYXN5bmMsIHFkc3NfZ3BpbzEyLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMjddID0gUElOR1JPVVAoMjcsIE5PUlRILCBxdXAyLCBxZHNzX2dwaW8xMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKIAkJCU5BLCBOQSksCi0JWzk5XSA9IFBJTkdST1VQKDk5LCBwaGFzZV9mbGFnMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVsyOF0gPSBQSU5HUk9VUCgyOCwgTk9SVEgsIHF1cDIsIHFkc3NfZ3BpbzE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbMjldID0gUElOR1JPVVAoMjksIE5PUlRILCBxdXAyLCBOQSwgcGhhc2VfZmxhZzEsIHFkc3NfZ3BpbzE1LCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzMwXSA9IFBJTkdST1VQKDMwLCBOT1JUSCwgcXVwMiwgcGhhc2VfZmxhZzIsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BKSwKKwlbMzFdID0gUElOR1JPVVAoMzEsIE5PUlRILCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJTkEpLAotCVsxMDBdID0gUElOR1JPVVAoMTAwLCBwaGFzZV9mbGFnMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTAxXSA9IFBJTkdST1VQKDEwMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEwMl0gPSBQSU5HUk9VUCgxMDIsIHBjaV9lMSwgcHJuZ19yb3NjLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTAzXSA9IFBJTkdST1VQKDEwMywgcGNpX2UxLCBwaGFzZV9mbGFnNSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCVszMl0gPSBQSU5HUk9VUCgzMiwgTk9SVEgsIHF1cDExLCBxdXAxNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzMzXSA9IFBJTkdST1VQKDMzLCBOT1JUSCwgcXVwMTEsIHF1cDE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbMzRdID0gUElOR1JPVVAoMzQsIE5PUlRILCBxdXAxMSwgcXVwMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVszNV0gPSBQSU5HUk9VUCgzNSwgU09VVEgsIHBjaV9lMCwgcXVwX2w0LCBqaXR0ZXJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMzZdID0gUElOR1JPVVAoMzYsIFNPVVRILCBwY2lfZTAsIHF1cF9sNSwgcGxsX2Jpc3QsIE5BLCBhdGVzdF90c2VucywKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzM3XSA9IFBJTkdST1VQKDM3LCBTT1VUSCwgcXVwX2w2LCBhZ2VyYV9wbGwsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVszOF0gPSBQSU5HUk9VUCgzOCwgTk9SVEgsIHVzYl9waHksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszOV0gPSBQSU5HUk9VUCgzOSwgTk9SVEgsIGxwYXNzX3NsaW1idXMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNDBdID0gUElOR1JPVVAoNDAsIFNPVVRILCBzZF93cml0ZSwgdHNpZjFfZXJyb3IsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs0MV0gPSBQSU5HUk9VUCg0MSwgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW82LCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs0Ml0gPSBQSU5HUk9VUCg0MiwgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW83LCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs0M10gPSBQSU5HUk9VUCg0MywgU09VVEgsIHF1cDMsIE5BLCBxZHNzX2dwaW8xNCwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNDRdID0gUElOR1JPVVAoNDQsIFNPVVRILCBxdXAzLCBOQSwgcWRzc19ncGlvMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzQ1XSA9IFBJTkdST1VQKDQ1LCBOT1JUSCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ2XSA9IFBJTkdST1VQKDQ2LCBOT1JUSCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ3XSA9IFBJTkdST1VQKDQ3LCBOT1JUSCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ4XSA9IFBJTkdST1VQKDQ4LCBOT1JUSCwgcXVwNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ5XSA9IFBJTkdST1VQKDQ5LCBOT1JUSCwgcXVwMTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs1MF0gPSBQSU5HUk9VUCg1MCwgTk9SVEgsIHF1cDEyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNTFdID0gUElOR1JPVVAoNTEsIE5PUlRILCBxdXAxMiwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs1Ml0gPSBQSU5HUk9VUCg1MiwgTk9SVEgsIHF1cDEyLCBwaGFzZV9mbGFnMTYsIHFkc3NfY3RpLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs1M10gPSBQSU5HUk9VUCg1MywgTk9SVEgsIHF1cDEwLCBwaGFzZV9mbGFnMTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs1NF0gPSBQSU5HUk9VUCg1NCwgTk9SVEgsIHF1cDEwLCBOQSwgcGhhc2VfZmxhZzEyLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs1NV0gPSBQSU5HUk9VUCg1NSwgTk9SVEgsIHF1cDEwLCBwaGFzZV9mbGFnMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs1Nl0gPSBQSU5HUk9VUCg1NiwgTk9SVEgsIHF1cDEwLCBwaGFzZV9mbGFnMTcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs1N10gPSBQSU5HUk9VUCg1NywgTk9SVEgsIHF1YV9taTJzLCBnY2NfZ3AxLCBwaGFzZV9mbGFnMTgsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSksCisJWzU4XSA9IFBJTkdST1VQKDU4LCBOT1JUSCwgcXVhX21pMnMsIGdjY19ncDIsIHBoYXNlX2ZsYWcxOSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BKSwKKwlbNTldID0gUElOR1JPVVAoNTksIE5PUlRILCBxdWFfbWkycywgZ2NjX2dwMywgcGhhc2VfZmxhZzIwLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs2MF0gPSBQSU5HUk9VUCg2MCwgTk9SVEgsIHF1YV9taTJzLCBjcmlfdHJuZzAsIHBoYXNlX2ZsYWcyMSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNjFdID0gUElOR1JPVVAoNjEsIE5PUlRILCBxdWFfbWkycywgY3JpX3RybmcxLCBwaGFzZV9mbGFnMjIsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYyXSA9IFBJTkdST1VQKDYyLCBOT1JUSCwgcXVhX21pMnMsIGNyaV90cm5nLCBwaGFzZV9mbGFnMjMsIHFkc3NfY3RpLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzYzXSA9IFBJTkdST1VQKDYzLCBOT1JUSCwgcXVhX21pMnMsIE5BLCBwaGFzZV9mbGFnMjQsIHFkc3NfY3RpLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzY0XSA9IFBJTkdST1VQKDY0LCBOT1JUSCwgcHJpX21pMnMsIHNwX2NtdSwgcGhhc2VfZmxhZzI1LCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs2NV0gPSBQSU5HUk9VUCg2NSwgTk9SVEgsIHByaV9taTJzLCBxdXA4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbNjZdID0gUElOR1JPVVAoNjYsIE5PUlRILCBwcmlfbWkyc193cywgcXVwOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzY3XSA9IFBJTkdST1VQKDY3LCBOT1JUSCwgcHJpX21pMnMsIHF1cDgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs2OF0gPSBQSU5HUk9VUCg2OCwgTk9SVEgsIHByaV9taTJzLCBxdXA4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbNjldID0gUElOR1JPVVAoNjksIE5PUlRILCBzcGtyX2kycywgYXVkaW9fcmVmLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNzBdID0gUElOR1JPVVAoNzAsIE5PUlRILCBscGFzc19zbGltYnVzLCBzcGtyX2kycywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzcxXSA9IFBJTkdST1VQKDcxLCBOT1JUSCwgbHBhc3Nfc2xpbWJ1cywgc3Brcl9pMnMsIHRzZW5zZV9wd20xLAorCQkJdHNlbnNlX3B3bTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs3Ml0gPSBQSU5HUk9VUCg3MiwgTk9SVEgsIGxwYXNzX3NsaW1idXMsIHNwa3JfaTJzLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbNzNdID0gUElOR1JPVVAoNzMsIE5PUlRILCBidGZtX3NsaW1idXMsIGF0ZXN0X3VzYjIsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVs3NF0gPSBQSU5HUk9VUCg3NCwgTk9SVEgsIGJ0Zm1fc2xpbWJ1cywgdGVyX21pMnMsIHBoYXNlX2ZsYWc3LAorCQkJYXRlc3RfdXNiMjMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs3NV0gPSBQSU5HUk9VUCg3NSwgTk9SVEgsIHRlcl9taTJzLCBwaGFzZV9mbGFnOCwgcWRzc19ncGlvOCwKKwkJCWF0ZXN0X3VzYjIyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzZdID0gUElOR1JPVVAoNzYsIE5PUlRILCB0ZXJfbWkycywgcGhhc2VfZmxhZzksIHFkc3NfZ3BpbzksCisJCQlhdGVzdF91c2IyMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzc3XSA9IFBJTkdST1VQKDc3LCBOT1JUSCwgdGVyX21pMnMsIHBoYXNlX2ZsYWc0LCBxZHNzX2dwaW8xMCwKKwkJCWF0ZXN0X3VzYjIwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzhdID0gUElOR1JPVVAoNzgsIE5PUlRILCB0ZXJfbWkycywgZ2NjX2dwMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzc5XSA9IFBJTkdST1VQKDc5LCBOT1JUSCwgc2VjX21pMnMsIE5BLCBOQSwgcWRzc19ncGlvMTEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbODBdID0gUElOR1JPVVAoODAsIE5PUlRILCBzZWNfbWkycywgTkEsIHFkc3NfZ3BpbzEyLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs4MV0gPSBQSU5HUk9VUCg4MSwgTk9SVEgsIHNlY19taTJzLCBxdXAxNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzgyXSA9IFBJTkdST1VQKDgyLCBOT1JUSCwgc2VjX21pMnMsIHF1cDE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbODNdID0gUElOR1JPVVAoODMsIE5PUlRILCBzZWNfbWkycywgcXVwMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs4NF0gPSBQSU5HUk9VUCg4NCwgTk9SVEgsIHF1cDE1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODVdID0gUElOR1JPVVAoODUsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODZdID0gUElOR1JPVVAoODYsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODddID0gUElOR1JPVVAoODcsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODhdID0gUElOR1JPVVAoODgsIFNPVVRILCBxdXA1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODldID0gUElOR1JPVVAoODksIFNPVVRILCB0c2lmMV9jbGssIHF1cDQsIHRndV9jaDMsIHBoYXNlX2ZsYWcxMCwgTkEsCisJCQlOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs5MF0gPSBQSU5HUk9VUCg5MCwgU09VVEgsIHRzaWYxX2VuLCBtZHBfdnN5bmMwLCBxdXA0LCBtZHBfdnN5bmMxLAorCQkJbWRwX3ZzeW5jMiwgbWRwX3ZzeW5jMywgdGd1X2NoMCwgcGhhc2VfZmxhZzAsIHFkc3NfY3RpLAorCQkJTkEpLAorCVs5MV0gPSBQSU5HUk9VUCg5MSwgU09VVEgsIHRzaWYxX2RhdGEsIHNkYzRfY21kLCBxdXA0LCB0Z3VfY2gxLCBOQSwKKwkJCXFkc3NfY3RpLCBOQSwgTkEsIE5BLCBOQSksCisJWzkyXSA9IFBJTkdST1VQKDkyLCBTT1VUSCwgdHNpZjJfZXJyb3IsIHNkYzQzLCBxdXA0LCB2ZnJfMSwgdGd1X2NoMiwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzkzXSA9IFBJTkdST1VQKDkzLCBTT1VUSCwgdHNpZjJfY2xrLCBzZGM0X2NsaywgcXVwNywgTkEsIHFkc3NfZ3BpbzEzLAorCQkJTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbOTRdID0gUElOR1JPVVAoOTQsIFNPVVRILCB0c2lmMl9lbiwgc2RjNDIsIHF1cDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzk1XSA9IFBJTkdST1VQKDk1LCBTT1VUSCwgdHNpZjJfZGF0YSwgc2RjNDEsIHF1cDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzk2XSA9IFBJTkdST1VQKDk2LCBTT1VUSCwgdHNpZjJfc3luYywgc2RjNDAsIHF1cDcsIHBoYXNlX2ZsYWczLCBOQSwKKwkJCU5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzk3XSA9IFBJTkdST1VQKDk3LCBOT1JUSCwgTkEsIE5BLCBtZHBfdnN5bmMsIGxkb19lbiwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs5OF0gPSBQSU5HUk9VUCg5OCwgTk9SVEgsIE5BLCBtZHBfdnN5bmMsIGxkb191cGRhdGUsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzk5XSA9IFBJTkdST1VQKDk5LCBOT1JUSCwgcGhhc2VfZmxhZzE0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BLCBOQSksCisJWzEwMF0gPSBQSU5HUk9VUCgxMDAsIE5PUlRILCBwaGFzZV9mbGFnMTUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSksCi0JWzEwNF0gPSBQSU5HUk9VUCgxMDQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMDVdID0gUElOR1JPVVAoMTA1LCB1aW0yX2RhdGEsIHF1cDEzLCBxdXBfbDQsIE5BLCBOQSwgTkEsIE5BLAorCVsxMDFdID0gUElOR1JPVVAoMTAxLCBOT1JUSCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMDJdID0gUElOR1JPVVAoMTAyLCBOT1JUSCwgcGNpX2UxLCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCiAJCQkgTkEsIE5BKSwKLQlbMTA2XSA9IFBJTkdST1VQKDEwNiwgdWltMl9jbGssIHF1cDEzLCBxdXBfbDUsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BLCBOQSksCi0JWzEwN10gPSBQSU5HUk9VUCgxMDcsIHVpbTJfcmVzZXQsIHF1cDEzLCBxdXBfbDYsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BLCBOQSksCi0JWzEwOF0gPSBQSU5HUk9VUCgxMDgsIHVpbTJfcHJlc2VudCwgcXVwMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSwgTkEpLAotCVsxMDldID0gUElOR1JPVVAoMTA5LCB1aW0xX2RhdGEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzExMF0gPSBQSU5HUk9VUCgxMTAsIHVpbTFfY2xrLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMTFdID0gUElOR1JPVVAoMTExLCB1aW0xX3Jlc2V0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzExMl0gPSBQSU5HUk9VUCgxMTIsIHVpbTFfcHJlc2VudCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMTNdID0gUElOR1JPVVAoMTEzLCB1aW1fYmF0dCwgZWRwX2hvdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzExNF0gPSBQSU5HUk9VUCgxMTQsIE5BLCBuYXZfcHBzLCBuYXZfcHBzLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMTVdID0gUElOR1JPVVAoMTE1LCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTE2XSA9IFBJTkdST1VQKDExNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzExN10gPSBQSU5HUk9VUCgxMTcsIE5BLCBxZHNzX2dwaW8wLCBhdGVzdF9jaGFyLCBOQSwgTkEsIE5BLAorCVsxMDNdID0gUElOR1JPVVAoMTAzLCBOT1JUSCwgcGNpX2UxLCBwaGFzZV9mbGFnNSwgTkEsIE5BLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSwgTkEpLAotCVsxMThdID0gUElOR1JPVVAoMTE4LCBhZHNwX2V4dCwgTkEsIHFkc3NfZ3BpbzEsIGF0ZXN0X2NoYXIzLCBOQSwKKwlbMTA0XSA9IFBJTkdST1VQKDEwNCwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTA1XSA9IFBJTkdST1VQKDEwNSwgTk9SVEgsIHVpbTJfZGF0YSwgcXVwMTMsIHF1cF9sNCwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSksCisJWzEwNl0gPSBQSU5HUk9VUCgxMDYsIE5PUlRILCB1aW0yX2NsaywgcXVwMTMsIHF1cF9sNSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSksCisJWzEwN10gPSBQSU5HUk9VUCgxMDcsIE5PUlRILCB1aW0yX3Jlc2V0LCBxdXAxMywgcXVwX2w2LCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BKSwKKwlbMTA4XSA9IFBJTkdST1VQKDEwOCwgTk9SVEgsIHVpbTJfcHJlc2VudCwgcXVwMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEsIE5BKSwKKwlbMTA5XSA9IFBJTkdST1VQKDEwOSwgTk9SVEgsIHVpbTFfZGF0YSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BKSwKKwlbMTEwXSA9IFBJTkdST1VQKDExMCwgTk9SVEgsIHVpbTFfY2xrLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEpLAorCVsxMTFdID0gUElOR1JPVVAoMTExLCBOT1JUSCwgdWltMV9yZXNldCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTEyXSA9IFBJTkdST1VQKDExMiwgTk9SVEgsIHVpbTFfcHJlc2VudCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTEzXSA9IFBJTkdST1VQKDExMywgTk9SVEgsIHVpbV9iYXR0LCBlZHBfaG90LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNF0gPSBQSU5HUk9VUCgxMTQsIE5PUlRILCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNV0gPSBQSU5HUk9VUCgxMTUsIE5PUlRILCBOQSwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzExNl0gPSBQSU5HUk9VUCgxMTYsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzExN10gPSBQSU5HUk9VUCgxMTcsIE5PUlRILCBOQSwgcWRzc19ncGlvMCwgYXRlc3RfY2hhciwgTkEsIE5BLCBOQSwKIAkJCSBOQSwgTkEsIE5BLCBOQSksCi0JWzExOV0gPSBQSU5HUk9VUCgxMTksIE5BLCBxZHNzX2dwaW8yLCBhdGVzdF9jaGFyMiwgTkEsIE5BLCBOQSwKLQkJCSBOQSwgTkEsIE5BKSwKLQlbMTIwXSA9IFBJTkdST1VQKDEyMCwgTkEsIHFkc3NfZ3BpbzMsIGF0ZXN0X2NoYXIxLCBOQSwgTkEsIE5BLAotCQkJIE5BLCBOQSwgTkEpLAotCVsxMjFdID0gUElOR1JPVVAoMTIxLCBOQSwgcWRzc19ncGlvNCwgYXRlc3RfY2hhcjAsIE5BLCBOQSwgTkEsCi0JCQkgTkEsIE5BLCBOQSksCi0JWzEyMl0gPSBQSU5HUk9VUCgxMjIsIE5BLCBxZHNzX2dwaW81LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEyM10gPSBQSU5HUk9VUCgxMjMsIHF1cF9sNCwgTkEsIHFkc3NfZ3BpbywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTI0XSA9IFBJTkdST1VQKDEyNCwgcXVwX2w1LCBOQSwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMjVdID0gUElOR1JPVVAoMTI1LCBxdXBfbDYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEyNl0gPSBQSU5HUk9VUCgxMjYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMjddID0gUElOR1JPVVAoMTI3LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTI4XSA9IFBJTkdST1VQKDEyOCwgbmF2X3BwcywgbmF2X3BwcywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzEyOV0gPSBQSU5HUk9VUCgxMjksIG5hdl9wcHMsIG5hdl9wcHMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMzBdID0gUElOR1JPVVAoMTMwLCBxbGlua19yZXF1ZXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzEzMV0gPSBQSU5HUk9VUCgxMzEsIHFsaW5rX2VuYWJsZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMzJdID0gUElOR1JPVVAoMTMyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTMzXSA9IFBJTkdST1VQKDEzMywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEzNF0gPSBQSU5HUk9VUCgxMzQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxMzVdID0gUElOR1JPVVAoMTM1LCBOQSwgcGFfaW5kaWNhdG9yLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTM2XSA9IFBJTkdST1VQKDEzNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzEzN10gPSBQSU5HUk9VUCgxMzcsIE5BLCBOQSwgcGhhc2VfZmxhZzI2LCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxMzhdID0gUElOR1JPVVAoMTM4LCBOQSwgTkEsIHBoYXNlX2ZsYWcyNywgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTM5XSA9IFBJTkdST1VQKDEzOSwgTkEsIHBoYXNlX2ZsYWcyOCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzE0MF0gPSBQSU5HUk9VUCgxNDAsIE5BLCBOQSwgcGhhc2VfZmxhZzYsIE5BLCBOQSwgTkEsIE5BLCBOQSwKLQkJCSBOQSksCi0JWzE0MV0gPSBQSU5HUk9VUCgxNDEsIE5BLCBwaGFzZV9mbGFnMjksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCQkgTkEpLAotCVsxNDJdID0gUElOR1JPVVAoMTQyLCBOQSwgcGhhc2VfZmxhZzMwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAotCQkJIE5BKSwKLQlbMTQzXSA9IFBJTkdST1VQKDE0MywgTkEsIG5hdl9wcHMsIG5hdl9wcHMsIE5BLCBwaGFzZV9mbGFnMzEsCisJWzExOF0gPSBQSU5HUk9VUCgxMTgsIE5PUlRILCBhZHNwX2V4dCwgTkEsIHFkc3NfZ3BpbzEsIGF0ZXN0X2NoYXIzLCBOQSwKKwkJCSBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMTldID0gUElOR1JPVVAoMTE5LCBOT1JUSCwgTkEsIHFkc3NfZ3BpbzIsIGF0ZXN0X2NoYXIyLCBOQSwgTkEsIE5BLAogCQkJIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTQ0XSA9IFBJTkdST1VQKDE0NCwgbXNzX2x0ZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTQ1XSA9IFBJTkdST1VQKDE0NSwgbXNzX2x0ZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTQ2XSA9IFBJTkdST1VQKDE0NiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JWzE0N10gPSBQSU5HUk9VUCgxNDcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVsxNDhdID0gUElOR1JPVVAoMTQ4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlbMTQ5XSA9IFBJTkdST1VQKDE0OSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEyMF0gPSBQSU5HUk9VUCgxMjAsIE5PUlRILCBOQSwgcWRzc19ncGlvMywgYXRlc3RfY2hhcjEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BLCBOQSwgTkEpLAorCVsxMjFdID0gUElOR1JPVVAoMTIxLCBOT1JUSCwgTkEsIHFkc3NfZ3BpbzQsIGF0ZXN0X2NoYXIwLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTIyXSA9IFBJTkdST1VQKDEyMiwgTk9SVEgsIE5BLCBxZHNzX2dwaW81LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEyM10gPSBQSU5HUk9VUCgxMjMsIE5PUlRILCBxdXBfbDQsIE5BLCBxZHNzX2dwaW8sIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCSBOQSwgTkEpLAorCVsxMjRdID0gUElOR1JPVVAoMTI0LCBOT1JUSCwgcXVwX2w1LCBOQSwgcWRzc19ncGlvLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTI1XSA9IFBJTkdST1VQKDEyNSwgTk9SVEgsIHF1cF9sNiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BKSwKKwlbMTI2XSA9IFBJTkdST1VQKDEyNiwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTI3XSA9IFBJTkdST1VQKDEyNywgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTI4XSA9IFBJTkdST1VQKDEyOCwgTk9SVEgsIG5hdl9wcHMsIG5hdl9wcHMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTI5XSA9IFBJTkdST1VQKDEyOSwgTk9SVEgsIG5hdl9wcHMsIG5hdl9wcHMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTMwXSA9IFBJTkdST1VQKDEzMCwgTk9SVEgsIHFsaW5rX3JlcXVlc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzMV0gPSBQSU5HUk9VUCgxMzEsIE5PUlRILCBxbGlua19lbmFibGUsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzMl0gPSBQSU5HUk9VUCgxMzIsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzM10gPSBQSU5HUk9VUCgxMzMsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzNF0gPSBQSU5HUk9VUCgxMzQsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzNV0gPSBQSU5HUk9VUCgxMzUsIE5PUlRILCBOQSwgcGFfaW5kaWNhdG9yLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzNl0gPSBQSU5HUk9VUCgxMzYsIE5PUlRILCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzEzN10gPSBQSU5HUk9VUCgxMzcsIE5PUlRILCBOQSwgTkEsIHBoYXNlX2ZsYWcyNiwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzOF0gPSBQSU5HUk9VUCgxMzgsIE5PUlRILCBOQSwgTkEsIHBoYXNlX2ZsYWcyNywgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzEzOV0gPSBQSU5HUk9VUCgxMzksIE5PUlRILCBOQSwgcGhhc2VfZmxhZzI4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BLCBOQSksCisJWzE0MF0gPSBQSU5HUk9VUCgxNDAsIE5PUlRILCBOQSwgTkEsIHBoYXNlX2ZsYWc2LCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTQxXSA9IFBJTkdST1VQKDE0MSwgTk9SVEgsIE5BLCBwaGFzZV9mbGFnMjksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTQyXSA9IFBJTkdST1VQKDE0MiwgTk9SVEgsIE5BLCBwaGFzZV9mbGFnMzAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEsIE5BKSwKKwlbMTQzXSA9IFBJTkdST1VQKDE0MywgTk9SVEgsIE5BLCBuYXZfcHBzLCBuYXZfcHBzLCBOQSwgcGhhc2VfZmxhZzMxLAorCQkJIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzE0NF0gPSBQSU5HUk9VUCgxNDQsIE5PUlRILCBtc3NfbHRlLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQkgTkEpLAorCVsxNDVdID0gUElOR1JPVVAoMTQ1LCBOT1JUSCwgbXNzX2x0ZSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJIE5BKSwKKwlbMTQ2XSA9IFBJTkdST1VQKDE0NiwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTQ3XSA9IFBJTkdST1VQKDE0NywgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTQ4XSA9IFBJTkdST1VQKDE0OCwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMTQ5XSA9IFBJTkdST1VQKDE0OSwgTk9SVEgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKIAlbMTUwXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzJfY2xrLCAweDk5YTAwMCwgMTQsIDYpLAogCVsxNTFdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMl9jbWQsIDB4OTlhMDAwLCAxMSwgMyksCiAJWzE1Ml0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2RhdGEsIDB4OTlhMDAwLCA5LCAwKSwKQEAgLTE3MTQsMTAgKzE3MzYsNiBAQAogCS5uZ3Bpb3MgPSAxNTAsCiAJLmRpcl9jb25uID0gc2RtODQ1X2Rpcl9jb25uLAogCS5uX2Rpcl9jb25ucyA9IEFSUkFZX1NJWkUoc2RtODQ1X2Rpcl9jb25uKSwKLQkudGlsZV9vZmZzZXRzID0gc2RtODQ1X3RpbGVfb2Zmc2V0cywKLQkubl90aWxlX29mZnNldHMgPSBBUlJBWV9TSVpFKHNkbTg0NV90aWxlX29mZnNldHMpLAotCS5waW5fYmFzZSA9IHNkbTg0NV9waW5fYmFzZSwKLQkucmVnX3NpemUgPSBSRUdfU0laRSwKIH07CiAKIHN0YXRpYyBpbnQgc2RtODQ1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc2R4cG9vcndpbGxzLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNkeHBvb3J3aWxscy5jCmluZGV4IDRhMjFlYjYuLjZjZWIzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc2R4cG9vcndpbGxzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zZHhwb29yd2lsbHMuYwpAQCAtODUsNiArODUsMzIgQEAKIAkJLmludHJfZW5hYmxlX2JpdCA9IC0xLAkJCVwKIAkJLmludHJfc3RhdHVzX2JpdCA9IC0xLAkJCVwKIAkJLmludHJfdGFyZ2V0X2JpdCA9IC0xLAkJCVwKKwkJLmludHJfcmF3X3N0YXR1c19iaXQgPSAtMSwJCVwKKwkJLmludHJfcG9sYXJpdHlfYml0ID0gLTEsCQlcCisJCS5pbnRyX2RldGVjdGlvbl9iaXQgPSAtMSwJCVwKKwkJLmludHJfZGV0ZWN0aW9uX3dpZHRoID0gLTEsCQlcCisJfQorCisjZGVmaW5lIFVGU19SRVNFVChwZ19uYW1lLCBvZmZzZXQpCQkJCVwKKwl7CQkJCQkgICAgICAgIFwKKwkJLm5hbWUgPSAjcGdfbmFtZSwJCQlcCisJCS5waW5zID0gcGdfbmFtZSMjX3BpbnMsCQkJXAorCQkubnBpbnMgPSAodW5zaWduZWQgaW50KUFSUkFZX1NJWkUocGdfbmFtZSMjX3BpbnMpLAlcCisJCS5jdGxfcmVnID0gb2Zmc2V0LAkJCVwKKwkJLmlvX3JlZyA9IG9mZnNldCArIDB4NCwJCQlcCisJCS5pbnRyX2NmZ19yZWcgPSAwLAkJCVwKKwkJLmludHJfc3RhdHVzX3JlZyA9IDAsCQkJXAorCQkuaW50cl90YXJnZXRfcmVnID0gMCwJCQlcCisJCS5tdXhfYml0ID0gLTEsCQkJCVwKKwkJLnB1bGxfYml0ID0gMywJCQkJXAorCQkuZHJ2X2JpdCA9IDAsCQkJCVwKKwkJLm9lX2JpdCA9IC0xLAkJCQlcCisJCS5pbl9iaXQgPSAtMSwJCQkJXAorCQkub3V0X2JpdCA9IDAsCQkJCVwKKwkJLmludHJfZW5hYmxlX2JpdCA9IC0xLAkJCVwKKwkJLmludHJfc3RhdHVzX2JpdCA9IC0xLAkJCVwKKwkJLmludHJfdGFyZ2V0X2JpdCA9IC0xLAkJCVwKKwkJLmludHJfcmF3X3N0YXR1c19iaXQgPSAtMSwJCVwKIAkJLmludHJfcG9sYXJpdHlfYml0ID0gLTEsCQlcCiAJCS5pbnRyX2RldGVjdGlvbl9iaXQgPSAtMSwJCVwKIAkJLmludHJfZGV0ZWN0aW9uX3dpZHRoID0gLTEsCQlcCkBAIC0xOTAsMTIgKzIxNiwxMyBAQAogCVBJTkNUUkxfUElOKDk3LCAiR1BJT185NyIpLAogCVBJTkNUUkxfUElOKDk4LCAiR1BJT185OCIpLAogCVBJTkNUUkxfUElOKDk5LCAiR1BJT185OSIpLAotCVBJTkNUUkxfUElOKDEwMCwgIlNEQzFfQ0xLIiksCi0JUElOQ1RSTF9QSU4oMTAxLCAiU0RDMV9DTUQiKSwKLQlQSU5DVFJMX1BJTigxMDIsICJTREMxX0RBVEEiKSwKLQlQSU5DVFJMX1BJTigxMDMsICJTREMyX0NMSyIpLAotCVBJTkNUUkxfUElOKDEwNCwgIlNEQzJfQ01EIiksCi0JUElOQ1RSTF9QSU4oMTA1LCAiU0RDMl9EQVRBIiksCisJUElOQ1RSTF9QSU4oMTAwLCAiU0RDMV9SQ0xLIiksCisJUElOQ1RSTF9QSU4oMTAxLCAiU0RDMV9DTEsiKSwKKwlQSU5DVFJMX1BJTigxMDIsICJTREMxX0NNRCIpLAorCVBJTkNUUkxfUElOKDEwMywgIlNEQzFfREFUQSIpLAorCVBJTkNUUkxfUElOKDEwNCwgIlNEQzJfQ0xLIiksCisJUElOQ1RSTF9QSU4oMTA1LCAiU0RDMl9DTUQiKSwKKwlQSU5DVFJMX1BJTigxMDYsICJTREMyX0RBVEEiKSwKIH07CiAKICNkZWZpbmUgREVDTEFSRV9NU01fR1BJT19QSU5TKHBpbikgXApAQCAtMzAxLDIxICszMjgsMjIgQEAKIERFQ0xBUkVfTVNNX0dQSU9fUElOUyg5OCk7CiBERUNMQVJFX01TTV9HUElPX1BJTlMoOTkpOwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfY2xrX3BpbnNbXSA9IHsgMTAwIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfY21kX3BpbnNbXSA9IHsgMTAxIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfZGF0YV9waW5zW10gPSB7IDEwMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2Nsa19waW5zW10gPSB7IDEwMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2NtZF9waW5zW10gPSB7IDEwNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2RhdGFfcGluc1tdID0geyAxMDUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjMV9yY2xrX3BpbnNbXSA9IHsgMTAwIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfY2xrX3BpbnNbXSA9IHsgMTAxIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfY21kX3BpbnNbXSA9IHsgMTAyIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkYzFfZGF0YV9waW5zW10gPSB7IDEwMyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2Nsa19waW5zW10gPSB7IDEwNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2NtZF9waW5zW10gPSB7IDEwNSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGMyX2RhdGFfcGluc1tdID0geyAxMDYgfTsKIAogZW51bSBzZHhwb29yd2lsbHNfZnVuY3Rpb25zIHsKLQltc21fbXV4X3Fkc3Nfc3RtMzEsCi0JbXNtX211eF9ibHNwX3VhcnQxLAotCW1zbV9tdXhfZ3BpbywKIAltc21fbXV4X3VpbTJfZGF0YSwKKwltc21fbXV4X2dwaW8sCisJbXNtX211eF9xZHNzX3N0bTMxLAogCW1zbV9tdXhfZWJpMF93cmNkYywKIAltc21fbXV4X3VpbTJfcHJlc2VudCwKIAltc21fbXV4X3Fkc3Nfc3RtMzAsCisJbXNtX211eF9ibHNwX3VhcnQxLAogCW1zbV9tdXhfdWltMl9yZXNldCwKIAltc21fbXV4X2Jsc3BfaTJjMSwKIAltc21fbXV4X3Fkc3Nfc3RtMjksCkBAIC0zNDAsMTQgKzM2OCwyMiBAQAogCW1zbV9tdXhfYmxzcF9pMmMzLAogCW1zbV9tdXhfZ2NjX2dwMywKIAltc21fbXV4X3Fkc3Nfc3RtMTksCi0JbXNtX211eF9xZHNzMTIsCisJbXNtX211eF9xZHNzNCwKIAltc21fbXV4X3Fkc3Nfc3RtMTgsCi0JbXNtX211eF9xZHNzMTMsCisJbXNtX211eF9xZHNzNSwKIAltc21fbXV4X3Fkc3Nfc3RtMTcsCi0JbXNtX211eF9xZHNzMTQsCisJbXNtX211eF9xZHNzNiwKIAltc21fbXV4X2JpbWNfZHRlMCwKIAltc21fbXV4X25hdGl2ZV90c2VucywKLQltc21fbXV4X3ZzZW5zZV90cmlnZ2VyLAorCW1zbV9tdXhfcWRzc19zdG0xNiwKKwltc21fbXV4X3Fkc3M3LAorCW1zbV9tdXhfYmltY19kdGUxLAorCW1zbV9tdXhfc2VjX21pMnMsCisJbXNtX211eF9ibHNwX3NwaTQsCisJbXNtX211eF9ibHNwX3VhcnQ0LAorCW1zbV9tdXhfcWRzc19jdGksCisJbXNtX211eF9xZHNzX3N0bTI3LAorCW1zbV9tdXhfcWRzczgsCiAJbXNtX211eF9xZHNzX3N0bTI2LAogCW1zbV9tdXhfcWRzczksCiAJbXNtX211eF9ibHNwX2kyYzQsCkBAIC0zNTgsMjYgKzM5NCwxOSBAQAogCW1zbV9tdXhfZ2NjX2dwMiwKIAltc21fbXV4X3Fkc3Nfc3RtMjQsCiAJbXNtX211eF9xZHNzMTEsCi0JbXNtX211eF9xZHNzX3N0bTE2LAotCW1zbV9tdXhfcWRzczE1LAotCW1zbV9tdXhfYmltY19kdGUxLAotCW1zbV9tdXhfc2VjX21pMnMsCi0JbXNtX211eF9ibHNwX3NwaTQsCi0JbXNtX211eF9ibHNwX3VhcnQ0LAotCW1zbV9tdXhfcWRzc19jdGksCi0JbXNtX211eF9xZHNzX3N0bTI3LAotCW1zbV9tdXhfcWRzczgsCiAJbXNtX211eF9lYmkyX2EsCi0JbXNtX211eF9xZHNzX3N0bTMsCiAJbXNtX211eF9lYmkyX2xjZCwKLQltc21fbXV4X3Fkc3Nfc3RtMiwKIAltc21fbXV4X3BsbF9iaXN0LAotCW1zbV9tdXhfcWRzc19zdG0xLAotCW1zbV9tdXhfcWRzc19zdG0wLAogCW1zbV9tdXhfYWRzcF9leHQsCi0JbXNtX211eF9lcG0xLAorCW1zbV9tdXhfcWRzc19zdG0xMSwKIAltc21fbXV4X21fdm9jLAorCW1zbV9tdXhfcWRzc19zdG0xMCwKIAltc21fbXV4X25hdGl2ZV9jaGFyLAorCW1zbV9tdXhfbmF0aXZlX2NoYXIzLAorCW1zbV9tdXhfbmF2X3BwcywKKwltc21fbXV4X25hdl9kciwKKwltc21fbXV4X25hdGl2ZV9jaGFyMiwKKwltc21fbXV4X25hdGl2ZV90c2Vuc2UsCiAJbXNtX211eF9uYXRpdmVfY2hhcjEsCiAJbXNtX211eF9wYV9pbmRpY2F0b3IsCiAJbXNtX211eF9xZHNzX3RyYWNlY2xrLApAQCAtMzg2LDkyICs0MTUsNjkgQEAKIAltc21fbXV4X3FsaW5rX3JlcSwKIAltc21fbXV4X3BsbF90ZXN0LAogCW1zbV9tdXhfY3JpX3RybmcsCi0JbXNtX211eF93bXNzX3Jlc2V0LAotCW1zbV9tdXhfbmF0aXZlX2NoYXIzLAotCW1zbV9tdXhfbmF2X3BwcywKLQltc21fbXV4X25hdl9kciwKLQltc21fbXV4X25hdGl2ZV9jaGFyMiwKLQltc21fbXV4X25hdGl2ZV90c2Vuc2UsCiAJbXNtX211eF9wcm5nX3Jvc2MsCiAJbXNtX211eF9jcmlfdHJuZzAsCiAJbXNtX211eF9jcmlfdHJuZzEsCiAJbXNtX211eF9wbGxfcmVmLAogCW1zbV9tdXhfY29leF91YXJ0LAotCW1zbV9tdXhfcWRzc19zdG0xMSwKLQltc21fbXV4X3Fkc3Nfc3RtMTAsCi0JbXNtX211eF9kZHJfcHhpMCwKLQltc21fbXV4X2FwMm1kbV9zdGF0dXMsCisJbXNtX211eF9xZHNzX3RyYWNlY3RsLAogCW1zbV9tdXhfZGRyX2Jpc3QsCi0JbXNtX211eF9tZG0yYXBfc3RhdHVzLAotCW1zbV9tdXhfYXAybWRtX2VyciwKLQltc21fbXV4X21kbTJhcF9lcnIsCi0JbXNtX211eF9hcDJtZG1fdmRkLAotCW1zbV9tdXhfbWRtMmFwX3ZkZCwKLQltc21fbXV4X2FwMm1kbV93YWtlLAotCW1zbV9tdXhfcGNpZWhvc3RfcnN0LAogCW1zbV9tdXhfYmxzcF9zcGkxLAotCW1zbV9tdXhfcWRzc19zdG0xNCwKLQltc21fbXV4X3BjaWVfd2FrZSwKLQltc21fbXV4X21kbTJhcF93YWtlLAogCW1zbV9tdXhfcGNpX2UsCisJbXNtX211eF90Z3VfY2gwLAorCW1zbV9tdXhfcGNpZV9jbGtyZXEsCisJbXNtX211eF9xZHNzX3N0bTE1LAorCW1zbV9tdXhfcWRzc19zdG0xNCwKIAltc21fbXV4X3Fkc3Nfc3RtMTMsCisJbXNtX211eF9tZ3BpX2NsaywKKwltc21fbXV4X3Fkc3Nfc3RtMTIsCisJbXNtX211eF9xZHNzX3N0bTksCiAJbXNtX211eF9pMnNfbWNsaywKIAltc21fbXV4X2F1ZGlvX3JlZiwKIAltc21fbXV4X2xkb191cGRhdGUsCiAJbXNtX211eF9xZHNzX3N0bTgsCiAJbXNtX211eF9xZHNzX3N0bTcsCi0JbXNtX211eF9xZHNzNCwKLQltc21fbXV4X3RndV9jaDAsCi0JbXNtX211eF9wY2llX2Nsa3JlcSwKLQltc21fbXV4X3Fkc3Nfc3RtOSwKLQltc21fbXV4X3Fkc3Nfc3RtMTUsCi0JbXNtX211eF9tZ3BpX2NsaywKLQltc21fbXV4X3Fkc3Nfc3RtMTIsCi0JbXNtX211eF9xZHNzX3RyYWNlY3RsLAotCW1zbV9tdXhfYXRlc3RfY2hhciwKKwltc21fbXV4X3Fkc3MxMiwKIAltc21fbXV4X3Fkc3Nfc3RtNiwKLQltc21fbXV4X3Fkc3M1LAotCW1zbV9tdXhfYXRlc3RfY2hhcjMsCisJbXNtX211eF9xZHNzMTMsCiAJbXNtX211eF9xZHNzX3N0bTUsCi0JbXNtX211eF9xZHNzNiwKLQltc21fbXV4X2F0ZXN0X2NoYXIyLAorCW1zbV9tdXhfcWRzczE0LAogCW1zbV9tdXhfcWRzc19zdG00LAotCW1zbV9tdXhfcWRzczcsCi0JbXNtX211eF9hdGVzdF9jaGFyMSwKKwltc21fbXV4X3Fkc3MxNSwKIAltc21fbXV4X3VpbTFfZGF0YSwKLQltc21fbXV4X2F0ZXN0X2NoYXIwLAorCW1zbV9tdXhfcWRzc19zdG0zLAogCW1zbV9tdXhfdWltMV9wcmVzZW50LAorCW1zbV9tdXhfcWRzc19zdG0yLAogCW1zbV9tdXhfdWltMV9yZXNldCwKKwltc21fbXV4X3Fkc3Nfc3RtMSwKIAltc21fbXV4X3VpbTFfY2xrLAorCW1zbV9tdXhfcWRzc19zdG0wLAogCW1zbV9tdXhfZGJnX291dCwKIAltc21fbXV4X2djY19wbGx0ZXN0LAotCW1zbV9tdXhfdXNiMnBoeV9hYywKIAltc21fbXV4X05BLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTMxX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX2RhdGFfZ3JvdXBzW10gPSB7CiAJImdwaW8wIiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDFfZ3JvdXBzW10gPSB7Ci0JImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiwgImdwaW8yMCIsICJncGlvMjEiLCAiZ3BpbzIyIiwKLQkiZ3BpbzIzIiwKLX07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fZ3JvdXBzW10gPSB7CiAJImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiwgImdwaW80IiwgImdwaW81IiwgImdwaW82IiwgImdwaW83IiwKIAkiZ3BpbzgiLCAiZ3BpbzkiLCAiZ3BpbzEwIiwgImdwaW8xMSIsICJncGlvMTIiLCAiZ3BpbzEzIiwgImdwaW8xNCIsCiAJImdwaW8xNSIsICJncGlvMTYiLCAiZ3BpbzE3IiwgImdwaW8xOCIsICJncGlvMTkiLCAiZ3BpbzIwIiwgImdwaW8yMSIsCi0JImdwaW8yMiIsICJncGlvMjMiLCAiZ3BpbzI0IiwgImdwaW8yNiIsICJncGlvMjciLCAiZ3BpbzI4IiwgImdwaW8yOSIsCi0JImdwaW8zMCIsICJncGlvMzEiLCAiZ3BpbzMyIiwgImdwaW8zMyIsICJncGlvMzQiLCAiZ3BpbzM1IiwgImdwaW8zNiIsCi0JImdwaW8zNyIsICJncGlvMzgiLCAiZ3BpbzM5IiwgImdwaW80MCIsICJncGlvNDEiLCAiZ3BpbzQyIiwgImdwaW80MyIsCi0JImdwaW80NCIsICJncGlvNDUiLCAiZ3BpbzU0IiwgImdwaW81NSIsICJncGlvNTYiLCAiZ3BpbzU4IiwgImdwaW81OSIsCi0JImdwaW82MCIsICJncGlvNjEiLCAiZ3BpbzYyIiwgImdwaW82MyIsICJncGlvNjQiLCAiZ3BpbzY1IiwgImdwaW82NiIsCi0JImdwaW82NyIsICJncGlvNjgiLCAiZ3BpbzY5IiwgImdwaW83MCIsICJncGlvNzEiLCAiZ3BpbzcyIiwgImdwaW83MyIsCi0JImdwaW83NCIsICJncGlvNzUiLCAiZ3Bpbzc2IiwgImdwaW83NyIsICJncGlvNzgiLCAiZ3Bpbzc5IiwgImdwaW84MCIsCi0JImdwaW84MSIsICJncGlvODIiLCAiZ3BpbzgzIiwgImdwaW84NCIsICJncGlvODUiLCAiZ3Bpbzg2IiwgImdwaW84NyIsCi0JImdwaW84OCIsICJncGlvODkiLCAiZ3BpbzkwIiwgImdwaW85MSIsICJncGlvOTIiLCAiZ3BpbzkzIiwgImdwaW85NCIsCi0JImdwaW85NSIsICJncGlvOTYiLCAiZ3Bpbzk3IiwgImdwaW85OCIsICJncGlvOTkiLAorCSJncGlvMjIiLCAiZ3BpbzIzIiwgImdwaW8yNCIsICJncGlvMjUiLCAiZ3BpbzI2IiwgImdwaW8yNyIsICJncGlvMjgiLAorCSJncGlvMjkiLCAiZ3BpbzMwIiwgImdwaW8zMSIsICJncGlvMzIiLCAiZ3BpbzMzIiwgImdwaW8zNCIsICJncGlvMzUiLAorCSJncGlvMzYiLCAiZ3BpbzM3IiwgImdwaW8zOCIsICJncGlvMzkiLCAiZ3BpbzQwIiwgImdwaW80MSIsICJncGlvNDIiLAorCSJncGlvNDMiLCAiZ3BpbzQ0IiwgImdwaW80NSIsICJncGlvNDYiLCAiZ3BpbzQ3IiwgImdwaW80OCIsICJncGlvNDkiLAorCSJncGlvNTAiLCAiZ3BpbzUxIiwgImdwaW81MiIsICJncGlvNTIiLCAiZ3BpbzUzIiwgImdwaW81MyIsICJncGlvNTQiLAorCSJncGlvNTUiLCAiZ3BpbzU2IiwgImdwaW81NyIsICJncGlvNTgiLCAiZ3BpbzU5IiwgImdwaW82MCIsICJncGlvNjEiLAorCSJncGlvNjIiLCAiZ3BpbzYzIiwgImdwaW82NCIsICJncGlvNjUiLCAiZ3BpbzY2IiwgImdwaW82NyIsICJncGlvNjgiLAorCSJncGlvNjkiLCAiZ3BpbzcwIiwgImdwaW83MSIsICJncGlvNzIiLCAiZ3BpbzczIiwgImdwaW83NCIsICJncGlvNzUiLAorCSJncGlvNzYiLCAiZ3Bpbzc3IiwgImdwaW83OCIsICJncGlvNzkiLCAiZ3BpbzgwIiwgImdwaW84MSIsICJncGlvODIiLAorCSJncGlvODMiLCAiZ3Bpbzg0IiwgImdwaW84NSIsICJncGlvODYiLCAiZ3Bpbzg3IiwgImdwaW84OCIsICJncGlvODkiLAorCSJncGlvOTAiLCAiZ3BpbzkxIiwgImdwaW85MiIsICJncGlvOTMiLCAiZ3Bpbzk0IiwgImdwaW85NSIsICJncGlvOTYiLAorCSJncGlvOTciLCAiZ3Bpbzk4IiwgImdwaW85OSIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0yX2RhdGFfZ3JvdXBzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMzFfZ3JvdXBzW10gPSB7CiAJImdwaW8wIiwKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGViaTBfd3JjZGNfZ3JvdXBzW10gPSB7CkBAIC00ODMsNiArNDg5LDEwIEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMzBfZ3JvdXBzW10gPSB7CiAJImdwaW8xIiwKIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDFfZ3JvdXBzW10gPSB7CisJImdwaW8wIiwgImdwaW8xIiwgImdwaW8yIiwgImdwaW8zIiwgImdwaW8yMCIsICJncGlvMjEiLCAiZ3BpbzIyIiwKKwkiZ3BpbzIzIiwKK307CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTJfcmVzZXRfZ3JvdXBzW10gPSB7CiAJImdwaW8yIiwKIH07CkBAIC01NTcsMTkgKzU2NywxOSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTE5X2dyb3Vwc1tdID0gewogCSJncGlvMTIiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczEyX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzNF9ncm91cHNbXSA9IHsKIAkiZ3BpbzEyIiwKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMThfZ3JvdXBzW10gPSB7CiAJImdwaW8xMyIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzMTNfZ3JvdXBzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3M1X2dyb3Vwc1tdID0gewogCSJncGlvMTMiLAogfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xN19ncm91cHNbXSA9IHsKIAkiZ3BpbzE0IiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3MxNF9ncm91cHNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczZfZ3JvdXBzW10gPSB7CiAJImdwaW8xNCIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiaW1jX2R0ZTBfZ3JvdXBzW10gPSB7CkBAIC01NzgsOCArNTg4LDM2IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdGl2ZV90c2Vuc19ncm91cHNbXSA9IHsKIAkiZ3BpbzE0IiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZzZW5zZV90cmlnZ2VyX2dyb3Vwc1tdID0gewotCSJncGlvMTQiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTE2X2dyb3Vwc1tdID0geworCSJncGlvMTUiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczdfZ3JvdXBzW10gPSB7CisJImdwaW8xNSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiaW1jX2R0ZTFfZ3JvdXBzW10gPSB7CisJImdwaW8xNSIsICJncGlvNjAiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2VjX21pMnNfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsICJncGlvMjAiLCAiZ3BpbzIxIiwgImdwaW8yMiIsCisJImdwaW8yMyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3NwaTRfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsICJncGlvNTIiLCAiZ3BpbzYyIiwgImdwaW83MSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBibHNwX3VhcnQ0X2dyb3Vwc1tdID0geworCSJncGlvMTYiLCAiZ3BpbzE3IiwgImdwaW8xOCIsICJncGlvMTkiLCAiZ3BpbzIwIiwgImdwaW8yMSIsICJncGlvMjIiLAorCSJncGlvMjMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19jdGlfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsICJncGlvMTYiLCAiZ3BpbzE3IiwgImdwaW8xNyIsICJncGlvMjIiLCAiZ3BpbzIyIiwgImdwaW8yMyIsCisJImdwaW8yMyIsICJncGlvNTQiLCAiZ3BpbzU0IiwgImdwaW81NSIsICJncGlvNTUiLCAiZ3BpbzU5IiwgImdwaW82MSIsCisJImdwaW84OCIsICJncGlvODgiLCAiZ3Bpbzg5IiwgImdwaW84OSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTI3X2dyb3Vwc1tdID0geworCSJncGlvMTYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczhfZ3JvdXBzW10gPSB7CisJImdwaW8xNiIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTI2X2dyb3Vwc1tdID0gewogCSJncGlvMTciLApAQCAtNjExLDcwICs2NDksNDUgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczExX2dyb3Vwc1tdID0gewogCSJncGlvMTkiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xNl9ncm91cHNbXSA9IHsKLQkiZ3BpbzE1IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3MxNV9ncm91cHNbXSA9IHsKLQkiZ3BpbzE1IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJpbWNfZHRlMV9ncm91cHNbXSA9IHsKLQkiZ3BpbzE1IiwgImdwaW82MCIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZWNfbWkyc19ncm91cHNbXSA9IHsKLQkiZ3BpbzE2IiwgImdwaW8xNyIsICJncGlvMTgiLCAiZ3BpbzE5IiwgImdwaW8yMCIsICJncGlvMjEiLCAiZ3BpbzIyIiwKLQkiZ3BpbzIzIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3Bfc3BpNF9ncm91cHNbXSA9IHsKLQkiZ3BpbzE2IiwgImdwaW8xNyIsICJncGlvMTgiLCAiZ3BpbzE5IiwgImdwaW81MiIsICJncGlvNjIiLCAiZ3BpbzcxIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJsc3BfdWFydDRfZ3JvdXBzW10gPSB7Ci0JImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE4IiwgImdwaW8xOSIsICJncGlvMjAiLCAiZ3BpbzIxIiwgImdwaW8yMiIsCi0JImdwaW8yMyIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX2N0aV9ncm91cHNbXSA9IHsKLQkiZ3BpbzE2IiwgImdwaW8xNiIsICJncGlvMTciLCAiZ3BpbzE3IiwgImdwaW8yMiIsICJncGlvMjIiLCAiZ3BpbzIzIiwKLQkiZ3BpbzIzIiwgImdwaW81NCIsICJncGlvNTQiLCAiZ3BpbzU1IiwgImdwaW81NSIsICJncGlvNTkiLCAiZ3BpbzYxIiwKLQkiZ3Bpbzg4IiwgImdwaW84OCIsICJncGlvODkiLCAiZ3Bpbzg5IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMjdfZ3JvdXBzW10gPSB7Ci0JImdwaW8xNiIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzOF9ncm91cHNbXSA9IHsKLQkiZ3BpbzE2IiwKLX07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGViaTJfYV9ncm91cHNbXSA9IHsKIAkiZ3BpbzIwIiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtM19ncm91cHNbXSA9IHsKLQkiZ3BpbzIwIiwKLX07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGViaTJfbGNkX2dyb3Vwc1tdID0gewogCSJncGlvMjEiLCAiZ3BpbzIyIiwgImdwaW8yMyIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTJfZ3JvdXBzW10gPSB7Ci0JImdwaW8yMSIsCi19Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbGxfYmlzdF9ncm91cHNbXSA9IHsKIAkiZ3BpbzIyIiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMV9ncm91cHNbXSA9IHsKLQkiZ3BpbzIyIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMF9ncm91cHNbXSA9IHsKLQkiZ3BpbzIzIiwKLX07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkc3BfZXh0X2dyb3Vwc1tdID0gewogCSJncGlvMjQiLCAiZ3BpbzI1IiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVwbTFfZ3JvdXBzW10gPSB7Ci0JImdwaW8yNSIsCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMTFfZ3JvdXBzW10gPSB7CisJImdwaW8yNCIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtX3ZvY19ncm91cHNbXSA9IHsKIAkiZ3BpbzI1IiwgImdwaW80NiIsICJncGlvNTkiLCAiZ3BpbzYxIiwKIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMTBfZ3JvdXBzW10gPSB7CisJImdwaW8yNSIsCit9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXRpdmVfY2hhcl9ncm91cHNbXSA9IHsKIAkiZ3BpbzI2IiwKIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdGl2ZV9jaGFyM19ncm91cHNbXSA9IHsKKwkiZ3BpbzI4IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdl9wcHNfZ3JvdXBzW10gPSB7CisJImdwaW8yOSIsICJncGlvNDIiLCAiZ3BpbzYyIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdl9kcl9ncm91cHNbXSA9IHsKKwkiZ3BpbzI5IiwgImdwaW80MiIsICJncGlvNjIiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX2NoYXIyX2dyb3Vwc1tdID0geworCSJncGlvMjkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX3RzZW5zZV9ncm91cHNbXSA9IHsKKwkiZ3BpbzI5IiwKK307CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdGl2ZV9jaGFyMV9ncm91cHNbXSA9IHsKIAkiZ3BpbzMyIiwKIH07CkBAIC02OTksMjQgKzcxMiw2IEBACiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNyaV90cm5nX2dyb3Vwc1tdID0gewogCSJncGlvMzYiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd21zc19yZXNldF9ncm91cHNbXSA9IHsKLQkiZ3BpbzI4IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdGl2ZV9jaGFyM19ncm91cHNbXSA9IHsKLQkiZ3BpbzI4IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdl9wcHNfZ3JvdXBzW10gPSB7Ci0JImdwaW8yOSIsICJncGlvNDIiLCAiZ3BpbzYyIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hdl9kcl9ncm91cHNbXSA9IHsKLQkiZ3BpbzI5IiwgImdwaW80MiIsICJncGlvNjIiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX2NoYXIyX2dyb3Vwc1tdID0gewotCSJncGlvMjkiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX3RzZW5zZV9ncm91cHNbXSA9IHsKLQkiZ3BpbzI5IiwKLX07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBybmdfcm9zY19ncm91cHNbXSA9IHsKIAkiZ3BpbzM4IiwKIH07CkBAIC03MzIsNTkgKzcyNyw0MSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2V4X3VhcnRfZ3JvdXBzW10gPSB7CiAJImdwaW80NCIsICJncGlvNDUiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xMV9ncm91cHNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc190cmFjZWN0bF9ncm91cHNbXSA9IHsKIAkiZ3BpbzQ0IiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMTBfZ3JvdXBzW10gPSB7Ci0JImdwaW80NSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZHJfcHhpMF9ncm91cHNbXSA9IHsKLQkiZ3BpbzQ1IiwgImdwaW80NiIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhcDJtZG1fc3RhdHVzX2dyb3Vwc1tdID0gewotCSJncGlvNDYiLAotfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGRyX2Jpc3RfZ3JvdXBzW10gPSB7CiAJImdwaW80NiIsICJncGlvNDciLCAiZ3BpbzQ4IiwgImdwaW80OSIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZG0yYXBfc3RhdHVzX2dyb3Vwc1tdID0gewotCSJncGlvNDciLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXAybWRtX2Vycl9ncm91cHNbXSA9IHsKLQkiZ3BpbzQ4IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1kbTJhcF9lcnJfZ3JvdXBzW10gPSB7Ci0JImdwaW80OSIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhcDJtZG1fdmRkX2dyb3Vwc1tdID0gewotCSJncGlvNTAiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWRtMmFwX3ZkZF9ncm91cHNbXSA9IHsKLQkiZ3BpbzUxIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwMm1kbV93YWtlX2dyb3Vwc1tdID0gewotCSJncGlvNTIiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZWhvc3RfcnN0X2dyb3Vwc1tdID0gewotCSJncGlvNTIiLAotfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmxzcF9zcGkxX2dyb3Vwc1tdID0gewogCSJncGlvNTIiLCAiZ3BpbzYyIiwgImdwaW83MSIsICJncGlvNzIiLCAiZ3BpbzczIiwgImdwaW83NCIsICJncGlvNzUiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xNF9ncm91cHNbXSA9IHsKLQkiZ3BpbzUyIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjaWVfd2FrZV9ncm91cHNbXSA9IHsKLQkiZ3BpbzUzIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1kbTJhcF93YWtlX2dyb3Vwc1tdID0gewotCSJncGlvNTMiLAotfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpX2VfZ3JvdXBzW10gPSB7Ci0JImdwaW81MyIsICJncGlvNTciLAorCSJncGlvNTMiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGd1X2NoMF9ncm91cHNbXSA9IHsKKwkiZ3BpbzU1IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjaWVfY2xrcmVxX2dyb3Vwc1tdID0geworCSJncGlvNTYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xNV9ncm91cHNbXSA9IHsKKwkiZ3BpbzU3IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMTRfZ3JvdXBzW10gPSB7CisJImdwaW81OCIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTEzX2dyb3Vwc1tdID0gewotCSJncGlvNTMiLAorCSJncGlvNTkiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWdwaV9jbGtfZ3JvdXBzW10gPSB7CisJImdwaW82MCIsICJncGlvNzEiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xMl9ncm91cHNbXSA9IHsKKwkiZ3BpbzYwIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtOV9ncm91cHNbXSA9IHsKKwkiZ3BpbzYxIiwKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyc19tY2xrX2dyb3Vwc1tdID0gewogCSJncGlvNjIiLApAQCAtODAxLDkzICs3NzgsNjYgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG03X2dyb3Vwc1tdID0gewogCSJncGlvNjMiLAogfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzczRfZ3JvdXBzW10gPSB7Ci0JImdwaW82MyIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0Z3VfY2gwX2dyb3Vwc1tdID0gewotCSJncGlvNTUiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZV9jbGtyZXFfZ3JvdXBzW10gPSB7Ci0JImdwaW81NiIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTlfZ3JvdXBzW10gPSB7Ci0JImdwaW81NiIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTE1X2dyb3Vwc1tdID0gewotCSJncGlvNTciLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWdwaV9jbGtfZ3JvdXBzW10gPSB7Ci0JImdwaW82MCIsICJncGlvNzEiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0xMl9ncm91cHNbXSA9IHsKLQkiZ3BpbzYwIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3NfdHJhY2VjdGxfZ3JvdXBzW10gPSB7Ci0JImdwaW82MCIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzMTJfZ3JvdXBzW10gPSB7CiAJImdwaW82MyIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTZfZ3JvdXBzW10gPSB7CiAJImdwaW82NCIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzNV9ncm91cHNbXSA9IHsKLQkiZ3BpbzY0IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X2NoYXIzX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzMTNfZ3JvdXBzW10gPSB7CiAJImdwaW82NCIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTVfZ3JvdXBzW10gPSB7CiAJImdwaW82NSIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzNl9ncm91cHNbXSA9IHsKLQkiZ3BpbzY1IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X2NoYXIyX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzMTRfZ3JvdXBzW10gPSB7CiAJImdwaW82NSIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzX3N0bTRfZ3JvdXBzW10gPSB7CiAJImdwaW82NiIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzN19ncm91cHNbXSA9IHsKLQkiZ3BpbzY2IiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0ZXN0X2NoYXIxX2dyb3Vwc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBxZHNzMTVfZ3JvdXBzW10gPSB7CiAJImdwaW82NiIsCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aW0xX2RhdGFfZ3JvdXBzW10gPSB7CiAJImdwaW82NyIsCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdGVzdF9jaGFyMF9ncm91cHNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0zX2dyb3Vwc1tdID0gewogCSJncGlvNjciLAogfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWltMV9wcmVzZW50X2dyb3Vwc1tdID0gewogCSJncGlvNjgiLAogfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0yX2dyb3Vwc1tdID0geworCSJncGlvNjgiLAorfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWltMV9yZXNldF9ncm91cHNbXSA9IHsKIAkiZ3BpbzY5IiwKIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFkc3Nfc3RtMV9ncm91cHNbXSA9IHsKKwkiZ3BpbzY5IiwKK307CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVpbTFfY2xrX2dyb3Vwc1tdID0gewogCSJncGlvNzAiLAogfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcWRzc19zdG0wX2dyb3Vwc1tdID0geworCSJncGlvNzAiLAorfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGJnX291dF9ncm91cHNbXSA9IHsKIAkiZ3BpbzcxIiwKIH07CiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdjY19wbGx0ZXN0X2dyb3Vwc1tdID0gewogCSJncGlvNzMiLCAiZ3Bpbzc0IiwKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVzYjJwaHlfYWNfZ3JvdXBzW10gPSB7Ci0JImdwaW84NyIsCi19OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9mdW5jdGlvbiBzZHhwb29yd2lsbHNfZnVuY3Rpb25zW10gPSB7Ci0JRlVOQ1RJT04ocWRzc19zdG0zMSksCi0JRlVOQ1RJT04oYmxzcF91YXJ0MSksCi0JRlVOQ1RJT04oZ3BpbyksCiAJRlVOQ1RJT04odWltMl9kYXRhKSwKKwlGVU5DVElPTihncGlvKSwKKwlGVU5DVElPTihxZHNzX3N0bTMxKSwKIAlGVU5DVElPTihlYmkwX3dyY2RjKSwKIAlGVU5DVElPTih1aW0yX3ByZXNlbnQpLAogCUZVTkNUSU9OKHFkc3Nfc3RtMzApLAorCUZVTkNUSU9OKGJsc3BfdWFydDEpLAogCUZVTkNUSU9OKHVpbTJfcmVzZXQpLAogCUZVTkNUSU9OKGJsc3BfaTJjMSksCiAJRlVOQ1RJT04ocWRzc19zdG0yOSksCkBAIC05MTIsMTQgKzg2MiwyMiBAQAogCUZVTkNUSU9OKGJsc3BfaTJjMyksCiAJRlVOQ1RJT04oZ2NjX2dwMyksCiAJRlVOQ1RJT04ocWRzc19zdG0xOSksCi0JRlVOQ1RJT04ocWRzczEyKSwKKwlGVU5DVElPTihxZHNzNCksCiAJRlVOQ1RJT04ocWRzc19zdG0xOCksCi0JRlVOQ1RJT04ocWRzczEzKSwKKwlGVU5DVElPTihxZHNzNSksCiAJRlVOQ1RJT04ocWRzc19zdG0xNyksCi0JRlVOQ1RJT04ocWRzczE0KSwKKwlGVU5DVElPTihxZHNzNiksCiAJRlVOQ1RJT04oYmltY19kdGUwKSwKIAlGVU5DVElPTihuYXRpdmVfdHNlbnMpLAotCUZVTkNUSU9OKHZzZW5zZV90cmlnZ2VyKSwKKwlGVU5DVElPTihxZHNzX3N0bTE2KSwKKwlGVU5DVElPTihxZHNzNyksCisJRlVOQ1RJT04oYmltY19kdGUxKSwKKwlGVU5DVElPTihzZWNfbWkycyksCisJRlVOQ1RJT04oYmxzcF9zcGk0KSwKKwlGVU5DVElPTihibHNwX3VhcnQ0KSwKKwlGVU5DVElPTihxZHNzX2N0aSksCisJRlVOQ1RJT04ocWRzc19zdG0yNyksCisJRlVOQ1RJT04ocWRzczgpLAogCUZVTkNUSU9OKHFkc3Nfc3RtMjYpLAogCUZVTkNUSU9OKHFkc3M5KSwKIAlGVU5DVElPTihibHNwX2kyYzQpLApAQCAtOTMwLDI2ICs4ODgsMTkgQEAKIAlGVU5DVElPTihnY2NfZ3AyKSwKIAlGVU5DVElPTihxZHNzX3N0bTI0KSwKIAlGVU5DVElPTihxZHNzMTEpLAotCUZVTkNUSU9OKHFkc3Nfc3RtMTYpLAotCUZVTkNUSU9OKHFkc3MxNSksCi0JRlVOQ1RJT04oYmltY19kdGUxKSwKLQlGVU5DVElPTihzZWNfbWkycyksCi0JRlVOQ1RJT04oYmxzcF9zcGk0KSwKLQlGVU5DVElPTihibHNwX3VhcnQ0KSwKLQlGVU5DVElPTihxZHNzX2N0aSksCi0JRlVOQ1RJT04ocWRzc19zdG0yNyksCi0JRlVOQ1RJT04ocWRzczgpLAogCUZVTkNUSU9OKGViaTJfYSksCi0JRlVOQ1RJT04ocWRzc19zdG0zKSwKIAlGVU5DVElPTihlYmkyX2xjZCksCi0JRlVOQ1RJT04ocWRzc19zdG0yKSwKIAlGVU5DVElPTihwbGxfYmlzdCksCi0JRlVOQ1RJT04ocWRzc19zdG0xKSwKLQlGVU5DVElPTihxZHNzX3N0bTApLAogCUZVTkNUSU9OKGFkc3BfZXh0KSwKLQlGVU5DVElPTihlcG0xKSwKKwlGVU5DVElPTihxZHNzX3N0bTExKSwKIAlGVU5DVElPTihtX3ZvYyksCisJRlVOQ1RJT04ocWRzc19zdG0xMCksCiAJRlVOQ1RJT04obmF0aXZlX2NoYXIpLAorCUZVTkNUSU9OKG5hdGl2ZV9jaGFyMyksCisJRlVOQ1RJT04obmF2X3BwcyksCisJRlVOQ1RJT04obmF2X2RyKSwKKwlGVU5DVElPTihuYXRpdmVfY2hhcjIpLAorCUZVTkNUSU9OKG5hdGl2ZV90c2Vuc2UpLAogCUZVTkNUSU9OKG5hdGl2ZV9jaGFyMSksCiAJRlVOQ1RJT04ocGFfaW5kaWNhdG9yKSwKIAlGVU5DVElPTihxZHNzX3RyYWNlY2xrKSwKQEAgLTk1OCwyMDQgKzkwOSwyMDAgQEAKIAlGVU5DVElPTihxbGlua19yZXEpLAogCUZVTkNUSU9OKHBsbF90ZXN0KSwKIAlGVU5DVElPTihjcmlfdHJuZyksCi0JRlVOQ1RJT04od21zc19yZXNldCksCi0JRlVOQ1RJT04obmF0aXZlX2NoYXIzKSwKLQlGVU5DVElPTihuYXZfcHBzKSwKLQlGVU5DVElPTihuYXZfZHIpLAotCUZVTkNUSU9OKG5hdGl2ZV9jaGFyMiksCi0JRlVOQ1RJT04obmF0aXZlX3RzZW5zZSksCiAJRlVOQ1RJT04ocHJuZ19yb3NjKSwKIAlGVU5DVElPTihjcmlfdHJuZzApLAogCUZVTkNUSU9OKGNyaV90cm5nMSksCiAJRlVOQ1RJT04ocGxsX3JlZiksCiAJRlVOQ1RJT04oY29leF91YXJ0KSwKLQlGVU5DVElPTihxZHNzX3N0bTExKSwKLQlGVU5DVElPTihxZHNzX3N0bTEwKSwKLQlGVU5DVElPTihkZHJfcHhpMCksCi0JRlVOQ1RJT04oYXAybWRtX3N0YXR1cyksCisJRlVOQ1RJT04ocWRzc190cmFjZWN0bCksCiAJRlVOQ1RJT04oZGRyX2Jpc3QpLAotCUZVTkNUSU9OKG1kbTJhcF9zdGF0dXMpLAotCUZVTkNUSU9OKGFwMm1kbV9lcnIpLAotCUZVTkNUSU9OKG1kbTJhcF9lcnIpLAotCUZVTkNUSU9OKGFwMm1kbV92ZGQpLAotCUZVTkNUSU9OKG1kbTJhcF92ZGQpLAotCUZVTkNUSU9OKGFwMm1kbV93YWtlKSwKLQlGVU5DVElPTihwY2llaG9zdF9yc3QpLAogCUZVTkNUSU9OKGJsc3Bfc3BpMSksCi0JRlVOQ1RJT04ocWRzc19zdG0xNCksCi0JRlVOQ1RJT04ocGNpZV93YWtlKSwKLQlGVU5DVElPTihtZG0yYXBfd2FrZSksCiAJRlVOQ1RJT04ocGNpX2UpLAorCUZVTkNUSU9OKHRndV9jaDApLAorCUZVTkNUSU9OKHBjaWVfY2xrcmVxKSwKKwlGVU5DVElPTihxZHNzX3N0bTE1KSwKKwlGVU5DVElPTihxZHNzX3N0bTE0KSwKIAlGVU5DVElPTihxZHNzX3N0bTEzKSwKKwlGVU5DVElPTihtZ3BpX2NsayksCisJRlVOQ1RJT04ocWRzc19zdG0xMiksCisJRlVOQ1RJT04ocWRzc19zdG05KSwKIAlGVU5DVElPTihpMnNfbWNsayksCiAJRlVOQ1RJT04oYXVkaW9fcmVmKSwKIAlGVU5DVElPTihsZG9fdXBkYXRlKSwKIAlGVU5DVElPTihxZHNzX3N0bTgpLAogCUZVTkNUSU9OKHFkc3Nfc3RtNyksCi0JRlVOQ1RJT04ocWRzczQpLAotCUZVTkNUSU9OKHRndV9jaDApLAotCUZVTkNUSU9OKHBjaWVfY2xrcmVxKSwKLQlGVU5DVElPTihxZHNzX3N0bTkpLAotCUZVTkNUSU9OKHFkc3Nfc3RtMTUpLAotCUZVTkNUSU9OKG1ncGlfY2xrKSwKLQlGVU5DVElPTihxZHNzX3N0bTEyKSwKLQlGVU5DVElPTihxZHNzX3RyYWNlY3RsKSwKLQlGVU5DVElPTihhdGVzdF9jaGFyKSwKKwlGVU5DVElPTihxZHNzMTIpLAogCUZVTkNUSU9OKHFkc3Nfc3RtNiksCi0JRlVOQ1RJT04ocWRzczUpLAotCUZVTkNUSU9OKGF0ZXN0X2NoYXIzKSwKKwlGVU5DVElPTihxZHNzMTMpLAogCUZVTkNUSU9OKHFkc3Nfc3RtNSksCi0JRlVOQ1RJT04ocWRzczYpLAotCUZVTkNUSU9OKGF0ZXN0X2NoYXIyKSwKKwlGVU5DVElPTihxZHNzMTQpLAogCUZVTkNUSU9OKHFkc3Nfc3RtNCksCi0JRlVOQ1RJT04ocWRzczcpLAotCUZVTkNUSU9OKGF0ZXN0X2NoYXIxKSwKKwlGVU5DVElPTihxZHNzMTUpLAogCUZVTkNUSU9OKHVpbTFfZGF0YSksCi0JRlVOQ1RJT04oYXRlc3RfY2hhcjApLAorCUZVTkNUSU9OKHFkc3Nfc3RtMyksCiAJRlVOQ1RJT04odWltMV9wcmVzZW50KSwKKwlGVU5DVElPTihxZHNzX3N0bTIpLAogCUZVTkNUSU9OKHVpbTFfcmVzZXQpLAorCUZVTkNUSU9OKHFkc3Nfc3RtMSksCiAJRlVOQ1RJT04odWltMV9jbGspLAorCUZVTkNUSU9OKHFkc3Nfc3RtMCksCiAJRlVOQ1RJT04oZGJnX291dCksCiAJRlVOQ1RJT04oZ2NjX3BsbHRlc3QpLAotCUZVTkNUSU9OKHVzYjJwaHlfYWMpLAogfTsKIAorLyogRXZlcnkgcGluIGlzIG1haW50YWluZWQgYXMgYSBzaW5nbGUgZ3JvdXAsIGFuZCBtaXNzaW5nIG9yIG5vbi1leGlzdGluZyBwaW4KKyAqIHdvdWxkIGJlIG1haW50YWluZWQgYXMgZHVtbXkgZ3JvdXAgdG8gc3luY2hyb25pemUgcGluIGdyb3VwIGluZGV4IHdpdGgKKyAqIHBpbiBkZXNjcmlwdG9yIHJlZ2lzdGVyZWQgd2l0aCBwaW5jdHJsIGNvcmUuCisgKiBDbGllbnRzIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlcXVlc3QgdGhlc2UgZHVtbXkgcGluIGdyb3Vwcy4KKyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fcGluZ3JvdXAgc2R4cG9vcndpbGxzX2dyb3Vwc1tdID0gewotCVBJTkdST1VQKDAsIHVpbTJfZGF0YSwgYmxzcF91YXJ0MSwgcWRzc19zdG0zMSwgZWJpMF93cmNkYywgTkEsIE5BLCBOQSwKLQkJIE5BLCBOQSksCi0JUElOR1JPVVAoMSwgdWltMl9wcmVzZW50LCBibHNwX3VhcnQxLCBxZHNzX3N0bTMwLCBOQSwgTkEsIE5BLCBOQSwgTkEsCi0JCSBOQSksCi0JUElOR1JPVVAoMiwgdWltMl9yZXNldCwgYmxzcF91YXJ0MSwgYmxzcF9pMmMxLCBxZHNzX3N0bTI5LCBlYmkwX3dyY2RjLAotCQkgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDMsIHVpbTJfY2xrLCBibHNwX3VhcnQxLCBibHNwX2kyYzEsIHFkc3Nfc3RtMjgsIE5BLCBOQSwgTkEsCi0JCSBOQSwgTkEpLAotCVBJTkdST1VQKDQsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwgTkEsIHFkc3Nfc3RtMjMsIHFkc3MzLCBOQSwgTkEsIE5BLAotCQkgTkEpLAotCVBJTkdST1VQKDUsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwgTkEsIHFkc3Nfc3RtMjIsIHFkc3MyLCBOQSwgTkEsIE5BLAotCQkgTkEpLAotCVBJTkdST1VQKDYsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwgYmxzcF9pMmMyLCBOQSwgcWRzc19zdG0yMSwgcWRzczEsCi0JCSBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg3LCBibHNwX3NwaTIsIGJsc3BfdWFydDIsIGJsc3BfaTJjMiwgTkEsIHFkc3Nfc3RtMjAsIHFkc3MwLAotCQkgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoOCwgcHJpX21pMnMsIGJsc3Bfc3BpMywgYmxzcF91YXJ0MywgZXh0X2RiZywgbGRvX2VuLCBOQSwgTkEsCi0JCSBOQSwgTkEpLAotCVBJTkdST1VQKDksIHByaV9taTJzLCBibHNwX3NwaTMsIGJsc3BfdWFydDMsIGV4dF9kYmcsIE5BLCBOQSwgTkEsIE5BLAotCQkgTkEpLAotCVBJTkdST1VQKDEwLCBwcmlfbWkycywgYmxzcF9zcGkzLCBibHNwX3VhcnQzLCBibHNwX2kyYzMsIGV4dF9kYmcsIE5BLAotCQkgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMTEsIHByaV9taTJzLCBibHNwX3NwaTMsIGJsc3BfdWFydDMsIGJsc3BfaTJjMywgZXh0X2RiZywKLQkJIGdjY19ncDMsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDEyLCBwcmlfbWkycywgTkEsIHFkc3Nfc3RtMTksIHFkc3MxMiwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgxMywgcHJpX21pMnMsIE5BLCBxZHNzX3N0bTE4LCBxZHNzMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMTQsIHByaV9taTJzLCBOQSwgTkEsIHFkc3Nfc3RtMTcsIHFkc3MxNCwgYmltY19kdGUwLAotCQkgbmF0aXZlX3RzZW5zLCB2c2Vuc2VfdHJpZ2dlciwgTkEpLAotCVBJTkdST1VQKDE1LCBwcmlfbWkycywgTkEsIE5BLCBxZHNzX3N0bTE2LCBxZHNzMTUsIE5BLCBOQSwgYmltY19kdGUxLAotCQkgTkEpLAotCVBJTkdST1VQKDE2LCBzZWNfbWkycywgYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBxZHNzX2N0aSwgcWRzc19jdGksIE5BLAotCQkgTkEsIHFkc3Nfc3RtMjcsIHFkc3M4KSwKLQlQSU5HUk9VUCgxNywgc2VjX21pMnMsIGJsc3Bfc3BpNCwgYmxzcF91YXJ0NCwgcWRzc19jdGksIHFkc3NfY3RpLCBOQSwKLQkJIHFkc3Nfc3RtMjYsIHFkc3M5LCBOQSksCi0JUElOR1JPVVAoMTgsIHNlY19taTJzLCBibHNwX3NwaTQsIGJsc3BfdWFydDQsIGJsc3BfaTJjNCwgZ2NjX2dwMSwgTkEsCi0JCSBxZHNzX3N0bTI1LCBxZHNzMTAsIE5BKSwKLQlQSU5HUk9VUCgxOSwgc2VjX21pMnMsIGJsc3Bfc3BpNCwgYmxzcF91YXJ0NCwgYmxzcF9pMmM0LCBqaXR0ZXJfYmlzdCwKLQkJIGdjY19ncDIsIE5BLCBxZHNzX3N0bTI0LCBxZHNzMTEpLAotCVBJTkdST1VQKDIwLCBzZWNfbWkycywgZWJpMl9hLCBibHNwX3VhcnQxLCBibHNwX3VhcnQ0LCBOQSwgcWRzc19zdG0zLAotCQkgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMjEsIHNlY19taTJzLCBlYmkyX2xjZCwgYmxzcF91YXJ0MSwgYmxzcF91YXJ0NCwgTkEsIE5BLAotCQkgcWRzc19zdG0yLCBOQSwgTkEpLAotCVBJTkdST1VQKDIyLCBzZWNfbWkycywgZWJpMl9sY2QsIGJsc3BfdWFydDEsIHFkc3NfY3RpLCBxZHNzX2N0aSwKLQkJIGJsc3BfdWFydDQsIHBsbF9iaXN0LCBOQSwgcWRzc19zdG0xKSwKLQlQSU5HUk9VUCgyMywgc2VjX21pMnMsIGViaTJfbGNkLCBxZHNzX2N0aSwgcWRzc19jdGksIGJsc3BfdWFydDEsCi0JCSBibHNwX3VhcnQ0LCBOQSwgcWRzc19zdG0wLCBOQSksCi0JUElOR1JPVVAoMjQsIGFkc3BfZXh0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDI1LCBtX3ZvYywgYWRzcF9leHQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgyNiwgTkEsIE5BLCBOQSwgbmF0aXZlX2NoYXIsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMjcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDI4LCB3bXNzX3Jlc2V0LCBuYXRpdmVfY2hhcjMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgyOSwgTkEsIE5BLCBuYXZfcHBzLCBuYXZfZHIsIE5BLCBuYXRpdmVfY2hhcjIsIG5hdGl2ZV90c2Vuc2UsCi0JCSBOQSwgTkEpLAotCVBJTkdST1VQKDMwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgzMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMzIsIE5BLCBuYXRpdmVfY2hhcjEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgzMywgTkEsIHBhX2luZGljYXRvciwgcWRzc190cmFjZWNsaywgbmF0aXZlX2NoYXIwLCBOQSwgTkEsIE5BLAotCQkgTkEsIE5BKSwKLQlQSU5HUk9VUCgzNCwgcWxpbmtfZW4sIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMzUsIHFsaW5rX3JlcSwgcGxsX3Rlc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCgzNiwgTkEsIE5BLCBjcmlfdHJuZywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMzcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDM4LCBOQSwgTkEsIHBybmdfcm9zYywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoMzksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQwLCBOQSwgTkEsIGNyaV90cm5nMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDEsIE5BLCBOQSwgY3JpX3RybmcxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0MiwgbmF2X3BwcywgTkEsIG5hdl9kciwgcGxsX3JlZiwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDQsIGNvZXhfdWFydCwgTkEsIHFkc3Nfc3RtMTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQ1LCBjb2V4X3VhcnQsIE5BLCBxZHNzX3N0bTEwLCBkZHJfcHhpMCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0NiwgbV92b2MsIGRkcl9iaXN0LCBkZHJfcHhpMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNDcsIGRkcl9iaXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDQ4LCBkZHJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg0OSwgZGRyX2Jpc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDUxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg1MiwgYmxzcF9zcGkyLCBibHNwX3NwaTEsIGJsc3Bfc3BpMywgYmxzcF9zcGk0LCBOQSwgTkEsCi0JCSBxZHNzX3N0bTE0LCBOQSwgTkEpLAotCVBJTkdST1VQKDUzLCBwY2lfZSwgTkEsIE5BLCBxZHNzX3N0bTEzLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDU0LCBxZHNzX2N0aSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg1NSwgcWRzc19jdGksIHFkc3NfY3RpLCB0Z3VfY2gwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg1NiwgcGNpZV9jbGtyZXEsIE5BLCBxZHNzX3N0bTksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDU3LCBOQSwgcWRzc19zdG0xNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDU4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg1OSwgcWRzc19jdGksIG1fdm9jLCBiaW1jX2R0ZTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDYwLCBtZ3BpX2NsaywgTkEsIHFkc3Nfc3RtMTIsIHFkc3NfdHJhY2VjdGwsIGJpbWNfZHRlMSwgTkEsCi0JCSBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg2MSwgcWRzc19jdGksIE5BLCBtX3ZvYywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNjIsIGkyc19tY2xrLCBuYXZfcHBzLCBuYXZfZHIsIGF1ZGlvX3JlZiwgYmxzcF9zcGkxLAotCQkgYmxzcF9zcGkyLCBibHNwX3NwaTMsIGJsc3Bfc3BpNCwgbGRvX3VwZGF0ZSksCi0JUElOR1JPVVAoNjMsIGJsc3BfdWFydDIsIE5BLCBxZHNzX3N0bTcsIHFkc3M0LCBhdGVzdF9jaGFyLCBOQSwgTkEsIE5BLAotCQkgTkEpLAotCVBJTkdST1VQKDY0LCBibHNwX3VhcnQyLCBOQSwgcWRzc19zdG02LCBxZHNzNSwgYXRlc3RfY2hhcjMsIE5BLCBOQSwgTkEsCi0JCSBOQSksCi0JUElOR1JPVVAoNjUsIGJsc3BfdWFydDIsIGJsc3BfaTJjMiwgTkEsIHFkc3Nfc3RtNSwgcWRzczYsIGF0ZXN0X2NoYXIyLAotCQkgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNjYsIGJsc3BfdWFydDIsIGJsc3BfaTJjMiwgTkEsIHFkc3Nfc3RtNCwgcWRzczcsIGF0ZXN0X2NoYXIxLAotCQkgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNjcsIHVpbTFfZGF0YSwgYXRlc3RfY2hhcjAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg2OCwgdWltMV9wcmVzZW50LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDY5LCB1aW0xX3Jlc2V0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDcwLCB1aW0xX2NsaywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg3MSwgbWdwaV9jbGssIGJsc3Bfc3BpMSwgYmxzcF9zcGkyLCBibHNwX3NwaTMsIGJsc3Bfc3BpNCwKLQkJIGRiZ19vdXQsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDcyLCBOQSwgYmxzcF9zcGkxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNzMsIE5BLCBibHNwX3NwaTEsIE5BLCBnY2NfcGxsdGVzdCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg3NCwgTkEsIGJsc3Bfc3BpMSwgTkEsIGJsc3BfaTJjMSwgZ2NjX3BsbHRlc3QsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg3NSwgTkEsIGJsc3Bfc3BpMSwgTkEsIGJsc3BfaTJjMSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg3NiwgYmxzcF9pMmM0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDc3LCBibHNwX2kyYzQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoNzgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDc5LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg4MCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoODEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDgyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg4MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoODQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDg1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg4NiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoODcsIE5BLCBOQSwgdXNiMnBoeV9hYywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoODgsIHFkc3NfY3RpLCBxZHNzX2N0aSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDg5LCBxZHNzX2N0aSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg5MCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoOTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDkyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg5MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoOTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDk1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg5NiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JUElOR1JPVVAoOTcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAotCVBJTkdST1VQKDk4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKLQlQSU5HUk9VUCg5OSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCi0JU0RDX1FEU0RfUElOR1JPVVAoc2RjMV9jbGssIDB4OWEwMDAsIDEzLCA2KSwKLQlTRENfUURTRF9QSU5HUk9VUChzZGMxX2NtZCwgMHg5YTAwMCwgMTEsIDMpLAotCVNEQ19RRFNEX1BJTkdST1VQKHNkYzFfZGF0YSwgMHg5YTAwMCwgOSwgMCksCisJWzBdID0gUElOR1JPVVAoMCwgdWltMl9kYXRhLCBibHNwX3VhcnQxLCBxZHNzX3N0bTMxLCBlYmkwX3dyY2RjLCBOQSwKKwkJICAgICAgIE5BLCBOQSwgTkEsIE5BKSwKKwlbMV0gPSBQSU5HUk9VUCgxLCB1aW0yX3ByZXNlbnQsIGJsc3BfdWFydDEsIHFkc3Nfc3RtMzAsIE5BLCBOQSwgTkEsIE5BLAorCQkgICAgICAgTkEsIE5BKSwKKwlbMl0gPSBQSU5HUk9VUCgyLCB1aW0yX3Jlc2V0LCBibHNwX3VhcnQxLCBibHNwX2kyYzEsIHFkc3Nfc3RtMjksCisJCSAgICAgICBlYmkwX3dyY2RjLCBOQSwgTkEsIE5BLCBOQSksCisJWzNdID0gUElOR1JPVVAoMywgdWltMl9jbGssIGJsc3BfdWFydDEsIGJsc3BfaTJjMSwgcWRzc19zdG0yOCwgTkEsIE5BLAorCQkgICAgICAgTkEsIE5BLCBOQSksCisJWzRdID0gUElOR1JPVVAoNCwgYmxzcF9zcGkyLCBibHNwX3VhcnQyLCBOQSwgcWRzc19zdG0yMywgcWRzczMsIE5BLCBOQSwKKwkJICAgICAgIE5BLCBOQSksCisJWzVdID0gUElOR1JPVVAoNSwgYmxzcF9zcGkyLCBibHNwX3VhcnQyLCBOQSwgcWRzc19zdG0yMiwgcWRzczIsIE5BLCBOQSwKKwkJICAgICAgIE5BLCBOQSksCisJWzZdID0gUElOR1JPVVAoNiwgYmxzcF9zcGkyLCBibHNwX3VhcnQyLCBibHNwX2kyYzIsIE5BLCBxZHNzX3N0bTIxLAorCQkgICAgICAgcWRzczEsIE5BLCBOQSwgTkEpLAorCVs3XSA9IFBJTkdST1VQKDcsIGJsc3Bfc3BpMiwgYmxzcF91YXJ0MiwgYmxzcF9pMmMyLCBOQSwgcWRzc19zdG0yMCwKKwkJICAgICAgIHFkc3MwLCBOQSwgTkEsIE5BKSwKKwlbOF0gPSBQSU5HUk9VUCg4LCBwcmlfbWkycywgYmxzcF9zcGkzLCBibHNwX3VhcnQzLCBleHRfZGJnLCBsZG9fZW4sIE5BLAorCQkgICAgICAgTkEsIE5BLCBOQSksCisJWzldID0gUElOR1JPVVAoOSwgcHJpX21pMnMsIGJsc3Bfc3BpMywgYmxzcF91YXJ0MywgZXh0X2RiZywgTkEsIE5BLCBOQSwKKwkJICAgICAgIE5BLCBOQSksCisJWzEwXSA9IFBJTkdST1VQKDEwLCBwcmlfbWkycywgYmxzcF9zcGkzLCBibHNwX3VhcnQzLCBibHNwX2kyYzMsCisJCQlleHRfZGJnLCBOQSwgTkEsIE5BLCBOQSksCisJWzExXSA9IFBJTkdST1VQKDExLCBwcmlfbWkycywgYmxzcF9zcGkzLCBibHNwX3VhcnQzLCBibHNwX2kyYzMsCisJCQlleHRfZGJnLCBnY2NfZ3AzLCBOQSwgTkEsIE5BKSwKKwlbMTJdID0gUElOR1JPVVAoMTIsIHByaV9taTJzLCBOQSwgcWRzc19zdG0xOSwgcWRzczQsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVsxM10gPSBQSU5HUk9VUCgxMywgcHJpX21pMnMsIE5BLCBxZHNzX3N0bTE4LCBxZHNzNSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzE0XSA9IFBJTkdST1VQKDE0LCBwcmlfbWkycywgTkEsIE5BLCBxZHNzX3N0bTE3LCBxZHNzNiwgYmltY19kdGUwLAorCQkJbmF0aXZlX3RzZW5zLCBOQSwgTkEpLAorCVsxNV0gPSBQSU5HUk9VUCgxNSwgcHJpX21pMnMsIE5BLCBOQSwgcWRzc19zdG0xNiwgcWRzczcsIE5BLCBOQSwKKwkJCWJpbWNfZHRlMSwgTkEpLAorCVsxNl0gPSBQSU5HUk9VUCgxNiwgc2VjX21pMnMsIGJsc3Bfc3BpNCwgYmxzcF91YXJ0NCwgcWRzc19jdGksCisJCQlxZHNzX2N0aSwgTkEsIHFkc3Nfc3RtMjcsIHFkc3M4LCBOQSksCisJWzE3XSA9IFBJTkdST1VQKDE3LCBzZWNfbWkycywgYmxzcF9zcGk0LCBibHNwX3VhcnQ0LCBxZHNzX2N0aSwKKwkJCXFkc3NfY3RpLCBxZHNzX3N0bTI2LCBxZHNzOSwgTkEsIE5BKSwKKwlbMThdID0gUElOR1JPVVAoMTgsIHNlY19taTJzLCBibHNwX3NwaTQsIGJsc3BfdWFydDQsIGJsc3BfaTJjNCwKKwkJCWdjY19ncDEsIHFkc3Nfc3RtMjUsIHFkc3MxMCwgTkEsIE5BKSwKKwlbMTldID0gUElOR1JPVVAoMTksIHNlY19taTJzLCBibHNwX3NwaTQsIGJsc3BfdWFydDQsIGJsc3BfaTJjNCwKKwkJCWppdHRlcl9iaXN0LCBnY2NfZ3AyLCBxZHNzX3N0bTI0LCBxZHNzMTEsIE5BKSwKKwlbMjBdID0gUElOR1JPVVAoMjAsIHNlY19taTJzLCBlYmkyX2EsIGJsc3BfdWFydDEsIGJsc3BfdWFydDQsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVsyMV0gPSBQSU5HUk9VUCgyMSwgc2VjX21pMnMsIGViaTJfbGNkLCBibHNwX3VhcnQxLCBibHNwX3VhcnQ0LCBOQSwgTkEsCisJCQlOQSwgTkEsIE5BKSwKKwlbMjJdID0gUElOR1JPVVAoMjIsIHNlY19taTJzLCBlYmkyX2xjZCwgYmxzcF91YXJ0MSwgcWRzc19jdGksIHFkc3NfY3RpLAorCQkJYmxzcF91YXJ0NCwgcGxsX2Jpc3QsIE5BLCBOQSksCisJWzIzXSA9IFBJTkdST1VQKDIzLCBzZWNfbWkycywgZWJpMl9sY2QsIHFkc3NfY3RpLCBxZHNzX2N0aSwgYmxzcF91YXJ0MSwKKwkJCWJsc3BfdWFydDQsIE5BLCBOQSwgTkEpLAorCVsyNF0gPSBQSU5HUk9VUCgyNCwgYWRzcF9leHQsIE5BLCBxZHNzX3N0bTExLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMjVdID0gUElOR1JPVVAoMjUsIG1fdm9jLCBhZHNwX2V4dCwgTkEsIHFkc3Nfc3RtMTAsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVsyNl0gPSBQSU5HUk9VUCgyNiwgTkEsIE5BLCBOQSwgbmF0aXZlX2NoYXIsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzI3XSA9IFBJTkdST1VQKDI3LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMjhdID0gUElOR1JPVVAoMjgsIE5BLCBuYXRpdmVfY2hhcjMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMjldID0gUElOR1JPVVAoMjksIE5BLCBOQSwgbmF2X3BwcywgbmF2X2RyLCBOQSwgbmF0aXZlX2NoYXIyLAorCQkJbmF0aXZlX3RzZW5zZSwgTkEsIE5BKSwKKwlbMzBdID0gUElOR1JPVVAoMzAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszMV0gPSBQSU5HUk9VUCgzMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzMyXSA9IFBJTkdST1VQKDMyLCBOQSwgbmF0aXZlX2NoYXIxLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzMzXSA9IFBJTkdST1VQKDMzLCBOQSwgcGFfaW5kaWNhdG9yLCBxZHNzX3RyYWNlY2xrLCBuYXRpdmVfY2hhcjAsIE5BLAorCQkJTkEsIE5BLCBOQSwgTkEpLAorCVszNF0gPSBQSU5HUk9VUCgzNCwgcWxpbmtfZW4sIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzM1XSA9IFBJTkdST1VQKDM1LCBxbGlua19yZXEsIHBsbF90ZXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzM2XSA9IFBJTkdST1VQKDM2LCBOQSwgTkEsIGNyaV90cm5nLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbMzddID0gUElOR1JPVVAoMzcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszOF0gPSBQSU5HUk9VUCgzOCwgTkEsIE5BLCBwcm5nX3Jvc2MsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVszOV0gPSBQSU5HUk9VUCgzOSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQwXSA9IFBJTkdST1VQKDQwLCBOQSwgTkEsIGNyaV90cm5nMCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQxXSA9IFBJTkdST1VQKDQxLCBOQSwgTkEsIGNyaV90cm5nMSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQyXSA9IFBJTkdST1VQKDQyLCBuYXZfcHBzLCBuYXZfZHIsIHBsbF9yZWYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs0M10gPSBQSU5HUk9VUCg0MywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ0XSA9IFBJTkdST1VQKDQ0LCBjb2V4X3VhcnQsIHFkc3NfdHJhY2VjdGwsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzQ1XSA9IFBJTkdST1VQKDQ1LCBjb2V4X3VhcnQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ2XSA9IFBJTkdST1VQKDQ2LCBtX3ZvYywgZGRyX2Jpc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNDddID0gUElOR1JPVVAoNDcsIGRkcl9iaXN0LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs0OF0gPSBQSU5HUk9VUCg0OCwgZGRyX2Jpc3QsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzQ5XSA9IFBJTkdST1VQKDQ5LCBkZHJfYmlzdCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNTBdID0gUElOR1JPVVAoNTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs1MV0gPSBQSU5HUk9VUCg1MSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzUyXSA9IFBJTkdST1VQKDUyLCBibHNwX3NwaTIsIGJsc3Bfc3BpMSwgYmxzcF9zcGkzLCBibHNwX3NwaTQsIE5BLCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs1M10gPSBQSU5HUk9VUCg1MywgcGNpX2UsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzU0XSA9IFBJTkdST1VQKDU0LCBxZHNzX2N0aSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNTVdID0gUElOR1JPVVAoNTUsIHFkc3NfY3RpLCBxZHNzX2N0aSwgdGd1X2NoMCwgTkEsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs1Nl0gPSBQSU5HUk9VUCg1NiwgcGNpZV9jbGtyZXEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzU3XSA9IFBJTkdST1VQKDU3LCBOQSwgcWRzc19zdG0xNSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs1OF0gPSBQSU5HUk9VUCg1OCwgTkEsIHFkc3Nfc3RtMTQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNTldID0gUElOR1JPVVAoNTksIHFkc3NfY3RpLCBtX3ZvYywgTkEsIHFkc3Nfc3RtMTMsIGJpbWNfZHRlMCwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNjBdID0gUElOR1JPVVAoNjAsIG1ncGlfY2xrLCBOQSwgcWRzc19zdG0xMiwgYmltY19kdGUxLCBOQSwgTkEsIE5BLAorCQkJTkEsIE5BKSwKKwlbNjFdID0gUElOR1JPVVAoNjEsIHFkc3NfY3RpLCBOQSwgbV92b2MsIE5BLCBxZHNzX3N0bTksIE5BLCBOQSwgTkEsIE5BKSwKKwlbNjJdID0gUElOR1JPVVAoNjIsIGkyc19tY2xrLCBuYXZfcHBzLCBuYXZfZHIsIGF1ZGlvX3JlZiwgYmxzcF9zcGkxLAorCQkJYmxzcF9zcGkyLCBibHNwX3NwaTMsIGJsc3Bfc3BpNCwgbGRvX3VwZGF0ZSksCisJWzYzXSA9IFBJTkdST1VQKDYzLCBibHNwX3VhcnQyLCBOQSwgcWRzc19zdG03LCBxZHNzMTIsIE5BLCBOQSwgTkEsIE5BLAorCQkJTkEpLAorCVs2NF0gPSBQSU5HUk9VUCg2NCwgYmxzcF91YXJ0MiwgcWRzc19zdG02LCBxZHNzMTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwKKwkJCU5BKSwKKwlbNjVdID0gUElOR1JPVVAoNjUsIGJsc3BfdWFydDIsIGJsc3BfaTJjMiwgTkEsIHFkc3Nfc3RtNSwgcWRzczE0LCBOQSwKKwkJCU5BLCBOQSwgTkEpLAorCVs2Nl0gPSBQSU5HUk9VUCg2NiwgYmxzcF91YXJ0MiwgYmxzcF9pMmMyLCBOQSwgcWRzc19zdG00LCBxZHNzMTUsIE5BLAorCQkJTkEsIE5BLCBOQSksCisJWzY3XSA9IFBJTkdST1VQKDY3LCB1aW0xX2RhdGEsIE5BLCBxZHNzX3N0bTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs2OF0gPSBQSU5HUk9VUCg2OCwgdWltMV9wcmVzZW50LCBxZHNzX3N0bTIsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsCisJCQlOQSksCisJWzY5XSA9IFBJTkdST1VQKDY5LCB1aW0xX3Jlc2V0LCBxZHNzX3N0bTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzBdID0gUElOR1JPVVAoNzAsIHVpbTFfY2xrLCBOQSwgcWRzc19zdG0wLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzFdID0gUElOR1JPVVAoNzEsIG1ncGlfY2xrLCBibHNwX3NwaTEsIGJsc3Bfc3BpMiwgYmxzcF9zcGkzLAorCQkJYmxzcF9zcGk0LCBkYmdfb3V0LCBOQSwgTkEsIE5BKSwKKwlbNzJdID0gUElOR1JPVVAoNzIsIE5BLCBibHNwX3NwaTEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzNdID0gUElOR1JPVVAoNzMsIE5BLCBibHNwX3NwaTEsIE5BLCBnY2NfcGxsdGVzdCwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzRdID0gUElOR1JPVVAoNzQsIE5BLCBibHNwX3NwaTEsIE5BLCBibHNwX2kyYzEsIGdjY19wbGx0ZXN0LCBOQSwgTkEsCisJCQlOQSwgTkEpLAorCVs3NV0gPSBQSU5HUk9VUCg3NSwgTkEsIGJsc3Bfc3BpMSwgTkEsIGJsc3BfaTJjMSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzZdID0gUElOR1JPVVAoNzYsIGJsc3BfaTJjNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzddID0gUElOR1JPVVAoNzcsIGJsc3BfaTJjNCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbNzhdID0gUElOR1JPVVAoNzgsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs3OV0gPSBQSU5HUk9VUCg3OSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzgwXSA9IFBJTkdST1VQKDgwLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODFdID0gUElOR1JPVVAoODEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4Ml0gPSBQSU5HUk9VUCg4MiwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzgzXSA9IFBJTkdST1VQKDgzLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODRdID0gUElOR1JPVVAoODQsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4NV0gPSBQSU5HUk9VUCg4NSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzg2XSA9IFBJTkdST1VQKDg2LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbODddID0gUElOR1JPVVAoODcsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs4OF0gPSBQSU5HUk9VUCg4OCwgcWRzc19jdGksIHFkc3NfY3RpLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzg5XSA9IFBJTkdST1VQKDg5LCBxZHNzX2N0aSwgcWRzc19jdGksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbOTBdID0gUElOR1JPVVAoOTAsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs5MV0gPSBQSU5HUk9VUCg5MSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzkyXSA9IFBJTkdST1VQKDkyLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbOTNdID0gUElOR1JPVVAoOTMsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs5NF0gPSBQSU5HUk9VUCg5NCwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzk1XSA9IFBJTkdST1VQKDk1LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbOTZdID0gUElOR1JPVVAoOTYsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVs5N10gPSBQSU5HUk9VUCg5NywgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSksCisJWzk4XSA9IFBJTkdST1VQKDk4LCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BKSwKKwlbOTldID0gUElOR1JPVVAoOTksIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEsIE5BLCBOQSwgTkEpLAorCVsxMDBdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMV9yY2xrLCAweDlhMDAwLCAxNSwgMCksCisJWzEwMV0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMxX2NsaywgMHg5YTAwMCwgMTMsIDYpLAorCVsxMDJdID0gU0RDX1FEU0RfUElOR1JPVVAoc2RjMV9jbWQsIDB4OWEwMDAsIDExLCAzKSwKKwlbMTAzXSA9IFNEQ19RRFNEX1BJTkdST1VQKHNkYzFfZGF0YSwgMHg5YTAwMCwgOSwgMCksCisJWzEwNF0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2NsaywgMHgwLCAxNCwgNiksCisJWzEwNV0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2NtZCwgMHgwLCAxMSwgMyksCisJWzEwNl0gPSBTRENfUURTRF9QSU5HUk9VUChzZGMyX2RhdGEsIDB4MCwgOSwgMCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9waW5jdHJsX3NvY19kYXRhIHNkeHBvb3J3aWxsc19waW5jdHJsID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLWdwaW8uYyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1ncGlvLmMKaW5kZXggZjA2ZmIxZi4uMmVjYmQyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLWdwaW8uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC00NzEsNiArNDcxLDcgQEAKIAogCXBhZCA9IHBjdGxkZXYtPmRlc2MtPnBpbnNbcGluXS5kcnZfZGF0YTsKIAorCXBhZC0+aXNfZW5hYmxlZCA9IHRydWU7CiAJZm9yIChpID0gMDsgaSA8IG5jb25mczsgaSsrKSB7CiAJCXBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSk7CiAJCWFyZyA9IHBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pOwpAQCAtNjE5LDYgKzYyMCwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKKwl2YWwgPSBwYWQtPmlzX2VuYWJsZWQgPDwgUE1JQ19HUElPX1JFR19NQVNURVJfRU5fU0hJRlQ7CisKKwlyZXQgPSBwbWljX2dwaW9fd3JpdGUoc3RhdGUsIHBhZCwgUE1JQ19HUElPX1JFR19FTl9DVEwsIHZhbCk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXdjZC5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC13Y2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNjhhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXdjZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5MzR4L3JlZ2lzdGVycy5oPgotCi0jaW5jbHVkZSAiLi4vY29yZS5oIgotI2luY2x1ZGUgIi4uL3BpbmN0cmwtdXRpbHMuaCIKLQotI2RlZmluZSBXQ0RfUkVHX0RJUl9DVEwgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9HUElPX0NUTF9PRQotI2RlZmluZSBXQ0RfUkVHX1ZBTF9DVEwgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9HUElPX0NUTF9EQVRBCi0jZGVmaW5lIFdDRF9HUElPX1BVTExfVVAgICAgICAgMQotI2RlZmluZSBXQ0RfR1BJT19QVUxMX0RPV04gICAgIDIKLSNkZWZpbmUgV0NEX0dQSU9fQklBU19ESVNBQkxFICAzCi0jZGVmaW5lIFdDRF9HUElPX1NUUklOR19MRU4gICAgMjAKLQotLyoqCi0gKiBzdHJ1Y3Qgd2NkX2dwaW9fcGFkIC0ga2VlcCBjdXJyZW50IEdQSU8gc2V0dGluZ3MKLSAqIEBvZmZzZXQ6IG9mZnNldCBvZiBncGlvLgotICogQGlzX3ZhbGlkOiBTZXQgdG8gZmFsc2UsIHdoZW4gR1BJTyBpbiBoaWdoIFogc3RhdGUuCi0gKiBAdmFsdWU6IHZhbHVlIG9mIGEgcGluCi0gKiBAb3V0cHV0X2VuYWJsZWQ6IFNldCB0byB0cnVlIGlmIEdQSU8gaXMgb3V0cHV0IGFuZCBmYWxzZSBpZiBpdCBpcyBpbnB1dAotICogQHB1bGx1cDogQ29uc3RhbnQgY3VycmVudCB3aGljaCBmbG93IHRocm91Z2ggR1BJTyBvdXRwdXQgYnVmZmVyLgotICogQHN0cmVuZ3RoOiBEcml2ZSBzdHJlbmd0aCBvZiBhIHBpbgotICovCi1zdHJ1Y3Qgd2NkX2dwaW9fcGFkIHsKLQl1MTYgIG9mZnNldDsKLQlib29sIGlzX3ZhbGlkOwotCWJvb2wgdmFsdWU7Ci0JYm9vbCBvdXRwdXRfZW5hYmxlZDsKLQl1bnNpZ25lZCBpbnQgcHVsbHVwOwotCXVuc2lnbmVkIGludCBzdHJlbmd0aDsKLX07Ci0KLXN0cnVjdCB3Y2RfZ3Bpb19wcml2IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHJlZ21hcCAqbWFwOwotCXN0cnVjdCBwaW5jdHJsX2RldiAqY3RybDsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci19OwotCi1zdGF0aWMgaW50IHdjZF9ncGlvX3JlYWQoc3RydWN0IHdjZF9ncGlvX3ByaXYgKnByaXZfZGF0YSwKLQkJCSAgc3RydWN0IHdjZF9ncGlvX3BhZCAqcGFkLCB1bnNpZ25lZCBpbnQgYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChwcml2X2RhdGEtPm1hcCwgYWRkciwgJnZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIocHJpdl9kYXRhLT5kZXYsICIlczogcmVhZCAweCV4IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBhZGRyKTsKLQllbHNlCi0JCXJldCA9ICh2YWwgPj4gcGFkLT5vZmZzZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfZ3Bpb193cml0ZShzdHJ1Y3Qgd2NkX2dwaW9fcHJpdiAqcHJpdl9kYXRhLAotCQkJICAgc3RydWN0IHdjZF9ncGlvX3BhZCAqcGFkLCB1bnNpZ25lZCBpbnQgYWRkciwKLQkJCSAgIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwcml2X2RhdGEtPm1hcCwgYWRkciwgKDEgPDwgcGFkLT5vZmZzZXQpLAotCQkJCQl2YWwgPDwgcGFkLT5vZmZzZXQpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHByaXZfZGF0YS0+ZGV2LCAid3JpdGUgMHgleCBmYWlsZWRcbiIsIGFkZHIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCi17Ci0JcmV0dXJuIHBjdGxkZXYtPmRlc2MtPm5waW5zOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqd2NkX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJdW5zaWduZWQgaW50IHBpbikKLXsKLQlyZXR1cm4gcGN0bGRldi0+ZGVzYy0+cGluc1twaW5dLm5hbWU7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgaW50IHBpbiwKLQkJY29uc3QgdW5zaWduZWQgaW50ICoqcGlucywgdW5zaWduZWQgaW50ICpudW1fcGlucykKLXsKLQkqcGlucyA9ICZwY3RsZGV2LT5kZXNjLT5waW5zW3Bpbl0ubnVtYmVyOwotCSpudW1fcGlucyA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgd2NkX3BpbmN0cmxfb3BzID0gewotCS5nZXRfZ3JvdXBzX2NvdW50ICAgICAgID0gd2NkX2dldF9ncm91cHNfY291bnQsCi0JLmdldF9ncm91cF9uYW1lICAgICAgICAgPSB3Y2RfZ2V0X2dyb3VwX25hbWUsCi0JLmdldF9ncm91cF9waW5zICAgICAgICAgPSB3Y2RfZ2V0X2dyb3VwX3BpbnMsCi0JLmR0X25vZGVfdG9fbWFwICAgICAgICAgPSBwaW5jb25mX2dlbmVyaWNfZHRfbm9kZV90b19tYXBfZ3JvdXAsCi0JLmR0X2ZyZWVfbWFwICAgICAgICAgICAgPSBwaW5jdHJsX3V0aWxzX2ZyZWVfbWFwLAotfTsKLQotc3RhdGljIGludCB3Y2RfY29uZmlnX2dldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCi0JCQkJdW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQotewotCXVuc2lnbmVkIGludCBwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKCpjb25maWcpOwotCXN0cnVjdCB3Y2RfZ3Bpb19wYWQgKnBhZDsKLQl1bnNpZ25lZCBpbnQgYXJnOwotCi0JcGFkID0gcGN0bGRldi0+ZGVzYy0+cGluc1twaW5dLmRydl9kYXRhOwotCi0Jc3dpdGNoIChwYXJhbSkgewotCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKLQkJYXJnID0gcGFkLT5wdWxsdXAgPT0gV0NEX0dQSU9fUFVMTF9ET1dOOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfQklBU19ESVNBQkxFOgotCQlhcmcgPSBwYWQtPnB1bGx1cCA9IFdDRF9HUElPX0JJQVNfRElTQUJMRTsKLQkJYnJlYWs7Ci0JY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKLQkJYXJnID0gcGFkLT5wdWxsdXAgPT0gV0NEX0dQSU9fUFVMTF9VUDsKLQkJYnJlYWs7Ci0JY2FzZSBQSU5fQ09ORklHX0JJQVNfSElHSF9JTVBFREFOQ0U6Ci0JCWFyZyA9ICFwYWQtPmlzX3ZhbGlkOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgotCQlhcmcgPSBwYWQtPm91dHB1dF9lbmFibGVkOwotCQlicmVhazsKLQljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgotCQlhcmcgPSBwYWQtPnZhbHVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqY29uZmlnID0gcGluY29uZl90b19jb25maWdfcGFja2VkKHBhcmFtLCBhcmcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdjZF9jb25maWdfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgaW50IHBpbiwKLQkJCQl1bnNpZ25lZCBsb25nICpjb25maWdzLCB1bnNpZ25lZCBpbnQgbmNvbmZzKQotewotCXN0cnVjdCB3Y2RfZ3Bpb19wcml2ICpwcml2X2RhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKLQlzdHJ1Y3Qgd2NkX2dwaW9fcGFkICpwYWQ7Ci0JdW5zaWduZWQgaW50IHBhcmFtLCBhcmc7Ci0JaW50IGksIHJldDsKLQotCXBhZCA9IHBjdGxkZXYtPmRlc2MtPnBpbnNbcGluXS5kcnZfZGF0YTsKLQotCWZvciAoaSA9IDA7IGkgPCBuY29uZnM7IGkrKykgewotCQlwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKGNvbmZpZ3NbaV0pOwotCQlhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWdzW2ldKTsKLQotCQlkZXZfZGJnKHByaXZfZGF0YS0+ZGV2LCAiJXM6IHBhcmFtOiAlZCBhcmc6ICVkIiwKLQkJCV9fZnVuY19fLCBwYXJhbSwgYXJnKTsKLQotCQlzd2l0Y2ggKHBhcmFtKSB7Ci0JCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6Ci0JCQlwYWQtPnB1bGx1cCA9IFdDRF9HUElPX0JJQVNfRElTQUJMRTsKLQkJCWJyZWFrOwotCQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgotCQkJcGFkLT5wdWxsdXAgPSBXQ0RfR1BJT19QVUxMX1VQOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKLQkJCXBhZC0+cHVsbHVwID0gV0NEX0dQSU9fUFVMTF9ET1dOOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19CSUFTX0hJR0hfSU1QRURBTkNFOgotCQkJcGFkLT5pc192YWxpZCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6Ci0JCQlwYWQtPm91dHB1dF9lbmFibGVkID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJY2FzZSBQSU5fQ09ORklHX09VVFBVVDoKLQkJCXBhZC0+b3V0cHV0X2VuYWJsZWQgPSB0cnVlOwotCQkJcGFkLT52YWx1ZSA9IGFyZzsKLQkJCWJyZWFrOwotCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6Ci0JCQlwYWQtPnN0cmVuZ3RoID0gYXJnOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JaWYgKHBhZC0+b3V0cHV0X2VuYWJsZWQpIHsKLQkJcmV0ID0gd2NkX2dwaW9fd3JpdGUocHJpdl9kYXRhLCBwYWQsIFdDRF9SRUdfRElSX0NUTCwKLQkJCQkgICAgIHBhZC0+b3V0cHV0X2VuYWJsZWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZG9uZTsKLQkJcmV0ID0gd2NkX2dwaW9fd3JpdGUocHJpdl9kYXRhLCBwYWQsIFdDRF9SRUdfVkFMX0NUTCwKLQkJCQkgICAgIHBhZC0+dmFsdWUpOwotCX0gZWxzZQotCQlyZXQgPSB3Y2RfZ3Bpb193cml0ZShwcml2X2RhdGEsIHBhZCwgV0NEX1JFR19ESVJfQ1RMLAotCQkJCSAgICAgcGFkLT5vdXRwdXRfZW5hYmxlZCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY29uZl9vcHMgd2NkX3BpbmNvbmZfb3BzID0gewotCS5pc19nZW5lcmljICA9IHRydWUsCi0JLnBpbl9jb25maWdfZ3JvdXBfZ2V0ID0gd2NkX2NvbmZpZ19nZXQsCi0JLnBpbl9jb25maWdfZ3JvdXBfc2V0ID0gd2NkX2NvbmZpZ19zZXQsCi19OwotCi1zdGF0aWMgaW50IHdjZF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGluKQotewotCXN0cnVjdCB3Y2RfZ3Bpb19wcml2ICpwcml2X2RhdGEgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZzsKLQotCWNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChQSU5fQ09ORklHX0lOUFVUX0VOQUJMRSwgMSk7Ci0KLQlyZXR1cm4gd2NkX2NvbmZpZ19zZXQocHJpdl9kYXRhLT5jdHJsLCBwaW4sICZjb25maWcsIDEpOwotfQotCi1zdGF0aWMgaW50IHdjZF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgcGluLCBpbnQgdmFsKQotewotCXN0cnVjdCB3Y2RfZ3Bpb19wcml2ICpwcml2X2RhdGEgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZzsKLQotCWNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChQSU5fQ09ORklHX09VVFBVVCwgdmFsKTsKLQotCXJldHVybiB3Y2RfY29uZmlnX3NldChwcml2X2RhdGEtPmN0cmwsIHBpbiwgJmNvbmZpZywgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaW4pCi17Ci0Jc3RydWN0IHdjZF9ncGlvX3ByaXYgKnByaXZfZGF0YSA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCXN0cnVjdCB3Y2RfZ3Bpb19wYWQgKnBhZDsKLQlpbnQgdmFsdWU7Ci0KLQlwYWQgPSBwcml2X2RhdGEtPmN0cmwtPmRlc2MtPnBpbnNbcGluXS5kcnZfZGF0YTsKLQotCWlmICghcGFkLT5pc192YWxpZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWx1ZSA9IHdjZF9ncGlvX3JlYWQocHJpdl9kYXRhLCBwYWQsIFdDRF9SRUdfVkFMX0NUTCk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpbiwgaW50IHZhbHVlKQotewotCXN0cnVjdCB3Y2RfZ3Bpb19wcml2ICpwcml2X2RhdGEgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQl1bnNpZ25lZCBsb25nIGNvbmZpZzsKLQotCWNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChQSU5fQ09ORklHX09VVFBVVCwgdmFsdWUpOwotCi0Jd2NkX2NvbmZpZ19zZXQocHJpdl9kYXRhLT5jdHJsLCBwaW4sICZjb25maWcsIDEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB3Y2RfZ3Bpb19jaGlwID0gewotCS5kaXJlY3Rpb25faW5wdXQgID0gd2NkX2dwaW9fZGlyZWN0aW9uX2lucHV0LAotCS5kaXJlY3Rpb25fb3V0cHV0ID0gd2NkX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkuZ2V0ID0gd2NkX2dwaW9fZ2V0LAotCS5zZXQgPSB3Y2RfZ3Bpb19zZXQsCi19OwotCi1zdGF0aWMgaW50IHdjZF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluZGVzYzsKLQlzdHJ1Y3QgcGluY3RybF9kZXNjICpwY3RybGRlc2M7Ci0Jc3RydWN0IHdjZF9ncGlvX3BhZCAqcGFkLCAqcGFkczsKLQlzdHJ1Y3Qgd2NkX2dwaW9fcHJpdiAqcHJpdl9kYXRhOwotCWludCByZXQsIGksIGo7Ci0JdTMyIG5waW5zOwotCWNoYXIgKipuYW1lOwotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAicWNvbSxudW0tZ3Bpb3MiLCAmbnBpbnMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICIlczogTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxudW0tZ3Bpb3MiLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3ByaXZfYWxsb2M7Ci0JfQotCWlmICghbnBpbnMpIHsKLQkJZGV2X2VycihkZXYsICIlczogbm8ub2YgcGlucyBhcmUgMFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wcml2X2FsbG9jOwotCX0KLQotCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdl9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2X2RhdGEpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcHJpdl9hbGxvYzsKLQl9Ci0KLQlwcml2X2RhdGEtPmRldiA9IGRldjsKLQlwcml2X2RhdGEtPm1hcCA9IGRldl9nZXRfcmVnbWFwKGRldi0+cGFyZW50LCBOVUxMKTsKLQlpZiAoIXByaXZfZGF0YS0+bWFwKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgcmVnbWFwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlZ21hcDsKLQl9Ci0KLQlwaW5kZXNjID0gZGV2bV9rY2FsbG9jKGRldiwgbnBpbnMsIHNpemVvZigqcGluZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghcGluZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9waW5zZWNfYWxsb2M7Ci0JfQotCi0JcGFkcyA9IGRldm1fa2NhbGxvYyhkZXYsIG5waW5zLCBzaXplb2YoKnBhZHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZHMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcGFkc19hbGxvYzsKLQl9Ci0KLQlwY3RybGRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBjdHJsZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghcGN0cmxkZXNjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3BpbmN0cmxfYWxsb2M7Ci0JfQotCi0JcGN0cmxkZXNjLT5wY3Rsb3BzID0gJndjZF9waW5jdHJsX29wczsKLQlwY3RybGRlc2MtPmNvbmZvcHMgPSAmd2NkX3BpbmNvbmZfb3BzOwotCXBjdHJsZGVzYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlwY3RybGRlc2MtPm5hbWUgPSBkZXZfbmFtZShkZXYpOwotCXBjdHJsZGVzYy0+cGlucyA9IHBpbmRlc2M7Ci0JcGN0cmxkZXNjLT5ucGlucyA9IG5waW5zOwotCi0JbmFtZSA9IGRldm1fa2NhbGxvYyhkZXYsIG5waW5zLCBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuYW1lKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX25hbWVfYWxsb2M7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBucGluczsgaSsrLCBwaW5kZXNjKyspIHsKLQkJbmFtZVtpXSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihjaGFyKSAqIFdDRF9HUElPX1NUUklOR19MRU4sCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIW5hbWVbaV0pIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9waW47Ci0JCX0KLQkJcGFkID0gJnBhZHNbaV07Ci0JCXBpbmRlc2MtPmRydl9kYXRhID0gcGFkOwotCQlwaW5kZXNjLT5udW1iZXIgPSBpOwotCQlzbnByaW50ZihuYW1lW2ldLCAoV0NEX0dQSU9fU1RSSU5HX0xFTiAtIDEpLCAiZ3BpbyVkIiwgKGkrMSkpOwotCQlwaW5kZXNjLT5uYW1lID0gbmFtZVtpXTsKLQkJcGFkLT5vZmZzZXQgPSBpOwotCQlwYWQtPmlzX3ZhbGlkICA9IHRydWU7Ci0JfQotCi0JcHJpdl9kYXRhLT5jaGlwID0gd2NkX2dwaW9fY2hpcDsKLQlwcml2X2RhdGEtPmNoaXAucGFyZW50ID0gZGV2OwotCXByaXZfZGF0YS0+Y2hpcC5iYXNlID0gLTE7Ci0JcHJpdl9kYXRhLT5jaGlwLm5ncGlvID0gbnBpbnM7Ci0JcHJpdl9kYXRhLT5jaGlwLmxhYmVsID0gZGV2X25hbWUoZGV2KTsKLQlwcml2X2RhdGEtPmNoaXAub2ZfZ3Bpb19uX2NlbGxzID0gMjsKLQlwcml2X2RhdGEtPmNoaXAuY2FuX3NsZWVwID0gZmFsc2U7Ci0KLQlwcml2X2RhdGEtPmN0cmwgPSBkZXZtX3BpbmN0cmxfcmVnaXN0ZXIoZGV2LCBwY3RybGRlc2MsIHByaXZfZGF0YSk7Ci0JaWYgKElTX0VSUihwcml2X2RhdGEtPmN0cmwpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byByZWdpc3RlciB0byBwaW5jdHJsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IFBUUl9FUlIocHJpdl9kYXRhLT5jdHJsKTsKLQkJZ290byBlcnJfcGluOwotCX0KLQotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZwcml2X2RhdGEtPmNoaXAsIHByaXZfZGF0YSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjYW4ndCBhZGQgZ3BpbyBjaGlwXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3BpbjsKLQl9Ci0KLQlyZXQgPSBncGlvY2hpcF9hZGRfcGluX3JhbmdlKCZwcml2X2RhdGEtPmNoaXAsIGRldl9uYW1lKGRldiksIDAsIDAsCi0JCQkJICAgICBucGlucyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIHBpbiByYW5nZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9yYW5nZTsKLQl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdl9kYXRhKTsKLQotCXJldHVybiAwOwotCi1lcnJfcmFuZ2U6Ci0JZ3Bpb2NoaXBfcmVtb3ZlKCZwcml2X2RhdGEtPmNoaXApOwotZXJyX3BpbjoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlkZXZtX2tmcmVlKGRldiwgbmFtZVtqXSk7Ci0JZGV2bV9rZnJlZShkZXYsIG5hbWUpOwotZXJyX25hbWVfYWxsb2M6Ci0JZGV2bV9rZnJlZShkZXYsIHBjdHJsZGVzYyk7Ci1lcnJfcGluY3RybF9hbGxvYzoKLQlkZXZtX2tmcmVlKGRldiwgcGFkcyk7Ci1lcnJfcGFkc19hbGxvYzoKLQlkZXZtX2tmcmVlKGRldiwgcGluZGVzYyk7Ci1lcnJfcGluc2VjX2FsbG9jOgotZXJyX3JlZ21hcDoKLQlkZXZtX2tmcmVlKGRldiwgcHJpdl9kYXRhKTsKLWVycl9wcml2X2FsbG9jOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdjZF9ncGlvX3ByaXYgKnByaXZfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZ3Bpb2NoaXBfcmVtb3ZlKCZwcml2X2RhdGEtPmNoaXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdjZF9waW5jdHJsX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjZC1waW5jdHJsIiB9LAotCXsgfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHdjZF9waW5jdHJsX29mX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2NkX3BpbmN0cmxfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInFjb20td2NkLXBpbmN0cmwiLAotCQkgICAub2ZfbWF0Y2hfdGFibGUgPSB3Y2RfcGluY3RybF9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IHdjZF9waW5jdHJsX3Byb2JlLAotCS5yZW1vdmUgPSB3Y2RfcGluY3RybF9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdjZF9waW5jdHJsX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMgV0NEIEdQSU8gcGluIGNvbnRyb2wgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jIGIvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1leHlub3MuYwppbmRleCBkMzJmYTJiLi5lOGFlZTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtZXh5bm9zLmMKQEAgLTE5NSw4ICsxOTUsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFuay0+c2xvY2ssIGZsYWdzKTsKIAotCWV4eW5vc19pcnFfdW5tYXNrKGlycWQpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNyw4ICsyMTUsNiBAQAogCXNoaWZ0ID0gaXJxZC0+aHdpcnEgKiBiYW5rX3R5cGUtPmZsZF93aWR0aFtQSU5DRkdfVFlQRV9GVU5DXTsKIAltYXNrID0gKDEgPDwgYmFua190eXBlLT5mbGRfd2lkdGhbUElOQ0ZHX1RZUEVfRlVOQ10pIC0gMTsKIAotCWV4eW5vc19pcnFfbWFzayhpcnFkKTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZiYW5rLT5zbG9jaywgZmxhZ3MpOwogCiAJY29uID0gcmVhZGwoZC0+dmlydF9iYXNlICsgcmVnX2Nvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW40aS1hMTAuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCmluZGV4IDg2MmEwOTYuLmJlNWM3MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCkBAIC04MTEsNiArODExLDcgQEAKIAkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QxIiksCQkvKiBEMTYgKi8KIAkJICBTVU5YSV9GVU5DVElPTigweDMsICJwYXRhIiksCQkvKiBBVEFEMTIgKi8KIAkJICBTVU5YSV9GVU5DVElPTigweDQsICJrZXlwYWQiKSwJLyogSU42ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAic2ltIiksCQkvKiBERVQgKi8KIAkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNiksCQkvKiBFSU5UMTYgKi8KIAkJICBTVU5YSV9GVU5DVElPTigweDcsICJjc2kxIikpLAkJLyogRDE2ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEgsIDE3KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC91bmlwaGllci9waW5jdHJsLXVuaXBoaWVyLWxkMTEuYyBiL2RyaXZlcnMvcGluY3RybC91bmlwaGllci9waW5jdHJsLXVuaXBoaWVyLWxkMTEuYwppbmRleCA3N2EwMjM2Li5iMTkwOTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvdW5pcGhpZXIvcGluY3RybC11bmlwaGllci1sZDExLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3VuaXBoaWVyL3BpbmN0cmwtdW5pcGhpZXItbGQxMS5jCkBAIC01MDgsNTcgKzUwOCw3MSBAQAogc3RhdGljIGNvbnN0IGludCB1c2IxX211eHZhbHNbXSA9IHswLCAwfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB1c2IyX3BpbnNbXSA9IHs1MCwgNTF9Owogc3RhdGljIGNvbnN0IGludCB1c2IyX211eHZhbHNbXSA9IHswLCAwfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlX3BpbnNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlMF9waW5zW10gPSB7CiAJMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsCQkvKiBQT1JUMHggKi8KIAkwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LAkJCQkvKiBQT1JUMXggKi8KIAk4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAkJCS8qIFBPUlQyeCAqLwotCTE2LCAxNywgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUM3ggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDR4ICovCi0JLTEsIC0xLCAtMSwgNDYsIDQ3LCA0OCwgNDksIDUwLAkJCS8qIFBPUlQ1eCAqLwotCTUxLCAtMSwgLTEsIDU0LCA1NSwgNTYsIDU3LCA1OCwJCQkvKiBQT1JUNnggKi8KKwkxNiwgMTcsIDE4LAkJCQkJLyogUE9SVDMwLTMyICovCit9Oworc3RhdGljIGNvbnN0IGludCBwb3J0X3JhbmdlMF9tdXh2YWxzW10gPSB7CisJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQweCAqLworCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMXggKi8KKwkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDJ4ICovCisJMTUsIDE1LCAxNSwJCQkJCS8qIFBPUlQzMC0zMiAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlMV9waW5zW10gPSB7CisJNDYsIDQ3LCA0OCwgNDksIDUwLAkJCQkvKiBQT1JUNTMtNTcgKi8KKwk1MSwJCQkJCQkvKiBQT1JUNjAgKi8KK307CitzdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2UxX211eHZhbHNbXSA9IHsKKwkxNSwgMTUsIDE1LCAxNSwgMTUsCQkJCS8qIFBPUlQ1My01NyAqLworCTE1LAkJCQkJCS8qIFBPUlQ2MCAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlMl9waW5zW10gPSB7CisJNTQsIDU1LCA1NiwgNTcsIDU4LAkJCQkvKiBQT1JUNjMtNjcgKi8KIAk1OSwgNjAsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsCQkJLyogUE9SVDd4ICovCiAJNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLAkJCS8qIFBPUlQ4eCAqLwogCTgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwJCQkvKiBQT1JUOXggKi8KIAk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsCQkJLyogUE9SVDEweCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTF4ICovCi0JOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwJCS8qIFBPUlQxMnggKi8KLQkxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwJCS8qIFBPUlQxM3ggKi8KLQkxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwJCS8qIFBPUlQxNHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE1eCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTZ4ICovCi0JLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJCS8qIFBPUlQxN3ggKi8KLQk2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsCQkJLyogUE9SVDE4eCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTl4ICovCi0JMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCQkvKiBQT1JUMjB4ICovCi0JMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsCQkvKiBQT1JUMjF4ICovCi0JMTM5LCAxNDAsIDE0MSwgMTQyLCAtMSwgLTEsIC0xLCAtMSwJCS8qIFBPUlQyMnggKi8KLQkxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwJCS8qIFBPUlQyM3ggKi8KLQkxNTUsIDE1NiwgMTU3LCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE1OCwJCS8qIFBPUlQyNHggKi8KIH07Ci1zdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2VfbXV4dmFsc1tdID0gewotCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMHggKi8KLQkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDF4ICovCi0JMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQyeCAqLwotCTE1LCAxNSwgMTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUM3ggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDR4ICovCi0JLTEsIC0xLCAtMSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQ1eCAqLwotCTE1LCAtMSwgLTEsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUNnggKi8KK3N0YXRpYyBjb25zdCBpbnQgcG9ydF9yYW5nZTJfbXV4dmFsc1tdID0geworCTE1LCAxNSwgMTUsIDE1LCAxNSwJCQkJLyogUE9SVDYzLTY3ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQ3eCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUOHggKi8KIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDl4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxMHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDExeCAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlM19waW5zW10gPSB7CisJOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwJCS8qIFBPUlQxMnggKi8KKwkxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwJCS8qIFBPUlQxM3ggKi8KKwkxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwJCS8qIFBPUlQxNHggKi8KK307CitzdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2UzX211eHZhbHNbXSA9IHsKIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDEyeCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMTN4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxNHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE1eCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTZ4ICovCi0JLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJCS8qIFBPUlQxN3ggKi8KK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgcG9ydF9yYW5nZTRfcGluc1tdID0geworCTYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwJCQkvKiBQT1JUMTh4ICovCit9Oworc3RhdGljIGNvbnN0IGludCBwb3J0X3JhbmdlNF9tdXh2YWxzW10gPSB7CiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxOHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE5eCAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlNV9waW5zW10gPSB7CisJMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCQkvKiBQT1JUMjB4ICovCisJMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsCQkvKiBQT1JUMjF4ICovCisJMTM5LCAxNDAsIDE0MSwgMTQyLAkJCQkvKiBQT1JUMjIwLTIyMyAqLworfTsKK3N0YXRpYyBjb25zdCBpbnQgcG9ydF9yYW5nZTVfbXV4dmFsc1tdID0gewogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMjB4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQyMXggKi8KLQkxNSwgMTUsIDE1LCAxNSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDIyeCAqLworCTE1LCAxNSwgMTUsIDE1LAkJCQkJLyogUE9SVDIyMC0yMjMgKi8KK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgcG9ydF9yYW5nZTZfcGluc1tdID0geworCTE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LAkJLyogUE9SVDIzeCAqLworCTE1NSwgMTU2LCAxNTcsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTU4LAkJLyogUE9SVDI0eCAqLworfTsKK3N0YXRpYyBjb25zdCBpbnQgcG9ydF9yYW5nZTZfbXV4dmFsc1tdID0gewogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMjN4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQyNHggKi8KIH07CkBAIC02MDcsMTQ3ICs2MjEsMTUzIEBACiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUCh1c2IwKSwKIAlVTklQSElFUl9QSU5DVFJMX0dST1VQKHVzYjEpLAogCVVOSVBISUVSX1BJTkNUUkxfR1JPVVAodXNiMiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX1BPUlQocG9ydF9yYW5nZSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX1BPUlQocG9ydF9yYW5nZTApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfR1BJT19SQU5HRV9QT1JUKHBvcnRfcmFuZ2UxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfUE9SVChwb3J0X3JhbmdlMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX1BPUlQocG9ydF9yYW5nZTMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfR1BJT19SQU5HRV9QT1JUKHBvcnRfcmFuZ2U0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfUE9SVChwb3J0X3JhbmdlNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX1BPUlQocG9ydF9yYW5nZTYpLAogCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfR1BJT19SQU5HRV9JUlEoeGlycSksCiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX0lSUSh4aXJxX2FsdGVybmF0aXZlcyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAwLCBwb3J0X3JhbmdlLCAwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDEsIHBvcnRfcmFuZ2UsIDEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMiwgcG9ydF9yYW5nZSwgMiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAzLCBwb3J0X3JhbmdlLCAzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDQsIHBvcnRfcmFuZ2UsIDQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNSwgcG9ydF9yYW5nZSwgNSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA2LCBwb3J0X3JhbmdlLCA2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDcsIHBvcnRfcmFuZ2UsIDcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMCwgcG9ydF9yYW5nZSwgOCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDExLCBwb3J0X3JhbmdlLCA5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIsIHBvcnRfcmFuZ2UsIDEwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMsIHBvcnRfcmFuZ2UsIDExKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQsIHBvcnRfcmFuZ2UsIDEyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTUsIHBvcnRfcmFuZ2UsIDEzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTYsIHBvcnRfcmFuZ2UsIDE0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTcsIHBvcnRfcmFuZ2UsIDE1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjAsIHBvcnRfcmFuZ2UsIDE2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEsIHBvcnRfcmFuZ2UsIDE3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIsIHBvcnRfcmFuZ2UsIDE4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMsIHBvcnRfcmFuZ2UsIDE5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQsIHBvcnRfcmFuZ2UsIDIwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjUsIHBvcnRfcmFuZ2UsIDIxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjYsIHBvcnRfcmFuZ2UsIDIyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjcsIHBvcnRfcmFuZ2UsIDIzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzAsIHBvcnRfcmFuZ2UsIDI0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzEsIHBvcnRfcmFuZ2UsIDI1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzIsIHBvcnRfcmFuZ2UsIDI2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTMsIHBvcnRfcmFuZ2UsIDQzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTQsIHBvcnRfcmFuZ2UsIDQ0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTUsIHBvcnRfcmFuZ2UsIDQ1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTYsIHBvcnRfcmFuZ2UsIDQ2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTcsIHBvcnRfcmFuZ2UsIDQ3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjAsIHBvcnRfcmFuZ2UsIDQ4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjMsIHBvcnRfcmFuZ2UsIDUxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjQsIHBvcnRfcmFuZ2UsIDUyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjUsIHBvcnRfcmFuZ2UsIDUzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjYsIHBvcnRfcmFuZ2UsIDU0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjcsIHBvcnRfcmFuZ2UsIDU1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzAsIHBvcnRfcmFuZ2UsIDU2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzEsIHBvcnRfcmFuZ2UsIDU3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzIsIHBvcnRfcmFuZ2UsIDU4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzMsIHBvcnRfcmFuZ2UsIDU5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzQsIHBvcnRfcmFuZ2UsIDYwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzUsIHBvcnRfcmFuZ2UsIDYxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzYsIHBvcnRfcmFuZ2UsIDYyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzcsIHBvcnRfcmFuZ2UsIDYzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODAsIHBvcnRfcmFuZ2UsIDY0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODEsIHBvcnRfcmFuZ2UsIDY1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODIsIHBvcnRfcmFuZ2UsIDY2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODMsIHBvcnRfcmFuZ2UsIDY3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODQsIHBvcnRfcmFuZ2UsIDY4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODUsIHBvcnRfcmFuZ2UsIDY5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODYsIHBvcnRfcmFuZ2UsIDcwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODcsIHBvcnRfcmFuZ2UsIDcxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTAsIHBvcnRfcmFuZ2UsIDcyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTEsIHBvcnRfcmFuZ2UsIDczKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTIsIHBvcnRfcmFuZ2UsIDc0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTMsIHBvcnRfcmFuZ2UsIDc1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTQsIHBvcnRfcmFuZ2UsIDc2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTUsIHBvcnRfcmFuZ2UsIDc3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTYsIHBvcnRfcmFuZ2UsIDc4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTcsIHBvcnRfcmFuZ2UsIDc5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTAwLCBwb3J0X3JhbmdlLCA4MCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwMSwgcG9ydF9yYW5nZSwgODEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDIsIHBvcnRfcmFuZ2UsIDgyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTAzLCBwb3J0X3JhbmdlLCA4MyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNCwgcG9ydF9yYW5nZSwgODQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDUsIHBvcnRfcmFuZ2UsIDg1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTA2LCBwb3J0X3JhbmdlLCA4NiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNywgcG9ydF9yYW5nZSwgODcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjAsIHBvcnRfcmFuZ2UsIDk2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIxLCBwb3J0X3JhbmdlLCA5NyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyMiwgcG9ydF9yYW5nZSwgOTgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjMsIHBvcnRfcmFuZ2UsIDk5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTI0LCBwb3J0X3JhbmdlLCAxMDApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjUsIHBvcnRfcmFuZ2UsIDEwMSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNiwgcG9ydF9yYW5nZSwgMTAyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTI3LCBwb3J0X3JhbmdlLCAxMDMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzAsIHBvcnRfcmFuZ2UsIDEwNCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzMSwgcG9ydF9yYW5nZSwgMTA1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMyLCBwb3J0X3JhbmdlLCAxMDYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzMsIHBvcnRfcmFuZ2UsIDEwNyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzNCwgcG9ydF9yYW5nZSwgMTA4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTM1LCBwb3J0X3JhbmdlLCAxMDkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzYsIHBvcnRfcmFuZ2UsIDExMCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzNywgcG9ydF9yYW5nZSwgMTExKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQwLCBwb3J0X3JhbmdlLCAxMTIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDEsIHBvcnRfcmFuZ2UsIDExMyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MiwgcG9ydF9yYW5nZSwgMTE0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQzLCBwb3J0X3JhbmdlLCAxMTUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDQsIHBvcnRfcmFuZ2UsIDExNiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0NSwgcG9ydF9yYW5nZSwgMTE3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ2LCBwb3J0X3JhbmdlLCAxMTgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDcsIHBvcnRfcmFuZ2UsIDExOSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4MCwgcG9ydF9yYW5nZSwgMTQ0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTgxLCBwb3J0X3JhbmdlLCAxNDUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODIsIHBvcnRfcmFuZ2UsIDE0NiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4MywgcG9ydF9yYW5nZSwgMTQ3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg0LCBwb3J0X3JhbmdlLCAxNDgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODUsIHBvcnRfcmFuZ2UsIDE0OSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4NiwgcG9ydF9yYW5nZSwgMTUwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg3LCBwb3J0X3JhbmdlLCAxNTEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDAsIHBvcnRfcmFuZ2UsIDE2MCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMSwgcG9ydF9yYW5nZSwgMTYxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjAyLCBwb3J0X3JhbmdlLCAxNjIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDMsIHBvcnRfcmFuZ2UsIDE2MyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwNCwgcG9ydF9yYW5nZSwgMTY0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjA1LCBwb3J0X3JhbmdlLCAxNjUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDYsIHBvcnRfcmFuZ2UsIDE2NiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwNywgcG9ydF9yYW5nZSwgMTY3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEwLCBwb3J0X3JhbmdlLCAxNjgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTEsIHBvcnRfcmFuZ2UsIDE2OSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMiwgcG9ydF9yYW5nZSwgMTcwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEzLCBwb3J0X3JhbmdlLCAxNzEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTQsIHBvcnRfcmFuZ2UsIDE3MiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxNSwgcG9ydF9yYW5nZSwgMTczKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE2LCBwb3J0X3JhbmdlLCAxNzQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTcsIHBvcnRfcmFuZ2UsIDE3NSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyMCwgcG9ydF9yYW5nZSwgMTc2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIxLCBwb3J0X3JhbmdlLCAxNzcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjIsIHBvcnRfcmFuZ2UsIDE3OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyMywgcG9ydF9yYW5nZSwgMTc5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMwLCBwb3J0X3JhbmdlLCAxODQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzEsIHBvcnRfcmFuZ2UsIDE4NSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMiwgcG9ydF9yYW5nZSwgMTg2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMzLCBwb3J0X3JhbmdlLCAxODcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzQsIHBvcnRfcmFuZ2UsIDE4OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzNSwgcG9ydF9yYW5nZSwgMTg5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjM2LCBwb3J0X3JhbmdlLCAxOTApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzcsIHBvcnRfcmFuZ2UsIDE5MSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MCwgcG9ydF9yYW5nZSwgMTkyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQxLCBwb3J0X3JhbmdlLCAxOTMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDIsIHBvcnRfcmFuZ2UsIDE5NCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MywgcG9ydF9yYW5nZSwgMTk1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ0LCBwb3J0X3JhbmdlLCAxOTYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDUsIHBvcnRfcmFuZ2UsIDE5NyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0NiwgcG9ydF9yYW5nZSwgMTk4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ3LCBwb3J0X3JhbmdlLCAxOTkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMCwgcG9ydF9yYW5nZTAsIDApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMSwgcG9ydF9yYW5nZTAsIDEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMiwgcG9ydF9yYW5nZTAsIDIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMywgcG9ydF9yYW5nZTAsIDMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNCwgcG9ydF9yYW5nZTAsIDQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNSwgcG9ydF9yYW5nZTAsIDUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNiwgcG9ydF9yYW5nZTAsIDYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNywgcG9ydF9yYW5nZTAsIDcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMCwgcG9ydF9yYW5nZTAsIDgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMSwgcG9ydF9yYW5nZTAsIDkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMiwgcG9ydF9yYW5nZTAsIDEwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMsIHBvcnRfcmFuZ2UwLCAxMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0LCBwb3J0X3JhbmdlMCwgMTIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNSwgcG9ydF9yYW5nZTAsIDEzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTYsIHBvcnRfcmFuZ2UwLCAxNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE3LCBwb3J0X3JhbmdlMCwgMTUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMCwgcG9ydF9yYW5nZTAsIDE2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEsIHBvcnRfcmFuZ2UwLCAxNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyLCBwb3J0X3JhbmdlMCwgMTgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMywgcG9ydF9yYW5nZTAsIDE5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQsIHBvcnRfcmFuZ2UwLCAyMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI1LCBwb3J0X3JhbmdlMCwgMjEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNiwgcG9ydF9yYW5nZTAsIDIyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjcsIHBvcnRfcmFuZ2UwLCAyMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDMwLCBwb3J0X3JhbmdlMCwgMjQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMSwgcG9ydF9yYW5nZTAsIDI1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzIsIHBvcnRfcmFuZ2UwLCAyNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDUzLCBwb3J0X3JhbmdlMSwgMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDU0LCBwb3J0X3JhbmdlMSwgMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDU1LCBwb3J0X3JhbmdlMSwgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDU2LCBwb3J0X3JhbmdlMSwgMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDU3LCBwb3J0X3JhbmdlMSwgNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDYwLCBwb3J0X3JhbmdlMSwgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDYzLCBwb3J0X3JhbmdlMiwgMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY0LCBwb3J0X3JhbmdlMiwgMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY1LCBwb3J0X3JhbmdlMiwgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY2LCBwb3J0X3JhbmdlMiwgMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY3LCBwb3J0X3JhbmdlMiwgNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDcwLCBwb3J0X3JhbmdlMiwgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDcxLCBwb3J0X3JhbmdlMiwgNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDcyLCBwb3J0X3JhbmdlMiwgNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDczLCBwb3J0X3JhbmdlMiwgOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDc0LCBwb3J0X3JhbmdlMiwgOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDc1LCBwb3J0X3JhbmdlMiwgMTApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NiwgcG9ydF9yYW5nZTIsIDExKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzcsIHBvcnRfcmFuZ2UyLCAxMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDgwLCBwb3J0X3JhbmdlMiwgMTMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MSwgcG9ydF9yYW5nZTIsIDE0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODIsIHBvcnRfcmFuZ2UyLCAxNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDgzLCBwb3J0X3JhbmdlMiwgMTYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NCwgcG9ydF9yYW5nZTIsIDE3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODUsIHBvcnRfcmFuZ2UyLCAxOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDg2LCBwb3J0X3JhbmdlMiwgMTkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NywgcG9ydF9yYW5nZTIsIDIwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTAsIHBvcnRfcmFuZ2UyLCAyMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDkxLCBwb3J0X3JhbmdlMiwgMjIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MiwgcG9ydF9yYW5nZTIsIDIzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTMsIHBvcnRfcmFuZ2UyLCAyNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDk0LCBwb3J0X3JhbmdlMiwgMjUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NSwgcG9ydF9yYW5nZTIsIDI2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTYsIHBvcnRfcmFuZ2UyLCAyNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDk3LCBwb3J0X3JhbmdlMiwgMjgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDAsIHBvcnRfcmFuZ2UyLCAyOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwMSwgcG9ydF9yYW5nZTIsIDMwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTAyLCBwb3J0X3JhbmdlMiwgMzEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDMsIHBvcnRfcmFuZ2UyLCAzMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNCwgcG9ydF9yYW5nZTIsIDMzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTA1LCBwb3J0X3JhbmdlMiwgMzQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDYsIHBvcnRfcmFuZ2UyLCAzNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNywgcG9ydF9yYW5nZTIsIDM2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIwLCBwb3J0X3JhbmdlMywgMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyMSwgcG9ydF9yYW5nZTMsIDEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjIsIHBvcnRfcmFuZ2UzLCAyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIzLCBwb3J0X3JhbmdlMywgMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNCwgcG9ydF9yYW5nZTMsIDQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjUsIHBvcnRfcmFuZ2UzLCA1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTI2LCBwb3J0X3JhbmdlMywgNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNywgcG9ydF9yYW5nZTMsIDcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzAsIHBvcnRfcmFuZ2UzLCA4KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMxLCBwb3J0X3JhbmdlMywgOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzMiwgcG9ydF9yYW5nZTMsIDEwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMzLCBwb3J0X3JhbmdlMywgMTEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzQsIHBvcnRfcmFuZ2UzLCAxMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzNSwgcG9ydF9yYW5nZTMsIDEzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTM2LCBwb3J0X3JhbmdlMywgMTQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzcsIHBvcnRfcmFuZ2UzLCAxNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MCwgcG9ydF9yYW5nZTMsIDE2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQxLCBwb3J0X3JhbmdlMywgMTcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDIsIHBvcnRfcmFuZ2UzLCAxOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MywgcG9ydF9yYW5nZTMsIDE5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ0LCBwb3J0X3JhbmdlMywgMjApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDUsIHBvcnRfcmFuZ2UzLCAyMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0NiwgcG9ydF9yYW5nZTMsIDIyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ3LCBwb3J0X3JhbmdlMywgMjMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODAsIHBvcnRfcmFuZ2U0LCAwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTgxLCBwb3J0X3JhbmdlNCwgMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4MiwgcG9ydF9yYW5nZTQsIDIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODMsIHBvcnRfcmFuZ2U0LCAzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg0LCBwb3J0X3JhbmdlNCwgNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4NSwgcG9ydF9yYW5nZTQsIDUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODYsIHBvcnRfcmFuZ2U0LCA2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg3LCBwb3J0X3JhbmdlNCwgNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMCwgcG9ydF9yYW5nZTUsIDApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDEsIHBvcnRfcmFuZ2U1LCAxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjAyLCBwb3J0X3JhbmdlNSwgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMywgcG9ydF9yYW5nZTUsIDMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDQsIHBvcnRfcmFuZ2U1LCA0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjA1LCBwb3J0X3JhbmdlNSwgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwNiwgcG9ydF9yYW5nZTUsIDYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDcsIHBvcnRfcmFuZ2U1LCA3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEwLCBwb3J0X3JhbmdlNSwgOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMSwgcG9ydF9yYW5nZTUsIDkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTIsIHBvcnRfcmFuZ2U1LCAxMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMywgcG9ydF9yYW5nZTUsIDExKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE0LCBwb3J0X3JhbmdlNSwgMTIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTUsIHBvcnRfcmFuZ2U1LCAxMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxNiwgcG9ydF9yYW5nZTUsIDE0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE3LCBwb3J0X3JhbmdlNSwgMTUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjAsIHBvcnRfcmFuZ2U1LCAxNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyMSwgcG9ydF9yYW5nZTUsIDE3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIyLCBwb3J0X3JhbmdlNSwgMTgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjMsIHBvcnRfcmFuZ2U1LCAxOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMCwgcG9ydF9yYW5nZTYsIDApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzEsIHBvcnRfcmFuZ2U2LCAxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMyLCBwb3J0X3JhbmdlNiwgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMywgcG9ydF9yYW5nZTYsIDMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzQsIHBvcnRfcmFuZ2U2LCA0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjM1LCBwb3J0X3JhbmdlNiwgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzNiwgcG9ydF9yYW5nZTYsIDYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzcsIHBvcnRfcmFuZ2U2LCA3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQwLCBwb3J0X3JhbmdlNiwgOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MSwgcG9ydF9yYW5nZTYsIDkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDIsIHBvcnRfcmFuZ2U2LCAxMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MywgcG9ydF9yYW5nZTYsIDExKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ0LCBwb3J0X3JhbmdlNiwgMTIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDUsIHBvcnRfcmFuZ2U2LCAxMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0NiwgcG9ydF9yYW5nZTYsIDE0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ3LCBwb3J0X3JhbmdlNiwgMTUpLAogCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHhpcnEwLCB4aXJxLCAwKSwKIAlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRSh4aXJxMSwgeGlycSwgMSksCiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUoeGlycTIsIHhpcnEsIDIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3VuaXBoaWVyL3BpbmN0cmwtdW5pcGhpZXItbGQyMC5jIGIvZHJpdmVycy9waW5jdHJsL3VuaXBoaWVyL3BpbmN0cmwtdW5pcGhpZXItbGQyMC5jCmluZGV4IDk2Njg2MzMuLjczYjgyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC91bmlwaGllci9waW5jdHJsLXVuaXBoaWVyLWxkMjAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvdW5pcGhpZXIvcGluY3RybC11bmlwaGllci1sZDIwLmMKQEAgLTU5Nyw3ICs1OTcsNyBAQAogc3RhdGljIGNvbnN0IGludCB1c2IyX211eHZhbHNbXSA9IHswLCAwfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB1c2IzX3BpbnNbXSA9IHs1MiwgNTN9Owogc3RhdGljIGNvbnN0IGludCB1c2IzX211eHZhbHNbXSA9IHswLCAwfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlX3BpbnNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlMF9waW5zW10gPSB7CiAJMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsCQkvKiBQT1JUMHggKi8KIAkwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LAkJCQkvKiBQT1JUMXggKi8KIAk4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAkJCS8qIFBPUlQyeCAqLwpAQCAtNjA5LDIzICs2MDksOCBAQAogCTc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwJCQkvKiBQT1JUOHggKi8KIAk4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsCQkJLyogUE9SVDl4ICovCiAJOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LAkJCS8qIFBPUlQxMHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDExeCAqLwotCTk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsCQkvKiBQT1JUMTJ4ICovCi0JMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsCQkvKiBQT1JUMTN4ICovCi0JMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsCQkvKiBQT1JUMTR4ICovCi0JLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJCS8qIFBPUlQxNXggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE2eCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTd4ICovCi0JNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LAkJCS8qIFBPUlQxOHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE5eCAqLwotCTEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLAkJLyogUE9SVDIweCAqLwotCTEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LAkJLyogUE9SVDIxeCAqLwotCTEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LAkJLyogUE9SVDIyeCAqLwotCTE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LAkJLyogUE9SVDIzeCAqLwotCTE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLAkJLyogUE9SVDI0eCAqLwotCTE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAkJCS8qIFBPUlQyNXggKi8KIH07Ci1zdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2VfbXV4dmFsc1tdID0geworc3RhdGljIGNvbnN0IGludCBwb3J0X3JhbmdlMF9tdXh2YWxzW10gPSB7CiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQweCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMXggKi8KIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDJ4ICovCkBAIC02MzcsMjEgKzYyMiwzOCBAQAogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUOHggKi8KIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDl4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxMHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDExeCAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlMV9waW5zW10gPSB7CisJOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwJCS8qIFBPUlQxMnggKi8KKwkxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwJCS8qIFBPUlQxM3ggKi8KKwkxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwJCS8qIFBPUlQxNHggKi8KK307CitzdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2UxX211eHZhbHNbXSA9IHsKIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDEyeCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMTN4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxNHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE1eCAqLwotCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwJCQkvKiBQT1JUMTZ4ICovCi0JLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAkJCS8qIFBPUlQxN3ggKi8KK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgcG9ydF9yYW5nZTJfcGluc1tdID0geworCTYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwJCQkvKiBQT1JUMTh4ICovCit9Oworc3RhdGljIGNvbnN0IGludCBwb3J0X3JhbmdlMl9tdXh2YWxzW10gPSB7CiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQxOHggKi8KLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCQkJLyogUE9SVDE5eCAqLworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0X3JhbmdlM19waW5zW10gPSB7CisJMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCQkvKiBQT1JUMjB4ICovCisJMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsCQkvKiBQT1JUMjF4ICovCisJMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsCQkvKiBQT1JUMjJ4ICovCisJMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsCQkvKiBQT1JUMjN4ICovCisJMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsCQkvKiBQT1JUMjR4ICovCisJMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsCQkJLyogUE9SVDI1MC0yNTQgKi8KK307CitzdGF0aWMgY29uc3QgaW50IHBvcnRfcmFuZ2UzX211eHZhbHNbXSA9IHsKIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDIweCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMjF4ICovCiAJMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAkJCS8qIFBPUlQyMnggKi8KIAkxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCQkJLyogUE9SVDIzeCAqLwogCTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwJCQkvKiBQT1JUMjR4ICovCi0JMTUsIDE1LCAxNSwgMTUsIDE1LAkJCQkvKiBQT1JUMjV4ICovCisJMTUsIDE1LCAxNSwgMTUsIDE1LAkJCQkvKiBQT1JUMjUwLTI1NCAqLwogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB4aXJxX3BpbnNbXSA9IHsKIAkxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwJCS8qIFhJUlEwLTcgKi8KQEAgLTY5NSwxNzQgKzY5NywxNzcgQEAKIAlVTklQSElFUl9QSU5DVFJMX0dST1VQKHVzYjEpLAogCVVOSVBISUVSX1BJTkNUUkxfR1JPVVAodXNiMiksCiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUCh1c2IzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfUE9SVChwb3J0X3JhbmdlKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfUE9SVChwb3J0X3JhbmdlMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX1BPUlQocG9ydF9yYW5nZTEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfR1BJT19SQU5HRV9QT1JUKHBvcnRfcmFuZ2UyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfUE9SVChwb3J0X3JhbmdlMyksCiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9HUElPX1JBTkdFX0lSUSh4aXJxKSwKIAlVTklQSElFUl9QSU5DVFJMX0dST1VQX0dQSU9fUkFOR0VfSVJRKHhpcnFfYWx0ZXJuYXRpdmVzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDAsIHBvcnRfcmFuZ2UsIDApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwMSwgcG9ydF9yYW5nZSwgMSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAyLCBwb3J0X3JhbmdlLCAyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDMsIHBvcnRfcmFuZ2UsIDMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNCwgcG9ydF9yYW5nZSwgNCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA1LCBwb3J0X3JhbmdlLCA1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MDYsIHBvcnRfcmFuZ2UsIDYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQwNywgcG9ydF9yYW5nZSwgNyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwLCBwb3J0X3JhbmdlLCA4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTEsIHBvcnRfcmFuZ2UsIDkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMiwgcG9ydF9yYW5nZSwgMTApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMywgcG9ydF9yYW5nZSwgMTEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNCwgcG9ydF9yYW5nZSwgMTIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNSwgcG9ydF9yYW5nZSwgMTMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNiwgcG9ydF9yYW5nZSwgMTQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNywgcG9ydF9yYW5nZSwgMTUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMCwgcG9ydF9yYW5nZSwgMTYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMSwgcG9ydF9yYW5nZSwgMTcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMiwgcG9ydF9yYW5nZSwgMTgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMywgcG9ydF9yYW5nZSwgMTkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNCwgcG9ydF9yYW5nZSwgMjApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNSwgcG9ydF9yYW5nZSwgMjEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNiwgcG9ydF9yYW5nZSwgMjIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNywgcG9ydF9yYW5nZSwgMjMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMCwgcG9ydF9yYW5nZSwgMjQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMSwgcG9ydF9yYW5nZSwgMjUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMiwgcG9ydF9yYW5nZSwgMjYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMywgcG9ydF9yYW5nZSwgMjcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzNCwgcG9ydF9yYW5nZSwgMjgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzNSwgcG9ydF9yYW5nZSwgMjkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzNiwgcG9ydF9yYW5nZSwgMzApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzNywgcG9ydF9yYW5nZSwgMzEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MCwgcG9ydF9yYW5nZSwgMzIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MSwgcG9ydF9yYW5nZSwgMzMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MiwgcG9ydF9yYW5nZSwgMzQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MywgcG9ydF9yYW5nZSwgMzUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0NCwgcG9ydF9yYW5nZSwgMzYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0NSwgcG9ydF9yYW5nZSwgMzcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0NiwgcG9ydF9yYW5nZSwgMzgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0NywgcG9ydF9yYW5nZSwgMzkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1MCwgcG9ydF9yYW5nZSwgNDApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1MSwgcG9ydF9yYW5nZSwgNDEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1MiwgcG9ydF9yYW5nZSwgNDIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1MywgcG9ydF9yYW5nZSwgNDMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NCwgcG9ydF9yYW5nZSwgNDQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NSwgcG9ydF9yYW5nZSwgNDUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NiwgcG9ydF9yYW5nZSwgNDYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NywgcG9ydF9yYW5nZSwgNDcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2MCwgcG9ydF9yYW5nZSwgNDgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2MSwgcG9ydF9yYW5nZSwgNDkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2MiwgcG9ydF9yYW5nZSwgNTApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2MywgcG9ydF9yYW5nZSwgNTEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2NCwgcG9ydF9yYW5nZSwgNTIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2NSwgcG9ydF9yYW5nZSwgNTMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2NiwgcG9ydF9yYW5nZSwgNTQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2NywgcG9ydF9yYW5nZSwgNTUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MCwgcG9ydF9yYW5nZSwgNTYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MSwgcG9ydF9yYW5nZSwgNTcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MiwgcG9ydF9yYW5nZSwgNTgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MywgcG9ydF9yYW5nZSwgNTkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NCwgcG9ydF9yYW5nZSwgNjApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NSwgcG9ydF9yYW5nZSwgNjEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NiwgcG9ydF9yYW5nZSwgNjIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NywgcG9ydF9yYW5nZSwgNjMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MCwgcG9ydF9yYW5nZSwgNjQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MSwgcG9ydF9yYW5nZSwgNjUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MiwgcG9ydF9yYW5nZSwgNjYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MywgcG9ydF9yYW5nZSwgNjcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NCwgcG9ydF9yYW5nZSwgNjgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NSwgcG9ydF9yYW5nZSwgNjkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NiwgcG9ydF9yYW5nZSwgNzApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NywgcG9ydF9yYW5nZSwgNzEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MCwgcG9ydF9yYW5nZSwgNzIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MSwgcG9ydF9yYW5nZSwgNzMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MiwgcG9ydF9yYW5nZSwgNzQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MywgcG9ydF9yYW5nZSwgNzUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NCwgcG9ydF9yYW5nZSwgNzYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NSwgcG9ydF9yYW5nZSwgNzcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NiwgcG9ydF9yYW5nZSwgNzgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NywgcG9ydF9yYW5nZSwgNzkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDAsIHBvcnRfcmFuZ2UsIDgwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTAxLCBwb3J0X3JhbmdlLCA4MSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwMiwgcG9ydF9yYW5nZSwgODIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDMsIHBvcnRfcmFuZ2UsIDgzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTA0LCBwb3J0X3JhbmdlLCA4NCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNSwgcG9ydF9yYW5nZSwgODUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDYsIHBvcnRfcmFuZ2UsIDg2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTA3LCBwb3J0X3JhbmdlLCA4NyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyMCwgcG9ydF9yYW5nZSwgOTYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjEsIHBvcnRfcmFuZ2UsIDk3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIyLCBwb3J0X3JhbmdlLCA5OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyMywgcG9ydF9yYW5nZSwgOTkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjQsIHBvcnRfcmFuZ2UsIDEwMCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNSwgcG9ydF9yYW5nZSwgMTAxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTI2LCBwb3J0X3JhbmdlLCAxMDIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjcsIHBvcnRfcmFuZ2UsIDEwMyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzMCwgcG9ydF9yYW5nZSwgMTA0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMxLCBwb3J0X3JhbmdlLCAxMDUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzIsIHBvcnRfcmFuZ2UsIDEwNiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzMywgcG9ydF9yYW5nZSwgMTA3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTM0LCBwb3J0X3JhbmdlLCAxMDgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzUsIHBvcnRfcmFuZ2UsIDEwOSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzNiwgcG9ydF9yYW5nZSwgMTEwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTM3LCBwb3J0X3JhbmdlLCAxMTEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDAsIHBvcnRfcmFuZ2UsIDExMiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MSwgcG9ydF9yYW5nZSwgMTEzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQyLCBwb3J0X3JhbmdlLCAxMTQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDMsIHBvcnRfcmFuZ2UsIDExNSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0NCwgcG9ydF9yYW5nZSwgMTE2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ1LCBwb3J0X3JhbmdlLCAxMTcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDYsIHBvcnRfcmFuZ2UsIDExOCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0NywgcG9ydF9yYW5nZSwgMTE5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTgwLCBwb3J0X3JhbmdlLCAxNDQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODEsIHBvcnRfcmFuZ2UsIDE0NSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4MiwgcG9ydF9yYW5nZSwgMTQ2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTgzLCBwb3J0X3JhbmdlLCAxNDcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODQsIHBvcnRfcmFuZ2UsIDE0OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4NSwgcG9ydF9yYW5nZSwgMTQ5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg2LCBwb3J0X3JhbmdlLCAxNTApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODcsIHBvcnRfcmFuZ2UsIDE1MSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMCwgcG9ydF9yYW5nZSwgMTYwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjAxLCBwb3J0X3JhbmdlLCAxNjEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDIsIHBvcnRfcmFuZ2UsIDE2MiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMywgcG9ydF9yYW5nZSwgMTYzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjA0LCBwb3J0X3JhbmdlLCAxNjQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDUsIHBvcnRfcmFuZ2UsIDE2NSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwNiwgcG9ydF9yYW5nZSwgMTY2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjA3LCBwb3J0X3JhbmdlLCAxNjcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTAsIHBvcnRfcmFuZ2UsIDE2OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMSwgcG9ydF9yYW5nZSwgMTY5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEyLCBwb3J0X3JhbmdlLCAxNzApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTMsIHBvcnRfcmFuZ2UsIDE3MSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxNCwgcG9ydF9yYW5nZSwgMTcyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE1LCBwb3J0X3JhbmdlLCAxNzMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTYsIHBvcnRfcmFuZ2UsIDE3NCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxNywgcG9ydF9yYW5nZSwgMTc1KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIwLCBwb3J0X3JhbmdlLCAxNzYpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjEsIHBvcnRfcmFuZ2UsIDE3NyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyMiwgcG9ydF9yYW5nZSwgMTc4KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIzLCBwb3J0X3JhbmdlLCAxNzkpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjQsIHBvcnRfcmFuZ2UsIDE4MCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyNSwgcG9ydF9yYW5nZSwgMTgxKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjI2LCBwb3J0X3JhbmdlLCAxODIpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjcsIHBvcnRfcmFuZ2UsIDE4MyksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMCwgcG9ydF9yYW5nZSwgMTg0KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMxLCBwb3J0X3JhbmdlLCAxODUpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzIsIHBvcnRfcmFuZ2UsIDE4NiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMywgcG9ydF9yYW5nZSwgMTg3KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjM0LCBwb3J0X3JhbmdlLCAxODgpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzUsIHBvcnRfcmFuZ2UsIDE4OSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzNiwgcG9ydF9yYW5nZSwgMTkwKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjM3LCBwb3J0X3JhbmdlLCAxOTEpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDAsIHBvcnRfcmFuZ2UsIDE5MiksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MSwgcG9ydF9yYW5nZSwgMTkzKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQyLCBwb3J0X3JhbmdlLCAxOTQpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDMsIHBvcnRfcmFuZ2UsIDE5NSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0NCwgcG9ydF9yYW5nZSwgMTk2KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ1LCBwb3J0X3JhbmdlLCAxOTcpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDYsIHBvcnRfcmFuZ2UsIDE5OCksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0NywgcG9ydF9yYW5nZSwgMTk5KSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjUwLCBwb3J0X3JhbmdlLCAyMDApLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNTEsIHBvcnRfcmFuZ2UsIDIwMSksCi0JVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI1MiwgcG9ydF9yYW5nZSwgMjAyKSwKLQlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjUzLCBwb3J0X3JhbmdlLCAyMDMpLAotCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNTQsIHBvcnRfcmFuZ2UsIDIwNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAwLCBwb3J0X3JhbmdlMCwgMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAxLCBwb3J0X3JhbmdlMCwgMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAyLCBwb3J0X3JhbmdlMCwgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDAzLCBwb3J0X3JhbmdlMCwgMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA0LCBwb3J0X3JhbmdlMCwgNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA1LCBwb3J0X3JhbmdlMCwgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA2LCBwb3J0X3JhbmdlMCwgNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDA3LCBwb3J0X3JhbmdlMCwgNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwLCBwb3J0X3JhbmdlMCwgOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDExLCBwb3J0X3JhbmdlMCwgOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyLCBwb3J0X3JhbmdlMCwgMTApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMywgcG9ydF9yYW5nZTAsIDExKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQsIHBvcnRfcmFuZ2UwLCAxMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE1LCBwb3J0X3JhbmdlMCwgMTMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNiwgcG9ydF9yYW5nZTAsIDE0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTcsIHBvcnRfcmFuZ2UwLCAxNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwLCBwb3J0X3JhbmdlMCwgMTYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMSwgcG9ydF9yYW5nZTAsIDE3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIsIHBvcnRfcmFuZ2UwLCAxOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzLCBwb3J0X3JhbmdlMCwgMTkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNCwgcG9ydF9yYW5nZTAsIDIwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjUsIHBvcnRfcmFuZ2UwLCAyMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI2LCBwb3J0X3JhbmdlMCwgMjIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNywgcG9ydF9yYW5nZTAsIDIzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzAsIHBvcnRfcmFuZ2UwLCAyNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDMxLCBwb3J0X3JhbmdlMCwgMjUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzMiwgcG9ydF9yYW5nZTAsIDI2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzMsIHBvcnRfcmFuZ2UwLCAyNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDM0LCBwb3J0X3JhbmdlMCwgMjgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQzNSwgcG9ydF9yYW5nZTAsIDI5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MzYsIHBvcnRfcmFuZ2UwLCAzMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDM3LCBwb3J0X3JhbmdlMCwgMzEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MCwgcG9ydF9yYW5nZTAsIDMyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NDEsIHBvcnRfcmFuZ2UwLCAzMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDQyLCBwb3J0X3JhbmdlMCwgMzQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0MywgcG9ydF9yYW5nZTAsIDM1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NDQsIHBvcnRfcmFuZ2UwLCAzNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDQ1LCBwb3J0X3JhbmdlMCwgMzcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ0NiwgcG9ydF9yYW5nZTAsIDM4KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NDcsIHBvcnRfcmFuZ2UwLCAzOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDUwLCBwb3J0X3JhbmdlMCwgNDApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1MSwgcG9ydF9yYW5nZTAsIDQxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTIsIHBvcnRfcmFuZ2UwLCA0MiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDUzLCBwb3J0X3JhbmdlMCwgNDMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NCwgcG9ydF9yYW5nZTAsIDQ0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NTUsIHBvcnRfcmFuZ2UwLCA0NSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDU2LCBwb3J0X3JhbmdlMCwgNDYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ1NywgcG9ydF9yYW5nZTAsIDQ3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjAsIHBvcnRfcmFuZ2UwLCA0OCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDYxLCBwb3J0X3JhbmdlMCwgNDkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2MiwgcG9ydF9yYW5nZTAsIDUwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjMsIHBvcnRfcmFuZ2UwLCA1MSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY0LCBwb3J0X3JhbmdlMCwgNTIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ2NSwgcG9ydF9yYW5nZTAsIDUzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NjYsIHBvcnRfcmFuZ2UwLCA1NCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDY3LCBwb3J0X3JhbmdlMCwgNTUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MCwgcG9ydF9yYW5nZTAsIDU2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzEsIHBvcnRfcmFuZ2UwLCA1NyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDcyLCBwb3J0X3JhbmdlMCwgNTgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3MywgcG9ydF9yYW5nZTAsIDU5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzQsIHBvcnRfcmFuZ2UwLCA2MCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDc1LCBwb3J0X3JhbmdlMCwgNjEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ3NiwgcG9ydF9yYW5nZTAsIDYyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0NzcsIHBvcnRfcmFuZ2UwLCA2MyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDgwLCBwb3J0X3JhbmdlMCwgNjQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4MSwgcG9ydF9yYW5nZTAsIDY1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODIsIHBvcnRfcmFuZ2UwLCA2NiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDgzLCBwb3J0X3JhbmdlMCwgNjcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NCwgcG9ydF9yYW5nZTAsIDY4KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0ODUsIHBvcnRfcmFuZ2UwLCA2OSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDg2LCBwb3J0X3JhbmdlMCwgNzApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ4NywgcG9ydF9yYW5nZTAsIDcxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTAsIHBvcnRfcmFuZ2UwLCA3MiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDkxLCBwb3J0X3JhbmdlMCwgNzMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5MiwgcG9ydF9yYW5nZTAsIDc0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTMsIHBvcnRfcmFuZ2UwLCA3NSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDk0LCBwb3J0X3JhbmdlMCwgNzYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQ5NSwgcG9ydF9yYW5nZTAsIDc3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0OTYsIHBvcnRfcmFuZ2UwLCA3OCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDk3LCBwb3J0X3JhbmdlMCwgNzkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDAsIHBvcnRfcmFuZ2UwLCA4MCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwMSwgcG9ydF9yYW5nZTAsIDgxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTAyLCBwb3J0X3JhbmdlMCwgODIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDMsIHBvcnRfcmFuZ2UwLCA4MyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNCwgcG9ydF9yYW5nZTAsIDg0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTA1LCBwb3J0X3JhbmdlMCwgODUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMDYsIHBvcnRfcmFuZ2UwLCA4NiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEwNywgcG9ydF9yYW5nZTAsIDg3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIwLCBwb3J0X3JhbmdlMSwgMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyMSwgcG9ydF9yYW5nZTEsIDEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjIsIHBvcnRfcmFuZ2UxLCAyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTIzLCBwb3J0X3JhbmdlMSwgMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNCwgcG9ydF9yYW5nZTEsIDQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMjUsIHBvcnRfcmFuZ2UxLCA1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTI2LCBwb3J0X3JhbmdlMSwgNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEyNywgcG9ydF9yYW5nZTEsIDcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzAsIHBvcnRfcmFuZ2UxLCA4KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMxLCBwb3J0X3JhbmdlMSwgOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzMiwgcG9ydF9yYW5nZTEsIDEwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTMzLCBwb3J0X3JhbmdlMSwgMTEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzQsIHBvcnRfcmFuZ2UxLCAxMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDEzNSwgcG9ydF9yYW5nZTEsIDEzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTM2LCBwb3J0X3JhbmdlMSwgMTQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxMzcsIHBvcnRfcmFuZ2UxLCAxNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MCwgcG9ydF9yYW5nZTEsIDE2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQxLCBwb3J0X3JhbmdlMSwgMTcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDIsIHBvcnRfcmFuZ2UxLCAxOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0MywgcG9ydF9yYW5nZTEsIDE5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ0LCBwb3J0X3JhbmdlMSwgMjApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxNDUsIHBvcnRfcmFuZ2UxLCAyMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE0NiwgcG9ydF9yYW5nZTEsIDIyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTQ3LCBwb3J0X3JhbmdlMSwgMjMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODAsIHBvcnRfcmFuZ2UyLCAwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTgxLCBwb3J0X3JhbmdlMiwgMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4MiwgcG9ydF9yYW5nZTIsIDIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODMsIHBvcnRfcmFuZ2UyLCAzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg0LCBwb3J0X3JhbmdlMiwgNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDE4NSwgcG9ydF9yYW5nZTIsIDUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQxODYsIHBvcnRfcmFuZ2UyLCA2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MTg3LCBwb3J0X3JhbmdlMiwgNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMCwgcG9ydF9yYW5nZTMsIDApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDEsIHBvcnRfcmFuZ2UzLCAxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjAyLCBwb3J0X3JhbmdlMywgMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwMywgcG9ydF9yYW5nZTMsIDMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDQsIHBvcnRfcmFuZ2UzLCA0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjA1LCBwb3J0X3JhbmdlMywgNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIwNiwgcG9ydF9yYW5nZTMsIDYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMDcsIHBvcnRfcmFuZ2UzLCA3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjEwLCBwb3J0X3JhbmdlMywgOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMSwgcG9ydF9yYW5nZTMsIDkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTIsIHBvcnRfcmFuZ2UzLCAxMCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxMywgcG9ydF9yYW5nZTMsIDExKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE0LCBwb3J0X3JhbmdlMywgMTIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMTUsIHBvcnRfcmFuZ2UzLCAxMyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIxNiwgcG9ydF9yYW5nZTMsIDE0KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjE3LCBwb3J0X3JhbmdlMywgMTUpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjAsIHBvcnRfcmFuZ2UzLCAxNiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyMSwgcG9ydF9yYW5nZTMsIDE3KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjIyLCBwb3J0X3JhbmdlMywgMTgpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjMsIHBvcnRfcmFuZ2UzLCAxOSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyNCwgcG9ydF9yYW5nZTMsIDIwKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjI1LCBwb3J0X3JhbmdlMywgMjEpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMjYsIHBvcnRfcmFuZ2UzLCAyMiksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIyNywgcG9ydF9yYW5nZTMsIDIzKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMwLCBwb3J0X3JhbmdlMywgMjQpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzEsIHBvcnRfcmFuZ2UzLCAyNSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzMiwgcG9ydF9yYW5nZTMsIDI2KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjMzLCBwb3J0X3JhbmdlMywgMjcpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzQsIHBvcnRfcmFuZ2UzLCAyOCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDIzNSwgcG9ydF9yYW5nZTMsIDI5KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjM2LCBwb3J0X3JhbmdlMywgMzApLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyMzcsIHBvcnRfcmFuZ2UzLCAzMSksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MCwgcG9ydF9yYW5nZTMsIDMyKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQxLCBwb3J0X3JhbmdlMywgMzMpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDIsIHBvcnRfcmFuZ2UzLCAzNCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0MywgcG9ydF9yYW5nZTMsIDM1KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ0LCBwb3J0X3JhbmdlMywgMzYpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNDUsIHBvcnRfcmFuZ2UzLCAzNyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI0NiwgcG9ydF9yYW5nZTMsIDM4KSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjQ3LCBwb3J0X3JhbmdlMywgMzkpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNTAsIHBvcnRfcmFuZ2UzLCA0MCksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI1MSwgcG9ydF9yYW5nZTMsIDQxKSwKKwlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRShwb3J0MjUyLCBwb3J0X3JhbmdlMywgNDIpLAorCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHBvcnQyNTMsIHBvcnRfcmFuZ2UzLCA0MyksCisJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUocG9ydDI1NCwgcG9ydF9yYW5nZTMsIDQ0KSwKIAlVTklQSElFUl9QSU5DVFJMX0dST1VQX1NJTkdMRSh4aXJxMCwgeGlycSwgMCksCiAJVU5JUEhJRVJfUElOQ1RSTF9HUk9VUF9TSU5HTEUoeGlycTEsIHhpcnEsIDEpLAogCVVOSVBISUVSX1BJTkNUUkxfR1JPVVBfU0lOR0xFKHhpcnEyLCB4aXJxLCAyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2dzaS9nc2kuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2dzaS9nc2kuYwppbmRleCA3NzE4MjU3Li5jMDI4ODFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9nc2kvZ3NpLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vZ3NpL2dzaS5jCkBAIC0xMTEzLDEzICsxMTEzLDE0IEBACiAJdWludDMyX3QgdmFsOwogCXN0cnVjdCBnc2lfZXZ0X2N0eCAqY3R4OwogCWludCByZXM7Ci0JaW50IGVlID0gZ3NpX2N0eC0+cGVyLmVlOworCWludCBlZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFnc2lfY3R4KSB7CiAJCXByX2VycigiJXM6JWQgZ3NpIGNvbnRleHQgbm90IGFsbG9jYXRlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1HU0lfU1RBVFVTX05PREVWOwogCX0KKwllZSA9IGdzaV9jdHgtPnBlci5lZTsKIAogCWlmICghcHJvcHMgfHwgIWV2dF9yaW5nX2hkbCB8fCBkZXZfaGRsICE9ICh1aW50cHRyX3QpZ3NpX2N0eCkgewogCQlHU0lFUlIoImJhZCBwYXJhbXMgcHJvcHM9JXAgZGV2X2hkbD0weCVseCBldnRfcmluZ19oZGw9JXBcbiIsCkBAIC0xNjUxLDcgKzE2NTIsNyBAQAogCXN0cnVjdCBnc2lfY2hhbl9jdHggKmN0eDsKIAl1aW50MzJfdCB2YWw7CiAJaW50IHJlczsKLQlpbnQgZWUgPSBnc2lfY3R4LT5wZXIuZWU7CisJaW50IGVlOwogCWVudW0gZ3NpX2NoX2NtZF9vcGNvZGUgb3AgPSBHU0lfQ0hfQUxMT0NBVEU7CiAJdWludDhfdCBlcmluZGV4OwogCXZvaWQgKip1c2VyX2RhdGE7CkBAIC0xNjYwLDYgKzE2NjEsNyBAQAogCQlwcl9lcnIoIiVzOiVkIGdzaSBjb250ZXh0IG5vdCBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtR1NJX1NUQVRVU19OT0RFVjsKIAl9CisJZWUgPSBnc2lfY3R4LT5wZXIuZWU7CiAKIAlpZiAoIXByb3BzIHx8ICFjaGFuX2hkbCB8fCBkZXZfaGRsICE9ICh1aW50cHRyX3QpZ3NpX2N0eCkgewogCQlHU0lFUlIoImJhZCBwYXJhbXMgcHJvcHM9JXAgZGV2X2hkbD0weCVseCBjaGFuX2hkbD0lcFxuIiwKQEAgLTIyNDEsMTIgKzIyNDMsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ2NF90IHJwOwogCXVpbnQ2NF90IHdwOwotCWludCBlZSA9IGdzaV9jdHgtPnBlci5lZTsKKwlpbnQgZWU7CiAKIAlpZiAoIWdzaV9jdHgpIHsKIAkJcHJfZXJyKCIlczolZCBnc2kgY29udGV4dCBub3QgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlyZXR1cm4gLUdTSV9TVEFUVVNfTk9ERVY7CiAJfQorCWVlID0gZ3NpX2N0eC0+cGVyLmVlOwogCiAJaWYgKGNoYW5faGRsID49IGdzaV9jdHgtPm1heF9jaCB8fCAhaW5mbykgewogCQlHU0lFUlIoImJhZCBwYXJhbXMgY2hhbl9oZGw9JWx1IGluZm89JXBcbiIsIGNoYW5faGRsLCBpbmZvKTsKQEAgLTIzMTEsMTIgKzIzMTQsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVpbnQ2NF90IHJwOwogCXVpbnQ2NF90IHdwOwotCWludCBlZSA9IGdzaV9jdHgtPnBlci5lZTsKKwlpbnQgZWU7CiAKIAlpZiAoIWdzaV9jdHgpIHsKIAkJcHJfZXJyKCIlczolZCBnc2kgY29udGV4dCBub3QgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlyZXR1cm4gLUdTSV9TVEFUVVNfTk9ERVY7CiAJfQorCWVlID0gZ3NpX2N0eC0+cGVyLmVlOwogCiAJaWYgKGNoYW5faGRsID49IGdzaV9jdHgtPm1heF9jaCB8fCAhaXNfZW1wdHkpIHsKIAkJR1NJRVJSKCJiYWQgcGFyYW1zIGNoYW5faGRsPSVsdSBpc19lbXB0eT0lcFxuIiwKQEAgLTI1MDAsMTMgKzI1MDQsMTQgQEAKIHsKIAlzdHJ1Y3QgZ3NpX2NoYW5fY3R4ICpjdHg7CiAJdWludDY0X3QgcnA7Ci0JaW50IGVlID0gZ3NpX2N0eC0+cGVyLmVlOworCWludCBlZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFnc2lfY3R4KSB7CiAJCXByX2VycigiJXM6JWQgZ3NpIGNvbnRleHQgbm90IGFsbG9jYXRlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1HU0lfU1RBVFVTX05PREVWOwogCX0KKwllZSA9IGdzaV9jdHgtPnBlci5lZTsKIAogCWlmIChjaGFuX2hkbCA+PSBnc2lfY3R4LT5tYXhfY2ggfHwgIW5vdGlmeSkgewogCQlHU0lFUlIoImJhZCBwYXJhbXMgY2hhbl9oZGw9JWx1IG5vdGlmeT0lcFxuIiwgY2hhbl9oZGwsIG5vdGlmeSk7CkBAIC0yNTkzLDE1ICsyNTk4LDE2IEBACiAJaWYgKGN1cnIgPT0gR1NJX0NIQU5fTU9ERV9DQUxMQkFDSyAmJgogCQkJbW9kZSA9PSBHU0lfQ0hBTl9NT0RFX1BPTEwpIHsKIAkJX19nc2lfY29uZmlnX2llb2JfaXJxKGdzaV9jdHgtPnBlci5lZSwgMSA8PCBjdHgtPmV2dHItPmlkLCAwKTsKKwkJYXRvbWljX3NldCgmY3R4LT5wb2xsX21vZGUsIG1vZGUpOwogCQljdHgtPnN0YXRzLmNhbGxiYWNrX3RvX3BvbGwrKzsKIAl9CiAKIAlpZiAoY3VyciA9PSBHU0lfQ0hBTl9NT0RFX1BPTEwgJiYKIAkJCW1vZGUgPT0gR1NJX0NIQU5fTU9ERV9DQUxMQkFDSykgeworCQlhdG9taWNfc2V0KCZjdHgtPnBvbGxfbW9kZSwgbW9kZSk7CiAJCV9fZ3NpX2NvbmZpZ19pZW9iX2lycShnc2lfY3R4LT5wZXIuZWUsIDEgPDwgY3R4LT5ldnRyLT5pZCwgfjApOwogCQljdHgtPnN0YXRzLnBvbGxfdG9fY2FsbGJhY2srKzsKIAl9Ci0JYXRvbWljX3NldCgmY3R4LT5wb2xsX21vZGUsIG1vZGUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzaV9jdHgtPnNsb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gR1NJX1NUQVRVU19TVUNDRVNTOwpAQCAtMjg4Myw2ICsyODg5LDEzIEBACiAKIAlnc2lfY3R4LT5zY3JhdGNoLndvcmQwLnZhbCA9IGdzaV9yZWFkbChnc2lfY3R4LT5iYXNlICsKIAkJR1NJX0VFX25fQ05UWFRfU0NSQVRDSF8wX09GRlMoZ3NpX2N0eC0+cGVyLmVlKSk7CisJaWYgKGdzaV9jdHgtPnNjcmF0Y2gud29yZDAucy5nZW5lcmljX2VlX2NtZF9yZXR1cm5fY29kZSA9PQorCQlHU0lfR0VOX0VFX0NNRF9SRVRVUk5fQ09ERV9SRVRSWSkgeworCQlHU0lEQkcoImNoYW5faWR4PSV1IGVlPSV1IGJ1c3kgdHJ5IGFnYWluXG4iLCBjaGFuX2lkeCwgZWUpOworCQkqY29kZSA9IEdTSV9HRU5fRUVfQ01EX1JFVFVSTl9DT0RFX1JFVFJZOworCQlyZXMgPSAtR1NJX1NUQVRVU19BR0FJTjsKKwkJZ290byBmcmVlX2xvY2s7CisJfQogCWlmIChnc2lfY3R4LT5zY3JhdGNoLndvcmQwLnMuZ2VuZXJpY19lZV9jbWRfcmV0dXJuX2NvZGUgPT0gMCkgewogCQlHU0lFUlIoIk5vIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKIAkJcmVzID0gLUdTSV9TVEFUVVNfRVJST1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9nc2kvZ3NpLmggYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9nc2kvZ3NpLmgKaW5kZXggMzJmYjE3OC4uN2UxMDQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vZ3NpL2dzaS5oCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2dzaS9nc2kuaApAQCAtMjg4LDYgKzI4OCw3IEBACiAJR1NJX0dFTl9FRV9DTURfUkVUVVJOX0NPREVfSU5DT1JSRUNUX0RJUkVDVElPTiA9IDB4MywKIAlHU0lfR0VOX0VFX0NNRF9SRVRVUk5fQ09ERV9JTkNPUlJFQ1RfQ0hBTk5FTF9UWVBFID0gMHg0LAogCUdTSV9HRU5fRUVfQ01EX1JFVFVSTl9DT0RFX0lOQ09SUkVDVF9DSEFOTkVMX0lOREVYID0gMHg1LAorCUdTSV9HRU5fRUVfQ01EX1JFVFVSTl9DT0RFX1JFVFJZID0gMHg2LAogfTsKIAogZXh0ZXJuIHN0cnVjdCBnc2lfY3R4ICpnc2lfY3R4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL2VjbV9pcGEuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9lY21faXBhLmMKaW5kZXggMTA1Mjk0YS4uMjk3NTE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL2VjbV9pcGEuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvZWNtX2lwYS5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9lY21faXBhLmg+CisjaW5jbHVkZSAiLi4vaXBhX2NvbW1vbl9pLmgiCisjaW5jbHVkZSAiLi4vaXBhX3YzL2lwYV9wbS5oIgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICJlY21faXBhIgogI2RlZmluZSBFQ01fSVBBX0lQVjRfSERSX05BTUUgImVjbV9ldGhfaXB2NCIKQEAgLTEyMCw2ICsxMjIsNyBAQAogICogQHVzYl90b19pcGFfY2xpZW50OiBwcm9kdWNlciBjbGllbnQKICAqIEBpcGFfcm1fcmVzb3VyY2VfbmFtZV9wcm9kOiBJUEEgcmVzb3VyY2UgbWFuYWdlciBwcm9kdWNlciByZXNvdXJjZQogICogQGlwYV9ybV9yZXNvdXJjZV9uYW1lX2NvbnM6IElQQSByZXNvdXJjZSBtYW5hZ2VyIGNvbnN1bWVyIHJlc291cmNlCisgKiBAcG1faGRsOiBoYW5kbGUgZm9yIElQQSBQTQogICovCiBzdHJ1Y3QgZWNtX2lwYV9kZXYgewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CkBAIC0xMzcsNiArMTQwLDcgQEAKIAllbnVtIGlwYV9jbGllbnRfdHlwZSB1c2JfdG9faXBhX2NsaWVudDsKIAllbnVtIGlwYV9ybV9yZXNvdXJjZV9uYW1lIGlwYV9ybV9yZXNvdXJjZV9uYW1lX3Byb2Q7CiAJZW51bSBpcGFfcm1fcmVzb3VyY2VfbmFtZSBpcGFfcm1fcmVzb3VyY2VfbmFtZV9jb25zOworCXUzMiBwbV9oZGw7CiB9OwogCiBzdGF0aWMgaW50IGVjbV9pcGFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KTsKQEAgLTE1OCw2ICsxNjIsOCBAQAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplY21faXBhX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KTsKIHN0YXRpYyBpbnQgZWNtX2lwYV9jcmVhdGVfcm1fcmVzb3VyY2Uoc3RydWN0IGVjbV9pcGFfZGV2ICplY21faXBhX2N0eCk7CiBzdGF0aWMgdm9pZCBlY21faXBhX2Rlc3Ryb3lfcm1fcmVzb3VyY2Uoc3RydWN0IGVjbV9pcGFfZGV2ICplY21faXBhX2N0eCk7CitzdGF0aWMgaW50IGVjbV9pcGFfcmVnaXN0ZXJfcG1fY2xpZW50KHN0cnVjdCBlY21faXBhX2RldiAqZWNtX2lwYV9jdHgpOworc3RhdGljIHZvaWQgZWNtX2lwYV9kZXJlZ2lzdGVyX3BtX2NsaWVudChzdHJ1Y3QgZWNtX2lwYV9kZXYgKmVjbV9pcGFfY3R4KTsKIHN0YXRpYyBpbnQgcmVzb3VyY2VfcmVxdWVzdChzdHJ1Y3QgZWNtX2lwYV9kZXYgKmVjbV9pcGFfY3R4KTsKIHN0YXRpYyB2b2lkIHJlc291cmNlX3JlbGVhc2Uoc3RydWN0IGVjbV9pcGFfZGV2ICplY21faXBhX2N0eCk7CiBzdGF0aWMgbmV0ZGV2X3R4X3QgZWNtX2lwYV9zdGFydF94bWl0CkBAIC00MDMsMjcgKzQwOSwzNCBAQAogCUVDTV9JUEFfREVCVUcoInVzYl90b19pcGFfY2xpZW50ID0gJWRcbiIsCiAJCSAgICAgIGVjbV9pcGFfY3R4LT51c2JfdG9faXBhX2NsaWVudCk7CiAKLQllY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfY29ucyA9Ci0JCWlwYV9nZXRfcm1fcmVzb3VyY2VfZnJvbV9lcChpcGFfdG9fdXNiX2hkbCk7Ci0JaWYgKGVjbV9pcGFfY3R4LT5pcGFfcm1fcmVzb3VyY2VfbmFtZV9jb25zIDwgMCkgewotCQlFQ01fSVBBX0VSUk9SKCJFcnJvciBnZXR0aW5nIENPTlMgUk0gcmVzb3VyY2UgZnJvbSBoYW5kbGUgJWRcbiIsCisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJcmV0dmFsID0gZWNtX2lwYV9yZWdpc3Rlcl9wbV9jbGllbnQoZWNtX2lwYV9jdHgpOworCX0gZWxzZSB7CisJCWVjbV9pcGFfY3R4LT5pcGFfcm1fcmVzb3VyY2VfbmFtZV9jb25zID0KKwkJCWlwYV9nZXRfcm1fcmVzb3VyY2VfZnJvbV9lcChpcGFfdG9fdXNiX2hkbCk7CisJCWlmIChlY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfY29ucyA8IDApIHsKKwkJCUVDTV9JUEFfRVJST1IoCisJCQkiRXJyb3IgZ2V0dGluZyBDT05TIFJNIHJlc291cmNlIGZyb20gaGFuZGxlICVkXG4iLAorCQkJCSAgICAgIGVjbV9pcGFfY3R4LT5pcGFfcm1fcmVzb3VyY2VfbmFtZV9jb25zKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCUVDTV9JUEFfREVCVUcoImlwYV9ybV9yZXNvdXJjZV9uYW1lX2NvbnMgPSAlZFxuIiwKIAkJCSAgICAgIGVjbV9pcGFfY3R4LT5pcGFfcm1fcmVzb3VyY2VfbmFtZV9jb25zKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCUVDTV9JUEFfREVCVUcoImlwYV9ybV9yZXNvdXJjZV9uYW1lX2NvbnMgPSAlZFxuIiwKLQkJICAgICAgZWNtX2lwYV9jdHgtPmlwYV9ybV9yZXNvdXJjZV9uYW1lX2NvbnMpOwogCi0JZWNtX2lwYV9jdHgtPmlwYV9ybV9yZXNvdXJjZV9uYW1lX3Byb2QgPQotCQlpcGFfZ2V0X3JtX3Jlc291cmNlX2Zyb21fZXAodXNiX3RvX2lwYV9oZGwpOwotCWlmIChlY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfcHJvZCA8IDApIHsKLQkJRUNNX0lQQV9FUlJPUigiRXJyb3IgZ2V0dGluZyBQUk9EIFJNIHJlc291cmNlIGZyb20gaGFuZGxlICVkXG4iLAorCQllY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfcHJvZCA9CisJCQlpcGFfZ2V0X3JtX3Jlc291cmNlX2Zyb21fZXAodXNiX3RvX2lwYV9oZGwpOworCQlpZiAoZWNtX2lwYV9jdHgtPmlwYV9ybV9yZXNvdXJjZV9uYW1lX3Byb2QgPCAwKSB7CisJCQlFQ01fSVBBX0VSUk9SKAorCQkJIkVycm9yIGdldHRpbmcgUFJPRCBSTSByZXNvdXJjZSBmcm9tIGhhbmRsZSAlZFxuIiwKKwkJCQkgICAgICBlY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfcHJvZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlFQ01fSVBBX0RFQlVHKCJpcGFfcm1fcmVzb3VyY2VfbmFtZV9wcm9kID0gJWRcbiIsCiAJCQkgICAgICBlY21faXBhX2N0eC0+aXBhX3JtX3Jlc291cmNlX25hbWVfcHJvZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlFQ01fSVBBX0RFQlVHKCJpcGFfcm1fcmVzb3VyY2VfbmFtZV9wcm9kID0gJWRcbiIsCi0JCSAgICAgIGVjbV9pcGFfY3R4LT5pcGFfcm1fcmVzb3VyY2VfbmFtZV9wcm9kKTsKIAotCXJldHZhbCA9IGVjbV9pcGFfY3JlYXRlX3JtX3Jlc291cmNlKGVjbV9pcGFfY3R4KTsKKwkJcmV0dmFsID0gZWNtX2lwYV9jcmVhdGVfcm1fcmVzb3VyY2UoZWNtX2lwYV9jdHgpOworCX0KKwogCWlmIChyZXR2YWwpIHsKIAkJRUNNX0lQQV9FUlJPUigiZmFpbCBvbiBSTSBjcmVhdGVcbiIpOwogCQlnb3RvIGZhaWxfY3JlYXRlX3JtOwpAQCAtNDg4LDcgKzUwMSwxMCBAQAogZmFpbDoKIAllY21faXBhX2RlcmVnaXN0ZXJfcHJvcGVydGllcygpOwogZmFpbF9jcmVhdGVfcm06Ci0JZWNtX2lwYV9kZXN0cm95X3JtX3Jlc291cmNlKGVjbV9pcGFfY3R4KTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJZWNtX2lwYV9kZXJlZ2lzdGVyX3BtX2NsaWVudChlY21faXBhX2N0eCk7CisJZWxzZQorCQllY21faXBhX2Rlc3Ryb3lfcm1fcmVzb3VyY2UoZWNtX2lwYV9jdHgpOwogCXJldHVybiByZXR2YWw7CiB9CiBFWFBPUlRfU1lNQk9MKGVjbV9pcGFfY29ubmVjdCk7CkBAIC03NDYsNyArNzYyLDEwIEBACiAJbmV0aWZfc3RvcF9xdWV1ZShlY21faXBhX2N0eC0+bmV0KTsKIAlFQ01fSVBBX0RFQlVHKCJxdWV1ZSBzdG9wcGVkXG4iKTsKIAotCWVjbV9pcGFfZGVzdHJveV9ybV9yZXNvdXJjZShlY21faXBhX2N0eCk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCWVjbV9pcGFfZGVyZWdpc3Rlcl9wbV9jbGllbnQoZWNtX2lwYV9jdHgpOworCWVsc2UKKwkJZWNtX2lwYV9kZXN0cm95X3JtX3Jlc291cmNlKGVjbV9pcGFfY3R4KTsKIAogCW91dHN0YW5kaW5nX2Ryb3BwZWRfcGt0cyA9CiAJCWF0b21pY19yZWFkKCZlY21faXBhX2N0eC0+b3V0c3RhbmRpbmdfcGt0cyk7CkBAIC0xMTE3LDE1ICsxMTM2LDY1IEBACiAJRUNNX0lQQV9MT0dfRVhJVCgpOwogfQogCitzdGF0aWMgdm9pZCBlY21faXBhX3BtX2NiKHZvaWQgKnAsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBlY21faXBhX2RldiAqZWNtX2lwYV9jdHggPSBwOworCisJRUNNX0lQQV9MT0dfRU5UUlkoKTsKKwlpZiAoZXZlbnQgIT0gSVBBX1BNX0NMSUVOVF9BQ1RJVkFURUQpIHsKKwkJRUNNX0lQQV9FUlJPUigidW5leHBlY3RlZCBldmVudCAlZFxuIiwgZXZlbnQpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZWNtX2lwYV9jdHgtPm5ldCkpIHsKKwkJRUNNX0lQQV9ERUJVRygiUmVzb3VyY2UgR3JhbnRlZCAtIHN0YXJ0aW5nIHF1ZXVlXG4iKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZWNtX2lwYV9jdHgtPm5ldCk7CisJfQorCUVDTV9JUEFfTE9HX0VYSVQoKTsKK30KKworc3RhdGljIGludCBlY21faXBhX3JlZ2lzdGVyX3BtX2NsaWVudChzdHJ1Y3QgZWNtX2lwYV9kZXYgKmVjbV9pcGFfY3R4KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgcG1fcmVnOworCisJbWVtc2V0KCZwbV9yZWcsIDAsIHNpemVvZihwbV9yZWcpKTsKKwlwbV9yZWcubmFtZSA9IGVjbV9pcGFfY3R4LT5uZXQtPm5hbWU7CisJcG1fcmVnLnVzZXJfZGF0YSA9IGVjbV9pcGFfY3R4OworCXBtX3JlZy5jYWxsYmFjayA9IGVjbV9pcGFfcG1fY2I7CisJcG1fcmVnLmdyb3VwID0gSVBBX1BNX0dST1VQX0FQUFM7CisJcmVzdWx0ID0gaXBhX3BtX3JlZ2lzdGVyKCZwbV9yZWcsICZlY21faXBhX2N0eC0+cG1faGRsKTsKKwlpZiAocmVzdWx0KSB7CisJCUVDTV9JUEFfRVJST1IoImZhaWxlZCB0byBjcmVhdGUgSVBBIFBNIGNsaWVudCAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVjbV9pcGFfZGVyZWdpc3Rlcl9wbV9jbGllbnQoc3RydWN0IGVjbV9pcGFfZGV2ICplY21faXBhX2N0eCkKK3sKKwlpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKGVjbV9pcGFfY3R4LT5wbV9oZGwpOworCWlwYV9wbV9kZXJlZ2lzdGVyKGVjbV9pcGFfY3R4LT5wbV9oZGwpOworCWVjbV9pcGFfY3R4LT5wbV9oZGwgPSB+MDsKK30KKwogc3RhdGljIGludCByZXNvdXJjZV9yZXF1ZXN0KHN0cnVjdCBlY21faXBhX2RldiAqZWNtX2lwYV9jdHgpCiB7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCXJldHVybiBpcGFfcG1fYWN0aXZhdGUoZWNtX2lwYV9jdHgtPnBtX2hkbCk7CisKIAlyZXR1cm4gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVxdWVzdF9yZXNvdXJjZSgKIAkJSVBBX1JNX1JFU09VUkNFX1NURF9FQ01fUFJPRCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc291cmNlX3JlbGVhc2Uoc3RydWN0IGVjbV9pcGFfZGV2ICplY21faXBhX2N0eCkKIHsKLQlpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9yZWxlYXNlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9TVERfRUNNX1BST0QpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShlY21faXBhX2N0eC0+cG1faGRsKTsKKwllbHNlCisJCWlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlbGVhc2VfcmVzb3VyY2UoCisJCQlJUEFfUk1fUkVTT1VSQ0VfU1REX0VDTV9QUk9EKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvaXBhX21oaV9jbGllbnQuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfbWhpX2NsaWVudC5jCmluZGV4IDliM2I1M2QuLjRkMzExM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfbWhpX2NsaWVudC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfbWhpX2NsaWVudC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXBhX3FtaV9zZXJ2aWNlX3YwMS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYV9taGkuaD4KICNpbmNsdWRlICIuLi9pcGFfY29tbW9uX2kuaCIKKyNpbmNsdWRlICIuLi9pcGFfdjMvaXBhX3BtLmgiCiAKICNkZWZpbmUgSVBBX01ISV9EUlZfTkFNRSAiaXBhX21oaV9jbGllbnQiCiAjZGVmaW5lIElQQV9NSElfREJHKGZtdCwgYXJncy4uLikgXApAQCAtMTM2LDYgKzEzNyw4IEBACiAJdTMyIHVzZV9pcGFkbWE7CiAJYm9vbCBhc3NlcnRfYml0NDA7CiAJYm9vbCB0ZXN0X21vZGU7CisJdTMyIHBtX2hkbDsKKwl1MzIgbW9kZW1fcG1faGRsOwogfTsKIAogc3RhdGljIHN0cnVjdCBpcGFfbWhpX2NsaWVudF9jdHggKmlwYV9taGlfY2xpZW50X2N0eDsKQEAgLTgzNCwyNSArODM3LDM4IEBACiAJSVBBX01ISV9EQkcoImV2ZW50X2NvbnRleHRfYXJyYXlfYWRkciAweCVsbHhcbiIsCiAJCWlwYV9taGlfY2xpZW50X2N0eC0+ZXZlbnRfY29udGV4dF9hcnJheV9hZGRyKTsKIAotCS8qIEFkZCBNSEkgPC0+IFE2IGRlcGVuZGVuY2llcyB0byBJUEEgUk0gKi8KLQlyZXMgPSBpcGFfcm1fYWRkX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAotCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7Ci0JaWYgKHJlcyAmJiByZXMgIT0gLUVJTlBST0dSRVNTKSB7Ci0JCUlQQV9NSElfRVJSKCJmYWlsZWQgdG8gYWRkIGRlcGVuZGVuY3kgJWRcbiIsIHJlcyk7Ci0JCWdvdG8gZmFpbF9hZGRfbWhpX3E2X2RlcDsKLQl9CisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJcmVzID0gaXBhX3BtX2FjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbGVkIGFjdGl2YXRlIGNsaWVudCAlZFxuIiwgcmVzKTsKKwkJCWdvdG8gZmFpbF9wbV9hY3RpdmF0ZTsKKwkJfQorCQlyZXMgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhpcGFfbWhpX2NsaWVudF9jdHgtPm1vZGVtX3BtX2hkbCk7CisJCWlmIChyZXMpIHsKKwkJCUlQQV9NSElfRVJSKCJmYWlsZWQgYWN0aXZhdGUgbW9kZW0gY2xpZW50ICVkXG4iLCByZXMpOworCQkJZ290byBmYWlsX3BtX2FjdGl2YXRlX21vZGVtOworCQl9CisJfSBlbHNlIHsKKwkJLyogQWRkIE1ISSA8LT4gUTYgZGVwZW5kZW5jaWVzIHRvIElQQSBSTSAqLworCQlyZXMgPSBpcGFfcm1fYWRkX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAorCQkJSVBBX1JNX1JFU09VUkNFX1E2X0NPTlMpOworCQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJCUlQQV9NSElfRVJSKCJmYWlsZWQgdG8gYWRkIGRlcGVuZGVuY3kgJWRcbiIsIHJlcyk7CisJCQlnb3RvIGZhaWxfYWRkX21oaV9xNl9kZXA7CisJCX0KIAotCXJlcyA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKLQkJSVBBX1JNX1JFU09VUkNFX01ISV9DT05TKTsKLQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpIHsKLQkJSVBBX01ISV9FUlIoImZhaWxlZCB0byBhZGQgZGVwZW5kZW5jeSAlZFxuIiwgcmVzKTsKLQkJZ290byBmYWlsX2FkZF9xNl9taGlfZGVwOwotCX0KKwkJcmVzID0gaXBhX3JtX2FkZF9kZXBlbmRlbmN5KElQQV9STV9SRVNPVVJDRV9RNl9QUk9ELAorCQkJSVBBX1JNX1JFU09VUkNFX01ISV9DT05TKTsKKwkJaWYgKHJlcyAmJiByZXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbGVkIHRvIGFkZCBkZXBlbmRlbmN5ICVkXG4iLCByZXMpOworCQkJZ290byBmYWlsX2FkZF9xNl9taGlfZGVwOworCQl9CiAKLQlyZXMgPSBpcGFfbWhpX3JlcXVlc3RfcHJvZCgpOwotCWlmIChyZXMpIHsKLQkJSVBBX01ISV9FUlIoImZhaWxlZCByZXF1ZXN0IHByb2QgJWRcbiIsIHJlcyk7Ci0JCWdvdG8gZmFpbF9yZXF1ZXN0X3Byb2Q7CisJCXJlcyA9IGlwYV9taGlfcmVxdWVzdF9wcm9kKCk7CisJCWlmIChyZXMpIHsKKwkJCUlQQV9NSElfRVJSKCJmYWlsZWQgcmVxdWVzdCBwcm9kICVkXG4iLCByZXMpOworCQkJZ290byBmYWlsX3JlcXVlc3RfcHJvZDsKKwkJfQogCX0KIAogCS8qIGdzaSBwYXJhbXMgKi8KQEAgLTg4MCwxNCArODk2LDIzIEBACiAJcmV0dXJuIDA7CiAKIGZhaWxfaW5pdF9lbmdpbmU6Ci0JaXBhX21oaV9yZWxlYXNlX3Byb2QoKTsKKwlpZiAoIWlwYV9wbV9pc191c2VkKCkpCisJCWlwYV9taGlfcmVsZWFzZV9wcm9kKCk7CiBmYWlsX3JlcXVlc3RfcHJvZDoKLQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCi0JCUlQQV9STV9SRVNPVVJDRV9NSElfQ09OUyk7CisJaWYgKCFpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCisJCQlJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlMpOwogZmFpbF9hZGRfcTZfbWhpX2RlcDoKLQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAotCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7CisJaWYgKCFpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAorCQkJSVBBX1JNX1JFU09VUkNFX1E2X0NPTlMpOwogZmFpbF9hZGRfbWhpX3E2X2RlcDoKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhpcGFfbWhpX2NsaWVudF9jdHgtPm1vZGVtX3BtX2hkbCk7CitmYWlsX3BtX2FjdGl2YXRlX21vZGVtOgorCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKGlwYV9taGlfY2xpZW50X2N0eC0+cG1faGRsKTsKK2ZhaWxfcG1fYWN0aXZhdGU6CiAJaXBhX21oaV9zZXRfc3RhdGUoSVBBX01ISV9TVEFURV9JTklUSUFMSVpFRCk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTIwOTUsMjAgKzIxMjAsMzIgQEAKIAkgKi8KIAlJUEFfQUNUSVZFX0NMSUVOVFNfSU5DX1NJTVBMRSgpOwogCi0JSVBBX01ISV9EQkcoInJlbGVhc2UgcHJvZFxuIik7Ci0JcmVzID0gaXBhX21oaV9yZWxlYXNlX3Byb2QoKTsKLQlpZiAocmVzKSB7Ci0JCUlQQV9NSElfRVJSKCJpcGFfbWhpX3JlbGVhc2VfcHJvZCBmYWlsZWQgJWRcbiIsIHJlcyk7Ci0JCWdvdG8gZmFpbF9yZWxlYXNlX3Byb2Q7Ci0JfQorCWlmIChpcGFfcG1faXNfdXNlZCgpKSB7CisJCXJlcyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbCB0byBkZWFjdGl2YXRlIGNsaWVudCAlZFxuIiwgcmVzKTsKKwkJCWdvdG8gZmFpbF9kZWFjdGl2YXRlX3BtOworCQl9CisJCXJlcyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5tb2RlbV9wbV9oZGwpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbCB0byBkZWFjdGl2YXRlIGNsaWVudCAlZFxuIiwgcmVzKTsKKwkJCWdvdG8gZmFpbF9kZWFjdGl2YXRlX21vZGVtX3BtOworCQl9CisJfSBlbHNlIHsKKwkJSVBBX01ISV9EQkcoInJlbGVhc2UgcHJvZFxuIik7CisJCXJlcyA9IGlwYV9taGlfcmVsZWFzZV9wcm9kKCk7CisJCWlmIChyZXMpIHsKKwkJCUlQQV9NSElfRVJSKCJpcGFfbWhpX3JlbGVhc2VfcHJvZCBmYWlsZWQgJWRcbiIsIHJlcyk7CisJCQlnb3RvIGZhaWxfcmVsZWFzZV9wcm9kOworCQl9CiAKLQlJUEFfTUhJX0RCRygid2FpdCBmb3IgY29ucyByZWxlYXNlXG4iKTsKLQlyZXMgPSBpcGFfbWhpX3dhaXRfZm9yX2NvbnNfcmVsZWFzZSgpOwotCWlmIChyZXMpIHsKLQkJSVBBX01ISV9FUlIoImlwYV9taGlfd2FpdF9mb3JfY29uc19yZWxlYXNlIGZhaWxlZCAlZFxuIiwgcmVzKTsKLQkJZ290byBmYWlsX3JlbGVhc2VfY29uczsKKwkJSVBBX01ISV9EQkcoIndhaXQgZm9yIGNvbnMgcmVsZWFzZVxuIik7CisJCXJlcyA9IGlwYV9taGlfd2FpdF9mb3JfY29uc19yZWxlYXNlKCk7CisJCWlmIChyZXMpIHsKKwkJCUlQQV9NSElfRVJSKCJpcGFfbWhpX3dhaXRfZm9yX2NvbnNfcmVsZWFzZSBmYWlsZWRcbiIpOworCQkJZ290byBmYWlsX3JlbGVhc2VfY29uczsKKwkJfQogCX0KLQogCXVzbGVlcF9yYW5nZShJUEFfTUhJX1NVU1BFTkRfU0xFRVBfTUlOLCBJUEFfTUhJX1NVU1BFTkRfU0xFRVBfTUFYKTsKIAogCXJlcyA9IGlwYV9taGlfc3VzcGVuZF9kbChmb3JjZSk7CkBAIC0yMTMyLDggKzIxNjksMTUgQEAKIAogZmFpbF9zdXNwZW5kX2RsX2NoYW5uZWw6CiBmYWlsX3JlbGVhc2VfY29uczoKKwlpZiAoIWlwYV9wbV9pc191c2VkKCkpCiAJaXBhX21oaV9yZXF1ZXN0X3Byb2QoKTsKIGZhaWxfcmVsZWFzZV9wcm9kOgorCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKGlwYV9taGlfY2xpZW50X2N0eC0+bW9kZW1fcG1faGRsKTsKK2ZhaWxfZGVhY3RpdmF0ZV9tb2RlbV9wbToKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCk7CitmYWlsX2RlYWN0aXZhdGVfcG06CiAJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19TSU1QTEUoKTsKIGZhaWxfc3VzcGVuZF91bF9jaGFubmVsOgogCWlwYV9taGlfcmVzdW1lX2NoYW5uZWxzKHRydWUsIGlwYV9taGlfY2xpZW50X2N0eC0+dWxfY2hhbm5lbHMpOwpAQCAtMjE5MywxMCArMjIzNywyMyBAQAogCQlpcGFfbWhpX2NsaWVudF9jdHgtPnJtX2NvbnNfc3RhdGUgPSBJUEFfTUhJX1JNX1NUQVRFX0dSQU5URUQ7CiAJfQogCi0JcmVzID0gaXBhX21oaV9yZXF1ZXN0X3Byb2QoKTsKLQlpZiAocmVzKSB7Ci0JCUlQQV9NSElfRVJSKCJpcGFfbWhpX3JlcXVlc3RfcHJvZCBmYWlsZWQgJWRcbiIsIHJlcyk7Ci0JCWdvdG8gZmFpbF9yZXF1ZXN0X3Byb2Q7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJcmVzID0gaXBhX3BtX2FjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBjbGllbnQgJWRcbiIsIHJlcyk7CisJCQlnb3RvIGZhaWxfcG1fYWN0aXZhdGU7CisJCX0KKwkJaXBhX3BtX2FjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5tb2RlbV9wbV9oZGwpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBjbGllbnQgJWRcbiIsIHJlcyk7CisJCQlnb3RvIGZhaWxfcG1fYWN0aXZhdGVfbW9kZW07CisJCX0KKwl9IGVsc2UgeworCQlyZXMgPSBpcGFfbWhpX3JlcXVlc3RfcHJvZCgpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiaXBhX21oaV9yZXF1ZXN0X3Byb2QgZmFpbGVkICVkXG4iLCByZXMpOworCQkJZ290byBmYWlsX3JlcXVlc3RfcHJvZDsKKwkJfQogCX0KIAogCS8qIHJlc3VtZSBhbGwgVUwgY2hhbm5lbHMgKi8KQEAgLTIyMzQsOCArMjI5MSwxNSBAQAogZmFpbF9yZXN1bWVfZGxfY2hhbm5lbHMyOgogCWlwYV9taGlfc3VzcGVuZF9jaGFubmVscyhpcGFfbWhpX2NsaWVudF9jdHgtPnVsX2NoYW5uZWxzKTsKIGZhaWxfcmVzdW1lX3VsX2NoYW5uZWxzOgotCWlwYV9taGlfcmVsZWFzZV9wcm9kKCk7CisJaWYgKCFpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfbWhpX3JlbGVhc2VfcHJvZCgpOwogZmFpbF9yZXF1ZXN0X3Byb2Q6CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCWlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5tb2RlbV9wbV9oZGwpOworZmFpbF9wbV9hY3RpdmF0ZV9tb2RlbToKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCk7CitmYWlsX3BtX2FjdGl2YXRlOgogCWlwYV9taGlfc3VzcGVuZF9jaGFubmVscyhpcGFfbWhpX2NsaWVudF9jdHgtPmRsX2NoYW5uZWxzKTsKIGZhaWxfcmVzdW1lX2RsX2NoYW5uZWxzOgogCWlwYV9taGlfc2V0X3N0YXRlKElQQV9NSElfU1RBVEVfU1VTUEVOREVEKTsKQEAgLTIzMTksNiArMjM4Myw4NSBAQAogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZW50KTsKIH0KIAorc3RhdGljIHZvaWQgaXBhX21oaV9kZWxldGVfcm1fcmVzb3VyY2VzKHZvaWQpCit7CisJaW50IHJlczsKKworCWlmIChpcGFfbWhpX2NsaWVudF9jdHgtPnN0YXRlICE9IElQQV9NSElfU1RBVEVfSU5JVElBTElaRUQgICYmCisJCWlwYV9taGlfY2xpZW50X2N0eC0+c3RhdGUgIT0gSVBBX01ISV9TVEFURV9SRUFEWSkgeworCisJCUlQQV9NSElfREJHKCJyZWxlYXNlIHByb2RcbiIpOworCQlyZXMgPSBpcGFfbWhpX3JlbGVhc2VfcHJvZCgpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigiaXBhX21oaV9yZWxlYXNlX3Byb2QgZmFpbGVkICVkXG4iLAorCQkJCXJlcyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJSVBBX01ISV9EQkcoIndhaXQgZm9yIGNvbnMgcmVsZWFzZVxuIik7CisJCXJlcyA9IGlwYV9taGlfd2FpdF9mb3JfY29uc19yZWxlYXNlKCk7CisJCWlmIChyZXMpIHsKKwkJCUlQQV9NSElfRVJSKCJpcGFfbWhpX3dhaXRfZm9yX2NvbnNfcmVsZWFzZSVkXG4iLAorCQkJCXJlcyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQl1c2xlZXBfcmFuZ2UoSVBBX01ISV9TVVNQRU5EX1NMRUVQX01JTiwKKwkJCUlQQV9NSElfU1VTUEVORF9TTEVFUF9NQVgpOworCisJCUlQQV9NSElfREJHKCJkZWxlYXRlIGRlcGVuZGVuY3kgUTZfUFJPRC0+TUhJX0NPTlNcbiIpOworCQlyZXMgPSBpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCisJCQlJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlMpOworCQlpZiAocmVzKSB7CisJCQlJUEFfTUhJX0VSUigKKwkJCQkiRXJyb3IgZGVsZXRpbmcgZGVwZW5kZW5jeSAlZC0+JWQsIHJlcz0lZFxuIiwKKwkJCQlJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKKwkJCQlJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlMsCisJCQkJcmVzKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlJUEFfTUhJX0RCRygiZGVsZWF0ZSBkZXBlbmRlbmN5IE1ISV9QUk9ELT5RNl9DT05TXG4iKTsKKwkJcmVzID0gaXBhX3JtX2RlbGV0ZV9kZXBlbmRlbmN5KElQQV9STV9SRVNPVVJDRV9NSElfUFJPRCwKKwkJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKKwkJaWYgKHJlcykgeworCQkJSVBBX01ISV9FUlIoCisJCQkJIkVycm9yIGRlbGV0aW5nIGRlcGVuZGVuY3kgJWQtPiVkLCByZXM9JWRcbiIsCisJCQkJSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAorCQkJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TLAorCQkJCXJlcyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlyZXMgPSBpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9NSElfUFJPRCk7CisJaWYgKHJlcykgeworCQlJUEFfTUhJX0VSUigiRXJyb3IgZGVsZXRpbmcgcmVzb3VyY2UgJWQsIHJlcz0lZFxuIiwKKwkJCUlQQV9STV9SRVNPVVJDRV9NSElfUFJPRCwgcmVzKTsKKwkJZ290byBmYWlsOworCX0KKworCXJlcyA9IGlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX01ISV9DT05TKTsKKwlpZiAocmVzKSB7CisJCUlQQV9NSElfRVJSKCJFcnJvciBkZWxldGluZyByZXNvdXJjZSAlZCwgcmVzPSVkXG4iLAorCQkJSVBBX1JNX1JFU09VUkNFX01ISV9DT05TLCByZXMpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuOworZmFpbDoKKwlpcGFfYXNzZXJ0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwYV9taGlfZGVyZWdpc3Rlcl9wbSh2b2lkKQoreworCWlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwpOworCWlwYV9wbV9kZXJlZ2lzdGVyKGlwYV9taGlfY2xpZW50X2N0eC0+cG1faGRsKTsKKwlpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCA9IH4wOworCisJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhpcGFfbWhpX2NsaWVudF9jdHgtPm1vZGVtX3BtX2hkbCk7CisJaXBhX3BtX2RlcmVnaXN0ZXIoaXBhX21oaV9jbGllbnRfY3R4LT5tb2RlbV9wbV9oZGwpOworCWlwYV9taGlfY2xpZW50X2N0eC0+bW9kZW1fcG1faGRsID0gfjA7Cit9CisKIC8qKgogICogaXBhX21oaV9kZXN0cm95KCkgLSBEZXN0cm95IE1ISSBJUEEKICAqCkBAIC0yMzUxLDYyICsyNDk0LDEwIEBACiAJCWlwYV91Y19taGlfY2xlYW51cCgpOwogCX0KIAotCi0JaWYgKGlwYV9taGlfY2xpZW50X2N0eC0+c3RhdGUgIT0gSVBBX01ISV9TVEFURV9JTklUSUFMSVpFRCAgJiYKLQkJCWlwYV9taGlfY2xpZW50X2N0eC0+c3RhdGUgIT0gSVBBX01ISV9TVEFURV9SRUFEWSkgewotCQlJUEFfTUhJX0RCRygicmVsZWFzZSBwcm9kXG4iKTsKLQkJcmVzID0gaXBhX21oaV9yZWxlYXNlX3Byb2QoKTsKLQkJaWYgKHJlcykgewotCQkJSVBBX01ISV9FUlIoImlwYV9taGlfcmVsZWFzZV9wcm9kIGZhaWxlZCAlZFxuIiwgcmVzKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlJUEFfTUhJX0RCRygid2FpdCBmb3IgY29ucyByZWxlYXNlXG4iKTsKLQkJcmVzID0gaXBhX21oaV93YWl0X2Zvcl9jb25zX3JlbGVhc2UoKTsKLQkJaWYgKHJlcykgewotCQkJSVBBX01ISV9FUlIoImlwYV9taGlfd2FpdF9mb3JfY29uc19yZWxlYXNlIGZhaWxlZCAlZFxuIiwKLQkJCQlyZXMpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXVzbGVlcF9yYW5nZShJUEFfTUhJX1NVU1BFTkRfU0xFRVBfTUlOLAotCQkJCUlQQV9NSElfU1VTUEVORF9TTEVFUF9NQVgpOwotCi0JCUlQQV9NSElfREJHKCJkZWxlYXRlIGRlcGVuZGVuY3kgUTZfUFJPRC0+TUhJX0NPTlNcbiIpOwotCQlyZXMgPSBpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCi0JCQlJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlMpOwotCQlpZiAocmVzKSB7Ci0JCQlJUEFfTUhJX0VSUigKLQkJCQkiRXJyb3IgZGVsZXRpbmcgZGVwZW5kZW5jeSAlZC0+JWQsIHJlcz0lZFxuIgotCQkJCSwgSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCi0JCQkJSVBBX1JNX1JFU09VUkNFX01ISV9DT05TLAotCQkJCXJlcyk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJSVBBX01ISV9EQkcoImRlbGVhdGUgZGVwZW5kZW5jeSBNSElfUFJPRC0+UTZfQ09OU1xuIik7Ci0JCXJlcyA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfTUhJX1BST0QsCi0JCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7Ci0JCWlmIChyZXMpIHsKLQkJCUlQQV9NSElfRVJSKAotCQkJCSJFcnJvciBkZWxldGluZyBkZXBlbmRlbmN5ICVkLT4lZCwgcmVzPSVkXG4iLAotCQkJSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELAotCQkJSVBBX1JNX1JFU09VUkNFX1E2X0NPTlMsCi0JCQlyZXMpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JcmVzID0gaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfTUhJX1BST0QpOwotCWlmIChyZXMpIHsKLQkJSVBBX01ISV9FUlIoIkVycm9yIGRlbGV0aW5nIHJlc291cmNlICVkLCByZXM9JWRcbiIsCi0JCQlJUEFfUk1fUkVTT1VSQ0VfTUhJX1BST0QsIHJlcyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXMgPSBpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9NSElfQ09OUyk7Ci0JaWYgKHJlcykgewotCQlJUEFfTUhJX0VSUigiRXJyb3IgZGVsZXRpbmcgcmVzb3VyY2UgJWQsIHJlcz0lZFxuIiwKLQkJCUlQQV9STV9SRVNPVVJDRV9NSElfQ09OUywgcmVzKTsKLQkJZ290byBmYWlsOwotCX0KKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJaXBhX21oaV9kZXJlZ2lzdGVyX3BtKCk7CisJZWxzZQorCQlpcGFfbWhpX2RlbGV0ZV9ybV9yZXNvdXJjZXMoKTsKIAogCWlwYV9taGlfZGVidWdmc19kZXN0cm95KCk7CiAJZGVzdHJveV93b3JrcXVldWUoaXBhX21oaV9jbGllbnRfY3R4LT53cSk7CkBAIC0yNDIwLDYgKzI1MTEsMTMyIEBACiAJaXBhX2Fzc2VydCgpOwogfQogCitzdGF0aWMgdm9pZCBpcGFfbWhpX3BtX2NiKHZvaWQgKnAsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUEFfTUhJX0ZVTkNfRU5UUlkoKTsKKworCWlmIChldmVudCAhPSBJUEFfUE1fUkVRVUVTVF9XQUtFVVApIHsKKwkJSVBBX01ISV9FUlIoIlVuZXhwZWN0ZWQgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCUlQQV9NSElfREJHKCIlc1xuIiwgTUhJX1NUQVRFX1NUUihpcGFfbWhpX2NsaWVudF9jdHgtPnN0YXRlKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYV9taGlfY2xpZW50X2N0eC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCWlmIChpcGFfbWhpX2NsaWVudF9jdHgtPnN0YXRlID09IElQQV9NSElfU1RBVEVfU1VTUEVOREVEKSB7CisJCWlwYV9taGlfbm90aWZ5X3dha2V1cCgpOworCX0gZWxzZSBpZiAoaXBhX21oaV9jbGllbnRfY3R4LT5zdGF0ZSA9PQorCQlJUEFfTUhJX1NUQVRFX1NVU1BFTkRfSU5fUFJPR1JFU1MpIHsKKwkJLyogd2FrZXVwIGV2ZW50IHdpbGwgYmUgdHJpZ2dlciBhZnRlciBzdXNwZW5kIGZpbmlzaGVzICovCisJCWlwYV9taGlfY2xpZW50X2N0eC0+dHJpZ2dlcl93YWtldXAgPSB0cnVlOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGFfbWhpX2NsaWVudF9jdHgtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlJUEFfTUhJX0RCRygiRVhJVCIpOworfQorCitzdGF0aWMgaW50IGlwYV9taGlfcmVnaXN0ZXJfcG0odm9pZCkKK3sKKwlpbnQgcmVzOworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHBhcmFtczsKKworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJcGFyYW1zLm5hbWUgPSAiTUhJIjsKKwlwYXJhbXMuY2FsbGJhY2sgPSBpcGFfbWhpX3BtX2NiOworCXBhcmFtcy5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxUOworCXJlcyA9IGlwYV9wbV9yZWdpc3RlcigmcGFyYW1zLCAmaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwpOworCWlmIChyZXMpIHsKKwkJSVBBX01ISV9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgd2l0aCBQTSAlZFxuIiwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXMgPSBpcGFfcG1fYXNzb2NpYXRlX2lwYV9jb25zX3RvX2NsaWVudChpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCwKKwkJSVBBX0NMSUVOVF9NSElfQ09OUyk7CisJaWYgKHJlcykgeworCQlJUEFfTUhJX0VSUigiZmFpbCB0byBhc3NvY2lhdGUgY29ucyB3aXRoIFBNICVkXG4iLCByZXMpOworCQlnb3RvIGZhaWxfcG1fY29uczsKKwl9CisKKwlyZXMgPSBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZShpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCwgMTAwMCk7CisJaWYgKHJlcykgeworCQlJUEFfTUhJX0VSUigiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIHRvIFBNICVkXG4iLCByZXMpOworCQlnb3RvIGZhaWxfcG1fY29uczsKKwl9CisKKwkvKiBjcmVhdGUgYSBtb2RlbSBjbGllbnQgZm9yIGNsb2NrIHNjYWxpbmcgKi8KKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCXBhcmFtcy5uYW1lID0gIk1PREVNIChNSEkpIjsKKwlwYXJhbXMuZ3JvdXAgPSBJUEFfUE1fR1JPVVBfTU9ERU07CisJcGFyYW1zLnNraXBfY2xrX3ZvdGUgPSB0cnVlOworCXJlcyA9IGlwYV9wbV9yZWdpc3RlcigmcGFyYW1zLCAmaXBhX21oaV9jbGllbnRfY3R4LT5tb2RlbV9wbV9oZGwpOworCWlmIChyZXMpIHsKKwkJSVBBX01ISV9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgd2l0aCBQTSAlZFxuIiwgcmVzKTsKKwkJZ290byBmYWlsX3BtX2NvbnM7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfcG1fY29uczoKKwlpcGFfcG1fZGVyZWdpc3RlcihpcGFfbWhpX2NsaWVudF9jdHgtPnBtX2hkbCk7CisJaXBhX21oaV9jbGllbnRfY3R4LT5wbV9oZGwgPSB+MDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGlwYV9taGlfY3JlYXRlX3JtX3Jlc291cmNlcyh2b2lkKQoreworCWludCByZXM7CisJc3RydWN0IGlwYV9ybV9jcmVhdGVfcGFyYW1zIG1oaV9wcm9kX3BhcmFtczsKKwlzdHJ1Y3QgaXBhX3JtX2NyZWF0ZV9wYXJhbXMgbWhpX2NvbnNfcGFyYW1zOworCXN0cnVjdCBpcGFfcm1fcGVyZl9wcm9maWxlIHByb2ZpbGU7CisKKwkvKiBDcmVhdGUgUFJPRCBpbiBJUEEgUk0gKi8KKwltZW1zZXQoJm1oaV9wcm9kX3BhcmFtcywgMCwgc2l6ZW9mKG1oaV9wcm9kX3BhcmFtcykpOworCW1oaV9wcm9kX3BhcmFtcy5uYW1lID0gSVBBX1JNX1JFU09VUkNFX01ISV9QUk9EOworCW1oaV9wcm9kX3BhcmFtcy5mbG9vcl92b2x0YWdlID0gSVBBX1ZPTFRBR0VfU1ZTOworCW1oaV9wcm9kX3BhcmFtcy5yZWdfcGFyYW1zLm5vdGlmeV9jYiA9IGlwYV9taGlfcm1fcHJvZF9ub3RpZnk7CisJcmVzID0gaXBhX3JtX2NyZWF0ZV9yZXNvdXJjZSgmbWhpX3Byb2RfcGFyYW1zKTsKKwlpZiAocmVzKSB7CisJCUlQQV9NSElfRVJSKCJmYWlsIHRvIGNyZWF0ZSBJUEFfUk1fUkVTT1VSQ0VfTUhJX1BST0RcbiIpOworCQlnb3RvIGZhaWxfY3JlYXRlX3JtX3Byb2Q7CisJfQorCisJbWVtc2V0KCZwcm9maWxlLCAwLCBzaXplb2YocHJvZmlsZSkpOworCXByb2ZpbGUubWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwcyA9IDEwMDA7CisJcmVzID0gaXBhX3JtX3NldF9wZXJmX3Byb2ZpbGUoSVBBX1JNX1JFU09VUkNFX01ISV9QUk9ELCAmcHJvZmlsZSk7CisJaWYgKHJlcykgeworCQlJUEFfTUhJX0VSUigiZmFpbCB0byBzZXQgcHJvZmlsZSB0byBNSElfUFJPRFxuIik7CisJCWdvdG8gZmFpbF9wZXJmX3JtX3Byb2Q7CisJfQorCisJLyogQ3JlYXRlIENPTlMgaW4gSVBBIFJNICovCisJbWVtc2V0KCZtaGlfY29uc19wYXJhbXMsIDAsIHNpemVvZihtaGlfY29uc19wYXJhbXMpKTsKKwltaGlfY29uc19wYXJhbXMubmFtZSA9IElQQV9STV9SRVNPVVJDRV9NSElfQ09OUzsKKwltaGlfY29uc19wYXJhbXMuZmxvb3Jfdm9sdGFnZSA9IElQQV9WT0xUQUdFX1NWUzsKKwltaGlfY29uc19wYXJhbXMucmVxdWVzdF9yZXNvdXJjZSA9IGlwYV9taGlfcm1fY29uc19yZXF1ZXN0OworCW1oaV9jb25zX3BhcmFtcy5yZWxlYXNlX3Jlc291cmNlID0gaXBhX21oaV9ybV9jb25zX3JlbGVhc2U7CisJcmVzID0gaXBhX3JtX2NyZWF0ZV9yZXNvdXJjZSgmbWhpX2NvbnNfcGFyYW1zKTsKKwlpZiAocmVzKSB7CisJCUlQQV9NSElfRVJSKCJmYWlsIHRvIGNyZWF0ZSBJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlNcbiIpOworCQlnb3RvIGZhaWxfY3JlYXRlX3JtX2NvbnM7CisJfQorCisJbWVtc2V0KCZwcm9maWxlLCAwLCBzaXplb2YocHJvZmlsZSkpOworCXByb2ZpbGUubWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwcyA9IDEwMDA7CisJcmVzID0gaXBhX3JtX3NldF9wZXJmX3Byb2ZpbGUoSVBBX1JNX1JFU09VUkNFX01ISV9DT05TLCAmcHJvZmlsZSk7CisJaWYgKHJlcykgeworCQlJUEFfTUhJX0VSUigiZmFpbCB0byBzZXQgcHJvZmlsZSB0byBNSElfQ09OU1xuIik7CisJCWdvdG8gZmFpbF9wZXJmX3JtX2NvbnM7CisJfQorZmFpbF9wZXJmX3JtX2NvbnM6CisJaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlMpOworZmFpbF9jcmVhdGVfcm1fY29uczoKK2ZhaWxfcGVyZl9ybV9wcm9kOgorCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX01ISV9QUk9EKTsKK2ZhaWxfY3JlYXRlX3JtX3Byb2Q6CisJcmV0dXJuIHJlczsKK30KKwogLyoqCiAgKiBpcGFfbWhpX2luaXQoKSAtIEluaXRpYWxpemUgSVBBIE1ISSBkcml2ZXIKICAqIEBwYXJhbXM6IGluaXRpYWxpemF0aW9uIHBhcmFtcwpAQCAtMjQzNyw5ICsyNjU0LDYgQEAKIGludCBpcGFfbWhpX2luaXQoc3RydWN0IGlwYV9taGlfaW5pdF9wYXJhbXMgKnBhcmFtcykKIHsKIAlpbnQgcmVzOwotCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBtaGlfcHJvZF9wYXJhbXM7Ci0Jc3RydWN0IGlwYV9ybV9jcmVhdGVfcGFyYW1zIG1oaV9jb25zX3BhcmFtczsKLQlzdHJ1Y3QgaXBhX3JtX3BlcmZfcHJvZmlsZSBwcm9maWxlOwogCiAJSVBBX01ISV9GVU5DX0VOVFJZKCk7CiAKQEAgLTI1MDAsNDMgKzI3MTQsMTQgQEAKIAkJZ290byBmYWlsX2NyZWF0ZV93cTsKIAl9CiAKLQkvKiBDcmVhdGUgUFJPRCBpbiBJUEEgUk0gKi8KLQltZW1zZXQoJm1oaV9wcm9kX3BhcmFtcywgMCwgc2l6ZW9mKG1oaV9wcm9kX3BhcmFtcykpOwotCW1oaV9wcm9kX3BhcmFtcy5uYW1lID0gSVBBX1JNX1JFU09VUkNFX01ISV9QUk9EOwotCW1oaV9wcm9kX3BhcmFtcy5mbG9vcl92b2x0YWdlID0gSVBBX1ZPTFRBR0VfU1ZTOwotCW1oaV9wcm9kX3BhcmFtcy5yZWdfcGFyYW1zLm5vdGlmeV9jYiA9IGlwYV9taGlfcm1fcHJvZF9ub3RpZnk7Ci0JcmVzID0gaXBhX3JtX2NyZWF0ZV9yZXNvdXJjZSgmbWhpX3Byb2RfcGFyYW1zKTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmVzID0gaXBhX21oaV9yZWdpc3Rlcl9wbSgpOworCWVsc2UKKwkJcmVzID0gaXBhX21oaV9jcmVhdGVfcm1fcmVzb3VyY2VzKCk7CiAJaWYgKHJlcykgewotCQlJUEFfTUhJX0VSUigiZmFpbCB0byBjcmVhdGUgSVBBX1JNX1JFU09VUkNFX01ISV9QUk9EXG4iKTsKLQkJZ290byBmYWlsX2NyZWF0ZV9ybV9wcm9kOwotCX0KLQotCW1lbXNldCgmcHJvZmlsZSwgMCwgc2l6ZW9mKHByb2ZpbGUpKTsKLQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPSAxMDAwOwotCXJlcyA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9NSElfUFJPRCwgJnByb2ZpbGUpOwotCWlmIChyZXMpIHsKLQkJSVBBX01ISV9FUlIoImZhaWwgdG8gc2V0IHByb2ZpbGUgdG8gTUhJX1BST0RcbiIpOwotCQlnb3RvIGZhaWxfcGVyZl9ybV9wcm9kOwotCX0KLQotCS8qIENyZWF0ZSBDT05TIGluIElQQSBSTSAqLwotCW1lbXNldCgmbWhpX2NvbnNfcGFyYW1zLCAwLCBzaXplb2YobWhpX2NvbnNfcGFyYW1zKSk7Ci0JbWhpX2NvbnNfcGFyYW1zLm5hbWUgPSBJUEFfUk1fUkVTT1VSQ0VfTUhJX0NPTlM7Ci0JbWhpX2NvbnNfcGFyYW1zLmZsb29yX3ZvbHRhZ2UgPSBJUEFfVk9MVEFHRV9TVlM7Ci0JbWhpX2NvbnNfcGFyYW1zLnJlcXVlc3RfcmVzb3VyY2UgPSBpcGFfbWhpX3JtX2NvbnNfcmVxdWVzdDsKLQltaGlfY29uc19wYXJhbXMucmVsZWFzZV9yZXNvdXJjZSA9IGlwYV9taGlfcm1fY29uc19yZWxlYXNlOwotCXJlcyA9IGlwYV9ybV9jcmVhdGVfcmVzb3VyY2UoJm1oaV9jb25zX3BhcmFtcyk7Ci0JaWYgKHJlcykgewotCQlJUEFfTUhJX0VSUigiZmFpbCB0byBjcmVhdGUgSVBBX1JNX1JFU09VUkNFX01ISV9DT05TXG4iKTsKLQkJZ290byBmYWlsX2NyZWF0ZV9ybV9jb25zOwotCX0KLQotCW1lbXNldCgmcHJvZmlsZSwgMCwgc2l6ZW9mKHByb2ZpbGUpKTsKLQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPSAxMDAwOwotCXJlcyA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9NSElfQ09OUywgJnByb2ZpbGUpOwotCWlmIChyZXMpIHsKLQkJSVBBX01ISV9FUlIoImZhaWwgdG8gc2V0IHByb2ZpbGUgdG8gTUhJX0NPTlNcbiIpOwotCQlnb3RvIGZhaWxfcGVyZl9ybV9jb25zOworCQlJUEFfTUhJX0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBSTSByZXNvdXJjZXNcbiIpOworCQlyZXMgPSAtRUZBVUxUOworCQlnb3RvIGZhaWxfcm07CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB1QyBpbnRlcmZhY2UgKi8KQEAgLTI1NTEsMTIgKzI3MzYsNyBAQAogCUlQQV9NSElfRlVOQ19FWElUKCk7CiAJcmV0dXJuIDA7CiAKLWZhaWxfcGVyZl9ybV9jb25zOgotCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX01ISV9DT05TKTsKLWZhaWxfY3JlYXRlX3JtX2NvbnM6Ci1mYWlsX3BlcmZfcm1fcHJvZDoKLQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9NSElfUFJPRCk7Ci1mYWlsX2NyZWF0ZV9ybV9wcm9kOgorZmFpbF9ybToKIAlkZXN0cm95X3dvcmtxdWV1ZShpcGFfbWhpX2NsaWVudF9jdHgtPndxKTsKIGZhaWxfY3JlYXRlX3dxOgogCWtmcmVlKGlwYV9taGlfY2xpZW50X2N0eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvaXBhX3VjX29mZmxvYWQuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfdWNfb2ZmbG9hZC5jCmluZGV4IGExNWE5ZDguLmUxOWQyOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfdWNfb2ZmbG9hZC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfdWNfb2ZmbG9hZC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXBhX3VjX29mZmxvYWQuaD4KICNpbmNsdWRlIDxsaW51eC9tc21faXBhLmg+CiAjaW5jbHVkZSAiLi4vaXBhX2NvbW1vbl9pLmgiCisjaW5jbHVkZSAiLi4vaXBhX3YzL2lwYV9wbS5oIgogCiAjZGVmaW5lIElQQV9OVE5fRE1BX1BPT0xfQUxJR05NRU5UIDgKICNkZWZpbmUgT0ZGTE9BRF9EUlZfTkFNRSAiaXBhX3VjX29mZmxvYWQiCkBAIC02OSw2ICs3MCw3IEBACiAJY2hhciBuZXRkZXZfbmFtZVtJUEFfUkVTT1VSQ0VfTkFNRV9NQVhdOwogCWlwYV9ub3RpZnlfY2Igbm90aWZ5OwogCXN0cnVjdCBjb21wbGV0aW9uIG50bl9jb21wbGV0aW9uOworCXUzMiBwbV9oZGw7CiB9OwogCiBzdGF0aWMgc3RydWN0IGlwYV91Y19vZmZsb2FkX2N0eCAqaXBhX3VjX29mZmxvYWRfY3R4W0lQQV9VQ19NQVhfUFJPVF9TSVpFXTsKQEAgLTExMywyMiArMTE1LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaXBhX3VjX29mZmxvYWRfbnRuX3JlZ19pbnRmKAotCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9pbnRmX3BhcmFtcyAqaW5wLAotCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9vdXRfcGFyYW1zICpvdXRwLAorc3RhdGljIHZvaWQgaXBhX3VjX29mZmxvYWRfbnRuX3BtX2NiKHZvaWQgKnAsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2ZW50KQoreworCS8qIHN1c3BlbmQvcmVzdW1lIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlJUEFfVUNfT0ZGTE9BRF9EQkcoImV2ZW50ID0gJWRcbiIsIGV2ZW50KTsKK30KKworc3RhdGljIGludCBpcGFfdWNfb2ZmbG9hZF9udG5fcmVnaXN0ZXJfcG1fY2xpZW50KAogCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9jdHggKm50bl9jdHgpCiB7Ci0Jc3RydWN0IGlwYV9pb2NfYWRkX2hkciAqaGRyID0gTlVMTDsKLQlzdHJ1Y3QgaXBhX3R4X2ludGYgdHg7Ci0Jc3RydWN0IGlwYV9yeF9pbnRmIHJ4OwotCXN0cnVjdCBpcGFfaW9jX3R4X2ludGZfcHJvcCB0eF9wcm9wWzJdOwotCXN0cnVjdCBpcGFfaW9jX3J4X2ludGZfcHJvcCByeF9wcm9wWzJdOwotCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBwYXJhbTsKLQl1MzIgbGVuOwotCWludCByZXQgPSAwOworCWludCByZXM7CisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgcGFyYW1zOwogCi0JSVBBX1VDX09GRkxPQURfREJHKCJyZWdpc3RlciBpbnRlcmZhY2UgZm9yIG5ldGRldiAlc1xuIiwKLQkJCQkJIGlucC0+bmV0ZGV2X25hbWUpOworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJcGFyYW1zLm5hbWUgPSAiRVRIIjsKKwlwYXJhbXMuY2FsbGJhY2sgPSBpcGFfdWNfb2ZmbG9hZF9udG5fcG1fY2I7CisJcGFyYW1zLnVzZXJfZGF0YSA9IG50bl9jdHg7CisJcGFyYW1zLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQ7CisJcmVzID0gaXBhX3BtX3JlZ2lzdGVyKCZwYXJhbXMsICZudG5fY3R4LT5wbV9oZGwpOworCWlmIChyZXMpIHsKKwkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIHdpdGggUE0gJWRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCisJcmVzID0gaXBhX3BtX2Fzc29jaWF0ZV9pcGFfY29uc190b19jbGllbnQobnRuX2N0eC0+cG1faGRsLAorCQlJUEFfQ0xJRU5UX0VUSEVSTkVUX0NPTlMpOworCWlmIChyZXMpIHsKKwkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGFzc29jaWF0ZSBjb25zIHdpdGggUE0gJWRcbiIsIHJlcyk7CisJCWlwYV9wbV9kZXJlZ2lzdGVyKG50bl9jdHgtPnBtX2hkbCk7CisJCW50bl9jdHgtPnBtX2hkbCA9IH4wOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcGFfdWNfb2ZmbG9hZF9udG5fZGVyZWdpc3Rlcl9wbV9jbGllbnQoCisJc3RydWN0IGlwYV91Y19vZmZsb2FkX2N0eCAqbnRuX2N0eCkKK3sKKwlpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKG50bl9jdHgtPnBtX2hkbCk7CisJaXBhX3BtX2RlcmVnaXN0ZXIobnRuX2N0eC0+cG1faGRsKTsKK30KK3N0YXRpYyBpbnQgaXBhX3VjX29mZmxvYWRfbnRuX2NyZWF0ZV9ybV9yZXNvdXJjZXMoCisJc3RydWN0IGlwYV91Y19vZmZsb2FkX2N0eCAqbnRuX2N0eCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBwYXJhbTsKKwogCW1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihwYXJhbSkpOwogCXBhcmFtLm5hbWUgPSBJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRDsKIAlwYXJhbS5yZWdfcGFyYW1zLnVzZXJfZGF0YSA9IG50bl9jdHg7CkBAIC0xNDcsOSArMTgwLDM3IEBACiAJcmV0ID0gaXBhX3JtX2NyZWF0ZV9yZXNvdXJjZSgmcGFyYW0pOwogCWlmIChyZXQpIHsKIAkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGNyZWF0ZSBFVEhFUk5FVF9DT05TIHJlc291cmNlXG4iKTsKLQkJZ290byBmYWlsX2NyZWF0ZV9ybV9jb25zOworCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9FVEhFUk5FVF9QUk9EKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhX3VjX29mZmxvYWRfbnRuX3JlZ19pbnRmKAorCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9pbnRmX3BhcmFtcyAqaW5wLAorCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9vdXRfcGFyYW1zICpvdXRwLAorCXN0cnVjdCBpcGFfdWNfb2ZmbG9hZF9jdHggKm50bl9jdHgpCit7CisJc3RydWN0IGlwYV9pb2NfYWRkX2hkciAqaGRyID0gTlVMTDsKKwlzdHJ1Y3QgaXBhX3R4X2ludGYgdHg7CisJc3RydWN0IGlwYV9yeF9pbnRmIHJ4OworCXN0cnVjdCBpcGFfaW9jX3R4X2ludGZfcHJvcCB0eF9wcm9wWzJdOworCXN0cnVjdCBpcGFfaW9jX3J4X2ludGZfcHJvcCByeF9wcm9wWzJdOworCWludCByZXQgPSAwOworCXUzMiBsZW47CisKKworCUlQQV9VQ19PRkZMT0FEX0RCRygicmVnaXN0ZXIgaW50ZXJmYWNlIGZvciBuZXRkZXYgJXNcbiIsCisJCQkJCSBpbnAtPm5ldGRldl9uYW1lKTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmV0ID0gaXBhX3VjX29mZmxvYWRfbnRuX3JlZ2lzdGVyX3BtX2NsaWVudChudG5fY3R4KTsKKwllbHNlCisJCXJldCA9IGlwYV91Y19vZmZsb2FkX250bl9jcmVhdGVfcm1fcmVzb3VyY2VzKG50bl9jdHgpOworCWlmIChyZXQpIHsKKwkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGNyZWF0ZSBybSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAltZW1jcHkobnRuX2N0eC0+bmV0ZGV2X25hbWUsIGlucC0+bmV0ZGV2X25hbWUsIElQQV9SRVNPVVJDRV9OQU1FX01BWCk7CiAJbnRuX2N0eC0+aGRyX2xlbiA9IGlucC0+aGRyX2luZm9bMF0uaGRyX2xlbjsKIAludG5fY3R4LT5ub3RpZnkgPSBpbnAtPm5vdGlmeTsKQEAgLTIyOCw5ICsyODksMTIgQEAKIGZhaWw6CiAJa2ZyZWUoaGRyKTsKIGZhaWxfYWxsb2M6Ci0JaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfQ09OUyk7Ci1mYWlsX2NyZWF0ZV9ybV9jb25zOgotCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX0VUSEVSTkVUX1BST0QpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKSB7CisJCWlwYV91Y19vZmZsb2FkX250bl9kZXJlZ2lzdGVyX3BtX2NsaWVudChudG5fY3R4KTsKKwl9IGVsc2UgeworCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9FVEhFUk5FVF9DT05TKTsKKwkJaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCk7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM0OCwyNSArNDEyLDM0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJlc3VsdCA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCwKLQkJSVBBX1JNX1JFU09VUkNFX0FQUFNfQ09OUyk7Ci0JaWYgKHJlc3VsdCkgewotCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gYWRkIHJtIGRlcGVuZGVuY3k6ICVkXG4iLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkgeworCQlyZXN1bHQgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhudG5fY3R4LT5wbV9oZGwpOworCQlpZiAocmVzdWx0KSB7CisJCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gYWN0aXZhdGU6ICVkXG4iLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0gZWxzZSB7CisJCXJlc3VsdCA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCwKKwkJCUlQQV9STV9SRVNPVVJDRV9BUFBTX0NPTlMpOworCQlpZiAocmVzdWx0KSB7CisJCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gYWRkIHJtIGRlcGVuZGVuY3k6ICVkXG4iLAorCQkJCXJlc3VsdCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CiAKLQlyZXN1bHQgPSBpcGFfcm1fcmVxdWVzdF9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCk7Ci0JaWYgKHJlc3VsdCA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbnRuX2N0eC0+bnRuX2NvbXBsZXRpb24sCi0JCQkxMCpIWikgPT0gMCkgewotCQkJSVBBX1VDX09GRkxPQURfRVJSKCJFVEhfUFJPRCByZXNvdXJjZSByZXEgdGltZSBvdXRcbiIpOworCQlyZXN1bHQgPSBpcGFfcm1fcmVxdWVzdF9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCk7CisJCWlmIChyZXN1bHQgPT0gLUVJTlBST0dSRVNTKSB7CisJCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZudG5fY3R4LT5udG5fY29tcGxldGlvbgorCQkJCSwgMTAqSFopID09IDApIHsKKwkJCQlJUEFfVUNfT0ZGTE9BRF9FUlIoIkVUSF9QUk9EIHJlcSB0aW1lb3V0XG4iKTsKKwkJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfSBlbHNlIGlmIChyZXN1bHQgIT0gMCkgeworCQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIHJlcXVlc3QgcmVzb3VyY2VcbiIpOwogCQkJcmVzdWx0ID0gLUVGQVVMVDsKIAkJCWdvdG8gZmFpbDsKIAkJfQotCX0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKLQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIHJlcXVlc3QgcmVzb3VyY2VcbiIpOwotCQlyZXN1bHQgPSAtRUZBVUxUOwotCQlnb3RvIGZhaWw7CiAJfQogCiAJbnRuX2N0eC0+c3RhdGUgPSBJUEFfVUNfT0ZGTE9BRF9TVEFURV9VUDsKQEAgLTM4Myw4ICs0NTYsOSBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCwKLQkJSVBBX1JNX1JFU09VUkNFX0FQUFNfQ09OUyk7CisJaWYgKCFpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX0VUSEVSTkVUX1BST0QsCisJCQlJUEFfUk1fUkVTT1VSQ0VfQVBQU19DT05TKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC00NTUsNiArNTI5LDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXR1cm4gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoCisJCQlpcGFfdWNfb2ZmbG9hZF9jdHhbSVBBX1VDX05UTl0tPnBtX2hkbCwKKwkJCXByb2ZpbGUtPm1heF9zdXBwb3J0ZWRfYndfbWJwcyk7CisKIAlpZiAoaXBhX3JtX3NldF9wZXJmX3Byb2ZpbGUocmVzb3VyY2VfbmFtZSwgJnJtX3Byb2ZpbGUpKSB7CiAJCUlQQV9VQ19PRkZMT0FEX0VSUigiZmFpbCB0byBzZXR1cCBybSBwZXJmIHByb2ZpbGVcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ3MSwxOCArNTUwLDI3IEBACiAKIAludG5fY3R4LT5zdGF0ZSA9IElQQV9VQ19PRkZMT0FEX1NUQVRFX0lOSVRJQUxJWkVEOwogCi0JcmV0ID0gaXBhX3JtX3JlbGVhc2VfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX0VUSEVSTkVUX1BST0QpOwotCWlmIChyZXQpIHsKLQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIHJlbGVhc2UgRVRIRVJORVRfUFJPRCByZXM6ICVkXG4iLAotCQkJCQkJICByZXQpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJcmV0ID0gaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhudG5fY3R4LT5wbV9oZGwpOworCQlpZiAocmV0KSB7CisJCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSByZXM6ICVkXG4iLAorCQkJcmV0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gaXBhX3JtX3JlbGVhc2VfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX0VUSEVSTkVUX1BST0QpOworCQlpZiAocmV0KSB7CisJCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgcmVsZWFzZSBFVEhFUk5FVF9QUk9EOiAlZFxuIiwKKwkJCQkJCQlyZXQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KIAotCXJldCA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfUFJPRCwKLQkJSVBBX1JNX1JFU09VUkNFX0FQUFNfQ09OUyk7Ci0JaWYgKHJldCkgewotCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gZGVsIGRlcCBFVEhfUFJPRC0+QVBQUywgJWRcbiIsIHJldCk7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX0VUSEVSTkVUX1BST0QsCisJCQlJUEFfUk1fUkVTT1VSQ0VfQVBQU19DT05TKTsKKwkJaWYgKHJldCkgeworCQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIGRlbCBkZXAgRVRILT5BUFBTLCAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CiAJfQogCiAJaXBhX2VwX2lkeF91bCA9IGlwYV9nZXRfZXBfbWFwcGluZyhJUEFfQ0xJRU5UX0VUSEVSTkVUX1BST0QpOwpAQCAtNTM5LDE0ICs2MjcsMTggQEAKIAlpbnQgbGVuLCByZXN1bHQgPSAwOwogCXN0cnVjdCBpcGFfaW9jX2RlbF9oZHIgKmhkcjsKIAotCWlmIChpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9FVEhFUk5FVF9QUk9EKSkgewotCQlJUEFfVUNfT0ZGTE9BRF9FUlIoImZhaWwgdG8gZGVsZXRlIEVUSEVSTkVUX1BST0QgcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJaXBhX3VjX29mZmxvYWRfbnRuX2RlcmVnaXN0ZXJfcG1fY2xpZW50KG50bl9jdHgpOworCX0gZWxzZSB7CisJCWlmIChpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9FVEhFUk5FVF9QUk9EKSkgeworCQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGRlbGV0ZSBFVEhFUk5FVF9QUk9EXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CiAKLQlpZiAoaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfRVRIRVJORVRfQ09OUykpIHsKLQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGRlbGV0ZSBFVEhFUk5FVF9DT05TIHJlc291cmNlXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9FVEhFUk5FVF9DT05TKSkgeworCQkJSVBBX1VDX09GRkxPQURfRVJSKCJmYWlsIHRvIGRlbGV0ZSBFVEhFUk5FVF9DT05TXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CiAJfQogCiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBpcGFfaW9jX2RlbF9oZHIpICsgMiAqIHNpemVvZihzdHJ1Y3QgaXBhX2hkcl9kZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL2lwYV91c2IuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9pcGFfdXNiLmMKaW5kZXggYzVhYWFjNS4uNzQ1ZTQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL2lwYV91c2IuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvaXBhX3VzYi5jCkBAIC0xMTksNiArMTE5LDEyIEBACiAJYm9vbCBjb25zX3JlcXVlc3RlZF9yZWxlYXNlZDsKIH07CiAKK3N0cnVjdCBpcGEzX3VzYl9wbV9jb250ZXh0IHsKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyByZWdfcGFyYW1zOworCXN0cnVjdCB3b3JrX3N0cnVjdCAqcmVtb3RlX3dha2V1cF93b3JrOworCXUzMiBoZGw7Cit9OworCiBlbnVtIGlwYTNfdXNiX3N0YXRlIHsKIAlJUEFfVVNCX0lOVkFMSUQsCiAJSVBBX1VTQl9JTklUSUFMSVpFRCwKQEAgLTE1Nyw2ICsxNjMsNyBAQAogICovCiBzdHJ1Y3QgaXBhM191c2JfdHJhbnNwb3J0X3R5cGVfY3R4IHsKIAlzdHJ1Y3QgaXBhM191c2Jfcm1fY29udGV4dCBybV9jdHg7CisJc3RydWN0IGlwYTNfdXNiX3BtX2NvbnRleHQgcG1fY3R4OwogCWludCAoKmlwYV91c2Jfbm90aWZ5X2NiKShlbnVtIGlwYV91c2Jfbm90aWZ5X2V2ZW50LCB2b2lkICp1c2VyX2RhdGEpOwogCXZvaWQgKnVzZXJfZGF0YTsKIAllbnVtIGlwYTNfdXNiX3N0YXRlIHN0YXRlOwpAQCAtMzYyLDcgKzM2OSw4IEBACiAJCQlpcGEzX3VzYl9zdGF0ZV90b19zdHJpbmcobmV3X3N0YXRlKSk7CiAJfQogCi0JaWYgKHN0YXRlX2xlZ2FsICYmIChuZXdfc3RhdGUgPT0gSVBBX1VTQl9DT05ORUNURUQpKSB7CisJaWYgKCFpcGFfcG1faXNfdXNlZCgpICYmCisJCXN0YXRlX2xlZ2FsICYmIChuZXdfc3RhdGUgPT0gSVBBX1VTQl9DT05ORUNURUQpKSB7CiAJCXJtX2N0eCA9ICZpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4OwogCQlpZiAoKHJtX2N0eC0+Y29uc19zdGF0ZSA9PSBJUEFfVVNCX0NPTlNfR1JBTlRFRCkgfHwKIAkJCXJtX2N0eC0+Y29uc19yZXF1ZXN0ZWRfcmVsZWFzZWQpIHsKQEAgLTY1Niw2ICs2NjQsMzAgQEAKIAlyZXR1cm4gaXBhM191c2JfY29uc19yZWxlYXNlX3Jlc291cmNlX2NiX2RvKElQQV9VU0JfVFJBTlNQT1JUX0RQTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGlwYTNfdXNiX3BtX2NiKHZvaWQgKnAsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBpcGEzX3VzYl90cmFuc3BvcnRfdHlwZV9jdHggKnR0eXBlX2N0eCA9CisJCShzdHJ1Y3QgaXBhM191c2JfdHJhbnNwb3J0X3R5cGVfY3R4ICopcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVBBX1VTQl9EQkdfTE9XKCJlbnRyeVxuIik7CisKKwlpZiAoZXZlbnQgIT0gSVBBX1BNX1JFUVVFU1RfV0FLRVVQKSB7CisJCUlQQV9VU0JfRVJSKCJVbmV4cGVjdGVkIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBhM191c2JfY3R4LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJSVBBX1VTQl9EQkcoInN0YXRlIGlzICVzXG4iLAorCQlpcGEzX3VzYl9zdGF0ZV90b19zdHJpbmcodHR5cGVfY3R4LT5zdGF0ZSkpOworCWlmICh0dHlwZV9jdHgtPnN0YXRlID09IElQQV9VU0JfU1VTUEVOREVEKQorCQlxdWV1ZV93b3JrKGlwYTNfdXNiX2N0eC0+d3EsCisJCQl0dHlwZV9jdHgtPnBtX2N0eC5yZW1vdGVfd2FrZXVwX3dvcmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYTNfdXNiX2N0eC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCUlQQV9VU0JfREJHX0xPVygiZXhpdFxuIik7Cit9CisKIHN0YXRpYyBjaGFyICppcGEzX3VzYl90ZXRoX3Byb3RfdG9fc3RyaW5nKGVudW0gaXBhX3VzYl90ZXRoX3Byb3QgdGV0aF9wcm90KQogewogCXN3aXRjaCAodGV0aF9wcm90KSB7CkBAIC03MDMsNiArNzM1LDU5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXBhM191c2JfcmVnaXN0ZXJfcG0oZW51bSBpcGEzX3VzYl90cmFuc3BvcnRfdHlwZSB0dHlwZSkKK3sKKwlzdHJ1Y3QgaXBhM191c2JfdHJhbnNwb3J0X3R5cGVfY3R4ICp0dHlwZV9jdHggPQorCQkmaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdOworCWludCByZXN1bHQ7CisKKwltZW1zZXQoJnR0eXBlX2N0eC0+cG1fY3R4LnJlZ19wYXJhbXMsIDAsCisJCXNpemVvZih0dHlwZV9jdHgtPnBtX2N0eC5yZWdfcGFyYW1zKSk7CisJdHR5cGVfY3R4LT5wbV9jdHgucmVnX3BhcmFtcy5uYW1lID0gKHR0eXBlID09IElQQV9VU0JfVFJBTlNQT1JUX0RQTCkgPworCQkJCSJVU0IgRFBMIiA6ICJVU0IiOworCXR0eXBlX2N0eC0+cG1fY3R4LnJlZ19wYXJhbXMuY2FsbGJhY2sgPSBpcGEzX3VzYl9wbV9jYjsKKwl0dHlwZV9jdHgtPnBtX2N0eC5yZWdfcGFyYW1zLnVzZXJfZGF0YSA9IHR0eXBlX2N0eDsKKwl0dHlwZV9jdHgtPnBtX2N0eC5yZWdfcGFyYW1zLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQ7CisKKwlyZXN1bHQgPSBpcGFfcG1fcmVnaXN0ZXIoJnR0eXBlX2N0eC0+cG1fY3R4LnJlZ19wYXJhbXMsCisJCSZ0dHlwZV9jdHgtPnBtX2N0eC5oZGwpOworCWlmIChyZXN1bHQpIHsKKwkJSVBBX1VTQl9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgd2l0aCBQTSAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBmYWlsX3BtX3JlZzsKKwl9CisKKwlyZXN1bHQgPSBpcGFfcG1fYXNzb2NpYXRlX2lwYV9jb25zX3RvX2NsaWVudCh0dHlwZV9jdHgtPnBtX2N0eC5oZGwsCisJCSh0dHlwZSA9PSBJUEFfVVNCX1RSQU5TUE9SVF9EUEwpID8KKwkJSVBBX0NMSUVOVF9VU0JfRFBMX0NPTlMgOiBJUEFfQ0xJRU5UX1VTQl9DT05TKTsKKwlpZiAocmVzdWx0KSB7CisJCUlQQV9VU0JfRVJSKCJmYWlsIHRvIGFzc29jaWF0ZSBjb25zIHdpdGggUE0gJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZmFpbF9wbV9jb25zOworCX0KKworCXJldHVybiAwOworCitmYWlsX3BtX2NvbnM6CisJaXBhX3BtX2RlcmVnaXN0ZXIodHR5cGVfY3R4LT5wbV9jdHguaGRsKTsKK2ZhaWxfcG1fcmVnOgorCW1lbXNldCgmdHR5cGVfY3R4LT5wbV9jdHgucmVnX3BhcmFtcywgMCwKKwkJc2l6ZW9mKHR0eXBlX2N0eC0+cG1fY3R4LnJlZ19wYXJhbXMpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGlwYTNfdXNiX2RlcmVnaXN0ZXJfcG0oZW51bSBpcGEzX3VzYl90cmFuc3BvcnRfdHlwZSB0dHlwZSkKK3sKKwlzdHJ1Y3QgaXBhM191c2JfcG1fY29udGV4dCAqcG1fY3R4ID0KKwkJJmlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5wbV9jdHg7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGlwYV9wbV9kZXJlZ2lzdGVyKHBtX2N0eC0+aGRsKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJbWVtc2V0KCZwbV9jdHgtPnJlZ19wYXJhbXMsIDAsIHNpemVvZihwbV9jdHgtPnJlZ19wYXJhbXMpKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBpcGEzX3VzYl9jcmVhdGVfcm1fcmVzb3VyY2VzKGVudW0gaXBhM191c2JfdHJhbnNwb3J0X3R5cGUgdHR5cGUpCiB7CiAJc3RydWN0IGlwYTNfdXNiX3JtX2NvbnRleHQgKnJtX2N0eDsKQEAgLTcxNiw3ICs4MDEsNyBAQAogCQlybV9jdHgtPnByb2RfcGFyYW1zLm5hbWUgPSBJUEEzX1VTQl9JU19UVFlQRV9EUEwodHR5cGUpID8KIAkJCUlQQV9STV9SRVNPVVJDRV9VU0JfRFBMX0RVTU1ZX1BST0QgOgogCQkJSVBBX1JNX1JFU09VUkNFX1VTQl9QUk9EOwotCQlybV9jdHgtPnByb2RfcGFyYW1zLmZsb29yX3ZvbHRhZ2UgPSBJUEFfVk9MVEFHRV9TVlM7CisJCXJtX2N0eC0+cHJvZF9wYXJhbXMuZmxvb3Jfdm9sdGFnZSA9IElQQV9WT0xUQUdFX1NWUzI7CiAJCXJtX2N0eC0+cHJvZF9wYXJhbXMucmVnX3BhcmFtcy51c2VyX2RhdGEgPSBOVUxMOwogCQlybV9jdHgtPnByb2RfcGFyYW1zLnJlZ19wYXJhbXMubm90aWZ5X2NiID0KIAkJCUlQQTNfVVNCX0lTX1RUWVBFX0RQTCh0dHlwZSkgPwpAQCAtNzQxLDcgKzgyNiw3IEBACiAJCXJtX2N0eC0+Y29uc19wYXJhbXMubmFtZSA9IElQQTNfVVNCX0lTX1RUWVBFX0RQTCh0dHlwZSkgPwogCQkJSVBBX1JNX1JFU09VUkNFX1VTQl9EUExfQ09OUyA6CiAJCQlJUEFfUk1fUkVTT1VSQ0VfVVNCX0NPTlM7Ci0JCXJtX2N0eC0+Y29uc19wYXJhbXMuZmxvb3Jfdm9sdGFnZSA9IElQQV9WT0xUQUdFX1NWUzsKKwkJcm1fY3R4LT5jb25zX3BhcmFtcy5mbG9vcl92b2x0YWdlID0gSVBBX1ZPTFRBR0VfU1ZTMjsKIAkJcm1fY3R4LT5jb25zX3BhcmFtcy5yZWdfcGFyYW1zLnVzZXJfZGF0YSA9IE5VTEw7CiAJCXJtX2N0eC0+Y29uc19wYXJhbXMucmVnX3BhcmFtcy5ub3RpZnlfY2IgPSBOVUxMOwogCQlybV9jdHgtPmNvbnNfcGFyYW1zLnJlcXVlc3RfcmVzb3VyY2UgPQpAQCAtNzg0LDcgKzg2OSw3IEBACiAKIAltdXRleF9sb2NrKCZpcGEzX3VzYl9jdHgtPmdlbmVyYWxfbXV0ZXgpOwogCUlQQV9VU0JfREJHX0xPVygiZW50cnlcbiIpOwotCWlmICh0ZXRoX3Byb3QgPiBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSB8fAorCWlmICh0ZXRoX3Byb3QgPCAwIHx8IHRldGhfcHJvdCA+PSBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSB8fAogCQkoKHRldGhfcHJvdCA9PSBJUEFfVVNCX1JORElTIHx8IHRldGhfcHJvdCA9PSBJUEFfVVNCX0VDTSkgJiYKIAkJdGV0aF9wYXJhbXMgPT0gTlVMTCkgfHwgaXBhX3VzYl9ub3RpZnlfY2IgPT0gTlVMTCB8fAogCQl1c2VyX2RhdGEgPT0gTlVMTCkgewpAQCAtODAyLDcgKzg4NywxMCBAQAogCX0KIAogCS8qIENyZWF0ZSBJUEEgUk0gVVNCIHJlc291cmNlcyAqLwotCXJlc3VsdCA9IGlwYTNfdXNiX2NyZWF0ZV9ybV9yZXNvdXJjZXModHR5cGUpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXN1bHQgPSBpcGEzX3VzYl9yZWdpc3Rlcl9wbSh0dHlwZSk7CisJZWxzZQorCQlyZXN1bHQgPSBpcGEzX3VzYl9jcmVhdGVfcm1fcmVzb3VyY2VzKHR0eXBlKTsKIAlpZiAocmVzdWx0KSB7CiAJCUlQQV9VU0JfRVJSKCJGYWlsZWQgY3JlYXRpbmcgSVBBIFJNIFVTQiByZXNvdXJjZXNcbiIpOwogCQlnb3RvIGJhZF9wYXJhbXM7CkBAIC05MzQsMTIgKzEwMjIsMTggQEAKIHRldGhfcHJvdF9pbml0X2ZhaWw6CiAJaWYgKChJUEEzX1VTQl9JU19UVFlQRV9EUEwodHR5cGUpKQogCQl8fCAoaXBhM191c2JfY3R4LT5udW1faW5pdF9wcm90ID09IDApKSB7Ci0JCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5ybV9jdHgucHJvZF92YWxpZCA9IGZhbHNlOwotCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LmNvbnNfdmFsaWQgPSBmYWxzZTsKLQkJaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZSgKKwkJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJCWlwYTNfdXNiX2RlcmVnaXN0ZXJfcG0odHR5cGUpOworCQl9IGVsc2UgeworCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5wcm9kX3ZhbGlkID0KKwkJCQlmYWxzZTsKKwkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5ybV9jdHguY29uc192YWxpZCA9CisJCQkJZmFsc2U7CisJCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKAogCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5wcm9kX3BhcmFtcy5uYW1lKTsKLQkJaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZSgKKwkJCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoCiAJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LmNvbnNfcGFyYW1zLm5hbWUpOworCQl9CiAJfQogYmFkX3BhcmFtczoKIAltdXRleF91bmxvY2soJmlwYTNfdXNiX2N0eC0+Z2VuZXJhbF9tdXRleCk7CkBAIC05ODcsNyArMTA4MSw4IEBACiAJCXBhcmFtcy0+eGZlcl9zY3JhdGNoLmRlcGNtZF9oaV9hZGRyKTsKIAogCWlmIChwYXJhbXMtPmNsaWVudCA+PSBJUEFfQ0xJRU5UX01BWCAgfHwKLQkJcGFyYW1zLT50ZXRoX3Byb3QgPiBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSB8fAorCQlwYXJhbXMtPnRldGhfcHJvdCA8IDAgfHwKKwkJcGFyYW1zLT50ZXRoX3Byb3QgPj0gSVBBX1VTQl9NQVhfVEVUSF9QUk9UX1NJWkUgfHwKIAkJcGFyYW1zLT54ZmVyX3JpbmdfbGVuICUgR1NJX0NIQU5fUkVfU0laRV8xNkIgfHwKIAkJcGFyYW1zLT54ZmVyX3NjcmF0Y2guY29uc3RfYnVmZmVyX3NpemUgPCAxIHx8CiAJCXBhcmFtcy0+eGZlcl9zY3JhdGNoLmNvbnN0X2J1ZmZlcl9zaXplID4gMzEpIHsKQEAgLTEyNTEsNyArMTM0Niw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAlJUEFfVVNCX0RCR19MT1coImVudHJ5XG4iKTsKLQlpZiAodHR5cGUgPiBJUEFfVVNCX1RSQU5TUE9SVF9NQVgpIHsKKwlpZiAodHR5cGUgPCAwIHx8IHR0eXBlID49IElQQV9VU0JfVFJBTlNQT1JUX01BWCkgewogCQlJUEFfVVNCX0VSUigiYmFkIHBhcmFtZXRlci5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzU1LDcgKzE0NTAsOCBAQAogCQkocGFyYW1zLT50ZXRoX3Byb3QgIT0gSVBBX1VTQl9ESUFHICYmCiAJCShwYXJhbXMtPnVzYl90b19pcGFfeGZlcnJzY2lkeCA8IDAgfHwKIAkJcGFyYW1zLT51c2JfdG9faXBhX3hmZXJyc2NpZHggPiAxMjcpKSB8fAotCQlwYXJhbXMtPnRldGhfcHJvdCA+IElQQV9VU0JfTUFYX1RFVEhfUFJPVF9TSVpFKSB7CisJCXBhcmFtcy0+dGV0aF9wcm90IDwgMCB8fAorCQlwYXJhbXMtPnRldGhfcHJvdCA+PSBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSkgewogCQlJUEFfVVNCX0VSUigiSW52YWxpZCBwYXJhbXNcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTM5MSw2ICsxNDg3LDkgQEAKIHsKIAlpbnQgcmVzID0gMDsKIAorCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXR1cm4gMDsKKwogCS8qCiAJICogQWRkIERQTCBkZXBlbmRlbmN5IHRvIFJNIGRlcGVuZGVuY3kgZ3JhcGgsIGZpcnN0IGFkZF9kZXBlbmRlbmN5IGNhbGwKIAkgKiBpcyBzeW5jIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUgSVBBIGNsb2NrcyBhcmUgdXAgYmVmb3JlIHdlCkBAIC0xNTcwLDYgKzE2NjksOSBAQAogewogCWludCByZXM7CiAKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBSZW1vdmUgRFBMIFJNIGRlcGVuZGVuY3kgKi8KIAlyZXMgPSBpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1VTQl9EUExfRFVNTVlfUFJPRCwKIAkJCQkgICAgSVBBX1JNX1JFU09VUkNFX1E2X0NPTlMpOwpAQCAtMTY5NywzMiArMTc5OSw1MSBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCS8qIFNldCBSTSBQUk9EICYgQ09OUyBwZXJmIHByb2ZpbGUgKi8KLQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPQotCQkJcGFyYW1zLT5tYXhfc3VwcG9ydGVkX2JhbmR3aWR0aF9tYnBzOwotCXJlc3VsdCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKAotCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LnByb2RfcGFyYW1zLm5hbWUsCi0JCSZwcm9maWxlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCUlQQV9VU0JfRVJSKCJmYWlsZWQgdG8gc2V0ICVzIHBlcmYgcHJvZmlsZVxuIiwKLQkJCWlwYV9ybV9yZXNvdXJjZV9zdHIoaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLgotCQkJCXJtX2N0eC5wcm9kX3BhcmFtcy5uYW1lKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXJlc3VsdCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKAotCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LmNvbnNfcGFyYW1zLm5hbWUsCi0JCSZwcm9maWxlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCUlQQV9VU0JfRVJSKCJmYWlsZWQgdG8gc2V0ICVzIHBlcmYgcHJvZmlsZVxuIiwKLQkJCWlwYV9ybV9yZXNvdXJjZV9zdHIoaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLgotCQkJCXJtX2N0eC5jb25zX3BhcmFtcy5uYW1lKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorCWlmIChpcGFfcG1faXNfdXNlZCgpKSB7CisJCXJlc3VsdCA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKAorCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnBtX2N0eC5oZGwsCisJCQlwYXJhbXMtPm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMpOworCQlpZiAocmVzdWx0KSB7CisJCQlJUEFfVVNCX0VSUigiZmFpbGVkIHRvIHNldCBwZXJmIHByb2ZpbGVcbiIpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQogCi0JLyogUmVxdWVzdCBQUk9EICovCi0JcmVzdWx0ID0gaXBhM191c2JfcmVxdWVzdF9wcm9kKHR0eXBlKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OworCQlyZXN1bHQgPSBpcGFfcG1fYWN0aXZhdGVfc3luYygKKwkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5wbV9jdHguaGRsKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJSVBBX1VTQl9FUlIoImZhaWxlZCB0byBhY3RpdmF0ZSBwbVxuIik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfSBlbHNlIHsKKwkJLyogU2V0IFJNIFBST0QgJiBDT05TIHBlcmYgcHJvZmlsZSAqLworCQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPQorCQkJCXBhcmFtcy0+bWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwczsKKwkJcmVzdWx0ID0gaXBhX3JtX3NldF9wZXJmX3Byb2ZpbGUoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LnByb2RfcGFyYW1zLm5hbWUsCisJCQkmcHJvZmlsZSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCUlQQV9VU0JfRVJSKCJmYWlsZWQgdG8gc2V0ICVzIHBlcmYgcHJvZmlsZVxuIiwKKwkJCQlpcGFfcm1fcmVzb3VyY2Vfc3RyKGlwYTNfdXNiX2N0eC0+CisJCQkJCXR0eXBlX2N0eFt0dHlwZV0uCisJCQkJCXJtX2N0eC5wcm9kX3BhcmFtcy5uYW1lKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKAorCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5jb25zX3BhcmFtcy5uYW1lLAorCQkJJnByb2ZpbGUpOworCQlpZiAocmVzdWx0KSB7CisJCQlJUEFfVVNCX0VSUigiZmFpbGVkIHRvIHNldCAlcyBwZXJmIHByb2ZpbGVcbiIsCisJCQkJaXBhX3JtX3Jlc291cmNlX3N0cihpcGEzX3VzYl9jdHgtPgorCQkJCQl0dHlwZV9jdHhbdHR5cGVdLgorCQkJCQlybV9jdHguY29uc19wYXJhbXMubmFtZSkpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCS8qIFJlcXVlc3QgUFJPRCAqLworCQlyZXN1bHQgPSBpcGEzX3VzYl9yZXF1ZXN0X3Byb2QodHR5cGUpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CiAKIAlpZiAocGFyYW1zLT50ZXRoX3Byb3QgIT0gSVBBX1VTQl9ESUFHKSB7CiAJCS8qIFN0YXJ0IFVMIGNoYW5uZWwgKi8KQEAgLTE3NzMsNyArMTg5NCwxMSBAQAogCQlpcGEzX3Jlc2V0X2dzaV9ldmVudF9yaW5nKHBhcmFtcy0+dXNiX3RvX2lwYV9jbG50X2hkbCk7CiAJfQogY29ubmVjdF91bF9mYWlsOgotCWlwYTNfdXNiX3JlbGVhc2VfcHJvZCh0dHlwZSk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCWlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQlpcGEzX3VzYl9yZWxlYXNlX3Byb2QodHR5cGUpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIwNTksNyArMjE4NCw3IEBACiAKIHN0YXRpYyBpbnQgaXBhM191c2JfY2hlY2tfZGlzY29ubmVjdF9wcm90KGVudW0gaXBhX3VzYl90ZXRoX3Byb3QgdGV0aF9wcm90KQogewotCWlmICh0ZXRoX3Byb3QgPiBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSkgeworCWlmICh0ZXRoX3Byb3QgPCAwIHx8IHRldGhfcHJvdCA+PSBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSkgewogCQlJUEFfVVNCX0VSUigiYmFkIHBhcmFtZXRlci5cbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0yMjIyLDcgKzIzNDcsMTEgQEAKIAkJZ290byBiYWRfcGFyYW1zOwogCiAJaWYgKG9yaWdfc3RhdGUgIT0gSVBBX1VTQl9TVVNQRU5ERUQpIHsKLQkJcmVzdWx0ID0gaXBhM191c2JfcmVsZWFzZV9wcm9kKHR0eXBlKTsKKwkJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCQlyZXN1bHQgPSBpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKAorCQkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5wbV9jdHguaGRsKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gaXBhM191c2JfcmVsZWFzZV9wcm9kKHR0eXBlKTsKIAkJaWYgKHJlc3VsdCkgewogCQkJSVBBX1VTQl9FUlIoImZhaWxlZCB0byByZWxlYXNlIFBST0QuXG4iKTsKIAkJCWdvdG8gYmFkX3BhcmFtczsKQEAgLTIyNDcsNyArMjM3Niw3IEBACiAKIAltdXRleF9sb2NrKCZpcGEzX3VzYl9jdHgtPmdlbmVyYWxfbXV0ZXgpOwogCUlQQV9VU0JfREJHX0xPVygiZW50cnlcbiIpOwotCWlmICh0ZXRoX3Byb3QgPiBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSkgeworCWlmICh0ZXRoX3Byb3QgPCAwIHx8IHRldGhfcHJvdCA+PSBJUEFfVVNCX01BWF9URVRIX1BST1RfU0laRSkgewogCQlJUEFfVVNCX0VSUigiYmFkIHBhcmFtZXRlcnMuXG4iKTsKIAkJcmVzdWx0ID0gLUVJTlZBTDsKIAkJZ290byBiYWRfcGFyYW1zOwpAQCAtMjMzMiwxMyArMjQ2MSwxOSBAQAogCQkoaXBhM191c2JfY3R4LT5udW1faW5pdF9wcm90ID09IDApKSB7CiAJCWlmICghaXBhM191c2Jfc2V0X3N0YXRlKElQQV9VU0JfSU5WQUxJRCwgZmFsc2UsIHR0eXBlKSkKIAkJCUlQQV9VU0JfRVJSKCJmYWlsZWQgdG8gY2hhbmdlIHN0YXRlIHRvIGludmFsaWRcbiIpOwotCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKAorCQlpZiAoaXBhX3BtX2lzX3VzZWQoKSkgeworCQkJaXBhM191c2JfZGVyZWdpc3Rlcl9wbSh0dHlwZSk7CisJCX0gZWxzZSB7CisJCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKAogCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5wcm9kX3BhcmFtcy5uYW1lKTsKLQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5wcm9kX3ZhbGlkID0gZmFsc2U7Ci0JCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucm1fY3R4LnByb2RfdmFsaWQgPQorCQkJCWZhbHNlOworCQkJaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZSgKIAkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5ybV9jdHguY29uc19wYXJhbXMubmFtZSk7Ci0JCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5ybV9jdHguY29uc192YWxpZCA9IGZhbHNlOwotCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0uaXBhX3VzYl9ub3RpZnlfY2IgPSBOVUxMOworCQkJaXBhM191c2JfY3R4LT50dHlwZV9jdHhbdHR5cGVdLnJtX2N0eC5jb25zX3ZhbGlkID0KKwkJCQlmYWxzZTsKKwkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5pcGFfdXNiX25vdGlmeV9jYiA9IE5VTEw7CisJCX0KIAl9CiAKIAlJUEFfVVNCX0RCR19MT1coImV4aXRcbiIpOwpAQCAtMjM5OCw3ICsyNTMzLDExIEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBzdGFydF91bDsKIAotCXJlc3VsdCA9IGlwYTNfdXNiX3JlbGVhc2VfcHJvZCh0dHlwZSk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCXJlc3VsdCA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQlyZXN1bHQgPSBpcGEzX3VzYl9yZWxlYXNlX3Byb2QodHR5cGUpOwogCWlmIChyZXN1bHQpIHsKIAkJSVBBX1VTQl9FUlIoImZhaWxlZCB0byByZWxlYXNlIFBST0QuXG4iKTsKIAkJZ290byBjb25uZWN0X3RldGg7CkBAIC0yNDMyLDcgKzI1NzEsNyBAQAogCW11dGV4X2xvY2soJmlwYTNfdXNiX2N0eC0+Z2VuZXJhbF9tdXRleCk7CiAJSVBBX1VTQl9EQkdfTE9XKCJlbnRyeVxuIik7CiAKLQlpZiAodGV0aF9wcm90ID4gSVBBX1VTQl9NQVhfVEVUSF9QUk9UX1NJWkUpIHsKKwlpZiAodGV0aF9wcm90IDwgMCB8fCB0ZXRoX3Byb3QgPj0gSVBBX1VTQl9NQVhfVEVUSF9QUk9UX1NJWkUpIHsKIAkJSVBBX1VTQl9FUlIoImJhZCBwYXJhbWV0ZXJzLlxuIik7CiAJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3BhcmFtczsKQEAgLTI0NzUsNyArMjYxNCwxMSBAQAogCX0KIAlpcGEzX3VzYl9jdHgtPnFtaV9yZXFfaWQrKzsKIAotCXJlc3VsdCA9IGlwYTNfdXNiX3JlbGVhc2VfcHJvZCh0dHlwZSk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCXJlc3VsdCA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQlyZXN1bHQgPSBpcGEzX3VzYl9yZWxlYXNlX3Byb2QodHR5cGUpOwogCWlmIChyZXN1bHQpIHsKIAkJSVBBX1VTQl9FUlIoImZhaWxlZCB0byByZWxlYXNlIFBST0RcbiIpOwogCQlnb3RvIHJlbGVhc2VfcHJvZF9mYWlsOwpAQCAtMjU0MSw3ICsyNjg0LDExIEBACiAJCSJEUEwgY2hhbm5lbCI6IkRhdGEgVGV0aGVyaW5nIGNoYW5uZWxzIik7CiAKIAkvKiBSZXF1ZXN0IFVTQl9QUk9EICovCi0JcmVzdWx0ID0gaXBhM191c2JfcmVxdWVzdF9wcm9kKHR0eXBlKTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmVzdWx0ID0gaXBhX3BtX2FjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQlyZXN1bHQgPSBpcGEzX3VzYl9yZXF1ZXN0X3Byb2QodHR5cGUpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZmFpbF9leGl0OwogCkBAIC0yNTg4LDcgKzI3MzUsMTEgQEAKIGRpc2Nvbm5fdGV0aDoKIAkodm9pZClpcGEzX3VzYl9kaXNjb25uZWN0X3RldGhfcHJvdCh0ZXRoX3Byb3QpOwogcmVsZWFzZV9wcm9kOgotCSh2b2lkKWlwYTNfdXNiX3JlbGVhc2VfcHJvZCh0dHlwZSk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCSh2b2lkKWlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQkodm9pZClpcGEzX3VzYl9yZWxlYXNlX3Byb2QodHR5cGUpOwogZmFpbF9leGl0OgogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yNjA0LDcgKzI3NTUsNyBAQAogCW11dGV4X2xvY2soJmlwYTNfdXNiX2N0eC0+Z2VuZXJhbF9tdXRleCk7CiAJSVBBX1VTQl9EQkdfTE9XKCJlbnRyeVxuIik7CiAKLQlpZiAodGV0aF9wcm90ID4gSVBBX1VTQl9NQVhfVEVUSF9QUk9UX1NJWkUpIHsKKwlpZiAodGV0aF9wcm90IDwgMCB8fCB0ZXRoX3Byb3QgPj0gSVBBX1VTQl9NQVhfVEVUSF9QUk9UX1NJWkUpIHsKIAkJSVBBX1VTQl9FUlIoImJhZCBwYXJhbWV0ZXJzLlxuIik7CiAJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCWdvdG8gYmFkX3BhcmFtczsKQEAgLTI2NDAsNyArMjc5MSwxMSBAQAogCX0KIAogCS8qIFJlcXVlc3QgVVNCX1BST0QgKi8KLQlyZXN1bHQgPSBpcGEzX3VzYl9yZXF1ZXN0X3Byb2QodHR5cGUpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXN1bHQgPSBpcGFfcG1fYWN0aXZhdGVfc3luYygKKwkJCWlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W3R0eXBlXS5wbV9jdHguaGRsKTsKKwllbHNlCisJCXJlc3VsdCA9IGlwYTNfdXNiX3JlcXVlc3RfcHJvZCh0dHlwZSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBwcm9kX3JlcV9mYWlsOwogCkBAIC0yNjgzLDcgKzI4MzgsMTEgQEAKIAkJCUlQQV9VU0JfRVJSKCJFcnJvciBzdG9wcGluZyBVTCBjaGFubmVsOiAlZFxuIiwgcmVzdWx0KTsKIAl9CiBzdGFydF91bF9mYWlsOgotCWlwYTNfdXNiX3JlbGVhc2VfcHJvZCh0dHlwZSk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCWlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoCisJCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFt0dHlwZV0ucG1fY3R4LmhkbCk7CisJZWxzZQorCQlpcGEzX3VzYl9yZWxlYXNlX3Byb2QodHR5cGUpOwogcHJvZF9yZXFfZmFpbDoKIAkvKiBDaGFuZ2Ugc3RhdGUgYmFjayB0byBwcmV2X3N0YXRlICovCiAJaWYgKCFpcGEzX3VzYl9zZXRfc3RhdGUocHJldl9zdGF0ZSwgdHJ1ZSwgdHR5cGUpKQpAQCAtMjcyMCw2ICsyODc5LDIwIEBACiAJaXBhM191c2JfY3R4LT5kbF9kYXRhX3BlbmRpbmcgPSBmYWxzZTsKIAltdXRleF9pbml0KCZpcGEzX3VzYl9jdHgtPmdlbmVyYWxfbXV0ZXgpOwogCisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJc3RydWN0IGlwYTNfdXNiX3BtX2NvbnRleHQgKnBtX2N0eDsKKworCQlwbV9jdHggPQorCQkJJmlwYTNfdXNiX2N0eC0+dHR5cGVfY3R4W0lQQV9VU0JfVFJBTlNQT1JUX1RFVEhdLnBtX2N0eDsKKwkJcG1fY3R4LT5oZGwgPSB+MDsKKwkJcG1fY3R4LT5yZW1vdGVfd2FrZXVwX3dvcmsgPQorCQkJJmlwYTNfdXNiX25vdGlmeV9yZW1vdGVfd2FrZXVwX3dvcms7CisJCXBtX2N0eCA9ICZpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFtJUEFfVVNCX1RSQU5TUE9SVF9EUExdLnBtX2N0eDsKKwkJcG1fY3R4LT5oZGwgPSB+MDsKKwkJcG1fY3R4LT5yZW1vdGVfd2FrZXVwX3dvcmsgPQorCQkJJmlwYTNfdXNiX2RwbF9ub3RpZnlfcmVtb3RlX3dha2V1cF93b3JrOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBJUEFfVVNCX1RSQU5TUE9SVF9NQVg7IGkrKykgewogCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFtpXS5ybV9jdHgucHJvZF92YWxpZCA9IGZhbHNlOwogCQlpcGEzX3VzYl9jdHgtPnR0eXBlX2N0eFtpXS5ybV9jdHguY29uc192YWxpZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL29kdV9icmlkZ2UuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9vZHVfYnJpZGdlLmMKaW5kZXggYTYyM2QwYi4uZjBkMTEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL29kdV9icmlkZ2UuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvb2R1X2JyaWRnZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYV9vZHVfYnJpZGdlLmg+CiAjaW5jbHVkZSAiLi4vaXBhX2NvbW1vbl9pLmgiCisjaW5jbHVkZSAiLi4vaXBhX3YzL2lwYV9wbS5oIgogCiAjZGVmaW5lIE9EVV9CUklER0VfRFJWX05BTUUgIm9kdV9pcGFfYnJpZGdlIgogCkBAIC0xNTIsNiArMTUzLDcgQEAKIAl2b2lkICpsb2didWZfbG93OwogCXN0cnVjdCBjb21wbGV0aW9uIHJtX2NvbXA7CiAJdm9pZCAoKndha2V1cF9yZXF1ZXN0KSh2b2lkICopOworCXUzMiBwbV9oZGw7CiB9Owogc3RhdGljIHN0cnVjdCBvZHVfYnJpZGdlX2N0eCAqb2R1X2JyaWRnZV9jdHg7CiAKQEAgLTI3MywyMCArMjc1LDIyIEBACiAJbWVtc2V0KCZvZHVfcHJvZF9wYXJhbXMsIDAsIHNpemVvZihvZHVfcHJvZF9wYXJhbXMpKTsKIAltZW1zZXQoJm9kdV9lbWJfY29uc19wYXJhbXMsIDAsIHNpemVvZihvZHVfZW1iX2NvbnNfcGFyYW1zKSk7CiAKLQkvKiBCdWlsZCBJUEEgUmVzb3VyY2UgbWFuYWdlciBkZXBlbmRlbmN5IGdyYXBoICovCi0JT0RVX0JSSURHRV9EQkdfTE9XKCJidWlsZCBkZXBlbmRlbmN5IGdyYXBoXG4iKTsKLQlyZXMgPSBpcGFfcm1fYWRkX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX09EVV9BREFQVF9QUk9ELAorCWlmICghaXBhX3BtX2lzX3VzZWQoKSkgeworCQkvKiBCdWlsZCBJUEEgUmVzb3VyY2UgbWFuYWdlciBkZXBlbmRlbmN5IGdyYXBoICovCisJCU9EVV9CUklER0VfREJHX0xPVygiYnVpbGQgZGVwZW5kZW5jeSBncmFwaFxuIik7CisJCXJlcyA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX1BST0QsCiAJCQkJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKLQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpIHsKLQkJT0RVX0JSSURHRV9FUlIoImlwYV9ybV9hZGRfZGVwZW5kZW5jeSgpIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbF9hZGRfZGVwZW5kZW5jeV8xOwotCX0KKwkJaWYgKHJlcyAmJiByZXMgIT0gLUVJTlBST0dSRVNTKSB7CisJCQlPRFVfQlJJREdFX0VSUigiaXBhX3JtX2FkZF9kZXBlbmRlbmN5KCkgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbF9hZGRfZGVwZW5kZW5jeV8xOworCQl9CiAKLQlyZXMgPSBpcGFfcm1fYWRkX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1E2X1BST0QsCisJCXJlcyA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKIAkJCQkJSVBBX1JNX1JFU09VUkNFX09EVV9BREFQVF9DT05TKTsKLQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpIHsKLQkJT0RVX0JSSURHRV9FUlIoImlwYV9ybV9hZGRfZGVwZW5kZW5jeSgpIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbF9hZGRfZGVwZW5kZW5jeV8yOworCQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJCU9EVV9CUklER0VfRVJSKCJpcGFfcm1fYWRkX2RlcGVuZGVuY3koKSBmYWlsZWRcbiIpOworCQkJZ290byBmYWlsX2FkZF9kZXBlbmRlbmN5XzI7CisJCX0KIAl9CiAKIAkvKiBjb25maWd1cmUgUlggKE9EVS0+SVBBKSBFUCAqLwpAQCAtMzQ2LDEwICszNTAsMTIgQEAKIAlpcGFfdGVhcmRvd25fc3lzX3BpcGUob2R1X2JyaWRnZV9jdHgtPm9kdV9wcm9kX2hkbCk7CiAJb2R1X2JyaWRnZV9jdHgtPm9kdV9wcm9kX2hkbCA9IDA7CiBmYWlsX29kdV9wcm9kOgotCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKKwlpZiAoIWlwYV9wbV9pc191c2VkKCkpCisJCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKIAkJCQlJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX0NPTlMpOwogZmFpbF9hZGRfZGVwZW5kZW5jeV8yOgotCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX1BST0QsCisJaWYgKCFpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX09EVV9BREFQVF9QUk9ELAogCQkJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKIGZhaWxfYWRkX2RlcGVuZGVuY3lfMToKIAlyZXR1cm4gcmVzOwpAQCAtMzk3LDE3ICs0MDMsMTkgQEAKIAkJT0RVX0JSSURHRV9FUlIoInRlYXJkb3duIE9EVSBFTUIgQ09OUyBmYWlsZWRcbiIpOwogCW9kdV9icmlkZ2VfY3R4LT5vZHVfZW1iX2NvbnNfaGRsID0gMDsKIAotCS8qIERlbGV0ZSBJUEEgUmVzb3VyY2UgbWFuYWdlciBkZXBlbmRlbmN5IGdyYXBoICovCi0JT0RVX0JSSURHRV9EQkcoImRlbGV0aW5nIGRlcGVuZGVuY3kgZ3JhcGhcbiIpOwotCXJlcyA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX1BST0QsCi0JCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKLQlpZiAocmVzICYmIHJlcyAhPSAtRUlOUFJPR1JFU1MpCi0JCU9EVV9CUklER0VfRVJSKCJpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koKSBmYWlsZWRcbiIpOworCWlmICghaXBhX3BtX2lzX3VzZWQoKSkgeworCQkvKiBEZWxldGUgSVBBIFJlc291cmNlIG1hbmFnZXIgZGVwZW5kZW5jeSBncmFwaCAqLworCQlPRFVfQlJJREdFX0RCRygiZGVsZXRpbmcgZGVwZW5kZW5jeSBncmFwaFxuIik7CisJCXJlcyA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX1BST0QsCisJCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7CisJCWlmIChyZXMgJiYgcmVzICE9IC1FSU5QUk9HUkVTUykKKwkJCU9EVV9CUklER0VfRVJSKCJpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koKSBmYWlsZWRcbiIpOwogCi0JcmVzID0gaXBhX3JtX2RlbGV0ZV9kZXBlbmRlbmN5KElQQV9STV9SRVNPVVJDRV9RNl9QUk9ELAotCQlJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX0NPTlMpOwotCWlmIChyZXMgJiYgcmVzICE9IC1FSU5QUk9HUkVTUykKLQkJT0RVX0JSSURHRV9FUlIoImlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeSgpIGZhaWxlZFxuIik7CisJCXJlcyA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKKwkJCUlQQV9STV9SRVNPVVJDRV9PRFVfQURBUFRfQ09OUyk7CisJCWlmIChyZXMgJiYgcmVzICE9IC1FSU5QUk9HUkVTUykKKwkJCU9EVV9CUklER0VfRVJSKCJpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koKSBmYWlsZWRcbiIpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTMxOSwyNCArMTMyNyw1OCBAQAogCXJldHVybiAwOwogfQogCi0vKiBJUEEgQnJpZGdlIEFQSSBpcyB0aGUgbmV3IEFQSSB3aGljaCB3aWxsIHJlcGxhY2VzIG9sZCBvZHVfYnJpZGdlIEFQSSAqLwotaW50IGlwYV9icmlkZ2VfaW5pdChzdHJ1Y3QgaXBhX2JyaWRnZV9pbml0X3BhcmFtcyAqcGFyYW1zLCB1MzIgKmhkbCkKK3N0YXRpYyB2b2lkIGlwYV9icl9wbV9jYih2b2lkICpwLCBlbnVtIGlwYV9wbV9jYl9ldmVudCBldmVudCkKK3sKKwlPRFVfQlJJREdFX0ZVTkNfRU5UUlkoKTsKKwlpZiAoZXZlbnQgIT0gSVBBX1BNX1JFUVVFU1RfV0FLRVVQKSB7CisJCU9EVV9CUklER0VfRVJSKCJVbmV4cGVjdGVkIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAob2R1X2JyaWRnZV9jdHgtPmlzX3N1c3BlbmRlZCkKKwkJb2R1X2JyaWRnZV9jdHgtPndha2V1cF9yZXF1ZXN0KG9kdV9icmlkZ2VfY3R4LT5wcml2KTsKKwlPRFVfQlJJREdFX0ZVTkNfRVhJVCgpOworfQorCitzdGF0aWMgaW50IGlwYV9icl9yZWdpc3Rlcl9wbSh2b2lkKQoreworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHJlZ19wYXJhbXM7CisJaW50IHJldDsKKworCW1lbXNldCgmcmVnX3BhcmFtcywgMCwgc2l6ZW9mKHJlZ19wYXJhbXMpKTsKKwlyZWdfcGFyYW1zLm5hbWUgPSAiT0RVIEJyaWRnZSI7CisJcmVnX3BhcmFtcy5jYWxsYmFjayA9IGlwYV9icl9wbV9jYjsKKwlyZWdfcGFyYW1zLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQ7CisKKwlyZXQgPSBpcGFfcG1fcmVnaXN0ZXIoJnJlZ19wYXJhbXMsCisJCSZvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwlpZiAocmV0KSB7CisJCU9EVV9CUklER0VfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIHdpdGggUE0gJWRcbiIsIHJldCk7CisJCWdvdG8gZmFpbF9wbV9yZWc7CisJfQorCisJcmV0ID0gaXBhX3BtX2Fzc29jaWF0ZV9pcGFfY29uc190b19jbGllbnQob2R1X2JyaWRnZV9jdHgtPnBtX2hkbCwKKwkJSVBBX0NMSUVOVF9PRFVfRU1CX0NPTlMpOworCWlmIChyZXQpIHsKKwkJT0RVX0JSSURHRV9FUlIoImZhaWwgdG8gYXNzb2NpYXRlIGNvbnMgd2l0aCBQTSAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsX3BtX2NvbnM7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfcG1fY29uczoKKwlpcGFfcG1fZGVyZWdpc3RlcihvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwlvZHVfYnJpZGdlX2N0eC0+cG1faGRsID0gfjA7CitmYWlsX3BtX3JlZzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlwYV9icl9jcmVhdGVfcm1fcmVzb3VyY2VzKHZvaWQpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXBhX3JtX2NyZWF0ZV9wYXJhbXMgY3JlYXRlX3BhcmFtczsKIAotCWlmICghcGFyYW1zIHx8ICFwYXJhbXMtPndha2V1cF9yZXF1ZXN0IHx8ICFoZGwpIHsKLQkJT0RVX0JSSURHRV9FUlIoIk5VTEwgYXJnXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0KLQlyZXQgPSBvZHVfYnJpZGdlX2luaXQoJnBhcmFtcy0+aW5mbyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW9kdV9icmlkZ2VfY3R4LT53YWtldXBfcmVxdWVzdCA9IHBhcmFtcy0+d2FrZXVwX3JlcXVlc3Q7Ci0KIAkvKiBjcmVhdGUgSVBBIFJNIHJlc291cmNlcyBmb3IgcG93ZXIgbWFuYWdlbWVudCAqLwogCWluaXRfY29tcGxldGlvbigmb2R1X2JyaWRnZV9jdHgtPnJtX2NvbXApOwogCW1lbXNldCgmY3JlYXRlX3BhcmFtcywgMCwgc2l6ZW9mKGNyZWF0ZV9wYXJhbXMpKTsKQEAgLTEzNjgsOSArMTQxMCw2IEBACiAJCWdvdG8gZmFpbF9ybV9jb25zOwogCX0KIAotCS8qIGhhbmRsZSBpcyBpZ25vcmVkIGZvciBub3cgKi8KLQkqaGRsID0gMDsKLQogCXJldHVybiAwOwogCiBmYWlsX3JtX2NvbnM6CkBAIC0xMzc5LDYgKzE0MTgsNDEgQEAKIGZhaWxfYWRkX2RlcDoKIAlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9PRFVfQURBUFRfUFJPRCk7CiBmYWlsX3JtX3Byb2Q6CisJcmV0dXJuIHJldDsKK30KKworLyogSVBBIEJyaWRnZSBBUEkgaXMgdGhlIG5ldyBBUEkgd2hpY2ggd2lsbCByZXBsYWNlcyBvbGQgb2R1X2JyaWRnZSBBUEkgKi8KK2ludCBpcGFfYnJpZGdlX2luaXQoc3RydWN0IGlwYV9icmlkZ2VfaW5pdF9wYXJhbXMgKnBhcmFtcywgdTMyICpoZGwpCit7CisJaW50IHJldDsKKworCWlmICghcGFyYW1zIHx8ICFwYXJhbXMtPndha2V1cF9yZXF1ZXN0IHx8ICFoZGwpIHsKKwkJT0RVX0JSSURHRV9FUlIoIk5VTEwgYXJnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwlyZXQgPSBvZHVfYnJpZGdlX2luaXQoJnBhcmFtcy0+aW5mbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW9kdV9icmlkZ2VfY3R4LT53YWtldXBfcmVxdWVzdCA9IHBhcmFtcy0+d2FrZXVwX3JlcXVlc3Q7CisKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmV0ID0gaXBhX2JyX3JlZ2lzdGVyX3BtKCk7CisJZWxzZQorCQlyZXQgPSBpcGFfYnJfY3JlYXRlX3JtX3Jlc291cmNlcygpOworCWlmIChyZXQpIHsKKwkJT0RVX0JSSURHRV9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgd290aCBSTS9QTSAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsX3BtOworCX0KKworCS8qIGhhbmRsZSBpcyBpZ25vcmVkIGZvciBub3cgKi8KKwkqaGRsID0gMDsKKworCXJldHVybiAwOworCitmYWlsX3BtOgogCW9kdV9icmlkZ2VfY2xlYW51cCgpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMzk4LDcgKzE0NzIsMTAgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0ID0gaXBhX2JyX3JlcXVlc3RfcHJvZCgpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXQgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwllbHNlCisJCXJldCA9IGlwYV9icl9yZXF1ZXN0X3Byb2QoKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNDExLDYgKzE0ODgsMTAgQEAKIAlzdHJ1Y3QgaXBhX3JtX3BlcmZfcHJvZmlsZSBwcm9maWxlID0gezB9OwogCWludCByZXQ7CiAKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmV0dXJuIGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKG9kdV9icmlkZ2VfY3R4LT5wbV9oZGwsCisJCQliYW5kd2lkdGgpOworCiAJcHJvZmlsZS5tYXhfc3VwcG9ydGVkX2JhbmR3aWR0aF9tYnBzID0gYmFuZHdpZHRoOwogCXJldCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9PRFVfQURBUFRfUFJPRCwgJnByb2ZpbGUpOwogCWlmIChyZXQpIHsKQEAgLTE0MzYsNyArMTUxNywxMCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpcGFfYnJfcmVsZWFzZV9wcm9kKCk7CisJaWYgKGlwYV9wbV9pc191c2VkKCkpCisJCXJldCA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMob2R1X2JyaWRnZV9jdHgtPnBtX2hkbCk7CisJZWxzZQorCQlyZXQgPSBpcGFfYnJfcmVsZWFzZV9wcm9kKCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTQ3MCw3ICsxNTU0LDEwIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gaXBhX2JyX3JlbGVhc2VfcHJvZCgpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXQgPSBpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKG9kdV9icmlkZ2VfY3R4LT5wbV9oZGwpOworCWVsc2UKKwkJcmV0ID0gaXBhX2JyX3JlbGVhc2VfcHJvZCgpOwogCWlmIChyZXQpIHsKIAkJT0RVX0JSSURHRV9FUlIoImZhaWxlZCB0byByZWxlYXNlIHByb2QgJWRcbiIsIHJldCk7CiAJCWlwYV9zdGFydF9nc2lfY2hhbm5lbChvZHVfYnJpZGdlX2N0eC0+b2R1X2VtYl9jb25zX2hkbCk7CkBAIC0xNTAxLDcgKzE1ODgsMTAgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JcmV0ID0gaXBhX2JyX3JlcXVlc3RfcHJvZCgpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXQgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwllbHNlCisJCXJldCA9IGlwYV9icl9yZXF1ZXN0X3Byb2QoKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNTIzLDEyICsxNjEzLDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwYV9icmlkZ2VfdHhfZHApOwogCi1pbnQgaXBhX2JyaWRnZV9jbGVhbnVwKHUzMiBoZGwpCitzdGF0aWMgdm9pZCBpcGFfYnJfZGVsZXRlX3JtX3Jlc291cmNlcyh2b2lkKQogewogCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfT0RVX0FEQVBUX1BST0QsCiAJCUlQQV9STV9SRVNPVVJDRV9BUFBTX0NPTlMpOwogCWlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX09EVV9BREFQVF9QUk9EKTsKIAlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9PRFVfQURBUFRfQ09OUyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwYV9icl9kZXJlZ2lzdGVyX3BtKHZvaWQpCit7CisJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwlpcGFfcG1fZGVyZWdpc3RlcihvZHVfYnJpZGdlX2N0eC0+cG1faGRsKTsKKwlvZHVfYnJpZGdlX2N0eC0+cG1faGRsID0gfjA7Cit9CisKK2ludCBpcGFfYnJpZGdlX2NsZWFudXAodTMyIGhkbCkKK3sKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJaXBhX2JyX2RlcmVnaXN0ZXJfcG0oKTsKKwllbHNlCisJCWlwYV9icl9kZWxldGVfcm1fcmVzb3VyY2VzKCk7CiAJcmV0dXJuIG9kdV9icmlkZ2VfY2xlYW51cCgpOwogfQogRVhQT1JUX1NZTUJPTChpcGFfYnJpZGdlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL3JuZGlzX2lwYS5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jbGllbnRzL3JuZGlzX2lwYS5jCmluZGV4IGY2MmNiMjcuLjFjNDdlNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY2xpZW50cy9ybmRpc19pcGEuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NsaWVudHMvcm5kaXNfaXBhLmMKQEAgLTksNyArOSw2IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC0yNyw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcm5kaXNfaXBhLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSAiLi4vaXBhX2NvbW1vbl9pLmgiCisjaW5jbHVkZSAiLi4vaXBhX3YzL2lwYV9wbS5oIgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJybmRpc19pcGFfdHJhY2UuaCIKQEAgLTE2MCw2ICsxNjEsNyBAQAogICogc3RhdGUgaXMgY2hhbmdlZCB0byBSTkRJU19JUEFfQ09OTkVDVEVEX0FORF9VUAogICogQHhtaXRfZXJyb3JfZGVsYXllZF93b3JrOiB3b3JrIGl0ZW0gZm9yIGNhc2VzIHdoZXJlIElQQSBkcml2ZXIgVHggZmFpbHMKICAqIEBzdGF0ZV9sb2NrOiB1c2VkIHRvIHByb3RlY3QgdGhlIHN0YXRlIHZhcmlhYmxlLgorICogQHBtX2hkbDogaGFuZGxlIGZvciBJUEEgUE0gZnJhbWV3b3JrCiAgKi8KIHN0cnVjdCBybmRpc19pcGFfZGV2IHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwpAQCAtMTg4LDYgKzE5MCw3IEBACiAJdm9pZCAoKmRldmljZV9yZWFkeV9ub3RpZnkpKHZvaWQpOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgeG1pdF9lcnJvcl9kZWxheWVkX3dvcms7CiAJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOyAvKiBTcGlubG9jayBmb3IgdGhlIHN0YXRlIHZhcmlhYmxlLiovCisJdTMyIHBtX2hkbDsKIH07CiAKIC8qKgpAQCAtMjMzLDYgKzIzNiw4IEBACiAJdW5zaWduZWQgbG9uZyBkYXRhKTsKIHN0YXRpYyBpbnQgcm5kaXNfaXBhX2NyZWF0ZV9ybV9yZXNvdXJjZShzdHJ1Y3Qgcm5kaXNfaXBhX2RldiAqcm5kaXNfaXBhX2N0eCk7CiBzdGF0aWMgaW50IHJuZGlzX2lwYV9kZXN0cm95X3JtX3Jlc291cmNlKHN0cnVjdCBybmRpc19pcGFfZGV2ICpybmRpc19pcGFfY3R4KTsKK3N0YXRpYyBpbnQgcm5kaXNfaXBhX3JlZ2lzdGVyX3BtX2NsaWVudChzdHJ1Y3Qgcm5kaXNfaXBhX2RldiAqcm5kaXNfaXBhX2N0eCk7CitzdGF0aWMgaW50IHJuZGlzX2lwYV9kZXJlZ2lzdGVyX3BtX2NsaWVudChzdHJ1Y3Qgcm5kaXNfaXBhX2RldiAqcm5kaXNfaXBhX2N0eCk7CiBzdGF0aWMgYm9vbCByeF9maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgYm9vbCB0eF9maWx0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgYm9vbCBybV9lbmFibGVkKHN0cnVjdCBybmRpc19pcGFfZGV2ICpybmRpc19pcGFfY3R4KTsKQEAgLTcwMSw3ICs3MDYsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmVzdWx0ID0gcm5kaXNfaXBhX2NyZWF0ZV9ybV9yZXNvdXJjZShybmRpc19pcGFfY3R4KTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcmVzdWx0ID0gcm5kaXNfaXBhX3JlZ2lzdGVyX3BtX2NsaWVudChybmRpc19pcGFfY3R4KTsKKwllbHNlCisJCXJlc3VsdCA9IHJuZGlzX2lwYV9jcmVhdGVfcm1fcmVzb3VyY2Uocm5kaXNfaXBhX2N0eCk7CiAJaWYgKHJlc3VsdCkgewogCQlSTkRJU19JUEFfRVJST1IoImZhaWwgb24gUk0gY3JlYXRlXG4iKTsKIAkJZ290byBmYWlsX2NyZWF0ZV9ybTsKQEAgLTc2Myw3ICs3NzEsMTAgQEAKIAlyZXR1cm4gMDsKIAogZmFpbDoKLQlybmRpc19pcGFfZGVzdHJveV9ybV9yZXNvdXJjZShybmRpc19pcGFfY3R4KTsKKwlpZiAoaXBhX3BtX2lzX3VzZWQoKSkKKwkJcm5kaXNfaXBhX2RlcmVnaXN0ZXJfcG1fY2xpZW50KHJuZGlzX2lwYV9jdHgpOworCWVsc2UKKwkJcm5kaXNfaXBhX2Rlc3Ryb3lfcm1fcmVzb3VyY2Uocm5kaXNfaXBhX2N0eCk7CiBmYWlsX2NyZWF0ZV9ybToKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMTIzNSw3ICsxMjQ2LDEwIEBACiAJcm5kaXNfaXBhX2N0eC0+bmV0LT5zdGF0cy50eF9kcm9wcGVkICs9IG91dHN0YW5kaW5nX2Ryb3BwZWRfcGt0czsKIAlhdG9taWNfc2V0KCZybmRpc19pcGFfY3R4LT5vdXRzdGFuZGluZ19wa3RzLCAwKTsKIAotCXJldHZhbCA9IHJuZGlzX2lwYV9kZXN0cm95X3JtX3Jlc291cmNlKHJuZGlzX2lwYV9jdHgpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXR2YWwgPSBybmRpc19pcGFfZGVyZWdpc3Rlcl9wbV9jbGllbnQocm5kaXNfaXBhX2N0eCk7CisJZWxzZQorCQlyZXR2YWwgPSBybmRpc19pcGFfZGVzdHJveV9ybV9yZXNvdXJjZShybmRpc19pcGFfY3R4KTsKIAlpZiAocmV0dmFsKSB7CiAJCVJORElTX0lQQV9FUlJPUigiRmFpbCB0byBjbGVhbiBSTVxuIik7CiAJCXJldHVybiByZXR2YWw7CkBAIC0xNzcyLDYgKzE3ODYsMjkgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBybmRpc19pcGFfcG1fY2Iodm9pZCAqcCwgZW51bSBpcGFfcG1fY2JfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IHJuZGlzX2lwYV9kZXYgKnJuZGlzX2lwYV9jdHggPSBwOworCisJUk5ESVNfSVBBX0xPR19FTlRSWSgpOworCisJaWYgKGV2ZW50ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCVJORElTX0lQQV9FUlJPUigidW5leHBlY3RlZCBldmVudCAlZFxuIiwgZXZlbnQpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCVJORElTX0lQQV9ERUJVRygiUmVzb3VyY2UgR3JhbnRlZFxuIik7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChybmRpc19pcGFfY3R4LT5uZXQpKSB7CisJCVJORElTX0lQQV9ERUJVRygic3RhcnRpbmcgcXVldWVcbiIpOworCQluZXRpZl9zdGFydF9xdWV1ZShybmRpc19pcGFfY3R4LT5uZXQpOworCX0gZWxzZSB7CisJCVJORElTX0lQQV9ERUJVRygicXVldWUgYWxyZWFkeSBhd2FrZVxuIik7CisJfQorCisJUk5ESVNfSVBBX0xPR19FWElUKCk7Cit9CisKIC8qKgogICogcm5kaXNfaXBhX2Rlc3Ryb3lfcm1fcmVzb3VyY2UoKSAtIGRlbGV0ZSB0aGUgZGVwZW5kZW5jeSBhbmQgZGVzdHJveQogICogdGhlIHJlc291cmNlIGRvbmUgb24gcm5kaXNfaXBhX2NyZWF0ZV9ybV9yZXNvdXJjZSgpCkBAIC0xODMxLDYgKzE4NjgsMzMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IHJuZGlzX2lwYV9yZWdpc3Rlcl9wbV9jbGllbnQoc3RydWN0IHJuZGlzX2lwYV9kZXYgKnJuZGlzX2lwYV9jdHgpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyBwbV9yZWc7CisKKwltZW1zZXQoJnBtX3JlZywgMCwgc2l6ZW9mKHBtX3JlZykpOworCisJcG1fcmVnLm5hbWUgPSBybmRpc19pcGFfY3R4LT5uZXQtPm5hbWU7CisJcG1fcmVnLnVzZXJfZGF0YSA9IHJuZGlzX2lwYV9jdHg7CisJcG1fcmVnLmNhbGxiYWNrID0gcm5kaXNfaXBhX3BtX2NiOworCXBtX3JlZy5ncm91cCA9IElQQV9QTV9HUk9VUF9BUFBTOworCXJlc3VsdCA9IGlwYV9wbV9yZWdpc3RlcigmcG1fcmVnLCAmcm5kaXNfaXBhX2N0eC0+cG1faGRsKTsKKwlpZiAocmVzdWx0KSB7CisJCVJORElTX0lQQV9FUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBJUEEgUE0gY2xpZW50ICVkXG4iLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBybmRpc19pcGFfZGVyZWdpc3Rlcl9wbV9jbGllbnQoc3RydWN0IHJuZGlzX2lwYV9kZXYgKnJuZGlzX2lwYV9jdHgpCit7CisJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhybmRpc19pcGFfY3R4LT5wbV9oZGwpOworCWlwYV9wbV9kZXJlZ2lzdGVyKHJuZGlzX2lwYV9jdHgtPnBtX2hkbCk7CisJcm5kaXNfaXBhX2N0eC0+cG1faGRsID0gfjA7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogcmVzb3VyY2VfcmVxdWVzdCgpIC0gcmVxdWVzdCBmb3IgdGhlIE5ldGRldiByZXNvdXJjZQogICogQHJuZGlzX2lwYV9jdHg6IG1haW4gZHJpdmVyIGNvbnRleHQKQEAgLTE4NDksMTEgKzE5MTMsMTQgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAogCWlmICghcm1fZW5hYmxlZChybmRpc19pcGFfY3R4KSkKLQkJZ290byBvdXQ7Ci0JcmVzdWx0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVxdWVzdF9yZXNvdXJjZSgKKwkJcmV0dXJuIHJlc3VsdDsKKworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlyZXR1cm4gaXBhX3BtX2FjdGl2YXRlKHJuZGlzX2lwYV9jdHgtPnBtX2hkbCk7CisKKwlyZXR1cm4gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVxdWVzdF9yZXNvdXJjZSgKIAkJCURSVl9SRVNPVVJDRV9JRCk7Ci1vdXQ6Ci0JcmV0dXJuIHJlc3VsdDsKKwogfQogCiAvKioKQEAgLTE4NjgsOSArMTkzNSwxMiBAQAogc3RhdGljIHZvaWQgcmVzb3VyY2VfcmVsZWFzZShzdHJ1Y3Qgcm5kaXNfaXBhX2RldiAqcm5kaXNfaXBhX2N0eCkKIHsKIAlpZiAoIXJtX2VuYWJsZWQocm5kaXNfaXBhX2N0eCkpCi0JCWdvdG8gb3V0OwotCWlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlbGVhc2VfcmVzb3VyY2UoRFJWX1JFU09VUkNFX0lEKTsKLW91dDoKKwkJcmV0dXJuOworCWlmIChpcGFfcG1faXNfdXNlZCgpKQorCQlpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShybmRpc19pcGFfY3R4LT5wbV9oZGwpOworCWVsc2UKKwkJaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVsZWFzZV9yZXNvdXJjZShEUlZfUkVTT1VSQ0VfSUQpOworCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NvbW1vbl9pLmggYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX2NvbW1vbl9pLmgKaW5kZXggMzJjOGIyNS4uYTQ4N2JmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV9jb21tb25faS5oCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfY29tbW9uX2kuaApAQCAtMzg2LDQgKzM4Niw2IEBACiBjb25zdCBjaGFyICppcGFfZ2V0X3ZlcnNpb25fc3RyaW5nKGVudW0gaXBhX2h3X3R5cGUgdmVyKTsKIGludCBpcGFfc3RhcnRfZ3NpX2NoYW5uZWwodTMyIGNsbnRfaGRsKTsKIAorYm9vbCBpcGFfcG1faXNfdXNlZCh2b2lkKTsKKwogI2VuZGlmIC8qIF9JUEFfQ09NTU9OX0lfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL2lwYS5jCmluZGV4IGJmZDA0NDYuLjYyMzAzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGEuYwpAQCAtNTMxLDExICs1MzEsMTIgQEAKIAlrZnJlZShidWZmKTsKIH0KIAotc3RhdGljIGludCBpcGFfc2VuZF93YW5fbXNnKHVuc2lnbmVkIGxvbmcgdXNyX3BhcmFtLCB1aW50OF90IG1zZ190eXBlKQorc3RhdGljIGludCBpcGFfc2VuZF93YW5fbXNnKHVuc2lnbmVkIGxvbmcgdXNyX3BhcmFtLCB1aW50OF90IG1zZ190eXBlLCBib29sIGlzX2NhY2hlKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IGlwYV93YW5fbXNnICp3YW5fbXNnOwogCXN0cnVjdCBpcGFfbXNnX21ldGEgbXNnX21ldGE7CisJc3RydWN0IGlwYV93YW5fbXNnIGNhY2hlX3dhbl9tc2c7CiAKIAl3YW5fbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwYV93YW5fbXNnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF3YW5fbXNnKSB7CkBAIC01NDksNiArNTUwLDggQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCisJbWVtY3B5KCZjYWNoZV93YW5fbXNnLCB3YW5fbXNnLCBzaXplb2YoY2FjaGVfd2FuX21zZykpOworCiAJbWVtc2V0KCZtc2dfbWV0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpcGFfbXNnX21ldGEpKTsKIAltc2dfbWV0YS5tc2dfdHlwZSA9IG1zZ190eXBlOwogCW1zZ19tZXRhLm1zZ19sZW4gPSBzaXplb2Yoc3RydWN0IGlwYV93YW5fbXNnKTsKQEAgLTU1OSw2ICs1NjIsMjUgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKKwlpZiAoaXNfY2FjaGUpIHsKKwkJbXV0ZXhfbG9jaygmaXBhX2N0eC0+aXBhX2NuZV9ldnRfbG9jayk7CisKKwkJLyogY2FjaGUgdGhlIGNuZSBldmVudCAqLworCQltZW1jcHkoJmlwYV9jdHgtPmlwYV9jbmVfZXZ0X3JlcV9jYWNoZVsKKwkJCWlwYV9jdHgtPm51bV9pcGFfY25lX2V2dF9yZXFdLndhbl9tc2csCisJCQkmY2FjaGVfd2FuX21zZywKKwkJCXNpemVvZihjYWNoZV93YW5fbXNnKSk7CisKKwkJbWVtY3B5KCZpcGFfY3R4LT5pcGFfY25lX2V2dF9yZXFfY2FjaGVbCisJCQlpcGFfY3R4LT5udW1faXBhX2NuZV9ldnRfcmVxXS5tc2dfbWV0YSwKKwkJCSZtc2dfbWV0YSwKKwkJCXNpemVvZihzdHJ1Y3QgaXBhX21zZ19tZXRhKSk7CisKKwkJaXBhX2N0eC0+bnVtX2lwYV9jbmVfZXZ0X3JlcSsrOworCQlpcGFfY3R4LT5udW1faXBhX2NuZV9ldnRfcmVxICU9IElQQV9NQVhfTlVNX1JFUV9DQUNIRTsKKwkJbXV0ZXhfdW5sb2NrKCZpcGFfY3R4LT5pcGFfY25lX2V2dF9sb2NrKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMyOCwyMSArMTM1MCwyMSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVBBX0lPQ19OT1RJRllfV0FOX1VQU1RSRUFNX1JPVVRFX0FERDoKLQkJcmV0dmFsID0gaXBhX3NlbmRfd2FuX21zZyhhcmcsIFdBTl9VUFNUUkVBTV9ST1VURV9BREQpOworCQlyZXR2YWwgPSBpcGFfc2VuZF93YW5fbXNnKGFyZywgV0FOX1VQU1RSRUFNX1JPVVRFX0FERCwgdHJ1ZSk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCUlQQUVSUigiaXBhX3NlbmRfd2FuX21zZyBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJUEFfSU9DX05PVElGWV9XQU5fVVBTVFJFQU1fUk9VVEVfREVMOgotCQlyZXR2YWwgPSBpcGFfc2VuZF93YW5fbXNnKGFyZywgV0FOX1VQU1RSRUFNX1JPVVRFX0RFTCk7CisJCXJldHZhbCA9IGlwYV9zZW5kX3dhbl9tc2coYXJnLCBXQU5fVVBTVFJFQU1fUk9VVEVfREVMLCB0cnVlKTsKIAkJaWYgKHJldHZhbCkgewogCQkJSVBBRVJSKCJpcGFfc2VuZF93YW5fbXNnIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIElQQV9JT0NfTk9USUZZX1dBTl9FTUJNU19DT05ORUNURUQ6Ci0JCXJldHZhbCA9IGlwYV9zZW5kX3dhbl9tc2coYXJnLCBXQU5fRU1CTVNfQ09OTkVDVCk7CisJCXJldHZhbCA9IGlwYV9zZW5kX3dhbl9tc2coYXJnLCBXQU5fRU1CTVNfQ09OTkVDVCwgZmFsc2UpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlJUEFFUlIoImlwYV9zZW5kX3dhbl9tc2cgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKIAkJCWJyZWFrOwpAQCAtNDE2OSw2ICs0MTkxLDcgQEAKIAogCW11dGV4X2luaXQoJmlwYV9jdHgtPmxvY2spOwogCW11dGV4X2luaXQoJmlwYV9jdHgtPm5hdF9tZW0ubG9jayk7CisJbXV0ZXhfaW5pdCgmaXBhX2N0eC0+aXBhX2NuZV9ldnRfbG9jayk7CiAKIAlpZHJfaW5pdCgmaXBhX2N0eC0+aXBhX2lkcik7CiAJc3Bpbl9sb2NrX2luaXQoJmlwYV9jdHgtPmlkcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX2RlYnVnZnMuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX2RlYnVnZnMuYwppbmRleCAyYjUxN2ExLi43YWE3ZmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL2lwYV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfZGVidWdmcy5jCkBAIC04MTEsMTAgKzgxMSwxMSBAQAogCQkJZXEgPSB0cnVlOwogCQl9IGVsc2UgewogCQkJcnRfdGJsID0gaXBhX2lkX2ZpbmQoZW50cnktPnJ1bGUucnRfdGJsX2hkbCk7Ci0JCQlpZiAocnRfdGJsKQotCQkJCXJ0X3RibF9pZHggPSBydF90YmwtPmlkeDsKKwkJCWlmIChydF90YmwgPT0gTlVMTCB8fAorCQkJCXJ0X3RibC0+Y29va2llICE9IElQQV9SVF9UQkxfQ09PS0lFKQorCQkJCXJ0X3RibF9pZHggPSAgfjA7CiAJCQllbHNlCi0JCQkJcnRfdGJsX2lkeCA9IH4wOworCQkJCXJ0X3RibF9pZHggPSBydF90YmwtPmlkeDsKIAkJCWJpdG1hcCA9IGVudHJ5LT5ydWxlLmF0dHJpYi5hdHRyaWJfbWFzazsKIAkJCWVxID0gZmFsc2U7CiAJCX0KQEAgLTg0MSwxMCArODQyLDExIEBACiAJCQkJZXEgPSB0cnVlOwogCQkJfSBlbHNlIHsKIAkJCQlydF90YmwgPSBpcGFfaWRfZmluZChlbnRyeS0+cnVsZS5ydF90YmxfaGRsKTsKLQkJCQlpZiAocnRfdGJsKQotCQkJCQlydF90YmxfaWR4ID0gcnRfdGJsLT5pZHg7Ci0JCQkJZWxzZQorCQkJCWlmIChydF90YmwgPT0gTlVMTCB8fAorCQkJCQlydF90YmwtPmNvb2tpZSAhPSBJUEFfUlRfVEJMX0NPT0tJRSkKIAkJCQkJcnRfdGJsX2lkeCA9IH4wOworCQkJCWVsc2UKKwkJCQkJcnRfdGJsX2lkeCA9IHJ0X3RibC0+aWR4OwogCQkJCWJpdG1hcCA9IGVudHJ5LT5ydWxlLmF0dHJpYi5hdHRyaWJfbWFzazsKIAkJCQllcSA9IGZhbHNlOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfaS5oIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfaS5oCmluZGV4IDE0MWJmZjEuLjliZmRjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX2kuaAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL2lwYV9pLmgKQEAgLTYzLDYgKzYzLDkgQEAKIAogI2RlZmluZSBJUEFfTUFYX1NUQVRVU19TVEFUX05VTSAzMAogCisKKyNkZWZpbmUgSVBBX01BWF9OVU1fUkVRX0NBQ0hFIDEwCisKICNkZWZpbmUgSVBBREJHKGZtdCwgYXJncy4uLikgXAogCXByX2RlYnVnKERSVl9OQU1FICIgJXM6JWQgIiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXywgIyMgYXJncykKICNkZWZpbmUgSVBBRVJSKGZtdCwgYXJncy4uLikgXApAQCAtOTY4LDYgKzk3MSwxMSBAQAogCWJvb2wgdXBsaW5rOwogfTsKIAorc3RydWN0IGlwYV9jbmVfZXZ0IHsKKwlzdHJ1Y3QgaXBhX3dhbl9tc2cgd2FuX21zZzsKKwlzdHJ1Y3QgaXBhX21zZ19tZXRhIG1zZ19tZXRhOworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgaXBhX2NvbnRleHQgLSBJUEEgY29udGV4dAogICogQGNsYXNzOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2xhc3MKQEAgLTExNjQsNiArMTE3Miw5IEBACiAJdTMyIGlwYV9yeF9taW5fdGltZW91dF91c2VjOwogCXUzMiBpcGFfcnhfbWF4X3RpbWVvdXRfdXNlYzsKIAl1MzIgaXBhX3BvbGxpbmdfaXRlcmF0aW9uOworCXN0cnVjdCBpcGFfY25lX2V2dCBpcGFfY25lX2V2dF9yZXFfY2FjaGVbSVBBX01BWF9OVU1fUkVRX0NBQ0hFXTsKKwlpbnQgbnVtX2lwYV9jbmVfZXZ0X3JlcTsKKwlzdHJ1Y3QgbXV0ZXggaXBhX2NuZV9ldnRfbG9jazsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfcW1pX3NlcnZpY2UuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX3FtaV9zZXJ2aWNlLmMKaW5kZXggNTdlMGE1My4uMjYwOGUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfcW1pX3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL2lwYV9xbWlfc2VydmljZS5jCkBAIC02NTUsOSArNjU1LDggQEAKIAogCS8qIGNoZWNrIGlmIHRoZSBmaWx0ZXIgcnVsZXMgZnJvbSBJUEFDTSBpcyB2YWxpZCAqLwogCWlmIChyZXEtPmZpbHRlcl9pbmRleF9saXN0X2xlbiA9PSAwKSB7Ci0JCUlQQVdBTkVSUigiIGRlbGV0ZSBVTCBmaWx0ZXIgcnVsZSBmb3IgcGlwZSAlZFxuIiwKKwkJSVBBV0FOREJHKCIgZGVsZXRlIFVMIGZpbHRlciBydWxlIGZvciBwaXBlICVkXG4iLAogCQlyZXEtPnNvdXJjZV9waXBlX2luZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIGlmIChyZXEtPmZpbHRlcl9pbmRleF9saXN0X2xlbiA+IFFNSV9JUEFfTUFYX0ZJTFRFUlNfVjAxKSB7CiAJCUlQQVdBTkVSUigiIFVMIGZpbHRlciBydWxlIGZvciBwaXBlICVkIGV4Y2VlZCBtYXggKCV1KVxuIiwKIAkJcmVxLT5zb3VyY2VfcGlwZV9pbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX3J0LmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL2lwYV9ydC5jCmluZGV4IDUwOTMwZDMuLmJhZGE1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvaXBhX3J0LmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9pcGFfcnQuYwpAQCAtNTMsNyArNTMsNyBAQAogCWludCBwaXBlX2lkeDsKIAogCWlmIChidWYgPT0gTlVMTCkgewotCQltZW1zZXQodG1wLCAwLCBJUEFfUlRfRkxUX0hXX1JVTEVfQlVGX1NJWkUpOworCQltZW1zZXQodG1wLCAwLCAoSVBBX1JUX0ZMVF9IV19SVUxFX0JVRl9TSVpFLzQpKTsKIAkJYnVmID0gKHU4ICopdG1wOwogCX0KIApAQCAtNzUsOCArNzUsMTUgQEAKIAlydWxlX2hkci0+dS5oZHIucGlwZV9kZXN0X2lkeCA9IHBpcGVfaWR4OwogCXJ1bGVfaGRyLT51Lmhkci5zeXN0ZW0gPSAhaXBhX2N0eC0+aGRyX3RibF9sY2w7CiAJaWYgKGVudHJ5LT5oZHIpIHsKLQkJcnVsZV9oZHItPnUuaGRyLmhkcl9vZmZzZXQgPQotCQkJZW50cnktPmhkci0+b2Zmc2V0X2VudHJ5LT5vZmZzZXQgPj4gMjsKKwkJaWYgKGVudHJ5LT5oZHItPmNvb2tpZSA9PSBJUEFfSERSX0NPT0tJRSkgeworCQkJcnVsZV9oZHItPnUuaGRyLmhkcl9vZmZzZXQgPQorCQkJCWVudHJ5LT5oZHItPm9mZnNldF9lbnRyeS0+b2Zmc2V0ID4+IDI7CisJCX0gZWxzZSB7CisJCQlJUEFFUlIoIkVudHJ5IGhkciBkZWxldGVkIGJ5IHVzZXIgPSAlZCBjb29raWUgPSAldVxuIiwKKwkJCQllbnRyeS0+aGRyLT51c2VyX2RlbGV0ZWQsIGVudHJ5LT5oZHItPmNvb2tpZSk7CisJCQlXQVJOX09OKDEpOworCQkJcnVsZV9oZHItPnUuaGRyLmhkcl9vZmZzZXQgPSAwOworCQl9CiAJfSBlbHNlIHsKIAkJcnVsZV9oZHItPnUuaGRyLmhkcl9vZmZzZXQgPSAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvcm1uZXRfaXBhLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YyL3JtbmV0X2lwYS5jCmluZGV4IDljNzUyMDIuLjJmMjcyZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjIvcm1uZXRfaXBhLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92Mi9ybW5ldF9pcGEuYwpAQCAtNDExLDEyICs0MTEsMTUgQEAKIHsKIAlpbnQgaSwgajsKIAorCS8qIHByZXZlbnQgbXVsdGktdGhyZWFkcyBhY2Nlc3NpbmcgbnVtX3E2X3J1bGUgKi8KKwltdXRleF9sb2NrKCZhZGRfbXV4X2NoYW5uZWxfbG9jayk7CiAJaWYgKHJ1bGVfcmVxLT5maWx0ZXJfc3BlY19saXN0X3ZhbGlkID09IHRydWUpIHsKIAkJbnVtX3E2X3J1bGUgPSBydWxlX3JlcS0+ZmlsdGVyX3NwZWNfbGlzdF9sZW47CiAJCUlQQVdBTkRCRygiUmVjZWl2ZWQgKCVkKSBpbnN0YWxsX2ZsdF9yZXFcbiIsIG51bV9xNl9ydWxlKTsKIAl9IGVsc2UgewogCQludW1fcTZfcnVsZSA9IDA7CiAJCUlQQVdBTkVSUigiZ290IG5vIFVMIHJ1bGVzIGZyb20gbW9kZW1cbiIpOworCQltdXRleF91bmxvY2soJmFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02MTAsOSArNjEzLDExIEBACiAJbnVtX3E2X3J1bGUgPSAwOwogCW1lbXNldChpcGFfcW1pX2N0eC0+cTZfdWxfZmlsdGVyX3J1bGUsIDAsCiAJCXNpemVvZihpcGFfcW1pX2N0eC0+cTZfdWxfZmlsdGVyX3J1bGUpKTsKKwltdXRleF91bmxvY2soJmFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAlyZXR1cm4gLUVJTlZBTDsKIAogc3VjY2VzczoKKwltdXRleF91bmxvY2soJmFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYyMSw5ICsxNjI2LDEyIEBACiAJCQkJLyogYWxyZWFkeSBnb3QgUTYgVUwgZmlsdGVyIHJ1bGVzKi8KIAkJCQlpZiAoaXBhX3FtaV9jdHggJiYKIAkJCQkJaXBhX3FtaV9jdHgtPm1vZGVtX2NmZ19lbWJfcGlwZV9mbHQKLQkJCQkJPT0gZmFsc2UpCisJCQkJCT09IGZhbHNlKSB7CisJCQkJCS8qIHByb3RlY3QgbnVtX3E2X3J1bGUgKi8KKwkJCQkJbXV0ZXhfbG9jaygmYWRkX211eF9jaGFubmVsX2xvY2spOwogCQkJCQlyYyA9IHd3YW5fYWRkX3VsX2ZsdF9ydWxlX3RvX2lwYSgpOwotCQkJCWVsc2UKKwkJCQkJbXV0ZXhfdW5sb2NrKCZhZGRfbXV4X2NoYW5uZWxfbG9jayk7CisJCQkJfSBlbHNlCiAJCQkJCXJjID0gMDsKIAkJCQllZ3Jlc3Nfc2V0ID0gdHJ1ZTsKIAkJCQlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL01ha2VmaWxlIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9NYWtlZmlsZQppbmRleCBlM2Y4ZDQ1Li41ZGIyNTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvTWFrZWZpbGUKQEAgLTQsNiArNCw2IEBACiBpcGF0LXkgOj0gaXBhLm8gaXBhX2RlYnVnZnMubyBpcGFfaGRyLm8gaXBhX2ZsdC5vIGlwYV9ydC5vIGlwYV9kcC5vIGlwYV9jbGllbnQubyBcCiAJaXBhX3V0aWxzLm8gaXBhX25hdC5vIGlwYV9pbnRmLm8gdGV0aF9icmlkZ2UubyBpcGFfaW50ZXJydXB0cy5vIFwKIAlpcGFfdWMubyBpcGFfdWNfd2RpLm8gaXBhX2RtYS5vIGlwYV91Y19taGkubyBpcGFfbWhpLm8gaXBhX3VjX250bi5vIFwKLQlpcGFfaHdfc3RhdHMubworCWlwYV9od19zdGF0cy5vIGlwYV9wbS5vCiAKIG9iai0kKENPTkZJR19STU5FVF9JUEEzKSArPSBybW5ldF9pcGEubyBpcGFfcW1pX3NlcnZpY2VfdjAxLm8gaXBhX3FtaV9zZXJ2aWNlLm8gcm1uZXRfaXBhX2ZkX2lvY3RsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYS5jCmluZGV4IGQxNzY2ZGQuLmU5ZGY5ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGEuYwpAQCAtODgsNiArODgsMTAgQEAKIAogI2RlZmluZSBJUEFfU01FTV9TSVpFICg4ICogMTAyNCkKIAorI2RlZmluZSBJUEFfR1NJX0NIQU5ORUxfSEFMVF9NSU5fU0xFRVAgNTAwMAorI2RlZmluZSBJUEFfR1NJX0NIQU5ORUxfSEFMVF9NQVhfU0xFRVAgMTAwMDAKKyNkZWZpbmUgSVBBX0dTSV9DSEFOTkVMX0hBTFRfTUFYX1RSWSAxMAorCiAvKiByb3VuZCBhZGRyZXNzZXMgZm9yIGNsb3NlcyBwYWdlIHBlciBTTU1VIHJlcXVpcmVtZW50cyAqLwogI2RlZmluZSBJUEFfU01NVV9ST1VORF9UT19QQUdFKGlvdmEsIHBhLCBzaXplLCBpb3ZhX3AsIHBhX3AsIHNpemVfcCkgXAogCWRvIHsgXApAQCAtNTM2LDExICs1NDAsMTIgQEAKIAlrZnJlZShidWZmKTsKIH0KIAotc3RhdGljIGludCBpcGEzX3NlbmRfd2FuX21zZyh1bnNpZ25lZCBsb25nIHVzcl9wYXJhbSwgdWludDhfdCBtc2dfdHlwZSkKK3N0YXRpYyBpbnQgaXBhM19zZW5kX3dhbl9tc2codW5zaWduZWQgbG9uZyB1c3JfcGFyYW0sIHVpbnQ4X3QgbXNnX3R5cGUsIGJvb2wgaXNfY2FjaGUpCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgaXBhX3dhbl9tc2cgKndhbl9tc2c7CiAJc3RydWN0IGlwYV9tc2dfbWV0YSBtc2dfbWV0YTsKKwlzdHJ1Y3QgaXBhX3dhbl9tc2cgY2FjaGVfd2FuX21zZzsKIAogCXdhbl9tc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBhX3dhbl9tc2cpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXdhbl9tc2cpIHsKQEAgLTU1NCw2ICs1NTksOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwltZW1jcHkoJmNhY2hlX3dhbl9tc2csIHdhbl9tc2csIHNpemVvZihjYWNoZV93YW5fbXNnKSk7CisKIAltZW1zZXQoJm1zZ19tZXRhLCAwLCBzaXplb2Yoc3RydWN0IGlwYV9tc2dfbWV0YSkpOwogCW1zZ19tZXRhLm1zZ190eXBlID0gbXNnX3R5cGU7CiAJbXNnX21ldGEubXNnX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXBhX3dhbl9tc2cpOwpAQCAtNTY0LDYgKzU3MSwyNSBAQAogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAorCWlmIChpc19jYWNoZSkgeworCQltdXRleF9sb2NrKCZpcGEzX2N0eC0+aXBhX2NuZV9ldnRfbG9jayk7CisKKwkJLyogY2FjaGUgdGhlIGNuZSBldmVudCAqLworCQltZW1jcHkoJmlwYTNfY3R4LT5pcGFfY25lX2V2dF9yZXFfY2FjaGVbCisJCQlpcGEzX2N0eC0+bnVtX2lwYV9jbmVfZXZ0X3JlcV0ud2FuX21zZywKKwkJCSZjYWNoZV93YW5fbXNnLAorCQkJc2l6ZW9mKGNhY2hlX3dhbl9tc2cpKTsKKworCQltZW1jcHkoJmlwYTNfY3R4LT5pcGFfY25lX2V2dF9yZXFfY2FjaGVbCisJCQlpcGEzX2N0eC0+bnVtX2lwYV9jbmVfZXZ0X3JlcV0ubXNnX21ldGEsCisJCQkmbXNnX21ldGEsCisJCQlzaXplb2Yoc3RydWN0IGlwYV9tc2dfbWV0YSkpOworCisJCWlwYTNfY3R4LT5udW1faXBhX2NuZV9ldnRfcmVxKys7CisJCWlwYTNfY3R4LT5udW1faXBhX2NuZV9ldnRfcmVxICU9IElQQV9NQVhfTlVNX1JFUV9DQUNIRTsKKwkJbXV0ZXhfdW5sb2NrKCZpcGEzX2N0eC0+aXBhX2NuZV9ldnRfbG9jayk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NDMsNiArMTQ2OSwxMCBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVBBX0lPQ19STV9BRERfREVQRU5ERU5DWToKKwkJLyogZGVwcmVjYXRlIGlmIElQQSBQTSBpcyB1c2VkICovCisJCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJCXJldHVybiAwOworCiAJCWlmIChjb3B5X2Zyb21fdXNlcigodTggKikmcm1fZGVwZW5kLCAodTggKilhcmcsCiAJCQkJc2l6ZW9mKHN0cnVjdCBpcGFfaW9jX3JtX2RlcGVuZGVuY3kpKSkgewogCQkJcmV0dmFsID0gLUVGQVVMVDsKQEAgLTE0NTIsNiArMTQ4MiwxMCBAQAogCQkJcm1fZGVwZW5kLnJlc291cmNlX25hbWUsIHJtX2RlcGVuZC5kZXBlbmRzX29uX25hbWUpOwogCQlicmVhazsKIAljYXNlIElQQV9JT0NfUk1fREVMX0RFUEVOREVOQ1k6CisJCS8qIGRlcHJlY2F0ZSBpZiBJUEEgUE0gaXMgdXNlZCAqLworCQlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCQlyZXR1cm4gMDsKKwogCQlpZiAoY29weV9mcm9tX3VzZXIoKHU4ICopJnJtX2RlcGVuZCwgKHU4ICopYXJnLAogCQkJCXNpemVvZihzdHJ1Y3QgaXBhX2lvY19ybV9kZXBlbmRlbmN5KSkpIHsKIAkJCXJldHZhbCA9IC1FRkFVTFQ7CkBAIC0xNTIwLDIxICsxNTU0LDIxIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJUEFfSU9DX05PVElGWV9XQU5fVVBTVFJFQU1fUk9VVEVfQUREOgotCQlyZXR2YWwgPSBpcGEzX3NlbmRfd2FuX21zZyhhcmcsIFdBTl9VUFNUUkVBTV9ST1VURV9BREQpOworCQlyZXR2YWwgPSBpcGEzX3NlbmRfd2FuX21zZyhhcmcsIFdBTl9VUFNUUkVBTV9ST1VURV9BREQsIHRydWUpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlJUEFFUlIoImlwYTNfc2VuZF93YW5fbXNnIGZhaWxlZDogJWRcbiIsIHJldHZhbCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIElQQV9JT0NfTk9USUZZX1dBTl9VUFNUUkVBTV9ST1VURV9ERUw6Ci0JCXJldHZhbCA9IGlwYTNfc2VuZF93YW5fbXNnKGFyZywgV0FOX1VQU1RSRUFNX1JPVVRFX0RFTCk7CisJCXJldHZhbCA9IGlwYTNfc2VuZF93YW5fbXNnKGFyZywgV0FOX1VQU1RSRUFNX1JPVVRFX0RFTCwgdHJ1ZSk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCUlQQUVSUigiaXBhM19zZW5kX3dhbl9tc2cgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVBBX0lPQ19OT1RJRllfV0FOX0VNQk1TX0NPTk5FQ1RFRDoKLQkJcmV0dmFsID0gaXBhM19zZW5kX3dhbl9tc2coYXJnLCBXQU5fRU1CTVNfQ09OTkVDVCk7CisJCXJldHZhbCA9IGlwYTNfc2VuZF93YW5fbXNnKGFyZywgV0FOX0VNQk1TX0NPTk5FQ1QsIGZhbHNlKTsKIAkJaWYgKHJldHZhbCkgewogCQkJSVBBRVJSKCJpcGEzX3NlbmRfd2FuX21zZyBmYWlsZWQ6ICVkXG4iLCByZXR2YWwpOwogCQkJYnJlYWs7CkBAIC0xOTY5LDYgKzIwMDMsNyBAQAogCWludCBlcF9pZHg7CiAJaW50IGNsaWVudF9pZHg7CiAJY29uc3Qgc3RydWN0IGlwYV9nc2lfZXBfY29uZmlnICpnc2lfZXBfY2ZnOworCWludCBpOwogCWludCByZXQ7CiAJaW50IGNvZGUgPSAwOwogCkBAIC0xOTg4LDYgKzIwMjMsMTkgQEAKIAkJCXJldCA9IGdzaV9oYWx0X2NoYW5uZWxfZWUoCiAJCQkJZ3NpX2VwX2NmZy0+aXBhX2dzaV9jaGFuX251bSwgZ3NpX2VwX2NmZy0+ZWUsCiAJCQkJJmNvZGUpOworCQkJZm9yIChpID0gMDsgaSA8IElQQV9HU0lfQ0hBTk5FTF9TVE9QX01BWF9SRVRSWSAmJgorCQkJCXJldCA9PSAtR1NJX1NUQVRVU19BR0FJTjsgaSsrKSB7CisJCQkJSVBBREJHKAorCQkJCSJjaCAlZCBlZSAlZCB3aXRoIGNvZGUgJWRcbiBpcyBidXN5IHRyeSBhZ2FpbiIsCisJCQkJCWdzaV9lcF9jZmctPmlwYV9nc2lfY2hhbl9udW0sCisJCQkJCWdzaV9lcF9jZmctPmVlLAorCQkJCQljb2RlKTsKKwkJCQl1c2xlZXBfcmFuZ2UoSVBBX0dTSV9DSEFOTkVMX0hBTFRfTUlOX1NMRUVQLAorCQkJCQlJUEFfR1NJX0NIQU5ORUxfSEFMVF9NQVhfU0xFRVApOworCQkJCXJldCA9IGdzaV9oYWx0X2NoYW5uZWxfZWUoCisJCQkJCWdzaV9lcF9jZmctPmlwYV9nc2lfY2hhbl9udW0sCisJCQkJCWdzaV9lcF9jZmctPmVlLCAmY29kZSk7CisJCQl9CiAJCQlpZiAocmV0ID09IEdTSV9TVEFUVVNfU1VDQ0VTUykKIAkJCQlJUEFEQkcoImhhbHRlZCBnc2kgY2ggJWQgZWUgJWQgd2l0aCBjb2RlICVkXG4iLAogCQkJCWdzaV9lcF9jZmctPmlwYV9nc2lfY2hhbl9udW0sCkBAIC0yMzEzLDcgKzIzNjEsNiBAQAogCXN0cnVjdCBpcGFoYWxfaW1tX2NtZF9yZWdpc3Rlcl93cml0ZSByZWdfd3JpdGU7CiAJc3RydWN0IGlwYWhhbF9pbW1fY21kX3B5bGQgKmNtZF9weWxkOwogCWludCByZXR2YWw7Ci0Jc3RydWN0IGlwYWhhbF9yZWdfdmFsbWFzayB2YWxtYXNrOwogCiAJZGVzYyA9IGtjYWxsb2MoaXBhM19jdHgtPmlwYV9udW1fcGlwZXMsIHNpemVvZihzdHJ1Y3QgaXBhM19kZXNjKSwKIAkJCUdGUF9LRVJORUwpOwpAQCAtMjMyOCwzOSArMjM3NSwxMCBAQAogCQlpZiAoZXBfaWR4ID09IC0xKQogCQkJY29udGludWU7CiAKLQkJaWYgKGlwYTNfY3R4LT5lcFtlcF9pZHhdLnZhbGlkICYmCi0JCQlpcGEzX2N0eC0+ZXBbZXBfaWR4XS5za2lwX2VwX2NmZykgewotCQkJQlVHX09OKG51bV9kZXNjcyA+PSBpcGEzX2N0eC0+aXBhX251bV9waXBlcyk7Ci0KLQkJCXJlZ193cml0ZS5za2lwX3BpcGVsaW5lX2NsZWFyID0gZmFsc2U7Ci0JCQlyZWdfd3JpdGUucGlwZWxpbmVfY2xlYXJfb3B0aW9ucyA9Ci0JCQkJSVBBSEFMX0hQU19DTEVBUjsKLQkJCXJlZ193cml0ZS5vZmZzZXQgPQotCQkJCWlwYWhhbF9nZXRfcmVnX25fb2ZzdChJUEFfRU5EUF9TVEFUVVNfbiwKLQkJCQkJZXBfaWR4KTsKLQkJCWlwYWhhbF9nZXRfc3RhdHVzX2VwX3ZhbG1hc2soCi0JCQkJaXBhM19nZXRfZXBfbWFwcGluZyhJUEFfQ0xJRU5UX0FQUFNfTEFOX0NPTlMpLAotCQkJCSZ2YWxtYXNrKTsKLQkJCXJlZ193cml0ZS52YWx1ZSA9IHZhbG1hc2sudmFsOwotCQkJcmVnX3dyaXRlLnZhbHVlX21hc2sgPSB2YWxtYXNrLm1hc2s7Ci0JCQljbWRfcHlsZCA9IGlwYWhhbF9jb25zdHJ1Y3RfaW1tX2NtZCgKLQkJCQlJUEFfSU1NX0NNRF9SRUdJU1RFUl9XUklURSwgJnJlZ193cml0ZSwgZmFsc2UpOwotCQkJaWYgKCFjbWRfcHlsZCkgewotCQkJCUlQQUVSUigiZmFpbCBjb25zdHJ1Y3QgcmVnaXN0ZXJfd3JpdGUgY21kXG4iKTsKLQkJCQlCVUcoKTsKLQkJCX0KLQotCQkJZGVzY1tudW1fZGVzY3NdLm9wY29kZSA9IGNtZF9weWxkLT5vcGNvZGU7Ci0JCQlkZXNjW251bV9kZXNjc10udHlwZSA9IElQQV9JTU1fQ01EX0RFU0M7Ci0JCQlkZXNjW251bV9kZXNjc10uY2FsbGJhY2sgPSBpcGEzX2Rlc3Ryb3lfaW1tOwotCQkJZGVzY1tudW1fZGVzY3NdLnVzZXIxID0gY21kX3B5bGQ7Ci0JCQlkZXNjW251bV9kZXNjc10ucHlsZCA9IGNtZF9weWxkLT5kYXRhOwotCQkJZGVzY1tudW1fZGVzY3NdLmxlbiA9IGNtZF9weWxkLT5sZW47Ci0JCQludW1fZGVzY3MrKzsKLQkJfQotCi0JCS8qIGRpc2FibGUgc3RhdHVzZXMgZm9yIG1vZGVtIHByb2R1Y2VycyAqLwotCQlpZiAoSVBBX0NMSUVOVF9JU19RNl9QUk9EKGNsaWVudF9pZHgpKSB7CisJCS8qIGRpc2FibGUgc3RhdHVzZXMgZm9yIGFsbCBtb2RlbSBjb250cm9sbGVkIHByb2QgcGlwZXMgKi8KKwkJaWYgKElQQV9DTElFTlRfSVNfUTZfUFJPRChjbGllbnRfaWR4KSB8fAorCQkJKGlwYTNfY3R4LT5lcFtlcF9pZHhdLnZhbGlkICYmCisJCQlpcGEzX2N0eC0+ZXBbZXBfaWR4XS5za2lwX2VwX2NmZykpIHsKIAkJCWlwYV9hc3NlcnRfb24obnVtX2Rlc2NzID49IGlwYTNfY3R4LT5pcGFfbnVtX3BpcGVzKTsKIAogCQkJcmVnX3dyaXRlLnNraXBfcGlwZWxpbmVfY2xlYXIgPSBmYWxzZTsKQEAgLTMyOTQsMjEgKzMzMTIsMjAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaWR4ID0gMTsKIAotCWlmIChpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUgPT0gaXBhM19jdHgtPmN0cmwtPmlwYV9jbGtfcmF0ZV9zdnMpIHsKKwlpZiAoaXBhM19jdHgtPmN1cnJfaXBhX2Nsa19yYXRlID09IGlwYTNfY3R4LT5jdHJsLT5pcGFfY2xrX3JhdGVfc3ZzMikgewogCQlpZHggPSAxOwogCX0gZWxzZSBpZiAoaXBhM19jdHgtPmN1cnJfaXBhX2Nsa19yYXRlID09Ci0JCQlpcGEzX2N0eC0+Y3RybC0+aXBhX2Nsa19yYXRlX25vbWluYWwpIHsKLQkJaWYgKGlwYTNfY3R4LT5jdHJsLT5tc21fYnVzX2RhdGFfcHRyLT5udW1fdXNlY2FzZXMgPD0gMikKLQkJCWlkeCA9IDE7Ci0JCWVsc2UKLQkJCWlkeCA9IDI7CisJCWlwYTNfY3R4LT5jdHJsLT5pcGFfY2xrX3JhdGVfc3ZzKSB7CisJCWlkeCA9IDI7CisJfSBlbHNlIGlmIChpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUgPT0KKwkJaXBhM19jdHgtPmN0cmwtPmlwYV9jbGtfcmF0ZV9ub21pbmFsKSB7CisJCWlkeCA9IDM7CiAJfSBlbHNlIGlmIChpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUgPT0KIAkJCWlwYTNfY3R4LT5jdHJsLT5pcGFfY2xrX3JhdGVfdHVyYm8pIHsKIAkJaWR4ID0gaXBhM19jdHgtPmN0cmwtPm1zbV9idXNfZGF0YV9wdHItPm51bV91c2VjYXNlcyAtIDE7CiAJfSBlbHNlIHsKIAkJV0FSTl9PTigxKTsKIAl9Ci0KIAlJUEFEQkcoImN1cnIgJWQgaWR4ICVkXG4iLCBpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUsIGlkeCk7CiAKIAlyZXR1cm4gaWR4OwpAQCAtMzY3Niw2ICszNjkzLDUzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBhM19jdHgtPndha2Vsb2NrX3JlZl9jbnQuc3BpbmxvY2ssIGZsYWdzKTsKIH0KIAoraW50IGlwYTNfc2V0X2Nsb2NrX3BsYW5fZnJvbV9wbShpbnQgaWR4KQoreworCXUzMiBjbGtfcmF0ZTsKKworCUlQQURCR19MT1coImlkeCA9ICVkXG4iLCBpZHgpOworCisJaWYgKGlkeCA8PSAwIHx8IGlkeCA+PSBpcGEzX2N0eC0+Y3RybC0+bXNtX2J1c19kYXRhX3B0ci0+bnVtX3VzZWNhc2VzKSB7CisJCUlQQUVSUigiYmFkIHZvbHRhZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaWR4ID09IDEpCisJCWNsa19yYXRlID0gaXBhM19jdHgtPmN0cmwtPmlwYV9jbGtfcmF0ZV9zdnM7CisJZWxzZSBpZiAoaWR4ID09IDIpCisJCWNsa19yYXRlID0gaXBhM19jdHgtPmN0cmwtPmlwYV9jbGtfcmF0ZV9ub21pbmFsOworCWVsc2UgaWYgKGlkeCA9PSAzKQorCQljbGtfcmF0ZSA9IGlwYTNfY3R4LT5jdHJsLT5pcGFfY2xrX3JhdGVfdHVyYm87CisJZWxzZSB7CisJCUlQQUVSUigiYmFkIHZvbHRhZ2VcbiIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY2xrX3JhdGUgPT0gaXBhM19jdHgtPmN1cnJfaXBhX2Nsa19yYXRlKSB7CisJCUlQQURCR19MT1coIlNhbWUgdm9sdGFnZVxuIik7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLm11dGV4KTsKKwlpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUgPSBjbGtfcmF0ZTsKKwlpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHggPSBpZHg7CisJSVBBREJHX0xPVygic2V0dGluZyBjbG9jayByYXRlIHRvICV1XG4iLCBpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUpOworCWlmIChhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KSA+IDApIHsKKwkJaWYgKGlwYTNfY2xrKQorCQkJY2xrX3NldF9yYXRlKGlwYTNfY2xrLCBpcGEzX2N0eC0+Y3Vycl9pcGFfY2xrX3JhdGUpOworCQlpZiAobXNtX2J1c19zY2FsZV9jbGllbnRfdXBkYXRlX3JlcXVlc3QoaXBhM19jdHgtPmlwYV9idXNfaGRsLAorCQkJCWlwYTNfZ2V0X2J1c192b3RlKCkpKQorCQkJV0FSTl9PTigxKTsKKwl9IGVsc2UgeworCQlJUEFEQkdfTE9XKCJjbG9ja3MgYXJlIGdhdGVkLCBub3Qgc2V0dGluZyByYXRlXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5tdXRleCk7CisJSVBBREJHX0xPVygiRG9uZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGlwYTNfc2V0X3JlcXVpcmVkX3BlcmZfcHJvZmlsZShlbnVtIGlwYV92b2x0YWdlX2xldmVsIGZsb29yX3ZvbHRhZ2UsCiAJCQkJICB1MzIgYmFuZHdpZHRoX21icHMpCiB7CkBAIC0zNjk5LDggKzM3NjMsMTEgQEAKIAkJZWxzZSBpZiAoYmFuZHdpZHRoX21icHMgPj0KIAkJCWlwYTNfY3R4LT5jdHJsLT5jbG9ja19zY2FsaW5nX2J3X3RocmVzaG9sZF9ub21pbmFsKQogCQkJbmVlZGVkX3ZvbHRhZ2UgPSBJUEFfVk9MVEFHRV9OT01JTkFMOwotCQllbHNlCisJCWVsc2UgaWYgKGJhbmR3aWR0aF9tYnBzID49CisJCQlpcGEzX2N0eC0+Y3RybC0+Y2xvY2tfc2NhbGluZ19id190aHJlc2hvbGRfc3ZzKQogCQkJbmVlZGVkX3ZvbHRhZ2UgPSBJUEFfVk9MVEFHRV9TVlM7CisJCWVsc2UKKwkJCW5lZWRlZF92b2x0YWdlID0gSVBBX1ZPTFRBR0VfU1ZTMjsKIAl9IGVsc2UgewogCQlJUEFEQkdfTE9XKCJDbG9jayBzY2FsaW5nIGlzIGRpc2FibGVkXG4iKTsKIAkJbmVlZGVkX3ZvbHRhZ2UgPSBJUEFfVk9MVEFHRV9OT01JTkFMOwpAQCAtMzcwOCw2ICszNzc1LDkgQEAKIAogCW5lZWRlZF92b2x0YWdlID0gbWF4KG5lZWRlZF92b2x0YWdlLCBmbG9vcl92b2x0YWdlKTsKIAlzd2l0Y2ggKG5lZWRlZF92b2x0YWdlKSB7CisJY2FzZSBJUEFfVk9MVEFHRV9TVlMyOgorCQljbGtfcmF0ZSA9IGlwYTNfY3R4LT5jdHJsLT5pcGFfY2xrX3JhdGVfc3ZzMjsKKwkJYnJlYWs7CiAJY2FzZSBJUEFfVk9MVEFHRV9TVlM6CiAJCWNsa19yYXRlID0gaXBhM19jdHgtPmN0cmwtPmlwYV9jbGtfcmF0ZV9zdnM7CiAJCWJyZWFrOwpAQCAtMzc3MiwxNCArMzg0MiwxOSBAQAogCXUzMiBpID0gMDsKIAlpbnQgcmVzOwogCXN0cnVjdCBpcGFfZXBfY2ZnX2hvbGIgaG9sYl9jZmc7CisJdTMyIHBpcGVfYml0bWFzayA9IDA7CiAKIAlJUEFEQkcoImludGVycnVwdD0lZCwgaW50ZXJydXB0X2RhdGE9JXVcbiIsCiAJCWludGVycnVwdCwgc3VzcGVuZF9kYXRhKTsKIAltZW1zZXQoJmhvbGJfY2ZnLCAwLCBzaXplb2YoaG9sYl9jZmcpKTsKIAlob2xiX2NmZy50bXJfdmFsID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBpcGEzX2N0eC0+aXBhX251bV9waXBlczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGlwYTNfY3R4LT5pcGFfbnVtX3BpcGVzOyBpKyssIGJtc2sgPSBibXNrIDw8IDEpIHsKIAkJaWYgKChzdXNwZW5kX2RhdGEgJiBibXNrKSAmJiAoaXBhM19jdHgtPmVwW2ldLnZhbGlkKSkgeworCQkJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKSB7CisJCQkJcGlwZV9iaXRtYXNrIHw9IGJtc2s7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAoSVBBX0NMSUVOVF9JU19BUFBTX0NPTlMoaXBhM19jdHgtPmVwW2ldLmNsaWVudCkpIHsKIAkJCQkvKgogCQkJCSAqIHBpcGUgd2lsbCBiZSB1bnN1c3BlbmRlZCBhcyBwYXJ0IG9mCkBAIC0zODE4LDcgKzM4OTMsMTMgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJYm1zayA9IGJtc2sgPDwgMTsKKwl9CisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKSB7CisJCXJlcyA9IGlwYV9wbV9oYW5kbGVfc3VzcGVuZChwaXBlX2JpdG1hc2spOworCQlpZiAocmVzKSB7CisJCQlJUEFFUlIoImlwYV9wbV9oYW5kbGVfc3VzcGVuZCBmYWlsZWQgJWRcbiIsIHJlcyk7CisJCQlyZXR1cm47CisJCX0KIAl9CiB9CiAKQEAgLTQzNDksNiArNDQzMCw4IEBACiAJaWYgKElTX0VSUl9PUl9OVUxMKHN1YnN5c3RlbV9nZXRfcmV0dmFsKSkgewogCQlJUEFFUlIoIlVuYWJsZSB0byB0cmlnZ2VyIFBJTCBwcm9jZXNzIGZvciBGVyBsb2FkaW5nXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJc3Vic3lzdGVtX3B1dChzdWJzeXN0ZW1fZ2V0X3JldHZhbCk7CiAJfQogCiAJSVBBREJHKCJQSUwgRlcgbG9hZGluZyBwcm9jZXNzIGlzIGNvbXBsZXRlXG4iKTsKQEAgLTQ1NzksNiArNDY2Miw3IEBACiAJaXBhM19jdHgtPmVlID0gcmVzb3VyY2VfcC0+ZWU7CiAJaXBhM19jdHgtPmFwcGx5X3JnMTBfd2EgPSByZXNvdXJjZV9wLT5hcHBseV9yZzEwX3dhOwogCWlwYTNfY3R4LT5nc2lfY2gyMF93YSA9IHJlc291cmNlX3AtPmdzaV9jaDIwX3dhOworCWlwYTNfY3R4LT51c2VfaXBhX3BtID0gcmVzb3VyY2VfcC0+dXNlX2lwYV9wbTsKIAlpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50c19sb2dnaW5nLmxvZ19yZHkgPSBmYWxzZTsKIAlpZiAocmVzb3VyY2VfcC0+aXBhX3R6X3VubG9ja19yZWcpIHsKIAkJaXBhM19jdHgtPmlwYV90el91bmxvY2tfcmVnX251bSA9CkBAIC00ODUzLDYgKzQ5MzcsOCBAQAogCiAJbXV0ZXhfaW5pdCgmaXBhM19jdHgtPmxvY2spOwogCW11dGV4X2luaXQoJmlwYTNfY3R4LT5uYXRfbWVtLmxvY2spOworCW11dGV4X2luaXQoJmlwYTNfY3R4LT5xNl9wcm94eV9jbGtfdm90ZV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmaXBhM19jdHgtPmlwYV9jbmVfZXZ0X2xvY2spOwogCiAJaWRyX2luaXQoJmlwYTNfY3R4LT5pcGFfaWRyKTsKIAlzcGluX2xvY2tfaW5pdCgmaXBhM19jdHgtPmlkcl9sb2NrKTsKQEAgLTQ4OTAsMjAgKzQ5NzYsMzAgQEAKIAl3YWtldXBfc291cmNlX2luaXQoJmlwYTNfY3R4LT53X2xvY2ssICJJUEFfV1MiKTsKIAlzcGluX2xvY2tfaW5pdCgmaXBhM19jdHgtPndha2Vsb2NrX3JlZl9jbnQuc3BpbmxvY2spOwogCi0JLyogSW5pdGlhbGl6ZSBJUEEgUk0gKHJlc291cmNlIG1hbmFnZXIpICovCi0JcmVzdWx0ID0gaXBhX3JtX2luaXRpYWxpemUoKTsKLQlpZiAocmVzdWx0KSB7Ci0JCUlQQUVSUigiUk0gaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsIC1yZXN1bHQpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfaXBhX3JtX2luaXQ7Ci0JfQotCUlQQURCRygiSVBBIHJlc291cmNlIG1hbmFnZXIgaW5pdGlhbGl6ZWQiKTsKKwkvKiBJbml0aWFsaXplIFBvd2VyIE1hbmFnZW1lbnQgZnJhbWV3b3JrICovCisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKSB7CisJCXJlc3VsdCA9IGlwYV9wbV9pbml0KCZpcGEzX3Jlcy5wbV9pbml0KTsKKwkJaWYgKHJlc3VsdCkgeworCQkJSVBBRVJSKCJJUEEgUE0gaW5pdGlhbGl6YXRpb24gZmFpbGVkICglZClcbiIsIC1yZXN1bHQpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbF9pcGFfcm1faW5pdDsKKwkJfQorCQlJUEFEQkcoIklQQSByZXNvdXJjZSBtYW5hZ2VyIGluaXRpYWxpemVkIik7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gaXBhX3JtX2luaXRpYWxpemUoKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJSVBBRVJSKCJSTSBpbml0aWFsaXphdGlvbiBmYWlsZWQgKCVkKVxuIiwgLXJlc3VsdCk7CisJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJZ290byBmYWlsX2lwYV9ybV9pbml0OworCQl9CisJCUlQQURCRygiSVBBIHJlc291cmNlIG1hbmFnZXIgaW5pdGlhbGl6ZWQiKTsKIAotCXJlc3VsdCA9IGlwYTNfY3JlYXRlX2FwcHNfcmVzb3VyY2UoKTsKLQlpZiAocmVzdWx0KSB7Ci0JCUlQQUVSUigiRmFpbGVkIHRvIGNyZWF0ZSBBUFBTX0NPTlMgcmVzb3VyY2VcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfY3JlYXRlX2FwcHNfcmVzb3VyY2U7CisJCXJlc3VsdCA9IGlwYTNfY3JlYXRlX2FwcHNfcmVzb3VyY2UoKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJSVBBRVJSKCJGYWlsZWQgdG8gY3JlYXRlIEFQUFNfQ09OUyByZXNvdXJjZVxuIik7CisJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJZ290byBmYWlsX2NyZWF0ZV9hcHBzX3Jlc291cmNlOworCQl9CiAJfQogCiAJcmVzdWx0ID0gaXBhM19hbGxvY19wa3RfaW5pdCgpOwpAQCAtNDk1NCw5ICs1MDUwLDExIEBACiAKIGZhaWxfY2Rldl9hZGQ6CiBmYWlsX2lwYV9pbml0X2ludGVycnVwdHM6Ci0JaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfQVBQU19DT05TKTsKKwlpZiAoIWlwYTNfY3R4LT51c2VfaXBhX3BtKQorCQlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9BUFBTX0NPTlMpOwogZmFpbF9jcmVhdGVfYXBwc19yZXNvdXJjZToKLQlpcGFfcm1fZXhpdCgpOworCWlmICghaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCWlwYV9ybV9leGl0KCk7CiBmYWlsX2lwYV9ybV9pbml0OgogZmFpbF9uYXRfZGV2X2FkZDoKIAlkZXZpY2VfZGVzdHJveShpcGEzX2N0eC0+Y2xhc3MsIGlwYTNfY3R4LT5kZXZfbnVtKTsKQEAgLTUwMjUsNiArNTEyMywxMDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitib29sIGlwYV9wbV9pc191c2VkKHZvaWQpCit7CisJcmV0dXJuIChpcGEzX2N0eCkgPyBpcGEzX2N0eC0+dXNlX2lwYV9wbSA6IGZhbHNlOworfQorCitzdGF0aWMgaW50IGdldF9pcGFfZHRzX3BtX2luZm8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlzdHJ1Y3QgaXBhM19wbGF0X2Rydl9yZXMgKmlwYV9kcnZfcmVzKQoreworCWludCByZXN1bHQ7CisJaW50IGksIGo7CisKKwlpcGFfZHJ2X3Jlcy0+dXNlX2lwYV9wbSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJInFjb20sdXNlLWlwYS1wbSIpOworCUlQQURCRygidXNlX2lwYV9wbT0lZFxuIiwgaXBhX2Rydl9yZXMtPnVzZV9pcGFfcG0pOworCWlmICghaXBhX2Rydl9yZXMtPnVzZV9pcGFfcG0pCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLG1zbS1idXMsbnVtLWNhc2VzIiwKKwkJJmlwYV9kcnZfcmVzLT5wbV9pbml0LnRocmVzaG9sZF9zaXplKTsKKwkvKiBObyB2b3RlIGlzIGlnbm9yZWQgKi8KKwlpcGFfZHJ2X3Jlcy0+cG1faW5pdC50aHJlc2hvbGRfc2l6ZSAtPSAyOworCWlmIChyZXN1bHQgfHwgaXBhX2Rydl9yZXMtPnBtX2luaXQudGhyZXNob2xkX3NpemUgPgorCQlJUEFfUE1fVEhSRVNIT0xEX01BWCkgeworCQlJUEFFUlIoImludmFsaWQgcHJvcGVydHkgcWNvbSxtc20tYnVzLG51bS1jYXNlcyAlZFxuIiwKKwkJCWlwYV9kcnZfcmVzLT5wbV9pbml0LnRocmVzaG9sZF9zaXplKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmVzdWx0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkocGRldi0+ZGV2Lm9mX25vZGUsCisJCSJxY29tLHRocm91Z2hwdXQtdGhyZXNob2xkIiwKKwkJaXBhX2Rydl9yZXMtPnBtX2luaXQuZGVmYXVsdF90aHJlc2hvbGQsCisJCWlwYV9kcnZfcmVzLT5wbV9pbml0LnRocmVzaG9sZF9zaXplKTsKKwlpZiAocmVzdWx0KSB7CisJCUlQQUVSUigiZmFpbGVkIHRvIHJlYWQgcWNvbSx0aHJvdWdocHV0LXRocmVzaG9sZHNcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXN1bHQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHBkZXYtPmRldi5vZl9ub2RlLAorCQkicWNvbSxzY2FsaW5nLWV4Y2VwdGlvbnMiKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlJUEFEQkcoIm5vIGV4Y2VwdGlvbiBsaXN0IGZvciBpcGEgcG1cbiIpOworCQlyZXN1bHQgPSAwOworCX0KKworCWlmIChyZXN1bHQgJSAoaXBhX2Rydl9yZXMtPnBtX2luaXQudGhyZXNob2xkX3NpemUgKyAxKSkgeworCQlJUEFFUlIoImZhaWxlZCB0byByZWFkIHFjb20sc2NhbGluZy1leGNlcHRpb25zXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaXBhX2Rydl9yZXMtPnBtX2luaXQuZXhjZXB0aW9uX3NpemUgPSByZXN1bHQgLworCQkoaXBhX2Rydl9yZXMtPnBtX2luaXQudGhyZXNob2xkX3NpemUgKyAxKTsKKwlpZiAoaXBhX2Rydl9yZXMtPnBtX2luaXQuZXhjZXB0aW9uX3NpemUgPj0KKwkJSVBBX1BNX0VYQ0VQVElPTl9NQVgpIHsKKwkJSVBBRVJSKCJleGNlcHRpb24gbGlzdCBsYXJnZXIgdGhlbiBtYXggJWRcbiIsCisJCQlpcGFfZHJ2X3Jlcy0+cG1faW5pdC5leGNlcHRpb25fc2l6ZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBpcGFfZHJ2X3Jlcy0+cG1faW5pdC5leGNlcHRpb25fc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBpcGFfcG1fZXhjZXB0aW9uICpleCA9IGlwYV9kcnZfcmVzLT5wbV9pbml0LmV4Y2VwdGlvbnM7CisKKwkJcmVzdWx0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkicWNvbSxzY2FsaW5nLWV4Y2VwdGlvbnMiLAorCQkJaSAqIGlwYV9kcnZfcmVzLT5wbV9pbml0LnRocmVzaG9sZF9zaXplLAorCQkJJmV4W2ldLnVzZWNhc2UpOworCQlpZiAocmVzdWx0KSB7CisJCQlJUEFFUlIoImZhaWxlZCB0byByZWFkIHFjb20sc2NhbGluZy1leGNlcHRpb25zIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBpcGFfZHJ2X3Jlcy0+cG1faW5pdC50aHJlc2hvbGRfc2l6ZTsgaisrKSB7CisJCQljb25zdCBjaGFyICpzdHI7CisKKwkJCXJlc3VsdCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KAorCQkJCXBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSJxY29tLHNjYWxpbmctZXhjZXB0aW9ucyIsCisJCQkJaSAqIGlwYV9kcnZfcmVzLT5wbV9pbml0LnRocmVzaG9sZF9zaXplICsgaiArIDEsCisJCQkJJnN0cik7CisJCQlpZiAocmVzdWx0KSB7CisJCQkJSVBBRVJSKCJmYWlsZWQgdG8gcmVhZCBxY29tLHNjYWxpbmctZXhjZXB0aW9ucyIKKwkJCQkJKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKworCQkJaWYgKGtzdHJ0b3UzMihzdHIsIDAsICZleFtpXS50aHJlc2hvbGRbal0pKSB7CisJCQkJSVBBRVJSKCJlcnJvciBzdHI9JXNcbiIsIHN0cik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBnZXRfaXBhX2R0c19jb25maWd1cmF0aW9uKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCXN0cnVjdCBpcGEzX3BsYXRfZHJ2X3JlcyAqaXBhX2Rydl9yZXMpCiB7CkBAIC01MjYzLDYgKzU0NTYsMTQgQEAKIAkJfQogCQlrZnJlZShpcGFfdHpfdW5sb2NrX3JlZyk7CiAJfQorCisJLyogZ2V0IElQQSBQTSByZWxhdGVkIGluZm9ybWF0aW9uICovCisJcmVzdWx0ID0gZ2V0X2lwYV9kdHNfcG1faW5mbyhwZGV2LCBpcGFfZHJ2X3Jlcyk7CisJaWYgKHJlc3VsdCkgeworCQlJUEFFUlIoImZhaWxlZCB0byBnZXQgcG0gaW5mbyBmcm9tIGR0cyAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTgwMCwxMSArNjAwMSwxNiBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBSZWxlYXNlIHRyYW5zcG9ydCBJUEEgcmVzb3VyY2Ugd2l0aG91dCB3YWl0aW5nIGZvciBpbmFjdGl2aXR5IHRpbWVyCi0JICovCi0JYXRvbWljX3NldCgmaXBhM19jdHgtPnRyYW5zcG9ydF9wbS5lb3RfYWN0aXZpdHksIDApOwotCWlwYTNfdHJhbnNwb3J0X3JlbGVhc2VfcmVzb3VyY2UoTlVMTCk7CisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKSB7CisJCWlwYV9wbV9kZWFjdGl2YXRlX2FsbF9kZWZlcnJlZCgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlbGVhc2UgdHJhbnNwb3J0IElQQSByZXNvdXJjZSB3aXRob3V0IHdhaXRpbmcKKwkJICogZm9yIGluYWN0aXZpdHkgdGltZXIKKwkJICovCisJCWF0b21pY19zZXQoJmlwYTNfY3R4LT50cmFuc3BvcnRfcG0uZW90X2FjdGl2aXR5LCAwKTsKKwkJaXBhM190cmFuc3BvcnRfcmVsZWFzZV9yZXNvdXJjZShOVUxMKTsKKwl9CiAJSVBBREJHKCJFeGl0XG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfZGVidWdmcy5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfZGVidWdmcy5jCmluZGV4IDE1MzU0OGIuLmY3MmY0MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9kZWJ1Z2ZzLmMKQEAgLTkxMCwxMCArOTEwLDExIEBACiAJCQkJZXEgPSB0cnVlOwogCQkJfSBlbHNlIHsKIAkJCQlydF90YmwgPSBpcGEzX2lkX2ZpbmQoZW50cnktPnJ1bGUucnRfdGJsX2hkbCk7Ci0JCQkJaWYgKHJ0X3RibCkKLQkJCQkJcnRfdGJsX2lkeCA9IHJ0X3RibC0+aWR4OworCQkJCWlmIChydF90YmwgPT0gTlVMTCB8fAorCQkJCQlydF90YmwtPmNvb2tpZSAhPSBJUEFfUlRfVEJMX0NPT0tJRSkKKwkJCQkJcnRfdGJsX2lkeCA9ICB+MDsKIAkJCQllbHNlCi0JCQkJCXJ0X3RibF9pZHggPSB+MDsKKwkJCQkJcnRfdGJsX2lkeCA9IHJ0X3RibC0+aWR4OwogCQkJCWJpdG1hcCA9IGVudHJ5LT5ydWxlLmF0dHJpYi5hdHRyaWJfbWFzazsKIAkJCQllcSA9IGZhbHNlOwogCQkJfQpAQCAtMTcwNSw2ICsxNzA2LDEwIEBACiB7CiAJaW50IHJlc3VsdCwgbmJ5dGVzLCBjbnQgPSAwOwogCisJLyogZGVwcmVjYXRlIGlmIElQQSBQTSBpcyB1c2VkICovCisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKQorCQlyZXR1cm4gMDsKKwogCXJlc3VsdCA9IGlwYV9ybV9zdGF0KGRiZ19idWZmLCBJUEFfTUFYX01TR19MRU4pOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCW5ieXRlcyA9IHNjbnByaW50ZihkYmdfYnVmZiwgSVBBX01BWF9NU0dfTEVOLApAQCAtMTcxNiw2ICsxNzIxLDQ1IEBACiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9zLCBkYmdfYnVmZiwgY250KTsKIH0KIAorc3RhdGljIHNzaXplX3QgaXBhM19wbV9yZWFkX3N0YXRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJlc3VsdCwgbmJ5dGVzLCBjbnQgPSAwOworCisJaWYgKCFpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSBpcGFfcG1fc3RhdChkYmdfYnVmZiwgSVBBX01BWF9NU0dfTEVOKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQluYnl0ZXMgPSBzY25wcmludGYoZGJnX2J1ZmYsIElQQV9NQVhfTVNHX0xFTiwKKwkJCQkiRXJyb3IgaW4gcHJpbnRpbmcgUE0gc3RhdCAlZFxuIiwgcmVzdWx0KTsKKwkJY250ICs9IG5ieXRlczsKKwl9IGVsc2UKKwkJY250ICs9IHJlc3VsdDsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgZGJnX2J1ZmYsIGNudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlwYTNfcG1fZXhfcmVhZF9zdGF0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXN1bHQsIG5ieXRlcywgY250ID0gMDsKKworCWlmICghaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gaXBhX3BtX2V4Y2VwdGlvbnNfc3RhdChkYmdfYnVmZiwgSVBBX01BWF9NU0dfTEVOKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQluYnl0ZXMgPSBzY25wcmludGYoZGJnX2J1ZmYsIElQQV9NQVhfTVNHX0xFTiwKKwkJCQkiRXJyb3IgaW4gcHJpbnRpbmcgUE0gc3RhdCAlZFxuIiwgcmVzdWx0KTsKKwkJY250ICs9IG5ieXRlczsKKwl9IGVsc2UKKwkJY250ICs9IHJlc3VsdDsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgZGJnX2J1ZmYsIGNudCk7Cit9CisKKwogc3RhdGljIHZvaWQgaXBhX2R1bXBfc3RhdHVzKHN0cnVjdCBpcGFoYWxfcGt0X3N0YXR1cyAqc3RhdHVzKQogewogCUlQQV9EVU1QX1NUQVRVU19GSUVMRChzdGF0dXNfb3Bjb2RlKTsKQEAgLTE5NDAsNiArMTk4NCwxNSBAQAogCS5yZWFkID0gaXBhM19ybV9yZWFkX3N0YXRzLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBhM19wbV9zdGF0cyA9IHsKKwkucmVhZCA9IGlwYTNfcG1fcmVhZF9zdGF0cywKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBhM19wbV9leF9zdGF0cyA9IHsKKwkucmVhZCA9IGlwYTNfcG1fZXhfcmVhZF9zdGF0cywKK307CisKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXBhM19hY3RpdmVfY2xpZW50cyA9IHsKIAkucmVhZCA9IGlwYTNfcHJpbnRfYWN0aXZlX2NsaWVudHNfbG9nLAogCS53cml0ZSA9IGlwYTNfY2xlYXJfYWN0aXZlX2NsaWVudHNfbG9nLApAQCAtMjEzMSwxMSArMjE4NCwyNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JZGZpbGVfcm1fc3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJybV9zdGF0cyIsCi0JCQlyZWFkX29ubHlfbW9kZSwgZGVudCwgMCwgJmlwYTNfcm1fc3RhdHMpOwotCWlmICghZGZpbGVfcm1fc3RhdHMgfHwgSVNfRVJSKGRmaWxlX3JtX3N0YXRzKSkgewotCQlJUEFFUlIoImZhaWwgdG8gY3JlYXRlIGZpbGUgZm9yIGRlYnVnX2ZzIHJtX3N0YXRzXG4iKTsKLQkJZ290byBmYWlsOworCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkgeworCQlmaWxlID0gZGZpbGVfcm1fc3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwbV9zdGF0cyIsCisJCQlyZWFkX29ubHlfbW9kZSwgZGVudCwgTlVMTCwgJmlwYTNfcG1fc3RhdHMpOworCQlpZiAoIWZpbGUgfHwgSVNfRVJSKGZpbGUpKSB7CisJCQlJUEFFUlIoImZhaWwgdG8gY3JlYXRlIGZpbGUgZm9yIGRlYnVnX2ZzIHBtX3N0YXRzXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWZpbGUgPSBkZmlsZV9ybV9zdGF0cyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInBtX2V4X3N0YXRzIiwKKwkJCXJlYWRfb25seV9tb2RlLCBkZW50LCBOVUxMLCAmaXBhM19wbV9leF9zdGF0cyk7CisJCWlmICghZmlsZSB8fCBJU19FUlIoZmlsZSkpIHsKKwkJCUlQQUVSUigiZmFpbCB0byBjcmVhdGUgZmlsZSBmb3IgZGVidWdmcyBwbV9leF9zdGF0c1xuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgeworCQlkZmlsZV9ybV9zdGF0cyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJtX3N0YXRzIiwKKwkJCQlyZWFkX29ubHlfbW9kZSwgZGVudCwgTlVMTCwgJmlwYTNfcm1fc3RhdHMpOworCQlpZiAoIWRmaWxlX3JtX3N0YXRzIHx8IElTX0VSUihkZmlsZV9ybV9zdGF0cykpIHsKKwkJCUlQQUVSUigiZmFpbCB0byBjcmVhdGUgZmlsZSBmb3IgZGVidWdfZnMgcm1fc3RhdHNcbiIpOworCQkJZ290byBmYWlsOworCQl9CiAJfQogCiAJZGZpbGVfc3RhdHVzX3N0YXRzID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhdHVzX3N0YXRzIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2RwLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9kcC5jCmluZGV4IDAyYzU5OTEuLjdmMzBhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2RwLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfZHAuYwpAQCAtNzMsNiArNzMsOCBAQAogCiAjZGVmaW5lIElQQV9UWF9TRU5EX0NPTVBMX05PUF9ERUxBWV9OUyAoMiAqIDEwMDAgKiAxMDAwKQogCisjZGVmaW5lIElQQV9BUFBTX0JXX0ZPUl9QTSA3MDAKKwogc3RhdGljIHN0cnVjdCBza19idWZmICppcGEzX2dldF9za2JfaXBhX3J4KHVuc2lnbmVkIGludCBsZW4sIGdmcF90IGZsYWdzKTsKIHN0YXRpYyB2b2lkIGlwYTNfcmVwbGVuaXNoX3dsYW5fcnhfY2FjaGUoc3RydWN0IGlwYTNfc3lzX2NvbnRleHQgKnN5cyk7CiBzdGF0aWMgdm9pZCBpcGEzX3JlcGxlbmlzaF9yeF9jYWNoZShzdHJ1Y3QgaXBhM19zeXNfY29udGV4dCAqc3lzKTsKQEAgLTc0OCw3ICs3NTAsMTAgQEAKIAlpbnQgaW5hY3RpdmVfY3ljbGVzID0gMDsKIAlpbnQgY250OwogCi0JSVBBX0FDVElWRV9DTElFTlRTX0lOQ19TSU1QTEUoKTsKKwlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCWlwYV9wbV9hY3RpdmF0ZV9zeW5jKHN5cy0+cG1faGRsKTsKKwllbHNlCisJCUlQQV9BQ1RJVkVfQ0xJRU5UU19JTkNfU0lNUExFKCk7CiAJZG8gewogCQljbnQgPSBpcGEzX2hhbmRsZV9yeF9jb3JlKHN5cywgdHJ1ZSwgdHJ1ZSk7CiAJCWlmIChjbnQgPT0gMCkKQEAgLTc3Miw3ICs3NzcsMTAgQEAKIAogCXRyYWNlX3BvbGxfdG9faW50cjMoc3lzLT5lcC0+Y2xpZW50KTsKIAlpcGEzX3J4X3N3aXRjaF90b19pbnRyX21vZGUoc3lzKTsKLQlJUEFfQUNUSVZFX0NMSUVOVFNfREVDX1NJTVBMRSgpOworCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUoc3lzLT5wbV9oZGwpOworCWVsc2UKKwkJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19TSU1QTEUoKTsKIH0KIAogc3RhdGljIHZvaWQgaXBhM19zd2l0Y2hfdG9faW50cl9yeF93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzk5LDYgKzgwNywzMiBAQAogCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIAorc3RhdGljIHZvaWQgaXBhX3BtX3N5c19waXBlX2NiKHZvaWQgKnAsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBpcGEzX3N5c19jb250ZXh0ICpzeXMgPSAoc3RydWN0IGlwYTNfc3lzX2NvbnRleHQgKilwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSVBBX1BNX0NMSUVOVF9BQ1RJVkFURUQ6CisJCS8qCisJCSAqIHRoaXMgZXZlbnQgaXMgaWdub3JlZCBhcyB0aGUgc3luYyB2ZXJzaW9uIG9mIGFjdGl2YXRpb24KKwkJICogd2lsbCBiZSB1c2VkLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBJUEFfUE1fUkVRVUVTVF9XQUtFVVA6CisJCS8qCisJCSAqIHBpcGUgd2lsbCBiZSB1bnN1c3BlbmRlZCBhcyBwYXJ0IG9mCisJCSAqIGVuYWJsaW5nIElQQSBjbG9ja3MKKwkJICovCisJCWlwYV9wbV9hY3RpdmF0ZV9zeW5jKHN5cy0+cG1faGRsKTsKKwkJaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUoc3lzLT5wbV9oZGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUEFFUlIoIlVuZXhwZWN0ZWQgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KK30KKwogLyoqCiAgKiBpcGEzX3NldHVwX3N5c19waXBlKCkgLSBTZXR1cCBhbiBJUEEgR1BJIHBpcGUgYW5kIHBlcmZvcm0KICAqIElQQSBFUCBjb25maWd1cmF0aW9uCkBAIC04NDYsNiArODgwLDkgQEAKIAltZW1zZXQoZXAsIDAsIG9mZnNldG9mKHN0cnVjdCBpcGEzX2VwX2NvbnRleHQsIHN5cykpOwogCiAJaWYgKCFlcC0+c3lzKSB7CisJCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHBtX3JlZzsKKworCQltZW1zZXQoJnBtX3JlZywgMCwgc2l6ZW9mKHBtX3JlZykpOwogCQllcC0+c3lzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwYTNfc3lzX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFlcC0+c3lzKSB7CiAJCQlJUEFFUlIoImZhaWxlZCB0byBzeXMgY3R4IGZvciBjbGllbnQgJWRcbiIsCkBAIC04ODQsNiArOTIxLDM1IEBACiAJCWhydGltZXJfaW5pdCgmZXAtPnN5cy0+ZGJfdGltZXIsIENMT0NLX01PTk9UT05JQywKIAkJCUhSVElNRVJfTU9ERV9SRUwpOwogCQllcC0+c3lzLT5kYl90aW1lci5mdW5jdGlvbiA9IGlwYTNfcmluZ19kb29yYmVsbF90aW1lcl9mbjsKKworCQkvKiBjcmVhdGUgSVBBIFBNIHJlc291cmNlcyBmb3IgaGFuZGxpbmcgcG9sbGluZyBtb2RlICovCisJCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSAmJgorCQkJSVBBX0NMSUVOVF9JU19DT05TKHN5c19pbi0+Y2xpZW50KSkgeworCQkJcG1fcmVnLm5hbWUgPSBpcGFfY2xpZW50c19zdHJpbmdzW3N5c19pbi0+Y2xpZW50XTsKKwkJCXBtX3JlZy5jYWxsYmFjayA9IGlwYV9wbV9zeXNfcGlwZV9jYjsKKwkJCXBtX3JlZy51c2VyX2RhdGEgPSBlcC0+c3lzOworCQkJcG1fcmVnLmdyb3VwID0gSVBBX1BNX0dST1VQX0FQUFM7CisJCQlyZXN1bHQgPSBpcGFfcG1fcmVnaXN0ZXIoJnBtX3JlZywgJmVwLT5zeXMtPnBtX2hkbCk7CisJCQlpZiAocmVzdWx0KSB7CisJCQkJSVBBRVJSKCJmYWlsZWQgdG8gY3JlYXRlIElQQSBQTSBjbGllbnQgJWRcbiIsCisJCQkJCXJlc3VsdCk7CisJCQkJZ290byBmYWlsX3BtOworCQkJfQorCisJCQlyZXN1bHQgPSBpcGFfcG1fYXNzb2NpYXRlX2lwYV9jb25zX3RvX2NsaWVudCgKKwkJCQllcC0+c3lzLT5wbV9oZGwsIHN5c19pbi0+Y2xpZW50KTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlJUEFFUlIoImZhaWxlZCB0byBhc3NvY2lhdGUgSVBBIFBNIGNsaWVudFxuIik7CisJCQkJZ290byBmYWlsX2dlbjI7CisJCQl9CisKKwkJCXJlc3VsdCA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKGVwLT5zeXMtPnBtX2hkbCwKKwkJCQlJUEFfQVBQU19CV19GT1JfUE0pOworCQkJaWYgKHJlc3VsdCkgeworCQkJCUlQQUVSUigiZmFpbGVkIHRvIHNldCBwcm9maWxlIElQQSBQTSBjbGllbnRcbiIpOworCQkJCWdvdG8gZmFpbF9nZW4yOworCQkJfQorCQl9CiAJfSBlbHNlIHsKIAkJbWVtc2V0KGVwLT5zeXMsIDAsIG9mZnNldG9mKHN0cnVjdCBpcGEzX3N5c19jb250ZXh0LCBlcCkpOwogCX0KQEAgLTk4NCw2ICsxMDUwLDkgQEAKIAlyZXR1cm4gMDsKIAogZmFpbF9nZW4yOgorCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJaXBhX3BtX2RlcmVnaXN0ZXIoZXAtPnN5cy0+cG1faGRsKTsKK2ZhaWxfcG06CiAJZGVzdHJveV93b3JrcXVldWUoZXAtPnN5cy0+cmVwbF93cSk7CiBmYWlsX3dxMjoKIAlkZXN0cm95X3dvcmtxdWV1ZShlcC0+c3lzLT53cSk7CkBAIC0xNDAyLDcgKzE0NzEsOCBAQAogCXN5cyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXBhM19zeXNfY29udGV4dCwgd29yayk7CiAKIAlpZiAoc3lzLT5lcC0+bmFwaV9lbmFibGVkKSB7Ci0JCUlQQV9BQ1RJVkVfQ0xJRU5UU19JTkNfU1BFQ0lBTCgiTkFQSSIpOworCQlpZiAoIWlwYTNfY3R4LT51c2VfaXBhX3BtKQorCQkJSVBBX0FDVElWRV9DTElFTlRTX0lOQ19TUEVDSUFMKCJOQVBJIik7CiAJCXN5cy0+ZXAtPmNsaWVudF9ub3RpZnkoc3lzLT5lcC0+cHJpdiwKIAkJCQlJUEFfQ0xJRU5UX1NUQVJUX1BPTEwsIDApOwogCX0gZWxzZQpAQCAtMjY4Myw2ICsyNzUzLDIxIEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChpbi0+Y2xpZW50ID09IElQQV9DTElFTlRfQVBQU19XQU5fUFJPRCkgeworCQlzeXMtPnBvbGljeSA9IElQQV9QT0xJQ1lfSU5UUl9NT0RFOworCQlzeXMtPnVzZV9jb21tX2V2dF9yaW5nID0gdHJ1ZTsKKwkJSU5JVF9XT1JLKCZzeXMtPndvcmssIGlwYTNfc2VuZF9ub3BfZGVzYyk7CisKKwkJLyoKKwkJICogZW5hYmxlIHNvdXJjZSBub3RpZmljYXRpb24gc3RhdHVzIGZvciBleGNlcHRpb24gcGFja2V0cworCQkgKiAoaS5lLiBRTUFQIGNvbW1hbmRzKSB0byBiZSByb3V0ZWQgdG8gbW9kZW0uCisJCSAqLworCQlzeXMtPmVwLT5zdGF0dXMuc3RhdHVzX2VuID0gdHJ1ZTsKKwkJc3lzLT5lcC0+c3RhdHVzLnN0YXR1c19lcCA9CisJCQlpcGEzX2dldF9lcF9tYXBwaW5nKElQQV9DTElFTlRfUTZfV0FOX0NPTlMpOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoSVBBX0NMSUVOVF9JU19NRU1DUFlfRE1BX1BST0QoaW4tPmNsaWVudCkpIHsKIAkJc3lzLT5wb2xpY3kgPSBJUEFfUE9MSUNZX05PSU5UUl9NT0RFOwogCQlyZXR1cm4gMDsKQEAgLTMyNjgsMTEgKzMzNTMsNDggQEAKIAl9CiB9CiAKK3ZvaWQgX19pcGFfZ3NpX2lycV9yeF9zY2VkdWxlX3BvbGwoc3RydWN0IGlwYTNfc3lzX2NvbnRleHQgKnN5cykKK3sKKwlib29sIGNsa19vZmY7CisKKwlhdG9taWNfc2V0KCZzeXMtPmN1cnJfcG9sbGluZ19zdGF0ZSwgMSk7CisJaXBhM19pbmNfYWNxdWlyZV93YWtlbG9jaygpOworCisJLyoKKwkgKiBwbSBkZWFjdGl2YXRlIGlzIGRvbmUgaW4gd3EgY29udGV4dAorCSAqIG9yIGFmdGVyIE5BUEkgcG9sbAorCSAqLworCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkgeworCQljbGtfb2ZmID0gaXBhX3BtX2FjdGl2YXRlKHN5cy0+cG1faGRsKTsKKwkJaWYgKCFjbGtfb2ZmICYmIHN5cy0+ZXAtPm5hcGlfZW5hYmxlZCkgeworCQkJc3lzLT5lcC0+Y2xpZW50X25vdGlmeShzeXMtPmVwLT5wcml2LAorCQkJCUlQQV9DTElFTlRfU1RBUlRfUE9MTCwgMCk7CisJCQlyZXR1cm47CisJCX0KKwkJcXVldWVfd29yayhzeXMtPndxLCAmc3lzLT53b3JrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzeXMtPmVwLT5uYXBpX2VuYWJsZWQpIHsKKwkJc3RydWN0IGlwYV9hY3RpdmVfY2xpZW50X2xvZ2dpbmdfaW5mbyBsb2c7CisKKwkJSVBBX0FDVElWRV9DTElFTlRTX1BSRVBfU1BFQ0lBTChsb2csICJOQVBJIik7CisJCWNsa19vZmYgPSBpcGEzX2luY19jbGllbnRfZW5hYmxlX2Nsa3Nfbm9fYmxvY2soCisJCQkmbG9nKTsKKwkJaWYgKCFjbGtfb2ZmKSB7CisJCQlzeXMtPmVwLT5jbGllbnRfbm90aWZ5KHN5cy0+ZXAtPnByaXYsCisJCQkJSVBBX0NMSUVOVF9TVEFSVF9QT0xMLCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXF1ZXVlX3dvcmsoc3lzLT53cSwgJnN5cy0+d29yayk7Cit9CisKIHN0YXRpYyB2b2lkIGlwYV9nc2lfaXJxX3J4X25vdGlmeV9jYihzdHJ1Y3QgZ3NpX2NoYW5feGZlcl9ub3RpZnkgKm5vdGlmeSkKIHsKIAlzdHJ1Y3QgaXBhM19zeXNfY29udGV4dCAqc3lzOwogCXN0cnVjdCBpcGEzX3J4X3BrdF93cmFwcGVyICpyeF9wa3RfZXhwZWN0ZWQsICpyeF9wa3RfcmN2ZDsKLQlpbnQgY2xrX29mZjsKIAogCWlmICghbm90aWZ5KSB7CiAJCUlQQUVSUigiZ3NpIG5vdGlmeSBpcyBOVUxMLlxuIik7CkBAIC0zMzAyLDIyICszNDI0LDcgQEAKIAkJCS8qIHB1dCB0aGUgZ3NpIGNoYW5uZWwgaW50byBwb2xsaW5nIG1vZGUgKi8KIAkJCWdzaV9jb25maWdfY2hhbm5lbF9tb2RlKHN5cy0+ZXAtPmdzaV9jaGFuX2hkbCwKIAkJCQlHU0lfQ0hBTl9NT0RFX1BPTEwpOwotCQkJaXBhM19pbmNfYWNxdWlyZV93YWtlbG9jaygpOwotCQkJYXRvbWljX3NldCgmc3lzLT5jdXJyX3BvbGxpbmdfc3RhdGUsIDEpOwotCQkJaWYgKHN5cy0+ZXAtPm5hcGlfZW5hYmxlZCkgewotCQkJCXN0cnVjdCBpcGFfYWN0aXZlX2NsaWVudF9sb2dnaW5nX2luZm8gbG9nOwotCi0JCQkJSVBBX0FDVElWRV9DTElFTlRTX1BSRVBfU1BFQ0lBTChsb2csICJOQVBJIik7Ci0JCQkJY2xrX29mZiA9IGlwYTNfaW5jX2NsaWVudF9lbmFibGVfY2xrc19ub19ibG9jaygKLQkJCQkJJmxvZyk7Ci0JCQkJaWYgKCFjbGtfb2ZmKQotCQkJCQlzeXMtPmVwLT5jbGllbnRfbm90aWZ5KHN5cy0+ZXAtPnByaXYsCi0JCQkJCQlJUEFfQ0xJRU5UX1NUQVJUX1BPTEwsIDApOwotCQkJCWVsc2UKLQkJCQkJcXVldWVfd29yayhzeXMtPndxLCAmc3lzLT53b3JrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcXVldWVfd29yayhzeXMtPndxLCAmc3lzLT53b3JrKTsKLQkJCX0KKwkJCV9faXBhX2dzaV9pcnFfcnhfc2NlZHVsZV9wb2xsKHN5cyk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM3MTksNyArMzgyNiwxMCBAQAogCWlmIChjbnQgPCB3ZWlnaHQpIHsKIAkJZXAtPmNsaWVudF9ub3RpZnkoZXAtPnByaXYsIElQQV9DTElFTlRfQ09NUF9OQVBJLCAwKTsKIAkJaXBhM19yeF9zd2l0Y2hfdG9faW50cl9tb2RlKGVwLT5zeXMpOwotCQlpcGEzX2RlY19jbGllbnRfZGlzYWJsZV9jbGtzX25vX2Jsb2NrKCZsb2cpOworCQlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCQlpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShlcC0+c3lzLT5wbV9oZGwpOworCQllbHNlCisJCQlpcGEzX2RlY19jbGllbnRfZGlzYWJsZV9jbGtzX25vX2Jsb2NrKCZsb2cpOwogCX0KIAogCXJldHVybiBjbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9mbHQuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2ZsdC5jCmluZGV4IGJlY2E1NDkuLjA4ODNlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2ZsdC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2ZsdC5jCkBAIC0xMTcwLDYgKzExNzAsMTMgQEAKIAkJZ290byBiYWlsOwogCX0KIAorCWlmIChlbnRyeS0+Y29va2llICE9IElQQV9GTFRfQ09PS0lFKSB7CisJCUlQQUVSUl9STCgiSW52YWxpZCBjb29raWUgdmFsdWUgPSAgJXUgZmx0IGhkbCBpZCA9ICVkXG4iLAorCQkJZW50cnktPmNvb2tpZSwgcnVsZXMtPmFkZF9hZnRlcl9oZGwpOworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGJhaWw7CisJfQorCiAJaWYgKGVudHJ5LT50YmwgIT0gdGJsKSB7CiAJCUlQQUVSUl9STCgiZ2l2ZW4gZW50cnkgZG9lcyBub3QgbWF0Y2ggdGhlIHRhYmxlXG4iKTsKIAkJcmVzdWx0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2kuaCBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2kuaAppbmRleCA0M2ZkNGQxLi4zZTFkMTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9pLmgKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfaS5oCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiaXBhaGFsL2lwYWhhbF9od19zdGF0cy5oIgogI2luY2x1ZGUgIi4uL2lwYV9jb21tb25faS5oIgogI2luY2x1ZGUgImlwYV91Y19vZmZsb2FkX2kuaCIKKyNpbmNsdWRlICJpcGFfcG0uaCIKIAogI2RlZmluZSBEUlZfTkFNRSAiaXBhIgogI2RlZmluZSBOQVRfREVWX05BTUUgImlwYU5hdFRhYmxlIgpAQCAtNzEsNiArNzIsOCBAQAogCiAjZGVmaW5lIElQQV9JUENfTE9HX1BBR0VTIDUwCiAKKyNkZWZpbmUgSVBBX01BWF9OVU1fUkVRX0NBQ0hFIDEwCisKICNkZWZpbmUgSVBBREJHKGZtdCwgYXJncy4uLikgXAogCWRvIHsgXAogCQlwcl9kZWJ1ZyhEUlZfTkFNRSAiICVzOiVkICIgZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjIGFyZ3MpO1wKQEAgLTY0NSw2ICs2NDgsNyBAQAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcmVwbF93cTsKIAlzdHJ1Y3QgaXBhM19zdGF0dXNfc3RhdHMgKnN0YXR1c19zdGF0OworCXUzMiBwbV9oZGw7CiAJLyogb3JkZXJpbmcgaXMgaW1wb3J0YW50IC0gb3RoZXIgaW1tdXRhYmxlIGZpZWxkcyBnbyBiZWxvdyAqLwogfTsKIApAQCAtODY3LDYgKzg3MSw3IEBACiBzdHJ1Y3QgaXBhM19hY3RpdmVfY2xpZW50cyB7CiAJc3RydWN0IG11dGV4IG11dGV4OwogCWF0b21pY190IGNudDsKKwlpbnQgYnVzX3ZvdGVfaWR4OwogfTsKIAogc3RydWN0IGlwYTNfd2FrZWxvY2tfcmVmX2NudCB7CkBAIC0xMDg4LDYgKzEwOTMsMTEgQEAKIAlzdHJ1Y3QgaXBhX2h3X3N0YXRzX2Ryb3AgZHJvcDsKIH07CiAKK3N0cnVjdCBpcGFfY25lX2V2dCB7CisJc3RydWN0IGlwYV93YW5fbXNnIHdhbl9tc2c7CisJc3RydWN0IGlwYV9tc2dfbWV0YSBtc2dfbWV0YTsKK307CisKIC8qKgogICogc3RydWN0IGlwYTNfY29udGV4dCAtIElQQSBjb250ZXh0CiAgKiBAY2xhc3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBjbGFzcwpAQCAtMTI2Nyw2ICsxMjc3LDcgQEAKIAl1MzIgZW5hYmxlX2Nsb2NrX3NjYWxpbmc7CiAJdTMyIGN1cnJfaXBhX2Nsa19yYXRlOwogCWJvb2wgcTZfcHJveHlfY2xrX3ZvdGVfdmFsaWQ7CisJc3RydWN0IG11dGV4IHE2X3Byb3h5X2Nsa192b3RlX211dGV4OwogCXUzMiBpcGFfbnVtX3BpcGVzOwogCWRtYV9hZGRyX3QgcGt0X2luaXRfaW1tW0lQQTNfTUFYX05VTV9QSVBFU107CiAJdTMyIHBrdF9pbml0X2ltbV9vcGNvZGU7CkBAIC0xMzAzLDYgKzEzMTQsMTAgQEAKIAlzdHJ1Y3QgaXBhX3R6X3VubG9ja19yZWdfaW5mbyAqaXBhX3R6X3VubG9ja19yZWc7CiAJc3RydWN0IGlwYV9kbWFfdGFza19pbmZvIGRtYV90YXNrX2luZm87CiAJc3RydWN0IGlwYV9od19zdGF0cyBod19zdGF0czsKKwlzdHJ1Y3QgaXBhX2NuZV9ldnQgaXBhX2NuZV9ldnRfcmVxX2NhY2hlW0lQQV9NQVhfTlVNX1JFUV9DQUNIRV07CisJaW50IG51bV9pcGFfY25lX2V2dF9yZXE7CisJc3RydWN0IG11dGV4IGlwYV9jbmVfZXZ0X2xvY2s7CisJYm9vbCB1c2VfaXBhX3BtOwogfTsKIAogc3RydWN0IGlwYTNfcGxhdF9kcnZfcmVzIHsKQEAgLTEzMzAsNiArMTM0NSw4IEBACiAJYm9vbCB0ZXRoZXJlZF9mbG93X2NvbnRyb2w7CiAJdTMyIGlwYV90el91bmxvY2tfcmVnX251bTsKIAlzdHJ1Y3QgaXBhX3R6X3VubG9ja19yZWdfaW5mbyAqaXBhX3R6X3VubG9ja19yZWc7CisJYm9vbCB1c2VfaXBhX3BtOworCXN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgcG1faW5pdDsKIH07CiAKIC8qKgpAQCAtMTU2MCw4ICsxNTc3LDEwIEBACiAJdTMyIGlwYV9jbGtfcmF0ZV90dXJibzsKIAl1MzIgaXBhX2Nsa19yYXRlX25vbWluYWw7CiAJdTMyIGlwYV9jbGtfcmF0ZV9zdnM7CisJdTMyIGlwYV9jbGtfcmF0ZV9zdnMyOwogCXUzMiBjbG9ja19zY2FsaW5nX2J3X3RocmVzaG9sZF90dXJibzsKIAl1MzIgY2xvY2tfc2NhbGluZ19id190aHJlc2hvbGRfbm9taW5hbDsKKwl1MzIgY2xvY2tfc2NhbGluZ19id190aHJlc2hvbGRfc3ZzOwogCXUzMiBpcGFfcmVnX2Jhc2Vfb2ZzdDsKIAl1MzIgbWF4X2hvbGJfdG1yX3ZhbDsKIAl2b2lkICgqaXBhX3NyYW1fcmVhZF9zZXR0aW5ncykodm9pZCk7CkBAIC0yMjEzLDQgKzIyMzIsNiBAQAogaW50IGlwYTNfYWxsb2NfY29tbW9uX2V2ZW50X3Jpbmcodm9pZCk7CiBpbnQgaXBhM19hbGxvY2F0ZV9kbWFfdGFza19mb3JfZ3NpKHZvaWQpOwogdm9pZCBpcGEzX2ZyZWVfZG1hX3Rhc2tfZm9yX2dzaSh2b2lkKTsKK2ludCBpcGEzX3NldF9jbG9ja19wbGFuX2Zyb21fcG0oaW50IGlkeCk7Cit2b2lkIF9faXBhX2dzaV9pcnFfcnhfc2NlZHVsZV9wb2xsKHN0cnVjdCBpcGEzX3N5c19jb250ZXh0ICpzeXMpOwogI2VuZGlmIC8qIF9JUEEzX0lfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2ludGVycnVwdHMuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX2ludGVycnVwdHMuYwppbmRleCA2ZDgyZGEyLi5kNjlkNmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9pbnRlcnJ1cHRzLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfaW50ZXJydXB0cy5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAlpcGEzX3Byb2Nlc3NfaW50ZXJydXB0cyh0cnVlKTsKIAlJUEFEQkdfTE9XKCJFeGl0XG4iKTsKIAotCWlwYTNfZGVjX2NsaWVudF9kaXNhYmxlX2Nsa3MoJmxvZ19pbmZvKTsKKwlpcGEzX2RlY19jbGllbnRfZGlzYWJsZV9jbGtzX25vX2Jsb2NrKCZsb2dfaW5mbyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9taGkuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX21oaS5jCmluZGV4IGIxOWVmOGIuLjA4ZjJhOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX21oaS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX21oaS5jCkBAIC02MjcsNiArNjI3LDggQEAKIAl9CiAJZXAgPSAmaXBhM19jdHgtPmVwW2lwYV9lcF9pZHhdOwogCisJSVBBX0FDVElWRV9DTElFTlRTX0lOQ19FUChjbGllbnQpOworCiAJSVBBX01ISV9EQkcoInJlc2V0IGV2ZW50IHJpbmcgKGhkbDogJWx1LCBlcDogJWQpXG4iLAogCQllcC0+Z3NpX2V2dF9yaW5nX2hkbCwgaXBhX2VwX2lkeCk7CiAKQEAgLTY0OCw4ICs2NTAsMTAgQEAKIAkJZ290byBmYWlsOwogCX0KIAorCUlQQV9BQ1RJVkVfQ0xJRU5UU19ERUNfRVAoY2xpZW50KTsKIAlyZXR1cm4gMDsKIGZhaWw6CisJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19FUChjbGllbnQpOwogCXJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3BtLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjAzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9wbS5jCkBAIC0wLDAgKzEsMTMxMSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSAiaXBhX3BtLmgiCisjaW5jbHVkZSAiaXBhX2kuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNsaWVudF9zdGF0ZV90b19zdHJbSVBBX1BNX1NUQVRFX01BWF0gPSB7CisJX19zdHJpbmdpZnkoSVBBX1BNX0RFQUNUSVZBVEVEKSwKKwlfX3N0cmluZ2lmeShJUEFfUE1fREVBQ1RJVkFURV9JTl9QUk9HUkVTUyksCisJX19zdHJpbmdpZnkoSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTKSwKKwlfX3N0cmluZ2lmeShJUEFfUE1fQUNUSVZBVEVEKSwKKwlfX3N0cmluZ2lmeShJUEFfUE1fQUNUSVZBVEVEX1BFTkRJTkdfREVBQ1RJVkFUSU9OKSwKKwlfX3N0cmluZ2lmeShJUEFfUE1fQUNUSVZBVEVEX1RJTUVSX1NFVCksCisJX19zdHJpbmdpZnkoSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX1JFU0NIRURVTEUpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYV9wbV9ncm91cF90b19zdHJbSVBBX1BNX0dST1VQX01BWF0gPSB7CisJX19zdHJpbmdpZnkoSVBBX1BNX0dST1VQX0RFRkFVTFQpLAorCV9fc3RyaW5naWZ5KElQQV9QTV9HUk9VUF9BUFBTKSwKKwlfX3N0cmluZ2lmeShJUEFfUE1fR1JPVVBfTU9ERU0pLAorfTsKKworCisjZGVmaW5lIElQQV9QTV9EUlZfTkFNRSAiaXBhX3BtIgorCisjZGVmaW5lIElQQV9QTV9EQkcoZm10LCBhcmdzLi4uKSBcCisJZG8geyBcCisJCXByX2RlYnVnKElQQV9QTV9EUlZfTkFNRSAiICVzOiVkICIgZm10LCBcCisJCQlfX2Z1bmNfXywgX19MSU5FX18sICMjIGFyZ3MpOyBcCisJCUlQQV9JUENfTE9HR0lORyhpcGFfZ2V0X2lwY19sb2didWYoKSwgXAorCQkJSVBBX1BNX0RSVl9OQU1FICIgJXM6JWQgIiBmbXQsICMjIGFyZ3MpOyBcCisJCUlQQV9JUENfTE9HR0lORyhpcGFfZ2V0X2lwY19sb2didWZfbG93KCksIFwKKwkJCUlQQV9QTV9EUlZfTkFNRSAiICVzOiVkICIgZm10LCAjIyBhcmdzKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIElQQV9QTV9EQkdfTE9XKGZtdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlwcl9kZWJ1ZyhJUEFfUE1fRFJWX05BTUUgIiAlczolZCAiIGZtdCwgXAorCQkJX19mdW5jX18sIF9fTElORV9fLCAjIyBhcmdzKTsgXAorCQlJUEFfSVBDX0xPR0dJTkcoaXBhX2dldF9pcGNfbG9nYnVmX2xvdygpLCBcCisJCQlJUEFfUE1fRFJWX05BTUUgIiAlczolZCAiIGZtdCwgIyMgYXJncyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBJUEFfUE1fRVJSKGZtdCwgYXJncy4uLikgXAorCWRvIHsgXAorCQlwcl9lcnIoSVBBX1BNX0RSVl9OQU1FICIgJXM6JWQgIiBmbXQsIFwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgIyMgYXJncyk7IFwKKwkJSVBBX0lQQ19MT0dHSU5HKGlwYV9nZXRfaXBjX2xvZ2J1ZigpLCBcCisJCQlJUEFfUE1fRFJWX05BTUUgIiAlczolZCAiIGZtdCwgIyMgYXJncyk7IFwKKwkJSVBBX0lQQ19MT0dHSU5HKGlwYV9nZXRfaXBjX2xvZ2J1Zl9sb3coKSwgXAorCQkJSVBBX1BNX0RSVl9OQU1FICIgJXM6JWQgIiBmbXQsICMjIGFyZ3MpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSVBBX1BNX0RCR19TVEFURShoZGwsIG5hbWUsIHN0YXRlKSBcCisJSVBBX1BNX0RCR19MT1coIkNsaWVudFslZF0gJXM6ICVzXG4iLCBoZGwsIG5hbWUsIFwKKwkJY2xpZW50X3N0YXRlX3RvX3N0cltzdGF0ZV0pCisKKworI2lmIElQQV9QTV9NQVhfQ0xJRU5UUyA+IDMyCisjZXJyb3IgbWF4IGNsaWVudCBncmVhdGVyIHRoYW4gMzIgYWxsIGJpdG1hc2sgdHlwZXMgc2hvdWxkIGJlIGNoYW5nZWQKKyNlbmRpZgorCisvKgorICogc3RydWN0IGlwYV9wbV9leGNlcHRpb25fbGlzdCAtIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4Y2VwdGlvbgorICogQHBlbmRpbmc6IG51bWJlciBvZiBjbGllbnRzIGluIGV4Y2VwdGlvbiB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFkY3RpdmF0ZWQKKyAqIEBiaXRtYXNrOiBiaXRtYXNrIG9mIHRoZSBjbGllbnRzIGluIHRoZSBleGNlcHRpb24gYmFzZWQgb24gaGFuZGxlCisgKiBAdGhyZXNob2xkOiB0aGUgdGhyZXNob2xkIHZhbHVlcyBmb3IgdGhlIGV4Y2VwdGlvbgorICovCitzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbl9saXN0IHsKKwljaGFyIGNsaWVudHNbSVBBX1BNX01BWF9FWF9DTF07CisJaW50IHBlbmRpbmc7CisJdTMyIGJpdG1hc2s7CisJaW50IHRocmVzaG9sZFtJUEFfUE1fVEhSRVNIT0xEX01BWF07Cit9OworCisvKgorICogc3RydWN0IGNsa19zY2FsaW5nX2RiIC0gaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhyZXNoaG9sZHMgYW5kIGV4Y2VwdGlvbnMKKyAqIEBsb2NrOiBsb2NrIHRoZSBiaXRtYXNrcyBhbmQgdGhyZXNob2xkcworICogQGV4Y2VwdGlvbl9saXN0OiBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMKKyAqIEB3b3JrOiB3b3JrIGZvciBjbG9jayBzY2FsaW5nIGFsZ29yaXRobQorICogQGFjdGl2ZV9jbGllbnRfYml0bWFzazogdGhlIGJpdHMgcmVwcmVzZW50IGhhbmRsZXMgaW4gdGhlIGNsaWVudHMgYXJyYXkgdGhhdAorICogY29udGFpbiBub24tbnVsbCBjbGllbnQKKyAqIEB0aHJlc2hvbGRfc2l6ZTogc2l6ZSBvZiB0aGUgdGhyb3VnaHB1dCB0aHJlc2hvbGQKKyAqIEBleGNlcHRpb25fc2l6ZTogc2l6ZSBvZiB0aGUgZXhjZXB0aW9uIGxpc3QKKyAqIEBjdXJfdm90ZTogaWR4IG9mIHRoZSB0aHJlc2hvbGQKKyAqIEBkZWZhdWx0X3RocmVzaG9sZDogdGhlIHRocmVzaG9sZHMgdXNlZCBpZiBubyBleGNlcHRpb24gcGFzc2VzCisgKiBAY3VycmVudF90aHJlc2hvbGQ6IHRoZSBjdXJyZW50IHRocmVzaG9sZCBvZiB0aGUgY2xvY2sgcGxhbgorICovCitzdHJ1Y3QgY2xrX3NjYWxpbmdfZGIgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbl9saXN0IGV4Y2VwdGlvbl9saXN0W0lQQV9QTV9FWENFUFRJT05fTUFYXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwl1MzIgYWN0aXZlX2NsaWVudF9iaXRtYXNrOworCWludCB0aHJlc2hvbGRfc2l6ZTsKKwlpbnQgZXhjZXB0aW9uX3NpemU7CisJaW50IGN1cl92b3RlOworCWludCBkZWZhdWx0X3RocmVzaG9sZFtJUEFfUE1fVEhSRVNIT0xEX01BWF07CisJaW50ICpjdXJyZW50X3RocmVzaG9sZDsKK307CisKKy8qCisgKiBpcGFfcG0gc3RhdGUgbmFtZXMKKyAqCisgKiBUaW1lciBmcmVlIHN0YXRlczoKKyAqIEBJUEFfUE1fREVBQ1RJVkFURUQ6IGNsaWVudCBzdGFydGluZyBzdGF0ZSB3aGVuIHJlZ2lzdGVyZWQKKyAqIEBJUEFfUE1fREVBQ1RJVkFURV9JTl9QUk9HUkVTUzogZGVhY3RpdmF0ZSB3YXMgY2FsbGVkIGluIHByb2dyZXNzIG9mIGEgY2xpZW50CisgKgkJCQkgICBhY3RpdmF0aW5nCisgKiBASVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTOiBjbGllbnQgaXMgYmVpbmcgYWN0aXZhdGVkIGJ5IHdvcmtfcXVldWUKKyAqIEBJUEFfUE1fQUNUSVZBVEVEOiBjbGllbnQgaXMgYWN0aXZhdGVkIHdpdGhvdXQgYW55IHRpbWVycworICoKKyAqIFRpbWVyIHNldCBzdGF0ZXM6CisgKiBASVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX0RFQUNUSVZBVElPTjogbW92ZXMgdG8gZGVhY3RpdmF0ZSBvbmNlIHRpbWVyIHBhc3MKKyAqIEBJUEFfUE1fQUNUSVZBVEVEX1RJTUVSX1NFVDogY2xpZW50IHdhcyBhY3RpdmF0ZWQgd2hpbGUgdGltZXIgd2FzIHNldCwgc28KKyAqCQkJIHdoZW4gdGhlIHRpbWVyIHBhc3MsIGNsaWVudCB3aWxsIHN0aWxsIGJlIGFjdGl2YXRlZAorICpASVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX1JFU0NIRURVTEU6IHN0YXRlIHNpZ25pZnlpbmcgZXh0ZW5kZWQgdGltZXIgd2hlbgorICogICAgICAgICAgICAgYSBjbGllbnQgaXMgZGVmZXJyZWRfZGVhY3RpdmF0ZWQgd2hlbiBhIHRpbWUgcmlzIHN0aWxsIGFjdGl2ZQorICovCitlbnVtIGlwYV9wbV9zdGF0ZSB7CisJSVBBX1BNX0RFQUNUSVZBVEVELAorCUlQQV9QTV9ERUFDVElWQVRFX0lOX1BST0dSRVNTLAorCUlQQV9QTV9BQ1RJVkFURV9JTl9QUk9HUkVTUywKKwlJUEFfUE1fQUNUSVZBVEVELAorCUlQQV9QTV9BQ1RJVkFURURfUEVORElOR19ERUFDVElWQVRJT04sCisJSVBBX1BNX0FDVElWQVRFRF9USU1FUl9TRVQsCisJSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX1JFU0NIRURVTEUsCit9OworCisjZGVmaW5lIElQQV9QTV9TVEFURV9BQ1RJVkUoc3RhdGUpIFwKKwkoc3RhdGUgPT0gSVBBX1BNX0FDVElWQVRFRCB8fFwKKwkJc3RhdGUgPT0gSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX0RFQUNUSVZBVElPTiB8fFwKKwkJc3RhdGUgID09IElQQV9QTV9BQ1RJVkFURURfVElNRVJfU0VUIHx8XAorCQlzdGF0ZSA9PSBJUEFfUE1fQUNUSVZBVEVEX1BFTkRJTkdfUkVTQ0hFRFVMRSkKKworI2RlZmluZSBJUEFfUE1fU1RBVEVfSU5fUFJPR1JFU1Moc3RhdGUpIFwKKwkoc3RhdGUgPT0gSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTIFwKKwkJfHwgc3RhdGUgPT0gSVBBX1BNX0RFQUNUSVZBVEVfSU5fUFJPR1JFU1MpCisKKy8qCisgKiBzdHJ1Y3QgaXBhX3BtX2NsaWVudCAtIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgSVBBIGNsaWVudAorICogQG5hbWU6IHN0cmluZyBuYW1lIG9mIHRoZSBjbGllbnQKKyAqIEBjYWxsYmFjazogcG9pbnRlciB0byB0aGUgY2xpZW50J3MgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBjYWxsYmFja19wYXJhbXM6IHBvaW50ZXIgdG8gdGhlIGNsaWVudCdzIGNhbGxiYWNrIHBhcmFtZXRlcnMKKyAqIEBzdGF0ZTogQWN0aXZhdGlvbiBzdGF0ZSBvZiB0aGUgY2xpZW50CisgKiBAc2tpcF9jbGtfdm90ZTogMCBpZiBjbGllbnQgdm90ZXMgZm9yIGNsb2NrIHdoZW4gYWN0aXZhdGVkLCAxIGlmIG5vIHZvdGUKKyAqIEBncm91cDogdGhlIGlwYV9wbV9ncm91cCB0aGUgY2xpZW50IGJlbG9uZ3MgdG8KKyAqIEBoZGw6IGhhbmRsZSBvZiB0aGUgY2xpZW50CisgKiBAdGhyb3VnaHB1dDogdGhlIHRocm91Z2hwdXQgb2YgdGhlIGNsaWVudCBmb3IgY2xvY2sgc2NhbGluZworICogQHN0YXRlX2xvY2s6IHNwaW5sb2NrIHRvIGxvY2sgdGhlIHBtX3N0YXRlcworICogQGFjdGl2YXRlX3dvcms6IHdvcmsgZm9yIGFjdGl2YXRlIChibG9ja2luZyBjYXNlKQorICogQGRlYWN0aXZhdGUgd29yazogZGVsYXllZCB3b3JrIGZvciBkZWZlcnJlZF9kZWFjdGl2YXRlIGZ1bmN0aW9uCisgKiBAY29tcGxldGU6IGdlbmVyaWMgd2FpdC1mb3ItY29tcGxldGlvbiBoYW5kbGVyCisgKi8KK3N0cnVjdCBpcGFfcG1fY2xpZW50IHsKKwljaGFyIG5hbWVbSVBBX1BNX01BWF9FWF9DTF07CisJdm9pZCAoKmNhbGxiYWNrKSh2b2lkKiwgZW51bSBpcGFfcG1fY2JfZXZlbnQpOworCXZvaWQgKmNhbGxiYWNrX3BhcmFtczsKKwllbnVtIGlwYV9wbV9zdGF0ZSBzdGF0ZTsKKwlib29sIHNraXBfY2xrX3ZvdGU7CisJaW50IGdyb3VwOworCWludCBoZGw7CisJaW50IHRocm91Z2hwdXQ7CisJc3BpbmxvY2tfdCBzdGF0ZV9sb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhY3RpdmF0ZV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVhY3RpdmF0ZV93b3JrOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOworfTsKKworLyoKKyAqIHN0cnVjdCBpcGFfcG1fY3R4IC0gZ2xvYmFsIGN0eCB0aGF0IHdpbGwgaG9sZCB0aGUgY2xpZW50IGFycmF5cyBhbmQgdHB1dCBpbmZvCisgKiBAY2xpZW50czogYXJyYXkgdG8gdGhlIGNsaWVudHMgd2l0aCB0aGUgaGFuZGxlIGFzIGl0cyBpbmRleAorICogQGNsaWVudHNfYnlfcGlwZTogYXJyYXkgdG8gdGhlIGNsaWVudHMgd2l0aCBlbmRwb2ludCBhcyB0aGUgaW5kZXgKKyAqIEB3cTogd29yayBxdWV1ZSBmb3IgZGVmZXJyZWQgZGVhY3RpdmF0ZSwgYWN0aXZhdGUsIGFuZCBjbGtfc2NhbGluZyB3b3JrCisgOCBAY2xrX3NjYWxpbmc6IHBvaW50ZXIgdG8gY2xvY2sgc2NhbGluZyBkYXRhYmFzZQorICogQGNsaWVudF9tdXRleDogZ2xvYmFsIG11dGV4IHRvICBsb2NrIHRoZSBjbGllbnQgYXJyYXlzCisgKiBAYWdncmFnYXRlZF90cHV0OiBhZ2dyYWdhdGVkIHRwdXQgdmFsdWUgb2YgYWxsIHZhbGlkIGFjdGl2YXRlZCBjbGllbnRzCisgKiBAZ3JvdXBfdHB1dDogY29tYmluZWQgdGhyb3VnaHB1dCBmb3IgdGhlIGdyb3VwcworICovCitzdHJ1Y3QgaXBhX3BtX2N0eCB7CisJc3RydWN0IGlwYV9wbV9jbGllbnQgKmNsaWVudHNbSVBBX1BNX01BWF9DTElFTlRTXTsKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50c19ieV9waXBlW0lQQTNfTUFYX05VTV9QSVBFU107CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCBjbGtfc2NhbGluZ19kYiBjbGtfc2NhbGluZzsKKwlzdHJ1Y3QgbXV0ZXggY2xpZW50X211dGV4OworCWludCBhZ2dyZWdhdGVkX3RwdXQ7CisJaW50IGdyb3VwX3RwdXRbSVBBX1BNX0dST1VQX01BWF07Cit9OworCitzdGF0aWMgc3RydWN0IGlwYV9wbV9jdHggKmlwYV9wbV9jdHg7CisKKy8qKgorICogcG9wX21heF9mcm9tX2FycmF5KCkgLXBvcCB0aGUgbWF4IGFuZCBtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgdG8gd2hlcmUgdGhlCisgKiBtYXggd2FzIHBvcHBlZAorICogQGFycjogYXJyYXkgdG8gYmUgc2VhcmNoZWQgZm9yIG1heAorICogQG46IHNpemUgb2YgdGhlIGFycmF5CisgKgorICogUmV0dXJuczogbWF4IHZhbHVlIG9mIHRoZSBhcnJheQorICovCitzdGF0aWMgaW50IHBvcF9tYXhfZnJvbV9hcnJheShpbnQgKmFyciwgaW50ICpuKQoreworCWludCBpOworCWludCBtYXgsIG1heF9pZHg7CisKKwltYXhfaWR4ID0gKm4gLSAxOworCW1heCA9IDA7CisKKwlpZiAoKm4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKm47IGkrKykgeworCQlpZiAoYXJyW2ldID4gbWF4KSB7CisJCQltYXggPSBhcnJbaV07CisJCQltYXhfaWR4ID0gaTsKKwkJfQorCX0KKwkoKm4pLS07CisJYXJyW21heF9pZHhdID0gYXJyWypuXTsKKworCXJldHVybiBtYXg7Cit9CisKKy8qKgorICogY2FsY3VsYXRlX3Rocm91Z2hwdXQoKSAtIGNhbGN1bGF0ZSB0aGUgYWdncmVnYXRlZCB0aHJvdWdocHV0CisgKiBiYXNlZCBvbiBhY3RpdmUgY2xpZW50cworICoKKyAqIFJldHVybnM6IGFnZ3JlZ2F0ZWQgdHB1dCB2YWx1ZQorICovCitzdGF0aWMgaW50IGNhbGN1bGF0ZV90aHJvdWdocHV0KHZvaWQpCit7CisJaW50IGNsaWVudF90cHV0W0lQQV9QTV9NQVhfQ0xJRU5UU10gPSB7IDAgfTsKKwlib29sIGdyb3VwX3ZvdGVkW0lQQV9QTV9HUk9VUF9NQVhdID0geyBmYWxzZSB9OworCWludCBpLCBuOworCWludCBtYXgsIHNlY29uZF9tYXgsIGFnZ3JlZ2F0ZWRfdHB1dDsKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCisJLyogQ3JlYXRlIGEgYmFzaWMgYXJyYXkgdG8gaG9sZCB0aHJvdWdocHV0cyovCisJZm9yIChpID0gMCwgbiA9IDA7IGkgPCBJUEFfUE1fTUFYX0NMSUVOVFM7IGkrKykgeworCQljbGllbnQgPSBpcGFfcG1fY3R4LT5jbGllbnRzW2ldOworCQlpZiAoY2xpZW50ICE9IE5VTEwgJiYgSVBBX1BNX1NUQVRFX0FDVElWRShjbGllbnQtPnN0YXRlKSkgeworCQkJLyogZGVmYXVsdCBjYXNlICovCisJCQlpZiAoY2xpZW50LT5ncm91cCA9PSBJUEFfUE1fR1JPVVBfREVGQVVMVCkgeworCQkJCWNsaWVudF90cHV0W24rK10gPSBjbGllbnQtPnRocm91Z2hwdXQ7CisJCQl9IGVsc2UgaWYgKGdyb3VwX3ZvdGVkW2NsaWVudC0+Z3JvdXBdID09IGZhbHNlKSB7CisJCQkJY2xpZW50X3RwdXRbbisrXSA9IGlwYV9wbV9jdHgtPmdyb3VwX3RwdXQKKwkJCQkJW2NsaWVudC0+Z3JvdXBdOworCQkJCWdyb3VwX3ZvdGVkW2NsaWVudC0+Z3JvdXBdID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKwkvKnRoZSBhcnJheSB3aWxsIG9ubHkgdXNlIG4rMSBzcG90cy4gbiB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHVzZWQqLworCisJYWdncmVnYXRlZF90cHV0ID0gMDsKKworCS8qKgorCSAqIHRocm91Z2hwdXQgYWxnb3JpdGhtOgorCSAqIDEpIHBvcCB0aGUgbWF4IGFuZCBzZWNvbmRfbWF4CisJICogMikgYWRkIHRoZSAybmQgbWF4IHRvIGFnZ3JlZ2F0ZWQgdHB1dAorCSAqIDMpIGluc2VydCB0aGUgdmFsdWUgb2YgbWF4IC0gMm5kIG1heAorCSAqIDQpIHJlcGVhdCB1bnRpbCBhcnJheSBpcyBvZiBzaXplIDEKKwkgKi8KKwl3aGlsZSAobiA+IDEpIHsKKwkJbWF4ID0gcG9wX21heF9mcm9tX2FycmF5KGNsaWVudF90cHV0LCAmbik7CisJCXNlY29uZF9tYXggPSBwb3BfbWF4X2Zyb21fYXJyYXkoY2xpZW50X3RwdXQsICZuKTsKKwkJY2xpZW50X3RwdXRbbisrXSA9IG1heCAtIHNlY29uZF9tYXg7CisJCWFnZ3JlZ2F0ZWRfdHB1dCArPSBzZWNvbmRfbWF4OworCX0KKworCUlQQV9QTV9EQkdfTE9XKCJBZ2dyZWdhdGVkIHRocm91Z2hwdXQ6ICVkXG4iLCBhZ2dyZWdhdGVkX3RwdXQpOworCisJcmV0dXJuIGFnZ3JlZ2F0ZWRfdHB1dDsKK30KKworLyoqCisgKiBkZWFjdGl2YXRlX2NsaWVudCgpIC0gdHVybiBvZmYgdGhlIGJpdCBpbiB0aGUgYWN0aXZlIGNsaWVudCBiaXRtYXNrIGJhc2VkIG9uCisgKiB0aGUgaGFuZGxlIHBhc3NlZCBpbgorICogQGhkbDogVGhlIGluZGV4IG9mIHRoZSBjbGllbnQgdG8gYmUgZGVhY3RpdmF0ZWQKKyAqLworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9jbGllbnQodTMyIGhkbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmxvY2ssIGZsYWdzKTsKKwlpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5hY3RpdmVfY2xpZW50X2JpdG1hc2sgJj0gfigxIDw8IGhkbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmcubG9jaywgZmxhZ3MpOworCUlQQV9QTV9EQkdfTE9XKCJhY3RpdmUgYml0bWFzazogJXhcbiIsCisJCWlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmFjdGl2ZV9jbGllbnRfYml0bWFzayk7Cit9CisKKy8qKgorICogYWN0aXZhdGVfY2xpZW50KCkgLSB0dXJuIG9uIHRoZSBiaXQgaW4gdGhlIGFjdGl2ZSBjbGllbnQgYml0bWFzayBiYXNlZCBvbgorICogdGhlIGhhbmRsZSBwYXNzZWQgaW4KKyAqIEBoZGw6IFRoZSBpbmRleCBvZiB0aGUgY2xpZW50IHRvIGJlIGFjdGl2YXRlZAorICovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9jbGllbnQodTMyIGhkbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmxvY2ssIGZsYWdzKTsKKwlpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5hY3RpdmVfY2xpZW50X2JpdG1hc2sgfD0gKDEgPDwgaGRsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5sb2NrLCBmbGFncyk7CisJSVBBX1BNX0RCR19MT1coImFjdGl2ZSBiaXRtYXNrOiAleFxuIiwKKwkJaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmcuYWN0aXZlX2NsaWVudF9iaXRtYXNrKTsKK30KKworLyoqCisgKiBkZWFjdGl2YXRlX2NsaWVudCgpIC0gZ2V0IHRocmVzaG9sZAorICoKKyAqIFJldHVybnM6IHRocmVzaG9sZCBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgcGFzc2VzIG9yIGRlZmF1bHQgaWYgbm9uZSBwYXNzCisgKi8KK3N0YXRpYyB2b2lkIHNldF9jdXJyZW50X3RocmVzaG9sZCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjbGtfc2NhbGluZ19kYiAqY2xrOworCXN0cnVjdCBpcGFfcG1fZXhjZXB0aW9uX2xpc3QgKmV4Y2VwdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2xrID0gJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2xrLT5leGNlcHRpb25fc2l6ZTsgaSsrKSB7CisJCWV4Y2VwdGlvbiA9ICZjbGstPmV4Y2VwdGlvbl9saXN0W2ldOworCQlpZiAoZXhjZXB0aW9uLT5wZW5kaW5nID09IDAgJiYgKGV4Y2VwdGlvbi0+Yml0bWFzaworCQkJJiB+Y2xrLT5hY3RpdmVfY2xpZW50X2JpdG1hc2spID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmxvY2ssCisJCQkJIGZsYWdzKTsKKwkJCWNsay0+Y3VycmVudF90aHJlc2hvbGQgPSBleGNlcHRpb24tPnRocmVzaG9sZDsKKwkJCUlQQV9QTV9EQkcoIkV4Y2VwdGlvbiAlZCBzZXRcbiIsIGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCWNsay0+Y3VycmVudF90aHJlc2hvbGQgPSBjbGstPmRlZmF1bHRfdGhyZXNob2xkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBkb19jbGtfc2NhbGluZygpIC0gc2V0IHRoZSBjbG9jayBiYXNlZCBvbiB0aGUgYWN0aXZhdGVkIGNsaWVudHMKKyAqCisgKiBSZXR1cm5zOiAwIGlmIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGRvX2Nsa19zY2FsaW5nKHZvaWQpCit7CisJaW50IGksIHRwdXQ7CisJaW50IG5ld190aF9pZHggPSAxOworCXN0cnVjdCBjbGtfc2NhbGluZ19kYiAqY2xrX3NjYWxpbmc7CisKKwljbGtfc2NhbGluZyA9ICZpcGFfcG1fY3R4LT5jbGtfc2NhbGluZzsKKworCW11dGV4X2xvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJSVBBX1BNX0RCRygiY2xvY2sgc2NhbGluZyBzdGFydGVkXG4iKTsKKwl0cHV0ID0gY2FsY3VsYXRlX3Rocm91Z2hwdXQoKTsKKwlpcGFfcG1fY3R4LT5hZ2dyZWdhdGVkX3RwdXQgPSB0cHV0OworCXNldF9jdXJyZW50X3RocmVzaG9sZCgpOworCisJbXV0ZXhfdW5sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IGNsa19zY2FsaW5nLT50aHJlc2hvbGRfc2l6ZTsgaSsrKSB7CisJCWlmICh0cHV0ID4gY2xrX3NjYWxpbmctPmN1cnJlbnRfdGhyZXNob2xkW2ldKQorCQkJbmV3X3RoX2lkeCsrOworCX0KKworCUlQQV9QTV9EQkcoIm9sZCBpZHggd2FzIGF0ICVkXG4iLCBpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5jdXJfdm90ZSk7CisKKworCWlmIChpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5jdXJfdm90ZSAhPSBuZXdfdGhfaWR4KSB7CisJCWlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmN1cl92b3RlID0gbmV3X3RoX2lkeDsKKwkJaXBhM19zZXRfY2xvY2tfcGxhbl9mcm9tX3BtKGlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmN1cl92b3RlKTsKKwl9CisKKwlJUEFfUE1fREJHKCJuZXcgaWR4IGlzIGF0ICVkXG4iLCBpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5jdXJfdm90ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjbG9ja19zY2FsaW5nX2Z1bmMoKSAtIHNldCB0aGUgY2xvY2sgb24gYSB3b3JrIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrX3NjYWxpbmdfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZG9fY2xrX3NjYWxpbmcoKTsKK30KKworLyoqCisgKiBhY3RpdmF0ZV93b3JrX2Z1bmMgLSBhY3RpdmF0ZSBhIGNsaWVudCBhbmQgdm90ZSBmb3IgY2xvY2sgb24gYSB3b3JrIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIGFjdGl2YXRlX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlwYV9wbV9jbGllbnQgKmNsaWVudDsKKwlib29sIGRlY19jbGsgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2xpZW50ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcGFfcG1fY2xpZW50LCBhY3RpdmF0ZV93b3JrKTsKKwlpZiAoIWNsaWVudC0+c2tpcF9jbGtfdm90ZSkKKwkJSVBBX0FDVElWRV9DTElFTlRTX0lOQ19TUEVDSUFMKGNsaWVudC0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwlpZiAoY2xpZW50LT5zdGF0ZSA9PSBJUEFfUE1fQUNUSVZBVEVfSU5fUFJPR1JFU1MpIHsKKwkJY2xpZW50LT5zdGF0ZSA9IElQQV9QTV9BQ1RJVkFURUQ7CisJfSBlbHNlIGlmIChjbGllbnQtPnN0YXRlID09IElQQV9QTV9ERUFDVElWQVRFX0lOX1BST0dSRVNTKSB7CisJCWNsaWVudC0+c3RhdGUgPSBJUEFfUE1fREVBQ1RJVkFURUQ7CisJCWRlY19jbGsgPSB0cnVlOworCX0gZWxzZSB7CisJCUlQQV9QTV9FUlIoInVuZXhwZWN0ZWQgc3RhdGUgJWRcbiIsIGNsaWVudC0+c3RhdGUpOworCQlXQVJOX09OKDEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCWNvbXBsZXRlX2FsbCgmY2xpZW50LT5jb21wbGV0ZSk7CisKKwlpZiAoZGVjX2NsaykgeworCQlpcGFfc2V0X3RhZ19wcm9jZXNzX2JlZm9yZV9nYXRpbmcodHJ1ZSk7CisJCWlmICghY2xpZW50LT5za2lwX2Nsa192b3RlKQorCQkJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19TUEVDSUFMKGNsaWVudC0+bmFtZSk7CisKKwkJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwkJcmV0dXJuOworCX0KKworCWFjdGl2YXRlX2NsaWVudChjbGllbnQtPmhkbCk7CisKKwltdXRleF9sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCWlmIChjbGllbnQtPmNhbGxiYWNrKSB7CisJCWNsaWVudC0+Y2FsbGJhY2soY2xpZW50LT5jYWxsYmFja19wYXJhbXMsCisJCQlJUEFfUE1fQ0xJRU5UX0FDVElWQVRFRCk7CisJfSBlbHNlIHsKKwkJSVBBX1BNX0VSUigiY2xpZW50IGhhcyBubyBjYWxsYmFjayIpOworCQlXQVJOX09OKDEpOworCX0KKwltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwlJUEFfUE1fREJHX1NUQVRFKGNsaWVudC0+aGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCWRvX2Nsa19zY2FsaW5nKCk7Cit9CisKKy8qKgorICogZGVsYXllZF9kZWZlcnJlZF9kZWFjdGl2YXRlX3dvcmtfZnVuYyAtIGRlZmVycmVkIGRlYWN0aXZhdGUgb24gYSB3b3JrIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIGRlbGF5ZWRfZGVmZXJyZWRfZGVhY3RpdmF0ZV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOworCXN0cnVjdCBpcGFfcG1fY2xpZW50ICpjbGllbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCWNsaWVudCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGlwYV9wbV9jbGllbnQsIGRlYWN0aXZhdGVfd29yayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwlzd2l0Y2ggKGNsaWVudC0+c3RhdGUpIHsKKwljYXNlIElQQV9QTV9BQ1RJVkFURURfVElNRVJfU0VUOgorCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFRDsKKwkJZ290byBiYWlsOworCWNhc2UgSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX1JFU0NIRURVTEU6CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhpcGFfcG1fY3R4LT53cSwgJmNsaWVudC0+ZGVhY3RpdmF0ZV93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhJUEFfUE1fREVGRVJSRURfVElNRU9VVCkpOworCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX0RFQUNUSVZBVElPTjsKKwkJZ290byBiYWlsOworCWNhc2UgSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX0RFQUNUSVZBVElPTjoKKwkJY2xpZW50LT5zdGF0ZSA9IElQQV9QTV9ERUFDVElWQVRFRDsKKwkJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCWlwYV9zZXRfdGFnX3Byb2Nlc3NfYmVmb3JlX2dhdGluZyh0cnVlKTsKKwkJaWYgKCFjbGllbnQtPnNraXBfY2xrX3ZvdGUpCisJCQlJUEFfQUNUSVZFX0NMSUVOVFNfREVDX1NQRUNJQUwoY2xpZW50LT5uYW1lKTsKKworCQlkZWFjdGl2YXRlX2NsaWVudChjbGllbnQtPmhkbCk7CisJCWRvX2Nsa19zY2FsaW5nKCk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlJUEFfUE1fRVJSKCJ1bmV4cGVjdGVkIHN0YXRlICVkXG4iLCBjbGllbnQtPnN0YXRlKTsKKwkJV0FSTl9PTigxKTsKKwkJZ290byBiYWlsOworCX0KKworYmFpbDoKKwlJUEFfUE1fREJHX1NUQVRFKGNsaWVudC0+aGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGZpbmRfbmV4dF9vcGVuX2FycmF5X2VsZW1lbnQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgbjsKKworCW4gPSAtRU5PQlVGUzsKKworCWZvciAoaSA9IElQQV9QTV9NQVhfQ0xJRU5UUyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChpcGFfcG1fY3R4LT5jbGllbnRzW2ldID09IE5VTEwpIHsKKwkJCW4gPSBpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RybGVuKG5hbWUpID09IHN0cmxlbihpcGFfcG1fY3R4LT5jbGllbnRzW2ldLT5uYW1lKSkKKwkJCWlmICghc3RyY21wKG5hbWUsIGlwYV9wbV9jdHgtPmNsaWVudHNbaV0tPm5hbWUpKQorCQkJCXJldHVybiAtRUVYSVNUOworCX0KKwlyZXR1cm4gbjsKK30KKworLyoqCisgKiBhZGRfY2xpZW50X3RvX2V4Y2VwdGlvbl9saXN0KCkgLSBhZGQgY2xpZW50IHRvIHRoZSBleGNlcHRpb24gbGlzdCBhbmQKKyAqIHVwZGF0ZSBwZW5kaW5nIGlmIG5lY2Vzc2FyeQorICogQGhkbDogaW5kZXggb2YgdGhlIElQQSBjbGllbnQKKyAqCisgKiBSZXR1cm5zOiAwIGlmIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGFkZF9jbGllbnRfdG9fZXhjZXB0aW9uX2xpc3QodTMyIGhkbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbl9saXN0ICpleGNlcHRpb247CisKKwltdXRleF9sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5leGNlcHRpb25fc2l6ZTsgaSsrKSB7CisJCWV4Y2VwdGlvbiA9ICZpcGFfcG1fY3R4LT5jbGtfc2NhbGluZy5leGNlcHRpb25fbGlzdFtpXTsKKwkJaWYgKHN0cm5zdHIoZXhjZXB0aW9uLT5jbGllbnRzLCBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0tPm5hbWUsCisJCQlzdHJsZW4oZXhjZXB0aW9uLT5jbGllbnRzKSkpIHsKKwkJCWV4Y2VwdGlvbi0+cGVuZGluZy0tOworCisJCQlpZiAoZXhjZXB0aW9uLT5wZW5kaW5nIDwgMCkgeworCQkJCVdBUk5fT04oMSk7CisJCQkJZXhjZXB0aW9uLT5wZW5kaW5nID0gMDsKKwkJCQltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJCWV4Y2VwdGlvbi0+Yml0bWFzayB8PSAoMSA8PCBoZGwpOworCQl9CisJfQorCUlQQV9QTV9EQkcoIiVzIGFkZGVkIHRvIGV4Y2VwdGlvbiBsaXN0XG4iLAorCQlpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0tPm5hbWUpOworCW11dGV4X3VubG9jaygmaXBhX3BtX2N0eC0+Y2xpZW50X211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHJlbW92ZV9jbGllbnRfdG9fZXhjZXB0aW9uX2xpc3QoKSAtIHJlbW92ZSBjbGllbnQgZnJvbSB0aGUgZXhjZXB0aW9uIGxpc3QgYW5kCisgKiB1cGRhdGUgcGVuZGluZyBpZiBuZWNlc3NhcnkKKyAqIEBoZGw6IGluZGV4IG9mIHRoZSBJUEEgY2xpZW50CisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCByZW1vdmVfY2xpZW50X2Zyb21fZXhjZXB0aW9uX2xpc3QodTMyIGhkbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbl9saXN0ICpleGNlcHRpb247CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmcuZXhjZXB0aW9uX3NpemU7IGkrKykgeworCQlleGNlcHRpb24gPSAmaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmcuZXhjZXB0aW9uX2xpc3RbaV07CisJCWlmIChleGNlcHRpb24tPmJpdG1hc2sgJiAoMSA8PCBoZGwpKSB7CisJCQlleGNlcHRpb24tPnBlbmRpbmcrKzsKKwkJCWV4Y2VwdGlvbi0+Yml0bWFzayAmPSB+KDEgPDwgaGRsKTsKKwkJfQorCX0KKwlJUEFfUE1fREJHKCJDbGllbnQgJWQgcmVtb3ZlZCBmcm9tIGV4Y2VwdGlvbiBsaXN0XG4iLCBoZGwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXBhX3BtX2luaXQoKSAtIGluaXRpYWxpemUgIElQQSBQTSBDb21wb25lbnRzCisgKiBAaXBhX3BtX2luaXRfcGFyYW1zOiBwYXJhbWV0ZXJzIG5lZWRlZCB0byBmaWxsIGV4Y2VwdGlvbnMgYW5kIHRocmVzaG9sZHMKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworaW50IGlwYV9wbV9pbml0KHN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgY2xrX3NjYWxpbmdfZGIgKmNsa19zY2FsaW5nOworCisJaWYgKHBhcmFtcyA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkludmFsaWQgUGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBhcmFtcy0+dGhyZXNob2xkX3NpemUgPD0gMAorCQl8fCBwYXJhbXMtPnRocmVzaG9sZF9zaXplID4gSVBBX1BNX1RIUkVTSE9MRF9NQVgpIHsKKwkJSVBBX1BNX0VSUigiSW52YWxpZCB0aHJlc2hvbGQgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwYXJhbXMtPmV4Y2VwdGlvbl9zaXplIDwgMAorCQl8fCBwYXJhbXMtPmV4Y2VwdGlvbl9zaXplID4gSVBBX1BNX0VYQ0VQVElPTl9NQVgpIHsKKwkJSVBBX1BNX0VSUigiSW52YWxpZCBleGNlcHRpb24gc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUlQQV9QTV9EQkcoIklQQSBQTSBpbml0aWFsaXphdGlvbiBzdGFydGVkXG4iKTsKKworCWlmIChpcGFfcG1fY3R4ICE9IE5VTEwpIHsKKwkJSVBBX1BNX0VSUigiQWxyZWFkeSBpbml0aWFsaXplZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisKKwlpcGFfcG1fY3R4ID0ga3phbGxvYyhzaXplb2YoKmlwYV9wbV9jdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlwYV9wbV9jdHgpIHsKKwkJSVBBX1BNX0VSUigiOmt6YWxsb2MgZXJyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlwYV9wbV9jdHgtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImlwYV9wbV9hY3RpdmF0ZSIpOworCWlmICghaXBhX3BtX2N0eC0+d3EpIHsKKwkJSVBBX1BNX0VSUigiY3JlYXRlIHdvcmtxdWV1ZSBmYWlsZWRcbiIpOworCQlrZnJlZShpcGFfcG1fY3R4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXV0ZXhfaW5pdCgmaXBhX3BtX2N0eC0+Y2xpZW50X211dGV4KTsKKworCS8qIFBvcHVsYXRlIGFuZCBpbml0IGxvY2tzIGluIGNsa19zY2FsaW5nX2RiICovCisJY2xrX3NjYWxpbmcgPSAmaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmc7CisJc3Bpbl9sb2NrX2luaXQoJmNsa19zY2FsaW5nLT5sb2NrKTsKKwljbGtfc2NhbGluZy0+dGhyZXNob2xkX3NpemUgPSBwYXJhbXMtPnRocmVzaG9sZF9zaXplOworCWNsa19zY2FsaW5nLT5leGNlcHRpb25fc2l6ZSA9IHBhcmFtcy0+ZXhjZXB0aW9uX3NpemU7CisJSU5JVF9XT1JLKCZjbGtfc2NhbGluZy0+d29yaywgY2xvY2tfc2NhbGluZ19mdW5jKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnRocmVzaG9sZF9zaXplOyBpKyspCisJCWNsa19zY2FsaW5nLT5kZWZhdWx0X3RocmVzaG9sZFtpXSA9CisJCQlwYXJhbXMtPmRlZmF1bHRfdGhyZXNob2xkW2ldOworCisJLyogUG9wdWxhdGUgZXhjZXB0aW9uIGxpc3QqLworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPmV4Y2VwdGlvbl9zaXplOyBpKyspIHsKKwkJc3RybGNweShjbGtfc2NhbGluZy0+ZXhjZXB0aW9uX2xpc3RbaV0uY2xpZW50cywKKwkJCXBhcmFtcy0+ZXhjZXB0aW9uc1tpXS51c2VjYXNlLCBJUEFfUE1fTUFYX0VYX0NMKTsKKwkJSVBBX1BNX0RCRygiVXNlY2FzZTogJXNcbiIsIHBhcmFtcy0+ZXhjZXB0aW9uc1tpXS51c2VjYXNlKTsKKworCQkvKiBQYXJzZSB0aGUgY29tbWFzIHRvIGNvdW50IHRoZSBzaXplIG9mIHRoZSBjbGllbnRzICovCisJCWZvciAoaiA9IDA7IGogPCBJUEFfUE1fTUFYX0VYX0NMICYmCisJCQljbGtfc2NhbGluZy0+ZXhjZXB0aW9uX2xpc3RbaV0uY2xpZW50c1tqXTsgaisrKSB7CisJCQlpZiAoY2xrX3NjYWxpbmctPmV4Y2VwdGlvbl9saXN0W2ldLmNsaWVudHNbal0gPT0gJywnKQorCQkJCWNsa19zY2FsaW5nLT5leGNlcHRpb25fbGlzdFtpXS5wZW5kaW5nKys7CisJCX0KKworCQljbGtfc2NhbGluZy0+ZXhjZXB0aW9uX2xpc3RbaV0ucGVuZGluZysrOworCQlJUEFfUE1fREJHKCJQZW5kaW5nOiAlZFxuIiwgY2xrX3NjYWxpbmctPgorCQkJZXhjZXB0aW9uX2xpc3RbaV0ucGVuZGluZyk7CisKKwkJLyogcG9wdWxhdGUgdGhlIHRocmVzaG9sZCAqLworCQlmb3IgKGogPSAwOyBqIDwgcGFyYW1zLT50aHJlc2hvbGRfc2l6ZTsgaisrKSB7CisJCQljbGtfc2NhbGluZy0+ZXhjZXB0aW9uX2xpc3RbaV0udGhyZXNob2xkW2pdCisJCQk9IHBhcmFtcy0+ZXhjZXB0aW9uc1tpXS50aHJlc2hvbGRbal07CisJCX0KKworCX0KKwlJUEFfUE1fREJHKCJpbml0aWFsaXphdGlvbiBzdWNjZXNzIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlwYV9wbV9kZXN0cm95KHZvaWQpCit7CisJSVBBX1BNX0RCRygiSVBBIFBNIGRlc3Ryb3kgc3RhcnRlZFxuIik7CisKKwlpZiAoaXBhX3BtX2N0eCA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkFscmVhZHkgZGVzdHJveWVkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlkZXN0cm95X3dvcmtxdWV1ZShpcGFfcG1fY3R4LT53cSk7CisKKwlrZnJlZShpcGFfcG1fY3R4KTsKKwlpcGFfcG1fY3R4ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwYV9ybV9kZWxldGVfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGFuIElQQSBQTSBjbGllbnQgd2l0aCB0aGUgUE0KKyAqIEByZWdpc3Rlcl9wYXJhbXM6IHBhcmFtcyBmb3IgYSBjbGllbnQgbGlrZSB0aHJvdWdocHV0LCBjYWxsYmFjaywgZXRjLgorICogQGhkbDogaW50IHBvaW50ZXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYW4gaW5kZXggdG8gYWNjZXNzIHRoZSBjbGllbnQKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBTaWRlIGVmZmVjdHM6ICpoZGwgaXMgcmVwbGFjZWQgd2l0aCB0aGUgY2xpZW50IGluZGV4IG9yIC1FRVhJU1QgaWYKKyAqIGNsaWVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAqLworaW50IGlwYV9wbV9yZWdpc3RlcihzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyAqcGFyYW1zLCB1MzIgKmhkbCkKK3sKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCisJaWYgKHBhcmFtcyA9PSBOVUxMIHx8IGhkbCA9PSBOVUxMIHx8IHBhcmFtcy0+bmFtZSA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkludmFsaWQgUGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJSVBBX1BNX0RCRygiSVBBIFBNIHJlZ2lzdGVyaW5nIGNsaWVudFxuIik7CisKKwltdXRleF9sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCisJKmhkbCA9IGZpbmRfbmV4dF9vcGVuX2FycmF5X2VsZW1lbnQocGFyYW1zLT5uYW1lKTsKKworCWlmICgqaGRsID4gSVBBX0NMSUVOVF9NQVgpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCQlJUEFfUE1fRVJSKCJjbGllbnQgaXMgYWxyZWFkeSByZWdpc3RlcmVkIG9yIGFycmF5IGlzIGZ1bGxcbiIpOworCQlyZXR1cm4gKmhkbDsKKwl9CisKKwlpcGFfcG1fY3R4LT5jbGllbnRzWypoZGxdID0ga3phbGxvYyhzaXplb2YKKwkJKHN0cnVjdCBpcGFfcG1fY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcGFfcG1fY3R4LT5jbGllbnRzWypoZGxdKSB7CisJCW11dGV4X3VubG9jaygmaXBhX3BtX2N0eC0+Y2xpZW50X211dGV4KTsKKwkJSVBBX1BNX0VSUigiOmt6YWxsb2MgZXJyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwljbGllbnQgPSBpcGFfcG1fY3R4LT5jbGllbnRzWypoZGxdOworCisJc3Bpbl9sb2NrX2luaXQoJmNsaWVudC0+c3RhdGVfbG9jayk7CisKKwlJTklUX0RFTEFZRURfV09SSygmY2xpZW50LT5kZWFjdGl2YXRlX3dvcmssCisJCWRlbGF5ZWRfZGVmZXJyZWRfZGVhY3RpdmF0ZV93b3JrX2Z1bmMpOworCisJSU5JVF9XT1JLKCZjbGllbnQtPmFjdGl2YXRlX3dvcmssIGFjdGl2YXRlX3dvcmtfZnVuYyk7CisKKwkvKiBwb3B1bGF0ZSBmaWVsZHMgKi8KKwlzdHJsY3B5KGNsaWVudC0+bmFtZSwgcGFyYW1zLT5uYW1lLCBJUEFfUE1fTUFYX0VYX0NMKTsKKwljbGllbnQtPmNhbGxiYWNrID0gcGFyYW1zLT5jYWxsYmFjazsKKwljbGllbnQtPmNhbGxiYWNrX3BhcmFtcyA9IHBhcmFtcy0+dXNlcl9kYXRhOworCWNsaWVudC0+Z3JvdXAgPSBwYXJhbXMtPmdyb3VwOworCWNsaWVudC0+aGRsID0gKmhkbDsKKwljbGllbnQtPnNraXBfY2xrX3ZvdGUgPSBwYXJhbXMtPnNraXBfY2xrX3ZvdGU7CisKKwkvKiBhZGQgY2xpZW50IHRvIGV4Y2VwdGlvbiBsaXN0ICovCisJaWYgKGFkZF9jbGllbnRfdG9fZXhjZXB0aW9uX2xpc3QoKmhkbCkpIHsKKwkJaXBhX3BtX2RlcmVnaXN0ZXIoKmhkbCk7CisJCUlQQV9QTV9FUlIoIkZhaWwgdG8gYWRkIGNsaWVudCB0byBleGNlcHRpb25fbGlzdFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJSVBBX1BNX0RCRygiSVBBIFBNIGNsaWVudCByZWdpc3RlcmVkIHdpdGggaGFuZGxlICVkXG4iLCAqaGRsKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcGFfcG1fZGVyZWdpc3RlcigpIC0gZGVyZWdpc3RlciBJUEEgY2xpZW50IGZyb20gdGhlIFBNCisgKiBAaGRsOiBpbmRleCBvZiB0aGUgY2xpZW50IGluIHRoZSBhcnJheQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitpbnQgaXBhX3BtX2RlcmVnaXN0ZXIodTMyIGhkbCkKK3sKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaGRsID49IElQQV9QTV9NQVhfQ0xJRU5UUykgeworCQlJUEFfUE1fRVJSKCJJbnZhbGlkIFBhcmFtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXSA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkNsaWVudCBpcyBOdWxsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJSVBBX1BNX0RCRygiSVBBIFBNIGRlcmVnaXN0ZXJpbmcgY2xpZW50XG4iKTsKKworCWNsaWVudCA9IGlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKElQQV9QTV9TVEFURV9JTl9QUk9HUkVTUyhjbGllbnQtPnN0YXRlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY2xpZW50LT5jb21wbGV0ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoSVBBX1BNX1NUQVRFX0FDVElWRShjbGllbnQtPnN0YXRlKSkgeworCQlJUEFfUE1fREJHKCJBY3RpdmF0ZWQgY2xpZW50cyBjYW5ub3QgYmUgZGVyZWdpc3RlcmVkIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCW11dGV4X2xvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwkvKiBudWxsaWZ5IHBvaW50ZXJzIGluIHBpcGUgYXJyYXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVBBM19NQVhfTlVNX1BJUEVTOyBpKyspIHsKKwkJaWYgKGlwYV9wbV9jdHgtPmNsaWVudHNfYnlfcGlwZVtpXSA9PSBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0pCisJCQlpcGFfcG1fY3R4LT5jbGllbnRzX2J5X3BpcGVbaV0gPSBOVUxMOworCX0KKwlrZnJlZShjbGllbnQpOworCWlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXSA9IE5VTEw7CisKKwlyZW1vdmVfY2xpZW50X2Zyb21fZXhjZXB0aW9uX2xpc3QoaGRsKTsKKwlJUEFfUE1fREJHKCJJUEEgUE0gY2xpZW50ICVkIGRlcmVnaXN0ZXJlZFxuIiwgaGRsKTsKKwltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcGFfcG1fYXNzb2NpYXRlX2lwYV9jb25zX3RvX2NsaWVudCgpIC0gYWRkIG1hcHBpbmcgdG8gcGlwZSB3aXRoIGlwYSBjbGxlbnQKKyAqIEBoZGw6IGluZGV4IG9mIHRoZSBjbGllbnQgdG8gYmUgbWFwcGVkCisgKiBAY29uc3VtZXI6IHRoZSBwaXBlL2NvbnN1bWVyIG5hbWUgdG8gYmUgcGlwcGVkIHRvIHRoZSBjbGllbnQKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBTaWRlIGVmZmVjdHM6IG11bHRpcGxlIHBpcGVzIGFyZSBhbGxvd2VkIHRvIGJlIG1hcHBlZCB0byBhIHNpbmdsZSBjbGllbnQKKyAqLworaW50IGlwYV9wbV9hc3NvY2lhdGVfaXBhX2NvbnNfdG9fY2xpZW50KHUzMiBoZGwsIGVudW0gaXBhX2NsaWVudF90eXBlIGNvbnN1bWVyKQoreworCWludCBpZHg7CisKKwlpZiAoaGRsID49IElQQV9QTV9NQVhfQ0xJRU5UUyB8fCBjb25zdW1lciA8IDAgfHwKKwkJY29uc3VtZXIgPj0gSVBBX0NMSUVOVF9NQVgpIHsKKwkJSVBBX1BNX0VSUigiaW52YWxpZCBwYXJhbXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCWlkeCA9IGlwYV9nZXRfZXBfbWFwcGluZyhjb25zdW1lcik7CisKKwlJUEFfUE1fREJHKCJNYXBwaW5nIHBpcGUgJWQgdG8gY2xpZW50ICVkXG4iLCBpZHgsIGhkbCk7CisKKwlpZiAoaWR4IDwgMCkgeworCQltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJCUlQQV9QTV9EQkcoIlBpcGUgaXMgbm90IHVzZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXBhX3BtX2N0eC0+Y2xpZW50c1toZGxdID09IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCQlJUEFfUE1fRVJSKCJDbGllbnQgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGlwYV9wbV9jdHgtPmNsaWVudHNfYnlfcGlwZVtpZHhdICE9IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCQlJUEFfUE1fRVJSKCJQaXBlIGlzIGFscmVhZHkgbWFwcGVkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaXBhX3BtX2N0eC0+Y2xpZW50c19ieV9waXBlW2lkeF0gPSBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF07CisJbXV0ZXhfdW5sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCisJSVBBX1BNX0RCRygiUGlwZSAlZCBpcyBtYXBwZWQgdG8gY2xpZW50ICVkXG4iLCBpZHgsIGhkbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcGFfcG1fYWN0aXZhdGVfaGVscGVyKHN0cnVjdCBpcGFfcG1fY2xpZW50ICpjbGllbnQsIGJvb2wgc3luYykKK3sKKwlzdHJ1Y3QgaXBhX2FjdGl2ZV9jbGllbnRfbG9nZ2luZ19pbmZvIGxvZ19pbmZvOworCWludCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKworCWlmIChJUEFfUE1fU1RBVEVfSU5fUFJPR1JFU1MoY2xpZW50LT5zdGF0ZSkpIHsKKwkJaWYgKHN5bmMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmY2xpZW50LT5jb21wbGV0ZSk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCQl9CisJfQorCisJc3dpdGNoIChjbGllbnQtPnN0YXRlKSB7CisJY2FzZSBJUEFfUE1fQUNUSVZBVEVEX1BFTkRJTkdfUkVTQ0hFRFVMRToKKwljYXNlIElQQV9QTV9BQ1RJVkFURURfUEVORElOR19ERUFDVElWQVRJT046CisJCWNsaWVudC0+c3RhdGUgPSBJUEFfUE1fQUNUSVZBVEVEX1RJTUVSX1NFVDsKKwljYXNlIElQQV9QTV9BQ1RJVkFURUQ6CisJY2FzZSBJUEFfUE1fQUNUSVZBVEVEX1RJTUVSX1NFVDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCWNhc2UgSVBBX1BNX0RFQUNUSVZBVEVEOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUEFfUE1fRVJSKCJJbnZhbGlkIFN0YXRlXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCUlQQV9QTV9EQkdfU1RBVEUoY2xpZW50LT5oZGwsIGNsaWVudC0+bmFtZSwgY2xpZW50LT5zdGF0ZSk7CisKKwlJUEFfQUNUSVZFX0NMSUVOVFNfUFJFUF9TUEVDSUFMKGxvZ19pbmZvLCBjbGllbnQtPm5hbWUpOworCWlmICghY2xpZW50LT5za2lwX2Nsa192b3RlKSB7CisJCWlmIChzeW5jKSB7CisJCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJCQlJUEFfQUNUSVZFX0NMSUVOVFNfSU5DX1NQRUNJQUwoY2xpZW50LT5uYW1lKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlCisJCQlyZXN1bHQgPSBpcGEzX2luY19jbGllbnRfZW5hYmxlX2Nsa3Nfbm9fYmxvY2sKKwkJCQkgKCZsb2dfaW5mbyk7CisJfQorCisJLyogd2UgZ290IHRoZSBjbG9ja3MgKi8KKwlpZiAocmVzdWx0ID09IDApIHsKKwkJY2xpZW50LT5zdGF0ZSA9IElQQV9QTV9BQ1RJVkFURUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQlhY3RpdmF0ZV9jbGllbnQoY2xpZW50LT5oZGwpOworCQlpZiAoc3luYykKKwkJCWRvX2Nsa19zY2FsaW5nKCk7CisJCWVsc2UKKwkJCXF1ZXVlX3dvcmsoaXBhX3BtX2N0eC0+d3EsCisJCQkJICAgJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLndvcmspOworCQlJUEFfUE1fREJHX1NUQVRFKGNsaWVudC0+aGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTOworCWluaXRfY29tcGxldGlvbigmY2xpZW50LT5jb21wbGV0ZSk7CisJcXVldWVfd29yayhpcGFfcG1fY3R4LT53cSwgJmNsaWVudC0+YWN0aXZhdGVfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJSVBBX1BNX0RCR19TVEFURShjbGllbnQtPmhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCisvKioKKyAqIGlwYV9wbV9hY3RpdmF0ZSgpOiBhY3RpdmF0ZSBpcGEgY2xpZW50IHRvIHZvdGUgZm9yIGNsb2NrKCkuIENhbiBiZSBjYWxsZWQKKyAqIGZyb20gYXRvbWljIGNvbnRleHQgYW5kIHJldHVybnMgLUVJTlBST0dSRVNTIGlmIGNhbm5vdCBiZSBkb25lIHN5bmNocm9ub3VzbHkKKyAqIEBoZGw6IGluZGV4IG9mIHRoZSBjbGllbnQgaW4gdGhlIGFycmF5CisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUlOUFJPR1JFU1MgaWYgb3BlcmF0aW9uIGNhbm5vdCBiZSBkb25lIHN5bmNocm9ub3VzbHkKKyAqIGFuZCBvdGhlciBuZWdhdGl2ZXMgb24gZmFpbHVyZQorICovCitpbnQgaXBhX3BtX2FjdGl2YXRlKHUzMiBoZGwpCit7CisJaWYgKGhkbCA+PSBJUEFfUE1fTUFYX0NMSUVOVFMgfHwgaXBhX3BtX2N0eC0+Y2xpZW50c1toZGxdID09IE5VTEwpIHsKKwkJSVBBX1BNX0VSUigiSW52YWxpZCBQYXJhbVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBpcGFfcG1fYWN0aXZhdGVfaGVscGVyKGlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXSwgZmFsc2UpOworfQorCisvKioKKyAqIGlwYV9wbV9hY3RpdmF0ZSgpOiBhY3RpdmF0ZSBpcGEgY2xpZW50IHRvIHZvdGUgZm9yIGNsb2NrIHN5bmNocm9ub3VzbHkuCisgKiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4gYXRvbWljIGNvbnRleC4KKyAqIEBoZGw6IGluZGV4IG9mIHRoZSBjbGllbnQgaW4gdGhlIGFycmF5CisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpcGFfcG1fYWN0aXZhdGVfc3luYyh1MzIgaGRsKQoreworCWlmIChoZGwgPj0gSVBBX1BNX01BWF9DTElFTlRTIHx8IGlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXSA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkludmFsaWQgUGFyYW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaXBhX3BtX2FjdGl2YXRlX2hlbHBlcihpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0sIHRydWUpOworfQorCisvKioKKyAqIGlwYV9wbV9kZWZlcnJlZF9kZWFjdGl2YXRlKCk6IHNjaGVkdWxlIGEgdGltZXIgdG8gZGVhY3RpdmF0ZSBjbGllbnQgYW5kCisgKiBkZXZvdGUgY2xvY2suIENhbiBiZSBjYWxsZWQgZnJvbSBhdG9taWMgY29udGV4dCAoYXN5bmNocm9ub3VzbHkpCisgKiBAaGRsOiBpbmRleCBvZiB0aGUgY2xpZW50IGluIHRoZSBhcnJheQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitpbnQgaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUodTMyIGhkbCkKK3sKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaGRsID49IElQQV9QTV9NQVhfQ0xJRU5UUyB8fCBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0gPT0gTlVMTCkgeworCQlJUEFfUE1fRVJSKCJJbnZhbGlkIFBhcmFtXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2xpZW50ID0gaXBhX3BtX2N0eC0+Y2xpZW50c1toZGxdOworCUlQQV9QTV9EQkdfU1RBVEUoaGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCXN3aXRjaCAoY2xpZW50LT5zdGF0ZSkgeworCWNhc2UgSVBBX1BNX0FDVElWQVRFX0lOX1BST0dSRVNTOgorCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0RFQUNUSVZBVEVfSU5fUFJPR1JFU1M7CisJY2FzZSBJUEFfUE1fREVBQ1RJVkFURUQ6CisJCUlQQV9QTV9EQkdfU1RBVEUoaGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBJUEFfUE1fQUNUSVZBVEVEOgorCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX0RFQUNUSVZBVElPTjsKKwkJcXVldWVfZGVsYXllZF93b3JrKGlwYV9wbV9jdHgtPndxLCAmY2xpZW50LT5kZWFjdGl2YXRlX3dvcmssCisJCQltc2Vjc190b19qaWZmaWVzKElQQV9QTV9ERUZFUlJFRF9USU1FT1VUKSk7CisJCWJyZWFrOworCWNhc2UgSVBBX1BNX0FDVElWQVRFRF9USU1FUl9TRVQ6CisJY2FzZSBJUEFfUE1fQUNUSVZBVEVEX1BFTkRJTkdfREVBQ1RJVkFUSU9OOgorCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFRF9QRU5ESU5HX1JFU0NIRURVTEU7CisJY2FzZSBJUEFfUE1fREVBQ1RJVkFURV9JTl9QUk9HUkVTUzoKKwljYXNlIElQQV9QTV9BQ1RJVkFURURfUEVORElOR19SRVNDSEVEVUxFOgorCQlicmVhazsKKwl9CisJSVBBX1BNX0RCR19TVEFURShoZGwsIGNsaWVudC0+bmFtZSwgY2xpZW50LT5zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcGFfcG1fZGVhY3RpdmF0ZV9hbGxfZGVmZXJyZWQoKTogQ2FuY2VsIHRoZSBkZWZlcnJlZCBkZWFjdGl2YXRpb24gdGltZXIgYW5kCisgKiBpbW1lZGlhdGVseSBkZXZvdGVzIGZvciBJUEEgY2xvY2tzCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpcGFfcG1fZGVhY3RpdmF0ZV9hbGxfZGVmZXJyZWQodm9pZCkKK3sKKwlpbnQgaTsKKwlib29sIHJ1bl9hbGdvcml0aG0gPSBmYWxzZTsKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBBX1BNX01BWF9DTElFTlRTOyBpKyspIHsKKwkJY2xpZW50ID0gaXBhX3BtX2N0eC0+Y2xpZW50c1tpXTsKKworCQlpZiAoY2xpZW50ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNsaWVudC0+ZGVhY3RpdmF0ZV93b3JrKTsKKworCQlpZiAoSVBBX1BNX1NUQVRFX0lOX1BST0dSRVNTKGNsaWVudC0+c3RhdGUpKSB7CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjbGllbnQtPmNvbXBsZXRlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQlJUEFfUE1fREJHX1NUQVRFKGNsaWVudC0+aGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCisJCWlmIChjbGllbnQtPnN0YXRlID09IElQQV9QTV9BQ1RJVkFURURfVElNRVJfU0VUKSB7CisJCQljbGllbnQtPnN0YXRlID0gSVBBX1BNX0FDVElWQVRFRDsKKwkJCUlQQV9QTV9EQkdfU1RBVEUoY2xpZW50LT5oZGwsIGNsaWVudC0+bmFtZSwKKwkJCQljbGllbnQtPnN0YXRlKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgaWYgKGNsaWVudC0+c3RhdGUgPT0KKwkJCUlQQV9QTV9BQ1RJVkFURURfUEVORElOR19ERUFDVElWQVRJT04gfHwKKwkJCUlQQV9QTV9BQ1RJVkFURURfUEVORElOR19SRVNDSEVEVUxFKSB7CisJCQlydW5fYWxnb3JpdGhtID0gdHJ1ZTsKKwkJCWNsaWVudC0+c3RhdGUgPSBJUEFfUE1fREVBQ1RJVkFURUQ7CisJCQlJUEFfUE1fREJHX1NUQVRFKGNsaWVudC0+aGRsLCBjbGllbnQtPm5hbWUsCisJCQkJY2xpZW50LT5zdGF0ZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJCWlwYV9zZXRfdGFnX3Byb2Nlc3NfYmVmb3JlX2dhdGluZyh0cnVlKTsKKwkJCWlmICghY2xpZW50LT5za2lwX2Nsa192b3RlKQorCQkJCUlQQV9BQ1RJVkVfQ0xJRU5UU19ERUNfU1BFQ0lBTChjbGllbnQtPm5hbWUpOworCQkJZGVhY3RpdmF0ZV9jbGllbnQoY2xpZW50LT5oZGwpOworCQl9IGVsc2UgLyogaWYgYWN0aXZhdGVkIG9yIGRlYWN0aXZhdGVkLCB3ZSBkbyBub3RoaW5nICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAocnVuX2FsZ29yaXRobSkKKwkJZG9fY2xrX3NjYWxpbmcoKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoKTogZGVhY3RpdmF0ZSBpcGEgY2xpZW50IGFuZCBkZXZvdGUgY2xvY2suIENhbm5vdCBiZQorICogY2FsbGVkIGZyb20gYXRvbWljIGNvbnRleHQuCisgKiBAaGRsOiBpbmRleCBvZiB0aGUgY2xpZW50IGluIHRoZSBhcnJheQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitpbnQgaXBhX3BtX2RlYWN0aXZhdGVfc3luYyh1MzIgaGRsKQoreworCXN0cnVjdCBpcGFfcG1fY2xpZW50ICpjbGllbnQgPSBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChoZGwgPj0gSVBBX1BNX01BWF9DTElFTlRTIHx8IGlwYV9wbV9jdHgtPmNsaWVudHNbaGRsXSA9PSBOVUxMKSB7CisJCUlQQV9QTV9FUlIoIkludmFsaWQgUGFyYW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNsaWVudC0+ZGVhY3RpdmF0ZV93b3JrKTsKKworCWlmIChJUEFfUE1fU1RBVEVfSU5fUFJPR1JFU1MoY2xpZW50LT5zdGF0ZSkpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNsaWVudC0+Y29tcGxldGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCUlQQV9QTV9EQkdfU1RBVEUoaGRsLCBjbGllbnQtPm5hbWUsIGNsaWVudC0+c3RhdGUpOworCisJaWYgKGNsaWVudC0+c3RhdGUgPT0gSVBBX1BNX0RFQUNUSVZBVEVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKworCS8qIGVsc2UgY2FzZSAoRGVhY3RpdmF0ZXMgYWxsIEFjdGl2YXRlZCBjYXNlcykqLworCWlwYV9zZXRfdGFnX3Byb2Nlc3NfYmVmb3JlX2dhdGluZyh0cnVlKTsKKwlpZiAoIWNsaWVudC0+c2tpcF9jbGtfdm90ZSkKKwkJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19TUEVDSUFMKGNsaWVudC0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJY2xpZW50LT5zdGF0ZSA9IElQQV9QTV9ERUFDVElWQVRFRDsKKwlJUEFfUE1fREJHX1NUQVRFKGhkbCwgY2xpZW50LT5uYW1lLCBjbGllbnQtPnN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwlkZWFjdGl2YXRlX2NsaWVudChoZGwpOworCWRvX2Nsa19zY2FsaW5nKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcGFfcG1faGFuZGxlX3N1c3BlbmQoKTogY2FsbHMgdGhlIGNhbGxiYWNrcyBvZiBzdXNwZW5kZWQgY2xpZW50cyB0byB3YWtlIHVwCisgKiBAcGlwZV9iaXRtYXNrOiB0aGUgYml0cyByZXByZXNlbnQgdGhlIGluZGV4ZXMgb2YgdGhlIGNsaWVudHMgdG8gYmUgd29rZW4gdXAKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworaW50IGlwYV9wbV9oYW5kbGVfc3VzcGVuZCh1MzIgcGlwZV9iaXRtYXNrKQoreworCWludCBpOworCXN0cnVjdCBpcGFfcG1fY2xpZW50ICpjbGllbnQ7CisJYm9vbCBjbGllbnRfbm90aWZpZWRbSVBBX1BNX01BWF9DTElFTlRTXSA9IHsgZmFsc2UgfTsKKworCUlQQV9QTV9EQkdfTE9XKCJiaXRtYXNrOiAlZCIsICBwaXBlX2JpdG1hc2spOworCisJaWYgKHBpcGVfYml0bWFzayA9PSAwKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IElQQTNfTUFYX05VTV9QSVBFUzsgaSsrKSB7CisJCWlmIChwaXBlX2JpdG1hc2sgJiAoMSA8PCBpKSkgeworCQkJY2xpZW50ID0gaXBhX3BtX2N0eC0+Y2xpZW50c19ieV9waXBlW2ldOworCQkJaWYgKGNsaWVudCAmJiBjbGllbnRfbm90aWZpZWRbY2xpZW50LT5oZGxdID09IGZhbHNlKSB7CisJCQkJaWYgKGNsaWVudC0+Y2FsbGJhY2spIHsKKwkJCQkJY2xpZW50LT5jYWxsYmFjayhjbGllbnQtPmNhbGxiYWNrX3BhcmFtcworCQkJCQkJLCBJUEFfUE1fUkVRVUVTVF9XQUtFVVApOworCQkJCQljbGllbnRfbm90aWZpZWRbY2xpZW50LT5oZGxdID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlJUEFfUE1fRVJSKCJjbGllbnQgaGFzIG5vIGNhbGxiYWNrIik7CisJCQkJCVdBUk5fT04oMSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCW11dGV4X3VubG9jaygmaXBhX3BtX2N0eC0+Y2xpZW50X211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZSgpOiBBZGRzL2NoYW5nZXMgdGhlIHRocm91Z2hwdXQgcmVxdWlyZW1lbnQgdG8gSVBBIFBNCisgKiB0byBiZSB1c2VkIGZvciBjbG9jayBzY2FsaW5nCisgKiBAaGRsOiBpbmRleCBvZiB0aGUgY2xpZW50IGluIHRoZSBhcnJheQorICogQHRocm91Z2hwdXQ6IHRoZSBuZXcgdGhyb3VnaHB1dCB2YWx1ZSB0byBiZSBzZXQgZm9yIHRoYXQgY2xpZW50CisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZSh1MzIgaGRsLCBpbnQgdGhyb3VnaHB1dCkKK3sKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50ID0gaXBhX3BtX2N0eC0+Y2xpZW50c1toZGxdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaGRsID49IElQQV9QTV9NQVhfQ0xJRU5UUyB8fCBpcGFfcG1fY3R4LT5jbGllbnRzW2hkbF0gPT0gTlVMTAorCQl8fCB0aHJvdWdocHV0IDwgMCkgeworCQlJUEFfUE1fRVJSKCJJbnZhbGlkIFBhcmFtc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJaWYgKGNsaWVudC0+Z3JvdXAgPT0gSVBBX1BNX0dST1VQX0RFRkFVTFQpCisJCUlQQV9QTV9EQkdfTE9XKCJPbGQgdGhyb3VnaHB1dDogJWRcbiIsICBjbGllbnQtPnRocm91Z2hwdXQpOworCWVsc2UKKwkJSVBBX1BNX0RCR19MT1coIm9sZCBHcm91cCAlZCB0aHJvdWdocHV0OiAlZFxuIiwKKwkJCWNsaWVudC0+Z3JvdXAsIGlwYV9wbV9jdHgtPmdyb3VwX3RwdXRbY2xpZW50LT5ncm91cF0pOworCisJaWYgKGNsaWVudC0+Z3JvdXAgPT0gSVBBX1BNX0dST1VQX0RFRkFVTFQpCisJCWNsaWVudC0+dGhyb3VnaHB1dCA9IHRocm91Z2hwdXQ7CisJZWxzZQorCQlpcGFfcG1fY3R4LT5ncm91cF90cHV0W2NsaWVudC0+Z3JvdXBdID0gdGhyb3VnaHB1dDsKKworCWlmIChjbGllbnQtPmdyb3VwID09IElQQV9QTV9HUk9VUF9ERUZBVUxUKQorCQlJUEFfUE1fREJHX0xPVygiTmV3IHRocm91Z2hwdXQ6ICVkXG4iLCAgY2xpZW50LT50aHJvdWdocHV0KTsKKwllbHNlCisJCUlQQV9QTV9EQkdfTE9XKCJOZXcgR3JvdXAgJWQgdGhyb3VnaHB1dDogJWRcbiIsCisJCQljbGllbnQtPmdyb3VwLCBpcGFfcG1fY3R4LT5ncm91cF90cHV0W2NsaWVudC0+Z3JvdXBdKTsKKwltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJaWYgKElQQV9QTV9TVEFURV9BQ1RJVkUoY2xpZW50LT5zdGF0ZSkgfHwgKGNsaWVudC0+Z3JvdXAgIT0KKwkJCUlQQV9QTV9HUk9VUF9ERUZBVUxUKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJZG9fY2xrX3NjYWxpbmcoKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXBhX3BtX3N0YXQoKSAtIHByaW50IFBNIHN0YXQKKyAqIEBidWY6IFtpbl0gVGhlIHVzZXIgYnVmZiB1c2VkIHRvIHByaW50CisgKiBAc2l6ZTogW2luXSBUaGUgc2l6ZSBvZiBidWYKKyAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyB1c2VkIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpcGFfZGVidWdmcyBpbiBvcmRlciB0byByZWNlaXZlCisgKiBhIHBpY3R1cmUgb2YgdGhlIGNsaWVudHMgaW4gdGhlIFBNIGFuZCB0aGUgdGhyb3VnaHB1dCwgdGhyZXNob2xkIGFuZCBjdXIgdm90ZQorICovCitpbnQgaXBhX3BtX3N0YXQoY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgaXBhX3BtX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBjbGtfc2NhbGluZ19kYiAqY2xrID0gJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nOworCWludCBpLCBqLCB0cHV0LCBjbnQgPSAwLCByZXN1bHQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWJ1ZiB8fCBzaXplIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpcGFfcG1fY3R4LT5jbGllbnRfbXV0ZXgpOworCisJcmVzdWx0ID0gc2NucHJpbnRmKGJ1ZiArIGNudCwgc2l6ZSAtIGNudCwgIlxuXG5DdXJyZW50IHRocmVzaG9sZDogWyIpOworCWNudCArPSByZXN1bHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2xrLT50aHJlc2hvbGRfc2l6ZTsgaSsrKSB7CisJCXJlc3VsdCA9IHNjbnByaW50ZihidWYgKyBjbnQsIHNpemUgLSBjbnQsCisJCQkiJWQsICIsIGNsay0+Y3VycmVudF90aHJlc2hvbGRbaV0pOworCQljbnQgKz0gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IHNjbnByaW50ZihidWYgKyBjbnQsIHNpemUgLSBjbnQsICJcYlxiXVxuIik7CisJY250ICs9IHJlc3VsdDsKKworCXJlc3VsdCA9IHNjbnByaW50ZihidWYgKyBjbnQsIHNpemUgLSBjbnQsCisJCSJBZ2dyZWdhdGVkIHRwdXQ6ICVkLCBDdXIgdm90ZTogJWQiLAorCQlpcGFfcG1fY3R4LT5hZ2dyZWdhdGVkX3RwdXQsIGNsay0+Y3VyX3ZvdGUpOworCWNudCArPSByZXN1bHQ7CisKKwlyZXN1bHQgPSBzY25wcmludGYoYnVmICsgY250LCBzaXplIC0gY250LCAiXG5cblJlZ2lzdGVyZWQgQ2xpZW50czpcbiIpOworCWNudCArPSByZXN1bHQ7CisKKworCWZvciAoaSA9IDA7IGkgPCBJUEFfUE1fTUFYX0NMSUVOVFM7IGkrKykgeworCQljbGllbnQgPSBpcGFfcG1fY3R4LT5jbGllbnRzW2ldOworCisJCWlmIChjbGllbnQgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbGllbnQtPnN0YXRlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGNsaWVudC0+Z3JvdXAgPT0gSVBBX1BNX0dST1VQX0RFRkFVTFQpCisJCQl0cHV0ID0gY2xpZW50LT50aHJvdWdocHV0OworCQllbHNlCisJCQl0cHV0ID0gaXBhX3BtX2N0eC0+Z3JvdXBfdHB1dFtjbGllbnQtPmdyb3VwXTsKKworCQlyZXN1bHQgPSBzY25wcmludGYoYnVmICsgY250LCBzaXplIC0gY250LAorCQkiQ2xpZW50WyVkXTogJXMgU3RhdGU6JXNcbkdyb3VwOiAlcyBUaHJvdWdocHV0OiAlZCBQaXBlczogIiwKKwkJCWksIGNsaWVudC0+bmFtZSwgY2xpZW50X3N0YXRlX3RvX3N0cltjbGllbnQtPnN0YXRlXSwKKwkJCWlwYV9wbV9ncm91cF90b19zdHJbY2xpZW50LT5ncm91cF0sIHRwdXQpOworCQljbnQgKz0gcmVzdWx0OworCisJCWZvciAoaiA9IDA7IGogPCBJUEEzX01BWF9OVU1fUElQRVM7IGorKykgeworCQkJaWYgKGlwYV9wbV9jdHgtPmNsaWVudHNfYnlfcGlwZVtqXSA9PSBjbGllbnQpIHsKKwkJCQlyZXN1bHQgPSBzY25wcmludGYoYnVmICsgY250LCBzaXplIC0gY250LAorCQkJCQkiJWQsICIsIGopOworCQkJCWNudCArPSByZXN1bHQ7CisJCQl9CisJCX0KKworCQlyZXN1bHQgPSBzY25wcmludGYoYnVmICsgY250LCBzaXplIC0gY250LCAiXGJcYlxuXG4iKTsKKwkJY250ICs9IHJlc3VsdDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT5zdGF0ZV9sb2NrLCBmbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmaXBhX3BtX2N0eC0+Y2xpZW50X211dGV4KTsKKworCXJldHVybiBjbnQ7Cit9CisKKy8qKgorICogaXBhX3BtX2V4Y2VwdGlvbnNfc3RhdCgpIC0gcHJpbnQgUE0gZXhjZXB0aW9ucyBzdGF0CisgKiBAYnVmOiBbaW5dIFRoZSB1c2VyIGJ1ZmYgdXNlZCB0byBwcmludAorICogQHNpemU6IFtpbl0gVGhlIHNpemUgb2YgYnVmCisgKiBSZXR1cm5zOiBudW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaXBhX2RlYnVnZnMgaW4gb3JkZXIgdG8gcmVjZWl2ZQorICogYSBmdWxsIHBpY3R1cmUgb2YgdGhlIGV4Y2VwdGlvbnMgaW4gdGhlIFBNCisgKi8KK2ludCBpcGFfcG1fZXhjZXB0aW9uc19zdGF0KGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGksIGosIGNudCA9IDAsIHJlc3VsdCA9IDA7CisJc3RydWN0IGlwYV9wbV9leGNlcHRpb25fbGlzdCAqZXhjZXB0aW9uOworCisJaWYgKCFidWYgfHwgc2l6ZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzdWx0ID0gc2NucHJpbnRmKGJ1ZiArIGNudCwgc2l6ZSAtIGNudCwgIlxuIik7CisJY250ICs9IHJlc3VsdDsKKworCW11dGV4X2xvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IGlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmV4Y2VwdGlvbl9zaXplOyBpKyspIHsKKwkJZXhjZXB0aW9uID0gJmlwYV9wbV9jdHgtPmNsa19zY2FsaW5nLmV4Y2VwdGlvbl9saXN0W2ldOworCQlpZiAoZXhjZXB0aW9uID09IE5VTEwpIHsKKwkJCXJlc3VsdCA9IHNjbnByaW50ZihidWYgKyBjbnQsIHNpemUgLSBjbnQsCisJCQkiRXhjZXB0aW9uICVkIGlzIE5VTExcblxuIiwgaSk7CisJCQljbnQgKz0gcmVzdWx0OworCQkJY29udGludWU7CisJCX0KKworCQlyZXN1bHQgPSBzY25wcmludGYoYnVmICsgY250LCBzaXplIC0gY250LAorCQkJIkV4Y2VwdGlvbiAlZDogJXNcblBlbmRpbmc6ICVkIEJpdG1hc2s6ICVkIFRocmVzaG9sZDogWyIKKwkJCSwgaSwgZXhjZXB0aW9uLT5jbGllbnRzLCBleGNlcHRpb24tPnBlbmRpbmcsCisJCQlleGNlcHRpb24tPmJpdG1hc2spOworCQljbnQgKz0gcmVzdWx0OworCQlmb3IgKGogPSAwOyBqIDwgaXBhX3BtX2N0eC0+Y2xrX3NjYWxpbmcudGhyZXNob2xkX3NpemU7IGorKykgeworCQkJcmVzdWx0ID0gc2NucHJpbnRmKGJ1ZiArIGNudCwgc2l6ZSAtIGNudCwKKwkJCQkiJWQsICIsIGV4Y2VwdGlvbi0+dGhyZXNob2xkW2pdKTsKKwkJCWNudCArPSByZXN1bHQ7CisJCX0KKwkJcmVzdWx0ID0gc2NucHJpbnRmKGJ1ZiArIGNudCwgc2l6ZSAtIGNudCwgIlxiXGJdXG5cbiIpOworCQljbnQgKz0gcmVzdWx0OworCX0KKwltdXRleF91bmxvY2soJmlwYV9wbV9jdHgtPmNsaWVudF9tdXRleCk7CisKKwlyZXR1cm4gY250OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcG0uaCBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMjJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3BtLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9JUEFfUE1fSF8KKyNkZWZpbmUgX0lQQV9QTV9IXworCisjaW5jbHVkZSA8bGludXgvbXNtX2lwYS5oPgorCisvKiBpbnRlcm5hbCB0byBpcGEgKi8KKyNkZWZpbmUgSVBBX1BNX01BWF9DTElFTlRTIDEwCisjZGVmaW5lIElQQV9QTV9NQVhfRVhfQ0wgNjQKKyNkZWZpbmUgSVBBX1BNX1RIUkVTSE9MRF9NQVggMgorI2RlZmluZSBJUEFfUE1fRVhDRVBUSU9OX01BWCAyCisjZGVmaW5lIElQQV9QTV9ERUZFUlJFRF9USU1FT1VUIDEwMAorI2RlZmluZSBJUEFfUE1fU1RBVEVfTUFYIDcKKworLyoKKyAqIGlwYV9wbSBncm91cCBuYW1lcworICoKKyAqIERlZmF1bHQgc3RhbmRzIGZvciBpbmRpdmlkdWFsIGNsaWVudHMgd2hpbGUgb3RoZXIgZ3JvdXBzIHNoYXJlIG9uZSB0aHJvdWdocHV0CisgKiBTb21lIGdyb3VwcyBhbHNvIGhhdmUgc3BlY2lhbCBmbGFncyBsaWtlIG1vZGVtIHdoaWNoIGRvIG5vdCB2b3RlIGZvciBjbG9jaworICogYnV0IGlzIGFjY291bnRlZCBmb3IgaW4gY2xvY2sgc2NhbGluZyB3aGlsZSBhY3RpdmF0ZWQKKyAqLworZW51bSBpcGFfcG1fZ3JvdXAgeworCUlQQV9QTV9HUk9VUF9ERUZBVUxULAorCUlQQV9QTV9HUk9VUF9BUFBTLAorCUlQQV9QTV9HUk9VUF9NT0RFTSwKKwlJUEFfUE1fR1JPVVBfTUFYLAorfTsKKworLyoKKyAqIGlwYV9wbV9jYl9ldmVudAorICoKKyAqIHNwZWNpZmllcyB3aGF0IGtpbmQgb2YgY2FsbGJhY2sgaXMgYmVpbmcgY2FsbGVkLgorICogSVBBX1BNX0NMSUVOVF9BQ1RJVkFURUQ6IHRoZSBjbGllbnQgaGFzIGNvbXBsZXRlZCBhc3luY2hyb25vdXMgYWN0aXZhdGlvbgorICogSVBBX1BNX1JFUVVFU1RfV0FLRVVQOiB3YWtlIHVwIHRoZSBjbGllbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gc3VzcGVuZGVkCisgKi8KK2VudW0gaXBhX3BtX2NiX2V2ZW50IHsKKwlJUEFfUE1fQ0xJRU5UX0FDVElWQVRFRCwKKwlJUEFfUE1fUkVRVUVTVF9XQUtFVVAsCisJSVBBX1BNX0NCX0VWRU5UX01BWCwKK307CisKKy8qCisgKiBzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbiAtIGNsaWVudHMgaW5jbHVkZWQgaW4gZXhjZXB0aW9uIGFuZCBpdHMgdGhyZXNob2xkCisgKiBAdXNlY2FzZTogY29tbWEgc2VwYXJhdGVkIGNsaWVudCBuYW1lcworICogQHRocmVzaG9sZDogdGhlIHRocmVzaG9sZCB2YWx1ZXMgZm9yIHRoZSBleGNlcHRpb24KKyAqLworc3RydWN0IGlwYV9wbV9leGNlcHRpb24geworCWNvbnN0IGNoYXIgKnVzZWNhc2U7CisJaW50IHRocmVzaG9sZFtJUEFfUE1fVEhSRVNIT0xEX01BWF07Cit9OworCisvKgorICogc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyAtIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBpbml0aWFsaXpuZyB0aGUgcG0KKyAqIEBkZWZhdWx0X3RocmVzaG9sZDogdGhlIHRocmVzaG9sZHMgdXNlZCBpZiBubyBleGNlcHRpb24gcGFzc2VzCisgKiBAdGhyZXNob2xkX3NpemU6IHNpemUgb2YgdGhlIHRocmVzaG9sZAorICogQGV4Y2VwdGlvbnM6IGxpc3Qgb2YgZXhjZXB0aW9ucyAgZm9yIHRoZSBwbQorICogQGV4Y2VwdGlvbl9zaXplOiBzaXplIG9mIHRoZSBleGNlcHRpb25fbGlzdAorICovCitzdHJ1Y3QgaXBhX3BtX2luaXRfcGFyYW1zIHsKKwlpbnQgZGVmYXVsdF90aHJlc2hvbGRbSVBBX1BNX1RIUkVTSE9MRF9NQVhdOworCWludCB0aHJlc2hvbGRfc2l6ZTsKKwlzdHJ1Y3QgaXBhX3BtX2V4Y2VwdGlvbiBleGNlcHRpb25zW0lQQV9QTV9FWENFUFRJT05fTUFYXTsKKwlpbnQgZXhjZXB0aW9uX3NpemU7Cit9OworCisvKgorICogc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgLSBwYXJhbWV0ZXJzIG5lZWRlZCB0byByZWdpc3RlciBhIGNsaWVudAorICogQG5hbWU6IG5hbWUgb2YgdGhlIGNsaWVudAorICogQGNhbGxiYWNrOiBwb2ludGVyIHRvIHRoZSBjbGllbnQncyBjYWxsYmFjayBmdW5jdGlvbgorICogQHVzZXJfZGF0YTogcG9pbnRlciB0byB0aGUgY2xpZW50J3MgY2FsbGJhY2sgcGFyYW1ldGVycworICogQGdyb3VwOiBncm91cCBudW1iZXIgb2YgdGhlIGNsaWVudAorICogQHNraXBfY2xrX3ZvdGU6IDAgaWYgY2xpZW50IHZvdGVzIGZvciBjbG9jayB3aGVuIGFjdGl2YXRlZCwgMSBpZiBubyB2b3RlCisgKi8KK3N0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCpjYWxsYmFjaykodm9pZCosIGVudW0gaXBhX3BtX2NiX2V2ZW50KTsKKwl2b2lkICp1c2VyX2RhdGE7CisJZW51bSBpcGFfcG1fZ3JvdXAgZ3JvdXA7CisJYm9vbCBza2lwX2Nsa192b3RlOworfTsKKworaW50IGlwYV9wbV9yZWdpc3RlcihzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyAqcGFyYW1zLCB1MzIgKmhkbCk7CitpbnQgaXBhX3BtX2Fzc29jaWF0ZV9pcGFfY29uc190b19jbGllbnQodTMyIGhkbCwgZW51bSBpcGFfY2xpZW50X3R5cGUgY29uc3VtZXIpOworaW50IGlwYV9wbV9hY3RpdmF0ZSh1MzIgaGRsKTsKK2ludCBpcGFfcG1fYWN0aXZhdGVfc3luYyh1MzIgaGRsKTsKK2ludCBpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZSh1MzIgaGRsKTsKK2ludCBpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKHUzMiBoZGwpOworaW50IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKHUzMiBoZGwsIGludCB0aHJvdWdocHV0KTsKK2ludCBpcGFfcG1fZGVyZWdpc3Rlcih1MzIgaGRsKTsKKworLyogSVBBIEludGVybmFsIEZ1bmN0aW9ucyAqLworaW50IGlwYV9wbV9pbml0KHN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgKnBhcmFtcyk7CitpbnQgaXBhX3BtX2Rlc3Ryb3kodm9pZCk7CitpbnQgaXBhX3BtX2hhbmRsZV9zdXNwZW5kKHUzMiBwaXBlX2JpdG1hc2spOworaW50IGlwYV9wbV9kZWFjdGl2YXRlX2FsbF9kZWZlcnJlZCh2b2lkKTsKK2ludCBpcGFfcG1fc3RhdChjaGFyICpidWYsIGludCBzaXplKTsKK2ludCBpcGFfcG1fZXhjZXB0aW9uc19zdGF0KGNoYXIgKmJ1ZiwgaW50IHNpemUpOworCisjZW5kaWYgLyogX0lQQV9QTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcW1pX3NlcnZpY2UuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3FtaV9zZXJ2aWNlLmMKaW5kZXggNjFiY2NjNi4uZmJhYTRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcW1pX3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9xbWlfc2VydmljZS5jCkBAIC03OTgsOSArNzk4LDggQEAKIAogCS8qIGNoZWNrIGlmIHRoZSBmaWx0ZXIgcnVsZXMgZnJvbSBJUEFDTSBpcyB2YWxpZCAqLwogCWlmIChyZXEtPnJ1bGVfaWRfbGVuID09IDApIHsKLQkJSVBBV0FORVJSKCIgZGVsZXRlIFVMIGZpbHRlciBydWxlIGZvciBwaXBlICVkXG4iLAorCQlJUEFXQU5EQkcoIiBkZWxldGUgVUwgZmlsdGVyIHJ1bGUgZm9yIHBpcGUgJWRcbiIsCiAJCXJlcS0+c291cmNlX3BpcGVfaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgaWYgKHJlcS0+cnVsZV9pZF9sZW4gPiBRTUlfSVBBX01BWF9GSUxURVJTX1YwMSkgewogCQlJUEFXQU5FUlIoIiBVTCBmaWx0ZXIgcnVsZSBmb3IgcGlwZSAlZCBleGNlZWQgbWF4ICgldSlcbiIsCiAJCXJlcS0+c291cmNlX3BpcGVfaW5kZXgsCkBAIC0xMjE0LDcgKzEyMTMsNiBAQAogLyogdm90aW5nIGZvciBidXMgQlcgdG8gaXBhX3JtKi8KIGludCBpcGEzX3ZvdGVfZm9yX2J1c19idyh1aW50MzJfdCAqYndfbWJwcykKIHsKLQlzdHJ1Y3QgaXBhX3JtX3BlcmZfcHJvZmlsZSBwcm9maWxlOwogCWludCByZXQ7CiAKIAlpZiAoYndfbWJwcyA9PSBOVUxMKSB7CkBAIC0xMjIyLDE2ICsxMjIwLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1lbXNldCgmcHJvZmlsZSwgMCwgc2l6ZW9mKHByb2ZpbGUpKTsKLQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPSAqYndfbWJwczsKLQlyZXQgPSBpcGFfcm1fc2V0X3BlcmZfcHJvZmlsZShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKLQkJCSZwcm9maWxlKTsKKwlyZXQgPSBpcGEzX3d3YW5fc2V0X21vZGVtX3BlcmZfcHJvZmlsZSgqYndfbWJwcyk7CiAJaWYgKHJldCkKIAkJSVBBV0FORVJSKCJGYWlsZWQgdG8gc2V0IHBlcmYgcHJvZmlsZSB0byBCVyAldVxuIiwKLQkJCXByb2ZpbGUubWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwcyk7CisJCQkqYndfbWJwcyk7CiAJZWxzZQogCQlJUEFXQU5EQkcoIlN1Y2NlZWRlZCB0byBzZXQgcGVyZiBwcm9maWxlIHRvIEJXICV1XG4iLAotCQkJcHJvZmlsZS5tYXhfc3VwcG9ydGVkX2JhbmR3aWR0aF9tYnBzKTsKKwkJCSpid19tYnBzKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9xbWlfc2VydmljZS5oIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcW1pX3NlcnZpY2UuaAppbmRleCBkNWQ4NTAzLi5kM2E0YmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9xbWlfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3FtaV9zZXJ2aWNlLmgKQEAgLTIwNyw2ICsyMDcsMTAgQEAKIAogdm9pZCBpcGEzX3E2X2hhbmRzaGFrZV9jb21wbGV0ZShib29sIHNzcl9ib290dXApOwogCitpbnQgaXBhM193d2FuX3NldF9tb2RlbV9wZXJmX3Byb2ZpbGUoaW50IHRocm91Z2hwdXQpOworCitpbnQgaXBhM193d2FuX3NldF9tb2RlbV9zdGF0ZShzdHJ1Y3Qgd2FuX2lvY3RsX25vdGlmeV93YW5fc3RhdGUgKnN0YXRlKTsKKwogdm9pZCBpcGEzX3FtaV9pbml0KHZvaWQpOwogCiB2b2lkIGlwYTNfcW1pX2NsZWFudXAodm9pZCk7CkBAIC0zMjMsNiArMzI3LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcGEzX3E2X2hhbmRzaGFrZV9jb21wbGV0ZShib29sIHNzcl9ib290dXApIHsgfQogCitzdGF0aWMgaW5saW5lIGludCBpcGEzX3d3YW5fc2V0X21vZGVtX3BlcmZfcHJvZmlsZShpbnQgdGhyb3VnaHB1dCkKK3sKKwlyZXR1cm4gLUVQRVJNOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaXBhM19xbWlfaW5pdCh2b2lkKQogewogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcnQuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3J0LmMKaW5kZXggZWYwMTU4ZS4uOGJkN2QzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfcnQuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV9ydC5jCkBAIC03MywxMSArNzMsMTggQEAKIAkJc3RydWN0IGlwYTNfaGRyX3Byb2NfY3R4X2VudHJ5ICpwcm9jX2N0eDsKIAogCQlwcm9jX2N0eCA9IChlbnRyeS0+cHJvY19jdHgpID8gOiBlbnRyeS0+aGRyLT5wcm9jX2N0eDsKLQkJZ2VuX3BhcmFtcy5oZHJfbGNsID0gaXBhM19jdHgtPmhkcl9wcm9jX2N0eF90YmxfbGNsOwotCQlnZW5fcGFyYW1zLmhkcl90eXBlID0gSVBBSEFMX1JUX1JVTEVfSERSX1BST0NfQ1RYOwotCQlnZW5fcGFyYW1zLmhkcl9vZnN0ID0gcHJvY19jdHgtPm9mZnNldF9lbnRyeS0+b2Zmc2V0ICsKLQkJCWlwYTNfY3R4LT5oZHJfcHJvY19jdHhfdGJsLnN0YXJ0X29mZnNldDsKLQl9IGVsc2UgaWYgKGVudHJ5LT5oZHIpIHsKKwkJaWYgKChwcm9jX2N0eCA9PSBOVUxMKSB8fAorCQkJKHByb2NfY3R4LT5jb29raWUgIT0gSVBBX1BST0NfSERSX0NPT0tJRSkpIHsKKwkJCWdlbl9wYXJhbXMuaGRyX3R5cGUgPSBJUEFIQUxfUlRfUlVMRV9IRFJfTk9ORTsKKwkJCWdlbl9wYXJhbXMuaGRyX29mc3QgPSAwOworCQl9IGVsc2UgeworCQkJZ2VuX3BhcmFtcy5oZHJfbGNsID0gaXBhM19jdHgtPmhkcl9wcm9jX2N0eF90YmxfbGNsOworCQkJZ2VuX3BhcmFtcy5oZHJfdHlwZSA9IElQQUhBTF9SVF9SVUxFX0hEUl9QUk9DX0NUWDsKKwkJCWdlbl9wYXJhbXMuaGRyX29mc3QgPSBwcm9jX2N0eC0+b2Zmc2V0X2VudHJ5LT5vZmZzZXQgKworCQkJCWlwYTNfY3R4LT5oZHJfcHJvY19jdHhfdGJsLnN0YXJ0X29mZnNldDsKKwkJfQorCX0gZWxzZSBpZiAoKGVudHJ5LT5oZHIgIT0gTlVMTCkgJiYKKwkJKGVudHJ5LT5oZHItPmNvb2tpZSA9PSBJUEFfSERSX0NPT0tJRSkpIHsKIAkJZ2VuX3BhcmFtcy5oZHJfbGNsID0gaXBhM19jdHgtPmhkcl90YmxfbGNsOwogCQlnZW5fcGFyYW1zLmhkcl90eXBlID0gSVBBSEFMX1JUX1JVTEVfSERSX1JBVzsKIAkJZ2VuX3BhcmFtcy5oZHJfb2ZzdCA9IGVudHJ5LT5oZHItPm9mZnNldF9lbnRyeS0+b2Zmc2V0OwpAQCAtMTE0Miw2ICsxMTQ5LDEzIEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKKwlpZiAoZW50cnktPmNvb2tpZSAhPSBJUEFfUlRfUlVMRV9DT09LSUUpIHsKKwkJSVBBRVJSX1JMKCJJbnZhbGlkIGNvb2tpZSB2YWx1ZSA9ICAldSBydWxlICVkIGluIHJ0IHRibHNcbiIsCisJCQllbnRyeS0+Y29va2llLCBydWxlcy0+YWRkX2FmdGVyX2hkbCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gYmFpbDsKKwl9CisKIAlpZiAoZW50cnktPnRibCAhPSB0YmwpIHsKIAkJSVBBRVJSX1JMKCJnaXZlbiBydCBydWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YWJsZVxuIik7CiAJCXJldCA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV91dGlscy5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFfdXRpbHMuYwppbmRleCA4YzU1YTAxLi5mNzE3MjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYV91dGlscy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhX3V0aWxzLmMKQEAgLTI0LDE0ICsyNCwxNyBAQAogI2luY2x1ZGUgImlwYWhhbC9pcGFoYWxfaHdfc3RhdHMuaCIKICNpbmNsdWRlICIuLi9pcGFfcm1faS5oIgogCisjZGVmaW5lIElQQV9WM18wX0NMS19SQVRFX1NWUzIgKDM3LjUgKiAxMDAwICogMTAwMFVMKQogI2RlZmluZSBJUEFfVjNfMF9DTEtfUkFURV9TVlMgKDc1ICogMTAwMCAqIDEwMDBVTCkKICNkZWZpbmUgSVBBX1YzXzBfQ0xLX1JBVEVfTk9NSU5BTCAoMTUwICogMTAwMCAqIDEwMDBVTCkKICNkZWZpbmUgSVBBX1YzXzBfQ0xLX1JBVEVfVFVSQk8gKDIwMCAqIDEwMDAgKiAxMDAwVUwpCiAKKyNkZWZpbmUgSVBBX1YzXzVfQ0xLX1JBVEVfU1ZTMiAoMTAwICogMTAwMCAqIDEwMDBVTCkKICNkZWZpbmUgSVBBX1YzXzVfQ0xLX1JBVEVfU1ZTICgyMDAgKiAxMDAwICogMTAwMFVMKQogI2RlZmluZSBJUEFfVjNfNV9DTEtfUkFURV9OT01JTkFMICg0MDAgKiAxMDAwICogMTAwMFVMKQogI2RlZmluZSBJUEFfVjNfNV9DTEtfUkFURV9UVVJCTyAoNDI2NDAgKiAxMCAqIDEwMDBVTCkKIAorI2RlZmluZSBJUEFfVjRfMF9DTEtfUkFURV9TVlMyICg2MCAqIDEwMDAgKiAxMDAwVUwpCiAjZGVmaW5lIElQQV9WNF8wX0NMS19SQVRFX1NWUyAoMTI1ICogMTAwMCAqIDEwMDBVTCkKICNkZWZpbmUgSVBBX1Y0XzBfQ0xLX1JBVEVfTk9NSU5BTCAoMjIwICogMTAwMCAqIDEwMDBVTCkKICNkZWZpbmUgSVBBX1Y0XzBfQ0xLX1JBVEVfVFVSQk8gKDI1MCAqIDEwMDAgKiAxMDAwVUwpCkBAIC00MCw2ICs0Myw3IEBACiAKICNkZWZpbmUgSVBBX1YzXzBfQldfVEhSRVNIT0xEX1RVUkJPX01CUFMgKDEwMDApCiAjZGVmaW5lIElQQV9WM18wX0JXX1RIUkVTSE9MRF9OT01JTkFMX01CUFMgKDYwMCkKKyNkZWZpbmUgSVBBX1YzXzBfQldfVEhSRVNIT0xEX1NWU19NQlBTICgzMTApCiAKICNkZWZpbmUgSVBBX0VORFBfSU5JVF9IRFJfTUVUQURBVEFfbl9NVVhfSURfQk1BU0sgMHhGRjAwMDAKICNkZWZpbmUgSVBBX0VORFBfSU5JVF9IRFJfTUVUQURBVEFfbl9NVVhfSURfU0hGVCAweDEwCkBAIC0zNzMzLDE0ICszNzM3LDE3IEBACiAJCWN0cmwtPmlwYV9jbGtfcmF0ZV90dXJibyA9IElQQV9WNF8wX0NMS19SQVRFX1RVUkJPOwogCQljdHJsLT5pcGFfY2xrX3JhdGVfbm9taW5hbCA9IElQQV9WNF8wX0NMS19SQVRFX05PTUlOQUw7CiAJCWN0cmwtPmlwYV9jbGtfcmF0ZV9zdnMgPSBJUEFfVjRfMF9DTEtfUkFURV9TVlM7CisJCWN0cmwtPmlwYV9jbGtfcmF0ZV9zdnMyID0gSVBBX1Y0XzBfQ0xLX1JBVEVfU1ZTMjsKIAl9IGVsc2UgaWYgKGh3X3R5cGUgPj0gSVBBX0hXX3YzXzUpIHsKIAkJY3RybC0+aXBhX2Nsa19yYXRlX3R1cmJvID0gSVBBX1YzXzVfQ0xLX1JBVEVfVFVSQk87CiAJCWN0cmwtPmlwYV9jbGtfcmF0ZV9ub21pbmFsID0gSVBBX1YzXzVfQ0xLX1JBVEVfTk9NSU5BTDsKIAkJY3RybC0+aXBhX2Nsa19yYXRlX3N2cyA9IElQQV9WM181X0NMS19SQVRFX1NWUzsKKwkJY3RybC0+aXBhX2Nsa19yYXRlX3N2czIgPSBJUEFfVjNfNV9DTEtfUkFURV9TVlMyOwogCX0gZWxzZSB7CiAJCWN0cmwtPmlwYV9jbGtfcmF0ZV90dXJibyA9IElQQV9WM18wX0NMS19SQVRFX1RVUkJPOwogCQljdHJsLT5pcGFfY2xrX3JhdGVfbm9taW5hbCA9IElQQV9WM18wX0NMS19SQVRFX05PTUlOQUw7CiAJCWN0cmwtPmlwYV9jbGtfcmF0ZV9zdnMgPSBJUEFfVjNfMF9DTEtfUkFURV9TVlM7CisJCWN0cmwtPmlwYV9jbGtfcmF0ZV9zdnMyID0gSVBBX1YzXzBfQ0xLX1JBVEVfU1ZTMjsKIAl9CiAKIAljdHJsLT5pcGFfaW5pdF9ydDQgPSBfaXBhX2luaXRfcnQ0X3YzOwpAQCAtMzc1NCw2ICszNzYxLDggQEAKIAljdHJsLT5pcGEzX2VuYWJsZV9jbGtzID0gX2lwYV9lbmFibGVfY2xrc192M18wOwogCWN0cmwtPmlwYTNfZGlzYWJsZV9jbGtzID0gX2lwYV9kaXNhYmxlX2Nsa3NfdjNfMDsKIAljdHJsLT5tc21fYnVzX2RhdGFfcHRyID0gJmlwYV9idXNfY2xpZW50X3BkYXRhX3YzXzA7CisJY3RybC0+Y2xvY2tfc2NhbGluZ19id190aHJlc2hvbGRfc3ZzID0KKwkJSVBBX1YzXzBfQldfVEhSRVNIT0xEX1NWU19NQlBTOwogCWN0cmwtPmNsb2NrX3NjYWxpbmdfYndfdGhyZXNob2xkX25vbWluYWwgPQogCQlJUEFfVjNfMF9CV19USFJFU0hPTERfTk9NSU5BTF9NQlBTOwogCWN0cmwtPmNsb2NrX3NjYWxpbmdfYndfdGhyZXNob2xkX3R1cmJvID0KQEAgLTQxODMsMTAgKzQxOTIsMTUgQEAKICAqLwogdm9pZCBpcGEzX3Byb3h5X2Nsa191bnZvdGUodm9pZCkKIHsKLQlpZiAoaXBhM19pc19yZWFkeSgpICYmIGlwYTNfY3R4LT5xNl9wcm94eV9jbGtfdm90ZV92YWxpZCkgeworCWlmICghaXBhM19pc19yZWFkeSgpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfbXV0ZXgpOworCWlmIChpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfdmFsaWQpIHsKIAkJSVBBX0FDVElWRV9DTElFTlRTX0RFQ19TUEVDSUFMKCJQUk9YWV9DTEtfVk9URSIpOwogCQlpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfdmFsaWQgPSBmYWxzZTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfbXV0ZXgpOwogfQogCiAvKioKQEAgLTQxOTYsMTAgKzQyMTAsMTUgQEAKICAqLwogdm9pZCBpcGEzX3Byb3h5X2Nsa192b3RlKHZvaWQpCiB7Ci0JaWYgKGlwYTNfaXNfcmVhZHkoKSAmJiAhaXBhM19jdHgtPnE2X3Byb3h5X2Nsa192b3RlX3ZhbGlkKSB7CisJaWYgKCFpcGEzX2lzX3JlYWR5KCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmlwYTNfY3R4LT5xNl9wcm94eV9jbGtfdm90ZV9tdXRleCk7CisJaWYgKCFpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfdmFsaWQpIHsKIAkJSVBBX0FDVElWRV9DTElFTlRTX0lOQ19TUEVDSUFMKCJQUk9YWV9DTEtfVk9URSIpOwogCQlpcGEzX2N0eC0+cTZfcHJveHlfY2xrX3ZvdGVfdmFsaWQgPSB0cnVlOwogCX0KKwltdXRleF91bmxvY2soJmlwYTNfY3R4LT5xNl9wcm94eV9jbGtfdm90ZV9tdXRleCk7CiB9CiAKIC8qKgpAQCAtNDgzNiwxMSArNDg1NSw4IEBACiAJCUlQQURCRygiY2ggJWxkIG5vdCBlbXB0eVxuIiwgZXAtPmdzaV9jaGFuX2hkbCk7CiAJCS8qIHF1ZXVlIGEgd29yayB0byBzdGFydCBwb2xsaW5nIGlmIGRvbid0IGhhdmUgb25lICovCiAJCWF0b21pY19zZXQoJmlwYTNfY3R4LT50cmFuc3BvcnRfcG0uZW90X2FjdGl2aXR5LCAxKTsKLQkJaWYgKCFhdG9taWNfcmVhZCgmZXAtPnN5cy0+Y3Vycl9wb2xsaW5nX3N0YXRlKSkgewotCQkJaXBhM19pbmNfYWNxdWlyZV93YWtlbG9jaygpOwotCQkJYXRvbWljX3NldCgmZXAtPnN5cy0+Y3Vycl9wb2xsaW5nX3N0YXRlLCAxKTsKLQkJCXF1ZXVlX3dvcmsoZXAtPnN5cy0+d3EsICZlcC0+c3lzLT53b3JrKTsKLQkJfQorCQlpZiAoIWF0b21pY19yZWFkKCZlcC0+c3lzLT5jdXJyX3BvbGxpbmdfc3RhdGUpKQorCQkJX19pcGFfZ3NpX2lycV9yeF9zY2VkdWxlX3BvbGwoZXAtPnN5cyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYWhhbC9pcGFoYWwuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhaGFsL2lwYWhhbC5jCmluZGV4IDU2ZmVkMmEuLmE4ZDUzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhaGFsL2lwYWhhbC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhaGFsL2lwYWhhbC5jCkBAIC01OTUsNiArNTk1LDE1IEBACiAJcmV0dXJuIHB5bGQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaXBhaGFsX2ltbV9jbWRfcHlsZCAqaXBhX2ltbV9jbWRfY29uc3RydWN0X2R1bW15KAorCWVudW0gaXBhaGFsX2ltbV9jbWRfbmFtZSBjbWQsIGNvbnN0IHZvaWQgKnBhcmFtcywgYm9vbCBpc19hdG9taWNfY3R4KQoreworCUlQQUhBTF9FUlIoIm5vIGNvbnN0cnVjdCBmdW5jdGlvbiBmb3IgSU1NX0NNRD0lcywgSVBBIHZlciAlZFxuIiwKKwkJaXBhaGFsX2ltbV9jbWRfbmFtZV9zdHIoY21kKSwgaXBhaGFsX2N0eC0+aHdfdHlwZSk7CisJV0FSTl9PTigxKTsKKwlyZXR1cm4gTlVMTDsKK30KKwogLyoKICAqIHN0cnVjdCBpcGFoYWxfaW1tX2NtZF9vYmogLSBpbW1lZGlhdGUgY29tbWFuZCBIL1cgaW5mb3JtYXRpb24gZm9yCiAgKiAgc3BlY2lmaWMgSVBBIHZlcnNpb24KQEAgLTY2OCw4ICs2NzcsOCBAQAogCQkxMn0sCiAJLyogTkFUX0RNQSB3YXMgcmVuYW1lZCB0byBUQUJMRV9ETUEgZm9yIElQQXY0ICovCiAJW0lQQV9IV192NF8wXVtJUEFfSU1NX0NNRF9OQVRfRE1BXSA9IHsKLQkJTlVMTCwKLQkJLTEgfSwKKwkJaXBhX2ltbV9jbWRfY29uc3RydWN0X2R1bW15LAorCQktMX0sCiAJW0lQQV9IV192NF8wXVtJUEFfSU1NX0NNRF9UQUJMRV9ETUFdID0gewogCQlpcGFfaW1tX2NtZF9jb25zdHJ1Y3RfdGFibGVfZG1hX2lwYXY0LAogCQkxNH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYWhhbC9pcGFoYWxfcmVnLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYWhhbC9pcGFoYWxfcmVnLmMKaW5kZXggZGM3MTQxNC4uNzRmNWJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFoYWwvaXBhaGFsX3JlZy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhaGFsL2lwYWhhbF9yZWcuYwpAQCAtMTk2MSwyMCArMTk2MSwzIEBACiAKIAl2YWxtYXNrLT5tYXNrID0gdmFsbWFzay0+dmFsOwogfQotCi12b2lkIGlwYWhhbF9nZXRfc3RhdHVzX2VwX3ZhbG1hc2soaW50IHBpcGVfbnVtLAotCXN0cnVjdCBpcGFoYWxfcmVnX3ZhbG1hc2sgKnZhbG1hc2spCi17Ci0JaWYgKCF2YWxtYXNrKSB7Ci0JCUlQQUhBTF9FUlIoIklucHV0IGVycm9yXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXZhbG1hc2stPnZhbCA9Ci0JCShwaXBlX251bSAmIElQQV9FTkRQX1NUQVRVU19uX1NUQVRVU19FTkRQX0JNU0spIDw8Ci0JCUlQQV9FTkRQX1NUQVRVU19uX1NUQVRVU19FTkRQX1NIRlQ7Ci0KLQl2YWxtYXNrLT5tYXNrID0KLQkJSVBBX0VORFBfU1RBVFVTX25fU1RBVFVTX0VORFBfQk1TSyA8PAotCQlJUEFfRU5EUF9TVEFUVVNfbl9TVEFUVVNfRU5EUF9TSEZUOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFoYWwvaXBhaGFsX3JlZy5oIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9pcGFoYWwvaXBhaGFsX3JlZy5oCmluZGV4IGEyODY0Y2QuLmRmM2M5NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvaXBhaGFsL2lwYWhhbF9yZWcuaAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL2lwYWhhbC9pcGFoYWxfcmVnLmgKQEAgLTU0MSw4ICs1NDEsNiBAQAogdm9pZCBpcGFoYWxfZ2V0X2ZsdHJ0X2hhc2hfZmx1c2hfdmFsbWFzaygKIAlzdHJ1Y3QgaXBhaGFsX3JlZ19mbHRydF9oYXNoX2ZsdXNoICpmbHVzaCwKIAlzdHJ1Y3QgaXBhaGFsX3JlZ192YWxtYXNrICp2YWxtYXNrKTsKLXZvaWQgaXBhaGFsX2dldF9zdGF0dXNfZXBfdmFsbWFzayhpbnQgcGlwZV9udW0sCi0Jc3RydWN0IGlwYWhhbF9yZWdfdmFsbWFzayAqdmFsbWFzayk7CiAKICNlbmRpZiAvKiBfSVBBSEFMX1JFR19IXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL3JtbmV0X2lwYS5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9ybW5ldF9pcGEuYwppbmRleCBiMTE5YTY5Li5mMDhlMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL3JtbmV0X2lwYS5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvcm1uZXRfaXBhLmMKQEAgLTE0Miw2ICsxNDIsOSBAQAogCXUzMiBpcGEzX3RvX2FwcHNfaGRsOwogCXN0cnVjdCBtdXRleCBwaXBlX2hhbmRsZV9ndWFyZDsKIAlzdHJ1Y3QgbXV0ZXggYWRkX211eF9jaGFubmVsX2xvY2s7CisJdTMyIHBtX2hkbDsKKwl1MzIgcTZfcG1faGRsOworCXUzMiBxNl90ZXRoX3BtX2hkbDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgcm1uZXRfaXBhM19jb250ZXh0ICpybW5ldF9pcGEzX2N0eDsKQEAgLTQyMyw2ICs0MjYsOCBAQAogewogCWludCBpLCBqOwogCisJLyogcHJldmVudCBtdWx0aS10aHJlYWRzIGFjY2Vzc2luZyBybW5ldF9pcGEzX2N0eC0+bnVtX3E2X3J1bGVzICovCisJbXV0ZXhfbG9jaygmcm1uZXRfaXBhM19jdHgtPmFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAlpZiAocnVsZV9yZXEtPmZpbHRlcl9zcGVjX2V4X2xpc3RfdmFsaWQgPT0gdHJ1ZSkgewogCQlybW5ldF9pcGEzX2N0eC0+bnVtX3E2X3J1bGVzID0KIAkJCXJ1bGVfcmVxLT5maWx0ZXJfc3BlY19leF9saXN0X2xlbjsKQEAgLTQzMSw2ICs0MzYsOCBAQAogCX0gZWxzZSB7CiAJCXJtbmV0X2lwYTNfY3R4LT5udW1fcTZfcnVsZXMgPSAwOwogCQlJUEFXQU5FUlIoImdvdCBubyBVTCBydWxlcyBmcm9tIG1vZGVtXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZybW5ldF9pcGEzX2N0eC0+CisJCQkJCWFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC02MzMsOSArNjQwLDEzIEBACiAJcm1uZXRfaXBhM19jdHgtPm51bV9xNl9ydWxlcyA9IDA7CiAJbWVtc2V0KGlwYTNfcW1pX2N0eC0+cTZfdWxfZmlsdGVyX3J1bGUsIDAsCiAJCXNpemVvZihpcGEzX3FtaV9jdHgtPnE2X3VsX2ZpbHRlcl9ydWxlKSk7CisJbXV0ZXhfdW5sb2NrKCZybW5ldF9pcGEzX2N0eC0+CisJCWFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAlyZXR1cm4gLUVJTlZBTDsKIAogc3VjY2VzczoKKwltdXRleF91bmxvY2soJnJtbmV0X2lwYTNfY3R4LT4KKwkJYWRkX211eF9jaGFubmVsX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0xMDg2LDcgKzEwOTcsNiBAQAogCWludCByZXQgPSAwOwogCWJvb2wgcW1hcF9jaGVjazsKIAlzdHJ1Y3QgaXBhM193d2FuX3ByaXZhdGUgKnd3YW5fcHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaXBhX3R4X21ldGEgbWV0YTsKIAogCWlmIChza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QX01BUCkpIHsKIAkJSVBBV0FOREJHX0xPVwpAQCAtMTEyNyw4ICsxMTM3LDE0IEBACiAKIHNlbmQ6CiAJLyogSVBBX1JNIGNoZWNraW5nIHN0YXJ0ICovCi0JcmV0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVxdWVzdF9yZXNvdXJjZSgKLQkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9EKTsKKwlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pIHsKKwkJLyogYWN0aXZhdGUgdGhlIG1vZGVtIHBtIGZvciBjbG9jayBzY2FsaW5nICovCisJCWlwYV9wbV9hY3RpdmF0ZShybW5ldF9pcGEzX2N0eC0+cTZfcG1faGRsKTsKKwkJcmV0ID0gaXBhX3BtX2FjdGl2YXRlKHJtbmV0X2lwYTNfY3R4LT5wbV9oZGwpOworCX0gZWxzZSB7CisJCXJldCA9IGlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlcXVlc3RfcmVzb3VyY2UoCisJCQlJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QpOworCX0KIAlpZiAocmV0ID09IC1FSU5QUk9HUkVTUykgewogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKQEAgLTExNDIsMTcgKzExNTgsMTEgQEAKIAl9CiAJLyogSVBBX1JNIGNoZWNraW5nIGVuZCAqLwogCi0JaWYgKFJNTkVUX01BUF9HRVRfQ0RfQklUKHNrYikpIHsKLQkJbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOwotCQltZXRhLnBrdF9pbml0X2RzdF9lcF92YWxpZCA9IHRydWU7Ci0JCW1ldGEucGt0X2luaXRfZHN0X2VwX3JlbW90ZSA9IHRydWU7Ci0JCW1ldGEucGt0X2luaXRfZHN0X2VwID0KLQkJCWlwYTNfZ2V0X2VwX21hcHBpbmcoSVBBX0NMSUVOVF9RNl9XQU5fQ09OUyk7Ci0JCXJldCA9IGlwYTNfdHhfZHAoSVBBX0NMSUVOVF9BUFBTX1dBTl9QUk9ELCBza2IsICZtZXRhKTsKLQl9IGVsc2UgewotCQlyZXQgPSBpcGEzX3R4X2RwKElQQV9DTElFTlRfQVBQU19XQU5fUFJPRCwgc2tiLCBOVUxMKTsKLQl9Ci0KKwkvKgorCSAqIGJvdGggZGF0YSBwYWNrZXRzIGFuZCBjb21tYW5kIHdpbGwgYmUgcm91dGVkIHRvCisJICogSVBBX0NMSUVOVF9RNl9XQU5fQ09OUyBiYXNlZCBvbiBzdGF0dXMgY29uZmlndXJhdGlvbgorCSAqLworCXJldCA9IGlwYTNfdHhfZHAoSVBBX0NMSUVOVF9BUFBTX1dBTl9QUk9ELCBza2IsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJcmV0ID0gTkVUREVWX1RYX0JVU1k7CiAJCWdvdG8gb3V0OwpAQCAtMTE2Myw5ICsxMTczLDE1IEBACiAJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAlyZXQgPSBORVRERVZfVFhfT0s7CiBvdXQ6Ci0JaWYgKGF0b21pY19yZWFkKCZ3d2FuX3B0ci0+b3V0c3RhbmRpbmdfcGt0cykgPT0gMCkKLQkJaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVsZWFzZV9yZXNvdXJjZSgKLQkJCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7CisJaWYgKGF0b21pY19yZWFkKCZ3d2FuX3B0ci0+b3V0c3RhbmRpbmdfcGt0cykgPT0gMCkgeworCQlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pIHsKKwkJCWlwYV9wbV9kZWZlcnJlZF9kZWFjdGl2YXRlKHJtbmV0X2lwYTNfY3R4LT5wbV9oZGwpOworCQkJaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUocm1uZXRfaXBhM19jdHgtPnE2X3BtX2hkbCk7CisJCX0gZWxzZSB7CisJCQlpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9yZWxlYXNlX3Jlc291cmNlKAorCQkJCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7CisJCX0KKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTIxNyw5ICsxMjMzLDE1IEBACiAJCW5ldGlmX3dha2VfcXVldWUod3dhbl9wdHItPm5ldCk7CiAJfQogCi0JaWYgKGF0b21pY19yZWFkKCZ3d2FuX3B0ci0+b3V0c3RhbmRpbmdfcGt0cykgPT0gMCkKLQkJaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfcmVsZWFzZV9yZXNvdXJjZSgKKwlpZiAoYXRvbWljX3JlYWQoJnd3YW5fcHRyLT5vdXRzdGFuZGluZ19wa3RzKSA9PSAwKSB7CisJCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkgeworCQkJaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUocm1uZXRfaXBhM19jdHgtPnBtX2hkbCk7CisJCQlpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShybW5ldF9pcGEzX2N0eC0+cTZfcG1faGRsKTsKKwkJfSBlbHNlIHsKKwkJCWlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX3JlbGVhc2VfcmVzb3VyY2UoCiAJCQlJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QpOworCQl9CisJfQogCV9fbmV0aWZfdHhfdW5sb2NrX2JoKG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCAwKSk7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIH0KQEAgLTEzNzMsOSArMTM5NSw3IEBACiAJfQogCiAJaWYgKChlLT51LmRhdGEpICYgUk1ORVRfSU9DVExfRUdSRVNTX0ZPUk1BVF9BR0dSRUdBVElPTikgewotCQlJUEFXQU5FUlIoIldBTiBVTCBBZ2dyZWdhdGlvbiBub3Qgc3VwcG9ydGVkISFcbiIpOwotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJSVBBV0FOREJHKCJXQU4gVUwgQWdncmVnYXRpb24gZW5hYmxlZFxuIik7CiAJCWlwYV93YW5fZXBfY2ZnLT5pcGFfZXBfY2ZnLmFnZ3IuYWdncl9lbiA9IElQQV9FTkFCTEVfREVBR0dSOwogCQlpcGFfd2FuX2VwX2NmZy0+aXBhX2VwX2NmZy5hZ2dyLmFnZ3IgPSBJUEFfUUNNQVA7CiAKQEAgLTE0MjksOCArMTQ0OSwxMyBAQAogCiAJaWYgKHJtbmV0X2lwYTNfY3R4LT5udW1fcTZfcnVsZXMgIT0gMCkgewogCQkvKiBhbHJlYWR5IGdvdCBRNiBVTCBmaWx0ZXIgcnVsZXMqLwotCQlpZiAoaXBhM19xbWlfY3R4LT5tb2RlbV9jZmdfZW1iX3BpcGVfZmx0ID09IGZhbHNlKQorCQlpZiAoaXBhM19xbWlfY3R4LT5tb2RlbV9jZmdfZW1iX3BpcGVfZmx0ID09IGZhbHNlKSB7CisJCQkvKiBwcmV2ZW50IG11bHRpLXRocmVhZHMgYWNjZXNzaW5nIG51bV9xNl9ydWxlcyAqLworCQkJbXV0ZXhfbG9jaygmcm1uZXRfaXBhM19jdHgtPmFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKIAkJCXJjID0gaXBhM193d2FuX2FkZF91bF9mbHRfcnVsZV90b19pcGEoKTsKKwkJCW11dGV4X3VubG9jaygmcm1uZXRfaXBhM19jdHgtPgorCQkJCWFkZF9tdXhfY2hhbm5lbF9sb2NrKTsKKwkJfQogCQlpZiAocmMpCiAJCQlJUEFXQU5FUlIoImluc3RhbGwgVUwgcnVsZXMgZmFpbGVkXG4iKTsKIAkJZWxzZQpAQCAtMTg1NCw2ICsxODc5LDkxIEBACiAJCXJldHVybjsKIAl9CiB9CisKK2ludCBpcGEzX3d3YW5fc2V0X21vZGVtX3N0YXRlKHN0cnVjdCB3YW5faW9jdGxfbm90aWZ5X3dhbl9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWlwYV9wbV9pc191c2VkKCkpCisJCXJldHVybiAwOworCisJaWYgKHN0YXRlLT51cCkKKwkJcmV0dXJuIGlwYV9wbV9hY3RpdmF0ZV9zeW5jKHJtbmV0X2lwYTNfY3R4LT5xNl90ZXRoX3BtX2hkbCk7CisJZWxzZQorCQlyZXR1cm4gaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhybW5ldF9pcGEzX2N0eC0+cTZfdGV0aF9wbV9oZGwpOworfQorCisvKioKKyAqIGlwYTNfcTZfcmVnaXN0ZXJfcG0gLSBSZWdpc3RlciBtb2RlbSBjbGllbnRzIGZvciBQTQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciAyIGNsaWVudCB3aXRoIElQQSBQTSB0byByZXByZXNlbnQgbW9kZW0KKyAqIGluIGNsb2NrIHNjYWxpbmcgY2FsY3VsYXRpb246CisgKgktICJFTUIgTU9ERU0iIC0gdGhpcyBjbGllbnQgd2lsbCBiZSBhY3RpdmF0ZWQgd2l0aCBlbWJlZGRlZCB0cmFmZmljCisJLSAiVEVUSCBNT0RFTSIgLSB0aGlzIGNsaWVudCB3ZSBiZSBhY3RpdmF0ZWQgYnkgSVBBQ00gb24gb2ZmbG9hZCB0bworCSAgbW9kZW0uCisqLworc3RhdGljIGludCBpcGEzX3E2X3JlZ2lzdGVyX3BtKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyBwbV9yZWc7CisKKwltZW1zZXQoJnBtX3JlZywgMCwgc2l6ZW9mKHBtX3JlZykpOworCXBtX3JlZy5uYW1lID0gIkVNQiBNT0RFTSI7CisJcG1fcmVnLmdyb3VwID0gSVBBX1BNX0dST1VQX01PREVNOworCXBtX3JlZy5za2lwX2Nsa192b3RlID0gdHJ1ZTsKKwlyZXN1bHQgPSBpcGFfcG1fcmVnaXN0ZXIoJnBtX3JlZywgJnJtbmV0X2lwYTNfY3R4LT5xNl9wbV9oZGwpOworCWlmIChyZXN1bHQpIHsKKwkJSVBBRVJSKCJmYWlsZWQgdG8gY3JlYXRlIElQQSBQTSBjbGllbnQgJWRcbiIsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcG1fcmVnLm5hbWUgPSAiVEVUSCBNT0RFTSI7CisJcG1fcmVnLmdyb3VwID0gSVBBX1BNX0dST1VQX01PREVNOworCXBtX3JlZy5za2lwX2Nsa192b3RlID0gdHJ1ZTsKKwlyZXN1bHQgPSBpcGFfcG1fcmVnaXN0ZXIoJnBtX3JlZywgJnJtbmV0X2lwYTNfY3R4LT5xNl90ZXRoX3BtX2hkbCk7CisJaWYgKHJlc3VsdCkgeworCQlJUEFFUlIoImZhaWxlZCB0byBjcmVhdGUgSVBBIFBNIGNsaWVudCAlZFxuIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXBhM19xNl9kZXJlZ2lzdGVyX3BtKHZvaWQpCit7CisJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhybW5ldF9pcGEzX2N0eC0+cTZfcG1faGRsKTsKKwlpcGFfcG1fZGVyZWdpc3RlcihybW5ldF9pcGEzX2N0eC0+cTZfcG1faGRsKTsKK30KKworaW50IGlwYTNfd3dhbl9zZXRfbW9kZW1fcGVyZl9wcm9maWxlKGludCB0aHJvdWdocHV0KQoreworCXN0cnVjdCBpcGFfcm1fcGVyZl9wcm9maWxlIHByb2ZpbGU7CisJaW50IHJldDsKKworCXJldCA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKHJtbmV0X2lwYTNfY3R4LT5xNl9wbV9oZGwsIHRocm91Z2hwdXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKHJtbmV0X2lwYTNfY3R4LT5xNl90ZXRoX3BtX2hkbCwKKwkJdGhyb3VnaHB1dCk7CisKKwlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pIHsKKwkJcmV0ID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUocm1uZXRfaXBhM19jdHgtPnE2X3BtX2hkbCwKKwkJCXRocm91Z2hwdXQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUocm1uZXRfaXBhM19jdHgtPnE2X3RldGhfcG1faGRsLAorCQkJdGhyb3VnaHB1dCk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KCZwcm9maWxlLCAwLCBzaXplb2YocHJvZmlsZSkpOworCQlwcm9maWxlLm1heF9zdXBwb3J0ZWRfYmFuZHdpZHRoX21icHMgPSB0aHJvdWdocHV0OworCQlyZXQgPSBpcGFfcm1fc2V0X3BlcmZfcHJvZmlsZShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKKwkJCSZwcm9maWxlKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGlwYTNfcTZfaW5pdGlhbGl6ZV9ybSh2b2lkKQogewogCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBjcmVhdGVfcGFyYW1zOwpAQCAtMjA3MSw2ICsyMTgxLDEyMCBAQAogCXNjaGVkdWxlX3dvcmsoJmlwYTNfc2NoZWR1bGVkX3Byb2JlKTsKIH0KIAorc3RhdGljIHZvaWQgaXBhX3BtX3d3YW5fcG1fY2Iodm9pZCAqcCwgZW51bSBpcGFfcG1fY2JfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXA7CisJc3RydWN0IGlwYTNfd3dhbl9wcml2YXRlICp3d2FuX3B0ciA9IG5ldGRldl9wcml2KGRldik7CisKKwlJUEFXQU5EQkdfTE9XKCJldmVudCAlZFxuIiwgZXZlbnQpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIElQQV9QTV9DTElFTlRfQUNUSVZBVEVEOgorCQlpZiAod3dhbl9wdHItPmRldmljZV9zdGF0dXMgPT0gV1dBTl9ERVZJQ0VfSU5BQ1RJVkUpIHsKKwkJCWNvbXBsZXRlX2FsbCgmd3dhbl9wdHItPnJlc291cmNlX2dyYW50ZWRfY29tcGxldGlvbik7CisJCQlicmVhazsKKwkJfQorCQlpcGEzX3JtX3Jlc291cmNlX2dyYW50ZWQoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogdW5rbm93biBldmVudCAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGlwYTNfd3dhbl9yZWdpc3Rlcl9uZXRkZXZfcG1fY2xpZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyBwbV9yZWc7CisKKwltZW1zZXQoJnBtX3JlZywgMCwgc2l6ZW9mKHBtX3JlZykpOworCXBtX3JlZy5uYW1lID0gSVBBX05FVERFVigpLT5uYW1lOworCXBtX3JlZy51c2VyX2RhdGEgPSBkZXY7CisJcG1fcmVnLmNhbGxiYWNrID0gaXBhX3BtX3d3YW5fcG1fY2I7CisJcG1fcmVnLmdyb3VwID0gSVBBX1BNX0dST1VQX0FQUFM7CisJcmVzdWx0ID0gaXBhX3BtX3JlZ2lzdGVyKCZwbV9yZWcsICZybW5ldF9pcGEzX2N0eC0+cG1faGRsKTsKKwlpZiAocmVzdWx0KSB7CisJCUlQQUVSUigiZmFpbGVkIHRvIGNyZWF0ZSBJUEEgUE0gY2xpZW50ICVkXG4iLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwYTNfd3dhbl9kZXJlZ2lzdGVyX25ldGRldl9wbV9jbGllbnQodm9pZCkKK3sKKwlpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKHJtbmV0X2lwYTNfY3R4LT5wbV9oZGwpOworCWlwYV9wbV9kZXJlZ2lzdGVyKHJtbmV0X2lwYTNfY3R4LT5wbV9oZGwpOworfQorCitzdGF0aWMgaW50IGlwYTNfd3dhbl9jcmVhdGVfd3dhbl9ybV9yZXNvdXJjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcyBpcGFfcm1fcGFyYW1zOworCXN0cnVjdCBpcGFfcm1fcGVyZl9wcm9maWxlIHByb2ZpbGU7CisJaW50IHJldDsKKworCW1lbXNldCgmaXBhX3JtX3BhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcykpOworCWlwYV9ybV9wYXJhbXMubmFtZSA9IElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRDsKKwlpcGFfcm1fcGFyYW1zLnJlZ19wYXJhbXMudXNlcl9kYXRhID0gZGV2OworCWlwYV9ybV9wYXJhbXMucmVnX3BhcmFtcy5ub3RpZnlfY2IgPSBpcGEzX3JtX25vdGlmeTsKKwlyZXQgPSBpcGFfcm1fY3JlYXRlX3Jlc291cmNlKCZpcGFfcm1fcGFyYW1zKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBjcmVhdGUgcmVzb3Vyc2UgJWQgaW4gSVBBIFJNXG4iLAorCQkJX19mdW5jX18sIElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX2luaXQoSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELAorCQlJUEFfUk1fSU5BQ1RJVklUWV9USU1FUik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBpcGEgcm0gdGltZXIgaW5pdCBmYWlsZWQgJWQgb24gcmVzb3Vyc2UgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QpOworCQlnb3RvIHRpbWVyX2luaXRfZXJyOworCX0KKwkvKiBhZGQgZGVwZW5kZW5jeSAqLworCXJldCA9IGlwYV9ybV9hZGRfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsCisJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKKwlpZiAocmV0KQorCQlnb3RvIGFkZF9kcG5kX2VycjsKKwkvKiBzZXR1cCBQZXJmb3JtYW5jZSBwcm9maWxlICovCisJbWVtc2V0KCZwcm9maWxlLCAwLCBzaXplb2YocHJvZmlsZSkpOworCXByb2ZpbGUubWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwcyA9IElQQV9BUFBTX01BWF9CV19JTl9NQlBTOworCXJldCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwKKwkJJnByb2ZpbGUpOworCWlmIChyZXQpCisJCWdvdG8gc2V0X3BlcmZfZXJyOworCisJcmV0dXJuIDA7CisKK3NldF9wZXJmX2VycjoKKwlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELAorCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7CithZGRfZHBuZF9lcnI6CisJaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfZGVzdHJveSgKKwkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9EKTsgLyogSVBBX1JNICovCit0aW1lcl9pbml0X2VycjoKKwlpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXBhM193d2FuX2RlbGV0ZV93d2FuX3JtX3Jlc291cmNlKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsCisJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKKwlpZiAocmV0IDwgMCkKKwkJSVBBV0FORVJSKCJFcnJvciBkZWxldGluZyBkZXBlbmRlbmN5ICVkLT4lZCwgcmV0PSVkXG4iLAorCQlJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsIElQQV9STV9SRVNPVVJDRV9RNl9DT05TLAorCQlyZXQpOworCXJldCA9IGlwYV9ybV9pbmFjdGl2aXR5X3RpbWVyX2Rlc3Ryb3koSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9EKTsKKwlpZiAocmV0IDwgMCkKKwkJSVBBV0FORVJSKAorCQkiRXJyb3IgaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfZGVzdHJveSByZXNvdXJjZSAlZCwgcmV0PSVkXG4iLAorCQlJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsIHJldCk7CisJcmV0ID0gaXBhX3JtX2RlbGV0ZV9yZXNvdXJjZShJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QpOworCWlmIChyZXQgPCAwKQorCQlJUEFXQU5FUlIoIkVycm9yIGRlbGV0aW5nIHJlc291cmNlICVkLCByZXQ9JWRcbiIsCisJCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwgcmV0KTsKK30KKwogLyoqCiAgKiBpcGEzX3d3YW5fcHJvYmUoKSAtIEluaXRpYWxpemVkIHRoZSBtb2R1bGUgYW5kIHJlZ2lzdGVycyBhcyBhCiAgKiBuZXR3b3JrIGludGVyZmFjZSB0byB0aGUgbmV0d29yayBzdGFjawpAQCAtMjA4OCw4ICsyMzEyLDYgQEAKIHsKIAlpbnQgcmV0LCBpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGlwYV9ybV9jcmVhdGVfcGFyYW1zIGlwYV9ybV9wYXJhbXM7CS8qIElQQV9STSAqLwotCXN0cnVjdCBpcGFfcm1fcGVyZl9wcm9maWxlIHByb2ZpbGU7CQkJLyogSVBBX1JNICovCiAKIAlwcl9pbmZvKCJybW5ldF9pcGEzIHN0YXJ0ZWQgaW5pdGlhbGl6YXRpb25cbiIpOwogCkBAIC0yMTgzLDcgKzI0MDUsMTAgQEAKIAogCWlmICghYXRvbWljX3JlYWQoJnJtbmV0X2lwYTNfY3R4LT5pc19zc3IpKSB7CiAJCS8qIElQQV9STSBjb25maWd1cmF0aW9uIHN0YXJ0cyAqLwotCQlyZXQgPSBpcGEzX3E2X2luaXRpYWxpemVfcm0oKTsKKwkJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKQorCQkJcmV0ID0gaXBhM19xNl9yZWdpc3Rlcl9wbSgpOworCQllbHNlCisJCQlyZXQgPSBpcGEzX3E2X2luaXRpYWxpemVfcm0oKTsKIAkJaWYgKHJldCkgewogCQkJSVBBV0FORVJSKCIlczogaXBhM19xNl9pbml0aWFsaXplX3JtIGZhaWxlZCwgcmV0OiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgcmV0KTsKQEAgLTIxOTEsMzYgKzI0MTYsMTQgQEAKIAkJfQogCX0KIAotCW1lbXNldCgmaXBhX3JtX3BhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBpcGFfcm1fY3JlYXRlX3BhcmFtcykpOwotCWlwYV9ybV9wYXJhbXMubmFtZSA9IElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRDsKLQlpcGFfcm1fcGFyYW1zLnJlZ19wYXJhbXMudXNlcl9kYXRhID0gZGV2OwotCWlwYV9ybV9wYXJhbXMucmVnX3BhcmFtcy5ub3RpZnlfY2IgPSBpcGEzX3JtX25vdGlmeTsKLQlyZXQgPSBpcGFfcm1fY3JlYXRlX3Jlc291cmNlKCZpcGFfcm1fcGFyYW1zKTsKKwlpZiAoaXBhM19jdHgtPnVzZV9pcGFfcG0pCisJCXJldCA9IGlwYTNfd3dhbl9yZWdpc3Rlcl9uZXRkZXZfcG1fY2xpZW50KGRldik7CisJZWxzZQorCQlyZXQgPSBpcGEzX3d3YW5fY3JlYXRlX3d3YW5fcm1fcmVzb3VyY2UoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuYWJsZSB0byBjcmVhdGUgcmVzb3Vyc2UgJWQgaW4gSVBBIFJNXG4iLAotCQkgICAgICAgX19mdW5jX18sIElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7Ci0JCWdvdG8gY3JlYXRlX3JzcmNfZXJyOworCQlJUEFXQU5FUlIoImZhaWwgdG8gY3JlYXRlL3JlZ2lzdGVyIHBtIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9wbTsKIAl9Ci0JcmV0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfaW5pdChJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsCi0JCQkJCSAgIElQQV9STV9JTkFDVElWSVRZX1RJTUVSKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGlwYSBybSB0aW1lciBpbml0IGZhaWxlZCAlZCBvbiByZXNvdXJzZSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQsIElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7Ci0JCWdvdG8gdGltZXJfaW5pdF9lcnI7Ci0JfQotCS8qIGFkZCBkZXBlbmRlbmN5ICovCi0JcmV0ID0gaXBhX3JtX2FkZF9kZXBlbmRlbmN5KElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwKLQkJCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKLQlpZiAocmV0KQotCQlnb3RvIGFkZF9kcG5kX2VycjsKLQkvKiBzZXR1cCBQZXJmb3JtYW5jZSBwcm9maWxlICovCi0JbWVtc2V0KCZwcm9maWxlLCAwLCBzaXplb2YocHJvZmlsZSkpOwotCXByb2ZpbGUubWF4X3N1cHBvcnRlZF9iYW5kd2lkdGhfbWJwcyA9IElQQV9BUFBTX01BWF9CV19JTl9NQlBTOwotCXJldCA9IGlwYV9ybV9zZXRfcGVyZl9wcm9maWxlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwKLQkJCSZwcm9maWxlKTsKLQlpZiAocmV0KQotCQlnb3RvIHNldF9wZXJmX2VycjsKLQkvKiBJUEFfUk0gY29uZmlndXJhdGlvbiBlbmRzICovCiAKIAkvKiBFbmFibGUgU0cgc3VwcG9ydCBpbiBuZXRkZXZpY2UuICovCiAJaWYgKGlwYTNfcm1uZXRfcmVzLmlwYV9hZHZlcnRpc2Vfc2dfc3VwcG9ydCkKQEAgLTIyNTYsMjggKzI0NTksMTggQEAKIAkJbmV0aWZfbmFwaV9kZWwoJihybW5ldF9pcGEzX2N0eC0+d3dhbl9wcml2LT5uYXBpKSk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIHNldF9wZXJmX2VycjoKLQlyZXQgPSBpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELAotCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7Ci0JaWYgKHJldCkKLQkJSVBBV0FORVJSKCJFcnJvciBkZWxldGluZyBkZXBlbmRlbmN5ICVkLT4lZCwgcmV0PSVkXG4iLAotCQkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELCBJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUywKLQkJCXJldCk7Ci1hZGRfZHBuZF9lcnI6Ci0JcmV0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfZGVzdHJveSgKLQkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9EKTsgLyogSVBBX1JNICovCi0JaWYgKHJldCkKLQkJSVBBV0FORVJSKCJFcnJvciBpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9kZXN0cm95ICVkLCByZXQ9JWRcbiIsCi0JCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwgcmV0KTsKLXRpbWVyX2luaXRfZXJyOgotCXJldCA9IGlwYV9ybV9kZWxldGVfcmVzb3VyY2UoSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9EKTsKLQlpZiAocmV0KQotCQlJUEFXQU5FUlIoIkVycm9yIGRlbGV0aW5nIHJlc291cmNlICVkLCByZXQ9JWRcbiIsCi0JCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwgcmV0KTsKLWNyZWF0ZV9yc3JjX2VycjoKLQotCWlmICghYXRvbWljX3JlYWQoJnJtbmV0X2lwYTNfY3R4LT5pc19zc3IpKQotCQlpcGEzX3E2X2RlaW5pdGlhbGl6ZV9ybSgpOwotCisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKQorCQlpcGEzX3d3YW5fZGVyZWdpc3Rlcl9uZXRkZXZfcG1fY2xpZW50KCk7CisJZWxzZQorCQlpcGEzX3d3YW5fZGVsZXRlX3d3YW5fcm1fcmVzb3VyY2UoKTsKK2ZhaWxfcG06CisJaWYgKGlwYTNfY3R4LT51c2VfaXBhX3BtKSB7CisJCWlmICghYXRvbWljX3JlYWQoJnJtbmV0X2lwYTNfY3R4LT5pc19zc3IpKQorCQkJaXBhM19xNl9kZXJlZ2lzdGVyX3BtKCk7CisJfSBlbHNlIHsKKwkJaWYgKCFhdG9taWNfcmVhZCgmcm1uZXRfaXBhM19jdHgtPmlzX3NzcikpCisJCQlpcGEzX3E2X2RlaW5pdGlhbGl6ZV9ybSgpOworCX0KIHE2X2luaXRfZXJyOgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcm1uZXRfaXBhM19jdHgtPnd3YW5fcHJpdiA9IE5VTEw7CkBAIC0yMzEzLDIxICsyNTA2LDEwIEBACiAJCW5ldGlmX25hcGlfZGVsKCYocm1uZXRfaXBhM19jdHgtPnd3YW5fcHJpdi0+bmFwaSkpOwogCW11dGV4X3VubG9jaygmcm1uZXRfaXBhM19jdHgtPnBpcGVfaGFuZGxlX2d1YXJkKTsKIAl1bnJlZ2lzdGVyX25ldGRldihJUEFfTkVUREVWKCkpOwotCXJldCA9IGlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QsCi0JCUlQQV9STV9SRVNPVVJDRV9RNl9DT05TKTsKLQlpZiAocmV0IDwgMCkKLQkJSVBBV0FORVJSKCJFcnJvciBkZWxldGluZyBkZXBlbmRlbmN5ICVkLT4lZCwgcmV0PSVkXG4iLAotCQkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELCBJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUywKLQkJCXJldCk7Ci0JcmV0ID0gaXBhX3JtX2luYWN0aXZpdHlfdGltZXJfZGVzdHJveShJUEFfUk1fUkVTT1VSQ0VfV1dBTl8wX1BST0QpOwotCWlmIChyZXQgPCAwKQotCQlJUEFXQU5FUlIoCi0JCSJFcnJvciBpcGFfcm1faW5hY3Rpdml0eV90aW1lcl9kZXN0cm95IHJlc291cmNlICVkLCByZXQ9JWRcbiIsCi0JCUlQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCwgcmV0KTsKLQlyZXQgPSBpcGFfcm1fZGVsZXRlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7Ci0JaWYgKHJldCA8IDApCi0JCUlQQVdBTkVSUigiRXJyb3IgZGVsZXRpbmcgcmVzb3VyY2UgJWQsIHJldD0lZFxuIiwKLQkJSVBBX1JNX1JFU09VUkNFX1dXQU5fMF9QUk9ELCByZXQpOworCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJaXBhM193d2FuX2RlcmVnaXN0ZXJfbmV0ZGV2X3BtX2NsaWVudCgpOworCWVsc2UKKwkJaXBhM193d2FuX2RlbGV0ZV93d2FuX3JtX3Jlc291cmNlKCk7CiAJY2FuY2VsX3dvcmtfc3luYygmaXBhM190eF93YWtlcXVldWVfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaXBhX3RldGhlcl9zdGF0c19wb2xsX3dha2VxdWV1ZV93b3JrKTsKIAlpZiAoSVBBX05FVERFVigpKQpAQCAtMjM4MSwyMyArMjU2MywyNiBAQAogCWlmICh3d2FuX3B0ciA9PSBOVUxMKSB7CiAJCUlQQVdBTkVSUigid3dhbl9wdHIgaXMgTlVMTC5cbiIpOwogCQlyZXQgPSAwOwotCQlnb3RvIHVubG9ja19hbmRfYmFpbDsKKwkJbmV0aWZfdHhfdW5sb2NrX2JoKG5ldGRldik7CisJCWdvdG8gYmFpbDsKIAl9CiAKIAkvKiBEbyBub3QgYWxsb3cgQTcgdG8gc3VzcGVuZCBpbiBjYXNlIHRoZXJlIGFyZSBvdXN0YW5kaW5nIHBhY2tldHMgKi8KIAlpZiAoYXRvbWljX3JlYWQoJnd3YW5fcHRyLT5vdXRzdGFuZGluZ19wa3RzKSAhPSAwKSB7CiAJCUlQQVdBTkRCRygiT3V0c3RhbmRpbmcgcGFja2V0cywgcG9zdHBvbmluZyBBUCBzdXNwZW5kLlxuIik7CiAJCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gdW5sb2NrX2FuZF9iYWlsOworCQluZXRpZl90eF91bmxvY2tfYmgobmV0ZGV2KTsKKwkJZ290byBiYWlsOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG5vIFR4IG9wZXJhdGlvbiBvbmdvaW5nICovCiAJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCWlwYV9ybV9yZWxlYXNlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7Ci0JcmV0ID0gMDsKLQotdW5sb2NrX2FuZF9iYWlsOgogCW5ldGlmX3R4X3VubG9ja19iaChuZXRkZXYpOworCWlmIChpcGEzX2N0eC0+dXNlX2lwYV9wbSkKKwkJaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhybW5ldF9pcGEzX2N0eC0+cG1faGRsKTsKKwllbHNlCisJCWlwYV9ybV9yZWxlYXNlX3Jlc291cmNlKElQQV9STV9SRVNPVVJDRV9XV0FOXzBfUFJPRCk7CisJcmV0ID0gMDsKIGJhaWw6CiAJSVBBV0FOREJHKCJFeGl0IHdpdGggJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvcm1uZXRfaXBhX2ZkX2lvY3RsLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL3JtbmV0X2lwYV9mZF9pb2N0bC5jCmluZGV4IGM3YTYxODYuLjJlNDNhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvcm1uZXRfaXBhX2ZkX2lvY3RsLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My9ybW5ldF9pcGFfZmRfaW9jdGwuYwpAQCAtNTAsNiArNTAsOSBAQAogI2RlZmluZSBXQU5fSU9DX1FVRVJZX1RFVEhFUl9TVEFUU19BTEwzMiBfSU9XUihXQU5fSU9DX01BR0lDLCBcCiAJCVdBTl9JT0NUTF9RVUVSWV9URVRIRVJfU1RBVFNfQUxMLCBcCiAJCWNvbXBhdF91cHRyX3QpCisjZGVmaW5lIFdBTl9JT0NfTk9USUZZX1dBTl9TVEFURTMyIF9JT1dSKFdBTl9JT0NfTUFHSUMsIFwKKwkJV0FOX0lPQ1RMX05PVElGWV9XQU5fU1RBVEUsIFwKKwkJY29tcGF0X3VwdHJfdCkKICNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRldl9udW0gPSAxOwpAQCAtMzE2LDYgKzMxOSwyNyBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBXQU5fSU9DX05PVElGWV9XQU5fU1RBVEU6CisJCUlQQVdBTkRCR19MT1coImRldmljZSAlcyBnb3QgV0FOX0lPQ19OT1RJRllfV0FOX1NUQVRFIDo+Pj5cbiIsCisJCQlEUklWRVJfTkFNRSk7CisJCXB5bGRfc3ogPSBzaXplb2Yoc3RydWN0IHdhbl9pb2N0bF9ub3RpZnlfd2FuX3N0YXRlKTsKKwkJcGFyYW0gPSBremFsbG9jKHB5bGRfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIXBhcmFtKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCAodTggX191c2VyICopYXJnLCBweWxkX3N6KSkgeworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGlwYTNfd3dhbl9zZXRfbW9kZW1fc3RhdGUoCisJCQkoc3RydWN0IHdhbl9pb2N0bF9ub3RpZnlfd2FuX3N0YXRlICopcGFyYW0pKSB7CisJCQlJUEFXQU5FUlIoIldBTl9JT0NfTk9USUZZX1dBTl9TVEFURSBmYWlsZWRcbiIpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FTk9UVFk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My90ZXRoX2JyaWRnZS5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL2lwYV92My90ZXRoX2JyaWRnZS5jCmluZGV4IDI5N2Y5MzIuLjc0OTZmMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS9pcGFfdjMvdGV0aF9icmlkZ2UuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvaXBhX3YzL3RldGhfYnJpZGdlLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAlkZXZfdCBkZXZfbnVtOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgY2RldiBjZGV2OworCXUzMiBtb2RlbV9wbV9oZGw7CiB9Owogc3RhdGljIHN0cnVjdCBpcGEzX3RldGhfYnJpZGdlX2N0eCAqaXBhM190ZXRoX2N0eDsKIApAQCAtMTE4LDE0ICsxMTksMjUgQEAKICovCiBpbnQgaXBhM190ZXRoX2JyaWRnZV9kaXNjb25uZWN0KGVudW0gaXBhX2NsaWVudF90eXBlIGNsaWVudCkKIHsKKwlpbnQgcmVzID0gMDsKKwogCVRFVEhfREJHX0ZVTkNfRU5UUlkoKTsKLQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1VTQl9QUk9ELAotCQkJCSBJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7Ci0JaXBhX3JtX2RlbGV0ZV9kZXBlbmRlbmN5KElQQV9STV9SRVNPVVJDRV9RNl9QUk9ELAotCQkJCSBJUEFfUk1fUkVTT1VSQ0VfVVNCX0NPTlMpOworCWlmIChpcGFfcG1faXNfdXNlZCgpKSB7CisJCXJlcyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaXBhM190ZXRoX2N0eC0+bW9kZW1fcG1faGRsKTsKKwkJaWYgKHJlcykgeworCQkJVEVUSF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSBtb2RlbSAlZFxuIiwgcmVzKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJcmVzID0gaXBhX3BtX2Rlc3Ryb3koKTsKKwl9IGVsc2UgeworCQlpcGFfcm1fZGVsZXRlX2RlcGVuZGVuY3koSVBBX1JNX1JFU09VUkNFX1VTQl9QUk9ELAorCQkJCQlJUEFfUk1fUkVTT1VSQ0VfUTZfQ09OUyk7CisJCWlwYV9ybV9kZWxldGVfZGVwZW5kZW5jeShJUEFfUk1fUkVTT1VSQ0VfUTZfUFJPRCwKKwkJCQkJSVBBX1JNX1JFU09VUkNFX1VTQl9DT05TKTsKKwl9CiAJVEVUSF9EQkdfRlVOQ19FWElUKCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzOwogfQogCiAvKioKQEAgLTE0MCw5ICsxNTIsMjcgQEAKIGludCBpcGEzX3RldGhfYnJpZGdlX2Nvbm5lY3Qoc3RydWN0IHRldGhfYnJpZGdlX2Nvbm5lY3RfcGFyYW1zICpjb25uZWN0X3BhcmFtcykKIHsKIAlpbnQgcmVzID0gMDsKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyByZWdfcGFyYW1zOworCisJbWVtc2V0KCZyZWdfcGFyYW1zLCAwLCBzaXplb2YocmVnX3BhcmFtcykpOwogCiAJVEVUSF9EQkdfRlVOQ19FTlRSWSgpOwogCisJaWYgKGlwYV9wbV9pc191c2VkKCkpIHsKKwkJcmVnX3BhcmFtcy5uYW1lID0gIk1PREVNIChVU0IgUk1ORVQpIjsKKwkJcmVnX3BhcmFtcy5ncm91cCA9IElQQV9QTV9HUk9VUF9NT0RFTTsKKwkJcmVnX3BhcmFtcy5za2lwX2Nsa192b3RlID0gdHJ1ZTsKKwkJcmVzID0gaXBhX3BtX3JlZ2lzdGVyKCZyZWdfcGFyYW1zLAorCQkJJmlwYTNfdGV0aF9jdHgtPm1vZGVtX3BtX2hkbCk7CisJCWlmIChyZXMpIHsKKwkJCVRFVEhfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIHdpdGggUE0gJWRcbiIsIHJlcyk7CisJCQlyZXR1cm4gcmVzOworCQl9CisKKwkJcmVzID0gaXBhX3BtX2FjdGl2YXRlX3N5bmMoaXBhM190ZXRoX2N0eC0+bW9kZW1fcG1faGRsKTsKKwkJZ290byBiYWlsOworCX0KKwogCS8qIEJ1aWxkIHRoZSBkZXBlbmRlbmN5IGdyYXBoLCBmaXJzdCBhZGRfZGVwZW5kZW5jeSBjYWxsIGlzIHN5bmMKIAkgKiBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhlIElQQSBjbG9ja3MgYXJlIHVwIGJlZm9yZSB3ZSBjb250aW51ZQogCSAqIGFuZCBub3RpZnkgdGhlIFVTQiBkcml2ZXIgaXQgbWF5IGNvbnRpbnVlLgpAQCAtMjM0LDYgKzI2NCw4IEBACiAJCXJlcyA9IC1FTk9ERVY7CiAJCWdvdG8gZmFpbF9jZGV2X2FkZDsKIAl9CisKKwlpcGEzX3RldGhfY3R4LT5tb2RlbV9wbV9oZGwgPSB+MDsKIAlURVRIX0RCRygiVGV0aGVyaW5nIGJyaWRnZSBkcml2ZXIgaW5pdCBPS1xuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS90ZXN0L01ha2VmaWxlIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvTWFrZWZpbGUKaW5kZXggYWY0NmJmMi4uODJiZWU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACiBvYmotJChDT05GSUdfSVBBX1VUKSArPSBpcGFfdXRfbW9kLm8KLWlwYV91dF9tb2QteSA6PSBpcGFfdXRfZnJhbWV3b3JrLm8gaXBhX3Rlc3RfZXhhbXBsZS5vIGlwYV90ZXN0X21oaS5vIGlwYV90ZXN0X2RtYS5vIGlwYV90ZXN0X2h3X3N0YXRzLm8KK2lwYV91dF9tb2QteSA6PSBpcGFfdXRfZnJhbWV3b3JrLm8gaXBhX3Rlc3RfZXhhbXBsZS5vIGlwYV90ZXN0X21oaS5vIGlwYV90ZXN0X2RtYS5vIGlwYV90ZXN0X2h3X3N0YXRzLm8gaXBhX3BtX3V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS90ZXN0L2lwYV9wbV91dC5jIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvaXBhX3BtX3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3MDQwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS90ZXN0L2lwYV9wbV91dC5jCkBAIC0wLDAgKzEsMTc1OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pcGEuaD4KKyNpbmNsdWRlICIuLi9pcGFfdjMvaXBhX3BtLmgiCisjaW5jbHVkZSAiLi4vaXBhX3YzL2lwYV9pLmgiCisjaW5jbHVkZSAiaXBhX3V0X2ZyYW1ld29yay5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKK3N0cnVjdCBjYWxsYmFja19wYXJhbSB7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisJZW51bSBpcGFfcG1fY2JfZXZlbnQgZXZ0OworfTsKKworc3RhdGljIGludCBpcGFfcG1fdXRfc2V0dXAodm9pZCAqKnBwcml2KQoreworCisJSVBBX1VUX0RCRygiU3RhcnQgU2V0dXBcbiIpOworCisJLyogZGVjcmVtZW50IFVUIHZvdGUgKi8KKwlJUEFfQUNUSVZFX0NMSUVOVFNfREVDX1NQRUNJQUwoIklQQV9VVCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhX3BtX3V0X3RlYXJkb3duKHZvaWQgKnByaXYpCit7CisJSVBBX1VUX0RCRygiU3RhcnQgVGVhcmRvd25cbiIpOworCisJLyogdW5kbyBVVCB2b3RlICovCisJSVBBX0FDVElWRV9DTElFTlRTX0lOQ19TUEVDSUFMKCJJUEFfVVQiKTsKKwlyZXR1cm4gMDsKK30KKworLyogcGFzcyBjb21wbGV0aW9uIHN0cnVjdCBhcyB0aGUgdXNlciBkYXRhL2NhbGxiYWNrIHBhcmFtcyAqLworc3RhdGljIHZvaWQgaXBhX3BtX2NhbGxfYmFjayh2b2lkICp1c2VyX2RhdGEsIGVudW0gaXBhX3BtX2NiX2V2ZW50IGV2dCkKK3sKKwlzdHJ1Y3QgY2FsbGJhY2tfcGFyYW0gKnBhcmFtOworCisJcGFyYW0gPSAoc3RydWN0IGNhbGxiYWNrX3BhcmFtICopIHVzZXJfZGF0YTsKKwlwYXJhbS0+ZXZ0ID0gZXZ0OworCisJaWYgKGV2dCA9PSBJUEFfUE1fQ0xJRU5UX0FDVElWQVRFRCkgeworCQlJUEFfVVRfREJHKCJBY3RpdmF0ZSBjYWxsYmFjayBjYWxsZWRcbiIpOworCQljb21wbGV0ZV9hbGwoJnBhcmFtLT5jb21wbGV0ZSk7CisJfSBlbHNlIGlmIChldnQgPT0gSVBBX1BNX1JFUVVFU1RfV0FLRVVQKSB7CisJCUlQQV9VVF9EQkcoIlJlcXVlc3QgV2FrZXVwIGNhbGxiYWNrIGNhbGxlZFxuIik7CisJCWNvbXBsZXRlX2FsbCgmcGFyYW0tPmNvbXBsZXRlKTsKKwl9IGVsc2UKKwkJSVBBX1VUX0VSUigiaW52YWxpZCBjYWxsYmFjayAtIGNhbGxiYWNrICMlZFxuIiwgZXZ0KTsKK30KKworc3RhdGljIGludCBjbGVhbl91cChpbnQgbiwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgaSwgaGRsLCByYyA9IDA7CisKKwl2YV9zdGFydChhcmdzLCBuKTsKKworCUlQQV9VVF9EQkcoIm4gPSAlZFxuIiwgbik7CisKKwlJUEFfVVRfREJHKCJDbGVhbiB1cCBTdGFydGVkIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWhkbCA9IHZhX2FyZyhhcmdzLCBpbnQpOworCisJCXJjID0gaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhoZGwpOworCQlpZiAocmMpIHsKKwkJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSBjbGllbnQgLSByYyA9ICVkXG4iLCByYyk7CisJCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVhY3RpdmF0ZSBmYWlsZWQiKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJjID0gaXBhX3BtX2RlcmVnaXN0ZXIoaGRsKTsKKwkJaWYgKHJjKSB7CisJCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlcmVnaXN0ZXIgY2xpZW50IC0gcmMgPSAlZFxuIiwgcmMpOworCQkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImRlcmVnaXN0ZXIgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl2YV9lbmQoYXJncyk7CisJcmMgPSBpcGFfcG1fZGVzdHJveSgpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlc3Ryb3kgcG0gLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZXN0cm95IGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0ZXN0IDEuMSAqLworc3RhdGljIGludCBpcGFfcG1fdXRfc2luZ2xlX3JlZ2lzdHJhdGlvbih2b2lkICpwcml2KQoreworCWludCByYyA9IDA7CisJaW50IGhkbCwgdm90ZTsKKwlzdHJ1Y3QgY2FsbGJhY2tfcGFyYW0gdXNlcl9kYXRhOworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHJlZ2lzdGVyX3BhcmFtcyA9IHsKKwkJLm5hbWUgPSAiVVNCIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwkJLnVzZXJfZGF0YSA9ICZ1c2VyX2RhdGEKKwl9OworCXVzZXJfZGF0YS5ldnQgPSBJUEFfUE1fQ0JfRVZFTlRfTUFYOworCisJcmMgPSBpcGFfcG1faW5pdCgmaW5pdF9wYXJhbXMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJGYWlsIHRvIGluaXQgaXBhX3BtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gaW5pdCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZ1c2VyX2RhdGEuY29tcGxldGUpOworCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJnJlZ2lzdGVyX3BhcmFtcywgJmhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgY2xpZW50IHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsKTsKKwlpZiAocmMgIT0gLUVJTlBST0dSRVNTKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcXVldWUgd29yayAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoInF1ZXVlIGFjdGl2YXRlIHdvcmsgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ1c2VyX2RhdGEuY29tcGxldGUsIEhaKSkgeworCQlJUEFfVVRfRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjdGl2YXRlX2NhbGxiYWNrXG4iKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImFjdGl2YXRlIGNhbGxiYWNrIG5vdCBjYWxsZWQiKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlpZiAodXNlcl9kYXRhLmV2dCAhPSBJUEFfUE1fQ0xJRU5UX0FDVElWQVRFRCkgeworCQlJUEFfVVRfRVJSKCJDYWxsYmFjayA9ICVkXG4iLCB1c2VyX2RhdGEuZXZ0KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNhbGxiYWNrIGNhbGxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpcGFfcG1fZGVyZWdpc3RlcihoZGwpOworCWlmIChyYyA9PSAwKSB7CisJCUlQQV9VVF9FUlIoImRlcmVnaXN0ZXIgd2FzIG5vdCB1bnN1Y2Nlc2Z1bCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImRlcmVnaXN0ZXIgd2FzIG5vdCB1bnN1Y2Nlc2Z1bCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWZlcnJlZF9kZWFjdGl2YXRlKGhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVmZXJyZWQgZGVhY3RpdmF0ZSBjbGllbnQgLSByYyA9ICVkXG4iCisJCQksIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gZGVmZXJyZWQgZGVhY3RpdmF0ZSBjbGllbnQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDEpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zbGVlcCgyMDApOworCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDApIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2RlcmVnaXN0ZXIoaGRsKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBkZXJlZ2lzdGVyIGNsaWVudCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gZGVyZWdpc3RlciBjbGllbnQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsKTsKKwlpZiAocmMgPT0gMCkgeworCQlJUEFfVVRfRVJSKCJhY3RpdmF0ZSB3YXMgbm90IHVuc3VjY2VzZnVsLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSB3YXMgbm90IHVuc3VjY2VzZnVsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2Rlc3Ryb3koKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigidGVybWluYXRlIGZhaWxlZCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoInRlcm1pbmF0ZV9mYWlsZWQiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdGVzdCAxLjEgKi8KK3N0YXRpYyBpbnQgaXBhX3BtX3V0X2RvdWJsZV9yZWdpc3Rlcl9hY3RpdmF0ZSh2b2lkICpwcml2KQoreworCWludCByYyA9IDA7CisJaW50IGhkbCwgaGRsX3Rlc3QsIHZvdGU7CisJc3RydWN0IGNhbGxiYWNrX3BhcmFtIHVzZXJfZGF0YTsKKworCXN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgaW5pdF9wYXJhbXMgPSB7CisJCS50aHJlc2hvbGRfc2l6ZSA9IElQQV9QTV9USFJFU0hPTERfTUFYLAorCQkuZGVmYXVsdF90aHJlc2hvbGQgPSB7NjAwLCAxMDAwfQorCX07CisKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyByZWdpc3Rlcl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJCS51c2VyX2RhdGEgPSAmdXNlcl9kYXRhCisJfTsKKwl1c2VyX2RhdGEuZXZ0ID0gSVBBX1BNX0NCX0VWRU5UX01BWDsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIGluaXQgcGFyYW1zIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWluaXRfY29tcGxldGlvbigmdXNlcl9kYXRhLmNvbXBsZXRlKTsKKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZyZWdpc3Rlcl9wYXJhbXMsICZoZGwpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZyZWdpc3Rlcl9wYXJhbXMsICZoZGxfdGVzdCk7CisJaWYgKHJjICE9IC1FRVhJU1QpIHsKKwkJSVBBX1VUX0VSUigicmVnaXN0ZXJlZCBjbGllbnQgd2l0aCBzYW1lIG5hbWUgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGlkIG5vdCB0byBmYWlsIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbCk7CisJaWYgKHJjICE9IC1FSU5QUk9HUkVTUykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHF1ZXVlIHdvcmsgLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJxdWV1ZSBhY3RpdmF0ZSB3b3JrIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGwpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBkbyBub3RoaW5nIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZG8gbm90aGluZyBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnVzZXJfZGF0YS5jb21wbGV0ZSwgSFopKSB7CisJCUlQQV9VVF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgYWN0aXZhdGVfY2FsbGJhY2tcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGEuZXZ0ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YS5ldnQpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2FsbGJhY2sgY2FsbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZG8gbm90aGluZyBvbiAybmQgYWN0aXZhdGUgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBub3QgcmVhY3RpdmF0ZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaGRsKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBkZWFjdGl2YXRlIGNsaWVudCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gZGVhY3RpdmF0ZSBjbGllbnQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDApIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2xlYW5fdXAoMSwgaGRsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHRlc3QgMiAqLworc3RhdGljIGludCBpcGFfcG1fdXRfZGVmZXJyZWRfZGVhY3RpdmF0ZSh2b2lkICpwcml2KQoreworCWludCByYyA9IDA7CisJaW50IGhkbCwgdm90ZTsKKwlzdHJ1Y3QgY2FsbGJhY2tfcGFyYW0gdXNlcl9kYXRhOworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIHJlZ2lzdGVyX3BhcmFtcyA9IHsKKwkJLm5hbWUgPSAiVVNCIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwkJLnVzZXJfZGF0YSA9ICZ1c2VyX2RhdGEKKwl9OworCXVzZXJfZGF0YS5ldnQgPSBJUEFfUE1fQ0JfRVZFTlRfTUFYOworCisJcmMgPSBpcGFfcG1faW5pdCgmaW5pdF9wYXJhbXMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJGYWlsIHRvIGluaXQgaXBhX3BtIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBpbml0IHBhcmFtcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnVzZXJfZGF0YS5jb21wbGV0ZSk7CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmcmVnaXN0ZXJfcGFyYW1zLCAmaGRsKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byByZWdpc3RlciIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGwpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBxdWV1ZSB3b3JrIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgicXVldWUgYWN0aXZhdGUgd29yayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnVzZXJfZGF0YS5jb21wbGV0ZSwgSFopKSB7CisJCUlQQV9VVF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgYWN0aXZhdGVfY2FsbGJhY2tcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGEuZXZ0ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YS5ldnQpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2FsbGJhY2sgY2FsbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWZlcnJlZF9kZWFjdGl2YXRlKGhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVmZmVyZWQgZGVhY3RpdmF0ZSBjbGllbnQgLSByYyA9ICVkXG4iLAorCQlyYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWZmZXJlZCBkZWFjdGl2YXRlIGZhaWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWFjdGl2YXRlIGNsaWVudCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoInJlYWN0aXZhdGUgY2xpZW50IGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaGRsKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBkZWFjdGl2YXRlX3N5bmMgY2xpZW50IC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVhY3RpdmF0ZSBzeW5jIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2xlYW5fdXAoMSwgaGRsKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyp0ZXN0IDMqLworc3RhdGljIGludCBpcGFfcG1fdXRfdHdvX2NsaWVudHNfYWN0aXZhdGUodm9pZCAqcHJpdikKK3sKKwlpbnQgcmMgPSAwOworCWludCBoZGxfVVNCLCBoZGxfV0xBTiwgdm90ZTsKKwl1MzIgcGlwZXM7CisJc3RydWN0IGNhbGxiYWNrX3BhcmFtIHVzZXJfZGF0YV9VU0I7CisJc3RydWN0IGNhbGxiYWNrX3BhcmFtIHVzZXJfZGF0YV9XTEFOOworCisKKwlzdHJ1Y3QgaXBhX3BtX2luaXRfcGFyYW1zIGluaXRfcGFyYW1zID0geworCQkudGhyZXNob2xkX3NpemUgPSBJUEFfUE1fVEhSRVNIT0xEX01BWCwKKwkJLmRlZmF1bHRfdGhyZXNob2xkID0gezYwMCwgMTAwMH0KKwl9OworCisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgVVNCX3BhcmFtcyA9IHsKKwkJLm5hbWUgPSAiVVNCIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwkJLnVzZXJfZGF0YSA9ICZ1c2VyX2RhdGFfVVNCCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwkJLnVzZXJfZGF0YSA9ICZ1c2VyX2RhdGFfV0xBTgorCX07CisJdXNlcl9kYXRhX1VTQi5ldnQgPSBJUEFfUE1fQ0JfRVZFTlRfTUFYOworCXVzZXJfZGF0YV9XTEFOLmV2dCA9IElQQV9QTV9DQl9FVkVOVF9NQVg7CisKKwlyYyA9IGlwYV9wbV9pbml0KCZpbml0X3BhcmFtcyk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoIkZhaWwgdG8gaW5pdCBpcGFfcG0gLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIGluaXQgcGFyYW1zIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWluaXRfY29tcGxldGlvbigmdXNlcl9kYXRhX1VTQi5jb21wbGV0ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZ1c2VyX2RhdGFfV0xBTi5jb21wbGV0ZSk7CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmVVNCX3BhcmFtcywgJmhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJldMQU5fcGFyYW1zLCAmaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYXNzb2NpYXRlX2lwYV9jb25zX3RvX2NsaWVudChoZGxfVVNCLCBJUEFfQ0xJRU5UX1VTQl9DT05TKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBtYXAgY2xpZW50IDEgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBtYXAgY2xpZW50Iik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2Fzc29jaWF0ZV9pcGFfY29uc190b19jbGllbnQoaGRsX1dMQU4sCisJCUlQQV9DTElFTlRfV0xBTjFfQ09OUyk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gbWFwIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gbWFwIGNsaWVudCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hc3NvY2lhdGVfaXBhX2NvbnNfdG9fY2xpZW50KGhkbF9XTEFOLAorCQlJUEFfQ0xJRU5UX1dMQU4yX0NPTlMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIG1hcCBjbGllbnQgMiB0byBtdWx0aXBsdCBwaXBlcyByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBtYXAgY2xpZW50Iik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9VU0IpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBxdWV1ZSB3b3JrIGZvciBjbGllbnQgMSAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoInF1ZXVlIGFjdGl2YXRlIHdvcmsgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9XTEFOKTsKKwlpZiAocmMgIT0gLUVJTlBST0dSRVNTKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcXVldWUgd29yayBmb3IgY2xpZW50IDIgLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJxdWV1ZSBhY3RpdmF0ZSB3b3JrIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdXNlcl9kYXRhX1VTQi5jb21wbGV0ZSwgSFopKSB7CisJCUlQQV9VVF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgYWN0aXZhdGVfY2FsbGJhY2sgMVxuIik7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBjYWxsYmFjayBub3QgY2FsbGVkIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJaWYgKHVzZXJfZGF0YV9VU0IuZXZ0ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YV9VU0IuZXZ0KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNhbGxiYWNrIGNhbGxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdXNlcl9kYXRhX1dMQU4uY29tcGxldGUsIEhaKSkgeworCQlJUEFfVVRfRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjdGl2YXRlX2NhbGxiYWNrIDJcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGFfV0xBTi5ldnQgIT0gSVBBX1BNX0NMSUVOVF9BQ1RJVkFURUQpIHsKKwkJSVBBX1VUX0VSUigiQ2FsbGJhY2sgPSAlZFxuIiwgdXNlcl9kYXRhX1dMQU4uZXZ0KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNhbGxiYWNrIGNhbGxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZWluaXRfY29tcGxldGlvbigmdXNlcl9kYXRhX1VTQi5jb21wbGV0ZSk7CisJcmVpbml0X2NvbXBsZXRpb24oJnVzZXJfZGF0YV9XTEFOLmNvbXBsZXRlKTsKKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWZlcnJlZF9kZWFjdGl2YXRlKGhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlZmZlcmVkIGRlYWN0aXZhdGUgY2xpZW50IDEgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVmZmVyZWQgZGVhY3RpdmF0ZSBmYWlsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1zbGVlcCgyMDApOworCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoIm5vLWJsb2NrIGFjdGl2YXRlIGZhaWxlZCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIm5vLWJsb2NrIGFjdGl2YXRlIGZhaWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGlwZXMgPSAxIDw8IGlwYV9nZXRfZXBfbWFwcGluZyhJUEFfQ0xJRU5UX1VTQl9DT05TKTsKKwlwaXBlcyB8PSAxIDw8IGlwYV9nZXRfZXBfbWFwcGluZyhJUEFfQ0xJRU5UX1dMQU4xX0NPTlMpOworCXBpcGVzIHw9IDEgPDwgaXBhX2dldF9lcF9tYXBwaW5nKElQQV9DTElFTlRfV0xBTjJfQ09OUyk7CisKKwlJUEFfVVRfREJHKCJwaXBlcyA9ICVkXG4iLCBwaXBlcyk7CisKKwlyYyA9IGlwYV9wbV9oYW5kbGVfc3VzcGVuZChwaXBlcyk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdXNlcl9kYXRhX1VTQi5jb21wbGV0ZSwgSFopKSB7CisJCUlQQV9VVF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3Igd2FrZXVwX2NhbGxiYWNrIDFcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid2FrZXVwIGNhbGxiYWNrIG5vdCBjYWxsZWQiKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwlpZiAodXNlcl9kYXRhX1VTQi5ldnQgIT0gSVBBX1BNX1JFUVVFU1RfV0FLRVVQKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YV9VU0IuZXZ0KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNhbGxiYWNrIGNhbGxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdXNlcl9kYXRhX1dMQU4uY29tcGxldGUsIEhaKSkgeworCQlJUEFfVVRfRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHdha2V1cF9jYWxsYmFjayAyXG4iKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndha2V1cCBjYWxsYmFjayBub3QgY2FsbGVkIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJaWYgKHVzZXJfZGF0YV9XTEFOLmV2dCAhPSBJUEFfUE1fUkVRVUVTVF9XQUtFVVApIHsKKwkJSVBBX1VUX0VSUigiQ2FsbGJhY2sgPSAlZFxuIiwgdXNlcl9kYXRhX1dMQU4uZXZ0KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNhbGxiYWNrIGNhbGxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZWluaXRfY29tcGxldGlvbigmdXNlcl9kYXRhX1VTQi5jb21wbGV0ZSk7CisKKwlyYyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZV9zeW5jIGNsaWVudCAxIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBkZWFjdGl2YXRlX3N5bmMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoIm5vLWJsb2NrIGFjdGl2YXRlIGZhaWxlZCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIm5vLWJsb2NrIGFjdGl2YXRlIGZhaWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGlwZXMgPSAxIDw8IGlwYV9nZXRfZXBfbWFwcGluZyhJUEFfQ0xJRU5UX1VTQl9DT05TKTsKKworCXJjID0gaXBhX3BtX2hhbmRsZV9zdXNwZW5kKHBpcGVzKTsKKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ1c2VyX2RhdGFfVVNCLmNvbXBsZXRlLCBIWikpIHsKKwkJSVBBX1VUX0VSUigidGltZW91dCB3YWl0aW5nIGZvciB3YWtldXBfY2FsbGJhY2sgMVxuIik7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3YWtldXAgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGFfVVNCLmV2dCAhPSBJUEFfUE1fUkVRVUVTVF9XQUtFVVApIHsKKwkJSVBBX1VUX0VSUigiQ2FsbGJhY2sgPSAlZFxuIiwgdXNlcl9kYXRhX1VTQi5ldnQpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2FsbGJhY2sgY2FsbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gY2xlYW5fdXAoMiwgaGRsX1VTQiwgaGRsX1dMQU4pOworCXJldHVybiByYzsKK30KKworLyogdGVzdCA0ICovCitzdGF0aWMgaW50IGlwYV9wbV91dF9kZWFjdGl2YXRlX2FsbF9kZWZlcnJlZCh2b2lkICpwcml2KQoreworCisJaW50IHJjID0gMDsKKwlpbnQgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSwgdm90ZTsKKwlzdHJ1Y3QgY2FsbGJhY2tfcGFyYW0gdXNlcl9kYXRhOworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJCS51c2VyX2RhdGEgPSAmdXNlcl9kYXRhCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwl9OworCisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgTU9ERU1fcGFyYW1zID0geworCQkubmFtZSA9ICJNT0RFTSIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKwl1c2VyX2RhdGEuZXZ0ID0gSVBBX1BNX0NCX0VWRU5UX01BWDsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSAtIHJjZSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBpbml0IHBhcmFtcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnVzZXJfZGF0YS5jb21wbGV0ZSk7CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmVVNCX3BhcmFtcywgJmhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJldMQU5fcGFyYW1zLCAmaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX1VTQik7CisJaWYgKHJjICE9IC1FSU5QUk9HUkVTUykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHF1ZXVlIHdvcmsgZm9yIGNsaWVudCAxIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgicXVldWUgYWN0aXZhdGUgd29yayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhoZGxfV0xBTik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gYWN0aXZhdGUgc3luYyBmb3IgY2xpZW50IDItIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImFjdGl2YXRlIHN5bmMgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ1c2VyX2RhdGEuY29tcGxldGUsIEhaKSkgeworCQlJUEFfVVRfRVJSKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjdGl2YXRlX2NhbGxiYWNrIDFcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGEuZXZ0ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YS5ldnQpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2FsbGJhY2sgY2FsbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmTU9ERU1fcGFyYW1zLCAmaGRsX01PREVNKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMyByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9NT0RFTSk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gbm8tYmxvY2sgYWN0aXZhdGUgLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJuby1ibG9jay1hY3RpdmF0ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDMpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVmZmVyZWQgZGVhY3RpdmF0ZSBjbGllbnQgMSAtIHJjID0gJWRcbiIsCisJCQlyYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWZmZXJlZCBkZWFjdGl2YXRlIGZhaWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShoZGxfV0xBTik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVmZmVyZWQgZGVhY3RpdmF0ZSBjbGllbnQgMiAtIHJjID0gJWRcbiIsCisJCQlyYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWZmZXJlZCBkZWFjdGl2YXRlIGZhaWwiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fZGVhY3RpdmF0ZV9hbGxfZGVmZXJyZWQoKTsKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImRlYWN0aXZhdGVfYWxsX2RlZmVycmVkIGZhaWxlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImNsb2NrIHZvdGUgd2VudCBiZWxvdyAxIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2xlYW5fdXAoMywgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSk7CisJcmV0dXJuIHJjOworfQorCisvKiB0ZXN0IDUgKi8KK3N0YXRpYyBpbnQgaXBhX3BtX3V0X2RlYWN0aXZhdGVfYWZ0ZXJfYWN0aXZhdGUodm9pZCAqcHJpdikKK3sKKworCWludCByYyA9IDA7CisJaW50IGhkbCwgdm90ZTsKKwlzdHJ1Y3QgY2FsbGJhY2tfcGFyYW0gdXNlcl9kYXRhOworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJCS51c2VyX2RhdGEgPSAmdXNlcl9kYXRhCisJfTsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSAtIHJjZSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBpbml0IHBhcmFtcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJnVzZXJfZGF0YS5jb21wbGV0ZSk7CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmVVNCX3BhcmFtcywgJmhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgY2xpZW50IDEgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byByZWdpc3RlciIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGwpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBxdWV1ZSB3b3JrIGZvciBjbGllbnQgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgicXVldWUgYWN0aXZhdGUgd29yayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fZGVmZXJyZWRfZGVhY3RpdmF0ZShoZGwpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlZmZlcmVkIGRlYWN0aXZhdGUgY2xpZW50IC0gcmMgPSAlZFxuIiwKKwkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVmZmVyZWQgZGVhY3RpdmF0ZSBmYWlsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1zbGVlcCgyMDApOworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGwpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBxdWV1ZSB3b3JrIGZvciBjbGllbnQgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgicXVldWUgYWN0aXZhdGUgd29yayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKGhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSBzeW5jIGNsaWVudCAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImRlYWN0aXZhdGUgc3luYyBmYWlsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW1zbGVlcCgyMDApOworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBjbGVhbl91cCgxLCBoZGwpOworCXJldHVybiByYzsKK30KKworLyogdGVzdCA2ICovCitzdGF0aWMgaW50IGlwYV9wbV91dF9hdG9taWNfYWN0aXZhdGUodm9pZCAqcHJpdikKK3sKKwlpbnQgcmMgPSAwOworCWludCBoZGwsIHZvdGU7CisJc3RydWN0IGNhbGxiYWNrX3BhcmFtIHVzZXJfZGF0YTsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgaW5pdF9wYXJhbXMgPSB7CisJCS50aHJlc2hvbGRfc2l6ZSA9IElQQV9QTV9USFJFU0hPTERfTUFYLAorCQkuZGVmYXVsdF90aHJlc2hvbGQgPSB7NjAwLCAxMDAwfQorCX07CisKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyByZWdpc3Rlcl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJCS51c2VyX2RhdGEgPSAmdXNlcl9kYXRhCisJfTsKKwl1c2VyX2RhdGEuZXZ0ID0gSVBBX1BNX0NCX0VWRU5UX01BWDsKKworCisJc3Bpbl9sb2NrX2luaXQoJmxvY2spOworCisJcmMgPSBpcGFfcG1faW5pdCgmaW5pdF9wYXJhbXMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJGYWlsIHRvIGluaXQgaXBhX3BtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gaW5pdCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZ1c2VyX2RhdGEuY29tcGxldGUpOworCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJnJlZ2lzdGVyX3BhcmFtcywgJmhkbCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgY2xpZW50IHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGwpOworCWlmIChyYyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBxdWV1ZSB3b3JrIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgicXVldWUgYWN0aXZhdGUgd29yayBmYWlsZWQiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOworCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnVzZXJfZGF0YS5jb21wbGV0ZSwgSFopKSB7CisJCUlQQV9VVF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgYWN0aXZhdGVfY2FsbGJhY2tcbiIpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgY2FsbGJhY2sgbm90IGNhbGxlZCIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICh1c2VyX2RhdGEuZXZ0ICE9IElQQV9QTV9DTElFTlRfQUNUSVZBVEVEKSB7CisJCUlQQV9VVF9FUlIoIkNhbGxiYWNrID0gJWRcbiIsIHVzZXJfZGF0YS5ldnQpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2FsbGJhY2sgY2FsbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGNsZWFuX3VwKDEsIGhkbCk7CisJcmV0dXJuIHJjOworfQorCisvKiB0ZXN0IDcgKi8KK3N0YXRpYyBpbnQgaXBhX3BtX3V0X2RlYWN0aXZhdGVfbG9vcCh2b2lkICpwcml2KQoreworCWludCByYyA9IDA7CisJaW50IGksIGhkbF9VU0IsIGhkbF9XTEFOLCB2b3RlOworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwl9OworCisJcmMgPSBpcGFfcG1faW5pdCgmaW5pdF9wYXJhbXMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJGYWlsIHRvIGluaXQgaXBhX3BtIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBpbml0IHBhcmFtcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmVVNCX3BhcmFtcywgJmhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZShoZGxfVVNCLCAxMjAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDEgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZXTEFOX3BhcmFtcywgJmhkbF9XTEFOKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1dMQU4sIDgwMCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gc2V0IHRwdXQgZm9yIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gc2V0IHBlcmYgcHJvZmlsZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZV9zeW5jKGhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGFjdGl2YXRlIHN5bmMgZm9yIGNsaWVudCAxLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBzeW5jIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGFjdGl2YXRlIG5vIGJsb2NrIGZvciBjbGllbnQgMiAtIHJjID0gJWRcbiIsCisJCQlyYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBubyBibG9jayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbXNsZWVwKDIwMCk7CisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDIpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUoaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlZmZlcmVkIGRlYWN0aXZhdGUgY2xpZW50IDIgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVmZmVyZWQgZGVhY3RpdmF0ZSBmYWlsIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCUlQQV9VVF9EQkcoIkxvb3AgaXRlcmF0aW9uICMlZFxuIiwgaSk7CisKKwkJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCQlpZiAodm90ZSAhPSAyKSB7CisJCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9XTEFOKTsKKwkJaWYgKHJjKSB7CisJCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHVuZG8gZGVhY3RpdmF0ZSBmb3IgY2xpZW50IDIiKTsKKwkJCUlQQV9VVF9FUlIoIiAtIHJjID0gJWRcbiIsIHJjKTsKKwkJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ1bmRvIGRlYWN0aXZhdGUgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJjID0gaXBhX3BtX2RlZmVycmVkX2RlYWN0aXZhdGUoaGRsX1dMQU4pOworCQlpZiAocmMpIHsKKwkJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVmZmVyZWQgZGVhY3RpdmF0ZSBjbGllbnQiKTsKKwkJCUlQQV9VVF9FUlIoIiAtIHJjID0gJWRcbiIsIHJjKTsKKwkJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWZmZXJlZCBkZWFjdGl2YXRlIGZhaWwiKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCisJbXNsZWVwKDIwMCk7CisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDEpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyYyA9IGNsZWFuX3VwKDIsIGhkbF9VU0IsIGhkbF9XTEFOKTsKKwlyZXR1cm4gcmM7CisKK30KKworCisvKnRlc3QgOCovCitzdGF0aWMgaW50IGlwYV9wbV91dF9zZXRfcGVyZl9wcm9maWxlKHZvaWQgKnByaXYpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaGRsX1VTQiwgaGRsX1dMQU4sIHZvdGUsIGlkeDsKKworCXN0cnVjdCBpcGFfcG1faW5pdF9wYXJhbXMgaW5pdF9wYXJhbXMgPSB7CisJCS50aHJlc2hvbGRfc2l6ZSA9IElQQV9QTV9USFJFU0hPTERfTUFYLAorCQkuZGVmYXVsdF90aHJlc2hvbGQgPSB7NjAwLCAxMDAwfQorCX07CisKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyBVU0JfcGFyYW1zID0geworCQkubmFtZSA9ICJVU0IiLAorCQkuZ3JvdXAgPSBJUEFfUE1fR1JPVVBfREVGQVVMVCwKKwkJLnNraXBfY2xrX3ZvdGUgPSAwLAorCQkuY2FsbGJhY2sgPSBpcGFfcG1fY2FsbF9iYWNrLAorCX07CisKKwlzdHJ1Y3QgaXBhX3BtX3JlZ2lzdGVyX3BhcmFtcyBXTEFOX3BhcmFtcyA9IHsKKwkJLm5hbWUgPSAiV0xBTiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gaW5pdCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJlVTQl9wYXJhbXMsICZoZGxfVVNCKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1VTQiwgMTIwMCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gc2V0IHRwdXQgZm9yIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gc2V0IHBlcmYgcHJvZmlsZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmV0xBTl9wYXJhbXMsICZoZGxfV0xBTik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgY2xpZW50IDIgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byByZWdpc3RlciIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKGhkbF9XTEFOLCA4MDApOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHNldCB0cHV0IGZvciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHNldCBwZXJmIHByb2ZpbGUiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGVfc3luYyhoZGxfVVNCKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBzeW5jIGZvciBjbGllbnQgMS0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgc3luYyBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWR4ID0gaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuYnVzX3ZvdGVfaWR4OworCWlmIChpZHggIT0gMSkgeworCQlJUEFfVVRfRVJSKCJjbG9jayBwbGFuIGlzIGF0ICVkXG4iLCBpZHgpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgcGxhbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZShoZGxfV0xBTik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gYWN0aXZhdGUgbm8gYmxvY2sgZm9yIGNsaWVudCAyIC0gcmMgPSAlZFxuIiwKKwkJCXJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImFjdGl2YXRlIG5vIGJsb2NrIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKGhkbF9XTEFOLCAxMjAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDIgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlkeCA9IGlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmJ1c192b3RlX2lkeDsKKwlpZiAoaWR4ICE9IDMpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgcGxhbiBpcyBhdCAlZFxuIiwgaWR4KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHBsYW4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBjbGVhbl91cCgyLCBoZGxfVVNCLCBoZGxfV0xBTik7CisJcmV0dXJuIHJjOworfQorCisvKnRlc3QgOSovCitzdGF0aWMgaW50IGlwYV9wbV91dF9ncm91cF90cHV0KHZvaWQgKnByaXYpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSwgdm90ZSwgaWR4OworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9BUFBTLAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0FQUFMsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwl9OworCisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgTU9ERU1fcGFyYW1zID0geworCQkubmFtZSA9ICJNT0RFTSIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gaW5pdCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJlVTQl9wYXJhbXMsICZoZGxfVVNCKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZXTEFOX3BhcmFtcywgJmhkbF9XTEFOKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1VTQiwgNTAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDEgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1dMQU4sIDgwMCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gc2V0IHRwdXQgZm9yIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gc2V0IHBlcmYgcHJvZmlsZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZV9zeW5jKGhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGFjdGl2YXRlIHN5bmMgZm9yIGNsaWVudCAxLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBzeW5jIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9XTEFOKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBubyBibG9jayBmb3IgY2xpZW50IDIgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgbm8gYmxvY2sgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZNT0RFTV9wYXJhbXMsICZoZGxfTU9ERU0pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAzIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZShoZGxfTU9ERU0sIDEwMDApOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHNldCB0cHV0IGZvciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHNldCBwZXJmIHByb2ZpbGUiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX01PREVNKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBubyBibG9jayBmb3IgY2xpZW50IDMgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgbm8gYmxvY2sgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAzKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2RlYWN0aXZhdGVfc3luYyhoZGxfV0xBTik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSBjbGllbnQgLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWFjdGl2YXRlIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMikgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWR4ID0gaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuYnVzX3ZvdGVfaWR4OworCWlmIChpZHggIT0gMikgeworCQlJUEFfVVRfRVJSKCJjbG9jayBwbGFuIGlzIGF0ICVkXG4iLCBpZHgpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgcGxhbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGNsZWFuX3VwKDMsIGhkbF9VU0IsIGhkbF9XTEFOLCBoZGxfTU9ERU0pOworCXJldHVybiByYzsKKworfQorCisvKnRlc3QgMTAqLworc3RhdGljIGludCBpcGFfcG1fdXRfc2tpcF9jbGtfdm90ZV90cHV0KHZvaWQgKnByaXYpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSwgdm90ZSwgaWR4OworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9CisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX01PREVNLAorCQkuc2tpcF9jbGtfdm90ZSA9IDEsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIE1PREVNX3BhcmFtcyA9IHsKKwkJLm5hbWUgPSAiTU9ERU0iLAorCQkuZ3JvdXAgPSBJUEFfUE1fR1JPVVBfTU9ERU0sCisJCS5za2lwX2Nsa192b3RlID0gMSwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwl9OworCisJcmMgPSBpcGFfcG1faW5pdCgmaW5pdF9wYXJhbXMpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJGYWlsIHRvIGluaXQgaXBhX3BtIC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBpbml0IHBhcmFtcyIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9yZWdpc3RlcigmVVNCX3BhcmFtcywgJmhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJldMQU5fcGFyYW1zLCAmaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZShoZGxfVVNCLCAxMjAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDEgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1dMQU4sIDgwMCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gc2V0IHRwdXQgZm9yIGNsaWVudCAyIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gc2V0IHBlcmYgcHJvZmlsZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9hY3RpdmF0ZV9zeW5jKGhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGFjdGl2YXRlIHN5bmMgZm9yIGNsaWVudCAxLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBzeW5jIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9XTEFOKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBubyBibG9jayBmb3IgY2xpZW50IDIgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgbm8gYmxvY2sgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAyKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZNT0RFTV9wYXJhbXMsICZoZGxfTU9ERU0pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHJlZ2lzdGVyIGNsaWVudCAzIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gcmVnaXN0ZXIiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fc2V0X3BlcmZfcHJvZmlsZShoZGxfTU9ERU0sIDIwMDApOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIHNldCB0cHV0IGZvciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHNldCBwZXJmIHByb2ZpbGUiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX01PREVNKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBhY3RpdmF0ZSBubyBibG9jayBmb3IgY2xpZW50IDMgLSByYyA9ICVkXG4iLAorCQkJcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiYWN0aXZhdGUgbm8gYmxvY2sgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZvdGUgPSBhdG9taWNfcmVhZCgmaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuY250KTsKKwlpZiAodm90ZSAhPSAxKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHZvdGUgaXMgYXQgJWRcbiIsIHZvdGUpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgdm90ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2xlZXAoMjAwKTsKKwlpZHggPSBpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5idXNfdm90ZV9pZHg7CisJaWYgKGlkeCAhPSAzKSB7CisJCUlQQV9VVF9FUlIoImNsb2NrIHBsYW4gaXMgYXQgJWRcbiIsIGlkeCk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayBwbGFuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJcmMgPSBpcGFfcG1fZGVhY3RpdmF0ZV9zeW5jKGhkbF9VU0IpOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGRlYWN0aXZhdGUgY2xpZW50IC0gcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZGVhY3RpdmF0ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDApIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gY2xlYW5fdXAoMywgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSk7CisJcmV0dXJuIHJjOworfQorCisvKiBUZXN0IDExICovCitzdGF0aWMgaW50IGlwYV9wbV91dF9zaW1wbGVfZXhjZXB0aW9uKHZvaWQgKnByaXYpCit7CisJaW50IHJjID0gMDsKKwlpbnQgaGRsX1VTQiwgaGRsX1dMQU4sIGhkbF9NT0RFTSwgdm90ZSwgaWR4OworCisJc3RydWN0IGlwYV9wbV9leGNlcHRpb24gZXhjZXB0aW9ucyA9IHsKKwkJLnVzZWNhc2UgPSAiVVNCIiwKKwkJLnRocmVzaG9sZCA9IHsxMDAwLCAxODAwfSwKKwl9OworCisJc3RydWN0IGlwYV9wbV9pbml0X3BhcmFtcyBpbml0X3BhcmFtcyA9IHsKKwkJLnRocmVzaG9sZF9zaXplID0gSVBBX1BNX1RIUkVTSE9MRF9NQVgsCisJCS5kZWZhdWx0X3RocmVzaG9sZCA9IHs2MDAsIDEwMDB9LAorCQkuZXhjZXB0aW9uX3NpemUgPSAxLAorCQkuZXhjZXB0aW9uc1swXSA9IGV4Y2VwdGlvbnMsCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFVTQl9wYXJhbXMgPSB7CisJCS5uYW1lID0gIlVTQiIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXN0cnVjdCBpcGFfcG1fcmVnaXN0ZXJfcGFyYW1zIFdMQU5fcGFyYW1zID0geworCQkubmFtZSA9ICJXTEFOIiwKKwkJLmdyb3VwID0gSVBBX1BNX0dST1VQX0RFRkFVTFQsCisJCS5za2lwX2Nsa192b3RlID0gMCwKKwkJLmNhbGxiYWNrID0gaXBhX3BtX2NhbGxfYmFjaywKKwl9OworCisJc3RydWN0IGlwYV9wbV9yZWdpc3Rlcl9wYXJhbXMgTU9ERU1fcGFyYW1zID0geworCQkubmFtZSA9ICJNT0RFTSIsCisJCS5ncm91cCA9IElQQV9QTV9HUk9VUF9ERUZBVUxULAorCQkuc2tpcF9jbGtfdm90ZSA9IDAsCisJCS5jYWxsYmFjayA9IGlwYV9wbV9jYWxsX2JhY2ssCisJfTsKKworCXJjID0gaXBhX3BtX2luaXQoJmluaXRfcGFyYW1zKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiRmFpbCB0byBpbml0IGlwYV9wbSAtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gaW5pdCBwYXJhbXMiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJlVTQl9wYXJhbXMsICZoZGxfVVNCKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3JlZ2lzdGVyKCZXTEFOX3BhcmFtcywgJmhkbF9XTEFOKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byByZWdpc3RlciBjbGllbnQgMiByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJmYWlsIHRvIHJlZ2lzdGVyIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX3NldF9wZXJmX3Byb2ZpbGUoaGRsX1VTQiwgMTIwMCk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gc2V0IHRwdXQgZm9yIGNsaWVudCAxIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImZhaWwgdG8gc2V0IHBlcmYgcHJvZmlsZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKGhkbF9XTEFOLCAyMDAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDIgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlX3N5bmMoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gYWN0aXZhdGUgc3luYyBmb3IgY2xpZW50IDEtIHJjID0gJWRcbiIsIHJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImFjdGl2YXRlIHN5bmMgZmFpbGVkIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlkeCA9IGlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmJ1c192b3RlX2lkeDsKKwlpZiAoaWR4ICE9IDEpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgcGxhbiBpcyBhdCAlZFxuIiwgaWR4KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHBsYW4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpcGFfcG1fYWN0aXZhdGUoaGRsX1dMQU4pOworCWlmIChyYykgeworCQlJUEFfVVRfRVJSKCJmYWlsIHRvIGFjdGl2YXRlIG5vIGJsb2NrIGZvciBjbGllbnQgMiAtIHJjID0gJWRcbiIsCisJCQlyYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJhY3RpdmF0ZSBubyBibG9jayBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm90ZSA9IGF0b21pY19yZWFkKCZpcGEzX2N0eC0+aXBhM19hY3RpdmVfY2xpZW50cy5jbnQpOworCWlmICh2b3RlICE9IDIpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgdm90ZSBpcyBhdCAlZFxuIiwgdm90ZSk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJ3cm9uZyBjbG9jayB2b3RlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zbGVlcCgyMDApOworCWlkeCA9IGlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmJ1c192b3RlX2lkeDsKKwlpZiAoaWR4ICE9IDIpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgcGxhbiBpcyBhdCAlZFxuIiwgaWR4KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHBsYW4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpcGFfcG1fcmVnaXN0ZXIoJk1PREVNX3BhcmFtcywgJmhkbF9NT0RFTSk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gcmVnaXN0ZXIgY2xpZW50IDMgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byByZWdpc3RlciIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlwYV9wbV9zZXRfcGVyZl9wcm9maWxlKGhkbF9NT0RFTSwgODAwKTsKKwlpZiAocmMpIHsKKwkJSVBBX1VUX0VSUigiZmFpbCB0byBzZXQgdHB1dCBmb3IgY2xpZW50IDIgcmMgPSAlZFxuIiwgcmMpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgiZmFpbCB0byBzZXQgcGVyZiBwcm9maWxlIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJjID0gaXBhX3BtX2FjdGl2YXRlKGhkbF9NT0RFTSk7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gYWN0aXZhdGUgbm8gYmxvY2sgZm9yIGNsaWVudCAzIC0gcmMgPSAlZFxuIiwKKwkJCXJjKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoImFjdGl2YXRlIG5vIGJsb2NrIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMykgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNsZWVwKDIwMCk7CisJaWR4ID0gaXBhM19jdHgtPmlwYTNfYWN0aXZlX2NsaWVudHMuYnVzX3ZvdGVfaWR4OworCWlmIChpZHggIT0gMykgeworCQlJUEFfVVRfRVJSKCJjbG9jayBwbGFuIGlzIGF0ICVkXG4iLCBpZHgpOworCQlJUEFfVVRfVEVTVF9GQUlMX1JFUE9SVCgid3JvbmcgY2xvY2sgcGxhbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGlwYV9wbV9kZWFjdGl2YXRlX3N5bmMoaGRsX1VTQik7CisJaWYgKHJjKSB7CisJCUlQQV9VVF9FUlIoImZhaWwgdG8gZGVhY3RpdmF0ZSBjbGllbnQgLSByYyA9ICVkXG4iLCByYyk7CisJCUlQQV9VVF9URVNUX0ZBSUxfUkVQT1JUKCJkZWFjdGl2YXRlIGZhaWxlZCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl2b3RlID0gYXRvbWljX3JlYWQoJmlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmNudCk7CisJaWYgKHZvdGUgIT0gMikgeworCQlJUEFfVVRfRVJSKCJjbG9jayB2b3RlIGlzIGF0ICVkXG4iLCB2b3RlKTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHZvdGUiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJIGlkeCA9IGlwYTNfY3R4LT5pcGEzX2FjdGl2ZV9jbGllbnRzLmJ1c192b3RlX2lkeDsKKwlpZiAoaWR4ICE9IDIpIHsKKwkJSVBBX1VUX0VSUigiY2xvY2sgcGxhbiBpcyBhdCAlZFxuIiwgaWR4KTsKKwkJSVBBX1VUX1RFU1RfRkFJTF9SRVBPUlQoIndyb25nIGNsb2NrIHBsYW4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBjbGVhbl91cCgzLCBoZGxfVVNCLCBoZGxfV0xBTiwgaGRsX01PREVNKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFN1aXRlIGRlZmluaXRpb24gYmxvY2sgKi8KK0lQQV9VVF9ERUZJTkVfU1VJVEVfU1RBUlQocG0sICJQTSBmb3IgSVBBIiwKKwlpcGFfcG1fdXRfc2V0dXAsIGlwYV9wbV91dF90ZWFyZG93bikKK3sKKwlJUEFfVVRfQUREX1RFU1Qoc2luZ2xlX3JlZ2lzdHJhdGlvbiwKKwkJIlNpbmdsZSBSZWdpc3RyYXRpb24vQmFzaWMgRnVuY3Rpb25zIiwKKwkJaXBhX3BtX3V0X3NpbmdsZV9yZWdpc3RyYXRpb24sCisJCXRydWUsIElQQV9IV192NF8wLCBJUEFfSFdfTUFYKSwKKwlJUEFfVVRfQUREX1RFU1QoZG91YmxlX3JlZ2lzdGVyX2FjdGl2YXRlLAorCQkiZG91YmxlIHJlZ2lzdGVyL2FjdGl2YXRlIiwKKwkJaXBhX3BtX3V0X2RvdWJsZV9yZWdpc3Rlcl9hY3RpdmF0ZSwKKwkJdHJ1ZSwgSVBBX0hXX3Y0XzAsIElQQV9IV19NQVgpLAorCUlQQV9VVF9BRERfVEVTVChkZWZlcnJlZF9kZWFjdGl2YXRlLAorCQkiRGVmZXJyZWRfZGVhY3RpdmF0ZSIsCisJCWlwYV9wbV91dF9kZWZlcnJlZF9kZWFjdGl2YXRlLAorCQl0cnVlLCBJUEFfSFdfdjRfMCwgSVBBX0hXX01BWCksCisJSVBBX1VUX0FERF9URVNUKHR3b19jbGllbnRzX2FjdGl2YXRlLAorCQkiQWN0aXZhdGUgdHdvIGNsaWVudHMiLAorCQlpcGFfcG1fdXRfdHdvX2NsaWVudHNfYWN0aXZhdGUsCisJCXRydWUsIElQQV9IV192NF8wLCBJUEFfSFdfTUFYKSwKKwlJUEFfVVRfQUREX1RFU1QoZGVhY3RpdmF0ZV9hbGxfZGVmZXJyZWQsCisJCSJEZWFjdGl2YXRlIGFsbCBkZWZlcnJlZCIsCisJCWlwYV9wbV91dF9kZWFjdGl2YXRlX2FsbF9kZWZlcnJlZCwKKwkJdHJ1ZSwgSVBBX0hXX3Y0XzAsIElQQV9IV19NQVgpLAorCUlQQV9VVF9BRERfVEVTVChkZWFjdGl2YXRlX2FmdGVyX2FjdGl2YXRlLAorCQkiRGVhY3RpdmF0ZSBhZnRlciBhY3RpdmF0ZSIsCisJCWlwYV9wbV91dF9kZWFjdGl2YXRlX2FmdGVyX2FjdGl2YXRlLAorCQl0cnVlLCBJUEFfSFdfdjRfMCwgSVBBX0hXX01BWCksCisJSVBBX1VUX0FERF9URVNUKGF0b21pY19hY3RpdmF0ZSwKKwkJIkF0b21pYyBhY3RpdmF0ZSIsCisJCWlwYV9wbV91dF9hdG9taWNfYWN0aXZhdGUsCisJCXRydWUsIElQQV9IV192NF8wLCBJUEFfSFdfTUFYKSwKKwlJUEFfVVRfQUREX1RFU1QoZGVhY3RpdmF0ZV9sb29wLAorCQkiRGVhY3RpdmF0ZSBMb29wIiwKKwkJaXBhX3BtX3V0X2RlYWN0aXZhdGVfbG9vcCwKKwkJdHJ1ZSwgSVBBX0hXX3Y0XzAsIElQQV9IV19NQVgpLAorCUlQQV9VVF9BRERfVEVTVChzZXRfcGVyZl9wcm9maWxlLAorCQkiU2V0IHBlcmYgcHJvZmlsZSIsCisJCWlwYV9wbV91dF9zZXRfcGVyZl9wcm9maWxlLAorCQl0cnVlLCBJUEFfSFdfdjRfMCwgSVBBX0hXX01BWCksCisJSVBBX1VUX0FERF9URVNUKGdyb3VwX3RwdXQsCisJCSJHcm91cCB0aHJvdWdocHV0cyIsCisJCWlwYV9wbV91dF9ncm91cF90cHV0LAorCQl0cnVlLCBJUEFfSFdfdjRfMCwgSVBBX0hXX01BWCksCisJSVBBX1VUX0FERF9URVNUKHNraXBfY2xrX3ZvdGVfdHB1dCwKKwkJIlNraXAgY2xvY2sgdm90ZSBhbmQgdHB1dCIsCisJCWlwYV9wbV91dF9za2lwX2Nsa192b3RlX3RwdXQsCisJCXRydWUsIElQQV9IV192NF8wLCBJUEFfSFdfTUFYKSwKKwlJUEFfVVRfQUREX1RFU1Qoc2ltcGxlX2V4Y2VwdGlvbiwKKwkJInRocm91Z2hwdXQgd2hpbGUgcGFzc2luZyBzaW1wbGUgZXhjZXB0aW9uIiwKKwkJaXBhX3BtX3V0X3NpbXBsZV9leGNlcHRpb24sCisJCXRydWUsIElQQV9IV192NF8wLCBJUEFfSFdfTUFYKSwKK30gSVBBX1VUX0RFRklORV9TVUlURV9FTkQocG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvaXBhX3V0X3N1aXRlX2xpc3QuaCBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL2lwYS90ZXN0L2lwYV91dF9zdWl0ZV9saXN0LmgKaW5kZXggODIzZWRjZi4uMzVmMjg3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vaXBhL3Rlc3QvaXBhX3V0X3N1aXRlX2xpc3QuaAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9pcGEvdGVzdC9pcGFfdXRfc3VpdGVfbGlzdC5oCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIElQQV9VVF9ERUNMQVJFX1NVSVRFKG1oaSk7CiBJUEFfVVRfREVDTEFSRV9TVUlURShkbWEpOworSVBBX1VUX0RFQ0xBUkVfU1VJVEUocG0pOwogSVBBX1VUX0RFQ0xBUkVfU1VJVEUoZXhhbXBsZSk7CiBJUEFfVVRfREVDTEFSRV9TVUlURShod19zdGF0cyk7CiAKQEAgLTM0LDYgKzM1LDcgQEAKIHsKIAlJUEFfVVRfUkVHSVNURVJfU1VJVEUobWhpKSwKIAlJUEFfVVRfUkVHSVNURVJfU1VJVEUoZG1hKSwKKwlJUEFfVVRfUkVHSVNURVJfU1VJVEUocG0pLAogCUlQQV9VVF9SRUdJU1RFUl9TVUlURShleGFtcGxlKSwKIAlJUEFfVVRfUkVHSVNURVJfU1VJVEUoaHdfc3RhdHMpLAogfSBJUEFfVVRfREVGSU5FX0FMTF9TVUlURVNfRU5EOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vcWNvbS1nZW5pLXNlLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9xY29tLWdlbmktc2UuYwppbmRleCBhYWZiOGZjLi43MDdjOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9xY29tLWdlbmktc2UuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9xY29tLWdlbmktc2UuYwpAQCAtMTI0Nyw2ICsxMjQ3LDc5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGdlbmlfc2VfaW9tbXVfZnJlZV9idWYpOwogCisvKioKKyAqIGdlbmlfc2VfZHVtcF9kYmdfcmVncygpIC0gUHJpbnQgcmVsZXZhbnQgcmVnaXN0ZXJzIHRoYXQgY2FwdHVyZSBtb3N0CisgKgkJCWFjY3VyYXRlbHkgdGhlIHN0YXRlIG9mIGFuIFNFLgorICogQF9kZXY6CQlQb2ludGVyIHRvIHRoZSBTRSdzIGRldmljZS4KKyAqIEBpb21lbToJCUJhc2UgYWRkcmVzcyBvZiB0aGUgU0UncyByZWdpc3RlciBzcGFjZS4KKyAqIEBpcGM6CQlJUEMgbG9nIGNvbnRleHQgaGFuZGxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwcmludCBvdXQgYWxsIHRoZSByZWdpc3RlcnMgdGhhdCBjYXB0dXJlIHRoZSBzdGF0ZQorICogb2YgYW4gU0UgdG8gaGVscCBkZWJ1ZyBhbnkgZXJyb3JzLgorICoKKyAqIFJldHVybjoJTm9uZQorICovCit2b2lkIGdlbmlfc2VfZHVtcF9kYmdfcmVncyhzdHJ1Y3Qgc2VfZ2VuaV9yc2MgKnJzYywgdm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCXZvaWQgKmlwYykKK3sKKwl1MzIgbV9jbWQwID0gMDsKKwl1MzIgbV9pcnFfc3RhdHVzID0gMDsKKwl1MzIgZ2VuaV9zdGF0dXMgPSAwOworCXUzMiBnZW5pX2lvcyA9IDA7CisJdTMyIGRtYV9yeF9pcnEgPSAwOworCXUzMiBkbWFfdHhfaXJxID0gMDsKKwl1MzIgcnhfZmlmb19zdGF0dXMgPSAwOworCXUzMiB0eF9maWZvX3N0YXR1cyA9IDA7CisJdTMyIHNlX2RtYV9kYmcgPSAwOworCXUzMiBtX2NtZF9jdHJsID0gMDsKKwl1MzIgc2VfZG1hX3J4X2xlbiA9IDA7CisJdTMyIHNlX2RtYV9yeF9sZW5faW4gPSAwOworCXUzMiBzZV9kbWFfdHhfbGVuID0gMDsKKwl1MzIgc2VfZG1hX3R4X2xlbl9pbiA9IDA7CisJc3RydWN0IGdlbmlfc2VfZGV2aWNlICpnZW5pX3NlX2RldjsKKworCWlmICghaXBjKQorCQlyZXR1cm47CisKKwlnZW5pX3NlX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShyc2MtPndyYXBwZXJfZGV2KTsKKwlpZiAodW5saWtlbHkoIWdlbmlfc2VfZGV2IHx8ICFnZW5pX3NlX2Rldi0+YnVzX2J3KSkKKwkJcmV0dXJuOworCW11dGV4X2xvY2soJmdlbmlfc2VfZGV2LT5hYl9pYl9sb2NrKTsKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcnNjLT5hYl9saXN0KSB8fCBsaXN0X2VtcHR5KCZyc2MtPmliX2xpc3QpKSkgeworCQlHRU5JX1NFX0RCRyhpcGMsIGZhbHNlLCBOVUxMLCAiJXM6IENsb2NrcyBub3Qgb25cbiIsIF9fZnVuY19fKTsKKwkJZ290byBleGl0X2dlbmlfc2VfZHVtcF9kYmdfcmVnczsKKwl9CisJbV9jbWQwID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9HRU5JX01fQ01EMCk7CisJbV9pcnFfc3RhdHVzID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9HRU5JX01fSVJRX1NUQVRVUyk7CisJZ2VuaV9zdGF0dXMgPSBnZW5pX3JlYWRfcmVnKGJhc2UsIFNFX0dFTklfU1RBVFVTKTsKKwlnZW5pX2lvcyA9IGdlbmlfcmVhZF9yZWcoYmFzZSwgU0VfR0VOSV9JT1MpOworCWRtYV9yeF9pcnEgPSBnZW5pX3JlYWRfcmVnKGJhc2UsIFNFX0RNQV9UWF9JUlFfU1RBVCk7CisJZG1hX3R4X2lycSA9IGdlbmlfcmVhZF9yZWcoYmFzZSwgU0VfRE1BX1JYX0lSUV9TVEFUKTsKKwlyeF9maWZvX3N0YXR1cyA9IGdlbmlfcmVhZF9yZWcoYmFzZSwgU0VfR0VOSV9SWF9GSUZPX1NUQVRVUyk7CisJdHhfZmlmb19zdGF0dXMgPSBnZW5pX3JlYWRfcmVnKGJhc2UsIFNFX0dFTklfVFhfRklGT19TVEFUVVMpOworCXNlX2RtYV9kYmcgPSBnZW5pX3JlYWRfcmVnKGJhc2UsIFNFX0RNQV9ERUJVR19SRUcwKTsKKwltX2NtZF9jdHJsID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9HRU5JX01fQ01EX0NUUkxfUkVHKTsKKwlzZV9kbWFfcnhfbGVuID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9ETUFfUlhfTEVOKTsKKwlzZV9kbWFfcnhfbGVuX2luID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9ETUFfUlhfTEVOX0lOKTsKKwlzZV9kbWFfdHhfbGVuID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9ETUFfVFhfTEVOKTsKKwlzZV9kbWFfdHhfbGVuX2luID0gZ2VuaV9yZWFkX3JlZyhiYXNlLCBTRV9ETUFfVFhfTEVOX0lOKTsKKworCUdFTklfU0VfREJHKGlwYywgZmFsc2UsIE5VTEwsCisJIiVzOiBtX2NtZDA6MHgleCwgbV9pcnFfc3RhdHVzOjB4JXgsIGdlbmlfc3RhdHVzOjB4JXgsIGdlbmlfaW9zOjB4JXhcbiIsCisJX19mdW5jX18sIG1fY21kMCwgbV9pcnFfc3RhdHVzLCBnZW5pX3N0YXR1cywgZ2VuaV9pb3MpOworCUdFTklfU0VfREJHKGlwYywgZmFsc2UsIE5VTEwsCisJImRtYV9yeF9pcnE6MHgleCwgZG1hX3R4X2lycToweCV4LCByeF9maWZvX3N0czoweCV4LCB0eF9maWZvX3N0czoweCV4XG4iCisJLCBkbWFfcnhfaXJxLCBkbWFfdHhfaXJxLCByeF9maWZvX3N0YXR1cywgdHhfZmlmb19zdGF0dXMpOworCUdFTklfU0VfREJHKGlwYywgZmFsc2UsIE5VTEwsCisJInNlX2RtYV9kYmc6MHgleCwgbV9jbWRfY3RybDoweCV4LCBkbWFfcnhsZW46MHgleCwgZG1hX3J4bGVuX2luOjB4JXhcbiIsCisJc2VfZG1hX2RiZywgbV9jbWRfY3RybCwgc2VfZG1hX3J4X2xlbiwgc2VfZG1hX3J4X2xlbl9pbik7CisJR0VOSV9TRV9EQkcoaXBjLCBmYWxzZSwgTlVMTCwKKwkiZG1hX3R4bGVuOjB4JXgsIGRtYV90eGxlbl9pbjoweCV4XG4iLCBzZV9kbWFfdHhfbGVuLCBzZV9kbWFfdHhfbGVuX2luKTsKK2V4aXRfZ2VuaV9zZV9kdW1wX2RiZ19yZWdzOgorCW11dGV4X3VubG9jaygmZ2VuaV9zZV9kZXYtPmFiX2liX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChnZW5pX3NlX2R1bXBfZGJnX3JlZ3MpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBnZW5pX3NlX2R0X21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHF1cHYzLWdlbmktc2UiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxxdXB2My1nZW5pLXNlLWNiIiwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vbXNtL3FwbnAtcmV2aWQuYyBiL2RyaXZlcnMvcGxhdGZvcm0vbXNtL3FwbnAtcmV2aWQuYwppbmRleCA5ZWEwYjQwLi4wZmVjOGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9xcG5wLXJldmlkLmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS9tc20vcXBucC1yZXZpZC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIFJFVklEX1NVQlRZUEUJMHg1CiAjZGVmaW5lIFJFVklEX1NUQVRVUzEJMHg4CiAjZGVmaW5lIFJFVklEX1NQQVJFXzAJMHg2MAorI2RlZmluZSBSRVZJRF9UUF9SRVYJMHhmMQogI2RlZmluZSBSRVZJRF9GQUJfSUQJMHhmMgogCiAjZGVmaW5lIFFQTlBfUkVWSURfREVWX05BTUUgInFjb20scXBucC1yZXZpZCIKQEAgLTE1Nyw5ICsxNTgsOSBAQAogc3RhdGljIGludCBxcG5wX3JldmlkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJdTggcmV2MSwgcmV2MiwgcmV2MywgcmV2NCwgcG1pY190eXBlLCBwbWljX3N1YnR5cGUsIHBtaWNfc3RhdHVzOwotCXU4IG9wdGlvbjEsIG9wdGlvbjIsIG9wdGlvbjMsIG9wdGlvbjQsIHNwYXJlMCwgZmFiX2lkOworCXU4IG9wdGlvbjEsIG9wdGlvbjIsIG9wdGlvbjMsIG9wdGlvbjQsIHNwYXJlMDsKIAl1bnNpZ25lZCBpbnQgYmFzZTsKLQlpbnQgcmM7CisJaW50IHJjLCBmYWJfaWQsIHRwX3JldjsKIAljaGFyIHBtaWNfc3RyaW5nW1BNSUNfU1RSSU5HX01BWExFTkdUSF0gPSB7J1wwJ307CiAJc3RydWN0IHJldmlkX2NoaXAgKnJldmlkX2NoaXA7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwpAQCAtMjA3LDYgKzIwOCwxMSBAQAogCWVsc2UKIAkJZmFiX2lkID0gLUVJTlZBTDsKIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsICJxY29tLHRwLXJldi12YWxpZCIpKQorCQl0cF9yZXYgPSBxcG5wX3JlYWRfYnl0ZShyZWdtYXAsIGJhc2UgKyBSRVZJRF9UUF9SRVYpOworCWVsc2UKKwkJdHBfcmV2ID0gLUVJTlZBTDsKKwogCXJldmlkX2NoaXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCByZXZpZF9jaGlwKSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCWlmICghcmV2aWRfY2hpcCkKQEAgLTIyMCw2ICsyMjYsNyBAQAogCXJldmlkX2NoaXAtPmRhdGEucG1pY19zdWJ0eXBlID0gcG1pY19zdWJ0eXBlOwogCXJldmlkX2NoaXAtPmRhdGEucG1pY190eXBlID0gcG1pY190eXBlOwogCXJldmlkX2NoaXAtPmRhdGEuZmFiX2lkID0gZmFiX2lkOworCXJldmlkX2NoaXAtPmRhdGEudHBfcmV2ID0gdHBfcmV2OwogCiAJaWYgKHBtaWNfc3VidHlwZSA8IEFSUkFZX1NJWkUocG1pY19uYW1lcykpCiAJCXJldmlkX2NoaXAtPmRhdGEucG1pY19uYW1lID0gcG1pY19uYW1lc1twbWljX3N1YnR5cGVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS9tc20vc2VlbXBfY29yZS9zZWVtcF9sb2drLmMgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9zZWVtcF9jb3JlL3NlZW1wX2xvZ2suYwppbmRleCA0NzIwOGY3Li40ZmZkYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL21zbS9zZWVtcF9jb3JlL3NlZW1wX2xvZ2suYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL21zbS9zZWVtcF9jb3JlL3NlZW1wX2xvZ2suYwpAQCAtMzQ2LDkgKzM0NiwxMSBAQAogCQlyZXR1cm4gc2VlbXBfbG9na19zZXRfbWFwcGluZyhhcmcpOwogCX0gZWxzZSBpZiAoY21kID09IFNFRU1QX0NNRF9DSEVDS19GSUxURVIpIHsKIAkJcmV0dXJuIHNlZW1wX2xvZ2tfY2hlY2tfZmlsdGVyKGFyZyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFJlcXVlc3QgJVhcbiIsIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQotCXByX2VycigiSW52YWxpZCBSZXF1ZXN0ICVYXG4iLCBjbWQpOwotCXJldHVybiAtRU5PSU9DVExDTUQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBsb25nIHNlZW1wX2xvZ2tfcmVzZXJ2ZV9yZGJsa3MoCkBAIC03NTYsNyArNzU4LDcgQEAKIAkJZGVzYy5hcmdzWzFdID0gUEFHRV9TSVpFOwogCQlyZXQgPSBzY21fY2FsbDIoRUwyX1NDTV9JRCwgJmRlc2MpOwogCQlpZiAocmV0IHx8IGRlc2MucmV0WzBdIHx8IGRlc2MucmV0WzFdKSB7Ci0JCQlwcl9lcnIoIlNDTSBjYWxsIGZhaWxlZCB3aXRoIHJldCB2YWwgPSAlZCAlZCAlZCIsCisJCQlwcl9lcnIoIlNDTSBjYWxsIGZhaWxlZCB3aXRoIHJldCB2YWwgPSAlZCAlZCAlZFxuIiwKIAkJCQlyZXQsIChpbnQpZGVzYy5yZXRbMF0sIChpbnQpZGVzYy5yZXRbMV0pOwogCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBlbDJfc2hhcmVkX21lbSk7CiAJCQllbDJfc2hhcmVkX21lbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L21zbS1wb3dlcm9mZi5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9tc20tcG93ZXJvZmYuYwppbmRleCA5ZjA0OTU3Li44ZDAyM2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L21zbS1wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvbXNtLXBvd2Vyb2ZmLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgRU1FUkdFTkNZX0RMT0FEX01BR0lDMSAgICAweDMyMkE0Rjk5CiAjZGVmaW5lIEVNRVJHRU5DWV9ETE9BRF9NQUdJQzIgICAgMHhDNjdFNDM1MAogI2RlZmluZSBFTUVSR0VOQ1lfRExPQURfTUFHSUMzICAgIDB4Nzc3Nzc3NzcKKyNkZWZpbmUgRU1NQ19ETE9BRF9UWVBFCQkweDIKIAogI2RlZmluZSBTQ01fSU9fRElTQUJMRV9QTUlDX0FSQklURVIJMQogI2RlZmluZSBTQ01fSU9fREVBU1NFUlRfUFNfSE9MRAkJMgpAQCAtNDcsMTMgKzQ4LDE0IEBACiAKIAogc3RhdGljIGludCByZXN0YXJ0X21vZGU7Ci12b2lkICpyZXN0YXJ0X3JlYXNvbjsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnJlc3RhcnRfcmVhc29uLCAqZGxvYWRfdHlwZV9hZGRyOwogc3RhdGljIGJvb2wgc2NtX3BtaWNfYXJiaXRlcl9kaXNhYmxlX3N1cHBvcnRlZDsKIHN0YXRpYyBib29sIHNjbV9kZWFzc2VydF9wc19ob2xkX3N1cHBvcnRlZDsKIC8qIERvd25sb2FkIG1vZGUgbWFzdGVyIGtpbGwtc3dpdGNoICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICptc21fcHNfaG9sZDsKIHN0YXRpYyBwaHlzX2FkZHJfdCB0Y3NyX2Jvb3RfbWlzY19kZXRlY3Q7CiBzdGF0aWMgaW50IGRvd25sb2FkX21vZGUgPSAxOworc3RhdGljIHN0cnVjdCBrb2JqZWN0IGRsb2FkX2tvYmo7CiAKICNpZmRlZiBDT05GSUdfUUNPTV9ETE9BRF9NT0RFCiAjZGVmaW5lIEVETF9NT0RFX1BST1AgInFjb20sbXNtLWltZW0tZW1lcmdlbmN5X2Rvd25sb2FkX21vZGUiCkBAIC03Miw4ICs3NCwyMyBAQAogc3RhdGljIGJvb2wgc2NtX2Rsb2FkX3N1cHBvcnRlZDsKIAogc3RhdGljIGludCBkbG9hZF9zZXQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CisvKiBpbnRlcmZhY2UgZm9yIGV4cG9ydGluZyBhdHRyaWJ1dGVzICovCitzdHJ1Y3QgcmVzZXRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlICAgICAgICBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1Zik7CisJc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworfTsKKyNkZWZpbmUgdG9fcmVzZXRfYXR0cihfYXR0cikgXAorCWNvbnRhaW5lcl9vZihfYXR0ciwgc3RydWN0IHJlc2V0X2F0dHJpYnV0ZSwgYXR0cikKKyNkZWZpbmUgUkVTRVRfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCVwKKwlzdGF0aWMgc3RydWN0IHJlc2V0X2F0dHJpYnV0ZSByZXNldF9hdHRyXyMjX25hbWUgPSBcCisJCQlfX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKQorCiBtb2R1bGVfcGFyYW1fY2FsbChkb3dubG9hZF9tb2RlLCBkbG9hZF9zZXQsIHBhcmFtX2dldF9pbnQsCiAJCQkmZG93bmxvYWRfbW9kZSwgMDY0NCk7CisKIHN0YXRpYyBpbnQgcGFuaWNfcHJlcF9yZXN0YXJ0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKQEAgLTg1LDcgKzEwMiw3IEBACiAJLm5vdGlmaWVyX2NhbGwJPSBwYW5pY19wcmVwX3Jlc3RhcnQsCiB9OwogCi1pbnQgc2NtX3NldF9kbG9hZF9tb2RlKGludCBhcmcxLCBpbnQgYXJnMikKK3N0YXRpYyBpbnQgc2NtX3NldF9kbG9hZF9tb2RlKGludCBhcmcxLCBpbnQgYXJnMikKIHsKIAlzdHJ1Y3Qgc2NtX2Rlc2MgZGVzYyA9IHsKIAkJLmFyZ3NbMF0gPSBhcmcxLApAQCAtMzk3LDYgKzQxNCw4NCBAQAogCXByX2VycigiUG93ZXJpbmcgb2ZmIGhhcyBmYWlsZWRcbiIpOwogfQogCitzdGF0aWMgc3NpemVfdCBhdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCByZXNldF9hdHRyaWJ1dGUgKnJlc2V0X2F0dHIgPSB0b19yZXNldF9hdHRyKGF0dHIpOworCXNzaXplX3QgcmV0ID0gLUVJTzsKKworCWlmIChyZXNldF9hdHRyLT5zaG93KQorCQlyZXQgPSByZXNldF9hdHRyLT5zaG93KGtvYmosIGF0dHIsIGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCByZXNldF9hdHRyaWJ1dGUgKnJlc2V0X2F0dHIgPSB0b19yZXNldF9hdHRyKGF0dHIpOworCXNzaXplX3QgcmV0ID0gLUVJTzsKKworCWlmIChyZXNldF9hdHRyLT5zdG9yZSkKKwkJcmV0ID0gcmVzZXRfYXR0ci0+c3RvcmUoa29iaiwgYXR0ciwgYnVmLCBjb3VudCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyByZXNldF9zeXNmc19vcHMgPSB7CisJLnNob3cJPSBhdHRyX3Nob3csCisJLnN0b3JlCT0gYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHJlc2V0X2t0eXBlID0geworCS5zeXNmc19vcHMJPSAmcmVzZXRfc3lzZnNfb3BzLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19lbW1jX2Rsb2FkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwl1aW50MzJfdCByZWFkX3ZhbCwgc2hvd192YWw7CisKKwlyZWFkX3ZhbCA9IF9fcmF3X3JlYWRsKGRsb2FkX3R5cGVfYWRkcik7CisJaWYgKHJlYWRfdmFsID09IEVNTUNfRExPQURfVFlQRSkKKwkJc2hvd192YWwgPSAxOworCWVsc2UKKwkJc2hvd192YWwgPSAwOworCisJcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKHNob3dfdmFsKSwgIiV1XG4iLCBzaG93X3ZhbCk7Cit9CisKK3N0YXRpYyBzaXplX3Qgc3RvcmVfZW1tY19kbG9hZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1aW50MzJfdCBlbmFibGVkOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91aW50KGJ1ZiwgMCwgJmVuYWJsZWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCEoKGVuYWJsZWQgPT0gMCkgfHwgKGVuYWJsZWQgPT0gMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmFibGVkID09IDEpCisJCV9fcmF3X3dyaXRlbChFTU1DX0RMT0FEX1RZUEUsIGRsb2FkX3R5cGVfYWRkcik7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoMCwgZGxvYWRfdHlwZV9hZGRyKTsKKworCXJldHVybiBjb3VudDsKK30KK1JFU0VUX0FUVFIoZW1tY19kbG9hZCwgMDY0NCwgc2hvd19lbW1jX2Rsb2FkLCBzdG9yZV9lbW1jX2Rsb2FkKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnJlc2V0X2F0dHJzW10gPSB7CisJJnJlc2V0X2F0dHJfZW1tY19kbG9hZC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHJlc2V0X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gcmVzZXRfYXR0cnMsCit9OworCiBzdGF0aWMgaW50IG1zbV9yZXN0YXJ0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTQ0OCw2ICs1NDMsMzMgQEAKIAkJaW91bm1hcChrYXNscl9pbWVtX2FkZHIpOwogCX0KICNlbmRpZgorCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwKKwkJCQkicWNvbSxtc20taW1lbS1kbG9hZC10eXBlIik7CisJaWYgKCFucCkgeworCQlwcl9lcnIoInVuYWJsZSB0byBmaW5kIERUIGltZW0gZGxvYWQtdHlwZSBub2RlXG4iKTsKKwkJZ290byBza2lwX3N5c2ZzX2NyZWF0ZTsKKwl9IGVsc2UgeworCQlkbG9hZF90eXBlX2FkZHIgPSBvZl9pb21hcChucCwgMCk7CisJCWlmICghZGxvYWRfdHlwZV9hZGRyKSB7CisJCQlwcl9lcnIoInVuYWJsZSB0byBtYXAgaW1lbSBkbG9hZC10eXBlIG9mZnNldFxuIik7CisJCQlnb3RvIHNraXBfc3lzZnNfY3JlYXRlOworCQl9CisJfQorCisJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmRsb2FkX2tvYmosICZyZXNldF9rdHlwZSwKKwkJCWtlcm5lbF9rb2JqLCAiJXMiLCAiZGxvYWQiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6RXJyb3IgaW4gY3JlYXRpb24ga29iamVjdF9hZGRcbiIsIF9fZnVuY19fKTsKKwkJa29iamVjdF9wdXQoJmRsb2FkX2tvYmopOworCQlnb3RvIHNraXBfc3lzZnNfY3JlYXRlOworCX0KKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGxvYWRfa29iaiwgJnJlc2V0X2F0dHJfZ3JvdXApOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczpFcnJvciBpbiBjcmVhdGlvbiBzeXNmc19jcmVhdGVfZ3JvdXBcbiIsIF9fZnVuY19fKTsKKwkJa29iamVjdF9kZWwoJmRsb2FkX2tvYmopOworCX0KK3NraXBfc3lzZnNfY3JlYXRlOgogI2VuZGlmCiAJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLAogCQkJCSJxY29tLG1zbS1pbWVtLXJlc3RhcnRfcmVhc29uIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9zeXNmcy5jCmluZGV4IDQzMWNkMjQuLmI5MjlkOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9zeXNmcy5jCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9zeXNmcy5jCkBAIC0yNjEsNiArMjYxLDggQEAKIAlQT1dFUl9TVVBQTFlfQVRUUihsb3dfcG93ZXIpLAogCVBPV0VSX1NVUFBMWV9BVFRSKHRlbXBfY29vbCksCiAJUE9XRVJfU1VQUExZX0FUVFIodGVtcF93YXJtKSwKKwlQT1dFUl9TVVBQTFlfQVRUUih0ZW1wX2NvbGQpLAorCVBPV0VSX1NVUFBMWV9BVFRSKHRlbXBfaG90KSwKIAlQT1dFUl9TVVBQTFlfQVRUUihzeXN0ZW1fdGVtcF9sZXZlbCksCiAJUE9XRVJfU1VQUExZX0FUVFIocmVzaXN0YW5jZSksCiAJUE9XRVJfU1VQUExZX0FUVFIocmVzaXN0YW5jZV9jYXBhY2l0aXZlKSwKQEAgLTMxNCw2ICszMTYsOSBAQAogCVBPV0VSX1NVUFBMWV9BVFRSKGNjX3N0ZXApLAogCVBPV0VSX1NVUFBMWV9BVFRSKGNjX3N0ZXBfc2VsKSwKIAlQT1dFUl9TVVBQTFlfQVRUUihzd19qZWl0YV9lbmFibGVkKSwKKwlQT1dFUl9TVVBQTFlfQVRUUihwZF92b2x0YWdlX21heCksCisJUE9XRVJfU1VQUExZX0FUVFIocGRfdm9sdGFnZV9taW4pLAorCVBPV0VSX1NVUFBMWV9BVFRSKHNkcF9jdXJyZW50X21heCksCiAJLyogTG9jYWwgZXh0ZW5zaW9ucyBvZiB0eXBlIGludDY0X3QgKi8KIAlQT1dFUl9TVVBQTFlfQVRUUihjaGFyZ2VfY291bnRlcl9leHQpLAogCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgY29uc3QgY2hhciAqJyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL2JhdHRlcnkuYwppbmRleCA3ZjZkMzQ2Li43ZjlhNzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL2JhdHRlcnkuYwpAQCAtMjYsMTIgKzI2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvcG1fd2FrZXVwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BtaWMtdm90ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlICJiYXR0ZXJ5LmgiCiAKICNkZWZpbmUgRFJWX01BSk9SX1ZFUlNJT04JMQogI2RlZmluZSBEUlZfTUlOT1JfVkVSU0lPTgkwCiAKICNkZWZpbmUgQ0hHX1NUQVRFX1ZPVEVSCQkJIkNIR19TVEFURV9WT1RFUiIKKyNkZWZpbmUgVEFQRVJfU1RFUFBFUl9WT1RFUgkJIlRBUEVSX1NURVBQRVJfVk9URVIiCiAjZGVmaW5lIFRBUEVSX0VORF9WT1RFUgkJCSJUQVBFUl9FTkRfVk9URVIiCiAjZGVmaW5lIFBMX1RBUEVSX0VBUkxZX0JBRF9WT1RFUgkiUExfVEFQRVJfRUFSTFlfQkFEX1ZPVEVSIgogI2RlZmluZSBQQVJBTExFTF9QU1lfVk9URVIJCSJQQVJBTExFTF9QU1lfVk9URVIiCkBAIC00MSwxMiArNDMsMTEgQEAKICNkZWZpbmUgSUNMX0NIQU5HRV9WT1RFUgkJIklDTF9DSEFOR0VfVk9URVIiCiAjZGVmaW5lIFBMX0lORElSRUNUX1ZPVEVSCQkiUExfSU5ESVJFQ1RfVk9URVIiCiAjZGVmaW5lIFVTQklOX0lfVk9URVIJCQkiVVNCSU5fSV9WT1RFUiIKLSNkZWZpbmUgRkNDX0NIQU5HRV9WT1RFUgkJIkZDQ19DSEFOR0VfVk9URVIiCisjZGVmaW5lIFBMX0ZDQ19MT1dfVk9URVIJCSJQTF9GQ0NfTE9XX1ZPVEVSIgogCiBzdHJ1Y3QgcGxfZGF0YSB7CiAJaW50CQkJcGxfbW9kZTsKIAlpbnQJCQlzbGF2ZV9wY3Q7Ci0JaW50CQkJdGFwZXJfcGN0OwogCWludAkJCXNsYXZlX2ZjY191YTsKIAlpbnQJCQlyZXN0cmljdGVkX2N1cnJlbnQ7CiAJYm9vbAkJCXJlc3RyaWN0ZWRfY2hhcmdpbmdfZW5hYmxlZDsKQEAgLTU5LDcgKzYwLDggQEAKIAlzdHJ1Y3Qgdm90YWJsZQkJKnBsX2VuYWJsZV92b3RhYmxlX2luZGlyZWN0OwogCXN0cnVjdCBkZWxheWVkX3dvcmsJc3RhdHVzX2NoYW5nZV93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlwbF9kaXNhYmxlX2ZvcmV2ZXJfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXBsX3RhcGVyX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXBsX3RhcGVyX3dvcms7CisJYm9vbAkJCXRhcGVyX3dvcmtfcnVubmluZzsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSptYWluX3BzeTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpwbF9wc3k7CiAJc3RydWN0IHBvd2VyX3N1cHBseQkqYmF0dF9wc3k7CkBAIC0zNDIsNjcgKzM0NCw3NSBAQAogCQkqbWFzdGVyX3VhID0gbWF4KDAsIHRvdGFsX3VhKTsKIAllbHNlCiAJCSptYXN0ZXJfdWEgPSBtYXgoMCwgdG90YWxfdWEgLSAqc2xhdmVfdWEpOwotCi0JLyogZnVydGhlciByZWR1Y2Ugc2xhdmUncyBzaGFyZSBpbiBhY2NvcmRhbmNlIHdpdGggdGFwZXIgcmVkdWN0aW9ucyAqLwotCSpzbGF2ZV91YSA9ICgqc2xhdmVfdWEgKiBjaGlwLT50YXBlcl9wY3QpIC8gMTAwOwogfQogCiAjZGVmaW5lIE1JTklNVU1fUEFSQUxMRUxfRkNDX1VBCQk1MDAwMDAKLSNkZWZpbmUgUExfVEFQRVJfV09SS19ERUxBWV9NUwkJMTAwCisjZGVmaW5lIFBMX1RBUEVSX1dPUktfREVMQVlfTVMJCTUwMAogI2RlZmluZSBUQVBFUl9SRVNJRFVBTF9QQ1QJCTkwCisjZGVmaW5lIFRBUEVSX1JFRFVDVElPTl9VQQkJMjAwMDAwCiBzdGF0aWMgdm9pZCBwbF90YXBlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcGxfZGF0YSAqY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcGxfZGF0YSwKLQkJCQkJCXBsX3RhcGVyX3dvcmsud29yayk7CisJCQkJCQlwbF90YXBlcl93b3JrKTsKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCBwdmFsID0gezAsIH07Ci0JaW50IHRvdGFsX2ZjY191YSwgbWFzdGVyX2ZjY191YSwgc2xhdmVfZmNjX3VhOwogCWludCByYzsKKwlpbnQgZWZmX2ZjY191YTsKKwlpbnQgdG90YWxfZmNjX3VhLCBtYXN0ZXJfZmNjX3VhLCBzbGF2ZV9mY2NfdWEgPSAwOwogCi0JLyogZXhpdCBpbW1lZGlhdGVseSBpZiBwYXJhbGxlbCBpcyBkaXNhYmxlZCAqLwotCWlmIChnZXRfZWZmZWN0aXZlX3Jlc3VsdChjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUpKSB7Ci0JCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgInRlcm1pbmF0aW5nIHBhcmFsbGVsIG5vdCBpbiBwcm9ncmVzc1xuIik7Ci0JCWdvdG8gZG9uZTsKKwljaGlwLT50YXBlcl93b3JrX3J1bm5pbmcgPSB0cnVlOworCXdoaWxlICh0cnVlKSB7CisJCWlmIChnZXRfZWZmZWN0aXZlX3Jlc3VsdChjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUpKSB7CisJCQkvKgorCQkJICogaWYgcGFyYWxsZWwncyBGQ0Mgc2hhcmUgaXMgbG93LCBzaW1wbHkgZGlzYWJsZQorCQkJICogcGFyYWxsZWwgd2l0aCBUQVBFUl9FTkRfVk9URVIKKwkJCSAqLworCQkJdG90YWxfZmNjX3VhID0gZ2V0X2VmZmVjdGl2ZV9yZXN1bHRfbG9ja2VkKAorCQkJCQljaGlwLT5mY2Nfdm90YWJsZSk7CisJCQlnZXRfZmNjX3NwbGl0KGNoaXAsIHRvdGFsX2ZjY191YSwgJm1hc3Rlcl9mY2NfdWEsCisJCQkJCSZzbGF2ZV9mY2NfdWEpOworCQkJaWYgKHNsYXZlX2ZjY191YSA8PSBNSU5JTVVNX1BBUkFMTEVMX0ZDQ19VQSkgeworCQkJCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgInRlcm1pbmF0aW5nOiBwYXJhbGxlbCdzIHNoYXJlIGlzIGxvd1xuIik7CisJCQkJdm90ZShjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFRBUEVSX0VORF9WT1RFUiwKKwkJCQkJCXRydWUsIDApOworCQkJfSBlbHNlIHsKKwkJCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsICJ0ZXJtaW5hdGluZzogcGFyYWxsZWwgZGlzYWJsZWRcbiIpOworCQkJfQorCQkJZ290byBkb25lOworCQl9CisKKwkJcmMgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGNoaXAtPmJhdHRfcHN5LAorCQkJCSAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwgJnB2YWwpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIkNvdWxkbid0IGdldCBiYXR0IGNoYXJnZSB0eXBlIHJjPSVkXG4iLCByYyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQljaGlwLT5jaGFyZ2VfdHlwZSA9IHB2YWwuaW50dmFsOworCQlpZiAocHZhbC5pbnR2YWwgPT0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RBUEVSKSB7CisJCQllZmZfZmNjX3VhID0gZ2V0X2VmZmVjdGl2ZV9yZXN1bHQoY2hpcC0+ZmNjX3ZvdGFibGUpOworCQkJaWYgKGVmZl9mY2NfdWEgPCAwKSB7CisJCQkJcHJfZXJyKCJDb3VsZG4ndCBnZXQgZmNjLCBleGl0aW5nIHRhcGVyIHdvcmtcbiIpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWVmZl9mY2NfdWEgPSBlZmZfZmNjX3VhIC0gVEFQRVJfUkVEVUNUSU9OX1VBOworCQkJaWYgKGVmZl9mY2NfdWEgPCAwKSB7CisJCQkJcHJfZXJyKCJDYW4ndCByZWR1Y2UgRkNDIGFueSBtb3JlXG4iKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgIm1hc3RlciBpcyB0YXBlciBjaGFyZ2luZzsgcmVkdWNpbmcgRkNDIHRvICVkdWFcbiIsCisJCQkJCWVmZl9mY2NfdWEpOworCQkJdm90ZShjaGlwLT5mY2Nfdm90YWJsZSwgVEFQRVJfU1RFUFBFUl9WT1RFUiwKKwkJCQkJdHJ1ZSwgZWZmX2ZjY191YSk7CisJCX0gZWxzZSB7CisJCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsICJtYXN0ZXIgaXMgZmFzdCBjaGFyZ2luZzsgd2FpdGluZyBmb3IgbmV4dCB0YXBlclxuIik7CisJCX0KKwkJLyogd2FpdCBmb3IgdGhlIGNoYXJnZXIgc3RhdGUgdG8gZGVnbGl0Y2ggYWZ0ZXIgRkNDIGNoYW5nZSAqLworCQltc2xlZXAoUExfVEFQRVJfV09SS19ERUxBWV9NUyk7CiAJfQotCi0JdG90YWxfZmNjX3VhID0gZ2V0X2VmZmVjdGl2ZV9yZXN1bHRfbG9ja2VkKGNoaXAtPmZjY192b3RhYmxlKTsKLQlnZXRfZmNjX3NwbGl0KGNoaXAsIHRvdGFsX2ZjY191YSwgJm1hc3Rlcl9mY2NfdWEsICZzbGF2ZV9mY2NfdWEpOwotCWlmIChzbGF2ZV9mY2NfdWEgPCBNSU5JTVVNX1BBUkFMTEVMX0ZDQ19VQSkgewotCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsICJ0ZXJtaW5hdGluZyBwYXJhbGxlbCdzIHNoYXJlIGxvd2VyIHRoYW4gNTAwbUFcbiIpOwotCQl2b3RlKGNoaXAtPnBsX2Rpc2FibGVfdm90YWJsZSwgVEFQRVJfRU5EX1ZPVEVSLCB0cnVlLCAwKTsKLQkJZ290byBkb25lOwotCX0KLQotCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgImVudGVyaW5nIHBhcmFsbGVsIHRhcGVyIHdvcmsgc2xhdmVfZmNjID0gJWRcbiIsCi0JCXNsYXZlX2ZjY191YSk7Ci0KLQlyYyA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoY2hpcC0+YmF0dF9wc3ksCi0JCQkgICAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsICZwdmFsKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiQ291bGRuJ3QgZ2V0IGJhdHQgY2hhcmdlIHR5cGUgcmM9JWRcbiIsIHJjKTsKLQkJZ290byBkb25lOwotCX0KLQotCWNoaXAtPmNoYXJnZV90eXBlID0gcHZhbC5pbnR2YWw7Ci0JaWYgKHB2YWwuaW50dmFsID09IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UQVBFUikgewotCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsICJtYXN0ZXIgaXMgdGFwZXIgY2hhcmdpbmc7IHJlZHVjaW5nIHNsYXZlIEZDQ1xuIik7Ci0KLQkJdm90ZShjaGlwLT5wbF9hd2FrZV92b3RhYmxlLCBUQVBFUl9FTkRfVk9URVIsIHRydWUsIDApOwotCQkvKiBSZWR1Y2UgdGhlIHRhcGVyIHBlcmNlbnQgYnkgMTAgcGVyY2VudCAqLwotCQljaGlwLT50YXBlcl9wY3QgPSBjaGlwLT50YXBlcl9wY3QgKiBUQVBFUl9SRVNJRFVBTF9QQ1QgLyAxMDA7Ci0JCXJlcnVuX2VsZWN0aW9uKGNoaXAtPmZjY192b3RhYmxlKTsKLQkJcGxfZGJnKGNoaXAsIFBSX1BBUkFMTEVMLCAidGFwZXIgZW50cnkgc2NoZWR1bGluZyB3b3JrIGFmdGVyICVkIG1zXG4iLAotCQkJCVBMX1RBUEVSX1dPUktfREVMQVlfTVMpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPnBsX3RhcGVyX3dvcmssCi0JCQkJbXNlY3NfdG9famlmZmllcyhQTF9UQVBFUl9XT1JLX0RFTEFZX01TKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIE1hc3RlciBiYWNrIHRvIEZhc3QgQ2hhcmdlLCBnZXQgb3V0IG9mIHRoaXMgcm91bmQgb2YgdGFwZXIgcmVkdWN0aW9uCi0JICovCi0JcGxfZGJnKGNoaXAsIFBSX1BBUkFMTEVMLCAibWFzdGVyIGlzIGZhc3QgY2hhcmdpbmc7IHdhaXRpbmcgZm9yIG5leHQgdGFwZXJcbiIpOwotCiBkb25lOgorCWNoaXAtPnRhcGVyX3dvcmtfcnVubmluZyA9IGZhbHNlOworCXZvdGUoY2hpcC0+ZmNjX3ZvdGFibGUsIFRBUEVSX1NURVBQRVJfVk9URVIsIGZhbHNlLCAwKTsKIAl2b3RlKGNoaXAtPnBsX2F3YWtlX3ZvdGFibGUsIFRBUEVSX0VORF9WT1RFUiwgZmFsc2UsIDApOwogfQogCkBAIC00MjIsMjQgKzQzMiwxOSBAQAogCQlnZXRfZmNjX3NwbGl0KGNoaXAsIHRvdGFsX2ZjY191YSwgJm1hc3Rlcl9mY2NfdWEsCiAJCQkJJnNsYXZlX2ZjY191YSk7CiAKLQkJaWYgKHNsYXZlX2ZjY191YSA+IDUwMDAwMCkgeworCQlpZiAoc2xhdmVfZmNjX3VhID4gTUlOSU1VTV9QQVJBTExFTF9GQ0NfVUEpIHsKIAkJCWNoaXAtPnNsYXZlX2ZjY191YSA9IHNsYXZlX2ZjY191YTsKLQkJCXZvdGUoY2hpcC0+cGxfZGlzYWJsZV92b3RhYmxlLCBGQ0NfQ0hBTkdFX1ZPVEVSLAorCQkJdm90ZShjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFBMX0ZDQ19MT1dfVk9URVIsCiAJCQkJCQkJZmFsc2UsIDApOwogCQl9IGVsc2UgewogCQkJY2hpcC0+c2xhdmVfZmNjX3VhID0gMDsKLQkJCXZvdGUoY2hpcC0+cGxfZGlzYWJsZV92b3RhYmxlLCBGQ0NfQ0hBTkdFX1ZPVEVSLAorCQkJdm90ZShjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFBMX0ZDQ19MT1dfVk9URVIsCiAJCQkJCQkJdHJ1ZSwgMCk7CiAJCX0KIAl9CiAKIAlyZXJ1bl9lbGVjdGlvbihjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUpOwogCi0JcGxfZGJnKGNoaXAsIFBSX1BBUkFMTEVMLCAibWFzdGVyX2ZjYz0lZCBzbGF2ZV9mY2M9JWQgZGlzdHJpYnV0aW9uPSglZC8lZClcbiIsCi0JCSAgIG1hc3Rlcl9mY2NfdWEsIHNsYXZlX2ZjY191YSwKLQkJICAgKG1hc3Rlcl9mY2NfdWEgKiAxMDApIC8gdG90YWxfZmNjX3VhLAotCQkgICAoc2xhdmVfZmNjX3VhICogMTAwKSAvIHRvdGFsX2ZjY191YSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjUyLDEyICs2NTcsMjEgQEAKIAkJaWYgKHJjIDwgMCkgewogCQkJcHJfZXJyKCJDb3VsZG4ndCBnZXQgYmF0dCBjaGFyZ2UgdHlwZSByYz0lZFxuIiwgcmMpOwogCQl9IGVsc2UgewotCQkJaWYgKHB2YWwuaW50dmFsID09IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UQVBFUikgeworCQkJaWYgKHB2YWwuaW50dmFsID09IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UQVBFUgorCQkJCSYmICFjaGlwLT50YXBlcl93b3JrX3J1bm5pbmcpIHsKIAkJCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsCiAJCQkJCSJwbCBlbmFibGVkIGluIFRhcGVyIHNjaGVkdWluZyB3b3JrXG4iKTsKLQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPnBsX3RhcGVyX3dvcmssIDApOworCQkJCXZvdGUoY2hpcC0+cGxfYXdha2Vfdm90YWJsZSwgVEFQRVJfRU5EX1ZPVEVSLAorCQkJCQkJdHJ1ZSwgMCk7CisJCQkJcXVldWVfd29yayhzeXN0ZW1fbG9uZ193cSwKKwkJCQkJCSZjaGlwLT5wbF90YXBlcl93b3JrKTsKIAkJCX0KIAkJfQorCisJCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgIm1hc3Rlcl9mY2M9JWQgc2xhdmVfZmNjPSVkIGRpc3RyaWJ1dGlvbj0oJWQvJWQpXG4iLAorCQkJbWFzdGVyX2ZjY191YSwgc2xhdmVfZmNjX3VhLAorCQkJKG1hc3Rlcl9mY2NfdWEgKiAxMDApIC8gdG90YWxfZmNjX3VhLAorCQkJKHNsYXZlX2ZjY191YSAqIDEwMCkgLyB0b3RhbF9mY2NfdWEpOwogCX0gZWxzZSB7CiAJCWlmICgoY2hpcC0+cGxfbW9kZSA9PSBQT1dFUl9TVVBQTFlfUExfVVNCSU5fVVNCSU4pCiAJCQl8fCAoY2hpcC0+cGxfbW9kZSA9PSBQT1dFUl9TVVBQTFlfUExfVVNCSU5fVVNCSU5fRVhUKSkKQEAgLTc4OCw3ICs4MDIsNiBAQAogCWlmICgocHZhbC5pbnR2YWwgIT0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1QpCiAJCSYmIChwdmFsLmludHZhbCAhPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVEFQRVIpKSB7CiAJCXZvdGUoY2hpcC0+cGxfZGlzYWJsZV92b3RhYmxlLCBDSEdfU1RBVEVfVk9URVIsIHRydWUsIDApOwotCQljaGlwLT50YXBlcl9wY3QgPSAxMDA7CiAJCXZvdGUoY2hpcC0+cGxfZGlzYWJsZV92b3RhYmxlLCBUQVBFUl9FTkRfVk9URVIsIGZhbHNlLCAwKTsKIAkJdm90ZShjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFBMX1RBUEVSX0VBUkxZX0JBRF9WT1RFUiwKIAkJCQlmYWxzZSwgMCk7CkBAIC04MDAsOCArODEzLDExIEBACiAJaWYgKGNoaXAtPmNoYXJnZV90eXBlID09IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUCiAJCSYmIChwdmFsLmludHZhbCA9PSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVEFQRVIpKSB7CiAJCWNoaXAtPmNoYXJnZV90eXBlID0gcHZhbC5pbnR2YWw7Ci0JCXBsX2RiZyhjaGlwLCBQUl9QQVJBTExFTCwgInRhcGVyIGVudHJ5IHNjaGVkdWxpbmcgd29ya1xuIik7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cGxfdGFwZXJfd29yaywgMCk7CisJCWlmICghY2hpcC0+dGFwZXJfd29ya19ydW5uaW5nKSB7CisJCQlwbF9kYmcoY2hpcCwgUFJfUEFSQUxMRUwsICJ0YXBlciBlbnRyeSBzY2hlZHVsaW5nIHdvcmtcbiIpOworCQkJdm90ZShjaGlwLT5wbF9hd2FrZV92b3RhYmxlLCBUQVBFUl9FTkRfVk9URVIsIHRydWUsIDApOworCQkJcXVldWVfd29yayhzeXN0ZW1fbG9uZ193cSwgJmNoaXAtPnBsX3RhcGVyX3dvcmspOworCQl9CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMTAsNyArMTAyNiw3IEBACiAJCWdvdG8gcmVsZWFzZV93YWtldXBfc291cmNlOwogCX0KIAotCWNoaXAtPmZ2X3ZvdGFibGUgPSBjcmVhdGVfdm90YWJsZSgiRlYiLCBWT1RFX01BWCwKKwljaGlwLT5mdl92b3RhYmxlID0gY3JlYXRlX3ZvdGFibGUoIkZWIiwgVk9URV9NSU4sCiAJCQkJCXBsX2Z2X3ZvdGVfY2FsbGJhY2ssCiAJCQkJCWNoaXApOwogCWlmIChJU19FUlIoY2hpcC0+ZnZfdm90YWJsZSkpIHsKQEAgLTEwNTcsNyArMTA3Myw3IEBACiAJdm90ZShjaGlwLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFBMX0lORElSRUNUX1ZPVEVSLCB0cnVlLCAwKTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT5zdGF0dXNfY2hhbmdlX3dvcmssIHN0YXR1c19jaGFuZ2Vfd29yayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmNoaXAtPnBsX3RhcGVyX3dvcmssIHBsX3RhcGVyX3dvcmspOworCUlOSVRfV09SSygmY2hpcC0+cGxfdGFwZXJfd29yaywgcGxfdGFwZXJfd29yayk7CiAJSU5JVF9XT1JLKCZjaGlwLT5wbF9kaXNhYmxlX2ZvcmV2ZXJfd29yaywgcGxfZGlzYWJsZV9mb3JldmVyX3dvcmspOwogCiAJcmMgPSBwbF9yZWdpc3Rlcl9ub3RpZmllcihjaGlwKTsKQEAgLTEwODIsOCArMTA5OCw2IEBACiAJCWdvdG8gdW5yZWdfbm90aWZpZXI7CiAJfQogCi0JY2hpcC0+dGFwZXJfcGN0ID0gMTAwOwotCiAJdGhlX2NoaXAgPSBjaGlwOwogCiAJcmV0dXJuIDA7CkBAIC0xMTEyLDcgKzExMjYsNyBAQAogCQlyZXR1cm47CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPnN0YXR1c19jaGFuZ2Vfd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjaGlwLT5wbF90YXBlcl93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZjaGlwLT5wbF90YXBlcl93b3JrKTsKIAljYW5jZWxfd29ya19zeW5jKCZjaGlwLT5wbF9kaXNhYmxlX2ZvcmV2ZXJfd29yayk7CiAKIAlwb3dlcl9zdXBwbHlfdW5yZWdfbm90aWZpZXIoJmNoaXAtPm5iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vZmctY29yZS5oIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy1jb3JlLmgKaW5kZXggYzc5M2VlNS4uM2NhNWRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy1jb3JlLmgKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy1jb3JlLmgKQEAgLTEwNSw3ICsxMDUsNyBAQAogfTsKIAogLyogSkVJVEEgKi8KLWVudW0geworZW51bSBqZWl0YV9sZXZlbHMgewogCUpFSVRBX0NPTEQgPSAwLAogCUpFSVRBX0NPT0wsCiAJSkVJVEFfV0FSTSwKQEAgLTI1Miw2ICsyNTIsNyBAQAogc3RydWN0IGZnX2R0X3Byb3BzIHsKIAlib29sCWZvcmNlX2xvYWRfcHJvZmlsZTsKIAlib29sCWhvbGRfc29jX3doaWxlX2Z1bGw7CisJYm9vbAlsaW5lYXJpemVfc29jOwogCWJvb2wJYXV0b19yZWNoYXJnZV9zb2M7CiAJaW50CWN1dG9mZl92b2x0X212OwogCWludAllbXB0eV92b2x0X212OwpAQCAtMjg2LDYgKzI4Nyw3IEBACiAJaW50CWVzcl9wdWxzZV90aHJlc2hfbWE7CiAJaW50CWVzcl9tZWFzX2N1cnJfbWE7CiAJaW50CWJtZF9lbl9kZWxheV9tczsKKwlpbnQJa2lfY29lZmZfZnVsbF9zb2NfZGlzY2hnOwogCWludAlqZWl0YV90aHJlc2hvbGRzW05VTV9KRUlUQV9MRVZFTFNdOwogCWludAlraV9jb2VmZl9zb2NbS0lfQ09FRkZfU09DX0xFVkVMU107CiAJaW50CWtpX2NvZWZmX21lZF9kaXNjaGdbS0lfQ09FRkZfU09DX0xFVkVMU107CkBAIC00MTUsNiArNDE3LDcgQEAKIAlzdHJ1Y3QgbXV0ZXgJCWJ1c19sb2NrOwogCXN0cnVjdCBtdXRleAkJc3JhbV9yd19sb2NrOwogCXN0cnVjdCBtdXRleAkJY2hhcmdlX2Z1bGxfbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCXFub3ZvX2Vzcl9jdHJsX2xvY2s7CiAJdTMyCQkJYmF0dF9zb2NfYmFzZTsKIAl1MzIJCQliYXR0X2luZm9fYmFzZTsKIAl1MzIJCQltZW1faWZfYmFzZTsKQEAgLTQyMyw3ICs0MjYsNiBAQAogCWludAkJCWJhdHRfaWRfb2htczsKIAlpbnQJCQlraV9jb2VmZl9mdWxsX3NvYzsKIAlpbnQJCQljaGFyZ2Vfc3RhdHVzOwotCWludAkJCXByZXZfY2hhcmdlX3N0YXR1czsKIAlpbnQJCQljaGFyZ2VfZG9uZTsKIAlpbnQJCQljaGFyZ2VfdHlwZTsKIAlpbnQJCQlvbmxpbmVfc3RhdHVzOwpAQCAtNDQ5LDYgKzQ1MSw3IEBACiAJYm9vbAkJCXNsb3BlX2xpbWl0X2VuOwogCWJvb2wJCQl1c2VfaW1hX3NpbmdsZV9tb2RlOwogCWJvb2wJCQl1c2VfZG1hOworCWJvb2wJCQlxbm92b19lbmFibGU7CiAJc3RydWN0IGNvbXBsZXRpb24Jc29jX3VwZGF0ZTsKIAlzdHJ1Y3QgY29tcGxldGlvbglzb2NfcmVhZHk7CiAJc3RydWN0IGNvbXBsZXRpb24JbWVtX2dyYW50OwpAQCAtNTA0LDYgKzUwNyw3IEBACiBleHRlcm4gaW50IGZnX3JlYWQoc3RydWN0IGZnX2NoaXAgKmNoaXAsIGludCBhZGRyLCB1OCAqdmFsLCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgZmdfd3JpdGUoc3RydWN0IGZnX2NoaXAgKmNoaXAsIGludCBhZGRyLCB1OCAqdmFsLCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgZmdfbWFza2VkX3dyaXRlKHN0cnVjdCBmZ19jaGlwICpjaGlwLCBpbnQgYWRkciwgdTggbWFzaywgdTggdmFsKTsKK2V4dGVybiBpbnQgZmdfZHVtcF9yZWdzKHN0cnVjdCBmZ19jaGlwICpjaGlwKTsKIGV4dGVybiBpbnQgZmdfaW1hX2luaXQoc3RydWN0IGZnX2NoaXAgKmNoaXApOwogZXh0ZXJuIGludCBmZ19kbWFfaW5pdChzdHJ1Y3QgZmdfY2hpcCAqY2hpcCk7CiBleHRlcm4gaW50IGZnX2NsZWFyX2ltYV9lcnJvcnNfaWZfYW55KHN0cnVjdCBmZ19jaGlwICpjaGlwLCBib29sIGNoZWNrX2h3X3N0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL2ZnLW1lbWlmLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL2ZnLW1lbWlmLmMKaW5kZXggMGFiYzlkZi4uYzFiNWFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy1tZW1pZi5jCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vZmctbWVtaWYuYwpAQCAtNzkyLDYgKzc5Miw3IEBACiAJCX0gZWxzZSB7CiAJCQlwcl9lcnIoIndhaXQgZm9yIG1lbV9ncmFudCB0aW1lZCBvdXQgcmV0PSVkXG4iLAogCQkJCXJldCk7CisJCQlmZ19kdW1wX3JlZ3MoY2hpcCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vZmctdXRpbC5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy11dGlsLmMKaW5kZXggYWVkMjA2Mi4uZmM2MGIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy11dGlsLmMKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9mZy11dGlsLmMKQEAgLTQ5Miw2ICs0OTIsMzMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBmZ19kdW1wX3JlZ3Moc3RydWN0IGZnX2NoaXAgKmNoaXApCit7CisJaW50IGksIHJjOworCXU4IGJ1ZlsyNTZdOworCisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gZmdfcmVhZChjaGlwLCBjaGlwLT5iYXR0X3NvY19iYXNlLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlwcl9pbmZvKCJiYXR0X3NvY19iYXNlIHJlZ2lzdGVyczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgaSsrKQorCQlwcl9pbmZvKCIlMDR4OiUwMnhcbiIsIGNoaXAtPmJhdHRfc29jX2Jhc2UgKyBpLCBidWZbaV0pOworCisJcmMgPSBmZ19yZWFkKGNoaXAsIGNoaXAtPm1lbV9pZl9iYXNlLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlwcl9pbmZvKCJtZW1faWZfYmFzZSByZWdpc3RlcnM6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykKKwkJcHJfaW5mbygiJTA0eDolMDJ4XG4iLCBjaGlwLT5tZW1faWZfYmFzZSArIGksIGJ1ZltpXSk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50NjRfdCB0d29zX2NvbXBsaW1lbnRfZXh0ZW5kKGludDY0X3QgdmFsLCBpbnQgc2lnbl9iaXRfcG9zKQogewogCWludCBpLCBuYnl0ZXMgPSBESVZfUk9VTkRfVVAoc2lnbl9iaXRfcG9zLCA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1mZy1nZW4zLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtZmctZ2VuMy5jCmluZGV4IDZmNjE1ZTQuLmZjMzRhOGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtZmctZ2VuMy5jCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1mZy1nZW4zLmMKQEAgLTU3Niw2ICs1NzYsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmZ19nZXRfamVpdGFfdGhyZXNob2xkKHN0cnVjdCBmZ19jaGlwICpjaGlwLAorCQkJCWVudW0gamVpdGFfbGV2ZWxzIGxldmVsLCBpbnQgKnRlbXBfZGVjaWRlZ0MpCit7CisJaW50IHJjOworCXU4IHZhbDsKKwl1MTYgcmVnOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgSkVJVEFfQ09MRDoKKwkJcmVnID0gQkFUVF9JTkZPX0pFSVRBX1RPT19DT0xEKGNoaXApOworCQlicmVhazsKKwljYXNlIEpFSVRBX0NPT0w6CisJCXJlZyA9IEJBVFRfSU5GT19KRUlUQV9DT0xEKGNoaXApOworCQlicmVhazsKKwljYXNlIEpFSVRBX1dBUk06CisJCXJlZyA9IEJBVFRfSU5GT19KRUlUQV9IT1QoY2hpcCk7CisJCWJyZWFrOworCWNhc2UgSkVJVEFfSE9UOgorCQlyZWcgPSBCQVRUX0lORk9fSkVJVEFfVE9PX0hPVChjaGlwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBmZ19yZWFkKGNoaXAsIHJlZywgJnZhbCwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIkVycm9yIGluIHJlYWRpbmcgamVpdGEgbGV2ZWwgJWQsIHJjPSVkXG4iLCBsZXZlbCwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogUmVzb2x1dGlvbiBpcyAwLjVDLiBCYXNlIGlzIC0zMEMuICovCisJKnRlbXBfZGVjaWRlZ0MgPSAoKCg1ICogdmFsKSAvIDEwKSAtIDMwKSAqIDEwOworCXJldHVybiAwOworfQorCiAjZGVmaW5lIEJBVFRfVEVNUF9OVU1SCQkxCiAjZGVmaW5lIEJBVFRfVEVNUF9ERU5SCQkxCiBzdGF0aWMgaW50IGZnX2dldF9iYXR0ZXJ5X3RlbXAoc3RydWN0IGZnX2NoaXAgKmNoaXAsIGludCAqdmFsKQpAQCAtODM4LDcgKzg3Myw3IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0JaWYgKGNoaXAtPmRlbHRhX3NvYyA+IDApCisJaWYgKGNoaXAtPmR0LmxpbmVhcml6ZV9zb2MgJiYgY2hpcC0+ZGVsdGFfc29jID4gMCkKIAkJKnZhbCA9IGNoaXAtPm1haW50X3NvYzsKIAllbHNlCiAJCSp2YWwgPSBtc29jOwpAQCAtOTc4LDEyICsxMDEzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGdldF90ZW1wX3NldHBvaW50KGludCB0aHJlc2hvbGQsIHU4ICp2YWwpCi17Ci0JLyogUmVzb2x1dGlvbiBpcyAwLjVDLiBCYXNlIGlzIC0zMEMuICovCi0JKnZhbCA9IERJVl9ST1VORF9DTE9TRVNUKCh0aHJlc2hvbGQgKyAzMCkgKiAxMCwgNSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYmF0dF90ZW1wX2RlbHRhKGludCBkZWx0YSwgdTggKnZhbCkKIHsKIAlzd2l0Y2ggKGRlbHRhKSB7CkBAIC0xNjAyLDYgKzE2MzEsOCBAQAogCiAJaWYgKGJhdHRfdGVtcCA8IDApCiAJCWtpX2NvZWZmX2Z1bGxfc29jID0gMDsKKwllbHNlIGlmIChjaGlwLT5jaGFyZ2Vfc3RhdHVzID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcpCisJCWtpX2NvZWZmX2Z1bGxfc29jID0gY2hpcC0+ZHQua2lfY29lZmZfZnVsbF9zb2NfZGlzY2hnOwogCWVsc2UKIAkJa2lfY29lZmZfZnVsbF9zb2MgPSBLSV9DT0VGRl9GVUxMX1NPQ19ERUZBVUxUOwogCkBAIC0xNjU4LDEyICsxNjg5LDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmdfY29uZmlndXJlX2Z1bGxfc29jKHN0cnVjdCBmZ19jaGlwICpjaGlwLCBpbnQgYnNvYykKK3sKKwlpbnQgcmM7CisJdTggZnVsbF9zb2NbMl0gPSB7MHhGRiwgMHhGRn07CisKKwkvKgorCSAqIE9uY2UgU09DIG1hc2tpbmcgY29uZGl0aW9uIGlzIGNsZWFyZWQsIEZVTExfU09DIGFuZCBNT05PVE9OSUNfU09DCisJICogbmVlZHMgdG8gYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBzYW1lLiBXcml0ZSBiYXR0ZXJ5IFNPQyB0bworCSAqIEZVTExfU09DIGFuZCB3cml0ZSBhIGZ1bGwgdmFsdWUgdG8gTU9OT1RPTklDX1NPQy4KKwkgKi8KKwlyYyA9IGZnX3NyYW1fd3JpdGUoY2hpcCwgRlVMTF9TT0NfV09SRCwgRlVMTF9TT0NfT0ZGU0VULAorCQkJKHU4ICopJmJzb2MsIDIsIEZHX0lNQV9BVE9NSUMpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgZnVsbF9zb2MgcmM9JWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gZmdfc3JhbV93cml0ZShjaGlwLCBNT05PVE9OSUNfU09DX1dPUkQsIE1PTk9UT05JQ19TT0NfT0ZGU0VULAorCQkJZnVsbF9zb2MsIDIsIEZHX0lNQV9BVE9NSUMpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgbW9ub3RvbmljX3NvYyByYz0lZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgQVVUT19SRUNIR19WT0xUX0xPV19MSU1JVF9NVgkzNzAwCiBzdGF0aWMgaW50IGZnX2NoYXJnZV9mdWxsX3VwZGF0ZShzdHJ1Y3QgZmdfY2hpcCAqY2hpcCkKIHsKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCBwcm9wID0gezAsIH07CiAJaW50IHJjLCBtc29jLCBic29jLCByZWNoYXJnZV9zb2MsIG1zb2NfcmF3OwotCXU4IGZ1bGxfc29jWzJdID0gezB4RkYsIDB4RkZ9OwogCiAJaWYgKCFjaGlwLT5kdC5ob2xkX3NvY193aGlsZV9mdWxsKQogCQlyZXR1cm4gMDsKQEAgLTE2OTMsMTIgKzE3NTAsMTIgQEAKIAogCS8qIFdlIG5lZWQgMiBtb3N0IHNpZ25pZmljYW50IGJ5dGVzIGhlcmUgKi8KIAlic29jID0gKHUzMilic29jID4+IDE2OwotCXJjID0gZmdfZ2V0X21zb2MoY2hpcCwgJm1zb2MpOworCXJjID0gZmdfZ2V0X21zb2NfcmF3KGNoaXAsICZtc29jX3Jhdyk7CiAJaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIkVycm9yIGluIGdldHRpbmcgbXNvYywgcmM9JWRcbiIsIHJjKTsKKwkJcHJfZXJyKCJFcnJvciBpbiBnZXR0aW5nIG1zb2NfcmF3LCByYz0lZFxuIiwgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0JbXNvY19yYXcgPSBESVZfUk9VTkRfQ0xPU0VTVChtc29jICogRlVMTF9TT0NfUkFXLCBGVUxMX0NBUEFDSVRZKTsKKwltc29jID0gRElWX1JPVU5EX0NMT1NFU1QobXNvY19yYXcgKiBGVUxMX0NBUEFDSVRZLCBGVUxMX1NPQ19SQVcpOwogCiAJZmdfZGJnKGNoaXAsIEZHX1NUQVRVUywgIm1zb2M6ICVkIGJzb2M6ICV4IGhlYWx0aDogJWQgc3RhdHVzOiAlZCBmdWxsOiAlZFxuIiwKIAkJbXNvYywgYnNvYywgY2hpcC0+aGVhbHRoLCBjaGlwLT5jaGFyZ2Vfc3RhdHVzLApAQCAtMTcyMiwyNCArMTc3OSwyNCBAQAogCQkJZmdfZGJnKGNoaXAsIEZHX1NUQVRVUywgIlRlcm1pbmF0ZWQgY2hhcmdpbmcgQCBTT0MlZFxuIiwKIAkJCQltc29jKTsKIAkJfQotCX0gZWxzZSBpZiAobXNvY19yYXcgPCByZWNoYXJnZV9zb2MgJiYgY2hpcC0+Y2hhcmdlX2Z1bGwpIHsKLQkJY2hpcC0+ZGVsdGFfc29jID0gRlVMTF9DQVBBQ0lUWSAtIG1zb2M7CisJfSBlbHNlIGlmIChtc29jX3JhdyA8PSByZWNoYXJnZV9zb2MgJiYgY2hpcC0+Y2hhcmdlX2Z1bGwpIHsKKwkJaWYgKGNoaXAtPmR0LmxpbmVhcml6ZV9zb2MpIHsKKwkJCWNoaXAtPmRlbHRhX3NvYyA9IEZVTExfQ0FQQUNJVFkgLSBtc29jOwogCi0JCS8qCi0JCSAqIFdlJ3JlIHNwcmVhZGluZyBvdXQgdGhlIGRlbHRhIFNPQyBvdmVyIGV2ZXJ5IDEwJSBjaGFuZ2UKLQkJICogaW4gbW9ub3RvbmljIFNPQy4gV2UgY2Fubm90IHNwcmVhZCBtb3JlIHRoYW4gOSUgaW4gdGhlCi0JCSAqIHJhbmdlIG9mIDAtMTAwIHNraXBwaW5nIHRoZSBmaXJzdCAxMCUuCi0JCSAqLwotCQlpZiAoY2hpcC0+ZGVsdGFfc29jID4gOSkgewotCQkJY2hpcC0+ZGVsdGFfc29jID0gMDsKLQkJCWNoaXAtPm1haW50X3NvYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQljaGlwLT5tYWludF9zb2MgPSBGVUxMX0NBUEFDSVRZOwotCQkJY2hpcC0+bGFzdF9tc29jID0gbXNvYzsKKwkJCS8qCisJCQkgKiBXZSdyZSBzcHJlYWRpbmcgb3V0IHRoZSBkZWx0YSBTT0Mgb3ZlciBldmVyeSAxMCUKKwkJCSAqIGNoYW5nZSBpbiBtb25vdG9uaWMgU09DLiBXZSBjYW5ub3Qgc3ByZWFkIG1vcmUgdGhhbgorCQkJICogOSUgaW4gdGhlIHJhbmdlIG9mIDAtMTAwIHNraXBwaW5nIHRoZSBmaXJzdCAxMCUuCisJCQkgKi8KKwkJCWlmIChjaGlwLT5kZWx0YV9zb2MgPiA5KSB7CisJCQkJY2hpcC0+ZGVsdGFfc29jID0gMDsKKwkJCQljaGlwLT5tYWludF9zb2MgPSAwOworCQkJfSBlbHNlIHsKKwkJCQljaGlwLT5tYWludF9zb2MgPSBGVUxMX0NBUEFDSVRZOworCQkJCWNoaXAtPmxhc3RfbXNvYyA9IG1zb2M7CisJCQl9CiAJCX0KIAotCQljaGlwLT5jaGFyZ2VfZnVsbCA9IGZhbHNlOwotCiAJCS8qCiAJCSAqIFJhaXNlIHRoZSByZWNoYXJnZSB2b2x0YWdlIHNvIHRoYXQgVkJBVF9MVF9SRUNIRyBzaWduYWwKIAkJICogd2lsbCBiZSBhc3NlcnRlZCBzb29uIGFzIGJhdHRlcnkgU09DIGhhZCBkcm9wcGVkIGJlbG93CkBAIC0xNzUyLDM1ICsxODA5LDIzIEBACiAJCQkJcmMpOwogCQkJZ290byBvdXQ7CiAJCX0KKworCQkvKgorCQkgKiBJZiBjaGFyZ2VfZG9uZSBpcyBzdGlsbCBzZXQsIHdhaXQgZm9yIHJlY2hhcmdpbmcgb3IKKwkJICogZGlzY2hhcmdpbmcgdG8gaGFwcGVuLgorCQkgKi8KKwkJaWYgKGNoaXAtPmNoYXJnZV9kb25lKQorCQkJZ290byBvdXQ7CisKKwkJcmMgPSBmZ19jb25maWd1cmVfZnVsbF9zb2MoY2hpcCwgYnNvYyk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dDsKKworCQljaGlwLT5jaGFyZ2VfZnVsbCA9IGZhbHNlOwogCQlmZ19kYmcoY2hpcCwgRkdfU1RBVFVTLCAibXNvY19yYXcgPSAlZCBic29jOiAlZCByZWNoYXJnZV9zb2M6ICVkIGRlbHRhX3NvYzogJWRcbiIsCiAJCQltc29jX3JhdywgYnNvYyA+PiA4LCByZWNoYXJnZV9zb2MsIGNoaXAtPmRlbHRhX3NvYyk7Ci0JfSBlbHNlIHsKLQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFjaGlwLT5jaGFyZ2VfZnVsbCkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIER1cmluZyBKRUlUQSBjb25kaXRpb25zLCBjaGFyZ2VfZnVsbCBjYW4gaGFwcGVuIGVhcmx5LiBGVUxMX1NPQwotCSAqIGFuZCBNT05PVE9OSUNfU09DIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgc2FtZS4gV3JpdGUKLQkgKiBiYXR0ZXJ5IFNPQyB0byBGVUxMX1NPQyBhbmQgd3JpdGUgYSBmdWxsIHZhbHVlIHRvIE1PTk9UT05JQ19TT0MuCi0JICovCi0JcmMgPSBmZ19zcmFtX3dyaXRlKGNoaXAsIEZVTExfU09DX1dPUkQsIEZVTExfU09DX09GRlNFVCwgKHU4ICopJmJzb2MsIDIsCi0JCQlGR19JTUFfQVRPTUlDKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIGZ1bGxfc29jIHJjPSVkXG4iLCByYyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gZmdfc3JhbV93cml0ZShjaGlwLCBNT05PVE9OSUNfU09DX1dPUkQsIE1PTk9UT05JQ19TT0NfT0ZGU0VULAotCQkJZnVsbF9zb2MsIDIsIEZHX0lNQV9BVE9NSUMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgbW9ub3RvbmljX3NvYyByYz0lZFxuIiwgcmMpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlmZ19kYmcoY2hpcCwgRkdfU1RBVFVTLCAiU2V0IGNoYXJnZV9mdWxsIHRvIHRydWUgQCBzb2MgJWRcbiIsIG1zb2MpOwogb3V0OgogCW11dGV4X3VubG9jaygmY2hpcC0+Y2hhcmdlX2Z1bGxfbG9jayk7CiAJcmV0dXJuIHJjOwpAQCAtMTg2Myw2ICsxOTA4LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmdfc2V0X2plaXRhX3RocmVzaG9sZChzdHJ1Y3QgZmdfY2hpcCAqY2hpcCwKKwkJCQllbnVtIGplaXRhX2xldmVscyBsZXZlbCwgaW50IHRlbXBfZGVjaWRlZ0MpCit7CisJaW50IHJjOworCXU4IHZhbDsKKwl1MTYgcmVnOworCisJaWYgKHRlbXBfZGVjaWRlZ0MgPCAtMzAwIHx8IHRlbXBfZGVjaWRlZ0MgPiA5NzApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVzb2x1dGlvbiBpcyAwLjVDLiBCYXNlIGlzIC0zMEMuICovCisJdmFsID0gRElWX1JPVU5EX0NMT1NFU1QoKCh0ZW1wX2RlY2lkZWdDIC8gMTApICsgMzApICogMTAsIDUpOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIEpFSVRBX0NPTEQ6CisJCXJlZyA9IEJBVFRfSU5GT19KRUlUQV9UT09fQ09MRChjaGlwKTsKKwkJYnJlYWs7CisJY2FzZSBKRUlUQV9DT09MOgorCQlyZWcgPSBCQVRUX0lORk9fSkVJVEFfQ09MRChjaGlwKTsKKwkJYnJlYWs7CisJY2FzZSBKRUlUQV9XQVJNOgorCQlyZWcgPSBCQVRUX0lORk9fSkVJVEFfSE9UKGNoaXApOworCQlicmVhazsKKwljYXNlIEpFSVRBX0hPVDoKKwkJcmVnID0gQkFUVF9JTkZPX0pFSVRBX1RPT19IT1QoY2hpcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gZmdfd3JpdGUoY2hpcCwgcmVnLCAmdmFsLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiRXJyb3IgaW4gc2V0dGluZyBqZWl0YSBsZXZlbCAlZCwgcmM9JWRcbiIsIGxldmVsLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmZ19zZXRfY29uc3RhbnRfY2hnX3ZvbHRhZ2Uoc3RydWN0IGZnX2NoaXAgKmNoaXAsIGludCB2b2x0X3V2KQogewogCXU4IGJ1ZlsyXTsKQEAgLTI0MjYsNyArMjUwOSw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNoaXAtPnByZXZfY2hhcmdlX3N0YXR1cyA9IGNoaXAtPmNoYXJnZV9zdGF0dXM7CiAJY2hpcC0+Y2hhcmdlX3N0YXR1cyA9IHByb3AuaW50dmFsOwogCXJjID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShjaGlwLT5iYXR0X3BzeSwKIAkJCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLCAmcHJvcCk7CkBAIC0yODYyLDYgKzI5NDQsOSBAQAogCQl0X3ByZWRpY3RlZF9jdiwgdF9wcmVkaWN0ZWQgPSAwOwogCXM2NCBkZWx0YV9tczsKIAorCWlmICghY2hpcC0+c29jX3JlcG9ydGluZ19yZWFkeSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCiAJaWYgKGNoaXAtPmJwLmZsb2F0X3ZvbHRfdXYgPD0gMCkgewogCQlwcl9lcnIoImJhdHRlcnkgcHJvZmlsZSBpcyBub3QgbG9hZGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9EQVRBOwpAQCAtMzEzNyw2ICszMjIyLDkgQEAKIHsKIAlpbnQgcmMgPSAwLCBtc29jOwogCisJaWYgKCFjaGlwLT5kdC5saW5lYXJpemVfc29jKQorCQlyZXR1cm4gMDsKKwogCW11dGV4X2xvY2soJmNoaXAtPmNoYXJnZV9mdWxsX2xvY2spOwogCWlmIChjaGlwLT5kZWx0YV9zb2MgPD0gMCkKIAkJZ290byBvdXQ7CkBAIC0zMjEzLDIwICszMzAxLDIxIEBACiAJaW50IHJjOwogCWludCBlc3JfdW9obXM7CiAKKwltdXRleF9sb2NrKCZjaGlwLT5xbm92b19lc3JfY3RybF9sb2NrKTsKIAkvKiBmb3JjZSBlc3IgZXh0cmFjdGlvbiBlbmFibGUgKi8KIAlyYyA9IGZnX3NyYW1fbWFza2VkX3dyaXRlKGNoaXAsIEVTUl9FWFRSQUNUSU9OX0VOQUJMRV9XT1JELAogCQkJRVNSX0VYVFJBQ1RJT05fRU5BQkxFX09GRlNFVCwgQklUKDApLCBCSVQoMCksCiAJCQlGR19JTUFfREVGQVVMVCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoImZhaWxlZCB0byBlbmFibGUgZXNyIGV4dG4gcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAl9CiAKIAlyYyA9IGZnX21hc2tlZF93cml0ZShjaGlwLCBCQVRUX0lORk9fUU5PVk9fQ0ZHKGNoaXApLAogCQkJTERfUkVHX0NUUkxfQklULCAwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRXJyb3IgaW4gY29uZmlndXJpbmcgcW5vdm9fY2ZnIHJjPSVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAJfQogCiAJcmMgPSBmZ19tYXNrZWRfd3JpdGUoY2hpcCwgQkFUVF9JTkZPX1RNX01JU0MxKGNoaXApLApAQCAtMzIzNCwyNCArMzMyMywzNiBAQAogCQkJRVNSX1JFUV9DVExfQklUIHwgRVNSX1JFUV9DVExfRU5fQklUKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRXJyb3IgaW4gY29uZmlndXJpbmcgZm9yY2UgRVNSIHJjPSVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBSZWxlYXNlIGFuZCBncmFiIHRoZSBsb2NrIGFnYWluIGFmdGVyIDEuNSBzZWNvbmRzIHNvIHRoYXQgcHJlcGFyZQorCSAqIGNhbGxiYWNrIGNhbiBzdWNjZWVkIGlmIHRoZSByZXF1ZXN0IGNvbWVzIGluIGJldHdlZW4uCisJICovCisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5xbm92b19lc3JfY3RybF9sb2NrKTsKKwogCS8qIHdhaXQgMS41IHNlY29uZHMgZm9yIGh3IHRvIG1lYXN1cmUgRVNSICovCiAJbXNsZWVwKDE1MDApOworCisJbXV0ZXhfbG9jaygmY2hpcC0+cW5vdm9fZXNyX2N0cmxfbG9jayk7CiAJcmMgPSBmZ19tYXNrZWRfd3JpdGUoY2hpcCwgQkFUVF9JTkZPX1RNX01JU0MxKGNoaXApLAogCQkJRVNSX1JFUV9DVExfQklUIHwgRVNSX1JFUV9DVExfRU5fQklULAogCQkJMCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkVycm9yIGluIHJlc3RvcmluZyBmb3JjZSBFU1IgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBJZiBxbm92byBpcyBkaXNhYmxlZCwgdGhlbiBsZWF2ZSBFU1IgZXh0cmFjdGlvbiBlbmFibGVkICovCisJaWYgKCFjaGlwLT5xbm92b19lbmFibGUpCisJCWdvdG8gZG9uZTsKKwogCXJjID0gZmdfbWFza2VkX3dyaXRlKGNoaXAsIEJBVFRfSU5GT19RTk9WT19DRkcoY2hpcCksCiAJCQlMRF9SRUdfQ1RSTF9CSVQsIExEX1JFR19DVFJMX0JJVCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkVycm9yIGluIHJlc3RvcmluZyBxbm92b19jZmcgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBmb3JjZSBlc3IgZXh0cmFjdGlvbiBkaXNhYmxlICovCkBAIC0zMjYwLDM2ICszMzYxLDQ2IEBACiAJCQlGR19JTUFfREVGQVVMVCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoImZhaWxlZCB0byBkaXNhYmxlIGVzciBleHRuIHJjPSVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAJfQogCitkb25lOgogCWZnX2dldF9iYXR0ZXJ5X3Jlc2lzdGFuY2UoY2hpcCwgJmVzcl91b2htcyk7CiAJZmdfZGJnKGNoaXAsIEZHX1NUQVRVUywgIkVTUiB1b2htcyA9ICVkXG4iLCBlc3JfdW9obXMpOwotCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5xbm92b19lc3JfY3RybF9sb2NrKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgZmdfcHJlcGFyZV9mb3JfcW5vdm8oc3RydWN0IGZnX2NoaXAgKmNoaXAsIGludCBxbm92b19lbmFibGUpCiB7Ci0JaW50IHJjOworCWludCByYyA9IDA7CiAKKwltdXRleF9sb2NrKCZjaGlwLT5xbm92b19lc3JfY3RybF9sb2NrKTsKIAkvKiBmb3JjZSBlc3IgZXh0cmFjdGlvbiBkaXNhYmxlIHdoZW4gcW5vdm8gZW5hYmxlcyAqLwogCXJjID0gZmdfc3JhbV9tYXNrZWRfd3JpdGUoY2hpcCwgRVNSX0VYVFJBQ1RJT05fRU5BQkxFX1dPUkQsCiAJCQlFU1JfRVhUUkFDVElPTl9FTkFCTEVfT0ZGU0VULAogCQkJQklUKDApLCBxbm92b19lbmFibGUgPyAwIDogQklUKDApLAogCQkJRkdfSU1BX0RFRkFVTFQpOwotCWlmIChyYyA8IDApCisJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkVycm9yIGluIGNvbmZpZ3VyaW5nIGVzciBleHRyYWN0aW9uIHJjPSVkXG4iLCByYyk7CisJCWdvdG8gb3V0OworCX0KIAogCXJjID0gZmdfbWFza2VkX3dyaXRlKGNoaXAsIEJBVFRfSU5GT19RTk9WT19DRkcoY2hpcCksCiAJCQlMRF9SRUdfQ1RSTF9CSVQsCiAJCQlxbm92b19lbmFibGUgPyBMRF9SRUdfQ1RSTF9CSVQgOiAwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRXJyb3IgaW4gY29uZmlndXJpbmcgcW5vdm9fY2ZnIHJjPSVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAJfQotCWZnX2RiZyhjaGlwLCBGR19TVEFUVVMsICJQcmVwYXJlZCBmb3IgUW5vdm9cbiIpOwotCXJldHVybiAwOworCisJZmdfZGJnKGNoaXAsIEZHX1NUQVRVUywgIiVzIGZvciBRbm92b1xuIiwKKwkJcW5vdm9fZW5hYmxlID8gIlByZXBhcmVkIiA6ICJVbnByZXBhcmVkIik7CisJY2hpcC0+cW5vdm9fZW5hYmxlID0gcW5vdm9fZW5hYmxlOworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+cW5vdm9fZXNyX2N0cmxfbG9jayk7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCB0dGZfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0zMzY1LDYgKzM0NzYsOSBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CiAJCXJjID0gZmdfZ2V0X3Byb3BfY2FwYWNpdHkoY2hpcCwgJnB2YWwtPmludHZhbCk7CiAJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfUkFXOgorCQlyYyA9IGZnX2dldF9tc29jX3JhdyhjaGlwLCAmcHZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKIAkJaWYgKGNoaXAtPmJhdHRlcnlfbWlzc2luZykKIAkJCXB2YWwtPmludHZhbCA9IDM3MDAwMDA7CkBAIC0zMzc3LDYgKzM0OTEsMzQgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CiAJCXJjID0gZmdfZ2V0X2JhdHRlcnlfdGVtcChjaGlwLCAmcHZhbC0+aW50dmFsKTsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT0xEX1RFTVA6CisJCXJjID0gZmdfZ2V0X2plaXRhX3RocmVzaG9sZChjaGlwLCBKRUlUQV9DT0xELCAmcHZhbC0+aW50dmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJFcnJvciBpbiByZWFkaW5nIGplaXRhX2NvbGQsIHJjPSVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT09MX1RFTVA6CisJCXJjID0gZmdfZ2V0X2plaXRhX3RocmVzaG9sZChjaGlwLCBKRUlUQV9DT09MLCAmcHZhbC0+aW50dmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJFcnJvciBpbiByZWFkaW5nIGplaXRhX2Nvb2wsIHJjPSVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9XQVJNX1RFTVA6CisJCXJjID0gZmdfZ2V0X2plaXRhX3RocmVzaG9sZChjaGlwLCBKRUlUQV9XQVJNLCAmcHZhbC0+aW50dmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJFcnJvciBpbiByZWFkaW5nIGplaXRhX3dhcm0sIHJjPSVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IT1RfVEVNUDoKKwkJcmMgPSBmZ19nZXRfamVpdGFfdGhyZXNob2xkKGNoaXAsIEpFSVRBX0hPVCwgJnB2YWwtPmludHZhbCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiRXJyb3IgaW4gcmVhZGluZyBqZWl0YV9ob3QsIHJjPSVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9SRVNJU1RBTkNFOgogCQlyYyA9IGZnX2dldF9iYXR0ZXJ5X3Jlc2lzdGFuY2UoY2hpcCwgJnB2YWwtPmludHZhbCk7CiAJCWJyZWFrOwpAQCAtMzUwMCw2ICszNjQyLDQ4IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQlpZiAoY2hpcC0+Y2wuYWN0aXZlKSB7CisJCQlwcl93YXJuKCJDYXBhY2l0eSBsZWFybmluZyBhY3RpdmUhXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChwdmFsLT5pbnR2YWwgPD0gMCB8fCBwdmFsLT5pbnR2YWwgPiBjaGlwLT5jbC5ub21fY2FwX3VhaCkgeworCQkJcHJfZXJyKCJjaGFyZ2VfZnVsbCBpcyBvdXQgb2YgYm91bmRzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNoaXAtPmNsLmxlYXJuZWRfY2NfdWFoID0gcHZhbC0+aW50dmFsOworCQlyYyA9IGZnX3NhdmVfbGVhcm5lZF9jYXBfdG9fc3JhbShjaGlwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXByX2VycigiRXJyb3IgaW4gc2F2aW5nIGxlYXJuZWRfY2NfdWFoLCByYz0lZFxuIiwgcmMpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTERfVEVNUDoKKwkJcmMgPSBmZ19zZXRfamVpdGFfdGhyZXNob2xkKGNoaXAsIEpFSVRBX0NPTEQsIHB2YWwtPmludHZhbCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByX2VycigiRXJyb3IgaW4gd3JpdGluZyBqZWl0YV9jb2xkLCByYz0lZFxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09PTF9URU1QOgorCQlyYyA9IGZnX3NldF9qZWl0YV90aHJlc2hvbGQoY2hpcCwgSkVJVEFfQ09PTCwgcHZhbC0+aW50dmFsKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJFcnJvciBpbiB3cml0aW5nIGplaXRhX2Nvb2wsIHJjPSVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9XQVJNX1RFTVA6CisJCXJjID0gZmdfc2V0X2plaXRhX3RocmVzaG9sZChjaGlwLCBKRUlUQV9XQVJNLCBwdmFsLT5pbnR2YWwpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIkVycm9yIGluIHdyaXRpbmcgamVpdGFfd2FybSwgcmM9JWRcbiIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hPVF9URU1QOgorCQlyYyA9IGZnX3NldF9qZWl0YV90aHJlc2hvbGQoY2hpcCwgSkVJVEFfSE9ULCBwdmFsLT5pbnR2YWwpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIkVycm9yIGluIHdyaXRpbmcgamVpdGFfaG90LCByYz0lZFxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTM1MTUsNiArMzY5OSwxMSBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQ19TVEVQOgogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0NfU1RFUF9TRUw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTERfVEVNUDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPT0xfVEVNUDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1dBUk1fVEVNUDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hPVF9URU1QOgogCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTM1NDEsNiArMzczMCw3IEBACiAJCXJldHVybiBOT1RJRllfT0s7CiAKIAlpZiAoKHN0cmNtcChwc3ktPmRlc2MtPm5hbWUsICJiYXR0ZXJ5IikgPT0gMCkKKwkJfHwgKHN0cmNtcChwc3ktPmRlc2MtPm5hbWUsICJwYXJhbGxlbCIpID09IDApCiAJCXx8IChzdHJjbXAocHN5LT5kZXNjLT5uYW1lLCAidXNiIikgPT0gMCkpIHsKIAkJLyoKIAkJICogV2UgY2Fubm90IHZvdGUgZm9yIGF3YWtlIHZvdGFibGUgaGVyZSBhcyB0aGF0IHRha2VzCkBAIC0zNTU1LDcgKzM3NDUsMTIgQEAKIAogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGZnX3BzeV9wcm9wc1tdID0gewogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX1JBVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTERfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DT09MX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfV0FSTV9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hPVF9URU1QLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLApAQCAtMzczNCwyOSArMzkyOSwyOSBAQAogCQl9CiAJfQogCi0JZ2V0X3RlbXBfc2V0cG9pbnQoY2hpcC0+ZHQuamVpdGFfdGhyZXNob2xkc1tKRUlUQV9DT0xEXSwgJnZhbCk7Ci0JcmMgPSBmZ193cml0ZShjaGlwLCBCQVRUX0lORk9fSkVJVEFfVE9PX0NPTEQoY2hpcCksICZ2YWwsIDEpOworCXJjID0gZmdfc2V0X2plaXRhX3RocmVzaG9sZChjaGlwLCBKRUlUQV9DT0xELAorCQljaGlwLT5kdC5qZWl0YV90aHJlc2hvbGRzW0pFSVRBX0NPTERdICogMTApOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJFcnJvciBpbiB3cml0aW5nIGplaXRhX2NvbGQsIHJjPSVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKLQlnZXRfdGVtcF9zZXRwb2ludChjaGlwLT5kdC5qZWl0YV90aHJlc2hvbGRzW0pFSVRBX0NPT0xdLCAmdmFsKTsKLQlyYyA9IGZnX3dyaXRlKGNoaXAsIEJBVFRfSU5GT19KRUlUQV9DT0xEKGNoaXApLCAmdmFsLCAxKTsKKwlyYyA9IGZnX3NldF9qZWl0YV90aHJlc2hvbGQoY2hpcCwgSkVJVEFfQ09PTCwKKwkJY2hpcC0+ZHQuamVpdGFfdGhyZXNob2xkc1tKRUlUQV9DT09MXSAqIDEwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRXJyb3IgaW4gd3JpdGluZyBqZWl0YV9jb29sLCByYz0lZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JZ2V0X3RlbXBfc2V0cG9pbnQoY2hpcC0+ZHQuamVpdGFfdGhyZXNob2xkc1tKRUlUQV9XQVJNXSwgJnZhbCk7Ci0JcmMgPSBmZ193cml0ZShjaGlwLCBCQVRUX0lORk9fSkVJVEFfSE9UKGNoaXApLCAmdmFsLCAxKTsKKwlyYyA9IGZnX3NldF9qZWl0YV90aHJlc2hvbGQoY2hpcCwgSkVJVEFfV0FSTSwKKwkJY2hpcC0+ZHQuamVpdGFfdGhyZXNob2xkc1tKRUlUQV9XQVJNXSAqIDEwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiRXJyb3IgaW4gd3JpdGluZyBqZWl0YV93YXJtLCByYz0lZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JZ2V0X3RlbXBfc2V0cG9pbnQoY2hpcC0+ZHQuamVpdGFfdGhyZXNob2xkc1tKRUlUQV9IT1RdLCAmdmFsKTsKLQlyYyA9IGZnX3dyaXRlKGNoaXAsIEJBVFRfSU5GT19KRUlUQV9UT09fSE9UKGNoaXApLCAmdmFsLCAxKTsKKwlyYyA9IGZnX3NldF9qZWl0YV90aHJlc2hvbGQoY2hpcCwgSkVJVEFfSE9ULAorCQljaGlwLT5kdC5qZWl0YV90aHJlc2hvbGRzW0pFSVRBX0hPVF0gKiAxMCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkVycm9yIGluIHdyaXRpbmcgamVpdGFfaG90LCByYz0lZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CkBAIC0zOTIyLDggKzQxMTcsNyBAQAogCX0KIAogCWZnX2RiZyhjaGlwLCBGR19JUlEsICJpcnEgJWQgdHJpZ2dlcmVkLCBzdGF0dXM6JWRcbiIsIGlycSwgc3RhdHVzKTsKLQlpZiAoc3RhdHVzICYgTUVNX0dOVF9CSVQpCi0JCWNvbXBsZXRlX2FsbCgmY2hpcC0+bWVtX2dyYW50KTsKKwljb21wbGV0ZV9hbGwoJmNoaXAtPm1lbV9ncmFudCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00MzMzLDcgKzQ1MjcsMTEgQEAKIHN0YXRpYyBpbnQgZmdfcGFyc2Vfa2lfY29lZmZpY2llbnRzKHN0cnVjdCBmZ19jaGlwICpjaGlwKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGNoaXAtPmRldi0+b2Zfbm9kZTsKLQlpbnQgcmMsIGk7CisJaW50IHJjLCBpLCB0ZW1wOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxraS1jb2VmZi1mdWxsLWRpc2NoZyIsICZ0ZW1wKTsKKwlpZiAoIXJjKQorCQljaGlwLT5kdC5raV9jb2VmZl9mdWxsX3NvY19kaXNjaGcgPSB0ZW1wOwogCiAJcmMgPSBmZ19wYXJzZV9kdF9wcm9wZXJ0eV91MzJfYXJyYXkobm9kZSwgInFjb20sa2ktY29lZmYtc29jLWRpc2NoZyIsCiAJCWNoaXAtPmR0LmtpX2NvZWZmX3NvYywgS0lfQ09FRkZfU09DX0xFVkVMUyk7CkBAIC00NjgwLDYgKzQ4NzgsOSBAQAogCWNoaXAtPmR0LmhvbGRfc29jX3doaWxlX2Z1bGwgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwKIAkJCQkJInFjb20saG9sZC1zb2Mtd2hpbGUtZnVsbCIpOwogCisJY2hpcC0+ZHQubGluZWFyaXplX3NvYyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLAorCQkJCQkicWNvbSxsaW5lYXJpemUtc29jIik7CisKIAlyYyA9IGZnX3BhcnNlX2tpX2NvZWZmaWNpZW50cyhjaGlwKTsKIAlpZiAocmMgPCAwKQogCQlwcl9lcnIoIkVycm9yIGluIHBhcnNpbmcgS2kgY29lZmZpY2llbnRzLCByYz0lZFxuIiwgcmMpOwpAQCAtNDc2MSw2ICs0OTYyLDEzIEBACiAKIHN0YXRpYyB2b2lkIGZnX2NsZWFudXAoc3RydWN0IGZnX2NoaXAgKmNoaXApCiB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkdfSVJRX01BWDsgaSsrKSB7CisJCWlmIChmZ19pcnFzW2ldLmlycSkKKwkJCWRldm1fZnJlZV9pcnEoY2hpcC0+ZGV2LCBmZ19pcnFzW2ldLmlycSwgY2hpcCk7CisJfQorCiAJcG93ZXJfc3VwcGx5X3VucmVnX25vdGlmaWVyKCZjaGlwLT5uYik7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGNoaXAtPmRmc19yb290KTsKIAlpZiAoY2hpcC0+YXdha2Vfdm90YWJsZSkKQEAgLTQ3OTIsNyArNTAwMCw2IEBACiAJY2hpcC0+ZGVidWdfbWFzayA9ICZmZ19nZW4zX2RlYnVnX21hc2s7CiAJY2hpcC0+aXJxcyA9IGZnX2lycXM7CiAJY2hpcC0+Y2hhcmdlX3N0YXR1cyA9IC1FSU5WQUw7Ci0JY2hpcC0+cHJldl9jaGFyZ2Vfc3RhdHVzID0gLUVJTlZBTDsKIAljaGlwLT5raV9jb2VmZl9mdWxsX3NvYyA9IC1FSU5WQUw7CiAJY2hpcC0+b25saW5lX3N0YXR1cyA9IC1FSU5WQUw7CiAJY2hpcC0+cmVnbWFwID0gZGV2X2dldF9yZWdtYXAoY2hpcC0+ZGV2LT5wYXJlbnQsIE5VTEwpOwpAQCAtNDg2NSw2ICs1MDcyLDcgQEAKIAltdXRleF9pbml0KCZjaGlwLT5jbC5sb2NrKTsKIAltdXRleF9pbml0KCZjaGlwLT50dGYubG9jayk7CiAJbXV0ZXhfaW5pdCgmY2hpcC0+Y2hhcmdlX2Z1bGxfbG9jayk7CisJbXV0ZXhfaW5pdCgmY2hpcC0+cW5vdm9fZXNyX2N0cmxfbG9jayk7CiAJaW5pdF9jb21wbGV0aW9uKCZjaGlwLT5zb2NfdXBkYXRlKTsKIAlpbml0X2NvbXBsZXRpb24oJmNoaXAtPnNvY19yZWFkeSk7CiAJaW5pdF9jb21wbGV0aW9uKCZjaGlwLT5tZW1fZ3JhbnQpOwpAQCAtNTAwMiw2ICs1MjEwLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGZnX2dlbjNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZmdfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgcmMsIGJzb2M7CisKKwlpZiAoY2hpcC0+Y2hhcmdlX2Z1bGwpIHsKKwkJcmMgPSBmZ19nZXRfc3JhbV9wcm9wKGNoaXAsIEZHX1NSQU1fQkFUVF9TT0MsICZic29jKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJfZXJyKCJFcnJvciBpbiBnZXR0aW5nIEJBVFRfU09DLCByYz0lZFxuIiwgcmMpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogV2UgbmVlZCAyIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgaGVyZSAqLworCQlic29jID0gKHUzMilic29jID4+IDE2OworCisJCXJjID0gZmdfY29uZmlndXJlX2Z1bGxfc29jKGNoaXAsIGJzb2MpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcl9lcnIoIkVycm9yIGluIGNvbmZpZ3VyaW5nIGZ1bGxfc29jLCByYz0lZFxuIiwgcmMpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmZ19nZW4zX21hdGNoX3RhYmxlW10gPSB7CiAJey5jb21wYXRpYmxlID0gRkdfR0VOM19ERVZfTkFNRX0sCiAJe30sCkBAIC01MDE2LDYgKzUyNDcsNyBAQAogCX0sCiAJLnByb2JlCQk9IGZnX2dlbjNfcHJvYmUsCiAJLnJlbW92ZQkJPSBmZ19nZW4zX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBmZ19nZW4zX3NodXRkb3duLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZmdfZ2VuM19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtcW5vdm8uYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1xbm92by5jCmluZGV4IGIyMDgwNzkuLjUzYWYzNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1xbm92by5jCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1xbm92by5jCkBAIC0xMTIsNiArMTEyLDcgQEAKICNkZWZpbmUgR0FJTl9MU0JfRkFDVE9SCTk3NjU2MAogCiAjZGVmaW5lIFVTRVJfVk9URVIJCSJ1c2VyX3ZvdGVyIgorI2RlZmluZSBTSFVURE9XTl9WT1RFUgkJInVzZXJfdm90ZXIiCiAjZGVmaW5lIE9LX1RPX1FOT1ZPX1ZPVEVSCSJva190b19xbm92b192b3RlciIKIAogI2RlZmluZSBRTk9WT19WT1RFUgkJInFub3ZvX3ZvdGVyIgpAQCAtMTMwLDYgKzEzMSw3IEBACiBzdHJ1Y3QgcW5vdm9fZHRfcHJvcHMgewogCWJvb2wJCQlleHRlcm5hbF9yc2Vuc2U7CiAJc3RydWN0IGRldmljZV9ub2RlCSpyZXZpZF9kZXZfbm9kZTsKKwlib29sCQkJZW5hYmxlX2Zvcl9kYzsKIH07CiAKIHN0cnVjdCBxbm92byB7CkBAIC00NDIsNiArNDQ0LDggQEAKIAkJcHJfZXJyKCJNaXNzaW5nIHFjb20scG1pYy1yZXZpZCBwcm9wZXJ0eSAtIGRyaXZlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJY2hpcC0+ZHQuZW5hYmxlX2Zvcl9kYyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLAorCQkJCQkicWNvbSxlbmFibGUtZm9yLWRjIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzMTAsNiArMTMxNCwxMCBAQAogCWlmICh1c2JfcHJlc2VudCkKIAkJZGNfcHJlc2VudCA9IDA7CiAKKwkvKiBkaXNhYmxlIHFub3ZvIGZvciBkYyBwYXRoIGJ5IGZvcmNpbmcgZGNfcHJlc2VudCA9IDAgYWx3YXlzICovCisJaWYgKCFjaGlwLT5kdC5lbmFibGVfZm9yX2RjKQorCQlkY19wcmVzZW50ID0gMDsKKwogCWlmIChjaGlwLT5kY19wcmVzZW50ICYmICFkY19wcmVzZW50KSB7CiAJCS8qIHJlbW92YWwgKi8KIAkJY2hpcC0+ZGNfcHJlc2VudCA9IDA7CkBAIC0xMzMzLDYgKzEzNDEsMjYgQEAKIAkJCQlzdHJ1Y3QgcW5vdm8sIHB0cmFpbl9yZXN0YXJ0X3dvcmsud29yayk7CiAJdTggcHRfdDEsIHB0X3QyOwogCWludCByYzsKKwl1OCBwdF9lbjsKKworCXJjID0gcW5vdm9fcmVhZChjaGlwLCBRTk9WT19QVFJBSU5fRU4sICZwdF9lbiwgMSk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNvdWxkbid0IHJlYWQgUU5PVk9fUFRSQUlOX0VOIHJjID0gJWRcbiIsCisJCQkJcmMpOworCQlnb3RvIGNsZWFuX3VwOworCX0KKworCWlmICghcHRfZW4pIHsKKwkJcmMgPSBxbm92b19tYXNrZWRfd3JpdGUoY2hpcCwgUU5PVk9fUFRSQUlOX0VOLAorCQkJCVFOT1ZPX1BUUkFJTl9FTl9CSVQsIFFOT1ZPX1BUUkFJTl9FTl9CSVQpOworCQlpZiAocmMgPCAwKSB7CisJCQlkZXZfZXJyKGNoaXAtPmRldiwgIkNvdWxkbid0IGVuYWJsZSBwdWxzZSB0cmFpbiByYz0lZFxuIiwKKwkJCQkJcmMpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQkvKiBzbGVlcCAyMG1zIGZvciB0aGUgcHVsc2UgdHJhaW5zIHRvIHJlc3RhcnQgYW5kIHNldHRsZSAqLworCQltc2xlZXAoMjApOworCX0KIAogCXJjID0gcW5vdm9fcmVhZChjaGlwLCBRTk9WT19QVFRJTUVfU1RTLCAmcHRfdDEsIDEpOwogCWlmIChyYyA8IDApIHsKQEAgLTEzOTUsMTYgKzE0MjMsNyBAQAogCXN0cnVjdCBxbm92byAqY2hpcCA9IGRhdGE7CiAJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgcHZhbCA9IHswfTsKIAotCS8qCi0JICogSW4gc29tZSBjYXNlcyAoZXNwIHNodXR0aW5nIGRvd24pIHRoZSB1c2Vyc3BhY2Ugd291bGQgIGRpc2FibGUgYnkKLQkgKiBzZXR0aW5nIHFub3ZvX2VuYWJsZT0wLiBBbHNvIGNoYXJnZXIgY291bGQgYmUgcmVtb3ZlZCBvciB0aGVyZSBpcwotCSAqIGFuIGVycm9yIChpLmUuIGl0cyBub3Qgb2theSB0byBydW4gcW5vdm8pLQotCSAqIHNraXAgdGFraW5nIEVTUiBtZWFzdXJlbWVudCBpbiBzdWNoIHNpdHVhdGlvbnMKLQkgKi8KLQotCWlmIChnZXRfY2xpZW50X3ZvdGUoY2hpcC0+ZGlzYWJsZV92b3RhYmxlLCBVU0VSX1ZPVEVSKQotCQl8fCBnZXRfZWZmZWN0aXZlX3Jlc3VsdChjaGlwLT5ub3Rfb2tfdG9fcW5vdm9fdm90YWJsZSkgPiAwKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJcW5vdm9fdXBkYXRlX3N0YXR1cyhjaGlwKTsKIAogCS8qCiAJICogaHcgcmVzZXRzIHB0X2VuIGJpdCBvbmNlIHB0cmFpbl9kb25lIHRyaWdnZXJzLgpAQCAtMTQxNSwxMyArMTQzNCwxNCBAQAogCXZvdGUoY2hpcC0+cHRfZGlzX3ZvdGFibGUsIFFOSV9QVF9WT1RFUiwgdHJ1ZSwgMCk7CiAKIAl2b3RlKGNoaXAtPnB0X2Rpc192b3RhYmxlLCBFU1JfVk9URVIsIHRydWUsIDApOwotCWlmIChpc19mZ19hdmFpbGFibGUoY2hpcCkpCisJaWYgKGlzX2ZnX2F2YWlsYWJsZShjaGlwKQorCQkmJiAhZ2V0X2NsaWVudF92b3RlKGNoaXAtPmRpc2FibGVfdm90YWJsZSwgVVNFUl9WT1RFUikKKwkJJiYgIWdldF9lZmZlY3RpdmVfcmVzdWx0KGNoaXAtPm5vdF9va190b19xbm92b192b3RhYmxlKSkKIAkJcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShjaGlwLT5ibXNfcHN5LAogCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1JFU0lTVEFOQ0UsCiAJCQkJJnB2YWwpOwogCiAJdm90ZShjaGlwLT5wdF9kaXNfdm90YWJsZSwgRVNSX1ZPVEVSLCBmYWxzZSwgMCk7Ci0JcW5vdm9fdXBkYXRlX3N0YXR1cyhjaGlwKTsKIAlrb2JqZWN0X3VldmVudCgmY2hpcC0+ZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTQzNCw2ICsxNDU0LDkgQEAKIAl1OCB2YWRjX29mZnNldCwgdmFkY19nYWluOwogCXU4IHZhbDsKIAorCXZvdGUoY2hpcC0+Y2hnX3JlYWR5X3ZvdGFibGUsIFVTQl9SRUFEWV9WT1RFUiwgZmFsc2UsIDApOworCXZvdGUoY2hpcC0+Y2hnX3JlYWR5X3ZvdGFibGUsIERDX1JFQURZX1ZPVEVSLCBmYWxzZSwgMCk7CisKIAl2b3RlKGNoaXAtPmRpc2FibGVfdm90YWJsZSwgVVNFUl9WT1RFUiwgdHJ1ZSwgMCk7CiAJdm90ZShjaGlwLT5kaXNhYmxlX3ZvdGFibGUsIEZHX0FWQUlMQUJMRV9WT1RFUiwgdHJ1ZSwgMCk7CiAKQEAgLTE3MDYsNiArMTcyOSwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBxbm92b19zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBxbm92byAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJdm90ZShjaGlwLT5ub3Rfb2tfdG9fcW5vdm9fdm90YWJsZSwgU0hVVERPV05fVk9URVIsIHRydWUsIDApOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXRjaF90YWJsZVtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxxcG5wLXFub3ZvIiwgfSwKIAl7IH0sCkBAIC0xNzE5LDYgKzE3NDksNyBAQAogCX0sCiAJLnByb2JlCQk9IHFub3ZvX3Byb2JlLAogCS5yZW1vdmUJCT0gcW5vdm9fcmVtb3ZlLAorCS5zaHV0ZG93bgk9IHFub3ZvX3NodXRkb3duLAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocW5vdm9fZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9xcG5wLXNtYjIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vcXBucC1zbWIyLmMKaW5kZXggNjBmNWQyMy4uMzQ1MTRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9xcG5wLXNtYjIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3FwbnAtc21iMi5jCkBAIC0xODgsNiArMTg4LDExIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoCiAJd2Vha19jaGdfaWNsX3VhLCBfX3dlYWtfY2hnX2ljbF91YSwgaW50LCAwNjAwKTsKIAorc3RhdGljIGludCBfX3RyeV9zaW5rX2VuYWJsZWQgPSAxOworbW9kdWxlX3BhcmFtX25hbWVkKAorCXRyeV9zaW5rX2VuYWJsZWQsIF9fdHJ5X3NpbmtfZW5hYmxlZCwgaW50LCAwNjAwCispOworCiAjZGVmaW5lIE1JQ1JPXzFQNUEJCTE1MDAwMDAKICNkZWZpbmUgTUlDUk9fUDFBCQkxMDAwMDAKICNkZWZpbmUgT1RHX0RFRkFVTFRfREVHTElUQ0hfVElNRV9NUwk1MApAQCAtMzMwLDcgKzMzNSw2IEBACiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc21iMl91c2JfcHJvcHNbXSA9IHsKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTiwKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9QRF9DVVJSRU5UX01BWCwKQEAgLTM0OSw2ICszNTMsOSBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0hXX0NVUlJFTlRfTUFYLAogCVBPV0VSX1NVUFBMWV9QUk9QX1JFQUxfVFlQRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUl9TV0FQLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUlOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NEUF9DVVJSRU5UX01BWCwKIH07CiAKIHN0YXRpYyBpbnQgc21iMl91c2JfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LApAQCAtMzgwLDIwICszODcsMTcgQEAKIAkJaWYgKGNoZy0+cmVhbF9jaGFyZ2VyX3R5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVU5LTk9XTikKIAkJCXZhbC0+aW50dmFsID0gMDsKIAkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKLQkJdmFsLT5pbnR2YWwgPSBjaGctPnZvbHRhZ2VfbWluX3V2OwotCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgotCQl2YWwtPmludHZhbCA9IGNoZy0+dm9sdGFnZV9tYXhfdXY7CisJCXJjID0gc21ibGliX2dldF9wcm9wX3VzYl92b2x0YWdlX21heChjaGcsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CiAJCXJjID0gc21ibGliX2dldF9wcm9wX3VzYl92b2x0YWdlX25vdyhjaGcsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUERfQ1VSUkVOVF9NQVg6Ci0JCXJjID0gc21ibGliX2dldF9wcm9wX3BkX2N1cnJlbnRfbWF4KGNoZywgdmFsKTsKKwkJdmFsLT5pbnR2YWwgPSBnZXRfY2xpZW50X3ZvdGUoY2hnLT51c2JfaWNsX3ZvdGFibGUsIFBEX1ZPVEVSKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWDoKLQkJcmMgPSBzbWJsaWJfZ2V0X3Byb3BfdXNiX2N1cnJlbnRfbWF4KGNoZywgdmFsKTsKKwkJcmMgPSBzbWJsaWJfZ2V0X3Byb3BfaW5wdXRfY3VycmVudF9zZXR0bGVkKGNoZywgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9UWVBFOgogCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9QRDsKQEAgLTQ1Nyw2ICs0NjEsMTYgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSX1NXQVA6CiAJCXJjID0gc21ibGliX2dldF9wcm9wX3ByX3N3YXBfaW5fcHJvZ3Jlc3MoY2hnLCB2YWwpOwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUFYOgorCQl2YWwtPmludHZhbCA9IGNoZy0+dm9sdGFnZV9tYXhfdXY7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUERfVk9MVEFHRV9NSU46CisJCXZhbC0+aW50dmFsID0gY2hnLT52b2x0YWdlX21pbl91djsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TRFBfQ1VSUkVOVF9NQVg6CisJCXZhbC0+aW50dmFsID0gZ2V0X2NsaWVudF92b3RlKGNoZy0+dXNiX2ljbF92b3RhYmxlLAorCQkJCQkgICAgICBVU0JfUFNZX1ZPVEVSKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJnZXQgcHJvcCAlZCBpcyBub3Qgc3VwcG9ydGVkIGluIHVzYlxuIiwgcHNwKTsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNDg0LDE4ICs0OTgsOSBAQAogCX0KIAogCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKLQkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWluKGNoZywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKLQkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWF4KGNoZywgdmFsKTsKLQkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QRF9DVVJSRU5UX01BWDoKIAkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfcGRfY3VycmVudF9tYXgoY2hnLCB2YWwpOwogCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOgotCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF91c2JfY3VycmVudF9tYXgoY2hnLCB2YWwpOwotCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RZUEVDX1BPV0VSX1JPTEU6CiAJCXJjID0gc21ibGliX3NldF9wcm9wX3R5cGVjX3Bvd2VyX3JvbGUoY2hnLCB2YWwpOwogCQlicmVhazsKQEAgLTUxOCw2ICs1MjMsMTUgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSX1NXQVA6CiAJCXJjID0gc21ibGliX3NldF9wcm9wX3ByX3N3YXBfaW5fcHJvZ3Jlc3MoY2hnLCB2YWwpOwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUFYOgorCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF9wZF92b2x0YWdlX21heChjaGcsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUERfVk9MVEFHRV9NSU46CisJCXJjID0gc21ibGliX3NldF9wcm9wX3BkX3ZvbHRhZ2VfbWluKGNoZywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TRFBfQ1VSUkVOVF9NQVg6CisJCXJjID0gc21ibGliX3NldF9wcm9wX3NkcF9jdXJyZW50X21heChjaGcsIHZhbCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2Vycigic2V0IHByb3AgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgcHNwKTsKIAkJcmMgPSAtRUlOVkFMOwpAQCAtNTMzLDggKzU0Nyw2IEBACiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKIHsKIAlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg6Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9UWVBFQ19QT1dFUl9ST0xFOgogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1RNX0NVUlJFTlRfTUFYOgogCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgpAQCAtNTc2LDYgKzU4OCw4IEBACiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc21iMl91c2JfcG9ydF9wcm9wc1tdID0gewogCVBPV0VSX1NVUFBMWV9QUk9QX1RZUEUsCiAJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYLAogfTsKIAogc3RhdGljIGludCBzbWIyX3VzYl9wb3J0X2dldF9wcm9wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKQEAgLTYwMiw2ICs2MTYsMTIgQEAKIAkJZWxzZQogCQkJdmFsLT5pbnR2YWwgPSAwOwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgorCQl2YWwtPmludHZhbCA9IDUwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg6CisJCXJjID0gc21ibGliX2dldF9wcm9wX2lucHV0X2N1cnJlbnRfc2V0dGxlZChjaGcsIHZhbCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2Vycl9yYXRlbGltaXRlZCgiR2V0IHByb3AgJWQgaXMgbm90IHN1cHBvcnRlZCBpbiBwY19wb3J0XG4iLAogCQkJCXBzcCk7CkBAIC03ODAsOSArODAwLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHNtYjJfZGNfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9TVVNQRU5ELAogCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCiAJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1JFQUxfVFlQRSwKIH07CiAKIHN0YXRpYyBpbnQgc21iMl9kY19nZXRfcHJvcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCkBAIC03OTQsNiArODE2LDkgQEAKIAlpbnQgcmMgPSAwOwogCiAJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1NVU1BFTkQ6CisJCXZhbC0+aW50dmFsID0gZ2V0X2VmZmVjdGl2ZV9yZXN1bHQoY2hnLT5kY19zdXNwZW5kX3ZvdGFibGUpOworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CiAJCXJjID0gc21ibGliX2dldF9wcm9wX2RjX3ByZXNlbnQoY2hnLCB2YWwpOwogCQlicmVhazsKQEAgLTgwMyw2ICs4MjgsOSBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg6CiAJCXJjID0gc21ibGliX2dldF9wcm9wX2RjX2N1cnJlbnRfbWF4KGNoZywgdmFsKTsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9SRUFMX1RZUEU6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RZUEVfV0lQT1dFUjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODIyLDYgKzg1MCwxMCBAQAogCWludCByYyA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfU1VTUEVORDoKKwkJcmMgPSB2b3RlKGNoZy0+ZGNfc3VzcGVuZF92b3RhYmxlLCBXQkNfVk9URVIsCisJCQkJKGJvb2wpdmFsLT5pbnR2YWwsIDApOworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOgogCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF9kY19jdXJyZW50X21heChjaGcsIHZhbCk7CiAJCWJyZWFrOwpAQCAtODUxLDcgKzg4Myw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgZGNfcHN5X2Rlc2MgPSB7CiAJLm5hbWUgPSAiZGMiLAotCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfV0lQT1dFUiwKKwkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1dJUkVMRVNTLAogCS5wcm9wZXJ0aWVzID0gc21iMl9kY19wcm9wcywKIAkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNtYjJfZGNfcHJvcHMpLAogCS5nZXRfcHJvcGVydHkgPSBzbWIyX2RjX2dldF9wcm9wLApAQCAtOTA5LDYgKzk0MSw3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfRFBfRE0sCiAJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVRfTUFYLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlULAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSLAogfTsKIAogc3RhdGljIGludCBzbWIyX2JhdHRfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LApAQCAtMTAwOSw3ICsxMDQyLDEwIEBACiAJCXZhbC0+aW50dmFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9ESUVfSEVBTFRIOgotCQlyYyA9IHNtYmxpYl9nZXRfcHJvcF9kaWVfaGVhbHRoKGNoZywgdmFsKTsKKwkJaWYgKGNoZy0+ZGllX2hlYWx0aCA9PSAtRUlOVkFMKQorCQkJcmMgPSBzbWJsaWJfZ2V0X3Byb3BfZGllX2hlYWx0aChjaGcsIHZhbCk7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gY2hnLT5kaWVfaGVhbHRoOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0RQX0RNOgogCQl2YWwtPmludHZhbCA9IGNoZy0+cHVsc2VfY250OwpAQCAtMTAxNyw2ICsxMDUzLDkgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1JFUlVOX0FJQ0w6CiAJCXZhbC0+aW50dmFsID0gMDsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUjoKKwkJcmMgPSBzbWJsaWJfZ2V0X3Byb3BfYmF0dF9jaGFyZ2VfY291bnRlcihjaGcsIHZhbCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiYmF0dCBwb3dlciBzdXBwbHkgcHJvcCAlZCBub3Qgc3VwcG9ydGVkXG4iLCBwc3ApOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNjEsMTQgKzExMDAsOCBAQAogCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF9jaGFyZ2VfcW5vdm9fZW5hYmxlKGNoZywgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX1FOT1ZPOgotCQlpZiAodmFsLT5pbnR2YWwgPT0gLUVJTlZBTCkgewotCQkJdm90ZShjaGctPmZ2X3ZvdGFibGUsIEJBVFRfUFJPRklMRV9WT1RFUiwKLQkJCQkJdHJ1ZSwgY2hnLT5iYXR0X3Byb2ZpbGVfZnZfdXYpOwotCQkJdm90ZShjaGctPmZ2X3ZvdGFibGUsIFFOT1ZPX1ZPVEVSLCBmYWxzZSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQl2b3RlKGNoZy0+ZnZfdm90YWJsZSwgUU5PVk9fVk9URVIsIHRydWUsIHZhbC0+aW50dmFsKTsKLQkJCXZvdGUoY2hnLT5mdl92b3RhYmxlLCBCQVRUX1BST0ZJTEVfVk9URVIsIGZhbHNlLCAwKTsKLQkJfQorCQl2b3RlKGNoZy0+ZnZfdm90YWJsZSwgUU5PVk9fVk9URVIsCisJCQkodmFsLT5pbnR2YWwgPj0gMCksIHZhbC0+aW50dmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX1FOT1ZPOgogCQl2b3RlKGNoZy0+cGxfZGlzYWJsZV92b3RhYmxlLCBQTF9RTk9WT19WT1RFUiwKQEAgLTExMTQsNiArMTE0NywxMCBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVEVEOgogCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF9pbnB1dF9jdXJyZW50X2xpbWl0ZWQoY2hnLCB2YWwpOwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0RJRV9IRUFMVEg6CisJCWNoZy0+ZGllX2hlYWx0aCA9IHZhbC0+aW50dmFsOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGctPmJhdHRfcHN5KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmMgPSAtRUlOVkFMOwogCX0KQEAgLTExMzUsNiArMTE3Miw3IEBACiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlURUQ6CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEVQX0NIQVJHSU5HX0VOQUJMRUQ6CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TV19KRUlUQV9FTkFCTEVEOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRElFX0hFQUxUSDoKIAkJcmV0dXJuIDE7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xMTc2LDcgKzEyMTQsNyBAQAogICogVkJVUyBSRUdVTEFUT1IgUkVHSVNUUkFUSU9OICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjJfdmJ1c19yZWdfb3BzID0geworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjJfdmJ1c19yZWdfb3BzID0gewogCS5lbmFibGUgPSBzbWJsaWJfdmJ1c19yZWd1bGF0b3JfZW5hYmxlLAogCS5kaXNhYmxlID0gc21ibGliX3ZidXNfcmVndWxhdG9yX2Rpc2FibGUsCiAJLmlzX2VuYWJsZWQgPSBzbWJsaWJfdmJ1c19yZWd1bGF0b3JfaXNfZW5hYmxlZCwKQEAgLTEyMTgsNyArMTI1Niw3IEBACiAgKiBWQ09OTiBSRUdVTEFUT1IgUkVHSVNUUkFUSU9OICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjJfdmNvbm5fcmVnX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzbWIyX3Zjb25uX3JlZ19vcHMgPSB7CiAJLmVuYWJsZSA9IHNtYmxpYl92Y29ubl9yZWd1bGF0b3JfZW5hYmxlLAogCS5kaXNhYmxlID0gc21ibGliX3Zjb25uX3JlZ3VsYXRvcl9kaXNhYmxlLAogCS5pc19lbmFibGVkID0gc21ibGliX3Zjb25uX3JlZ3VsYXRvcl9pc19lbmFibGVkLApAQCAtMTYxNiwxNSArMTY1NCw2IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQkvKiBkaXNhYmxlIFNXIFNUQVQgb3ZlcnJpZGUgKi8KLQlyYyA9IHNtYmxpYl9tYXNrZWRfd3JpdGUoY2hnLCBTVEFUX0NGR19SRUcsCi0JCQkJIFNUQVRfU1dfT1ZFUlJJREVfQ0ZHX0JJVCwgMCk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiQ291bGRuJ3QgZGlzYWJsZSBTVyBTVEFUIG92ZXJyaWRlIHJjPSVkXG4iLAotCQkJcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCiAJLyogZGlzYWJsZSBoL3cgYXV0b25vbW91cyBwYXJhbGxlbCBjaGFyZ2luZyBjb250cm9sICovCiAJcmMgPSBzbWJsaWJfbWFza2VkX3dyaXRlKGNoZywgTUlTQ19DRkdfUkVHLAogCQkJCSBTVEFUX1BBUkFMTEVMXzE0MDBNQV9FTl9DRkdfQklULCAwKTsKQEAgLTE4MDcsOCArMTgzNiw4IEBACiAJCWNoaXAtPmNoZy53YV9mbGFncyB8PSBCT09TVF9CQUNLX1dBIHwgT1RHX1dBOwogCQljaGctPnBhcmFtLmZyZXFfYnVjayA9IHBtNjYwX3BhcmFtcy5mcmVxX2J1Y2s7CiAJCWNoZy0+cGFyYW0uZnJlcV9ib29zdCA9IHBtNjYwX3BhcmFtcy5mcmVxX2Jvb3N0OwotCQljaGctPmNoZ19mcmVxLmZyZXFfNVYJCT0gNjAwOwotCQljaGctPmNoZ19mcmVxLmZyZXFfNlZfOFYJPSA4MDA7CisJCWNoZy0+Y2hnX2ZyZXEuZnJlcV81VgkJPSA2NTA7CisJCWNoZy0+Y2hnX2ZyZXEuZnJlcV82Vl84Vgk9IDg1MDsKIAkJY2hnLT5jaGdfZnJlcS5mcmVxXzlWCQk9IDEwNTA7CiAJCWNoZy0+Y2hnX2ZyZXEuZnJlcV8xMlYJCT0gMTIwMDsKIAkJY2hnLT5jaGdfZnJlcS5mcmVxX3JlbW92YWwJPSAxMDUwOwpAQCAtMjIxMyw5ICsyMjQyLDExIEBACiAJY2hnLT5kZXYgPSAmcGRldi0+ZGV2OwogCWNoZy0+cGFyYW0gPSB2MV9wYXJhbXM7CiAJY2hnLT5kZWJ1Z19tYXNrID0gJl9fZGVidWdfbWFzazsKKwljaGctPnRyeV9zaW5rX2VuYWJsZWQgPSAmX190cnlfc2lua19lbmFibGVkOwogCWNoZy0+d2Vha19jaGdfaWNsX3VhID0gJl9fd2Vha19jaGdfaWNsX3VhOwogCWNoZy0+bW9kZSA9IFBBUkFMTEVMX01BU1RFUjsKIAljaGctPmlycV9pbmZvID0gc21iMl9pcnFzOworCWNoZy0+ZGllX2hlYWx0aCA9IC1FSU5WQUw7CiAJY2hnLT5uYW1lID0gIlBNSSI7CiAKIAljaGctPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKGNoZy0+ZGV2LT5wYXJlbnQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWItbGliLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYi1saWIuYwppbmRleCBjYzNiZDkzLi41MmZjZDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYi1saWIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYi1saWIuYwpAQCAtMTQzLDYgKzE0MywyMyBAQAogCXJldHVybiByYzsKIH0KIAoraW50IHNtYmxpYl9zdGF0X3N3X292ZXJyaWRlX2NmZyhzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywgYm9vbCBvdmVycmlkZSkKK3sKKwlpbnQgcmM7CisKKwkvKiBvdmVycmlkZSAgPSAxLCBTVyBTVEFUIG92ZXJyaWRlOyBvdmVycmlkZSA9IDAsIEhXIGF1dG8gbW9kZSAqLworCXJjID0gc21ibGliX21hc2tlZF93cml0ZShjaGcsIFNUQVRfQ0ZHX1JFRywKKwkJCQlTVEFUX1NXX09WRVJSSURFX0NGR19CSVQsCisJCQkJb3ZlcnJpZGUgPyBTVEFUX1NXX09WRVJSSURFX0NGR19CSVQgOiAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoY2hnLT5kZXYsICJDb3VsZG4ndCBjb25maWd1cmUgU1cgU1RBVCBvdmVycmlkZSByYz0lZFxuIiwKKwkJCXJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqCiAgKiBSRUdJU1RFUiBHRVRURVJTICoKICAqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxOSwxOSArNDM2LDIxIEBACiB7CiAJaW50IHJjID0gMDsKIAotCXN3aXRjaCAoYWxsb3dlZF92b2x0YWdlKSB7Ci0JY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzEyVjoKLQljYXNlIFVTQklOX0FEQVBURVJfQUxMT1dfNVZfT1JfMTJWOgotCWNhc2UgVVNCSU5fQURBUFRFUl9BTExPV185Vl9UT18xMlY6Ci0JY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzVWX09SXzlWX1RPXzEyVjoKLQljYXNlIFVTQklOX0FEQVBURVJfQUxMT1dfNVZfVE9fMTJWOgotCQkvKiBQTTY2MCBvbmx5IHN1cHBvcnQgbWF4LiA5ViAqLwotCQlpZiAoY2hnLT5zbWJfdmVyc2lvbiA9PSBQTTY2MF9TVUJUWVBFKSB7Ci0JCQlzbWJsaWJfZGJnKGNoZywgUFJfTUlTQywgInZvbHRhZ2Ugbm90IHN1cHBvcnRlZD0lZFxuIiwKLQkJCQkJYWxsb3dlZF92b2x0YWdlKTsKKwkvKiBQTTY2MCBvbmx5IHN1cHBvcnQgbWF4LiA5ViAqLworCWlmIChjaGctPnNtYl92ZXJzaW9uID09IFBNNjYwX1NVQlRZUEUpIHsKKwkJc3dpdGNoIChhbGxvd2VkX3ZvbHRhZ2UpIHsKKwkJY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzEyVjoKKwkJY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzlWX1RPXzEyVjoKKwkJCWFsbG93ZWRfdm9sdGFnZSA9IFVTQklOX0FEQVBURVJfQUxMT1dfOVY7CisJCQlicmVhazsKKwkJY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzVWX09SXzEyVjoKKwkJY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzVWX09SXzlWX1RPXzEyVjoKKwkJCWFsbG93ZWRfdm9sdGFnZSA9IFVTQklOX0FEQVBURVJfQUxMT1dfNVZfT1JfOVY7CisJCQlicmVhazsKKwkJY2FzZSBVU0JJTl9BREFQVEVSX0FMTE9XXzVWX1RPXzEyVjoKIAkJCWFsbG93ZWRfdm9sdGFnZSA9IFVTQklOX0FEQVBURVJfQUxMT1dfNVZfVE9fOVY7CisJCQlicmVhazsKIAkJfQotCQlicmVhazsKIAl9CiAKIAlyYyA9IHNtYmxpYl93cml0ZShjaGcsIFVTQklOX0FEQVBURVJfQUxMT1dfQ0ZHX1JFRywgYWxsb3dlZF92b2x0YWdlKTsKQEAgLTU4Miw4ICs2MDEsMTAgQEAKIAkJCXNjaGVkdWxlX3dvcmsoJmNoZy0+Ym1zX3VwZGF0ZV93b3JrKTsKIAl9CiAKLQlpZiAoIWNoZy0+cGwucHN5ICYmICFzdHJjbXAocHN5LT5kZXNjLT5uYW1lLCAicGFyYWxsZWwiKSkKKwlpZiAoIWNoZy0+cGwucHN5ICYmICFzdHJjbXAocHN5LT5kZXNjLT5uYW1lLCAicGFyYWxsZWwiKSkgewogCQljaGctPnBsLnBzeSA9IHBzeTsKKwkJc2NoZWR1bGVfd29yaygmY2hnLT5wbF91cGRhdGVfd29yayk7CisJfQogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KQEAgLTg4OSw3ICs5MTAsNyBAQAogCWJvb2wgb3ZlcnJpZGU7CiAKIAkvKiBzdXNwZW5kIGFuZCByZXR1cm4gaWYgMjVtQSBvciBsZXNzIGlzIHJlcXVlc3RlZCAqLwotCWlmIChpY2xfdWEgPCBVU0JJTl8yNU1BKQorCWlmIChpY2xfdWEgPD0gVVNCSU5fMjVNQSkKIAkJcmV0dXJuIHNtYmxpYl9zZXRfdXNiX3N1c3BlbmQoY2hnLCB0cnVlKTsKIAogCWlmIChpY2xfdWEgPT0gSU5UX01BWCkKQEAgLTEwMTUsNyArMTAzNiw3IEBACiAJCWljbF91YSA9IDA7CiAJfQogCi0Jc3VzcGVuZCA9IChpY2xfdWEgPCBVU0JJTl8yNU1BKTsKKwlzdXNwZW5kID0gKGljbF91YSA8PSBVU0JJTl8yNU1BKTsKIAlpZiAoc3VzcGVuZCkKIAkJZ290byBzdXNwZW5kOwogCkBAIC0xODU1LDYgKzE4NzYsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHNtYmxpYl9nZXRfcHJvcF9iYXR0X2NoYXJnZV9jb3VudGVyKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAorCQkJCSAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWNoZy0+Ym1zX3BzeSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoY2hnLT5ibXNfcHN5LAorCQkJCSAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUiwgdmFsKTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKgogICogQkFUVEVSWSBQU1kgU0VUVEVSUyAqCiAgKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMjEzLDE1ICsyMjQ3LDI4IEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgc21ibGliX2dldF9wcm9wX3VzYl92b2x0YWdlX21heChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKKwkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzd2l0Y2ggKGNoZy0+cmVhbF9jaGFyZ2VyX3R5cGUpIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9IVkRDUDoKKwljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9QRDoKKwkJaWYgKGNoZy0+c21iX3ZlcnNpb24gPT0gUE02NjBfU1VCVFlQRSkKKwkJCXZhbC0+aW50dmFsID0gTUlDUk9fOVY7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gTUlDUk9fMTJWOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwtPmludHZhbCA9IE1JQ1JPXzVWOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHNtYmxpYl9nZXRfcHJvcF91c2Jfdm9sdGFnZV9ub3coc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc21ibGliX2dldF9wcm9wX3VzYl9wcmVzZW50KGNoZywgdmFsKTsKLQlpZiAocmMgPCAwIHx8ICF2YWwtPmludHZhbCkKLQkJcmV0dXJuIHJjOwotCiAJaWYgKCFjaGctPmlpby51c2Jpbl92X2NoYW4gfHwKIAkJUFRSX0VSUihjaGctPmlpby51c2Jpbl92X2NoYW4pID09IC1FUFJPQkVfREVGRVIpCiAJCWNoZy0+aWlvLnVzYmluX3ZfY2hhbiA9IGlpb19jaGFubmVsX2dldChjaGctPmRldiwgInVzYmluX3YiKTsKQEAgLTIyMzIsMjEgKzIyNzksNiBAQAogCXJldHVybiBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChjaGctPmlpby51c2Jpbl92X2NoYW4sICZ2YWwtPmludHZhbCk7CiB9CiAKLWludCBzbWJsaWJfZ2V0X3Byb3BfcGRfY3VycmVudF9tYXgoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCi0JCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0JdmFsLT5pbnR2YWwgPSBnZXRfY2xpZW50X3ZvdGVfbG9ja2VkKGNoZy0+dXNiX2ljbF92b3RhYmxlLCBQRF9WT1RFUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzbWJsaWJfZ2V0X3Byb3BfdXNiX2N1cnJlbnRfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAotCQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXZhbC0+aW50dmFsID0gZ2V0X2NsaWVudF92b3RlX2xvY2tlZChjaGctPnVzYl9pY2xfdm90YWJsZSwKLQkJCVVTQl9QU1lfVk9URVIpOwotCXJldHVybiAwOwotfQotCiBpbnQgc21ibGliX2dldF9wcm9wX3VzYl9jdXJyZW50X25vdyhzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKQEAgLTI1ODQsNyArMjYxNiw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgc21ibGliX3NldF9wcm9wX3VzYl9jdXJyZW50X21heChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKK2ludCBzbWJsaWJfc2V0X3Byb3Bfc2RwX2N1cnJlbnRfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAogCQkJCSAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewogCWludCByYyA9IDA7CkBAIC0yNjcxLDcgKzI3MDMsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHNtYmxpYl9zZXRfcHJvcF91c2Jfdm9sdGFnZV9taW4oc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCitpbnQgc21ibGliX3NldF9wcm9wX3BkX3ZvbHRhZ2VfbWluKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAogCQkJCSAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewogCWludCByYywgbWluX3V2OwpAQCAtMjY5MCw3ICsyNzIyLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBzbWJsaWJfc2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAoraW50IHNtYmxpYl9zZXRfcHJvcF9wZF92b2x0YWdlX21heChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQkgICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKIAlpbnQgcmMsIG1heF91djsKQEAgLTI3NzksNyArMjgxMSw3IEBACiAJCWh2ZGNwID0gc3RhdCAmIFFDX0NIQVJHRVJfQklUOwogCQl2b3RlKGNoZy0+YXBzZF9kaXNhYmxlX3ZvdGFibGUsIFBEX1ZPVEVSLCBmYWxzZSwgMCk7CiAJCXZvdGUoY2hnLT5wZF9hbGxvd2VkX3ZvdGFibGUsIFBEX1ZPVEVSLCB0cnVlLCAwKTsKLQkJdm90ZShjaGctPnVzYl9pcnFfZW5hYmxlX3ZvdGFibGUsIFBEX1ZPVEVSLCB0cnVlLCAwKTsKKwkJdm90ZShjaGctPnVzYl9pcnFfZW5hYmxlX3ZvdGFibGUsIFBEX1ZPVEVSLCBmYWxzZSwgMCk7CiAJCXZvdGUoY2hnLT5odmRjcF9kaXNhYmxlX3ZvdGFibGVfaW5kaXJlY3QsIFBEX0lOQUNUSVZFX1ZPVEVSLAogCQkJCQkJCQlmYWxzZSwgMCk7CiAKQEAgLTMzMzksNiArMzM3MSwxMCBAQAogCQl2b3RlKGNoZy0+YXdha2Vfdm90YWJsZSwgUExfREVMQVlfVk9URVIsIHRydWUsIDApOwogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoZy0+cGxfZW5hYmxlX3dvcmssCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoUExfREVMQVlfTVMpKTsKKwkJLyogdmJ1cyByaXNpbmcgd2hlbiBBUFNEIHdhcyBkaXNhYmxlZCBhbmQgUERfQUNUSVZFID0gMCAqLworCQlpZiAoZ2V0X2VmZmVjdGl2ZV9yZXN1bHQoY2hnLT5hcHNkX2Rpc2FibGVfdm90YWJsZSkgJiYKKwkJCQkhY2hnLT5wZF9hY3RpdmUpCisJCQlwcl9lcnIoIkFQU0QgZGlzYWJsZWQgb24gdmJ1cyByaXNpbmcgd2l0aG91dCBQRFxuIik7CiAJfSBlbHNlIHsKIAkJaWYgKGNoZy0+d2FfZmxhZ3MgJiBCT09TVF9CQUNLX1dBKSB7CiAJCQlkYXRhID0gY2hnLT5pcnFfaW5mb1tTV0lUQ0hfUE9XRVJfT0tfSVJRXS5pcnFfZGF0YTsKQEAgLTM2MjMsNiArMzY1OSwzNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc21ibGliX25vdGlmeV9leHRjb25fcHJvcHMoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsIGludCBpZCkKK3sKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgdmFsOworCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsIHByb3BfdmFsOworCisJc21ibGliX2dldF9wcm9wX3R5cGVjX2NjX29yaWVudGF0aW9uKGNoZywgJnByb3BfdmFsKTsKKwl2YWwuaW50dmFsID0gKChwcm9wX3ZhbC5pbnR2YWwgPT0gMikgPyAxIDogMCk7CisJZXh0Y29uX3NldF9wcm9wZXJ0eShjaGctPmV4dGNvbiwgaWQsCisJCQkJRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZLCB2YWwpOworCisJdmFsLmludHZhbCA9IHRydWU7CisJZXh0Y29uX3NldF9wcm9wZXJ0eShjaGctPmV4dGNvbiwgaWQsCisJCQkJRVhUQ09OX1BST1BfVVNCX1NTLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBzbWJsaWJfbm90aWZ5X2RldmljZV9tb2RlKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLCBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlzbWJsaWJfbm90aWZ5X2V4dGNvbl9wcm9wcyhjaGcsIEVYVENPTl9VU0IpOworCisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGNoZy0+ZXh0Y29uLCBFWFRDT05fVVNCLCBlbmFibGUpOworfQorCitzdGF0aWMgdm9pZCBzbWJsaWJfbm90aWZ5X3VzYl9ob3N0KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLCBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlzbWJsaWJfbm90aWZ5X2V4dGNvbl9wcm9wcyhjaGcsIEVYVENPTl9VU0JfSE9TVCk7CisKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoY2hnLT5leHRjb24sIEVYVENPTl9VU0JfSE9TVCwgZW5hYmxlKTsKK30KKwogI2RlZmluZSBIVkRDUF9ERVRfTVMgMjUwMAogc3RhdGljIHZvaWQgc21ibGliX2hhbmRsZV9hcHNkX2RvbmUoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsIGJvb2wgcmlzaW5nKQogewpAQCAtMzY0NSw2ICszNzEyLDggQEAKIAkJLyogaWYgbm90IERDUCB0aGVuIG5vIGh2ZGNwIHRpbWVvdXQgaGFwcGVucy4gRW5hYmxlIHBkIGhlcmUgKi8KIAkJdm90ZShjaGctPnBkX2Rpc2FsbG93ZWRfdm90YWJsZV9pbmRpcmVjdCwgSFZEQ1BfVElNRU9VVF9WT1RFUiwKIAkJCQlmYWxzZSwgMCk7CisJCWlmIChjaGctPnVzZV9leHRjb24pCisJCQlzbWJsaWJfbm90aWZ5X2RldmljZV9tb2RlKGNoZywgdHJ1ZSk7CiAJCWJyZWFrOwogCWNhc2UgT0NQX0NIQVJHRVJfQklUOgogCWNhc2UgRkxPQVRfQ0hBUkdFUl9CSVQ6CkBAIC0zNzIzLDEzICszNzkyLDE3NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCB0eXBlY190cnlfc2luayhzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZykKK3sKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCB2YWw7CisJYm9vbCBkZWJvdW5jZV9kb25lLCB2YnVzX2RldGVjdGVkLCBzaW5rOworCXU4IHN0YXQ7CisJaW50IGV4aXRfbW9kZSA9IEFUVEFDSEVEX1NSQywgcmM7CisKKwkvKiBpZ25vcmUgdHlwZWMgaW50ZXJydXB0IHdoaWxlIHRyeS5zbmsgV0lQICovCisJY2hnLT50cnlfc2lua19hY3RpdmUgPSB0cnVlOworCisJLyogZm9yY2UgU05LIG1vZGUgKi8KKwl2YWwuaW50dmFsID0gUE9XRVJfU1VQUExZX1RZUEVDX1BSX1NJTks7CisJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdHlwZWNfcG93ZXJfcm9sZShjaGcsICZ2YWwpOworCWlmIChyYyA8IDApIHsKKwkJc21ibGliX2VycihjaGcsICJDb3VsZG4ndCBzZXQgVUZQIG1vZGUgcmM9JWRcbiIsIHJjKTsKKwkJZ290byB0cnlfc2lua19leGl0OworCX0KKworCS8qIHJlZHVjZSBUY2NkZWJvdW5jZSB0aW1lIHRvIH4yMG1zICovCisJcmMgPSBzbWJsaWJfbWFza2VkX3dyaXRlKGNoZywgTUlTQ19DRkdfUkVHLAorCQkJVENDX0RFQk9VTkNFXzIwTVNfQklULCBUQ0NfREVCT1VOQ0VfMjBNU19CSVQpOworCWlmIChyYyA8IDApIHsKKwkJc21ibGliX2VycihjaGcsICJDb3VsZG4ndCBzZXQgTUlTQ19DRkdfUkVHIHJjPSVkXG4iLCByYyk7CisJCWdvdG8gdHJ5X3NpbmtfZXhpdDsKKwl9CisKKwkvKgorCSAqIGdpdmUgb3Bwb3J0dW5pdHkgdG8gdGhlIG90aGVyIHNpZGUgdG8gYmUgYSBTUkMsCisJICogZm9yIHREUlBUUlkgKyBUY2NkZWJvdW5jZSB0aW1lCisJICovCisJbXNsZWVwKDEwMCk7CisKKwlyYyA9IHNtYmxpYl9yZWFkKGNoZywgVFlQRV9DX1NUQVRVU180X1JFRywgJnN0YXQpOworCWlmIChyYyA8IDApIHsKKwkJc21ibGliX2VycihjaGcsICJDb3VsZG4ndCByZWFkIFRZUEVfQ19TVEFUVVNfNCByYz0lZFxuIiwKKwkJCQlyYyk7CisJCWdvdG8gdHJ5X3NpbmtfZXhpdDsKKwl9CisKKwlkZWJvdW5jZV9kb25lID0gc3RhdCAmIFRZUEVDX0RFQk9VTkNFX0RPTkVfU1RBVFVTX0JJVDsKKworCWlmICghZGVib3VuY2VfZG9uZSkKKwkJLyoKKwkJICogVGhlIG90aGVyIHNpZGUgZGlkbid0IHN3aXRjaCB0byBzb3VyY2UsIGVpdGhlciBpdAorCQkgKiBpcyBhbiBhZGFtYW50IHNpbmsgb3IgaXMgcmVtb3ZlZCBnbyBiYWNrIHRvIHNob3dpbmcgUnAKKwkJICovCisJCWdvdG8gdHJ5X3dhaXRfc3JjOworCisJLyoKKwkgKiBXZSBhcmUgaW4gZm9yY2Ugc2luayBtb2RlIGFuZCB0aGUgb3RoZXIgc2lkZSBoYXMgc3dpdGNoZWQgdG8KKwkgKiBzaG93aW5nIFJwLiBDb25maWcgRFJQIGluIGNhc2UgdGhlIG90aGVyIHNpZGUgcmVtb3ZlcyBScCBzbyB3ZQorCSAqIGNhbiBxdWlja2x5ICgyMG1zKSBzd2l0Y2ggdG8gc2hvd2luZyBvdXIgUnAuIE5vdGUgdGhhdCB0aGUgc3BlYworCSAqIG5lZWRzIHVzIHRvIHNob3cgUnAgZm9yIDgwbVMgd2hpbGUgdGhlIGRycCBERlAgcmVzaWRlbmN5IGlzIGp1c3QKKwkgKiA1NG1TLiBCdXQgNTRtUyBpcyBwbGVudHkgdGltZSBmb3IgdXMgdG8gcmVhY3QgYW5kIGZvcmNlIFJwIGZvcgorCSAqIHRoZSByZW1haW5pbmcgMjZtUy4KKwkgKi8KKwl2YWwuaW50dmFsID0gUE9XRVJfU1VQUExZX1RZUEVDX1BSX0RVQUw7CisJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdHlwZWNfcG93ZXJfcm9sZShjaGcsICZ2YWwpOworCWlmIChyYyA8IDApIHsKKwkJc21ibGliX2VycihjaGcsICJDb3VsZG4ndCBzZXQgREZQIG1vZGUgcmM9JWRcbiIsCisJCQkJcmMpOworCQlnb3RvIHRyeV9zaW5rX2V4aXQ7CisJfQorCisJLyoKKwkgKiB3aGlsZSBvdGhlciBzaWRlIGlzIFJwLCB3YWl0IGZvciBWQlVTIGZyb20gaXQ7IGV4aXQgaWYgb3RoZXIgc2lkZQorCSAqIHJlbW92ZXMgUnAKKwkgKi8KKwlkbyB7CisJCXJjID0gc21ibGliX3JlYWQoY2hnLCBUWVBFX0NfU1RBVFVTXzRfUkVHLCAmc3RhdCk7CisJCWlmIChyYyA8IDApIHsKKwkJCXNtYmxpYl9lcnIoY2hnLCAiQ291bGRuJ3QgcmVhZCBUWVBFX0NfU1RBVFVTXzQgcmM9JWRcbiIsCisJCQkJCXJjKTsKKwkJCWdvdG8gdHJ5X3NpbmtfZXhpdDsKKwkJfQorCisJCWRlYm91bmNlX2RvbmUgPSBzdGF0ICYgVFlQRUNfREVCT1VOQ0VfRE9ORV9TVEFUVVNfQklUOworCQl2YnVzX2RldGVjdGVkID0gc3RhdCAmIFRZUEVDX1ZCVVNfU1RBVFVTX0JJVDsKKworCQkvKiBTdWNjZXNzZnVsbHkgdHJhbnNpdGlvbmVkIHRvIEFUVEFDSEVELlNOSyAqLworCQlpZiAodmJ1c19kZXRlY3RlZCAmJiBkZWJvdW5jZV9kb25lKSB7CisJCQlleGl0X21vZGUgPSBBVFRBQ0hFRF9TSU5LOworCQkJZ290byB0cnlfc2lua19leGl0OworCQl9CisKKwkJLyoKKwkJICogRW5zdXJlIHNpbmsgc2luY2UgZHJwIG1heSBwdXQgdXMgaW4gc291cmNlIGlmIG90aGVyCisJCSAqIHNpZGUgc3dpdGNoZXMgYmFjayB0byBSZAorCQkgKi8KKwkJc2luayA9ICEoc3RhdCAmICBVRlBfREZQX01PREVfU1RBVFVTX0JJVCk7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0gd2hpbGUgKGRlYm91bmNlX2RvbmUgJiYgc2luayk7CisKK3RyeV93YWl0X3NyYzoKKwkvKgorCSAqIFRyYW5zaXRpb24gdG8gdHJ5d2FpdC5TUkMgc3RhdGUuIGNoZWNrIGlmIG90aGVyIHNpZGUgc3RpbGwgd2FudHMKKwkgKiB0byBiZSBTTksgb3IgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwl2YWwuaW50dmFsID0gUE9XRVJfU1VQUExZX1RZUEVDX1BSX1NPVVJDRTsKKwlyYyA9IHNtYmxpYl9zZXRfcHJvcF90eXBlY19wb3dlcl9yb2xlKGNoZywgJnZhbCk7CisJaWYgKHJjIDwgMCkgeworCQlzbWJsaWJfZXJyKGNoZywgIkNvdWxkbid0IHNldCBVRlAgbW9kZSByYz0lZFxuIiwgcmMpOworCQlnb3RvIHRyeV9zaW5rX2V4aXQ7CisJfQorCisJLyogTmVlZCB0byBiZSBpbiB0aGlzIHN0YXRlIGZvciB0RFJQVFJZIHRpbWUsIDc1bXN+MTUwbXMgKi8KKwltc2xlZXAoODApOworCisJcmMgPSBzbWJsaWJfcmVhZChjaGcsIFRZUEVfQ19TVEFUVVNfNF9SRUcsICZzdGF0KTsKKwlpZiAocmMgPCAwKSB7CisJCXNtYmxpYl9lcnIoY2hnLCAiQ291bGRuJ3QgcmVhZCBUWVBFX0NfU1RBVFVTXzQgcmM9JWRcbiIsIHJjKTsKKwkJZ290byB0cnlfc2lua19leGl0OworCX0KKworCWRlYm91bmNlX2RvbmUgPSBzdGF0ICYgVFlQRUNfREVCT1VOQ0VfRE9ORV9TVEFUVVNfQklUOworCisJaWYgKGRlYm91bmNlX2RvbmUpCisJCS8qIHRoZSBvdGhlciBzaWRlIHdhbnRzIHRvIGJlIGEgc2luayAqLworCQlleGl0X21vZGUgPSBBVFRBQ0hFRF9TUkM7CisJZWxzZQorCQkvKiB0aGUgb3RoZXIgc2lkZSBpcyBkZXRhY2hlZCAqLworCQlleGl0X21vZGUgPSBVTkFUVEFDSEVEX1NJTks7CisKK3RyeV9zaW5rX2V4aXQ6CisJLyogcmVsZWFzZSBmb3JjaW5nIG9mIFNSQy9TTksgbW9kZSAqLworCXZhbC5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVFlQRUNfUFJfRFVBTDsKKwlyYyA9IHNtYmxpYl9zZXRfcHJvcF90eXBlY19wb3dlcl9yb2xlKGNoZywgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJc21ibGliX2VycihjaGcsICJDb3VsZG4ndCBzZXQgREZQIG1vZGUgcmM9JWRcbiIsIHJjKTsKKworCS8qIHJldmVydCBUY2NkZWJvdW5jZSB0aW1lIGJhY2sgdG8gfjEyMG1zICovCisJcmMgPSBzbWJsaWJfbWFza2VkX3dyaXRlKGNoZywgTUlTQ19DRkdfUkVHLCBUQ0NfREVCT1VOQ0VfMjBNU19CSVQsIDApOworCWlmIChyYyA8IDApCisJCXNtYmxpYl9lcnIoY2hnLCAiQ291bGRuJ3Qgc2V0IE1JU0NfQ0ZHX1JFRyByYz0lZFxuIiwgcmMpOworCisJY2hnLT50cnlfc2lua19hY3RpdmUgPSBmYWxzZTsKKworCXJldHVybiBleGl0X21vZGU7Cit9CisKIHN0YXRpYyB2b2lkIHR5cGVjX3NpbmtfaW5zZXJ0aW9uKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnKQogeworCWludCBleGl0X21vZGU7CisKKwkvKgorCSAqIFRyeS5TTksgZW50cnkgc3RhdHVzIC0gQVRUQUNIV0FJVC5TUkMgc3RhdGUgYW5kIGRldGVjdGVkIFJkLW9wZW4KKwkgKiBvciBSRC1SYSBmb3IgVGNjRGVib3VuY2UgdGltZS4KKwkgKi8KKworCWlmICgqY2hnLT50cnlfc2lua19lbmFibGVkKSB7CisJCWV4aXRfbW9kZSA9IHR5cGVjX3RyeV9zaW5rKGNoZyk7CisKKwkJaWYgKGV4aXRfbW9kZSAhPSBBVFRBQ0hFRF9TUkMpIHsKKwkJCXNtYmxpYl91c2JfdHlwZWNfY2hhbmdlKGNoZyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAkvKiB3aGVuIGEgc2luayBpcyBpbnNlcnRlZCB3ZSBzaG91bGQgbm90IHdhaXQgb24gaHZkY3AgdGltZW91dCB0bwogCSAqIGVuYWJsZSBwZAogCSAqLwogCXZvdGUoY2hnLT5wZF9kaXNhbGxvd2VkX3ZvdGFibGVfaW5kaXJlY3QsIEhWRENQX1RJTUVPVVRfVk9URVIsCiAJCQlmYWxzZSwgMCk7CisJaWYgKGNoZy0+dXNlX2V4dGNvbikgeworCQlzbWJsaWJfbm90aWZ5X3VzYl9ob3N0KGNoZywgdHJ1ZSk7CisJCWNoZy0+b3RnX3ByZXNlbnQgPSB0cnVlOworCX0KIH0KIAogc3RhdGljIHZvaWQgdHlwZWNfc2lua19yZW1vdmFsKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnKQpAQCAtMzc5Myw3ICs0MDIzLDcgQEAKIAogCS8qIHJlc2V0IHBhcmFsbGVsIHZvdGVycyAqLwogCXZvdGUoY2hnLT5wbF9kaXNhYmxlX3ZvdGFibGUsIFBMX0RFTEFZX1ZPVEVSLCB0cnVlLCAwKTsKLQl2b3RlKGNoZy0+cGxfZGlzYWJsZV92b3RhYmxlLCBGQ0NfQ0hBTkdFX1ZPVEVSLCBmYWxzZSwgMCk7CisJdm90ZShjaGctPnBsX2Rpc2FibGVfdm90YWJsZSwgUExfRkNDX0xPV19WT1RFUiwgZmFsc2UsIDApOwogCXZvdGUoY2hnLT5wbF9lbmFibGVfdm90YWJsZV9pbmRpcmVjdCwgVVNCSU5fSV9WT1RFUiwgZmFsc2UsIDApOwogCXZvdGUoY2hnLT5wbF9lbmFibGVfdm90YWJsZV9pbmRpcmVjdCwgVVNCSU5fVl9WT1RFUiwgZmFsc2UsIDApOwogCXZvdGUoY2hnLT5hd2FrZV92b3RhYmxlLCBQTF9ERUxBWV9WT1RFUiwgZmFsc2UsIDApOwpAQCAtMzg4MCw2ICs0MTEwLDE0IEBACiAKIAl0eXBlY19zaW5rX3JlbW92YWwoY2hnKTsKIAlzbWJsaWJfdXBkYXRlX3VzYl90eXBlKGNoZyk7CisKKwlpZiAoY2hnLT51c2VfZXh0Y29uKSB7CisJCWlmIChjaGctPm90Z19wcmVzZW50KQorCQkJc21ibGliX25vdGlmeV91c2JfaG9zdChjaGcsIGZhbHNlKTsKKwkJZWxzZQorCQkJc21ibGliX25vdGlmeV9kZXZpY2VfbW9kZShjaGcsIGZhbHNlKTsKKwl9CisJY2hnLT5vdGdfcHJlc2VudCA9IGZhbHNlOwogfQogCiBzdGF0aWMgdm9pZCBzbWJsaWJfaGFuZGxlX3R5cGVjX2luc2VydGlvbihzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZykKQEAgLTM5NzksNyArNDIxNyw3IEBACiAJCQkJc21ibGliX3R5cGVjX21vZGVfbmFtZVtjaGctPnR5cGVjX21vZGVdKTsKIH0KIAotc3RhdGljIHZvaWQgc21ibGliX3VzYl90eXBlY19jaGFuZ2Uoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcpCit2b2lkIHNtYmxpYl91c2JfdHlwZWNfY2hhbmdlKHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnKQogewogCWludCByYzsKIApAQCAtNDAxNSw3ICs0MjUzLDggQEAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAotCWlmIChjaGctPmNjMl9kZXRhY2hfd2FfYWN0aXZlIHx8IGNoZy0+dHlwZWNfZW5fZGlzX2FjdGl2ZSkgeworCWlmIChjaGctPmNjMl9kZXRhY2hfd2FfYWN0aXZlIHx8IGNoZy0+dHlwZWNfZW5fZGlzX2FjdGl2ZSB8fAorCQkJCQkgY2hnLT50cnlfc2lua19hY3RpdmUpIHsKIAkJc21ibGliX2RiZyhjaGcsIFBSX0lOVEVSUlVQVCwgIklnbm9yaW5nIHNpbmNlICVzIGFjdGl2ZVxuIiwKIAkJCWNoZy0+Y2MyX2RldGFjaF93YV9hY3RpdmUgPwogCQkJImNjMl9kZXRhY2hfd2EiIDogInR5cGVjX2VuX2RpcyIpOwpAQCAtNDA0OSw2ICs0Mjg4LDE0IEBACiAJc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcgPSBpcnFfZGF0YS0+cGFyZW50X2RhdGE7CiAKIAljaGctPmlzX2hkYyA9IHRydWU7CisJLyoKKwkgKiBEaXNhYmxlIHVzYiBJUlFzIGFmdGVyIHRoZSBmbGFnIHNldCBhbmQgcmUtZW5hYmxlIElSUXMgYWZ0ZXIKKwkgKiB0aGUgZmxhZyBjbGVhcmVkIGluIHRoZSBkZWxheWVkIHdvcmsgcXVldWUsIHRvIGF2b2lkIGFueSBJUlEKKwkgKiBzdG9ybWluZyBkdXJpbmcgdGhlIGRlbGF5cworCSAqLworCWlmIChjaGctPmlycV9pbmZvW0hJR0hfRFVUWV9DWUNMRV9JUlFdLmlycSkKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGNoZy0+aXJxX2luZm9bSElHSF9EVVRZX0NZQ0xFX0lSUV0uaXJxKTsKKwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hnLT5jbGVhcl9oZGNfd29yaywgbXNlY3NfdG9famlmZmllcyg2MCkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDA4NSw3ICs0MzMyLDcgQEAKIAogCS8qIHNraXAgc3VzcGVuZGluZyBpbnB1dCBpZiBpdHMgYWxyZWFkeSBzdXNwZW5kZWQgYnkgc29tZSBvdGhlciB2b3RlciAqLwogCXVzYl9pY2wgPSBnZXRfZWZmZWN0aXZlX3Jlc3VsdChjaGctPnVzYl9pY2xfdm90YWJsZSk7Ci0JaWYgKChzdGF0ICYgVVNFX1VTQklOX0JJVCkgJiYgdXNiX2ljbCA+PSAwICYmIHVzYl9pY2wgPCBVU0JJTl8yNU1BKQorCWlmICgoc3RhdCAmIFVTRV9VU0JJTl9CSVQpICYmIHVzYl9pY2wgPj0gMCAmJiB1c2JfaWNsIDw9IFVTQklOXzI1TUEpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAogCWlmIChzdGF0ICYgVVNFX0RDSU5fQklUKQpAQCAtNDIyMCwxMiArNDQ2NywyMiBAQAogCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGctPmJhdHRfcHN5KTsKIH0KIAorc3RhdGljIHZvaWQgcGxfdXBkYXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzbWJfY2hhcmdlciAqY2hnID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbWJfY2hhcmdlciwKKwkJCQkJCXBsX3VwZGF0ZV93b3JrKTsKKworCXNtYmxpYl9zdGF0X3N3X292ZXJyaWRlX2NmZyhjaGcsIGZhbHNlKTsKK30KKwogc3RhdGljIHZvaWQgY2xlYXJfaGRjX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBzbWJfY2hhcmdlciAqY2hnID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbWJfY2hhcmdlciwKIAkJCQkJCWNsZWFyX2hkY193b3JrLndvcmspOwogCiAJY2hnLT5pc19oZGMgPSAwOworCWlmIChjaGctPmlycV9pbmZvW0hJR0hfRFVUWV9DWUNMRV9JUlFdLmlycSkKKwkJZW5hYmxlX2lycShjaGctPmlycV9pbmZvW0hJR0hfRFVUWV9DWUNMRV9JUlFdLmlycSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJkc3RkX2NjMl9kZXRhY2hfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC00NzUwLDYgKzUwMDcsNyBAQAogCW11dGV4X2luaXQoJmNoZy0+b3RnX29jX2xvY2spOwogCW11dGV4X2luaXQoJmNoZy0+dmNvbm5fb2NfbG9jayk7CiAJSU5JVF9XT1JLKCZjaGctPmJtc191cGRhdGVfd29yaywgYm1zX3VwZGF0ZV93b3JrKTsKKwlJTklUX1dPUksoJmNoZy0+cGxfdXBkYXRlX3dvcmssIHBsX3VwZGF0ZV93b3JrKTsKIAlJTklUX1dPUksoJmNoZy0+cmRzdGRfY2MyX2RldGFjaF93b3JrLCByZHN0ZF9jYzJfZGV0YWNoX3dvcmspOwogCUlOSVRfREVMQVlFRF9XT1JLKCZjaGctPmh2ZGNwX2RldGVjdF93b3JrLCBzbWJsaWJfaHZkY3BfZGV0ZWN0X3dvcmspOwogCUlOSVRfREVMQVlFRF9XT1JLKCZjaGctPmNsZWFyX2hkY193b3JrLCBjbGVhcl9oZGNfd29yayk7CkBAIC00Nzk4LDYgKzUwNTYsMTQgQEAKIAogCQljaGctPmJtc19wc3kgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoImJtcyIpOwogCQljaGctPnBsLnBzeSA9IHBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZSgicGFyYWxsZWwiKTsKKwkJaWYgKGNoZy0+cGwucHN5KSB7CisJCQlyYyA9IHNtYmxpYl9zdGF0X3N3X292ZXJyaWRlX2NmZyhjaGcsIGZhbHNlKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlzbWJsaWJfZXJyKGNoZywKKwkJCQkJIkNvdWxkbid0IGNvbmZpZyBzdGF0IHN3IHJjPSVkXG4iLCByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CiAJCWJyZWFrOwogCWNhc2UgUEFSQUxMRUxfU0xBVkU6CiAJCWJyZWFrOwpAQCAtNDgxNCw2ICs1MDgwLDcgQEAKIAlzd2l0Y2ggKGNoZy0+bW9kZSkgewogCWNhc2UgUEFSQUxMRUxfTUFTVEVSOgogCQljYW5jZWxfd29ya19zeW5jKCZjaGctPmJtc191cGRhdGVfd29yayk7CisJCWNhbmNlbF93b3JrX3N5bmMoJmNoZy0+cGxfdXBkYXRlX3dvcmspOwogCQljYW5jZWxfd29ya19zeW5jKCZjaGctPnJkc3RkX2NjMl9kZXRhY2hfd29yayk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hnLT5odmRjcF9kZXRlY3Rfd29yayk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hnLT5jbGVhcl9oZGNfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYi1saWIuaCBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iLWxpYi5oCmluZGV4IGJmYzVjYWUuLjEwNDZiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iLWxpYi5oCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iLWxpYi5oCkBAIC02Niw3ICs2Niw4IEBACiAjZGVmaW5lIFVTQklOX0lfVk9URVIJCQkiVVNCSU5fSV9WT1RFUiIKICNkZWZpbmUgV0VBS19DSEFSR0VSX1ZPVEVSCQkiV0VBS19DSEFSR0VSX1ZPVEVSIgogI2RlZmluZSBPVEdfVk9URVIJCQkiT1RHX1ZPVEVSIgotI2RlZmluZSBGQ0NfQ0hBTkdFX1ZPVEVSCQkiRkNDX0NIQU5HRV9WT1RFUiIKKyNkZWZpbmUgUExfRkNDX0xPV19WT1RFUgkJIlBMX0ZDQ19MT1dfVk9URVIiCisjZGVmaW5lIFdCQ19WT1RFUgkJCSJXQkNfVk9URVIiCiAKICNkZWZpbmUgVkNPTk5fTUFYX0FUVEVNUFRTCTMKICNkZWZpbmUgT1RHX01BWF9BVFRFTVBUUwkzCkBAIC0xMjksNiArMTMwLDEyIEBACiAJU01CX0lSUV9NQVgsCiB9OwogCitlbnVtIHRyeV9zaW5rX2V4aXRfbW9kZSB7CisJQVRUQUNIRURfU1JDID0gMCwKKwlBVFRBQ0hFRF9TSU5LLAorCVVOQVRUQUNIRURfU0lOSywKK307CisKIHN0cnVjdCBzbWJfaXJxX2luZm8gewogCWNvbnN0IGNoYXIJCQkqbmFtZTsKIAljb25zdCBpcnFfaGFuZGxlcl90CQloYW5kbGVyOwpAQCAtMTQ0LDYgKzE1MSw5IEBACiAJRVhUQ09OX05PTkUsCiB9OwogCisvKiBFWFRDT05fVVNCIGFuZCBFWFRDT05fVVNCX0hPU1QgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworc3RhdGljIGNvbnN0IHUzMiBzbWJsaWJfZXh0Y29uX2V4Y2x1c2l2ZVtdID0gezB4MywgMH07CisKIHN0cnVjdCBzbWJfcmVndWxhdG9yIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldgkqcmRldjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MJcmRlc2M7CkBAIC0yMjgsNiArMjM4LDcgQEAKIAlzdHJ1Y3Qgc21iX3BhcmFtcwlwYXJhbTsKIAlzdHJ1Y3Qgc21iX2lpbwkJaWlvOwogCWludAkJCSpkZWJ1Z19tYXNrOworCWludAkJCSp0cnlfc2lua19lbmFibGVkOwogCWVudW0gc21iX21vZGUJCW1vZGU7CiAJc3RydWN0IHNtYl9jaGdfZnJlcQljaGdfZnJlcTsKIAlpbnQJCQlzbWJfdmVyc2lvbjsKQEAgLTI4Myw2ICsyOTQsNyBAQAogCiAJLyogd29yayAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlibXNfdXBkYXRlX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXBsX3VwZGF0ZV93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlyZHN0ZF9jYzJfZGV0YWNoX3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlodmRjcF9kZXRlY3Rfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCXBzX2NoYW5nZV90aW1lb3V0X3dvcms7CkBAIC0zMzEsMTEgKzM0MywxNCBAQAogCWludAkJCXVzYl9pY2xfY2hhbmdlX2lycV9lbmFibGVkOwogCXUzMgkJCWplaXRhX3N0YXR1czsKIAl1OAkJCWZsb2F0X2NmZzsKKwlib29sCQkJdXNlX2V4dGNvbjsKKwlib29sCQkJb3RnX3ByZXNlbnQ7CiAKIAkvKiB3b3JrYXJvdW5kIGZsYWcgKi8KIAl1MzIJCQl3YV9mbGFnczsKIAlib29sCQkJY2MyX2RldGFjaF93YV9hY3RpdmU7CiAJYm9vbAkJCXR5cGVjX2VuX2Rpc19hY3RpdmU7CisJYm9vbAkJCXRyeV9zaW5rX2FjdGl2ZTsKIAlpbnQJCQlib29zdF9jdXJyZW50X3VhOwogCWludAkJCXRlbXBfc3BlZWRfcmVhZGluZ19jb3VudDsKIApAQCAtMzQ5LDYgKzM2NCw4IEBACiAJLyogcW5vdm8gKi8KIAlpbnQJCQl1c2JfaWNsX2RlbHRhX3VhOwogCWludAkJCXB1bHNlX2NudDsKKworCWludAkJCWRpZV9oZWFsdGg7CiB9OwogCiBpbnQgc21ibGliX3JlYWQoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsIHUxNiBhZGRyLCB1OCAqdmFsKTsKQEAgLTQyNCw2ICs0NDEsOCBAQAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwogaW50IHNtYmxpYl9nZXRfcHJvcF9iYXR0X3RlbXAoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CitpbnQgc21ibGliX2dldF9wcm9wX2JhdHRfY2hhcmdlX2NvdW50ZXIoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCisJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CiBpbnQgc21ibGliX3NldF9wcm9wX2lucHV0X3N1c3BlbmQoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CiBpbnQgc21ibGliX3NldF9wcm9wX2JhdHRfY2FwYWNpdHkoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCkBAIC00NTAsMTIgKzQ2OSwxMCBAQAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwogaW50IHNtYmxpYl9nZXRfcHJvcF91c2Jfc3VzcGVuZChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKK2ludCBzbWJsaWJfZ2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAorCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwogaW50IHNtYmxpYl9nZXRfcHJvcF91c2Jfdm9sdGFnZV9ub3coc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7Ci1pbnQgc21ibGliX2dldF9wcm9wX3BkX2N1cnJlbnRfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAotCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwotaW50IHNtYmxpYl9nZXRfcHJvcF91c2JfY3VycmVudF9tYXgoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCi0JCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CiBpbnQgc21ibGliX2dldF9wcm9wX3VzYl9jdXJyZW50X25vdyhzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKIGludCBzbWJsaWJfZ2V0X3Byb3BfdHlwZWNfY2Nfb3JpZW50YXRpb24oc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCkBAIC00ODIsMTEgKzQ5OSwxMSBAQAogCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOwogaW50IHNtYmxpYl9zZXRfcHJvcF9wZF9jdXJyZW50X21heChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQljb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKLWludCBzbWJsaWJfc2V0X3Byb3BfdXNiX2N1cnJlbnRfbWF4KHN0cnVjdCBzbWJfY2hhcmdlciAqY2hnLAoraW50IHNtYmxpYl9zZXRfcHJvcF9zZHBfY3VycmVudF9tYXgoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7Ci1pbnQgc21ibGliX3NldF9wcm9wX3VzYl92b2x0YWdlX21pbihzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKK2ludCBzbWJsaWJfc2V0X3Byb3BfcGRfdm9sdGFnZV9tYXgoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7Ci1pbnQgc21ibGliX3NldF9wcm9wX3VzYl92b2x0YWdlX21heChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKK2ludCBzbWJsaWJfc2V0X3Byb3BfcGRfdm9sdGFnZV9taW4oc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CiBpbnQgc21ibGliX3NldF9wcm9wX2Jvb3N0X2N1cnJlbnQoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsCiAJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CkBAIC01MTcsNiArNTM0LDggQEAKIAkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKIGludCBzbWJsaWJfc2V0X3Byb3BfcHJfc3dhcF9pbl9wcm9ncmVzcyhzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZywKIAkJCQljb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKK2ludCBzbWJsaWJfc3RhdF9zd19vdmVycmlkZV9jZmcoc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcsIGJvb2wgb3ZlcnJpZGUpOwordm9pZCBzbWJsaWJfdXNiX3R5cGVjX2NoYW5nZShzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZyk7CiAKIGludCBzbWJsaWJfaW5pdChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZyk7CiBpbnQgc21ibGliX2RlaW5pdChzdHJ1Y3Qgc21iX2NoYXJnZXIgKmNoZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzNTEtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzUxLWNoYXJnZXIuYwppbmRleCBhNDY0YTgxLi40YjJlOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzNTEtY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iMTM1MS1jaGFyZ2VyLmMKQEAgLTg2MSw3ICs4NjEsNyBAQAogCXJldHVybiAocmVnICYgQ01EX09UR19FTl9CSVQpID8gMSA6IDA7CiB9CiAKLXN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjEzNTFfY2hnX290Z19yZWdfb3BzID0geworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjEzNTFfY2hnX290Z19yZWdfb3BzID0gewogCS5lbmFibGUJCT0gc21iMTM1MV9jaGdfb3RnX3JlZ3VsYXRvcl9lbmFibGUsCiAJLmRpc2FibGUJPSBzbWIxMzUxX2NoZ19vdGdfcmVndWxhdG9yX2Rpc2FibGUsCiAJLmlzX2VuYWJsZWQJPSBzbWIxMzUxX2NoZ19vdGdfcmVndWxhdG9yX2lzX2VuYWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iMTM1NS1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzNTUtY2hhcmdlci5jCmluZGV4IDRlMWJiMTcuLjRiNDI0MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iMTM1NS1jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzU1LWNoYXJnZXIuYwpAQCAtMTQ2LDYgKzE0Niw4IEBACiAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpwYXJhbGxlbF9wc3k7CiAJc3RydWN0IHBtaWNfcmV2aWRfZGF0YQkqcG1pY19yZXZfaWQ7CisKKwlpbnQJCQljX2hlYWx0aDsKIH07CiAKIHN0YXRpYyBib29sIGlzX3NlY3VyZShzdHJ1Y3Qgc21iMTM1NSAqY2hpcCwgaW50IGFkZHIpCkBAIC00MzQsNyArNDM2LDEwIEBACiAJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1BMX1VTQk1JRF9VU0JNSUQ7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OTkVDVE9SX0hFQUxUSDoKLQkJdmFsLT5pbnR2YWwgPSBzbWIxMzU1X2dldF9wcm9wX2Nvbm5lY3Rvcl9oZWFsdGgoY2hpcCk7CisJCWlmIChjaGlwLT5jX2hlYWx0aCA9PSAtRUlOVkFMKQorCQkJdmFsLT5pbnR2YWwgPSBzbWIxMzU1X2dldF9wcm9wX2Nvbm5lY3Rvcl9oZWFsdGgoY2hpcCk7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gY2hpcC0+Y19oZWFsdGg7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2Vycl9yYXRlbGltaXRlZCgicGFyYWxsZWwgcHN5IGdldCBwcm9wICVkIG5vdCBzdXBwb3J0ZWRcbiIsCkBAIC00OTcsNiArNTAyLDEwIEBACiAJCXJjID0gc21iMTM1NV9zZXRfY2hhcmdlX3BhcmFtKGNoaXAsICZjaGlwLT5wYXJhbS5mY2MsCiAJCQkJCQl2YWwtPmludHZhbCk7CiAJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OTkVDVE9SX0hFQUxUSDoKKwkJY2hpcC0+Y19oZWFsdGggPSB2YWwtPmludHZhbDsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+cGFyYWxsZWxfcHN5KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZGVidWcoInBhcmFsbGVsIHBvd2VyIHN1cHBseSBzZXQgcHJvcCAlZCBub3Qgc3VwcG9ydGVkXG4iLAogCQkJcHJvcCk7CkBAIC01MDksNiArNTE4LDEzIEBACiBzdGF0aWMgaW50IHNtYjEzNTVfcGFyYWxsZWxfcHJvcF9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAogCQkJCQkgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wKQogeworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OTkVDVE9SX0hFQUxUSDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYxMyw2ICs2MjksNyBAQAogCVswXSA9IHsKIAkJLm5hbWUJCT0gIndkb2ctYmFyayIsCiAJCS5oYW5kbGVyCT0gc21iMTM1NV9oYW5kbGVfd2RvZ19iYXJrLAorCQkud2FrZQkJPSB0cnVlLAogCX0sCiAJWzFdID0gewogCQkubmFtZQkJPSAiY2hnLXN0YXRlLWNoYW5nZSIsCkBAIC03MTMsNiArNzMwLDcgQEAKIAogCWNoaXAtPmRldiA9ICZwZGV2LT5kZXY7CiAJY2hpcC0+cGFyYW0gPSB2MV9wYXJhbXM7CisJY2hpcC0+Y19oZWFsdGggPSAtRUlOVkFMOwogCWNoaXAtPm5hbWUgPSAic21iMTM1NSI7CiAJbXV0ZXhfaW5pdCgmY2hpcC0+d3JpdGVfbG9jayk7CiAKQEAgLTc2MiwxNCArNzgwLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNtYjEzNTVfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc21iMTM1NSAqY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByYzsKKworCS8qIGRpc2FibGUgcGFyYWxsZWwgY2hhcmdpbmcgcGF0aCAqLworCXJjID0gc21iMTM1NV9zZXRfcGFyYWxsZWxfY2hhcmdpbmcoY2hpcCwgdHJ1ZSk7CisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCJDb3VsZG4ndCBkaXNhYmxlIHBhcmFsbGVsIHBhdGggcmM9JWRcbiIsIHJjKTsKK30KKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc21iMTM1NV9kcml2ZXIgPSB7CiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJCT0gInFjb20sc21iMTM1NS1jaGFyZ2VyIiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUJPSBtYXRjaF90YWJsZSwKIAl9LAotCS5wcm9iZQk9IHNtYjEzNTVfcHJvYmUsCi0JLnJlbW92ZQk9IHNtYjEzNTVfcmVtb3ZlLAorCS5wcm9iZQkJPSBzbWIxMzU1X3Byb2JlLAorCS5yZW1vdmUJCT0gc21iMTM1NV9yZW1vdmUsCisJLnNodXRkb3duCT0gc21iMTM1NV9zaHV0ZG93biwKIH07CiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNtYjEzNTVfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzV4LWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iMTM1eC1jaGFyZ2VyLmMKaW5kZXggODAzZGQ2ZS4uZWRjMDk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzV4LWNoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzNXgtY2hhcmdlci5jCkBAIC0yMjE4LDcgKzIyMTgsNyBAQAogCXJldHVybiAgKHJlZyAmIE9UR19FTikgPyAxIDogMDsKIH0KIAotc3RydWN0IHJlZ3VsYXRvcl9vcHMgc21iMTM1eF9jaGdfb3RnX3JlZ19vcHMgPSB7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgc21iMTM1eF9jaGdfb3RnX3JlZ19vcHMgPSB7CiAJLmVuYWJsZQkJPSBzbWIxMzV4X2NoZ19vdGdfcmVndWxhdG9yX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHNtYjEzNXhfY2hnX290Z19yZWd1bGF0b3JfZGlzYWJsZSwKIAkuaXNfZW5hYmxlZAk9IHNtYjEzNXhfY2hnX290Z19yZWd1bGF0b3JfaXNfZW5hYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzh4LWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb20vc21iMTM4eC1jaGFyZ2VyLmMKaW5kZXggMjBmMTgzOC4uMjhjMzUxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbS9zbWIxMzh4LWNoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tL3NtYjEzOHgtY2hhcmdlci5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAlkZWJ1Z19tYXNrLCBfX2RlYnVnX21hc2ssIGludCwgMDYwMAogKTsKIAotaXJxcmV0dXJuX3Qgc21iMTM4eF9oYW5kbGVfc2xhdmVfY2hnX3N0YXRlX2NoYW5nZShpbnQgaXJxLCB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IHNtYjEzOHhfaGFuZGxlX3NsYXZlX2NoZ19zdGF0ZV9jaGFuZ2UoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc21iX2lycV9kYXRhICppcnFfZGF0YSA9IGRhdGE7CiAJc3RydWN0IHNtYjEzOHggKmNoaXAgPSBpcnFfZGF0YS0+cGFyZW50X2RhdGE7CkBAIC0xNzAsNiArMTcwLDkgQEAKIAljaGlwLT5kdC5zdXNwZW5kX2lucHV0ID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsCiAJCQkJInFjb20sc3VzcGVuZC1pbnB1dCIpOwogCisJY2hnLT51c2VfZXh0Y29uID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsCisJCQkJInFjb20sdXNlLWV4dGNvbiIpOworCiAJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLAogCQkJCSJxY29tLGZjYy1tYXgtdWEiLCAmY2hpcC0+ZHQuZmNjX3VhKTsKIAlpZiAocmMgPCAwKQpAQCAtMjE1LDYgKzIxOCw3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfVFlQRUNfTU9ERSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9UWVBFQ19QT1dFUl9ST0xFLAogCVBPV0VSX1NVUFBMWV9QUk9QX1RZUEVDX0NDX09SSUVOVEFUSU9OLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NEUF9DVVJSRU5UX01BWCwKIH07CiAKIHN0YXRpYyBpbnQgc21iMTM4eF91c2JfZ2V0X3Byb3Aoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LApAQCAtMjQyLDcgKzI0Niw3IEBACiAJCXJjID0gc21ibGliX2dldF9wcm9wX3VzYl92b2x0YWdlX25vdyhjaGcsIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg6Ci0JCXJjID0gc21ibGliX2dldF9wcm9wX3VzYl9jdXJyZW50X21heChjaGcsIHZhbCk7CisJCXZhbC0+aW50dmFsID0gZ2V0X2VmZmVjdGl2ZV9yZXN1bHQoY2hnLT51c2JfaWNsX3ZvdGFibGUpOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RZUEU6CiAJCXZhbC0+aW50dmFsID0gY2hnLT51c2JfcHN5X2Rlc2MudHlwZTsKQEAgLTI1Niw2ICsyNjAsMTAgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RZUEVDX0NDX09SSUVOVEFUSU9OOgogCQlyYyA9IHNtYmxpYl9nZXRfcHJvcF90eXBlY19jY19vcmllbnRhdGlvbihjaGcsIHZhbCk7CiAJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0RQX0NVUlJFTlRfTUFYOgorCQl2YWwtPmludHZhbCA9IGdldF9jbGllbnRfdm90ZShjaGctPnVzYl9pY2xfdm90YWJsZSwKKwkJCQkJICAgICAgVVNCX1BTWV9WT1RFUik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiZ2V0IHByb3AgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgcHJvcCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjc4LDE4ICsyODYsMTIgQEAKIAlpbnQgcmMgPSAwOwogCiAJc3dpdGNoIChwcm9wKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKLQkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWluKGNoZywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKLQkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdXNiX3ZvbHRhZ2VfbWF4KGNoZywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWDoKLQkJcmMgPSBzbWJsaWJfc2V0X3Byb3BfdXNiX2N1cnJlbnRfbWF4KGNoZywgdmFsKTsKLQkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9UWVBFQ19QT1dFUl9ST0xFOgogCQlyYyA9IHNtYmxpYl9zZXRfcHJvcF90eXBlY19wb3dlcl9yb2xlKGNoZywgdmFsKTsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TRFBfQ1VSUkVOVF9NQVg6CisJCXJjID0gc21ibGliX3NldF9wcm9wX3NkcF9jdXJyZW50X21heChjaGcsIHZhbCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2Vycigic2V0IHByb3AgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgcHJvcCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzAxLDEzICszMDMsNiBAQAogc3RhdGljIGludCBzbWIxMzh4X3VzYl9wcm9wX2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCiAJCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wKQogewotCXN3aXRjaCAocHJvcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVFlQRUNfUE9XRVJfUk9MRToKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTczNSw3ICs3MzAsNyBAQAogICogVkJVUyBSRUdVTEFUT1IgUkVHSVNUUkFUSU9OICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjEzOHhfdmJ1c19yZWdfb3BzID0geworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjEzOHhfdmJ1c19yZWdfb3BzID0gewogCS5lbmFibGUJCT0gc21ibGliX3ZidXNfcmVndWxhdG9yX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHNtYmxpYl92YnVzX3JlZ3VsYXRvcl9kaXNhYmxlLAogCS5pc19lbmFibGVkCT0gc21ibGliX3ZidXNfcmVndWxhdG9yX2lzX2VuYWJsZWQsCkBAIC03NzcsNyArNzcyLDcgQEAKICAqIFZDT05OIFJFR1VMQVRPUiBSRUdJU1RSQVRJT04gKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHJlZ3VsYXRvcl9vcHMgc21iMTM4eF92Y29ubl9yZWdfb3BzID0geworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHNtYjEzOHhfdmNvbm5fcmVnX29wcyA9IHsKIAkuZW5hYmxlCQk9IHNtYmxpYl92Y29ubl9yZWd1bGF0b3JfZW5hYmxlLAogCS5kaXNhYmxlCT0gc21ibGliX3Zjb25uX3JlZ3VsYXRvcl9kaXNhYmxlLAogCS5pc19lbmFibGVkCT0gc21ibGliX3Zjb25uX3JlZ3VsYXRvcl9pc19lbmFibGVkLApAQCAtODcxLDYgKzg2NiwxMyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCisJLyogRGlzYWJsZSBPVEcgKi8KKwlyYyA9IHNtYmxpYl9tYXNrZWRfd3JpdGUoY2hnLCBDTURfT1RHX1JFRywgT1RHX0VOX0JJVCwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIkNvdWxkbid0IGRpc2FibGUgT1RHIHJjPSVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKIAkvKiBzdXNwZW5kIHBhcmFsbGVsIGNoYXJnaW5nICovCiAJcmMgPSBzbWIxMzh4X3NldF9wYXJhbGxlbF9zdXNwZW5kKGNoaXAsIHRydWUpOwogCWlmIChyYyA8IDApIHsKQEAgLTk3Niw2ICs5NzgsMjAgQEAKIAogCWNoZy0+ZGNwX2ljbF91YSA9IGNoaXAtPmR0LnVzYl9pY2xfdWE7CiAKKwkvKiBEaXNhYmxlIE9URyAqLworCXJjID0gc21ibGliX21hc2tlZF93cml0ZShjaGcsIENNRF9PVEdfUkVHLCBPVEdfRU5fQklULCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiQ291bGRuJ3QgZGlzYWJsZSBPVEcgcmM9JWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFVuc3VzcGVuZCBVU0IgaW5wdXQgKi8KKwlyYyA9IHNtYmxpYl9tYXNrZWRfd3JpdGUoY2hnLCBVU0JJTl9DTURfSUxfUkVHLCBVU0JJTl9TVVNQRU5EX0JJVCwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoIkNvdWxkbid0IHVuc3VzcGVuZCBVU0IsIHJjPSVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKIAkvKiBjb25maWd1cmUgdG8gYSBmaXhlZCA3MDBraHogZnJlcSB0byBhdm9pZCB0ZGllIGVycm9ycyAqLwogCXJjID0gc21ibGliX3NldF9jaGFyZ2VfcGFyYW0oY2hnLCAmY2hnLT5wYXJhbS5mcmVxX2J1Y2ssIDcwMCk7CiAJaWYgKHJjIDwgMCkgewpAQCAtMTM5Miw1NSArMTQwOCw5NSBAQAogCXJjID0gc21iMTM4eF9wYXJzZV9kdChjaGlwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiQ291bGRuJ3QgcGFyc2UgZGV2aWNlIHRyZWUgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJcmMgPSBzbWIxMzh4X2luaXRfdmJ1c19yZWd1bGF0b3IoY2hpcCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkNvdWxkbid0IGluaXRpYWxpemUgdmJ1cyByZWd1bGF0b3IgcmM9JWRcbiIsCiAJCQlyYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCXJjID0gc21iMTM4eF9pbml0X3Zjb25uX3JlZ3VsYXRvcihjaGlwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiQ291bGRuJ3QgaW5pdGlhbGl6ZSB2Y29ubiByZWd1bGF0b3IgcmM9JWRcbiIsCiAJCQlyYyk7Ci0JCXJldHVybiByYzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChjaGctPnVzZV9leHRjb24pIHsKKwkJLyogZXh0Y29uIHJlZ2lzdHJhdGlvbiAqLworCQljaGctPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShjaGctPmRldiwKKwkJCQkJCQlzbWJsaWJfZXh0Y29uX2NhYmxlKTsKKwkJaWYgKElTX0VSUihjaGctPmV4dGNvbikpIHsKKwkJCXJjID0gUFRSX0VSUihjaGctPmV4dGNvbik7CisJCQlkZXZfZXJyKGNoZy0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGV4dGNvbiBkZXZpY2UgcmM9JWRcbiIsCisJCQkJCXJjKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWNoZy0+ZXh0Y29uLT5tdXR1YWxseV9leGNsdXNpdmUgPSBzbWJsaWJfZXh0Y29uX2V4Y2x1c2l2ZTsKKwkJcmMgPSBkZXZtX2V4dGNvbl9kZXZfcmVnaXN0ZXIoY2hnLT5kZXYsIGNoZy0+ZXh0Y29uKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJZGV2X2VycihjaGctPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gZGV2aWNlIHJjPSVkXG4iLAorCQkJCQkJcmMpOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogU3VwcG9ydCByZXBvcnRpbmcgcG9sYXJpdHkgYW5kIHNwZWVkIHZpYSBwcm9wZXJ0aWVzICovCisJCXJjID0gZXh0Y29uX3NldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KGNoZy0+ZXh0Y29uLAorCQkJCUVYVENPTl9VU0IsIEVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWSk7CisJCXJjIHw9IGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eShjaGctPmV4dGNvbiwKKwkJCQlFWFRDT05fVVNCLCBFWFRDT05fUFJPUF9VU0JfU1MpOworCQlyYyB8PSBleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoY2hnLT5leHRjb24sCisJCQkJRVhUQ09OX1VTQl9IT1NULAorCQkJCUVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWSk7CisJCXJjIHw9IGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eShjaGctPmV4dGNvbiwKKwkJCQlFWFRDT05fVVNCX0hPU1QsIEVYVENPTl9QUk9QX1VTQl9TUyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoY2hnLT5kZXYsCisJCQkJImZhaWxlZCB0byBjb25maWd1cmUgZXh0Y29uIGNhcGFiaWxpdGllc1xuIik7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAl9CiAKIAlyYyA9IHNtYjEzOHhfaW5pdF91c2JfcHN5KGNoaXApOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJDb3VsZG4ndCBpbml0aWFsaXplIHVzYiBwc3kgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJcmMgPSBzbWIxMzh4X2luaXRfYmF0dF9wc3koY2hpcCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkNvdWxkbid0IGluaXRpYWxpemUgYmF0dCBwc3kgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJcmMgPSBzbWIxMzh4X2luaXRfaHcoY2hpcCk7CiAJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoIkNvdWxkbid0IGluaXRpYWxpemUgaGFyZHdhcmUgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJcmMgPSBzbWIxMzh4X2RldGVybWluZV9pbml0aWFsX3N0YXR1cyhjaGlwKTsKIAlpZiAocmMgPCAwKSB7CiAJCXByX2VycigiQ291bGRuJ3QgZGV0ZXJtaW5lIGluaXRpYWwgc3RhdHVzIHJjPSVkXG4iLAogCQkJcmMpOwotCQlyZXR1cm4gcmM7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlyYyA9IHNtYjEzOHhfcmVxdWVzdF9pbnRlcnJ1cHRzKGNoaXApOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJDb3VsZG4ndCByZXF1ZXN0IGludGVycnVwdHMgcmM9JWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJcmV0dXJuIHJjOworCitjbGVhbnVwOgorCXNtYmxpYl9kZWluaXQoY2hnKTsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgc21iMTM4eF9zbGF2ZV9wcm9iZShzdHJ1Y3Qgc21iMTM4eCAqY2hpcCkKQEAgLTE2MTYsMTQgKzE2NzIsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc21iMTM4eF9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbWIxMzh4ICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNtYl9jaGFyZ2VyICpjaGcgPSAmY2hpcC0+Y2hnOworCWludCByYzsKKworCS8qIFN1c3BlbmQgY2hhcmdpbmcgKi8KKwlyYyA9IHNtYjEzOHhfc2V0X3BhcmFsbGVsX3N1c3BlbmQoY2hpcCwgdHJ1ZSk7CisJaWYgKHJjIDwgMCkKKwkJcHJfZXJyKCJDb3VsZG4ndCBzdXNwZW5kIGNoYXJnaW5nIHJjPSVkXG4iLCByYyk7CisKKwkvKiBEaXNhYmxlIE9URyAqLworCXJjID0gc21ibGliX21hc2tlZF93cml0ZShjaGcsIENNRF9PVEdfUkVHLCBPVEdfRU5fQklULCAwKTsKKwlpZiAocmMgPCAwKQorCQlwcl9lcnIoIkNvdWxkbid0IGRpc2FibGUgT1RHIHJjPSVkXG4iLCByYyk7CisKK30KKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc21iMTM4eF9kcml2ZXIgPSB7CiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUJCT0gInFjb20sc21iMTM4eC1jaGFyZ2VyIiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUJPSBtYXRjaF90YWJsZSwKIAl9LAotCS5wcm9iZQk9IHNtYjEzOHhfcHJvYmUsCi0JLnJlbW92ZQk9IHNtYjEzOHhfcmVtb3ZlLAorCS5wcm9iZQkJPSBzbWIxMzh4X3Byb2JlLAorCS5yZW1vdmUJCT0gc21iMTM4eF9yZW1vdmUsCisJLnNodXRkb3duCT0gc21iMTM4eF9zaHV0ZG93biwKIH07CiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNtYjEzOHhfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wd20vcHdtLXFwbnAuYyBiL2RyaXZlcnMvcHdtL3B3bS1xcG5wLmMKaW5kZXggODZmMDhkMi4uZTcyNjdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wd20vcHdtLXFwbnAuYworKysgYi9kcml2ZXJzL3B3bS9wd20tcXBucC5jCkBAIC0zMTcsNiArMzE3LDcgQEAKIAlzdHJ1Y3QgcHdtX3BlcmlvZF9jb25maWcJcGVyaW9kOwogCWludAkJCQlzdXBwb3J0ZWRfc2l6ZXM7CiAJaW50CQkJCWZvcmNlX3B3bV9zaXplOworCWJvb2wJCQkJdXBkYXRlX3BlcmlvZDsKIH07CiAKIC8qIFB1YmxpYyBmYWNpbmcgc3RydWN0dXJlICovCkBAIC0zMjcsNiArMzI4LDcgQEAKIAlib29sCQkJZW5hYmxlZDsKIAlzdHJ1Y3QgX3FwbnBfcHdtX2NvbmZpZwlwd21fY29uZmlnOwogCXN0cnVjdAlxcG5wX2xwZ19jb25maWcJbHBnX2NvbmZpZzsKKwllbnVtIHBtX3B3bV9tb2RlCXB3bV9tb2RlOwogCXNwaW5sb2NrX3QJCWxwZ19sb2NrOwogCWVudW0gcXBucF9scGdfcmV2aXNpb24JcmV2aXNpb247CiAJdTgJCQlzdWJfdHlwZTsKQEAgLTEyMTEsMjggKzEyMTMsMzIgQEAKIAlyYyA9IHFwbnBfbHBnX3NhdmVfcHdtX3ZhbHVlKGNoaXApOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JcmMgPSBxcG5wX2xwZ19jb25maWd1cmVfcHdtKGNoaXApOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0JcmMgPSBxcG5wX2NvbmZpZ3VyZV9wd21fY29udHJvbChjaGlwKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwogCi0JaWYgKCFyYyAmJiBjaGlwLT5lbmFibGVkKSB7Ci0JCXJjID0gcXBucF9scGdfY29uZmlndXJlX3B3bV9zdGF0ZShjaGlwLCBRUE5QX1BXTV9FTkFCTEUpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiRXJyb3IgaW4gY29uZmlndXJpbmcgcHdtIHN0YXRlLCByYz0lZFxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9CisJaWYgKHB3bV9jb25maWctPnVwZGF0ZV9wZXJpb2QpIHsKKwkJcmMgPSBxcG5wX2xwZ19jb25maWd1cmVfcHdtKGNoaXApOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwkJcmMgPSBxcG5wX2NvbmZpZ3VyZV9wd21fY29udHJvbChjaGlwKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCWlmICghcmMgJiYgY2hpcC0+ZW5hYmxlZCkgeworCQkJcmMgPSBxcG5wX2xwZ19jb25maWd1cmVfcHdtX3N0YXRlKGNoaXAsCisJCQkJCVFQTlBfUFdNX0VOQUJMRSk7CisJCQlpZiAocmMpIHsKKwkJCQlwcl9lcnIoIkVycm9yIGluIGNvbmZpZ3VyaW5nIHB3bSBzdGF0ZSwgcmM9JWRcbiIsCisJCQkJCQlyYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQogCi0JCS8qIEVuYWJsZSB0aGUgZ2xpdGNoIHJlbW92YWwgYWZ0ZXIgUFdNIGlzIGVuYWJsZWQgKi8KLQkJcmMgPSBxcG5wX2xwZ19nbGl0Y2hfcmVtb3ZhbChjaGlwLCB0cnVlKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIkVycm9yIGluIGVuYWJsaW5nIGdsaXRjaCBjb250cm9sLCByYz0lZFxuIiwgcmMpOwotCQkJcmV0dXJuIHJjOworCQkJLyogRW5hYmxlIHRoZSBnbGl0Y2ggcmVtb3ZhbCBhZnRlciBQV00gaXMgZW5hYmxlZCAqLworCQkJcmMgPSBxcG5wX2xwZ19nbGl0Y2hfcmVtb3ZhbChjaGlwLCB0cnVlKTsKKwkJCWlmIChyYykgeworCQkJCXByX2VycigiRXJyb3IgaW4gZW5hYmxpbmcgZ2xpdGNoIGNvbnRyb2wsIHJjPSVkXG4iLAorCQkJCQkJcmMpOworCQkJCXJldHVybiByYzsKKwkJCX0KIAkJfQogCX0KLQogCXByX2RlYnVnKCJkdXR5L3BlcmlvZD0ldS8ldSAlczogcHdtX3ZhbHVlPSVkIChvZiAlZClcbiIsCiAJCSAodW5zaWduZWQgaW50KWR1dHlfdmFsdWUsICh1bnNpZ25lZCBpbnQpcGVyaW9kX3ZhbHVlLAogCQkgKHRtX2x2bCA9PSBMVkxfVVNFQykgPyAidXNlYyIgOiAibnNlYyIsCkBAIC0xMzA5LDEyICsxMzE1LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBscGdfbG9jayBzaG91bGQgYmUgaGVsZCB3aGlsZSBjYWxsaW5nIF9wd21fZW5hYmxlKCkgKi8KIHN0YXRpYyBpbnQgX3B3bV9lbmFibGUoc3RydWN0IHFwbnBfcHdtX2NoaXAgKmNoaXApCiB7CiAJaW50IHJjID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxwZ19sb2NrLCBmbGFncyk7CiAKIAlpZiAoUVBOUF9JU19QV01fQ09ORklHX1NFTEVDVEVEKAogCQljaGlwLT5xcG5wX2xwZ19yZWdpc3RlcnNbUVBOUF9FTkFCTEVfQ09OVFJPTF0pIHx8CkBAIC0xMzI3LDggKzEzMzEsMjEgQEAKIAlpZiAoIXJjKQogCQljaGlwLT5lbmFibGVkID0gdHJ1ZTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxwZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQogCisvKiBscGdfbG9jayBzaG91bGQgYmUgaGVsZCB3aGlsZSBjYWxsaW5nIF9wd21fY2hhbmdlX21vZGUoKSAqLworc3RhdGljIGludCBfcHdtX2NoYW5nZV9tb2RlKHN0cnVjdCBxcG5wX3B3bV9jaGlwICpjaGlwLCBlbnVtIHBtX3B3bV9tb2RlIG1vZGUpCit7CisJaW50IHJjOworCisJaWYgKG1vZGUgPT0gUE1fUFdNX01PREVfTFBHKQorCQlyYyA9IHFwbnBfY29uZmlndXJlX2xwZ19jb250cm9sKGNoaXApOworCWVsc2UKKwkJcmMgPSBxcG5wX2NvbmZpZ3VyZV9wd21fY29udHJvbChjaGlwKTsKKworCWlmIChyYykKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY2hhbmdlIHRoZSBtb2RlXG4iKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEzNzUsMTIgKzEzOTIsMTQgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5scGdfbG9jaywgZmxhZ3MpOwogCisJY2hpcC0+cHdtX2NvbmZpZy51cGRhdGVfcGVyaW9kID0gZmFsc2U7CiAJaWYgKHByZXZfcGVyaW9kX3VzID4gSU5UX01BWCAvIE5TRUNfUEVSX1VTRUMgfHwKIAkJCXByZXZfcGVyaW9kX3VzICogTlNFQ19QRVJfVVNFQyAhPSBwZXJpb2RfbnMpIHsKIAkJcXBucF9scGdfY2FsY19wZXJpb2QoTFZMX05TRUMsIHBlcmlvZF9ucywgY2hpcCk7CiAJCXFwbnBfbHBnX3NhdmVfcGVyaW9kKGNoaXApOwogCQlwd20tPnN0YXRlLnBlcmlvZCA9IHBlcmlvZF9uczsKIAkJY2hpcC0+cHdtX2NvbmZpZy5wd21fcGVyaW9kID0gcGVyaW9kX25zIC8gTlNFQ19QRVJfVVNFQzsKKwkJY2hpcC0+cHdtX2NvbmZpZy51cGRhdGVfcGVyaW9kID0gdHJ1ZTsKIAl9CiAKIAlyYyA9IF9wd21fY29uZmlnKGNoaXAsIExWTF9OU0VDLCBkdXR5X25zLCBwZXJpb2RfbnMpOwpAQCAtMTQwMywxMSArMTQyMiwxNSBAQAogewogCWludCByYzsKIAlzdHJ1Y3QgcXBucF9wd21fY2hpcCAqY2hpcCA9IHFwbnBfcHdtX2Zyb21fcHdtX2NoaXAocHdtX2NoaXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bHBnX2xvY2ssIGZsYWdzKTsKIAlyYyA9IF9wd21fZW5hYmxlKGNoaXApOwogCWlmIChyYykKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIFBXTSBjaGFubmVsOiAlZFxuIiwgY2hpcC0+Y2hhbm5lbF9pZCk7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5scGdfbG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDQ1LDIwICsxNDY4LDYgQEAKIAkJCQkJY2hpcC0+Y2hhbm5lbF9pZCk7CiB9CiAKLXN0YXRpYyBpbnQgX3B3bV9jaGFuZ2VfbW9kZShzdHJ1Y3QgcXBucF9wd21fY2hpcCAqY2hpcCwgZW51bSBwbV9wd21fbW9kZSBtb2RlKQotewotCWludCByYzsKLQotCWlmIChtb2RlKQotCQlyYyA9IHFwbnBfY29uZmlndXJlX2xwZ19jb250cm9sKGNoaXApOwotCWVsc2UKLQkJcmMgPSBxcG5wX2NvbmZpZ3VyZV9wd21fY29udHJvbChjaGlwKTsKLQotCWlmIChyYykKLQkJcHJfZXJyKCJGYWlsZWQgdG8gY2hhbmdlIHRoZSBtb2RlXG4iKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIC8qKgogICogcHdtX2NoYW5nZV9tb2RlIC0gQ2hhbmdlIHRoZSBQV00gbW9kZSBjb25maWd1cmF0aW9uCiAgKiBAcHdtOiB0aGUgUFdNIGRldmljZQpAQCAtMTQ2Niw3ICsxNDc1LDcgQEAKICAqLwogaW50IHB3bV9jaGFuZ2VfbW9kZShzdHJ1Y3QgcHdtX2RldmljZSAqcHdtLCBlbnVtIHBtX3B3bV9tb2RlIG1vZGUpCiB7Ci0JaW50IHJjOworCWludCByYyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcXBucF9wd21fY2hpcCAqY2hpcDsKIApAQCAtMTQ4Myw3ICsxNDkyLDIyIEBACiAJY2hpcCA9IHFwbnBfcHdtX2Zyb21fcHdtX2Rldihwd20pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxwZ19sb2NrLCBmbGFncyk7Ci0JcmMgPSBfcHdtX2NoYW5nZV9tb2RlKGNoaXAsIG1vZGUpOworCWlmIChjaGlwLT5wd21fbW9kZSAhPSBtb2RlKSB7CisJCXJjID0gX3B3bV9jaGFuZ2VfbW9kZShjaGlwLCBtb2RlKTsKKwkJaWYgKHJjKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBjaGFuZ2UgbW9kZTogJWQsIHJjPSVkXG4iLCBtb2RlLCByYyk7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCQljaGlwLT5wd21fbW9kZSA9IG1vZGU7CisJCWlmIChjaGlwLT5lbmFibGVkKSB7CisJCQlyYyA9IF9wd21fZW5hYmxlKGNoaXApOworCQkJaWYgKHJjKSB7CisJCQkJcHJfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIFBXTSwgcmM9JWRcbiIsIHJjKTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKwkJfQorCX0KK3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5scGdfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJjOwpAQCAtMTYxOSw2ICsxNjQzLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5scGdfbG9jaywgZmxhZ3MpOwogCisJY2hpcC0+cHdtX2NvbmZpZy51cGRhdGVfcGVyaW9kID0gZmFsc2U7CiAJaWYgKGNoaXAtPnB3bV9jb25maWcucHdtX3BlcmlvZCAhPSBwZXJpb2RfdXMpIHsKIAkJcXBucF9scGdfY2FsY19wZXJpb2QoTFZMX1VTRUMsIHBlcmlvZF91cywgY2hpcCk7CiAJCXFwbnBfbHBnX3NhdmVfcGVyaW9kKGNoaXApOwpAQCAtMTYyOSw2ICsxNjU0LDcgQEAKIAkJZWxzZQogCQkJcHdtLT5zdGF0ZS5wZXJpb2QKIAkJCQk9ICh1bnNpZ25lZCBpbnQpcGVyaW9kX3VzICogTlNFQ19QRVJfVVNFQzsKKwkJY2hpcC0+cHdtX2NvbmZpZy51cGRhdGVfcGVyaW9kID0gdHJ1ZTsKIAl9CiAKIAlyYyA9IF9wd21fY29uZmlnKGNoaXAsIExWTF9VU0VDLCBkdXR5X3VzLCBwZXJpb2RfdXMpOwpAQCAtMTczNSw2ICsxNzYxLDcgQEAKIAlxcG5wX2xwZ19jYWxjX3BlcmlvZChMVkxfVVNFQywgcGVyaW9kLCBjaGlwKTsKIAlxcG5wX2xwZ19zYXZlX3BlcmlvZChjaGlwKTsKIAljaGlwLT5wd21fY29uZmlnLnB3bV9wZXJpb2QgPSBwZXJpb2Q7CisJY2hpcC0+cHdtX2NvbmZpZy51cGRhdGVfcGVyaW9kID0gdHJ1ZTsKIAogCXJjID0gX3B3bV9jb25maWcoY2hpcCwgTFZMX1VTRUMsIGNoaXAtPnB3bV9jb25maWcucHdtX2R1dHksIHBlcmlvZCk7CiAKQEAgLTE4ODUsNyArMTkxMiw3IEBACiBzdGF0aWMgaW50IHFwbnBfcGFyc2VfZHRfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkJCXN0cnVjdCBxcG5wX3B3bV9jaGlwICpjaGlwKQogewotCWludAkJCXJjLCBlbmFibGUsIGx1dF9lbnRyeV9zaXplLCBsaXN0X3NpemUsIGk7CisJaW50CQkJcmMsIG1vZGUsIGx1dF9lbnRyeV9zaXplLCBsaXN0X3NpemUsIGk7CiAJY29uc3QgY2hhcgkJKmxhYmVsOwogCWNvbnN0IF9fYmUzMgkJKnByb3A7CiAJdTMyCQkJc2l6ZTsKQEAgLTIwNjksMTggKzIwOTYsMjAgQEAKIAkJfQogCX0KIAotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInFjb20sbW9kZS1zZWxlY3QiLCAmZW5hYmxlKTsKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLG1vZGUtc2VsZWN0IiwgJm1vZGUpOwogCWlmIChyYykKIAkJZ290byByZWFkX29wdF9wcm9wczsKIAotCWlmICgoZW5hYmxlID09IFBNX1BXTV9NT0RFX1BXTSAmJiBmb3VuZF9wd21fc3Vibm9kZSA9PSAwKSB8fAotCQkoZW5hYmxlID09IFBNX1BXTV9NT0RFX0xQRyAmJiBmb3VuZF9scGdfc3Vibm9kZSA9PSAwKSkgeworCWlmIChtb2RlID4gUE1fUFdNX01PREVfTFBHIHx8CisJCShtb2RlID09IFBNX1BXTV9NT0RFX1BXTSAmJiBmb3VuZF9wd21fc3Vibm9kZSA9PSAwKSB8fAorCQkobW9kZSA9PSBQTV9QV01fTU9ERV9MUEcgJiYgZm91bmRfbHBnX3N1Ym5vZGUgPT0gMCkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEludmFsaWQgbW9kZSBzZWxlY3RcbiIsIF9fZnVuY19fKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKLQlfcHdtX2NoYW5nZV9tb2RlKGNoaXAsIGVuYWJsZSk7CisJY2hpcC0+cHdtX21vZGUgPSBtb2RlOworCV9wd21fY2hhbmdlX21vZGUoY2hpcCwgbW9kZSk7CiAJX3B3bV9lbmFibGUoY2hpcCk7CiAKIHJlYWRfb3B0X3Byb3BzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwppbmRleCA5ZDI1M2NiLi5lNzA0MTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwpAQCAtNjQsOSArNjQsOSBAQAogdTMyCWJmaV9pbWFnZV9jYl9zaXplLCBiZmlfaW1hZ2VfY3Rfc2l6ZSwgYmZpX2ltYWdlX2N0Ml9zaXplOwogdTMyCSpiZmlfaW1hZ2VfY2IsICpiZmlfaW1hZ2VfY3QsICpiZmlfaW1hZ2VfY3QyOwogCi0jZGVmaW5lIEJGQURfRldfRklMRV9DQgkJImNiZnctMy4yLjMuMC5iaW4iCi0jZGVmaW5lIEJGQURfRldfRklMRV9DVAkJImN0ZnctMy4yLjMuMC5iaW4iCi0jZGVmaW5lIEJGQURfRldfRklMRV9DVDIJImN0MmZ3LTMuMi4zLjAuYmluIgorI2RlZmluZSBCRkFEX0ZXX0ZJTEVfQ0IJCSJjYmZ3LTMuMi41LjEuYmluIgorI2RlZmluZSBCRkFEX0ZXX0ZJTEVfQ1QJCSJjdGZ3LTMuMi41LjEuYmluIgorI2RlZmluZSBCRkFEX0ZXX0ZJTEVfQ1QyCSJjdDJmdy0zLjIuNS4xLmJpbiIKIAogc3RhdGljIHUzMiAqYmZhZF9sb2FkX2Z3aW1nKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIHN0YXRpYyB2b2lkIGJmYWRfZnJlZV9md2ltZyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaAppbmRleCBmOWU4NjIwLi5jZmNmZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCkBAIC01OCw3ICs1OCw3IEBACiAjaWZkZWYgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZWxzZQotI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgICIzLjIuMjUuMCIKKyNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICAiMy4yLjI1LjEiCiAjZW5kaWYKIAogI2RlZmluZSBCRkFEX1BST1RPX05BTUUgRkNQSV9OQU1FCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljLmggYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljLmgKaW5kZXggOWRkYzkyMC4uOWU0Yjc3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2ZuaWMvZm5pYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9mbmljL2ZuaWMuaApAQCAtMjQ4LDYgKzI0OCw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gKnJlbW92ZV93YWl0OyAvKiBkZXZpY2UgcmVtb3ZlIHRocmVhZCBibG9ja3MgKi8KIAogCWF0b21pY190IGluX2ZsaWdodDsJCS8qIGlvIGNvdW50ZXIgKi8KKwlib29sIGludGVybmFsX3Jlc2V0X2lucHJvZ3Jlc3M7CiAJdTMyIF9yZXNlcnZlZDsJCQkvKiBmaWxsIGhvbGUgKi8KIAl1bnNpZ25lZCBsb25nIHN0YXRlX2ZsYWdzOwkvKiBwcm90ZWN0ZWQgYnkgaG9zdCBsb2NrICovCiAJZW51bSBmbmljX3N0YXRlIHN0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2ZuaWMvZm5pY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYwppbmRleCBkOWZkMmY4Li40NGRkMzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvZm5pYy9mbmljX3Njc2kuYwpAQCAtMjU3Myw2ICsyNTczLDE5IEBACiAJdW5zaWduZWQgbG9uZyB3YWl0X2hvc3RfdG1vOwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2MtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc3RydWN0IGZuaWMgKmZuaWMgPSBscG9ydF9wcml2KGxwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOworCWlmIChmbmljLT5pbnRlcm5hbF9yZXNldF9pbnByb2dyZXNzID09IDApIHsKKwkJZm5pYy0+aW50ZXJuYWxfcmVzZXRfaW5wcm9ncmVzcyA9IDE7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CisJCUZOSUNfU0NTSV9EQkcoS0VSTl9ERUJVRywgZm5pYy0+bHBvcnQtPmhvc3QsCisJCQkiaG9zdCByZXNldCBpbiBwcm9ncmVzcyBza2lwcGluZyBhbm90aGVyIGhvc3QgcmVzZXRcbiIpOworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZm5pYy0+Zm5pY19sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIElmIGZuaWNfcmVzZXQgaXMgc3VjY2Vzc2Z1bCwgd2FpdCBmb3IgZmFicmljIGxvZ2luIHRvIGNvbXBsZXRlCkBAIC0yNTkzLDYgKzI2MDYsOSBAQAogCQl9CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOworCWZuaWMtPmludGVybmFsX3Jlc2V0X2lucHJvZ3Jlc3MgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZuaWMtPmZuaWNfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuYyBiL2RyaXZlcnMvc2NzaS9pc2NpL3JlbW90ZV9ub2RlX2NvbnRleHQuYwppbmRleCAxOTEwMTAwLi4wMDYwMmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXNjaS9yZW1vdGVfbm9kZV9jb250ZXh0LmMKKysrIGIvZHJpdmVycy9zY3NpL2lzY2kvcmVtb3RlX25vZGVfY29udGV4dC5jCkBAIC02Niw2ICs2Niw5IEBACiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10gPSBSTkNfU1RBVEVTOwogCisJaWYgKHN0YXRlID49IEFSUkFZX1NJWkUoc3RyaW5ncykpCisJCXJldHVybiAiVU5LTk9XTiI7CisKIAlyZXR1cm4gc3RyaW5nc1tzdGF0ZV07CiB9CiAjdW5kZWYgQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggYWQzMzIzOC4uOGM0NjQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC0yNDMsMTIgKzI0MywxNSBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXNzaXplX3QgcnZhbCA9IDA7CiAKLQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcpCi0JCXJldHVybiAwOwotCiAJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CisKKwlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1JFQURJTkcpCisJCWdvdG8gb3V0OworCiAJcnZhbCA9IG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIGhhLT5vcHRyb21fYnVmZmVyLAogCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKKworb3V0OgogCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI2MywxNCArMjY2LDE5IEBACiAJICAgIHN0cnVjdCBkZXZpY2UsIGtvYmopKSk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpCisJbXV0ZXhfbG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CisKKwlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dSSVRJTkcpIHsKKwkJbXV0ZXhfdW5sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKG9mZiA+IGhhLT5vcHRyb21fcmVnaW9uX3NpemUpCisJfQorCWlmIChvZmYgPiBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKSB7CisJCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAJCXJldHVybiAtRVJBTkdFOworCX0KIAlpZiAob2ZmICsgY291bnQgPiBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKQogCQljb3VudCA9IGhhLT5vcHRyb21fcmVnaW9uX3NpemUgLSBvZmY7CiAKLQltdXRleF9sb2NrKCZoYS0+b3B0cm9tX211dGV4KTsKIAltZW1jcHkoJmhhLT5vcHRyb21fYnVmZmVyW29mZl0sIGJ1ZiwgY291bnQpOwogCW11dGV4X3VubG9jaygmaGEtPm9wdHJvbV9tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggNDRjNDY2Yi4uNGJkNmZkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCXN0cnVjdCBzZ19kZXZpY2UgKnBhcmVudGRwOwkvKiBvd25pbmcgZGV2aWNlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0OwkvKiBxdWV1ZSByZWFkIHVudGlsIGNvbW1hbmQgZG9uZSAqLwogCXJ3bG9ja190IHJxX2xpc3RfbG9jazsJLyogcHJvdGVjdCBhY2Nlc3MgdG8gbGlzdCBpbiByZXFfYXJyICovCisJc3RydWN0IG11dGV4IGZfbXV0ZXg7CS8qIHByb3RlY3QgYWdhaW5zdCBjaGFuZ2VzIGluIHRoaXMgZmQgKi8KIAlpbnQgdGltZW91dDsJCS8qIGRlZmF1bHRzIHRvIFNHX0RFRkFVTFRfVElNRU9VVCAgICAgICovCiAJaW50IHRpbWVvdXRfdXNlcjsJLyogZGVmYXVsdHMgdG8gU0dfREVGQVVMVF9USU1FT1VUX1VTRVIgKi8KIAlTZ19zY2F0dGVyX2hvbGQgcmVzZXJ2ZTsJLyogYnVmZmVyIGhlbGQgZm9yIHRoaXMgZmlsZSBkZXNjcmlwdG9yICovCkBAIC0xNTUsNiArMTU2LDcgQEAKIAl1bnNpZ25lZCBjaGFyIG5leHRfY21kX2xlbjsgLyogMDogYXV0b21hdGljLCA+MDogdXNlIG9uIG5leHQgd3JpdGUoKSAqLwogCWNoYXIga2VlcF9vcnBoYW47CS8qIDAgLT4gZHJvcCBvcnBoYW4gKGRlZiksIDEgLT4ga2VlcCBmb3IgcmVhZCgpICovCiAJY2hhciBtbWFwX2NhbGxlZDsJLyogMCAtPiBtbWFwKCkgbmV2ZXIgY2FsbGVkIG9uIHRoaXMgZmQgKi8KKwljaGFyIHJlc19pbl91c2U7CS8qIDEgLT4gJ3Jlc2VydmUnIGFycmF5IGluIHVzZSAqLwogCXN0cnVjdCBrcmVmIGZfcmVmOwogCXN0cnVjdCBleGVjdXRlX3dvcmsgZXc7CiB9IFNnX2ZkOwpAQCAtMTk4LDcgKzIwMCw2IEBACiBzdGF0aWMgU2dfcmVxdWVzdCAqc2dfZ2V0X3JxX21hcmsoU2dfZmQgKiBzZnAsIGludCBwYWNrX2lkKTsKIHN0YXRpYyBTZ19yZXF1ZXN0ICpzZ19hZGRfcmVxdWVzdChTZ19mZCAqIHNmcCk7CiBzdGF0aWMgaW50IHNnX3JlbW92ZV9yZXF1ZXN0KFNnX2ZkICogc2ZwLCBTZ19yZXF1ZXN0ICogc3JwKTsKLXN0YXRpYyBpbnQgc2dfcmVzX2luX3VzZShTZ19mZCAqIHNmcCk7CiBzdGF0aWMgU2dfZGV2aWNlICpzZ19nZXRfZGV2KGludCBkZXYpOwogc3RhdGljIHZvaWQgc2dfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpOwogCkBAIC00OTksNyArNTAwLDcgQEAKIAkJb2xkX2hkci0+cmVzdWx0ID0gRUlPOwogCQlicmVhazsKIAljYXNlIERJRF9FUlJPUjoKLQkJb2xkX2hkci0+cmVzdWx0ID0gKHNycC0+c2Vuc2VfYlswXSA9PSAwICYmIAorCQlvbGRfaGRyLT5yZXN1bHQgPSAoc3JwLT5zZW5zZV9iWzBdID09IDAgJiYKIAkJCQkgIGhwLT5tYXNrZWRfc3RhdHVzID09IEdPT0QpID8gMCA6IEVJTzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTYxNCw2ICs2MTUsNyBAQAogCX0KIAlidWYgKz0gU1pfU0dfSEVBREVSOwogCV9fZ2V0X3VzZXIob3Bjb2RlLCBidWYpOworCW11dGV4X2xvY2soJnNmcC0+Zl9tdXRleCk7CiAJaWYgKHNmcC0+bmV4dF9jbWRfbGVuID4gMCkgewogCQljbWRfc2l6ZSA9IHNmcC0+bmV4dF9jbWRfbGVuOwogCQlzZnAtPm5leHRfY21kX2xlbiA9IDA7CS8qIHJlc2V0IHNvIG9ubHkgdGhpcyB3cml0ZSgpIGVmZmVjdGVkICovCkBAIC02MjIsNiArNjI0LDcgQEAKIAkJaWYgKChvcGNvZGUgPj0gMHhjMCkgJiYgb2xkX2hkci50d2VsdmVfYnl0ZSkKIAkJCWNtZF9zaXplID0gMTI7CiAJfQorCW11dGV4X3VubG9jaygmc2ZwLT5mX211dGV4KTsKIAlTQ1NJX0xPR19USU1FT1VUKDQsIHNnX3ByaW50ayhLRVJOX0lORk8sIHNkcCwKIAkJInNnX3dyaXRlOiAgIHNjc2kgb3Bjb2RlPTB4JTAyeCwgY21kX3NpemU9JWRcbiIsIChpbnQpIG9wY29kZSwgY21kX3NpemUpKTsKIC8qIERldGVybWluZSBidWZmZXIgc2l6ZS4gICovCkBAIC03MjEsNyArNzI0LDcgQEAKIAkJCXNnX3JlbW92ZV9yZXF1ZXN0KHNmcCwgc3JwKTsKIAkJCXJldHVybiAtRUlOVkFMOwkvKiBlaXRoZXIgTU1BUF9JTyBvciBESVJFQ1RfSU8gKG5vdCBib3RoKSAqLwogCQl9Ci0JCWlmIChzZ19yZXNfaW5fdXNlKHNmcCkpIHsKKwkJaWYgKHNmcC0+cmVzX2luX3VzZSkgewogCQkJc2dfcmVtb3ZlX3JlcXVlc3Qoc2ZwLCBzcnApOwogCQkJcmV0dXJuIC1FQlVTWTsJLyogcmVzZXJ2ZSBidWZmZXIgYWxyZWFkeSBiZWluZyB1c2VkICovCiAJCX0KQEAgLTg1Niw4ICs4NTksMTAgQEAKIAkJCXJldHVybiAtRU5YSU87CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcCwgU1pfU0dfSU9fSERSKSkKIAkJCXJldHVybiAtRUZBVUxUOworCQltdXRleF9sb2NrKCZzZnAtPnBhcmVudGRwLT5vcGVuX3JlbF9sb2NrKTsKIAkJcmVzdWx0ID0gc2dfbmV3X3dyaXRlKHNmcCwgZmlscCwgcCwgU1pfU0dfSU9fSERSLAogCQkJCSAxLCByZWFkX29ubHksIDEsICZzcnApOworCQltdXRleF91bmxvY2soJnNmcC0+cGFyZW50ZHAtPm9wZW5fcmVsX2xvY2spOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCXJldHVybiByZXN1bHQ7CiAJCXJlc3VsdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZnAtPnJlYWRfd2FpdCwKQEAgLTg5NiwxMCArOTAxLDEyIEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQlpZiAodmFsKSB7CiAJCQlzZnAtPmxvd19kbWEgPSAxOwotCQkJaWYgKCgwID09IHNmcC0+bG93X2RtYSkgJiYgKDAgPT0gc2dfcmVzX2luX3VzZShzZnApKSkgeworCQkJaWYgKCgwID09IHNmcC0+bG93X2RtYSkgJiYgIXNmcC0+cmVzX2luX3VzZSkgewogCQkJCXZhbCA9IChpbnQpIHNmcC0+cmVzZXJ2ZS5idWZmbGVuOworCQkJCW11dGV4X2xvY2soJnNmcC0+cGFyZW50ZHAtPm9wZW5fcmVsX2xvY2spOwogCQkJCXNnX3JlbW92ZV9zY2F0KHNmcCwgJnNmcC0+cmVzZXJ2ZSk7CiAJCQkJc2dfYnVpbGRfcmVzZXJ2ZShzZnAsIHZhbCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZzZnAtPnBhcmVudGRwLT5vcGVuX3JlbF9sb2NrKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChhdG9taWNfcmVhZCgmc2RwLT5kZXRhY2hpbmcpKQpAQCAtOTY3LDE2ICs5NzQsMjMgQEAKIAkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCBpcCk7CiAJCWlmIChyZXN1bHQpCiAJCQlyZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXZhbCA9IG1pbl90KGludCwgdmFsLAogCQkJICAgIG1heF9zZWN0b3JzX2J5dGVzKHNkcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlKSk7CisJCW11dGV4X2xvY2soJnNmcC0+Zl9tdXRleCk7CiAJCWlmICh2YWwgIT0gc2ZwLT5yZXNlcnZlLmJ1ZmZsZW4pIHsKLQkJCWlmIChzZ19yZXNfaW5fdXNlKHNmcCkgfHwgc2ZwLT5tbWFwX2NhbGxlZCkKKwkJCWlmIChzZnAtPm1tYXBfY2FsbGVkIHx8CisJCQkgICAgc2ZwLT5yZXNfaW5fdXNlKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZzZnAtPmZfbXV0ZXgpOwogCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQltdXRleF9sb2NrKCZzZnAtPnBhcmVudGRwLT5vcGVuX3JlbF9sb2NrKTsKIAkJCXNnX3JlbW92ZV9zY2F0KHNmcCwgJnNmcC0+cmVzZXJ2ZSk7CiAJCQlzZ19idWlsZF9yZXNlcnZlKHNmcCwgdmFsKTsKKwkJCW11dGV4X3VubG9jaygmc2ZwLT5wYXJlbnRkcC0+b3Blbl9yZWxfbG9jayk7CiAJCX0KKwkJbXV0ZXhfdW5sb2NrKCZzZnAtPmZfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAljYXNlIFNHX0dFVF9SRVNFUlZFRF9TSVpFOgogCQl2YWwgPSBtaW5fdChpbnQsIHNmcC0+cmVzZXJ2ZS5idWZmbGVuLApAQCAtMTAzMCw4ICsxMDQ0LDggQEAKIAkJCQlpZiAoc3JwKSB7CiAJCQkJCXJpbmZvW3ZhbF0ucmVxX3N0YXRlID0gc3JwLT5kb25lICsgMTsKIAkJCQkJcmluZm9bdmFsXS5wcm9ibGVtID0KLQkJCQkJICAgIHNycC0+aGVhZGVyLm1hc2tlZF9zdGF0dXMgJiAKLQkJCQkJICAgIHNycC0+aGVhZGVyLmhvc3Rfc3RhdHVzICYgCisJCQkJCSAgICBzcnAtPmhlYWRlci5tYXNrZWRfc3RhdHVzICYKKwkJCQkJICAgIHNycC0+aGVhZGVyLmhvc3Rfc3RhdHVzICYKIAkJCQkJICAgIHNycC0+aGVhZGVyLmRyaXZlcl9zdGF0dXM7CiAJCQkJCWlmIChzcnAtPmRvbmUpCiAJCQkJCQlyaW5mb1t2YWxdLmR1cmF0aW9uID0KQEAgLTEwNTIsNyArMTA2Niw3IEBACiAJCQkJfQogCQkJfQogCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmc2ZwLT5ycV9saXN0X2xvY2ssIGlmbGFncyk7Ci0JCQlyZXN1bHQgPSBfX2NvcHlfdG9fdXNlcihwLCByaW5mbywgCisJCQlyZXN1bHQgPSBfX2NvcHlfdG9fdXNlcihwLCByaW5mbywKIAkJCQkJCVNaX1NHX1JFUV9JTkZPICogU0dfTUFYX1FVRVVFKTsKIAkJCXJlc3VsdCA9IHJlc3VsdCA/IC1FRkFVTFQgOiAwOwogCQkJa2ZyZWUocmluZm8pOwpAQCAtMTEyOCwxNCArMTE0MiwxNCBAQAogCQlyZXR1cm4gLUVOWElPOwogCiAJc2RldiA9IHNkcC0+ZGV2aWNlOwotCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKSB7IAorCWlmIChzZGV2LT5ob3N0LT5ob3N0dC0+Y29tcGF0X2lvY3RsKSB7CiAJCWludCByZXQ7CiAKIAkJcmV0ID0gc2Rldi0+aG9zdC0+aG9zdHQtPmNvbXBhdF9pb2N0bChzZGV2LCBjbWRfaW4sICh2b2lkIF9fdXNlciAqKWFyZyk7CiAKIAkJcmV0dXJuIHJldDsKIAl9Ci0JCisKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogI2VuZGlmCkBAIC0xMjM5LDYgKzEyNTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmVxX3N6LCBsZW4sIHNhOwogCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHA7CiAJaW50IGssIGxlbmd0aDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICgoIWZpbHApIHx8ICghdm1hKSB8fCAoIShzZnAgPSAoU2dfZmQgKikgZmlscC0+cHJpdmF0ZV9kYXRhKSkpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMjQ5LDggKzEyNjQsMTEgQEAKIAlpZiAodm1hLT52bV9wZ29mZikKIAkJcmV0dXJuIC1FSU5WQUw7CS8qIHdhbnQgbm8gb2Zmc2V0ICovCiAJcnN2X3NjaHAgPSAmc2ZwLT5yZXNlcnZlOwotCWlmIChyZXFfc3ogPiByc3Zfc2NocC0+YnVmZmxlbikKLQkJcmV0dXJuIC1FTk9NRU07CS8qIGNhbm5vdCBtYXAgbW9yZSB0aGFuIHJlc2VydmVkIGJ1ZmZlciAqLworCW11dGV4X2xvY2soJnNmcC0+Zl9tdXRleCk7CisJaWYgKHJlcV9zeiA+IHJzdl9zY2hwLT5idWZmbGVuKSB7CisJCXJldCA9IC1FTk9NRU07CS8qIGNhbm5vdCBtYXAgbW9yZSB0aGFuIHJlc2VydmVkIGJ1ZmZlciAqLworCQlnb3RvIG91dDsKKwl9CiAKIAlzYSA9IHZtYS0+dm1fc3RhcnQ7CiAJbGVuZ3RoID0gMSA8PCAoUEFHRV9TSElGVCArIHJzdl9zY2hwLT5wYWdlX29yZGVyKTsKQEAgLTEyNjQsNyArMTI4Miw5IEBACiAJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX0RPTlRFWFBBTkQgfCBWTV9ET05URFVNUDsKIAl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHNmcDsKIAl2bWEtPnZtX29wcyA9ICZzZ19tbWFwX3ZtX29wczsKLQlyZXR1cm4gMDsKK291dDoKKwltdXRleF91bmxvY2soJnNmcC0+Zl9tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2MTksNyArMTYzOSw3IEBACiAJZWxzZQogCQlkZWZfcmVzZXJ2ZWRfc2l6ZSA9IHNnX2JpZ19idWZmOwogCi0JcmMgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgMCksIAorCXJjID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIDApLAogCQkJCSAgICBTR19NQVhfREVWUywgInNnIik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC0xNzI4LDEzICsxNzQ4LDI1IEBACiAJCW1kID0gJm1hcF9kYXRhOwogCiAJaWYgKG1kKSB7Ci0JCWlmICghc2dfcmVzX2luX3VzZShzZnApICYmIGR4ZmVyX2xlbiA8PSByc3Zfc2NocC0+YnVmZmxlbikKKwkJbXV0ZXhfbG9jaygmc2ZwLT5mX211dGV4KTsKKwkJaWYgKGR4ZmVyX2xlbiA8PSByc3Zfc2NocC0+YnVmZmxlbiAmJgorCQkgICAgIXNmcC0+cmVzX2luX3VzZSkgeworCQkJc2ZwLT5yZXNfaW5fdXNlID0gMTsKIAkJCXNnX2xpbmtfcmVzZXJ2ZShzZnAsIHNycCwgZHhmZXJfbGVuKTsKLQkJZWxzZSB7CisJCX0gZWxzZSBpZiAoaHAtPmZsYWdzICYgU0dfRkxBR19NTUFQX0lPKSB7CisJCQlyZXMgPSAtRUJVU1k7IC8qIHNmcC0+cmVzX2luX3VzZSA9PSAxICovCisJCQlpZiAoZHhmZXJfbGVuID4gcnN2X3NjaHAtPmJ1ZmZsZW4pCisJCQkJcmVzID0gLUVOT01FTTsKKwkJCW11dGV4X3VubG9jaygmc2ZwLT5mX211dGV4KTsKKwkJCXJldHVybiByZXM7CisJCX0gZWxzZSB7CiAJCQlyZXMgPSBzZ19idWlsZF9pbmRpcmVjdChyZXFfc2NocCwgc2ZwLCBkeGZlcl9sZW4pOwotCQkJaWYgKHJlcykKKwkJCWlmIChyZXMpIHsKKwkJCQltdXRleF91bmxvY2soJnNmcC0+Zl9tdXRleCk7CiAJCQkJcmV0dXJuIHJlczsKKwkJCX0KIAkJfQorCQltdXRleF91bmxvY2soJnNmcC0+Zl9tdXRleCk7CiAKIAkJbWQtPnBhZ2VzID0gcmVxX3NjaHAtPnBhZ2VzOwogCQltZC0+cGFnZV9vcmRlciA9IHJlcV9zY2hwLT5wYWdlX29yZGVyOwpAQCAtMjAyNSw2ICsyMDU3LDggQEAKIAlyZXFfc2NocC0+c2dsaXN0X2xlbiA9IDA7CiAJc2ZwLT5zYXZlX3NjYXRfbGVuID0gMDsKIAlzcnAtPnJlc191c2VkID0gMDsKKwkvKiBDYWxsZWQgd2l0aG91dCBtdXRleCBsb2NrIHRvIGF2b2lkIGRlYWRsb2NrICovCisJc2ZwLT5yZXNfaW5fdXNlID0gMDsKIH0KIAogc3RhdGljIFNnX3JlcXVlc3QgKgpAQCAtMjEzNiw2ICsyMTcwLDcgQEAKIAlyd2xvY2tfaW5pdCgmc2ZwLT5ycV9saXN0X2xvY2spOwogCiAJa3JlZl9pbml0KCZzZnAtPmZfcmVmKTsKKwltdXRleF9pbml0KCZzZnAtPmZfbXV0ZXgpOwogCXNmcC0+dGltZW91dCA9IFNHX0RFRkFVTFRfVElNRU9VVDsKIAlzZnAtPnRpbWVvdXRfdXNlciA9IFNHX0RFRkFVTFRfVElNRU9VVF9VU0VSOwogCXNmcC0+Zm9yY2VfcGFja2lkID0gU0dfREVGX0ZPUkNFX1BBQ0tfSUQ7CkBAIC0yMjExLDIwICsyMjQ2LDYgQEAKIAlzY2hlZHVsZV93b3JrKCZzZnAtPmV3LndvcmspOwogfQogCi1zdGF0aWMgaW50Ci1zZ19yZXNfaW5fdXNlKFNnX2ZkICogc2ZwKQotewotCWNvbnN0IFNnX3JlcXVlc3QgKnNycDsKLQl1bnNpZ25lZCBsb25nIGlmbGFnczsKLQotCXJlYWRfbG9ja19pcnFzYXZlKCZzZnAtPnJxX2xpc3RfbG9jaywgaWZsYWdzKTsKLQlmb3IgKHNycCA9IHNmcC0+aGVhZHJwOyBzcnA7IHNycCA9IHNycC0+bmV4dHJwKQotCQlpZiAoc3JwLT5yZXNfdXNlZCkKLQkJCWJyZWFrOwotCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNmcC0+cnFfbGlzdF9sb2NrLCBpZmxhZ3MpOwotCXJldHVybiBzcnAgPyAxIDogMDsKLX0KLQogI2lmZGVmIENPTkZJR19TQ1NJX1BST0NfRlMKIHN0YXRpYyBpbnQKIHNnX2lkcl9tYXhfaWQoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQpAQCAtMjI5OSw3ICsyMzIwLDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgc2dfcHJvY19zaW5nbGVfb3Blbl9kcmVzc3ooc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHNzaXplX3Qgc2dfcHJvY193cml0ZV9kcmVzc3ooc3RydWN0IGZpbGUgKmZpbHAsIAorc3RhdGljIHNzaXplX3Qgc2dfcHJvY193cml0ZV9kcmVzc3ooc3RydWN0IGZpbGUgKmZpbHAsCiAJCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHJlc3N6X2ZvcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC0yNDM5LDcgKzI0NjAsNyBAQAogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZ19wcm9jX3NlcV9zaG93X2ludCwgJnNnX2FsbG93X2Rpbyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IAorc3RhdGljIHNzaXplX3QKIHNnX3Byb2Nfd3JpdGVfYWRpbyhzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKIHsKQEAgLTI0NjAsNyArMjQ4MSw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNnX3Byb2Nfc2VxX3Nob3dfaW50LCAmc2dfYmlnX2J1ZmYpOwogfQogCi1zdGF0aWMgc3NpemVfdCAKK3N0YXRpYyBzc2l6ZV90CiBzZ19wcm9jX3dyaXRlX2RyZXNzeihzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQogewpAQCAtMjYyMCw3ICsyNjQxLDcgQEAKIAkJCWhwID0gJnNycC0+aGVhZGVyOwogCQkJbmV3X2ludGVyZmFjZSA9IChocC0+aW50ZXJmYWNlX2lkID09ICdcMCcpID8gMCA6IDE7CiAJCQlpZiAoc3JwLT5yZXNfdXNlZCkgewotCQkJCWlmIChuZXdfaW50ZXJmYWNlICYmIAorCQkJCWlmIChuZXdfaW50ZXJmYWNlICYmCiAJCQkJICAgIChTR19GTEFHX01NQVBfSU8gJiBocC0+ZmxhZ3MpKQogCQkJCQljcCA9ICIgICAgIG1tYXA+PiAiOwogCQkJCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbmljL3NuaWNfbWFpbi5jIGIvZHJpdmVycy9zY3NpL3NuaWMvc25pY19tYWluLmMKaW5kZXggMzk2YjMyZC4uN2NmNzBhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NuaWMvc25pY19tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL3NuaWMvc25pY19tYWluLmMKQEAgLTU5MSw2ICs1OTEsNyBAQAogCWlmICghcG9vbCkgewogCQlTTklDX0hPU1RfRVJSKHNob3N0LCAiZGZsdCBzZ2wgcG9vbCBjcmVhdGlvbiBmYWlsZWRcbiIpOwogCisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfcmVzOwogCX0KIApAQCAtNjAxLDYgKzYwMiw3IEBACiAJaWYgKCFwb29sKSB7CiAJCVNOSUNfSE9TVF9FUlIoc2hvc3QsICJtYXggc2dsIHBvb2wgY3JlYXRpb24gZmFpbGVkXG4iKTsKIAorCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX2RmbHRfc2dsX3Bvb2w7CiAJfQogCkBAIC02MTEsNiArNjEzLDcgQEAKIAlpZiAoIXBvb2wpIHsKIAkJU05JQ19IT1NUX0VSUihzaG9zdCwgInNuaWMgdG1yZXEgaW5mbyBwb29sIGNyZWF0aW9uIGZhaWxlZC5cbiIpOwogCisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfbWF4X3NnbF9wb29sOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Vmcy91ZnMtZGVidWdmcy5jIGIvZHJpdmVycy9zY3NpL3Vmcy91ZnMtZGVidWdmcy5jCmluZGV4IDU1N2NhMTkuLjExZTExZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS91ZnMvdWZzLWRlYnVnZnMuYworKysgYi9kcml2ZXJzL3Njc2kvdWZzL3Vmcy1kZWJ1Z2ZzLmMKQEAgLTk1MCw2ICs5NTAsMTAgQEAKIAlzZXFfcHJpbnRmKGZpbGUsICJoYmEtPnNhdmVkX2VyciA9IDB4JXhcbiIsIGhiYS0+c2F2ZWRfZXJyKTsKIAlzZXFfcHJpbnRmKGZpbGUsICJoYmEtPnNhdmVkX3VpY19lcnIgPSAweCV4XG4iLCBoYmEtPnNhdmVkX3VpY19lcnIpOwogCisJc2VxX3ByaW50ZihmaWxlLCAicG93ZXJfbW9kZV9jaGFuZ2VfY250ID0gJWRcbiIsCisJCQloYmEtPnVmc19zdGF0cy5wb3dlcl9tb2RlX2NoYW5nZV9jbnQpOworCXNlcV9wcmludGYoZmlsZSwgImhpYmVybjhfZXhpdF9jbnQgPSAlZFxuIiwKKwkJCWhiYS0+dWZzX3N0YXRzLmhpYmVybjhfZXhpdF9jbnQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdWZzL3Vmcy1xY29tLmggYi9kcml2ZXJzL3Njc2kvdWZzL3Vmcy1xY29tLmgKaW5kZXggNzkyYWU0Mi4uMzJlZGQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Vmcy91ZnMtcWNvbS5oCisrKyBiL2RyaXZlcnMvc2NzaS91ZnMvdWZzLXFjb20uaApAQCAtMjEsNiArMjEsNyBAQAogI2RlZmluZSBNQVhfVUZTX1FDT01fSE9TVFMJMgogI2RlZmluZSBNQVhfVTMyICAgICAgICAgICAgICAgICAofih1MzIpMCkKICNkZWZpbmUgTVBIWV9UWF9GU01fU1RBVEUgICAgICAgMHg0MQorI2RlZmluZSBNUEhZX1JYX0ZTTV9TVEFURSAgICAgICAweEMxCiAjZGVmaW5lIFRYX0ZTTV9ISUJFUk44ICAgICAgICAgIDB4MQogI2RlZmluZSBIQlJOOF9QT0xMX1RPVVRfTVMgICAgICAxMDAKICNkZWZpbmUgREVGQVVMVF9DTEtfUkFURV9IWiAgICAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QtcGx0ZnJtLmMgYi9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC1wbHRmcm0uYwppbmRleCA3YzVhMWJjLi5mNWE2NzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC1wbHRmcm0uYworKysgYi9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC1wbHRmcm0uYwpAQCAtMTQ0LDEwICsxNDQsMTEgQEAKIHN0YXRpYyBpbnQgdWZzaGNkX3BvcHVsYXRlX3ZyZWcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAogCQlzdHJ1Y3QgdWZzX3ZyZWcgKipvdXRfdnJlZykKIHsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgbGVuLCByZXQgPSAwOwogCWNoYXIgcHJvcF9uYW1lW01BWF9QUk9QX1NJWkVdOwogCXN0cnVjdCB1ZnNfdnJlZyAqdnJlZyA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwljb25zdCBfX2JlMzIgKnByb3A7CiAKIAlpZiAoIW5wKSB7CiAJCWRldl9lcnIoZGV2LCAiJXM6IG5vbiBEVCBpbml0aWFsaXphdGlvblxuIiwgX19mdW5jX18pOwpAQCAtMTg2LDggKzE4NywxNiBAQAogCQkJdnJlZy0+bWluX3VWID0gVUZTX1ZSRUdfVkNDXzFQOF9NSU5fVVY7CiAJCQl2cmVnLT5tYXhfdVYgPSBVRlNfVlJFR19WQ0NfMVA4X01BWF9VVjsKIAkJfSBlbHNlIHsKLQkJCXZyZWctPm1pbl91ViA9IFVGU19WUkVHX1ZDQ19NSU5fVVY7Ci0JCQl2cmVnLT5tYXhfdVYgPSBVRlNfVlJFR19WQ0NfTUFYX1VWOworCQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInZjYy12b2x0YWdlLWxldmVsIiwgJmxlbik7CisJCQlpZiAoIXByb3AgfHwgKGxlbiAhPSAoMiAqIHNpemVvZihfX2JlMzIpKSkpIHsKKwkJCQlkZXZfd2FybihkZXYsICIlcyB2Y2Mtdm9sdGFnZS1sZXZlbCBwcm9wZXJ0eS5cbiIsCisJCQkJCXByb3AgPyAiaW52YWxpZCBmb3JtYXQiIDogIm5vIik7CisJCQkJdnJlZy0+bWluX3VWID0gVUZTX1ZSRUdfVkNDX01JTl9VVjsKKwkJCQl2cmVnLT5tYXhfdVYgPSBVRlNfVlJFR19WQ0NfTUFYX1VWOworCQkJfSBlbHNlIHsKKwkJCQl2cmVnLT5taW5fdVYgPSBiZTMyX3RvX2NwdXAoJnByb3BbMF0pOworCQkJCXZyZWctPm1heF91ViA9IGJlMzJfdG9fY3B1cCgmcHJvcFsxXSk7CisJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInZjY3EiKSkgewogCQl2cmVnLT5taW5fdVYgPSBVRlNfVlJFR19WQ0NRX01JTl9VVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmMgYi9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC5jCmluZGV4IGMxMzJkYmMuLmI2YmE0YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmMKKysrIGIvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QuYwpAQCAtODY0LDYgKzg2NCwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgdWZzaGNkX3ByaW50X2ZzbV9zdGF0ZShzdHJ1Y3QgdWZzX2hiYSAqaGJhKQoreworCWludCBlcnIgPSAwLCB0eF9mc21fdmFsID0gMCwgcnhfZnNtX3ZhbCA9IDA7CisKKwllcnIgPSB1ZnNoY2RfZG1lX2dldChoYmEsCisJCQlVSUNfQVJHX01JQl9TRUwoTVBIWV9UWF9GU01fU1RBVEUsCisJCQlVSUNfQVJHX01QSFlfVFhfR0VOX1NFTF9JTkRFWCgwKSksCisJCQkmdHhfZnNtX3ZhbCk7CisJZGV2X2VycihoYmEtPmRldiwgIiVzOiBUWF9GU01fU1RBVEUgPSAldSwgZXJyID0gJWRcbiIsIF9fZnVuY19fLAorCQkJdHhfZnNtX3ZhbCwgZXJyKTsKKwllcnIgPSB1ZnNoY2RfZG1lX2dldChoYmEsCisJCQlVSUNfQVJHX01JQl9TRUwoTVBIWV9SWF9GU01fU1RBVEUsCisJCQlVSUNfQVJHX01QSFlfUlhfR0VOX1NFTF9JTkRFWCgwKSksCisJCQkmcnhfZnNtX3ZhbCk7CisJZGV2X2VycihoYmEtPmRldiwgIiVzOiBSWF9GU01fU1RBVEUgPSAldSwgZXJyID0gJWRcbiIsIF9fZnVuY19fLAorCQkJcnhfZnNtX3ZhbCwgZXJyKTsKK30KKwogc3RhdGljIHZvaWQgdWZzaGNkX3ByaW50X2hvc3Rfc3RhdGUoc3RydWN0IHVmc19oYmEgKmhiYSkKIHsKIAlpZiAoIShoYmEtPnVmc2hjZF9kYmdfcHJpbnQgJiBVRlNIQ0RfREJHX1BSSU5UX0hPU1RfU1RBVEVfRU4pKQpAQCAtODg4LDYgKzkwNiw3IEBACiAJCWhiYS0+Y2FwYWJpbGl0aWVzLCBoYmEtPmNhcHMpOwogCWRldl9lcnIoaGJhLT5kZXYsICJxdWlya3M9MHgleCwgZGV2LiBxdWlya3M9MHgleFxuIiwgaGJhLT5xdWlya3MsCiAJCWhiYS0+ZGV2X2luZm8ucXVpcmtzKTsKKwl1ZnNoY2RfcHJpbnRfZnNtX3N0YXRlKGhiYSk7CiB9CiAKIC8qKgpAQCAtNDg1Niw2ICs0ODc1LDcgQEAKIAogCQltZW1jcHkoJmhiYS0+cHdyX2luZm8sIHB3cl9tb2RlLAogCQkJc2l6ZW9mKHN0cnVjdCB1ZnNfcGFfbGF5ZXJfYXR0cikpOworCQloYmEtPnVmc19zdGF0cy5wb3dlcl9tb2RlX2NoYW5nZV9jbnQrKzsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzE1MSw2ICs3MTcxLDEyIEBACiAJfSB3aGlsZSAoZXJyICYmIC0tcmV0cmllcyk7CiAKIAkvKgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IHByb2NlZWRpbmcgZXZlbiBhZnRlciBmYWlsaW5nCisJICogdG8gcmVjb3ZlciBhZnRlciBtdWx0aXBsZSByZXRyaWVzLgorCSAqLworCWlmIChlcnIgJiYgdWZzaGNkX2lzX2VtYmVkZGVkX2RldihoYmEpKQorCQlCVUcoKTsKKwkvKgogCSAqIEFmdGVyIHJlc2V0IHRoZSBkb29yLWJlbGwgbWlnaHQgYmUgY2xlYXJlZCwgY29tcGxldGUKIAkgKiBvdXRzdGFuZGluZyByZXF1ZXN0cyBpbiBzL3cgaGVyZS4KIAkgKi8KQEAgLTc2MTUsOSArNzY0MSw2IEBACiB7CiAJaW50IGVycl9yZWdfaGlzdF9zaXplID0gc2l6ZW9mKHN0cnVjdCB1ZnNfdWljX2Vycl9yZWdfaGlzdCk7CiAKLQloYmEtPnVmc19zdGF0cy5oaWJlcm44X2V4aXRfY250ID0gMDsKLQloYmEtPnVmc19zdGF0cy5sYXN0X2hpYmVybjhfZXhpdF90c3RhbXAgPSBrdGltZV9zZXQoMCwgMCk7Ci0KIAltZW1zZXQoJmhiYS0+dWZzX3N0YXRzLnBhX2VyciwgMCwgZXJyX3JlZ19oaXN0X3NpemUpOwogCW1lbXNldCgmaGJhLT51ZnNfc3RhdHMuZGxfZXJyLCAwLCBlcnJfcmVnX2hpc3Rfc2l6ZSk7CiAJbWVtc2V0KCZoYmEtPnVmc19zdGF0cy5ubF9lcnIsIDAsIGVycl9yZWdfaGlzdF9zaXplKTsKQEAgLTk2ODksNiArOTcxMiw4IEBACiAKIHN0YXRpYyB2b2lkIHVmc2hjZF9zaHV0ZG93bl9jbGtzY2FsaW5nKHN0cnVjdCB1ZnNfaGJhICpoYmEpCiB7CisJaWYgKCF1ZnNoY2RfaXNfY2xrc2NhbGluZ19zdXBwb3J0ZWQoaGJhKSkKKwkJcmV0dXJuOwogCV9fdWZzaGNkX3NodXRkb3duX2Nsa3NjYWxpbmcoaGJhKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoaGJhLT5kZXYsICZoYmEtPmNsa19zY2FsaW5nLmVuYWJsZV9hdHRyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmggYi9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC5oCmluZGV4IGZjODU1ZGIuLjFiMjEyMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmgKKysrIGIvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QuaApAQCAtNjQ0LDYgKzY0NCw3IEBACiAJc3RydWN0IHVmc2hjZF9jbGtfY3R4IGNsa19yZWw7CiAJdTMyIGhpYmVybjhfZXhpdF9jbnQ7CiAJa3RpbWVfdCBsYXN0X2hpYmVybjhfZXhpdF90c3RhbXA7CisJdTMyIHBvd2VyX21vZGVfY2hhbmdlX2NudDsKIAlzdHJ1Y3QgdWZzX3VpY19lcnJfcmVnX2hpc3QgcGFfZXJyOwogCXN0cnVjdCB1ZnNfdWljX2Vycl9yZWdfaGlzdCBkbF9lcnI7CiAJc3RydWN0IHVmc191aWNfZXJyX3JlZ19oaXN0IG5sX2VycjsKQEAgLTExOTgsNiArMTE5OSwxNCBAQAogCQlwd3JfaW5mby0+cHdyX3R4ID09IEZBU1RBVVRPX01PREUpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdWZzaGNkX2lzX2VtYmVkZGVkX2RldihzdHJ1Y3QgdWZzX2hiYSAqaGJhKQoreworCWlmICgoaGJhLT5kZXZfaW5mby5iX2RldmljZV9zdWJfY2xhc3MgPT0gVUZTX0RFVl9FTUJFRERFRF9CT09UQUJMRSkgfHwKKwkgICAgKGhiYS0+ZGV2X2luZm8uYl9kZXZpY2Vfc3ViX2NsYXNzID09IFVGU19ERVZfRU1CRURERURfTk9OX0JPT1RBQkxFKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBzdGF0aWMgaW5saW5lIHZvaWQgdWZzaGNkX2luaXRfcmVxX3N0YXRzKHN0cnVjdCB1ZnNfaGJhICpoYmEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NsaW1idXMvc2xpbWJ1cy5jIGIvZHJpdmVycy9zbGltYnVzL3NsaW1idXMuYwppbmRleCA1NjdmMjkwLi4zYWU5YTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NsaW1idXMvc2xpbWJ1cy5jCisrKyBiL2RyaXZlcnMvc2xpbWJ1cy9zbGltYnVzLmMKQEAgLTIzOTcsNiArMjM5Nyw4IEBACiAJCWJvb2wgb3BlbnNsMXZhbGlkID0gZmFsc2U7CiAJCWludCBtYXhjdHJsdzEsIG1heGN0cmx3MywgaTsKIAorCQkvKiBpbnRpdGFsaXplIGFycmF5IHRvIHplcm8gKi8KKwkJbWVtc2V0KG9wZW5zbDEsIDB4MCwgc2l6ZW9mKG9wZW5zbDEpKTsKIAkJZmluYWxleHAgPSAoY3RybC0+c2NoZWQuY2hjM1tsYXN0M10pLT5yb290ZXhwOwogCQlpZiAobGFzdDEgPj0gMCkgewogCQkJc2xjMSA9IGN0cmwtPnNjaGVkLmNoYzFbY29lZmYxXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vS2NvbmZpZyBiL2RyaXZlcnMvc29jL3Fjb20vS2NvbmZpZwppbmRleCA4YjVhMmZhLi5kODQ1MjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL0tjb25maWcKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9LY29uZmlnCkBAIC01MzgsNjYgKzUzOCw2IEBACiAJICBDb21tYW5kIERCIHF1ZXJpZXMgc2hhcmVkIG1lbW9yeSBieSBrZXkgc3RyaW5nIGZvciBzaGFyZWQgc3lzdGVtCiAJICByZXNvdXJjZXMKIAotY29uZmlnIE1TTV9RRFNQNl9BUFJWMl9HTElOSwotICAgICAgICBib29sICJBdWRpbyBRRFNQNiBBUFJ2MiBPdmVyIEdsaW5rIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fR0xJTksKLSAgICAgICAgaGVscAotICAgICAgICAgIEVuYWJsZSBBUFJ2MiBJUEMgcHJvdG9jb2wgc3VwcG9ydCBiZXR3ZWVuCi0gICAgICAgICAgYXBwbGljYXRpb24gcHJvY2Vzc29yIGFuZCBRRFNQNi4gQVBSIGlzCi0gICAgICAgICAgdXNlZCBieSBhdWRpbyBkcml2ZXIgdG8gY29uZmlndXJlIFFEU1A2J3MKLSAgICAgICAgICBBU00sIEFETSBhbmQgQUZFLgotCi1jb25maWcgTVNNX1FEU1A2X0FQUlYzX0dMSU5LCi0JYm9vbCAiQXVkaW8gUURTUDYgQVBSdjMgT3ZlciBHbGluayBzdXBwb3J0IgotCWRlcGVuZHMgb24gTVNNX0dMSU5LCi0JaGVscAotCSAgRW5hYmxlIEFQUnYzIElQQyBwcm90b2NvbCBzdXBwb3J0IGJldHdlZW4KLQkgIGFwcGxpY2F0aW9uIHByb2Nlc3NvciBhbmQgUURTUDYuIEFQUiBpcwotCSAgdXNlZCBieSBhdWRpbyBkcml2ZXIgdG8gY29uZmlndXJlIFFEU1A2djIncwotCSAgQVNNLCBBRE0gYW5kIEFGRS4KLQotY29uZmlnIE1TTV9RRFNQNl9TU1IKLQlib29sICJBdWRpbyBRRFNQNiBTU1Igc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1TTV9RRFNQNl9BUFJWMl9HTElOSyB8fCBNU01fUURTUDZfQVBSVjNfR0xJTksKLQloZWxwCi0JICBFbmFibGUgU3Vic3lzdGVtIFJlc3RhcnQuIFJlc2V0IGF1ZGlvCi0JICBjbGllbnRzIHdoZW4gdGhlIEFEU1Agc3Vic3lzdGVtIGlzCi0JICByZXN0YXJ0ZWQuIFN1YnN5c3RlbSBSZXN0YXJ0IGZvciBhdWRpbwotCSAgaXMgb25seSB1c2VkIGZvciBwcm9jZXNzZXMgb24gdGhlIEFEU1AKLQkgIGFuZCBzaWduYWxzIGF1ZGlvIGRyaXZlcnMgdGhyb3VnaCBBUFIuCi0KLQotY29uZmlnIE1TTV9RRFNQNl9QRFIKLQlib29sICJBdWRpbyBRRFNQNiBQRFIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1TTV9RRFNQNl9BUFJWMl9HTElOSyB8fCBNU01fUURTUDZfQVBSVjNfR0xJTksKLQloZWxwCi0JICBFbmFibGUgUHJvdGVjdGlvbiBEb21haW4gUmVzdGFydC4gUmVzZXQKLSAgICAgICAgICBhdWRpbyBjbGllbnRzIHdoZW4gYSBwcm9jZXNzIG9uIHRoZSBBRFNQCi0gICAgICAgICAgaXMgcmVzdGFydGVkLiBQRFIgZm9yIGF1ZGlvIGlzIG9ubHkgdXNlZAotICAgICAgICAgIGZvciBwcm9jZXNzZXMgb24gdGhlIEFEU1AgYW5kIHNpZ25hbHMKLSAgICAgICAgICBhdWRpbyBkcml2ZXJzIHRocm91Z2ggQVBSLgotCi1jb25maWcgTVNNX1FEU1A2X05PVElGSUVSCi0JYm9vbCAiQXVkaW8gUURTUDYgUERSIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNU01fUURTUDZfU1NSIHx8IE1TTV9RRFNQNl9QRFIKLQloZWxwCi0JICBFbmFibGUgbm90aWZpZXIgd2hpY2ggZGVjaWRlcyB3aGV0aGVyCi0JICB0byB1c2UgU1NSIG9yIFBEUiBhbmQgbm90aWZpZXMgYWxsCi0JICBhdWRpbyBjbGllbnRzIG9mIHRoZSBldmVudC4gQm90aCBTU1IKLQkgIGFuZCBQRFIgYXJlIHJlY292ZXJ5IG1ldGhvZHMgd2hlbgotCSAgdGhlcmUgaXMgYSBjcmFzaCBvbiBBRFNQLiBBdWRpbyBkcml2ZXJzCi0JICBhcmUgY29udGFjdGVkIGJ5IEFEU1AgdGhyb3VnaCBBUFIuCi0KLWNvbmZpZyBNU01fQURTUF9MT0FERVIKLQl0cmlzdGF0ZSAiQURTUCBsb2FkZXIgc3VwcG9ydCIKLQlzZWxlY3QgU05EX1NPQ19NU01fQVBSVjJfSU5URgotCWRlcGVuZHMgb24gTVNNX1FEU1A2X0FQUlYyX0dMSU5LIHx8IE1TTV9RRFNQNl9BUFJWM19HTElOSwotCWhlbHAKLQkgIEVuYWJsZSBBRFNQIGltYWdlIGxvYWRlci4KLQkgIFRoZSBBRFNQIGxvYWRlciBicmluZ3MgQURTUCBvdXQgb2YgcmVzZXQKLQkgIGZvciB0aGUgcGxhdGZvcm1zIHRoYXQgdXNlIEFQUnYyLgotCSAgU2F5IE0gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgbW9kdWxlLgotCiBjb25maWcgTVNNX1BFUkZPUk1BTkNFCiAJdHJpc3RhdGUgIm1zbSBwZXJmb3JtYWNuZSBkcml2ZXIgdG8gc3VwcG9ydCB1c2Vyc3BhY2UgaG90cGx1ZyByZXF1ZXN0cyIKIAlkZWZhdWx0IG4KQEAgLTYwNywxNiArNTQ3LDYgQEAKIAkgIG9ubGluZSBhdCBhbnkgZ2l2ZW4gcG9pbnQgaW4gdGltZS4gVGhpcyBtb2R1bGUgY2FuIGFsc28gcmVzdHJpY3QKIAkgIG1heCBmcmVxIG9yIG1pbiBmcmVxIG9mIGNwdSBjbHVzdGVyCiAKLWNvbmZpZyBNU01fUEVSRk9STUFOQ0VfSE9UUExVR19PTgotCWJvb2wgIkhvdHBsdWcgZnVuY3Rpb25hbGl0eSB0aHJvdWdoIG1zbV9wZXJmb3JtYW5jZSB0dXJuZWQgb24iCi0JZGVwZW5kcyBvbiBNU01fUEVSRk9STUFOQ0UKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBJZiBzb21lIG90aGVyIGNvcmUtY29udHJvbCBkcml2ZXIgaXMgcHJlc2VudCB0dXJuIG9mZiB0aGUgY29yZS1jb250cm9sCi0JICBjYXBhYmlsaXR5IG9mIG1zbV9wZXJmb3JtYW5jZSBkcml2ZXIuIFNldHRpbmcgdGhpcyBmbGFnIHRvIGZhbHNlIHdpbGwKLQkgIGNvbXBpbGUgb3V0IHRoZSBub2RlcyBuZWVkZWQgZm9yIGNvcmUtY29udHJvbCBmdW5jdGlvbmFsaXR5IHRocm91Z2gKLQkgIG1zbV9wZXJmb3JtYW5jZS4KLQogY29uZmlnIE1TTV9DRFNQX0xPQURFUgogCXRyaXN0YXRlICJDRFNQIGxvYWRlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gTVNNX0dMSU5LCkBAIC02MjYsMjIgKzU1Niw2IEBACiAJICBmb3IgcGxhdGZvcm1zIHRoYXQgaGF2ZSBjb21wdXRlIERTUC4KIAkgIFNheSBNIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIG1vZHVsZS4KIAotY29uZmlnIE1TTV9BVlRJTUVSCi0JdHJpc3RhdGUgIkF2dGltZXIgRHJpdmVyIgotCWRlcGVuZHMgb24gTVNNX1FEU1A2X0FQUlYyX0dMSU5LIHx8IE1TTV9RRFNQNl9BUFJWM19HTElOSwotCWhlbHAKLQkJVGhpcyBkcml2ZXIgZ2V0cyB0aGUgUTYgb3V0IG9mIHBvd2VyIGNvbGxhcHNlZCBzdGF0ZSBhbmQKLQkJZXhwb3NlcyBpb2N0bCBjb250cm9sIHRvIHJlYWQgYXZ0aW1lciB0aWNrLgotCi1jb25maWcgV0NEX0RTUF9HTElOSwotCXRyaXN0YXRlICJXQ0QgRFNQIEdMSU5LIERyaXZlciIKLQlkZXBlbmRzIG9uIE1TTV9HTElOSwotCWRlZmF1bHQgeSBpZiBTTkRfU09DX1dDRDkzNFg9eQotCWhlbHAKLQkgICBUaGlzIG9wdGlvbiBlbmFibGVzIGRyaXZlciB3aGljaCBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGludGVyZmFjZQotCSAgIGJldHdlZW4gTVNNIGFuZCBXQ0QgRFNQIG92ZXIgZ2xpbmsgdHJhbnNwb3J0IHByb3RvY29sLiBUaGlzIGRyaXZlcgotCSAgIHByb3ZpZGVzIHJlYWQgYW5kIHdyaXRlIGludGVyZmFjZSB2aWEgY2hhciBkZXZpY2UuCi0KIGNvbmZpZyBRQ09NX1NNQ0lOVk9LRQogCWJvb2wgIlNlY3VyZSBRU0VFIFN1cHBvcnQiCiAJaGVscApAQCAtNzc4LDMgKzY5MiwxNCBAQAogCSAgVGhpcyBtb2R1bGUgZW5hYmxlcyBicmlkZ2luZyBhbiBJbnRlci1Qcm9jZXNzb3IgQ29tbXVuaWNhdGlvbihJUEMpCiAJICBpbnRlcnJ1cHQgZnJvbSBhIHJlbW90ZSBzdWJzeXN0ZW0gZGlyZWN0ZWQgdG93YXJkcyBRdWFsY29tbQogCSAgVGVjaG5vbG9naWVzLCBJbmMuIFNlY3VyZSBFeGVjdXRpb24gRW52aXJvbm1lbnQoUVNFRSkuCisKK2NvbmZpZyBNU01fSlRBR1Y4CisJYm9vbCAiRGVidWcgYW5kIEVUTSB0cmFjZSBzdXBwb3J0IGFjcm9zcyBwb3dlciBjb2xsYXBzZSBmb3IgQVJNdjgiCisJZGVmYXVsdCB5IGlmIENPUkVTSUdIVF9TT1VSQ0VfRVRNNFgKKwloZWxwCisJICBFbmFibGVzIHN1cHBvcnQgZm9yIGRlYnVnZ2luZyAoc3BlY2lmaWNhbGx5IGJyZWFrcG9pbnRzKSBhbmQgRVRNCisJICBwcm9jZXNzb3IgdHJhY2luZyBhY3Jvc3MgcG93ZXIgY29sbGFwc2UgYm90aCBmb3IgSlRhZyBhbmQgT1MgaG9zdGVkCisJICBzb2Z0d2FyZSBydW5uaW5nIG9uIEFSTXY4IHRhcmdldC4gRW5hYmxpbmcgdGhpcyB3aWxsIGVuc3VyZSBkZWJ1ZworCSAgYW5kIEVUTSByZWdpc3RlcnMgYXJlIHNhdmVkIGFuZCByZXN0b3JlZCBhY3Jvc3MgcG93ZXIgY29sbGFwc2UuCisJICBJZiB1bnN1cmUsIHNheSAnTicgaGVyZSB0byBhdm9pZCBwb3RlbnRpYWwgcG93ZXIsIHBlcmZvcm1hbmNlIGFuZAorCSAgbWVtb3J5IHBlbmFsdHkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL01ha2VmaWxlIGIvZHJpdmVycy9zb2MvcWNvbS9NYWtlZmlsZQppbmRleCA0MmE4ZWY1Li5iMTQ3YzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vTWFrZWZpbGUKQEAgLTU1LDEzICs1NSwxMiBAQAogb2JqLSQoQ09ORklHX01TTV9TWVNURU1fSEVBTFRIX01PTklUT1IpCSs9CXN5c3RlbV9oZWFsdGhfbW9uaXRvcl92MDEubwogb2JqLSQoQ09ORklHX01TTV9TWVNURU1fSEVBTFRIX01PTklUT1IpCSs9CXN5c3RlbV9oZWFsdGhfbW9uaXRvci5vCiBvYmotJChDT05GSUdfTVNNX1NZU01PTl9HTElOS19DT01NKSArPSBzeXNtb24tZ2xpbmsubyBzeXNtb24tcW1pLm8KLW9iai0kKENPTkZJR19JQ05TUykgKz0gaWNuc3MubyB3bGFuX2Zpcm13YXJlX3NlcnZpY2VfdjAxLm8gaWNuc3NfdXRpbHMubworb2JqLSQoQ09ORklHX0lDTlNTKSArPSBpY25zcy5vIHdsYW5fZmlybXdhcmVfc2VydmljZV92MDEubwogCiBvYmotJChDT05GSUdfTUVNX1NIQVJFX1FNSV9TRVJWSUNFKQkJKz0gbWVtc2hhcmUvCiBvYmotJChDT05GSUdfTVNNX1BJTF9TU1JfR0VORVJJQykgKz0gc3Vic3lzLXBpbC10ei5vCiBvYmotJChDT05GSUdfTVNNX1BJTF9NU1NfUURTUDZWNSkgKz0gcGlsLXE2djUubyBwaWwtbXNhLm8gcGlsLXE2djUtbXNzLm8KIG9iai0kKENPTkZJR19NU01fUElMKSAgICs9ICAgICAgcGVyaXBoZXJhbC1sb2FkZXIubwotb2JqLSQoQ09ORklHX01TTV9BVlRJTUVSKSArPSBhdnRpbWVyLm8KIAogb2JqLSQoQ09ORklHX01TTV9QRVJGT1JNQU5DRSkgKz0gbXNtX3BlcmZvcm1hbmNlLm8KIApAQCAtNzAsOSArNjksOSBAQAogICAgICAgIG9iai15ICs9IHN1YnN5c3RlbV9yZXN0YXJ0Lm8KICAgICAgICBvYmoteSArPSByYW1kdW1wLm8KIGVuZGlmCitvYmotJChDT05GSUdfTVNNX0pUQUdWOCkgKz0ganRhZ3Y4Lm8ganRhZ3Y4LWV0bS5vCiBvYmotJChDT05GSUdfUUNPTV9DT01NQU5EX0RCKSArPSBjbWQtZGIubwogb2JqLSQoQ09ORklHX01TTV9RQlQxMDAwKSArPSBxYnQxMDAwLm8KLW9iai0kKENPTkZJR19XQ0RfRFNQX0dMSU5LKSArPSB3Y2QtZHNwLWdsaW5rLm8KIG9iai0kKENPTkZJR19NU01fRVZFTlRfVElNRVIpICs9IGV2ZW50X3RpbWVyLm8KIG9iai0kKENPTkZJR19NU01fSURMRV9TVEFUUykJKz0gbHBtLXN0YXRzLm8KIG9iai0kKENPTkZJR19BUFNTX0NPUkVfRUEpCSs9IG1zbS1jb3JlLm8gZGVidWdfY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL2F2dGltZXIuYyBiL2RyaXZlcnMvc29jL3Fjb20vYXZ0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODE5ZDQ2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vYXZ0aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYXZ0aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+Ci0KLSNkZWZpbmUgREVWSUNFX05BTUUgImF2dGltZXIiCi0jZGVmaW5lIFRJTUVPVVRfTVMgMTAwMAotI2RlZmluZSBDT1JFX0NMSUVOVCAxCi0jZGVmaW5lIFRFTVBfUE9SVCAoKENPUkVfQ0xJRU5UIDw8IDgpIHwgMHgwMDAxKQotI2RlZmluZSBTU1JfV0FLRVRJTUUgMTAwMAotI2RlZmluZSBRNl9SRUFEWV9SRVRSWSAyNTAKLSNkZWZpbmUgUTZfUkVBRFlfTUFYX1JFVFJJRVMgNDAKLQotI2RlZmluZSBBVkNTX0NNRF9SRU1PVEVfQVZUSU1FUl9WT1RFX1JFUVVFU1QgMHgwMDAxMjkxNAotI2RlZmluZSBBVkNTX0NNRF9SU1BfUkVNT1RFX0FWVElNRVJfVk9URV9SRVFVRVNUIDB4MDAwMTI5MTUKLSNkZWZpbmUgQVZDU19DTURfUkVNT1RFX0FWVElNRVJfUkVMRUFTRV9SRVFVRVNUIDB4MDAwMTI5MTYKLSNkZWZpbmUgQVZUSU1FUl9SRUdfQ05UIDIKLQotc3RydWN0IGFkc3BfYXZ0X3RpbWVyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdW5pb24gewotCQljaGFyIGNsaWVudF9uYW1lWzhdOwotCQl1MzIgYXZ0aW1lcl9oYW5kbGU7Ci0JfTsKLX0gX19wYWNrZWQ7Ci0KLXN0YXRpYyBpbnQgbWFqb3I7Ci0KLXN0cnVjdCBhdnRpbWVyX3QgewotCXN0cnVjdCBhcHJfc3ZjICpjb3JlX2hhbmRsZV9xOwotCXN0cnVjdCBjZGV2IG15YzsKLQlzdHJ1Y3QgY2xhc3MgKmF2dGltZXJfY2xhc3M7Ci0Jc3RydWN0IG11dGV4IGF2dGltZXJfbG9jazsKLQlpbnQgYXZ0aW1lcl9vcGVuX2NudDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNzcl9kd29yazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBhZHNwX3Jlc3Bfd2FpdDsKLQlpbnQgZW5hYmxlX3RpbWVyX3Jlc3BfcmVjZWl2ZWQ7Ci0JaW50IHRpbWVyX2hhbmRsZTsKLQl2b2lkIF9faW9tZW0gKnBfYXZ0aW1lcl9tc3c7Ci0Jdm9pZCBfX2lvbWVtICpwX2F2dGltZXJfbHN3OwotCXVpbnQzMl90IGNsa19kaXY7Ci0JdWludDMyX3QgY2xrX211bHQ7Ci0JYXRvbWljX3QgYWRzcF9yZWFkeTsKLQlpbnQgbnVtX3JldHJpZXM7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF2dGltZXJfdCBhdnRpbWVyOwotCi1zdGF0aWMgaW50MzJfdCBhcHJ2Ml9jb3JlX2ZuX3Eoc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKLXsKLQl1aW50MzJfdCAqcGF5bG9hZDE7Ci0KLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogY29yZSBtc2c6IHBheWxvYWQgbGVuID0gJXUsIGFwciByZXNwIG9wY29kZSA9IDB4JVhcbiIsCi0JCV9fZnVuY19fLCBkYXRhLT5wYXlsb2FkX3NpemUsIGRhdGEtPm9wY29kZSk7Ci0KLQlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgewotCi0JY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDp7Ci0KLQkJaWYgKCFkYXRhLT5wYXlsb2FkX3NpemUpIHsKLQkJCXByX2VycigiJXM6IEFQUl9CQVNJQ19SU1BfUkVTVUxUIE5vIFBheWxvYWQgIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwYXlsb2FkMSA9IGRhdGEtPnBheWxvYWQ7Ci0JCXN3aXRjaCAocGF5bG9hZDFbMF0pIHsKLQkJY2FzZSBBVkNTX0NNRF9SRU1PVEVfQVZUSU1FUl9SRUxFQVNFX1JFUVVFU1Q6Ci0JCQlwcl9kZWJ1ZygiJXM6IENtZCA9IFRJTUVSIFJFTEVBU0Ugc3RhdHVzWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIHBheWxvYWQxWzFdKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJJbnZhbGlkIGNtZCByc3BbMHgleF1bMHgleF1cbiIsCi0JCQkJCXBheWxvYWQxWzBdLCBwYXlsb2FkMVsxXSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFJFU0VUX0VWRU5UUzp7Ci0JCXByX2RlYnVnKCIlczogUmVzZXQgZXZlbnQgcmVjZWl2ZWQgaW4gQVYgdGltZXJcbiIsIF9fZnVuY19fKTsKLQkJYXByX3Jlc2V0KGF2dGltZXIuY29yZV9oYW5kbGVfcSk7Ci0JCWF2dGltZXIuY29yZV9oYW5kbGVfcSA9IE5VTEw7Ci0JCWF2dGltZXIuYXZ0aW1lcl9vcGVuX2NudCA9IDA7Ci0JCWF0b21pY19zZXQoJmF2dGltZXIuYWRzcF9yZWFkeSwgMCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYXZ0aW1lci5zc3JfZHdvcmssCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKFNTUl9XQUtFVElNRSkpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEFWQ1NfQ01EX1JTUF9SRU1PVEVfQVZUSU1FUl9WT1RFX1JFUVVFU1Q6Ci0JCXBheWxvYWQxID0gZGF0YS0+cGF5bG9hZDsKLQkJcHJfZGVidWcoIiVzOiBSU1BfUkVNT1RFX0FWVElNRVJfVk9URV9SRVFVRVNUIGhhbmRsZSAleFxuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkMVswXSk7Ci0JCWF2dGltZXIudGltZXJfaGFuZGxlID0gcGF5bG9hZDFbMF07Ci0JCWF2dGltZXIuZW5hYmxlX3RpbWVyX3Jlc3BfcmVjZWl2ZWQgPSAxOwotCQl3YWtlX3VwKCZhdnRpbWVyLmFkc3BfcmVzcF93YWl0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogTWVzc2FnZSBhZHNwY29yZSBzdmM6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGF2Y3NfY29yZV9vcGVuKHZvaWQpCi17Ci0JaWYgKCFhdnRpbWVyLmNvcmVfaGFuZGxlX3EpCi0JCWF2dGltZXIuY29yZV9oYW5kbGVfcSA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJDT1JFIiwKLQkJCQkJYXBydjJfY29yZV9mbl9xLCBURU1QX1BPUlQsIE5VTEwpOwotCXByX2RlYnVnKCIlczogT3Blbl9xICVwXG4iLCBfX2Z1bmNfXywgYXZ0aW1lci5jb3JlX2hhbmRsZV9xKTsKLQlpZiAoIWF2dGltZXIuY29yZV9oYW5kbGVfcSkgewotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQ09SRVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGF2Y3NfY29yZV9vcGVuKTsKLQotc3RhdGljIGludCBhdmNzX2NvcmVfZGlzYWJsZV9hdnRpbWVyKGludCB0aW1lcmhhbmRsZSkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBhZHNwX2F2dF90aW1lciBwYXlsb2FkOwotCi0JaWYgKCF0aW1lcmhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHRpbWVyIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOwotCXJjID0gYXZjc19jb3JlX29wZW4oKTsKLQlpZiAoIXJjICYmIGF2dGltZXIuY29yZV9oYW5kbGVfcSkgewotCQlwYXlsb2FkLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCQlwYXlsb2FkLmhkci5wa3Rfc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IGFkc3BfYXZ0X3RpbWVyKTsKLQkJcGF5bG9hZC5oZHIuc3JjX3N2YyA9IGF2dGltZXIuY29yZV9oYW5kbGVfcS0+aWQ7Ci0JCXBheWxvYWQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JCXBheWxvYWQuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCQlwYXlsb2FkLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOwotCQlwYXlsb2FkLmhkci5zcmNfcG9ydCA9IFRFTVBfUE9SVDsKLQkJcGF5bG9hZC5oZHIuZGVzdF9wb3J0ID0gVEVNUF9QT1JUOwotCQlwYXlsb2FkLmhkci50b2tlbiA9IENPUkVfQ0xJRU5UOwotCQlwYXlsb2FkLmhkci5vcGNvZGUgPSBBVkNTX0NNRF9SRU1PVEVfQVZUSU1FUl9SRUxFQVNFX1JFUVVFU1Q7Ci0JCXBheWxvYWQuYXZ0aW1lcl9oYW5kbGUgPSB0aW1lcmhhbmRsZTsKLQkJcHJfZGVidWcoIiVzOiBkaXNhYmxlIGF2dGltZXIgb3Bjb2RlICV4IGhhbmRsZSAleFxuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkLmhkci5vcGNvZGUsIHBheWxvYWQuYXZ0aW1lcl9oYW5kbGUpOwotCQlyYyA9IGFwcl9zZW5kX3BrdChhdnRpbWVyLmNvcmVfaGFuZGxlX3EsCi0JCQkJCQkodWludDMyX3QgKikmcGF5bG9hZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiBFbmFibGUgQVZ0aW1lciBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWQuaGRyLm9wY29kZSwgcmMpOwotCQllbHNlCi0JCQlyYyA9IDA7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBhdmNzX2NvcmVfZW5hYmxlX2F2dGltZXIoY2hhciAqY2xpZW50X25hbWUpCi17Ci0JaW50IHJjID0gLUVJTlZBTCwgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgYWRzcF9hdnRfdGltZXIgcGF5bG9hZDsKLQotCWlmICghY2xpZW50X25hbWUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKLQlyYyA9IGF2Y3NfY29yZV9vcGVuKCk7Ci0JaWYgKCFyYyAmJiBhdnRpbWVyLmNvcmVfaGFuZGxlX3EpIHsKLQkJYXZ0aW1lci5lbmFibGVfdGltZXJfcmVzcF9yZWNlaXZlZCA9IDA7Ci0JCXBheWxvYWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX0VWRU5ULAotCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCQlwYXlsb2FkLmhkci5wa3Rfc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IGFkc3BfYXZ0X3RpbWVyKTsKLQkJcGF5bG9hZC5oZHIuc3JjX3N2YyA9IGF2dGltZXIuY29yZV9oYW5kbGVfcS0+aWQ7Ci0JCXBheWxvYWQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JCXBheWxvYWQuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCQlwYXlsb2FkLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOwotCQlwYXlsb2FkLmhkci5zcmNfcG9ydCA9IFRFTVBfUE9SVDsKLQkJcGF5bG9hZC5oZHIuZGVzdF9wb3J0ID0gVEVNUF9QT1JUOwotCQlwYXlsb2FkLmhkci50b2tlbiA9IENPUkVfQ0xJRU5UOwotCQlwYXlsb2FkLmhkci5vcGNvZGUgPSBBVkNTX0NNRF9SRU1PVEVfQVZUSU1FUl9WT1RFX1JFUVVFU1Q7Ci0JCXN0cmxjcHkocGF5bG9hZC5jbGllbnRfbmFtZSwgY2xpZW50X25hbWUsCi0JCQkgICBzaXplb2YocGF5bG9hZC5jbGllbnRfbmFtZSkpOwotCQlwcl9kZWJ1ZygiJXM6IGVuYWJsZSBhdnRpbWVyIG9wY29kZSAleCBjbGllbnQgbmFtZSAlc1xuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkLmhkci5vcGNvZGUsIHBheWxvYWQuY2xpZW50X25hbWUpOwotCQlyYyA9IGFwcl9zZW5kX3BrdChhdnRpbWVyLmNvcmVfaGFuZGxlX3EsCi0JCQkJCQkodWludDMyX3QgKikmcGF5bG9hZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IEVuYWJsZSBBVnRpbWVyIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZC5oZHIub3Bjb2RlLCByYyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0gZWxzZQotCQkJcmMgPSAwOwotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXZ0aW1lci5hZHNwX3Jlc3Bfd2FpdCwKLQkJCShhdnRpbWVyLmVuYWJsZV90aW1lcl9yZXNwX3JlY2VpdmVkID09IDEpLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgZm9yIEVuYWJsZSB0aW1lclxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRVRJTUVET1VUOwotCQl9Ci0JCWlmIChyYykKLQkJCWF2dGltZXIudGltZXJfaGFuZGxlID0gMDsKLQl9Ci1iYWlsOgotCXJldHVybiByYzsKLX0KLQotaW50IGF2Y3NfY29yZV9kaXNhYmxlX3Bvd2VyX2NvbGxhcHNlKGludCBlbmFibGUpCi17Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJmF2dGltZXIuYXZ0aW1lcl9sb2NrKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCWlmIChhdnRpbWVyLmF2dGltZXJfb3Blbl9jbnQpIHsKLQkJCWF2dGltZXIuYXZ0aW1lcl9vcGVuX2NudCsrOwotCQkJcHJfZGVidWcoIiVzOiBvcGVuZWQgYXZ0aW1lciBvcGVuIGNvdW50PSVkXG4iLAotCQkJCV9fZnVuY19fLCBhdnRpbWVyLmF2dGltZXJfb3Blbl9jbnQpOwotCQkJcmMgPSAwOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXJjID0gYXZjc19jb3JlX2VuYWJsZV9hdnRpbWVyKCJ0aW1lciIpOwotCQlpZiAoIXJjKSB7Ci0JCQlhdnRpbWVyLmF2dGltZXJfb3Blbl9jbnQrKzsKLQkJCWF0b21pY19zZXQoJmF2dGltZXIuYWRzcF9yZWFkeSwgMSk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYXZ0aW1lci5hdnRpbWVyX29wZW5fY250ID4gMCkgewotCQkJYXZ0aW1lci5hdnRpbWVyX29wZW5fY250LS07Ci0JCQlpZiAoIWF2dGltZXIuYXZ0aW1lcl9vcGVuX2NudCkgewotCQkJCXJjID0gYXZjc19jb3JlX2Rpc2FibGVfYXZ0aW1lcigKLQkJCQlhdnRpbWVyLnRpbWVyX2hhbmRsZSk7Ci0JCQkJYXZ0aW1lci50aW1lcl9oYW5kbGUgPSAwOwotCQkJfQotCQl9Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJmF2dGltZXIuYXZ0aW1lcl9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKGF2Y3NfY29yZV9kaXNhYmxlX3Bvd2VyX2NvbGxhcHNlKTsKLQotc3RhdGljIHZvaWQgcmVzZXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaWYgKHE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKLQkJYXZjc19jb3JlX2Rpc2FibGVfcG93ZXJfY29sbGFwc2UoMSk7Ci0JCWF2dGltZXIubnVtX3JldHJpZXMgPSBRNl9SRUFEWV9NQVhfUkVUUklFUzsKLQkJcmV0dXJuOwotCX0KLQlwcl9kZWJ1ZygiJXM6UTYgbm90IHJlYWR5LXJldHJ5IGFmdGVyIHNvbWV0aW1lXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKC0tYXZ0aW1lci5udW1fcmV0cmllcyA+IDApIHsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhdnRpbWVyLnNzcl9kd29yaywKLQkJCSAgbXNlY3NfdG9famlmZmllcyhRNl9SRUFEWV9SRVRSWSkpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IFE2IGZhaWxlZCByZXNwb25kaW5nIGFmdGVyIG11bHRpcGxlIHJldHJpZXNcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQlhdnRpbWVyLm51bV9yZXRyaWVzID0gUTZfUkVBRFlfTUFYX1JFVFJJRVM7Ci0JfQotfQotCi1pbnQgYXZjc19jb3JlX3F1ZXJ5X3RpbWVyKHVpbnQ2NF90ICphdnRpbWVyX3RpY2spCi17Ci0JdWludDMyX3QgYXZ0aW1lcl9tc3cgPSAwLCBhdnRpbWVyX2xzdyA9IDA7Ci0JdWludDY0X3QgYXZ0aW1lcl90aWNrX3RlbXA7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZhdnRpbWVyLmFkc3BfcmVhZHkpKSB7Ci0JCXByX2RlYnVnKCIlczpJbiBTU1IsIHJldHVyblxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0JYXZ0aW1lcl9sc3cgPSBpb3JlYWQzMihhdnRpbWVyLnBfYXZ0aW1lcl9sc3cpOwotCWF2dGltZXJfbXN3ID0gaW9yZWFkMzIoYXZ0aW1lci5wX2F2dGltZXJfbXN3KTsKLQotCWF2dGltZXJfdGlja190ZW1wID0gKHVpbnQ2NF90KSgodWludDY0X3QpYXZ0aW1lcl9tc3cgPDwgMzIpCi0JCQkgICAgfCBhdnRpbWVyX2xzdzsKLQkqYXZ0aW1lcl90aWNrID0gbXVsX3U2NF91MzJfZGl2KGF2dGltZXJfdGlja190ZW1wLCBhdnRpbWVyLmNsa19tdWx0LAotCQkJCQlhdnRpbWVyLmNsa19kaXYpOwotCXByX2RlYnVnX3JhdGVsaW1pdGVkKCIlczpBdnRpbWVyOiBtc3c6ICV1LCBsc3c6ICV1LCB0aWNrOiAlbGx1XG4iLAotCQkJX19mdW5jX18sCi0JCQlhdnRpbWVyX21zdywgYXZ0aW1lcl9sc3csICphdnRpbWVyX3RpY2spOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChhdmNzX2NvcmVfcXVlcnlfdGltZXIpOwotCi1zdGF0aWMgaW50IGF2dGltZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gYXZjc19jb3JlX2Rpc2FibGVfcG93ZXJfY29sbGFwc2UoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgYXZ0aW1lcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBhdmNzX2NvcmVfZGlzYWJsZV9wb3dlcl9jb2xsYXBzZSgwKTsKLX0KLQotLyoKLSAqIGlvY3RsIGNhbGwgcHJvdmlkZXMgR0VUX0FWVElNRVIKLSAqLwotc3RhdGljIGxvbmcgYXZ0aW1lcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGlvY3RsX251bSwKLQkJCQl1bnNpZ25lZCBsb25nIGlvY3RsX3BhcmFtKQotewotCXN3aXRjaCAoaW9jdGxfbnVtKSB7Ci0JY2FzZSBJT0NUTF9HRVRfQVZUSU1FUl9USUNLOgotCXsKLQkJdWludDY0X3QgYXZ0aW1lcl90aWNrID0gMDsKLQkJaW50IHJjOwotCi0JCXJjID0gYXZjc19jb3JlX3F1ZXJ5X3RpbWVyKCZhdnRpbWVyX3RpY2spOwotCi0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogRXJyb3I6IEludmFsaWQgQVYgVGltZXIgdGljaywgcmMgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoIiVzOiBBViBUaW1lciB0aWNrOiB0aW1lICVsbHhcbiIsCi0JCV9fZnVuY19fLCBhdnRpbWVyX3RpY2spOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGlvY3RsX3BhcmFtLCAmYXZ0aW1lcl90aWNrLAotCQkgICAgc2l6ZW9mKGF2dGltZXJfdGljaykpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNtZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF2dGltZXJfZm9wcyA9IHsKLQkudW5sb2NrZWRfaW9jdGwgPSBhdnRpbWVyX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgPSBhdnRpbWVyX2lvY3RsLAotCS5vcGVuID0gYXZ0aW1lcl9vcGVuLAotCS5yZWxlYXNlID0gYXZ0aW1lcl9yZWxlYXNlCi19OwotCi1zdGF0aWMgaW50IGRldl9hdnRpbWVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JZGV2X3QgZGV2ID0gTUtERVYobWFqb3IsIDApOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZV9oYW5kbGU7Ci0Jc3RydWN0IHJlc291cmNlICpyZWdfbHNiID0gTlVMTCwgKnJlZ19tc2IgPSBOVUxMOwotCXVpbnQzMl90IGNsa19kaXZfdmFsOwotCXVpbnQzMl90IGNsa19tdWx0X3ZhbDsKLQotCWlmICghcGRldikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmVnX2xzYiA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJSU9SRVNPVVJDRV9NRU0sICJhdnRpbWVyX2xzYl9hZGRyIik7Ci0JaWYgKCFyZWdfbHNiKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBMb29raW5nIHVwICVzIHByb3BlcnR5IiwKLQkJCSJhdnRpbWVyX2xzYl9hZGRyIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmVnX21zYiA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKLQkJSU9SRVNPVVJDRV9NRU0sICJhdnRpbWVyX21zYl9hZGRyIik7Ci0JaWYgKCFyZWdfbXNiKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBMb29raW5nIHVwICVzIHByb3BlcnR5IiwKLQkJCSJhdnRpbWVyX21zYl9hZGRyIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmF2dGltZXIuc3NyX2R3b3JrLCByZXNldF93b3JrKTsKLQotCWF2dGltZXIucF9hdnRpbWVyX2xzdyA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsCi0JCQkJcmVnX2xzYi0+c3RhcnQsIHJlc291cmNlX3NpemUocmVnX2xzYikpOwotCWlmICghYXZ0aW1lci5wX2F2dGltZXJfbHN3KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBpb3JlbWFwIGZhaWxlZCBmb3IgbHNiIGF2dGltZXIgcmVnaXN0ZXIiLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlhdnRpbWVyLnBfYXZ0aW1lcl9tc3cgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LAotCQkJCXJlZ19tc2ItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ19tc2IpKTsKLQlpZiAoIWF2dGltZXIucF9hdnRpbWVyX21zdykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogaW9yZW1hcCBmYWlsZWQgZm9yIG1zYiBhdnRpbWVyIHJlZ2lzdGVyIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byB1bm1hcDsKLQl9Ci0JYXZ0aW1lci5udW1fcmV0cmllcyA9IFE2X1JFQURZX01BWF9SRVRSSUVTOwotCS8qIGdldCB0aGUgZGV2aWNlIG51bWJlciAqLwotCWlmIChtYWpvcikKLQkJcmVzdWx0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIDEsIERFVklDRV9OQU1FKTsKLQllbHNlIHsKLQkJcmVzdWx0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCAwLCAxLCBERVZJQ0VfTkFNRSk7Ci0JCW1ham9yID0gTUFKT1IoZGV2KTsKLQl9Ci0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogUmVnaXN0ZXJpbmcgYXZ0aW1lciBkZXZpY2UgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIHVubWFwOwotCX0KLQotCWF2dGltZXIuYXZ0aW1lcl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImF2dGltZXIiKTsKLQlpZiAoSVNfRVJSKGF2dGltZXIuYXZ0aW1lcl9jbGFzcykpIHsKLQkJcmVzdWx0ID0gUFRSX0VSUihhdnRpbWVyLmF2dGltZXJfY2xhc3MpOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRXJyb3IgY3JlYXRpbmcgYXZ0aW1lciBjbGFzczogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKLQkJZ290byB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb247Ci0JfQotCi0JY2Rldl9pbml0KCZhdnRpbWVyLm15YywgJmF2dGltZXJfZm9wcyk7Ci0JcmVzdWx0ID0gY2Rldl9hZGQoJmF2dGltZXIubXljLCBkZXYsIDEpOwotCi0JaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFJlZ2lzdGVyaW5nIGZpbGUgb3BlcmF0aW9ucyBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gY2xhc3NfZGVzdHJveTsKLQl9Ci0KLQlkZXZpY2VfaGFuZGxlID0gZGV2aWNlX2NyZWF0ZShhdnRpbWVyLmF2dGltZXJfY2xhc3MsCi0JCQlOVUxMLCBhdnRpbWVyLm15Yy5kZXYsIE5VTEwsICJhdnRpbWVyIik7Ci0JaWYgKElTX0VSUihkZXZpY2VfaGFuZGxlKSkgewotCQlyZXN1bHQgPSBQVFJfRVJSKGRldmljZV9oYW5kbGUpOwotCQlwcl9lcnIoIiVzOiBkZXZpY2VfY3JlYXRlIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwotCQlnb3RvIGNsYXNzX2Rlc3Ryb3k7Ci0JfQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmF2dGltZXIuYWRzcF9yZXNwX3dhaXQpOwotCW11dGV4X2luaXQoJmF2dGltZXIuYXZ0aW1lcl9sb2NrKTsKLQlhdnRpbWVyLmF2dGltZXJfb3Blbl9jbnQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBEZXZpY2UgY3JlYXRlIGRvbmUgZm9yIGF2dGltZXIgbWFqb3I9JWRcbiIsCi0JCQlfX2Z1bmNfXywgbWFqb3IpOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sY2xrLWRpdiIsICZjbGtfZGl2X3ZhbCkpCi0JCWF2dGltZXIuY2xrX2RpdiA9IDE7Ci0JZWxzZQotCQlhdnRpbWVyLmNsa19kaXYgPSBjbGtfZGl2X3ZhbDsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLGNsay1tdWx0IiwgJmNsa19tdWx0X3ZhbCkpCi0JCWF2dGltZXIuY2xrX211bHQgPSAxOwotCWVsc2UKLQkJYXZ0aW1lci5jbGtfbXVsdCA9IGNsa19tdWx0X3ZhbDsKLQotCXByX2RlYnVnKCIlczogYXZ0aW1lci5jbGtfZGl2ID0gJWQsIGF2dGltZXIuY2xrX211bHQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBhdnRpbWVyLmNsa19kaXYsIGF2dGltZXIuY2xrX211bHQpOwotCXJldHVybiAwOwotCi1jbGFzc19kZXN0cm95OgotCWNsYXNzX2Rlc3Ryb3koYXZ0aW1lci5hdnRpbWVyX2NsYXNzKTsKLXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbjoKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYobWFqb3IsIDApLCAxKTsKLXVubWFwOgotCWlmIChhdnRpbWVyLnBfYXZ0aW1lcl9sc3cpCi0JCWRldm1faW91bm1hcCgmcGRldi0+ZGV2LCBhdnRpbWVyLnBfYXZ0aW1lcl9sc3cpOwotCWlmIChhdnRpbWVyLnBfYXZ0aW1lcl9tc3cpCi0JCWRldm1faW91bm1hcCgmcGRldi0+ZGV2LCBhdnRpbWVyLnBfYXZ0aW1lcl9tc3cpOwotCWF2dGltZXIucF9hdnRpbWVyX2xzdyA9IE5VTEw7Ci0JYXZ0aW1lci5wX2F2dGltZXJfbXN3ID0gTlVMTDsKLQlyZXR1cm4gcmVzdWx0OwotCi19Ci0KLXN0YXRpYyBpbnQgZGV2X2F2dGltZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcHJfZGVidWcoIiVzOiBkZXZfYXZ0aW1lcl9yZW1vdmVcbiIsIF9fZnVuY19fKTsKLQotCWlmIChhdnRpbWVyLnBfYXZ0aW1lcl9sc3cpCi0JCWRldm1faW91bm1hcCgmcGRldi0+ZGV2LCBhdnRpbWVyLnBfYXZ0aW1lcl9sc3cpOwotCWlmIChhdnRpbWVyLnBfYXZ0aW1lcl9tc3cpCi0JCWRldm1faW91bm1hcCgmcGRldi0+ZGV2LCBhdnRpbWVyLnBfYXZ0aW1lcl9tc3cpOwotCWRldmljZV9kZXN0cm95KGF2dGltZXIuYXZ0aW1lcl9jbGFzcywgYXZ0aW1lci5teWMuZGV2KTsKLQljZGV2X2RlbCgmYXZ0aW1lci5teWMpOwotCWNsYXNzX2Rlc3Ryb3koYXZ0aW1lci5hdnRpbWVyX2NsYXNzKTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYobWFqb3IsIDApLCAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhdnRpbWVyX21hY2hpbmVfb2ZfbWF0Y2hbXSAgPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLGF2dGltZXIiLCB9LAotCXt9LAotfTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRldl9hdnRpbWVyX2RyaXZlciA9IHsKLQkucHJvYmUgPSBkZXZfYXZ0aW1lcl9wcm9iZSwKLQkucmVtb3ZlID0gZGV2X2F2dGltZXJfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImRldl9hdnRpbWVyIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gYXZ0aW1lcl9tYWNoaW5lX29mX21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50ICBfX2luaXQgYXZ0aW1lcl9pbml0KHZvaWQpCi17Ci0JczMyIHJjOwotCi0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRldl9hdnRpbWVyX2RyaXZlcik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyb3JfcGxhdGZvcm1fZHJpdmVyOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGRldl9hdnRpbWVyX2luaXQgOiBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLWVycm9yX3BsYXRmb3JtX2RyaXZlcjoKLQotCXByX2VycigiJXM6IGVuY291bnRlcmQgZXJyb3JcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdnRpbWVyX2V4aXQodm9pZCkKLXsKLQlwcl9kZWJ1ZygiJXM6IGF2dGltZXJfZXhpdFxuIiwgX19mdW5jX18pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkZXZfYXZ0aW1lcl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhdnRpbWVyX2luaXQpOwotbW9kdWxlX2V4aXQoYXZ0aW1lcl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJhdnRpbWVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9kY2NfdjIuYyBiL2RyaXZlcnMvc29jL3Fjb20vZGNjX3YyLmMKaW5kZXggMjFiMjAzNC4uZTExZWZiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9kY2NfdjIuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL2RjY192Mi5jCkBAIC0xNDgsMTEgKzE0OCw2IEBACiAJc3RydWN0IGNsYXNzCQkqc3JhbV9jbGFzczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNmZ19oZWFkW0RDQ19NQVhfTElOS19MSVNUXTsKIAl1aW50MzJfdAkJbnJfY29uZmlnW0RDQ19NQVhfTElOS19MSVNUXTsKLQl2b2lkCQkJKnJlZ19idWY7Ci0Jc3RydWN0IG1zbV9kdW1wX2RhdGEJcmVnX2RhdGE7Ci0JYm9vbAkJCXNhdmVfcmVnOwotCXZvaWQJCQkqc3JhbV9idWY7Ci0Jc3RydWN0IG1zbV9kdW1wX2RhdGEJc3JhbV9kYXRhOwogCXVpbnQ4X3QJCQljdXJyX2xpc3Q7CiAJdWludDhfdAkJCWN0aV90cmlnOwogfTsKQEAgLTQ5MCwzOSArNDg1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2RjY19yZWdfZHVtcChzdHJ1Y3QgZGNjX2RydmRhdGEgKmRydmRhdGEpCi17Ci0JdWludDMyX3QgKnJlZ19idWY7Ci0JdWludDhfdCBpID0gMDsKLQl1aW50OF90IGo7Ci0KLQlpZiAoIWRydmRhdGEtPnJlZ19idWYpCi0JCXJldHVybjsKLQotCWRydmRhdGEtPnJlZ19kYXRhLnZlcnNpb24gPSBEQ0NfUkVHX0RVTVBfVkVSOwotCi0JcmVnX2J1ZiA9IGRydmRhdGEtPnJlZ19idWY7Ci0KLQlyZWdfYnVmW2krK10gPSBkY2NfcmVhZGwoZHJ2ZGF0YSwgRENDX0hXX1ZFUlNJT04pOwotCXJlZ19idWZbaSsrXSA9IGRjY19yZWFkbChkcnZkYXRhLCBEQ0NfSFdfSU5GTyk7Ci0JcmVnX2J1ZltpKytdID0gZGNjX3JlYWRsKGRydmRhdGEsIERDQ19FWEVDX0NUUkwpOwotCXJlZ19idWZbaSsrXSA9IGRjY19yZWFkbChkcnZkYXRhLCBEQ0NfU1RBVFVTKTsKLQlyZWdfYnVmW2krK10gPSBkY2NfcmVhZGwoZHJ2ZGF0YSwgRENDX0NGRyk7Ci0JcmVnX2J1ZltpKytdID0gZGNjX3JlYWRsKGRydmRhdGEsIERDQ19GREFfQ1VSUik7Ci0JcmVnX2J1ZltpKytdID0gZGNjX3JlYWRsKGRydmRhdGEsIERDQ19MTEFfQ1VSUik7Ci0KLQlmb3IgKGogPSAwOyBqIDwgRENDX01BWF9MSU5LX0xJU1Q7IGorKykKLQkJcmVnX2J1ZltpKytdID0gZGNjX3JlYWRsKGRydmRhdGEsIERDQ19MTF9MT0NLKGopKTsKLQlmb3IgKGogPSAwOyBqIDwgRENDX01BWF9MSU5LX0xJU1Q7IGorKykKLQkJcmVnX2J1ZltpKytdID0gZGNjX3JlYWRsKGRydmRhdGEsIERDQ19MTF9DRkcoaikpOwotCWZvciAoaiA9IDA7IGogPCBEQ0NfTUFYX0xJTktfTElTVDsgaisrKQotCQlyZWdfYnVmW2krK10gPSBkY2NfcmVhZGwoZHJ2ZGF0YSwgRENDX0xMX0JBU0UoaikpOwotCWZvciAoaiA9IDA7IGogPCBEQ0NfTUFYX0xJTktfTElTVDsgaisrKQotCQlyZWdfYnVmW2krK10gPSBkY2NfcmVhZGwoZHJ2ZGF0YSwgRENDX0ZEX0JBU0UoaikpOwotCi0JZHJ2ZGF0YS0+cmVnX2RhdGEubWFnaWMgPSBEQ0NfUkVHX0RVTVBfTUFHSUNfVjI7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fZGNjX2ZpcnN0X2NyYyhzdHJ1Y3QgZGNjX2RydmRhdGEgKmRydmRhdGEpCiB7CiAJaW50IGk7CkBAIC01OTgsNyArNTYwLDcgQEAKIAkJCQkgICBkcnZkYXRhLT5yYW1fb2Zmc2V0LzQsIERDQ19MTF9CQVNFKGxpc3QpKTsKIAkJCWRjY193cml0ZWwoZHJ2ZGF0YSwgZHJ2ZGF0YS0+cmFtX3N0YXJ0ICsKIAkJCQkgICBkcnZkYXRhLT5yYW1fb2Zmc2V0LzQsIERDQ19GRF9CQVNFKGxpc3QpKTsKLQkJCWRjY193cml0ZWwoZHJ2ZGF0YSwgMCwgRENDX0xMX1RJTUVPVVQobGlzdCkpOworCQkJZGNjX3dyaXRlbChkcnZkYXRhLCAweEZGRiwgRENDX0xMX1RJTUVPVVQobGlzdCkpOwogCQl9CiAKIAkJLyogNC4gQ29uZmlndXJlIHRyaWdnZXIsIGRhdGEgc2luayBhbmQgZnVuY3Rpb24gdHlwZSAqLwpAQCAtNjI2LDkgKzU4OCw2IEBACiAJCQkJCSAgIERDQ19MTF9JTlRfRU5BQkxFKGxpc3QpKTsKIAkJfQogCX0KLQkvKiBTYXZlIERDQyByZWdpc3RlcnMgKi8KLQlpZiAoZHJ2ZGF0YS0+c2F2ZV9yZWcpCi0JCV9fZGNjX3JlZ19kdW1wKGRydmRhdGEpOwogCiBlcnI6CiAJbXV0ZXhfdW5sb2NrKCZkcnZkYXRhLT5tdXRleCk7CkBAIC02NTMsOSArNjEyLDYgQEAKIAl9CiAJZHJ2ZGF0YS0+cmFtX2NmZyA9IDA7CiAJZHJ2ZGF0YS0+cmFtX3N0YXJ0ID0gMDsKLQkvKiBTYXZlIERDQyByZWdpc3RlcnMgKi8KLQlpZiAoZHJ2ZGF0YS0+c2F2ZV9yZWcpCi0JCV9fZGNjX3JlZ19kdW1wKGRydmRhdGEpOwogCiAJbXV0ZXhfdW5sb2NrKCZkcnZkYXRhLT5tdXRleCk7CiB9CkBAIC0xNDYyLDQ3ICsxNDE4LDYgQEAKIAlkY2Nfc3JhbV9kZXZfZGVyZWdpc3RlcihkcnZkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgZGNjX2FsbG9jYXRlX2R1bXBfbWVtKHN0cnVjdCBkY2NfZHJ2ZGF0YSAqZHJ2ZGF0YSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRydmRhdGEtPmRldjsKLQlzdHJ1Y3QgbXNtX2R1bXBfZW50cnkgcmVnX2R1bXBfZW50cnksIHNyYW1fZHVtcF9lbnRyeTsKLQotCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGNjIHJlZyBkdW1wICovCi0JZHJ2ZGF0YS0+cmVnX2J1ZiA9IGRldm1fa3phbGxvYyhkZXYsIGRydmRhdGEtPnJlZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHJ2ZGF0YS0+cmVnX2J1ZikgewotCQlkcnZkYXRhLT5yZWdfZGF0YS5hZGRyID0gdmlydF90b19waHlzKGRydmRhdGEtPnJlZ19idWYpOwotCQlkcnZkYXRhLT5yZWdfZGF0YS5sZW4gPSBkcnZkYXRhLT5yZWdfc2l6ZTsKLQkJcmVnX2R1bXBfZW50cnkuaWQgPSBNU01fRFVNUF9EQVRBX0RDQ19SRUc7Ci0JCXJlZ19kdW1wX2VudHJ5LmFkZHIgPSB2aXJ0X3RvX3BoeXMoJmRydmRhdGEtPnJlZ19kYXRhKTsKLQkJcmV0ID0gbXNtX2R1bXBfZGF0YV9yZWdpc3RlcihNU01fRFVNUF9UQUJMRV9BUFBTLAotCQkJCQkgICAgICZyZWdfZHVtcF9lbnRyeSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiRENDIFJFRyBkdW1wIHNldHVwIGZhaWxlZFxuIik7Ci0JCQlkZXZtX2tmcmVlKGRldiwgZHJ2ZGF0YS0+cmVnX2J1Zik7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZXJyKGRldiwgIkRDQyBSRUcgZHVtcCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JfQotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkY2Mgc3JhbSBkdW1wICovCi0JZHJ2ZGF0YS0+c3JhbV9idWYgPSBkZXZtX2t6YWxsb2MoZGV2LCBkcnZkYXRhLT5yYW1fc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRydmRhdGEtPnNyYW1fYnVmKSB7Ci0JCWRydmRhdGEtPnNyYW1fZGF0YS5hZGRyID0gdmlydF90b19waHlzKGRydmRhdGEtPnNyYW1fYnVmKTsKLQkJZHJ2ZGF0YS0+c3JhbV9kYXRhLmxlbiA9IGRydmRhdGEtPnJhbV9zaXplOwotCQlzcmFtX2R1bXBfZW50cnkuaWQgPSBNU01fRFVNUF9EQVRBX0RDQ19TUkFNOwotCQlzcmFtX2R1bXBfZW50cnkuYWRkciA9IHZpcnRfdG9fcGh5cygmZHJ2ZGF0YS0+c3JhbV9kYXRhKTsKLQkJcmV0ID0gbXNtX2R1bXBfZGF0YV9yZWdpc3RlcihNU01fRFVNUF9UQUJMRV9BUFBTLAotCQkJCQkgICAgICZzcmFtX2R1bXBfZW50cnkpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgIkRDQyBTUkFNIGR1bXAgc2V0dXAgZmFpbGVkXG4iKTsKLQkJCWRldm1fa2ZyZWUoZGV2LCBkcnZkYXRhLT5zcmFtX2J1Zik7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZXJyKGRldiwgIkRDQyBTUkFNIGR1bXAgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCX0KLX0KLQogc3RhdGljIGludCBkY2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0LCBpOwpAQCAtMTU0Miw5ICsxNDU3LDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRydmRhdGEtPnNhdmVfcmVnID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJICAicWNvbSxzYXZlLXJlZyIpOwotCiAJbXV0ZXhfaW5pdCgmZHJ2ZGF0YS0+bXV0ZXgpOwogCiAJZm9yIChpID0gMDsgaSA8IERDQ19NQVhfTElOS19MSVNUOyBpKyspIHsKQEAgLTE1ODAsNyArMTQ5Miw2IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnI7CiAKLQlkY2NfYWxsb2NhdGVfZHVtcF9tZW0oZHJ2ZGF0YSk7CiAJcmV0dXJuIDA7CiBlcnI6CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vZXVkLmMgYi9kcml2ZXJzL3NvYy9xY29tL2V1ZC5jCmluZGV4IDUxYzA4YzYuLmY3ZjMzMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vZXVkLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9ldWQuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNkZWZpbmUgRVVEX0VOQUJMRV9DTUQgMQogI2RlZmluZSBFVURfRElTQUJMRV9DTUQgMApAQCAtNzEsNiArNzMsNyBAQAogCXN0cnVjdCB1YXJ0X3BvcnQJCXBvcnQ7CiAJc3RydWN0IHdvcmtfc3RydWN0CQlldWRfd29yazsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqYmF0dF9wc3k7CisJc3RydWN0IGNsawkJCSpjZmdfYWhiX2NsazsKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXVkX2V4dGNvbl9jYWJsZVtdID0gewpAQCAtMTE5LDcgKzEyMiw3IEBACiAJCS8qIHdyaXRlIGludG8gQ1NSIHRvIGVuYWJsZSBFVUQgKi8KIAkJd3JpdGVsX3JlbGF4ZWQoQklUKDApLCBwcml2LT5ldWRfcmVnX2Jhc2UgKyBFVURfUkVHX0NTUl9FVURfRU4pOwogCQkvKiBFbmFibGUgdmJ1cywgY2hnciAmIHNhZmUgbW9kZSB3YXJuaW5nIGludGVycnVwdHMgKi8KLQkJd3JpdGVsX3JlbGF4ZWQoRVVEX0lOVF9WQlVTIHwgRVVEX0lOVF9DSEdSIHwgRVVEX0lOVF9TQUZFX01PREUsCisJCXdyaXRlbF9yZWxheGVkKEVVRF9JTlRfVkJVUyB8IEVVRF9JTlRfQ0hHUiwKIAkJCQlwcml2LT5ldWRfcmVnX2Jhc2UgKyBFVURfUkVHX0lOVDFfRU5fTUFTSyk7CiAKIAkJLyogRW5zdXJlIFJlZ2lzdGVyIFdyaXRlcyBDb21wbGV0ZSAqLwpAQCAtNDQ4LDcgKzQ1MSwxMSBAQAogewogCXN0cnVjdCBldWRfY2hpcCAqY2hpcCA9IGRhdGE7CiAJdTMyIHJlZzsKLQl1MzIgaW50X21hc2tfZW4xID0gcmVhZGxfcmVsYXhlZChjaGlwLT5ldWRfcmVnX2Jhc2UgKworCXUzMiBpbnRfbWFza19lbjE7CisKKwljbGtfcHJlcGFyZV9lbmFibGUoY2hpcC0+Y2ZnX2FoYl9jbGspOworCisJaW50X21hc2tfZW4xID0gcmVhZGxfcmVsYXhlZChjaGlwLT5ldWRfcmVnX2Jhc2UgKwogCQkJCQlFVURfUkVHX0lOVDFfRU5fTUFTSyk7CiAKIAkvKiByZWFkIHN0YXR1cyByZWdpc3RlciBhbmQgZmluZCBvdXQgd2hpY2ggaW50ZXJydXB0IHRyaWdnZXJlZCAqLwpAQCAtNDcyLDkgKzQ3OSwxMSBAQAogCQlwZXRfZXVkKGNoaXApOwogCX0gZWxzZSB7CiAJCWRldl9kYmcoY2hpcC0+ZGV2LCAiVW5rbm93bi9zcHVyaW91cyBFVUQgSW50ZXJydXB0IVxuIik7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjaGlwLT5jZmdfYWhiX2Nsayk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY2hpcC0+Y2ZnX2FoYl9jbGspOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNDkyLDYgKzUwMSw3IEBACiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hpcCk7CisJY2hpcC0+ZGV2ID0gJnBkZXYtPmRldjsKIAogCWNoaXAtPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZSgmcGRldi0+ZGV2LCBldWRfZXh0Y29uX2NhYmxlKTsKIAlpZiAoSVNfRVJSKGNoaXAtPmV4dGNvbikpIHsKQEAgLTUxNywxMCArNTI3LDI1IEBACiAJaWYgKElTX0VSUihjaGlwLT5ldWRfcmVnX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5ldWRfcmVnX2Jhc2UpOwogCisJaWYgKG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkiY2xvY2stbmFtZXMiLCAiY2ZnX2FoYl9jbGsiKSA+PSAwKSB7CisJCWNoaXAtPmNmZ19haGJfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJjZmdfYWhiX2NsayIpOworCQlpZiAoSVNfRVJSKGNoaXAtPmNmZ19haGJfY2xrKSkgeworCQkJcmV0ID0gUFRSX0VSUihjaGlwLT5jZmdfYWhiX2Nsayk7CisJCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQkJZGV2X2VycihjaGlwLT5kZXYsCisJCQkJImNsayBnZXQgZmFpbGVkIGZvciBjZmdfYWhiX2NsayByZXQgJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAljaGlwLT5ldWRfaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImV1ZF9pcnEiKTsKIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgY2hpcC0+ZXVkX2lycSwgaGFuZGxlX2V1ZF9pcnEsCi0JCQkJSVJRRl9UUklHR0VSX0hJR0gsICJldWRfaXJxIiwgY2hpcCk7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBjaGlwLT5ldWRfaXJxLAorCQkJCQlOVUxMLCBoYW5kbGVfZXVkX2lycSwKKwkJCQkJSVJRRl9UUklHR0VSX0hJR0ggfCBJUlFGX09ORVNIT1QsCisJCQkJCSJldWRfaXJxIiwgY2hpcCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGNoaXAtPmRldiwgInJlcXVlc3QgZmFpbGVkIGZvciBldWQgaXJxXG4iKTsKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vZ2xhZGlhdG9yX2VycC5jIGIvZHJpdmVycy9zb2MvcWNvbS9nbGFkaWF0b3JfZXJwLmMKaW5kZXggODM1ZDRiMC4uM2I3MGNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9nbGFkaWF0b3JfZXJwLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9nbGFkaWF0b3JfZXJwLmMKQEAgLTE2Myw2ICsxNjMsNyBAQAogCURJU0NPTk5FQ1RfRVJST1IsCiAJRElSRUNUT1JZX0VSUk9SLAogCVBBUklUWV9FUlJPUiwKKwlQSFlTSUNBTF9BRERSRVNTX0VSUk9SLAogfTsKIAogc3RhdGljIHZvaWQgY2xlYXJfZ2xhZGlhdG9yX2Vycm9yKHZvaWQgX19pb21lbSAqZ2xhZGlhdG9yX3ZpcnRfYmFzZSwKQEAgLTIwMCwxMiArMjAxLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9nbGRfZXJydHlwZSh1bnNpZ25lZCBpbnQgZXJydHlwZSkKIHsKKwljaGFyICplcnJvcnMgPSAiRGlzY29ubmVjdCwgRGlyZWN0b3J5LCBQYXJpdHksIFBoeXNpY2FsIGFkZHJlc3MiOworCiAJaWYgKGVycnR5cGUgPT0gMCkKIAkJcHJfYWxlcnQoIkVycm9yIHR5cGU6IFNub29wIGRhdGEgdHJhbnNmZXJcbiIpOwogCWVsc2UgaWYgKGVycnR5cGUgPT0gMSkKIAkJcHJfYWxlcnQoIkVycm9yIHR5cGU6IERWTSBlcnJvclxuIik7CiAJZWxzZSBpZiAoZXJydHlwZSA9PSAzKQotCQlwcl9hbGVydCgiRXJyb3IgdHlwZTogRGlzY29ubmVjdCwgZGlyZWN0b3J5LCBvciBwYXJpdHkgZXJyb3JcbiIpOworCQlwcl9hbGVydCgiRXJyb3IgdHlwZTogJXNcbiIsIGVycm9ycyk7CiAJZWxzZQogCQlwcl9hbGVydCgiRXJyb3IgdHlwZTogVW5rbm93bjsgdmFsdWU6JXVcbiIsIGVycnR5cGUpOwogfQpAQCAtMjg4LDcgKzI5MSw3IEBACiAKIAlsb2dfZXJyX3R5cGUgPSAoZXJyX3JlZzUgJiBtYXNrX3NoaWZ0cy0+Z2xkX2VycmxvZzVfZXJyb3JfdHlwZV9tYXNrKQogCQk+PiBtYXNrX3NoaWZ0cy0+Z2xkX2VycmxvZzVfZXJyb3JfdHlwZV9zaGlmdDsKLQlmb3IgKGkgPSAwIDsgaSA8PSA2IDsgaSsrKSB7CisJZm9yIChpID0gMCA7IGkgPD0gNyA7IGkrKykgewogCQl2YWx1ZSA9IGxvZ19lcnJfdHlwZSAmIDB4MTsKIAkJc3dpdGNoIChpKSB7CiAJCWNhc2UgREFUQV9UUkFOU0ZFUl9FUlJPUjoKQEAgLTMzNyw3ICszNDAsMTQgQEAKIAkJCQkJbWFza19zaGlmdHMpOwogCQkJZGVjb2RlX2luZGV4X3Bhcml0eShlcnJfcmVnNSwgbWFza19zaGlmdHMpOwogCQkJYnJlYWs7CisJCWNhc2UgUEhZU0lDQUxfQUREUkVTU19FUlJPUjoKKwkJCWlmICh2YWx1ZSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJfYWxlcnQoIkVycm9yIHR5cGU6IFBoeXNpY2FsIGFkZHJlc3MgZXJyb3JcbiIpOworCQkJcHJfYWxlcnQoIkFkZHJlc3MgaXMgZ3JlYXRlciB0aGFuIFNvQyBhZGRyZXNzIHJhbmdlXG4iKTsKKwkJCWJyZWFrOwogCQl9CisKIAkJbG9nX2Vycl90eXBlID0gbG9nX2Vycl90eXBlID4+IDE7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9nbGluay5jIGIvZHJpdmVycy9zb2MvcWNvbS9nbGluay5jCmluZGV4IDFkNjA1ZTMuLjYwMTllNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vZ2xpbmsuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL2dsaW5rLmMKQEAgLTYwNCwxMCArNjA0LDExIEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnbGlua19xb3NfY2FsY19yYXRlX2tCcHMoc2l6ZV90IHBrdF9zaXplLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGludGVydmFsX3VzKQogewotCXVuc2lnbmVkIGxvbmcgcmF0ZV9rQnBzLCByZW07CisJdW5zaWduZWQgbG9uZyByZW07CisJdWludDY0X3QgcmF0ZV9rQnBzOwogCiAJcmF0ZV9rQnBzID0gcGt0X3NpemUgKiBVU0VDX1BFUl9TRUM7Ci0JcmVtID0gZG9fZGl2KHJhdGVfa0JwcywgKGludGVydmFsX3VzICogMTAyNCkpOworCXJlbSA9IGRvX2RpdihyYXRlX2tCcHMsIGludGVydmFsX3VzICogMTAyNCk7CiAJcmV0dXJuIHJhdGVfa0JwczsKIH0KIApAQCAtMjM3Miw2ICsyMzczLDM1IEBACiB9CiAKIC8qKgorICogZHVtbXlfdHhfY21kX2NoX29wZW4oKSAtIGR1bW15IGNoYW5uZWwgb3BlbiBjbWQgc2VuZGluZyBmdW5jdGlvbgorICogQGlmX3B0cjoJVGhlIHRyYW5zcG9ydCB0byB0cmFuc21pdCBvbi4KKyAqIEBsY2lkOglUaGUgbG9jYWwgY2hhbm5lbCBpZCB0byBlbmNvZGUuCisgKiBAbmFtZToJVGhlIGNoYW5uZWwgbmFtZSB0byBlbmNvZGUuCisgKiBAcmVxX3hwcnQ6CVRoZSB0cmFuc3BvcnQgdGhlIGNvcmUgd291bGQgbGlrZSB0byBtaWdyYXRlIHRoaXMgY2hhbm5lbCB0by4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBzdGFuZGFyZCBMaW51eCBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IGR1bW15X3R4X2NtZF9jaF9vcGVuKHN0cnVjdCBnbGlua190cmFuc3BvcnRfaWYgKmlmX3B0ciwKKwkJCXVpbnQzMl90IGxjaWQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQl1aW50MTZfdCByZXFfeHBydCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qKgorICogZHVtbXlfdHhfY21kX2NoX3JlbW90ZV9vcGVuX2FjaygpIC0gY29udmVydCBhIGNoYW5uZWwgb3BlbiBhY2sgY21kIHRvIHdpcmUKKyAqCQkJCWZvcm1hdCBhbmQgdHJhbnNtaXQKKyAqIEBpZl9wdHI6CVRoZSB0cmFuc3BvcnQgdG8gdHJhbnNtaXQgb24uCisgKiBAcmNpZDoJVGhlIHJlbW90ZSBjaGFubmVsIGlkIHRvIGVuY29kZS4KKyAqIEB4cHJ0X3Jlc3A6CVRoZSByZXNwb25zZSB0byBhIHRyYW5zcG9ydCBtaWdyYXRpb24gcmVxdWVzdC4KKyAqLworc3RhdGljIHZvaWQgZHVtbXlfdHhfY21kX2NoX3JlbW90ZV9vcGVuX2FjayhzdHJ1Y3QgZ2xpbmtfdHJhbnNwb3J0X2lmICppZl9wdHIsCisJCQkJCXVpbnQzMl90IHJjaWQsIHVpbnQxNl90IHhwcnRfcmVzcCkKK3sKKwkvKiBpbnRlbnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KK30KKworLyoqCiAgKiBkdW1teV9nZXRfcG93ZXJfdm90ZV9yYW1wX3RpbWUoKSAtIER1bW15IFBvd2VyIHZvdGUgcmFtcCB0aW1lCiAgKiBAaWZfcHRyOglUaGUgdHJhbnNwb3J0IHRvIHRyYW5zbWl0IG9uLgogICogQHN0YXRlOglUaGUgcG93ZXIgc3RhdGUgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIHRyYW5zcG9ydC4KQEAgLTQxODQsOCArNDIxNCwxNCBAQAogCWlmX3B0ci0+dHhfY21kX3JlbW90ZV9yeF9pbnRlbnRfcmVxX2FjayA9CiAJCQkJZHVtbXlfdHhfY21kX3JlbW90ZV9yeF9pbnRlbnRfcmVxX2FjazsKIAlpZl9wdHItPnR4X2NtZF9zZXRfc2lncyA9IGR1bW15X3R4X2NtZF9zZXRfc2lnczsKKwlpZl9wdHItPnR4X2NtZF9jaF9vcGVuID0gZHVtbXlfdHhfY21kX2NoX29wZW47CisJaWZfcHRyLT50eF9jbWRfY2hfcmVtb3RlX29wZW5fYWNrID0gZHVtbXlfdHhfY21kX2NoX3JlbW90ZV9vcGVuX2FjazsKIAlpZl9wdHItPnR4X2NtZF9jaF9jbG9zZSA9IGR1bW15X3R4X2NtZF9jaF9jbG9zZTsKIAlpZl9wdHItPnR4X2NtZF9jaF9yZW1vdGVfY2xvc2VfYWNrID0gZHVtbXlfdHhfY21kX2NoX3JlbW90ZV9jbG9zZV9hY2s7CisJaWZfcHRyLT50eF9jbWRfdHJhY2VyX3BrdCA9IGR1bW15X3R4X2NtZF90cmFjZXJfcGt0OworCWlmX3B0ci0+Z2V0X3Bvd2VyX3ZvdGVfcmFtcF90aW1lID0gZHVtbXlfZ2V0X3Bvd2VyX3ZvdGVfcmFtcF90aW1lOworCWlmX3B0ci0+cG93ZXJfdm90ZSA9IGR1bW15X3Bvd2VyX3ZvdGU7CisJaWZfcHRyLT5wb3dlcl91bnZvdGUgPSBkdW1teV9wb3dlcl91bnZvdGU7CiAKIAl4cHJ0X3B0ci0+b3BzID0gaWZfcHRyOwogCXhwcnRfcHRyLT5sb2dfY3R4ID0gbG9nX2N0eDsKQEAgLTU0MTksOCArNTQ1NSw4IEBACiBzdGF0aWMgdm9pZCBnbGlua19zY2hlZHVsZXJfZXZhbF9wcmlvKHN0cnVjdCBjaGFubmVsX2N0eCAqY3R4LAogCQkJc3RydWN0IGdsaW5rX2NvcmVfeHBydF9jdHggKnhwcnRfY3R4KQogewotCXVuc2lnbmVkIGxvbmcgdG9rZW5fZW5kX3RpbWU7Ci0JdW5zaWduZWQgbG9uZyB0b2tlbl9jb25zdW1lX3RpbWUsIHJlbTsKKwl1bnNpZ25lZCBsb25nIHRva2VuX2VuZF90aW1lLCByZW07CisJdWludDY0X3QgdG9rZW5fY29uc3VtZV90aW1lOwogCXVuc2lnbmVkIGxvbmcgb2JzX3JhdGVfa0JwczsKIAogCWlmIChjdHgtPmluaXRpYWxfcHJpb3JpdHkgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vZ2xpbmtfc3BpX3hwcnQuYyBiL2RyaXZlcnMvc29jL3Fjb20vZ2xpbmtfc3BpX3hwcnQuYwppbmRleCBjNDRhYTkzLi5hMDhjNGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL2dsaW5rX3NwaV94cHJ0LmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9nbGlua19zcGlfeHBydC5jCkBAIC0xMjEsNiArMTIxLDggQEAKICAqIEB0eF9maWZvX3dyaXRlX3JlZ19hZGRyOglBZGRyZXNzIG9mIHRoZSBUWCBGSUZPIFdyaXRlIEluZGV4IFJlZ2lzdGVyLgogICogQHJ4X2ZpZm9fcmVhZF9yZWdfYWRkcjoJQWRkcmVzcyBvZiB0aGUgUlggRklGTyBSZWFkIEluZGV4IFJlZ2lzdGVyLgogICogQHJ4X2ZpZm9fd3JpdGVfcmVnX2FkZHI6CUFkZHJlc3Mgb2YgdGhlIFJYIEZJRk8gV3JpdGUgSW5kZXggUmVnaXN0ZXIuCisgKiBAdHhfZmlmb193cml0ZToJCUludGVybmFsIHdyaXRlIGluZGV4IGZvciBUWCBGSUZPLgorICogQHJ4X2ZpZm9fcmVhZDoJCUludGVybmFsIHJlYWQgaW5kZXggZm9yIFJYIEZJRk8uCiAgKiBAa3dvcms6CQkJV29yayB0byBiZSBleGVjdXRlZCB3aGVuIHJlY2VpdmluZyBkYXRhLgogICogQGt3b3JrZXI6CQkJSGFuZGxlIHRvIHRoZSBlbnRpdHkgcHJvY2Vzc2luZyBAa3dvcmsuCiAgKiBAdGFzazoJCQlIYW5kbGUgdG8gdGhlIHRhc2sgY29udGV4dCB0aGF0IHJ1bnMgQGt3b3JrZXIuCkBAIC0xNTgsNiArMTYwLDggQEAKIAl1bnNpZ25lZCBpbnQgdHhfZmlmb193cml0ZV9yZWdfYWRkcjsKIAl1bnNpZ25lZCBpbnQgcnhfZmlmb19yZWFkX3JlZ19hZGRyOwogCXVuc2lnbmVkIGludCByeF9maWZvX3dyaXRlX3JlZ19hZGRyOworCXVpbnQzMl90IHR4X2ZpZm9fd3JpdGU7CisJdWludDMyX3QgcnhfZmlmb19yZWFkOwogCiAJc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKIAlzdHJ1Y3Qga3RocmVhZF93b3JrZXIga3dvcmtlcjsKQEAgLTM3NCw2ICszNzgsMTkgQEAKIAlpbnQgd3JpdGVfYXZhaWw7CiAJaW50IHJldDsKIAorCWlmICh1bmxpa2VseSghZWluZm8tPnR4X2ZpZm9fc3RhcnQpKSB7CisJCXJldCA9IGdsaW5rX3NwaV94cHJ0X3JlZ19yZWFkKGVpbmZvLAorCQkJZWluZm8tPnR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIsICZlaW5mby0+dHhfZmlmb193cml0ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBFcnJvciAlZCByZWFkaW5nICVzIHR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCwgZWluZm8tPnhwcnRfY2ZnLmVkZ2UsCisJCQkJZWluZm8tPnR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWluZm8tPnR4X2ZpZm9fc3RhcnQgPSBlaW5mby0+dHhfZmlmb193cml0ZTsKKwl9CisJd3JpdGVfaWQgPSBlaW5mby0+dHhfZmlmb193cml0ZTsKKwogCXJldCA9IGdsaW5rX3NwaV94cHJ0X3JlZ19yZWFkKGVpbmZvLCBlaW5mby0+dHhfZmlmb19yZWFkX3JlZ19hZGRyLAogCQkJCSAgICZyZWFkX2lkKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMzgzLDIxICs0MDAsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXQgPSBnbGlua19zcGlfeHBydF9yZWdfcmVhZChlaW5mbywgZWluZm8tPnR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIsCi0JCQkJJndyaXRlX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCByZWFkaW5nICVzIHR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBlaW5mby0+eHBydF9jZmcuZWRnZSwKLQkJCWVpbmZvLT50eF9maWZvX3dyaXRlX3JlZ19hZGRyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJaWYgKCFyZWFkX2lkIHx8ICF3cml0ZV9pZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5saWtlbHkoIWVpbmZvLT50eF9maWZvX3N0YXJ0KSkKLQkJZWluZm8tPnR4X2ZpZm9fc3RhcnQgPSB3cml0ZV9pZDsKLQogCWlmIChyZWFkX2lkID4gd3JpdGVfaWQpCiAJCXdyaXRlX2F2YWlsID0gcmVhZF9pZCAtIHdyaXRlX2lkOwogCWVsc2UKQEAgLTQyNywxNCArNDMyLDE4IEBACiAJaW50IHJlYWRfYXZhaWw7CiAJaW50IHJldDsKIAotCXJldCA9IGdsaW5rX3NwaV94cHJ0X3JlZ19yZWFkKGVpbmZvLCBlaW5mby0+cnhfZmlmb19yZWFkX3JlZ19hZGRyLAotCQkJCSAgICZyZWFkX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCByZWFkaW5nICVzIHJ4X2ZpZm9fcmVhZF9yZWdfYWRkciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGVpbmZvLT54cHJ0X2NmZy5lZGdlLAotCQkJZWluZm8tPnJ4X2ZpZm9fcmVhZF9yZWdfYWRkcik7Ci0JCXJldHVybiAwOworCWlmICh1bmxpa2VseSghZWluZm8tPnJ4X2ZpZm9fc3RhcnQpKSB7CisJCXJldCA9IGdsaW5rX3NwaV94cHJ0X3JlZ19yZWFkKGVpbmZvLAorCQkJZWluZm8tPnJ4X2ZpZm9fcmVhZF9yZWdfYWRkciwgJmVpbmZvLT5yeF9maWZvX3JlYWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogRXJyb3IgJWQgcmVhZGluZyAlcyByeF9maWZvX3JlYWRfcmVnX2FkZHIgJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCwgZWluZm8tPnhwcnRfY2ZnLmVkZ2UsCisJCQkJZWluZm8tPnJ4X2ZpZm9fcmVhZF9yZWdfYWRkcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllaW5mby0+cnhfZmlmb19zdGFydCA9IGVpbmZvLT5yeF9maWZvX3JlYWQ7CiAJfQorCXJlYWRfaWQgPSBlaW5mby0+cnhfZmlmb19yZWFkOwogCiAJcmV0ID0gZ2xpbmtfc3BpX3hwcnRfcmVnX3JlYWQoZWluZm8sIGVpbmZvLT5yeF9maWZvX3dyaXRlX3JlZ19hZGRyLAogCQkJCSZ3cml0ZV9pZCk7CkBAIC00NDgsOSArNDU3LDYgQEAKIAlpZiAoIXJlYWRfaWQgfHwgIXdyaXRlX2lkKQogCQlyZXR1cm4gMDsKIAotCWlmICh1bmxpa2VseSghZWluZm8tPnJ4X2ZpZm9fc3RhcnQpKQotCQllaW5mby0+cnhfZmlmb19zdGFydCA9IHJlYWRfaWQ7Ci0KIAlpZiAocmVhZF9pZCA8PSB3cml0ZV9pZCkKIAkJcmVhZF9hdmFpbCA9IHdyaXRlX2lkIC0gcmVhZF9pZDsKIAllbHNlCkBAIC00NzcsMTUgKzQ4Myw3IEBACiAJdWludDMyX3Qgb2Zmc2V0ID0gMDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZ2xpbmtfc3BpX3hwcnRfcmVnX3JlYWQoZWluZm8sIGVpbmZvLT5yeF9maWZvX3JlYWRfcmVnX2FkZHIsCi0JCQkJICAgJnJlYWRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHJlYWRpbmcgJXMgcnhfZmlmb19yZWFkX3JlZ19hZGRyICVkXG4iLAotCQkJX19mdW5jX18sIHJldCwgZWluZm8tPnhwcnRfY2ZnLmVkZ2UsCi0JCQllaW5mby0+cnhfZmlmb19yZWFkX3JlZ19hZGRyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KKwlyZWFkX2lkID0gZWluZm8tPnJ4X2ZpZm9fcmVhZDsKIAlkbyB7CiAJCWlmICgocmVhZF9pZCArIHNpemVfdG9fcmVhZCkgPj0KIAkJICAgIChlaW5mby0+cnhfZmlmb19zdGFydCArIGVpbmZvLT5maWZvX3NpemUpKQpAQCAtNTEwLDYgKzUwOCw5IEBACiAJCXByX2VycigiJXM6IEVycm9yICVkIHdyaXRpbmcgJXMgcnhfZmlmb19yZWFkX3JlZ19hZGRyICVkXG4iLAogCQkJX19mdW5jX18sIHJldCwgZWluZm8tPnhwcnRfY2ZnLmVkZ2UsCiAJCQllaW5mby0+cnhfZmlmb19yZWFkX3JlZ19hZGRyKTsKKwllbHNlCisJCWVpbmZvLT5yeF9maWZvX3JlYWQgPSByZWFkX2lkOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTMyLDE1ICs1MzMsNyBAQAogCXVpbnQzMl90IG9mZnNldCA9IDA7CiAJaW50IHJldDsKIAotCXJldCA9IGdsaW5rX3NwaV94cHJ0X3JlZ19yZWFkKGVpbmZvLCBlaW5mby0+dHhfZmlmb193cml0ZV9yZWdfYWRkciwKLQkJCQkmd3JpdGVfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHJlYWRpbmcgJXMgdHhfZmlmb193cml0ZV9yZWdfYWRkciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGVpbmZvLT54cHJ0X2NmZy5lZGdlLAotCQkJZWluZm8tPnR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQorCXdyaXRlX2lkID0gZWluZm8tPnR4X2ZpZm9fd3JpdGU7CiAJZG8gewogCQlpZiAoKHdyaXRlX2lkICsgc2l6ZV90b193cml0ZSkgPj0KIAkJICAgIChlaW5mby0+dHhfZmlmb19zdGFydCArIGVpbmZvLT5maWZvX3NpemUpKQpAQCAtNTY1LDYgKzU1OCw5IEBACiAJCXByX2VycigiJXM6IEVycm9yICVkIHdyaXRpbmcgJXMgdHhfZmlmb193cml0ZV9yZWdfYWRkciAlZFxuIiwKIAkJCV9fZnVuY19fLCByZXQsIGVpbmZvLT54cHJ0X2NmZy5lZGdlLAogCQkJZWluZm8tPnR4X2ZpZm9fd3JpdGVfcmVnX2FkZHIpOworCWVsc2UKKwkJZWluZm8tPnR4X2ZpZm9fd3JpdGUgPSB3cml0ZV9pZDsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyNDIsNiArMTIzOCw4IEBACiAJZWluZm8tPnR4X2Jsb2NrZWRfc2lnbmFsX3NlbnQgPSBmYWxzZTsKIAllaW5mby0+dHhfZmlmb19zdGFydCA9IDA7CiAJZWluZm8tPnJ4X2ZpZm9fc3RhcnQgPSAwOworCWVpbmZvLT50eF9maWZvX3dyaXRlID0gMDsKKwllaW5mby0+cnhfZmlmb19yZWFkID0gMDsKIAllaW5mby0+Zmlmb19zaXplID0gREVGQVVMVF9GSUZPX1NJWkU7CiAJZWluZm8tPnhwcnRfaWYuZ2xpbmtfY29yZV9pZl9wdHItPmxpbmtfZG93bigmZWluZm8tPnhwcnRfaWYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL2ljbnNzLmMgYi9kcml2ZXJzL3NvYy9xY29tL2ljbnNzLmMKaW5kZXggZGM4OTFlYi4uNmNlNDgxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9pY25zcy5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vaWNuc3MuYwpAQCAtMTUyLDYgKzE1Miw4IEBACiAjZGVmaW5lIElDTlNTX1FNSV9BU1NFUlQoKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2RlZmluZSBRTUlfRVJSX1BMQVRfQ0NQTV9DTEtfSU5JVF9GQUlMRUQgMHg3NworCiBlbnVtIGljbnNzX2RlYnVnX3F1aXJrcyB7CiAJSFdfQUxXQVlTX09OLAogCUhXX0RFQlVHX0VOQUJMRSwKQEAgLTM5NSwxMiArMzk3LDYgQEAKIAl1aW50MzJfdCByZWp1dmVuYXRlX2Fja19lcnI7CiB9OwogCi0jZGVmaW5lIE1BWF9OT19PRl9NQUNfQUREUiA0Ci1zdHJ1Y3QgaWNuc3Nfd2xhbl9tYWNfYWRkciB7Ci0JdTggbWFjX2FkZHJbTUFYX05PX09GX01BQ19BRERSXVtFVEhfQUxFTl07Ci0JdWludDMyX3Qgbm9fb2ZfbWFjX2FkZHJfc2V0OwotfTsKLQogZW51bSBpY25zc19wZHJfY2F1c2VfaW5kZXggewogCUlDTlNTX0ZXX0NSQVNILAogCUlDTlNTX1JPT1RfUERfQ1JBU0gsCkBAIC00NzcsOCArNDczLDYgQEAKIAl1aW50NjRfdCB2cGhfcHdyOwogCWF0b21pY190IHBtX2NvdW50OwogCXN0cnVjdCByYW1kdW1wX2RldmljZSAqbXNhMF9kdW1wX2RldjsKLQlib29sIGlzX3dsYW5fbWFjX3NldDsKLQlzdHJ1Y3QgaWNuc3Nfd2xhbl9tYWNfYWRkciB3bGFuX21hY19hZGRyOwogCWJvb2wgYnlwYXNzX3MxX3NtbXU7CiAJdTggY2F1c2VfZm9yX3JlanV2ZW5hdGlvbjsKIAl1OCByZXF1ZXN0aW5nX3N1Yl9zeXN0ZW07CkBAIC01MDMsMTAgKzQ5NywxMCBAQAogCXBoeXNfYWRkcl90IGFkZHI7CiAJdTMyIHNpemU7CiAJdTMyIGkgPSAwOwotCXUzMiBzb3VyY2Vfdm1pZHNbSUNOU1NfTUFYX1ZNSURTXTsKKwl1MzIgc291cmNlX3ZtaWRzW0lDTlNTX01BWF9WTUlEU10gPSB7MH07CiAJdTMyIHNvdXJjZV9uZWxlbXM7Ci0JdTMyIGRlc3Rfdm1pZHNbSUNOU1NfTUFYX1ZNSURTXTsKLQl1MzIgZGVzdF9wZXJtc1tJQ05TU19NQVhfVk1JRFNdOworCXUzMiBkZXN0X3ZtaWRzW0lDTlNTX01BWF9WTUlEU10gPSB7MH07CisJdTMyIGRlc3RfcGVybXNbSUNOU1NfTUFYX1ZNSURTXSA9IHswfTsKIAl1MzIgZGVzdF9uZWxlbXM7CiAJZW51bSBpY25zc19tc2FfcGVybSBjdXJfcGVybSA9IG1lbV9yZWdpb24tPnBlcm07CiAJc3RydWN0IGljbnNzX21zYV9wZXJtX2xpc3RfdCAqbmV3X3Blcm1fbGlzdCwgKm9sZF9wZXJtX2xpc3Q7CkBAIC01NTgsNiArNTUyLDEyIEBACiAJaW50IGk7CiAJZW51bSBpY25zc19tc2FfcGVybSBvbGRfcGVybTsKIAorCWlmIChwcml2LT5ucl9tZW1fcmVnaW9uID4gUU1JX1dMRldfTUFYX05VTV9NRU1PUllfUkVHSU9OU19WMDEpIHsKKwkJaWNuc3NfcHJfZXJyKCJJbnZhbGlkIG1lbW9yeSByZWdpb24gbGVuICVkXG4iLAorCQkJICAgICBwcml2LT5ucl9tZW1fcmVnaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPm5yX21lbV9yZWdpb247IGkrKykgewogCQlvbGRfcGVybSA9IHByaXYtPm1lbV9yZWdpb25baV0ucGVybTsKIAkJcmV0ID0gaWNuc3NfYXNzaWduX21zYV9wZXJtKCZwcml2LT5tZW1fcmVnaW9uW2ldLCBuZXdfcGVybSk7CkBAIC03MzQsNyArNzM0LDcgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIHZiYXR0IHJlcXVlc3QgcmVqZWN0ZWQsIHJlc3VsdDolZCBlcnJvcjolZFxuIiwKIAkJCXJlc3AucmVzcC5yZXN1bHQsIHJlc3AucmVzcC5lcnJvcik7Ci0JCXJldCA9IHJlc3AucmVzcC5yZXN1bHQ7CisJCXJldCA9IC1yZXNwLnJlc3AucmVzdWx0OwogCQlnb3RvIG91dDsKIAl9CiAJcHJpdi0+c3RhdHMudmJhdHRfcmVzcCsrOwpAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIE1TQSBNZW0gaW5mbyByZXF1ZXN0IHJlamVjdGVkLCByZXN1bHQ6JWQgZXJyb3I6JWRcbiIsCiAJCQlyZXNwLnJlc3AucmVzdWx0LCByZXNwLnJlc3AuZXJyb3IpOwotCQlyZXQgPSByZXNwLnJlc3AucmVzdWx0OworCQlyZXQgPSAtcmVzcC5yZXNwLnJlc3VsdDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogCWlmIChyZXNwLnJlc3AucmVzdWx0ICE9IFFNSV9SRVNVTFRfU1VDQ0VTU19WMDEpIHsKIAkJaWNuc3NfcHJfZXJyKCJRTUkgTVNBIHJlYWR5IHJlcXVlc3QgcmVqZWN0ZWQ6IHJlc3VsdDolZCBlcnJvcjolZFxuIiwKIAkJCXJlc3AucmVzcC5yZXN1bHQsIHJlc3AucmVzcC5lcnJvcik7Ci0JCXJldCA9IHJlc3AucmVzcC5yZXN1bHQ7CisJCXJldCA9IC1yZXNwLnJlc3AucmVzdWx0OwogCQlnb3RvIG91dDsKIAl9CiAJcGVudi0+c3RhdHMubXNhX3JlYWR5X3Jlc3ArKzsKQEAgLTEzNTMsNyArMTM1Myw3IEBACiAJaWYgKHJlc3AucmVzcC5yZXN1bHQgIT0gUU1JX1JFU1VMVF9TVUNDRVNTX1YwMSkgewogCQlpY25zc19wcl9lcnIoIlFNSSBpbmRpY2F0aW9uIHJlZ2lzdGVyIHJlcXVlc3QgcmVqZWN0ZWQsIHJlc3V0OiVkIGVycm9yOiVkXG4iLAogCQkgICAgICAgcmVzcC5yZXNwLnJlc3VsdCwgcmVzcC5yZXNwLmVycm9yKTsKLQkJcmV0ID0gcmVzcC5yZXNwLnJlc3VsdDsKKwkJcmV0ID0gLXJlc3AucmVzcC5yZXN1bHQ7CiAJCWdvdG8gb3V0OwogCX0KIAlwZW52LT5zdGF0cy5pbmRfcmVnaXN0ZXJfcmVzcCsrOwpAQCAtMTQwMCw3ICsxNDAwLDkgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIGNhcGFiaWxpdHkgcmVxdWVzdCByZWplY3RlZCwgcmVzdWx0OiVkIGVycm9yOiVkXG4iLAogCQkgICAgICAgcmVzcC5yZXNwLnJlc3VsdCwgcmVzcC5yZXNwLmVycm9yKTsKLQkJcmV0ID0gcmVzcC5yZXNwLnJlc3VsdDsKKwkJcmV0ID0gLXJlc3AucmVzcC5yZXN1bHQ7CisJCWlmIChyZXNwLnJlc3AuZXJyb3IgPT0gUU1JX0VSUl9QTEFUX0NDUE1fQ0xLX0lOSVRfRkFJTEVEKQorCQkJaWNuc3NfcHJfZXJyKCJSRiBjYXJkIE5vdCBwcmVzZW50Iik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTQ4Myw3ICsxNDg1LDcgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIG1vZGUgcmVxdWVzdCByZWplY3RlZCwgbW9kZTolZCByZXN1bHQ6JWQgZXJyb3I6JWRcbiIsCiAJCQkgICAgIG1vZGUsIHJlc3AucmVzcC5yZXN1bHQsIHJlc3AucmVzcC5lcnJvcik7Ci0JCXJldCA9IHJlc3AucmVzcC5yZXN1bHQ7CisJCXJldCA9IC1yZXNwLnJlc3AucmVzdWx0OwogCQlnb3RvIG91dDsKIAl9CiAJcGVudi0+c3RhdHMubW9kZV9yZXNwKys7CkBAIC0xNTMzLDcgKzE1MzUsNyBAQAogCWlmIChyZXNwLnJlc3AucmVzdWx0ICE9IFFNSV9SRVNVTFRfU1VDQ0VTU19WMDEpIHsKIAkJaWNuc3NfcHJfZXJyKCJRTUkgY29uZmlnIHJlcXVlc3QgcmVqZWN0ZWQsIHJlc3VsdDolZCBlcnJvcjolZFxuIiwKIAkJICAgICAgIHJlc3AucmVzcC5yZXN1bHQsIHJlc3AucmVzcC5lcnJvcik7Ci0JCXJldCA9IHJlc3AucmVzcC5yZXN1bHQ7CisJCXJldCA9IC1yZXNwLnJlc3AucmVzdWx0OwogCQlnb3RvIG91dDsKIAl9CiAJcGVudi0+c3RhdHMuY2ZnX3Jlc3ArKzsKQEAgLTE1ODYsNyArMTU4OCw3IEBACiAJaWYgKHJlc3AucmVzcC5yZXN1bHQgIT0gUU1JX1JFU1VMVF9TVUNDRVNTX1YwMSkgewogCQlpY25zc19wcl9lcnIoIlFNSSBJTkkgcmVxdWVzdCByZWplY3RlZCwgZndfbG9nX21vZGU6JWQgcmVzdWx0OiVkIGVycm9yOiVkXG4iLAogCQkJICAgICBmd19sb2dfbW9kZSwgcmVzcC5yZXNwLnJlc3VsdCwgcmVzcC5yZXNwLmVycm9yKTsKLQkJcmV0ID0gcmVzcC5yZXNwLnJlc3VsdDsKKwkJcmV0ID0gLXJlc3AucmVzcC5yZXN1bHQ7CiAJCWdvdG8gb3V0OwogCX0KIAlwZW52LT5zdGF0cy5pbmlfcmVzcCsrOwpAQCAtMTY0Niw3ICsxNjQ4LDcgQEAKIAlpZiAocmVzcC0+cmVzcC5yZXN1bHQgIT0gUU1JX1JFU1VMVF9TVUNDRVNTX1YwMSkgewogCQlpY25zc19wcl9lcnIoIlFNSSBhdGhkaWFnIHJlYWQgcmVxdWVzdCByZWplY3RlZCwgcmVzdWx0OiVkIGVycm9yOiVkXG4iLAogCQkJICAgICByZXNwLT5yZXNwLnJlc3VsdCwgcmVzcC0+cmVzcC5lcnJvcik7Ci0JCXJldCA9IHJlc3AtPnJlc3AucmVzdWx0OworCQlyZXQgPSAtcmVzcC0+cmVzcC5yZXN1bHQ7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTcxMiw3ICsxNzE0LDcgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIGF0aGRpYWcgd3JpdGUgcmVxdWVzdCByZWplY3RlZCwgcmVzdWx0OiVkIGVycm9yOiVkXG4iLAogCQkJICAgICByZXNwLnJlc3AucmVzdWx0LCByZXNwLnJlc3AuZXJyb3IpOwotCQlyZXQgPSByZXNwLnJlc3AucmVzdWx0OworCQlyZXQgPSAtcmVzcC5yZXNwLnJlc3VsdDsKIAkJZ290byBvdXQ7CiAJfQogb3V0OgpAQCAtMTgwNyw3ICsxODA5LDcgQEAKIAlpZiAocmVzcC5yZXNwLnJlc3VsdCAhPSBRTUlfUkVTVUxUX1NVQ0NFU1NfVjAxKSB7CiAJCWljbnNzX3ByX2VycigiUU1JIHJlanV2ZW5hdGUgYWNrIHJlcXVlc3QgcmVqZWN0ZWQsIHJlc3VsdDolZCBlcnJvciAlZFxuIiwKIAkJCSAgICAgcmVzcC5yZXNwLnJlc3VsdCwgcmVzcC5yZXNwLmVycm9yKTsKLQkJcmV0ID0gcmVzcC5yZXNwLnJlc3VsdDsKKwkJcmV0ID0gLXJlc3AucmVzcC5yZXN1bHQ7CiAJCWdvdG8gb3V0OwogCX0KIAlwcml2LT5zdGF0cy5yZWp1dmVuYXRlX2Fja19yZXNwKys7CkBAIC0xODY4LDcgKzE4NzAsNyBAQAogCWlmIChyZXNwLnJlc3AucmVzdWx0ICE9IFFNSV9SRVNVTFRfU1VDQ0VTU19WMDEpIHsKIAkJaWNuc3NfcHJfZXJyKCJRTUkgZHluYW1pYyBmZWF0dXJlIG1hc2sgcmVxdWVzdCByZWplY3RlZCwgcmVzdWx0OiVkIGVycm9yICVkXG4iLAogCQkJICAgICByZXNwLnJlc3AucmVzdWx0LCByZXNwLnJlc3AuZXJyb3IpOwotCQlyZXQgPSByZXNwLnJlc3AucmVzdWx0OworCQlyZXQgPSAtcmVzcC5yZXNwLnJlc3VsdDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zMjY5LDc4ICszMjcxLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWNuc3Nfc29jaW5mb19nZXRfc2VyaWFsX251bWJlcik7CiAKLWludCBpY25zc19zZXRfd2xhbl9tYWNfYWRkcmVzcyhjb25zdCB1OCAqaW4sIGNvbnN0IHVpbnQzMl90IGxlbikKLXsKLQlzdHJ1Y3QgaWNuc3NfcHJpdiAqcHJpdiA9IHBlbnY7Ci0JdWludDMyX3Qgbm9fb2ZfbWFjX2FkZHI7Ci0Jc3RydWN0IGljbnNzX3dsYW5fbWFjX2FkZHIgKmFkZHIgPSBOVUxMOwotCWludCBpdGVyOwotCXU4ICp0ZW1wID0gTlVMTDsKLQotCWlmICghcHJpdikgewotCQlpY25zc19wcl9lcnIoIlByaXYgZGF0YSBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHByaXYtPmlzX3dsYW5fbWFjX3NldCkgewotCQlpY25zc19wcl9kYmcoIldMQU4gTUFDIGFkZHJlc3MgaXMgYWxyZWFkeSBzZXRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobGVuID09IDAgfHwgKGxlbiAlIEVUSF9BTEVOKSAhPSAwKSB7Ci0JCWljbnNzX3ByX2VycigiSW52YWxpZCBsZW5ndGggJWRcbiIsIGxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW5vX29mX21hY19hZGRyID0gbGVuIC8gRVRIX0FMRU47Ci0JaWYgKG5vX29mX21hY19hZGRyID4gTUFYX05PX09GX01BQ19BRERSKSB7Ci0JCWljbnNzX3ByX2VycigiRXhjZWVkIG1heGludW0gc3VwcG9ydGVkIE1BQyBhZGRyZXNzICV1ICV1XG4iLAotCQkJICAgICBNQVhfTk9fT0ZfTUFDX0FERFIsIG5vX29mX21hY19hZGRyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJpdi0+aXNfd2xhbl9tYWNfc2V0ID0gdHJ1ZTsKLQlhZGRyID0gJnByaXYtPndsYW5fbWFjX2FkZHI7Ci0JYWRkci0+bm9fb2ZfbWFjX2FkZHJfc2V0ID0gbm9fb2ZfbWFjX2FkZHI7Ci0JdGVtcCA9ICZhZGRyLT5tYWNfYWRkclswXVswXTsKLQotCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBub19vZl9tYWNfYWRkcjsKLQkgICAgICsraXRlciwgdGVtcCArPSBFVEhfQUxFTiwgaW4gKz0gRVRIX0FMRU4pIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHRlbXAsIGluKTsKLQkJaWNuc3NfcHJfZGJnKCJNQUNfQUREUjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCSAgICAgdGVtcFswXSwgdGVtcFsxXSwgdGVtcFsyXSwKLQkJCSAgICAgdGVtcFszXSwgdGVtcFs0XSwgdGVtcFs1XSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGljbnNzX3NldF93bGFuX21hY19hZGRyZXNzKTsKLQotdTggKmljbnNzX2dldF93bGFuX21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgKm51bSkKLXsKLQlzdHJ1Y3QgaWNuc3NfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpY25zc193bGFuX21hY19hZGRyICphZGRyID0gTlVMTDsKLQotCWlmIChwcml2LT5tYWdpYyAhPSBJQ05TU19NQUdJQykgewotCQlpY25zc19wcl9lcnIoIkludmFsaWQgZHJ2ZGF0YTogZGV2ICVwLCBkYXRhICVwLCBtYWdpYyAweCV4XG4iLAotCQkJICAgICBkZXYsIHByaXYsIHByaXYtPm1hZ2ljKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCFwcml2LT5pc193bGFuX21hY19zZXQpIHsKLQkJaWNuc3NfcHJfZGJnKCJXTEFOIE1BQyBhZGRyZXNzIGlzIG5vdCBzZXRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhZGRyID0gJnByaXYtPndsYW5fbWFjX2FkZHI7Ci0JKm51bSA9IGFkZHItPm5vX29mX21hY19hZGRyX3NldDsKLQlyZXR1cm4gJmFkZHItPm1hY19hZGRyWzBdWzBdOwotb3V0OgotCSpudW0gPSAwOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChpY25zc19nZXRfd2xhbl9tYWNfYWRkcmVzcyk7Ci0KIGludCBpY25zc190cmlnZ2VyX3JlY292ZXJ5KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vaWNuc3NfdXRpbHMuYyBiL2RyaXZlcnMvc29jL3Fjb20vaWNuc3NfdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3NDE0Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL2ljbnNzX3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9pY25zcy5oPgotCi0jZGVmaW5lIElDTlNTX01BWF9DSF9OVU0gNDUKLQotc3RhdGljIERFRklORV9NVVRFWCh1bnNhZmVfY2hhbm5lbF9saXN0X2xvY2spOwotc3RhdGljIERFRklORV9TUElOTE9DSyhkZnNfbm9sX2luZm9fbG9jayk7Ci1zdGF0aWMgaW50IGRyaXZlcl9sb2FkX2NudDsKLQotc3RhdGljIHN0cnVjdCBpY25zc191bnNhZmVfY2hhbm5lbF9saXN0IHsKLQl1MTYgdW5zYWZlX2NoX2NvdW50OwotCXUxNiB1bnNhZmVfY2hfbGlzdFtJQ05TU19NQVhfQ0hfTlVNXTsKLX0gdW5zYWZlX2NoYW5uZWxfbGlzdDsKLQotc3RhdGljIHN0cnVjdCBpY25zc19kZnNfbm9sX2luZm8gewotCXZvaWQgKmRmc19ub2xfaW5mbzsKLQl1MTYgZGZzX25vbF9pbmZvX2xlbjsKLX0gZGZzX25vbF9pbmZvOwotCi1pbnQgaWNuc3Nfc2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwodTE2ICp1bnNhZmVfY2hfbGlzdCwgdTE2IGNoX2NvdW50KQotewotCW11dGV4X2xvY2soJnVuc2FmZV9jaGFubmVsX2xpc3RfbG9jayk7Ci0JaWYgKCghdW5zYWZlX2NoX2xpc3QpIHx8IChjaF9jb3VudCA+IElDTlNTX01BWF9DSF9OVU0pKSB7Ci0JCW11dGV4X3VubG9jaygmdW5zYWZlX2NoYW5uZWxfbGlzdF9sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdW5zYWZlX2NoYW5uZWxfbGlzdC51bnNhZmVfY2hfY291bnQgPSBjaF9jb3VudDsKLQotCWlmIChjaF9jb3VudCAhPSAwKSB7Ci0JCW1lbWNweSgKLQkJICAgICAgIChjaGFyICopdW5zYWZlX2NoYW5uZWxfbGlzdC51bnNhZmVfY2hfbGlzdCwKLQkJICAgICAgIChjaGFyICopdW5zYWZlX2NoX2xpc3QsIGNoX2NvdW50ICogc2l6ZW9mKHUxNikpOwotCX0KLQltdXRleF91bmxvY2soJnVuc2FmZV9jaGFubmVsX2xpc3RfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaWNuc3Nfc2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwpOwotCi1pbnQgaWNuc3NfZ2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwodTE2ICp1bnNhZmVfY2hfbGlzdCwKLQkJCQkgIHUxNiAqY2hfY291bnQsIHUxNiBidWZfbGVuKQotewotCW11dGV4X2xvY2soJnVuc2FmZV9jaGFubmVsX2xpc3RfbG9jayk7Ci0JaWYgKCF1bnNhZmVfY2hfbGlzdCB8fCAhY2hfY291bnQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZ1bnNhZmVfY2hhbm5lbF9saXN0X2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYnVmX2xlbiA8ICh1bnNhZmVfY2hhbm5lbF9saXN0LnVuc2FmZV9jaF9jb3VudCAqIHNpemVvZih1MTYpKSkgewotCQltdXRleF91bmxvY2soJnVuc2FmZV9jaGFubmVsX2xpc3RfbG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCSpjaF9jb3VudCA9IHVuc2FmZV9jaGFubmVsX2xpc3QudW5zYWZlX2NoX2NvdW50OwotCW1lbWNweSgKLQkJKGNoYXIgKil1bnNhZmVfY2hfbGlzdCwKLQkJKGNoYXIgKil1bnNhZmVfY2hhbm5lbF9saXN0LnVuc2FmZV9jaF9saXN0LAotCQl1bnNhZmVfY2hhbm5lbF9saXN0LnVuc2FmZV9jaF9jb3VudCAqIHNpemVvZih1MTYpKTsKLQltdXRleF91bmxvY2soJnVuc2FmZV9jaGFubmVsX2xpc3RfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaWNuc3NfZ2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwpOwotCi1pbnQgaWNuc3Nfd2xhbl9zZXRfZGZzX25vbChjb25zdCB2b2lkICppbmZvLCB1MTYgaW5mb19sZW4pCi17Ci0Jdm9pZCAqdGVtcDsKLQl2b2lkICpvbGRfbm9sX2luZm87Ci0Jc3RydWN0IGljbnNzX2Rmc19ub2xfaW5mbyAqZGZzX2luZm87Ci0KLQlpZiAoIWluZm8gfHwgIWluZm9fbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRlbXAgPSBrbWFsbG9jKGluZm9fbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXRlbXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtY3B5KHRlbXAsIGluZm8sIGluZm9fbGVuKTsKLQlzcGluX2xvY2tfYmgoJmRmc19ub2xfaW5mb19sb2NrKTsKLQlkZnNfaW5mbyA9ICZkZnNfbm9sX2luZm87Ci0Jb2xkX25vbF9pbmZvID0gZGZzX2luZm8tPmRmc19ub2xfaW5mbzsKLQlkZnNfaW5mby0+ZGZzX25vbF9pbmZvID0gdGVtcDsKLQlkZnNfaW5mby0+ZGZzX25vbF9pbmZvX2xlbiA9IGluZm9fbGVuOwotCXNwaW5fdW5sb2NrX2JoKCZkZnNfbm9sX2luZm9fbG9jayk7Ci0Ja2ZyZWUob2xkX25vbF9pbmZvKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpY25zc193bGFuX3NldF9kZnNfbm9sKTsKLQotaW50IGljbnNzX3dsYW5fZ2V0X2Rmc19ub2wodm9pZCAqaW5mbywgdTE2IGluZm9fbGVuKQotewotCWludCBsZW47Ci0Jc3RydWN0IGljbnNzX2Rmc19ub2xfaW5mbyAqZGZzX2luZm87Ci0KLQlpZiAoIWluZm8gfHwgIWluZm9fbGVuKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNwaW5fbG9ja19iaCgmZGZzX25vbF9pbmZvX2xvY2spOwotCi0JZGZzX2luZm8gPSAmZGZzX25vbF9pbmZvOwotCWlmIChkZnNfaW5mby0+ZGZzX25vbF9pbmZvID09IE5VTEwgfHwKLQkgICAgZGZzX2luZm8tPmRmc19ub2xfaW5mb19sZW4gPT0gMCkgewotCQlzcGluX3VubG9ja19iaCgmZGZzX25vbF9pbmZvX2xvY2spOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQlsZW4gPSBtaW4oaW5mb19sZW4sIGRmc19pbmZvLT5kZnNfbm9sX2luZm9fbGVuKTsKLQltZW1jcHkoaW5mbywgZGZzX2luZm8tPmRmc19ub2xfaW5mbywgbGVuKTsKLQlzcGluX3VubG9ja19iaCgmZGZzX25vbF9pbmZvX2xvY2spOwotCi0JcmV0dXJuIGxlbjsKLX0KLUVYUE9SVF9TWU1CT0woaWNuc3Nfd2xhbl9nZXRfZGZzX25vbCk7Ci0KLXZvaWQgaWNuc3NfaW5jcmVtZW50X2RyaXZlcl9sb2FkX2NudCh2b2lkKQotewotCSsrZHJpdmVyX2xvYWRfY250OwotfQotRVhQT1JUX1NZTUJPTChpY25zc19pbmNyZW1lbnRfZHJpdmVyX2xvYWRfY250KTsKLQotaW50IGljbnNzX2dldF9kcml2ZXJfbG9hZF9jbnQodm9pZCkKLXsKLQlyZXR1cm4gZHJpdmVyX2xvYWRfY250OwotfQotRVhQT1JUX1NZTUJPTChpY25zc19nZXRfZHJpdmVyX2xvYWRfY250KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vanRhZ3Y4LWV0bS5jIGIvZHJpdmVycy9zb2MvcWNvbS9qdGFndjgtZXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4Y2M5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vanRhZ3Y4LWV0bS5jCkBAIC0wLDAgKzEsMTcyMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KKyNpbmNsdWRlIDxzb2MvcWNvbS9qdGFnLmg+CisjaW5jbHVkZSA8YXNtL3NtcF9wbGF0Lmg+CisjaW5jbHVkZSA8YXNtL2V0bXY0eC5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NvY2luZm8uaD4KKworI2RlZmluZSBDT1JFU0lHSFRfTEFSCQkoMHhGQjApCisKKyNkZWZpbmUgVElNRU9VVF9VUwkJKDEwMCkKKworI2RlZmluZSBCTShsc2IsIG1zYikJCSgoQklUKG1zYikgLSBCSVQobHNiKSkgKyBCSVQobXNiKSkKKyNkZWZpbmUgQk1WQUwodmFsLCBsc2IsIG1zYikJKCh2YWwgJiBCTShsc2IsIG1zYikpID4+IGxzYikKKyNkZWZpbmUgQlZBTCh2YWwsIG4pCQkoKHZhbCAmIEJJVChuKSkgPj4gbikKKworLyoKKyAqIEVUTXY0IHJlZ2lzdGVyczoKKyAqIDB4MDAwIC0gMHgyRkM6IFRyYWNlICAgICAgICAgcmVnaXN0ZXJzCisgKiAweDMwMCAtIDB4MzE0OiBNYW5hZ2VtZW50ICAgIHJlZ2lzdGVycworICogMHgzMTggLSAweEVGQzogVHJhY2UgICAgICAgICByZWdpc3RlcnMKKyAqIDB4RjAwOiBNYW5hZ2VtZW50CQlyZWdpc3RlcnMKKyAqIDB4RkEwIC0gMHhGQTQ6IFRyYWNlCQlyZWdpc3RlcnMKKyAqIDB4RkE4IC0gMHhGRkM6IE1hbmFnZW1lbnQJcmVnaXN0ZXJzCisgKi8KKworLyogVHJhY2UgcmVnaXN0ZXJzICgweDAwMC0weDJGQykgKi8KKy8qIE1haW4gY29udHJvbCBhbmQgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgICovCisjZGVmaW5lIFRSQ1BSR0NUTFIJCQkoMHgwMDQpCisjZGVmaW5lIFRSQ1BST0NTRUxSCQkJKDB4MDA4KQorI2RlZmluZSBUUkNTVEFUUgkJCSgweDAwQykKKyNkZWZpbmUgVFJDQ09ORklHUgkJCSgweDAxMCkKKyNkZWZpbmUgVFJDQVVYQ1RMUgkJCSgweDAxOCkKKyNkZWZpbmUgVFJDRVZFTlRDVEwwUgkJCSgweDAyMCkKKyNkZWZpbmUgVFJDRVZFTlRDVEwxUgkJCSgweDAyNCkKKyNkZWZpbmUgVFJDU1RBTExDVExSCQkJKDB4MDJDKQorI2RlZmluZSBUUkNUU0NUTFIJCQkoMHgwMzApCisjZGVmaW5lIFRSQ1NZTkNQUgkJCSgweDAzNCkKKyNkZWZpbmUgVFJDQ0NDVExSCQkJKDB4MDM4KQorI2RlZmluZSBUUkNCQkNUTFIJCQkoMHgwM0MpCisjZGVmaW5lIFRSQ1RSQUNFSURSCQkJKDB4MDQwKQorI2RlZmluZSBUUkNRQ1RMUgkJCSgweDA0NCkKKy8qIEZpbHRlcmluZyBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBUUkNWSUNUTFIJCQkoMHgwODApCisjZGVmaW5lIFRSQ1ZJSUVDVExSCQkJKDB4MDg0KQorI2RlZmluZSBUUkNWSVNTQ1RMUgkJCSgweDA4OCkKKyNkZWZpbmUgVFJDVklQQ1NTQ1RMUgkJCSgweDA4QykKKyNkZWZpbmUgVFJDVkRDVExSCQkJKDB4MEEwKQorI2RlZmluZSBUUkNWRFNBQ0NUTFIJCQkoMHgwQTQpCisjZGVmaW5lIFRSQ1ZEQVJDQ1RMUgkJCSgweDBBOCkKKy8qIERlcml2ZWQgcmVzb3VyY2VzIHJlZ2lzdGVycyAqLworI2RlZmluZSBUUkNTRVFFVlJuKG4pCQkJKDB4MTAwICsgKG4gKiA0KSkKKyNkZWZpbmUgVFJDU0VRUlNURVZSCQkJKDB4MTE4KQorI2RlZmluZSBUUkNTRVFTVFIJCQkoMHgxMUMpCisjZGVmaW5lIFRSQ0VYVElOU0VMUgkJCSgweDEyMCkKKyNkZWZpbmUgVFJDQ05UUkxEVlJuKG4pCQkJKDB4MTQwICsgKG4gKiA0KSkKKyNkZWZpbmUgVFJDQ05UQ1RMUm4obikJCQkoMHgxNTAgKyAobiAqIDQpKQorI2RlZmluZSBUUkNDTlRWUm4obikJCQkoMHgxNjAgKyAobiAqIDQpKQorLyogSUQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRSQ0lEUjgJCQkJKDB4MTgwKQorI2RlZmluZSBUUkNJRFI5CQkJCSgweDE4NCkKKyNkZWZpbmUgVFJDSURSMTAJCQkoMHgxODgpCisjZGVmaW5lIFRSQ0lEUjExCQkJKDB4MThDKQorI2RlZmluZSBUUkNJRFIxMgkJCSgweDE5MCkKKyNkZWZpbmUgVFJDSURSMTMJCQkoMHgxOTQpCisjZGVmaW5lIFRSQ0lNU1BFQzAJCQkoMHgxQzApCisjZGVmaW5lIFRSQ0lNU1BFQ24obikJCQkoMHgxQzAgKyAobiAqIDQpKQorI2RlZmluZSBUUkNJRFIwCQkJCSgweDFFMCkKKyNkZWZpbmUgVFJDSURSMQkJCQkoMHgxRTQpCisjZGVmaW5lIFRSQ0lEUjIJCQkJKDB4MUU4KQorI2RlZmluZSBUUkNJRFIzCQkJCSgweDFFQykKKyNkZWZpbmUgVFJDSURSNAkJCQkoMHgxRjApCisjZGVmaW5lIFRSQ0lEUjUJCQkJKDB4MUY0KQorI2RlZmluZSBUUkNJRFI2CQkJCSgweDFGOCkKKyNkZWZpbmUgVFJDSURSNwkJCQkoMHgxRkMpCisvKiBSZXNvdXJjZSBzZWxlY3Rpb24gcmVnaXN0ZXJzICovCisjZGVmaW5lIFRSQ1JTQ1RMUm4obikJCQkoMHgyMDAgKyAobiAqIDQpKQorLyogU2luZ2xlLXNob3QgY29tcGFyYXRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVFJDU1NDQ1JuKG4pCQkJKDB4MjgwICsgKG4gKiA0KSkKKyNkZWZpbmUgVFJDU1NDU1JuKG4pCQkJKDB4MkEwICsgKG4gKiA0KSkKKyNkZWZpbmUgVFJDU1NQQ0lDUm4obikJCQkoMHgyQzAgKyAobiAqIDQpKQorLyogTWFuYWdlbWVudCByZWdpc3RlcnMgKDB4MzAwLTB4MzE0KSAqLworI2RlZmluZSBUUkNPU0xBUgkJCSgweDMwMCkKKyNkZWZpbmUgVFJDT1NMU1IJCQkoMHgzMDQpCisjZGVmaW5lIFRSQ1BEQ1IJCQkJKDB4MzEwKQorI2RlZmluZSBUUkNQRFNSCQkJCSgweDMxNCkKKy8qIFRyYWNlIHJlZ2lzdGVycyAoMHgzMTgtMHhFRkMpICovCisvKiBDb21wYXJhdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBUUkNBQ1ZSbihuKQkJCSgweDQwMCArIChuICogOCkpCisjZGVmaW5lIFRSQ0FDQVRSbihuKQkJCSgweDQ4MCArIChuICogOCkpCisjZGVmaW5lIFRSQ0RWQ1ZSbihuKQkJCSgweDUwMCArIChuICogMTYpKQorI2RlZmluZSBUUkNEVkNNUm4obikJCQkoMHg1ODAgKyAobiAqIDE2KSkKKyNkZWZpbmUgVFJDQ0lEQ1ZSbihuKQkJCSgweDYwMCArIChuICogOCkpCisjZGVmaW5lIFRSQ1ZNSURDVlJuKG4pCQkJKDB4NjQwICsgKG4gKiA4KSkKKyNkZWZpbmUgVFJDQ0lEQ0NUTFIwCQkJKDB4NjgwKQorI2RlZmluZSBUUkNDSURDQ1RMUjEJCQkoMHg2ODQpCisjZGVmaW5lIFRSQ1ZNSURDQ1RMUjAJCQkoMHg2ODgpCisjZGVmaW5lIFRSQ1ZNSURDQ1RMUjEJCQkoMHg2OEMpCisvKiBNYW5hZ2VtZW50IHJlZ2lzdGVyICgweEYwMCkgKi8KKy8qIEludGVncmF0aW9uIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRSQ0lUQ1RSTAkJCSgweEYwMCkKKy8qIFRyYWNlIHJlZ2lzdGVycyAoMHhGQTAtMHhGQTQpICovCisvKiBDbGFpbSB0YWcgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRSQ0NMQUlNU0VUCQkJKDB4RkEwKQorI2RlZmluZSBUUkNDTEFJTUNMUgkJCSgweEZBNCkKKy8qIE1hbmFnZW1lbnQgcmVnaXN0ZXJzICgweEZBOC0weEZGQykgKi8KKyNkZWZpbmUgVFJDREVWQUZGMAkJCSgweEZBOCkKKyNkZWZpbmUgVFJDREVWQUZGMQkJCSgweEZBQykKKyNkZWZpbmUgVFJDTEFSCQkJCSgweEZCMCkKKyNkZWZpbmUgVFJDTFNSCQkJCSgweEZCNCkKKyNkZWZpbmUgVFJDQVVUSFNUQVRVUwkJCSgweEZCOCkKKyNkZWZpbmUgVFJDREVWQVJDSAkJCSgweEZCQykKKyNkZWZpbmUgVFJDREVWSUQJCQkoMHhGQzgpCisjZGVmaW5lIFRSQ0RFVlRZUEUJCQkoMHhGQ0MpCisjZGVmaW5lIFRSQ1BJRFI0CQkJKDB4RkQwKQorI2RlZmluZSBUUkNQSURSNQkJCSgweEZENCkKKyNkZWZpbmUgVFJDUElEUjYJCQkoMHhGRDgpCisjZGVmaW5lIFRSQ1BJRFI3CQkJKDB4RkRDKQorI2RlZmluZSBUUkNQSURSMAkJCSgweEZFMCkKKyNkZWZpbmUgVFJDUElEUjEJCQkoMHhGRTQpCisjZGVmaW5lIFRSQ1BJRFIyCQkJKDB4RkU4KQorI2RlZmluZSBUUkNQSURSMwkJCSgweEZFQykKKyNkZWZpbmUgVFJDQ0lEUjAJCQkoMHhGRjApCisjZGVmaW5lIFRSQ0NJRFIxCQkJKDB4RkY0KQorI2RlZmluZSBUUkNDSURSMgkJCSgweEZGOCkKKyNkZWZpbmUgVFJDQ0lEUjMJCQkoMHhGRkMpCisKKy8qIEVUTXY0IHJlc291cmNlcyAqLworI2RlZmluZSBFVE1fTUFYX05SX1BFCQkJKDgpCisjZGVmaW5lIEVUTV9NQVhfQ05UUgkJCSg0KQorI2RlZmluZSBFVE1fTUFYX1NFUV9TVEFURVMJCSg0KQorI2RlZmluZSBFVE1fTUFYX0VYVF9JTlBfU0VMCQkoNCkKKyNkZWZpbmUgRVRNX01BWF9FWFRfSU5QCQkJKDI1NikKKyNkZWZpbmUgRVRNX01BWF9FWFRfT1VUCQkJKDQpCisjZGVmaW5lIEVUTV9NQVhfU0lOR0xFX0FERFJfQ01QCQkoMTYpCisjZGVmaW5lIEVUTV9NQVhfQUREUl9SQU5HRV9DTVAJCShFVE1fTUFYX1NJTkdMRV9BRERSX0NNUCAvIDIpCisjZGVmaW5lIEVUTV9NQVhfREFUQV9WQUxfQ01QCQkoOCkKKyNkZWZpbmUgRVRNX01BWF9DVFhJRF9DTVAJCSg4KQorI2RlZmluZSBFVE1fTUFYX1ZNSURfQ01QCQkoOCkKKyNkZWZpbmUgRVRNX01BWF9QRV9DTVAJCQkoOCkKKyNkZWZpbmUgRVRNX01BWF9SRVNfU0VMCQkJKDMyKQorI2RlZmluZSBFVE1fTUFYX1NTX0NNUAkJCSg4KQorCisjZGVmaW5lIEVUTV9DUE1SX0NMS0VOCQkJKDB4NCkKKyNkZWZpbmUgRVRNX0FSQ0hfVjQJCQkoMHg0MCkKKyNkZWZpbmUgRVRNX0FSQ0hfVjRfMgkJCSgweDQyKQorCisjZGVmaW5lIE1BWF9FVE1fU1RBVEVfU0laRQkoMTY1KQorCisjZGVmaW5lIFRaX0RCR19FVE1fRkVBVF9JRAkoMHg4KQorI2RlZmluZSBUWl9EQkdfRVRNX1ZFUgkJKDB4NDAwMDAwKQorI2RlZmluZSBIV19TT0NfSURfTTg5NTMJCSgyOTMpCisKKyNkZWZpbmUgZXRtX3dyaXRlbChldG0sIHZhbCwgb2ZmKQlcCisJCSAgIF9fcmF3X3dyaXRlbCh2YWwsIGV0bS0+YmFzZSArIG9mZikKKyNkZWZpbmUgZXRtX3JlYWRsKGV0bSwgb2ZmKQkJXAorCQkgIF9fcmF3X3JlYWRsKGV0bS0+YmFzZSArIG9mZikKKworI2RlZmluZSBldG1fd3JpdGVxKGV0bSwgdmFsLCBvZmYpCVwKKwkJICAgX19yYXdfd3JpdGVxKHZhbCwgZXRtLT5iYXNlICsgb2ZmKQorI2RlZmluZSBldG1fcmVhZHEoZXRtLCBvZmYpCQlcCisJCSAgX19yYXdfcmVhZHEoZXRtLT5iYXNlICsgb2ZmKQorCisjZGVmaW5lIEVUTV9MT0NLKGJhc2UpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJbWIoKTsgLyogZW5zdXJlIGNvbmZpZ3VyYXRpb24gdGFrZSBlZmZlY3QgYmVmb3JlIHdlIGxvY2sgaXQgKi8JXAorCWV0bV93cml0ZWwoYmFzZSwgMHgwLCBDT1JFU0lHSFRfTEFSKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBFVE1fVU5MT0NLKGJhc2UpCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlldG1fd3JpdGVsKGJhc2UsIENPUkVTSUdIVF9VTkxPQ0ssIENPUkVTSUdIVF9MQVIpOwkJXAorCW1iKCk7IC8qIGVuc3VyZSB1bmxvY2sgdGFrZSBlZmZlY3QgYmVmb3JlIHdlIGNvbmZpZ3VyZSAqLwlcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgZXRtX2N0eCB7CisJdWludDhfdAkJCWFyY2g7CisJdWludDhfdAkJCW5yX3BlOworCXVpbnQ4X3QJCQlucl9wZV9jbXA7CisJdWludDhfdAkJCW5yX2FkZHJfY21wOworCXVpbnQ4X3QJCQlucl9kYXRhX2NtcDsKKwl1aW50OF90CQkJbnJfY250cjsKKwl1aW50OF90CQkJbnJfZXh0X2lucDsKKwl1aW50OF90CQkJbnJfZXh0X2lucF9zZWw7CisJdWludDhfdAkJCW5yX2V4dF9vdXQ7CisJdWludDhfdAkJCW5yX2N0eGlkX2NtcDsKKwl1aW50OF90CQkJbnJfdm1pZF9jbXA7CisJdWludDhfdAkJCW5yX3NlcV9zdGF0ZTsKKwl1aW50OF90CQkJbnJfZXZlbnQ7CisJdWludDhfdAkJCW5yX3Jlc291cmNlOworCXVpbnQ4X3QJCQlucl9zc19jbXA7CisJYm9vbAkJCXNpX2VuYWJsZTsKKwlib29sCQkJc2F2ZV9yZXN0b3JlX2Rpc2FibGVkOworCWJvb2wJCQlzYXZlX3Jlc3RvcmVfZW5hYmxlZDsKKwlib29sCQkJb3NfbG9ja19wcmVzZW50OworCWJvb2wJCQlpbml0OworCWJvb2wJCQllbmFibGU7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXVpbnQ2NF90CQkqc3RhdGU7CisJc3BpbmxvY2tfdAkJc3BpbmxvY2s7CisJc3RydWN0IG11dGV4CQltdXRleDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRtX2N0eCAqZXRtW05SX0NQVVNdOworc3RhdGljIGludCBjbnQ7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbG9ja1tOUl9DUFVTXTsKKworc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGV0bV9zYXZlX25vdGlmaWVyX2xpc3QpOworc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKGV0bV9yZXN0b3JlX25vdGlmaWVyX2xpc3QpOworCitpbnQgbXNtX2p0YWdfc2F2ZV9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmV0bV9zYXZlX25vdGlmaWVyX2xpc3QsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2p0YWdfc2F2ZV9yZWdpc3Rlcik7CisKK2ludCBtc21fanRhZ19zYXZlX3VucmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmV0bV9zYXZlX25vdGlmaWVyX2xpc3QsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2p0YWdfc2F2ZV91bnJlZ2lzdGVyKTsKKworaW50IG1zbV9qdGFnX3Jlc3RvcmVfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZldG1fcmVzdG9yZV9ub3RpZmllcl9saXN0LCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9qdGFnX3Jlc3RvcmVfcmVnaXN0ZXIpOworCitpbnQgbXNtX2p0YWdfcmVzdG9yZV91bnJlZ2lzdGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZldG1fcmVzdG9yZV9ub3RpZmllcl9saXN0LCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9qdGFnX3Jlc3RvcmVfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIGV0bV9vc19sb2NrKHN0cnVjdCBldG1fY3R4ICpldG1kYXRhKQoreworCWlmIChldG1kYXRhLT5vc19sb2NrX3ByZXNlbnQpIHsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCAweDEsIFRSQ09TTEFSKTsKKwkJLyogRW5zdXJlIE9TIGxvY2sgaXMgc2V0IGJlZm9yZSBwcm9jZWVkaW5nICovCisJCW1iKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBldG1fb3NfdW5sb2NrKHN0cnVjdCBldG1fY3R4ICpldG1kYXRhKQoreworCWlmIChldG1kYXRhLT5vc19sb2NrX3ByZXNlbnQpIHsKKwkJLyogRW5zdXJlIGFsbCB3cml0ZXMgYXJlIGNvbXBsZXRlIGJlZm9yZSBjbGVhcmluZyBPUyBsb2NrICovCisJCW1iKCk7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgMHgwLCBUUkNPU0xBUik7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXRtX21tX3NhdmVfc3RhdGUoc3RydWN0IGV0bV9jdHggKmV0bWRhdGEpCit7CisJaW50IGksIGosIGNvdW50OworCisJaSA9IDA7CisJbWIoKTsgLyogZW5zdXJlIGFsbCByZWdpc3RlciB3cml0ZXMgY29tcGxldGUgYmVmb3JlIHNhdmluZyB0aGVtICovCisJaXNiKCk7CisJRVRNX1VOTE9DSyhldG1kYXRhKTsKKworCXN3aXRjaCAoZXRtZGF0YS0+YXJjaCkgeworCWNhc2UgRVRNX0FSQ0hfVjRfMjoKKwljYXNlIEVUTV9BUkNIX1Y0OgorCQlldG1fb3NfbG9jayhldG1kYXRhKTsKKworCQkvKiBwb2xsIHVudGlsIHByb2dyYW1tZXJzJyBtb2RlbCBiZWNvbWVzIHN0YWJsZSAqLworCQlmb3IgKGNvdW50ID0gVElNRU9VVF9VUzsgKEJWQUwoZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1NUQVRSKSwgMSkKKwkJICAgICAhPSAxKSAmJiBjb3VudCA+IDA7IGNvdW50LS0pCisJCQl1ZGVsYXkoMSk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJwcm9ncmFtbWVycyBtb2RlbCBpcyBub3Qgc3RhYmxlXG4iCisJCQkJCSAgICk7CisKKwkJLyogbWFpbiBjb250cm9sIGFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1BST0NTRUxSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNDT05GSUdSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNBVVhDVExSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNFVkVOVENUTDBSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNFVkVOVENUTDFSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNTVEFMTENUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1RTQ1RMUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDU1lOQ1BSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNDQ0NUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ0JCQ1RMUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVFJBQ0VJRFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1FDVExSKTsKKwkJLyogZmlsdGVyaW5nIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVklDVExSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNWSUlFQ1RMUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVklTU0NUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1ZJUENTU0NUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1ZEQ1RMUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVkRTQUNDVExSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNWREFSQ0NUTFIpOworCQkvKiBkZXJpdmVkIHJlc291cmNlIHJlZ2lzdGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfc2VxX3N0YXRlLTE7IGorKykKKwkJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDU0VRRVZSbihqKSk7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDU0VRUlNURVZSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNTRVFTVFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ0VYVElOU0VMUik7CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9jbnRyOyBqKyspICB7CisJCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsCisJCQkJCQkgICAgICAgVFJDQ05UUkxEVlJuKGopKTsKKwkJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwKKwkJCQkJCSAgICAgICBUUkNDTlRDVExSbihqKSk7CisJCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRsKGV0bWRhdGEsCisJCQkJCQkgICAgICAgVFJDQ05UVlJuKGopKTsKKwkJfQorCQkvKiByZXNvdXJjZSBzZWxlY3Rpb24gcmVnaXN0ZXJzICovCisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9yZXNvdXJjZTsgaisrKQorCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNSU0NUTFJuKGopKTsKKwkJLyogY29tcGFyYXRvciByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX2FkZHJfY21wICogMjsgaisrKSB7CisJCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gZXRtX3JlYWRxKGV0bWRhdGEsIFRSQ0FDVlJuKGopKTsKKwkJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZHEoZXRtZGF0YSwgVFJDQUNBVFJuKGopKTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfZGF0YV9jbXA7IGorKykgeworCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkcShldG1kYXRhLCBUUkNEVkNWUm4oaikpOworCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkcShldG1kYXRhLCBUUkNEVkNNUm4oaSkpOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9jdHhpZF9jbXA7IGorKykKKwkJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZHEoZXRtZGF0YSwgVFJDQ0lEQ1ZSbihqKSk7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDQ0lEQ0NUTFIwKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNDSURDQ1RMUjEpOworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfdm1pZF9jbXA7IGorKykKKwkJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZHEoZXRtZGF0YSwKKwkJCQkJCQlUUkNWTUlEQ1ZSbihqKSk7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVk1JRENDVExSMCk7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDVk1JRENDVExSMSk7CisJCS8qIHNpbmdsZS1zaG90IGNvbXBhcmF0b3IgcmVnaXN0ZXJzICovCisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9zc19jbXA7IGorKykgeworCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNTU0NDUm4oaikpOworCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNTU0NTUm4oaikpOworCQkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLAorCQkJCQkJCVRSQ1NTUENJQ1JuKGopKTsKKwkJfQorCQkvKiBjbGFpbSB0YWcgcmVnaXN0ZXJzICovCisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDQ0xBSU1DTFIpOworCQkvKiBwcm9ncmFtIGN0cmwgcmVnaXN0ZXIgKi8KKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNQUkdDVExSKTsKKworCQkvKiBlbnN1cmUgdHJhY2UgdW5pdCBpcyBpZGxlIHRvIGJlIHBvd2VyZWQgZG93biAqLworCQlmb3IgKGNvdW50ID0gVElNRU9VVF9VUzsgKEJWQUwoZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ1NUQVRSKSwgMCkKKwkJICAgICAhPSAxKSAmJiBjb3VudCA+IDA7IGNvdW50LS0pCisJCQl1ZGVsYXkoMSk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGlkbGUgc3RhdGVcbiIpOworCisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZldG1fc2F2ZV9ub3RpZmllcl9saXN0LCAwLCBOVUxMKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInVuc3VwcG9ydGVkIGV0bSBhcmNoICVkIGluICVzXG4iLAorCQkJCSAgIGV0bWRhdGEtPmFyY2gsIF9fZnVuY19fKTsKKwl9CisKKwlFVE1fTE9DSyhldG1kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0bV9tbV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBldG1fY3R4ICpldG1kYXRhKQoreworCWludCBpLCBqOworCisJaSA9IDA7CisJRVRNX1VOTE9DSyhldG1kYXRhKTsKKworCXN3aXRjaCAoZXRtZGF0YS0+YXJjaCkgeworCWNhc2UgRVRNX0FSQ0hfVjRfMjoKKwljYXNlIEVUTV9BUkNIX1Y0OgorCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmZXRtX3Jlc3RvcmVfbm90aWZpZXJfbGlzdCwgMCwgTlVMTCk7CisKKwkJLyogY2hlY2sgT1MgbG9jayBpcyBsb2NrZWQgKi8KKwkJaWYgKEJWQUwoZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ09TTFNSKSwgMSkgIT0gMSkgeworCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJPUyBsb2NrIGlzIHVubG9ja2VkXG4iKTsKKwkJCWV0bV9vc19sb2NrKGV0bWRhdGEpOworCQl9CisKKwkJLyogbWFpbiBjb250cm9sIGFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1BST0NTRUxSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNDT05GSUdSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNBVVhDVExSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNFVkVOVENUTDBSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNFVkVOVENUTDFSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNTVEFMTENUTFIpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1RTQ1RMUik7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDU1lOQ1BSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNDQ0NUTFIpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ0JCQ1RMUik7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVFJBQ0VJRFIpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1FDVExSKTsKKwkJLyogZmlsdGVyaW5nIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVklDVExSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNWSUlFQ1RMUik7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVklTU0NUTFIpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1ZJUENTU0NUTFIpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1ZEQ1RMUik7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVkRTQUNDVExSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNWREFSQ0NUTFIpOworCQkvKiBkZXJpdmVkIHJlc291cmNlcyByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3NlcV9zdGF0ZS0xOyBqKyspCisJCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1NFUUVWUm4oaikpOworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ1NFUVJTVEVWUik7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDU0VRU1RSKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNFWFRJTlNFTFIpOworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfY250cjsgaisrKSAgeworCQkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLAorCQkJCSAgVFJDQ05UUkxEVlJuKGopKTsKKwkJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwKKwkJCQkgIFRSQ0NOVENUTFJuKGopKTsKKwkJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDQ05UVlJuKGopKTsKKwkJfQorCQkvKiByZXNvdXJjZSBzZWxlY3Rpb24gcmVnaXN0ZXJzICovCisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9yZXNvdXJjZTsgaisrKQorCQkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNSU0NUTFJuKGopKTsKKwkJLyogY29tcGFyYXRvciByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX2FkZHJfY21wICogMjsgaisrKSB7CisJCQlldG1fd3JpdGVxKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ0FDVlJuKGopKTsKKwkJCWV0bV93cml0ZXEoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDQUNBVFJuKGopKTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfZGF0YV9jbXA7IGorKykgeworCQkJZXRtX3dyaXRlcShldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNEVkNWUm4oaikpOworCQkJZXRtX3dyaXRlcShldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNEVkNNUm4oaikpOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9jdHhpZF9jbXA7IGorKykKKwkJCWV0bV93cml0ZXEoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDQ0lEQ1ZSbihqKSk7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDQ0lEQ0NUTFIwKTsKKwkJZXRtX3dyaXRlbChldG1kYXRhLCBldG1kYXRhLT5zdGF0ZVtpKytdLCBUUkNDSURDQ1RMUjEpOworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfdm1pZF9jbXA7IGorKykKKwkJCWV0bV93cml0ZXEoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwKKwkJCQkgICBUUkNWTUlEQ1ZSbihqKSk7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVk1JRENDVExSMCk7CisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDVk1JRENDVExSMSk7CisJCS8qIGUtc2hvdCBjb21wYXJhdG9yIHJlZ2lzdGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfc3NfY21wOyBqKyspIHsKKwkJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDU1NDQ1JuKGopKTsKKwkJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDU1NDU1JuKGopKTsKKwkJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwKKwkJCQkgICBUUkNTU1BDSUNSbihqKSk7CisJCX0KKwkJLyogY2xhaW0gdGFnIHJlZ2lzdGVycyAqLworCQlldG1fd3JpdGVsKGV0bWRhdGEsIGV0bWRhdGEtPnN0YXRlW2krK10sIFRSQ0NMQUlNU0VUKTsKKwkJLyogcHJvZ3JhbSBjdHJsIHJlZ2lzdGVyICovCisJCWV0bV93cml0ZWwoZXRtZGF0YSwgZXRtZGF0YS0+c3RhdGVbaSsrXSwgVFJDUFJHQ1RMUik7CisKKwkJZXRtX29zX3VubG9jayhldG1kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ1bnN1cHBvcnRlZCBldG0gYXJjaCAlZCBpbiAlc1xuIiwKKwkJCQkgICBldG1kYXRhLT5hcmNoLCAgX19mdW5jX18pOworCX0KKworCUVUTV9MT0NLKGV0bWRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXRtX2Nsa19kaXNhYmxlKHZvaWQpCit7CisJdWludDMyX3QgY3BtcjsKKworCWlzYigpOworCWNwbXIgPSB0cmNfcmVhZGwoQ1BNUl9FTDEpOworCWNwbXIgICY9IH5FVE1fQ1BNUl9DTEtFTjsKKwl0cmNfd3JpdGUoY3BtciwgQ1BNUl9FTDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXRtX2Nsa19lbmFibGUodm9pZCkKK3sKKwl1aW50MzJfdCBjcG1yOworCisJY3BtciA9IHRyY19yZWFkbChDUE1SX0VMMSk7CisJY3BtciAgfD0gRVRNX0NQTVJfQ0xLRU47CisJdHJjX3dyaXRlKGNwbXIsIENQTVJfRUwxKTsKKwlpc2IoKTsKK30KKworc3RhdGljIGludCBldG1fcmVhZF9zc3hyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TRVFFVlIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNFUUVWUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU0VRRVZSMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaWR4ICVkIG91dCBvZiBib3VuZHMgaW4gJXNcbiIsIGosIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXRtX3JlYWRfY3J4cih1aW50NjRfdCAqc3RhdGUsIGludCBpLCBpbnQgaikKK3sKKwlzd2l0Y2ggKGopIHsKKwljYXNlIDA6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ05UUkxEVlIwKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1DTlRDVExSMCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ05UVlIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTUNOVFJMRFZSMSk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ05UQ1RMUjEpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTUNOVFZSMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1DTlRSTERWUjIpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTUNOVENUTFIyKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1DTlRWUjIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ05UUkxEVlIzKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1DTlRDVExSMyk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ05UVlIzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBldG1fcmVhZF9yc3hyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSNCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSNyk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFI4KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjEwKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIxMSk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMTIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjEzKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIxNCk7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMTUpOworCQlicmVhazsKKwljYXNlIDE2OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjE2KTsKKwkJYnJlYWs7CisJY2FzZSAxNzoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIxNyk7CisJCWJyZWFrOworCWNhc2UgMTg6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMTgpOworCQlicmVhazsKKwljYXNlIDE5OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjE5KTsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIyMCk7CisJCWJyZWFrOworCWNhc2UgMjE6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMjEpOworCQlicmVhazsKKwljYXNlIDIyOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjIyKTsKKwkJYnJlYWs7CisJY2FzZSAyMzoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIyMyk7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMjQpOworCQlicmVhazsKKwljYXNlIDI1OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjI1KTsKKwkJYnJlYWs7CisJY2FzZSAyNjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIyNik7CisJCWJyZWFrOworCWNhc2UgMjc6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMjcpOworCQlicmVhazsKKwljYXNlIDI4OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjI4KTsKKwkJYnJlYWs7CisJY2FzZSAyOToKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1SU0NUTFIyOSk7CisJCWJyZWFrOworCWNhc2UgMzA6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNUlNDVExSMzApOworCQlicmVhazsKKwljYXNlIDMxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVJTQ1RMUjMxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBldG1fcmVhZF9hY3IodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlIwKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNWUjEpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDQVRSMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ1ZSMik7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNBVFIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlIzKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNWUjQpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDQVRSNCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ1ZSNSk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNBVFI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlI2KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNWUjcpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDQVRSNyk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ1ZSOCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNBVFI4KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlI5KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlIxMCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNBVFIxMCk7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNWUjExKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjExKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ1ZSMTIpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDQVRSMTIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDVlIxMyk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNBVFIxMyk7CisJCWJyZWFrOworCWNhc2UgMTQ6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQUNWUjE0KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ0FUUjE0KTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1BQ1ZSMTUpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUFDQVRSMTUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV0bV9yZWFkX2R2Y3IodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSMCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSMSk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVIxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSMik7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSMyk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSNCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVI0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSNSk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSNik7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTURWQ1ZSNyk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNRFZDTVI3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBldG1fcmVhZF9jY3ZyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1DSURDVlIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUNJRENWUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQ0lEQ1ZSMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1DSURDVlIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUNJRENWUjQpOworCQlicmVhazsKKwljYXNlIDU6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZHEoRVRNQ0lEQ1ZSNSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkcShFVE1DSURDVlI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTUNJRENWUjcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV0bV9yZWFkX3ZjdnIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlIxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlI0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRxKEVUTVZNSURDVlI3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBldG1fcmVhZF9zc2NyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NDUjApOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTQ1NSMCk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NQQ0lDUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NDQ1IxKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NTUjEpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTUENJQ1IxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTQ0NSMik7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NDU1IyKTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU1BDSUNSMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NDUjMpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTQ1NSMyk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NQQ0lDUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NDQ1I0KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NTUjQpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTUENJQ1I0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTQ0NSNSk7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NDU1I1KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU1BDSUNSNSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NDUjYpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTQ1NSNik7CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NQQ0lDUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1NDQ1I3KTsKKwkJc3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TU0NTUjcpOworCQlzdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNTUENJQ1I3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0bV9zaV9zYXZlX3N0YXRlKHN0cnVjdCBldG1fY3R4ICpldG1kYXRhKQoreworCWludCBpLCBqLCBjb3VudDsKKworCWkgPSAwOworCS8qIEVuc3VyZSBhbGwgd3JpdGVzIGFyZSBjb21wbGV0ZSBiZWZvcmUgc2F2aW5nIEVUTSByZWdpc3RlcnMgKi8KKwltYigpOworCWlzYigpOworCisJLyogVm90ZSBmb3IgRVRNIHBvd2VyL2Nsb2NrIGVuYWJsZSAqLworCWV0bV9jbGtfZW5hYmxlKCk7CisKKwlzd2l0Y2ggKGV0bWRhdGEtPmFyY2gpIHsKKwljYXNlIEVUTV9BUkNIX1Y0XzI6CisJY2FzZSBFVE1fQVJDSF9WNDoKKwkJdHJjX3dyaXRlKDB4MSwgRVRNT1NMQVIpOworCQlpc2IoKTsKKworCQkvKiBwb2xsIHVudGlsIHByb2dyYW1tZXJzJyBtb2RlbCBiZWNvbWVzIHN0YWJsZSAqLworCQlmb3IgKGNvdW50ID0gVElNRU9VVF9VUzsgKEJWQUwodHJjX3JlYWRsKEVUTVNUQVRSKSwgMSkKKwkJICAgICAhPSAxKSAmJiBjb3VudCA+IDA7IGNvdW50LS0pCisJCQl1ZGVsYXkoMSk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJwcm9ncmFtbWVycyBtb2RlbCBpcyBub3Qgc3RhYmxlXG4iKTsKKworCQkvKiBtYWluIGNvbnRyb2wgYW5kIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ09ORklHUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNRVZFTlRDVEwwUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNRVZFTlRDVEwxUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU1RBTExDVExSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1UU0NUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVNZTkNQUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNQ0NDVExSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1UUkFDRUlEUik7CisJCS8qIGZpbHRlcmluZyBjb250cm9sIHJlZ2lzdGVycyAqLworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVZJQ1RMUik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNVklJRUNUTFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTVZJU1NDVExSKTsKKwkJLyogZGVyaXZlZCByZXNvdXJjZSByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3NlcV9zdGF0ZS0xOyBqKyspCisJCQlpID0gZXRtX3JlYWRfc3N4cihldG1kYXRhLT5zdGF0ZSwgaSwgaik7CisJCWV0bWRhdGEtPnN0YXRlW2krK10gPSB0cmNfcmVhZGwoRVRNU0VRUlNURVZSKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1TRVFTVFIpOworCQlldG1kYXRhLT5zdGF0ZVtpKytdID0gdHJjX3JlYWRsKEVUTUVYVElOU0VMUik7CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9jbnRyOyBqKyspCisJCQlpID0gZXRtX3JlYWRfY3J4cihldG1kYXRhLT5zdGF0ZSwgaSwgaik7CisJCS8qIHJlc291cmNlIHNlbGVjdGlvbiByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3Jlc291cmNlOyBqKyspCisJCQlpID0gZXRtX3JlYWRfcnN4cihldG1kYXRhLT5zdGF0ZSwgaSwgaiArIDIpOworCQkvKiBjb21wYXJhdG9yIHJlZ2lzdGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfYWRkcl9jbXAgKiAyOyBqKyspCisJCQlpID0gZXRtX3JlYWRfYWNyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX2RhdGFfY21wOyBqKyspCisJCQlpID0gZXRtX3JlYWRfZHZjcihldG1kYXRhLT5zdGF0ZSwgaSwgaik7CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9jdHhpZF9jbXA7IGorKykKKwkJCWkgPSBldG1fcmVhZF9jY3ZyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1DSURDQ1RMUjApOworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfdm1pZF9jbXA7IGorKykKKwkJCWkgPSBldG1fcmVhZF92Y3ZyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJLyogc2luZ2xlLXNob3QgY29tcGFyYXRvciByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3NzX2NtcDsgaisrKQorCQkJaSA9IGV0bV9yZWFkX3NzY3IoZXRtZGF0YS0+c3RhdGUsIGksIGopOworCQkvKiBwcm9ncmFtIGN0cmwgcmVnaXN0ZXIgKi8KKwkJZXRtZGF0YS0+c3RhdGVbaSsrXSA9IHRyY19yZWFkbChFVE1QUkdDVExSKTsKKworCQkvKiBlbnN1cmUgdHJhY2UgdW5pdCBpcyBpZGxlIHRvIGJlIHBvd2VyZWQgZG93biAqLworCQlmb3IgKGNvdW50ID0gVElNRU9VVF9VUzsgKEJWQUwodHJjX3JlYWRsKEVUTVNUQVRSKSwgMCkKKwkJICAgICAhPSAxKSAmJiBjb3VudCA+IDA7IGNvdW50LS0pCisJCQl1ZGVsYXkoMSk7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIGlkbGUgc3RhdGVcbiIpOworCisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZldG1fc2F2ZV9ub3RpZmllcl9saXN0LCAwLCBOVUxMKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInVuc3VwcG9ydGVkIGV0bSBhcmNoICVkIGluICVzXG4iLAorCQkJCSAgIGV0bWRhdGEtPmFyY2gsIF9fZnVuY19fKTsKKwl9CisKKwkvKiBWb3RlIGZvciBFVE0gcG93ZXIvY2xvY2sgZGlzYWJsZSAqLworCWV0bV9jbGtfZGlzYWJsZSgpOworfQorCitzdGF0aWMgaW50IGV0bV93cml0ZV9zc3hyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNFUUVWUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TRVFFVlIxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU0VRRVZSMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaWR4ICVkIG91dCBvZiBib3VuZHMgaW4gJXNcbiIsIGosIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXRtX3dyaXRlX2NyeHIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ05UUkxEVlIwKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNOVENUTFIwKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNOVFZSMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNOVFJMRFZSMSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1DTlRDVExSMSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1DTlRWUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1DTlRSTERWUjIpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ05UQ1RMUjIpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ05UVlIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ05UUkxEVlIzKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNOVENUTFIzKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNOVFZSMyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaWR4ICVkIG91dCBvZiBib3VuZHMgaW4gJXNcbiIsIGosIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXRtX3dyaXRlX3JzeHIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVJTQ1RMUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1SU0NUTFI0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSNSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVJTQ1RMUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1SU0NUTFI3KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSOCk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVJTQ1RMUjkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTApOworCQlicmVhazsKKwljYXNlIDExOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTEpOworCQlicmVhazsKKwljYXNlIDEyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTMpOworCQlicmVhazsKKwljYXNlIDE0OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTQpOworCQlicmVhazsKKwljYXNlIDE1OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTUpOworCQlicmVhazsKKwljYXNlIDE2OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTYpOworCQlicmVhazsKKwljYXNlIDE3OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTcpOworCQlicmVhazsKKwljYXNlIDE4OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTgpOworCQlicmVhazsKKwljYXNlIDE5OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMTkpOworCQlicmVhazsKKwljYXNlIDIwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjApOworCQlicmVhazsKKwljYXNlIDIxOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjEpOworCQlicmVhazsKKwljYXNlIDIyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjIpOworCQlicmVhazsKKwljYXNlIDIzOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjMpOworCQlicmVhazsKKwljYXNlIDI0OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjQpOworCQlicmVhazsKKwljYXNlIDI1OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjUpOworCQlicmVhazsKKwljYXNlIDI2OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjYpOworCQlicmVhazsKKwljYXNlIDI3OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjcpOworCQlicmVhazsKKwljYXNlIDI4OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjgpOworCQlicmVhazsKKwljYXNlIDI5OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMjkpOworCQlicmVhazsKKwljYXNlIDMwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMzApOworCQlicmVhazsKKwljYXNlIDMxOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNUlNDVExSMzEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV0bV93cml0ZV9hY3IodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjApOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjEpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFIxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjIpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjMpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjQpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjUpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjYpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjcpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI3KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjgpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI4KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNWUjkpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQUNBVFI5KTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxMCk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjEwKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxMSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjExKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxMik7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjEyKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxMyk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjEzKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxNCk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjE0KTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUFDVlIxNSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1BQ0FUUjE1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBldG1fd3JpdGVfZHZjcih1aW50NjRfdCAqc3RhdGUsIGludCBpLCBpbnQgaikKK3sKKwlzd2l0Y2ggKGopIHsKKwljYXNlIDA6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1EVkNWUjApOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDTVIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDVlIxKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTURWQ01SMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTURWQ1ZSMik7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1EVkNNUjIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1EVkNWUjMpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDTVIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDVlI0KTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTURWQ01SNCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTURWQ1ZSNSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1EVkNNUjUpOworCQlicmVhazsKKwljYXNlIDY6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1EVkNWUjYpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDTVI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNRFZDVlI3KTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTURWQ01SNyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaWR4ICVkIG91dCBvZiBib3VuZHMgaW4gJXNcbiIsIGosIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXRtX3dyaXRlX2NjdnIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ0lEQ1ZSMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNJRENWUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1DSURDVlIyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ0lEQ1ZSMyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNJRENWUjQpOworCQlicmVhazsKKwljYXNlIDU6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1DSURDVlI1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNQ0lEQ1ZSNik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTUNJRENWUjcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV0bV93cml0ZV92Y3ZyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVZNSURDVlIwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNVk1JRENWUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1WTUlEQ1ZSMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVZNSURDVlIzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNVk1JRENWUjQpOworCQlicmVhazsKKwljYXNlIDU6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1WTUlEQ1ZSNSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVZNSURDVlI2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNVk1JRENWUjcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGV0bV93cml0ZV9zc2NyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTQ0NSMCk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NTUjApOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NQQ0lDUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NDUjEpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NDU1IxKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTUENJQ1IxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NDQ1IyKTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTQ1NSMik7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU1BDSUNSMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTQ0NSMyk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NTUjMpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NQQ0lDUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NDUjQpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NDU1I0KTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTUENJQ1I0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NDQ1I1KTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTQ1NSNSk7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU1BDSUNSNSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTQ0NSNik7CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NTUjYpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NQQ0lDUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXRyY193cml0ZShzdGF0ZVtpKytdLCBFVE1TU0NDUjcpOworCQl0cmNfd3JpdGUoc3RhdGVbaSsrXSwgRVRNU1NDU1I3KTsKKwkJdHJjX3dyaXRlKHN0YXRlW2krK10sIEVUTVNTUENJQ1I3KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0bV9zaV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBldG1fY3R4ICpldG1kYXRhKQoreworCWludCBpLCBqOworCisJaSA9IDA7CisKKwkvKiBWb3RlIGZvciBFVE0gcG93ZXIvY2xvY2sgZW5hYmxlICovCisJZXRtX2Nsa19lbmFibGUoKTsKKworCXN3aXRjaCAoZXRtZGF0YS0+YXJjaCkgeworCWNhc2UgRVRNX0FSQ0hfVjRfMjoKKwljYXNlIEVUTV9BUkNIX1Y0OgorCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmZXRtX3Jlc3RvcmVfbm90aWZpZXJfbGlzdCwgMCwgTlVMTCk7CisKKwkJLyogY2hlY2sgT1MgbG9jayBpcyBsb2NrZWQgKi8KKwkJaWYgKEJWQUwodHJjX3JlYWRsKEVUTU9TTFNSKSwgMSkgIT0gMSkgeworCQkJcHJfZXJyX3JhdGVsaW1pdGVkKCJPUyBsb2NrIGlzIHVubG9ja2VkXG4iKTsKKwkJCXRyY193cml0ZSgweDEsIEVUTU9TTEFSKTsKKwkJCWlzYigpOworCQl9CisKKwkJLyogbWFpbiBjb250cm9sIGFuZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNQ09ORklHUik7CisJCXRyY193cml0ZShldG1kYXRhLT5zdGF0ZVtpKytdLCBFVE1FVkVOVENUTDBSKTsKKwkJdHJjX3dyaXRlKGV0bWRhdGEtPnN0YXRlW2krK10sIEVUTUVWRU5UQ1RMMVIpOworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNU1RBTExDVExSKTsKKwkJdHJjX3dyaXRlKGV0bWRhdGEtPnN0YXRlW2krK10sIEVUTVRTQ1RMUik7CisJCXRyY193cml0ZShldG1kYXRhLT5zdGF0ZVtpKytdLCBFVE1TWU5DUFIpOworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNQ0NDVExSKTsKKwkJdHJjX3dyaXRlKGV0bWRhdGEtPnN0YXRlW2krK10sIEVUTVRSQUNFSURSKTsKKwkJLyogZmlsdGVyaW5nIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJCXRyY193cml0ZShldG1kYXRhLT5zdGF0ZVtpKytdLCBFVE1WSUNUTFIpOworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNVklJRUNUTFIpOworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNVklTU0NUTFIpOworCQkvKiBkZXJpdmVkIHJlc291cmNlcyByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3NlcV9zdGF0ZS0xOyBqKyspCisJCQlpID0gZXRtX3dyaXRlX3NzeHIoZXRtZGF0YS0+c3RhdGUsIGksIGopOworCQl0cmNfd3JpdGUoZXRtZGF0YS0+c3RhdGVbaSsrXSwgRVRNU0VRUlNURVZSKTsKKwkJdHJjX3dyaXRlKGV0bWRhdGEtPnN0YXRlW2krK10sIEVUTVNFUVNUUik7CisJCXRyY193cml0ZShldG1kYXRhLT5zdGF0ZVtpKytdLCBFVE1FWFRJTlNFTFIpOworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfY250cjsgaisrKQorCQkJaSA9IGV0bV93cml0ZV9jcnhyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJLyogcmVzb3VyY2Ugc2VsZWN0aW9uIHJlZ2lzdGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfcmVzb3VyY2U7IGorKykKKwkJCWkgPSBldG1fd3JpdGVfcnN4cihldG1kYXRhLT5zdGF0ZSwgaSwgaiArIDIpOworCQkvKiBjb21wYXJhdG9yIHJlZ2lzdGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwgZXRtZGF0YS0+bnJfYWRkcl9jbXAgKiAyOyBqKyspCisJCQlpID0gZXRtX3dyaXRlX2FjcihldG1kYXRhLT5zdGF0ZSwgaSwgaik7CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl9kYXRhX2NtcDsgaisrKQorCQkJaSA9IGV0bV93cml0ZV9kdmNyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX2N0eGlkX2NtcDsgaisrKQorCQkJaSA9IGV0bV93cml0ZV9jY3ZyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJdHJjX3dyaXRlKGV0bWRhdGEtPnN0YXRlW2krK10sIEVUTUNJRENDVExSMCk7CisJCWZvciAoaiA9IDA7IGogPCBldG1kYXRhLT5ucl92bWlkX2NtcDsgaisrKQorCQkJaSA9IGV0bV93cml0ZV92Y3ZyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJLyogc2luZ2xlLXNob3QgY29tcGFyYXRvciByZWdpc3RlcnMgKi8KKwkJZm9yIChqID0gMDsgaiA8IGV0bWRhdGEtPm5yX3NzX2NtcDsgaisrKQorCQkJaSA9IGV0bV93cml0ZV9zc2NyKGV0bWRhdGEtPnN0YXRlLCBpLCBqKTsKKwkJLyogcHJvZ3JhbSBjdHJsIHJlZ2lzdGVyICovCisJCXRyY193cml0ZShldG1kYXRhLT5zdGF0ZVtpKytdLCBFVE1QUkdDVExSKTsKKworCQlpc2IoKTsKKwkJdHJjX3dyaXRlKDB4MCwgRVRNT1NMQVIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInVuc3VwcG9ydGVkIGV0bSBhcmNoICVkIGluICVzXG4iLAorCQkJCSAgIGV0bWRhdGEtPmFyY2gsICBfX2Z1bmNfXyk7CisJfQorCisJLyogVm90ZSBmb3IgRVRNIHBvd2VyL2Nsb2NrIGRpc2FibGUgKi8KKwlldG1fY2xrX2Rpc2FibGUoKTsKK30KKwordm9pZCBtc21fanRhZ19ldG1fc2F2ZV9zdGF0ZSh2b2lkKQoreworCWludCBjcHU7CisKKwljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKCFldG1bY3B1XSB8fCBldG1bY3B1XS0+c2F2ZV9yZXN0b3JlX2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwlpZiAoZXRtW2NwdV0tPnNhdmVfcmVzdG9yZV9lbmFibGVkKSB7CisJCWlmIChldG1bY3B1XS0+c2lfZW5hYmxlKQorCQkJZXRtX3NpX3NhdmVfc3RhdGUoZXRtW2NwdV0pOworCQllbHNlCisJCQlldG1fbW1fc2F2ZV9zdGF0ZShldG1bY3B1XSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChtc21fanRhZ19ldG1fc2F2ZV9zdGF0ZSk7CisKK3ZvaWQgbXNtX2p0YWdfZXRtX3Jlc3RvcmVfc3RhdGUodm9pZCkKK3sKKwlpbnQgY3B1OworCisJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghZXRtW2NwdV0gfHwgZXRtW2NwdV0tPnNhdmVfcmVzdG9yZV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDaGVjayB0byBlbnN1cmUgd2UgYXR0ZW1wdCB0byByZXN0b3JlIG9ubHkgd2hlbiBzYXZlCisJICogaGFzIGJlZW4gZG9uZSBpcyBhY2NvbXBsaXNoZWQgYnkgY2FsbGVlIGZ1bmN0aW9uLgorCSAqLworCWlmIChldG1bY3B1XS0+c2F2ZV9yZXN0b3JlX2VuYWJsZWQpIHsKKwkJaWYgKGV0bVtjcHVdLT5zaV9lbmFibGUpCisJCQlldG1fc2lfcmVzdG9yZV9zdGF0ZShldG1bY3B1XSk7CisJCWVsc2UKKwkJCWV0bV9tbV9yZXN0b3JlX3N0YXRlKGV0bVtjcHVdKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9qdGFnX2V0bV9yZXN0b3JlX3N0YXRlKTsKKworc3RhdGljIGlubGluZSBib29sIGV0bV9hcmNoX3N1cHBvcnRlZCh1aW50OF90IGFyY2gpCit7CisJc3dpdGNoIChhcmNoKSB7CisJY2FzZSBFVE1fQVJDSF9WNF8yOgorCWNhc2UgRVRNX0FSQ0hfVjQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGV0bV9vc19sb2NrX2luaXQoc3RydWN0IGV0bV9jdHggKmV0bWRhdGEpCit7CisJdWludDMyX3QgZXRtb3Nsc3I7CisKKwlldG1vc2xzciA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNPU0xTUik7CisJaWYgKChCVkFMKGV0bW9zbHNyLCAwKSA9PSAwKSAgJiYgQlZBTChldG1vc2xzciwgMykpCisJCWV0bWRhdGEtPm9zX2xvY2tfcHJlc2VudCA9IHRydWU7CisJZWxzZQorCQlldG1kYXRhLT5vc19sb2NrX3ByZXNlbnQgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZXRtX2luaXRfYXJjaF9kYXRhKHZvaWQgKmluZm8pCit7CisJdWludDMyX3QgdmFsOworCXN0cnVjdCBldG1fY3R4ICAqZXRtZGF0YSA9IGluZm87CisKKwlFVE1fVU5MT0NLKGV0bWRhdGEpOworCisJZXRtX29zX2xvY2tfaW5pdChldG1kYXRhKTsKKworCXZhbCA9IGV0bV9yZWFkbChldG1kYXRhLCBUUkNJRFIxKTsKKwlldG1kYXRhLT5hcmNoID0gQk1WQUwodmFsLCA0LCAxMSk7CisKKwkvKiBudW1iZXIgb2YgcmVzb3VyY2VzIHRyYWNlIHVuaXQgc3VwcG9ydHMgKi8KKwl2YWwgPSBldG1fcmVhZGwoZXRtZGF0YSwgVFJDSURSNCk7CisJZXRtZGF0YS0+bnJfYWRkcl9jbXAgPSBCTVZBTCh2YWwsIDAsIDMpOworCWV0bWRhdGEtPm5yX2RhdGFfY21wID0gQk1WQUwodmFsLCA0LCA3KTsKKwlldG1kYXRhLT5ucl9yZXNvdXJjZSA9IEJNVkFMKHZhbCwgMTYsIDE5KTsKKwlldG1kYXRhLT5ucl9zc19jbXAgPSBCTVZBTCh2YWwsIDIwLCAyMyk7CisJZXRtZGF0YS0+bnJfY3R4aWRfY21wID0gQk1WQUwodmFsLCAyNCwgMjcpOworCWV0bWRhdGEtPm5yX3ZtaWRfY21wID0gQk1WQUwodmFsLCAyOCwgMzEpOworCisJdmFsID0gZXRtX3JlYWRsKGV0bWRhdGEsIFRSQ0lEUjUpOworCWV0bWRhdGEtPm5yX3NlcV9zdGF0ZSA9IEJNVkFMKHZhbCwgMjUsIDI3KTsKKwlldG1kYXRhLT5ucl9jbnRyID0gQk1WQUwodmFsLCAyOCwgMzApOworCisJRVRNX0xPQ0soZXRtZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQganRhZ19tbV9ldG1fc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoIWV0bVtjcHVdKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmZXRtW2NwdV0tPnNwaW5sb2NrKTsKKwlpZiAoIWV0bVtjcHVdLT5pbml0KSB7CisJCWV0bV9pbml0X2FyY2hfZGF0YShldG1bY3B1XSk7CisJCWV0bVtjcHVdLT5pbml0ID0gdHJ1ZTsKKwl9CisJc3Bpbl91bmxvY2soJmV0bVtjcHVdLT5zcGlubG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqdGFnX21tX2V0bV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoIWV0bVtjcHVdKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmV0bVtjcHVdLT5tdXRleCk7CisJaWYgKGV0bVtjcHVdLT5lbmFibGUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZldG1bY3B1XS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGV0bV9hcmNoX3N1cHBvcnRlZChldG1bY3B1XS0+YXJjaCkpIHsKKwkJaWYgKHNjbV9nZXRfZmVhdF92ZXJzaW9uKFRaX0RCR19FVE1fRkVBVF9JRCkgPAorCQkgICAgVFpfREJHX0VUTV9WRVIpCisJCQlldG1bY3B1XS0+c2F2ZV9yZXN0b3JlX2VuYWJsZWQgPSB0cnVlOworCQllbHNlCisJCQlwcl9pbmZvKCJldG0gc2F2ZS1yZXN0b3JlIHN1cHBvcnRlZCBieSBUWlxuIik7CisJfSBlbHNlCisJCXByX2luZm8oImV0bSBhcmNoICV1IG5vdCBzdXBwb3J0ZWRcbiIsIGV0bVtjcHVdLT5hcmNoKTsKKwlldG1bY3B1XS0+ZW5hYmxlID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmV0bVtjcHVdLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgc2tpcF9ldG1fc2F2ZV9yZXN0b3JlKHZvaWQpCit7CisJdWludDMyX3QgaWQ7CisJdWludDMyX3QgdmVyc2lvbjsKKworCWlkID0gc29jaW5mb19nZXRfaWQoKTsKKwl2ZXJzaW9uID0gc29jaW5mb19nZXRfdmVyc2lvbigpOworCisJaWYgKGlkID09IEhXX1NPQ19JRF9NODk1MyAmJiBTT0NJTkZPX1ZFUlNJT05fTUFKT1IodmVyc2lvbikgPT0gMSAmJgorCSAgICBTT0NJTkZPX1ZFUlNJT05fTUlOT1IodmVyc2lvbikgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQganRhZ19tbV9ldG1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdWludDMyX3QgY3B1KQoreworCXN0cnVjdCBldG1fY3R4ICpldG1kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBwZXIgY3B1ICovCisJZXRtZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgZXRtX2N0eCksIEdGUF9LRVJORUwpOworCWlmICghZXRtZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJldG0tYmFzZSIpOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWV0bWRhdGEtPmJhc2UgPSBkZXZtX2lvcmVtYXAoZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghZXRtZGF0YS0+YmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlldG1kYXRhLT5zaV9lbmFibGUgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAicWNvbSxzaS1lbmFibGUiKTsKKwlldG1kYXRhLT5zYXZlX3Jlc3RvcmVfZGlzYWJsZWQgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woCisJCQkJCSBwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJICJxY29tLHNhdmUtcmVzdG9yZS1kaXNhYmxlIik7CisKKwlpZiAoc2tpcF9ldG1fc2F2ZV9yZXN0b3JlKCkpCisJCWV0bWRhdGEtPnNhdmVfcmVzdG9yZV9kaXNhYmxlZCA9IDE7CisKKwkvKiBBbGxvY2F0ZSBldG0gc3RhdGUgc2F2ZSBzcGFjZSBwZXIgY29yZSAqLworCWV0bWRhdGEtPnN0YXRlID0gZGV2bV9remFsbG9jKGRldiwKKwkJCQkgICAgICBNQVhfRVRNX1NUQVRFX1NJWkUgKiBzaXplb2YodWludDY0X3QpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghZXRtZGF0YS0+c3RhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJmV0bWRhdGEtPnNwaW5sb2NrKTsKKwltdXRleF9pbml0KCZldG1kYXRhLT5tdXRleCk7CisKKwlpZiAoY250KysgPT0gMCkgeworCQljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX0FSTV9NTV9DT1JFU0lHSFQ0X1NUQVJUSU5HLAorCQkJCQkgICJBUF9BUk1fQ09SRVNJR0hUNF9TVEFSVElORyIsCisJCQkJCSAganRhZ19tbV9ldG1fc3RhcnRpbmcsIE5VTEwpOworCQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sCisJCQkJCQkiQVBfQVJNX0NPUkVTSUdIVDRfT05MSU5FIiwKKwkJCQkJCWp0YWdfbW1fZXRtX29ubGluZSwgTlVMTCk7CisJfQorCisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwlpZiAoIXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGV0bV9pbml0X2FyY2hfZGF0YSwgZXRtZGF0YSwKKwkJCQkgICAgICAxKSkKKwkJZXRtZGF0YS0+aW5pdCA9IHRydWU7CisKKwlldG1bY3B1XSA9IGV0bWRhdGE7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCW11dGV4X2xvY2soJmV0bWRhdGEtPm11dGV4KTsKKwlpZiAoZXRtZGF0YS0+aW5pdCAmJiAhZXRtZGF0YS0+ZW5hYmxlKSB7CisJCWlmIChldG1fYXJjaF9zdXBwb3J0ZWQoZXRtZGF0YS0+YXJjaCkpIHsKKwkJCWlmIChzY21fZ2V0X2ZlYXRfdmVyc2lvbihUWl9EQkdfRVRNX0ZFQVRfSUQpIDwKKwkJCSAgICBUWl9EQkdfRVRNX1ZFUikKKwkJCQlldG1kYXRhLT5zYXZlX3Jlc3RvcmVfZW5hYmxlZCA9IHRydWU7CisJCQllbHNlCisJCQkJcHJfaW5mbygiZXRtIHNhdmUtcmVzdG9yZSBzdXBwb3J0ZWQgYnkgVFpcbiIpOworCQl9IGVsc2UKKwkJCXByX2luZm8oImV0bSBhcmNoICV1IG5vdCBzdXBwb3J0ZWRcbiIsIGV0bWRhdGEtPmFyY2gpOworCQlldG1kYXRhLT5lbmFibGUgPSB0cnVlOworCX0KKwltdXRleF91bmxvY2soJmV0bWRhdGEtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqdGFnX21tX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCwgaSwgY3B1ID0gLTE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCisJY3B1X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCSAgICAicWNvbSxjb3Jlc2lnaHQtanRhZ21tLWNwdSIsIDApOworCWlmICghY3B1X25vZGUpIHsKKwkJZGV2X2VycihkZXYsICJKdGFnLW1tIGNwdSBoYW5kbGUgbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlpZiAoY3B1X25vZGUgPT0gb2ZfZ2V0X2NwdV9ub2RlKGksIE5VTEwpKSB7CisJCQljcHUgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY3B1ID09IC0xKSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBKdGFnLW1tIGNwdSBoYW5kbGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbG9ja1tjcHVdID0gZGV2bV9jbGtfZ2V0KGRldiwgImNvcmVfY2xrIik7CisJaWYgKElTX0VSUihjbG9ja1tjcHVdKSkgeworCQlyZXQgPSBQVFJfRVJSKGNsb2NrW2NwdV0pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShjbG9ja1tjcHVdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2xvY2tbY3B1XSk7CisKKwlyZXQgID0ganRhZ19tbV9ldG1fcHJvYmUocGRldiwgY3B1KTsKKwlpZiAocmV0KQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xvY2tbY3B1XSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqdGFnX21tX2V0bV9yZW1vdmUodm9pZCkKK3sKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9BUk1fTU1fQ09SRVNJR0hUNF9TVEFSVElORyk7Cit9CisKK3N0YXRpYyBpbnQganRhZ19tbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrICpjbG9jayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKC0tY250ID09IDApCisJCWp0YWdfbW1fZXRtX3JlbW92ZSgpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9xZHNzX21tX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLGp0YWd2OC1tbSJ9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqdGFnX21tX2RyaXZlciA9IHsKKwkucHJvYmUgICAgICAgICAgPSBqdGFnX21tX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IGp0YWdfbW1fcmVtb3ZlLAorCS5kcml2ZXIgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJtc20tanRhZ3Y4LW1tIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZQk9IG1zbV9xZHNzX21tX21hdGNoLAorCQl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQganRhZ19tbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmanRhZ19tbV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoanRhZ19tbV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGp0YWdfbW1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZqdGFnX21tX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChqdGFnX21tX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmVTaWdodCBERUJVR3Y4IGFuZCBFVE12NCBzYXZlLXJlc3RvcmUgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL2p0YWd2OC5jIGIvZHJpdmVycy9zb2MvcWNvbS9qdGFndjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRmZmQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9qdGFndjguYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVfcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3Jlc2lnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPHNvYy9xY29tL3NjbS5oPgorI2luY2x1ZGUgPHNvYy9xY29tL2p0YWcuaD4KKyNpZmRlZiBDT05GSUdfQVJNNjQKKyNpbmNsdWRlIDxhc20vZGVidWd2OC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZGVidWd2OC5oPgorI2VuZGlmCisKKyNkZWZpbmUgVElNRU9VVF9VUwkJKDEwMCkKKworI2RlZmluZSBCTShsc2IsIG1zYikJCSgoQklUKG1zYikgLSBCSVQobHNiKSkgKyBCSVQobXNiKSkKKyNkZWZpbmUgQk1WQUwodmFsLCBsc2IsIG1zYikJKCh2YWwgJiBCTShsc2IsIG1zYikpID4+IGxzYikKKyNkZWZpbmUgQlZBTCh2YWwsIG4pCQkoKHZhbCAmIEJJVChuKSkgPj4gbikKKworI2lmZGVmIENPTkZJR19BUk02NAorI2RlZmluZSBBUk1fREVCVUdfQVJDSF9WOF84CSgweDgpCisjZGVmaW5lIEFSTV9ERUJVR19BUkNIX1Y4CSgweDYpCisjZW5kaWYKKworI2RlZmluZSBNQVhfREJHX1JFR1MJCSg2NikKKyNkZWZpbmUgTUFYX0RCR19TVEFURV9TSVpFCShNQVhfREJHX1JFR1MgKiBudW1fcG9zc2libGVfY3B1cygpKQorCisjZGVmaW5lIE9TTE9DS19NQUdJQwkJKDB4QzVBQ0NFNTUpCisjZGVmaW5lIFRaX0RCR19FVE1fRkVBVF9JRAkoMHg4KQorI2RlZmluZSBUWl9EQkdfRVRNX1ZFUgkJKDB4NDAwMDAwKQorCitzdGF0aWMgdWludDMyX3QgbXNtX2p0YWdfc2F2ZV9jbnRyW05SX0NQVVNdOworc3RhdGljIHVpbnQzMl90IG1zbV9qdGFnX3Jlc3RvcmVfY250cltOUl9DUFVTXTsKKworLyogYWNjZXNzIGRlYnVnIHJlZ2lzdGVycyB1c2luZyBzeXN0ZW0gaW5zdHJ1Y3Rpb25zICovCitzdHJ1Y3QgZGJnX2NwdV9jdHggeworCXVpbnQzMl90CQkqc3RhdGU7Cit9OworCitzdHJ1Y3QgZGJnX2N0eCB7CisJdWludDhfdAkJCWFyY2g7CisJYm9vbAkJCXNhdmVfcmVzdG9yZV9lbmFibGVkOworCXVpbnQ4X3QJCQlucl93cDsKKwl1aW50OF90CQkJbnJfYnA7CisJdWludDhfdAkJCW5yX2N0eF9jbXA7CisjaWZkZWYgQ09ORklHX0FSTTY0CisJdWludDY0X3QJCSpzdGF0ZTsKKyNlbHNlCisJdWludDMyX3QJCSpzdGF0ZTsKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBkYmdfY3R4IGRiZzsKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sganRhZ19jcHVfcG1fbm90aWZpZXI7CisKKyNpZmRlZiBDT05GSUdfQVJNNjQKK3N0YXRpYyBpbnQgZGJnX3JlYWRfYXJjaDY0X2J4cih1aW50NjRfdCAqc3RhdGUsIGludCBpLCBpbnQgaikKK3sKKwlzd2l0Y2ggKGopIHsKKwljYXNlIDA6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSMF9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1IwX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdCVlIxX0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR0JDUjFfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR0JWUjJfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHQkNSMl9FTDEpOworCQlicmVhazsKKwljYXNlIDM6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSM19FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1IzX0VMMSk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdCVlI0X0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR0JDUjRfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR0JWUjVfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHQkNSNV9FTDEpOworCQlicmVhazsKKwljYXNlIDY6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSNl9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1I2X0VMMSk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdCVlI3X0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR0JDUjdfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR0JWUjhfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHQkNSOF9FTDEpOworCQlicmVhazsKKwljYXNlIDk6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSOV9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1I5X0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSMTBfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHQkNSMTBfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdCVlIxMV9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1IxMV9FTDEpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR0JWUjEyX0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR0JDUjEyX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTM6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHQlZSMTNfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHQkNSMTNfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdCVlIxNF9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdCQ1IxNF9FTDEpOworCQlicmVhazsKKwljYXNlIDE1OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR0JWUjE1X0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR0JDUjE1X0VMMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2Vycl9yYXRlbGltaXRlZCgiaWR4ICVkIG91dCBvZiBib3VuZHMgaW4gJXNcbiIsIGosIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZGJnX3dyaXRlX2FyY2g2NF9ieHIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMF9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMF9FTDEpOworCQlicmVhazsKKwljYXNlIDE6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIxX0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCQ1IxX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JWUjJfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjJfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSM19FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSM19FTDEpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI0X0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCQ1I0X0VMMSk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JWUjVfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjVfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSNl9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSNl9FTDEpOworCQlicmVhazsKKwljYXNlIDc6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI3X0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCQ1I3X0VMMSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JWUjhfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjhfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSOV9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSOV9FTDEpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTBfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjEwX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIxMV9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTFfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JWUjEyX0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCQ1IxMl9FTDEpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTNfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjEzX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTQ6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIxNF9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTRfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JWUjE1X0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCQ1IxNV9FTDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRiZ19yZWFkX2FyY2g2NF93eHIodWludDY0X3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjBfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSMF9FTDEpOworCQlicmVhazsKKwljYXNlIDE6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHV1ZSMV9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdXQ1IxX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdXVlIyX0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR1dDUjJfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjNfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSM19FTDEpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHV1ZSNF9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdXQ1I0X0VMMSk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdXVlI1X0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR1dDUjVfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjZfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSNl9FTDEpOworCQlicmVhazsKKwljYXNlIDc6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHV1ZSN19FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdXQ1I3X0VMMSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdXVlI4X0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR1dDUjhfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjlfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSOV9FTDEpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjEwX0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR1dDUjEwX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTE6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHV1ZSMTFfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSMTFfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdXVlIxMl9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdXQ1IxMl9FTDEpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWRxKERCR1dWUjEzX0VMMSk7CisJCXN0YXRlW2krK10gPSAodWludDY0X3QpZGJnX3JlYWRsKERCR1dDUjEzX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTQ6CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZHEoREJHV1ZSMTRfRUwxKTsKKwkJc3RhdGVbaSsrXSA9ICh1aW50NjRfdClkYmdfcmVhZGwoREJHV0NSMTRfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkcShEQkdXVlIxNV9FTDEpOworCQlzdGF0ZVtpKytdID0gKHVpbnQ2NF90KWRiZ19yZWFkbChEQkdXQ1IxNV9FTDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRiZ193cml0ZV9hcmNoNjRfd3hyKHVpbnQ2NF90ICpzdGF0ZSwgaW50IGksIGludCBqKQoreworCXN3aXRjaCAoaikgeworCWNhc2UgMDoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjBfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjBfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMV9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMV9FTDEpOworCQlicmVhazsKKwljYXNlIDI6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIyX0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXQ1IyX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjNfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjNfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSNF9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSNF9FTDEpOworCQlicmVhazsKKwljYXNlIDU6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI1X0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXQ1I1X0VMMSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjBfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjZfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSN19FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSN19FTDEpOworCQlicmVhazsKKwljYXNlIDg6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI4X0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXQ1I4X0VMMSk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjlfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjlfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjEwX0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXQ1IxMF9FTDEpOworCQlicmVhazsKKwljYXNlIDExOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTFfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjExX0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIxMl9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTJfRUwxKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dWUjEzX0VMMSk7CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXQ1IxM19FTDEpOworCQlicmVhazsKKwljYXNlIDE0OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTRfRUwxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjE0X0VMMSk7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIxNV9FTDEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTVfRUwxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiZ19zYXZlX3N0YXRlKGludCBjcHUpCit7CisJaW50IGksIGo7CisKKwlpID0gY3B1ICogTUFYX0RCR19SRUdTOworCisJc3dpdGNoIChkYmcuYXJjaCkgeworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjhfODoKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y4OgorCQkvKiBTZXQgT1MgTG9jayB0byBpbmZvcm0gdGhlIGRlYnVnZ2VyIHRoYXQgdGhlIE9TIGlzIGluIHRoZQorCQkgKiBwcm9jZXNzIG9mIHNhdmluZyBkZWJ1ZyByZWdpc3RlcnMuIEl0IHByZXZlbnRzIGFjY2lkZW50YWwKKwkJICogbW9kaWZpY2F0aW9uIG9mIHRoZSBkZWJ1ZyByZWdzIGJ5IHRoZSBleHRlcm5hbCBkZWJ1Z2dlci4KKwkJICovCisJCWRiZ193cml0ZSgweDEsIE9TTEFSX0VMMSk7CisJCS8qIEVuc3VyZSBPUyBsb2NrIGlzIHNldCBiZWZvcmUgcHJvY2VlZGluZyAqLworCQlpc2IoKTsKKworCQlkYmcuc3RhdGVbaSsrXSA9ICAodWludDMyX3QpZGJnX3JlYWRsKE1EU0NSX0VMMSk7CisJCWZvciAoaiA9IDA7IGogPCBkYmcubnJfYnA7IGorKykKKwkJCWkgPSBkYmdfcmVhZF9hcmNoNjRfYnhyKCh1aW50NjRfdCAqKWRiZy5zdGF0ZSwgaSwgaik7CisJCWZvciAoaiA9IDA7IGogPCBkYmcubnJfd3A7IGorKykKKwkJCWkgPSBkYmdfcmVhZF9hcmNoNjRfd3hyKCh1aW50NjRfdCAqKWRiZy5zdGF0ZSwgaSwgaik7CisJCWRiZy5zdGF0ZVtpKytdID0gICh1aW50MzJfdClkYmdfcmVhZGwoTURDQ0lOVF9FTDEpOworCQlkYmcuc3RhdGVbaSsrXSA9ICAodWludDMyX3QpZGJnX3JlYWRsKERCR0NMQUlNQ0xSX0VMMSk7CisJCWRiZy5zdGF0ZVtpKytdID0gICh1aW50MzJfdClkYmdfcmVhZGwoT1NFQ0NSX0VMMSk7CisJCWRiZy5zdGF0ZVtpKytdID0gICh1aW50MzJfdClkYmdfcmVhZGwoT1NEVFJSWF9FTDEpOworCQlkYmcuc3RhdGVbaSsrXSA9ICAodWludDMyX3QpZGJnX3JlYWRsKE9TRFRSVFhfRUwxKTsKKworCQkvKiBTZXQgdGhlIE9TIGRvdWJsZSBsb2NrICovCisJCWlzYigpOworCQlkYmdfd3JpdGUoMHgxLCBPU0RMUl9FTDEpOworCQlpc2IoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ1bnN1cHBvcnRlZCBkYmcgYXJjaCAlZCBpbiAlc1xuIiwgZGJnLmFyY2gsCisJCQkJICAgX19mdW5jX18pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiZ19yZXN0b3JlX3N0YXRlKGludCBjcHUpCit7CisJaW50IGksIGo7CisKKwlpID0gY3B1ICogTUFYX0RCR19SRUdTOworCisJc3dpdGNoIChkYmcuYXJjaCkgeworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjhfODoKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y4OgorCQkvKiBDbGVhciB0aGUgT1MgZG91YmxlIGxvY2sgKi8KKwkJaXNiKCk7CisJCWRiZ193cml0ZSgweDAsIE9TRExSX0VMMSk7CisJCWlzYigpOworCisJCS8qIFNldCBPUyBsb2NrLiBMb2NrIHdpbGwgYWxyZWFkeSBiZSBzZXQgYWZ0ZXIgcG93ZXIgY29sbGFwc2UKKwkJICogYnV0IHRoaXMgd3JpdGUgaXMgaW5jbHVkZWQgdG8gZW5zdXJlIGl0IGlzIHNldC4KKwkJICovCisJCWRiZ193cml0ZSgweDEsIE9TTEFSX0VMMSk7CisJCWlzYigpOworCisJCWRiZ193cml0ZShkYmcuc3RhdGVbaSsrXSwgTURTQ1JfRUwxKTsKKwkJZm9yIChqID0gMDsgaiA8IGRiZy5ucl9icDsgaisrKQorCQkJaSA9IGRiZ193cml0ZV9hcmNoNjRfYnhyKCh1aW50NjRfdCAqKWRiZy5zdGF0ZSwgaSwgaik7CisJCWZvciAoaiA9IDA7IGogPCBkYmcubnJfd3A7IGorKykKKwkJCWkgPSBkYmdfd3JpdGVfYXJjaDY0X3d4cigodWludDY0X3QgKilkYmcuc3RhdGUsIGksIGopOworCQlkYmdfd3JpdGUoZGJnLnN0YXRlW2krK10sIE1EQ0NJTlRfRUwxKTsKKwkJZGJnX3dyaXRlKGRiZy5zdGF0ZVtpKytdLCBEQkdDTEFJTVNFVF9FTDEpOworCQlkYmdfd3JpdGUoZGJnLnN0YXRlW2krK10sIE9TRUNDUl9FTDEpOworCQlkYmdfd3JpdGUoZGJnLnN0YXRlW2krK10sIE9TRFRSUlhfRUwxKTsKKwkJZGJnX3dyaXRlKGRiZy5zdGF0ZVtpKytdLCBPU0RUUlRYX0VMMSk7CisKKwkJaXNiKCk7CisJCWRiZ193cml0ZSgweDAsIE9TTEFSX0VMMSk7CisJCWlzYigpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInVuc3VwcG9ydGVkIGRiZyBhcmNoICVkIGluICVzXG4iLCBkYmcuYXJjaCwKKwkJCQkgICBfX2Z1bmNfXyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYmdfaW5pdF9hcmNoX2RhdGEodm9pZCkKK3sKKwl1aW50NjRfdCBkYmdmcjsKKworCS8qIFRoaXMgd2lsbCBydW4gb24gY29yZTAgc28gdXNlIGl0IHRvIHBvcHVsYXRlIHBhcmFtZXRlcnMgKi8KKwlkYmdmciA9IGRiZ19yZWFkcShJRF9BQTY0REZSMF9FTDEpOworCWRiZy5hcmNoID0gQk1WQUwoZGJnZnIsIDAsIDMpOworCWRiZy5ucl9icCA9IEJNVkFMKGRiZ2ZyLCAxMiwgMTUpICsgMTsKKwlkYmcubnJfd3AgPSBCTVZBTChkYmdmciwgMjAsIDIzKSArIDE7CisJZGJnLm5yX2N0eF9jbXAgPSBCTVZBTChkYmdmciwgMjgsIDMxKSArIDE7Cit9CisjZWxzZQorCitzdGF0aWMgaW50IGRiZ19yZWFkX2FyY2gzMl9ieHIodWludDMyX3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSMCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1IwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSMSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1IxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSMik7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1IyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSMyk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1IzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSNCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSNSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSNik7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSNyk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I3KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSOCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I4KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHQlZSOSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdCQ1I5KTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjEwKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjEwKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjExKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjExKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjEyKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjEyKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjEzKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjEzKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjE0KTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjE0KTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JWUjE1KTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR0JDUjE1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBkYmdfd3JpdGVfYXJjaDMyX2J4cih1aW50MzJfdCAqc3RhdGUsIGludCBpLCBpbnQgaikKK3sKKwlzd2l0Y2ggKGopIHsKKwljYXNlIDA6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIwKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIyKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjIpOworCQlicmVhazsKKwljYXNlIDM6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlIzKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI0KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjQpOworCQlicmVhazsKKwljYXNlIDU6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI1KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjUpOworCQlicmVhazsKKwljYXNlIDY6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI2KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI3KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjcpOworCQlicmVhazsKKwljYXNlIDg6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI4KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjgpOworCQlicmVhazsKKwljYXNlIDk6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdCVlI5KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR0JDUjkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTApOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTApOworCQlicmVhazsKKwljYXNlIDExOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTEpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTIpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTMpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTMpOworCQlicmVhazsKKwljYXNlIDE0OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTQpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTQpOworCQlicmVhazsKKwljYXNlIDE1OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQlZSMTUpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHQkNSMTUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRiZ19yZWFkX2FyY2gzMl93eHIodWludDMyX3QgKnN0YXRlLCBpbnQgaSwgaW50IGopCit7CisJc3dpdGNoIChqKSB7CisJY2FzZSAwOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSMCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1IwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSMSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1IxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSMik7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1IyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSMyk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1IzKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSNCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSNSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSNik7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I2KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSNyk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I3KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSOCk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I4KTsKKwkJYnJlYWs7CisJY2FzZSA5OgorCQlzdGF0ZVtpKytdID0gZGJnX3JlYWQoREJHV1ZSOSk7CisJCXN0YXRlW2krK10gPSBkYmdfcmVhZChEQkdXQ1I5KTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjEwKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjEwKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjExKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjExKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjEyKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjEyKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjEzKTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjEzKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjE0KTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjE0KTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dWUjE1KTsKKwkJc3RhdGVbaSsrXSA9IGRiZ19yZWFkKERCR1dDUjE1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJpZHggJWQgb3V0IG9mIGJvdW5kcyBpbiAlc1xuIiwgaiwgX19mdW5jX18pOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBkYmdfd3JpdGVfYXJjaDMyX3d4cih1aW50MzJfdCAqc3RhdGUsIGludCBpLCBpbnQgaikKK3sKKwlzd2l0Y2ggKGopIHsKKwljYXNlIDA6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIwKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjApOworCQlicmVhazsKKwljYXNlIDE6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIxKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjEpOworCQlicmVhazsKKwljYXNlIDI6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIyKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjIpOworCQlicmVhazsKKwljYXNlIDM6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlIzKTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI0KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjQpOworCQlicmVhazsKKwljYXNlIDU6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI1KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjUpOworCQlicmVhazsKKwljYXNlIDY6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI2KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjYpOworCQlicmVhazsKKwljYXNlIDc6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI3KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjcpOworCQlicmVhazsKKwljYXNlIDg6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI4KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjgpOworCQlicmVhazsKKwljYXNlIDk6CisJCWRiZ193cml0ZShzdGF0ZVtpKytdLCBEQkdXVlI5KTsKKwkJZGJnX3dyaXRlKHN0YXRlW2krK10sIERCR1dDUjkpOworCQlicmVhazsKKwljYXNlIDEwOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTApOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTApOworCQlicmVhazsKKwljYXNlIDExOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTEpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTEpOworCQlicmVhazsKKwljYXNlIDEyOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTIpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTMpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTMpOworCQlicmVhazsKKwljYXNlIDE0OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTQpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTQpOworCQlicmVhazsKKwljYXNlIDE1OgorCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV1ZSMTUpOworCQlkYmdfd3JpdGUoc3RhdGVbaSsrXSwgREJHV0NSMTUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoImlkeCAlZCBvdXQgb2YgYm91bmRzIGluICVzXG4iLCBqLCBfX2Z1bmNfXyk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnX3NhdmVfc3RhdGUoaW50IGNwdSkKK3sKKwlpbnQgaSwgajsKKworCWkgPSBjcHUgKiBNQVhfREJHX1JFR1M7CisKKwlzd2l0Y2ggKGRiZy5hcmNoKSB7CisJY2FzZSBBUk1fREVCVUdfQVJDSF9WOF84OgorCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjg6CisJCS8qIFNldCBPUyBMb2NrIHRvIGluZm9ybSB0aGUgZGVidWdnZXIgdGhhdCB0aGUgT1MgaXMgaW4gdGhlCisJCSAqIHByb2Nlc3Mgb2Ygc2F2aW5nIGRlYnVnIHJlZ2lzdGVycy4gSXQgcHJldmVudHMgYWNjaWRlbnRhbAorCQkgKiBtb2RpZmljYXRpb24gb2YgdGhlIGRlYnVnIHJlZ3MgYnkgdGhlIGV4dGVybmFsIGRlYnVnZ2VyLgorCQkgKi8KKwkJZGJnX3dyaXRlKE9TTE9DS19NQUdJQywgREJHT1NMQVIpOworCQkvKiBFbnN1cmUgT1MgbG9jayBpcyBzZXQgYmVmb3JlIHByb2NlZWRpbmcgKi8KKwkJaXNiKCk7CisKKwkJZGJnLnN0YXRlW2krK10gPSAgZGJnX3JlYWQoREJHRFNDUmV4dCk7CisJCWZvciAoaiA9IDA7IGogPCBkYmcubnJfYnA7IGorKykKKwkJCWkgPSBkYmdfcmVhZF9hcmNoMzJfYnhyKGRiZy5zdGF0ZSwgaSwgaik7CisJCWZvciAoaiA9IDA7IGogPCBkYmcubnJfd3A7IGorKykKKwkJCWkgPSBkYmdfcmVhZF9hcmNoMzJfd3hyKGRiZy5zdGF0ZSwgaSwgaik7CisJCWRiZy5zdGF0ZVtpKytdID0gIGRiZ19yZWFkKERCR0RDQ0lOVCk7CisJCWRiZy5zdGF0ZVtpKytdID0gIGRiZ19yZWFkKERCR0NMQUlNQ0xSKTsKKwkJZGJnLnN0YXRlW2krK10gPSAgZGJnX3JlYWQoREJHT1NFQ0NSKTsKKwkJZGJnLnN0YXRlW2krK10gPSAgZGJnX3JlYWQoREJHRFRSUlhleHQpOworCQlkYmcuc3RhdGVbaSsrXSA9ICBkYmdfcmVhZChEQkdEVFJUWGV4dCk7CisKKwkJLyogU2V0IHRoZSBPUyBkb3VibGUgbG9jayAqLworCQlpc2IoKTsKKwkJZGJnX3dyaXRlKDB4MSwgREJHT1NETFIpOworCQlpc2IoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJ1bnN1cHBvcnRlZCBkYmcgYXJjaCAlZCBpbiAlc1xuIiwgZGJnLmFyY2gsCisJCQkJICAgX19mdW5jX18pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiZ19yZXN0b3JlX3N0YXRlKGludCBjcHUpCit7CisJaW50IGksIGo7CisKKwlpID0gY3B1ICogTUFYX0RCR19SRUdTOworCisJc3dpdGNoIChkYmcuYXJjaCkgeworCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjhfODoKKwljYXNlIEFSTV9ERUJVR19BUkNIX1Y4OgorCQkvKiBDbGVhciB0aGUgT1MgZG91YmxlIGxvY2sgKi8KKwkJaXNiKCk7CisJCWRiZ193cml0ZSgweDAsIERCR09TRExSKTsKKwkJaXNiKCk7CisKKwkJLyogU2V0IE9TIGxvY2suIExvY2sgd2lsbCBhbHJlYWR5IGJlIHNldCBhZnRlciBwb3dlciBjb2xsYXBzZQorCQkgKiBidXQgdGhpcyB3cml0ZSBpcyBpbmNsdWRlZCB0byBlbnN1cmUgaXQgaXMgc2V0LgorCQkgKi8KKwkJZGJnX3dyaXRlKE9TTE9DS19NQUdJQywgREJHT1NMQVIpOworCQlpc2IoKTsKKworCQlkYmdfd3JpdGUoZGJnLnN0YXRlW2krK10sIERCR0RTQ1JleHQpOworCQlmb3IgKGogPSAwOyBqIDwgZGJnLm5yX2JwOyBqKyspCisJCQlpID0gZGJnX3dyaXRlX2FyY2gzMl9ieHIoKHVpbnQzMl90ICopZGJnLnN0YXRlLCBpLCBqKTsKKwkJZm9yIChqID0gMDsgaiA8IGRiZy5ucl93cDsgaisrKQorCQkJaSA9IGRiZ193cml0ZV9hcmNoMzJfd3hyKCh1aW50MzJfdCAqKWRiZy5zdGF0ZSwgaSwgaik7CisJCWRiZ193cml0ZShkYmcuc3RhdGVbaSsrXSwgREJHRENDSU5UKTsKKwkJZGJnX3dyaXRlKGRiZy5zdGF0ZVtpKytdLCBEQkdDTEFJTVNFVCk7CisJCWRiZ193cml0ZShkYmcuc3RhdGVbaSsrXSwgREJHT1NFQ0NSKTsKKwkJZGJnX3dyaXRlKGRiZy5zdGF0ZVtpKytdLCBEQkdEVFJSWGV4dCk7CisJCWRiZ193cml0ZShkYmcuc3RhdGVbaSsrXSwgREJHRFRSVFhleHQpOworCisJCWlzYigpOworCQlkYmdfd3JpdGUoMHgwLCBEQkdPU0xBUik7CisJCWlzYigpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoInVuc3VwcG9ydGVkIGRiZyBhcmNoICVkIGluICVzXG4iLCBkYmcuYXJjaCwKKwkJCQkgICBfX2Z1bmNfXyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYmdfaW5pdF9hcmNoX2RhdGEodm9pZCkKK3sKKwl1aW50MzJfdCBkYmdkaWRyOworCisJLyogVGhpcyB3aWxsIHJ1biBvbiBjb3JlMCBzbyB1c2UgaXQgdG8gcG9wdWxhdGUgcGFyYW1ldGVycyAqLworCWRiZ2RpZHIgPSBkYmdfcmVhZChEQkdESURSKTsKKwlkYmcuYXJjaCA9IEJNVkFMKGRiZ2RpZHIsIDE2LCAxOSk7CisJZGJnLm5yX2N0eF9jbXAgPSBCTVZBTChkYmdkaWRyLCAyMCwgMjMpICsgMTsKKwlkYmcubnJfYnAgPSBCTVZBTChkYmdkaWRyLCAyNCwgMjcpICsgMTsKKwlkYmcubnJfd3AgPSBCTVZBTChkYmdkaWRyLCAyOCwgMzEpICsgMTsKK30KKyNlbmRpZgorCisvKgorICogbXNtX2p0YWdfc2F2ZV9zdGF0ZSAtIHNhdmUgZGVidWcgcmVnaXN0ZXJzCisgKgorICogRGVidWcgcmVnaXN0ZXJzIGFyZSBzYXZlZCBiZWZvcmUgcG93ZXIgY29sbGFwc2UgaWYgZGVidWcKKyAqIGFyY2hpdGVjdHVyZSBpcyBzdXBwb3J0ZWQgcmVzcGVjdGl2ZWx5IGFuZCBUWiBpc24ndCBzdXBwb3J0aW5nCisgKiB0aGUgc2F2ZSBhbmQgcmVzdG9yZSBvZiBkZWJ1ZyByZWdpc3RlcnMuCisgKgorICogQ09OVEVYVDoKKyAqIENhbGxlZCB3aXRoIHByZWVtcHRpb24gb2ZmIGFuZCBpbnRlcnJ1cHRzIGxvY2tlZCBmcm9tOgorICogMS4gcGVyX2NwdSBpZGxlIHRocmVhZCBjb250ZXh0IGZvciBpZGxlIHBvd2VyIGNvbGxhcHNlcworICogb3IKKyAqIDIuIHBlcl9jcHUgaWRsZSB0aHJlYWQgY29udGV4dCBmb3IgaG90cGx1Zy9zdXNwZW5kIHBvd2VyIGNvbGxhcHNlCisgKiAgICBmb3Igbm9uYm9vdCBjcHVzCisgKiBvcgorICogMy4gc3VzcGVuZCB0aHJlYWQgY29udGV4dCBmb3Igc3VzcGVuZCBwb3dlciBjb2xsYXBzZSBmb3IgY29yZTAKKyAqCisgKiBJbiBhbGwgY2FzZXMgd2Ugd2lsbCBydW4gb24gdGhlIHNhbWUgY3B1IGZvciB0aGUgZW50aXJlIGR1cmF0aW9uLgorICovCit2b2lkIG1zbV9qdGFnX3NhdmVfc3RhdGUodm9pZCkKK3sKKwlpbnQgY3B1OworCisJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCW1zbV9qdGFnX3NhdmVfY250cltjcHVdKys7CisJLyogZW5zdXJlIGNvdW50ZXIgaXMgdXBkYXRlZCBiZWZvcmUgbW92aW5nIGZvcndhcmQgKi8KKwltYigpOworCisJbXNtX2p0YWdfZXRtX3NhdmVfc3RhdGUoKTsKKwlpZiAoZGJnLnNhdmVfcmVzdG9yZV9lbmFibGVkKQorCQlkYmdfc2F2ZV9zdGF0ZShjcHUpOworfQorRVhQT1JUX1NZTUJPTChtc21fanRhZ19zYXZlX3N0YXRlKTsKKwordm9pZCBtc21fanRhZ19yZXN0b3JlX3N0YXRlKHZvaWQpCit7CisJaW50IGNwdTsKKworCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBBdHRlbXB0IHJlc3RvcmUgb25seSBpZiBzYXZlIGhhcyBiZWVuIGRvbmUuIElmIHBvd2VyIGNvbGxhcHNlCisJICogaXMgZGlzYWJsZWQsIGhvdHBsdWcgb2ZmIG9mIG5vbi1ib290IGNvcmUgd2lsbCByZXN1bHQgaW4gV0ZJCisJICogYW5kIGhlbmNlIG1zbV9qdGFnX3NhdmVfc3RhdGUgd2lsbCBub3Qgb2NjdXIuIFN1YnNlcXVlbnRseSwKKwkgKiBkdXJpbmcgaG90cGx1ZyBvbiBvZiBub24tYm9vdCBjb3JlIHdoZW4gbXNtX2p0YWdfcmVzdG9yZV9zdGF0ZQorCSAqIGlzIGNhbGxlZCB2aWEgbXNtX3BsYXRmb3JtX3NlY29uZGFyeV9pbml0LCB0aGlzIGNoZWNrIHdpbGwgaGVscAorCSAqIGJhaWwgdXMgb3V0IHdpdGhvdXQgcmVzdG9yaW5nLgorCSAqLworCWlmIChtc21fanRhZ19zYXZlX2NudHJbY3B1XSA9PSBtc21fanRhZ19yZXN0b3JlX2NudHJbY3B1XSkKKwkJcmV0dXJuOworCWVsc2UgaWYgKG1zbV9qdGFnX3NhdmVfY250cltjcHVdICE9IG1zbV9qdGFnX3Jlc3RvcmVfY250cltjcHVdICsgMSkKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJqdGFnIGltYmFsYW5jZSwgc2F2ZTolbHUsIHJlc3RvcmU6JWx1XG4iLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKW1zbV9qdGFnX3NhdmVfY250cltjcHVdLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKW1zbV9qdGFnX3Jlc3RvcmVfY250cltjcHVdKTsKKworCW1zbV9qdGFnX3Jlc3RvcmVfY250cltjcHVdKys7CisJLyogZW5zdXJlIGNvdW50ZXIgaXMgdXBkYXRlZCBiZWZvcmUgbW92aW5nIGZvcndhcmQgKi8KKwltYigpOworCisJaWYgKGRiZy5zYXZlX3Jlc3RvcmVfZW5hYmxlZCkKKwkJZGJnX3Jlc3RvcmVfc3RhdGUoY3B1KTsKKwltc21fanRhZ19ldG1fcmVzdG9yZV9zdGF0ZSgpOworfQorRVhQT1JUX1NZTUJPTChtc21fanRhZ19yZXN0b3JlX3N0YXRlKTsKKworc3RhdGljIGlubGluZSBib29sIGRiZ19hcmNoX3N1cHBvcnRlZCh1aW50OF90IGFyY2gpCit7CisJc3dpdGNoIChhcmNoKSB7CisJY2FzZSBBUk1fREVCVUdfQVJDSF9WOF84OgorCWNhc2UgQVJNX0RFQlVHX0FSQ0hfVjg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQganRhZ19ob3RjcHVfc2F2ZV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY3B1KQoreworCW1zbV9qdGFnX3NhdmVfc3RhdGUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqdGFnX2hvdGNwdV9yZXN0b3JlX2NhbGxiYWNrKHVuc2lnbmVkIGludCBjcHUpCit7CisJbXNtX2p0YWdfcmVzdG9yZV9zdGF0ZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGp0YWdfY3B1X3BtX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfUE1fRU5URVI6CisJCW1zbV9qdGFnX3NhdmVfc3RhdGUoKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfUE1fRU5URVJfRkFJTEVEOgorCWNhc2UgQ1BVX1BNX0VYSVQ6CisJCW1zbV9qdGFnX3Jlc3RvcmVfc3RhdGUoKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sganRhZ19jcHVfcG1fbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBqdGFnX2NwdV9wbV9jYWxsYmFjaywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9qdGFnX2RiZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIFRoaXMgd2lsbCBydW4gb24gY29yZTAgc28gdXNlIGl0IHRvIHBvcHVsYXRlIHBhcmFtZXRlcnMgKi8KKwlkYmdfaW5pdF9hcmNoX2RhdGEoKTsKKworCWlmIChkYmdfYXJjaF9zdXBwb3J0ZWQoZGJnLmFyY2gpKSB7CisJCWlmIChzY21fZ2V0X2ZlYXRfdmVyc2lvbihUWl9EQkdfRVRNX0ZFQVRfSUQpIDwgVFpfREJHX0VUTV9WRVIpIHsKKwkJCWRiZy5zYXZlX3Jlc3RvcmVfZW5hYmxlZCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlwcl9pbmZvKCJkYmcgc2F2ZS1yZXN0b3JlIHN1cHBvcnRlZCBieSBUWlxuIik7CisJCQlnb3RvIGRiZ19vdXQ7CisJCX0KKwl9IGVsc2UgeworCQlwcl9pbmZvKCJkYmcgYXJjaCAldSBub3Qgc3VwcG9ydGVkXG4iLCBkYmcuYXJjaCk7CisJCWdvdG8gZGJnX291dDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBkYmcgc3RhdGUgc2F2ZSBzcGFjZSAqLworI2lmZGVmIENPTkZJR19BUk02NAorCWRiZy5zdGF0ZSA9IGtjYWxsb2MoTUFYX0RCR19TVEFURV9TSVpFLCBzaXplb2YodWludDY0X3QpLCBHRlBfS0VSTkVMKTsKKyNlbHNlCisJZGJnLnN0YXRlID0ga2NhbGxvYyhNQVhfREJHX1NUQVRFX1NJWkUsIHNpemVvZih1aW50MzJfdCksIEdGUF9LRVJORUwpOworI2VuZGlmCisJaWYgKCFkYmcuc3RhdGUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkYmdfZXJyOworCX0KKworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfQVJNX1NBVkVfUkVTVE9SRV9DT1JFU0lHSFQ0X1NUQVJUSU5HLAorCQkJCSAgIkFQX0FSTV9TQVZFX1JFU1RPUkVfQ09SRVNJR0hUNF9TVEFSVElORyIsCisJCQkJICBqdGFnX2hvdGNwdV9yZXN0b3JlX2NhbGxiYWNrLAorCQkJCSAganRhZ19ob3RjcHVfc2F2ZV9jYWxsYmFjayk7CisKKwljcHVfcG1fcmVnaXN0ZXJfbm90aWZpZXIoJmp0YWdfY3B1X3BtX25vdGlmaWVyKTsKK2RiZ19vdXQ6CisJcmV0dXJuIDA7CitkYmdfZXJyOgorCXJldHVybiByZXQ7Cit9CithcmNoX2luaXRjYWxsKG1zbV9qdGFnX2RiZ19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1jb3JlLmMgYi9kcml2ZXJzL3NvYy9xY29tL2xsY2MtY29yZS5jCmluZGV4IDNkNmIwMDIuLmE1ZTViNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1jb3JlLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9sbGNjLWNvcmUuYwpAQCAtMzUsNiArMzUsMTUgQEAKICNkZWZpbmUgRFJQMF9JTlRFUlJVUFRfRU5BQkxFCUJJVCg2KQogI2RlZmluZSBTQl9EQl9EUlBfSU5URVJSVVBUX0VOQUJMRQkweDMKIAorI2lmZGVmIENPTkZJR19FREFDX1FDT01fTExDQworI2RlZmluZSBFTkFCTEVfRUNDX0lOVFIgMQorI2Vsc2UKKyNkZWZpbmUgRU5BQkxFX0VDQ19JTlRSIDAKKyNlbmRpZgorCitzdGF0aWMgaW50IGVuYWJsZV9lY2NfaW50ciA9IEVOQUJMRV9FQ0NfSU5UUjsKK21vZHVsZV9wYXJhbShlbmFibGVfZWNjX2ludHIsIGludCwgMDQ0NCk7CisKIHN0YXRpYyB2b2lkIHFjb21fbGxjY19jb3JlX3NldHVwKHN0cnVjdCByZWdtYXAgKmxsY2NfcmVnbWFwLCB1aW50MzJfdCBiX29mZikKIHsKIAl1MzIgc2JfZXJyX3RocmVzaG9sZDsKQEAgLTgxLDcgKzkwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcWNvbV9sbGNjX2NvcmVfc2V0dXAobGxjY19yZWdtYXAsIGJfb2ZmKTsKKwlpZiAoZW5hYmxlX2VjY19pbnRyKQorCQlxY29tX2xsY2NfY29yZV9zZXR1cChsbGNjX3JlZ21hcCwgYl9vZmYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL2xsY2Mtc2RtODQ1LmMgYi9kcml2ZXJzL3NvYy9xY29tL2xsY2Mtc2RtODQ1LmMKaW5kZXggNzM5YzA1My4uNTIzNDU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9sbGNjLXNkbTg0NS5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1zZG04NDUuYwpAQCAtNTcsMjMgKzU3LDI0IEBACiAJfQogCiBzdGF0aWMgc3RydWN0IGxsY2Nfc2xpY2VfY29uZmlnIHNkbTg0NV9kYXRhW10gPSAgewotCVNDVF9FTlRSWSgiY3B1c3MiLCAgICAgICAxLCAxLCAzMDcyLCAxLCAwLCAweEZGMCwgMHhGLCAwLCAwLCAxLCAxLCAxKSwKKwlTQ1RfRU5UUlkoImNwdXNzIiwgICAgICAgMSwgMSwgMjgxNiwgMSwgMCwgMHhGRkMsIDB4MiwgMCwgMCwgMSwgMSwgMSksCiAJU0NUX0VOVFJZKCJ2aWRzYzAiLCAgICAgIDIsIDIsIDUxMiwgMiwgMSwgMHgwLCAgMHgwRjAsIDAsIDAsIDEsIDEsIDApLAogCVNDVF9FTlRSWSgidmlkc2MxIiwgICAgICAzLCAzLCA1MTIsIDIsIDEsIDB4MCwgIDB4MEYwLCAwLCAwLCAxLCAxLCAwKSwKLQlTQ1RfRU5UUlkoInJvdGF0b3IiLCAgICAgNCwgNCwgNTYzLCAyLCAxLCAweDAsICAweDAwRiwgMiwgMCwgMSwgMSwgMCksCi0JU0NUX0VOVFJZKCJ2b2ljZSIsICAgICAgIDUsIDUsIDMwNzIsIDEsIDAsIDB4RkYwLCAweEYsIDAsIDAsIDEsIDEsIDApLAotCVNDVF9FTlRSWSgiYXVkaW8iLCAgICAgICA2LCA2LCAzMDcyLCAxLCAwLCAweEZGMCwgMHhGLCAwLCAwLCAxLCAxLCAwKSwKLQlTQ1RfRU5UUlkoIm1vZGVtaHBfZ3JvdyIsIDcsIDcsIDEwMjQsIDIsIDAsIDB4MEYwLCAweEYwRiwgMCwgMCwgMSwgMSwgMCksCi0JU0NUX0VOVFJZKCJtb2RlbSIsICAgICAgIDgsIDgsIDMwNzIsIDEsIDAsIDB4RkYwLCAweEYsIDAsIDAsIDEsIDEsIDApLAotCVNDVF9FTlRSWSgiY29tcHV0ZSIsICAgICAxMCwgMTAsIDMwNzIsIDEsIDAsIDB4RkYwLCAweEYsIDAsIDAsIDEsIDEsIDApLAotCVNDVF9FTlRSWSgiZ3B1aHR3IiwgICAgICAxMSwgMTEsIDUxMiwgMSwgMSwgMHgwLCAgMHhDLCAwLCAwLCAxLCAxLCAwKSwKLQlTQ1RfRU5UUlkoImdwdSIsICAgICAgICAgMTIsIDEyLCAyNTYwLCAxLCAwLCAweEZGMCwgMHgzLCAwLCAwLCAxLCAxLCAwKSwKLQlTQ1RfRU5UUlkoIm1tdWh3dCIsICAgICAgMTMsIDEzLCAzMDcyLCAxLCAwLCAweEZGMCwgMHhGLCAwLCAwLCAxLCAwLCAxKSwKLQlTQ1RfRU5UUlkoImNvbXB1dGVfZG1hIiwgMTUsIDE1LCAzMDcyLCAxLCAwLCAweEZGMCwgMHhGLCAwLCAwLCAxLCAxLCAwKSwKLQlTQ1RfRU5UUlkoImRpc3BsYXkiLCAgICAgMTYsIDE2LCAzMDcyLCAxLCAwLCAweEZGMCwgMHhGLCAwLCAwLCAxLCAxLCAwKSwKKwlTQ1RfRU5UUlkoInJvdGF0b3IiLCAgICAgNCwgNCwgNTYzLCAyLCAxLCAweDAsICAweDAwZSwgMiwgMCwgMSwgMSwgMCksCisJU0NUX0VOVFJZKCJ2b2ljZSIsICAgICAgIDUsIDUsIDI4MTYsIDEsIDAsIDB4RkZDLCAweDIsIDAsIDAsIDEsIDEsIDApLAorCVNDVF9FTlRSWSgiYXVkaW8iLCAgICAgICA2LCA2LCAyODE2LCAxLCAwLCAweEZGQywgMHgyLCAwLCAwLCAxLCAxLCAwKSwKKwlTQ1RfRU5UUlkoIm1vZGVtaHBfZ3JvdyIsIDcsIDcsIDEwMjQsIDIsIDAsIDB4MEZDLCAweEYwMCwgMCwgMCwgMSwgMSwgMCksCisJU0NUX0VOVFJZKCJtb2RlbSIsICAgICAgIDgsIDgsIDI4MTYsIDEsIDAsIDB4RkZDLCAweDIsIDAsIDAsIDEsIDEsIDApLAorCVNDVF9FTlRSWSgiY29tcHV0ZSIsICAgICAxMCwgMTAsIDI4MTYsIDEsIDAsIDB4RkZDLCAweDIsIDAsIDAsIDEsIDEsIDApLAorCVNDVF9FTlRSWSgiZ3B1aHR3IiwgICAgICAxMSwgMTEsIDUxMiwgMSwgMSwgMHhDLCAgMHgwLCAwLCAwLCAxLCAxLCAwKSwKKwlTQ1RfRU5UUlkoImdwdSIsICAgICAgICAgMTIsIDEyLCAyMzA0LCAxLCAwLCAweEZGMCwgMHgyLCAwLCAwLCAxLCAxLCAwKSwKKwlTQ1RfRU5UUlkoIm1tdWh3dCIsICAgICAgMTMsIDEzLCAyNTYsIDIsIDAsIDB4MCwgIDB4MSwgMCwgMCwgMSwgMCwgMSksCisJU0NUX0VOVFJZKCJjb21wdXRlX2RtYSIsIDE1LCAxNSwgMjgxNiwgMSwgMCwgMHhGRkMsIDB4MiwgMCwgMCwgMSwgMSwgMCksCisJU0NUX0VOVFJZKCJkaXNwbGF5IiwgICAgIDE2LCAxNiwgMjgxNiwgMSwgMCwgMHhGRkMsIDB4MiwgMCwgMCwgMSwgMSwgMCksCisJU0NUX0VOVFJZKCJ2aWRlb2Z3IiwgICAgIDE3LCAxNywgMjgxNiwgMSwgMCwgMHhGRkMsIDB4MiwgMCwgMCwgMSwgMSwgMCksCiAJU0NUX0VOVFJZKCJtb2RlbWhwX2ZpeCIsIDIwLCAyMCwgMTAyNCwgMiwgMSwgMHgwLCAgMHhGMDAsIDAsIDAsIDEsIDEsIDApLAotCVNDVF9FTlRSWSgibW9kZW1fcGFnaW5nIiwgMjEsIDIxLCAxMDI0LCAwLCAxLCAweDAsICAweEYsIDAsIDAsIDEsIDEsIDApLAotCVNDVF9FTlRSWSgiYXVkaW9odyIsICAgICAyMiwgMjIsIDEwMjQsIDEsIDEsIDB4RkYwLCAweEYsIDAsIDAsIDEsIDEsIDApLAorCVNDVF9FTlRSWSgibW9kZW1fcGFnaW5nIiwgMjEsIDIxLCAxMDI0LCAwLCAxLCAweDFlLCAweDAsIDAsIDAsIDEsIDEsIDApLAorCVNDVF9FTlRSWSgiYXVkaW9odyIsICAgICAyMiwgMjIsIDEwMjQsIDEsIDEsIDB4RkZDLCAweDIsIDAsIDAsIDEsIDEsIDApLAogfTsKIAogc3RhdGljIGludCBzZG04NDVfcWNvbV9sbGNjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL2xsY2Mtc2xpY2UuYyBiL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1zbGljZS5jCmluZGV4IDVjYTA5NDEuLjVkZDQ5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1zbGljZS5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vbGxjYy1zbGljZS5jCkBAIC00Myw3ICs0MywxMCBAQAogI2RlZmluZSBMTENDX1NUQVRVU19SRUFEX0RFTEFZIDEwMAogCiAjZGVmaW5lIENBQ0hFX0xJTkVfU0laRV9TSElGVCA2Ci0jZGVmaW5lIFNJWkVfUEVSX0xMQ0NfU0hJRlQgICAyCisKKyNkZWZpbmUgTExDQ19DT01NT05fU1RBVFVTMAkJMHgwMDAzMDAwQworI2RlZmluZSBMTENDX0xCX0NOVF9NQVNLCQkweGYwMDAwMDAwCisjZGVmaW5lIExMQ0NfTEJfQ05UX1NISUZUCQkyOAogCiAjZGVmaW5lIE1BWF9DQVBfVE9fQllURVMobikgKG4gKiAxMDI0KQogI2RlZmluZSBMTENDX1RSUF9BQ1RfQ1RSTG4obikgKG4gKiAweDEwMDApCkBAIC02NSw2ICs2OCw3IEBACiAJdTMyIGxsY2NfY29uZmlnX2RhdGFfc3o7CiAJdTMyIG1heF9zbGljZXM7CiAJdTMyIGJfb2ZmOworCXUzMiBub19iYW5rczsKIAl1bnNpZ25lZCBsb25nICpsbGNjX3NsaWNlX21hcDsKIH07CiAKQEAgLTM0MiwxMyArMzQ2LDE1IEBACiAJCWF0dHIxX3ZhbCB8PSAobGxjY190YWJsZVtpXS5wcmlvcml0eSA8PCBBVFRSMV9QUklPUklUWV9TSElGVCk7CiAKIAkJbWF4X2NhcF9jYWNoZWxpbmUgPSBNQVhfQ0FQX1RPX0JZVEVTKGxsY2NfdGFibGVbaV0ubWF4X2NhcCk7Ci0JCW1heF9jYXBfY2FjaGVsaW5lID4+PSBDQUNIRV9MSU5FX1NJWkVfU0hJRlQ7Ci0JCS8qIFRoZXJlIGFyZSBmb3VyIGxsY2MgaW5zdGFuY2VzIGxsY2MwLi5sbGNjMy4gVGhlIFNXIHdyaXRlcyB0bwotCQkgKiB0byBicm9hZGNhc3QgcmVnaXN0ZXIgd2hpY2ggZ2V0cyBwcm9wYWdhdGVkIHRvIGVhY2ggbGxjYy4KKworCQkvKiBMTENDIGluc3RhbmNlcyBjYW4gdmFyeSBmb3IgZWFjaCB0YXJnZXQuCisJCSAqIFRoZSBTVyB3cml0ZXMgdG8gYnJvYWRjYXN0IHJlZ2lzdGVyIHdoaWNoIGdldHMgcHJvcGFnYXRlZAorCQkgKiB0byBlYWNoIGxsY2MgaW5zdGFjZSAobGxjYzAsLi4gbGxjY04pLgogCQkgKiBTaW5jZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGlzIGRpdmlkZWQgZXF1YWxseSBhbW9uZ3N0IHRoZQotCQkgKiBmb3VyIGxsY2MsIHdlIG5lZWQgdG8gZGl2aWRlIHRoZSBtYXggY2FwIGJ5IDQKKwkJICogbGxjYyBpbnN0YW5jZXMsIHdlIG5lZWQgdG8gY29uZmlndXJlIHRoZSBtYXggY2FwIGFjY29yZGluZ2x5LgogCQkgKi8KLQkJbWF4X2NhcF9jYWNoZWxpbmUgPj49IFNJWkVfUEVSX0xMQ0NfU0hJRlQ7CisJCW1heF9jYXBfY2FjaGVsaW5lID0gKG1heF9jYXBfY2FjaGVsaW5lIC8gZHJ2LT5ub19iYW5rcyk7CisJCW1heF9jYXBfY2FjaGVsaW5lID4+PSBDQUNIRV9MSU5FX1NJWkVfU0hJRlQ7CiAJCWF0dHIxX3ZhbCB8PSAobWF4X2NhcF9jYWNoZWxpbmUgPDwgQVRUUjFfTUFYX0NBUF9TSElGVCk7CiAKIAkJYXR0cjBfdmFsID0gbGxjY190YWJsZVtpXS5yZXNfd2F5cyAmIEFUVFIwX1JFU19XQVlTX01BU0s7CkBAIC0zNzUsNiArMzgxLDcgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGxsY2Nfc2xpY2VfY29uZmlnICpsbGNjX2NmZywgdTMyIHN6KQogewogCWludCByYyA9IDA7CisJdTMyIG51bV9iYW5rcyA9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdGF0aWMgc3RydWN0IGxsY2NfZHJ2X2RhdGEgKmRydl9kYXRhOwogCkBAIC0zODYsNiArMzkzLDEzIEBACiAJaWYgKCFkcnZfZGF0YS0+bGxjY19tYXApCiAJCXJldHVybiBQVFJfRVJSKGRydl9kYXRhLT5sbGNjX21hcCk7CiAKKwlyZWdtYXBfcmVhZChkcnZfZGF0YS0+bGxjY19tYXAsIExMQ0NfQ09NTU9OX1NUQVRVUzAsCisJCSAgICAmbnVtX2JhbmtzKTsKKworCW51bV9iYW5rcyAmPSBMTENDX0xCX0NOVF9NQVNLOworCW51bV9iYW5rcyA+Pj0gTExDQ19MQl9DTlRfU0hJRlQ7CisJZHJ2X2RhdGEtPm5vX2JhbmtzID0gbnVtX2JhbmtzOworCiAJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgIm1heC1zbGljZXMiLAogCQkJCSAgJmRydl9kYXRhLT5tYXhfc2xpY2VzKTsKIAlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX2JpbWNfcnBtaC5jIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfYmltY19ycG1oLmMKaW5kZXggYzFlOGZlYi4uZGFmYWU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfYmltY19ycG1oLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfYmltY19ycG1oLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtMjQyLDcgKzI0Miw3IEBACiAJKE1fQktFX0dDX0dDX0JNU0sgPj4gXAogCShNX0JLRV9HQ19HQ19TSEZUICsgMSkpCiAKLXN0YXRpYyBpbnQgYmltY19kaXYoaW50NjRfdCAqYSwgdWludDMyX3QgYikKK3N0YXRpYyBpbnQgYmltY19kaXYodWludDY0X3QgKmEsIHVpbnQzMl90IGIpCiB7CiAJaWYgKCgqYSA+IDApICYmICgqYSA8IGIpKSB7CiAJCSphID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX2ZhYnJpY19ycG1oLmMgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9idXMvbXNtX2J1c19mYWJyaWNfcnBtaC5jCmluZGV4IDBlNWVhZDAuLjVhMTEwYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX2ZhYnJpY19ycG1oLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfZmFicmljX3JwbWguYwpAQCAtNTYzLDEyICs1NjMsMTQgQEAKIAkJcmV0dXJuIHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBub2RlX3RtcCwgY2xpc3QsIGxpbmspIHsKLQkJaWYgKHVubGlrZWx5KG5vZGUtPm5vZGVfaW5mby0+ZGVmZXJfcW9zKSkKLQkJCW1zbV9idXNfZGV2X2luaXRfcW9zKCZub2RlLT5kZXYsIE5VTEwpOwotCiAJCWJjbV9jbGlzdF9hZGQobm9kZSk7CiAJfQogCisJaWYgKCFjdXJfcnNjKSB7CisJCU1TTV9CVVNfRVJSKCIlczogRXJyb3IgZm9yIGN1cl9yc2MgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAljdXJfbWJveCA9IGN1cl9yc2MtPnJzY2Rldi0+bWJveDsKIAljdXJfYmNtX2NsaXN0ID0gY3VyX3JzYy0+cnNjZGV2LT5iY21fY2xpc3Q7CiAKQEAgLTY0MCwzMyArNjQyLDM5IEBACiAJCQlNU01fQlVTX0VSUigiJXM6IGVycm9yIHNlbmRpbmcgYWN0aXZlL2F3YWtlIHNldHM6ICVkXG4iLAogCQkJCQkJX19mdW5jX18sIHJldCk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gcnBtaF93cml0ZV9wYXNzdGhydShjdXJfbWJveCwgY3VyX3JzYy0+cnNjZGV2LT5yZXFfc3RhdGUsCisJCXJldCA9IHJwbWhfd3JpdGVfYmF0Y2goY3VyX21ib3gsIGN1cl9yc2MtPnJzY2Rldi0+cmVxX3N0YXRlLAogCQkJCQkJY21kbGlzdF9hY3RpdmUsIG5fYWN0aXZlKTsKIAkJaWYgKHJldCkKIAkJCU1TTV9CVVNfRVJSKCIlczogZXJyb3Igc2VuZGluZyBhY3RpdmUvYXdha2Ugc2V0czogJWRcbiIsCiAJCQkJCQlfX2Z1bmNfXywgcmV0KTsKIAl9CiAJaWYgKGNudF93YWtlKSB7Ci0JCXJldCA9IHJwbWhfd3JpdGVfcGFzc3RocnUoY3VyX21ib3gsIFJQTUhfV0FLRV9PTkxZX1NUQVRFLAorCQlyZXQgPSBycG1oX3dyaXRlX2JhdGNoKGN1cl9tYm94LCBSUE1IX1dBS0VfT05MWV9TVEFURSwKIAkJCQkJCQljbWRsaXN0X3dha2UsIG5fd2FrZSk7CiAJCWlmIChyZXQpCiAJCQlNU01fQlVTX0VSUigiJXM6IGVycm9yIHNlbmRpbmcgd2FrZSBzZXRzOiAlZFxuIiwKIAkJCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJa2ZyZWUobl93YWtlKTsKKwkJa2ZyZWUoY21kbGlzdF93YWtlKTsKIAl9CiAJaWYgKGNudF9zbGVlcCkgewotCQlyZXQgPSBycG1oX3dyaXRlX3Bhc3N0aHJ1KGN1cl9tYm94LCBSUE1IX1NMRUVQX1NUQVRFLAorCQlyZXQgPSBycG1oX3dyaXRlX2JhdGNoKGN1cl9tYm94LCBSUE1IX1NMRUVQX1NUQVRFLAogCQkJCQkJCWNtZGxpc3Rfc2xlZXAsIG5fc2xlZXApOwogCQlpZiAocmV0KQogCQkJTVNNX0JVU19FUlIoIiVzOiBlcnJvciBzZW5kaW5nIHNsZWVwIHNldHM6ICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCByZXQpOworCQlrZnJlZShuX3NsZWVwKTsKKwkJa2ZyZWUoY21kbGlzdF9zbGVlcCk7CiAJfQogCiAJa2ZyZWUoY21kbGlzdF9hY3RpdmUpOwotCWtmcmVlKGNtZGxpc3Rfd2FrZSk7Ci0Ja2ZyZWUoY21kbGlzdF9zbGVlcCk7CiAJa2ZyZWUobl9hY3RpdmUpOwotCWtmcmVlKG5fd2FrZSk7Ci0Ja2ZyZWUobl9zbGVlcCk7CisKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBub2RlX3RtcCwgY2xpc3QsIGxpbmspIHsKKwkJaWYgKHVubGlrZWx5KG5vZGUtPm5vZGVfaW5mby0+ZGVmZXJfcW9zKSkKKwkJCW1zbV9idXNfZGV2X2luaXRfcW9zKCZub2RlLT5kZXYsIE5VTEwpOworCX0KIAogZXhpdF9tc21fYnVzX2NvbW1pdF9kYXRhOgogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBub2RlX3RtcCwgY2xpc3QsIGxpbmspIHsKQEAgLTk2Miw2ICs5NzAsMTIgQEAKIAogCU1TTV9CVVNfREJHKCJEZXZpY2UgPSAlZCIsIG5vZGVfZGV2LT5ub2RlX2luZm8tPmlkKTsKIAorCWlmIChub2RlX2Rldi0+bm9kZV9pbmZvLT5xb3NfcGFyYW1zLmRlZmVyX2luaXRfcW9zKSB7CisJCW5vZGVfZGV2LT5ub2RlX2luZm8tPnFvc19wYXJhbXMuZGVmZXJfaW5pdF9xb3MgPSBmYWxzZTsKKwkJbm9kZV9kZXYtPm5vZGVfaW5mby0+ZGVmZXJfcW9zID0gdHJ1ZTsKKwkJZ290byBleGl0X2luaXRfcW9zOworCX0KKwogCWlmIChub2RlX2Rldi0+YXBfb3duZWQpIHsKIAkJc3RydWN0IG1zbV9idXNfbm9kZV9kZXZpY2VfdHlwZSAqYnVzX25vZGVfaW5mbzsKIApAQCAtOTk1LDYgKzEwMDksNyBAQAogCiAJCQkJYnVzX25vZGVfaW5mby0+ZmFiZGV2LT5ub2Nfb3BzLnFvc19pbml0KAogCQkJCQlub2RlX2RldiwKKwkJCQkJYnVzX25vZGVfaW5mbywKIAkJCQkJYnVzX25vZGVfaW5mby0+ZmFiZGV2LT5xb3NfYmFzZSwKIAkJCQkJYnVzX25vZGVfaW5mby0+ZmFiZGV2LT5iYXNlX29mZnNldCwKIAkJCQkJYnVzX25vZGVfaW5mby0+ZmFiZGV2LT5xb3Nfb2ZmLApAQCAtMTI5MCw2ICsxMzA1LDggQEAKIAkJCQlwZGF0YV9ub2RlX2luZm8tPnFvc19wYXJhbXMucmVnX21vZGUud3JpdGU7CiAJbm9kZV9pbmZvLT5xb3NfcGFyYW1zLnVyZ19md2RfZW4gPQogCQkJCXBkYXRhX25vZGVfaW5mby0+cW9zX3BhcmFtcy51cmdfZndkX2VuOworCW5vZGVfaW5mby0+cW9zX3BhcmFtcy5kZWZlcl9pbml0X3FvcyA9CisJCQkJcGRhdGFfbm9kZV9pbmZvLT5xb3NfcGFyYW1zLmRlZmVyX2luaXRfcW9zOwogCW5vZGVfaW5mby0+YWdnX3BhcmFtcy5idXN3aWR0aCA9IHBkYXRhX25vZGVfaW5mby0+YWdnX3BhcmFtcy5idXN3aWR0aDsKIAlub2RlX2luZm8tPmFnZ19wYXJhbXMuYWdnX3NjaGVtZSA9CiAJCQkJCXBkYXRhX25vZGVfaW5mby0+YWdnX3BhcmFtcy5hZ2dfc2NoZW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfbm9jX3JwbWguYyBiL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX25vY19ycG1oLmMKaW5kZXggOTk2YzcxOS4uYmRjZGYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfbm9jX3JwbWguYworKysgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9idXMvbXNtX2J1c19ub2NfcnBtaC5jCkBAIC0xNSwxMCArMTUsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tc20tYnVzLWJvYXJkLmg+CisjaW5jbHVkZSA8bGludXgvbXNtLWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSAibXNtX2J1c19jb3JlLmgiCiAjaW5jbHVkZSAibXNtX2J1c19ub2MuaCIKICNpbmNsdWRlICJtc21fYnVzX3JwbWguaCIKIAorc3RhdGljIERFRklORV9TUElOTE9DSyhub2NfbG9jayk7CisKIC8qIE5PQ19RT1MgZ2VuZXJpYyAqLwogI2RlZmluZSBfX0NMWih4KSAoKDggKiBzaXplb2YodWludDMyX3QpKSAtIDEgLSBfX2Zscyh4KSkKICNkZWZpbmUgU0FUX1NDQUxFIDE2CS8qIDE2IGJ5dGVzIG1pbmltdW0gZm9yIHNhdHVyYXRpb24gKi8KQEAgLTI5LDYgKzMzLDcgQEAKICNkZWZpbmUgTUFYX1NBVF9GSUVMRCAoTk9DX1FPU19TQVRuX1NBVF9CTVNLID4+IE5PQ19RT1NfU0FUbl9TQVRfU0hGVCkKICNkZWZpbmUgTUlOX1NBVF9GSUVMRAkxCiAjZGVmaW5lIE1JTl9CV19GSUVMRAkxCisjZGVmaW5lIE1TTV9CVVNfRkFCX01FTV9OT0MgNjE1MgogCiAjZGVmaW5lIE5PQ19RT1NfUkVHX0JBU0UoYiwgbykJCSgoYikgKyAobykpCiAKQEAgLTEwMiw2ICsxMDcsOCBAQAogCU5PQ19RT1NfU0FUbl9TQVRfU0hGVAkJPSAweDAsCiB9OwogCitzdGF0aWMgdm9pZCBfX2lvbWVtICptZW1ub2NfcW9zX2Jhc2U7CisKIHN0YXRpYyBpbnQgbm9jX2Rpdih1aW50NjRfdCAqYSwgdWludDMyX3QgYikKIHsKIAlpZiAoKCphID4gMCkgJiYgKCphIDwgYikpIHsKQEAgLTE2OSwzOCArMTc2LDEwIEBACiAJd21iKCk7CiB9CiAKLXN0YXRpYyB2b2lkIG5vY19zZXRfcW9zX2xpbWl0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1aW50MzJfdCBxb3Nfb2ZmLAotCQl1aW50MzJfdCBtcG9ydCwgdWludDMyX3QgcW9zX2RlbHRhLAotCQlzdHJ1Y3QgbXNtX2J1c19ub2NfbGltaXRlciAqbGltLCB1aW50MzJfdCBsaW1fZW4pCitzdGF0aWMgdm9pZCBub2NfZW5hYmxlX3Fvc19saW1pdGVyKHZvaWQgX19pb21lbSAqYmFzZSwgdWludDMyX3QgcW9zX29mZiwKKwkJdWludDMyX3QgbXBvcnQsIHVpbnQzMl90IHFvc19kZWx0YSwgdWludDMyX3QgbGltX2VuKQogewogCXVpbnQzMl90IHJlZ192YWwsIHZhbDsKLQotCXJlZ192YWwgPSByZWFkbF9yZWxheGVkKE5PQ19RT1NfTUFJTkNUTF9MT1duX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsCi0JCXFvc19kZWx0YSkpOwotCi0Jd3JpdGVsX3JlbGF4ZWQoKHJlZ192YWwgJiAofihOT0NfUU9TX01DVExfTElNSVRfRU5uX0JNU0spKSksCi0JCU5PQ19RT1NfTUFJTkNUTF9MT1duX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSkpOwotCi0JLyogRW5zdXJlIHdlIGRpc2FibGUgbGltaXRlciBiZWZvcmUgY29uZmlnKi8KLQl3bWIoKTsKLQotCXJlZ192YWwgPSByZWFkbF9yZWxheGVkKE5PQ19RT1NfTElNSVRCV25fQUREUihiYXNlLCBxb3Nfb2ZmLCBtcG9ydCwKLQkJcW9zX2RlbHRhKSk7Ci0JdmFsID0gbGltLT5idyA8PCBOT0NfUU9TX0xJTUlUQldfQlduX1NIRlQ7Ci0Jd3JpdGVsX3JlbGF4ZWQoKChyZWdfdmFsICYgKH4oTk9DX1FPU19MSU1JVEJXX0JXbl9CTVNLKSkpIHwKLQkJKHZhbCAmIE5PQ19RT1NfTElNSVRCV19CV25fQk1TSykpLAotCQlOT0NfUU9TX0xJTUlUQlduX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSkpOwotCi0JcmVnX3ZhbCA9IHJlYWRsX3JlbGF4ZWQoTk9DX1FPU19MSU1JVEJXbl9BRERSKGJhc2UsIHFvc19vZmYsIG1wb3J0LAotCQlxb3NfZGVsdGEpKTsKLQl2YWwgPSBsaW0tPnNhdCA8PCBOT0NfUU9TX0xJTUlUQldfU0FUbl9TSEZUOwotCXdyaXRlbF9yZWxheGVkKCgocmVnX3ZhbCAmICh+KE5PQ19RT1NfTElNSVRCV19TQVRuX0JNU0spKSkgfAotCQkodmFsICYgTk9DX1FPU19MSU1JVEJXX1NBVG5fQk1TSykpLAotCQlOT0NfUU9TX0xJTUlUQlduX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSkpOwotCi0JLyogRW5zdXJlIHFvcyBsaW1pdGVyIHNldHRpbmdzIGluIHBsYWNlIGJlZm9yZSBwb3NzaWJseSBlbmFibGluZyAqLwotCXdtYigpOwotCiAJcmVnX3ZhbCA9IHJlYWRsX3JlbGF4ZWQoTk9DX1FPU19NQUlOQ1RMX0xPV25fQUREUihiYXNlLCBxb3Nfb2ZmLCBtcG9ydCwKIAkJcW9zX2RlbHRhKSk7CiAJdmFsID0gbGltX2VuIDw8IE5PQ19RT1NfTUNUTF9MSU1JVF9FTm5fU0hGVDsKQEAgLTIwOCw5ICsxODcsNTAgQEAKIAkJKHZhbCAmIE5PQ19RT1NfTUNUTF9MSU1JVF9FTm5fQk1TSykpLAogCQlOT0NfUU9TX01BSU5DVExfTE9Xbl9BRERSKGJhc2UsIHFvc19vZmYsIG1wb3J0LCBxb3NfZGVsdGEpKTsKIAorCS8qIEVuc3VyZSB3ZSBkaXNhYmxlL2VuYWJsZSBsaW1pdGVyIGJlZm9yZSBleGl0aW5nKi8KIAl3bWIoKTsKIH0KIAorc3RhdGljIHZvaWQgbm9jX3NldF9xb3NfbGltaXRfYncodm9pZCBfX2lvbWVtICpiYXNlLCB1aW50MzJfdCBxb3Nfb2ZmLAorCQl1aW50MzJfdCBtcG9ydCwgdWludDMyX3QgcW9zX2RlbHRhLCB1aW50MzJfdCBidykKK3sKKwl1aW50MzJfdCByZWdfdmFsLCB2YWw7CisJcmVnX3ZhbCA9IHJlYWRsX3JlbGF4ZWQoTk9DX1FPU19MSU1JVEJXbl9BRERSKGJhc2UsIHFvc19vZmYsIG1wb3J0LAorCQlxb3NfZGVsdGEpKTsKKwl2YWwgPSBidyA8PCBOT0NfUU9TX0xJTUlUQldfQlduX1NIRlQ7CisJd3JpdGVsX3JlbGF4ZWQoKChyZWdfdmFsICYgKH4oTk9DX1FPU19MSU1JVEJXX0JXbl9CTVNLKSkpIHwKKwkJKHZhbCAmIE5PQ19RT1NfTElNSVRCV19CV25fQk1TSykpLAorCQlOT0NfUU9TX0xJTUlUQlduX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSkpOworCisJLyogRW5zdXJlIHdlIHNldCBsaW1pdGVyIGJ3IGJlZm9yZSBleGl0aW5nKi8KKwl3bWIoKTsKK30KKworc3RhdGljIHZvaWQgbm9jX3NldF9xb3NfbGltaXRfc2F0KHZvaWQgX19pb21lbSAqYmFzZSwgdWludDMyX3QgcW9zX29mZiwKKwkJdWludDMyX3QgbXBvcnQsIHVpbnQzMl90IHFvc19kZWx0YSwgdWludDMyX3Qgc2F0KQoreworCXVpbnQzMl90IHJlZ192YWwsIHZhbDsKKwlyZWdfdmFsID0gcmVhZGxfcmVsYXhlZChOT0NfUU9TX0xJTUlUQlduX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsCisJCXFvc19kZWx0YSkpOworCXZhbCA9IHNhdCA8PCBOT0NfUU9TX0xJTUlUQldfU0FUbl9TSEZUOworCXdyaXRlbF9yZWxheGVkKCgocmVnX3ZhbCAmICh+KE5PQ19RT1NfTElNSVRCV19TQVRuX0JNU0spKSkgfAorCQkodmFsICYgTk9DX1FPU19MSU1JVEJXX1NBVG5fQk1TSykpLAorCQlOT0NfUU9TX0xJTUlUQlduX0FERFIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSkpOworCisJLyogRW5zdXJlIHdlIHNldCBsaW1pdGVyIHNhdCBiZWZvcmUgZXhpdGluZyovCisJd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkIG5vY19zZXRfcW9zX2xpbWl0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1aW50MzJfdCBxb3Nfb2ZmLAorCQl1aW50MzJfdCBtcG9ydCwgdWludDMyX3QgcW9zX2RlbHRhLAorCQlzdHJ1Y3QgbXNtX2J1c19ub2NfbGltaXRlciAqbGltLCB1aW50MzJfdCBsaW1fZW4pCit7CisJbm9jX2VuYWJsZV9xb3NfbGltaXRlcihiYXNlLCBxb3Nfb2ZmLCBtcG9ydCwgcW9zX2RlbHRhLCAwKTsKKwlub2Nfc2V0X3Fvc19saW1pdF9idyhiYXNlLCBxb3Nfb2ZmLCBtcG9ydCwgcW9zX2RlbHRhLCBsaW0tPmJ3KTsKKwlub2Nfc2V0X3Fvc19saW1pdF9zYXQoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSwgbGltLT5zYXQpOworCW5vY19lbmFibGVfcW9zX2xpbWl0ZXIoYmFzZSwgcW9zX29mZiwgbXBvcnQsIHFvc19kZWx0YSwgbGltX2VuKTsKK30KKwogc3RhdGljIHZvaWQgbm9jX3NldF9xb3NfcmVndWxhdG9yKHZvaWQgX19pb21lbSAqYmFzZSwgdWludDMyX3QgcW9zX29mZiwKIAkJdWludDMyX3QgbXBvcnQsIHVpbnQzMl90IHFvc19kZWx0YSwKIAkJc3RydWN0IG1zbV9idXNfbm9jX3JlZ3VsYXRvciAqcmVnLApAQCAtMzE3LDYgKzMzNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbXNtX2J1c19ub2NfcW9zX2luaXQoc3RydWN0IG1zbV9idXNfbm9kZV9kZXZpY2VfdHlwZSAqaW5mbywKKwkJCQlzdHJ1Y3QgbXNtX2J1c19ub2RlX2RldmljZV90eXBlICpmYWJkZXYsCiAJCQkJdm9pZCBfX2lvbWVtICpxb3NfYmFzZSwKIAkJCQl1aW50MzJfdCBxb3Nfb2ZmLCB1aW50MzJfdCBxb3NfZGVsdGEsCiAJCQkJdWludDMyX3QgcW9zX2ZyZXEpCkBAIC0zMjQsNiArMzQ1LDcgQEAKIAlzdHJ1Y3QgbXNtX2J1c19ub2NfcW9zX3BhcmFtcyAqcW9zX3BhcmFtczsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcW9zX3BhcmFtcyA9ICZpbmZvLT5ub2RlX2luZm8tPnFvc19wYXJhbXM7CiAKQEAgLTMzMyw2ICszNTUsMTEgQEAKIAkJZ290byBlcnJfcW9zX2luaXQ7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5vY19sb2NrLCBmbGFncyk7CisKKwlpZiAoZmFiZGV2LT5ub2RlX2luZm8tPmlkID09IE1TTV9CVVNfRkFCX01FTV9OT0MpCisJCW1lbW5vY19xb3NfYmFzZSA9IHFvc19iYXNlOworCiAJZm9yIChpID0gMDsgaSA8IGluZm8tPm5vZGVfaW5mby0+bnVtX3Fwb3J0czsgaSsrKSB7CiAJCW5vY19zZXRfcW9zX2RmbHRfcHJpbyhxb3NfYmFzZSwgcW9zX29mZiwKIAkJCQkJaW5mby0+bm9kZV9pbmZvLT5xcG9ydFtpXSwKQEAgLTM1NiwxMCArMzgzLDg3IEBACiAJCQkJCXFvc19kZWx0YSwKIAkJCQkJcW9zX3BhcmFtcy0+dXJnX2Z3ZF9lbik7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5vY19sb2NrLCBmbGFncyk7CisKIGVycl9xb3NfaW5pdDoKIAlyZXR1cm4gcmV0OwogfQogCitpbnQgbXNtX2J1c19ub2NfdGhyb3R0bGVfd2EoYm9vbCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZub2NfbG9jaywgZmxhZ3MpOworCisJaWYgKCFtZW1ub2NfcW9zX2Jhc2UpIHsKKwkJTVNNX0JVU19FUlIoIk1lbW5vYyBRb1MgQmFzZSBhZGRyZXNzIG5vdCBmb3VuZCEiKTsKKwkJZ290byBub2NfdGhyb3R0bGVfZXhpdDsKKwl9CisKKwlpZiAoZW5hYmxlKSB7CisJCW5vY19zZXRfcW9zX2xpbWl0X2J3KG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMiwKKwkJCQkJCQkJMHgxMDAwLCAweDFCKTsKKwkJbm9jX3NldF9xb3NfbGltaXRfYncobWVtbm9jX3Fvc19iYXNlLCAweDEwMDAwLCAzLAorCQkJCQkJCQkweDEwMDAsIDB4MUIpOworCQlub2Nfc2V0X3Fvc19saW1pdF9idyhtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDEwLAorCQkJCQkJCQkweDEwMDAsIDB4MzApOworCQlub2Nfc2V0X3Fvc19saW1pdF9idyhtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDExLAorCQkJCQkJCQkweDEwMDAsIDB4MzApOworCQlub2NfZW5hYmxlX3Fvc19saW1pdGVyKG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMTAsCisJCQkJCQkJCTB4MTAwMCwgMSk7CisJCW5vY19lbmFibGVfcW9zX2xpbWl0ZXIobWVtbm9jX3Fvc19iYXNlLCAweDEwMDAwLCAxMSwKKwkJCQkJCQkJMHgxMDAwLCAxKTsKKwkJbm9jX2VuYWJsZV9xb3NfbGltaXRlcihtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDIsCisJCQkJCQkJCTB4MTAwMCwgMSk7CisJCW5vY19lbmFibGVfcW9zX2xpbWl0ZXIobWVtbm9jX3Fvc19iYXNlLCAweDEwMDAwLCAzLAorCQkJCQkJCQkweDEwMDAsIDEpOworCX0gZWxzZSB7CisJCW5vY19lbmFibGVfcW9zX2xpbWl0ZXIobWVtbm9jX3Fvc19iYXNlLCAweDEwMDAwLCAyLAorCQkJCQkJCQkweDEwMDAsIDApOworCQlub2NfZW5hYmxlX3Fvc19saW1pdGVyKG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMywKKwkJCQkJCQkJMHgxMDAwLCAwKTsKKwkJbm9jX2VuYWJsZV9xb3NfbGltaXRlcihtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDEwLAorCQkJCQkJCQkweDEwMDAsIDApOworCQlub2NfZW5hYmxlX3Fvc19saW1pdGVyKG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMTEsCisJCQkJCQkJCTB4MTAwMCwgMCk7CisJCW5vY19zZXRfcW9zX2xpbWl0X2J3KG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMiwKKwkJCQkJCQkJMHgxMDAwLCAwKTsKKwkJbm9jX3NldF9xb3NfbGltaXRfYncobWVtbm9jX3Fvc19iYXNlLCAweDEwMDAwLCAzLAorCQkJCQkJCQkweDEwMDAsIDApOworCQlub2Nfc2V0X3Fvc19saW1pdF9idyhtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDEwLAorCQkJCQkJCQkweDEwMDAsIDApOworCQlub2Nfc2V0X3Fvc19saW1pdF9idyhtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDExLAorCQkJCQkJCQkweDEwMDAsIDApOworCX0KKworbm9jX3Rocm90dGxlX2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm9jX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2J1c19ub2NfdGhyb3R0bGVfd2EpOworCitpbnQgbXNtX2J1c19ub2NfcHJpb3JpdHlfd2EoYm9vbCBlbmFibGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZub2NfbG9jaywgZmxhZ3MpOworCWlmICghbWVtbm9jX3Fvc19iYXNlKSB7CisJCU1TTV9CVVNfRVJSKCJNZW1ub2MgUW9TIEJhc2UgYWRkcmVzcyBub3QgZm91bmQhIik7CisJCWdvdG8gbm9jX3ByaW9yaXR5X2V4aXQ7CisJfQorCisJaWYgKGVuYWJsZSkKKwkJbm9jX3NldF9xb3NfZGZsdF9wcmlvKG1lbW5vY19xb3NfYmFzZSwgMHgxMDAwMCwgMCwKKwkJCQkJCQkJMHgxMDAwLCA3KTsKKwllbHNlCisJCW5vY19zZXRfcW9zX2RmbHRfcHJpbyhtZW1ub2NfcW9zX2Jhc2UsIDB4MTAwMDAsIDAsCisJCQkJCQkJCTB4MTAwMCwgNik7Citub2NfcHJpb3JpdHlfZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZub2NfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtc21fYnVzX25vY19wcmlvcml0eV93YSk7CisKIGludCBtc21fYnVzX25vY19zZXRfb3BzKHN0cnVjdCBtc21fYnVzX25vZGVfZGV2aWNlX3R5cGUgKmJ1c19kZXYpCiB7CiAJaWYgKCFidXNfZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfb2ZfcnBtaC5jIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfb2ZfcnBtaC5jCmluZGV4IDc3Y2JiZjEuLjMyYjZhZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX29mX3JwbWguYworKysgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9idXMvbXNtX2J1c19vZl9ycG1oLmMKQEAgLTI0MSw2ICsyNDEsOCBAQAogCW5vZGVfaW5mby0+cW9zX3BhcmFtcy51cmdfZndkX2VuID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldl9ub2RlLAogCQkJCQkJInFjb20sZm9yd2FyZGluZyIpOwogCisJbm9kZV9pbmZvLT5xb3NfcGFyYW1zLmRlZmVyX2luaXRfcW9zID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldl9ub2RlLAorCQkJCQkJInFjb20sZGVmZXItaW5pdC1xb3MiKTsKIH0KIAogc3RhdGljIGludCBtc21fYnVzX29mX3BhcnNlX2Nsa19hcnJheShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9ub2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfcnBtaC5oIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfcnBtaC5oCmluZGV4IGFkMDRmZWYuLjg5Mjk5NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX3JwbWguaAorKysgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9idXMvbXNtX2J1c19ycG1oLmgKQEAgLTQyLDYgKzQyLDcgQEAKIC8qIE5ldyB0eXBlcyBpbnRyb2R1Y2VkIGZvciBhZGhvYyB0b3BvbG9neSAqLwogc3RydWN0IG1zbV9idXNfbm9jX29wcyB7CiAJaW50ICgqcW9zX2luaXQpKHN0cnVjdCBtc21fYnVzX25vZGVfZGV2aWNlX3R5cGUgKmRldiwKKwkJCXN0cnVjdCBtc21fYnVzX25vZGVfZGV2aWNlX3R5cGUgKmZhYmRldiwKIAkJCXZvaWQgX19pb21lbSAqcW9zX2Jhc2UsIHVpbnQzMl90IHFvc19vZmYsCiAJCQl1aW50MzJfdCBxb3NfZGVsdGEsIHVpbnQzMl90IHFvc19mcmVxKTsKIAlpbnQgKCpzZXRfYncpKHN0cnVjdCBtc21fYnVzX25vZGVfZGV2aWNlX3R5cGUgKmRldiwKQEAgLTEzNiw2ICsxMzcsNyBAQAogCXN0cnVjdCBtc21fYnVzX25vY19yZWd1bGF0b3IgcmVnOwogCXN0cnVjdCBtc21fYnVzX25vY19yZWd1bGF0b3JfbW9kZSByZWdfbW9kZTsKIAlib29sIHVyZ19md2RfZW47CisJYm9vbCBkZWZlcl9pbml0X3FvczsKIH07CiAKIHN0cnVjdCBub2RlX3V0aWxfbGV2ZWxzX3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfcnVsZXMuYyBiL2RyaXZlcnMvc29jL3Fjb20vbXNtX2J1cy9tc21fYnVzX3J1bGVzLmMKaW5kZXggMDMwNDJmYS4uNGNmZjlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9tc21fYnVzL21zbV9idXNfcnVsZXMuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9idXMvbXNtX2J1c19ydWxlcy5jCkBAIC00MTAsOCArNDEwLDEwIEBACiB7CiAJc3RydWN0IHJ1bGVfbm9kZV9pbmZvICpub2RlX2l0ID0gTlVMTDsKIAorCW11dGV4X2xvY2soJm1zbV9idXNfcnVsZXNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlX2l0LCAmbm9kZV9saXN0LCBsaW5rKQogCQlwcmludF9ydWxlcyhub2RlX2l0KTsKKwltdXRleF91bmxvY2soJm1zbV9idXNfcnVsZXNfbG9jayk7CiB9CiAKIHZvaWQgcHJpbnRfcnVsZXNfYnVmKGNoYXIgKmJ1ZiwgaW50IG1heF9idWYpCkBAIC00MjEsNiArNDIzLDcgQEAKIAlpbnQgaTsKIAlpbnQgY250ID0gMDsKIAorCW11dGV4X2xvY2soJm1zbV9idXNfcnVsZXNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlX2l0LCAmbm9kZV9saXN0LCBsaW5rKSB7CiAJCWNudCArPSBzY25wcmludGYoYnVmICsgY250LCBtYXhfYnVmIC0gY250LAogCQkJIlxuIE5vdyBwcmludGluZyBydWxlcyBmb3IgTm9kZSAlZCBjdXJfcnVsZSAlZFxuIiwKQEAgLTQ1Miw2ICs0NTUsNyBAQAogCQkJCQlub2RlX3J1bGUtPnJ1bGVfb3BzLm1vZGUpOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmbXNtX2J1c19ydWxlc19sb2NrKTsKIH0KIAogc3RhdGljIGludCBjb3B5X3J1bGUoc3RydWN0IGJ1c19ydWxlX3R5cGUgKnNyYywgc3RydWN0IHJ1bGVzX2RlZiAqbm9kZV9ydWxlLApAQCAtNzE2LDExICs3MjAsMTIgQEAKIHsKIAlib29sIHJldCA9IGZhbHNlOwogCisJbXV0ZXhfbG9jaygmbXNtX2J1c19ydWxlc19sb2NrKTsKIAlpZiAobGlzdF9lbXB0eSgmbm9kZV9saXN0KSkKIAkJcmV0ID0gZmFsc2U7CiAJZWxzZQogCQlyZXQgPSB0cnVlOwotCisJbXV0ZXhfdW5sb2NrKCZtc21fYnVzX3J1bGVzX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2dsaW5rX3BrdC5jIGIvZHJpdmVycy9zb2MvcWNvbS9tc21fZ2xpbmtfcGt0LmMKaW5kZXggNTE5YmI2MTEuLjI1MDk5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vbXNtX2dsaW5rX3BrdC5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vbXNtX2dsaW5rX3BrdC5jCkBAIC0zMyw3ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgogCiAjaW5jbHVkZSA8c29jL3Fjb20vZ2xpbmsuaD4KLQorLyogVGhpcyBMaW1pdCBlbnN1cmVzIHRoYXQgYXV0byBxdWV1ZSB3aWxsIG5vdCBleGhhdXN0IG1lbW9yeSBvbiByZW1vdGUgc2lkZSAqLworI2RlZmluZSBNQVhfUEVORElOR19HTElOS19QS1QgNQogI2RlZmluZSBNT0RVTEVfTkFNRSAibXNtX2dsaW5rcGt0IgogI2RlZmluZSBERVZJQ0VfTkFNRSAiZ2xpbmtwa3QiCiAjZGVmaW5lIFdBS0VVUFNPVVJDRV9USU1FT1VUICgyMDAwKSAvKiB0d28gc2Vjb25kcyAqLwpAQCAtMTM2LDYgKzEzNyw3IEBACiAJc3RydWN0IGdsaW5rX2xpbmtfaW5mbyBsaW5rX2luZm87CiAJdm9pZCAqbGlua19zdGF0ZV9oYW5kbGU7CiAJYm9vbCBsaW5rX3VwOworCWJvb2wgYXV0b19pbnRlbnRfZW5hYmxlZDsKIH07CiAKIC8qKgpAQCAtNDQ1LDkgKzQ0NywyNiBAQAogYm9vbCBnbGlua19wa3Rfcm10X3J4X2ludGVudF9yZXFfY2Iodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3Qgc3opCiB7CiAJc3RydWN0IHF1ZXVlX3J4X2ludGVudF93b3JrICp3b3JrX2l0ZW07CisJaW50IHBlbmRpbmdfcGt0X2NvdW50ID0gMDsKKwlzdHJ1Y3QgZ2xpbmtfcnhfcGt0ICpwa3QgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGdsaW5rX3BrdF9kZXYgKmRldnAgPSAoc3RydWN0IGdsaW5rX3BrdF9kZXYgKilwcml2OwogCiAJR0xJTktfUEtUX0lORk8oIiVzKCk6IFFVRVVFIFJYIElOVEVOVCB0byByZWNlaXZlIHNpemVbJXp1XVxuIiwKIAkJICAgX19mdW5jX18sIHN6KTsKKwlpZiAoZGV2cC0+YXV0b19pbnRlbnRfZW5hYmxlZCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2cC0+cGt0X2xpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdCwgJmRldnAtPnBrdF9saXN0LCBsaXN0KQorCQkJcGVuZGluZ19wa3RfY291bnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cC0+cGt0X2xpc3RfbG9jaywgZmxhZ3MpOworCQlpZiAocGVuZGluZ19wa3RfY291bnQgPiBNQVhfUEVORElOR19HTElOS19QS1QpIHsKKwkJCUdMSU5LX1BLVF9FUlIoIiVzIGZhaWxlZCwgbWF4IGxpbWl0IHJlYWNoZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAl3b3JrX2l0ZW0gPSBremFsbG9jKHNpemVvZigqd29ya19pdGVtKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF3b3JrX2l0ZW0pIHsKQEAgLTQ1Niw3ICs0NzUsNyBAQAogCX0KIAogCXdvcmtfaXRlbS0+aW50ZW50X3NpemUgPSBzejsKLQl3b3JrX2l0ZW0tPmRldnAgPSAoc3RydWN0IGdsaW5rX3BrdF9kZXYgKilwcml2OworCXdvcmtfaXRlbS0+ZGV2cCA9IGRldnA7CiAJSU5JVF9XT1JLKCZ3b3JrX2l0ZW0tPndvcmssIGdsaW5rX3BrdF9xdWV1ZV9yeF9pbnRlbnRfd29ya2VyKTsKIAlxdWV1ZV93b3JrKGdsaW5rX3BrdF93cSwgJndvcmtfaXRlbS0+d29yayk7CiAKQEAgLTYyNiwxMCArNjQ1LDExIEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2cC0+Y2hfbG9jayk7Ci0JaWYgKCFnbGlua19yeF9pbnRlbnRfZXhpc3RzKGRldnAtPmhhbmRsZSwgY291bnQpKSB7CisJaWYgKCFnbGlua19wa3RfcmVhZF9hdmFpbChkZXZwKSAmJgorCQkJCSFnbGlua19yeF9pbnRlbnRfZXhpc3RzKGRldnAtPmhhbmRsZSwgY291bnQpKSB7CiAJCXJldCAgPSBnbGlua19xdWV1ZV9yeF9pbnRlbnQoZGV2cC0+aGFuZGxlLCBkZXZwLCBjb3VudCk7CiAJCWlmIChyZXQpIHsKLQkJCUdMSU5LX1BLVF9FUlIoIiVzOiBmYWlsZWQgdG8gcXVldWVfcnhfaW50ZW50IHJldFslZF1cbiIsCisJCQlHTElOS19QS1RfRVJSKCIlczogZmFpbGVkIHRvIHF1ZXVlIGludGVudCByZXRbJWRdXG4iLAogCQkJCQlfX2Z1bmNfXywgcmV0KTsKIAkJCW11dGV4X3VubG9jaygmZGV2cC0+Y2hfbG9jayk7CiAJCQlyZXR1cm4gcmV0OwpAQCAtOTE0LDYgKzkzNCw3IEBACiAJY2FzZSBHTElOS19QS1RfSU9DVExfUVVFVUVfUlhfSU5URU5UOgogCQlyZXQgPSBnZXRfdXNlcihzaXplLCAodWludDMyX3QgKilhcmcpOwogCQlHTElOS19QS1RfSU5GTygiJXM6IGludGVudCBzaXplWyVkXVxuIiwgX19mdW5jX18sIHNpemUpOworCQlkZXZwLT5hdXRvX2ludGVudF9lbmFibGVkID0gZmFsc2U7CiAJCXJldCAgPSBnbGlua19xdWV1ZV9yeF9pbnRlbnQoZGV2cC0+aGFuZGxlLCBkZXZwLCBzaXplKTsKIAkJaWYgKHJldCkgewogCQkJR0xJTktfUEtUX0VSUigiJXM6IGZhaWxlZCB0byBRVUVVRV9SWF9JTlRFTlQgcmV0WyVkXVxuIiwKQEAgLTExODIsNiArMTIwMyw3IEBACiAJCQkJZ2xpbmtfcGt0X2xpbmtfc3RhdGVfY2I7CiAJZGV2cC0+aSA9IGk7CiAJZGV2cC0+cG9sbF9tb2RlID0gMDsKKwlkZXZwLT5hdXRvX2ludGVudF9lbmFibGVkID0gdHJ1ZTsKIAlkZXZwLT53c19sb2NrZWQgPSAwOwogCWRldnAtPmNoX3N0YXRlID0gR0xJTktfTE9DQUxfRElTQ09OTkVDVEVEOwogCS8qIERlZmF1bHQgdGltZW91dCBmb3Igb3BlbiB3YWl0IGlzIDEyMHNlYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9tc21fcGVyZm9ybWFuY2UuYyBiL2RyaXZlcnMvc29jL3Fjb20vbXNtX3BlcmZvcm1hbmNlLmMKaW5kZXggOTc5YzYyOC4uYjVjZTc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9tc21fcGVyZm9ybWFuY2UuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL21zbV9wZXJmb3JtYW5jZS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c29jL3Fjb20vbXNtLWNvcmUuaD4KIAogc3RhdGljIHN0cnVjdCBtdXRleCBtYW5hZ2VkX2NwdXNfbG9jazsKIApAQCAtMzMsMTAgKzMyLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzOwogc3RydWN0IGNsdXN0ZXIgewogCWNwdW1hc2tfdmFyX3QgY3B1czsKLQkvKiBOdW1iZXIgb2YgQ1BVcyB0byBtYWludGFpbiBvbmxpbmUgKi8KLQlpbnQgbWF4X2NwdV9yZXF1ZXN0OwotCS8qIFRvIHRyYWNrIENQVXMgdGhhdCB0aGUgbW9kdWxlIGRlY2lkZXMgdG8gb2ZmbGluZSAqLwotCWNwdW1hc2tfdmFyX3Qgb2ZmbGluZWRfY3B1czsKIAkvKiBzdGF0cyBmb3IgbG9hZCBkZXRlY3Rpb24gKi8KIAkvKiBJTyAqLwogCXU2NCBsYXN0X2lvX2NoZWNrX3RzOwpAQCAtODQsOCArNzksNiBAQAogc3RhdGljIHN0cnVjdCBjbHVzdGVyICoqbWFuYWdlZF9jbHVzdGVyczsKIHN0YXRpYyBib29sIGNsdXN0ZXJzX2luaXRlZDsKIAotLyogV29yayB0byBldmFsdWF0ZSB0aGUgb25saW5pbmcvb2ZmbGluaW5nIENQVXMgKi8KLXN0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIGV2YWx1YXRlX2hvdHBsdWdfd29yazsKIAogLyogVG8gaGFuZGxlIGNwdWZyZXEgbWluL21heCByZXF1ZXN0ICovCiBzdHJ1Y3QgY3B1X3N0YXR1cyB7CkBAIC05NCwxMSArODcsOCBAQAogfTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3N0YXR1cywgY3B1X3N0YXRzKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBudW1fb25saW5lX21hbmFnZWQoc3RydWN0IGNwdW1hc2sgKm1hc2spOwogc3RhdGljIGludCBpbml0X2NsdXN0ZXJfY29udHJvbCh2b2lkKTsKLXN0YXRpYyBpbnQgcm1faGlnaF9wd3JfY29zdF9jcHVzKHN0cnVjdCBjbHVzdGVyICpjbCk7CiBzdGF0aWMgaW50IGluaXRfZXZlbnRzX2dyb3VwKHZvaWQpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgY3B1X3Bvd2VyX2Nvc3QpOwogc3RydWN0IGV2ZW50cyB7CiAJc3BpbmxvY2tfdCBjcHVfaG90cGx1Z19sb2NrOwogCWJvb2wgY3B1X2hvdHBsdWc7CkBAIC0yMTQsNjUgKzIwNCw2IEBACiB9OwogZGV2aWNlX3BhcmFtX2NiKG51bV9jbHVzdGVycywgJnBhcmFtX29wc19udW1fY2x1c3RlcnMsIE5VTEwsIDA2NDQpOwogCi1zdGF0aWMgaW50IHNldF9tYXhfY3B1cyhjb25zdCBjaGFyICpidWYsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCXVuc2lnbmVkIGludCBpLCBudG9rZW5zID0gMDsKLQljb25zdCBjaGFyICpjcCA9IGJ1ZjsKLQlpbnQgdmFsOwotCi0JaWYgKCFjbHVzdGVyc19pbml0ZWQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2hpbGUgKChjcCA9IHN0cnBicmsoY3AgKyAxLCAiOiIpKSkKLQkJbnRva2VucysrOwotCi0JaWYgKG50b2tlbnMgIT0gKG51bV9jbHVzdGVycyAtIDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNwID0gYnVmOwotCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnM7IGkrKykgewotCi0JCWlmIChzc2NhbmYoY3AsICIlZFxuIiwgJnZhbCkgIT0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAodmFsID4gKGludCljcHVtYXNrX3dlaWdodChtYW5hZ2VkX2NsdXN0ZXJzW2ldLT5jcHVzKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW1hbmFnZWRfY2x1c3RlcnNbaV0tPm1heF9jcHVfcmVxdWVzdCA9IHZhbDsKLQotCQljcCA9IHN0cm5jaHIoY3AsIHN0cmxlbihjcCksICc6Jyk7Ci0JCWNwKys7Ci0JCXRyYWNlX3NldF9tYXhfY3B1cyhjcHVtYXNrX2JpdHMobWFuYWdlZF9jbHVzdGVyc1tpXS0+Y3B1cylbMF0sCi0JCQkJCQkJCXZhbCk7Ci0JfQotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZldmFsdWF0ZV9ob3RwbHVnX3dvcmssIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X21heF9jcHVzKGNoYXIgKmJ1ZiwgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JaW50IGksIGNudCA9IDA7Ci0KLQlpZiAoIWNsdXN0ZXJzX2luaXRlZCkKLQkJcmV0dXJuIGNudDsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnM7IGkrKykKLQkJY250ICs9IHNucHJpbnRmKGJ1ZiArIGNudCwgUEFHRV9TSVpFIC0gY250LAotCQkJCSIlZDoiLCBtYW5hZ2VkX2NsdXN0ZXJzW2ldLT5tYXhfY3B1X3JlcXVlc3QpOwotCWNudC0tOwotCWNudCArPSBzbnByaW50ZihidWYgKyBjbnQsIFBBR0VfU0laRSAtIGNudCwgIiAiKTsKLQlyZXR1cm4gY250OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX21heF9jcHVzID0gewotCS5zZXQgPSBzZXRfbWF4X2NwdXMsCi0JLmdldCA9IGdldF9tYXhfY3B1cywKLX07Ci0KLSNpZmRlZiBDT05GSUdfTVNNX1BFUkZPUk1BTkNFX0hPVFBMVUdfT04KLWRldmljZV9wYXJhbV9jYihtYXhfY3B1cywgJnBhcmFtX29wc19tYXhfY3B1cywgTlVMTCwgMDY0NCk7Ci0jZW5kaWYKIAogc3RhdGljIGludCBzZXRfbWFuYWdlZF9jcHVzKGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CkBAIC0yOTEsNyArMjIyLDYgQEAKIAkJaWYgKGNwdW1hc2tfZW1wdHkobWFuYWdlZF9jbHVzdGVyc1tpXS0+Y3B1cykpIHsKIAkJCW11dGV4X2xvY2soJm1hbmFnZWRfY3B1c19sb2NrKTsKIAkJCWNwdW1hc2tfY29weShtYW5hZ2VkX2NsdXN0ZXJzW2ldLT5jcHVzLCAmdG1wX21hc2spOwotCQkJY3B1bWFza19jbGVhcihtYW5hZ2VkX2NsdXN0ZXJzW2ldLT5vZmZsaW5lZF9jcHVzKTsKIAkJCW11dGV4X3VubG9jaygmbWFuYWdlZF9jcHVzX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KQEAgLTMzNyw1MyArMjY3LDYgQEAKIH07CiBkZXZpY2VfcGFyYW1fY2IobWFuYWdlZF9jcHVzLCAmcGFyYW1fb3BzX21hbmFnZWRfY3B1cywgTlVMTCwgMDY0NCk7CiAKLS8qIFJlYWQtb25seSBub2RlOiBUbyBkaXNwbGF5IGFsbCB0aGUgb25saW5lIG1hbmFnZWQgQ1BVcyAqLwotc3RhdGljIGludCBnZXRfbWFuYWdlZF9vbmxpbmVfY3B1cyhjaGFyICpidWYsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCWludCBpLCBjbnQgPSAwLCB0b3RhbF9jbnQgPSAwOwotCWNoYXIgdG1wW01BWF9MRU5HVEhfQ1BVX1NUUklOR10gPSAiIjsKLQlzdHJ1Y3QgY3B1bWFzayB0bXBfbWFzazsKLQlzdHJ1Y3QgY2x1c3RlciAqaV9jbDsKLQotCWlmICghY2x1c3RlcnNfaW5pdGVkKQotCQlyZXR1cm4gY250OwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9jbHVzdGVyczsgaSsrKSB7Ci0JCWlfY2wgPSBtYW5hZ2VkX2NsdXN0ZXJzW2ldOwotCi0JCWNwdW1hc2tfY2xlYXIoJnRtcF9tYXNrKTsKLQkJY3B1bWFza19jb21wbGVtZW50KCZ0bXBfbWFzaywgaV9jbC0+b2ZmbGluZWRfY3B1cyk7Ci0JCWNwdW1hc2tfYW5kKCZ0bXBfbWFzaywgaV9jbC0+Y3B1cywgJnRtcF9tYXNrKTsKLQotCQljbnQgPSBjcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZ0bXBfbWFzayk7Ci0JCWlmICgoaSArIDEpIDwgbnVtX2NsdXN0ZXJzICYmCi0JCSAgICAodG90YWxfY250ICsgY250ICsgMSkgPD0gTUFYX0xFTkdUSF9DUFVfU1RSSU5HKSB7Ci0JCQlzbnByaW50Zih0bXAgKyB0b3RhbF9jbnQsIGNudCwgIiVzIiwgYnVmKTsKLQkJCXRtcFtjbnQtMV0gPSAnOic7Ci0JCQl0bXBbY250XSA9ICdcMCc7Ci0JCQl0b3RhbF9jbnQgKz0gY250OwotCQl9IGVsc2UgaWYgKChpICsgMSkgPT0gbnVtX2NsdXN0ZXJzICYmCi0JCQkgICAodG90YWxfY250ICsgY250KSA8PSBNQVhfTEVOR1RIX0NQVV9TVFJJTkcpIHsKLQkJCXNucHJpbnRmKHRtcCArIHRvdGFsX2NudCwgY250LCAiJXMiLCBidWYpOwotCQkJdG90YWxfY250ICs9IGNudDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiaW52YWxpZCBzdHJpbmcgZm9yIG1hbmFnZWRfY3B1OiVzJXNcbiIsIHRtcCwKLQkJCQlidWYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0Jc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyIsIHRtcCk7Ci0JcmV0dXJuIHRvdGFsX2NudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW1fb3BzIHBhcmFtX29wc19tYW5hZ2VkX29ubGluZV9jcHVzID0gewotCS5nZXQgPSBnZXRfbWFuYWdlZF9vbmxpbmVfY3B1cywKLX07Ci0KLSNpZmRlZiBDT05GSUdfTVNNX1BFUkZPUk1BTkNFX0hPVFBMVUdfT04KLWRldmljZV9wYXJhbV9jYihtYW5hZ2VkX29ubGluZV9jcHVzLCAmcGFyYW1fb3BzX21hbmFnZWRfb25saW5lX2NwdXMsCi0JCQkJCQkJTlVMTCwgMDQ0NCk7Ci0jZW5kaWYKIC8qCiAgKiBVc2Vyc3BhY2Ugc2VuZHMgY3B1IzptaW5fZnJlcV92YWx1ZSB0byB2b3RlIGZvciBtaW5fZnJlcV92YWx1ZSBhcyB0aGUgbmV3CiAgKiBzY2FsaW5nX21pbi4gVG8gd2l0aGRyYXcgaXRzIHZvdGUgaXQgbmVlZHMgdG8gZW50ZXIgY3B1IzowCkBAIC0yMjc0LDE1ICsyMTU3LDYgQEAKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKnN5c2ZzIGVuZHMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX29ubGluZV9tYW5hZ2VkKHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBjcHVtYXNrIHRtcF9tYXNrOwotCi0JY3B1bWFza19jbGVhcigmdG1wX21hc2spOwotCWNwdW1hc2tfYW5kKCZ0bXBfbWFzaywgbWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQotCXJldHVybiBjcHVtYXNrX3dlaWdodCgmdG1wX21hc2spOwotfQogCiBzdGF0aWMgaW50IHBlcmZfYWRqdXN0X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKIAkJCQkJCQl2b2lkICpkYXRhKQpAQCAtMjM1OSwxODUgKzIyMzMsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLS8qCi0gKiBBdHRlbXB0IHRvIG9mZmxpbmUgQ1BVcyBiYXNlZCBvbiB0aGVpciBwb3dlciBjb3N0LgotICogQ1BVcyB3aXRoIGhpZ2hlciBwb3dlciBjb3N0cyBhcmUgb2ZmbGluZWQgZmlyc3QuCi0gKi8KLXN0YXRpYyBpbnQgX19yZWYgcm1faGlnaF9wd3JfY29zdF9jcHVzKHN0cnVjdCBjbHVzdGVyICpjbCkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1LCBpOwotCXN0cnVjdCBjcHVfcHdyX3N0YXRzICpwZXJfY3B1X2luZm8gPSBnZXRfY3B1X3B3cl9zdGF0cygpOwotCXN0cnVjdCBjcHVfcHN0YXRlX3B3ciAqY29zdHM7Ci0JdW5zaWduZWQgaW50ICpwY3B1X3B3cjsKLQl1bnNpZ25lZCBpbnQgbWF4X2Nvc3RfY3B1LCBtYXhfY29zdDsKLQlpbnQgYW55X2NwdSA9IC0xOwotCi0JaWYgKCFwZXJfY3B1X2luZm8pCi0JCXJldHVybiAtRUFHQUlOOwotCi0JZm9yX2VhY2hfY3B1KGNwdSwgY2wtPmNwdXMpIHsKLQkJY29zdHMgPSBwZXJfY3B1X2luZm9bY3B1XS5wdGFibGU7Ci0JCWlmICghY29zdHMgfHwgIWNvc3RzWzBdLmZyZXEpCi0JCQljb250aW51ZTsKLQotCQlpID0gMTsKLQkJd2hpbGUgKGNvc3RzW2ldLmZyZXEpCi0JCQlpKys7Ci0KLQkJcGNwdV9wd3IgPSAmcGVyX2NwdShjcHVfcG93ZXJfY29zdCwgY3B1KTsKLQkJKnBjcHVfcHdyID0gY29zdHNbaSAtIDFdLnBvd2VyOwotCQlhbnlfY3B1ID0gKGludCljcHU7Ci0JCXByX2RlYnVnKCJtc21fcGVyZjogQ1BVOiVkIFBvd2VyOiV1XG4iLCBjcHUsICpwY3B1X3B3cik7Ci0JfQotCi0JaWYgKGFueV9jcHUgPCAwKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWZvciAoaSA9IDA7IGkgPCBjcHVtYXNrX3dlaWdodChjbC0+Y3B1cyk7IGkrKykgewotCQltYXhfY29zdCA9IDA7Ci0JCW1heF9jb3N0X2NwdSA9IGNwdW1hc2tfZmlyc3QoY2wtPmNwdXMpOwotCi0JCWZvcl9lYWNoX2NwdShjcHUsIGNsLT5jcHVzKSB7Ci0JCQlwY3B1X3B3ciA9ICZwZXJfY3B1KGNwdV9wb3dlcl9jb3N0LCBjcHUpOwotCQkJaWYgKG1heF9jb3N0IDwgKnBjcHVfcHdyKSB7Ci0JCQkJbWF4X2Nvc3QgPSAqcGNwdV9wd3I7Ci0JCQkJbWF4X2Nvc3RfY3B1ID0gY3B1OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjcHVfb25saW5lKG1heF9jb3N0X2NwdSkpCi0JCQlnb3RvIGVuZDsKLQotCQlwcl9kZWJ1ZygibXNtX3BlcmY6IE9mZmxpbmluZyBDUFUlZCBQb3dlcjolZFxuIiwgbWF4X2Nvc3RfY3B1LAotCQkJCQkJCQltYXhfY29zdCk7Ci0JCWNwdW1hc2tfc2V0X2NwdShtYXhfY29zdF9jcHUsIGNsLT5vZmZsaW5lZF9jcHVzKTsKLQkJbG9ja19kZXZpY2VfaG90cGx1ZygpOwotCQlpZiAoZGV2aWNlX29mZmxpbmUoZ2V0X2NwdV9kZXZpY2UobWF4X2Nvc3RfY3B1KSkpIHsKLQkJCWNwdW1hc2tfY2xlYXJfY3B1KG1heF9jb3N0X2NwdSwgY2wtPm9mZmxpbmVkX2NwdXMpOwotCQkJcHJfZGVidWcoIm1zbV9wZXJmOiBPZmZsaW5pbmcgQ1BVJWQgZmFpbGVkXG4iLAotCQkJCQkJCQltYXhfY29zdF9jcHUpOwotCQl9Ci0JCXVubG9ja19kZXZpY2VfaG90cGx1ZygpOwotCi1lbmQ6Ci0JCXBjcHVfcHdyID0gJnBlcl9jcHUoY3B1X3Bvd2VyX2Nvc3QsIG1heF9jb3N0X2NwdSk7Ci0JCSpwY3B1X3B3ciA9IDA7Ci0JCWlmIChudW1fb25saW5lX21hbmFnZWQoY2wtPmNwdXMpIDw9IGNsLT5tYXhfY3B1X3JlcXVlc3QpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAobnVtX29ubGluZV9tYW5hZ2VkKGNsLT5jcHVzKSA+IGNsLT5tYXhfY3B1X3JlcXVlc3QpCi0JCXJldHVybiAtRUFHQUlOOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB0cnlfaG90cGx1ZyB0cmllcyB0byBvbmxpbmUvb2ZmbGluZSBjb3JlcyBiYXNlZCBvbiB0aGUgY3VycmVudCByZXF1aXJlbWVudC4KLSAqIEl0IGxvb3BzIHRocm91Z2ggdGhlIGN1cnJlbnRseSBtYW5hZ2VkIENQVXMgYW5kIHRyaWVzIHRvIG9ubGluZS9vZmZsaW5lCi0gKiB0aGVtIHVudGlsIHRoZSBtYXhfY3B1X3JlcXVlc3QgY3JpdGVyaWEgaXMgbWV0LgotICovCi1zdGF0aWMgdm9pZCBfX3JlZiB0cnlfaG90cGx1ZyhzdHJ1Y3QgY2x1c3RlciAqZGF0YSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICghY2x1c3RlcnNfaW5pdGVkKQotCQlyZXR1cm47Ci0KLQlwcl9kZWJ1ZygibXNtX3BlcmY6IFRyeWluZyBob3RwbHVnLi4uJWQ6JWRcbiIsCi0JCQludW1fb25saW5lX21hbmFnZWQoZGF0YS0+Y3B1cyksCW51bV9vbmxpbmVfY3B1cygpKTsKLQotCW11dGV4X2xvY2soJm1hbmFnZWRfY3B1c19sb2NrKTsKLQlpZiAobnVtX29ubGluZV9tYW5hZ2VkKGRhdGEtPmNwdXMpID4gZGF0YS0+bWF4X2NwdV9yZXF1ZXN0KSB7Ci0JCWlmICghcm1faGlnaF9wd3JfY29zdF9jcHVzKGRhdGEpKSB7Ci0JCQltdXRleF91bmxvY2soJm1hbmFnZWRfY3B1c19sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHBvd2VyIGF3YXJlIG9mZmxpbmluZyBmYWlscyBkdWUgdG8gcG93ZXIgY29zdCBpbmZvCi0JCSAqIGJlaW5nIHVuYXZhaWFibGUgZmFsbCBiYWNrIHRvIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uCi0JCSAqLwotCQlmb3IgKGkgPSBudW1fcHJlc2VudF9jcHVzKCkgLSAxOyBpID49IDAgJiYKLQkJCQkJCWkgPCBudW1fcHJlc2VudF9jcHVzKCk7IGktLSkgewotCQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGksIGRhdGEtPmNwdXMpIHx8CSFjcHVfb25saW5lKGkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlwcl9kZWJ1ZygibXNtX3BlcmY6IE9mZmxpbmluZyBDUFUlZFxuIiwgaSk7Ci0JCQljcHVtYXNrX3NldF9jcHUoaSwgZGF0YS0+b2ZmbGluZWRfY3B1cyk7Ci0JCQlsb2NrX2RldmljZV9ob3RwbHVnKCk7Ci0JCQlpZiAoZGV2aWNlX29mZmxpbmUoZ2V0X2NwdV9kZXZpY2UoaSkpKSB7Ci0JCQkJY3B1bWFza19jbGVhcl9jcHUoaSwgZGF0YS0+b2ZmbGluZWRfY3B1cyk7Ci0JCQkJcHJfZGVidWcoIm1zbV9wZXJmOiBPZmZsaW5pbmcgQ1BVJWQgZmFpbGVkXG4iLAotCQkJCQkJCQkJaSk7Ci0JCQkJdW5sb2NrX2RldmljZV9ob3RwbHVnKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKLQkJCWlmIChudW1fb25saW5lX21hbmFnZWQoZGF0YS0+Y3B1cykgPD0KLQkJCQkJCQlkYXRhLT5tYXhfY3B1X3JlcXVlc3QpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3JfZWFjaF9jcHUoaSwgZGF0YS0+Y3B1cykgewotCQkJaWYgKGNwdV9vbmxpbmUoaSkpCi0JCQkJY29udGludWU7Ci0JCQlwcl9kZWJ1ZygibXNtX3BlcmY6IE9ubGluaW5nIENQVSVkXG4iLCBpKTsKLQkJCWxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKLQkJCWlmIChkZXZpY2Vfb25saW5lKGdldF9jcHVfZGV2aWNlKGkpKSkgewotCQkJCXByX2RlYnVnKCJtc21fcGVyZjogT25saW5pbmcgQ1BVJWQgZmFpbGVkXG4iLAotCQkJCQkJCQkJaSk7Ci0JCQkJdW5sb2NrX2RldmljZV9ob3RwbHVnKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKLQkJCWNwdW1hc2tfY2xlYXJfY3B1KGksIGRhdGEtPm9mZmxpbmVkX2NwdXMpOwotCQkJaWYgKG51bV9vbmxpbmVfbWFuYWdlZChkYXRhLT5jcHVzKSA+PQotCQkJCQkJCWRhdGEtPm1heF9jcHVfcmVxdWVzdCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJm1hbmFnZWRfY3B1c19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgX19yZWYgcmVsZWFzZV9jbHVzdGVyX2NvbnRyb2woc3RydWN0IGNwdW1hc2sgKm9mZl9jcHVzKQotewotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9jcHUoY3B1LCBvZmZfY3B1cykgewotCQlwcl9kZWJ1ZygibXNtX3BlcmY6IFJlbGVhc2UgQ1BVICVkXG4iLCBjcHUpOwotCQlsb2NrX2RldmljZV9ob3RwbHVnKCk7Ci0JCWlmICghZGV2aWNlX29ubGluZShnZXRfY3B1X2RldmljZShjcHUpKSkKLQkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgb2ZmX2NwdXMpOwotCQl1bmxvY2tfZGV2aWNlX2hvdHBsdWcoKTsKLQl9Ci19Ci0KLS8qIFdvcmsgdG8gZXZhbHVhdGUgY3VycmVudCBvbmxpbmUgQ1BVIHN0YXR1cyBhbmQgaG90cGx1ZyBDUFVzIGFzIHBlciBuZWVkICovCi1zdGF0aWMgdm9pZCBjaGVja19jbHVzdGVyX3N0YXR1cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGNsdXN0ZXIgKmlfY2w7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsdXN0ZXJzOyBpKyspIHsKLQkJaV9jbCA9IG1hbmFnZWRfY2x1c3RlcnNbaV07Ci0KLQkJaWYgKGNwdW1hc2tfZW1wdHkoaV9jbC0+Y3B1cykpCi0JCQljb250aW51ZTsKLQotCQlpZiAoaV9jbC0+bWF4X2NwdV9yZXF1ZXN0IDwgMCkgewotCQkJaWYgKCFjcHVtYXNrX2VtcHR5KGlfY2wtPm9mZmxpbmVkX2NwdXMpKQotCQkJCXJlbGVhc2VfY2x1c3Rlcl9jb250cm9sKGlfY2wtPm9mZmxpbmVkX2NwdXMpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAobnVtX29ubGluZV9tYW5hZ2VkKGlfY2wtPmNwdXMpICE9Ci0JCQkJCWlfY2wtPm1heF9jcHVfcmVxdWVzdCkKLQkJCXRyeV9ob3RwbHVnKGlfY2wpOwotCX0KLX0KLQogc3RhdGljIGludCBfX3JlZiBtc21fcGVyZm9ybWFuY2VfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKQEAgLTI1NTksNDMgKzIyNTQsNiBAQAogCQl9CiAJfQogCi0JaWYgKGlfY2wgPT0gTlVMTCkKLQkJcmV0dXJuIE5PVElGWV9PSzsKLQotCWlmIChhY3Rpb24gPT0gQ1BVX1VQX1BSRVBBUkUgfHwgYWN0aW9uID09IENQVV9VUF9QUkVQQVJFX0ZST1pFTikgewotCQkvKgotCQkgKiBQcmV2ZW50IG9ubGluaW5nIG9mIGEgbWFuYWdlZCBDUFUgaWYgbWF4X2NwdSBjcml0ZXJpYSBpcwotCQkgKiBhbHJlYWR5IHNhdGlzZmllZAotCQkgKi8KLQkJaWYgKGlfY2wtPm9mZmxpbmVkX2NwdXMgPT0gTlVMTCkKLQkJCXJldHVybiBOT1RJRllfT0s7Ci0JCWlmIChpX2NsLT5tYXhfY3B1X3JlcXVlc3QgPD0KLQkJCQkJbnVtX29ubGluZV9tYW5hZ2VkKGlfY2wtPmNwdXMpKSB7Ci0JCQlwcl9kZWJ1ZygibXNtX3BlcmY6IFByZXZlbnQgQ1BVJWQgb25saW5pbmdcbiIsIGNwdSk7Ci0JCQljcHVtYXNrX3NldF9jcHUoY3B1LCBpX2NsLT5vZmZsaW5lZF9jcHVzKTsKLQkJCXJldHVybiBOT1RJRllfQkFEOwotCQl9Ci0JCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgaV9jbC0+b2ZmbGluZWRfY3B1cyk7Ci0KLQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgewotCQlpZiAoaV9jbC0+b2ZmbGluZWRfY3B1cyA9PSBOVUxMKQotCQkJcmV0dXJuIE5PVElGWV9PSzsKLQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBpX2NsLT5vZmZsaW5lZF9jcHVzKSkKLQkJCXJldHVybiBOT1RJRllfT0s7Ci0JCS8qCi0JCSAqIFNjaGVkdWxlIGEgcmUtZXZhbHVhdGlvbiB0byBjaGVjayBpZiBhbnkgbW9yZSBDUFVzIGNhbiBiZQotCQkgKiBicm91Z2h0IG9ubGluZSB0byBtZWV0IHRoZSBtYXhfY3B1X3JlcXVlc3QgcmVxdWlyZW1lbnQuIFRoaXMKLQkJICogd29yayBpcyBkZWxheWVkIHRvIGFjY291bnQgZm9yIENQVSBob3RwbHVnIGxhdGVuY2llcwotCQkgKi8KLQkJaWYgKHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZXZhbHVhdGVfaG90cGx1Z193b3JrLCAwKSkgewotCQkJdHJhY2VfcmVldmFsdWF0ZV9ob3RwbHVnKGNwdW1hc2tfYml0cyhpX2NsLT5jcHVzKVswXSwKLQkJCQkJCQlpX2NsLT5tYXhfY3B1X3JlcXVlc3QpOwotCQkJcHJfZGVidWcoIm1zbV9wZXJmOiBSZS1ldmFsdWF0aW9uIHNjaGVkdWxlZCAlZFxuIiwgY3B1KTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJtc21fcGVyZjogV29yayBzY2hlZHVsaW5nIGZhaWxlZCAlZFxuIiwgY3B1KTsKLQkJfQotCX0KLQogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKQEAgLTI2MjYsMTMgKzIyODQsNyBAQAogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbWFuYWdlZF9jbHVzdGVyc1tpXS0+b2ZmbGluZWRfY3B1cywKLQkJICAgICBHRlBfS0VSTkVMKSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KIAotCQltYW5hZ2VkX2NsdXN0ZXJzW2ldLT5tYXhfY3B1X3JlcXVlc3QgPSAtMTsKIAkJbWFuYWdlZF9jbHVzdGVyc1tpXS0+c2luZ2xlX2VudGVyX2xvYWQgPSBERUZfU0lOR0xFX0VOVDsKIAkJbWFuYWdlZF9jbHVzdGVyc1tpXS0+c2luZ2xlX2V4aXRfbG9hZCA9IERFRl9TSU5HTEVfRVg7CiAJCW1hbmFnZWRfY2x1c3RlcnNbaV0tPnNpbmdsZV9lbnRlcl9jeWNsZXMKQEAgLTI2NjksNyArMjMyMSw2IEBACiAJCQlwZXJmX2NsX3BlYWtfbW9kX2V4aXRfdGltZXI7CiAJfQogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmV2YWx1YXRlX2hvdHBsdWdfd29yaywgY2hlY2tfY2x1c3Rlcl9zdGF0dXMpOwogCW11dGV4X2luaXQoJm1hbmFnZWRfY3B1c19sb2NrKTsKIAogCWlwX2V2dHMgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRzKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNzA3LDggKzIzNTgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fY2x1c3RlcnM7IGkrKykgewogCQlpZiAoIW1hbmFnZWRfY2x1c3RlcnNbaV0pCiAJCQlicmVhazsKLQkJaWYgKG1hbmFnZWRfY2x1c3RlcnNbaV0tPm9mZmxpbmVkX2NwdXMpCi0JCQlmcmVlX2NwdW1hc2tfdmFyKG1hbmFnZWRfY2x1c3RlcnNbaV0tPm9mZmxpbmVkX2NwdXMpOwogCQlpZiAobWFuYWdlZF9jbHVzdGVyc1tpXS0+Y3B1cykKIAkJCWZyZWVfY3B1bWFza192YXIobWFuYWdlZF9jbHVzdGVyc1tpXS0+Y3B1cyk7CiAJCWtmcmVlKG1hbmFnZWRfY2x1c3RlcnNbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9wZXJpcGhlcmFsLWxvYWRlci5jIGIvZHJpdmVycy9zb2MvcWNvbS9wZXJpcGhlcmFsLWxvYWRlci5jCmluZGV4IDkxYzk0NDEuLjlkMjI5MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcGVyaXBoZXJhbC1sb2FkZXIuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL3BlcmlwaGVyYWwtbG9hZGVyLmMKQEAgLTU1LDcgKzU1LDEwIEBACiAjZW5kaWYKIAogI2RlZmluZSBQSUxfTlVNX0RFU0MJCTEwCisjZGVmaW5lIE5VTV9PRl9FTkNSWVBURURfS0VZCTMKKyNkZWZpbmUgTUFYX0xFTiA5Ngogc3RhdGljIHZvaWQgX19pb21lbSAqcGlsX2luZm9fYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnBpbF9taW5pZHVtcF9iYXNlOwogCiAvKioKICAqIHByb3h5X3RpbWVvdXQgLSBPdmVycmlkZSBmb3IgcHJveHkgdm90ZSB0aW1lb3V0cwpAQCAtNzgsNiArODEsMTggQEAKIH07CiAKIC8qKgorICogc3RydWN0IGJvb3RfbWluaWR1bXBfc21lbV9yZWdpb24gLSBSZXByZXNlbnRhdGlvbiBvZiBTTUVNIFRPQworICogQHJlZ2lvbl9uYW1lOiBOYW1lIG9mIG1vZGVtIHNlZ21lbnQgdG8gYmUgZHVtcGVkCisgKiBAcmVnaW9uX2Jhc2VfYWRkcmVzczogV2hlcmUgc2VnbWVudCBzdGFydCBmcm9tCisgKiBAcmVnaW9uX3NpemU6IFNpemUgb2Ygc2VnbWVudCB0byBiZSBkdW1wZWQKKyAqLworc3RydWN0IGJvb3RfbWluaWR1bXBfc21lbV9yZWdpb24geworCWNoYXIgcmVnaW9uX25hbWVbMTZdOworCXU2NCByZWdpb25fYmFzZV9hZGRyZXNzOworCXU2NCByZWdpb25fc2l6ZTsKK307CisKKy8qKgogICogc3RydWN0IHBpbF9zZWcgLSBtZW1vcnkgbWFwIHJlcHJlc2VudGluZyBvbmUgc2VnbWVudAogICogQG5leHQ6IHBvaW50cyB0byBuZXh0IHNlZyBtZW50b3IgTlVMTCBpZiBsYXN0IHNlZ21lbnQKICAqIEBwYWRkcjogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyBvZiBzZWdtZW50CkBAIC0xMzEsMTEgKzE0Niw2NyBAQAogCXBoeXNfYWRkcl90IHJlZ2lvbl9lbmQ7CiAJdm9pZCAqcmVnaW9uOwogCXN0cnVjdCBwaWxfaW1hZ2VfaW5mbyBfX2lvbWVtICppbmZvOworCXN0cnVjdCBtZF9zc3Jfc3NfaW5mbyBfX2lvbWVtICptaW5pZHVtcDsKKwlpbnQgbWluaWR1bXBfaWQ7CiAJaW50IGlkOwogCWludCB1bnZvdGVkX2ZsYWc7CiAJc2l6ZV90IHJlZ2lvbl9zaXplOwogfTsKIAorc3RhdGljIGludCBwaWxfZG9fbWluaWR1bXAoc3RydWN0IHBpbF9kZXNjICpkZXNjLCB2b2lkICpyYW1kdW1wX2RldikKK3sKKwlzdHJ1Y3QgYm9vdF9taW5pZHVtcF9zbWVtX3JlZ2lvbiBfX2lvbWVtICpyZWdpb25faW5mbzsKKwlzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50ICpyYW1kdW1wX3NlZ3MsICpzOworCXN0cnVjdCBwaWxfcHJpdiAqcHJpdiA9IGRlc2MtPnByaXY7CisJdm9pZCBfX2lvbWVtICpzdWJzeXNfc21lbV9iYXNlOworCXZvaWQgX19pb21lbSAqb2Zmc2V0OworCWludCBzc19tZHVtcF9zZWdfY250OworCWludCByZXQsIGk7CisKKwltZW1jcHkoJm9mZnNldCwgJnByaXYtPm1pbmlkdW1wLCBzaXplb2YocHJpdi0+bWluaWR1bXApKTsKKwlvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2YocHJpdi0+bWluaWR1bXAtPm1kX3NzX3NtZW1fcmVnaW9uc19iYXNlcHRyKTsKKwkvKiBUaGVyZSBhcmUgMyBlbmNyeXB0aW9uIGtleXMgd2hpY2ggYWxzbyBuZWVkIHRvIGJlIGR1bXBlZCAqLworCXNzX21kdW1wX3NlZ19jbnQgPSByZWFkYl9yZWxheGVkKG9mZnNldCkgKworCQkJCU5VTV9PRl9FTkNSWVBURURfS0VZOworCisJc3Vic3lzX3NtZW1fYmFzZSA9IGlvcmVtYXAoX19yYXdfcmVhZGwocHJpdi0+bWluaWR1bXApLAorCQkJCSAgIHNzX21kdW1wX3NlZ19jbnQgKiBzaXplb2YoKnJlZ2lvbl9pbmZvKSk7CisJcmVnaW9uX2luZm8gPQorCQkoc3RydWN0IGJvb3RfbWluaWR1bXBfc21lbV9yZWdpb24gX19pb21lbSAqKXN1YnN5c19zbWVtX2Jhc2U7CisJcmFtZHVtcF9zZWdzID0ga2NhbGxvYyhzc19tZHVtcF9zZWdfY250LAorCQkJICAgICAgIHNpemVvZigqcmFtZHVtcF9zZWdzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYW1kdW1wX3NlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGRlc2MtPnN1YnN5c192bWlkID4gMCkKKwkJcmV0ID0gcGlsX2Fzc2lnbl9tZW1fdG9fbGludXgoZGVzYywgcHJpdi0+cmVnaW9uX3N0YXJ0LAorCQkJKHByaXYtPnJlZ2lvbl9lbmQgLSBwcml2LT5yZWdpb25fc3RhcnQpKTsKKworCXMgPSByYW1kdW1wX3NlZ3M7CisJZm9yIChpID0gMDsgaSA8IHNzX21kdW1wX3NlZ19jbnQ7IGkrKykgeworCQltZW1jcHkoJm9mZnNldCwgJnJlZ2lvbl9pbmZvLCBzaXplb2YocmVnaW9uX2luZm8pKTsKKwkJbWVtY3B5KCZzLT5uYW1lLCAmcmVnaW9uX2luZm8sIHNpemVvZihyZWdpb25faW5mbykpOworCQlvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2YocmVnaW9uX2luZm8tPnJlZ2lvbl9uYW1lKTsKKwkJcy0+YWRkcmVzcyA9IF9fcmF3X3JlYWRsKG9mZnNldCk7CisJCW9mZnNldCA9IG9mZnNldCArIHNpemVvZihyZWdpb25faW5mby0+cmVnaW9uX2Jhc2VfYWRkcmVzcyk7CisJCXMtPnNpemUgPSBfX3Jhd19yZWFkbChvZmZzZXQpOworCQlzKys7CisJCXJlZ2lvbl9pbmZvKys7CisJfQorCXJldCA9IGRvX21pbmlkdW1wKHJhbWR1bXBfZGV2LCByYW1kdW1wX3NlZ3MsIHNzX21kdW1wX3NlZ19jbnQpOworCWtmcmVlKHJhbWR1bXBfc2Vncyk7CisJaWYgKHJldCkKKwkJcGlsX2VycihkZXNjLCAiJXM6IFJhbWR1bXAgY29sbGVjdGlvbiBmYWlsZWQgZm9yIHN1YnN5cyAlcyByYzolZFxuIiwKKwkJCV9fZnVuY19fLCBkZXNjLT5uYW1lLCByZXQpOworCXdyaXRlbF9yZWxheGVkKDAsICZwcml2LT5taW5pZHVtcC0+bWRfc3Nfc21lbV9yZWdpb25zX2Jhc2VwdHIpOworCXdyaXRlYl9yZWxheGVkKDEsICZwcml2LT5taW5pZHVtcC0+bWRfc3Nfc3NyX2NhdXNlKTsKKworCWlmIChkZXNjLT5zdWJzeXNfdm1pZCA+IDApCisJCXJldCA9IHBpbF9hc3NpZ25fbWVtX3RvX3N1YnN5cyhkZXNjLCBwcml2LT5yZWdpb25fc3RhcnQsCisJCQkocHJpdi0+cmVnaW9uX2VuZCAtIHByaXYtPnJlZ2lvbl9zdGFydCkpOworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogcGlsX2RvX3JhbWR1bXAoKSAtIFJhbWR1bXAgYW4gaW1hZ2UKICAqIEBkZXNjOiBkZXNjcmlwdG9yIGZyb20gcGlsX2Rlc2NfaW5pdCgpCkBAIC0xNTEsNiArMjIyLDkgQEAKIAlpbnQgY291bnQgPSAwLCByZXQ7CiAJc3RydWN0IHJhbWR1bXBfc2VnbWVudCAqcmFtZHVtcF9zZWdzLCAqczsKIAorCWlmIChwcml2LT5taW5pZHVtcCAmJiAoX19yYXdfcmVhZGwocHJpdi0+bWluaWR1bXApID4gMCkpCisJCXJldHVybiBwaWxfZG9fbWluaWR1bXAoZGVzYywgcmFtZHVtcF9kZXYpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWcsICZwcml2LT5zZWdzLCBsaXN0KQogCQljb3VudCsrOwogCkBAIC03NjMsNiArODM3LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcGlsX25vdGlmeV9hb3Aoc3RydWN0IHBpbF9kZXNjICpkZXNjLCBjaGFyICpzdGF0dXMpCit7CisJc3RydWN0IHFtcF9wa3QgcGt0OworCWNoYXIgbWJveF9tc2dbTUFYX0xFTl07CisKKwlpZiAoIWRlc2MtPnNpZ25hbF9hb3ApCisJCXJldHVybiAwOworCisJc25wcmludGYobWJveF9tc2csIE1BWF9MRU4sCisJCSJ7Y2xhc3M6IGltYWdlLCByZXM6IGxvYWRfc3RhdGUsIG5hbWU6ICVzLCB2YWw6ICVzfSIsCisJCWRlc2MtPm5hbWUsIHN0YXR1cyk7CisJcGt0LnNpemUgPSBNQVhfTEVOOworCXBrdC5kYXRhID0gbWJveF9tc2c7CisKKwlyZXR1cm4gbWJveF9zZW5kX21lc3NhZ2UoZGVzYy0+bWJveCwgJnBrdCk7Cit9CisKIC8qIFN5bmNocm9uaXplIHJlcXVlc3RfZmlybXdhcmUoKSB3aXRoIHN1c3BlbmQgKi8KIHN0YXRpYyBERUNMQVJFX1JXU0VNKHBpbF9wbV9yd3NlbSk7CiAKQEAgLTc4NCw2ICs4NzUsMTIgQEAKIAlib29sIG1lbV9wcm90ZWN0ID0gZmFsc2U7CiAJYm9vbCBoeXBfYXNzaWduID0gZmFsc2U7CiAKKwlyZXQgPSBwaWxfbm90aWZ5X2FvcChkZXNjLCAib24iKTsKKwlpZiAocmV0IDwgMCkgeworCQlwaWxfZXJyKGRlc2MsICJGYWlsZWQgdG8gc2VuZCBPTiBtZXNzYWdlIHRvIEFPUCByYzolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlpZiAoZGVzYy0+c2h1dGRvd25fZmFpbCkKIAkJcGlsX2VycihkZXNjLCAiU3Vic3lzdGVtIHNodXRkb3duIGZhaWxlZCBwcmV2aW91c2x5IVxuIik7CiAKQEAgLTk0Miw2ICsxMDM5LDcgQEAKIAkJCXByaXYtPnJlZ2lvbiA9IE5VTEw7CiAJCX0KIAkJcGlsX3JlbGVhc2VfbW1hcChkZXNjKTsKKwkJcGlsX25vdGlmeV9hb3AoZGVzYywgIm9mZiIpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtOTUzLDYgKzEwNTEsNyBAQAogICovCiB2b2lkIHBpbF9zaHV0ZG93bihzdHJ1Y3QgcGlsX2Rlc2MgKmRlc2MpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgcGlsX3ByaXYgKnByaXYgPSBkZXNjLT5wcml2OwogCiAJaWYgKGRlc2MtPm9wcy0+c2h1dGRvd24pIHsKQEAgLTk3MCw2ICsxMDY5LDkgQEAKIAkJcGlsX3Byb3h5X3Vudm90ZShkZXNjLCAxKTsKIAllbHNlCiAJCWZsdXNoX2RlbGF5ZWRfd29yaygmcHJpdi0+cHJveHkpOworCXJldCA9IHBpbF9ub3RpZnlfYW9wKGRlc2MsICJvZmYiKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJfd2FybigicGlsOiBmYWlsZWQgdG8gc2VuZCBPRkYgbWVzc2FnZSB0byBBT1AgcmM6JWRcbiIsIHJldCk7CiAJZGVzYy0+bW9kZW1fc3NyID0gdHJ1ZTsKIH0KIEVYUE9SVF9TWU1CT0wocGlsX3NodXRkb3duKTsKQEAgLTEwMTEsOSArMTExMywxMCBAQAogaW50IHBpbF9kZXNjX2luaXQoc3RydWN0IHBpbF9kZXNjICpkZXNjKQogewogCXN0cnVjdCBwaWxfcHJpdiAqcHJpdjsKLQlpbnQgcmV0OwogCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgcmV0LCBzc19pbWVtX29mZnNldF9tZHVtcDsKIAljaGFyIGJ1ZltzaXplb2YocHJpdi0+aW5mby0+bmFtZSldOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zub2RlID0gZGVzYy0+ZGV2LT5vZl9ub2RlOwogCiAJaWYgKFdBUk4oZGVzYy0+b3BzLT5wcm94eV91bnZvdGUgJiYgIWRlc2MtPm9wcy0+cHJveHlfdm90ZSwKIAkJCQkiSW52YWxpZCBwcm94eSB2b3RpbmcuIElnbm9yaW5nXG4iKSkKQEAgLTEwMzYsNiArMTEzOSwyMiBAQAogCQlzdHJsY3B5KGJ1ZiwgZGVzYy0+bmFtZSwgc2l6ZW9mKGJ1ZikpOwogCQlfX2lvd3JpdGUzMl9jb3B5KHByaXYtPmluZm8tPm5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLyA0KTsKIAl9CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mbm9kZSwgInFjb20sbWluaWR1bXAtaWQiLAorCQkmcHJpdi0+bWluaWR1bXBfaWQpKQorCQlwcl9kZWJ1ZygibWluaWR1bXAtaWQgbm90IGZvdW5kIGZvciAlc1xuIiwgZGVzYy0+bmFtZSk7CisJZWxzZSB7CisJCXNzX2ltZW1fb2Zmc2V0X21kdW1wID0KKwkJCXNpemVvZihzdHJ1Y3QgbWRfc3NyX3NzX2luZm8pICogcHJpdi0+bWluaWR1bXBfaWQ7CisJCWlmIChwaWxfbWluaWR1bXBfYmFzZSkgeworCQkJLyogQWRkIDB4NCB0byBnZXQgc3RhcnQgb2Ygc3RydWN0IG1kX3Nzcl9zc19pbmZvIGJhc2UKKwkJCSAqIGZyb20gc3RydWN0IG1kX3Nzcl90b2MgZm9yIGFueSBzdWJzeXN0ZW0sCisJCQkgKiBzdHJ1Y3QgbWRfc3NyX3NzX2luZm8gaXMgYWN0dWFsbHkgdGhlIHBvaW50ZXIKKwkJCSAqIG9mIFRvQyBpbiBzbWVtIGZvciBhbnkgc3Vic3lzdGVtLgorCQkJICovCisJCQlhZGRyID0gcGlsX21pbmlkdW1wX2Jhc2UgKyBzc19pbWVtX29mZnNldF9tZHVtcCArIDB4NDsKKwkJCXByaXYtPm1pbmlkdW1wID0gKHN0cnVjdCBtZF9zc3Jfc3NfaW5mbyBfX2lvbWVtICopYWRkcjsKKwkJfQorCX0KIAogCXJldCA9IHBpbF9wYXJzZV9kZXZpY2V0cmVlKGRlc2MpOwogCWlmIChyZXQpCkBAIC0xMTQ0LDYgKzEyNjMsMjAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2Vfc2l6ZSgmcmVzKS9zaXplb2YodTMyKTsgaSsrKQogCQl3cml0ZWxfcmVsYXhlZCgwLCBwaWxfaW5mb19iYXNlICsgKGkgKiBzaXplb2YodTMyKSkpOwogCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicWNvbSxtc20taW1lbS1taW5pZHVtcCIpOworCWlmICghbnApIHsKKwkJcHJfd2FybigicGlsOiBmYWlsZWQgdG8gZmluZCBxY29tLG1zbS1pbWVtLW1pbmlkdW1wIG5vZGVcbiIpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlwaWxfbWluaWR1bXBfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwkJaWYgKCFwaWxfbWluaWR1bXBfYmFzZSkgeworCQkJcHJfZXJyKCJ1bmFibGUgdG8gbWFwIHBpbCBtaW5pZHVtcCBpbWVtIG9mZnNldFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBtZF9zc3JfdG9jKS9zaXplb2YodTMyKTsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZCgwLCBwaWxfbWluaWR1bXBfYmFzZSArIChpICogc2l6ZW9mKHUzMikpKTsKKwl3cml0ZWxfcmVsYXhlZCgxLCBwaWxfbWluaWR1bXBfYmFzZSk7CiBvdXQ6CiAJcmV0dXJuIHJlZ2lzdGVyX3BtX25vdGlmaWVyKCZwaWxfcG1fbm90aWZpZXIpOwogfQpAQCAtMTE1NCw2ICsxMjg3LDggQEAKIAl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZwaWxfcG1fbm90aWZpZXIpOwogCWlmIChwaWxfaW5mb19iYXNlKQogCQlpb3VubWFwKHBpbF9pbmZvX2Jhc2UpOworCWlmIChwaWxfbWluaWR1bXBfYmFzZSkKKwkJaW91bm1hcChwaWxfbWluaWR1bXBfYmFzZSk7CiB9CiBtb2R1bGVfZXhpdChtc21fcGlsX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3BlcmlwaGVyYWwtbG9hZGVyLmggYi9kcml2ZXJzL3NvYy9xY29tL3BlcmlwaGVyYWwtbG9hZGVyLmgKaW5kZXggYWY3MjQ5Yi4uZjA5YWRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9wZXJpcGhlcmFsLWxvYWRlci5oCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcGVyaXBoZXJhbC1sb2FkZXIuaApAQCAtMTIsNiArMTIsOSBAQAogI2lmbmRlZiBfX01TTV9QRVJJUEhFUkFMX0xPQURFUl9ICiAjZGVmaW5lIF9fTVNNX1BFUklQSEVSQUxfTE9BREVSX0gKIAorI2luY2x1ZGUgPGxpbnV4L21haWxib3hfY2xpZW50Lmg+CisjaW5jbHVkZSA8bGludXgvbWFpbGJveC9xbXAuaD4KKwogc3RydWN0IGRldmljZTsKIHN0cnVjdCBtb2R1bGU7CiBzdHJ1Y3QgcGlsX3ByaXY7CkBAIC01Nyw2ICs2MCw5IEBACiAJYm9vbCBtb2RlbV9zc3I7CiAJYm9vbCBjbGVhcl9md19yZWdpb247CiAJdTMyIHN1YnN5c192bWlkOworCWJvb2wgc2lnbmFsX2FvcDsKKwlzdHJ1Y3QgbWJveF9jbGllbnQgY2w7CisJc3RydWN0IG1ib3hfY2hhbiAqbWJveDsKIH07CiAKIC8qKgpAQCAtNzEsNiArNzcsMzQgQEAKIAlfX2xlMzIgc2l6ZTsKIH0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwogCisjZGVmaW5lIE1BWF9OVU1fT0ZfU1MgMworCisvKioKKyAqIHN0cnVjdCBtZF9zc3Jfc3NfaW5mbyAtIEluZm8gaW4gaW1lbSBhYm91dCBzbWVtIFRvQworICogQG1kX3NzX3NtZW1fcmVnaW9uc19iYXNlcHRyOiBTdGFydCBwaHlzaWNhbCBhZGRyZXNzIG9mIFNNRU0gVE9DCisgKiBAbWRfc3NfbnVtX29mX3JlZ2lvbnM6IG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG5lZWQgdG8gYmUgZHVtcGVkCisgKiBAbWRfc3NfZW5jcnlwdGlvbl9zdGF0dXM6IHN0YXR1cyBvZiBlbmNyeXB0aW9uIG9mIHNlZ21lbnRzCisgKiBAbWRfc3Nfc3NyX2NhdXNlOiBzc3IgY2F1c2UgZW51bQorICovCitzdHJ1Y3QgbWRfc3NyX3NzX2luZm8geworCXUzMiBtZF9zc19zbWVtX3JlZ2lvbnNfYmFzZXB0cjsKKwl1OCBtZF9zc19udW1fb2ZfcmVnaW9uczsKKwl1OCBtZF9zc19lbmNyeXB0aW9uX3N0YXR1czsKKwl1OCBtZF9zc19zc3JfY2F1c2U7CisJdTggcmVzZXJ2ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBtZF9zc3JfdG9jIC0gV3JhcHBlciBvZiBzdHJ1Y3QgbWRfc3NyX3NzX2luZm8KKyAqIEBtZF9zc3JfdG9jX2luaXQ6IGZsYWcgdG8gaW5kaWNhdGUgdG8gTVNTIFNXIGFib3V0IGltZW0gaW5pdCBkb25lCisgKiBAbWRfc3NyX3NzOiBJbnN0YW5jZSBvZiBzdHJ1Y3QgbWRfc3NyX3NzX2luZm8gZm9yIGEgc3Vic3lzdGVtCisgKi8KK3N0cnVjdCBtZF9zc3JfdG9jIC8qIFNoYXJlZCBJTUVNIFRvQyBzdHJ1Y3QgKi8KK3sKKwl1MzIgbWRfc3NyX3RvY19pbml0OworCXN0cnVjdCBtZF9zc3Jfc3NfaW5mbwltZF9zc3Jfc3NbTUFYX05VTV9PRl9TU107Cit9OworCiAvKioKICAqIHN0cnVjdCBwaWxfcmVzZXRfb3BzIC0gUElMIG9wZXJhdGlvbnMKICAqIEBpbml0X2ltYWdlOiBwcmVwYXJlIGFuIGltYWdlIGZvciBhdXRoZW50aWNhdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9waWwtbXNhLmMgYi9kcml2ZXJzL3NvYy9xY29tL3BpbC1tc2EuYwppbmRleCAyMGI5NzY5Li5lYzMwNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3BpbC1tc2EuYworKysgYi9kcml2ZXJzL3NvYy9xY29tL3BpbC1tc2EuYwpAQCAtNzcsOSArNzcsOCBAQAogCiAjZGVmaW5lIE1TU19NQUdJQwkJCTBYQUFCQURFQUQKIAotI2RlZmluZSBNU1NfUERDX09GRlNFVAkJCTgKLSNkZWZpbmUgTVNTX1BEQ19NQVNLCQkJQklUKE1TU19QRENfT0ZGU0VUKQotCisvKiBUaW1lb3V0IHZhbHVlIGZvciBNQkEgYm9vdCB3aGVuIG1pbmlkdW1wIGlzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTUJBX0VOQ1JZUFRJT05fVElNRU9VVAkzMDAwCiBlbnVtIHNjbV9jbWQgewogCVBBU19NRU1fU0VUVVBfQ01EID0gMiwKIH07CkBAIC0yMTIsMTMgKzIxMSwxNCBAQAogc3RhdGljIHZvaWQgcGlsX21zc19wZGNfc3luYyhzdHJ1Y3QgcTZ2NV9kYXRhICpkcnYsIGJvb2wgcGRjX3N5bmMpCiB7CiAJdTMyIHZhbCA9IDA7CisJdTMyIG1zc19wZGNfbWFzayA9IEJJVChkcnYtPm1zc19wZGNfb2Zmc2V0KTsKIAogCWlmIChkcnYtPnBkY19zeW5jKSB7CiAJCXZhbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2LT5wZGNfc3luYyk7CiAJCWlmIChwZGNfc3luYykKLQkJCXZhbCB8PSBNU1NfUERDX01BU0s7CisJCQl2YWwgfD0gbXNzX3BkY19tYXNrOwogCQllbHNlCi0JCQl2YWwgJj0gfk1TU19QRENfTUFTSzsKKwkJCXZhbCAmPSB+bXNzX3BkY19tYXNrOwogCQl3cml0ZWxfcmVsYXhlZCh2YWwsIGRydi0+cGRjX3N5bmMpOwogCQkvKiBFbnN1cmUgUERDIGlzIHdyaXR0ZW4gYmVmb3JlIG5leHQgd3JpdGUgKi8KIAkJd21iKCk7CkBAIC0yNjcsNyArMjY3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBpbF9tc3NfYXNzZXJ0X3Jlc2V0cyhzdHJ1Y3QgcTZ2NV9kYXRhICpkcnYpCitpbnQgcGlsX21zc19hc3NlcnRfcmVzZXRzKHN0cnVjdCBxNnY1X2RhdGEgKmRydikKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjc4LDcgKzI3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwaWxfbXNzX2RlYXNzZXJ0X3Jlc2V0cyhzdHJ1Y3QgcTZ2NV9kYXRhICpkcnYpCitpbnQgcGlsX21zc19kZWFzc2VydF9yZXNldHMoc3RydWN0IHE2djVfZGF0YSAqZHJ2KQogewogCWludCByZXQgPSAwOwogCkBAIC0yOTgsNyArMjk4LDEyIEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gZHJ2LT5kZXNjLmRldjsKIAlpbnQgcmV0OwogCXUzMiBzdGF0dXM7Ci0JdTY0IHZhbCA9IGlzX3RpbWVvdXRfZGlzYWJsZWQoKSA/IDAgOiBwYmxfbWJhX2Jvb3RfdGltZW91dF9tcyAqIDEwMDA7CisJdTY0IHZhbDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSxtaW5pZHVtcC1pZCIpKQorCQlwYmxfbWJhX2Jvb3RfdGltZW91dF9tcyA9IE1CQV9FTkNSWVBUSU9OX1RJTUVPVVQ7CisKKwl2YWwgPSBpc190aW1lb3V0X2Rpc2FibGVkKCkgPyAwIDogcGJsX21iYV9ib290X3RpbWVvdXRfbXMgKiAxMDAwOwogCiAJLyogV2FpdCBmb3IgUEJMIGNvbXBsZXRpb24uICovCiAJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KGRydi0+cm1iX2Jhc2UgKyBSTUJfUEJMX1NUQVRVUywgc3RhdHVzLApAQCAtNjEwLDcgKzYxNSw3IEBACiAJY2hhciAqZndfbmFtZV9wOwogCXZvaWQgKm1iYV9kcF92aXJ0OwogCWRtYV9hZGRyX3QgbWJhX2RwX3BoeXMsIG1iYV9kcF9waHlzX2VuZDsKLQlpbnQgcmV0LCBjb3VudDsKKwlpbnQgcmV0OwogCWNvbnN0IHU4ICpkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXYgPSBtZC0+bWJhX21lbV9kZXZfZml4ZWQgPzogJm1kLT5tYmFfbWVtX2RldjsKIApAQCAtNjc2LDEwICs2ODEsOSBAQAogCQkJCQkmbWJhX2RwX3BoeXMsICZtYmFfZHBfcGh5c19lbmQpOwogCiAJLyogTG9hZCB0aGUgTUJBIGltYWdlIGludG8gbWVtb3J5ICovCi0JY291bnQgPSBmdy0+c2l6ZTsKLQlpZiAoY291bnQgPD0gU1pfMU0pIHsKKwlpZiAoZnctPnNpemUgPD0gU1pfMU0pIHsKIAkJLyogRW5zdXJlcyBtZW1jcHkgaXMgZG9uZSBmb3IgbWF4IDFNQiBmdyBzaXplICovCi0JCW1lbWNweShtYmFfZHBfdmlydCwgZGF0YSwgY291bnQpOworCQltZW1jcHkobWJhX2RwX3ZpcnQsIGRhdGEsIGZ3LT5zaXplKTsKIAl9IGVsc2UgewogCQlkZXZfZXJyKHBpbC0+ZGV2LCAiJXMgZncgaW1hZ2UgbG9hZGluZyBpbnRvIG1lbW9yeSBpcyBmYWlsZWQgZHVlIHRvIGZ3IHNpemUgb3ZlcmZsb3dcbiIsCiAJCQlfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3BpbC1tc2EuaCBiL2RyaXZlcnMvc29jL3Fjb20vcGlsLW1zYS5oCmluZGV4IDE3ODliYTMuLjdhNmEzY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcGlsLW1zYS5oCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcGlsLW1zYS5oCkBAIC00Niw0ICs0Niw2IEBACiBpbnQgcGlsX21zc19zaHV0ZG93bihzdHJ1Y3QgcGlsX2Rlc2MgKnBpbCk7CiBpbnQgcGlsX21zc19kZWluaXRfaW1hZ2Uoc3RydWN0IHBpbF9kZXNjICpwaWwpOwogaW50IF9fcGlsX21zc19kZWluaXRfaW1hZ2Uoc3RydWN0IHBpbF9kZXNjICpwaWwsIGJvb2wgZXJyX3BhdGgpOworaW50IHBpbF9tc3NfYXNzZXJ0X3Jlc2V0cyhzdHJ1Y3QgcTZ2NV9kYXRhICpkcnYpOworaW50IHBpbF9tc3NfZGVhc3NlcnRfcmVzZXRzKHN0cnVjdCBxNnY1X2RhdGEgKmRydik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcGlsLXE2djUtbXNzLmMgYi9kcml2ZXJzL3NvYy9xY29tL3BpbC1xNnY1LW1zcy5jCmluZGV4IDc5ODRkZmUuLmNmNWY3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcGlsLXE2djUtbXNzLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9waWwtcTZ2NS1tc3MuYwpAQCAtMjE3LDYgKzIxNywyMiBAQAogCWRydi0+c3Vic3lzX2Rlc2Mud2RvZ19iaXRlX2hhbmRsZXIgPSBtb2RlbV93ZG9nX2JpdGVfaW50cl9oYW5kbGVyOwogCiAJZHJ2LT5xNi0+ZGVzYy5tb2RlbV9zc3IgPSBmYWxzZTsKKwlkcnYtPnE2LT5kZXNjLnNpZ25hbF9hb3AgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkicWNvbSxzaWduYWwtYW9wIik7CisJaWYgKGRydi0+cTYtPmRlc2Muc2lnbmFsX2FvcCkgeworCQlkcnYtPnE2LT5kZXNjLmNsLmRldiA9ICZwZGV2LT5kZXY7CisJCWRydi0+cTYtPmRlc2MuY2wudHhfYmxvY2sgPSB0cnVlOworCQlkcnYtPnE2LT5kZXNjLmNsLnR4X3RvdXQgPSAxMDAwOworCQlkcnYtPnE2LT5kZXNjLmNsLmtub3dzX3R4ZG9uZSA9IGZhbHNlOworCQlkcnYtPnE2LT5kZXNjLm1ib3ggPSBtYm94X3JlcXVlc3RfY2hhbm5lbCgmZHJ2LT5xNi0+ZGVzYy5jbCwgMCk7CisJCWlmIChJU19FUlIoZHJ2LT5xNi0+ZGVzYy5tYm94KSkgeworCQkJcmV0ID0gUFRSX0VSUihkcnYtPnE2LT5kZXNjLm1ib3gpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBtYWlsYm94IGNoYW5uZWwgJXBLICVkXG4iLAorCQkJCWRydi0+cTYtPmRlc2MubWJveCwgcmV0KTsKKwkJCWdvdG8gZXJyX3N1YnN5czsKKwkJfQorCX0KKwogCWRydi0+c3Vic3lzID0gc3Vic3lzX3JlZ2lzdGVyKCZkcnYtPnN1YnN5c19kZXNjKTsKIAlpZiAoSVNfRVJSKGRydi0+c3Vic3lzKSkgewogCQlyZXQgPSBQVFJfRVJSKGRydi0+c3Vic3lzKTsKQEAgLTI5Myw2ICszMDksMTMgQEAKIAlpZiAocmVzKSB7CiAJCXE2LT5wZGNfc3luYyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LAogCQkJCQkJcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJInFjb20sbXNzX3BkY19vZmZzZXQiLCAmcTYtPm1zc19wZGNfb2Zmc2V0KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJPZmZzZXQgZm9yIE1TUyBQREMgbm90IHNwZWNpZmllZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJfQogCiAJcTYtPmFsdF9yZXNldCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3BpbC1xNnY1LmMgYi9kcml2ZXJzL3NvYy9xY29tL3BpbC1xNnY1LmMKaW5kZXggNDlkZDBiZS4uNmQ2YjlmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9waWwtcTZ2NS5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcGlsLXE2djUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy90cmFjZV9tc21fcGlsX2V2ZW50Lmg+CiAKICNpbmNsdWRlICJwZXJpcGhlcmFsLWxvYWRlci5oIgorI2luY2x1ZGUgInBpbC1tc2EuaCIKICNpbmNsdWRlICJwaWwtcTZ2NS5oIgogCiAvKiBRRFNQNlNTIFJlZ2lzdGVyIE9mZnNldHMgKi8KQEAgLTgzLDEwICs4NCwxMCBAQAogLyogUURTUDZ2NjUgcGFyYW1ldGVycyAqLwogI2RlZmluZSBRRFNQNlNTX0JPT1RfQ09SRV9TVEFSVAkJKDB4NDAwKQogI2RlZmluZSBRRFNQNlNTX0JPT1RfQ01ECQkoMHg0MDQpCi0jZGVmaW5lIFFEU1A2U1NfQk9PVF9TVEFUVVMJCSgweDQwOCkKKyNkZWZpbmUgTVNTX1NUQVRVUwkJCSgweDQwKQogI2RlZmluZSBRRFNQNlNTX1NMRUVQCQkJKDB4M0MpCiAjZGVmaW5lIFNMRUVQX0NIRUNLX01BWF9MT09QUwkJKDIwMCkKLSNkZWZpbmUgQk9PVF9GU01fVElNRU9VVAkJKDEwKQorI2RlZmluZSBCT09UX0ZTTV9USU1FT1VUCQkoMTAwKQogCiAjZGVmaW5lIFFEU1A2U1NfQUNDX09WRVJSSURFX1ZBTAkweDIwCiAKQEAgLTM4NCw3ICszODUsNyBAQAogewogCXN0cnVjdCBxNnY1X2RhdGEgKmRydiA9IGNvbnRhaW5lcl9vZihwaWwsIHN0cnVjdCBxNnY1X2RhdGEsIGRlc2MpOwogCXUzMiB2YWwsIGNvdW50OwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmV0OwogCiAJdmFsID0gcmVhZGxfcmVsYXhlZChkcnYtPnJlZ19iYXNlICsgUURTUDZTU19TTEVFUCk7CiAJdmFsIHw9IDB4MTsKQEAgLTQwOSwxNSArNDEwLDE5IEBACiAJd3JpdGVsX3JlbGF4ZWQoMSwgZHJ2LT5yZWdfYmFzZSArIFFEU1A2U1NfQk9PVF9DTUQpOwogCiAJLyogV2FpdCBmb3IgYm9vdCBGU00gdG8gY29tcGxldGUgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMoQk9PVF9GU01fVElNRU9VVCk7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXZhbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2LT5yZWdfYmFzZSArIFFEU1A2U1NfQk9PVF9TVEFUVVMpOwotCQlpZiAodmFsICYgQklUKDApKQotCQkJcmV0dXJuIDA7CisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KGRydi0+cm1iX2Jhc2UgKyBNU1NfU1RBVFVTLCB2YWwsCisJCQkodmFsICYgQklUKDEpKSAhPSAwLCAxMCwgQk9PVF9GU01fVElNRU9VVCk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZHJ2LT5kZXNjLmRldiwgIkJvb3QgRlNNIGZhaWxlZCB0byBjb21wbGV0ZS5cbiIpOworCQkvKiBSZXNldCB0aGUgbW9kZW0gc28gdGhhdCBib290IEZTTSBpcyBpbiByZXNldCBzdGF0ZSAqLworCQlwaWxfbXNzX2Fzc2VydF9yZXNldHMoZHJ2KTsKKwkJLyogV2FpdCA2IDMya0h6IHNsZWVwIGN5Y2xlcyBmb3IgcmVzZXQgKi8KKwkJdWRlbGF5KDIwMCk7CisJCXBpbF9tc3NfZGVhc3NlcnRfcmVzZXRzKGRydik7CiAJfQogCi0JZGV2X2VycihkcnYtPmRlc2MuZGV2LCAiQm9vdCBGU00gZmFpbGVkIHRvIGNvbXBsZXRlLlxuIik7Ci0JcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX3BpbF9xNnY1NV9yZXNldChzdHJ1Y3QgcGlsX2Rlc2MgKnBpbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcGlsLXE2djUuaCBiL2RyaXZlcnMvc29jL3Fjb20vcGlsLXE2djUuaAppbmRleCA5YjRjODExLi40OTYxYjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3BpbC1xNnY1LmgKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9waWwtcTZ2NS5oCkBAIC03NCw2ICs3NCw3IEBACiAJYm9vbCByZXN0YXJ0X3JlZ19zZWM7CiAJYm9vbCBvdmVycmlkZV9hY2M7CiAJaW50IG92ZXJyaWRlX2FjY18xOworCWludCBtc3NfcGRjX29mZnNldDsKIAlib29sIGFoYl9jbGtfdm90ZTsKIAlib29sIG14X3NwaWtlX3dhOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZSBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9NYWtlZmlsZQppbmRleCA5ZmRkNjNhLi45M2JhYjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL01ha2VmaWxlCkBAIC0xLDggKzEgQEAKLW9iai0kKENPTkZJR19NU01fUURTUDZfQVBSVjJfR0xJTkspICs9IGFwci5vIGFwcl92Mi5vIGFwcl90YWxfZ2xpbmsubwotb2JqLSQoQ09ORklHX01TTV9RRFNQNl9BUFJWM19HTElOSykgKz0gYXByLm8gYXByX3YzLm8gYXByX3RhbF9nbGluay5vCi1vYmotJChDT05GSUdfU05EX1NPQ19NU01fUURTUDZWMl9JTlRGKSArPSBtc21fYXVkaW9faW9uLm8KLW9iai0kKENPTkZJR19NU01fQURTUF9MT0FERVIpICs9IGFkc3AtbG9hZGVyLm8KLW9iai0kKENPTkZJR19NU01fUURTUDZfU1NSKSArPSBhdWRpb19zc3Iubwotb2JqLSQoQ09ORklHX01TTV9RRFNQNl9QRFIpICs9IGF1ZGlvX3Bkci5vCi1vYmotJChDT05GSUdfTVNNX1FEU1A2X05PVElGSUVSKSArPSBhdWRpb19ub3RpZmllci5vCiBvYmotJChDT05GSUdfTVNNX0NEU1BfTE9BREVSKSArPSBjZHNwLWxvYWRlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYWRzcC1sb2FkZXIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hZHNwLWxvYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTAyNjdlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hZHNwLWxvYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSA8c29jL3Fjb20vc3Vic3lzdGVtX3Jlc3RhcnQuaD4KLQotI2RlZmluZSBRNl9QSUxfR0VUX0RFTEFZX01TIDEwMAotI2RlZmluZSBCT09UX0NNRCAxCi0jZGVmaW5lIElNQUdFX1VOTE9BRF9DTUQgMAotCi1zdGF0aWMgc3NpemVfdCBhZHNwX2Jvb3Rfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0Jc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLQotc3RydWN0IGFkc3BfbG9hZGVyX3ByaXZhdGUgewotCXZvaWQgKnBpbF9oOwotCXN0cnVjdCBrb2JqZWN0ICpib290X2Fkc3Bfb2JqOwotCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGFkc3BfYm9vdF9hdHRyaWJ1dGUgPQotCV9fQVRUUihib290LCAwMjIwLCBOVUxMLCBhZHNwX2Jvb3Rfc3RvcmUpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbXSA9IHsKLQkmYWRzcF9ib290X2F0dHJpYnV0ZS5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGFkc3BfbGRyX3dvcms7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYWRzcF9wcml2YXRlOwotc3RhdGljIHZvaWQgYWRzcF9sb2FkZXJfdW5sb2FkKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwotCi1zdGF0aWMgdm9pZCBhZHNwX2xvYWRfZncoc3RydWN0IHdvcmtfc3RydWN0ICphZHNwX2xkcl93b3JrKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBhZHNwX3ByaXZhdGU7Ci0Jc3RydWN0IGFkc3BfbG9hZGVyX3ByaXZhdGUgKnByaXYgPSBOVUxMOwotCi0JY29uc3QgY2hhciAqYWRzcF9kdCA9ICJxY29tLGFkc3Atc3RhdGUiOwotCWludCByYyA9IDA7Ci0JdTMyIGFkc3Bfc3RhdGU7Ci0JY29uc3QgY2hhciAqaW1nX25hbWU7Ci0KLQlpZiAoIXBkZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFBsYXRmb3JtIGRldmljZSBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogRGV2aWNlIHRyZWUgaW5mb3JtYXRpb24gbWlzc2luZ1xuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgYWRzcF9kdCwgJmFkc3Bfc3RhdGUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IEFEU1Agc3RhdGUgPSAleFxuIiwgX19mdW5jX18sIGFkc3Bfc3RhdGUpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20scHJvYy1pbWctdG8tbG9hZCIsCi0JCQkJCSZpbWdfbmFtZSk7Ci0KLQlpZiAocmMpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJIiVzOiBsb2FkaW5nIGRlZmF1bHQgaW1hZ2UgQURTUFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGxvYWRfYWRzcDsKLQl9Ci0JaWYgKCFzdHJjbXAoaW1nX25hbWUsICJtb2RlbSIpKSB7Ci0JCS8qIGFkc3Bfc3RhdGUgYWx3YXlzIHJldHVybnMgIjAiLiBTbyBsb2FkIG1vZGVtIGltYWdlIGJhc2VkIG9uCi0JCSAqIGFwcl9tb2RlbV9zdGF0ZSB0byBwcmV2ZW50IGxvYWRpbmcgb2YgaW1hZ2UgdHdpY2UKLQkJICovCi0JCWFkc3Bfc3RhdGUgPSBhcHJfZ2V0X21vZGVtX3N0YXRlKCk7Ci0JCWlmIChhZHNwX3N0YXRlID09IEFQUl9TVUJTWVNfRE9XTikgewotCQkJcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCQkJaWYgKCFwcml2KSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSIgJXM6IFByaXZhdGUgZGF0YSBnZXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCi0JCQlwcml2LT5waWxfaCA9IHN1YnN5c3RlbV9nZXQoIm1vZGVtIik7Ci0JCQlpZiAoSVNfRVJSKHByaXYtPnBpbF9oKSkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBwaWwgZ2V0IGZhaWxlZCxcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0KLQkJCS8qIFNldCB0aGUgc3RhdGUgb2YgdGhlIEFEU1AgaW4gQVBSIGRyaXZlciAqLwotCQkJYXByX3NldF9tb2RlbV9zdGF0ZShBUFJfU1VCU1lTX0xPQURFRCk7Ci0JCX0gZWxzZSBpZiAoYWRzcF9zdGF0ZSA9PSBBUFJfU1VCU1lTX0xPQURFRCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJIiVzOiBNRFNQIHN0YXRlID0gJXhcbiIsIF9fZnVuY19fLCBhZHNwX3N0YXRlKTsKLQkJfQotCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBRNi9NRFNQIGltYWdlIGlzIGxvYWRlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotbG9hZF9hZHNwOgotCXsKLQkJYWRzcF9zdGF0ZSA9IGFwcl9nZXRfcTZfc3RhdGUoKTsKLQkJaWYgKGFkc3Bfc3RhdGUgPT0gQVBSX1NVQlNZU19ET1dOKSB7Ci0JCQlwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JCQlpZiAoIXByaXYpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiAlczogUHJpdmF0ZSBkYXRhIGdldCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0KLQkJCXByaXYtPnBpbF9oID0gc3Vic3lzdGVtX2dldCgiYWRzcCIpOwotCQkJaWYgKElTX0VSUihwcml2LT5waWxfaCkpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcGlsIGdldCBmYWlsZWQsXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCi0JCQkvKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBBRFNQIGluIEFQUiBkcml2ZXIgKi8KLQkJCWFwcl9zZXRfcTZfc3RhdGUoQVBSX1NVQlNZU19MT0FERUQpOwotCQl9IGVsc2UgaWYgKGFkc3Bfc3RhdGUgPT0gQVBSX1NVQlNZU19MT0FERUQpIHsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogQURTUCBzdGF0ZSA9ICV4XG4iLCBfX2Z1bmNfXywgYWRzcF9zdGF0ZSk7Ci0JCX0KLQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUTYvQURTUCBpbWFnZSBpcyBsb2FkZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLWZhaWw6Ci0JZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFE2IGltYWdlIGxvYWRpbmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkc3BfbG9hZGVyX2RvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc2NoZWR1bGVfd29yaygmYWRzcF9sZHJfd29yayk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkc3BfYm9vdF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCi0JY29uc3QgY2hhciAqYnVmLAotCXNpemVfdCBjb3VudCkKLXsKLQlpbnQgYm9vdCA9IDA7Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiVkdSIsICZib290KSAhPSAxKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWFkIGJvb3QgaW5mbyBmcm9tIHN0cmluZ1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYm9vdCA9PSBCT09UX0NNRCkgewotCQlwcl9kZWJ1ZygiJXM6IGdvaW5nIHRvIGNhbGwgYWRzcF9sb2FkZXJfZG9cbiIsIF9fZnVuY19fKTsKLQkJYWRzcF9sb2FkZXJfZG8oYWRzcF9wcml2YXRlKTsKLQl9IGVsc2UgaWYgKGJvb3QgPT0gSU1BR0VfVU5MT0FEX0NNRCkgewotCQlwcl9kZWJ1ZygiJXM6IGdvaW5nIHRvIGNhbGwgYWRzcF91bmxvYWRlclxuIiwgX19mdW5jX18pOwotCQlhZHNwX2xvYWRlcl91bmxvYWQoYWRzcF9wcml2YXRlKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgdm9pZCBhZHNwX2xvYWRlcl91bmxvYWQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYWRzcF9sb2FkZXJfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7Ci0KLQlwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpZiAoIXByaXYpCi0JCXJldHVybjsKLQotCWlmIChwcml2LT5waWxfaCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogY2FsbGluZyBzdWJzeXN0ZW0gcHV0XG4iLCBfX2Z1bmNfXyk7Ci0JCXN1YnN5c3RlbV9wdXQocHJpdi0+cGlsX2gpOwotCQlwcml2LT5waWxfaCA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFkc3BfbG9hZGVyX2luaXRfc3lzZnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgYWRzcF9sb2FkZXJfcHJpdmF0ZSAqcHJpdiA9IE5VTEw7Ci0KLQlhZHNwX3ByaXZhdGUgPSBOVUxMOwotCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7Ci0KLQlwcml2LT5waWxfaCA9IE5VTEw7Ci0JcHJpdi0+Ym9vdF9hZHNwX29iaiA9IE5VTEw7Ci0JcHJpdi0+YXR0cl9ncm91cCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCXNpemVvZigqKHByaXYtPmF0dHJfZ3JvdXApKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmF0dHJfZ3JvdXApIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0JcHJpdi0+YXR0cl9ncm91cC0+YXR0cnMgPSBhdHRyczsKLQotCXByaXYtPmJvb3RfYWRzcF9vYmogPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJib290X2Fkc3AiLCBrZXJuZWxfa29iaik7Ci0JaWYgKCFwcml2LT5ib290X2Fkc3Bfb2JqKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzeXNmcyBjcmVhdGUgYW5kIGFkZCBmYWlsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cChwcml2LT5ib290X2Fkc3Bfb2JqLCBwcml2LT5hdHRyX2dyb3VwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzeXNmcyBjcmVhdGUgZ3JvdXAgZmFpbGVkICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLQlhZHNwX3ByaXZhdGUgPSBwZGV2OwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX3JldHVybjoKLQotCWlmIChwcml2LT5ib290X2Fkc3Bfb2JqKSB7Ci0JCWtvYmplY3RfZGVsKHByaXYtPmJvb3RfYWRzcF9vYmopOwotCQlwcml2LT5ib290X2Fkc3Bfb2JqID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkc3BfbG9hZGVyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhZHNwX2xvYWRlcl9wcml2YXRlICpwcml2ID0gTlVMTDsKLQotCXByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocHJpdi0+cGlsX2gpIHsKLQkJc3Vic3lzdGVtX3B1dChwcml2LT5waWxfaCk7Ci0JCXByaXYtPnBpbF9oID0gTlVMTDsKLQl9Ci0KLQlpZiAocHJpdi0+Ym9vdF9hZHNwX29iaikgewotCQlzeXNmc19yZW1vdmVfZ3JvdXAocHJpdi0+Ym9vdF9hZHNwX29iaiwgcHJpdi0+YXR0cl9ncm91cCk7Ci0JCWtvYmplY3RfZGVsKHByaXYtPmJvb3RfYWRzcF9vYmopOwotCQlwcml2LT5ib290X2Fkc3Bfb2JqID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZHNwX2xvYWRlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSBhZHNwX2xvYWRlcl9pbml0X3N5c2ZzKHBkZXYpOwotCi0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBFcnJvciBpbiBpbml0aW5nIHN5c2ZzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JSU5JVF9XT1JLKCZhZHNwX2xkcl93b3JrLCBhZHNwX2xvYWRfZncpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFkc3BfbG9hZGVyX2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLGFkc3AtbG9hZGVyIiB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFkc3BfbG9hZGVyX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWRzcF9sb2FkZXJfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkc3AtbG9hZGVyIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IGFkc3BfbG9hZGVyX2R0X21hdGNoLAotCX0sCi0JLnByb2JlID0gYWRzcF9sb2FkZXJfcHJvYmUsCi0JLnJlbW92ZSA9IGFkc3BfbG9hZGVyX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFkc3BfbG9hZGVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhZHNwX2xvYWRlcl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYWRzcF9sb2FkZXJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhZHNwX2xvYWRlcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFkc3BfbG9hZGVyX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhZHNwX2xvYWRlcl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFNQIExvYWRlciBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OWI4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c29jL3Fjb20vc3Vic3lzdGVtX3Jlc3RhcnQuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwY19sb2dnaW5nLmg+Ci0KLSNkZWZpbmUgQVBSX1BLVF9JUENfTE9HX1BBR0VfQ05UIDIKLQotc3RhdGljIHN0cnVjdCBhcHJfcTYgcTY7Ci1zdGF0aWMgc3RydWN0IGFwcl9jbGllbnQgY2xpZW50W0FQUl9ERVNUX01BWF1bQVBSX0NMSUVOVF9NQVhdOwotc3RhdGljIHZvaWQgKmFwcl9wa3RfY3R4Owotc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IGRzcF93YWl0Owotc3RhdGljIHdhaXRfcXVldWVfaGVhZF90IG1vZGVtX3dhaXQ7Ci1zdGF0aWMgYm9vbCBpc19tb2RlbV91cDsKLXN0YXRpYyBib29sIGlzX2luaXRpYWxfYm9vdDsKLS8qIFN1YnN5c3RlbSByZXN0YXJ0OiBRRFNQNiBkYXRhLCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXByX3Jlc2V0X3dvcmtxdWV1ZTsKLXN0YXRpYyB2b2lkIGFwcl9yZXNldF9kZXJlZ2lzdGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1zdGF0aWMgdm9pZCBkaXNwYXRjaF9ldmVudCh1bnNpZ25lZCBsb25nIGNvZGUsIHVpbnQxNl90IHByb2MpOwotc3RydWN0IGFwcl9yZXNldF93b3JrIHsKLQl2b2lkICpoYW5kbGU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci19OwotCi1zdGF0aWMgYm9vbCBhcHJfY2ZfZGVidWc7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2Fwcl9kZWJ1ZzsKLXN0YXRpYyBzc2l6ZV90IGFwcl9kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkgICAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgY21kOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIHVidWYsIDEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWFwcl9jZl9kZWJ1ZyA9IChjbWQgPT0gJzEnKSA/IHRydWUgOiBmYWxzZTsKLQotCXJldHVybiBjbnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwcl9kZWJ1Z19vcHMgPSB7Ci0JLndyaXRlID0gYXByX2RlYnVnX3dyaXRlLAotfTsKLSNlbmRpZgotCi0jZGVmaW5lIEFQUl9QS1RfSU5GTyh4Li4uKSBcCi1kbyB7IFwKLQlpZiAoYXByX3BrdF9jdHgpIFwKLQkJaXBjX2xvZ19zdHJpbmcoYXByX3BrdF9jdHgsICI8QVBSPjogIngpOyBcCi19IHdoaWxlICgwKQotCi0KLXN0cnVjdCBhcHJfc3ZjX3RhYmxlIHsKLQljaGFyIG5hbWVbNjRdOwotCWludCBpZHg7Ci0JaW50IGlkOwotCWludCBjbGllbnRfaWQ7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFwcl9zdmNfdGFibGUgc3ZjX3RibF9xZHNwNltdID0gewotCXsKLQkJLm5hbWUgPSAiQUZFIiwKLQkJLmlkeCA9IDAsCi0JCS5pZCA9IEFQUl9TVkNfQUZFLAotCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKLQl9LAotCXsKLQkJLm5hbWUgPSAiQVNNIiwKLQkJLmlkeCA9IDEsCi0JCS5pZCA9IEFQUl9TVkNfQVNNLAotCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKLQl9LAotCXsKLQkJLm5hbWUgPSAiQURNIiwKLQkJLmlkeCA9IDIsCi0JCS5pZCA9IEFQUl9TVkNfQURNLAotCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKLQl9LAotCXsKLQkJLm5hbWUgPSAiQ09SRSIsCi0JCS5pZHggPSAzLAotCQkuaWQgPSBBUFJfU1ZDX0FEU1BfQ09SRSwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfQVVESU8sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlRFU1QiLAotCQkuaWR4ID0gNCwKLQkJLmlkID0gQVBSX1NWQ19URVNUX0NMSUVOVCwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfQVVESU8sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1WTSIsCi0JCS5pZHggPSA1LAotCQkuaWQgPSBBUFJfU1ZDX0FEU1BfTVZNLAotCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKLQl9LAotCXsKLQkJLm5hbWUgPSAiQ1ZTIiwKLQkJLmlkeCA9IDYsCi0JCS5pZCA9IEFQUl9TVkNfQURTUF9DVlMsCi0JCS5jbGllbnRfaWQgPSBBUFJfQ0xJRU5UX0FVRElPLAotCX0sCi0JewotCQkubmFtZSA9ICJDVlAiLAotCQkuaWR4ID0gNywKLQkJLmlkID0gQVBSX1NWQ19BRFNQX0NWUCwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfQVVESU8sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlVTTSIsCi0JCS5pZHggPSA4LAotCQkuaWQgPSBBUFJfU1ZDX1VTTSwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfQVVESU8sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlZJREMiLAotCQkuaWR4ID0gOSwKLQkJLmlkID0gQVBSX1NWQ19WSURDLAotCX0sCi0JewotCQkubmFtZSA9ICJMU00iLAotCQkuaWR4ID0gMTAsCi0JCS5pZCA9IEFQUl9TVkNfTFNNLAotCQkuY2xpZW50X2lkID0gQVBSX0NMSUVOVF9BVURJTywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhcHJfc3ZjX3RhYmxlIHN2Y190Ymxfdm9pY2VbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIlZTTSIsCi0JCS5pZHggPSAwLAotCQkuaWQgPSBBUFJfU1ZDX1ZTTSwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlZQTSIsCi0JCS5pZHggPSAxLAotCQkuaWQgPSBBUFJfU1ZDX1ZQTSwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1WUyIsCi0JCS5pZHggPSAyLAotCQkuaWQgPSBBUFJfU1ZDX01WUywKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1WTSIsCi0JCS5pZHggPSAzLAotCQkuaWQgPSBBUFJfU1ZDX01WTSwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkNWUyIsCi0JCS5pZHggPSA0LAotCQkuaWQgPSBBUFJfU1ZDX0NWUywKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkNWUCIsCi0JCS5pZHggPSA1LAotCQkuaWQgPSBBUFJfU1ZDX0NWUCwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlNSRCIsCi0JCS5pZHggPSA2LAotCQkuaWQgPSBBUFJfU1ZDX1NSRCwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlRFU1QiLAotCQkuaWR4ID0gNywKLQkJLmlkID0gQVBSX1NWQ19URVNUX0NMSUVOVCwKLQkJLmNsaWVudF9pZCA9IEFQUl9DTElFTlRfVk9JQ0UsCi0JfSwKLX07Ci0KLWVudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfZ2V0X21vZGVtX3N0YXRlKHZvaWQpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZxNi5tb2RlbV9zdGF0ZSk7Ci19Ci0KLXZvaWQgYXByX3NldF9tb2RlbV9zdGF0ZShlbnVtIGFwcl9zdWJzeXNfc3RhdGUgc3RhdGUpCi17Ci0JYXRvbWljX3NldCgmcTYubW9kZW1fc3RhdGUsIHN0YXRlKTsKLX0KLQotZW51bSBhcHJfc3Vic3lzX3N0YXRlIGFwcl9jbXB4Y2hnX21vZGVtX3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBwcmV2LAotCQkJCQkgICAgICBlbnVtIGFwcl9zdWJzeXNfc3RhdGUgbmV3KQotewotCXJldHVybiBhdG9taWNfY21weGNoZygmcTYubW9kZW1fc3RhdGUsIHByZXYsIG5ldyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwcl9tb2RlbV9kb3duKHVuc2lnbmVkIGxvbmcgb3Bjb2RlKQotewotCWFwcl9zZXRfbW9kZW1fc3RhdGUoQVBSX1NVQlNZU19ET1dOKTsKLQlkaXNwYXRjaF9ldmVudChvcGNvZGUsIEFQUl9ERVNUX01PREVNKTsKLX0KLQotc3RhdGljIHZvaWQgYXByX21vZGVtX3VwKHZvaWQpCi17Ci0JaWYgKGFwcl9jbXB4Y2hnX21vZGVtX3N0YXRlKEFQUl9TVUJTWVNfRE9XTiwgQVBSX1NVQlNZU19VUCkgPT0KLQkJCQkJCQlBUFJfU1VCU1lTX0RPV04pCi0JCXdha2VfdXAoJm1vZGVtX3dhaXQpOwotCWlzX21vZGVtX3VwID0gMTsKLX0KLQotZW51bSBhcHJfc3Vic3lzX3N0YXRlIGFwcl9nZXRfcTZfc3RhdGUodm9pZCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJnE2LnE2X3N0YXRlKTsKLX0KLUVYUE9SVF9TWU1CT0woYXByX2dldF9xNl9zdGF0ZSk7Ci0KLWludCBhcHJfc2V0X3E2X3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSkKLXsKLQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgYWRzcCBzdGF0ZSAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKLQlpZiAoc3RhdGUgPCBBUFJfU1VCU1lTX0RPV04gfHwgc3RhdGUgPiBBUFJfU1VCU1lTX0xPQURFRCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JYXRvbWljX3NldCgmcTYucTZfc3RhdGUsIHN0YXRlKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woYXByX3NldF9xNl9zdGF0ZSk7Ci0KLWVudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfY21weGNoZ19xNl9zdGF0ZShlbnVtIGFwcl9zdWJzeXNfc3RhdGUgcHJldiwKLQkJCQkJICAgZW51bSBhcHJfc3Vic3lzX3N0YXRlIG5ldykKLXsKLQlyZXR1cm4gYXRvbWljX2NtcHhjaGcoJnE2LnE2X3N0YXRlLCBwcmV2LCBuZXcpOwotfQotCi1zdGF0aWMgdm9pZCBhcHJfYWRzcF9kb3duKHVuc2lnbmVkIGxvbmcgb3Bjb2RlKQotewotCWFwcl9zZXRfcTZfc3RhdGUoQVBSX1NVQlNZU19ET1dOKTsKLQlkaXNwYXRjaF9ldmVudChvcGNvZGUsIEFQUl9ERVNUX1FEU1A2KTsKLX0KLQotc3RhdGljIHZvaWQgYXByX2Fkc3BfdXAodm9pZCkKLXsKLQlpZiAoYXByX2NtcHhjaGdfcTZfc3RhdGUoQVBSX1NVQlNZU19ET1dOLCBBUFJfU1VCU1lTX0xPQURFRCkgPT0KLQkJCQkJCQlBUFJfU1VCU1lTX0RPV04pCi0JCXdha2VfdXAoJmRzcF93YWl0KTsKLX0KLQotaW50IGFwcl93YWl0X2Zvcl9kZXZpY2VfdXAoaW50IGRlc3RfaWQpCi17Ci0JaW50IHJjID0gLTE7Ci0KLQlpZiAoZGVzdF9pZCA9PSBBUFJfREVTVF9NT0RFTSkKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChtb2RlbV93YWl0LAotCQkJCSAgICAoYXByX2dldF9tb2RlbV9zdGF0ZSgpID09IEFQUl9TVUJTWVNfVVApLAotCQkJCSAgICAoMSAqIEhaKSk7Ci0JZWxzZSBpZiAoZGVzdF9pZCA9PSBBUFJfREVTVF9RRFNQNikKLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkc3Bfd2FpdCwKLQkJCQkgICAgKGFwcl9nZXRfcTZfc3RhdGUoKSA9PSBBUFJfU1VCU1lTX1VQKSwKLQkJCQkgICAgKDEgKiBIWikpOwotCWVsc2UKLQkJcHJfZXJyKCIlczogdW5rbm93biBkZXN0X2lkICVkXG4iLCBfX2Z1bmNfXywgZGVzdF9pZCk7Ci0JLyogcmV0dXJucyBsZWZ0IHRpbWUgKi8KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhcHJfbG9hZF9hZHNwX2ltYWdlKHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQotCW11dGV4X2xvY2soJnE2LmxvY2spOwotCWlmIChhcHJfZ2V0X3E2X3N0YXRlKCkgPT0gQVBSX1NVQlNZU19VUCkgewotCQlxNi5waWwgPSBzdWJzeXN0ZW1fZ2V0KCJhZHNwIik7Ci0JCWlmIChJU19FUlIocTYucGlsKSkgewotCQkJcmMgPSBQVFJfRVJSKHE2LnBpbCk7Ci0JCQlwcl9lcnIoIkFQUjogVW5hYmxlIHRvIGxvYWQgcTYgaW1hZ2UsIGVycm9yOiVkXG4iLCByYyk7Ci0JCX0gZWxzZSB7Ci0JCQlhcHJfc2V0X3E2X3N0YXRlKEFQUl9TVUJTWVNfTE9BREVEKTsKLQkJCXByX2RlYnVnKCJBUFI6IEltYWdlIGlzIGxvYWRlZCwgc3RhdGVkXG4iKTsKLQkJfQotCX0gZWxzZSBpZiAoYXByX2dldF9xNl9zdGF0ZSgpID09IEFQUl9TVUJTWVNfTE9BREVEKSB7Ci0JCXByX2RlYnVnKCJBUFI6IHE2IGltYWdlIGFscmVhZHkgbG9hZGVkXG4iKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiQVBSOiBjYW5ub3QgbG9hZCBzdGF0ZSAlZFxuIiwgYXByX2dldF9xNl9zdGF0ZSgpKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZxNi5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0cnVjdCBhcHJfY2xpZW50ICphcHJfZ2V0X2NsaWVudChpbnQgZGVzdF9pZCwgaW50IGNsaWVudF9pZCkKLXsKLQlyZXR1cm4gJmNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdOwotfQotCi1pbnQgYXByX3NlbmRfcGt0KHZvaWQgKmhhbmRsZSwgdWludDMyX3QgKmJ1ZikKLXsKLQlzdHJ1Y3QgYXByX3N2YyAqc3ZjID0gaGFuZGxlOwotCXN0cnVjdCBhcHJfY2xpZW50ICpjbG50OwotCXN0cnVjdCBhcHJfaGRyICpoZHI7Ci0JdWludDE2X3QgZGVzdF9pZDsKLQl1aW50MTZfdCBjbGllbnRfaWQ7Ci0JdWludDE2X3Qgd19sZW47Ci0JaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWhhbmRsZSB8fCAhYnVmKSB7Ci0JCXByX2VycigiQVBSOiBXcm9uZyBwYXJhbWV0ZXJzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChzdmMtPm5lZWRfcmVzZXQpIHsKLQkJcHJfZXJyKCJhcHI6IHNlbmRfcGt0IHNlcnZpY2UgbmVlZCByZXNldFxuIik7Ci0JCXJldHVybiAtRU5FVFJFU0VUOwotCX0KLQotCWlmICgoc3ZjLT5kZXN0X2lkID09IEFQUl9ERVNUX1FEU1A2KSAmJgotCSAgICAoYXByX2dldF9xNl9zdGF0ZSgpICE9IEFQUl9TVUJTWVNfTE9BREVEKSkgewotCQlwcl9lcnIoIiVzOiBTdGlsbCBkc3AgaXMgbm90IFVwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5FVFJFU0VUOwotCX0gZWxzZSBpZiAoKHN2Yy0+ZGVzdF9pZCA9PSBBUFJfREVTVF9NT0RFTSkgJiYKLQkJICAgKGFwcl9nZXRfbW9kZW1fc3RhdGUoKSA9PSBBUFJfU1VCU1lTX0RPV04pKSB7Ci0JCXByX2VycigiYXByOiBTdGlsbCBNb2RlbSBpcyBub3QgVXBcbiIpOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZjLT53X2xvY2ssIGZsYWdzKTsKLQlkZXN0X2lkID0gc3ZjLT5kZXN0X2lkOwotCWNsaWVudF9pZCA9IHN2Yy0+Y2xpZW50X2lkOwotCWNsbnQgPSAmY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF07Ci0KLQlpZiAoIWNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdLmhhbmRsZSkgewotCQlwcl9lcnIoIkFQUjogU3RpbGwgc2VydmljZSBpcyBub3QgeWV0IG9wZW5lZFxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2Yy0+d19sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQloZHIgPSAoc3RydWN0IGFwcl9oZHIgKilidWY7Ci0KLQloZHItPnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JaGRyLT5zcmNfc3ZjID0gc3ZjLT5pZDsKLQloZHItPmRlc3RfZG9tYWluID0gc3ZjLT5kZXN0X2RvbWFpbjsKLQloZHItPmRlc3Rfc3ZjID0gc3ZjLT5pZDsKLQotCWlmICh1bmxpa2VseShhcHJfY2ZfZGVidWcpKSB7Ci0JCUFQUl9QS1RfSU5GTygKLQkJIlR4OiBzcmNfYWRkclsweCVYXSBkZXN0X2FkZHJbMHglWF0gb3Bjb2RlWzB4JVhdIHRva2VuWzB4JVhdIiwKLQkJKGhkci0+c3JjX2RvbWFpbiA8PCA4KSB8IGhkci0+c3JjX3N2YywKLQkJKGhkci0+ZGVzdF9kb21haW4gPDwgOCkgfCBoZHItPmRlc3Rfc3ZjLCBoZHItPm9wY29kZSwKLQkJaGRyLT50b2tlbik7Ci0JfQotCi0JcmMgPSBhcHJfdGFsX3dyaXRlKGNsbnQtPmhhbmRsZSwgYnVmLAotCQkJKHN0cnVjdCBhcHJfcGt0X3ByaXYgKikmc3ZjLT5wa3Rfb3duZXIsCi0JCQloZHItPnBrdF9zaXplKTsKLQlpZiAocmMgPj0gMCkgewotCQl3X2xlbiA9IHJjOwotCQlpZiAod19sZW4gIT0gaGRyLT5wa3Rfc2l6ZSkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHdyaXRlIHdob2xlIEFQUiBwa3Qgc3VjY2Vzc2Z1bGx5OiAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogV3JpdGUgQVBSIHBrdCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2Yy0+d19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhcHJfcGt0X2NvbmZpZyh2b2lkICpoYW5kbGUsIHN0cnVjdCBhcHJfcGt0X2NmZyAqY2ZnKQotewotCXN0cnVjdCBhcHJfc3ZjICpzdmMgPSAoc3RydWN0IGFwcl9zdmMgKiloYW5kbGU7Ci0JdWludDE2X3QgZGVzdF9pZDsKLQl1aW50MTZfdCBjbGllbnRfaWQ7Ci0Jc3RydWN0IGFwcl9jbGllbnQgKmNsbnQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3ZjLT5uZWVkX3Jlc2V0KSB7Ci0JCXByX2VycigiJXM6IHNlcnZpY2UgbmVlZCByZXNldFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0KLQlzdmMtPnBrdF9vd25lciA9IGNmZy0+cGt0X293bmVyOwotCWRlc3RfaWQgPSBzdmMtPmRlc3RfaWQ7Ci0JY2xpZW50X2lkID0gc3ZjLT5jbGllbnRfaWQ7Ci0JY2xudCA9ICZjbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXTsKLQotCXJldHVybiBhcHJfdGFsX3J4X2ludGVudHNfY29uZmlnKGNsbnQtPmhhbmRsZSwKLQkJY2ZnLT5pbnRlbnRzLm51bV9vZl9pbnRlbnRzLCBjZmctPmludGVudHMuc2l6ZSk7Ci19Ci0KLXN0cnVjdCBhcHJfc3ZjICphcHJfcmVnaXN0ZXIoY2hhciAqZGVzdCwgY2hhciAqc3ZjX25hbWUsIGFwcl9mbiBzdmNfZm4sCi0JCQkJdWludDMyX3Qgc3JjX3BvcnQsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGFwcl9jbGllbnQgKmNsbnQ7Ci0JaW50IGNsaWVudF9pZCA9IDA7Ci0JaW50IHN2Y19pZHggPSAwOwotCWludCBzdmNfaWQgPSAwOwotCWludCBkZXN0X2lkID0gMDsKLQlpbnQgZG9tYWluX2lkID0gMDsKLQlpbnQgdGVtcF9wb3J0ID0gMDsKLQlzdHJ1Y3QgYXByX3N2YyAqc3ZjID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWJvb2wgY2FuX29wZW5fY2hhbm5lbCA9IHRydWU7Ci0KLQlpZiAoIWRlc3QgfHwgIXN2Y19uYW1lIHx8ICFzdmNfZm4pCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCFzdHJjbXAoZGVzdCwgIkFEU1AiKSkKLQkJZG9tYWluX2lkID0gQVBSX0RPTUFJTl9BRFNQOwotCWVsc2UgaWYgKCFzdHJjbXAoZGVzdCwgIk1PREVNIikpIHsKLQkJLyogRG9uJ3QgcmVxdWVzdCBmb3IgU01EIGNoYW5uZWxzIGlmIGRlc3RpbmF0aW9uIGlzIE1PREVNLAotCQkgKiBhcyB0aGVzZSBjaGFubmVscyBhcmUgbm8gbG9uZ2VyIHVzZWQgYW5kIHRoZXNlIGNsaWVudHMKLQkJICogYXJlIHRvIGxpc3RlbiBvbmx5IGZvciBNT0RFTSBTU1IgZXZlbnRzCi0JCSAqLwotCQljYW5fb3Blbl9jaGFubmVsID0gZmFsc2U7Ci0JCWRvbWFpbl9pZCA9IEFQUl9ET01BSU5fTU9ERU07Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJBUFI6IHdyb25nIGRlc3RpbmF0aW9uXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQotCWRlc3RfaWQgPSBhcHJfZ2V0X2Rlc3RfaWQoZGVzdCk7Ci0KLQlpZiAoZGVzdF9pZCA9PSBBUFJfREVTVF9RRFNQNikgewotCQlpZiAoYXByX2dldF9xNl9zdGF0ZSgpICE9IEFQUl9TVUJTWVNfTE9BREVEKSB7Ci0JCQlwcl9lcnIoIiVzOiBhZHNwIG5vdCB1cFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBhZHNwIFVwXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIGlmIChkZXN0X2lkID09IEFQUl9ERVNUX01PREVNKSB7Ci0JCWlmIChhcHJfZ2V0X21vZGVtX3N0YXRlKCkgPT0gQVBSX1NVQlNZU19ET1dOKSB7Ci0JCQlpZiAoaXNfbW9kZW1fdXApIHsKLQkJCQlwcl9lcnIoIiVzOiBtb2RlbSBzaHV0ZG93biBkdWUgdG8gU1NSLCByZXQiLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlwcl9kZWJ1ZygiJXM6IFdhaXQgZm9yIG1vZGVtIHRvIGJvb3R1cFxuIiwgX19mdW5jX18pOwotCQkJcmMgPSBhcHJfd2FpdF9mb3JfZGV2aWNlX3VwKEFQUl9ERVNUX01PREVNKTsKLQkJCWlmIChyYyA9PSAwKSB7Ci0JCQkJcHJfZXJyKCIlczogTW9kZW0gaXMgbm90IFVwXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBtb2RlbSBVcFxuIiwgX19mdW5jX18pOwotCX0KLQotCWlmIChhcHJfZ2V0X3N2YyhzdmNfbmFtZSwgZG9tYWluX2lkLCAmY2xpZW50X2lkLCAmc3ZjX2lkeCwgJnN2Y19pZCkpIHsKLQkJcHJfZXJyKCIlczogYXByX2dldF9zdmMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljbG50ID0gJmNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdOwotCW11dGV4X2xvY2soJmNsbnQtPm1fbG9jayk7Ci0JaWYgKCFjbG50LT5oYW5kbGUgJiYgY2FuX29wZW5fY2hhbm5lbCkgewotCQljbG50LT5oYW5kbGUgPSBhcHJfdGFsX29wZW4oY2xpZW50X2lkLCBkZXN0X2lkLAotCQkJCUFQUl9ETF9TTUQsIGFwcl9jYl9mdW5jLCBOVUxMKTsKLQkJaWYgKCFjbG50LT5oYW5kbGUpIHsKLQkJCXN2YyA9IE5VTEw7Ci0JCQlwcl9lcnIoIkFQUjogVW5hYmxlIHRvIG9wZW4gaGFuZGxlXG4iKTsKLQkJCW11dGV4X3VubG9jaygmY2xudC0+bV9sb2NrKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNsbnQtPm1fbG9jayk7Ci0Jc3ZjID0gJmNsbnQtPnN2Y1tzdmNfaWR4XTsKLQltdXRleF9sb2NrKCZzdmMtPm1fbG9jayk7Ci0JY2xudC0+aWQgPSBjbGllbnRfaWQ7Ci0JaWYgKHN2Yy0+bmVlZF9yZXNldCkgewotCQltdXRleF91bmxvY2soJnN2Yy0+bV9sb2NrKTsKLQkJcHJfZXJyKCJBUFI6IFNlcnZpY2UgbmVlZHMgcmVzZXRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXN2Yy0+aWQgPSBzdmNfaWQ7Ci0Jc3ZjLT5kZXN0X2lkID0gZGVzdF9pZDsKLQlzdmMtPmNsaWVudF9pZCA9IGNsaWVudF9pZDsKLQlzdmMtPmRlc3RfZG9tYWluID0gZG9tYWluX2lkOwotCXN2Yy0+cGt0X293bmVyID0gQVBSX1BLVF9PV05FUl9EUklWRVI7Ci0KLQlpZiAoc3JjX3BvcnQgIT0gMHhGRkZGRkZGRikgewotCQl0ZW1wX3BvcnQgPSAoKHNyY19wb3J0ID4+IDgpICogOCkgKyAoc3JjX3BvcnQgJiAweEZGKTsKLQkJcHJfZGVidWcoInBvcnQgPSAlZCB0X3BvcnQgPSAlZFxuIiwgc3JjX3BvcnQsIHRlbXBfcG9ydCk7Ci0JCWlmICh0ZW1wX3BvcnQgPj0gQVBSX01BWF9QT1JUUyB8fCB0ZW1wX3BvcnQgPCAwKSB7Ci0JCQlwcl9lcnIoIkFQUjogdGVtcF9wb3J0IG91dCBvZiBib3VuZHNcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZzdmMtPm1fbG9jayk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIXN2Yy0+c3ZjX2NudCkKLQkJCWNsbnQtPnN2Y19jbnQrKzsKLQkJc3ZjLT5wb3J0X2NudCsrOwotCQlzdmMtPnBvcnRfZm5bdGVtcF9wb3J0XSA9IHN2Y19mbjsKLQkJc3ZjLT5wb3J0X3ByaXZbdGVtcF9wb3J0XSA9IHByaXY7Ci0JCXN2Yy0+c3ZjX2NudCsrOwotCX0gZWxzZSB7Ci0JCWlmICghc3ZjLT5mbikgewotCQkJaWYgKCFzdmMtPnN2Y19jbnQpCi0JCQkJY2xudC0+c3ZjX2NudCsrOwotCQkJc3ZjLT5mbiA9IHN2Y19mbjsKLQkJCXN2Yy0+cHJpdiA9IHByaXY7Ci0JCQlzdmMtPnN2Y19jbnQrKzsKLQkJfQotCX0KLQotCW11dGV4X3VubG9jaygmc3ZjLT5tX2xvY2spOwotZG9uZToKLQlyZXR1cm4gc3ZjOwotfQotCi0KLXZvaWQgYXByX2NiX2Z1bmModm9pZCAqYnVmLCBpbnQgbGVuLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBhcHJfY2xpZW50X2RhdGEgZGF0YTsKLQlzdHJ1Y3QgYXByX2NsaWVudCAqYXByX2NsaWVudDsKLQlzdHJ1Y3QgYXByX3N2YyAqY19zdmM7Ci0Jc3RydWN0IGFwcl9oZHIgKmhkcjsKLQl1aW50MTZfdCBoZHJfc2l6ZTsKLQl1aW50MTZfdCBtc2dfdHlwZTsKLQl1aW50MTZfdCB2ZXI7Ci0JdWludDE2X3Qgc3JjOwotCXVpbnQxNl90IHN2YzsKLQl1aW50MTZfdCBjbG50OwotCWludCBpOwotCWludCB0ZW1wX3BvcnQgPSAwOwotCXVpbnQzMl90ICpwdHI7Ci0KLQlwcl9kZWJ1ZygiQVBSMjogbGVuID0gJWRcbiIsIGxlbik7Ci0JcHRyID0gYnVmOwotCXByX2RlYnVnKCJcbioqKioqKioqKioqKioqKioqXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuLzQ7IGkrKykKLQkJcHJfZGVidWcoIiV4ICAiLCBwdHJbaV0pOwotCXByX2RlYnVnKCJcbiIpOwotCXByX2RlYnVnKCJcbioqKioqKioqKioqKioqKioqXG4iKTsKLQotCWlmICghYnVmIHx8IGxlbiA8PSBBUFJfSERSX1NJWkUpIHsKLQkJcHJfZXJyKCJBUFI6IEltcHJvcGVyIGFwciBwa3QgcmVjZWl2ZWQ6JXBLICVkXG4iLCBidWYsIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0JaGRyID0gYnVmOwotCi0JdmVyID0gaGRyLT5oZHJfZmllbGQ7Ci0JdmVyID0gKHZlciAmIDB4MDAwRik7Ci0JaWYgKHZlciA+IEFQUl9QS1RfVkVSICsgMSkgewotCQlwcl9lcnIoIkFQUjogV3JvbmcgdmVyc2lvbjogJWRcbiIsIHZlcik7Ci0JCXJldHVybjsKLQl9Ci0KLQloZHJfc2l6ZSA9IGhkci0+aGRyX2ZpZWxkOwotCWhkcl9zaXplID0gKChoZHJfc2l6ZSAmIDB4MDBGMCkgPj4gMHg0KSAqIDQ7Ci0JaWYgKGhkcl9zaXplIDwgQVBSX0hEUl9TSVpFKSB7Ci0JCXByX2VycigiQVBSOiBXcm9uZyBoZHIgc2l6ZTolZFxuIiwgaGRyX3NpemUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGhkci0+cGt0X3NpemUgPCBBUFJfSERSX1NJWkUpIHsKLQkJcHJfZXJyKCJBUFI6IFdyb25nIHBha2V0IHNpemVcbiIpOwotCQlyZXR1cm47Ci0JfQotCW1zZ190eXBlID0gaGRyLT5oZHJfZmllbGQ7Ci0JbXNnX3R5cGUgPSAobXNnX3R5cGUgPj4gMHgwOCkgJiAweDAwMDM7Ci0JaWYgKG1zZ190eXBlID49IEFQUl9NU0dfVFlQRV9NQVggJiYgbXNnX3R5cGUgIT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKLQkJcHJfZXJyKCJBUFI6IFdyb25nIG1lc3NhZ2UgdHlwZTogJWRcbiIsIG1zZ190eXBlKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChoZHItPnNyY19kb21haW4gPj0gQVBSX0RPTUFJTl9NQVggfHwKLQkJaGRyLT5kZXN0X2RvbWFpbiA+PSBBUFJfRE9NQUlOX01BWCB8fAotCQloZHItPnNyY19zdmMgPj0gQVBSX1NWQ19NQVggfHwKLQkJaGRyLT5kZXN0X3N2YyA+PSBBUFJfU1ZDX01BWCkgewotCQlwcl9lcnIoIkFQUjogV3JvbmcgQVBSIGhlYWRlclxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzdmMgPSBoZHItPmRlc3Rfc3ZjOwotCWlmIChoZHItPnNyY19kb21haW4gPT0gQVBSX0RPTUFJTl9NT0RFTSkgewotCQlpZiAoc3ZjID09IEFQUl9TVkNfTVZTIHx8IHN2YyA9PSBBUFJfU1ZDX01WTSB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfQ1ZTIHx8IHN2YyA9PSBBUFJfU1ZDX0NWUCB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfVEVTVF9DTElFTlQpCi0JCQljbG50ID0gQVBSX0NMSUVOVF9WT0lDRTsKLQkJZWxzZSB7Ci0JCQlwcl9lcnIoIkFQUjogV3Jvbmcgc3ZjIDolZFxuIiwgc3ZjKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSBpZiAoaGRyLT5zcmNfZG9tYWluID09IEFQUl9ET01BSU5fQURTUCkgewotCQlpZiAoc3ZjID09IEFQUl9TVkNfQUZFIHx8IHN2YyA9PSBBUFJfU1ZDX0FTTSB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfVlNNIHx8IHN2YyA9PSBBUFJfU1ZDX1ZQTSB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfQURNIHx8IHN2YyA9PSBBUFJfU1ZDX0FEU1BfQ09SRSB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfVVNNIHx8Ci0JCSAgICBzdmMgPT0gQVBSX1NWQ19URVNUX0NMSUVOVCB8fCBzdmMgPT0gQVBSX1NWQ19BRFNQX01WTSB8fAotCQkgICAgc3ZjID09IEFQUl9TVkNfQURTUF9DVlMgfHwgc3ZjID09IEFQUl9TVkNfQURTUF9DVlAgfHwKLQkJICAgIHN2YyA9PSBBUFJfU1ZDX0xTTSkKLQkJCWNsbnQgPSBBUFJfQ0xJRU5UX0FVRElPOwotCQllbHNlIGlmIChzdmMgPT0gQVBSX1NWQ19WSURDKQotCQkJY2xudCA9IEFQUl9DTElFTlRfQVVESU87Ci0JCWVsc2UgewotCQkJcHJfZXJyKCJBUFI6IFdyb25nIHN2YyA6JWRcbiIsIHN2Yyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIkFQUjogUGt0IGZyb20gd3Jvbmcgc291cmNlOiAlZFxuIiwgaGRyLT5zcmNfZG9tYWluKTsKLQkJcmV0dXJuOwotCX0KLQotCXNyYyA9IGFwcl9nZXRfZGF0YV9zcmMoaGRyKTsKLQlpZiAoc3JjID09IEFQUl9ERVNUX01BWCkKLQkJcmV0dXJuOwotCi0JcHJfZGVidWcoInNyYyA9JWQgY2xudCA9ICVkXG4iLCBzcmMsIGNsbnQpOwotCWFwcl9jbGllbnQgPSAmY2xpZW50W3NyY11bY2xudF07Ci0JZm9yIChpID0gMDsgaSA8IEFQUl9TVkNfTUFYOyBpKyspCi0JCWlmIChhcHJfY2xpZW50LT5zdmNbaV0uaWQgPT0gc3ZjKSB7Ci0JCQlwcl9kZWJ1ZygiJWRcbiIsIGFwcl9jbGllbnQtPnN2Y1tpXS5pZCk7Ci0JCQljX3N2YyA9ICZhcHJfY2xpZW50LT5zdmNbaV07Ci0JCQlicmVhazsKLQkJfQotCi0JaWYgKGkgPT0gQVBSX1NWQ19NQVgpIHsKLQkJcHJfZXJyKCJBUFI6IHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCXByX2RlYnVnKCJzdmNfaWR4ID0gJWRcbiIsIGkpOwotCXByX2RlYnVnKCIleCAleCAleCAlcEsgJXBLXG4iLCBjX3N2Yy0+aWQsIGNfc3ZjLT5kZXN0X2lkLAotCQkgY19zdmMtPmNsaWVudF9pZCwgY19zdmMtPmZuLCBjX3N2Yy0+cHJpdik7Ci0JZGF0YS5wYXlsb2FkX3NpemUgPSBoZHItPnBrdF9zaXplIC0gaGRyX3NpemU7Ci0JZGF0YS5vcGNvZGUgPSBoZHItPm9wY29kZTsKLQlkYXRhLnNyYyA9IHNyYzsKLQlkYXRhLnNyY19wb3J0ID0gaGRyLT5zcmNfcG9ydDsKLQlkYXRhLmRlc3RfcG9ydCA9IGhkci0+ZGVzdF9wb3J0OwotCWRhdGEudG9rZW4gPSBoZHItPnRva2VuOwotCWRhdGEubXNnX3R5cGUgPSBtc2dfdHlwZTsKLQlkYXRhLnBheWxvYWQgPSBOVUxMOwotCWlmIChkYXRhLnBheWxvYWRfc2l6ZSA+IDApCi0JCWRhdGEucGF5bG9hZCA9IChjaGFyICopaGRyICsgaGRyX3NpemU7Ci0KLQlpZiAodW5saWtlbHkoYXByX2NmX2RlYnVnKSkgewotCQlpZiAoaGRyLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQgJiYgZGF0YS5wYXlsb2FkKSB7Ci0JCQl1aW50MzJfdCAqcHRyID0gZGF0YS5wYXlsb2FkOwotCi0JCQlBUFJfUEtUX0lORk8oCi0JCQkiUng6IHNyY19hZGRyWzB4JVhdIGRlc3RfYWRkclsweCVYXSBvcGNvZGVbMHglWF0gdG9rZW5bMHglWF0gcmNbMHglWF0iLAotCQkJKGhkci0+c3JjX2RvbWFpbiA8PCA4KSB8IGhkci0+c3JjX3N2YywKLQkJCShoZHItPmRlc3RfZG9tYWluIDw8IDgpIHwgaGRyLT5kZXN0X3N2YywKLQkJCWhkci0+b3Bjb2RlLCBoZHItPnRva2VuLCBwdHJbMV0pOwotCQl9IGVsc2UgewotCQkJQVBSX1BLVF9JTkZPKAotCQkJIlJ4OiBzcmNfYWRkclsweCVYXSBkZXN0X2FkZHJbMHglWF0gb3Bjb2RlWzB4JVhdIHRva2VuWzB4JVhdIiwKLQkJCShoZHItPnNyY19kb21haW4gPDwgOCkgfCBoZHItPnNyY19zdmMsCi0JCQkoaGRyLT5kZXN0X2RvbWFpbiA8PCA4KSB8IGhkci0+ZGVzdF9zdmMsIGhkci0+b3Bjb2RlLAotCQkJaGRyLT50b2tlbik7Ci0JCX0KLQl9Ci0KLQl0ZW1wX3BvcnQgPSAoKGRhdGEuZGVzdF9wb3J0ID4+IDgpICogOCkgKyAoZGF0YS5kZXN0X3BvcnQgJiAweEZGKTsKLQlwcl9kZWJ1ZygicG9ydCA9ICVkIHRfcG9ydCA9ICVkXG4iLCBkYXRhLnNyY19wb3J0LCB0ZW1wX3BvcnQpOwotCWlmIChjX3N2Yy0+cG9ydF9jbnQgJiYgY19zdmMtPnBvcnRfZm5bdGVtcF9wb3J0XSkKLQkJY19zdmMtPnBvcnRfZm5bdGVtcF9wb3J0XSgmZGF0YSwgIGNfc3ZjLT5wb3J0X3ByaXZbdGVtcF9wb3J0XSk7Ci0JZWxzZSBpZiAoY19zdmMtPmZuKQotCQljX3N2Yy0+Zm4oJmRhdGEsIGNfc3ZjLT5wcml2KTsKLQllbHNlCi0JCXByX2VycigiQVBSOiBSeGVkIGEgcGFja2V0IGZvciBOVUxMIGNhbGxiYWNrXG4iKTsKLX0KLQotaW50IGFwcl9nZXRfc3ZjKGNvbnN0IGNoYXIgKnN2Y19uYW1lLCBpbnQgZG9tYWluX2lkLCBpbnQgKmNsaWVudF9pZCwKLQkJaW50ICpzdmNfaWR4LCBpbnQgKnN2Y19pZCkKLXsKLQlpbnQgaTsKLQlpbnQgc2l6ZTsKLQlzdHJ1Y3QgYXByX3N2Y190YWJsZSAqdGJsOwotCWludCByZXQgPSAwOwotCi0JaWYgKGRvbWFpbl9pZCA9PSBBUFJfRE9NQUlOX0FEU1ApIHsKLQkJdGJsID0gKHN0cnVjdCBhcHJfc3ZjX3RhYmxlICopJnN2Y190YmxfcWRzcDY7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHN2Y190YmxfcWRzcDYpOwotCX0gZWxzZSB7Ci0JCXRibCA9IChzdHJ1Y3QgYXByX3N2Y190YWJsZSAqKSZzdmNfdGJsX3ZvaWNlOwotCQlzaXplID0gQVJSQVlfU0laRShzdmNfdGJsX3ZvaWNlKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWlmICghc3RyY21wKHN2Y19uYW1lLCB0YmxbaV0ubmFtZSkpIHsKLQkJCSpjbGllbnRfaWQgPSB0YmxbaV0uY2xpZW50X2lkOwotCQkJKnN2Y19pZHggPSB0YmxbaV0uaWR4OwotCQkJKnN2Y19pZCA9IHRibFtpXS5pZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzdmNfbmFtZSA9ICVzIGNfaWQgPSAlZCBkb21haW5faWQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBzdmNfbmFtZSwgKmNsaWVudF9pZCwgZG9tYWluX2lkKTsKLQlpZiAoaSA9PSBzaXplKSB7Ci0JCXByX2VycigiJXM6IEFQUjogV3Jvbmcgc3ZjIG5hbWUgJXNcbiIsIF9fZnVuY19fLCBzdmNfbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYXByX3Jlc2V0X2RlcmVnaXN0ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhcHJfc3ZjICpoYW5kbGUgPSBOVUxMOwotCXN0cnVjdCBhcHJfcmVzZXRfd29yayAqYXByX3Jlc2V0ID0KLQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXByX3Jlc2V0X3dvcmssIHdvcmspOwotCi0JaGFuZGxlID0gYXByX3Jlc2V0LT5oYW5kbGU7Ci0JcHJfZGVidWcoIiVzOmhhbmRsZVslcEtdXG4iLCBfX2Z1bmNfXywgaGFuZGxlKTsKLQlhcHJfZGVyZWdpc3RlcihoYW5kbGUpOwotCWtmcmVlKGFwcl9yZXNldCk7Ci19Ci0KLWludCBhcHJfZGVyZWdpc3Rlcih2b2lkICpoYW5kbGUpCi17Ci0Jc3RydWN0IGFwcl9zdmMgKnN2YyA9IGhhbmRsZTsKLQlzdHJ1Y3QgYXByX2NsaWVudCAqY2xudDsKLQl1aW50MTZfdCBkZXN0X2lkOwotCXVpbnQxNl90IGNsaWVudF9pZDsKLQotCWlmICghaGFuZGxlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJnN2Yy0+bV9sb2NrKTsKLQlpZiAoIXN2Yy0+c3ZjX2NudCkgewotCQlwcl9lcnIoIiVzOiBzdmMgYWxyZWFkeSBkZXJlZ2lzdGVyZWQuIHN2YyA9ICVwS1xuIiwKLQkJCV9fZnVuY19fLCBzdmMpOwotCQltdXRleF91bmxvY2soJnN2Yy0+bV9sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGVzdF9pZCA9IHN2Yy0+ZGVzdF9pZDsKLQljbGllbnRfaWQgPSBzdmMtPmNsaWVudF9pZDsKLQljbG50ID0gJmNsaWVudFtkZXN0X2lkXVtjbGllbnRfaWRdOwotCi0JaWYgKHN2Yy0+c3ZjX2NudCA+IDApIHsKLQkJaWYgKHN2Yy0+cG9ydF9jbnQpCi0JCQlzdmMtPnBvcnRfY250LS07Ci0JCXN2Yy0+c3ZjX2NudC0tOwotCQlpZiAoIXN2Yy0+c3ZjX2NudCkgewotCQkJY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uc3ZjX2NudC0tOwotCQkJcHJfZGVidWcoIiVzOiBzZXJ2aWNlIGlzIHJlc2V0ICVwS1xuIiwgX19mdW5jX18sIHN2Yyk7Ci0JCX0KLQl9Ci0KLQlpZiAoIXN2Yy0+c3ZjX2NudCkgewotCQlzdmMtPnByaXYgPSBOVUxMOwotCQlzdmMtPmlkID0gMDsKLQkJc3ZjLT5mbiA9IE5VTEw7Ci0JCXN2Yy0+ZGVzdF9pZCA9IDA7Ci0JCXN2Yy0+Y2xpZW50X2lkID0gMDsKLQkJc3ZjLT5uZWVkX3Jlc2V0ID0gMHgwOwotCX0KLQlpZiAoY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlICYmCi0JICAgICFjbGllbnRbZGVzdF9pZF1bY2xpZW50X2lkXS5zdmNfY250KSB7Ci0JCWFwcl90YWxfY2xvc2UoY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlKTsKLQkJY2xpZW50W2Rlc3RfaWRdW2NsaWVudF9pZF0uaGFuZGxlID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzdmMtPm1fbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBhcHJfcmVzZXQodm9pZCAqaGFuZGxlKQotewotCXN0cnVjdCBhcHJfcmVzZXRfd29yayAqYXByX3Jlc2V0X3dvcmtlciA9IE5VTEw7Ci0KLQlpZiAoIWhhbmRsZSkKLQkJcmV0dXJuOwotCXByX2RlYnVnKCIlczogaGFuZGxlWyVwS11cbiIsIF9fZnVuY19fLCBoYW5kbGUpOwotCi0JaWYgKGFwcl9yZXNldF93b3JrcXVldWUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhcHJfcmVzZXRfd29ya3F1ZXVlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWFwcl9yZXNldF93b3JrZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXByX3Jlc2V0X3dvcmspLAotCQkJCQkJCUdGUF9BVE9NSUMpOwotCi0JaWYgKGFwcl9yZXNldF93b3JrZXIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtZW0gZmFpbHVyZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JYXByX3Jlc2V0X3dvcmtlci0+aGFuZGxlID0gaGFuZGxlOwotCUlOSVRfV09SSygmYXByX3Jlc2V0X3dvcmtlci0+d29yaywgYXByX3Jlc2V0X2RlcmVnaXN0ZXIpOwotCXF1ZXVlX3dvcmsoYXByX3Jlc2V0X3dvcmtxdWV1ZSwgJmFwcl9yZXNldF93b3JrZXItPndvcmspOwotfQotCi0vKiBEaXNwYXRjaCB0aGUgUmVzZXQgZXZlbnRzIHRvIE1vZGVtIGFuZCBhdWRpbyBjbGllbnRzICovCi1zdGF0aWMgdm9pZCBkaXNwYXRjaF9ldmVudCh1bnNpZ25lZCBsb25nIGNvZGUsIHVpbnQxNl90IHByb2MpCi17Ci0Jc3RydWN0IGFwcl9jbGllbnQgKmFwcl9jbGllbnQ7Ci0Jc3RydWN0IGFwcl9jbGllbnRfZGF0YSBkYXRhOwotCXN0cnVjdCBhcHJfc3ZjICpzdmM7Ci0JdWludDE2X3QgY2xudDsKLQlpbnQgaSwgajsKLQotCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKLQlkYXRhLm9wY29kZSA9IFJFU0VUX0VWRU5UUzsKLQlkYXRhLnJlc2V0X2V2ZW50ID0gY29kZTsKLQotCS8qIFNlcnZpY2UgZG9tYWluIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcHJvY2Vzc29yICovCi0JZGF0YS5yZXNldF9wcm9jID0gYXByX2dldF9yZXNldF9kb21haW4ocHJvYyk7Ci0KLQljbG50ID0gQVBSX0NMSUVOVF9BVURJTzsKLQlhcHJfY2xpZW50ID0gJmNsaWVudFtwcm9jXVtjbG50XTsKLQlmb3IgKGkgPSAwOyBpIDwgQVBSX1NWQ19NQVg7IGkrKykgewotCQltdXRleF9sb2NrKCZhcHJfY2xpZW50LT5zdmNbaV0ubV9sb2NrKTsKLQkJaWYgKGFwcl9jbGllbnQtPnN2Y1tpXS5mbikgewotCQkJYXByX2NsaWVudC0+c3ZjW2ldLm5lZWRfcmVzZXQgPSAweDE7Ci0JCQlhcHJfY2xpZW50LT5zdmNbaV0uZm4oJmRhdGEsIGFwcl9jbGllbnQtPnN2Y1tpXS5wcml2KTsKLQkJfQotCQlpZiAoYXByX2NsaWVudC0+c3ZjW2ldLnBvcnRfY250KSB7Ci0JCQlzdmMgPSAmKGFwcl9jbGllbnQtPnN2Y1tpXSk7Ci0JCQlzdmMtPm5lZWRfcmVzZXQgPSAweDE7Ci0JCQlmb3IgKGogPSAwOyBqIDwgQVBSX01BWF9QT1JUUzsgaisrKQotCQkJCWlmIChzdmMtPnBvcnRfZm5bal0pCi0JCQkJCXN2Yy0+cG9ydF9mbltqXSgmZGF0YSwKLQkJCQkJCXN2Yy0+cG9ydF9wcml2W2pdKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFwcl9jbGllbnQtPnN2Y1tpXS5tX2xvY2spOwotCX0KLQotCWNsbnQgPSBBUFJfQ0xJRU5UX1ZPSUNFOwotCWFwcl9jbGllbnQgPSAmY2xpZW50W3Byb2NdW2NsbnRdOwotCWZvciAoaSA9IDA7IGkgPCBBUFJfU1ZDX01BWDsgaSsrKSB7Ci0JCW11dGV4X2xvY2soJmFwcl9jbGllbnQtPnN2Y1tpXS5tX2xvY2spOwotCQlpZiAoYXByX2NsaWVudC0+c3ZjW2ldLmZuKSB7Ci0JCQlhcHJfY2xpZW50LT5zdmNbaV0ubmVlZF9yZXNldCA9IDB4MTsKLQkJCWFwcl9jbGllbnQtPnN2Y1tpXS5mbigmZGF0YSwgYXByX2NsaWVudC0+c3ZjW2ldLnByaXYpOwotCQl9Ci0JCWlmIChhcHJfY2xpZW50LT5zdmNbaV0ucG9ydF9jbnQpIHsKLQkJCXN2YyA9ICYoYXByX2NsaWVudC0+c3ZjW2ldKTsKLQkJCXN2Yy0+bmVlZF9yZXNldCA9IDB4MTsKLQkJCWZvciAoaiA9IDA7IGogPCBBUFJfTUFYX1BPUlRTOyBqKyspCi0JCQkJaWYgKHN2Yy0+cG9ydF9mbltqXSkKLQkJCQkJc3ZjLT5wb3J0X2ZuW2pdKCZkYXRhLAotCQkJCQkJc3ZjLT5wb3J0X3ByaXZbal0pOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXByX2NsaWVudC0+c3ZjW2ldLm1fbG9jayk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFwcl9ub3RpZmllcl9zZXJ2aWNlX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCQkgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXVkaW9fbm90aWZpZXJfY2JfZGF0YSAqY2JfZGF0YSA9IGRhdGE7Ci0KLQlpZiAoY2JfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IENhbGxiYWNrIGRhdGEgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogU2VydmljZSBvcGNvZGUgMHglbHgsIGRvbWFpbiAlZFxuIiwKLQkJX19mdW5jX18sIG9wY29kZSwgY2JfZGF0YS0+ZG9tYWluKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046Ci0JCS8qCi0JCSAqIFVzZSBmbGFnIHRvIGlnbm9yZSBkb3duIG5vdGlmaWNhdGlvbnMgZHVyaW5nCi0JCSAqIGluaXRpYWwgYm9vdC4gVGhlcmUgaXMgbm8gYmVuZWZpdCBmcm9tIGVycm9yCi0JCSAqIHJlY292ZXJ5IG5vdGlmaWNhdGlvbnMgZHVyaW5nIGluaXRpYWwgYm9vdAotCQkgKiB1cCBzaW5jZSBldmVyeXRoaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGRvd24uCi0JCSAqLwotCQlpZiAoaXNfaW5pdGlhbF9ib290KSB7Ci0JCQlpc19pbml0aWFsX2Jvb3QgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjYl9kYXRhLT5kb21haW4gPT0gQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOKQotCQkJYXByX21vZGVtX2Rvd24ob3Bjb2RlKTsKLQkJZWxzZQotCQkJYXByX2Fkc3BfZG93bihvcGNvZGUpOwotCQlicmVhazsKLQljYXNlIEFVRElPX05PVElGSUVSX1NFUlZJQ0VfVVA6Ci0JCWlzX2luaXRpYWxfYm9vdCA9IGZhbHNlOwotCQlpZiAoY2JfZGF0YS0+ZG9tYWluID09IEFVRElPX05PVElGSUVSX01PREVNX0RPTUFJTikKLQkJCWFwcl9tb2RlbV91cCgpOwotCQllbHNlCi0JCQlhcHJfYWRzcF91cCgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci1kb25lOgotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWRzcF9zZXJ2aWNlX25iID0gewotCS5ub3RpZmllcl9jYWxsICA9IGFwcl9ub3RpZmllcl9zZXJ2aWNlX2NiLAotCS5wcmlvcml0eSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1vZGVtX3NlcnZpY2VfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgID0gYXByX25vdGlmaWVyX3NlcnZpY2VfY2IsCi0JLnByaW9yaXR5ID0gMCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFwcl9pbml0KHZvaWQpCi17Ci0JaW50IGksIGosIGs7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVBSX0RFU1RfTUFYOyBpKyspCi0JCWZvciAoaiA9IDA7IGogPCBBUFJfQ0xJRU5UX01BWDsgaisrKSB7Ci0JCQltdXRleF9pbml0KCZjbGllbnRbaV1bal0ubV9sb2NrKTsKLQkJCWZvciAoayA9IDA7IGsgPCBBUFJfU1ZDX01BWDsgaysrKSB7Ci0JCQkJbXV0ZXhfaW5pdCgmY2xpZW50W2ldW2pdLnN2Y1trXS5tX2xvY2spOwotCQkJCXNwaW5fbG9ja19pbml0KCZjbGllbnRbaV1bal0uc3ZjW2tdLndfbG9jayk7Ci0JCQl9Ci0JCX0KLQlhcHJfc2V0X3N1YnN5c19zdGF0ZSgpOwotCW11dGV4X2luaXQoJnE2LmxvY2spOwotCWFwcl9yZXNldF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXByX2RyaXZlciIpOwotCWlmICghYXByX3Jlc2V0X3dvcmtxdWV1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhcHJfcGt0X2N0eCA9IGlwY19sb2dfY29udGV4dF9jcmVhdGUoQVBSX1BLVF9JUENfTE9HX1BBR0VfQ05ULAotCQkJCQkJImFwciIsIDApOwotCWlmICghYXByX3BrdF9jdHgpCi0JCXByX2VycigiJXM6IFVuYWJsZSB0byBjcmVhdGUgaXBjIGxvZyBjb250ZXh0XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpc19pbml0aWFsX2Jvb3QgPSB0cnVlOwotCXN1YnN5c19ub3RpZl9yZWdpc3RlcigiYXByX2Fkc3AiLCBBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTiwKLQkJCSAgICAgICZhZHNwX3NlcnZpY2VfbmIpOwotCXN1YnN5c19ub3RpZl9yZWdpc3RlcigiYXByX21vZGVtIiwgQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOLAotCQkJICAgICAgJm1vZGVtX3NlcnZpY2VfbmIpOwotCi0JcmV0dXJuIDA7Ci19Ci1kZXZpY2VfaW5pdGNhbGwoYXByX2luaXQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhcHJfbGF0ZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkc3Bfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbW9kZW1fd2FpdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotbGF0ZV9pbml0Y2FsbChhcHJfbGF0ZV9pbml0KTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIGludCBfX2luaXQgYXByX2RlYnVnX2luaXQodm9pZCkKLXsKLQlkZWJ1Z2ZzX2Fwcl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1zbV9hcHJfZGVidWciLAotCQkJCQkJIFNfSUZSRUcgfCAwNDQ0LCBOVUxMLCBOVUxMLAotCQkJCQkJICZhcHJfZGVidWdfb3BzKTsKLQlyZXR1cm4gMDsKLX0KLWRldmljZV9pbml0Y2FsbChhcHJfZGVidWdfaW5pdCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHJfdGFsX2dsaW5rLmMgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3RhbF9nbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEyNTY0YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3RhbF9nbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9nbGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgotCi0jZGVmaW5lIEFQUl9NQVhJTVVNX05VTV9PRl9SRVRSSUVTIDIKLQotc3RydWN0IGFwcl90eF9idWYgewotCXN0cnVjdCBhcHJfcGt0X3ByaXYgcGt0X3ByaXY7Ci0JY2hhciBidWZbQVBSX01BWF9CVUZdOwotfTsKLQotc3RydWN0IGxpbmtfc3RhdGUgewotCXVpbnQzMl90IGRlc3Q7Ci0Jdm9pZCAqaGFuZGxlOwotCWVudW0gZ2xpbmtfbGlua19zdGF0ZSBsaW5rX3N0YXRlOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGxpbmtfc3RhdGUgbGlua19zdGF0ZVtBUFJfREVTVF9NQVhdOwotCi1zdGF0aWMgY2hhciAqc3ZjX25hbWVzW0FQUl9ERVNUX01BWF1bQVBSX0NMSUVOVF9NQVhdID0gewotCXsKLQkJImFwcl9hdWRpb19zdmMiLAotCQkiYXByX3ZvaWNlX3N2YyIsCi0JfSwKLQl7Ci0JCSJhcHJfYXVkaW9fc3ZjIiwKLQkJImFwcl92b2ljZV9zdmMiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFwcl9zdmNfY2hfZGV2Ci0JYXByX3N2Y19jaFtBUFJfRExfTUFYXVtBUFJfREVTVF9NQVhdW0FQUl9DTElFTlRfTUFYXTsKLQotc3RhdGljIHN0cnVjdCBhcHJfdHhfYnVmICphcHJfYWxsb2NfYnVmKGludCBsZW4pCi17Ci0KLQlpZiAobGVuID4gQVBSX01BWF9CVUYpIHsKLQkJcHJfZXJyKCIlczogYnVmIHRvbyBsYXJnZSBbJWRdXG4iLCBfX2Z1bmNfXywgbGVuKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCi0JcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcHJfdHhfYnVmKSwgR0ZQX0FUT01JQyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwcl9mcmVlX2J1Zihjb25zdCB2b2lkICpwdHIpCi17Ci0KLQlzdHJ1Y3QgYXByX3BrdF9wcml2ICphcHJfcGt0X3ByaXYgPSAoc3RydWN0IGFwcl9wa3RfcHJpdiAqKXB0cjsKLQlzdHJ1Y3QgYXByX3R4X2J1ZiAqdHhfYnVmOwotCi0JaWYgKCFhcHJfcGt0X3ByaXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcHJfcGt0X3ByaXZcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChhcHJfcGt0X3ByaXYtPnBrdF9vd25lciA9PSBBUFJfUEtUX09XTkVSX0RSSVZFUikgewotCQl0eF9idWYgPSBjb250YWluZXJfb2YoKHZvaWQgKilhcHJfcGt0X3ByaXYsCi0JCQkJICAgICAgc3RydWN0IGFwcl90eF9idWYsIHBrdF9wcml2KTsKLQkJcHJfZGVidWcoIiVzOiBGcmVlaW5nIGJ1ZmZlciAlcEsiLCBfX2Z1bmNfXywgdHhfYnVmKTsKLQkJa2ZyZWUodHhfYnVmKTsKLQl9Ci19Ci0KLQotc3RhdGljIGludCBfX2Fwcl90YWxfd3JpdGUoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gsIHZvaWQgKmRhdGEsCi0JCQkgICBzdHJ1Y3QgYXByX3BrdF9wcml2ICpwa3RfcHJpdiwgaW50IGxlbikKLXsKLQlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXByX2NoLT53X2xvY2ssIGZsYWdzKTsKLQlyYyA9IGdsaW5rX3R4KGFwcl9jaC0+aGFuZGxlLCBwa3RfcHJpdiwgZGF0YSwgbGVuLCBHTElOS19UWF9BVE9NSUMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcl9jaC0+d19sb2NrLCBmbGFncyk7Ci0KLQlpZiAocmMpCi0JCXByX2VycigiJXM6IGdsaW5rX3R4IGZhaWxlZCwgcmNbJWRdXG4iLCBfX2Z1bmNfXywgcmMpOwotCWVsc2UKLQkJcmMgPSBsZW47Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhcHJfdGFsX3dyaXRlKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoLCB2b2lkICpkYXRhLAotCQkgIHN0cnVjdCBhcHJfcGt0X3ByaXYgKnBrdF9wcml2LCBpbnQgbGVuKQotewotCWludCByYyA9IDAsIHJldHJpZXMgPSAwOwotCXZvaWQgKnBrdF9kYXRhID0gTlVMTDsKLQlzdHJ1Y3QgYXByX3R4X2J1ZiAqdHhfYnVmID0gTlVMTDsKLQlzdHJ1Y3QgYXByX3BrdF9wcml2ICpwa3RfcHJpdl9wdHIgPSBwa3RfcHJpdjsKLQotCWlmICghYXByX2NoLT5oYW5kbGUgfHwgIXBrdF9wcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChwa3RfcHJpdi0+cGt0X293bmVyID09IEFQUl9QS1RfT1dORVJfRFJJVkVSKSB7Ci0JCXR4X2J1ZiA9IGFwcl9hbGxvY19idWYobGVuKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKHR4X2J1ZikpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQltZW1jcHkodHhfYnVmLT5idWYsIGRhdGEsIGxlbik7Ci0JCW1lbWNweSgmdHhfYnVmLT5wa3RfcHJpdiwgcGt0X3ByaXYsIHNpemVvZih0eF9idWYtPnBrdF9wcml2KSk7Ci0JCXBrdF9wcml2X3B0ciA9ICZ0eF9idWYtPnBrdF9wcml2OwotCQlwa3RfZGF0YSA9IHR4X2J1Zi0+YnVmOwotCX0gZWxzZSB7Ci0JCXBrdF9kYXRhID0gZGF0YTsKLQl9Ci0KLQlkbyB7Ci0JCWlmIChyYyA9PSAtRUFHQUlOKQotCQkJdWRlbGF5KDUwKTsKLQotCQlyYyA9IF9fYXByX3RhbF93cml0ZShhcHJfY2gsIHBrdF9kYXRhLCBwa3RfcHJpdl9wdHIsIGxlbik7Ci0JfSB3aGlsZSAocmMgPT0gLUVBR0FJTiAmJiByZXRyaWVzKysgPCBBUFJfTUFYSU1VTV9OVU1fT0ZfUkVUUklFUyk7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IFVuYWJsZSB0byBzZW5kIHRoZSBwYWNrZXQsIHJjOiVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlpZiAocGt0X3ByaXYtPnBrdF9vd25lciA9PSBBUFJfUEtUX09XTkVSX0RSSVZFUikKLQkJCWtmcmVlKHR4X2J1Zik7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgYXByX3RhbF9ub3RpZnlfcngodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LCBjb25zdCB2b2lkICpwa3RfcHJpdiwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2ggPSAoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICopcHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFhcHJfY2ggfHwgIXB0cikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGFwcl9jaCBvciBwdHJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2RlYnVnKCIlczogUnggcGFja2V0IHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXByX2NoLT5yX2xvY2ssIGZsYWdzKTsKLQlpZiAoYXByX2NoLT5mdW5jKQotCQlhcHJfY2gtPmZ1bmMoKHZvaWQgKilwdHIsIHNpemUsICh2b2lkICopcGt0X3ByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcl9jaC0+cl9sb2NrLCBmbGFncyk7Ci0JZ2xpbmtfcnhfZG9uZShhcHJfY2gtPmhhbmRsZSwgcHRyLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgYXByX3RhbF9ub3RpZnlfdHhfYWJvcnQodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAotCQkJCSAgICBjb25zdCB2b2lkICpwa3RfcHJpdikKLXsKLQlwcl9kZWJ1ZygiJXM6IHR4X2Fib3J0IHJlY2VpdmVkIGZvciBwa3RfcHJpdjolcEtcbiIsCi0JCSBfX2Z1bmNfXywgcGt0X3ByaXYpOwotCWFwcl9mcmVlX2J1Zihwa3RfcHJpdik7Ci19Ci0KLXZvaWQgYXByX3RhbF9ub3RpZnlfdHhfZG9uZSh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCi0JCQkgICAgY29uc3Qgdm9pZCAqcGt0X3ByaXYsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQlwcl9kZWJ1ZygiJXM6IHR4X2RvbmUgcmVjZWl2ZWQgZm9yIHBrdF9wcml2OiVwS1xuIiwKLQkJIF9fZnVuY19fLCBwa3RfcHJpdik7Ci0JYXByX2ZyZWVfYnVmKHBrdF9wcml2KTsKLX0KLQotYm9vbCBhcHJfdGFsX25vdGlmeV9yeF9pbnRlbnRfcmVxKHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKLQkJCQkgIHNpemVfdCByZXFfc2l6ZSkKLXsKLQlzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCA9IChzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKilwcml2OwotCi0JaWYgKCFhcHJfY2gpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcHJfY2hcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByX2VycigiJXM6IE5vIHJ4IGludGVudHMgcXVldWVkLCB1bmFibGUgdG8gcmVjZWl2ZVxuIiwgX19mdW5jX18pOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgYXByX3RhbF9ub3RpZnlfcmVtb3RlX3J4X2ludGVudCh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCi0JCQkJCSAgICBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCA9IChzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKilwcml2OwotCi0JaWYgKCFhcHJfY2gpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcHJfY2hcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGZhciBlbmQgaGFzIHF1ZXVlZCBhdCBsZWFzdCBvbmUgaW50ZW50Ci0JICogYmVmb3JlIHdlIGF0dG1wdCBhbnkgSVBDLiBBIHNpbXBsZSBib29sIGZsYWcgaXMgdXNlZCBoZXJlIGluc3RlYWQgb2YKLQkgKiBhIGNvdW50ZXIsIGFzIHRoZSBmYXIgZW5kIGlzIHJlcXVpcmVkIHRvIGd1YXJhbnRlZSBpbnRlbnQKLQkgKiBhdmFpbGFiaWxpdHkgZm9yIGFsbCB1c2UgY2FzZXMgb25jZSB0aGUgY2hhbm5lbCBpcyBmdWxseSBvcGVuZWQuCi0JICovCi0JcHJfZGVidWcoIiVzOiByZW1vdGUgcXVldWVkIGFuIGludGVudFxuIiwgX19mdW5jX18pOwotCWFwcl9jaC0+aWZfcmVtb3RlX2ludGVudF9yZWFkeSA9IHRydWU7Ci0Jd2FrZV91cCgmYXByX2NoLT53YWl0KTsKLX0KLQotdm9pZCBhcHJfdGFsX25vdGlmeV9zdGF0ZSh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCA9IChzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKilwcml2OwotCi0JaWYgKCFhcHJfY2gpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcHJfY2hcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWFwcl9jaC0+Y2hhbm5lbF9zdGF0ZSA9IGV2ZW50OwotCXByX2luZm8oIiVzOiBDaGFubmVsIHN0YXRlWyVkXVxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCWlmIChldmVudCA9PSBHTElOS19DT05ORUNURUQpCi0JCXdha2VfdXAoJmFwcl9jaC0+d2FpdCk7Ci19Ci0KLWludCBhcHJfdGFsX3J4X2ludGVudHNfY29uZmlnKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoLAotCQkJICAgICAgaW50IG51bV9vZl9pbnRlbnRzLCB1aW50MzJfdCBzaXplKQotewotCWludCBpOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWFwcl9jaCB8fCAhbnVtX29mX2ludGVudHMgfHwgIXNpemUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vZl9pbnRlbnRzOyBpKyspIHsKLQkJcmMgPSBnbGlua19xdWV1ZV9yeF9pbnRlbnQoYXByX2NoLT5oYW5kbGUsIGFwcl9jaCwgc2l6ZSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHF1ZXVlIHJ4IGludGVudCwgaXRlcmF0aW9uWyVkXVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfdGFsX29wZW4odWludDMyX3QgY2xudCwgdWludDMyX3QgZGVzdCwgdWludDMyX3QgZGwsCi0JCQkJICAgIGFwcl9zdmNfY2JfZm4gZnVuYywgdm9pZCAqcHJpdikKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGdsaW5rX29wZW5fY29uZmlnIG9wZW5fY2ZnOwotCXN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoOwotCi0JaWYgKChjbG50ID49IEFQUl9DTElFTlRfTUFYKSB8fCAoZGVzdCA+PSBBUFJfREVTVF9NQVgpIHx8Ci0JICAgIChkbCA+PSBBUFJfRExfTUFYKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcywgY2xudDolZCwgZGVzdDolZCwgZGw6JWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2xudCwgZGVzdCwgZGwpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlhcHJfY2ggPSAmYXByX3N2Y19jaFtkbF1bZGVzdF1bY2xudF07Ci0JbXV0ZXhfbG9jaygmYXByX2NoLT5tX2xvY2spOwotCWlmIChhcHJfY2gtPmhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBUaGlzIGNoYW5uZWwgaXMgYWxyZWFkeSBvcGVuZWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWlmIChsaW5rX3N0YXRlW2Rlc3RdLmxpbmtfc3RhdGUgIT0gR0xJTktfTElOS19TVEFURV9VUCkgewotCQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChsaW5rX3N0YXRlW2Rlc3RdLndhaXQsCi0JCQlsaW5rX3N0YXRlW2Rlc3RdLmxpbmtfc3RhdGUgPT0gR0xJTktfTElOS19TVEFURV9VUCwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoQVBSX09QRU5fVElNRU9VVF9NUykpOwotCQlpZiAocmMgPT0gMCkgewotCQkJcHJfZXJyKCIlczogT3BlbiB0aW1lb3V0LCBkZXN0OiVkXG4iLCBfX2Z1bmNfXywgZGVzdCk7Ci0JCQlyYyA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIHVubG9jazsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IFdha2V1cCBkb25lLCBkZXN0OiVkXG4iLCBfX2Z1bmNfXywgZGVzdCk7Ci0JfQotCi0JbWVtc2V0KCZvcGVuX2NmZywgMCwgc2l6ZW9mKHN0cnVjdCBnbGlua19vcGVuX2NvbmZpZykpOwotCW9wZW5fY2ZnLm9wdGlvbnMgPSBHTElOS19PUFRfSU5JVElBTF9YUE9SVDsKLQlpZiAoZGVzdCA9PSBBUFJfREVTVF9NT0RFTSkKLQkJb3Blbl9jZmcuZWRnZSA9ICJtcHNzIjsKLQllbHNlCi0JCW9wZW5fY2ZnLmVkZ2UgPSAibHBhc3MiOwotCi0Jb3Blbl9jZmcubmFtZSA9IHN2Y19uYW1lc1tkZXN0XVtjbG50XTsKLQlvcGVuX2NmZy5ub3RpZnlfcnggPSBhcHJfdGFsX25vdGlmeV9yeDsKLQlvcGVuX2NmZy5ub3RpZnlfdHhfZG9uZSA9IGFwcl90YWxfbm90aWZ5X3R4X2RvbmU7Ci0Jb3Blbl9jZmcubm90aWZ5X3N0YXRlID0gYXByX3RhbF9ub3RpZnlfc3RhdGU7Ci0Jb3Blbl9jZmcubm90aWZ5X3J4X2ludGVudF9yZXEgPSBhcHJfdGFsX25vdGlmeV9yeF9pbnRlbnRfcmVxOwotCW9wZW5fY2ZnLm5vdGlmeV9yZW1vdGVfcnhfaW50ZW50ID0gYXByX3RhbF9ub3RpZnlfcmVtb3RlX3J4X2ludGVudDsKLQlvcGVuX2NmZy5ub3RpZnlfdHhfYWJvcnQgPSBhcHJfdGFsX25vdGlmeV90eF9hYm9ydDsKLQlvcGVuX2NmZy5wcml2ID0gYXByX2NoOwotCW9wZW5fY2ZnLnRyYW5zcG9ydCA9ICJzbWVtIjsKLQotCWFwcl9jaC0+Y2hhbm5lbF9zdGF0ZSA9IEdMSU5LX1JFTU9URV9ESVNDT05ORUNURUQ7Ci0JYXByX2NoLT5oYW5kbGUgPSBnbGlua19vcGVuKCZvcGVuX2NmZyk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGFwcl9jaC0+aGFuZGxlKSkgewotCQlwcl9lcnIoIiVzOiBnbGlua19vcGVuIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sCi0JCSAgICAgICBzdmNfbmFtZXNbZGVzdF1bY2xudF0pOwotCQlhcHJfY2gtPmhhbmRsZSA9IE5VTEw7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYXByX2NoLT53YWl0LAotCQkoYXByX2NoLT5jaGFubmVsX3N0YXRlID09IEdMSU5LX0NPTk5FQ1RFRCksIDUgKiBIWik7Ci0JaWYgKHJjID09IDApIHsKLQkJcHJfZXJyKCIlczogVElNRU9VVCBmb3IgT1BFTiBldmVudFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gY2xvc2VfbGluazsKLQl9Ci0KLQkvKgotCSAqIFJlbW90ZSBpbnRlbnQgaXMgbm90IHJlcXVpcmVkIGZvciBHTElOSyA8LS0+IFNNRCBJUEMsIHNvIHRoaXMgaXMKLQkgKiBkZXNpZ25lZCBub3QgdG8gZmFpbCB0aGUgb3BlbiBjYWxsLgotCSAqLwotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFwcl9jaC0+d2FpdCwKLQkJYXByX2NoLT5pZl9yZW1vdGVfaW50ZW50X3JlYWR5LCA1ICogSFopOwotCWlmIChyYyA9PSAwKQotCQlwcl9lcnIoIiVzOiBUSU1FT1VUIGZvciByZW1vdGUgaW50ZW50IHJlYWRpbmVzc1xuIiwgX19mdW5jX18pOwotCi0JcmMgPSBhcHJfdGFsX3J4X2ludGVudHNfY29uZmlnKGFwcl9jaCwgQVBSX0RFRkFVTFRfTlVNX09GX0lOVEVOVFMsCi0JCQkJICAgICAgIEFQUl9NQVhfQlVGKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHF1ZXVlIGludGVudHNcbiIsIF9fZnVuY19fKTsKLQkJZ290byBjbG9zZV9saW5rOwotCX0KLQotCWFwcl9jaC0+ZnVuYyA9IGZ1bmM7Ci0JYXByX2NoLT5wcml2ID0gcHJpdjsKLQotY2xvc2VfbGluazoKLQlpZiAocmMpIHsKLQkJZ2xpbmtfY2xvc2UoYXByX2NoLT5oYW5kbGUpOwotCQlhcHJfY2gtPmhhbmRsZSA9IE5VTEw7Ci0JfQotdW5sb2NrOgotCW11dGV4X3VubG9jaygmYXByX2NoLT5tX2xvY2spOwotCi0JcmV0dXJuIHJjID8gTlVMTCA6IGFwcl9jaDsKLX0KLQotaW50IGFwcl90YWxfY2xvc2Uoc3RydWN0IGFwcl9zdmNfY2hfZGV2ICphcHJfY2gpCi17Ci0JaW50IHJjOwotCi0JaWYgKCFhcHJfY2ggfHwgIWFwcl9jaC0+aGFuZGxlKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCW11dGV4X2xvY2soJmFwcl9jaC0+bV9sb2NrKTsKLQlyYyA9IGdsaW5rX2Nsb3NlKGFwcl9jaC0+aGFuZGxlKTsKLQlhcHJfY2gtPmhhbmRsZSA9IE5VTEw7Ci0JYXByX2NoLT5mdW5jID0gTlVMTDsKLQlhcHJfY2gtPnByaXYgPSBOVUxMOwotCWFwcl9jaC0+aWZfcmVtb3RlX2ludGVudF9yZWFkeSA9IGZhbHNlOwotCW11dGV4X3VubG9jaygmYXByX2NoLT5tX2xvY2spOwotZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwcl90YWxfbGlua19zdGF0ZV9jYihzdHJ1Y3QgZ2xpbmtfbGlua19zdGF0ZV9jYl9pbmZvICpjYl9pbmZvLAotCQkJCSAgdm9pZCAqcHJpdikKLXsKLQl1aW50MzJfdCBkZXN0OwotCi0JaWYgKCFjYl9pbmZvKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY2JfaW5mb1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFzdHJjbXAoY2JfaW5mby0+ZWRnZSwgIm1wc3MiKSkKLQkJZGVzdCA9IEFQUl9ERVNUX01PREVNOwotCWVsc2UgaWYgKCFzdHJjbXAoY2JfaW5mby0+ZWRnZSwgImxwYXNzIikpCi0JCWRlc3QgPSBBUFJfREVTVF9RRFNQNjsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczpVbmtub3duIGVkZ2VbJXNdXG4iLCBfX2Z1bmNfXywgY2JfaW5mby0+ZWRnZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9pbmZvKCIlczogZWRnZVslc10gbGluayBzdGF0ZVslZF1cbiIsIF9fZnVuY19fLCBjYl9pbmZvLT5lZGdlLAotCQljYl9pbmZvLT5saW5rX3N0YXRlKTsKLQotCWxpbmtfc3RhdGVbZGVzdF0ubGlua19zdGF0ZSA9IGNiX2luZm8tPmxpbmtfc3RhdGU7Ci0JaWYgKGxpbmtfc3RhdGVbZGVzdF0ubGlua19zdGF0ZSA9PSBHTElOS19MSU5LX1NUQVRFX1VQKQotCQl3YWtlX3VwKCZsaW5rX3N0YXRlW2Rlc3RdLndhaXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGdsaW5rX2xpbmtfaW5mbyBtcHNzX2xpbmtfaW5mbyA9IHsKLQkudHJhbnNwb3J0ID0gInNtZW0iLAotCS5lZGdlID0gIm1wc3MiLAotCS5nbGlua19saW5rX3N0YXRlX25vdGlmX2NiID0gYXByX3RhbF9saW5rX3N0YXRlX2NiLAotfTsKLQotc3RhdGljIHN0cnVjdCBnbGlua19saW5rX2luZm8gbHBhc3NfbGlua19pbmZvID0gewotCS50cmFuc3BvcnQgPSAic21lbSIsCi0JLmVkZ2UgPSAibHBhc3MiLAotCS5nbGlua19saW5rX3N0YXRlX25vdGlmX2NiID0gYXByX3RhbF9saW5rX3N0YXRlX2NiLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXByX3RhbF9pbml0KHZvaWQpCi17Ci0JaW50IGksIGosIGs7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVBSX0RMX01BWDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBBUFJfREVTVF9NQVg7IGorKykgewotCQkJZm9yIChrID0gMDsgayA8IEFQUl9DTElFTlRfTUFYOyBrKyspIHsKLQkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhcHJfc3ZjX2NoW2ldW2pdW2tdLndhaXQpOwotCQkJCXNwaW5fbG9ja19pbml0KCZhcHJfc3ZjX2NoW2ldW2pdW2tdLndfbG9jayk7Ci0JCQkJc3Bpbl9sb2NrX2luaXQoJmFwcl9zdmNfY2hbaV1bal1ba10ucl9sb2NrKTsKLQkJCQltdXRleF9pbml0KCZhcHJfc3ZjX2NoW2ldW2pdW2tdLm1fbG9jayk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVBSX0RFU1RfTUFYOyBpKyspCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxpbmtfc3RhdGVbaV0ud2FpdCk7Ci0KLQlsaW5rX3N0YXRlW0FQUl9ERVNUX01PREVNXS5saW5rX3N0YXRlID0gR0xJTktfTElOS19TVEFURV9ET1dOOwotCWxpbmtfc3RhdGVbQVBSX0RFU1RfTU9ERU1dLmhhbmRsZSA9Ci0JCWdsaW5rX3JlZ2lzdGVyX2xpbmtfc3RhdGVfY2IoJm1wc3NfbGlua19pbmZvLCBOVUxMKTsKLQlpZiAoIWxpbmtfc3RhdGVbQVBSX0RFU1RfTU9ERU1dLmhhbmRsZSkKLQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIG1wc3MgbGluayBzdGF0ZVxuIiwgX19mdW5jX18pOwotCi0JbGlua19zdGF0ZVtBUFJfREVTVF9RRFNQNl0ubGlua19zdGF0ZSA9IEdMSU5LX0xJTktfU1RBVEVfRE9XTjsKLQlsaW5rX3N0YXRlW0FQUl9ERVNUX1FEU1A2XS5oYW5kbGUgPQotCQlnbGlua19yZWdpc3Rlcl9saW5rX3N0YXRlX2NiKCZscGFzc19saW5rX2luZm8sIE5VTEwpOwotCWlmICghbGlua19zdGF0ZVtBUFJfREVTVF9RRFNQNl0uaGFuZGxlKQotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgbHBhc3MgbGluayBzdGF0ZVxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci19Ci1kZXZpY2VfaW5pdGNhbGwoYXByX3RhbF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHJfdjIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hcHJfdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkZjM5Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3YyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvZHNwX2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgotCi1lbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9zdWJzeXNfc3RhdGUodm9pZCkKLXsKLQlyZXR1cm4gYXByX2dldF9xNl9zdGF0ZSgpOwotfQotCi12b2lkIGFwcl9zZXRfc3Vic3lzX3N0YXRlKHZvaWQpCi17Ci0JYXByX3NldF9xNl9zdGF0ZShBUFJfU1VCU1lTX0RPV04pOwotCWFwcl9zZXRfbW9kZW1fc3RhdGUoQVBSX1NVQlNZU19VUCk7Ci19Ci0KLXVpbnQxNl90IGFwcl9nZXRfZGF0YV9zcmMoc3RydWN0IGFwcl9oZHIgKmhkcikKLXsKLQlpZiAoaGRyLT5zcmNfZG9tYWluID09IEFQUl9ET01BSU5fTU9ERU0pCi0JCXJldHVybiBBUFJfREVTVF9NT0RFTTsKLQllbHNlIGlmIChoZHItPnNyY19kb21haW4gPT0gQVBSX0RPTUFJTl9BRFNQKQotCQlyZXR1cm4gQVBSX0RFU1RfUURTUDY7Ci0KLQlwcl9lcnIoIkFQUjogUGt0IGZyb20gd3Jvbmcgc291cmNlOiAlZFxuIiwgaGRyLT5zcmNfZG9tYWluKTsKLQlyZXR1cm4gQVBSX0RFU1RfTUFYOwkJLypSRVRVUk4gSU5WQUxJRCBWQUxVRSovCi19Ci0KLWludCBhcHJfZ2V0X2Rlc3RfaWQoY2hhciAqZGVzdCkKLXsKLQlpZiAoIXN0cmNtcChkZXN0LCAiQURTUCIpKQotCQlyZXR1cm4gQVBSX0RFU1RfUURTUDY7Ci0JZWxzZQotCQlyZXR1cm4gQVBSX0RFU1RfTU9ERU07Ci19Ci0KLXZvaWQgc3Vic3lzX25vdGlmX3JlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lLCBpbnQgZG9tYWluLAotCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoY2xpZW50X25hbWUsIGRvbWFpbiwgbmIpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBBdWRpbyBub3RpZmllciByZWdpc3RlciBmYWlsZWQgZm9yIGRvbWFpbiAlZCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkb21haW4sIHJldCk7Ci19Ci0KLXVpbnQxNl90IGFwcl9nZXRfcmVzZXRfZG9tYWluKHVpbnQxNl90IHByb2MpCi17Ci0JcmV0dXJuIHByb2M7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3YzLmMgYi9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXByX3YzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmM1MTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2Fwcl92My5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHJfdGFsLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9kc3BfZGVidWcuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmg+Ci0KLSNkZWZpbmUgREVTVF9JRCBBUFJfREVTVF9NT0RFTQotCi1lbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9zdWJzeXNfc3RhdGUodm9pZCkKLXsKLQlyZXR1cm4gYXByX2dldF9tb2RlbV9zdGF0ZSgpOwotfQotCi12b2lkIGFwcl9zZXRfc3Vic3lzX3N0YXRlKHZvaWQpCi17Ci0JYXByX3NldF9tb2RlbV9zdGF0ZShBUFJfU1VCU1lTX0RPV04pOwotfQotCi11aW50MTZfdCBhcHJfZ2V0X2RhdGFfc3JjKHN0cnVjdCBhcHJfaGRyICpoZHIpCi17Ci0JcmV0dXJuIERFU1RfSUQ7Ci19Ci0KLWludCBhcHJfZ2V0X2Rlc3RfaWQoY2hhciAqZGVzdCkKLXsKLQlyZXR1cm4gREVTVF9JRDsKLX0KLQotdm9pZCBzdWJzeXNfbm90aWZfcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUsIGludCBkb21haW4sCi0JCQkgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCWludCByZXQ7Ci0KLQlpZiAoZG9tYWluICE9IEFVRElPX05PVElGSUVSX01PREVNX0RPTUFJTikgewotCQlwcl9kZWJ1ZygiJXM6IFVudXNlZCBkb21haW4gJWQgbm90IHJlZ2lzdGVyaW5nIHdpdGggbm90aWZpZXJcbiIsCi0JCQkgX19mdW5jX18sIGRvbWFpbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3RlcihjbGllbnRfbmFtZSwgZG9tYWluLCBuYik7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCBmb3IgZG9tYWluICVkIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIGRvbWFpbiwgcmV0KTsKLX0KLQotdWludDE2X3QgYXByX2dldF9yZXNldF9kb21haW4odWludDE2X3QgcHJvYykKLXsKLQlyZXR1cm4gQVBSX0RFU1RfUURTUDY7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuYyBiL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUzM2E3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19wZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fbm90aWYuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zZXJ2aWNlLW5vdGlmaWVyLmg+Ci0KLS8qIEF1ZGlvIHN0YXRlcyBpbnRlcm5hbCB0byBub3RpZmllci4gQ2xpZW50ICovCi0vKiB1c2VkIHN0YXRlcyBkZWZpbmVkIGluIGF1ZGlvX25vdGlmaWVyLmggKi8KLS8qIGZvciBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV04gJiBVUCAqLwotI2RlZmluZSBOT19TRVJWSUNFIC0yCi0jZGVmaW5lIFVOSU5JVF9TRVJWSUNFIC0xCi0KLS8qCi0gKiBVc2VkIGZvciBlYWNoIGNsaWVudCByZWdpc3RlcmVkIHdpdGggYXVkaW8gbm90aWZpZXIKLSAqLwotc3RydWN0IGNsaWVudF9kYXRhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0OwotCS8qIE5vdGlmaWVyIGJsb2NrIGdpdmVuIGJ5IGNsaWVudCAqLwotCXN0cnVjdCBub3RpZmllcl9ibG9jayAgICpuYjsKLQljaGFyICAgICAgICAgICAgICAgICAgICBjbGllbnRfbmFtZVsyMF07Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc2VydmljZTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBkb21haW47Ci19OwotCi0vKgotICogVXNlZCBmb3IgZWFjaCBzZXJ2aWNlIGFuZCBkb21haW4gY29tYmluYXRpb24KLSAqIFRyYWNrcyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgdW5kZXJseWluZwotICogc2VydmljZS4KLSAqLwotc3RydWN0IHNlcnZpY2VfaW5mbyB7Ci0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICBuYW1lWzIwXTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbl9pZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhhbmRsZTsKLQkvKiBOb3RpZmllciBibG9jayByZWdpc3RlcmVkIHRvIHNlcnZpY2UgKi8KLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgICAgICAgICAgICpuYjsKLQkvKiBVc2VkIHRvIGRldGVybWluZSB3aGVuIHRvIHJlZ2lzdGVyIGFuZCBkZXJlZ2lzdGVyIHNlcnZpY2UgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vZl9jbGllbnRzOwotCS8qIExpc3Qgb2YgYWxsIGNsaWVudHMgcmVnaXN0ZXJlZCB0byB0aGUgc2VydmljZSBhbmQgZG9tYWluICovCi0Jc3RydWN0IHNyY3Vfbm90aWZpZXJfaGVhZCAgICAgICBjbGllbnRfbmJfbGlzdDsKLX07Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9zc3JfYWRzcF9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfc3NyX21vZGVtX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9wZHJfYWRzcF9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXJfc3NyX2Fkc3BfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgID0gYXVkaW9fbm90aWZlcl9zc3JfYWRzcF9jYiwKLQkucHJpb3JpdHkgPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcl9zc3JfbW9kZW1fbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgID0gYXVkaW9fbm90aWZlcl9zc3JfbW9kZW1fY2IsCi0JLnByaW9yaXR5ID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXJfcGRyX2Fkc3BfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgID0gYXVkaW9fbm90aWZlcl9wZHJfYWRzcF9jYiwKLQkucHJpb3JpdHkgPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzZXJ2aWNlX2luZm8gc2VydmljZV9kYXRhW0FVRElPX05PVElGSUVSX01BWF9TRVJWSUNFU10KLQkJCQkgICAgICAgW0FVRElPX05PVElGSUVSX01BWF9ET01BSU5TXSA9IHsKLQotCXt7Ci0JCS5uYW1lID0gIlNTUl9BRFNQIiwKLQkJLmRvbWFpbl9pZCA9IEFVRElPX1NTUl9ET01BSU5fQURTUCwKLQkJLnN0YXRlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOLAotCQkubmIgPSAmbm90aWZpZXJfc3NyX2Fkc3BfbmIKLQl9LAotCXsKLQkJLm5hbWUgPSAiU1NSX01PREVNIiwKLQkJLmRvbWFpbl9pZCA9IEFVRElPX1NTUl9ET01BSU5fTU9ERU0sCi0JCS5zdGF0ZSA9IEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTiwKLQkJLm5iID0gJm5vdGlmaWVyX3Nzcl9tb2RlbV9uYgotCX0gfSwKLQotCXt7Ci0JCS5uYW1lID0gIlBEUl9BRFNQIiwKLQkJLmRvbWFpbl9pZCA9IEFVRElPX1BEUl9ET01BSU5fQURTUCwKLQkJLnN0YXRlID0gVU5JTklUX1NFUlZJQ0UsCi0JCS5uYiA9ICZub3RpZmllcl9wZHJfYWRzcF9uYgotCX0sCi0JewkvKiBQRFIgTU9ERU0gc2VydmljZSBub3QgZW5hYmxlZCAqLwotCQkubmFtZSA9ICJJTlZBTElEIiwKLQkJLnN0YXRlID0gTk9fU0VSVklDRSwKLQkJLm5iID0gTlVMTAotCX0gfQotfTsKLQotLyogTWFzdGVyIGxpc3Qgb2YgYWxsIGF1ZGlvIG5vdGlmaWVyIGNsaWVudHMgKi8KLXN0cnVjdCBsaXN0X2hlYWQgICBjbGllbnRfbGlzdDsKLXN0cnVjdCBtdXRleCAgICAgICBub3RpZmllcl9tdXRleDsKLQotc3RhdGljIGludCBhdWRpb19ub3RpZmVyX2dldF9kZWZhdWx0X3NlcnZpY2UoaW50IGRvbWFpbikKLXsKLQlpbnQgc2VydmljZSA9IE5PX1NFUlZJQ0U7Ci0KLQkvKiBpbml0aWFsIHNlcnZpY2UgdG8gY29ubmVjdCBwZXIgZG9tYWluICovCi0Jc3dpdGNoIChkb21haW4pIHsKLQljYXNlIEFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOOgotCQlzZXJ2aWNlID0gQVVESU9fTk9USUZJRVJfUERSX1NFUlZJQ0U7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOOgotCQlzZXJ2aWNlID0gQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBzZXJ2aWNlOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb19ub3RpZmVyX2Rpc2FibGVfc2VydmljZShpbnQgc2VydmljZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBVURJT19OT1RJRklFUl9NQVhfRE9NQUlOUzsgaSsrKQotCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1baV0uc3RhdGUgPSBOT19TRVJWSUNFOwotfQotCi1zdGF0aWMgYm9vbCBhdWRpb19ub3RpZmVyX2lzX3NlcnZpY2VfZW5hYmxlZChpbnQgc2VydmljZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBVURJT19OT1RJRklFUl9NQVhfRE9NQUlOUzsgaSsrKQotCQlpZiAoc2VydmljZV9kYXRhW3NlcnZpY2VdW2ldLnN0YXRlICE9IE5PX1NFUlZJQ0UpCi0JCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX25vdGlmZXJfaW5pdF9zZXJ2aWNlKGludCBzZXJ2aWNlKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFVRElPX05PVElGSUVSX01BWF9ET01BSU5TOyBpKyspIHsKLQkJaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtpXS5zdGF0ZSA9PSBVTklOSVRfU0VSVklDRSkKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtpXS5zdGF0ZSA9Ci0JCQkJQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOOwotCX0KLX0KLQotc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3JlZ19zZXJ2aWNlKGludCBzZXJ2aWNlLCBpbnQgZG9tYWluKQotewotCXZvaWQgKmhhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY3Vycl9zdGF0ZSA9IEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjsKLQotCXN3aXRjaCAoc2VydmljZSkgewotCWNhc2UgQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U6Ci0JCWhhbmRsZSA9IGF1ZGlvX3Nzcl9yZWdpc3RlcigKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmRvbWFpbl9pZCwKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRToKLQkJaGFuZGxlID0gYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIoCi0JCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5kb21haW5faWQsCi0JCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYiwgJmN1cnJfc3RhdGUpOwotCi0JCWlmIChjdXJyX3N0YXRlID09IFNFUlZSRUdfTk9USUZfU0VSVklDRV9TVEFURV9VUF9WMDEpCi0JCQljdXJyX3N0YXRlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDsKLQkJZWxzZQotCQkJY3Vycl9zdGF0ZSA9IEFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXJ2aWNlICVkXG4iLAotCQkJX19mdW5jX18sIHNlcnZpY2UpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCXByX2VycigiJXM6IGhhbmRsZSBpcyBpbmNvcnJlY3QgZm9yIHNlcnZpY2UgJXNcbiIsCi0JCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUgPSBjdXJyX3N0YXRlOwotCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmhhbmRsZSA9IGhhbmRsZTsKLQotCXByX2luZm8oIiVzOiBzZXJ2aWNlICVzIGlzIGluIHVzZVxuIiwKLQkJX19mdW5jX18sIHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5hbWUpOwotCXByX2RlYnVnKCIlczogc2VydmljZSAlcyBoYXMgY3VycmVudCBzdGF0ZSAlZCwgaGFuZGxlIDB4JXBLXG4iLAotCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwKLQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUsCi0JCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmhhbmRsZSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9kZXJlZ19zZXJ2aWNlKGludCBzZXJ2aWNlLCBpbnQgZG9tYWluKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKHNlcnZpY2UpIHsKLQljYXNlIEFVRElPX05PVElGSUVSX1NTUl9TRVJWSUNFOgotCQlyZXQgPSBhdWRpb19zc3JfZGVyZWdpc3RlcigKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmhhbmRsZSwKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRToKLQkJcmV0ID0gYXVkaW9fcGRyX3NlcnZpY2VfZGVyZWdpc3RlcigKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLmhhbmRsZSwKLQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXJ2aWNlICVkXG4iLAotCQkJX19mdW5jX18sIHNlcnZpY2UpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGRlcmVnaXN0ZXIgZmFpbGVkIGZvciBzZXJ2aWNlICVzLCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogc2VydmljZSAlcyB3aXRoIGhhbmRsZSAweCVwSyBkZXJlZ2lzdGVyZWRcbiIsCi0JCV9fZnVuY19fLCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAotCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5oYW5kbGUpOwotCi0Jc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUgPSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV047Ci0Jc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uaGFuZGxlID0gTlVMTDsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3JlZ19jbGllbnRfc2VydmljZShzdHJ1Y3QgY2xpZW50X2RhdGEgKmNsaWVudF9kYXRhLAotCQkJCQkgICAgaW50IHNlcnZpY2UpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGRvbWFpbiA9IGNsaWVudF9kYXRhLT5kb21haW47Ci0Jc3RydWN0IGF1ZGlvX25vdGlmaWVyX2NiX2RhdGEgZGF0YTsKLQotCXN3aXRjaCAoc2VydmljZSkgewotCWNhc2UgQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U6Ci0JY2FzZSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRToKLQkJaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzID09IDApCi0JCQlyZXQgPSBhdWRpb19ub3RpZmVyX3JlZ19zZXJ2aWNlKHNlcnZpY2UsIGRvbWFpbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2VydmljZSBmb3IgY2xpZW50ICVzLCBzZXJ2aWNlICVkLCBkb21haW4gJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLCBzZXJ2aWNlLCBkb21haW4pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkIG9uIHNlcnZpY2UgJXMgZm9yIGNsaWVudCAlc1xuIiwKLQkJCV9fZnVuY19fLCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAotCQkJY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lKTsKLQkJZ290byBkb25lOwotCX0KLQotCWNsaWVudF9kYXRhLT5zZXJ2aWNlID0gc2VydmljZTsKLQlzcmN1X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKAotCQkmc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uY2xpZW50X25iX2xpc3QsCi0JCWNsaWVudF9kYXRhLT5uYik7Ci0Jc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubnVtX29mX2NsaWVudHMrKzsKLQotCXByX2RlYnVnKCIlczogcmVnaXN0ZXJlZCBjbGllbnQgJXMgb24gc2VydmljZSAlcywgY3VycmVudCBzdGF0ZSAweCV4XG4iLAotCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAotCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAotCQlzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSk7Ci0KLQkvKgotCSAqIFBEUiByZWdpc3RyYXRpb24gcmV0dXJucyBjdXJyZW50IHN0YXRlCi0JICogRm9yY2UgY2FsbGJhY2sgb2YgY2xpZW50IHdpdGggY3VycmVudCBzdGF0ZSBmb3IgUERSCi0JICovCi0JaWYgKGNsaWVudF9kYXRhLT5zZXJ2aWNlID09IEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFKSB7Ci0JCWRhdGEuc2VydmljZSA9IHNlcnZpY2U7Ci0JCWRhdGEuZG9tYWluID0gZG9tYWluOwotCQkodm9pZCljbGllbnRfZGF0YS0+bmItPm5vdGlmaWVyX2NhbGwoY2xpZW50X2RhdGEtPm5iLAotCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uc3RhdGUsICZkYXRhKTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9yZWdfY2xpZW50KHN0cnVjdCBjbGllbnRfZGF0YSAqY2xpZW50X2RhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHNlcnZpY2U7Ci0JaW50IGRvbWFpbiA9IGNsaWVudF9kYXRhLT5kb21haW47Ci0KLQlzZXJ2aWNlID0gYXVkaW9fbm90aWZlcl9nZXRfZGVmYXVsdF9zZXJ2aWNlKGRvbWFpbik7Ci0JaWYgKHNlcnZpY2UgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNlcnZpY2UgJWQgaXMgaW5jb3JyZWN0XG4iLCBfX2Z1bmNfXywgc2VydmljZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBTZWFyY2ggdGhyb3VnaCBzZXJ2aWNlcyB0byBmaW5kIGEgdmFsaWQgb25lIHRvIHJlZ2lzdGVyIGNsaWVudCBvbi4gKi8KLQlmb3IgKDsgc2VydmljZSA+PSAwOyBzZXJ2aWNlLS0pIHsKLQkJLyogSWYgYSBzZXJ2aWNlIGlzIG5vdCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgdG8gY29tZSB1cC4gKi8KLQkJaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLnN0YXRlID09IFVOSU5JVF9TRVJWSUNFKQotCQkJZ290byBkb25lOwotCQkvKiBTa2lwIHVuc3VwcG9ydGVkIHNlcnZpY2UgYW5kIGRvbWFpbiBjb21iaW5hdGlvbnMuICovCi0JCWlmIChzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5zdGF0ZSA8IDApCi0JCQljb250aW51ZTsKLQkJLyogT25seSByZWdpc3RlciBjbGllbnRzIHdobyBoYXZlIG5vdCBhY3F1aXJlZCBhIHNlcnZpY2UuICovCi0JCWlmIChjbGllbnRfZGF0YS0+c2VydmljZSAhPSBOT19TRVJWSUNFKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogT25seSByZWdpc3RlciBjbGllbnRzLCB3aG8gaGF2ZSBub3QgYWNxdWlyZWQgYSBzZXJ2aWNlLCBvbgotCQkgKiB0aGUgYmVzdCBhdmFpbGFibGUgc2VydmljZSBmb3IgdGhlaXIgZG9tYWluLiBVbmluaXRpYWxpemVkCi0JCSAqIHNlcnZpY2VzIHdpbGwgdHJ5IHRvIHJlZ2lzdGVyIGFsbCBvZiB0aGVpciBjbGllbnRzIGFmdGVyCi0JCSAqIHRoZXkgaW5pdGlhbGl6ZSBjb3JyZWN0bHkgb3Igd2lsbCBkaXNhYmxlIHRoZWlyIHNlcnZpY2UgYW5kCi0JCSAqIHJlZ2lzdGVyIGNsaWVudHMgb24gdGhlIG5leHQgYmVzdCBhdmFpYWxhYmxlIHNlcnZpY2UuCi0JCSAqLwotCQlwcl9kZWJ1ZygiJXM6IHJlZ2lzdGVyIGNsaWVudCAlcyBvbiBzZXJ2aWNlICVzIiwKLQkJCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAotCQkJCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm5hbWUpOwotCi0JCXJldCA9IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudF9zZXJ2aWNlKGNsaWVudF9kYXRhLCBzZXJ2aWNlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBjbGllbnQgJXMgZmFpbGVkIHRvIHJlZ2lzdGVyIG9uIHNlcnZpY2UgJXMiLAotCQkJCV9fZnVuY19fLCBjbGllbnRfZGF0YS0+Y2xpZW50X25hbWUsCi0JCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSk7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9kZXJlZ19jbGllbnQoc3RydWN0IGNsaWVudF9kYXRhICpjbGllbnRfZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgc2VydmljZSA9IGNsaWVudF9kYXRhLT5zZXJ2aWNlOwotCWludCBkb21haW4gPSBjbGllbnRfZGF0YS0+ZG9tYWluOwotCi0Jc3dpdGNoIChjbGllbnRfZGF0YS0+c2VydmljZSkgewotCWNhc2UgQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0U6Ci0JY2FzZSBBVURJT19OT1RJRklFUl9QRFJfU0VSVklDRToKLQkJaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzID09IDEpCi0JCQlyZXQgPSBhdWRpb19ub3RpZmVyX2RlcmVnX3NlcnZpY2Uoc2VydmljZSwgZG9tYWluKTsKLQkJYnJlYWs7Ci0JY2FzZSBOT19TRVJWSUNFOgotCQlnb3RvIGRvbmU7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXJ2aWNlIGZvciBjbGllbnQgJXMsIHNlcnZpY2UgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAotCQkJY2xpZW50X2RhdGEtPnNlcnZpY2UpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZGVyZWdpc3RlciBmYWlsZWQgZm9yIGNsaWVudCAlcyBvbiBzZXJ2aWNlICVzLCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lLAotCQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHNyY3Vfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3Rlcigmc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uCi0JCQkJCSAgICAgY2xpZW50X25iX2xpc3QsIGNsaWVudF9kYXRhLT5uYik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogc3JjdV9ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyIGZhaWxlZCwgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGRlcmVnaXN0ZXJlZCBjbGllbnQgJXMgb24gc2VydmljZSAlc1xuIiwKLQkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKLQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSk7Ci0KLQljbGllbnRfZGF0YS0+c2VydmljZSA9IE5PX1NFUlZJQ0U7Ci0JaWYgKHNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLm51bV9vZl9jbGllbnRzID4gMCkKLQkJc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubnVtX29mX2NsaWVudHMtLTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fbm90aWZlcl9yZWdfYWxsX2NsaWVudHModm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjbGllbnRfZGF0YSAqY2xpZW50X2RhdGE7Ci0JaW50IHJldDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZjbGllbnRfbGlzdCkgewotCQljbGllbnRfZGF0YSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgY2xpZW50X2RhdGEsIGxpc3QpOwotCi0JCXJldCA9IGF1ZGlvX25vdGlmZXJfcmVnX2NsaWVudChjbGllbnRfZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogYXVkaW9fbm90aWZlcl9yZWdfY2xpZW50IGZhaWxlZCBmb3IgY2xpZW50ICVzLCByZXQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKLQkJCQlyZXQpOwotCX0KLX0KLQotc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3Bkcl9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKmRhdGEpCi17Ci0JcHJfZGVidWcoIiVzOiBBdWRpbyBQRFIgZnJhbWV3b3JrIHN0YXRlIDB4JWx4XG4iLAotCQlfX2Z1bmNfXywgb3Bjb2RlKTsKLQltdXRleF9sb2NrKCZub3RpZmllcl9tdXRleCk7Ci0JaWYgKG9wY29kZSA9PSBBVURJT19QRFJfRlJBTUVXT1JLX0RPV04pCi0JCWF1ZGlvX25vdGlmZXJfZGlzYWJsZV9zZXJ2aWNlKEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFKTsKLQllbHNlCi0JCWF1ZGlvX25vdGlmZXJfaW5pdF9zZXJ2aWNlKEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFKTsKLQotCWF1ZGlvX25vdGlmZXJfcmVnX2FsbF9jbGllbnRzKCk7Ci0JbXV0ZXhfdW5sb2NrKCZub3RpZmllcl9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGRyX25iID0gewotCS5ub3RpZmllcl9jYWxsICA9IGF1ZGlvX25vdGlmZXJfcGRyX2NhbGxiYWNrLAotCS5wcmlvcml0eSA9IDAsCi19OwotCi1zdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfY29udmVydF9vcGNvZGUodW5zaWduZWQgbG9uZyBvcGNvZGUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKm5vdGlmaWVyX29wY29kZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBTVUJTWVNfQkVGT1JFX1NIVVRET1dOOgotCWNhc2UgU0VSVlJFR19OT1RJRl9TRVJWSUNFX1NUQVRFX0RPV05fVjAxOgotCQkqbm90aWZpZXJfb3Bjb2RlID0gQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOOwotCQlicmVhazsKLQljYXNlIFNVQlNZU19BRlRFUl9QT1dFUlVQOgotCWNhc2UgU0VSVlJFR19OT1RJRl9TRVJWSUNFX1NUQVRFX1VQX1YwMToKLQkJKm5vdGlmaWVyX29wY29kZSA9IEFVRElPX05PVElGSUVSX1NFUlZJQ0VfVVA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogVW51c2VkIG9wY29kZSAweCVseFxuIiwgX19mdW5jX18sIG9wY29kZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdWRpb19ub3RpZmVyX3NlcnZpY2VfY2IodW5zaWduZWQgbG9uZyBvcGNvZGUsCi0JCQkJICAgIGludCBzZXJ2aWNlLCBpbnQgZG9tYWluKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgbm90aWZpZXJfb3Bjb2RlOwotCXN0cnVjdCBhdWRpb19ub3RpZmllcl9jYl9kYXRhIGRhdGE7Ci0KLQlpZiAoYXVkaW9fbm90aWZlcl9jb252ZXJ0X29wY29kZShvcGNvZGUsICZub3RpZmllcl9vcGNvZGUpIDwgMCkKLQkJZ290byBkb25lOwotCi0JZGF0YS5zZXJ2aWNlID0gc2VydmljZTsKLQlkYXRhLmRvbWFpbiA9IGRvbWFpbjsKLQotCXByX2RlYnVnKCIlczogc2VydmljZSAlcywgb3Bjb2RlIDB4JWx4XG4iLAotCQlfX2Z1bmNfXywgc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0ubmFtZSwgbm90aWZpZXJfb3Bjb2RlKTsKLQotCW11dGV4X2xvY2soJm5vdGlmaWVyX211dGV4KTsKLQotCXNlcnZpY2VfZGF0YVtzZXJ2aWNlXVtkb21haW5dLnN0YXRlID0gbm90aWZpZXJfb3Bjb2RlOwotCXJldCA9IHNyY3Vfbm90aWZpZXJfY2FsbF9jaGFpbigmc2VydmljZV9kYXRhW3NlcnZpY2VdW2RvbWFpbl0uCi0JCWNsaWVudF9uYl9saXN0LCBub3RpZmllcl9vcGNvZGUsICZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogc3JjdV9ub3RpZmllcl9jYWxsX2NoYWluIHJldHVybmVkICVkLCBzZXJ2aWNlICVzLCBvcGNvZGUgMHglbHhcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBzZXJ2aWNlX2RhdGFbc2VydmljZV1bZG9tYWluXS5uYW1lLAotCQkJbm90aWZpZXJfb3Bjb2RlKTsKLQotCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOwotZG9uZToKLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfcGRyX2Fkc3BfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIGF1ZGlvX25vdGlmZXJfc2VydmljZV9jYihvcGNvZGUsCi0JCQkJCUFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFLAotCQkJCQlBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTik7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fbm90aWZlcl9zc3JfYWRzcF9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKLXsKLQlpZiAob3Bjb2RlID09IFNVQlNZU19CRUZPUkVfU0hVVERPV04pCi0JCWF1ZGlvX3Nzcl9zZW5kX25taShkYXRhKTsKLQotCXJldHVybiBhdWRpb19ub3RpZmVyX3NlcnZpY2VfY2Iob3Bjb2RlLAotCQkJCQlBVURJT19OT1RJRklFUl9TU1JfU0VSVklDRSwKLQkJCQkJQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU4pOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX25vdGlmZXJfc3NyX21vZGVtX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gYXVkaW9fbm90aWZlcl9zZXJ2aWNlX2NiKG9wY29kZSwKLQkJCQkJQVVESU9fTk9USUZJRVJfU1NSX1NFUlZJQ0UsCi0JCQkJCUFVRElPX05PVElGSUVSX01PREVNX0RPTUFJTik7Ci19Ci0KLWludCBhdWRpb19ub3RpZmllcl9kZXJlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lKQotewotCWludCByZXQgPSAwOwotCWludCByZXQyOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGNsaWVudF9kYXRhICpjbGllbnRfZGF0YSA9IE5VTEw7Ci0KLQlpZiAoY2xpZW50X25hbWUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjbGllbnRfbmFtZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbXV0ZXhfbG9jaygmbm90aWZpZXJfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZjbGllbnRfbGlzdCkgewotCQljbGllbnRfZGF0YSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgY2xpZW50X2RhdGEsIGxpc3QpOwotCQlpZiAoIXN0cmNtcChjbGllbnRfbmFtZSwgY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lKSkgewotCQkJcmV0MiA9IGF1ZGlvX25vdGlmZXJfZGVyZWdfY2xpZW50KGNsaWVudF9kYXRhKTsKLQkJCWlmIChyZXQyIDwgMCkgewotCQkJCXByX2VycigiJXM6IGF1ZGlvX25vdGlmZXJfZGVyZWdfY2xpZW50IGZhaWxlZCwgcmV0ICVkXG4sIHNlcnZpY2UgJWQsIGRvbWFpbiAlZCIsCi0JCQkJCV9fZnVuY19fLCByZXQyLCBjbGllbnRfZGF0YS0+c2VydmljZSwKLQkJCQkJY2xpZW50X2RhdGEtPmRvbWFpbik7Ci0JCQkJcmV0ID0gcmV0MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWxpc3RfZGVsKCZjbGllbnRfZGF0YS0+bGlzdCk7Ci0JCQlrZnJlZShjbGllbnRfZGF0YSk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZub3RpZmllcl9tdXRleCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX25vdGlmaWVyX2RlcmVnaXN0ZXIpOwotCi1pbnQgYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUsIGludCBkb21haW4sCi0JCQkgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBjbGllbnRfZGF0YSAqY2xpZW50X2RhdGE7Ci0KLQlpZiAoY2xpZW50X25hbWUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjbGllbnRfbmFtZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKG5iID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTm90aWZpZXIgYmxvY2sgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY2xpZW50X2RhdGEgPSBrbWFsbG9jKHNpemVvZigqY2xpZW50X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2xpZW50X2RhdGEgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCUlOSVRfTElTVF9IRUFEKCZjbGllbnRfZGF0YS0+bGlzdCk7Ci0JY2xpZW50X2RhdGEtPm5iID0gbmI7Ci0Jc3RybGNweShjbGllbnRfZGF0YS0+Y2xpZW50X25hbWUsIGNsaWVudF9uYW1lLAotCQlzaXplb2YoY2xpZW50X2RhdGEtPmNsaWVudF9uYW1lKSk7Ci0JY2xpZW50X2RhdGEtPnNlcnZpY2UgPSBOT19TRVJWSUNFOwotCWNsaWVudF9kYXRhLT5kb21haW4gPSBkb21haW47Ci0KLQltdXRleF9sb2NrKCZub3RpZmllcl9tdXRleCk7Ci0JcmV0ID0gYXVkaW9fbm90aWZlcl9yZWdfY2xpZW50KGNsaWVudF9kYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQltdXRleF91bmxvY2soJm5vdGlmaWVyX211dGV4KTsKLQkJcHJfZXJyKCIlczogYXVkaW9fbm90aWZlcl9yZWdfY2xpZW50IGZvciBjbGllbnQgJXMgZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIGNsaWVudF9kYXRhLT5jbGllbnRfbmFtZSwKLQkJCXJldCk7Ci0JCWtmcmVlKGNsaWVudF9kYXRhKTsKLQkJZ290byBkb25lOwotCX0KLQlsaXN0X2FkZF90YWlsKCZjbGllbnRfZGF0YS0+bGlzdCwgJmNsaWVudF9saXN0KTsKLQltdXRleF91bmxvY2soJm5vdGlmaWVyX211dGV4KTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19ub3RpZmllcl9zdWJzeXNfaW5pdCh2b2lkKQotewotCWludCBpLCBqOwotCi0JbXV0ZXhfaW5pdCgmbm90aWZpZXJfbXV0ZXgpOwotCUlOSVRfTElTVF9IRUFEKCZjbGllbnRfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IEFVRElPX05PVElGSUVSX01BWF9TRVJWSUNFUzsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBBVURJT19OT1RJRklFUl9NQVhfRE9NQUlOUzsgaisrKSB7Ci0JCQlpZiAoc2VydmljZV9kYXRhW2ldW2pdLnN0YXRlIDw9IE5PX1NFUlZJQ0UpCi0JCQkJY29udGludWU7Ci0KLQkJCXNyY3VfaW5pdF9ub3RpZmllcl9oZWFkKAotCQkJCSZzZXJ2aWNlX2RhdGFbaV1bal0uY2xpZW50X25iX2xpc3QpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1zdWJzeXNfaW5pdGNhbGwoYXVkaW9fbm90aWZpZXJfc3Vic3lzX2luaXQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19ub3RpZmllcl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGF1ZGlvX3Bkcl9yZWdpc3RlcigmcGRyX25iKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9kZWJ1ZygiJXM6IFBEUiByZWdpc3RlciBmYWlsZWQsIHJldCA9ICVkLCBkaXNhYmxlIHNlcnZpY2VcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJYXVkaW9fbm90aWZlcl9kaXNhYmxlX3NlcnZpY2UoQVVESU9fTk9USUZJRVJfUERSX1NFUlZJQ0UpOwotCX0KLQotCS8qIERvIG5vdCByZXR1cm4gZXJyb3Igc2luY2UgUERSIGVuYWJsZW1lbnQgaXMgbm90IGNyaXRpY2FsICovCi0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChhdWRpb19ub3RpZmllcl9pbml0KTsKLQotc3RhdGljIGludCBfX2luaXQgYXVkaW9fbm90aWZpZXJfbGF0ZV9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBJZiBwZHIgcmVnaXN0cmF0aW9uIGZhaWxlZCwgcmVnaXN0ZXIgY2xpZW50cyBvbiBuZXh0IHNlcnZpY2UKLQkgKiBEbyBpbiBsYXRlIGluaXQgdG8gZW5zdXJlIHRoYXQgU1NSIHN1YnN5c3RlbSBpcyBpbml0aWFsaXplZAotCSAqLwotCW11dGV4X2xvY2soJm5vdGlmaWVyX211dGV4KTsKLQlpZiAoIWF1ZGlvX25vdGlmZXJfaXNfc2VydmljZV9lbmFibGVkKEFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFKSkKLQkJYXVkaW9fbm90aWZlcl9yZWdfYWxsX2NsaWVudHMoKTsKLQotCW11dGV4X3VubG9jaygmbm90aWZpZXJfbXV0ZXgpOwotCXJldHVybiAwOwotfQotbGF0ZV9pbml0Y2FsbChhdWRpb19ub3RpZmllcl9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Bkci5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Bkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlkMTlhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19wZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fcGRyLmg+Ci0jaW5jbHVkZSA8c29jL3Fjb20vc2VydmljZS1sb2NhdG9yLmg+Ci0jaW5jbHVkZSA8c29jL3Fjb20vc2VydmljZS1ub3RpZmllci5oPgotCi1zdGF0aWMgc3RydWN0IHBkX3FtaV9jbGllbnRfZGF0YSBhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9NQVhdID0gewotCXsJLyogQVVESU9fUERSX0RPTUFJTl9BRFNQICovCi0JCS5jbGllbnRfbmFtZSA9ICJhdWRpb19wZHJfYWRzcCIsCi0JCS5zZXJ2aWNlX25hbWUgPSAiYXZzL2F1ZGlvIgotCX0KLX07Ci0KLXN0cnVjdCBzcmN1X25vdGlmaWVyX2hlYWQgYXVkaW9fcGRyX2NiX2xpc3Q7Ci0KLXN0YXRpYyBpbnQgYXVkaW9fcGRyX2xvY2F0b3JfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgcGRyX3N0YXRlID0gQVVESU9fUERSX0ZSQU1FV09SS19ET1dOOwotCi0JaWYgKG9wY29kZSA9PSBMT0NBVE9SX0RPV04pIHsKLQkJcHJfZGVidWcoIiVzOiBTZXJ2aWNlICVzIGlzIGRvd24hIiwgX19mdW5jX18sCi0JCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS4KLQkJCXNlcnZpY2VfbmFtZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltZW1jcHkoJmF1ZGlvX3Bkcl9zZXJ2aWNlcywgZGF0YSwKLQkJc2l6ZW9mKGF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdKSk7Ci0JaWYgKGF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdLnRvdGFsX2RvbWFpbnMgPT0gMSkgewotCQlwcl9kZWJ1ZygiJXM6IFNlcnZpY2UgJXMsIHJldHVybmVkIHRvdGFsIGRvbWFpbnMgJWQsICIsCi0JCQlfX2Z1bmNfXywKLQkJCWF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdLnNlcnZpY2VfbmFtZSwKLQkJCWF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdLgotCQkJdG90YWxfZG9tYWlucyk7Ci0JCXBkcl9zdGF0ZSA9IEFVRElPX1BEUl9GUkFNRVdPUktfVVA7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UKLQkJcHJfZXJyKCIlczogU2VydmljZSAlcyByZXR1cm5lZCBpbnZhbGlkIHRvdGFsIGRvbWFpbnMgJWQiLAotCQkJX19mdW5jX18sCi0JCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS5zZXJ2aWNlX25hbWUsCi0JCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS4KLQkJCXRvdGFsX2RvbWFpbnMpOwotZG9uZToKLQlzcmN1X25vdGlmaWVyX2NhbGxfY2hhaW4oJmF1ZGlvX3Bkcl9jYl9saXN0LCBwZHJfc3RhdGUsIE5VTEwpOwotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYXVkaW9fcGRyX2xvY2F0b3JfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBhdWRpb19wZHJfbG9jYXRvcl9jYWxsYmFjaywKLQkucHJpb3JpdHkgPSAwLAotfTsKLQotaW50IGF1ZGlvX3Bkcl9yZWdpc3RlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCWlmIChuYiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE5vdGlmaWVyIGJsb2NrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBzcmN1X25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZhdWRpb19wZHJfY2JfbGlzdCwgbmIpOwotfQotRVhQT1JUX1NZTUJPTChhdWRpb19wZHJfcmVnaXN0ZXIpOwotCi12b2lkICphdWRpb19wZHJfc2VydmljZV9yZWdpc3RlcihpbnQgZG9tYWluX2lkLAotCQkJCSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCBpbnQgKmN1cnJfc3RhdGUpCi17Ci0Jdm9pZCAqaGFuZGxlOwotCi0JaWYgKChkb21haW5faWQgPCAwKSB8fAotCSAgICAoZG9tYWluX2lkID49IEFVRElPX1BEUl9ET01BSU5fTUFYKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgSUQgJWRcbiIsIF9fZnVuY19fLCBkb21haW5faWQpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0KLQloYW5kbGUgPSBzZXJ2aWNlX25vdGlmX3JlZ2lzdGVyX25vdGlmaWVyKAotCQlhdWRpb19wZHJfc2VydmljZXNbZG9tYWluX2lkXS5kb21haW5fbGlzdFswXS5uYW1lLAotCQlhdWRpb19wZHJfc2VydmljZXNbZG9tYWluX2lkXS5kb21haW5fbGlzdFswXS5pbnN0YW5jZV9pZCwKLQkJbmIsIGN1cnJfc3RhdGUpOwotCWlmIChJU19FUlJfT1JfTlVMTChoYW5kbGUpKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byByZWdpc3RlciBmb3Igc2VydmljZSAlcywgaW5zdGFuY2UgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWF1ZGlvX3Bkcl9zZXJ2aWNlc1tkb21haW5faWRdLmRvbWFpbl9saXN0WzBdLm5hbWUsCi0JCQlhdWRpb19wZHJfc2VydmljZXNbZG9tYWluX2lkXS5kb21haW5fbGlzdFswXS4KLQkJCWluc3RhbmNlX2lkKTsKLQl9Ci0JcmV0dXJuIGhhbmRsZTsKLX0KLUVYUE9SVF9TWU1CT0woYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIpOwotCi1pbnQgYXVkaW9fcGRyX3NlcnZpY2VfZGVyZWdpc3Rlcih2b2lkICpzZXJ2aWNlX2hhbmRsZSwKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCWludCByZXQ7Ci0KLQlpZiAoc2VydmljZV9oYW5kbGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBzZXJ2aWNlIGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBzZXJ2aWNlX25vdGlmX3VucmVnaXN0ZXJfbm90aWZpZXIoCi0JCXNlcnZpY2VfaGFuZGxlLCBuYik7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IEZhaWxlZCB0byBkZXJlZ2lzdGVyIHNlcnZpY2UgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX3Bkcl9zZXJ2aWNlX2RlcmVnaXN0ZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19wZHJfc3Vic3lzX2luaXQodm9pZCkKLXsKLQlzcmN1X2luaXRfbm90aWZpZXJfaGVhZCgmYXVkaW9fcGRyX2NiX2xpc3QpOwotCXJldHVybiAwOwotfQotc3Vic3lzX2luaXRjYWxsKGF1ZGlvX3Bkcl9zdWJzeXNfaW5pdCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF1ZGlvX3Bkcl9sYXRlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2V0X3NlcnZpY2VfbG9jYXRpb24oCi0JCWF1ZGlvX3Bkcl9zZXJ2aWNlc1tBVURJT19QRFJfRE9NQUlOX0FEU1BdLmNsaWVudF9uYW1lLAotCQlhdWRpb19wZHJfc2VydmljZXNbQVVESU9fUERSX0RPTUFJTl9BRFNQXS5zZXJ2aWNlX25hbWUsCi0JCSZhdWRpb19wZHJfbG9jYXRvcl9uYik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlcyBnZXRfc2VydmljZV9sb2NhdGlvbiBmYWlsZWQgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXNyY3Vfbm90aWZpZXJfY2FsbF9jaGFpbigmYXVkaW9fcGRyX2NiX2xpc3QsCi0JCQkJCSBBVURJT19QRFJfRlJBTUVXT1JLX0RPV04sIE5VTEwpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1sYXRlX2luaXRjYWxsKGF1ZGlvX3Bkcl9sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Nzci5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL2F1ZGlvX3Nzci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjZmYjJhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcWRzcDZ2Mi9hdWRpb19zc3IuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19zc3IuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zY20uaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fcmVzdGFydC5oPgotI2luY2x1ZGUgPHNvYy9xY29tL3N1YnN5c3RlbV9ub3RpZi5oPgotCi0jZGVmaW5lIFNDTV9RNl9OTUlfQ01EIDB4MQotCi1zdGF0aWMgY2hhciAqYXVkaW9fc3NyX2RvbWFpbnNbXSA9IHsKLQkiYWRzcCIsCi0JIm1vZGVtIgotfTsKLQotdm9pZCAqYXVkaW9fc3NyX3JlZ2lzdGVyKGludCBkb21haW5faWQsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JaWYgKChkb21haW5faWQgPCAwKSB8fAotCSAgICAoZG9tYWluX2lkID49IEFVRElPX1NTUl9ET01BSU5fTUFYKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgSUQgJWRcbiIsIF9fZnVuY19fLCBkb21haW5faWQpOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0KLQlyZXR1cm4gc3Vic3lzX25vdGlmX3JlZ2lzdGVyX25vdGlmaWVyKAotCQlhdWRpb19zc3JfZG9tYWluc1tkb21haW5faWRdLCBuYik7Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX3Nzcl9yZWdpc3Rlcik7Ci0KLWludCBhdWRpb19zc3JfZGVyZWdpc3Rlcih2b2lkICpoYW5kbGUsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIHN1YnN5c19ub3RpZl91bnJlZ2lzdGVyX25vdGlmaWVyKGhhbmRsZSwgbmIpOwotfQotRVhQT1JUX1NZTUJPTChhdWRpb19zc3JfZGVyZWdpc3Rlcik7Ci0KLXZvaWQgYXVkaW9fc3NyX3NlbmRfbm1pKHZvaWQgKnNzcl9jYl9kYXRhKQotewotCXN0cnVjdCBub3RpZl9kYXRhICpkYXRhID0gKHN0cnVjdCBub3RpZl9kYXRhICopc3NyX2NiX2RhdGE7Ci0Jc3RydWN0IHNjbV9kZXNjIGRlc2M7Ci0KLQlpZiAoZGF0YSAmJiBkYXRhLT5jcmFzaGVkKSB7Ci0JCS8qIFNlbmQgTk1JIHRvIFFEU1A2IHZpYSBhbiBTQ00gY2FsbC4gKi8KLQkJaWYgKCFpc19zY21fYXJtdjgoKSkgewotCQkJc2NtX2NhbGxfYXRvbWljMShTQ01fU1ZDX1VUSUwsCi0JCQkJCSBTQ01fUTZfTk1JX0NNRCwgMHgxKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2MuYXJnc1swXSA9IDB4MTsKLQkJCWRlc2MuYXJnaW5mbyA9IFNDTV9BUkdTKDEpOwotCQkJc2NtX2NhbGwyX2F0b21pYyhTQ01fU0lQX0ZOSUQoU0NNX1NWQ19VVElMLAotCQkJCQkgU0NNX1E2X05NSV9DTUQpLCAmZGVzYyk7Ci0JCX0KLQkJLyogVGhlIHdyaXRlIHNob3VsZCBnbyB0aHJvdWdoIGJlZm9yZSBxNiBpcyBzaHV0ZG93biAqLwotCQltYigpOwotCQlwcl9kZWJ1ZygiJXM6IFE2IE5NSSB3YXMgc2VudC5cbiIsIF9fZnVuY19fKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGF1ZGlvX3Nzcl9zZW5kX25taSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvbXNtX2F1ZGlvX2lvbi5jIGIvZHJpdmVycy9zb2MvcWNvbS9xZHNwNnYyL21zbV9hdWRpb19pb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNGM3NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3Fkc3A2djIvbXNtX2F1ZGlvX2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS1pb21tdS5oPgotCi0jZGVmaW5lIE1TTV9BVURJT19JT05fUFJPQkVEICgxIDw8IDApCi0KLSNkZWZpbmUgTVNNX0FVRElPX0lPTl9QSFlTX0FERFIoYWxsb2NfZGF0YSkgXAotCWFsbG9jX2RhdGEtPnRhYmxlLT5zZ2wtPmRtYV9hZGRyZXNzCi0KLSNkZWZpbmUgTVNNX0FVRElPX0lPTl9WQV9TVEFSVCAweDEwMDAwMDAwCi0jZGVmaW5lIE1TTV9BVURJT19JT05fVkFfTEVOIDB4MEZGRkZGRkYKLQotI2RlZmluZSBNU01fQVVESU9fU01NVV9TSURfT0ZGU0VUIDMyCi0KLXN0cnVjdCBtc21fYXVkaW9faW9uX3ByaXZhdGUgewotCWJvb2wgc21tdV9lbmFibGVkOwotCWJvb2wgYXVkaW9oZWFwX2VuYWJsZWQ7Ci0Jc3RydWN0IGRldmljZSAqY2JfZGV2OwotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZzsKLQl1OCBkZXZpY2Vfc3RhdHVzOwotCXN0cnVjdCBsaXN0X2hlYWQgYWxsb2NfbGlzdDsKLQlzdHJ1Y3QgbXV0ZXggbGlzdF9tdXRleDsKLQl1NjQgc21tdV9zaWRfYml0czsKLQl1MzIgc21tdV92ZXJzaW9uOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhIHsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0Jc2l6ZV90IGxlbjsKLQlzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZjsKLQlzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRhY2g7Ci0Jc3RydWN0IHNnX3RhYmxlICp0YWJsZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1zbV9hdWRpb19pb25fcHJpdmF0ZSBtc21fYXVkaW9faW9uX2RhdGEgPSB7MCx9OwotCi1zdGF0aWMgaW50IG1zbV9hdWRpb19pb25fZ2V0X3BoeXMoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCi0JCQkJICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKLQotc3RhdGljIGludCBtc21fYXVkaW9fZG1hX2J1Zl9tYXAoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCi0JCQkJICBpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKTsKLQotc3RhdGljIGludCBtc21fYXVkaW9fZG1hX2J1Zl91bm1hcChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOwotCi1zdGF0aWMgdm9pZCBtc21fYXVkaW9faW9uX2FkZF9hbGxvY2F0aW9uKAotCXN0cnVjdCBtc21fYXVkaW9faW9uX3ByaXZhdGUgKm1zbV9hdWRpb19pb25fZGF0YSwKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsbG9jX2RhdGEgKmFsbG9jX2RhdGEpCi17Ci0JLyoKLQkgKiBTaW5jZSB0aGVzZSBBUElzIGNhbiBiZSBpbnZva2VkIGJ5IG11bHRpcGxlCi0JICogY2xpZW50cywgdGhlcmUgaXMgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGxpc3QKLQkgKiBvZiBhbGxvY2F0aW9ucyBpcyBhbHdheXMgcHJvdGVjdGVkCi0JICovCi0JbXV0ZXhfbG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS0+bGlzdF9tdXRleCkpOwotCWxpc3RfYWRkX3RhaWwoJihhbGxvY19kYXRhLT5saXN0KSwKLQkJICAgICAgJihtc21fYXVkaW9faW9uX2RhdGEtPmFsbG9jX2xpc3QpKTsKLQltdXRleF91bmxvY2soJihtc21fYXVkaW9faW9uX2RhdGEtPmxpc3RfbXV0ZXgpKTsKLX0KLQotaW50IG1zbV9hdWRpb19pb25fYWxsb2MoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlvbl9jbGllbnQgKipjbGllbnQsCi0JCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmhhbmRsZSwgc2l6ZV90IGJ1ZnN6LAotCQkJaW9uX3BoeXNfYWRkcl90ICpwYWRkciwgc2l6ZV90ICpwYV9sZW4sIHZvaWQgKip2YWRkcikKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZXJyX2lvbl9wdHIgPSAwOwotCi0JaWYgKChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkID09IHRydWUpICYmCi0JICAgICEobXNtX2F1ZGlvX2lvbl9kYXRhLmRldmljZV9zdGF0dXMgJiBNU01fQVVESU9fSU9OX1BST0JFRCkpIHsKLQkJcHJfZGVidWcoIiVzOnByb2JlIGlzIG5vdCBkb25lLCBkZWZlcnJlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKLQl9Ci0JaWYgKCFuYW1lIHx8ICFjbGllbnQgfHwgIWhhbmRsZSB8fCAhcGFkZHIgfHwgIXZhZGRyCi0JCXx8ICFidWZzeiB8fCAhcGFfbGVuKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkqY2xpZW50ID0gbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKG5hbWUpOwotCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKSgqY2xpZW50KSkpIHsKLQkJcHJfZXJyKCIlczogSU9OIGNyZWF0ZSBjbGllbnQgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkqaGFuZGxlID0gaW9uX2FsbG9jKCpjbGllbnQsIGJ1ZnN6LCBTWl80SywKLQkJCUlPTl9IRUFQKElPTl9BVURJT19IRUFQX0lEKSwgMCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKLQkJaWYgKG1zbV9hdWRpb19pb25fZGF0YS5zbW11X2VuYWJsZWQgPT0gdHJ1ZSkgewotCQkJcHJfZGVidWcoInN5c3RlbSBoZWFwIGlzIHVzZWQiKTsKLQkJCW1zbV9hdWRpb19pb25fZGF0YS5hdWRpb2hlYXBfZW5hYmxlZCA9IDA7Ci0JCQkqaGFuZGxlID0gaW9uX2FsbG9jKCpjbGllbnQsIGJ1ZnN6LCBTWl80SywKLQkJCQkJSU9OX0hFQVAoSU9OX1NZU1RFTV9IRUFQX0lEKSwgMCk7Ci0JCX0KLQkJaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKLQkJCWlmIChJU19FUlIoKHZvaWQgKikoKmhhbmRsZSkpKQotCQkJCWVycl9pb25fcHRyID0gUFRSX0VSUigoaW50ICopKCpoYW5kbGUpKTsKLQkJCXByX2VycigiJXM6SU9OIGFsbG9jIGZhaWwgZXJyIHB0cj0lbGQsIHNtbXVfZW5hYmxlZD0lZFxuIiwKLQkJCV9fZnVuY19fLCBlcnJfaW9uX3B0ciwgbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9pb25fY2xpZW50OwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoImF1ZGlvIGhlYXAgaXMgdXNlZCIpOwotCQltc21fYXVkaW9faW9uX2RhdGEuYXVkaW9oZWFwX2VuYWJsZWQgPSAxOwotCX0KLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cygqY2xpZW50LCAqaGFuZGxlLCBwYWRkciwgcGFfbGVuKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogSU9OIEdldCBQaHlzaWNhbCBmb3IgQVVESU8gZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBlcnJfaW9uX2hhbmRsZTsKLQl9Ci0KLQkqdmFkZHIgPSBpb25fbWFwX2tlcm5lbCgqY2xpZW50LCAqaGFuZGxlKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKikqdmFkZHIpKSB7Ci0JCXByX2VycigiJXM6IElPTiBtZW1vcnkgbWFwcGluZyBmb3IgQVVESU8gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2lvbl9oYW5kbGU7Ci0JfQotCXByX2RlYnVnKCIlczogbWFwcGVkIGFkZHJlc3MgPSAlcEssIHNpemU9JXpkXG4iLCBfX2Z1bmNfXywKLQkJKnZhZGRyLCBidWZzeik7Ci0KLQlpZiAoYnVmc3ogIT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IG1lbXNldCB0byAwICVwSyAlemRcbiIsIF9fZnVuY19fLCAqdmFkZHIsIGJ1ZnN6KTsKLQkJbWVtc2V0KCh2b2lkICopKnZhZGRyLCAwLCBidWZzeik7Ci0JfQotCi0JcmV0dXJuIHJjOwotCi1lcnJfaW9uX2hhbmRsZToKLQlpb25fZnJlZSgqY2xpZW50LCAqaGFuZGxlKTsKLWVycl9pb25fY2xpZW50OgotCW1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koKmNsaWVudCk7Ci0JKmhhbmRsZSA9IE5VTEw7Ci0JKmNsaWVudCA9IE5VTEw7Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChtc21fYXVkaW9faW9uX2FsbG9jKTsKLQotaW50IG1zbV9hdWRpb19pb25faW1wb3J0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpb25fY2xpZW50ICoqY2xpZW50LAotCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKLQkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKLQkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICgobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCA9PSB0cnVlKSAmJgotCSAgICAhKG1zbV9hdWRpb19pb25fZGF0YS5kZXZpY2Vfc3RhdHVzICYgTVNNX0FVRElPX0lPTl9QUk9CRUQpKSB7Ci0JCXByX2RlYnVnKCIlczpwcm9iZSBpcyBub3QgZG9uZSwgZGVmZXJyZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCi0JaWYgKCFuYW1lIHx8ICFjbGllbnQgfHwgIWhhbmRsZSB8fCAhcGFkZHIgfHwgIXZhZGRyIHx8ICFwYV9sZW4pIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkqY2xpZW50ID0gbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKG5hbWUpOwotCWlmIChJU19FUlJfT1JfTlVMTCgodm9pZCAqKSgqY2xpZW50KSkpIHsKLQkJcHJfZXJyKCIlczogSU9OIGNyZWF0ZSBjbGllbnQgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIG5hbWUgc2hvdWxkIGJlIGF1ZGlvX2FjZGJfY2xpZW50IG9yIEF1ZGlvX0RlY19DbGllbnQsCi0JICogYnVmc3ogc2hvdWxkIGJlIDAgYW5kIGZkIHNob3VsZG4ndCBiZSAwIGFzIG9mIG5vdwotCSAqLwotCSpoYW5kbGUgPSBpb25faW1wb3J0X2RtYV9idWZfZmQoKmNsaWVudCwgZmQpOwotCXByX2RlYnVnKCIlczogRE1BIEJ1ZiBuYW1lPSVzLCBmZD0lZCBoYW5kbGU9JXBLXG4iLCBfX2Z1bmNfXywKLQkJCQkJCQluYW1lLCBmZCwgKmhhbmRsZSk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopICgqaGFuZGxlKSkpIHsKLQkJcHJfZXJyKCIlczogaW9uIGltcG9ydCBkbWEgYnVmZmVyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJfZGVzdHJveV9jbGllbnQ7Ci0JfQotCi0JaWYgKGlvbmZsYWcgIT0gTlVMTCkgewotCQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKCpjbGllbnQsICpoYW5kbGUsIGlvbmZsYWcpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBlcnJfaW9uX2hhbmRsZTsKLQkJfQotCX0KLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cygqY2xpZW50LCAqaGFuZGxlLCBwYWRkciwgcGFfbGVuKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogSU9OIEdldCBQaHlzaWNhbCBmb3IgQVVESU8gZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX2lvbl9oYW5kbGU7Ci0JfQotCi0JKnZhZGRyID0gaW9uX21hcF9rZXJuZWwoKmNsaWVudCwgKmhhbmRsZSk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopKnZhZGRyKSkgewotCQlwcl9lcnIoIiVzOiBJT04gbWVtb3J5IG1hcHBpbmcgZm9yIEFVRElPIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2lvbl9oYW5kbGU7Ci0JfQotCXByX2RlYnVnKCIlczogbWFwcGVkIGFkZHJlc3MgPSAlcEssIHNpemU9JXpkXG4iLCBfX2Z1bmNfXywKLQkJKnZhZGRyLCBidWZzeik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2lvbl9oYW5kbGU6Ci0JaW9uX2ZyZWUoKmNsaWVudCwgKmhhbmRsZSk7Ci1lcnJfZGVzdHJveV9jbGllbnQ6Ci0JbXNtX2F1ZGlvX2lvbl9jbGllbnRfZGVzdHJveSgqY2xpZW50KTsKLQkqY2xpZW50ID0gTlVMTDsKLQkqaGFuZGxlID0gTlVMTDsKLWVycjoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fYXVkaW9faW9uX2ZyZWUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKLXsKLQlpZiAoIWNsaWVudCB8fCAhaGFuZGxlKSB7Ci0JCXByX2VycigiJXMgSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKQotCQltc21fYXVkaW9fZG1hX2J1Zl91bm1hcChjbGllbnQsIGhhbmRsZSk7Ci0KLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQotCWlvbl9mcmVlKGNsaWVudCwgaGFuZGxlKTsKLQltc21fYXVkaW9faW9uX2NsaWVudF9kZXN0cm95KGNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hdWRpb19pb25fZnJlZSk7Ci0KLWludCBtc21fYXVkaW9faW9uX21tYXAoc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIsCi0JCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZtYS0+dm1fc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmICogUEFHRV9TSVpFOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JdGFibGUgPSBpb25fc2dfdGFibGUoYWItPmNsaWVudCwgYWItPmhhbmRsZSk7Ci0KLQlpZiAoSVNfRVJSKHRhYmxlKSkgewotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHNnX3RhYmxlIGZyb20gaW9uOiAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgUFRSX0VSUih0YWJsZSkpOwotCQlyZXR1cm4gUFRSX0VSUih0YWJsZSk7Ci0JfSBlbHNlIGlmICghdGFibGUpIHsKLQkJcHJfZXJyKCIlczogc2dfbGlzdCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIHVuY2FjaGVkICovCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKLQotCS8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgYSBwYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNnIGxpc3QgYmVjYXVzZToKLQkgKiBJZiB0aGUgYWxsb2NhdGlvbiBjYW1lIGZyb20gYSBjYXJ2ZW91dCB3ZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZQotCSAqIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBjYXJ2ZWQgb3V0IG1lbW9yeS4gVGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlCi0JICogZnV0dXJlIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIHRoZSBlbHNlIHN0YXRlbWVudC4KLQkgKi8KLQlwYWdlID0gc2dfcGFnZSh0YWJsZS0+c2dsKTsKLQlpZiAocGFnZSkgewotCQlwcl9kZWJ1ZygiJXM6IHBhZ2UgaXMgTk9UIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5uZW50cywgaSkgewotCQkJdW5zaWduZWQgbG9uZyByZW1haW5kZXIgPSB2bWEtPnZtX2VuZCAtIGFkZHI7Ci0JCQl1bnNpZ25lZCBsb25nIGxlbiA9IHNnLT5sZW5ndGg7Ci0KLQkJCXBhZ2UgPSBzZ19wYWdlKHNnKTsKLQotCQkJaWYgKG9mZnNldCA+PSBsZW4pIHsKLQkJCQlvZmZzZXQgLT0gbGVuOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChvZmZzZXQpIHsKLQkJCQlwYWdlICs9IG9mZnNldCAvIFBBR0VfU0laRTsKLQkJCQlsZW4gLT0gb2Zmc2V0OwotCQkJCW9mZnNldCA9IDA7Ci0JCQl9Ci0JCQlsZW4gPSBtaW4obGVuLCByZW1haW5kZXIpOwotCQkJcHJfZGVidWcoInZtYT0lcEssIGFkZHI9JXggbGVuPSVsZCB2bV9zdGFydD0leCB2bV9lbmQ9JXggdm1fcGFnZV9wcm90PSVsdVxuIiwKLQkJCQl2bWEsICh1bnNpZ25lZCBpbnQpYWRkciwgbGVuLAotCQkJCSh1bnNpZ25lZCBpbnQpdm1hLT52bV9zdGFydCwKLQkJCQkodW5zaWduZWQgaW50KXZtYS0+dm1fZW5kLAotCQkJCSh1bnNpZ25lZCBsb25nKXZtYS0+dm1fcGFnZV9wcm90LnBncHJvdCk7Ci0JCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCBhZGRyLCBwYWdlX3RvX3BmbihwYWdlKSwgbGVuLAotCQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JCQlhZGRyICs9IGxlbjsKLQkJCWlmIChhZGRyID49IHZtYS0+dm1fZW5kKQotCQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW9uX3BoeXNfYWRkcl90IHBoeXNfYWRkcjsKLQkJc2l6ZV90IHBoeXNfbGVuOwotCQlzaXplX3QgdmFfbGVuID0gMDsKLQotCQlwcl9kZWJ1ZygiJXM6IHBhZ2UgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBpb25fcGh5cyhhYi0+Y2xpZW50LCBhYi0+aGFuZGxlLCAmcGh5c19hZGRyLCAmcGh5c19sZW4pOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXMgYWRkcmVzcyBmcm9tIElPTiBidWZmZXI6ICVkXG4iCi0JCQkJLCBfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcHJfZGVidWcoInBoeXM9JXBLSyBsZW49JXpkXG4iLCAmcGh5c19hZGRyLCBwaHlzX2xlbik7Ci0JCXByX2RlYnVnKCJ2bWE9JXBLLCB2bV9zdGFydD0leCB2bV9lbmQ9JXggdm1fcGdvZmY9JWxkIHZtX3BhZ2VfcHJvdD0lbHVcbiIsCi0JCQl2bWEsICh1bnNpZ25lZCBpbnQpdm1hLT52bV9zdGFydCwKLQkJCSh1bnNpZ25lZCBpbnQpdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYsCi0JCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX3BhZ2VfcHJvdC5wZ3Byb3QpOwotCQl2YV9sZW4gPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0JCWlmICgob2Zmc2V0ID4gcGh5c19sZW4pIHx8ICh2YV9sZW4gPiBwaHlzX2xlbi1vZmZzZXQpKSB7Ci0JCQlwcl9lcnIoIndyb25nIG9mZnNldCBzaXplICVsZCwgbGVucz0gJXpkLCB2YV9sZW49JXpkXG4iLAotCQkJCW9mZnNldCwgcGh5c19sZW4sIHZhX2xlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZXQgPSAgcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCQlfX3BoeXNfdG9fcGZuKHBoeXNfYWRkcikgKyB2bWEtPnZtX3Bnb2ZmLAotCQkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKLQkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLWJvb2wgbXNtX2F1ZGlvX2lvbl9pc19zbW11X2F2YWlsYWJsZSh2b2lkKQotewotCXJldHVybiBtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkOwotfQotCi0vKiBtb3ZlIHRvIHN0YXRpYyBzZWN0aW9uIGFnYWluICovCi1zdHJ1Y3QgaW9uX2NsaWVudCAqbXNtX2F1ZGlvX2lvbl9jbGllbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGlvbl9jbGllbnQgKnBjbGllbnQgPSBOVUxMOwotCi0JcGNsaWVudCA9IG1zbV9pb25fY2xpZW50X2NyZWF0ZShuYW1lKTsKLQlyZXR1cm4gcGNsaWVudDsKLX0KLQotCi12b2lkIG1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCkKLXsKLQlwcl9kZWJ1ZygiJXM6IGNsaWVudCA9ICVwSyBzbW11X2VuYWJsZWQgPSAlZFxuIiwgX19mdW5jX18sCi0JCWNsaWVudCwgbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfZW5hYmxlZCk7Ci0KLQlpb25fY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKLX0KLQotaW50IG1zbV9hdWRpb19pb25faW1wb3J0X2xlZ2FjeShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIGludCBmZCwKLQkJCXVuc2lnbmVkIGxvbmcgKmlvbmZsYWcsIHNpemVfdCBidWZzeiwKLQkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghbmFtZSB8fCAhY2xpZW50IHx8ICFoYW5kbGUgfHwgIXBhZGRyIHx8ICF2YWRkciB8fCAhcGFfbGVuKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCS8qIGNsaWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIGxlZ2FjeSBhbmQgZ2l2ZW4KLQkgKiBuYW1lIHNob3VsZCBiZSBhdWRpb19hY2RiX2NsaWVudCBvciBBdWRpb19EZWNfQ2xpZW50LAotCSAqIGJ1ZnN6IHNob3VsZCBiZSAwIGFuZCBmZCBzaG91bGRuJ3QgYmUgMCBhcyBvZiBub3cKLQkgKi8KLQkqaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmX2ZkKGNsaWVudCwgZmQpOwotCXByX2RlYnVnKCIlczogRE1BIEJ1ZiBuYW1lPSVzLCBmZD0lZCBoYW5kbGU9JXBLXG4iLCBfX2Z1bmNfXywKLQkJCQkJCQluYW1lLCBmZCwgKmhhbmRsZSk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKCh2b2lkICopKCpoYW5kbGUpKSkgewotCQlwcl9lcnIoIiVzOiBpb24gaW1wb3J0IGRtYSBidWZmZXIgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChpb25mbGFnICE9IE5VTEwpIHsKLQkJcmMgPSBpb25faGFuZGxlX2dldF9mbGFncyhjbGllbnQsICpoYW5kbGUsIGlvbmZsYWcpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgZmxhZ3MgZm9yIHRoZSBoYW5kbGVcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfaW9uX2hhbmRsZTsKLQkJfQotCX0KLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9nZXRfcGh5cyhjbGllbnQsICpoYW5kbGUsIHBhZGRyLCBwYV9sZW4pOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBJT04gR2V0IFBoeXNpY2FsIGZvciBBVURJTyBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2lvbl9oYW5kbGU7Ci0JfQotCi0JLypOZWVkIHRvIGFkZCBjb25kaXRpb24gU01NVSBlbmFibGUgb3Igbm90ICovCi0JKnZhZGRyID0gaW9uX21hcF9rZXJuZWwoY2xpZW50LCAqaGFuZGxlKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoKHZvaWQgKikqdmFkZHIpKSB7Ci0JCXByX2VycigiJXM6IElPTiBtZW1vcnkgbWFwcGluZyBmb3IgQVVESU8gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlcnJfaW9uX2hhbmRsZTsKLQl9Ci0KLQlpZiAoYnVmc3ogIT0gMCkKLQkJbWVtc2V0KCh2b2lkICopKnZhZGRyLCAwLCBidWZzeik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2lvbl9oYW5kbGU6Ci0JaW9uX2ZyZWUoY2xpZW50LCAqaGFuZGxlKTsKLWVycjoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fYXVkaW9faW9uX2ZyZWVfbGVnYWN5KHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQkgICAgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQotewotCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKQotCQltc21fYXVkaW9fZG1hX2J1Zl91bm1hcChjbGllbnQsIGhhbmRsZSk7Ci0KLQlpb25fdW5tYXBfa2VybmVsKGNsaWVudCwgaGFuZGxlKTsKLQotCWlvbl9mcmVlKGNsaWVudCwgaGFuZGxlKTsKLQkvKiBubyBjbGllbnRfZGVzdHJvZHkgaW4gbGVnYWN5Ki8KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9hdWRpb19pb25fY2FjaGVfb3BlcmF0aW9ucyhzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYnVmZiwgaW50IGNhY2hlX29wKQotewotCXVuc2lnbmVkIGxvbmcgaW9uZmxhZyA9IDA7Ci0JaW50IHJjID0gMDsKLQlpbnQgbXNtX2NhY2hlX29wcyA9IDA7Ci0KLQlpZiAoIWFidWZmKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zOiAlcEtcbiIsIF9fZnVuY19fLCBhYnVmZik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IGlvbl9oYW5kbGVfZ2V0X2ZsYWdzKGFidWZmLT5jbGllbnQsIGFidWZmLT5oYW5kbGUsCi0JCSZpb25mbGFnKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCJpb25faGFuZGxlX2dldF9mbGFncyBmYWlsZWQ6ICVkXG4iLCByYyk7Ci0JCWdvdG8gY2FjaGVfb3BfZmFpbGVkOwotCX0KLQotCS8qIGhhcyB0byBiZSBDQUNIRUQgKi8KLQlpZiAoSU9OX0lTX0NBQ0hFRChpb25mbGFnKSkgewotCQkvKiBJT05fSU9DX0lOVl9DQUNIRVMgb3IgSU9OX0lPQ19DTEVBTl9DQUNIRVMgKi8KLQkJbXNtX2NhY2hlX29wcyA9IGNhY2hlX29wOwotCQlyYyA9IG1zbV9pb25fZG9fY2FjaGVfb3AoYWJ1ZmYtPmNsaWVudCwKLQkJCQlhYnVmZi0+aGFuZGxlLAotCQkJCSh1bnNpZ25lZCBsb25nICopIGFidWZmLT5kYXRhLAotCQkJCSh1bnNpZ25lZCBsb25nKWFidWZmLT5zaXplLAotCQkJCW1zbV9jYWNoZV9vcHMpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiY2FjaGUgb3BlcmF0aW9uIGZhaWxlZCAlZFxuIiwgcmMpOwotCQkJZ290byBjYWNoZV9vcF9mYWlsZWQ7Ci0JCX0KLQl9Ci1jYWNoZV9vcF9mYWlsZWQ6Ci0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX2F1ZGlvX2RtYV9idWZfbWFwKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCi0JCWlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pCi17Ci0KLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FsbG9jX2RhdGEgKmFsbG9jX2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqY2JfZGV2OwotCWludCByYyA9IDA7Ci0KLQljYl9kZXYgPSBtc21fYXVkaW9faW9uX2RhdGEuY2JfZGV2OwotCi0JLyogRGF0YSByZXF1aXJlZCBwZXIgYnVmZmVyIG1hcHBpbmcgKi8KLQlhbGxvY19kYXRhID0ga3phbGxvYyhzaXplb2YoKmFsbG9jX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFsbG9jX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogR2V0IHRoZSBJT04gaGFuZGxlIHNpemUgKi8KLQlpb25faGFuZGxlX2dldF9zaXplKGNsaWVudCwgaGFuZGxlLCBsZW4pOwotCi0JYWxsb2NfZGF0YS0+Y2xpZW50ID0gY2xpZW50OwotCWFsbG9jX2RhdGEtPmhhbmRsZSA9IGhhbmRsZTsKLQlhbGxvY19kYXRhLT5sZW4gPSAqbGVuOwotCi0JLyogR2V0IHRoZSBkbWFfYnVmIGhhbmRsZSBmcm9tIGlvbl9oYW5kbGUgKi8KLQlhbGxvY19kYXRhLT5kbWFfYnVmID0gaW9uX3NoYXJlX2RtYV9idWYoY2xpZW50LCBoYW5kbGUpOwotCWlmIChJU19FUlIoYWxsb2NfZGF0YS0+ZG1hX2J1ZikpIHsKLQkJcmMgPSBQVFJfRVJSKGFsbG9jX2RhdGEtPmRtYV9idWYpOwotCQlkZXZfZXJyKGNiX2RldiwKLQkJCSIlczogRmFpbCB0byBnZXQgZG1hX2J1ZiBoYW5kbGUsIHJjID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycl9kbWFfYnVmOwotCX0KLQotCS8qIEF0dGFjaCB0aGUgZG1hX2J1ZiB0byBjb250ZXh0IGJhbmsgZGV2aWNlICovCi0JYWxsb2NfZGF0YS0+YXR0YWNoID0gZG1hX2J1Zl9hdHRhY2goYWxsb2NfZGF0YS0+ZG1hX2J1ZiwKLQkJCQkJICAgIGNiX2Rldik7Ci0JaWYgKElTX0VSUihhbGxvY19kYXRhLT5hdHRhY2gpKSB7Ci0JCXJjID0gUFRSX0VSUihhbGxvY19kYXRhLT5hdHRhY2gpOwotCQlkZXZfZXJyKGNiX2RldiwKLQkJCSIlczogRmFpbCB0byBhdHRhY2ggZG1hX2J1ZiB0byBDQiwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX2F0dGFjaDsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdC4KLQkgKiBUaGVyZSBpcyBubyBpbmZvIGFzIHRoaXMgaXMgYSB3cml0ZSBidWZmZXIgb3IKLQkgKiByZWFkIGJ1ZmZlciwgaGVuY2UgdGhlIHJlcXVlc3QgaXMgYmktZGlyZWN0aW9uYWwKLQkgKiB0byBhY2NvbW1vZGF0ZSBib3RoIHJlYWQgYW5kIHdyaXRlIG1hcHBpbmdzLgotCSAqLwotCWFsbG9jX2RhdGEtPnRhYmxlID0gZG1hX2J1Zl9tYXBfYXR0YWNobWVudChhbGxvY19kYXRhLT5hdHRhY2gsCi0JCQkJRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChJU19FUlIoYWxsb2NfZGF0YS0+dGFibGUpKSB7Ci0JCXJjID0gUFRSX0VSUihhbGxvY19kYXRhLT50YWJsZSk7Ci0JCWRldl9lcnIoY2JfZGV2LAotCQkJIiVzOiBGYWlsIHRvIG1hcCBhdHRhY2htZW50LCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBlcnJfbWFwX2F0dGFjaDsKLQl9Ci0KLQlyYyA9IGRtYV9tYXBfc2coY2JfZGV2LCBhbGxvY19kYXRhLT50YWJsZS0+c2dsLAotCQkJYWxsb2NfZGF0YS0+dGFibGUtPm5lbnRzLAotCQkJRE1BX0JJRElSRUNUSU9OQUwpOwotCWlmIChyYyAhPSBhbGxvY19kYXRhLT50YWJsZS0+bmVudHMpIHsKLQkJZGV2X2VycihjYl9kZXYsCi0JCQkiJXM6IEZhaWwgdG8gbWFwIFNHLCByYyA9ICVkLCBuZW50cyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjLCBhbGxvY19kYXRhLT50YWJsZS0+bmVudHMpOwotCQlnb3RvIGVycl9tYXBfc2c7Ci0JfQotCS8qIE1ha2Ugc3VyZSBub3QgdG8gcmV0dXJuIHJjIGZyb20gZG1hX21hcF9zZywgYXMgaXQgY2FuIGJlIG5vbnplcm8gKi8KLQlyYyA9IDA7Ci0KLQkvKiBwaHlzaWNhbCBhZGRyZXNzIGZyb20gbWFwcGluZyAqLwotCSphZGRyID0gTVNNX0FVRElPX0lPTl9QSFlTX0FERFIoYWxsb2NfZGF0YSk7Ci0KLQltc21fYXVkaW9faW9uX2FkZF9hbGxvY2F0aW9uKCZtc21fYXVkaW9faW9uX2RhdGEsCi0JCQkJICAgICBhbGxvY19kYXRhKTsKLQlyZXR1cm4gcmM7Ci0KLWVycl9tYXBfc2c6Ci0JZG1hX2J1Zl91bm1hcF9hdHRhY2htZW50KGFsbG9jX2RhdGEtPmF0dGFjaCwKLQkJCQkgYWxsb2NfZGF0YS0+dGFibGUsCi0JCQkJIERNQV9CSURJUkVDVElPTkFMKTsKLWVycl9tYXBfYXR0YWNoOgotCWRtYV9idWZfZGV0YWNoKGFsbG9jX2RhdGEtPmRtYV9idWYsCi0JCSAgICAgICBhbGxvY19kYXRhLT5hdHRhY2gpOwotZXJyX2F0dGFjaDoKLQlkbWFfYnVmX3B1dChhbGxvY19kYXRhLT5kbWFfYnVmKTsKLQotZXJyX2RtYV9idWY6Ci0Ja2ZyZWUoYWxsb2NfZGF0YSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZGlvX2RtYV9idWZfdW5tYXAoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCQkgICBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhICphbGxvY19kYXRhID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBkZXZpY2UgKmNiX2RldiA9IG1zbV9hdWRpb19pb25fZGF0YS5jYl9kZXY7Ci0JYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0JLyoKLQkgKiBUaG91Z2ggbGlzdF9mb3JfZWFjaF9zYWZlIGlzIGRlbGV0ZSBzYWZlLCBsb2NrCi0JICogc2hvdWxkIGJlIGV4cGxpY2l0bHkgYWNxdWlyZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24KLQkgKiBvbiBhZGRpbmcgZWxlbWVudHMgdG8gdGhlIGxpc3QuCi0JICovCi0JbXV0ZXhfbG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS5saXN0X211dGV4KSk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSAgICAmKG1zbV9hdWRpb19pb25fZGF0YS5hbGxvY19saXN0KSkgewotCi0JCWFsbG9jX2RhdGEgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1zbV9hdWRpb19hbGxvY19kYXRhLAotCQkJCQlsaXN0KTsKLQotCQlpZiAoYWxsb2NfZGF0YS0+aGFuZGxlID09IGhhbmRsZSAmJgotCQkgICAgYWxsb2NfZGF0YS0+Y2xpZW50ID09IGNsaWVudCkgewotCQkJZm91bmQgPSB0cnVlOwotCQkJZG1hX3VubWFwX3NnKGNiX2RldiwKLQkJCQkgICAgYWxsb2NfZGF0YS0+dGFibGUtPnNnbCwKLQkJCQkgICAgYWxsb2NfZGF0YS0+dGFibGUtPm5lbnRzLAotCQkJCSAgICBETUFfQklESVJFQ1RJT05BTCk7Ci0KLQkJCWRtYV9idWZfdW5tYXBfYXR0YWNobWVudChhbGxvY19kYXRhLT5hdHRhY2gsCi0JCQkJCQkgYWxsb2NfZGF0YS0+dGFibGUsCi0JCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JCQlkbWFfYnVmX2RldGFjaChhbGxvY19kYXRhLT5kbWFfYnVmLAotCQkJCSAgICAgICBhbGxvY19kYXRhLT5hdHRhY2gpOwotCi0JCQlkbWFfYnVmX3B1dChhbGxvY19kYXRhLT5kbWFfYnVmKTsKLQotCQkJbGlzdF9kZWwoJihhbGxvY19kYXRhLT5saXN0KSk7Ci0JCQlrZnJlZShhbGxvY19kYXRhKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmKG1zbV9hdWRpb19pb25fZGF0YS5saXN0X211dGV4KSk7Ci0KLQlpZiAoIWZvdW5kKSB7Ci0JCWRldl9lcnIoY2JfZGV2LAotCQkJIiVzOiBjYW5ub3QgZmluZCBhbGxvY2F0aW9uLCBpb25faGFuZGxlICVwSywgaW9uX2NsaWVudCAlcEsiLAotCQkJX19mdW5jX18sIGhhbmRsZSwgY2xpZW50KTsKLQkJcmMgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fYXVkaW9faW9uX2dldF9waHlzKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUsCi0JCWlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pCi17Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogc21tdV9lbmFibGVkID0gJWRcbiIsIF9fZnVuY19fLAotCQltc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKTsKLQotCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKSB7Ci0JCXJjID0gbXNtX2F1ZGlvX2RtYV9idWZfbWFwKGNsaWVudCwgaGFuZGxlLCBhZGRyLCBsZW4pOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBtYXAgRE1BIGJ1ZiwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCS8qIEFwcGVuZCB0aGUgU01NVSBTSUQgaW5mb3JtYXRpb24gdG8gdGhlIElPVkEgYWRkcmVzcyAqLwotCQkqYWRkciB8PSBtc21fYXVkaW9faW9uX2RhdGEuc21tdV9zaWRfYml0czsKLQl9IGVsc2UgewotCQlyYyA9IGlvbl9waHlzKGNsaWVudCwgaGFuZGxlLCBhZGRyLCBsZW4pOwotCX0KLQotCXByX2RlYnVnKCJwaHlzPSVwSywgbGVuPSV6ZCwgcmM9JWRcbiIsICYoKmFkZHIpLCAqbGVuLCByYyk7Ci1lcnI6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9hdWRpb19zbW11X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZzsKLQlpbnQgcmV0OwotCi0JbWFwcGluZyA9IGFybV9pb21tdV9jcmVhdGVfbWFwcGluZygmcGxhdGZvcm1fYnVzX3R5cGUsCi0JCQkJCSAgIE1TTV9BVURJT19JT05fVkFfU1RBUlQsCi0JCQkJCSAgIE1TTV9BVURJT19JT05fVkFfTEVOKTsKLQlpZiAoSVNfRVJSKG1hcHBpbmcpKQotCQlyZXR1cm4gUFRSX0VSUihtYXBwaW5nKTsKLQotCXJldCA9IGFybV9pb21tdV9hdHRhY2hfZGV2aWNlKGRldiwgbWFwcGluZyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBBdHRhY2ggZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWxfYXR0YWNoOwotCX0KLQotCW1zbV9hdWRpb19pb25fZGF0YS5jYl9kZXYgPSBkZXY7Ci0JbXNtX2F1ZGlvX2lvbl9kYXRhLm1hcHBpbmcgPSBtYXBwaW5nOwotCUlOSVRfTElTVF9IRUFEKCZtc21fYXVkaW9faW9uX2RhdGEuYWxsb2NfbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmKG1zbV9hdWRpb19pb25fZGF0YS5saXN0X211dGV4KSk7Ci0KLQlyZXR1cm4gMDsKLQotZmFpbF9hdHRhY2g6Ci0JYXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZyhtYXBwaW5nKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fYXVkaW9faW9uX2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1hdWRpby1pb24iIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2F1ZGlvX2lvbl9kdF9tYXRjaCk7Ci0KLQotdTMyIG1zbV9hdWRpb19pb25fZ2V0X3NtbXVfc2lkX21vZGUzMih2b2lkKQotewotCWlmIChtc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkKQotCQlyZXR1cm4gdXBwZXJfMzJfYml0cyhtc21fYXVkaW9faW9uX2RhdGEuc21tdV9zaWRfYml0cyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotdTMyIG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGlvbl9waHlzX2FkZHJfdCBwYSkKLXsKLQlpZiAoc2l6ZW9mKGlvbl9waHlzX2FkZHJfdCkgPT0gc2l6ZW9mKHUzMikpCi0JCXJldHVybiBtc21fYXVkaW9faW9uX2dldF9zbW11X3NpZF9tb2RlMzIoKTsKLQllbHNlCi0JCXJldHVybiB1cHBlcl8zMl9iaXRzKHBhKTsKLX0KLQotc3RhdGljIGludCBtc21fYXVkaW9faW9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjID0gMDsKLQljb25zdCBjaGFyICptc21fYXVkaW9faW9uX2R0ID0gInFjb20sc21tdS1lbmFibGVkIjsKLQljb25zdCBjaGFyICptc21fYXVkaW9faW9uX3NtbXUgPSAicWNvbSxzbW11LXZlcnNpb24iOwotCWNvbnN0IGNoYXIgKm1zbV9hdWRpb19pb25fc21tdV9zaWRfbWFzayA9ICJxY29tLHNtbXUtc2lkLW1hc2siOwotCWJvb2wgc21tdV9lbmFibGVkOwotCWVudW0gYXByX3N1YnN5c19zdGF0ZSBxNl9zdGF0ZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCi0JaWYgKGRldi0+b2Zfbm9kZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIiVzOiBkZXZpY2UgdHJlZSBpcyBub3QgZm91bmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCW1zbV9hdWRpb19pb25fZGF0YS5zbW11X2VuYWJsZWQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzbW11X2VuYWJsZWQgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICAgIG1zbV9hdWRpb19pb25fZHQpOwotCW1zbV9hdWRpb19pb25fZGF0YS5zbW11X2VuYWJsZWQgPSBzbW11X2VuYWJsZWQ7Ci0KLQlpZiAoc21tdV9lbmFibGVkKSB7Ci0JCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLAotCQkJCQltc21fYXVkaW9faW9uX3NtbXUsCi0JCQkJCSZtc21fYXVkaW9faW9uX2RhdGEuc21tdV92ZXJzaW9uKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwKLQkJCQkiJXM6IHFjb20sc21tdV92ZXJzaW9uIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQkJZGV2X2RiZyhkZXYsICIlczogU01NVSB2ZXJzaW9uIGlzICglZCkiLCBfX2Z1bmNfXywKLQkJCQltc21fYXVkaW9faW9uX2RhdGEuc21tdV92ZXJzaW9uKTsKLQkJcTZfc3RhdGUgPSBhcHJfZ2V0X3E2X3N0YXRlKCk7Ci0JCWlmIChxNl9zdGF0ZSA9PSBBUFJfU1VCU1lTX0RPV04pIHsKLQkJCWRldl9kYmcoZGV2LAotCQkJCSJkZWZlcmluZyAlcywgYWRzcF9zdGF0ZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcTZfc3RhdGUpOwotCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JCX0KLQkJZGV2X2RiZyhkZXYsICIlczogYWRzcCBpcyByZWFkeVxuIiwgX19mdW5jX18pOwotCX0KLQotCWRldl9kYmcoZGV2LCAiJXM6IFNNTVUgaXMgJXNcbiIsIF9fZnVuY19fLAotCQkoc21tdV9lbmFibGVkKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotCi0JaWYgKHNtbXVfZW5hYmxlZCkgewotCQl1NjQgc21tdV9zaWQgPSAwOwotCQl1NjQgc21tdV9zaWRfbWFzayA9IDA7Ci0JCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgaW9tbXVzcGVjOwotCi0JCS8qIEdldCBTTU1VIFNJRCBpbmZvcm1hdGlvbiBmcm9tIERldmljZXRyZWUgKi8KLQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3U2NChkZXYtPm9mX25vZGUsCi0JCQkJCSAgbXNtX2F1ZGlvX2lvbl9zbW11X3NpZF9tYXNrLAotCQkJCQkgICZzbW11X3NpZF9tYXNrKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRldiwKLQkJCQkiJXM6IHFjb20sc21tdS1zaWQtbWFzayBtaXNzaW5nIGluIERUIG5vZGUsIHVzaW5nIGRlZmF1bHRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJc21tdV9zaWRfbWFzayA9IDB4RkZGRkZGRkZGRkZGRkZGRjsKLQkJfQotCQlyYyA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zfbm9kZSwgImlvbW11cyIsCi0JCQkJCQkiI2lvbW11LWNlbGxzIiwgMCwgJmlvbW11c3BlYyk7Ci0JCWlmIChyYykKLQkJCWRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBnZXQgc21tdSBTSUQsIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWVsc2UKLQkJCXNtbXVfc2lkID0gKGlvbW11c3BlYy5hcmdzWzBdICYgc21tdV9zaWRfbWFzayk7Ci0KLQkJbXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfc2lkX2JpdHMgPQotCQkJc21tdV9zaWQgPDwgTVNNX0FVRElPX1NNTVVfU0lEX09GRlNFVDsKLQotCQlpZiAobXNtX2F1ZGlvX2lvbl9kYXRhLnNtbXVfdmVyc2lvbiA9PSAweDIpIHsKLQkJCXJjID0gbXNtX2F1ZGlvX3NtbXVfaW5pdChkZXYpOwotCQl9IGVsc2UgewotCQkJZGV2X2VycihkZXYsICIlczogc21tdSB2ZXJzaW9uIGludmFsaWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIG1zbV9hdWRpb19pb25fZGF0YS5zbW11X3ZlcnNpb24pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCWlmIChyYykKLQkJCWRldl9lcnIoZGV2LCAiJXM6IHNtbXUgaW5pdCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JfQotCi0JaWYgKCFyYykKLQkJbXNtX2F1ZGlvX2lvbl9kYXRhLmRldmljZV9zdGF0dXMgfD0gTVNNX0FVRElPX0lPTl9QUk9CRUQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZGlvX2lvbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmc7Ci0Jc3RydWN0IGRldmljZSAqYXVkaW9fY2JfZGV2OwotCi0JbWFwcGluZyA9IG1zbV9hdWRpb19pb25fZGF0YS5tYXBwaW5nOwotCWF1ZGlvX2NiX2RldiA9IG1zbV9hdWRpb19pb25fZGF0YS5jYl9kZXY7Ci0KLQlpZiAoYXVkaW9fY2JfZGV2ICYmIG1hcHBpbmcpIHsKLQkJYXJtX2lvbW11X2RldGFjaF9kZXZpY2UoYXVkaW9fY2JfZGV2KTsKLQkJYXJtX2lvbW11X3JlbGVhc2VfbWFwcGluZyhtYXBwaW5nKTsKLQl9Ci0KLQltc21fYXVkaW9faW9uX2RhdGEuc21tdV9lbmFibGVkID0gMDsKLQltc21fYXVkaW9faW9uX2RhdGEuZGV2aWNlX3N0YXR1cyA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9hdWRpb19pb25fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1hdWRpby1pb24iLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2F1ZGlvX2lvbl9kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9hdWRpb19pb25fcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9hdWRpb19pb25fcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2F1ZGlvX2lvbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2F1ZGlvX2lvbl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXNtX2F1ZGlvX2lvbl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9hdWRpb19pb25fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fYXVkaW9faW9uX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtc21fYXVkaW9faW9uX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBdWRpbyBJT04gbW9kdWxlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3JhbWR1bXAuYyBiL2RyaXZlcnMvc29jL3Fjb20vcmFtZHVtcC5jCmluZGV4IGRkNzcwNjIuLmU0YzFiYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcmFtZHVtcC5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcmFtZHVtcC5jCkBAIC0zOCw2ICszOCw4IEBACiBzdGF0aWMgREVGSU5FX0lEQShyZF9taW5vcl9pZCk7CiBzdGF0aWMgYm9vbCByYW1kdW1wX2Rldm5vZGVfaW5pdGVkOwogI2RlZmluZSBSQU1EVU1QX1dBSVRfTVNFQ1MJMTIwMDAwCisjZGVmaW5lIE1BWF9TVFJUQkxfU0laRSA1MTIKKyNkZWZpbmUgTUFYX05BTUVfTEVOR1RIIDE2CiAKIHN0cnVjdCByYW1kdW1wX2RldmljZSB7CiAJY2hhciBuYW1lWzI1Nl07CkBAIC00NTIsMTIgKzQ1NCwxNDMgQEAKIAogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbGZfc2hkciAqZWxmX3NoZWFkZXIoc3RydWN0IGVsZmhkciAqaGRyKQoreworCXJldHVybiAoc3RydWN0IGVsZl9zaGRyICopKChzaXplX3QpaGRyICsgKHNpemVfdCloZHItPmVfc2hvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbGZfc2hkciAqZWxmX3NlY3Rpb24oc3RydWN0IGVsZmhkciAqaGRyLCBpbnQgaWR4KQoreworCXJldHVybiAmZWxmX3NoZWFkZXIoaGRyKVtpZHhdOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmVsZl9zdHJfdGFibGUoc3RydWN0IGVsZmhkciAqaGRyKQoreworCWlmIChoZHItPmVfc2hzdHJuZHggPT0gU0hOX1VOREVGKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKGNoYXIgKiloZHIgKyBlbGZfc2VjdGlvbihoZHIsIGhkci0+ZV9zaHN0cm5keCktPnNoX29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2V0X3NlY3Rpb25fbmFtZShjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICAgc3RydWN0IGVsZmhkciAqZWhkcikKK3sKKwljaGFyICpzdHJ0YWIgPSBlbGZfc3RyX3RhYmxlKGVoZHIpOworCXN0YXRpYyBpbnQgc3RydGFibGVfaWR4ID0gMTsKKwlpbnQgaWR4LCByZXQgPSAwOworCisJaWR4ID0gc3RydGFibGVfaWR4OworCWlmICgoc3RydGFiID09IE5VTEwpIHx8IChuYW1lID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGlkeDsKKwlpZHggKz0gc3RybGNweSgoc3RydGFiICsgaWR4KSwgbmFtZSwgTUFYX05BTUVfTEVOR1RIKTsKKwlzdHJ0YWJsZV9pZHggPSBpZHggKyAxOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfZG9fbWluaWR1bXAodm9pZCAqaGFuZGxlLCBzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50ICpzZWdtZW50cywKKwkJaW50IG5zZWdtZW50cykKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCByYW1kdW1wX2RldmljZSAqcmRfZGV2ID0gKHN0cnVjdCByYW1kdW1wX2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgZWxmaGRyICplaGRyOworCXN0cnVjdCBlbGZfc2hkciAqc2hkcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydGJsX29mZjsKKworCWlmICghcmRfZGV2LT5jb25zdW1lcl9wcmVzZW50KSB7CisJCXByX2VycigiUmFtZHVtcCglcyk6IE5vIGNvbnN1bWVycy4gQWJvcnRpbmcuLlxuIiwgcmRfZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FUElQRTsKKwl9CisKKwlyZF9kZXYtPnNlZ21lbnRzID0gc2VnbWVudHM7CisJcmRfZGV2LT5uc2VnbWVudHMgPSBuc2VnbWVudHM7CisKKwlyZF9kZXYtPmVsZmNvcmVfc2l6ZSA9IHNpemVvZigqZWhkcikgKworCQkJKHNpemVvZigqc2hkcikgKiAobnNlZ21lbnRzICsgMikpICsgTUFYX1NUUlRCTF9TSVpFOworCWVoZHIgPSBremFsbG9jKHJkX2Rldi0+ZWxmY29yZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlyZF9kZXYtPmVsZmNvcmVfYnVmID0gKGNoYXIgKillaGRyOworCWlmICghcmRfZGV2LT5lbGZjb3JlX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKTsKKwllaGRyLT5lX2lkZW50W0VJX0NMQVNTXSA9IEVMRl9DTEFTUzsKKwllaGRyLT5lX2lkZW50W0VJX0RBVEFdID0gRUxGX0RBVEE7CisJZWhkci0+ZV9pZGVudFtFSV9WRVJTSU9OXSA9IEVWX0NVUlJFTlQ7CisJZWhkci0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZfT1NBQkk7CisJZWhkci0+ZV90eXBlID0gRVRfQ09SRTsKKwllaGRyLT5lX21hY2hpbmUgID0gRUxGX0FSQ0g7CisJZWhkci0+ZV92ZXJzaW9uID0gRVZfQ1VSUkVOVDsKKwllaGRyLT5lX2Voc2l6ZSA9IHNpemVvZigqZWhkcik7CisJZWhkci0+ZV9zaG9mZiA9IHNpemVvZigqZWhkcik7CisJZWhkci0+ZV9zaGVudHNpemUgPSBzaXplb2YoKnNoZHIpOworCWVoZHItPmVfc2hzdHJuZHggPSAxOworCisKKwlvZmZzZXQgPSByZF9kZXYtPmVsZmNvcmVfc2l6ZTsKKwlzaGRyID0gKHN0cnVjdCBlbGZfc2hkciAqKShlaGRyICsgMSk7CisJc3RydGJsX29mZiA9IHNpemVvZigqZWhkcikgKyBzaXplb2YoKnNoZHIpICogKG5zZWdtZW50cyArIDIpOworCXNoZHIrKzsKKwlzaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKKwlzaGRyLT5zaF9vZmZzZXQgPSAoZWxmX2FkZHJfdClzdHJ0Ymxfb2ZmOworCXNoZHItPnNoX3NpemUgPSBNQVhfU1RSVEJMX1NJWkU7CisJc2hkci0+c2hfZW50c2l6ZSA9IDA7CisJc2hkci0+c2hfZmxhZ3MgPSAwOworCXNoZHItPnNoX25hbWUgPSBzZXRfc2VjdGlvbl9uYW1lKCJTVFJfVEJMIiwgZWhkcik7CisJc2hkcisrOworCisJZm9yIChpID0gMDsgaSA8IG5zZWdtZW50czsgaSsrLCBzaGRyKyspIHsKKwkJLyogVXBkYXRlIGVsZiBoZWFkZXIgKi8KKwkJc2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKKwkJc2hkci0+c2hfbmFtZSA9IHNldF9zZWN0aW9uX25hbWUoc2VnbWVudHNbaV0ubmFtZSwgZWhkcik7CisJCXNoZHItPnNoX2FkZHIgPSAoZWxmX2FkZHJfdClzZWdtZW50c1tpXS5hZGRyZXNzOworCQlzaGRyLT5zaF9zaXplID0gc2VnbWVudHNbaV0uc2l6ZTsKKwkJc2hkci0+c2hfZmxhZ3MgPSBTSEZfV1JJVEU7CisJCXNoZHItPnNoX29mZnNldCA9IG9mZnNldDsKKwkJc2hkci0+c2hfZW50c2l6ZSA9IDA7CisJCW9mZnNldCArPSBzaGRyLT5zaF9zaXplOworCX0KKwllaGRyLT5lX3NobnVtID0gbnNlZ21lbnRzICsgMjsKKworCXJkX2Rldi0+ZGF0YV9yZWFkeSA9IDE7CisJcmRfZGV2LT5yYW1kdW1wX3N0YXR1cyA9IC0xOworCisJcmVpbml0X2NvbXBsZXRpb24oJnJkX2Rldi0+cmFtZHVtcF9jb21wbGV0ZSk7CisKKwkvKiBUZWxsIHVzZXJzcGFjZSB0aGF0IHRoZSBkYXRhIGlzIHJlYWR5ICovCisJd2FrZV91cCgmcmRfZGV2LT5kdW1wX3dhaXRfcSk7CisKKwkvKiBXYWl0ICh3aXRoIGEgdGltZW91dCkgdG8gbGV0IHRoZSByYW1kdW1wIGNvbXBsZXRlICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZF9kZXYtPnJhbWR1bXBfY29tcGxldGUsCisJCQltc2Vjc190b19qaWZmaWVzKFJBTURVTVBfV0FJVF9NU0VDUykpOworCisJaWYgKCFyZXQpIHsKKwkJcHJfZXJyKCJSYW1kdW1wKCVzKTogVGltZWQgb3V0IHdhaXRpbmcgZm9yIHVzZXJzcGFjZS5cbiIsCisJCSAgICAgICByZF9kZXYtPm5hbWUpOworCQlyZXQgPSAtRVBJUEU7CisJfSBlbHNlIHsKKwkJcmV0ID0gKHJkX2Rldi0+cmFtZHVtcF9zdGF0dXMgPT0gMCkgPyAwIDogLUVQSVBFOworCX0KKworCXJkX2Rldi0+ZGF0YV9yZWFkeSA9IDA7CisJcmRfZGV2LT5lbGZjb3JlX3NpemUgPSAwOworCWtmcmVlKHJkX2Rldi0+ZWxmY29yZV9idWYpOworCXJkX2Rldi0+ZWxmY29yZV9idWYgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKIGludCBkb19yYW1kdW1wKHZvaWQgKmhhbmRsZSwgc3RydWN0IHJhbWR1bXBfc2VnbWVudCAqc2VnbWVudHMsIGludCBuc2VnbWVudHMpCiB7CiAJcmV0dXJuIF9kb19yYW1kdW1wKGhhbmRsZSwgc2VnbWVudHMsIG5zZWdtZW50cywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTChkb19yYW1kdW1wKTsKIAoraW50IGRvX21pbmlkdW1wKHZvaWQgKmhhbmRsZSwgc3RydWN0IHJhbWR1bXBfc2VnbWVudCAqc2VnbWVudHMsIGludCBuc2VnbWVudHMpCit7CisJcmV0dXJuIF9kb19taW5pZHVtcChoYW5kbGUsIHNlZ21lbnRzLCBuc2VnbWVudHMpOworfQorRVhQT1JUX1NZTUJPTChkb19taW5pZHVtcCk7CisKIGludAogZG9fZWxmX3JhbWR1bXAodm9pZCAqaGFuZGxlLCBzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50ICpzZWdtZW50cywgaW50IG5zZWdtZW50cykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vcnBtaC5jIGIvZHJpdmVycy9zb2MvcWNvbS9ycG1oLmMKaW5kZXggOGE3MDQzYTYuLmY3OTAyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vcnBtaC5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vcnBtaC5jCkBAIC01NjMsNyArNTYzLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnBtLT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgcnBtLT5wYXNzdGhydV9jYWNoZVtpXTsgaSsrKSB7CiAJCXJwbV9tc2cgPSBycG0tPnBhc3N0aHJ1X2NhY2hlW2ldOwotCQlyZXQgPSBtYm94X3NlbmRfY29udHJvbGxlcl9kYXRhKHJjLT5jaGFuLCAmcnBtX21zZy0+bXNnKTsKKwkJcmV0ID0gbWJveF93cml0ZV9jb250cm9sbGVyX2RhdGEocmMtPmNoYW4sICZycG1fbXNnLT5tc2cpOwogCQlpZiAocmV0KQogCQkJZ290byBmYWlsOwogCX0KQEAgLTU5MSw3ICs1OTEsOCBAQAogfQogCiAvKioKLSAqIHJwbWhfd3JpdGVfcGFzc3RocnU6IFdyaXRlIG11bHRpcGxlIGJhdGNoZXMgb2YgUlBNSCBjb21tYW5kcyB3aXRob3V0IGNhY2hpbmcKKyAqIHJwbWhfd3JpdGVfYmF0Y2g6IFdyaXRlIG11bHRpcGxlIHNldHMgb2YgUlBNSCBjb21tYW5kcyBhbmQgd2FpdCBmb3IgdGhlCisgKiBiYXRjaCB0byBmaW5pc2guCiAgKgogICogQHJjOiBUaGUgUlBNaCBoYW5kbGUgZ290IGZyb20gcnBtaF9nZXRfZGV2X2NoYW5uZWwKICAqIEBzdGF0ZTogQWN0aXZlL3NsZWVwIHNldApAQCAtNjA2LDcgKzYwNyw3IEBACiAgKgogICogTWF5IHNsZWVwLiBEbyBub3QgY2FsbCBmcm9tIGF0b21pYyBjb250ZXh0cyBmb3IgQUNUSVZFX09OTFkgcmVxdWVzdHMuCiAgKi8KLWludCBycG1oX3dyaXRlX3Bhc3N0aHJ1KHN0cnVjdCBycG1oX2NsaWVudCAqcmMsIGVudW0gcnBtaF9zdGF0ZSBzdGF0ZSwKK2ludCBycG1oX3dyaXRlX2JhdGNoKHN0cnVjdCBycG1oX2NsaWVudCAqcmMsIGVudW0gcnBtaF9zdGF0ZSBzdGF0ZSwKIAkJCXN0cnVjdCB0Y3NfY21kICpjbWQsIGludCAqbikKIHsKIAlzdHJ1Y3QgcnBtaF9tc2cgKnJwbV9tc2dbUlBNSF9NQVhfUkVRX0lOX0JBVENIXSA9IHsgTlVMTCB9OwpAQCAtNjk1LDcgKzY5Niw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocnBtaF93cml0ZV9wYXNzdGhydSk7CitFWFBPUlRfU1lNQk9MKHJwbWhfd3JpdGVfYmF0Y2gpOwogCiAvKioKICAqIHJwbWhfbW9kZV9zb2x2ZXJfc2V0OiBJbmRpY2F0ZSB0aGF0IHRoZSBSU0MgY29udHJvbGxlciBoYXJkd2FyZSBoYXMKQEAgLTc2MSw3ICs3NjIsNyBAQAogCXJwbV9tc2cubXNnLmlzX2NvbnRyb2wgPSB0cnVlOwogCXJwbV9tc2cubXNnLmlzX2NvbXBsZXRlID0gZmFsc2U7CiAKLQlyZXR1cm4gbWJveF9zZW5kX2NvbnRyb2xsZXJfZGF0YShyYy0+Y2hhbiwgJnJwbV9tc2cubXNnKTsKKwlyZXR1cm4gbWJveF93cml0ZV9jb250cm9sbGVyX2RhdGEocmMtPmNoYW4sICZycG1fbXNnLm1zZyk7CiB9CiBFWFBPUlRfU1lNQk9MKHJwbWhfd3JpdGVfY29udHJvbCk7CiAKQEAgLTc5Niw3ICs3OTcsNyBAQAogCXJwbS0+ZGlydHkgPSB0cnVlOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwbS0+bG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIG1ib3hfc2VuZF9jb250cm9sbGVyX2RhdGEocmMtPmNoYW4sICZycG1fbXNnLm1zZyk7CisJcmV0dXJuIG1ib3hfd3JpdGVfY29udHJvbGxlcl9kYXRhKHJjLT5jaGFuLCAmcnBtX21zZy5tc2cpOwogfQogRVhQT1JUX1NZTUJPTChycG1oX2ludmFsaWRhdGUpOwogCkBAIC04ODUsNyArODg2LDcgQEAKIAlycG1fbXNnLm1zZy5udW1fcGF5bG9hZCA9IDE7CiAJcnBtX21zZy5tc2cuaXNfY29tcGxldGUgPSBmYWxzZTsKIAotCXJldHVybiBtYm94X3NlbmRfY29udHJvbGxlcl9kYXRhKHJjLT5jaGFuLCAmcnBtX21zZy5tc2cpOworCXJldHVybiBtYm94X3dyaXRlX2NvbnRyb2xsZXJfZGF0YShyYy0+Y2hhbiwgJnJwbV9tc2cubXNnKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3NtcDJwX3NwaW5sb2NrX3Rlc3QuYyBiL2RyaXZlcnMvc29jL3Fjb20vc21wMnBfc3BpbmxvY2tfdGVzdC5jCmluZGV4IDU2YTBhZjYuLmQxZTUwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc29jL3Fjb20vc21wMnBfc3BpbmxvY2tfdGVzdC5jCisrKyBiL2RyaXZlcnMvc29jL3Fjb20vc21wMnBfc3BpbmxvY2tfdGVzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyogZHJpdmVycy9zb2MvcWNvbS9zbXAycF9zcGlubG9ja190ZXN0LmMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtNTIzLDcgKzUyMyw3IEBACiAJaW50IHNwaW5sb2NrX293bmVyID0gMDsKIAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cyA9IE5VTEw7Ci0Jc3RydWN0IHJtdF9zcGlubG9ja193b3JrX2l0ZW0gd29ya19pdGVtOworCXN0cnVjdCBybXRfc3BpbmxvY2tfd29ya19pdGVtIHdvcmtfaXRlbSA9IHsgLmhhc19sb2NrZWQgPSBmYWxzZSB9OwogCiAJc2VxX3ByaW50ZihzLCAiIFJ1bm5pbmcgJXMgVGVzdFxuIiwKIAkJICAgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9zb2NpbmZvLmMgYi9kcml2ZXJzL3NvYy9xY29tL3NvY2luZm8uYwppbmRleCBjNjk0MjljLi5jMzUxMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3NvY2luZm8uYworKysgYi9kcml2ZXJzL3NvYy9xY29tL3NvY2luZm8uYwpAQCAtNTY0LDYgKzU2NCw3IEBACiAKIAkvKiBzZG04NDUgSUQgKi8KIAlbMzIxXSA9IHtNU01fQ1BVX1NETTg0NSwgIlNETTg0NSJ9LAorCVszNDFdID0ge01TTV9DUFVfU0RNODQ1LCAiU0RBODQ1In0sCiAKIAkvKiBzZHhwb29yd2lsbHMgSUQgKi8KIAlbMzM0XSA9IHtTRFhfQ1BVX1NEWFBPT1JXSUxMUywgIlNEWFBPT1JXSUxMUyJ9LApAQCAtNTcxLDYgKzU3MiwxMiBAQAogCS8qIFNETTY3MCBJRCAqLwogCVszMzZdID0ge01TTV9DUFVfU0RNNjcwLCAiU0RNNjcwIn0sCiAKKwkvKiBRQ1M2MDUgSUQgKi8KKwlbMzQ3XSA9IHtNU01fQ1BVX1FDUzYwNSwgIlFDUzYwNSJ9LAorCisJLyogU0RBNjcwIElEICovCisJWzMzN10gPSB7TVNNX0NQVV9TREE2NzAsICJTREE2NzAifSwKKwogCS8qIFVuaW5pdGlhbGl6ZWQgSURzIGFyZSBub3Qga25vd24gdG8gcnVuIExpbnV4LgogCSAqIE1TTV9DUFVfVU5LTk9XTiBpcyBzZXQgdG8gMCB0byBlbnN1cmUgdGhlc2UgSURzIGFyZQogCSAqIGNvbnNpZGVyZWQgYXMgdW5rbm93biBDUFUuCkBAIC0xNDMzLDYgKzE0NDAsMTQgQEAKIAkJZHVtbXlfc29jaW5mby5pZCA9IDMzNjsKIAkJc3RybGNweShkdW1teV9zb2NpbmZvLmJ1aWxkX2lkLCAic2RtNjcwIC0gIiwKIAkJCXNpemVvZihkdW1teV9zb2NpbmZvLmJ1aWxkX2lkKSk7CisJfSBlbHNlIGlmIChlYXJseV9tYWNoaW5lX2lzX3NkYTY3MCgpKSB7CisJCWR1bW15X3NvY2luZm8uaWQgPSAzMzc7CisJCXN0cmxjcHkoZHVtbXlfc29jaW5mby5idWlsZF9pZCwgInNkYTY3MCAtICIsCisJCQlzaXplb2YoZHVtbXlfc29jaW5mby5idWlsZF9pZCkpOworCX0gZWxzZSBpZiAoZWFybHlfbWFjaGluZV9pc19xY3M2MDUoKSkgeworCQlkdW1teV9zb2NpbmZvLmlkID0gMzQ3OworCQlzdHJsY3B5KGR1bW15X3NvY2luZm8uYnVpbGRfaWQsICJxY3M2MDUgLSAiLAorCQkJc2l6ZW9mKGR1bW15X3NvY2luZm8uYnVpbGRfaWQpKTsKIAl9IGVsc2UgaWYgKGVhcmx5X21hY2hpbmVfaXNfc2R4cG9vcndpbGxzKCkpIHsKIAkJZHVtbXlfc29jaW5mby5pZCA9IDMzNDsKIAkJc3RybGNweShkdW1teV9zb2NpbmZvLmJ1aWxkX2lkLCAic2R4cG9vcndpbGxzIC0gIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3Fjb20vc3Bjb20uYyBiL2RyaXZlcnMvc29jL3Fjb20vc3Bjb20uYwppbmRleCA4MDZiNzU2Li42ODY4MWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3NwY29tLmMKKysrIGIvZHJpdmVycy9zb2MvcWNvbS9zcGNvbS5jCkBAIC0yMDYsMTAgKzIwNiw4IEBACiAJICogT25seSBvbmUgcngvdHggdHJhbnNhY3Rpb24gYXQgYSB0aW1lIChyZXF1ZXN0ICsgcmVzcG9uc2UpLgogCSAqLwogCWludCByZWZfY291bnQ7Ci0JdTMyIHBpZDsKIAotCS8qIGxpbmsgVVAvRE9XTiBjYWxsYmFjayAqLwotCXZvaWQgKCpub3RpZnlfbGlua19zdGF0ZV9jYikoYm9vbCB1cCk7CisJdTMyIHBpZDsgLyogZGVidWcgb25seSB0byBmaW5kIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gKi8KIAogCS8qIGFib3J0IGZsYWdzICovCiAJYm9vbCByeF9hYm9ydDsKQEAgLTQ5MywxMyArNDkxLDEwIEBACiAKIAkJY2gtPmdsaW5rX3N0YXRlID0gZXZlbnQ7CiAKLQkJLyoKLQkJICogaWYgc3Bjb21fbm90aWZ5X3N0YXRlKCkgaXMgY2FsbGVkIHdpdGhpbiBnbGlua19vcGVuKCkKLQkJICogdGhlbiBjaC0+Z2xpbmtfaGFuZGxlIGlzIG5vdCB1cGRhdGVkIHlldC4KLQkJICovCi0JCWlmICghY2gtPmdsaW5rX2hhbmRsZSkgewotCQkJcHJfZGVidWcoInVwZGF0ZSBnbGlua19oYW5kbGUsIGNoIFslc10uXG4iLCBjaC0+bmFtZSk7Ci0JCQljaC0+Z2xpbmtfaGFuZGxlID0gaGFuZGxlOworCQlpZiAoIWhhbmRsZSkgeworCQkJcHJfZXJyKCJpbmF2bGlkIGdsaW5rX2hhbmRsZSwgY2ggWyVzXS5cbiIsIGNoLT5uYW1lKTsKKwkJCW11dGV4X3VubG9jaygmY2gtPmxvY2spOworCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogc2lnbmFsIGJlZm9yZSB1bmxvY2sgbXV0ZXggJiBiZWZvcmUgY2FsbGluZyBnbGluayAqLwpAQCAtNTEyLDggKzUwNyw3IEBACiAJCSAqLwogCiAJCXByX2RlYnVnKCJjYWxsIGdsaW5rX3F1ZXVlX3J4X2ludGVudCgpIGNoIFslc10uXG4iLCBjaC0+bmFtZSk7Ci0JCXJldCA9IGdsaW5rX3F1ZXVlX3J4X2ludGVudChjaC0+Z2xpbmtfaGFuZGxlLAotCQkJCQkgICAgY2gsIGNoLT5yeF9idWZfc2l6ZSk7CisJCXJldCA9IGdsaW5rX3F1ZXVlX3J4X2ludGVudChoYW5kbGUsIGNoLCBjaC0+cnhfYnVmX3NpemUpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9lcnIoImdsaW5rX3F1ZXVlX3J4X2ludGVudCgpIGVyciBbJWRdXG4iLCByZXQpOwogCQl9IGVsc2UgewpAQCAtNzM2LDYgKzczMCw3IEBACiAJbG9uZyB0aW1lbGVmdDsKIAljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgKmhhbmRsZTsKKwl1MzIgcGlkID0gY3VycmVudF9waWQoKTsKIAogCW11dGV4X2xvY2soJmNoLT5sb2NrKTsKIAluYW1lID0gY2gtPm5hbWU7CkBAIC03NDksNyArNzQ0LDcgQEAKIAl9CiAKIAlwcl9kZWJ1ZygiY2ggWyVzXSBvcGVuZWQgYnkgUElEIFslZF0sIGNvdW50IFslZF1cbiIsCi0JCSBuYW1lLCBjaC0+cGlkLCBjaC0+cmVmX2NvdW50KTsKKwkJIG5hbWUsIHBpZCwgY2gtPnJlZl9jb3VudCk7CiAKIAlwcl9kZWJ1ZygiT3BlbiBjaGFubmVsIFslc10gdGltZW91dF9tc2VjIFslZF0uXG4iLCBuYW1lLCB0aW1lb3V0X21zZWMpOwogCkBAIC03NzcsNyArNzcyLDcgQEAKIAkvKiBpbml0IGNoYW5uZWwgY29udGV4dCBhZnRlciBzdWNjZXNzZnVsIG9wZW4gKi8KIAljaC0+Z2xpbmtfaGFuZGxlID0gaGFuZGxlOwogCWNoLT5yZWZfY291bnQrKzsKLQljaC0+cGlkID0gY3VycmVudF9waWQoKTsKKwljaC0+cGlkID0gcGlkOwogCWNoLT50eG5faWQgPSBJTklUSUFMX1RYTl9JRDsKIAogCW11dGV4X3VubG9jaygmY2gtPmxvY2spOwpAQCAtMTAyNiwxMCArMTAyMSwxMiBAQAogCQkJIGNoLT5uYW1lLCBjaC0+YWN0dWFsX3J4X3NpemUpOwogCQlnb3RvIGV4aXRfcmVhZHk7CiAJfQorCW11dGV4X3VubG9jaygmY2gtPmxvY2spOyAvKiB1bmxvY2sgd2hpbGUgd2FpdGluZyAqLwogCiAJcHJfZGVidWcoIldhaXQgZm9yIFJ4IERvbmUsIGNoIFslc10uXG4iLCBjaC0+bmFtZSk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmY2gtPnJ4X2RvbmUpOwogCisJbXV0ZXhfbG9jaygmY2gtPmxvY2spOyAvKiByZS1sb2NrIGFmdGVyIHdhaXRpbmcgKi8KIAkvKiBDaGVjayBSeCBBYm9ydCBvbiBTUCByZXNldCAqLwogCWlmIChjaC0+cnhfYWJvcnQpIHsKIAkJcHJfZXJyKCJyeCBhYm9ydGVkLlxuIik7CkBAIC0xMTM2LDYgKzExMzMsNyBAQAogCWNoID0gc3Bjb21fZmluZF9jaGFubmVsX2J5X25hbWUobmFtZSk7CiAJaWYgKCFjaCkgewogCQlwcl9lcnIoImNoYW5uZWwgJXMgZG9lc24ndCBleGlzdCwgbG9hZCBBcHAgZmlyc3QuXG4iLCBuYW1lKTsKKwkJa2ZyZWUoY2xpZW50KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMzIyLDYgKzEzMjAsNyBAQAogCWNoID0gc3Bjb21fZmluZF9jaGFubmVsX2J5X25hbWUobmFtZSk7CiAJaWYgKCFjaCkgewogCQlwcl9lcnIoImNoYW5uZWwgJXMgZG9lc24ndCBleGlzdCwgbG9hZCBBcHAgZmlyc3QuXG4iLCBuYW1lKTsKKwkJa2ZyZWUoc2VydmVyKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0yMDI1LDYgKzIwMjQsNyBAQAogCQkJCSAgICAgIHZvaWQgKmJ1ZiwKIAkJCQkgICAgICB1aW50MzJfdCBzaXplKQogeworCWludCByZXQgPSAtMTsKIAl1aW50MzJfdCBuZXh0X3JlcV9zaXplID0gMDsKIAogCWlmIChzaXplIDwgc2l6ZW9mKG5leHRfcmVxX3NpemUpKSB7CkBAIC0yMDMyLDcgKzIwMzIsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbmV4dF9yZXFfc2l6ZSA9IHNwY29tX2dldF9uZXh0X3JlcXVlc3Rfc2l6ZShjaCk7CisJcmV0ID0gc3Bjb21fZ2V0X25leHRfcmVxdWVzdF9zaXplKGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwluZXh0X3JlcV9zaXplID0gKHVpbnQzMl90KSByZXQ7CiAKIAltZW1jcHkoYnVmLCAmbmV4dF9yZXFfc2l6ZSwgc2l6ZW9mKG5leHRfcmVxX3NpemUpKTsKIAlwcl9kZWJ1ZygibmV4dF9yZXFfc2l6ZSBbJWRdLlxuIiwgbmV4dF9yZXFfc2l6ZSk7CkBAIC0yMTM3LDE4ICsyMTQwLDIwIEBACiAJCQkgICAgICB2b2lkICpidWYsCiAJCQkgICAgICB1aW50MzJfdCBzaXplKQogeworCWludCByZXQgPSAtMTsKKwogCWlmIChzaXplID09IFNQQ09NX0dFVF9ORVhUX1JFUVVFU1RfU0laRSkgewogCQlwcl9kZWJ1ZygiZ2V0IG5leHQgcmVxdWVzdCBzaXplLCBjaCBbJXNdLlxuIiwgY2gtPm5hbWUpOwogCQljaC0+aXNfc2VydmVyID0gdHJ1ZTsKLQkJc2l6ZSA9IHNwY29tX2hhbmRsZV9nZXRfcmVxX3NpemUoY2gsIGJ1Ziwgc2l6ZSk7CisJCXJldCA9IHNwY29tX2hhbmRsZV9nZXRfcmVxX3NpemUoY2gsIGJ1Ziwgc2l6ZSk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoImdldCByZXF1ZXN0L3Jlc3BvbnNlLCBjaCBbJXNdLlxuIiwgY2gtPm5hbWUpOwotCQlzaXplID0gc3Bjb21faGFuZGxlX3JlYWRfcmVxX3Jlc3AoY2gsIGJ1Ziwgc2l6ZSk7CisJCXJldCA9IHNwY29tX2hhbmRsZV9yZWFkX3JlcV9yZXNwKGNoLCBidWYsIHNpemUpOwogCX0KIAogCXByX2RlYnVnKCJjaCBbJXNdICwgc2l6ZSA9ICVkLlxuIiwgY2gtPm5hbWUsIHNpemUpOwogCi0JcmV0dXJuIHNpemU7CisJcmV0dXJuIHJldDsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTIzMDAsNiArMjMwNSw3IEBACiAJY2hhciAqYnVmOwogCXN0cnVjdCBzcGNvbV9jaGFubmVsICpjaDsKIAljb25zdCBjaGFyICpuYW1lID0gZmlsZV90b19maWxlbmFtZShmaWxwKTsKKwlpbnQgYnVmX3NpemUgPSAwOwogCiAJcHJfZGVidWcoIldyaXRlIGZpbGUgWyVzXSBzaXplIFslZF0gcG9zIFslZF0uXG4iLAogCQkgbmFtZSwgKGludCkgc2l6ZSwgKGludCkgKmZfcG9zKTsKQEAgLTIzMjYsNiArMjMzMiw3IEBACiAJCQkgICAoaW50KSBzaXplLCAoaW50KSBTUENPTV9NQVhfQ09NTUFORF9TSVpFKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWJ1Zl9zaXplID0gc2l6ZTsgLyogZXhwbGljaXQgY2FzdGluZyBzaXplX3QgdG8gaW50ICovCiAKIAlpZiAoKmZfcG9zICE9IDApIHsKIAkJcHJfZXJyKCJvZmZzZXQgc2hvdWxkIGJlIHplcm8sIG5vIHNwYXJzZSBidWZmZXIuXG4iKTsKQEAgLTIzNDMsNyArMjM1MCw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCXJldCA9IHNwY29tX2hhbmRsZV93cml0ZShjaCwgYnVmLCBzaXplKTsKKwlyZXQgPSBzcGNvbV9oYW5kbGVfd3JpdGUoY2gsIGJ1ZiwgYnVmX3NpemUpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJoYW5kbGUgY29tbWFuZCBlcnJvciBbJWRdLlxuIiwgcmV0KTsKIAkJa2ZyZWUoYnVmKTsKQEAgLTIzNzEsNiArMjM3OCw3IEBACiAJY2hhciAqYnVmOwogCXN0cnVjdCBzcGNvbV9jaGFubmVsICpjaDsKIAljb25zdCBjaGFyICpuYW1lID0gZmlsZV90b19maWxlbmFtZShmaWxwKTsKKwl1aW50MzJfdCBidWZfc2l6ZSA9IDA7CiAKIAlwcl9kZWJ1ZygiUmVhZCBmaWxlIFslc10sIHNpemUgPSAlZCBieXRlcy5cbiIsIG5hbWUsIChpbnQpIHNpemUpOwogCkBAIC0yMzc5LDYgKzIzODcsNyBAQAogCQlwcl9lcnIoImludmFsaWQgcGFyYW1ldGVycy5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJYnVmX3NpemUgPSBzaXplOyAvKiBleHBsaWNpdCBjYXN0aW5nIHNpemVfdCB0byB1aW50MzJfdCAqLwogCiAJY2ggPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKQEAgLTIzOTYsNyArMjQwNSw3IEBACiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IHNwY29tX2hhbmRsZV9yZWFkKGNoLCBidWYsIHNpemUpOworCXJldCA9IHNwY29tX2hhbmRsZV9yZWFkKGNoLCBidWYsIGJ1Zl9zaXplKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoInJlYWQgZXJyb3IgWyVkXS5cbiIsIHJldCk7CiAJCWtmcmVlKGJ1Zik7CkBAIC0yNDc5LDkgKzI0ODgsMTQgQEAKIAkJZG9uZSA9IChzcGNvbV9kZXYtPmxpbmtfc3RhdGUgPT0gR0xJTktfTElOS19TVEFURV9VUCk7CiAJCWJyZWFrOwogCWNhc2UgU1BDT01fUE9MTF9DSF9DT05ORUNUOgorCQkvKgorCQkgKiBjaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgTlVMTCBzaW5jZSB1c2VyIG11c3QgY2FsbCBvcGVuKCkKKwkJICogdG8gZ2V0IEZEIGJlZm9yZSBpdCBjYW4gY2FsbCBwb2xsKCkuCisJCSAqIG9wZW4oKSB3aWxsIGZhaWwgaWYgbm8gY2ggcmVsYXRlZCB0byB0aGUgY2hhci1kZXZpY2UuCisJCSAqLwogCQlpZiAoY2ggPT0gTlVMTCkgewogCQkJcHJfZXJyKCJpbnZhbGlkIGNoIHBvaW50ZXIsIGZpbGUgWyVzXS5cbiIsIG5hbWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gUE9MTEVSUjsKIAkJfQogCQlwcl9kZWJ1ZygiY2ggWyVzXSBTUENPTV9QT0xMX0NIX0NPTk5FQ1QuXG4iLCBuYW1lKTsKIAkJaWYgKHdhaXQpIHsKQEAgLTI3ODIsNyArMjc5Niw3IEBACiB7CiAJaW50IHJldDsKIAotCXByX2luZm8oInNwY29tIGRyaXZlciB2ZXJzaW9uIDEuMSAxNy1KdWx5LTIwMTcuXG4iKTsKKwlwcl9pbmZvKCJzcGNvbSBkcml2ZXIgdmVyc2lvbiAxLjIgMjMtQXVnLTIwMTcuXG4iKTsKIAogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3Bjb21fZHJpdmVyKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb2MvcWNvbS9zdWJzeXMtcGlsLXR6LmMgYi9kcml2ZXJzL3NvYy9xY29tL3N1YnN5cy1waWwtdHouYwppbmRleCAwMWViMjYwLi4zZWE0YmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NvYy9xY29tL3N1YnN5cy1waWwtdHouYworKysgYi9kcml2ZXJzL3NvYy9xY29tL3N1YnN5cy1waWwtdHouYwpAQCAtMTE1Miw2ICsxMTUyLDIyIEBACiAJCWQtPnN1YnN5c19kZXNjLndkb2dfYml0ZV9oYW5kbGVyID0gc3Vic3lzX3dkb2dfYml0ZV9pcnFfaGFuZGxlcjsKIAkJZC0+c3Vic3lzX2Rlc2Muc3RvcF9hY2tfaGFuZGxlciA9IHN1YnN5c19zdG9wX2Fja19pbnRyX2hhbmRsZXI7CiAJfQorCWQtPmRlc2Muc2lnbmFsX2FvcCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSJxY29tLHNpZ25hbC1hb3AiKTsKKwlpZiAoZC0+ZGVzYy5zaWduYWxfYW9wKSB7CisJCWQtPmRlc2MuY2wuZGV2ID0gJnBkZXYtPmRldjsKKwkJZC0+ZGVzYy5jbC50eF9ibG9jayA9IHRydWU7CisJCWQtPmRlc2MuY2wudHhfdG91dCA9IDEwMDA7CisJCWQtPmRlc2MuY2wua25vd3NfdHhkb25lID0gZmFsc2U7CisJCWQtPmRlc2MubWJveCA9IG1ib3hfcmVxdWVzdF9jaGFubmVsKCZkLT5kZXNjLmNsLCAwKTsKKwkJaWYgKElTX0VSUihkLT5kZXNjLm1ib3gpKSB7CisJCQlyYyA9IFBUUl9FUlIoZC0+ZGVzYy5tYm94KTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbWFpbGJveCBjaGFubmVsICVwSyAlZFxuIiwKKwkJCQlkLT5kZXNjLm1ib3gsIHJjKTsKKwkJCWdvdG8gZXJyX3JhbWR1bXA7CisJCX0KKwl9CisKIAlkLT5yYW1kdW1wX2RldiA9IGNyZWF0ZV9yYW1kdW1wX2RldmljZShkLT5zdWJzeXNfZGVzYy5uYW1lLAogCQkJCQkJCQkmcGRldi0+ZGV2KTsKIAlpZiAoIWQtPnJhbWR1bXBfZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvYy9xY29tL3djZC1kc3AtZ2xpbmsuYyBiL2RyaXZlcnMvc29jL3Fjb20vd2NkLWRzcC1nbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiOWY3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc29jL3Fjb20vd2NkLWRzcC1nbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c29jL3Fjb20vZ2xpbmsuaD4KLSNpbmNsdWRlICJzb3VuZC93Y2QtZHNwLWdsaW5rLmgiCi0KLSNkZWZpbmUgV0RTUF9HTElOS19EUklWRVJfTkFNRSAid2NkLWRzcC1nbGluayIKLSNkZWZpbmUgV0RTUF9NQVhfV1JJVEVfU0laRSAoMjU2ICogMTAyNCkKLSNkZWZpbmUgV0RTUF9NQVhfUkVBRF9TSVpFICg0ICogMTAyNCkKLSNkZWZpbmUgV0RTUF9NQVhfTk9fT0ZfSU5URU5UUyAoMjApCi0jZGVmaW5lIFdEU1BfTUFYX05PX09GX0NIQU5ORUxTICgxMCkKLSNkZWZpbmUgV0RTUF9XUklURV9QS1RfU0laRSAoc2l6ZW9mKHN0cnVjdCB3ZHNwX3dyaXRlX3BrdCkpCi0jZGVmaW5lIFdEU1BfUkVHX1BLVF9TSVpFIChzaXplb2Yoc3RydWN0IHdkc3BfcmVnX3BrdCkpCi0jZGVmaW5lIFdEU1BfQ01EX1BLVF9TSVpFIChzaXplb2Yoc3RydWN0IHdkc3BfY21kX3BrdCkpCi0jZGVmaW5lIFdEU1BfQ0hfQ0ZHX1NJWkUgKHNpemVvZihzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcpKQotCi0jZGVmaW5lIE1JTk9SX05VTUJFUl9DT1VOVCAxCi0jZGVmaW5lIFdEU1BfRURHRSAid2RzcCIKLSNkZWZpbmUgUkVTUF9RVUVVRV9TSVpFIDMKLSNkZWZpbmUgUU9TX1BLVF9TSVpFIDEwMjQKLSNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCi0KLXN0cnVjdCB3ZHNwX2dsaW5rX2RldiB7Ci0Jc3RydWN0IGNsYXNzICpjbHM7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBjZGV2IGNkZXY7Ci0JZGV2X3QgZGV2X251bTsKLX07Ci0KLXN0cnVjdCB3ZHNwX2dsaW5rX3JzcF9xdWUgewotCS8qIFNpemUgb2YgdmFsaWQgZGF0YSBpbiBidWZmZXIgKi8KLQl1MzIgYnVmX3NpemU7Ci0KLQkvKiBSZXNwb25zZSBidWZmZXIgKi8KLQl1OCBidWZbV0RTUF9NQVhfUkVBRF9TSVpFXTsKLX07Ci0KLXN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHR4X3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGZyZWVfdHhfd29yazsKLQotCS8qIEdsaW5rIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7Ci0KLQkvKiBUeCBidWZmZXIgdG8gc2VuZCB0byBnbGluayAqLwotCXU4IGJ1ZlswXTsKLX07Ci0KLXN0cnVjdCB3ZHNwX2dsaW5rX2NoIHsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQotCS8qIEdsaW5rIGNoYW5uZWwgaGFuZGxlICovCi0Jdm9pZCAqaGFuZGxlOwotCi0JLyogQ2hhbm5lbCBzdGF0ZXMgbGlrZSBjb25uZWN0LCBkaXNjb25uZWN0ICovCi0JaW50IGNoYW5uZWxfc3RhdGU7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotCi0JLyogVG8gZnJlZSB1cCB0aGUgY2hhbm5lbCBtZW1vcnkgKi8KLQlib29sIGZyZWVfbWVtOwotCi0JLyogR2xpbmsgbG9jYWwgY2hhbm5lbCBvcGVuIHdvcmsgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGNsX2NoX29wZW5fd3JrOwotCi0JLyogR2xpbmsgbG9jYWwgY2hhbm5lbCBjbG9zZSB3b3JrICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGxjbF9jaF9jbHNfd3JrOwotCi0JLyogV2FpdCBmb3IgY2ggY29ubmVjdCBzdGF0ZSBiZWZvcmUgc2VuZGluZyBhbnkgY29tbWFuZCAqLwotCXdhaXRfcXVldWVfaGVhZF90IGNoX2Nvbm5lY3Rfd2FpdDsKLQotCS8qCi0JICogR2xpbmsgY2hhbm5lbCBjb25maWd1cmF0aW9uLiBUaGlzIGhhcyB0byBiZSB0aGUgbGFzdAotCSAqIG1lbWJlciBvZiB0aGUgc3RydWN1dHVyZSBhcyBpdCBoYXMgdmFyaWFibGUgc2l6ZQotCSAqLwotCXN0cnVjdCB3ZHNwX2dsaW5rX2NoX2NmZyBjaF9jZmc7Ci19OwotCi1zdHJ1Y3Qgd2RzcF9nbGlua19zdGF0ZSB7Ci0JLyogR2xpbmsgbGluayBzdGF0ZSBpbmZvcm1hdGlvbiAqLwotCWVudW0gZ2xpbmtfbGlua19zdGF0ZSBsaW5rX3N0YXRlOwotCXZvaWQgKmhhbmRsZTsKLX07Ci0KLXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgewotCS8qIFJlc3BvbmUgYnVmZmVyIHJlbGF0ZWQgKi8KLQl1OCByc3BfY250OwotCXN0cnVjdCB3ZHNwX2dsaW5rX3JzcF9xdWUgcnNwW1JFU1BfUVVFVUVfU0laRV07Ci0Jc3RydWN0IGNvbXBsZXRpb24gcnNwX2NvbXBsZXRlOwotCXN0cnVjdCBtdXRleCByc3BfbXV0ZXg7Ci0KLQkvKiBHbGluayBjaGFubmVsIHJlbGF0ZWQgKi8KLQlzdHJ1Y3QgbXV0ZXggZ2xpbmtfbXV0ZXg7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfc3RhdGUgZ2xpbmtfc3RhdGU7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfY2ggKipjaDsKLQl1OCBub19vZl9jaGFubmVsczsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hfb3Blbl9jbHNfd3JrOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrX3F1ZXVlOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgbGlua19zdGF0ZV93YWl0OwotCi0Jc3RydWN0IGRldmljZSAqZGV2OwotfTsKLQotc3RhdGljIGludCB3ZHNwX2dsaW5rX2Nsb3NlX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaCk7Ci1zdGF0aWMgaW50IHdkc3BfZ2xpbmtfb3Blbl9jaChzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2gpOwotCi0vKgotICogd2RzcF9nbGlua19mcmVlX3R4X2J1Zl93b3JrIC0gV29yayBmdW5jdGlvbiB0byBmcmVlIHR4IHBrdAotICogd29yazogICAgICBXb3JrIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX2ZyZWVfdHhfYnVmX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiAqdHhfYnVmOwotCi0JdHhfYnVmID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiwKLQkJCSAgICAgIGZyZWVfdHhfd29yayk7Ci0JdmZyZWUodHhfYnVmKTsKLX0KLQotLyoKLSAqIHdkc3BfZ2xpbmtfZnJlZV90eF9idWYgLSBGdW5jdGlvbiB0byBmcmVlIHR4IGJ1ZmZlcgotICogcHJpdjogICAgICAgIFBvaW50ZXIgdG8gdGhlIGNoYW5uZWwKLSAqIHBrdF9wcml2OiAgICBQb2ludGVyIHRvIHRoZSB0eCBidWZmZXIKLSAqLwotc3RhdGljIHZvaWQgd2RzcF9nbGlua19mcmVlX3R4X2J1Zihjb25zdCB2b2lkICpwcml2LCBjb25zdCB2b2lkICpwa3RfcHJpdikKLXsKLQlzdHJ1Y3Qgd2RzcF9nbGlua190eF9idWYgKnR4X2J1ZiA9IChzdHJ1Y3Qgd2RzcF9nbGlua190eF9idWYgKilwa3RfcHJpdjsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7Ci0KLQlpZiAoIXByaXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCF0eF9idWYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCB0eF9idWZcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWNoID0gKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICopcHJpdjsKLQl3cHJpdiA9IGNoLT53cHJpdjsKLQkvKiBXb3JrIHF1ZXVlIHRvIGZyZWUgdHggcGt0ICovCi0JSU5JVF9XT1JLKCZ0eF9idWYtPmZyZWVfdHhfd29yaywgd2RzcF9nbGlua19mcmVlX3R4X2J1Zl93b3JrKTsKLQlxdWV1ZV93b3JrKHdwcml2LT53b3JrX3F1ZXVlLCAmdHhfYnVmLT5mcmVlX3R4X3dvcmspOwotfQotCi0vKgotICogd2RzcF9nbGlua19ub3RpZnlfcnggLSBHbGluayBub3RpZnkgcnggY2FsbGJhY2sgZm9yIHJlc3BvbnNlcwotICogaGFuZGxlOiAgICAgIE9wYXF1ZSBDaGFubmVsIGhhbmRsZSByZXR1cm5lZCBieSBHTGluawotICogcHJpdjogICAgICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgY2hhbm5lbAotICogcGt0X3ByaXY6ICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgcGFja2V0Ci0gKiBwdHI6ICAgICAgICAgUG9pbnRlciB0byB0aGUgUnggZGF0YQotICogc2l6ZTogICAgICAgIFNpemUgb2YgdGhlIFJ4IGRhdGEKLSAqLwotc3RhdGljIHZvaWQgd2RzcF9nbGlua19ub3RpZnlfcngodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAotCQkJCSBjb25zdCB2b2lkICpwa3RfcHJpdiwgY29uc3Qgdm9pZCAqcHRyLAotCQkJCSBzaXplX3Qgc2l6ZSkKLXsKLQl1OCAqcnhfYnVmOwotCXU4IHJzcF9jbnQ7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoOwotCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OwotCi0JaWYgKCFwdHIgfHwgIXByaXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljaCA9IChzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqKXByaXY7Ci0Jd3ByaXYgPSBjaC0+d3ByaXY7Ci0JcnhfYnVmID0gKHU4ICopcHRyOwotCWlmIChzaXplID4gV0RTUF9NQVhfUkVBRF9TSVpFKSB7Ci0JCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBTaXplICV6ZCBpcyBncmVhdGVyIHRoYW4gYWxsb3dlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBzaXplLCBXRFNQX01BWF9SRUFEX1NJWkUpOwotCQlzaXplID0gV0RTUF9NQVhfUkVBRF9TSVpFOwotCX0KLQotCW11dGV4X2xvY2soJndwcml2LT5yc3BfbXV0ZXgpOwotCXJzcF9jbnQgPSB3cHJpdi0+cnNwX2NudDsKLQlpZiAocnNwX2NudCA+PSBSRVNQX1FVRVVFX1NJWkUpIHsKLQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IFJlc3AgUXVldWUgaXMgRnVsbFxuIiwgX19mdW5jX18pOwotCQlyc3BfY250ID0gMDsKLQl9Ci0JZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGNvcHkgaW50byBidWZmZXIgJWRcbiIsIF9fZnVuY19fLCByc3BfY250KTsKLQotCW1lbWNweSh3cHJpdi0+cnNwW3JzcF9jbnRdLmJ1ZiwgcnhfYnVmLCBzaXplKTsKLQl3cHJpdi0+cnNwW3JzcF9jbnRdLmJ1Zl9zaXplID0gc2l6ZTsKLQl3cHJpdi0+cnNwX2NudCA9ICsrcnNwX2NudDsKLQltdXRleF91bmxvY2soJndwcml2LT5yc3BfbXV0ZXgpOwotCi0JZ2xpbmtfcnhfZG9uZShoYW5kbGUsIHB0ciwgdHJ1ZSk7Ci0JY29tcGxldGUoJndwcml2LT5yc3BfY29tcGxldGUpOwotfQotCi0vKgotICogd2RzcF9nbGlua19ub3RpZnlfdHhfZG9uZSAtIEdsaW5rIG5vdGlmeSB0eCBkb25lIGNhbGxiYWNrIHRvCi0gKiBmcmVlIHR4IGJ1ZmZlcgotICogaGFuZGxlOiAgICAgIE9wYXF1ZSBDaGFubmVsIGhhbmRsZSByZXR1cm5lZCBieSBHTGluawotICogcHJpdjogICAgICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgY2hhbm5lbAotICogcGt0X3ByaXY6ICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgcGFja2V0Ci0gKiBwdHI6ICAgICAgICAgUG9pbnRlciB0byB0aGUgVHggZGF0YQotICovCi1zdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX25vdGlmeV90eF9kb25lKHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKLQkJCQkgICAgICBjb25zdCB2b2lkICpwa3RfcHJpdiwgY29uc3Qgdm9pZCAqcHRyKQotewotCXdkc3BfZ2xpbmtfZnJlZV90eF9idWYocHJpdiwgcGt0X3ByaXYpOwotfQotLyoKLSAqIHdkc3BfZ2xpbmtfbm90aWZ5X3R4X2Fib3J0IC0gR2xpbmsgbm90aWZ5IHR4IGFib3J0IGNhbGxiYWNrIHRvCi0gKiBmcmVlIHR4IGJ1ZmZlcgotICogaGFuZGxlOiAgICAgIE9wYXF1ZSBDaGFubmVsIGhhbmRsZSByZXR1cm5lZCBieSBHTGluawotICogcHJpdjogICAgICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgY2hhbm5lbAotICogcGt0X3ByaXY6ICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgcGFja2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbm90aWZ5X3R4X2Fib3J0KHZvaWQgKmhhbmRsZSwgY29uc3Qgdm9pZCAqcHJpdiwKLQkJCQkgICAgICAgY29uc3Qgdm9pZCAqcGt0X3ByaXYpCi17Ci0Jd2RzcF9nbGlua19mcmVlX3R4X2J1Zihwcml2LCBwa3RfcHJpdik7Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX25vdGlmeV9yeF9pbnRlbnRfcmVxIC0gR2xpbmsgbm90aWZ5IHJ4IGludGVudCByZXF1ZXN0IGNhbGxiYWNrCi0gKiB0byBxdWV1ZSBidWZmZXIgdG8gcmVjZWl2ZSBmcm9tIHJlbW90ZSBjbGllbnQKLSAqIGhhbmRsZTogICAgICBPcGFxdWUgY2hhbm5lbCBoYW5kbGUgcmV0dXJuZWQgYnkgR0xpbmsKLSAqIHByaXY6ICAgICAgICBQcml2YXRlIHBvaW50ZXIgdG8gdGhlIGNoYW5uZWwKLSAqIHJlcV9zaXplOiAgICBTaXplIG9mIGludGVudCB0byBiZSBxdWV1ZWQKLSAqLwotc3RhdGljIGJvb2wgd2RzcF9nbGlua19ub3RpZnlfcnhfaW50ZW50X3JlcSh2b2lkICpoYW5kbGUsIGNvbnN0IHZvaWQgKnByaXYsCi0JCQkJCSAgICBzaXplX3QgcmVxX3NpemUpCi17Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoOwotCWludCByYyA9IDA7Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQotCWlmICghcHJpdikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAocmVxX3NpemUgPiBXRFNQX01BWF9SRUFEX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCByZXFfc2l6ZSAlemRcbiIsIF9fZnVuY19fLCByZXFfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljaCA9IChzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqKXByaXY7Ci0Jd3ByaXYgPSBjaC0+d3ByaXY7Ci0KLQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogaW50ZW50IHNpemUgJXpkIHJlcXVlc3RlZCBmb3IgY2ggbmFtZSAlcyIsCi0JCSBfX2Z1bmNfXywgcmVxX3NpemUsIGNoLT5jaF9jZmcubmFtZSk7Ci0KLQltdXRleF9sb2NrKCZjaC0+bXV0ZXgpOwotCXJjID0gZ2xpbmtfcXVldWVfcnhfaW50ZW50KGNoLT5oYW5kbGUsIGNoLCByZXFfc2l6ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogRmFpbGVkIHRvIHF1ZXVlIHJ4IGludGVudCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCW11dGV4X3VubG9jaygmY2gtPm11dGV4KTsKLQkJZ290byBkb25lOwotCX0KLQltdXRleF91bmxvY2soJmNoLT5tdXRleCk7Ci0JcmV0ID0gdHJ1ZTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2RzcF9nbGlua19sY2xfY2hfb3Blbl93cmsgLSBXb3JrIGZ1bmN0aW9uIHRvIG9wZW4gY2hhbm5lbCBhZ2FpbgotICogd2hlbiBsb2NhbCBkaXNjb25uZWN0IGV2ZW50IGhhcHBlbnMKLSAqIHdvcms6ICAgICAgV29yayBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHZvaWQgd2RzcF9nbGlua19sY2xfY2hfb3Blbl93cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaDsKLQotCWNoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3ZHNwX2dsaW5rX2NoLAotCQkJICBsY2xfY2hfb3Blbl93cmspOwotCi0Jd2RzcF9nbGlua19vcGVuX2NoKGNoKTsKLX0KLQotLyoKLSAqIHdkc3BfZ2xpbmtfbGNsX2NoX2Nsc193cmsgLSBXb3JrIGZ1bmN0aW9uIHRvIGNsb3NlIGNoYW5uZWwgbG9jYWxseQotICogd2hlbiByZW1vdGUgZGlzY29ubmVjdCBldmVudCBoYXBwZW5zCi0gKiB3b3JrOiAgICAgIFdvcmsgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbGNsX2NoX2Nsc193cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaDsKLQotCWNoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3ZHNwX2dsaW5rX2NoLAotCQkJICBsY2xfY2hfY2xzX3dyayk7Ci0KLQl3ZHNwX2dsaW5rX2Nsb3NlX2NoKGNoKTsKLX0KLQotLyoKLSAqIHdkc3BfZ2xpbmtfbm90aWZ5X3N0YXRlIC0gR2xpbmsgY2hhbm5lbCBzdGF0ZSBpbmZvcm1hdGlvbiBldmVudCBjYWxsYmFjawotICogaGFuZGxlOiAgICAgIE9wYXF1ZSBDaGFubmVsIGhhbmRsZSByZXR1cm5lZCBieSBHTGluawotICogcHJpdjogICAgICAgIFByaXZhdGUgcG9pbnRlciB0byB0aGUgY2hhbm5lbAotICogZXZlbnQ6ICAgICAgIGNoYW5uZWwgc3RhdGUgZXZlbnQKLSAqLwotc3RhdGljIHZvaWQgd2RzcF9nbGlua19ub3RpZnlfc3RhdGUodm9pZCAqaGFuZGxlLCBjb25zdCB2b2lkICpwcml2LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfY2ggKmNoOwotCWludCBpLCByZXQgPSAwOwotCi0JaWYgKCFwcml2KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcHJpdlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JY2ggPSAoc3RydWN0IHdkc3BfZ2xpbmtfY2ggKilwcml2OwotCXdwcml2ID0gY2gtPndwcml2OwotCi0JbXV0ZXhfbG9jaygmY2gtPm11dGV4KTsKLQljaC0+Y2hhbm5lbF9zdGF0ZSA9IGV2ZW50OwotCWlmIChldmVudCA9PSBHTElOS19DT05ORUNURUQpIHsKLQkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGdsaW5rIGNoYW5uZWw6ICVzIGNvbm5lY3RlZFxuIiwKLQkJCV9fZnVuY19fLCBjaC0+Y2hfY2ZnLm5hbWUpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjaC0+Y2hfY2ZnLm5vX29mX2ludGVudHM7IGkrKykgewotCQkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGludGVudF9zaXplID0gJWRcbiIsIF9fZnVuY19fLAotCQkJCWNoLT5jaF9jZmcuaW50ZW50c19zaXplW2ldKTsKLQkJCXJldCA9IGdsaW5rX3F1ZXVlX3J4X2ludGVudChjaC0+aGFuZGxlLCBjaCwKLQkJCQkJCSAgICBjaC0+Y2hfY2ZnLmludGVudHNfc2l6ZVtpXSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlkZXZfd2Fybih3cHJpdi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBxdWV1ZSBpbnRlbnQgJWQgb2Ygc2l6ZSAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBpLAotCQkJCQkgY2gtPmNoX2NmZy5pbnRlbnRzX3NpemVbaV0pOwotCQl9Ci0KLQkJcmV0ID0gZ2xpbmtfcW9zX2xhdGVuY3koY2gtPmhhbmRsZSwgY2gtPmNoX2NmZy5sYXRlbmN5X2luX3VzLAotCQkJCQlRT1NfUEtUX1NJWkUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl93YXJuKHdwcml2LT5kZXYsICIlczogRmFpbGVkIHRvIHJlcXVlc3QgcW9zICVkIGZvciBjaCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgY2gtPmNoX2NmZy5sYXRlbmN5X2luX3VzLAotCQkJCWNoLT5jaF9jZmcubmFtZSk7Ci0KLQkJd2FrZV91cCgmY2gtPmNoX2Nvbm5lY3Rfd2FpdCk7Ci0JCW11dGV4X3VubG9jaygmY2gtPm11dGV4KTsKLQl9IGVsc2UgaWYgKGV2ZW50ID09IEdMSU5LX0xPQ0FMX0RJU0NPTk5FQ1RFRCkgewotCQkvKgotCQkgKiBEb24ndCB1c2UgZGV2X2RiZyBoZXJlIGFzIGRldiBtYXkgbm90IGJlIHZhbGlkIGlmIGNoYW5uZWwKLQkJICogY2xvc2VkIGZyb20gZHJpdmVyIGNsb3NlLgotCQkgKi8KLQkJcHJfZGVidWcoIiVzOiBjaGFubmVsOiAlcyBkaXNjb25uZWN0ZWQgbG9jYWxseVxuIiwKLQkJCSBfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKLQkJbXV0ZXhfdW5sb2NrKCZjaC0+bXV0ZXgpOwotCi0JCWlmIChjaC0+ZnJlZV9tZW0pIHsKLQkJCWtmcmVlKGNoKTsKLQkJCWNoID0gTlVMTDsKLQkJfQotCX0gZWxzZSBpZiAoZXZlbnQgPT0gR0xJTktfUkVNT1RFX0RJU0NPTk5FQ1RFRCkgewotCQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogcmVtb3RlIGNoYW5uZWw6ICVzIGRpc2Nvbm5lY3RlZCByZW1vdGVseVxuIiwKLQkJCSBfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKLQkJbXV0ZXhfdW5sb2NrKCZjaC0+bXV0ZXgpOwotCQkvKgotCQkgKiBJZiByZW1vdGUgZGlzY29ubmVjdCBoYXBwZW5zLCBsb2NhbCBzaWRlIGFsc28gaGFzCi0JCSAqIHRvIGNsb3NlIHRoZSBjaGFubmVsIGFzIHBlciBnbGluayBkZXNpZ24gaW4gYQotCQkgKiBzZXBhcmF0ZSB3b3JrX3F1ZXVlLgotCQkgKi8KLQkJcXVldWVfd29yayh3cHJpdi0+d29ya19xdWV1ZSwgJmNoLT5sY2xfY2hfY2xzX3dyayk7Ci0JfQotfQotCi0vKgotICogd2RzcF9nbGlua19jbG9zZV9jaCAtIEludGVybmFsIGZ1bmN0aW9uIHRvIGNsb3NlIGdsaW5rIGNoYW5uZWwKLSAqIGNoOiAgICAgICBHbGluayBDaGFubmVsIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCB3ZHNwX2dsaW5rX2Nsb3NlX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaCkKLXsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdiA9IGNoLT53cHJpdjsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJndwcml2LT5nbGlua19tdXRleCk7Ci0JaWYgKGNoLT5oYW5kbGUpIHsKLQkJcmV0ID0gZ2xpbmtfY2xvc2UoY2gtPmhhbmRsZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogZ2xpbmtfY2xvc2UgaXMgZmFpbGVkLCByZXQgPSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHJldCk7Ci0JCX0gZWxzZSB7Ci0JCQljaC0+aGFuZGxlID0gTlVMTDsKLQkJCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBjaCAlcyBpcyBjbG9zZWRcbiIsIF9fZnVuY19fLAotCQkJCWNoLT5jaF9jZmcubmFtZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY2ggJXMgaXMgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fLAotCQkJY2gtPmNoX2NmZy5uYW1lKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOwotCi0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2RzcF9nbGlua19vcGVuX2NoIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gb3BlbiBnbGluayBjaGFubmVsCi0gKiBjaDogICAgICAgR2xpbmsgQ2hhbm5lbCBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBpbnQgd2RzcF9nbGlua19vcGVuX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICpjaCkKLXsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdiA9IGNoLT53cHJpdjsKLQlzdHJ1Y3QgZ2xpbmtfb3Blbl9jb25maWcgb3Blbl9jZmc7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOwotCWlmICghY2gtPmhhbmRsZSkgewotCQltZW1zZXQoJm9wZW5fY2ZnLCAwLCBzaXplb2Yob3Blbl9jZmcpKTsKLQkJb3Blbl9jZmcub3B0aW9ucyA9IEdMSU5LX09QVF9JTklUSUFMX1hQT1JUOwotCQlvcGVuX2NmZy5lZGdlID0gV0RTUF9FREdFOwotCQlvcGVuX2NmZy5ub3RpZnlfcnggPSB3ZHNwX2dsaW5rX25vdGlmeV9yeDsKLQkJb3Blbl9jZmcubm90aWZ5X3R4X2RvbmUgPSB3ZHNwX2dsaW5rX25vdGlmeV90eF9kb25lOwotCQlvcGVuX2NmZy5ub3RpZnlfdHhfYWJvcnQgPSB3ZHNwX2dsaW5rX25vdGlmeV90eF9hYm9ydDsKLQkJb3Blbl9jZmcubm90aWZ5X3N0YXRlID0gd2RzcF9nbGlua19ub3RpZnlfc3RhdGU7Ci0JCW9wZW5fY2ZnLm5vdGlmeV9yeF9pbnRlbnRfcmVxID0gd2RzcF9nbGlua19ub3RpZnlfcnhfaW50ZW50X3JlcTsKLQkJb3Blbl9jZmcucHJpdiA9IGNoOwotCQlvcGVuX2NmZy5uYW1lID0gY2gtPmNoX2NmZy5uYW1lOwotCi0JCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiBjaC0+Y2hfY2ZnLm5hbWUgPSAlcywgbGF0ZW5jeV9pbl91cyA9ICVkLCBpbnRlbnRzID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lLCBjaC0+Y2hfY2ZnLmxhdGVuY3lfaW5fdXMsCi0JCQljaC0+Y2hfY2ZnLm5vX29mX2ludGVudHMpOwotCi0JCWNoLT5oYW5kbGUgPSBnbGlua19vcGVuKCZvcGVuX2NmZyk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChjaC0+aGFuZGxlKSkgewotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IGdsaW5rX29wZW4gZmFpbGVkIGZvciBjaCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgY2gtPmNoX2NmZy5uYW1lKTsKLQkJCWNoLT5oYW5kbGUgPSBOVUxMOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBjaCAlcyBpcyBhbHJlYWR5IG9wZW5lZFxuIiwgX19mdW5jX18sCi0JCQljaC0+Y2hfY2ZnLm5hbWUpOwotCX0KLQltdXRleF91bmxvY2soJndwcml2LT5nbGlua19tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2RzcF9nbGlua19jbG9zZV9hbGxfY2ggLSBJbnRlcm5hbCBmdW5jdGlvbiB0byBjbG9zZSBhbGwgZ2xpbmsgY2hhbm5lbHMKLSAqIHdwcml2OiAgICAgICBXZHNwX2dsaW5rIHByaXZhdGUgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfY2xvc2VfYWxsX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHdwcml2LT5ub19vZl9jaGFubmVsczsgaSsrKQotCQlpZiAod3ByaXYtPmNoICYmIHdwcml2LT5jaFtpXSkKLQkJCXdkc3BfZ2xpbmtfY2xvc2VfY2god3ByaXYtPmNoW2ldKTsKLX0KLQotLyoKLSAqIHdkc3BfZ2xpbmtfb3Blbl9hbGxfY2ggLSBJbnRlcm5hbCBmdW5jdGlvbiB0byBvcGVuIGFsbCBnbGluayBjaGFubmVscwotICogd3ByaXY6ICAgICAgIFdkc3BfZ2xpbmsgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIGludCB3ZHNwX2dsaW5rX29wZW5fYWxsX2NoKHN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2KQotewotCWludCByZXQgPSAwLCBpLCBqOwotCi0JZm9yIChpID0gMDsgaSA8IHdwcml2LT5ub19vZl9jaGFubmVsczsgaSsrKSB7Ci0JCWlmICh3cHJpdi0+Y2ggJiYgd3ByaXYtPmNoW2ldKSB7Ci0JCQlyZXQgPSB3ZHNwX2dsaW5rX29wZW5fY2god3ByaXYtPmNoW2ldKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gZXJyX29wZW47Ci0JCX0KLQl9Ci0JZ290byBkb25lOwotCi1lcnJfb3BlbjoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlpZiAod3ByaXYtPmNoW2ldKQotCQkJd2RzcF9nbGlua19jbG9zZV9jaCh3cHJpdi0+Y2hbal0pOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX2NoX29wZW5fd3EgLSBXb3JrIGZ1bmN0aW9uIHRvIG9wZW4gZ2xpbmsgY2hhbm5lbHMKLSAqIHdvcms6ICAgICAgV29yayBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHZvaWQgd2RzcF9nbGlua19jaF9vcGVuX2Nsc193cmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OwotCi0Jd3ByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiwKLQkJCSAgICAgY2hfb3Blbl9jbHNfd3JrKTsKLQotCWlmICh3cHJpdi0+Z2xpbmtfc3RhdGUubGlua19zdGF0ZSA9PSBHTElOS19MSU5LX1NUQVRFX0RPV04pIHsKLQkJZGV2X2luZm8od3ByaXYtPmRldiwgIiVzOiBHTElOS19MSU5LX1NUQVRFX0RPV05cbiIsCi0JCQkgX19mdW5jX18pOwotCi0JCXdkc3BfZ2xpbmtfY2xvc2VfYWxsX2NoKHdwcml2KTsKLQl9IGVsc2UgaWYgKHdwcml2LT5nbGlua19zdGF0ZS5saW5rX3N0YXRlID09IEdMSU5LX0xJTktfU1RBVEVfVVApIHsKLQkJZGV2X2luZm8od3ByaXYtPmRldiwgIiVzOiBHTElOS19MSU5LX1NUQVRFX1VQXG4iLAotCQkJIF9fZnVuY19fKTsKLQotCQl3ZHNwX2dsaW5rX29wZW5fYWxsX2NoKHdwcml2KTsKLQl9Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX2xpbmtfc3RhdGVfY2IgLSBHbGluayBsaW5rIHN0YXRlIGNhbGxiYWNrIHRvIGluZm9ybQotICogYWJvdXQgbGluayBzdGF0ZXMKLSAqIGNiX2luZm86ICAgICBHbGluayBsaW5rIHN0YXRlIGNhbGxiYWNrIGluZm9ybWF0aW9uIHN0cnVjdHVyZQotICogcHJpdjogICAgICAgIFByaXZhdGUgc3RydWN0dXJlIG9mIGxpbmsgc3RhdGUgcGFzc2VkIHdoaWxlIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkIHdkc3BfZ2xpbmtfbGlua19zdGF0ZV9jYihzdHJ1Y3QgZ2xpbmtfbGlua19zdGF0ZV9jYl9pbmZvICpjYl9pbmZvLAotCQkJCSAgICAgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQotCWlmICghY2JfaW5mbyB8fCAhcHJpdikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXdwcml2ID0gKHN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKilwcml2OwotCi0JbXV0ZXhfbG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKLQl3cHJpdi0+Z2xpbmtfc3RhdGUubGlua19zdGF0ZSA9IGNiX2luZm8tPmxpbmtfc3RhdGU7Ci0Jd2FrZV91cCgmd3ByaXYtPmxpbmtfc3RhdGVfd2FpdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOwotCi0JcXVldWVfd29yayh3cHJpdi0+d29ya19xdWV1ZSwgJndwcml2LT5jaF9vcGVuX2Nsc193cmspOwotfQotCi0vKgotICogd2RzcF9nbGlua19jaF9pbmZvX2luaXQtIEludGVybmFsIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGNoYW5uZWwgbWVtb3J5Ci0gKiBhbmQgcmVnaXN0ZXIgd2l0aCBnbGluawotICogd3ByaXY6ICAgICBXZHNwX2dsaW5rIHByaXZhdGUgc3RydWN0dXJlLgotICogcGt0OiAgICAgICBHbGluayByZWdpc3RyYXRpb24gcGFja2V0IGNvbnRhaW5zIGdsaW5rIGNoYW5uZWwgaW5mb3JtYXRpb24uCi0gKiBwa3Rfc2l6ZTogIFNpemUgb2YgdGhlIHBrdC4KLSAqLwotc3RhdGljIGludCB3ZHNwX2dsaW5rX2NoX2luZm9faW5pdChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdiwKLQkJCQkgICBzdHJ1Y3Qgd2RzcF9yZWdfcGt0ICpwa3QsIHNpemVfdCBwa3Rfc2l6ZSkKLXsKLQlpbnQgcmV0ID0gMCwgaSwgajsKLQlzdHJ1Y3QgZ2xpbmtfbGlua19pbmZvIGxpbmtfaW5mbzsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcgKmNoX2NmZzsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqKmNoOwotCXU4IG5vX29mX2NoYW5uZWxzOwotCXU4ICpwYXlsb2FkOwotCXUzMiBjaF9zaXplLCBjaF9jZmdfc2l6ZTsKLQlzaXplX3Qgc2l6ZSA9IFdEU1BfV1JJVEVfUEtUX1NJWkUgKyBXRFNQX1JFR19QS1RfU0laRTsKLQotCW11dGV4X2xvY2soJndwcml2LT5nbGlua19tdXRleCk7Ci0JaWYgKHdwcml2LT5jaCkgewotCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogZ2xpbmsgY2ggbWVtb3J5IGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlwYXlsb2FkID0gKHU4ICopcGt0LT5wYXlsb2FkOwotCW5vX29mX2NoYW5uZWxzID0gcGt0LT5ub19vZl9jaGFubmVsczsKLQotCWlmIChub19vZl9jaGFubmVscyA+IFdEU1BfTUFYX05PX09GX0NIQU5ORUxTKSB7Ci0JCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBub19vZl9jaGFubmVsczogJWQgYnV0IG1heCBhbGxvd2VkIGFyZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBub19vZl9jaGFubmVscywgV0RTUF9NQVhfTk9fT0ZfQ0hBTk5FTFMpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWNoID0ga2NhbGxvYyhub19vZl9jaGFubmVscywgc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX2NoICopLAotCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmICghY2gpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQl3cHJpdi0+Y2ggPSBjaDsKLQl3cHJpdi0+bm9fb2ZfY2hhbm5lbHMgPSBub19vZl9jaGFubmVsczsKLQotCWZvciAoaSA9IDA7IGkgPCBub19vZl9jaGFubmVsczsgaSsrKSB7Ci0JCWNoX2NmZyA9IChzdHJ1Y3Qgd2RzcF9nbGlua19jaF9jZmcgKilwYXlsb2FkOwotCi0JCXNpemUgKz0gV0RTUF9DSF9DRkdfU0laRTsKLQkJaWYgKHNpemUgPiBwa3Rfc2l6ZSkgewotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IEludmFsaWQgc2l6ZSA9ICV6ZCwgcGt0X3NpemUgPSAlemRcbiIsCi0JCQkJX19mdW5jX18sIHNpemUsIHBrdF9zaXplKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9jaF9tZW07Ci0JCX0KLQkJaWYgKGNoX2NmZy0+bm9fb2ZfaW50ZW50cyA+IFdEU1BfTUFYX05PX09GX0lOVEVOVFMpIHsKLQkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBJbnZhbGlkIG5vX29mX2ludGVudHMgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2hfY2ZnLT5ub19vZl9pbnRlbnRzKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9jaF9tZW07Ci0JCX0KLQkJc2l6ZSArPSAoc2l6ZW9mKHUzMikgKiBjaF9jZmctPm5vX29mX2ludGVudHMpOwotCQlpZiAoc2l6ZSA+IHBrdF9zaXplKSB7Ci0JCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogSW52YWxpZCBzaXplID0gJXpkLCBwa3Rfc2l6ZSA9ICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgc2l6ZSwgcGt0X3NpemUpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyX2NoX21lbTsKLQkJfQotCi0JCWNoX2NmZ19zaXplID0gc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX2NoX2NmZykgKwotCQkJCQkoc2l6ZW9mKHUzMikgKiBjaF9jZmctPm5vX29mX2ludGVudHMpOwotCQljaF9zaXplID0gc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX2NoKSArCi0JCQkJCShzaXplb2YodTMyKSAqIGNoX2NmZy0+bm9fb2ZfaW50ZW50cyk7Ci0KLQkJZGV2X2RiZyh3cHJpdi0+ZGV2LCAiJXM6IGNoYW5uZWxzOiAlZCBjaF9jZmdfc2l6ZTogJWQsIHNpemU6ICV6ZCwgcGt0X3NpemU6ICV6ZCIsCi0JCQkgX19mdW5jX18sIG5vX29mX2NoYW5uZWxzLCBjaF9jZmdfc2l6ZSwgc2l6ZSwgcGt0X3NpemUpOwotCi0JCWNoW2ldID0ga3phbGxvYyhjaF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjaFtpXSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2NoX21lbTsKLQkJfQotCQljaFtpXS0+Y2hhbm5lbF9zdGF0ZSA9IEdMSU5LX0xPQ0FMX0RJU0NPTk5FQ1RFRDsKLQkJbWVtY3B5KCZjaFtpXS0+Y2hfY2ZnLCBwYXlsb2FkLCBjaF9jZmdfc2l6ZSk7Ci0JCXBheWxvYWQgKz0gY2hfY2ZnX3NpemU7Ci0KLQkJbXV0ZXhfaW5pdCgmY2hbaV0tPm11dGV4KTsKLQkJY2hbaV0tPndwcml2ID0gd3ByaXY7Ci0JCUlOSVRfV09SSygmY2hbaV0tPmxjbF9jaF9vcGVuX3dyaywgd2RzcF9nbGlua19sY2xfY2hfb3Blbl93cmspOwotCQlJTklUX1dPUksoJmNoW2ldLT5sY2xfY2hfY2xzX3dyaywgd2RzcF9nbGlua19sY2xfY2hfY2xzX3dyayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoW2ldLT5jaF9jb25uZWN0X3dhaXQpOwotCX0KLQotCUlOSVRfV09SSygmd3ByaXYtPmNoX29wZW5fY2xzX3dyaywgd2RzcF9nbGlua19jaF9vcGVuX2Nsc193cmspOwotCi0JLyogUmVnaXN0ZXIgZ2xpbmsgbGlua19zdGF0ZSBub3RpZmljYXRpb24gKi8KLQlsaW5rX2luZm8uZ2xpbmtfbGlua19zdGF0ZV9ub3RpZl9jYiA9IHdkc3BfZ2xpbmtfbGlua19zdGF0ZV9jYjsKLQlsaW5rX2luZm8udHJhbnNwb3J0ID0gTlVMTDsKLQlsaW5rX2luZm8uZWRnZSA9IFdEU1BfRURHRTsKLQotCXdwcml2LT5nbGlua19zdGF0ZS5saW5rX3N0YXRlID0gR0xJTktfTElOS19TVEFURV9ET1dOOwotCXdwcml2LT5nbGlua19zdGF0ZS5oYW5kbGUgPSBnbGlua19yZWdpc3Rlcl9saW5rX3N0YXRlX2NiKCZsaW5rX2luZm8sCi0JCQkJCQkJCSB3cHJpdik7Ci0JaWYgKCF3cHJpdi0+Z2xpbmtfc3RhdGUuaGFuZGxlKSB7Ci0JCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgd2RzcCBsaW5rIHN0YXRlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9jaF9tZW07Ci0JfQotCWdvdG8gZG9uZTsKLQotZXJyX2NoX21lbToKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCW11dGV4X2Rlc3Ryb3koJmNoW2pdLT5tdXRleCk7Ci0JCWtmcmVlKHdwcml2LT5jaFtqXSk7Ci0JCXdwcml2LT5jaFtqXSA9IE5VTEw7Ci0JfQotCWtmcmVlKHdwcml2LT5jaCk7Ci0Jd3ByaXYtPmNoID0gTlVMTDsKLQl3cHJpdi0+bm9fb2ZfY2hhbm5lbHMgPSAwOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2RzcF9nbGlua190eF9idWZfd29yayAtIFdvcmsgcXVldWUgZnVuY3Rpb24gdG8gc2VuZCB0eCBidWZmZXIgdG8gZ2xpbmsKLSAqIHdvcms6ICAgICBXb3JrIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCB3ZHNwX2dsaW5rX3R4X2J1Zl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19jaCAqY2g7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfdHhfYnVmICp0eF9idWY7Ci0Jc3RydWN0IHdkc3Bfd3JpdGVfcGt0ICp3cGt0OwotCXN0cnVjdCB3ZHNwX2NtZF9wa3QgKmNwa3Q7Ci0JaW50IHJldCA9IDA7Ci0KLQl0eF9idWYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdkc3BfZ2xpbmtfdHhfYnVmLAotCQkJICAgICAgdHhfd29yayk7Ci0JY2ggPSB0eF9idWYtPmNoOwotCXdwcml2ID0gY2gtPndwcml2OwotCXdwa3QgPSAoc3RydWN0IHdkc3Bfd3JpdGVfcGt0ICopdHhfYnVmLT5idWY7Ci0JY3BrdCA9IChzdHJ1Y3Qgd2RzcF9jbWRfcGt0ICopd3BrdC0+cGF5bG9hZDsKLQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY2ggbmFtZSA9ICVzLCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKLQkJX19mdW5jX18sIGNwa3QtPmNoX25hbWUsIGNwa3QtPnBheWxvYWRfc2l6ZSk7Ci0KLQltdXRleF9sb2NrKCZ0eF9idWYtPmNoLT5tdXRleCk7Ci0JaWYgKGNoLT5jaGFubmVsX3N0YXRlID09IEdMSU5LX0NPTk5FQ1RFRCkgewotCQltdXRleF91bmxvY2soJnR4X2J1Zi0+Y2gtPm11dGV4KTsKLQkJcmV0ID0gZ2xpbmtfdHgoY2gtPmhhbmRsZSwgdHhfYnVmLAotCQkJICAgICAgIGNwa3QtPnBheWxvYWQsIGNwa3QtPnBheWxvYWRfc2l6ZSwKLQkJCSAgICAgICBHTElOS19UWF9SRVFfSU5URU5UKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBnbGluayB0eCBmYWlsZWQsIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJLyoKLQkJCSAqIElmIGdsaW5rX3R4KCkgaXMgZmFpbGVkIHRoZW4gZnJlZSB0eF9idWYgaGVyZSBhcwotCQkJICogdGhlcmUgd29uJ3QgYmUgYW55IHR4X2RvbmUgbm90aWZpY2F0aW9uIHRvCi0JCQkgKiBmcmVlIHRoZSBidWZmZXIuCi0JCQkgKi8KLQkJCXZmcmVlKHR4X2J1Zik7Ci0JCX0KLQl9IGVsc2UgewotCQltdXRleF91bmxvY2soJnR4X2J1Zi0+Y2gtPm11dGV4KTsKLQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IGNoYW5uZWwgJXMgaXMgbm90IGluIGNvbm5lY3RlZCBzdGF0ZVxuIiwKLQkJCV9fZnVuY19fLCBjaC0+Y2hfY2ZnLm5hbWUpOwotCQkvKgotCQkgKiBGcmVlIHR4X2J1ZiBoZXJlIGFzIHRoZXJlIHdvbid0IGJlIGFueSB0eF9kb25lCi0JCSAqIG5vdGlmaWNhdGlvbiBpbiB0aGlzIGNhc2UgYWxzby4KLQkJICovCi0JCXZmcmVlKHR4X2J1Zik7Ci0JfQotfQotCi0vKgotICogd2RzcF9nbGlua19yZWFkIC0gUmVhZCBBUEkgdG8gc2VuZCB0aGUgZGF0YSB0byB1c2Vyc3BhY2UKLSAqIGZpbGU6ICAgIFBvaW50ZXIgdG8gdGhlIGZpbGUgc3RydWN0dXJlCi0gKiBidWY6ICAgICBQb2ludGVyIHRvIHRoZSB1c2Vyc3BhY2UgYnVmZmVyCi0gKiBjb3VudDogICBOdW1iZXIgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBmaWxlCi0gKiBwcG9zOiAgICBQb2ludGVyIHRvIHRoZSBwb3NpdGlvbiBpbnRvIHRoZSBmaWxlCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHdkc3BfZ2xpbmtfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmV0ID0gMCwgcmV0MSA9IDA7Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfcnNwX3F1ZSAqcnNwOwotCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OwotCi0Jd3ByaXYgPSAoc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXdwcml2KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY291bnQgPiBXRFNQX01BWF9SRUFEX1NJWkUpIHsKLQkJZGV2X2luZm8od3ByaXYtPmRldiwgIiVzOiBjb3VudCA9ICV6ZCBpcyBtb3JlIHRoYW4gV0RTUF9NQVhfUkVBRF9TSVpFXG4iLAotCQkJX19mdW5jX18sIGNvdW50KTsKLQkJY291bnQgPSBXRFNQX01BWF9SRUFEX1NJWkU7Ci0JfQotCS8qCi0JICogQ29tcGxldGUgc2lnbmFsIGhhcyBnaXZlbiBmcm9tIGdsaW5rIHJ4IG5vdGlmaWNhdGlvbiBjYWxsYmFjawotCSAqIG9yIGZyb20gZmx1c2ggQVBJLiBBbHNvIHVzZSBpbnRlcnJ1cHRpYmxlIHdhaXRfZm9yX2NvbXBsZXRpb24gQVBJCi0JICogdG8gYWxsb3cgdGhlIHN5c3RlbSB0byBnbyBpbiBzdXNwZW5kLgotCSAqLwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmd3ByaXYtPnJzcF9jb21wbGV0ZSk7Ci0JaWYgKHJldCkKLQkJZ290byBkb25lOwotCi0JbXV0ZXhfbG9jaygmd3ByaXYtPnJzcF9tdXRleCk7Ci0JaWYgKHdwcml2LT5yc3BfY250KSB7Ci0JCXdwcml2LT5yc3BfY250LS07Ci0JCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiByZWFkIGZyb20gYnVmZmVyICVkXG4iLAotCQkJX19mdW5jX18sIHdwcml2LT5yc3BfY250KTsKLQotCQlyc3AgPSAmd3ByaXYtPnJzcFt3cHJpdi0+cnNwX2NudF07Ci0JCWlmIChjb3VudCA8IHJzcC0+YnVmX3NpemUpIHsKLQkJCXJldDEgPSBjb3B5X3RvX3VzZXIoYnVmLCAmcnNwLT5idWYsIGNvdW50KTsKLQkJCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCAqLwotCQkJcmV0ID0gY291bnQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQxID0gY29weV90b191c2VyKGJ1ZiwgJnJzcC0+YnVmLCByc3AtPmJ1Zl9zaXplKTsKLQkJCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCAqLwotCQkJcmV0ID0gcnNwLT5idWZfc2l6ZTsKLQkJfQotCi0JCWlmIChyZXQxKSB7Ci0JCQltdXRleF91bmxvY2soJndwcml2LT5yc3BfbXV0ZXgpOwotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IGNvcHlfdG9fdXNlciBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogVGhpcyB3aWxsIGV4ZWN1dGUgb25seSBpZiBmbHVzaCBBUEkgaXMgY2FsbGVkIG9yCi0JCSAqIHNvbWV0aGluZyB3cm9uZyB3aXRoIHJlZl9jbnQKLQkJICovCi0JCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiByZXNwIGNvdW50ID0gJWRcbiIsIF9fZnVuY19fLAotCQkJd3ByaXYtPnJzcF9jbnQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJndwcml2LT5yc3BfbXV0ZXgpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX3dyaXRlIC0gV3JpdGUgQVBJIHRvIHJlY2VpdmUgdGhlIGRhdGEgZnJvbSB1c2Vyc3BhY2UKLSAqIGZpbGU6ICAgIFBvaW50ZXIgdG8gdGhlIGZpbGUgc3RydWN0dXJlCi0gKiBidWY6ICAgICBQb2ludGVyIHRvIHRoZSB1c2Vyc3BhY2UgYnVmZmVyCi0gKiBjb3VudDogICBOdW1iZXIgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBmaWxlCi0gKiBwcG9zOiAgICBQb2ludGVyIHRvIHRoZSBwb3NpdGlvbiBpbnRvIHRoZSBmaWxlCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHdkc3BfZ2xpbmtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJldCA9IDAsIGksIHR4X2J1Zl9zaXplOwotCXN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAqd3BrdDsKLQlzdHJ1Y3Qgd2RzcF9jbWRfcGt0ICpjcGt0OwotCXN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1ZiAqdHhfYnVmOwotCXN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKndwcml2OwotCXNpemVfdCBwa3RfbWF4X3NpemU7Ci0KLQl3cHJpdiA9IChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghd3ByaXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgoY291bnQgPCBXRFNQX1dSSVRFX1BLVF9TSVpFKSB8fAotCSAgICAoY291bnQgPiBXRFNQX01BWF9XUklURV9TSVpFKSkgewotCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogSW52YWxpZCBjb3VudCA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBjb3VudCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZXZfZGJnKHdwcml2LT5kZXYsICIlczogY291bnQgPSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7Ci0KLQl0eF9idWZfc2l6ZSA9IGNvdW50ICsgc2l6ZW9mKHN0cnVjdCB3ZHNwX2dsaW5rX3R4X2J1Zik7Ci0JdHhfYnVmID0gdnphbGxvYyh0eF9idWZfc2l6ZSk7Ci0JaWYgKCF0eF9idWYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNvcHlfZnJvbV91c2VyKHR4X2J1Zi0+YnVmLCBidWYsIGNvdW50KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBmcmVlX2J1ZjsKLQl9Ci0KLQl3cGt0ID0gKHN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAqKXR4X2J1Zi0+YnVmOwotCXN3aXRjaCAod3BrdC0+cGt0X3R5cGUpIHsKLQljYXNlIFdEU1BfUkVHX1BLVDoKLQkJaWYgKGNvdW50IDwgKFdEU1BfV1JJVEVfUEtUX1NJWkUgKyBXRFNQX1JFR19QS1RfU0laRSArCi0JCQkgICAgIFdEU1BfQ0hfQ0ZHX1NJWkUpKSB7Ci0JCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogSW52YWxpZCByZWcgcGt0IHNpemUgPSAlemRcbiIsCi0JCQkJX19mdW5jX18sIGNvdW50KTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZyZWVfYnVmOwotCQl9Ci0JCXJldCA9IHdkc3BfZ2xpbmtfY2hfaW5mb19pbml0KHdwcml2LAotCQkJCQkoc3RydWN0IHdkc3BfcmVnX3BrdCAqKXdwa3QtPnBheWxvYWQsCi0JCQkJCWNvdW50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogZ2xpbmsgcmVnaXN0ZXIgZmFpbGVkLCByZXQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJdmZyZWUodHhfYnVmKTsKLQkJYnJlYWs7Ci0JY2FzZSBXRFNQX1JFQURZX1BLVDoKLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHdwcml2LT5saW5rX3N0YXRlX3dhaXQsCi0JCQkJCSAod3ByaXYtPmdsaW5rX3N0YXRlLmxpbmtfc3RhdGUgPT0KLQkJCQkJCQlHTElOS19MSU5LX1NUQVRFX1VQKSwKLQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCQlpZiAoIXJldCkgewotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IExpbmsgc3RhdGUgd2FpdCB0aW1lb3V0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGZyZWVfYnVmOwotCQl9Ci0JCXJldCA9IDA7Ci0JCXZmcmVlKHR4X2J1Zik7Ci0JCWJyZWFrOwotCWNhc2UgV0RTUF9DTURfUEtUOgotCQlpZiAoY291bnQgPD0gKFdEU1BfV1JJVEVfUEtUX1NJWkUgKyBXRFNQX0NNRF9QS1RfU0laRSkpIHsKLQkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBJbnZhbGlkIGNtZCBwa3Qgc2l6ZSA9ICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgY291bnQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZnJlZV9idWY7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKLQkJaWYgKHdwcml2LT5nbGlua19zdGF0ZS5saW5rX3N0YXRlID09IEdMSU5LX0xJTktfU1RBVEVfRE9XTikgewotCQkJbXV0ZXhfdW5sb2NrKCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOwotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IExpbmsgc3RhdGUgaXMgRG93blxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0KLQkJCXJldCA9IC1FTkVUUkVTRVQ7Ci0JCQlnb3RvIGZyZWVfYnVmOwotCQl9Ci0JCW11dGV4X3VubG9jaygmd3ByaXYtPmdsaW5rX211dGV4KTsKLQkJY3BrdCA9IChzdHJ1Y3Qgd2RzcF9jbWRfcGt0ICopd3BrdC0+cGF5bG9hZDsKLQkJcGt0X21heF9zaXplID0gIHNpemVvZihzdHJ1Y3Qgd2RzcF93cml0ZV9wa3QpICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCB3ZHNwX2NtZF9wa3QpICsKLQkJCQkJY3BrdC0+cGF5bG9hZF9zaXplOwotCQlpZiAoY291bnQgPCBwa3RfbWF4X3NpemUpIHsKLQkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBJbnZhbGlkIGNtZCBwa3QgY291bnQgPSAlemQsIHBrdF9zaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCBjb3VudCwgcGt0X21heF9zaXplKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZyZWVfYnVmOwotCQl9Ci0JCWRldl9kYmcod3ByaXYtPmRldiwgIiVzOiByZXF1ZXN0ZWQgY2hfbmFtZTogJXMsIHBrdF9zaXplOiAlemRcbiIsCi0JCQlfX2Z1bmNfXywgY3BrdC0+Y2hfbmFtZSwgcGt0X21heF9zaXplKTsKLQkJZm9yIChpID0gMDsgaSA8IHdwcml2LT5ub19vZl9jaGFubmVsczsgaSsrKSB7Ci0JCQlpZiAod3ByaXYtPmNoICYmIHdwcml2LT5jaFtpXSAmJgotCQkJCSghc3RyY21wKGNwa3QtPmNoX25hbWUsCi0JCQkJCQl3cHJpdi0+Y2hbaV0tPmNoX2NmZy5uYW1lKSkpIHsKLQkJCQl0eF9idWYtPmNoID0gd3ByaXYtPmNoW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghdHhfYnVmLT5jaCkgewotCQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgZ2xpbmsgY2hhbm5lbFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmcmVlX2J1ZjsKLQkJfQotCi0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0eF9idWYtPmNoLT5jaF9jb25uZWN0X3dhaXQsCi0JCQkJCSAodHhfYnVmLT5jaC0+Y2hhbm5lbF9zdGF0ZSA9PQotCQkJCQkJCUdMSU5LX0NPTk5FQ1RFRCksCi0JCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWRldl9lcnIod3ByaXYtPmRldiwgIiVzOiBnbGluayBjaGFubmVsICVzIGlzIG5vdCBpbiBjb25uZWN0ZWQgc3RhdGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHR4X2J1Zi0+Y2gtPmNoX2NmZy5uYW1lLAotCQkJCXR4X2J1Zi0+Y2gtPmNoYW5uZWxfc3RhdGUpOwotCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJCWdvdG8gZnJlZV9idWY7Ci0JCX0KLQkJcmV0ID0gMDsKLQotCQlJTklUX1dPUksoJnR4X2J1Zi0+dHhfd29yaywgd2RzcF9nbGlua190eF9idWZfd29yayk7Ci0JCXF1ZXVlX3dvcmsod3ByaXYtPndvcmtfcXVldWUsICZ0eF9idWYtPnR4X3dvcmspOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKHdwcml2LT5kZXYsICIlczogSW52YWxpZCBwYWNrZXQgdHlwZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQl2ZnJlZSh0eF9idWYpOwotCQlicmVhazsKLQl9Ci0JZ290byBkb25lOwotCi1mcmVlX2J1ZjoKLQl2ZnJlZSh0eF9idWYpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX29wZW4gLSBPcGVuIEFQSSB0byBpbml0aWFsaXplIHByaXZhdGUgZGF0YQotICogaW5vZGU6ICAgUG9pbnRlciB0byB0aGUgaW5vZGUgc3RydWN0dXJlCi0gKiBmaWxlOiAgICBQb2ludGVyIHRvIHRoZSBmaWxlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgaW50IHdkc3BfZ2xpbmtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19kZXYgKndkZXY7Ci0KLQlpZiAoIWlub2RlLT5pX2NkZXYpIHsKLQkJcHJfZXJyKCIlczogY2RldiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jd2RldiA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3Qgd2RzcF9nbGlua19kZXYsIGNkZXYpOwotCi0Jd3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2RzcF9nbGlua19wcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3cHJpdikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCXdwcml2LT5kZXYgPSB3ZGV2LT5kZXY7Ci0Jd3ByaXYtPndvcmtfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgid2RzcF9nbGlua193cSIpOwotCWlmICghd3ByaXYtPndvcmtfcXVldWUpIHsKLQkJZGV2X2Vycih3cHJpdi0+ZGV2LCAiJXM6IEVycm9yIGNyZWF0aW5nIHdkc3BfZ2xpbmtfd3FcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3dxOwotCX0KLQotCWluaXRfY29tcGxldGlvbigmd3ByaXYtPnJzcF9jb21wbGV0ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmd3ByaXYtPmxpbmtfc3RhdGVfd2FpdCk7Ci0JbXV0ZXhfaW5pdCgmd3ByaXYtPnJzcF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmd3ByaXYtPmdsaW5rX211dGV4KTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSB3cHJpdjsKLQotCWdvdG8gZG9uZTsKLQotZXJyX3dxOgotCWtmcmVlKHdwcml2KTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2RzcF9nbGlua19mbHVzaCAtIEZsdXNoIEFQSSB0byB1bmJsb2NrIHJlYWQuCi0gKiBmaWxlOiAgICBQb2ludGVyIHRvIHRoZSBmaWxlIHN0cnVjdHVyZQotICogaWQ6ICAgICAgTG9jayBvd25lciBJRAotICovCi1zdGF0aWMgaW50IHdkc3BfZ2xpbmtfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCi17Ci0Jc3RydWN0IHdkc3BfZ2xpbmtfcHJpdiAqd3ByaXY7Ci0KLQl3cHJpdiA9IChzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghd3ByaXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY29tcGxldGUoJndwcml2LT5yc3BfY29tcGxldGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB3ZHNwX2dsaW5rX3JlbGVhc2UgLSBSZWxlYXNlIEFQSSB0byBjbGVhbiB1cCByZXNvdXJjZXMuCi0gKiBXaGVuZXZlciBhIGZpbGUgc3RydWN0dXJlIGlzIHNoYXJlZCBhY3Jvc3MgbXVsdGlwbGUgdGhyZWFkcywKLSAqIHJlbGVhc2Ugd29uJ3QgYmUgaW52b2tlZCB1bnRpbCBhbGwgY29waWVzIGFyZSBjbG9zZWQKLSAqIChmaWxlLT5mX2NvdW50LmNvdW50ZXIgc2hvdWxkIGJlIDApLiBJZiB3ZSBuZWVkIHRvIGZsdXNoIHBlbmRpbmcKLSAqIGRhdGEgd2hlbiBhbnkgY29weSBpcyBjbG9zZWQsIHlvdSBzaG91bGQgaW1wbGVtZW50IHRoZSBmbHVzaCBtZXRob2QuCi0gKgotICogaW5vZGU6ICAgUG9pbnRlciB0byB0aGUgaW5vZGUgc3RydWN0dXJlCi0gKiBmaWxlOiAgICBQb2ludGVyIHRvIHRoZSBmaWxlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgaW50IHdkc3BfZ2xpbmtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19wcml2ICp3cHJpdjsKLQotCXdwcml2ID0gKHN0cnVjdCB3ZHNwX2dsaW5rX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCF3cHJpdikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHdwcml2LT5nbGlua19zdGF0ZS5oYW5kbGUpCi0JCWdsaW5rX3VucmVnaXN0ZXJfbGlua19zdGF0ZV9jYih3cHJpdi0+Z2xpbmtfc3RhdGUuaGFuZGxlKTsKLQotCWZsdXNoX3dvcmtxdWV1ZSh3cHJpdi0+d29ya19xdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUod3ByaXYtPndvcmtfcXVldWUpOwotCi0JLyoKLQkgKiBDbGVhbiB1cCBnbGluayBjaGFubmVsIG1lbW9yeSBpbiBjaGFubmVsIHN0YXRlCi0JICogY2FsbGJhY2sgb25seSBpZiBjbG9zZSBjaGFubmVscyBhcmUgY2FsbGVkIGZyb20gaGVyZS4KLQkgKi8KLQlpZiAod3ByaXYtPmNoKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB3cHJpdi0+bm9fb2ZfY2hhbm5lbHM7IGkrKykgewotCQkJaWYgKHdwcml2LT5jaFtpXSkgewotCQkJCXdwcml2LT5jaFtpXS0+ZnJlZV9tZW0gPSB0cnVlOwotCQkJCS8qCi0JCQkJICogQ2hhbm5lbCBoYW5kbGUgTlVMTCBtZWFucyBjaGFubmVsIGlzIGFscmVhZHkKLQkJCQkgKiBjbG9zZWQuIEZyZWUgdGhlIGNoYW5uZWwgbWVtb3J5IGhlcmUgaXRzZWxmLgotCQkJCSAqLwotCQkJCWlmICghd3ByaXYtPmNoW2ldLT5oYW5kbGUpIHsKLQkJCQkJa2ZyZWUod3ByaXYtPmNoW2ldKTsKLQkJCQkJd3ByaXYtPmNoW2ldID0gTlVMTDsKLQkJCQl9IGVsc2UgewotCQkJCQl3ZHNwX2dsaW5rX2Nsb3NlX2NoKHdwcml2LT5jaFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJa2ZyZWUod3ByaXYtPmNoKTsKLQkJd3ByaXYtPmNoID0gTlVMTDsKLQl9Ci0KLQltdXRleF9kZXN0cm95KCZ3cHJpdi0+Z2xpbmtfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJndwcml2LT5yc3BfbXV0ZXgpOwotCWtmcmVlKHdwcml2KTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkc3BfZ2xpbmtfZm9wcyA9IHsKLQkub3duZXIgPSAgICAgICAgICAgICAgICBUSElTX01PRFVMRSwKLQkub3BlbiA9ICAgICAgICAgICAgICAgICB3ZHNwX2dsaW5rX29wZW4sCi0JLnJlYWQgPSAgICAgICAgICAgICAgICAgd2RzcF9nbGlua19yZWFkLAotCS53cml0ZSA9ICAgICAgICAgICAgICAgIHdkc3BfZ2xpbmtfd3JpdGUsCi0JLmZsdXNoID0gICAgICAgICAgICAgICAgd2RzcF9nbGlua19mbHVzaCwKLQkucmVsZWFzZSA9ICAgICAgICAgICAgICB3ZHNwX2dsaW5rX3JlbGVhc2UsCi19OwotCi0vKgotICogd2RzcF9nbGlua19wcm9iZSAtIERyaXZlciBwcm9iZSB0byBleHBvc2UgY2hhciBkZXZpY2UKLSAqIHBkZXY6ICAgIFBvaW50ZXIgdG8gZGV2aWNlIHRyZWUgZGF0YS4KLSAqLwotc3RhdGljIGludCB3ZHNwX2dsaW5rX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgd2RzcF9nbGlua19kZXYgKndkZXY7Ci0KLQl3ZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqd2RldiksIEdGUF9LRVJORUwpOwotCWlmICghd2RldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmd2Rldi0+ZGV2X251bSwgMCwgTUlOT1JfTlVNQkVSX0NPVU5ULAotCQkJCSAgV0RTUF9HTElOS19EUklWRVJfTkFNRSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvYyBjaGFyIGRldiwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfY2hyZGV2OwotCX0KLQotCXdkZXYtPmNscyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgV0RTUF9HTElOS19EUklWRVJfTkFNRSk7Ci0JaWYgKElTX0VSUih3ZGV2LT5jbHMpKSB7Ci0JCXJldCA9IFBUUl9FUlIod2Rldi0+Y2xzKTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBjcmVhdGUgY2xhc3MsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2NsYXNzOwotCX0KLQotCXdkZXYtPmRldiA9IGRldmljZV9jcmVhdGUod2Rldi0+Y2xzLCBOVUxMLCB3ZGV2LT5kZXZfbnVtLAotCQkJCSAgTlVMTCwgV0RTUF9HTElOS19EUklWRVJfTkFNRSk7Ci0JaWYgKElTX0VSUih3ZGV2LT5kZXYpKSB7Ci0JCXJldCA9IFBUUl9FUlIod2Rldi0+ZGV2KTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBjcmVhdGUgZGV2aWNlLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9kZXZfY3JlYXRlOwotCX0KLQotCWNkZXZfaW5pdCgmd2Rldi0+Y2RldiwgJndkc3BfZ2xpbmtfZm9wcyk7Ci0JcmV0ID0gY2Rldl9hZGQoJndkZXYtPmNkZXYsIHdkZXYtPmRldl9udW0sIE1JTk9SX05VTUJFUl9DT1VOVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byByZWdpc3RlciBjaGFyIGRldiwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfY2Rldl9hZGQ7Ci0JfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdkZXYpOwotCWdvdG8gZG9uZTsKLQotZXJyX2NkZXZfYWRkOgotCWRldmljZV9kZXN0cm95KHdkZXYtPmNscywgd2Rldi0+ZGV2X251bSk7Ci0KLWVycl9kZXZfY3JlYXRlOgotCWNsYXNzX2Rlc3Ryb3kod2Rldi0+Y2xzKTsKLQotZXJyX2NsYXNzOgotCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigwLCBNSU5PUl9OVU1CRVJfQ09VTlQpOwotCi1lcnJfY2hyZGV2OgotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgd2Rldik7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdkc3BfZ2xpbmtfcmVtb3ZlIC0gRHJpdmVyIHJlbW92ZSB0byBoYW5kbGUgY2xlYW51cAotICogcGRldjogICAgIFBvaW50ZXIgdG8gZGV2aWNlIHRyZWUgZGF0YS4KLSAqLwotc3RhdGljIGludCB3ZHNwX2dsaW5rX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3ZHNwX2dsaW5rX2RldiAqd2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHdkZXYpIHsKLQkJY2Rldl9kZWwoJndkZXYtPmNkZXYpOwotCQlkZXZpY2VfZGVzdHJveSh3ZGV2LT5jbHMsIHdkZXYtPmRldl9udW0pOwotCQljbGFzc19kZXN0cm95KHdkZXYtPmNscyk7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigwLCBNSU5PUl9OVU1CRVJfQ09VTlQpOwotCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdkZXYpOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBJbnZhbGlkIGRldmljZSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdkc3BfZ2xpbmtfb2ZfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLWdsaW5rIn0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd2RzcF9nbGlua19vZl9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdkc3BfZ2xpbmtfZHJpdmVyID0gewotCS5wcm9iZSAgICAgICAgICA9IHdkc3BfZ2xpbmtfcHJvYmUsCi0JLnJlbW92ZSAgICAgICAgID0gd2RzcF9nbGlua19yZW1vdmUsCi0JLmRyaXZlciAgICAgICAgID0gewotCQkubmFtZSAgID0gV0RTUF9HTElOS19EUklWRVJfTkFNRSwKLQkJLm93bmVyICA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSB3ZHNwX2dsaW5rX29mX21hdGNoLAotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdkc3BfZ2xpbmtfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgV0NEX0RTUCBHTElOSyBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL0tjb25maWcgYi9kcml2ZXJzL3NvdW5kd2lyZS9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWNhNTMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc291bmR3aXJlL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jCi0jIFNPVU5EV0lSRSBkcml2ZXIgY29uZmlndXJhdGlvbgotIwotbWVudWNvbmZpZyBTT1VORFdJUkUKLQlib29sICJTb3VuZHdpcmUgc3VwcG9ydCIKLQloZWxwCi0JICBTb3VuZHdpcmUgaXMgYSB0d28gd2lyZSBpbnRlcmZhY2UgZm9yIGF1ZGlvIHRvIGNvbm5lY3QKLQkgIHNpbXBsZSBwZXJpcGhlcmFsIGNvbXBvbmVudHMgaW4gbW9iaWxlIGRldmljZXMuCi0KLWlmIFNPVU5EV0lSRQotY29uZmlnIFNPVU5EV0lSRV9XQ0RfQ1RSTAotCWRlcGVuZHMgb24gV0NEOVhYWF9DT0RFQ19DT1JFCi0JdHJpc3RhdGUgIlFUSSBXQ0QgQ09ERUMgU291bmR3aXJlIGNvbnRyb2xsZXIiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU2VsZWN0IGRyaXZlciBmb3IgUVRJJ3MgU291bmR3aXJlIE1hc3RlciBDb21wb25lbnQuCi1lbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb3VuZHdpcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3NvdW5kd2lyZS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhY2ZmMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3NvdW5kd2lyZS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3Iga2VybmVsIHNvdW5kd2lyZSBmcmFtZXdvcmsuCi0jCi1vYmotJChDT05GSUdfU09VTkRXSVJFKQkJCSs9IHNvdW5kd2lyZS5vCi1vYmotJChDT05GSUdfU09VTkRXSVJFX1dDRF9DVFJMKQkrPSBzd3Itd2NkLWN0cmwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zb3VuZHdpcmUvc291bmR3aXJlLmMgYi9kcml2ZXJzL3NvdW5kd2lyZS9zb3VuZHdpcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMTZlNWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zb3VuZHdpcmUvc291bmR3aXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3NvdW5kd2lyZS5oPgotCi1zdHJ1Y3QgYm9hcmRpbmZvIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IHN3cl9ib2FyZGluZm8JYm9hcmRfaW5mbzsKLX07Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYm9hcmRfbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKHN3cl9tYXN0ZXJfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGJvYXJkX2xvY2spOwotc3RhdGljIERFRklORV9JRFIobWFzdGVyX2lkcik7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHN3cl9sb2NrKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBzd3JfZGV2X3R5cGU7Ci0KLSNkZWZpbmUgU09VTkRXSVJFX05BTUVfU0laRQkzMgotCi1zdGF0aWMgdm9pZCBzd3JfbWFzdGVyX3B1dChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQotewotCWlmIChtYXN0ZXIpCi0JCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCBzd3JfbWFzdGVyICpzd3JfbWFzdGVyX2dldChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKQotewotCWlmICghbWFzdGVyIHx8ICFnZXRfZGV2aWNlKCZtYXN0ZXItPmRldikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtYXN0ZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIHN3cl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYgPSB0b19zd3JfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcjsKLQotCWlmICghc3dyX2RldikKLQkJcmV0dXJuOwotCW1hc3RlciA9IHN3cl9kZXYtPm1hc3RlcjsKLQlpZiAoIW1hc3RlcikKLQkJcmV0dXJuOwotCW11dGV4X2xvY2soJm1hc3Rlci0+bWxvY2spOwotCWxpc3RfZGVsX2luaXQoJnN3cl9kZXYtPmRldl9saXN0KTsKLQltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOwotCXN3cl9tYXN0ZXJfcHV0KHN3cl9kZXYtPm1hc3Rlcik7Ci0Ja2ZyZWUoc3dyX2Rldik7Ci19Ci0KLS8qKgotICogc3dyX3JlbW92ZV9kZXZpY2UgLSByZW1vdmUgYSBzb3VuZHdpcmUgZGV2aWNlCi0gKiBAc3dyX2Rldjogc291bmR3aXJlIGRldmljZSB0byByZW1vdmUKLSAqCi0gKiBSZW1vdmUgYSBzb3VuZHdpcmUgZGV2aWNlLiBHbyB0aHJvdWdoIHRoZSBzb3VuZHdpcmUKLSAqIGRldmljZSBsaXN0IHRoYXQgbWFzdGVyIGhhcyBhbmQgcmVtb3ZlIHN3cl9kZXYgZnJvbQotICogaXQuCi0gKi8KLXZvaWQgc3dyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXZfbG9vcCwgKnNhZmU7Ci0KLQkvKgotCSAqIG1hc3RlciBzdGlsbCBoYXMgcmVmZXJlbmNlIHRvIGFsbCBub2RlcyBhbmQgZGVsZXRlcwotCSAqIGF0IHBsYXRmb3JtX3VucmVnaXN0ZXIsIHNvIG5lZWQgdG8gaW5pdCB0aGUgZGVsZXRlZAotCSAqIGVudHJ5Ci0JICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN3cl9kZXZfbG9vcCwgc2FmZSwKLQkJCQkgJnN3cl9kZXYtPm1hc3Rlci0+ZGV2aWNlcywKLQkJCQkgZGV2X2xpc3QpIHsKLQkJaWYgKHN3cl9kZXYgPT0gc3dyX2Rldl9sb29wKQotCQkJbGlzdF9kZWxfaW5pdCgmc3dyX2Rldl9sb29wLT5kZXZfbGlzdCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzd3JfcmVtb3ZlX2RldmljZSk7Ci0KLS8qKgotICogc3dyX25ld19kZXZpY2UgLSBpbnN0YW50aWF0ZSBhIG5ldyBzb3VuZHdpcmUgZGV2aWNlCi0gKiBAbWFzdGVyOiBDb250cm9sbGVyIHRvIHdoaWNoIGRldmljZSBpcyBjb25uZWN0ZWQKLSAqIEBpbmZvOiBEZXNjcmliZXMgdGhlIHNvdW5kd2lyZSBkZXZpY2UKLSAqIENvbnRleHQ6IGNhbiBzbGVlcAotICoKLSAqIENyZWF0ZSBhIHNvdW5kd2lyZSBkZXZpY2UuIEJpbmRpbmcgaXMgaGFuZGxlZCB0aHJvdWdoIGRyaXZlciBtb2RlbAotICogcHJvYmUvcmVtb3ZlIG1ldGhvZHMuIEEgZHJpdmVyIG1heSBiZSBib3VuZCB0byB0aGlzIGRldmljZSB3aGVuCi0gKiB0aGUgZnVuY3Rpb24gZ2V0cyByZXR1cm5lZC4KLSAqCi0gKiBSZXR1cm5zIGEgc291bmR3aXJlIG5ldyBkZXZpY2Ugb3IgTlVMTAotICovCi1zdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX25ld19kZXZpY2Uoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKLQkJCQkgc3RydWN0IHN3cl9ib2FyZGluZm8gY29uc3QgKmluZm8pCi17Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyOwotCi0JaWYgKCFtYXN0ZXIgfHwgIXN3cl9tYXN0ZXJfZ2V0KG1hc3RlcikpIHsKLQkJcHJfZXJyKCIlczogbWFzdGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc3dyID0ga3phbGxvYyhzaXplb2YoKnN3ciksIEdGUF9LRVJORUwpOwotCWlmICghc3dyKSB7Ci0JCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN3ci0+bWFzdGVyID0gbWFzdGVyOwotCXN3ci0+YWRkciA9IGluZm8tPmFkZHI7Ci0Jc3RybGNweShzd3ItPm5hbWUsIGluZm8tPm5hbWUsIHNpemVvZihzd3ItPm5hbWUpKTsKLQlzd3ItPmRldi50eXBlID0gJnN3cl9kZXZfdHlwZTsKLQlzd3ItPmRldi5wYXJlbnQgPSAmbWFzdGVyLT5kZXY7Ci0Jc3dyLT5kZXYuYnVzID0gJnNvdW5kd2lyZV90eXBlOwotCXN3ci0+ZGV2LnJlbGVhc2UgPSBzd3JfZGV2X3JlbGVhc2U7Ci0Jc3dyLT5kZXYub2Zfbm9kZSA9IGluZm8tPm9mX25vZGU7Ci0JbXV0ZXhfbG9jaygmbWFzdGVyLT5tbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmc3dyLT5kZXZfbGlzdCwgJm1hc3Rlci0+ZGV2aWNlcyk7Ci0JbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQotCWRldl9zZXRfbmFtZSgmc3dyLT5kZXYsICIlcy4lbHgiLCBzd3ItPm5hbWUsIHN3ci0+YWRkcik7Ci0JcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZzd3ItPmRldik7Ci0JaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgImRldmljZSBbJXNdIHJlZ2lzdGVyIGZhaWxlZCBlcnIgJWRcbiIsCi0JCQlzd3ItPm5hbWUsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JZGV2X2RiZygmbWFzdGVyLT5kZXYsICJEZXZpY2UgWyVzXSByZWdpc3RlcmVkIHdpdGggYnVzIGlkICVzXG4iLAotCQlzd3ItPm5hbWUsIGRldl9uYW1lKCZzd3ItPmRldikpOwotCXJldHVybiBzd3I7Ci0KLWVycl9vdXQ6Ci0JZGV2X2RiZygmbWFzdGVyLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgc3dyIGRldmljZSAlcyBhdCAweCVseCAlZFxuIiwKLQkJc3dyLT5uYW1lLCBzd3ItPmFkZHIsIHJlc3VsdCk7Ci0Jc3dyX21hc3Rlcl9wdXQobWFzdGVyKTsKLQlrZnJlZShzd3IpOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChzd3JfbmV3X2RldmljZSk7Ci0KLS8qKgotICogb2ZfcmVnaXN0ZXJfc3dyX2RldmljZXMgLSByZWdpc3RlciBjaGlsZCBkZXZpY2VzIG9uIHRvIHRoZSBzb3VuZHdpcmUgYnVzCi0gKiBAbWFzdGVyOiBwb2ludGVyIHRvIHNvdW5kd2lyZSBtYXN0ZXIgZGV2aWNlCi0gKgotICogUmVnaXN0ZXJzIGEgc291bmR3aXJlIGRldmljZSBmb3IgZWFjaCBjaGlsZCBub2RlIG9mIG1hc3RlciBub2RlIHdoaWNoIGhhcwotICogYSAic3dyLWRldmlkIiBwcm9wZXJ0eQotICoKLSAqLwotaW50IG9mX3JlZ2lzdGVyX3N3cl9kZXZpY2VzKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0KLQlpZiAoIW1hc3Rlci0+ZGV2Lm9mX25vZGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobWFzdGVyLT5kZXYub2Zfbm9kZSwgbm9kZSkgewotCQlzdHJ1Y3Qgc3dyX2JvYXJkaW5mbyBpbmZvID0ge307Ci0JCXU2NCBhZGRyOwotCi0JCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAib2Zfc3dyOnJlZ2lzdGVyICVzXG4iLCBub2RlLT5mdWxsX25hbWUpOwotCi0JCWlmIChvZl9tb2RhbGlhc19ub2RlKG5vZGUsIGluZm8ubmFtZSwgc2l6ZW9mKGluZm8ubmFtZSkpIDwgMCkgewotCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJvZl9zd3I6bW9kYWxpYXMgZmFpbHVyZSAlc1xuIiwKLQkJCQlub2RlLT5mdWxsX25hbWUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTY0KG5vZGUsICJyZWciLCAmYWRkcikpIHsKLQkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAib2Zfc3dyOmludmFsaWQgcmVnICVzXG4iLAotCQkJCW5vZGUtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpbmZvLmFkZHIgPSBhZGRyOwotCQlpbmZvLm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKLQkJbWFzdGVyLT5udW1fZGV2Kys7Ci0JCXN3ciA9IHN3cl9uZXdfZGV2aWNlKG1hc3RlciwgJmluZm8pOwotCQlpZiAoIXN3cikgewotCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICJvZl9zd3I6IFJlZ2lzdGVyIGZhaWxlZCAlc1xuIiwKLQkJCQlub2RlLT5mdWxsX25hbWUpOwotCQkJb2Zfbm9kZV9wdXQobm9kZSk7Ci0JCQltYXN0ZXItPm51bV9kZXYtLTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChvZl9yZWdpc3Rlcl9zd3JfZGV2aWNlcyk7Ci0KLS8qKgotICogc3dyX3BvcnRfcmVzcG9uc2UgLSByZXNwb25zZSBmcm9tIG1hc3RlciB0byBmcmVlIHRoZSBjb21wbGV0ZWQgdHJhbnNhY3Rpb24KLSAqIEBtc3RyOiBwb2ludGVyIHRvIHNvdW5kd2lyZSBtYXN0ZXIgZGV2aWNlCi0gKiBAdGlkOiB0cmFuc2FjdGlvbiBpZCB0aGF0IGluZGljYXRlcyB0cmFuc2FjdGlvbiB0byBiZSBmcmVlZC4KLSAqCi0gKiBNYXN0ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBmcmVlIHRoZSBjb21wZWxldGVkIHRyYW5zYWN0aW9uIG1lbW9yeQotICovCi12b2lkIHN3cl9wb3J0X3Jlc3BvbnNlKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyLCB1OCB0aWQpCi17Ci0Jc3RydWN0IHN3cl9wYXJhbXMgKnR4bjsKLQotCXR4biA9IG1zdHItPnBvcnRfdHhuW3RpZF07Ci0KLQlpZiAodHhuID09IE5VTEwpIHsKLQkJZGV2X2VycigmbXN0ci0+ZGV2LCAiJXM6IHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgTlVMTFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQltc3RyLT5wb3J0X3R4blt0aWRdID0gTlVMTDsKLQlrZnJlZSh0eG4pOwotfQotRVhQT1JUX1NZTUJPTChzd3JfcG9ydF9yZXNwb25zZSk7Ci0KLS8qKgotICogc3dyX3JlbW92ZV9mcm9tX2dyb3VwIC0gcmVtb3ZlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2VzIGZyb20gZ3JvdXAKLSAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIGRldl9udW06IGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUgYW5kIDAgZm9yIHN1Y2Nlc3MKLSAqLwotaW50IHN3cl9yZW1vdmVfZnJvbV9ncm91cChzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtKQotewotCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXI7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltYXN0ZXIgPSBkZXYtPm1hc3RlcjsKLQlpZiAoIW1hc3RlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWRldi0+Z3JvdXBfaWQpCi0JCXJldHVybiAwOwotCi0JaWYgKG1hc3Rlci0+Z3Jfc2lkID09IGRldl9udW0pCi0JCXJldHVybiAwOwotCi0JaWYgKG1hc3Rlci0+cmVtb3ZlX2Zyb21fZ3JvdXAgJiYgbWFzdGVyLT5yZW1vdmVfZnJvbV9ncm91cChtYXN0ZXIpKQotCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBmYWxsaW5nIGJhY2sgdG8gR1JPVVBfTk9ORVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzd3JfcmVtb3ZlX2Zyb21fZ3JvdXApOwotCi0vKioKLSAqIHN3cl9zbHZkZXZfZGF0YXBhdGhfY29udHJvbCAtIEVuYWJsZXMvRGlzYWJsZXMgc291bmR3aXJlIHNsYXZlIGRldmljZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBwYXRoCi0gKiBAZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBkZXZfbnVtOiBkZXZpY2UgbnVtYmVyIG9mIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKgotICogUmV0dXJucyBlcnJvciBjb2RlIGZvciBmYWlsdXJlIGFuZCAwIGZvciBzdWNjZXNzCi0gKi8KLWludCBzd3Jfc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2woc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwKLQkJCQlib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyOwotCi0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbWFzdGVyID0gZGV2LT5tYXN0ZXI7Ci0JaWYgKCFtYXN0ZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRldi0+Z3JvdXBfaWQpIHsKLQkJLyogQnJvYWRjYXN0ICovCi0JCWlmIChtYXN0ZXItPmdyX3NpZCAhPSBkZXZfbnVtKSB7Ci0JCQlpZiAoIW1hc3Rlci0+Z3Jfc2lkKQotCQkJCW1hc3Rlci0+Z3Jfc2lkID0gZGV2X251bTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCWlmIChtYXN0ZXItPnNsdmRldl9kYXRhcGF0aF9jb250cm9sKQotCQltYXN0ZXItPnNsdmRldl9kYXRhcGF0aF9jb250cm9sKG1hc3RlciwgZW5hYmxlKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChzd3Jfc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wpOwotCi0vKioKLSAqIHN3cl9jb25uZWN0X3BvcnQgLSBlbmFibGUgc291bmR3aXJlIHNsYXZlIHBvcnQocykKLSAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQHBvcnRfaWQ6IGxvZ2ljYWwgcG9ydCBpZChzKSBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAbnVtX3BvcnQ6IG51bWJlciBvZiBzbGF2ZSBkZXZpY2UgcG9ydHMgbmVlZCB0byBiZSBlbmFibGVkCi0gKiBAY2hfbWFzazogY2hhbm5lbHMgZm9yIGVhY2ggcG9ydCB0aGF0IG5lZWRzIHRvIGJlIGVuYWJsZWQKLSAqIEBjaF9yYXRlOiByYXRlIGF0IHdoaWNoIGVhY2ggcG9ydC9jaGFubmVscyBvcGVyYXRlCi0gKiBAbnVtX2NoOiBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIGVhY2ggcG9ydAotICoKLSAqIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UgY2FsbCBzd3JfY29ubmVjdF9wb3J0IEFQSSB0byBlbmFibGUgYWxsL3NvbWUgb2YKLSAqIGl0cyBwb3J0cyBhbmQgY29ycmVzcG9uZGluZyBjaGFubmVscyBhbmQgY2hhbm5lbCByYXRlLiBUaGlzIEFQSSB3aWxsCi0gKiBjYWxsIG1hc3RlciBjb25uZWN0X3BvcnQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGZyYW1lIHN0cnVjdHVyZQotICogYW5kIGVuYWJsZSBtYXN0ZXIgYW5kIHNsYXZlIHBvcnRzCi0gKi8KLWludCBzd3JfY29ubmVjdF9wb3J0KHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4ICpwb3J0X2lkLCB1OCBudW1fcG9ydCwKLQkJCXU4ICpjaF9tYXNrLCB1MzIgKmNoX3JhdGUsIHU4ICpudW1fY2gpCi17Ci0JdTggaSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHN3cl9wYXJhbXMgKnR4biA9IE5VTEw7Ci0Jc3RydWN0IHN3cl9wYXJhbXMgKip0ZW1wX3R4biA9IE5VTEw7Ci0Jc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciA9IGRldi0+bWFzdGVyOwotCi0JaWYgKCFtYXN0ZXIpIHsKLQkJcHJfZXJyKCIlczogTWFzdGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChudW1fcG9ydCA+IFNXUl9NQVhfREVWX1BPUlRfTlVNKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IG51bV9wb3J0ICVkIGV4Y2VlZHMgbWF4IHBvcnQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgbnVtX3BvcnQsIFNXUl9NQVhfREVWX1BPUlRfTlVNKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGUgInR4biIgdG8gYWNjb21tb2RhdGUgcG9ydHMgZW5hYmxlbWVudCBvZgotCSAqIGRpZmZlcmVudCBzbGF2ZSBkZXZpY2VzIGNhbGxpbmcgc3dyX2Nvbm5lY3RfcG9ydCBhdCB0aGUKLQkgKiBzYW1lIHRpbWUuIE9uY2UgbWFzdGVyIHByb2Nlc3MgdGhlIHR4biBkYXRhLCBpdCBjYWxscwotCSAqIHN3cl9wb3J0X3Jlc3BvbnNlKCkgdG8gZnJlZSB0aGUgdHJhbnNhY3Rpb24uIE1heGltdW0KLQkgKiBvZiAyNTYgdHJhbnNhY3Rpb25zIGNhbiBiZSBhbGxvY2F0ZWQuCi0JICovCi0JdHhuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN3cl9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4bikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltdXRleF9sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5sYXN0X3RpZDsgaSsrKSB7Ci0JCWlmIChtYXN0ZXItPnBvcnRfdHhuW2ldID09IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPj0gbWFzdGVyLT5sYXN0X3RpZCkgewotCQlpZiAobWFzdGVyLT5sYXN0X3RpZCA9PSAyNTUpIHsKLQkJCW11dGV4X3VubG9jaygmbWFzdGVyLT5tbG9jayk7Ci0JCQlrZnJlZSh0eG4pOwotCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlcyBNYXggdGlkIHJlYWNoZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJdGVtcF90eG4gPSBrcmVhbGxvYyhtYXN0ZXItPnBvcnRfdHhuLAotCQkJCShpICsgMSkgKiBzaXplb2Yoc3RydWN0IHN3cl9wYXJhbXMgKiksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghdGVtcF90eG4pIHsKLQkJCW11dGV4X3VubG9jaygmbWFzdGVyLT5tbG9jayk7Ci0JCQlrZnJlZSh0eG4pOwotCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlcyBOb3QgYWJsZSB0byBhbGxvY2F0ZVxuIgotCQkJCSJtYXN0ZXIgcG9ydCB0cmFuc2FjdGlvbiBtZW1vcnlcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJbWFzdGVyLT5wb3J0X3R4biA9IHRlbXBfdHhuOwotCQltYXN0ZXItPmxhc3RfdGlkKys7Ci0JfQotCW1hc3Rlci0+cG9ydF90eG5baV0gPSB0eG47Ci0JbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQl0eG4tPnRpZCA9IGk7Ci0KLQl0eG4tPmRldl9pZCA9IGRldi0+ZGV2X251bTsKLQl0eG4tPm51bV9wb3J0ID0gbnVtX3BvcnQ7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9wb3J0OyBpKyspIHsKLQkJdHhuLT5wb3J0X2lkW2ldID0gcG9ydF9pZFtpXTsKLQkJdHhuLT5udW1fY2hbaV0gID0gbnVtX2NoW2ldOwotCQl0eG4tPmNoX3JhdGVbaV0gPSBjaF9yYXRlW2ldOwotCQl0eG4tPmNoX2VuW2ldICAgPSBjaF9tYXNrW2ldOwotCX0KLQlyZXQgPSBtYXN0ZXItPmNvbm5lY3RfcG9ydChtYXN0ZXIsIHR4bik7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX2Nvbm5lY3RfcG9ydCk7Ci0KLS8qKgotICogc3dyX2Rpc2Nvbm5lY3RfcG9ydCAtIGRpc2FibGUgc291bmR3aXJlIHNsYXZlIHBvcnQocykKLSAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQHBvcnRfaWQ6IGxvZ2ljYWwgcG9ydCBpZChzKSBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAbnVtX3BvcnQ6IG51bWJlciBvZiBzbGF2ZSBkZXZpY2UgcG9ydHMgbmVlZCB0byBiZSBkaXNhYmxlZAotICoKLSAqIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UgY2FsbCBzd3JfZGlzY29ubmVjdF9wb3J0IEFQSSB0byBkaXNhYmxlIGFsbC9zb21lIG9mCi0gKiBpdHMgcG9ydHMuIFRoaXMgQVBJIHdpbGwgY2FsbCBtYXN0ZXIgZGlzY29ubmVjdF9wb3J0IGNhbGxiYWNrIGZ1bmN0aW9uIHRvCi0gKiBkaXNhYmxlIG1hc3RlciBhbmQgc2xhdmUgcG9ydCBhbmQgKHJlKWNvbmZpZ3VyZSBmcmFtZSBzdHJ1Y3R1cmUKLSAqLwotaW50IHN3cl9kaXNjb25uZWN0X3BvcnQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggKnBvcnRfaWQsIHU4IG51bV9wb3J0KQotewotCXU4IGkgPSAwOwotCWludCByZXQ7Ci0Jc3RydWN0IHN3cl9wYXJhbXMgKnR4biA9IE5VTEw7Ci0Jc3RydWN0IHN3cl9wYXJhbXMgKip0ZW1wX3R4biA9IE5VTEw7Ci0Jc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciA9IGRldi0+bWFzdGVyOwotCi0JaWYgKCFtYXN0ZXIpIHsKLQkJcHJfZXJyKCIlczogTWFzdGVyIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG51bV9wb3J0ID4gU1dSX01BWF9ERVZfUE9SVF9OVU0pIHsKLQkJZGV2X2VycigmbWFzdGVyLT5kZXYsICIlczogbnVtX3BvcnQgJWQgZXhjZWVkcyBtYXggcG9ydCAlZFxuIiwKLQkJCV9fZnVuY19fLCBudW1fcG9ydCwgU1dSX01BWF9ERVZfUE9SVF9OVU0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl0eG4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3dyX3BhcmFtcyksIEdGUF9LRVJORUwpOwotCWlmICghdHhuKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2xvY2soJm1hc3Rlci0+bWxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPmxhc3RfdGlkOyBpKyspIHsKLQkJaWYgKG1hc3Rlci0+cG9ydF90eG5baV0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA+PSBtYXN0ZXItPmxhc3RfdGlkKSB7Ci0JCWlmIChtYXN0ZXItPmxhc3RfdGlkID09IDI1NSkgewotCQkJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQkJCWtmcmVlKHR4bik7Ci0JCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzIE1heCB0aWQgcmVhY2hlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQl0ZW1wX3R4biA9IGtyZWFsbG9jKG1hc3Rlci0+cG9ydF90eG4sCi0JCQkJKGkgKyAxKSAqIHNpemVvZihzdHJ1Y3Qgc3dyX3BhcmFtcyAqKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCF0ZW1wX3R4bikgewotCQkJbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQkJCWtmcmVlKHR4bik7Ci0JCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzIE5vdCBhYmxlIHRvIGFsbG9jYXRlXG4iCi0JCQkJIm1hc3RlciBwb3J0IHRyYW5zYWN0aW9uIG1lbW9yeVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltYXN0ZXItPnBvcnRfdHhuID0gdGVtcF90eG47Ci0JCW1hc3Rlci0+bGFzdF90aWQrKzsKLQl9Ci0JbWFzdGVyLT5wb3J0X3R4bltpXSA9IHR4bjsKLQltdXRleF91bmxvY2soJm1hc3Rlci0+bWxvY2spOwotCXR4bi0+dGlkID0gaTsKLQotCXR4bi0+ZGV2X2lkID0gZGV2LT5kZXZfbnVtOwotCXR4bi0+bnVtX3BvcnQgPSBudW1fcG9ydDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvcnQ7IGkrKykKLQkJdHhuLT5wb3J0X2lkW2ldID0gcG9ydF9pZFtpXTsKLQlyZXQgPSBtYXN0ZXItPmRpc2Nvbm5lY3RfcG9ydChtYXN0ZXIsIHR4bik7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX2Rpc2Nvbm5lY3RfcG9ydCk7Ci0KLS8qKgotICogc3dyX2dldF9sb2dpY2FsX2Rldl9udW0gLSBHZXQgc291bmR3aXJlIHNsYXZlIGxvZ2ljYWwgZGV2aWNlIG51bWJlcgotICogQGRldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAZGV2X2lkOiBwaHlzaWNhbCBkZXZpY2UgaWQgb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQGRldl9udW06IHBvaW50ZXIgdG8gbG9naWNhbCBkZXZpY2UgbnVtIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIGdldCB0aGUgbG9naWNhbCBkZXZpY2UgbnVtYmVyIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqLwotaW50IHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU2NCBkZXZfaWQsCi0JCQl1OCAqZGV2X251bSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyID0gZGV2LT5tYXN0ZXI7Ci0KLQlpZiAoIW1hc3RlcikgewotCQlwcl9lcnIoIiVzOiBNYXN0ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfbG9jaygmbWFzdGVyLT5tbG9jayk7Ci0JcmV0ID0gbWFzdGVyLT5nZXRfbG9naWNhbF9kZXZfbnVtKG1hc3RlciwgZGV2X2lkLCBkZXZfbnVtKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHRvIGdldCBsb2dpY2FsIGFkZHIgZm9yIGRldmljZSAlbGx4XG4iLAotCQkJX19mdW5jX18sIHJldCwgZGV2X2lkKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtYXN0ZXItPm1sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChzd3JfZ2V0X2xvZ2ljYWxfZGV2X251bSk7Ci0KLS8qKgotICogc3dyX3JlYWQgLSByZWFkIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzCi0gKiBAZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBkZXZfbnVtOiBsb2dpY2FsIGRldmljZSBudW0gb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQHJlZ19hZGRyOiBiYXNlIHJlZ2lzdGVyIGFkZHJlc3MgdGhhdCBuZWVkcyB0byBiZSByZWFkCi0gKiBAYnVmOiBwb2ludGVyIHRvIHN0b3JlIHRoZSB2YWx1ZXMgb2YgcmVnaXN0ZXJzIGZyb20gYmFzZSBhZGRyZXNzCi0gKiBAbGVuOiBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotICoKLSAqIFRoaXMgQVBJIHdpbGwgcmVhZCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGFkZHJlc3MgZnJvbQotICogc291bmR3aXJlIHNsYXZlIGRldmljZQotICovCi1pbnQgc3dyX3JlYWQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAotCSAgICAgdm9pZCAqYnVmLCB1MzIgbGVuKQotewotCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIgPSBkZXYtPm1hc3RlcjsKLQotCWlmICghbWFzdGVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gbWFzdGVyLT5yZWFkKG1hc3RlciwgZGV2X251bSwgcmVnX2FkZHIsIGJ1ZiwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX3JlYWQpOwotCi0vKioKLSAqIHN3cl9idWxrX3dyaXRlIC0gd3JpdGUgc291bmR3aXJlIHNsYXZlIGRldmljZSByZWdpc3RlcnMKLSAqIEBkZXY6IHBvaW50ZXIgdG8gc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQGRldl9udW06IGxvZ2ljYWwgZGV2aWNlIG51bSBvZiBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAcmVnX2FkZHI6IHJlZ2lzdGVyIGFkZHJlc3Mgb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQGJ1ZjogY29udGFpbnMgdmFsdWUgb2YgcmVnaXN0ZXIgYWRkcmVzcwotICogQGxlbjogaW5kaWNhdGVzIG51bWJlciBvZiByZWdpc3RlcnMKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIHdyaXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB0bwotICogc291bmR3aXJlIHNsYXZlIGRldmljZQotICovCi1pbnQgc3dyX2J1bGtfd3JpdGUoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSwgdm9pZCAqcmVnLAotCQkgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcjsKLQotCWlmICghZGV2IHx8ICFkZXYtPm1hc3RlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltYXN0ZXIgPSBkZXYtPm1hc3RlcjsKLQlpZiAoZGV2LT5ncm91cF9pZCkgewotCQlpZiAobWFzdGVyLT5ncl9zaWQgIT0gZGV2X251bSkgewotCQkJaWYgKCFtYXN0ZXItPmdyX3NpZCkKLQkJCQltYXN0ZXItPmdyX3NpZCA9IGRldl9udW07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZGV2X251bSA9IGRldi0+Z3JvdXBfaWQ7Ci0JfQotCWlmIChtYXN0ZXItPmJ1bGtfd3JpdGUpCi0JCXJldHVybiBtYXN0ZXItPmJ1bGtfd3JpdGUobWFzdGVyLCBkZXZfbnVtLCByZWcsIGJ1ZiwgbGVuKTsKLQotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX2J1bGtfd3JpdGUpOwotCi0vKioKLSAqIHN3cl93cml0ZSAtIHdyaXRlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UgcmVnaXN0ZXJzCi0gKiBAZGV2OiBwb2ludGVyIHRvIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBkZXZfbnVtOiBsb2dpY2FsIGRldmljZSBudW0gb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQHJlZ19hZGRyOiByZWdpc3RlciBhZGRyZXNzIG9mIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBidWY6IGNvbnRhaW5zIHZhbHVlIG9mIHJlZ2lzdGVyIGFkZHJlc3MKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIHdyaXRlIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB0bwotICogc291bmR3aXJlIHNsYXZlIGRldmljZQotICovCi1pbnQgc3dyX3dyaXRlKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4IGRldl9udW0sIHUxNiByZWdfYWRkciwKLQkgICAgICBjb25zdCB2b2lkICpidWYpCi17Ci0Jc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciA9IGRldi0+bWFzdGVyOwotCi0JaWYgKCFtYXN0ZXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRldi0+Z3JvdXBfaWQpIHsKLQkJaWYgKG1hc3Rlci0+Z3Jfc2lkICE9IGRldl9udW0pIHsKLQkJCWlmICghbWFzdGVyLT5ncl9zaWQpCi0JCQkJbWFzdGVyLT5ncl9zaWQgPSBkZXZfbnVtOwotCQkJZWxzZQotCQkJCXJldHVybiAwOwotCQl9Ci0JCWRldl9udW0gPSBkZXYtPmdyb3VwX2lkOwotCX0KLQlyZXR1cm4gbWFzdGVyLT53cml0ZShtYXN0ZXIsIGRldl9udW0sIHJlZ19hZGRyLCBidWYpOwotfQotRVhQT1JUX1NZTUJPTChzd3Jfd3JpdGUpOwotCi0vKioKLSAqIHN3cl9kZXZpY2VfdXAgLSBGdW5jdGlvbiB0byBicmluZ3VwIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAc3dyX2RldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCBieSBzb3VuZHdpcmUgbWFzdGVyIHRvIGJyaW5ndXAgdGhlIHNsYXZlCi0gKiBkZXZpY2UuCi0gKi8KLWludCBzd3JfZGV2aWNlX3VwKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljb25zdCBzdHJ1Y3Qgc3dyX2RyaXZlciAqc2RydjsKLQotCWlmICghc3dyX2RldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYgPSAmc3dyX2Rldi0+ZGV2OwotCXNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoIXNkcnYpCi0JCXJldHVybiAwOwotCi0JaWYgKHNkcnYtPmRldmljZV91cCkKLQkJcmV0dXJuIHNkcnYtPmRldmljZV91cCh0b19zd3JfZGV2aWNlKGRldikpOwotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1FWFBPUlRfU1lNQk9MKHN3cl9kZXZpY2VfdXApOwotCi0vKioKLSAqIHN3cl9kZXZpY2VfZG93biAtIEZ1bmN0aW9uIHRvIGNhbGwgc291bmR3aXJlIHNsYXZlIGRldmljZSBkb3duCi0gKiBAc3dyX2RldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCBieSBzb3VuZHdpcmUgbWFzdGVyIHRvIHB1dCBzbGF2ZSBkZXZpY2UgaW4KLSAqIHNodXRkb3duIHN0YXRlLgotICovCi1pbnQgc3dyX2RldmljZV9kb3duKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljb25zdCBzdHJ1Y3Qgc3dyX2RyaXZlciAqc2RydjsKLQotCWlmICghc3dyX2RldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYgPSAmc3dyX2Rldi0+ZGV2OwotCXNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoIXNkcnYpCi0JCXJldHVybiAwOwotCi0JaWYgKHNkcnYtPmRldmljZV9kb3duKQotCQlyZXR1cm4gc2Rydi0+ZGV2aWNlX2Rvd24odG9fc3dyX2RldmljZShkZXYpKTsKLQotCXJldHVybiAtRU5PREVWOwotfQotRVhQT1JUX1NZTUJPTChzd3JfZGV2aWNlX2Rvd24pOwotCi0vKioKLSAqIHN3cl9yZXNldF9kZXZpY2UgLSByZXNldCBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAc3dyX2RldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIGJlIGNhbGxlZCBieSBzb3VuZHdpcmUgbWFzdGVyIHRvIHJlc2V0IHRoZSBzbGF2ZQotICogZGV2aWNlIHdoZW4gdGhlIHNsYXZlIGRldmljZSBpcyBub3QgcmVzcG9uZGluZyBvciBpbiB1bmRlZmluZWQKLSAqIHN0YXRlCi0gKi8KLWludCBzd3JfcmVzZXRfZGV2aWNlKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljb25zdCBzdHJ1Y3Qgc3dyX2RyaXZlciAqc2RydjsKLQotCWlmICghc3dyX2RldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYgPSAmc3dyX2Rldi0+ZGV2OwotCXNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoIXNkcnYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHNkcnYtPnJlc2V0X2RldmljZSkKLQkJcmV0dXJuIHNkcnYtPnJlc2V0X2RldmljZSh0b19zd3JfZGV2aWNlKGRldikpOwotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1FWFBPUlRfU1lNQk9MKHN3cl9yZXNldF9kZXZpY2UpOwotCi0vKioKLSAqIHN3cl9zZXRfZGV2aWNlX2dyb3VwIC0gQXNzaWduIGdyb3VwIGlkIHRvIHRoZSBzbGF2ZSBkZXZpY2VzCi0gKiBAc3dyX2RldjogcG9pbnRlciB0byBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAaWQ6IGdyb3VwIGlkIHRvIGJlIGFzc2lnbmVkIHRvIHNsYXZlIGRldmljZQotICogQ29udGV4dDogY2FuIHNsZWVwCi0gKgotICogVGhpcyBBUEkgd2lsbCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gc291bmR3aXJlIG1hc3RlciBvciBzbGF2ZQotICogZGV2aWNlIHRvIGFzc2lnbiBncm91cCBpZC4KLSAqLwotaW50IHN3cl9zZXRfZGV2aWNlX2dyb3VwKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2LCB1OCBpZCkKLXsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyOwotCi0JaWYgKCFzd3JfZGV2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3cl9kZXYtPmdyb3VwX2lkID0gaWQ7Ci0JbWFzdGVyID0gc3dyX2Rldi0+bWFzdGVyOwotCWlmICghaWQgJiYgbWFzdGVyKQotCQltYXN0ZXItPmdyX3NpZCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX3NldF9kZXZpY2VfZ3JvdXApOwotCi1zdGF0aWMgaW50IHN3cl9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBzd3JfZHJpdmVyICpzZHJ2ID0gdG9fc3dyX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoIXNkcnYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHNkcnYtPnByb2JlKQotCQlyZXR1cm4gc2Rydi0+cHJvYmUodG9fc3dyX2RldmljZShkZXYpKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBzd3JfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IHN3cl9kcml2ZXIgKnNkcnYgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQotCWlmICghc2RydikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc2Rydi0+cmVtb3ZlKQotCQlyZXR1cm4gc2Rydi0+cmVtb3ZlKHRvX3N3cl9kZXZpY2UoZGV2KSk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIHN3cl9kcnZfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBzd3JfZHJpdmVyICpzZHJ2ID0gdG9fc3dyX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoIXNkcnYpCi0JCXJldHVybjsKLQotCWlmIChzZHJ2LT5zaHV0ZG93bikKLQkJc2Rydi0+c2h1dGRvd24odG9fc3dyX2RldmljZShkZXYpKTsKLX0KLQotLyoqCi0gKiBzd3JfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgYSBzb3VuZHdpcmUgZHJpdmVyCi0gKiBAZHJ2OiB0aGUgZHJpdmVyIHRvIHJlZ2lzdGVyCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqLwotaW50IHN3cl9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHN3cl9kcml2ZXIgKmRydikKLXsKLQlkcnYtPmRyaXZlci5idXMgPSAmc291bmR3aXJlX3R5cGU7Ci0JaWYgKGRydi0+cHJvYmUpCi0JCWRydi0+ZHJpdmVyLnByb2JlID0gc3dyX2Rydl9wcm9iZTsKLQlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+ZHJpdmVyLnJlbW92ZSA9IHN3cl9kcnZfcmVtb3ZlOwotCi0JaWYgKGRydi0+c2h1dGRvd24pCi0JCWRydi0+ZHJpdmVyLnNodXRkb3duID0gc3dyX2Rydl9zaHV0ZG93bjsKLQotCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX2RyaXZlcl9yZWdpc3Rlcik7Ci0KLS8qKgotICogc3dyX2RyaXZlcl91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhIHNvdW5kd2lyZSBkcml2ZXIKLSAqIEBkcnY6IHRoZSBkcml2ZXIgdG8gdW5yZWdpc3RlcgotICovCi12b2lkIHN3cl9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJ2KQotewotCWlmIChkcnYpCi0JCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Ci19Ci1FWFBPUlRfU1lNQk9MKHN3cl9kcml2ZXJfdW5yZWdpc3Rlcik7Ci0KLXN0YXRpYyB2b2lkIHN3cl9tYXRjaF9jdHJsX3RvX2JvYXJkaW5mbyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAotCQkJCXN0cnVjdCBzd3JfYm9hcmRpbmZvICpiaSkKLXsKLQlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyOwotCi0JaWYgKG1hc3Rlci0+YnVzX251bSAhPSBiaS0+YnVzX251bSkgewotCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwKLQkJCSIlczogbWFzdGVyIyAlZCBhbmQgYmkjICVkIGRvZXMgbm90IG1hdGNoXG4iLAotCQkJX19mdW5jX18sIG1hc3Rlci0+YnVzX251bSwgYmktPmJ1c19udW0pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dyID0gc3dyX25ld19kZXZpY2UobWFzdGVyLCBiaSk7Ci0JaWYgKCFzd3IpCi0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiY2FuJ3QgY3JlYXRlIG5ldyBkZXZpY2UgZm9yICVzXG4iLAotCQkJYmktPnN3cl9zbGF2ZS0+bmFtZSk7Ci19Ci0KLS8qKgotICogc3dyX21hc3Rlcl9hZGRfYm9hcmRkZXZpY2VzIC0gQWRkIGRldmljZXMgcmVnaXN0ZXJlZCBieSBib2FyZCBpbmZvCi0gKiBAbWFzdGVyOiBtYXN0ZXIgdG8gd2hpY2ggdGhlc2UgZGV2aWNlcyBhcmUgdG8gYmUgYWRkZWQgdG8uCi0gKgotICogVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IG1hc3RlciB3aGVuIGl0IGlzIHVwIGFuZCBydW5uaW5nLiBJZiBkZXZpY2VzCi0gKiBvbiBhIG1hc3RlciB3ZXJlIHJlZ2lzdGVyZWQgYmVmb3JlIG1hc3RlciwgdGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0Ci0gKiB0aGV5IGdldCBwcm9iZWQgd2hlbiBtYXN0ZXIgaXMgdXAuCi0gKi8KLXZvaWQgc3dyX21hc3Rlcl9hZGRfYm9hcmRkZXZpY2VzKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0Jc3RydWN0IGJvYXJkaW5mbyAqYmk7Ci0KLQltdXRleF9sb2NrKCZib2FyZF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZtYXN0ZXItPmxpc3QsICZzd3JfbWFzdGVyX2xpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZib2FyZF9saXN0LCBsaXN0KQotCQlzd3JfbWF0Y2hfY3RybF90b19ib2FyZGluZm8obWFzdGVyLCAmYmktPmJvYXJkX2luZm8pOwotCW11dGV4X3VubG9jaygmYm9hcmRfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKHN3cl9tYXN0ZXJfYWRkX2JvYXJkZGV2aWNlcyk7Ci0KLXN0YXRpYyB2b2lkIHN3cl91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKQotewotCWlmIChzd3IpCi0JCWRldmljZV91bnJlZ2lzdGVyKCZzd3ItPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN3cl9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JLyoga2ZyZWUgb2YgbWFzdGVyIGRvbmUgYXQgc3dybV9yZW1vdmUgb2YgZGV2aWNlICovCi19Ci0KLSNkZWZpbmUgc3dyX21hc3Rlcl9hdHRyX2dyIE5VTEwKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgc3dyX21hc3Rlcl90eXBlID0gewotCS5ncm91cHMgICAgID0gc3dyX21hc3Rlcl9hdHRyX2dyLAotCS5yZWxlYXNlICAgID0gc3dyX21hc3Rlcl9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCBfX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpudWxsKQotewotCXN3cl91bnJlZ2lzdGVyX2RldmljZSh0b19zd3JfZGV2aWNlKGRldikpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHN3cl91bnJlZ2lzdGVyX21hc3RlciAtIHVucmVnaXN0ZXIgc291bmR3aXJlIG1hc3RlciBjb250cm9sbGVyCi0gKiBAbWFzdGVyOiB0aGUgbWFzdGVyIGJlaW5nIHVucmVnaXN0ZXJlZAotICoKLSAqIFRoaXMgQVBJIGlzIGNhbGxlZCBieSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIgdG8gdW5yZWdpc3RlcgotICogIG1hc3RlciBjb250cm9sbGVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgYnkgc3dyX3JlZ2lzdGVyX21hc3RlciBBUEkuCi0gKi8KLXZvaWQgc3dyX3VucmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0JaW50IGR1bW15OwotCXN0cnVjdCBzd3JfbWFzdGVyICptX2N0cmw7Ci0KLQltdXRleF9sb2NrKCZzd3JfbG9jayk7Ci0JbV9jdHJsID0gaWRyX2ZpbmQoJm1hc3Rlcl9pZHIsIG1hc3Rlci0+YnVzX251bSk7Ci0JbXV0ZXhfdW5sb2NrKCZzd3JfbG9jayk7Ci0JaWYgKG1fY3RybCAhPSBtYXN0ZXIpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJmJvYXJkX2xvY2spOwotCWxpc3RfZGVsKCZtYXN0ZXItPmxpc3QpOwotCW11dGV4X3VubG9jaygmYm9hcmRfbG9jayk7Ci0KLQkvKiBmcmVlIGJ1cyBpZCAqLwotCW11dGV4X2xvY2soJnN3cl9sb2NrKTsKLQlpZHJfcmVtb3ZlKCZtYXN0ZXJfaWRyLCBtYXN0ZXItPmJ1c19udW0pOwotCW11dGV4X3VubG9jaygmc3dyX2xvY2spOwotCi0JZHVtbXkgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJm1hc3Rlci0+ZGV2LCBOVUxMLCBfX3VucmVnaXN0ZXIpOwotCWRldmljZV91bnJlZ2lzdGVyKCZtYXN0ZXItPmRldik7Ci19Ci1FWFBPUlRfU1lNQk9MKHN3cl91bnJlZ2lzdGVyX21hc3Rlcik7Ci0KLS8qKgotICogc3dyX3JlZ2lzdGVyX21hc3RlciAtIHJlZ2lzdGVyIHNvdW5kd2lyZSBtYXN0ZXIgY29udHJvbGxlcgotICogQG1hc3RlcjogbWFzdGVyIHRvIGJlIHJlZ2lzdGVyZWQKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIHJlZ2lzdGVyIG1hc3RlciB3aXRoIHRoZSBmcmFtZXdvcmsuIG1hc3Rlci0+YnVzX251bQotICogaXMgdGhlIGRlc2lyZWQgbnVtYmVyIHdpdGggd2hpY2ggc291bmR3aXJlIGZyYW1ld29yayByZWdpc3RlcnMgdGhlCi0gKiBtYXN0ZXIuCi0gKi8KLWludCBzd3JfcmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0JaW50IGlkOwotCWludCBzdGF0dXMgPSAwOwotCi0JbXV0ZXhfbG9jaygmc3dyX2xvY2spOwotCWlkID0gaWRyX2FsbG9jKCZtYXN0ZXJfaWRyLCBtYXN0ZXIsIG1hc3Rlci0+YnVzX251bSwKLQkJCW1hc3Rlci0+YnVzX251bSsxLCBHRlBfS0VSTkVMKTsKLQltdXRleF91bmxvY2soJnN3cl9sb2NrKTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gaWQ7Ci0JbWFzdGVyLT5idXNfbnVtID0gaWQ7Ci0KLQkvKiBDYW4ndCByZWdpc3RlciB1bnRpbCBkcml2ZXIgbW9kZWwgaW5pdCAqLwotCWlmIChXQVJOX09OKCFzb3VuZHdpcmVfdHlwZS5wKSkgewotCQlzdGF0dXMgPSAtRUFHQUlOOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGV2X3NldF9uYW1lKCZtYXN0ZXItPmRldiwgInN3ciV1IiwgbWFzdGVyLT5idXNfbnVtKTsKLQltYXN0ZXItPmRldi5idXMgPSAmc291bmR3aXJlX3R5cGU7Ci0JbWFzdGVyLT5kZXYudHlwZSA9ICZzd3JfbWFzdGVyX3R5cGU7Ci0JbXV0ZXhfaW5pdCgmbWFzdGVyLT5tbG9jayk7Ci0Jc3RhdHVzID0gZGV2aWNlX3JlZ2lzdGVyKCZtYXN0ZXItPmRldik7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZG9uZTsKLQotCUlOSVRfTElTVF9IRUFEKCZtYXN0ZXItPmRldmljZXMpOwotCXByX2RlYnVnKCIlczogU1dSIG1hc3RlciByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseSAlc1xuIiwKLQkJX19mdW5jX18sIGRldl9uYW1lKCZtYXN0ZXItPmRldikpOwotCXJldHVybiAwOwotCi1kb25lOgotCWlkcl9yZW1vdmUoJm1hc3Rlcl9pZHIsIG1hc3Rlci0+YnVzX251bSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0woc3dyX3JlZ2lzdGVyX21hc3Rlcik7Ci0KLSNkZWZpbmUgc3dyX2RldmljZV9hdHRyX2dyIE5VTEwKLSNkZWZpbmUgc3dyX2RldmljZV91ZXZlbnQgTlVMTAotc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBzd3JfZGV2X3R5cGUgPSB7Ci0JLmdyb3VwcyAgICA9IHN3cl9kZXZpY2VfYXR0cl9nciwKLQkudWV2ZW50ICAgID0gc3dyX2RldmljZV91ZXZlbnQsCi0JLnJlbGVhc2UgICA9IHN3cl9kZXZfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3dyX2RldmljZV9pZCAqc3dyX21hdGNoKGNvbnN0IHN0cnVjdCBzd3JfZGV2aWNlX2lkICppZCwKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldikKLXsKLQl3aGlsZSAoaWQtPm5hbWVbMF0pIHsKLQkJaWYgKHN0cmNtcChzd3JfZGV2LT5uYW1lLCBpZC0+bmFtZSkgPT0gMCkKLQkJCXJldHVybiBpZDsKLQkJaWQrKzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgc3dyX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7Ci0Jc3RydWN0IHN3cl9kcml2ZXIgKmRydiA9IHRvX3N3cl9kcml2ZXIoZHJpdmVyKTsKLQotCWlmICghZHJ2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChkZXYtPnR5cGUgPT0gJnN3cl9kZXZfdHlwZSkKLQkJc3dyX2RldiA9IHRvX3N3cl9kZXZpY2UoZGV2KTsKLQllbHNlCi0JCXJldHVybiAwOwotCWlmIChkcnYtPmlkX3RhYmxlKQotCQlyZXR1cm4gc3dyX21hdGNoKGRydi0+aWRfdGFibGUsIHN3cl9kZXYpICE9IE5VTEw7Ci0KLQlpZiAoZHJpdmVyLT5uYW1lKQotCQlyZXR1cm4gc3RyY21wKHN3cl9kZXYtPm5hbWUsIGRyaXZlci0+bmFtZSkgPT0gMDsKLQlyZXR1cm4gMDsKLX0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgc3dyX2xlZ2FjeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYgPSBOVUxMOwotCXN0cnVjdCBzd3JfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoZGV2LT50eXBlID09ICZzd3JfZGV2X3R5cGUpCi0JCXN3cl9kZXYgPSB0b19zd3JfZGV2aWNlKGRldik7Ci0KLQlpZiAoIXN3cl9kZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCWRyaXZlciA9IHRvX3N3cl9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCWlmICghZHJpdmVyLT5zdXNwZW5kKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBkcml2ZXItPnN1c3BlbmQoc3dyX2RldiwgbWVzZyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3dyX2xlZ2FjeV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2ID0gTlVMTDsKLQlzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKGRldi0+dHlwZSA9PSAmc3dyX2Rldl90eXBlKQotCQlzd3JfZGV2ID0gdG9fc3dyX2RldmljZShkZXYpOwotCi0JaWYgKCFzd3JfZGV2IHx8ICFkZXYtPmRyaXZlcikKLQkJcmV0dXJuIDA7Ci0KLQlkcml2ZXIgPSB0b19zd3JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoIWRyaXZlci0+cmVzdW1lKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBkcml2ZXItPnJlc3VtZShzd3JfZGV2KTsKLX0KLQotc3RhdGljIGludCBzd3JfcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOwotCi0JaWYgKHBtKQotCQlyZXR1cm4gcG1fZ2VuZXJpY19zdXNwZW5kKGRldik7Ci0JZWxzZQotCQlyZXR1cm4gc3dyX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKLX0KLQotc3RhdGljIGludCBzd3JfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7Ci0KLQlpZiAocG0pCi0JCXJldHVybiBwbV9nZW5lcmljX3Jlc3VtZShkZXYpOwotCWVsc2UKLQkJcmV0dXJuIHN3cl9sZWdhY3lfcmVzdW1lKGRldik7Ci19Ci0jZWxzZQotI2RlZmluZSBzd3JfcG1fc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHN3cl9wbV9yZXN1bWUJTlVMTAotI2VuZGlmIC8qQ09ORklHX1BNX1NMRUVQKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNvdW5kd2lyZV9wbSA9IHsKLQkuc3VzcGVuZCA9IHN3cl9wbV9zdXNwZW5kLAotCS5yZXN1bWUgPSBzd3JfcG1fcmVzdW1lLAotCVNFVF9SVU5USU1FX1BNX09QUygKLQkJcG1fZ2VuZXJpY19zdXNwZW5kLAotCQlwbV9nZW5lcmljX3Jlc3VtZSwKLQkJTlVMTAotCQkpCi19OwotCi1zdHJ1Y3QgZGV2aWNlIHNvdW5kd2lyZV9kZXYgPSB7Ci0JLmluaXRfbmFtZSA9ICJzb3VuZHdpcmUiLAotfTsKLQotc3RydWN0IGJ1c190eXBlIHNvdW5kd2lyZV90eXBlID0gewotCS5uYW1lCQk9ICJzb3VuZHdpcmUiLAotCS5tYXRjaAkJPSBzd3JfZGV2aWNlX21hdGNoLAotCS5wbQkJPSAmc291bmR3aXJlX3BtLAotfTsKLUVYUE9SVF9TWU1CT0woc291bmR3aXJlX3R5cGUpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc291bmR3aXJlX2V4aXQodm9pZCkKLXsKLQlkZXZpY2VfdW5yZWdpc3Rlcigmc291bmR3aXJlX2Rldik7Ci0JYnVzX3VucmVnaXN0ZXIoJnNvdW5kd2lyZV90eXBlKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgc291bmR3aXJlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gYnVzX3JlZ2lzdGVyKCZzb3VuZHdpcmVfdHlwZSk7Ci0JaWYgKCFyZXR2YWwpCi0JCXJldHZhbCA9IGRldmljZV9yZWdpc3Rlcigmc291bmR3aXJlX2Rldik7Ci0KLQlpZiAocmV0dmFsKQotCQlidXNfdW5yZWdpc3Rlcigmc291bmR3aXJlX3R5cGUpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLXBvc3Rjb3JlX2luaXRjYWxsKHNvdW5kd2lyZV9pbml0KTsKLW1vZHVsZV9leGl0KHNvdW5kd2lyZV9leGl0KTsKLQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNvdW5kd2lyZSBtb2R1bGUiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06c291bmR3aXJlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NvdW5kd2lyZS9zd3Itd2NkLWN0cmwuYyBiL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBiNWNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kd2lyZS9zb3VuZHdpcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSAic3dybV9yZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJzd3Itd2NkLWN0cmwuaCIKLQotI2RlZmluZSBTV1JfQlJPQURDQVNUX0NNRF9JRCAgICAgICAgICAgIDB4MEYKLSNkZWZpbmUgU1dSX0FVVE9fU1VTUEVORF9ERUxBWSAgICAgICAgICAzIC8qIGRlbGF5IGluIHNlYyAqLwotI2RlZmluZSBTV1JfREVWX0lEX01BU0sJCQkweEZGRkZGRkZGCi0jZGVmaW5lIFNXUl9SRUdfVkFMX1BBQ0soZGF0YSwgZGV2LCBpZCwgcmVnKQlcCi0JCQkoKHJlZykgfCAoKGlkKSA8PCAxNikgfCAoKGRldikgPDwgMjApIHwgKChkYXRhKSA8PCAyNCkpCi0KLS8qIHBtIHJ1bnRpbWUgYXV0byBzdXNwZW5kIHRpbWVyIGluIG1zZWNzICovCi1zdGF0aWMgaW50IGF1dG9fc3VzcGVuZF90aW1lciA9IFNXUl9BVVRPX1NVU1BFTkRfREVMQVkgKiAxMDAwOwotbW9kdWxlX3BhcmFtKGF1dG9fc3VzcGVuZF90aW1lciwgaW50LCAwNjY0KTsKLU1PRFVMRV9QQVJNX0RFU0MoYXV0b19zdXNwZW5kX3RpbWVyLCAidGltZXIgZm9yIGF1dG8gc3VzcGVuZCIpOwotCi1zdGF0aWMgdTggbXN0cl9wb3J0c1tdID0gezEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3fTsKLXN0YXRpYyB1OCBtc3RyX3BvcnRfdHlwZVtdID0ge1NXUl9EQUNfUE9SVCwgU1dSX0NPTVBfUE9SVCwgU1dSX0JPT1NUX1BPUlQsCi0JCQkgICAgICBTV1JfREFDX1BPUlQsIFNXUl9DT01QX1BPUlQsIFNXUl9CT09TVF9QT1JULAotCQkJICAgICAgU1dSX1ZJU0VOU0VfUE9SVCwgU1dSX1ZJU0VOU0VfUE9SVH07Ci0KLXN0cnVjdCB1c2VjYXNlIHVjW10gPSB7Ci0JezAsIDAsIDB9LAkJLyogVUMwOiBubyBwb3J0cyAqLwotCXsxLCAxLCAyNDAwfSwJCS8qIFVDMTogU3BrciAqLwotCXsxLCA0LCA2MDB9LAkJLyogVUMyOiBDb21wYW5kZXIgKi8KLQl7MSwgMiwgMzAwfSwJCS8qIFVDMzogU21hcnQgQm9vc3QgKi8KLQl7MSwgMiwgMTIwMH0sCQkvKiBVQzQ6IFZJIFNlbnNlICovCi0JezQsIDksIDQ1MDB9LAkJLyogVUM1OiBTcGtyICsgQ29tcCArIFNCICsgVkkgKi8KLQl7OCwgMTgsIDkwMDB9LAkJLyogVUM2OiAyKihTcGtyICsgQ29tcCArIFNCICsgVkkpICovCi0JezIsIDIsIDQ4MDB9LAkJLyogVUM3OiAyKlNwa3IgKi8KLQl7MiwgNSwgMzAwMH0sCQkvKiBVQzg6IFNwa3IgKyBDb21wICovCi0JezQsIDEwLCA2MDAwfSwJCS8qIFVDOTogMiooU3BrciArIENvbXApICovCi0JezMsIDcsIDMzMDB9LAkJLyogVUMxMDogU3BrciArIENvbXAgKyBTQiAqLwotCXs2LCAxNCwgNjYwMH0sCQkvKiBVQzExOiAyKihTcGtyICsgQ29tcCArIFNCKSAqLwotCXsyLCAzLCAyNzAwfSwJCS8qIFVDMTI6IFNwa3IgKyBTQiAqLwotCXs0LCA2LCA1NDAwfSwJCS8qIFVDMTM6IDIqKFNwa3IgKyBTQikgKi8KLQl7MywgNSwgMzkwMH0sCQkvKiBVQzE0OiBTcGtyICsgU0IgKyBWSSAqLwotCXs2LCAxMCwgNzgwMH0sCQkvKiBVQzE1OiAyKihTcGtyICsgU0IgKyBWSSkgKi8KLQl7MiwgMywgMzYwMH0sCQkvKiBVQzE2OiBTcGtyICsgVkkgKi8KLQl7NCwgNiwgNzIwMH0sCQkvKiBVQzE3OiAyKihTcGtyICsgVkkpICovCi0JezMsIDcsIDQyMDB9LAkJLyogVUMxODogU3BrciArIENvbXAgKyBWSSAqLwotCXs2LCAxNCwgODQwMH0sCQkvKiBVQzE5OiAyKihTcGtyICsgQ29tcCArIFZJKSAqLwotfTsKLSNkZWZpbmUgTUFYX1VTRUNBU0UJQVJSQVlfU0laRSh1YykKLQotc3RydWN0IHBvcnRfcGFyYW1zIHBwW01BWF9VU0VDQVNFXVtTV1JfTVNUUl9QT1JUX0xFTl0gPSB7Ci0JLyogVUMgMCAqLwotCXsKLQkJezAsIDAsIDB9LAotCX0sCi0JLyogVUMgMSAqLwotCXsKLQkJezcsIDEsIDB9LAotCX0sCi0JLyogVUMgMiAqLwotCXsKLQkJezMxLCAyLCAwfSwKLQl9LAotCS8qIFVDIDMgKi8KLQl7Ci0JCXs2MywgMTIsIDMxfSwKLQl9LAotCS8qIFVDIDQgKi8KLQl7Ci0JCXsxNSwgNywgMH0sCi0JfSwKLQkvKiBVQyA1ICovCi0JewotCQl7NywgMSwgMH0sCi0JCXszMSwgMiwgMH0sCi0JCXs2MywgMTIsIDMxfSwKLQkJezE1LCA3LCAwfSwKLQl9LAotCS8qIFVDIDYgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezMxLCAyLCAwfSwKLQkJezYzLCAxMiwgMzF9LAotCQl7MTUsIDcsIDB9LAotCQl7NywgNiwgMH0sCi0JCXszMSwgMTgsIDB9LAotCQl7NjMsIDEzLCAzMX0sCi0JCXsxNSwgMTAsIDB9LAotCX0sCi0JLyogVUMgNyAqLwotCXsKLQkJezcsIDEsIDB9LAotCQl7NywgNiwgMH0sCi0KLQl9LAotCS8qIFVDIDggKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezMxLCAyLCAwfSwKLQl9LAotCS8qIFVDIDkgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezMxLCAyLCAwfSwKLQkJezcsIDYsIDB9LAotCQl7MzEsIDE4LCAwfSwKLQl9LAotCS8qIFVDIDEwICovCi0JewotCQl7NywgMSwgMH0sCi0JCXszMSwgMiwgMH0sCi0JCXs2MywgMTIsIDMxfSwKLQl9LAotCS8qIFVDIDExICovCi0JewotCQl7NywgMSwgMH0sCi0JCXszMSwgMiwgMH0sCi0JCXs2MywgMTIsIDMxfSwKLQkJezcsIDYsIDB9LAotCQl7MzEsIDE4LCAwfSwKLQkJezYzLCAxMywgMzF9LAotCX0sCi0JLyogVUMgMTIgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezYzLCAxMiwgMzF9LAotCX0sCi0JLyogVUMgMTMgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezYzLCAxMiwgMzF9LAotCQl7NywgNiwgMH0sCi0JCXs2MywgMTMsIDMxfSwKLQl9LAotCS8qIFVDIDE0ICovCi0JewotCQl7NywgMSwgMH0sCi0JCXs2MywgMTIsIDMxfSwKLQkJezE1LCA3LCAwfSwKLQl9LAotCS8qIFVDIDE1ICovCi0JewotCQl7NywgMSwgMH0sCi0JCXs2MywgMTIsIDMxfSwKLQkJezE1LCA3LCAwfSwKLQkJezcsIDYsIDB9LAotCQl7NjMsIDEzLCAzMX0sCi0JCXsxNSwgMTAsIDB9LAotCX0sCi0JLyogVUMgMTYgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezE1LCA3LCAwfSwKLQl9LAotCS8qIFVDIDE3ICovCi0JewotCQl7NywgMSwgMH0sCi0JCXsxNSwgNywgMH0sCi0JCXs3LCA2LCAwfSwKLQkJezE1LCAxMCwgMH0sCi0JfSwKLQkvKiBVQyAxOCAqLwotCXsKLQkJezcsIDEsIDB9LAotCQl7MzEsIDIsIDB9LAotCQl7MTUsIDcsIDB9LAotCX0sCi0JLyogVUMgMTkgKi8KLQl7Ci0JCXs3LCAxLCAwfSwKLQkJezMxLCAyLCAwfSwKLQkJezE1LCA3LCAwfSwKLQkJezcsIDYsIDB9LAotCQl7MzEsIDE4LCAwfSwKLQkJezE1LCAxMCwgMH0sCi0JfSwKLX07Ci0KLWVudW0gewotCVNXUl9OT1RfUFJFU0VOVCwgLyogRGV2aWNlIGlzIGRldGFjaGVkL25vdCBwcmVzZW50IG9uIHRoZSBidXMgKi8KLQlTV1JfQVRUQUNIRURfT0ssIC8qIERldmljZSBpcyBhdHRhY2hlZCAqLwotCVNXUl9BTEVSVCwgICAgICAgLyogRGV2aWNlIGFsdGVycyBtYXN0ZXIgZm9yIGFueSBpbnRlcnJ1cHRzICovCi0JU1dSX1JFU0VSVkVELCAgICAvKiBSZXNlcnZlZCAqLwotfTsKLQotI2RlZmluZSBTV1JNX01BWF9QT1JUX1JFRyAgICA0MAotI2RlZmluZSBTV1JNX01BWF9JTklUX1JFRyAgICA4Ci0KLSNkZWZpbmUgU1dSX01TVFJfTUFYX1JFR19BRERSCTB4MTc0MAotI2RlZmluZSBTV1JfTVNUUl9TVEFSVF9SRUdfQUREUgkweDAwCi0jZGVmaW5lIFNXUl9NU1RSX01BWF9CVUZfTEVOICAgICAzMgotI2RlZmluZSBCWVRFU19QRVJfTElORSAgICAgICAgICAxMgotI2RlZmluZSBTV1JfTVNUUl9SRF9CVUZfTEVOICAgICAgOAotI2RlZmluZSBTV1JfTVNUUl9XUl9CVUZfTEVOICAgICAgMzIKLQotc3RhdGljIHZvaWQgc3dybV9jb3B5X2RhdGFfcG9ydF9jb25maWcoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKLQkJCQkgICAgICAgdTggaW5hY3RpdmVfYmFuayk7Ci1zdGF0aWMgc3RydWN0IHN3cl9tc3RyX2N0cmwgKmRiZ3N3cm07Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19zd3JtX2RlbnQ7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19wZWVrOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcG9rZTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3JlZ19kdW1wOwotc3RhdGljIHVuc2lnbmVkIGludCByZWFkX2RhdGE7Ci0KLQotc3RhdGljIGJvb2wgc3dybV9pc19tc21fdmFyaWFudChpbnQgdmFsKQotewotCXJldHVybiAodmFsID09IFNXUk1fVkVSU0lPTl8xXzMpOwotfQotCi1zdGF0aWMgaW50IHN3cm1fZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9wYXJhbWV0ZXJzKGNoYXIgKmJ1ZiwgdTMyICpwYXJhbTEsIGludCBudW1fb2ZfcGFyKQotewotCWNoYXIgKnRva2VuOwotCWludCBiYXNlLCBjbnQ7Ci0KLQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOwotCWZvciAoY250ID0gMDsgY250IDwgbnVtX29mX3BhcjsgY250KyspIHsKLQkJaWYgKHRva2VuKSB7Ci0JCQlpZiAoKHRva2VuWzFdID09ICd4JykgfHwgKHRva2VuWzFdID09ICdYJykpCi0JCQkJYmFzZSA9IDE2OwotCQkJZWxzZQotCQkJCWJhc2UgPSAxMDsKLQotCQkJaWYgKGtzdHJ0b3UzMih0b2tlbiwgYmFzZSwgJnBhcmFtMVtjbnRdKSAhPSAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3dybV9yZWdfc2hvdyhjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkgIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgaSwgcmVnX3ZhbCwgbGVuOwotCXNzaXplX3QgdG90YWwgPSAwOwotCWNoYXIgdG1wX2J1ZltTV1JfTVNUUl9NQVhfQlVGX0xFTl07Ci0KLQlpZiAoIXVidWYgfHwgIXBwb3MpCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gKCgoaW50KSAqcHBvcyAvIEJZVEVTX1BFUl9MSU5FKSArIFNXUl9NU1RSX1NUQVJUX1JFR19BRERSKTsKLQkJaSA8PSBTV1JfTVNUUl9NQVhfUkVHX0FERFI7IGkgKz0gNCkgewotCQlyZWdfdmFsID0gZGJnc3dybS0+cmVhZChkYmdzd3JtLT5oYW5kbGUsIGkpOwotCQlsZW4gPSBzbnByaW50Zih0bXBfYnVmLCAyNSwgIjB4JS4zeDogMHglLjJ4XG4iLCBpLCByZWdfdmFsKTsKLQkJaWYgKCh0b3RhbCArIGxlbikgPj0gY291bnQgLSAxKQotCQkJYnJlYWs7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVidWYgKyB0b3RhbCksIHRtcF9idWYsIGxlbikpIHsKLQkJCXByX2VycigiJXM6IGZhaWwgdG8gY29weSByZWcgZHVtcFxuIiwgX19mdW5jX18pOwotCQkJdG90YWwgPSAtRUZBVUxUOwotCQkJZ290byBjb3B5X2VycjsKLQkJfQotCQkqcHBvcyArPSBsZW47Ci0JCXRvdGFsICs9IGxlbjsKLQl9Ci0KLWNvcHlfZXJyOgotCXJldHVybiB0b3RhbDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3dybV9kZWJ1Z19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIGxidWZbU1dSX01TVFJfUkRfQlVGX0xFTl07Ci0JY2hhciAqYWNjZXNzX3N0cjsKLQlzc2l6ZV90IHJldF9jbnQ7Ci0KLQlpZiAoIWNvdW50IHx8ICFmaWxlIHx8ICFwcG9zIHx8ICF1YnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFjY2Vzc19zdHIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCpwcG9zIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dybV9wZWVrIikpIHsKLQkJc25wcmludGYobGJ1Ziwgc2l6ZW9mKGxidWYpLCAiMHgleFxuIiwgcmVhZF9kYXRhKTsKLQkJcmV0X2NudCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9zLCBsYnVmLAotCQkJCQkgICAgICAgc3RybmxlbihsYnVmLCA3KSk7Ci0JfSBlbHNlIGlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzd3JtX3JlZ19kdW1wIikpIHsKLQkJcmV0X2NudCA9IHN3cm1fcmVnX3Nob3codWJ1ZiwgY291bnQsIHBwb3MpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6ICVzIG5vdCBwZXJtaXR0ZWQgdG8gcmVhZFxuIiwgX19mdW5jX18sIGFjY2Vzc19zdHIpOwotCQlyZXRfY250ID0gLUVQRVJNOwotCX0KLQlyZXR1cm4gcmV0X2NudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3dybV9kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKLQljb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgbGJ1ZltTV1JfTVNUUl9XUl9CVUZfTEVOXTsKLQlpbnQgcmM7Ci0JdTMyIHBhcmFtWzVdOwotCWNoYXIgKmFjY2Vzc19zdHI7Ci0KLQlpZiAoIWZpbHAgfHwgIXBwb3MgfHwgIXVidWYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWNjZXNzX3N0ciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpZiAoY250ID4gc2l6ZW9mKGxidWYpIC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYyA9IGNvcHlfZnJvbV91c2VyKGxidWYsIHVidWYsIGNudCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWxidWZbY250XSA9ICdcMCc7Ci0JaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInN3cm1fcG9rZSIpKSB7Ci0JCS8qIHdyaXRlICovCi0JCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDIpOwotCQlpZiAoKHBhcmFtWzBdIDw9IFNXUl9NU1RSX01BWF9SRUdfQUREUikgJiYKLQkJCShwYXJhbVsxXSA8PSAweEZGRkZGRkZGKSAmJgotCQkJKHJjID09IDApKQotCQkJcmMgPSBkYmdzd3JtLT53cml0ZShkYmdzd3JtLT5oYW5kbGUsIHBhcmFtWzBdLAotCQkJCQkgICAgcGFyYW1bMV0pOwotCQllbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIGlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzd3JtX3BlZWsiKSkgewotCQkvKiByZWFkICovCi0JCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDEpOwotCQlpZiAoKHBhcmFtWzBdIDw9IFNXUl9NU1RSX01BWF9SRUdfQUREUikgJiYgKHJjID09IDApKQotCQkJcmVhZF9kYXRhID0gZGJnc3dybS0+cmVhZChkYmdzd3JtLT5oYW5kbGUsIHBhcmFtWzBdKTsKLQkJZWxzZQotCQkJcmMgPSAtRUlOVkFMOwotCX0KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBjbnQ7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiByYyA9ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd3JtX2RlYnVnX29wcyA9IHsKLQkub3BlbiA9IHN3cm1fZGVidWdfb3BlbiwKLQkud3JpdGUgPSBzd3JtX2RlYnVnX3dyaXRlLAotCS5yZWFkID0gc3dybV9kZWJ1Z19yZWFkLAotfTsKLQotc3RhdGljIGludCBzd3JtX3NldF9jaF9tYXAoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0sIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHN3cl9tc3RyX3BvcnQgKnBpbmZvID0gKHN0cnVjdCBzd3JfbXN0cl9wb3J0ICopZGF0YTsKLQotCXN3cm0tPm1zdHJfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzd3JfbXN0cl9wb3J0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN3cm0tPm1zdHJfcG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzd3JtLT5tc3RyX3BvcnQtPm51bV9wb3J0ID0gcGluZm8tPm51bV9wb3J0OwotCXN3cm0tPm1zdHJfcG9ydC0+cG9ydCA9IGt6YWxsb2MoKHBpbmZvLT5udW1fcG9ydCAqIHNpemVvZih1OCkpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXN3cm0tPm1zdHJfcG9ydC0+cG9ydCkgewotCQlrZnJlZShzd3JtLT5tc3RyX3BvcnQpOwotCQlzd3JtLT5tc3RyX3BvcnQgPSBOVUxMOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtY3B5KHN3cm0tPm1zdHJfcG9ydC0+cG9ydCwgcGluZm8tPnBvcnQsIHBpbmZvLT5udW1fcG9ydCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIHN3cm1faXNfcG9ydF9lbihzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0cikKLXsKLQlyZXR1cm4gISEobXN0ci0+bnVtX3BvcnQpOwotfQotCi1zdGF0aWMgaW50IHN3cm1fY2xrX3JlcXVlc3Qoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0sIGJvb2wgZW5hYmxlKQotewotCWlmICghc3dybS0+Y2xrIHx8ICFzd3JtLT5oYW5kbGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGVuYWJsZSkgewotCQlzd3JtLT5jbGtfcmVmX2NvdW50Kys7Ci0JCWlmIChzd3JtLT5jbGtfcmVmX2NvdW50ID09IDEpIHsKLQkJCXN3cm0tPmNsayhzd3JtLT5oYW5kbGUsIHRydWUpOwotCQkJc3dybS0+c3RhdGUgPSBTV1JfTVNUUl9VUDsKLQkJfQotCX0gZWxzZSBpZiAoLS1zd3JtLT5jbGtfcmVmX2NvdW50ID09IDApIHsKLQkJc3dybS0+Y2xrKHN3cm0tPmhhbmRsZSwgZmFsc2UpOwotCQlzd3JtLT5zdGF0ZSA9IFNXUl9NU1RSX0RPV047Ci0JfSBlbHNlIGlmIChzd3JtLT5jbGtfcmVmX2NvdW50IDwgMCkgewotCQlwcl9lcnIoIiVzOiBzd3JtIGNsayBjb3VudCBtaXNtYXRjaFxuIiwgX19mdW5jX18pOwotCQlzd3JtLT5jbGtfcmVmX2NvdW50ID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9nZXRfcG9ydF9jb25maWcoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKLXsKLQl1MzIgY2hfcmF0ZSA9IDA7Ci0JdTMyIG51bV9jaCA9IDA7Ci0JaW50IGksIHVjX2lkeDsKLQl1MzIgcG9ydGNvdW50ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBTV1JfTVNUUl9QT1JUX0xFTjsgaSsrKSB7Ci0JCWlmIChtYXN0ZXItPnBvcnRbaV0ucG9ydF9lbikgewotCQkJY2hfcmF0ZSArPSBtYXN0ZXItPnBvcnRbaV0uY2hfcmF0ZTsKLQkJCW51bV9jaCArPSBtYXN0ZXItPnBvcnRbaV0ubnVtX2NoOwotCQkJcG9ydGNvdW50Kys7Ci0JCX0KLQl9Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodWMpOyBpKyspIHsKLQkJaWYgKCh1Y1tpXS5udW1fcG9ydCA9PSBwb3J0Y291bnQpICYmCi0JCSAgICAodWNbaV0ubnVtX2NoID09IG51bV9jaCkgJiYKLQkJICAgICh1Y1tpXS5jaHJhdGUgPT0gY2hfcmF0ZSkpIHsKLQkJCXVjX2lkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpID49IEFSUkFZX1NJWkUodWMpKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAotCQkJIiVzOiB1c2VjYXNlIHBvcnQ6JWQsIG51bV9jaDolZCwgY2hyYXRlOiVkIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fLCBtYXN0ZXItPm51bV9wb3J0LCBudW1fY2gsIGNoX3JhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IFNXUl9NU1RSX1BPUlRfTEVOOyBpKyspIHsKLQkJaWYgKG1hc3Rlci0+cG9ydFtpXS5wb3J0X2VuKSB7Ci0JCQltYXN0ZXItPnBvcnRbaV0uc2ludGVydmFsID0gcHBbdWNfaWR4XVtpXS5zaTsKLQkJCW1hc3Rlci0+cG9ydFtpXS5vZmZzZXQxID0gcHBbdWNfaWR4XVtpXS5vZmYxOwotCQkJbWFzdGVyLT5wb3J0W2ldLm9mZnNldDIgPSBwcFt1Y19pZHhdW2ldLm9mZjI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9nZXRfbWFzdGVyX3BvcnQodTggKm1zdHJfcG9ydF9pZCwgdTggc2x2X3BvcnRfaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU1dSX01TVFJfUE9SVF9MRU47IGkrKykgewotCQlpZiAobXN0cl9wb3J0c1tpXSA9PSBzbHZfcG9ydF9pZCkgewotCQkJKm1zdHJfcG9ydF9pZCA9IGk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHUzMiBzd3JtX2dldF9wYWNrZWRfcmVnX3ZhbCh1OCAqY21kX2lkLCB1OCBjbWRfZGF0YSwKLQkJCQkgdTggZGV2X2FkZHIsIHUxNiByZWdfYWRkcikKLXsKLQl1MzIgdmFsOwotCXU4IGlkID0gKmNtZF9pZDsKLQotCWlmIChpZCAhPSBTV1JfQlJPQURDQVNUX0NNRF9JRCkgewotCQlpZiAoaWQgPCAxNCkKLQkJCWlkICs9IDE7Ci0JCWVsc2UKLQkJCWlkID0gMDsKLQkJKmNtZF9pZCA9IGlkOwotCX0KLQl2YWwgPSBTV1JfUkVHX1ZBTF9QQUNLKGNtZF9kYXRhLCBkZXZfYWRkciwgaWQsIHJlZ19hZGRyKTsKLQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9jbWRfZmlmb19yZF9jbWQoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0sIGludCAqY21kX2RhdGEsCi0JCQkJIHU4IGRldl9hZGRyLCB1OCBjbWRfaWQsIHUxNiByZWdfYWRkciwKLQkJCQkgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCWludCByZXQgPSAwOwotCi0JdmFsID0gc3dybV9nZXRfcGFja2VkX3JlZ192YWwoJnN3cm0tPnJjbWRfaWQsIGxlbiwgZGV2X2FkZHIsIHJlZ19hZGRyKTsKLQlyZXQgPSBzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fQ01EX0ZJRk9fUkRfQ01ELCB2YWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IHJlZyAweCV4IHdyaXRlIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHZhbCwgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCSpjbWRfZGF0YSA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX0NNRF9GSUZPX1JEX0ZJRk9fQUREUik7Ci0JZGV2X2RiZyhzd3JtLT5kZXYsCi0JCSIlczogcmVnOiAweCV4LCBjbWRfaWQ6IDB4JXgsIGRldl9pZDogMHgleCwgY21kX2RhdGE6IDB4JXhcbiIsCi0JCV9fZnVuY19fLCByZWdfYWRkciwgY21kX2lkLCBkZXZfYWRkciwgKmNtZF9kYXRhKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN3cm1fY21kX2ZpZm9fd3JfY21kKHN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtLCB1OCBjbWRfZGF0YSwKLQkJCQkgdTggZGV2X2FkZHIsIHU4IGNtZF9pZCwgdTE2IHJlZ19hZGRyKQotewotCXUzMiB2YWw7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNtZF9pZCkKLQkJdmFsID0gc3dybV9nZXRfcGFja2VkX3JlZ192YWwoJnN3cm0tPndjbWRfaWQsIGNtZF9kYXRhLAotCQkJCQkgICAgICBkZXZfYWRkciwgcmVnX2FkZHIpOwotCWVsc2UKLQkJdmFsID0gc3dybV9nZXRfcGFja2VkX3JlZ192YWwoJmNtZF9pZCwgY21kX2RhdGEsCi0JCQkJCSAgICAgIGRldl9hZGRyLCByZWdfYWRkcik7Ci0KLQlkZXZfZGJnKHN3cm0tPmRldiwKLQkJIiVzOiByZWc6IDB4JXgsIGNtZF9pZDogMHgleCwgZGV2X2lkOiAweCV4LCBjbWRfZGF0YTogMHgleFxuIiwKLQkJX19mdW5jX18sIHJlZ19hZGRyLCBjbWRfaWQsIGRldl9hZGRyLCBjbWRfZGF0YSk7Ci0JcmV0ID0gc3dybS0+d3JpdGUoc3dybS0+aGFuZGxlLCBTV1JNX0NNRF9GSUZPX1dSX0NNRCwgdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiByZWcgMHgleCB3cml0ZSBmYWlsZWQsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCB2YWwsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoY21kX2lkID09IDB4RikgewotCQkvKgotCQkgKiBzbGVlcCBmb3IgMTBtcyBmb3IgTVNNIHNvdW5kd2lyZSB2YXJpYW50IHRvIGFsbG93IGJyb2FkY2FzdAotCQkgKiBjb21tYW5kIHRvIGNvbXBsZXRlLgotCQkgKi8KLQkJaWYgKHN3cm1faXNfbXNtX3ZhcmlhbnQoc3dybS0+dmVyc2lvbikpCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMTAwKTsKLQkJZWxzZQotCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzd3JtLT5icm9hZGNhc3QsCi0JCQkJCQkgICAgKDIgKiBIWi8xMCkpOwotCX0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN3cm1fcmVhZChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCi0JCSAgICAgdm9pZCAqYnVmLCB1MzIgbGVuKQotewotCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gc3dyX2dldF9jdHJsX2RhdGEobWFzdGVyKTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdmFsOwotCXU4ICpyZWdfdmFsID0gKHU4ICopYnVmOwotCi0JaWYgKCFzd3JtKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IHN3cm0gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZGV2X251bSkKLQkJcmV0ID0gc3dybV9jbWRfZmlmb19yZF9jbWQoc3dybSwgJnZhbCwgZGV2X251bSwgMCwgcmVnX2FkZHIsCi0JCQkJCSAgIGxlbik7Ci0JZWxzZQotCQl2YWwgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgcmVnX2FkZHIpOwotCi0JaWYgKCFyZXQpCi0JCSpyZWdfdmFsID0gKHU4KXZhbDsKLQotCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJnN3cm0tPnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN3cm1fd3JpdGUoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAotCQkgICAgICBjb25zdCB2b2lkICpidWYpCi17Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCWludCByZXQgPSAwOwotCXU4IHJlZ192YWwgPSAqKHU4ICopYnVmOwotCi0JaWYgKCFzd3JtKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IHN3cm0gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZGV2X251bSkKLQkJcmV0ID0gc3dybV9jbWRfZmlmb193cl9jbWQoc3dybSwgcmVnX3ZhbCwgZGV2X251bSwgMCwgcmVnX2FkZHIpOwotCWVsc2UKLQkJcmV0ID0gc3dybS0+d3JpdGUoc3dybS0+aGFuZGxlLCByZWdfYWRkciwgcmVnX3ZhbCk7Ci0KLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZzd3JtLT5wZGV2LT5kZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzd3JtX2J1bGtfd3JpdGUoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwgdTggZGV2X251bSwgdm9pZCAqcmVnLAotCQkJICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gc3dyX2dldF9jdHJsX2RhdGEobWFzdGVyKTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaTsKLQl1MzIgKnZhbDsKLQl1MzIgKnN3cl9maWZvX3JlZzsKLQotCWlmICghc3dybSB8fCAhc3dybS0+aGFuZGxlKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IHN3cm0gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGxlbiA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChkZXZfbnVtKSB7Ci0JCXN3cl9maWZvX3JlZyA9IGtjYWxsb2MobGVuLCBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc3dyX2ZpZm9fcmVnKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJdmFsID0ga2NhbGxvYyhsZW4sIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF2YWwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG1lbV9mYWlsOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl2YWxbaV0gPSBzd3JtX2dldF9wYWNrZWRfcmVnX3ZhbCgmc3dybS0+d2NtZF9pZCwKLQkJCQkJCQkgKCh1OCAqKWJ1ZilbaV0sCi0JCQkJCQkJIGRldl9udW0sCi0JCQkJCQkJICgodTE2ICopcmVnKVtpXSk7Ci0JCQlzd3JfZmlmb19yZWdbaV0gPSBTV1JNX0NNRF9GSUZPX1dSX0NNRDsKLQkJfQotCQlyZXQgPSBzd3JtLT5idWxrX3dyaXRlKHN3cm0tPmhhbmRsZSwgc3dyX2ZpZm9fcmVnLCB2YWwsIGxlbik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAiJXM6IGJ1bGsgd3JpdGUgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKLQkJCSIlczogTm8gc3VwcG9ydCBvZiBCdWxrIHdyaXRlIGZvciBtYXN0ZXIgcmVnc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCWtmcmVlKHZhbCk7Ci1tZW1fZmFpbDoKLQlrZnJlZShzd3JfZmlmb19yZWcpOwotZXJyOgotCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJnN3cm0tPnBkZXYtPmRldik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHU4IGdldF9pbmFjdGl2ZV9iYW5rX251bShzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSkKLXsKLQlyZXR1cm4gKHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX01DUF9TVEFUVVMpICYKLQkJU1dSTV9NQ1BfU1RBVFVTX0JBTktfTlVNX01BU0spID8gMCA6IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9iYW5rX3N3aXRjaChzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSwgdTggYmFuaywKLQkJCQl1OCByb3csIHU4IGNvbCkKLXsKLQlzd3JtX2NtZF9maWZvX3dyX2NtZChzd3JtLCAoKHJvdyA8PCAzKSB8IGNvbCksIDB4RiwgMHhGLAotCQkJU1dSU19TQ1BfRlJBTUVfQ1RSTF9CQU5LKGJhbmspKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzd3JfcG9ydF9pbmZvICpzd3JtX2dldF9wb3J0KHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCi0JCQkJCSAgIHU4IHBvcnRfaWQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHN3cl9wb3J0X2luZm8gKnBvcnQgPSBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IFNXUl9NU1RSX1BPUlRfTEVOOyBpKyspIHsKLQkJcG9ydCA9ICZtYXN0ZXItPnBvcnRbaV07Ci0JCWlmIChwb3J0LT5wb3J0X2lkID09IHBvcnRfaWQpIHsKLQkJCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IHBvcnRfaWQ6ICVkLCBpbmRleDogJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQsIGkpOwotCQkJcmV0dXJuIHBvcnQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBzd3JfcG9ydF9pbmZvICpzd3JtX2dldF9hdmFpbF9wb3J0KHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHN3cl9wb3J0X2luZm8gKnBvcnQgPSBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IFNXUl9NU1RSX1BPUlRfTEVOOyBpKyspIHsKLQkJcG9ydCA9ICZtYXN0ZXItPnBvcnRbaV07Ci0JCWlmIChwb3J0LT5wb3J0X2VuKQotCQkJY29udGludWU7Ci0KLQkJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogcG9ydF9pZDogJWQsIGluZGV4OiAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0LT5wb3J0X2lkLCBpKTsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqc3dybV9nZXRfZW5hYmxlZF9wb3J0KHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCi0JCQkJCQkgICB1OCBwb3J0X2lkKQotewotCWludCBpOwotCXN0cnVjdCBzd3JfcG9ydF9pbmZvICpwb3J0ID0gTlVMTDsKLQotCWZvciAoaSA9IDA7IGkgPCBTV1JfTVNUUl9QT1JUX0xFTjsgaSsrKSB7Ci0JCXBvcnQgPSAmbWFzdGVyLT5wb3J0W2ldOwotCQlpZiAoKHBvcnQtPnBvcnRfaWQgPT0gcG9ydF9pZCkgJiYgKHBvcnQtPnBvcnRfZW4gPT0gdHJ1ZSkpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gU1dSX01TVFJfUE9SVF9MRU4pCi0JCXBvcnQgPSBOVUxMOwotCXJldHVybiBwb3J0OwotfQotCi1zdGF0aWMgYm9vbCBzd3JtX3JlbW92ZV9mcm9tX2dyb3VwKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCWJvb2wgaXNfcmVtb3ZlZCA9IGZhbHNlOwotCi0JaWYgKCFzd3JtKQotCQlnb3RvIGVuZDsKLQotCW11dGV4X2xvY2soJnN3cm0tPm1sb2NrKTsKLQlpZiAoKHN3cm0tPm51bV9yeF9jaHMgPiAxKSAmJgotCSAgICAoc3dybS0+bnVtX3J4X2NocyA9PSBzd3JtLT5udW1fY2ZnX2RldnMpKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dyX2RldiwgJm1hc3Rlci0+ZGV2aWNlcywKLQkJCQlkZXZfbGlzdCkgewotCQkJc3dyX2Rldi0+Z3JvdXBfaWQgPSBTV1JfR1JPVVBfTk9ORTsKLQkJCW1hc3Rlci0+Z3Jfc2lkID0gMDsKLQkJfQotCQlpc19yZW1vdmVkID0gdHJ1ZTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7Ci0KLWVuZDoKLQlyZXR1cm4gaXNfcmVtb3ZlZDsKLX0KLQotc3RhdGljIHZvaWQgc3dybV9jbGVhbnVwX2Rpc2FibGVkX2RhdGFfcG9ydHMoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKLQkJCQkJICAgICB1OCBiYW5rKQotewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqcG9ydDsKLQlpbnQgaTsKLQlpbnQgcG9ydF90eXBlOwotCXN0cnVjdCBzd3JtX21wb3J0cyAqbXBvcnQsICptcG9ydF9uZXh0ID0gTlVMTDsKLQlpbnQgcG9ydF9kaXNhYmxlX2NudCA9IDA7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCi0JaWYgKCFzd3JtKSB7Ci0JCXByX2VycigiJXM6IHN3cm0gaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhzd3JtLT5kZXYsICIlczogbWFzdGVyIG51bV9wb3J0OiAlZFxuIiwgX19mdW5jX18sCi0JCW1hc3Rlci0+bnVtX3BvcnQpOwotCi0JbXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnN3cm0tPm1wb3J0X2xpc3QsCi0JCQkJCXN0cnVjdCBzd3JtX21wb3J0cywKLQkJCQkJbGlzdCk7Ci0JaWYgKCFtcG9ydCkgewotCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBsaXN0IGlzIGVtcHR5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fcG9ydDsgaSsrKSB7Ci0JCXBvcnQgPSBzd3JtX2dldF9wb3J0KG1hc3RlciwgbXN0cl9wb3J0c1ttcG9ydC0+aWRdKTsKLQkJaWYgKCFwb3J0IHx8IHBvcnQtPmNoX2VuKQotCQkJZ290byBpbmNfbG9vcDsKLQotCQlwb3J0X2Rpc2FibGVfY250Kys7Ci0JCXBvcnRfdHlwZSA9IG1zdHJfcG9ydF90eXBlW21wb3J0LT5pZF07Ci0JCXZhbHVlID0gKChwb3J0LT5jaF9lbikKLQkJCQk8PCBTV1JNX0RQX1BPUlRfQ1RSTF9FTl9DSEFOX1NIRlQpOwotCQl2YWx1ZSB8PSAoKHBvcnQtPm9mZnNldDIpCi0JCQkJPDwgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMl9TSEZUKTsKLQkJdmFsdWUgfD0gKChwb3J0LT5vZmZzZXQxKQotCQkJCTw8IFNXUk1fRFBfUE9SVF9DVFJMX09GRlNFVDFfU0hGVCk7Ci0JCXZhbHVlIHw9IHBvcnQtPnNpbnRlcnZhbDsKLQotCQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsCi0JCQkgICAgU1dSTV9EUF9QT1JUX0NUUkxfQkFOSygobXBvcnQtPmlkKzEpLCBiYW5rKSwKLQkJCSAgICB2YWx1ZSk7Ci0JCXN3cm1fY21kX2ZpZm9fd3JfY21kKHN3cm0sIDB4MDAsIHBvcnQtPmRldl9pZCwgMHgwMCwKLQkJCQlTV1JTX0RQX0NIQU5ORUxfRU5BQkxFX0JBTksocG9ydF90eXBlLCBiYW5rKSk7Ci0KLQkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogbXBvcnQgOiVkLCByZWc6IDB4JXgsIHZhbDogMHgleFxuIiwKLQkJCV9fZnVuY19fLCBtcG9ydC0+aWQsCi0JCQkoU1dSTV9EUF9QT1JUX0NUUkxfQkFOSygobXBvcnQtPmlkKzEpLCBiYW5rKSksIHZhbHVlKTsKLQotaW5jX2xvb3A6Ci0JCW1wb3J0X25leHQgPSBsaXN0X25leHRfZW50cnkobXBvcnQsIGxpc3QpOwotCQlpZiAocG9ydCAmJiAhcG9ydC0+Y2hfZW4pIHsKLQkJCWxpc3RfZGVsKCZtcG9ydC0+bGlzdCk7Ci0JCQlrZnJlZShtcG9ydCk7Ci0JCX0KLQkJaWYgKCFtcG9ydF9uZXh0KSB7Ci0JCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBlbmQgb2YgbGlzdFxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXBvcnQgPSBtcG9ydF9uZXh0OwotCX0KLQltYXN0ZXItPm51bV9wb3J0IC09IHBvcnRfZGlzYWJsZV9jbnQ7Ci0KLQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOmRpc2FibGUgcG9ydHM6ICVkLCBhY3RpdmUgcG9ydHMgKHJlbSk6ICVkXG4iLAotCQlfX2Z1bmNfXywgcG9ydF9kaXNhYmxlX2NudCwgIG1hc3Rlci0+bnVtX3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBzd3JtX3NsdmRldl9kYXRhcGF0aF9jb250cm9sKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCi0JCQkJCSBib29sIGVuYWJsZSkKLXsKLQl1OCBiYW5rOwotCXUzMiB2YWx1ZSwgbl9jb2w7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCWludCBtYXNrID0gKFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19ST1dfQ1RSTF9CTVNLIHwKLQkJICAgIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19DT0xfQ1RSTF9CTVNLIHwKLQkJICAgIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19TU1BfUEVSSU9EX0JNU0spOwotCXU4IGluYWN0aXZlX2Jhbms7Ci0KLQlpZiAoIXN3cm0pIHsKLQkJcHJfZXJyKCIlczogc3dybSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQliYW5rID0gZ2V0X2luYWN0aXZlX2JhbmtfbnVtKHN3cm0pOwotCi0JZGV2X2RiZyhzd3JtLT5kZXYsICIlczogZW5hYmxlOiAlZCwgY2ZnX2RldnM6ICVkXG4iLAotCQlfX2Z1bmNfXywgZW5hYmxlLCBzd3JtLT5udW1fY2ZnX2RldnMpOwotCi0JaWYgKGVuYWJsZSkgewotCQkvKiBzZXQgUm93ID0gNDggYW5kIGNvbCA9IDE2ICovCi0JCW5fY29sID0gU1dSX01BWF9DT0w7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogRG8gbm90IGNoYW5nZSB0byA0OHgyIGlmIG51bWJlciBvZiBjaGFubmVscyBjb25maWd1cmVkCi0JCSAqIGFzIHN0ZXJlbyBhbmQgaWYgZGlzYWJsZSBkYXRhcGF0aCBpcyBjYWxsZWQgZm9yIHRoZQotCQkgKiBmaXJzdCBzbGF2ZSBkZXZpY2UKLQkJICovCi0JCWlmIChzd3JtLT5udW1fY2ZnX2RldnMgPiAwKQotCQkJbl9jb2wgPSBTV1JfTUFYX0NPTDsKLQkJZWxzZQotCQkJbl9jb2wgPSBTV1JfTUlOX0NPTDsKLQotCQkvKgotCQkgKiBBbGwgcG9ydHMgYXJlIGFscmVhZHkgZGlzYWJsZWQsIG5vIG5lZWQgdG8gcGVyZm9ybQotCQkgKiBiYW5rLXN3aXRjaCBhbmQgY29weSBvcGVyYXRpb24uIFRoaXMgY2FzZSBjYW4gYXJpc2UKLQkJICogd2hlbiBzcGVha2VyIGNoYW5uZWxzIGFyZSBlbmFibGVkIGluIHN0ZXJlbyBtb2RlIHdpdGgKLQkJICogQlJPQURDQVNUIGFuZCBkaXNhYmxlZCBpbiBHUk9VUF9OT05FCi0JCSAqLwotCQlpZiAobWFzdGVyLT5udW1fcG9ydCA9PSAwKQotCQkJcmV0dXJuOwotCX0KLQotCXZhbHVlID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19BRERSKGJhbmspKTsKLQl2YWx1ZSAmPSAofm1hc2spOwotCXZhbHVlIHw9ICgoMCA8PCBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfUk9XX0NUUkxfU0hGVCkgfAotCQkgIChuX2NvbCA8PCBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfQ09MX0NUUkxfU0hGVCkgfAotCQkgICgwIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19TU1BfUEVSSU9EX1NIRlQpKTsKLQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19BRERSKGJhbmspLCB2YWx1ZSk7Ci0KLQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiByZWdhZGRyOiAweCV4LCB2YWx1ZTogMHgleFxuIiwgX19mdW5jX18sCi0JCVNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19BRERSKGJhbmspLCB2YWx1ZSk7Ci0KLQllbmFibGVfYmFua19zd2l0Y2goc3dybSwgYmFuaywgU1dSX01BWF9ST1csIG5fY29sKTsKLQotCWluYWN0aXZlX2JhbmsgPSBiYW5rID8gMCA6IDE7Ci0JaWYgKGVuYWJsZSkKLQkJc3dybV9jb3B5X2RhdGFfcG9ydF9jb25maWcobWFzdGVyLCBpbmFjdGl2ZV9iYW5rKTsKLQllbHNlCi0JCXN3cm1fY2xlYW51cF9kaXNhYmxlZF9kYXRhX3BvcnRzKG1hc3RlciwgaW5hY3RpdmVfYmFuayk7Ci0KLQlpZiAoIXN3cm1faXNfcG9ydF9lbihtYXN0ZXIpKSB7Ci0JCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IHBtX3J1bnRpbWUgYXV0byBzdXNwZW5kIHRyaWdnZXJlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmc3dybS0+cGRldi0+ZGV2KTsKLQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJnN3cm0tPnBkZXYtPmRldik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzd3JtX2FwcGx5X3BvcnRfY29uZmlnKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpCi17Ci0JdTggYmFuazsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1hc3Rlcik7Ci0KLQlpZiAoIXN3cm0pIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gc3dyIGNvbnRyb2xsZXJcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQliYW5rID0gZ2V0X2luYWN0aXZlX2JhbmtfbnVtKHN3cm0pOwotCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6IGVudGVyIGJhbms6ICVkIG1hc3Rlcl9wb3J0czogJWRcbiIsCi0JCV9fZnVuY19fLCBiYW5rLCBtYXN0ZXItPm51bV9wb3J0KTsKLQotCi0Jc3dybV9jbWRfZmlmb193cl9jbWQoc3dybSwgMHgwMSwgMHhGLCAweDAwLAotCQkJU1dSU19TQ1BfSE9TVF9DTEtfRElWMl9DVExfQkFOSyhiYW5rKSk7Ci0KLQlzd3JtX2NvcHlfZGF0YV9wb3J0X2NvbmZpZyhtYXN0ZXIsIGJhbmspOwotfQotCi1zdGF0aWMgdm9pZCBzd3JtX2NvcHlfZGF0YV9wb3J0X2NvbmZpZyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBiYW5rKQotewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqcG9ydDsKLQlpbnQgaTsKLQlpbnQgcG9ydF90eXBlOwotCXN0cnVjdCBzd3JtX21wb3J0cyAqbXBvcnQ7Ci0JdTMyIHJlZ1tTV1JNX01BWF9QT1JUX1JFR107Ci0JdTMyIHZhbFtTV1JNX01BWF9QT1JUX1JFR107Ci0JaW50IGxlbiA9IDA7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCi0JaWYgKCFzd3JtKSB7Ci0JCXByX2VycigiJXM6IHN3cm0gaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhzd3JtLT5kZXYsICIlczogbWFzdGVyIG51bV9wb3J0OiAlZFxuIiwgX19mdW5jX18sCi0JCW1hc3Rlci0+bnVtX3BvcnQpOwotCi0JbXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnN3cm0tPm1wb3J0X2xpc3QsCi0JCQkJCXN0cnVjdCBzd3JtX21wb3J0cywKLQkJCQkJbGlzdCk7Ci0JaWYgKCFtcG9ydCkgewotCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBsaXN0IGlzIGVtcHR5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bnVtX3BvcnQ7IGkrKykgewotCi0JCXBvcnQgPSBzd3JtX2dldF9lbmFibGVkX3BvcnQobWFzdGVyLCBtc3RyX3BvcnRzW21wb3J0LT5pZF0pOwotCQlpZiAoIXBvcnQpCi0JCQljb250aW51ZTsKLQkJcG9ydF90eXBlID0gbXN0cl9wb3J0X3R5cGVbbXBvcnQtPmlkXTsKLQkJaWYgKCFwb3J0LT5kZXZfaWQgfHwgKHBvcnQtPmRldl9pZCA+IG1hc3Rlci0+bnVtX2RldikpIHsKLQkJCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6IGludmFsaWQgZGV2aWNlIGlkID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnQtPmRldl9pZCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQl2YWx1ZSA9ICgocG9ydC0+Y2hfZW4pCi0JCQkJPDwgU1dSTV9EUF9QT1JUX0NUUkxfRU5fQ0hBTl9TSEZUKTsKLQkJdmFsdWUgfD0gKChwb3J0LT5vZmZzZXQyKQotCQkJCTw8IFNXUk1fRFBfUE9SVF9DVFJMX09GRlNFVDJfU0hGVCk7Ci0JCXZhbHVlIHw9ICgocG9ydC0+b2Zmc2V0MSkKLQkJCQk8PCBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQxX1NIRlQpOwotCQl2YWx1ZSB8PSBwb3J0LT5zaW50ZXJ2YWw7Ci0KLQkJcmVnW2xlbl0gPSBTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LKChtcG9ydC0+aWQrMSksIGJhbmspOwotCQl2YWxbbGVuKytdID0gdmFsdWU7Ci0KLQkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogbXBvcnQgOiVkLCByZWc6IDB4JXgsIHZhbDogMHgleFxuIiwKLQkJCV9fZnVuY19fLCBtcG9ydC0+aWQsCi0JCQkoU1dSTV9EUF9QT1JUX0NUUkxfQkFOSygobXBvcnQtPmlkKzEpLCBiYW5rKSksIHZhbHVlKTsKLQotCQlyZWdbbGVuXSA9IFNXUk1fQ01EX0ZJRk9fV1JfQ01EOwotCQl2YWxbbGVuKytdID0gU1dSX1JFR19WQUxfUEFDSyhwb3J0LT5jaF9lbiwgcG9ydC0+ZGV2X2lkLCAweDAwLAotCQkJCVNXUlNfRFBfQ0hBTk5FTF9FTkFCTEVfQkFOSyhwb3J0X3R5cGUsIGJhbmspKTsKLQotCQlyZWdbbGVuXSA9IFNXUk1fQ01EX0ZJRk9fV1JfQ01EOwotCQl2YWxbbGVuKytdID0gU1dSX1JFR19WQUxfUEFDSyhwb3J0LT5zaW50ZXJ2YWwsCi0JCQkJcG9ydC0+ZGV2X2lkLCAweDAwLAotCQkJCVNXUlNfRFBfU0FNUExFX0NPTlRST0xfMV9CQU5LKHBvcnRfdHlwZSwgYmFuaykpOwotCi0JCXJlZ1tsZW5dID0gU1dSTV9DTURfRklGT19XUl9DTUQ7Ci0JCXZhbFtsZW4rK10gPSBTV1JfUkVHX1ZBTF9QQUNLKHBvcnQtPm9mZnNldDEsCi0JCQkJcG9ydC0+ZGV2X2lkLCAweDAwLAotCQkJCVNXUlNfRFBfT0ZGU0VUX0NPTlRST0xfMV9CQU5LKHBvcnRfdHlwZSwgYmFuaykpOwotCi0JCWlmIChwb3J0X3R5cGUgIT0gMCkgewotCQkJcmVnW2xlbl0gPSBTV1JNX0NNRF9GSUZPX1dSX0NNRDsKLQkJCXZhbFtsZW4rK10gPSBTV1JfUkVHX1ZBTF9QQUNLKHBvcnQtPm9mZnNldDIsCi0JCQkJCXBvcnQtPmRldl9pZCwgMHgwMCwKLQkJCQkJU1dSU19EUF9PRkZTRVRfQ09OVFJPTF8yX0JBTksocG9ydF90eXBlLAotCQkJCQkJCQkJYmFuaykpOwotCQl9Ci0JCW1wb3J0ID0gbGlzdF9uZXh0X2VudHJ5KG1wb3J0LCBsaXN0KTsKLQkJaWYgKCFtcG9ydCkgewotCQkJZGV2X2Vycihzd3JtLT5kZXYsICIlczogZW5kIG9mIGxpc3RcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXN3cm0tPmJ1bGtfd3JpdGUoc3dybS0+aGFuZGxlLCByZWcsIHZhbCwgbGVuKTsKLX0KLQotc3RhdGljIGludCBzd3JtX2Nvbm5lY3RfcG9ydChzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAotCQkJc3RydWN0IHN3cl9wYXJhbXMgKnBvcnRpbmZvKQotewotCWludCBpOwotCXN0cnVjdCBzd3JfcG9ydF9pbmZvICpwb3J0OwotCWludCByZXQgPSAwOwotCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gc3dyX2dldF9jdHJsX2RhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3dybV9tcG9ydHMgKm1wb3J0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCWlmICghcG9ydGluZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFzd3JtKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBzd3IgY29udHJvbGxlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmc3dybS0+bWxvY2spOwotCWlmICghc3dybV9pc19wb3J0X2VuKG1hc3RlcikpCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnN3cm0tPnBkZXYtPmRldik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcG9ydGluZm8tPm51bV9wb3J0OyBpKyspIHsKLQkJbXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3dybV9tcG9ydHMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtcG9ydCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gbWVtX2ZhaWw7Ci0JCX0KLQkJcmV0ID0gc3dybV9nZXRfbWFzdGVyX3BvcnQoJm1wb3J0LT5pZCwKLQkJCQkJCXBvcnRpbmZvLT5wb3J0X2lkW2ldKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAotCQkJCSIlczogbXN0ciBwb3J0aWQgZm9yIHNsdiBwb3J0ICVkIG5vdCBmb3VuZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydGluZm8tPnBvcnRfaWRbaV0pOwotCQkJZ290byBwb3J0X2ZhaWw7Ci0JCX0KLQkJcG9ydCA9IHN3cm1fZ2V0X2F2YWlsX3BvcnQobWFzdGVyKTsKLQkJaWYgKCFwb3J0KSB7Ci0JCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwKLQkJCQkiJXM6IGF2YWlsIHBvcnRzIG5vdCBmb3VuZCFcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gcG9ydF9mYWlsOwotCQl9Ci0JCWxpc3RfYWRkKCZtcG9ydC0+bGlzdCwgJnN3cm0tPm1wb3J0X2xpc3QpOwotCQlwb3J0LT5kZXZfaWQgPSBwb3J0aW5mby0+ZGV2X2lkOwotCQlwb3J0LT5wb3J0X2lkID0gcG9ydGluZm8tPnBvcnRfaWRbaV07Ci0JCXBvcnQtPm51bV9jaCA9IHBvcnRpbmZvLT5udW1fY2hbaV07Ci0JCXBvcnQtPmNoX3JhdGUgPSBwb3J0aW5mby0+Y2hfcmF0ZVtpXTsKLQkJcG9ydC0+Y2hfZW4gPSBwb3J0aW5mby0+Y2hfZW5baV07Ci0JCXBvcnQtPnBvcnRfZW4gPSB0cnVlOwotCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwKLQkJCSIlczogbXN0ciBwb3J0ICVkLCBzbHYgcG9ydCAlZCBjaF9yYXRlICVkIG51bV9jaCAlZFxuIiwKLQkJCV9fZnVuY19fLCBtcG9ydC0+aWQsIHBvcnQtPnBvcnRfaWQsIHBvcnQtPmNoX3JhdGUsCi0JCQlwb3J0LT5udW1fY2gpOwotCX0KLQltYXN0ZXItPm51bV9wb3J0ICs9IHBvcnRpbmZvLT5udW1fcG9ydDsKLQlpZiAobWFzdGVyLT5udW1fcG9ydCA+PSBTV1JfTVNUUl9QT1JUX0xFTikKLQkJbWFzdGVyLT5udW1fcG9ydCA9IFNXUl9NU1RSX1BPUlRfTEVOOwotCi0Jc3dybV9nZXRfcG9ydF9jb25maWcobWFzdGVyKTsKLQlzd3JfcG9ydF9yZXNwb25zZShtYXN0ZXIsIHBvcnRpbmZvLT50aWQpOwotCXN3cm0tPm51bV9jZmdfZGV2cyArPSAxOwotCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IGNmZ19kZXZzOiAlZCwgcnhfY2hzOiAlZFxuIiwKLQkJX19mdW5jX18sIHN3cm0tPm51bV9jZmdfZGV2cywgc3dybS0+bnVtX3J4X2Nocyk7Ci0JaWYgKHN3cm0tPm51bV9yeF9jaHMgPiAxKSB7Ci0JCWlmIChzd3JtLT5udW1fcnhfY2hzID09IHN3cm0tPm51bV9jZmdfZGV2cykKLQkJCXN3cm1fYXBwbHlfcG9ydF9jb25maWcobWFzdGVyKTsKLQl9IGVsc2UgewotCQlzd3JtX2FwcGx5X3BvcnRfY29uZmlnKG1hc3Rlcik7Ci0JfQotCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOwotCXJldHVybiAwOwotCi1wb3J0X2ZhaWw6Ci0Ja2ZyZWUobXBvcnQpOwotbWVtX2ZhaWw6Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJnN3cm0tPm1wb3J0X2xpc3QpIHsKLQkJbXBvcnQgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IHN3cm1fbXBvcnRzLCBsaXN0KTsKLQkJZm9yIChpID0gMDsgaSA8IHBvcnRpbmZvLT5udW1fcG9ydDsgaSsrKSB7Ci0JCQlpZiAocG9ydGluZm8tPnBvcnRfaWRbaV0gPT0gbXN0cl9wb3J0c1ttcG9ydC0+aWRdKSB7Ci0JCQkJcG9ydCA9IHN3cm1fZ2V0X3BvcnQobWFzdGVyLAotCQkJCQkJcG9ydGluZm8tPnBvcnRfaWRbaV0pOwotCQkJCWlmIChwb3J0KQotCQkJCQlwb3J0LT5jaF9lbiA9IGZhbHNlOwotCQkJCWxpc3RfZGVsKCZtcG9ydC0+bGlzdCk7Ci0JCQkJa2ZyZWUobXBvcnQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9kaXNjb25uZWN0X3BvcnQoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlciwKLQkJCXN0cnVjdCBzd3JfcGFyYW1zICpwb3J0aW5mbykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAqcG9ydDsKLQl1OCBiYW5rOwotCXUzMiB2YWx1ZTsKLQlpbnQgcmV0ID0gMDsKLQl1OCBtcG9ydF9pZCA9IDA7Ci0JaW50IHBvcnRfdHlwZSA9IDA7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBzd3JfZ2V0X2N0cmxfZGF0YShtYXN0ZXIpOwotCi0JaWYgKCFzd3JtKSB7Ci0JCWRldl9lcnIoJm1hc3Rlci0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBzd3IgY29udHJvbGxlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFwb3J0aW5mbykgewotCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIiVzOiBwb3J0aW5mbyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF9sb2NrKCZzd3JtLT5tbG9jayk7Ci0JYmFuayA9IGdldF9pbmFjdGl2ZV9iYW5rX251bShzd3JtKTsKLQlmb3IgKGkgPSAwOyBpIDwgcG9ydGluZm8tPm51bV9wb3J0OyBpKyspIHsKLQkJcmV0ID0gc3dybV9nZXRfbWFzdGVyX3BvcnQoJm1wb3J0X2lkLAotCQkJCQkJcG9ydGluZm8tPnBvcnRfaWRbaV0pOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmbWFzdGVyLT5kZXYsCi0JCQkJIiVzOiBtc3RyIHBvcnRpZCBmb3Igc2x2IHBvcnQgJWQgbm90IGZvdW5kXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0aW5mby0+cG9ydF9pZFtpXSk7Ci0JCQltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXBvcnQgPSBzd3JtX2dldF9lbmFibGVkX3BvcnQobWFzdGVyLCBwb3J0aW5mby0+cG9ydF9pZFtpXSk7Ci0JCWlmICghcG9ydCkgewotCQkJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogcG9ydCAlZCBhbHJlYWR5IGRpc2FibGVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0aW5mby0+cG9ydF9pZFtpXSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwb3J0X3R5cGUgPSBtc3RyX3BvcnRfdHlwZVttcG9ydF9pZF07Ci0JCXBvcnQtPmRldl9pZCA9IHBvcnRpbmZvLT5kZXZfaWQ7Ci0JCXBvcnQtPnBvcnRfZW4gPSBmYWxzZTsKLQkJcG9ydC0+Y2hfZW4gPSAwOwotCQl2YWx1ZSA9IHBvcnQtPmNoX2VuIDw8IFNXUk1fRFBfUE9SVF9DVFJMX0VOX0NIQU5fU0hGVDsKLQkJdmFsdWUgfD0gKHBvcnQtPm9mZnNldDIgPDwgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMl9TSEZUKTsKLQkJdmFsdWUgfD0gKHBvcnQtPm9mZnNldDEgPDwgU1dSTV9EUF9QT1JUX0NUUkxfT0ZGU0VUMV9TSEZUKTsKLQkJdmFsdWUgfD0gcG9ydC0+c2ludGVydmFsOwotCi0KLQkJc3dybS0+d3JpdGUoc3dybS0+aGFuZGxlLAotCQkJICAgIFNXUk1fRFBfUE9SVF9DVFJMX0JBTksoKG1wb3J0X2lkKzEpLCBiYW5rKSwKLQkJCSAgICB2YWx1ZSk7Ci0JCXN3cm1fY21kX2ZpZm9fd3JfY21kKHN3cm0sIDB4MDAsIHBvcnQtPmRldl9pZCwgMHgwMCwKLQkJCQlTV1JTX0RQX0NIQU5ORUxfRU5BQkxFX0JBTksocG9ydF90eXBlLCBiYW5rKSk7Ci0JfQotCi0Jc3dyX3BvcnRfcmVzcG9uc2UobWFzdGVyLCBwb3J0aW5mby0+dGlkKTsKLQlzd3JtLT5udW1fY2ZnX2RldnMgLT0gMTsKLQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBjZmdfZGV2czogJWQsIHJ4X2NoczogJWQsIGFjdGl2ZSBwb3J0czogJWRcbiIsCi0JCV9fZnVuY19fLCBzd3JtLT5udW1fY2ZnX2RldnMsIHN3cm0tPm51bV9yeF9jaHMsCi0JCW1hc3Rlci0+bnVtX3BvcnQpOwotCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9jaGVja19zbGF2ZV9jaGFuZ2Vfc3RhdHVzKHN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtLAotCQkJCQlpbnQgc3RhdHVzLCB1OCAqZGV2bnVtKQotewotCWludCBpOwotCWludCBuZXdfc3RzID0gc3RhdHVzOwotCWludCByZXQgPSBTV1JfTk9UX1BSRVNFTlQ7Ci0KLQlpZiAoc3RhdHVzICE9IHN3cm0tPnNsYXZlX3N0YXR1cykgewotCQlmb3IgKGkgPSAwOyBpIDwgKHN3cm0tPm1hc3Rlci5udW1fZGV2ICsgMSk7IGkrKykgewotCQkJaWYgKChzdGF0dXMgJiBTV1JNX01DUF9TTFZfU1RBVFVTX01BU0spICE9Ci0JCQkgICAgKHN3cm0tPnNsYXZlX3N0YXR1cyAmIFNXUk1fTUNQX1NMVl9TVEFUVVNfTUFTSykpIHsKLQkJCQlyZXQgPSAoc3RhdHVzICYgU1dSTV9NQ1BfU0xWX1NUQVRVU19NQVNLKTsKLQkJCQkqZGV2bnVtID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN0YXR1cyA+Pj0gMjsKLQkJCXN3cm0tPnNsYXZlX3N0YXR1cyA+Pj0gMjsKLQkJfQotCQlzd3JtLT5zbGF2ZV9zdGF0dXMgPSBuZXdfc3RzOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3dyX21zdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKLXsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IGRldjsKLQl1MzIgdmFsdWUsIGludHJfc3RzOwotCWludCBzdGF0dXMsIGNoZ19zdHMsIGk7Ci0JdTggZGV2bnVtID0gMDsKLQlpbnQgcmV0ID0gSVJRX0hBTkRMRUQ7Ci0KLQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQlzd3JtX2Nsa19yZXF1ZXN0KHN3cm0sIHRydWUpOwotCW11dGV4X3VubG9jaygmc3dybS0+cmVzbG9jayk7Ci0KLQlpbnRyX3N0cyA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX0lOVEVSUlVQVF9TVEFUVVMpOwotCWludHJfc3RzICY9IFNXUk1fSU5URVJSVVBUX1NUQVRVU19STVNLOwotCWZvciAoaSA9IDA7IGkgPCBTV1JNX0lOVEVSUlVQVF9NQVg7IGkrKykgewotCQl2YWx1ZSA9IGludHJfc3RzICYgKDEgPDwgaSk7Ci0JCWlmICghdmFsdWUpCi0JCQljb250aW51ZTsKLQotCQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fSU5URVJSVVBUX0NMRUFSLCB2YWx1ZSk7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfU0xBVkVfUEVORF9JUlE6Ci0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIlNXUiBzbGF2ZSBwZW5kIGlycVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfTkVXX1NMQVZFX0FUVEFDSEVEOgotCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1IgbmV3IHNsYXZlIGF0dGFjaGVkXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19DSEFOR0VfRU5VTV9TTEFWRV9TVEFUVVM6Ci0JCQlzdGF0dXMgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9NQ1BfU0xWX1NUQVRVUyk7Ci0JCQlpZiAoc3RhdHVzID09IHN3cm0tPnNsYXZlX3N0YXR1cykgewotCQkJCWRldl9kYmcoc3dybS0+ZGV2LAotCQkJCQkiJXM6IE5vIGNoYW5nZSBpbiBzbGF2ZSBzdGF0dXM6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNoZ19zdHMgPSBzd3JtX2NoZWNrX3NsYXZlX2NoYW5nZV9zdGF0dXMoc3dybSwgc3RhdHVzLAotCQkJCQkJCQkmZGV2bnVtKTsKLQkJCXN3aXRjaCAoY2hnX3N0cykgewotCQkJY2FzZSBTV1JfTk9UX1BSRVNFTlQ6Ci0JCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJkZXZpY2UgJWQgZ290IGRldGFjaGVkXG4iLAotCQkJCQlkZXZudW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1JfQVRUQUNIRURfT0s6Ci0JCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJkZXZpY2UgJWQgZ290IGF0dGFjaGVkXG4iLAotCQkJCQlkZXZudW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1JfQUxFUlQ6Ci0JCQkJZGV2X2RiZyhzd3JtLT5kZXYsCi0JCQkJCSJkZXZpY2UgJWQgaGFzIHBlbmRpbmcgaW50ZXJydXB0XG4iLAotCQkJCQlkZXZudW0pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX01BU1RFUl9DTEFTSF9ERVQ6Ci0JCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHN3cm0tPmRldiwgIlNXUiBidXMgY2xhc2ggZGV0ZWN0ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JEX0ZJRk9fT1ZFUkZMT1c6Ci0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIlNXUiByZWFkIEZJRk8gb3ZlcmZsb3dcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JEX0ZJRk9fVU5ERVJGTE9XOgotCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1IgcmVhZCBGSUZPIHVuZGVyZmxvd1xuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfV1JfQ01EX0ZJRk9fT1ZFUkZMT1c6Ci0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIlNXUiB3cml0ZSBGSUZPIG92ZXJmbG93XG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19DTURfRVJST1I6Ci0JCQl2YWx1ZSA9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLCBTV1JNX0NNRF9GSUZPX1NUQVRVUyk7Ci0JCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHN3cm0tPmRldiwKLQkJCSJTV1IgQ01EIGVycm9yLCBmaWZvIHN0YXR1cyAweCV4LCBmbHVzaGluZyBmaWZvXG4iLAotCQkJCQkgICAgdmFsdWUpOwotCQkJc3dybS0+d3JpdGUoc3dybS0+aGFuZGxlLCBTV1JNX0NNRF9GSUZPX0NNRCwgMHgxKTsKLQkJCWJyZWFrOwotCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19ET1VUX1BPUlRfQ09MTElTSU9OOgotCQkJZGV2X2RiZyhzd3JtLT5kZXYsICJTV1IgUG9ydCBjb2xsaXNpb24gZGV0ZWN0ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JFQURfRU5fUkRfVkFMSURfTUlTTUFUQ0g6Ci0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIlNXUiByZWFkIGVuYWJsZSB2YWxpZCBtaXNtYXRjaFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfU1BFQ0lBTF9DTURfSURfRklOSVNIRUQ6Ci0JCQljb21wbGV0ZSgmc3dybS0+YnJvYWRjYXN0KTsKLQkJCWRldl9kYmcoc3dybS0+ZGV2LCAiU1dSIGNtZCBpZCBmaW5pc2hlZFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfTkVXX1NMQVZFX0FVVE9fRU5VTV9GSU5JU0hFRDoKLQkJCWJyZWFrOwotCQljYXNlIFNXUk1fSU5URVJSVVBUX1NUQVRVU19BVVRPX0VOVU1fRkFJTEVEOgotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0FVVE9fRU5VTV9UQUJMRV9JU19GVUxMOgotCQkJYnJlYWs7Ci0JCWNhc2UgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0JVU19SRVNFVF9GSU5JU0hFRDoKLQkJCWNvbXBsZXRlKCZzd3JtLT5yZXNldCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQ0xLX1NUT1BfRklOSVNIRUQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoc3dybS0+ZGV2LCAiU1dSIHVua25vd24gaW50ZXJydXB0XG4iKTsKLQkJCXJldCA9IElSUV9OT05FOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQlzd3JtX2Nsa19yZXF1ZXN0KHN3cm0sIGZhbHNlKTsKLQltdXRleF91bmxvY2soJnN3cm0tPnJlc2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9nZXRfZGV2aWNlX3N0YXR1cyhzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSwgdTggZGV2bnVtKQotewotCXUzMiB2YWw7Ci0KLQlzd3JtLT5zbGF2ZV9zdGF0dXMgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9NQ1BfU0xWX1NUQVRVUyk7Ci0JdmFsID0gKHN3cm0tPnNsYXZlX3N0YXR1cyA+PiAoZGV2bnVtICogMikpOwotCXZhbCAmPSBTV1JNX01DUF9TTFZfU1RBVFVTX01BU0s7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCBzd3JtX2dldF9sb2dpY2FsX2Rldl9udW0oc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHU2NCBkZXZfaWQsCi0JCQkJdTggKmRldl9udW0pCi17Ci0JaW50IGk7Ci0JdTY0IGlkID0gMDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHN3cl9nZXRfY3RybF9kYXRhKG1zdHIpOwotCi0JaWYgKCFzd3JtKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIHN3ciBjb250cm9sbGVyXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnN3cm0tPnBkZXYtPmRldik7Ci0JZm9yIChpID0gMTsgaSA8IChtc3RyLT5udW1fZGV2ICsgMSk7IGkrKykgewotCQlpZCA9ICgodTY0KShzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwKLQkJCSAgICBTV1JNX0VOVU1FUkFUT1JfU0xBVkVfREVWX0lEXzIoaSkpKSA8PCAzMik7Ci0JCWlkIHw9IHN3cm0tPnJlYWQoc3dybS0+aGFuZGxlLAotCQkJICAgIFNXUk1fRU5VTUVSQVRPUl9TTEFWRV9ERVZfSURfMShpKSk7Ci0JCWlmICgoaWQgJiBTV1JfREVWX0lEX01BU0spID09IGRldl9pZCkgewotCQkJaWYgKHN3cm1fZ2V0X2RldmljZV9zdGF0dXMoc3dybSwgaSkgPT0gMHgwMSkgewotCQkJCSpkZXZfbnVtID0gaTsKLQkJCQlyZXQgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBkZXZpY2UgaXMgbm90IHJlYWR5XG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJfQotCQkJZ290byBmb3VuZDsKLQkJfQotCX0KLQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBkZXZpY2UgaWQgMHglbGx4IGRvZXMgbm90IG1hdGNoIHdpdGggMHglbGx4XG4iLAotCQlfX2Z1bmNfXywgaWQsIGRldl9pZCk7Ci1mb3VuZDoKLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZzd3JtLT5wZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZzd3JtLT5wZGV2LT5kZXYpOwotCXJldHVybiByZXQ7Ci19Ci1zdGF0aWMgaW50IHN3cm1fbWFzdGVyX2luaXQoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0pCi17Ci0JaW50IHJldCA9IDA7Ci0JdTMyIHZhbDsKLQl1OCByb3dfY3RybCA9IFNXUl9NQVhfUk9XOwotCXU4IGNvbF9jdHJsID0gU1dSX01JTl9DT0w7Ci0JdTggc3NwX3BlcmlvZCA9IDE7Ci0JdTggcmV0cnlfY21kX251bSA9IDM7Ci0JdTMyIHJlZ1tTV1JNX01BWF9JTklUX1JFR107Ci0JdTMyIHZhbHVlW1NXUk1fTUFYX0lOSVRfUkVHXTsKLQlpbnQgbGVuID0gMDsKLQotCS8qIENsZWFyIFJvd3MgYW5kIENvbHMgKi8KLQl2YWwgPSAoKHJvd19jdHJsIDw8IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19ST1dfQ1RSTF9TSEZUKSB8Ci0JCShjb2xfY3RybCA8PCBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfQ09MX0NUUkxfU0hGVCkgfAotCQkoc3NwX3BlcmlvZCA8PCBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfU1NQX1BFUklPRF9TSEZUKSk7Ci0KLQlyZWdbbGVuXSA9IFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19BRERSKDApOwotCXZhbHVlW2xlbisrXSA9IHZhbDsKLQotCS8qIFNldCBBdXRvIGVudW1lcmF0aW9uIGZsYWcgKi8KLQlyZWdbbGVuXSA9IFNXUk1fRU5VTUVSQVRPUl9DRkdfQUREUjsKLQl2YWx1ZVtsZW4rK10gPSAxOwotCi0JLyogTWFzayBzb3VuZHdpcmUgaW50ZXJydXB0cyAqLwotCXJlZ1tsZW5dID0gU1dSTV9JTlRFUlJVUFRfTUFTS19BRERSOwotCXZhbHVlW2xlbisrXSA9IDB4MUZGRkQ7Ci0KLQkvKiBDb25maWd1cmUgTm8gcGluZ3MgKi8KLQl2YWwgPSBzd3JtLT5yZWFkKHN3cm0tPmhhbmRsZSwgU1dSTV9NQ1BfQ0ZHX0FERFIpOwotCXZhbCAmPSB+U1dSTV9NQ1BfQ0ZHX01BWF9OVU1fT0ZfQ01EX05PX1BJTkdTX0JNU0s7Ci0JdmFsIHw9ICgweDFmIDw8IFNXUk1fTUNQX0NGR19NQVhfTlVNX09GX0NNRF9OT19QSU5HU19TSEZUKTsKLQlyZWdbbGVuXSA9IFNXUk1fTUNQX0NGR19BRERSOwotCXZhbHVlW2xlbisrXSA9IHZhbDsKLQotCS8qIENvbmZpZ3VyZSBudW1iZXIgb2YgcmV0cmllcyBvZiBhIHJlYWQvd3JpdGUgY21kICovCi0JdmFsID0gKHJldHJ5X2NtZF9udW0gPDwgU1dSTV9DTURfRklGT19DRkdfTlVNX09GX0NNRF9SRVRSWV9TSEZUKTsKLQlyZWdbbGVuXSA9IFNXUk1fQ01EX0ZJRk9fQ0ZHX0FERFI7Ci0JdmFsdWVbbGVuKytdID0gdmFsOwotCi0JLyogU2V0IElSUSB0byBQVUxTRSAqLwotCXJlZ1tsZW5dID0gU1dSTV9DT01QX0NGR19BRERSOwotCXZhbHVlW2xlbisrXSA9IDB4MDI7Ci0KLQlyZWdbbGVuXSA9IFNXUk1fQ09NUF9DRkdfQUREUjsKLQl2YWx1ZVtsZW4rK10gPSAweDAzOwotCi0JcmVnW2xlbl0gPSBTV1JNX0lOVEVSUlVQVF9DTEVBUjsKLQl2YWx1ZVtsZW4rK10gPSAweDA4OwotCi0Jc3dybS0+YnVsa193cml0ZShzd3JtLT5oYW5kbGUsIHJlZywgdmFsdWUsIGxlbik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN3cm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybTsKLQlzdHJ1Y3Qgc3dyX2N0cmxfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0JaW50IHJldDsKLQotCS8qIEFsbG9jYXRlIHNvdW5kd2lyZSBtYXN0ZXIgZHJpdmVyIHN0cnVjdHVyZSAqLwotCXN3cm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3dyX21zdHJfY3RybCksIEdGUF9LRVJORUwpOwotCWlmICghc3dybSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9tZW1vcnlfZmFpbDsKLQl9Ci0Jc3dybS0+ZGV2ID0gJnBkZXYtPmRldjsKLQlzd3JtLT5wZGV2ID0gcGRldjsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzd3JtKTsKLQlzd3Jfc2V0X2N0cmxfZGF0YSgmc3dybS0+bWFzdGVyLCBzd3JtKTsKLQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcGRhdGEgZnJvbSBwYXJlbnQgaXMgTlVMTFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcGRhdGFfZmFpbDsKLQl9Ci0Jc3dybS0+aGFuZGxlID0gKHZvaWQgKilwZGF0YS0+aGFuZGxlOwotCWlmICghc3dybS0+aGFuZGxlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5oYW5kbGUgaXMgTlVMTFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcGRhdGFfZmFpbDsKLQl9Ci0Jc3dybS0+cmVhZCA9IHBkYXRhLT5yZWFkOwotCWlmICghc3dybS0+cmVhZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogc3dybS0+cmVhZCBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wZGF0YV9mYWlsOwotCX0KLQlzd3JtLT53cml0ZSA9IHBkYXRhLT53cml0ZTsKLQlpZiAoIXN3cm0tPndyaXRlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT53cml0ZSBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wZGF0YV9mYWlsOwotCX0KLQlzd3JtLT5idWxrX3dyaXRlID0gcGRhdGEtPmJ1bGtfd3JpdGU7Ci0JaWYgKCFzd3JtLT5idWxrX3dyaXRlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5idWxrX3dyaXRlIGlzIE5VTExcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3BkYXRhX2ZhaWw7Ci0JfQotCXN3cm0tPmNsayA9IHBkYXRhLT5jbGs7Ci0JaWYgKCFzd3JtLT5jbGspIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHN3cm0tPmNsayBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wZGF0YV9mYWlsOwotCX0KLQlzd3JtLT5yZWdfaXJxID0gcGRhdGEtPnJlZ19pcnE7Ci0JaWYgKCFzd3JtLT5yZWdfaXJxKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBzd3JtLT5yZWdfaXJxIGlzIE5VTExcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3BkYXRhX2ZhaWw7Ci0JfQotCXN3cm0tPm1hc3Rlci5yZWFkID0gc3dybV9yZWFkOwotCXN3cm0tPm1hc3Rlci53cml0ZSA9IHN3cm1fd3JpdGU7Ci0Jc3dybS0+bWFzdGVyLmJ1bGtfd3JpdGUgPSBzd3JtX2J1bGtfd3JpdGU7Ci0Jc3dybS0+bWFzdGVyLmdldF9sb2dpY2FsX2Rldl9udW0gPSBzd3JtX2dldF9sb2dpY2FsX2Rldl9udW07Ci0Jc3dybS0+bWFzdGVyLmNvbm5lY3RfcG9ydCA9IHN3cm1fY29ubmVjdF9wb3J0OwotCXN3cm0tPm1hc3Rlci5kaXNjb25uZWN0X3BvcnQgPSBzd3JtX2Rpc2Nvbm5lY3RfcG9ydDsKLQlzd3JtLT5tYXN0ZXIuc2x2ZGV2X2RhdGFwYXRoX2NvbnRyb2wgPSBzd3JtX3NsdmRldl9kYXRhcGF0aF9jb250cm9sOwotCXN3cm0tPm1hc3Rlci5yZW1vdmVfZnJvbV9ncm91cCA9IHN3cm1fcmVtb3ZlX2Zyb21fZ3JvdXA7Ci0Jc3dybS0+bWFzdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCXN3cm0tPm1hc3Rlci5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN3cm0tPm1hc3Rlci5udW1fcG9ydCA9IDA7Ci0Jc3dybS0+bnVtX2VudW1fc2xhdmVzID0gMDsKLQlzd3JtLT5yY21kX2lkID0gMDsKLQlzd3JtLT53Y21kX2lkID0gMDsKLQlzd3JtLT5zbGF2ZV9zdGF0dXMgPSAwOwotCXN3cm0tPm51bV9yeF9jaHMgPSAwOwotCXN3cm0tPmNsa19yZWZfY291bnQgPSAwOwotCXN3cm0tPnN0YXRlID0gU1dSX01TVFJfUkVTVU1FOwotCWluaXRfY29tcGxldGlvbigmc3dybS0+cmVzZXQpOwotCWluaXRfY29tcGxldGlvbigmc3dybS0+YnJvYWRjYXN0KTsKLQltdXRleF9pbml0KCZzd3JtLT5tbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnN3cm0tPm1wb3J0X2xpc3QpOwotCW11dGV4X2luaXQoJnN3cm0tPnJlc2xvY2spOwotCi0JcmV0ID0gc3dybS0+cmVnX2lycShzd3JtLT5oYW5kbGUsIHN3cl9tc3RyX2ludGVycnVwdCwgc3dybSwKLQkJCSAgICBTV1JfSVJRX1JFR0lTVEVSKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBJUlEgcmVnaXN0ZXIgZmFpbGVkIHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9pcnFfZmFpbDsKLQl9Ci0KLQlyZXQgPSBzd3JfcmVnaXN0ZXJfbWFzdGVyKCZzd3JtLT5tYXN0ZXIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGVycm9yIGFkZGluZyBzd3IgbWFzdGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX21zdHJfZmFpbDsKLQl9Ci0KLQkvKiBBZGQgZGV2aWNlcyByZWdpc3RlcmVkIHdpdGggYm9hcmQtaW5mbyBhcyB0aGUKLQkgKiBjb250cm9sbGVyIHdpbGwgYmUgdXAgbm93Ci0JICovCi0Jc3dyX21hc3Rlcl9hZGRfYm9hcmRkZXZpY2VzKCZzd3JtLT5tYXN0ZXIpOwotCW11dGV4X2xvY2soJnN3cm0tPm1sb2NrKTsKLQlzd3JtX2Nsa19yZXF1ZXN0KHN3cm0sIHRydWUpOwotCXJldCA9IHN3cm1fbWFzdGVyX2luaXQoc3dybSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBFcnJvciBpbiBtYXN0ZXIgSW5pdGlhbGl6YWl0b24sIGVyciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKLQkJZ290byBlcnJfbXN0cl9mYWlsOwotCX0KLQlzd3JtLT52ZXJzaW9uID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fQ09NUF9IV19WRVJTSU9OKTsKLQotCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOwotCi0JaWYgKHBkZXYtPmRldi5vZl9ub2RlKQotCQlvZl9yZWdpc3Rlcl9zd3JfZGV2aWNlcygmc3dybS0+bWFzdGVyKTsKLQotCWRiZ3N3cm0gPSBzd3JtOwotCWRlYnVnZnNfc3dybV9kZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKGRldl9uYW1lKCZwZGV2LT5kZXYpLCAwKTsKLQlpZiAoIUlTX0VSUihkZWJ1Z2ZzX3N3cm1fZGVudCkpIHsKLQkJZGVidWdmc19wZWVrID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3dybV9wZWVrIiwKLQkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc19zd3JtX2RlbnQsCi0JCQkJKHZvaWQgKikgInN3cm1fcGVlayIsICZzd3JtX2RlYnVnX29wcyk7Ci0KLQkJZGVidWdmc19wb2tlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3dybV9wb2tlIiwKLQkJCQlTX0lGUkVHIHwgMDQ0NCwgZGVidWdmc19zd3JtX2RlbnQsCi0JCQkJKHZvaWQgKikgInN3cm1fcG9rZSIsICZzd3JtX2RlYnVnX29wcyk7Ci0KLQkJZGVidWdmc19yZWdfZHVtcCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN3cm1fcmVnX2R1bXAiLAotCQkJCSAgIFNfSUZSRUcgfCAwNDQ0LCBkZWJ1Z2ZzX3N3cm1fZGVudCwKLQkJCQkgICAodm9pZCAqKSAic3dybV9yZWdfZHVtcCIsCi0JCQkJICAgJnN3cm1fZGVidWdfb3BzKTsKLQl9Ci0JcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJnBkZXYtPmRldiwgYXV0b19zdXNwZW5kX3RpbWVyKTsKLQlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmcGRldi0+ZGV2KTsKLQotCXJldHVybiAwOwotZXJyX21zdHJfZmFpbDoKLQlzd3JtLT5yZWdfaXJxKHN3cm0tPmhhbmRsZSwgc3dyX21zdHJfaW50ZXJydXB0LAotCQkJc3dybSwgU1dSX0lSUV9GUkVFKTsKLWVycl9pcnFfZmFpbDoKLWVycl9wZGF0YV9mYWlsOgotCWtmcmVlKHN3cm0pOwotZXJyX21lbW9yeV9mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0Jc3dybS0+cmVnX2lycShzd3JtLT5oYW5kbGUsIHN3cl9tc3RyX2ludGVycnVwdCwKLQkJCXN3cm0sIFNXUl9JUlFfRlJFRSk7Ci0JaWYgKHN3cm0tPm1zdHJfcG9ydCkgewotCQlrZnJlZShzd3JtLT5tc3RyX3BvcnQtPnBvcnQpOwotCQlzd3JtLT5tc3RyX3BvcnQtPnBvcnQgPSBOVUxMOwotCQlrZnJlZShzd3JtLT5tc3RyX3BvcnQpOwotCQlzd3JtLT5tc3RyX3BvcnQgPSBOVUxMOwotCX0KLQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZwZGV2LT5kZXYpOwotCXN3cl91bnJlZ2lzdGVyX21hc3Rlcigmc3dybS0+bWFzdGVyKTsKLQltdXRleF9kZXN0cm95KCZzd3JtLT5tbG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmc3dybS0+cmVzbG9jayk7Ci0Ja2ZyZWUoc3dybSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3dybV9jbGtfcGF1c2Uoc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0pCi17Ci0JdTMyIHZhbDsKLQotCWRldl9kYmcoc3dybS0+ZGV2LCAiJXM6IHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKLQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fSU5URVJSVVBUX01BU0tfQUREUiwgMHgxRkRGRCk7Ci0JdmFsID0gc3dybS0+cmVhZChzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0NGR19BRERSKTsKLQl2YWwgfD0gU1dSTV9NQ1BfQ0ZHX0JVU19DTEtfUEFVU0VfQk1TSzsKLQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fTUNQX0NGR19BRERSLCB2YWwpOwotCXN3cm0tPnN0YXRlID0gU1dSX01TVFJfUEFVU0U7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzd3JtX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBwbV9ydW50aW1lOiByZXN1bWUsIHN0YXRlOiVkXG4iLAotCQlfX2Z1bmNfXywgc3dybS0+c3RhdGUpOwotCW11dGV4X2xvY2soJnN3cm0tPnJlc2xvY2spOwotCWlmICgoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfUEFVU0UpIHx8Ci0JICAgIChzd3JtLT5zdGF0ZSA9PSBTV1JfTVNUUl9ET1dOKSkgewotCQlpZiAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfRE9XTikgewotCQkJaWYgKHN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgdHJ1ZSkpCi0JCQkJZ290byBleGl0OwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dyX2RldiwgJm1zdHItPmRldmljZXMsIGRldl9saXN0KSB7Ci0JCQlyZXQgPSBzd3JfZGV2aWNlX3VwKHN3cl9kZXYpOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoZGV2LAotCQkJCQkiJXM6IGZhaWxlZCB0byB3YWtldXAgc3dyIGRldiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOwotCQkJCXN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgZmFsc2UpOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCQlzd3JtLT53cml0ZShzd3JtLT5oYW5kbGUsIFNXUk1fQ09NUF9TV19SRVNFVCwgMHgwMSk7Ci0JCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DT01QX1NXX1JFU0VULCAweDAxKTsKLQkJc3dybV9tYXN0ZXJfaW5pdChzd3JtKTsKLQl9Ci1leGl0OgotCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZwZGV2LT5kZXYsIGF1dG9fc3VzcGVuZF90aW1lcik7Ci0JbXV0ZXhfdW5sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHN3cm1fcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBwbV9ydW50aW1lOiBzdXNwZW5kIHN0YXRlOiAlZFxuIiwKLQkJX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKLQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQlpZiAoKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1JFU1VNRSkgfHwKLQkgICAgKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1VQKSkgewotCQlpZiAoc3dybV9pc19wb3J0X2VuKCZzd3JtLT5tYXN0ZXIpKSB7Ci0JCQlkZXZfZGJnKGRldiwgIiVzIHBvcnRzIGFyZSBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJc3dybV9jbGtfcGF1c2Uoc3dybSk7Ci0JCXN3cm0tPndyaXRlKHN3cm0tPmhhbmRsZSwgU1dSTV9DT01QX0NGR19BRERSLCAweDAwKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywgZGV2X2xpc3QpIHsKLQkJCXJldCA9IHN3cl9kZXZpY2VfZG93bihzd3JfZGV2KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRldiwKLQkJCQkJIiVzOiBmYWlsZWQgdG8gc2h1dGRvd24gc3dyIGRldiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCQlzd3JtX2Nsa19yZXF1ZXN0KHN3cm0sIGZhbHNlKTsKLQl9Ci1leGl0OgotCW11dGV4X3VubG9jaygmc3dybS0+cmVzbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotc3RhdGljIGludCBzd3JtX2RldmljZV9kb3duKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHN3cl9tc3RyX2N0cmwgKnN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciA9ICZzd3JtLT5tYXN0ZXI7Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXY7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBzd3JtIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKLQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQlpZiAoKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1JFU1VNRSkgfHwKLQkgICAgKHN3cm0tPnN0YXRlID09IFNXUl9NU1RSX1VQKSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN3cl9kZXYsICZtc3RyLT5kZXZpY2VzLCBkZXZfbGlzdCkgewotCQkJcmV0ID0gc3dyX2RldmljZV9kb3duKHN3cl9kZXYpOwotCQkJaWYgKHJldCkKLQkJCQlkZXZfZXJyKGRldiwKLQkJCQkJIiVzOiBmYWlsZWQgdG8gc2h1dGRvd24gc3dyIGRldiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHN3cl9kZXYtPmRldl9udW0pOwotCQl9Ci0JCWRldl9kYmcoZGV2LCAiJXM6IFNodXR0aW5nIGRvd24gU1dSTVxuIiwgX19mdW5jX18pOwotCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7Ci0JCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Ci0JCXN3cm1fY2xrX3JlcXVlc3Qoc3dybSwgZmFsc2UpOwotCX0KLQltdXRleF91bmxvY2soJnN3cm0tPnJlc2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogc3dybV93Y2Rfbm90aWZ5IC0gcGFyZW50IGRldmljZSBjYW4gbm90aWZ5IHRvIHNvdW5kd2lyZSBtYXN0ZXIgdGhyb3VnaAotICogdGhpcyBmdW5jdGlvbgotICogQHBkZXY6IHBvaW50ZXIgdG8gcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZQotICogQGlkOiBjb21tYW5kIGlkIGZyb20gcGFyZW50IHRvIHRoZSBzb3VuZHdpcmUgbWFzdGVyCi0gKiBAZGF0YTogZGF0YSBmcm9tIHBhcmVudCBkZXZpY2UgdG8gc291bmR3aXJlIG1hc3RlcgotICovCi1pbnQgc3dybV93Y2Rfbm90aWZ5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHUzMiBpZCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc3dyX21zdHJfY3RybCAqc3dybTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0cjsKLQlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldjsKLQotCWlmICghcGRldikgewotCQlwcl9lcnIoIiVzOiBwZGV2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN3cm0gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpZiAoIXN3cm0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHN3cm0gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXN0ciA9ICZzd3JtLT5tYXN0ZXI7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBTV1JfQ0hfTUFQOgotCQlpZiAoIWRhdGEpIHsKLQkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IHN3cm1fc2V0X2NoX21hcChzd3JtLCBkYXRhKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNXUl9ERVZJQ0VfRE9XTjoKLQkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogc3dyIG1hc3RlciBkb3duIGNhbGxlZFxuIiwgX19mdW5jX18pOwotCQltdXRleF9sb2NrKCZzd3JtLT5tbG9jayk7Ci0JCWlmICgoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfUEFVU0UpIHx8Ci0JCSAgICAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfRE9XTikpCi0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBTV1IgbWFzdGVyIGlzIGFscmVhZHkgRG93bjogJWRcbiIsCi0JCQkJX19mdW5jX18sIHN3cm0tPnN0YXRlKTsKLQkJZWxzZQotCQkJc3dybV9kZXZpY2VfZG93bigmcGRldi0+ZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZzd3JtLT5tbG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgU1dSX0RFVklDRV9VUDoKLQkJZGV2X2RiZyhzd3JtLT5kZXYsICIlczogc3dyIG1hc3RlciB1cCBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfbG9jaygmc3dybS0+bWxvY2spOwotCQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQkJaWYgKChzd3JtLT5zdGF0ZSA9PSBTV1JfTVNUUl9SRVNVTUUpIHx8Ci0JCSAgICAoc3dybS0+c3RhdGUgPT0gU1dSX01TVFJfVVApKSB7Ci0JCQlkZXZfZGJnKHN3cm0tPmRldiwgIiVzOiBTV1IgbWFzdGVyIGlzIGFscmVhZHkgVVA6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBzd3JtLT5zdGF0ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZwZGV2LT5kZXYpOwotCQkJbXV0ZXhfdW5sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQkJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7Ci0JCQltdXRleF9sb2NrKCZzd3JtLT5yZXNsb2NrKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3dyX2RldiwgJm1zdHItPmRldmljZXMsIGRldl9saXN0KSB7Ci0JCQkJcmV0ID0gc3dyX3Jlc2V0X2RldmljZShzd3JfZGV2KTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCWRldl9lcnIoc3dybS0+ZGV2LAotCQkJCQkJIiVzOiBmYWlsZWQgdG8gcmVzZXQgc3dyIGRldmljZSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBzd3JfZGV2LT5kZXZfbnVtKTsKLQkJCQkJc3dybV9jbGtfcmVxdWVzdChzd3JtLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmcGRldi0+ZGV2KTsKLQkJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmc3dybS0+cmVzbG9jayk7Ci0JCW11dGV4X3VubG9jaygmc3dybS0+bWxvY2spOwotCQlicmVhazsKLQljYXNlIFNXUl9TRVRfTlVNX1JYX0NIOgotCQlpZiAoIWRhdGEpIHsKLQkJCWRldl9lcnIoc3dybS0+ZGV2LCAiJXM6IGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCW11dGV4X2xvY2soJnN3cm0tPm1sb2NrKTsKLQkJCXN3cm0tPm51bV9yeF9jaHMgPSAqKGludCAqKWRhdGE7Ci0JCQlpZiAoKHN3cm0tPm51bV9yeF9jaHMgPiAxKSAmJiAhc3dybS0+bnVtX2NmZ19kZXZzKSB7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywKLQkJCQkJCSAgICBkZXZfbGlzdCkgewotCQkJCQlyZXQgPSBzd3Jfc2V0X2RldmljZV9ncm91cChzd3JfZGV2LAotCQkJCQkJCQlTV1JfQlJPQURDQVNUKTsKLQkJCQkJaWYgKHJldCkKLQkJCQkJCWRldl9lcnIoc3dybS0+ZGV2LAotCQkJCQkJCSIlczogc2V0IG51bSBjaCBmYWlsZWRcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzd3JfZGV2LCAmbXN0ci0+ZGV2aWNlcywKLQkJCQkJCSAgICBkZXZfbGlzdCkgewotCQkJCQlyZXQgPSBzd3Jfc2V0X2RldmljZV9ncm91cChzd3JfZGV2LAotCQkJCQkJCQlTV1JfR1JPVVBfTk9ORSk7Ci0JCQkJCWlmIChyZXQpCi0JCQkJCQlkZXZfZXJyKHN3cm0tPmRldiwKLQkJCQkJCQkiJXM6IHNldCBudW0gY2ggZmFpbGVkXG4iLAotCQkJCQkJCV9fZnVuY19fKTsKLQkJCQl9Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJnN3cm0tPm1sb2NrKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKHN3cm0tPmRldiwgIiVzOiBzd3IgbWFzdGVyIHVua25vd24gaWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgaWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woc3dybV93Y2Rfbm90aWZ5KTsKLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBzd3JtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQgPSAtRUJVU1k7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gc3VzcGVuZCwgc3RhdGU6ICVkXG4iLCBfX2Z1bmNfXywgc3dybS0+c3RhdGUpOwotCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldikgfHwgIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpIHsKLQkJcmV0ID0gc3dybV9ydW50aW1lX3N1c3BlbmQoZGV2KTsKLQkJaWYgKCFyZXQpIHsKLQkJCS8qCi0JCQkgKiBTeW5jaHJvbml6ZSBydW50aW1lLXBtIGFuZCBzeXN0ZW0tcG0gc3RhdGVzOgotCQkJICogQXQgdGhpcyBwb2ludCwgd2UgYXJlIGFscmVhZHkgc3VzcGVuZGVkLiBJZgotCQkJICogcnVudGltZS1wbSBzdGlsbCB0aGlua3MgaXRzIGFjdGl2ZSwgdGhlbgotCQkJICogbWFrZSBzdXJlIGl0cyBzdGF0dXMgaXMgaW4gc3luYyB3aXRoIEhXCi0JCQkgKiBzdGF0dXMuIFRoZSB0aHJlZSBiZWxvdyBjYWxscyBsZXQgdGhlCi0JCQkgKiBydW50aW1lLXBtIGtub3cgdGhhdCB3ZSBhcmUgc3VzcGVuZGVkCi0JCQkgKiBhbHJlYWR5IHdpdGhvdXQgcmUtaW52b2tpbmcgdGhlIHN1c3BlbmQKLQkJCSAqIGNhbGxiYWNrCi0JCQkgKi8KLQkJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwotCQkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7Ci0JCQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwotCQl9Ci0JfQotCWlmIChyZXQgPT0gLUVCVVNZKSB7Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBzb21lIGF1ZGlvIHN0cmVhbSBpcyBhY3RpdmUKLQkJICogZHVyaW5nIHN1c3BlbmQuIFdlIGRvbnQgd2FudCB0byByZXR1cm4gc3VzcGVuZCBmYWlsdXJlIGluCi0JCSAqIHRoYXQgY2FzZSBzbyB0aGF0IGRpc3BsYXkgYW5kIHJlbGV2YW50IGNvbXBvbmVudHMgY2FuIHN0aWxsCi0JCSAqIGdvIHRvIHN1c3BlbmQuCi0JCSAqIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgZXJyb3IsIHRoZW4gaXQgc2hvdWxkIGJlIHBhc3NlZC1vbgotCQkgKiB0byBzeXN0ZW0gbGV2ZWwgc3VzcGVuZAotCQkgKi8KLQkJcmV0ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzd3JtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBzd3JfbXN0cl9jdHJsICpzd3JtID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiBzeXN0ZW0gcmVzdW1lLCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzd3JtLT5zdGF0ZSk7Ci0JaWYgKCFwbV9ydW50aW1lX2VuYWJsZWQoZGV2KSB8fCAhcG1fcnVudGltZV9zdXNwZW5kKGRldikpIHsKLQkJcmV0ID0gc3dybV9ydW50aW1lX3Jlc3VtZShkZXYpOwotCQlpZiAoIXJldCkgewotCQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOwotCQkJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzd3JtX2Rldl9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoCi0JCXN3cm1fc3VzcGVuZCwKLQkJc3dybV9yZXN1bWUKLQkpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKAotCQlzd3JtX3J1bnRpbWVfc3VzcGVuZCwKLQkJc3dybV9ydW50aW1lX3Jlc3VtZSwKLQkJTlVMTAotCSkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN3cm1fZHRfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInFjb20sc3dyLXdjZCIsCi0JfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3dyX21zdHJfZHJpdmVyID0gewotCS5wcm9iZSA9IHN3cm1fcHJvYmUsCi0JLnJlbW92ZSA9IHN3cm1fcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU1dSX1dDRF9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLnBtID0gJnN3cm1fZGV2X3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlID0gc3dybV9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc3dybV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3dyX21zdHJfZHJpdmVyKTsKLX0KLXN1YnN5c19pbml0Y2FsbChzd3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3dybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN3cl9tc3RyX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChzd3JtX2V4aXQpOwotCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiV0NEIFNvdW5kV2lyZSBDb250cm9sbGVyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOnN3ci13Y2QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL3N3ci13Y2QtY3RybC5oIGIvZHJpdmVycy9zb3VuZHdpcmUvc3dyLXdjZC1jdHJsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGFjOGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zb3VuZHdpcmUvc3dyLXdjZC1jdHJsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfU1dSX1dDRF9DVFJMX0gKLSNkZWZpbmUgX1NXUl9XQ0RfQ1RSTF9ICi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmR3aXJlL3N3ci13Y2QuaD4KLQotI2RlZmluZSBTV1JfTUFYX1JPVwkJMCAvKiBSb3dzID0gNDggKi8KLSNkZWZpbmUgU1dSX01BWF9DT0wJCTcgLyogQ29scyA9IDE2ICovCi0jZGVmaW5lIFNXUl9NSU5fQ09MCQkwIC8qIENvbHMgPSAyICovCi0KLSNkZWZpbmUgU1dSX1dDRF9OQU1FCSJzd3Itd2NkIgotCi0jZGVmaW5lIFNXUl9NU1RSX1BPUlRfTEVOCTggLyogTnVtYmVyIG9mIG1hc3RlciBwb3J0cyAqLwotCi0jZGVmaW5lIFNXUk1fVkVSU0lPTl8xXzAgMHgwMTAxMDAwMAotI2RlZmluZSBTV1JNX1ZFUlNJT05fMV8yIDB4MDEwMzAwMDAKLSNkZWZpbmUgU1dSTV9WRVJTSU9OXzFfMyAweDAxMDQwMDAwCi0KLWVudW0gewotCVNXUl9NU1RSX1BBVVNFLAotCVNXUl9NU1RSX1JFU1VNRSwKLQlTV1JfTVNUUl9VUCwKLQlTV1JfTVNUUl9ET1dOLAotfTsKLQotZW51bSB7Ci0JU1dSX0lSUV9GUkVFLAotCVNXUl9JUlFfUkVHSVNURVIsCi19OwotCi1lbnVtIHsKLQlTV1JfREFDX1BPUlQsCi0JU1dSX0NPTVBfUE9SVCwKLQlTV1JfQk9PU1RfUE9SVCwKLQlTV1JfVklTRU5TRV9QT1JULAotfTsKLQotc3RydWN0IHVzZWNhc2UgewotCXU4IG51bV9wb3J0OwotCXU4IG51bV9jaDsKLQl1MzIgY2hyYXRlOwotfTsKLQotc3RydWN0IHBvcnRfcGFyYW1zIHsKLQl1OCBzaTsKLQl1OCBvZmYxOwotCXU4IG9mZjI7Ci19OwotCi1zdHJ1Y3Qgc3dybV9tcG9ydHMgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1OCBpZDsKLX07Ci0KLXN0cnVjdCBzd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHsKLQl2b2lkICpoYW5kbGU7IC8qIGhvbGRzIHByaXYgZGF0YSAqLwotCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7Ci0JaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7Ci0JaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOwotCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0JaW50ICgqcmVnX2lycSkodm9pZCAqaGFuZGxlLCBpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpKGludCBpcnEsCi0JCQl2b2lkICpkYXRhKSwgdm9pZCAqc3dyX2hhbmRsZSwgaW50IHR5cGUpOwotfTsKLQotc3RydWN0IHN3cl9tc3RyX2N0cmwgewotCXN0cnVjdCBzd3JfbWFzdGVyIG1hc3RlcjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHJlc291cmNlICpzdXBwbGllczsKLQlzdHJ1Y3QgY2xrICptY2xrOwotCWludCBjbGtfcmVmX2NvdW50OwotCXN0cnVjdCBjb21wbGV0aW9uIHJlc2V0OwotCXN0cnVjdCBjb21wbGV0aW9uIGJyb2FkY2FzdDsKLQlzdHJ1Y3QgbXV0ZXggbWxvY2s7Ci0Jc3RydWN0IG11dGV4IHJlc2xvY2s7Ci0JdTggcmNtZF9pZDsKLQl1OCB3Y21kX2lkOwotCXZvaWQgKmhhbmRsZTsgLyogU1dSIE1hc3RlciBoYW5kbGUgZnJvbSBjbGllbnQgZm9yIHJlYWQgYW5kIHdyaXRlcyAqLwotCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7Ci0JaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7Ci0JaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOwotCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0JaW50ICgqcmVnX2lycSkodm9pZCAqaGFuZGxlLCBpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpKGludCBpcnEsCi0JCQl2b2lkICpkYXRhKSwgdm9pZCAqc3dyX2hhbmRsZSwgaW50IHR5cGUpOwotCWludCBpcnE7Ci0JaW50IHZlcnNpb247Ci0JaW50IG51bV9lbnVtX3NsYXZlczsKLQlpbnQgc2xhdmVfc3RhdHVzOwotCXN0cnVjdCBzd3JfbXN0cl9wb3J0ICptc3RyX3BvcnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtcG9ydF9saXN0OwotCWludCBzdGF0ZTsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCWludCBudW1fcnhfY2hzOwotCXU4IG51bV9jZmdfZGV2czsKLX07Ci0KLSNlbmRpZiAvKiBfU1dSX1dDRF9DVFJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc291bmR3aXJlL3N3cm1fcmVnaXN0ZXJzLmggYi9kcml2ZXJzL3NvdW5kd2lyZS9zd3JtX3JlZ2lzdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMzZWNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc291bmR3aXJlL3N3cm1fcmVnaXN0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfU1dSTV9SRUdJU1RFUlNfSAotI2RlZmluZSBfU1dSTV9SRUdJU1RFUlNfSAotCi0jZGVmaW5lIFNXUk1fQkFTRV9BRERSRVNTCQkJCTB4MDAKLQotI2RlZmluZSBTV1JNX0NPTVBfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgIFNXUk1fQkFTRV9BRERSRVNTCi0jZGVmaW5lIFNXUk1fQ09NUF9DRkdfQUREUgkJCShTV1JNX0JBU0VfQUREUkVTUysweDAwMDAwMDA0KQotI2RlZmluZSBTV1JNX0NPTVBfQ0ZHX1JNU0sJCQkJMHgzCi0jZGVmaW5lIFNXUk1fQ09NUF9DRkdfSVJRX0xFVkVMX09SX1BVTFNFX0JNU0sJCTB4MgotI2RlZmluZSBTV1JNX0NPTVBfQ0ZHX0lSUV9MRVZFTF9PUl9QVUxTRV9TSEZUCQkweDEKLSNkZWZpbmUgU1dSTV9DT01QX0NGR19FTkFCTEVfQk1TSwkJCTB4MQotI2RlZmluZSBTV1JNX0NPTVBfQ0ZHX0VOQUJMRV9TSEZUCQkJMHgwCi0KLSNkZWZpbmUgU1dSTV9DT01QX1NXX1JFU0VUCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDAwOCkKLQotI2RlZmluZSBTV1JNX0NPTVBfUEFSQU1TCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgxMDApCi0jZGVmaW5lIFNXUk1fQ09NUF9QQVJBTVNfRE9VVF9QT1JUU19NQVNLCTB4MDAwMDAwMUYKLSNkZWZpbmUgU1dSTV9DT01QX1BBUkFNU19ESU5fUE9SVFNfTUFTSwkJMHgwMDAwMDNFMAotI2RlZmluZSBTV1JNX0NPTVBfUEFSQU1TX1dSX0ZJRk9fREVQVEgJCTB4MDAwMDdDMDAKLSNkZWZpbmUgU1dSTV9DT01QX1BBUkFNU19SRF9GSUZPX0RFUFRICQkweDAwMEY4MDAwCi0jZGVmaW5lIFNXUk1fQ09NUF9QQVJBTVNfQVVUT19FTlVNX1NMQVZFUwkweDAwRjAwMDAwCi0jZGVmaW5lIFNXUk1fQ09NUF9QQVJBTVNfREFUQV9MQU5FUwkJMHgwNzAwMDAwMAotCi0KLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDIwMCkKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JNU0sJCTB4MUZGRkQKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfU0xBVkVfUEVORF9JUlEJCQkweDEKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX05FV19TTEFWRV9BVFRBQ0hFRAkJMHgyCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19DSEFOR0VfRU5VTV9TTEFWRV9TVEFUVVMJCTB4NAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfTUFTVEVSX0NMQVNIX0RFVAkJCTB4OAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfUkRfRklGT19PVkVSRkxPVwkJCTB4MTAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1JEX0ZJRk9fVU5ERVJGTE9XCQkJMHgyMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfV1JfQ01EX0ZJRk9fT1ZFUkZMT1cJCTB4NDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0NNRF9FUlJPUgkJCQkweDgwCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19ET1VUX1BPUlRfQ09MTElTSU9OCQkweDEwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfUkVBRF9FTl9SRF9WQUxJRF9NSVNNQVRDSAkJMHgyMDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX1NQRUNJQUxfQ01EX0lEX0ZJTklTSEVECQkweDQwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfTkVXX1NMQVZFX0FVVE9fRU5VTV9GSU5JU0hFRAkweDgwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQVVUT19FTlVNX0ZBSUxFRAkJCTB4MTAwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQVVUT19FTlVNX1RBQkxFX0lTX0ZVTEwJCTB4MjAwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9TVEFUVVNfQlVTX1JFU0VUX0ZJTklTSEVECQkweDQwMDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfU1RBVFVTX0NMS19TVE9QX0ZJTklTSEVECQkJMHg4MDAwCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX1NUQVRVU19FUlJPUl9QT1JUX1RFU1QJCQkweDEwMDAwCi0KLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19BRERSCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDIwNCkKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19STVNLCQkweDFGRkZGCi0KLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19TTEFWRV9QRU5EX0lSUV9CTVNLCQkJMHgxCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfU0xBVkVfUEVORF9JUlFfU0hGVAkJCTB4MAotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfTkVXX1NMQVZFX0FUVEFDSEVEX0JNU0sJCTB4MgotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX05FV19TTEFWRV9BVFRBQ0hFRF9TSEZUCQkweDEKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NIQU5HRV9FTlVNX1NMQVZFX1NUQVRVU19CTVNLCTB4NAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NIQU5HRV9FTlVNX1NMQVZFX1NUQVRVU19TSEZUCTB4MgotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfTUFTVEVSX0NMQVNIX0RFVF9CTVNLCQkweDgKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19NQVNURVJfQ0xBU0hfREVUX1NIRlQJCTB4MwotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfUkRfRklGT19PVkVSRkxPV19CTVNLCQkweDEwCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfUkRfRklGT19PVkVSRkxPV19TSEZUCQkweDQKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1JEX0ZJRk9fVU5ERVJGTE9XX0JNU0sJCTB4MjAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19SRF9GSUZPX1VOREVSRkxPV19TSEZUCQkweDUKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1dSX0NNRF9GSUZPX09WRVJGTE9XX0JNU0sJCTB4NDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19XUl9DTURfRklGT19PVkVSRkxPV19TSEZUCQkweDYKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NNRF9FUlJPUl9CTVNLCQkJMHg4MAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NNRF9FUlJPUl9TSEZUCQkJMHg3Ci0KLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19ET1VUX1BPUlRfQ09MTElTSU9OX0JNU0sJCTB4MTAwCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfRE9VVF9QT1JUX0NPTExJU0lPTl9TSEZUCQkweDgKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1JFQURfRU5fUkRfVkFMSURfTUlTTUFUQ0hfQk1TSwkweDIwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1JFQURfRU5fUkRfVkFMSURfTUlTTUFUQ0hfU0hGVAkweDkKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX1NQRUNJQUxfQ01EX0lEX0ZJTklTSEVEX0JNU0sJMHg0MDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19TUEVDSUFMX0NNRF9JRF9GSU5JU0hFRF9TSEZUCTB4QQotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfTkVXX1NMQVZFX0FVVE9fRU5VTV9GSU5JU0hFRF9CTVNLCTB4ODAwCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfTkVXX1NMQVZFX0FVVE9fRU5VTV9GSU5JU0hFRF9TSEZUCTB4QgotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQVVUT19FTlVNX0ZBSUxFRF9CTVNLCQkweDEwMDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19BVVRPX0VOVU1fRkFJTEVEX1NIRlQJCTB4QwotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQVVUT19FTlVNX1RBQkxFX0lTX0ZVTExfQk1TSwkweDIwMDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19BVVRPX0VOVU1fVEFCTEVfSVNfRlVMTF9TSEZUCTB4RAotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfQlVTX1JFU0VUX0ZJTklTSEVEX0JNU0sJCTB4NDAwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0JVU19SRVNFVF9GSU5JU0hFRF9TSEZUCQkweEUKLQotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NMS19TVE9QX0ZJTklTSEVEX0JNU0sJCTB4ODAwMAotI2RlZmluZSBTV1JNX0lOVEVSUlVQVF9NQVNLX0NMS19TVE9QX0ZJTklTSEVEX1NIRlQJCTB4RgotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BU0tfRVJST1JfUE9SVF9URVNUX0JNU0sJCTB4MTAwMDAKLSNkZWZpbmUgU1dSTV9JTlRFUlJVUFRfTUFTS19FUlJPUl9QT1JUX1RFU1RfU0hGVAkJMHgxMAotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX01BWAkJCQkJMHgxMQotCi0jZGVmaW5lIFNXUk1fSU5URVJSVVBUX0NMRUFSCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDIwOCkKLQotI2RlZmluZSBTV1JNX0NNRF9GSUZPX1dSX0NNRAkJKFNXUk1fQkFTRV9BRERSRVNTICsgMHgwMDAwMDMwMCkKLSNkZWZpbmUgU1dSTV9DTURfRklGT19XUl9DTURfTUFTSwkweEZGRkZGRkZGCi0jZGVmaW5lIFNXUk1fQ01EX0ZJRk9fUkRfQ01ECQkoU1dSTV9CQVNFX0FERFJFU1MgKyAweDAwMDAwMzA0KQotI2RlZmluZSBTV1JNX0NNRF9GSUZPX1JEX0NNRF9NQVNLCTB4RkZGRkZGRgotI2RlZmluZSBTV1JNX0NNRF9GSUZPX0NNRAkJKFNXUk1fQkFTRV9BRERSRVNTICsgMHgwMDAwMDMwOCkKLSNkZWZpbmUgU1dSTV9DTURfRklGT19TVEFUVVMJCShTV1JNX0JBU0VfQUREUkVTUyArIDB4MDAwMDAzMEMpCi0KLSNkZWZpbmUgU1dSTV9DTURfRklGT19TVEFUVVNfV1JfQ01EX0ZJRk9fQ05UX01BU0sJMHgxRjAwCi0jZGVmaW5lIFNXUk1fQ01EX0ZJRk9fU1RBVFVTX1JEX0NNRF9GSUZPX0NOVF9NQVNLCTB4N0MwMDAwMAotCi0jZGVmaW5lIFNXUk1fQ01EX0ZJRk9fQ0ZHX0FERFIJCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMDMxNCkKLSNkZWZpbmUgU1dSTV9DTURfRklGT19DRkdfTlVNX09GX0NNRF9SRVRSWV9CTVNLCQkweDcKLSNkZWZpbmUgU1dSTV9DTURfRklGT19DRkdfTlVNX09GX0NNRF9SRVRSWV9TSEZUCQkweDAKLQotI2RlZmluZSBTV1JNX0NNRF9GSUZPX1JEX0ZJRk9fQUREUgkoU1dSTV9CQVNFX0FERFJFU1MgKyAweDAwMDAwMzE4KQotCi0jZGVmaW5lIFNXUk1fRU5VTUVSQVRPUl9DRkdfQUREUgkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDA1MDApCi0jZGVmaW5lIFNXUk1fRU5VTUVSQVRPUl9DRkdfQVVUT19FTlVNX0VOX0JNU0sJCTB4MQotI2RlZmluZSBTV1JNX0VOVU1FUkFUT1JfQ0ZHX0FVVE9fRU5VTV9FTl9TSEZUCQkweDAKLQotI2RlZmluZSBTV1JNX0VOVU1FUkFUT1JfU0xBVkVfREVWX0lEXzEobSkgICAoU1dSTV9CQVNFX0FERFJFU1MrMHg1MzArMHg4Km0pCi0jZGVmaW5lIFNXUk1fRU5VTUVSQVRPUl9TTEFWRV9ERVZfSURfMihtKSAgIChTV1JNX0JBU0VfQUREUkVTUysweDUzNCsweDgqbSkKLQotI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfQUREUihtKSAgICAoU1dSTV9CQVNFX0FERFJFU1MrMHgxMDFDKzB4NDAqbSkKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1JNU0sJCQkweDAwZmYwN2ZmCi0jZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19TSEZUCQkJMAotI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfU1NQX1BFUklPRF9CTVNLCTB4ZmYwMDAwCi0jZGVmaW5lIFNXUk1fTUNQX0ZSQU1FX0NUUkxfQkFOS19TU1BfUEVSSU9EX1NIRlQJMTYKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1BIQVNFX0JNU0sJCTB4ZjgwMAotI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfUEhBU0VfU0hGVAkJMTEKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0NMS19ESVZfVkFMVUVfQk1TSwkweDcwMAotI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfQ0xLX0RJVl9WQUxVRV9TSEZUCTgKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1JPV19DVFJMX0JNU0sJCTB4RjgKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX1JPV19DVFJMX1NIRlQJCTMKLSNkZWZpbmUgU1dSTV9NQ1BfRlJBTUVfQ1RSTF9CQU5LX0NPTF9DVFJMX0JNU0sJCTB4NwotI2RlZmluZSBTV1JNX01DUF9GUkFNRV9DVFJMX0JBTktfQ09MX0NUUkxfU0hGVAkJMAotCi0jZGVmaW5lIFNXUk1fTUNQX0JVU19DVFJMX0FERFIJCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgwMDAwMTA0NCkKLSNkZWZpbmUgU1dSTV9NQ1BfQlVTX0NUUkxfQlVTX1JFU0VUX0JNU0sJCTB4MQotI2RlZmluZSBTV1JNX01DUF9CVVNfQ1RSTF9CVVNfUkVTRVRfU0hGVAkJMHgwCi0jZGVmaW5lIFNXUk1fTUNQX0JVU19DVFJMX0NMS19TVEFSVF9CTVNLCQkweDIKLSNkZWZpbmUgU1dSTV9NQ1BfQlVTX0NUUkxfQ0xLX1NUQVJUX1NIRlQJCTB4MQotCi0jZGVmaW5lIFNXUk1fTUNQX0NGR19BRERSCQkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MDAwMDEwNDgpCi0jZGVmaW5lIFNXUk1fTUNQX0NGR19NQVhfTlVNX09GX0NNRF9OT19QSU5HU19CTVNLCTB4M0UwMDAwCi0jZGVmaW5lIFNXUk1fTUNQX0NGR19NQVhfTlVNX09GX0NNRF9OT19QSU5HU19TSEZUCTB4MTEKLSNkZWZpbmUgU1dSTV9NQ1BfQ0ZHX0JVU19DTEtfUEFVU0VfQk1TSwkJCTB4MDIKLQotI2RlZmluZSBTV1JNX01DUF9TVEFUVVMJCQkoU1dSTV9CQVNFX0FERFJFU1MrMHgxMDRDKQotI2RlZmluZSBTV1JNX01DUF9TVEFUVVNfQkFOS19OVU1fTUFTSwkweDAxCi0KLSNkZWZpbmUgU1dSTV9NQ1BfU0xWX1NUQVRVUwkJKFNXUk1fQkFTRV9BRERSRVNTKzB4MTA5MCkKLSNkZWZpbmUgU1dSTV9NQ1BfU0xWX1NUQVRVU19NQVNLCTB4MDMKLQotI2RlZmluZSBTV1JNX0RQX1BPUlRfQ1RSTF9CQU5LKG4sIG0pCQkoU1dSTV9CQVNFX0FERFJFU1MgKyBcCi0JCQkJCQkJMHgwMDAwMTEyNCArIFwKLQkJCQkJCQkweDEwMCoobi0xKSArIFwKLQkJCQkJCQkweDQwKm0pCi0jZGVmaW5lIFNXUk1fRFBfUE9SVF9DVFJMX0JBTktfTUFTSwkJMHhGRkZGRkZGRgotI2RlZmluZSBTV1JNX0RQX1BPUlRfQ1RSTF9FTl9DSEFOX01BU0sJCTB4RkYwMDAwMDAKLSNkZWZpbmUgU1dSTV9EUF9QT1JUX0NUUkxfRU5fQ0hBTl9TSEZUCQkweDE4Ci0jZGVmaW5lIFNXUk1fRFBfUE9SVF9DVFJMX09GRlNFVDJfU0hGVAkJMHgxMAotI2RlZmluZSBTV1JNX0RQX1BPUlRfQ1RSTF9PRkZTRVQxX1NIRlQJCTB4MDgKLSNkZWZpbmUgU1dSTV9EUF9QT1JUX0NUUkxfU0FNUExFX0lOVEVSVkFMCTB4MDAKLQotLyogU291bmR3aXJlIFNsYXZlIFJlZ2lzdGVyIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBTV1JTX0JBU0VfQUREUkVTUwkJCTB4MDAKLQotI2RlZmluZSBTV1JTX0RQX1JFR19PRkZTRVQocG9ydCwgYmFuaykJCSgoMHgxMDAqcG9ydCkrKDB4MTAqYmFuaykpCi0KLSNkZWZpbmUgU1dSU19EUF9DSEFOTkVMX0VOQUJMRV9CQU5LKG4sIG0pCShTV1JTX0JBU0VfQUREUkVTUyArIDB4MTIwICsgXAotCQkJCQkJIFNXUlNfRFBfUkVHX09GRlNFVChuLCBtKSkKLSNkZWZpbmUgU1dSU19EUF9TQU1QTEVfQ09OVFJPTF8xX0JBTksobiwgbSkJKFNXUlNfQkFTRV9BRERSRVNTICsgMHgxMjIgKyBcCi0JCQkJCQkgU1dSU19EUF9SRUdfT0ZGU0VUKG4sIG0pKQotI2RlZmluZSBTV1JTX0RQX09GRlNFVF9DT05UUk9MXzFfQkFOSyhuLCBtKQkoU1dSU19CQVNFX0FERFJFU1MgKyAweDEyNCArIFwKLQkJCQkJCSBTV1JTX0RQX1JFR19PRkZTRVQobiwgbSkpCi0jZGVmaW5lIFNXUlNfRFBfT0ZGU0VUX0NPTlRST0xfMl9CQU5LKG4sIG0pCShTV1JTX0JBU0VfQUREUkVTUyArIDB4MTI1ICsgXAotCQkJCQkJIFNXUlNfRFBfUkVHX09GRlNFVChuLCBtKSkKLSNkZWZpbmUgU1dSU19EUF9IQ09OVFJPTF9CQU5LKG4sIG0pCQkoU1dSU19CQVNFX0FERFJFU1MgKyAweDEyNiArIFwKLQkJCQkJCSBTV1JTX0RQX1JFR19PRkZTRVQobiwgbSkpCi0jZGVmaW5lIFNXUlNfRFBfQkxPQ0tfQ09OVFJPTF8zX0JBTksobiwgbSkJKFNXUlNfQkFTRV9BRERSRVNTICsgMHgxMjcgKyBcCi0JCQkJCQkgU1dSU19EUF9SRUdfT0ZGU0VUKG4sIG0pKQotI2RlZmluZSBTV1JTX1NDUF9GUkFNRV9DVFJMX0JBTksobSkJCShTV1JTX0JBU0VfQUREUkVTUyArIDB4NjAgKyBcCi0JCQkJCQkgMHgxMCptKQotI2RlZmluZSBTV1JTX1NDUF9IT1NUX0NMS19ESVYyX0NUTF9CQU5LKG0pCShTV1JTX0JBU0VfQUREUkVTUyArIDB4RTAgKyBcCi0JCQkJCQkweDEwKm0pCi0KLSNlbmRpZiAvKiBfU1dSTV9SRUdJU1RFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQppbmRleCA5ZDcyZjM3Li5jMzBiMTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAtMTAzLDMgKzEwMyw1IEBACiBvYmotJChDT05GSUdfU1BJX1hMUCkJCQkrPSBzcGkteGxwLm8KIG9iai0kKENPTkZJR19TUElfWFRFTlNBX1hURlBHQSkJCSs9IHNwaS14dGVuc2EteHRmcGdhLm8KIG9iai0kKENPTkZJR19TUElfWllOUU1QX0dRU1BJKQkJKz0gc3BpLXp5bnFtcC1ncXNwaS5vCitvYmotJChDT05GSUdfU1BJX1FTRCkJCQkrPSBzcGlfcXNkLm8KK29iai0kKENPTkZJR19TUElfUVVQKQkJCSs9IHNwaV9xc2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF4aS1zcGktZW5naW5lLmMgYi9kcml2ZXJzL3NwaS9zcGktYXhpLXNwaS1lbmdpbmUuYwppbmRleCAyYjE0NTZlLi5jMWVhZmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXhpLXNwaS1lbmdpbmUuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXhpLXNwaS1lbmdpbmUuYwpAQCAtNDk0LDcgKzQ5NCw4IEBACiAJCQlTUElfRU5HSU5FX1ZFUlNJT05fTUFKT1IodmVyc2lvbiksCiAJCQlTUElfRU5HSU5FX1ZFUlNJT05fTUlOT1IodmVyc2lvbiksCiAJCQlTUElfRU5HSU5FX1ZFUlNJT05fUEFUQ0godmVyc2lvbikpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcHV0X21hc3RlcjsKIAl9CiAKIAlzcGlfZW5naW5lLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInNfYXhpX2FjbGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKaW5kZXggMjc5NjBlNC4uYzQyMjZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKQEAgLTEwNyw3ICsxMDcsMTAgQEAKIAogc3RhdGljIGludCBkd19zcGlfZGVidWdmc19pbml0KHN0cnVjdCBkd19zcGkgKmR3cykKIHsKLQlkd3MtPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImR3X3NwaSIsIE5VTEwpOworCWNoYXIgbmFtZVsxMjhdOworCisJc25wcmludGYobmFtZSwgMTI4LCAiZHdfc3BpLSVzIiwgZGV2X25hbWUoJmR3cy0+bWFzdGVyLT5kZXYpKTsKKwlkd3MtPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgTlVMTCk7CiAJaWYgKCFkd3MtPmRlYnVnZnMpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZ2VuaS1xY29tLmMgYi9kcml2ZXJzL3NwaS9zcGktZ2VuaS1xY29tLmMKaW5kZXggNmFjYjczMS4uOGRjNDJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWdlbmktcWNvbS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1nZW5pLXFjb20uYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Fjb20tZ2VuaS1zZS5oPgogI2luY2x1ZGUgPGxpbnV4L21zbV9ncGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS1nZW5pLXFjb20uaD4KIAogI2RlZmluZSBTUElfTlVNX0NISVBTRUxFQ1QJKDQpCiAjZGVmaW5lIFNQSV9YRkVSX1RJTUVPVVRfTVMJKDI1MCkKQEAgLTY3LDYgKzY4LDExIEBACiAvKiBTUElfVFgvU1BJX1JYX1RSQU5TX0xFTiBmaWVsZHMgKi8KICNkZWZpbmUgVFJBTlNfTEVOX01TSwkJKEdFTk1BU0soMjMsIDApKQogCisvKiBTRV9TUElfREVMQVlfQ09VTlRFUlMgKi8KKyNkZWZpbmUgU1BJX0lOVEVSX1dPUkRTX0RFTEFZX01TSwkoR0VOTUFTSyg5LCAwKSkKKyNkZWZpbmUgU1BJX0NTX0NMS19ERUxBWV9NU0sJCShHRU5NQVNLKDE5LCAxMCkpCisjZGVmaW5lIFNQSV9DU19DTEtfREVMQVlfU0hGVAkJKDEwKQorCiAvKiBNX0NNRCBPUCBjb2RlcyBmb3IgU1BJICovCiAjZGVmaW5lIFNQSV9UWF9PTkxZCQkoMSkKICNkZWZpbmUgU1BJX1JYX09OTFkJCSgyKQpAQCAtMTkyLDE2ICsxOTgsMjYgQEAKIHN0YXRpYyB2b2lkIHNwaV9zZXR1cF93b3JkX2xlbihzdHJ1Y3Qgc3BpX2dlbmlfbWFzdGVyICptYXMsIHUzMiBtb2RlLAogCQkJCQkJaW50IGJpdHNfcGVyX3dvcmQpCiB7Ci0JaW50IHBhY2tfd29yZHMgPSAwOworCWludCBwYWNrX3dvcmRzID0gMTsKIAlib29sIG1zYl9maXJzdCA9IChtb2RlICYgU1BJX0xTQl9GSVJTVCkgPyBmYWxzZSA6IHRydWU7CiAJdTMyIHdvcmRfbGVuID0gZ2VuaV9yZWFkX3JlZyhtYXMtPmJhc2UsIFNFX1NQSV9XT1JEX0xFTik7CisJdW5zaWduZWQgbG9uZyBjZmcwLCBjZmcxOwogCisJLyoKKwkgKiBJZiBiaXRzX3Blcl93b3JkIGlzbid0IGEgYnl0ZSBhbGlnbmVkIHZhbHVlLCBzZXQgdGhlIHBhY2tpbmcgdG8gYmUKKwkgKiAxIFNQSSB3b3JkIHBlciBGSUZPIHdvcmQuCisJICovCiAJaWYgKCEobWFzLT50eF9maWZvX3dpZHRoICUgYml0c19wZXJfd29yZCkpCiAJCXBhY2tfd29yZHMgPSBtYXMtPnR4X2ZpZm9fd2lkdGggLyBiaXRzX3Blcl93b3JkOwogCXdvcmRfbGVuICY9IH5XT1JEX0xFTl9NU0s7CiAJd29yZF9sZW4gfD0gKChiaXRzX3Blcl93b3JkIC0gTUlOX1dPUkRfTEVOKSAmIFdPUkRfTEVOX01TSyk7CiAJc2VfY29uZmlnX3BhY2tpbmcobWFzLT5iYXNlLCBiaXRzX3Blcl93b3JkLCBwYWNrX3dvcmRzLCBtc2JfZmlyc3QpOwogCWdlbmlfd3JpdGVfcmVnKHdvcmRfbGVuLCBtYXMtPmJhc2UsIFNFX1NQSV9XT1JEX0xFTik7CisJc2VfZ2V0X3BhY2tpbmdfY29uZmlnKGJpdHNfcGVyX3dvcmQsIHBhY2tfd29yZHMsIG1zYl9maXJzdCwKKwkJCQkJCQkmY2ZnMCwgJmNmZzEpOworCUdFTklfU0VfREJHKG1hcy0+aXBjLCBmYWxzZSwgbWFzLT5kZXYsCisJCSIlczogY2ZnMCAlbHUgY2ZnMSAlbHUgYnB3ICVkIHBhY2tfd29yZHMgJWRcbiIsIF9fZnVuY19fLAorCQljZmcwLCBjZmcxLCBiaXRzX3Blcl93b3JkLCBwYWNrX3dvcmRzKTsKIH0KIAogc3RhdGljIGludCBzZXR1cF9maWZvX3BhcmFtcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX3NsdiwKQEAgLTIxOSw2ICsyMzUsOCBAQAogCWludCByZXQgPSAwOwogCWludCBpZHg7CiAJaW50IGRpdjsKKwlzdHJ1Y3Qgc3BpX2dlbmlfcWNvbV9jdHJsX2RhdGEgKmRlbGF5X3BhcmFtcyA9IE5VTEw7CisJdTMyIHNwaV9kZWxheV9wYXJhbXMgPSAwOwogCiAJbG9vcGJhY2tfY2ZnICY9IH5MT09QQkFDS19NU0s7CiAJY3BvbCAmPSB+Q1BPTDsKQEAgLTIzNiw2ICsyNTQsMjIgQEAKIAlpZiAoc3BpX3Nsdi0+bW9kZSAmIFNQSV9DU19ISUdIKQogCQlkZW11eF9vdXRwdXRfaW52IHw9IEJJVChzcGlfc2x2LT5jaGlwX3NlbGVjdCk7CiAKKwlpZiAoc3BpX3Nsdi0+Y29udHJvbGxlcl9kYXRhKSB7CisJCXUzMiBjc19jbGtfZGVsYXkgPSAwOworCQl1MzIgaW50ZXJfd29yZHNfZGVsYXkgPSAwOworCisJCWRlbGF5X3BhcmFtcyA9CisJCShzdHJ1Y3Qgc3BpX2dlbmlfcWNvbV9jdHJsX2RhdGEgKikgc3BpX3Nsdi0+Y29udHJvbGxlcl9kYXRhOworCQljc19jbGtfZGVsYXkgPQorCQkoZGVsYXlfcGFyYW1zLT5zcGlfY3NfY2xrX2RlbGF5IDw8IFNQSV9DU19DTEtfREVMQVlfU0hGVCkKKwkJCQkJCQkmIFNQSV9DU19DTEtfREVMQVlfTVNLOworCQlpbnRlcl93b3Jkc19kZWxheSA9CisJCQlkZWxheV9wYXJhbXMtPnNwaV9pbnRlcl93b3Jkc19kZWxheSAmCisJCQkJCQlTUElfSU5URVJfV09SRFNfREVMQVlfTVNLOworCQlzcGlfZGVsYXlfcGFyYW1zID0KKwkJKGludGVyX3dvcmRzX2RlbGF5IHwgY3NfY2xrX2RlbGF5KTsKKwl9CisKIAlkZW11eF9zZWwgPSBzcGlfc2x2LT5jaGlwX3NlbGVjdDsKIAltYXMtPmN1cl9zcGVlZF9oeiA9IHNwaV9zbHYtPm1heF9zcGVlZF9oejsKIAltYXMtPmN1cl93b3JkX2xlbiA9IHNwaV9zbHYtPmJpdHNfcGVyX3dvcmQ7CkBAIC0yNTcsNiArMjkxLDEzIEBACiAJZ2VuaV93cml0ZV9yZWcoZGVtdXhfb3V0cHV0X2ludiwgbWFzLT5iYXNlLCBTRV9TUElfREVNVVhfT1VUUFVUX0lOVik7CiAJZ2VuaV93cml0ZV9yZWcoY2xrX3NlbCwgbWFzLT5iYXNlLCBTRV9HRU5JX0NMS19TRUwpOwogCWdlbmlfd3JpdGVfcmVnKG1fY2xrX2NmZywgbWFzLT5iYXNlLCBHRU5JX1NFUl9NX0NMS19DRkcpOworCWdlbmlfd3JpdGVfcmVnKHNwaV9kZWxheV9wYXJhbXMsIG1hcy0+YmFzZSwgU0VfU1BJX0RFTEFZX0NPVU5URVJTKTsKKwlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkiJXM6TG9vcGJhY2slZCBkZW11eF9zZWwweCV4IGRlbXV4X29wX2ludiAweCV4IGNsa19jZmcgMHgleFxuIiwKKwkJX19mdW5jX18sIGxvb3BiYWNrX2NmZywgZGVtdXhfc2VsLCBkZW11eF9vdXRwdXRfaW52LCBtX2Nsa19jZmcpOworCUdFTklfU0VfREJHKG1hcy0+aXBjLCBmYWxzZSwgbWFzLT5kZXYsCisJCSIlczpjbGtfc2VsIDB4JXggY3BvbCAlZCBjcGhhICVkIGRlbGF5IDB4JXhcbiIsIF9fZnVuY19fLAorCQkJCQljbGtfc2VsLCBjcG9sLCBjcGhhLCBzcGlfZGVsYXlfcGFyYW1zKTsKIAkvKiBFbnN1cmUgbWVzc2FnZSBsZXZlbCBhdHRyaWJ1dGVzIGFyZSB3cml0dGVuIGJlZm9yZSByZXR1cm5pbmcgKi8KIAltYigpOwogc2V0dXBfZmlmb19wYXJhbXNfZXhpdDoKQEAgLTI4Miw3ICszMjMsNyBAQAogCSAqLwogCWlmIChmaWZvX2Rpc2FibGUgJiYgIWRtYV9jaGFuX3ZhbGlkKQogCQltb2RlID0gLUVJTlZBTDsKLQllbHNlIGlmIChmaWZvX2Rpc2FibGUpCisJZWxzZSBpZiAoZG1hX2NoYW5fdmFsaWQpCiAJCW1vZGUgPSBHU0lfRE1BOwogCWVsc2UKIAkJbW9kZSA9IEZJRk9fTU9ERTsKQEAgLTI5MCw3ICszMzEsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1zbV9ncGlfdHJlICpzZXR1cF9jb25maWcwX3RyZShzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLAotCQkJCXN0cnVjdCBzcGlfZ2VuaV9tYXN0ZXIgKm1hcywgdTE2IG1vZGUpCisJCQkJc3RydWN0IHNwaV9nZW5pX21hc3RlciAqbWFzLCB1MTYgbW9kZSwKKwkJCQl1MzIgY3NfY2xrX2RlbGF5LCB1MzIgaW50ZXJfd29yZHNfZGVsYXkpCiB7CiAJc3RydWN0IG1zbV9ncGlfdHJlICpjMF90cmUgPSAmbWFzLT5nc2lbbWFzLT5udW1feGZlcnNdLmNvbmZpZzBfdHJlOwogCXU4IGZsYWdzID0gMDsKQEAgLTMxNiwxMCArMzU4LDcgQEAKIAkJZmxhZ3MgfD0gR1NJX0NTX1RPR0dMRTsKIAogCXdvcmRfbGVuID0geGZlci0+Yml0c19wZXJfd29yZCAtIE1JTl9XT1JEX0xFTjsKLQlpZiAobWFzLT50eF9maWZvX3dpZHRoICUgeGZlci0+Yml0c19wZXJfd29yZCkKLQkJcGFjayA9IDA7Ci0JZWxzZQotCQlwYWNrIHw9IChHU0lfVFhfUEFDS19FTiB8IEdTSV9SWF9QQUNLX0VOKTsKKwlwYWNrIHw9IChHU0lfVFhfUEFDS19FTiB8IEdTSV9SWF9QQUNLX0VOKTsKIAlyZXQgPSBnZXRfc3BpX2Nsa19jZmcobWFzLT5jdXJfc3BlZWRfaHosIG1hcywgJmlkeCwgJmRpdik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKG1hcy0+ZGV2LCAiJXM6RXJyIHNldHRpbmcgY2xrczolZFxuIiwgX19mdW5jX18sIHJldCk7CkBAIC0zMjcsMTIgKzM2NiwxNiBAQAogCX0KIAljMF90cmUtPmR3b3JkWzBdID0gTVNNX0dQSV9TUElfQ09ORklHMF9UUkVfRFdPUkQwKHBhY2ssIGZsYWdzLAogCQkJCQkJCQl3b3JkX2xlbik7Ci0JYzBfdHJlLT5kd29yZFsxXSA9IE1TTV9HUElfU1BJX0NPTkZJRzBfVFJFX0RXT1JEMSgwLCAwLCAwKTsKKwljMF90cmUtPmR3b3JkWzFdID0gTVNNX0dQSV9TUElfQ09ORklHMF9UUkVfRFdPUkQxKDAsIGNzX2Nsa19kZWxheSwKKwkJCQkJCQlpbnRlcl93b3Jkc19kZWxheSk7CiAJYzBfdHJlLT5kd29yZFsyXSA9IE1TTV9HUElfU1BJX0NPTkZJRzBfVFJFX0RXT1JEMihpZHgsIGRpdik7CiAJYzBfdHJlLT5kd29yZFszXSA9IE1TTV9HUElfU1BJX0NPTkZJRzBfVFJFX0RXT1JEMygwLCAwLCAwLCAxKTsKIAlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAogCQkiJXM6IGZsYWdzIDB4JXggd29yZCAlZCBwYWNrICVkIGlkeCAlZCBkaXYgJWRcbiIsCiAJCV9fZnVuY19fLCBmbGFncywgd29yZF9sZW4sIHBhY2ssIGlkeCwgZGl2KTsKKwlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkiJXM6IGNzX2Nsa19kZWxheSAlZCBpbnRlcl93b3Jkc19kZWxheSAlZFxuIiwgX19mdW5jX18sCisJCQkJIGNzX2Nsa19kZWxheSwgaW50ZXJfd29yZHNfZGVsYXkpOwogCXJldHVybiBjMF90cmU7CiB9CiAKQEAgLTQ5MCwxMyArNTMzLDI3IEBACiAJdTMyIHJ4X2xlbiA9IDA7CiAJaW50IGdvX2ZsYWdzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLOworCXN0cnVjdCBzcGlfZ2VuaV9xY29tX2N0cmxfZGF0YSAqZGVsYXlfcGFyYW1zID0gTlVMTDsKKwl1MzIgY3NfY2xrX2RlbGF5ID0gMDsKKwl1MzIgaW50ZXJfd29yZHNfZGVsYXkgPSAwOworCisJaWYgKHNwaV9zbHYtPmNvbnRyb2xsZXJfZGF0YSkgeworCQlkZWxheV9wYXJhbXMgPQorCQkoc3RydWN0IHNwaV9nZW5pX3Fjb21fY3RybF9kYXRhICopIHNwaV9zbHYtPmNvbnRyb2xsZXJfZGF0YTsKKworCQljc19jbGtfZGVsYXkgPQorCQkJZGVsYXlfcGFyYW1zLT5zcGlfY3NfY2xrX2RlbGF5OworCQlpbnRlcl93b3Jkc19kZWxheSA9CisJCQlkZWxheV9wYXJhbXMtPnNwaV9pbnRlcl93b3Jkc19kZWxheTsKKwl9CiAKIAlpZiAoKHhmZXItPmJpdHNfcGVyX3dvcmQgIT0gbWFzLT5jdXJfd29yZF9sZW4pIHx8CiAJCSh4ZmVyLT5zcGVlZF9oeiAhPSBtYXMtPmN1cl9zcGVlZF9oeikpIHsKIAkJbWFzLT5jdXJfd29yZF9sZW4gPSB4ZmVyLT5iaXRzX3Blcl93b3JkOwogCQltYXMtPmN1cl9zcGVlZF9oeiA9IHhmZXItPnNwZWVkX2h6OwogCQl0eF9uZW50Kys7Ci0JCWMwX3RyZSA9IHNldHVwX2NvbmZpZzBfdHJlKHhmZXIsIG1hcywgc3BpX3Nsdi0+bW9kZSk7CisJCWMwX3RyZSA9IHNldHVwX2NvbmZpZzBfdHJlKHhmZXIsIG1hcywgc3BpX3Nsdi0+bW9kZSwKKwkJCQkJY3NfY2xrX2RlbGF5LCBpbnRlcl93b3Jkc19kZWxheSk7CiAJCWlmIChJU19FUlJfT1JfTlVMTChjMF90cmUpKSB7CiAJCQlkZXZfZXJyKG1hcy0+ZGV2LCAiJXM6RXJyIHNldHRpbmcgYzB0cmU6JWRcbiIsCiAJCQkJCQkJX19mdW5jX18sIHJldCk7CkBAIC01MDQsMTkgKzU2MSwyNiBAQAogCQl9CiAJfQogCisJaWYgKCEobWFzLT5jdXJfd29yZF9sZW4gJSBNSU5fV09SRF9MRU4pKSB7CisJCXJ4X2xlbiA9ICgoeGZlci0+bGVuIDw8IDMpIC8gbWFzLT5jdXJfd29yZF9sZW4pOworCX0gZWxzZSB7CisJCWludCBieXRlc19wZXJfd29yZCA9IChtYXMtPmN1cl93b3JkX2xlbiAvIEJJVFNfUEVSX0JZVEUpICsgMTsKKworCQlyeF9sZW4gPSAoeGZlci0+bGVuIC8gYnl0ZXNfcGVyX3dvcmQpOworCX0KKwogCWlmICh4ZmVyLT50eF9idWYgJiYgeGZlci0+cnhfYnVmKSB7CiAJCWNtZCA9IFNQSV9GVUxMX0RVUExFWDsKIAkJdHhfbmVudCArPSAyOwogCQlyeF9uZW50Kys7Ci0JCXJ4X2xlbiA9ICgoeGZlci0+bGVuIDw8IDMpIC8gbWFzLT5jdXJfd29yZF9sZW4pOwogCX0gZWxzZSBpZiAoeGZlci0+dHhfYnVmKSB7CiAJCWNtZCA9IFNQSV9UWF9PTkxZOwogCQl0eF9uZW50ICs9IDI7CisJCXJ4X2xlbiA9IDA7CiAJfSBlbHNlIGlmICh4ZmVyLT5yeF9idWYpIHsKIAkJY21kID0gU1BJX1JYX09OTFk7CiAJCXR4X25lbnQrKzsKIAkJcnhfbmVudCsrOwotCQlyeF9sZW4gPSAoKHhmZXItPmxlbiA8PCAzKSAvIG1hcy0+Y3VyX3dvcmRfbGVuKTsKIAl9CiAKIAljcyB8PSBzcGlfc2x2LT5jaGlwX3NlbGVjdDsKQEAgLTU5NywzMCArNjYxLDMyIEBACiAJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQlzdHJ1Y3QgZGV2aWNlICpnc2lfZGV2ID0gbWFzLT5kZXY7CisJaW50IHJldCA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQlpZiAoeGZlci0+cnhfYnVmKSB7Ci0JCQl4ZmVyLT5yeF9kbWEgPSBkbWFfbWFwX3NpbmdsZShnc2lfZGV2LCB4ZmVyLT5yeF9idWYsCisJCQlyZXQgPSBnZW5pX3NlX2lvbW11X21hcF9idWYobWFzLT53cmFwcGVyX2RldiwKKwkJCQkJCSZ4ZmVyLT5yeF9kbWEsIHhmZXItPnJ4X2J1ZiwKIAkJCQkJCXhmZXItPmxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihtYXMtPmRldiwgeGZlci0+cnhfZG1hKSkgewotCQkJCWRldl9lcnIobWFzLT5kZXYsICJFcnIgbWFwcGluZyBidWZcbiIpOwotCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKHJldCkgeworCQkJCUdFTklfU0VfRVJSKG1hcy0+aXBjLCB0cnVlLCBtYXMtPmRldiwKKwkJCQkiJXM6IE1hcHBpbmcgUnggYnVmZmVyICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CiAKIAkJaWYgKHhmZXItPnR4X2J1ZikgewotCQkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZ3NpX2RldiwKLQkJCQkodm9pZCAqKXhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihnc2lfZGV2LCB4ZmVyLT50eF9kbWEpKSB7Ci0JCQkJZGV2X2VycihtYXMtPmRldiwgIkVyciBtYXBwaW5nIGJ1ZlxuIik7Ci0JCQkJZG1hX3VubWFwX3NpbmdsZShnc2lfZGV2LCB4ZmVyLT5yeF9kbWEsCi0JCQkJCQl4ZmVyLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSBnZW5pX3NlX2lvbW11X21hcF9idWYobWFzLT53cmFwcGVyX2RldiwKKwkJCQkJCSZ4ZmVyLT50eF9kbWEsCisJCQkJCQkodm9pZCAqKXhmZXItPnR4X2J1ZiwKKwkJCQkJCXhmZXItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQlpZiAocmV0KSB7CisJCQkJR0VOSV9TRV9FUlIobWFzLT5pcGMsIHRydWUsIG1hcy0+ZGV2LAorCQkJCSIlczogTWFwcGluZyBUeCBidWZmZXIgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KIAl9OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyOCwxNCArNjk0LDEzIEBACiAJCQkJc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKLQlzdHJ1Y3QgZGV2aWNlICpnc2lfZGV2ID0gbWFzLT5kZXY7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHhmZXIsICZtc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewogCQlpZiAoeGZlci0+cnhfYnVmKQotCQkJZG1hX3VubWFwX3NpbmdsZShnc2lfZGV2LCB4ZmVyLT5yeF9kbWEsCisJCQlnZW5pX3NlX2lvbW11X3VubWFwX2J1ZihtYXMtPndyYXBwZXJfZGV2LCAmeGZlci0+cnhfZG1hLAogCQkJCQkJeGZlci0+bGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAoeGZlci0+dHhfYnVmKQotCQkJZG1hX3VubWFwX3NpbmdsZShnc2lfZGV2LCB4ZmVyLT50eF9kbWEsCisJCQlnZW5pX3NlX2lvbW11X3VubWFwX2J1ZihtYXMtPndyYXBwZXJfZGV2LCAmeGZlci0+dHhfZG1hLAogCQkJCQkJeGZlci0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAl9OwogfQpAQCAtNjg5LDcgKzc1NCwxMiBAQAogewogCXN0cnVjdCBzcGlfZ2VuaV9tYXN0ZXIgKm1hcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpKTsKIAlpbnQgcmV0ID0gMDsKKwl1MzIgbWF4X3NwZWVkID0gc3BpLT5jdXJfbXNnLT5zcGktPm1heF9zcGVlZF9oejsKKwlzdHJ1Y3Qgc2VfZ2VuaV9yc2MgKnJzYyA9ICZtYXMtPnNwaV9yc2M7CiAKKwkvKiBBZGp1c3QgdGhlIEFCL0lCIGJhc2VkIG9uIHRoZSBtYXggc3BlZWQgb2YgdGhlIHNsYXZlLiovCisJcnNjLT5pYiA9IG1heF9zcGVlZCAqIERFRkFVTFRfQlVTX1dJRFRIOworCXJzYy0+YWIgPSBtYXhfc3BlZWQgKiBERUZBVUxUX0JVU19XSURUSDsKIAlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKG1hcy0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKG1hcy0+ZGV2LCAiRXJyb3IgZW5hYmxpbmcgU0UgcmVzb3VyY2VzXG4iKTsKQEAgLTg0NCw3ICs5MTQsMTQgQEAKIAlzcGlfdHhfY2ZnICY9IH5DU19UT0dHTEU7CiAJaWYgKHhmZXItPmNzX2NoYW5nZSkKIAkJc3BpX3R4X2NmZyB8PSBDU19UT0dHTEU7Ci0JdHJhbnNfbGVuID0gKCh4ZmVyLT5sZW4gPDwgMykgLyBtYXMtPmN1cl93b3JkX2xlbikgJiBUUkFOU19MRU5fTVNLOworCWlmICghKG1hcy0+Y3VyX3dvcmRfbGVuICUgTUlOX1dPUkRfTEVOKSkgeworCQl0cmFuc19sZW4gPQorCQkJKCh4ZmVyLT5sZW4gPDwgMykgLyBtYXMtPmN1cl93b3JkX2xlbikgJiBUUkFOU19MRU5fTVNLOworCX0gZWxzZSB7CisJCWludCBieXRlc19wZXJfd29yZCA9IChtYXMtPmN1cl93b3JkX2xlbiAvIEJJVFNfUEVSX0JZVEUpICsgMTsKKworCQl0cmFuc19sZW4gPSAoeGZlci0+bGVuIC8gYnl0ZXNfcGVyX3dvcmQpICYgVFJBTlNfTEVOX01TSzsKKwl9CiAJaWYgKCFsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsICZzcGktPmN1cl9tc2ctPnRyYW5zZmVycykpCiAJCW1fcGFyYW0gfD0gRlJBR01FTlRBVElPTjsKIApAQCAtODYwLDYgKzkzNyw5IEBACiAJfQogCWdlbmlfd3JpdGVfcmVnKHNwaV90eF9jZmcsIG1hcy0+YmFzZSwgU0VfU1BJX1RSQU5TX0NGRyk7CiAJZ2VuaV9zZXR1cF9tX2NtZChtYXMtPmJhc2UsIG1fY21kLCBtX3BhcmFtKTsKKwlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkiJXM6IHRyYW5zX2xlbiAlZCB4ZmVybGVuJWQgdHhfY2ZnIDB4JXggY21kIDB4JXhcbiIsCisJCV9fZnVuY19fLCB0cmFuc19sZW4sIHhmZXItPmxlbiwgc3BpX3R4X2NmZywgbV9jbWQpOwogCWlmIChtX2NtZCAmIFNQSV9UWF9PTkxZKQogCQlnZW5pX3dyaXRlX3JlZyhtYXMtPnR4X3dtLCBtYXMtPmJhc2UsIFNFX0dFTklfVFhfV0FURVJNQVJLX1JFRyk7CiAJLyogRW5zdXJlIGFsbCB3cml0ZXMgYXJlIGRvbmUgYmVmb3JlIHRoZSBXTSBpbnRlcnJ1cHQgKi8KQEAgLTg3MCw4ICs5NTAsMTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKKwlnZW5pX3NlX2R1bXBfZGJnX3JlZ3MoJm1hcy0+c3BpX3JzYywgbWFzLT5iYXNlLCBtYXMtPmlwYyk7CiAJcmVpbml0X2NvbXBsZXRpb24oJm1hcy0+eGZlcl9kb25lKTsKIAlnZW5pX2NhbmNlbF9tX2NtZChtYXMtPmJhc2UpOworCWdlbmlfd3JpdGVfcmVnKDAsIG1hcy0+YmFzZSwgU0VfR0VOSV9UWF9XQVRFUk1BUktfUkVHKTsKIAkvKiBFbnN1cmUgY21kIGNhbmNlbCBpcyB3cml0dGVuICovCiAJbWIoKTsKIAl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYXMtPnhmZXJfZG9uZSwgSFopOwpAQCAtOTU1LDYgKzEwMzcsNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogZXJyX2dzaV9nZW5pX3RyYW5zZmVyX29uZToKKwlnZW5pX3NlX2R1bXBfZGJnX3JlZ3MoJm1hcy0+c3BpX3JzYywgbWFzLT5iYXNlLCBtYXMtPmlwYyk7CiAJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwobWFzLT50eCk7CiAJcmV0dXJuIHJldDsKIGVycl9maWZvX2dlbmlfdHJhbnNmZXJfb25lOgpAQCAtOTY2LDEyICsxMDQ5LDI1IEBACiB7CiAJaW50IGkgPSAwOwogCWludCB0eF9maWZvX3dpZHRoID0gKG1hcy0+dHhfZmlmb193aWR0aCA+PiAzKTsKLQlpbnQgbWF4X2J5dGVzID0gKG1hcy0+dHhfZmlmb19kZXB0aCAtIG1hcy0+dHhfd20pICogdHhfZmlmb193aWR0aDsKKwlpbnQgbWF4X2J5dGVzID0gMDsKIAljb25zdCB1OCAqdHhfYnVmID0gTlVMTDsKIAogCWlmICghbWFzLT5jdXJfeGZlcikKIAkJcmV0dXJuOwogCisJLyoKKwkgKiBGb3Igbm9uLWJ5dGUgYWxpZ25lZCBiaXRzLXBlci13b3JkIHZhbHVlczoKKwkgKiBBc3N1bXB0aW9uIGlzIHRoYXQgZWFjaCBTUEkgd29yZCB3aWxsIGJlIGFjY29tb2RhdGVkIGluCisJICogY2VpbCAoYml0c19wZXJfd29yZCAvIGJpdHNfcGVyX2J5dGUpCisJICogYW5kIHRoZSBuZXh0IFNQSSB3b3JkIHN0YXJ0cyBhdCB0aGUgbmV4dCBieXRlLgorCSAqIEluIHN1Y2ggY2FzZXMsIHdlIGNhbiBmaXQgMSBTUEkgd29yZCBwZXIgRklGTyB3b3JkIHNvIGFkanVzdCB0aGUKKwkgKiBtYXggYnl0ZSB0aGF0IGNhbiBiZSBzZW50IHBlciBJUlEgYWNjb3JkaW5nbHkuCisJICovCisJaWYgKChtYXMtPnR4X2ZpZm9fd2lkdGggJSBtYXMtPmN1cl93b3JkX2xlbikpCisJCW1heF9ieXRlcyA9IChtYXMtPnR4X2ZpZm9fZGVwdGggLSBtYXMtPnR4X3dtKSAqCisJCQkJKChtYXMtPmN1cl93b3JkX2xlbiAvIEJJVFNfUEVSX0JZVEUpICsgMSk7CisJZWxzZQorCQltYXhfYnl0ZXMgPSAobWFzLT50eF9maWZvX2RlcHRoIC0gbWFzLT50eF93bSkgKiB0eF9maWZvX3dpZHRoOwogCXR4X2J1ZiA9IG1hcy0+Y3VyX3hmZXItPnR4X2J1ZjsKIAl0eF9idWYgKz0gKG1hcy0+Y3VyX3hmZXItPmxlbiAtIG1hcy0+dHhfcmVtX2J5dGVzKTsKIAltYXhfYnl0ZXMgPSBtaW5fdChpbnQsIG1hcy0+dHhfcmVtX2J5dGVzLCBtYXhfYnl0ZXMpOwpAQCAtOTc5LDggKzEwNzUsMTMgQEAKIAkJaW50IGo7CiAJCXUzMiBmaWZvX3dvcmQgPSAwOwogCQl1OCAqZmlmb19ieXRlOwotCQlpbnQgYnl0ZXNfdG9fd3JpdGUgPSBtaW5fdChpbnQsIChtYXhfYnl0ZXMgLSBpKSwgdHhfZmlmb193aWR0aCk7CisJCWludCBieXRlc19wZXJfZmlmbyA9IHR4X2ZpZm9fd2lkdGg7CisJCWludCBieXRlc190b193cml0ZSA9IDA7CiAKKwkJaWYgKChtYXMtPnR4X2ZpZm9fd2lkdGggJSBtYXMtPmN1cl93b3JkX2xlbikpCisJCQlieXRlc19wZXJfZmlmbyA9CisJCQkJKG1hcy0+Y3VyX3dvcmRfbGVuIC8gQklUU19QRVJfQllURSkgKyAxOworCQlieXRlc190b193cml0ZSA9IG1pbl90KGludCwgKG1heF9ieXRlcyAtIGkpLCBieXRlc19wZXJfZmlmbyk7CiAJCWZpZm9fYnl0ZSA9ICh1OCAqKSZmaWZvX3dvcmQ7CiAJCWZvciAoaiA9IDA7IGogPCBieXRlc190b193cml0ZTsgaisrKQogCQkJZmlmb19ieXRlW2pdID0gdHhfYnVmW2krK107CkBAIC0xMDE5LDE1ICsxMTIwLDI0IEBACiAJCQlyeF9ieXRlcyArPSByeF9sYXN0X2J5dGVfdmFsaWQ7CiAJCX0KIAl9Ci0JcnhfYnl0ZXMgKz0gcnhfd2MgKiBmaWZvX3dpZHRoOworCWlmICghKG1hcy0+dHhfZmlmb193aWR0aCAlIG1hcy0+Y3VyX3dvcmRfbGVuKSkKKwkJcnhfYnl0ZXMgKz0gcnhfd2MgKiBmaWZvX3dpZHRoOworCWVsc2UKKwkJcnhfYnl0ZXMgKz0gcnhfd2MgKgorCQkJKChtYXMtPmN1cl93b3JkX2xlbiAvIEJJVFNfUEVSX0JZVEUpICsgMSk7CiAJcnhfYnl0ZXMgPSBtaW5fdChpbnQsIG1hcy0+cnhfcmVtX2J5dGVzLCByeF9ieXRlcyk7CiAJcnhfYnVmICs9IChtYXMtPmN1cl94ZmVyLT5sZW4gLSBtYXMtPnJ4X3JlbV9ieXRlcyk7CiAJd2hpbGUgKGkgPCByeF9ieXRlcykgewogCQl1MzIgZmlmb193b3JkID0gMDsKIAkJdTggKmZpZm9fYnl0ZTsKLQkJaW50IHJlYWRfYnl0ZXMgPSBtaW5fdChpbnQsIChyeF9ieXRlcyAtIGkpLCBmaWZvX3dpZHRoKTsKKwkJaW50IGJ5dGVzX3Blcl9maWZvID0gZmlmb193aWR0aDsKKwkJaW50IHJlYWRfYnl0ZXMgPSAwOwogCQlpbnQgajsKIAorCQlpZiAoKG1hcy0+dHhfZmlmb193aWR0aCAlIG1hcy0+Y3VyX3dvcmRfbGVuKSkKKwkJCWJ5dGVzX3Blcl9maWZvID0KKwkJCQkobWFzLT5jdXJfd29yZF9sZW4gLyBCSVRTX1BFUl9CWVRFKSArIDE7CisJCXJlYWRfYnl0ZXMgPSBtaW5fdChpbnQsIChyeF9ieXRlcyAtIGkpLCBieXRlc19wZXJfZmlmbyk7CiAJCWZpZm9fd29yZCA9IGdlbmlfcmVhZF9yZWcobWFzLT5iYXNlLCBTRV9HRU5JX1JYX0ZJRk9uKTsKIAkJZmlmb19ieXRlID0gKHU4ICopJmZpZm9fd29yZDsKIAkJZm9yIChqID0gMDsgaiA8IHJlYWRfYnl0ZXM7IGorKykKQEAgLTEwMzksOCArMTE0OSwxNCBAQAogc3RhdGljIGlycXJldHVybl90IGdlbmlfc3BpX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCiB7CiAJc3RydWN0IHNwaV9nZW5pX21hc3RlciAqbWFzID0gZGV2OwotCXUzMiBtX2lycSA9IGdlbmlfcmVhZF9yZWcobWFzLT5iYXNlLCBTRV9HRU5JX01fSVJRX1NUQVRVUyk7CisJdTMyIG1faXJxID0gMDsKIAorCWlmIChwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkgeworCQlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkJCSIlczogZGV2aWNlIGlzIHN1c3BlbmRlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXRfZ2VuaV9zcGlfaXJxOworCX0KKwltX2lycSA9IGdlbmlfcmVhZF9yZWcobWFzLT5iYXNlLCBTRV9HRU5JX01fSVJRX1NUQVRVUyk7CiAJaWYgKChtX2lycSAmIE1fUlhfRklGT19XQVRFUk1BUktfRU4pIHx8IChtX2lycSAmIE1fUlhfRklGT19MQVNUX0VOKSkKIAkJZ2VuaV9zcGlfaGFuZGxlX3J4KG1hcyk7CiAKQEAgLTEwNTAsNyArMTE2NiwyNiBAQAogCWlmICgobV9pcnEgJiBNX0NNRF9ET05FX0VOKSB8fCAobV9pcnEgJiBNX0NNRF9DQU5DRUxfRU4pIHx8CiAJCShtX2lycSAmIE1fQ01EX0FCT1JUX0VOKSkgewogCQljb21wbGV0ZSgmbWFzLT54ZmVyX2RvbmUpOworCQkvKgorCQkgKiBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYSBDTURfRE9ORSBjYW1lIGJlZm9yZSBhbGwgdGhlIGJ1ZmZlcgorCQkgKiBieXRlcyB3ZXJlIHNlbnQgb3V0LiBUaGlzIGlzIHVudXN1YWwsIGxvZyB0aGlzIGNvbmRpdGlvbiBhbmQKKwkJICogZGlzYWJsZSB0aGUgV00gaW50ZXJydXB0IHRvIHByZXZlbnQgdGhlIHN5c3RlbSBmcm9tIHN0YWxsaW5nCisJCSAqIGR1ZSBhbiBpbnRlcnJ1cHQgc3Rvcm0uCisJCSAqIElmIHRoaXMgaGFwcGVucyB3aGVuIGFsbCBSeCBieXRlcyBoYXZlbid0IGJlZW4gcmVjZWl2ZWQsIGxvZworCQkgKiB0aGUgY29uZGl0aW9uLgorCQkgKi8KKwkJaWYgKG1hcy0+dHhfcmVtX2J5dGVzKSB7CisJCQlnZW5pX3dyaXRlX3JlZygwLCBtYXMtPmJhc2UsIFNFX0dFTklfVFhfV0FURVJNQVJLX1JFRyk7CisJCQlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkJCSIlczpQcmVtYXR1cmUgRG9uZS50eF9yZW0lZCBicHclZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWFzLT50eF9yZW1fYnl0ZXMsIG1hcy0+Y3VyX3dvcmRfbGVuKTsKKwkJfQorCQlpZiAobWFzLT5yeF9yZW1fYnl0ZXMpCisJCQlHRU5JX1NFX0RCRyhtYXMtPmlwYywgZmFsc2UsIG1hcy0+ZGV2LAorCQkJCSIlczpQcmVtYXR1cmUgRG9uZS5yeF9yZW0lZCBicHclZFxuIiwKKwkJCQlfX2Z1bmNfXywgbWFzLT5yeF9yZW1fYnl0ZXMsIG1hcy0+Y3VyX3dvcmRfbGVuKTsKIAl9CitleGl0X2dlbmlfc3BpX2lycToKIAlnZW5pX3dyaXRlX3JlZyhtX2lycSwgbWFzLT5iYXNlLCBTRV9HRU5JX01fSVJRX0NMRUFSKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfcXNkLmMgYi9kcml2ZXJzL3NwaS9zcGlfcXNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkYTI4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9xc2QuYwpAQCAtMCwwICsxLDI3ODYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwOC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworLyoKKyAqIFNQSSBkcml2ZXIgZm9yIFF1YWxjb21tIE1TTSBwbGF0Zm9ybXMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvcWNvbS1zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tc20tc3BzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtLWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L21zbS1idXMtYm9hcmQuaD4KKyNpbmNsdWRlICJzcGlfcXNkLmgiCisKKyNkZWZpbmUgU1BJX01BWF9CWVRFU19QRVJfV09SRAkJCSg0KQorCitzdGF0aWMgaW50IG1zbV9zcGlfcG1fcmVzdW1lX3J1bnRpbWUoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgbXNtX3NwaV9wbV9zdXNwZW5kX3J1bnRpbWUoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2RtYV91bm1hcF9idWZmZXJzKHN0cnVjdCBtc21fc3BpICpkZCk7CitzdGF0aWMgaW50IGdldF9sb2NhbF9yZXNvdXJjZXMoc3RydWN0IG1zbV9zcGkgKmRkKTsKK3N0YXRpYyB2b2lkIHB1dF9sb2NhbF9yZXNvdXJjZXMoc3RydWN0IG1zbV9zcGkgKmRkKTsKKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9jb25maWd1cmVfZ3NiaShzdHJ1Y3QgbXNtX3NwaSAqZGQsCisJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nICAgZ3NiaV9tZW1fcGh5c19hZGRyOworCXNpemVfdCAgICAgICAgICBnc2JpX21lbV9zaXplOworCXZvaWQgX19pb21lbSAgICAqZ3NiaV9iYXNlOworCisJcmVzb3VyY2UgID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlc291cmNlKQorCQlyZXR1cm4gMDsKKworCWdzYmlfbWVtX3BoeXNfYWRkciA9IHJlc291cmNlLT5zdGFydDsKKwlnc2JpX21lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXNvdXJjZSk7CisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBnc2JpX21lbV9waHlzX2FkZHIsCisJCQkJCWdzYmlfbWVtX3NpemUsIFNQSV9EUlZfTkFNRSkpCisJCXJldHVybiAtRU5YSU87CisKKwlnc2JpX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgZ3NiaV9tZW1fcGh5c19hZGRyLAorCQkJCQlnc2JpX21lbV9zaXplKTsKKwlpZiAoIWdzYmlfYmFzZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIFNldCBHU0JJIHRvIFNQSSBtb2RlICovCisJd3JpdGVsX3JlbGF4ZWQoR1NCSV9TUElfQ09ORklHLCBnc2JpX2Jhc2UgKyBHU0JJX0NUUkxfUkVHKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9yZWdpc3Rlcl9pbml0KHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl3cml0ZWxfcmVsYXhlZCgweDAwMDAwMDAxLCBkZC0+YmFzZSArIFNQSV9TV19SRVNFVCk7CisJbXNtX3NwaV9zZXRfc3RhdGUoZGQsIFNQSV9PUF9TVEFURV9SRVNFVCk7CisJd3JpdGVsX3JlbGF4ZWQoMHgwMDAwMDAwMCwgZGQtPmJhc2UgKyBTUElfT1BFUkFUSU9OQUwpOworCXdyaXRlbF9yZWxheGVkKDB4MDAwMDAwMDAsIGRkLT5iYXNlICsgU1BJX0NPTkZJRyk7CisJd3JpdGVsX3JlbGF4ZWQoMHgwMDAwMDAwMCwgZGQtPmJhc2UgKyBTUElfSU9fTU9ERVMpOworCWlmIChkZC0+cXVwX3ZlcikKKwkJd3JpdGVsX3JlbGF4ZWQoMHgwMDAwMDAwMCwgZGQtPmJhc2UgKyBRVVBfT1BFUkFUSU9OQUxfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9waW5jdHJsX2luaXQoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWRkLT5waW5jdHJsID0gZGV2bV9waW5jdHJsX2dldChkZC0+ZGV2KTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGQtPnBpbmN0cmwpKSB7CisJCWRldl9lcnIoZGQtPmRldiwgIkZhaWxlZCB0byBnZXQgcGluIGN0cmxcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkZC0+cGluY3RybCk7CisJfQorCWRkLT5waW5zX2FjdGl2ZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKGRkLT5waW5jdHJsLAorCQkJCVNQSV9QSU5DVFJMX1NUQVRFX0RFRkFVTFQpOworCWlmIChJU19FUlJfT1JfTlVMTChkZC0+cGluc19hY3RpdmUpKSB7CisJCWRldl9lcnIoZGQtPmRldiwgIkZhaWxlZCB0byBsb29rdXAgcGluY3RybCBkZWZhdWx0IHN0YXRlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGQtPnBpbnNfYWN0aXZlKTsKKwl9CisKKwlkZC0+cGluc19zbGVlcCA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKGRkLT5waW5jdHJsLAorCQkJCVNQSV9QSU5DVFJMX1NUQVRFX1NMRUVQKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGQtPnBpbnNfc2xlZXApKSB7CisJCWRldl9lcnIoZGQtPmRldiwgIkZhaWxlZCB0byBsb29rdXAgcGluY3RybCBzbGVlcCBzdGF0ZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRkLT5waW5zX3NsZWVwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9yZXF1ZXN0X2dwaW9zKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIWRkLT5wZGF0YS0+dXNlX3BpbmN0cmwpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3BpX3JzcmNzKTsgKytpKSB7CisJCQlpZiAoZGQtPnNwaV9ncGlvc1tpXSA+PSAwKSB7CisJCQkJcmVzdWx0ID0gZ3Bpb19yZXF1ZXN0KGRkLT5zcGlfZ3Bpb3NbaV0sCisJCQkJCQlzcGlfcnNyY3NbaV0pOworCQkJCWlmIChyZXN1bHQpIHsKKwkJCQkJZGV2X2VycihkZC0+ZGV2LAorCQkJCQkiZXJyb3IgJWQgZ3Bpb19yZXF1ZXN0IGZvciBwaW4gJWRcbiIsCisJCQkJCXJlc3VsdCwgZGQtPnNwaV9ncGlvc1tpXSk7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUoZGQtPnBpbmN0cmwsIGRkLT5waW5zX2FjdGl2ZSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9lcnIoZGQtPmRldiwgIiVzOiBDYW4gbm90IHNldCAlcyBwaW5zXG4iLAorCQkJX19mdW5jX18sIFNQSV9QSU5DVFJMX1NUQVRFX0RFRkFVTFQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK2Vycm9yOgorCWlmICghZGQtPnBkYXRhLT51c2VfcGluY3RybCkgeworCQlmb3IgKDsgLS1pID49IDA7KSB7CisJCQlpZiAoZGQtPnNwaV9ncGlvc1tpXSA+PSAwKQorCQkJCWdwaW9fZnJlZShkZC0+c3BpX2dwaW9zW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9mcmVlX2dwaW9zKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmICghZGQtPnBkYXRhLT51c2VfcGluY3RybCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGlfcnNyY3MpOyArK2kpIHsKKwkJCWlmIChkZC0+c3BpX2dwaW9zW2ldID49IDApCisJCQkJZ3Bpb19mcmVlKGRkLT5zcGlfZ3Bpb3NbaV0pOworCQkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwaV9jc19yc3Jjcyk7ICsraSkgeworCQkJaWYgKGRkLT5jc19ncGlvc1tpXS52YWxpZCkgeworCQkJCWdwaW9fZnJlZShkZC0+Y3NfZ3Bpb3NbaV0uZ3Bpb19udW0pOworCQkJCWRkLT5jc19ncGlvc1tpXS52YWxpZCA9IDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXN1bHQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShkZC0+cGluY3RybCwgZGQtPnBpbnNfc2xlZXApOworCQlpZiAocmVzdWx0KQorCQkJZGV2X2VycihkZC0+ZGV2LCAiJXM6IENhbiBub3Qgc2V0ICVzIHBpbnNcbiIsCisJCQlfX2Z1bmNfXywgU1BJX1BJTkNUUkxfU1RBVEVfU0xFRVApOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9yZXF1ZXN0X2NzX2dwaW8oc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWludCBjc19udW07CisJaW50IHJjOworCisJY3NfbnVtID0gZGQtPnNwaS0+Y2hpcF9zZWxlY3Q7CisJaWYgKCEoZGQtPnNwaS0+bW9kZSAmIFNQSV9MT09QKSkgeworCQlpZiAoIWRkLT5wZGF0YS0+dXNlX3BpbmN0cmwpIHsKKwkJCWlmICgoIShkZC0+Y3NfZ3Bpb3NbY3NfbnVtXS52YWxpZCkpICYmCisJCQkJKGRkLT5jc19ncGlvc1tjc19udW1dLmdwaW9fbnVtID49IDApKSB7CisJCQkJcmMgPSBncGlvX3JlcXVlc3QoZGQtPmNzX2dwaW9zW2NzX251bV0uZ3Bpb19udW0sCisJCQkJCXNwaV9jc19yc3Jjc1tjc19udW1dKTsKKworCQkJCWlmIChyYykgeworCQkJCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkJCSJncGlvX3JlcXVlc3QgZm9yIHBpbiAlZCBmYWlsZWQsZXJyb3IgJWRcbiIsCisJCQkJCWRkLT5jc19ncGlvc1tjc19udW1dLmdwaW9fbnVtLCByYyk7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CisJCQkJZGQtPmNzX2dwaW9zW2NzX251bV0udmFsaWQgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9mcmVlX2NzX2dwaW8oc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWludCBjc19udW07CisKKwljc19udW0gPSBkZC0+c3BpLT5jaGlwX3NlbGVjdDsKKwlpZiAoIWRkLT5wZGF0YS0+dXNlX3BpbmN0cmwpIHsKKwkJaWYgKGRkLT5jc19ncGlvc1tjc19udW1dLnZhbGlkKSB7CisJCQlncGlvX2ZyZWUoZGQtPmNzX2dwaW9zW2NzX251bV0uZ3Bpb19udW0pOworCQkJZGQtPmNzX2dwaW9zW2NzX251bV0udmFsaWQgPSAwOworCQl9CisJfQorfQorCisKKy8qKgorICogbXNtX3NwaV9jbGtfbWF4X3JhdGU6IGZpbmRzIHRoZSBuZWFyZXN0IGxvd2VyIHJhdGUgZm9yIGEgY2xrCisgKiBAY2xrIHRoZSBjbG9jayBmb3Igd2hpY2ggdG8gZmluZCBuZWFyZXN0IGxvd2VyIHJhdGUKKyAqIEByYXRlIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegorICogQHJldHVybiBuZWFyZXN0IGxvd2VyIHJhdGUgb3IgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqCisgKiBQdWJsaWMgY2xvY2sgQVBJIGV4dGVuZHMgY2xrX3JvdW5kX3JhdGUgd2hpY2ggaXMgYSBjZWlsaW5nIGZ1bmN0aW9uLiBUaGlzCisgKiBmdW5jdGlvbiBpcyBhIGZsb29yIGZ1bmN0aW9uIGltcGxlbWVudGVkIGFzIGEgYmluYXJ5IHNlYXJjaCB1c2luZyB0aGUKKyAqIGNlaWxpbmcgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBsb25nIG1zbV9zcGlfY2xrX21heF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWxvbmcgbG93ZXN0X2F2YWlsYWJsZSwgbmVhcmVzdF9sb3csIHN0ZXBfc2l6ZSwgY3VyOworCWxvbmcgc3RlcF9kaXJlY3Rpb24gPSAtMTsKKwlsb25nIGd1ZXNzID0gcmF0ZTsKKwlpbnQgIG1heF9zdGVwcyA9IDEwOworCisJY3VyID0gIGNsa19yb3VuZF9yYXRlKGNsaywgcmF0ZSk7CisJaWYgKGN1ciA9PSByYXRlKQorCQlyZXR1cm4gcmF0ZTsKKworCS8qIGlmIHdlIGdvdCBoZXJlIHRoZW46IGN1ciA+IHJhdGUgKi8KKwlsb3dlc3RfYXZhaWxhYmxlID0gIGNsa19yb3VuZF9yYXRlKGNsaywgMCk7CisJaWYgKGxvd2VzdF9hdmFpbGFibGUgPiByYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0ZXBfc2l6ZSA9IChyYXRlIC0gbG93ZXN0X2F2YWlsYWJsZSkgPj4gMTsKKwluZWFyZXN0X2xvdyA9IGxvd2VzdF9hdmFpbGFibGU7CisKKwl3aGlsZSAobWF4X3N0ZXBzLS0gJiYgc3RlcF9zaXplKSB7CisJCWd1ZXNzICs9IHN0ZXBfc2l6ZSAqIHN0ZXBfZGlyZWN0aW9uOworCisJCWN1ciA9ICBjbGtfcm91bmRfcmF0ZShjbGssIGd1ZXNzKTsKKworCQlpZiAoKGN1ciA8IHJhdGUpICYmIChjdXIgPiBuZWFyZXN0X2xvdykpCisJCQluZWFyZXN0X2xvdyA9IGN1cjsKKworCQkvKgorCQkgKiBpZiB3ZSBzdGVwcGVkIHRvbyBmYXIsIHRoZW4gc3RhcnQgc3RlcHBpbmcgaW4gdGhlIG90aGVyCisJCSAqIGRpcmVjdGlvbiB3aXRoIGhhbGYgdGhlIHN0ZXAgc2l6ZQorCQkgKi8KKwkJaWYgKCgoY3VyID4gcmF0ZSkgJiYgKHN0ZXBfZGlyZWN0aW9uID4gMCkpCisJCSB8fCAoKGN1ciA8IHJhdGUpICYmIChzdGVwX2RpcmVjdGlvbiA8IDApKSkgeworCQkJc3RlcF9kaXJlY3Rpb24gPSAtc3RlcF9kaXJlY3Rpb247CisJCQlzdGVwX3NpemUgPj49IDE7CisJCX0KKwl9CisJcmV0dXJuIG5lYXJlc3RfbG93OworfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX2Nsb2NrX3NldChzdHJ1Y3QgbXNtX3NwaSAqZGQsIGludCBzcGVlZCkKK3sKKwlsb25nIHJhdGU7CisJaW50IHJjOworCisJcmF0ZSA9IG1zbV9zcGlfY2xrX21heF9yYXRlKGRkLT5jbGssIHNwZWVkKTsKKwlpZiAocmF0ZSA8IDApIHsKKwkJZGV2X2VycihkZC0+ZGV2LAorCQkiJXM6IG5vIG1hdGNoIGZvdW5kIGZvciByZXF1ZXN0ZWQgY2xvY2sgZnJlcXVlbmN5OiVkIiwKKwkJCV9fZnVuY19fLCBzcGVlZCk7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IGNsa19zZXRfcmF0ZShkZC0+Y2xrLCByYXRlKTsKKwlpZiAoIXJjKQorCQlkZC0+Y2xvY2tfc3BlZWQgPSByYXRlOworfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX2Nsa19wYXRoX3ZvdGUoc3RydWN0IG1zbV9zcGkgKmRkLCB1MzIgcmF0ZSkKK3sKKwlpZiAoZGQtPmJ1c19jbF9oZGwpIHsKKwkJdTY0IGliID0gcmF0ZSAqIGRkLT5wZGF0YS0+YnVzX3dpZHRoOworCisJCW1zbV9idXNfc2NhbGVfdXBkYXRlX2J3KGRkLT5idXNfY2xfaGRsLCAwLCBpYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX2Nsa19wYXRoX3RlYXJkb3duKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwltc21fc3BpX2Nsa19wYXRoX3ZvdGUoZGQsIDApOworCisJaWYgKGRkLT5idXNfY2xfaGRsKSB7CisJCW1zbV9idXNfc2NhbGVfdW5yZWdpc3RlcihkZC0+YnVzX2NsX2hkbCk7CisJCWRkLT5idXNfY2xfaGRsID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogbXNtX3NwaV9jbGtfcGF0aF9wb3N0cG9uZWRfcmVnaXN0ZXI6IHJlZyB3aXRoIGJ1cy1zY2FsaW5nIGFmdGVyIGl0IGlzIHByb2JlZAorICoKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzCisgKgorICogV29ya2Fyb3VuZDogU1BJIGRyaXZlciBtYXkgYmUgcHJvYmVkIGJlZm9yZSB0aGUgYnVzIHNjYWxpbmcgZHJpdmVyLiBDYWxsaW5nCisgKiBtc21fYnVzX3NjYWxlX3JlZ2lzdGVyX2NsaWVudCgpIHdpbGwgZmFpbCBpZiB0aGUgYnVzIHNjYWxpbmcgZHJpdmVyIGlzIG5vdAorICogcmVhZHkgeWV0LiBUaHVzLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgbm90IGZyb20gcHJvYmUgYnV0IGZyb20gYQorICogbGF0ZXIgY29udGV4dC4gQWxzbywgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhlbiBvbmNlIGJlZm9yZQorICogcmVnaXN0ZXIgc3VjY2VlZC4gQXQgdGhpcyBjYXNlIG9ubHkgb25lIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQuIEF0IGJvb3QKKyAqIHRpbWUgYWxsIGNsb2NrcyBhcmUgb24sIHNvIGVhcmxpZXIgU1BJIHRyYW5zYWN0aW9ucyBzaG91bGQgc3VjY2VlZC4KKyAqLworc3RhdGljIGludCBtc21fc3BpX2Nsa19wYXRoX3Bvc3Rwb25lZF9yZWdpc3RlcihzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJaW50IHJldCA9IDA7CisKKwlkZC0+YnVzX2NsX2hkbCA9IG1zbV9idXNfc2NhbGVfcmVnaXN0ZXIoZGQtPnBkYXRhLT5tYXN0ZXJfaWQsCisJCQkJCQlNU01fQlVTX1NMQVZFX0VCSV9DSDAsCisJCQkJCQkoY2hhciAqKWRldl9uYW1lKGRkLT5kZXYpLAorCQkJCQkJZmFsc2UpOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGRkLT5idXNfY2xfaGRsKSkgeworCQlyZXQgPSAoZGQtPmJ1c19jbF9oZGwgPyBQVFJfRVJSKGRkLT5idXNfY2xfaGRsKSA6IC1FQUdBSU4pOworCQlkZXZfZXJyKGRkLT5kZXYsICJGYWlsZWQgYnVzIHJlZ2lzdHJhdGlvbiBFcnIgJWQiLCByZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9zcGlfY2xrX3BhdGhfaW5pdChzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJLyoKKwkgKiBiYWlsIG91dCBpZiBwYXRoIHZvdGluZyBpcyBkaWFibGVkIChtYXN0ZXJfaWQgPT0gMCkgb3IgaWYgaXQgaXMKKwkgKiBhbHJlYWR5IHJlZ2lzdGVyZWQgKGNsaWVudF9oZGwgIT0gMCkKKwkgKi8KKwlpZiAoIWRkLT5wZGF0YS0+bWFzdGVyX2lkIHx8IGRkLT5idXNfY2xfaGRsKQorCQlyZXR1cm47CisKKwkvKiBvbiBmYWlsdXJlIHRyeSBhZ2FpbiBsYXRlciAqLworCWlmIChtc21fc3BpX2Nsa19wYXRoX3Bvc3Rwb25lZF9yZWdpc3RlcihkZCkpCisJCXJldHVybjsKKworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfY2FsY3VsYXRlX3NpemUoaW50ICpmaWZvX3NpemUsCisJCQkJICBpbnQgKmJsb2NrX3NpemUsCisJCQkJICBpbnQgYmxvY2ssCisJCQkJICBpbnQgbXVsdCkKK3sKKwlpbnQgd29yZHM7CisKKwlzd2l0Y2ggKGJsb2NrKSB7CisJY2FzZSAwOgorCQl3b3JkcyA9IDE7IC8qIDQgYnl0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSAxOgorCQl3b3JkcyA9IDQ7IC8qIDE2IGJ5dGVzICovCisJCWJyZWFrOworCWNhc2UgMjoKKwkJd29yZHMgPSA4OyAvKiAzMiBieXRlcyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG11bHQpIHsKKwljYXNlIDA6CisJCSpmaWZvX3NpemUgPSB3b3JkcyAqIDI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJKmZpZm9fc2l6ZSA9IHdvcmRzICogNDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqZmlmb19zaXplID0gd29yZHMgKiA4OworCQlicmVhazsKKwljYXNlIDM6CisJCSpmaWZvX3NpemUgPSB3b3JkcyAqIDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqYmxvY2tfc2l6ZSA9IHdvcmRzICogc2l6ZW9mKHUzMik7IC8qIGluIGJ5dGVzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9zcGlfY2FsY3VsYXRlX2ZpZm9fc2l6ZShzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJdTMyIHNwaV9pb207CisJaW50IGJsb2NrOworCWludCBtdWx0OworCisJc3BpX2lvbSA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfSU9fTU9ERVMpOworCisJYmxvY2sgPSAoc3BpX2lvbSAmIFNQSV9JT19NX0lOUFVUX0JMT0NLX1NJWkUpID4+IElOUFVUX0JMT0NLX1NaX1NISUZUOworCW11bHQgPSAoc3BpX2lvbSAmIFNQSV9JT19NX0lOUFVUX0ZJRk9fU0laRSkgPj4gSU5QVVRfRklGT19TWl9TSElGVDsKKwlpZiAobXNtX3NwaV9jYWxjdWxhdGVfc2l6ZSgmZGQtPmlucHV0X2ZpZm9fc2l6ZSwgJmRkLT5pbnB1dF9ibG9ja19zaXplLAorCQkJCSAgIGJsb2NrLCBtdWx0KSkgeworCQlnb3RvIGZpZm9fc2l6ZV9lcnI7CisJfQorCisJYmxvY2sgPSAoc3BpX2lvbSAmIFNQSV9JT19NX09VVFBVVF9CTE9DS19TSVpFKSA+PiBPVVRQVVRfQkxPQ0tfU1pfU0hJRlQ7CisJbXVsdCA9IChzcGlfaW9tICYgU1BJX0lPX01fT1VUUFVUX0ZJRk9fU0laRSkgPj4gT1VUUFVUX0ZJRk9fU1pfU0hJRlQ7CisJaWYgKG1zbV9zcGlfY2FsY3VsYXRlX3NpemUoJmRkLT5vdXRwdXRfZmlmb19zaXplLAorCQkJCSAgICZkZC0+b3V0cHV0X2Jsb2NrX3NpemUsIGJsb2NrLCBtdWx0KSkgeworCQlnb3RvIGZpZm9fc2l6ZV9lcnI7CisJfQorCWlmIChkZC0+cXVwX3ZlciA9PSBTUElfUVVQX1ZFUlNJT05fTk9ORSkgeworCQkvKiBETSBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgYmxvY2sgc2l6ZSAqLworCQlpZiAoZGQtPmlucHV0X2Jsb2NrX3NpemUgPT0gNCB8fCBkZC0+b3V0cHV0X2Jsb2NrX3NpemUgPT0gNCkKKwkJCWRkLT51c2VfZG1hID0gMDsKKworCQlpZiAoZGQtPnVzZV9kbWEpIHsKKwkJCWRkLT5pbnB1dF9idXJzdF9zaXplID0gbWF4KGRkLT5pbnB1dF9ibG9ja19zaXplLAorCQkJCQkJRE1fQlVSU1RfU0laRSk7CisJCQlkZC0+b3V0cHV0X2J1cnN0X3NpemUgPSBtYXgoZGQtPm91dHB1dF9ibG9ja19zaXplLAorCQkJCQkJRE1fQlVSU1RfU0laRSk7CisJCX0KKwl9CisKKwlyZXR1cm47CisKK2ZpZm9fc2l6ZV9lcnI6CisJZGQtPnVzZV9kbWEgPSAwOworCXByX2VycigiJXM6IGludmFsaWQgRklGTyBzaXplLCBTUElfSU9fTU9ERVM9MHgleFxuIiwgX19mdW5jX18sIHNwaV9pb20pOworfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX3JlYWRfd29yZF9mcm9tX2ZpZm8oc3RydWN0IG1zbV9zcGkgKmRkKQoreworCXUzMiAgIGRhdGFfaW47CisJaW50ICAgaTsKKwlpbnQgICBzaGlmdDsKKwlpbnQgICByZWFkX2J5dGVzID0gKGRkLT5wYWNrX3dvcmRzID8KKwkJCQlTUElfTUFYX0JZVEVTX1BFUl9XT1JEIDogZGQtPmJ5dGVzX3Blcl93b3JkKTsKKworCWRhdGFfaW4gPSByZWFkbF9yZWxheGVkKGRkLT5iYXNlICsgU1BJX0lOUFVUX0ZJRk8pOworCWlmIChkZC0+cmVhZF9idWYpIHsKKwkJZm9yIChpID0gMDsgKGkgPCByZWFkX2J5dGVzKSAmJgorCQkJICAgICBkZC0+cnhfYnl0ZXNfcmVtYWluaW5nOyBpKyspIHsKKwkJCS8qIFRoZSBkYXRhIGZvcm1hdCBkZXBlbmRzIG9uIGJ5dGVzX3Blcl93b3JkOgorCQkJICogNCBieXRlczogMHgxMjM0NTY3OAorCQkJICogMyBieXRlczogMHgwMDEyMzQ1NgorCQkJICogMiBieXRlczogMHgwMDAwMTIzNAorCQkJICogMSBieXRlIDogMHgwMDAwMDAxMgorCQkJICovCisJCQlzaGlmdCA9IEJJVFNfUEVSX0JZVEUgKiBpOworCQkJKmRkLT5yZWFkX2J1ZisrID0gKGRhdGFfaW4gJiAoMHhGRiA8PCBzaGlmdCkpID4+IHNoaWZ0OworCQkJZGQtPnJ4X2J5dGVzX3JlbWFpbmluZy0tOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRkLT5yeF9ieXRlc19yZW1haW5pbmcgPj0gcmVhZF9ieXRlcykKKwkJCWRkLT5yeF9ieXRlc19yZW1haW5pbmcgLT0gcmVhZF9ieXRlczsKKwkJZWxzZQorCQkJZGQtPnJ4X2J5dGVzX3JlbWFpbmluZyA9IDA7CisJfQorCisJZGQtPnJlYWRfeGZyX2NudCsrOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbXNtX3NwaV9pc192YWxpZF9zdGF0ZShzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJdTMyIHNwaV9vcCA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfU1RBVEUpOworCisJcmV0dXJuIHNwaV9vcCAmIFNQSV9PUF9TVEFURV9WQUxJRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfdWRlbGF5KHVuc2lnbmVkIGludCBkZWxheV91c2VjcykKK3sKKwkvKgorCSAqIEZvciBzbWFsbGVyIHZhbHVlcyBvZiBkZWxheSwgY29udGV4dCBzd2l0Y2ggdGltZQorCSAqIHdvdWxkIG5lZ2F0ZSB0aGUgdXNhZ2Ugb2YgdXNsZWVwCisJICovCisJaWYgKGRlbGF5X3VzZWNzID4gMjApCisJCXVzbGVlcF9yYW5nZShkZWxheV91c2VjcywgZGVsYXlfdXNlY3MgKyAxKTsKKwllbHNlIGlmIChkZWxheV91c2VjcykKKwkJdWRlbGF5KGRlbGF5X3VzZWNzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV93YWl0X3ZhbGlkKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXkgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDA7CisKKwlpZiAoZGQtPmNsb2NrX3NwZWVkID09IDApCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogQmFzZWQgb24gdGhlIFNQSSBjbG9jayBzcGVlZCwgc3VmZmljaWVudCB0aW1lCisJICogc2hvdWxkIGJlIGdpdmVuIGZvciB0aGUgU1BJIHN0YXRlIHRyYW5zaXRpb24KKwkgKiB0byBvY2N1cgorCSAqLworCWRlbGF5ID0gKDEwICogVVNFQ19QRVJfU0VDKSAvIGRkLT5jbG9ja19zcGVlZDsKKwkvKgorCSAqIEZvciBzbWFsbCBkZWxheSB2YWx1ZXMsIHRoZSBkZWZhdWx0IHRpbWVvdXQgd291bGQKKwkgKiBiZSBvbmUgamlmZnkKKwkgKi8KKwlpZiAoZGVsYXkgPCBTUElfREVMQVlfVEhSRVNIT0xEKQorCQlkZWxheSA9IFNQSV9ERUxBWV9USFJFU0hPTEQ7CisKKwkvKiBBZGRpbmcgb25lIHRvIHJvdW5kIG9mZiB0byB0aGUgbmVhcmVzdCBqaWZmeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhkZWxheSAqIFNQSV9ERUZBVUxUX1RJTUVPVVQpICsgMTsKKwl3aGlsZSAoIW1zbV9zcGlfaXNfdmFsaWRfc3RhdGUoZGQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlpZiAoIW1zbV9zcGlfaXNfdmFsaWRfc3RhdGUoZGQpKSB7CisJCQkJZGV2X2VycihkZC0+ZGV2LCAiSW52YWxpZCBTUEkgb3BlcmF0aW9uYWwgc3RhdGVcbiIpOworCQkJCXJldHVybiAtRVRJTUVET1VUOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJbXNtX3NwaV91ZGVsYXkoZGVsYXkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9zZXRfc3RhdGUoc3RydWN0IG1zbV9zcGkgKmRkLAorCQkJCSAgICBlbnVtIG1zbV9zcGlfc3RhdGUgc3RhdGUpCit7CisJZW51bSBtc21fc3BpX3N0YXRlIGN1cl9zdGF0ZTsKKworCWlmIChtc21fc3BpX3dhaXRfdmFsaWQoZGQpKQorCQlyZXR1cm4gLUVJTzsKKwljdXJfc3RhdGUgPSByZWFkbF9yZWxheGVkKGRkLT5iYXNlICsgU1BJX1NUQVRFKTsKKwkvKiBQZXIgc3BlYzoKKwkgKiBGb3IgUEFVU0VfU1RBVEUgdG8gUkVTRVRfU1RBVEUsIHR3byB3cml0ZXMgb2YgKDEwKSBhcmUgcmVxdWlyZWQKKwkgKi8KKwlpZiAoKChjdXJfc3RhdGUgJiBTUElfT1BfU1RBVEUpID09IFNQSV9PUF9TVEFURV9QQVVTRSkgJiYKKwkJCShzdGF0ZSA9PSBTUElfT1BfU1RBVEVfUkVTRVQpKSB7CisJCXdyaXRlbF9yZWxheGVkKFNQSV9PUF9TVEFURV9DTEVBUl9CSVRTLCBkZC0+YmFzZSArIFNQSV9TVEFURSk7CisJCXdyaXRlbF9yZWxheGVkKFNQSV9PUF9TVEFURV9DTEVBUl9CSVRTLCBkZC0+YmFzZSArIFNQSV9TVEFURSk7CisJfSBlbHNlIHsKKwkJd3JpdGVsX3JlbGF4ZWQoKGN1cl9zdGF0ZSAmIH5TUElfT1BfU1RBVEUpIHwgc3RhdGUsCisJCSAgICAgICBkZC0+YmFzZSArIFNQSV9TVEFURSk7CisJfQorCWlmIChtc21fc3BpX3dhaXRfdmFsaWQoZGQpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIG1zbV9zcGlfc2V0X2Jwd19hbmRfbm9faW9fZmxhZ3M6IGNvbmZpZ3VyZSBOLCBhbmQgbm8taW5wdXQvbm8tb3V0cHV0IGZsYWdzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbXNtX3NwaV9zZXRfYnB3X2FuZF9ub19pb19mbGFncyhzdHJ1Y3QgbXNtX3NwaSAqZGQsIHUzMiAqY29uZmlnLCBpbnQgbikKK3sKKwkqY29uZmlnICY9IH4oU1BJX05PX0lOUFVUfFNQSV9OT19PVVRQVVQpOworCisJaWYgKG4gIT0gKCpjb25maWcgJiBTUElfQ0ZHX04pKQorCQkqY29uZmlnID0gKCpjb25maWcgJiB+U1BJX0NGR19OKSB8IG47CisKKwlpZiAoZGQtPnR4X21vZGUgPT0gU1BJX0JBTV9NT0RFKSB7CisJCWlmIChkZC0+cmVhZF9idWYgPT0gTlVMTCkKKwkJCSpjb25maWcgfD0gU1BJX05PX0lOUFVUOworCQlpZiAoZGQtPndyaXRlX2J1ZiA9PSBOVUxMKQorCQkJKmNvbmZpZyB8PSBTUElfTk9fT1VUUFVUOworCX0KK30KKworLyoqCisgKiBtc21fc3BpX2NhbGNfc3BpX2NvbmZpZ19sb29wYmFja19hbmRfaW5wdXRfZmlyc3Q6IENhbGN1bGF0ZSB0aGUgdmFsdWVzIHRoYXQKKyAqIHNob3VsZCBiZSB1cGRhdGVkIGludG8gU1BJX0NPTkZJRydzIExPT1BCQUNLIGFuZCBJTlBVVF9GSVJTVCBmbGFncworICogQHJldHVybiBjYWxjdWxhdGQgdmFsdWUgZm9yIFNQSV9DT05GSUcKKyAqLworc3RhdGljIHUzMgorbXNtX3NwaV9jYWxjX3NwaV9jb25maWdfbG9vcGJhY2tfYW5kX2lucHV0X2ZpcnN0KHUzMiBzcGlfY29uZmlnLCB1OCBtb2RlKQoreworCWlmIChtb2RlICYgU1BJX0xPT1ApCisJCXNwaV9jb25maWcgfD0gU1BJX0NGR19MT09QQkFDSzsKKwllbHNlCisJCXNwaV9jb25maWcgJj0gflNQSV9DRkdfTE9PUEJBQ0s7CisKKwlpZiAobW9kZSAmIFNQSV9DUEhBKQorCQlzcGlfY29uZmlnICY9IH5TUElfQ0ZHX0lOUFVUX0ZJUlNUOworCWVsc2UKKwkJc3BpX2NvbmZpZyB8PSBTUElfQ0ZHX0lOUFVUX0ZJUlNUOworCisJcmV0dXJuIHNwaV9jb25maWc7Cit9CisKKy8qKgorICogbXNtX3NwaV9zZXRfc3BpX2NvbmZpZzogcHJlcGFyZXMgcmVnaXN0ZXIgU1BJX0NPTkZJRyB0byBwcm9jZXNzIHRoZQorICogbmV4dCB0cmFuc2ZlcgorICovCitzdGF0aWMgdm9pZCBtc21fc3BpX3NldF9zcGlfY29uZmlnKHN0cnVjdCBtc21fc3BpICpkZCwgaW50IGJwdykKK3sKKwl1MzIgc3BpX2NvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfQ09ORklHKTsKKworCXNwaV9jb25maWcgPSBtc21fc3BpX2NhbGNfc3BpX2NvbmZpZ19sb29wYmFja19hbmRfaW5wdXRfZmlyc3QoCisJCQkJCXNwaV9jb25maWcsIGRkLT5zcGktPm1vZGUpOworCisJaWYgKGRkLT5xdXBfdmVyID09IFNQSV9RVVBfVkVSU0lPTl9OT05FKQorCQkvKiBmbGFncyByZW1vdmVkIGZyb20gU1BJX0NPTkZJRyBpbiBRVVAgdmVyc2lvbi0yICovCisJCW1zbV9zcGlfc2V0X2Jwd19hbmRfbm9faW9fZmxhZ3MoZGQsICZzcGlfY29uZmlnLCBicHctMSk7CisKKwkvKgorCSAqIEhTX01PREUgaW1wcm92ZXMgc2lnbmFsIHN0YWJpbGl0eSBmb3Igc3BpLWNsayBoaWdoIHJhdGVzCisJICogYnV0IGlzIGludmFsaWQgaW4gTE9PUEJBQ0sgbW9kZS4KKwkgKi8KKwlpZiAoKGRkLT5jbG9ja19zcGVlZCA+PSBTUElfSFNfTUlOX1JBVEUpICYmCisJICAgIShkZC0+c3BpLT5tb2RlICYgU1BJX0xPT1ApKQorCQlzcGlfY29uZmlnIHw9IFNQSV9DRkdfSFNfTU9ERTsKKwllbHNlCisJCXNwaV9jb25maWcgJj0gflNQSV9DRkdfSFNfTU9ERTsKKworCXdyaXRlbF9yZWxheGVkKHNwaV9jb25maWcsIGRkLT5iYXNlICsgU1BJX0NPTkZJRyk7Cit9CisKKy8qKgorICogbXNtX3NwaV9zZXRfbXhfY291bnRzOiBzZXQgU1BJX01YX0lOUFVUX0NPVU5UIGFuZCBTUElfTVhfSU5QVVRfQ09VTlQKKyAqIGZvciBGSUZPLW1vZGUuIHNldCBTUElfTVhfSU5QVVRfQ09VTlQgYW5kIFNQSV9NWF9PVVRQVVRfQ09VTlQgZm9yCisgKiBCQU0gYW5kIERNT1YgbW9kZXMuCisgKiBAbl93b3JkcyBUaGUgbnVtYmVyIG9mIHJlYWRzL3dyaXRlcyBvZiBzaXplIE4uCisgKi8KK3N0YXRpYyB2b2lkIG1zbV9zcGlfc2V0X214X2NvdW50cyhzdHJ1Y3QgbXNtX3NwaSAqZGQsIHUzMiBuX3dvcmRzKQoreworCS8qCisJICogRm9yIEZJRk8gbW9kZToKKwkgKiAgIC0gU2V0IHRoZSBNWF9PVVRQVVRfQ09VTlQvTVhfSU5QVVRfQ09VTlQgcmVnaXN0ZXJzIHRvIDAKKwkgKiAgIC0gU2V0IHRoZSBSRUFEL1dSSVRFX0NPVU5UIHJlZ2lzdGVycyB0byAwIChpbmZpbml0ZSBtb2RlKQorCSAqICAgICBvciBudW0gYnl0ZXMgKGZpbml0ZSBtb2RlKSBpZiBsZXNzIHRoYW4gZmlmbyB3b3J0aCBvZiBkYXRhLgorCSAqIEZvciBCbG9jayBtb2RlOgorCSAqICAtIFNldCB0aGUgTVhfT1VUUFVUL01YX0lOUFVUX0NPVU5UIHJlZ2lzdGVycyB0byBudW0geGZlciBieXRlcy4KKwkgKiAgLSBTZXQgdGhlIFJFQUQvV1JJVEVfQ09VTlQgcmVnaXN0ZXJzIHRvIDAuCisJICovCisJaWYgKGRkLT50eF9tb2RlICE9IFNQSV9CQU1fTU9ERSkgeworCQlpZiAoZGQtPnR4X21vZGUgPT0gU1BJX0ZJRk9fTU9ERSkgeworCQkJaWYgKG5fd29yZHMgPD0gZGQtPmlucHV0X2ZpZm9fc2l6ZSkKKwkJCQltc21fc3BpX3NldF93cml0ZV9jb3VudChkZCwgbl93b3Jkcyk7CisJCQllbHNlCisJCQkJbXNtX3NwaV9zZXRfd3JpdGVfY291bnQoZGQsIDApOworCQkJd3JpdGVsX3JlbGF4ZWQoMCwgZGQtPmJhc2UgKyBTUElfTVhfT1VUUFVUX0NPVU5UKTsKKwkJfSBlbHNlCisJCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBkZC0+YmFzZSArIFNQSV9NWF9PVVRQVVRfQ09VTlQpOworCisJCWlmIChkZC0+cnhfbW9kZSA9PSBTUElfRklGT19NT0RFKSB7CisJCQlpZiAobl93b3JkcyA8PSBkZC0+aW5wdXRfZmlmb19zaXplKQorCQkJCXdyaXRlbF9yZWxheGVkKG5fd29yZHMsCisJCQkJCQlkZC0+YmFzZSArIFNQSV9NWF9SRUFEX0NPVU5UKTsKKwkJCWVsc2UKKwkJCQl3cml0ZWxfcmVsYXhlZCgwLAorCQkJCQkJZGQtPmJhc2UgKyBTUElfTVhfUkVBRF9DT1VOVCk7CisJCQl3cml0ZWxfcmVsYXhlZCgwLCBkZC0+YmFzZSArIFNQSV9NWF9JTlBVVF9DT1VOVCk7CisJCX0gZWxzZQorCQkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgZGQtPmJhc2UgKyBTUElfTVhfSU5QVVRfQ09VTlQpOworCX0gZWxzZSB7CisJCS8qIG11c3QgYmUgemVybyBmb3IgQkFNIGFuZCBETU9WICovCisJCXdyaXRlbF9yZWxheGVkKDAsIGRkLT5iYXNlICsgU1BJX01YX1JFQURfQ09VTlQpOworCQltc21fc3BpX3NldF93cml0ZV9jb3VudChkZCwgMCk7CisKKwkJLyoKKwkJICogZm9yIERNQSB0cmFuc2ZlcnMsIGJvdGggUVVQX01YX0lOUFVUX0NPVU5UIGFuZAorCQkgKiBRVVBfTVhfT1VUUFVUX0NPVU5UIG11c3QgYmUgemVybyB0byBhbGwgY2FzZXMgYnV0IG9uZS4KKwkJICogVGhhdCBjYXNlIGlzIGEgbm9uLWJhbGFuY2VkIHRyYW5zZmVyIHdoZW4gdGhlcmUgaXMKKwkJICogb25seSBhIHJlYWRfYnVmLgorCQkgKi8KKwkJaWYgKGRkLT5xdXBfdmVyID09IFNQSV9RVVBfVkVSU0lPTl9CRkFNKSB7CisJCQlpZiAoZGQtPndyaXRlX2J1ZikKKwkJCQl3cml0ZWxfcmVsYXhlZCgwLAorCQkJCQkJZGQtPmJhc2UgKyBTUElfTVhfSU5QVVRfQ09VTlQpOworCQkJZWxzZQorCQkJCXdyaXRlbF9yZWxheGVkKG5fd29yZHMsCisJCQkJCQlkZC0+YmFzZSArIFNQSV9NWF9JTlBVVF9DT1VOVCk7CisKKwkJCXdyaXRlbF9yZWxheGVkKDAsIGRkLT5iYXNlICsgU1BJX01YX09VVFBVVF9DT1VOVCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9iYW1fcGlwZV9kaXNjb25uZWN0KHN0cnVjdCBtc21fc3BpICpkZCwKKwkJCQkJCXN0cnVjdCBtc21fc3BpX2JhbV9waXBlICAqcGlwZSkKK3sKKwlpbnQgcmV0ID0gc3BzX2Rpc2Nvbm5lY3QocGlwZS0+aGFuZGxlKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2RiZyhkZC0+ZGV2LCAiJXMgZGlzY29ubmVjdCBiYW0gJXMgcGlwZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgcGlwZS0+bmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfYmFtX3BpcGVfY29ubmVjdChzdHJ1Y3QgbXNtX3NwaSAqZGQsCisJCXN0cnVjdCBtc21fc3BpX2JhbV9waXBlICAqcGlwZSwgc3RydWN0IHNwc19jb25uZWN0ICpjb25maWcpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BzX3JlZ2lzdGVyX2V2ZW50IGV2ZW50ICA9IHsKKwkJLm1vZGUgICAgICA9IFNQU19UUklHR0VSX1dBSVQsCisJCS5vcHRpb25zICAgPSBTUFNfT19FT1QsCisJfTsKKworCWlmIChwaXBlID09ICZkZC0+YmFtLnByb2QpCisJCWV2ZW50LnhmZXJfZG9uZSA9ICZkZC0+cnhfdHJhbnNmZXJfY29tcGxldGU7CisJZWxzZSBpZiAocGlwZSA9PSAmZGQtPmJhbS5jb25zKQorCQlldmVudC54ZmVyX2RvbmUgPSAmZGQtPnR4X3RyYW5zZmVyX2NvbXBsZXRlOworCisJcmV0ID0gc3BzX2Nvbm5lY3QocGlwZS0+aGFuZGxlLCBjb25maWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZC0+ZGV2LCAiJXM6IHNwc19jb25uZWN0KCVzOjB4JXBLKTolZCIsCisJCQkJX19mdW5jX18sIHBpcGUtPm5hbWUsIHBpcGUtPmhhbmRsZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzcHNfcmVnaXN0ZXJfZXZlbnQocGlwZS0+aGFuZGxlLCAmZXZlbnQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZC0+ZGV2LCAiJXMgc3BzX3JlZ2lzdGVyX2V2ZW50KGhuZGw6MHglcEsgJXMpOiVkIiwKKwkJCQlfX2Z1bmNfXywgcGlwZS0+aGFuZGxlLCBwaXBlLT5uYW1lLCByZXQpOworCQltc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsIHBpcGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBpcGUtPnRlYXJkb3duX3JlcXVpcmVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBtc21fc3BpX2JhbV9waXBlX2ZsdXNoKHN0cnVjdCBtc21fc3BpICpkZCwKKwkJCQkJZW51bSBtc21fc3BpX3BpcGVfZGlyZWN0aW9uIHBpcGVfZGlyKQoreworCXN0cnVjdCBtc21fc3BpX2JhbV9waXBlICpwaXBlID0gKHBpcGVfZGlyID09IFNQSV9CQU1fQ09OU1VNRVJfUElQRSkgPworCQkJCQkoJmRkLT5iYW0ucHJvZCkgOiAoJmRkLT5iYW0uY29ucyk7CisJc3RydWN0IHNwc19jb25uZWN0ICAgICAgICAgICBjb25maWcgID0gcGlwZS0+Y29uZmlnOworCWludCAgICByZXQ7CisKKwlyZXQgPSBtc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsIHBpcGUpOworCWlmIChyZXQpCisJCXJldHVybjsKKworCXJldCA9IG1zbV9zcGlfYmFtX3BpcGVfY29ubmVjdChkZCwgcGlwZSwgJmNvbmZpZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX2JhbV9mbHVzaChzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJZGV2X2RiZyhkZC0+ZGV2LCAiJXMgZmx1c2hpbmcgYmFtIGZvciByZWNvdmVyeVxuIiwgX19mdW5jX18pOworCisJbXNtX3NwaV9iYW1fcGlwZV9mbHVzaChkZCwgU1BJX0JBTV9DT05TVU1FUl9QSVBFKTsKKwltc21fc3BpX2JhbV9waXBlX2ZsdXNoKGRkLCBTUElfQkFNX1BST0RVQ0VSX1BJUEUpOworfQorCitzdGF0aWMgaW50Cittc21fc3BpX2JhbV9wcm9jZXNzX3J4KHN0cnVjdCBtc21fc3BpICpkZCwgdTMyICpieXRlc190b19zZW5kLCB1MzIgZGVzY19jbnQpCit7CisJaW50IHJldCA9IDA7CisJdTMyIGRhdGFfeGZyX3NpemUgPSAwLCByZW1fYmMgPSAwOworCXUzMiBwcm9kX2ZsYWdzID0gMDsKKworCXJlbV9iYyA9IGRkLT5jdXJfcnhfdHJhbnNmZXItPmxlbiAtIGRkLT5iYW0uY3Vycl9yeF9ieXRlc19yZWN2ZDsKKwlkYXRhX3hmcl9zaXplID0gKHJlbV9iYyA8ICpieXRlc190b19zZW5kKSA/IHJlbV9iYyA6ICpieXRlc190b19zZW5kOworCisJLyoKKwkgKiBzZXQgZmxhZ3MgZm9yIGxhc3QgZGVzY3JpcHRvciBvbmx5CisJICovCisJaWYgKChkZXNjX2NudCA9PSAxKQorCQl8fCAoKmJ5dGVzX3RvX3NlbmQgPT0gZGF0YV94ZnJfc2l6ZSkpCisJCXByb2RfZmxhZ3MgPSAoZGQtPndyaXRlX2J1ZikKKwkJCT8gMCA6IChTUFNfSU9WRUNfRkxBR19FT1QgfCBTUFNfSU9WRUNfRkxBR19OV0QpOworCisJLyoKKwkgKiBlbnF1ZXVlIHJlYWQgYnVmZmVyIGluIEJBTQorCSAqLworCXJldCA9IHNwc190cmFuc2Zlcl9vbmUoZGQtPmJhbS5wcm9kLmhhbmRsZSwKKwkJCWRkLT5jdXJfcnhfdHJhbnNmZXItPnJ4X2RtYQorCQkJCSsgZGQtPmJhbS5jdXJyX3J4X2J5dGVzX3JlY3ZkLAorCQkJZGF0YV94ZnJfc2l6ZSwgZGQsIHByb2RfZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGQtPmRldiwKKwkJIiVzOiBGYWlsZWQgdG8gcXVldWUgcHJvZHVjZXIgQkFNIHRyYW5zZmVyIiwKKwkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRkLT5iYW0uY3Vycl9yeF9ieXRlc19yZWN2ZCArPSBkYXRhX3hmcl9zaXplOworCSpieXRlc190b19zZW5kIC09IGRhdGFfeGZyX3NpemU7CisJZGQtPmJhbS5iYW1fcnhfbGVuIC09IGRhdGFfeGZyX3NpemU7CisJcmV0dXJuIGRhdGFfeGZyX3NpemU7Cit9CisKK3N0YXRpYyBpbnQKK21zbV9zcGlfYmFtX3Byb2Nlc3NfdHgoc3RydWN0IG1zbV9zcGkgKmRkLCB1MzIgKmJ5dGVzX3RvX3NlbmQsIHUzMiBkZXNjX2NudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgZGF0YV94ZnJfc2l6ZSA9IDAsIHJlbV9iYyA9IDA7CisJdTMyIGNvbnNfZmxhZ3MgPSAwOworCisJcmVtX2JjID0gZGQtPmN1cl90eF90cmFuc2Zlci0+bGVuIC0gZGQtPmJhbS5jdXJyX3R4X2J5dGVzX3NlbnQ7CisJZGF0YV94ZnJfc2l6ZSA9IChyZW1fYmMgPCAqYnl0ZXNfdG9fc2VuZCkgPyByZW1fYmMgOiAqYnl0ZXNfdG9fc2VuZDsKKworCS8qCisJICogc2V0IGZsYWdzIGZvciBsYXN0IGRlc2NyaXB0b3Igb25seQorCSAqLworCWlmICgoZGVzY19jbnQgPT0gMSkKKwkJfHwgKCpieXRlc190b19zZW5kID09IGRhdGFfeGZyX3NpemUpKQorCQljb25zX2ZsYWdzID0gU1BTX0lPVkVDX0ZMQUdfRU9UIHwgU1BTX0lPVkVDX0ZMQUdfTldEOworCisJLyoKKwkgKiBlbnF1ZXVlIHdyaXRlIGJ1ZmZlciBpbiBCQU0KKwkgKi8KKwlyZXQgPSBzcHNfdHJhbnNmZXJfb25lKGRkLT5iYW0uY29ucy5oYW5kbGUsCisJCQlkZC0+Y3VyX3R4X3RyYW5zZmVyLT50eF9kbWEKKwkJCQkrIGRkLT5iYW0uY3Vycl90eF9ieXRlc19zZW50LAorCQkJZGF0YV94ZnJfc2l6ZSwgZGQsIGNvbnNfZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGQtPmRldiwKKwkJIiVzOiBGYWlsZWQgdG8gcXVldWUgY29uc3VtZXIgQkFNIHRyYW5zZmVyIiwKKwkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRkLT5iYW0uY3Vycl90eF9ieXRlc19zZW50CSs9IGRhdGFfeGZyX3NpemU7CisJKmJ5dGVzX3RvX3NlbmQJLT0gZGF0YV94ZnJfc2l6ZTsKKwlkZC0+YmFtLmJhbV90eF9sZW4gLT0gZGF0YV94ZnJfc2l6ZTsKKwlyZXR1cm4gZGF0YV94ZnJfc2l6ZTsKK30KKworCisvKioKKyAqIG1zbV9zcGlfYmFtX2JlZ2luX3RyYW5zZmVyOiB0cmFuc2ZlciBkZC0+dHhfYnl0ZXNfcmVtYWluaW5nIGJ5dGVzCisgKiB1c2luZyBCQU0uCisgKiBAYnJpZWYgQkFNIGNhbiB0cmFuc2ZlciBTUElfTUFYX1RSRlJfQlRXTl9SRVNFVFMgYnl0ZSBhdCBhIHNpbmdsZQorICogdHJhbnNmZXIuIEJldHdlZW4gdHJhbnNmZXIgUVVQIG11c3QgY2hhbmdlIHRvIHJlc2V0IHN0YXRlLiBBIGxvb3AgaXMKKyAqIGlzc3VpbmcgYSBzaW5nbGUgQkFNIHRyYW5zZmVyIGF0IGEgdGltZS4KKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK21zbV9zcGlfYmFtX2JlZ2luX3RyYW5zZmVyKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl1MzIgdHhfYnl0ZXNfdG9fc2VuZCA9IDAsIHJ4X2J5dGVzX3RvX3JlY3YgPSAwOworCXUzMiBuX3dvcmRzX3hmcjsKKwlzMzIgcmV0ID0gMDsKKwl1MzIgcHJvZF9kZXNjX2NudCA9IFNQSV9CQU1fTUFYX0RFU0NfTlVNIC0gMTsKKwl1MzIgY29uc19kZXNjX2NudCA9IFNQSV9CQU1fTUFYX0RFU0NfTlVNIC0gMTsKKwl1MzIgYnl0ZV9jb3VudCA9IDA7CisKKwlyeF9ieXRlc190b19yZWN2ID0gbWluX3QodTMyLCBkZC0+YmFtLmJhbV9yeF9sZW4sCisJCQkJU1BJX01BWF9UUkZSX0JUV05fUkVTRVRTKTsKKwl0eF9ieXRlc190b19zZW5kID0gbWluX3QodTMyLCBkZC0+YmFtLmJhbV90eF9sZW4sCisJCQkJU1BJX01BWF9UUkZSX0JUV05fUkVTRVRTKTsKKwluX3dvcmRzX3hmciA9IERJVl9ST1VORF9VUChyeF9ieXRlc190b19yZWN2LAorCQkJCWRkLT5ieXRlc19wZXJfd29yZCk7CisKKwltc21fc3BpX3NldF9teF9jb3VudHMoZGQsIG5fd29yZHNfeGZyKTsKKwlyZXQgPSBtc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JVTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gc2V0IFFVUCBzdGF0ZSB0byBydW4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIHhmcl9lcnI7CisJfQorCisJd2hpbGUgKChyeF9ieXRlc190b19yZWN2ICsgdHhfYnl0ZXNfdG9fc2VuZCkgJiYKKwkJKChjb25zX2Rlc2NfY250ICsgcHJvZF9kZXNjX2NudCkgPiAwKSkgeworCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ID0gTlVMTDsKKworCQlpZiAoZGQtPnJlYWRfYnVmICYmIChwcm9kX2Rlc2NfY250ID4gMCkpIHsKKwkJCXJldCA9IG1zbV9zcGlfYmFtX3Byb2Nlc3NfcngoZGQsICZyeF9ieXRlc190b19yZWN2LAorCQkJCQkJCXByb2RfZGVzY19jbnQpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byB4ZnJfZXJyOworCisJCQlpZiAoIShkZC0+Y3VyX3J4X3RyYW5zZmVyLT5sZW4KKwkJCQktIGRkLT5iYW0uY3Vycl9yeF9ieXRlc19yZWN2ZCkpCisJCQkJdCA9IGRkLT5jdXJfcnhfdHJhbnNmZXI7CisJCQlwcm9kX2Rlc2NfY250LS07CisJCX0KKworCQlpZiAoZGQtPndyaXRlX2J1ZiAmJiAoY29uc19kZXNjX2NudCA+IDApKSB7CisJCQlyZXQgPSBtc21fc3BpX2JhbV9wcm9jZXNzX3R4KGRkLCAmdHhfYnl0ZXNfdG9fc2VuZCwKKwkJCQkJCQljb25zX2Rlc2NfY250KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8geGZyX2VycjsKKworCQkJaWYgKCEoZGQtPmN1cl90eF90cmFuc2Zlci0+bGVuCisJCQkJLSBkZC0+YmFtLmN1cnJfdHhfYnl0ZXNfc2VudCkpCisJCQkJdCA9IGRkLT5jdXJfdHhfdHJhbnNmZXI7CisJCQljb25zX2Rlc2NfY250LS07CisJCX0KKworCQlieXRlX2NvdW50ICs9IHJldDsKKwl9CisKKwlkZC0+dHhfYnl0ZXNfcmVtYWluaW5nIC09IG1pbl90KHUzMiwgYnl0ZV9jb3VudCwKKwkJCQkJCVNQSV9NQVhfVFJGUl9CVFdOX1JFU0VUUyk7CisJcmV0dXJuIDA7Cit4ZnJfZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK21zbV9zcGlfYmFtX25leHRfdHJhbnNmZXIoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWlmIChkZC0+dHhfbW9kZSAhPSBTUElfQkFNX01PREUpCisJCXJldHVybiAwOworCisJaWYgKGRkLT50eF9ieXRlc19yZW1haW5pbmcgPiAwKSB7CisJCWlmIChtc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JFU0VUKSkKKwkJCXJldHVybiAwOworCQlpZiAoKG1zbV9zcGlfYmFtX2JlZ2luX3RyYW5zZmVyKGRkKSkgPCAwKSB7CisJCQlkZXZfZXJyKGRkLT5kZXYsICIlczogQkFNIHRyYW5zZmVyIHNldHVwIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9kbWFfc2VuZF9uZXh0KHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZC0+dHhfbW9kZSA9PSBTUElfQkFNX01PREUpCisJCXJldCA9IG1zbV9zcGlfYmFtX25leHRfdHJhbnNmZXIoZGQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2Fja190cmFuc2ZlcihzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJd3JpdGVsX3JlbGF4ZWQoU1BJX09QX01BWF9JTlBVVF9ET05FX0ZMQUcgfAorCQkgICAgICAgU1BJX09QX01BWF9PVVRQVVRfRE9ORV9GTEFHLAorCQkgICAgICAgZGQtPmJhc2UgKyBTUElfT1BFUkFUSU9OQUwpOworCS8qIEVuc3VyZSBkb25lIGZsYWcgd2FzIGNsZWFyZWQgYmVmb3JlIHByb2NlZWRpbmcgZnVydGhlciAqLworCW1iKCk7Cit9CisKKy8qIEZpZ3VyZSB3aGljaCBpcnEgb2NjdXJyZWQgYW5kIGNhbGwgdGhlIHJlbGV2YW50IGZ1bmN0aW9ucyAqLworc3RhdGljIGlubGluZSBpcnFyZXR1cm5fdCBtc21fc3BpX3F1cF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBvcCwgcmV0ID0gSVJRX05PTkU7CisJc3RydWN0IG1zbV9zcGkgKmRkID0gZGV2X2lkOworCisJaWYgKHBtX3J1bnRpbWVfc3VzcGVuZGVkKGRkLT5kZXYpKSB7CisJCWRldl93YXJuKGRkLT5kZXYsICJRVVA6IHBtIHJ1bnRpbWUgc3VzcGVuZCwgaXJxOiVkXG4iLCBpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFNQSV9FUlJPUl9GTEFHUykgfHwKKwkgICAgcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFFVUF9FUlJPUl9GTEFHUykpIHsKKwkJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZC0+ZGV2KTsKKworCQlyZXQgfD0gbXNtX3NwaV9lcnJvcl9pcnEoaXJxLCBtYXN0ZXIpOworCX0KKworCW9wID0gcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFNQSV9PUEVSQVRJT05BTCk7CisJd3JpdGVsX3JlbGF4ZWQob3AsIGRkLT5iYXNlICsgU1BJX09QRVJBVElPTkFMKTsKKwkvKgorCSAqIEVuc3VyZSBzZXJ2aWNlIGZsYWcgd2FzIGNsZWFyZWQgYmVmb3JlIGZ1cnRoZXIKKwkgKiBwcm9jZXNzaW5nIG9mIGludGVycnVwdC4KKwkgKi8KKwltYigpOworCWlmIChvcCAmIFNQSV9PUF9JTlBVVF9TRVJWSUNFX0ZMQUcpCisJCXJldCB8PSBtc21fc3BpX2lucHV0X2lycShpcnEsIGRldl9pZCk7CisKKwlpZiAob3AgJiBTUElfT1BfT1VUUFVUX1NFUlZJQ0VfRkxBRykKKwkJcmV0IHw9IG1zbV9zcGlfb3V0cHV0X2lycShpcnEsIGRldl9pZCk7CisKKwlpZiAoZGQtPnR4X21vZGUgIT0gU1BJX0JBTV9NT0RFKSB7CisJCWlmICghZGQtPnJ4X2RvbmUpIHsKKwkJCWlmIChkZC0+cnhfYnl0ZXNfcmVtYWluaW5nID09IDApCisJCQkJZGQtPnJ4X2RvbmUgPSB0cnVlOworCQl9CisJCWlmICghZGQtPnR4X2RvbmUpIHsKKwkJCWlmICghZGQtPnR4X2J5dGVzX3JlbWFpbmluZyAmJgorCQkJCQkob3AgJiBTUElfT1BfSVBfRklGT19OT1RfRU1QVFkpKSB7CisJCQkJZGQtPnR4X2RvbmUgPSB0cnVlOworCQkJfQorCQl9CisJfQorCWlmIChkZC0+dHhfZG9uZSAmJiBkZC0+cnhfZG9uZSkgeworCQltc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JFU0VUKTsKKwkJZGQtPnR4X2RvbmUgPSBmYWxzZTsKKwkJZGQtPnJ4X2RvbmUgPSBmYWxzZTsKKwkJY29tcGxldGUoJmRkLT5yeF90cmFuc2Zlcl9jb21wbGV0ZSk7CisJCWNvbXBsZXRlKCZkZC0+dHhfdHJhbnNmZXJfY29tcGxldGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3NwaV9pbnB1dF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtc21fc3BpCSAgICAgICAqZGQgPSBkZXZfaWQ7CisKKwlkZC0+c3RhdF9yeCsrOworCisJaWYgKGRkLT5yeF9tb2RlID09IFNQSV9NT0RFX05PTkUpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWlmIChkZC0+cnhfbW9kZSA9PSBTUElfRklGT19NT0RFKSB7CisJCXdoaWxlICgocmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFNQSV9PUEVSQVRJT05BTCkgJgorCQkJU1BJX09QX0lQX0ZJRk9fTk9UX0VNUFRZKSAmJgorCQkJKGRkLT5yeF9ieXRlc19yZW1haW5pbmcgPiAwKSkgeworCQkJbXNtX3NwaV9yZWFkX3dvcmRfZnJvbV9maWZvKGRkKTsKKwkJfQorCX0gZWxzZSBpZiAoZGQtPnJ4X21vZGUgPT0gU1BJX0JMT0NLX01PREUpIHsKKwkJaW50IGNvdW50ID0gMDsKKworCQl3aGlsZSAoZGQtPnJ4X2J5dGVzX3JlbWFpbmluZyAmJgorCQkJCShjb3VudCA8IGRkLT5pbnB1dF9ibG9ja19zaXplKSkgeworCQkJbXNtX3NwaV9yZWFkX3dvcmRfZnJvbV9maWZvKGRkKTsKKwkJCWNvdW50ICs9IFNQSV9NQVhfQllURVNfUEVSX1dPUkQ7CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9zcGlfd3JpdGVfd29yZF90b19maWZvKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl1MzIgICAgd29yZDsKKwl1OCAgICAgYnl0ZTsKKwlpbnQgICAgaTsKKwlpbnQgICB3cml0ZV9ieXRlcyA9CisJCShkZC0+cGFja193b3JkcyA/IFNQSV9NQVhfQllURVNfUEVSX1dPUkQgOiBkZC0+Ynl0ZXNfcGVyX3dvcmQpOworCisJd29yZCA9IDA7CisJaWYgKGRkLT53cml0ZV9idWYpIHsKKwkJZm9yIChpID0gMDsgKGkgPCB3cml0ZV9ieXRlcykgJiYKKwkJCSAgICAgZGQtPnR4X2J5dGVzX3JlbWFpbmluZzsgaSsrKSB7CisJCQlkZC0+dHhfYnl0ZXNfcmVtYWluaW5nLS07CisJCQlieXRlID0gKmRkLT53cml0ZV9idWYrKzsKKwkJCXdvcmQgfD0gKGJ5dGUgPDwgKEJJVFNfUEVSX0JZVEUgKiBpKSk7CisJCX0KKwl9IGVsc2UKKwkJaWYgKGRkLT50eF9ieXRlc19yZW1haW5pbmcgPiB3cml0ZV9ieXRlcykKKwkJCWRkLT50eF9ieXRlc19yZW1haW5pbmcgLT0gd3JpdGVfYnl0ZXM7CisJCWVsc2UKKwkJCWRkLT50eF9ieXRlc19yZW1haW5pbmcgPSAwOworCWRkLT53cml0ZV94ZnJfY250Kys7CisKKwl3cml0ZWxfcmVsYXhlZCh3b3JkLCBkZC0+YmFzZSArIFNQSV9PVVRQVVRfRklGTyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX3dyaXRlX3Jtbl90b19maWZvKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgY291bnQgPSAwOworCisJaWYgKGRkLT50eF9tb2RlID09IFNQSV9GSUZPX01PREUpIHsKKwkJd2hpbGUgKChkZC0+dHhfYnl0ZXNfcmVtYWluaW5nID4gMCkgJiYKKwkJCShjb3VudCA8IGRkLT5pbnB1dF9maWZvX3NpemUpICYmCisJCSAgICAgICAhKHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfT1BFUkFUSU9OQUwpCisJCQkJCQkmIFNQSV9PUF9PVVRQVVRfRklGT19GVUxMKSkgeworCQkJbXNtX3NwaV93cml0ZV93b3JkX3RvX2ZpZm8oZGQpOworCQkJY291bnQrKzsKKwkJfQorCX0KKworCWlmIChkZC0+dHhfbW9kZSA9PSBTUElfQkxPQ0tfTU9ERSkgeworCQl3aGlsZSAoZGQtPnR4X2J5dGVzX3JlbWFpbmluZyAmJgorCQkJCShjb3VudCA8IGRkLT5vdXRwdXRfYmxvY2tfc2l6ZSkpIHsKKwkJCW1zbV9zcGlfd3JpdGVfd29yZF90b19maWZvKGRkKTsKKwkJCWNvdW50ICs9IFNQSV9NQVhfQllURVNfUEVSX1dPUkQ7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtc21fc3BpX291dHB1dF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtc21fc3BpCSAgICAgICAqZGQgPSBkZXZfaWQ7CisKKwlkZC0+c3RhdF90eCsrOworCisJaWYgKGRkLT50eF9tb2RlID09IFNQSV9NT0RFX05PTkUpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIE91dHB1dCBGSUZPIGlzIGVtcHR5LiBUcmFuc21pdCBhbnkgb3V0c3RhbmRpbmcgd3JpdGUgZGF0YS4gKi8KKwlpZiAoKGRkLT50eF9tb2RlID09IFNQSV9GSUZPX01PREUpIHx8IChkZC0+dHhfbW9kZSA9PSBTUElfQkxPQ0tfTU9ERSkpCisJCW1zbV9zcGlfd3JpdGVfcm1uX3RvX2ZpZm8oZGQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3NwaV9lcnJvcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBkZXZfaWQ7CisJc3RydWN0IG1zbV9zcGkgICAgICAgICAgKmRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUzMiAgICAgICAgICAgICAgICAgICAgICBzcGlfZXJyOworCisJc3BpX2VyciA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfRVJST1JfRkxBR1MpOworCWlmIChzcGlfZXJyICYgU1BJX0VSUl9PVVRQVVRfT1ZFUl9SVU5fRVJSKQorCQlkZXZfd2FybihtYXN0ZXItPmRldi5wYXJlbnQsICJTUEkgb3V0cHV0IG92ZXJydW4gZXJyb3JcbiIpOworCWlmIChzcGlfZXJyICYgU1BJX0VSUl9JTlBVVF9VTkRFUl9SVU5fRVJSKQorCQlkZXZfd2FybihtYXN0ZXItPmRldi5wYXJlbnQsICJTUEkgaW5wdXQgdW5kZXJydW4gZXJyb3JcbiIpOworCWlmIChzcGlfZXJyICYgU1BJX0VSUl9PVVRQVVRfVU5ERVJfUlVOX0VSUikKKwkJZGV2X3dhcm4obWFzdGVyLT5kZXYucGFyZW50LCAiU1BJIG91dHB1dCB1bmRlcnJ1biBlcnJvclxuIik7CisJbXNtX3NwaV9nZXRfY2xrX2VycihkZCwgJnNwaV9lcnIpOworCWlmIChzcGlfZXJyICYgU1BJX0VSUl9DTEtfT1ZFUl9SVU5fRVJSKQorCQlkZXZfd2FybihtYXN0ZXItPmRldi5wYXJlbnQsICJTUEkgY2xvY2sgb3ZlcnJ1biBlcnJvclxuIik7CisJaWYgKHNwaV9lcnIgJiBTUElfRVJSX0NMS19VTkRFUl9SVU5fRVJSKQorCQlkZXZfd2FybihtYXN0ZXItPmRldi5wYXJlbnQsICJTUEkgY2xvY2sgdW5kZXJydW4gZXJyb3JcbiIpOworCW1zbV9zcGlfY2xlYXJfZXJyb3JfZmxhZ3MoZGQpOworCW1zbV9zcGlfYWNrX2Nsa19lcnIoZGQpOworCS8qIEVuc3VyZSBjbGVhcmluZyBvZiBRVVBfRVJST1JfRkxBR1Mgd2FzIGNvbXBsZXRlZCAqLworCW1iKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfYmFtX21hcF9idWZmZXJzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZyOworCXZvaWQgKnR4X2J1ZiwgKnJ4X2J1ZjsKKwl1MzIgdHhfbGVuLCByeF9sZW47CisKKwlkZXYgPSBkZC0+ZGV2OworCXhmciA9IGRkLT5jdXJfdHJhbnNmZXI7CisKKwl0eF9idWYgPSAodm9pZCAqKXhmci0+dHhfYnVmOworCXJ4X2J1ZiA9IHhmci0+cnhfYnVmOworCXR4X2xlbiA9IHJ4X2xlbiA9IHhmci0+bGVuOworCWlmICh0eF9idWYgIT0gTlVMTCkgeworCQl4ZnItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgdHhfYnVmLAorCQkJCQkJdHhfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgeGZyLT50eF9kbWEpKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWlmIChyeF9idWYgIT0gTlVMTCkgeworCQl4ZnItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgcnhfYnVmLCByeF9sZW4sCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB4ZnItPnJ4X2RtYSkpIHsKKwkJCWlmICh0eF9idWYgIT0gTlVMTCkKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKKwkJCQkJCXhmci0+dHhfZG1hLAorCQkJCQkJdHhfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7CitlcnJvcjoKKwltc21fc3BpX2RtYV91bm1hcF9idWZmZXJzKGRkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfZG1hX21hcF9idWZmZXJzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZC0+dHhfbW9kZSA9PSBTUElfQkFNX01PREUpCisJCXJldCA9IG1zbV9zcGlfYmFtX21hcF9idWZmZXJzKGRkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtc21fc3BpX2JhbV91bm1hcF9idWZmZXJzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZyOworCXZvaWQgKnR4X2J1ZiwgKnJ4X2J1ZjsKKwl1MzIgIHR4X2xlbiwgcnhfbGVuOworCisJZGV2ID0gZGQtPmRldjsKKwl4ZnIgPSBkZC0+Y3VyX3RyYW5zZmVyOworCisJdHhfYnVmID0gKHZvaWQgKil4ZnItPnR4X2J1ZjsKKwlyeF9idWYgPSB4ZnItPnJ4X2J1ZjsKKwl0eF9sZW4gPSByeF9sZW4gPSB4ZnItPmxlbjsKKwlpZiAodHhfYnVmICE9IE5VTEwpCisJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCB4ZnItPnR4X2RtYSwKKwkJCQl0eF9sZW4sIERNQV9UT19ERVZJQ0UpOworCisJaWYgKHJ4X2J1ZiAhPSBOVUxMKQorCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgeGZyLT5yeF9kbWEsCisJCQkJcnhfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9kbWFfdW5tYXBfYnVmZmVycyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJaWYgKGRkLT50eF9tb2RlID09IFNQSV9CQU1fTU9ERSkKKwkJbXNtX3NwaV9iYW1fdW5tYXBfYnVmZmVycyhkZCk7Cit9CisKKy8qKgorICogbXNtX3NwaV91c2VfZG1hIC0gZGVjaWRlcyB3aGV0aGVyIHRvIHVzZSBEYXRhLU1vdmVyIG9yIEJBTSBmb3IKKyAqIHRoZSBnaXZlbiB0cmFuc2ZlcgorICogQGRkOiAgICAgICBkZXZpY2UKKyAqIEB0cjogICAgICAgdHJhbnNmZXIKKyAqCisgKiBTdGFydCB1c2luZyBETUEgaWY6CisgKiAxLiBJcyBzdXBwb3J0ZWQgYnkgSFcKKyAqIDIuIElzIG5vdCBkaWFibGVkIGJ5IHBsYXRmb3JtIGRhdGEKKyAqIDMuIFRyYW5zZmVyIHNpemUgaXMgZ3JlYXRlciB0aGFuIDMqYmxvY2sgc2l6ZS4KKyAqIDQuIEJ1ZmZlcnMgYXJlIGFsaWduZWQgdG8gY2FjaGUgbGluZS4KKyAqIDUuIEJ5dGVzLXBlci13b3JkIGlzIDgsMTYgb3IgMzIuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorbXNtX3NwaV91c2VfZG1hKHN0cnVjdCBtc21fc3BpICpkZCwgc3RydWN0IHNwaV90cmFuc2ZlciAqdHIsIHU4IGJwdykKK3sKKwlpZiAoIWRkLT51c2VfZG1hKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBjaGVjayBjb25zdHJhaW50cyBmcm9tIHBsYXRmb3JtIGRhdGEgKi8KKwlpZiAoKGRkLT5xdXBfdmVyID09IFNQSV9RVVBfVkVSU0lPTl9CRkFNKSAmJiAhZGQtPnBkYXRhLT51c2VfYmFtKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoZGQtPmN1cl9tc2dfbGVuIDwgMypkZC0+aW5wdXRfYmxvY2tfc2l6ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKChkZC0+cXVwX3ZlciAhPSBTUElfUVVQX1ZFUlNJT05fQkZBTSkgJiYKKwkJICFkZC0+cmVhZF9sZW4gJiYgIWRkLT53cml0ZV9sZW4pCisJCXJldHVybiBmYWxzZTsKKworCWlmIChkZC0+cXVwX3ZlciA9PSBTUElfUVVQX1ZFUlNJT05fTk9ORSkgeworCQl1MzIgY2FjaGVfbGluZSA9IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCk7CisKKwkJaWYgKHRyLT50eF9idWYpIHsKKwkJCWlmICghSVNfQUxJR05FRCgoc2l6ZV90KXRyLT50eF9idWYsIGNhY2hlX2xpbmUpKQorCQkJCXJldHVybiAwOworCQl9CisJCWlmICh0ci0+cnhfYnVmKSB7CisJCQlpZiAoIUlTX0FMSUdORUQoKHNpemVfdCl0ci0+cnhfYnVmLCBjYWNoZV9saW5lKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAodHItPmNzX2NoYW5nZSAmJgorCQkgICAoKGJwdyAhPSA4KSAmJiAoYnB3ICE9IDE2KSAmJiAoYnB3ICE9IDMyKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogbXNtX3NwaV9zZXRfdHJhbnNmZXJfbW9kZTogQ2hvb3NlcyBvcHRpbWFsIHRyYW5zZmVyIG1vZGUuIFNldHMgZGQtPm1vZGUgYW5kCisgKiBwcmVwYXJlcyB0byBwcm9jZXNzIGEgdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB2b2lkCittc21fc3BpX3NldF90cmFuc2Zlcl9tb2RlKHN0cnVjdCBtc21fc3BpICpkZCwgdTggYnB3LCB1MzIgcmVhZF9jb3VudCkKK3sKKwlpZiAobXNtX3NwaV91c2VfZG1hKGRkLCBkZC0+Y3VyX3RyYW5zZmVyLCBicHcpKSB7CisJCWRkLT50eF9tb2RlID0gU1BJX0JBTV9NT0RFOworCQlkZC0+cnhfbW9kZSA9IFNQSV9CQU1fTU9ERTsKKwl9IGVsc2UgeworCQlkZC0+cnhfbW9kZSA9IFNQSV9GSUZPX01PREU7CisJCWRkLT50eF9tb2RlID0gU1BJX0ZJRk9fTU9ERTsKKwkJZGQtPnJlYWRfbGVuID0gZGQtPmN1cl90cmFuc2Zlci0+bGVuOworCQlkZC0+d3JpdGVfbGVuID0gZGQtPmN1cl90cmFuc2Zlci0+bGVuOworCX0KK30KKworLyoqCisgKiBtc21fc3BpX3NldF9xdXBfaW9fbW9kZXM6IHByZXBhcmVzIHJlZ2lzdGVyIFFVUF9JT19NT0RFUyB0byBwcm9jZXNzIGEKKyAqIHRyYW5zZmVyCisgKi8KK3N0YXRpYyB2b2lkIG1zbV9zcGlfc2V0X3F1cF9pb19tb2RlcyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJdTMyIHNwaV9pb207CisKKwlzcGlfaW9tID0gcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFNQSV9JT19NT0RFUyk7CisJLyogU2V0IGlucHV0IGFuZCBvdXRwdXQgdHJhbnNmZXIgbW9kZTogRklGTywgRE1PViwgb3IgQkFNICovCisJc3BpX2lvbSAmPSB+KFNQSV9JT19NX0lOUFVUX01PREUgfCBTUElfSU9fTV9PVVRQVVRfTU9ERSk7CisJc3BpX2lvbSA9IChzcGlfaW9tIHwgKGRkLT50eF9tb2RlIDw8IE9VVFBVVF9NT0RFX1NISUZUKSk7CisJc3BpX2lvbSA9IChzcGlfaW9tIHwgKGRkLT5yeF9tb2RlIDw8IElOUFVUX01PREVfU0hJRlQpKTsKKworCS8qIEFsd2F5cyBlbmFibGUgcGFja2luZyBmb3IgdGhlIEJBTSBtb2RlIGFuZCBmb3Igbm9uIEJBTSBtb2RlIG9ubHkKKwkgKiBpZiBicHcgaXMgJSA4IGFuZCB0cmFuc2ZlciBsZW5ndGggaXMgJSA0IEJ5dGVzLgorCSAqLworCWlmIChkZC0+dHhfbW9kZSA9PSBTUElfQkFNX01PREUgfHwKKwkJKChkZC0+Y3VyX21zZ19sZW4gJSBTUElfTUFYX0JZVEVTX1BFUl9XT1JEID09IDApICYmCisJCShkZC0+Y3VyX3RyYW5zZmVyLT5iaXRzX3Blcl93b3JkKSAmJgorCQkoZGQtPmN1cl90cmFuc2Zlci0+Yml0c19wZXJfd29yZCA8PSAzMikgJiYKKwkJKGRkLT5jdXJfdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgJSA4ID09IDApKSkgeworCQlzcGlfaW9tIHw9IFNQSV9JT19NX1BBQ0tfRU4gfCBTUElfSU9fTV9VTlBBQ0tfRU47CisJCWRkLT5wYWNrX3dvcmRzID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzcGlfaW9tICY9IH4oU1BJX0lPX01fUEFDS19FTiB8IFNQSV9JT19NX1VOUEFDS19FTik7CisJCXNwaV9pb20gfD0gU1BJX0lPX01fT1VUUFVUX0JJVF9TSElGVF9FTjsKKwkJZGQtPnBhY2tfd29yZHMgPSBmYWxzZTsKKwl9CisKKwl3cml0ZWxfcmVsYXhlZChzcGlfaW9tLCBkZC0+YmFzZSArIFNQSV9JT19NT0RFUyk7Cit9CisKK3N0YXRpYyB1MzIgbXNtX3NwaV9jYWxjX3NwaV9pb2NfY2xrX3BvbGFyaXR5KHUzMiBzcGlfaW9jLCB1OCBtb2RlKQoreworCWlmIChtb2RlICYgU1BJX0NQT0wpCisJCXNwaV9pb2MgfD0gU1BJX0lPX0NfQ0xLX0lETEVfSElHSDsKKwllbHNlCisJCXNwaV9pb2MgJj0gflNQSV9JT19DX0NMS19JRExFX0hJR0g7CisJcmV0dXJuIHNwaV9pb2M7Cit9CisKKy8qKgorICogbXNtX3NwaV9zZXRfc3BpX2lvX2NvbnRyb2w6IHByZXBhcmVzIHJlZ2lzdGVyIFNQSV9JT19DT05UUk9MIHRvIHByb2Nlc3MgdGhlCisgKiBuZXh0IHRyYW5zZmVyCisgKiBAcmV0dXJuIHRoZSBuZXcgc2V0IHZhbHVlIG9mIFNQSV9JT19DT05UUk9MCisgKi8KK3N0YXRpYyB1MzIgbXNtX3NwaV9zZXRfc3BpX2lvX2NvbnRyb2woc3RydWN0IG1zbV9zcGkgKmRkKQoreworCXUzMiBzcGlfaW9jLCBzcGlfaW9jX29yaWcsIGNoaXBfc2VsZWN0OworCisJc3BpX2lvYyA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJc3BpX2lvY19vcmlnID0gc3BpX2lvYzsKKwlzcGlfaW9jID0gbXNtX3NwaV9jYWxjX3NwaV9pb2NfY2xrX3BvbGFyaXR5KHNwaV9pb2MKKwkJCQkJCSwgZGQtPnNwaS0+bW9kZSk7CisJLyogU2V0IGNoaXAtc2VsZWN0ICovCisJY2hpcF9zZWxlY3QgPSBkZC0+c3BpLT5jaGlwX3NlbGVjdCA8PCAyOworCWlmICgoc3BpX2lvYyAmIFNQSV9JT19DX0NTX1NFTEVDVCkgIT0gY2hpcF9zZWxlY3QpCisJCXNwaV9pb2MgPSAoc3BpX2lvYyAmIH5TUElfSU9fQ19DU19TRUxFQ1QpIHwgY2hpcF9zZWxlY3Q7CisJaWYgKCFkZC0+Y3VyX3RyYW5zZmVyLT5jc19jaGFuZ2UpCisJCXNwaV9pb2MgfD0gU1BJX0lPX0NfTVhfQ1NfTU9ERTsKKworCWlmIChzcGlfaW9jICE9IHNwaV9pb2Nfb3JpZykKKwkJd3JpdGVsX3JlbGF4ZWQoc3BpX2lvYywgZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBJTyBjb250cm9sIG1vZGUgcmVnaXN0ZXIgZ2V0cyB3cml0dGVuCisJICogYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgdHJhbnNmZXIuCisJICovCisJbWIoKTsKKwlyZXR1cm4gc3BpX2lvYzsKK30KKworLyoqCisgKiBtc21fc3BpX3NldF9xdXBfb3BfbWFzazogcHJlcGFyZXMgcmVnaXN0ZXIgUVVQX09QRVJBVElPTkFMX01BU0sgdG8gcHJvY2VzcworICogdGhlIG5leHQgdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQgbXNtX3NwaV9zZXRfcXVwX29wX21hc2soc3RydWN0IG1zbV9zcGkgKmRkKQoreworCS8qIG1hc2sgSU5QVVQgYW5kIE9VVFBVVCBzZXJ2aWNlIGZsYWdzIGluIHRvIHByZXZlbnQgSVJRcyBvbiBGSUZPIHN0YXR1cworCSAqIGNoYW5nZSBpbiBCQU0gbW9kZQorCSAqLworCXUzMiBtYXNrID0gKGRkLT50eF9tb2RlID09IFNQSV9CQU1fTU9ERSkgPworCQlRVVBfT1BfTUFTS19PVVRQVVRfU0VSVklDRV9GTEFHIHwgUVVQX09QX01BU0tfSU5QVVRfU0VSVklDRV9GTEFHCisJCTogMDsKKwl3cml0ZWxfcmVsYXhlZChtYXNrLCBkZC0+YmFzZSArIFFVUF9PUEVSQVRJT05BTF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3RyYW5zZmVyX2xlbmd0aChzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9IGRkLT5jdXJfdHJhbnNmZXI7CisKKwlkZC0+Y3VyX21zZ19sZW4gPSAwOworCWRkLT5yZWFkX2xlbiA9IGRkLT53cml0ZV9sZW4gPSAwOworCWRkLT5iYW0uYmFtX3R4X2xlbiA9IGRkLT5iYW0uYmFtX3J4X2xlbiA9IDA7CisKKwlpZiAoeGZlci0+dHhfYnVmKQorCQlkZC0+YmFtLmJhbV90eF9sZW4gPSBkZC0+d3JpdGVfbGVuID0geGZlci0+bGVuOworCWlmICh4ZmVyLT5yeF9idWYpCisJCWRkLT5iYW0uYmFtX3J4X2xlbiA9IGRkLT5yZWFkX2xlbiA9IHhmZXItPmxlbjsKKwlkZC0+Y3VyX21zZ19sZW4gPSB4ZmVyLT5sZW47Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9wcm9jZXNzX3RyYW5zZmVyKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl1OCAgYnB3OworCXUzMiBtYXhfc3BlZWQ7CisJdTMyIHJlYWRfY291bnQ7CisJdTMyIHRpbWVvdXQ7CisJdTMyIHNwaV9pb2M7CisJdTMyIGludF9sb29wYmFjayA9IDA7CisJaW50IHJldDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWdldF90cmFuc2Zlcl9sZW5ndGgoZGQpOworCWRkLT5jdXJfdHhfdHJhbnNmZXIgPSBkZC0+Y3VyX3RyYW5zZmVyOworCWRkLT5jdXJfcnhfdHJhbnNmZXIgPSBkZC0+Y3VyX3RyYW5zZmVyOworCWRkLT5iYW0uY3Vycl9yeF9ieXRlc19yZWN2ZCA9IGRkLT5iYW0uY3Vycl90eF9ieXRlc19zZW50ID0gMDsKKwlkZC0+d3JpdGVfeGZyX2NudCA9IGRkLT5yZWFkX3hmcl9jbnQgPSAwOworCWRkLT50eF9ieXRlc19yZW1haW5pbmcgPSBkZC0+Y3VyX21zZ19sZW47CisJZGQtPnJ4X2J5dGVzX3JlbWFpbmluZyA9IGRkLT5jdXJfbXNnX2xlbjsKKwlkZC0+cmVhZF9idWYgICAgICAgICAgID0gZGQtPmN1cl90cmFuc2Zlci0+cnhfYnVmOworCWRkLT53cml0ZV9idWYgICAgICAgICAgPSBkZC0+Y3VyX3RyYW5zZmVyLT50eF9idWY7CisJZGQtPnR4X2RvbmUgPSBmYWxzZTsKKwlkZC0+cnhfZG9uZSA9IGZhbHNlOworCWluaXRfY29tcGxldGlvbigmZGQtPnR4X3RyYW5zZmVyX2NvbXBsZXRlKTsKKwlpbml0X2NvbXBsZXRpb24oJmRkLT5yeF90cmFuc2Zlcl9jb21wbGV0ZSk7CisJaWYgKGRkLT5jdXJfdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQpCisJCWJwdyA9IGRkLT5jdXJfdHJhbnNmZXItPmJpdHNfcGVyX3dvcmQ7CisJZWxzZQorCQlicHcgPSA4OworCWRkLT5ieXRlc19wZXJfd29yZCA9IChicHcgKyA3KSAvIDg7CisKKwlpZiAoZGQtPmN1cl90cmFuc2Zlci0+c3BlZWRfaHopCisJCW1heF9zcGVlZCA9IGRkLT5jdXJfdHJhbnNmZXItPnNwZWVkX2h6OworCWVsc2UKKwkJbWF4X3NwZWVkID0gZGQtPnNwaS0+bWF4X3NwZWVkX2h6OworCWlmICghZGQtPmNsb2NrX3NwZWVkIHx8IG1heF9zcGVlZCAhPSBkZC0+Y2xvY2tfc3BlZWQpCisJCW1zbV9zcGlfY2xvY2tfc2V0KGRkLCBtYXhfc3BlZWQpOworCisJdGltZW91dCA9IDEwMCAqIG1zZWNzX3RvX2ppZmZpZXMoCisJCQlESVZfUk9VTkRfVVAoZGQtPmN1cl9tc2dfbGVuICogOCwKKwkJCURJVl9ST1VORF9VUChtYXhfc3BlZWQsIE1TRUNfUEVSX1NFQykpKTsKKworCXJlYWRfY291bnQgPSBESVZfUk9VTkRfVVAoZGQtPmN1cl9tc2dfbGVuLCBkZC0+Ynl0ZXNfcGVyX3dvcmQpOworCWlmIChkZC0+c3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCWludF9sb29wYmFjayA9IDE7CisKKwlyZXQgPSBtc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkiJXM6IEVycm9yIHNldHRpbmcgUVVQIHRvIHJlc2V0LXN0YXRlIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc21fc3BpX3NldF90cmFuc2Zlcl9tb2RlKGRkLCBicHcsIHJlYWRfY291bnQpOworCW1zbV9zcGlfc2V0X214X2NvdW50cyhkZCwgcmVhZF9jb3VudCk7CisJaWYgKGRkLT50eF9tb2RlID09IFNQSV9CQU1fTU9ERSkgeworCQlyZXQgPSBtc21fc3BpX2RtYV9tYXBfYnVmZmVycyhkZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIk1hcHBpbmcgRE1BIGJ1ZmZlcnNcbiIpOworCQkJZGQtPnR4X21vZGUgPSBTUElfTU9ERV9OT05FOworCQkJZGQtPnJ4X21vZGUgPSBTUElfTU9ERV9OT05FOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwltc21fc3BpX3NldF9xdXBfaW9fbW9kZXMoZGQpOworCW1zbV9zcGlfc2V0X3NwaV9jb25maWcoZGQsIGJwdyk7CisJbXNtX3NwaV9zZXRfcXVwX2NvbmZpZyhkZCwgYnB3KTsKKwlzcGlfaW9jID0gbXNtX3NwaV9zZXRfc3BpX2lvX2NvbnRyb2woZGQpOworCW1zbV9zcGlfc2V0X3F1cF9vcF9tYXNrKGRkKTsKKworCS8qIFRoZSBvdXRwdXQgZmlmbyBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGhhbmRsZSBhbGwgd3JpdGVzIGFmdGVyCisJICogdGhlIGZpcnN0LiBSZXN0cmljdGluZyB0aGlzIHRvIG9uZSB3cml0ZSBhdm9pZHMgY29udGVudGlvbgorCSAqIGlzc3VlcyBhbmQgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gdGhpcyB0aHJlYWQgYW5kIHRoZSBpbnQgaGFuZGxlcgorCSAqLworCWlmIChkZC0+dHhfbW9kZSAhPSBTUElfQkFNX01PREUpIHsKKwkJaWYgKG1zbV9zcGlfcHJlcGFyZV9mb3Jfd3JpdGUoZGQpKQorCQkJZ290byB0cmFuc2Zlcl9lbmQ7CisJCW1zbV9zcGlfc3RhcnRfd3JpdGUoZGQsIHJlYWRfY291bnQpOworCX0gZWxzZSB7CisJCWlmICgobXNtX3NwaV9iYW1fYmVnaW5fdHJhbnNmZXIoZGQpKSA8IDApIHsKKwkJCWRldl9lcnIoZGQtPmRldiwgIiVzOiBCQU0gdHJhbnNmZXIgc2V0dXAgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIHRyYW5zZmVyX2VuZDsKKwkJfQorCX0KKworCS8qCisJICogT24gQkFNIG1vZGUsIGN1cnJlbnQgc3RhdGUgaGVyZSBpcyBydW4uCisJICogT25seSBlbnRlciB0aGUgUlVOIHN0YXRlIGFmdGVyIHRoZSBmaXJzdCB3b3JkIGlzIHdyaXR0ZW4gaW50bworCSAqIHRoZSBvdXRwdXQgRklGTy4gT3RoZXJ3aXNlLCB0aGUgb3V0cHV0IEZJRk8gRU1QVFkgaW50ZXJydXB0CisJICogbWlnaHQgZmlyZSBiZWZvcmUgdGhlIGZpcnN0IHdvcmQgaXMgd3JpdHRlbiByZXN1bHRpbmcgaW4gYQorCSAqIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uLgorCSAqLworCWlmIChkZC0+dHhfbW9kZSAhPSBTUElfQkFNX01PREUpCisJCWlmIChtc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JVTikpIHsKKwkJCWRldl93YXJuKGRkLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gc2V0IFFVUCB0byBydW4tc3RhdGUuIE1vZGU6JWQiLAorCQkJCV9fZnVuY19fLCBkZC0+dHhfbW9kZSk7CisJCQlnb3RvIHRyYW5zZmVyX2VuZDsKKwkJfQorCisJLyogQXNzdW1lIHN1Y2Nlc3MsIHRoaXMgbWlnaHQgY2hhbmdlIGxhdGVyIHVwb24gdHJhbnNhY3Rpb24gcmVzdWx0ICovCisJZG8geworCQlpZiAoZGQtPndyaXRlX2J1ZiAmJgorCQkgICAgIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGQtPnR4X3RyYW5zZmVyX2NvbXBsZXRlLAorCQkgICAgdGltZW91dCkpIHsKKwkJCWRldl9lcnIoZGQtPmRldiwgIiVzOiBTUEkgVHggdHJhbnNhY3Rpb24gdGltZW91dFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZGQtPnJlYWRfYnVmICYmCisJCSAgICAhd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZC0+cnhfdHJhbnNmZXJfY29tcGxldGUsCisJCSAgICB0aW1lb3V0KSkgeworCQkJZGV2X2VycihkZC0+ZGV2LCAiJXM6IFNQSSBSeCB0cmFuc2FjdGlvbiB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKG1zbV9zcGlfZG1hX3NlbmRfbmV4dChkZCkpOworCisJbXNtX3NwaV91ZGVsYXkoZGQtPnhmcnNfZGVsYXlfdXNlYyk7CisKK3RyYW5zZmVyX2VuZDoKKwlpZiAoKGRkLT50eF9tb2RlID09IFNQSV9CQU1fTU9ERSkgJiYgc3RhdHVzKQorCQltc21fc3BpX2JhbV9mbHVzaChkZCk7CisJbXNtX3NwaV9kbWFfdW5tYXBfYnVmZmVycyhkZCk7CisJZGQtPnR4X21vZGUgPSBTUElfTU9ERV9OT05FOworCWRkLT5yeF9tb2RlID0gU1BJX01PREVfTk9ORTsKKworCW1zbV9zcGlfc2V0X3N0YXRlKGRkLCBTUElfT1BfU1RBVEVfUkVTRVQpOworCWlmICghZGQtPmN1cl90cmFuc2Zlci0+Y3NfY2hhbmdlKQorCQl3cml0ZWxfcmVsYXhlZChzcGlfaW9jICYgflNQSV9JT19DX01YX0NTX01PREUsCisJCSAgICAgICBkZC0+YmFzZSArIFNQSV9JT19DT05UUk9MKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIHNldF9mbGFnKQoreworCXN0cnVjdCBtc21fc3BpICpkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXUzMiBzcGlfaW9jOworCXUzMiBzcGlfaW9jX29yaWc7CisJaW50IHJjID0gMDsKKworCXJjID0gcG1fcnVudGltZV9nZXRfc3luYyhkZC0+ZGV2KTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoZGQtPmRldiwgIkZhaWx1cmUgZHVyaW5nIHJ1bnRpbWUgZ2V0LHJjPSVkIiwgcmMpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRkLT5wZGF0YS0+aXNfc2hhcmVkKSB7CisJCXJjID0gZ2V0X2xvY2FsX3Jlc291cmNlcyhkZCk7CisJCWlmIChyYykKKwkJCXJldHVybjsKKwl9CisKKwltc21fc3BpX2Nsa19wYXRoX3ZvdGUoZGQsIHNwaS0+bWF4X3NwZWVkX2h6KTsKKworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkKKwkJc2V0X2ZsYWcgPSAhc2V0X2ZsYWc7CisKKwkvKiBTZXJ2ZSBvbmx5IHVuZGVyIG11dGV4IGxvY2sgYXMgUlQgc3VzcGVuZCBtYXkgY2F1c2UgYSByYWNlICovCisJbXV0ZXhfbG9jaygmZGQtPmNvcmVfbG9jayk7CisJaWYgKGRkLT5zdXNwZW5kZWQpIHsKKwkJZGV2X2VycihkZC0+ZGV2LCAiJXM6IFNQSSBvcGVyYXRpb25hbCBzdGF0ZT0lZCBJbnZhbGlkXG4iLAorCQkJX19mdW5jX18sIGRkLT5zdXNwZW5kZWQpOworCQltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCQlyZXR1cm47CisJfQorCisJc3BpX2lvYyA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJc3BpX2lvY19vcmlnID0gc3BpX2lvYzsKKwlpZiAoc2V0X2ZsYWcpCisJCXNwaV9pb2MgfD0gU1BJX0lPX0NfRk9SQ0VfQ1M7CisJZWxzZQorCQlzcGlfaW9jICY9IH5TUElfSU9fQ19GT1JDRV9DUzsKKworCWlmIChzcGlfaW9jICE9IHNwaV9pb2Nfb3JpZykKKwkJd3JpdGVsX3JlbGF4ZWQoc3BpX2lvYywgZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJaWYgKGRkLT5wZGF0YS0+aXNfc2hhcmVkKQorCQlwdXRfbG9jYWxfcmVzb3VyY2VzKGRkKTsKKwltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZC0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY29yZShzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJdTMyIHNwaV9pb2M7CisKKwltc21fc3BpX3JlZ2lzdGVyX2luaXQoZGQpOworCS8qCisJICogVGhlIFNQSSBjb3JlIGdlbmVyYXRlcyBhIGJvZ3VzIGlucHV0IG92ZXJydW4gZXJyb3Igb24gc29tZSB0YXJnZXRzLAorCSAqIHdoZW4gYSB0cmFuc2l0aW9uIGZyb20gcnVuIHRvIHJlc2V0IHN0YXRlIG9jY3VycyBhbmQgaWYgdGhlIEZJRk8gaGFzCisJICogYW4gb2RkIG51bWJlciBvZiBlbnRyaWVzLiBIZW5jZSB3ZSBkaXNhYmxlIHRoZSBJTlBVVF9PVkVSX1JVTl9FUlJfRU4KKwkgKiBiaXQuCisJICovCisJbXNtX3NwaV9lbmFibGVfZXJyb3JfZmxhZ3MoZGQpOworCisJc3BpX2lvYyA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJc3BpX2lvYyB8PSBTUElfSU9fQ19OT19UUklfU1RBVEU7CisJd3JpdGVsX3JlbGF4ZWQoc3BpX2lvYywgZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgSU8gY29udHJvbCBpcyB3cml0dGVuIHRvIGJlZm9yZSByZXR1cm5pbmcuCisJICovCisJbWIoKTsKKwltc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JFU0VUKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2xvY2FsX3Jlc291cmNlcyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZGQtPmNsaykgfHwgSVNfRVJSX09SX05VTEwoZGQtPnBjbGspKSB7CisJCWRldl9lcnIoZGQtPmRldiwKKwkJCSIlczogZXJyb3IgY2xrIHB1dFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJbXNtX3NwaV9kaXNhYmxlX2lycXMoZGQpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Y2xrKTsKKwlkZC0+Y2xvY2tfc3BlZWQgPSAwOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+cGNsayk7CisKKwkvKiBGcmVlICB0aGUgc3BpIGNsaywgbWlzbywgbW9zaSwgY3MgZ3BpbyAqLworCWlmIChkZC0+cGRhdGEgJiYgZGQtPnBkYXRhLT5ncGlvX3JlbGVhc2UpCisJCWRkLT5wZGF0YS0+Z3Bpb19yZWxlYXNlKCk7CisKKwltc21fc3BpX2ZyZWVfZ3Bpb3MoZGQpOworfQorCitzdGF0aWMgaW50IGdldF9sb2NhbF9yZXNvdXJjZXMoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGRkLT5jbGspIHx8IElTX0VSUl9PUl9OVUxMKGRkLT5wY2xrKSkgeworCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkiJXM6IGVycm9yIGNsayBwdXRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIENvbmZpZ3VyZSB0aGUgc3BpIGNsaywgbWlzbywgbW9zaSBhbmQgY3MgZ3BpbyAqLworCWlmIChkZC0+cGRhdGEtPmdwaW9fY29uZmlnKSB7CisJCXJldCA9IGRkLT5wZGF0YS0+Z3Bpb19jb25maWcoKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZC0+ZGV2LAorCQkJCQkiJXM6IGVycm9yIGNvbmZpZ3VyaW5nIEdQSU9zXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gbXNtX3NwaV9yZXF1ZXN0X2dwaW9zKGRkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRkLT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gY2xrMF9lcnI7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRkLT5wY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIGNsazFfZXJyOworCW1zbV9zcGlfZW5hYmxlX2lycXMoZGQpOworCisJcmV0dXJuIDA7CisKK2NsazFfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Y2xrKTsKK2NsazBfZXJyOgorCW1zbV9zcGlfZnJlZV9ncGlvcyhkZCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtc21fc3BpX3RyYW5zZmVyX29uZTogVG8gcHJvY2VzcyBvbmUgc3BpIHRyYW5zZmVyIGF0IGEgdGltZQorICogQG1hc3Rlcjogc3BpIG1hc3RlciBjb250cm9sbGVyIHJlZmVyZW5jZQorICogQG1zZzogb25lIG11bHRpLXNlZ21lbnQgU1BJIHRyYW5zYWN0aW9uCisgKiBAcmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciB2YWx1ZQorICoKKyAqLworc3RhdGljIGludCBtc21fc3BpX3RyYW5zZmVyX29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgbXNtX3NwaQkqZGQ7CisJdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7CisJdTMyCXN0YXR1c19lcnJvciA9IDA7CisKKwlkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCS8qIENoZWNrIG1lc3NhZ2UgcGFyYW1ldGVycyAqLworCWlmICh4ZmVyLT5zcGVlZF9oeiA+IGRkLT5wZGF0YS0+bWF4X2Nsb2NrX3NwZWVkIHx8CisJICAgICh4ZmVyLT5iaXRzX3Blcl93b3JkICYmCisJICAgICAoeGZlci0+Yml0c19wZXJfd29yZCA8IDQgfHwgeGZlci0+Yml0c19wZXJfd29yZCA+IDMyKSkgfHwKKwkgICAgKHhmZXItPnR4X2J1ZiA9PSBOVUxMICYmIHhmZXItPnJ4X2J1ZiA9PSBOVUxMKSkgeworCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkiSW52YWxpZCB0cmFuc2ZlcjogJWQgSHosICVkIGJwdyB0eD0lcEssIHJ4PSVwS1xuIiwKKwkJCXhmZXItPnNwZWVkX2h6LCB4ZmVyLT5iaXRzX3Blcl93b3JkLAorCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT5yeF9idWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGQtPnNwaSA9IHNwaTsKKwlkZC0+Y3VyX3RyYW5zZmVyID0geGZlcjsKKworCW11dGV4X2xvY2soJmRkLT5jb3JlX2xvY2spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRkLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJZGQtPnRyYW5zZmVyX3BlbmRpbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRkLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBnZXQgbG9jYWwgcmVzb3VyY2VzIGZvciBlYWNoIHRyYW5zZmVyIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIGdvb2QKKwkgKiBzdGF0ZSBhbmQgbm90IGludGVyZmVyaW5nIHdpdGggb3RoZXIgRUUncyB1c2luZyB0aGlzIGRldmljZQorCSAqLworCWlmIChkZC0+cGRhdGEtPmlzX3NoYXJlZCkgeworCQlpZiAoZ2V0X2xvY2FsX3Jlc291cmNlcyhkZCkpIHsKKwkJCW11dGV4X3VubG9jaygmZGQtPmNvcmVfbG9jayk7CisJCQlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJlc2V0X2NvcmUoZGQpOworCQlpZiAoZGQtPnVzZV9kbWEpIHsKKwkJCW1zbV9zcGlfYmFtX3BpcGVfY29ubmVjdChkZCwgJmRkLT5iYW0ucHJvZCwKKwkJCQkJJmRkLT5iYW0ucHJvZC5jb25maWcpOworCQkJbXNtX3NwaV9iYW1fcGlwZV9jb25uZWN0KGRkLCAmZGQtPmJhbS5jb25zLAorCQkJCQkmZGQtPmJhbS5jb25zLmNvbmZpZyk7CisJCX0KKwl9CisKKwlpZiAoZGQtPnN1c3BlbmRlZCB8fCAhbXNtX3NwaV9pc192YWxpZF9zdGF0ZShkZCkpIHsKKwkJZGV2X2VycihkZC0+ZGV2LCAiJXM6IFNQSSBvcGVyYXRpb25hbCBzdGF0ZSBub3QgdmFsaWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXN0YXR1c19lcnJvciA9IDE7CisJfQorCisKKwlpZiAoIXN0YXR1c19lcnJvcikKKwkJc3RhdHVzX2Vycm9yID0KKwkJCW1zbV9zcGlfcHJvY2Vzc190cmFuc2ZlcihkZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlkZC0+dHJhbnNmZXJfcGVuZGluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogUHV0IGxvY2FsIHJlc291cmNlcyBwcmlvciB0byBjYWxsaW5nIGZpbmFsaXplIHRvIGVuc3VyZSB0aGUgaHcKKwkgKiBpcyBpbiBhIGtub3duIHN0YXRlIGJlZm9yZSBub3RpZnlpbmcgdGhlIGNhbGxpbmcgdGhyZWFkICh3aGljaCBpcyBhCisJICogZGlmZmVyZW50IGNvbnRleHQgc2luY2Ugd2UncmUgcnVubmluZyBpbiB0aGUgc3BpIGt0aHJlYWQgaGVyZSkgdG8KKwkgKiBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIHVzIGFuZCBhbnkgb3RoZXIgRUUncyB1c2luZyB0aGlzIGh3LgorCSAqLworCWlmIChkZC0+cGRhdGEtPmlzX3NoYXJlZCkgeworCQlpZiAoZGQtPnVzZV9kbWEpIHsKKwkJCW1zbV9zcGlfYmFtX3BpcGVfZGlzY29ubmVjdChkZCwgJmRkLT5iYW0ucHJvZCk7CisJCQltc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsICZkZC0+YmFtLmNvbnMpOworCQl9CisJCXB1dF9sb2NhbF9yZXNvdXJjZXMoZGQpOworCX0KKwltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCWlmIChkZC0+c3VzcGVuZGVkKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRkLT5jb250aW51ZV9zdXNwZW5kKTsKKwlyZXR1cm4gc3RhdHVzX2Vycm9yOworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfcHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBtc21fc3BpCSpkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmVzdW1lX3N0YXRlID0gMDsKKworCXJlc3VtZV9zdGF0ZSA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGQtPmRldik7CisJaWYgKHJlc3VtZV9zdGF0ZSA8IDApCisJCWdvdG8gc3BpX2ZpbmFsaXplOworCisJLyoKKwkgKiBDb3VudGVyLXBhcnQgb2Ygc3lzdGVtLXN1c3BlbmQgd2hlbiBydW50aW1lLXBtIGlzIG5vdCBlbmFibGVkLgorCSAqIFRoaXMgd2F5LCByZXN1bWUgY2FuIGJlIGxlZnQgZW1wdHkgYW5kIGRldmljZSB3aWxsIGJlIHB1dCBpbgorCSAqIGFjdGl2ZSBtb2RlIG9ubHkgaWYgY2xpZW50IHJlcXVlc3RzIGFueXRoaW5nIG9uIHRoZSBidXMKKwkgKi8KKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZC0+ZGV2KSkKKwkJcmVzdW1lX3N0YXRlID0gbXNtX3NwaV9wbV9yZXN1bWVfcnVudGltZShkZC0+ZGV2KTsKKwlpZiAocmVzdW1lX3N0YXRlIDwgMCkKKwkJZ290byBzcGlfZmluYWxpemU7CisJaWYgKGRkLT5zdXNwZW5kZWQpIHsKKwkJcmVzdW1lX3N0YXRlID0gLUVCVVNZOworCQlnb3RvIHNwaV9maW5hbGl6ZTsKKwl9CisJcmV0dXJuIDA7CisKK3NwaV9maW5hbGl6ZToKKwlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7CisJcmV0dXJuIHJlc3VtZV9zdGF0ZTsKK30KKworc3RhdGljIGludCBtc21fc3BpX3VucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBtc21fc3BpCSpkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGQtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGQtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtc21fc3BpCSpkZDsKKwlpbnQgICAgICAgICAgICAgIHJjID0gMDsKKwl1MzIgICAgICAgICAgICAgIHNwaV9pb2M7CisJdTMyICAgICAgICAgICAgICBzcGlfY29uZmlnOworCXUzMiAgICAgICAgICAgICAgbWFzazsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPCA0IHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IDMyKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGludmFsaWQgYml0c19wZXJfd29yZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBzcGktPmJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHNwaS0+Y2hpcF9zZWxlY3QgPiBTUElfTlVNX0NISVBTRUxFQ1RTLTEpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgY2hpcCBzZWxlY3QgJWQgZXhjZWVkcyBtYXggdmFsdWUgJWRcbiIsCisJCQlfX2Z1bmNfXywgc3BpLT5jaGlwX3NlbGVjdCwgU1BJX05VTV9DSElQU0VMRUNUUyAtIDEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJcmMgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRkLT5kZXYpOworCWlmIChyYyA8IDAgJiYgIWRkLT5pc19pbml0X2NvbXBsZXRlICYmCisJCQlwbV9ydW50aW1lX2VuYWJsZWQoZGQtPmRldikpIHsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRkLT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGRkLT5kZXYpOworCQlyYyA9IDA7CisJCWdvdG8gZXJyX3NldHVwX2V4aXQ7CisJfSBlbHNlCisJCXJjID0gMDsKKworCW11dGV4X2xvY2soJmRkLT5jb3JlX2xvY2spOworCisJLyogQ291bnRlci1wYXJ0IG9mIHN5c3RlbS1zdXNwZW5kIHdoZW4gcnVudGltZS1wbSBpcyBub3QgZW5hYmxlZC4gKi8KKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZC0+ZGV2KSkgeworCQlyYyA9IG1zbV9zcGlfcG1fcmVzdW1lX3J1bnRpbWUoZGQtPmRldik7CisJCWlmIChyYyA8IDAgJiYgIWRkLT5pc19pbml0X2NvbXBsZXRlKSB7CisJCQlyYyA9IDA7CisJCQltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCQkJZ290byBlcnJfc2V0dXBfZXhpdDsKKwkJfQorCX0KKworCWlmIChkZC0+c3VzcGVuZGVkKSB7CisJCXJjID0gLUVCVVNZOworCQltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCQlnb3RvIGVycl9zZXR1cF9leGl0OworCX0KKworCWlmIChkZC0+cGRhdGEtPmlzX3NoYXJlZCkgeworCQlyYyA9IGdldF9sb2NhbF9yZXNvdXJjZXMoZGQpOworCQlpZiAocmMpCisJCQlnb3RvIG5vX3Jlc291cmNlczsKKwl9CisKKwlzcGlfaW9jID0gcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFNQSV9JT19DT05UUk9MKTsKKwltYXNrID0gU1BJX0lPX0NfQ1NfTl9QT0xBUklUWV8wIDw8IHNwaS0+Y2hpcF9zZWxlY3Q7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKQorCQlzcGlfaW9jIHw9IG1hc2s7CisJZWxzZQorCQlzcGlfaW9jICY9IH5tYXNrOworCXNwaV9pb2MgPSBtc21fc3BpX2NhbGNfc3BpX2lvY19jbGtfcG9sYXJpdHkoc3BpX2lvYywgc3BpLT5tb2RlKTsKKworCXdyaXRlbF9yZWxheGVkKHNwaV9pb2MsIGRkLT5iYXNlICsgU1BJX0lPX0NPTlRST0wpOworCisJc3BpX2NvbmZpZyA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyBTUElfQ09ORklHKTsKKwlzcGlfY29uZmlnID0gbXNtX3NwaV9jYWxjX3NwaV9jb25maWdfbG9vcGJhY2tfYW5kX2lucHV0X2ZpcnN0KAorCQkJCQkJCXNwaV9jb25maWcsIHNwaS0+bW9kZSk7CisJd3JpdGVsX3JlbGF4ZWQoc3BpX2NvbmZpZywgZGQtPmJhc2UgKyBTUElfQ09ORklHKTsKKworCS8qIEVuc3VyZSBwcmV2aW91cyB3cml0ZSBjb21wbGV0ZWQgYmVmb3JlIGRpc2FibGluZyB0aGUgY2xvY2tzICovCisJbWIoKTsKKwlpZiAoZGQtPnBkYXRhLT5pc19zaGFyZWQpCisJCXB1dF9sb2NhbF9yZXNvdXJjZXMoZGQpOworCS8qIENvdW50ZXItcGFydCBvZiBzeXN0ZW0tcmVzdW1lIHdoZW4gcnVudGltZS1wbSBpcyBub3QgZW5hYmxlZC4gKi8KKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZC0+ZGV2KSkKKwkJbXNtX3NwaV9wbV9zdXNwZW5kX3J1bnRpbWUoZGQtPmRldik7CisKK25vX3Jlc291cmNlczoKKwltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGQtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGQtPmRldik7CisKK2Vycl9zZXR1cF9leGl0OgorCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCisKK3N0YXRpYyBpbnQgZGVidWdmc19pb21lbV94MzJfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJc3RydWN0IG1zbV9zcGlfZGVidWdmc19kYXRhICpyZWcgPSAoc3RydWN0IG1zbV9zcGlfZGVidWdmc19kYXRhICopZGF0YTsKKwlzdHJ1Y3QgbXNtX3NwaSAqZGQgPSByZWctPmRkOworCWludCByZXQ7CisKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRkLT5kZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJd3JpdGVsX3JlbGF4ZWQodmFsLCAoZGQtPmJhc2UgKyByZWctPm9mZnNldCkpOworCS8qIEVuc3VyZSB0aGUgcHJldmlvdXMgd3JpdGUgY29tcGxldGVkLiAqLworCW1iKCk7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRkLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGRkLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfaW9tZW1feDMyX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwlzdHJ1Y3QgbXNtX3NwaV9kZWJ1Z2ZzX2RhdGEgKnJlZyA9IChzdHJ1Y3QgbXNtX3NwaV9kZWJ1Z2ZzX2RhdGEgKilkYXRhOworCXN0cnVjdCBtc21fc3BpICpkZCA9IHJlZy0+ZGQ7CisJaW50IHJldDsKKworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGQtPmRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKnZhbCA9IHJlYWRsX3JlbGF4ZWQoZGQtPmJhc2UgKyByZWctPm9mZnNldCk7CisJLyogRW5zdXJlIHRoZSBwcmV2aW91cyByZWFkIGNvbXBsZXRlZC4gKi8KKwltYigpOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19pb21lbV94MzIsIGRlYnVnZnNfaW9tZW1feDMyX2dldCwKKwkJCWRlYnVnZnNfaW9tZW1feDMyX3NldCwgIjB4JTA4bGx4XG4iKTsKKworc3RhdGljIHZvaWQgc3BpX2RlYnVnZnNfaW5pdChzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJY2hhciBkaXJfbmFtZVsyMF07CisKKwlzY25wcmludGYoZGlyX25hbWUsIHNpemVvZihkaXJfbmFtZSksICIlc19kYmciLCBkZXZfbmFtZShkZC0+ZGV2KSk7CisJZGQtPmRlbnRfc3BpID0gZGVidWdmc19jcmVhdGVfZGlyKGRpcl9uYW1lLCBOVUxMKTsKKwlpZiAoZGQtPmRlbnRfc3BpKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnZnNfc3BpX3JlZ3MpOyBpKyspIHsKKwkJCWRkLT5yZWdfZGF0YVtpXS5vZmZzZXQgPSBkZWJ1Z2ZzX3NwaV9yZWdzW2ldLm9mZnNldDsKKwkJCWRkLT5yZWdfZGF0YVtpXS5kZCA9IGRkOworCQkJZGQtPmRlYnVnZnNfc3BpX3JlZ3NbaV0gPQorCQkJICAgZGVidWdmc19jcmVhdGVfZmlsZSgKKwkJCSAgICAgICBkZWJ1Z2ZzX3NwaV9yZWdzW2ldLm5hbWUsCisJCQkgICAgICAgZGVidWdmc19zcGlfcmVnc1tpXS5tb2RlLAorCQkJICAgICAgIGRkLT5kZW50X3NwaSwgJmRkLT5yZWdfZGF0YVtpXSwKKwkJCSAgICAgICAmZm9wc19pb21lbV94MzIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzcGlfZGVidWdmc19leGl0KHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpZiAoZGQtPmRlbnRfc3BpKSB7CisJCWludCBpOworCisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZC0+ZGVudF9zcGkpOworCQlkZC0+ZGVudF9zcGkgPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z2ZzX3NwaV9yZWdzKTsgaSsrKQorCQkJZGQtPmRlYnVnZnNfc3BpX3JlZ3NbaV0gPSBOVUxMOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzcGlfZGVidWdmc19pbml0KHN0cnVjdCBtc21fc3BpICpkZCkge30KK3N0YXRpYyB2b2lkIHNwaV9kZWJ1Z2ZzX2V4aXQoc3RydWN0IG1zbV9zcGkgKmRkKSB7fQorI2VuZGlmCisKKy8qID09PURldmljZSBhdHRyaWJ1dGVzIGJlZ2luPT09ICovCitzdGF0aWMgc3NpemVfdCBzaG93X3N0YXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1zbV9zcGkgKmRkID0gIHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwKKwkJCSJEZXZpY2UgICAgICAgJXNcbiIKKwkJCSJyeCBmaWZvX3NpemUgPSAlZCBzcGkgd29yZHNcbiIKKwkJCSJ0eCBmaWZvX3NpemUgPSAlZCBzcGkgd29yZHNcbiIKKwkJCSJ1c2VfZG1hID8gICAgJXNcbiIKKwkJCSJyeCBibG9jayBzaXplID0gJWQgYnl0ZXNcbiIKKwkJCSJ0eCBibG9jayBzaXplID0gJWQgYnl0ZXNcbiIKKwkJCSJpbnB1dCBidXJzdCBzaXplID0gJWQgYnl0ZXNcbiIKKwkJCSJvdXRwdXQgYnVyc3Qgc2l6ZSA9ICVkIGJ5dGVzXG4iCisJCQkiRE1BIGNvbmZpZ3VyYXRpb246XG4iCisJCQkidHhfY2g9JWQsIHJ4X2NoPSVkLCB0eF9jcmNpPSAlZCwgcnhfY3JjaT0lZFxuIgorCQkJIi0tc3RhdGlzdGljcy0tXG4iCisJCQkiUnggaXNycyAgPSAlZFxuIgorCQkJIlR4IGlzcnMgID0gJWRcbiIKKwkJCSItLWRlYnVnLS1cbiIKKwkJCSJOQSB5ZXRcbiIsCisJCQlkZXZfbmFtZShkZXYpLAorCQkJZGQtPmlucHV0X2ZpZm9fc2l6ZSwKKwkJCWRkLT5vdXRwdXRfZmlmb19zaXplLAorCQkJZGQtPnVzZV9kbWEgPyAieWVzIiA6ICJubyIsCisJCQlkZC0+aW5wdXRfYmxvY2tfc2l6ZSwKKwkJCWRkLT5vdXRwdXRfYmxvY2tfc2l6ZSwKKwkJCWRkLT5pbnB1dF9idXJzdF9zaXplLAorCQkJZGQtPm91dHB1dF9idXJzdF9zaXplLAorCQkJZGQtPnR4X2RtYV9jaGFuLAorCQkJZGQtPnJ4X2RtYV9jaGFuLAorCQkJZGQtPnR4X2RtYV9jcmNpLAorCQkJZGQtPnJ4X2RtYV9jcmNpLAorCQkJZGQtPnN0YXRfcngsCisJCQlkZC0+c3RhdF90eAorCQkJKTsKK30KKworLyogUmVzZXQgc3RhdGlzdGljcyBvbiB3cml0ZSAqLworc3RhdGljIHNzaXplX3Qgc2V0X3N0YXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1zbV9zcGkgKmRkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZC0+c3RhdF9yeCA9IDA7CisJZGQtPnN0YXRfdHggPSAwOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHN0YXRzLCAwNjQ0LCBzaG93X3N0YXRzLCBzZXRfc3RhdHMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3N0YXRzLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRldl9hdHRyX2dycCA9IHsKKwkuYXR0cnMgPSBkZXZfYXR0cnMsCit9OworLyogPT09RGV2aWNlIGF0dHJpYnV0ZXMgZW5kPT09ICovCisKK3N0YXRpYyB2b2lkIG1zbV9zcGlfYmFtX3BpcGVfdGVhcmRvd24oc3RydWN0IG1zbV9zcGkgKmRkLAorCQkJCQllbnVtIG1zbV9zcGlfcGlwZV9kaXJlY3Rpb24gcGlwZV9kaXIpCit7CisJc3RydWN0IG1zbV9zcGlfYmFtX3BpcGUgKnBpcGUgPSAocGlwZV9kaXIgPT0gU1BJX0JBTV9DT05TVU1FUl9QSVBFKSA/CisJCQkJCSgmZGQtPmJhbS5wcm9kKSA6ICgmZGQtPmJhbS5jb25zKTsKKwlpZiAoIXBpcGUtPnRlYXJkb3duX3JlcXVpcmVkKQorCQlyZXR1cm47CisKKwltc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsIHBpcGUpOworCWRtYV9mcmVlX2NvaGVyZW50KGRkLT5kZXYsIHBpcGUtPmNvbmZpZy5kZXNjLnNpemUsCisJCXBpcGUtPmNvbmZpZy5kZXNjLmJhc2UsIHBpcGUtPmNvbmZpZy5kZXNjLnBoeXNfYmFzZSk7CisJc3BzX2ZyZWVfZW5kcG9pbnQocGlwZS0+aGFuZGxlKTsKKwlwaXBlLT5oYW5kbGUgPSBOVUxMOworCXBpcGUtPnRlYXJkb3duX3JlcXVpcmVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9iYW1fcGlwZV9pbml0KHN0cnVjdCBtc21fc3BpICpkZCwKKwkJCQkJZW51bSBtc21fc3BpX3BpcGVfZGlyZWN0aW9uIHBpcGVfZGlyKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNwc19waXBlICpwaXBlX2hhbmRsZTsKKwlzdHJ1Y3QgbXNtX3NwaV9iYW1fcGlwZSAqcGlwZSA9IChwaXBlX2RpciA9PSBTUElfQkFNX0NPTlNVTUVSX1BJUEUpID8KKwkJCQkJKCZkZC0+YmFtLnByb2QpIDogKCZkZC0+YmFtLmNvbnMpOworCXN0cnVjdCBzcHNfY29ubmVjdCAqcGlwZV9jb25mID0gJnBpcGUtPmNvbmZpZzsKKworCXBpcGUtPm5hbWUgICA9IChwaXBlX2RpciA9PSBTUElfQkFNX0NPTlNVTUVSX1BJUEUpID8gImNvbnMiIDogInByb2QiOworCXBpcGUtPmhhbmRsZSA9IE5VTEw7CisJcGlwZV9oYW5kbGUgID0gc3BzX2FsbG9jX2VuZHBvaW50KCk7CisJaWYgKCFwaXBlX2hhbmRsZSkgeworCQlkZXZfZXJyKGRkLT5kZXYsICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIEJBTSBlbmRwb2ludFxuIgorCQkJCQkJCQksIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHBpcGVfY29uZiwgMCwgc2l6ZW9mKCpwaXBlX2NvbmYpKTsKKwlyYyA9IHNwc19nZXRfY29uZmlnKHBpcGVfaGFuZGxlLCBwaXBlX2NvbmYpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRkLT5kZXYsICIlczogRmFpbGVkIHRvIGdldCBCQU0gcGlwZSBjb25maWdcbiIKKwkJCSwgX19mdW5jX18pOworCQlnb3RvIGNvbmZpZ19lcnI7CisJfQorCisJaWYgKHBpcGVfZGlyID09IFNQSV9CQU1fQ09OU1VNRVJfUElQRSkgeworCQlwaXBlX2NvbmYtPnNvdXJjZSAgICAgICAgICA9IGRkLT5iYW0uaGFuZGxlOworCQlwaXBlX2NvbmYtPmRlc3RpbmF0aW9uICAgICA9IFNQU19ERVZfSEFORExFX01FTTsKKwkJcGlwZV9jb25mLT5tb2RlICAgICAgICAgICAgPSBTUFNfTU9ERV9TUkM7CisJCXBpcGVfY29uZi0+c3JjX3BpcGVfaW5kZXggID0KKwkJCQkJZGQtPnBkYXRhLT5iYW1fcHJvZHVjZXJfcGlwZV9pbmRleDsKKwkJcGlwZV9jb25mLT5kZXN0X3BpcGVfaW5kZXggPSAwOworCX0gZWxzZSB7CisJCXBpcGVfY29uZi0+c291cmNlICAgICAgICAgID0gU1BTX0RFVl9IQU5ETEVfTUVNOworCQlwaXBlX2NvbmYtPmRlc3RpbmF0aW9uICAgICA9IGRkLT5iYW0uaGFuZGxlOworCQlwaXBlX2NvbmYtPm1vZGUgICAgICAgICAgICA9IFNQU19NT0RFX0RFU1Q7CisJCXBpcGVfY29uZi0+c3JjX3BpcGVfaW5kZXggID0gMDsKKwkJcGlwZV9jb25mLT5kZXN0X3BpcGVfaW5kZXggPQorCQkJCQlkZC0+cGRhdGEtPmJhbV9jb25zdW1lcl9waXBlX2luZGV4OworCX0KKwlwaXBlX2NvbmYtPm9wdGlvbnMgPSBTUFNfT19FT1QgfCBTUFNfT19BVVRPX0VOQUJMRTsKKwlwaXBlX2NvbmYtPmRlc2Muc2l6ZSA9IFNQSV9CQU1fTUFYX0RFU0NfTlVNICogc2l6ZW9mKHN0cnVjdCBzcHNfaW92ZWMpOworCXBpcGVfY29uZi0+ZGVzYy5iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KGRkLT5kZXYsCisJCQkJcGlwZV9jb25mLT5kZXNjLnNpemUsCisJCQkJJnBpcGVfY29uZi0+ZGVzYy5waHlzX2Jhc2UsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFwaXBlX2NvbmYtPmRlc2MuYmFzZSkgeworCQlkZXZfZXJyKGRkLT5kZXYsICIlczogRmFpbGVkIGFsbG9jYXRlIEJBTSBwaXBlIG1lbW9yeSIKKwkJCSwgX19mdW5jX18pOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY29uZmlnX2VycjsKKwl9CisJLyogemVybyBkZXNjcmlwdG9yIEZJRk8gZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nIG9mIGZpcnN0IGRlc2NzICovCisJbWVtc2V0KHBpcGVfY29uZi0+ZGVzYy5iYXNlLCAweDAwLCBwaXBlX2NvbmYtPmRlc2Muc2l6ZSk7CisKKwlwaXBlLT5oYW5kbGUgPSBwaXBlX2hhbmRsZTsKKworCXJldHVybiAwOworCitjb25maWdfZXJyOgorCXNwc19mcmVlX2VuZHBvaW50KHBpcGVfaGFuZGxlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNtX3NwaV9iYW1fdGVhcmRvd24oc3RydWN0IG1zbV9zcGkgKmRkKQoreworCW1zbV9zcGlfYmFtX3BpcGVfdGVhcmRvd24oZGQsIFNQSV9CQU1fUFJPRFVDRVJfUElQRSk7CisJbXNtX3NwaV9iYW1fcGlwZV90ZWFyZG93bihkZCwgU1BJX0JBTV9DT05TVU1FUl9QSVBFKTsKKworCWlmIChkZC0+YmFtLmRlcmVnaXN0ZXJfcmVxdWlyZWQpIHsKKwkJc3BzX2RlcmVnaXN0ZXJfYmFtX2RldmljZShkZC0+YmFtLmhhbmRsZSk7CisJCWRkLT5iYW0uZGVyZWdpc3Rlcl9yZXF1aXJlZCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIGludCBtc21fc3BpX2JhbV9pbml0KHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlzdHJ1Y3Qgc3BzX2JhbV9wcm9wcyBiYW1fcHJvcHMgPSB7MH07CisJdWludHB0cl90IGJhbV9oYW5kbGU7CisJaW50IHJjID0gMDsKKworCXJjID0gc3BzX3BoeTJoKGRkLT5iYW0ucGh5c19hZGRyLCAmYmFtX2hhbmRsZSk7CisJaWYgKHJjIHx8ICFiYW1faGFuZGxlKSB7CisJCWJhbV9wcm9wcy5waHlzX2FkZHIgPSBkZC0+YmFtLnBoeXNfYWRkcjsKKwkJYmFtX3Byb3BzLnZpcnRfYWRkciA9IGRkLT5iYW0uYmFzZTsKKwkJYmFtX3Byb3BzLmlycSAgICAgICA9IGRkLT5iYW0uaXJxOworCQliYW1fcHJvcHMubWFuYWdlICAgID0gU1BTX0JBTV9NR1JfREVWSUNFX1JFTU9URTsKKwkJYmFtX3Byb3BzLnN1bW1pbmdfdGhyZXNob2xkID0gMHgxMDsKKworCQlyYyA9IHNwc19yZWdpc3Rlcl9iYW1fZGV2aWNlKCZiYW1fcHJvcHMsICZiYW1faGFuZGxlKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkJIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgQkFNIGRldmljZSIsCisJCQkJX19mdW5jX18pOworCQkJcmV0dXJuIHJjOworCQl9CisJCWRkLT5iYW0uZGVyZWdpc3Rlcl9yZXF1aXJlZCA9IHRydWU7CisJfQorCisJZGQtPmJhbS5oYW5kbGUgPSBiYW1faGFuZGxlOworCisJcmMgPSBtc21fc3BpX2JhbV9waXBlX2luaXQoZGQsIFNQSV9CQU1fUFJPRFVDRVJfUElQRSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGQtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGluaXQgcHJvZHVjZXIgQkFNLXBpcGUiLAorCQkJX19mdW5jX18pOworCQlnb3RvIGJhbV9pbml0X2Vycm9yOworCX0KKworCXJjID0gbXNtX3NwaV9iYW1fcGlwZV9pbml0KGRkLCBTUElfQkFNX0NPTlNVTUVSX1BJUEUpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRkLT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byBpbml0IGNvbnN1bWVyIEJBTS1waXBlIiwKKwkJCV9fZnVuY19fKTsKKwkJZ290byBiYW1faW5pdF9lcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworYmFtX2luaXRfZXJyb3I6CisJbXNtX3NwaV9iYW1fdGVhcmRvd24oZGQpOworCXJldHVybiByYzsKK30KKworZW51bSBtc21fc3BpX2R0X2VudHJ5X3N0YXR1cyB7CisJRFRfUkVRLCAgLyogUmVxdWlyZWQ6ICBmYWlsIGlmIG1pc3NpbmcgKi8KKwlEVF9TR1NULCAvKiBTdWdnZXN0ZWQ6IHdhcm4gaWYgbWlzc2luZyAqLworCURUX09QVCwgIC8qIE9wdGlvbmFsOiAgZG9uJ3Qgd2FybiBpZiBtaXNzaW5nICovCit9OworCitlbnVtIG1zbV9zcGlfZHRfZW50cnlfdHlwZSB7CisJRFRfVTMyLAorCURUX0dQSU8sCisJRFRfQk9PTCwKK307CisKK3N0cnVjdCBtc21fc3BpX2R0X3RvX3BkYXRhX21hcCB7CisJY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICpkdF9uYW1lOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX2RhdGE7CisJZW51bSBtc21fc3BpX2R0X2VudHJ5X3N0YXR1cyBzdGF0dXM7CisJZW51bSBtc21fc3BpX2R0X2VudHJ5X3R5cGUgICB0eXBlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92YWw7Cit9OworCitzdGF0aWMgaW50IG1zbV9zcGlfZHRfdG9fcGRhdGFfcG9wdWxhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IG1zbV9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCisJCQkJCXN0cnVjdCBtc21fc3BpX2R0X3RvX3BkYXRhX21hcCAgKml0cikKK3sKKwlpbnQgIHJldCwgZXJyID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWZvciAoOyBpdHItPmR0X25hbWU7ICsraXRyKSB7CisJCXN3aXRjaCAoaXRyLT50eXBlKSB7CisJCWNhc2UgRFRfR1BJTzoKKwkJCXJldCA9IG9mX2dldF9uYW1lZF9ncGlvKG5vZGUsIGl0ci0+ZHRfbmFtZSwgMCk7CisJCQlpZiAocmV0ID49IDApIHsKKwkJCQkqKChpbnQgKikgaXRyLT5wdHJfZGF0YSkgPSByZXQ7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERUX1UzMjoKKwkJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIGl0ci0+ZHRfbmFtZSwKKwkJCQkJCQkgKHUzMiAqKSBpdHItPnB0cl9kYXRhKTsKKwkJCWJyZWFrOworCQljYXNlIERUX0JPT0w6CisJCQkqKChib29sICopIGl0ci0+cHRyX2RhdGEpID0KKwkJCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgaXRyLT5kdF9uYW1lKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVkIGlzIGFuIHVua25vd24gRFQgZW50cnkgdHlwZVxuIiwKKwkJCQkJCQkJaXRyLT50eXBlKTsKKwkJCXJldCA9IC1FQkFERTsKKwkJfQorCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkRUIGVudHJ5IHJldDolZCBuYW1lOiVzIHZhbDolZFxuIiwKKwkJCQlyZXQsIGl0ci0+ZHRfbmFtZSwgKigoaW50ICopaXRyLT5wdHJfZGF0YSkpOworCisJCWlmIChyZXQpIHsKKwkJCSooKGludCAqKWl0ci0+cHRyX2RhdGEpID0gaXRyLT5kZWZhdWx0X3ZhbDsKKworCQkJaWYgKGl0ci0+c3RhdHVzIDwgRFRfT1BUKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyAnJXMnIERUIGVudHJ5XG4iLAorCQkJCQkJCQlpdHItPmR0X25hbWUpOworCisJCQkJLyogY29udCBvbiBlcnIgdG8gZHVtcCBhbGwgbWlzc2luZyBlbnRyaWVzICovCisJCQkJaWYgKGl0ci0+c3RhdHVzID09IERUX1JFUSAmJiAhZXJyKQorCQkJCQllcnIgPSByZXQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG1zbV9zcGlfZHRfdG9fcGRhdGE6IGNyZWF0ZSBwZGF0YSBhbmQgcmVhZCBncGlvIGNvbmZpZyBmcm9tIGRldmljZSB0cmVlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXNtX3NwaV9wbGF0Zm9ybV9kYXRhICptc21fc3BpX2R0X3RvX3BkYXRhKAorCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IG1zbV9zcGkgKmRkKQoreworCXN0cnVjdCBtc21fc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBkYXRhKSB7CisJCXN0cnVjdCBtc21fc3BpX2R0X3RvX3BkYXRhX21hcCBtYXBbXSA9IHsKKwkJeyJzcGktbWF4LWZyZXF1ZW5jeSIsCisJCQkmcGRhdGEtPm1heF9jbG9ja19zcGVlZCwgICAgICAgICBEVF9TR1NULCBEVF9VMzIsICAgMH0sCisJCXsicWNvbSxpbmZpbml0ZS1tb2RlIiwKKwkJCSZwZGF0YS0+aW5maW5pdGVfbW9kZSwgICAgICAgICAgIERUX09QVCwgIERUX1UzMiwgICAwfSwKKwkJeyJxY29tLG1hc3Rlci1pZCIsCisJCQkmcGRhdGEtPm1hc3Rlcl9pZCwgICAgICAgICAgICAgICBEVF9TR1NULCBEVF9VMzIsICAgMH0sCisJCXsicWNvbSxidXMtd2lkdGgiLAorCQkJJnBkYXRhLT5idXNfd2lkdGgsICAgICAgICAgICAgICAgRFRfT1BULCBEVF9VMzIsICAgOH0sCisJCXsicWNvbSx2ZXItcmVnLWV4aXN0cyIsCisJCQkmcGRhdGEtPnZlcl9yZWdfZXhpc3RzLCAgICAgICAgICBEVF9PUFQsICBEVF9CT09MLCAgMH0sCisJCXsicWNvbSx1c2UtYmFtIiwKKwkJCSZwZGF0YS0+dXNlX2JhbSwgICAgICAgICAgICAgICAgIERUX09QVCwgIERUX0JPT0wsICAwfSwKKwkJeyJxY29tLHVzZS1waW5jdHJsIiwKKwkJCSZwZGF0YS0+dXNlX3BpbmN0cmwsICAgICAgICAgICAgIERUX09QVCwgIERUX0JPT0wsICAwfSwKKwkJeyJxY29tLGJhbS1jb25zdW1lci1waXBlLWluZGV4IiwKKwkJCSZwZGF0YS0+YmFtX2NvbnN1bWVyX3BpcGVfaW5kZXgsIERUX09QVCwgIERUX1UzMiwgICAwfSwKKwkJeyJxY29tLGJhbS1wcm9kdWNlci1waXBlLWluZGV4IiwKKwkJCSZwZGF0YS0+YmFtX3Byb2R1Y2VyX3BpcGVfaW5kZXgsIERUX09QVCwgIERUX1UzMiwgICAwfSwKKwkJeyJxY29tLGdwaW8tY2xrIiwKKwkJCSZkZC0+c3BpX2dwaW9zWzBdLCAgICAgICAgICAgICAgIERUX09QVCwgIERUX0dQSU8sIC0xfSwKKwkJeyJxY29tLGdwaW8tbWlzbyIsCisJCQkmZGQtPnNwaV9ncGlvc1sxXSwgICAgICAgICAgICAgICBEVF9PUFQsICBEVF9HUElPLCAtMX0sCisJCXsicWNvbSxncGlvLW1vc2kiLAorCQkJJmRkLT5zcGlfZ3Bpb3NbMl0sICAgICAgICAgICAgICAgRFRfT1BULCAgRFRfR1BJTywgLTF9LAorCQl7InFjb20sZ3Bpby1jczAiLAorCQkJJmRkLT5jc19ncGlvc1swXS5ncGlvX251bSwgICAgICAgRFRfT1BULCAgRFRfR1BJTywgLTF9LAorCQl7InFjb20sZ3Bpby1jczEiLAorCQkJJmRkLT5jc19ncGlvc1sxXS5ncGlvX251bSwgICAgICAgRFRfT1BULCAgRFRfR1BJTywgLTF9LAorCQl7InFjb20sZ3Bpby1jczIiLAorCQkJJmRkLT5jc19ncGlvc1syXS5ncGlvX251bSwgICAgICAgRFRfT1BULCAgRFRfR1BJTywgLTF9LAorCQl7InFjb20sZ3Bpby1jczMiLAorCQkJJmRkLT5jc19ncGlvc1szXS5ncGlvX251bSwgICAgICAgRFRfT1BULCAgRFRfR1BJTywgLTF9LAorCQl7InFjb20scnQtcHJpb3JpdHkiLAorCQkJJnBkYXRhLT5ydF9wcmlvcml0eSwJCSBEVF9PUFQsICBEVF9CT09MLCAgMH0sCisJCXsicWNvbSxzaGFyZWQiLAorCQkJJnBkYXRhLT5pc19zaGFyZWQsCQkgRFRfT1BULCAgRFRfQk9PTCwgIDB9LAorCQl7TlVMTCwgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAwfSwKKwkJfTsKKworCQlpZiAobXNtX3NwaV9kdF90b19wZGF0YV9wb3B1bGF0ZShwZGV2LCBwZGF0YSwgbWFwKSkgeworCQkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwZGF0YSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWlmIChwZGF0YS0+dXNlX2JhbSkgeworCQlpZiAoIXBkYXRhLT5iYW1fY29uc3VtZXJfcGlwZV9pbmRleCkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSJtaXNzaW5nIHFjb20sYmFtLWNvbnN1bWVyLXBpcGUtaW5kZXggZW50cnkgaW4gZGV2aWNlLXRyZWVcbiIpOworCQkJcGRhdGEtPnVzZV9iYW0gPSBmYWxzZTsKKwkJfQorCisJCWlmICghcGRhdGEtPmJhbV9wcm9kdWNlcl9waXBlX2luZGV4KSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJIm1pc3NpbmcgcWNvbSxiYW0tcHJvZHVjZXItcGlwZS1pbmRleCBlbnRyeSBpbiBkZXZpY2UtdHJlZVxuIik7CisJCQlwZGF0YS0+dXNlX2JhbSA9IGZhbHNlOworCQl9CisJfQorCXJldHVybiBwZGF0YTsKK30KKworc3RhdGljIGludCBtc21fc3BpX2dldF9xdXBfaHdfdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG1zbV9zcGkgKmRkKQoreworCXUzMiBkYXRhID0gcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFFVUF9IQVJEV0FSRV9WRVIpOworCisJcmV0dXJuIChkYXRhID49IFFVUF9IQVJEV0FSRV9WRVJfMl8xXzEpID8gU1BJX1FVUF9WRVJTSU9OX0JGQU0KKwkJCQkJCTogU1BJX1FVUF9WRVJTSU9OX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NwaV9iYW1fZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgbXNtX3NwaSAqZGQsCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc291cmNlOworCXNpemVfdCBiYW1fbWVtX3NpemU7CisKKwlyZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCQkic3BpX2JhbV9waHlzaWNhbCIpOworCWlmICghcmVzb3VyY2UpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSIlczogTWlzc2luZyBzcGlfYmFtX3BoeXNpY2FsIGVudHJ5IGluIERUIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlkZC0+YmFtLnBoeXNfYWRkciA9IHJlc291cmNlLT5zdGFydDsKKwliYW1fbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKHJlc291cmNlKTsKKwlkZC0+YmFtLmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgZGQtPmJhbS5waHlzX2FkZHIsCisJCQkJCWJhbV9tZW1fc2l6ZSk7CisJaWYgKCFkZC0+YmFtLmJhc2UpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSIlczogRmFpbGVkIHRvIGlvcmVtYXAoc3BpX2JhbV9waHlzaWNhbCkiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWRkLT5iYW0uaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInNwaV9iYW1faXJxIik7CisJaWYgKGRkLT5iYW0uaXJxIDwgMCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiJXM6IE1pc3Npbmcgc3BpX2JhbV9pcnEgZW50cnkgaW4gRFQiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZC0+ZG1hX2luaXQgPSBtc21fc3BpX2JhbV9pbml0OworCWRkLT5kbWFfdGVhcmRvd24gPSBtc21fc3BpX2JhbV90ZWFyZG93bjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbXNtX3NwaQkgICpkZDsKKwlpbnQgICAgICAgICAgICAgICByYyA9IC1FTlhJTzsKKwlpbnQgICAgICAgICAgICAgICBjbGtfZW5hYmxlZCA9IDA7CisJaW50ICAgICAgICAgICAgICAgcGNsa19lbmFibGVkID0gMDsKKworCWRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJaWYgKGRkLT5wZGF0YSAmJiBkZC0+cGRhdGEtPnVzZV9waW5jdHJsKSB7CisJCXJjID0gbXNtX3NwaV9waW5jdHJsX2luaXQoZGQpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBwaW5jdHJsIGluaXQgZmFpbGVkXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJbXV0ZXhfbG9jaygmZGQtPmNvcmVfbG9jayk7CisKKwlkZC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiY29yZV9jbGsiKTsKKwlpZiAoSVNfRVJSKGRkLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gZ2V0IGNvcmVfY2xrXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gUFRSX0VSUihkZC0+Y2xrKTsKKwkJZ290byBlcnJfY2xrX2dldDsKKwl9CisKKwlkZC0+cGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImlmYWNlX2NsayIpOworCWlmIChJU19FUlIoZGQtPnBjbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gZ2V0IGlmYWNlX2Nsa1xuIiwgX19mdW5jX18pOworCQlyYyA9IFBUUl9FUlIoZGQtPnBjbGspOworCQlnb3RvIGVycl9wY2xrX2dldDsKKwl9CisKKwlpZiAoZGQtPnBkYXRhICYmIGRkLT5wZGF0YS0+bWF4X2Nsb2NrX3NwZWVkKQorCQltc21fc3BpX2Nsb2NrX3NldChkZCwgZGQtPnBkYXRhLT5tYXhfY2xvY2tfc3BlZWQpOworCisJcmMgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGQtPmNsayk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gZW5hYmxlIGNvcmVfY2xrXG4iLAorCQkJX19mdW5jX18pOworCQlnb3RvIGVycl9jbGtfZW5hYmxlOworCX0KKworCWNsa19lbmFibGVkID0gMTsKKwlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShkZC0+cGNsayk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB1bmFibGUgdG8gZW5hYmxlIGlmYWNlX2Nsa1xuIiwKKwkJX19mdW5jX18pOworCQlnb3RvIGVycl9wY2xrX2VuYWJsZTsKKwl9CisKKwlwY2xrX2VuYWJsZWQgPSAxOworCisJaWYgKGRkLT5wZGF0YSAmJiBkZC0+cGRhdGEtPnZlcl9yZWdfZXhpc3RzKSB7CisJCWVudW0gbXNtX3NwaV9xdXBfdmVyc2lvbiB2ZXIgPQorCQkJCQltc21fc3BpX2dldF9xdXBfaHdfdmVyKCZwZGV2LT5kZXYsIGRkKTsKKwkJaWYgKGRkLT5xdXBfdmVyICE9IHZlcikKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkiJXM6IEhXIHZlcnNpb24gZGlmZmVyZW50IHRoZW4gaW5pdGlhbGx5IGFzc3VtZWQgYnkgcHJvYmUiLAorCQkJX19mdW5jX18pOworCX0KKworCS8qIEdTQkkgZG9zZSBub3QgZXhpc3RzIG9uIEItZmFtaWx5IE1TTS1jaGlwcyAqLworCWlmIChkZC0+cXVwX3ZlciAhPSBTUElfUVVQX1ZFUlNJT05fQkZBTSkgeworCQlyYyA9IG1zbV9zcGlfY29uZmlndXJlX2dzYmkoZGQsIHBkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIGVycl9jb25maWdfZ3NiaTsKKwl9CisKKwltc21fc3BpX2NhbGN1bGF0ZV9maWZvX3NpemUoZGQpOworCWlmIChkZC0+dXNlX2RtYSkgeworCQlyYyA9IGRkLT5kbWFfaW5pdChkZCk7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSIlczogZmFpbGVkIHRvIGluaXQgRE1BLiBEaXNhYmxpbmcgRE1BIG1vZGVcbiIsCisJCQkJX19mdW5jX18pOworCQkJZGQtPnVzZV9kbWEgPSAwOworCQl9CisJfQorCisJbXNtX3NwaV9yZWdpc3Rlcl9pbml0KGRkKTsKKwkvKgorCSAqIFRoZSBTUEkgY29yZSBnZW5lcmF0ZXMgYSBib2d1cyBpbnB1dCBvdmVycnVuIGVycm9yIG9uIHNvbWUgdGFyZ2V0cywKKwkgKiB3aGVuIGEgdHJhbnNpdGlvbiBmcm9tIHJ1biB0byByZXNldCBzdGF0ZSBvY2N1cnMgYW5kIGlmIHRoZSBGSUZPIGhhcworCSAqIGFuIG9kZCBudW1iZXIgb2YgZW50cmllcy4gSGVuY2Ugd2UgZGlzYWJsZSB0aGUgSU5QVVRfT1ZFUl9SVU5fRVJSX0VOCisJICogYml0LgorCSAqLworCW1zbV9zcGlfZW5hYmxlX2Vycm9yX2ZsYWdzKGRkKTsKKworCXdyaXRlbF9yZWxheGVkKFNQSV9JT19DX05PX1RSSV9TVEFURSwgZGQtPmJhc2UgKyBTUElfSU9fQ09OVFJPTCk7CisJcmMgPSBtc21fc3BpX3NldF9zdGF0ZShkZCwgU1BJX09QX1NUQVRFX1JFU0VUKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3NwaV9zdGF0ZTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Y2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGQtPnBjbGspOworCWNsa19lbmFibGVkID0gMDsKKwlwY2xrX2VuYWJsZWQgPSAwOworCisJZGQtPnRyYW5zZmVyX3BlbmRpbmcgPSAwOworCWRkLT50eF9tb2RlID0gU1BJX01PREVfTk9ORTsKKwlkZC0+cnhfbW9kZSA9IFNQSV9NT0RFX05PTkU7CisKKwlyYyA9IG1zbV9zcGlfcmVxdWVzdF9pcnEoZGQsIHBkZXYsIG1hc3Rlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9pcnE7CisKKwltc21fc3BpX2Rpc2FibGVfaXJxcyhkZCk7CisKKwltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCXJldHVybiAwOworCitlcnJfaXJxOgorZXJyX3NwaV9zdGF0ZToKKwlpZiAoZGQtPnVzZV9kbWEgJiYgZGQtPmRtYV90ZWFyZG93bikKKwkJZGQtPmRtYV90ZWFyZG93bihkZCk7CitlcnJfY29uZmlnX2dzYmk6CisJaWYgKHBjbGtfZW5hYmxlZCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRkLT5wY2xrKTsKK2Vycl9wY2xrX2VuYWJsZToKKwlpZiAoY2xrX2VuYWJsZWQpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Y2xrKTsKK2Vycl9jbGtfZW5hYmxlOgorCWNsa19wdXQoZGQtPnBjbGspOworZXJyX3BjbGtfZ2V0OgorCWNsa19wdXQoZGQtPmNsayk7CitlcnJfY2xrX2dldDoKKwltdXRleF91bmxvY2soJmRkLT5jb3JlX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgICAgICAqbWFzdGVyOworCXN0cnVjdCBtc21fc3BpCSAgICAgICAqZGQ7CisJc3RydWN0IHJlc291cmNlCSAgICAgICAqcmVzb3VyY2U7CisJaW50CQkJaSA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmMgPSAtRU5YSU87CisJc3RydWN0IG1zbV9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbXNtX3NwaSkpOworCWlmICghbWFzdGVyKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWFzdGVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfcHJvYmVfZXhpdDsKKwl9CisKKwltYXN0ZXItPmJ1c19udW0gICAgICAgID0gcGRldi0+aWQ7CisJbWFzdGVyLT5tb2RlX2JpdHMgICAgICA9IFNQSV9TVVBQT1JURURfTU9ERVM7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFNQSV9OVU1fQ0hJUFNFTEVDVFM7CisJbWFzdGVyLT5zZXRfY3MJICAgICAgID0gbXNtX3NwaV9zZXRfY3M7CisJbWFzdGVyLT5zZXR1cCAgICAgICAgICA9IG1zbV9zcGlfc2V0dXA7CisJbWFzdGVyLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gbXNtX3NwaV9wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gbXNtX3NwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUKKwkJCT0gbXNtX3NwaV91bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmU7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYXN0ZXIpOworCWRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWRkLT5xdXBfdmVyID0gU1BJX1FVUF9WRVJTSU9OX0JGQU07CisJCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwkJcGRhdGEgPSBtc21fc3BpX2R0X3RvX3BkYXRhKHBkZXYsIGRkKTsKKwkJaWYgKCFwZGF0YSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm0gZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9wcm9iZV9leGl0OworCQl9CisKKwkJcmMgPSBvZl9hbGlhc19nZXRfaWQocGRldi0+ZGV2Lm9mX25vZGUsICJzcGkiKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJInVzaW5nIGRlZmF1bHQgYnVzX251bSAlZFxuIiwgcGRldi0+aWQpOworCQllbHNlCisJCQltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZCA9IHJjOworCX0gZWxzZSB7CisJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJCWRkLT5xdXBfdmVyID0gU1BJX1FVUF9WRVJTSU9OX05PTkU7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3BpX3JzcmNzKTsgKytpKSB7CisJCQlyZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLAorCQkJCQkJCWkpOworCQkJZGQtPnNwaV9ncGlvc1tpXSA9IHJlc291cmNlID8gcmVzb3VyY2UtPnN0YXJ0IDogLTE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGlfY3NfcnNyY3MpOyArK2kpIHsKKwkJCXJlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sCisJCQkJCQlpICsgQVJSQVlfU0laRShzcGlfcnNyY3MpKTsKKwkJCWRkLT5jc19ncGlvc1tpXS5ncGlvX251bSA9IHJlc291cmNlID8KKwkJCQkJCQlyZXNvdXJjZS0+c3RhcnQgOiAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwaV9jc19yc3Jjcyk7ICsraSkKKwkJZGQtPmNzX2dwaW9zW2ldLnZhbGlkID0gMDsKKworCWRkLT5wZGF0YSA9IHBkYXRhOworCXJlc291cmNlID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlc291cmNlKSB7CisJCXJjID0gLUVOWElPOworCQlnb3RvIGVycl9wcm9iZV9yZXM7CisJfQorCisJZGQtPm1lbV9waHlzX2FkZHIgPSByZXNvdXJjZS0+c3RhcnQ7CisJZGQtPm1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXNvdXJjZSk7CisJZGQtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlpZiAocGRhdGEpIHsKKwkJbWFzdGVyLT5ydCA9IHBkYXRhLT5ydF9wcmlvcml0eTsKKwkJaWYgKHBkYXRhLT5kbWFfY29uZmlnKSB7CisJCQlyYyA9IHBkYXRhLT5kbWFfY29uZmlnKCk7CisJCQlpZiAocmMpIHsKKwkJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCQkiJXM6IERNIG1vZGUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkJX19mdW5jX18pOworCQkJCWRkLT51c2VfZG1hID0gMDsKKwkJCQlnb3RvIHNraXBfZG1hX3Jlc291cmNlczsKKwkJCX0KKwkJfQorCQlpZiAoIWRkLT5wZGF0YS0+dXNlX2JhbSkKKwkJCWdvdG8gc2tpcF9kbWFfcmVzb3VyY2VzOworCisJCXJjID0gbXNtX3NwaV9iYW1fZ2V0X3Jlc291cmNlcyhkZCwgcGRldiwgbWFzdGVyKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfd2FybihkZC0+ZGV2LAorCQkJCQkiJXM6IEZhaWxlZCB0byBnZXQgQkFNIHJlc291cmNlcyIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gc2tpcF9kbWFfcmVzb3VyY2VzOworCQl9CisJCWRkLT51c2VfZG1hID0gMTsKKwl9CisKKwlzcGlfZG1hX21hc2soJnBkZXYtPmRldik7Citza2lwX2RtYV9yZXNvdXJjZXM6CisKKwlzcGluX2xvY2tfaW5pdCgmZGQtPnF1ZXVlX2xvY2spOworCW11dGV4X2luaXQoJmRkLT5jb3JlX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRkLT5jb250aW51ZV9zdXNwZW5kKTsKKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgZGQtPm1lbV9waHlzX2FkZHIsCisJCQkJCWRkLT5tZW1fc2l6ZSwgU1BJX0RSVl9OQU1FKSkgeworCQlyYyA9IC1FTlhJTzsKKwkJZ290byBlcnJfcHJvYmVfcmVxbWVtOworCX0KKworCWRkLT5iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIGRkLT5tZW1fcGh5c19hZGRyLCBkZC0+bWVtX3NpemUpOworCWlmICghZGQtPmJhc2UpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wcm9iZV9yZXFtZW07CisJfQorCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJnBkZXYtPmRldiwgTVNFQ19QRVJfU0VDKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCWRkLT5zdXNwZW5kZWQgPSAxOworCXJjID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfcHJvYmVfcmVnX21hc3RlcjsKKworCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCYoZGQtPmRldi0+a29iaiksICZkZXZfYXR0cl9ncnApOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGRldi4gYXR0cnMgOiAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9hdHRyczsKKwl9CisJc3BpX2RlYnVnZnNfaW5pdChkZCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2F0dHJzOgorCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworZXJyX3Byb2JlX3JlZ19tYXN0ZXI6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworZXJyX3Byb2JlX3JlcW1lbToKK2Vycl9wcm9iZV9yZXM6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKK2Vycl9wcm9iZV9leGl0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtc21fc3BpX3BtX3N1c3BlbmRfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbXNtX3NwaQkgICpkZDsKKwl1bnNpZ25lZCBsb25nCSAgIGZsYWdzOworCisJZGV2X2RiZyhkZXZpY2UsICJwbV9ydW50aW1lOiBzdXNwZW5kaW5nLi4uXG4iKTsKKwlpZiAoIW1hc3RlcikKKwkJZ290byBzdXNwZW5kX2V4aXQ7CisJZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaWYgKCFkZCkKKwkJZ290byBzdXNwZW5kX2V4aXQ7CisKKwlpZiAoZGQtPnN1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBub3RoaW5nIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aGlsZSB3ZSdyZQorCSAqIHN1c3BlbmRpbmcKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlkZC0+c3VzcGVuZGVkID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZC0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJLyogV2FpdCBmb3IgdHJhbnNhY3Rpb25zIHRvIGVuZCwgb3IgdGltZSBvdXQgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGQtPmNvbnRpbnVlX3N1c3BlbmQsCisJCSFkZC0+dHJhbnNmZXJfcGVuZGluZyk7CisKKwltdXRleF9sb2NrKCZkZC0+Y29yZV9sb2NrKTsKKwlpZiAoZGQtPnBkYXRhICYmICFkZC0+cGRhdGEtPmlzX3NoYXJlZCAmJiBkZC0+dXNlX2RtYSkgeworCQltc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsICZkZC0+YmFtLnByb2QpOworCQltc21fc3BpX2JhbV9waXBlX2Rpc2Nvbm5lY3QoZGQsICZkZC0+YmFtLmNvbnMpOworCX0KKwlpZiAoZGQtPnBkYXRhICYmICFkZC0+cGRhdGEtPmlzX3NoYXJlZCkKKwkJcHV0X2xvY2FsX3Jlc291cmNlcyhkZCk7CisKKwlpZiAoZGQtPnBkYXRhKQorCQltc21fc3BpX2Nsa19wYXRoX3ZvdGUoZGQsIDApOworCW11dGV4X3VubG9jaygmZGQtPmNvcmVfbG9jayk7CisKK3N1c3BlbmRfZXhpdDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fc3BpX3BtX3Jlc3VtZV9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtc21fc3BpCSAgKmRkOworCWludCAgICAgICAgICAgICAgIHJldCA9IDA7CisKKwlkZXZfZGJnKGRldmljZSwgInBtX3J1bnRpbWU6IHJlc3VtaW5nLi4uXG4iKTsKKwlpZiAoIW1hc3RlcikKKwkJZ290byByZXN1bWVfZXhpdDsKKwlkZCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpZiAoIWRkKQorCQlnb3RvIHJlc3VtZV9leGl0OworCisJaWYgKCFkZC0+c3VzcGVuZGVkKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRkLT5pc19pbml0X2NvbXBsZXRlKSB7CisJCXJldCA9IGluaXRfcmVzb3VyY2VzKHBkZXYpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCisJCWRkLT5pc19pbml0X2NvbXBsZXRlID0gdHJ1ZTsKKwl9CisJbXNtX3NwaV9jbGtfcGF0aF9pbml0KGRkKTsKKwltc21fc3BpX2Nsa19wYXRoX3ZvdGUoZGQsIGRkLT5wZGF0YS0+bWF4X2Nsb2NrX3NwZWVkKTsKKworCWlmICghZGQtPnBkYXRhLT5pc19zaGFyZWQpIHsKKwkJcmV0ID0gZ2V0X2xvY2FsX3Jlc291cmNlcyhkZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoIWRkLT5wZGF0YS0+aXNfc2hhcmVkICYmIGRkLT51c2VfZG1hKSB7CisJCW1zbV9zcGlfYmFtX3BpcGVfY29ubmVjdChkZCwgJmRkLT5iYW0ucHJvZCwKKwkJCQkmZGQtPmJhbS5wcm9kLmNvbmZpZyk7CisJCW1zbV9zcGlfYmFtX3BpcGVfY29ubmVjdChkZCwgJmRkLT5iYW0uY29ucywKKwkJCQkmZGQtPmJhbS5jb25zLmNvbmZpZyk7CisJfQorCWRkLT5zdXNwZW5kZWQgPSAwOworCityZXN1bWVfZXhpdDoKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtc21fc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWlmICghcG1fcnVudGltZV9lbmFibGVkKGRldmljZSkgfHwgIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldmljZSkpIHsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworCQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJCXN0cnVjdCBtc21fc3BpICAgKmRkOworCisJCWRldl9kYmcoZGV2aWNlLCAic3lzdGVtIHN1c3BlbmQiKTsKKwkJaWYgKCFtYXN0ZXIpCisJCQlnb3RvIHN1c3BlbmRfZXhpdDsKKwkJZGQgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJCWlmICghZGQpCisJCQlnb3RvIHN1c3BlbmRfZXhpdDsKKwkJbXNtX3NwaV9wbV9zdXNwZW5kX3J1bnRpbWUoZGV2aWNlKTsKKworCQkvKgorCQkgKiBzZXQgdGhlIGRldmljZSdzIHJ1bnRpbWUgUE0gc3RhdHVzIHRvICdzdXNwZW5kZWQnCisJCSAqLworCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2aWNlKTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldmljZSk7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGRldmljZSk7CisJfQorc3VzcGVuZF9leGl0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9zcGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwkvKgorCSAqIFJlbHkgb24gcnVudGltZS1QTSB0byBjYWxsIHJlc3VtZSBpbiBjYXNlIGl0IGlzIGVuYWJsZWQKKwkgKiBFdmVuIGlmIGl0J3Mgbm90IGVuYWJsZWQsIHJlbHkgb24gMXN0IGNsaWVudCB0cmFuc2FjdGlvbiB0byBkbworCSAqIGNsb2NrIE9OIGFuZCBncGlvIGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlkZXZfZGJnKGRldmljZSwgInN5c3RlbSByZXN1bWUiKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIG1zbV9zcGlfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG1zbV9zcGlfcmVzdW1lIE5VTEwKKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgbXNtX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG1zbV9zcGkgICAgKmRkID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX2RlYnVnZnNfZXhpdChkZCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJmRldl9hdHRyX2dycCk7CisKKwlpZiAoZGQtPmRtYV90ZWFyZG93bikKKwkJZGQtPmRtYV90ZWFyZG93bihkZCk7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmcGRldi0+ZGV2KTsKKwljbGtfcHV0KGRkLT5jbGspOworCWNsa19wdXQoZGQtPnBjbGspOworCW1zbV9zcGlfY2xrX3BhdGhfdGVhcmRvd24oZGQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3NwaV9kdF9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAicWNvbSxzcGktcXVwLXYyIiwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbXNtX3NwaV9kZXZfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKG1zbV9zcGlfc3VzcGVuZCwgbXNtX3NwaV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKG1zbV9zcGlfcG1fc3VzcGVuZF9ydW50aW1lLAorCQkJbXNtX3NwaV9wbV9yZXN1bWVfcnVudGltZSwgTlVMTCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9IFNQSV9EUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQkJPSAmbXNtX3NwaV9kZXZfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fc3BpX2R0X21hdGNoLAorCX0sCisJLnByb2JlCQk9IG1zbV9zcGlfcHJvYmUsCisJLnJlbW92ZQkJPSBtc21fc3BpX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXNtX3NwaV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiJTUElfRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX3FzZC5oIGIvZHJpdmVycy9zcGkvc3BpX3FzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOGI1NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGlfcXNkLmgKQEAgLTAsMCArMSw1NTcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9TUElfUVNEX0gKKyNkZWZpbmUgX1NQSV9RU0RfSAorCisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2RlZmluZSBTUElfRFJWX05BTUUgICAgICAgICAgICAgICAgICAic3BpX3FzZCIKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0QpIHx8IElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0RfTU9EVUxFKQorCisjZGVmaW5lIFFTRF9SRUcoeCkgKHgpCisjZGVmaW5lIFFVUF9SRUcoeCkKKworI2RlZmluZSBTUElfRklGT19XT1JEX0NOVCAgICAgICAgICAgICAweDAwNDgKKworI2Vsc2UKKworI2RlZmluZSBRU0RfUkVHKHgpCisjZGVmaW5lIFFVUF9SRUcoeCkgKHgpCisKKyNkZWZpbmUgUVVQX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgMHgwMDAwIC8qIE4gJiBOT19JTlBVVC9OT19PVVRQVVQgYml0cyAqLworI2RlZmluZSBRVVBfRVJST1JfRkxBR1NfRU4gICAgICAgICAgICAweDAzMEMKKyNkZWZpbmUgUVVQX0VSUl9NQVNLICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIFNQSV9PVVRQVVRfRklGT19XT1JEX0NOVCAgICAgIDB4MDEwQworI2RlZmluZSBTUElfSU5QVVRfRklGT19XT1JEX0NOVCAgICAgICAweDAyMTQKKyNkZWZpbmUgUVVQX01YX1dSSVRFX0NPVU5UICAgICAgICAgICAgMHgwMTUwCisjZGVmaW5lIFFVUF9NWF9XUklURV9DTlRfQ1VSUkVOVCAgICAgIDB4MDE1NAorCisjZGVmaW5lIFFVUF9DT05GSUdfU1BJX01PREUgICAgICAgICAgIDB4MDEwMAorI2VuZGlmCisKKyNkZWZpbmUgR1NCSV9DVFJMX1JFRyAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEdTQklfU1BJX0NPTkZJRyAgICAgICAgICAgICAgIDB4MzAKKy8qIEItZmFtaWx5IG9ubHkgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFVUF9IQVJEV0FSRV9WRVIgICAgICAgICAgICAgIDB4MDAzMAorI2RlZmluZSBRVVBfSEFSRFdBUkVfVkVSXzJfMV8xICAgICAgICAwWDIwMDEwMDAxCisjZGVmaW5lIFFVUF9PUEVSQVRJT05BTF9NQVNLICAgICAgICAgIDB4MDAyOAorI2RlZmluZSBRVVBfT1BfTUFTS19PVVRQVVRfU0VSVklDRV9GTEFHIDB4MTAwCisjZGVmaW5lIFFVUF9PUF9NQVNLX0lOUFVUX1NFUlZJQ0VfRkxBRyAgMHgyMDAKKworI2RlZmluZSBRVVBfRVJST1JfRkxBR1MgICAgICAgICAgICAgICAweDAzMDgKKworI2RlZmluZSBTUElfQ09ORklHICAgICAgICAgICAgICAgICAgICAoUVNEX1JFRygweDAwMDApIFFVUF9SRUcoMHgwMzAwKSkKKyNkZWZpbmUgU1BJX0lPX0NPTlRST0wgICAgICAgICAgICAgICAgKFFTRF9SRUcoMHgwMDA0KSBRVVBfUkVHKDB4MDMwNCkpCisjZGVmaW5lIFNQSV9JT19NT0RFUyAgICAgICAgICAgICAgICAgIChRU0RfUkVHKDB4MDAwOCkgUVVQX1JFRygweDAwMDgpKQorI2RlZmluZSBTUElfU1dfUkVTRVQgICAgICAgICAgICAgICAgICAoUVNEX1JFRygweDAwMEMpIFFVUF9SRUcoMHgwMDBDKSkKKyNkZWZpbmUgU1BJX1RJTUVfT1VUX0NVUlJFTlQgICAgICAgICAgKFFTRF9SRUcoMHgwMDE0KSBRVVBfUkVHKDB4MDAxNCkpCisjZGVmaW5lIFNQSV9NWF9PVVRQVVRfQ09VTlQgICAgICAgICAgIChRU0RfUkVHKDB4MDAxOCkgUVVQX1JFRygweDAxMDApKQorI2RlZmluZSBTUElfTVhfT1VUUFVUX0NOVF9DVVJSRU5UICAgICAoUVNEX1JFRygweDAwMUMpIFFVUF9SRUcoMHgwMTA0KSkKKyNkZWZpbmUgU1BJX01YX0lOUFVUX0NPVU5UICAgICAgICAgICAgKFFTRF9SRUcoMHgwMDIwKSBRVVBfUkVHKDB4MDIwMCkpCisjZGVmaW5lIFNQSV9NWF9JTlBVVF9DTlRfQ1VSUkVOVCAgICAgIChRU0RfUkVHKDB4MDAyNCkgUVVQX1JFRygweDAyMDQpKQorI2RlZmluZSBTUElfTVhfUkVBRF9DT1VOVCAgICAgICAgICAgICAoUVNEX1JFRygweDAwMjgpIFFVUF9SRUcoMHgwMjA4KSkKKyNkZWZpbmUgU1BJX01YX1JFQURfQ05UX0NVUlJFTlQgICAgICAgKFFTRF9SRUcoMHgwMDJDKSBRVVBfUkVHKDB4MDIwQykpCisjZGVmaW5lIFNQSV9PUEVSQVRJT05BTCAgICAgICAgICAgICAgIChRU0RfUkVHKDB4MDAzMCkgUVVQX1JFRygweDAwMTgpKQorI2RlZmluZSBTUElfRVJST1JfRkxBR1MgICAgICAgICAgICAgICAoUVNEX1JFRygweDAwMzQpIFFVUF9SRUcoMHgwMDFDKSkKKyNkZWZpbmUgU1BJX0VSUk9SX0ZMQUdTX0VOICAgICAgICAgICAgKFFTRF9SRUcoMHgwMDM4KSBRVVBfUkVHKDB4MDAyMCkpCisjZGVmaW5lIFNQSV9ERUFTU0VSVF9XQUlUICAgICAgICAgICAgIChRU0RfUkVHKDB4MDAzQykgUVVQX1JFRygweDAzMTApKQorI2RlZmluZSBTUElfT1VUUFVUX0RFQlVHICAgICAgICAgICAgICAoUVNEX1JFRygweDAwNDApIFFVUF9SRUcoMHgwMTA4KSkKKyNkZWZpbmUgU1BJX0lOUFVUX0RFQlVHICAgICAgICAgICAgICAgKFFTRF9SRUcoMHgwMDQ0KSBRVVBfUkVHKDB4MDIxMCkpCisjZGVmaW5lIFNQSV9URVNUX0NUUkwgICAgICAgICAgICAgICAgIChRU0RfUkVHKDB4MDA0QykgUVVQX1JFRygweDAwMjQpKQorI2RlZmluZSBTUElfT1VUUFVUX0ZJRk8gICAgICAgICAgICAgICAoUVNEX1JFRygweDAxMDApIFFVUF9SRUcoMHgwMTEwKSkKKyNkZWZpbmUgU1BJX0lOUFVUX0ZJRk8gICAgICAgICAgICAgICAgKFFTRF9SRUcoMHgwMjAwKSBRVVBfUkVHKDB4MDIxOCkpCisjZGVmaW5lIFNQSV9TVEFURSAgICAgICAgICAgICAgICAgICAgIChRU0RfUkVHKFNQSV9PUEVSQVRJT05BTCkgUVVQX1JFRygweDAwMDQpKQorCisvKiBRVVBfQ09ORklHIGZpZWxkcyAqLworI2RlZmluZSBTUElfQ0ZHX04gICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFGCisjZGVmaW5lIFNQSV9OT19JTlBVVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU1BJX05PX09VVFBVVCAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTUElfRU5fRVhUX09VVF9GTEFHICAgICAgICAgICAweDAwMDEwMDAwCisKKy8qIFNQSV9DT05GSUcgZmllbGRzICovCisjZGVmaW5lIFNQSV9DRkdfTE9PUEJBQ0sgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU1BJX0NGR19JTlBVVF9GSVJTVCAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBTUElfQ0ZHX0hTX01PREUgICAgICAgICAgICAgICAweDAwMDAwNDAwCisKKy8qIFNQSV9JT19DT05UUk9MIGZpZWxkcyAqLworI2RlZmluZSBTUElfSU9fQ19GT1JDRV9DUyAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFNQSV9JT19DX0NMS19JRExFX0hJR0ggICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU1BJX0lPX0NfTVhfQ1NfTU9ERSAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTUElfSU9fQ19DU19OX1BPTEFSSVRZICAgICAgICAweDAwMDAwMEYwCisjZGVmaW5lIFNQSV9JT19DX0NTX05fUE9MQVJJVFlfMCAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1BJX0lPX0NfQ1NfU0VMRUNUICAgICAgICAgICAgMHgwMDAwMDAwQworI2RlZmluZSBTUElfSU9fQ19UUklTVEFURV9DUyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNQSV9JT19DX05PX1RSSV9TVEFURSAgICAgICAgIDB4MDAwMDAwMDEKKworLyogU1BJX0lPX01PREVTIGZpZWxkcyAqLworI2RlZmluZSBTUElfSU9fTV9PVVRQVVRfQklUX1NISUZUX0VOICAoUVNEX1JFRygweDAwMDA0MDAwKSBRVVBfUkVHKDB4MDAwMTAwMDApKQorI2RlZmluZSBTUElfSU9fTV9QQUNLX0VOICAgICAgICAgICAgICAoUVNEX1JFRygweDAwMDAyMDAwKSBRVVBfUkVHKDB4MDAwMDgwMDApKQorI2RlZmluZSBTUElfSU9fTV9VTlBBQ0tfRU4gICAgICAgICAgICAoUVNEX1JFRygweDAwMDAxMDAwKSBRVVBfUkVHKDB4MDAwMDQwMDApKQorI2RlZmluZSBTUElfSU9fTV9JTlBVVF9NT0RFICAgICAgICAgICAoUVNEX1JFRygweDAwMDAwQzAwKSBRVVBfUkVHKDB4MDAwMDMwMDApKQorI2RlZmluZSBTUElfSU9fTV9PVVRQVVRfTU9ERSAgICAgICAgICAoUVNEX1JFRygweDAwMDAwMzAwKSBRVVBfUkVHKDB4MDAwMDBDMDApKQorI2RlZmluZSBTUElfSU9fTV9JTlBVVF9GSUZPX1NJWkUgICAgICAoUVNEX1JFRygweDAwMDAwMEMwKSBRVVBfUkVHKDB4MDAwMDAzODApKQorI2RlZmluZSBTUElfSU9fTV9JTlBVVF9CTE9DS19TSVpFICAgICAoUVNEX1JFRygweDAwMDAwMDMwKSBRVVBfUkVHKDB4MDAwMDAwNjApKQorI2RlZmluZSBTUElfSU9fTV9PVVRQVVRfRklGT19TSVpFICAgICAoUVNEX1JFRygweDAwMDAwMDBDKSBRVVBfUkVHKDB4MDAwMDAwMUMpKQorI2RlZmluZSBTUElfSU9fTV9PVVRQVVRfQkxPQ0tfU0laRSAgICAoUVNEX1JFRygweDAwMDAwMDAzKSBRVVBfUkVHKDB4MDAwMDAwMDMpKQorCisjZGVmaW5lIElOUFVUX0JMT0NLX1NaX1NISUZUICAgICAgICAgIChRU0RfUkVHKDQpICAgICAgICAgIFFVUF9SRUcoNSkpCisjZGVmaW5lIElOUFVUX0ZJRk9fU1pfU0hJRlQgICAgICAgICAgIChRU0RfUkVHKDYpICAgICAgICAgIFFVUF9SRUcoNykpCisjZGVmaW5lIE9VVFBVVF9CTE9DS19TWl9TSElGVCAgICAgICAgIChRU0RfUkVHKDApICAgICAgICAgIFFVUF9SRUcoMCkpCisjZGVmaW5lIE9VVFBVVF9GSUZPX1NaX1NISUZUICAgICAgICAgIChRU0RfUkVHKDIpICAgICAgICAgIFFVUF9SRUcoMikpCisjZGVmaW5lIE9VVFBVVF9NT0RFX1NISUZUICAgICAgICAgICAgIChRU0RfUkVHKDgpICAgICAgICAgIFFVUF9SRUcoMTApKQorI2RlZmluZSBJTlBVVF9NT0RFX1NISUZUICAgICAgICAgICAgICAoUVNEX1JFRygxMCkgICAgICAgICBRVVBfUkVHKDEyKSkKKworLyogU1BJX09QRVJBVElPTkFMIGZpZWxkcyAqLworI2RlZmluZSBTUElfT1BfSU5fQkxLX1JEX1JFUV9GTEFHICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFNQSV9PUF9PVVRfQkxLX1dSX1JFUV9GTEFHICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgU1BJX09QX01BWF9JTlBVVF9ET05FX0ZMQUcgICAgMHgwMDAwMDgwMAorI2RlZmluZSBTUElfT1BfTUFYX09VVFBVVF9ET05FX0ZMQUcgICAweDAwMDAwNDAwCisjZGVmaW5lIFNQSV9PUF9JTlBVVF9TRVJWSUNFX0ZMQUcgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU1BJX09QX09VVFBVVF9TRVJWSUNFX0ZMQUcgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTUElfT1BfSU5QVVRfRklGT19GVUxMICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNQSV9PUF9PVVRQVVRfRklGT19GVUxMICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU1BJX09QX0lQX0ZJRk9fTk9UX0VNUFRZICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTUElfT1BfT1BfRklGT19OT1RfRU1QVFkgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNQSV9PUF9TVEFURV9WQUxJRCAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU1BJX09QX1NUQVRFICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCisjZGVmaW5lIFNQSV9PUF9TVEFURV9DTEVBUl9CSVRTICAgICAgIDB4MgorCisjZGVmaW5lIFNQSV9QSU5DVFJMX1NUQVRFX0RFRkFVTFQgInNwaV9kZWZhdWx0IgorI2RlZmluZSBTUElfUElOQ1RSTF9TVEFURV9TTEVFUCAic3BpX3NsZWVwIgorCitlbnVtIG1zbV9zcGlfc3RhdGUgeworCVNQSV9PUF9TVEFURV9SRVNFVCA9IDB4MDAwMDAwMDAsCisJU1BJX09QX1NUQVRFX1JVTiAgID0gMHgwMDAwMDAwMSwKKwlTUElfT1BfU1RBVEVfUEFVU0UgPSAweDAwMDAwMDAzLAorfTsKKworLyogU1BJX0VSUk9SX0ZMQUdTIGZpZWxkcyAqLworI2RlZmluZSBTUElfRVJSX09VVFBVVF9PVkVSX1JVTl9FUlIgICAweDAwMDAwMDIwCisjZGVmaW5lIFNQSV9FUlJfSU5QVVRfVU5ERVJfUlVOX0VSUiAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1BJX0VSUl9PVVRQVVRfVU5ERVJfUlVOX0VSUiAgMHgwMDAwMDAwOAorI2RlZmluZSBTUElfRVJSX0lOUFVUX09WRVJfUlVOX0VSUiAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNQSV9FUlJfQ0xLX09WRVJfUlVOX0VSUiAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1BJX0VSUl9DTEtfVU5ERVJfUlVOX0VSUiAgICAgMHgwMDAwMDAwMQorCisvKiBXZSBkb24ndCBhbGxvdyB0cmFuc2FjdGlvbnMgbGFyZ2VyIHRoYW4gNEstNjQgb3IgNjRLLTY0IGR1ZSB0bworICogbXhfaW5wdXQvb3V0cHV0X2NudCByZWdpc3RlciBzaXplCisgKi8KKyNkZWZpbmUgU1BJX01BWF9UUkFOU0ZFUlMgICAgICAgICAgICAgKFFTRF9SRUcoMHhGQzApIFFVUF9SRUcoMHhGQzApKQorI2RlZmluZSBTUElfTUFYX0xFTiAgICAgICAgICAgICAgICAgICAoU1BJX01BWF9UUkFOU0ZFUlMgKiBkZC0+Ynl0ZXNfcGVyX3dvcmQpCisKKyNkZWZpbmUgU1BJX05VTV9DSElQU0VMRUNUUyAgICAgICAgICAgNAorI2RlZmluZSBTUElfU1VQUE9SVEVEX01PREVTICAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIIHwgU1BJX0xPT1ApCisKKy8qIGhpZ2ggc3BlZWQgbW9kZSBpcyB3aGVuIGJ1cyByYXRlIGlzIGdyZWF0ZXIgdGhlbiAyNk1IeiAqLworI2RlZmluZSBTUElfSFNfTUlOX1JBVEUgICAgICAgICAgICAgICAoMjYwMDAwMDApCisKKyNkZWZpbmUgU1BJX0RFTEFZX1RIUkVTSE9MRCAgICAgICAgICAgMQorLyogRGVmYXVsdCB0aW1lb3V0IGlzIDEwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBTUElfREVGQVVMVF9USU1FT1VUICAgICAgICAgICAxMAorLyogMjUwIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBTUElfVFJZTE9DS19ERUxBWSAgICAgICAgICAgICAyNTAKKworLyogRGF0YSBNb3ZlciBidXJzdCBzaXplICovCisjZGVmaW5lIERNX0JVUlNUX1NJWkUgICAgICAgICAgICAgICAgIDE2CisvKiBEYXRhIE1vdmVyIGNvbW1hbmRzIHNob3VsZCBiZSBhbGlnbmVkIHRvIDY0IGJpdCg4IGJ5dGVzKSAqLworI2RlZmluZSBETV9CWVRFX0FMSUdOICAgICAgICAgICAgICAgICA4CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUk02NCkgfHwgZGVmaW5lZChDT05GSUdfTFBBRSkKKyNkZWZpbmUgc3BpX2RtYV9tYXNrKGRldikgICAoZG1hX3NldF9tYXNrKChkZXYpLCBETUFfQklUX01BU0soMzYpKSkKKyNlbHNlCisjZGVmaW5lIHNwaV9kbWFfbWFzayhkZXYpICAgKGRtYV9zZXRfbWFzaygoZGV2KSwgRE1BX0JJVF9NQVNLKDMyKSkpCisjZW5kaWYKKworCitlbnVtIG1zbV9zcGlfcXVwX3ZlcnNpb24geworCVNQSV9RVVBfVkVSU0lPTl9OT05FICAgID0gMHgwLAorCVNQSV9RVVBfVkVSU0lPTl9CRkFNICAgID0gMHgyLAorfTsKKworZW51bSBtc21fc3BpX3BpcGVfZGlyZWN0aW9uIHsKKwlTUElfQkFNX0NPTlNVTUVSX1BJUEUgICA9IDB4MCwKKwlTUElfQkFNX1BST0RVQ0VSX1BJUEUgICA9IDB4MSwKK307CisKKyNkZWZpbmUgU1BJX0JBTV9NQVhfREVTQ19OVU0gICAgICAzMgorI2RlZmluZSBTUElfTUFYX1RSRlJfQlRXTl9SRVNFVFMgICgoNjQgKiAxMDI0KSAtIDE2KSAgLyogNjRLQiAtIDE2Ynl0ZSAqLworCitlbnVtIG1zbV9zcGlfY2xrX3BhdGhfdmVjX2lkeCB7CisJTVNNX1NQSV9DTEtfUEFUSF9TVVNQRU5EX1ZFQyA9IDAsCisJTVNNX1NQSV9DTEtfUEFUSF9SRVNVTUVfVkVDICA9IDEsCit9OworI2RlZmluZSBNU01fU1BJX0NMS19QQVRIX0FWUkdfQlcoZGQpICg3NjgwMDAwMCkKKyNkZWZpbmUgTVNNX1NQSV9DTEtfUEFUSF9CUlNUX0JXKGRkKSAoNzY4MDAwMDApCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qgc3BpX3JzcmNzW10gPSB7CisJInNwaV9jbGsiLAorCSJzcGlfbWlzbyIsCisJInNwaV9tb3NpIgorfTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBzcGlfY3NfcnNyY3NbXSA9IHsKKwkic3BpX2NzIiwKKwkic3BpX2NzMSIsCisJInNwaV9jczIiLAorCSJzcGlfY3MzIiwKK307CisKK2VudW0gbXNtX3NwaV9tb2RlIHsKKwlTUElfRklGT19NT0RFICA9IDB4MCwgIC8qIDAwICovCisJU1BJX0JMT0NLX01PREUgPSAweDEsICAvKiAwMSAqLworCVNQSV9CQU1fTU9ERSAgID0gMHgzLCAgLyogMTEgKi8KKwlTUElfTU9ERV9OT05FICA9IDB4RkYsIC8qIGludmFsaWQgdmFsdWUgKi8KK307CisKKy8qIFN0cnVjdHVyZSBmb3IgU1BJIENTIEdQSU9zICovCitzdHJ1Y3Qgc3BpX2NzX2dwaW8geworCWludCAgZ3Bpb19udW07CisJYm9vbCB2YWxpZDsKK307CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0cnVjdCBtc21fc3BpX2RlYnVnZnNfZGF0YSB7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3QgbXNtX3NwaSAqZGQ7Cit9OworLyogVXNlZCB0byBjcmVhdGUgZGVidWdmcyBlbnRyaWVzICovCitzdGF0aWMgc3RydWN0IG1zbV9zcGlfcmVnc3sKKwljb25zdCBjaGFyICpuYW1lOworCW1vZGVfdCBtb2RlOworCWludCBvZmZzZXQ7Cit9IGRlYnVnZnNfc3BpX3JlZ3NbXSA9IHsKKwl7ImNvbmZpZyIsICAgICAgICAgICAgICAgMDY0NCwgIFNQSV9DT05GSUcgfSwKKwl7ImlvX2NvbnRyb2wiLCAgICAgICAgICAgMDY0NCwgIFNQSV9JT19DT05UUk9MIH0sCisJeyJpb19tb2RlcyIsICAgICAgICAgICAgIDA2NDQsICBTUElfSU9fTU9ERVMgfSwKKwl7InN3X3Jlc2V0IiwgICAgICAgICAgICAgMDIwMCwgIFNQSV9TV19SRVNFVCB9LAorCXsidGltZV9vdXRfY3VycmVudCIsICAgICAwNDQ0LCAgU1BJX1RJTUVfT1VUX0NVUlJFTlQgfSwKKwl7Im14X291dHB1dF9jb3VudCIsICAgICAgMDY0NCwgIFNQSV9NWF9PVVRQVVRfQ09VTlQgfSwKKwl7Im14X291dHB1dF9jbnRfY3VycmVudCIsIDA0NDQsIFNQSV9NWF9PVVRQVVRfQ05UX0NVUlJFTlQgfSwKKwl7Im14X2lucHV0X2NvdW50IiwgICAgICAgMDY0NCwgIFNQSV9NWF9JTlBVVF9DT1VOVCB9LAorCXsibXhfaW5wdXRfY250X2N1cnJlbnQiLCAwNDQ0LCAgU1BJX01YX0lOUFVUX0NOVF9DVVJSRU5UIH0sCisJeyJteF9yZWFkX2NvdW50IiwgICAgICAgIDA2NDQsICBTUElfTVhfUkVBRF9DT1VOVCB9LAorCXsibXhfcmVhZF9jbnRfY3VycmVudCIsICAwNDQ0LCAgU1BJX01YX1JFQURfQ05UX0NVUlJFTlQgfSwKKwl7Im9wZXJhdGlvbmFsIiwgICAgICAgICAgMDY0NCwgIFNQSV9PUEVSQVRJT05BTCB9LAorCXsiZXJyb3JfZmxhZ3MiLCAgICAgICAgICAwNjQ0LCAgU1BJX0VSUk9SX0ZMQUdTIH0sCisJeyJlcnJvcl9mbGFnc19lbiIsICAgICAgIDA2NDQsICBTUElfRVJST1JfRkxBR1NfRU4gfSwKKwl7ImRlYXNzZXJ0X3dhaXQiLCAgICAgICAgMDY0NCwgIFNQSV9ERUFTU0VSVF9XQUlUIH0sCisJeyJvdXRwdXRfZGVidWciLCAgICAgICAgIDA0NDQsICBTUElfT1VUUFVUX0RFQlVHIH0sCisJeyJpbnB1dF9kZWJ1ZyIsICAgICAgICAgIDA0NDQsICBTUElfSU5QVVRfREVCVUcgfSwKKwl7InRlc3RfY3RybCIsICAgICAgICAgICAgMDY0NCwgIFNQSV9URVNUX0NUUkwgfSwKKwl7Im91dHB1dF9maWZvIiwgICAgICAgICAgMDIwMCwgIFNQSV9PVVRQVVRfRklGTyB9LAorCXsiaW5wdXRfZmlmbyIsICAgICAgICAgICAwNDAwLCAgU1BJX0lOUFVUX0ZJRk8gfSwKKwl7InNwaV9zdGF0ZSIsICAgICAgICAgICAgMDY0NCwgIFNQSV9TVEFURSB9LAorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0QpIHx8IElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0RfTU9EVUxFKQorCXsiZmlmb193b3JkX2NudCIsICAgICAgICAwNDQ0LCAgU1BJX0ZJRk9fV09SRF9DTlR9LAorI2Vsc2UKKwl7InF1cF9jb25maWciLCAgICAgICAgICAgMDY0NCwgIFFVUF9DT05GSUd9LAorCXsicXVwX2Vycm9yX2ZsYWdzIiwgICAgICAwNjQ0LCAgUVVQX0VSUk9SX0ZMQUdTfSwKKwl7InF1cF9lcnJvcl9mbGFnc19lbiIsICAgMDY0NCwgIFFVUF9FUlJPUl9GTEFHU19FTn0sCisJeyJteF93cml0ZV9jbnQiLCAgICAgICAgIDA2NDQsICBRVVBfTVhfV1JJVEVfQ09VTlR9LAorCXsibXhfd3JpdGVfY250X2N1cnJlbnQiLCAwNDQ0LCAgUVVQX01YX1dSSVRFX0NOVF9DVVJSRU5UfSwKKwl7Im91dHB1dF9maWZvX3dvcmRfY250IiwgMDQ0NCwgIFNQSV9PVVRQVVRfRklGT19XT1JEX0NOVH0sCisJeyJpbnB1dF9maWZvX3dvcmRfY250IiwgIDA0NDQsICBTUElfSU5QVVRfRklGT19XT1JEX0NOVH0sCisjZW5kaWYKK307CisjZW5kaWYKKworc3RydWN0IG1zbV9zcGlfYmFtX3BpcGUgeworCWNvbnN0IGNoYXIgICAgICAgICAgICAgICpuYW1lOworCXN0cnVjdCBzcHNfcGlwZSAgICAgICAgICpoYW5kbGU7CisJc3RydWN0IHNwc19jb25uZWN0ICAgICAgIGNvbmZpZzsKKwlib29sICAgICAgICAgICAgICAgICAgICAgdGVhcmRvd25fcmVxdWlyZWQ7Cit9OworCitzdHJ1Y3QgbXNtX3NwaV9iYW0geworCXZvaWQgX19pb21lbSAgICAgICAgICAgICpiYXNlOworCXBoeXNfYWRkcl90ICAgICAgICAgICAgICBwaHlzX2FkZHI7CisJdWludHB0cl90ICAgICAgICAgICAgICAgIGhhbmRsZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgaXJxOworCXN0cnVjdCBtc21fc3BpX2JhbV9waXBlICBwcm9kOworCXN0cnVjdCBtc21fc3BpX2JhbV9waXBlICBjb25zOworCWJvb2wgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyX3JlcXVpcmVkOworCXUzMgkJCSBjdXJyX3J4X2J5dGVzX3JlY3ZkOworCXUzMgkJCSBjdXJyX3R4X2J5dGVzX3NlbnQ7CisJdTMyCQkJIGJhbV9yeF9sZW47CisJdTMyCQkJIGJhbV90eF9sZW47Cit9OworCitzdHJ1Y3QgbXNtX3NwaSB7CisJdTggICAgICAgICAgICAgICAgICAgICAgKnJlYWRfYnVmOworCWNvbnN0IHU4ICAgICAgICAgICAgICAgICp3cml0ZV9idWY7CisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgKmJhc2U7CisJc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgcXVldWVfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgY29yZV9sb2NrOworCXN0cnVjdCBzcGlfZGV2aWNlICAgICAgICpzcGk7CisJc3RydWN0IHNwaV90cmFuc2ZlciAgICAgKmN1cl90cmFuc2ZlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgdHhfdHJhbnNmZXJfY29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24gICAgICAgIHJ4X3RyYW5zZmVyX2NvbXBsZXRlOworCXN0cnVjdCBjbGsgICAgICAgICAgICAgICpjbGs7ICAgIC8qIGNvcmUgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAqcGNsazsgICAvKiBpbnRlcmZhY2UgY2xvY2sgKi8KKwlzdHJ1Y3QgbXNtX2J1c19jbGllbnRfaGFuZGxlICpidXNfY2xfaGRsOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICBtZW1fcGh5c19hZGRyOworCXNpemVfdCAgICAgICAgICAgICAgICAgICBtZW1fc2l6ZTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZmlmb19zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmlmb19zaXplOworCXUzMiAgICAgICAgICAgICAgICAgICAgICByeF9ieXRlc19yZW1haW5pbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICAgIHR4X2J5dGVzX3JlbWFpbmluZzsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfc3BlZWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIGlycV9pbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcmVhZF94ZnJfY250OworCWludCAgICAgICAgICAgICAgICAgICAgICB3cml0ZV94ZnJfY250OworCWludCAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9sZW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGVuOworI2lmIElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0QpIHx8IElTX0VOQUJMRUQoQ09ORklHX1NQSV9RU0RfTU9EVUxFKQorCWludCAgICAgICAgICAgICAgICAgICAgICBpcnFfb3V0OworCWludCAgICAgICAgICAgICAgICAgICAgICBpcnFfZXJyOworI2VuZGlmCisJaW50ICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl93b3JkOworCWJvb2wgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3BlbmRpbmc7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICAgIGNvbnRpbnVlX3N1c3BlbmQ7CisJLyogRE1BIGRhdGEgKi8KKwllbnVtIG1zbV9zcGlfbW9kZSAgICAgICAgdHhfbW9kZTsKKwllbnVtIG1zbV9zcGlfbW9kZSAgICAgICAgcnhfbW9kZTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgdXNlX2RtYTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgdHhfZG1hX2NoYW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHR4X2RtYV9jcmNpOworCWludCAgICAgICAgICAgICAgICAgICAgICByeF9kbWFfY2hhbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgcnhfZG1hX2NyY2k7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICgqZG1hX2luaXQpKHN0cnVjdCBtc21fc3BpICpkZCk7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgICgqZG1hX3RlYXJkb3duKShzdHJ1Y3QgbXNtX3NwaSAqZGQpOworCXN0cnVjdCBtc21fc3BpX2JhbSAgICAgICBiYW07CisJaW50ICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2Jsb2NrX3NpemU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9ibG9ja19zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9idXJzdF9zaXplOworCWludCAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnVyc3Rfc2l6ZTsKKwlhdG9taWNfdCAgICAgICAgICAgICAgICAgcnhfaXJxX2NhbGxlZDsKKwlhdG9taWNfdCAgICAgICAgICAgICAgICAgdHhfaXJxX2NhbGxlZDsKKwkvKiBVc2VkIHRvIHBhZCBtZXNzYWdlcyB1bmFsaWduZWQgdG8gYmxvY2sgc2l6ZSAqLworCXU4ICAgICAgICAgICAgICAgICAgICAgICAqdHhfcGFkZGluZzsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgICAgdHhfcGFkZGluZ19kbWE7CisJdTggICAgICAgICAgICAgICAgICAgICAgICpyeF9wYWRkaW5nOworCWRtYV9hZGRyX3QgICAgICAgICAgICAgICByeF9wYWRkaW5nX2RtYTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgdHhfdW5hbGlnbmVkX2xlbjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgcnhfdW5hbGlnbmVkX2xlbjsKKwkvKiBETUEgc3RhdGlzdGljcyAqLworCWludCAgICAgICAgICAgICAgICAgICAgICBzdGF0X3J4OworCWludCAgICAgICAgICAgICAgICAgICAgICBzdGF0X3R4OworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXN0cnVjdCBkZW50cnkgKmRlbnRfc3BpOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfc3BpX3JlZ3NbQVJSQVlfU0laRShkZWJ1Z2ZzX3NwaV9yZWdzKV07CisJc3RydWN0IG1zbV9zcGlfZGVidWdmc19kYXRhIHJlZ19kYXRhW0FSUkFZX1NJWkUoZGVidWdmc19zcGlfcmVncyldOworI2VuZGlmCisJc3RydWN0IG1zbV9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7IC8qIFBsYXRmb3JtIGRhdGEgKi8KKwkvKiBXaGVuIHNldCBpbmRpY2F0ZXMgbXVsdGlwbGUgdHJhbnNmZXJzIGluIGEgc2luZ2xlIG1lc3NhZ2UgKi8KKwlib29sICAgICAgICAgICAgICAgICAgICAgcnhfZG9uZTsKKwlib29sICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgY3VyX21zZ19sZW47CisJLyogVXNlZCBpbiBGSUZPIG1vZGUgdG8ga2VlcCB0cmFjayBvZiB0aGUgdHJhbnNmZXIgYmVpbmcgcHJvY2Vzc2VkICovCisJc3RydWN0IHNwaV90cmFuc2ZlciAgICAgKmN1cl90eF90cmFuc2ZlcjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICAgICAqY3VyX3J4X3RyYW5zZmVyOworCS8qIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgV1ItV1Igb3IgV1ItUkQgdHJhbnNmZXJzICovCisJdTggICAgICAgICAgICAgICAgICAgICAgKnRlbXBfYnVmOworCS8qIEdQSU8gcGluIG51bWJlcnMgZm9yIFNQSSBjbGssIG1pc28gYW5kIG1vc2kgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgc3BpX2dwaW9zW0FSUkFZX1NJWkUoc3BpX3JzcmNzKV07CisJLyogU1BJIENTIEdQSU9zIGZvciBlYWNoIHNsYXZlICovCisJc3RydWN0IHNwaV9jc19ncGlvICAgICAgIGNzX2dwaW9zW0FSUkFZX1NJWkUoc3BpX2NzX3JzcmNzKV07CisJZW51bSBtc21fc3BpX3F1cF92ZXJzaW9uIHF1cF92ZXI7CisJaW50CQkJIG1heF90cmZyX2xlbjsKKwl1MTYJCQkgeGZyc19kZWxheV91c2VjOworCXN0cnVjdCBwaW5jdHJsCQkqcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZQkqcGluc19hY3RpdmU7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUJKnBpbnNfc2xlZXA7CisJYm9vbAkJCWlzX2luaXRfY29tcGxldGU7CisJYm9vbAkJCXBhY2tfd29yZHM7Cit9OworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3NwaV9pbnB1dF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtc21fc3BpX291dHB1dF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtc21fc3BpX2Vycm9yX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9zZXRfc3RhdGUoc3RydWN0IG1zbV9zcGkgKmRkLAorCQkJCSAgICBlbnVtIG1zbV9zcGlfc3RhdGUgc3RhdGUpOworc3RhdGljIHZvaWQgbXNtX3NwaV93cml0ZV93b3JkX3RvX2ZpZm8oc3RydWN0IG1zbV9zcGkgKmRkKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX3dyaXRlX3Jtbl90b19maWZvKHN0cnVjdCBtc21fc3BpICpkZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX3NwaV9xdXBfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TUElfUVNEKSB8fCBJU19FTkFCTEVEKENPTkZJR19TUElfUVNEX01PRFVMRSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2Rpc2FibGVfaXJxcyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJZGlzYWJsZV9pcnEoZGQtPmlycV9pbik7CisJZGlzYWJsZV9pcnEoZGQtPmlycV9vdXQpOworCWRpc2FibGVfaXJxKGRkLT5pcnFfZXJyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfZW5hYmxlX2lycXMoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWVuYWJsZV9pcnEoZGQtPmlycV9pbik7CisJZW5hYmxlX2lycShkZC0+aXJxX291dCk7CisJZW5hYmxlX2lycShkZC0+aXJxX2Vycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9zcGlfcmVxdWVzdF9pcnEoc3RydWN0IG1zbV9zcGkgKmRkLAorCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlpbnQgcmM7CisKKwlkZC0+aXJxX2luICA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJZGQtPmlycV9vdXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWRkLT5pcnFfZXJyID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAyKTsKKwlpZiAoKGRkLT5pcnFfaW4gPCAwKSB8fCAoZGQtPmlycV9vdXQgPCAwKSB8fCAoZGQtPmlycV9lcnIgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoZGQtPmRldiwgZGQtPmlycV9pbiwgbXNtX3NwaV9pbnB1dF9pcnEsCisJCUlSUUZfVFJJR0dFUl9SSVNJTkcsIHBkZXYtPm5hbWUsIGRkKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3JfaXJxOworCisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRkLT5kZXYsIGRkLT5pcnFfb3V0LCBtc21fc3BpX291dHB1dF9pcnEsCisJCUlSUUZfVFJJR0dFUl9SSVNJTkcsIHBkZXYtPm5hbWUsIGRkKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3JfaXJxOworCisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRkLT5kZXYsIGRkLT5pcnFfZXJyLCBtc21fc3BpX2Vycm9yX2lycSwKKwkJSVJRRl9UUklHR0VSX1JJU0lORywgcGRldi0+bmFtZSwgbWFzdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3JfaXJxOworCitlcnJvcl9pcnE6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9nZXRfY2xrX2VycihzdHJ1Y3QgbXNtX3NwaSAqZGQsIHUzMiAqc3BpX2Vycikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2Fja19jbGtfZXJyKHN0cnVjdCBtc21fc3BpICpkZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX3NldF9xdXBfY29uZmlnKHN0cnVjdCBtc21fc3BpICpkZCwgaW50IGJwdykge30KKworc3RhdGljIGlubGluZSBpbnQgIG1zbV9zcGlfcHJlcGFyZV9mb3Jfd3JpdGUoc3RydWN0IG1zbV9zcGkgKmRkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9zdGFydF93cml0ZShzdHJ1Y3QgbXNtX3NwaSAqZGQsIHUzMiByZWFkX2NvdW50KQoreworCW1zbV9zcGlfd3JpdGVfd29yZF90b19maWZvKGRkKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX3NldF93cml0ZV9jb3VudChzdHJ1Y3QgbXNtX3NwaSAqZGQsIGludCB2YWwpIHt9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2NvbXBsZXRlKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwljb21wbGV0ZSgmZGQtPnRyYW5zZmVyX2NvbXBsZXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfZW5hYmxlX2Vycm9yX2ZsYWdzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl3cml0ZWxfcmVsYXhlZCgweDAwMDAwMDdCLCBkZC0+YmFzZSArIFNQSV9FUlJPUl9GTEFHU19FTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2NsZWFyX2Vycm9yX2ZsYWdzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwl3cml0ZWxfcmVsYXhlZCgweDAwMDAwMDdGLCBkZC0+YmFzZSArIFNQSV9FUlJPUl9GTEFHUyk7Cit9CisKKyNlbHNlCisvKiBJbiBRVVAgdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUgaXMgdXNlZCBmb3IgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3IqLworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9yZXF1ZXN0X2lycShzdHJ1Y3QgbXNtX3NwaSAqZGQsCisJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCWRkLT5pcnFfaW4gID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoZGQtPmlycV9pbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGRldm1fcmVxdWVzdF9pcnEoZGQtPmRldiwgZGQtPmlycV9pbiwgbXNtX3NwaV9xdXBfaXJxLAorCQlJUlFGX1RSSUdHRVJfSElHSCwgcGRldi0+bmFtZSwgZGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9kaXNhYmxlX2lycXMoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWRpc2FibGVfaXJxKGRkLT5pcnFfaW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNtX3NwaV9lbmFibGVfaXJxcyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJZW5hYmxlX2lycShkZC0+aXJxX2luKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfZ2V0X2Nsa19lcnIoc3RydWN0IG1zbV9zcGkgKmRkLCB1MzIgKnNwaV9lcnIpCit7CisJKnNwaV9lcnIgPSByZWFkbF9yZWxheGVkKGRkLT5iYXNlICsgUVVQX0VSUk9SX0ZMQUdTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfYWNrX2Nsa19lcnIoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCXdyaXRlbF9yZWxheGVkKFFVUF9FUlJfTUFTSywgZGQtPmJhc2UgKyBRVVBfRVJST1JfRkxBR1MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK21zbV9zcGlfc2V0X2Jwd19hbmRfbm9faW9fZmxhZ3Moc3RydWN0IG1zbV9zcGkgKmRkLCB1MzIgKmNvbmZpZywgaW50IG4pOworCisvKioKKyAqIG1zbV9zcGlfc2V0X3F1cF9jb25maWc6IHNldCBRVVBfQ09ORklHIHRvIG5vX2lucHV0LCBub19vdXRwdXQsIGFuZCBOIGJpdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfc2V0X3F1cF9jb25maWcoc3RydWN0IG1zbV9zcGkgKmRkLCBpbnQgYnB3KQoreworCXUzMiBxdXBfY29uZmlnID0gcmVhZGxfcmVsYXhlZChkZC0+YmFzZSArIFFVUF9DT05GSUcpOworCisJbXNtX3NwaV9zZXRfYnB3X2FuZF9ub19pb19mbGFncyhkZCwgJnF1cF9jb25maWcsIGJwdy0xKTsKKwl3cml0ZWxfcmVsYXhlZChxdXBfY29uZmlnIHwgUVVQX0NPTkZJR19TUElfTU9ERSwgZGQtPmJhc2UgKyBRVVBfQ09ORklHKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNtX3NwaV9wcmVwYXJlX2Zvcl93cml0ZShzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJaWYgKG1zbV9zcGlfc2V0X3N0YXRlKGRkLCBTUElfT1BfU1RBVEVfUlVOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1zbV9zcGlfc2V0X3N0YXRlKGRkLCBTUElfT1BfU1RBVEVfUEFVU0UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfc3RhcnRfd3JpdGUoc3RydWN0IG1zbV9zcGkgKmRkLCB1MzIgcmVhZF9jb3VudCkKK3sKKwltc21fc3BpX3dyaXRlX3Jtbl90b19maWZvKGRkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfc2V0X3dyaXRlX2NvdW50KHN0cnVjdCBtc21fc3BpICpkZCwgaW50IHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGRkLT5iYXNlICsgUVVQX01YX1dSSVRFX0NPVU5UKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zbV9zcGlfY29tcGxldGUoc3RydWN0IG1zbV9zcGkgKmRkKQoreworCWRkLT50eF9kb25lID0gdHJ1ZTsKKwlkZC0+cnhfZG9uZSA9IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2VuYWJsZV9lcnJvcl9mbGFncyhzdHJ1Y3QgbXNtX3NwaSAqZGQpCit7CisJaWYgKGRkLT5xdXBfdmVyID09IFNQSV9RVVBfVkVSU0lPTl9CRkFNKQorCQl3cml0ZWxfcmVsYXhlZCgKKwkJCVNQSV9FUlJfQ0xLX1VOREVSX1JVTl9FUlIgfCBTUElfRVJSX0NMS19PVkVSX1JVTl9FUlIsCisJCQlkZC0+YmFzZSArIFNQSV9FUlJPUl9GTEFHU19FTik7CisJZWxzZQorCQl3cml0ZWxfcmVsYXhlZCgweDAwMDAwMDc4LCBkZC0+YmFzZSArIFNQSV9FUlJPUl9GTEFHU19FTik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21fc3BpX2NsZWFyX2Vycm9yX2ZsYWdzKHN0cnVjdCBtc21fc3BpICpkZCkKK3sKKwlpZiAoZGQtPnF1cF92ZXIgPT0gU1BJX1FVUF9WRVJTSU9OX0JGQU0pCisJCXdyaXRlbF9yZWxheGVkKAorCQkJU1BJX0VSUl9DTEtfVU5ERVJfUlVOX0VSUiB8IFNQSV9FUlJfQ0xLX09WRVJfUlVOX0VSUiwKKwkJCWRkLT5iYXNlICsgU1BJX0VSUk9SX0ZMQUdTKTsKKwllbHNlCisJCXdyaXRlbF9yZWxheGVkKDB4MDAwMDAwN0MsIGRkLT5iYXNlICsgU1BJX0VSUk9SX0ZMQUdTKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMgYi9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jCmluZGV4IDdkOWEyZTguLmIyOWU2MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKKysrIGIvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYwpAQCAtNTksNiArNTksOCBAQAogI2RlZmluZSBTUE1JX09XTkVSU0hJUF9UQUJMRV9SRUcoTikJKDB4MDcwMCArICg0ICogKE4pKSkKICNkZWZpbmUgU1BNSV9PV05FUlNISVBfUEVSSVBIMk9XTkVSKFgpCSgoWCkgJiAweDcpCiAKKyNkZWZpbmUgU1BNSV9QUk9UT0NPTF9JUlFfU1RBVFVTCTB4NjAwMAorCiAvKiBDaGFubmVsIFN0YXR1cyBmaWVsZHMgKi8KIGVudW0gcG1pY19hcmJfY2hubF9zdGF0dXMgewogCVBNSUNfQVJCX1NUQVRVU19ET05FCT0gQklUKDApLApAQCAtMTQ4LDYgKzE1MCw4IEBACiAgKiBAdmVyX29wczoJCXZlcnNpb24gZGVwZW5kZW50IG9wZXJhdGlvbnMuCiAgKiBAcHBpZF90b19hcGlkCWluLW1lbW9yeSBjb3B5IG9mIFBQSUQgLT4gY2hhbm5lbCAoQVBJRCkgbWFwcGluZyB0YWJsZS4KICAqCQkJdjIgb25seS4KKyAqIEBhaGJfYnVzX3dhOgkJVXNlIEFIQiBidXMgd29ya2Fyb3VuZCB0byBhdm9pZCB3cml0ZSB0cmFuc2FjdGlvbgorICoJCQljb3JydXB0aW9uIG9uIHNvbWUgUE1JQyBhcmJpdGVyIHY1IHBsYXRmb3Jtcy4KICAqLwogc3RydWN0IHNwbWlfcG1pY19hcmIgewogCXZvaWQgX19pb21lbQkJKnJkX2Jhc2U7CkBAIC0xNzIsNiArMTc2LDcgQEAKIAl1MTYJCQkqcHBpZF90b19hcGlkOwogCXUxNgkJCWxhc3RfYXBpZDsKIAlzdHJ1Y3QgYXBpZF9kYXRhCWFwaWRfZGF0YVtQTUlDX0FSQl9NQVhfUEVSSVBIU107CisJYm9vbAkJCWFoYl9idXNfd2E7CiB9OwogCiAvKioKQEAgLTIxNyw2ICsyMjIsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWljX2FyYl9iYXNlX3dyaXRlKHN0cnVjdCBzcG1pX3BtaWNfYXJiICpwYSwKIAkJCQkgICAgICAgdTMyIG9mZnNldCwgdTMyIHZhbCkKIHsKKwlpZiAocGEtPmFoYl9idXNfd2EpIHsKKwkJLyogQUhCIGJ1cyByZWdpc3RlciBkdW1teSByZWFkIGZvciB3b3JrYXJvdW5kLiAqLworCQlyZWFkbF9yZWxheGVkKHBhLT5jbmZnICsgU1BNSV9QUk9UT0NPTF9JUlFfU1RBVFVTKTsKKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgdGhlIHJlYWQgY29tcGxldGVzIGJlZm9yZSBpbml0aWF0aW5nIHRoZQorCQkgKiBzdWJzZXF1ZW50IHJlZ2lzdGVyIHdyaXRlLgorCQkgKi8KKwkJbWIoKTsKKwl9CisKIAl3cml0ZWxfcmVsYXhlZCh2YWwsIHBhLT53cl9iYXNlICsgb2Zmc2V0KTsKIH0KIApAQCAtMTM0Myw2ICsxMzU4LDkgQEAKIAogCXBhLT5lZSA9IGVlOwogCisJcGEtPmFoYl9idXNfd2EgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJxY29tLGVuYWJsZS1haGItYnVzLXdvcmthcm91bmQiKTsKKwogCXBhLT5tYXBwaW5nX3RhYmxlID0gZGV2bV9rY2FsbG9jKCZjdHJsLT5kZXYsIFBNSUNfQVJCX01BWF9QRVJJUEhTIC0gMSwKIAkJCQkJc2l6ZW9mKCpwYS0+bWFwcGluZ190YWJsZSksIEdGUF9LRVJORUwpOwogCWlmICghcGEtPm1hcHBpbmdfdGFibGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2ZpcV9kZWJ1Z2dlci9maXFfZGVidWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2ZpcV9kZWJ1Z2dlci9maXFfZGVidWdnZXIuYwppbmRleCBjZTlkYzdlLi4xOTI2NjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9maXFfZGVidWdnZXIvZmlxX2RlYnVnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvZmlxX2RlYnVnZ2VyL2ZpcV9kZWJ1Z2dlci5jCkBAIC00MDEsNyArNDAxLDcgQEAKIAkJY21kICs9IDY7CiAJCXdoaWxlICgqY21kID09ICcgJykKIAkJCWNtZCsrOwotCQlpZiAoKGNtZCAhPSAnXDAnKSAmJiBzeXNycV9vbigpKQorCQlpZiAoKCpjbWQgIT0gJ1wwJykgJiYgc3lzcnFfb24oKSkKIAkJCWtlcm5lbF9yZXN0YXJ0KGNtZCk7CiAJCWVsc2UKIAkJCWtlcm5lbF9yZXN0YXJ0KE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi1pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi1pb2N0bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc0MzFkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24taW9jdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSAiaW9uLmgiCi0jaW5jbHVkZSAiaW9uX3ByaXYuaCIKLSNpbmNsdWRlICJjb21wYXRfaW9uLmgiCi0KLXVuaW9uIGlvbl9pb2N0bF9hcmcgewotCXN0cnVjdCBpb25fZmRfZGF0YSBmZDsKLQlzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSBhbGxvY2F0aW9uOwotCXN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlOwotCXN0cnVjdCBpb25fY3VzdG9tX2RhdGEgY3VzdG9tOwotCXN0cnVjdCBpb25faGVhcF9xdWVyeSBxdWVyeTsKLX07Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfaW9jdGxfYXJnKHVuc2lnbmVkIGludCBjbWQsIHVuaW9uIGlvbl9pb2N0bF9hcmcgKmFyZykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBJT05fSU9DX0hFQVBfUVVFUlk6Ci0JCXJldCA9IGFyZy0+cXVlcnkucmVzZXJ2ZWQwICE9IDA7Ci0JCXJldCB8PSBhcmctPnF1ZXJ5LnJlc2VydmVkMSAhPSAwOwotCQlyZXQgfD0gYXJnLT5xdWVyeS5yZXNlcnZlZDIgIT0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldCA/IC1FSU5WQUwgOiAwOwotfQotCi0vKiBmaXggdXAgdGhlIGNhc2VzIHdoZXJlIHRoZSBpb2N0bCBkaXJlY3Rpb24gYml0cyBhcmUgaW5jb3JyZWN0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlvbl9pb2N0bF9kaXIodW5zaWduZWQgaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSU9OX0lPQ19TWU5DOgotCWNhc2UgSU9OX0lPQ19GUkVFOgotCWNhc2UgSU9OX0lPQ19DVVNUT006Ci0JCXJldHVybiBfSU9DX1dSSVRFOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBfSU9DX0RJUihjbWQpOwotCX0KLX0KLQotbG9uZyBpb25faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlvbl9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2OwotCXN0cnVjdCBpb25faGFuZGxlICpjbGVhbnVwX2hhbmRsZSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IGRpcjsKLQl1bmlvbiBpb25faW9jdGxfYXJnIGRhdGE7Ci0KLQlkaXIgPSBpb25faW9jdGxfZGlyKGNtZCk7Ci0KLQlpZiAoX0lPQ19TSVpFKGNtZCkgPiBzaXplb2YoZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyoKLQkgKiBUaGUgY29weV9mcm9tX3VzZXIgaXMgdW5jb25kaXRpb25hbCBoZXJlIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlCi0JICogdG8gZG8gdGhlIHZhbGlkYXRlLiBJZiB0aGVyZSBpcyBubyB3cml0ZSBmb3IgdGhlIGlvY3RsLCB0aGUKLQkgKiBidWZmZXIgaXMgY2xlYXJlZAotCSAqLwotCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0ID0gdmFsaWRhdGVfaW9jdGxfYXJnKGNtZCwgJmRhdGEpOwotCWlmIChXQVJOX09OX09OQ0UocmV0KSkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghKGRpciAmIF9JT0NfV1JJVEUpKQotCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSU9OX0lPQ19BTExPQzoKLQl7Ci0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0KLQkJaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgZGF0YS5hbGxvY2F0aW9uLmxlbiwKLQkJCQkJCWRhdGEuYWxsb2NhdGlvbi5hbGlnbiwKLQkJCQkJCWRhdGEuYWxsb2NhdGlvbi5oZWFwX2lkX21hc2ssCi0JCQkJCQlkYXRhLmFsbG9jYXRpb24uZmxhZ3MpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpCi0JCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwotCi0JCWRhdGEuYWxsb2NhdGlvbi5oYW5kbGUgPSBoYW5kbGUtPmlkOwotCi0JCWNsZWFudXBfaGFuZGxlID0gaGFuZGxlOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJT05fSU9DX0ZSRUU6Ci0JewotCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCi0JCW11dGV4X2xvY2soJmNsaWVudC0+bG9jayk7Ci0JCWhhbmRsZSA9IGlvbl9oYW5kbGVfZ2V0X2J5X2lkX25vbG9jayhjbGllbnQsIGRhdGEuaGFuZGxlLmhhbmRsZSk7Ci0JCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKLQkJfQotCQlpb25fZnJlZV9ub2xvY2soY2xpZW50LCBoYW5kbGUpOwotCQlpb25faGFuZGxlX3B1dF9ub2xvY2soaGFuZGxlKTsKLQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJT05fSU9DX1NIQVJFOgotCWNhc2UgSU9OX0lPQ19NQVA6Ci0JewotCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCi0JCWhhbmRsZSA9IGlvbl9oYW5kbGVfZ2V0X2J5X2lkKGNsaWVudCwgZGF0YS5oYW5kbGUuaGFuZGxlKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKQotCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKLQkJZGF0YS5mZC5mZCA9IGlvbl9zaGFyZV9kbWFfYnVmX2ZkKGNsaWVudCwgaGFuZGxlKTsKLQkJaW9uX2hhbmRsZV9wdXQoaGFuZGxlKTsKLQkJaWYgKGRhdGEuZmQuZmQgPCAwKQotCQkJcmV0ID0gZGF0YS5mZC5mZDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19JTVBPUlQ6Ci0JewotCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCi0JCWhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1Zl9mZChjbGllbnQsIGRhdGEuZmQuZmQpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpCi0JCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCWVsc2UKLQkJCWRhdGEuaGFuZGxlLmhhbmRsZSA9IGhhbmRsZS0+aWQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPTl9JT0NfU1lOQzoKLQl7Ci0JCXJldCA9IGlvbl9zeW5jX2Zvcl9kZXZpY2UoY2xpZW50LCBkYXRhLmZkLmZkKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19DVVNUT006Ci0JewotCQlpZiAoIWRldi0+Y3VzdG9tX2lvY3RsKQotCQkJcmV0dXJuIC1FTk9UVFk7Ci0JCXJldCA9IGRldi0+Y3VzdG9tX2lvY3RsKGNsaWVudCwgZGF0YS5jdXN0b20uY21kLAotCQkJCQkJZGF0YS5jdXN0b20uYXJnKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19IRUFQX1FVRVJZOgotCQlyZXQgPSBpb25fcXVlcnlfaGVhcHMoY2xpZW50LCAmZGF0YS5xdWVyeSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFRZOwotCX0KLQotCWlmIChkaXIgJiBfSU9DX1JFQUQpIHsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZkYXRhLCBfSU9DX1NJWkUoY21kKSkpIHsKLQkJCWlmIChjbGVhbnVwX2hhbmRsZSkKLQkJCQlpb25fZnJlZShjbGllbnQsIGNsZWFudXBfaGFuZGxlKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKaW5kZXggOWY0N2ZiMy4uMDk0OGMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwpAQCAtNzA3LDcgKzcwNyw3IEBACiAJCVdBUk4oMSwgIiVzOiBpbnZhbGlkIGhhbmRsZSBwYXNzZWQgdG8gZnJlZS5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoIWhhbmRsZS0+dXNlcl9yZWZfY291bnQgPiAwKSB7CisJaWYgKGhhbmRsZS0+dXNlcl9yZWZfY291bnQgPT0gMCkgewogCQlXQVJOKDEsICIlczogVXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKaW5kZXggNjE2Mzc1YS4uOGQ2N2Y3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtcHJlc3N1cmUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9hbG1rLmg+CkBAIC0xMTYsNiArMTE3LDEwIEBACiBzdGF0aWMgaW50IHZtcHJlc3N1cmVfZmlsZV9taW47CiBtb2R1bGVfcGFyYW1fbmFtZWQodm1wcmVzc3VyZV9maWxlX21pbiwgdm1wcmVzc3VyZV9maWxlX21pbiwgaW50LCAwNjQ0KTsKIAorLyogVXNlciBrbm9iIHRvIGVuYWJsZS9kaXNhYmxlIG9vbSByZWFwaW5nIGZlYXR1cmUgKi8KK3N0YXRpYyBpbnQgb29tX3JlYXBlcjsKK21vZHVsZV9wYXJhbV9uYW1lZChvb21fcmVhcGVyLCBvb21fcmVhcGVyLCBpbnQsIDA2NDQpOworCiBlbnVtIHsKIAlWTVBSRVNTVVJFX05PX0FESlVTVCA9IDAsCiAJVk1QUkVTU1VSRV9BREpVU1RfRU5DUk9BQ0gsCkBAIC00MDYsNiArNDExLDE0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBtYXJrX2xta192aWN0aW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOworCisJaWYgKCFjbXB4Y2hnKCZ0c2stPnNpZ25hbC0+b29tX21tLCBOVUxMLCBtbSkpCisJCWF0b21pY19pbmMoJnRzay0+c2lnbmFsLT5vb21fbW0tPm1tX2NvdW50KTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG93bWVtX3NjYW4oc3RydWN0IHNocmlua2VyICpzLCBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwpAQCAtNTI0LDcgKzUzNywxMSBAQAogCQlzZW5kX3NpZyhTSUdLSUxMLCBzZWxlY3RlZCwgMCk7CiAJCWlmIChzZWxlY3RlZC0+bW0pCiAJCQl0YXNrX3NldF9sbWtfd2FpdGluZyhzZWxlY3RlZCk7CisJCWlmIChvb21fcmVhcGVyKQorCQkJbWFya19sbWtfdmljdGltKHNlbGVjdGVkKTsKIAkJdGFza191bmxvY2soc2VsZWN0ZWQpOworCQlpZiAob29tX3JlYXBlcikKKwkJCXdha2Vfb29tX3JlYXBlcihzZWxlY3RlZCk7CiAJCXRyYWNlX2xvd21lbW9yeV9raWxsKHNlbGVjdGVkLCBjYWNoZV9zaXplLCBjYWNoZV9saW1pdCwgZnJlZSk7CiAJCWxvd21lbV9wcmludCgxLCAiS2lsbGluZyAnJXMnICglZCkgKHRnaWQgJWQpLCBhZGogJWhkLFxuIgogCQkJInRvIGZyZWUgJWxka0Igb24gYmVoYWxmIG9mICclcycgKCVkKSBiZWNhdXNlXG4iCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKaW5kZXggYTM0ZmQ1YS4uNzQ1OGRmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMjM4NSw2ICsyMzg1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJd3AgPSBhc3luYy0+YnVmX3dyaXRlX3B0cjsKIAkJbjEgPSBtaW4obiwgYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gd3ApOwogCQluMiA9IG4gLSBuMTsKQEAgLTI1MTcsNiArMjUxOCw4IEBACiAJCQl9CiAJCQljb250aW51ZTsKIAkJfQorCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCXJwID0gYXN5bmMtPmJ1Zl9yZWFkX3B0cjsKIAkJbjEgPSBtaW4obiwgYXN5bmMtPnByZWFsbG9jX2J1ZnN6IC0gcnApOwogCQluMiA9IG4gLSBuMTsKQEAgLTI4OTgsOSArMjkwMSw2IEBACiAKIAljb21lZGlfY2xhc3MtPmRldl9ncm91cHMgPSBjb21lZGlfZGV2X2dyb3VwczsKIAotCS8qIFhYWCByZXF1aXJlcyAvcHJvYyBpbnRlcmZhY2UgKi8KLQljb21lZGlfcHJvY19pbml0KCk7Ci0KIAkvKiBjcmVhdGUgZGV2aWNlcyBmaWxlcyBmb3IgbGVnYWN5L21hbnVhbCB1c2UgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY29tZWRpX251bV9sZWdhY3lfbWlub3JzOyBpKyspIHsKIAkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldjsKQEAgLTI5MTgsNiArMjkxOCw5IEBACiAJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAJfQogCisJLyogWFhYIHJlcXVpcmVzIC9wcm9jIGludGVyZmFjZSAqLworCWNvbWVkaV9wcm9jX2luaXQoKTsKKwogCXJldHVybiAwOwogfQogbW9kdWxlX2luaXQoY29tZWRpX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCmluZGV4IDZiOTkyNjMuLjU5OGYwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCQkJICAgICBsb25nIG0pCiB7CiAJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JYm9vbCBuZWdhdGl2ZTsKKwl1MTYgbmVnYXRpdmU7CiAJaW50IHJldCA9IDA7CiAJdTE2IHBvczsKIAlzMTYgdmVsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKaW5kZXggYjQzMjE1My4uMGY2M2EzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCkBAIC00NSw2ICs0NSw3IEBACiAJe1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMTEpfSwgLyogRExpbmsgR08tVVNCLU4xNTAgUkVWIEIxICovCiAJe1VTQl9ERVZJQ0UoMHgyMzU3LCAweDAxMGMpfSwgLyogVFAtTGluayBUTC1XTjcyMk4gdjIgKi8KIAl7VVNCX0RFVklDRSgweDBkZjYsIDB4MDA3Nil9LCAvKiBTaXRlY29tIE4xNTAgdjIgKi8KKwl7VVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ZmZlZil9LCAvKiBSb3Nld2lsbCBSTlgtTjE1ME5VQiAqLwogCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCmluZGV4IDAxNDM4ZmEuLmY1MDA3NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCkBAIC00MTQsNyArNDE0LDcgQEAKIAlzZW5zZS0+YXNjcSA9IGFzY3E7CiAJaWYgKHNuc19rZXlfaW5mbzAgIT0gMCkgewogCQlzZW5zZS0+c25zX2tleV9pbmZvWzBdID0gU0tTViB8IHNuc19rZXlfaW5mbzA7Ci0JCXNlbnNlLT5zbnNfa2V5X2luZm9bMV0gPSAoc25zX2tleV9pbmZvMSAmIDB4ZjApID4+IDg7CisJCXNlbnNlLT5zbnNfa2V5X2luZm9bMV0gPSAoc25zX2tleV9pbmZvMSAmIDB4ZjApID4+IDQ7CiAJCXNlbnNlLT5zbnNfa2V5X2luZm9bMl0gPSBzbnNfa2V5X2luZm8xICYgMHgwZjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2xpbnV4X3dsYW4uYwppbmRleCA2MzcwYTVlLi5kZWZmZmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9saW51eF93bGFuLmMKQEAgLTI2OSwyMyArMjY5LDEyIEBACiAKIGludCB3aWxjX3dsYW5fc2V0X2Jzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICp3aWxjX25ldGRldiwgdTggKmJzc2lkLCB1OCBtb2RlKQogewotCWludCBpID0gMDsKLQlpbnQgcmV0ID0gLTE7Ci0Jc3RydWN0IHdpbGNfdmlmICp2aWY7Ci0Jc3RydWN0IHdpbGMgKndpbGM7CisJc3RydWN0IHdpbGNfdmlmICp2aWYgPSBuZXRkZXZfcHJpdih3aWxjX25ldGRldik7CiAKLQl2aWYgPSBuZXRkZXZfcHJpdih3aWxjX25ldGRldik7Ci0Jd2lsYyA9IHZpZi0+d2lsYzsKKwltZW1jcHkodmlmLT5ic3NpZCwgYnNzaWQsIDYpOworCXZpZi0+bW9kZSA9IG1vZGU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgd2lsYy0+dmlmX251bTsgaSsrKQotCQlpZiAod2lsYy0+dmlmW2ldLT5uZGV2ID09IHdpbGNfbmV0ZGV2KSB7Ci0JCQltZW1jcHkod2lsYy0+dmlmW2ldLT5ic3NpZCwgYnNzaWQsIDYpOwotCQkJd2lsYy0+dmlmW2ldLT5tb2RlID0gbW9kZTsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogaW50IHdpbGNfd2xhbl9nZXRfbnVtX2Nvbm5faWZjcyhzdHJ1Y3Qgd2lsYyAqd2lsYykKQEAgLTEyMTIsMTYgKzEyMDEsMTEgQEAKIAogdm9pZCB3aWxjX25ldGRldl9jbGVhbnVwKHN0cnVjdCB3aWxjICp3aWxjKQogewotCWludCBpID0gMDsKLQlzdHJ1Y3Qgd2lsY192aWYgKnZpZltOVU1fQ09OQ1VSUkVOVF9JRkNdOworCWludCBpOwogCi0JaWYgKHdpbGMgJiYgKHdpbGMtPnZpZlswXS0+bmRldiB8fCB3aWxjLT52aWZbMV0tPm5kZXYpKSB7CisJaWYgKHdpbGMgJiYgKHdpbGMtPnZpZlswXS0+bmRldiB8fCB3aWxjLT52aWZbMV0tPm5kZXYpKQogCQl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZnX2Rldl9ub3RpZmllcik7CiAKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9DT05DVVJSRU5UX0lGQzsgaSsrKQotCQkJdmlmW2ldID0gbmV0ZGV2X3ByaXYod2lsYy0+dmlmW2ldLT5uZGV2KTsKLQl9Ci0KIAlpZiAod2lsYyAmJiB3aWxjLT5maXJtd2FyZSkgewogCQlyZWxlYXNlX2Zpcm13YXJlKHdpbGMtPmZpcm13YXJlKTsKIAkJd2lsYy0+ZmlybXdhcmUgPSBOVUxMOwpAQCAtMTIzMCw3ICsxMjE0LDcgQEAKIAlpZiAod2lsYyAmJiAod2lsYy0+dmlmWzBdLT5uZGV2IHx8IHdpbGMtPnZpZlsxXS0+bmRldikpIHsKIAkJZm9yIChpID0gMDsgaSA8IE5VTV9DT05DVVJSRU5UX0lGQzsgaSsrKQogCQkJaWYgKHdpbGMtPnZpZltpXS0+bmRldikKLQkJCQlpZiAodmlmW2ldLT5tYWNfb3BlbmVkKQorCQkJCWlmICh3aWxjLT52aWZbaV0tPm1hY19vcGVuZWQpCiAJCQkJCXdpbGNfbWFjX2Nsb3NlKHdpbGMtPnZpZltpXS0+bmRldik7CiAKIAkJZm9yIChpID0gMDsgaSA8IE5VTV9DT05DVVJSRU5UX0lGQzsgaSsrKSB7CkBAIC0xMjc4LDkgKzEyNjIsOSBAQAogCiAJCXZpZi0+aWR4ID0gd2wtPnZpZl9udW07CiAJCXZpZi0+d2lsYyA9ICp3aWxjOworCQl2aWYtPm5kZXYgPSBuZGV2OwogCQl3bC0+dmlmW2ldID0gdmlmOwotCQl3bC0+dmlmW3dsLT52aWZfbnVtXS0+bmRldiA9IG5kZXY7Ci0JCXdsLT52aWZfbnVtKys7CisJCXdsLT52aWZfbnVtID0gaTsKIAkJbmRldi0+bmV0ZGV2X29wcyA9ICZ3aWxjX25ldGRldl9vcHM7CiAKIAkJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKaW5kZXggMTgyYjJkNS4uMTY1YzQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCkBAIC02NjYsOCArNjY2LDExIEBACiAKIHZvaWQgcHJpc20yX3JvYW1lZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKLQljZmc4MDIxMV9yb2FtZWQod2xhbmRldi0+bmV0ZGV2LCBOVUxMLCB3bGFuZGV2LT5ic3NpZCwKLQkJTlVMTCwgMCwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyByb2FtX2luZm8gPSB7CisJCS5ic3NpZCA9IHdsYW5kZXYtPmJzc2lkLAorCX07CisKKwljZmc4MDIxMV9yb2FtZWQod2xhbmRldi0+bmV0ZGV2LCAmcm9hbV9pbmZvLCBHRlBfS0VSTkVMKTsKIH0KIAogLyogU3RydWN0dXJlcyBmb3IgZGVjbGFyaW5nIHdpcGh5IGludGVyZmFjZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwppbmRleCAxNTVmZTBlLi5lNDlmY2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwpAQCAtNDE4LDYgKzQxOCw3IEBACiAJCXJldHVybiAwOwogCX0KIAlucC0+bnBfdGhyZWFkX3N0YXRlID0gSVNDU0lfTlBfVEhSRUFEX1JFU0VUOworCWF0b21pY19pbmMoJm5wLT5ucF9yZXNldF9jb3VudCk7CiAKIAlpZiAobnAtPm5wX3RocmVhZCkgewogCQlzcGluX3VubG9ja19iaCgmbnAtPm5wX3RocmVhZF9sb2NrKTsKQEAgLTIxNzcsNiArMjE3OCw3IEBACiAJY21kLT5jbWRfc24JCT0gYmUzMl90b19jcHUoaGRyLT5jbWRzbik7CiAJY21kLT5leHBfc3RhdF9zbgk9IGJlMzJfdG9fY3B1KGhkci0+ZXhwX3N0YXRzbik7CiAJY21kLT5kYXRhX2RpcmVjdGlvbgk9IERNQV9OT05FOworCWtmcmVlKGNtZC0+dGV4dF9pbl9wdHIpOwogCWNtZC0+dGV4dF9pbl9wdHIJPSBOVUxMOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbG9naW4uYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9sb2dpbi5jCmluZGV4IDYxMjhlOGUuLjljY2Q1ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9sb2dpbi5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9sb2dpbi5jCkBAIC0xMjMzLDkgKzEyMzMsMTEgQEAKIAlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCiAJc3Bpbl9sb2NrX2JoKCZucC0+bnBfdGhyZWFkX2xvY2spOwotCWlmIChucC0+bnBfdGhyZWFkX3N0YXRlID09IElTQ1NJX05QX1RIUkVBRF9SRVNFVCkgeworCWlmIChhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZucC0+bnBfcmVzZXRfY291bnQpID49IDApIHsKIAkJbnAtPm5wX3RocmVhZF9zdGF0ZSA9IElTQ1NJX05QX1RIUkVBRF9BQ1RJVkU7CisJCXNwaW5fdW5sb2NrX2JoKCZucC0+bnBfdGhyZWFkX2xvY2spOwogCQljb21wbGV0ZSgmbnAtPm5wX3Jlc3RhcnRfY29tcCk7CisJCXJldHVybiAxOwogCX0gZWxzZSBpZiAobnAtPm5wX3RocmVhZF9zdGF0ZSA9PSBJU0NTSV9OUF9USFJFQURfU0hVVERPV04pIHsKIAkJc3Bpbl91bmxvY2tfYmgoJm5wLT5ucF90aHJlYWRfbG9jayk7CiAJCWdvdG8gZXhpdDsKQEAgLTEyNjgsNyArMTI3MCw4IEBACiAJCWdvdG8gZXhpdDsKIAl9IGVsc2UgaWYgKHJjIDwgMCkgewogCQlzcGluX2xvY2tfYmgoJm5wLT5ucF90aHJlYWRfbG9jayk7Ci0JCWlmIChucC0+bnBfdGhyZWFkX3N0YXRlID09IElTQ1NJX05QX1RIUkVBRF9SRVNFVCkgeworCQlpZiAoYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmbnAtPm5wX3Jlc2V0X2NvdW50KSA+PSAwKSB7CisJCQlucC0+bnBfdGhyZWFkX3N0YXRlID0gSVNDU0lfTlBfVEhSRUFEX0FDVElWRTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZucC0+bnBfdGhyZWFkX2xvY2spOwogCQkJY29tcGxldGUoJm5wLT5ucF9yZXN0YXJ0X2NvbXApOwogCQkJaXNjc2l0X3B1dF90cmFuc3BvcnQoY29ubi0+Y29ubl90cmFuc3BvcnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKaW5kZXggNjY5M2Q3Yy4uZThlZmI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCkBAIC00OTAsMTQgKzQ5MCw2MCBAQAogCiBzdGF0aWMgaW50IGlzY3NpX3RhcmdldF9kb19sb2dpbihzdHJ1Y3QgaXNjc2lfY29ubiAqLCBzdHJ1Y3QgaXNjc2lfbG9naW4gKik7CiAKLXN0YXRpYyBib29sIGlzY3NpX3RhcmdldF9za19zdGF0ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgYm9vbCBfX2lzY3NpX3RhcmdldF9za19jaGVja19jbG9zZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0VfV0FJVCB8fCBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKSB7Ci0JCXByX2RlYnVnKCJpc2NzaV90YXJnZXRfc2tfc3RhdGVfY2hlY2s6IFRDUF9DTE9TRV9XQUlUfFRDUF9DTE9TRSwiCisJCXByX2RlYnVnKCJfX2lzY3NpX3RhcmdldF9za19jaGVja19jbG9zZTogVENQX0NMT1NFX1dBSVR8VENQX0NMT1NFLCIKIAkJCSJyZXR1cm5pbmcgRkFMU0VcbiIpOwotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOwogCX0KLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzY3NpX3RhcmdldF9za19jaGVja19jbG9zZShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubikKK3sKKwlib29sIHN0YXRlID0gZmFsc2U7CisKKwlpZiAoY29ubi0+c29jaykgeworCQlzdHJ1Y3Qgc29jayAqc2sgPSBjb25uLT5zb2NrLT5zazsKKworCQlyZWFkX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwkJc3RhdGUgPSAoX19pc2NzaV90YXJnZXRfc2tfY2hlY2tfY2xvc2Uoc2spIHx8CisJCQkgdGVzdF9iaXQoTE9HSU5fRkxBR1NfQ0xPU0VELCAmY29ubi0+bG9naW5fZmxhZ3MpKTsKKwkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9CisJcmV0dXJuIHN0YXRlOworfQorCitzdGF0aWMgYm9vbCBpc2NzaV90YXJnZXRfc2tfY2hlY2tfZmxhZyhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgdW5zaWduZWQgaW50IGZsYWcpCit7CisJYm9vbCBzdGF0ZSA9IGZhbHNlOworCisJaWYgKGNvbm4tPnNvY2spIHsKKwkJc3RydWN0IHNvY2sgKnNrID0gY29ubi0+c29jay0+c2s7CisKKwkJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJCXN0YXRlID0gdGVzdF9iaXQoZmxhZywgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKKwkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9CisJcmV0dXJuIHN0YXRlOworfQorCitzdGF0aWMgYm9vbCBpc2NzaV90YXJnZXRfc2tfY2hlY2tfYW5kX2NsZWFyKHN0cnVjdCBpc2NzaV9jb25uICpjb25uLCB1bnNpZ25lZCBpbnQgZmxhZykKK3sKKwlib29sIHN0YXRlID0gZmFsc2U7CisKKwlpZiAoY29ubi0+c29jaykgeworCQlzdHJ1Y3Qgc29jayAqc2sgPSBjb25uLT5zb2NrLT5zazsKKworCQl3cml0ZV9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJCXN0YXRlID0gKF9faXNjc2lfdGFyZ2V0X3NrX2NoZWNrX2Nsb3NlKHNrKSB8fAorCQkJIHRlc3RfYml0KExPR0lOX0ZMQUdTX0NMT1NFRCwgJmNvbm4tPmxvZ2luX2ZsYWdzKSk7CisJCWlmICghc3RhdGUpCisJCQljbGVhcl9iaXQoZmxhZywgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJfQorCXJldHVybiBzdGF0ZTsKIH0KIAogc3RhdGljIHZvaWQgaXNjc2lfdGFyZ2V0X2xvZ2luX2Ryb3Aoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9sb2dpbiAqbG9naW4pCkBAIC01MzcsNiArNTgzLDIwIEBACiAKIAlwcl9kZWJ1ZygiZW50ZXJpbmcgaXNjc2lfdGFyZ2V0X2RvX2xvZ2luX3J4LCBjb25uOiAlcCwgJXM6JWRcbiIsCiAJCQljb25uLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCS8qCisJICogSWYgaXNjc2lfdGFyZ2V0X2RvX2xvZ2luX3J4KCkgaGFzIGJlZW4gaW52b2tlZCBieSAtPnNrX2RhdGFfcmVhZHkoKQorCSAqIGJlZm9yZSBpbml0aWFsIFBEVSBwcm9jZXNzaW5nIGluIGlzY3NpX3RhcmdldF9zdGFydF9uZWdvdGlhdGlvbigpCisJICogaGFzIGNvbXBsZXRlZCwgZ28gYWhlYWQgYW5kIHJldHJ5IHVudGlsIGl0J3MgY2xlYXJlZC4KKwkgKgorCSAqIE90aGVyd2lzZSBpZiB0aGUgVENQIGNvbm5lY3Rpb24gZHJvcHMgd2hpbGUgdGhpcyBpcyBvY2N1cmluZywKKwkgKiBpc2NzaV90YXJnZXRfc3RhcnRfbmVnb3RpYXRpb24oKSB3aWxsIGRldGVjdCB0aGUgZmFpbHVyZSwgY2FsbAorCSAqIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+bG9naW5fd29yayksIGFuZCBjbGVhbnVwIHRoZQorCSAqIHJlbWFpbmluZyBpc2NzaSBjb25uZWN0aW9uIHJlc291cmNlcyBmcm9tIGlzY3NpX25wIHByb2Nlc3MgY29udGV4dC4KKwkgKi8KKwlpZiAoaXNjc2lfdGFyZ2V0X3NrX2NoZWNrX2ZsYWcoY29ubiwgTE9HSU5fRkxBR1NfSU5JVElBTF9QRFUpKSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubi0+bG9naW5fd29yaywgbXNlY3NfdG9famlmZmllcygxMCkpOworCQlyZXR1cm47CisJfQogCiAJc3Bpbl9sb2NrKCZ0cGctPnRwZ19zdGF0ZV9sb2NrKTsKIAlzdGF0ZSA9ICh0cGctPnRwZ19zdGF0ZSA9PSBUUEdfU1RBVEVfQUNUSVZFKTsKQEAgLTU0NCwyNiArNjA0LDEyIEBACiAKIAlpZiAoIXN0YXRlKSB7CiAJCXByX2RlYnVnKCJpc2NzaV90YXJnZXRfZG9fbG9naW5fcng6IHRwZ19zdGF0ZSAhPSBUUEdfU1RBVEVfQUNUSVZFXG4iKTsKLQkJaXNjc2lfdGFyZ2V0X3Jlc3RvcmVfc29ja19jYWxsYmFja3MoY29ubik7Ci0JCWlzY3NpX3RhcmdldF9sb2dpbl9kcm9wKGNvbm4sIGxvZ2luKTsKLQkJaXNjc2l0X2RlYWNjZXNzX25wKG5wLCB0cGcsIHRwZ19ucCk7Ci0JCXJldHVybjsKKwkJZ290byBlcnI7CiAJfQogCi0JaWYgKGNvbm4tPnNvY2spIHsKLQkJc3RydWN0IHNvY2sgKnNrID0gY29ubi0+c29jay0+c2s7Ci0KLQkJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0JCXN0YXRlID0gaXNjc2lfdGFyZ2V0X3NrX3N0YXRlX2NoZWNrKHNrKTsKLQkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQotCQlpZiAoIXN0YXRlKSB7Ci0JCQlwcl9kZWJ1ZygiaXNjc2lfdGFyZ2V0X2RvX2xvZ2luX3J4LCBUQ1Agc3RhdGUgQ0xPU0VcbiIpOwotCQkJaXNjc2lfdGFyZ2V0X3Jlc3RvcmVfc29ja19jYWxsYmFja3MoY29ubik7Ci0JCQlpc2NzaV90YXJnZXRfbG9naW5fZHJvcChjb25uLCBsb2dpbik7Ci0JCQlpc2NzaXRfZGVhY2Nlc3NfbnAobnAsIHRwZywgdHBnX25wKTsKLQkJCXJldHVybjsKLQkJfQorCWlmIChpc2NzaV90YXJnZXRfc2tfY2hlY2tfY2xvc2UoY29ubikpIHsKKwkJcHJfZGVidWcoImlzY3NpX3RhcmdldF9kb19sb2dpbl9yeCwgVENQIHN0YXRlIENMT1NFXG4iKTsKKwkJZ290byBlcnI7CiAJfQogCiAJY29ubi0+bG9naW5fa3dvcmtlciA9IGN1cnJlbnQ7CkBAIC01ODEsMzQgKzYyNywyOSBAQAogCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJY29ubi0+bG9naW5fa3dvcmtlciA9IE5VTEw7CiAKLQlpZiAocmMgPCAwKSB7Ci0JCWlzY3NpX3RhcmdldF9yZXN0b3JlX3NvY2tfY2FsbGJhY2tzKGNvbm4pOwotCQlpc2NzaV90YXJnZXRfbG9naW5fZHJvcChjb25uLCBsb2dpbik7Ci0JCWlzY3NpdF9kZWFjY2Vzc19ucChucCwgdHBnLCB0cGdfbnApOwotCQlyZXR1cm47Ci0JfQorCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOwogCiAJcHJfZGVidWcoImlzY3NpX3RhcmdldF9kb19sb2dpbl9yeCBhZnRlciByeF9sb2dpbl9pbywgJXAsICVzOiVkXG4iLAogCQkJY29ubiwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKIAogCXJjID0gaXNjc2lfdGFyZ2V0X2RvX2xvZ2luKGNvbm4sIGxvZ2luKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWlzY3NpX3RhcmdldF9yZXN0b3JlX3NvY2tfY2FsbGJhY2tzKGNvbm4pOwotCQlpc2NzaV90YXJnZXRfbG9naW5fZHJvcChjb25uLCBsb2dpbik7Ci0JCWlzY3NpdF9kZWFjY2Vzc19ucChucCwgdHBnLCB0cGdfbnApOworCQlnb3RvIGVycjsKIAl9IGVsc2UgaWYgKCFyYykgewotCQlpZiAoY29ubi0+c29jaykgewotCQkJc3RydWN0IHNvY2sgKnNrID0gY29ubi0+c29jay0+c2s7Ci0KLQkJCXdyaXRlX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQkJCWNsZWFyX2JpdChMT0dJTl9GTEFHU19SRUFEX0FDVElWRSwgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotCQl9CisJCWlmIChpc2NzaV90YXJnZXRfc2tfY2hlY2tfYW5kX2NsZWFyKGNvbm4sIExPR0lOX0ZMQUdTX1JFQURfQUNUSVZFKSkKKwkJCWdvdG8gZXJyOwogCX0gZWxzZSBpZiAocmMgPT0gMSkgewogCQlpc2NzaV90YXJnZXRfbmVnb19yZWxlYXNlKGNvbm4pOwogCQlpc2NzaV9wb3N0X2xvZ2luX2hhbmRsZXIobnAsIGNvbm4sIHplcm9fdHNpaCk7CiAJCWlzY3NpdF9kZWFjY2Vzc19ucChucCwgdHBnLCB0cGdfbnApOwogCX0KKwlyZXR1cm47CisKK2VycjoKKwlpc2NzaV90YXJnZXRfcmVzdG9yZV9zb2NrX2NhbGxiYWNrcyhjb25uKTsKKwlpc2NzaV90YXJnZXRfbG9naW5fZHJvcChjb25uLCBsb2dpbik7CisJaXNjc2l0X2RlYWNjZXNzX25wKG5wLCB0cGcsIHRwZ19ucCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzY3NpX3RhcmdldF9kb19jbGVhbnVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTY1NiwzMSArNjk3LDU0IEBACiAJCW9yaWdfc3RhdGVfY2hhbmdlKHNrKTsKIAkJcmV0dXJuOwogCX0KKwlzdGF0ZSA9IF9faXNjc2lfdGFyZ2V0X3NrX2NoZWNrX2Nsb3NlKHNrKTsKKwlwcl9kZWJ1ZygiX19pc2NzaV90YXJnZXRfc2tfY2xvc2VfY2hhbmdlOiBzdGF0ZTogJWRcbiIsIHN0YXRlKTsKKwogCWlmICh0ZXN0X2JpdChMT0dJTl9GTEFHU19SRUFEX0FDVElWRSwgJmNvbm4tPmxvZ2luX2ZsYWdzKSkgewogCQlwcl9kZWJ1ZygiR290IExPR0lOX0ZMQUdTX1JFQURfQUNUSVZFPTEgc2tfc3RhdGVfY2hhbmdlIgogCQkJICIgY29ubjogJXBcbiIsIGNvbm4pOworCQlpZiAoc3RhdGUpCisJCQlzZXRfYml0KExPR0lOX0ZMQUdTX0NMT1NFRCwgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKIAkJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJCW9yaWdfc3RhdGVfY2hhbmdlKHNrKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodGVzdF9hbmRfc2V0X2JpdChMT0dJTl9GTEFHU19DTE9TRUQsICZjb25uLT5sb2dpbl9mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoTE9HSU5fRkxBR1NfQ0xPU0VELCAmY29ubi0+bG9naW5fZmxhZ3MpKSB7CiAJCXByX2RlYnVnKCJHb3QgTE9HSU5fRkxBR1NfQ0xPU0VEPTEgc2tfc3RhdGVfY2hhbmdlIGNvbm46ICVwXG4iLAogCQkJIGNvbm4pOwogCQl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAkJb3JpZ19zdGF0ZV9jaGFuZ2Uoc2spOwogCQlyZXR1cm47CiAJfQotCi0Jc3RhdGUgPSBpc2NzaV90YXJnZXRfc2tfc3RhdGVfY2hlY2soc2spOwotCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotCi0JcHJfZGVidWcoImlzY3NpX3RhcmdldF9za19zdGF0ZV9jaGFuZ2U6IHN0YXRlOiAlZFxuIiwgc3RhdGUpOwotCi0JaWYgKCFzdGF0ZSkgeworCS8qCisJICogSWYgdGhlIFRDUCBjb25uZWN0aW9uIGhhcyBkcm9wcGVkLCBnbyBhaGVhZCBhbmQgc2V0IExPR0lOX0ZMQUdTX0NMT1NFRCwKKwkgKiBidXQgb25seSBxdWV1ZSBjb25uLT5sb2dpbl93b3JrIC0+IGlzY3NpX3RhcmdldF9kb19sb2dpbl9yeCgpCisJICogcHJvY2Vzc2luZyBpZiBMT0dJTl9GTEFHU19JTklUSUFMX1BEVSBoYXMgYWxyZWFkeSBiZWVuIGNsZWFyZWQuCisJICoKKwkgKiBXaGVuIGlzY3NpX3RhcmdldF9kb19sb2dpbl9yeCgpIHJ1bnMsIGlzY3NpX3RhcmdldF9za19jaGVja19jbG9zZSgpCisJICogd2lsbCBkZXRlY3QgdGhlIGRyb3BwZWQgVENQIGNvbm5lY3Rpb24gZnJvbSBkZWxheWVkIHdvcmtxdWV1ZSBjb250ZXh0LgorCSAqCisJICogSWYgTE9HSU5fRkxBR1NfSU5JVElBTF9QRFUgaXMgc3RpbGwgc2V0LCB3aGljaCBtZWFucyB0aGUgaW5pdGlhbAorCSAqIGlzY3NpX3RhcmdldF9zdGFydF9uZWdvdGlhdGlvbigpIGlzIHJ1bm5pbmcsIGlzY3NpX3RhcmdldF9kb19sb2dpbigpCisJICogdmlhIGlzY3NpX3RhcmdldF9za19jaGVja19jbG9zZSgpIG9yIGlzY3NpX3RhcmdldF9zdGFydF9uZWdvdGlhdGlvbigpCisJICogdmlhIGlzY3NpX3RhcmdldF9za19jaGVja19hbmRfY2xlYXIoKSBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIHRoZQorCSAqIGRyb3BwZWQgVENQIGNvbm5lY3Rpb24gaW4gaXNjc2lfbnAgcHJvY2VzcyBjb250ZXh0LCBhbmQgY2xlYW5pbmcgdXAKKwkgKiB0aGUgcmVtYWluaW5nIGlzY3NpIGNvbm5lY3Rpb24gcmVzb3VyY2VzLgorCSAqLworCWlmIChzdGF0ZSkgewogCQlwcl9kZWJ1ZygiaXNjc2lfdGFyZ2V0X3NrX3N0YXRlX2NoYW5nZSBnb3QgZmFpbGVkIHN0YXRlXG4iKTsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb25uLT5sb2dpbl9jbGVhbnVwX3dvcmssIDApOworCQlzZXRfYml0KExPR0lOX0ZMQUdTX0NMT1NFRCwgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKKwkJc3RhdGUgPSB0ZXN0X2JpdChMT0dJTl9GTEFHU19JTklUSUFMX1BEVSwgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKKwkJd3JpdGVfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisKKwkJb3JpZ19zdGF0ZV9jaGFuZ2Uoc2spOworCisJCWlmICghc3RhdGUpCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvbm4tPmxvZ2luX3dvcmssIDApOwogCQlyZXR1cm47CiAJfQorCXdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCiAJb3JpZ19zdGF0ZV9jaGFuZ2Uoc2spOwogfQogCkBAIC05NDUsNiArMTAwOSwxNSBAQAogCQkJaWYgKGlzY3NpX3RhcmdldF9oYW5kbGVfY3NnX29uZShjb25uLCBsb2dpbikgPCAwKQogCQkJCXJldHVybiAtMTsKIAkJCWlmIChsb2dpbl9yc3AtPmZsYWdzICYgSVNDU0lfRkxBR19MT0dJTl9UUkFOU0lUKSB7CisJCQkJLyoKKwkJCQkgKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIFRDUCBjb25uZWN0aW9uIGhhcyBub3QKKwkJCQkgKiBkcm9wcGVkIGFzeW5jaHJvbm91c2x5IHdoaWxlIHNlc3Npb24gcmVpbnN0YXRlbWVudAorCQkJCSAqIHdhcyBvY2N1cmluZyBpbiB0aGlzIGt0aHJlYWQgY29udGV4dCwgYmVmb3JlCisJCQkJICogdHJhbnNpdGlvbmluZyB0byBmdWxsIGZlYXR1cmUgcGhhc2Ugb3BlcmF0aW9uLgorCQkJCSAqLworCQkJCWlmIChpc2NzaV90YXJnZXRfc2tfY2hlY2tfY2xvc2UoY29ubikpCisJCQkJCXJldHVybiAtMTsKKwogCQkJCWxvZ2luLT50c2loID0gY29ubi0+c2Vzcy0+dHNpaDsKIAkJCQlsb2dpbi0+bG9naW5fY29tcGxldGUgPSAxOwogCQkJCWlzY3NpX3RhcmdldF9yZXN0b3JlX3NvY2tfY2FsbGJhY2tzKGNvbm4pOwpAQCAtOTcxLDIxICsxMDQ0LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGNvbm4tPnNvY2spIHsKLQkJc3RydWN0IHNvY2sgKnNrID0gY29ubi0+c29jay0+c2s7Ci0JCWJvb2wgc3RhdGU7Ci0KLQkJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0JCXN0YXRlID0gaXNjc2lfdGFyZ2V0X3NrX3N0YXRlX2NoZWNrKHNrKTsKLQkJcmVhZF91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKLQotCQlpZiAoIXN0YXRlKSB7Ci0JCQlwcl9kZWJ1ZygiaXNjc2lfdGFyZ2V0X2RvX2xvZ2luKCkgZmFpbGVkIHN0YXRlIGZvciIKLQkJCQkgIiBjb25uOiAlcFxuIiwgY29ubik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1MiwxMyArMTMxMCwyNSBAQAogICAgICAgIGlmIChjb25uLT5zb2NrKSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29jayAqc2sgPSBjb25uLT5zb2NrLT5zazsKIAotICAgICAgICAgICAgICAgd3JpdGVfbG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotICAgICAgICAgICAgICAgc2V0X2JpdChMT0dJTl9GTEFHU19SRUFEWSwgJmNvbm4tPmxvZ2luX2ZsYWdzKTsKLSAgICAgICAgICAgICAgIHdyaXRlX3VubG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOwotICAgICAgIH0KKwkJd3JpdGVfbG9ja19iaCgmc2stPnNrX2NhbGxiYWNrX2xvY2spOworCQlzZXRfYml0KExPR0lOX0ZMQUdTX1JFQURZLCAmY29ubi0+bG9naW5fZmxhZ3MpOworCQlzZXRfYml0KExPR0lOX0ZMQUdTX0lOSVRJQUxfUERVLCAmY29ubi0+bG9naW5fZmxhZ3MpOworCQl3cml0ZV91bmxvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKKwl9CisJLyoKKwkgKiBJZiBpc2NzaV90YXJnZXRfZG9fbG9naW4gcmV0dXJucyB6ZXJvIHRvIHNpZ25hbCBtb3JlIFBEVQorCSAqIGV4Y2hhbmdlcyBhcmUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIGxvZ2luLCBnbyBhaGVhZCBhbmQKKwkgKiBjbGVhciBMT0dJTl9GTEFHU19JTklUSUFMX1BEVSBidXQgb25seSBpZiB0aGUgVENQIGNvbm5lY3Rpb24KKwkgKiBpcyBzdGlsbCBhY3RpdmUuCisJICoKKwkgKiBPdGhlcndpc2UgaWYgVENQIGNvbm5lY3Rpb24gZHJvcHBlZCBhc3luY2hyb25vdXNseSwgZ28gYWhlYWQKKwkgKiBhbmQgcGVyZm9ybSBjb25uZWN0aW9uIGNsZWFudXAgbm93LgorCSAqLworCXJldCA9IGlzY3NpX3RhcmdldF9kb19sb2dpbihjb25uLCBsb2dpbik7CisJaWYgKCFyZXQgJiYgaXNjc2lfdGFyZ2V0X3NrX2NoZWNrX2FuZF9jbGVhcihjb25uLCBMT0dJTl9GTEFHU19JTklUSUFMX1BEVSkpCisJCXJldCA9IC0xOwogCi0gICAgICAgcmV0ID0gaXNjc2lfdGFyZ2V0X2RvX2xvZ2luKGNvbm4sIGxvZ2luKTsKLSAgICAgICBpZiAocmV0IDwgMCkgeworCWlmIChyZXQgPCAwKSB7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+bG9naW5fd29yayk7CiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+bG9naW5fY2xlYW51cF93b3JrKTsKIAkJaXNjc2lfdGFyZ2V0X3Jlc3RvcmVfc29ja19jYWxsYmFja3MoY29ubik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cGcuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5jCmluZGV4IDE5NDlmNTAuLjBlMmU3MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RwZy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAltdXRleF9sb2NrKCZ0cGctPmFjbF9ub2RlX211dGV4KTsKIAlpZiAoYWNsLT5keW5hbWljX25vZGVfYWNsKQogCQlhY2wtPmR5bmFtaWNfbm9kZV9hY2wgPSAwOwotCWxpc3RfZGVsKCZhY2wtPmFjbF9saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZhY2wtPmFjbF9saXN0KTsKIAltdXRleF91bmxvY2soJnRwZy0+YWNsX25vZGVfbXV0ZXgpOwogCiAJdGFyZ2V0X3NodXRkb3duX3Nlc3Npb25zKGFjbCk7CkBAIC01NDAsNyArNTQwLDcgQEAKIAkgKiBpbiB0cmFuc3BvcnRfZGVyZWdpc3Rlcl9zZXNzaW9uKCkuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5hY2wsIG5hY2xfdG1wLCAmbm9kZV9saXN0LCBhY2xfbGlzdCkgewotCQlsaXN0X2RlbCgmbmFjbC0+YWNsX2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZuYWNsLT5hY2xfbGlzdCk7CiAKIAkJY29yZV90cGdfd2FpdF9mb3JfbmFjbF9wcl9yZWYobmFjbCk7CiAJCWNvcmVfZnJlZV9kZXZpY2VfbGlzdF9mb3Jfbm9kZShuYWNsLCBzZV90cGcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCBlOGExZjVjLi5iYWNmYThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmc2VfdHBnLT5hY2xfbm9kZV9tdXRleCk7Ci0JbGlzdF9kZWwoJm5hY2wtPmFjbF9saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZuYWNsLT5hY2xfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZzZV90cGctPmFjbF9ub2RlX211dGV4KTsKIAogCWNvcmVfdHBnX3dhaXRfZm9yX25hY2xfcHJfcmVmKG5hY2wpOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9uYWNsLT5uYWNsX3Nlc3NfbG9jaywgZmxhZ3MpOwogCiAJCQlpZiAoc2VfbmFjbC0+ZHluYW1pY19zdG9wKQotCQkJCWxpc3RfZGVsKCZzZV9uYWNsLT5hY2xfbGlzdCk7CisJCQkJbGlzdF9kZWxfaW5pdCgmc2VfbmFjbC0+YWNsX2xpc3QpOwogCQl9CiAJCW11dGV4X3VubG9jaygmc2VfdHBnLT5hY2xfbm9kZV9tdXRleCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9vZi10aGVybWFsLmMgYi9kcml2ZXJzL3RoZXJtYWwvb2YtdGhlcm1hbC5jCmluZGV4IDY1ZDhmZDcuLmJiNWY3MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9vZi10aGVybWFsLmMKKysrIGIvZHJpdmVycy90aGVybWFsL29mLXRoZXJtYWwuYwpAQCAtODAsNiArODAsNyBAQAogICogQHBvbGxpbmdfZGVsYXk6IHpvbmUgcG9sbGluZyBpbnRlcnZhbAogICogQHNsb3BlOiBzbG9wZSBvZiB0aGUgdGVtcGVyYXR1cmUgYWRqdXN0bWVudCBjdXJ2ZQogICogQG9mZnNldDogb2Zmc2V0IG9mIHRoZSB0ZW1wZXJhdHVyZSBhZGp1c3RtZW50IGN1cnZlCisgKiBAZGVmYXVsdF9kaXNhYmxlOiBLZWVwIHRoZSB0aGVybWFsIHpvbmUgZGlzYWJsZWQgYnkgZGVmYXVsdAogICogQHR6ZDogdGhlcm1hbCB6b25lIGRldmljZSBwb2ludGVyIGZvciB0aGlzIHNlbnNvcgogICogQG50cmlwczogbnVtYmVyIG9mIHRyaXAgcG9pbnRzCiAgKiBAdHJpcHM6IGFuIGFycmF5IG9mIHRyaXAgcG9pbnRzICgwLi5udHJpcHMgLSAxKQpAQCAtOTYsNiArOTcsNyBAQAogCWludCBzbG9wZTsKIAlpbnQgb2Zmc2V0OwogCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0emQ7CisJYm9vbCBkZWZhdWx0X2Rpc2FibGU7CiAKIAkvKiB0cmlwIGRhdGEgKi8KIAlpbnQgbnRyaXBzOwpAQCAtMTkzLDYgKzE5NSwxMiBAQAogCiAJaWYgKCFkYXRhLT5zZW5wcyB8fCAhZGF0YS0+c2VucHMtPm9wcy0+Z2V0X3RlbXApCiAJCXJldHVybiAtRUlOVkFMOworCWlmIChkYXRhLT5tb2RlID09IFRIRVJNQUxfREVWSUNFX0RJU0FCTEVEKSB7CisJCSp0ZW1wID0gdHotPnR6cC0+dHJhY2tzX2xvdyA/CisJCQkJVEhFUk1BTF9URU1QX0lOVkFMSURfTE9XIDoKKwkJCQlUSEVSTUFMX1RFTVBfSU5WQUxJRDsKKwkJcmV0dXJuIDA7CisJfQogCiAJcmV0dXJuIGRhdGEtPnNlbnBzLT5vcHMtPmdldF90ZW1wKGRhdGEtPnNlbnBzLT5zZW5zb3JfZGF0YSwgdGVtcCk7CiB9CkBAIC01MDcsNiArNTE1LDggQEAKIAloZWFkID0gJmRhdGEtPnNlbnBzLT5maXJzdF90ejsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsIGhlYWQsIGxpc3QpIHsKIAkJem9uZSA9IGRhdGEtPnR6ZDsKKwkJaWYgKGRhdGEtPm1vZGUgPT0gVEhFUk1BTF9ERVZJQ0VfRElTQUJMRUQpCisJCQljb250aW51ZTsKIAkJZm9yICh0cmlwID0gMDsgdHJpcCA8IGRhdGEtPm50cmlwczsgdHJpcCsrKSB7CiAJCQlvZl90aGVybWFsX2dldF90cmlwX3R5cGUoem9uZSwgdHJpcCwgJnR5cGUpOwogCQkJaWYgKCEoQklUKHR5cGUpICYgdHJpcF90eXBlX21hc2spKQpAQCAtNTcwLDYgKzU4MCw4IEBACiAJaGVhZCA9ICZkYXRhLT5zZW5wcy0+Zmlyc3RfdHo7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCBoZWFkLCBsaXN0KSB7CiAJCXpvbmUgPSBkYXRhLT50emQ7CisJCWlmIChkYXRhLT5tb2RlID09IFRIRVJNQUxfREVWSUNFX0RJU0FCTEVEKQorCQkJY29udGludWU7CiAJCXRoZXJtYWxfem9uZV9kZXZpY2VfdXBkYXRlKHpvbmUsIFRIRVJNQUxfRVZFTlRfVU5TUEVDSUZJRUQpOwogCX0KIH0KQEAgLTcwMCw2ICs3MTIsNyBAQAogCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkgewogCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIHNlbnNvcl9zcGVjczsKIAkJaW50IHJldCwgaWQ7CisJCXN0cnVjdCBfX3RoZXJtYWxfem9uZSAqdHo7CiAKIAkJLyogRm9yIG5vdywgdGhlcm1hbCBmcmFtZXdvcmsgc3VwcG9ydHMgb25seSAxIHNlbnNvciBwZXIgem9uZSAqLwogCQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhjaGlsZCwgInRoZXJtYWwtc2Vuc29ycyIsCkBAIC03MjMsNyArNzM2LDEwIEBACiAJCQlpZiAoIUlTX0VSUih0emQpKSB7CiAJCQkJaWYgKCFmaXJzdF90emQpCiAJCQkJCWZpcnN0X3R6ZCA9IHR6ZDsKLQkJCQl0emQtPm9wcy0+c2V0X21vZGUodHpkLCBUSEVSTUFMX0RFVklDRV9FTkFCTEVEKTsKKwkJCQl0eiA9IHR6ZC0+ZGV2ZGF0YTsKKwkJCQlpZiAoIXR6LT5kZWZhdWx0X2Rpc2FibGUpCisJCQkJCXR6ZC0+b3BzLT5zZXRfbW9kZSh0emQsCisJCQkJCQlUSEVSTUFMX0RFVklDRV9FTkFCTEVEKTsKIAkJCX0KIAkJfQogCQlvZl9ub2RlX3B1dChzZW5zb3Jfc3BlY3MubnApOwpAQCAtODQ3LDcgKzg2Myw3IEBACiAJdHpkID0gdGhlcm1hbF96b25lX2dldF96b25lX2J5X25hbWUoCiAJCQkJc2Vuc29yX2RhdGEtPnZpcnRfem9uZV9uYW1lKTsKIAlpZiAoSVNfRVJSKHR6ZCkpIHsKLQkJZGV2X2VycihkZXYsICJzZW5zOiVzIG5vdCBhdmFpbGFibGUgZXJyOiAlbGRcbiIsCisJCWRldl9kYmcoZGV2LCAic2VuczolcyBub3QgYXZhaWxhYmxlIGVycjogJWxkXG4iLAogCQkJCXNlbnNvcl9kYXRhLT52aXJ0X3pvbmVfbmFtZSwKIAkJCQlQVFJfRVJSKHR6ZCkpOwogCQlyZXR1cm4gdHpkOwpAQCAtOTI3LDcgKzk0Myw4IEBACiAJKnB0ciA9IHR6ZDsKIAlkZXZyZXNfYWRkKGRldiwgcHRyKTsKIAotCXR6ZC0+b3BzLT5zZXRfbW9kZSh0emQsIFRIRVJNQUxfREVWSUNFX0VOQUJMRUQpOworCWlmICghdHotPmRlZmF1bHRfZGlzYWJsZSkKKwkJdHpkLT5vcHMtPnNldF9tb2RlKHR6ZCwgVEhFUk1BTF9ERVZJQ0VfRU5BQkxFRCk7CiAKIAlyZXR1cm4gdHpkOwogfQpAQCAtMTE5Niw2ICsxMjEzLDggQEAKIAl9CiAJdHotPnBvbGxpbmdfZGVsYXkgPSBwcm9wOwogCisJdHotPmRlZmF1bHRfZGlzYWJsZSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwKKwkJCQkJImRpc2FibGUtdGhlcm1hbC16b25lIik7CiAJLyoKIAkgKiBSRVZJU1Q6IGZvciBub3csIHRoZSB0aGVybWFsIGZyYW1ld29yayBzdXBwb3J0cyBvbmx5CiAJICogb25lIHNlbnNvciBwZXIgdGhlcm1hbCB6b25lLiBUaHVzLCB3ZSBhcmUgY29uc2lkZXJpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9xY29tL21zbV9sbWhfZGN2cy5jIGIvZHJpdmVycy90aGVybWFsL3Fjb20vbXNtX2xtaF9kY3ZzLmMKaW5kZXggZDU5MGQyNC4uNGU1NTQ2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3Fjb20vbXNtX2xtaF9kY3ZzLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3Fjb20vbXNtX2xtaF9kY3ZzLmMKQEAgLTM1NCw3ICszNTQsMTMgQEAKIAltdXRleF9sb2NrKCZody0+YWNjZXNzX2xvY2spOwogCWZvcl9lYWNoX2NwdShjcHVfaWR4LCAmaHctPmNvcmVfbWFwKSB7CiAJCWlmIChjcHVfaWR4ID09IGNwdSkKLQkJCWh3LT5jZGV2X2RhdGFbaWR4XS5tYXhfZnJlcSA9IGZyZXE7CisJCS8qCisJCSAqIElmIHRoZXJlIGlzIG5vIGxpbWl0cyByZXN0cmljdGlvbiBmb3IgQ1BVIHNjYWxpbmcgbWF4CisJCSAqIGZyZXF1ZW5jeSwgdm90ZSBmb3IgYSB2ZXJ5IGhpZ2ggdmFsdWUuIFRoaXMgd2lsbCBhbGxvdworCQkgKiB0aGUgQ1BVIHRvIHVzZSB0aGUgYm9vc3QgZnJlcXVlbmNpZXMuCisJCSAqLworCQkJaHctPmNkZXZfZGF0YVtpZHhdLm1heF9mcmVxID0KKwkJCQkoZnJlcSA9PSBody0+bWF4X2ZyZXEpID8gVTMyX01BWCA6IGZyZXE7CiAJCWlmIChtYXhfZnJlcSA+IGh3LT5jZGV2X2RhdGFbaWR4XS5tYXhfZnJlcSkKIAkJCW1heF9mcmVxID0gaHctPmNkZXZfZGF0YVtpZHhdLm1heF9mcmVxOwogCQlpZHgrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9xY29tL3FtaV9jb29saW5nLmMgYi9kcml2ZXJzL3RoZXJtYWwvcWNvbS9xbWlfY29vbGluZy5jCmluZGV4IGFmODIwMzAuLmUxYTAxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9xY29tL3FtaV9jb29saW5nLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3Fjb20vcW1pX2Nvb2xpbmcuYwpAQCAtODUsNiArODUsMTAgQEAKIAkJLnR5cGUgPSBRTUlfQ0RFVl9NQVhfTElNSVRfVFlQRSwKIAl9LAogCXsKKwkJLmRldl9uYW1lID0gIm1vZGVtX3NraW4iLAorCQkudHlwZSA9IFFNSV9DREVWX01BWF9MSU1JVF9UWVBFLAorCX0sCisJewogCQkuZGV2X25hbWUgPSAibW9kZW1fYnciLAogCQkudHlwZSA9IFFNSV9DREVWX01BWF9MSU1JVF9UWVBFLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvcWNvbS9xdGlfdmlydHVhbF9zZW5zb3IuYyBiL2RyaXZlcnMvdGhlcm1hbC9xY29tL3F0aV92aXJ0dWFsX3NlbnNvci5jCmluZGV4IDkyMzY4MGEuLjhjYjdkYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9xY29tL3F0aV92aXJ0dWFsX3NlbnNvci5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9xY29tL3F0aV92aXJ0dWFsX3NlbnNvci5jCkBAIC00Niw2ICs0NiwyNCBAQAogCQkJCSJjcHUzLWdvbGQtdXNyIn0sCiAJCS5sb2dpYyA9IFZJUlRfTUFYSU1VTSwKIAl9LAorCXsKKwkJLnZpcnRfem9uZV9uYW1lID0gImhleGEtc2lsdi1tYXgtc3RlcCIsCisJCS5udW1fc2Vuc29ycyA9IDYsCisJCS5zZW5zb3JfbmFtZXMgPSB7ImNwdTAtc2lsdmVyLXVzciIsCisJCQkJImNwdTEtc2lsdmVyLXVzciIsCisJCQkJImNwdTItc2lsdmVyLXVzciIsCisJCQkJImNwdTMtc2lsdmVyLXVzciIsCisJCQkJImNwdTQtc2lsdmVyLXVzciIsCisJCQkJImNwdTUtc2lsdmVyLXVzciJ9LAorCQkubG9naWMgPSBWSVJUX01BWElNVU0sCisJfSwKKwl7CisJCS52aXJ0X3pvbmVfbmFtZSA9ICJkdWFsLWdvbGQtbWF4LXN0ZXAiLAorCQkubnVtX3NlbnNvcnMgPSAyLAorCQkuc2Vuc29yX25hbWVzID0geyJjcHUwLWdvbGQtdXNyIiwKKwkJCQkiY3B1MS1nb2xkLXVzciJ9LAorCQkubG9naWMgPSBWSVJUX01BWElNVU0sCisJfSwKIH07CiAKIGludCBxdGlfdmlydHVhbF9zZW5zb3JfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfY29yZS5jIGIvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfY29yZS5jCmluZGV4IDJiZmUxYjUuLjc2NjNlM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX2NvcmUuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9jb3JlLmMKQEAgLTUyMiw2ICs1MjIsNyBAQAogCQlpZiAoIXJldCAmJiAqdGVtcCA8IGNyaXRfdGVtcCkKIAkJCSp0ZW1wID0gdHotPmVtdWxfdGVtcGVyYXR1cmU7CiAJfQorCXRyYWNlX3RoZXJtYWxfcXVlcnlfdGVtcCh0eiwgKnRlbXApOwogCW11dGV4X3VubG9jaygmdHotPmxvY2spOwogZXhpdDoKIAlyZXR1cm4gcmV0OwpAQCAtNTk0LDcgKzU5NSw4IEBACiAJbXV0ZXhfdW5sb2NrKCZ0ei0+bG9jayk7CiAKIAl0cmFjZV90aGVybWFsX3RlbXBlcmF0dXJlKHR6KTsKLQlpZiAodHotPmxhc3RfdGVtcGVyYXR1cmUgPT0gVEhFUk1BTF9URU1QX0lOVkFMSUQpCisJaWYgKHR6LT5sYXN0X3RlbXBlcmF0dXJlID09IFRIRVJNQUxfVEVNUF9JTlZBTElEIHx8CisJCXR6LT5sYXN0X3RlbXBlcmF0dXJlID09IFRIRVJNQUxfVEVNUF9JTlZBTElEX0xPVykKIAkJZGV2X2RiZygmdHotPmRldmljZSwgImxhc3RfdGVtcGVyYXR1cmUgTi9BLCBjdXJyZW50X3RlbXBlcmF0dXJlPSVkXG4iLAogCQkJdHotPnRlbXBlcmF0dXJlKTsKIAllbHNlCkBAIC02ODgsNiArNjkwLDI2IEBACiAJCSAgICAgICA6ICJkaXNhYmxlZCIpOwogfQogCitzdGF0aWMgaW50IHRoZXJtYWxfem9uZV9kZXZpY2VfY2xlYXIoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQoreworCXN0cnVjdCB0aGVybWFsX2luc3RhbmNlICpwb3M7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB0ei0+b3BzLT5zZXRfbW9kZSh0eiwgVEhFUk1BTF9ERVZJQ0VfRElTQUJMRUQpOworCW11dGV4X2xvY2soJnR6LT5sb2NrKTsKKwl0aGVybWFsX3pvbmVfZGV2aWNlX3Jlc2V0KHR6KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnR6LT50aGVybWFsX2luc3RhbmNlcywgdHpfbm9kZSkgeworCQlwb3MtPnRhcmdldCA9IFRIRVJNQUxfTk9fVEFSR0VUOworCQltdXRleF9sb2NrKCZwb3MtPmNkZXYtPmxvY2spOworCQlwb3MtPmNkZXYtPnVwZGF0ZWQgPSBmYWxzZTsgLyogY2RldiBuZWVkcyB1cGRhdGUgKi8KKwkJbXV0ZXhfdW5sb2NrKCZwb3MtPmNkZXYtPmxvY2spOworCQl0aGVybWFsX2NkZXZfdXBkYXRlKHBvcy0+Y2Rldik7CisJfQorCW11dGV4X3VubG9jaygmdHotPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3QKIG1vZGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTcwMSw3ICs3MjMsNyBAQAogCWlmICghc3RybmNtcChidWYsICJlbmFibGVkIiwgc2l6ZW9mKCJlbmFibGVkIikgLSAxKSkKIAkJcmVzdWx0ID0gdHotPm9wcy0+c2V0X21vZGUodHosIFRIRVJNQUxfREVWSUNFX0VOQUJMRUQpOwogCWVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwgImRpc2FibGVkIiwgc2l6ZW9mKCJkaXNhYmxlZCIpIC0gMSkpCi0JCXJlc3VsdCA9IHR6LT5vcHMtPnNldF9tb2RlKHR6LCBUSEVSTUFMX0RFVklDRV9ESVNBQkxFRCk7CisJCXJlc3VsdCA9IHRoZXJtYWxfem9uZV9kZXZpY2VfY2xlYXIodHopOwogCWVsc2UKIAkJcmVzdWx0ID0gLUVJTlZBTDsKIApAQCAtMjU2NSw5ICsyNTg3LDExIEBACiAJY2FzZSBQTV9QT1NUX1NVU1BFTkQ6CiAJCWF0b21pY19zZXQoJmluX3N1c3BlbmQsIDApOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR6LCAmdGhlcm1hbF90el9saXN0LCBub2RlKSB7CisJCQltdXRleF9sb2NrKCZ0ei0+bG9jayk7CiAJCQl0aGVybWFsX3pvbmVfZGV2aWNlX3Jlc2V0KHR6KTsKLQkJCXRoZXJtYWxfem9uZV9kZXZpY2VfdXBkYXRlKHR6LAotCQkJCQkJICAgVEhFUk1BTF9FVkVOVF9VTlNQRUNJRklFRCk7CisJCQltb2RfZGVsYXllZF93b3JrKHN5c3RlbV9mcmVlemFibGVfcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJCQkJJnR6LT5wb2xsX3F1ZXVlLCAwKTsKKwkJCW11dGV4X3VubG9jaygmdHotPmxvY2spOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCmluZGV4IGJhYzk5NzUuLjYyNmNmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCkBAIC0xMDkxLDYgKzEwOTEsMTggQEAKIAlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQogCXNlbGVjdCBTRVJJQUxfRUFSTFlDT04KIAorY29uZmlnIFNFUklBTF9NU01fSFMKKwl0cmlzdGF0ZSAiTVNNIFVBUlQgSGlnaCBTcGVlZDogU2VyaWFsIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfUUNPTQorCXNlbGVjdCBTRVJJQUxfQ09SRQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbWFjaGluZSBiYXNlZCBvbiBNU00gZmFtaWx5IG9mIFNvQ3MsIHlvdQorCSAgY2FuIGVuYWJsZSBpdHMgb25ib2FyZCBoaWdoIHNwZWVkIHNlcmlhbCBwb3J0IGJ5IGVuYWJsaW5nCisJICB0aGlzIG9wdGlvbi4KKworCSAgQ2hvb3NlIE0gaGVyZSB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLiBUaGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBtc21fc2VyaWFsX2hzLgorCiBjb25maWcgU0VSSUFMX1ZUODUwMAogCWJvb2wgIlZJQSBWVDg1MDAgb24tY2hpcCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9WVDg1MDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9NYWtlZmlsZSBiL2RyaXZlcnMvdHR5L3NlcmlhbC9NYWtlZmlsZQppbmRleCBiMzkxNjViLi4xYmRjN2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL01ha2VmaWxlCkBAIC02Miw2ICs2Miw3IEBACiBvYmotJChDT05GSUdfU0VSSUFMX1VBUlRMSVRFKSArPSB1YXJ0bGl0ZS5vCiBvYmotJChDT05GSUdfU0VSSUFMX01TTSkgKz0gbXNtX3NlcmlhbC5vCiBvYmotJChDT05GSUdfU0VSSUFMX01TTV9HRU5JKSArPSBtc21fZ2VuaV9zZXJpYWwubworb2JqLSQoQ09ORklHX1NFUklBTF9NU01fSFMpICs9IG1zbV9zZXJpYWxfaHMubwogb2JqLSQoQ09ORklHX1NFUklBTF9ORVRYKSArPSBuZXR4LXNlcmlhbC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0tHREJfTk1JKSArPSBrZ2RiX25taS5vCiBvYmotJChDT05GSUdfU0VSSUFMX0tTODY5NSkgKz0gc2VyaWFsX2tzODY5NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX2dlbmlfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX2dlbmlfc2VyaWFsLmMKaW5kZXggZDczNTVmMC4uYWYxMTlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9nZW5pX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fZ2VuaV9zZXJpYWwuYwpAQCAtOTgsNyArOTgsOSBAQAogI2RlZmluZSBVQVJUX1BBUkFNCQkoMHgxKQogCiAvKiBVQVJUIERNQSBSeCBHUF9JUlFfQklUUyAqLwotI2RlZmluZSBVQVJUX0RNQV9SWF9FUlJTCShHRU5NQVNLKDUsIDgpKQorI2RlZmluZSBVQVJUX0RNQV9SWF9QQVJJVFlfRVJSCUJJVCg1KQorI2RlZmluZSBVQVJUX0RNQV9SWF9FUlJTCShHRU5NQVNLKDUsIDYpKQorI2RlZmluZSBVQVJUX0RNQV9SWF9CUkVBSwkoR0VOTUFTSyg3LCA4KSkKIAogI2RlZmluZSBVQVJUX09WRVJTQU1QTElORwkoMzIpCiAjZGVmaW5lIFNUQUxFX1RJTUVPVVQJCSgxNikKQEAgLTEyNSw2ICsxMjcsNyBAQAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBETUFfUlhfQlVGX1NJWkUJCSgyMDQ4KQorI2RlZmluZSBDT05TT0xFX1lJRUxEX0xFTgkoOCAqIDEwMjQpCiBzdHJ1Y3QgbXNtX2dlbmlfc2VyaWFsX3BvcnQgewogCXN0cnVjdCB1YXJ0X3BvcnQgdXBvcnQ7CiAJY2hhciBuYW1lWzIwXTsKQEAgLTE0MSw3ICsxNDQsOCBAQAogCWludCAoKmhhbmRsZV9yeCkoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsCiAJCQl1bnNpZ25lZCBpbnQgcnhfZmlmb193YywKIAkJCXVuc2lnbmVkIGludCByeF9sYXN0X2J5dGVfdmFsaWQsCi0JCQl1bnNpZ25lZCBpbnQgcnhfbGFzdCk7CisJCQl1bnNpZ25lZCBpbnQgcnhfbGFzdCwKKwkJCWJvb2wgZHJvcF9yeCk7CiAJc3RydWN0IGRldmljZSAqd3JhcHBlcl9kZXY7CiAJc3RydWN0IHNlX2dlbmlfcnNjIHNlcmlhbF9yc2M7CiAJZG1hX2FkZHJfdCB0eF9kbWE7CkBAIC0xNTksNiArMTYzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY3VyX2JhdWQ7CiAJaW50IGlvY3RsX2NvdW50OwogCWludCBlZGdlX2NvdW50OworCXVuc2lnbmVkIGludCB0eF95aWVsZF9jb3VudDsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbXNtX2dlbmlfc2VyaWFsX3BvcHM7CkBAIC0xNjcsMTEgKzE3MiwxMyBAQAogc3RhdGljIGludCBoYW5kbGVfcnhfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKIAkJCXVuc2lnbmVkIGludCByeF9maWZvX3djLAogCQkJdW5zaWduZWQgaW50IHJ4X2xhc3RfYnl0ZV92YWxpZCwKLQkJCXVuc2lnbmVkIGludCByeF9sYXN0KTsKKwkJCXVuc2lnbmVkIGludCByeF9sYXN0LAorCQkJYm9vbCBkcm9wX3J4KTsKIHN0YXRpYyBpbnQgaGFuZGxlX3J4X2hzKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LAogCQkJdW5zaWduZWQgaW50IHJ4X2ZpZm9fd2MsCiAJCQl1bnNpZ25lZCBpbnQgcnhfbGFzdF9ieXRlX3ZhbGlkLAotCQkJdW5zaWduZWQgaW50IHJ4X2xhc3QpOworCQkJdW5zaWduZWQgaW50IHJ4X2xhc3QsCisJCQlib29sIGRyb3BfcngpOwogc3RhdGljIHVuc2lnbmVkIGludCBtc21fZ2VuaV9zZXJpYWxfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiBzdGF0aWMgaW50IG1zbV9nZW5pX3NlcmlhbF9wb3dlcl9vbihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCk7CiBzdGF0aWMgdm9pZCBtc21fZ2VuaV9zZXJpYWxfcG93ZXJfb2ZmKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KTsKQEAgLTUxMSw5ICs1MTgsNiBAQAogCWludCBkb25lID0gMDsKIAl1bnNpZ25lZCBpbnQgaXJxX2NsZWFyID0gTV9DTURfRE9ORV9FTjsKIAotCWlmICghdWFydF9jb25zb2xlKHVwb3J0KSkKLQkJcmV0dXJuOwotCiAJZG9uZSA9IG1zbV9nZW5pX3NlcmlhbF9wb2xsX2JpdCh1cG9ydCwgU0VfR0VOSV9NX0lSUV9TVEFUVVMsCiAJCQkJCQlNX0NNRF9ET05FX0VOLCB0cnVlKTsKIAlpZiAoIWRvbmUpIHsKQEAgLTY4NCw3ICs2ODgsOCBAQAogc3RhdGljIGludCBoYW5kbGVfcnhfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKIAkJCXVuc2lnbmVkIGludCByeF9maWZvX3djLAogCQkJdW5zaWduZWQgaW50IHJ4X2xhc3RfYnl0ZV92YWxpZCwKLQkJCXVuc2lnbmVkIGludCByeF9sYXN0KQorCQkJdW5zaWduZWQgaW50IHJ4X2xhc3QsCisJCQlib29sIGRyb3BfcngpCiB7CiAJaW50IGksIGM7CiAJdW5zaWduZWQgY2hhciAqcnhfY2hhcjsKQEAgLTY5Nyw2ICs3MDIsOCBAQAogCiAJCSoobXNtX3BvcnQtPnJ4X2ZpZm8pID0KIAkJCWdlbmlfcmVhZF9yZWdfbm9sb2codXBvcnQtPm1lbWJhc2UsIFNFX0dFTklfUlhfRklGT24pOworCQlpZiAoZHJvcF9yeCkKKwkJCWNvbnRpbnVlOwogCQlyeF9jaGFyID0gKHVuc2lnbmVkIGNoYXIgKiltc21fcG9ydC0+cnhfZmlmbzsKIAogCQlpZiAoaSA9PSAocnhfZmlmb193YyAtIDEpKSB7CkBAIC03MTMsMTQgKzcyMCwxNiBAQAogCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHRwb3J0LCByeF9jaGFyW2NdLCBmbGFnKTsKIAkJfQogCX0KLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0cG9ydCk7CisJaWYgKCFkcm9wX3J4KQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0cG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQogc3RhdGljIGludCBoYW5kbGVfcnhfY29uc29sZShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKIAkJCXVuc2lnbmVkIGludCByeF9maWZvX3djLAogCQkJdW5zaWduZWQgaW50IHJ4X2xhc3RfYnl0ZV92YWxpZCwKLQkJCXVuc2lnbmVkIGludCByeF9sYXN0KQorCQkJdW5zaWduZWQgaW50IHJ4X2xhc3QsCisJCQlib29sIGRyb3BfcngpCiB7CiAJcmV0dXJuIC1FUEVSTTsKIH0KQEAgLTEwMDQsNyArMTAxMyw4IEBACiBzdGF0aWMgaW50IGhhbmRsZV9yeF9ocyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKIAkJCXVuc2lnbmVkIGludCByeF9maWZvX3djLAogCQkJdW5zaWduZWQgaW50IHJ4X2xhc3RfYnl0ZV92YWxpZCwKLQkJCXVuc2lnbmVkIGludCByeF9sYXN0KQorCQkJdW5zaWduZWQgaW50IHJ4X2xhc3QsCisJCQlib29sIGRyb3BfcngpCiB7CiAJdW5zaWduZWQgY2hhciAqcnhfY2hhcjsKIAlzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0OwpAQCAtMTAxOSw2ICsxMDI5LDggQEAKIAl0cG9ydCA9ICZ1cG9ydC0+c3RhdGUtPnBvcnQ7CiAJaW9yZWFkMzJfcmVwKCh1cG9ydC0+bWVtYmFzZSArIFNFX0dFTklfUlhfRklGT24pLCBtc21fcG9ydC0+cnhfZmlmbywKIAkJCQkJCQkJcnhfZmlmb193Yyk7CisJaWYgKGRyb3BfcngpCisJCXJldHVybiAwOwogCiAJcnhfY2hhciA9ICh1bnNpZ25lZCBjaGFyICopbXNtX3BvcnQtPnJ4X2ZpZm87CiAJcmV0ID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyh0cG9ydCwgcnhfY2hhciwgcnhfYnl0ZXMpOwpAQCAtMTAzNCw3ICsxMDQ2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG1zbV9nZW5pX3NlcmlhbF9oYW5kbGVfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCitzdGF0aWMgaW50IG1zbV9nZW5pX3NlcmlhbF9oYW5kbGVfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGJvb2wgZHJvcF9yeCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcnhfZmlmb19zdGF0dXM7CkBAIC0xMDUzLDcgKzEwNjUsNyBAQAogCXJ4X2xhc3QgPSByeF9maWZvX3N0YXR1cyAmIFJYX0xBU1Q7CiAJaWYgKHJ4X2ZpZm9fd2MpCiAJCXBvcnQtPmhhbmRsZV9yeCh1cG9ydCwgcnhfZmlmb193YywgcnhfbGFzdF9ieXRlX3ZhbGlkLAotCQkJCQkJCQlyeF9sYXN0KTsKKwkJCQkJCQlyeF9sYXN0LCBkcm9wX3J4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDczLDYgKzEwODUsMTQgQEAKIAogCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIG1zbV9wb3J0LT54bWl0X3NpemUpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CiAJbXNtX3BvcnQtPnhtaXRfc2l6ZSA9IDA7CisJaWYgKHVhcnRfY29uc29sZSh1cG9ydCkgJiYKKwkgICAgKHVwb3J0LT5pY291bnQudHggLSBtc21fcG9ydC0+dHhfeWllbGRfY291bnQpID4gQ09OU09MRV9ZSUVMRF9MRU4pIHsKKwkJbXNtX3BvcnQtPnR4X3lpZWxkX2NvdW50ID0gdXBvcnQtPmljb3VudC50eDsKKwkJbXNtX2dlbmlfc2VyaWFsX3N0b3BfdHgodXBvcnQpOworCQl1YXJ0X3dyaXRlX3dha2V1cCh1cG9ydCk7CisJCWdvdG8gZXhpdF9oYW5kbGVfdHg7CisJfQorCiAJdHhfZmlmb19zdGF0dXMgPSBnZW5pX3JlYWRfcmVnX25vbG9nKHVwb3J0LT5tZW1iYXNlLAogCQkJCQlTRV9HRU5JX1RYX0ZJRk9fU1RBVFVTKTsKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICF0eF9maWZvX3N0YXR1cykgewpAQCAtMTEyNSwxOCArMTE0NSwxOSBAQAogCQkvKiBFbnN1cmUgRklGTyB3cml0ZSBnb2VzIHRocm91Z2ggKi8KIAkJd21iKCk7CiAJfQotCW1zbV9nZW5pX3NlcmlhbF9wb2xsX2NhbmNlbF90eCh1cG9ydCk7Ci0JaWYgKHVhcnRfY29uc29sZSh1cG9ydCkpCisJaWYgKHVhcnRfY29uc29sZSh1cG9ydCkpIHsKKwkJbXNtX2dlbmlfc2VyaWFsX3BvbGxfY2FuY2VsX3R4KHVwb3J0KTsKIAkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgeG1pdF9zaXplKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCWVsc2UKKwl9IGVsc2UgewogCQltc21fcG9ydC0+eG1pdF9zaXplID0geG1pdF9zaXplOworCX0KK2V4aXRfaGFuZGxlX3R4OgogCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKIAkJdWFydF93cml0ZV93YWtldXAodXBvcnQpOwotZXhpdF9oYW5kbGVfdHg6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtc21fZ2VuaV9zZXJpYWxfaGFuZGxlX2RtYV9yeChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3N0YXRpYyBpbnQgbXNtX2dlbmlfc2VyaWFsX2hhbmRsZV9kbWFfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGJvb2wgZHJvcF9yeCkKIHsKIAlzdHJ1Y3QgbXNtX2dlbmlfc2VyaWFsX3BvcnQgKm1zbV9wb3J0ID0gR0VUX0RFVl9QT1JUKHVwb3J0KTsKIAl1bnNpZ25lZCBpbnQgcnhfYnl0ZXMgPSAwOwpAQCAtMTE2Miw2ICsxMTgzLDggQEAKIAkJCQkJX19mdW5jX18sIHJ4X2J5dGVzKTsKIAkJZ290byBleGl0X2hhbmRsZV9kbWFfcng7CiAJfQorCWlmIChkcm9wX3J4KQorCQlnb3RvIGV4aXRfaGFuZGxlX2RtYV9yeDsKIAogCXRwb3J0ID0gJnVwb3J0LT5zdGF0ZS0+cG9ydDsKIAlyZXQgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHRwb3J0LCAodW5zaWduZWQgY2hhciAqKShtc21fcG9ydC0+cnhfYnVmKSwKQEAgLTEyMTMsNiArMTIzNiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbV9pcnFfZW47CiAJc3RydWN0IG1zbV9nZW5pX3NlcmlhbF9wb3J0ICptc21fcG9ydCA9IEdFVF9ERVZfUE9SVCh1cG9ydCk7CisJYm9vbCBkcm9wX3J4ID0gZmFsc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKIAlpZiAodWFydF9jb25zb2xlKHVwb3J0KSAmJiB1cG9ydC0+c3VzcGVuZGVkKQpAQCAtMTI0MCwyMiArMTI2NCwzNyBAQAogCQlnb3RvIGV4aXRfZ2VuaV9zZXJpYWxfaXNyOwogCX0KIAotCWlmICghZG1hKSB7Ci0JCWlmICgoc19pcnFfc3RhdHVzICYgU19HUF9JUlFfMF9FTikgfHwKLQkJCShzX2lycV9zdGF0dXMgJiBTX0dQX0lSUV8xX0VOKSB8fAotCQkJKHNfaXJxX3N0YXR1cyAmIFNfR1BfSVJRXzJfRU4pIHx8Ci0JCQkoc19pcnFfc3RhdHVzICYgU19HUF9JUlFfM19FTikpIHsKLQkJCUlQQ19MT0dfTVNHKG1zbV9wb3J0LT5pcGNfbG9nX21pc2MsCi0JCQkJIiVzLnNpcnEgMHgleC5cbiIsIF9fZnVuY19fLCBzX2lycV9zdGF0dXMpOwotCQkJZ290byBleGl0X2dlbmlfc2VyaWFsX2lzcjsKLQkJfQotCQlpZiAoKHNfaXJxX3N0YXR1cyAmIFNfUlhfRklGT19XQVRFUk1BUktfRU4pIHx8Ci0JCQkoc19pcnFfc3RhdHVzICYgU19SWF9GSUZPX0xBU1RfRU4pKQotCQkJbXNtX2dlbmlfc2VyaWFsX2hhbmRsZV9yeCh1cG9ydCk7CisJaWYgKHNfaXJxX3N0YXR1cyAmIFNfUlhfRklGT19XUl9FUlJfRU4pIHsKKwkJdXBvcnQtPmljb3VudC5idWZfb3ZlcnJ1bisrOworCQlJUENfTE9HX01TRyhtc21fcG9ydC0+aXBjX2xvZ19taXNjLAorCQkJIiVzLnNpcnEgMHgleCBidWZfb3ZlcnJ1bjolZFxuIiwKKwkJCV9fZnVuY19fLCBzX2lycV9zdGF0dXMsIHVwb3J0LT5pY291bnQuYnVmX292ZXJydW4pOworCX0KIAorCWlmICghZG1hKSB7CiAJCWlmICgobV9pcnFfc3RhdHVzICYgbV9pcnFfZW4pICYKIAkJICAgIChNX1RYX0ZJRk9fV0FURVJNQVJLX0VOIHwgTV9DTURfRE9ORV9FTikpCiAJCQltc21fZ2VuaV9zZXJpYWxfaGFuZGxlX3R4KHVwb3J0KTsKKworCQlpZiAoKHNfaXJxX3N0YXR1cyAmIFNfR1BfSVJRXzBfRU4pIHx8CisJCQkoc19pcnFfc3RhdHVzICYgU19HUF9JUlFfMV9FTikpIHsKKwkJCWlmIChzX2lycV9zdGF0dXMgJiBTX0dQX0lSUV8wX0VOKQorCQkJCXVwb3J0LT5pY291bnQucGFyaXR5Kys7CisJCQlJUENfTE9HX01TRyhtc21fcG9ydC0+aXBjX2xvZ19taXNjLAorCQkJCSIlcy5zaXJxIDB4JXggcGFyaXR5OiVkXG4iLAorCQkJCV9fZnVuY19fLCBzX2lycV9zdGF0dXMsIHVwb3J0LT5pY291bnQucGFyaXR5KTsKKwkJCWRyb3BfcnggPSB0cnVlOworCQl9IGVsc2UgaWYgKChzX2lycV9zdGF0dXMgJiBTX0dQX0lSUV8yX0VOKSB8fAorCQkJKHNfaXJxX3N0YXR1cyAmIFNfR1BfSVJRXzNfRU4pKSB7CisJCQl1cG9ydC0+aWNvdW50LmJyaysrOworCQkJSVBDX0xPR19NU0cobXNtX3BvcnQtPmlwY19sb2dfbWlzYywKKwkJCQkiJXMuc2lycSAweCV4IGJyZWFrOiVkXG4iLAorCQkJCV9fZnVuY19fLCBzX2lycV9zdGF0dXMsIHVwb3J0LT5pY291bnQuYnJrKTsKKwkJfQorCisJCWlmICgoc19pcnFfc3RhdHVzICYgU19SWF9GSUZPX1dBVEVSTUFSS19FTikgfHwKKwkJCShzX2lycV9zdGF0dXMgJiBTX1JYX0ZJRk9fTEFTVF9FTikpCisJCQltc21fZ2VuaV9zZXJpYWxfaGFuZGxlX3J4KHVwb3J0LCBkcm9wX3J4KTsKIAl9IGVsc2UgewogCQlpZiAoZG1hX3R4X3N0YXR1cykgewogCQkJZ2VuaV93cml0ZV9yZWdfbm9sb2coZG1hX3R4X3N0YXR1cywgdXBvcnQtPm1lbWJhc2UsCkBAIC0xMjc0LDEzICsxMzEzLDIyIEBACiAJCQkJZ290byBleGl0X2dlbmlfc2VyaWFsX2lzcjsKIAkJCX0KIAkJCWlmIChkbWFfcnhfc3RhdHVzICYgVUFSVF9ETUFfUlhfRVJSUykgeworCQkJCWlmIChkbWFfcnhfc3RhdHVzICYgVUFSVF9ETUFfUlhfUEFSSVRZX0VSUikKKwkJCQkJdXBvcnQtPmljb3VudC5wYXJpdHkrKzsKIAkJCQlJUENfTE9HX01TRyhtc21fcG9ydC0+aXBjX2xvZ19taXNjLAotCQkJCQkiJXMuUnggRXJyb3JzLiAgMHgleC5cbiIsCi0JCQkJCQlfX2Z1bmNfXywgZG1hX3J4X3N0YXR1cyk7Ci0JCQkJZ290byBleGl0X2dlbmlfc2VyaWFsX2lzcjsKKwkJCQkJIiVzLlJ4IEVycm9ycy4gIDB4JXggcGFyaXR5OiVkXG4iLAorCQkJCQlfX2Z1bmNfXywgZG1hX3J4X3N0YXR1cywKKwkJCQkJdXBvcnQtPmljb3VudC5wYXJpdHkpOworCQkJCWRyb3BfcnggPSB0cnVlOworCQkJfSBlbHNlIGlmIChkbWFfcnhfc3RhdHVzICYgVUFSVF9ETUFfUlhfQlJFQUspIHsKKwkJCQl1cG9ydC0+aWNvdW50LmJyaysrOworCQkJCUlQQ19MT0dfTVNHKG1zbV9wb3J0LT5pcGNfbG9nX21pc2MsCisJCQkJCSIlcy5SeCBFcnJvcnMuICAweCV4IGJyZWFrOiVkXG4iLAorCQkJCQlfX2Z1bmNfXywgZG1hX3J4X3N0YXR1cywKKwkJCQkJdXBvcnQtPmljb3VudC5icmspOwogCQkJfQogCQkJaWYgKGRtYV9yeF9zdGF0dXMgJiBSWF9ETUFfRE9ORSkKLQkJCQltc21fZ2VuaV9zZXJpYWxfaGFuZGxlX2RtYV9yeCh1cG9ydCk7CisJCQkJbXNtX2dlbmlfc2VyaWFsX2hhbmRsZV9kbWFfcngodXBvcnQsIGRyb3BfcngpOwogCQl9CiAJfQogCkBAIC0xMzgwLDkgKzE0MjgsNyBAQAogCW1zbV9nZW5pX3NlcmlhbF9zdG9wX3J4KHVwb3J0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKHVhcnRfY29uc29sZSh1cG9ydCkpIHsKLQkJc2VfZ2VuaV9yZXNvdXJjZXNfb2ZmKCZtc21fcG9ydC0+c2VyaWFsX3JzYyk7Ci0JfSBlbHNlIHsKKwlpZiAoIXVhcnRfY29uc29sZSh1cG9ydCkpIHsKIAkJbXNtX2dlbmlfc2VyaWFsX3Bvd2VyX29mZih1cG9ydCk7CiAJCWlmIChtc21fcG9ydC0+d2FrZXVwX2lycSA+IDApIHsKIAkJCWlycV9zZXRfaXJxX3dha2UobXNtX3BvcnQtPndha2V1cF9pcnEsIDApOwpAQCAtMjAzMiw2ICsyMDc4LDIxIEBACiAJCWRldl9lcnIodXBvcnQtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgZGJnIGRpclxuIik7CiB9CiAKK3N0YXRpYyB2b2lkIG1zbV9nZW5pX3NlcmlhbF9jb25zX3BtKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LAorCQl1bnNpZ25lZCBpbnQgbmV3X3N0YXRlLCB1bnNpZ25lZCBpbnQgb2xkX3N0YXRlKQoreworCXN0cnVjdCBtc21fZ2VuaV9zZXJpYWxfcG9ydCAqbXNtX3BvcnQgPSBHRVRfREVWX1BPUlQodXBvcnQpOworCisJaWYgKHVubGlrZWx5KCF1YXJ0X2NvbnNvbGUodXBvcnQpKSkKKwkJcmV0dXJuOworCisJaWYgKG5ld19zdGF0ZSA9PSBVQVJUX1BNX1NUQVRFX09OICYmIG9sZF9zdGF0ZSA9PSBVQVJUX1BNX1NUQVRFX09GRikKKwkJc2VfZ2VuaV9yZXNvdXJjZXNfb24oJm1zbV9wb3J0LT5zZXJpYWxfcnNjKTsKKwllbHNlIGlmIChuZXdfc3RhdGUgPT0gVUFSVF9QTV9TVEFURV9PRkYgJiYKKwkJCW9sZF9zdGF0ZSA9PSBVQVJUX1BNX1NUQVRFX09OKQorCQlzZV9nZW5pX3Jlc291cmNlc19vZmYoJm1zbV9wb3J0LT5zZXJpYWxfcnNjKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBtc21fZ2VuaV9jb25zb2xlX3BvcHMgPSB7CiAJLnR4X2VtcHR5ID0gbXNtX2dlbmlfc2VyaWFsX3R4X2VtcHR5LAogCS5zdG9wX3R4ID0gbXNtX2dlbmlfc2VyaWFsX3N0b3BfdHgsCkBAIC0yMDQ4LDYgKzIxMDksNyBAQAogCS5wb2xsX2dldF9jaGFyCT0gbXNtX2dlbmlfc2VyaWFsX2dldF9jaGFyLAogCS5wb2xsX3B1dF9jaGFyCT0gbXNtX2dlbmlfc2VyaWFsX3BvbGxfcHV0X2NoYXIsCiAjZW5kaWYKKwkucG0gPSBtc21fZ2VuaV9zZXJpYWxfY29uc19wbSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbXNtX2dlbmlfc2VyaWFsX3BvcHMgPSB7CkBAIC0yMzcyLDcgKzI0MzQsNiBAQAogCiAJaWYgKHVhcnRfY29uc29sZSh1cG9ydCkgJiYKIAkgICAgY29uc29sZV9zdXNwZW5kX2VuYWJsZWQgJiYgdXBvcnQtPnN1c3BlbmRlZCkgewotCQlzZV9nZW5pX3Jlc291cmNlc19vbigmcG9ydC0+c2VyaWFsX3JzYyk7CiAJCXVhcnRfcmVzdW1lX3BvcnQoKHN0cnVjdCB1YXJ0X2RyaXZlciAqKXVwb3J0LT5wcml2YXRlX2RhdGEsCiAJCQkJCQkJCQl1cG9ydCk7CiAJCWRpc2FibGVfaXJxKHVwb3J0LT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21zbV9zZXJpYWxfaHMuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsX2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwNWQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsX2hzLmMKQEAgLTAsMCArMSwzODA4IEBACisvKiBkcml2ZXJzL3NlcmlhbC9tc21fc2VyaWFsX2hzLmMKKyAqCisgKiBNU00gN2sgSGlnaCBzcGVlZCB1YXJ0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogTW9kaWZpZWQ6IE5pY2sgUGVsbHkgPG5wZWxseUBnb29nbGUuY29tPgorICoKKyAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlCisgKiBleGNlcHQgd2hlcmUgaW5kaWNhdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEhhcyBvcHRpb25hbCBzdXBwb3J0IGZvciB1YXJ0IHBvd2VyIG1hbmFnZW1lbnQgaW5kZXBlbmRlbnQgb2YgbGludXgKKyAqIHN1c3BlbmQvcmVzdW1lOgorICoKKyAqIFJYIHdha2V1cC4KKyAqIFVBUlQgd2FrZXVwIGNhbiBiZSB0cmlnZ2VyZWQgYnkgUlggYWN0aXZpdHkgKHVzaW5nIGEgd2FrZXVwIEdQSU8gb24gdGhlCisgKiBVQVJUIFJYIHBpbikuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGVyZSBpcyBub3QgYSB3YWtldXAKKyAqIEdQSU8gb24gdGhlIFVBUlQgQ1RTLCBhbmQgdGhlIGZpcnN0IFJYIGJ5dGUgaXMga25vd24gKGZvciBleGFtcGxlLCB3aXRoIHRoZQorICogQmx1ZXRvb3RoIFRleGFzIEluc3RydW1lbnRzIEhDSUxMIHByb3RvY29sKSwgc2luY2UgdGhlIGZpcnN0IFJYIGJ5dGUgd2lsbAorICogYWx3YXlzIGJlIGxvc3QuIFJUUyB3aWxsIGJlIGFzc2VydGVkIGV2ZW4gd2hpbGUgdGhlIFVBUlQgaXMgb2ZmIGluIHRoaXMgbW9kZQorICogb2Ygb3BlcmF0aW9uLiBTZWUgbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kYXRhLnJ4X3dha2V1cF9pcnEuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcGNfbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tc20tc3BzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9tc21fc2VyaWFsX2hzLmg+CisjaW5jbHVkZSA8bGludXgvbXNtLWJ1cy5oPgorCisjaW5jbHVkZSAibXNtX3NlcmlhbF9oc19od3JlZy5oIgorI2RlZmluZSBVQVJUX1NQU19DT05TX1BFUklQSEVSQUwgMAorI2RlZmluZSBVQVJUX1NQU19QUk9EX1BFUklQSEVSQUwgMQorCisjZGVmaW5lIElQQ19NU01fSFNfTE9HX1NUQVRFX1BBR0VTIDIKKyNkZWZpbmUgSVBDX01TTV9IU19MT0dfVVNFUl9QQUdFUyAyCisjZGVmaW5lIElQQ19NU01fSFNfTE9HX0RBVEFfUEFHRVMgMworI2RlZmluZSBVQVJUX0RNQV9ERVNDX05SIDgKKyNkZWZpbmUgQlVGX0RVTVBfU0laRSAzMgorCisvKiBJZiB0aGUgZGVidWdfbWFzayBnZXRzIHNldCB0byBGQVRBTF9MRVYsCisgKiBhIGZhdGFsIGVycm9yIGhhcyBoYXBwZW5lZCBhbmQgZnVydGhlciBJUEMgbG9nZ2luZworICogaXMgZGlzYWJsZWQgc28gdGhhdCB0aGlzIHByb2JsZW0gY2FuIGJlIGRldGVjdGVkCisgKi8KK2VudW0geworCUZBVEFMX0xFViA9IDBVLAorCUVSUl9MRVYgPSAxVSwKKwlXQVJOX0xFViA9IDJVLAorCUlORk9fTEVWID0gM1UsCisJREJHX0xFViA9IDRVLAorfTsKKworI2RlZmluZSBNU01fSFNfREJHKHguLi4pIGRvIHsgXAorCWlmIChtc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrID49IERCR19MRVYpIHsgXAorCQlpZiAobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX2xvZ19jdHh0KSBcCisJCQlpcGNfbG9nX3N0cmluZyhtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQsIHgpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1TTV9IU19JTkZPKHguLi4pIGRvIHsgXAorCWlmIChtc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrID49IElORk9fTEVWKSB7XAorCQlpZiAobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX2xvZ19jdHh0KSBcCisJCQlpcGNfbG9nX3N0cmluZyhtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQsIHgpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisvKiB3YXJuaW5ncyBhbmQgZXJyb3JzIHNob3cgdXAgb24gY29uc29sZSBhbHdheXMgKi8KKyNkZWZpbmUgTVNNX0hTX1dBUk4oeC4uLikgZG8geyBcCisJcHJfd2Fybih4KTsgXAorCWlmIChtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQgJiYgXAorCQkJbXNtX3Vwb3J0LT5pcGNfZGVidWdfbWFzayA+PSBXQVJOX0xFVikgXAorCQlpcGNfbG9nX3N0cmluZyhtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQsIHgpOyBcCit9IHdoaWxlICgwKQorCisvKiBFUlJPUiBjb25kaXRpb24gaW4gdGhlIGRyaXZlciBzZXRzIHRoZSBoc19zZXJpYWxfZGVidWdfbWFzaworICogdG8gRVJSX0ZBVEFMIGxldmVsLCBzbyB0aGF0IHRoaXMgbWVzc2FnZSBjYW4gYmUgc2VlbgorICogaW4gSVBDIGxvZ2dpbmcuIEZ1cnRoZXIgZXJyb3JzIGNvbnRpbnVlIHRvIGxvZyBvbiB0aGUgY29uc29sZQorICovCisjZGVmaW5lIE1TTV9IU19FUlIoeC4uLikgZG8geyBcCisJcHJfZXJyKHgpOyBcCisJaWYgKG1zbV91cG9ydC0+aXBjX21zbV9oc19sb2dfY3R4dCAmJiBcCisJCQltc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrID49IEVSUl9MRVYpIHsgXAorCQlpcGNfbG9nX3N0cmluZyhtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQsIHgpOyBcCisJCW1zbV91cG9ydC0+aXBjX2RlYnVnX21hc2sgPSBGQVRBTF9MRVY7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX1VTUl9NU0coY3R4LCB4Li4uKSBkbyB7IFwKKwlpZiAoY3R4KSBcCisJCWlwY19sb2dfc3RyaW5nKGN0eCwgeCk7IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUaGVyZSBhcmUgMyBkaWZmZXJlbnQga2luZCBvZiBVQVJUIENvcmUgYXZhaWxhYmxlIG9uIE1TTS4KKyAqIEhpZ2ggU3BlZWQgVUFSVCAoaS5lLiBMZWdhY3kgSFNVQVJUKSwgR1NCSSBiYXNlZCBIU1VBUlQKKyAqIGFuZCBCU0xQIGJhc2VkIEhTVUFSVC4KKyAqLworZW51bSB1YXJ0X2NvcmVfdHlwZSB7CisJTEVHQUNZX0hTVUFSVCwKKwlHU0JJX0hTVUFSVCwKKwlCTFNQX0hTVUFSVCwKK307CisKK2VudW0gZmx1c2hfcmVhc29uIHsKKwlGTFVTSF9OT05FLAorCUZMVVNIX0RBVEFfUkVBRFksCisJRkxVU0hfREFUQV9JTlZBTElELCAgLyogdmFsdWVzIGFmdGVyIHRoaXMgaW5kaWNhdGUgaW52YWxpZCBkYXRhICovCisJRkxVU0hfSUdOT1JFLAorCUZMVVNIX1NUT1AsCisJRkxVU0hfU0hVVERPV04sCit9OworCisvKgorICogU1BTIGRhdGEgc3RydWN0dXJlcyB0byBzdXBwb3J0IEhTVUFSVCB3aXRoIEJBTQorICogQHNwc19waXBlIC0gVGhpcyBzdHJ1Y3QgZGVmaW5lcyBCQU0gcGlwZSBkZXNjcmlwdG9yCisgKiBAc3BzX2Nvbm5lY3QgLSBUaGlzIHN0cnVjdCBkZWZpbmVzIGEgY29ubmVjdGlvbidzIGVuZCBwb2ludAorICogQHNwc19yZWdpc3RlciAtIFRoaXMgc3RydWN0IGRlZmluZXMgYSBldmVudCByZWdpc3RyYXRpb24gcGFyYW1ldGVycworICovCitzdHJ1Y3QgbXNtX2hzX3Nwc19lcF9jb25uX2RhdGEgeworCXN0cnVjdCBzcHNfcGlwZSAqcGlwZV9oYW5kbGU7CisJc3RydWN0IHNwc19jb25uZWN0IGNvbmZpZzsKKwlzdHJ1Y3Qgc3BzX3JlZ2lzdGVyX2V2ZW50IGV2ZW50OworfTsKKworc3RydWN0IG1zbV9oc190eCB7CisJYm9vbCBkbWFfaW5fZmxpZ2h0OyAgICAvKiB0eCBkbWEgaW4gcHJvZ3Jlc3MgKi8KKwllbnVtIGZsdXNoX3JlYXNvbiBmbHVzaDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWludCB0eF9jb3VudDsKKwlkbWFfYWRkcl90IGRtYV9iYXNlOworCXN0cnVjdCBrdGhyZWFkX3dvcmsga3dvcms7CisJc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXN0cnVjdCBtc21faHNfc3BzX2VwX2Nvbm5fZGF0YSBjb25zOworCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVvdXRfdGltZXI7CisJdm9pZCAqaXBjX3R4X2N0eHQ7Cit9OworCitzdHJ1Y3QgbXNtX2hzX3J4IHsKKwllbnVtIGZsdXNoX3JlYXNvbiBmbHVzaDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCWRtYV9hZGRyX3QgcmJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9wZW5kaW5nOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZmxpcF9pbnNlcnRfd29yazsKKwlzdHJ1Y3Qga3RocmVhZF93b3JrIGt3b3JrOworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciBrd29ya2VyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgbXNtX2hzX3Nwc19lcF9jb25uX2RhdGEgcHJvZDsKKwl1bnNpZ25lZCBsb25nIHF1ZXVlZF9mbGFnOworCXVuc2lnbmVkIGxvbmcgcGVuZGluZ19mbGFnOworCWludCByeF9pbng7CisJc3RydWN0IHNwc19pb3ZlYyBpb3ZlY1tVQVJUX0RNQV9ERVNDX05SXTsgLyogdHJhY2sgZGVzY3JpcHRvcnMgKi8KKwl2b2lkICppcGNfcnhfY3R4dDsKK307CitlbnVtIGJ1ZmZlcl9zdGF0ZXMgeworCU5PTkVfUEVORElORyA9IDB4MCwKKwlGSUZPX09WRVJSVU4gPSAweDEsCisJUEFSSVRZX0VSUk9SID0gMHgyLAorCUNIQVJTX05PUk1BTCA9IDB4NCwKK307CisKK2VudW0gbXNtX2hzX3BtX3N0YXRlIHsKKwlNU01fSFNfUE1fQUNUSVZFLAorCU1TTV9IU19QTV9TVVNQRU5ERUQsCisJTVNNX0hTX1BNX1NZU19TVVNQRU5ERUQsCit9OworCisvKiBvcHRpb25hbCBsb3cgcG93ZXIgd2FrZXVwLCB0eXBpY2FsbHkgb24gYSBHUElPIFJYIGlycSAqLworc3RydWN0IG1zbV9oc193YWtldXAgeworCWludCBpcnE7ICAvKiA8IDAgaW5kaWNhdGVzIGxvdyBwb3dlciB3YWtldXAgZGlzYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGlnbm9yZTsgIC8qIGJvb2wgKi8KKworCS8qIGJvb2w6IGluamVjdCBjaGFyIGludG8gcnggdHR5IG9uIHdha2V1cCAqLworCWJvb2wgaW5qZWN0X3J4OworCXVuc2lnbmVkIGNoYXIgcnhfdG9faW5qZWN0OworCWJvb2wgZW5hYmxlZDsKKwlib29sIGZyZWVkOworfTsKKworc3RydWN0IG1zbV9oc19wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0IHVwb3J0OworCXVuc2lnbmVkIGxvbmcgaW1yX3JlZzsgIC8qIHNoYWRvdyB2YWx1ZSBvZiBVQVJURE1fSU1SICovCisJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGsgKnBjbGs7CisJc3RydWN0IG1zbV9oc190eCB0eDsKKwlzdHJ1Y3QgbXNtX2hzX3J4IHJ4OworCWF0b21pY190IHJlc291cmNlX2NvdW50OworCXN0cnVjdCBtc21faHNfd2FrZXVwIHdha2V1cDsKKworCXN0cnVjdCBkZW50cnkgKmxvb3BiYWNrX2RpcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2xvY2tfb2ZmX3c7IC8qIHdvcmsgZm9yIGFjdHVhbCBjbG9jayBvZmYgKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqaHN1YXJ0X3dxOyAvKiBoc3VhcnQgd29ya3F1ZXVlICovCisJc3RydWN0IG11dGV4IG10eDsgLyogcmVzb3VyY2UgYWNjZXNzIG11dGV4ICovCisJZW51bSB1YXJ0X2NvcmVfdHlwZSB1YXJ0X3R5cGU7CisJdW5zaWduZWQgbG9uZyBiYW1faGFuZGxlOworCXJlc291cmNlX3NpemVfdCBiYW1fbWVtOworCWludCBiYW1faXJxOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqYmFtX2Jhc2U7CisJdW5zaWduZWQgaW50IGJhbV90eF9lcF9waXBlX2luZGV4OworCXVuc2lnbmVkIGludCBiYW1fcnhfZXBfcGlwZV9pbmRleDsKKwkvKiBzdHJ1Y3Qgc3BzX2V2ZW50X25vdGlmeSBpcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0cmlnZ2VyaW5nIGEKKwkgKiBjYWxsYmFjayBldmVudCBvYmplY3QgcmVnaXN0ZXJlZCBmb3IgYW4gU1BTIGNvbm5lY3Rpb24gZW5kIHBvaW50LgorCSAqLworCXN0cnVjdCBzcHNfZXZlbnRfbm90aWZ5IG5vdGlmeTsKKwkvKiBidXMgY2xpZW50IGhhbmRsZXIgKi8KKwl1MzIgYnVzX3BlcmZfY2xpZW50OworCS8qIEJMU1AgVUFSVCByZXF1aXJlZCBCVVMgU2NhbGluZyBkYXRhICovCisJc3RydWN0IG1zbV9idXNfc2NhbGVfcGRhdGEgKmJ1c19zY2FsZV90YWJsZTsKKwlib29sIHJ4X2JhbV9pbnByb2dyZXNzOworCXdhaXRfcXVldWVfaGVhZF90IGJhbV9kaXNjb25uZWN0X3dhaXQ7CisJYm9vbCB1c2VfcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqZ3Bpb19zdGF0ZV9hY3RpdmU7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgKmdwaW9fc3RhdGVfc3VzcGVuZDsKKwlib29sIGZsb3dfY29udHJvbDsKKwllbnVtIG1zbV9oc19wbV9zdGF0ZSBwbV9zdGF0ZTsKKwlhdG9taWNfdCBjbGllbnRfY291bnQ7CisJYm9vbCBvYnM7IC8qIG91dCBvZiBiYW5kIHNsZWVwIGZsYWcgKi8KKwlhdG9taWNfdCBjbGllbnRfcmVxX3N0YXRlOworCXZvaWQgKmlwY19tc21faHNfbG9nX2N0eHQ7CisJdm9pZCAqaXBjX21zbV9oc19wd3JfY3R4dDsKKwlpbnQgaXBjX2RlYnVnX21hc2s7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21faHNfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWhzdWFydC12MTQifSwKKwl7fQorfTsKKworCisjZGVmaW5lIE1TTV9VQVJURE1fQlVSU1RfU0laRSAxNiAgIC8qIERNIGJ1cnN0IHNpemUgKGluIGJ5dGVzKSAqLworI2RlZmluZSBVQVJURE1fVFhfQlVGX1NJWkUgVUFSVF9YTUlUX1NJWkUKKyNkZWZpbmUgVUFSVERNX1JYX0JVRl9TSVpFIDUxMgorI2RlZmluZSBSRVRSWV9USU1FT1VUIDUKKyNkZWZpbmUgVUFSVERNX05SIDI1NgorI2RlZmluZSBCQU1fUElQRV9NSU4gMAorI2RlZmluZSBCQU1fUElQRV9NQVggMTEKKyNkZWZpbmUgQlVTX1NDQUxJTkcgMQorI2RlZmluZSBCVVNfUkVTRVQgMAorI2RlZmluZSBSWF9GTFVTSF9DT01QTEVURV9USU1FT1VUIDMwMCAvKiBJbiBqaWZmaWVzICovCisjZGVmaW5lIEJMU1BfVUFSVF9DTEtfRk1BWCA2MzE2MDAwMAorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdfYmFzZTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9zZXJpYWxfaHNfcGxhdGZvcm1fZHJpdmVyOworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBtc21faHNfZHJpdmVyOworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBtc21faHNfb3BzOworc3RhdGljIHZvaWQgbXNtX2hzX3N0YXJ0X3J4X2xvY2tlZChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCk7CitzdGF0aWMgdm9pZCBtc21fc2VyaWFsX2hzX3J4X3dvcmsoc3RydWN0IGt0aHJlYWRfd29yayAqd29yayk7CitzdGF0aWMgdm9pZCBmbGlwX2luc2VydF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBtc21faHNfYnVzX3ZvdGluZyhzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCwgdW5zaWduZWQgaW50IHZvdGUpOworc3RhdGljIHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX2hzX2dldF9oc19wb3J0KGludCBwb3J0X2luZGV4KTsKK3N0YXRpYyB2b2lkIG1zbV9oc19xdWV1ZV9yeF9kZXNjKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KTsKK3N0YXRpYyBpbnQgZGlzY29ubmVjdF9yeF9lbmRwb2ludChzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCk7CitzdGF0aWMgaW50IG1zbV9oc19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKKworI2RlZmluZSBVQVJURE1fVE9fTVNNKHVhcnRfcG9ydCkgXAorCWNvbnRhaW5lcl9vZigodWFydF9wb3J0KSwgc3RydWN0IG1zbV9oc19wb3J0LCB1cG9ydCkKKworc3RhdGljIGludCBtc21faHNfaW9jdGwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMCwgc3RhdGUgPSAxOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwlpZiAoIW1zbV91cG9ydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVNNX0VOQUJMRV9VQVJUX0NMT0NLOiB7CisJCXJldCA9IG1zbV9oc19yZXF1ZXN0X2Nsb2NrX29uKCZtc21fdXBvcnQtPnVwb3J0KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgTVNNX0RJU0FCTEVfVUFSVF9DTE9DSzogeworCQlyZXQgPSBtc21faHNfcmVxdWVzdF9jbG9ja19vZmYoJm1zbV91cG9ydC0+dXBvcnQpOworCQlicmVhazsKKwl9CisJY2FzZSBNU01fR0VUX1VBUlRfQ0xPQ0tfU1RBVFVTOiB7CisJCS8qIFJldHVybiB2YWx1ZSAwIC0gVUFSVCBDTE9DSyBpcyBPRkYKKwkJICogUmV0dXJuIHZhbHVlIDEgLSBVQVJUIENMT0NLIGlzIE9OCisJCSAqLworCisJCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpCisJCQlzdGF0ZSA9IDA7CisJCXJldCA9IHN0YXRlOworCQlNU01fSFNfSU5GTygiJXMoKTpHRVQgVUFSVCBDTE9DSyBTVEFUVVM6IGNtZD0lZCBzdGF0ZT0lZFxuIiwKKwkJCV9fZnVuY19fLCBjbWQsIHN0YXRlKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IHsKKwkJTVNNX0hTX0lORk8oIiVzKCk6VW5rbm93biBjbWQgc3BlY2lmaWVkOiBjbWQ9JWRcbiIsIF9fZnVuY19fLAorCQkJICAgY21kKTsKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluaXRpYWxseSBkdXJpbmcgcHJvYmUgYW5kIHRoZW4KKyAqIHRocm91Z2ggdGhlIHJ1bnRpbWUgUE0gZnJhbWV3b3JrLiBUaGUgZnVuY3Rpb24gZGlyZWN0bHkgY2FsbHMKKyAqIHJlc291cmNlIEFQSXMgdG8gZW5hYmxlIHRoZW0uCisgKi8KKworc3RhdGljIGludCBtc21faHNfY2xrX2J1c192b3RlKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCWludCByYyA9IDA7CisKKwltc21faHNfYnVzX3ZvdGluZyhtc21fdXBvcnQsIEJVU19TQ0FMSU5HKTsKKwkvKiBUdXJuIG9uIGNvcmUgY2xrIGFuZCBpZmFjZSBjbGsgKi8KKwlpZiAobXNtX3Vwb3J0LT5wY2xrKSB7CisJCXJjID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV91cG9ydC0+cGNsayk7CisJCWlmIChyYykgeworCQkJZGV2X2Vycihtc21fdXBvcnQtPnVwb3J0LmRldiwKKwkJCQkiJXM6IENvdWxkIG5vdCB0dXJuIG9uIHBjbGsgWyVkXVxuIiwKKwkJCQlfX2Z1bmNfXywgcmMpOworCQkJZ290byBidXNyZXNldDsKKwkJfQorCX0KKwlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21fdXBvcnQtPmNsayk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIobXNtX3Vwb3J0LT51cG9ydC5kZXYsCisJCQkiJXM6IENvdWxkIG5vdCB0dXJuIG9uIGNvcmUgY2xrIFslZF1cbiIsCisJCQlfX2Z1bmNfXywgcmMpOworCQlnb3RvIGNvcmVfdW5wcmVwYXJlOworCX0KKwlNU01fSFNfREJHKCIlczogQ2xvY2sgT04gc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOworCXJldHVybiByYzsKK2NvcmVfdW5wcmVwYXJlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21fdXBvcnQtPnBjbGspOworYnVzcmVzZXQ6CisJbXNtX2hzX2J1c192b3RpbmcobXNtX3Vwb3J0LCBCVVNfUkVTRVQpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluaXRpYWxseSBkdXJpbmcgcHJvYmUgYW5kIHRoZW4KKyAqIHRocm91Z2ggdGhlIHJ1bnRpbWUgUE0gZnJhbWV3b3JrLiBUaGUgZnVuY3Rpb24gZGlyZWN0bHkgY2FsbHMKKyAqIHJlc291cmNlIGFwaXMgdG8gZGlzYWJsZSB0aGVtLgorICovCitzdGF0aWMgdm9pZCBtc21faHNfY2xrX2J1c191bnZvdGUoc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQpCit7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV91cG9ydC0+Y2xrKTsKKwlpZiAobXNtX3Vwb3J0LT5wY2xrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX3Vwb3J0LT5wY2xrKTsKKwltc21faHNfYnVzX3ZvdGluZyhtc21fdXBvcnQsIEJVU19SRVNFVCk7CisJTVNNX0hTX0RCRygiJXM6IENsb2NrIE9GRiBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7Cit9CisKKyAvKiBSZW1vdmUgdm90ZSBmb3IgcmVzb3VyY2VzIHdoZW4gZG9uZSAqLworc3RhdGljIHZvaWQgbXNtX2hzX3Jlc291cmNlX3Vudm90ZShzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJaW50IHJjID0gYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+cmVzb3VyY2VfY291bnQpOworCisJTVNNX0hTX0RCRygiJXMoKTogcG93ZXIgdXNhZ2UgY291bnQgJWQiLCBfX2Z1bmNfXywgcmMpOworCWlmIChyYyA8PSAwKSB7CisJCU1TTV9IU19XQVJOKCIlcygpOiByYyB6ZXJvLCBiYWlsaW5nXG4iLCBfX2Z1bmNfXyk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJYXRvbWljX2RlYygmbXNtX3Vwb3J0LT5yZXNvdXJjZV9jb3VudCk7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSh1cG9ydC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCh1cG9ydC0+ZGV2KTsKK30KKworIC8qIFZvdGUgZm9yIHJlc291cmNlcyBiZWZvcmUgYWNjZXNzaW5nIHRoZW0gKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19yZXNvdXJjZV92b3RlKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCWludCByZXQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmKG1zbV91cG9ydC0+dXBvcnQpOworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyh1cG9ydC0+ZGV2KTsKKwlpZiAocmV0IDwgMCB8fCBtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpIHsKKwkJTVNNX0hTX1dBUk4oIiVzOiVzIHJ1bnRpbWUgY2FsbGJhY2sgbm90IGludm9rZWQgcmV0OiVkIHN0OiVkIiwKKwkJCV9fZnVuY19fLCBkZXZfbmFtZSh1cG9ydC0+ZGV2KSwgcmV0LAorCQkJCQltc21fdXBvcnQtPnBtX3N0YXRlKTsKKwkJbXNtX2hzX3BtX3Jlc3VtZSh1cG9ydC0+ZGV2KTsKKwl9CisJYXRvbWljX2luYygmbXNtX3Vwb3J0LT5yZXNvdXJjZV9jb3VudCk7Cit9CisKKy8qIENoZWNrIGlmIHRoZSB1cG9ydCBsaW5lIG51bWJlciBtYXRjaGVzIHdpdGggdXNlciBpZCBzdG9yZWQgaW4gcGRhdGEuCisgKiBVc2VyIGlkIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFRoaXMgZnVuY3Rpb24KKyAqIGVuc3VlcyB0aGF0IHRoZSBzYW1lIGRldmljZSBpcyBzZWxlY3RlZAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2hzX3BvcnQgKmdldF9tYXRjaGluZ19oc19wb3J0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1zbV9zZXJpYWxfaHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IG1zbV9oc19nZXRfaHNfcG9ydChwZGV2LT5pZCk7CisKKwlpZiAoKCFtc21fdXBvcnQpIHx8IChtc21fdXBvcnQtPnVwb3J0LmxpbmUgIT0gcGRldi0+aWQKKwkgICAmJiBtc21fdXBvcnQtPnVwb3J0LmxpbmUgIT0gcGRhdGEtPnVzZXJpZCkpIHsKKwkJcHJfZXJyKCJ1cG9ydCBsaW5lIG51bWJlciBtaXNtYXRjaCEiKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG1zbV91cG9ydDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19jbG9jayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJaW50IHN0YXRlID0gMTsKKwlzc2l6ZV90IHJldCA9IDA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdAorCQkJCQkJICAgIHBsYXRmb3JtX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IGdldF9tYXRjaGluZ19oc19wb3J0KHBkZXYpOworCisJLyogVGhpcyBjaGVjayBzaG91bGQgbm90IGZhaWwgKi8KKwlpZiAobXNtX3Vwb3J0KSB7CisJCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpCisJCQlzdGF0ZSA9IDA7CisJCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0YXRlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2Nsb2NrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHN0YXRlOworCXNzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0CisJCQkJCQkgICAgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gZ2V0X21hdGNoaW5nX2hzX3BvcnQocGRldik7CisKKwkvKiBUaGlzIGNoZWNrIHNob3VsZCBub3QgZmFpbCAqLworCWlmIChtc21fdXBvcnQpIHsKKwkJc3RhdGUgPSBidWZbMF0gLSAnMCc7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSAwOgorCQkJTVNNX0hTX0RCRygiJXM6IFJlcXVlc3QgY2xvY2sgT0ZGXG4iLCBfX2Z1bmNfXyk7CisJCQltc21faHNfcmVxdWVzdF9jbG9ja19vZmYoJm1zbV91cG9ydC0+dXBvcnQpOworCQkJcmV0ID0gY291bnQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJTVNNX0hTX0RCRygiJXM6IFJlcXVlc3QgY2xvY2sgT05cbiIsIF9fZnVuY19fKTsKKwkJCW1zbV9oc19yZXF1ZXN0X2Nsb2NrX29uKCZtc21fdXBvcnQtPnVwb3J0KTsKKwkJCXJldCA9IGNvdW50OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjbG9jaywgMDY0NCwgc2hvd19jbG9jaywgc2V0X2Nsb2NrKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19kZWJ1Z19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldCA9IDA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdAorCQkJCQkJICAgIHBsYXRmb3JtX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IGdldF9tYXRjaGluZ19oc19wb3J0KHBkZXYpOworCisJLyogVGhpcyBjaGVjayBzaG91bGQgbm90IGZhaWwgKi8KKwlpZiAobXNtX3Vwb3J0KQorCQlyZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihpbnQpLCAiJXVcbiIsCisJCQkJCW1zbV91cG9ydC0+aXBjX2RlYnVnX21hc2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9kZWJ1Z19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdAorCQkJCQkJICAgIHBsYXRmb3JtX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IGdldF9tYXRjaGluZ19oc19wb3J0KHBkZXYpOworCisJLyogVGhpcyBjaGVjayBzaG91bGQgbm90IGZhaWwgKi8KKwlpZiAobXNtX3Vwb3J0KSB7CisJCW1zbV91cG9ydC0+aXBjX2RlYnVnX21hc2sgPSBidWZbMF0gLSAnMCc7CisJCWlmIChtc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrIDwgRkFUQUxfTEVWIHx8CisJCQkJbXNtX3Vwb3J0LT5pcGNfZGVidWdfbWFzayA+IERCR19MRVYpIHsKKwkJCS8qIHNldCB0byBkZWZhdWx0IGxldmVsICovCisJCQltc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrID0gSU5GT19MRVY7CisJCQlNU01fSFNfRVJSKCJSYW5nZSBpcyAwIHRvIDQ7U2V0IHRvIGRlZmF1bHQgbGV2ZWwgM1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWJ1Z19tYXNrLCAwNjQ0LCBzaG93X2RlYnVnX21hc2ssCisJCQkJCQkJc2V0X2RlYnVnX21hc2spOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlX2xvd19wb3dlcl93YWtldXAoc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQpCit7CisJcmV0dXJuIG1zbV91cG9ydC0+d2FrZXVwLmlycSA+IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9oc19idXNfdm90aW5nKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0LCB1bnNpZ25lZCBpbnQgdm90ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKG1zbV91cG9ydC0+YnVzX3BlcmZfY2xpZW50KSB7CisJCU1TTV9IU19EQkcoIkJ1cyB2b3Rpbmc6JWRcbiIsIHZvdGUpOworCQlyZXQgPSBtc21fYnVzX3NjYWxlX2NsaWVudF91cGRhdGVfcmVxdWVzdCgKKwkJCQltc21fdXBvcnQtPmJ1c19wZXJmX2NsaWVudCwgdm90ZSk7CisJCWlmIChyZXQpCisJCQlNU01fSFNfRVJSKCIlcygpOiBGYWlsZWQgZm9yIEJ1cyB2b3Rpbmc6ICVkXG4iLAorCQkJCQkJCV9fZnVuY19fLCB2b3RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1zbV9oc19yZWFkKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIHJlYWRsX3JlbGF4ZWQodXBvcnQtPm1lbWJhc2UgKyBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtc21faHNfd3JpdGUoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCQkgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXdyaXRlbF9yZWxheGVkKHZhbHVlLCB1cG9ydC0+bWVtYmFzZSArIGluZGV4KTsKK30KKworc3RhdGljIGludCBzcHNfcnhfZGlzY29ubmVjdChzdHJ1Y3Qgc3BzX3BpcGUgKnNwc19waXBlX2hhbmRsZXIpCit7CisJc3RydWN0IHNwc19jb25uZWN0IGNvbmZpZzsKKwlpbnQgcmV0OworCisJcmV0ID0gc3BzX2dldF9jb25maWcoc3BzX3BpcGVfaGFuZGxlciwgJmNvbmZpZyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBzcHNfZ2V0X2NvbmZpZygpIGZhaWxlZCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwljb25maWcub3B0aW9ucyB8PSBTUFNfT19QT0xMOworCXJldCA9IHNwc19zZXRfY29uZmlnKHNwc19waXBlX2hhbmRsZXIsICZjb25maWcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogc3BzX3NldF9jb25maWcoKSBmYWlsZWQgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHNwc19kaXNjb25uZWN0KHNwc19waXBlX2hhbmRsZXIpOworfQorCitzdGF0aWMgdm9pZCBoZXhfZHVtcF9pcGMoc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQsIHZvaWQgKmlwY19jdHgsCisJCQljaGFyICpwcmVmaXgsIGNoYXIgKnN0cmluZywgdTY0IGFkZHIsIGludCBzaXplKQorCit7CisJY2hhciBidWZbKEJVRl9EVU1QX1NJWkUgKiAzKSArIDJdOworCWludCBsZW4gPSAwOworCisJbGVuID0gbWluKHNpemUsIEJVRl9EVU1QX1NJWkUpOworCS8qCisJICogUHJpbnQgdXB0byAzMiBkYXRhIGJ5dGVzLCAzMiBieXRlcyBwZXIgbGluZSwgMSBieXRlIGF0IGEgdGltZSBhbmQKKwkgKiBkb24ndCBpbmNsdWRlIHRoZSBBU0NJSSB0ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkgKi8KKwloZXhfZHVtcF90b19idWZmZXIoc3RyaW5nLCBsZW4sIDMyLCAxLCBidWYsIHNpemVvZihidWYpLCBmYWxzZSk7CisJaXBjX2xvZ19zdHJpbmcoaXBjX2N0eCwgIiVzWzB4JS4xMHg6JWRdIDogJXMiLCBwcmVmaXgsCisJCQkJCSh1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSwgYnVmKTsKK30KKworLyoKKyAqIFRoaXMgQVBJIHJlYWQgYW5kIHByb3ZpZGVzIFVBUlQgQ29yZSByZWdpc3RlcnMgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBfdWFydF9oc19yZWdpc3RlcnMoc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmKG1zbV91cG9ydC0+dXBvcnQpOworCisJaWYgKG1zbV91cG9ydC0+cG1fc3RhdGUgIT0gTVNNX0hTX1BNX0FDVElWRSkgeworCQlNU01fSFNfSU5GTygiJXM6RmFpbGVkIGNsb2NrcyBhcmUgb2ZmLCByZXNvdXJjZV9jb3VudCAlZCIsCisJCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+cmVzb3VyY2VfY291bnQpKTsKKwkJcmV0dXJuOworCX0KKworCU1TTV9IU19EQkcoCisJIk1SMToleCBNUjI6JXggVEZXUjoleCBSRldSOiV4IERNRU46JXggSU1SOiV4IE1JU1I6JXggTkNGX1RYOiV4XG4iLAorCW1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX01SMSksCisJbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fTVIyKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9URldSKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9SRldSKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETUVOKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9JTVIpLAorCW1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX01JU1IpLAorCW1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX05DRl9UWCkpOworCU1TTV9IU19JTkZPKCJTUjoleCBJU1I6JXggRE1SWDoleCBSWF9TTkFQOiV4IFRYRlM6JXggUlhGUzoleFxuIiwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9TUiksCisJbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fSVNSKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETVJYKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9SWF9UT1RBTF9TTkFQKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9UWEZTKSwKKwltc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9SWEZTKSk7CisJTVNNX0hTX0RCRygicnguZmx1c2g6JXVcbiIsIG1zbV91cG9ydC0+cnguZmx1c2gpOworfQorCitzdGF0aWMgaW50IG1zbV9zZXJpYWxfbG9vcGJhY2tfZW5hYmxlX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gZGF0YTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisKKwlpZiAodmFsKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9NUjIpOworCQlyZXQgfD0gKFVBUlRETV9NUjJfTE9PUF9NT0RFX0JNU0sgfAorCQkJVUFSVERNX01SMl9SRlJfQ1RTX0xPT1BfTU9ERV9CTVNLKTsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX01SMiwgcmV0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fTVIyKTsKKwkJcmV0ICY9IH4oVUFSVERNX01SMl9MT09QX01PREVfQk1TSyB8CisJCQlVQVJURE1fTVIyX1JGUl9DVFNfTE9PUF9NT0RFX0JNU0spOworCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fTVIyLCByZXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCX0KKwkvKiBDYWxsaW5nIENMT0NLIEFQSS4gSGVuY2UgbWIoKSByZXF1aXJlcyBoZXJlLiAqLworCW1iKCk7CisKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX3NlcmlhbF9sb29wYmFja19lbmFibGVfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gZGF0YTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBtc21faHNfcmVhZCgmbXNtX3Vwb3J0LT51cG9ydCwgVUFSVF9ETV9NUjIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisKKwkqdmFsID0gKHJldCAmIFVBUlRETV9NUjJfTE9PUF9NT0RFX0JNU0spID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGxvb3BiYWNrX2VuYWJsZV9mb3BzLCBtc21fc2VyaWFsX2xvb3BiYWNrX2VuYWJsZV9nZXQsCisJCQltc21fc2VyaWFsX2xvb3BiYWNrX2VuYWJsZV9zZXQsICIlbGx1XG4iKTsKKworLyoKKyAqIG1zbV9zZXJpYWxfaHMgZGVidWdmcyBub2RlOiA8ZGVidWdmc19yb290Pi9tc21fc2VyaWFsX2hzL2xvb3BiYWNrLjxpZD4KKyAqIHdyaXRpbmcgMSB0dXJucyBvbiBpbnRlcm5hbCBsb29wYmFjayBtb2RlIGluIEhXLiBVc2VmdWwgZm9yIGF1dG9tYXRpb24KKyAqIHRlc3Qgc2NyaXB0cy4KKyAqIHdyaXRpbmcgMCBkaXNhYmxlcyB0aGUgaW50ZXJuYWwgbG9vcGJhY2sgbW9kZS4gRGVmYXVsdCBpcyBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgbXNtX3NlcmlhbF9kZWJ1Z2ZzX2luaXQoc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQsCisJCQkJCSAgIGludCBpZCkKK3sKKwljaGFyIG5vZGVfbmFtZVsxNV07CisKKwlzbnByaW50Zihub2RlX25hbWUsIHNpemVvZihub2RlX25hbWUpLCAibG9vcGJhY2suJWQiLCBpZCk7CisJbXNtX3Vwb3J0LT5sb29wYmFja19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5vZGVfbmFtZSwKKwkJCQkJCTA2NDQsCisJCQkJCQlkZWJ1Z19iYXNlLAorCQkJCQkJbXNtX3Vwb3J0LAorCQkJCQkJJmxvb3BiYWNrX2VuYWJsZV9mb3BzKTsKKworCWlmIChJU19FUlJfT1JfTlVMTChtc21fdXBvcnQtPmxvb3BiYWNrX2RpcikpCisJCU1TTV9IU19FUlIoIiVzKCk6IENhbm5vdCBjcmVhdGUgbG9vcGJhY2suJWQgZGVidWcgZW50cnkiLAorCQkJCQkJCV9fZnVuY19fLCBpZCk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2hzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQ7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKHBkZXYtPmlkIDwgMCB8fCBwZGV2LT5pZCA+PSBVQVJURE1fTlIpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHBsYWZvcm0gZGV2aWNlIElEID0gJWRcbiIsIHBkZXYtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNtX3Vwb3J0ID0gZ2V0X21hdGNoaW5nX2hzX3BvcnQocGRldik7CisJaWYgKCFtc21fdXBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gbXNtX3Vwb3J0LT51cG9ydC5kZXY7CisJc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfY2xvY2suYXR0cik7CisJc3lzZnNfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfZGVidWdfbWFzay5hdHRyKTsKKwlkZWJ1Z2ZzX3JlbW92ZShtc21fdXBvcnQtPmxvb3BiYWNrX2Rpcik7CisKKwlkbWFfZnJlZV9jb2hlcmVudChtc21fdXBvcnQtPnVwb3J0LmRldiwKKwkJCVVBUlRfRE1BX0RFU0NfTlIgKiBVQVJURE1fUlhfQlVGX1NJWkUsCisJCQltc21fdXBvcnQtPnJ4LmJ1ZmZlciwgbXNtX3Vwb3J0LT5yeC5yYnVmZmVyKTsKKworCW1zbV91cG9ydC0+cnguYnVmZmVyID0gTlVMTDsKKwltc21fdXBvcnQtPnJ4LnJidWZmZXIgPSAwOworCisJZGVzdHJveV93b3JrcXVldWUobXNtX3Vwb3J0LT5oc3VhcnRfd3EpOworCW11dGV4X2Rlc3Ryb3koJm1zbV91cG9ydC0+bXR4KTsKKworCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZtc21faHNfZHJpdmVyLCAmbXNtX3Vwb3J0LT51cG9ydCk7CisJY2xrX3B1dChtc21fdXBvcnQtPmNsayk7CisJaWYgKG1zbV91cG9ydC0+cGNsaykKKwkJY2xrX3B1dChtc21fdXBvcnQtPnBjbGspOworCisJaW91bm1hcChtc21fdXBvcnQtPnVwb3J0Lm1lbWJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogQ29ubmVjdCBhIFVBUlQgcGVyaXBoZXJhbCdzIFNQUyBlbmRwb2ludChjb25zdW1lciBlbmRwb2ludCkKKyAqCisgKiBBbHNvIHJlZ2lzdGVycyBhIFNQUyBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIGNvbnN1bWVyCisgKiBwcm9jZXNzIHdpdGggdGhlIFNQUyBkcml2ZXIKKyAqCisgKiBAdXBvcnQgLSBQb2ludGVyIHRvIHVhcnQgdXBvcnQgc3RydWN0dXJlCisgKgorICogQHJldHVybiAtIDAgaWYgc3VjY2Vzc2Z1bCBlbHNlIG5lZ2F0aXZlIHZhbHVlLgorICoKKyAqLworCitzdGF0aWMgaW50IG1zbV9oc19zcHNjb25uZWN0X3R4KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCWludCByZXQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmbXNtX3Vwb3J0LT51cG9ydDsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCXN0cnVjdCBzcHNfcGlwZSAqc3BzX3BpcGVfaGFuZGxlID0gdHgtPmNvbnMucGlwZV9oYW5kbGU7CisJc3RydWN0IHNwc19jb25uZWN0ICpzcHNfY29uZmlnID0gJnR4LT5jb25zLmNvbmZpZzsKKwlzdHJ1Y3Qgc3BzX3JlZ2lzdGVyX2V2ZW50ICpzcHNfZXZlbnQgPSAmdHgtPmNvbnMuZXZlbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmICh0eC0+Zmx1c2ggIT0gRkxVU0hfU0hVVERPV04pIHsKKwkJTVNNX0hTX0VSUigiJXM6SW52YWxpZCBmbHVzaCBzdGF0ZTolZFxuIiwgX19mdW5jX18sIHR4LT5mbHVzaCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEVzdGFibGlzaCBjb25uZWN0aW9uIGJldHdlZW4gcGVyaXBoZXJhbCBhbmQgbWVtb3J5IGVuZHBvaW50ICovCisJcmV0ID0gc3BzX2Nvbm5lY3Qoc3BzX3BpcGVfaGFuZGxlLCBzcHNfY29uZmlnKTsKKwlpZiAocmV0KSB7CisJCU1TTV9IU19FUlIoIm1zbV9zZXJpYWxfaHM6IHNwc19jb25uZWN0KCkgZmFpbGVkIGZvciB0eCEhXG4iCisJCSJwaXBlX2hhbmRsZT0weCVwIHJldD0lZCIsIHNwc19waXBlX2hhbmRsZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogUmVnaXN0ZXIgY2FsbGJhY2sgZXZlbnQgZm9yIEVPVCAoRW5kIG9mIHRyYW5zZmVyKSBldmVudC4gKi8KKwlyZXQgPSBzcHNfcmVnaXN0ZXJfZXZlbnQoc3BzX3BpcGVfaGFuZGxlLCBzcHNfZXZlbnQpOworCWlmIChyZXQpIHsKKwkJTVNNX0hTX0VSUigibXNtX3NlcmlhbF9oczogc3BzX2Nvbm5lY3QoKSBmYWlsZWQgZm9yIHR4ISFcbiIKKwkJInBpcGVfaGFuZGxlPTB4JXAgcmV0PSVkIiwgc3BzX3BpcGVfaGFuZGxlLCByZXQpOworCQlnb3RvIHJlZ19ldmVudF9lcnI7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJihtc21fdXBvcnQtPnVwb3J0LmxvY2spLCBmbGFncyk7CisJbXNtX3Vwb3J0LT50eC5mbHVzaCA9IEZMVVNIX1NUT1A7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKG1zbV91cG9ydC0+dXBvcnQubG9jayksIGZsYWdzKTsKKworCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETUVOKTsKKwkvKiBFbmFibGUgVUFSVERNIFR4IEJBTSBJbnRlcmZhY2UgKi8KKwlkYXRhIHw9IFVBUlRETV9UWF9CQU1fRU5BQkxFX0JNU0s7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0RNRU4sIGRhdGEpOworCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBSRVNFVF9UWCk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBTVEFSVF9UWF9CQU1fSUZDKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFVBUlRETV9DUl9UWF9FTl9CTVNLKTsKKworCU1TTV9IU19EQkcoIiVzKCk6IFRYIENvbm5lY3QiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK3JlZ19ldmVudF9lcnI6CisJc3BzX2Rpc2Nvbm5lY3Qoc3BzX3BpcGVfaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb25uZWN0IGEgVUFSVCBwZXJpcGhlcmFsJ3MgU1BTIGVuZHBvaW50KHByb2R1Y2VyIGVuZHBvaW50KQorICoKKyAqIEFsc28gcmVnaXN0ZXJzIGEgU1BTIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgcHJvZHVjZXIKKyAqIHByb2Nlc3Mgd2l0aCB0aGUgU1BTIGRyaXZlcgorICoKKyAqIEB1cG9ydCAtIFBvaW50ZXIgdG8gdWFydCB1cG9ydCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJuIC0gMCBpZiBzdWNjZXNzZnVsIGVsc2UgbmVnYXRpdmUgdmFsdWUuCisgKgorICovCisKK3N0YXRpYyBpbnQgbXNtX2hzX3Nwc2Nvbm5lY3Rfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisJc3RydWN0IHNwc19waXBlICpzcHNfcGlwZV9oYW5kbGUgPSByeC0+cHJvZC5waXBlX2hhbmRsZTsKKwlzdHJ1Y3Qgc3BzX2Nvbm5lY3QgKnNwc19jb25maWcgPSAmcngtPnByb2QuY29uZmlnOworCXN0cnVjdCBzcHNfcmVnaXN0ZXJfZXZlbnQgKnNwc19ldmVudCA9ICZyeC0+cHJvZC5ldmVudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRXN0YWJsaXNoIGNvbm5lY3Rpb24gYmV0d2VlbiBwZXJpcGhlcmFsIGFuZCBtZW1vcnkgZW5kcG9pbnQgKi8KKwlyZXQgPSBzcHNfY29ubmVjdChzcHNfcGlwZV9oYW5kbGUsIHNwc19jb25maWcpOworCWlmIChyZXQpIHsKKwkJTVNNX0hTX0VSUigibXNtX3NlcmlhbF9oczogc3BzX2Nvbm5lY3QoKSBmYWlsZWQgZm9yIHJ4ISFcbiIKKwkJInBpcGVfaGFuZGxlPTB4JXAgcmV0PSVkIiwgc3BzX3BpcGVfaGFuZGxlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZWdpc3RlciBjYWxsYmFjayBldmVudCBmb3IgREVTQ19ET05FIGV2ZW50LiAqLworCXJldCA9IHNwc19yZWdpc3Rlcl9ldmVudChzcHNfcGlwZV9oYW5kbGUsIHNwc19ldmVudCk7CisJaWYgKHJldCkgeworCQlNU01fSFNfRVJSKCJtc21fc2VyaWFsX2hzOiBzcHNfY29ubmVjdCgpIGZhaWxlZCBmb3IgcnghIVxuIgorCQkicGlwZV9oYW5kbGU9MHglcCByZXQ9JWQiLCBzcHNfcGlwZV9oYW5kbGUsIHJldCk7CisJCWdvdG8gcmVnX2V2ZW50X2VycjsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJaWYgKG1zbV91cG9ydC0+cngucGVuZGluZ19mbGFnKQorCQlNU01fSFNfV0FSTigiJXMoKTogQnVmZmVycyBtYXkgYmUgcGVuZGluZyAweCVseCIsCisJCV9fZnVuY19fLCBtc21fdXBvcnQtPnJ4LnBlbmRpbmdfZmxhZyk7CisJbXNtX3Vwb3J0LT5yeC5xdWV1ZWRfZmxhZyA9IDA7CisJbXNtX3Vwb3J0LT5yeC5wZW5kaW5nX2ZsYWcgPSAwOworCW1zbV91cG9ydC0+cngucnhfaW54ID0gMDsKKwltc21fdXBvcnQtPnJ4LmZsdXNoID0gRkxVU0hfU1RPUDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCU1TTV9IU19EQkcoIiVzKCk6IFJYIENvbm5lY3RcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworcmVnX2V2ZW50X2VycjoKKwlzcHNfZGlzY29ubmVjdChzcHNfcGlwZV9oYW5kbGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBwcm9ncmFtcyB0aGUgVUFSVERNX0NTUiByZWdpc3RlciB3aXRoIGNvcnJlY3QgYml0IHJhdGVzCisgKgorICogSW50ZXJydXB0cyBzaG91bGQgYmUgZGlzYWJsZWQgYmVmb3JlIHdlIGFyZSBjYWxsZWQsIGFzCisgKiB3ZSBtb2RpZnkgU2V0IEJhdWQgcmF0ZQorICogU2V0IHJlY2VpdmUgc3RhbGUgaW50ZXJydXB0IGxldmVsLCBkZXBlbmRlbnQgb24gQml0IFJhdGUKKyAqIEdvYWwgaXMgdG8gaGF2ZSBhcm91bmQgOCBtcyBiZWZvcmUgaW5kaWNhdGUgc3RhbGUuCisgKiByb3VuZHVwICgoKEJpdCBSYXRlICogLjAwOCkgLyAxMCkgKyAxCisgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19zZXRfYnBzX2xvY2tlZChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgYnBzKQoreworCXVuc2lnbmVkIGxvbmcgcnhzdGFsZTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKworCXN3aXRjaCAoYnBzKSB7CisJY2FzZSAzMDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4MDApOworCQlyeHN0YWxlID0gMTsKKwkJYnJlYWs7CisJY2FzZSA2MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4MTEpOworCQlyeHN0YWxlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweDIyKTsKKwkJcnhzdGFsZSA9IDE7CisJCWJyZWFrOworCWNhc2UgMjQwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHgzMyk7CisJCXJ4c3RhbGUgPSAxOworCQlicmVhazsKKwljYXNlIDQ4MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4NDQpOworCQlyeHN0YWxlID0gMTsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweDU1KTsKKwkJcnhzdGFsZSA9IDI7CisJCWJyZWFrOworCWNhc2UgMTQ0MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4NjYpOworCQlyeHN0YWxlID0gMzsKKwkJYnJlYWs7CisJY2FzZSAxOTIwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHg3Nyk7CisJCXJ4c3RhbGUgPSA0OworCQlicmVhazsKKwljYXNlIDI4ODAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweDg4KTsKKwkJcnhzdGFsZSA9IDY7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4OTkpOworCQlyeHN0YWxlID0gODsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhhYSk7CisJCXJ4c3RhbGUgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSA3NjgwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhiYik7CisJCXJ4c3RhbGUgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4Y2MpOworCQlyeHN0YWxlID0gMzE7CisJCWJyZWFrOworCWNhc2UgMjMwNDAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweGVlKTsKKwkJcnhzdGFsZSA9IDMxOworCQlicmVhazsKKwljYXNlIDQ2MDgwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhmZik7CisJCXJ4c3RhbGUgPSAzMTsKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCWNhc2UgMzY4NjQwMDoKKwljYXNlIDMyMDAwMDA6CisJY2FzZSAzNTAwMDAwOgorCWNhc2UgMzAwMDAwMDoKKwljYXNlIDI1MDAwMDA6CisJY2FzZSAyMDAwMDAwOgorCWNhc2UgMTUwMDAwMDoKKwljYXNlIDExNTIwMDA6CisJY2FzZSAxMDAwMDAwOgorCWNhc2UgOTIxNjAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweGZmKTsKKwkJcnhzdGFsZSA9IDMxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweGZmKTsKKwkJLyogZGVmYXVsdCB0byA5NjAwICovCisJCWJwcyA9IDk2MDA7CisJCXJ4c3RhbGUgPSAyOworCQlicmVhazsKKwl9CisJLyoKKwkgKiB1YXJ0IGJhdWQgcmF0ZSBkZXBlbmRzIG9uIENTUiBhbmQgTU5EIFZhbHVlcworCSAqIHdlIGFyZSB1cGRhdGluZyBDU1IgYmVmb3JlIGFuZCB0aGVuIGNhbGxpbmcKKwkgKiBjbGtfc2V0X3JhdGUgd2hpY2ggdXBkYXRlcyBNTkQgVmFsdWVzLiBIZW5jZQorCSAqIGRzYiByZXF1aXJlcyBoZXJlLgorCSAqLworCW1iKCk7CisJaWYgKGJwcyA+IDQ2MDgwMCkgeworCQl1cG9ydC0+dWFydGNsayA9IGJwcyAqIDE2OworCQkvKiBCTFNQIGJhc2VkIFVBUlQgc3VwcG9ydHMgbWF4aW11bSBjbG9jayBmcmVxdWVuY3kKKwkJICogb2YgNjMuMTYgTWh6LiBXaXRoIHRoaXMgKDYzLjE2IE1oeikgY2xvY2sgZnJlcXVlbmN5CisJCSAqIFVBUlQgY2FuIHN1cHBvcnQgYmF1ZCByYXRlIG9mIDMuOTQgTWJwcyB3aGljaCBpcworCQkgKiBlcXVpdmFsZW50IHRvIDQgTWJwcy4KKwkJICogVUFSVCBoYXJkd2FyZSBpcyByb2J1c3QgZW5vdWdoIHRvIGhhbmRsZSB0aGlzCisJCSAqIGRldmlhdGlvbiB0byBhY2hpZXZlIGJhdWQgcmF0ZSB+NCBNYnBzLgorCQkgKi8KKwkJaWYgKGJwcyA9PSA0MDAwMDAwKQorCQkJdXBvcnQtPnVhcnRjbGsgPSBCTFNQX1VBUlRfQ0xLX0ZNQVg7CisJfSBlbHNlIHsKKwkJdXBvcnQtPnVhcnRjbGsgPSA3MzcyODAwOworCX0KKworCWlmIChjbGtfc2V0X3JhdGUobXNtX3Vwb3J0LT5jbGssIHVwb3J0LT51YXJ0Y2xrKSkgeworCQlNU01fSFNfV0FSTigiRXJyb3Igc2V0dGluZyBjbG9jayByYXRlIG9uIFVBUlRcbiIpOworCQlXQVJOX09OKDEpOworCX0KKworCWRhdGEgPSByeHN0YWxlICYgVUFSVERNX0lQUl9TVEFMRV9MU0JfQk1TSzsKKwlkYXRhIHw9IFVBUlRETV9JUFJfU1RBTEVfVElNRU9VVF9NU0JfQk1TSyAmIChyeHN0YWxlIDw8IDIpOworCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0lQUiwgZGF0YSk7CisJLyoKKwkgKiBJdCBpcyBzdWdnZXN0ZWQgdG8gZG8gcmVzZXQgb2YgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyIGFmdGVyCisJICogY2hhbmdpbmcgYW55IHByb3RvY29sIGNvbmZpZ3VyYXRpb24uIEhlcmUgQmF1ZCByYXRlIGFuZCBzdGFsZQorCSAqIHRpbWVvdXQgYXJlIGdldHRpbmcgdXBkYXRlZC4gSGVuY2UgcmVzZXQgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyLgorCSAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfVFgpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfUlgpOworfQorCisKK3N0YXRpYyB2b2lkIG1zbV9oc19zZXRfc3RkX2Jwc19sb2NrZWQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJwcykKK3sKKwl1bnNpZ25lZCBsb25nIHJ4c3RhbGU7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCisJc3dpdGNoIChicHMpIHsKKwljYXNlIDk2MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4OTkpOworCQlyeHN0YWxlID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxNDQwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhhYSk7CisJCXJ4c3RhbGUgPSAzOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweGJiKTsKKwkJcnhzdGFsZSA9IDQ7CisJCWJyZWFrOworCWNhc2UgMjg4MDA6CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DU1IsIDB4Y2MpOworCQlyeHN0YWxlID0gNjsKKwkJYnJlYWs7CisJY2FzZSAzODQwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhkZCk7CisJCXJ4c3RhbGUgPSA4OworCQlicmVhazsKKwljYXNlIDU3NjAwOgorCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1NSLCAweGVlKTsKKwkJcnhzdGFsZSA9IDE2OworCQlicmVhazsKKwljYXNlIDExNTIwMDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHhmZik7CisJCXJ4c3RhbGUgPSAzMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NTUiwgMHg5OSk7CisJCS8qIGRlZmF1bHQgdG8gOTYwMCAqLworCQlicHMgPSA5NjAwOworCQlyeHN0YWxlID0gMjsKKwkJYnJlYWs7CisJfQorCisJZGF0YSA9IHJ4c3RhbGUgJiBVQVJURE1fSVBSX1NUQUxFX0xTQl9CTVNLOworCWRhdGEgfD0gVUFSVERNX0lQUl9TVEFMRV9USU1FT1VUX01TQl9CTVNLICYgKHJ4c3RhbGUgPDwgMik7CisKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fSVBSLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2hzX2VuYWJsZV9mbG93X2NvbnRyb2woc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGJvb2wgb3ZlcnJpZGUpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmIChtc21fdXBvcnQtPmZsb3dfY29udHJvbCB8fCBvdmVycmlkZSkgeworCQkvKiBFbmFibGUgUkZSIGxpbmUgKi8KKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBSRlJfTE9XKTsKKwkJLyogRW5hYmxlIGF1dG8gUkZSICovCisJCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9NUjEpOworCQlkYXRhIHw9IFVBUlRETV9NUjFfUlhfUkRZX0NUTF9CTVNLOworCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fTVIxLCBkYXRhKTsKKwkJLyogRW5zdXJlIHJlZ2lzdGVyIElPIGNvbXBsZXRpb24gKi8KKwkJbWIoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9oc19kaXNhYmxlX2Zsb3dfY29udHJvbChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgYm9vbCBvdmVycmlkZSkKK3sKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCXVuc2lnbmVkIGludCBkYXRhOworCisJLyoKKwkgKiBDbGVhciB0aGUgUnggUmVhZHkgQ3RsIGJpdCAtIFRoaXMgZW5zdXJlcyB0aGF0CisJICogZmxvdyBjb250cm9sIGxpbmVzIHN0b3AgdGhlIG90aGVyIHNpZGUgZnJvbSBzZW5kaW5nCisJICogZGF0YSB3aGlsZSB3ZSBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMKKwkgKi8KKworCWlmIChtc21fdXBvcnQtPmZsb3dfY29udHJvbCB8fCBvdmVycmlkZSkgeworCQlkYXRhID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fTVIxKTsKKwkJLyogZGlzYWJsZSBhdXRvIHJlYWR5LWZvci1yZWNlaXZpbmcgKi8KKwkJZGF0YSAmPSB+VUFSVERNX01SMV9SWF9SRFlfQ1RMX0JNU0s7CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9NUjEsIGRhdGEpOworCQkvKiBEaXNhYmxlIFJGUiBsaW5lICovCisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkZSX0hJR0gpOworCQkvKiBFbnN1cmUgcmVnaXN0ZXIgSU8gY29tcGxldGlvbiAqLworCQltYigpOworCX0KK30KKworLyoKKyAqIHRlcm1pb3MgOiAgbmV3IGt0ZXJtaW9zCisgKiBvbGR0ZXJtaW9zOiAgb2xkIGt0ZXJtaW9zIHByZXZpb3VzIHNldHRpbmcKKyAqCisgKiBDb25maWd1cmUgdGhlIHNlcmlhbCBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwKKwkJCQkgICBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCisJCQkJICAgc3RydWN0IGt0ZXJtaW9zICpvbGR0ZXJtaW9zKQoreworCXVuc2lnbmVkIGludCBicHM7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXVuc2lnbmVkIGludCBjX2NmbGFnID0gdGVybWlvcy0+Y19jZmxhZzsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCisJLyoqCisJICogc2V0X3Rlcm1pb3MgY2FuIGJlIGludm9rZWQgZnJvbSB0aGUgZnJhbWV3b3JrIHdoZW4KKwkgKiB0aGUgY2xvY2tzIGFyZSBvZmYgYW5kIHRoZSBjbGllbnQgaGFzIG5vdCBoYWQgYSBjaGFuY2UKKwkgKiB0byB0dXJuIHRoZW0gb24uIE1ha2Ugc3VyZSB0aGF0IHRoZXkgYXJlIG9uCisJICovCisJbXNtX2hzX3Jlc291cmNlX3ZvdGUobXNtX3Vwb3J0KTsKKwltdXRleF9sb2NrKCZtc21fdXBvcnQtPm10eCk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0lNUiwgMCk7CisKKwltc21faHNfZGlzYWJsZV9mbG93X2NvbnRyb2wodXBvcnQsIHRydWUpOworCisJLyoKKwkgKiBEaXNhYmxlIFJ4IGNoYW5uZWwgb2YgVUFSVERNCisJICogRE1BIFJ4IFN0YWxsIGhhcHBlbnMgaWYgZW5xdWV1ZSBhbmQgZmx1c2ggb2YgUnggY29tbWFuZCBoYXBwZW5zCisJICogY29uY3VycmVudGx5LiBIZW5jZSBiZWZvcmUgY2hhbmdpbmcgdGhlIGJhdWQgcmF0ZS9wcm90b2NvbAorCSAqIGNvbmZpZ3VyYXRpb24gYW5kIHNlbmRpbmcgZmx1c2ggY29tbWFuZCB0byBBRE0sIGRpc2FibGUgdGhlIFJ4CisJICogY2hhbm5lbCBvZiBVQVJURE0uCisJICogTm90ZTogc2hvdWxkIG5vdCByZXNldCB0aGUgcmVjZWl2ZXIgaGVyZSBpbW1lZGlhdGVseSBhcyBpdCBpcyBub3QKKwkgKiBzdWdnZXN0ZWQgdG8gZG8gZGlzYWJsZS9yZXNldCBvciByZXNldC9kaXNhYmxlIGF0IHRoZSBzYW1lIHRpbWUuCisJICovCisJZGF0YSA9IG1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX0RNRU4pOworCS8qIERpc2FibGUgVUFSVERNIFJYIEJBTSBJbnRlcmZhY2UgKi8KKwlkYXRhICY9IH5VQVJURE1fUlhfQkFNX0VOQUJMRV9CTVNLOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9ETUVOLCBkYXRhKTsKKworCS8qCisJICogUmVzZXQgUlggYW5kIFRYLgorCSAqIFJlc2V0dGluZyB0aGUgUlggZW5hYmxlcyBpdCwgdGhlcmVmb3JlIHdlIG11c3QgcmVzZXQgYW5kIGRpc2FibGUuCisJICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBSRVNFVF9SWCk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBVQVJURE1fQ1JfUlhfRElTQUJMRV9CTVNLKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFJFU0VUX1RYKTsKKworCS8qIDMwMCBpcyB0aGUgbWluaW11bSBiYXVkIHN1cHBvcnQgYnkgdGhlIGRyaXZlciAgKi8KKwlicHMgPSB1YXJ0X2dldF9iYXVkX3JhdGUodXBvcnQsIHRlcm1pb3MsIG9sZHRlcm1pb3MsIDIwMCwgNDAwMDAwMCk7CisKKwkvKiBUZW1wb3JhcnkgcmVtYXBwaW5nICAyMDAgQkFVRCB0byAzLjIgbWJwcyAqLworCWlmIChicHMgPT0gMjAwKQorCQlicHMgPSAzMjAwMDAwOworCisJdXBvcnQtPnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUobXNtX3Vwb3J0LT5jbGspOworCWlmICghdXBvcnQtPnVhcnRjbGspCisJCW1zbV9oc19zZXRfc3RkX2Jwc19sb2NrZWQodXBvcnQsIGJwcyk7CisJZWxzZQorCQltc21faHNfc2V0X2Jwc19sb2NrZWQodXBvcnQsIGJwcyk7CisKKwlkYXRhID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fTVIyKTsKKwlkYXRhICY9IH5VQVJURE1fTVIyX1BBUklUWV9NT0RFX0JNU0s7CisJLyogc2V0IHBhcml0eSAqLworCWlmIChjX2NmbGFnICYgUEFSRU5CKSB7CisJCWlmIChjX2NmbGFnICYgUEFST0REKQorCQkJZGF0YSB8PSBPRERfUEFSSVRZOworCQllbHNlIGlmIChjX2NmbGFnICYgQ01TUEFSKQorCQkJZGF0YSB8PSBTUEFDRV9QQVJJVFk7CisJCWVsc2UKKwkJCWRhdGEgfD0gRVZFTl9QQVJJVFk7CisJfQorCisJLyogU2V0IGJpdHMgcGVyIGNoYXIgKi8KKwlkYXRhICY9IH5VQVJURE1fTVIyX0JJVFNfUEVSX0NIQVJfQk1TSzsKKworCXN3aXRjaCAoY19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWRhdGEgfD0gRklWRV9CUEM7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQlkYXRhIHw9IFNJWF9CUEM7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQlkYXRhIHw9IFNFVkVOX0JQQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YSB8PSBFSUdIVF9CUEM7CisJCWJyZWFrOworCX0KKwkvKiBzdG9wIGJpdHMgKi8KKwlpZiAoY19jZmxhZyAmIENTVE9QQikgeworCQlkYXRhIHw9IFNUT1BfQklUX1RXTzsKKwl9IGVsc2UgeworCQkvKiBvdGhlcndpc2UgMSBzdG9wIGJpdCAqLworCQlkYXRhIHw9IFNUT1BfQklUX09ORTsKKwl9CisJZGF0YSB8PSBVQVJURE1fTVIyX0VSUk9SX01PREVfQk1TSzsKKwkvKiB3cml0ZSBwYXJpdHkvYml0cyBwZXIgY2hhci9zdG9wIGJpdCBjb25maWd1cmF0aW9uICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX01SMiwgZGF0YSk7CisKKwl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gdGVybWlvcy0+Y19pZmxhZyAmIElOUENLOworCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gdGVybWlvcy0+Y19pZmxhZyAmIElHTlBBUjsKKwl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IHRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUks7CisKKwl1cG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9ICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpOworCisJLyogU2V0IFRyYW5zbWl0IHNvZnR3YXJlIHRpbWUgb3V0ICovCisJdWFydF91cGRhdGVfdGltZW91dCh1cG9ydCwgY19jZmxhZywgYnBzKTsKKworCS8qIEVuYWJsZSBVQVJURE0gUnggQkFNIEludGVyZmFjZSAqLworCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETUVOKTsKKwlkYXRhIHw9IFVBUlRETV9SWF9CQU1fRU5BQkxFX0JNU0s7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0RNRU4sIGRhdGEpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgVUFSVERNX0NSX1JYX0VOX0JNU0spOworCS8qIElzc3VlIFRYLFJYIEJBTSBTdGFydCBJRkMgY29tbWFuZCAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgU1RBUlRfVFhfQkFNX0lGQyk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBTVEFSVF9SWF9CQU1fSUZDKTsKKwkvKiBFbnN1cmUgUmVnaXN0ZXIgV3JpdGVzIENvbXBsZXRlICovCisJbWIoKTsKKworCS8qIENvbmZpZ3VyZSBIVyBmbG93IGNvbnRyb2wKKwkgKiBVQVJUIENvcmUgd291bGQgc2VlIHN0YXR1cyBvZiBDVFMgbGluZSB3aGVuIGl0IGlzIHNlbmRpbmcgZGF0YQorCSAqIHRvIHJlbW90ZSB1YXJ0IHRvIGNvbmZpcm0gdGhhdCBpdCBjYW4gcmVjZWl2ZSBvciBub3QuCisJICogVUFSVCBDb3JlIHdvdWxkIHRyaWdnZXIgUkZSIGlmIGl0IGlzIG5vdCBoYXZpbmcgYW55IHNwYWNlIHdpdGgKKwkgKiBSWCBGSUZPLgorCSAqLworCS8qIFB1bGxpbmcgUkZSIGxpbmUgaGlnaCAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkZSX0xPVyk7CisJZGF0YSA9IG1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX01SMSk7CisJZGF0YSAmPSB+KFVBUlRETV9NUjFfQ1RTX0NUTF9CTVNLIHwgVUFSVERNX01SMV9SWF9SRFlfQ1RMX0JNU0spOworCWlmIChjX2NmbGFnICYgQ1JUU0NUUykgeworCQlkYXRhIHw9IFVBUlRETV9NUjFfQ1RTX0NUTF9CTVNLOworCQlkYXRhIHw9IFVBUlRETV9NUjFfUlhfUkRZX0NUTF9CTVNLOworCQltc21fdXBvcnQtPmZsb3dfY29udHJvbCA9IHRydWU7CisJfQorCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9NUjEsIGRhdGEpOworCU1TTV9IU19JTkZPKCIlczogQ2ZsYWdzIDB4JXggQmF1ZCAldVxuIiwgX19mdW5jX18sIGNfY2ZsYWcsIGJwcyk7CisKKwltdXRleF91bmxvY2soJm1zbV91cG9ydC0+bXR4KTsKKworCW1zbV9oc19yZXNvdXJjZV91bnZvdGUobXNtX3Vwb3J0KTsKK30KKworLyoKKyAqICBTdGFuZGFyZCBBUEksIFRyYW5zbWl0dGVyCisgKiAgQW55IGNoYXJhY3RlciBpbiB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgc2VudAorICovCit1bnNpZ25lZCBpbnQgbXNtX2hzX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCBpc3I7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisJZGF0YSA9IG1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX1NSKTsKKwlpc3IgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9JU1IpOworCW1zbV9oc19yZXNvdXJjZV91bnZvdGUobXNtX3Vwb3J0KTsKKwlNU01fSFNfSU5GTygiJXMoKTogU1I6MHgleCBJU1I6MHgleCAiLCBfX2Z1bmNfXywgZGF0YSwgaXNyKTsKKworCWlmIChkYXRhICYgVUFSVERNX1NSX1RYRU1UX0JNU0spIHsKKwkJcmV0ID0gVElPQ1NFUl9URU1UOworCX0gZWxzZQorCQkvKgorCQkgKiBBZGQgYW4gZXh0cmEgc2xlZXAgaGVyZSBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgZnJhbWV3b3JrJ3MKKwkJICogZGVsYXkgKGJhc2VkIG9uIGJhdWQgcmF0ZSkgaXNuJ3QgZ29vZCBlbm91Z2guCisJCSAqIE5vdGUgdGhhdCB0aGlzIHdvbid0IGhhcHBlbiBkdXJpbmcgZXZlcnkgcG9ydCBjbG9zZSwgb25seQorCQkgKiBvbiBzZWxlY3Qgb2NjYXNzaW9ucyB3aGVuIHRoZSB1c2Vyc3BhY2UgZG9lcyBiYWNrIHRvIGJhY2sKKwkJICogd3JpdGUoKSBhbmQgY2xvc2UoKS4KKwkJICovCisJCXVzbGVlcF9yYW5nZSg1MDAwLCA3MDAwKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9oc190eF9lbXB0eSk7CisKKy8qCisgKiAgU3RhbmRhcmQgQVBJLCBTdG9wIHRyYW5zbWl0dGVyLgorICogIEFueSBjaGFyYWN0ZXIgaW4gdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIHNlbnQgYXMKKyAqICB3ZWxsIGFzIHRoZSBjdXJyZW50IGRhdGEgbW92ZXIgdHJhbnNmZXIgLgorICovCitzdGF0aWMgdm9pZCBtc21faHNfc3RvcF90eF9sb2NrZWQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCisJdHgtPmZsdXNoID0gRkxVU0hfU1RPUDsKK30KKworc3RhdGljIGludCBkaXNjb25uZWN0X3J4X2VuZHBvaW50KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisJc3RydWN0IHNwc19waXBlICpzcHNfcGlwZV9oYW5kbGUgPSByeC0+cHJvZC5waXBlX2hhbmRsZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHNwc19yeF9kaXNjb25uZWN0KHNwc19waXBlX2hhbmRsZSk7CisKKwlpZiAobXNtX3Vwb3J0LT5yeC5wZW5kaW5nX2ZsYWcpCisJCU1TTV9IU19XQVJOKCIlcygpOiBCdWZmZXJzIG1heSBiZSBwZW5kaW5nIDB4JWx4IiwKKwkJX19mdW5jX18sIG1zbV91cG9ydC0+cngucGVuZGluZ19mbGFnKTsKKwlNU01fSFNfREJHKCIlcygpOiBjbGVhcmluZyBkZXNjIHVzYWdlIGZsYWciLCBfX2Z1bmNfXyk7CisJbXNtX3Vwb3J0LT5yeC5xdWV1ZWRfZmxhZyA9IDA7CisJbXNtX3Vwb3J0LT5yeC5wZW5kaW5nX2ZsYWcgPSAwOworCW1zbV91cG9ydC0+cngucnhfaW54ID0gMDsKKworCWlmIChyZXQpCisJCU1TTV9IU19FUlIoIiVzKCk6IHNwc19kaXNjb25uZWN0IGZhaWxlZFxuIiwgX19mdW5jX18pOworCW1zbV91cG9ydC0+cnguZmx1c2ggPSBGTFVTSF9TSFVURE9XTjsKKwlNU01fSFNfREJHKCIlczogQ2FsbGluZyBDb21wbGV0aW9uXG4iLCBfX2Z1bmNfXyk7CisJd2FrZV91cCgmbXNtX3Vwb3J0LT5iYW1fZGlzY29ubmVjdF93YWl0KTsKKwlNU01fSFNfREJHKCIlczogRG9uZSBDb21wbGV0aW9uXG4iLCBfX2Z1bmNfXyk7CisJd2FrZV91cCgmbXNtX3Vwb3J0LT5yeC53YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNwc190eF9kaXNjb25uZWN0KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJm1zbV91cG9ydC0+dXBvcnQ7CisJc3RydWN0IG1zbV9oc190eCAqdHggPSAmbXNtX3Vwb3J0LT50eDsKKwlzdHJ1Y3Qgc3BzX3BpcGUgKnR4X3BpcGUgPSB0eC0+Y29ucy5waXBlX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJaWYgKG1zbV91cG9ydC0+dHguZmx1c2ggPT0gRkxVU0hfU0hVVERPV04pIHsKKwkJTVNNX0hTX0RCRygiJXMoKTogcGlwZSBhbHJlYWR5IGRpc29ubmVjdGVkIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwc19kaXNjb25uZWN0KHR4X3BpcGUpOworCisJaWYgKHJldCkgeworCQlNU01fSFNfRVJSKCIlcygpOiBzcHNfZGlzY29ubmVjdCBmYWlsZWQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwltc21fdXBvcnQtPnR4LmZsdXNoID0gRkxVU0hfU0hVVERPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKworCU1TTV9IU19EQkcoIiVzKCk6IFRYIERpc2Nvbm5lY3QiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXNtX2hzX2Rpc2FibGVfcngoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlkYXRhID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fRE1FTik7CisJZGF0YSAmPSB+VUFSVERNX1JYX0JBTV9FTkFCTEVfQk1TSzsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fRE1FTiwgZGF0YSk7Cit9CisKKy8qCisgKiAgU3RhbmRhcmQgQVBJLCBTdG9wIHJlY2VpdmVyIGFzIHNvb24gYXMgcG9zc2libGUuCisgKgorICogIEZ1bmN0aW9uIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbiBvZiB0aGUKKyAqICBjaGFubmVsIHJlY2VpdmVyIGFuZCBhbnkgaW5jb21pbmcgY2hhcmFjdGVycyBhcmUgbG9zdC4gTm9uZQorICogIG9mIHRoZSByZWNlaXZlciBzdGF0dXMgYml0cyBhcmUgYWZmZWN0ZWQgYnkgdGhpcyBjb21tYW5kIGFuZAorICogIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgcmVjZWl2ZSBGSUZPIHRoZXJlLgorICovCitzdGF0aWMgdm9pZCBtc21faHNfc3RvcF9yeF9sb2NrZWQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKworCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpCisJCU1TTV9IU19XQVJOKCIlcygpOiBDbG9ja3MgYXJlIG9mZlxuIiwgX19mdW5jX18pOworCWVsc2UKKwkJbXNtX2hzX2Rpc2FibGVfcngodXBvcnQpOworCisJaWYgKG1zbV91cG9ydC0+cnguZmx1c2ggPT0gRkxVU0hfTk9ORSkKKwkJbXNtX3Vwb3J0LT5yeC5mbHVzaCA9IEZMVVNIX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9oc19kaXNjb25uZWN0X3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwltc21faHNfZGlzYWJsZV9yeCh1cG9ydCk7CisJLyogRGlzY29ubmVjdCB0aGUgQkFNIFJYIHBpcGUgKi8KKwlpZiAobXNtX3Vwb3J0LT5yeC5mbHVzaCA9PSBGTFVTSF9OT05FKQorCQltc21fdXBvcnQtPnJ4LmZsdXNoID0gRkxVU0hfU1RPUDsKKwlkaXNjb25uZWN0X3J4X2VuZHBvaW50KG1zbV91cG9ydCk7CisJTVNNX0hTX0RCRygiJXMoKTogcngtPmZsdXNoICVkIiwgX19mdW5jX18sIG1zbV91cG9ydC0+cnguZmx1c2gpOworfQorCisvKiBUeCB0aW1lb3V0IGNhbGxiYWNrIGZ1bmN0aW9uICovCit2b2lkIHR4X3RpbWVvdXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IChzdHJ1Y3QgbXNtX2hzX3BvcnQgKikgYXJnOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJm1zbV91cG9ydC0+dXBvcnQ7CisJaW50IGlzcjsKKworCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpIHsKKwkJTVNNX0hTX1dBUk4oIiVzKCk6IGNsb2NrcyBhcmUgb2ZmIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaXNyID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fSVNSKTsKKwlpZiAoVUFSVERNX0lTUl9DVVJSRU5UX0NUU19CTVNLICYgaXNyKQorCQlNU01fSFNfV0FSTigiJXMoKTogQ1RTIERpc2FibGVkLCBJU1IgMHgleCIsIF9fZnVuY19fLCBpc3IpOworCWR1bXBfdWFydF9oc19yZWdpc3RlcnMobXNtX3Vwb3J0KTsKK30KKworLyogIFRyYW5zbWl0IHRoZSBuZXh0IGNodW5rIG9mIGRhdGEgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19zdWJtaXRfdHhfbG9ja2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCWludCBsZWZ0OworCWludCB0eF9jb3VudDsKKwlpbnQgYWxpZ25lZF90eF9jb3VudDsKKwlkbWFfYWRkcl90IHNyY19hZGRyOworCWRtYV9hZGRyX3QgYWxpZ25lZF9zcmNfYWRkcjsKKwl1MzIgZmxhZ3MgPSBTUFNfSU9WRUNfRkxBR19FT1QgfCBTUFNfSU9WRUNfRkxBR19JTlQ7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCXN0cnVjdCBjaXJjX2J1ZiAqdHhfYnVmID0gJm1zbV91cG9ydC0+dXBvcnQuc3RhdGUtPnhtaXQ7CisJc3RydWN0IHNwc19waXBlICpzcHNfcGlwZV9oYW5kbGU7CisJaW50IHJldDsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkodHhfYnVmKSB8fCB1cG9ydC0+c3RhdGUtPnBvcnQudHR5LT5zdG9wcGVkKSB7CisJCXR4LT5kbWFfaW5fZmxpZ2h0ID0gZmFsc2U7CisJCW1zbV9oc19zdG9wX3R4X2xvY2tlZCh1cG9ydCk7CisJCXJldHVybjsKKwl9CisKKwl0eF9jb3VudCA9IHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHR4X2J1Zik7CisKKwlpZiAodHhfY291bnQgPiBVQVJURE1fVFhfQlVGX1NJWkUpCisJCXR4X2NvdW50ID0gVUFSVERNX1RYX0JVRl9TSVpFOworCisJbGVmdCA9IFVBUlRfWE1JVF9TSVpFIC0gdHhfYnVmLT50YWlsOworCisJaWYgKHR4X2NvdW50ID4gbGVmdCkKKwkJdHhfY291bnQgPSBsZWZ0OworCisJc3JjX2FkZHIgPSB0eC0+ZG1hX2Jhc2UgKyB0eF9idWYtPnRhaWw7CisJLyogTWFzayB0aGUgc3JjX2FkZHIgdG8gYWxpZ24gb24gYSBjYWNoZQorCSAqIGFuZCBhZGQgdGhvc2UgYnl0ZXMgdG8gdHhfY291bnQKKwkgKi8KKwlhbGlnbmVkX3NyY19hZGRyID0gc3JjX2FkZHIgJiB+KGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KCkgLSAxKTsKKwlhbGlnbmVkX3R4X2NvdW50ID0gdHhfY291bnQgKyBzcmNfYWRkciAtIGFsaWduZWRfc3JjX2FkZHI7CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh1cG9ydC0+ZGV2LCBhbGlnbmVkX3NyY19hZGRyLAorCQkJYWxpZ25lZF90eF9jb3VudCwgRE1BX1RPX0RFVklDRSk7CisKKwl0eC0+dHhfY291bnQgPSB0eF9jb3VudDsKKworCWhleF9kdW1wX2lwYyhtc21fdXBvcnQsIHR4LT5pcGNfdHhfY3R4dCwgIlR4IiwKKwkJCSZ0eF9idWYtPmJ1Zlt0eF9idWYtPnRhaWxdLCAodTY0KXNyY19hZGRyLCB0eF9jb3VudCk7CisJc3BzX3BpcGVfaGFuZGxlID0gdHgtPmNvbnMucGlwZV9oYW5kbGU7CisKKwkvKiBTZXQgMSBzZWNvbmQgdGltZW91dCAqLworCW1vZF90aW1lcigmdHgtPnR4X3RpbWVvdXRfdGltZXIsCisJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1TRUNfUEVSX1NFQykpOworCS8qIFF1ZXVlIHRyYW5zZmVyIHJlcXVlc3QgdG8gU1BTICovCisJcmV0ID0gc3BzX3RyYW5zZmVyX29uZShzcHNfcGlwZV9oYW5kbGUsIHNyY19hZGRyLCB0eF9jb3VudCwKKwkJCQltc21fdXBvcnQsIGZsYWdzKTsKKworCU1TTV9IU19EQkcoIiVzOkVucXVldWUgVHggQ21kLCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyB0aGUgcnggZGVzY3JpcHRvciBmb3IgQkFNIHRyYW5zZmVyICovCitzdGF0aWMgdm9pZCBtc21faHNfcG9zdF9yeF9kZXNjKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0LCBpbnQgaW54KQoreworCXUzMiBmbGFncyA9IFNQU19JT1ZFQ19GTEFHX0lOVDsKKwlzdHJ1Y3QgbXNtX2hzX3J4ICpyeCA9ICZtc21fdXBvcnQtPnJ4OworCWludCByZXQ7CisKKwlwaHlzX2FkZHJfdCByYnVmZl9hZGRyID0gcngtPnJidWZmZXIgKyAoVUFSVERNX1JYX0JVRl9TSVpFICogaW54KTsKKwl1OCAqdmlydF9hZGRyID0gcngtPmJ1ZmZlciArIChVQVJURE1fUlhfQlVGX1NJWkUgKiBpbngpOworCisJTVNNX0hTX0RCRygiJXM6ICVkOlF1ZXVlIGRlc2MgJWQsIDB4JWxseCwgYmFzZSAweCVsbHggdmlydGFkZHIgJXAiLAorCQlfX2Z1bmNfXywgbXNtX3Vwb3J0LT51cG9ydC5saW5lLCBpbngsCisJCSh1NjQpcmJ1ZmZfYWRkciwgKHU2NClyeC0+cmJ1ZmZlciwgdmlydF9hZGRyKTsKKworCXJ4LT5pb3ZlY1tpbnhdLnNpemUgPSAwOworCXJldCA9IHNwc190cmFuc2Zlcl9vbmUocngtPnByb2QucGlwZV9oYW5kbGUsIHJidWZmX2FkZHIsCisJCVVBUlRETV9SWF9CVUZfU0laRSwgbXNtX3Vwb3J0LCBmbGFncyk7CisKKwlpZiAocmV0KQorCQlNU01fSFNfRVJSKCJFcnJvciBwcm9jZXNzaW5nIGRlc2NyaXB0b3IgJWQiLCByZXQpOworfQorCisvKiBVcGRhdGUgdGhlIHJ4IGRlc2NyaXB0b3IgaW5kZXggdG8gc3BlY2lmeSB0aGUgbmV4dCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCitzdGF0aWMgdm9pZCBtc21faHNfbWFya19uZXh0KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0LCBpbnQgaW54KQoreworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisJaW50IHByZXY7CisKKwlpbnggJT0gVUFSVF9ETUFfREVTQ19OUjsKKwlNU01fSFNfREJHKCIlcygpOiBpbnggJWQsIHBlbmRpbmcgMHglbHgiLCBfX2Z1bmNfXywgaW54LAorCQlyeC0+cGVuZGluZ19mbGFnKTsKKworCWlmICghaW54KQorCQlwcmV2ID0gVUFSVF9ETUFfREVTQ19OUiAtIDE7CisJZWxzZQorCQlwcmV2ID0gaW54IC0gMTsKKworCWlmICghdGVzdF9iaXQocHJldiwgJnJ4LT5wZW5kaW5nX2ZsYWcpKQorCQltc21fdXBvcnQtPnJ4LnJ4X2lueCA9IGlueDsKKwlNU01fSFNfREJHKCIlcygpOiBwcmV2ICVkIHBlbmRpbmcgZmxhZyAweCVseCwgbmV4dCAlZCIsIF9fZnVuY19fLAorCQlwcmV2LCByeC0+cGVuZGluZ19mbGFnLCBtc21fdXBvcnQtPnJ4LnJ4X2lueCk7Cit9CisKKy8qCisgKglRdWV1ZSB0aGUgcnggZGVzY3JpcHRvciB0aGF0IGhhcyBqdXN0IGJlZW4gcHJvY2Vzc2VkIG9yCisgKglhbGwgb2YgdGhlbSBpZiBxdWV1ZWluZyBmb3IgdGhlIGZpcnN0IHRpbWUKKyAqLworc3RhdGljIHZvaWQgbXNtX2hzX3F1ZXVlX3J4X2Rlc2Moc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQpCit7CisJc3RydWN0IG1zbV9oc19yeCAqcnggPSAmbXNtX3Vwb3J0LT5yeDsKKwlpbnQgaSwgZmxhZyA9IDA7CisKKwkvKiBBdCBmaXJzdCwgcXVldWUgYWxsLCBpZiBub3QsIHF1ZXVlIG9ubHkgb25lICovCisJaWYgKHJ4LT5xdWV1ZWRfZmxhZyB8fCByeC0+cGVuZGluZ19mbGFnKSB7CisJCWlmICghdGVzdF9iaXQocngtPnJ4X2lueCwgJnJ4LT5xdWV1ZWRfZmxhZykgJiYKKwkJICAgICF0ZXN0X2JpdChyeC0+cnhfaW54LCAmcngtPnBlbmRpbmdfZmxhZykpIHsKKwkJCW1zbV9oc19wb3N0X3J4X2Rlc2MobXNtX3Vwb3J0LCByeC0+cnhfaW54KTsKKwkJCXNldF9iaXQocngtPnJ4X2lueCwgJnJ4LT5xdWV1ZWRfZmxhZyk7CisJCQlNU01fSFNfREJHKCIlcygpOiBTZXQgUXVldWVkIEJpdCAlZCIsCisJCQkJX19mdW5jX18sIHJ4LT5yeF9pbngpOworCQl9IGVsc2UKKwkJCU1TTV9IU19FUlIoIiVzKCk6IHJ4X2lueCBwZW5kaW5nIG9yIHF1ZXVlZCIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBVQVJUX0RNQV9ERVNDX05SOyBpKyspIHsKKwkJaWYgKCF0ZXN0X2JpdChpLCAmcngtPnF1ZXVlZF9mbGFnKSAmJgorCQkhdGVzdF9iaXQoaSwgJnJ4LT5wZW5kaW5nX2ZsYWcpKSB7CisJCQlNU01fSFNfREJHKCIlcygpOiBDYWxsaW5nIHBvc3QgcnggJWQiLCBfX2Z1bmNfXywgaSk7CisJCQltc21faHNfcG9zdF9yeF9kZXNjKG1zbV91cG9ydCwgaSk7CisJCQlzZXRfYml0KGksICZyeC0+cXVldWVkX2ZsYWcpOworCQkJZmxhZyA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWZsYWcpCisJCU1TTV9IU19FUlIoIiVzKCk6IGVycm9yIHF1ZXVlaW5nIGRlc2NyaXB0b3IiLCBfX2Z1bmNfXyk7Cit9CisKKy8qIFN0YXJ0IHRvIHJlY2VpdmUgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSAqLworc3RhdGljIHZvaWQgbXNtX2hzX3N0YXJ0X3J4X2xvY2tlZChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisJdW5zaWduZWQgaW50IGJ1ZmZlcl9wZW5kaW5nID0gbXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlICE9IE1TTV9IU19QTV9BQ1RJVkUpIHsKKwkJTVNNX0hTX1dBUk4oIiVzKCk6IENsb2NrcyBhcmUgb2ZmXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJ4LT5wZW5kaW5nX2ZsYWcpIHsKKwkJTVNNX0hTX0lORk8oIiVzOiBSeCBDbWQgZ290IGV4ZWN1dGVkLCB3YWl0IGZvciByeF90bGV0XG4iLAorCQkJCQkJCQkgX19mdW5jX18pOworCQlyeC0+Zmx1c2ggPSBGTFVTSF9JR05PUkU7CisJCXJldHVybjsKKwl9CisJaWYgKGJ1ZmZlcl9wZW5kaW5nKQorCQlNU01fSFNfRVJSKCJFcnJvcjogcnggc3RhcnRlZCBpbiBidWZmZXIgc3RhdGUgPSV4IiwKKwkJCWJ1ZmZlcl9wZW5kaW5nKTsKKworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfU1RBTEVfSU5UKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fRE1SWCwgVUFSVERNX1JYX0JVRl9TSVpFKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFNUQUxFX0VWRU5UX0VOQUJMRSk7CisJLyoKKwkgKiBFbmFibGUgVUFSVERNIFJ4IEludGVyZmFjZSBhcyBwcmV2aW91c2x5IGl0IGhhcyBiZWVuCisJICogZGlzYWJsZSBpbiBzZXRfdGVybWlvcyBiZWZvcmUgY29uZmlndXJpbmcgYmF1ZCByYXRlLgorCSAqLworCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETUVOKTsKKwkvKiBFbmFibGUgVUFSVERNIFJ4IEJBTSBJbnRlcmZhY2UgKi8KKwlkYXRhIHw9IFVBUlRETV9SWF9CQU1fRU5BQkxFX0JNU0s7CisKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fRE1FTiwgZGF0YSk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0lNUiwgbXNtX3Vwb3J0LT5pbXJfcmVnKTsKKwkvKiBDYWxsaW5nIG5leHQgRE1PViBBUEkuIEhlbmNlIG1iKCkgaGVyZS4gKi8KKwltYigpOworCisJLyoKKwkgKiBSWC10cmFuc2ZlciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmUtYWN0aXZhdGVkCisJICogYWZ0ZXIgbGFzdCBkYXRhIG9mIHByZXZpb3VzIHRyYW5zZmVyIHdhcyByZWFkLgorCSAqLworCWRhdGEgPSAoUlhfU1RBTEVfQVVUT19SRV9FTiB8IFJYX1RSQU5TX0FVVE9fUkVfQUNUSVZBVEUgfAorCQkJCVJYX0RNUlhfQ1lDTElDX0VOKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fUlhfVFJBTlNfQ1RSTCwgZGF0YSk7CisJLyogSXNzdWUgUlggQkFNIFN0YXJ0IElGQyBjb21tYW5kICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBTVEFSVF9SWF9CQU1fSUZDKTsKKwkvKiBFbnN1cmUgcmVnaXN0ZXIgSU8gY29tcGxldGlvbiAqLworCW1iKCk7CisKKwltc21fdXBvcnQtPnJ4LmZsdXNoID0gRkxVU0hfTk9ORTsKKwltc21fdXBvcnQtPnJ4X2JhbV9pbnByb2dyZXNzID0gdHJ1ZTsKKwltc21faHNfcXVldWVfcnhfZGVzYyhtc21fdXBvcnQpOworCW1zbV91cG9ydC0+cnhfYmFtX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKwl3YWtlX3VwKCZtc21fdXBvcnQtPnJ4LndhaXQpOworCU1TTV9IU19EQkcoIiVzOkVucXVldWUgUnggQ21kXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsaXBfaW5zZXJ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtX2hzX3BvcnQsCisJCQkgICAgIHJ4LmZsaXBfaW5zZXJ0X3dvcmsud29yayk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IG1zbV91cG9ydC0+dXBvcnQuc3RhdGUtPnBvcnQudHR5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV91cG9ydC0+dXBvcnQubG9jaywgZmxhZ3MpOworCWlmICghdHR5IHx8IG1zbV91cG9ydC0+cnguZmx1c2ggPT0gRkxVU0hfU0hVVERPV04pIHsKKwkJZGV2X2Vycihtc21fdXBvcnQtPnVwb3J0LmRldiwKKwkJCSIlczpJbnZhbGlkIGRyaXZlciBzdGF0ZSBmbHVzaCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgbXNtX3Vwb3J0LT5yeC5mbHVzaCk7CisJCU1TTV9IU19FUlIoIiVzOkludmFsaWQgZHJpdmVyIHN0YXRlIGZsdXNoICVkXG4iLAorCQkJCV9fZnVuY19fLCBtc21fdXBvcnQtPnJ4LmZsdXNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX3Vwb3J0LT51cG9ydC5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZyA9PSBOT05FX1BFTkRJTkcpIHsKKwkJTVNNX0hTX0VSUigiRXJyb3I6IE5vIGJ1ZmZlciBwZW5kaW5nIGluICVzIiwgX19mdW5jX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fdXBvcnQtPnVwb3J0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZyAmIEZJRk9fT1ZFUlJVTikgeworCQlyZXR2YWwgPSB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHktPnBvcnQsIDAsIFRUWV9PVkVSUlVOKTsKKwkJaWYgKHJldHZhbCkKKwkJCW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgJj0gfkZJRk9fT1ZFUlJVTjsKKwl9CisJaWYgKG1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgJiBQQVJJVFlfRVJST1IpIHsKKwkJcmV0dmFsID0gdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LT5wb3J0LCAwLCBUVFlfUEFSSVRZKTsKKwkJaWYgKHJldHZhbCkKKwkJCW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgJj0gflBBUklUWV9FUlJPUjsKKwl9CisJaWYgKG1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgJiBDSEFSU19OT1JNQUwpIHsKKwkJaW50IHJ4X2NvdW50LCByeF9vZmZzZXQ7CisKKwkJcnhfY291bnQgPSAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZyAmIDB4RkZGRjAwMDApID4+IDE2OworCQlyeF9vZmZzZXQgPSAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZyAmIDB4RkZEMCkgPj4gNTsKKwkJcmV0dmFsID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHktPnBvcnQsCisJCQltc21fdXBvcnQtPnJ4LmJ1ZmZlciArCisJCQkobXNtX3Vwb3J0LT5yeC5yeF9pbnggKiBVQVJURE1fUlhfQlVGX1NJWkUpCisJCQkrIHJ4X29mZnNldCwgcnhfY291bnQpOworCQltc21fdXBvcnQtPnJ4LmJ1ZmZlcl9wZW5kaW5nICY9IChGSUZPX09WRVJSVU4gfAorCQkJCQkJIFBBUklUWV9FUlJPUik7CisJCWlmIChyZXR2YWwgIT0gcnhfY291bnQpCisJCQltc21fdXBvcnQtPnJ4LmJ1ZmZlcl9wZW5kaW5nIHw9IENIQVJTX05PUk1BTCB8CisJCQkJcmV0dmFsIDw8IDggfCAocnhfY291bnQgLSByZXR2YWwpIDw8IDE2OworCX0KKwlpZiAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZykgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1zbV91cG9ydC0+cnguZmxpcF9pbnNlcnRfd29yaywKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJFVFJZX1RJTUVPVVQpKTsKKwl9IGVsc2UgaWYgKG1zbV91cG9ydC0+cnguZmx1c2ggPD0gRkxVU0hfSUdOT1JFKSB7CisJCU1TTV9IU19XQVJOKCJQZW5kaW5nIGJ1ZmZlcnMgY2xlYXJlZCwgcmVzdGFydGluZyIpOworCQljbGVhcl9iaXQobXNtX3Vwb3J0LT5yeC5yeF9pbngsCisJCQkmbXNtX3Vwb3J0LT5yeC5wZW5kaW5nX2ZsYWcpOworCQltc21faHNfc3RhcnRfcnhfbG9ja2VkKCZtc21fdXBvcnQtPnVwb3J0KTsKKwkJbXNtX2hzX21hcmtfbmV4dChtc21fdXBvcnQsIG1zbV91cG9ydC0+cngucnhfaW54KzEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fdXBvcnQtPnVwb3J0LmxvY2ssIGZsYWdzKTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHktPnBvcnQpOworfQorCitzdGF0aWMgdm9pZCBtc21fc2VyaWFsX2hzX3J4X3dvcmsoc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKK3sKKwlpbnQgcmV0dmFsOworCWludCByeF9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZXJyb3JfZiA9IDA7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQ7CisJdW5zaWduZWQgaW50IGZsdXNoID0gRkxVU0hfREFUQV9JTlZBTElEOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJc3RydWN0IHNwc19ldmVudF9ub3RpZnkgKm5vdGlmeTsKKwlzdHJ1Y3QgbXNtX2hzX3J4ICpyeDsKKwlzdHJ1Y3Qgc3BzX3BpcGUgKnNwc19waXBlX2hhbmRsZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWNvbnN0IHN0cnVjdCBtc21fc2VyaWFsX2hzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJbXNtX3Vwb3J0ID0gY29udGFpbmVyX29mKChzdHJ1Y3Qga3RocmVhZF93b3JrICopIHdvcmssCisJCQkJIHN0cnVjdCBtc21faHNfcG9ydCwgcngua3dvcmspOworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisJdXBvcnQgPSAmbXNtX3Vwb3J0LT51cG9ydDsKKwl0dHkgPSB1cG9ydC0+c3RhdGUtPnBvcnQudHR5OworCW5vdGlmeSA9ICZtc21fdXBvcnQtPm5vdGlmeTsKKwlyeCA9ICZtc21fdXBvcnQtPnJ4OworCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UodXBvcnQtPmRldik7CisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF0dHkgfHwgcngtPmZsdXNoID09IEZMVVNIX1NIVVRET1dOKSB7CisJCWRldl9lcnIodXBvcnQtPmRldiwgIiVzOkludmFsaWQgZHJpdmVyIHN0YXRlIGZsdXNoICVkXG4iLAorCQkJCV9fZnVuY19fLCByeC0+Zmx1c2gpOworCQlNU01fSFNfRVJSKCIlczpJbnZhbGlkIGRyaXZlciBzdGF0ZSBmbHVzaCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcngtPmZsdXNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJbXNtX2hzX3Jlc291cmNlX3Vudm90ZShtc21fdXBvcnQpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIGFsbCBwZW5kaW5nIGRlc2NzIG9yIGlmIG5vdGhpbmcgaXMKKwkgKiBxdWV1ZWQgLSBjYWxsZWQgZnJvbSB0ZXJtaW9zCisJICovCisJd2hpbGUgKCFyeC0+YnVmZmVyX3BlbmRpbmcgJiYKKwkJKHJ4LT5wZW5kaW5nX2ZsYWcgfHwgIXJ4LT5xdWV1ZWRfZmxhZykpIHsKKwkJTVNNX0hTX0RCRygiJXMoKTogTG9vcCBQIDB4JWx4IFEgMHglbHgiLCBfX2Z1bmNfXywKKwkJCXJ4LT5wZW5kaW5nX2ZsYWcsIHJ4LT5xdWV1ZWRfZmxhZyk7CisKKwkJc3RhdHVzID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fU1IpOworCisJCU1TTV9IU19EQkcoIkluICVzXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogb3ZlcmZsb3cgaXMgbm90IGNvbm5lY3QgdG8gZGF0YSBpbiBhIEZJRk8gKi8KKwkJaWYgKHVubGlrZWx5KChzdGF0dXMgJiBVQVJURE1fU1JfT1ZFUlJVTl9CTVNLKSAmJgorCQkJICAgICAodXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJiBDUkVBRCkpKSB7CisJCQlyZXR2YWwgPSB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHktPnBvcnQsCisJCQkJCQkJMCwgVFRZX09WRVJSVU4pOworCQkJTVNNX0hTX1dBUk4oIiVzKCk6IFJYIEJ1ZmZlciBPdmVycnVuIERldGVjdGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWlmICghcmV0dmFsKQorCQkJCW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgfD0gVFRZX09WRVJSVU47CisJCQl1cG9ydC0+aWNvdW50LmJ1Zl9vdmVycnVuKys7CisJCQllcnJvcl9mID0gMTsKKwkJfQorCisJCWlmICghKHVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiBJTlBDSykpCisJCQlzdGF0dXMgPSBzdGF0dXMgJiB+KFVBUlRETV9TUl9QQVJfRlJBTUVfQk1TSyk7CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFVBUlRETV9TUl9QQVJfRlJBTUVfQk1TSykpIHsKKwkJCS8qIENhbiBub3QgdGVsbCBkaWZmIGJldHdlZW4gcGFyaXR5ICYgZnJhbWUgZXJyb3IgKi8KKwkJCU1TTV9IU19XQVJOKCJtc21fc2VyaWFsX2hzOiBwYXJpdHkgZXJyb3JcbiIpOworCQkJdXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwkJCWVycm9yX2YgPSAxOworCQkJaWYgKCEodXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmIElHTlBBUikpIHsKKwkJCQlyZXR2YWwgPSB0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHktPnBvcnQsCisJCQkJCQkJMCwgVFRZX1BBUklUWSk7CisJCQkJaWYgKCFyZXR2YWwpCisJCQkJCW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcKKwkJCQkJCQkJfD0gVFRZX1BBUklUWTsKKwkJCX0KKwkJfQorCisJCWlmICh1bmxpa2VseShzdGF0dXMgJiBVQVJURE1fU1JfUlhfQlJFQUtfQk1TSykpIHsKKwkJCU1TTV9IU19EQkcoIm1zbV9zZXJpYWxfaHM6IFJ4IGJyZWFrXG4iKTsKKwkJCXVwb3J0LT5pY291bnQuYnJrKys7CisJCQllcnJvcl9mID0gMTsKKwkJCWlmICghKHVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgJiBJR05CUkspKSB7CisJCQkJcmV0dmFsID0gdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LT5wb3J0LAorCQkJCQkJCQkwLCBUVFlfQlJFQUspOworCQkJCWlmICghcmV0dmFsKQorCQkJCQltc21fdXBvcnQtPnJ4LmJ1ZmZlcl9wZW5kaW5nCisJCQkJCQkJCXw9IFRUWV9CUkVBSzsKKwkJCX0KKwkJfQorCisJCWlmIChlcnJvcl9mKQorCQkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLAlSRVNFVF9FUlJPUl9TVEFUVVMpOworCQlmbHVzaCA9IG1zbV91cG9ydC0+cnguZmx1c2g7CisJCWlmIChmbHVzaCA9PSBGTFVTSF9JR05PUkUpCisJCQlpZiAoIW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcpIHsKKwkJCQlNU01fSFNfREJHKCIlczogY2FsbGluZyBzdGFydF9yeF9sb2NrZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCQltc21faHNfc3RhcnRfcnhfbG9ja2VkKHVwb3J0KTsKKwkJCX0KKwkJaWYgKGZsdXNoID49IEZMVVNIX0RBVEFfSU5WQUxJRCkKKwkJCWdvdG8gb3V0OworCisJCXJ4X2NvdW50ID0gbXNtX3Vwb3J0LT5yeC5pb3ZlY1ttc21fdXBvcnQtPnJ4LnJ4X2lueF0uc2l6ZTsKKwkJaGV4X2R1bXBfaXBjKG1zbV91cG9ydCwgcngtPmlwY19yeF9jdHh0LCAiUngiLAorCQkJKG1zbV91cG9ydC0+cnguYnVmZmVyICsKKwkJCShtc21fdXBvcnQtPnJ4LnJ4X2lueCAqIFVBUlRETV9SWF9CVUZfU0laRSkpLAorCQkJbXNtX3Vwb3J0LT5yeC5pb3ZlY1ttc21fdXBvcnQtPnJ4LnJ4X2lueF0uYWRkciwKKwkJCXJ4X2NvdW50KTsKKworCQkgLyoKKwkJICAqIFdlIGFyZSBpbiBhIHNwaW4gbG9ja2VkIGNvbnRleHQsIHNwaW4gbG9jayB0YWtlbiBhdAorCQkgICogb3RoZXIgcGxhY2VzIHdoZXJlIHRoZXNlIGZsYWdzIGFyZSB1cGRhdGVkCisJCSAgKi8KKwkJaWYgKDAgIT0gKHVwb3J0LT5yZWFkX3N0YXR1c19tYXNrICYgQ1JFQUQpKSB7CisJCQlpZiAoIXRlc3RfYml0KG1zbV91cG9ydC0+cngucnhfaW54LAorCQkJCSZtc21fdXBvcnQtPnJ4LnBlbmRpbmdfZmxhZykgJiYKKwkJCSAgICAhdGVzdF9iaXQobXNtX3Vwb3J0LT5yeC5yeF9pbngsCisJCQkJJm1zbV91cG9ydC0+cngucXVldWVkX2ZsYWcpKQorCQkJCU1TTV9IU19FUlIoIiVzOiBSWCBJTlggbm90IHNldCIsIF9fZnVuY19fKTsKKwkJCWVsc2UgaWYgKHRlc3RfYml0KG1zbV91cG9ydC0+cngucnhfaW54LAorCQkJCQkmbXNtX3Vwb3J0LT5yeC5wZW5kaW5nX2ZsYWcpICYmCisJCQkJIXRlc3RfYml0KG1zbV91cG9ydC0+cngucnhfaW54LAorCQkJCQkmbXNtX3Vwb3J0LT5yeC5xdWV1ZWRfZmxhZykpIHsKKwkJCQlNU01fSFNfREJHKCIlcygpOiBDbGVhciBQZW5kaW5nIEJpdCAlZCIsCisJCQkJCV9fZnVuY19fLCBtc21fdXBvcnQtPnJ4LnJ4X2lueCk7CisKKwkJCQlyZXR2YWwgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eS0+cG9ydCwKKwkJCQkJbXNtX3Vwb3J0LT5yeC5idWZmZXIgKworCQkJCQkobXNtX3Vwb3J0LT5yeC5yeF9pbnggKgorCQkJCQlVQVJURE1fUlhfQlVGX1NJWkUpLAorCQkJCQlyeF9jb3VudCk7CisKKwkJCQlpZiAocmV0dmFsICE9IHJ4X2NvdW50KSB7CisJCQkJCU1TTV9IU19JTkZPKCIlcygpOiByZXQgJWQgcnhfY291bnQgJWQiLAorCQkJCQkJX19mdW5jX18sIHJldHZhbCwgcnhfY291bnQpOworCQkJCQltc21fdXBvcnQtPnJ4LmJ1ZmZlcl9wZW5kaW5nIHw9CisJCQkJCUNIQVJTX05PUk1BTCB8IHJldHZhbCA8PCA1IHwKKwkJCQkJKHJ4X2NvdW50IC0gcmV0dmFsKSA8PCAxNjsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlNU01fSFNfRVJSKCIlczogRXJyb3IgaW4gaW54ICVkIiwgX19mdW5jX18sCisJCQkJCW1zbV91cG9ydC0+cngucnhfaW54KTsKKwkJfQorCisJCWlmICghbXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZykgeworCQkJbXNtX3Vwb3J0LT5yeC5mbHVzaCA9IEZMVVNIX05PTkU7CisJCQltc21fdXBvcnQtPnJ4X2JhbV9pbnByb2dyZXNzID0gdHJ1ZTsKKwkJCXNwc19waXBlX2hhbmRsZSA9IHJ4LT5wcm9kLnBpcGVfaGFuZGxlOworCQkJTVNNX0hTX0RCRygiUXVlaW5nIGJhbSBkZXNjcmlwdG9yXG4iKTsKKwkJCS8qIFF1ZXVlIHRyYW5zZmVyIHJlcXVlc3QgdG8gU1BTICovCisJCQljbGVhcl9iaXQobXNtX3Vwb3J0LT5yeC5yeF9pbngsCisJCQkJJm1zbV91cG9ydC0+cngucGVuZGluZ19mbGFnKTsKKwkJCW1zbV9oc19xdWV1ZV9yeF9kZXNjKG1zbV91cG9ydCk7CisJCQltc21faHNfbWFya19uZXh0KG1zbV91cG9ydCwgbXNtX3Vwb3J0LT5yeC5yeF9pbngrMSk7CisJCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFNUQVJUX1JYX0JBTV9JRkMpOworCQkJbXNtX3Vwb3J0LT5yeF9iYW1faW5wcm9ncmVzcyA9IGZhbHNlOworCQkJd2FrZV91cCgmbXNtX3Vwb3J0LT5yeC53YWl0KTsKKwkJfSBlbHNlCisJCQlicmVhazsKKworCX0KK291dDoKKwlpZiAobXNtX3Vwb3J0LT5yeC5idWZmZXJfcGVuZGluZykgeworCQlNU01fSFNfV0FSTigiJXM6IHR0eSBidWZmZXIgZXhoYXVzdGVkLiBTdGFsbGluZ1xuIiwgX19mdW5jX18pOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1zbV91cG9ydC0+cnguZmxpcF9pbnNlcnRfd29yaworCQkJCSAgICAgICwgbXNlY3NfdG9famlmZmllcyhSRVRSWV9USU1FT1VUKSk7CisJfQorCS8qIHR0eV9mbGlwX2J1ZmZlcl9wdXNoKCkgbWlnaHQgY2FsbCBtc21faHNfc3RhcnQoKSwgc28gdW5sb2NrICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmx1c2ggPCBGTFVTSF9EQVRBX0lOVkFMSUQpCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eS0+cG9ydCk7CisJbXNtX2hzX3Jlc291cmNlX3Vudm90ZShtc21fdXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBtc21faHNfc3RhcnRfdHhfbG9ja2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisJc3RydWN0IG1zbV9oc190eCAqdHggPSAmbXNtX3Vwb3J0LT50eDsKKworCS8qIEJhaWwgaWYgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgKi8KKwlpZiAodHgtPmZsdXNoIDwgRkxVU0hfU1RPUCB8fCB0eC0+ZG1hX2luX2ZsaWdodCkgeworCQlNU01fSFNfSU5GTygiJXMoKTogcmV0cnksIGZsdXNoICVkLCBkbWFfaW5fZmxpZ2h0ICVkXG4iLAorCQkJX19mdW5jX18sIHR4LT5mbHVzaCwgdHgtPmRtYV9pbl9mbGlnaHQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCF0eC0+ZG1hX2luX2ZsaWdodCkgeworCQl0eC0+ZG1hX2luX2ZsaWdodCA9IHRydWU7CisJCWt0aHJlYWRfcXVldWVfd29yaygmbXNtX3Vwb3J0LT50eC5rd29ya2VyLAorCQkJJm1zbV91cG9ydC0+dHgua3dvcmspOworCX0KK30KKworLyoqCisgKiBDYWxsYmFjayBub3RpZmljYXRpb24gZnJvbSBTUFMgZHJpdmVyCisgKgorICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBnZXRzIHRyaWdnZXJlZCBjYWxsZWQgZnJvbQorICogU1BTIGRyaXZlciB3aGVuIHJlcXVlc3RlZCBTUFMgZGF0YSB0cmFuc2ZlciBpcworICogY29tcGxldGVkLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtc21faHNfc3BzX3R4X2NhbGxiYWNrKHN0cnVjdCBzcHNfZXZlbnRfbm90aWZ5ICpub3RpZnkpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPQorCQkoc3RydWN0IG1zbV9oc19wb3J0ICopCisJCSgoc3RydWN0IHNwc19ldmVudF9ub3RpZnkgKilub3RpZnkpLT51c2VyOworCXBoeXNfYWRkcl90IGFkZHIgPSBERVNDX0ZVTExfQUREUihub3RpZnktPmRhdGEudHJhbnNmZXIuaW92ZWMuZmxhZ3MsCisJCW5vdGlmeS0+ZGF0YS50cmFuc2Zlci5pb3ZlYy5hZGRyKTsKKworCW1zbV91cG9ydC0+bm90aWZ5ID0gKm5vdGlmeTsKKwlNU01fSFNfSU5GTygidHhfY2I6IGFkZHI9MHglcGEsIHNpemU9MHgleCwgZmxhZ3M9MHgleFxuIiwKKwkJJmFkZHIsIG5vdGlmeS0+ZGF0YS50cmFuc2Zlci5pb3ZlYy5zaXplLAorCQlub3RpZnktPmRhdGEudHJhbnNmZXIuaW92ZWMuZmxhZ3MpOworCisJZGVsX3RpbWVyKCZtc21fdXBvcnQtPnR4LnR4X3RpbWVvdXRfdGltZXIpOworCU1TTV9IU19EQkcoIiVzKCk6IFF1ZXVlIGt0aHJlYWQgd29yayIsIF9fZnVuY19fKTsKKwlrdGhyZWFkX3F1ZXVlX3dvcmsoJm1zbV91cG9ydC0+dHgua3dvcmtlciwgJm1zbV91cG9ydC0+dHgua3dvcmspOworfQorCitzdGF0aWMgdm9pZCBtc21fc2VyaWFsX2hzX3R4X3dvcmsoc3RydWN0IGt0aHJlYWRfd29yayAqd29yaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0KKwkJCWNvbnRhaW5lcl9vZigoc3RydWN0IGt0aHJlYWRfd29yayAqKXdvcmssCisJCQlzdHJ1Y3QgbXNtX2hzX3BvcnQsIHR4Lmt3b3JrKTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZtc21fdXBvcnQtPnVwb3J0OworCXN0cnVjdCBjaXJjX2J1ZiAqdHhfYnVmID0gJnVwb3J0LT5zdGF0ZS0+eG1pdDsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCisJLyoKKwkgKiBEbyB0aGUgd29yayBidWZmZXIgcmVsYXRlZCB3b3JrIGluIEJBTQorCSAqIG1vZGUgdGhhdCBpcyBlcXVpdmFsZW50IHRvIGxlZ2FjeSBtb2RlCisJICovCisJbXNtX2hzX3Jlc291cmNlX3ZvdGUobXNtX3Vwb3J0KTsKKwlpZiAodHgtPmZsdXNoID49IEZMVVNIX1NUT1ApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihtc21fdXBvcnQtPnVwb3J0LmxvY2spLCBmbGFncyk7CisJCXR4LT5mbHVzaCA9IEZMVVNIX05PTkU7CisJCU1TTV9IU19EQkcoIiVzKCk6IGNhbGxpbmcgc3VibWl0X3R4IiwgX19mdW5jX18pOworCQltc21faHNfc3VibWl0X3R4X2xvY2tlZCh1cG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihtc21fdXBvcnQtPnVwb3J0LmxvY2spLCBmbGFncyk7CisJCW1zbV9oc19yZXNvdXJjZV91bnZvdGUobXNtX3Vwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCYobXNtX3Vwb3J0LT51cG9ydC5sb2NrKSwgZmxhZ3MpOworCWlmICghdWFydF9jaXJjX2VtcHR5KHR4X2J1ZikpCisJCXR4X2J1Zi0+dGFpbCA9ICh0eF9idWYtPnRhaWwgKworCQl0eC0+dHhfY291bnQpICYgflVBUlRfWE1JVF9TSVpFOworCWVsc2UKKwkJTVNNX0hTX0RCRygiJXM6Y2lyYyBidWZmZXIgaXMgZW1wdHlcbiIsIF9fZnVuY19fKTsKKworCXdha2VfdXAoJm1zbV91cG9ydC0+dHgud2FpdCk7CisKKwl1cG9ydC0+aWNvdW50LnR4ICs9IHR4LT50eF9jb3VudDsKKworCS8qCisJICogQ2FsbGluZyB0byBzZW5kIG5leHQgY2h1bmsgb2YgZGF0YQorCSAqIElmIHRoZSBjaXJjIGJ1ZmZlciBpcyBlbXB0eSwgd2Ugc3RvcAorCSAqIElmIHRoZSBjbG9jayBvZmYgd2FzIHJlcXVlc3RlZCwgdGhlIGNsb2NrCisJICogb2ZmIHNlcXVlbmNlIGlzIGtpY2tlZCBvZmYKKwkgKi8KKwkgTVNNX0hTX0RCRygiJXMoKTogY2FsbGluZyBzdWJtaXRfdHgiLCBfX2Z1bmNfXyk7CisJIG1zbV9oc19zdWJtaXRfdHhfbG9ja2VkKHVwb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh0eF9idWYpIDwgV0FLRVVQX0NIQVJTKQorCQl1YXJ0X3dyaXRlX3dha2V1cCh1cG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYobXNtX3Vwb3J0LT51cG9ydC5sb2NrKSwgZmxhZ3MpOworCW1zbV9oc19yZXNvdXJjZV91bnZvdGUobXNtX3Vwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK21zbV9oc19tYXJrX3Byb2NfcnhfZGVzYyhzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCwKKwkJCXN0cnVjdCBzcHNfZXZlbnRfbm90aWZ5ICpub3RpZnkpCit7CisJc3RydWN0IG1zbV9oc19yeCAqcnggPSAmbXNtX3Vwb3J0LT5yeDsKKwlwaHlzX2FkZHJfdCBhZGRyID0gREVTQ19GVUxMX0FERFIobm90aWZ5LT5kYXRhLnRyYW5zZmVyLmlvdmVjLmZsYWdzLAorCQlub3RpZnktPmRhdGEudHJhbnNmZXIuaW92ZWMuYWRkcik7CisJLyogZGl2aWRlIGJ5IFVBUlRETV9SWF9CVUZfU0laRSAqLworCWludCBpbnggPSAoYWRkciAtIHJ4LT5yYnVmZmVyKSA+PiA5OworCisJc2V0X2JpdChpbngsICZyeC0+cGVuZGluZ19mbGFnKTsKKwljbGVhcl9iaXQoaW54LCAmcngtPnF1ZXVlZF9mbGFnKTsKKwlyeC0+aW92ZWNbaW54XSA9IG5vdGlmeS0+ZGF0YS50cmFuc2Zlci5pb3ZlYzsKKwlNU01fSFNfREJHKCJDbGVhciBRLCBTZXQgUCBCaXQgJWQsIFEgMHglbHggUCAweCVseCIsCisJCWlueCwgcngtPnF1ZXVlZF9mbGFnLCByeC0+cGVuZGluZ19mbGFnKTsKK30KKworLyoqCisgKiBDYWxsYmFjayBub3RpZmljYXRpb24gZnJvbSBTUFMgZHJpdmVyCisgKgorICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiBnZXRzIHRyaWdnZXJlZCBjYWxsZWQgZnJvbQorICogU1BTIGRyaXZlciB3aGVuIHJlcXVlc3RlZCBTUFMgZGF0YSB0cmFuc2ZlciBpcworICogY29tcGxldGVkLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtc21faHNfc3BzX3J4X2NhbGxiYWNrKHN0cnVjdCBzcHNfZXZlbnRfbm90aWZ5ICpub3RpZnkpCit7CisKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9CisJCShzdHJ1Y3QgbXNtX2hzX3BvcnQgKikKKwkJKChzdHJ1Y3Qgc3BzX2V2ZW50X25vdGlmeSAqKW5vdGlmeSktPnVzZXI7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXNtX2hzX3J4ICpyeCA9ICZtc21fdXBvcnQtPnJ4OworCXBoeXNfYWRkcl90IGFkZHIgPSBERVNDX0ZVTExfQUREUihub3RpZnktPmRhdGEudHJhbnNmZXIuaW92ZWMuZmxhZ3MsCisJCW5vdGlmeS0+ZGF0YS50cmFuc2Zlci5pb3ZlYy5hZGRyKTsKKwkvKiBkaXZpZGUgYnkgVUFSVERNX1JYX0JVRl9TSVpFICovCisJaW50IGlueCA9IChhZGRyIC0gcngtPnJidWZmZXIpID4+IDk7CisKKwl1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJbXNtX3Vwb3J0LT5ub3RpZnkgPSAqbm90aWZ5OworCU1TTV9IU19JTkZPKCJyeF9jYjogYWRkcj0weCVwYSwgc2l6ZT0weCV4LCBmbGFncz0weCV4XG4iLAorCQkmYWRkciwgbm90aWZ5LT5kYXRhLnRyYW5zZmVyLmlvdmVjLnNpemUsCisJCW5vdGlmeS0+ZGF0YS50cmFuc2Zlci5pb3ZlYy5mbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwltc21faHNfbWFya19wcm9jX3J4X2Rlc2MobXNtX3Vwb3J0LCBub3RpZnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobXNtX3Vwb3J0LT5yeC5mbHVzaCA9PSBGTFVTSF9OT05FKSB7CisJCS8qIFRlc3QgaWYgb3RoZXJzIGFyZSBxdWV1ZWQgKi8KKwkJaWYgKG1zbV91cG9ydC0+cngucGVuZGluZ19mbGFnICYgfigxIDw8IGlueCkpIHsKKwkJCU1TTV9IU19EQkcoIiVzKCk6IGlueCAweCV4LCAweCVseCBub3QgcHJvY2Vzc2VkIiwKKwkJCV9fZnVuY19fLCBpbngsCisJCQltc21fdXBvcnQtPnJ4LnBlbmRpbmdfZmxhZyAmIH4oMTw8aW54KSk7CisJCX0KKwkJa3RocmVhZF9xdWV1ZV93b3JrKCZtc21fdXBvcnQtPnJ4Lmt3b3JrZXIsCisJCQkJJm1zbV91cG9ydC0+cngua3dvcmspOworCQlNU01fSFNfREJHKCIlcygpOiBTY2hlZHVsZWQgcnhfdGxldCIsIF9fZnVuY19fKTsKKwl9Cit9CisKKy8qCisgKiAgU3RhbmRhcmQgQVBJLCBDdXJyZW50IHN0YXRlcyBvZiBtb2RlbSBjb250cm9sIGlucHV0cworICoKKyAqIFNpbmNlIENUUyBjYW4gYmUgaGFuZGxlZCBlbnRpcmVseSBieSBIQVJEV0FSRSB3ZSBhbHdheXMKKyAqIGluZGljYXRlIGNsZWFyIHRvIHNlbmQgYW5kIGNvdW50IG9uIHRoZSBUWCBGSUZPIHRvIGJsb2NrIHdoZW4KKyAqIGl0IGZpbGxzIHVwLgorICoKKyAqIC0gVElPQ01fRENECisgKiAtIFRJT0NNX0NUUworICogLSBUSU9DTV9EU1IKKyAqIC0gVElPQ01fUkkKKyAqICAoVW5zdXBwb3J0ZWQpIERDRCBhbmQgRFNSIHdpbGwgcmV0dXJuIHRoZW0gaGlnaC4gUkkgd2lsbCByZXR1cm4gbG93LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG1zbV9oc19nZXRfbWN0cmxfbG9ja2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXJldHVybiBUSU9DTV9EU1IgfCBUSU9DTV9DQVIgfCBUSU9DTV9DVFM7Cit9CisKKy8qCisgKiAgU3RhbmRhcmQgQVBJLCBTZXQgb3IgY2xlYXIgUkZSX3NpZ25hbAorICoKKyAqIFNldCBSRlIgaGlnaCwgKEluZGljYXRlIHdlIGFyZSBub3QgcmVhZHkgZm9yIGRhdGEpLCB3ZSBkaXNhYmxlIGF1dG8KKyAqIHJlYWR5IGZvciByZWNlaXZpbmcgYW5kIHRoZW4gc2V0IFJGUl9OIGhpZ2guIFRvIHNldCBSRlIgdG8gbG93IHdlIGp1c3QgdHVybgorICogYmFjayBhdXRvIHJlYWR5IGZvciByZWNlaXZpbmcgYW5kIGl0IHNob3VsZCBsb3dlciBSRlIgc2lnbmFsCisgKiB3aGVuIGhhcmR3YXJlIGlzIHJlYWR5CisgKi8KK3ZvaWQgbXNtX2hzX3NldF9tY3RybF9sb2NrZWQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsCisJCQkJICAgIHVuc2lnbmVkIGludCBtY3RybCkKK3sKKwl1bnNpZ25lZCBpbnQgc2V0X3J0czsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCisJaWYgKG1zbV91cG9ydC0+cG1fc3RhdGUgIT0gTVNNX0hTX1BNX0FDVElWRSkgeworCQlNU01fSFNfV0FSTigiJXMoKTogQ2xvY2tzIGFyZSBvZmZcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwkvKiBSVFMgaXMgYWN0aXZlIGxvdyAqLworCXNldF9ydHMgPSBUSU9DTV9SVFMgJiBtY3RybCA/IDAgOiAxOworCU1TTV9IU19JTkZPKCIlczogc2V0X3J0cyAlZFxuIiwgX19mdW5jX18sIHNldF9ydHMpOworCisJaWYgKHNldF9ydHMpCisJCW1zbV9oc19kaXNhYmxlX2Zsb3dfY29udHJvbCh1cG9ydCwgZmFsc2UpOworCWVsc2UKKwkJbXNtX2hzX2VuYWJsZV9mbG93X2NvbnRyb2wodXBvcnQsIGZhbHNlKTsKK30KKwordm9pZCBtc21faHNfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCisJbXNtX2hzX3Jlc291cmNlX3ZvdGUobXNtX3Vwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwltc21faHNfc2V0X21jdHJsX2xvY2tlZCh1cG9ydCwgbWN0cmwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJbXNtX2hzX3Jlc291cmNlX3Vudm90ZShtc21fdXBvcnQpOworfQorRVhQT1JUX1NZTUJPTChtc21faHNfc2V0X21jdHJsKTsKKworLyogU3RhbmRhcmQgQVBJLCBFbmFibGUgbW9kZW0gc3RhdHVzIChDVFMpIGludGVycnVwdCAgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19lbmFibGVfbXNfbG9ja2VkKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwlpZiAobXNtX3Vwb3J0LT5wbV9zdGF0ZSAhPSBNU01fSFNfUE1fQUNUSVZFKSB7CisJCU1TTV9IU19XQVJOKCIlcygpOiBDbG9ja3MgYXJlIG9mZlxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyogRW5hYmxlIERFTFRBX0NUUyBJbnRlcnJ1cHQgKi8KKwltc21fdXBvcnQtPmltcl9yZWcgfD0gVUFSVERNX0lTUl9ERUxUQV9DVFNfQk1TSzsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fSU1SLCBtc21fdXBvcnQtPmltcl9yZWcpOworCS8qIEVuc3VyZSByZWdpc3RlciBJTyBjb21wbGV0aW9uICovCisJbWIoKTsKKworfQorCisvKgorICogIFN0YW5kYXJkIEFQSSwgQnJlYWsgU2lnbmFsCisgKgorICogQ29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgYnJlYWsgc2lnbmFsLiBjdGwgZXEgMCA9PiBicmVhaworICogc2lnbmFsIHRlcm1pbmF0ZSBjdGwgbmUgMCA9PiBzdGFydCBicmVhayBzaWduYWwKKyAqLworc3RhdGljIHZvaWQgbXNtX2hzX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGN0bCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwltc21faHNfcmVzb3VyY2Vfdm90ZShtc21fdXBvcnQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgY3RsID8gU1RBUlRfQlJFQUsgOiBTVE9QX0JSRUFLKTsKKwkvKiBFbnN1cmUgcmVnaXN0ZXIgSU8gY29tcGxldGlvbiAqLworCW1iKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9oc19jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGNmZ19mbGFncykKK3sKKwlpZiAoY2ZnX2ZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKKwkJdXBvcnQtPnR5cGUgPSBQT1JUX01TTTsKKworfQorCisvKiAgSGFuZGxlIENUUyBjaGFuZ2VzIChDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc19oYW5kbGVfZGVsdGFfY3RzX2xvY2tlZChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCisJbXNtX2hzX3Jlc291cmNlX3ZvdGUobXNtX3Vwb3J0KTsKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFJFU0VUX0NUUyk7CisJLyogQ2FsbGluZyBDTE9DSyBBUEkuIEhlbmNlIG1iKCkgcmVxdWlyZXMgaGVyZS4gKi8KKwltYigpOworCXVwb3J0LT5pY291bnQuY3RzKys7CisKKwkvKiBjbGVhciB0aGUgSU9DVEwgVElPQ01JV0FJVCBpZiBjYWxsZWQgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnVwb3J0LT5zdGF0ZS0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7CisJbXNtX2hzX3Jlc291cmNlX3Vudm90ZShtc21fdXBvcnQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXNtX2hzX2lzcihpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaXNyX3N0YXR1czsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IChzdHJ1Y3QgbXNtX2hzX3BvcnQgKilkZXY7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmbXNtX3Vwb3J0LT51cG9ydDsKKwlzdHJ1Y3QgY2lyY19idWYgKnR4X2J1ZiA9ICZ1cG9ydC0+c3RhdGUtPnhtaXQ7CisJc3RydWN0IG1zbV9oc190eCAqdHggPSAmbXNtX3Vwb3J0LT50eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCisJaXNyX3N0YXR1cyA9IG1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX01JU1IpOworCU1TTV9IU19JTkZPKCIlczogRE1fSVNSOiAweCV4XG4iLCBfX2Z1bmNfXywgaXNyX3N0YXR1cyk7CisJZHVtcF91YXJ0X2hzX3JlZ2lzdGVycyhtc21fdXBvcnQpOworCisJLyogVWFydCBSWCBzdGFydGluZyAqLworCWlmIChpc3Jfc3RhdHVzICYgVUFSVERNX0lTUl9SWExFVl9CTVNLKSB7CisJCU1TTV9IU19EQkcoIiVzOlVBUlRETV9JU1JfUlhMRVZfQk1TS1xuIiwgX19mdW5jX18pOworCQltc21fdXBvcnQtPmltcl9yZWcgJj0gflVBUlRETV9JU1JfUlhMRVZfQk1TSzsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0lNUiwgbXNtX3Vwb3J0LT5pbXJfcmVnKTsKKwkJLyogQ29tcGxldGUgZGV2aWNlIHdyaXRlIGZvciBJTVIuIEhlbmNlIG1iKCkgcmVxdWlyZXMuICovCisJCW1iKCk7CisJfQorCS8qIFN0YWxlIHJ4IGludGVycnVwdCAqLworCWlmIChpc3Jfc3RhdHVzICYgVUFSVERNX0lTUl9SWFNUQUxFX0JNU0spIHsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBTVEFMRV9FVkVOVF9ESVNBQkxFKTsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBSRVNFVF9TVEFMRV9JTlQpOworCQkvKgorCQkgKiBDb21wbGV0ZSBkZXZpY2Ugd3JpdGUgYmVmb3JlIGNhbGxpbmcgRE1PViBBUEkuIEhlbmNlCisJCSAqIG1iKCkgcmVxdWlyZXMgaGVyZS4KKwkJICovCisJCW1iKCk7CisJCU1TTV9IU19EQkcoIiVzOlN0YWwgSW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisJfQorCS8qIHR4IHJlYWR5IGludGVycnVwdCAqLworCWlmIChpc3Jfc3RhdHVzICYgVUFSVERNX0lTUl9UWF9SRUFEWV9CTVNLKSB7CisJCU1TTV9IU19EQkcoIiVzOiBJU1JfVFhfUkVBRFkgSW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisJCS8qIENsZWFyICBUWCBSZWFkeSAqLworCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIENMRUFSX1RYX1JFQURZKTsKKworCQkvKgorCQkgKiBDb21wbGV0ZSBib3RoIHdyaXRlcyBiZWZvcmUgc3RhcnRpbmcgbmV3IFRYLgorCQkgKiBIZW5jZSBtYigpIHJlcXVpcmVzIGhlcmUuCisJCSAqLworCQltYigpOworCQkvKiBDb21wbGV0ZSBETUEgVFggdHJhbnNhY3Rpb25zIGFuZCBzdWJtaXQgbmV3IHRyYW5zYWN0aW9ucyAqLworCisJCS8qIERvIG5vdCB1cGRhdGUgdHhfYnVmLnRhaWwgaWYgdWFydF9mbHVzaF9idWZmZXIgYWxyZWFkeQorCQkgKiBjYWxsZWQgaW4gc2VyaWFsIGNvcmUKKwkJICovCisJCWlmICghdWFydF9jaXJjX2VtcHR5KHR4X2J1ZikpCisJCQl0eF9idWYtPnRhaWwgPSAodHhfYnVmLT50YWlsICsKKwkJCQkJdHgtPnR4X2NvdW50KSAmIH5VQVJUX1hNSVRfU0laRTsKKworCQl0eC0+ZG1hX2luX2ZsaWdodCA9IGZhbHNlOworCisJCXVwb3J0LT5pY291bnQudHggKz0gdHgtPnR4X2NvdW50OworCisJCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh0eF9idWYpIDwgV0FLRVVQX0NIQVJTKQorCQkJdWFydF93cml0ZV93YWtldXAodXBvcnQpOworCX0KKwlpZiAoaXNyX3N0YXR1cyAmIFVBUlRETV9JU1JfVFhMRVZfQk1TSykgeworCQkvKiBUWCBGSUZPIGlzIGVtcHR5ICovCisJCW1zbV91cG9ydC0+aW1yX3JlZyAmPSB+VUFSVERNX0lTUl9UWExFVl9CTVNLOworCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fSU1SLCBtc21fdXBvcnQtPmltcl9yZWcpOworCQlNU01fSFNfREJHKCIlczogVFhMRVYgSW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7CisJCS8qCisJCSAqIENvbXBsZXRlIGRldmljZSB3cml0ZSBiZWZvcmUgc3RhcnRpbmcgY2xvY2tfb2ZmIHJlcXVlc3QuCisJCSAqIEhlbmNlIG1iKCkgcmVxdWlyZXMgaGVyZS4KKwkJICovCisJCW1iKCk7CisJCXF1ZXVlX3dvcmsobXNtX3Vwb3J0LT5oc3VhcnRfd3EsICZtc21fdXBvcnQtPmNsb2NrX29mZl93KTsKKwl9CisKKwkvKiBDaGFuZ2UgaW4gQ1RTIGludGVycnVwdCAqLworCWlmIChpc3Jfc3RhdHVzICYgVUFSVERNX0lTUl9ERUxUQV9DVFNfQk1TSykKKwkJbXNtX2hzX2hhbmRsZV9kZWx0YV9jdHNfbG9ja2VkKHVwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBwcm92aWRlIGludGVyZmFjZXMgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nCisgKiBwb3J0IHN0cnVjdHVyZSAoc3RydWN0IHVhcnRfcG9ydCBvciBzdHJ1Y3QgbXNtX2hzX3BvcnQpIGdpdmVuCisgKiB0aGUgcG9ydCBpbmRleC4gbXNtX2hzX2dldF91YXJ0IHBvcnQgaXMgY2FsbGVkIGJ5IGNsaWVudHMuCisgKiBUaGUgZnVuY3Rpb24gbXNtX2hzX2dldF9oc19wb3J0IGlzIGZvciBpbnRlcm5hbCB1c2UKKyAqLworCitzdHJ1Y3QgdWFydF9wb3J0ICptc21faHNfZ2V0X3VhcnRfcG9ydChpbnQgcG9ydF9pbmRleCkKK3sKKwlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBtc21faHNfZHJpdmVyLnN0YXRlICsgcG9ydF9pbmRleDsKKworCS8qIFRoZSB1YXJ0X2RyaXZlciBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzdGF0ZXMgaW4gYW4gYXJyYXkuCisJICogVGh1cyB0aGUgY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSB0aGUgZHJ2LT5zdGF0ZSByZXR1cm5zCisJICogdGhlIHN0YXRlIGZvciB0aGUgdWFydF9wb3J0IHRoYXQgaXMgcmVxdWVzdGVkCisJICovCisJaWYgKHBvcnRfaW5kZXggPT0gc3RhdGUtPnVhcnRfcG9ydC0+bGluZSkKKwkJcmV0dXJuIHN0YXRlLT51YXJ0X3BvcnQ7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2hzX2dldF91YXJ0X3BvcnQpOworCitzdGF0aWMgc3RydWN0IG1zbV9oc19wb3J0ICptc21faHNfZ2V0X2hzX3BvcnQoaW50IHBvcnRfaW5kZXgpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSBtc21faHNfZ2V0X3VhcnRfcG9ydChwb3J0X2luZGV4KTsKKworCWlmICh1cG9ydCkKKwkJcmV0dXJuIFVBUlRETV9UT19NU00odXBvcnQpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIGVuYWJsZV93YWtldXBfaW50ZXJydXB0KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmKG1zbV91cG9ydC0+dXBvcnQpOworCisJaWYgKCFpc191c2VfbG93X3Bvd2VyX3dha2V1cChtc21fdXBvcnQpKQorCQlyZXR1cm47CisJaWYgKG1zbV91cG9ydC0+d2FrZXVwLmZyZWVkKQorCQlyZXR1cm47CisKKwlpZiAoIShtc21fdXBvcnQtPndha2V1cC5lbmFibGVkKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJbXNtX3Vwb3J0LT53YWtldXAuaWdub3JlID0gMTsKKwkJbXNtX3Vwb3J0LT53YWtldXAuZW5hYmxlZCA9IHRydWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJCWRpc2FibGVfaXJxKHVwb3J0LT5pcnEpOworCQllbmFibGVfaXJxKG1zbV91cG9ydC0+d2FrZXVwLmlycSk7CisJfSBlbHNlIHsKKwkJTVNNX0hTX1dBUk4oIiVzOldha2UgdXAgSVJRIGFscmVhZHkgZW5hYmxlZCIsIF9fZnVuY19fKTsKKwl9Cit9CisKK3ZvaWQgZGlzYWJsZV93YWtldXBfaW50ZXJydXB0KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmKG1zbV91cG9ydC0+dXBvcnQpOworCisJaWYgKCFpc191c2VfbG93X3Bvd2VyX3dha2V1cChtc21fdXBvcnQpKQorCQlyZXR1cm47CisJaWYgKG1zbV91cG9ydC0+d2FrZXVwLmZyZWVkKQorCQlyZXR1cm47CisKKwlpZiAobXNtX3Vwb3J0LT53YWtldXAuZW5hYmxlZCkgeworCQlkaXNhYmxlX2lycV9ub3N5bmMobXNtX3Vwb3J0LT53YWtldXAuaXJxKTsKKwkJZW5hYmxlX2lycSh1cG9ydC0+aXJxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJCW1zbV91cG9ydC0+d2FrZXVwLmVuYWJsZWQgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlNU01fSFNfV0FSTigiJXM6V2FrZSB1cCBJUlEgYWxyZWFkeSBkaXNhYmxlZCIsIF9fZnVuY19fKTsKKwl9Cit9CisKK3ZvaWQgbXNtX2hzX3Jlc291cmNlX29mZihzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlNU01fSFNfREJHKCIlcygpOiBiZWdpbiIsIF9fZnVuY19fKTsKKwltc21faHNfZGlzYWJsZV9mbG93X2NvbnRyb2wodXBvcnQsIGZhbHNlKTsKKwlpZiAobXNtX3Vwb3J0LT5yeC5mbHVzaCA9PSBGTFVTSF9OT05FKQorCQltc21faHNfZGlzY29ubmVjdF9yeCh1cG9ydCk7CisKKwkvKiBkaXNhYmxlIGRsaW5rICovCisJaWYgKG1zbV91cG9ydC0+dHguZmx1c2ggPT0gRkxVU0hfTk9ORSkKKwkJd2FpdF9ldmVudF90aW1lb3V0KG1zbV91cG9ydC0+dHgud2FpdCwKKwkJCW1zbV91cG9ydC0+dHguZmx1c2ggPT0gRkxVU0hfU1RPUCwgNTAwKTsKKworCWlmIChtc21fdXBvcnQtPnR4LmZsdXNoICE9IEZMVVNIX1NIVVRET1dOKSB7CisJCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9ETUVOKTsKKwkJZGF0YSAmPSB+VUFSVERNX1RYX0JBTV9FTkFCTEVfQk1TSzsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0RNRU4sIGRhdGEpOworCQlzcHNfdHhfZGlzY29ubmVjdChtc21fdXBvcnQpOworCX0KKwlpZiAoIWF0b21pY19yZWFkKCZtc21fdXBvcnQtPmNsaWVudF9yZXFfc3RhdGUpKQorCQltc21faHNfZW5hYmxlX2Zsb3dfY29udHJvbCh1cG9ydCwgZmFsc2UpOworfQorCit2b2lkIG1zbV9oc19yZXNvdXJjZV9vbihzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICYobXNtX3Vwb3J0LT51cG9ydCk7CisJdW5zaWduZWQgaW50IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChtc21fdXBvcnQtPnJ4LmZsdXNoID09IEZMVVNIX1NIVVRET1dOIHx8CisJbXNtX3Vwb3J0LT5yeC5mbHVzaCA9PSBGTFVTSF9TVE9QKSB7CisJCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfUlgpOworCQlkYXRhID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fRE1FTik7CisJCWRhdGEgfD0gVUFSVERNX1JYX0JBTV9FTkFCTEVfQk1TSzsKKwkJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0RNRU4sIGRhdGEpOworCX0KKworCW1zbV9oc19zcHNjb25uZWN0X3R4KG1zbV91cG9ydCk7CisJaWYgKG1zbV91cG9ydC0+cnguZmx1c2ggPT0gRkxVU0hfU0hVVERPV04pIHsKKwkJbXNtX2hzX3Nwc2Nvbm5lY3RfcngodXBvcnQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJbXNtX2hzX3N0YXJ0X3J4X2xvY2tlZCh1cG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJfQorfQorCisvKiBSZXF1ZXN0IHRvIHR1cm4gb2ZmIHVhcnQgY2xvY2sgb25jZSBwZW5kaW5nIFRYIGlzIGZsdXNoZWQgKi8KK2ludCBtc21faHNfcmVxdWVzdF9jbG9ja19vZmYoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2xpZW50X2NvdW50ID0gMDsKKworCW11dGV4X2xvY2soJm1zbV91cG9ydC0+bXR4KTsKKwkvKgorCSAqIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBzeXN0ZW0gc3VzcGVuZCwgZG9uJ3QgcHJvY2VzcyB0aGVzZQorCSAqIHVzZXJzcGFjZS9rZXJuZWwgQVBJIGNvbW1hbmRzLgorCSAqLworCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlID09IE1TTV9IU19QTV9TWVNfU1VTUEVOREVEKSB7CisJCU1TTV9IU19XQVJOKCIlczpDYW4ndCBwcm9jZXNzIGNsayByZXF1ZXN0IGR1cmluZyBzdXNwZW5kIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtc21fdXBvcnQtPm10eCk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3JlcXVlc3RfY2xvY2tfb2ZmOworCisJaWYgKGF0b21pY19yZWFkKCZtc21fdXBvcnQtPmNsaWVudF9jb3VudCkgPD0gMCkgeworCQlNU01fSFNfV0FSTigiJXMoKTogaW9jdGwgY291bnQgLXZlLCBjbGllbnQgY2hlY2sgdm90aW5nIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIGV4aXRfcmVxdWVzdF9jbG9ja19vZmY7CisJfQorCS8qIFNldCB0aGUgZmxhZyB0byBkaXNhYmxlIGZsb3cgY29udHJvbCBhbmQgd2FrZXVwIGlycSAqLworCWlmIChtc21fdXBvcnQtPm9icykKKwkJYXRvbWljX3NldCgmbXNtX3Vwb3J0LT5jbGllbnRfcmVxX3N0YXRlLCAxKTsKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJYXRvbWljX2RlYygmbXNtX3Vwb3J0LT5jbGllbnRfY291bnQpOworCWNsaWVudF9jb3VudCA9IGF0b21pY19yZWFkKCZtc21fdXBvcnQtPmNsaWVudF9jb3VudCk7CisJTE9HX1VTUl9NU0cobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX3B3cl9jdHh0LAorCQkJIiVzOiBDbGllbnRfQ291bnQgJWRcbiIsIF9fZnVuY19fLAorCQkJY2xpZW50X2NvdW50KTsKK2V4aXRfcmVxdWVzdF9jbG9ja19vZmY6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobXNtX2hzX3JlcXVlc3RfY2xvY2tfb2ZmKTsKKworaW50IG1zbV9oc19yZXF1ZXN0X2Nsb2NrX29uKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisJaW50IGNsaWVudF9jb3VudDsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJm1zbV91cG9ydC0+bXR4KTsKKwkvKgorCSAqIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBzeXN0ZW0gc3VzcGVuZCwgZG9uJ3QgcHJvY2VzcyB0aGVzZQorCSAqIHVzZXJzcGFjZS9rZXJuZWwgQVBJIGNvbW1hbmRzLgorCSAqLworCWlmIChtc21fdXBvcnQtPnBtX3N0YXRlID09IE1TTV9IU19QTV9TWVNfU1VTUEVOREVEKSB7CisJCU1TTV9IU19XQVJOKCIlczpDYW4ndCBwcm9jZXNzIGNsayByZXF1ZXN0IGR1cmluZyBzdXNwZW5kIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtc21fdXBvcnQtPm10eCk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X3JlcXVlc3RfY2xvY2tfb247CisKKwltc21faHNfcmVzb3VyY2Vfdm90ZShVQVJURE1fVE9fTVNNKHVwb3J0KSk7CisJYXRvbWljX2luYygmbXNtX3Vwb3J0LT5jbGllbnRfY291bnQpOworCWNsaWVudF9jb3VudCA9IGF0b21pY19yZWFkKCZtc21fdXBvcnQtPmNsaWVudF9jb3VudCk7CisJTE9HX1VTUl9NU0cobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX3B3cl9jdHh0LAorCQkJIiVzOiBDbGllbnRfQ291bnQgJWRcbiIsIF9fZnVuY19fLAorCQkJY2xpZW50X2NvdW50KTsKKworCS8qIENsZWFyIHRoZSBmbGFnICovCisJaWYgKG1zbV91cG9ydC0+b2JzKQorCQlhdG9taWNfc2V0KCZtc21fdXBvcnQtPmNsaWVudF9yZXFfc3RhdGUsIDApOworZXhpdF9yZXF1ZXN0X2Nsb2NrX29uOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1zbV9oc19yZXF1ZXN0X2Nsb2NrX29uKTsKKworc3RhdGljIGlycXJldHVybl90IG1zbV9oc193YWtldXBfaXNyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgd2FrZXVwID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gKHN0cnVjdCBtc21faHNfcG9ydCAqKWRldjsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZtc21fdXBvcnQtPnVwb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobXNtX3Vwb3J0LT53YWtldXAuaWdub3JlKQorCQltc21fdXBvcnQtPndha2V1cC5pZ25vcmUgPSAwOworCWVsc2UKKwkJd2FrZXVwID0gMTsKKworCWlmICh3YWtldXApIHsKKwkJLyoKKwkJICogUG9ydCB3YXMgY2xvY2tlZCBvZmYgZHVyaW5nIHJ4LCB3YWtlIHVwIGFuZAorCQkgKiBvcHRpb25hbGx5IGluamVjdCBjaGFyIGludG8gdHR5IHJ4CisJCSAqLworCQlpZiAobXNtX3Vwb3J0LT53YWtldXAuaW5qZWN0X3J4KSB7CisJCQl0dHkgPSB1cG9ydC0+c3RhdGUtPnBvcnQudHR5OworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LT5wb3J0LAorCQkJCQkgICAgIG1zbV91cG9ydC0+d2FrZXVwLnJ4X3RvX2luamVjdCwKKwkJCQkJICAgICBUVFlfTk9STUFMKTsKKwkJCWhleF9kdW1wX2lwYyhtc21fdXBvcnQsIG1zbV91cG9ydC0+cnguaXBjX3J4X2N0eHQsCisJCQkJIlJ4IEluamVjdCIsCisJCQkJJm1zbV91cG9ydC0+d2FrZXVwLnJ4X3RvX2luamVjdCwgMCwgMSk7CisJCQlNU01fSFNfSU5GTygiV2FrZXVwIElTUi5JZ25vcmUlZFxuIiwKKwkJCQkJCW1zbV91cG9ydC0+d2FrZXVwLmlnbm9yZSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdha2V1cCAmJiBtc21fdXBvcnQtPndha2V1cC5pbmplY3RfcngpCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eS0+cG9ydCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbXNtX2hzX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gIk1TTSBIUyBVQVJUIjsKK30KKworLyoqCisgKiBtc21faHNfdW5jb25maWdfdWFydF9ncGlvczogVW5jb25maWd1cmVzIFVBUlQgR1BJT3MKKyAqIEB1cG9ydDogdWFydCBwb3J0CisgKi8KK3N0YXRpYyB2b2lkIG1zbV9oc191bmNvbmZpZ191YXJ0X2dwaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UodXBvcnQtPmRldik7CisJY29uc3Qgc3RydWN0IG1zbV9zZXJpYWxfaHNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCWludCByZXQ7CisKKwlpZiAobXNtX3Vwb3J0LT51c2VfcGluY3RybCkgeworCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShtc21fdXBvcnQtPnBpbmN0cmwsCisJCQkJbXNtX3Vwb3J0LT5ncGlvX3N0YXRlX3N1c3BlbmQpOworCQlpZiAocmV0KQorCQkJTVNNX0hTX0VSUigiJXMoKTpGYWlsZWQgdG8gcGluY3RybCBzZXRfc3RhdGUiLAorCQkJCV9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKHBkYXRhKSB7CisJCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT51YXJ0X3R4X2dwaW8pKQorCQkJZ3Bpb19mcmVlKHBkYXRhLT51YXJ0X3R4X2dwaW8pOworCQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+dWFydF9yeF9ncGlvKSkKKwkJCWdwaW9fZnJlZShwZGF0YS0+dWFydF9yeF9ncGlvKTsKKwkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVhcnRfY3RzX2dwaW8pKQorCQkJZ3Bpb19mcmVlKHBkYXRhLT51YXJ0X2N0c19ncGlvKTsKKwkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVhcnRfcmZyX2dwaW8pKQorCQkJZ3Bpb19mcmVlKHBkYXRhLT51YXJ0X3Jmcl9ncGlvKTsKKwl9IGVsc2UKKwkJTVNNX0hTX0VSUigiRXJyb3I6UGRhdGEgaXMgTlVMTC5cbiIpOworfQorCisvKioKKyAqIG1zbV9oc19jb25maWdfdWFydF9ncGlvcyAtIENvbmZpZ3VyZXMgVUFSVCBHUElPcworICogQHVwb3J0OiB1YXJ0IHBvcnQKKyAqLworc3RhdGljIGludCBtc21faHNfY29uZmlnX3VhcnRfZ3Bpb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZSh1cG9ydC0+ZGV2KTsKKwljb25zdCBzdHJ1Y3QgbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCQkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQgPSAwOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKG1zbV91cG9ydC0+cGluY3RybCkpIHsKKwkJTVNNX0hTX0RCRygiJXMoKTogVXNpbmcgUGluY3RybCIsIF9fZnVuY19fKTsKKwkJbXNtX3Vwb3J0LT51c2VfcGluY3RybCA9IHRydWU7CisJCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKG1zbV91cG9ydC0+cGluY3RybCwKKwkJCQltc21fdXBvcnQtPmdwaW9fc3RhdGVfYWN0aXZlKTsKKwkJaWYgKHJldCkKKwkJCU1TTV9IU19FUlIoIiVzKCk6IEZhaWxlZCB0byBwaW5jdHJsIHNldF9zdGF0ZSIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAocGRhdGEpIHsKKwkJLyogRmFsbCBiYWNrIHRvIHVzaW5nIGdwaW8gbGliICovCisJCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT51YXJ0X3R4X2dwaW8pKSB7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPnVhcnRfdHhfZ3BpbywKKwkJCQkJCQkiVUFSVF9UWF9HUElPIik7CisJCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJCU1TTV9IU19FUlIoImdwaW8gcmVxdWVzdCBmYWlsZWQgZm9yOiVkXG4iLAorCQkJCQlwZGF0YS0+dWFydF90eF9ncGlvKTsKKwkJCQlnb3RvIGV4aXRfdWFydF9jb25maWc7CisJCQl9CisJCX0KKworCQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+dWFydF9yeF9ncGlvKSkgeworCQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT51YXJ0X3J4X2dwaW8sCisJCQkJCQkJIlVBUlRfUlhfR1BJTyIpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlNU01fSFNfRVJSKCJncGlvIHJlcXVlc3QgZmFpbGVkIGZvcjolZFxuIiwKKwkJCQkJcGRhdGEtPnVhcnRfcnhfZ3Bpbyk7CisJCQkJZ290byB1YXJ0X3R4X3VuY29uZmlnOworCQkJfQorCQl9CisKKwkJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVhcnRfY3RzX2dwaW8pKSB7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPnVhcnRfY3RzX2dwaW8sCisJCQkJCQkJIlVBUlRfQ1RTX0dQSU8iKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJTVNNX0hTX0VSUigiZ3BpbyByZXF1ZXN0IGZhaWxlZCBmb3I6JWRcbiIsCisJCQkJCXBkYXRhLT51YXJ0X2N0c19ncGlvKTsKKwkJCQlnb3RvIHVhcnRfcnhfdW5jb25maWc7CisJCQl9CisJCX0KKworCQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+dWFydF9yZnJfZ3BpbykpIHsKKwkJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+dWFydF9yZnJfZ3BpbywKKwkJCQkJCQkiVUFSVF9SRlJfR1BJTyIpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlNU01fSFNfRVJSKCJncGlvIHJlcXVlc3QgZmFpbGVkIGZvcjolZFxuIiwKKwkJCQkJcGRhdGEtPnVhcnRfcmZyX2dwaW8pOworCQkJCWdvdG8gdWFydF9jdHNfdW5jb25maWc7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlNU01fSFNfRVJSKCJQZGF0YSBpcyBOVUxMLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7CisKK3VhcnRfY3RzX3VuY29uZmlnOgorCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT51YXJ0X2N0c19ncGlvKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT51YXJ0X2N0c19ncGlvKTsKK3VhcnRfcnhfdW5jb25maWc6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVhcnRfcnhfZ3BpbykpCisJCWdwaW9fZnJlZShwZGF0YS0+dWFydF9yeF9ncGlvKTsKK3VhcnRfdHhfdW5jb25maWc6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVhcnRfdHhfZ3BpbykpCisJCWdwaW9fZnJlZShwZGF0YS0+dWFydF90eF9ncGlvKTsKK2V4aXRfdWFydF9jb25maWc6CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBtc21faHNfZ2V0X3BpbmN0cmxfY29uZmlncyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqc2V0X3N0YXRlOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisKKwltc21fdXBvcnQtPnBpbmN0cmwgPSBkZXZtX3BpbmN0cmxfZ2V0KHVwb3J0LT5kZXYpOworCWlmIChJU19FUlJfT1JfTlVMTChtc21fdXBvcnQtPnBpbmN0cmwpKSB7CisJCU1TTV9IU19EQkcoIiVzKCk6IFBpbmN0cmwgbm90IGRlZmluZWQiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJTVNNX0hTX0RCRygiJXMoKTogVXNpbmcgUGluY3RybCIsIF9fZnVuY19fKTsKKwkJbXNtX3Vwb3J0LT51c2VfcGluY3RybCA9IHRydWU7CisKKwkJc2V0X3N0YXRlID0gcGluY3RybF9sb29rdXBfc3RhdGUobXNtX3Vwb3J0LT5waW5jdHJsLAorCQkJCQkJUElOQ1RSTF9TVEFURV9ERUZBVUxUKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKHNldF9zdGF0ZSkpIHsKKwkJCWRldl9lcnIodXBvcnQtPmRldiwKKwkJCQkicGluY3RybCBsb29rdXAgZmFpbGVkIGZvciBkZWZhdWx0IHN0YXRlIik7CisJCQlnb3RvIHBpbmN0cmxfZmFpbDsKKwkJfQorCisJCU1TTV9IU19EQkcoIiVzKCk6IFBpbmN0cmwgc3RhdGUgYWN0aXZlICVwXG4iLCBfX2Z1bmNfXywKKwkJCXNldF9zdGF0ZSk7CisJCW1zbV91cG9ydC0+Z3Bpb19zdGF0ZV9hY3RpdmUgPSBzZXRfc3RhdGU7CisKKwkJc2V0X3N0YXRlID0gcGluY3RybF9sb29rdXBfc3RhdGUobXNtX3Vwb3J0LT5waW5jdHJsLAorCQkJCQkJUElOQ1RSTF9TVEFURV9TTEVFUCk7CisJCWlmIChJU19FUlJfT1JfTlVMTChzZXRfc3RhdGUpKSB7CisJCQlkZXZfZXJyKHVwb3J0LT5kZXYsCisJCQkJInBpbmN0cmwgbG9va3VwIGZhaWxlZCBmb3Igc2xlZXAgc3RhdGUiKTsKKwkJCWdvdG8gcGluY3RybF9mYWlsOworCQl9CisKKwkJTVNNX0hTX0RCRygiJXMoKTogUGluY3RybCBzdGF0ZSBzbGVlcCAlcFxuIiwgX19mdW5jX18sCisJCQlzZXRfc3RhdGUpOworCQltc21fdXBvcnQtPmdwaW9fc3RhdGVfc3VzcGVuZCA9IHNldF9zdGF0ZTsKKwkJcmV0dXJuOworCX0KK3BpbmN0cmxfZmFpbDoKKwltc21fdXBvcnQtPnBpbmN0cmwgPSBOVUxMOworfQorCisvKiBDYWxsZWQgd2hlbiBwb3J0IGlzIG9wZW5lZCAqLworc3RhdGljIGludCBtc21faHNfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlpbnQgcmV0OworCWludCByZnJfbGV2ZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IFVBUlRETV9UT19NU00odXBvcnQpOworCXN0cnVjdCBjaXJjX2J1ZiAqdHhfYnVmID0gJnVwb3J0LT5zdGF0ZS0+eG1pdDsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisJc3RydWN0IHNwc19waXBlICpzcHNfcGlwZV9oYW5kbGVfdHggPSB0eC0+Y29ucy5waXBlX2hhbmRsZTsKKwlzdHJ1Y3Qgc3BzX3BpcGUgKnNwc19waXBlX2hhbmRsZV9yeCA9IHJ4LT5wcm9kLnBpcGVfaGFuZGxlOworCisJcmZyX2xldmVsID0gdXBvcnQtPmZpZm9zaXplOworCWlmIChyZnJfbGV2ZWwgPiAxNikKKwkJcmZyX2xldmVsIC09IDE2OworCisJdHgtPmRtYV9iYXNlID0gZG1hX21hcF9zaW5nbGUodXBvcnQtPmRldiwgdHhfYnVmLT5idWYsIFVBUlRfWE1JVF9TSVpFLAorCQkJCSAgICAgIERNQV9UT19ERVZJQ0UpOworCisJLyogdHVybiBvbiB1YXJ0IGNsayAqLworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisKKwlpZiAoaXNfdXNlX2xvd19wb3dlcl93YWtldXAobXNtX3Vwb3J0KSkgeworCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShtc21fdXBvcnQtPndha2V1cC5pcnEsIE5VTEwsCisJCQkJCW1zbV9oc193YWtldXBfaXNyLAorCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJIm1zbV9oc193YWtldXAiLCBtc21fdXBvcnQpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJTVNNX0hTX0VSUigiJXMoKTpFcnIgZ2V0dGluZyB1YXJ0IHdha2V1cF9pcnEgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gdW52b3RlX2V4aXQ7CisJCX0KKworCQltc21fdXBvcnQtPndha2V1cC5mcmVlZCA9IGZhbHNlOworCQlkaXNhYmxlX2lycShtc21fdXBvcnQtPndha2V1cC5pcnEpOworCQltc21fdXBvcnQtPndha2V1cC5lbmFibGVkID0gZmFsc2U7CisKKwkJcmV0ID0gaXJxX3NldF9pcnFfd2FrZShtc21fdXBvcnQtPndha2V1cC5pcnEsIDEpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJTVNNX0hTX0VSUigiJXMoKTpFcnIgc2V0dGluZyB3YWtldXAgaXJxXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGZyZWVfdWFydF9pcnE7CisJCX0KKwl9CisKKwlyZXQgPSBtc21faHNfY29uZmlnX3VhcnRfZ3Bpb3ModXBvcnQpOworCWlmIChyZXQpIHsKKwkJTVNNX0hTX0VSUigiVWFydCBHUElPIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJZ290byBmcmVlX3VhcnRfaXJxOworCX0KKworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9ETUVOLCAwKTsKKworCS8qIENvbm5lY3QgVFggKi8KKwlzcHNfdHhfZGlzY29ubmVjdChtc21fdXBvcnQpOworCXJldCA9IG1zbV9oc19zcHNjb25uZWN0X3R4KG1zbV91cG9ydCk7CisJaWYgKHJldCkgeworCQlNU01fSFNfRVJSKCJtc21fc2VyaWFsX2hzOiBTUFMgY29ubmVjdCBmYWlsZWQgZm9yIFRYIik7CisJCWdvdG8gdW5jb25maWdfdWFydF9ncGlvczsKKwl9CisKKwkvKiBDb25uZWN0IFJYICovCisJa3RocmVhZF9mbHVzaF93b3JrZXIoJm1zbV91cG9ydC0+cngua3dvcmtlcik7CisJaWYgKHJ4LT5mbHVzaCAhPSBGTFVTSF9TSFVURE9XTikKKwkJZGlzY29ubmVjdF9yeF9lbmRwb2ludChtc21fdXBvcnQpOworCXJldCA9IG1zbV9oc19zcHNjb25uZWN0X3J4KHVwb3J0KTsKKwlpZiAocmV0KSB7CisJCU1TTV9IU19FUlIoIm1zbV9zZXJpYWxfaHM6IFNQUyBjb25uZWN0IGZhaWxlZCBmb3IgUlgiKTsKKwkJZ290byBzcHNfZGlzY29ubmVjdF90eDsKKwl9CisKKwlkYXRhID0gKFVBUlRETV9CQ1JfVFhfQlJFQUtfRElTQUJMRSB8IFVBUlRETV9CQ1JfU1RBTEVfSVJRX0VNUFRZIHwKKwkJVUFSVERNX0JDUl9SWF9ETVJYX0xPV19FTiB8IFVBUlRETV9CQ1JfUlhfU1RBTF9JUlFfRE1SWF9FUUwgfAorCQlVQVJURE1fQkNSX1JYX0RNUlhfMUJZVEVfUkVTX0VOKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQkNSLCBkYXRhKTsKKworCS8qIFNldCBhdXRvIFJGUiBMZXZlbCAqLworCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9NUjEpOworCWRhdGEgJj0gflVBUlRETV9NUjFfQVVUT19SRlJfTEVWRUwxX0JNU0s7CisJZGF0YSAmPSB+VUFSVERNX01SMV9BVVRPX1JGUl9MRVZFTDBfQk1TSzsKKwlkYXRhIHw9IChVQVJURE1fTVIxX0FVVE9fUkZSX0xFVkVMMV9CTVNLICYgKHJmcl9sZXZlbCA8PCAyKSk7CisJZGF0YSB8PSAoVUFSVERNX01SMV9BVVRPX1JGUl9MRVZFTDBfQk1TSyAmIHJmcl9sZXZlbCk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX01SMSwgZGF0YSk7CisKKwkvKiBNYWtlIHN1cmUgUlhTVEFMRSBjb3VudCBpcyBub24temVybyAqLworCWRhdGEgPSBtc21faHNfcmVhZCh1cG9ydCwgVUFSVF9ETV9JUFIpOworCWlmICghZGF0YSkgeworCQlkYXRhIHw9IDB4MWYgJiBVQVJURE1fSVBSX1NUQUxFX0xTQl9CTVNLOworCQltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fSVBSLCBkYXRhKTsKKwl9CisKKwkvKiBBc3N1bWUgbm8gZmxvdyBjb250cm9sLCB1bmxlc3MgdGVybWlvcyBzZXRzIGl0ICovCisJbXNtX3Vwb3J0LT5mbG93X2NvbnRyb2wgPSBmYWxzZTsKKwltc21faHNfZGlzYWJsZV9mbG93X2NvbnRyb2wodXBvcnQsIHRydWUpOworCisKKwkvKiBSZXNldCBUWCAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfVFgpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfUlgpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfRVJST1JfU1RBVFVTKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFJFU0VUX0JSRUFLX0lOVCk7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBSRVNFVF9TVEFMRV9JTlQpOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgUkVTRVRfQ1RTKTsKKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fQ1IsIFJGUl9MT1cpOworCS8qIFR1cm4gb24gVWFydCBSZWNlaXZlciAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgVUFSVERNX0NSX1JYX0VOX0JNU0spOworCisJLyogVHVybiBvbiBVYXJ0IFRyYW5zbWl0dGVyICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBVQVJURE1fQ1JfVFhfRU5fQk1TSyk7CisKKwl0eC0+ZG1hX2luX2ZsaWdodCA9IGZhbHNlOworCU1TTV9IU19EQkcoIiVzKCk6ZGVzYyB1c2FnZSBmbGFnIDB4JWx4IiwgX19mdW5jX18sIHJ4LT5xdWV1ZWRfZmxhZyk7CisJc2V0dXBfdGltZXIoJih0eC0+dHhfdGltZW91dF90aW1lciksCisJCQl0eF90aW1lb3V0X2hhbmRsZXIsCisJCQkodW5zaWduZWQgbG9uZykgbXNtX3Vwb3J0KTsKKworCS8qIEVuYWJsZSByZWFkaW5nIHRoZSBjdXJyZW50IENUUywgbm8gaGFybSBldmVuIGlmIENUUyBpcyBpZ25vcmVkICovCisJbXNtX3Vwb3J0LT5pbXJfcmVnIHw9IFVBUlRETV9JU1JfQ1VSUkVOVF9DVFNfQk1TSzsKKworCS8qIFRYTEVWIG9uIGVtcHR5IFRYIGZpZm8gKi8KKwltc21faHNfd3JpdGUodXBvcnQsIFVBUlRfRE1fVEZXUiwgNCk7CisJLyoKKwkgKiBDb21wbGV0ZSBhbGwgZGV2aWNlIHdyaXRlIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBiZWZvcmUKKwkgKiBxdWV1aW5nIFJYIHJlcXVlc3QuIEhlbmNlIG1iKCkgcmVxdWlyZXMgaGVyZS4KKwkgKi8KKwltYigpOworCisJcmV0ID0gcmVxdWVzdF9pcnEodXBvcnQtPmlycSwgbXNtX2hzX2lzciwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkgICJtc21faHNfdWFydCIsIG1zbV91cG9ydCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJTVNNX0hTX0VSUigiJXMoKTpFcnJvciAlZCBnZXR0aW5nIHVhcnQgaXJxXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBzcHNfZGlzY29ubmVjdF9yeDsKKwl9CisKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCWF0b21pY19zZXQoJm1zbV91cG9ydC0+Y2xpZW50X2NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZtc21fdXBvcnQtPmNsaWVudF9yZXFfc3RhdGUsIDApOworCUxPR19VU1JfTVNHKG1zbV91cG9ydC0+aXBjX21zbV9oc19wd3JfY3R4dCwKKwkJCSIlczogQ2xpZW50X0NvdW50IDBcbiIsIF9fZnVuY19fKTsKKwltc21faHNfc3RhcnRfcnhfbG9ja2VkKHVwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJcmV0dXJuIDA7CisKK3Nwc19kaXNjb25uZWN0X3J4OgorCXNwc19kaXNjb25uZWN0KHNwc19waXBlX2hhbmRsZV9yeCk7CitzcHNfZGlzY29ubmVjdF90eDoKKwlzcHNfZGlzY29ubmVjdChzcHNfcGlwZV9oYW5kbGVfdHgpOwordW5jb25maWdfdWFydF9ncGlvczoKKwltc21faHNfdW5jb25maWdfdWFydF9ncGlvcyh1cG9ydCk7CitmcmVlX3VhcnRfaXJxOgorCWZyZWVfaXJxKHVwb3J0LT5pcnEsIG1zbV91cG9ydCk7Cit1bnZvdGVfZXhpdDoKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJTVNNX0hTX0VSUigiJXMoKTogRXJyb3IgcmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldDsKK30KKworLyogSW5pdGlhbGl6ZSB0eCBhbmQgcnggZGF0YSBzdHJ1Y3R1cmVzICovCitzdGF0aWMgaW50IHVhcnRkbV9pbml0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKwlzdHJ1Y3QgbXNtX2hzX3R4ICp0eCA9ICZtc21fdXBvcnQtPnR4OworCXN0cnVjdCBtc21faHNfcnggKnJ4ID0gJm1zbV91cG9ydC0+cng7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyeC0+d2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHgtPndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1zbV91cG9ydC0+YmFtX2Rpc2Nvbm5lY3Rfd2FpdCk7CisKKwkvKiBJbml0IGtlcm5lbCB0aHJlYWRzIGZvciB0eCBhbmQgcnggKi8KKworCWt0aHJlYWRfaW5pdF93b3JrZXIoJnJ4LT5rd29ya2VyKTsKKwlyeC0+dGFzayA9IGt0aHJlYWRfcnVuKGt0aHJlYWRfd29ya2VyX2ZuLAorCQkJJnJ4LT5rd29ya2VyLCAibXNtX3NlcmlhbF9oc18lZF9yeF93b3JrIiwgdXBvcnQtPmxpbmUpOworCWlmIChJU19FUlIocngtPnRhc2spKSB7CisJCU1TTV9IU19FUlIoIiVzKCk6IGVycm9yIGNyZWF0aW5nIHRhc2siLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXhpdF9saF9pbml0OworCX0KKwlrdGhyZWFkX2luaXRfd29yaygmcngtPmt3b3JrLCBtc21fc2VyaWFsX2hzX3J4X3dvcmspOworCisJa3RocmVhZF9pbml0X3dvcmtlcigmdHgtPmt3b3JrZXIpOworCXR4LT50YXNrID0ga3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCisJCQkmdHgtPmt3b3JrZXIsICJtc21fc2VyaWFsX2hzXyVkX3R4X3dvcmsiLCB1cG9ydC0+bGluZSk7CisJaWYgKElTX0VSUihyeC0+dGFzaykpIHsKKwkJTVNNX0hTX0VSUigiJXMoKTogZXJyb3IgY3JlYXRpbmcgdGFzayIsIF9fZnVuY19fKTsKKwkJZ290byBleGl0X2xoX2luaXQ7CisJfQorCisJa3RocmVhZF9pbml0X3dvcmsoJnR4LT5rd29yaywgbXNtX3NlcmlhbF9oc190eF93b3JrKTsKKworCXJ4LT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQodXBvcnQtPmRldiwKKwkJCQlVQVJUX0RNQV9ERVNDX05SICogVUFSVERNX1JYX0JVRl9TSVpFLAorCQkJCSAmcngtPnJidWZmZXIsIEdGUF9LRVJORUwpOworCWlmICghcngtPmJ1ZmZlcikgeworCQlNU01fSFNfRVJSKCIlcygpOiBjYW5ub3QgYWxsb2NhdGUgcngtPmJ1ZmZlciIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0X2xoX2luaXQ7CisJfQorCisJLyogU2V0IHVwIFVhcnQgUmVjZWl2ZSAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9SRldSLCAzMik7CisJLyogV3JpdGUgdG8gQkFEUiBleHBsaWNpdGx5IHRvIHNldCB1cCBGSUZPIHNpemVzICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJURE1fQkFEUl9BRERSLCA2NCk7CisKKwlJTklUX0RFTEFZRURfV09SSygmcngtPmZsaXBfaW5zZXJ0X3dvcmssIGZsaXBfaW5zZXJ0X3dvcmspOworCisJcmV0dXJuIHJldDsKK2V4aXRfbGhfaW5pdDoKKwlrdGhyZWFkX3N0b3AocngtPnRhc2spOworCXJ4LT50YXNrID0gTlVMTDsKKwlrdGhyZWFkX3N0b3AodHgtPnRhc2spOworCXR4LT50YXNrID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kYXRhCisJKm1zbV9oc19kdF90b19wZGF0YShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtc21fc2VyaWFsX2hzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXUzMiByeF90b19pbmplY3Q7CisJaW50IHJldDsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXBkZXYtPmlkID0gb2ZfYWxpYXNfZ2V0X2lkKHBkZXYtPmRldi5vZl9ub2RlLCAidWFydCIpOworCS8qIFVBUlQgVFggR1BJTyAqLworCXBkYXRhLT51YXJ0X3R4X2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3Bpbyhub2RlLAorCQkJCQkicWNvbSx0eC1ncGlvIiwgMCk7CisJaWYgKHBkYXRhLT51YXJ0X3R4X2dwaW8gPCAwKQorCQlwcl9lcnIoInVhcnRfdHhfZ3BpbyBpcyBub3QgYXZhaWxhYmxlXG4iKTsKKworCS8qIFVBUlQgUlggR1BJTyAqLworCXBkYXRhLT51YXJ0X3J4X2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3Bpbyhub2RlLAorCQkJCQkicWNvbSxyeC1ncGlvIiwgMCk7CisJaWYgKHBkYXRhLT51YXJ0X3J4X2dwaW8gPCAwKQorCQlwcl9lcnIoInVhcnRfcnhfZ3BpbyBpcyBub3QgYXZhaWxhYmxlXG4iKTsKKworCS8qIFVBUlQgQ1RTIEdQSU8gKi8KKwlwZGF0YS0+dWFydF9jdHNfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5vZGUsCisJCQkJCSJxY29tLGN0cy1ncGlvIiwgMCk7CisJaWYgKHBkYXRhLT51YXJ0X2N0c19ncGlvIDwgMCkKKwkJcHJfZXJyKCJ1YXJ0X2N0c19ncGlvIGlzIG5vdCBhdmFpbGFibGVcbiIpOworCisJLyogVUFSVCBSRlIgR1BJTyAqLworCXBkYXRhLT51YXJ0X3Jmcl9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obm9kZSwKKwkJCQkJInFjb20scmZyLWdwaW8iLCAwKTsKKwlpZiAocGRhdGEtPnVhcnRfcmZyX2dwaW8gPCAwKQorCQlwcl9lcnIoInVhcnRfcmZyX2dwaW8gaXMgbm90IGF2YWlsYWJsZVxuIik7CisKKwlwZGF0YS0+bm9fc3VzcGVuZF9kZWxheSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLAorCQkJCSJxY29tLG5vLXN1c3BlbmQtZGVsYXkiKTsKKworCXBkYXRhLT5vYnMgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwKKwkJCQkicWNvbSxtc20tb2JzIik7CisJaWYgKHBkYXRhLT5vYnMpCisJCXByX2VycigiJXM6T3V0IG9mIEJhbmQgc2xlZXAgZmxhZyBpcyBzZXRcbiIsIF9fZnVuY19fKTsKKworCXBkYXRhLT5pbmplY3Rfcnhfb25fd2FrZXVwID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsCisJCQkJInFjb20saW5qZWN0LXJ4LW9uLXdha2V1cCIpOworCisJaWYgKHBkYXRhLT5pbmplY3Rfcnhfb25fd2FrZXVwKSB7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJxY29tLHJ4LWNoYXItdG8taW5qZWN0IiwKKwkJCQkJCSZyeF90b19pbmplY3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCJFcnJvcjogUnhfY2hhcl90b19pbmplY3Qgbm90IHNwZWNpZmllZC5cbiIpOworCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJfQorCQlwZGF0YS0+cnhfdG9faW5qZWN0ID0gKHU4KXJ4X3RvX2luamVjdDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxiYW0tdHgtZXAtcGlwZS1pbmRleCIsCisJCQkJJnBkYXRhLT5iYW1fdHhfZXBfcGlwZV9pbmRleCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJFcnJvcjogR2V0dGluZyBVQVJUIEJBTSBUWCBFUCBQaXBlIEluZGV4LlxuIik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJaWYgKCEocGRhdGEtPmJhbV90eF9lcF9waXBlX2luZGV4ID49IEJBTV9QSVBFX01JTiAmJgorCQlwZGF0YS0+YmFtX3R4X2VwX3BpcGVfaW5kZXggPD0gQkFNX1BJUEVfTUFYKSkgeworCQlwcl9lcnIoIkVycm9yOiBJbnZhbGlkIFVBUlQgQkFNIFRYIEVQIFBpcGUgSW5kZXguXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInFjb20sYmFtLXJ4LWVwLXBpcGUtaW5kZXgiLAorCQkJCQkmcGRhdGEtPmJhbV9yeF9lcF9waXBlX2luZGV4KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkVycm9yOiBHZXR0aW5nIFVBUlQgQkFNIFJYIEVQIFBpcGUgSW5kZXguXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlpZiAoIShwZGF0YS0+YmFtX3J4X2VwX3BpcGVfaW5kZXggPj0gQkFNX1BJUEVfTUlOICYmCisJCXBkYXRhLT5iYW1fcnhfZXBfcGlwZV9pbmRleCA8PSBCQU1fUElQRV9NQVgpKSB7CisJCXByX2VycigiRXJyb3I6IEludmFsaWQgVUFSVCBCQU0gUlggRVAgUGlwZSBJbmRleC5cbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlwcl9kZWJ1ZygidHhfZXBfcGlwZV9pbmRleDolZCByeF9lcF9waXBlX2luZGV4OiVkXG4iCisJCSJ0eF9ncGlvOiVkIHJ4X2dwaW86JWQgcmZyX2dwaW86JWQgY3RzX2dwaW86JWQiLAorCQlwZGF0YS0+YmFtX3R4X2VwX3BpcGVfaW5kZXgsIHBkYXRhLT5iYW1fcnhfZXBfcGlwZV9pbmRleCwKKwkJcGRhdGEtPnVhcnRfdHhfZ3BpbywgcGRhdGEtPnVhcnRfcnhfZ3BpbywgcGRhdGEtPnVhcnRfY3RzX2dwaW8sCisJCXBkYXRhLT51YXJ0X3Jmcl9ncGlvKTsKKworCXJldHVybiBwZGF0YTsKK30KKworCisvKioKKyAqIERlYWxsb2NhdGUgVUFSVCBwZXJpcGhlcmFsJ3MgU1BTIGVuZHBvaW50CisgKiBAbXNtX3Vwb3J0IC0gUG9pbnRlciB0byBtc21faHNfcG9ydCBzdHJ1Y3R1cmUKKyAqIEBlcCAtIFBvaW50ZXIgdG8gc3BzIGVuZHBvaW50IGRhdGEgc3RydWN0dXJlCisgKi8KKworc3RhdGljIHZvaWQgbXNtX2hzX2V4aXRfZXBfY29ubihzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCwKKwkJCQlzdHJ1Y3QgbXNtX2hzX3Nwc19lcF9jb25uX2RhdGEgKmVwKQoreworCXN0cnVjdCBzcHNfcGlwZSAqc3BzX3BpcGVfaGFuZGxlID0gZXAtPnBpcGVfaGFuZGxlOworCXN0cnVjdCBzcHNfY29ubmVjdCAqc3BzX2NvbmZpZyA9ICZlcC0+Y29uZmlnOworCisJZG1hX2ZyZWVfY29oZXJlbnQobXNtX3Vwb3J0LT51cG9ydC5kZXYsCisJCQlzcHNfY29uZmlnLT5kZXNjLnNpemUsCisJCQkmc3BzX2NvbmZpZy0+ZGVzYy5waHlzX2Jhc2UsCisJCQlHRlBfS0VSTkVMKTsKKwlzcHNfZnJlZV9lbmRwb2ludChzcHNfcGlwZV9oYW5kbGUpOworfQorCisKKy8qKgorICogQWxsb2NhdGUgVUFSVCBwZXJpcGhlcmFsJ3MgU1BTIGVuZHBvaW50CisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgZW5kcG9pbnQgY29udGV4dAorICogYnkgY2FsbGluZyBhcHByb3ByaWF0ZSBTUFMgZHJpdmVyIEFQSXMuCisgKgorICogQG1zbV91cG9ydCAtIFBvaW50ZXIgdG8gbXNtX2hzX3BvcnQgc3RydWN0dXJlCisgKiBAZXAgLSBQb2ludGVyIHRvIHNwcyBlbmRwb2ludCBkYXRhIHN0cnVjdHVyZQorICogQGlzX3Byb2R1Y2UgLSAxIG1lYW5zIFByb2R1Y2VyIGVuZHBvaW50CisgKiAgICAgICAgICAgICAtIDAgbWVhbnMgQ29uc3VtZXIgZW5kcG9pbnQKKyAqCisgKiBAcmV0dXJuIC0gMCBpZiBzdWNjZXNzZnVsIGVsc2UgbmVnYXRpdmUgdmFsdWUKKyAqLworCitzdGF0aWMgaW50IG1zbV9oc19zcHNfaW5pdF9lcF9jb25uKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0LAorCQkJCXN0cnVjdCBtc21faHNfc3BzX2VwX2Nvbm5fZGF0YSAqZXAsCisJCQkJYm9vbCBpc19wcm9kdWNlcikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBzcHNfcGlwZSAqc3BzX3BpcGVfaGFuZGxlOworCXN0cnVjdCBzcHNfY29ubmVjdCAqc3BzX2NvbmZpZyA9ICZlcC0+Y29uZmlnOworCXN0cnVjdCBzcHNfcmVnaXN0ZXJfZXZlbnQgKnNwc19ldmVudCA9ICZlcC0+ZXZlbnQ7CisKKwkvKiBBbGxvY2F0ZSBlbmRwb2ludCBjb250ZXh0ICovCisJc3BzX3BpcGVfaGFuZGxlID0gc3BzX2FsbG9jX2VuZHBvaW50KCk7CisJaWYgKCFzcHNfcGlwZV9oYW5kbGUpIHsKKwkJTVNNX0hTX0VSUigiJXMoKTogc3BzX2FsbG9jX2VuZHBvaW50KCkgZmFpbGVkISFcbiIKKwkJCSJpc19wcm9kdWNlcj0lZCIsIF9fZnVuY19fLCBpc19wcm9kdWNlcik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogR2V0IGRlZmF1bHQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZvciBhbiBlbmRwb2ludCAqLworCXJjID0gc3BzX2dldF9jb25maWcoc3BzX3BpcGVfaGFuZGxlLCBzcHNfY29uZmlnKTsKKwlpZiAocmMpIHsKKwkJTVNNX0hTX0VSUigiJXMoKTogZmFpbGVkISBwaXBlX2hhbmRsZT0weCVwIHJjPSVkIiwKKwkJCV9fZnVuY19fLCBzcHNfcGlwZV9oYW5kbGUsIHJjKTsKKwkJZ290byBnZXRfY29uZmlnX2VycjsKKwl9CisKKwkvKiBNb2RpZnkgdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uICovCisJaWYgKGlzX3Byb2R1Y2VyKSB7CisJCS8qIEZvciBVQVJUIHByb2R1Y2VyIHRyYW5zZmVyLCBzb3VyY2UgaXMgVUFSVCBwZXJpcGhlcmFsCisJCSAqIHdoZXJlIGFzIGRlc3RpbmF0aW9uIGlzIHN5c3RlbSBtZW1vcnkKKwkJICovCisJCXNwc19jb25maWctPnNvdXJjZSA9IG1zbV91cG9ydC0+YmFtX2hhbmRsZTsKKwkJc3BzX2NvbmZpZy0+ZGVzdGluYXRpb24gPSBTUFNfREVWX0hBTkRMRV9NRU07CisJCXNwc19jb25maWctPm1vZGUgPSBTUFNfTU9ERV9TUkM7CisJCXNwc19jb25maWctPnNyY19waXBlX2luZGV4ID0gbXNtX3Vwb3J0LT5iYW1fcnhfZXBfcGlwZV9pbmRleDsKKwkJc3BzX2NvbmZpZy0+ZGVzdF9waXBlX2luZGV4ID0gMDsKKwkJc3BzX2V2ZW50LT5jYWxsYmFjayA9IG1zbV9oc19zcHNfcnhfY2FsbGJhY2s7CisJfSBlbHNlIHsKKwkJLyogRm9yIFVBUlQgY29uc3VtZXIgdHJhbnNmZXIsIHNvdXJjZSBpcyBzeXN0ZW0gbWVtb3J5CisJCSAqIHdoZXJlIGFzIGRlc3RpbmF0aW9uIGlzIFVBUlQgcGVyaXBoZXJhbAorCQkgKi8KKwkJc3BzX2NvbmZpZy0+c291cmNlID0gU1BTX0RFVl9IQU5ETEVfTUVNOworCQlzcHNfY29uZmlnLT5kZXN0aW5hdGlvbiA9IG1zbV91cG9ydC0+YmFtX2hhbmRsZTsKKwkJc3BzX2NvbmZpZy0+bW9kZSA9IFNQU19NT0RFX0RFU1Q7CisJCXNwc19jb25maWctPnNyY19waXBlX2luZGV4ID0gMDsKKwkJc3BzX2NvbmZpZy0+ZGVzdF9waXBlX2luZGV4ID0gbXNtX3Vwb3J0LT5iYW1fdHhfZXBfcGlwZV9pbmRleDsKKwkJc3BzX2V2ZW50LT5jYWxsYmFjayA9IG1zbV9oc19zcHNfdHhfY2FsbGJhY2s7CisJfQorCisJc3BzX2NvbmZpZy0+b3B0aW9ucyA9IFNQU19PX0VPVCB8IFNQU19PX0RFU0NfRE9ORSB8IFNQU19PX0FVVE9fRU5BQkxFOworCXNwc19jb25maWctPmV2ZW50X3RocmVzaCA9IDB4MTA7CisKKwkvKiBBbGxvY2F0ZSBtYXhpbXVtIGRlc2NyaXB0b3IgZmlmbyBzaXplICovCisJc3BzX2NvbmZpZy0+ZGVzYy5zaXplID0KKwkJKDEgKyBVQVJUX0RNQV9ERVNDX05SKSAqIHNpemVvZihzdHJ1Y3Qgc3BzX2lvdmVjKTsKKwlzcHNfY29uZmlnLT5kZXNjLmJhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQobXNtX3Vwb3J0LT51cG9ydC5kZXYsCisJCQkJCQlzcHNfY29uZmlnLT5kZXNjLnNpemUsCisJCQkJCQkmc3BzX2NvbmZpZy0+ZGVzYy5waHlzX2Jhc2UsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXNwc19jb25maWctPmRlc2MuYmFzZSkgeworCQlyYyA9IC1FTk9NRU07CisJCU1TTV9IU19FUlIoIm1zbV9zZXJpYWxfaHM6IGRtYV9hbGxvY19jb2hlcmVudCgpIGZhaWxlZCEhXG4iKTsKKwkJZ290byBnZXRfY29uZmlnX2VycjsKKwl9CisJbWVtc2V0KHNwc19jb25maWctPmRlc2MuYmFzZSwgMHgwMCwgc3BzX2NvbmZpZy0+ZGVzYy5zaXplKTsKKworCXNwc19ldmVudC0+bW9kZSA9IFNQU19UUklHR0VSX0NBTExCQUNLOworCisJc3BzX2V2ZW50LT5vcHRpb25zID0gU1BTX09fREVTQ19ET05FIHwgU1BTX09fRU9UOworCXNwc19ldmVudC0+dXNlciA9ICh2b2lkICopbXNtX3Vwb3J0OworCisJLyogTm93IHNhdmUgdGhlIHNwcyBwaXBlIGhhbmRsZSAqLworCWVwLT5waXBlX2hhbmRsZSA9IHNwc19waXBlX2hhbmRsZTsKKwlNU01fSFNfREJHKCJtc21fc2VyaWFsX2hzOiBzdWNjZXNzICEhICVzOiBwaXBlX2hhbmRsZT0weCVwXG4iCisJCSJkZXNjX2ZpZm8ucGh5c19iYXNlPTB4JXBhXG4iLAorCQlpc19wcm9kdWNlciA/ICJSRUFEIiA6ICJXUklURSIsCisJCXNwc19waXBlX2hhbmRsZSwgJnNwc19jb25maWctPmRlc2MucGh5c19iYXNlKTsKKwlyZXR1cm4gMDsKKworZ2V0X2NvbmZpZ19lcnI6CisJc3BzX2ZyZWVfZW5kcG9pbnQoc3BzX3BpcGVfaGFuZGxlKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBTUFMgSFcgY29ubmVjdGVkIHdpdGggVUFSVCBjb3JlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlciBCQU0gSFcgcmVzb3VyY2VzIHdpdGgKKyAqIFNQUyBkcml2ZXIgYW5kIHRoZW4gaW5pdGlhbGl6ZSAyIFNQUyBlbmRwb2ludHMKKyAqCisgKiBtc21fdXBvcnQgLSBQb2ludGVyIHRvIG1zbV9oc19wb3J0IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gLSAwIGlmIHN1Y2Nlc3NmdWwgZWxzZSBuZWdhdGl2ZSB2YWx1ZQorICovCisKK3N0YXRpYyBpbnQgbXNtX2hzX3Nwc19pbml0KHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0KQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNwc19iYW1fcHJvcHMgYmFtID0gezB9OworCXVuc2lnbmVkIGxvbmcgYmFtX2hhbmRsZTsKKworCXJjID0gc3BzX3BoeTJoKG1zbV91cG9ydC0+YmFtX21lbSwgJmJhbV9oYW5kbGUpOworCWlmIChyYyB8fCAhYmFtX2hhbmRsZSkgeworCQliYW0ucGh5c19hZGRyID0gbXNtX3Vwb3J0LT5iYW1fbWVtOworCQliYW0udmlydF9hZGRyID0gbXNtX3Vwb3J0LT5iYW1fYmFzZTsKKwkJLyoKKwkJICogVGhpcyBldmVudCB0aHJlc29sZCB2YWx1ZSBpcyBvbmx5IHNpZ25pZmljYW50IGZvciBCQU0tdG8tQkFNCisJCSAqIHRyYW5zZmVyLiBJdCdzIGlnbm9yZWQgZm9yIEJBTS10by1TeXN0ZW0gbW9kZSB0cmFuc2Zlci4KKwkJICovCisJCWJhbS5ldmVudF90aHJlc2hvbGQgPSAweDEwOwkvKiBQaXBlIGV2ZW50IHRocmVzaG9sZCAqLworCQliYW0uc3VtbWluZ190aHJlc2hvbGQgPSAxOwkvKiBCQU0gZXZlbnQgdGhyZXNob2xkICovCisKKwkJLyogU1BTIGRyaXZlciB3bGwgaGFuZGxlIHRoZSBVQVJUIEJBTSBJUlEgKi8KKwkJYmFtLmlycSA9ICh1MzIpbXNtX3Vwb3J0LT5iYW1faXJxOworCQliYW0ubWFuYWdlID0gU1BTX0JBTV9NR1JfREVWSUNFX1JFTU9URTsKKworCQlNU01fSFNfREJHKCJtc21fc2VyaWFsX2hzOiBiYW0gcGh5c2ljYWwgYmFzZT0weCVwYVxuIiwKKwkJCQkJCQkmYmFtLnBoeXNfYWRkcik7CisJCU1TTV9IU19EQkcoIm1zbV9zZXJpYWxfaHM6IGJhbSB2aXJ0dWFsIGJhc2U9MHglcFxuIiwKKwkJCQkJCQliYW0udmlydF9hZGRyKTsKKworCQkvKiBSZWdpc3RlciBVQVJUIFBlcmlwaGVyYWwgQkFNIGRldmljZSB0byBTUFMgZHJpdmVyICovCisJCXJjID0gc3BzX3JlZ2lzdGVyX2JhbV9kZXZpY2UoJmJhbSwgJmJhbV9oYW5kbGUpOworCQlpZiAocmMpIHsKKwkJCU1TTV9IU19FUlIoIiVzOiBCQU0gZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCQkgIF9fZnVuY19fKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlNU01fSFNfREJHKCIlczpCQU0gZGV2aWNlIHJlZ2lzdGVyZWQuIGJhbV9oYW5kbGU9MHglbHgiLAorCQkJICAgX19mdW5jX18sIG1zbV91cG9ydC0+YmFtX2hhbmRsZSk7CisJfQorCW1zbV91cG9ydC0+YmFtX2hhbmRsZSA9IGJhbV9oYW5kbGU7CisKKwlyYyA9IG1zbV9oc19zcHNfaW5pdF9lcF9jb25uKG1zbV91cG9ydCwgJm1zbV91cG9ydC0+cngucHJvZCwKKwkJCQlVQVJUX1NQU19QUk9EX1BFUklQSEVSQUwpOworCWlmIChyYykgeworCQlNU01fSFNfRVJSKCIlczogRmFpbGVkIHRvIEluaXQgUHJvZHVjZXIgQkFNLXBpcGUiLCBfX2Z1bmNfXyk7CisJCWdvdG8gZGVyZWdpc3Rlcl9iYW07CisJfQorCisJcmMgPSBtc21faHNfc3BzX2luaXRfZXBfY29ubihtc21fdXBvcnQsICZtc21fdXBvcnQtPnR4LmNvbnMsCisJCQkJVUFSVF9TUFNfQ09OU19QRVJJUEhFUkFMKTsKKwlpZiAocmMpIHsKKwkJTVNNX0hTX0VSUigiJXM6IEZhaWxlZCB0byBJbml0IENvbnN1bWVyIEJBTS1waXBlIiwgX19mdW5jX18pOworCQlnb3RvIGRlaW5pdF9lcF9jb25uX3Byb2Q7CisJfQorCXJldHVybiAwOworCitkZWluaXRfZXBfY29ubl9wcm9kOgorCW1zbV9oc19leGl0X2VwX2Nvbm4obXNtX3Vwb3J0LCAmbXNtX3Vwb3J0LT5yeC5wcm9kKTsKK2RlcmVnaXN0ZXJfYmFtOgorCXNwc19kZXJlZ2lzdGVyX2JhbV9kZXZpY2UobXNtX3Vwb3J0LT5iYW1faGFuZGxlKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGJvb2wgZGV2aWNlaWRbVUFSVERNX05SXSA9IHswfTsKKy8qCisgKiBUaGUgbXV0ZXggc3luY2hyb25pemVzIGdyYWJiaW5nIG5leHQgZnJlZSBkZXZpY2UgbnVtYmVyCisgKiBib3RoIGluIGNhc2Ugb2YgYW4gYWxpYXMgYmVpbmcgdXNlZCBvciBub3QuIFdoZW4gYWxpYXMgaXMKKyAqIHVzZWQsIHRoZSBtc21faHNfZHRfdG9fcGRhdGEgZ2V0cyBpdCBhbmQgdGhlIGJvb2xlYW4gYXJyYXkKKyAqIGlzIGFjY29yZGluZ2x5IHVwZGF0ZWQgd2l0aCBkZXZpY2VfaWRfc2V0X3VzZWQuIElmIG5vIGFsaWFzCisgKiBpcyB1c2VkLCB0aGVuIGRldmljZV9pZF9ncmFiX25leHRfZnJlZSBzZXRzIHRoYXQgYXJyYXkuCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgobXV0ZXhfbmV4dF9kZXZpY2VfaWQpOworCitzdGF0aWMgaW50IGRldmljZV9pZF9ncmFiX25leHRfZnJlZSh2b2lkKQoreworCWludCBpOworCWludCByZXQgPSAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmbXV0ZXhfbmV4dF9kZXZpY2VfaWQpOworCWZvciAoaSA9IDA7IGkgPCBVQVJURE1fTlI7IGkrKykKKwkJaWYgKCFkZXZpY2VpZFtpXSkgeworCQkJcmV0ID0gaTsKKwkJCWRldmljZWlkW2ldID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJbXV0ZXhfdW5sb2NrKCZtdXRleF9uZXh0X2RldmljZV9pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZXZpY2VfaWRfc2V0X3VzZWQoaW50IGluZGV4KQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbXV0ZXhfbmV4dF9kZXZpY2VfaWQpOworCWlmIChkZXZpY2VpZFtpbmRleF0pCisJCXJldCA9IC1FTk9ERVY7CisJZWxzZQorCQlkZXZpY2VpZFtpbmRleF0gPSB0cnVlOworCW11dGV4X3VubG9jaygmbXV0ZXhfbmV4dF9kZXZpY2VfaWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9ic19tYW5hZ2VfaXJxKHN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0LCBib29sIGVuKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJihtc21fdXBvcnQtPnVwb3J0KTsKKworCWlmIChtc21fdXBvcnQtPm9icykgeworCQlpZiAoZW4pCisJCQllbmFibGVfaXJxKHVwb3J0LT5pcnEpOworCQllbHNlCisJCQlkaXNhYmxlX2lycSh1cG9ydC0+aXJxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9oc19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBnZXRfbWF0Y2hpbmdfaHNfcG9ydChwZGV2KTsKKwlpbnQgcmV0OworCWludCBjbGllbnRfY291bnQgPSAwOworCisJaWYgKCFtc21fdXBvcnQpCisJCWdvdG8gZXJyX3N1c3BlbmQ7CisJbXV0ZXhfbG9jaygmbXNtX3Vwb3J0LT5tdHgpOworCisJY2xpZW50X2NvdW50ID0gYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X2NvdW50KTsKKwltc21fdXBvcnQtPnBtX3N0YXRlID0gTVNNX0hTX1BNX1NVU1BFTkRFRDsKKwltc21faHNfcmVzb3VyY2Vfb2ZmKG1zbV91cG9ydCk7CisJb2JzX21hbmFnZV9pcnEobXNtX3Vwb3J0LCBmYWxzZSk7CisJbXNtX2hzX2Nsa19idXNfdW52b3RlKG1zbV91cG9ydCk7CisKKwkvKiBGb3IgT0JTLCBkb24ndCB1c2Ugd2FrZXVwIGludGVycnVwdCwgc2V0IGdwaW8gdG8gc3VzcGVuZGVkIHN0YXRlICovCisJaWYgKG1zbV91cG9ydC0+b2JzKSB7CisJCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKG1zbV91cG9ydC0+cGluY3RybCwKKwkJCW1zbV91cG9ydC0+Z3Bpb19zdGF0ZV9zdXNwZW5kKTsKKwkJaWYgKHJldCkKKwkJCU1TTV9IU19FUlIoIiVzKCk6RXJyb3Igc2VsZWN0aW5nIHBpbmN0cmwgc3VzcGVuZCBzdGF0ZSIsCisJCQkJX19mdW5jX18pOworCX0KKworCWlmICghYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X3JlcV9zdGF0ZSkpCisJCWVuYWJsZV93YWtldXBfaW50ZXJydXB0KG1zbV91cG9ydCk7CisJTE9HX1VTUl9NU0cobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX3B3cl9jdHh0LAorCQkiJXM6IFBNIFN0YXRlIFN1c3BlbmRlZCBjbGllbnRfY291bnQgJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJCQljbGllbnRfY291bnQpOworCW11dGV4X3VubG9jaygmbXNtX3Vwb3J0LT5tdHgpOworCXJldHVybjsKK2Vycl9zdXNwZW5kOgorCXByX2VycigiJXMoKTogaW52YWxpZCB1cG9ydCIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCBtc21faHNfcG1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBnZXRfbWF0Y2hpbmdfaHNfcG9ydChwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY2xpZW50X2NvdW50ID0gMDsKKworCWlmICghbXNtX3Vwb3J0KSB7CisJCWRldl9lcnIoZGV2LCAiJXM6SW52YWxpZCB1cG9ydFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltdXRleF9sb2NrKCZtc21fdXBvcnQtPm10eCk7CisJY2xpZW50X2NvdW50ID0gYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X2NvdW50KTsKKwlpZiAobXNtX3Vwb3J0LT5wbV9zdGF0ZSA9PSBNU01fSFNfUE1fQUNUSVZFKQorCQlnb3RvIGV4aXRfcG1fcmVzdW1lOworCWlmICghYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X3JlcV9zdGF0ZSkpCisJCWRpc2FibGVfd2FrZXVwX2ludGVycnVwdChtc21fdXBvcnQpOworCisJLyogRm9yIE9CUywgZG9uJ3QgdXNlIHdha2V1cCBpbnRlcnJ1cHQsIHNldCBncGlvIHRvIGFjdGl2ZSBzdGF0ZSAqLworCWlmIChtc21fdXBvcnQtPm9icykgeworCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShtc21fdXBvcnQtPnBpbmN0cmwsCisJCQkJbXNtX3Vwb3J0LT5ncGlvX3N0YXRlX2FjdGl2ZSk7CisJCWlmIChyZXQpCisJCQlNU01fSFNfRVJSKCIlcygpOkVycm9yIHNlbGVjdGluZyBhY3RpdmUgc3RhdGUiLAorCQkJCSBfX2Z1bmNfXyk7CisJfQorCisJcmV0ID0gbXNtX2hzX2Nsa19idXNfdm90ZShtc21fdXBvcnQpOworCWlmIChyZXQpIHsKKwkJTVNNX0hTX0VSUigiJXM6RmFpbGVkIGNsb2NrIHZvdGUgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGRldiwgIiVzOkZhaWxlZCBjbG9jayB2b3RlICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBleGl0X3BtX3Jlc3VtZTsKKwl9CisJb2JzX21hbmFnZV9pcnEobXNtX3Vwb3J0LCB0cnVlKTsKKwltc21fdXBvcnQtPnBtX3N0YXRlID0gTVNNX0hTX1BNX0FDVElWRTsKKwltc21faHNfcmVzb3VyY2Vfb24obXNtX3Vwb3J0KTsKKworCUxPR19VU1JfTVNHKG1zbV91cG9ydC0+aXBjX21zbV9oc19wd3JfY3R4dCwKKwkJIiVzOlBNIFN0YXRlOkFjdGl2ZSBjbGllbnRfY291bnQgJWRcbiIsIF9fZnVuY19fLCBjbGllbnRfY291bnQpOworZXhpdF9wbV9yZXN1bWU6CisJbXV0ZXhfdW5sb2NrKCZtc21fdXBvcnQtPm10eCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtc21faHNfcG1fc3lzX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbXNtX2hzX3BvcnQgKm1zbV91cG9ydCA9IGdldF9tYXRjaGluZ19oc19wb3J0KHBkZXYpOworCWVudW0gbXNtX2hzX3BtX3N0YXRlIHByZXZfcHdyX3N0YXRlOworCWludCBjbGtfY250LCBjbGllbnRfY291bnQsIHJldCA9IDA7CisKKwlpZiAoSVNfRVJSX09SX05VTEwobXNtX3Vwb3J0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZtc21fdXBvcnQtPm10eCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjbGsgcmVxdWVzdCBvciBhbiBpbXBlbmRpbmcgdXNlcnNwYWNlIHJlcXVlc3QKKwkgKiBmYWlsIHRoZSBzdXNwZW5kIGNhbGxiYWNrLgorCSAqLworCWNsa19jbnQgPSBhdG9taWNfcmVhZCgmbXNtX3Vwb3J0LT5yZXNvdXJjZV9jb3VudCk7CisJY2xpZW50X2NvdW50ID0gYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X2NvdW50KTsKKwlpZiAobXNtX3Vwb3J0LT5wbV9zdGF0ZSA9PSBNU01fSFNfUE1fQUNUSVZFKSB7CisJCU1TTV9IU19XQVJOKCIlczpGYWlsIFN1c3BlbmQuY2xrX2NudDolZCxjbG50X2NvdW50OiVkXG4iLAorCQkJCSBfX2Z1bmNfXywgY2xrX2NudCwgY2xpZW50X2NvdW50KTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGV4aXRfc3VzcGVuZF9ub2lycTsKKwl9CisKKwlwcmV2X3B3cl9zdGF0ZSA9IG1zbV91cG9ydC0+cG1fc3RhdGU7CisJbXNtX3Vwb3J0LT5wbV9zdGF0ZSA9IE1TTV9IU19QTV9TWVNfU1VTUEVOREVEOworCUxPR19VU1JfTVNHKG1zbV91cG9ydC0+aXBjX21zbV9oc19wd3JfY3R4dCwKKwkJIiVzOlBNIFN0YXRlOlN5cy1TdXNwZW5kZWQgY2xpZW50X2NvdW50ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkJCQkJY2xpZW50X2NvdW50KTsKK2V4aXRfc3VzcGVuZF9ub2lycToKKwltdXRleF91bmxvY2soJm1zbV91cG9ydC0+bXR4KTsKKwlyZXR1cm4gcmV0OworfTsKKworc3RhdGljIGludCBtc21faHNfcG1fc3lzX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gZ2V0X21hdGNoaW5nX2hzX3BvcnQocGRldik7CisKKwlpZiAoSVNfRVJSX09SX05VTEwobXNtX3Vwb3J0KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJLyoKKwkgKiBOb3RlIHN5c3RlbS1wbSByZXN1bWUgYW5kIHVwZGF0ZSB0aGUgc3RhdGUKKwkgKiB2YXJpYWJsZS4gUmVzb3VyY2UgYWN0aXZhdGlvbiB3aWxsIGJlIGRvbmUKKwkgKiB3aGVuIHRyYW5zZmVyIGlzIHJlcXVlc3RlZC4KKwkgKi8KKworCW11dGV4X2xvY2soJm1zbV91cG9ydC0+bXR4KTsKKwlpZiAobXNtX3Vwb3J0LT5wbV9zdGF0ZSA9PSBNU01fSFNfUE1fU1lTX1NVU1BFTkRFRCkKKwkJbXNtX3Vwb3J0LT5wbV9zdGF0ZSA9IE1TTV9IU19QTV9TVVNQRU5ERUQ7CisJTE9HX1VTUl9NU0cobXNtX3Vwb3J0LT5pcGNfbXNtX2hzX3B3cl9jdHh0LAorCQkiJXM6UE0gU3RhdGU6IFN1c3BlbmRlZFxuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmbXNtX3Vwb3J0LT5tdHgpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB2b2lkICBtc21fc2VyaWFsX2hzX3J0X2luaXQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQgPSBVQVJURE1fVE9fTVNNKHVwb3J0KTsKKworCU1TTV9IU19JTkZPKCIlcygpOiBFbmFibGluZyBydW50aW1lIHBtIiwgX19mdW5jX18pOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCh1cG9ydC0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSh1cG9ydC0+ZGV2LCAxMDApOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHVwb3J0LT5kZXYpOworCW11dGV4X2xvY2soJm1zbV91cG9ydC0+bXR4KTsKKwltc21fdXBvcnQtPnBtX3N0YXRlID0gTVNNX0hTX1BNX1NVU1BFTkRFRDsKKwltdXRleF91bmxvY2soJm1zbV91cG9ydC0+bXR4KTsKKwlwbV9ydW50aW1lX2VuYWJsZSh1cG9ydC0+ZGV2KTsKK30KKworc3RhdGljIGludCBtc21faHNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwltc21faHNfcG1fc3VzcGVuZChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9oc19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG1zbV9oc19wbV9yZXN1bWUoZGV2KTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCAgbXNtX3NlcmlhbF9oc19ydF9pbml0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KSB7fQorc3RhdGljIGludCBtc21faHNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikge30KK3N0YXRpYyBpbnQgbXNtX2hzX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikge30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgbXNtX2hzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisJc3RydWN0IG1zbV9oc19wb3J0ICptc21fdXBvcnQ7CisJc3RydWN0IHJlc291cmNlICpjb3JlX3Jlc291cmNlOworCXN0cnVjdCByZXNvdXJjZSAqYmFtX3Jlc291cmNlOworCWludCBjb3JlX2lycXJlcywgYmFtX2lycXJlcywgd2FrZXVwX2lycXJlczsKKwlzdHJ1Y3QgbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwljaGFyIG5hbWVbMzBdOworCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImRldmljZSB0cmVlIGVuYWJsZWRcbiIpOworCQlwZGF0YSA9IG1zbV9oc19kdF90b19wZGF0YShwZGV2KTsKKwkJaWYgKElTX0VSUihwZGF0YSkpCisJCQlyZXR1cm4gUFRSX0VSUihwZGF0YSk7CisKKwkJaWYgKHBkZXYtPmlkIDwgMCkgeworCQkJcGRldi0+aWQgPSBkZXZpY2VfaWRfZ3JhYl9uZXh0X2ZyZWUoKTsKKwkJCWlmIChwZGV2LT5pZCA8IDApIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSJFcnJvciBncmFiYmluZyBuZXh0IGZyZWUgZGV2aWNlIGlkIik7CisJCQkJcmV0dXJuIHBkZXYtPmlkOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gZGV2aWNlX2lkX3NldF91c2VkKHBkZXYtPmlkKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJWQgYWxpYXMgdGFrZW4iLAorCQkJCQlwZGV2LT5pZCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCX0KKworCWlmIChwZGV2LT5pZCA8IDAgfHwgcGRldi0+aWQgPj0gVUFSVERNX05SKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgcGxhZm9ybSBkZXZpY2UgSUQgPSAlZFxuIiwKKwkJCQkJCQkJcGRldi0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc21fdXBvcnQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBtc21faHNfcG9ydCksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1zbV91cG9ydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc21fdXBvcnQtPnVwb3J0LnR5cGUgPSBQT1JUX1VOS05PV047CisJdXBvcnQgPSAmbXNtX3Vwb3J0LT51cG9ydDsKKwl1cG9ydC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJbXNtX3Vwb3J0LT51YXJ0X3R5cGUgPSBCTFNQX0hTVUFSVDsKKworCW1zbV9oc19nZXRfcGluY3RybF9jb25maWdzKHVwb3J0KTsKKwkvKiBHZXQgcmVxdWlyZWQgcmVzb3VyY2VzIGZvciBCQU0gSFNVQVJUICovCisJY29yZV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJCQlJT1JFU09VUkNFX01FTSwgImNvcmVfbWVtIik7CisJaWYgKCFjb3JlX3Jlc291cmNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgY29yZSBIU1VBUlQgUmVzb3VyY2VzLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWJhbV9yZXNvdXJjZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwKKwkJCQlJT1JFU09VUkNFX01FTSwgImJhbV9tZW0iKTsKKwlpZiAoIWJhbV9yZXNvdXJjZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIEJBTSBIU1VBUlQgUmVzb3VyY2VzLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWNvcmVfaXJxcmVzID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImNvcmVfaXJxIik7CisJaWYgKGNvcmVfaXJxcmVzIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciAlZCwgaW52YWxpZCBjb3JlIGlycSByZXNvdXJjZXMuXG4iLAorCQkJY29yZV9pcnFyZXMpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwliYW1faXJxcmVzID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImJhbV9pcnEiKTsKKwlpZiAoYmFtX2lycXJlcyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgJWQsIGludmFsaWQgYmFtIGlycSByZXNvdXJjZXMuXG4iLAorCQkJYmFtX2lycXJlcyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXdha2V1cF9pcnFyZXMgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAid2FrZXVwX2lycSIpOworCWlmICh3YWtldXBfaXJxcmVzIDwgMCkgeworCQl3YWtldXBfaXJxcmVzID0gLTE7CisJCXByX2luZm8oIldha2V1cCBpcnEgbm90IHNwZWNpZmllZC5cbiIpOworCX0KKworCXVwb3J0LT5tYXBiYXNlID0gY29yZV9yZXNvdXJjZS0+c3RhcnQ7CisKKwl1cG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAodXBvcnQtPm1hcGJhc2UsCisJCQkJcmVzb3VyY2Vfc2l6ZShjb3JlX3Jlc291cmNlKSk7CisJaWYgKHVubGlrZWx5KCF1cG9ydC0+bWVtYmFzZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVUFSVCBSZXNvdXJjZSBpb3JlbWFwIEZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbXNtX3Vwb3J0LT5iYW1fbWVtID0gYmFtX3Jlc291cmNlLT5zdGFydDsKKwltc21fdXBvcnQtPmJhbV9iYXNlID0gaW9yZW1hcChtc21fdXBvcnQtPmJhbV9tZW0sCisJCQkJcmVzb3VyY2Vfc2l6ZShiYW1fcmVzb3VyY2UpKTsKKwlpZiAodW5saWtlbHkoIW1zbV91cG9ydC0+YmFtX2Jhc2UpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVBUlQgQkFNIFJlc291cmNlIGlvcmVtYXAgRmFpbGVkLlxuIik7CisJCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQobmFtZSwgMCwgc2l6ZW9mKG5hbWUpKTsKKwlzY25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlcyIsIGRldl9uYW1lKG1zbV91cG9ydC0+dXBvcnQuZGV2KSwKKwkJCQkJCQkJCSJfc3RhdGUiKTsKKwltc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQgPQorCQkJaXBjX2xvZ19jb250ZXh0X2NyZWF0ZShJUENfTVNNX0hTX0xPR19TVEFURV9QQUdFUywKKwkJCQkJCQkJbmFtZSwgMCk7CisJaWYgKCFtc21fdXBvcnQtPmlwY19tc21faHNfbG9nX2N0eHQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGVycm9yIGNyZWF0aW5nIGxvZ2dpbmcgY29udGV4dCIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwl9IGVsc2UgeworCQltc21fdXBvcnQtPmlwY19kZWJ1Z19tYXNrID0gSU5GT19MRVY7CisJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwKKwkJCQkmZGV2X2F0dHJfZGVidWdfbWFzay5hdHRyKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlNU01fSFNfV0FSTigiJXM6IEZhaWxlZCB0byBjcmVhdGUgZGV2LiBhdHRyIiwgX19mdW5jX18pOworCX0KKworCXVwb3J0LT5pcnEgPSBjb3JlX2lycXJlczsKKwltc21fdXBvcnQtPmJhbV9pcnEgPSBiYW1faXJxcmVzOworCXBkYXRhLT53YWtldXBfaXJxID0gd2FrZXVwX2lycXJlczsKKworCW1zbV91cG9ydC0+YnVzX3NjYWxlX3RhYmxlID0gbXNtX2J1c19jbF9nZXRfcGRhdGEocGRldik7CisJaWYgKCFtc21fdXBvcnQtPmJ1c19zY2FsZV90YWJsZSkgeworCQlNU01fSFNfRVJSKCJCTFNQIFVBUlQ6IEJ1cyBzY2FsaW5nIGlzIGRpc2FibGVkLlxuIik7CisJfSBlbHNlIHsKKwkJbXNtX3Vwb3J0LT5idXNfcGVyZl9jbGllbnQgPQorCQkJbXNtX2J1c19zY2FsZV9yZWdpc3Rlcl9jbGllbnQKKwkJCQkobXNtX3Vwb3J0LT5idXNfc2NhbGVfdGFibGUpOworCQlpZiAoSVNfRVJSKCZtc21fdXBvcnQtPmJ1c19wZXJmX2NsaWVudCkpIHsKKwkJCU1TTV9IU19FUlIoIiVzKCk6QnVzIGNsaWVudCByZWdpc3RlciBmYWlsZWRcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gdW5tYXBfbWVtb3J5OworCQl9CisJfQorCisJbXNtX3Vwb3J0LT53YWtldXAuaXJxID0gcGRhdGEtPndha2V1cF9pcnE7CisJbXNtX3Vwb3J0LT53YWtldXAuaWdub3JlID0gMTsKKwltc21fdXBvcnQtPndha2V1cC5pbmplY3RfcnggPSBwZGF0YS0+aW5qZWN0X3J4X29uX3dha2V1cDsKKwltc21fdXBvcnQtPndha2V1cC5yeF90b19pbmplY3QgPSBwZGF0YS0+cnhfdG9faW5qZWN0OworCW1zbV91cG9ydC0+b2JzID0gcGRhdGEtPm9iczsKKworCW1zbV91cG9ydC0+YmFtX3R4X2VwX3BpcGVfaW5kZXggPQorCQkJcGRhdGEtPmJhbV90eF9lcF9waXBlX2luZGV4OworCW1zbV91cG9ydC0+YmFtX3J4X2VwX3BpcGVfaW5kZXggPQorCQkJcGRhdGEtPmJhbV9yeF9lcF9waXBlX2luZGV4OworCW1zbV91cG9ydC0+d2FrZXVwLmVuYWJsZWQgPSB0cnVlOworCisJdXBvcnQtPmlvdHlwZSA9IFVQSU9fTUVNOworCXVwb3J0LT5maWZvc2l6ZSA9IDY0OworCXVwb3J0LT5vcHMgPSAmbXNtX2hzX29wczsKKwl1cG9ydC0+ZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORjsKKwl1cG9ydC0+dWFydGNsayA9IDczNzI4MDA7CisJbXNtX3Vwb3J0LT5pbXJfcmVnID0gMHgwOworCisJbXNtX3Vwb3J0LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJjb3JlX2NsayIpOworCWlmIChJU19FUlIobXNtX3Vwb3J0LT5jbGspKSB7CisJCXJldCA9IFBUUl9FUlIobXNtX3Vwb3J0LT5jbGspOworCQlnb3RvIGRlcmVnaXN0ZXJfYnVzX2NsaWVudDsKKwl9CisKKwltc21fdXBvcnQtPnBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJpZmFjZV9jbGsiKTsKKwkvKgorCSAqIFNvbWUgY29uZmlndXJhdGlvbnMgZG8gbm90IHJlcXVpcmUgZXhwbGljaXQgcGNsayBjb250cm9sIHNvCisJICogZG8gbm90IGZsYWcgZXJyb3Igb24gcGNsayBnZXQgZmFpbHVyZS4KKwkgKi8KKwlpZiAoSVNfRVJSKG1zbV91cG9ydC0+cGNsaykpCisJCW1zbV91cG9ydC0+cGNsayA9IE5VTEw7CisKKwltc21fdXBvcnQtPmhzdWFydF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgia19oc3VhcnQiLAorCQkJCQlXUV9VTkJPVU5EIHwgV1FfTUVNX1JFQ0xBSU0sIDEpOworCWlmICghbXNtX3Vwb3J0LT5oc3VhcnRfd3EpIHsKKwkJTVNNX0hTX0VSUigiJXMoKTogVW5hYmxlIHRvIGNyZWF0ZSB3b3JrcXVldWUgaHN1YXJ0X3dxXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldCA9ICAtRU5PTUVNOworCQlnb3RvIHB1dF9jbGs7CisJfQorCisJbXV0ZXhfaW5pdCgmbXNtX3Vwb3J0LT5tdHgpOworCisJLyogSW5pdGlhbGl6ZSBTUFMgSFcgY29ubmVjdGVkIHdpdGggVUFSVCBjb3JlICovCisJcmV0ID0gbXNtX2hzX3Nwc19pbml0KG1zbV91cG9ydCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJTVNNX0hTX0VSUigiU1BTIEluaXRpYWxpemF0aW9uIGZhaWxlZCAhIGVycj0lZCIsIHJldCk7CisJCWdvdG8gZGVzdHJveV9tdXRleDsKKwl9CisKKwltc21fdXBvcnQtPnR4LmZsdXNoID0gRkxVU0hfU0hVVERPV047CisJbXNtX3Vwb3J0LT5yeC5mbHVzaCA9IEZMVVNIX1NIVVRET1dOOworCisJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CisJc2NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJXMiLCBkZXZfbmFtZShtc21fdXBvcnQtPnVwb3J0LmRldiksCisJCQkJCQkJCQkiX3R4Iik7CisJbXNtX3Vwb3J0LT50eC5pcGNfdHhfY3R4dCA9CisJCWlwY19sb2dfY29udGV4dF9jcmVhdGUoSVBDX01TTV9IU19MT0dfREFUQV9QQUdFUywgbmFtZSwgMCk7CisJaWYgKCFtc21fdXBvcnQtPnR4LmlwY190eF9jdHh0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZXJyb3IgY3JlYXRpbmcgdHggbG9nZ2luZyBjb250ZXh0IiwKKwkJCQkJCQkJX19mdW5jX18pOworCisJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CisJc2NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJXMiLCBkZXZfbmFtZShtc21fdXBvcnQtPnVwb3J0LmRldiksCisJCQkJCQkJCQkiX3J4Iik7CisJbXNtX3Vwb3J0LT5yeC5pcGNfcnhfY3R4dCA9IGlwY19sb2dfY29udGV4dF9jcmVhdGUoCisJCQkJCUlQQ19NU01fSFNfTE9HX0RBVEFfUEFHRVMsIG5hbWUsIDApOworCWlmICghbXNtX3Vwb3J0LT5yeC5pcGNfcnhfY3R4dCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGVycm9yIGNyZWF0aW5nIHJ4IGxvZ2dpbmcgY29udGV4dCIsCisJCQkJCQkJCV9fZnVuY19fKTsKKworCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworCXNjbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzIiwgZGV2X25hbWUobXNtX3Vwb3J0LT51cG9ydC5kZXYpLAorCQkJCQkJCQkJIl9wd3IiKTsKKwltc21fdXBvcnQtPmlwY19tc21faHNfcHdyX2N0eHQgPSBpcGNfbG9nX2NvbnRleHRfY3JlYXRlKAorCQkJCQlJUENfTVNNX0hTX0xPR19VU0VSX1BBR0VTLCBuYW1lLCAwKTsKKwlpZiAoIW1zbV91cG9ydC0+aXBjX21zbV9oc19wd3JfY3R4dCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGVycm9yIGNyZWF0aW5nIHVzciBsb2dnaW5nIGNvbnRleHQiLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisKKwl1cG9ydC0+aXJxID0gY29yZV9pcnFyZXM7CisJbXNtX3Vwb3J0LT5iYW1faXJxID0gYmFtX2lycXJlczsKKworCWNsa19zZXRfcmF0ZShtc21fdXBvcnQtPmNsaywgbXNtX3Vwb3J0LT51cG9ydC51YXJ0Y2xrKTsKKwltc21faHNfY2xrX2J1c192b3RlKG1zbV91cG9ydCk7CisJcmV0ID0gdWFydGRtX2luaXRfcG9ydCh1cG9ydCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyX2Nsb2NrOworCisJLyogY29uZmlndXJlIHRoZSBDUiBQcm90ZWN0aW9uIHRvIEVuYWJsZSAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgQ1JfUFJPVEVDVElPTl9FTik7CisKKwkvKgorCSAqIEVuYWJsZSBDb21tYW5kIHJlZ2lzdGVyIHByb3RlY3Rpb24gYmVmb3JlIGdvaW5nIGFoZWFkIGFzIHRoaXMgaHcKKwkgKiBjb25maWd1cmF0aW9uIG1ha2VzIHN1cmUgdGhhdCBpc3N1ZWQgY21kIHRvIENSIHJlZ2lzdGVyIGdldHMgY29tcGxldGUKKwkgKiBiZWZvcmUgbmV4dCBpc3N1ZWQgY21kIHN0YXJ0LiBIZW5jZSBtYigpIHJlcXVpcmVzIGhlcmUuCisJICovCisJbWIoKTsKKworCS8qCisJICogU2V0IFJYX0JSRUFLX1pFUk9fQ0hBUl9PRkYgYW5kIFJYX0VSUk9SX0NIQVJfT0ZGCisJICogc28gYW55IHJ4X2JyZWFrIGFuZCBjaGFyYWN0ZXIgaGF2aW5nIHBhcml0eSBvZiBmcmFtaW5nCisJICogZXJyb3IgZG9uJ3QgZW50ZXIgaW5zaWRlIFVBUlQgUlggRklGTy4KKwkgKi8KKwlkYXRhID0gbXNtX2hzX3JlYWQodXBvcnQsIFVBUlRfRE1fTVIyKTsKKwlkYXRhIHw9IChVQVJURE1fTVIyX1JYX0JSRUFLX1pFUk9fQ0hBUl9PRkYgfAorCQkJVUFSVERNX01SMl9SWF9FUlJPUl9DSEFSX09GRik7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX01SMiwgZGF0YSk7CisJLyogRW5zdXJlIHJlZ2lzdGVyIElPIGNvbXBsZXRpb24gKi8KKwltYigpOworCisJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZGV2X2F0dHJfY2xvY2suYXR0cik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJTVNNX0hTX0VSUigiUHJvYmUgRmFpbGVkIGFzIHN5c2ZzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2Nsb2NrOworCX0KKworCW1zbV9zZXJpYWxfZGVidWdmc19pbml0KG1zbV91cG9ydCwgcGRldi0+aWQpOworCW1zbV9oc191bmNvbmZpZ191YXJ0X2dwaW9zKHVwb3J0KTsKKworCXVwb3J0LT5saW5lID0gcGRldi0+aWQ7CisJaWYgKHBkYXRhLT51c2VyaWQgJiYgcGRhdGEtPnVzZXJpZCA8PSBVQVJURE1fTlIpCisJCXVwb3J0LT5saW5lID0gcGRhdGEtPnVzZXJpZDsKKwlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmbXNtX2hzX2RyaXZlciwgdXBvcnQpOworCWlmICghcmV0KSB7CisJCW1zbV9oc19jbGtfYnVzX3Vudm90ZShtc21fdXBvcnQpOworCQltc21fc2VyaWFsX2hzX3J0X2luaXQodXBvcnQpOworCQlyZXR1cm4gcmV0OworCX0KKworZXJyX2Nsb2NrOgorCW1zbV9oc19jbGtfYnVzX3Vudm90ZShtc21fdXBvcnQpOworCitkZXN0cm95X211dGV4OgorCW11dGV4X2Rlc3Ryb3koJm1zbV91cG9ydC0+bXR4KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtc21fdXBvcnQtPmhzdWFydF93cSk7CisKK3B1dF9jbGs6CisJaWYgKG1zbV91cG9ydC0+cGNsaykKKwkJY2xrX3B1dChtc21fdXBvcnQtPnBjbGspOworCisJaWYgKG1zbV91cG9ydC0+Y2xrKQorCQljbGtfcHV0KG1zbV91cG9ydC0+Y2xrKTsKKworZGVyZWdpc3Rlcl9idXNfY2xpZW50OgorCW1zbV9idXNfc2NhbGVfdW5yZWdpc3Rlcl9jbGllbnQobXNtX3Vwb3J0LT5idXNfcGVyZl9jbGllbnQpOwordW5tYXBfbWVtb3J5OgorCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCWlvdW5tYXAobXNtX3Vwb3J0LT5iYW1fYmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc21fc2VyaWFsX2hzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm1zbV9oc19kcml2ZXIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigiJXMgZmFpbGVkIHRvIGxvYWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGVidWdfYmFzZSA9IGRlYnVnZnNfY3JlYXRlX2RpcigibXNtX3NlcmlhbF9ocyIsIE5VTEwpOworCWlmIChJU19FUlJfT1JfTlVMTChkZWJ1Z19iYXNlKSkKKwkJcHJfZXJyKCJtc21fc2VyaWFsX2hzOiBDYW5ub3QgY3JlYXRlIGRlYnVnZnMgZGlyXG4iKTsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlcyBmYWlsZWQgdG8gbG9hZFxuIiwgX19mdW5jX18pOworCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGVidWdfYmFzZSk7CisJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1zbV9oc19kcml2ZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByX2luZm8oIm1zbV9zZXJpYWxfaHMgbW9kdWxlIGxvYWRlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqICBDYWxsZWQgYnkgdGhlIHVwcGVyIGxheWVyIHdoZW4gcG9ydCBpcyBjbG9zZWQuCisgKiAgICAgLSBEaXNhYmxlcyB0aGUgcG9ydAorICogICAgIC0gVW5ob29rIHRoZSBJU1IKKyAqLworc3RhdGljIHZvaWQgbXNtX2hzX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCWludCByZXQsIHJjOworCXN0cnVjdCBtc21faHNfcG9ydCAqbXNtX3Vwb3J0ID0gVUFSVERNX1RPX01TTSh1cG9ydCk7CisJc3RydWN0IGNpcmNfYnVmICp0eF9idWYgPSAmdXBvcnQtPnN0YXRlLT54bWl0OworCWludCBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXNfdXNlX2xvd19wb3dlcl93YWtldXAobXNtX3Vwb3J0KSkKKwkJaXJxX3NldF9pcnFfd2FrZShtc21fdXBvcnQtPndha2V1cC5pcnEsIDApOworCisJaWYgKG1zbV91cG9ydC0+d2FrZXVwLmVuYWJsZWQpCisJCWRpc2FibGVfaXJxKG1zbV91cG9ydC0+d2FrZXVwLmlycSk7CisJZWxzZQorCQlkaXNhYmxlX2lycSh1cG9ydC0+aXJxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworCW1zbV91cG9ydC0+d2FrZXVwLmVuYWJsZWQgPSBmYWxzZTsKKwltc21fdXBvcnQtPndha2V1cC5pZ25vcmUgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwkvKiBGcmVlIHRoZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycSh1cG9ydC0+aXJxLCBtc21fdXBvcnQpOworCWlmIChpc191c2VfbG93X3Bvd2VyX3dha2V1cChtc21fdXBvcnQpKSB7CisJCWZyZWVfaXJxKG1zbV91cG9ydC0+d2FrZXVwLmlycSwgbXNtX3Vwb3J0KTsKKwkJTVNNX0hTX0RCRygiJXMoKTogd2FrZXVwIGlycSBmcmVlZCIsIF9fZnVuY19fKTsKKwl9CisJbXNtX3Vwb3J0LT53YWtldXAuZnJlZWQgPSB0cnVlOworCisJLyogbWFrZSBzdXJlIHR4IGxoIGZpbmlzaGVzICovCisJa3RocmVhZF9mbHVzaF93b3JrZXIoJm1zbV91cG9ydC0+dHgua3dvcmtlcik7CisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG1zbV91cG9ydC0+dHgud2FpdCwKKwkJCXVhcnRfY2lyY19lbXB0eSh0eF9idWYpLCA1MDApOworCWlmICghcmV0KQorCQlNU01fSFNfV0FSTigiU2h1dGRvd24gY2FsbGVkIHdoZW4gdHggYnVmZiBub3QgZW1wdHkiKTsKKworCW1zbV9oc19yZXNvdXJjZV92b3RlKG1zbV91cG9ydCk7CisJLyogU3RvcCByZW1vdGUgc2lkZSBmcm9tIHNlbmRpbmcgZGF0YSAqLworCW1zbV9oc19kaXNhYmxlX2Zsb3dfY29udHJvbCh1cG9ydCwgZmFsc2UpOworCS8qIG1ha2Ugc3VyZSByeCBsaCBmaW5pc2hlcyAqLworCWt0aHJlYWRfZmx1c2hfd29ya2VyKCZtc21fdXBvcnQtPnJ4Lmt3b3JrZXIpOworCisJaWYgKG1zbV91cG9ydC0+cnguZmx1c2ggIT0gRkxVU0hfU0hVVERPV04pIHsKKwkJLyogZGlzYWJsZSBhbmQgZGlzY29ubmVjdCByeCAqLworCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobXNtX3Vwb3J0LT5yeC53YWl0LAorCQkJCSFtc21fdXBvcnQtPnJ4LnBlbmRpbmdfZmxhZywgNTAwKTsKKwkJaWYgKCFyZXQpCisJCQlNU01fSFNfV0FSTigiJXMoKTogcnggZGlzY29ubmVjdCBub3QgY29tcGxldGUiLAorCQkJCV9fZnVuY19fKTsKKwkJbXNtX2hzX2Rpc2Nvbm5lY3RfcngodXBvcnQpOworCX0KKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbXNtX3Vwb3J0LT5yeC5mbGlwX2luc2VydF93b3JrKTsKKwlmbHVzaF93b3JrcXVldWUobXNtX3Vwb3J0LT5oc3VhcnRfd3EpOworCisJLyogQkFNIERpc2Nvbm5lY3QgZm9yIFRYICovCisJZGF0YSA9IG1zbV9oc19yZWFkKHVwb3J0LCBVQVJUX0RNX0RNRU4pOworCWRhdGEgJj0gflVBUlRETV9UWF9CQU1fRU5BQkxFX0JNU0s7CisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0RNRU4sIGRhdGEpOworCXJldCA9IHNwc190eF9kaXNjb25uZWN0KG1zbV91cG9ydCk7CisJaWYgKHJldCkKKwkJTVNNX0hTX0VSUigiJXMoKTogc3BzX2Rpc2Nvbm5lY3QgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJbXNtX3Vwb3J0LT50eC5mbHVzaCA9IEZMVVNIX1NIVVRET1dOOworCS8qIERpc2FibGUgdGhlIHRyYW5zbWl0dGVyICovCisJbXNtX2hzX3dyaXRlKHVwb3J0LCBVQVJUX0RNX0NSLCBVQVJURE1fQ1JfVFhfRElTQUJMRV9CTVNLKTsKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciAqLworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9DUiwgVUFSVERNX0NSX1JYX0RJU0FCTEVfQk1TSyk7CisKKwltc21fdXBvcnQtPmltcl9yZWcgPSAwOworCW1zbV9oc193cml0ZSh1cG9ydCwgVUFSVF9ETV9JTVIsIG1zbV91cG9ydC0+aW1yX3JlZyk7CisJLyoKKwkgKiBDb21wbGV0ZSBhbGwgZGV2aWNlIHdyaXRlIGJlZm9yZSBhY3R1YWxseSBkaXNhYmxpbmcgdWFydGNsay4KKwkgKiBIZW5jZSBtYigpIHJlcXVpcmVzIGhlcmUuCisJICovCisJbWIoKTsKKworCW1zbV91cG9ydC0+cnguYnVmZmVyX3BlbmRpbmcgPSBOT05FX1BFTkRJTkc7CisJTVNNX0hTX0RCRygiJXMoKTogdHgsIHJ4IGV2ZW50cyBjb21wbGV0ZSIsIF9fZnVuY19fKTsKKworCWRtYV91bm1hcF9zaW5nbGUodXBvcnQtPmRldiwgbXNtX3Vwb3J0LT50eC5kbWFfYmFzZSwKKwkJCSBVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7CisKKwltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJcmMgPSBhdG9taWNfcmVhZCgmbXNtX3Vwb3J0LT5yZXNvdXJjZV9jb3VudCk7CisJaWYgKHJjKSB7CisJCWF0b21pY19zZXQoJm1zbV91cG9ydC0+cmVzb3VyY2VfY291bnQsIDEpOworCQlNU01fSFNfV0FSTigiJXMoKTogcmVtb3ZpbmcgZXh0cmEgdm90ZVxuIiwgX19mdW5jX18pOworCQltc21faHNfcmVzb3VyY2VfdW52b3RlKG1zbV91cG9ydCk7CisJfQorCWlmIChhdG9taWNfcmVhZCgmbXNtX3Vwb3J0LT5jbGllbnRfcmVxX3N0YXRlKSkgeworCQlNU01fSFNfV0FSTigiJXM6IENsaWVudCBjbG9jayB2b3RlIGltYmFsYW5jZVxuIiwgX19mdW5jX18pOworCQlhdG9taWNfc2V0KCZtc21fdXBvcnQtPmNsaWVudF9yZXFfc3RhdGUsIDApOworCX0KKwlpZiAoYXRvbWljX3JlYWQoJm1zbV91cG9ydC0+Y2xpZW50X2NvdW50KSkgeworCQlNU01fSFNfV0FSTigiJXM6IENsaWVudCB2b3RlIG9uLCBmb3JjaW5nIHRvIDBcbiIsIF9fZnVuY19fKTsKKwkJYXRvbWljX3NldCgmbXNtX3Vwb3J0LT5jbGllbnRfY291bnQsIDApOworCQlMT0dfVVNSX01TRyhtc21fdXBvcnQtPmlwY19tc21faHNfcHdyX2N0eHQsCisJCQkiJXM6IENsaWVudF9Db3VudCAwXG4iLCBfX2Z1bmNfXyk7CisJfQorCW1zbV9oc191bmNvbmZpZ191YXJ0X2dwaW9zKHVwb3J0KTsKKwlNU01fSFNfSU5GTygiJXM6VUFSVCBwb3J0IGNsb3NlZCBzdWNjZXNzZnVsbHlcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1zbV9zZXJpYWxfaHNfZXhpdCh2b2lkKQoreworCXByX2luZm8oIm1zbV9zZXJpYWxfaHMgbW9kdWxlIHJlbW92ZWRcbiIpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZWJ1Z19iYXNlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kcml2ZXIpOworCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1zbV9oc19kcml2ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbXNtX2hzX2Rldl9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IG1zbV9oc19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gbXNtX2hzX3J1bnRpbWVfcmVzdW1lLAorCS5ydW50aW1lX2lkbGUgPSBOVUxMLAorCS5zdXNwZW5kX25vaXJxID0gbXNtX2hzX3BtX3N5c19zdXNwZW5kX25vaXJxLAorCS5yZXN1bWVfbm9pcnEgPSBtc21faHNfcG1fc3lzX3Jlc3VtZV9ub2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9zZXJpYWxfaHNfcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZQk9IG1zbV9oc19wcm9iZSwKKwkucmVtb3ZlID0gbXNtX2hzX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtc21fc2VyaWFsX2hzIiwKKwkJLnBtICAgPSAmbXNtX2hzX2Rldl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9oc19tYXRjaF90YWJsZSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBtc21faHNfZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSA9ICJtc21fc2VyaWFsX2hzIiwKKwkuZGV2X25hbWUgPSAidHR5SFMiLAorCS5uciA9IFVBUlRETV9OUiwKKwkuY29ucyA9IDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIG1zbV9oc19vcHMgPSB7CisJLnR4X2VtcHR5ID0gbXNtX2hzX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwgPSBtc21faHNfc2V0X21jdHJsX2xvY2tlZCwKKwkuZ2V0X21jdHJsID0gbXNtX2hzX2dldF9tY3RybF9sb2NrZWQsCisJLnN0b3BfdHggPSBtc21faHNfc3RvcF90eF9sb2NrZWQsCisJLnN0YXJ0X3R4ID0gbXNtX2hzX3N0YXJ0X3R4X2xvY2tlZCwKKwkuc3RvcF9yeCA9IG1zbV9oc19zdG9wX3J4X2xvY2tlZCwKKwkuZW5hYmxlX21zID0gbXNtX2hzX2VuYWJsZV9tc19sb2NrZWQsCisJLmJyZWFrX2N0bCA9IG1zbV9oc19icmVha19jdGwsCisJLnN0YXJ0dXAgPSBtc21faHNfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBtc21faHNfc2h1dGRvd24sCisJLnNldF90ZXJtaW9zID0gbXNtX2hzX3NldF90ZXJtaW9zLAorCS50eXBlID0gbXNtX2hzX3R5cGUsCisJLmNvbmZpZ19wb3J0ID0gbXNtX2hzX2NvbmZpZ19wb3J0LAorCS5mbHVzaF9idWZmZXIgPSBOVUxMLAorCS5pb2N0bCA9IG1zbV9oc19pb2N0bCwKK307CisKK21vZHVsZV9pbml0KG1zbV9zZXJpYWxfaHNfaW5pdCk7Cittb2R1bGVfZXhpdChtc21fc2VyaWFsX2hzX2V4aXQpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIaWdoIFNwZWVkIFVBUlQgRHJpdmVyIGZvciB0aGUgTVNNIGNoaXBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tc21fc2VyaWFsX2hzX2h3cmVnLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbF9oc19od3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2U0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXNtX3NlcmlhbF9oc19od3JlZy5oCkBAIC0wLDAgKzEsMjgzIEBACisvKiBkcml2ZXJzL3NlcmlhbC9tc21fc2VyaWFsX2hzX2h3cmVnLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSwgMjAxMi0yMDE0LFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEFsbCBzb3VyY2UgY29kZSBpbiB0aGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlCisgKiBleGNlcHQgd2hlcmUgaW5kaWNhdGVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnCisgKi8KKworI2lmbmRlZiBNU01fU0VSSUFMX0hTX0hXUkVHX0gKKyNkZWZpbmUgTVNNX1NFUklBTF9IU19IV1JFR19ICisKKyNkZWZpbmUgR1NCSV9DT05UUk9MX0FERFIgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBHU0JJX1BST1RPQ09MX0NPREVfTUFTSyAgICAgICAgMHgzMAorI2RlZmluZSBHU0JJX1BST1RPQ09MX0kyQ19VQVJUICAgICAgICAgMHg2MAorI2RlZmluZSBHU0JJX1BST1RPQ09MX1VBUlQgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBHU0JJX1BST1RPQ09MX0lETEUgICAgICAgICAgICAgMHgwCisKKyNkZWZpbmUgVENTUl9BRE1fMV9BX0NSQ0lfTVVYX1NFTCAgICAgIDB4NzgKKyNkZWZpbmUgVENTUl9BRE1fMV9CX0NSQ0lfTVVYX1NFTCAgICAgIDB4N0MKKyNkZWZpbmUgQURNMV9DUkNJX0dTQkk2X1JYX1NFTCAgICAgICAgIDB4ODAwCisjZGVmaW5lIEFETTFfQ1JDSV9HU0JJNl9UWF9TRUwgICAgICAgICAweDQwMAorCisjZGVmaW5lIE1TTV9FTkFCTEVfVUFSVF9DTE9DSyBUSU9DUE1HRVQKKyNkZWZpbmUgTVNNX0RJU0FCTEVfVUFSVF9DTE9DSyBUSU9DUE1QVVQKKyNkZWZpbmUgTVNNX0dFVF9VQVJUX0NMT0NLX1NUQVRVUyBUSU9DUE1BQ1QKKworZW51bSBtc21faHNsX3JlZ3MgeworCVVBUlRETV9NUjEsCisJVUFSVERNX01SMiwKKwlVQVJURE1fSU1SLAorCVVBUlRETV9TUiwKKwlVQVJURE1fQ1IsCisJVUFSVERNX0NTUiwKKwlVQVJURE1fSVBSLAorCVVBUlRETV9JU1IsCisJVUFSVERNX1JYX1RPVEFMX1NOQVAsCisJVUFSVERNX1JGV1IsCisJVUFSVERNX1RGV1IsCisJVUFSVERNX1JGLAorCVVBUlRETV9URiwKKwlVQVJURE1fTUlTUiwKKwlVQVJURE1fRE1SWCwKKwlVQVJURE1fTkNGX1RYLAorCVVBUlRETV9ETUVOLAorCVVBUlRETV9CQ1IsCisJVUFSVERNX1RYRlMsCisJVUFSVERNX1JYRlMsCisJVUFSVERNX0xBU1QsCit9OworCitlbnVtIG1zbV9oc19yZWdzIHsKKwlVQVJUX0RNX01SMSA9IDB4MCwKKwlVQVJUX0RNX01SMiA9IDB4NCwKKwlVQVJUX0RNX0lNUiA9IDB4YjAsCisJVUFSVF9ETV9TUiA9IDB4YTQsCisJVUFSVF9ETV9DUiA9IDB4YTgsCisJVUFSVF9ETV9DU1IgPSAweGEwLAorCVVBUlRfRE1fSVBSID0gMHgxOCwKKwlVQVJUX0RNX0lTUiA9IDB4YjQsCisJVUFSVF9ETV9SWF9UT1RBTF9TTkFQID0gMHhiYywKKwlVQVJUX0RNX1RGV1IgPSAweDFjLAorCVVBUlRfRE1fUkZXUiA9IDB4MjAsCisJVUFSVF9ETV9SRiA9IDB4MTQwLAorCVVBUlRfRE1fVEYgPSAweDEwMCwKKwlVQVJUX0RNX01JU1IgPSAweGFjLAorCVVBUlRfRE1fRE1SWCA9IDB4MzQsCisJVUFSVF9ETV9OQ0ZfVFggPSAweDQwLAorCVVBUlRfRE1fRE1FTiA9IDB4M2MsCisJVUFSVF9ETV9UWEZTID0gMHg0YywKKwlVQVJUX0RNX1JYRlMgPSAweDUwLAorCVVBUlRfRE1fUlhfVFJBTlNfQ1RSTCA9IDB4Y2MsCisJVUFSVF9ETV9CQ1IgPSAweGM4LAorfTsKKworI2RlZmluZSBVQVJURE1fTVIxX0FERFIgMHgwCisjZGVmaW5lIFVBUlRETV9NUjJfQUREUiAweDQKKworLyogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBSZWdpc3RlciBmb3IgVUFSVERNIENvcmUgdjEuNCAqLworI2RlZmluZSBVQVJURE1fQkNSX0FERFIJMHhjOAorCisvKgorICogVUFSVERNIENvcmUgdjEuNCBTVEFMRV9JUlFfRU1QVFkgYml0IGRlZmluYXRpb24KKyAqIFN0YWxlIGludGVycnVwdCB3aWxsIGZpcmUgaWYgYml0IGlzIHNldCB3aGVuIFJYLUZJRk8gaXMgZW1wdHkKKyAqLworI2RlZmluZSBVQVJURE1fQkNSX1RYX0JSRUFLX0RJU0FCTEUJMHgxCisjZGVmaW5lIFVBUlRETV9CQ1JfU1RBTEVfSVJRX0VNUFRZCTB4MgorI2RlZmluZSBVQVJURE1fQkNSX1JYX0RNUlhfTE9XX0VOCTB4NAorI2RlZmluZSBVQVJURE1fQkNSX1JYX1NUQUxfSVJRX0RNUlhfRVFMCTB4MTAKKyNkZWZpbmUgVUFSVERNX0JDUl9SWF9ETVJYXzFCWVRFX1JFU19FTgkweDIwCisKKy8qIFRSQU5TRkVSX0NPTlRST0wgUmVnaXN0ZXIgZm9yIFVBUlRETSBDb3JlIHYxLjQgKi8KKyNkZWZpbmUgVUFSVERNX1JYX1RSQU5TX0NUUkxfQUREUiAgICAgIDB4Y2MKKworLyogVFJBTlNGRVJfQ09OVFJPTCBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFJYX1NUQUxFX0FVVE9fUkVfRU4JCTB4MQorI2RlZmluZSBSWF9UUkFOU19BVVRPX1JFX0FDVElWQVRFCTB4MgorI2RlZmluZSBSWF9ETVJYX0NZQ0xJQ19FTgkJMHg0CisKKy8qIHdyaXRlIG9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVERNX0NTUl8xMTUyMDAgMHhGRgorI2RlZmluZSBVQVJURE1fQ1NSXzU3NjAwICAweEVFCisjZGVmaW5lIFVBUlRETV9DU1JfMzg0MDAgIDB4REQKKyNkZWZpbmUgVUFSVERNX0NTUl8yODgwMCAgMHhDQworI2RlZmluZSBVQVJURE1fQ1NSXzE5MjAwICAweEJCCisjZGVmaW5lIFVBUlRETV9DU1JfMTQ0MDAgIDB4QUEKKyNkZWZpbmUgVUFSVERNX0NTUl85NjAwICAgMHg5OQorI2RlZmluZSBVQVJURE1fQ1NSXzcyMDAgICAweDg4CisjZGVmaW5lIFVBUlRETV9DU1JfNDgwMCAgIDB4NzcKKyNkZWZpbmUgVUFSVERNX0NTUl8zNjAwICAgMHg2NgorI2RlZmluZSBVQVJURE1fQ1NSXzI0MDAgICAweDU1CisjZGVmaW5lIFVBUlRETV9DU1JfMTIwMCAgIDB4NDQKKyNkZWZpbmUgVUFSVERNX0NTUl82MDAgICAgMHgzMworI2RlZmluZSBVQVJURE1fQ1NSXzMwMCAgICAweDIyCisjZGVmaW5lIFVBUlRETV9DU1JfMTUwICAgIDB4MTEKKyNkZWZpbmUgVUFSVERNX0NTUl83NSAgICAgMHgwMAorCisvKiB3cml0ZSBvbmx5IHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRETV9JUFJfQUREUiAweDE4CisjZGVmaW5lIFVBUlRETV9URldSX0FERFIgMHgxYworI2RlZmluZSBVQVJURE1fUkZXUl9BRERSIDB4MjAKKyNkZWZpbmUgVUFSVERNX0hDUl9BRERSIDB4MjQKKyNkZWZpbmUgVUFSVERNX0RNUlhfQUREUiAweDM0CisjZGVmaW5lIFVBUlRETV9ETUVOX0FERFIgMHgzYworCisvKiBVQVJUX0RNX05PX0NIQVJTX0ZPUl9UWCAqLworI2RlZmluZSBVQVJURE1fTkNGX1RYX0FERFIgMHg0MAorCisjZGVmaW5lIFVBUlRETV9CQURSX0FERFIgMHg0NAorCisjZGVmaW5lIFVBUlRETV9TSU1fQ0ZHX0FERFIgMHg4MAorCisvKiBSZWFkIE9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVERNX1RYRlNfQUREUiAweDRDCisjZGVmaW5lIFVBUlRETV9SWEZTX0FERFIgMHg1MAorCisvKiBSZWdpc3RlciBmaWVsZCBNYXNrIE1hcHBpbmcgKi8KKyNkZWZpbmUgVUFSVERNX1NSX1JYX0JSRUFLX0JNU0sJICAgICAgICBCSVQoNikKKyNkZWZpbmUgVUFSVERNX1NSX1BBUl9GUkFNRV9CTVNLCUJJVCg1KQorI2RlZmluZSBVQVJURE1fU1JfT1ZFUlJVTl9CTVNLCQlCSVQoNCkKKyNkZWZpbmUgVUFSVERNX1NSX1RYRU1UX0JNU0sJCUJJVCgzKQorI2RlZmluZSBVQVJURE1fU1JfVFhSRFlfQk1TSwkJQklUKDIpCisjZGVmaW5lIFVBUlRETV9TUl9SWFJEWV9CTVNLCQlCSVQoMCkKKworI2RlZmluZSBVQVJURE1fQ1JfVFhfRElTQUJMRV9CTVNLCUJJVCgzKQorI2RlZmluZSBVQVJURE1fQ1JfUlhfRElTQUJMRV9CTVNLCUJJVCgxKQorI2RlZmluZSBVQVJURE1fQ1JfVFhfRU5fQk1TSwkJQklUKDIpCisjZGVmaW5lIFVBUlRETV9DUl9SWF9FTl9CTVNLCQlCSVQoMCkKKworLyogVUFSVERNX0NSIGNoYW5uZWxfY29tbWFuIGJpdCB2YWx1ZSAocmVnaXN0ZXIgZmllbGQgaXMgYml0cyA4OjQpICovCisjZGVmaW5lIFJFU0VUX1JYCQkweDEwCisjZGVmaW5lIFJFU0VUX1RYCQkweDIwCisjZGVmaW5lIFJFU0VUX0VSUk9SX1NUQVRVUwkweDMwCisjZGVmaW5lIFJFU0VUX0JSRUFLX0lOVAkJMHg0MAorI2RlZmluZSBTVEFSVF9CUkVBSwkJMHg1MAorI2RlZmluZSBTVE9QX0JSRUFLCQkweDYwCisjZGVmaW5lIFJFU0VUX0NUUwkJMHg3MAorI2RlZmluZSBSRVNFVF9TVEFMRV9JTlQJCTB4ODAKKyNkZWZpbmUgUkZSX0xPVwkJCTB4RDAKKyNkZWZpbmUgUkZSX0hJR0gJCTB4RTAKKyNkZWZpbmUgQ1JfUFJPVEVDVElPTl9FTgkweDEwMAorI2RlZmluZSBTVEFMRV9FVkVOVF9FTkFCTEUJMHg1MDAKKyNkZWZpbmUgU1RBTEVfRVZFTlRfRElTQUJMRQkweDYwMAorI2RlZmluZSBGT1JDRV9TVEFMRV9FVkVOVAkweDQwMAorI2RlZmluZSBDTEVBUl9UWF9SRUFEWQkJMHgzMDAKKyNkZWZpbmUgUkVTRVRfVFhfRVJST1IJCTB4ODAwCisjZGVmaW5lIFJFU0VUX1RYX0RPTkUJCTB4ODEwCisKKy8qCisgKiBVQVJURE1fQ1IgQkFNIElGQyBjb21tYW4gYml0IHZhbHVlCisgKiBmb3IgVUFSVERNIENvcmUgdjEuNAorICovCisjZGVmaW5lIFNUQVJUX1JYX0JBTV9JRkMJMHg4NTAKKyNkZWZpbmUgU1RBUlRfVFhfQkFNX0lGQwkweDg2MAorCisjZGVmaW5lIFVBUlRETV9NUjFfQVVUT19SRlJfTEVWRUwxX0JNU0sgMHhmZmZmZmYwMAorI2RlZmluZSBVQVJURE1fTVIxX0FVVE9fUkZSX0xFVkVMMF9CTVNLIDB4M2YKKyNkZWZpbmUgVUFSVERNX01SMV9DVFNfQ1RMX0JNU0sgMHg0MAorI2RlZmluZSBVQVJURE1fTVIxX1JYX1JEWV9DVExfQk1TSyAweDgwCisKKy8qCisgKiBVQVJURE0gQ29yZSB2MS40IE1SMl9SRlJfQ1RTX0xPT1AgYml0bWFzaworICogRW5hYmxlcyBpbnRlcm5hbCBsb29wYmFjayBiZXR3ZWVuIFJGUl9OIG9mCisgKiBSWCBjaGFubmVsIGFuZCBDVFNfTiBvZiBUWCBjaGFubmVsLgorICovCisjZGVmaW5lIFVBUlRETV9NUjJfUkZSX0NUU19MT09QX01PREVfQk1TSwkweDQwMAorCisjZGVmaW5lIFVBUlRETV9NUjJfTE9PUF9NT0RFX0JNU0sJCTB4ODAKKyNkZWZpbmUgVUFSVERNX01SMl9FUlJPUl9NT0RFX0JNU0sJCTB4NDAKKyNkZWZpbmUgVUFSVERNX01SMl9CSVRTX1BFUl9DSEFSX0JNU0sJCTB4MzAKKyNkZWZpbmUgVUFSVERNX01SMl9SWF9aRVJPX0NIQVJfT0ZGCQkweDEwMAorI2RlZmluZSBVQVJURE1fTVIyX1JYX0VSUk9SX0NIQVJfT0ZGCQkweDIwMAorI2RlZmluZSBVQVJURE1fTVIyX1JYX0JSRUFLX1pFUk9fQ0hBUl9PRkYJMHgxMDAKKworI2RlZmluZSBVQVJURE1fTVIyX0JJVFNfUEVSX0NIQVJfOAkoMHgzIDw8IDQpCisKKy8qIGJpdHMgcGVyIGNoYXJhY3RlciBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIEZJVkVfQlBDICAoMCA8PCA0KQorI2RlZmluZSBTSVhfQlBDICAgKDEgPDwgNCkKKyNkZWZpbmUgU0VWRU5fQlBDICgyIDw8IDQpCisjZGVmaW5lIEVJR0hUX0JQQyAoMyA8PCA0KQorCisjZGVmaW5lIFVBUlRETV9NUjJfU1RPUF9CSVRfTEVOX0JNU0sgMHhjCisjZGVmaW5lIFNUT1BfQklUX09ORSAoMSA8PCAyKQorI2RlZmluZSBTVE9QX0JJVF9UV08gKDMgPDwgMikKKworI2RlZmluZSBVQVJURE1fTVIyX1BBUklUWV9NT0RFX0JNU0sgMHgzCisKKy8qIFBhcml0eSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE5PX1BBUklUWSAweDAKKyNkZWZpbmUgRVZFTl9QQVJJVFkgMHgyCisjZGVmaW5lIE9ERF9QQVJJVFkgMHgxCisjZGVmaW5lIFNQQUNFX1BBUklUWSAweDMKKworI2RlZmluZSBVQVJURE1fSVBSX1NUQUxFX1RJTUVPVVRfTVNCX0JNU0sgMHhmZmZmZmY4MAorI2RlZmluZSBVQVJURE1fSVBSX1NUQUxFX0xTQl9CTVNLIDB4MWYKKworLyogVGhlc2UgY2FuIGJlIHVzZWQgZm9yIGJvdGggSVNSIGFuZCBJTVIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVERNX0lTUl9UWF9SRUFEWV9CTVNLCUJJVCg3KQorI2RlZmluZSBVQVJURE1fSVNSX0NVUlJFTlRfQ1RTX0JNU0sJQklUKDYpCisjZGVmaW5lIFVBUlRETV9JU1JfREVMVEFfQ1RTX0JNU0sJQklUKDUpCisjZGVmaW5lIFVBUlRETV9JU1JfUlhMRVZfQk1TSwkJQklUKDQpCisjZGVmaW5lIFVBUlRETV9JU1JfUlhTVEFMRV9CTVNLCQlCSVQoMykKKyNkZWZpbmUgVUFSVERNX0lTUl9SWEJSRUFLX0JNU0sJCUJJVCgyKQorI2RlZmluZSBVQVJURE1fSVNSX1JYSFVOVF9CTVNLCQlCSVQoMSkKKyNkZWZpbmUgVUFSVERNX0lTUl9UWExFVl9CTVNLCQlCSVQoMCkKKworLyogRmllbGQgZGVmaW5pdGlvbnMgZm9yIFVBUlRfRE1fRE1FTiovCisjZGVmaW5lIFVBUlRETV9UWF9ETV9FTl9CTVNLIDB4MQorI2RlZmluZSBVQVJURE1fUlhfRE1fRU5fQk1TSyAweDIKKworLyoKKyAqIFVBUlRETSBDb3JlIHYxLjQgYml0bWFzaworICogQml0bWFza3MgZm9yIGVuYWJsaW5nIFJ4IGFuZCBUeCBCQU0gSW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgVUFSVERNX1RYX0JBTV9FTkFCTEVfQk1TSyAweDQKKyNkZWZpbmUgVUFSVERNX1JYX0JBTV9FTkFCTEVfQk1TSyAweDgKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBmb3IgVUFSVCBDb3JlIHYxMyAqLworCisvKiB3cml0ZSBvbmx5IHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRETV9DU1JfQUREUiAgICAweDgKKworLyogd3JpdGUgb25seSByZWdpc3RlciAqLworI2RlZmluZSBVQVJURE1fVEZfQUREUiAgIDB4NzAKKyNkZWZpbmUgVUFSVERNX1RGMl9BRERSICAweDc0CisjZGVmaW5lIFVBUlRETV9URjNfQUREUiAgMHg3OAorI2RlZmluZSBVQVJURE1fVEY0X0FERFIgIDB4N2MKKworLyogd3JpdGUgb25seSByZWdpc3RlciAqLworI2RlZmluZSBVQVJURE1fQ1JfQUREUiAweDEwCisvKiB3cml0ZSBvbmx5IHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRETV9JTVJfQUREUiAweDE0CisjZGVmaW5lIFVBUlRETV9JUkRBX0FERFIgMHgzOAorCisvKiBSZWFkIE9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVERNX1NSX0FERFIgMHg4CisKKy8qIFJlYWQgT25seSByZWdpc3RlciAqLworI2RlZmluZSBVQVJURE1fUkZfQUREUiAgIDB4NzAKKyNkZWZpbmUgVUFSVERNX1JGMl9BRERSICAweDc0CisjZGVmaW5lIFVBUlRETV9SRjNfQUREUiAgMHg3OAorI2RlZmluZSBVQVJURE1fUkY0X0FERFIgIDB4N2MKKworLyogUmVhZCBPbmx5IHJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRETV9NSVNSX0FERFIgMHgxMAorCisvKiBSZWFkIE9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVERNX0lTUl9BRERSIDB4MTQKKyNkZWZpbmUgVUFSVERNX1JYX1RPVEFMX1NOQVBfQUREUiAweDM4CisKKyNlbmRpZiAvKiBNU01fU0VSSUFMX0hTX0hXUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCA4NDA5MzBiMC4uYzgwNzVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNjI5LDYgKzYyOSw4IEBACiAJaWYgKGFzLT5zdGF0dXMgPCAwICYmIGFzLT5idWxrX2FkZHIgJiYgYXMtPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCAmJgogCQkJYXMtPnN0YXR1cyAhPSAtRU5PRU5UKQogCQljYW5jZWxfYnVsa191cmJzKHBzLCBhcy0+YnVsa19hZGRyKTsKKworCXdha2VfdXAoJnBzLT53YWl0KTsKIAlzcGluX3VubG9jaygmcHMtPmxvY2spOwogCiAJaWYgKHNpZ25yKSB7CkBAIC02MzYsOCArNjM4LDYgQEAKIAkJcHV0X3BpZChwaWQpOwogCQlwdXRfY3JlZChjcmVkKTsKIAl9Ci0KLQl3YWtlX3VwKCZwcy0+d2FpdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfYXN5bmMoc3RydWN0IHVzYl9kZXZfc3RhdGUgKnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKaW5kZXggZTA3ZmE3Ni4uN2I4Y2E3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCkBAIC0xODc4LDcgKzE4NzgsNyBAQAogCS8qIE5vIG1vcmUgc3VibWl0cyBjYW4gb2NjdXIgKi8KIAlzcGluX2xvY2tfaXJxKCZoY2RfdXJiX2xpc3RfbG9jayk7CiByZXNjYW46Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodXJiLCAmZXAtPnVyYl9saXN0LCB1cmJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh1cmIsICZlcC0+dXJiX2xpc3QsIHVyYl9saXN0KSB7CiAJCWludAlpc19pbjsKIAogCQlpZiAodXJiLT51bmxpbmtlZCkKQEAgLTIyNTYsMzkgKzIyNTYsMzggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotZG1hX2FkZHJfdAotdXNiX2hjZF9nZXRfc2VjX2V2ZW50X3JpbmdfZG1hX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JdW5zaWduZWQgaW50IGludHJfbnVtKQorcGh5c19hZGRyX3QKK3VzYl9oY2RfZ2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwl1bnNpZ25lZCBpbnQgaW50cl9udW0sIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gYnVzX3RvX2hjZCh1ZGV2LT5idXMpOwogCiAJaWYgKCFIQ0RfUkhfUlVOTklORyhoY2QpKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBoY2QtPmRyaXZlci0+Z2V0X3NlY19ldmVudF9yaW5nX2RtYV9hZGRyKGhjZCwgaW50cl9udW0pOworCXJldHVybiBoY2QtPmRyaXZlci0+Z2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcihoY2QsIGludHJfbnVtLCBkbWEpOwogfQogCi1kbWFfYWRkcl90Ci11c2JfaGNkX2dldF9kY2JhX2RtYV9hZGRyKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorcGh5c19hZGRyX3QKK3VzYl9oY2RfZ2V0X3hmZXJfcmluZ19waHlzX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gYnVzX3RvX2hjZCh1ZGV2LT5idXMpOwogCiAJaWYgKCFIQ0RfUkhfUlVOTklORyhoY2QpKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBoY2QtPmRyaXZlci0+Z2V0X2RjYmFfZG1hX2FkZHIoaGNkLCB1ZGV2KTsKKwlyZXR1cm4gaGNkLT5kcml2ZXItPmdldF94ZmVyX3JpbmdfcGh5c19hZGRyKGhjZCwgdWRldiwgZXAsIGRtYSk7CiB9CiAKLWRtYV9hZGRyX3QKLXVzYl9oY2RfZ2V0X3hmZXJfcmluZ19kbWFfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKK2ludCB1c2JfaGNkX2dldF9jb250cm9sbGVyX2lkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXN0cnVjdCB1c2JfaGNkCSpoY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CiAKIAlpZiAoIUhDRF9SSF9SVU5OSU5HKGhjZCkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBoY2QtPmRyaXZlci0+Z2V0X3hmZXJfcmluZ19kbWFfYWRkcihoY2QsIHVkZXYsIGVwKTsKKwlyZXR1cm4gaGNkLT5kcml2ZXItPmdldF9jb3JlX2lkKGhjZCk7CiB9CiAKICNpZmRlZglDT05GSUdfUE0KQEAgLTI1MzIsNiArMjUzMSw4IEBACiAJfQogCWlmICh1c2JfaGNkX2lzX3ByaW1hcnlfaGNkKGhjZCkgJiYgaGNkLT5zaGFyZWRfaGNkKSB7CiAJCWhjZCA9IGhjZC0+c2hhcmVkX2hjZDsKKwkJY2xlYXJfYml0KEhDRF9GTEFHX1JIX1JVTk5JTkcsICZoY2QtPmZsYWdzKTsKKwkJc2V0X2JpdChIQ0RfRkxBR19ERUFELCAmaGNkLT5mbGFncyk7CiAJCWlmIChoY2QtPnJoX3JlZ2lzdGVyZWQpIHsKIAkJCWNsZWFyX2JpdChIQ0RfRkxBR19QT0xMX1JILCAmaGNkLT5mbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDUwNjc5YmMuLjNiMGNjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtNDc0MSw3ICs0NzQxLDggQEAKIHN0YXRpYyB2b2lkIGh1Yl9wb3J0X2Nvbm5lY3Qoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLCB1MTYgcG9ydHN0YXR1cywKIAkJdTE2IHBvcnRjaGFuZ2UpCiB7Ci0JaW50IHN0YXR1cywgaTsKKwlpbnQgc3RhdHVzID0gLUVOT0RFVjsKKwlpbnQgaTsKIAl1bnNpZ25lZCB1bml0X2xvYWQ7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYgPSBodWItPmhkZXY7CiAJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QoaGRldi0+YnVzKTsKQEAgLTQ5NDUsOSArNDk0NiwxMCBAQAogCiBkb25lOgogCWh1Yl9wb3J0X2Rpc2FibGUoaHViLCBwb3J0MSwgMSk7Ci0JaWYgKGhjZC0+ZHJpdmVyLT5yZWxpbnF1aXNoX3BvcnQgJiYgIWh1Yi0+aGRldi0+cGFyZW50KQotCQloY2QtPmRyaXZlci0+cmVsaW5xdWlzaF9wb3J0KGhjZCwgcG9ydDEpOwotCisJaWYgKGhjZC0+ZHJpdmVyLT5yZWxpbnF1aXNoX3BvcnQgJiYgIWh1Yi0+aGRldi0+cGFyZW50KSB7CisJCWlmIChzdGF0dXMgIT0gLUVOT1RDT05OICYmIHN0YXR1cyAhPSAtRU5PREVWKQorCQkJaGNkLT5kcml2ZXItPnJlbGlucXVpc2hfcG9ydChoY2QsIHBvcnQxKTsKKwl9CiB9CiAKIC8qIEhhbmRsZSBwaHlzaWNhbCBvciBsb2dpY2FsIGNvbm5lY3Rpb24gY2hhbmdlIGV2ZW50cy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggM2E0NzA3Ny4uNDFhOTg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTE0MTYsNiArMTQxNiwxNzUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXRfaW50ZXJmYWNlKTsKIAogLyoqCisgKiB1c2Jfc2V0X2ludGVyZmFjZV90aW1lb3V0IC0gTWFrZXMgYSBwYXJ0aWN1bGFyIGFsdGVybmF0ZSBzZXR0aW5nIGJlIGN1cnJlbnQKKyAqIGFuZCBhbGxvd3MgdG8gc2V0IGEgdGltb3V0IHZhbHVlIGZvciB0aGlzIGNvbnRyb2wgdHJhbnNmZXIuCisgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGludGVyZmFjZSBpcyBiZWluZyB1cGRhdGVkCisgKiBAaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIGJlaW5nIHVwZGF0ZWQKKyAqIEBhbHRlcm5hdGU6IHRoZSBzZXR0aW5nIGJlaW5nIGNob3Nlbi4KKyAqIEB0aW1lb3V0OiB0aW1lb3V0IHZhbHVlIGluIG1zIChub24temVybyksIGJlZm9yZSB3aGljaCB0aGlzIHRyYW5zZmVyIHNob3VsZAorICogY29tcGxldGUuCisgKiBDb250ZXh0OiAhaW5faW50ZXJydXB0ICgpCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGVuYWJsZSBkYXRhIHRyYW5zZmVycyBvbiBpbnRlcmZhY2VzIHRoYXQgbWF5IG5vdAorICogYmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgTm90IGFsbCBkZXZpY2VzIHN1cHBvcnQgc3VjaCBjb25maWd1cmFiaWxpdHkuCisgKiBPbmx5IHRoZSBkcml2ZXIgYm91bmQgdG8gYW4gaW50ZXJmYWNlIG1heSBjaGFuZ2UgaXRzIHNldHRpbmcuCisgKgorICogV2l0aGluIGFueSBnaXZlbiBjb25maWd1cmF0aW9uLCBlYWNoIGludGVyZmFjZSBtYXkgaGF2ZSBzZXZlcmFsCisgKiBhbHRlcm5hdGl2ZSBzZXR0aW5ncy4gIFRoZXNlIGFyZSBvZnRlbiB1c2VkIHRvIGNvbnRyb2wgbGV2ZWxzIG9mCisgKiBiYW5kd2lkdGggY29uc3VtcHRpb24uICBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgYSBoaWdoCisgKiBzcGVlZCBpbnRlcnJ1cHQgZW5kcG9pbnQgbWF5IG5vdCBzZW5kIG1vcmUgdGhhbiA2NCBieXRlcyBwZXIgbWljcm9mcmFtZSwKKyAqIHdoaWxlIGludGVycnVwdCB0cmFuc2ZlcnMgb2YgdXAgdG8gM0tCeXRlcyBwZXIgbWljcm9mcmFtZSBhcmUgbGVnYWwuCisgKiBBbHNvLCBpc29jaHJvbm91cyBlbmRwb2ludHMgbWF5IG5ldmVyIGJlIHBhcnQgb2YgYW4KKyAqIGludGVyZmFjZSdzIGRlZmF1bHQgc2V0dGluZy4gIFRvIGFjY2VzcyBzdWNoIGJhbmR3aWR0aCwgYWx0ZXJuYXRlCisgKiBpbnRlcmZhY2Ugc2V0dGluZ3MgbXVzdCBiZSBtYWRlIGN1cnJlbnQuCisgKgorICogTm90ZSB0aGF0IGluIHRoZSBMaW51eCBVU0Igc3Vic3lzdGVtLCBiYW5kd2lkdGggYXNzb2NpYXRlZCB3aXRoCisgKiBhbiBlbmRwb2ludCBpbiBhIGdpdmVuIGFsdGVybmF0ZSBzZXR0aW5nIGlzIG5vdCByZXNlcnZlZCB1bnRpbCBhbiBVUkIKKyAqIGlzIHN1Ym1pdHRlZCB0aGF0IG5lZWRzIHRoYXQgYmFuZHdpZHRoLiAgU29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcworICogYWxsb2NhdGUgYmFuZHdpZHRoIGVhcmx5LCB3aGVuIGEgY29uZmlndXJhdGlvbiBpcyBjaG9zZW4uCisgKgorICogVGhpcyBjYWxsIGlzIHN5bmNocm9ub3VzLCBhbmQgbWF5IG5vdCBiZSB1c2VkIGluIGFuIGludGVycnVwdCBjb250ZXh0LgorICogQWxzbywgZHJpdmVycyBtdXN0IG5vdCBjaGFuZ2UgYWx0c2V0dGluZ3Mgd2hpbGUgdXJicyBhcmUgc2NoZWR1bGVkIGZvcgorICogZW5kcG9pbnRzIGluIHRoYXQgaW50ZXJmYWNlOyBhbGwgc3VjaCB1cmJzIG11c3QgZmlyc3QgYmUgY29tcGxldGVkCisgKiAocGVyaGFwcyBmb3JjZWQgYnkgdW5saW5raW5nKS4KKyAqCisgKiBSZXR1cm46IFplcm8gb24gc3VjY2Vzcywgb3IgZWxzZSB0aGUgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlCisgKiB1bmRlcmx5aW5nIHVzYl9jb250cm9sX21zZygpIGNhbGwuCisgKi8KK2ludCB1c2Jfc2V0X2ludGVyZmFjZV90aW1lb3V0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpbnRlcmZhY2UsCisJaW50IGFsdGVybmF0ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQ7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGJ1c190b19oY2QoZGV2LT5idXMpOworCWludCBpLCByZXQsIG1hbnVhbCA9IDA7CisJdW5zaWduZWQgaW50IGVwYWRkcjsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKworCWlmIChkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCXJldHVybiAtRUhPU1RVTlJFQUNIOworCisJaWZhY2UgPSB1c2JfaWZudW1fdG9faWYoZGV2LCBpbnRlcmZhY2UpOworCWlmICghaWZhY2UpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICJzZWxlY3RpbmcgaW52YWxpZCBpbnRlcmZhY2UgJWRcbiIsCisJCQlpbnRlcmZhY2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGlmYWNlLT51bnJlZ2lzdGVyaW5nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpZmFjZSwgYWx0ZXJuYXRlKTsKKwlpZiAoIWFsdCkgeworCQlkZXZfd2FybigmZGV2LT5kZXYsICJzZWxlY3RpbmcgaW52YWxpZCBhbHRzZXR0aW5nICVkXG4iLAorCQkJIGFsdGVybmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBiYW5kd2lkdGggZm9yIHRoaXMgYWx0ZXJuYXRlIGludGVyZmFjZS4KKwkgKiBSZW1vdmUgdGhlIGN1cnJlbnQgYWx0IHNldHRpbmcgYW5kIGFkZCB0aGUgbmV3IGFsdCBzZXR0aW5nLgorCSAqLworCW11dGV4X2xvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCS8qIERpc2FibGUgTFBNLCBhbmQgcmUtZW5hYmxlIGl0IG9uY2UgdGhlIG5ldyBhbHQgc2V0dGluZyBpcyBpbnN0YWxsZWQsCisJICogc28gdGhhdCB0aGUgeEhDSSBkcml2ZXIgY2FuIHJlY2FsY3VsYXRlIHRoZSBVMS9VMiB0aW1lb3V0cy4KKwkgKi8KKwlpZiAodXNiX2Rpc2FibGVfbHBtKGRldikpIHsKKwkJZGV2X2VycigmaWZhY2UtPmRldiwgIiVzIEZhaWxlZCB0byBkaXNhYmxlIExQTVxuLiIsIF9fZnVuY19fKTsKKwkJbXV0ZXhfdW5sb2NrKGhjZC0+YmFuZHdpZHRoX211dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIENoYW5naW5nIGFsdC1zZXR0aW5nIGFsc28gZnJlZXMgYW55IGFsbG9jYXRlZCBzdHJlYW1zICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspCisJCWlmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV0uc3RyZWFtcyA9IDA7CisKKwlyZXQgPSB1c2JfaGNkX2FsbG9jX2JhbmR3aWR0aChkZXYsIE5VTEwsIGlmYWNlLT5jdXJfYWx0c2V0dGluZywgYWx0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJOb3QgZW5vdWdoIGJhbmR3aWR0aCBmb3IgYWx0c2V0dGluZyAlZFxuIiwKKwkJCQlhbHRlcm5hdGUpOworCQl1c2JfZW5hYmxlX2xwbShkZXYpOworCQltdXRleF91bmxvY2soaGNkLT5iYW5kd2lkdGhfbXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkZXYtPnF1aXJrcyAmIFVTQl9RVUlSS19OT19TRVRfSU5URikKKwkJcmV0ID0gLUVQSVBFOworCWVsc2UKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkJICAgVVNCX1JFUV9TRVRfSU5URVJGQUNFLCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSAgIGFsdGVybmF0ZSwgaW50ZXJmYWNlLCBOVUxMLCAwLCB0aW1lb3V0X21zKTsKKworCS8qIDkuNC4xMCBzYXlzIGRldmljZXMgZG9uJ3QgbmVlZCB0aGlzIGFuZCBhcmUgZnJlZSB0byBTVEFMTCB0aGUKKwkgKiByZXF1ZXN0IGlmIHRoZSBpbnRlcmZhY2Ugb25seSBoYXMgb25lIGFsdGVybmF0ZSBzZXR0aW5nLgorCSAqLworCWlmIChyZXQgPT0gLUVQSVBFICYmIGlmYWNlLT5udW1fYWx0c2V0dGluZyA9PSAxKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LAorCQkJIm1hbnVhbCBzZXRfaW50ZXJmYWNlIGZvciBpZmFjZSAlZCwgYWx0ICVkXG4iLAorCQkJaW50ZXJmYWNlLCBhbHRlcm5hdGUpOworCQltYW51YWwgPSAxOworCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQkvKiBSZS1pbnN0YXRlIHRoZSBvbGQgYWx0IHNldHRpbmcgKi8KKwkJdXNiX2hjZF9hbGxvY19iYW5kd2lkdGgoZGV2LCBOVUxMLCBhbHQsIGlmYWNlLT5jdXJfYWx0c2V0dGluZyk7CisJCXVzYl9lbmFibGVfbHBtKGRldik7CisJCW11dGV4X3VubG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCW11dGV4X3VubG9jayhoY2QtPmJhbmR3aWR0aF9tdXRleCk7CisKKwkvKiBGSVhNRSBkcml2ZXJzIHNob3VsZG4ndCBuZWVkIHRvIHJlcGxpY2F0ZS9idWdmaXggdGhlIGxvZ2ljIGhlcmUKKwkgKiB3aGVuIHRoZXkgaW1wbGVtZW50IGFzeW5jIG9yIGVhc2lseS1raWxsYWJsZSB2ZXJzaW9ucyBvZiB0aGlzIG9yCisJICogb3RoZXIgInNob3VsZC1iZS1pbnRlcm5hbCIgZnVuY3Rpb25zIChsaWtlIGNsZWFyX2hhbHQpLgorCSAqIHNob3VsZCBoY2QrdXNiY29yZSBwb3N0cHJvY2VzcyBjb250cm9sIHJlcXVlc3RzPworCSAqLworCisJLyogcHJldmVudCBzdWJtaXNzaW9ucyB1c2luZyBwcmV2aW91cyBlbmRwb2ludCBzZXR0aW5ncyAqLworCWlmIChpZmFjZS0+Y3VyX2FsdHNldHRpbmcgIT0gYWx0KSB7CisJCXJlbW92ZV9pbnRmX2VwX2RldnMoaWZhY2UpOworCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaWZhY2UpOworCX0KKwl1c2JfZGlzYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSwgdHJ1ZSk7CisKKwlpZmFjZS0+Y3VyX2FsdHNldHRpbmcgPSBhbHQ7CisKKwkvKiBOb3cgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIGluc3RhbGxlZCwgcmUtZW5hYmxlIExQTS4gKi8KKwl1c2JfdW5sb2NrZWRfZW5hYmxlX2xwbShkZXYpOworCisJLyogSWYgdGhlIGludGVyZmFjZSBvbmx5IGhhcyBvbmUgYWx0c2V0dGluZyBhbmQgdGhlIGRldmljZSBkaWRuJ3QKKwkgKiBhY2NlcHQgdGhlIHJlcXVlc3QsIHdlIGF0dGVtcHQgdG8gY2Fycnkgb3V0IHRoZSBlcXVpdmFsZW50IGFjdGlvbgorCSAqIGJ5IG1hbnVhbGx5IGNsZWFyaW5nIHRoZSBIQUxUIGZlYXR1cmUgZm9yIGVhY2ggZW5kcG9pbnQgaW4gdGhlCisJICogbmV3IGFsdHNldHRpbmcuCisJICovCisJaWYgKG1hbnVhbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgeworCQkJZXBhZGRyID0gYWx0LT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwaXBlID0gX19jcmVhdGVfcGlwZShkZXYsCisJCQkJCVVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyAmIGVwYWRkcikgfAorCQkJCQkodXNiX2VuZHBvaW50X291dChlcGFkZHIpID8KKwkJCQkJVVNCX0RJUl9PVVQgOiBVU0JfRElSX0lOKTsKKworCQkJdXNiX2NsZWFyX2hhbHQoZGV2LCBwaXBlKTsKKwkJfQorCX0KKworCS8qIDkuMS4xLjU6IHJlc2V0IHRvZ2dsZXMgZm9yIGFsbCBlbmRwb2ludHMgaW4gdGhlIG5ldyBhbHRzZXR0aW5nCisJICoKKwkgKiBOb3RlOgorCSAqIERlc3BpdGUgRVAwIGlzIGFsd2F5cyBwcmVzZW50IGluIGFsbCBpbnRlcmZhY2VzL0FTLCB0aGUgbGlzdCBvZgorCSAqIGVuZHBvaW50cyBmcm9tIHRoZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gRVAwLiBEdWUgdG8gaXRzCisJICogb21uaXByZXNlbmNlIG9uZSBtaWdodCBleHBlY3QgRVAwIGJlaW5nIGNvbnNpZGVyZWQgImFmZmVjdGVkIiBieQorCSAqIGFueSBTZXRJbnRlcmZhY2UgcmVxdWVzdCBhbmQgaGVuY2UgYXNzdW1lIHRvZ2dsZXMgbmVlZCB0byBiZSByZXNldC4KKwkgKiBIb3dldmVyLCBFUDAgdG9nZ2xlcyBhcmUgcmUtc3luY2VkIGZvciBldmVyeSBpbmRpdmlkdWFsIHRyYW5zZmVyCisJICogZHVyaW5nIHRoZSBTRVRVUCBzdGFnZSAtIGhlbmNlIEVQMCB0b2dnbGVzIGFyZSAiZG9uJ3QgY2FyZSIgaGVyZS4KKwkgKiAoTGlrZXdpc2UsIEVQMCBuZXZlciAiaGFsdHMiIG9uIHdlbGwgZGVzaWduZWQgZGV2aWNlcy4pCisJICovCisJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSwgdHJ1ZSk7CisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpZmFjZS0+ZGV2KSkgeworCQl1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoaWZhY2UpOworCQljcmVhdGVfaW50Zl9lcF9kZXZzKGlmYWNlKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHVzYl9zZXRfaW50ZXJmYWNlX3RpbWVvdXQpOworCisvKioKICAqIHVzYl9yZXNldF9jb25maWd1cmF0aW9uIC0gbGlnaHR3ZWlnaHQgZGV2aWNlIHJlc2V0CiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgcmVzZXQKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jIGIvZHJpdmVycy91c2IvY29yZS9xdWlya3MuYwppbmRleCAzMTE2ZWRmLi44MjgwNmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvcXVpcmtzLmMKQEAgLTU3LDggKzU3LDkgQEAKIAkvKiBNaWNyb3NvZnQgTGlmZUNhbS1WWDcwMCB2Mi4wICovCiAJeyBVU0JfREVWSUNFKDB4MDQ1ZSwgMHgwNzcwKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX1JFU0VUX1JFU1VNRSB9LAogCi0JLyogTG9naXRlY2ggSEQgUHJvIFdlYmNhbXMgQzkyMCBhbmQgQzkzMGUgKi8KKwkvKiBMb2dpdGVjaCBIRCBQcm8gV2ViY2FtcyBDOTIwLCBDOTIwLUMgYW5kIEM5MzBlICovCiAJeyBVU0JfREVWSUNFKDB4MDQ2ZCwgMHgwODJkKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX0RFTEFZX0lOSVQgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNDZkLCAweDA4NDEpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfREVMQVlfSU5JVCB9LAogCXsgVVNCX0RFVklDRSgweDA0NmQsIDB4MDg0MyksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19ERUxBWV9JTklUIH0sCiAKIAkvKiBMb2dpdGVjaCBDb25mZXJlbmNlQ2FtIENDMzAwMGUgKi8KQEAgLTE1MCw2ICsxNTEsOSBAQAogCS8qIGFwcGxldG91Y2ggKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNWFjLCAweDAyMWEpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfUkVTRVRfUkVTVU1FIH0sCiAKKwkvKiBHZW5lc3lzIExvZ2ljIGh1YiwgaW50ZXJuYWxseSB1c2VkIGJ5IE1vc2hpIFVTQiB0byBFdGhlcm5ldCBBZGFwdGVyICovCisJeyBVU0JfREVWSUNFKDB4MDVlMywgMHgwNjE2KSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0xQTSB9LAorCiAJLyogQXZpc2lvbiBBVjYwMFUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNjM4LCAweDBhMTMpLCAuZHJpdmVyX2luZm8gPQogCSAgVVNCX1FVSVJLX1NUUklOR19GRVRDSF8yNTUgfSwKQEAgLTIxNCw2ICsyMTgsOSBAQAogCXsgVVNCX0RFVklDRSgweDFhMGEsIDB4MDIwMCksIC5kcml2ZXJfaW5mbyA9CiAJCQlVU0JfUVVJUktfTElORUFSX1VGUkFNRV9JTlRSX0JJTlRFUlZBTCB9LAogCisJLyogQ29yc2FpciBTdHJhZmUgUkdCICovCisJeyBVU0JfREVWSUNFKDB4MWIxYywgMHgxYjIwKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX0RFTEFZX0lOSVQgfSwKKwogCS8qIEFjZXIgQzEyMCBMRUQgUHJvamVjdG9yICovCiAJeyBVU0JfREVWSUNFKDB4MWRlMSwgMHhjMTAyKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX05PX0xQTSB9LAogCkBAIC0yNDksNiArMjU2LDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwOTNhLCAweDI1MDApLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfUkVTRVRfUkVTVU1FIH0sCiAJeyBVU0JfREVWSUNFKDB4MDkzYSwgMHgyNTEwKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX1JFU0VUX1JFU1VNRSB9LAogCXsgVVNCX0RFVklDRSgweDA5M2EsIDB4MjUyMSksIC5kcml2ZXJfaW5mbyA9IFVTQl9RVUlSS19SRVNFVF9SRVNVTUUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwM2YwLCAweDJiNGEpLCAuZHJpdmVyX2luZm8gPSBVU0JfUVVJUktfUkVTRVRfUkVTVU1FIH0sCiAKIAkvKiBMb2dpdGVjaCBPcHRpY2FsIE1vdXNlIE05MC9NMTAwICovCiAJeyBVU0JfREVWSUNFKDB4MDQ2ZCwgMHhjMDVhKSwgLmRyaXZlcl9pbmZvID0gVVNCX1FVSVJLX1JFU0VUX1JFU1VNRSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2ItYWNwaS5jIGIvZHJpdmVycy91c2IvY29yZS91c2ItYWNwaS5jCmluZGV4IDI3NzZjZmUuLmVmOWNmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLWFjcGkuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi1hY3BpLmMKQEAgLTEyNyw2ICsxMjcsMjIgQEAKICAqLwogI2RlZmluZSBVU0JfQUNQSV9MT0NBVElPTl9WQUxJRCAoMSA8PCAzMSkKIAorc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqdXNiX2FjcGlfZmluZF9wb3J0KHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LAorCQkJCQkgICAgICBpbnQgcmF3KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKKworCWlmICghcGFyZW50KQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRldiwgJnBhcmVudC0+Y2hpbGRyZW4sIG5vZGUpIHsKKwkJaWYgKGFjcGlfZGV2aWNlX2FkcihhZGV2KSA9PSByYXcpCisJCQlyZXR1cm4gYWRldjsKKwl9CisKKwlyZXR1cm4gYWNwaV9maW5kX2NoaWxkX2RldmljZShwYXJlbnQsIHJhdywgZmFsc2UpOworfQorCiBzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICp1c2JfYWNwaV9maW5kX2NvbXBhbmlvbihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CkBAIC0xNzQsOCArMTkwLDEwIEBACiAJCQlpbnQgcmF3OwogCiAJCQlyYXcgPSB1c2JfaGNkX2ZpbmRfcmF3X3BvcnRfbnVtYmVyKGhjZCwgcG9ydDEpOwotCQkJYWRldiA9IGFjcGlfZmluZF9jaGlsZF9kZXZpY2UoQUNQSV9DT01QQU5JT04oJnVkZXYtPmRldiksCi0JCQkJCXJhdywgZmFsc2UpOworCisJCQlhZGV2ID0gdXNiX2FjcGlfZmluZF9wb3J0KEFDUElfQ09NUEFOSU9OKCZ1ZGV2LT5kZXYpLAorCQkJCQkJICByYXcpOworCiAJCQlpZiAoIWFkZXYpCiAJCQkJcmV0dXJuIE5VTEw7CiAJCX0gZWxzZSB7CkBAIC0xODYsNyArMjA0LDkgQEAKIAkJCQlyZXR1cm4gTlVMTDsKIAogCQkJYWNwaV9idXNfZ2V0X2RldmljZShwYXJlbnRfaGFuZGxlLCAmYWRldik7Ci0JCQlhZGV2ID0gYWNwaV9maW5kX2NoaWxkX2RldmljZShhZGV2LCBwb3J0MSwgZmFsc2UpOworCisJCQlhZGV2ID0gdXNiX2FjcGlfZmluZF9wb3J0KGFkZXYsIHBvcnQxKTsKKwogCQkJaWYgKCFhZGV2KQogCQkJCXJldHVybiBOVUxMOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCA5MmU1ZDEzLi5kNzQ1NzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTcwNCwzNiArNzA0LDM1IEBACiB9CiBFWFBPUlRfU1lNQk9MKHVzYl9zZWNfZXZlbnRfcmluZ19jbGVhbnVwKTsKIAotZG1hX2FkZHJfdAotdXNiX2dldF9zZWNfZXZlbnRfcmluZ19kbWFfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCXVuc2lnbmVkIGludCBpbnRyX251bSkKK3BoeXNfYWRkcl90Cit1c2JfZ2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCXVuc2lnbmVkIGludCBpbnRyX251bSwgZG1hX2FkZHJfdCAqZG1hKQogewogCWlmIChkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gdXNiX2hjZF9nZXRfc2VjX2V2ZW50X3JpbmdfZG1hX2FkZHIoZGV2LCBpbnRyX251bSk7CisJcmV0dXJuIHVzYl9oY2RfZ2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcihkZXYsIGludHJfbnVtLCBkbWEpOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X3NlY19ldmVudF9yaW5nX2RtYV9hZGRyKTsKK0VYUE9SVF9TWU1CT0wodXNiX2dldF9zZWNfZXZlbnRfcmluZ19waHlzX2FkZHIpOwogCi1kbWFfYWRkcl90Ci11c2JfZ2V0X2RjYmFfZG1hX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3BoeXNfYWRkcl90IHVzYl9nZXRfeGZlcl9yaW5nX3BoeXNfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAlpZiAoZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHVzYl9oY2RfZ2V0X2RjYmFfZG1hX2FkZHIoZGV2KTsKKwlyZXR1cm4gdXNiX2hjZF9nZXRfeGZlcl9yaW5nX3BoeXNfYWRkcihkZXYsIGVwLCBkbWEpOwogfQotRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X2RjYmFfZG1hX2FkZHIpOworRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X3hmZXJfcmluZ19waHlzX2FkZHIpOwogCi1kbWFfYWRkcl90IHVzYl9nZXRfeGZlcl9yaW5nX2RtYV9hZGRyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCi0Jc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKK2ludCB1c2JfZ2V0X2NvbnRyb2xsZXJfaWQoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKIHsKIAlpZiAoZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiB1c2JfaGNkX2dldF94ZmVyX3JpbmdfZG1hX2FkZHIoZGV2LCBlcCk7CisJcmV0dXJuIHVzYl9oY2RfZ2V0X2NvbnRyb2xsZXJfaWQoZGV2KTsKIH0KLUVYUE9SVF9TWU1CT0wodXNiX2dldF94ZmVyX3JpbmdfZG1hX2FkZHIpOworRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X2NvbnRyb2xsZXJfaWQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1tc20uYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1tc20uYwppbmRleCBhY2E1ZDk3Li5kMzE2ODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtbXNtLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW1zbS5jCkBAIC0yODU3LDggKzI4NTcsNyBAQAogfQogCiAvKgotICogSGFuZGxlIEVVRCBiYXNlZCBzb2Z0IGRldGFjaC9hdHRhY2ggZXZlbnQsIGFuZCBmb3JjZSBVU0IgaGlnaCBzcGVlZCBtb2RlCi0gKiBmdW5jdGlvbmFsaXR5IG9uIHJlY2VpdmluZyBzb2Z0IGF0dGFjaCBldmVudC4KKyAqIEhhbmRsZSBFVUQgYmFzZWQgc29mdCBkZXRhY2gvYXR0YWNoIGV2ZW50CiAgKgogICogQG5iIC0gbm90aWZpZXIgaGFuZGxlcgogICogQGV2ZW50IC0gZXZlbnQgaW5mb3JtYXRpb24gaS5lLiBzb2Z0IGRldGFjaC9hdHRhY2ggZXZlbnQKQEAgLTI4NzcsOSArMjg3Niw2IEBACiAJaWYgKG1kd2MtPnZidXNfYWN0aXZlID09IGV2ZW50KQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQkvKiBGb3JjZSBVU0IgSGlnaC1TcGVlZCBlbnVtZXJhdGlvbiBPbmx5ICovCi0JZHdjLT5tYXhpbXVtX3NwZWVkID0gVVNCX1NQRUVEX0hJR0g7Ci0JZGJnX2V2ZW50KDB4RkYsICJTcGVlZCIsIGR3Yy0+bWF4aW11bV9zcGVlZCk7CiAJbWR3Yy0+dmJ1c19hY3RpdmUgPSBldmVudDsKIAlpZiAoZHdjLT5pc19kcmQgJiYgIW1kd2MtPmluX3Jlc3RhcnQpCiAJCXF1ZXVlX3dvcmsobWR3Yy0+ZHdjM193cSwgJm1kd2MtPnJlc3VtZV93b3JrKTsKQEAgLTM5NzEsNyArMzk2Nyw3IEBACiAJfQogCiAJcmV0ID0gcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShtZHdjLT51c2JfcHN5LAotCQkJCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYLCAmcHZhbCk7CisJCQkJUE9XRVJfU1VQUExZX1BST1BfU0RQX0NVUlJFTlRfTUFYLCAmcHZhbCk7CiAJaWYgKHJldCkgewogCQlkZXZfZGJnKG1kd2MtPmRldiwgInBvd2VyIHN1cHBseSBlcnJvciB3aGVuIHNldHRpbmcgcHJvcGVydHlcbiIpOwogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMKaW5kZXggNWRkMTgzMi4uMzViNjM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZHdjMy1vbWFwLmg+CkBAIC01MTEsNyArNTEyLDcgQEAKIAogCS8qIGNoZWNrIHRoZSBETUEgU3RhdHVzICovCiAJcmVnID0gZHdjM19vbWFwX3JlYWRsKG9tYXAtPmJhc2UsIFVTQk9UR1NTX1NZU0NPTkZJRyk7Ci0KKwlpcnFfc2V0X3N0YXR1c19mbGFncyhvbWFwLT5pcnEsIElSUV9OT0FVVE9FTik7CiAJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIG9tYXAtPmlycSwgZHdjM19vbWFwX2ludGVycnVwdCwKIAkJCQkJZHdjM19vbWFwX2ludGVycnVwdF90aHJlYWQsIElSUUZfU0hBUkVELAogCQkJCQkiZHdjMy1vbWFwIiwgb21hcCk7CkBAIC01MzIsNyArNTMzLDcgQEAKIAl9CiAKIAlkd2MzX29tYXBfZW5hYmxlX2lycXMob21hcCk7Ci0KKwllbmFibGVfaXJxKG9tYXAtPmlycSk7CiAJcmV0dXJuIDA7CiAKIGVycjI6CkBAIC01NTMsNiArNTU0LDcgQEAKIAlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihvbWFwLT5lZGV2LCBFWFRDT05fVVNCLCAmb21hcC0+dmJ1c19uYik7CiAJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIob21hcC0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCAmb21hcC0+aWRfbmIpOwogCWR3YzNfb21hcF9kaXNhYmxlX2lycXMob21hcCk7CisJZGlzYWJsZV9pcnEob21hcC0+aXJxKTsKIAlvZl9wbGF0Zm9ybV9kZXBvcHVsYXRlKG9tYXAtPmRldik7CiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYwppbmRleCBlZGQwMDBiLi45ZDI0N2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKQEAgLTI3OSw3ICsyNzksNyBAQAogCQlkd2MtPmVwMF9ib3VuY2VkID0gZmFsc2U7CiAJCXVubWFwX2FmdGVyX2NvbXBsZXRlID0gdHJ1ZTsKIAl9IGVsc2UgewotCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJmR3Yy0+Z2FkZ2V0LAorCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3RfYnlfZGV2KGR3Yy0+c3lzZGV2LAogCQkJCSZyZXEtPnJlcXVlc3QsIHJlcS0+ZGlyZWN0aW9uKTsKIAl9CiAKQEAgLTI5MCw3ICsyOTAsNyBAQAogCXNwaW5fbG9jaygmZHdjLT5sb2NrKTsKIAogCWlmICh1bm1hcF9hZnRlcl9jb21wbGV0ZSkKLQkJdXNiX2dhZGdldF91bm1hcF9yZXF1ZXN0KCZkd2MtPmdhZGdldCwKKwkJdXNiX2dhZGdldF91bm1hcF9yZXF1ZXN0X2J5X2Rldihkd2MtPnN5c2RldiwKIAkJCQkmcmVxLT5yZXF1ZXN0LCByZXEtPmRpcmVjdGlvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwppbmRleCA4YTZhZTBiLi4wMmFkYzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCkBAIC0yMTU1LDcgKzIxNTUsNyBAQAogCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQgPSBkZXZfdG9fdXNiX2dhZGdldChkZXYpOwogCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNkZXYtPnN1c3BlbmRlZCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNkZXYtPnN1c3BlbmRlZCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFJfUk8oc3VzcGVuZGVkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnZnMuYwppbmRleCBmOTEwOTkwLi5kNmU3N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnZnMuYwpAQCAtMTUzMyw2ICsxNTMzLDE4IEBACiAKIAlnaSA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgZ2FkZ2V0X2luZm8sIGNkZXYpOwogCisJLyogRklYTUU6IFRoZXJlJ3MgYSByYWNlIGJldHdlZW4gdXNiX2dhZGdldF91ZGNfc3RvcCgpIHdoaWNoIGlzIGxpa2VseQorCSAqIHRvIHNldCB0aGUgZ2FkZ2V0IGRyaXZlciB0byBOVUxMIGluIHRoZSB1ZGMgZHJpdmVyIGFuZCB0aGlzIGRyaXZlcnMKKwkgKiBnYWRnZXQgZGlzY29ubmVjdCBmbiB3aGljaCBsaWtlbHkgY2hlY2tzIGZvciB0aGUgZ2FkZ2V0IGRyaXZlciB0bworCSAqIGJlIGEgbnVsbCBwdHIuIEl0IGhhcHBlbnMgdGhhdCB1bmJpbmQgKGRvaW5nIHNldF9nYWRnZXRfZGF0YShOVUxMKSkKKwkgKiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBnYWRnZXQgZHJpdmVyIGlzIHNldCB0byBOVUxMIGFuZCB0aGUgdWRjIGRyaXZlcgorCSAqIGNhbGxzIGRpc2Nvbm5lY3QgZm4gd2hpY2ggcmVzdWx0cyBpbiBjZGV2IGJlaW5nIGEgbnVsbCBwdHIuCisJICovCisJaWYgKGNkZXYgPT0gTlVMTCkgeworCQlXQVJOKDEsICIlczogZ2FkZ2V0IGRyaXZlciBhbHJlYWR5IGRpc2Nvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCiAJLyogYWNjZXNzb3J5IEhJRCBzdXBwb3J0IGNhbiBiZSBhY3RpdmUgd2hpbGUgdGhlCiAJCWFjY2Vzc29yeSBmdW5jdGlvbiBpcyBub3QgYWN0dWFsbHkgZW5hYmxlZCwKIAkJc28gd2UgbmVlZCB0byBpbmZvcm0gaXQgd2hlbiB3ZSBhcmUgZGlzY29ubmVjdGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfYWNjZXNzb3J5LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9hY2Nlc3NvcnkuYwppbmRleCBhN2NiNTg2Li45MjQwOTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9hY2Nlc3NvcnkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9hY2Nlc3NvcnkuYwpAQCAtODY0LDYgKzg2NCwxNCBAQAogCS5wcm9iZSA9IGFjY19oaWRfcHJvYmUsCiB9OwogCitzdGF0aWMgdm9pZCBhY2NfY29tcGxldGVfc2V0dXBfbm9vcChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJLyoKKwkgKiBEZWZhdWx0IG5vLW9wIGZ1bmN0aW9uIHdoZW4gbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGZvciB0aGUKKwkgKiBzZXR1cCByZXF1ZXN0CisJICovCit9CisKIGludCBhY2NfY3RybHJlcXVlc3Qoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LAogCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCiB7CkBAIC04OTEsNiArODk5LDcgQEAKIAkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygKIAkJCQkmZGV2LT5zdGFydF93b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAJCQl2YWx1ZSA9IDA7CisJCQljZGV2LT5yZXEtPmNvbXBsZXRlID0gYWNjX2NvbXBsZXRlX3NldHVwX25vb3A7CiAJCX0gZWxzZSBpZiAoYl9yZXF1ZXN0ID09IEFDQ0VTU09SWV9TRU5EX1NUUklORykgewogCQkJZGV2LT5zdHJpbmdfaW5kZXggPSB3X2luZGV4OwogCQkJY2Rldi0+Z2FkZ2V0LT5lcDAtPmRyaXZlcl9kYXRhID0gZGV2OwpAQCAtODk5LDEwICs5MDgsMTMgQEAKIAkJfSBlbHNlIGlmIChiX3JlcXVlc3QgPT0gQUNDRVNTT1JZX1NFVF9BVURJT19NT0RFICYmCiAJCQkJd19pbmRleCA9PSAwICYmIHdfbGVuZ3RoID09IDApIHsKIAkJCWRldi0+YXVkaW9fbW9kZSA9IHdfdmFsdWU7CisJCQljZGV2LT5yZXEtPmNvbXBsZXRlID0gYWNjX2NvbXBsZXRlX3NldHVwX25vb3A7CiAJCQl2YWx1ZSA9IDA7CiAJCX0gZWxzZSBpZiAoYl9yZXF1ZXN0ID09IEFDQ0VTU09SWV9SRUdJU1RFUl9ISUQpIHsKKwkJCWNkZXYtPnJlcS0+Y29tcGxldGUgPSBhY2NfY29tcGxldGVfc2V0dXBfbm9vcDsKIAkJCXZhbHVlID0gYWNjX3JlZ2lzdGVyX2hpZChkZXYsIHdfdmFsdWUsIHdfaW5kZXgpOwogCQl9IGVsc2UgaWYgKGJfcmVxdWVzdCA9PSBBQ0NFU1NPUllfVU5SRUdJU1RFUl9ISUQpIHsKKwkJCWNkZXYtPnJlcS0+Y29tcGxldGUgPSBhY2NfY29tcGxldGVfc2V0dXBfbm9vcDsKIAkJCXZhbHVlID0gYWNjX3VucmVnaXN0ZXJfaGlkKGRldiwgd192YWx1ZSk7CiAJCX0gZWxzZSBpZiAoYl9yZXF1ZXN0ID09IEFDQ0VTU09SWV9TRVRfSElEX1JFUE9SVF9ERVNDKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CkBAIC05MzcsNyArOTQ5LDcgQEAKIAkJaWYgKGJfcmVxdWVzdCA9PSBBQ0NFU1NPUllfR0VUX1BST1RPQ09MKSB7CiAJCQkqKCh1MTYgKiljZGV2LT5yZXEtPmJ1ZikgPSBQUk9UT0NPTF9WRVJTSU9OOwogCQkJdmFsdWUgPSBzaXplb2YodTE2KTsKLQorCQkJY2Rldi0+cmVxLT5jb21wbGV0ZSA9IGFjY19jb21wbGV0ZV9zZXR1cF9ub29wOwogCQkJLyogY2xlYXIgYW55IHN0cmluZyBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIHNlc3Npb24gKi8KIAkJCW1lbXNldChkZXYtPm1hbnVmYWN0dXJlciwgMCwgc2l6ZW9mKGRldi0+bWFudWZhY3R1cmVyKSk7CiAJCQltZW1zZXQoZGV2LT5tb2RlbCwgMCwgc2l6ZW9mKGRldi0+bW9kZWwpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2NjaWQuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2NjaWQuaAppbmRleCA0MmE3ZWJiLi45MzUzMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9jY2lkLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfY2NpZC5oCkBAIC01NSwyOSArNTUsMjkgQEAKICNkZWZpbmUgQ0NJRF9SRUFEX0RUUgkJX0lPUignQycsIDMsIGludCkKIAogc3RydWN0IHVzYl9jY2lkX25vdGlmaWNhdGlvbiB7Ci0JdW5zaWduZWQgY2hhciBidWZbNF07CisJX191OCBidWZbNF07CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY2NpZF9idWxrX2luX2hlYWRlciB7Ci0JdW5zaWduZWQgY2hhciBiTWVzc2FnZVR5cGU7Ci0JdW5zaWduZWQgbG9uZyB3TGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgYlNsb3Q7Ci0JdW5zaWduZWQgY2hhciBiU2VxOwotCXVuc2lnbmVkIGNoYXIgYlN0YXR1czsKLQl1bnNpZ25lZCBjaGFyIGJFcnJvcjsKLQl1bnNpZ25lZCBjaGFyIGJTcGVjaWZpYzsKLQl1bnNpZ25lZCBjaGFyIGFiRGF0YVtBQkRBVEFfU0laRV07Ci0JdW5zaWduZWQgY2hhciBiU2l6ZVRvU2VuZDsKKwlfX3U4IGJNZXNzYWdlVHlwZTsKKwlfX3UzMiB3TGVuZ3RoOworCV9fdTggYlNsb3Q7CisJX191OCBiU2VxOworCV9fdTggYlN0YXR1czsKKwlfX3U4IGJFcnJvcjsKKwlfX3U4IGJTcGVjaWZpYzsKKwlfX3U4IGFiRGF0YVtBQkRBVEFfU0laRV07CisJX191OCBiU2l6ZVRvU2VuZDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBjY2lkX2J1bGtfb3V0X2hlYWRlciB7Ci0JdW5zaWduZWQgY2hhciBiTWVzc2FnZVR5cGU7Ci0JdW5zaWduZWQgbG9uZyB3TGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgYlNsb3Q7Ci0JdW5zaWduZWQgY2hhciBiU2VxOwotCXVuc2lnbmVkIGNoYXIgYlNwZWNpZmljXzA7Ci0JdW5zaWduZWQgY2hhciBiU3BlY2lmaWNfMTsKLQl1bnNpZ25lZCBjaGFyIGJTcGVjaWZpY18yOwotCXVuc2lnbmVkIGNoYXIgQVBEVVtBQkRBVEFfU0laRV07CisJX191OCBiTWVzc2FnZVR5cGU7CisJX191MzIgd0xlbmd0aDsKKwlfX3U4IGJTbG90OworCV9fdTggYlNlcTsKKwlfX3U4IGJTcGVjaWZpY18wOworCV9fdTggYlNwZWNpZmljXzE7CisJX191OCBiU3BlY2lmaWNfMjsKKwlfX3U4IEFQRFVbQUJEQVRBX1NJWkVdOwogfSBfX3BhY2tlZDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZGlhZy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZGlhZy5jCmluZGV4IGU5MDhlY2YuLmJlMjJkZTA0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZGlhZy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2RpYWcuYwpAQCAtMzg2LDkgKzM4NiwxMSBAQAogCWNoLT5wcml2ID0gcHJpdjsKIAljaC0+bm90aWZ5ID0gbm90aWZ5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNoX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZjaC0+bGlzdCwgJnVzYl9kaWFnX2NoX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWZvdW5kKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaF9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmNoLT5saXN0LCAmdXNiX2RpYWdfY2hfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoX2xvY2ssIGZsYWdzKTsKKwl9CiAKIAlyZXR1cm4gY2g7CiB9CkBAIC04NjMsNiArODY1LDcgQEAKIAlzdHJ1Y3QgZGlhZ19jb250ZXh0ICpkZXY7CiAJc3RydWN0IHVzYl9kaWFnX2NoICpfY2g7CiAJaW50IGZvdW5kID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTg3Miw5ICs4NzUsMTkgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQorCiAJaWYgKCFmb3VuZCkgewotCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZ2V0IGRpYWcgdXNiIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJCXByX3dhcm4oIiVzOiB1bmFibGUgdG8gZ2V0IGRpYWcgdXNiIGNoYW5uZWxcbiIsIF9fZnVuY19fKTsKKworCQlfY2ggPSBremFsbG9jKHNpemVvZigqX2NoKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChfY2ggPT0gTlVMTCkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCV9jaC0+bmFtZSA9IG5hbWU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoX2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmX2NoLT5saXN0LCAmdXNiX2RpYWdfY2hfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoX2xvY2ssIGZsYWdzKTsKIAl9CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9nc2kuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5jCmluZGV4IDRkZjJkYzYuLmMxMTYyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5jCkBAIC0xNCwyNiArMTQsNiBAQAogI2luY2x1ZGUgImZfZ3NpLmgiCiAjaW5jbHVkZSAicm5kaXMuaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCBnc2lfaW5fYWdncl9zaXplOwotbW9kdWxlX3BhcmFtKGdzaV9pbl9hZ2dyX3NpemUsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhnc2lfaW5fYWdncl9zaXplLAotCQkiQWdnciBzaXplIG9mIGJ1cyB0cmFuc2ZlciB0byBob3N0Iik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3NpX291dF9hZ2dyX3NpemU7Ci1tb2R1bGVfcGFyYW0oZ3NpX291dF9hZ2dyX3NpemUsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhnc2lfb3V0X2FnZ3Jfc2l6ZSwKLQkJIkFnZ3Igc2l6ZSBvZiBidXMgdHJhbnNmZXIgdG8gZGV2aWNlIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2luX2J1ZnMgPSBHU0lfTlVNX0lOX0JVRkZFUlM7Ci1tb2R1bGVfcGFyYW0obnVtX2luX2J1ZnMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhudW1faW5fYnVmcywKLQkJIk51bWJlciBvZiBJTiBidWZmZXJzIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX291dF9idWZzID0gR1NJX05VTV9PVVRfQlVGRkVSUzsKLW1vZHVsZV9wYXJhbShudW1fb3V0X2J1ZnMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhudW1fb3V0X2J1ZnMsCi0JCSJOdW1iZXIgb2YgT1VUIGJ1ZmZlcnMiKTsKLQogc3RhdGljIGJvb2wgcXRpX3BhY2tldF9kZWJ1ZzsKIG1vZHVsZV9wYXJhbShxdGlfcGFja2V0X2RlYnVnLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocXRpX3BhY2tldF9kZWJ1ZywgIlByaW50IFFUSSBQYWNrZXQncyBSYXcgRGF0YSIpOwpAQCAtMzg0LDE3ICszNjQsOSBAQAogCWNvbm5fcGFyYW1zLT5pcGFfdG9fdXNiX3hmZXJyc2NpZHhfdmFsaWQgPSB0cnVlOwogCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3QgPSBnc2ktPnByb3RfaWQ7CiAJY29ubl9wYXJhbXMtPnRldGhfcHJvdF9wYXJhbXMubWF4X3hmZXJfc2l6ZV9ieXRlc190b19kZXYgPSAyMzcwMDsKLQlpZiAoZ3NpX291dF9hZ2dyX3NpemUpCi0JCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3RfcGFyYW1zLm1heF94ZmVyX3NpemVfYnl0ZXNfdG9fZGV2Ci0JCQkJPSBnc2lfb3V0X2FnZ3Jfc2l6ZTsKLQllbHNlCi0JCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3RfcGFyYW1zLm1heF94ZmVyX3NpemVfYnl0ZXNfdG9fZGV2CisJY29ubl9wYXJhbXMtPnRldGhfcHJvdF9wYXJhbXMubWF4X3hmZXJfc2l6ZV9ieXRlc190b19kZXYKIAkJCQk9IGRfcG9ydC0+b3V0X2FnZ3Jfc2l6ZTsKLQlpZiAoZ3NpX2luX2FnZ3Jfc2l6ZSkKLQkJY29ubl9wYXJhbXMtPnRldGhfcHJvdF9wYXJhbXMubWF4X3hmZXJfc2l6ZV9ieXRlc190b19ob3N0Ci0JCQkJCT0gZ3NpX2luX2FnZ3Jfc2l6ZTsKLQllbHNlCi0JCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3RfcGFyYW1zLm1heF94ZmVyX3NpemVfYnl0ZXNfdG9faG9zdAorCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3RfcGFyYW1zLm1heF94ZmVyX3NpemVfYnl0ZXNfdG9faG9zdAogCQkJCQk9IGRfcG9ydC0+aW5fYWdncl9zaXplOwogCWNvbm5fcGFyYW1zLT50ZXRoX3Byb3RfcGFyYW1zLm1heF9wYWNrZXRfbnVtYmVyX3RvX2RldiA9CiAJCURFRkFVTFRfTUFYX1BLVF9QRVJfWEZFUjsKQEAgLTE1OTMsMTIgKzE1NjUsMjIgQEAKIAkJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGZfZ3NpICpnc2kgPSByZXEtPmNvbnRleHQ7CisJcm5kaXNfaW5pdF9tc2dfdHlwZSAqYnVmOwogCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBybmRpc19tc2dfcGFyc2VyKGdzaS0+cGFyYW1zLCAodTggKikgcmVxLT5idWYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlsb2dfZXZlbnRfZXJyKCJSTkRJUyBjb21tYW5kIGVycm9yICVkLCAlZC8lZCIsCiAJCQlzdGF0dXMsIHJlcS0+YWN0dWFsLCByZXEtPmxlbmd0aCk7CisKKwlidWYgPSAocm5kaXNfaW5pdF9tc2dfdHlwZSAqKXJlcS0+YnVmOworCWlmIChidWYtPk1lc3NhZ2VUeXBlID09IFJORElTX01TR19JTklUKSB7CisJCWdzaS0+ZF9wb3J0LmluX2FnZ3Jfc2l6ZSA9IG1pbl90KHUzMiwgZ3NpLT5kX3BvcnQuaW5fYWdncl9zaXplLAorCQkJCQkJZ3NpLT5wYXJhbXMtPmRsX21heF94ZmVyX3NpemUpOworCQlsb2dfZXZlbnRfZGJnKCJSTkRJUyBob3N0IGRsX2FnZ3Jfc2l6ZTolZCBpbl9hZ2dyX3NpemU6JWRcbiIsCisJCQkJZ3NpLT5wYXJhbXMtPmRsX21heF94ZmVyX3NpemUsCisJCQkJZ3NpLT5kX3BvcnQuaW5fYWdncl9zaXplKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yNDc4LDEwICsyNDYwLDEwIEBACiAJCWluZm8ub3V0X2VwbmFtZSA9ICJnc2ktZXBvdXQiOwogCQlpbmZvLmluX3JlcV9idWZfbGVuID0gR1NJX0lOX0JVRkZfU0laRTsKIAkJZ3NpLT5kX3BvcnQuaW5fYWdncl9zaXplID0gR1NJX0lOX1JORElTX0FHR1JfU0laRTsKLQkJaW5mby5pbl9yZXFfbnVtX2J1ZiA9IG51bV9pbl9idWZzOworCQlpbmZvLmluX3JlcV9udW1fYnVmID0gR1NJX05VTV9JTl9CVUZGRVJTOwogCQlnc2ktPmRfcG9ydC5vdXRfYWdncl9zaXplID0gR1NJX09VVF9BR0dSX1NJWkU7CiAJCWluZm8ub3V0X3JlcV9idWZfbGVuID0gR1NJX09VVF9BR0dSX1NJWkU7Ci0JCWluZm8ub3V0X3JlcV9udW1fYnVmID0gbnVtX291dF9idWZzOworCQlpbmZvLm91dF9yZXFfbnVtX2J1ZiA9IEdTSV9OVU1fT1VUX0JVRkZFUlM7CiAJCWluZm8ubm90aWZ5X2J1Zl9sZW4gPSBzaXplb2Yoc3RydWN0IHVzYl9jZGNfbm90aWZpY2F0aW9uKTsKIAogCQlwYXJhbXMgPSBybmRpc19yZWdpc3Rlcihnc2lfcm5kaXNfcmVzcG9uc2VfYXZhaWxhYmxlLCBnc2ksCkBAIC0yNTQ2LDEwICsyNTI4LDEwIEBACiAJCWluZm8ub3V0X2VwbmFtZSA9ICJnc2ktZXBvdXQiOwogCQlnc2ktPmRfcG9ydC5pbl9hZ2dyX3NpemUgPSBHU0lfSU5fTUJJTV9BR0dSX1NJWkU7CiAJCWluZm8uaW5fcmVxX2J1Zl9sZW4gPSBHU0lfSU5fTUJJTV9BR0dSX1NJWkU7Ci0JCWluZm8uaW5fcmVxX251bV9idWYgPSBudW1faW5fYnVmczsKKwkJaW5mby5pbl9yZXFfbnVtX2J1ZiA9IEdTSV9OVU1fSU5fQlVGRkVSUzsKIAkJZ3NpLT5kX3BvcnQub3V0X2FnZ3Jfc2l6ZSA9IEdTSV9PVVRfQUdHUl9TSVpFOwogCQlpbmZvLm91dF9yZXFfYnVmX2xlbiA9IEdTSV9PVVRfTUJJTV9CVUZfTEVOOwotCQlpbmZvLm91dF9yZXFfbnVtX2J1ZiA9IG51bV9vdXRfYnVmczsKKwkJaW5mby5vdXRfcmVxX251bV9idWYgPSBHU0lfTlVNX09VVF9CVUZGRVJTOwogCQlpbmZvLm5vdGlmeV9idWZfbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbik7CiAJCW1iaW1fZ3NpX2Rlc2Mud01heFNlZ21lbnRTaXplID0gY3B1X3RvX2xlMTYoMHg4MDApOwogCkBAIC0yNTg3LDEwICsyNTY5LDEwIEBACiAJCWluZm8ub3V0X2VwbmFtZSA9ICJnc2ktZXBvdXQiOwogCQlnc2ktPmRfcG9ydC5pbl9hZ2dyX3NpemUgPSBHU0lfSU5fUk1ORVRfQUdHUl9TSVpFOwogCQlpbmZvLmluX3JlcV9idWZfbGVuID0gR1NJX0lOX0JVRkZfU0laRTsKLQkJaW5mby5pbl9yZXFfbnVtX2J1ZiA9IG51bV9pbl9idWZzOworCQlpbmZvLmluX3JlcV9udW1fYnVmID0gR1NJX05VTV9JTl9CVUZGRVJTOwogCQlnc2ktPmRfcG9ydC5vdXRfYWdncl9zaXplID0gR1NJX09VVF9BR0dSX1NJWkU7CiAJCWluZm8ub3V0X3JlcV9idWZfbGVuID0gR1NJX09VVF9STU5FVF9CVUZfTEVOOwotCQlpbmZvLm91dF9yZXFfbnVtX2J1ZiA9IG51bV9vdXRfYnVmczsKKwkJaW5mby5vdXRfcmVxX251bV9idWYgPSBHU0lfTlVNX09VVF9CVUZGRVJTOwogCQlpbmZvLm5vdGlmeV9idWZfbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbik7CiAJCWJyZWFrOwogCWNhc2UgSVBBX1VTQl9FQ006CkBAIC0yNjE5LDEwICsyNjAxLDEwIEBACiAJCWluZm8ub3V0X2VwbmFtZSA9ICJnc2ktZXBvdXQiOwogCQlnc2ktPmRfcG9ydC5pbl9hZ2dyX3NpemUgPSBHU0lfRUNNX0FHR1JfU0laRTsKIAkJaW5mby5pbl9yZXFfYnVmX2xlbiA9IEdTSV9JTl9CVUZGX1NJWkU7Ci0JCWluZm8uaW5fcmVxX251bV9idWYgPSBudW1faW5fYnVmczsKKwkJaW5mby5pbl9yZXFfbnVtX2J1ZiA9IEdTSV9OVU1fSU5fQlVGRkVSUzsKIAkJZ3NpLT5kX3BvcnQub3V0X2FnZ3Jfc2l6ZSA9IEdTSV9FQ01fQUdHUl9TSVpFOwogCQlpbmZvLm91dF9yZXFfYnVmX2xlbiA9IEdTSV9PVVRfRUNNX0JVRl9MRU47Ci0JCWluZm8ub3V0X3JlcV9udW1fYnVmID0gbnVtX291dF9idWZzOworCQlpbmZvLm91dF9yZXFfbnVtX2J1ZiA9IEdTSV9OVU1fT1VUX0JVRkZFUlM7CiAJCWluZm8ubm90aWZ5X2J1Zl9sZW4gPSBHU0lfQ1RSTF9OT1RJRllfQlVGRl9MRU47CiAKIAkJLyogZXhwb3J0IGhvc3QncyBFdGhlcm5ldCBhZGRyZXNzIGluIENEQyBmb3JtYXQgKi8KQEAgLTI2NDYsMTYgKzI2MjgsMTYgQEAKIAkJaW5mby5zdHJpbmdfZGVmcyA9IHFkc3NfZ3NpX3N0cmluZ19kZWZzOwogCQlpbmZvLmRhdGFfZGVzYyA9ICZxZHNzX2dzaV9kYXRhX2ludGZfZGVzYzsKIAkJaW5mby5kYXRhX3N0cl9pZHggPSAwOwotCQlpbmZvLmZzX2luX2Rlc2MgPSAmcWRzc19nc2lfaHNfZGF0YV9kZXNjOworCQlpbmZvLmZzX2luX2Rlc2MgPSAmcWRzc19nc2lfZnNfZGF0YV9kZXNjOwogCQlpbmZvLmhzX2luX2Rlc2MgPSAmcWRzc19nc2lfaHNfZGF0YV9kZXNjOwogCQlpbmZvLnNzX2luX2Rlc2MgPSAmcWRzc19nc2lfc3NfZGF0YV9kZXNjOwotCQlpbmZvLmZzX2Rlc2NfaGRyID0gcWRzc19nc2lfaHNfZGF0YV9vbmx5X2Rlc2M7CisJCWluZm8uZnNfZGVzY19oZHIgPSBxZHNzX2dzaV9mc19kYXRhX29ubHlfZGVzYzsKIAkJaW5mby5oc19kZXNjX2hkciA9IHFkc3NfZ3NpX2hzX2RhdGFfb25seV9kZXNjOwogCQlpbmZvLnNzX2Rlc2NfaGRyID0gcWRzc19nc2lfc3NfZGF0YV9vbmx5X2Rlc2M7CiAJCWluZm8uaW5fZXBuYW1lID0gImdzaS1lcGluIjsKIAkJaW5mby5vdXRfZXBuYW1lID0gIiI7CiAJCWluZm8uaW5fcmVxX2J1Zl9sZW4gPSAxNjM4NDsKLQkJaW5mby5pbl9yZXFfbnVtX2J1ZiA9IG51bV9pbl9idWZzOworCQlpbmZvLmluX3JlcV9udW1fYnVmID0gR1NJX05VTV9JTl9CVUZGRVJTOwogCQlpbmZvLm5vdGlmeV9idWZfbGVuID0gc2l6ZW9mKHN0cnVjdCB1c2JfY2RjX25vdGlmaWNhdGlvbik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9nc2kuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5oCmluZGV4IDBmZTM2NjUuLmQ2YmYwZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2dzaS5oCkBAIC0xMzQwLDYgKzEzNDAsMTQgQEAKIAkuYkludGVyZmFjZVByb3RvY29sID0JMHhmZiwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgcWRzc19nc2lfZnNfZGF0YV9kZXNjID0geworCS5iTGVuZ3RoICAgICAgICAgICAgICA9CSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlICAgICAgPQkgVVNCX0RUX0VORFBPSU5ULAorCS5iRW5kcG9pbnRBZGRyZXNzICAgICA9CSBVU0JfRElSX0lOLAorCS5ibUF0dHJpYnV0ZXMgICAgICAgICA9CSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSAgICAgICA9CSBjcHVfdG9fbGUxNig2NCksCit9OworCiBzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHFkc3NfZ3NpX2hzX2RhdGFfZGVzYyA9IHsKIAkuYkxlbmd0aCAgICAgICAgICAgICAgPQkgVVNCX0RUX0VORFBPSU5UX1NJWkUsCiAJLmJEZXNjcmlwdG9yVHlwZSAgICAgID0JIFVTQl9EVF9FTkRQT0lOVCwKQEAgLTEzNjQsNiArMTM3MiwxMiBAQAogCS53Qnl0ZXNQZXJJbnRlcnZhbCAgICA9CSAwLAogfTsKIAorc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKnFkc3NfZ3NpX2ZzX2RhdGFfb25seV9kZXNjW10gPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnFkc3NfZ3NpX2RhdGFfaW50Zl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZxZHNzX2dzaV9mc19kYXRhX2Rlc2MsCisJTlVMTCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpxZHNzX2dzaV9oc19kYXRhX29ubHlfZGVzY1tdID0gewogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZxZHNzX2dzaV9kYXRhX2ludGZfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmcWRzc19nc2lfaHNfZGF0YV9kZXNjLApAQCAtMTM3OSw3ICsxMzkzLDcgQEAKIAogLyogc3RyaW5nIGRlc2NyaXB0b3JzOiAqLwogc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIHFkc3NfZ3NpX3N0cmluZ19kZWZzW10gPSB7Ci0JWzBdLnMgPSAiUURTUyBEQVRBIiwKKwlbMF0ucyA9ICJEUEwgRGF0YSIsCiAJe30sIC8qIGVuZCBvZiBsaXN0ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9oaWQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCmluZGV4IGIwZjcxOTUuLmI2ZDRiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCkBAIC01ODIsNyArNTgyLDcgQEAKIAkJfQogCQlzdGF0dXMgPSB1c2JfZXBfZW5hYmxlKGhpZGctPm91dF9lcCk7CiAJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQlFUlJPUihjZGV2LCAiRW5hYmxlIElOIGVuZHBvaW50IEZBSUxFRCFcbiIpOworCQkJRVJST1IoY2RldiwgIkVuYWJsZSBPVVQgZW5kcG9pbnQgRkFJTEVEIVxuIik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaGlkZy0+b3V0X2VwLT5kcml2ZXJfZGF0YSA9IGhpZGc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9xZHNzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9xZHNzLmMKaW5kZXggNDBhN2FjZi4uYTBmZWNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcWRzcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3Fkc3MuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGMtPmNkZXYtPmdhZGdldDsKIAlzdHJ1Y3QgZl9xZHNzICpxZHNzID0gZnVuY190b19xZHNzKGYpOwogCXN0cnVjdCB1c2JfZXAgKmVwOwotCWludCBpZmFjZTsKKwlpbnQgaWZhY2UsIGlkOwogCiAJcHJfZGVidWcoInFkc3NfYmluZFxuIik7CiAKQEAgLTM1Niw2ICszNTYsMTIgQEAKIAlxZHNzX2RhdGFfaW50Zl9kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPSBpZmFjZTsKIAlxZHNzLT5kYXRhX2lmYWNlX2lkID0gaWZhY2U7CiAKKwlpZCA9IHVzYl9zdHJpbmdfaWQoYy0+Y2Rldik7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIGlkOworCXFkc3Nfc3RyaW5nX2RlZnNbUURTU19EQVRBX0lEWF0uaWQgPSBpZDsKKwlxZHNzX2RhdGFfaW50Zl9kZXNjLmlJbnRlcmZhY2UgPSBpZDsKKwogCWlmIChxZHNzLT5kZWJ1Z19pbmZhY2VfZW5hYmxlZCkgewogCQkvKiBBbGxvY2F0ZSBjdHJsIEkvRiAqLwogCQlpZmFjZSA9IHVzYl9pbnRlcmZhY2VfaWQoYywgZik7CkBAIC0zNjUsNiArMzcxLDExIEBACiAJCX0KIAkJcWRzc19jdHJsX2ludGZfZGVzYy5iSW50ZXJmYWNlTnVtYmVyID0gaWZhY2U7CiAJCXFkc3MtPmN0cmxfaWZhY2VfaWQgPSBpZmFjZTsKKwkJaWQgPSB1c2Jfc3RyaW5nX2lkKGMtPmNkZXYpOworCQlpZiAoaWQgPCAwKQorCQkJcmV0dXJuIGlkOworCQlxZHNzX3N0cmluZ19kZWZzW1FEU1NfQ1RSTF9JRFhdLmlkID0gaWQ7CisJCXFkc3NfY3RybF9pbnRmX2Rlc2MuaUludGVyZmFjZSA9IGlkOwogCX0KIAogCWVwID0gdXNiX2VwX2F1dG9jb25maWdfc3MoZ2FkZ2V0LCAmcWRzc19zc19kYXRhX2Rlc2MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCmluZGV4IDM4ZDU4ZjMuLmFjMjIzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9ybmRpcy5jCkBAIC04MTMsOCArODEzLDE3IEBACiAJLyogRm9yIFVTQjogcmVzcG9uc2VzIG1heSB0YWtlIHVwIHRvIDEwIHNlY29uZHMgKi8KIAlzd2l0Y2ggKE1zZ1R5cGUpIHsKIAljYXNlIFJORElTX01TR19JTklUOgotCQlwcl9kZWJ1ZygiJXM6IFJORElTX01TR19JTklUXG4iLAotCQkJX19mdW5jX18pOworCQlwcl9kZWJ1ZygiJXM6IFJORElTX01TR19JTklUXG4iLCBfX2Z1bmNfXyk7CisJCXRtcCsrOyAvKiB0byBnZXQgUmVxdWVzdElEICovCisJCXBhcmFtcy0+aG9zdF9ybmRpc19tYWpvcl92ZXIgPSBnZXRfdW5hbGlnbmVkX2xlMzIodG1wKyspOworCQlwYXJhbXMtPmhvc3Rfcm5kaXNfbWlub3JfdmVyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHRtcCsrKTsKKwkJcGFyYW1zLT5kbF9tYXhfeGZlcl9zaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHRtcCsrKTsKKworCQlwcl9kZWJ1ZygiJXMoKTogUk5ESVMgSG9zdCBNYWpvcjolZCBNaW5vcjolZCB2ZXJzaW9uXG4iLAorCQkJCQlfX2Z1bmNfXywgcGFyYW1zLT5ob3N0X3JuZGlzX21ham9yX3ZlciwKKwkJCQkJcGFyYW1zLT5ob3N0X3JuZGlzX21pbm9yX3Zlcik7CisJCXByX2RlYnVnKCIlcygpOiBETCBNYXggVHJhbnNmZXIgc2l6ZToleFxuIiwKKwkJCQlfX2Z1bmNfXywgcGFyYW1zLT5kbF9tYXhfeGZlcl9zaXplKTsKIAkJcGFyYW1zLT5zdGF0ZSA9IFJORElTX0lOSVRJQUxJWkVEOwogCQlyZXR1cm4gcm5kaXNfaW5pdF9yZXNwb25zZShwYXJhbXMsIChybmRpc19pbml0X21zZ190eXBlICopYnVmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3JuZGlzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuaAppbmRleCA5MzljM2JlLi40ZmZjMjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuaApAQCAtMTkxLDYgKzE5MSw5IEBACiAKIAl1MzIJCQl2ZW5kb3JJRDsKIAl1OAkJCW1heF9wa3RfcGVyX3hmZXI7CisJdTMyCQkJaG9zdF9ybmRpc19tYWpvcl92ZXI7CisJdTMyCQkJaG9zdF9ybmRpc19taW5vcl92ZXI7CisJdTMyCQkJZGxfbWF4X3hmZXJfc2l6ZTsKIAljb25zdCBjaGFyCQkqdmVuZG9yRGVzY3I7CiAJdTgJCQlwa3RfYWxpZ25tZW50X2ZhY3RvcjsKIAl2b2lkCQkJKCpyZXNwX2F2YWlsKSh2b2lkICp2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jCmluZGV4IGJhNzhlM2YuLmQyY2ZlZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYwpAQCAtNjg1LDIxICs2ODUsMzIgQEAKIAlyZXR1cm4gdXNiM19yZXE7CiB9CiAKK3N0YXRpYyB2b2lkIF9fdXNiM19yZXF1ZXN0X2RvbmUoc3RydWN0IHJlbmVzYXNfdXNiM19lcCAqdXNiM19lcCwKKwkJCQlzdHJ1Y3QgcmVuZXNhc191c2IzX3JlcXVlc3QgKnVzYjNfcmVxLAorCQkJCWludCBzdGF0dXMpCit7CisJc3RydWN0IHJlbmVzYXNfdXNiMyAqdXNiMyA9IHVzYjNfZXBfdG9fdXNiMyh1c2IzX2VwKTsKKworCWRldl9kYmcodXNiM190b19kZXYodXNiMyksICJnaXZlYmFjazogZXAlMmQsICV1LCAldSwgJWRcbiIsCisJCXVzYjNfZXAtPm51bSwgdXNiM19yZXEtPnJlcS5sZW5ndGgsIHVzYjNfcmVxLT5yZXEuYWN0dWFsLAorCQlzdGF0dXMpOworCXVzYjNfcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCXVzYjNfZXAtPnN0YXJ0ZWQgPSBmYWxzZTsKKwlsaXN0X2RlbF9pbml0KCZ1c2IzX3JlcS0+cXVldWUpOworCXNwaW5fdW5sb2NrKCZ1c2IzLT5sb2NrKTsKKwl1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVlc3QoJnVzYjNfZXAtPmVwLCAmdXNiM19yZXEtPnJlcSk7CisJc3Bpbl9sb2NrKCZ1c2IzLT5sb2NrKTsKK30KKwogc3RhdGljIHZvaWQgdXNiM19yZXF1ZXN0X2RvbmUoc3RydWN0IHJlbmVzYXNfdXNiM19lcCAqdXNiM19lcCwKIAkJCSAgICAgIHN0cnVjdCByZW5lc2FzX3VzYjNfcmVxdWVzdCAqdXNiM19yZXEsIGludCBzdGF0dXMpCiB7CiAJc3RydWN0IHJlbmVzYXNfdXNiMyAqdXNiMyA9IHVzYjNfZXBfdG9fdXNiMyh1c2IzX2VwKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZyh1c2IzX3RvX2Rldih1c2IzKSwgImdpdmViYWNrOiBlcCUyZCwgJXUsICV1LCAlZFxuIiwKLQkJdXNiM19lcC0+bnVtLCB1c2IzX3JlcS0+cmVxLmxlbmd0aCwgdXNiM19yZXEtPnJlcS5hY3R1YWwsCi0JCXN0YXR1cyk7Ci0JdXNiM19yZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYjMtPmxvY2ssIGZsYWdzKTsKLQl1c2IzX2VwLT5zdGFydGVkID0gZmFsc2U7Ci0JbGlzdF9kZWxfaW5pdCgmdXNiM19yZXEtPnF1ZXVlKTsKKwlfX3VzYjNfcmVxdWVzdF9kb25lKHVzYjNfZXAsIHVzYjNfcmVxLCBzdGF0dXMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYjMtPmxvY2ssIGZsYWdzKTsKLQl1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVlc3QoJnVzYjNfZXAtPmVwLCAmdXNiM19yZXEtPnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHVzYjNfaXJxX2VwY19waXBlMF9zdGF0dXNfZW5kKHN0cnVjdCByZW5lc2FzX3VzYjMgKnVzYjMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCmluZGV4IGM4OTg5YzYuLjU4Yjk2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCkBAIC05OCw2ICs5OCw3IEBACiAJQU1EX0NISVBTRVRfSFVEU09OMiwKIAlBTURfQ0hJUFNFVF9CT0xUT04sCiAJQU1EX0NISVBTRVRfWUFOR1RaRSwKKwlBTURfQ0hJUFNFVF9UQUlTSEFOLAogCUFNRF9DSElQU0VUX1VOS05PV04sCiB9OwogCkBAIC0xNDUsMjAgKzE0NiwyNiBAQAogCQlwaW5mby0+c21idXNfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTUQsCiAJCQkJUENJX0RFVklDRV9JRF9BTURfSFVEU09OMl9TTUJVUywgTlVMTCk7CiAKLQkJaWYgKCFwaW5mby0+c21idXNfZGV2KSB7Ci0JCQlwaW5mby0+c2JfdHlwZS5nZW4gPSBOT1RfQU1EX0NISVBTRVQ7Ci0JCQlyZXR1cm4gMDsKKwkJaWYgKHBpbmZvLT5zbWJ1c19kZXYpIHsKKwkJCXJldiA9IHBpbmZvLT5zbWJ1c19kZXYtPnJldmlzaW9uOworCQkJaWYgKHJldiA+PSAweDExICYmIHJldiA8PSAweDE0KQorCQkJCXBpbmZvLT5zYl90eXBlLmdlbiA9IEFNRF9DSElQU0VUX0hVRFNPTjI7CisJCQllbHNlIGlmIChyZXYgPj0gMHgxNSAmJiByZXYgPD0gMHgxOCkKKwkJCQlwaW5mby0+c2JfdHlwZS5nZW4gPSBBTURfQ0hJUFNFVF9CT0xUT047CisJCQllbHNlIGlmIChyZXYgPj0gMHgzOSAmJiByZXYgPD0gMHgzYSkKKwkJCQlwaW5mby0+c2JfdHlwZS5nZW4gPSBBTURfQ0hJUFNFVF9ZQU5HVFpFOworCQl9IGVsc2UgeworCQkJcGluZm8tPnNtYnVzX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQU1ELAorCQkJCQkJCSAgMHgxNDVjLCBOVUxMKTsKKwkJCWlmIChwaW5mby0+c21idXNfZGV2KSB7CisJCQkJcmV2ID0gcGluZm8tPnNtYnVzX2Rldi0+cmV2aXNpb247CisJCQkJcGluZm8tPnNiX3R5cGUuZ2VuID0gQU1EX0NISVBTRVRfVEFJU0hBTjsKKwkJCX0gZWxzZSB7CisJCQkJcGluZm8tPnNiX3R5cGUuZ2VuID0gTk9UX0FNRF9DSElQU0VUOworCQkJCXJldHVybiAwOworCQkJfQogCQl9Ci0KLQkJcmV2ID0gcGluZm8tPnNtYnVzX2Rldi0+cmV2aXNpb247Ci0JCWlmIChyZXYgPj0gMHgxMSAmJiByZXYgPD0gMHgxNCkKLQkJCXBpbmZvLT5zYl90eXBlLmdlbiA9IEFNRF9DSElQU0VUX0hVRFNPTjI7Ci0JCWVsc2UgaWYgKHJldiA+PSAweDE1ICYmIHJldiA8PSAweDE4KQotCQkJcGluZm8tPnNiX3R5cGUuZ2VuID0gQU1EX0NISVBTRVRfQk9MVE9OOwotCQllbHNlIGlmIChyZXYgPj0gMHgzOSAmJiByZXYgPD0gMHgzYSkKLQkJCXBpbmZvLT5zYl90eXBlLmdlbiA9IEFNRF9DSElQU0VUX1lBTkdUWkU7CiAJfQotCiAJcGluZm8tPnNiX3R5cGUucmV2ID0gcmV2OwogCXJldHVybiAxOwogfQpAQCAtMjYwLDExICsyNjcsMTIgQEAKIHsKIAkvKiBNYWtlIHN1cmUgYW1kIGNoaXBzZXQgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCiAJdXNiX2FtZF9maW5kX2NoaXBzZXRfaW5mbygpOwotCWlmIChhbWRfY2hpcHNldC5zYl90eXBlLmdlbiAhPSBBTURfQ0hJUFNFVF9ZQU5HVFpFKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIlFVSVJLOiBFbmFibGUgQU1EIHJlbW90ZSB3YWtldXAgZml4XG4iKTsKLQlyZXR1cm4gMTsKKwlpZiAoYW1kX2NoaXBzZXQuc2JfdHlwZS5nZW4gPT0gQU1EX0NISVBTRVRfWUFOR1RaRSB8fAorCSAgICBhbWRfY2hpcHNldC5zYl90eXBlLmdlbiA9PSBBTURfQ0hJUFNFVF9UQUlTSEFOKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIlFVSVJLOiBFbmFibGUgQU1EIHJlbW90ZSB3YWtldXAgZml4XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9hbWRfcmVtb3RlX3dha2V1cF9xdWlyayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCmluZGV4IDZjYjVhYjMuLjE0YzAyMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAKIAloY2RfdG9fYnVzKHhoY2ktPnNoYXJlZF9oY2QpLT5za2lwX3Jlc3VtZSA9IHRydWU7CiAKLQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChzeXNkZXYsICJ1c2IzLWxwbS1jYXBhYmxlIikpCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woJnBkZXYtPmRldiwgInVzYjMtbHBtLWNhcGFibGUiKSkKIAkJeGhjaS0+cXVpcmtzIHw9IFhIQ0lfTFBNX1NVUFBPUlQ7CiAKIAlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbCgmcGRldi0+ZGV2LCAicXVpcmstYnJva2VuLXBvcnQtcGVkIikpCkBAIC0zMTYsNiArMzE2LDkgQEAKIAlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHN5c2RldiwgInNucHMseGhjaS1pbW9kLXZhbHVlIiwgJmltb2QpKQogCQlpbW9kID0gMDsKIAorCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoc3lzZGV2LCAidXNiLWNvcmUtaWQiLCAmeGhjaS0+Y29yZV9pZCkpCisJCXhoY2ktPmNvcmVfaWQgPSAtRUlOVkFMOworCiAJaGNkLT51c2JfcGh5ID0gZGV2bV91c2JfZ2V0X3BoeV9ieV9waGFuZGxlKHN5c2RldiwgInVzYi1waHkiLCAwKTsKIAlpZiAoSVNfRVJSKGhjZC0+dXNiX3BoeSkpIHsKIAkJcmV0ID0gUFRSX0VSUihoY2QtPnVzYl9waHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCAxNWJmMzA4Li4xNjYwYzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtNDk2NCwxMCArNDk2NCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoeGhjaV9nZW5fc2V0dXApOwogCi1kbWFfYWRkcl90IHhoY2lfZ2V0X3NlY19ldmVudF9yaW5nX2RtYV9hZGRyKHN0cnVjdCB1c2JfaGNkICpoY2QsCi0JdW5zaWduZWQgaW50IGludHJfbnVtKQorc3RhdGljIHBoeXNfYWRkcl90IHhoY2lfZ2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcihzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCXVuc2lnbmVkIGludCBpbnRyX251bSwgZG1hX2FkZHJfdCAqZG1hKQogewogCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGhjZF90b194aGNpKGhjZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaGNkLT5zZWxmLnN5c2RldjsKKwlzdHJ1Y3Qgc2dfdGFibGUgc2d0OworCXBoeXNfYWRkcl90IHBhOwogCiAJaWYgKGludHJfbnVtID49IHhoY2ktPm1heF9pbnRlcnJ1cHRlcnMpIHsKIAkJeGhjaV9lcnIoeGhjaSwgImludHIgbnVtICVkID49IG1heCBpbnRycyAlZFxuIiwgaW50cl9udW0sCkBAIC00OTc3LDMxICs0OTgwLDM0IEBACiAKIAlpZiAoISh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0hBTFRFRCkgJiYKIAkJeGhjaS0+c2VjX2V2ZW50X3JpbmcgJiYgeGhjaS0+c2VjX2V2ZW50X3JpbmdbaW50cl9udW1dCi0JCSYmIHhoY2ktPnNlY19ldmVudF9yaW5nW2ludHJfbnVtXS0+Zmlyc3Rfc2VnKQotCQlyZXR1cm4geGhjaS0+c2VjX2V2ZW50X3JpbmdbaW50cl9udW1dLT5maXJzdF9zZWctPmRtYTsKKwkJJiYgeGhjaS0+c2VjX2V2ZW50X3JpbmdbaW50cl9udW1dLT5maXJzdF9zZWcpIHsKKworCQlkbWFfZ2V0X3NndGFibGUoZGV2LCAmc2d0LAorCQkJeGhjaS0+c2VjX2V2ZW50X3JpbmdbaW50cl9udW1dLT5maXJzdF9zZWctPnRyYnMsCisJCQl4aGNpLT5zZWNfZXZlbnRfcmluZ1tpbnRyX251bV0tPmZpcnN0X3NlZy0+ZG1hLAorCQkJVFJCX1NFR01FTlRfU0laRSk7CisKKwkJKmRtYSA9IHhoY2ktPnNlY19ldmVudF9yaW5nW2ludHJfbnVtXS0+Zmlyc3Rfc2VnLT5kbWE7CisKKwkJcGEgPSBwYWdlX3RvX3BoeXMoc2dfcGFnZShzZ3Quc2dsKSk7CisJCXNnX2ZyZWVfdGFibGUoJnNndCk7CisKKwkJcmV0dXJuIHBhOworCX0KIAogCXJldHVybiAwOwogfQogCi1kbWFfYWRkcl90IHhoY2lfZ2V0X2RjYmFfZG1hX2FkZHIoc3RydWN0IHVzYl9oY2QgKmhjZCwKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKLXsKLQlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSBoY2RfdG9feGhjaShoY2QpOwotCi0JaWYgKCEoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9IQUxURUQpICYmIHhoY2ktPmRjYmFhKQotCQlyZXR1cm4geGhjaS0+ZGNiYWEtPmRldl9jb250ZXh0X3B0cnNbdWRldi0+c2xvdF9pZF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotZG1hX2FkZHJfdCB4aGNpX2dldF94ZmVyX3JpbmdfZG1hX2FkZHIoc3RydWN0IHVzYl9oY2QgKmhjZCwKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKK3N0YXRpYyBwaHlzX2FkZHJfdCB4aGNpX2dldF94ZmVyX3JpbmdfcGh5c19hZGRyKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBlcF9pbmRleDsKIAlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqdmlydF9kZXY7Ci0KKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuc3lzZGV2OwogCXN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGhjZF90b194aGNpKGhjZCk7CisJc3RydWN0IHNnX3RhYmxlIHNndDsKKwlwaHlzX2FkZHJfdCBwYTsKIAogCXJldCA9IHhoY2lfY2hlY2tfYXJncyhoY2QsIHVkZXYsIGVwLCAxLCB0cnVlLCBfX2Z1bmNfXyk7CiAJaWYgKHJldCA8PSAwKSB7CkBAIC01MDEzLDEyICs1MDE5LDMxIEBACiAJZXBfaW5kZXggPSB4aGNpX2dldF9lbmRwb2ludF9pbmRleCgmZXAtPmRlc2MpOwogCiAJaWYgKHZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLnJpbmcgJiYKLQkJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ucmluZy0+Zmlyc3Rfc2VnKQotCQlyZXR1cm4gdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ucmluZy0+Zmlyc3Rfc2VnLT5kbWE7CisJCXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLnJpbmctPmZpcnN0X3NlZykgeworCisJCWRtYV9nZXRfc2d0YWJsZShkZXYsICZzZ3QsCisJCQl2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nLT5maXJzdF9zZWctPnRyYnMsCisJCQl2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nLT5maXJzdF9zZWctPmRtYSwKKwkJCVRSQl9TRUdNRU5UX1NJWkUpOworCisJCSpkbWEgPSB2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5yaW5nLT5maXJzdF9zZWctPmRtYTsKKworCQlwYSA9IHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNndC5zZ2wpKTsKKwkJc2dfZnJlZV90YWJsZSgmc2d0KTsKKworCQlyZXR1cm4gcGE7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKK2ludCB4aGNpX2dldF9jb3JlX2lkKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IHhoY2lfaGNkICp4aGNpID0gaGNkX3RvX3hoY2koaGNkKTsKKworCXJldHVybiB4aGNpLT5jb3JlX2lkOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciB4aGNpX2hjX2RyaXZlciA9IHsKIAkuZGVzY3JpcHRpb24gPQkJInhoY2ktaGNkIiwKIAkucHJvZHVjdF9kZXNjID0JCSJ4SENJIEhvc3QgQ29udHJvbGxlciIsCkBAIC01MDgwLDkgKzUxMDUsOSBAQAogCS5maW5kX3Jhd19wb3J0X251bWJlciA9CXhoY2lfZmluZF9yYXdfcG9ydF9udW1iZXIsCiAJLnNlY19ldmVudF9yaW5nX3NldHVwID0JCXhoY2lfc2VjX2V2ZW50X3Jpbmdfc2V0dXAsCiAJLnNlY19ldmVudF9yaW5nX2NsZWFudXAgPQl4aGNpX3NlY19ldmVudF9yaW5nX2NsZWFudXAsCi0JLmdldF9zZWNfZXZlbnRfcmluZ19kbWFfYWRkciA9CXhoY2lfZ2V0X3NlY19ldmVudF9yaW5nX2RtYV9hZGRyLAotCS5nZXRfeGZlcl9yaW5nX2RtYV9hZGRyID0JeGhjaV9nZXRfeGZlcl9yaW5nX2RtYV9hZGRyLAotCS5nZXRfZGNiYV9kbWFfYWRkciA9CQl4aGNpX2dldF9kY2JhX2RtYV9hZGRyLAorCS5nZXRfc2VjX2V2ZW50X3JpbmdfcGh5c19hZGRyID0JeGhjaV9nZXRfc2VjX2V2ZW50X3JpbmdfcGh5c19hZGRyLAorCS5nZXRfeGZlcl9yaW5nX3BoeXNfYWRkciA9CXhoY2lfZ2V0X3hmZXJfcmluZ19waHlzX2FkZHIsCisJLmdldF9jb3JlX2lkID0JCQl4aGNpX2dldF9jb3JlX2lkLAogfTsKIAogdm9pZCB4aGNpX2luaXRfZHJpdmVyKHN0cnVjdCBoY19kcml2ZXIgKmRydiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKaW5kZXggNzU3ZDA0NS4uZGI0NmRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKQEAgLTE1MzgsNiArMTUzOCw4IEBACiAJLyogc2Vjb25kYXJ5IGludGVycnVwdGVyICovCiAJc3RydWN0CXhoY2lfaW50cl9yZWcgX19pb21lbSAqKnNlY19pcl9zZXQ7CiAKKwlpbnQJCWNvcmVfaWQ7CisKIAkvKiBDYWNoZWQgcmVnaXN0ZXIgY29waWVzIG9mIHJlYWQtb25seSBIQyBkYXRhICovCiAJX191MzIJCWhjc19wYXJhbXMxOwogCV9fdTMyCQloY3NfcGFyYW1zMjsKQEAgLTE5NzcsNiArMTk3OSw3IEBACiAJCWNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpOwogaW50IHhoY2lfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1Zik7CiBpbnQgeGhjaV9maW5kX3Jhd19wb3J0X251bWJlcihzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBpbnQgcG9ydDEpOworaW50IHhoY2lfZ2V0X2NvcmVfaWQoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiAKICNpZmRlZiBDT05GSUdfUE0KIGludCB4aGNpX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggMjYxZWQyYy4uYTZiNmIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0yNjU1LDYgKzI2NTUsMTMgQEAKIHsKIAlzdHJ1Y3QgbXVzYgkqbXVzYiA9IGRldl90b19tdXNiKGRldik7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlyZXR1cm4gcmV0OworCX0KIAogCW11c2JfcGxhdGZvcm1fZGlzYWJsZShtdXNiKTsKIAltdXNiX2dlbmVyaWNfZGlzYWJsZShtdXNiKTsKQEAgLTI3MDMsMTQgKzI3MTAsNiBAQAogCWlmICgoZGV2Y3RsICYgbWFzaykgIT0gKG11c2ItPmNvbnRleHQuZGV2Y3RsICYgbWFzaykpCiAJCW11c2ItPnBvcnQxX3N0YXR1cyA9IDA7CiAKLQkvKgotCSAqIFRoZSBVU0IgSFVCIGNvZGUgZXhwZWN0cyB0aGUgZGV2aWNlIHRvIGJlIGluIFJQTV9BQ1RJVkUgb25jZSBpdCBjYW1lCi0JICogb3V0IG9mIHN1c3BlbmQKLQkgKi8KLQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKLQlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwotCiAJbXVzYl9zdGFydChtdXNiKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CkBAIC0yNzIwLDYgKzI3MTksOSBAQAogCQkJZXJyb3IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IDk5YmVkYTkuLjU1YzYyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTM5LDYgKzEzOSw3IEBACiAJCQkJIkNvdWxkIG5vdCBmbHVzaCBob3N0IFRYJWQgZmlmbzogY3NyOiAlMDR4XG4iLAogCQkJCWVwLT5lcG51bSwgY3NyKSkKIAkJCXJldHVybjsKKwkJbWRlbGF5KDEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGQvcG9saWN5X2VuZ2luZS5jIGIvZHJpdmVycy91c2IvcGQvcG9saWN5X2VuZ2luZS5jCmluZGV4IDU3NGZmNzkuLmU4OTYxYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BkL3BvbGljeV9lbmdpbmUuYworKysgYi9kcml2ZXJzL3VzYi9wZC9wb2xpY3lfZW5naW5lLmMKQEAgLTEyOSw2ICsxMjksMTIgQEAKIAlNU0dfVkNPTk5fU1dBUCwKIAlNU0dfV0FJVCwKIAlNU0dfU09GVF9SRVNFVCwKKwlNU0dfTk9UX1NVUFBPUlRFRCA9IDB4MTAsCisJTVNHX0dFVF9TT1VSQ0VfQ0FQX0VYVEVOREVELAorCU1TR19HRVRfU1RBVFVTLAorCU1TR19GUl9TV0FQLAorCU1TR19HRVRfUFBTX1NUQVRVUywKKwlNU0dfR0VUX0NPVU5UUllfQ09ERVMsCiB9OwogCiBlbnVtIHVzYnBkX2RhdGFfbXNnX3R5cGUgewpAQCAtMTM2LDkgKzE0MiwyOSBAQAogCU1TR19SRVFVRVNULAogCU1TR19CSVNULAogCU1TR19TSU5LX0NBUEFCSUxJVElFUywKKwlNU0dfQkFUVEVSWV9TVEFUVVMsCisJTVNHX0FMRVJULAorCU1TR19HRVRfQ09VTlRSWV9JTkZPLAogCU1TR19WRE0gPSAweEYsCiB9OwogCitlbnVtIHVzYnBkX2V4dF9tc2dfdHlwZSB7CisJTVNHX1NPVVJDRV9DQVBBQklMSVRJRVNfRVhURU5ERUQgPSAxLAorCU1TR19TVEFUVVMsCisJTVNHX0dFVF9CQVRURVJZX0NBUCwKKwlNU0dfR0VUX0JBVFRFUllfU1RBVFVTLAorCU1TR19CQVRURVJZX0NBUEFCSUxJVElFUywKKwlNU0dfR0VUX01BTlVGQUNUVVJFUl9JTkZPLAorCU1TR19NQU5VRkFDVFVSRVJfSU5GTywKKwlNU0dfU0VDVVJJVFlfUkVRVUVTVCwKKwlNU0dfU0VDVVJJVFlfUkVTUE9OU0UsCisJTVNHX0ZJUk1XQVJFX1VQREFURV9SRVFVRVNULAorCU1TR19GSVJNV0FSRV9VUERBVEVfUkVTUE9OU0UsCisJTVNHX1BQU19TVEFUVVMsCisJTVNHX0NPVU5UUllfSU5GTywKKwlNU0dfQ09VTlRSWV9DT0RFUywKK307CisKIGVudW0gdmRtX3N0YXRlIHsKIAlWRE1fTk9ORSwKIAlESVNDT1ZFUkVEX0lELApAQCAtMjAyLDEzICsyMjgsMzAgQEAKIAogI2RlZmluZSBQRF9NQVhfREFUQV9PQkoJCTcKIAorI2RlZmluZSBQRF9TUkNfQ0FQX0VYVF9EQl9MRU4JMjQKKyNkZWZpbmUgUERfU1RBVFVTX0RCX0xFTgk1CisjZGVmaW5lIFBEX0JBVFRFUllfQ0FQX0RCX0xFTgk5CisKKyNkZWZpbmUgUERfTUFYX0VYVF9NU0dfTEVOCQkyNjAKKyNkZWZpbmUgUERfTUFYX0VYVF9NU0dfTEVHQUNZX0xFTgkyNgorCiAjZGVmaW5lIFBEX01TR19IRFIodHlwZSwgZHIsIHByLCBpZCwgY250LCByZXYpIFwKLQkoKCh0eXBlKSAmIDB4RikgfCAoKGRyKSA8PCA1KSB8IChyZXYgPDwgNikgfCBcCisJKCgodHlwZSkgJiAweDFGKSB8ICgoZHIpIDw8IDUpIHwgKHJldiA8PCA2KSB8IFwKIAkgKChwcikgPDwgOCkgfCAoKGlkKSA8PCA5KSB8ICgoY250KSA8PCAxMikpCi0jZGVmaW5lIFBEX01TR19IRFJfQ09VTlQoaGRyKSAoKChoZHIpID4+IDEyKSAmIDcpCi0jZGVmaW5lIFBEX01TR19IRFJfVFlQRShoZHIpICgoaGRyKSAmIDB4RikKLSNkZWZpbmUgUERfTVNHX0hEUl9JRChoZHIpICgoKGhkcikgPj4gOSkgJiA3KQotI2RlZmluZSBQRF9NU0dfSERSX1JFVihoZHIpICgoKGhkcikgPj4gNikgJiAzKQorI2RlZmluZSBQRF9NU0dfSERSX0NPVU5UKGhkcikJCSgoKGhkcikgPj4gMTIpICYgNykKKyNkZWZpbmUgUERfTVNHX0hEUl9UWVBFKGhkcikJCSgoaGRyKSAmIDB4MUYpCisjZGVmaW5lIFBEX01TR19IRFJfSUQoaGRyKQkJKCgoaGRyKSA+PiA5KSAmIDcpCisjZGVmaW5lIFBEX01TR19IRFJfUkVWKGhkcikJCSgoKGhkcikgPj4gNikgJiAzKQorI2RlZmluZSBQRF9NU0dfSERSX0VYVEVOREVECQlCSVQoMTUpCisjZGVmaW5lIFBEX01TR19IRFJfSVNfRVhURU5ERUQoaGRyKQkoKGhkcikgJiBQRF9NU0dfSERSX0VYVEVOREVEKQorCisjZGVmaW5lIFBEX01TR19FWFRfSERSKGNodW5rZWQsIG51bSwgcmVxLCBzaXplKSBcCisJKCgoY2h1bmtlZCkgPDwgMTUpIHwgKCgobnVtKSAmIDB4RikgPDwgMTEpIHwgXAorCSAoKHJlcSkgPDwgMTApIHwgKChzaXplKSAmIDB4MUZGKSkKKyNkZWZpbmUgUERfTVNHX0VYVF9IRFJfSVNfQ0hVTktFRChlaGRyKQkoKGVoZHIpICYgMHg4MDAwKQorI2RlZmluZSBQRF9NU0dfRVhUX0hEUl9DSFVOS19OVU0oZWhkcikJKCgoZWhkcikgPj4gMTEpICYgMHhGKQorI2RlZmluZSBQRF9NU0dfRVhUX0hEUl9SRVFfQ0hVTksoZWhkcikJKChlaGRyKSAmIDB4NDAwKQorI2RlZmluZSBQRF9NU0dfRVhUX0hEUl9EQVRBX1NJWkUoZWhkcikJKChlaGRyKSAmIDB4MUZGKQogCiAjZGVmaW5lIFBEX1JET19GSVhFRChvYmosIGdiLCBtaXNtYXRjaCwgdXNiX2NvbW0sIG5vX3VzYl9zdXNwLCBjdXJyMSwgY3VycjIpIFwKIAkJKCgob2JqKSA8PCAyOCkgfCAoKGdiKSA8PCAyNykgfCAoKG1pc21hdGNoKSA8PCAyNikgfCBcCkBAIC0yOTUsMTkgKzMzOCwyNCBAQAogc3RhdGljIGNvbnN0IHUzMiBkZWZhdWx0X3Nua19jYXBzW10gPSB7IDB4MjYwMTkxMkMgfTsJLyogVlNhZmU1ViBAIDNBICovCiAKIHN0cnVjdCB2ZG1fdHggewotCXUzMgkJCWRhdGFbN107CisJdTMyCQkJZGF0YVtQRF9NQVhfREFUQV9PQkpdOwogCWludAkJCXNpemU7CiB9OwogCiBzdHJ1Y3QgcnhfbXNnIHsKLQl1OAkJCXR5cGU7Ci0JdTgJCQlsZW47Ci0JdTMyCQkJcGF5bG9hZFs3XTsKKwl1MTYJCQloZHI7CisJdTE2CQkJZGF0YV9sZW47CS8qIHNpemUgb2YgcGF5bG9hZCBpbiBieXRlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7CisJdTgJCQlwYXlsb2FkW107CiB9OwogCi0jZGVmaW5lIElTX0RBVEEobSwgdCkgKChtKSAmJiAoKG0pLT5sZW4pICYmICgobSktPnR5cGUgPT0gKHQpKSkKLSNkZWZpbmUgSVNfQ1RSTChtLCB0KSAoKG0pICYmICEoKG0pLT5sZW4pICYmICgobSktPnR5cGUgPT0gKHQpKSkKKyNkZWZpbmUgSVNfREFUQShtLCB0KSAoKG0pICYmICFQRF9NU0dfSERSX0lTX0VYVEVOREVEKChtKS0+aGRyKSAmJiBcCisJCVBEX01TR19IRFJfQ09VTlQoKG0pLT5oZHIpICYmIFwKKwkJKFBEX01TR19IRFJfVFlQRSgobSktPmhkcikgPT0gKHQpKSkKKyNkZWZpbmUgSVNfQ1RSTChtLCB0KSAoKG0pICYmICFQRF9NU0dfSERSX0NPVU5UKChtKS0+aGRyKSAmJiBcCisJCShQRF9NU0dfSERSX1RZUEUoKG0pLT5oZHIpID09ICh0KSkpCisjZGVmaW5lIElTX0VYVChtLCB0KSAoKG0pICYmIFBEX01TR19IRFJfSVNfRVhURU5ERUQoKG0pLT5oZHIpICYmIFwKKwkJKFBEX01TR19IRFJfVFlQRSgobSktPmhkcikgPT0gKHQpKSkKIAogc3RydWN0IHVzYnBkIHsKIAlzdHJ1Y3QgZGV2aWNlCQlkZXY7CkBAIC0zMjIsOCArMzcwLDEwIEBACiAJYm9vbAkJCWhhcmRfcmVzZXRfcmVjdmQ7CiAJc3RydWN0IGxpc3RfaGVhZAlyeF9xOwogCXNwaW5sb2NrX3QJCXJ4X2xvY2s7CisJc3RydWN0IHJ4X21zZwkJKnJ4X2V4dF9tc2c7CiAKIAl1MzIJCQlyZWNlaXZlZF9wZG9zW1BEX01BWF9EQVRBX09CSl07CisJdTMyCQkJcmVjZWl2ZWRfYWRvOwogCXUxNgkJCXNyY19jYXBfaWQ7CiAJdTgJCQlzZWxlY3RlZF9wZG87CiAJdTgJCQlyZXF1ZXN0ZWRfcGRvOwpAQCAtMzU1LDYgKzQwNSw4IEBACiAJYm9vbAkJCXBkX3BoeV9vcGVuZWQ7CiAJYm9vbAkJCXNlbmRfcmVxdWVzdDsKIAlzdHJ1Y3QgY29tcGxldGlvbglpc19yZWFkeTsKKwlzdHJ1Y3QgY29tcGxldGlvbgl0eF9jaHVua19yZXF1ZXN0OworCXU4CQkJbmV4dF90eF9jaHVuazsKIAogCXN0cnVjdCBtdXRleAkJc3dhcF9sb2NrOwogCXN0cnVjdCBkdWFsX3JvbGVfcGh5X2luc3RhbmNlCSpkdWFsX3JvbGU7CkBAIC0zNzgsMTEgKzQzMCwyNSBAQAogCWludAkJCW51bV9zdmlkczsKIAlzdHJ1Y3QgdmRtX3R4CQkqdmRtX3R4OwogCXN0cnVjdCB2ZG1fdHgJCSp2ZG1fdHhfcmV0cnk7CisJc3RydWN0IG11dGV4CQlzdmlkX2hhbmRsZXJfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXN2aWRfaGFuZGxlcnM7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWluc3RhbmNlOwogCiAJdTE2CQkJc3NfbGFuZV9zdmlkOworCisJLyogZXh0IG1zZyBzdXBwb3J0ICovCisJYm9vbAkJCXNlbmRfZ2V0X3NyY19jYXBfZXh0OworCXU4CQkJc3JjX2NhcF9leHRfZGJbUERfU1JDX0NBUF9FWFRfREJfTEVOXTsKKwlib29sCQkJc2VuZF9nZXRfcHBzX3N0YXR1czsKKwl1MzIJCQlwcHNfc3RhdHVzX2RiOworCXU4CQkJc3RhdHVzX2RiW1BEX1NUQVRVU19EQl9MRU5dOworCWJvb2wJCQlzZW5kX2dldF9iYXR0ZXJ5X2NhcDsKKwl1OAkJCWdldF9iYXR0ZXJ5X2NhcF9kYjsKKwl1OAkJCWJhdHRlcnlfY2FwX2RiW1BEX0JBVFRFUllfQ0FQX0RCX0xFTl07CisJdTgJCQlnZXRfYmF0dGVyeV9zdGF0dXNfZGI7CisJYm9vbAkJCXNlbmRfZ2V0X2JhdHRlcnlfc3RhdHVzOworCXUzMgkJCWJhdHRlcnlfc3RzX2RvYmo7CiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKF91c2JwZCk7CS8qIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCkBAIC01MTYsMTAgKzU4MiwxNSBAQAogewogCXN0cnVjdCB1c2JwZF9zdmlkX2hhbmRsZXIgKmhhbmRsZXI7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZwZC0+c3ZpZF9oYW5kbGVycywgZW50cnkpCi0JCWlmIChzdmlkID09IGhhbmRsZXItPnN2aWQpCisJbXV0ZXhfbG9jaygmcGQtPnN2aWRfaGFuZGxlcl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZwZC0+c3ZpZF9oYW5kbGVycywgZW50cnkpIHsKKwkJaWYgKHN2aWQgPT0gaGFuZGxlci0+c3ZpZCkgeworCQkJbXV0ZXhfdW5sb2NrKCZwZC0+c3ZpZF9oYW5kbGVyX2xvY2spOwogCQkJcmV0dXJuIGhhbmRsZXI7CisJCX0KKwl9CiAKKwltdXRleF91bmxvY2soJnBkLT5zdmlkX2hhbmRsZXJfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTU1NCw2ICs2MjUsNTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwZF9zZW5kX2V4dF9tc2coc3RydWN0IHVzYnBkICpwZCwgdTggbXNnX3R5cGUsCisJCWNvbnN0IHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIGVudW0gcGRfc29wX3R5cGUgc29wKQoreworCWludCByZXQ7CisJc2l6ZV90IGxlbl9yZW1haW4sIGNodW5rX2xlbjsKKwl1OCBjaHVua2VkX3BheWxvYWRbUERfTUFYX0RBVEFfT0JKICogc2l6ZW9mKHUzMildID0gezB9OworCXUxNiBoZHI7CisJdTE2IGV4dF9oZHI7CisJdTggbnVtX29ianM7CisKKwlpZiAoZGF0YV9sZW4gPiBQRF9NQVhfRVhUX01TR19MRU4pIHsKKwkJdXNicGRfd2FybigmcGQtPmRldiwgIkV4dGVuZGVkIG1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZHMgbWF4LCB0cnVuY2F0aW5nLi4uXG4iKTsKKwkJZGF0YV9sZW4gPSBQRF9NQVhfRVhUX01TR19MRU47CisJfQorCisJcGQtPm5leHRfdHhfY2h1bmsgPSAwOworCWxlbl9yZW1haW4gPSBkYXRhX2xlbjsKKwlkbyB7CisJCWV4dF9oZHIgPSBQRF9NU0dfRVhUX0hEUigxLCBwZC0+bmV4dF90eF9jaHVuaysrLCAwLCBkYXRhX2xlbik7CisJCW1lbWNweShjaHVua2VkX3BheWxvYWQsICZleHRfaGRyLCBzaXplb2YoZXh0X2hkcikpOworCisJCWNodW5rX2xlbiA9IG1pbl90KHNpemVfdCwgbGVuX3JlbWFpbiwKKwkJCQlQRF9NQVhfRVhUX01TR19MRUdBQ1lfTEVOKTsKKwkJbWVtY3B5KGNodW5rZWRfcGF5bG9hZCArIHNpemVvZihleHRfaGRyKSwgZGF0YSwgY2h1bmtfbGVuKTsKKworCQludW1fb2JqcyA9IERJVl9ST1VORF9VUChjaHVua19sZW4gKyBzaXplb2YodTE2KSwgc2l6ZW9mKHUzMikpOworCQlsZW5fcmVtYWluIC09IGNodW5rX2xlbjsKKworCQlyZWluaXRfY29tcGxldGlvbigmcGQtPnR4X2NodW5rX3JlcXVlc3QpOworCQloZHIgPSBQRF9NU0dfSERSKG1zZ190eXBlLCBwZC0+Y3VycmVudF9kciwgcGQtPmN1cnJlbnRfcHIsCisJCQkJcGQtPnR4X21zZ2lkLCBudW1fb2JqcywgcGQtPnNwZWNfcmV2KSB8CisJCQlQRF9NU0dfSERSX0VYVEVOREVEOworCQlyZXQgPSBwZF9waHlfd3JpdGUoaGRyLCBjaHVua2VkX3BheWxvYWQsCisJCQkJbnVtX29ianMgKiBzaXplb2YodTMyKSwgc29wKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcGQtPnR4X21zZ2lkID0gKHBkLT50eF9tc2dpZCArIDEpICYgUERfTUFYX01TR19JRDsKKworCQkvKiBXYWl0IGZvciByZXF1ZXN0IGNodW5rICovCisJCWlmIChsZW5fcmVtYWluICYmCisJCQkhd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwZC0+dHhfY2h1bmtfcmVxdWVzdCwKKwkJCQltc2Vjc190b19qaWZmaWVzKFNFTkRFUl9SRVNQT05TRV9USU1FKSkpIHsKKwkJCXVzYnBkX2VycigmcGQtPmRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjaHVuayByZXF1ZXN0XG4iKTsKKwkJCXJldHVybiAtRVBST1RPOworCQl9CisJfSB3aGlsZSAobGVuX3JlbWFpbik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwZF9zZWxlY3RfcGRvKHN0cnVjdCB1c2JwZCAqcGQsIGludCBwZG9fcG9zLCBpbnQgdXYsIGludCB1YSkKIHsKIAlpbnQgY3VycjsKQEAgLTY5NCw2ICs4MTYsMTUwIEBACiAJa2lja19zbShwZCwgMCk7CiB9CiAKK3N0cnVjdCBwZF9yZXF1ZXN0X2NodW5rIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdzsKKwlzdHJ1Y3QgdXNicGQJCSpwZDsKKwl1OAkJCW1zZ190eXBlOworCXU4CQkJY2h1bmtfbnVtOworCWVudW0gcGRfc29wX3R5cGUJc29wOworfTsKKworc3RhdGljIHZvaWQgcGRfcmVxdWVzdF9jaHVua193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3sKKwlzdHJ1Y3QgcGRfcmVxdWVzdF9jaHVuayAqcmVxID0KKwkJY29udGFpbmVyX29mKHcsIHN0cnVjdCBwZF9yZXF1ZXN0X2NodW5rLCB3KTsKKwlzdHJ1Y3QgdXNicGQgKnBkID0gcmVxLT5wZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdTggcGF5bG9hZFs0XSA9IHswfTsgLyogZXh0X2hkciArIHBhZGRpbmcgKi8KKwl1MTYgaGRyID0gUERfTVNHX0hEUihyZXEtPm1zZ190eXBlLCBwZC0+Y3VycmVudF9kciwgcGQtPmN1cnJlbnRfcHIsCisJCQlwZC0+dHhfbXNnaWQsIDEsIHBkLT5zcGVjX3JldikgfCBQRF9NU0dfSERSX0VYVEVOREVEOworCisJKih1MTYgKilwYXlsb2FkID0gUERfTVNHX0VYVF9IRFIoMSwgcmVxLT5jaHVua19udW0sIDEsIDApOworCisJcmV0ID0gcGRfcGh5X3dyaXRlKGhkciwgcGF5bG9hZCwgc2l6ZW9mKHBheWxvYWQpLCByZXEtPnNvcCk7CisJaWYgKCFyZXQpIHsKKwkJcGQtPnR4X21zZ2lkID0gKHBkLT50eF9tc2dpZCArIDEpICYgUERfTUFYX01TR19JRDsKKwl9IGVsc2UgeworCQl1c2JwZF9lcnIoJnBkLT5kZXYsICJjb3VsZCBub3Qgc2VuZCBjaHVuayByZXF1ZXN0XG4iKTsKKworCQkvKiBxdWV1ZSB3aGF0IHdlIGhhdmUgYW55d2F5ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+cnhfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZwZC0+cnhfZXh0X21zZy0+ZW50cnksICZwZC0+cnhfcSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5yeF9sb2NrLCBmbGFncyk7CisKKwkJcGQtPnJ4X2V4dF9tc2cgPSBOVUxMOworCX0KKworCWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnhfbXNnICpwZF9leHRfbXNnX3JlY2VpdmVkKHN0cnVjdCB1c2JwZCAqcGQsIHUxNiBoZWFkZXIsIHU4ICpidWYsCisJCXNpemVfdCBsZW4sIGVudW0gcGRfc29wX3R5cGUgc29wKQoreworCXN0cnVjdCByeF9tc2cgKnJ4X21zZzsKKwl1MTYgYnl0ZXNfdG9fY29weTsKKwl1MTYgZXh0X2hkciA9ICoodTE2ICopYnVmOworCXU4IGNodW5rX251bTsKKworCWlmICghUERfTVNHX0VYVF9IRFJfSVNfQ0hVTktFRChleHRfaGRyKSkgeworCQl1c2JwZF9lcnIoJnBkLT5kZXYsICJ1bmNodW5rZWQgZXh0ZW5kZWQgbWVzc2FnZXMgdW5zdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiByZXF1ZXN0IGZvciBuZXh0IFR4IGNodW5rICovCisJaWYgKFBEX01TR19FWFRfSERSX1JFUV9DSFVOSyhleHRfaGRyKSkgeworCQlpZiAoUERfTVNHX0VYVF9IRFJfREFUQV9TSVpFKGV4dF9oZHIpIHx8CisJCQlQRF9NU0dfRVhUX0hEUl9DSFVOS19OVU0oZXh0X2hkcikgIT0KKwkJCQlwZC0+bmV4dF90eF9jaHVuaykgeworCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiaW52YWxpZCByZXF1ZXN0IGNodW5rIGV4dCBoZWFkZXIgMHglMDJ4XG4iLAorCQkJCQlleHRfaGRyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKCFjb21wbGV0aW9uX2RvbmUoJnBkLT50eF9jaHVua19yZXF1ZXN0KSkKKwkJCWNvbXBsZXRlKCZwZC0+dHhfY2h1bmtfcmVxdWVzdCk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2h1bmtfbnVtID0gUERfTVNHX0VYVF9IRFJfQ0hVTktfTlVNKGV4dF9oZHIpOworCWlmICghY2h1bmtfbnVtKSB7CisJCS8qIGFsbG9jYXRlIG5ldyBtZXNzYWdlIGlmIGZpcnN0IGNodW5rICovCisJCXJ4X21zZyA9IGt6YWxsb2Moc2l6ZW9mKCpyeF9tc2cpICsKKwkJCQlQRF9NU0dfRVhUX0hEUl9EQVRBX1NJWkUoZXh0X2hkciksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghcnhfbXNnKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcnhfbXNnLT5oZHIgPSBoZWFkZXI7CisJCXJ4X21zZy0+ZGF0YV9sZW4gPSBQRF9NU0dfRVhUX0hEUl9EQVRBX1NJWkUoZXh0X2hkcik7CisKKwkJaWYgKHJ4X21zZy0+ZGF0YV9sZW4gPiBQRF9NQVhfRVhUX01TR19MRU4pIHsKKwkJCXVzYnBkX3dhcm4oJnBkLT5kZXYsICJFeHRlbmRlZCBtZXNzYWdlIGxlbmd0aCBleGNlZWRzIG1heCwgdHJ1bmNhdGluZy4uLlxuIik7CisJCQlyeF9tc2ctPmRhdGFfbGVuID0gUERfTUFYX0VYVF9NU0dfTEVOOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFwZC0+cnhfZXh0X21zZykgeworCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAibWlzc2luZyBmaXJzdCByeF9leHRfbXNnIGNodW5rXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcnhfbXNnID0gcGQtPnJ4X2V4dF9tc2c7CisJfQorCisJLyoKKwkgKiBUaGUgYW1vdW50IHRvIGNvcHkgaXMgZGVyaXZlZCBhcyBmb2xsb3dzOgorCSAqCisJICogLSBpZiBleHRlbmRlZCBkYXRhX2xlbiA8IDI2LCB0aGVuIGNvcHkgZGF0YV9sZW4gYnl0ZXMKKwkgKiAtIGZvciBjaHVua3MgMC4uTi0yLCBjb3B5IDI2IGJ5dGVzCisJICogLSBmb3IgdGhlIGxhc3QgY2h1bmsgKE4tMSksIGNvcHkgdGhlIHJlbWFpbmRlcgorCSAqLworCWJ5dGVzX3RvX2NvcHkgPQorCQltaW4oKHJ4X21zZy0+ZGF0YV9sZW4gLSBjaHVua19udW0gKiBQRF9NQVhfRVhUX01TR19MRUdBQ1lfTEVOKSwKKwkJCVBEX01BWF9FWFRfTVNHX0xFR0FDWV9MRU4pOworCisJLyogY2hlY2sgYWdhaW5zdCByZWNlaXZlZCBsZW5ndGggdG8gYXZvaWQgb3ZlcnJ1biAqLworCWlmIChieXRlc190b19jb3B5ID4gbGVuIC0gc2l6ZW9mKGV4dF9oZHIpKSB7CisJCXVzYnBkX3dhcm4oJnBkLT5kZXYsICJub3QgZW5vdWdoIGJ5dGVzIGluIGNodW5rLCBleHBlY3RlZDoldSByZWNlaXZlZDolbHVcbiIsCisJCQlieXRlc190b19jb3B5LCBsZW4gLSBzaXplb2YoZXh0X2hkcikpOworCQlieXRlc190b19jb3B5ID0gbGVuIC0gc2l6ZW9mKGV4dF9oZHIpOworCX0KKworCW1lbWNweShyeF9tc2ctPnBheWxvYWQgKyBjaHVua19udW0gKiBQRF9NQVhfRVhUX01TR19MRUdBQ1lfTEVOLCBidWYgKyAyLAorCQkJYnl0ZXNfdG9fY29weSk7CisKKwkvKiByZXF1ZXN0IG5leHQgY2h1bms/ICovCisJaWYgKChyeF9tc2ctPmRhdGFfbGVuIC0gY2h1bmtfbnVtICogUERfTUFYX0VYVF9NU0dfTEVHQUNZX0xFTikgPgorCQkJUERfTUFYX0VYVF9NU0dfTEVHQUNZX0xFTikgeworCQlzdHJ1Y3QgcGRfcmVxdWVzdF9jaHVuayAqcmVxOworCisJCWlmIChwZC0+cnhfZXh0X21zZyAmJiBwZC0+cnhfZXh0X21zZyAhPSByeF9tc2cpIHsKKwkJCXVzYnBkX2RiZygmcGQtPmRldiwgInN0YWxlIHByZXZpb3VzIHJ4X2V4dF9tc2c/XG4iKTsKKwkJCWtmcmVlKHBkLT5yeF9leHRfbXNnKTsKKwkJfQorCisJCXBkLT5yeF9leHRfbXNnID0gcnhfbXNnOworCisJCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZXEpCisJCQlnb3RvIHF1ZXVlX3J4OyAvKiByZXR1cm4gd2hhdCB3ZSBoYXZlIGFueXdheSAqLworCisJCUlOSVRfV09SSygmcmVxLT53LCBwZF9yZXF1ZXN0X2NodW5rX3dvcmspOworCQlyZXEtPnBkID0gcGQ7CisJCXJlcS0+bXNnX3R5cGUgPSBQRF9NU0dfSERSX1RZUEUoaGVhZGVyKTsKKwkJcmVxLT5jaHVua19udW0gPSBjaHVua19udW0gKyAxOworCQlyZXEtPnNvcCA9IHNvcDsKKwkJcXVldWVfd29yayhwZC0+d3EsICZyZXEtPncpOworCisJCXJldHVybiBOVUxMOworCX0KKworcXVldWVfcng6CisJcGQtPnJ4X2V4dF9tc2cgPSBOVUxMOworCXJldHVybiByeF9tc2c7CS8qIHF1ZXVlIGl0IGZvciB1c2JwZF9zbSAqLworfQorCiBzdGF0aWMgdm9pZCBwaHlfbXNnX3JlY2VpdmVkKHN0cnVjdCB1c2JwZCAqcGQsIGVudW0gcGRfc29wX3R5cGUgc29wLAogCQl1OCAqYnVmLCBzaXplX3QgbGVuKQogewpAQCAtNzQ1LDIxICsxMDExLDI3IEBACiAJaWYgKFBEX01TR19IRFJfUkVWKGhlYWRlcikgPCBwZC0+c3BlY19yZXYpCiAJCXBkLT5zcGVjX3JldiA9IFBEX01TR19IRFJfUkVWKGhlYWRlcik7CiAKLQlyeF9tc2cgPSBremFsbG9jKHNpemVvZigqcnhfbXNnKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF9tc2cpCi0JCXJldHVybjsKKwl1c2JwZF9kYmcoJnBkLT5kZXYsICJyZWNlaXZlZCBtZXNzYWdlOiB0eXBlKCVkKSBudW1fb2JqcyglZClcbiIsCisJCQlQRF9NU0dfSERSX1RZUEUoaGVhZGVyKSwgUERfTVNHX0hEUl9DT1VOVChoZWFkZXIpKTsKIAotCXJ4X21zZy0+dHlwZSA9IFBEX01TR19IRFJfVFlQRShoZWFkZXIpOwotCXJ4X21zZy0+bGVuID0gUERfTVNHX0hEUl9DT1VOVChoZWFkZXIpOwotCW1lbWNweSgmcnhfbXNnLT5wYXlsb2FkLCBidWYsIG1pbihsZW4sIHNpemVvZihyeF9tc2ctPnBheWxvYWQpKSk7CisJaWYgKCFQRF9NU0dfSERSX0lTX0VYVEVOREVEKGhlYWRlcikpIHsKKwkJcnhfbXNnID0ga3phbGxvYyhzaXplb2YoKnJ4X21zZykgKyBsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXJ4X21zZykKKwkJCXJldHVybjsKKworCQlyeF9tc2ctPmhkciA9IGhlYWRlcjsKKwkJcnhfbXNnLT5kYXRhX2xlbiA9IGxlbjsKKwkJbWVtY3B5KHJ4X21zZy0+cGF5bG9hZCwgYnVmLCBsZW4pOworCX0gZWxzZSB7CisJCXJ4X21zZyA9IHBkX2V4dF9tc2dfcmVjZWl2ZWQocGQsIGhlYWRlciwgYnVmLCBsZW4sIHNvcCk7CisJCWlmICghcnhfbXNnKQorCQkJcmV0dXJuOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+cnhfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJnJ4X21zZy0+ZW50cnksICZwZC0+cnhfcSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPnJ4X2xvY2ssIGZsYWdzKTsKIAotCXVzYnBkX2RiZygmcGQtPmRldiwgInJlY2VpdmVkIG1lc3NhZ2U6IHR5cGUoJWQpIGxlbiglZClcbiIsCi0JCQlyeF9tc2ctPnR5cGUsIHJ4X21zZy0+bGVuKTsKLQogCWtpY2tfc20ocGQsIDApOwogfQogCkBAIC0xMDM1LDcgKzEzMDcsNyBAQAogCQlwZC0+Y3VycmVudF92b2x0YWdlID0gcGQtPnJlcXVlc3RlZF92b2x0YWdlID0gNTAwMDAwMDsKIAkJdmFsLmludHZhbCA9IHBkLT5yZXF1ZXN0ZWRfdm9sdGFnZTsgLyogc2V0IG1heCByYW5nZSB0byA1ViAqLwogCQlwb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5KHBkLT51c2JfcHN5LAotCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYLCAmdmFsKTsKKwkJCQlQT1dFUl9TVVBQTFlfUFJPUF9QRF9WT0xUQUdFX01BWCwgJnZhbCk7CiAKIAkJaWYgKCFwZC0+dmJ1c19wcmVzZW50KSB7CiAJCQlwZC0+Y3VycmVudF9zdGF0ZSA9IFBFX1NOS19ESVNDT1ZFUlk7CkBAIC0xMTQ2LDkgKzE0MTgsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdXNicGRfZGJnKCZwZC0+ZGV2LCAicmVnaXN0ZXJlZCBoYW5kbGVyIGZvciBTVklEIDB4JTA0eFxuIiwgaGRsci0+c3ZpZCk7Ci0KKwl1c2JwZF9kYmcoJnBkLT5kZXYsICJyZWdpc3RlcmVkIGhhbmRsZXIoJXBLKSBmb3IgU1ZJRCAweCUwNHhcbiIsCisJCQkJCQkJaGRsciwgaGRsci0+c3ZpZCk7CisJbXV0ZXhfbG9jaygmcGQtPnN2aWRfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZoZGxyLT5lbnRyeSwgJnBkLT5zdmlkX2hhbmRsZXJzKTsKKwltdXRleF91bmxvY2soJnBkLT5zdmlkX2hhbmRsZXJfbG9jayk7CiAJaGRsci0+cmVxdWVzdF91c2Jfc3NfbGFuZSA9IHVzYnBkX3JlbGVhc2Vfc3NfbGFuZTsKIAogCS8qIGFscmVhZHkgY29ubmVjdGVkIHdpdGggdGhpcyBTVklEIGRpc2NvdmVyZWQ/ICovCkBAIC0xMTcwLDcgKzE0NDQsMTIgQEAKIAogdm9pZCB1c2JwZF91bnJlZ2lzdGVyX3N2aWQoc3RydWN0IHVzYnBkICpwZCwgc3RydWN0IHVzYnBkX3N2aWRfaGFuZGxlciAqaGRscikKIHsKKworCXVzYnBkX2RiZygmcGQtPmRldiwgInVucmVnaXN0ZXJlZCBoYW5kbGVyKCVwSykgZm9yIFNWSUQgMHglMDR4XG4iLAorCQkJCQkJCWhkbHIsIGhkbHItPnN2aWQpOworCW11dGV4X2xvY2soJnBkLT5zdmlkX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmaGRsci0+ZW50cnkpOworCW11dGV4X3VubG9jaygmcGQtPnN2aWRfaGFuZGxlcl9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0wodXNicGRfdW5yZWdpc3Rlcl9zdmlkKTsKIApAQCAtMTIxNSwxMSArMTQ5NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBoYW5kbGVfdmRtX3J4KHN0cnVjdCB1c2JwZCAqcGQsIHN0cnVjdCByeF9tc2cgKnJ4X21zZykKIHsKLQl1MzIgdmRtX2hkciA9IHJ4X21zZy0+cGF5bG9hZFswXTsKLQl1MzIgKnZkb3MgPSAmcnhfbXNnLT5wYXlsb2FkWzFdOworCXUzMiB2ZG1faGRyID0KKwlyeF9tc2ctPmRhdGFfbGVuID49IHNpemVvZih1MzIpID8gKCh1MzIgKilyeF9tc2ctPnBheWxvYWQpWzBdIDogMDsKKworCXUzMiAqdmRvcyA9ICh1MzIgKikmcnhfbXNnLT5wYXlsb2FkW3NpemVvZih1MzIpXTsKIAl1MTYgc3ZpZCA9IFZETV9IRFJfU1ZJRCh2ZG1faGRyKTsKIAl1MTYgKnBzdmlkOwotCXU4IGksIG51bV92ZG9zID0gcnhfbXNnLT5sZW4gLSAxOwkvKiBudW0gb2JqZWN0cyBtaW51cyBoZWFkZXIgKi8KKwl1OCBpLCBudW1fdmRvcyA9IFBEX01TR19IRFJfQ09VTlQocnhfbXNnLT5oZHIpIC0gMTsKIAl1OCBjbWQgPSBTVkRNX0hEUl9DTUQodmRtX2hkcik7CiAJdTggY21kX3R5cGUgPSBTVkRNX0hEUl9DTURfVFlQRSh2ZG1faGRyKTsKIAlib29sIGhhc19kcCA9IGZhbHNlOwpAQCAtMTQ3OSw2ICsxNzYwLDcgQEAKIHsKIAlzdHJ1Y3QgdXNicGRfc3ZpZF9oYW5kbGVyICpoYW5kbGVyOwogCisJbXV0ZXhfbG9jaygmcGQtPnN2aWRfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZXIsICZwZC0+c3ZpZF9oYW5kbGVycywgZW50cnkpIHsKIAkJaWYgKGhhbmRsZXItPmRpc2NvdmVyZWQpIHsKIAkJCWhhbmRsZXItPmRpc2Nvbm5lY3QoaGFuZGxlcik7CkBAIC0xNDg2LDYgKzE3NjgsNyBAQAogCQl9CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZwZC0+c3ZpZF9oYW5kbGVyX2xvY2spOwogCXBkLT52ZG1fc3RhdGUgPSBWRE1fTk9ORTsKIAlrZnJlZShwZC0+dmRtX3R4X3JldHJ5KTsKIAlwZC0+dmRtX3R4X3JldHJ5ID0gTlVMTDsKQEAgLTE3MjcsNyArMjAxMCw3IEBACiAJCXBkLT5yZXF1ZXN0ZWRfdm9sdGFnZSA9IDUwMDAwMDA7CiAJCXZhbC5pbnR2YWwgPSBwZC0+cmVxdWVzdGVkX3ZvbHRhZ2U7CiAJCXBvd2VyX3N1cHBseV9zZXRfcHJvcGVydHkocGQtPnVzYl9wc3ksCi0JCQkJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4sICZ2YWwpOworCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUlOLCAmdmFsKTsKIAogCQlwZC0+aW5fcHJfc3dhcCA9IGZhbHNlOwogCQl2YWwuaW50dmFsID0gMDsKQEAgLTE4MjEsNyArMjEwNCw3IEBACiAKIAljYXNlIFBFX1NSQ19TRU5EX0NBUEFCSUxJVElFU19XQUlUOgogCQlpZiAoSVNfREFUQShyeF9tc2csIE1TR19SRVFVRVNUKSkgewotCQkJcGQtPnJkbyA9IHJ4X21zZy0+cGF5bG9hZFswXTsKKwkJCXBkLT5yZG8gPSAqKHUzMiAqKXJ4X21zZy0+cGF5bG9hZDsKIAkJCXVzYnBkX3NldF9zdGF0ZShwZCwgUEVfU1JDX05FR09USUFURV9DQVBBQklMSVRZKTsKIAkJfSBlbHNlIGlmIChyeF9tc2cpIHsKIAkJCXVzYnBkX2VycigmcGQtPmRldiwgIlVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZFxuIik7CkBAIC0xODQ0LDcgKzIxMjcsNyBAQAogCQkJCXVzYnBkX3NldF9zdGF0ZShwZCwgUEVfU1JDX1NFTkRfU09GVF9SRVNFVCk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoSVNfREFUQShyeF9tc2csIE1TR19SRVFVRVNUKSkgewotCQkJcGQtPnJkbyA9IHJ4X21zZy0+cGF5bG9hZFswXTsKKwkJCXBkLT5yZG8gPSAqKHUzMiAqKXJ4X21zZy0+cGF5bG9hZDsKIAkJCXVzYnBkX3NldF9zdGF0ZShwZCwgUEVfU1JDX05FR09USUFURV9DQVBBQklMSVRZKTsKIAkJfSBlbHNlIGlmIChJU19DVFJMKHJ4X21zZywgTVNHX0RSX1NXQVApKSB7CiAJCQlpZiAocGQtPnZkbV9zdGF0ZSA9PSBNT0RFX0VOVEVSRUQpIHsKQEAgLTE4ODYsNiArMjE2OSwxNSBAQAogCQkJdmNvbm5fc3dhcChwZCk7CiAJCX0gZWxzZSBpZiAoSVNfREFUQShyeF9tc2csIE1TR19WRE0pKSB7CiAJCQloYW5kbGVfdmRtX3J4KHBkLCByeF9tc2cpOworCQl9IGVsc2UgaWYgKHJ4X21zZyAmJiBwZC0+c3BlY19yZXYgPT0gVVNCUERfUkVWXzMwKSB7CisJCQkvKiB1bmhhbmRsZWQgbWVzc2FnZXMgKi8KKwkJCXJldCA9IHBkX3NlbmRfbXNnKHBkLCBNU0dfTk9UX1NVUFBPUlRFRCwgTlVMTCwgMCwKKwkJCQkJU09QX01TRyk7CisJCQlpZiAocmV0KSB7CisJCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiRXJyb3Igc2VuZGluZyBOb3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQl1c2JwZF9zZXRfc3RhdGUocGQsIFBFX1NSQ19TRU5EX1NPRlRfUkVTRVQpOworCQkJfQorCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAocGQtPnNlbmRfcHJfc3dhcCkgewogCQkJcGQtPnNlbmRfcHJfc3dhcCA9IGZhbHNlOwogCQkJcmV0ID0gcGRfc2VuZF9tc2cocGQsIE1TR19QUl9TV0FQLCBOVUxMLCAwLCBTT1BfTVNHKTsKQEAgLTIwMzksOCArMjMzMSw4IEBACiAJCQl2YWwuaW50dmFsID0gcGQtPnJlcXVlc3RlZF92b2x0YWdlOwogCQkJcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShwZC0+dXNiX3BzeSwKIAkJCQlwZC0+cmVxdWVzdGVkX3ZvbHRhZ2UgPj0gcGQtPmN1cnJlbnRfdm9sdGFnZSA/Ci0JCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYIDoKLQkJCQkJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4sCisJCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUFYIDoKKwkJCQkJUE9XRVJfU1VQUExZX1BST1BfUERfVk9MVEFHRV9NSU4sCiAJCQkJCSZ2YWwpOwogCiAJCQkvKgpAQCAtMjA5MSw4ICsyMzgzLDggQEAKIAkJCXZhbC5pbnR2YWwgPSBwZC0+cmVxdWVzdGVkX3ZvbHRhZ2U7CiAJCQlwb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5KHBkLT51c2JfcHN5LAogCQkJCXBkLT5yZXF1ZXN0ZWRfdm9sdGFnZSA+PSBwZC0+Y3VycmVudF92b2x0YWdlID8KLQkJCQkJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4gOgotCQkJCQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCwgJnZhbCk7CisJCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUlOIDoKKwkJCQkJUE9XRVJfU1VQUExZX1BST1BfUERfVk9MVEFHRV9NQVgsICZ2YWwpOwogCQkJcGQtPmN1cnJlbnRfdm9sdGFnZSA9IHBkLT5yZXF1ZXN0ZWRfdm9sdGFnZTsKIAogCQkJLyogcmVzdW1lIGNoYXJnaW5nICovCkBAIC0yMTIzLDcgKzI0MTUsOCBAQAogCQkJCXVzYnBkX2VycigmcGQtPmRldiwgIkVycm9yIHNlbmRpbmcgU2luayBDYXBzXG4iKTsKIAkJCQl1c2JwZF9zZXRfc3RhdGUocGQsIFBFX1NOS19TRU5EX1NPRlRfUkVTRVQpOwogCQkJfQotCQl9IGVsc2UgaWYgKElTX0NUUkwocnhfbXNnLCBNU0dfR0VUX1NPVVJDRV9DQVApKSB7CisJCX0gZWxzZSBpZiAoSVNfQ1RSTChyeF9tc2csIE1TR19HRVRfU09VUkNFX0NBUCkgJiYKKwkJCQlwZC0+c3BlY19yZXYgPT0gVVNCUERfUkVWXzIwKSB7CiAJCQlyZXQgPSBwZF9zZW5kX21zZyhwZCwgTVNHX1NPVVJDRV9DQVBBQklMSVRJRVMsCiAJCQkJCWRlZmF1bHRfc3JjX2NhcHMsCiAJCQkJCUFSUkFZX1NJWkUoZGVmYXVsdF9zcmNfY2FwcyksIFNPUF9NU0cpOwpAQCAtMjE0Niw3ICsyNDM5LDggQEAKIAkJCX0KIAogCQkJZHJfc3dhcChwZCk7Ci0JCX0gZWxzZSBpZiAoSVNfQ1RSTChyeF9tc2csIE1TR19QUl9TV0FQKSkgeworCQl9IGVsc2UgaWYgKElTX0NUUkwocnhfbXNnLCBNU0dfUFJfU1dBUCkgJiYKKwkJCQlwZC0+c3BlY19yZXYgPT0gVVNCUERfUkVWXzIwKSB7CiAJCQkvKiBsb2NrIGluIGN1cnJlbnQgbW9kZSAqLwogCQkJc2V0X3Bvd2VyX3JvbGUocGQsIHBkLT5jdXJyZW50X3ByKTsKIApAQCAtMjE2NCw3ICsyNDU4LDggQEAKIAkJCQkJUE9XRVJfU1VQUExZX1BST1BfUFJfU1dBUCwgJnZhbCk7CiAJCQl1c2JwZF9zZXRfc3RhdGUocGQsIFBFX1BSU19TTktfU1JDX1RSQU5TSVRJT05fVE9fT0ZGKTsKIAkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKElTX0NUUkwocnhfbXNnLCBNU0dfVkNPTk5fU1dBUCkpIHsKKwkJfSBlbHNlIGlmIChJU19DVFJMKHJ4X21zZywgTVNHX1ZDT05OX1NXQVApICYmCisJCQkJcGQtPnNwZWNfcmV2ID09IFVTQlBEX1JFVl8yMCkgewogCQkJLyoKIAkJCSAqIGlmIFZDT05OIGlzIGNvbm5lY3RlZCB0byBWQlVTLCBtYWtlIHN1cmUgd2UgYXJlCiAJCQkgKiBub3QgaW4gaGlnaCB2b2x0YWdlIGNvbnRyYWN0LCBvdGhlcndpc2UgcmVqZWN0LgpAQCAtMjE5Miw2ICsyNDg3LDEyMCBAQAogCQkJdmNvbm5fc3dhcChwZCk7CiAJCX0gZWxzZSBpZiAoSVNfREFUQShyeF9tc2csIE1TR19WRE0pKSB7CiAJCQloYW5kbGVfdmRtX3J4KHBkLCByeF9tc2cpOworCQl9IGVsc2UgaWYgKHBkLT5zZW5kX2dldF9zcmNfY2FwX2V4dCAmJiBpc19zaW5rX3R4X29rKHBkKSkgeworCQkJcGQtPnNlbmRfZ2V0X3NyY19jYXBfZXh0ID0gZmFsc2U7CisJCQlyZXQgPSBwZF9zZW5kX21zZyhwZCwgTVNHX0dFVF9TT1VSQ0VfQ0FQX0VYVEVOREVELCBOVUxMLAorCQkJCTAsIFNPUF9NU0cpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoJnBkLT5kZXYsCisJCQkJCSJFcnJvciBzZW5kaW5nIGdldF9zcmNfY2FwX2V4dFxuIik7CisJCQkJdXNicGRfc2V0X3N0YXRlKHBkLCBQRV9TTktfU0VORF9TT0ZUX1JFU0VUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWtpY2tfc20ocGQsIFNFTkRFUl9SRVNQT05TRV9USU1FKTsKKwkJfSBlbHNlIGlmIChyeF9tc2cgJiYKKwkJCUlTX0VYVChyeF9tc2csIE1TR19TT1VSQ0VfQ0FQQUJJTElUSUVTX0VYVEVOREVEKSkgeworCQkJaWYgKHJ4X21zZy0+ZGF0YV9sZW4gIT0gUERfU1JDX0NBUF9FWFRfREJfTEVOKSB7CisJCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiSW52YWxpZCBzcmMgY2FwIGV4dCBkYlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoJnBkLT5zcmNfY2FwX2V4dF9kYiwgcnhfbXNnLT5wYXlsb2FkLAorCQkJCXNpemVvZihwZC0+c3JjX2NhcF9leHRfZGIpKTsKKwkJCWNvbXBsZXRlKCZwZC0+aXNfcmVhZHkpOworCQl9IGVsc2UgaWYgKHBkLT5zZW5kX2dldF9wcHNfc3RhdHVzICYmIGlzX3NpbmtfdHhfb2socGQpKSB7CisJCQlwZC0+c2VuZF9nZXRfcHBzX3N0YXR1cyA9IGZhbHNlOworCQkJcmV0ID0gcGRfc2VuZF9tc2cocGQsIE1TR19HRVRfUFBTX1NUQVRVUywgTlVMTCwKKwkJCQkwLCBTT1BfTVNHKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZC0+ZGV2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBnZXRfcHBzX3N0YXR1c1xuIik7CisJCQkJdXNicGRfc2V0X3N0YXRlKHBkLCBQRV9TTktfU0VORF9TT0ZUX1JFU0VUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWtpY2tfc20ocGQsIFNFTkRFUl9SRVNQT05TRV9USU1FKTsKKwkJfSBlbHNlIGlmIChyeF9tc2cgJiYKKwkJCUlTX0VYVChyeF9tc2csIE1TR19QUFNfU1RBVFVTKSkgeworCQkJaWYgKHJ4X21zZy0+ZGF0YV9sZW4gIT0gc2l6ZW9mKHBkLT5wcHNfc3RhdHVzX2RiKSkgeworCQkJCXVzYnBkX2VycigmcGQtPmRldiwgIkludmFsaWQgcHBzIHN0YXR1cyBkYlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoJnBkLT5wcHNfc3RhdHVzX2RiLCByeF9tc2ctPnBheWxvYWQsCisJCQkJc2l6ZW9mKHBkLT5wcHNfc3RhdHVzX2RiKSk7CisJCQljb21wbGV0ZSgmcGQtPmlzX3JlYWR5KTsKKwkJfSBlbHNlIGlmIChJU19EQVRBKHJ4X21zZywgTVNHX0FMRVJUKSkgeworCQkJaWYgKHJ4X21zZy0+ZGF0YV9sZW4gIT0gc2l6ZW9mKHBkLT5yZWNlaXZlZF9hZG8pKSB7CisJCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiSW52YWxpZCBhZG9cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZwZC0+cmVjZWl2ZWRfYWRvLCByeF9tc2ctPnBheWxvYWQsCisJCQkJc2l6ZW9mKHBkLT5yZWNlaXZlZF9hZG8pKTsKKwkJCXJldCA9IHBkX3NlbmRfbXNnKHBkLCBNU0dfR0VUX1NUQVRVUywgTlVMTCwKKwkJCQkwLCBTT1BfTVNHKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZC0+ZGV2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBnZXRfc3RhdHVzXG4iKTsKKwkJCQl1c2JwZF9zZXRfc3RhdGUocGQsIFBFX1NOS19TRU5EX1NPRlRfUkVTRVQpOworCQkJCWJyZWFrOworCQkJfQorCQkJa2lja19zbShwZCwgU0VOREVSX1JFU1BPTlNFX1RJTUUpOworCQl9IGVsc2UgaWYgKHJ4X21zZyAmJgorCQkJSVNfRVhUKHJ4X21zZywgTVNHX1NUQVRVUykpIHsKKwkJCWlmIChyeF9tc2ctPmRhdGFfbGVuICE9IFBEX1NUQVRVU19EQl9MRU4pIHsKKwkJCQl1c2JwZF9lcnIoJnBkLT5kZXYsICJJbnZhbGlkIHN0YXR1cyBkYlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoJnBkLT5zdGF0dXNfZGIsIHJ4X21zZy0+cGF5bG9hZCwKKwkJCQlzaXplb2YocGQtPnN0YXR1c19kYikpOworCQkJa29iamVjdF91ZXZlbnQoJnBkLT5kZXYua29iaiwgS09CSl9DSEFOR0UpOworCQl9IGVsc2UgaWYgKHBkLT5zZW5kX2dldF9iYXR0ZXJ5X2NhcCAmJiBpc19zaW5rX3R4X29rKHBkKSkgeworCQkJcGQtPnNlbmRfZ2V0X2JhdHRlcnlfY2FwID0gZmFsc2U7CisJCQlyZXQgPSBwZF9zZW5kX2V4dF9tc2cocGQsIE1TR19HRVRfQkFUVEVSWV9DQVAsCisJCQkJJnBkLT5nZXRfYmF0dGVyeV9jYXBfZGIsIDEsIFNPUF9NU0cpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoJnBkLT5kZXYsCisJCQkJCSJFcnJvciBzZW5kaW5nIGdldF9iYXR0ZXJ5X2NhcFxuIik7CisJCQkJdXNicGRfc2V0X3N0YXRlKHBkLCBQRV9TTktfU0VORF9TT0ZUX1JFU0VUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWtpY2tfc20ocGQsIFNFTkRFUl9SRVNQT05TRV9USU1FKTsKKwkJfSBlbHNlIGlmIChyeF9tc2cgJiYKKwkJCUlTX0VYVChyeF9tc2csIE1TR19CQVRURVJZX0NBUEFCSUxJVElFUykpIHsKKwkJCWlmIChyeF9tc2ctPmRhdGFfbGVuICE9IFBEX0JBVFRFUllfQ0FQX0RCX0xFTikgeworCQkJCXVzYnBkX2VycigmcGQtPmRldiwgIkludmFsaWQgYmF0dGVyeSBjYXAgZGJcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZwZC0+YmF0dGVyeV9jYXBfZGIsIHJ4X21zZy0+cGF5bG9hZCwKKwkJCQlzaXplb2YocGQtPmJhdHRlcnlfY2FwX2RiKSk7CisJCQljb21wbGV0ZSgmcGQtPmlzX3JlYWR5KTsKKwkJfSBlbHNlIGlmIChwZC0+c2VuZF9nZXRfYmF0dGVyeV9zdGF0dXMgJiYgaXNfc2lua190eF9vayhwZCkpIHsKKwkJCXBkLT5zZW5kX2dldF9iYXR0ZXJ5X3N0YXR1cyA9IGZhbHNlOworCQkJcmV0ID0gcGRfc2VuZF9leHRfbXNnKHBkLCBNU0dfR0VUX0JBVFRFUllfU1RBVFVTLAorCQkJCSZwZC0+Z2V0X2JhdHRlcnlfc3RhdHVzX2RiLCAxLCBTT1BfTVNHKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZwZC0+ZGV2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBnZXRfYmF0dGVyeV9zdGF0dXNcbiIpOworCQkJCXVzYnBkX3NldF9zdGF0ZShwZCwgUEVfU05LX1NFTkRfU09GVF9SRVNFVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlraWNrX3NtKHBkLCBTRU5ERVJfUkVTUE9OU0VfVElNRSk7CisJCX0gZWxzZSBpZiAocnhfbXNnICYmCisJCQlJU19FWFQocnhfbXNnLCBNU0dfQkFUVEVSWV9TVEFUVVMpKSB7CisJCQlpZiAocnhfbXNnLT5kYXRhX2xlbiAhPSBzaXplb2YocGQtPmJhdHRlcnlfc3RzX2RvYmopKSB7CisJCQkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiSW52YWxpZCBiYXQgc3RzIGRvYmpcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZwZC0+YmF0dGVyeV9zdHNfZG9iaiwgcnhfbXNnLT5wYXlsb2FkLAorCQkJCXNpemVvZihwZC0+YmF0dGVyeV9zdHNfZG9iaikpOworCQkJY29tcGxldGUoJnBkLT5pc19yZWFkeSk7CisJCX0gZWxzZSBpZiAocnhfbXNnICYmIHBkLT5zcGVjX3JldiA9PSBVU0JQRF9SRVZfMzApIHsKKwkJCS8qIHVuaGFuZGxlZCBtZXNzYWdlcyAqLworCQkJcmV0ID0gcGRfc2VuZF9tc2cocGQsIE1TR19OT1RfU1VQUE9SVEVELCBOVUxMLCAwLAorCQkJCQlTT1BfTVNHKTsKKwkJCWlmIChyZXQpIHsKKwkJCQl1c2JwZF9lcnIoJnBkLT5kZXYsICJFcnJvciBzZW5kaW5nIE5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXVzYnBkX3NldF9zdGF0ZShwZCwgUEVfU05LX1NFTkRfU09GVF9SRVNFVCk7CisJCQl9CisJCQlicmVhazsKIAkJfSBlbHNlIGlmIChwZC0+c2VuZF9yZXF1ZXN0KSB7CiAJCQlwZC0+c2VuZF9yZXF1ZXN0ID0gZmFsc2U7CiAJCQl1c2JwZF9zZXRfc3RhdGUocGQsIFBFX1NOS19TRUxFQ1RfQ0FQQUJJTElUWSk7CkBAIC0yMjc0LDcgKzI2ODMsNyBAQAogCiAJCXZhbC5pbnR2YWwgPSBwZC0+cmVxdWVzdGVkX3ZvbHRhZ2U7CiAJCXBvd2VyX3N1cHBseV9zZXRfcHJvcGVydHkocGQtPnVzYl9wc3ksCi0JCQkJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4sICZ2YWwpOworCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1BEX1ZPTFRBR0VfTUlOLCAmdmFsKTsKIAogCQlwZF9zZW5kX2hhcmRfcmVzZXQocGQpOwogCQlwZC0+aW5fZXhwbGljaXRfY29udHJhY3QgPSBmYWxzZTsKQEAgLTI4MjgsNiArMzIzNywxMCBAQAogCQkJCSJleHBsaWNpdCIgOiAiaW1wbGljaXQiKTsKIAlhZGRfdWV2ZW50X3ZhcihlbnYsICJBTFRfTU9ERT0lZCIsIHBkLT52ZG1fc3RhdGUgPT0gTU9ERV9FTlRFUkVEKTsKIAorCWFkZF91ZXZlbnRfdmFyKGVudiwgIkFETz0lMDh4IiwgcGQtPnJlY2VpdmVkX2Fkbyk7CisJZm9yIChpID0gMDsgaSA8IFBEX1NUQVRVU19EQl9MRU47IGkrKykKKwkJYWRkX3VldmVudF92YXIoZW52LCAiU0RCJWQ9JTA4eCIsIGksIHBkLT5zdGF0dXNfZGJbaV0pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxNzUsNiArMzU4OCwxNDUgQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9XTyhoYXJkX3Jlc2V0KTsKIAorc3RhdGljIGludCB0cmlnZ2VyX3R4X21zZyhzdHJ1Y3QgdXNicGQgKnBkLCBib29sICptc2dfdHhfZmxhZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qIE9ubHkgYWxsb3dlZCBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBleHBsaWNpdCBzaW5rIGNvbnRyYWN0ICovCisJaWYgKHBkLT5jdXJyZW50X3N0YXRlICE9IFBFX1NOS19SRUFEWSB8fCAhaXNfc2lua190eF9vayhwZCkpIHsKKwkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiJXM6IENhbm5vdCBzZW5kIG1zZ1xuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXJlaW5pdF9jb21wbGV0aW9uKCZwZC0+aXNfcmVhZHkpOworCSptc2dfdHhfZmxhZyA9IHRydWU7CisJa2lja19zbShwZCwgMCk7CisKKwkvKiB3YWl0IGZvciBvcGVyYXRpb24gdG8gY29tcGxldGUgKi8KKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcGQtPmlzX3JlYWR5LAorCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSkpIHsKKwkJdXNicGRfZXJyKCZwZC0+ZGV2LCAiJXM6IHJlcXVlc3QgdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfQorCitvdXQ6CisJKm1zZ190eF9mbGFnID0gZmFsc2U7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfc3JjX2NhcF9leHRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGksIHJldCwgbGVuID0gMDsKKwlzdHJ1Y3QgdXNicGQgKnBkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAocGQtPnNwZWNfcmV2ID09IFVTQlBEX1JFVl8yMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0cmlnZ2VyX3R4X21zZyhwZCwgJnBkLT5zZW5kX2dldF9zcmNfY2FwX2V4dCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBQRF9TUkNfQ0FQX0VYVF9EQl9MRU47IGkrKykKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJWRcbiIsCisJCQlwZC0+c3JjX2NhcF9leHRfZGJbaV0pOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZ2V0X3NyY19jYXBfZXh0KTsKKworc3RhdGljIHNzaXplX3QgZ2V0X3Bwc19zdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNicGQgKnBkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAocGQtPnNwZWNfcmV2ID09IFVTQlBEX1JFVl8yMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB0cmlnZ2VyX3R4X21zZyhwZCwgJnBkLT5zZW5kX2dldF9wcHNfc3RhdHVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHBkLT5wcHNfc3RhdHVzX2RiKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhnZXRfcHBzX3N0YXR1cyk7CisKK3N0YXRpYyBzc2l6ZV90IHJ4X2Fkb19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNicGQgKnBkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiBkdW1wIHRoZSBBRE8gYXMgYSBoZXggc3RyaW5nICovCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJTA4eFxuIiwgcGQtPnJlY2VpdmVkX2Fkbyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocnhfYWRvKTsKKworc3RhdGljIHNzaXplX3QgZ2V0X2JhdHRlcnlfY2FwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHVzYnBkICpwZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB2YWwsIHJldDsKKworCWlmIChwZC0+c3BlY19yZXYgPT0gVVNCUERfUkVWXzIwIHx8IHNzY2FuZihidWYsICIlZFxuIiwgJnZhbCkgIT0gMSkgeworCQlwZC0+Z2V0X2JhdHRlcnlfY2FwX2RiID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGQtPmdldF9iYXR0ZXJ5X2NhcF9kYiA9IHZhbDsKKworCXJldCA9IHRyaWdnZXJfdHhfbXNnKHBkLCAmcGQtPnNlbmRfZ2V0X2JhdHRlcnlfY2FwKTsKKworCXJldHVybiByZXQgPyByZXQgOiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfYmF0dGVyeV9jYXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGksIGxlbiA9IDA7CisJc3RydWN0IHVzYnBkICpwZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKHBkLT5nZXRfYmF0dGVyeV9jYXBfZGIgPT0gLUVJTlZBTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgUERfQkFUVEVSWV9DQVBfREJfTEVOOyBpKyspCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbiwgIiVkXG4iLAorCQkJcGQtPmJhdHRlcnlfY2FwX2RiW2ldKTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKGdldF9iYXR0ZXJ5X2NhcCk7CisKK3N0YXRpYyBzc2l6ZV90IGdldF9iYXR0ZXJ5X3N0YXR1c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCB1c2JwZCAqcGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdmFsLCByZXQ7CisKKwlpZiAocGQtPnNwZWNfcmV2ID09IFVTQlBEX1JFVl8yMCB8fCBzc2NhbmYoYnVmLCAiJWRcbiIsICZ2YWwpICE9IDEpIHsKKwkJcGQtPmdldF9iYXR0ZXJ5X3N0YXR1c19kYiA9IC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkLT5nZXRfYmF0dGVyeV9zdGF0dXNfZGIgPSB2YWw7CisKKwlyZXQgPSB0cmlnZ2VyX3R4X21zZyhwZCwgJnBkLT5zZW5kX2dldF9iYXR0ZXJ5X3N0YXR1cyk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2JhdHRlcnlfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2JwZCAqcGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChwZC0+Z2V0X2JhdHRlcnlfc3RhdHVzX2RiID09IC1FSU5WQUwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHBkLT5iYXR0ZXJ5X3N0c19kb2JqKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhnZXRfYmF0dGVyeV9zdGF0dXMpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdXNicGRfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfY29udHJhY3QuYXR0ciwKIAkmZGV2X2F0dHJfaW5pdGlhbF9wci5hdHRyLApAQCAtMzE5NCw2ICszNzQ2LDExIEBACiAJJmRldl9hdHRyX3Jkby5hdHRyLAogCSZkZXZfYXR0cl9yZG9faC5hdHRyLAogCSZkZXZfYXR0cl9oYXJkX3Jlc2V0LmF0dHIsCisJJmRldl9hdHRyX2dldF9zcmNfY2FwX2V4dC5hdHRyLAorCSZkZXZfYXR0cl9nZXRfcHBzX3N0YXR1cy5hdHRyLAorCSZkZXZfYXR0cl9yeF9hZG8uYXR0ciwKKwkmZGV2X2F0dHJfZ2V0X2JhdHRlcnlfY2FwLmF0dHIsCisJJmRldl9hdHRyX2dldF9iYXR0ZXJ5X3N0YXR1cy5hdHRyLAogCU5VTEwsCiB9OwogQVRUUklCVVRFX0dST1VQUyh1c2JwZCk7CkBAIC0zMzExLDYgKzM4NjgsNyBAQAogCWhydGltZXJfaW5pdCgmcGQtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXBkLT50aW1lci5mdW5jdGlvbiA9IHBkX3RpbWVvdXQ7CiAJbXV0ZXhfaW5pdCgmcGQtPnN3YXBfbG9jayk7CisJbXV0ZXhfaW5pdCgmcGQtPnN2aWRfaGFuZGxlcl9sb2NrKTsKIAogCXBkLT51c2JfcHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKCJ1c2IiKTsKIAlpZiAoIXBkLT51c2JfcHN5KSB7CkBAIC0zNDMyLDYgKzM5OTAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwZC0+cnhfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJnBkLT5zdmlkX2hhbmRsZXJzKTsKIAlpbml0X2NvbXBsZXRpb24oJnBkLT5pc19yZWFkeSk7CisJaW5pdF9jb21wbGV0aW9uKCZwZC0+dHhfY2h1bmtfcmVxdWVzdCk7CiAKIAlwZC0+cHN5X25iLm5vdGlmaWVyX2NhbGwgPSBwc3lfY2hhbmdlZDsKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnX25vdGlmaWVyKCZwZC0+cHN5X25iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXF1c2ItdjIuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXF1c2ItdjIuYwppbmRleCAzN2Q5MDRmLi42OGJkNTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS1xdXNiLXYyLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tcXVzYi12Mi5jCkBAIC02Myw2ICs2MywxNyBAQAogI2RlZmluZSBMSU5FU1RBVEVfRFAJCQlCSVQoMCkKICNkZWZpbmUgTElORVNUQVRFX0RNCQkJQklUKDEpCiAKKy8qIGV1ZCByZWxhdGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBFVURfU1dfQVRUQUNIX0RFVAkweDEwMTgKKyNkZWZpbmUgRVVEX0lOVDFfRU5fTUFTSwkweDAwMjQKKworLyogRVVEIGludGVycnVwdCBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgRVVEX0lOVF9SWAkJQklUKDApCisjZGVmaW5lIEVVRF9JTlRfVFgJCUJJVCgxKQorI2RlZmluZSBFVURfSU5UX1ZCVVMJCUJJVCgyKQorI2RlZmluZSBFVURfSU5UX0NIR1IJCUJJVCgzKQorI2RlZmluZSBFVURfSU5UX1NBRkVfTU9ERQlCSVQoNCkKKwogdW5zaWduZWQgaW50IHBoeV90dW5lMTsKIG1vZHVsZV9wYXJhbShwaHlfdHVuZTEsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwaHlfdHVuZTEsICJRVVNCIFBIWSB2MiBUVU5FMSIpOwpAQCAtODEsNiArOTIsNyBAQAogCXN0cnVjdCB1c2JfcGh5CQlwaHk7CiAJc3RydWN0IG11dGV4CQlsb2NrOwogCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdm9pZCBfX2lvbWVtCQkqZXVkX2Jhc2U7CiAJdm9pZCBfX2lvbWVtCQkqZWZ1c2VfcmVnOwogCiAJc3RydWN0IGNsawkJKnJlZl9jbGtfc3JjOwpAQCAtNTcyLDExICs1ODQsMTUgQEAKIAkJCQlxcGh5LT5iYXNlICsKIAkJCQlxcGh5LT5waHlfcmVnW1BMTF9DT1JFX0lOUFVUX09WRVJSSURFXSk7CiAKLQkJCS8qIGVuYWJsZSBwaHkgYXV0by1yZXN1bWUgKi8KLQkJCXdyaXRlbF9yZWxheGVkKDB4OTEsIHFwaHktPmJhc2UgKyBxcGh5LT5waHlfcmVnW1RFU1QxXSk7Ci0JCQkvKiBmbHVzaCB0aGUgcHJldmlvdXMgd3JpdGUgYmVmb3JlIG5leHQgd3JpdGUgKi8KLQkJCXdtYigpOwotCQkJd3JpdGVsX3JlbGF4ZWQoMHg5MCwgcXBoeS0+YmFzZSArIHFwaHktPnBoeV9yZWdbVEVTVDFdKTsKKwkJCWlmIChsaW5lc3RhdGUgJiAoTElORVNUQVRFX0RQIHwgTElORVNUQVRFX0RNKSkgeworCQkJCS8qIGVuYWJsZSBwaHkgYXV0by1yZXN1bWUgKi8KKwkJCQl3cml0ZWxfcmVsYXhlZCgweDkxLAorCQkJCQlxcGh5LT5iYXNlICsgcXBoeS0+cGh5X3JlZ1tURVNUMV0pOworCQkJCS8qIGZsdXNoIHRoZSBwcmV2aW91cyB3cml0ZSBiZWZvcmUgbmV4dCB3cml0ZSAqLworCQkJCXdtYigpOworCQkJCXdyaXRlbF9yZWxheGVkKDB4OTAsCisJCQkJCXFwaHktPmJhc2UgKyBxcGh5LT5waHlfcmVnW1RFU1QxXSk7CisJCQl9CiAKIAkJCWRldl9kYmcocGh5LT5kZXYsICIlczogaW50cl9tYXNrID0gJXhcbiIsCiAJCQlfX2Z1bmNfXywgaW50cl9tYXNrKTsKQEAgLTY2MCw2ICs2NzYsMjIgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJcXBoeS0+ZHBkbV9lbmFibGUgPSB0cnVlOworCisJCWlmIChxcGh5LT5ldWRfYmFzZSkgeworCQkJaWYgKHFwaHktPmNmZ19haGJfY2xrKQorCQkJCWNsa19wcmVwYXJlX2VuYWJsZShxcGh5LT5jZmdfYWhiX2Nsayk7CisJCQl3cml0ZWxfcmVsYXhlZChCSVQoMCksCisJCQkJCXFwaHktPmV1ZF9iYXNlICsgRVVEX1NXX0FUVEFDSF9ERVQpOworCQkJLyogdG8gZmx1c2ggYWJvdmUgd3JpdGUgYmVmb3JlIG5leHQgd3JpdGUgKi8KKwkJCXdtYigpOworCisJCQl3cml0ZWxfcmVsYXhlZChFVURfSU5UX1ZCVVMgfCBFVURfSU5UX0NIR1IsCisJCQkJCXFwaHktPmV1ZF9iYXNlICsgRVVEX0lOVDFfRU5fTUFTSyk7CisJCQkvKiB0byBmbHVzaCBhYm92ZSB3cml0ZSBiZWZvcmUgdHVybmluZyBvZmYgY2xrICovCisJCQl3bWIoKTsKKwkJCWlmIChxcGh5LT5jZmdfYWhiX2NsaykKKwkJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocXBoeS0+Y2ZnX2FoYl9jbGspOworCQl9CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTY3NCw2ICs3MDYsMTYgQEAKIAkJCQlfX2Z1bmNfXywgcXBoeS0+ZHBkbV9lbmFibGUpOwogCiAJaWYgKHFwaHktPmRwZG1fZW5hYmxlKSB7CisJCWlmIChxcGh5LT5ldWRfYmFzZSkgeworCQkJaWYgKHFwaHktPmNmZ19haGJfY2xrKQorCQkJCWNsa19wcmVwYXJlX2VuYWJsZShxcGh5LT5jZmdfYWhiX2Nsayk7CisJCQl3cml0ZWxfcmVsYXhlZCgwLCBxcGh5LT5ldWRfYmFzZSArIEVVRF9TV19BVFRBQ0hfREVUKTsKKwkJCS8qIHRvIGZsdXNoIGFib3ZlIHdyaXRlIGJlZm9yZSB0dXJuaW5nIG9mZiBjbGsgKi8KKwkJCXdtYigpOworCQkJaWYgKHFwaHktPmNmZ19haGJfY2xrKQorCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShxcGh5LT5jZmdfYWhiX2Nsayk7CisJCX0KKwogCQlyZXQgPSBxdXNiX3BoeV9lbmFibGVfcG93ZXIocXBoeSwgZmFsc2UpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2RiZyhxcGh5LT5waHkuZGV2LApAQCAtNzgwLDYgKzgyMiwxNyBAQAogCQl9CiAJfQogCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJCQkiZXVkX2Jhc2UiKTsKKwlpZiAocmVzKSB7CisJCXFwaHktPmV1ZF9iYXNlID0gZGV2bV9pb3JlbWFwKGRldiwgcmVzLT5zdGFydCwKKwkJCQkJcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwkJaWYgKElTX0VSUihxcGh5LT5ldWRfYmFzZSkpIHsKKwkJCWRldl9kYmcoZGV2LCAiY291bGRuJ3QgaW9yZW1hcCBldWRfYmFzZVxuIik7CisJCQlxcGh5LT5ldWRfYmFzZSA9IE5VTEw7CisJCX0KKwl9CisKIAkvKiByZWZfY2xrX3NyYyBpcyBuZWVkZWQgaXJyZXNwZWN0aXZlIG9mIFNFX0NMSyBvciBESUZGX0NMSyB1c2FnZSAqLwogCXFwaHktPnJlZl9jbGtfc3JjID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZl9jbGtfc3JjIik7CiAJaWYgKElTX0VSUihxcGh5LT5yZWZfY2xrX3NyYykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXNzdXNiLXFtcC5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tc3N1c2ItcW1wLmMKaW5kZXggNTlmNTM3OS4uN2U3Yzc2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tc3N1c2ItcW1wLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1tc20tc3N1c2ItcW1wLmMKQEAgLTYyMywxMCArNjIzLDcgQEAKIAl9CiAKIAlpZiAoc3VzcGVuZCkgewotCQlpZiAoIXBoeS0+Y2FibGVfY29ubmVjdGVkKQotCQkJd3JpdGVsX3JlbGF4ZWQoMHgwMCwKLQkJCXBoeS0+YmFzZSArIHBoeS0+cGh5X3JlZ1tVU0IzX1BIWV9QT1dFUl9ET1dOX0NPTlRST0xdKTsKLQkJZWxzZQorCQlpZiAocGh5LT5jYWJsZV9jb25uZWN0ZWQpCiAJCQltc21fc3N1c2JfcW1wX2VuYWJsZV9hdXRvbm9tb3VzKHBoeSwgMSk7CiAKIAkJLyogTWFrZSBzdXJlIGFib3ZlIHdyaXRlIGNvbXBsZXRlZCB3aXRoIFBIWSAqLwpAQCAtNjc0LDYgKzY3MSwxMCBAQAogCXN0cnVjdCBtc21fc3NwaHlfcW1wICpwaHkgPSBjb250YWluZXJfb2YodXBoeSwgc3RydWN0IG1zbV9zc3BoeV9xbXAsCiAJCQkJCXBoeSk7CiAKKwl3cml0ZWxfcmVsYXhlZCgweDAwLAorCQlwaHktPmJhc2UgKyBwaHktPnBoeV9yZWdbVVNCM19QSFlfUE9XRVJfRE9XTl9DT05UUk9MXSk7CisJcmVhZGxfcmVsYXhlZChwaHktPmJhc2UgKyBwaHktPnBoeV9yZWdbVVNCM19QSFlfUE9XRVJfRE9XTl9DT05UUk9MXSk7CisKIAlkZXZfZGJnKHVwaHktPmRldiwgIlFNUCBwaHkgZGlzY29ubmVjdCBub3RpZmljYXRpb25cbiIpOwogCWRldl9kYmcodXBoeS0+ZGV2LCAiIGNhYmxlX2Nvbm5lY3RlZD0lZFxuIiwgcGh5LT5jYWJsZV9jb25uZWN0ZWQpOwogCXBoeS0+Y2FibGVfY29ubmVjdGVkID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3JjYXIzLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3JjYXIzLmMKaW5kZXggZDU0NGIzMy4uMDJiNjdhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9yY2FyMy5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcmNhcjMuYwpAQCAtMjAsOSArMjAsMTMgQEAKIC8qIExvdyBQb3dlciBTdGF0dXMgcmVnaXN0ZXIgKExQU1RTKSAqLwogI2RlZmluZSBMUFNUU19TVVNQTQkweDQwMDAKIAotLyogVVNCIEdlbmVyYWwgY29udHJvbCByZWdpc3RlciAyIChVR0NUUkwyKSwgYml0WzMxOjZdIHNob3VsZCBiZSAwICovCisvKgorICogVVNCIEdlbmVyYWwgY29udHJvbCByZWdpc3RlciAyIChVR0NUUkwyKQorICogUmVtYXJrczogYml0WzMxOjExXSBhbmQgYml0Wzk6Nl0gc2hvdWxkIGJlIDAKKyAqLwogI2RlZmluZSBVR0NUUkwyX1JFU0VSVkVEXzMJMHgwMDAwMDAwMQkvKiBiaXRbMzowXSBzaG91bGQgYmUgQicwMDAxICovCiAjZGVmaW5lIFVHQ1RSTDJfVVNCMFNFTF9PVEcJMHgwMDAwMDAzMAorI2RlZmluZSBVR0NUUkwyX1ZCVVNTRUwJCTB4MDAwMDA0MDAKIAogc3RhdGljIHZvaWQgdXNiaHNfd3JpdGUzMihzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIGRhdGEpCiB7CkBAIC0zNCw3ICszOCw4IEBACiB7CiAJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19wZGV2X3RvX3ByaXYocGRldik7CiAKLQl1c2Joc193cml0ZTMyKHByaXYsIFVHQ1RSTDIsIFVHQ1RSTDJfUkVTRVJWRURfMyB8IFVHQ1RSTDJfVVNCMFNFTF9PVEcpOworCXVzYmhzX3dyaXRlMzIocHJpdiwgVUdDVFJMMiwgVUdDVFJMMl9SRVNFUlZFRF8zIHwgVUdDVFJMMl9VU0IwU0VMX09URyB8CisJCSAgICAgIFVHQ1RSTDJfVkJVU1NFTCk7CiAKIAlpZiAoZW5hYmxlKSB7CiAJCXVzYmhzX2JzZXQocHJpdiwgTFBTVFMsIExQU1RTX1NVU1BNLCBMUFNUU19TVVNQTSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKaW5kZXggODRiNDQ0Zi4uNDcwYjE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4OTk4KSB9LCAvKiBLQ0YgVGVjaG5vbG9naWVzIFBSTiAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4OEEyQSkgfSwgLyogSHViWiBkdWFsIFppZ0JlZSBhbmQgWi1XYXZlIGRvbmdsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4OEE1RSkgfSwgLyogQ0VMIEVNMzU4OCBaaWdCZWUgVVNCIFN0aWNrIExvbmcgUmFuZ2UgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDhCMzQpIH0sIC8qIFFpdmljb24gWmlnQmVlIFVTQiBSYWRpbyBTdGljayAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MCkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE2MSkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RUE3MCkgfSwgLyogU2lsaWNvbiBMYWJzIGZhY3RvcnkgZGVmYXVsdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCmluZGV4IGViZTUxZjExLi4yYTk5NDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0yMDIzLDggKzIwMjMsMTEgQEAKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAwMSwgMHg3ZDAzLCAweGZmLCAweDAyLCAweDAxKSB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDdkMDMsIDB4ZmYsIDB4MDAsIDB4MDApIH0sCiAJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDIwMDEsIDB4N2QwNCwgMHhmZikgfSwJCQkvKiBELUxpbmsgRFdNLTE1OCAqLworCXsgVVNCX0RFVklDRV9JTlRFUkZBQ0VfQ0xBU1MoMHgyMDAxLCAweDdkMGUsIDB4ZmYpIH0sCQkJLyogRC1MaW5rIERXTS0xNTcgQzEgKi8KIAl7IFVTQl9ERVZJQ0VfSU5URVJGQUNFX0NMQVNTKDB4MjAwMSwgMHg3ZTE5LCAweGZmKSwJCQkvKiBELUxpbmsgRFdNLTIyMSBCMSAqLwogCSAgLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZuZXRfaW50ZjRfYmxhY2tsaXN0IH0sCisJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDIwMDEsIDB4N2UzNSwgMHhmZiksCQkJLyogRC1MaW5rIERXTS0yMjIgKi8KKwkgIC5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmbmV0X2ludGY0X2JsYWNrbGlzdCB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwN2QxLCAweDNlMDEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sIC8qIEQtTGluayBEV00tMTUyL0MxICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDA3ZDEsIDB4M2UwMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwgLyogRC1MaW5rIERXTS0xNTYvQzEgKi8KIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDdkMSwgMHg3ZTExLCAweGZmLCAweGZmLCAweGZmKSB9LCAvKiBELUxpbmsgRFdNLTE1Ni9BMyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCmluZGV4IDFkYjRiNjEuLmE1MWIyODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAl7IFVTQl9ERVZJQ0UoSU9EQVRBX1ZFTkRPUl9JRCwgSU9EQVRBX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKElPREFUQV9WRU5ET1JfSUQsIElPREFUQV9QUk9EVUNUX0lEX1JTQVE1KSB9LAogCXsgVVNCX0RFVklDRShBVEVOX1ZFTkRPUl9JRCwgQVRFTl9QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRShBVEVOX1ZFTkRPUl9JRCwgQVRFTl9QUk9EVUNUX1VDNDg1KSB9LAogCXsgVVNCX0RFVklDRShBVEVOX1ZFTkRPUl9JRCwgQVRFTl9QUk9EVUNUX0lEMikgfSwKIAl7IFVTQl9ERVZJQ0UoQVRFTl9WRU5ET1JfSUQyLCBBVEVOX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKEVMQ09NX1ZFTkRPUl9JRCwgRUxDT01fUFJPRFVDVF9JRCkgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaAppbmRleCAwOWQ5YmU4Li4zYjVhMTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5oCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIEFURU5fVkVORE9SX0lECQkweDA1NTcKICNkZWZpbmUgQVRFTl9WRU5ET1JfSUQyCQkweDA1NDcKICNkZWZpbmUgQVRFTl9QUk9EVUNUX0lECQkweDIwMDgKKyNkZWZpbmUgQVRFTl9QUk9EVUNUX1VDNDg1CTB4MjAyMQogI2RlZmluZSBBVEVOX1BST0RVQ1RfSUQyCTB4MjExOAogCiAjZGVmaW5lIElPREFUQV9WRU5ET1JfSUQJMHgwNGJiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfdWFzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfdWFzLmgKaW5kZXggY2JlYTlmMy4uY2RlMTE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3Vhcy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaApAQCAtMTI0LDkgKzEyNCw5IEBACiAvKiBSZXBvcnRlZC1ieTogQmVuamFtaW4gVGlzc29pcmVzIDxiZW5qYW1pbi50aXNzb2lyZXNAcmVkaGF0LmNvbT4gKi8KIFVOVVNVQUxfREVWKDB4MTNmZCwgMHgzOTQwLCAweDAwMDAsIDB4OTk5OSwKIAkJIkluaXRpbyBDb3Jwb3JhdGlvbiIsCi0JCSIiLAorCQkiSU5JQy0zMDY5IiwKIAkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfTk9fQVRBXzFYKSwKKwkJVVNfRkxfTk9fQVRBXzFYIHwgVVNfRkxfSUdOT1JFX1JFU0lEVUUpLAogCiAvKiBSZXBvcnRlZC1ieTogVG9tIEFyaWxkIE5hZXNzIDx0YW5hZXNzQGdtYWlsLmNvbT4gKi8KIFVOVVNVQUxfREVWKDB4MTUyZCwgMHgwNTM5LCAweDAwMDAsIDB4OTk5OSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYyBiL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYwppbmRleCAwMzFiYzA4Li40MzU1OWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMKKysrIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaS5jCkBAIC0xMTczLDYgKzExNzMsMTAgQEAKIAkJCXJldHVybiByZXQ7CiAKIAkJdmRldi0+YmFybWFwW2luZGV4XSA9IHBjaV9pb21hcChwZGV2LCBpbmRleCwgMCk7CisJCWlmICghdmRldi0+YmFybWFwW2luZGV4XSkgeworCQkJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCAxIDw8IGluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJfQogCiAJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB2ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9yZHdyLmMgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3Jkd3IuYwppbmRleCA1ZmZkMWQ5Li4zNTcyNDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3Jkd3IuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3Jkd3IuYwpAQCAtMTkzLDcgKzE5MywxMCBAQAogCWlmICghdmRldi0+aGFzX3ZnYSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2ggKHBvcykgeworCWlmIChwb3MgPiAweGJmZmZmdWwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICgodTMyKXBvcykgewogCWNhc2UgMHhhMDAwMCAuLi4gMHhiZmZmZjoKIAkJY291bnQgPSBtaW4oY291bnQsIChzaXplX3QpKDB4YzAwMDAgLSBwb3MpKTsKIAkJaW9tZW0gPSBpb3JlbWFwX25vY2FjaGUoMHhhMDAwMCwgMHhiZmZmZiAtIDB4YTAwMDAgKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jCmluZGV4IDVkYzEyOGEuLjk2YTA2NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmMKKysrIGIvZHJpdmVycy92aG9zdC9uZXQuYwpAQCAtNTM3LDggKzUzNywxMyBAQAogCiAJCXByZWVtcHRfZW5hYmxlKCk7CiAKLQkJaWYgKHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpCisJCWlmICghdmhvc3RfdnFfYXZhaWxfZW1wdHkoJm5ldC0+ZGV2LCB2cSkpCiAJCQl2aG9zdF9wb2xsX3F1ZXVlKCZ2cS0+cG9sbCk7CisJCWVsc2UgaWYgKHVubGlrZWx5KHZob3N0X2VuYWJsZV9ub3RpZnkoJm5ldC0+ZGV2LCB2cSkpKSB7CisJCQl2aG9zdF9kaXNhYmxlX25vdGlmeSgmbmV0LT5kZXYsIHZxKTsKKwkJCXZob3N0X3BvbGxfcXVldWUoJnZxLT5wb2xsKTsKKwkJfQorCiAJCW11dGV4X3VubG9jaygmdnEtPm11dGV4KTsKIAogCQlsZW4gPSBwZWVrX2hlYWRfbGVuKHNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29iYWx0X2xjZGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvYmFsdF9sY2RmYi5jCmluZGV4IDJkM2I2OTEuLjAzOGFjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29iYWx0X2xjZGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9mYmRldi9jb2JhbHRfbGNkZmIuYwpAQCAtMzA4LDYgKzMwOCwxMSBAQAogCWluZm8tPnNjcmVlbl9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWluZm8tPnNjcmVlbl9iYXNlID0gZGV2bV9pb3JlbWFwKCZkZXYtPmRldiwgcmVzLT5zdGFydCwKIAkJCQkJIGluZm8tPnNjcmVlbl9zaXplKTsKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCWluZm8tPmZib3BzID0gJmNvYmFsdF9sY2RfZmJvcHM7CiAJaW5mby0+Zml4ID0gY29iYWx0X2xjZGZiX2ZpeDsKIAlpbmZvLT5maXguc21lbV9zdGFydCA9IHJlcy0+c3RhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0uYyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCmluZGV4IDc2YzFhZDkuLmY4YTM4MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCkBAIC0xMDk3LDYgKzEwOTcsMTMgQEAKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlsb25nIHJldCA9IDA7CiAKKwltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHZhcikpOworCW1lbXNldCgmZml4LCAwLCBzaXplb2YoZml4KSk7CisJbWVtc2V0KCZjb24yZmIsIDAsIHNpemVvZihjb24yZmIpKTsKKwltZW1zZXQoJmNtYXBfZnJvbSwgMCwgc2l6ZW9mKGNtYXBfZnJvbSkpOworCW1lbXNldCgmY21hcCwgMCwgc2l6ZW9mKGNtYXApKTsKKwltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGQklPR0VUX1ZTQ1JFRU5JTkZPOgogCQlpZiAoIWxvY2tfZmJfaW5mbyhpbmZvKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2FybS1kZXZpY2UuYyBiL2RyaXZlcnMveGVuL2FybS1kZXZpY2UuYwppbmRleCA3NzhhY2Y4Li44NWRkMjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9hcm0tZGV2aWNlLmMKKysrIGIvZHJpdmVycy94ZW4vYXJtLWRldmljZS5jCkBAIC01OCw5ICs1OCwxMyBAQAogCXhlbl9wZm5fdCAqZ3BmbnM7CiAJeGVuX3Vsb25nX3QgKmlkeHM7CiAJaW50ICplcnJzOwotCXN0cnVjdCB4ZW5fYWRkX3RvX3BoeXNtYXBfcmFuZ2UgeGF0cDsKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0cnVjdCB4ZW5fYWRkX3RvX3BoeXNtYXBfcmFuZ2UgeGF0cCA9IHsKKwkJCS5kb21pZCA9IERPTUlEX1NFTEYsCisJCQkuc3BhY2UgPSBYRU5NQVBTUEFDRV9kZXZfbW1pbworCQl9OworCiAJCXIgPSAmcmVzb3VyY2VzW2ldOwogCQluciA9IERJVl9ST1VORF9VUChyZXNvdXJjZV9zaXplKHIpLCBYRU5fUEFHRV9TSVpFKTsKIAkJaWYgKChyZXNvdXJjZV90eXBlKHIpICE9IElPUkVTT1VSQ0VfTUVNKSB8fCAobnIgPT0gMCkpCkBAIC04Nyw5ICs5MSw3IEBACiAJCQlpZHhzW2pdID0gWEVOX1BGTl9ET1dOKHItPnN0YXJ0KSArIGo7CiAJCX0KIAotCQl4YXRwLmRvbWlkID0gRE9NSURfU0VMRjsKIAkJeGF0cC5zaXplID0gbnI7Ci0JCXhhdHAuc3BhY2UgPSBYRU5NQVBTUEFDRV9kZXZfbW1pbzsKIAogCQlzZXRfeGVuX2d1ZXN0X2hhbmRsZSh4YXRwLmdwZm5zLCBncGZucyk7CiAJCXNldF94ZW5fZ3Vlc3RfaGFuZGxlKHhhdHAuaWR4cywgaWR4cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9iaW9tZXJnZS5jIGIvZHJpdmVycy94ZW4vYmlvbWVyZ2UuYwppbmRleCA0ZGE2OWRiLi4xYmRkMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9iaW9tZXJnZS5jCisrKyBiL2RyaXZlcnMveGVuL2Jpb21lcmdlLmMKQEAgLTEwLDggKzEwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGJmbjEgPSBwZm5fdG9fYmZuKHBhZ2VfdG9fcGZuKHZlYzEtPmJ2X3BhZ2UpKTsKIAl1bnNpZ25lZCBsb25nIGJmbjIgPSBwZm5fdG9fYmZuKHBhZ2VfdG9fcGZuKHZlYzItPmJ2X3BhZ2UpKTsKIAotCXJldHVybiBfX0JJT1ZFQ19QSFlTX01FUkdFQUJMRSh2ZWMxLCB2ZWMyKSAmJgotCQkoKGJmbjEgPT0gYmZuMikgfHwgKChiZm4xKzEpID09IGJmbjIpKTsKKwlyZXR1cm4gYmZuMSArIFBGTl9ET1dOKHZlYzEtPmJ2X29mZnNldCArIHZlYzEtPmJ2X2xlbikgPT0gYmZuMjsKICNlbHNlCiAJLyoKIAkgKiBYWFg6IEFkZCBzdXBwb3J0IGZvciBtZXJnaW5nIGJpb192ZWMgd2hlbiB1c2luZyBkaWZmZXJlbnQgcGFnZQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKaW5kZXggZTQ2ZTdmYi4uNzA1YmI1ZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYworKysgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCkBAIC00NzU5LDEwICs0NzU5LDYgQEAKIAkJZWxzZQogCQkJZmx1c2ggPSBCVFJGU19SRVNFUlZFX05PX0ZMVVNIOwogCQlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwotCQlpZiAoY2FuX292ZXJjb21taXQocm9vdCwgc3BhY2VfaW5mbywgb3JpZywgZmx1c2gpKSB7Ci0JCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7Ci0JCQlicmVhazsKLQkJfQogCQlpZiAobGlzdF9lbXB0eSgmc3BhY2VfaW5mby0+dGlja2V0cykgJiYKIAkJICAgIGxpc3RfZW1wdHkoJnNwYWNlX2luZm8tPnByaW9yaXR5X3RpY2tldHMpKSB7CiAJCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CkBAIC03NDAxLDcgKzczOTcsOCBAQAogCiAJCXNwaW5fdW5sb2NrKCZjbHVzdGVyLT5yZWZpbGxfbG9jayk7CiAKLQkJZG93bl9yZWFkKCZ1c2VkX2JnLT5kYXRhX3J3c2VtKTsKKwkJLyogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBvbmUtbGV2ZWwgbmVzdGVkLiAqLworCQlkb3duX3JlYWRfbmVzdGVkKCZ1c2VkX2JnLT5kYXRhX3J3c2VtLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKIAkJc3Bpbl9sb2NrKCZjbHVzdGVyLT5yZWZpbGxfbG9jayk7CiAJCWlmICh1c2VkX2JnID09IGNsdXN0ZXItPmJsb2NrX2dyb3VwKQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggYTJhMDE0Yi4uOGEwNWZhNyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUuYworKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC03NjQ4LDExICs3NjQ4LDE4IEBACiAJICogd2l0aGluIG91ciByZXNlcnZhdGlvbiwgb3RoZXJ3aXNlIHdlIG5lZWQgdG8gYWRqdXN0IG91ciBpbm9kZQogCSAqIGNvdW50ZXIgYXBwcm9wcmlhdGVseS4KIAkgKi8KLQlpZiAoZGlvX2RhdGEtPm91dHN0YW5kaW5nX2V4dGVudHMpIHsKKwlpZiAoZGlvX2RhdGEtPm91dHN0YW5kaW5nX2V4dGVudHMgPj0gbnVtX2V4dGVudHMpIHsKIAkJZGlvX2RhdGEtPm91dHN0YW5kaW5nX2V4dGVudHMgLT0gbnVtX2V4dGVudHM7CiAJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgZGlvIHdyaXRlIGxlbmd0aCBoYXMgYmVlbiBzcGxpdCBkdWUgdG8gbm8gbGFyZ2UgZW5vdWdoCisJCSAqIGNvbnRpZ3VvdXMgc3BhY2UsIHdlIG5lZWQgdG8gY29tcGVuc2F0ZSBvdXIgaW5vZGUgY291bnRlcgorCQkgKiBhcHByb3ByaWF0ZWx5LgorCQkgKi8KKwkJdTY0IG51bV9uZWVkZWQgPSBudW1fZXh0ZW50cyAtIGRpb19kYXRhLT5vdXRzdGFuZGluZ19leHRlbnRzOworCiAJCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwotCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyArPSBudW1fZXh0ZW50czsKKwkJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgKz0gbnVtX25lZWRlZDsKIAkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdXBlci5jIGIvZnMvYnRyZnMvc3VwZXIuYwppbmRleCA3NGVkNWFhLi5mNmUxMTE5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9zdXBlci5jCisrKyBiL2ZzL2J0cmZzL3N1cGVyLmMKQEAgLTE4MzQsNiArMTgzNCw4IEBACiAJCQlnb3RvIHJlc3RvcmU7CiAJCX0KIAorCQlidHJmc19xZ3JvdXBfcmVzY2FuX3Jlc3VtZShmc19pbmZvKTsKKwogCQlpZiAoIWZzX2luZm8tPnV1aWRfcm9vdCkgewogCQkJYnRyZnNfaW5mbyhmc19pbmZvLCAiY3JlYXRpbmcgVVVJRCB0cmVlIik7CiAJCQlyZXQgPSBidHJmc19jcmVhdGVfdXVpZF90cmVlKGZzX2luZm8pOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggYjg5MDA0NS4uMzA5MzEzYiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0zNyw2ICszNyw3IEBACiAgKi8KICNkZWZpbmUgTE9HX0lOT0RFX0FMTCAwCiAjZGVmaW5lIExPR19JTk9ERV9FWElTVFMgMQorI2RlZmluZSBMT0dfT1RIRVJfSU5PREUgMgogCiAvKgogICogZGlyZWN0b3J5IHRyb3VibGUgY2FzZXMKQEAgLTQ2MjMsNyArNDYyNCw3IEBACiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwKIAkgICAgKCF0ZXN0X2JpdChCVFJGU19JTk9ERV9ORUVEU19GVUxMX1NZTkMsCiAJCSAgICAgICAmQlRSRlNfSShpbm9kZSktPnJ1bnRpbWVfZmxhZ3MpICYmCi0JICAgICBpbm9kZV9vbmx5ID09IExPR19JTk9ERV9FWElTVFMpKQorCSAgICAgaW5vZGVfb25seSA+PSBMT0dfSU5PREVfRVhJU1RTKSkKIAkJbWF4X2tleS50eXBlID0gQlRSRlNfWEFUVFJfSVRFTV9LRVk7CiAJZWxzZQogCQltYXhfa2V5LnR5cGUgPSAodTgpLTE7CkBAIC00NjQ3LDcgKzQ2NDgsMTMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQltdXRleF9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9nX211dGV4KTsKKwlpZiAoaW5vZGVfb25seSA9PSBMT0dfT1RIRVJfSU5PREUpIHsKKwkJaW5vZGVfb25seSA9IExPR19JTk9ERV9FWElTVFM7CisJCW11dGV4X2xvY2tfbmVzdGVkKCZCVFJGU19JKGlub2RlKS0+bG9nX211dGV4LAorCQkJCSAgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCX0gZWxzZSB7CisJCW11dGV4X2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2dfbXV0ZXgpOworCX0KIAogCS8qCiAJICogYSBicnV0ZSBmb3JjZSBhcHByb2FjaCB0byBtYWtpbmcgc3VyZSB3ZSBnZXQgdGhlIG1vc3QgdXB0b2RhdGUKQEAgLTQ3OTksNyArNDgwNiw3IEBACiAJCQkJICogdW5waW4gaXQuCiAJCQkJICovCiAJCQkJZXJyID0gYnRyZnNfbG9nX2lub2RlKHRyYW5zLCByb290LCBvdGhlcl9pbm9kZSwKLQkJCQkJCSAgICAgIExPR19JTk9ERV9FWElTVFMsCisJCQkJCQkgICAgICBMT0dfT1RIRVJfSU5PREUsCiAJCQkJCQkgICAgICAwLCBMTE9OR19NQVgsIGN0eCk7CiAJCQkJaXB1dChvdGhlcl9pbm9kZSk7CiAJCQkJaWYgKGVycikKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvYWRkci5jIGIvZnMvY2VwaC9hZGRyLmMKaW5kZXggOTAwZmZhZi4uN2I3OWE1NCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9hZGRyLmMKKysrIGIvZnMvY2VwaC9hZGRyLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogLyoKICAqIHJlYWQgYSBzaW5nbGUgcGFnZSwgd2l0aG91dCB1bmxvY2tpbmcgaXQuCiAgKi8KLXN0YXRpYyBpbnQgcmVhZHBhZ2Vfbm91bmxvY2soc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGludCBjZXBoX2RvX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKIAllcnIgPSBjZXBoX3JlYWRwYWdlX2Zyb21fZnNjYWNoZShpbm9kZSwgcGFnZSk7CiAJaWYgKGVyciA9PSAwKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKIAogCWRvdXQoInJlYWRwYWdlIGlub2RlICVwIGZpbGUgJXAgcGFnZSAlcCBpbmRleCAlbHVcbiIsCiAJICAgICBpbm9kZSwgZmlscCwgcGFnZSwgcGFnZS0+aW5kZXgpOwpAQCAtMjQ4LDggKzI0OCwxMSBAQAogCiBzdGF0aWMgaW50IGNlcGhfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCWludCByID0gcmVhZHBhZ2Vfbm91bmxvY2soZmlscCwgcGFnZSk7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7CisJaW50IHIgPSBjZXBoX2RvX3JlYWRwYWdlKGZpbHAsIHBhZ2UpOworCWlmIChyICE9IC1FSU5QUk9HUkVTUykKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJZWxzZQorCQlyID0gMDsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTIzNSw3ICsxMjM4LDcgQEAKIAkJCWdvdG8gcmV0cnlfbG9ja2VkOwogCQlyID0gd3JpdGVwYWdlX25vdW5sb2NrKHBhZ2UsIE5VTEwpOwogCQlpZiAociA8IDApCi0JCQlnb3RvIGZhaWxfbm9zbmFwOworCQkJZ290byBmYWlsX3VubG9jazsKIAkJZ290byByZXRyeV9sb2NrZWQ7CiAJfQogCkBAIC0xMjYzLDExICsxMjY2LDE0IEBACiAJfQogCiAJLyogd2UgbmVlZCB0byByZWFkIGl0LiAqLwotCXIgPSByZWFkcGFnZV9ub3VubG9jayhmaWxlLCBwYWdlKTsKLQlpZiAociA8IDApCi0JCWdvdG8gZmFpbF9ub3NuYXA7CisJciA9IGNlcGhfZG9fcmVhZHBhZ2UoZmlsZSwgcGFnZSk7CisJaWYgKHIgPCAwKSB7CisJCWlmIChyID09IC1FSU5QUk9HUkVTUykKKwkJCXJldHVybiAtRUFHQUlOOworCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KIAlnb3RvIHJldHJ5X2xvY2tlZDsKLWZhaWxfbm9zbmFwOgorZmFpbF91bmxvY2s6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIHI7CiB9CmRpZmYgLS1naXQgYS9mcy9jZXBoL2NhY2hlLmMgYi9mcy9jZXBoL2NhY2hlLmMKaW5kZXggNWJjNWQzNy4uYTJkNzk5NyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9jYWNoZS5jCisrKyBiL2ZzL2NlcGgvY2FjaGUuYwpAQCAtMjQwLDEzICsyNDAsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgY2VwaF92ZnNfcmVhZHBhZ2VfY29tcGxldGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmRhdGEsIGludCBlcnJvcikKLXsKLQlpZiAoIWVycm9yKQotCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNlcGhfdmZzX3JlYWRwYWdlX2NvbXBsZXRlX3VubG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZGF0YSwgaW50IGVycm9yKQorc3RhdGljIHZvaWQgY2VwaF9yZWFkcGFnZV9mcm9tX2ZzY2FjaGVfY29tcGxldGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKmRhdGEsIGludCBlcnJvcikKIHsKIAlpZiAoIWVycm9yKQogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC0yNzQsNyArMjY4LDcgQEAKIAkJcmV0dXJuIC1FTk9CVUZTOwogCiAJcmV0ID0gZnNjYWNoZV9yZWFkX29yX2FsbG9jX3BhZ2UoY2ktPmZzY2FjaGUsIHBhZ2UsCi0JCQkJCSBjZXBoX3Zmc19yZWFkcGFnZV9jb21wbGV0ZSwgTlVMTCwKKwkJCQkJIGNlcGhfcmVhZHBhZ2VfZnJvbV9mc2NhY2hlX2NvbXBsZXRlLCBOVUxMLAogCQkJCQkgR0ZQX0tFUk5FTCk7CiAKIAlzd2l0Y2ggKHJldCkgewpAQCAtMzAzLDcgKzI5Nyw3IEBACiAJCXJldHVybiAtRU5PQlVGUzsKIAogCXJldCA9IGZzY2FjaGVfcmVhZF9vcl9hbGxvY19wYWdlcyhjaS0+ZnNjYWNoZSwgbWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLAotCQkJCQkgIGNlcGhfdmZzX3JlYWRwYWdlX2NvbXBsZXRlX3VubG9jaywKKwkJCQkJICBjZXBoX3JlYWRwYWdlX2Zyb21fZnNjYWNoZV9jb21wbGV0ZSwKIAkJCQkJICBOVUxMLCBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpKTsKIAogCXN3aXRjaCAocmV0KSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwppbmRleCA3ODlmZjFkLi5kZDNlMjM2IDEwMDY0NAotLS0gYS9mcy9jaWZzL2Rpci5jCisrKyBiL2ZzL2NpZnMvZGlyLmMKQEAgLTE4MywxNSArMTgzLDIwIEBACiB9CiAKIC8qCisgKiBEb24ndCBhbGxvdyBwYXRoIGNvbXBvbmVudHMgbG9uZ2VyIHRoYW4gdGhlIHNlcnZlciBtYXguCiAgKiBEb24ndCBhbGxvdyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiBhIHBhdGggY29tcG9uZW50LgogICogVGhlIFZGUyB3aWxsIG5vdCBhbGxvdyAiLyIsIGJ1dCAiXCIgaXMgYWxsb3dlZCBieSBwb3NpeC4KICAqLwogc3RhdGljIGludAotY2hlY2tfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK2NoZWNrX25hbWUoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBjaWZzX3Rjb24gKnRjb24pCiB7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZGlyZW50cnktPmRfc2IpOwogCWludCBpOwogCisJaWYgKHVubGlrZWx5KGRpcmVudHJ5LT5kX25hbWUubGVuID4KKwkJICAgICBsZTMyX3RvX2NwdSh0Y29uLT5mc0F0dHJJbmZvLk1heFBhdGhOYW1lQ29tcG9uZW50TGVuZ3RoKSkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCiAJaWYgKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1BPU0lYX1BBVEhTKSkgewogCQlmb3IgKGkgPSAwOyBpIDwgZGlyZW50cnktPmRfbmFtZS5sZW47IGkrKykgewogCQkJaWYgKGRpcmVudHJ5LT5kX25hbWUubmFtZVtpXSA9PSAnXFwnKSB7CkBAIC00ODksMTAgKzQ5NCw2IEBACiAJCXJldHVybiBmaW5pc2hfbm9fb3BlbihmaWxlLCByZXMpOwogCX0KIAotCXJjID0gY2hlY2tfbmFtZShkaXJlbnRyeSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KIAl4aWQgPSBnZXRfeGlkKCk7CiAKIAljaWZzX2RiZyhGWUksICJwYXJlbnQgaW5vZGUgPSAweCVwIG5hbWUgaXM6ICVwZCBhbmQgZGVudHJ5ID0gMHglcFxuIiwKQEAgLTUwNSw2ICs1MDYsMTEgQEAKIAl9CiAKIAl0Y29uID0gdGxpbmtfdGNvbih0bGluayk7CisKKwlyYyA9IGNoZWNrX25hbWUoZGlyZW50cnksIHRjb24pOworCWlmIChyYykKKwkJZ290byBvdXRfZnJlZV94aWQ7CisKIAlzZXJ2ZXIgPSB0Y29uLT5zZXMtPnNlcnZlcjsKIAogCWlmIChzZXJ2ZXItPm9wcy0+bmV3X2xlYXNlX2tleSkKQEAgLTc2NSw3ICs3NzEsNyBAQAogCX0KIAlwVGNvbiA9IHRsaW5rX3Rjb24odGxpbmspOwogCi0JcmMgPSBjaGVja19uYW1lKGRpcmVudHJ5KTsKKwlyYyA9IGNoZWNrX25hbWUoZGlyZW50cnksIHBUY29uKTsKIAlpZiAocmMpCiAJCWdvdG8gbG9va3VwX291dDsKIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zbWIycGR1LmMgYi9mcy9jaWZzL3NtYjJwZHUuYwppbmRleCA3YzFjNmMzLi4wNDM3ZTVmIDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYjJwZHUuYworKysgYi9mcy9jaWZzL3NtYjJwZHUuYwpAQCAtMjkzMCw4ICsyOTMwLDggQEAKIAlrc3QtPmZfYnNpemUgPSBsZTMyX3RvX2NwdShwZnNfaW5mLT5CeXRlc1BlclNlY3RvcikgKgogCQkJICBsZTMyX3RvX2NwdShwZnNfaW5mLT5TZWN0b3JzUGVyQWxsb2NhdGlvblVuaXQpOwogCWtzdC0+Zl9ibG9ja3MgPSBsZTY0X3RvX2NwdShwZnNfaW5mLT5Ub3RhbEFsbG9jYXRpb25Vbml0cyk7Ci0Ja3N0LT5mX2JmcmVlICA9IGxlNjRfdG9fY3B1KHBmc19pbmYtPkFjdHVhbEF2YWlsYWJsZUFsbG9jYXRpb25Vbml0cyk7Ci0Ja3N0LT5mX2JhdmFpbCA9IGxlNjRfdG9fY3B1KHBmc19pbmYtPkNhbGxlckF2YWlsYWJsZUFsbG9jYXRpb25Vbml0cyk7CisJa3N0LT5mX2JmcmVlICA9IGtzdC0+Zl9iYXZhaWwgPQorCQkJbGU2NF90b19jcHUocGZzX2luZi0+Q2FsbGVyQXZhaWxhYmxlQWxsb2NhdGlvblVuaXRzKTsKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iMnBkdS5oIGIvZnMvY2lmcy9zbWIycGR1LmgKaW5kZXggZGMwZDE0MS4uMWUxNDQ5YSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWIycGR1LmgKKysrIGIvZnMvY2lmcy9zbWIycGR1LmgKQEAgLTg0LDggKzg0LDggQEAKIAogI2RlZmluZSBOVU1CRVJfT0ZfU01CMl9DT01NQU5EUwkweDAwMTMKIAotLyogQkIgRklYTUUgLSBhbmFseXplIGZvbGxvd2luZyBsZW5ndGggQkIgKi8KLSNkZWZpbmUgTUFYX1NNQjJfSERSX1NJWkUgMHg3OCAvKiA0IGxlbiArIDY0IGhkciArICgyKjI0IHdjdCkgKyAyIGJjdCArIDIgcGFkICovCisvKiA0IGxlbiArIDUyIHRyYW5zZm9ybSBoZHIgKyA2NCBoZHIgKyA1NiBjcmVhdGUgcnNwICovCisjZGVmaW5lIE1BWF9TTUIyX0hEUl9TSVpFIDB4MDBiMAogCiAjZGVmaW5lIFNNQjJfUFJPVE9fTlVNQkVSIGNwdV90b19sZTMyKDB4NDI0ZDUzZmUpCiAjZGVmaW5lIFNNQjJfVFJBTlNGT1JNX1BST1RPX05VTSBjcHVfdG9fbGUzMigweDQyNGQ1M2ZkKQpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCA3MTcxZjBkLi4yMjdhNGY5IDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtMjc3LDYgKzI3NywzMyBAQAogCXJldHVybiBkZW50cnktPmRfbmFtZS5uYW1lICE9IGRlbnRyeS0+ZF9pbmFtZTsKIH0KIAordm9pZCB0YWtlX2RlbnRyeV9uYW1lX3NuYXBzaG90KHN0cnVjdCBuYW1lX3NuYXBzaG90ICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJaWYgKHVubGlrZWx5KGRuYW1lX2V4dGVybmFsKGRlbnRyeSkpKSB7CisJCXN0cnVjdCBleHRlcm5hbF9uYW1lICpwID0gZXh0ZXJuYWxfbmFtZShkZW50cnkpOworCQlhdG9taWNfaW5jKCZwLT51LmNvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJbmFtZS0+bmFtZSA9IHAtPm5hbWU7CisJfSBlbHNlIHsKKwkJbWVtY3B5KG5hbWUtPmlubGluZV9uYW1lLCBkZW50cnktPmRfaW5hbWUsIEROQU1FX0lOTElORV9MRU4pOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQluYW1lLT5uYW1lID0gbmFtZS0+aW5saW5lX25hbWU7CisJfQorfQorRVhQT1JUX1NZTUJPTCh0YWtlX2RlbnRyeV9uYW1lX3NuYXBzaG90KTsKKwordm9pZCByZWxlYXNlX2RlbnRyeV9uYW1lX3NuYXBzaG90KHN0cnVjdCBuYW1lX3NuYXBzaG90ICpuYW1lKQoreworCWlmICh1bmxpa2VseShuYW1lLT5uYW1lICE9IG5hbWUtPmlubGluZV9uYW1lKSkgeworCQlzdHJ1Y3QgZXh0ZXJuYWxfbmFtZSAqcDsKKwkJcCA9IGNvbnRhaW5lcl9vZihuYW1lLT5uYW1lLCBzdHJ1Y3QgZXh0ZXJuYWxfbmFtZSwgbmFtZVswXSk7CisJCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZwLT51LmNvdW50KSkpCisJCQlrZnJlZV9yY3UocCwgdS5oZWFkKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHJlbGVhc2VfZGVudHJ5X25hbWVfc25hcHNob3QpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgX19kX3NldF9pbm9kZV9hbmRfdHlwZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJICB1bnNpZ25lZCB0eXBlX2ZsYWdzKQpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9pbm9kZS5jIGIvZnMvZGVidWdmcy9pbm9kZS5jCmluZGV4IDFlMzBmNzQuLjNkN2RlOWYgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvaW5vZGUuYworKysgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKQEAgLTczMCw3ICs3MzAsNyBAQAogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBOVUxMLCAqdHJhcDsKLQljb25zdCBjaGFyICpvbGRfbmFtZTsKKwlzdHJ1Y3QgbmFtZV9zbmFwc2hvdCBvbGRfbmFtZTsKIAogCXRyYXAgPSBsb2NrX3JlbmFtZShuZXdfZGlyLCBvbGRfZGlyKTsKIAkvKiBTb3VyY2Ugb3IgZGVzdGluYXRpb24gZGlyZWN0b3JpZXMgZG9uJ3QgZXhpc3Q/ICovCkBAIC03NDUsMTkgKzc0NSwxOSBAQAogCWlmIChJU19FUlIoZGVudHJ5KSB8fCBkZW50cnkgPT0gdHJhcCB8fCBkX3JlYWxseV9pc19wb3NpdGl2ZShkZW50cnkpKQogCQlnb3RvIGV4aXQ7CiAKLQlvbGRfbmFtZSA9IGZzbm90aWZ5X29sZG5hbWVfaW5pdChvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJdGFrZV9kZW50cnlfbmFtZV9zbmFwc2hvdCgmb2xkX25hbWUsIG9sZF9kZW50cnkpOwogCiAJZXJyb3IgPSBzaW1wbGVfcmVuYW1lKGRfaW5vZGUob2xkX2RpciksIG9sZF9kZW50cnksIGRfaW5vZGUobmV3X2RpciksCiAJCQkgICAgICBkZW50cnksIDApOwogCWlmIChlcnJvcikgewotCQlmc25vdGlmeV9vbGRuYW1lX2ZyZWUob2xkX25hbWUpOworCQlyZWxlYXNlX2RlbnRyeV9uYW1lX3NuYXBzaG90KCZvbGRfbmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAJZF9tb3ZlKG9sZF9kZW50cnksIGRlbnRyeSk7Ci0JZnNub3RpZnlfbW92ZShkX2lub2RlKG9sZF9kaXIpLCBkX2lub2RlKG5ld19kaXIpLCBvbGRfbmFtZSwKKwlmc25vdGlmeV9tb3ZlKGRfaW5vZGUob2xkX2RpciksIGRfaW5vZGUobmV3X2RpciksIG9sZF9uYW1lLm5hbWUsCiAJCWRfaXNfZGlyKG9sZF9kZW50cnkpLAogCQlOVUxMLCBvbGRfZGVudHJ5KTsKLQlmc25vdGlmeV9vbGRuYW1lX2ZyZWUob2xkX25hbWUpOworCXJlbGVhc2VfZGVudHJ5X25hbWVfc25hcHNob3QoJm9sZF9uYW1lKTsKIAl1bmxvY2tfcmVuYW1lKG5ld19kaXIsIG9sZF9kaXIpOwogCWRwdXQoZGVudHJ5KTsKIAlyZXR1cm4gb2xkX2RlbnRyeTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS91c2VyLmMgYi9mcy9kbG0vdXNlci5jCmluZGV4IDU4YzJmNGEuLjlhYzY1OTEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS91c2VyLmMKKysrIGIvZnMvZGxtL3VzZXIuYwpAQCAtMzU1LDYgKzM1NSwxMCBAQAogCWVycm9yID0gbWlzY19yZWdpc3RlcigmbHMtPmxzX2RldmljZSk7CiAJaWYgKGVycm9yKSB7CiAJCWtmcmVlKGxzLT5sc19kZXZpY2UubmFtZSk7CisJCS8qIHRoaXMgaGFzIHRvIGJlIHNldCB0byBOVUxMCisJCSAqIHRvIGF2b2lkIGEgZG91YmxlLWZyZWUgaW4gZGxtX2RldmljZV9kZXJlZ2lzdGVyCisJCSAqLworCQlscy0+bHNfZGV2aWNlLm5hbWUgPSBOVUxMOwogCX0KIGZhaWw6CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCBkYzRhMzRmLi41Yjk2YmE3IDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtNTI0LDggKzUyNCwxMyBAQAogCXdhaXRfcXVldWVfaGVhZF90ICp3aGVhZDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQkvKiBJZiBpdCBpcyBjbGVhcmVkIGJ5IFBPTExGUkVFLCBpdCBzaG91bGQgYmUgcmN1LXNhZmUgKi8KLQl3aGVhZCA9IHJjdV9kZXJlZmVyZW5jZShwd3EtPndoZWFkKTsKKwkvKgorCSAqIElmIGl0IGlzIGNsZWFyZWQgYnkgUE9MTEZSRUUsIGl0IHNob3VsZCBiZSByY3Utc2FmZS4KKwkgKiBJZiB3ZSByZWFkIE5VTEwgd2UgbmVlZCBhIGJhcnJpZXIgcGFpcmVkIHdpdGgKKwkgKiBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGVwX3BvbGxfY2FsbGJhY2soKSwgb3RoZXJ3aXNlCisJICogd2UgcmVseSBvbiB3aGVhZC0+bG9jay4KKwkgKi8KKwl3aGVhZCA9IHNtcF9sb2FkX2FjcXVpcmUoJnB3cS0+d2hlYWQpOwogCWlmICh3aGVhZCkKIAkJcmVtb3ZlX3dhaXRfcXVldWUod2hlYWQsICZwd3EtPndhaXQpOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTAxMCwxNyArMTAxNSw2IEBACiAJc3RydWN0IGV2ZW50cG9sbCAqZXAgPSBlcGktPmVwOwogCWludCBld2FrZSA9IDA7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpa2V5ICYgUE9MTEZSRUUpIHsKLQkJZXBfcHdxX2Zyb21fd2FpdCh3YWl0KS0+d2hlYWQgPSBOVUxMOwotCQkvKgotCQkgKiB3aGVhZCA9IE5VTEwgYWJvdmUgY2FuIHJhY2Ugd2l0aCBlcF9yZW1vdmVfd2FpdF9xdWV1ZSgpCi0JCSAqIHdoaWNoIGNhbiBkbyBhbm90aGVyIHJlbW92ZV93YWl0X3F1ZXVlKCkgYWZ0ZXIgdXMsIHNvIHdlCi0JCSAqIGNhbid0IHVzZSBfX3JlbW92ZV93YWl0X3F1ZXVlKCkuIHdoZWFkLT5sb2NrIGlzIGhlbGQgYnkKLQkJICogdGhlIGNhbGxlci4KLQkJICovCi0JCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CiAKIAkvKgpAQCAtMTEwMiwxMCArMTA5NiwyNiBAQAogCWlmIChwd2FrZSkKIAkJZXBfcG9sbF9zYWZld2FrZSgmZXAtPnBvbGxfd2FpdCk7CiAKLQlpZiAoZXBpLT5ldmVudC5ldmVudHMgJiBFUE9MTEVYQ0xVU0lWRSkKLQkJcmV0dXJuIGV3YWtlOworCWlmICghKGVwaS0+ZXZlbnQuZXZlbnRzICYgRVBPTExFWENMVVNJVkUpKQorCQlld2FrZSA9IDE7CiAKLQlyZXR1cm4gMTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpa2V5ICYgUE9MTEZSRUUpIHsKKwkJLyoKKwkJICogSWYgd2UgcmFjZSB3aXRoIGVwX3JlbW92ZV93YWl0X3F1ZXVlKCkgaXQgY2FuIG1pc3MKKwkJICogLT53aGVhZCA9IE5VTEwgYW5kIGRvIGFub3RoZXIgcmVtb3ZlX3dhaXRfcXVldWUoKSBhZnRlcgorCQkgKiB1cywgc28gd2UgY2FuJ3QgdXNlIF9fcmVtb3ZlX3dhaXRfcXVldWUoKS4KKwkJICovCisJCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7CisJCS8qCisJCSAqIC0+d2hlYWQgIT0gTlVMTCBwcm90ZWN0cyB1cyBmcm9tIHRoZSByYWNlIHdpdGggZXBfZnJlZSgpCisJCSAqIG9yIGVwX3JlbW92ZSgpLCBlcF9yZW1vdmVfd2FpdF9xdWV1ZSgpIHRha2VzIHdoZWFkLT5sb2NrCisJCSAqIGhlbGQgYnkgdGhlIGNhbGxlci4gT25jZSB3ZSBudWxsaWZ5IGl0LCBub3RoaW5nIHByb3RlY3RzCisJCSAqIGVwL2VwaSBvciBldmVuIHdhaXQuCisJCSAqLworCQlzbXBfc3RvcmVfcmVsZWFzZSgmZXBfcHdxX2Zyb21fd2FpdCh3YWl0KS0+d2hlYWQsIE5VTEwpOworCX0KKworCXJldHVybiBld2FrZTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggOWU3N2MwOC4uZDE3ZDEyZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTQ2OSw2ICs0NjksOCBAQAogCQkJCWxhc3RvZmYgPSBwYWdlX29mZnNldChwYWdlKTsKIAkJCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJCQkJZG8geworCQkJCQlpZiAobGFzdG9mZiArIGJoLT5iX3NpemUgPD0gc3RhcnRvZmYpCisJCQkJCQlnb3RvIG5leHQ7CiAJCQkJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpIHx8CiAJCQkJCSAgICBidWZmZXJfdW53cml0dGVuKGJoKSkgewogCQkJCQkJaWYgKHdoZW5jZSA9PSBTRUVLX0RBVEEpCkBAIC00ODMsNiArNDg1LDcgQEAKIAkJCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCQkJZ290byBvdXQ7CiAJCQkJCX0KK25leHQ6CiAJCQkJCWxhc3RvZmYgKz0gYmgtPmJfc2l6ZTsKIAkJCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJCQkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCBjZjY4MTAwLi45NWJmNDY2IDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTE5MjYsNyArMTkyNiw4IEBACiAJCQluX2Rlc2NfYmxvY2tzID0gb19kZXNjX2Jsb2NrcyArCiAJCQkJbGUxNl90b19jcHUoZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CiAJCQluX2dyb3VwID0gbl9kZXNjX2Jsb2NrcyAqIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOwotCQkJbl9ibG9ja3NfY291bnQgPSBuX2dyb3VwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJCW5fYmxvY2tzX2NvdW50ID0gKGV4dDRfZnNibGtfdCluX2dyb3VwICoKKwkJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCQkJbl9ncm91cC0tOyAvKiBzZXQgdG8gbGFzdCBncm91cCBudW1iZXIgKi8KIAkJfQogCmRpZmYgLS1naXQgYS9mcy9mMmZzL3JlY292ZXJ5LmMgYi9mcy9mMmZzL3JlY292ZXJ5LmMKaW5kZXggMmZjODRhOS4uOThjMWE2MyAxMDA2NDQKLS0tIGEvZnMvZjJmcy9yZWNvdmVyeS5jCisrKyBiL2ZzL2YyZnMvcmVjb3ZlcnkuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCXJldHVybiAwOwogCiAJLyogR2V0IHRoZSBwcmV2aW91cyBzdW1tYXJ5ICovCi0JZm9yIChpID0gQ1VSU0VHX1dBUk1fREFUQTsgaSA8PSBDVVJTRUdfQ09MRF9EQVRBOyBpKyspIHsKKwlmb3IgKGkgPSBDVVJTRUdfSE9UX0RBVEE7IGkgPD0gQ1VSU0VHX0NPTERfREFUQTsgaSsrKSB7CiAJCXN0cnVjdCBjdXJzZWdfaW5mbyAqY3Vyc2VnID0gQ1VSU0VHX0koc2JpLCBpKTsKIAkJaWYgKGN1cnNlZy0+c2Vnbm8gPT0gc2Vnbm8pIHsKIAkJCXN1bSA9IGN1cnNlZy0+c3VtX2Jsay0+ZW50cmllc1tibGtvZmZdOwpAQCAtNjI2LDggKzYyNiw2IEBACiAJfQogCiAJY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfUE9SX0RPSU5HKTsKLQlpZiAoZXJyKQotCQlzZXRfY2twdF9mbGFncyhzYmksIENQX0VSUk9SX0ZMQUcpOwogCW11dGV4X3VubG9jaygmc2JpLT5jcF9tdXRleCk7CiAKIAkvKiBsZXQncyBkcm9wIGFsbCB0aGUgZGlyZWN0b3J5IGlub2RlcyBmb3IgY2xlYW4gY2hlY2twb2ludCAqLwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA3NWM5NTY1OS4uMjFkODI5YiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIHsKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZjsKIAotCWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZmlsZSksIEdGUF9LRVJORUwpOworCWZmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZmlsZSksIEdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghZmYpKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggMGFhZWJkMS4uMzg0NGMzMSAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC02MzcsNiArNjM3LDcgQEAKIAogCWRpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpOwogCiAvKioKICAqIGludmFsaWRhdGVfaW5vZGVzCS0gYXR0ZW1wdCB0byBmcmVlIGFsbCBpbm9kZXMgb24gYSBzdXBlcmJsb2NrCmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaAppbmRleCAxNWZlMmFhLi4zZTU4ODYzIDEwMDY0NAotLS0gYS9mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2ludGVybmFsLmgKQEAgLTEzOCw3ICsxMzgsNiBAQAogZXh0ZXJuIHZvaWQgaW5vZGVfaW9fbGlzdF9kZWwoc3RydWN0IGlub2RlICppbm9kZSk7CiAKIGV4dGVybiBsb25nIGdldF9ucl9kaXJ0eV9pbm9kZXModm9pZCk7Ci1leHRlcm4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIGludCBpbnZhbGlkYXRlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgYm9vbCk7CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9pb21hcC5jIGIvZnMvaW9tYXAuYwppbmRleCA3OThjMjkxLi5hNDlkYjg4IDEwMDY0NAotLS0gYS9mcy9pb21hcC5jCisrKyBiL2ZzL2lvbWFwLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCQl1bnNpZ25lZCBsb25nIGJ5dGVzOwkvKiBCeXRlcyB0byB3cml0ZSB0byBwYWdlICovCiAKIAkJb2Zmc2V0ID0gKHBvcyAmIChQQUdFX1NJWkUgLSAxKSk7Ci0JCWJ5dGVzID0gbWluX3QodW5zaWduZWQgbG9uZywgUEFHRV9TSVpFIC0gb2Zmc2V0LCBsZW5ndGgpOworCQlieXRlcyA9IG1pbl90KGxvZmZfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBsZW5ndGgpOwogCiAJCXJwYWdlID0gX19pb21hcF9yZWFkX3BhZ2UoaW5vZGUsIHBvcyk7CiAJCWlmIChJU19FUlIocnBhZ2UpKQpAQCAtMzc2LDcgKzM3Niw3IEBACiAJCXVuc2lnbmVkIG9mZnNldCwgYnl0ZXM7CiAKIAkJb2Zmc2V0ID0gcG9zICYgKFBBR0VfU0laRSAtIDEpOyAvKiBXaXRoaW4gcGFnZSAqLwotCQlieXRlcyA9IG1pbl90KHVuc2lnbmVkLCBQQUdFX1NJWkUgLSBvZmZzZXQsIGNvdW50KTsKKwkJYnl0ZXMgPSBtaW5fdChsb2ZmX3QsIFBBR0VfU0laRSAtIG9mZnNldCwgY291bnQpOwogCiAJCWlmIChJU19EQVgoaW5vZGUpKQogCQkJc3RhdHVzID0gaW9tYXBfZGF4X3plcm8ocG9zLCBvZmZzZXQsIGJ5dGVzLCBpb21hcCk7CmRpZmYgLS1naXQgYS9mcy9qZnMvYWNsLmMgYi9mcy9qZnMvYWNsLmMKaW5kZXggN2JjMTg2Zi4uMWJlNDVjOCAxMDA2NDQKLS0tIGEvZnMvamZzL2FjbC5jCisrKyBiL2ZzL2pmcy9hY2wuYwpAQCAtNzcsMTMgKzc3LDYgQEAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJZWFfbmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUzsKLQkJaWYgKGFjbCkgewotCQkJcmMgPSBwb3NpeF9hY2xfdXBkYXRlX21vZGUoaW5vZGUsICZpbm9kZS0+aV9tb2RlLCAmYWNsKTsKLQkJCWlmIChyYykKLQkJCQlyZXR1cm4gcmM7Ci0JCQlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfdGltZShpbm9kZSk7Ci0JCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJfQogCQlicmVhazsKIAljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CiAJCWVhX25hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9ERUZBVUxUOwpAQCAtMTE4LDkgKzExMSwxNyBAQAogCiAJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgMCk7CiAJbXV0ZXhfbG9jaygmSkZTX0lQKGlub2RlKS0+Y29tbWl0X211dGV4KTsKKwlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MgJiYgYWNsKSB7CisJCXJjID0gcG9zaXhfYWNsX3VwZGF0ZV9tb2RlKGlub2RlLCAmaW5vZGUtPmlfbW9kZSwgJmFjbCk7CisJCWlmIChyYykKKwkJCWdvdG8gZW5kX3R4OworCQlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfdGltZShpbm9kZSk7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KIAlyYyA9IF9famZzX3NldF9hY2wodGlkLCBpbm9kZSwgdHlwZSwgYWNsKTsKIAlpZiAoIXJjKQogCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKK2VuZF90eDoKIAl0eEVuZCh0aWQpOwogCW11dGV4X3VubG9jaygmSkZTX0lQKGlub2RlKS0+Y29tbWl0X211dGV4KTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCA3OTE3N2M5Li5lMTA4OTVjIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTQ0MDQsMTEgKzQ0MDQsMTEgQEAKIHsKIAlpbnQgZXJyb3I7CiAJYm9vbCBpc19kaXIgPSBkX2lzX2RpcihvbGRfZGVudHJ5KTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfbmFtZTsKIAlzdHJ1Y3QgaW5vZGUgKnNvdXJjZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGlub2RlICp0YXJnZXQgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCWJvb2wgbmV3X2lzX2RpciA9IGZhbHNlOwogCXVuc2lnbmVkIG1heF9saW5rcyA9IG5ld19kaXItPmlfc2ItPnNfbWF4X2xpbmtzOworCXN0cnVjdCBuYW1lX3NuYXBzaG90IG9sZF9uYW1lOwogCiAJLyoKIAkgKiBDaGVjayBzb3VyY2UgPT0gdGFyZ2V0LgpAQCAtNDQ1OSw3ICs0NDU5LDcgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCW9sZF9uYW1lID0gZnNub3RpZnlfb2xkbmFtZV9pbml0KG9sZF9kZW50cnktPmRfbmFtZS5uYW1lKTsKKwl0YWtlX2RlbnRyeV9uYW1lX3NuYXBzaG90KCZvbGRfbmFtZSwgb2xkX2RlbnRyeSk7CiAJZGdldChuZXdfZGVudHJ5KTsKIAlpZiAoIWlzX2RpciB8fCAoZmxhZ3MgJiBSRU5BTUVfRVhDSEFOR0UpKQogCQlsb2NrX3R3b19ub25kaXJlY3Rvcmllcyhzb3VyY2UsIHRhcmdldCk7CkBAIC00NTE0LDE0ICs0NTE0LDE0IEBACiAJCWlub2RlX3VubG9jayh0YXJnZXQpOwogCWRwdXQobmV3X2RlbnRyeSk7CiAJaWYgKCFlcnJvcikgewotCQlmc25vdGlmeV9tb3ZlKG9sZF9kaXIsIG5ld19kaXIsIG9sZF9uYW1lLCBpc19kaXIsCisJCWZzbm90aWZ5X21vdmUob2xkX2RpciwgbmV3X2Rpciwgb2xkX25hbWUubmFtZSwgaXNfZGlyLAogCQkJICAgICAgIShmbGFncyAmIFJFTkFNRV9FWENIQU5HRSkgPyB0YXJnZXQgOiBOVUxMLCBvbGRfZGVudHJ5KTsKIAkJaWYgKGZsYWdzICYgUkVOQU1FX0VYQ0hBTkdFKSB7CiAJCQlmc25vdGlmeV9tb3ZlKG5ld19kaXIsIG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCSAgICAgIG5ld19pc19kaXIsIE5VTEwsIG5ld19kZW50cnkpOwogCQl9CiAJfQotCWZzbm90aWZ5X29sZG5hbWVfZnJlZShvbGRfbmFtZSk7CisJcmVsZWFzZV9kZW50cnlfbmFtZV9zbmFwc2hvdCgmb2xkX25hbWUpOwogCiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCA3NzMxZjc3Li4yMTYwYmI5IDEwMDY0NAotLS0gYS9mcy9uYW1lc3BhY2UuYworKysgYi9mcy9uYW1lc3BhY2UuYwpAQCAtMjI3LDYgKzIyNyw3IEBACiAJCW1udC0+bW50X2NvdW50ID0gMTsKIAkJbW50LT5tbnRfd3JpdGVycyA9IDA7CiAjZW5kaWYKKwkJbW50LT5tbnQuZGF0YSA9IE5VTEw7CiAKIAkJSU5JVF9ITElTVF9OT0RFKCZtbnQtPm1udF9oYXNoKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKQEAgLTk3Niw3ICs5NzcsNiBAQAogCWlmICghbW50KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCW1udC0+bW50LmRhdGEgPSBOVUxMOwogCWlmICh0eXBlLT5hbGxvY19tbnRfZGF0YSkgewogCQltbnQtPm1udC5kYXRhID0gdHlwZS0+YWxsb2NfbW50X2RhdGEoKTsKIAkJaWYgKCFtbnQtPm1udC5kYXRhKSB7CkBAIC05OTAsNyArOTkwLDYgQEAKIAogCXJvb3QgPSBtb3VudF9mcyh0eXBlLCBmbGFncywgbmFtZSwgJm1udC0+bW50LCBkYXRhKTsKIAlpZiAoSVNfRVJSKHJvb3QpKSB7Ci0JCWtmcmVlKG1udC0+bW50LmRhdGEpOwogCQltbnRfZnJlZV9pZChtbnQpOwogCQlmcmVlX3Zmc21udChtbnQpOwogCQlyZXR1cm4gRVJSX0NBU1Qocm9vdCk7CkBAIC0xMTA5LDcgKzExMDgsNiBAQAogCXJldHVybiBtbnQ7CiAKICBvdXRfZnJlZToKLQlrZnJlZShtbnQtPm1udC5kYXRhKTsKIAltbnRfZnJlZV9pZChtbnQpOwogCWZyZWVfdmZzbW50KG1udCk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9LY29uZmlnIGIvZnMvbmZzL0tjb25maWcKaW5kZXggZjMxZmQwZC4uYjFkYWVhZiAxMDA2NDQKLS0tIGEvZnMvbmZzL0tjb25maWcKKysrIGIvZnMvbmZzL0tjb25maWcKQEAgLTEyMSw2ICsxMjEsNyBAQAogY29uZmlnIFBORlNfQkxPQ0sKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gTkZTX1Y0XzEgJiYgQkxLX0RFVl9ETQorCWRlcGVuZHMgb24gNjRCSVQgfHwgTEJEQUYKIAlkZWZhdWx0IE5GU19WNAogCiBjb25maWcgUE5GU19PQkpMQVlPVVQKZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCmluZGV4IGExZGU4ZWYuLjFlZWM5NDcgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtNjM2LDExICs2MzYsMTEgQEAKIAlpZiAocmVzdWx0IDw9IDApCiAJCWdvdG8gb3V0OwogCi0JcmVzdWx0ID0gZ2VuZXJpY193cml0ZV9zeW5jKGlvY2IsIHJlc3VsdCk7Ci0JaWYgKHJlc3VsdCA8IDApCi0JCWdvdG8gb3V0OwogCXdyaXR0ZW4gPSByZXN1bHQ7CiAJaW9jYi0+a2lfcG9zICs9IHdyaXR0ZW47CisJcmVzdWx0ID0gZ2VuZXJpY193cml0ZV9zeW5jKGlvY2IsIHdyaXR0ZW4pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKIAogCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgKi8KIAlpZiAobmZzX25lZWRfY2hlY2tfd3JpdGUoZmlsZSwgaW5vZGUpKSB7CkBAIC03NTcsNyArNzU3LDcgQEAKIAkgKi8KIAluZnNfc3luY19tYXBwaW5nKGZpbHAtPmZfbWFwcGluZyk7CiAJaWYgKCFORlNfUFJPVE8oaW5vZGUpLT5oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKQotCQluZnNfemFwX21hcHBpbmcoaW5vZGUsIGZpbHAtPmZfbWFwcGluZyk7CisJCW5mc196YXBfY2FjaGVzKGlub2RlKTsKIG91dDoKIAlyZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0ZGV2LmMgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYwppbmRleCBmN2EzZjZiLi45MDA5OTg5IDEwMDY0NAotLS0gYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYworKysgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYwpAQCAtMzAsNiArMzAsNyBAQAogewogCW5mczRfcHJpbnRfZGV2aWNlaWQoJm1pcnJvcl9kcy0+aWRfbm9kZS5kZXZpY2VpZCk7CiAJbmZzNF9wbmZzX2RzX3B1dChtaXJyb3JfZHMtPmRzKTsKKwlrZnJlZShtaXJyb3JfZHMtPmRzX3ZlcnNpb25zKTsKIAlrZnJlZV9yY3UobWlycm9yX2RzLCBpZF9ub2RlLnJjdSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggODBiY2MwYi4uNTJlYTQxYiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTI0OCw3ICsyNDgsNiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZnNfcGFnZWlvX29wcyBuZnNfcGdpb19yd19vcHM7CiBzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICpuZnNfcGdpb19oZWFkZXJfYWxsb2MoY29uc3Qgc3RydWN0IG5mc19yd19vcHMgKik7CiB2b2lkIG5mc19wZ2lvX2hlYWRlcl9mcmVlKHN0cnVjdCBuZnNfcGdpb19oZWFkZXIgKik7Ci12b2lkIG5mc19wZ2lvX2RhdGFfZGVzdHJveShzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICopOwogaW50IG5mc19nZW5lcmljX3BnaW8oc3RydWN0IG5mc19wYWdlaW9fZGVzY3JpcHRvciAqLCBzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICopOwogaW50IG5mc19pbml0aWF0ZV9wZ2lvKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mc19wZ2lvX2hlYWRlciAqaGRyLAogCQkgICAgICBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGNvbnN0IHN0cnVjdCBuZnNfcnBjX29wcyAqcnBjX29wcywKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggNDAxZWE2ZS4uYTUzYjhlMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTY0MTksNyArNjQxOSw3IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPmxvY2ssIGZsYWdzKTsKIAotCQlmcmVlemFibGVfc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKE5GUzRfTE9DS19NQVhUSU1FT1VUKTsKKwkJZnJlZXphYmxlX3NjaGVkdWxlX3RpbWVvdXQoTkZTNF9MT0NLX01BWFRJTUVPVVQpOwogCX0KIAogCWZpbmlzaF93YWl0KHEsICZ3YWl0KTsKQEAgLTc0MTAsNyArNzQxMCw3IEBACiAJCQljZGF0YS0+cmVzLnNlcnZlcl9zY29wZSA9IE5VTEw7CiAJCX0KIAkJLyogU2F2ZSB0aGUgRVhDSEFOR0VfSUQgdmVyaWZpZXIgc2Vzc2lvbiB0cnVuayB0ZXN0cyAqLwotCQltZW1jcHkoY2xwLT5jbF9jb25maXJtLmRhdGEsIGNkYXRhLT5hcmdzLnZlcmlmaWVyLT5kYXRhLAorCQltZW1jcHkoY2xwLT5jbF9jb25maXJtLmRhdGEsIGNkYXRhLT5hcmdzLnZlcmlmaWVyLmRhdGEsCiAJCSAgICAgICBzaXplb2YoY2xwLT5jbF9jb25maXJtLmRhdGEpKTsKIAl9CiBvdXQ6CkBAIC03NDQ3LDcgKzc0NDcsNiBAQAogc3RhdGljIGludCBfbmZzNF9wcm9jX2V4Y2hhbmdlX2lkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKIAkJCXUzMiBzcDRfaG93LCBzdHJ1Y3QgcnBjX3hwcnQgKnhwcnQpCiB7Ci0JbmZzNF92ZXJpZmllciB2ZXJpZmllcjsKIAlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0gewogCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfRVhDSEFOR0VfSURdLAogCQkucnBjX2NyZWQgPSBjcmVkLApAQCAtNzQ3MCw4ICs3NDY5LDcgQEAKIAlpZiAoIWNhbGxkYXRhKQogCQlnb3RvIG91dDsKIAotCWlmICgheHBydCkKLQkJbmZzNF9pbml0X2Jvb3RfdmVyaWZpZXIoY2xwLCAmdmVyaWZpZXIpOworCW5mczRfaW5pdF9ib290X3ZlcmlmaWVyKGNscCwgJmNhbGxkYXRhLT5hcmdzLnZlcmlmaWVyKTsKIAogCXN0YXR1cyA9IG5mczRfaW5pdF91bmlmb3JtX2NsaWVudF9zdHJpbmcoY2xwKTsKIAlpZiAoc3RhdHVzKQpAQCAtNzUxNiw5ICs3NTE0LDggQEAKIAkJdGFza19zZXR1cF9kYXRhLnJwY194cHJ0ID0geHBydDsKIAkJdGFza19zZXR1cF9kYXRhLmZsYWdzID0KIAkJCQlSUENfVEFTS19TT0ZUfFJQQ19UQVNLX1NPRlRDT05OfFJQQ19UQVNLX0FTWU5DOwotCQljYWxsZGF0YS0+YXJncy52ZXJpZmllciA9ICZjbHAtPmNsX2NvbmZpcm07Ci0JfSBlbHNlIHsKLQkJY2FsbGRhdGEtPmFyZ3MudmVyaWZpZXIgPSAmdmVyaWZpZXI7CisJCW1lbWNweShjYWxsZGF0YS0+YXJncy52ZXJpZmllci5kYXRhLCBjbHAtPmNsX2NvbmZpcm0uZGF0YSwKKwkJCQlzaXplb2YoY2FsbGRhdGEtPmFyZ3MudmVyaWZpZXIuZGF0YSkpOwogCX0KIAljYWxsZGF0YS0+YXJncy5jbGllbnQgPSBjbHA7CiAjaWZkZWYgQ09ORklHX05GU19WNF8xX01JR1JBVElPTgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczR4ZHIuYyBiL2ZzL25mcy9uZnM0eGRyLmMKaW5kZXggYzljNGQ5ODUuLjVlMjcyNGEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0eGRyLmMKKysrIGIvZnMvbmZzL25mczR4ZHIuYwpAQCAtMTc2MSw3ICsxNzYxLDcgQEAKIAlpbnQgbGVuID0gMDsKIAogCWVuY29kZV9vcF9oZHIoeGRyLCBPUF9FWENIQU5HRV9JRCwgZGVjb2RlX2V4Y2hhbmdlX2lkX21heHN6LCBoZHIpOwotCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgYXJncy0+dmVyaWZpZXIpOworCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgJmFyZ3MtPnZlcmlmaWVyKTsKIAogCWVuY29kZV9zdHJpbmcoeGRyLCBzdHJsZW4oYXJncy0+Y2xpZW50LT5jbF9vd25lcl9pZCksCiAJCQlhcmdzLT5jbGllbnQtPmNsX293bmVyX2lkKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wYWdlbGlzdC5jIGIvZnMvbmZzL3BhZ2VsaXN0LmMKaW5kZXggMTQyYTc0Zi4uM2QxN2ZjOCAxMDA2NDQKLS0tIGEvZnMvbmZzL3BhZ2VsaXN0LmMKKysrIGIvZnMvbmZzL3BhZ2VsaXN0LmMKQEAgLTQ5NywxNiArNDk3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mc19wZ2lvX2hlYWRlcl9hbGxvYyk7CiAKLS8qCi0gKiBuZnNfcGdpb19oZWFkZXJfZnJlZSAtIEZyZWUgYSByZWFkIG9yIHdyaXRlIGhlYWRlcgotICogQGhkcjogVGhlIGhlYWRlciB0byBmcmVlCi0gKi8KLXZvaWQgbmZzX3BnaW9faGVhZGVyX2ZyZWUoc3RydWN0IG5mc19wZ2lvX2hlYWRlciAqaGRyKQotewotCWhkci0+cndfb3BzLT5yd19mcmVlX2hlYWRlcihoZHIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZzX3BnaW9faGVhZGVyX2ZyZWUpOwotCiAvKioKICAqIG5mc19wZ2lvX2RhdGFfZGVzdHJveSAtIG1ha2UgQGhkciBzdWl0YWJsZSBmb3IgcmV1c2UKICAqCkBAIC01MTUsMTQgKzUwNSwyNCBAQAogICoKICAqIEBoZHI6IEEgaGVhZGVyIHRoYXQgaGFzIGhhZCBuZnNfZ2VuZXJpY19wZ2lvIGNhbGxlZAogICovCi12b2lkIG5mc19wZ2lvX2RhdGFfZGVzdHJveShzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICpoZHIpCitzdGF0aWMgdm9pZCBuZnNfcGdpb19kYXRhX2Rlc3Ryb3koc3RydWN0IG5mc19wZ2lvX2hlYWRlciAqaGRyKQogewogCWlmIChoZHItPmFyZ3MuY29udGV4dCkKIAkJcHV0X25mc19vcGVuX2NvbnRleHQoaGRyLT5hcmdzLmNvbnRleHQpOwogCWlmIChoZHItPnBhZ2VfYXJyYXkucGFnZXZlYyAhPSBoZHItPnBhZ2VfYXJyYXkucGFnZV9hcnJheSkKIAkJa2ZyZWUoaGRyLT5wYWdlX2FycmF5LnBhZ2V2ZWMpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobmZzX3BnaW9fZGF0YV9kZXN0cm95KTsKKworLyoKKyAqIG5mc19wZ2lvX2hlYWRlcl9mcmVlIC0gRnJlZSBhIHJlYWQgb3Igd3JpdGUgaGVhZGVyCisgKiBAaGRyOiBUaGUgaGVhZGVyIHRvIGZyZWUKKyAqLwordm9pZCBuZnNfcGdpb19oZWFkZXJfZnJlZShzdHJ1Y3QgbmZzX3BnaW9faGVhZGVyICpoZHIpCit7CisJbmZzX3BnaW9fZGF0YV9kZXN0cm95KGhkcik7CisJaGRyLT5yd19vcHMtPnJ3X2ZyZWVfaGVhZGVyKGhkcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnNfcGdpb19oZWFkZXJfZnJlZSk7CiAKIC8qKgogICogbmZzX3BnaW9fcnBjc2V0dXAgLSBTZXQgdXAgYXJndW1lbnRzIGZvciBhIHBhZ2VpbyBjYWxsCkBAIC02MzYsNyArNjM2LDYgQEAKIHN0YXRpYyB2b2lkIG5mc19wZ2lvX2Vycm9yKHN0cnVjdCBuZnNfcGdpb19oZWFkZXIgKmhkcikKIHsKIAlzZXRfYml0KE5GU19JT0hEUl9SRURPLCAmaGRyLT5mbGFncyk7Ci0JbmZzX3BnaW9fZGF0YV9kZXN0cm95KGhkcik7CiAJaGRyLT5jb21wbGV0aW9uX29wcy0+Y29tcGxldGlvbihoZHIpOwogfQogCkBAIC02NDcsNyArNjQ2LDYgQEAKIHN0YXRpYyB2b2lkIG5mc19wZ2lvX3JlbGVhc2Uodm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mc19wZ2lvX2hlYWRlciAqaGRyID0gY2FsbGRhdGE7Ci0JbmZzX3BnaW9fZGF0YV9kZXN0cm95KGhkcik7CiAJaGRyLT5jb21wbGV0aW9uX29wcy0+Y29tcGxldGlvbihoZHIpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCA0MTVkN2U2Li5iN2EwN2JhIDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5jCisrKyBiL2ZzL25mcy9wbmZzLmMKQEAgLTIxNDUsNyArMjE0NSw2IEBACiAJCW5mc19wYWdlaW9fcmVzZXRfd3JpdGVfbWRzKGRlc2MpOwogCQltaXJyb3ItPnBnX3JlY29hbGVzY2UgPSAxOwogCX0KLQluZnNfcGdpb19kYXRhX2Rlc3Ryb3koaGRyKTsKIAloZHItPnJlbGVhc2UoaGRyKTsKIH0KIApAQCAtMjI1Nyw3ICsyMjU2LDYgQEAKIAkJbmZzX3BhZ2Vpb19yZXNldF9yZWFkX21kcyhkZXNjKTsKIAkJbWlycm9yLT5wZ19yZWNvYWxlc2NlID0gMTsKIAl9Ci0JbmZzX3BnaW9fZGF0YV9kZXN0cm95KGhkcik7CiAJaGRyLT5yZWxlYXNlKGhkcik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggNGU3YTU2YS4uMmM0ZjdhMiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCWFyZ3AtPnAgPSBwYWdlX2FkZHJlc3MoYXJncC0+cGFnZWxpc3RbMF0pOwogCWFyZ3AtPnBhZ2VsaXN0Kys7CiAJaWYgKGFyZ3AtPnBhZ2VsZW4gPCBQQUdFX1NJWkUpIHsKLQkJYXJncC0+ZW5kID0gYXJncC0+cCArIChhcmdwLT5wYWdlbGVuPj4yKTsKKwkJYXJncC0+ZW5kID0gYXJncC0+cCArIFhEUl9RVUFETEVOKGFyZ3AtPnBhZ2VsZW4pOwogCQlhcmdwLT5wYWdlbGVuID0gMDsKIAl9IGVsc2UgewogCQlhcmdwLT5lbmQgPSBhcmdwLT5wICsgKFBBR0VfU0laRT4+Mik7CkBAIC0xMjQ2LDkgKzEyNDYsNyBAQAogCQlhcmdwLT5wYWdlbGVuIC09IHBhZ2VzICogUEFHRV9TSVpFOwogCQlsZW4gLT0gcGFnZXMgKiBQQUdFX1NJWkU7CiAKLQkJYXJncC0+cCA9IChfX2JlMzIgKilwYWdlX2FkZHJlc3MoYXJncC0+cGFnZWxpc3RbMF0pOwotCQlhcmdwLT5wYWdlbGlzdCsrOwotCQlhcmdwLT5lbmQgPSBhcmdwLT5wICsgWERSX1FVQURMRU4oUEFHRV9TSVpFKTsKKwkJbmV4dF9kZWNvZGVfcGFnZShhcmdwKTsKIAl9CiAJYXJncC0+cCArPSBYRFJfUVVBRExFTihsZW4pOwogCmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZnNub3RpZnkuYyBiL2ZzL25vdGlmeS9mc25vdGlmeS5jCmluZGV4IGRiMzlkZTIuLmE2NGFkYzIgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9mc25vdGlmeS5jCisrKyBiL2ZzL25vdGlmeS9mc25vdGlmeS5jCkBAIC0xMDQsMTYgKzEwNCwyMCBAQAogCWlmICh1bmxpa2VseSghZnNub3RpZnlfaW5vZGVfd2F0Y2hlc19jaGlsZHJlbihwX2lub2RlKSkpCiAJCV9fZnNub3RpZnlfdXBkYXRlX2NoaWxkX2RlbnRyeV9mbGFncyhwX2lub2RlKTsKIAllbHNlIGlmIChwX2lub2RlLT5pX2Zzbm90aWZ5X21hc2sgJiBtYXNrKSB7CisJCXN0cnVjdCBuYW1lX3NuYXBzaG90IG5hbWU7CisKIAkJLyogd2UgYXJlIG5vdGlmeWluZyBhIHBhcmVudCBzbyBjb21lIHVwIHdpdGggdGhlIG5ldyBtYXNrIHdoaWNoCiAJCSAqIHNwZWNpZmllcyB0aGVzZSBhcmUgZXZlbnRzIHdoaWNoIGNhbWUgZnJvbSBhIGNoaWxkLiAqLwogCQltYXNrIHw9IEZTX0VWRU5UX09OX0NISUxEOwogCisJCXRha2VfZGVudHJ5X25hbWVfc25hcHNob3QoJm5hbWUsIGRlbnRyeSk7CiAJCWlmIChwYXRoKQogCQkJcmV0ID0gZnNub3RpZnkocF9pbm9kZSwgbWFzaywgcGF0aCwgRlNOT1RJRllfRVZFTlRfUEFUSCwKLQkJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgMCk7CisJCQkJICAgICAgIG5hbWUubmFtZSwgMCk7CiAJCWVsc2UKIAkJCXJldCA9IGZzbm90aWZ5KHBfaW5vZGUsIG1hc2ssIGRlbnRyeS0+ZF9pbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsCi0JCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIDApOworCQkJCSAgICAgICBuYW1lLm5hbWUsIDApOworCQlyZWxlYXNlX2RlbnRyeV9uYW1lX3NuYXBzaG90KCZuYW1lKTsKIAl9CiAKIAlkcHV0KHBhcmVudCk7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcmFtLmMgYi9mcy9wc3RvcmUvcmFtLmMKaW5kZXggYmQyZGMzNC4uOGUxNTFmYiAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL3JhbS5jCisrKyBiL2ZzL3BzdG9yZS9yYW0uYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGN4dC0+bWF4X2R1bXBfY250OyBpKyspIHsKIAkJY3h0LT5wcnpzW2ldID0gcGVyc2lzdGVudF9yYW1fbmV3KCpwYWRkciwgY3h0LT5yZWNvcmRfc2l6ZSwgMCwKIAkJCQkJCSAgJmN4dC0+ZWNjX2luZm8sCi0JCQkJCQkgIGN4dC0+bWVtdHlwZSk7CisJCQkJCQkgIGN4dC0+bWVtdHlwZSwgMCk7CiAJCWlmIChJU19FUlIoY3h0LT5wcnpzW2ldKSkgewogCQkJZXJyID0gUFRSX0VSUihjeHQtPnByenNbaV0pOwogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW0gcmVnaW9uICgweCV6eEAweCVsbHgpOiAlZFxuIiwKQEAgLTQ3MSw3ICs0NzEsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQkqcHJ6ID0gcGVyc2lzdGVudF9yYW1fbmV3KCpwYWRkciwgc3osIHNpZywgJmN4dC0+ZWNjX2luZm8sIGN4dC0+bWVtdHlwZSk7CisJKnByeiA9IHBlcnNpc3RlbnRfcmFtX25ldygqcGFkZHIsIHN6LCBzaWcsICZjeHQtPmVjY19pbmZvLAorCQkJCSAgY3h0LT5tZW10eXBlLCAwKTsKIAlpZiAoSVNfRVJSKCpwcnopKSB7CiAJCWludCBlcnIgPSBQVFJfRVJSKCpwcnopOwogCmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcmFtX2NvcmUuYyBiL2ZzL3BzdG9yZS9yYW1fY29yZS5jCmluZGV4IDM5NzVkZWUuLmUxMTY3MmEgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9yYW1fY29yZS5jCisrKyBiL2ZzL3BzdG9yZS9yYW1fY29yZS5jCkBAIC00OCwxNiArNDgsMTUgQEAKIAlyZXR1cm4gYXRvbWljX3JlYWQoJnByei0+YnVmZmVyLT5zdGFydCk7CiB9CiAKLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGJ1ZmZlcl9sb2NrKTsKLQogLyogaW5jcmVhc2UgYW5kIHdyYXAgdGhlIHN0YXJ0IHBvaW50ZXIsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlICovCiBzdGF0aWMgc2l6ZV90IGJ1ZmZlcl9zdGFydF9hZGQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCiB7CiAJaW50IG9sZDsKIAlpbnQgbmV3OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmJ1ZmZlcl9sb2NrLCBmbGFncyk7CisJaWYgKCEocHJ6LT5mbGFncyAmIFBSWl9GTEFHX05PX0xPQ0spKQorCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnByei0+YnVmZmVyX2xvY2ssIGZsYWdzKTsKIAogCW9sZCA9IGF0b21pY19yZWFkKCZwcnotPmJ1ZmZlci0+c3RhcnQpOwogCW5ldyA9IG9sZCArIGE7CkBAIC02NSw3ICs2NCw4IEBACiAJCW5ldyAtPSBwcnotPmJ1ZmZlcl9zaXplOwogCWF0b21pY19zZXQoJnByei0+YnVmZmVyLT5zdGFydCwgbmV3KTsKIAotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWZmZXJfbG9jaywgZmxhZ3MpOworCWlmICghKHByei0+ZmxhZ3MgJiBQUlpfRkxBR19OT19MT0NLKSkKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByei0+YnVmZmVyX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBvbGQ7CiB9CkBAIC03NSw5ICs3NSwxMCBAQAogewogCXNpemVfdCBvbGQ7CiAJc2l6ZV90IG5ldzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZidWZmZXJfbG9jaywgZmxhZ3MpOworCWlmICghKHByei0+ZmxhZ3MgJiBQUlpfRkxBR19OT19MT0NLKSkKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwcnotPmJ1ZmZlcl9sb2NrLCBmbGFncyk7CiAKIAlvbGQgPSBhdG9taWNfcmVhZCgmcHJ6LT5idWZmZXItPnNpemUpOwogCWlmIChvbGQgPT0gcHJ6LT5idWZmZXJfc2l6ZSkKQEAgLTg5LDcgKzkwLDggQEAKIAlhdG9taWNfc2V0KCZwcnotPmJ1ZmZlci0+c2l6ZSwgbmV3KTsKIAogZXhpdDoKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVmZmVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShwcnotPmZsYWdzICYgUFJaX0ZMQUdfTk9fTE9DSykpCisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnotPmJ1ZmZlcl9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vdHJhY2UgcGVyc2lzdGVudF9yYW1fZW5jb2RlX3JzOChzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LApAQCAtNDkxLDYgKzQ5Myw3IEBACiAJCQkgcHJ6LT5idWZmZXItPnNpZyk7CiAJfQogCisJLyogUmV3aW5kIG1pc3Npbmcgb3IgaW52YWxpZCBtZW1vcnkgYXJlYS4gKi8KIAlwcnotPmJ1ZmZlci0+c2lnID0gc2lnOwogCXBlcnNpc3RlbnRfcmFtX3phcChwcnopOwogCkBAIC01MTcsNyArNTIwLDcgQEAKIAogc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnBlcnNpc3RlbnRfcmFtX25ldyhwaHlzX2FkZHJfdCBzdGFydCwgc2l6ZV90IHNpemUsCiAJCQl1MzIgc2lnLCBzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fZWNjX2luZm8gKmVjY19pbmZvLAotCQkJdW5zaWduZWQgaW50IG1lbXR5cGUpCisJCQl1bnNpZ25lZCBpbnQgbWVtdHlwZSwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcno7CiAJaW50IHJldCA9IC1FTk9NRU07CkBAIC01MjgsNiArNTMxLDEwIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCS8qIEluaXRpYWxpemUgZ2VuZXJhbCBidWZmZXIgc3RhdGUuICovCisJcmF3X3NwaW5fbG9ja19pbml0KCZwcnotPmJ1ZmZlcl9sb2NrKTsKKwlwcnotPmZsYWdzID0gZmxhZ3M7CisKIAlyZXQgPSBwZXJzaXN0ZW50X3JhbV9idWZmZXJfbWFwKHN0YXJ0LCBzaXplLCBwcnosIG1lbXR5cGUpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZnMvc2RjYXJkZnMvZGVyaXZlZF9wZXJtLmMgYi9mcy9zZGNhcmRmcy9kZXJpdmVkX3Blcm0uYwppbmRleCAxMjM5ZDFjLi5mZmZhYWQ0IDEwMDY0NAotLS0gYS9mcy9zZGNhcmRmcy9kZXJpdmVkX3Blcm0uYworKysgYi9mcy9zZGNhcmRmcy9kZXJpdmVkX3Blcm0uYwpAQCAtMTc2LDYgKzE3Niw5IEBACiAJZ2lkX3QgZ2lkID0gc2JpLT5vcHRpb25zLmZzX2xvd19naWQ7CiAJc3RydWN0IGlhdHRyIG5ld2F0dHJzOwogCisJaWYgKCFzYmktPm9wdGlvbnMuZ2lkX2Rlcml2YXRpb24pCisJCXJldHVybjsKKwogCWluZm8gPSBTRENBUkRGU19JKGRfaW5vZGUoZGVudHJ5KSk7CiAJaW5mb19kID0gaW5mby0+ZGF0YTsKIAlwZXJtID0gaW5mb19kLT5wZXJtOwpkaWZmIC0tZ2l0IGEvZnMvc2RjYXJkZnMvZmlsZS5jIGIvZnMvc2RjYXJkZnMvZmlsZS5jCmluZGV4IDYwNzZjMzQuLjVhYzBiMGIgMTAwNjQ0Ci0tLSBhL2ZzL3NkY2FyZGZzL2ZpbGUuYworKysgYi9mcy9zZGNhcmRmcy9maWxlLmMKQEAgLTEwNCwxMiArMTA0LDE5IEBACiB7CiAJbG9uZyBlcnIgPSAtRU5PVFRZOwogCXN0cnVjdCBmaWxlICpsb3dlcl9maWxlOworCWNvbnN0IHN0cnVjdCBjcmVkICpzYXZlZF9jcmVkID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCXN0cnVjdCBzZGNhcmRmc19zYl9pbmZvICpzYmkgPSBTRENBUkRGU19TQihkZW50cnktPmRfc2IpOwogCiAJbG93ZXJfZmlsZSA9IHNkY2FyZGZzX2xvd2VyX2ZpbGUoZmlsZSk7CiAKIAkvKiBYWFg6IHVzZSB2ZnNfaW9jdGwgaWYvd2hlbiBWRlMgZXhwb3J0cyBpdCAqLwogCWlmICghbG93ZXJfZmlsZSB8fCAhbG93ZXJfZmlsZS0+Zl9vcCkKIAkJZ290byBvdXQ7CisKKwkvKiBzYXZlIGN1cnJlbnRfY3JlZCBhbmQgb3ZlcnJpZGUgaXQgKi8KKwlPVkVSUklERV9DUkVEKHNiaSwgc2F2ZWRfY3JlZCwgU0RDQVJERlNfSShmaWxlX2lub2RlKGZpbGUpKSk7CisKIAlpZiAobG93ZXJfZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpCiAJCWVyciA9IGxvd2VyX2ZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKGxvd2VyX2ZpbGUsIGNtZCwgYXJnKTsKIApAQCAtMTE3LDYgKzEyNCw3IEBACiAJaWYgKCFlcnIpCiAJCXNkY2FyZGZzX2NvcHlfYW5kX2ZpeF9hdHRycyhmaWxlX2lub2RlKGZpbGUpLAogCQkJCSAgICAgIGZpbGVfaW5vZGUobG93ZXJfZmlsZSkpOworCVJFVkVSVF9DUkVEKHNhdmVkX2NyZWQpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xMjcsMTUgKzEzNSwyMyBAQAogewogCWxvbmcgZXJyID0gLUVOT1RUWTsKIAlzdHJ1Y3QgZmlsZSAqbG93ZXJfZmlsZTsKKwljb25zdCBzdHJ1Y3QgY3JlZCAqc2F2ZWRfY3JlZCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9wYXRoLmRlbnRyeTsKKwlzdHJ1Y3Qgc2RjYXJkZnNfc2JfaW5mbyAqc2JpID0gU0RDQVJERlNfU0IoZGVudHJ5LT5kX3NiKTsKIAogCWxvd2VyX2ZpbGUgPSBzZGNhcmRmc19sb3dlcl9maWxlKGZpbGUpOwogCiAJLyogWFhYOiB1c2UgdmZzX2lvY3RsIGlmL3doZW4gVkZTIGV4cG9ydHMgaXQgKi8KIAlpZiAoIWxvd2VyX2ZpbGUgfHwgIWxvd2VyX2ZpbGUtPmZfb3ApCiAJCWdvdG8gb3V0OworCisJLyogc2F2ZSBjdXJyZW50X2NyZWQgYW5kIG92ZXJyaWRlIGl0ICovCisJT1ZFUlJJREVfQ1JFRChzYmksIHNhdmVkX2NyZWQsIFNEQ0FSREZTX0koZmlsZV9pbm9kZShmaWxlKSkpOworCiAJaWYgKGxvd2VyX2ZpbGUtPmZfb3AtPmNvbXBhdF9pb2N0bCkKIAkJZXJyID0gbG93ZXJfZmlsZS0+Zl9vcC0+Y29tcGF0X2lvY3RsKGxvd2VyX2ZpbGUsIGNtZCwgYXJnKTsKIAorCVJFVkVSVF9DUkVEKHNhdmVkX2NyZWQpOwogb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9zZGNhcmRmcy9pbm9kZS5jIGIvZnMvc2RjYXJkZnMvaW5vZGUuYwppbmRleCA2ODNiNDkyLi40YTk3MWUyIDEwMDY0NAotLS0gYS9mcy9zZGNhcmRmcy9pbm9kZS5jCisrKyBiL2ZzL3NkY2FyZGZzL2lub2RlLmMKQEAgLTM0LDEwICszNCwxNCBAQAogCWlmICghY3JlZCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZGF0YS0+dW5kZXJfb2JiKQotCQl1aWQgPSBBSURfTUVESUFfT0JCOwotCWVsc2UKLQkJdWlkID0gbXVsdGl1c2VyX2dldF91aWQoZGF0YS0+dXNlcmlkLCBzYmktPm9wdGlvbnMuZnNfbG93X3VpZCk7CisJaWYgKHNiaS0+b3B0aW9ucy5naWRfZGVyaXZhdGlvbikgeworCQlpZiAoZGF0YS0+dW5kZXJfb2JiKQorCQkJdWlkID0gQUlEX01FRElBX09CQjsKKwkJZWxzZQorCQkJdWlkID0gbXVsdGl1c2VyX2dldF91aWQoZGF0YS0+dXNlcmlkLCBzYmktPm9wdGlvbnMuZnNfbG93X3VpZCk7CisJfSBlbHNlIHsKKwkJdWlkID0gc2JpLT5vcHRpb25zLmZzX2xvd191aWQ7CisJfQogCWNyZWQtPmZzdWlkID0gbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIHVpZCk7CiAJY3JlZC0+ZnNnaWQgPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgc2JpLT5vcHRpb25zLmZzX2xvd19naWQpOwogCmRpZmYgLS1naXQgYS9mcy9zZGNhcmRmcy9tYWluLmMgYi9mcy9zZGNhcmRmcy9tYWluLmMKaW5kZXggODA4MjViMi4uMGEyYjUxNiAxMDA2NDQKLS0tIGEvZnMvc2RjYXJkZnMvbWFpbi5jCisrKyBiL2ZzL3NkY2FyZGZzL21haW4uYwpAQCAtMzIsNiArMzIsNyBAQAogCU9wdF9tdWx0aXVzZXIsCiAJT3B0X3VzZXJpZCwKIAlPcHRfcmVzZXJ2ZWRfbWIsCisJT3B0X2dpZF9kZXJpdmF0aW9uLAogCU9wdF9lcnIsCiB9OwogCkBAIC00Myw2ICs0NCw3IEBACiAJe09wdF9tYXNrLCAibWFzaz0ldSJ9LAogCXtPcHRfdXNlcmlkLCAidXNlcmlkPSVkIn0sCiAJe09wdF9tdWx0aXVzZXIsICJtdWx0aXVzZXIifSwKKwl7T3B0X2dpZF9kZXJpdmF0aW9uLCAiZGVyaXZlX2dpZCJ9LAogCXtPcHRfcmVzZXJ2ZWRfbWIsICJyZXNlcnZlZF9tYj0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKQEAgLTY0LDYgKzY2LDggQEAKIAl2ZnNvcHRzLT5naWQgPSAwOwogCS8qIGJ5IGRlZmF1bHQsIDBNQiBpcyByZXNlcnZlZCAqLwogCW9wdHMtPnJlc2VydmVkX21iID0gMDsKKwkvKiBieSBkZWZhdWx0LCBnaWQgZGVyaXZhdGlvbiBpcyBvZmYgKi8KKwlvcHRzLT5naWRfZGVyaXZhdGlvbiA9IGZhbHNlOwogCiAJKmRlYnVnID0gMDsKIApAQCAtMTE1LDYgKzExOSw5IEBACiAJCQkJcmV0dXJuIDA7CiAJCQlvcHRzLT5yZXNlcnZlZF9tYiA9IG9wdGlvbjsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9naWRfZGVyaXZhdGlvbjoKKwkJCW9wdHMtPmdpZF9kZXJpdmF0aW9uID0gdHJ1ZTsKKwkJCWJyZWFrOwogCQkvKiB1bmtub3duIG9wdGlvbiAqLwogCQlkZWZhdWx0OgogCQkJaWYgKCFzaWxlbnQpCmRpZmYgLS1naXQgYS9mcy9zZGNhcmRmcy9zZGNhcmRmcy5oIGIvZnMvc2RjYXJkZnMvc2RjYXJkZnMuaAppbmRleCA0ZTBjZTQ5Li5kMWQ4YmFiIDEwMDY0NAotLS0gYS9mcy9zZGNhcmRmcy9zZGNhcmRmcy5oCisrKyBiL2ZzL3NkY2FyZGZzL3NkY2FyZGZzLmgKQEAgLTIxOSw2ICsyMTksNyBAQAogCWdpZF90IGZzX2xvd19naWQ7CiAJdXNlcmlkX3QgZnNfdXNlcl9pZDsKIAlib29sIG11bHRpdXNlcjsKKwlib29sIGdpZF9kZXJpdmF0aW9uOwogCXVuc2lnbmVkIGludCByZXNlcnZlZF9tYjsKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3NkY2FyZGZzL3N1cGVyLmMgYi9mcy9zZGNhcmRmcy9zdXBlci5jCmluZGV4IDdmNDUzOWIuLmI4OTk0N2QgMTAwNjQ0Ci0tLSBhL2ZzL3NkY2FyZGZzL3N1cGVyLmMKKysrIGIvZnMvc2RjYXJkZnMvc3VwZXIuYwpAQCAtMzAyLDYgKzMwMiw4IEBACiAJCXNlcV9wcmludGYobSwgIixtYXNrPSV1IiwgdmZzb3B0cy0+bWFzayk7CiAJaWYgKG9wdHMtPmZzX3VzZXJfaWQpCiAJCXNlcV9wcmludGYobSwgIix1c2VyaWQ9JXUiLCBvcHRzLT5mc191c2VyX2lkKTsKKwlpZiAob3B0cy0+Z2lkX2Rlcml2YXRpb24pCisJCXNlcV9wdXRzKG0sICIsZGVyaXZlX2dpZCIpOwogCWlmIChvcHRzLT5yZXNlcnZlZF9tYiAhPSAwKQogCQlzZXFfcHJpbnRmKG0sICIscmVzZXJ2ZWQ9JXVNQiIsIG9wdHMtPnJlc2VydmVkX21iKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMvbGlieGZzL3hmc19hdHRyX2xlYWYuYwppbmRleCAyODUyNTIxLi5jNmMxNWU1IDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtMzUxLDcgKzM1MSw3IEBACiAKIAllcnIgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBibm8sIG1hcHBlZGJubywgYnBwLAogCQkJCVhGU19BVFRSX0ZPUkssICZ4ZnNfYXR0cjNfbGVhZl9idWZfb3BzKTsKLQlpZiAoIWVyciAmJiB0cCkKKwlpZiAoIWVyciAmJiB0cCAmJiAqYnBwKQogCQl4ZnNfdHJhbnNfYnVmX3NldF90eXBlKHRwLCAqYnBwLCBYRlNfQkxGVF9BVFRSX0xFQUZfQlVGKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jIGIvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jCmluZGV4IDJhOGNiZDEuLmQyZjRhYjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCiAjZWxzZQogI2RlZmluZSB4ZnNfYm1hcF9jaGVja19sZWFmX2V4dGVudHMoY3VyLCBpcCwgd2hpY2hmb3JrKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZQl4ZnNfYm1hcF92YWxpZGF0ZV9yZXQoYm5vLGxlbixmbGFncyxtdmFsLG9ubWFwLG5tYXApCisjZGVmaW5lCXhmc19ibWFwX3ZhbGlkYXRlX3JldChibm8sbGVuLGZsYWdzLG12YWwsb25tYXAsbm1hcCkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmIC8qIERFQlVHICovCiAKIC8qCkBAIC01NTU1LDYgKzU1NTUsOCBAQAogCWludAkJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyaWJ1dGUgZm9yayAqLwogCXhmc19mc2Jsb2NrX3QJCXN1bTsKIAl4ZnNfZmlsYmxrc190CQlsZW4gPSAqcmxlbjsJLyogbGVuZ3RoIHRvIHVubWFwIGluIGZpbGUgKi8KKwl4ZnNfZmlsZW9mZl90CQltYXhfbGVuOworCXhmc19hZ251bWJlcl90CQlwcmV2X2Fnbm8gPSBOVUxMQUdOVU1CRVIsIGFnbm87CiAKIAl0cmFjZV94ZnNfYnVubWFwKGlwLCBibm8sIGxlbiwgZmxhZ3MsIF9SRVRfSVBfKTsKIApAQCAtNTU3Niw2ICs1NTc4LDE2IEBACiAJQVNTRVJUKGxlbiA+IDApOwogCUFTU0VSVChuZXh0cyA+PSAwKTsKIAorCS8qCisJICogR3Vlc3N0aW1hdGUgaG93IG1hbnkgYmxvY2tzIHdlIGNhbiB1bm1hcCB3aXRob3V0IHJ1bm5pbmcgdGhlIHJpc2sgb2YKKwkgKiBibG93aW5nIG91dCB0aGUgdHJhbnNhY3Rpb24gd2l0aCBhIG1peCBvZiBFRklzIGFuZCByZWZsaW5rCisJICogYWRqdXN0bWVudHMuCisJICovCisJaWYgKHhmc19pc19yZWZsaW5rX2lub2RlKGlwKSAmJiB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykKKwkJbWF4X2xlbiA9IG1pbihsZW4sIHhmc19yZWZjb3VudF9tYXhfdW5tYXAodHAtPnRfbG9nX3JlcykpOworCWVsc2UKKwkJbWF4X2xlbiA9IGxlbjsKKwogCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgogCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQogCQlyZXR1cm4gZXJyb3I7CkBAIC01NjIxLDcgKzU2MzMsNyBAQAogCiAJZXh0bm8gPSAwOwogCXdoaWxlIChibm8gIT0gKHhmc19maWxlb2ZmX3QpLTEgJiYgYm5vID49IHN0YXJ0ICYmIGxhc3R4ID49IDAgJiYKLQkgICAgICAgKG5leHRzID09IDAgfHwgZXh0bm8gPCBuZXh0cykpIHsKKwkgICAgICAgKG5leHRzID09IDAgfHwgZXh0bm8gPCBuZXh0cykgJiYgbWF4X2xlbiA+IDApIHsKIAkJLyoKIAkJICogSXMgdGhlIGZvdW5kIGV4dGVudCBhZnRlciBhIGhvbGUgaW4gd2hpY2ggYm5vIGxpdmVzPwogCQkgKiBKdXN0IGJhY2sgdXAgdG8gdGhlIHByZXZpb3VzIGV4dGVudCwgaWYgc28uCkBAIC01NjQ3LDYgKzU2NTksMTcgQEAKIAkJQVNTRVJUKGVwICE9IE5VTEwpOwogCQlkZWwgPSBnb3Q7CiAJCXdhc2RlbCA9IGlzbnVsbHN0YXJ0YmxvY2soZGVsLmJyX3N0YXJ0YmxvY2spOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCB0b3VjaCBtdWx0aXBsZSBBR0YgaGVhZGVycyBvdXQgb2Ygb3JkZXIKKwkJICogaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24sIGFzIHRoYXQgY291bGQgY2F1c2UgQUItQkEgZGVhZGxvY2tzLgorCQkgKi8KKwkJaWYgKCF3YXNkZWwpIHsKKwkJCWFnbm8gPSBYRlNfRlNCX1RPX0FHTk8obXAsIGRlbC5icl9zdGFydGJsb2NrKTsKKwkJCWlmIChwcmV2X2Fnbm8gIT0gTlVMTEFHTlVNQkVSICYmIHByZXZfYWdubyA+IGFnbm8pCisJCQkJYnJlYWs7CisJCQlwcmV2X2Fnbm8gPSBhZ25vOworCQl9CiAJCWlmIChnb3QuYnJfc3RhcnRvZmYgPCBzdGFydCkgewogCQkJZGVsLmJyX3N0YXJ0b2ZmID0gc3RhcnQ7CiAJCQlkZWwuYnJfYmxvY2tjb3VudCAtPSBzdGFydCAtIGdvdC5icl9zdGFydG9mZjsKQEAgLTU2NTUsNiArNTY3OCwxNSBAQAogCQl9CiAJCWlmIChkZWwuYnJfc3RhcnRvZmYgKyBkZWwuYnJfYmxvY2tjb3VudCA+IGJubyArIDEpCiAJCQlkZWwuYnJfYmxvY2tjb3VudCA9IGJubyArIDEgLSBkZWwuYnJfc3RhcnRvZmY7CisKKwkJLyogSG93IG11Y2ggY2FuIHdlIHNhZmVseSB1bm1hcD8gKi8KKwkJaWYgKG1heF9sZW4gPCBkZWwuYnJfYmxvY2tjb3VudCkgeworCQkJZGVsLmJyX3N0YXJ0b2ZmICs9IGRlbC5icl9ibG9ja2NvdW50IC0gbWF4X2xlbjsKKwkJCWlmICghd2FzZGVsKQorCQkJCWRlbC5icl9zdGFydGJsb2NrICs9IGRlbC5icl9ibG9ja2NvdW50IC0gbWF4X2xlbjsKKwkJCWRlbC5icl9ibG9ja2NvdW50ID0gbWF4X2xlbjsKKwkJfQorCiAJCXN1bSA9IGRlbC5icl9zdGFydGJsb2NrICsgZGVsLmJyX2Jsb2NrY291bnQ7CiAJCWlmIChpc3J0ICYmCiAJCSAgICAobW9kID0gZG9fbW9kKHN1bSwgbXAtPm1fc2Iuc2JfcmV4dHNpemUpKSkgewpAQCAtNTgzNSw2ICs1ODY3LDcgQEAKIAkJaWYgKCFpc3J0ICYmIHdhc2RlbCkKIAkJCXhmc19tb2RfZmRibG9ja3MobXAsIChpbnQ2NF90KWRlbC5icl9ibG9ja2NvdW50LCBmYWxzZSk7CiAKKwkJbWF4X2xlbiAtPSBkZWwuYnJfYmxvY2tjb3VudDsKIAkJYm5vID0gZGVsLmJyX3N0YXJ0b2ZmIC0gMTsKIG5vZGVsZXRlOgogCQkvKgpAQCAtNjYwNCwyNSArNjYzNywzMyBAQAogCWludAkJCQl3aGljaGZvcmssCiAJeGZzX2ZpbGVvZmZfdAkJCXN0YXJ0b2ZmLAogCXhmc19mc2Jsb2NrX3QJCQlzdGFydGJsb2NrLAotCXhmc19maWxibGtzX3QJCQlibG9ja2NvdW50LAorCXhmc19maWxibGtzX3QJCQkqYmxvY2tjb3VudCwKIAl4ZnNfZXhudHN0X3QJCQlzdGF0ZSkKIHsKIAlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkJYm1hcDsKIAlpbnQJCQkJbmltYXBzID0gMTsKIAl4ZnNfZnNibG9ja190CQkJZmlyc3Rmc2I7CiAJaW50CQkJCWZsYWdzID0gWEZTX0JNQVBJX1JFTUFQOwotCWludAkJCQlkb25lOwogCWludAkJCQllcnJvciA9IDA7CiAKIAlibWFwLmJyX3N0YXJ0YmxvY2sgPSBzdGFydGJsb2NrOwogCWJtYXAuYnJfc3RhcnRvZmYgPSBzdGFydG9mZjsKLQlibWFwLmJyX2Jsb2NrY291bnQgPSBibG9ja2NvdW50OworCWJtYXAuYnJfYmxvY2tjb3VudCA9ICpibG9ja2NvdW50OwogCWJtYXAuYnJfc3RhdGUgPSBzdGF0ZTsKIAorCS8qCisJICogZmlyc3Rmc2IgaXMgdGllZCB0byB0aGUgdHJhbnNhY3Rpb24gbGlmZXRpbWUgYW5kIGlzIHVzZWQgdG8KKwkgKiBlbnN1cmUgY29ycmVjdCBBRyBsb2NraW5nIG9yZGVyIGFuZCBzY2hlZHVsZSB3b3JrIGl0ZW0KKwkgKiBjb250aW51YXRpb25zLiAgWEZTX0JVSV9NQVhfRkFTVF9FWFRFTlRTICg9PSAxKSByZXN0cmljdHMgdXMKKwkgKiB0byBvbmx5IG1ha2luZyBvbmUgYm1hcCBjYWxsIHBlciB0cmFuc2FjdGlvbiwgc28gaXQgc2hvdWxkCisJICogYmUgc2FmZSB0byBoYXZlIGl0IGFzIGEgbG9jYWwgdmFyaWFibGUgaGVyZS4KKwkgKi8KKwlmaXJzdGZzYiA9IE5VTExGU0JMT0NLOworCiAJdHJhY2VfeGZzX2JtYXBfZGVmZXJyZWQodHAtPnRfbW91bnRwLAogCQkJWEZTX0ZTQl9UT19BR05PKHRwLT50X21vdW50cCwgc3RhcnRibG9jayksIHR5cGUsCiAJCQlYRlNfRlNCX1RPX0FHQk5PKHRwLT50X21vdW50cCwgc3RhcnRibG9jayksCi0JCQlpcC0+aV9pbm8sIHdoaWNoZm9yaywgc3RhcnRvZmYsIGJsb2NrY291bnQsIHN0YXRlKTsKKwkJCWlwLT5pX2lubywgd2hpY2hmb3JrLCBzdGFydG9mZiwgKmJsb2NrY291bnQsIHN0YXRlKTsKIAogCWlmICh3aGljaGZvcmsgIT0gWEZTX0RBVEFfRk9SSyAmJiB3aGljaGZvcmsgIT0gWEZTX0FUVFJfRk9SSykKIAkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CkBAIC02NjQxLDEyICs2NjgyLDExIEBACiAJCQkJCWJtYXAuYnJfYmxvY2tjb3VudCwgZmxhZ3MsICZmaXJzdGZzYiwKIAkJCQkJYm1hcC5icl9ibG9ja2NvdW50LCAmYm1hcCwgJm5pbWFwcywKIAkJCQkJZGZvcHMpOworCQkqYmxvY2tjb3VudCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JNQVBfVU5NQVA6Ci0JCWVycm9yID0geGZzX2J1bm1hcGkodHAsIGlwLCBibWFwLmJyX3N0YXJ0b2ZmLAotCQkJCWJtYXAuYnJfYmxvY2tjb3VudCwgZmxhZ3MsIDEsICZmaXJzdGZzYiwKLQkJCQlkZm9wcywgJmRvbmUpOwotCQlBU1NFUlQoZG9uZSk7CisJCWVycm9yID0gX194ZnNfYnVubWFwaSh0cCwgaXAsIHN0YXJ0b2ZmLCBibG9ja2NvdW50LAorCQkJCVhGU19CTUFQSV9SRU1BUCwgMSwgJmZpcnN0ZnNiLCBkZm9wcyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUFTU0VSVCgwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaCBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaAppbmRleCBlN2Q0MGIzLi5kYjUzYWM3ZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5oCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaApAQCAtMjY1LDcgKzI2NSw3IEBACiBpbnQJeGZzX2JtYXBfZmluaXNoX29uZShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kZWZlcl9vcHMgKmRmb3BzLAogCQlzdHJ1Y3QgeGZzX2lub2RlICppcCwgZW51bSB4ZnNfYm1hcF9pbnRlbnRfdHlwZSB0eXBlLAogCQlpbnQgd2hpY2hmb3JrLCB4ZnNfZmlsZW9mZl90IHN0YXJ0b2ZmLCB4ZnNfZnNibG9ja190IHN0YXJ0YmxvY2ssCi0JCXhmc19maWxibGtzX3QgYmxvY2tjb3VudCwgeGZzX2V4bnRzdF90IHN0YXRlKTsKKwkJeGZzX2ZpbGJsa3NfdCAqYmxvY2tjb3VudCwgeGZzX2V4bnRzdF90IHN0YXRlKTsKIGludAl4ZnNfYm1hcF9tYXBfZXh0ZW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2RlZmVyX29wcyAqZGZvcHMsCiAJCXN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqaW1hcCk7CiBpbnQJeGZzX2JtYXBfdW5tYXBfZXh0ZW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2RlZmVyX29wcyAqZGZvcHMsCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19ibWFwX2J0cmVlLmMgYi9mcy94ZnMvbGlieGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggNWMzOTE4Ni4uOTk2OGE3NCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfYm1hcF9idHJlZS5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXBfYnRyZWUuYwpAQCAtODg4LDYgKzg4OCw3IEBACiAJY3VyID0geGZzX2JtYnRfaW5pdF9jdXJzb3IoaXAtPmlfbW91bnQsIHRwLCBpcCwgd2hpY2hmb3JrKTsKIAlpZiAoIWN1cikKIAkJcmV0dXJuIC1FTk9NRU07CisJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgfD0gWEZTX0JUQ1VSX0JQUlZfSU5WQUxJRF9PV05FUjsKIAogCWVycm9yID0geGZzX2J0cmVlX2NoYW5nZV9vd25lcihjdXIsIG5ld19vd25lciwgYnVmZmVyX2xpc3QpOwogCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOiBYRlNfQlRSRUVfTk9FUlJPUik7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5jIGIvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuYwppbmRleCA5MWM2ODkxLi40YWQxZTIxIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmMKQEAgLTcxNCw3ICs3MTQsOCBAQAogCSAqIEdldCB0aGUgYmxvY2sgcG9pbnRlciBmb3IgdGhpcyBsZXZlbC4KIAkgKi8KIAlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKLQl4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwlpZiAoeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpCisJCXJldHVybiAwOwogCS8qCiAJICogSXQncyBlbXB0eSwgdGhlcmUgaXMgbm8gc3VjaCByZWNvcmQuCiAJICovCkBAIC03NDMsNyArNzQ0LDggQEAKIAkgKiBHZXQgdGhlIGJsb2NrIHBvaW50ZXIgZm9yIHRoaXMgbGV2ZWwuCiAJICovCiAJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7Ci0JeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CisJaWYgKHhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKQorCQlyZXR1cm4gMDsKIAkvKgogCSAqIEl0J3MgZW1wdHksIHRoZXJlIGlzIG5vIHN1Y2ggcmVjb3JkLgogCSAqLwpAQCAtMTc3Miw2ICsxNzc0LDcgQEAKIAogCS8qIENoZWNrIHRoZSBpbm9kZSBvd25lciBzaW5jZSB0aGUgdmVyaWZpZXJzIGRvbid0LiAqLwogCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNjcmMoJmN1ci0+YmNfbXAtPm1fc2IpICYmCisJICAgICEoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9JTlZBTElEX09XTkVSKSAmJgogCSAgICAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpICYmCiAJICAgIGJlNjRfdG9fY3B1KCgqYmxrcCktPmJiX3UubC5iYl9vd25lcikgIT0KIAkJCWN1ci0+YmNfcHJpdmF0ZS5iLmlwLT5pX2lubykKQEAgLTQ0MzIsMTAgKzQ0MzUsMTUgQEAKIAogCS8qIG1vZGlmeSB0aGUgb3duZXIgKi8KIAlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKLQlpZiAoY3VyLT5iY19mbGFncyAmIFhGU19CVFJFRV9MT05HX1BUUlMpCisJaWYgKGN1ci0+YmNfZmxhZ3MgJiBYRlNfQlRSRUVfTE9OR19QVFJTKSB7CisJCWlmIChibG9jay0+YmJfdS5sLmJiX293bmVyID09IGNwdV90b19iZTY0KGJiY29pLT5uZXdfb3duZXIpKQorCQkJcmV0dXJuIDA7CiAJCWJsb2NrLT5iYl91LmwuYmJfb3duZXIgPSBjcHVfdG9fYmU2NChiYmNvaS0+bmV3X293bmVyKTsKLQllbHNlCisJfSBlbHNlIHsKKwkJaWYgKGJsb2NrLT5iYl91LnMuYmJfb3duZXIgPT0gY3B1X3RvX2JlMzIoYmJjb2ktPm5ld19vd25lcikpCisJCQlyZXR1cm4gMDsKIAkJYmxvY2stPmJiX3Uucy5iYl9vd25lciA9IGNwdV90b19iZTMyKGJiY29pLT5uZXdfb3duZXIpOworCX0KIAogCS8qCiAJICogSWYgdGhlIGJsb2NrIGlzIGEgcm9vdCBibG9jayBob3N0ZWQgaW4gYW4gaW5vZGUsIHdlIG1pZ2h0IG5vdCBoYXZlIGEKQEAgLTQ0NDQsMTYgKzQ0NTIsMTkgQEAKIAkgKiBibG9jayBpcyBmb3JtYXR0ZWQgaW50byB0aGUgb24tZGlzayBpbm9kZSBmb3JrLiBXZSBzdGlsbCBjaGFuZ2UgaXQsCiAJICogdGhvdWdoLCBzbyBldmVyeXRoaW5nIGlzIGNvbnNpc3RlbnQgaW4gbWVtb3J5LgogCSAqLwotCWlmIChicCkgewotCQlpZiAoY3VyLT5iY190cCkgewotCQkJeGZzX3RyYW5zX29yZGVyZWRfYnVmKGN1ci0+YmNfdHAsIGJwKTsKLQkJCXhmc19idHJlZV9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX09XTkVSKTsKLQkJfSBlbHNlIHsKLQkJCXhmc19idWZfZGVsd3JpX3F1ZXVlKGJwLCBiYmNvaS0+YnVmZmVyX2xpc3QpOwotCQl9Ci0JfSBlbHNlIHsKKwlpZiAoIWJwKSB7CiAJCUFTU0VSVChjdXItPmJjX2ZsYWdzICYgWEZTX0JUUkVFX1JPT1RfSU5fSU5PREUpOwogCQlBU1NFUlQobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjdXItPmJjX3RwKSB7CisJCWlmICgheGZzX3RyYW5zX29yZGVyZWRfYnVmKGN1ci0+YmNfdHAsIGJwKSkgeworCQkJeGZzX2J0cmVlX2xvZ19ibG9jayhjdXIsIGJwLCBYRlNfQkJfT1dORVIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IGVsc2UgeworCQl4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgYmJjb2ktPmJ1ZmZlcl9saXN0KTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmggYi9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5oCmluZGV4IDNiMGZjMWEuLjMzYzdiZTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmgKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuaApAQCAtMjY4LDcgKzI2OCw4IEBACiAJCQlzaG9ydAkJZm9ya3NpemU7CS8qIGZvcmsncyBpbm9kZSBzcGFjZSAqLwogCQkJY2hhcgkJd2hpY2hmb3JrOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLwogCQkJY2hhcgkJZmxhZ3M7CQkvKiBmbGFncyAqLwotI2RlZmluZQlYRlNfQlRDVVJfQlBSVl9XQVNERUwJMQkJCS8qIHdhcyBkZWxheWVkICovCisjZGVmaW5lCVhGU19CVENVUl9CUFJWX1dBU0RFTAkJKDE8PDApCQkvKiB3YXMgZGVsYXllZCAqLworI2RlZmluZQlYRlNfQlRDVVJfQlBSVl9JTlZBTElEX09XTkVSCSgxPDwxKQkJLyogZm9yIGV4dCBzd2FwICovCiAJCX0gYjsKIAl9CQliY19wcml2YXRlOwkvKiBwZXItYnRyZWUgdHlwZSBkYXRhICovCiB9IHhmc19idHJlZV9jdXJfdDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2RhX2J0cmVlLmMgYi9mcy94ZnMvbGlieGZzL3hmc19kYV9idHJlZS5jCmluZGV4IDFiZGYyODguLmIzMDVkYmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2RhX2J0cmVlLmMKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfZGFfYnRyZWUuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAKIAllcnIgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBibm8sIG1hcHBlZGJubywgYnBwLAogCQkJCQl3aGljaF9mb3JrLCAmeGZzX2RhM19ub2RlX2J1Zl9vcHMpOwotCWlmICghZXJyICYmIHRwKSB7CisJaWYgKCFlcnIgJiYgdHAgJiYgKmJwcCkgewogCQlzdHJ1Y3QgeGZzX2RhX2Jsa2luZm8JKmluZm8gPSAoKmJwcCktPmJfYWRkcjsKIAkJaW50CQkJdHlwZTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfZGlyMl9ibG9jay5jIGIvZnMveGZzL2xpYnhmcy94ZnNfZGlyMl9ibG9jay5jCmluZGV4IGFhMTdjYjcuLjQzYzkwMmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2RpcjJfYmxvY2suYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19kaXIyX2Jsb2NrLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAJZXJyID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlyX2dlby0+ZGF0YWJsaywgLTEsIGJwcCwKIAkJCQlYRlNfREFUQV9GT1JLLCAmeGZzX2RpcjNfYmxvY2tfYnVmX29wcyk7Ci0JaWYgKCFlcnIgJiYgdHApCisJaWYgKCFlcnIgJiYgdHAgJiYgKmJwcCkKIAkJeGZzX3RyYW5zX2J1Zl9zZXRfdHlwZSh0cCwgKmJwcCwgWEZTX0JMRlRfRElSX0JMT0NLX0JVRik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL2xpYnhmcy94ZnNfZGlyMl9sZWFmLmMKaW5kZXggYjg4N2ZiMi4uZjJlMzQyZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfZGlyMl9sZWFmLmMKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfZGlyMl9sZWFmLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogCiAJZXJyID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgZmJubywgbWFwcGVkYm5vLCBicHAsCiAJCQkJWEZTX0RBVEFfRk9SSywgJnhmc19kaXIzX2xlYWYxX2J1Zl9vcHMpOwotCWlmICghZXJyICYmIHRwKQorCWlmICghZXJyICYmIHRwICYmICpicHApCiAJCXhmc190cmFuc19idWZfc2V0X3R5cGUodHAsICpicHAsIFhGU19CTEZUX0RJUl9MRUFGMV9CVUYpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yODUsNyArMjg1LDcgQEAKIAogCWVyciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIGZibm8sIG1hcHBlZGJubywgYnBwLAogCQkJCVhGU19EQVRBX0ZPUkssICZ4ZnNfZGlyM19sZWFmbl9idWZfb3BzKTsKLQlpZiAoIWVyciAmJiB0cCkKKwlpZiAoIWVyciAmJiB0cCAmJiAqYnBwKQogCQl4ZnNfdHJhbnNfYnVmX3NldF90eXBlKHRwLCAqYnBwLCBYRlNfQkxGVF9ESVJfTEVBRk5fQlVGKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfaWFsbG9jLmMgYi9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2MuYwppbmRleCBhMjgxOGY2Li40MmZlZjA3IDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2MuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2MuYwpAQCAtMzY4LDggKzM2OCw2IEBACiAJCQkJICogdHJhbnNhY3Rpb24gYW5kIHBpbiB0aGUgbG9nIGFwcHJvcHJpYXRlbHkuCiAJCQkJICovCiAJCQkJeGZzX3RyYW5zX29yZGVyZWRfYnVmKHRwLCBmYnVmKTsKLQkJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgZmJ1ZiwgMCwKLQkJCQkJCSAgQkJUT0IoZmJ1Zi0+Yl9sZW5ndGgpIC0gMSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlmYnVmLT5iX2ZsYWdzIHw9IFhCRl9ET05FOwpAQCAtMTEyMyw2ICsxMTIxLDcgQEAKIAlpbnQJCQllcnJvcjsKIAlpbnQJCQlvZmZzZXQ7CiAJaW50CQkJaSwgajsKKwlpbnQJCQlzZWFyY2hkaXN0YW5jZSA9IDEwOwogCiAJcGFnID0geGZzX3BlcmFnX2dldChtcCwgYWdubyk7CiAKQEAgLTExNDksNyArMTE0OCw2IEBACiAJaWYgKHBhZ25vID09IGFnbm8pIHsKIAkJaW50CQlkb25lbGVmdDsJLyogZG9uZSwgdG8gdGhlIGxlZnQgKi8KIAkJaW50CQlkb25lcmlnaHQ7CS8qIGRvbmUsIHRvIHRoZSByaWdodCAqLwotCQlpbnQJCXNlYXJjaGRpc3RhbmNlID0gMTA7CiAKIAkJZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwKGN1ciwgcGFnaW5vLCBYRlNfTE9PS1VQX0xFLCAmaSk7CiAJCWlmIChlcnJvcikKQEAgLTEyMTAsMjEgKzEyMDgsOSBAQAogCQkvKgogCQkgKiBMb29wIHVudGlsIHdlIGZpbmQgYW4gaW5vZGUgY2h1bmsgd2l0aCBhIGZyZWUgaW5vZGUuCiAJCSAqLwotCQl3aGlsZSAoIWRvbmVsZWZ0IHx8ICFkb25lcmlnaHQpIHsKKwkJd2hpbGUgKC0tc2VhcmNoZGlzdGFuY2UgPiAwICYmICghZG9uZWxlZnQgfHwgIWRvbmVyaWdodCkpIHsKIAkJCWludAl1c2VsZWZ0OyAgLyogdXNpbmcgbGVmdCBpbm9kZSBjaHVuayB0aGlzIHRpbWUgKi8KIAotCQkJaWYgKCEtLXNlYXJjaGRpc3RhbmNlKSB7Ci0JCQkJLyoKLQkJCQkgKiBOb3QgaW4gcmFuZ2UgLSBzYXZlIGxhc3Qgc2VhcmNoCi0JCQkJICogbG9jYXRpb24gYW5kIGFsbG9jYXRlIGEgbmV3IGlub2RlCi0JCQkJICovCi0JCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCQkJCXBhZy0+cGFnbF9sZWZ0cmVjID0gdHJlYy5pcl9zdGFydGlubzsKLQkJCQlwYWctPnBhZ2xfcmlnaHRyZWMgPSByZWMuaXJfc3RhcnRpbm87Ci0JCQkJcGFnLT5wYWdsX3BhZ2lubyA9IHBhZ2lubzsKLQkJCQlnb3RvIG5ld2lubzsKLQkJCX0KLQogCQkJLyogZmlndXJlIG91dCB0aGUgY2xvc2VyIGJsb2NrIGlmIGJvdGggYXJlIHZhbGlkLiAqLwogCQkJaWYgKCFkb25lbGVmdCAmJiAhZG9uZXJpZ2h0KSB7CiAJCQkJdXNlbGVmdCA9IHBhZ2lubyAtCkBAIC0xMjM2LDEzICsxMjIyLDEzIEBACiAKIAkJCS8qIGZyZWUgaW5vZGVzIHRvIHRoZSBsZWZ0PyAqLwogCQkJaWYgKHVzZWxlZnQgJiYgdHJlYy5pcl9mcmVlY291bnQpIHsKLQkJCQlyZWMgPSB0cmVjOwogCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwogCQkJCWN1ciA9IHRjdXI7CiAKIAkJCQlwYWctPnBhZ2xfbGVmdHJlYyA9IHRyZWMuaXJfc3RhcnRpbm87CiAJCQkJcGFnLT5wYWdsX3JpZ2h0cmVjID0gcmVjLmlyX3N0YXJ0aW5vOwogCQkJCXBhZy0+cGFnbF9wYWdpbm8gPSBwYWdpbm87CisJCQkJcmVjID0gdHJlYzsKIAkJCQlnb3RvIGFsbG9jX2lub2RlOwogCQkJfQogCkBAIC0xMjY4LDI2ICsxMjU0LDM3IEBACiAJCQkJZ290byBlcnJvcjE7CiAJCX0KIAotCQkvKgotCQkgKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ0cmVlLiBiZWNhdXNlCi0JCSAqIHdlIGFyZSBvbmx5IHNlYXJjaGluZyBhIHNtYWxsIGNodW5rIG9mIHRoZQotCQkgKiBidHJlZSBlYWNoIHNlYXJjaCwgdGhlcmUgaXMgb2J2aW91c2x5IGZyZWUKLQkJICogaW5vZGVzIGNsb3NlciB0byB0aGUgcGFyZW50IGlub2RlIHRoYW4gd2UKLQkJICogYXJlIG5vdy4gcmVzdGFydCB0aGUgc2VhcmNoIGFnYWluLgotCQkgKi8KLQkJcGFnLT5wYWdsX3BhZ2lubyA9IE5VTExBR0lOTzsKLQkJcGFnLT5wYWdsX2xlZnRyZWMgPSBOVUxMQUdJTk87Ci0JCXBhZy0+cGFnbF9yaWdodHJlYyA9IE5VTExBR0lOTzsKLQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOwotCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKLQkJZ290byByZXN0YXJ0X3BhZ25vOworCQlpZiAoc2VhcmNoZGlzdGFuY2UgPD0gMCkgeworCQkJLyoKKwkJCSAqIE5vdCBpbiByYW5nZSAtIHNhdmUgbGFzdCBzZWFyY2gKKwkJCSAqIGxvY2F0aW9uIGFuZCBhbGxvY2F0ZSBhIG5ldyBpbm9kZQorCQkJICovCisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQlwYWctPnBhZ2xfbGVmdHJlYyA9IHRyZWMuaXJfc3RhcnRpbm87CisJCQlwYWctPnBhZ2xfcmlnaHRyZWMgPSByZWMuaXJfc3RhcnRpbm87CisJCQlwYWctPnBhZ2xfcGFnaW5vID0gcGFnaW5vOworCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidHJlZS4gYmVjYXVzZQorCQkJICogd2UgYXJlIG9ubHkgc2VhcmNoaW5nIGEgc21hbGwgY2h1bmsgb2YgdGhlCisJCQkgKiBidHJlZSBlYWNoIHNlYXJjaCwgdGhlcmUgaXMgb2J2aW91c2x5IGZyZWUKKwkJCSAqIGlub2RlcyBjbG9zZXIgdG8gdGhlIHBhcmVudCBpbm9kZSB0aGFuIHdlCisJCQkgKiBhcmUgbm93LiByZXN0YXJ0IHRoZSBzZWFyY2ggYWdhaW4uCisJCQkgKi8KKwkJCXBhZy0+cGFnbF9wYWdpbm8gPSBOVUxMQUdJTk87CisJCQlwYWctPnBhZ2xfbGVmdHJlYyA9IE5VTExBR0lOTzsKKwkJCXBhZy0+cGFnbF9yaWdodHJlYyA9IE5VTExBR0lOTzsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJZ290byByZXN0YXJ0X3BhZ25vOworCQl9CiAJfQogCiAJLyoKIAkgKiBJbiBhIGRpZmZlcmVudCBBRyBmcm9tIHRoZSBwYXJlbnQuCiAJICogU2VlIGlmIHRoZSBtb3N0IHJlY2VudGx5IGFsbG9jYXRlZCBibG9jayBoYXMgYW55IGZyZWUuCiAJICovCi1uZXdpbm86CiAJaWYgKGFnaS0+YWdpX25ld2lubyAhPSBjcHVfdG9fYmUzMihOVUxMQUdJTk8pKSB7CiAJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cChjdXIsIGJlMzJfdG9fY3B1KGFnaS0+YWdpX25ld2lubyksCiAJCQkJCSBYRlNfTE9PS1VQX0VRLCAmaSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19pbm9kZV9mb3JrLmMgYi9mcy94ZnMvbGlieGZzL3hmc19pbm9kZV9mb3JrLmMKaW5kZXggOGEzN2VmZS4uNGUzMDQ0OCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfaW5vZGVfZm9yay5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2lub2RlX2ZvcmsuYwpAQCAtMTUzOSwxNCArMTUzOSwxMSBAQAogCXhmc19pZm9ya190CSppZnAsCQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KIAlpbnQJCW5ld19zaXplKQkvKiBuZXcgaW5kaXJlY3Rpb24gYXJyYXkgc2l6ZSAqLwogewotCWludAkJbmxpc3RzOwkJLyogbnVtYmVyIG9mIGlyZWMncyAoZXggbGlzdHMpICovCi0JaW50CQlzaXplOwkJLyogY3VycmVudCBpbmRpcmVjdGlvbiBhcnJheSBzaXplICovCi0KIAlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVElSRUMpOwotCW5saXN0cyA9IGlmcC0+aWZfcmVhbF9ieXRlcyAvIFhGU19JRVhUX0JVRlNaOwotCXNpemUgPSBubGlzdHMgKiBzaXplb2YoeGZzX2V4dF9pcmVjX3QpOwogCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMpOwotCUFTU0VSVCgobmV3X3NpemUgPj0gMCkgJiYgKG5ld19zaXplICE9IHNpemUpKTsKKwlBU1NFUlQoKG5ld19zaXplID49IDApICYmCisJICAgICAgIChuZXdfc2l6ZSAhPSAoKGlmcC0+aWZfcmVhbF9ieXRlcyAvIFhGU19JRVhUX0JVRlNaKSAqCisJCQkgICAgIHNpemVvZih4ZnNfZXh0X2lyZWNfdCkpKSk7CiAJaWYgKG5ld19zaXplID09IDApIHsKIAkJeGZzX2lleHRfZGVzdHJveShpZnApOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19yZWZjb3VudC5jIGIvZnMveGZzL2xpYnhmcy94ZnNfcmVmY291bnQuYwppbmRleCA4MmEzOGQ4Li5kNzFjYjYzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19yZWZjb3VudC5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX3JlZmNvdW50LmMKQEAgLTc4NCwxNCArNzg0LDYgQEAKIH0KIAogLyoKLSAqIFdoaWxlIHdlJ3JlIGFkanVzdGluZyB0aGUgcmVmY291bnRzIHJlY29yZHMgb2YgYW4gZXh0ZW50LCB3ZSBoYXZlCi0gKiB0byBrZWVwIGFuIGV5ZSBvbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2UncmUgZGlydHlpbmcgLS0gcnVuIHRvbwotICogbWFueSBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbiBhbmQgd2UnbGwgZXhjZWVkIHRoZSB0cmFuc2FjdGlvbidzCi0gKiByZXNlcnZhdGlvbiBhbmQgY3Jhc2ggdGhlIGZzLiAgRWFjaCByZWNvcmQgYWRkcyAxMiBieXRlcyB0byB0aGUKLSAqIGxvZyAocGx1cyBhbnkga2V5IHVwZGF0ZXMpIHNvIHdlJ2xsIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSAyNCBieXRlcwotICogcGVyIHJlY29yZC4gIFdlIG11c3QgYWxzbyBsZWF2ZSBzcGFjZSBmb3IgYnRyZWUgc3BsaXRzIG9uIGJvdGggZW5kcwotICogb2YgdGhlIHJhbmdlIGFuZCBzcGFjZSBmb3IgdGhlIENVRCBhbmQgYSBuZXcgQ1VJLgotICoKICAqIFhYWDogVGhpcyBpcyBhIHByZXR0eSBoYW5kLXdhdnkgZXN0aW1hdGUuICBUaGUgcGVuYWx0eSBmb3IgZ3Vlc3NpbmcKICAqIHRydWUgaW5jb3JyZWN0bHkgaXMgYSBzaHV0ZG93biBGUzsgdGhlIHBlbmFsdHkgZm9yIGd1ZXNzaW5nIGZhbHNlCiAgKiBpbmNvcnJlY3RseSBpcyBtb3JlIHRyYW5zYWN0aW9uIHJvbGxzIHRoYW4gbWlnaHQgYmUgbmVjZXNzYXJ5LgpAQCAtODIyLDcgKzgxNCw3IEBACiAJZWxzZSBpZiAob3ZlcmhlYWQgPiBjdXItPmJjX3RwLT50X2xvZ19yZXMpCiAJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gIGN1ci0+YmNfdHAtPnRfbG9nX3JlcyAtIG92ZXJoZWFkID4KLQkJY3VyLT5iY19wcml2YXRlLmEucHJpdi5yZWZjLm5yX29wcyAqIDMyOworCQljdXItPmJjX3ByaXZhdGUuYS5wcml2LnJlZmMubnJfb3BzICogWEZTX1JFRkNPVU5UX0lURU1fT1ZFUkhFQUQ7CiB9CiAKIC8qCkBAIC0xNjQ4LDYgKzE2NDAsMTAgQEAKIAllcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZihtcCwgdHAsIGFnbm8sIDAsICZhZ2JwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3RyYW5zOworCWlmICghYWdicCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3RyYW5zOworCX0KIAljdXIgPSB4ZnNfcmVmY291bnRidF9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIE5VTEwpOwogCiAJLyogRmluZCBhbGwgdGhlIGxlZnRvdmVyIENvVyBzdGFnaW5nIGV4dGVudHMuICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19yZWZjb3VudC5oIGIvZnMveGZzL2xpYnhmcy94ZnNfcmVmY291bnQuaAppbmRleCAwOThkYzY2OC4uZWFmYjlkMSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfcmVmY291bnQuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19yZWZjb3VudC5oCkBAIC02Nyw0ICs2NywyMCBAQAogZXh0ZXJuIGludCB4ZnNfcmVmY291bnRfcmVjb3Zlcl9jb3dfbGVmdG92ZXJzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAogCQl4ZnNfYWdudW1iZXJfdCBhZ25vKTsKIAorLyoKKyAqIFdoaWxlIHdlJ3JlIGFkanVzdGluZyB0aGUgcmVmY291bnRzIHJlY29yZHMgb2YgYW4gZXh0ZW50LCB3ZSBoYXZlCisgKiB0byBrZWVwIGFuIGV5ZSBvbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgd2UncmUgZGlydHlpbmcgLS0gcnVuIHRvbworICogbWFueSBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbiBhbmQgd2UnbGwgZXhjZWVkIHRoZSB0cmFuc2FjdGlvbidzCisgKiByZXNlcnZhdGlvbiBhbmQgY3Jhc2ggdGhlIGZzLiAgRWFjaCByZWNvcmQgYWRkcyAxMiBieXRlcyB0byB0aGUKKyAqIGxvZyAocGx1cyBhbnkga2V5IHVwZGF0ZXMpIHNvIHdlJ2xsIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSAzMiBieXRlcworICogcGVyIHJlY29yZC4gIFdlIG11c3QgYWxzbyBsZWF2ZSBzcGFjZSBmb3IgYnRyZWUgc3BsaXRzIG9uIGJvdGggZW5kcworICogb2YgdGhlIHJhbmdlIGFuZCBzcGFjZSBmb3IgdGhlIENVRCBhbmQgYSBuZXcgQ1VJLgorICovCisjZGVmaW5lIFhGU19SRUZDT1VOVF9JVEVNX09WRVJIRUFECTMyCisKK3N0YXRpYyBpbmxpbmUgeGZzX2ZpbGVvZmZfdCB4ZnNfcmVmY291bnRfbWF4X3VubWFwKGludCBsb2dfcmVzKQoreworCXJldHVybiAobG9nX3JlcyAqIDMgLyA0KSAvIFhGU19SRUZDT1VOVF9JVEVNX09WRVJIRUFEOworfQorCiAjZW5kaWYJLyogX19YRlNfUkVGQ09VTlRfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FvcHMuYyBiL2ZzL3hmcy94ZnNfYW9wcy5jCmluZGV4IDU3ODk4MTQuLmQyMzg4OWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5jCkBAIC05MCwxMSArOTAsMTEgQEAKICAqIGFzc29jaWF0ZWQgYnVmZmVyX2hlYWRzLCBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgdGhhdAogICogd2UgbmVlZCB0byBwcm9jZXNzIG9uIHRoZSBwYWdlLgogICoKLSAqIExhbmRtaW5lIFdhcm5pbmc6IGJoLT5iX2VuZF9pbygpIHdpbGwgY2FsbCBlbmRfcGFnZV93cml0ZWJhY2soKSBvbiB0aGUgbGFzdAotICogYnVmZmVyIGluIHRoZSBJTy4gT25jZSBpdCBkb2VzIHRoaXMsIGl0IGlzIHVuc2FmZSB0byBhY2Nlc3MgdGhlIGJ1ZmZlcmhlYWQgb3IKLSAqIHRoZSBwYWdlIGF0IGFsbCwgYXMgd2UgbWF5IGJlIHJhY2luZyB3aXRoIG1lbW9yeSByZWNsYWltIGFuZCBpdCBjYW4gZnJlZSBib3RoCi0gKiB0aGUgYnVmZmVyaGVhZCBjaGFpbiBhbmQgdGhlIHBhZ2UgYXMgaXQgd2lsbCBzZWUgdGhlIHBhZ2UgYXMgY2xlYW4gYW5kCi0gKiB1bnVzZWQuCisgKiBOb3RlIHRoYXQgd2Ugb3BlbiBjb2RlIHRoZSBhY3Rpb24gaW4gZW5kX2J1ZmZlcl9hc3luY193cml0ZSBoZXJlIHNvIHRoYXQgd2UKKyAqIG9ubHkgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGJ1ZmZlcnMgYXR0YWNoZWQgdG8gdGhlIHBhZ2Ugb25jZS4gIFRoaXMgaXMgbm90CisgKiBvbmx5IG1vcmUgZWZmaWNpZW50LCBidXQgYWxzbyBlbnN1cmVzIHRoYXQgd2Ugb25seSBjYWxscyBlbmRfcGFnZV93cml0ZWJhY2sKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIGl0ZXJhdGlvbiwgYW5kIHRodXMgYXZvaWRzIHRoZSBwaXRmYWxsIG9mIGhhdmluZyB0aGUgcGFnZQorICogYW5kIGJ1ZmZlcnMgcG90ZW50aWFsbHkgZnJlZWQgYWZ0ZXIgZXZlcnkgY2FsbCB0byBlbmRfYnVmZmVyX2FzeW5jX3dyaXRlLgogICovCiBzdGF0aWMgdm9pZAogeGZzX2ZpbmlzaF9wYWdlX3dyaXRlYmFjaygKQEAgLTEwMiwyOSArMTAyLDQ1IEBACiAJc3RydWN0IGJpb192ZWMJCSpidmVjLAogCWludAkJCWVycm9yKQogewotCXVuc2lnbmVkIGludAkJZW5kID0gYnZlYy0+YnZfb2Zmc2V0ICsgYnZlYy0+YnZfbGVuIC0gMTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmhlYWQsICpiaCwgKm5leHQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpoZWFkID0gcGFnZV9idWZmZXJzKGJ2ZWMtPmJ2X3BhZ2UpLCAqYmggPSBoZWFkOworCWJvb2wJCQlidXN5ID0gZmFsc2U7CiAJdW5zaWduZWQgaW50CQlvZmYgPSAwOwotCXVuc2lnbmVkIGludAkJYnNpemU7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAlBU1NFUlQoYnZlYy0+YnZfb2Zmc2V0IDwgUEFHRV9TSVpFKTsKIAlBU1NFUlQoKGJ2ZWMtPmJ2X29mZnNldCAmIChpX2Jsb2Nrc2l6ZShpbm9kZSkgLSAxKSkgPT0gMCk7Ci0JQVNTRVJUKGVuZCA8IFBBR0VfU0laRSk7CisJQVNTRVJUKGJ2ZWMtPmJ2X29mZnNldCArIGJ2ZWMtPmJ2X2xlbiA8PSBQQUdFX1NJWkUpOwogCUFTU0VSVCgoYnZlYy0+YnZfbGVuICYgKGlfYmxvY2tzaXplKGlub2RlKSAtIDEpKSA9PSAwKTsKIAotCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhidmVjLT5idl9wYWdlKTsKLQotCWJzaXplID0gYmgtPmJfc2l6ZTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYml0X3NwaW5fbG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmaGVhZC0+Yl9zdGF0ZSk7CiAJZG8gewotCQlpZiAob2ZmID4gZW5kKQotCQkJYnJlYWs7Ci0JCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7Ci0JCWlmIChvZmYgPCBidmVjLT5idl9vZmZzZXQpCi0JCQlnb3RvIG5leHRfYmg7Ci0JCWJoLT5iX2VuZF9pbyhiaCwgIWVycm9yKTsKLW5leHRfYmg6Ci0JCW9mZiArPSBic2l6ZTsKLQl9IHdoaWxlICgoYmggPSBuZXh0KSAhPSBoZWFkKTsKKwkJaWYgKG9mZiA+PSBidmVjLT5idl9vZmZzZXQgJiYKKwkJICAgIG9mZiA8IGJ2ZWMtPmJ2X29mZnNldCArIGJ2ZWMtPmJ2X2xlbikgeworCQkJQVNTRVJUKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpOworCQkJQVNTRVJUKGJoLT5iX2VuZF9pbyA9PSBOVUxMKTsKKworCQkJaWYgKGVycm9yKSB7CisJCQkJbWFwcGluZ19zZXRfZXJyb3IoYnZlYy0+YnZfcGFnZS0+bWFwcGluZywgLUVJTyk7CisJCQkJc2V0X2J1ZmZlcl93cml0ZV9pb19lcnJvcihiaCk7CisJCQkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQlTZXRQYWdlRXJyb3IoYnZlYy0+YnZfcGFnZSk7CisJCQl9IGVsc2UgeworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJY2xlYXJfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQl9IGVsc2UgaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCUFTU0VSVChidWZmZXJfbG9ja2VkKGJoKSk7CisJCQlidXN5ID0gdHJ1ZTsKKwkJfQorCQlvZmYgKz0gYmgtPmJfc2l6ZTsKKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCWJpdF9zcGluX3VubG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmaGVhZC0+Yl9zdGF0ZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKCFidXN5KQorCQllbmRfcGFnZV93cml0ZWJhY2soYnZlYy0+YnZfcGFnZSk7CiB9CiAKIC8qCkBAIC0xMzgsOCArMTU0LDEwIEBACiAJaW50CQkJZXJyb3IpCiB7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpb2VuZC0+aW9faW5vZGU7Ci0Jc3RydWN0IGJpbwkJKmxhc3QgPSBpb2VuZC0+aW9fYmlvOwotCXN0cnVjdCBiaW8JCSpiaW8sICpuZXh0OworCXN0cnVjdCBiaW8JCSpiaW8gPSAmaW9lbmQtPmlvX2lubGluZV9iaW87CisJc3RydWN0IGJpbwkJKmxhc3QgPSBpb2VuZC0+aW9fYmlvLCAqbmV4dDsKKwl1NjQJCQlzdGFydCA9IGJpby0+YmlfaXRlci5iaV9zZWN0b3I7CisJYm9vbAkJCXF1aWV0ID0gYmlvX2ZsYWdnZWQoYmlvLCBCSU9fUVVJRVQpOwogCiAJZm9yIChiaW8gPSAmaW9lbmQtPmlvX2lubGluZV9iaW87IGJpbzsgYmlvID0gbmV4dCkgewogCQlzdHJ1Y3QgYmlvX3ZlYwkqYnZlYzsKQEAgLTE2MCw2ICsxNzgsMTEgQEAKIAogCQliaW9fcHV0KGJpbyk7CiAJfQorCisJaWYgKHVubGlrZWx5KGVycm9yICYmICFxdWlldCkpIHsKKwkJeGZzX2Vycl9yYXRlbGltaXRlZChYRlNfSShpbm9kZSktPmlfbW91bnQsCisJCQkid3JpdGViYWNrIGVycm9yIG9uIHNlY3RvciAlbGx1Iiwgc3RhcnQpOworCX0KIH0KIAogLyoKQEAgLTQyNyw3ICs0NTAsOCBAQAogCUFTU0VSVCghYnVmZmVyX2RlbGF5KGJoKSk7CiAJQVNTRVJUKCFidWZmZXJfdW53cml0dGVuKGJoKSk7CiAKLQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJYmgtPmJfZW5kX2lvID0gTlVMTDsKKwlzZXRfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAljbGVhcl9idWZmZXJfZGlydHkoYmgpOwogfQpAQCAtMTU2Niw5ICsxNTkwLDEyIEBACiAJICogVGhlIHN3YXAgY29kZSAoYWItKXVzZXMgLT5ibWFwIHRvIGdldCBhIGJsb2NrIG1hcHBpbmcgYW5kIHRoZW4KIAkgKiBieXBhc3Nl0ZUgdGhlIGZpbGUgc3lzdGVtIGZvciBhY3R1YWwgSS9PLiAgV2UgcmVhbGx5IGNhbid0IGFsbG93CiAJICogdGhhdCBvbiByZWZsaW5rcyBpbm9kZXMsIHNvIHdlIGhhdmUgdG8gc2tpcCBvdXQgaGVyZS4gIEFuZCB5ZXMsCi0JICogMCBpcyB0aGUgbWFnaWMgY29kZSBmb3IgYSBibWFwIGVycm9yLi4KKwkgKiAwIGlzIHRoZSBtYWdpYyBjb2RlIGZvciBhIGJtYXAgZXJyb3IuCisJICoKKwkgKiBTaW5jZSB3ZSBkb24ndCBwYXNzIGJhY2sgYmxvY2tkZXYgaW5mbywgd2UgY2FuJ3QgcmV0dXJuIGJtYXAKKwkgKiBpbmZvcm1hdGlvbiBmb3IgcnQgZmlsZXMgZWl0aGVyLgogCSAqLwotCWlmICh4ZnNfaXNfcmVmbGlua19pbm9kZShpcCkpIHsKKwlpZiAoeGZzX2lzX3JlZmxpbmtfaW5vZGUoaXApIHx8IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpIHsKIAkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYm1hcF9pdGVtLmMKaW5kZXggYzRiOTBlNy4uNWE1NGRjZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2JtYXBfaXRlbS5jCkBAIC0zOTUsNiArMzk1LDcgQEAKIAlzdHJ1Y3QgeGZzX21hcF9leHRlbnQJCSpibWFwOwogCXhmc19mc2Jsb2NrX3QJCQlzdGFydGJsb2NrX2ZzYjsKIAl4ZnNfZnNibG9ja190CQkJaW5vZGVfZnNiOworCXhmc19maWxibGtzX3QJCQljb3VudDsKIAlib29sCQkJCW9wX29rOwogCXN0cnVjdCB4ZnNfYnVkX2xvZ19pdGVtCQkqYnVkcDsKIAllbnVtIHhmc19ibWFwX2ludGVudF90eXBlCXR5cGU7CkBAIC00MDMsNiArNDA0LDcgQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCQkqdHA7CiAJc3RydWN0IHhmc19pbm9kZQkJKmlwID0gTlVMTDsKIAlzdHJ1Y3QgeGZzX2RlZmVyX29wcwkJZGZvcHM7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJCWlyZWM7CiAJeGZzX2ZzYmxvY2tfdAkJCWZpcnN0ZnNiOwogCiAJQVNTRVJUKCF0ZXN0X2JpdChYRlNfQlVJX1JFQ09WRVJFRCwgJmJ1aXAtPmJ1aV9mbGFncykpOwpAQCAtNDgwLDEzICs0ODIsMjQgQEAKIAl9CiAJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgMCk7CiAKKwljb3VudCA9IGJtYXAtPm1lX2xlbjsKIAllcnJvciA9IHhmc190cmFuc19sb2dfZmluaXNoX2JtYXBfdXBkYXRlKHRwLCBidWRwLCAmZGZvcHMsIHR5cGUsCiAJCQlpcCwgd2hpY2hmb3JrLCBibWFwLT5tZV9zdGFydG9mZiwKLQkJCWJtYXAtPm1lX3N0YXJ0YmxvY2ssIGJtYXAtPm1lX2xlbiwKLQkJCXN0YXRlKTsKKwkJCWJtYXAtPm1lX3N0YXJ0YmxvY2ssICZjb3VudCwgc3RhdGUpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJfZGZvcHM7CiAKKwlpZiAoY291bnQgPiAwKSB7CisJCUFTU0VSVCh0eXBlID09IFhGU19CTUFQX1VOTUFQKTsKKwkJaXJlYy5icl9zdGFydGJsb2NrID0gYm1hcC0+bWVfc3RhcnRibG9jazsKKwkJaXJlYy5icl9ibG9ja2NvdW50ID0gY291bnQ7CisJCWlyZWMuYnJfc3RhcnRvZmYgPSBibWFwLT5tZV9zdGFydG9mZjsKKwkJaXJlYy5icl9zdGF0ZSA9IHN0YXRlOworCQllcnJvciA9IHhmc19ibWFwX3VubWFwX2V4dGVudCh0cC0+dF9tb3VudHAsICZkZm9wcywgaXAsICZpcmVjKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJfZGZvcHM7CisJfQorCiAJLyogRmluaXNoIHRyYW5zYWN0aW9uLCBmcmVlIGlub2Rlcy4gKi8KIAllcnJvciA9IHhmc19kZWZlcl9maW5pc2goJnRwLCAmZGZvcHMsIE5VTEwpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF91dGlsLmMgYi9mcy94ZnMveGZzX2JtYXBfdXRpbC5jCmluZGV4IDg3YjQ5NWUuLjVmZmVmYWMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcF91dGlsLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX3V0aWwuYwpAQCAtMTgyNSwyOSArMTgyNSwxOCBAQAogCX0KIAogCS8qCi0JICogQmVmb3JlIHdlJ3ZlIHN3YXBwZWQgdGhlIGZvcmtzLCBsZXRzIHNldCB0aGUgb3duZXJzIG9mIHRoZSBmb3JrcwotCSAqIGFwcHJvcHJpYXRlbHkuIFdlIGhhdmUgdG8gZG8gdGhpcyBhcyB3ZSBhcmUgZGVtYW5kIHBhZ2luZyB0aGUgYnRyZWUKLQkgKiBidWZmZXJzLCBhbmQgc28gdGhlIHZhbGlkYXRpb24gZG9uZSBvbiByZWFkIHdpbGwgZXhwZWN0IHRoZSBvd25lcgotCSAqIGZpZWxkIHRvIGJlIGNvcnJlY3RseSBzZXQuIE9uY2Ugd2UgY2hhbmdlIHRoZSBvd25lcnMsIHdlIGNhbiBzd2FwIHRoZQotCSAqIGlub2RlIGZvcmtzLgorCSAqIEJ0cmVlIGZvcm1hdCAodjMpIGlub2RlcyBoYXZlIHRoZSBpbm9kZSBudW1iZXIgc3RhbXBlZCBpbiB0aGUgYm1idAorCSAqIGJsb2NrIGhlYWRlcnMuIFdlIGNhbid0IHN0YXJ0IGNoYW5naW5nIHRoZSBibWJ0IGJsb2NrcyB1bnRpbCB0aGUKKwkgKiBpbm9kZSBvd25lciBjaGFuZ2UgaXMgbG9nZ2VkIHNvIHJlY292ZXJ5IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGluIHRoZQorCSAqIGV2ZW50IG9mIGEgY3Jhc2guIFNldCB0aGUgb3duZXIgY2hhbmdlIGxvZyBmbGFncyBub3cgYW5kIGxlYXZlIHRoZQorCSAqIGJtYnQgc2NhbiBhcyB0aGUgbGFzdCBzdGVwLgogCSAqLwogCWlmIChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gMyAmJgotCSAgICBpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgeworCSAgICBpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKIAkJKCp0YXJnZXRfbG9nX2ZsYWdzKSB8PSBYRlNfSUxPR19ET1dORVI7Ci0JCWVycm9yID0geGZzX2JtYnRfY2hhbmdlX293bmVyKHRwLCBpcCwgWEZTX0RBVEFfRk9SSywKLQkJCQkJICAgICAgdGlwLT5pX2lubywgTlVMTCk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KIAlpZiAodGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAzICYmCi0JICAgIHRpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgeworCSAgICB0aXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpCiAJCSgqc3JjX2xvZ19mbGFncykgfD0gWEZTX0lMT0dfRE9XTkVSOwotCQllcnJvciA9IHhmc19ibWJ0X2NoYW5nZV9vd25lcih0cCwgdGlwLCBYRlNfREFUQV9GT1JLLAotCQkJCQkgICAgICBpcC0+aV9pbm8sIE5VTEwpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQogCiAJLyoKIAkgKiBTd2FwIHRoZSBkYXRhIGZvcmtzIG9mIHRoZSBpbm9kZXMKQEAgLTE5MjUsNiArMTkxNCw0OCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogRml4IHVwIHRoZSBvd25lcnMgb2YgdGhlIGJtYnQgYmxvY2tzIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGlub2RlLiBUaGUKKyAqIGNoYW5nZSBvd25lciBzY2FuIGF0dGVtcHRzIHRvIG9yZGVyIGFsbCBtb2RpZmllZCBidWZmZXJzIGluIHRoZSBjdXJyZW50CisgKiB0cmFuc2FjdGlvbi4gSW4gdGhlIGV2ZW50IG9mIG9yZGVyZWQgYnVmZmVyIGZhaWx1cmUsIHRoZSBvZmZlbmRpbmcgYnVmZmVyIGlzCisgKiBwaHlzaWNhbGx5IGxvZ2dlZCBhcyBhIGZhbGxiYWNrIGFuZCB0aGUgc2NhbiByZXR1cm5zIC1FQUdBSU4uIFdlIG11c3Qgcm9sbAorICogdGhlIHRyYW5zYWN0aW9uIGluIHRoaXMgY2FzZSB0byByZXBsZW5pc2ggdGhlIGZhbGxiYWNrIGxvZyByZXNlcnZhdGlvbiBhbmQKKyAqIHJlc3RhcnQgdGhlIHNjYW4uIFRoaXMgcHJvY2VzcyByZXBlYXRzIHVudGlsIHRoZSBzY2FuIGNvbXBsZXRlcy4KKyAqLworc3RhdGljIGludAoreGZzX3N3YXBfY2hhbmdlX293bmVyKAorCXN0cnVjdCB4ZnNfdHJhbnMJKip0cHAsCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJc3RydWN0IHhmc19pbm9kZQkqdG1waXApCit7CisJaW50CQkJZXJyb3I7CisJc3RydWN0IHhmc190cmFucwkqdHAgPSAqdHBwOworCisJZG8geworCQllcnJvciA9IHhmc19ibWJ0X2NoYW5nZV9vd25lcih0cCwgaXAsIFhGU19EQVRBX0ZPUkssIGlwLT5pX2lubywKKwkJCQkJICAgICAgTlVMTCk7CisJCS8qIHN1Y2Nlc3Mgb3IgZmF0YWwgZXJyb3IgKi8KKwkJaWYgKGVycm9yICE9IC1FQUdBSU4pCisJCQlicmVhazsKKworCQllcnJvciA9IHhmc190cmFuc19yb2xsKHRwcCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCQl0cCA9ICp0cHA7CisKKwkJLyoKKwkJICogUmVkaXJ0eSBib3RoIGlub2RlcyBzbyB0aGV5IGNhbiByZWxvZyBhbmQga2VlcCB0aGUgbG9nIHRhaWwKKwkJICogbW92aW5nIGZvcndhcmQuCisJCSAqLworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCB0bXBpcCwgMCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdG1waXAsIFhGU19JTE9HX0NPUkUpOworCX0gd2hpbGUgKHRydWUpOworCisJcmV0dXJuIGVycm9yOworfQorCiBpbnQKIHhmc19zd2FwX2V4dGVudHMoCiAJc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIHRhcmdldCBpbm9kZSAqLwpAQCAtMTkzOCw4ICsxOTY5LDggQEAKIAlpbnQJCQllcnJvciA9IDA7CiAJaW50CQkJbG9ja19mbGFnczsKIAlzdHJ1Y3QgeGZzX2lmb3JrCSpjb3dmcDsKLQlfX3VpbnQ2NF90CQlmOwotCWludAkJCXJlc2Jsa3M7CisJdWludDY0X3QJCWY7CisJaW50CQkJcmVzYmxrcyA9IDA7CiAKIAkvKgogCSAqIExvY2sgdGhlIGlub2RlcyBhZ2FpbnN0IG90aGVyIElPLCBwYWdlIGZhdWx0cyBhbmQgdHJ1bmNhdGUgdG8KQEAgLTE5ODcsMTEgKzIwMTgsOCBAQAogCQkJICBYRlNfU1dBUF9STUFQX1NQQUNFX1JFUyhtcCwKIAkJCQlYRlNfSUZPUktfTkVYVEVOVFModGlwLCBYRlNfREFUQV9GT1JLKSwKIAkJCQlYRlNfREFUQV9GT1JLKTsKLQkJZXJyb3IgPSB4ZnNfdHJhbnNfYWxsb2MobXAsICZNX1JFUyhtcCktPnRyX3dyaXRlLCByZXNibGtzLAotCQkJCTAsIDAsICZ0cCk7Ci0JfSBlbHNlCi0JCWVycm9yID0geGZzX3RyYW5zX2FsbG9jKG1wLCAmTV9SRVMobXApLT50cl9pY2hhbmdlLCAwLAotCQkJCTAsIDAsICZ0cCk7CisJfQorCWVycm9yID0geGZzX3RyYW5zX2FsbG9jKG1wLCAmTV9SRVMobXApLT50cl93cml0ZSwgcmVzYmxrcywgMCwgMCwgJnRwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtMjA3Nyw2ICsyMTA1LDIzIEBACiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdGlwLCB0YXJnZXRfbG9nX2ZsYWdzKTsKIAogCS8qCisJICogVGhlIGV4dGVudCBmb3JrcyBoYXZlIGJlZW4gc3dhcHBlZCwgYnV0IGNyYz0xLHJtYXBidD0wIGZpbGVzeXN0ZW1zCisJICogaGF2ZSBpbm9kZSBudW1iZXIgb3duZXIgdmFsdWVzIGluIHRoZSBibWJ0IGJsb2NrcyB0aGF0IHN0aWxsIHJlZmVyIHRvCisJICogdGhlIG9sZCBpbm9kZS4gU2NhbiBlYWNoIGJtYnQgdG8gZml4IHVwIHRoZSBvd25lciB2YWx1ZXMgd2l0aCB0aGUKKwkgKiBpbm9kZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgaW5vZGUuCisJICovCisJaWYgKHNyY19sb2dfZmxhZ3MgJiBYRlNfSUxPR19ET1dORVIpIHsKKwkJZXJyb3IgPSB4ZnNfc3dhcF9jaGFuZ2Vfb3duZXIoJnRwLCBpcCwgdGlwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdHJhbnNfY2FuY2VsOworCX0KKwlpZiAodGFyZ2V0X2xvZ19mbGFncyAmIFhGU19JTE9HX0RPV05FUikgeworCQllcnJvciA9IHhmc19zd2FwX2NoYW5nZV9vd25lcigmdHAsIHRpcCwgaXApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF90cmFuc19jYW5jZWw7CisJfQorCisJLyoKIAkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQogCSAqIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSB1c2VyLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWYuYyBiL2ZzL3hmcy94ZnNfYnVmLmMKaW5kZXggMTYyNjkyNy4uZWNhN2JhZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWYuYworKysgYi9mcy94ZnMveGZzX2J1Zi5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIF9feGZzX2J1Zl9pb2FjY3RfZGVjKAogCXN0cnVjdCB4ZnNfYnVmCSpicCkKIHsKLQlBU1NFUlQoc3Bpbl9pc19sb2NrZWQoJmJwLT5iX2xvY2spKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZicC0+Yl9sb2NrKTsKIAogCWlmIChicC0+Yl9zdGF0ZSAmIFhGU19CU1RBVEVfSU5fRkxJR0hUKSB7CiAJCWJwLT5iX3N0YXRlICY9IH5YRlNfQlNUQVRFX0lOX0ZMSUdIVDsKQEAgLTIwMjIsNiArMjAyMiw2NiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorLyoKKyAqIFB1c2ggYSBzaW5nbGUgYnVmZmVyIG9uIGEgZGVsd3JpIHF1ZXVlLgorICoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gc3VibWl0IGEgc2luZ2xlIGJ1ZmZlciBvZiBhIGRlbHdyaSBxdWV1ZQorICogYW5kIHJldHVybiB3aXRoIHRoZSBidWZmZXIgc3RpbGwgb24gdGhlIG9yaWdpbmFsIHF1ZXVlLiBUaGUgd2FpdGluZyBkZWx3cmkKKyAqIGJ1ZmZlciBzdWJtaXNzaW9uIGluZnJhc3RydWN0dXJlIGd1YXJhbnRlZXMgdHJhbnNmZXIgb2YgdGhlIGRlbHdyaSBxdWV1ZQorICogYnVmZmVyIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeSB3YWl0IGxpc3QuIFdlIHJldXNlIHRoaXMgaW5mcmFzdHJ1Y3R1cmUgdG8KKyAqIHRyYW5zZmVyIHRoZSBidWZmZXIgYmFjayB0byB0aGUgb3JpZ2luYWwgcXVldWUuCisgKgorICogTm90ZSB0aGUgYnVmZmVyIHRyYW5zaXRpb25zIGZyb20gdGhlIHF1ZXVlZCBzdGF0ZSwgdG8gdGhlIHN1Ym1pdHRlZCBhbmQgd2FpdAorICogbGlzdGVkIHN0YXRlIGFuZCBiYWNrIHRvIHRoZSBxdWV1ZWQgc3RhdGUgZHVyaW5nIHRoaXMgY2FsbC4gVGhlIGJ1ZmZlcgorICogbG9ja2luZyBhbmQgcXVldWUgbWFuYWdlbWVudCBsb2dpYyBiZXR3ZWVuIF9kZWx3cmlfcHVzaGJ1ZigpIGFuZAorICogX2RlbHdyaV9xdWV1ZSgpIGd1YXJhbnRlZSB0aGF0IHRoZSBidWZmZXIgY2Fubm90IGJlIHF1ZXVlZCB0byBhbm90aGVyIGxpc3QKKyAqIGJlZm9yZSByZXR1cm5pbmcuCisgKi8KK2ludAoreGZzX2J1Zl9kZWx3cmlfcHVzaGJ1ZigKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQoreworCUxJU1RfSEVBRAkJKHN1Ym1pdF9saXN0KTsKKwlpbnQJCQllcnJvcjsKKworCUFTU0VSVChicC0+Yl9mbGFncyAmIF9YQkZfREVMV1JJX1EpOworCisJdHJhY2VfeGZzX2J1Zl9kZWx3cmlfcHVzaGJ1ZihicCwgX1JFVF9JUF8pOworCisJLyoKKwkgKiBJc29sYXRlIHRoZSBidWZmZXIgdG8gYSBuZXcgbG9jYWwgbGlzdCBzbyB3ZSBjYW4gc3VibWl0IGl0IGZvciBJL08KKwkgKiBpbmRlcGVuZGVudGx5IGZyb20gdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIGxpc3QuCisJICovCisJeGZzX2J1Zl9sb2NrKGJwKTsKKwlsaXN0X21vdmUoJmJwLT5iX2xpc3QsICZzdWJtaXRfbGlzdCk7CisJeGZzX2J1Zl91bmxvY2soYnApOworCisJLyoKKwkgKiBEZWx3cmkgc3VibWlzc2lvbiBjbGVhcnMgdGhlIERFTFdSSV9RIGJ1ZmZlciBmbGFnIGFuZCByZXR1cm5zIHdpdGgKKwkgKiB0aGUgYnVmZmVyIG9uIHRoZSB3YWl0IGxpc3Qgd2l0aCBhbiBhc3NvY2lhdGVkIHJlZmVyZW5jZS4gUmF0aGVyIHRoYW4KKwkgKiBib3VuY2UgdGhlIGJ1ZmZlciBmcm9tIGEgbG9jYWwgd2FpdCBsaXN0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGxpc3QKKwkgKiBhZnRlciBJL08gY29tcGxldGlvbiwgcmV1c2UgdGhlIG9yaWdpbmFsIGxpc3QgYXMgdGhlIHdhaXQgbGlzdC4KKwkgKi8KKwl4ZnNfYnVmX2RlbHdyaV9zdWJtaXRfYnVmZmVycygmc3VibWl0X2xpc3QsIGJ1ZmZlcl9saXN0KTsKKworCS8qCisJICogVGhlIGJ1ZmZlciBpcyBub3cgdW5kZXIgSS9PIGFuZCB3YWl0IGxpc3RlZCBhcyBkdXJpbmcgdHlwaWNhbCBkZWx3cmkKKwkgKiBzdWJtaXNzaW9uLiBMb2NrIHRoZSBidWZmZXIgdG8gd2FpdCBmb3IgSS9PIGNvbXBsZXRpb24uIFJhdGhlciB0aGFuCisJICogcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgd2FpdCBsaXN0IGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2UsIHdlCisJICogd2FudCB0byByZXR1cm4gd2l0aCB0aGUgYnVmZmVyIHF1ZXVlZCB0byB0aGUgb3JpZ2luYWwgbGlzdC4gVGhlCisJICogYnVmZmVyIGFscmVhZHkgc2l0cyBvbiB0aGUgb3JpZ2luYWwgbGlzdCB3aXRoIGEgd2FpdCBsaXN0IHJlZmVyZW5jZSwKKwkgKiBob3dldmVyLiBJZiB3ZSBsZXQgdGhlIHF1ZXVlIGluaGVyaXQgdGhhdCB3YWl0IGxpc3QgcmVmZXJlbmNlLCBhbGwgd2UKKwkgKiBuZWVkIHRvIGRvIGlzIHJlc2V0IHRoZSBERUxXUklfUSBmbGFnLgorCSAqLworCXhmc19idWZfbG9jayhicCk7CisJZXJyb3IgPSBicC0+Yl9lcnJvcjsKKwlicC0+Yl9mbGFncyB8PSBfWEJGX0RFTFdSSV9ROworCXhmc19idWZfdW5sb2NrKGJwKTsKKworCXJldHVybiBlcnJvcjsKK30KKwogaW50IF9faW5pdAogeGZzX2J1Zl9pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zi5oIGIvZnMveGZzL3hmc19idWYuaAppbmRleCBhZDUxNGE4Li5mOTYxYjE5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zi5oCisrKyBiL2ZzL3hmcy94ZnNfYnVmLmgKQEAgLTMzMyw2ICszMzMsNyBAQAogZXh0ZXJuIGJvb2wgeGZzX2J1Zl9kZWx3cmlfcXVldWUoc3RydWN0IHhmc19idWYgKiwgc3RydWN0IGxpc3RfaGVhZCAqKTsKIGV4dGVybiBpbnQgeGZzX2J1Zl9kZWx3cmlfc3VibWl0KHN0cnVjdCBsaXN0X2hlYWQgKik7CiBleHRlcm4gaW50IHhmc19idWZfZGVsd3JpX3N1Ym1pdF9ub3dhaXQoc3RydWN0IGxpc3RfaGVhZCAqKTsKK2V4dGVybiBpbnQgeGZzX2J1Zl9kZWx3cmlfcHVzaGJ1ZihzdHJ1Y3QgeGZzX2J1ZiAqLCBzdHJ1Y3QgbGlzdF9oZWFkICopOwogCiAvKiBCdWZmZXIgRGFlbW9uIFNldHVwIFJvdXRpbmVzICovCiBleHRlcm4gaW50IHhmc19idWZfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCAwMzA2MTY4Li5lMGEwYWYwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX3RyYWNlLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgogCiAKIGttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKQEAgLTMyMiw2ICszMjMsOCBAQAogCUFTU0VSVCgoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB8fAogCSAgICAgICAoeGZzX2JsZnRfZnJvbV9mbGFncygmYmlwLT5fX2JsaV9mb3JtYXQpID4gWEZTX0JMRlRfVU5LTk9XTl9CVUYKIAkgICAgICAgICYmIHhmc19ibGZ0X2Zyb21fZmxhZ3MoJmJpcC0+X19ibGlfZm9ybWF0KSA8IFhGU19CTEZUX01BWF9CVUYpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfT1JERVJFRCkgfHwKKwkgICAgICAgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOwogCiAKIAkvKgpAQCAtMzQ2LDE2ICszNDksNiBAQAogCQliaXAtPmJsaV9mbGFncyAmPSB+WEZTX0JMSV9JTk9ERV9CVUY7CiAJfQogCi0JaWYgKChiaXAtPmJsaV9mbGFncyAmIChYRlNfQkxJX09SREVSRUR8WEZTX0JMSV9TVEFMRSkpID09Ci0JCQkJCQkJWEZTX0JMSV9PUkRFUkVEKSB7Ci0JCS8qCi0JCSAqIFRoZSBidWZmZXIgaGFzIGJlZW4gbG9nZ2VkIGp1c3QgdG8gb3JkZXIgaXQuICBJdCBpcyBub3QgYmVpbmcKLQkJICogaW5jbHVkZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGNvbW1pdCwgc28gZG9uJ3QgZm9ybWF0IGl0LgotCQkgKi8KLQkJdHJhY2VfeGZzX2J1Zl9pdGVtX2Zvcm1hdF9vcmRlcmVkKGJpcCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgYmlwLT5ibGlfZm9ybWF0X2NvdW50OyBpKyspIHsKIAkJeGZzX2J1Zl9pdGVtX2Zvcm1hdF9zZWdtZW50KGJpcCwgbHYsICZ2ZWNwLCBvZmZzZXQsCiAJCQkJCSAgICAmYmlwLT5ibGlfZm9ybWF0c1tpXSk7CkBAIC01NzQsMjYgKzU2NywyMCBAQAogewogCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBCVUZfSVRFTShsaXApOwogCXN0cnVjdCB4ZnNfYnVmCQkqYnAgPSBiaXAtPmJsaV9idWY7Ci0JYm9vbAkJCWNsZWFuOwotCWJvb2wJCQlhYm9ydGVkOwotCWludAkJCWZsYWdzOworCWJvb2wJCQlhYm9ydGVkID0gISEobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKTsKKwlib29sCQkJaG9sZCA9ICEhKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9IT0xEKTsKKwlib29sCQkJZGlydHkgPSAhIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfRElSVFkpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWEZTX1dBUk4pCisJYm9vbAkJCW9yZGVyZWQgPSAhIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfT1JERVJFRCk7CisjZW5kaWYKIAogCS8qIENsZWFyIHRoZSBidWZmZXIncyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uICovCiAJYnAtPmJfdHJhbnNwID0gTlVMTDsKIAogCS8qCi0JICogSWYgdGhpcyBpcyBhIHRyYW5zYWN0aW9uIGFib3J0LCBkb24ndCByZXR1cm4gZWFybHkuICBJbnN0ZWFkLCBhbGxvdwotCSAqIHRoZSBicmVsc2UgdG8gaGFwcGVuLiAgTm9ybWFsbHkgaXQgd291bGQgYmUgZG9uZSBmb3Igc3RhbGUKLQkgKiAoY2FuY2VsbGVkKSBidWZmZXJzIGF0IHVucGluIHRpbWUsIGJ1dCB3ZSdsbCBuZXZlciBnbyB0aHJvdWdoIHRoZQotCSAqIHBpbi91bnBpbiBjeWNsZSBpZiB3ZSBhYm9ydCBpbnNpZGUgY29tbWl0LgorCSAqIFRoZSBwZXItdHJhbnNhY3Rpb24gc3RhdGUgaGFzIGJlZW4gY29waWVkIGFib3ZlIHNvIGNsZWFyIGl0IGZyb20gdGhlCisJICogYmxpLgogCSAqLwotCWFib3J0ZWQgPSAobGlwLT5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSA/IHRydWUgOiBmYWxzZTsKLQkvKgotCSAqIEJlZm9yZSBwb3NzaWJseSBmcmVlaW5nIHRoZSBidWYgaXRlbSwgY29weSB0aGUgcGVyLXRyYW5zYWN0aW9uIHN0YXRlCi0JICogc28gd2UgY2FuIHJlZmVyZW5jZSBpdCBzYWZlbHkgbGF0ZXIgYWZ0ZXIgY2xlYXJpbmcgaXQgZnJvbSB0aGUKLQkgKiBidWZmZXIgbG9nIGl0ZW0uCi0JICovCi0JZmxhZ3MgPSBiaXAtPmJsaV9mbGFnczsKIAliaXAtPmJsaV9mbGFncyAmPSB+KFhGU19CTElfTE9HR0VEIHwgWEZTX0JMSV9IT0xEIHwgWEZTX0JMSV9PUkRFUkVEKTsKIAogCS8qCkBAIC02MDEsNyArNTg4LDcgQEAKIAkgKiB1bmxvY2sgdGhlIGJ1ZmZlciBhbmQgZnJlZSB0aGUgYnVmIGl0ZW0gd2hlbiB0aGUgYnVmZmVyIGlzIHVucGlubmVkCiAJICogZm9yIHRoZSBsYXN0IHRpbWUuCiAJICovCi0JaWYgKGZsYWdzICYgWEZTX0JMSV9TVEFMRSkgeworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKIAkJdHJhY2VfeGZzX2J1Zl9pdGVtX3VubG9ja19zdGFsZShiaXApOwogCQlBU1NFUlQoYmlwLT5fX2JsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMRl9DQU5DRUwpOwogCQlpZiAoIWFib3J0ZWQpIHsKQEAgLTYxOSw0MCArNjA2LDM0IEBACiAJICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGRpcnR5IG9yIG5vdC4gQSBkaXJ0eSBhYm9ydCBpbXBsaWVzIGEKIAkgKiBzaHV0ZG93biwgYW55d2F5LgogCSAqCi0JICogT3JkZXJlZCBidWZmZXJzIGFyZSBkaXJ0eSBidXQgbWF5IGhhdmUgbm8gcmVjb3JkZWQgY2hhbmdlcywgc28gZW5zdXJlCi0JICogd2Ugb25seSByZWxlYXNlIGNsZWFuIGl0ZW1zIGhlcmUuCisJICogVGhlIGJsaSBkaXJ0eSBzdGF0ZSBzaG91bGQgbWF0Y2ggd2hldGhlciB0aGUgYmxmIGhhcyBsb2dnZWQgc2VnbWVudHMKKwkgKiBleGNlcHQgZm9yIG9yZGVyZWQgYnVmZmVycywgd2hlcmUgb25seSB0aGUgYmxpIHNob3VsZCBiZSBkaXJ0eS4KIAkgKi8KLQljbGVhbiA9IChmbGFncyAmIFhGU19CTElfRElSVFkpID8gZmFsc2UgOiB0cnVlOwotCWlmIChjbGVhbikgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGJpcC0+YmxpX2Zvcm1hdF9jb3VudDsgaSsrKSB7Ci0JCQlpZiAoIXhmc19iaXRtYXBfZW1wdHkoYmlwLT5ibGlfZm9ybWF0c1tpXS5ibGZfZGF0YV9tYXAsCi0JCQkJICAgICBiaXAtPmJsaV9mb3JtYXRzW2ldLmJsZl9tYXBfc2l6ZSkpIHsKLQkJCQljbGVhbiA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorCUFTU0VSVCgoIW9yZGVyZWQgJiYgZGlydHkgPT0geGZzX2J1Zl9pdGVtX2RpcnR5X2Zvcm1hdChiaXApKSB8fAorCSAgICAgICAob3JkZXJlZCAmJiBkaXJ0eSAmJiAheGZzX2J1Zl9pdGVtX2RpcnR5X2Zvcm1hdChiaXApKSk7CiAKIAkvKgogCSAqIENsZWFuIGJ1ZmZlcnMsIGJ5IGRlZmluaXRpb24sIGNhbm5vdCBiZSBpbiB0aGUgQUlMLiBIb3dldmVyLCBhYm9ydGVkCi0JICogYnVmZmVycyBtYXkgYmUgZGlydHkgYW5kIGhlbmNlIGluIHRoZSBBSUwuIFRoZXJlZm9yZSBpZiB3ZSBhcmUKLQkgKiBhYm9ydGluZyBhIGJ1ZmZlciBhbmQgd2UndmUganVzdCB0YWtlbiB0aGUgbGFzdCByZWZlcm5jZSBhd2F5LCB3ZQotCSAqIGhhdmUgdG8gY2hlY2sgaWYgaXQgaXMgaW4gdGhlIEFJTCBiZWZvcmUgZnJlZWluZyBpdC4gV2UgbmVlZCB0byBmcmVlCi0JICogaXQgaW4gdGhpcyBjYXNlLCBiZWNhdXNlIGFuIGFib3J0ZWQgdHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgc2h1dCB0aGUKLQkgKiBmaWxlc3lzdGVtIGRvd24gYW5kIHRoaXMgaXMgdGhlIGxhc3QgY2hhbmNlIHdlIHdpbGwgaGF2ZSB0byBkbyBzby4KKwkgKiBidWZmZXJzIG1heSBiZSBpbiB0aGUgQUlMIHJlZ2FyZGxlc3Mgb2YgZGlydHkgc3RhdGUuIEFuIGFib3J0ZWQKKwkgKiB0cmFuc2FjdGlvbiB0aGF0IGludmFsaWRhdGVzIGEgYnVmZmVyIGFscmVhZHkgaW4gdGhlIEFJTCBtYXkgaGF2ZQorCSAqIG1hcmtlZCBpdCBzdGFsZSBhbmQgY2xlYXJlZCB0aGUgZGlydHkgc3RhdGUsIGZvciBleGFtcGxlLgorCSAqCisJICogVGhlcmVmb3JlIGlmIHdlIGFyZSBhYm9ydGluZyBhIGJ1ZmZlciBhbmQgd2UndmUganVzdCB0YWtlbiB0aGUgbGFzdAorCSAqIHJlZmVyZW5jZSBhd2F5LCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGl0IGlzIGluIHRoZSBBSUwgYmVmb3JlIGZyZWVpbmcKKwkgKiBpdC4gV2UgbmVlZCB0byBmcmVlIGl0IGluIHRoaXMgY2FzZSwgYmVjYXVzZSBhbiBhYm9ydGVkIHRyYW5zYWN0aW9uCisJICogaGFzIGFscmVhZHkgc2h1dCB0aGUgZmlsZXN5c3RlbSBkb3duIGFuZCB0aGlzIGlzIHRoZSBsYXN0IGNoYW5jZSB3ZQorCSAqIHdpbGwgaGF2ZSB0byBkbyBzby4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYmlwLT5ibGlfcmVmY291bnQpKSB7Ci0JCWlmIChjbGVhbikKLQkJCXhmc19idWZfaXRlbV9yZWxzZShicCk7Ci0JCWVsc2UgaWYgKGFib3J0ZWQpIHsKKwkJaWYgKGFib3J0ZWQpIHsKIAkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKGxpcC0+bGlfbW91bnRwKSk7CiAJCQl4ZnNfdHJhbnNfYWlsX3JlbW92ZShsaXAsIFNIVVRET1dOX0xPR19JT19FUlJPUik7CiAJCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOwotCQl9CisJCX0gZWxzZSBpZiAoIWRpcnR5KQorCQkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKIAl9CiAKLQlpZiAoIShmbGFncyAmIFhGU19CTElfSE9MRCkpCisJaWYgKCFob2xkKQogCQl4ZnNfYnVmX3JlbHNlKGJwKTsKIH0KIApAQCAtOTQyLDE0ICs5MjMsMjIgQEAKIAogCiAvKgotICogUmV0dXJuIDEgaWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBsb2dnZWQgb3Igb3JkZXJlZCBpbiBhIHRyYW5zYWN0aW9uIChhdCBhbnkKLSAqIHBvaW50LCBub3QganVzdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbikgYW5kIDAgaWYgbm90LgorICogUmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBoYXMgYW55IHJhbmdlcyBsb2dnZWQvZGlydGllZCBieSBhIHRyYW5zYWN0aW9uLAorICogZmFsc2Ugb3RoZXJ3aXNlLgogICovCi11aW50Ci14ZnNfYnVmX2l0ZW1fZGlydHkoCi0JeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCitib29sCit4ZnNfYnVmX2l0ZW1fZGlydHlfZm9ybWF0KAorCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXApCiB7Ci0JcmV0dXJuIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfRElSVFkpOworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmlwLT5ibGlfZm9ybWF0X2NvdW50OyBpKyspIHsKKwkJaWYgKCF4ZnNfYml0bWFwX2VtcHR5KGJpcC0+YmxpX2Zvcm1hdHNbaV0uYmxmX2RhdGFfbWFwLAorCQkJICAgICBiaXAtPmJsaV9mb3JtYXRzW2ldLmJsZl9tYXBfc2l6ZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIFNUQVRJQyB2b2lkCkBAIC0xMDUxLDYgKzEwNDAsMzEgQEAKIAl9CiB9CiAKKy8qCisgKiBJbnZva2UgdGhlIGVycm9yIHN0YXRlIGNhbGxiYWNrIGZvciBlYWNoIGxvZyBpdGVtIGFmZmVjdGVkIGJ5IHRoZSBmYWlsZWQgSS9PLgorICoKKyAqIElmIGEgbWV0YWRhdGEgYnVmZmVyIHdyaXRlIGZhaWxzIHdpdGggYSBub24tcGVybWFuZW50IGVycm9yLCB0aGUgYnVmZmVyIGlzCisgKiBldmVudHVhbGx5IHJlc3VibWl0dGVkIGFuZCBzbyB0aGUgY29tcGxldGlvbiBjYWxsYmFja3MgYXJlIG5vdCBydW4uIFRoZSBlcnJvcgorICogc3RhdGUgbWF5IG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgbG9nIGl0ZW1zIGF0dGFjaGVkIHRvIHRoZSBidWZmZXIsCisgKiBob3dldmVyLCBzbyB0aGUgbmV4dCBBSUwgcHVzaCBvZiB0aGUgaXRlbSBrbm93cyBob3QgdG8gaGFuZGxlIGl0IGNvcnJlY3RseS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19idWZfZG9fY2FsbGJhY2tzX2ZhaWwoCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpuZXh0OworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmxpcCA9IGJwLT5iX2ZzcHJpdjsKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAgPSBsaXAtPmxpX2FpbHA7CisKKwlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOworCWZvciAoOyBsaXA7IGxpcCA9IG5leHQpIHsKKwkJbmV4dCA9IGxpcC0+bGlfYmlvX2xpc3Q7CisJCWlmIChsaXAtPmxpX29wcy0+aW9wX2Vycm9yKQorCQkJbGlwLT5saV9vcHMtPmlvcF9lcnJvcihsaXAsIGJwKTsKKwl9CisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworfQorCiBzdGF0aWMgYm9vbAogeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tfZXJyb3IoCiAJc3RydWN0IHhmc19idWYJCSpicCkKQEAgLTExMjAsNyArMTEzNCwxMSBAQAogCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfVU5NT1VOVElORykgJiYgbXAtPm1fZmFpbF91bm1vdW50KQogCQlnb3RvIHBlcm1hbmVudF9lcnJvcjsKIAotCS8qIHN0aWxsIGEgdHJhbnNpZW50IGVycm9yLCBoaWdoZXIgbGF5ZXJzIHdpbGwgcmV0cnkgKi8KKwkvKgorCSAqIFN0aWxsIGEgdHJhbnNpZW50IGVycm9yLCBydW4gSU8gY29tcGxldGlvbiBmYWlsdXJlIGNhbGxiYWNrcyBhbmQgbGV0CisJICogdGhlIGhpZ2hlciBsYXllcnMgcmV0cnkgdGhlIGJ1ZmZlci4KKwkgKi8KKwl4ZnNfYnVmX2RvX2NhbGxiYWNrc19mYWlsKGJwKTsKIAl4ZnNfYnVmX2lvZXJyb3IoYnAsIDApOwogCXhmc19idWZfcmVsc2UoYnApOwogCXJldHVybiB0cnVlOwpAQCAtMTIwMSwzICsxMjE5LDMxIEBACiAJeGZzX3RyYW5zX2FpbF9kZWxldGUoYWlscCwgbGlwLCBTSFVURE9XTl9DT1JSVVBUX0lOQ09SRSk7CiAJeGZzX2J1Zl9pdGVtX2ZyZWUoQlVGX0lURU0obGlwKSk7CiB9CisKKy8qCisgKiBSZXF1ZXVlIGEgZmFpbGVkIGJ1ZmZlciBmb3Igd3JpdGViYWNrCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiByZS1xdWV1ZWQgcHJvcGVybHksIGZhbHNlIG90aGVyd2lzZQorICovCitib29sCit4ZnNfYnVmX3Jlc3VibWl0X2ZhaWxlZF9idWZmZXJzKAorCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQoreworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKm5leHQ7CisKKwkvKgorCSAqIENsZWFyIFhGU19MSV9GQUlMRUQgZmxhZyBmcm9tIGFsbCBpdGVtcyBiZWZvcmUgcmVzdWJtaXQKKwkgKgorCSAqIFhGU19MSV9GQUlMRUQgc2V0L2NsZWFyIGlzIHByb3RlY3RlZCBieSB4YV9sb2NrLCBjYWxsZXIgIHRoaXMKKwkgKiBmdW5jdGlvbiBhbHJlYWR5IGhhdmUgaXQgYWNxdWlyZWQKKwkgKi8KKwlmb3IgKDsgbGlwOyBsaXAgPSBuZXh0KSB7CisJCW5leHQgPSBsaXAtPmxpX2Jpb19saXN0OworCQl4ZnNfY2xlYXJfbGlfZmFpbGVkKGxpcCk7CisJfQorCisJLyogQWRkIHRoaXMgYnVmZmVyIGJhY2sgdG8gdGhlIGRlbGF5ZWQgd3JpdGUgbGlzdCAqLworCXJldHVybiB4ZnNfYnVmX2RlbHdyaV9xdWV1ZShicCwgYnVmZmVyX2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5oIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCmluZGV4IGY3ZWJhOTkuLjk2OTBjZTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaAorKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKQEAgLTY0LDEyICs2NCwxNSBAQAogaW50CXhmc19idWZfaXRlbV9pbml0KHN0cnVjdCB4ZnNfYnVmICosIHN0cnVjdCB4ZnNfbW91bnQgKik7CiB2b2lkCXhmc19idWZfaXRlbV9yZWxzZShzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJeGZzX2J1Zl9pdGVtX2xvZyh4ZnNfYnVmX2xvZ19pdGVtX3QgKiwgdWludCwgdWludCk7Ci11aW50CXhmc19idWZfaXRlbV9kaXJ0eSh4ZnNfYnVmX2xvZ19pdGVtX3QgKik7Citib29sCXhmc19idWZfaXRlbV9kaXJ0eV9mb3JtYXQoc3RydWN0IHhmc19idWZfbG9nX2l0ZW0gKik7CiB2b2lkCXhmc19idWZfYXR0YWNoX2lvZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqLAogCQkJICAgICAgdm9pZCgqKShzdHJ1Y3QgeGZzX2J1ZiAqLCB4ZnNfbG9nX2l0ZW1fdCAqKSwKIAkJCSAgICAgIHhmc19sb2dfaXRlbV90ICopOwogdm9pZAl4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3Moc3RydWN0IHhmc19idWYgKik7CiB2b2lkCXhmc19idWZfaW9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7Citib29sCXhmc19idWZfcmVzdWJtaXRfZmFpbGVkX2J1ZmZlcnMoc3RydWN0IHhmc19idWYgKiwKKwkJCQkJc3RydWN0IHhmc19sb2dfaXRlbSAqLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICopOwogCiBleHRlcm4ga21lbV96b25lX3QJKnhmc19idWZfaXRlbV96b25lOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZpbGUuYyBiL2ZzL3hmcy94ZnNfZmlsZS5jCmluZGV4IGRmMjA2Y2YuLjU4NmIzOTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy94ZnNfZmlsZS5jCkBAIC03MjksNiArNzI5LDcgQEAKIAkJeGZzX3J3X2l1bmxvY2soaXAsIGlvbG9jayk7CiAJCWVvZmIuZW9mX2ZsYWdzID0gWEZTX0VPRl9GTEFHU19TWU5DOwogCQl4ZnNfaWNhY2hlX2ZyZWVfZW9mYmxvY2tzKGlwLT5pX21vdW50LCAmZW9mYik7CisJCXhmc19pY2FjaGVfZnJlZV9jb3dibG9ja3MoaXAtPmlfbW91bnQsICZlb2ZiKTsKIAkJZ290byB3cml0ZV9yZXRyeTsKIAl9CiAKQEAgLTExMzksMjkgKzExNDAsOCBAQAogCQl3YW50ID0gbWluX3QocGdvZmZfdCwgZW5kIC0gaW5kZXgsIFBBR0VWRUNfU0laRSAtIDEpICsgMTsKIAkJbnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cCgmcHZlYywgaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCiAJCQkJCSAgd2FudCk7Ci0JCS8qCi0JCSAqIE5vIHBhZ2UgbWFwcGVkIGludG8gZ2l2ZW4gcmFuZ2UuICBJZiB3ZSBhcmUgc2VhcmNoaW5nIGhvbGVzCi0JCSAqIGFuZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGdvdCBpbnRvIHRoZSBsb29wLCBpdCBtZWFucwotCQkgKiB0aGF0IHRoZSBnaXZlbiBvZmZzZXQgaXMgbGFuZGVkIGluIGEgaG9sZSwgcmV0dXJuIGl0LgotCQkgKgotCQkgKiBJZiB3ZSBoYXZlIGFscmVhZHkgc3RlcHBlZCB0aHJvdWdoIHNvbWUgYmxvY2sgYnVmZmVycyB0byBmaW5kCi0JCSAqIGhvbGVzIGJ1dCB0aGV5IGFsbCBjb250YWlucyBkYXRhLiAgSW4gdGhpcyBjYXNlLCB0aGUgbGFzdAotCQkgKiBvZmZzZXQgaXMgYWxyZWFkeSB1cGRhdGVkIGFuZCBwb2ludGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QKLQkJICogbWFwcGVkIHBhZ2UsIGlmIGl0IGRvZXMgbm90IHJlYWNoIHRoZSBlbmRwb2ludCB0byBzZWFyY2gsCi0JCSAqIHRoYXQgbWVhbnMgdGhlcmUgc2hvdWxkIGJlIGEgaG9sZSBiZXR3ZWVuIHRoZW0uCi0JCSAqLwotCQlpZiAobnJfcGFnZXMgPT0gMCkgewotCQkJLyogRGF0YSBzZWFyY2ggZm91bmQgbm90aGluZyAqLwotCQkJaWYgKHR5cGUgPT0gREFUQV9PRkYpCi0JCQkJYnJlYWs7Ci0KLQkJCUFTU0VSVCh0eXBlID09IEhPTEVfT0ZGKTsKLQkJCWlmIChsYXN0b2ZmID09IHN0YXJ0b2ZmIHx8IGxhc3RvZmYgPCBlbmRvZmYpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJKm9mZnNldCA9IGxhc3RvZmY7Ci0JCQl9CisJCWlmIChucl9wYWdlcyA9PSAwKQogCQkJYnJlYWs7Ci0JCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwpAQCAtMTIyNywyMSArMTIwNywyMCBAQAogCiAJCS8qCiAJCSAqIFRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcGFnZXMgbGVzcyB0aGFuIG91ciBkZXNpcmVkLCBzZWFyY2gKLQkJICogZG9uZS4gIEluIHRoaXMgY2FzZSwgbm90aGluZyB3YXMgZm91bmQgZm9yIHNlYXJjaGluZyBkYXRhLAotCQkgKiBidXQgd2UgZm91bmQgYSBob2xlIGJlaGluZCB0aGUgbGFzdCBvZmZzZXQuCisJCSAqIGRvbmUuCiAJCSAqLwotCQlpZiAobnJfcGFnZXMgPCB3YW50KSB7Ci0JCQlpZiAodHlwZSA9PSBIT0xFX09GRikgewotCQkJCSpvZmZzZXQgPSBsYXN0b2ZmOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KKwkJaWYgKG5yX3BhZ2VzIDwgd2FudCkKIAkJCWJyZWFrOwotCQl9CiAKIAkJaW5kZXggPSBwdmVjLnBhZ2VzW2kgLSAxXS0+aW5kZXggKyAxOwogCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCX0gd2hpbGUgKGluZGV4IDw9IGVuZCk7CiAKKwkvKiBObyBwYWdlIGF0IGxhc3RvZmYgYW5kIHdlIGFyZSBub3QgZG9uZSAtIHdlIGZvdW5kIGEgaG9sZS4gKi8KKwlpZiAodHlwZSA9PSBIT0xFX09GRiAmJiBsYXN0b2ZmIDwgZW5kb2ZmKSB7CisJCSpvZmZzZXQgPSBsYXN0b2ZmOworCQlmb3VuZCA9IHRydWU7CisJfQogb3V0OgogCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJcmV0dXJuIGZvdW5kOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pY2FjaGUuYyBiL2ZzL3hmcy94ZnNfaWNhY2hlLmMKaW5kZXggNzQzMDRiNi4uODZhNDkxMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pY2FjaGUuYworKysgYi9mcy94ZnMveGZzX2ljYWNoZS5jCkBAIC02Niw3ICs2Niw2IEBACiAKIAlYRlNfU1RBVFNfSU5DKG1wLCB2bl9hY3RpdmUpOwogCUFTU0VSVChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApOwotCUFTU0VSVCghc3Bpbl9pc19sb2NrZWQoJmlwLT5pX2ZsYWdzX2xvY2spKTsKIAlBU1NFUlQoIXhmc19pc2lmbG9ja2VkKGlwKSk7CiAJQVNTRVJUKGlwLT5pX2lubyA9PSAwKTsKIApAQCAtMTkyLDcgKzE5MSw3IEBACiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBwYWctPnBhZ19tb3VudDsKIAotCUFTU0VSVChzcGluX2lzX2xvY2tlZCgmcGFnLT5wYWdfaWNpX2xvY2spKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJaWYgKHBhZy0+cGFnX2ljaV9yZWNsYWltYWJsZSsrKQogCQlyZXR1cm47CiAKQEAgLTIxNCw3ICsyMTMsNyBAQAogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gcGFnLT5wYWdfbW91bnQ7CiAKLQlBU1NFUlQoc3Bpbl9pc19sb2NrZWQoJnBhZy0+cGFnX2ljaV9sb2NrKSk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcGFnLT5wYWdfaWNpX2xvY2spOwogCWlmICgtLXBhZy0+cGFnX2ljaV9yZWNsYWltYWJsZSkKIAkJcmV0dXJuOwogCkBAIC0xMDc5LDExICsxMDc4LDExIEBACiAJICogQmVjYXVzZSB3ZSB1c2UgUkNVIGZyZWVpbmcgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGlub2RlIGFsd2F5cyBhcHBlYXJzCiAJICogdG8gYmUgcmVjbGFpbWVkIHdpdGggYW4gaW52YWxpZCBpbm9kZSBudW1iZXIgd2hlbiBpbiB0aGUgZnJlZSBzdGF0ZS4KIAkgKiBXZSBkbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHVuZGVyIHRoZSBJTE9DSyBzbyB0aGF0Ci0JICogeGZzX2lmbHVzaF9jbHVzdGVyKCkgY2FuIGJlIGd1YXJhbnRlZWQgdG8gZGV0ZWN0IHJhY2VzIHdpdGggdXMgaGVyZS4KLQkgKiBCeSBkb2luZyB0aGlzLCB3ZSBndWFyYW50ZWUgdGhhdCBvbmNlIHhmc19pZmx1c2hfY2x1c3RlciBoYXMgbG9ja2VkCi0JICogWEZTX0lMT0NLIHRoYXQgaXQgd2lsbCBzZWUgZWl0aGVyIGEgdmFsaWQsIGZsdXNoYWJsZSBpbm9kZSB0aGF0IHdpbGwKLQkgKiBzZXJpYWxpc2UgY29ycmVjdGx5LCBvciBpdCB3aWxsIHNlZSBhIGNsZWFuIChhbmQgaW52YWxpZCkgaW5vZGUgdGhhdAotCSAqIGl0IGNhbiBza2lwLgorCSAqIHhmc19pZmx1c2hfY2x1c3RlcigpIGFuZCB4ZnNfaWZyZWVfY2x1c3RlcigpIGNhbiBiZSBndWFyYW50ZWVkIHRvCisJICogZGV0ZWN0IHJhY2VzIHdpdGggdXMgaGVyZS4gQnkgZG9pbmcgdGhpcywgd2UgZ3VhcmFudGVlIHRoYXQgb25jZQorCSAqIHhmc19pZmx1c2hfY2x1c3RlcigpIG9yIHhmc19pZnJlZV9jbHVzdGVyKCkgaGFzIGxvY2tlZCBYRlNfSUxPQ0sgdGhhdAorCSAqIGl0IHdpbGwgc2VlIGVpdGhlciBhIHZhbGlkIGlub2RlIHRoYXQgd2lsbCBzZXJpYWxpc2UgY29ycmVjdGx5LCBvciBpdAorCSAqIHdpbGwgc2VlIGFuIGludmFsaWQgaW5vZGUgdGhhdCBpdCBjYW4gc2tpcC4KIAkgKi8KIAlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOwogCWlwLT5pX2ZsYWdzID0gWEZTX0lSRUNMQUlNOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5jIGIvZnMveGZzL3hmc19pbm9kZS5jCmluZGV4IDdhMGI0ZWUuLjllNzk1YWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTg4MSw3ICs4ODEsNiBAQAogCWNhc2UgU19JRlJFRzoKIAljYXNlIFNfSUZESVI6CiAJCWlmIChwaXAgJiYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19BTlkpKSB7Ci0JCQl1aW50NjRfdAlkaV9mbGFnczIgPSAwOwogCQkJdWludAkJZGlfZmxhZ3MgPSAwOwogCiAJCQlpZiAoU19JU0RJUihtb2RlKSkgewpAQCAtOTE4LDIwICs5MTcsMjMgQEAKIAkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX05PREVGUkFHOwogCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19GSUxFU1RSRUFNKQogCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRklMRVNUUkVBTTsKLQkJCWlmIChwaXAtPmlfZC5kaV9mbGFnczIgJiBYRlNfRElGTEFHMl9EQVgpCi0JCQkJZGlfZmxhZ3MyIHw9IFhGU19ESUZMQUcyX0RBWDsKIAogCQkJaXAtPmlfZC5kaV9mbGFncyB8PSBkaV9mbGFnczsKLQkJCWlwLT5pX2QuZGlfZmxhZ3MyIHw9IGRpX2ZsYWdzMjsKIAkJfQogCQlpZiAocGlwICYmCiAJCSAgICAocGlwLT5pX2QuZGlfZmxhZ3MyICYgWEZTX0RJRkxBRzJfQU5ZKSAmJgogCQkgICAgcGlwLT5pX2QuZGlfdmVyc2lvbiA9PSAzICYmCiAJCSAgICBpcC0+aV9kLmRpX3ZlcnNpb24gPT0gMykgeworCQkJdWludDY0X3QJZGlfZmxhZ3MyID0gMDsKKwogCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzMiAmIFhGU19ESUZMQUcyX0NPV0VYVFNJWkUpIHsKLQkJCQlpcC0+aV9kLmRpX2ZsYWdzMiB8PSBYRlNfRElGTEFHMl9DT1dFWFRTSVpFOworCQkJCWRpX2ZsYWdzMiB8PSBYRlNfRElGTEFHMl9DT1dFWFRTSVpFOwogCQkJCWlwLT5pX2QuZGlfY293ZXh0c2l6ZSA9IHBpcC0+aV9kLmRpX2Nvd2V4dHNpemU7CiAJCQl9CisJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MyICYgWEZTX0RJRkxBRzJfREFYKQorCQkJCWRpX2ZsYWdzMiB8PSBYRlNfRElGTEFHMl9EQVg7CisKKwkJCWlwLT5pX2QuZGlfZmxhZ3MyIHw9IGRpX2ZsYWdzMjsKIAkJfQogCQkvKiBGQUxMVEhST1VHSCAqLwogCWNhc2UgU19JRkxOSzoKQEAgLTIzNjYsMTEgKzIzNjgsMjQgQEAKIAkJCSAqIGFscmVhZHkgbWFya2VkIHN0YWxlLiBJZiB3ZSBjYW4ndCBsb2NrIGl0LCBiYWNrIG9mZgogCQkJICogYW5kIHJldHJ5LgogCQkJICovCi0JCQlpZiAoaXAgIT0gZnJlZV9pcCAmJgotCQkJICAgICF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKLQkJCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCQlkZWxheSgxKTsKLQkJCQlnb3RvIHJldHJ5OworCQkJaWYgKGlwICE9IGZyZWVfaXApIHsKKwkJCQlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19FWENMKSkgeworCQkJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCQkJZGVsYXkoMSk7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBDaGVjayB0aGUgaW5vZGUgbnVtYmVyIGFnYWluIGluIGNhc2Ugd2UncmUKKwkJCQkgKiByYWNpbmcgd2l0aCBmcmVlaW5nIGluIHhmc19yZWNsYWltX2lub2RlKCkuCisJCQkJICogU2VlIHRoZSBjb21tZW50cyBpbiB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlCisJCQkJICogaW5mb3JtYXRpb24gYXMgdG8gd2h5IHRoZSBpbml0aWFsIGNoZWNrIGlzCisJCQkJICogbm90IHN1ZmZpY2llbnQuCisJCQkJICovCisJCQkJaWYgKGlwLT5pX2lubyAhPSBpbnVtICsgaSkgeworCQkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCQljb250aW51ZTsKKwkJCQl9CiAJCQl9CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwppbmRleCBkOTBlNzgxLi45NDkxNTc0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc190cmFjZS5oIgogI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAjaW5jbHVkZSAieGZzX2xvZy5oIgogCiAKQEAgLTQ3NSw2ICs0NzYsMjMgQEAKIAkJd2FrZV91cF9iaXQoJmlwLT5pX2ZsYWdzLCBfX1hGU19JUElOTkVEX0JJVCk7CiB9CiAKKy8qCisgKiBDYWxsYmFjayB1c2VkIHRvIG1hcmsgYSBidWZmZXIgd2l0aCBYRlNfTElfRkFJTEVEIHdoZW4gaXRlbXMgaW4gdGhlIGJ1ZmZlcgorICogaGF2ZSBiZWVuIGZhaWxlZCBkdXJpbmcgd3JpdGViYWNrCisgKgorICogVGhpcyBpbmZvcm1zIHRoZSBBSUwgdGhhdCB0aGUgaW5vZGUgaXMgYWxyZWFkeSBmbHVzaCBsb2NrZWQgb24gdGhlIG5leHQgcHVzaCwKKyAqIGFuZCBhY3F1aXJlcyBhIGhvbGQgb24gdGhlIGJ1ZmZlciB0byBlbnN1cmUgdGhhdCBpdCBpc24ndCByZWNsYWltZWQgYmVmb3JlCisgKiBkaXJ0eSBkYXRhIG1ha2VzIGl0IHRvIGRpc2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9lcnJvcigKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlBU1NFUlQoeGZzX2lzaWZsb2NrZWQoSU5PREVfSVRFTShsaXApLT5pbGlfaW5vZGUpKTsKKwl4ZnNfc2V0X2xpX2ZhaWxlZChsaXAsIGJwKTsKK30KKwogU1RBVElDIHVpbnQKIHhmc19pbm9kZV9pdGVtX3B1c2goCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLApAQCAtNDg0LDEzICs1MDIsMjggQEAKIHsKIAlzdHJ1Y3QgeGZzX2lub2RlX2xvZ19pdGVtICppaXAgPSBJTk9ERV9JVEVNKGxpcCk7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBpaXAtPmlsaV9pbm9kZTsKLQlzdHJ1Y3QgeGZzX2J1ZgkJKmJwID0gTlVMTDsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwID0gbGlwLT5saV9idWY7CiAJdWludAkJCXJ2YWwgPSBYRlNfSVRFTV9TVUNDRVNTOwogCWludAkJCWVycm9yOwogCiAJaWYgKHhmc19pcGluY291bnQoaXApID4gMCkKIAkJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKIAorCS8qCisJICogVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoaXMgaXRlbSBmYWlsZWQgdG8gYmUgd3JpdHRlbiBiYWNrCisJICogcHJldmlvdXNseS4gUmVzdWJtaXQgdGhlIGJ1ZmZlciBmb3IgSU8uCisJICovCisJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfRkFJTEVEKSB7CisJCWlmICgheGZzX2J1Zl90cnlsb2NrKGJwKSkKKwkJCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7CisKKwkJaWYgKCF4ZnNfYnVmX3Jlc3VibWl0X2ZhaWxlZF9idWZmZXJzKGJwLCBsaXAsIGJ1ZmZlcl9saXN0KSkKKwkJCXJ2YWwgPSBYRlNfSVRFTV9GTFVTSElORzsKKworCQl4ZnNfYnVmX3VubG9jayhicCk7CisJCXJldHVybiBydmFsOworCX0KKwogCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX1NIQVJFRCkpCiAJCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7CiAKQEAgLTYyMiw3ICs2NTUsOCBAQAogCS5pb3BfdW5sb2NrCT0geGZzX2lub2RlX2l0ZW1fdW5sb2NrLAogCS5pb3BfY29tbWl0dGVkCT0geGZzX2lub2RlX2l0ZW1fY29tbWl0dGVkLAogCS5pb3BfcHVzaAk9IHhmc19pbm9kZV9pdGVtX3B1c2gsCi0JLmlvcF9jb21taXR0aW5nID0geGZzX2lub2RlX2l0ZW1fY29tbWl0dGluZworCS5pb3BfY29tbWl0dGluZyA9IHhmc19pbm9kZV9pdGVtX2NvbW1pdHRpbmcsCisJLmlvcF9lcnJvcgk9IHhmc19pbm9kZV9pdGVtX2Vycm9yCiB9OwogCiAKQEAgLTcxMCw3ICs3NDQsOCBAQAogCQkgKiB0aGUgQUlMIGxvY2suCiAJCSAqLwogCQlpaXAgPSBJTk9ERV9JVEVNKGJsaXApOwotCQlpZiAoaWlwLT5pbGlfbG9nZ2VkICYmIGJsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pCisJCWlmICgoaWlwLT5pbGlfbG9nZ2VkICYmIGJsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHx8CisJCSAgICBsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0ZBSUxFRCkKIAkJCW5lZWRfYWlsKys7CiAKIAkJYmxpcCA9IG5leHQ7CkBAIC03MTgsNyArNzUzLDggQEAKIAogCS8qIG1ha2Ugc3VyZSB3ZSBjYXB0dXJlIHRoZSBzdGF0ZSBvZiB0aGUgaW5pdGlhbCBpbm9kZS4gKi8KIAlpaXAgPSBJTk9ERV9JVEVNKGxpcCk7Ci0JaWYgKGlpcC0+aWxpX2xvZ2dlZCAmJiBsaXAtPmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pCisJaWYgKChpaXAtPmlsaV9sb2dnZWQgJiYgbGlwLT5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB8fAorCSAgICBsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0ZBSUxFRCkKIAkJbmVlZF9haWwrKzsKIAogCS8qCkBAIC03MzEsMjIgKzc2NywzMCBAQAogCSAqIGhvbGRpbmcgdGhlIGxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBpbm9kZSBmcm9tIHRoZSBBSUwuCiAJICovCiAJaWYgKG5lZWRfYWlsKSB7Ci0JCXN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxvZ19pdGVtc1tuZWVkX2FpbF07Ci0JCWludCBpID0gMDsKKwkJYm9vbAkJCW1saXBfY2hhbmdlZCA9IGZhbHNlOworCisJCS8qIHRoaXMgaXMgYW4gb3BlbmNvZGVkIGJhdGNoIHZlcnNpb24gb2YgeGZzX3RyYW5zX2FpbF9kZWxldGUgKi8KIAkJc3Bpbl9sb2NrKCZhaWxwLT54YV9sb2NrKTsKIAkJZm9yIChibGlwID0gbGlwOyBibGlwOyBibGlwID0gYmxpcC0+bGlfYmlvX2xpc3QpIHsKLQkJCWlpcCA9IElOT0RFX0lURU0oYmxpcCk7Ci0JCQlpZiAoaWlwLT5pbGlfbG9nZ2VkICYmCi0JCQkgICAgYmxpcC0+bGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikgewotCQkJCWxvZ19pdGVtc1tpKytdID0gYmxpcDsKKwkJCWlmIChJTk9ERV9JVEVNKGJsaXApLT5pbGlfbG9nZ2VkICYmCisJCQkgICAgYmxpcC0+bGlfbHNuID09IElOT0RFX0lURU0oYmxpcCktPmlsaV9mbHVzaF9sc24pCisJCQkJbWxpcF9jaGFuZ2VkIHw9IHhmc19haWxfZGVsZXRlX29uZShhaWxwLCBibGlwKTsKKwkJCWVsc2UgeworCQkJCXhmc19jbGVhcl9saV9mYWlsZWQoYmxpcCk7CiAJCQl9Ci0JCQlBU1NFUlQoaSA8PSBuZWVkX2FpbCk7CiAJCX0KLQkJLyogeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsaygpIGRyb3BzIHRoZSBBSUwgbG9jay4gKi8KLQkJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhhaWxwLCBsb2dfaXRlbXMsIGksCi0JCQkJCSAgU0hVVERPV05fQ09SUlVQVF9JTkNPUkUpOwotCX0KIAorCQlpZiAobWxpcF9jaGFuZ2VkKSB7CisJCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04oYWlscC0+eGFfbW91bnQpKQorCQkJCXhsb2dfYXNzaWduX3RhaWxfbHNuX2xvY2tlZChhaWxwLT54YV9tb3VudCk7CisJCQlpZiAobGlzdF9lbXB0eSgmYWlscC0+eGFfYWlsKSkKKwkJCQl3YWtlX3VwX2FsbCgmYWlscC0+eGFfZW1wdHkpOworCQl9CisJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKKworCQlpZiAobWxpcF9jaGFuZ2VkKQorCQkJeGZzX2xvZ19zcGFjZV93YWtlKGFpbHAtPnhhX21vdW50KTsKKwl9CiAKIAkvKgogCSAqIGNsZWFuIHVwIGFuZCB1bmxvY2sgdGhlIGZsdXNoIGxvY2sgbm93IHdlIGFyZSBkb25lLiBXZSBjYW4gY2xlYXIgdGhlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvY3RsLmMgYi9mcy94ZnMveGZzX2lvY3RsLmMKaW5kZXggNzNjZmM3MS4uYmNlMmUyNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb2N0bC5jCisrKyBiL2ZzL3hmcy94ZnNfaW9jdGwuYwpAQCAtOTI4LDE2ICs5MjgsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDIHZvaWQKLXhmc19zZXRfZGlmbGFncygKK1NUQVRJQyB1aW50MTZfdAoreGZzX2ZsYWdzMmRpZmxhZ3MoCiAJc3RydWN0IHhmc19pbm9kZQkqaXAsCiAJdW5zaWduZWQgaW50CQl4ZmxhZ3MpCiB7Ci0JdW5zaWduZWQgaW50CQlkaV9mbGFnczsKLQl1aW50NjRfdAkJZGlfZmxhZ3MyOwotCiAJLyogY2FuJ3Qgc2V0IFBSRUFMTE9DIHRoaXMgd2F5LCBqdXN0IHByZXNlcnZlIGl0ICovCi0JZGlfZmxhZ3MgPSAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpOworCXVpbnQxNl90CQlkaV9mbGFncyA9CisJCShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19QUkVBTExPQyk7CisKIAlpZiAoeGZsYWdzICYgRlNfWEZMQUdfSU1NVVRBQkxFKQogCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0lNTVVUQUJMRTsKIAlpZiAoeGZsYWdzICYgRlNfWEZMQUdfQVBQRU5EKQpAQCAtOTY3LDE5ICs5NjYsMjQgQEAKIAkJaWYgKHhmbGFncyAmIEZTX1hGTEFHX0VYVFNJWkUpCiAJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0VYVFNJWkU7CiAJfQotCWlwLT5pX2QuZGlfZmxhZ3MgPSBkaV9mbGFnczsKIAotCS8qIGRpZmxhZ3MyIG9ubHkgdmFsaWQgZm9yIHYzIGlub2Rlcy4gKi8KLQlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uIDwgMykKLQkJcmV0dXJuOworCXJldHVybiBkaV9mbGFnczsKK30KIAotCWRpX2ZsYWdzMiA9IChpcC0+aV9kLmRpX2ZsYWdzMiAmIFhGU19ESUZMQUcyX1JFRkxJTkspOworU1RBVElDIHVpbnQ2NF90Cit4ZnNfZmxhZ3MyZGlmbGFnczIoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJdW5zaWduZWQgaW50CQl4ZmxhZ3MpCit7CisJdWludDY0X3QJCWRpX2ZsYWdzMiA9CisJCShpcC0+aV9kLmRpX2ZsYWdzMiAmIFhGU19ESUZMQUcyX1JFRkxJTkspOworCiAJaWYgKHhmbGFncyAmIEZTX1hGTEFHX0RBWCkKIAkJZGlfZmxhZ3MyIHw9IFhGU19ESUZMQUcyX0RBWDsKIAlpZiAoeGZsYWdzICYgRlNfWEZMQUdfQ09XRVhUU0laRSkKIAkJZGlfZmxhZ3MyIHw9IFhGU19ESUZMQUcyX0NPV0VYVFNJWkU7CiAKLQlpcC0+aV9kLmRpX2ZsYWdzMiA9IGRpX2ZsYWdzMjsKKwlyZXR1cm4gZGlfZmxhZ3MyOwogfQogCiBTVEFUSUMgdm9pZApAQCAtMTAwNSwxMSArMTAwOSwxMiBAQAogCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CiAJZWxzZQogCQlpbm9kZS0+aV9mbGFncyAmPSB+U19OT0FUSU1FOworI2lmIDAJLyogZGlzYWJsZWQgdW50aWwgdGhlIGZsYWcgc3dpdGNoaW5nIHJhY2VzIGFyZSBzb3J0ZWQgb3V0ICovCiAJaWYgKHhmbGFncyAmIEZTX1hGTEFHX0RBWCkKIAkJaW5vZGUtPmlfZmxhZ3MgfD0gU19EQVg7CiAJZWxzZQogCQlpbm9kZS0+aV9mbGFncyAmPSB+U19EQVg7Ci0KKyNlbmRpZgogfQogCiBzdGF0aWMgaW50CkBAIC0xMDE5LDYgKzEwMjQsNyBAQAogCXN0cnVjdCBmc3hhdHRyCQkqZmEpCiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl1aW50NjRfdAkJZGlfZmxhZ3MyOwogCiAJLyogQ2FuJ3QgY2hhbmdlIHJlYWx0aW1lIGZsYWcgaWYgYW55IGV4dGVudHMgYXJlIGFsbG9jYXRlZC4gKi8KIAlpZiAoKGlwLT5pX2QuZGlfbmV4dGVudHMgfHwgaXAtPmlfZGVsYXllZF9ibGtzKSAmJgpAQCAtMTA0OSw3ICsxMDU1LDE0IEBACiAJICAgICFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JeGZzX3NldF9kaWZsYWdzKGlwLCBmYS0+ZnN4X3hmbGFncyk7CisJLyogZGlmbGFnczIgb25seSB2YWxpZCBmb3IgdjMgaW5vZGVzLiAqLworCWRpX2ZsYWdzMiA9IHhmc19mbGFnczJkaWZsYWdzMihpcCwgZmEtPmZzeF94ZmxhZ3MpOworCWlmIChkaV9mbGFnczIgJiYgaXAtPmlfZC5kaV92ZXJzaW9uIDwgMykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpcC0+aV9kLmRpX2ZsYWdzID0geGZzX2ZsYWdzMmRpZmxhZ3MoaXAsIGZhLT5mc3hfeGZsYWdzKTsKKwlpcC0+aV9kLmRpX2ZsYWdzMiA9IGRpX2ZsYWdzMjsKKwogCXhmc19kaWZsYWdzX3RvX2xpbnV4KGlwKTsKIAl4ZnNfdHJhbnNfaWNoZ3RpbWUodHAsIGlwLCBYRlNfSUNIR1RJTUVfQ0hHKTsKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvcHMuYyBiL2ZzL3hmcy94ZnNfaW9wcy5jCmluZGV4IGExMjQ3YzMuLjViODFmN2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfaW9wcy5jCkBAIC04MDIsNyArODAyLDcgQEAKICAqIENhdXRpb246IFRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwogICogc2V0YXR0cl9wcmVwYXJlKCkgb3Igb3RoZXJ3aXNlIHZlcmlmeWluZyB0aGUgY2hhbmdlIGlzIGZpbmUuCiAgKi8KLWludAorU1RBVElDIGludAogeGZzX3NldGF0dHJfc2l6ZSgKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAlzdHJ1Y3QgaWF0dHIJCSppYXR0cikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbGludXguaCBiL2ZzL3hmcy94ZnNfbGludXguaAppbmRleCAxNDU1YjI1MjAuLjNlYmVkMTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbGludXguaAorKysgYi9mcy94ZnMveGZzX2xpbnV4LmgKQEAgLTM2Myw3ICszNjMsMTQgQEAKICNlbmRpZiAvKiBERUJVRyAqLwogCiAjaWZkZWYgQ09ORklHX1hGU19SVAotI2RlZmluZSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApICgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKQorCisvKgorICogbWFrZSBzdXJlIHdlIGlnbm9yZSB0aGUgaW5vZGUgZmxhZyBpZiB0aGUgZmlsZXN5c3RlbSBkb2Vzbid0IGhhdmUgYQorICogY29uZmlndXJlZCByZWFsdGltZSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKQkJCVwKKwkoKChpcCktPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICYmCVwKKwkgKGlwKS0+aV9tb3VudC0+bV9ydGRldl90YXJncCkKICNlbHNlCiAjZGVmaW5lIFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgKDApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nLmMgYi9mcy94ZnMveGZzX2xvZy5jCmluZGV4IGI1N2FiMzQuLjMzYzlhM2EgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nLmMKKysrIGIvZnMveGZzL3hmc19sb2cuYwpAQCAtNzQzLDE1ICs3NDMsNDUgQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCkKIHsKIAlpbnQJZXJyb3IgPSAwOworCWJvb2wJcmVhZG9ubHkgPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKTsKIAogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSB7CiAJCUFTU0VSVChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpOwogCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHJlYWRvbmx5KSB7CisJCS8qIEFsbG93IHVubGlua2VkIHByb2Nlc3NpbmcgdG8gcHJvY2VlZCAqLworCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX1JET05MWTsKIAl9CiAKKwkvKgorCSAqIER1cmluZyB0aGUgc2Vjb25kIHBoYXNlIG9mIGxvZyByZWNvdmVyeSwgd2UgbmVlZCBpZ2V0IGFuZAorCSAqIGlwdXQgdG8gYmVoYXZlIGxpa2UgdGhleSBkbyBmb3IgYW4gYWN0aXZlIGZpbGVzeXN0ZW0uCisJICogeGZzX2ZzX2Ryb3BfaW5vZGUgbmVlZHMgdG8gYmUgYWJsZSB0byBwcmV2ZW50IHRoZSBkZWxldGlvbgorCSAqIG9mIGlub2RlcyBiZWZvcmUgd2UncmUgZG9uZSByZXBsYXlpbmcgbG9nIGl0ZW1zIG9uIHRob3NlCisJICogaW5vZGVzLiAgVHVybiBpdCBvZmYgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVjb3ZlcnkgZmluaXNoZXMKKwkgKiBzbyB0aGF0IHdlIGRvbid0IGxlYWsgdGhlIHF1b3RhIGlub2RlcyBpZiBzdWJzZXF1ZW50IG1vdW50CisJICogYWN0aXZpdGllcyBmYWlsLgorCSAqCisJICogV2UgbGV0IGFsbCBpbm9kZXMgaW52b2x2ZWQgaW4gcmVkbyBpdGVtIHByb2Nlc3NpbmcgZW5kIHVwIG9uCisJICogdGhlIExSVSBpbnN0ZWFkIG9mIGJlaW5nIGV2aWN0ZWQgaW1tZWRpYXRlbHkgc28gdGhhdCBpZiB3ZSBkbworCSAqIHNvbWV0aGluZyB0byBhbiB1bmxpbmtlZCBpbm9kZSwgdGhlIGlyZWxlIHdvbid0IGNhdXNlCisJICogcHJlbWF0dXJlIHRydW5jYXRpb24gYW5kIGZyZWVpbmcgb2YgdGhlIGlub2RlLCB3aGljaCByZXN1bHRzCisJICogaW4gbG9nIHJlY292ZXJ5IGZhaWx1cmUuICBXZSBoYXZlIHRvIGV2aWN0IHRoZSB1bnJlZmVyZW5jZWQKKwkgKiBscnUgaW5vZGVzIGFmdGVyIGNsZWFyaW5nIE1TX0FDVElWRSBiZWNhdXNlIHdlIGRvbid0CisJICogb3RoZXJ3aXNlIGNsZWFuIHVwIHRoZSBscnUgaWYgdGhlcmUncyBhIHN1YnNlcXVlbnQgZmFpbHVyZSBpbgorCSAqIHhmc19tb3VudGZzLCB3aGljaCBsZWFkcyB0byB1cyBsZWFraW5nIHRoZSBpbm9kZXMgaWYgbm90aGluZworCSAqIGVsc2UgKGUuZy4gcXVvdGFjaGVjaykgcmVmZXJlbmNlcyB0aGUgaW5vZGVzIGJlZm9yZSB0aGUKKwkgKiBtb3VudCBmYWlsdXJlIG9jY3Vycy4KKwkgKi8KKwltcC0+bV9zdXBlci0+c19mbGFncyB8PSBNU19BQ1RJVkU7CiAJZXJyb3IgPSB4bG9nX3JlY292ZXJfZmluaXNoKG1wLT5tX2xvZyk7CiAJaWYgKCFlcnJvcikKIAkJeGZzX2xvZ193b3JrX3F1ZXVlKG1wKTsKKwltcC0+bV9zdXBlci0+c19mbGFncyAmPSB+TVNfQUNUSVZFOworCWV2aWN0X2lub2RlcyhtcC0+bV9zdXBlcik7CisKKwlpZiAocmVhZG9ubHkpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9SRE9OTFk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC04MDEsMTEgKzgzMSwxNCBAQAogCWludAkJIGVycm9yOwogCiAJLyoKLQkgKiBEb24ndCB3cml0ZSBvdXQgdW5tb3VudCByZWNvcmQgb24gcmVhZC1vbmx5IG1vdW50cy4KKwkgKiBEb24ndCB3cml0ZSBvdXQgdW5tb3VudCByZWNvcmQgb24gbm9yZWNvdmVyeSBtb3VudHMgb3Igcm8gZGV2aWNlcy4KIAkgKiBPciwgaWYgd2UgYXJlIGRvaW5nIGEgZm9yY2VkIHVtb3VudCAodHlwaWNhbGx5IGJlY2F1c2Ugb2YgSU8gZXJyb3JzKS4KIAkgKi8KLQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKQorCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZIHx8CisJICAgIHhmc19yZWFkb25seV9idWZ0YXJnKGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3ApKSB7CisJCUFTU0VSVChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpOwogCQlyZXR1cm4gMDsKKwl9CiAKIAllcnJvciA9IF94ZnNfbG9nX2ZvcmNlKG1wLCBYRlNfTE9HX1NZTkMsIE5VTEwpOwogCUFTU0VSVChlcnJvciB8fCAhKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpKTsKQEAgLTMzMDQsOCArMzMzNyw2IEBACiAJCSAqLwogCQlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKQogCQkJcmV0dXJuIC1FSU87Ci0JCWlmIChsb2dfZmx1c2hlZCkKLQkJCSpsb2dfZmx1c2hlZCA9IDE7CiAJfSBlbHNlIHsKIAogbm9fc2xlZXA6CkBAIC0zNDA5LDggKzM0NDAsNiBAQAogCiAJCQkJeGxvZ193YWl0KCZpY2xvZy0+aWNfcHJldi0+aWNfd3JpdGVfd2FpdCwKIAkJCQkJCQkmbG9nLT5sX2ljbG9nbG9jayk7Ci0JCQkJaWYgKGxvZ19mbHVzaGVkKQotCQkJCQkqbG9nX2ZsdXNoZWQgPSAxOwogCQkJCWFscmVhZHlfc2xlcHQgPSAxOwogCQkJCWdvdG8gdHJ5X2FnYWluOwogCQkJfQpAQCAtMzQ0NCw5ICszNDczLDYgQEAKIAkJCSAqLwogCQkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikKIAkJCQlyZXR1cm4gLUVJTzsKLQotCQkJaWYgKGxvZ19mbHVzaGVkKQotCQkJCSpsb2dfZmx1c2hlZCA9IDE7CiAJCX0gZWxzZSB7CQkvKiBqdXN0IHJldHVybiAqLwogCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKaW5kZXggOWIzZDdjNy4uMDU5MDkyNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwpAQCAtMTAyOSw2MSArMTAyOSwxMDYgQEAKIH0KIAogLyoKLSAqIENoZWNrIHRoZSBsb2cgdGFpbCBmb3IgdG9ybiB3cml0ZXMuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiB0b3JuIHdyaXRlcyBhcmUKLSAqIGRldGVjdGVkIGF0IHRoZSBoZWFkIGFuZCB0aGUgaGVhZCBoYWQgdG8gYmUgd2Fsa2VkIGJhY2sgdG8gYSBwcmV2aW91cyByZWNvcmQuCi0gKiBUaGUgdGFpbCBvZiB0aGUgcHJldmlvdXMgcmVjb3JkIG11c3Qgbm93IGJlIHZlcmlmaWVkIHRvIGVuc3VyZSB0aGUgdG9ybgotICogd3JpdGVzIGRpZG4ndCBjb3JydXB0IHRoZSBwcmV2aW91cyB0YWlsLgorICogQ2FsY3VsYXRlIGRpc3RhbmNlIGZyb20gaGVhZCB0byB0YWlsIChpLmUuLCB1bnVzZWQgc3BhY2UgaW4gdGhlIGxvZykuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit4bG9nX3RhaWxfZGlzdGFuY2UoCisJc3RydWN0IHhsb2cJKmxvZywKKwl4ZnNfZGFkZHJfdAloZWFkX2JsaywKKwl4ZnNfZGFkZHJfdAl0YWlsX2JsaykKK3sKKwlpZiAoaGVhZF9ibGsgPCB0YWlsX2JsaykKKwkJcmV0dXJuIHRhaWxfYmxrIC0gaGVhZF9ibGs7CisKKwlyZXR1cm4gdGFpbF9ibGsgKyAobG9nLT5sX2xvZ0JCc2l6ZSAtIGhlYWRfYmxrKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGUgbG9nIHRhaWwuIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuIHRvcm4gb3IgaW5jb21wbGV0ZQorICogd3JpdGVzIGhhdmUgYmVlbiBkZXRlY3RlZCBuZWFyIHRoZSBmcm9udCBvZiB0aGUgbG9nIGFuZCB0aGUgaGVhZCBoYXMgYmVlbgorICogd2Fsa2VkIGJhY2sgYWNjb3JkaW5nbHkuCiAgKgotICogUmV0dXJuIGFuIGVycm9yIGlmIENSQyB2ZXJpZmljYXRpb24gZmFpbHMgYXMgcmVjb3ZlcnkgY2Fubm90IHByb2NlZWQuCisgKiBXZSBhbHNvIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB0YWlsIHdhcyBwaW5uZWQgYW5kIHRoZSBoZWFkCisgKiBibG9ja2VkIGJlaGluZCB0aGUgdGFpbCByaWdodCBiZWZvcmUgYSBjcmFzaC4gSWYgdGhlIHRhaWwgaGFkIGJlZW4gcHVzaGVkCisgKiBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgY3Jhc2ggYW5kIHRoZSBzdWJzZXF1ZW50IGNoZWNrcG9pbnQgd2FzIG9ubHkKKyAqIHBhcnRpYWxseSB3cml0dGVuLCBpdCdzIHBvc3NpYmxlIGl0IG92ZXJ3cm90ZSB0aGUgbGFzdCByZWZlcmVuY2VkIHRhaWwgaW4gdGhlCisgKiBsb2cgd2l0aCBnYXJiYWdlLiBUaGlzIGlzIG5vdCBhIGNvaGVyZW5jeSBwcm9ibGVtIGJlY2F1c2UgdGhlIHRhaWwgbXVzdCBoYXZlCisgKiBiZWVuIHB1c2hlZCBiZWZvcmUgaXQgY2FuIGJlIG92ZXJ3cml0dGVuLCBidXQgYXBwZWFycyBhcyBsb2cgY29ycnVwdGlvbiB0bworICogcmVjb3ZlcnkgYmVjYXVzZSB3ZSBoYXZlIG5vIHdheSB0byBrbm93IHRoZSB0YWlsIHdhcyB1cGRhdGVkIGlmIHRoZQorICogc3Vic2VxdWVudCBjaGVja3BvaW50IGRpZG4ndCB3cml0ZSBzdWNjZXNzZnVsbHkuCisgKgorICogVGhlcmVmb3JlLCBDUkMgY2hlY2sgdGhlIGxvZyBmcm9tIHRhaWwgdG8gaGVhZC4gSWYgYSBmYWlsdXJlIG9jY3VycyBhbmQgdGhlCisgKiBvZmZlbmRpbmcgcmVjb3JkIGlzIHdpdGhpbiBtYXggaWNsb2cgYnVmcyBmcm9tIHRoZSBoZWFkLCB3YWxrIHRoZSB0YWlsCisgKiBmb3J3YXJkIGFuZCByZXRyeSB1bnRpbCBhIHZhbGlkIHRhaWwgaXMgZm91bmQgb3IgY29ycnVwdGlvbiBpcyBkZXRlY3RlZCBvdXQKKyAqIG9mIHRoZSByYW5nZSBvZiBhIHBvc3NpYmxlIG92ZXJ3cml0ZS4KICAqLwogU1RBVElDIGludAogeGxvZ192ZXJpZnlfdGFpbCgKIAlzdHJ1Y3QgeGxvZwkJKmxvZywKIAl4ZnNfZGFkZHJfdAkJaGVhZF9ibGssCi0JeGZzX2RhZGRyX3QJCXRhaWxfYmxrKQorCXhmc19kYWRkcl90CQkqdGFpbF9ibGssCisJaW50CQkJaHNpemUpCiB7CiAJc3RydWN0IHhsb2dfcmVjX2hlYWRlcgkqdGhlYWQ7CiAJc3RydWN0IHhmc19idWYJCSpicDsKIAl4ZnNfZGFkZHJfdAkJZmlyc3RfYmFkOwotCWludAkJCWNvdW50OwogCWludAkJCWVycm9yID0gMDsKIAlib29sCQkJd3JhcHBlZDsKLQl4ZnNfZGFkZHJfdAkJdG1wX2hlYWQ7CisJeGZzX2RhZGRyX3QJCXRtcF90YWlsOworCXhmc19kYWRkcl90CQlvcmlnX3RhaWwgPSAqdGFpbF9ibGs7CiAKIAlicCA9IHhsb2dfZ2V0X2JwKGxvZywgMSk7CiAJaWYgKCFicCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKgotCSAqIFNlZWsgWExPR19NQVhfSUNMT0dTICsgMSByZWNvcmRzIHBhc3QgdGhlIGN1cnJlbnQgdGFpbCByZWNvcmQgdG8gZ2V0Ci0JICogYSB0ZW1wb3JhcnkgaGVhZCBibG9jayB0aGF0IHBvaW50cyBhZnRlciB0aGUgbGFzdCBwb3NzaWJsZQotCSAqIGNvbmN1cnJlbnRseSB3cml0dGVuIHJlY29yZCBvZiB0aGUgdGFpbC4KKwkgKiBNYWtlIHN1cmUgdGhlIHRhaWwgcG9pbnRzIHRvIGEgcmVjb3JkIChyZXR1cm5zIHBvc2l0aXZlIGNvdW50IG9uCisJICogc3VjY2VzcykuCiAJICovCi0JY291bnQgPSB4bG9nX3NlZWtfbG9ncmVjX2hkcihsb2csIGhlYWRfYmxrLCB0YWlsX2JsaywKLQkJCQkgICAgIFhMT0dfTUFYX0lDTE9HUyArIDEsIGJwLCAmdG1wX2hlYWQsICZ0aGVhZCwKLQkJCQkgICAgICZ3cmFwcGVkKTsKLQlpZiAoY291bnQgPCAwKSB7Ci0JCWVycm9yID0gY291bnQ7CisJZXJyb3IgPSB4bG9nX3NlZWtfbG9ncmVjX2hkcihsb2csIGhlYWRfYmxrLCAqdGFpbF9ibGssIDEsIGJwLAorCQkJJnRtcF90YWlsLCAmdGhlYWQsICZ3cmFwcGVkKTsKKwlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKKwlpZiAoKnRhaWxfYmxrICE9IHRtcF90YWlsKQorCQkqdGFpbF9ibGsgPSB0bXBfdGFpbDsKKworCS8qCisJICogUnVuIGEgQ1JDIGNoZWNrIGZyb20gdGhlIHRhaWwgdG8gdGhlIGhlYWQuIFdlIGNhbid0IGp1c3QgY2hlY2sKKwkgKiBNQVhfSUNMT0dTIHJlY29yZHMgcGFzdCB0aGUgdGFpbCBiZWNhdXNlIHRoZSB0YWlsIG1heSBwb2ludCB0byBzdGFsZQorCSAqIGJsb2NrcyBjbGVhcmVkIGR1cmluZyB0aGUgc2VhcmNoIGZvciB0aGUgaGVhZC90YWlsLiBUaGVzZSBibG9ja3MgYXJlCisJICogb3ZlcndyaXR0ZW4gd2l0aCB6ZXJvLWxlbmd0aCByZWNvcmRzIGFuZCB0aHVzIHJlY29yZCBjb3VudCBpcyBub3QgYQorCSAqIHJlbGlhYmxlIGluZGljYXRvciBvZiB0aGUgaWNsb2cgc3RhdGUgYmVmb3JlIGEgY3Jhc2guCisJICovCisJZmlyc3RfYmFkID0gMDsKKwllcnJvciA9IHhsb2dfZG9fcmVjb3ZlcnlfcGFzcyhsb2csIGhlYWRfYmxrLCAqdGFpbF9ibGssCisJCQkJICAgICAgWExPR19SRUNPVkVSX0NSQ1BBU1MsICZmaXJzdF9iYWQpOworCXdoaWxlICgoZXJyb3IgPT0gLUVGU0JBRENSQyB8fCBlcnJvciA9PSAtRUZTQ09SUlVQVEVEKSAmJiBmaXJzdF9iYWQpIHsKKwkJaW50CXRhaWxfZGlzdGFuY2U7CisKKwkJLyoKKwkJICogSXMgY29ycnVwdGlvbiB3aXRoaW4gcmFuZ2Ugb2YgdGhlIGhlYWQ/IElmIHNvLCByZXRyeSBmcm9tCisJCSAqIHRoZSBuZXh0IHJlY29yZC4gT3RoZXJ3aXNlIHJldHVybiBhbiBlcnJvci4KKwkJICovCisJCXRhaWxfZGlzdGFuY2UgPSB4bG9nX3RhaWxfZGlzdGFuY2UobG9nLCBoZWFkX2JsaywgZmlyc3RfYmFkKTsKKwkJaWYgKHRhaWxfZGlzdGFuY2UgPiBCVE9CQihYTE9HX01BWF9JQ0xPR1MgKiBoc2l6ZSkpCisJCQlicmVhazsKKworCQkvKiBza2lwIHRvIHRoZSBuZXh0IHJlY29yZDsgcmV0dXJucyBwb3NpdGl2ZSBjb3VudCBvbiBzdWNjZXNzICovCisJCWVycm9yID0geGxvZ19zZWVrX2xvZ3JlY19oZHIobG9nLCBoZWFkX2JsaywgZmlyc3RfYmFkLCAyLCBicCwKKwkJCQkmdG1wX3RhaWwsICZ0aGVhZCwgJndyYXBwZWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJKnRhaWxfYmxrID0gdG1wX3RhaWw7CisJCWZpcnN0X2JhZCA9IDA7CisJCWVycm9yID0geGxvZ19kb19yZWNvdmVyeV9wYXNzKGxvZywgaGVhZF9ibGssICp0YWlsX2JsaywKKwkJCQkJICAgICAgWExPR19SRUNPVkVSX0NSQ1BBU1MsICZmaXJzdF9iYWQpOwogCX0KIAotCS8qCi0JICogSWYgdGhlIGNhbGwgYWJvdmUgZGlkbid0IGZpbmQgWExPR19NQVhfSUNMT0dTICsgMSByZWNvcmRzLCB3ZSByYW4KLQkgKiBpbnRvIHRoZSBhY3R1YWwgbG9nIGhlYWQuIHRtcF9oZWFkIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIHJlY29yZAotCSAqIHNvIHVwZGF0ZSBpdCB0byB0aGUgYWN0dWFsIGhlYWQgYmxvY2suCi0JICovCi0JaWYgKGNvdW50IDwgWExPR19NQVhfSUNMT0dTICsgMSkKLQkJdG1wX2hlYWQgPSBoZWFkX2JsazsKLQotCS8qCi0JICogV2Ugbm93IGhhdmUgYSB0YWlsIGFuZCB0ZW1wb3JhcnkgaGVhZCBibG9jayB0aGF0IGNvdmVycyBhdCBsZWFzdAotCSAqIFhMT0dfTUFYX0lDTE9HUyByZWNvcmRzIGZyb20gdGhlIHRhaWwuIFdlIG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhlc2UKLQkgKiByZWNvcmRzIHdlcmUgY29tcGxldGVseSB3cml0dGVuLiBSdW4gYSBDUkMgdmVyaWZpY2F0aW9uIHBhc3MgZnJvbQotCSAqIHRhaWwgdG8gaGVhZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JZXJyb3IgPSB4bG9nX2RvX3JlY292ZXJ5X3Bhc3MobG9nLCB0bXBfaGVhZCwgdGFpbF9ibGssCi0JCQkJICAgICAgWExPR19SRUNPVkVSX0NSQ1BBU1MsICZmaXJzdF9iYWQpOwotCisJaWYgKCFlcnJvciAmJiAqdGFpbF9ibGsgIT0gb3JpZ190YWlsKQorCQl4ZnNfd2Fybihsb2ctPmxfbXAsCisJCSJUYWlsIGJsb2NrICgweCVsbHgpIG92ZXJ3cml0ZSBkZXRlY3RlZC4gVXBkYXRlZCB0byAweCVsbHgiLAorCQkJIG9yaWdfdGFpbCwgKnRhaWxfYmxrKTsKIG91dDoKIAl4bG9nX3B1dF9icChicCk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTE0Myw3ICsxMTg4LDcgQEAKIAkgKi8KIAllcnJvciA9IHhsb2dfZG9fcmVjb3ZlcnlfcGFzcyhsb2csICpoZWFkX2JsaywgdG1wX3JoZWFkX2JsaywKIAkJCQkgICAgICBYTE9HX1JFQ09WRVJfQ1JDUEFTUywgJmZpcnN0X2JhZCk7Ci0JaWYgKGVycm9yID09IC1FRlNCQURDUkMpIHsKKwlpZiAoKGVycm9yID09IC1FRlNCQURDUkMgfHwgZXJyb3IgPT0gLUVGU0NPUlJVUFRFRCkgJiYgZmlyc3RfYmFkKSB7CiAJCS8qCiAJCSAqIFdlJ3ZlIGhpdCBhIHBvdGVudGlhbCB0b3JuIHdyaXRlLiBSZXNldCB0aGUgZXJyb3IgYW5kIHdhcm4KIAkJICogYWJvdXQgaXQuCkBAIC0xMTgzLDMxICsxMjI4LDEyIEBACiAJCQlBU1NFUlQoMCk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCi0JCS8qCi0JCSAqIE5vdyB2ZXJpZnkgdGhlIHRhaWwgYmFzZWQgb24gdGhlIHVwZGF0ZWQgaGVhZC4gVGhpcyBpcwotCQkgKiByZXF1aXJlZCBiZWNhdXNlIHRoZSB0b3JuIHdyaXRlcyB0cmltbWVkIGZyb20gdGhlIGhlYWQgY291bGQKLQkJICogaGF2ZSBiZWVuIHdyaXR0ZW4gb3ZlciB0aGUgdGFpbCBvZiBhIHByZXZpb3VzIHJlY29yZC4gUmV0dXJuCi0JCSAqIGFueSBlcnJvcnMgc2luY2UgcmVjb3ZlcnkgY2Fubm90IHByb2NlZWQgaWYgdGhlIHRhaWwgaXMKLQkJICogY29ycnVwdC4KLQkJICoKLQkJICogWFhYOiBUaGlzIGxlYXZlcyBhIGdhcCBpbiB0cnVseSByb2J1c3QgcHJvdGVjdGlvbiBmcm9tIHRvcm4KLQkJICogd3JpdGVzIGluIHRoZSBsb2cuIElmIHRoZSBoZWFkIGlzIGJlaGluZCB0aGUgdGFpbCwgdGhlIHRhaWwKLQkJICogcHVzaGVzIGZvcndhcmQgdG8gY3JlYXRlIHNvbWUgc3BhY2UgYW5kIHRoZW4gYSBjcmFzaCBvY2N1cnMKLQkJICogY2F1c2luZyB0aGUgd3JpdGVzIGludG8gdGhlIHByZXZpb3VzIHJlY29yZCdzIHRhaWwgcmVnaW9uIHRvCi0JCSAqIHRlYXIsIGxvZyByZWNvdmVyeSBpc24ndCBhYmxlIHRvIHJlY292ZXIuCi0JCSAqCi0JCSAqIEhvdyBsaWtlbHkgaXMgdGhpcyB0byBvY2N1cj8gSWYgcG9zc2libGUsIGNhbiB3ZSBkbyBzb21ldGhpbmcKLQkJICogbW9yZSBpbnRlbGxpZ2VudCBoZXJlPyBJcyBpdCBzYWZlIHRvIHB1c2ggdGhlIHRhaWwgZm9yd2FyZCBpZgotCQkgKiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIHRhaWwgaXMgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUKLQkJICogdG9ybiB3cml0ZSAoZS5nLiwgdGhlIGtlcm5lbCBjYW4gb25seSBvdmVyd3JpdGUgdGhlIHRhaWwgaWYKLQkJICogaXQgaGFzIGFjdHVhbGx5IGJlZW4gcHVzaGVkIGZvcndhcmQpPyBBbHRlcm5hdGl2ZWx5LCBjb3VsZCB3ZQotCQkgKiBzb21laG93IHByZXZlbnQgdGhpcyBjb25kaXRpb24gYXQgcnVudGltZT8KLQkJICovCi0JCWVycm9yID0geGxvZ192ZXJpZnlfdGFpbChsb2csICpoZWFkX2JsaywgKnRhaWxfYmxrKTsKIAl9CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHhsb2dfdmVyaWZ5X3RhaWwobG9nLCAqaGVhZF9ibGssIHRhaWxfYmxrLAorCQkJCWJlMzJfdG9fY3B1KCgqcmhlYWQpLT5oX3NpemUpKTsKIH0KIAogLyoKQEAgLTQxNTIsNyArNDE3OCw3IEBACiAKIAkjZGVmaW5lIFhMT0dfUkVDT1ZFUl9DT01NSVRfUVVFVUVfTUFYIDEwMAogCi0JaGxpc3RfZGVsKCZ0cmFucy0+cl9saXN0KTsKKwlobGlzdF9kZWxfaW5pdCgmdHJhbnMtPnJfbGlzdCk7CiAKIAllcnJvciA9IHhsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpOwogCWlmIChlcnJvcikKQEAgLTQzNTQsNiArNDM4MCw4IEBACiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwgKm47CiAJaW50CQkJaTsKIAorCWhsaXN0X2RlbF9pbml0KCZ0cmFucy0+cl9saXN0KTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVtLCBuLCAmdHJhbnMtPnJfaXRlbXEsIHJpX2xpc3QpIHsKIAkJLyogRnJlZSB0aGUgcmVnaW9ucyBpbiB0aGUgaXRlbS4gKi8KIAkJbGlzdF9kZWwoJml0ZW0tPnJpX2xpc3QpOwpAQCAtNDc5OSwxMiArNDgyNywxNiBAQAogCWludAkJCWVycm9yID0gMDsKIAlzdHJ1Y3QgeGZzX2FpbF9jdXJzb3IJY3VyOwogCXN0cnVjdCB4ZnNfYWlsCQkqYWlscDsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhGU19XQVJOKQogCXhmc19sc25fdAkJbGFzdF9sc247CisjZW5kaWYKIAogCWFpbHAgPSBsb2ctPmxfYWlscDsKIAlzcGluX2xvY2soJmFpbHAtPnhhX2xvY2spOwogCWxpcCA9IHhmc190cmFuc19haWxfY3Vyc29yX2ZpcnN0KGFpbHAsICZjdXIsIDApOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWEZTX1dBUk4pCiAJbGFzdF9sc24gPSB4bG9nX2Fzc2lnbl9sc24obG9nLT5sX2N1cnJfY3ljbGUsIGxvZy0+bF9jdXJyX2Jsb2NrKTsKKyNlbmRpZgogCXdoaWxlIChsaXAgIT0gTlVMTCkgewogCQkvKgogCQkgKiBXZSdyZSBkb25lIHdoZW4gd2Ugc2VlIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIGludGVudC4KQEAgLTUyMTQsNyArNTI0Niw3IEBACiAJeGZzX2RhZGRyX3QJCSpmaXJzdF9iYWQpCS8qIG91dDogZmlyc3QgYmFkIGxvZyByZWMgKi8KIHsKIAl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQ7Ci0JeGZzX2RhZGRyX3QJCWJsa19ubzsKKwl4ZnNfZGFkZHJfdAkJYmxrX25vLCByYmxrX25vOwogCXhmc19kYWRkcl90CQlyaGVhZF9ibGs7CiAJY2hhcgkJCSpvZmZzZXQ7CiAJeGZzX2J1Zl90CQkqaGJwLCAqZGJwOwpAQCAtNTIyMiwxMSArNTI1NCwxNSBAQAogCWludAkJCWVycm9yMiA9IDA7CiAJaW50CQkJYmJsa3MsIHNwbGl0X2JibGtzOwogCWludAkJCWhibGtzLCBzcGxpdF9oYmxrcywgd3JhcHBlZF9oYmxrczsKKwlpbnQJCQlpOwogCXN0cnVjdCBobGlzdF9oZWFkCXJoYXNoW1hMT0dfUkhBU0hfU0laRV07CiAJTElTVF9IRUFECQkoYnVmZmVyX2xpc3QpOwogCiAJQVNTRVJUKGhlYWRfYmxrICE9IHRhaWxfYmxrKTsKLQlyaGVhZF9ibGsgPSAwOworCWJsa19ubyA9IHJoZWFkX2JsayA9IHRhaWxfYmxrOworCisJZm9yIChpID0gMDsgaSA8IFhMT0dfUkhBU0hfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJnJoYXNoW2ldKTsKIAogCS8qCiAJICogUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSB0YWlsIGJsb2NrIGFuZCBnZXQgdGhlIGljbG9nIGJ1ZmZlciBzaXplIGZyb20KQEAgLTUzMDEsNyArNTMzNyw2IEBACiAJfQogCiAJbWVtc2V0KHJoYXNoLCAwLCBzaXplb2Yocmhhc2gpKTsKLQlibGtfbm8gPSByaGVhZF9ibGsgPSB0YWlsX2JsazsKIAlpZiAodGFpbF9ibGsgPiBoZWFkX2JsaykgewogCQkvKgogCQkgKiBQZXJmb3JtIHJlY292ZXJ5IGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBwaHlzaWNhbCBsb2cuCkBAIC01MzYzLDkgKzUzOTgsMTkgQEAKIAkJCWJibGtzID0gKGludClCVE9CQihiZTMyX3RvX2NwdShyaGVhZC0+aF9sZW4pKTsKIAkJCWJsa19ubyArPSBoYmxrczsKIAotCQkJLyogUmVhZCBpbiBkYXRhIGZvciBsb2cgcmVjb3JkICovCi0JCQlpZiAoYmxrX25vICsgYmJsa3MgPD0gbG9nLT5sX2xvZ0JCc2l6ZSkgewotCQkJCWVycm9yID0geGxvZ19icmVhZChsb2csIGJsa19ubywgYmJsa3MsIGRicCwKKwkJCS8qCisJCQkgKiBSZWFkIHRoZSBsb2cgcmVjb3JkIGRhdGEgaW4gbXVsdGlwbGUgcmVhZHMgaWYgaXQKKwkJCSAqIHdyYXBzIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBsb2cuIE5vdGUgdGhhdCBpZiB0aGUKKwkJCSAqIGhlYWRlciBhbHJlYWR5IHdyYXBwZWQsIGJsa19ubyBjb3VsZCBwb2ludCBwYXN0IHRoZQorCQkJICogZW5kIG9mIHRoZSBsb2cuIFRoZSByZWNvcmQgZGF0YSBpcyBjb250aWd1b3VzIGluCisJCQkgKiB0aGF0IGNhc2UuCisJCQkgKi8KKwkJCWlmIChibGtfbm8gKyBiYmxrcyA8PSBsb2ctPmxfbG9nQkJzaXplIHx8CisJCQkgICAgYmxrX25vID49IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJCQkvKiBtb2QgYmxrX25vIGluIGNhc2UgdGhlIGhlYWRlciB3cmFwcGVkIGFuZAorCQkJCSAqIHB1c2hlZCBpdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgbG9nICovCisJCQkJcmJsa19ubyA9IGRvX21vZChibGtfbm8sIGxvZy0+bF9sb2dCQnNpemUpOworCQkJCWVycm9yID0geGxvZ19icmVhZChsb2csIHJibGtfbm8sIGJibGtzLCBkYnAsCiAJCQkJCQkgICAmb2Zmc2V0KTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gYnJlYWRfZXJyMjsKQEAgLTU0NjQsNiArNTUwOSwxOSBAQAogCWlmIChlcnJvciAmJiBmaXJzdF9iYWQpCiAJCSpmaXJzdF9iYWQgPSByaGVhZF9ibGs7CiAKKwkvKgorCSAqIFRyYW5zYWN0aW9ucyBhcmUgZnJlZWQgYXQgY29tbWl0IHRpbWUgYnV0IHRyYW5zYWN0aW9ucyB3aXRob3V0IGNvbW1pdAorCSAqIHJlY29yZHMgb24gZGlzayBhcmUgbmV2ZXIgY29tbWl0dGVkLiBGcmVlIGFueSB0aGF0IG1heSBiZSBsZWZ0IGluIHRoZQorCSAqIGhhc2ggdGFibGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IFhMT0dfUkhBU0hfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBobGlzdF9ub2RlCSp0bXA7CisJCXN0cnVjdCB4bG9nX3JlY292ZXIJKnRyYW5zOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRtcCwgJnJoYXNoW2ldLCByX2xpc3QpCisJCQl4bG9nX3JlY292ZXJfZnJlZV90cmFucyh0cmFucyk7CisJfQorCiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBlcnJvcjI7CiB9CiAKQEAgLTU1NDIsNiArNTYwMCw4IEBACiAJeGZzX2J1Zl90CSpicDsKIAl4ZnNfc2JfdAkqc2JwOwogCisJdHJhY2VfeGZzX2xvZ19yZWNvdmVyKGxvZywgaGVhZF9ibGssIHRhaWxfYmxrKTsKKwogCS8qCiAJICogRmlyc3QgcmVwbGF5IHRoZSBpbWFnZXMgaW4gdGhlIGxvZy4KIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuYyBiL2ZzL3hmcy94ZnNfbW91bnQuYwppbmRleCAxMzc5NmYyLi5kNGNlOGQyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmMKKysrIGIvZnMveGZzL3hmc19tb3VudC5jCkBAIC05MjUsMTUgKzkyNSw2IEBACiAJfQogCiAJLyoKLQkgKiBEdXJpbmcgdGhlIHNlY29uZCBwaGFzZSBvZiBsb2cgcmVjb3ZlcnksIHdlIG5lZWQgaWdldCBhbmQKLQkgKiBpcHV0IHRvIGJlaGF2ZSBsaWtlIHRoZXkgZG8gZm9yIGFuIGFjdGl2ZSBmaWxlc3lzdGVtLgotCSAqIHhmc19mc19kcm9wX2lub2RlIG5lZWRzIHRvIGJlIGFibGUgdG8gcHJldmVudCB0aGUgZGVsZXRpb24KLQkgKiBvZiBpbm9kZXMgYmVmb3JlIHdlJ3JlIGRvbmUgcmVwbGF5aW5nIGxvZyBpdGVtcyBvbiB0aG9zZQotCSAqIGlub2Rlcy4KLQkgKi8KLQltcC0+bV9zdXBlci0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0KLQkvKgogCSAqIEZpbmlzaCByZWNvdmVyaW5nIHRoZSBmaWxlIHN5c3RlbS4gIFRoaXMgcGFydCBuZWVkZWQgdG8gYmUgZGVsYXllZAogCSAqIHVudGlsIGFmdGVyIHRoZSByb290IGFuZCByZWFsLXRpbWUgYml0bWFwIGlub2RlcyB3ZXJlIGNvbnNpc3RlbnRseQogCSAqIHJlYWQgaW4uCkBAIC0xMDA4LDEyICs5OTksMTMgQEAKICBvdXRfcXVvdGE6CiAJeGZzX3FtX3VubW91bnRfcXVvdGFzKG1wKTsKICBvdXRfcnR1bm1vdW50OgotCW1wLT5tX3N1cGVyLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CiAJeGZzX3J0dW5tb3VudF9pbm9kZXMobXApOwogIG91dF9yZWxlX3JpcDoKIAlJUkVMRShyaXApOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbXAtPm1fcmVjbGFpbV93b3JrKTsKIAl4ZnNfcmVjbGFpbV9pbm9kZXMobXAsIFNZTkNfV0FJVCk7CisJLyogQ2xlYW4gb3V0IGRxdW90cyB0aGF0IG1pZ2h0IGJlIGluIG1lbW9yeSBhZnRlciBxdW90YWNoZWNrLiAqLworCXhmc19xbV91bm1vdW50KG1wKTsKICBvdXRfbG9nX2RlYWxsb2M6CiAJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1VOTU9VTlRJTkc7CiAJeGZzX2xvZ19tb3VudF9jYW5jZWwobXApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xbS5jIGIvZnMveGZzL3hmc19xbS5jCmluZGV4IDhiOWE5ZjEuLjFmZGQzZmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcW0uYworKysgYi9mcy94ZnMveGZzX3FtLmMKQEAgLTExMSw2ICsxMTEsOSBAQAogCQkJc2tpcHBlZCA9IDA7CiAJCQlicmVhazsKIAkJfQorCQkvKiB3ZSdyZSBkb25lIGlmIGlkIG92ZXJmbG93cyBiYWNrIHRvIHplcm8gKi8KKwkJaWYgKCFuZXh0X2luZGV4KQorCQkJYnJlYWs7CiAJfQogCiAJaWYgKHNraXBwZWQpIHsKQEAgLTEyNDcsNiArMTI1MCw3IEBACiAJc3RydWN0IHhmc19kcXVvdAkqZHFwLAogCXZvaWQJCQkqZGF0YSkKIHsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGRxcC0+cV9tb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpidWZmZXJfbGlzdCA9IGRhdGE7CiAJc3RydWN0IHhmc19idWYJCSpicCA9IE5VTEw7CiAJaW50CQkJZXJyb3IgPSAwOwpAQCAtMTI1Nyw3ICsxMjYxLDMyIEBACiAJaWYgKCFYRlNfRFFfSVNfRElSVFkoZHFwKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JeGZzX2RxZmxvY2soZHFwKTsKKwkvKgorCSAqIFRoZSBvbmx5IHdheSB0aGUgZHF1b3QgaXMgYWxyZWFkeSBmbHVzaCBsb2NrZWQgYnkgdGhlIHRpbWUgcXVvdGFjaGVjaworCSAqIGdldHMgaGVyZSBpcyBpZiByZWNsYWltIGZsdXNoZWQgaXQgYmVmb3JlIHRoZSBkcWFkanVzdCB3YWxrIGRpcnRpZWQKKwkgKiBpdCBmb3IgdGhlIGZpbmFsIHRpbWUuIFF1b3RhY2hlY2sgY29sbGVjdHMgYWxsIGRxdW90IGJ1ZnMgaW4gdGhlCisJICogbG9jYWwgZGVsd3JpIHF1ZXVlIGJlZm9yZSBkcXVvdHMgYXJlIGRpcnRpZWQsIHNvIHJlY2xhaW0gY2FuJ3QgaGF2ZQorCSAqIHBvc3NpYmx5IHF1ZXVlZCBpdCBmb3IgSS9PLiBUaGUgb25seSB3YXkgb3V0IGlzIHRvIHB1c2ggdGhlIGJ1ZmZlciB0bworCSAqIGN5Y2xlIHRoZSBmbHVzaCBsb2NrLgorCSAqLworCWlmICgheGZzX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJLyogYnVmIGlzIHBpbm5lZCBpbi1jb3JlIGJ5IGRlbHdyaSBsaXN0ICovCisJCURFRklORV9TSU5HTEVfQlVGX01BUChtYXAsIGRxcC0+cV9ibGtubywKKwkJCQkgICAgICBtcC0+bV9xdW90YWluZm8tPnFpX2RxY2h1bmtsZW4pOworCQlicCA9IF94ZnNfYnVmX2ZpbmQobXAtPm1fZGRldl90YXJncCwgJm1hcCwgMSwgMCwgTlVMTCk7CisJCWlmICghYnApIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQl4ZnNfYnVmX3VubG9jayhicCk7CisKKwkJeGZzX2J1Zl9kZWx3cmlfcHVzaGJ1ZihicCwgYnVmZmVyX2xpc3QpOworCQl4ZnNfYnVmX3JlbGUoYnApOworCisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwogCWVycm9yID0geGZzX3FtX2RxZmx1c2goZHFwLCAmYnApOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19yZWZsaW5rLmMgYi9mcy94ZnMveGZzX3JlZmxpbmsuYwppbmRleCAyOWE3NWVjLi4wMDE1YzE5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JlZmxpbmsuYworKysgYi9mcy94ZnMveGZzX3JlZmxpbmsuYwpAQCAtMTY5LDYgKzE2OSw4IEBACiAJZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2YobXAsIE5VTEwsIGFnbm8sIDAsICZhZ2JwKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKKwlpZiAoIWFnYnApCisJCXJldHVybiAtRU5PTUVNOwogCiAJY3VyID0geGZzX3JlZmNvdW50YnRfaW5pdF9jdXJzb3IobXAsIE5VTEwsIGFnYnAsIGFnbm8sIE5VTEwpOwogCkBAIC0zMzMsNyArMzM1LDcgQEAKIAlzdHJ1Y3QgeGZzX2RlZmVyX29wcwkJKmRmb3BzKQogewogCXN0cnVjdCB4ZnNfYm1idF9pcmVjCQlpcmVjID0gKmltYXA7Ci0JeGZzX2ZzYmxvY2tfdAkJCWZpcnN0X2Jsb2NrOworCXhmc19mc2Jsb2NrX3QJCQlmaXJzdF9ibG9jayA9IE5VTExGU0JMT0NLOwogCWludAkJCQluaW1hcHMgPSAxOwogCiAJaWYgKGltYXAtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3VwZXIuYyBiL2ZzL3hmcy94ZnNfc3VwZXIuYwppbmRleCA4ODJmYjg1Li42N2Q1ODllIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL3hmc19zdXBlci5jCkBAIC0xMjE0LDcgKzEyMTQsNyBAQAogCXRtcF9tcC0+bV9zdXBlciA9IHNiOwogCWVycm9yID0geGZzX3BhcnNlYXJncyh0bXBfbXAsIG9wdGlvbnMpOwogCXhmc19mcmVlX2ZzbmFtZSh0bXBfbXApOwotCWtmcmVlKHRtcF9tcCk7CisJa21lbV9mcmVlKHRtcF9tcCk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYWNlLmggYi9mcy94ZnMveGZzX3RyYWNlLmgKaW5kZXggODI4ZjM4My4uYmRmNjllMSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFjZS5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhY2UuaApAQCAtMzY2LDYgKzM2Niw3IEBACiBERUZJTkVfQlVGX0VWRU5UKHhmc19idWZfZGVsd3JpX3F1ZXVlKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9kZWx3cmlfcXVldWVkKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9kZWx3cmlfc3BsaXQpOworREVGSU5FX0JVRl9FVkVOVCh4ZnNfYnVmX2RlbHdyaV9wdXNoYnVmKTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9nZXRfdW5jYWNoZWQpOwogREVGSU5FX0JVRl9FVkVOVCh4ZnNfYmRzdHJhdF9zaHV0KTsKIERFRklORV9CVUZfRVZFTlQoeGZzX2J1Zl9pdGVtX3JlbHNlKTsKQEAgLTUxOSw3ICs1MjAsNiBAQAogREVGSU5FX0JVRl9JVEVNX0VWRU5UKHhmc19idWZfaXRlbV9zaXplX29yZGVyZWQpOwogREVGSU5FX0JVRl9JVEVNX0VWRU5UKHhmc19idWZfaXRlbV9zaXplX3N0YWxlKTsKIERFRklORV9CVUZfSVRFTV9FVkVOVCh4ZnNfYnVmX2l0ZW1fZm9ybWF0KTsKLURFRklORV9CVUZfSVRFTV9FVkVOVCh4ZnNfYnVmX2l0ZW1fZm9ybWF0X29yZGVyZWQpOwogREVGSU5FX0JVRl9JVEVNX0VWRU5UKHhmc19idWZfaXRlbV9mb3JtYXRfc3RhbGUpOwogREVGSU5FX0JVRl9JVEVNX0VWRU5UKHhmc19idWZfaXRlbV9vcmRlcmVkKTsKIERFRklORV9CVUZfSVRFTV9FVkVOVCh4ZnNfYnVmX2l0ZW1fcGluKTsKQEAgLTE5OTAsNiArMTk5MCwyNCBAQAogREVGSU5FX1NXQVBFWFRfRVZFTlQoeGZzX3N3YXBfZXh0ZW50X2JlZm9yZSk7CiBERUZJTkVfU1dBUEVYVF9FVkVOVCh4ZnNfc3dhcF9leHRlbnRfYWZ0ZXIpOwogCitUUkFDRV9FVkVOVCh4ZnNfbG9nX3JlY292ZXIsCisJVFBfUFJPVE8oc3RydWN0IHhsb2cgKmxvZywgeGZzX2RhZGRyX3QgaGVhZGJsaywgeGZzX2RhZGRyX3QgdGFpbGJsayksCisJVFBfQVJHUyhsb2csIGhlYWRibGssIHRhaWxibGspLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh4ZnNfZGFkZHJfdCwgaGVhZGJsaykKKwkJX19maWVsZCh4ZnNfZGFkZHJfdCwgdGFpbGJsaykKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYgPSBsb2ctPmxfbXAtPm1fc3VwZXItPnNfZGV2OworCQlfX2VudHJ5LT5oZWFkYmxrID0gaGVhZGJsazsKKwkJX19lbnRyeS0+dGFpbGJsayA9IHRhaWxibGs7CisJKSwKKwlUUF9wcmludGsoImRldiAlZDolZCBoZWFkYmxrIDB4JWxseCB0YWlsYmxrIDB4JWxseCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+aGVhZGJsaywKKwkJICBfX2VudHJ5LT50YWlsYmxrKQorKQorCiBUUkFDRV9FVkVOVCh4ZnNfbG9nX3JlY292ZXJfcmVjb3JkLAogCVRQX1BST1RPKHN0cnVjdCB4bG9nICpsb2csIHN0cnVjdCB4bG9nX3JlY19oZWFkZXIgKnJoZWFkLCBpbnQgcGFzcyksCiAJVFBfQVJHUyhsb2csIHJoZWFkLCBwYXNzKSwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuaCBiL2ZzL3hmcy94ZnNfdHJhbnMuaAppbmRleCA5ODAyNGNiLi41NjY5Y2YwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmgKKysrIGIvZnMveGZzL3hmc190cmFucy5oCkBAIC01MCw2ICs1MCw3IEBACiAJc3RydWN0IHhmc19haWwJCQkqbGlfYWlscDsJLyogcHRyIHRvIEFJTCAqLwogCXVpbnQJCQkJbGlfdHlwZTsJLyogaXRlbSB0eXBlICovCiAJdWludAkJCQlsaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCXN0cnVjdCB4ZnNfYnVmCQkJKmxpX2J1ZjsJLyogcmVhbCBidWZmZXIgcG9pbnRlciAqLwogCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JCSpsaV9iaW9fbGlzdDsJLyogYnVmZmVyIGl0ZW0gbGlzdCAqLwogCXZvaWQJCQkJKCpsaV9jYikoc3RydWN0IHhmc19idWYgKiwKIAkJCQkJCSBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOwpAQCAtNjUsMTEgKzY2LDEzIEBACiB9IHhmc19sb2dfaXRlbV90OwogCiAjZGVmaW5lCVhGU19MSV9JTl9BSUwJMHgxCi0jZGVmaW5lIFhGU19MSV9BQk9SVEVECTB4MgorI2RlZmluZQlYRlNfTElfQUJPUlRFRAkweDIKKyNkZWZpbmUJWEZTX0xJX0ZBSUxFRAkweDQKIAogI2RlZmluZSBYRlNfTElfRkxBR1MgXAogCXsgWEZTX0xJX0lOX0FJTCwJIklOX0FJTCIgfSwgXAotCXsgWEZTX0xJX0FCT1JURUQsCSJBQk9SVEVEIiB9CisJeyBYRlNfTElfQUJPUlRFRCwJIkFCT1JURUQiIH0sIFwKKwl7IFhGU19MSV9GQUlMRUQsCSJGQUlMRUQiIH0KIAogc3RydWN0IHhmc19pdGVtX29wcyB7CiAJdm9pZCAoKmlvcF9zaXplKSh4ZnNfbG9nX2l0ZW1fdCAqLCBpbnQgKiwgaW50ICopOwpAQCAtODAsNiArODMsNyBAQAogCXZvaWQgKCppb3BfdW5sb2NrKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKIAl4ZnNfbHNuX3QgKCppb3BfY29tbWl0dGVkKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfbHNuX3QpOwogCXZvaWQgKCppb3BfY29tbWl0dGluZykoeGZzX2xvZ19pdGVtX3QgKiwgeGZzX2xzbl90KTsKKwl2b2lkICgqaW9wX2Vycm9yKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfYnVmX3QgKik7CiB9OwogCiB2b2lkCXhmc19sb2dfaXRlbV9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2xvZ19pdGVtICppdGVtLApAQCAtMjEzLDEyICsyMTcsMTQgQEAKIHZvaWQJCXhmc190cmFuc19iaW52YWwoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX3N0YWxlX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKLXZvaWQJCXhmc190cmFuc19vcmRlcmVkX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK2Jvb2wJCXhmc190cmFuc19vcmRlcmVkX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIHZvaWQJCXhmc190cmFuc19kcXVvdF9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKiwgdWludCk7CiB2b2lkCQl4ZnNfdHJhbnNfaW5vZGVfYWxsb2NfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwogdm9pZAkJeGZzX3RyYW5zX2ljaGd0aW1lKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqLCBpbnQpOwogdm9pZAkJeGZzX3RyYW5zX2lqb2luKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19pbm9kZSAqLCB1aW50KTsKLXZvaWQJCXhmc190cmFuc19sb2dfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICosIHVpbnQsIHVpbnQpOwordm9pZAkJeGZzX3RyYW5zX2xvZ19idWYoc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50LAorCQkJCSAgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfZGlydHlfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19idWYgKik7CiB2b2lkCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CiAKIHZvaWQJCXhmc19leHRlbnRfZnJlZV9pbml0X2RlZmVyX29wKHZvaWQpOwpAQCAtMjc3LDYgKzI4Myw2IEBACiAJCXN0cnVjdCB4ZnNfYnVkX2xvZ19pdGVtICpydWRwLCBzdHJ1Y3QgeGZzX2RlZmVyX29wcyAqZGZvcHMsCiAJCWVudW0geGZzX2JtYXBfaW50ZW50X3R5cGUgdHlwZSwgc3RydWN0IHhmc19pbm9kZSAqaXAsCiAJCWludCB3aGljaGZvcmssIHhmc19maWxlb2ZmX3Qgc3RhcnRvZmYsIHhmc19mc2Jsb2NrX3Qgc3RhcnRibG9jaywKLQkJeGZzX2ZpbGJsa3NfdCBibG9ja2NvdW50LCB4ZnNfZXhudHN0X3Qgc3RhdGUpOworCQl4ZnNfZmlsYmxrc190ICpibG9ja2NvdW50LCB4ZnNfZXhudHN0X3Qgc3RhdGUpOwogCiAjZW5kaWYJLyogX19YRlNfVFJBTlNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jIGIvZnMveGZzL3hmc190cmFuc19haWwuYwppbmRleCBkNmM5YzNlLi43MGY1YWIwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKQEAgLTY4NCw4ICs2ODQsMjQgQEAKIAl9CiB9CiAKLS8qCi0gKiB4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrIC0gcmVtb3ZlIG11bHRpcGxlIGxvZyBpdGVtcyBmcm9tIHRoZSBBSUwKK2Jvb2wKK3hmc19haWxfZGVsZXRlX29uZSgKKwlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCisJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwKQoreworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKm1saXAgPSB4ZnNfYWlsX21pbihhaWxwKTsKKworCXRyYWNlX3hmc19haWxfZGVsZXRlKGxpcCwgbWxpcC0+bGlfbHNuLCBsaXAtPmxpX2xzbik7CisJeGZzX2FpbF9kZWxldGUoYWlscCwgbGlwKTsKKwl4ZnNfY2xlYXJfbGlfZmFpbGVkKGxpcCk7CisJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKKwlsaXAtPmxpX2xzbiA9IDA7CisKKwlyZXR1cm4gbWxpcCA9PSBsaXA7Cit9CisKKy8qKgorICogUmVtb3ZlIGEgbG9nIGl0ZW1zIGZyb20gdGhlIEFJTAogICoKICAqIEB4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrIHRha2VzIGFuIGFycmF5IG9mIGxvZyBpdGVtcyB0aGF0IGFsbCBuZWVkIHRvCiAgKiByZW1vdmVkIGZyb20gdGhlIEFJTC4gVGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhlIEFJTCBsb2NrLCBhbmQgZG9uZQpAQCAtNzA2LDUyICs3MjIsMzYgQEAKICAqIGJlZm9yZSByZXR1cm5pbmcuCiAgKi8KIHZvaWQKLXhmc190cmFuc19haWxfZGVsZXRlX2J1bGsoCit4ZnNfdHJhbnNfYWlsX2RlbGV0ZSgKIAlzdHJ1Y3QgeGZzX2FpbAkJKmFpbHAsCi0Jc3RydWN0IHhmc19sb2dfaXRlbQkqKmxvZ19pdGVtcywKLQlpbnQJCQlucl9pdGVtcywKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCiAJaW50CQkJc2h1dGRvd25fdHlwZSkgX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKQogewotCXhmc19sb2dfaXRlbV90CQkqbWxpcDsKLQlpbnQJCQltbGlwX2NoYW5nZWQgPSAwOwotCWludAkJCWk7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBhaWxwLT54YV9tb3VudDsKKwlib29sCQkJbWxpcF9jaGFuZ2VkOwogCi0JbWxpcCA9IHhmc19haWxfbWluKGFpbHApOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2l0ZW1zOyBpKyspIHsKLQkJc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwID0gbG9nX2l0ZW1zW2ldOwotCQlpZiAoIShsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkpIHsKLQkJCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gYWlscC0+eGFfbW91bnQ7Ci0KLQkJCXNwaW5fdW5sb2NrKCZhaWxwLT54YV9sb2NrKTsKLQkJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKLQkJCQl4ZnNfYWxlcnRfdGFnKG1wLCBYRlNfUFRBR19BSUxERUxFVEUsCi0JCSIlczogYXR0ZW1wdGluZyB0byBkZWxldGUgYSBsb2cgaXRlbSB0aGF0IGlzIG5vdCBpbiB0aGUgQUlMIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIHNodXRkb3duX3R5cGUpOwotCQkJfQotCQkJcmV0dXJuOworCWlmICghKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSkgeworCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CisJCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCXhmc19hbGVydF90YWcobXAsIFhGU19QVEFHX0FJTERFTEVURSwKKwkiJXM6IGF0dGVtcHRpbmcgdG8gZGVsZXRlIGEgbG9nIGl0ZW0gdGhhdCBpcyBub3QgaW4gdGhlIEFJTCIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgc2h1dGRvd25fdHlwZSk7CiAJCX0KLQotCQl0cmFjZV94ZnNfYWlsX2RlbGV0ZShsaXAsIG1saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pOwotCQl4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwotCQlsaXAtPmxpX2ZsYWdzICY9IH5YRlNfTElfSU5fQUlMOwotCQlsaXAtPmxpX2xzbiA9IDA7Ci0JCWlmIChtbGlwID09IGxpcCkKLQkJCW1saXBfY2hhbmdlZCA9IDE7CisJCXJldHVybjsKIAl9CiAKKwltbGlwX2NoYW5nZWQgPSB4ZnNfYWlsX2RlbGV0ZV9vbmUoYWlscCwgbGlwKTsKIAlpZiAobWxpcF9jaGFuZ2VkKSB7Ci0JCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihhaWxwLT54YV9tb3VudCkpCi0JCQl4bG9nX2Fzc2lnbl90YWlsX2xzbl9sb2NrZWQoYWlscC0+eGFfbW91bnQpOworCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04obXApKQorCQkJeGxvZ19hc3NpZ25fdGFpbF9sc25fbG9ja2VkKG1wKTsKIAkJaWYgKGxpc3RfZW1wdHkoJmFpbHAtPnhhX2FpbCkpCiAJCQl3YWtlX3VwX2FsbCgmYWlscC0+eGFfZW1wdHkpOwotCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7Ci0KLQkJeGZzX2xvZ19zcGFjZV93YWtlKGFpbHAtPnhhX21vdW50KTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmYWlscC0+eGFfbG9jayk7CiAJfQorCisJc3Bpbl91bmxvY2soJmFpbHAtPnhhX2xvY2spOworCWlmIChtbGlwX2NoYW5nZWQpCisJCXhmc19sb2dfc3BhY2Vfd2FrZShhaWxwLT54YV9tb3VudCk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19ibWFwLmMgYi9mcy94ZnMveGZzX3RyYW5zX2JtYXAuYwppbmRleCA2NDA4ZTdkLi4xNDU0M2Q5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX2JtYXAuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2JtYXAuYwpAQCAtNjMsNyArNjMsNyBAQAogCWludAkJCQl3aGljaGZvcmssCiAJeGZzX2ZpbGVvZmZfdAkJCXN0YXJ0b2ZmLAogCXhmc19mc2Jsb2NrX3QJCQlzdGFydGJsb2NrLAotCXhmc19maWxibGtzX3QJCQlibG9ja2NvdW50LAorCXhmc19maWxibGtzX3QJCQkqYmxvY2tjb3VudCwKIAl4ZnNfZXhudHN0X3QJCQlzdGF0ZSkKIHsKIAlpbnQJCQkJZXJyb3I7CkBAIC0xOTYsMTYgKzE5NiwyMyBAQAogCXZvaWQJCQkJKipzdGF0ZSkKIHsKIAlzdHJ1Y3QgeGZzX2JtYXBfaW50ZW50CQkqYm1hcDsKKwl4ZnNfZmlsYmxrc190CQkJY291bnQ7CiAJaW50CQkJCWVycm9yOwogCiAJYm1hcCA9IGNvbnRhaW5lcl9vZihpdGVtLCBzdHJ1Y3QgeGZzX2JtYXBfaW50ZW50LCBiaV9saXN0KTsKKwljb3VudCA9IGJtYXAtPmJpX2JtYXAuYnJfYmxvY2tjb3VudDsKIAllcnJvciA9IHhmc190cmFuc19sb2dfZmluaXNoX2JtYXBfdXBkYXRlKHRwLCBkb25lX2l0ZW0sIGRvcCwKIAkJCWJtYXAtPmJpX3R5cGUsCiAJCQlibWFwLT5iaV9vd25lciwgYm1hcC0+Ymlfd2hpY2hmb3JrLAogCQkJYm1hcC0+YmlfYm1hcC5icl9zdGFydG9mZiwKIAkJCWJtYXAtPmJpX2JtYXAuYnJfc3RhcnRibG9jaywKLQkJCWJtYXAtPmJpX2JtYXAuYnJfYmxvY2tjb3VudCwKKwkJCSZjb3VudCwKIAkJCWJtYXAtPmJpX2JtYXAuYnJfc3RhdGUpOworCWlmICghZXJyb3IgJiYgY291bnQgPiAwKSB7CisJCUFTU0VSVChibWFwLT5iaV90eXBlID09IFhGU19CTUFQX1VOTUFQKTsKKwkJYm1hcC0+YmlfYm1hcC5icl9ibG9ja2NvdW50ID0gY291bnQ7CisJCXJldHVybiAtRUFHQUlOOworCX0KIAlrbWVtX2ZyZWUoYm1hcCk7CiAJcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19idWYuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKaW5kZXggOGVlMjljYS4uM2JhN2E5NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19idWYuYworKysgYi9mcy94ZnMveGZzX3RyYW5zX2J1Zi5jCkBAIC0zNTYsNiArMzU2LDcgQEAKIAkJIHhmc19idWZfdAkqYnApCiB7CiAJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJaW50CQkJZnJlZWQ7CiAKIAkvKgogCSAqIERlZmF1bHQgdG8gYSBub3JtYWwgYnJlbHNlKCkgY2FsbCBpZiB0aGUgdHAgaXMgTlVMTC4KQEAgLTQxOSwxNiArNDIwLDIyIEBACiAJLyoKIAkgKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGJ1ZiBsb2cgaXRlbS4KIAkgKi8KLQlhdG9taWNfZGVjKCZiaXAtPmJsaV9yZWZjb3VudCk7CisJZnJlZWQgPSBhdG9taWNfZGVjX2FuZF90ZXN0KCZiaXAtPmJsaV9yZWZjb3VudCk7CiAKIAkvKgotCSAqIElmIHRoZSBidWYgaXRlbSBpcyBub3QgdHJhY2tpbmcgZGF0YSBpbiB0aGUgbG9nLCB0aGVuCi0JICogd2UgbXVzdCBmcmVlIGl0IGJlZm9yZSByZWxlYXNpbmcgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZQotCSAqIGZyZWUgcG9vbC4gIEJlZm9yZSByZWxlYXNpbmcgdGhlIGJ1ZmZlciB0byB0aGUgZnJlZSBwb29sLAotCSAqIGNsZWFyIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGluIGJfZnNwcml2YXRlMiB0byBkaXNzb2x2ZQotCSAqIGl0cyByZWxhdGlvbiB0byB0aGlzIHRyYW5zYWN0aW9uLgorCSAqIElmIHRoZSBidWYgaXRlbSBpcyBub3QgdHJhY2tpbmcgZGF0YSBpbiB0aGUgbG9nLCB0aGVuIHdlIG11c3QgZnJlZSBpdAorCSAqIGJlZm9yZSByZWxlYXNpbmcgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBmcmVlIHBvb2wuCisJICoKKwkgKiBJZiB0aGUgZnMgaGFzIHNodXRkb3duIGFuZCB3ZSBkcm9wcGVkIHRoZSBsYXN0IHJlZmVyZW5jZSwgaXQgbWF5IGZhbGwKKwkgKiBvbiB1cyB0byByZWxlYXNlIGEgKHBvc3NpYmx5IGRpcnR5KSBibGkgaWYgaXQgbmV2ZXIgbWFkZSBpdCB0byB0aGUKKwkgKiBBSUwgKGUuZy4sIHRoZSBhYm9ydGVkIHVucGluIGFscmVhZHkgaGFwcGVuZWQgYW5kIGRpZG4ndCByZWxlYXNlIGl0CisJICogZHVlIHRvIG91ciByZWZlcmVuY2UpLiBTaW5jZSB3ZSdyZSBhbHJlYWR5IHNodXRkb3duIGFuZCBuZWVkIHhhX2xvY2ssCisJICoganVzdCBmb3JjZSByZW1vdmUgZnJvbSB0aGUgQUlMIGFuZCByZWxlYXNlIHRoZSBibGkgaGVyZS4KIAkgKi8KLQlpZiAoIXhmc19idWZfaXRlbV9kaXJ0eShiaXApKSB7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSAmJiBmcmVlZCkgeworCQl4ZnNfdHJhbnNfYWlsX3JlbW92ZSgmYmlwLT5ibGlfaXRlbSwgU0hVVERPV05fTE9HX0lPX0VSUk9SKTsKKwkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKKwl9IGVsc2UgaWYgKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0RJUlRZKSkgewogLyoqKgogCQlBU1NFUlQoYnAtPmJfcGluY291bnQgPT0gMCk7CiAqKiovCkBAIC00ODYsMjUgKzQ5MywxNyBAQAogfQogCiAvKgotICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIG9mIHRoZSBnaXZlbgotICogYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KLSAqIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCi0gKgotICogRmlyc3QgYW5kIGxhc3QgYXJlIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlciwKLSAqIHNvIHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgaXMgbnVtYmVyZWQgMCByZWdhcmRsZXNzIG9mIHRoZQotICogdmFsdWUgb2YgYl9ibGtuby4KKyAqIE1hcmsgYSBidWZmZXIgZGlydHkgaW4gdGhlIHRyYW5zYWN0aW9uLgogICovCiB2b2lkCi14ZnNfdHJhbnNfbG9nX2J1Zih4ZnNfdHJhbnNfdAkqdHAsCi0JCSAgeGZzX2J1Zl90CSpicCwKLQkJICB1aW50CQlmaXJzdCwKLQkJICB1aW50CQlsYXN0KQoreGZzX3RyYW5zX2RpcnR5X2J1ZigKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQogewotCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwID0gYnAtPmJfZnNwcml2OworCXN0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtCSpiaXAgPSBicC0+Yl9mc3ByaXY7CiAKIAlBU1NFUlQoYnAtPmJfdHJhbnNwID09IHRwKTsKIAlBU1NFUlQoYmlwICE9IE5VTEwpOwotCUFTU0VSVChmaXJzdCA8PSBsYXN0ICYmIGxhc3QgPCBCQlRPQihicC0+Yl9sZW5ndGgpKTsKIAlBU1NFUlQoYnAtPmJfaW9kb25lID09IE5VTEwgfHwKIAkgICAgICAgYnAtPmJfaW9kb25lID09IHhmc19idWZfaW9kb25lX2NhbGxiYWNrcyk7CiAKQEAgLTUyNCw4ICs1MjMsNiBAQAogCWJwLT5iX2lvZG9uZSA9IHhmc19idWZfaW9kb25lX2NhbGxiYWNrczsKIAliaXAtPmJsaV9pdGVtLmxpX2NiID0geGZzX2J1Zl9pb2RvbmU7CiAKLQl0cmFjZV94ZnNfdHJhbnNfbG9nX2J1ZihiaXApOwotCiAJLyoKIAkgKiBJZiB3ZSBpbnZhbGlkYXRlZCB0aGUgYnVmZmVyIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLCB0aGVuCiAJICogY2FuY2VsIHRoZSBpbnZhbGlkYXRpb24gbm93IHRoYXQgd2UncmUgZGlydHlpbmcgdGhlIGJ1ZmZlcgpAQCAtNTM4LDE3ICs1MzUsMzcgQEAKIAkJYnAtPmJfZmxhZ3MgJj0gflhCRl9TVEFMRTsKIAkJYmlwLT5fX2JsaV9mb3JtYXQuYmxmX2ZsYWdzICY9IH5YRlNfQkxGX0NBTkNFTDsKIAl9CisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9ESVJUWSB8IFhGU19CTElfTE9HR0VEOwogCiAJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOwogCWJpcC0+YmxpX2l0ZW0ubGlfZGVzYy0+bGlkX2ZsYWdzIHw9IFhGU19MSURfRElSVFk7Cit9CiAKLQkvKgotCSAqIElmIHdlIGhhdmUgYW4gb3JkZXJlZCBidWZmZXIgd2UgYXJlIG5vdCBsb2dnaW5nIGFueSBkaXJ0eSByYW5nZSBidXQKLQkgKiBpdCBzdGlsbCBuZWVkcyB0byBiZSBtYXJrZWQgZGlydHkgYW5kIHRoYXQgaXQgaGFzIGJlZW4gbG9nZ2VkLgotCSAqLwotCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfRElSVFkgfCBYRlNfQkxJX0xPR0dFRDsKLQlpZiAoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfT1JERVJFRCkpCi0JCXhmc19idWZfaXRlbV9sb2coYmlwLCBmaXJzdCwgbGFzdCk7CisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIG9mIHRoZSBnaXZlbgorICogYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KKyAqIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKgorICogRmlyc3QgYW5kIGxhc3QgYXJlIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlciwKKyAqIHNvIHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgaXMgbnVtYmVyZWQgMCByZWdhcmRsZXNzIG9mIHRoZQorICogdmFsdWUgb2YgYl9ibGtuby4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19idWYoCisJc3RydWN0IHhmc190cmFucwkqdHAsCisJc3RydWN0IHhmc19idWYJCSpicCwKKwl1aW50CQkJZmlyc3QsCisJdWludAkJCWxhc3QpCit7CisJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcCA9IGJwLT5iX2ZzcHJpdjsKKworCUFTU0VSVChmaXJzdCA8PSBsYXN0ICYmIGxhc3QgPCBCQlRPQihicC0+Yl9sZW5ndGgpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfT1JERVJFRCkpOworCisJeGZzX3RyYW5zX2RpcnR5X2J1Zih0cCwgYnApOworCisJdHJhY2VfeGZzX3RyYW5zX2xvZ19idWYoYmlwKTsKKwl4ZnNfYnVmX2l0ZW1fbG9nKGJpcCwgZmlyc3QsIGxhc3QpOwogfQogCiAKQEAgLTcwMSwxNCArNzE4LDEzIEBACiB9CiAKIC8qCi0gKiBNYXJrIHRoZSBidWZmZXIgYXMgb3JkZXJlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhpcyBtZWFucwotICogdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcmUgbm90IHJlY29yZGVkIGluIHRoZSB0cmFuc2FjdGlvbgotICogYnV0IGl0IGlzIHRyYWNrZWQgaW4gdGhlIEFJTCBhcyB0aG91Z2ggaXQgd2FzLiBUaGlzIGFsbG93cyB1cwotICogdG8gcmVjb3JkIGxvZ2ljYWwgY2hhbmdlcyBpbiB0cmFuc2FjdGlvbnMgcmF0aGVyIHRoYW4gdGhlIHBoeXNpY2FsCi0gKiBjaGFuZ2VzIHdlIG1ha2UgdG8gdGhlIGJ1ZmZlciB3aXRob3V0IGNoYW5naW5nIHdyaXRlYmFjayBvcmRlcmluZwotICogY29uc3RyYWludHMgb2YgbWV0YWRhdGEgYnVmZmVycy4KKyAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBvcmRlcmVkIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnRzCisgKiBvZiB0aGUgYnVmZmVyIGFyZSBub3QgcmVjb3JkZWQgaW4gdGhlIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyB0cmFja2VkIGluIHRoZQorICogQUlMIGFzIHRob3VnaCBpdCB3YXMuIFRoaXMgYWxsb3dzIHVzIHRvIHJlY29yZCBsb2dpY2FsIGNoYW5nZXMgaW4KKyAqIHRyYW5zYWN0aW9ucyByYXRoZXIgdGhhbiB0aGUgcGh5c2ljYWwgY2hhbmdlcyB3ZSBtYWtlIHRvIHRoZSBidWZmZXIgd2l0aG91dAorICogY2hhbmdpbmcgd3JpdGViYWNrIG9yZGVyaW5nIGNvbnN0cmFpbnRzIG9mIG1ldGFkYXRhIGJ1ZmZlcnMuCiAgKi8KLXZvaWQKK2Jvb2wKIHhmc190cmFuc19vcmRlcmVkX2J1ZigKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKQpAQCAtNzE5LDggKzczNSwxOCBAQAogCUFTU0VSVChiaXAgIT0gTlVMTCk7CiAJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKIAorCWlmICh4ZnNfYnVmX2l0ZW1fZGlydHlfZm9ybWF0KGJpcCkpCisJCXJldHVybiBmYWxzZTsKKwogCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfT1JERVJFRDsKIAl0cmFjZV94ZnNfYnVmX2l0ZW1fb3JkZXJlZChiaXApOworCisJLyoKKwkgKiBXZSBkb24ndCBsb2cgYSBkaXJ0eSByYW5nZSBvZiBhbiBvcmRlcmVkIGJ1ZmZlciBidXQgaXQgc3RpbGwgbmVlZHMKKwkgKiB0byBiZSBtYXJrZWQgZGlydHkgYW5kIHRoYXQgaXQgaGFzIGJlZW4gbG9nZ2VkLgorCSAqLworCXhmc190cmFuc19kaXJ0eV9idWYodHAsIGJwKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKaW5kZXggNDk5MzFiNy4uYjMxN2EzNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19wcml2LmgKKysrIGIvZnMveGZzL3hmc190cmFuc19wcml2LmgKQEAgLTEwNiwxOCArMTA2LDkgQEAKIAl4ZnNfdHJhbnNfYWlsX3VwZGF0ZV9idWxrKGFpbHAsIE5VTEwsICZsaXAsIDEsIGxzbik7CiB9CiAKLXZvaWQJeGZzX3RyYW5zX2FpbF9kZWxldGVfYnVsayhzdHJ1Y3QgeGZzX2FpbCAqYWlscCwKLQkJCQlzdHJ1Y3QgeGZzX2xvZ19pdGVtICoqbG9nX2l0ZW1zLCBpbnQgbnJfaXRlbXMsCi0JCQkJaW50IHNodXRkb3duX3R5cGUpCi0JCQkJX19yZWxlYXNlcyhhaWxwLT54YV9sb2NrKTsKLXN0YXRpYyBpbmxpbmUgdm9pZAoteGZzX3RyYW5zX2FpbF9kZWxldGUoCi0Jc3RydWN0IHhmc19haWwJKmFpbHAsCi0JeGZzX2xvZ19pdGVtX3QJKmxpcCwKLQlpbnQJCXNodXRkb3duX3R5cGUpIF9fcmVsZWFzZXMoYWlscC0+eGFfbG9jaykKLXsKLQl4ZnNfdHJhbnNfYWlsX2RlbGV0ZV9idWxrKGFpbHAsICZsaXAsIDEsIHNodXRkb3duX3R5cGUpOwotfQorYm9vbCB4ZnNfYWlsX2RlbGV0ZV9vbmUoc3RydWN0IHhmc19haWwgKmFpbHAsIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCk7Cit2b2lkIHhmc190cmFuc19haWxfZGVsZXRlKHN0cnVjdCB4ZnNfYWlsICphaWxwLCBzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXAsCisJCWludCBzaHV0ZG93bl90eXBlKSBfX3JlbGVhc2VzKGFpbHAtPnhhX2xvY2spOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHhmc190cmFuc19haWxfcmVtb3ZlKApAQCAtMTczLDQgKzE2NCwzNSBAQAogCSpkc3QgPSAqc3JjOwogfQogI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoreGZzX2NsZWFyX2xpX2ZhaWxlZCgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXApCit7CisJc3RydWN0IHhmc19idWYJKmJwID0gbGlwLT5saV9idWY7CisKKwlBU1NFUlQobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxpcC0+bGlfYWlscC0+eGFfbG9jayk7CisKKwlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9GQUlMRUQpIHsKKwkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0ZBSUxFRDsKKwkJbGlwLT5saV9idWYgPSBOVUxMOworCQl4ZnNfYnVmX3JlbGUoYnApOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCit4ZnNfc2V0X2xpX2ZhaWxlZCgKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCisJc3RydWN0IHhmc19idWYJCSpicCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsaXAtPmxpX2FpbHAtPnhhX2xvY2spOworCisJaWYgKCEobGlwLT5saV9mbGFncyAmIFhGU19MSV9GQUlMRUQpKSB7CisJCXhmc19idWZfaG9sZChicCk7CisJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0ZBSUxFRDsKKwkJbGlwLT5saV9idWYgPSBicDsKKwl9Cit9CisKICNlbmRpZgkvKiBfX1hGU19UUkFOU19QUklWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy90b3BvbG9neS5oCmluZGV4IGZjODI0ZTIuLjVkMmFkZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3RvcG9sb2d5LmgKQEAgLTQ4LDcgKzQ4LDExIEBACiAjZGVmaW5lIHBhcmVudF9ub2RlKG5vZGUpCSgodm9pZCkobm9kZSksMCkKICNlbmRpZgogI2lmbmRlZiBjcHVtYXNrX29mX25vZGUKLSNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpCSgodm9pZClub2RlLCBjcHVfb25saW5lX21hc2spCisgICNpZmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUworICAgICNkZWZpbmUgY3B1bWFza19vZl9ub2RlKG5vZGUpCSgobm9kZSkgPT0gMCA/IGNwdV9vbmxpbmVfbWFzayA6IGNwdV9ub25lX21hc2spCisgICNlbHNlCisgICAgI2RlZmluZSBjcHVtYXNrX29mX25vZGUobm9kZSkJKCh2b2lkKW5vZGUsIGNwdV9vbmxpbmVfbWFzaykKKyAgI2VuZGlmCiAjZW5kaWYKICNpZm5kZWYgcGNpYnVzX3RvX25vZGUKICNkZWZpbmUgcGNpYnVzX3RvX25vZGUoYnVzKQkoKHZvaWQpKGJ1cyksIC0xKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCmluZGV4IDMxZTFkNjMuLmRjODFlNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKQEAgLTYwLDYgKzYwLDIyIEBACiAjZGVmaW5lIEFMSUdOX0ZVTkNUSU9OKCkgIC4gPSBBTElHTig4KQogCiAvKgorICogTERfREVBRF9DT0RFX0RBVEFfRUxJTUlOQVRJT04gb3B0aW9uIGVuYWJsZXMgLWZkYXRhLXNlY3Rpb25zLCB3aGljaAorICogZ2VuZXJhdGVzIC5kYXRhLmlkZW50aWZpZXIgc2VjdGlvbnMsIHdoaWNoIG5lZWQgdG8gYmUgcHVsbGVkIGluIHdpdGgKKyAqIC5kYXRhLiBXZSBkb24ndCB3YW50IHRvIHB1bGwgaW4gLmRhdGEuLm90aGVyIHNlY3Rpb25zLCB3aGljaCBMaW51eAorICogaGFzIGRlZmluZWQuIFNhbWUgZm9yIHRleHQgYW5kIGJzcy4KKyAqLworI2lmZGVmIENPTkZJR19MRF9ERUFEX0NPREVfREFUQV9FTElNSU5BVElPTgorI2RlZmluZSBURVhUX01BSU4gLnRleHQgLnRleHQuWzAtOWEtekEtWl9dKgorI2RlZmluZSBEQVRBX01BSU4gLmRhdGEgLmRhdGEuWzAtOWEtekEtWl9dKgorI2RlZmluZSBCU1NfTUFJTiAuYnNzIC5ic3MuWzAtOWEtekEtWl9dKgorI2Vsc2UKKyNkZWZpbmUgVEVYVF9NQUlOIC50ZXh0CisjZGVmaW5lIERBVEFfTUFJTiAuZGF0YQorI2RlZmluZSBCU1NfTUFJTiAuYnNzCisjZW5kaWYKKworLyoKICAqIEFsaWduIHRvIGEgMzIgYnl0ZSBib3VuZGFyeSBlcXVhbCB0byB0aGUKICAqIGFsaWdubWVudCBnY2MgNC41IHVzZXMgZm9yIGEgc3RydWN0CiAgKi8KQEAgLTE5OCwxMiArMjE0LDkgQEAKIAogLyoKICAqIC5kYXRhIHNlY3Rpb24KLSAqIExEX0RFQURfQ09ERV9EQVRBX0VMSU1JTkFUSU9OIG9wdGlvbiBlbmFibGVzIC1mZGF0YS1zZWN0aW9ucyBnZW5lcmF0ZXMKLSAqIC5kYXRhLmlkZW50aWZpZXIgd2hpY2ggbmVlZHMgdG8gYmUgcHVsbGVkIGluIHdpdGggLmRhdGEsIGJ1dCBkb24ndCB3YW50IHRvCi0gKiBwdWxsIGluIC5kYXRhLi5zdHVmZiB3aGljaCBoYXMgaXRzIG93biByZXF1aXJlbWVudHMuIFNhbWUgZm9yIGJzcy4KICAqLwogI2RlZmluZSBEQVRBX0RBVEEJCQkJCQkJXAotCSooLmRhdGEgLmRhdGEuWzAtOWEtekEtWl9dKikJCQkJCVwKKwkqKERBVEFfTUFJTikJCQkJCQkJXAogCSooLnJlZi5kYXRhKQkJCQkJCQlcCiAJKiguZGF0YS4uc2hhcmVkX2FsaWduZWQpIC8qIHBlcmNwdSByZWxhdGVkICovCQkJXAogCU1FTV9LRUVQKGluaXQuZGF0YSkJCQkJCQlcCkBAIC00MzYsMTYgKzQ0OSwxNyBAQAogCQlWTUxJTlVYX1NZTUJPTChfX3NlY3VyaXR5X2luaXRjYWxsX2VuZCkgPSAuOwkJXAogCX0KIAotLyogLnRleHQgc2VjdGlvbi4gTWFwIHRvIGZ1bmN0aW9uIGFsaWdubWVudCB0byBhdm9pZCBhZGRyZXNzIGNoYW5nZXMKKy8qCisgKiAudGV4dCBzZWN0aW9uLiBNYXAgdG8gZnVuY3Rpb24gYWxpZ25tZW50IHRvIGF2b2lkIGFkZHJlc3MgY2hhbmdlcwogICogZHVyaW5nIHNlY29uZCBsZCBydW4gaW4gc2Vjb25kIGxkIHBhc3Mgd2hlbiBnZW5lcmF0aW5nIFN5c3RlbS5tYXAKLSAqIExEX0RFQURfQ09ERV9EQVRBX0VMSU1JTkFUSU9OIG9wdGlvbiBlbmFibGVzIC1mZnVuY3Rpb24tc2VjdGlvbnMgZ2VuZXJhdGVzCi0gKiAudGV4dC5pZGVudGlmaWVyIHdoaWNoIG5lZWRzIHRvIGJlIHB1bGxlZCBpbiB3aXRoIC50ZXh0ICwgYnV0IHNvbWUKLSAqIGFyY2hpdGVjdHVyZXMgZGVmaW5lIC50ZXh0LmZvbyB3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcHVsbGVkIGluIGhlcmUuCi0gKiBUaG9zZSBlbmFibGluZyBMRF9ERUFEX0NPREVfREFUQV9FTElNSU5BVElPTiBtdXN0IGVuc3VyZSB0aGV5IGRvbid0IGhhdmUKLSAqIGNvbmZsaWN0aW5nIHNlY3Rpb24gbmFtZXMsIGFuZCBtdXN0IHB1bGwgaW4gLnRleHQuWzAtOWEtekEtWl9dKiAqLworICoKKyAqIFRFWFRfTUFJTiBoZXJlIHdpbGwgbWF0Y2ggLnRleHQuZml4dXAgYW5kIC50ZXh0LnVubGlrZWx5IGlmIGRlYWQKKyAqIGNvZGUgZWxpbWluYXRpb24gaXMgZW5hYmxlZCwgc28gdGhlc2Ugc2VjdGlvbnMgc2hvdWxkIGJlIGNvbnZlcnRlZAorICogdG8gdXNlICIuLiIgZmlyc3QuCisgKi8KICNkZWZpbmUgVEVYVF9URVhUCQkJCQkJCVwKIAkJQUxJR05fRlVOQ1RJT04oKTsJCQkJCVwKLQkJKigudGV4dC5ob3QgLnRleHQgLnRleHQuZml4dXAgLnRleHQudW5saWtlbHkpCQlcCisJCSooLnRleHQuaG90IFRFWFRfTUFJTiAudGV4dC5maXh1cCAudGV4dC51bmxpa2VseSkJXAogCQkqKC5yZWYudGV4dCkJCQkJCQlcCiAJTUVNX0tFRVAoaW5pdC50ZXh0KQkJCQkJCVwKIAlNRU1fS0VFUChleGl0LnRleHQpCQkJCQkJXApAQCAtNjEzLDcgKzYyNyw3IEBACiAJCUJTU19GSVJTVF9TRUNUSU9OUwkJCQkJXAogCQkqKC5ic3MuLnBhZ2VfYWxpZ25lZCkJCQkJCVwKIAkJKiguZHluYnNzKQkJCQkJCVwKLQkJKiguYnNzIC5ic3MuWzAtOWEtekEtWl9dKikJCQkJXAorCQkqKEJTU19NQUlOKQkJCQkJCVwKIAkJKihDT01NT04pCQkJCQkJXAogCX0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2Mtc2RtODQ1LmgKaW5kZXggMzM5ZDQ3MC4uYzg2OTZkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1zZG04NDUuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLXNkbTg0NS5oCkBAIC0yMTIsNiArMjEyLDcgQEAKICNkZWZpbmUgR0NDX1ZTX0NUUkxfQ0xLX1NSQwkJCQkJMTk0CiAjZGVmaW5lIEdDQ19WU0VOU09SX0NMS19TUkMJCQkJCTE5NQogI2RlZmluZSBHUExMNAkJCQkJCQkxOTYKKyNkZWZpbmUgR1BMTDYJCQkJCQkJMTk3CiAKIC8qIEdDQyByZXNldCBjbG9ja3MgKi8KICNkZWZpbmUgR0NDX01NU1NfQkNSCQkJCQkJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9tc20vbXNtLWJ1cy1pZHMuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvbXNtL21zbS1idXMtaWRzLmgKaW5kZXggYmM4N2JlYi4uZTIwMTc1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9tc20vbXNtLWJ1cy1pZHMuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL21zbS9tc20tYnVzLWlkcy5oCkBAIC0yNTEsNyArMjUxLDggQEAKICNkZWZpbmUJTVNNX0JVU19NQVNURVJfQ0FNTk9DX0hGMV9VTkNPTVAgMTQ3CiAjZGVmaW5lCU1TTV9CVVNfTUFTVEVSX0NBTU5PQ19TRl9VTkNPTVAgMTQ4CiAjZGVmaW5lCU1TTV9CVVNfTUFTVEVSX0dJQyAxNDkKLSNkZWZpbmUJTVNNX0JVU19NQVNURVJfTUFTVEVSX0xBU1QgMTUwCisjZGVmaW5lCU1TTV9CVVNfTUFTVEVSX0VNTUMgMTUwCisjZGVmaW5lCU1TTV9CVVNfTUFTVEVSX01BU1RFUl9MQVNUIDE1MQogCiAjZGVmaW5lIE1TTV9CVVNfTUFTVEVSX0xMQ0NfRElTUExBWSAyMDAwMAogI2RlZmluZSBNU01fQlVTX01BU1RFUl9NTk9DX0hGX01FTV9OT0NfRElTUExBWSAyMDAwMQpAQCAtNzY3LDYgKzc2OCw3IEBACiAjZGVmaW5lCUlDQklEX01BU1RFUl9DTk9DX0EyTk9DIDE0NgogI2RlZmluZQlJQ0JJRF9NQVNURVJfV0xBTiAxNDcKICNkZWZpbmUJSUNCSURfTUFTVEVSX01TU19DRSAxNDgKKyNkZWZpbmUJSUNCSURfTUFTVEVSX0VNTUMgMTQ5CiAKICNkZWZpbmUJSUNCSURfU0xBVkVfRUJJMSAwCiAjZGVmaW5lCUlDQklEX1NMQVZFX0FQUFNTX0wyIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXZ0aW1lcl9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgvYXZ0aW1lcl9rZXJuZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhMTI1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2F2dGltZXJfa2VybmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9BVlRJTUVSX0gKLSNkZWZpbmUgX0FWVElNRVJfSAotCi0jaW5jbHVkZSA8dWFwaS9saW51eC9hdnRpbWVyLmg+Ci0KLWludCBhdmNzX2NvcmVfb3Blbih2b2lkKTsKLWludCBhdmNzX2NvcmVfZGlzYWJsZV9wb3dlcl9jb2xsYXBzZShpbnQgZGlzYWJsZSk7LyogdHJ1ZSBvciBmbGFzZSAqLwotaW50IGF2Y3NfY29yZV9xdWVyeV90aW1lcih1aW50NjRfdCAqYXZ0aW1lcl90aWNrKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaAppbmRleCBhMTNiMDMxLi4zMTAxMTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oCisrKyBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmgKQEAgLTQwLDYgKzQwLDcgQEAKIAkgKi8KIAlzNjQgbWluX3ZhbHVlOwogCXU2NCBtYXhfdmFsdWU7CisJYm9vbCB2YWx1ZV9mcm9tX3NpZ25lZDsKIH07CiAKIGVudW0gYnBmX3N0YWNrX3Nsb3RfdHlwZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC5oIGIvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaAppbmRleCAxMDg0MmJiLi4zMmMzZDQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LmgKQEAgLTE1OCw2ICsxNTgsNyBAQAogICogQGFjdGl2YXRlZDoJJ3RydWUnIG9ubHkgaWYgYSBfc2lua18gaGFzIGJlZW4gYWN0aXZhdGVkLiAgQSBzaW5rIGNhbiBiZQogCQlhY3RpdmF0ZWQgYnV0IG5vdCB5ZXQgZW5hYmxlZC4gIEVuYWJsaW5nIGZvciBhIF9zaW5rXwogCQloYXBwZW5zIHdoZW4gYSBzb3VyY2UgaGFzIGJlZW4gc2VsZWN0ZWQgZm9yIHRoYXQgaXQuCisgKiBAYWJvcnQ6ICAgICBjYXB0dXJlcyBzaW5rIHRyYWNlIG9uIGFib3J0LgogICovCiBzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSB7CiAJc3RydWN0IGNvcmVzaWdodF9jb25uZWN0aW9uICpjb25uczsKQEAgLTIwNiw2ICsyMDcsNyBAQAogCXZvaWQgKCp1cGRhdGVfYnVmZmVyKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgICB2b2lkICpzaW5rX2NvbmZpZyk7CisJdm9pZCAoKmFib3J0KShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpOwogfTsKIAogLyoqCkBAIC0yNTIsNiArMjU0LDcgQEAKIGV4dGVybiB2b2lkIGNvcmVzaWdodF9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CiBleHRlcm4gaW50IGNvcmVzaWdodF90aW1lb3V0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwKIAkJCSAgICAgaW50IHBvc2l0aW9uLCBpbnQgdmFsdWUpOworZXh0ZXJuIHZvaWQgY29yZXNpZ2h0X2Fib3J0KHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKgogY29yZXNpZ2h0X3JlZ2lzdGVyKHN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYykgeyByZXR1cm4gTlVMTDsgfQpAQCAtMjYxLDkgKzI2NCwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIGNvcmVzaWdodF9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldikge30KIHN0YXRpYyBpbmxpbmUgaW50IGNvcmVzaWdodF90aW1lb3V0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwKIAkJCQkgICAgIGludCBwb3NpdGlvbiwgaW50IHZhbHVlKSB7IHJldHVybiAxOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgY29yZXNpZ2h0X2Fib3J0KHZvaWQpIHt9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19PRgorI2lmIGRlZmluZWQoQ09ORklHX09GKSAmJiBkZWZpbmVkKENPTkZJR19DT1JFU0lHSFQpCiBleHRlcm4gc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpvZl9nZXRfY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEoCiAJCQkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIHN0cnVjdCBjb3Jlc2lnaHRfY3RpX2RhdGEgKm9mX2dldF9jb3Jlc2lnaHRfY3RpX2RhdGEoCkBAIC0yNzEsNyArMjc1LDcgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjb3Jlc2lnaHRfcGxhdGZvcm1fZGF0YSAqb2ZfZ2V0X2NvcmVzaWdodF9wbGF0Zm9ybV9kYXRhKAogCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKSB7IHJldHVybiBOVUxMOyB9Ci1zdGF0aWMgaW5saW50IHN0cnVjdCBjb3Jlc2lnaHRfY3RpX2RhdGEgKm9mX2dldF9jb3Jlc2lnaHRfY3RpX2RhdGEoCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjb3Jlc2lnaHRfY3RpX2RhdGEgKm9mX2dldF9jb3Jlc2lnaHRfY3RpX2RhdGEoCiAJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKSB7IHJldHVybiBOVUxMOyB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmggYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAppbmRleCBlZGY4OGJkLi42YmUwMjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaApAQCAtMTAsNyArMTAsNiBAQAogCUNQVUhQX1BFUkZfWDg2X1BSRVBBUkUsCiAJQ1BVSFBfUEVSRl9YODZfVU5DT1JFX1BSRVAsCiAJQ1BVSFBfUEVSRl9YODZfQU1EX1VOQ09SRV9QUkVQLAotCUNQVUhQX1BFUkZfWDg2X1JBUExfUFJFUCwKIAlDUFVIUF9QRVJGX0JGSU4sCiAJQ1BVSFBfUEVSRl9QT1dFUiwKIAlDUFVIUF9QRVJGX1NVUEVSSCwKQEAgLTEwMiw2ICsxMDEsOCBAQAogCUNQVUhQX0FQX0RVTU1ZX1RJTUVSX1NUQVJUSU5HLAogCUNQVUhQX0FQX0FSTV9YRU5fU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNX0NPUkVTSUdIVF9TVEFSVElORywKKwlDUFVIUF9BUF9BUk1fU0FWRV9SRVNUT1JFX0NPUkVTSUdIVDRfU1RBUlRJTkcsCisJQ1BVSFBfQVBfQVJNX01NX0NPUkVTSUdIVDRfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNX0NPUkVTSUdIVDRfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNNjRfSVNOREVQX1NUQVJUSU5HLAogCUNQVUhQX0FQX1NNUENGRF9EWUlORywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmggYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCmluZGV4IGJmYzIwNGUuLmNkMzJhNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaApAQCAtMTYsNiArMTYsMTkgQEAKIAogI2lmZGVmIENPTkZJR19DUFVTRVRTCiAKKy8qCisgKiBTdGF0aWMgYnJhbmNoIHJld3JpdGVzIGNhbiBoYXBwZW4gaW4gYW4gYXJiaXRyYXJ5IG9yZGVyIGZvciBhIGdpdmVuCisgKiBrZXkuIEluIGNvZGUgcGF0aHMgd2hlcmUgd2UgbmVlZCB0byBsb29wIHdpdGggcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4oKSBhbmQKKyAqIHJlYWRfbWVtc19hbGxvd2VkX3JldHJ5KCkgdG8gZ2V0IGEgY29uc2lzdGVudCB2aWV3IG9mIG1lbXNfYWxsb3dlZCwgd2UgbmVlZAorICogdG8gZW5zdXJlIHRoYXQgYmVnaW4oKSBhbHdheXMgZ2V0cyByZXdyaXR0ZW4gYmVmb3JlIHJldHJ5KCkgaW4gdGhlCisgKiBkaXNhYmxlZCAtPiBlbmFibGVkIHRyYW5zaXRpb24uIElmIG5vdCwgdGhlbiBpZiBsb2NhbCBpcnFzIGFyZSBkaXNhYmxlZAorICogYXJvdW5kIHRoZSBsb29wLCB3ZSBjYW4gZGVhZGxvY2sgc2luY2UgcmV0cnkoKSB3b3VsZCBhbHdheXMgYmUKKyAqIGNvbXBhcmluZyB0aGUgbGF0ZXN0IHZhbHVlIG9mIHRoZSBtZW1zX2FsbG93ZWQgc2VxY291bnQgYWdhaW5zdCAwIGFzCisgKiBiZWdpbigpIHN0aWxsIHdvdWxkIHNlZSBjcHVzZXRzX2VuYWJsZWQoKSBhcyBmYWxzZS4gVGhlIGVuYWJsZWQgLT4gZGlzYWJsZWQKKyAqIHRyYW5zaXRpb24gc2hvdWxkIGhhcHBlbiBpbiByZXZlcnNlIG9yZGVyIGZvciB0aGUgc2FtZSByZWFzb25zICh3YW50IHRvIHN0b3AKKyAqIGxvb2tpbmcgYXQgcmVhbCB2YWx1ZSBvZiBtZW1zX2FsbG93ZWQuc2VxdWVuY2UgaW4gcmV0cnkoKSBmaXJzdCkuCisgKi8KK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBjcHVzZXRzX3ByZV9lbmFibGVfa2V5OwogZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIGNwdXNldHNfZW5hYmxlZF9rZXk7CiBzdGF0aWMgaW5saW5lIGJvb2wgY3B1c2V0c19lbmFibGVkKHZvaWQpCiB7CkBAIC0zMCwxMiArNDMsMTQgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9pbmModm9pZCkKIHsKKwlzdGF0aWNfYnJhbmNoX2luYygmY3B1c2V0c19wcmVfZW5hYmxlX2tleSk7CiAJc3RhdGljX2JyYW5jaF9pbmMoJmNwdXNldHNfZW5hYmxlZF9rZXkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2RlYyh2b2lkKQogewogCXN0YXRpY19icmFuY2hfZGVjKCZjcHVzZXRzX2VuYWJsZWRfa2V5KTsKKwlzdGF0aWNfYnJhbmNoX2RlYygmY3B1c2V0c19wcmVfZW5hYmxlX2tleSk7CiB9CiAKIGV4dGVybiBpbnQgY3B1c2V0X2luaXQodm9pZCk7CkBAIC0xMTMsNyArMTI4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVhZF9tZW1zX2FsbG93ZWRfYmVnaW4odm9pZCkKIHsKLQlpZiAoIWNwdXNldHNfZW5hYmxlZCgpKQorCWlmICghc3RhdGljX2JyYW5jaF91bmxpa2VseSgmY3B1c2V0c19wcmVfZW5hYmxlX2tleSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJmN1cnJlbnQtPm1lbXNfYWxsb3dlZF9zZXEpOwpAQCAtMTI3LDcgKzE0Miw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCByZWFkX21lbXNfYWxsb3dlZF9yZXRyeSh1bnNpZ25lZCBpbnQgc2VxKQogewotCWlmICghY3B1c2V0c19lbmFibGVkKCkpCisJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZjcHVzZXRzX2VuYWJsZWRfa2V5KSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJmN1cnJlbnQtPm1lbXNfYWxsb3dlZF9zZXEsIHNlcSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA5YjA0NzdlLi4zZDRhMTk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTU5MSw1ICs1OTEsMTEgQEAKIAlyZXR1cm4gZF9iYWNraW5nX2lub2RlKGRfcmVhbCgoc3RydWN0IGRlbnRyeSAqKSBkZW50cnksIE5VTEwsIDApKTsKIH0KIAorc3RydWN0IG5hbWVfc25hcHNob3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciBpbmxpbmVfbmFtZVtETkFNRV9JTkxJTkVfTEVOXTsKK307Cit2b2lkIHRha2VfZGVudHJ5X25hbWVfc25hcHNob3Qoc3RydWN0IG5hbWVfc25hcHNob3QgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3ZvaWQgcmVsZWFzZV9kZW50cnlfbmFtZV9zbmFwc2hvdChzdHJ1Y3QgbmFtZV9zbmFwc2hvdCAqKTsKIAogI2VuZGlmCS8qIF9fTElOVVhfRENBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmctZmFzdC5oIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy1mYXN0LmgKaW5kZXggNTYwZjA0Ny4uNjRhZTU0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy1mYXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy1mYXN0LmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTQxLDE5ICs0MSwxNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19JT01NVV9JT19QR1RBQkxFX0ZBU1QKLWludCBmYXN0X3NtbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCitpbnQgZmFzdF9zbW11X2luaXRfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nKTsKLXZvaWQgZmFzdF9zbW11X2RldGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcpOwordm9pZCBmYXN0X3NtbXVfcmVsZWFzZV9tYXBwaW5nKHN0cnVjdCBrcmVmICprcmVmKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBmYXN0X3NtbXVfYXR0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgaW5saW5lIGludCBmYXN0X3NtbXVfaW5pdF9tYXBwaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmYXN0X3NtbXVfZGV0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYXN0X3NtbXVfcmVsZWFzZV9tYXBwaW5nKHN0cnVjdCBrcmVmICprcmVmKQogewogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggMDI2YWEwYS4uMThiZDI0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtOTQxLDkgKzk0MSw5IEBACiAvKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlcyAKICAgIGxpbWl0cywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBpbiBWTS4gKi8gCiAjaWYgQklUU19QRVJfTE9ORz09MzIKLSNkZWZpbmUgTUFYX0xGU19GSUxFU0laRQkoKChsb2ZmX3QpUEFHRV9TSVpFIDw8IChCSVRTX1BFUl9MT05HLTEpKS0xKQorI2RlZmluZSBNQVhfTEZTX0ZJTEVTSVpFCSgobG9mZl90KVVMT05HX01BWCA8PCBQQUdFX1NISUZUKQogI2VsaWYgQklUU19QRVJfTE9ORz09NjQKLSNkZWZpbmUgTUFYX0xGU19GSUxFU0laRSAJKChsb2ZmX3QpMHg3ZmZmZmZmZmZmZmZmZmZmTEwpCisjZGVmaW5lIE1BWF9MRlNfRklMRVNJWkUgCSgobG9mZl90KUxMT05HX01BWCkKICNlbmRpZgogCiAjZGVmaW5lIEZMX1BPU0lYCTEKQEAgLTI3ODIsNiArMjc4Miw3IEBACiAjZW5kaWYKIGV4dGVybiB2b2lkIHVubG9ja19uZXdfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfbmV4dF9pbm8odm9pZCk7CitleHRlcm4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIGV4dGVybiB2b2lkIF9faWdldChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSk7CiBleHRlcm4gdm9pZCBpZ2V0X2ZhaWxlZChzdHJ1Y3QgaW5vZGUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKaW5kZXggYjhiY2MwNS4uZTVmMDNhNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKQEAgLTI5MywzNSArMjkzLDQgQEAKIAl9CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19GU05PVElGWSkJLyogbm90aWZ5IGhlbHBlcnMgKi8KLQotLyoKLSAqIGZzbm90aWZ5X29sZG5hbWVfaW5pdCAtIHNhdmUgb2ZmIHRoZSBvbGQgZmlsZW5hbWUgYmVmb3JlIHdlIGNoYW5nZSBpdAotICovCi1zdGF0aWMgaW5saW5lIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQotewotCXJldHVybiBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwotfQotCi0vKgotICogZnNub3RpZnlfb2xkbmFtZV9mcmVlIC0gZnJlZSB0aGUgbmFtZSB3ZSBnb3QgZnJvbSBmc25vdGlmeV9vbGRuYW1lX2luaXQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X29sZG5hbWVfZnJlZShjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfbmFtZSkKLXsKLQlrZnJlZShvbGRfbmFtZSk7Ci19Ci0KLSNlbHNlCS8qIENPTkZJR19GU05PVElGWSAqLwotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfb2xkbmFtZV9mcmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9uYW1lKQotewotfQotCi0jZW5kaWYJLyogIENPTkZJR19GU05PVElGWSAqLwotCiAjZW5kaWYJLyogX0xJTlVYX0ZTX05PVElGWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy9pMmMtbXNtLXYyLmggYi9pbmNsdWRlL2xpbnV4L2kyYy9pMmMtbXNtLXYyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkNjk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaTJjL2kyYy1tc20tdjIuaApAQCAtMCwwICsxLDY2NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKy8qCisgKiBJMkMgY29udHJvbGxlciBkcml2ZXIgZm9yIFF1YWxjb21tIFRlY2hub2xvZ2llcyBJbmMgcGxhdGZvcm1zCisgKi8KKworI2lmbmRlZiBfSTJDX01TTV9WMl9ICisjZGVmaW5lIF9JMkNfTVNNX1YyX0gKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorCitlbnVtIG1zbV9pMl9kZWJ1Z19sZXZlbCB7CisJTVNNX0VSUiwJLyogRXJyb3IgbWVzc2FnZXMgb25seS4gQWx3YXlzIG9uICovCisJTVNNX1BST0YsCS8qIEhpZ2ggbGV2ZWwgZXZlbnRzLiBVc2UgZm9yIHByb2ZpbGluZyAqLworCU1TTV9EQkcsCS8qIExvdyBsZXZlbCBkZXRhaWxzLiBVc2UgZm9yIGRlYnVnZ2luZyAqLworfTsKKworI2RlZmluZSBpMmNfbXNtX2RiZyhjdHJsLCBkYmdfbGV2ZWwsIGZtdCwgLi4uKSBkbyB7XAorCQlpZiAoY3RybC0+ZGJnZnMuZGJnX2x2bCA+PSBkYmdfbGV2ZWwpXAorCQkJZGV2X2luZm8oY3RybC0+ZGV2LCBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXyk7XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQklUX0lTX1NFVCh2YWwsIGlkeCkgICAgICAgICgodmFsID4+IGlkeCkgJiAweDEpCisjZGVmaW5lIEJJVFNfQVQodmFsLCBpZHgsIG5fYml0cykoKCh2YWwpICYgKCgoMSA8PCBuX2JpdHMpIC0gMSkgPDwgaWR4KSkgPj4gaWR4KQorI2RlZmluZSBNQVNLX0lTX1NFVCh2YWwsIG1hc2spICAgICAgKCh2YWwgJiBtYXNrKSA9PSBtYXNrKQorI2RlZmluZSBNQVNLX0lTX1NFVF9CT09MKHZhbCwgbWFzaykgKE1BU0tfSVNfU0VUKHZhbCwgbWFzaykgPyAxIDogMCkKKyNkZWZpbmUgS0h6KGZyZXEpICgxMDAwICogZnJlcSkKKyNkZWZpbmUgSTJDX01TTV9DTEtfRkFTVF9QTFVTX0ZSRVEgICgxMDAwMDAwKQorCisvKiBRVVAgUmVnaXN0ZXJzICovCitlbnVtIHsKKwlRVVBfQ09ORklHICAgICAgICAgICAgICA9IDB4MCwKKwlRVVBfU1RBVEUgICAgICAgICAgICAgICA9IDB4NCwKKwlRVVBfSU9fTU9ERVMgICAgICAgICAgICA9IDB4OCwKKwlRVVBfU1dfUkVTRVQgICAgICAgICAgICA9IDB4QywKKwlRVVBfT1BFUkFUSU9OQUwgICAgICAgICA9IDB4MTgsCisJUVVQX0VSUk9SX0ZMQUdTICAgICAgICAgPSAweDFDLAorCVFVUF9FUlJPUl9GTEFHU19FTiAgICAgID0gMHgyMCwKKwlRVVBfVEVTVF9DVFJMICAgICAgICAgICA9IDB4MjQsCisJUVVQX09QRVJBVElPTkFMX01BU0sgICAgPSAweDI4LAorCVFVUF9IV19WRVJTSU9OICAgICAgICAgID0gMHgzMCwKKwlRVVBfTVhfUkVBRF9DT1VOVCAgICAgICA9IDB4MjA4LAorCVFVUF9NWF9XUklURV9DT1VOVCAgICAgID0gMHgxNTAsCisJUVVQX01YX09VVFBVVF9DT1VOVCAgICAgPSAweDEwMCwKKwlRVVBfTVhfSU5QVVRfQ09VTlQgICAgICA9IDB4MjAwLAorCVFVUF9NWF9XUl9DTlQgICAgICAgICAgID0gMHgxMDAsCisJUVVQX09VVF9ERUJVRyAgICAgICAgICAgPSAweDEwOCwKKwlRVVBfT1VUX0ZJRk9fQ05UICAgICAgICA9IDB4MTBDLAorCVFVUF9PVVRfRklGT19CQVNFICAgICAgID0gMHgxMTAsCisJUVVQX0lOX1JFQURfQ1VSICAgICAgICAgPSAweDIwQywKKwlRVVBfSU5fREVCVUcgICAgICAgICAgICA9IDB4MjEwLAorCVFVUF9JTl9GSUZPX0NOVCAgICAgICAgID0gMHgyMTQsCisJUVVQX0lOX0ZJRk9fQkFTRSAgICAgICAgPSAweDIxOCwKKwlRVVBfSTJDX01BU1RFUl9DTEtfQ1RMICA9IDB4NDAwLAorCVFVUF9JMkNfU1RBVFVTICAgICAgICAgID0gMHg0MDQsCisJUVVQX0kyQ19NQVNURVJfQ09ORklHICAgPSAweDQwOCwKKwlRVVBfSTJDX01BU1RFUl9CVVNfQ0xSICA9IDB4NDBDLAorfTsKKworLyogUmVnaXN0ZXI6UVVQX1NUQVRFIHN0YXRlIGZpZWxkIHZhbHVlcyAqLworZW51bSBpMmNfbXNtX3F1cF9zdGF0ZSB7CisJUVVQX1NUQVRFX1JFU0VUICAgICAgICAgPSAwLAorCVFVUF9TVEFURV9SVU4gICAgICAgICAgID0gMVUsCisJUVVQX1NUQVRFX1BBVVNFICAgICAgICAgPSAzVSwKK307CisKKy8qIFJlZ2lzdGVyOlFVUF9TVEFURSBmaWVsZHMgKi8KK2VudW0geworCVFVUF9TVEFURV9NQVNLICAgICAgICAgID0gM1UsCisJUVVQX1NUQVRFX1ZBTElEICAgICAgICAgPSBCSVQoMiksCisJUVVQX0kyQ19NQVNUX0dFTiAgICAgICAgPSBCSVQoNCksCisJUVVQX0kyQ19GTFVTSCAgICAgICAgICAgPSBCSVQoNiksCisJUVVQX0kyQ19TVEFUVVNfUkVTRVQgICAgPSAweDQyLAorfTsKKworCisvKiBSZWdpc3RlcjpRVVBfQ09ORklHIGZpZWxkcyAqLworZW51bSB7CisJUVVQX01JTklfQ09SRV9NQVNLICAgICAgPSAweEYwMCwKKwlRVVBfTUlOSV9DT1JFX0kyQ19WQUwgICA9IDB4MjAwLAorCVFVUF9OX01BU0sgICAgICAgICAgICAgID0gMHgxRiwKKwlRVVBfTl9WQUwgICAgICAgICAgICAgICA9IDB4NywgLyogMHhGIGZvciBBIGZhbWlseSAqLworCVFVUF9OT19PVVRQVVQgICAgICAgICAgID0gQklUKDYpLAorCVFVUF9OT19JTlBVVCAgICAgICAgICAgID0gQklUKDcpLAorCVFVUF9BUFBfQ0xLX09OX0VOICAgICAgID0gQklUKDEyKSwKKwlRVVBfQ09SRV9DTEtfT05fRU4gICAgICA9IEJJVCgxMyksCisJUVVQX0ZJRk9fQ0xLX0dBVEVfRU4gICAgPSBCSVQoMTQpLAorfTsKKworLyogUmVnaXN0ZXI6UVVQX09QRVJBVElPTkFMIGZpZWxkcyAqLworZW51bSB7CisJUVVQX0lOUFVUX0ZJRk9fTk9UX0VNUFRZID0gQklUKDUpLAorCVFVUF9PVVRQVVRfU0VSVklDRV9GTEFHICA9IEJJVCg4KSwKKwlRVVBfSU5QVVRfU0VSVklDRV9GTEFHICAgPSBCSVQoOSksCisJUVVQX01BWF9PVVRQVVRfRE9ORV9GTEFHID0gQklUKDEwKSwKKwlRVVBfTUFYX0lOUFVUX0RPTkVfRkxBRyAgPSBCSVQoMTEpLAorCVFVUF9PVVRfQkxPQ0tfV1JJVEVfUkVRICA9IEJJVCgxMiksCisJUVVQX0lOX0JMT0NLX1JFQURfUkVRICAgID0gQklUKDEzKSwKK307CisKKy8qIFJlZ2lzdGVyOlFVUF9PUEVSQVRJT05BTF9NQVNLIGZpZWxkcyAqLworZW51bSB7CisJUVVQX0lOUFVUX1NFUlZJQ0VfTUFTSyAgPSBCSVQoOSksCisJUVVQX09VVFBVVF9TRVJWSUNFX01BU0sgPSBCSVQoOCksCit9OworCisvKiBSZWdpc3RlcjpRVVBfSU9fTU9ERVMgZmllbGRzICovCitlbnVtIHsKKwlRVVBfT1VUUFVUX01PREUgICAgICAgICA9IEJJVCgxMCkgfCBCSVQoMTEpLAorCVFVUF9JTlBVVF9NT0RFICAgICAgICAgID0gQklUKDEyKSB8IEJJVCgxMyksCisJUVVQX1VOUEFDS19FTiAgICAgICAgICAgPSBCSVQoMTQpLAorCVFVUF9QQUNLX0VOICAgICAgICAgICAgID0gQklUKDE1KSwKKwlRVVBfT1VUUFVUX0JJVF9TSElGVF9FTiA9IEJJVCgxNiksCit9OworCisvKiBSZWdpc3RlcjpRVVBfSTJDX1NUQVRVUyAoYS5rLmEgSTJDX01BU1RFUl9TVEFUVVMpIGZpZWxkcyAqLworZW51bSB7CisJUVVQX0JVU19FUlJPUiAgICAgICAgICAgPSBCSVQoMiksCisJUVVQX1BBQ0tFVF9OQUNLRUQgICAgICAgPSBCSVQoMyksCisJUVVQX0FSQl9MT1NUICAgICAgICAgICAgPSBCSVQoNCksCisJUVVQX0lOVkFMSURfV1JJVEUgICAgICAgPSBCSVQoNSksCisJUVVQX0ZBSUxFRCAgICAgICAgICAgICAgPSBCSVQoNiksCisJUVVQX0JVU19BQ1RJVkUgICAgICAgICAgPSBCSVQoOCksCisJUVVQX0JVU19NQVNURVIgICAgICAgICAgPSBCSVQoOSksCisJUVVQX0lOVkFMSURfVEFHICAgICAgICAgPSBCSVQoMjMpLAorCVFVUF9JTlZBTElEX1JFQURfQUREUiAgID0gQklUKDI0KSwKKwlRVVBfSU5WQUxJRF9SRUFEX1NFUSAgICA9IEJJVCgyNSksCisJUVVQX0kyQ19TREEgICAgICAgICAgICAgPSBCSVQoMjYpLAorCVFVUF9JMkNfU0NMICAgICAgICAgICAgID0gQklUKDI3KSwKKwlRVVBfTVNUUl9TVFRTX0VSUl9NQVNLICA9IDB4MzgwMDAzQywKK307CisKKy8qIFJlZ2lzdGVyOlFVUF9JMkNfTUFTVEVSX0NPTkZJRyBmaWVsZHMgKi8KK2VudW0geworCVFVUF9FTl9WRVJTSU9OX1RXT19UQUcgID0gMVUsCit9OworCisvKiBSZWdpc3RlcjpRVVBfSTJDX01BU1RFUl9DTEtfQ1RMIGZpZWxkIHNldHRlcnMgKi8KKyNkZWZpbmUgSTJDX01TTV9TQ0xfTk9JU0VfUkVKRUNUSU9OKHJlZ192YWwsIG5vaXNlX3Jlal92YWwpIFwKKwkJKCgocmVnX3ZhbCkgJiB+KDB4MyA8PCAyNCkpIHwgKCgobm9pc2VfcmVqX3ZhbCkgJiAweDMpIDw8IDI0KSkKKyNkZWZpbmUgSTJDX01TTV9TREFfTk9JU0VfUkVKRUNUSU9OKHJlZ192YWwsIG5vaXNlX3Jlal92YWwpIFwKKwkJKCgocmVnX3ZhbCkgJiB+KDB4MyA8PCAyNikpIHwgKCgobm9pc2VfcmVqX3ZhbCkgJiAweDMpIDw8IDI2KSkKKworLyogUmVnaXN0ZXI6UVVQX0VSUk9SX0ZMQUdTX0VOIGZsYWdzICovCitlbnVtIHsKKwlRVVBfT1VUUFVUX09WRVJfUlVOX0VSUl9FTiAgPSBCSVQoNSksCisJUVVQX0lOUFVUX1VOREVSX1JVTl9FUlJfRU4gID0gQklUKDQpLAorCVFVUF9PVVRQVVRfVU5ERVJfUlVOX0VSUl9FTiA9IEJJVCgzKSwKKwlRVVBfSU5QVVRfT1ZFUl9SVU5fRVJSX0VOICAgPSBCSVQoMiksCit9OworCisvKiBTdGF0dXMsIEVycm9yIGZsYWdzICovCitlbnVtIHsKKwlJMkNfU1RBVFVTX1dSX0JVRkZFUl9GVUxMICA9IEJJVCgwKSwKKwlJMkNfU1RBVFVTX0JVU19BQ1RJVkUgICAgICA9IEJJVCg4KSwKKwlJMkNfU1RBVFVTX0JVU19NQVNURVIgICAgICA9IEJJVCg5KSwKKwlJMkNfU1RBVFVTX0VSUk9SX01BU0sgICAgICA9IDB4MzgwMDBGQywKKwlRVVBfSTJDX05BQ0tfRkxBRyAgICAgICAgICA9IEJJVCgzKSwKKwlRVVBfSU5fTk9UX0VNUFRZICAgICAgICAgICA9IEJJVCg1KSwKKwlRVVBfRVJSX0ZMR1NfTUFTSyAgICAgICAgICAgPSAweDNDLAorfTsKKworLyogTWFzdGVyIHN0YXR1cyBjbG9jayBzdGF0ZXMgKi8KK2VudW0geworCUkyQ19DTEtfUkVTRVRfQlVTSURMRV9TVEFURSA9IDAsCisJSTJDX0NMS19GT1JDRURfTE9XX1NUQVRFICAgID0gNSwKK307CisKKy8qIENvbnRyb2xsZXIncyBwb3dlciBzdGF0ZSAqLworZW51bSBpMmNfbXNtX3Bvd2VyX3N0YXRlIHsKKwlJMkNfTVNNX1BNX1JUX0FDVElWRSwKKwlJMkNfTVNNX1BNX1JUX1NVU1BFTkRFRCwKKwlJMkNfTVNNX1BNX1NZU19TVVNQRU5ERUQKK307CisKKy8qCisgKiBUaGUgbWF4IGJ1ZmZlciBzaXplIHJlcXVpcmVkIGZvciB0YWdzIGlzIGZvciBob2xkaW5nIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisgKiBbc3RhcnRdICsgW3N0YXJ0IHwgc2x2LWFkZHJdICsgWyByZC93ciB8IGxlbl0KKyAqIHdoaWNoIHN1bSB1cCB0byA2IGJ5dGVzLiBIb3dldmVyLCB3ZSB1c2UgdTY0IHRvIGhvbGQgdGhlIHZhbHVlLCB0aHVzIHdlIHNheQorICogdGhhdCBtYXggbGVuZ3RoIGlzIDggYnl0ZXMuCisgKi8KKyNkZWZpbmUgSTJDX01TTV9UQUcyX01BWF9MRU4gICAgICAgICAgICAoNCkKKyNkZWZpbmUgSTJDX01TTV9ETUFfVFhfU1ogICAgICAgICAgICAgKDY0KSAvKiB0eCBjaGFuIG4gZW50cmllcyAqLworI2RlZmluZSBJMkNfTVNNX0RNQV9SWF9TWiAgICAgICAgICAgICAoMzIpIC8qIHJ4IGNoYW4gbiBlbnRyaWVzICovCisjZGVmaW5lIEkyQ19NU01fRE1BX0RFU0NfQVJSX1NJWiAgKEkyQ19NU01fRE1BX1RYX1NaICsgSTJDX01TTV9ETUFfUlhfU1opCisjZGVmaW5lIEkyQ19NU01fUkVHXzJfU1RSX0JVRl9TWiAgICAgICAgKDEyOCkKKy8qIE9wdGltYWwgdmFsdWUgdG8gaG9sZCB0aGUgZXJyb3Igc3RyaW5ncyAqLworI2RlZmluZSBJMkNfTVNNX01BWF9FUlJfQlVGX1NaCQkoMjU2KQorI2RlZmluZSBJMkNfTVNNX0JVRl9EVU1QX01BWF9CQyAgICAgICAgICgyMCkKKyNkZWZpbmUgSTJDX01TTV9NQVhfUE9MTF9NU0VDICAgICAgICAgICAoMTAwKQorI2RlZmluZSBJMkNfTVNNX1RJTUVPVVRfU0FGRVRZX0NPRUYgICAgICgxMCkKKyNkZWZpbmUgSTJDX01TTV9USU1FT1VUX01JTl9VU0VDICAgICAgICAoNTAwMDAwKQorI2RlZmluZSBJMkNfUVVQX01BWF9CVVNfUkVDT1ZFUllfUkVUUlkgICgxMCkKKworLyogUVVQIHYyIHRhZ3MgKi8KKyNkZWZpbmUgUVVQX1RBRzJfREFUQV9XUklURSAgICAgICAgKDB4ODJVTEwpCisjZGVmaW5lIFFVUF9UQUcyX0RBVEFfV1JJVEVfTl9TVE9QICgweDgzVUxMKQorI2RlZmluZSBRVVBfVEFHMl9EQVRBX1JFQUQgICAgICAgICAoMHg4NVVMTCkKKyNkZWZpbmUgUVVQX1RBRzJfREFUQV9SRUFEX05fU1RPUCAgKDB4ODdVTEwpCisjZGVmaW5lIFFVUF9UQUcyX1NUQVJUICAgICAgICAgICAgICgweDgxVUxMKQorI2RlZmluZSBRVVBfVEFHMl9EQVRBX1JFQURfTl9OQUNLICAoMHg4NlVMTCkKKyNkZWZpbmUgUVVQX1RBRzJfU1RBUlRfU1RPUCAgICAgICAgKDB4OEFVTEwpCisjZGVmaW5lIFFVUF9UQUcyX0lOUFVUX0VPVCAgICAgICAgICgweDkzVUxMKQorI2RlZmluZSBRVVBfVEFHMl9GTFVTSF9TVE9QICAgICAgICAoMHg5NlVMTCkKKyNkZWZpbmUgUVVQX0JVRl9PVkVSSERfQkMgICAgICAgICAgKDIpCisjZGVmaW5lIFFVUF9NQVhfQlVGX1NaICAgICAgICAgICAgICgyNTYpCisKK2VudW0gaTJjX21zbV9jbGtfcGF0aF92ZWNfaWR4IHsKKwlJMkNfTVNNX0NMS19QQVRIX1NVU1BFTkRfVkVDLAorCUkyQ19NU01fQ0xLX1BBVEhfUkVTVU1FX1ZFQywKK307CisjZGVmaW5lIEkyQ19NU01fQ0xLX1BBVEhfQVZSR19CVyhjdHJsKSAoMCkKKyNkZWZpbmUgSTJDX01TTV9DTEtfUEFUSF9CUlNUX0JXKGN0cmwpIChjdHJsLT5yc3Jjcy5jbGtfZnJlcV9pbiAqIDgpCisKK2VudW0gaTJjX21zbV9ncGlvX25hbWVfaWR4IHsKKwlJMkNfTVNNX0dQSU9fU0NMLAorCUkyQ19NU01fR1BJT19TREEsCit9OworCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGkyY19tc21fbW9kZV9zdHJfdGJsW107CisKK3N0cnVjdCBpMmNfbXNtX2N0cmw7CisKKy8qCisgKiAgaTJjX21zbV9kbWFfbWVtOiB1dGlsaXR5IHN0cnVjdCB3aGljaCBob2xkcyBib3RoIHBoeXNpY2FsIGFuZCB2aXJ0dWFsIGFkZHIKKyAqLworc3RydWN0IGkyY19tc21fZG1hX21lbSB7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgIHBoeV9hZGRyOworCXZvaWQgICAgICAgICAgICAgICAgICAgICp2cnRsX2FkZHI7Cit9OworCisvKgorICogaTJjX21zbV90YWc6IHRhZydzIGRhdGEgYW5kIGl0cyBsZW5ndGguCisgKgorICogQGxlbiB0YWcgbGVuIGNhbiBiZSB0d28sIGZvdXIgb3Igc2l4IGJ5dGVzLgorICovCitzdHJ1Y3QgaTJjX21zbV90YWcgeworCXU2NCAgICAgICAgICAgICAgICAgICAgdmFsOworCWludCAgICAgICAgICAgICAgICAgICAgbGVuOworfTsKKworLyoKKyAqIGkyY19tc21fZG1hX3RhZzogc2ltaWxhciB0byBzdHJ1Y3QgaTJjX21zbV90YWcgYnV0IGhvbGRzIHBoeXNpY2FsIGFkZHJlc3MuCisgKgorICogQGJ1ZiBwaHlzaWNhbCBhZGRyZXNzIG9mIGVudHJ5IGluIHRoZSB0YWdfYXJyIG9mCisgKiAgICAgICAgICBzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZG1hCisgKiBAbGVuIHRhZyBsZW4uCisgKgorICogSG9sZCB0aGUgaW5mb3JtYXRpb24gZnJvbSBpMmNfbXNtX2RtYV94ZmVyX3ByZXBhcmUoKSB3aGljaCBpcyB1c2VkIGJ5CisgKiBpMmNfbXNtX2RtYV94ZmVyX3Byb2Nlc3MoKSBhbmQgZnJlZWQgYnkgaTJjX21zbV9kbWFfeGZlcl91bnByZXBhcmUoKQorICovCitzdHJ1Y3QgaTJjX21zbV9kbWFfdGFnIHsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgIGJ1ZjsKKwlzaXplX3QgICAgICAgICAgICAgICAgIGxlbjsKK307CisKKy8qCisgKiBpMmNfbXNtX2RtYV9idWY6IGRtYSBtYXBwZWQgcG9pbnRlciB0byBpMmNfbXNnIGRhdGEgYnVmZmVyIGFuZCByZWxhdGVkIHRhZworICogQHZpcl9hZGRyIHB0ciB0byBpMmNfbXNnIGJ1ZiBiZWdpbm5pbmcgb3Igd2l0aCBvZmZzZXQgKHdoZW4gYnVmIGxlbiA+IDI1NikKKyAqLworc3RydWN0IGkyY19tc21fZG1hX2J1ZiB7CisJc3RydWN0IGkyY19tc21fZG1hX21lbSAgIHB0cjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiAgZG1hX2RpcjsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgbGVuOworCWJvb2wgICAgICAgICAgICAgICAgICAgICBpc19yeDsKKwlib29sICAgICAgICAgICAgICAgICAgICAgaXNfbGFzdDsKKwlzdHJ1Y3QgaTJjX21zbV9kbWFfdGFnICAgdGFnOworCS8qIERNQSBBUEkgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJc2dfbGlzdFsyXTsKK307CisKKy8qCisgKiBpMmNfbXNtX2RtYV9jaGFuOiBwZXIgY2hhbm5lbCBpbmZvCisgKgorICogQGlzX2luaXQgdHJ1ZSB3aGVuIHRoZSBjaGFubmVsIGlzIGluaXRpYWxpemVkIGFuZCByZXF1aXJlcyBldmVudHVhbCB0ZWFyZG93bi4KKyAqIEBuYW1lIGNoYW5uZWwgbmFtZSAodHgvcngpIGZvciBkZWJ1Z2dpbmcuCisgKiBAZGVzY19jbnRfY3VyIG51bWJlciBvZiBvY2N1cGllZCBkZXNjcmlwdG9ycworICovCitzdHJ1Y3QgaTJjX21zbV9kbWFfY2hhbiB7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgIGlzX2luaXQ7CisJY29uc3QgY2hhciAgICAgICAgICAgICAgKm5hbWU7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgIGRlc2NfY250X2N1cjsKKwlzdHJ1Y3QgZG1hX2NoYW4gICAgICAgICAqZG1hX2NoYW47CisJZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKK307CisKK2VudW0gaTJjX21zbV9kbWFfY2hhbl9kaXIgeworCUkyQ19NU01fRE1BX1RYLAorCUkyQ19NU01fRE1BX1JYLAorCUkyQ19NU01fRE1BX0NOVCwKK307CisKK2VudW0gaTJjX21zbV9kbWFfc3RhdGUgeworCUkyQ19NU01fRE1BX0lOSVRfTk9ORSwgLyogVW5pbml0aWFsaXplZCAgRE1BICovCisJSTJDX01TTV9ETUFfSU5JVF9DT1JFLCAvKiBDb3JlIGluaXQgbm90IGNoYW5uZWxzLCBtZW1vcnkgQWxsb2NhdGVkICovCisJSTJDX01TTV9ETUFfSU5JVF9DSEFOLCAvKiBCb3RoIENvcmUgYW5kIGNoYW5uZWxzIGFyZSBpbml0ICovCit9OworCisvKgorICogc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2RtYTogRE1BIG1vZGUgY29uZmlndXJhdGlvbiBhbmQgd29yayBzcGFjZQorICoKKyAqIEBzdGF0ZSAgIHNwZWNpZmllcyB0aGUgRE1BIGNvcmUgYW5kIGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gc3RhdGVzLgorICogQGJ1Zl9hcnJfY250IGN1cnJlbnQgbnVtYmVyIG9mIHZhbGlkIGJ1ZmZlcnMgaW4gYnVmX2Fyci4gVGhlIHZhbGlkIGJ1ZmZlcnMKKyAqICAgICAgICAgIGFyZSBhdCBpbmRleCAwLi5idWZfYXJyX2NudCBleGNsdWRpbmcgYnVmX2Fycl9jbnQuCisgKiBAYnVmX2FyciBhcnJheSBvZiBkZXNjcmlwdG9ycyB3aGljaCBwb2ludCB0byB0aGUgdXNlcidzIGJ1ZmZlcgorICogICAgIHZpcnR1YWwgYW5kIHBoeXNpY2FsIGFkZHJlc3MsIGFuZCBob2xkIG1ldGEgZGF0YSBhYm91dCB0aGUgYnVmZmVyCisgKiAgICAgYW5kIHJlc3BlY3RpdmUgdGFnLgorICogQHRhZ19hcnIgYXJyYXkgb2YgdGFncyBpbiBETUFhYmxlIG1lbW9yeS4gSG9sZHMgYSB0YWcgcGVyIGJ1ZmZlciBvZiB0aGUgc2FtZQorICogICAgICAgICAgaW5kZXgsIHRoYXQgaXMgdGFnX2FycltpXSBpcyByZWxhdGVkIHRvIGJ1Zl9hcnJbaV0uIEFsc28sIHRhZ19hcnJbaV0KKyAqICAgICAgICAgIGlzIHF1ZXVlZCBpbiB0aGUgdHggY2hhbm5lbCBqdXN0IGJlZm9yZSBidWZfYXJyW2ldIGlzIHF1ZXVlZCBpbgorICogICAgICAgICAgdGhlIHR4IChvdXRwdXQgYnVmKSBvciByeCBjaGFubmVsIChpbnB1dCBidWZmZXIpLgorICogQGVvdF9uX2ZsdXNoX3N0b3BfdGFncyBFT1QgYW5kIGZsdXNoLXN0b3AgdGFncyB0byBiZSBxdWV1ZWQgdG8gdGhlIHR4CisgKiAgICAgICAgICBETUEgY2hhbm5lbCBhZnRlciB0aGUgbGFzdCB0cmFuc2ZlciB3aGVuIGl0IGlzIGEgcmVhZC4KKyAqIEBpbnB1dF90YWcgaHcgaXMgcGxhY2luZyBpbnB1dCB0YWdzIGluIHRoZSByeCBjaGFubmVsIG9uIHJlYWQgb3BlcmF0aW9ucy4KKyAqICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGVzZSB0YWdzIGlzICJkb24ndCBjYXJlIiBmcm9tIERNQSB0cmFuc2ZlcgorICogICAgICAgICAgcGVyc3BlY3RpdmUuIFRodXMsIHRoaXMgc2luZ2xlIGJ1ZmZlciBpcyB1c2VkIGZvciBhbGwgdGhlIGlucHV0CisgKiAgICAgICAgICB0YWdzLiBUaGUgZmllbGQgaXMgdXNlZCBhcyB3cml0ZSBvbmx5LgorICovCitzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZG1hIHsKKwllbnVtIGkyY19tc21fZG1hX3N0YXRlICAgc3RhdGU7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgIGJ1Zl9hcnJfY250OworCXN0cnVjdCBpMmNfbXNtX2RtYV9idWYgICBidWZfYXJyW0kyQ19NU01fRE1BX0RFU0NfQVJSX1NJWl07CisJc3RydWN0IGkyY19tc21fZG1hX21lbSAgIHRhZ19hcnI7CisJc3RydWN0IGkyY19tc21fZG1hX21lbSAgIGVvdF9uX2ZsdXNoX3N0b3BfdGFnczsKKwlzdHJ1Y3QgaTJjX21zbV9kbWFfbWVtICAgaW5wdXRfdGFnOworCXN0cnVjdCBpMmNfbXNtX2RtYV9jaGFuICBjaGFuW0kyQ19NU01fRE1BX0NOVF07Cit9OworCisvKgorICogSTJDX01TTV9ETUFfVEFHX01FTV9TWiBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZpZWxkcyBvZgorICogc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2RtYSAoaW4gb3JkZXIpOgorICoKKyAqIEJ1ZmZlciBvZiBETUEgbWVtb3J5OgorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tKy0tLS0tLS0tLS0tKworICogfCBpbnB1dF90YWcgfCBlb3RfLi4uIHwgdGFnX2FyciAwIHwgdGFnX2FyciAxIHwgLi4gfCB0YWdfYXJyIG4gfAorICogKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tKy0tLS0tLS0tLS0tKworICoKKyAqIFdoeSArMj8KKyAqIE9uZSB0YWcgYnVmZmVyIGZvciB0aGUgaW5wdXQgdGFncy4gVGhpcyBpcyBhIHdyaXRlIG9ubHkgYnVmZmVyIGZvciBETUEsIGl0IGlzCisgKiAgICB1c2VkIHRvIHJlYWQgdGhlIHRhZ3Mgb2YgdGhlIGlucHV0IGZpZm8uIFdlIGxldCB0aGVtIG92ZXJ3cml0ZSBlYWNoIG90aGVyLAorICogICAgc2luY2UgaXQgaXMgYSB0aHJvdy1hd2F5IGZyb20gdGhlIGRyaXZlcidzIHBlcnNwZWN0aXZlLgorICogU2Vjb25kIHRhZyBidWZmZXIgZm9yIHRoZSBFT1QgYW5kIGZsdXNoLXN0b3AgdGFncy4gVGhpcyBpcyBhIHJlYWQgb25seQorICogICAgYnVmZmVyIChmcm9tIERNQSBwZXJzcGVjdGl2ZSkuIEl0IGlzIHVzZWQgdG8gcHV0IEVPVCBhbmQgZmx1c2gtc3RvcCBhdCB0aGUKKyAqICAgIGVuZCBvZiBldmVyeSB0cmFuc2FjdGlvbi4KKyAqLworI2RlZmluZSBJMkNfTVNNX0RNQV9UQUdfTUVNX1NaICBcCisJKChJMkNfTVNNX0RNQV9ERVNDX0FSUl9TSVogKyAyKSAqIEkyQ19NU01fVEFHMl9NQVhfTEVOKQorCisvKgorICogaTJjX21zbV94ZmVyX21vZGVfZmlmbzogb3BlcmF0aW9ucyBhbmQgc3RhdGUgb2YgRklGTyBtb2RlCisgKgorICogQG9wcyAgICAgImJhc2UgY2xhc3MiIG9mIGkyY19tc21feGZlcl9tb2RlX2RtYS4gQ29udGFpbnMgdGhlIG9wZXJhdGlvbnMgd2hpbGUKKyAqICAgICAgICAgIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgY29udGFpbiB0aGUgZGF0YS4KKyAqIEBpbnB1dF9maWZvX3N6IGlucHV0IGZpZm8gc2l6ZSBpbiBieXRlcworICogQG91dHB1dF9maWZvX3N6IG91dHB1dCBmaWZvIHNpemUgaW4gYnl0ZXMKKyAqIEBpbl9yZW0gIHJlbWFpbmluZyB1MzIgZW50cmllcyBpbiBpbnB1dCBGSUZPIGJlZm9yZSBlbXB0eQorICogQG91dF9yZW0gcmVtYWluaW5nIHUzMiBlbnRyaWVzIGluIG91dHB1dCBGSUZPIGJlZm9yZSBmdWxsCisgKiBAb3V0X2J1ZiBidWZmZXIgZm9yIGNvbGxlY3RpbmcgYnl0ZXMgdG8gZm91ciBieXRlcyBncm91cHMgKHUzMikgYmVmb3JlCisgKiAgICAgICAgICB3cml0aW5nIHRoZW0gdG8gdGhlIG91dHB1dCBmaWZvLgorICogQG91dF9idWZfaWR4IG5leHQgZnJlZSBpbmRleCBpbiBvdXRfYnVmLiAwLi4zCisgKi8KK3N0cnVjdCBpMmNfbXNtX3hmZXJfbW9kZV9maWZvIHsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgaW5wdXRfZmlmb19zejsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpZm9fc3o7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgIGluX3JlbTsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgb3V0X3JlbTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgb3V0X2J1Zls0XTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgb3V0X2J1Zl9pZHg7Cit9OworCisvKiBpMmNfbXNtX3hmZXJfbW9kZV9ibGs6IG9wZXJhdGlvbnMgYW5kIHN0YXRlIG9mIEJsb2NrIG1vZGUKKyAqCisgKiBAaXNfaW5pdCB3aGVuIHRydWUsIHN0cnVjdCBpcyBpbml0aWFsaXplZCBhbmQgcmVxdWlyZXMgbWVtIGZyZWUgb24gZXhpdAorICogQGluX2Jsa19zeiBzaXplIG9mIGlucHV0L3J4IGJsb2NrCisgKiBAb3V0X2Jsa19zeiBzaXplIG9mIG91dHB1dC90eCBibG9jaworICogQHR4X2NhY2hlIGludGVybmFsIGJ1ZmZlciB0byBzdG9yZSB0eCBkYXRhCisgKiBAcnhfY2FjaGUgaW50ZXJuYWwgYnVmZmVyIHRvIHN0b3JlIHJ4IGRhdGEKKyAqIEByeF9jYWNoZV9pZHggcG9pbnRzIHRvIHRoZSBuZXh0IHVucmVhZCBpbmRleCBpbiByeCBjYWNoZQorICogQHR4X2NhY2hlX2lkeCBwb2ludHMgdG8gdGhlIG5leHQgdW53cml0dGVuIGluZGV4IGluIHR4IGNhY2hlCisgKiBAd2FpdF9yeF9ibGsgY29tcGxldGlvbiBvYmplY3QgdG8gd2FpdCBvbiBmb3IgZW5kIG9mIGJsayByeCB0cmFuc2Zlci4KKyAqIEB3YWl0X3R4X2JsayBjb21wbGV0aW9uIG9iamVjdCB0byB3YWl0IG9uIGZvciBlbmQgb2YgYmxrIHR4IHRyYW5zZmVyLgorICogQGNvbXBsZXRlX21hc2sgYXBwbGllZCB0byBRVVBfT1BFUkFUSU9OQUwgdG8gZGV0ZXJtaW5lIHdoZW4gYmxrCisgKiAgeGZlciBpcyBjb21wbGV0ZS4KKyAqLworc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2JsayB7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgIGlzX2luaXQ7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgIGluX2Jsa19zejsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgb3V0X2Jsa19zejsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgKnR4X2NhY2hlOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAqcnhfY2FjaGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgIHJ4X2NhY2hlX2lkeDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgdHhfY2FjaGVfaWR4OworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICB3YWl0X3J4X2JsazsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgd2FpdF90eF9ibGs7CisJdTMyICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlX21hc2s7Cit9OworCisvKiBJTlBVVF9NT0RFIGFuZCBPVVRQVVRfTU9ERSBmaWxkcyBvZiBRVVBfSU9fTU9ERVMgcmVnaXN0ZXIgKi8KK2VudW0gaTJjX21zbV94ZmVyX21vZGVfaWQgeworCUkyQ19NU01fWEZFUl9NT0RFX0ZJRk8sCisJSTJDX01TTV9YRkVSX01PREVfQkxPQ0ssCisJSTJDX01TTV9YRkVSX01PREVfRE1BLAorCUkyQ19NU01fWEZFUl9NT0RFX05PTkUsIC8qIGtlZXAgbGFzdCBhcyBhIGNvdW50ZXIgKi8KK307CisKKworc3RydWN0IGkyY19tc21fZGJnZnMgeworCXN0cnVjdCBkZW50cnkgICAgICAgICAgICAgKnJvb3Q7CisJZW51bSBtc21faTJfZGVidWdfbGV2ZWwgICAgZGJnX2x2bDsKKwllbnVtIGkyY19tc21feGZlcl9tb2RlX2lkICBmb3JjZV94ZmVyX21vZGU7Cit9OworCisvKgorICogcXVwX2kyY19jbGtfcGF0aF92b3RlOiBkYXRhIHRvIHVzZSBidXMgc2NhbGluZyBkcml2ZXIgZm9yIGNsb2NrIHBhdGggdm90ZQorICoKKyAqIEBtc3RyX2lkIG1hc3RlciBpZCBudW1iZXIgb2YgdGhlIGkyYyBjb3JlIG9yIGl0cyB3cmFwcGVyIChCTFNQL0dTQkkpLgorICogICAgICAgV2hlbiB6ZXJvLCBjbG9jayBwYXRoIHZvdGluZyBpcyBkaXNhYmxlZC4KKyAqIEBjbGllbnRfaGRsIHdoZW4gemVybywgY2xpZW50IGlzIG5vdCByZWdpc3RlcmVkIHdpdGggdGhlIGJ1cyBzY2FsaW5nIGRyaXZlciwKKyAqICAgICAgYW5kIGJ1cyBzY2FsaW5nIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIG5vdCBiZSB1c2VkLiBXaGVuIG5vbiB6ZXJvLCBpdAorICogICAgICBpcyBhIGJ1cyBzY2FsaW5nIGNsaWVudCBpZCBhbmQgbWF5IGJlIHVzZWQgdG8gdm90ZSBmb3IgY2xvY2sgcGF0aC4KKyAqIEByZWdfZXJyIHdoZW4gdHJ1ZSwgcmVnaXN0cmF0aW9uIGVycm9yIHdhcyBkZXRlY3RlZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSB3YXMKKyAqICAgICAgbG9nZ2VkLiBpMmMgd2lsbCBhdHRlbXB0IHRvIHJlLXJlZ2lzdGVyIGJ1dCB3aWxsIGxvZyBlcnJvciBvbmx5IG9uY2UuCisgKiAgICAgIG9uY2UgcmVnaXN0cmF0aW9uIHN1Y2NlZWQsIHRoZSBmbGFnIGlzIHNldCB0byBmYWxzZS4KKyAqIEBhY3R2X29ubHkgd2hlbiBzZXQsIHZvdGVzIHdoZW4gc3lzdGVtIGFjdGl2ZSBhbmQgcmVtb3ZlcyB0aGUgdm90ZSB3aGVuCisgKiAgICAgICBzeXN0ZW0gZ29lcyBpZGxlIChvcHRpbWlzZXMgZm9yIHBlcmZvcm1hbmNlKS4gV2hlbiB1bnNldCwgdm90aW5nIHVzaW5nCisgKiAgICAgICBydW50aW1lIHBtIChvcHRpbWl6ZXMgZm9yIHBvd2VyKS4KKyAqLworc3RydWN0IHF1cF9pMmNfY2xrX3BhdGhfdm90ZSB7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIG1zdHJfaWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9oZGw7CisJc3RydWN0IG1zbV9idXNfc2NhbGVfcGRhdGEgKnBkYXRhOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICByZWdfZXJyOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICBhY3R2X29ubHk7Cit9OworCisvKgorICogaTJjX21zbV9yZXNvdXJjZXM6IE9TIHJlc291cmNlcworICoKKyAqIEBtZW0gIEkyQyBjb250cm9sbGVyIG1lbW9yeSByZXNvdXJjZSBmcm9tIHBsYXRmb3JtIGRhdGEuCisgKiBAYmFzZSBJMkMgY29udHJvbGxlciB2aXJ0dWFsIGJhc2UgYWRkcmVzcworICogQGNsa19mcmVxX2luIGNvcmUgY2xvY2sgZnJlcXVlbmN5IGluIEh6CisgKiBAY2xrX2ZyZXFfb3V0IGJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHoKKyAqLworc3RydWN0IGkyY19tc21fcmVzb3VyY2VzIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICAgICAgKm1lbTsKKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAgICAgKmJhc2U7IC8qIHZpcnR1YWwgKi8KKwlzdHJ1Y3QgY2xrICAgICAgICAgICAgICAgICAgKmNvcmVfY2xrOworCXN0cnVjdCBjbGsgICAgICAgICAgICAgICAgICAqaWZhY2VfY2xrOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgY2xrX2ZyZXFfaW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBjbGtfZnJlcV9vdXQ7CisJc3RydWN0IHF1cF9pMmNfY2xrX3BhdGhfdm90ZSBjbGtfcGF0aF92b3RlOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZV9kbWE7CisJc3RydWN0IHBpbmN0cmwgICAgICAgICAgICAgICpwaW5jdHJsOworCXN0cnVjdCBwaW5jdHJsX3N0YXRlICAgICAgICAqZ3Bpb19zdGF0ZV9hY3RpdmU7CisJc3RydWN0IHBpbmN0cmxfc3RhdGUgICAgICAgICpncGlvX3N0YXRlX3N1c3BlbmQ7Cit9OworCisjZGVmaW5lIEkyQ19NU01fUElOQ1RSTF9BQ1RJVkUgICAgICAgImkyY19hY3RpdmUiCisjZGVmaW5lIEkyQ19NU01fUElOQ1RSTF9TVVNQRU5EICAgICAgImkyY19zbGVlcCIKKworLyoKKyAqIGkyY19tc21feGZlcl9idWY6IGN1cnJlbnQgeGZlciBwb3NpdGlvbiBhbmQgcHJlcHJvY2Vzc2VkIHRhZ3MKKyAqCisgKiBAaXNfaW5pdCB0aGUgYnVmIGlzIG1hcmtlZCBpbml0aWFsaXplZCBieSB0aGUgZmlyc3QgY2FsbCB0bworICogICAgICAgICAgaTJjX21zbV94ZmVyX25leHRfYnVmKCkKKyAqIEBtc2dfaWR4ICAgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGUgYnVmZmVyIGlzIHBvaW50aW5nIHRvCisgKiBAYnl0ZV9pZHggIGluZGV4IG9mIGZpcnN0IGJ5dGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyCisgKiBAZW5kX2lkeCAgIGNvdW50IG9mIGJ5dGVzIHByb2Nlc3NlZCBmcm9tIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFRoaXMgdmFsdWUKKyAqICAgICAgICAgICAgaXMgY29tcGFyZWQgYWdhaW5zdCBsZW4gdG8gZmluZCBvdXQgaWYgYnVmZmVyIGlzIGRvbmUgcHJvY2Vzc2luZy4KKyAqIEBsZW4gICAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIGN1cnJlbnQgYnVmZmVyLgorICogQGlzX3J4IHdoZW4gdHJ1ZSwgY3VycmVudCBidWZmZXIgaXMgcG9pbnRpbmcgdG8gYSBpMmMgcmVhZCBvcGVyYXRpb24uCisgKiBAc2x2X2FkZHIgOCBiaXQgYWRkcmVzcy4gVGhpcyBpcyB0aGUgaTJjX21zZy0+YWRkciArIHJkL3dyIGJpdC4KKyAqCisgKiBLZWVwIHRyYWNrIG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGNsaWVudCdzIHRyYW5zZmVyIHJlcXVlc3QgYW5kCisgKiBwcmUtcHJvY2VzcyBhIHRyYW5zZmVyJ3MgYnVmZmVyIGFuZCB0YWdzLgorICovCitzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiB7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNfaW5pdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICBtc2dfaWR4OworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfaWR4OworCWludCAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pZHg7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbGVuOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzX3J4OworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzX2xhc3Q7CisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgc2x2X2FkZHI7CisJc3RydWN0IGkyY19tc21fdGFnICAgICAgICAgaW5fdGFnOworCXN0cnVjdCBpMmNfbXNtX3RhZyAgICAgICAgIG91dF90YWc7Cit9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgSTJDX01TTV9QUk9GX01BWF9FVk5UUyAgICg2NCkKKyNlbHNlCisjZGVmaW5lIEkyQ19NU01fUFJPRl9NQVhfRVZOVFMgICAoMTYpCisjZW5kaWYKKworLyoKKyAqIGkyY19tc21fcHJvZl9ldmVudDogcHJvZmlsaW5nIGV2ZW50CisgKgorICogQGRhdGEgQWRkaXRpb25hbCBkYXRhIGFib3V0IHRoZSBldmVudC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhIGlzCisgKiAgICAgICBkZXBlbmRlbnQgb24gdGhlIHR5cGUgZmllbGQuCisgKiBAdHlwZSBldmVudCB0eXBlIChzZWUgZW51bSBpMmNfbXNtX3Byb2ZfZXZlbnRfdHlwZSkKKyAqLworc3RydWN0IGkyY19tc21fcHJvZl9ldmVudCB7CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisJdTY0ICAgICAgICAgICAgIGRhdGEwOworCXUzMiAgICAgICAgICAgICBkYXRhMTsKKwl1MzIgICAgICAgICAgICAgZGF0YTI7CisJdTggICAgICAgICAgICAgIHR5cGU7CisJdTggICAgICAgICAgICAgIGR1bXBfZnVuY19pZDsKK307CisKK2VudW0gaTJjX21zbV9lcnIgeworCUkyQ19NU01fTk9fRVJSID0gMCwKKwlJMkNfTVNNX0VSUl9OQUNLLAorCUkyQ19NU01fRVJSX0FSQl9MT1NULAorCUkyQ19NU01fRVJSX0JVU19FUlIsCisJSTJDX01TTV9FUlJfVElNRU9VVCwKKwlJMkNfTVNNX0VSUl9DT1JFX0NMSywKKwlJMkNfTVNNX0VSUl9PVlJfVU5EUl9SVU4sCit9OworCisvKgorICogaTJjX21zbV94ZmVyOiBBIGNsaWVudCB0cmFuc2ZlciByZXF1ZXN0LiBBIGxpc3Qgb2Ygb25lIG9yIG1vcmUgaTJjIG1lc3NhZ2VzCisgKgorICogQG1zZ3MgICAgICAgICBOVUxMIHdoZW4gbm8gYWN0aXZlIHhmZXIuIFBvaW50cyB0byBhcnJheSBvZiBpMmNfbXNncworICogICAgICAgICAgICAgICBnaXZlbiBieSB0aGUgY2xpZW50LgorICogQG1zZ19jbnQgICAgICBudW1iZXIgb2YgbWVzc2FnZXMgaW4gbXNncyBhcnJheS4KKyAqIEBjb21wbGV0ZSAgICAgY29tcGxldGlvbiBvYmplY3QgdG8gd2FpdCBvbiBmb3IgZW5kIG9mIHRyYW5zZmVyLgorICogQHJ4X2NudCAgICAgICBudW1iZXIgb2YgaW5wdXQgIGJ5dGVzIGluIHRoZSBjbGllbnQncyByZXF1ZXN0LgorICogQHR4X2NudCAgICAgICBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIGluIHRoZSBjbGllbnQncyByZXF1ZXN0LgorICogQHJ4X292cmhkX2NudCBudW1iZXIgb2YgaW5wdXQgIGJ5dGVzIGR1ZSB0byB0YWdzLgorICogQHR4X292cmhkX2NudCBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIGR1ZSB0byB0YWdzLgorICogQGV2ZW50ICAgICAgICBwcm9maWxpbmcgZGF0YS4gQW4gYXJyYXkgb2YgdGltZXN0YW1wcyBvZiB0cmFuc2ZlciBldmVudHMKKyAqIEBldmVudF9jbnQgICAgbnVtYmVyIG9mIGl0ZW1zIGluIGV2ZW50IGFycmF5LgorICogQGlzX2FjdGl2ZSAgICB0cnVlIGR1cmluZyB4ZmVyIHByb2Nlc3MgYW5kIGZhbHNlIGFmdGVyIHhmZXIgZW5kCisgKiBAbXR4ICAgICAgICAgIG11dGV4IHRvIHNvbHZlIG11bHRpdGhyZWFkZWQgcHJvYmxlbSBpbiB4ZmVyCisgKi8KK3N0cnVjdCBpMmNfbXNtX3hmZXIgeworCXN0cnVjdCBpMmNfbXNnICAgICAgICAgICAgKm1zZ3M7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgbXNnX2NudDsKKwllbnVtIGkyY19tc21feGZlcl9tb2RlX2lkICBtb2RlX2lkOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgIGNvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgIHJ4X2NvbXBsZXRlOworCXNpemVfdCAgICAgICAgICAgICAgICAgICAgIHJ4X2NudDsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgICB0eF9jbnQ7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgcnhfb3ZyaGRfY250OworCXNpemVfdCAgICAgICAgICAgICAgICAgICAgIHR4X292cmhkX2NudDsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX2J1ZiAgICBjdXJfYnVmOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9pc19yeDsKKwllbnVtIGkyY19tc21fZXJyICAgICAgICAgICBlcnI7CisJc3RydWN0IGkyY19tc21fcHJvZl9ldmVudCAgZXZlbnRbSTJDX01TTV9QUk9GX01BWF9FVk5UU107CisJYXRvbWljX3QgICAgICAgICAgICAgICAgICAgZXZlbnRfY250OworCWF0b21pY190ICAgICAgICAgICAgICAgICAgIGlzX2FjdGl2ZTsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICBtdHg7CisJc3RydWN0IGkyY19tc21feGZlcl9tb2RlX2ZpZm8JZmlmbzsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfYmxrCWJsazsKKwlzdHJ1Y3QgaTJjX21zbV94ZmVyX21vZGVfZG1hCWRtYTsKK307CisKKy8qCisgKiBpMmNfbXNtX2N0cmw6IHRoZSBkcml2ZXIncyBtYWluIHN0cnVjdAorICoKKyAqIEBpc19pbml0IHRydWUgd2hlbgorICogQHZlciBpbmZvIHRoYXQgaXMgZGlmZmVyZW50IGJldHdlZW4gaTJjIGNvbnRyb2xsZXIgdmVyc2lvbnMKKyAqIEB2ZXJfbnVtICBoYQorICogQHhmZXIgICAgIHN0YXRlIG9mIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHRyYW5zZmVyLgorICogQGRiZ2ZzICAgIGRlYnVnLWZzIHJvb3QgYW5kIHZhbHVlcyB0aGF0IG1heSBiZSBzZXQgdmlhIGRlYnVnLWZzLgorICogQHJzcmNzICAgIHJlc291cmNlcyBmcm9tIHBsYXRmb3JtIGRhdGEgaW5jbHVkaW5nIGNsb2NrcywgZ3Bpb3MsIGlycXMsIGFuZAorICogICAgICAgICAgIG1lbW9yeSByZWdpb25zLgorICogQG1zdHJfY2xrX2N0bCBjYWNoZWQgdmFsdWUgZm9yIHByb2dyYW1taW5nIHRvIG1zdHJfY2xrX2N0bCByZWdpc3RlcgorICogQGkyY19zdHNfcmVnCSBzdGF0dXMgb2YgUVVQX0kyQ19NQVNURVJfU1RBVFVTIHJlZ2lzdGVyLgorICogQHF1cF9vcF9yZWcJIHN0YXR1cyBvZiBRVVBfT1BFUkFUSU9OQUwgcmVnaXN0ZXIuCisgKi8KK3N0cnVjdCBpMmNfbXNtX2N0cmwgeworCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICAgKmRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgICAgICBhZGFwdGVyOworCXN0cnVjdCBpMmNfbXNtX3hmZXIgICAgICAgIHhmZXI7CisJc3RydWN0IGkyY19tc21fZGJnZnMgICAgICAgZGJnZnM7CisJc3RydWN0IGkyY19tc21fcmVzb3VyY2VzICAgcnNyY3M7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgbXN0cl9jbGtfY3RsOworCXUzMgkJCSAgIGkyY19zdHNfcmVnOworCXUzMgkJCSAgIHF1cF9vcF9yZWc7CisJZW51bSBpMmNfbXNtX3Bvd2VyX3N0YXRlICAgcHdyX3N0YXRlOworfTsKKworLyogRW51bSBmb3IgdGhlIHByb2ZpbGluZyBldmVudCB0eXBlcyAqLworZW51bSBpMmNfbXNtX3Byb2ZfZXZudF90eXBlIHsKKwlJMkNfTVNNX1ZBTElEX0VORCwKKwlJMkNfTVNNX1BJUF9EU0NOLAorCUkyQ19NU01fUElQX0NOQ1QsCisJSTJDX01TTV9BQ1RWX0VORCwKKwlJMkNfTVNNX0lSUV9CR04sCisJSTJDX01TTV9JUlFfRU5ELAorCUkyQ19NU01fWEZFUl9CRUcsCisJSTJDX01TTV9YRkVSX0VORCwKKwlJMkNfTVNNX1NDQU5fU1VNLAorCUkyQ19NU01fTkVYVF9CVUYsCisJSTJDX01TTV9DT01QTFRfT0ssCisJSTJDX01TTV9DT01QTFRfRkwsCisJSTJDX01TTV9QUk9GX1JFU0VULAorfTsKKworI2lmZGVmIENPTkZJR19JMkNfTVNNX1BST0ZfREJHCit2b2lkIGkyY19tc21fZGJnZnNfaW5pdChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKTsKKwordm9pZCBpMmNfbXNtX2RiZ2ZzX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpOworCisvKiBkaWFnb25pc2lzIHRoZSBpMmMgcmVnaXN0ZXJzIGFuZCBkdW1wIHRoZSBlcnJvcnMgYWNjb3JkaW5nbHkgKi8KK2NvbnN0IGNoYXIgKmkyY19tc21fZGJnX3RhZ190b19zdHIoY29uc3Qgc3RydWN0IGkyY19tc21fdGFnICp0YWcsCisJCQkJCQljaGFyICpidWYsIHNpemVfdCBidWZfbGVuKTsKKwordm9pZCBpMmNfbXNtX3Byb2ZfZXZudF9kdW1wKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpOworCisvKiBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBiZSB1c2VkIGZyb20gdGhlIGkyYy1tc20tdjItZGVidWcgZmlsZSAqLwordm9pZCBpMmNfbXNtX3Byb2ZfZXZudF9hZGQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCwKKwkJCQllbnVtIG1zbV9pMl9kZWJ1Z19sZXZlbCBkYmdfbGV2ZWwsCisJCQkJZW51bSBpMmNfbXNtX3Byb2ZfZXZudF90eXBlIGV2ZW50LAorCQkJCXU2NCBkYXRhMCwgdTMyIGRhdGExLCB1MzIgZGF0YTIpOworCitpbnQgaTJjX21zbV9kYmdfcXVwX3JlZ19kdW1wKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpOworCitjb25zdCBjaGFyICoKK2kyY19tc21fZGJnX2RtYV90YWdfdG9fc3RyKGNvbnN0IHN0cnVjdCBpMmNfbXNtX2RtYV90YWcgKmRtYV90YWcsIGNoYXIgKmJ1ZiwKKwkJCQkJCQkJc2l6ZV90IGJ1Zl9sZW4pOworI2Vsc2UKKy8qIHVzZSBkdW1teSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfbXNtX2RiZ2ZzX2luaXQoc3RydWN0IGkyY19tc21fY3RybCAqY3RybCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMmNfbXNtX2RiZ2ZzX3RlYXJkb3duKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpIHt9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaTJjX21zbV9kYmdfdGFnX3RvX3N0cihjb25zdCBzdHJ1Y3QgaTJjX21zbV90YWcgKnRhZywKKwkJCQkJCWNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgaTJjX21zbV9wcm9mX2V2bnRfZHVtcChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsKSB7fQorCisvKiBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBiZSB1c2VkIGZyb20gdGhlIGkyYy1tc20tdjItZGVidWcgZmlsZSAqLworc3RhdGljIGlubGluZSB2b2lkIGkyY19tc21fcHJvZl9ldm50X2FkZChzdHJ1Y3QgaTJjX21zbV9jdHJsICpjdHJsLAorCQkJCWVudW0gbXNtX2kyX2RlYnVnX2xldmVsIGRiZ19sZXZlbCwKKwkJCQllbnVtIGkyY19tc21fcHJvZl9ldm50X3R5cGUgZXZlbnQsCisJCQkJdTY0IGRhdGEwLCB1MzIgZGF0YTEsIHUzMiBkYXRhMikge30KKworc3RhdGljIGlubGluZSBpbnQgaTJjX21zbV9kYmdfcXVwX3JlZ19kdW1wKHN0cnVjdCBpMmNfbXNtX2N0cmwgKmN0cmwpCit7CisJcmV0dXJuIHRydWU7Cit9CitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmkyY19tc21fZGJnX2RtYV90YWdfdG9fc3RyKGNvbnN0IHN0cnVjdAorCQkJaTJjX21zbV9kbWFfdGFnICogZG1hX3RhZywgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBJMkNfTVNNX1YyX1BST0ZfREJHICovCisjZW5kaWYgLyogX0kyQ19NU01fVjJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb21tdS5oIGIvaW5jbHVkZS9saW51eC9pb21tdS5oCmluZGV4IDBiOGFlZGYuLjk5ZWI3N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9tbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKQEAgLTE0Miw2ICsxNDIsNyBAQAogCURPTUFJTl9BVFRSX1BBR0VfVEFCTEVfSVNfQ09IRVJFTlQsCiAJRE9NQUlOX0FUVFJfUEFHRV9UQUJMRV9GT1JDRV9DT0hFUkVOVCwKIAlET01BSU5fQVRUUl9DQl9TVEFMTF9ESVNBQkxFLAorCURPTUFJTl9BVFRSX1VQU1RSRUFNX0lPVkFfQUxMT0NBVE9SLAogCURPTUFJTl9BVFRSX01BWCwKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBhLmggYi9pbmNsdWRlL2xpbnV4L2lwYS5oCmluZGV4IDZlNjY0ZjYuLmY4ZTdlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBhLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcGEuaApAQCAtNjcxLDcgKzY3MSw4IEBACiAgKi8KIGVudW0gaXBhX3ZvbHRhZ2VfbGV2ZWwgewogCUlQQV9WT0xUQUdFX1VOU1BFQ0lGSUVELAotCUlQQV9WT0xUQUdFX1NWUyA9IElQQV9WT0xUQUdFX1VOU1BFQ0lGSUVELAorCUlQQV9WT0xUQUdFX1NWUzIgPSBJUEFfVk9MVEFHRV9VTlNQRUNJRklFRCwKKwlJUEFfVk9MVEFHRV9TVlMsCiAJSVBBX1ZPTFRBR0VfTk9NSU5BTCwKIAlJUEFfVk9MVEFHRV9UVVJCTywKIAlJUEFfVk9MVEFHRV9NQVgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oIGIvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaAppbmRleCBiN2UzNDMxLi5jMTIyNDA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmgKQEAgLTQ1MCw2ICs0NTAsOCBAQAogCXJldHVybiAhISh2YWwgJiBJQ0NfU1JFX0VMMV9TUkUpOwogfQogCit2b2lkIGdpY19zaG93X3BlbmRpbmdfaXJxcyh2b2lkKTsKK3Vuc2lnbmVkIGludCBnZXRfZ2ljX2hpZ2hwcmlfaXJxKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYWlsYm94X2NsaWVudC5oIGIvaW5jbHVkZS9saW51eC9tYWlsYm94X2NsaWVudC5oCmluZGV4IDg2YTJkYzYuLjA3MzM5MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWFpbGJveF9jbGllbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21haWxib3hfY2xpZW50LmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgbWJveF9jaGFuICptYm94X3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLCBpbnQgaW5kZXgpOwogaW50IG1ib3hfc2VuZF9tZXNzYWdlKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4sIHZvaWQgKm1zc2cpOwotaW50IG1ib3hfc2VuZF9jb250cm9sbGVyX2RhdGEoc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwgdm9pZCAqbXNzZyk7CitpbnQgbWJveF93cml0ZV9jb250cm9sbGVyX2RhdGEoc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwgdm9pZCAqbXNzZyk7CiB2b2lkIG1ib3hfY2xpZW50X3R4ZG9uZShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuLCBpbnQgcik7IC8qIGF0b21pYyAqLwogYm9vbCBtYm94X2NsaWVudF9wZWVrX2RhdGEoc3RydWN0IG1ib3hfY2hhbiAqY2hhbik7IC8qIGF0b21pYyAqLwogdm9pZCBtYm94X2ZyZWVfY2hhbm5lbChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKTsgLyogbWF5IHNsZWVwICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21haWxib3hfY29udHJvbGxlci5oIGIvaW5jbHVkZS9saW51eC9tYWlsYm94X2NvbnRyb2xsZXIuaAppbmRleCA3ODI3YzY4Li43NTFiMzU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21haWxib3hfY29udHJvbGxlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbWFpbGJveF9jb250cm9sbGVyLmgKQEAgLTI0LDggKzI0LDggQEAKICAqCQl0cmFuc21pc3Npb24gb2YgZGF0YSBpcyByZXBvcnRlZCBieSB0aGUgY29udHJvbGxlciB2aWEKICAqCQltYm94X2NoYW5fdHhkb25lIChpZiBpdCBoYXMgc29tZSBUWCBBQ0sgaXJxKS4gSXQgbXVzdCBub3QKICAqCQlzbGVlcC4KLSAqIEBzZW5kX2NvbnRyb2xsZXJfZGF0YToKLSAqCQlTZW5kIGRhdGEgZm9yIHRoZSBjb250cm9sbGVyIGRyaXZlci4gVGhpcyBjb3VsZCBiZSBkYXRhIHRvCisgKiBAd3JpdGVfY29udHJvbGxlcl9kYXRhOgorICoJCVdyaXRlIGRhdGEgZm9yIHRoZSBjb250cm9sbGVyIGRyaXZlci4gVGhpcyBjb3VsZCBiZSBkYXRhIHRvCiAgKgkJY29uZmlndXJlIHRoZSBjb250cm9sbGVyIG9yIGRhdGEgdGhhdCBtYXkgYmUgY2FjaGVkIGluIHRoZQogICoJCWNvbnRyb2xsZXIgYW5kIG5vdCB0cmFuc21pdHRlZCBpbW1lZGlhdGVseS4gVGhlcmUgaXMgbm8gQUNLCiAgKgkJZm9yIHRoaXMgcmVxdWVzdCBhbmQgdGhlIHJlcXVlc3QgaXMgbm90IGJ1ZmZlcmVkIGluIHRoZQpAQCAtNTQsNyArNTQsNyBAQAogICovCiBzdHJ1Y3QgbWJveF9jaGFuX29wcyB7CiAJaW50ICgqc2VuZF9kYXRhKShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKTsKLQlpbnQgKCpzZW5kX2NvbnRyb2xsZXJfZGF0YSkoc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSk7CisJaW50ICgqd3JpdGVfY29udHJvbGxlcl9kYXRhKShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKTsKIAlpbnQgKCpzdGFydHVwKShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKTsKIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pOwogCWJvb2wgKCpsYXN0X3R4X2RvbmUpKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oCmluZGV4IDM3ZTUxNzguLjYwMGM5MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKQEAgLTY0LDYgKzY0LDcgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9ESVNDQVJEX01FTUJMT0NLCiAjZGVmaW5lIF9faW5pdF9tZW1ibG9jayBfX21lbWluaXQKICNkZWZpbmUgX19pbml0ZGF0YV9tZW1ibG9jayBfX21lbWluaXRkYXRhCit2b2lkIG1lbWJsb2NrX2Rpc2NhcmQodm9pZCk7CiAjZWxzZQogI2RlZmluZSBfX2luaXRfbWVtYmxvY2sKICNkZWZpbmUgX19pbml0ZGF0YV9tZW1ibG9jawpAQCAtNzcsOCArNzgsNiBAQAogCQkJCQlpbnQgbmlkLCB1bG9uZyBmbGFncyk7CiBwaHlzX2FkZHJfdCBtZW1ibG9ja19maW5kX2luX3JhbmdlKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQsCiAJCQkJICAgcGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24pOwotcGh5c19hZGRyX3QgZ2V0X2FsbG9jYXRlZF9tZW1ibG9ja19yZXNlcnZlZF9yZWdpb25zX2luZm8ocGh5c19hZGRyX3QgKmFkZHIpOwotcGh5c19hZGRyX3QgZ2V0X2FsbG9jYXRlZF9tZW1ibG9ja19tZW1vcnlfcmVnaW9uc19pbmZvKHBoeXNfYWRkcl90ICphZGRyKTsKIHZvaWQgbWVtYmxvY2tfYWxsb3dfcmVzaXplKHZvaWQpOwogaW50IG1lbWJsb2NrX2FkZF9ub2RlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQpOwogaW50IG1lbWJsb2NrX2FkZChwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKTsKQEAgLTExNCw2ICsxMTMsOSBAQAogdm9pZCBfX25leHRfcmVzZXJ2ZWRfbWVtX3JlZ2lvbih1NjQgKmlkeCwgcGh5c19hZGRyX3QgKm91dF9zdGFydCwKIAkJCQlwaHlzX2FkZHJfdCAqb3V0X2VuZCk7CiAKK3ZvaWQgX19tZW1ibG9ja19mcmVlX2Vhcmx5KHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpOwordm9pZCBfX21lbWJsb2NrX2ZyZWVfbGF0ZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKTsKKwogLyoqCiAgKiBmb3JfZWFjaF9tZW1fcmFuZ2UgLSBpdGVyYXRlIHRocm91Z2ggbWVtYmxvY2sgYXJlYXMgZnJvbSB0eXBlX2EgYW5kIG5vdAogICogaW5jbHVkZWQgaW4gdHlwZV9iLiBPciBqdXN0IHR5cGVfYSBpZiB0eXBlX2IgaXMgTlVMTC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYWJlZmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fTUZEX0NEQ19QSU5DVFJMX0hfCi0jZGVmaW5lIF9fTUZEX0NEQ19QSU5DVFJMX0hfCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19NU01fQ0RDX1BJTkNUUkwpCi1leHRlcm4gaW50IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1leHRlcm4gaW50IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwotZXh0ZXJuIGJvb2wgbXNtX2NkY19waW5jdHJsX2dldF9zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLWV4dGVybiBpbnQgbXNtX2NkY19nZXRfZ3Bpb19zdGF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLWludCBtc21fY2RjX3BpbmN0cmxfZHJ2X2luaXQodm9pZCk7Ci12b2lkIG1zbV9jZGNfcGluY3RybF9kcnZfZXhpdCh2b2lkKTsKLQotI2Vsc2UKLWludCBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlyZXR1cm4gMDsKLX0KLWludCBtc21fY2RjX2dldF9ncGlvX3N0YXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgbXNtX2NkY19waW5jdHJsX2Rydl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci12b2lkIG1zbV9jZGNfcGluY3RybF9kcnZfZXhpdCh2b2lkKQotewotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaCBiL2luY2x1ZGUvbGludXgvbWZkL21zbS1jZGMtc3VwcGx5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGY0NGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbXNtLWNkYy1zdXBwbHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fQ09ERUNfUE9XRVJfU1VQUExZX0hfXwotI2RlZmluZSBfX0NPREVDX1BPV0VSX1NVUFBMWV9IX18KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLQotc3RydWN0IGNkY19yZWd1bGF0b3IgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50IG1pbl91VjsKLQlpbnQgbWF4X3VWOwotCWludCBvcHRpbXVtX3VBOwotCWJvb2wgb25kZW1hbmQ7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOwotfTsKLQotZXh0ZXJuIGludCBtc21fY2RjX2dldF9wb3dlcl9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKipjZGNfdnJlZywKLQkJCQkgICAgICBpbnQgKnRvdGFsX251bV9zdXBwbGllcyk7Ci1leHRlcm4gaW50IG1zbV9jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCi0JCQkJCXN0cnVjdCBjZGNfcmVndWxhdG9yICpjZGNfdnJlZywKLQkJCQkJaW50IG51bV9zdXBwbGllcyk7Ci1leHRlcm4gaW50IG1zbV9jZGNfcmVsZWFzZV9zdXBwbGllcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllcywKLQkJCQkgICAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAotCQkJCSAgICBpbnQgbnVtX3N1cHBsaWVzKTsKLWV4dGVybiBpbnQgbXNtX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXMsCi0JCQkJCSAgc3RydWN0IGNkY19yZWd1bGF0b3IgKmNkY192cmVnLAotCQkJCQkgIGludCBudW1fc3VwcGxpZXMpOwotZXh0ZXJuIGludCBtc21fY2RjX2luaXRfc3VwcGxpZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqKnN1cHBsaWVzLAotCQkJCSBzdHJ1Y3QgY2RjX3JlZ3VsYXRvciAqY2RjX3ZyZWcsCi0JCQkJIGludCBudW1fc3VwcGxpZXMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzM1L2lycS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOTMzNS9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY2NmQzMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzM1L2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19XQ0Q5MzM1X0lSUV9IXwotI2RlZmluZSBfX1dDRDkzMzVfSVJRX0hfCi0KLWVudW0gewotCS8qIElOVFJfUkVHIDAgKi8KLQlXQ0Q5MzM1X0lSUV9GTExfTE9DS19MT1NTID0gMSwKLQlXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKLQlXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKLQlXQ0Q5MzM1X0lSUV9FQVJfUEFfT0NQX0ZBVUxULAotCVdDRDkzMzVfSVJRX0hQSF9QQV9DTlBMX0NPTVBMRVRFLAotCVdDRDkzMzVfSVJRX0hQSF9QQV9DTlBSX0NPTVBMRVRFLAotCVdDRDkzMzVfSVJRX0VBUl9QQV9DTlBfQ09NUExFVEUsCi0JLyogSU5UUl9SRUcgMSAqLwotCVdDRDkzMzVfSVJRX01CSENfU1dfREVULAotCVdDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsCi0JV0NEOTMzNV9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAotCVdDRDkzMzVfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULAotCVdDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAotCVdDRDkzMzVfSVJRX1JFU0VSVkVEXzAsCi0JV0NEOTMzNV9JUlFfUkVTRVJWRURfMSwKLQlXQ0Q5MzM1X0lSUV9SRVNFUlZFRF8yLAotCS8qIElOVFJfUkVHIDIgKi8KLQlXQ0Q5MzM1X0lSUV9MSU5FX1BBMV9DTlBfQ09NUExFVEUsCi0JV0NEOTMzNV9JUlFfTElORV9QQTJfQ05QX0NPTVBMRVRFLAotCVdDRDkzMzVfSVJRX0xJTkVfUEEzX0NOUF9DT01QTEVURSwKLQlXQ0Q5MzM1X0lSUV9MSU5FX1BBNF9DTlBfQ09NUExFVEUsCi0JV0NEOTMzNV9JUlFfU09VTkRXSVJFLAotCVdDRDkzMzVfSVJRX1ZERF9ESUdfUkFNUF9DT01QTEVURSwKLQlXQ0Q5MzM1X0lSUV9SQ09fRVJST1IsCi0JV0NEOTMzNV9JUlFfU1ZBX0VSUk9SLAotCS8qIElOVFJfUkVHIDMgKi8KLQlXQ0Q5MzM1X0lSUV9NQURfQVVESU8sCi0JV0NEOTMzNV9JUlFfTUFEX0JFQUNPTiwKLQlXQ0Q5MzM1X0lSUV9NQURfVUxUUkFTT1VORCwKLQlXQ0Q5MzM1X0lSUV9WQkFUX0FUVEFDSywKLQlXQ0Q5MzM1X0lSUV9WQkFUX1JFU1RPUkUsCi0JV0NEOTMzNV9JUlFfU1ZBX09VVEJPWDEsCi0JV0NEOTMzNV9JUlFfU1ZBX09VVEJPWDIsCi0JV0NEOTMzNV9OVU1fSVJRUywKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDQzMGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX1dDRDkzMzVfUkVHSVNURVJTX0gKLSNkZWZpbmUgX1dDRDkzMzVfUkVHSVNURVJTX0gKLQotI2RlZmluZSBXQ0Q5MzM1X1BBR0VfU0laRSAyNTYKLSNkZWZpbmUgV0NEOTMzNV9OVU1fUEFHRVMgMjU2Ci0KLWV4dGVybiBjb25zdCB1OCAqd2NkOTMzNV9yZWdbV0NEOTMzNV9OVU1fUEFHRVNdOwotCi1lbnVtIHsKLQlQQUdFXzAgPSAwLAotCVBBR0VfMSwKLQlQQUdFXzIsCi0JUEFHRV82ID0gNiwKLQlQQUdFXzEwID0gMHhBLAotCVBBR0VfMTEsCi0JUEFHRV8xMiwKLQlQQUdFXzEzLAotCVBBR0VfMFg4MCwKLX07Ci0KLS8qIFBhZ2UtMCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgV0NEOTMzNV9QQUdFMF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfQllQQVNTICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9SU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA5Ci0jZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCAgICAgICAgICAgICAweDAwMTEKLSNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9ERUVQU0xQXzEgICAgICAgICAgICAgIDB4MDAxMgotI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RFRVBTTFBfMiAgICAgICAgICAgICAgMHgwMDEzCi0jZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfREVFUFNMUF8zICAgICAgICAgICAgICAweDAwMTQKLSNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9JUkFNX1NIVVRET1dOICAgICAgICAgIDB4MDAxNQotI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0xX1NIVVRET1dOICAgICAgICAgMHgwMDE2Ci0jZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTBfU0hVVERPV05fMSAgICAgICAweDAwMTcKLSNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMF9TSFVURE9XTl8yICAgICAgIDB4MDAxOAotI2RlZmluZSBXQ0Q5MzM1X0NPREVDX1JQTV9JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFkCi0jZGVmaW5lIFdDRDkzMzVfQ09ERUNfUlBNX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDAwMWUKLSNkZWZpbmUgV0NEOTMzNV9DT0RFQ19SUE1fSU5UX0NMRUFSICAgICAgICAgICAgICAgICAgICAgIDB4MDAxZgotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTAgICAgICAgICAgICAgMHgwMDIxCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMSAgICAgICAgICAgICAweDAwMjIKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUyICAgICAgICAgICAgIDB4MDAyMwotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTMgICAgICAgICAgICAgMHgwMDI0Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMICAgICAgICAgICAgICAgICAweDAwMjUKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMCAgICAgICAgICAgICAgIDB4MDAyNgotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1RFU1QxICAgICAgICAgICAgICAgMHgwMDI3Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDAgICAgICAgICAgICAweDAwMjkKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSAgICAgICAgICAgIDB4MDAyYQotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQyICAgICAgICAgICAgMHgwMDJiCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDMgICAgICAgICAgICAweDAwMmMKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNCAgICAgICAgICAgIDB4MDAyZAotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ1ICAgICAgICAgICAgMHgwMDJlCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDYgICAgICAgICAgICAweDAwMmYKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNyAgICAgICAgICAgIDB4MDAzMAotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ4ICAgICAgICAgICAgMHgwMDMxCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDkgICAgICAgICAgICAweDAwMzIKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTAgICAgICAgICAgIDB4MDAzMwotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMSAgICAgICAgICAgMHgwMDM0Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEyICAgICAgICAgICAweDAwMzUKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTMgICAgICAgICAgIDB4MDAzNgotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNCAgICAgICAgICAgMHgwMDM3Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE1ICAgICAgICAgICAweDAwMzgKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMgICAgICAgICAgICAgIDB4MDAzOQotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF9OT05ORUdPICAgICAgMHgwMDNhCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzEgICAgICAgICAgICAweDAwM2IKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMiAgICAgICAgICAgIDB4MDAzYwotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8zICAgICAgICAgICAgMHgwMDNkCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfQU5BX1dBSVRfU1RBVEVfQ1RMICAgICAgICAweDAwM2UKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9JMkNfQUNUSVZFICAgICAgICAgICAgICAgIDB4MDAzZgotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DVEwgICAgICAgICAgICAgMHgwMDQxCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzFfTU9OX1NUQVRVUyAgICAgICAgICAweDAwNDIKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMV9NT05fQ05UX01TQiAgICAgICAgIDB4MDA0MwotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MxX01PTl9DTlRfTFNCICAgICAgICAgMHgwMDQ0Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX0NUTCAgICAgICAgICAgICAweDAwNDUKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DMl9NT05fU1RBVFVTICAgICAgICAgIDB4MDA0NgotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MyX01PTl9DTlRfTVNCICAgICAgICAgMHgwMDQ3Ci0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzJfTU9OX0NOVF9MU0IgICAgICAgICAweDAwNDgKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DM19NT05fQ1RMICAgICAgICAgICAgIDB4MDA0OQotI2RlZmluZSBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX1BST0MzX01PTl9TVEFUVVMgICAgICAgICAgMHgwMDRhCi0jZGVmaW5lIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfUFJPQzNfTU9OX0NOVF9NU0IgICAgICAgICAweDAwNGIKLSNkZWZpbmUgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9QUk9DM19NT05fQ05UX0xTQiAgICAgICAgIDB4MDA0YwotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYX0kyU19DVEwgICAgICAgICAgICAgMHgwMDUxCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX0NUTCAgICAgICAgICAgICAweDAwNTIKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9JMlNfQ0xLICAgICAgICAgICAgICAgIDB4MDA1MwotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMF9JTlBfQ0ZHICAgICAgICAgICAgMHgwMDU0Ci0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgxX0lOUF9DRkcgICAgICAgICAgICAweDAwNTUKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDJfSU5QX0NGRyAgICAgICAgICAgIDB4MDA1NgotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYM19JTlBfQ0ZHICAgICAgICAgICAgMHgwMDU3Ci0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg0X0lOUF9DRkcgICAgICAgICAgICAweDAwNTgKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDVfSU5QX0NGRyAgICAgICAgICAgIDB4MDA1OQotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYNl9JTlBfQ0ZHICAgICAgICAgICAgMHgwMDVhCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlg3X0lOUF9DRkcgICAgICAgICAgICAweDAwNWIKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDBfSU5QX0NGRyAgICAgICAgIDB4MDA2MQotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMV9JTlBfQ0ZHICAgICAgICAgMHgwMDYyCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgyX0lOUF9DRkcgICAgICAgICAweDAwNjMKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDNfSU5QX0NGRyAgICAgICAgIDB4MDA2NAotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYNF9JTlBfQ0ZHICAgICAgICAgMHgwMDY1Ci0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg1X0lOUF9DRkcgICAgICAgICAweDAwNjYKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDZfSU5QX0NGRyAgICAgICAgIDB4MDA2NwotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYN19JTlBfQ0ZHICAgICAgICAgMHgwMDY4Ci0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFg4X0lOUF9DRkcgICAgICAgICAweDAwNjkKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDlfSU5QX0NGRyAgICAgICAgIDB4MDA2YQotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTBfSU5QX0NGRyAgICAgICAgMHgwMDZiCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxMV9JTlBfQ0ZHICAgICAgICAweDAwNmMKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDEzX0lOUF9DRkcgICAgICAgIDB4MDA2ZQotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTRfSU5QX0NGRyAgICAgICAgMHgwMDZmCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxNV9JTlBfQ0ZHICAgICAgICAweDAwNzAKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX0xfQ0ZHICAgICAgIDB4MDA3MQotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcgICAgICAgMHgwMDcyCi0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMV9MX0NGRyAgICAgICAweDAwNzMKLSNkZWZpbmUgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QxX1JfQ0ZHICAgICAgIDB4MDA3NAotI2RlZmluZSBXQ0Q5MzM1X0RBVEFfSFVCX05BVElWRV9GSUZPX1NZTkMgICAgICAgICAgICAgICAgMHgwMDc1Ci0jZGVmaW5lIFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1RBVFVTICAgICAgICAgICAgICAweDAwN0QKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MQotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfQ0xSX0NPTU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgyCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX01BU0swICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODkKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4YQotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9NQVNLMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDhiCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX01BU0szICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOGMKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfU1RBVFVTMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MQotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9TVEFUVVMxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkyCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgICAgICAweDAwOTMKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfU1RBVFVTMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5NAotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDk5Ci0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4xX0NMRUFSMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOWEKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjFfQ0xFQVIyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA5YgotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMV9DTEVBUjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDljCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX01BU0swICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTEKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhMgotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGEzCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX01BU0szICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTQKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfU1RBVFVTMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhOQotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9TVEFUVVMxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGFhCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgICAgICAweDAwYWIKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfU1RBVFVTMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBhYwotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIxCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYjIKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1BJTjJfQ0xFQVIyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiMwotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI0Ci0jZGVmaW5lIFdDRDkzMzVfSU5UUl9MRVZFTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTEKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX0xFVkVMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMgotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfTEVWRUwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGUzCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9MRVZFTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZTQKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX0JZUEFTUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOQotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfQllQQVNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGVhCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9CWVBBU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZWIKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX0JZUEFTUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBlYwotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfU0VUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGYxCi0jZGVmaW5lIFdDRDkzMzVfSU5UUl9TRVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZjIKLSNkZWZpbmUgV0NEOTMzNV9JTlRSX1NFVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMwotI2RlZmluZSBXQ0Q5MzM1X0lOVFJfU0VUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGY0Ci0KLS8qIFBhZ2UtMSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgV0NEOTMzNV9QQUdFMV9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAxMDUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA3Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzggICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBhCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9MX1ZBTF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAweDAxMGIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0xfVkFMX0NUTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDEwYwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgMHgwMTBkCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMSAgICAgICAgICAgICAgICAgICAweDAxMGUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMCAgICAgICAgICAgICAgICAgICAgIDB4MDEwZgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgMHgwMTEwCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9DT05GSUdfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAweDAxMTEKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0NPTkZJR19DVExfMyAgICAgICAgICAgICAgICAgICAgIDB4MDExMgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgMHgwMTEzCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAweDAxMTQKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDExNQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE2Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAxMTcKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDExOAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE5Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9URVNUX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAweDAxMWEKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1RFU1RfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDExYgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFjCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9GUkVRX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxMWQKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0ZSRVFfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDExZQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFmCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjAKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1NTQ19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIyCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9TU0NfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI1Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX0ZMTF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfRkxMX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAweDAxNDEKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0MgotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQzCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAxNDQKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0NQotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ2Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAweDAxNDcKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1VTRVJfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0OAotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVVNFUl9DVExfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ5Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9VU0VSX0NUTF85ICAgICAgICAgICAgICAgICAgICAgICAweDAxNGEKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0xfVkFMX0NUTF8wICAgICAgICAgICAgICAgICAgICAgIDB4MDE0YgotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfTF9WQUxfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMTRjCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9EU01fRlJBQ19DVExfMCAgICAgICAgICAgICAgICAgICAweDAxNGQKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xICAgICAgICAgICAgICAgICAgIDB4MDE0ZQotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8wICAgICAgICAgICAgICAgICAgICAgMHgwMTRmCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0NPTkZJR19DVExfMiAgICAgICAgICAgICAgICAgICAgIDB4MDE1MQotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfQ09ORklHX0NUTF8zICAgICAgICAgICAgICAgICAgICAgMHgwMTUyCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9DT05GSUdfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAweDAxNTMKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NAotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU1Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAxNTYKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NwotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU4Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9URVNUX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAweDAxNTkKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1RFU1RfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1YQotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfVEVTVF9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTViCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAweDAxNWMKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX0ZSRVFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1ZAotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfRlJFUV9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVlCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9GUkVRX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAweDAxNWYKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MAotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfU1NDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTYxCi0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TU0NfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjIKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1NTQ19DVExfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MwotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfRkxMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY0Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjUKLSNkZWZpbmUgV0NEOTMzNV9JMlNfRkxMX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NgotI2RlZmluZSBXQ0Q5MzM1X0kyU19GTExfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY3Ci0jZGVmaW5lIFdDRDkzMzVfSTJTX0ZMTF9TVEFUVVNfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjgKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MQotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTgyCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAxODMKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NAotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAweDAxODYKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NwotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9VU0VSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg4Ci0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1VTRVJfQ1RMXzggICAgICAgICAgICAgICAgICAgICAgICAweDAxODkKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4YQotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9MX1ZBTF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMThiCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0xfVkFMX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxOGMKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgIDB4MDE4ZAotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9EU01fRlJBQ19DVExfMSAgICAgICAgICAgICAgICAgICAgMHgwMThlCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMCAgICAgICAgICAgICAgICAgICAgICAweDAxOGYKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MAotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9DT05GSUdfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMTkxCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0NPTkZJR19DVExfMyAgICAgICAgICAgICAgICAgICAgICAweDAxOTIKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MwotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk0Ci0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTUKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NgotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk3Ci0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTgKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5OQotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9URVNUX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTlhCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1RFU1RfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWIKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5YwotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9GUkVRX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTlkCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0ZSRVFfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWUKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5ZgotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWEwCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1NTQ19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTEKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMgotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9TU0NfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWEzCi0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX0ZMTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTQKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNQotI2RlZmluZSBXQ0Q5MzM1X1NCX0ZMTF9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE2Ci0jZGVmaW5lIFdDRDkzMzVfU0JfRkxMX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTcKLSNkZWZpbmUgV0NEOTMzNV9TQl9GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhOAotCi0vKiBQYWdlLTIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFdDRDkzMzVfUEFHRTJfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzEgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwOAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18zICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA5Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzQgICAgICAgICAgICAgICAgICAgICAgICAweDAyMGEKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwYgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS182ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBjCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzcgICAgICAgICAgICAgICAgICAgICAgICAweDAyMGQKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwZQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS185ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjBmCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzEwICAgICAgICAgICAgICAgICAgICAgICAweDAyMTAKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTEgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEyCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzEzICAgICAgICAgICAgICAgICAgICAgICAweDAyMTMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMTQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18xNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE1Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV9UUkcgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyX1RSRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE4Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTkKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxYQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFiCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV80ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxZAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFlCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV83ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfOSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIxCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzExICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyMwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjI0Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8xMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gxXzE0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyNgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDFfMTUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjI3Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjgKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyOQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJhCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMmIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyYwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjJkCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMmUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV83ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIyZgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjMwCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzEKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzExICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjMzCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMTIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzQKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8xMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzNQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gxXzE0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjM2Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfMTUgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzcKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzOAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjM5Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyM2EKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzYgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjNjCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyM2QKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzZQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjNmCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl84ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDAKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0MQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQyCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzEyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0NAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19JTkJPWDJfMTMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQ1Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0lOQk9YMl8xNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfSU5CT1gyXzE1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0NwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQ4Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNDkKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0YQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjRiCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNGMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl81ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI0ZAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjRlCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNGYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl84ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1MAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjUxCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMTAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNTIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1MwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjU0Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDJfMTMgICAgICAgICAgICAgICAgICAgICAgICAweDAyNTUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl8xNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1NgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19PVVRCT1gyXzE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjU3Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfQUNLICAgICAgICAgICAgICAgICAgICAgICAweDAyNTgKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfT1VUQk9YMl9BQ0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1OQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19FQ19CVUZfSU5UX1BFUklPRCAgICAgICAgICAgICAgICAgMHgwMjVhCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1VTX0JVRl9JTlRfUEVSSU9EICAgICAgICAgICAgICAgICAweDAyNWIKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfQ1BBUk1BRF9CVUZSRFlfSU5UX1BFUklPRCAgICAgICAgIDB4MDI1YwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjVkCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1VTX0VDX01VWF9DRkcgICAgICAgICAgICAgICAgICAgICAweDAyNWUKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfTUFEX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI1ZgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19DUEFSX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjYwCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9EICAgICAgICAgICAgICAweDAyNjEKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI2MgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19ETUlDMF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjYzCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0RNSUMxX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNjQKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfRE1JQzJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI2NQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19ETUlDX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjY2Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NWQV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyNjcKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfQ1BBUl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI3MQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19XRE9HX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjcyCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX0JBQ0tVUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDAyNzMKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI3NAotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19DUEVfT0NEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjc1Ci0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLICAgICAgICAgICAgICAgICAweDAyNzYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVUyAgICAgICAgICAgICAgIDB4MDI3NwotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVIgICAgICAgICAgICAgICAgMHgwMjc4Ci0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAyODEKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4MgotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMjgzCi0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMiAgICAgICAgICAgICAgICAgICAgICAweDAyODQKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8zICAgICAgICAgICAgICAgICAgICAgIDB4MDI4NQotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMjg2Ci0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNSAgICAgICAgICAgICAgICAgICAgICAweDAyODcKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF82ICAgICAgICAgICAgICAgICAgICAgIDB4MDI4OAotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgMHgwMjg5Ci0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfOCAgICAgICAgICAgICAgICAgICAgICAweDAyOGEKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfUFRSICAgICAgICAgICAgICAgIDB4MDI4YgotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fSUlSX0NUTF9WQUwgICAgICAgICAgICAgICAgMHgwMjhjCi0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAyOGQKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4ZQotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjhmCi0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAyOTAKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5MQotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkyCi0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAweDAyOTMKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfMSAgICAgICAgICAgICAgICAgICAgIDB4MDI5NAotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF8yICAgICAgICAgICAgICAgICAgICAgMHgwMjk1Ci0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzMgICAgICAgICAgICAgICAgICAgICAweDAyOTYKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNCAgICAgICAgICAgICAgICAgICAgIDB4MDI5NwotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF81ICAgICAgICAgICAgICAgICAgICAgMHgwMjk4Ci0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzYgICAgICAgICAgICAgICAgICAgICAweDAyOTkKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9DVExfNyAgICAgICAgICAgICAgICAgICAgIDB4MDI5YQotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF84ICAgICAgICAgICAgICAgICAgICAgMHgwMjliCi0jZGVmaW5lIFdDRDkzMzVfU09DX01BRF9CRUFDT05fSUlSX0NUTF9QVFIgICAgICAgICAgICAgICAweDAyOWMKLSNkZWZpbmUgV0NEOTMzNV9TT0NfTUFEX0JFQUNPTl9JSVJfQ1RMX1ZBTCAgICAgICAgICAgICAgIDB4MDI5ZAotI2RlZmluZSBXQ0Q5MzM1X1NPQ19NQURfSU5QX1NFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjllCi0KLS8qIFBhZ2UtNiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgV0NEOTMzNV9QQUdFNl9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMAotI2RlZmluZSBXQ0Q5MzM1X0FOQV9CSUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAxCi0jZGVmaW5lIFdDRDkzMzVfQU5BX0NMS19UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDIKLSNkZWZpbmUgV0NEOTMzNV9BTkFfUkNPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMwotI2RlZmluZSBXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA0Ci0jZGVmaW5lIFdDRDkzMzVfQU5BX0JVQ0tfVk9VVF9EICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDUKLSNkZWZpbmUgV0NEOTMzNV9BTkFfQlVDS19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNgotI2RlZmluZSBXQ0Q5MzM1X0FOQV9CVUNLX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA3Ci0jZGVmaW5lIFdDRDkzMzVfQU5BX1JYX1NVUFBMSUVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDgKLSNkZWZpbmUgV0NEOTMzNV9BTkFfSFBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwOQotI2RlZmluZSBXQ0Q5MzM1X0FOQV9FQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBhCi0jZGVmaW5lIFdDRDkzMzVfQU5BX0xPXzFfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGIKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTE9fM180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwYwotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQURfU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBkCi0jZGVmaW5lIFdDRDkzMzVfQU5BX0FNSUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGUKLSNkZWZpbmUgV0NEOTMzNV9BTkFfQU1JQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwZgotI2RlZmluZSBXQ0Q5MzM1X0FOQV9BTUlDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjEwCi0jZGVmaW5lIFdDRDkzMzVfQU5BX0FNSUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTEKLSNkZWZpbmUgV0NEOTMzNV9BTkFfQU1JQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMgotI2RlZmluZSBXQ0Q5MzM1X0FOQV9BTUlDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjEzCi0jZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfTUVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTQKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxNQotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE2Ci0jZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzEgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTcKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxOAotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE5Ci0jZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlROMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWEKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19CVE4xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxYgotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFjCi0jZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlROMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWQKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19CVE40ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxZQotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFmCi0jZGVmaW5lIFdDRDkzMzVfQU5BX01CSENfQlRONiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUJIQ19CVE43ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMQotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NSUNCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIyCi0jZGVmaW5lIFdDRDkzMzVfQU5BX01JQ0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKLSNkZWZpbmUgV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNAotI2RlZmluZSBXQ0Q5MzM1X0FOQV9NSUNCMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI1Ci0jZGVmaW5lIFdDRDkzMzVfQU5BX01JQ0I0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjYKLSNkZWZpbmUgV0NEOTMzNV9BTkFfVkJBREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNwotI2RlZmluZSBXQ0Q5MzM1X0JJQVNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI4Ci0jZGVmaW5lIFdDRDkzMzVfQklBU19WQkdfRklORV9BREogICAgICAgICAgICAgICAgICAgICAgICAweDA2MjkKLSNkZWZpbmUgV0NEOTMzNV9DTE9DS19URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyZAotI2RlZmluZSBXQ0Q5MzM1X1JDT19DVFJMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjJlCi0jZGVmaW5lIFdDRDkzMzVfUkNPX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MmYKLSNkZWZpbmUgV0NEOTMzNV9SQ09fQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzMAotI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjMxCi0jZGVmaW5lIFdDRDkzMzVfUkNPX0NBTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzIKLSNkZWZpbmUgV0NEOTMzNV9SQ09fVEVTVF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzMwotI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfT1VUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM0Ci0jZGVmaW5lIFdDRDkzMzVfUkNPX0NBTF9PVVRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzUKLSNkZWZpbmUgV0NEOTMzNV9SQ09fQ0FMX09VVF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNgotI2RlZmluZSBXQ0Q5MzM1X1JDT19DQUxfT1VUXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM3Ci0jZGVmaW5lIFdDRDkzMzVfUkNPX0NBTF9PVVRfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzgKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzYQotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19NT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNiCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX01PREVfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2MKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fTU9ERV80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzZAotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19WQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNlCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX1ZDTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2YKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fVkNMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0MAotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQxCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDIKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0MwotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ0Ci0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDUKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NgotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ3Ci0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NDTF84ICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDgKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0NMXzkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0OQotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRhCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0ZJTFRFUl8xICAgICAgICAgICAgICAgICAgICAgICAweDA2NGIKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fRklMVEVSXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0YwotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19EUklWRVJfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRkCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0RSSVZFUl8yICAgICAgICAgICAgICAgICAgICAgICAweDA2NGUKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fRFJJVkVSXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0ZgotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9FWFRfMSAgICAgICAgICAgICAgICAgMHgwNjUwCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX0NBTF9DT0RFX0VYVF8yICAgICAgICAgICAgICAgICAweDA2NTEKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fQ0FMX0NPREVfT1VUXzEgICAgICAgICAgICAgICAgIDB4MDY1MgotI2RlZmluZSBXQ0Q5MzM1X1NJRE9fU0lET19DQUxfQ09ERV9PVVRfMiAgICAgICAgICAgICAgICAgMHgwNjUzCi0jZGVmaW5lIFdDRDkzMzVfU0lET19TSURPX1RFU1RfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTQKLSNkZWZpbmUgV0NEOTMzNV9TSURPX1NJRE9fVEVTVF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1NQotI2RlZmluZSBXQ0Q5MzM1X01CSENfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU2Ci0jZGVmaW5lIFdDRDkzMzVfTUJIQ19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTcKLSNkZWZpbmUgV0NEOTMzNV9NQkhDX1BMVUdfREVURUNUX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MDY1OAotI2RlZmluZSBXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU5Ci0jZGVmaW5lIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDA2NWEKLSNkZWZpbmUgV0NEOTMzNV9NQkhDX0ZTTV9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1YiAvKiB2MS54ICovCi0jZGVmaW5lIFdDRDkzMzVfTUJIQ19GU01fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWIgLyogdjIuMCAqLwotI2RlZmluZSBXQ0Q5MzM1X01CSENfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVjCi0jZGVmaW5lIFdDRDkzMzVfVkJBRENfU1VCQkxPQ0tfRU4gICAgICAgICAgICAgICAgICAgICAgICAweDA2NWQKLSNkZWZpbmUgV0NEOTMzNV9WQkFEQ19JQklBU19GRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1ZQotI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0JJQVNfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVmCi0jZGVmaW5lIFdDRDkzMzVfVkJBRENfRkVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjAKLSNkZWZpbmUgV0NEOTMzNV9WQkFEQ19BRENfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2MQotI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0FEQ19JTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjYyCi0jZGVmaW5lIFdDRDkzMzVfVkJBRENfQURDX1NBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjMKLSNkZWZpbmUgV0NEOTMzNV9WQkFEQ19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2NAotI2RlZmluZSBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY1Ci0jZGVmaW5lIFdDRDkzMzVfVkJBRENfQURDX0RPVVRMU0IgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjYKLSNkZWZpbmUgV0NEOTMzNV9MRE9IX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2NwotI2RlZmluZSBXQ0Q5MzM1X0xET0hfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY4Ci0jZGVmaW5lIFdDRDkzMzVfTERPSF9TVEJfTE9BRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjkKLSNkZWZpbmUgV0NEOTMzNV9MRE9IX1NMT1dSQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2YQotI2RlZmluZSBXQ0Q5MzM1X01JQ0IxX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZiCi0jZGVmaW5lIFdDRDkzMzVfTUlDQjFfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmMKLSNkZWZpbmUgV0NEOTMzNV9NSUNCMV9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2ZAotI2RlZmluZSBXQ0Q5MzM1X01JQ0IyX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZlCi0jZGVmaW5lIFdDRDkzMzVfTUlDQjJfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmYKLSNkZWZpbmUgV0NEOTMzNV9NSUNCMl9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MAotI2RlZmluZSBXQ0Q5MzM1X01JQ0IzX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjcxCi0jZGVmaW5lIFdDRDkzMzVfTUlDQjNfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzIKLSNkZWZpbmUgV0NEOTMzNV9NSUNCM19URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MwotI2RlZmluZSBXQ0Q5MzM1X01JQ0I0X1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc0Ci0jZGVmaW5lIFdDRDkzMzVfTUlDQjRfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzUKLSNkZWZpbmUgV0NEOTMzNV9NSUNCNF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NgotI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9BRENfVkNNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc3Ci0jZGVmaW5lIFdDRDkzMzVfVFhfQ09NX0JJQVNfQVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzgKLSNkZWZpbmUgV0NEOTMzNV9UWF9DT01fQURDX0lOVDFfSUIgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3OQotI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9BRENfSU5UMl9JQiAgICAgICAgICAgICAgICAgICAgICAgMHgwNjdhCi0jZGVmaW5lIFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDA2N2IKLSNkZWZpbmUgV0NEOTMzNV9UWF9DT01fVFhGRV9ESVZfU1RBUlQgICAgICAgICAgICAgICAgICAgIDB4MDY3YwotI2RlZmluZSBXQ0Q5MzM1X1RYX0NPTV9UWEZFX0RJVl9TVE9QXzlQNk0gICAgICAgICAgICAgICAgMHgwNjdkCi0jZGVmaW5lIFdDRDkzMzVfVFhfQ09NX1RYRkVfRElWX1NUT1BfMTJQMjg4TSAgICAgICAgICAgICAweDA2N2UKLSNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfVEVTVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3ZgotI2RlZmluZSBXQ0Q5MzM1X1RYXzFfMl9BRENfSUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjgwCi0jZGVmaW5lIFdDRDkzMzVfVFhfMV8yX0FURVNUX1JFRkNUTCAgICAgICAgICAgICAgICAgICAgICAweDA2ODEKLSNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MgotI2RlZmluZSBXQ0Q5MzM1X1RYXzFfMl9URVNUX0JMS19FTiAgICAgICAgICAgICAgICAgICAgICAgMHgwNjgzCi0jZGVmaW5lIFdDRDkzMzVfVFhfMV8yX1RYRkVfQ0xLRElWICAgICAgICAgICAgICAgICAgICAgICAweDA2ODQKLSNkZWZpbmUgV0NEOTMzNV9UWF8xXzJfU0FSMV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4NQotI2RlZmluZSBXQ0Q5MzM1X1RYXzFfMl9TQVIyX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg2Ci0jZGVmaW5lIFdDRDkzMzVfVFhfM180X1RFU1RfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODcKLSNkZWZpbmUgV0NEOTMzNV9UWF8zXzRfQURDX0lCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4OAotI2RlZmluZSBXQ0Q5MzM1X1RYXzNfNF9BVEVTVF9SRUZDVEwgICAgICAgICAgICAgICAgICAgICAgMHgwNjg5Ci0jZGVmaW5lIFdDRDkzMzVfVFhfM180X1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGEKLSNkZWZpbmUgV0NEOTMzNV9UWF8zXzRfVEVTVF9CTEtfRU4gICAgICAgICAgICAgICAgICAgICAgIDB4MDY4YgotI2RlZmluZSBXQ0Q5MzM1X1RYXzNfNF9UWEZFX0NMS0RJViAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhjCi0jZGVmaW5lIFdDRDkzMzVfVFhfM180X1NBUjFfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGQKLSNkZWZpbmUgV0NEOTMzNV9UWF8zXzRfU0FSMl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4ZQotI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9URVNUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhmCi0jZGVmaW5lIFdDRDkzMzVfVFhfNV82X0FEQ19JQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTAKLSNkZWZpbmUgV0NEOTMzNV9UWF81XzZfQVRFU1RfUkVGQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MDY5MQotI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjkyCi0jZGVmaW5lIFdDRDkzMzVfVFhfNV82X1RFU1RfQkxLX0VOICAgICAgICAgICAgICAgICAgICAgICAweDA2OTMKLSNkZWZpbmUgV0NEOTMzNV9UWF81XzZfVFhGRV9DTEtESVYgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5NAotI2RlZmluZSBXQ0Q5MzM1X1RYXzVfNl9TQVIxX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk1Ci0jZGVmaW5lIFdDRDkzMzVfVFhfNV82X1NBUjJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTYKLSNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5NwotI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9NT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk4Ci0jZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX01PREVfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTkKLSNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQ1RSTF9WQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5YQotI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9DVFJMX1ZDTF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjliCi0jZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzEgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWMKLSNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQ1RSTF9DQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5ZAotI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF8zICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjllCi0jZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0NUUkxfQ0NMXzQgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWYKLSNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfQ1RSTF9DQ0xfNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhMAotI2RlZmluZSBXQ0Q5MzM1X0NMQVNTSF9CVUNLX1RNVVhfQV9EICAgICAgICAgICAgICAgICAgICAgMHgwNmExCi0jZGVmaW5lIFdDRDkzMzVfQ0xBU1NIX0JVQ0tfU1dfRFJWX0NOVEwgICAgICAgICAgICAgICAgICAweDA2YTIKLSNkZWZpbmUgV0NEOTMzNV9DTEFTU0hfU1BBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhMwotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmE0Ci0jZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAweDA2YTUKLSNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgIDB4MDZhNgotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMgICAgICAgICAgICAgICAgICAgICAgMHgwNmE3Ci0jZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCAgICAgICAgICAgICAgICAgICAgICAweDA2YTgKLSNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF81ICAgICAgICAgICAgICAgICAgICAgIDB4MDZhOQotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzYgICAgICAgICAgICAgICAgICAgICAgMHgwNmFhCi0jZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNyAgICAgICAgICAgICAgICAgICAgICAweDA2YWIKLSNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF84ICAgICAgICAgICAgICAgICAgICAgIDB4MDZhYwotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzkgICAgICAgICAgICAgICAgICAgICAgMHgwNmFkCi0jZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzEgICAgICAgICAgICAgICAgICAweDA2YWUKLSNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMiAgICAgICAgICAgICAgICAgIDB4MDZhZgotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8zICAgICAgICAgICAgICAgICAgMHgwNmIwCi0jZGVmaW5lIFdDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQgICAgICAgICAgICAgICAgICAweDA2YjEgLyogdjEueCAqLwotI2RlZmluZSBXQ0Q5MzM1X0ZMWUJBQ0tfQ1RSTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmIxIC8qIHYyLjAgKi8KLSNkZWZpbmUgV0NEOTMzNV9GTFlCQUNLX1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiMgotI2RlZmluZSBXQ0Q5MzM1X1JYX0FVWF9TV19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmIzCi0jZGVmaW5lIFdDRDkzMzVfUlhfUEFfQVVYX0lOX0NPTk4gICAgICAgICAgICAgICAgICAgICAgICAweDA2YjQKLSNkZWZpbmUgV0NEOTMzNV9SWF9USU1FUl9ESVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiNQotI2RlZmluZSBXQ0Q5MzM1X1JYX09DUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI2Ci0jZGVmaW5lIFdDRDkzMzVfUlhfT0NQX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjcKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0VBUl9EQUMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiOAotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfRUFSX0FNUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI5Ci0jZGVmaW5lIFdDRDkzMzVfUlhfQklBU19IUEhfTERPICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YmEKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0hQSF9QQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiYgotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNCVUZGX0NOUDIgICAgICAgICAgICAgICAgMHgwNmJjCi0jZGVmaW5lIFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ19MRE8gICAgICAgICAgICAgICAgICAgICAweDA2YmQKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0hQSF9DTlAxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiZQotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfSFBIX0xPV1BPV0VSICAgICAgICAgICAgICAgICAgICAgMHgwNmJmCi0jZGVmaW5lIFdDRDkzMzVfUlhfQklBU19ESUZGTE9fUEEgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzAKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0RJRkZMT19SRUYgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjMQotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfRElGRkxPX0xETyAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMyCi0jZGVmaW5lIFdDRDkzMzVfUlhfQklBU19TRUxPX0RBQ19QQSAgICAgICAgICAgICAgICAgICAgICAweDA2YzMKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0JVQ0tfUlNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjNAotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfQlVDS19WUkVGX0VSUkFNUCAgICAgICAgICAgICAgICAgMHgwNmM1Ci0jZGVmaW5lIFdDRDkzMzVfUlhfQklBU19GTFlCX0VSUkFNUCAgICAgICAgICAgICAgICAgICAgICAweDA2YzYKLSNkZWZpbmUgV0NEOTMzNV9SWF9CSUFTX0ZMWUJfQlVGRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjNwotI2RlZmluZSBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9NSURfUlNUICAgICAgICAgICAgICAgICAgICAgMHgwNmM4Ci0jZGVmaW5lIFdDRDkzMzVfSFBIX0xfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzkKLSNkZWZpbmUgV0NEOTMzNV9IUEhfUl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjYQotI2RlZmluZSBXQ0Q5MzM1X0hQSF9DTlBfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNiCi0jZGVmaW5lIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2MKLSNkZWZpbmUgV0NEOTMzNV9IUEhfQ05QX1dHX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjZAotI2RlZmluZSBXQ0Q5MzM1X0hQSF9PQ1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNlCi0jZGVmaW5lIFdDRDkzMzVfSFBIX0FVVE9fQ0hPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2YKLSNkZWZpbmUgV0NEOTMzNV9IUEhfQ0hPUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMAotI2RlZmluZSBXQ0Q5MzM1X0hQSF9QQV9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQxCi0jZGVmaW5lIFdDRDkzMzVfSFBIX1BBX0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDIKLSNkZWZpbmUgV0NEOTMzNV9IUEhfTF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMwotI2RlZmluZSBXQ0Q5MzM1X0hQSF9MX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ0Ci0jZGVmaW5lIFdDRDkzMzVfSFBIX0xfQVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDUKLSNkZWZpbmUgV0NEOTMzNV9IUEhfUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkNgotI2RlZmluZSBXQ0Q5MzM1X0hQSF9SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ3Ci0jZGVmaW5lIFdDRDkzMzVfSFBIX1JfQVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDgKLSNkZWZpbmUgV0NEOTMzNV9IUEhfUkRBQ19DTEtfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkOQotI2RlZmluZSBXQ0Q5MzM1X0hQSF9SREFDX0NMS19DVEwyICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRhCi0jZGVmaW5lIFdDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGIKLSNkZWZpbmUgV0NEOTMzNV9IUEhfUkRBQ19DSE9QX0NMS19MUF9DVEwgICAgICAgICAgICAgICAgIDB4MDZkYwotI2RlZmluZSBXQ0Q5MzM1X0hQSF9SRUZCVUZGX1VIUUFfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwNmRkCi0jZGVmaW5lIFdDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGUKLSNkZWZpbmUgV0NEOTMzNV9IUEhfTF9EQUNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkZgotI2RlZmluZSBXQ0Q5MzM1X0hQSF9SX0RBQ19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUwCi0jZGVmaW5lIFdDRDkzMzVfRUFSX0VOX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTEKLSNkZWZpbmUgV0NEOTMzNV9FQVJfQ01CVUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlMgotI2RlZmluZSBXQ0Q5MzM1X0VBUl9JQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUzCi0jZGVmaW5lIFdDRDkzMzVfRUFSX0VOX0RCR19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTQKLSNkZWZpbmUgV0NEOTMzNV9FQVJfQ05QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlNQotI2RlZmluZSBXQ0Q5MzM1X0VBUl9EQUNfQ1RMX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU2Ci0jZGVmaW5lIFdDRDkzMzVfRUFSX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTcKLSNkZWZpbmUgV0NEOTMzNV9FQVJfT1VUX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlOAotI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU5Ci0jZGVmaW5lIFdDRDkzMzVfRElGRl9MT19MTzJfQ09NUEFOREVSICAgICAgICAgICAgICAgICAgICAweDA2ZWEKLSNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0xPMV9DT01QQU5ERVIgICAgICAgICAgICAgICAgICAgIDB4MDZlYgotI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fQ09NTU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmVjCi0jZGVmaW5lIFdDRDkzMzVfRElGRl9MT19CWVBBU1NfRU4gICAgICAgICAgICAgICAgICAgICAgICAweDA2ZWQKLSNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0NOUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlZQotI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fQ09SRV9PVVRfUFJPRyAgICAgICAgICAgICAgICAgICAgMHgwNmVmCi0jZGVmaW5lIFdDRDkzMzVfRElGRl9MT19MRE9fT1VUX1BST0cgICAgICAgICAgICAgICAgICAgICAweDA2ZjAKLSNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSAgICAgICAgICAgIDB4MDZmMQotI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fQ09NX1BBX0ZSRVEgICAgICAgICAgICAgICAgICAgICAgMHgwNmYyCi0jZGVmaW5lIFdDRDkzMzVfRElGRl9MT19SRVNFUlZFRF9SRUcgICAgICAgICAgICAgICAgICAgICAweDA2ZjMKLSNkZWZpbmUgV0NEOTMzNV9ESUZGX0xPX0xPMV9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgIDB4MDZmNAotI2RlZmluZSBXQ0Q5MzM1X0RJRkZfTE9fTE8xX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgMHgwNmY1Ci0jZGVmaW5lIFdDRDkzMzVfU0VfTE9fQ09NMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjYKLSNkZWZpbmUgV0NEOTMzNV9TRV9MT19DT00yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmNwotI2RlZmluZSBXQ0Q5MzM1X1NFX0xPX0xPM19HQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmY4Ci0jZGVmaW5lIFdDRDkzMzVfU0VfTE9fTE8zX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjkKLSNkZWZpbmUgV0NEOTMzNV9TRV9MT19MTzRfR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmYQotI2RlZmluZSBXQ0Q5MzM1X1NFX0xPX0xPNF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmZiCi0jZGVmaW5lIFdDRDkzMzVfU0VfTE9fTE8zX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZmUKLSNkZWZpbmUgV0NEOTMzNV9TRV9MT19MTzRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmZgotCi0vKiBQYWdlLTEwIFJlZ2lzdGVycyAqLwotI2RlZmluZSBXQ0Q5MzM1X1BBR0UxMF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgwYTAwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMDEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9NT0RFXzFfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEwMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX01PREVfMl9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTAzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAweDBhMDQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9GQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0xQRl9GRl9BX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTA2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfTFBGX0ZGX0JfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhMDcKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9MUEZfRkJfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEwOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX1NNTFBGX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTA5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfRENGTFRfU0hJRlRfQ1RMICAgICAgICAgICAgICAgICAweDBhMGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9JSVJfQURBUFRfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEwYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCAgICAgICAgICAgICAgICAgMHgwYTBjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzJfQ1RMICAgICAgICAgICAgICAgICAweDBhMGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEwZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0JfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTBmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzBfRkJfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9DTEtfUkVTRVRfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGExOQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMV9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTFhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMWIKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9GRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGExYwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0ZCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTFkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfTFBGX0ZGX0FfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhMWUKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9MUEZfRkZfQl9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGExZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0xQRl9GQl9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTIwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfU01MUEZfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhMjEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9EQ0ZMVF9TSElGVF9DVEwgICAgICAgICAgICAgICAgIDB4MGEyMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0lJUl9BREFQVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTIzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzFfQ1RMICAgICAgICAgICAgICAgICAweDBhMjQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMl9DVEwgICAgICAgICAgICAgICAgIDB4MGEyNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTI2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0FOQzFfRkZfQl9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMjcKLSNkZWZpbmUgV0NEOTMzNV9DRENfQU5DMV9GQl9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGEyOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTMxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhMzIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGEzMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTM0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhMzUKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGEzNgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYTM3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhMzgKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGEzOQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYTNhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhM2IKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGEzYwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYTNkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBhM2UKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGE0MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYTQyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhNDMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYTQ1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhNDYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGE0NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYTQ4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhNDkKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGE0YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYTRiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhNGMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGE0ZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTUxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhNTIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGE1MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTU0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhNTUKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGE1NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYTU3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhNTgKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGE1OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYTVhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhNWIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGE1YwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYTVkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhNjEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGE2MgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYTYzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhNjQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgIDB4MGE2NQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYTY2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBhNjcKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGE2OAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYTY5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBhNmEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgIDB4MGE2YgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYTZjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBhNmQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGE3MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYTcyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhNzMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYTc1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhNzYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGE3NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYTc4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhNzkKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGE3YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYTdiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhN2MKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg0X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGE3ZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTgxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhODIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGE4MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTg0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhODUKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGE4NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYTg3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhODgKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGE4OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYThhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhOGIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGE4YwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYThkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhOTEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGE5MgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYTkzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhOTQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgIDB4MGE5NQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYTk2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBhOTcKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGE5OAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYTk5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBhOWEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgIDB4MGE5YgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYTljCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBhOWQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYWEyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBhYTMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgMHgwYWE1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAweDBhYTYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGFhNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYWE4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBhYTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGFhYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgMHgwYWFiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBhYWMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg3X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGFhZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYWIxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBhYjIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGFiMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWI0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAweDBhYjUKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgIDB4MGFiNgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYWI3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBhYjgKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGFiOQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYWJhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBhYmIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGFiYwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYWJkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgICAweDBhYzIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgIDB4MGFjMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCAgICAgICAgICAgICAgMHgwYWM2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAweDBhYzcKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgIDB4MGFjYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgMHgwYWNiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAweDBhY2UKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgIDB4MGFjZgotCi0vKiBQYWdlLTExIFJlZ2lzdGVycyAqLwotI2RlZmluZSBXQ0Q5MzM1X1BBR0UxMV9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgwYjAwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDBiMDEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MGIwMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgwYjAzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDBiMDQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MGIwNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDUgICAgICAgICAgICAgICAgICAgICAgMHgwYjA2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjFfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDBiMDcKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMV9DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MGIwOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjA5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiMGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIwYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjBjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiMGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSMl9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIwZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIyX0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjBmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjJfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiMTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEwwICAgICAgICAgICAgICAgICAgICAgIDB4MGIxMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwYjEyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDBiMTMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEwzICAgICAgICAgICAgICAgICAgICAgIDB4MGIxNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwYjE1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjNfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDBiMTYKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSM19DVEw2ICAgICAgICAgICAgICAgICAgICAgIDB4MGIxNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIzX0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwYjE4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDBiMTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MGIxYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgwYjFiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDBiMWMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MGIxZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI0X0NUTDUgICAgICAgICAgICAgICAgICAgICAgMHgwYjFlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjRfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDBiMWYKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNF9DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MGIyMAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjIxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiMjIKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIyMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjI0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiMjUKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNV9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIyNgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI1X0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjI3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjVfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiMjgKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEwwICAgICAgICAgICAgICAgICAgICAgIDB4MGIyOQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwYjJhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDBiMmIKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEwzICAgICAgICAgICAgICAgICAgICAgIDB4MGIyYwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwYjJkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjZfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDBiMmUKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSNl9DVEw2ICAgICAgICAgICAgICAgICAgICAgIDB4MGIyZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI2X0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwYjMwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDBiMzEKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MGIzMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDIgICAgICAgICAgICAgICAgICAgICAgMHgwYjMzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDBiMzQKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDUgICAgICAgICAgICAgICAgICAgICAgMHgwYjM2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjdfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDBiMzcKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwYjM5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAweDBiM2EKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MGIzYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwYjNjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAweDBiM2QKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MGIzZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwYjNmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NPTVBBTkRFUjhfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAweDBiNDAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGI0MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYjQyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBiNDMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MGI0NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQ1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDBiNDYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MGI0NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYjQ4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBiNDkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGI0YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYjRiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBiNGMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGI0ZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYjRmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiNTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGI1MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYjUyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiNTUKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGI1NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYjU3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiNTgKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYjVhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiNWIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGI1YwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYjVkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiNWUKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGI1ZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYjYwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBiNjEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGI2MgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYjYzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiNjQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGI2NQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYjY2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiNjkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGI2YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYjZiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiNmMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2ZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYjZlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiNmYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGI3MAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYjcxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiNzIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGI3MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYjc0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAweDBiNzUKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGI3NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYjc3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiNzgKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGI3OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYjdhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiN2QKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGI3ZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYjdmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiODAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYjgyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiODMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGI4NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYjg1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiODYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGI4NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYjg4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiOGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGI4YgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYjhjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiOGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGI4ZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYjkxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiOTIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGI5MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYjk0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiOTUKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGI5NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYjk3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiOTgKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGI5OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYjlhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiOWIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGI5YwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYjllCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBiOWYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgIDB4MGJhMAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgMHgwYmExCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAweDBiYTIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGJhNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYmE2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBiYTcKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MGJhOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYmE5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDBiYWEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MGJhYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYmFjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBiYWQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGJhZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYmFmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBiYjAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGJiMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYmIzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiYjQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGJiNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYmI2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBiYjkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MGJiYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwYmJiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAweDBiYmMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGJiZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYmJlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAweDBiYmYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGJjMAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwYmMxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAweDBiYzIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MGJjMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwYmM0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAweDBiYzYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MGJjNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwYmM4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAweDBiYzkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MGJjYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYmNkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDBiY2UKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgIDB4MGJjZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwYmQwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBiZDEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgIDB4MGJkMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwYmQzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDBiZDQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgIDB4MGJkNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwYmQ2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDBiZDcKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgIDB4MGJkOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwYmRhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDBiZGIKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgIDB4MGJkYwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgMHgwYmRkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAweDBiZGUKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGJlMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgMHgwYmUyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDBiZTMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MGJlNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwYmU1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDBiZTYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MGJlNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYmU4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDBiZTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MGJlYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgMHgwYmViCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDBiZWMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MGJlZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgMHgwYmVmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDBiZjAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MGJmMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgMHgwYmYyCi0KLS8qIFBhZ2UtMTIgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFdDRDkzMzVfUEFHRTEyX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweDBjMDAKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9DUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0RMWV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzAyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfREVDQVlfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAweDBjMDMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9IUEhfVl9QQSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0VBUl9WX1BBICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSFBIX1ZfSEQgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDYKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9FQVJfVl9IRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0sxX01TQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSzFfTFNCICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDkKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9LMl9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0syX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfSURMRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAweDBjMGMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9JRExFX0hQSCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX0lETEVfRUFSICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMU0hfVEVTVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGYKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xTSF9URVNUMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMxMAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTFNIX09WUl9WUkVGICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzExCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAweDBjMTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGMxYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ0ZHMSAgICAgICAgICAgICAgICAgICAgMHgwYzFiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcyICAgICAgICAgICAgICAgICAgICAweDBjMWMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMICAgICAgICAgICAgICAgIDB4MGMyMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYzIyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcxICAgICAgICAgICAgICAgICAgICAweDBjMjMKLSNkZWZpbmUgV0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NGRzIgICAgICAgICAgICAgICAgICAgIDB4MGMyNAotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMCAgICAgICAgICAgICAgICAgMHgwYzI5Ci0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xICAgICAgICAgICAgICAgICAweDBjMmEKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzIgICAgICAgICAgICAgICAgIDB4MGMyYgotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMyAgICAgICAgICAgICAgICAgMHgwYzJjCi0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wICAgICAgICAgICAgICAgICAweDBjMmQKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzEgICAgICAgICAgICAgICAgIDB4MGMyZQotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMiAgICAgICAgICAgICAgICAgMHgwYzJmCi0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zICAgICAgICAgICAgICAgICAweDBjMzAKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzAgICAgICAgICAgICAgICAgIDB4MGMzMQotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMSAgICAgICAgICAgICAgICAgMHgwYzMyCi0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yICAgICAgICAgICAgICAgICAweDBjMzMKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzMgICAgICAgICAgICAgICAgIDB4MGMzNAotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMCAgICAgICAgICAgICAgICAgMHgwYzM1Ci0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xICAgICAgICAgICAgICAgICAweDBjMzYKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzIgICAgICAgICAgICAgICAgIDB4MGMzNwotI2RlZmluZSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMyAgICAgICAgICAgICAgICAgMHgwYzM4Ci0jZGVmaW5lIFdDRDkzMzVfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRyAgICAgICAgICAgICAgICAweDBjMzkKLSNkZWZpbmUgV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9BQ0NFU1NfU1RBVFVTICAgICAgICAgICAgIDB4MGMzYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYzNkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAweDBjM2UKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0FEQ19DQUwxICAgICAgICAgICAgICAgICAgIDB4MGMzZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIgICAgICAgICAgICAgICAgICAgMHgwYzQwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMyAgICAgICAgICAgICAgICAgICAweDBjNDEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BLX0VTVDEgICAgICAgICAgICAgICAgICAgIDB4MGM0MgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEtfRVNUMiAgICAgICAgICAgICAgICAgICAgMHgwYzQzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QS19FU1QzICAgICAgICAgICAgICAgICAgICAweDBjNDQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1JGX1BST0MxICAgICAgICAgICAgICAgICAgIDB4MGM0NQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIgICAgICAgICAgICAgICAgICAgMHgwYzQ2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUMxICAgICAgICAgICAgICAgICAgICAgICAweDBjNDcKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1RBQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGM0OAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfVEFDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYzQ5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9UQUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBjNGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMSAgICAgICAgICAgICAgICAgIDB4MGM0YgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyICAgICAgICAgICAgICAgICAgMHgwYzRjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDMgICAgICAgICAgICAgICAgICAweDBjNGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fVVBENCAgICAgICAgICAgICAgICAgIDB4MGM0ZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfREVCVUcxICAgICAgICAgICAgICAgICAgICAgMHgwYzRmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRF9NT04gICAgICAgICAgICAgICAweDBjNTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0dBSU5fTU9OX1ZBTCAgICAgICAgICAgICAgIDB4MGM1MQotI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgMHgwYzU1Ci0jZGVmaW5lIFdDRDkzMzVfU1BMSU5FX1NSQzBfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAweDBjNTYKLSNkZWZpbmUgV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgIDB4MGM2ZAotI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMxX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMHgwYzZlCi0jZGVmaW5lIFdDRDkzMzVfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMCAgICAgICAgICAgICAgICAweDBjODUKLSNkZWZpbmUgV0NEOTMzNV9TUExJTkVfU1JDMl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDB4MGM4NgotI2RlZmluZSBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgMHgwYzlkCi0jZGVmaW5lIFdDRDkzMzVfU1BMSU5FX1NSQzNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAweDBjOWUKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwgICAgICAgIDB4MGNiNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMwX1NUX1NSQ19QQVRIX0NGRzEgICAgICAgMHgwY2I2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzFfU1RfU1JDX1BBVEhfQ1RMICAgICAgICAweDBjYjkKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DRkcxICAgICAgIDB4MGNiYQotCi0vKiBQYWdlLTEzIFJlZ2lzdGVycyAqLwotI2RlZmluZSBXQ0Q5MzM1X1BBR0UxM19QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgMHgwZDAwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwICAgICAgICAgICAgICAweDBkMDEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEgICAgICAgICAgICAgIDB4MGQwMgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCAgICAgICAgICAgICAgMHgwZDAzCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxICAgICAgICAgICAgICAweDBkMDQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzAgICAgICAgICAgICAgIDB4MGQwNQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSAgICAgICAgICAgICAgMHgwZDA2Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwICAgICAgICAgICAgICAweDBkMDcKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEgICAgICAgICAgICAgIDB4MGQwOAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCAgICAgICAgICAgICAgMHgwZDA5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxICAgICAgICAgICAgICAweDBkMGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzAgICAgICAgICAgICAgIDB4MGQwYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMSAgICAgICAgICAgICAgMHgwZDBjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwICAgICAgICAgICAgICAweDBkMGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ2X0NGRzEgICAgICAgICAgICAgIDB4MGQwZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMCAgICAgICAgICAgICAgMHgwZDBmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxICAgICAgICAgICAgICAweDBkMTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAgICAgICAgICAgICAgIDB4MGQxMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMSAgICAgICAgICAgICAgMHgwZDEyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzAgICAgICAgICAgICAgICAweDBkMTMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSAgICAgICAgICAgICAgIDB4MGQxNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyICAgICAgICAgICAgICAgMHgwZDE1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzMgICAgICAgICAgICAgICAweDBkMTYKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCAgICAgICAgICAgICAgIDB4MGQxNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwICAgICAgICAgMHgwZDE4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEgICAgICAgICAweDBkMTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCAgICAgICAgICAgICAgICAgIDB4MGQxYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NQTElORV9TUkNfQ0ZHMCAgICAgICAgICAgMHgwZDFiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCAgICAgICAgICAgICAweDBkMWQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxICAgICAgICAgICAgIDB4MGQxZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAgICAgICAgICAgICAgMHgwZDFmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSAgICAgICAgICAgICAweDBkMjAKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcwICAgICAgICAgICAgIDB4MGQyMQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEgICAgICAgICAgICAgMHgwZDIyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCAgICAgICAgICAgICAweDBkMjMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcxICAgICAgICAgICAgIDB4MGQyNAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAgICAgICAgICAgICAgMHgwZDI1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCAgICAgICAgICAgICAweDBkMjYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwICAgICAgICAgICAgIDB4MGQyNwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAgICAgICAgICAgICAgMHgwZDI4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCAgICAgICAgICAgICAweDBkMjkKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTBfQ0ZHMCAgICAgICAgICAgIDB4MGQyYgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwICAgICAgICAgICAgMHgwZDJjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzAgICAgICAgICAgICAweDBkMmQKLSNkZWZpbmUgV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTNfQ0ZHMCAgICAgICAgICAgIDB4MGQyZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwICAgMHgwZDMxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEgICAweDBkMzIKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMiAgIDB4MGQzMwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczICAgMHgwZDM0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzAgICAweDBkMzUKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMSAgIDB4MGQzNgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyICAgMHgwZDM3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMgICAweDBkMzgKLSNkZWZpbmUgV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwICAgICAgICAgICAgICAgIDB4MGQzYQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEgICAgICAgICAgICAgICAgMHgwZDNiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMiAgICAgICAgICAgICAgICAweDBkM2MKLSNkZWZpbmUgV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczICAgICAgICAgICAgICAgIDB4MGQzZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MICAgICAgICAgICAgMHgwZDQxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCAgICAgICAgICAweDBkNDIKLSNkZWZpbmUgV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MICAgICAgICAgICAgIDB4MGQ0MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTCAgICAgICAgICAgICAgICAgMHgwZDQ5Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QwICAgICAgICAweDBkNGEKLSNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDEgICAgICAgIDB4MGQ0YgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQiAgICAgMHgwZDRjCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfU0lHX1BBVFRFUk5fTVNCICAgICAweDBkNGQKLSNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TVEFUVVMgICAgICAgICAgICAgIDB4MGQ0ZQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCAgICAgICAgICAgMHgwZDRmCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX0xTQiAgICAgICAweDBkNTAKLSNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTVNCICAgICAgIDB4MGQ1MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQgICAgMHgwZDUyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQl9SRCAgICAweDBkNTMKLSNkZWZpbmUgV0NEOTMzNV9DRENfUFJPWF9ERVRFQ1RfUFJPWF9DVExfUkVQRUFUX1BBVCAgICAgIDB4MGQ1NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCAgICAgICAgICAgMHgwZDU1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMICAgICAgICAweDBkNTYKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwgICAgICAgIDB4MGQ1NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCAgICAgICAgMHgwZDU4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMICAgICAgICAweDBkNTkKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNV9DVEwgICAgICAgIDB4MGQ1YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCAgICAgICAgMHgwZDViCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjdfQ1RMICAgICAgICAweDBkNWMKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9COF9DVEwgICAgICAgIDB4MGQ1ZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwgICAgICAgICAgICAgICAgMHgwZDVlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fVElNRVJfQ1RMICAgICAweDBkNWYKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgICAgICAgIDB4MGQ2MAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCAgICAgICAgMHgwZDYxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX1BBVEhfQ1RMICAgICAgICAgICAweDBkNjUKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwgICAgICAgIDB4MGQ2NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCAgICAgICAgMHgwZDY3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMICAgICAgICAweDBkNjgKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNF9DVEwgICAgICAgIDB4MGQ2OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCAgICAgICAgMHgwZDZhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjZfQ1RMICAgICAgICAweDBkNmIKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CN19DVEwgICAgICAgIDB4MGQ2YwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCAgICAgICAgMHgwZDZkCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NUTCAgICAgICAgICAgICAgICAweDBkNmUKLSNkZWZpbmUgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9USU1FUl9DVEwgICAgIDB4MGQ2ZgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IxX0NUTCAgICAgICAgMHgwZDcwCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0NPRUZfQjJfQ1RMICAgICAgICAweDBkNzEKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4MQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDgyCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkczICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4NAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDg1Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHNSAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX1RPUF9DRkc2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4NwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfVE9QX0NGRzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDg4Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCICAgICAgICAgICAgICAgICAweDBkODkKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9XUl9NU0IgICAgICAgICAgICAgICAgIDB4MGQ4YQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBITF9DT01QX0xVVCAgICAgICAgICAgICAgICAgICAgMHgwZDhiCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCICAgICAgICAgICAgICAgICAweDBkOGMKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSExfQ09NUF9SRF9NU0IgICAgICAgICAgICAgICAgIDB4MGQ4ZAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAgMHgwZDhlCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgICAweDBkOGYKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0hQSFJfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgIDB4MGQ5MAotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfSFBIUl9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAgMHgwZDkxCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgICAweDBkOTIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTFNCICAgICAgICAgICAgICAgIDB4MGQ5MwotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9XUl9NU0IgICAgICAgICAgICAgICAgMHgwZDk0Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCAgICAgICAgICAgICAgICAgICAweDBkOTUKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTFNCICAgICAgICAgICAgICAgIDB4MGQ5NgotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRkxfQ09NUF9SRF9NU0IgICAgICAgICAgICAgICAgMHgwZDk3Ci0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAweDBkOTgKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZSX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgIDB4MGQ5OQotI2RlZmluZSBXQ0Q5MzM1X0NEQ19UT1BfRElGRlJfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgMHgwZDlhCi0jZGVmaW5lIFdDRDkzMzVfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAweDBkOWIKLSNkZWZpbmUgV0NEOTMzNV9DRENfVE9QX0RJRkZSX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgIDB4MGQ5YwotCi0vKiBQYWdlLTB4ODAgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFdDRDkzMzVfUEFHRTgwX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0JJU1RfTU9ERV9QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAwMQotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fUkZfUEFfT05fUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgMHg4MDAyCi0jZGVmaW5lIFdDRDkzMzVfVExNTV9JTlRSMV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDMKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0lOVFIyX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNAotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fU1dSX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgMHg4MDA1Ci0jZGVmaW5lIFdDRDkzMzVfVExNTV9TV1JfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHICAgICAgICAgICAgICAgIDB4ODAwNwotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJDX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4Ci0jZGVmaW5lIFdDRDkzMzVfVExNTV9JMkNfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAweDgwMDkKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19SWF9TRDBfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAwYQotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJTX1JYX1NEMV9QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDBiCi0jZGVmaW5lIFdDRDkzMzVfVExNTV9JMlNfUlhfU0NLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMGMKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19SWF9XU19QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAwZAotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJTX1RYX1NEMF9QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDBlCi0jZGVmaW5lIFdDRDkzMzVfVExNTV9JMlNfVFhfU0QxX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMGYKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0kyU19UWF9TQ0tfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAxMAotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSTJTX1RYX1dTX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgMHg4MDExCi0jZGVmaW5lIFdDRDkzMzVfVExNTV9ETUlDMV9DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAweDgwMTIKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0RNSUMxX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgIDB4ODAxMwotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fRE1JQzJfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgMHg4MDE0Ci0jZGVmaW5lIFdDRDkzMzVfVExNTV9ETUlDMl9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAweDgwMTUKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0RNSUMzX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAxNgotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fRE1JQzNfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgMHg4MDE3Ci0jZGVmaW5lIFdDRDkzMzVfVExNTV9KVERJX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMTgKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0pURE9fUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxOQotI2RlZmluZSBXQ0Q5MzM1X1RMTU1fSlRNU19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFhCi0jZGVmaW5lIFdDRDkzMzVfVExNTV9KVENLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMWIKLSNkZWZpbmUgV0NEOTMzNV9UTE1NX0pUUlNUX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxYwotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8wICAgICAgICAgICAgICAgICAgMHg4MDMxCi0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzEgICAgICAgICAgICAgICAgICAweDgwMzIKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMiAgICAgICAgICAgICAgICAgIDB4ODAzMwotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9PRV8zICAgICAgICAgICAgICAgICAgMHg4MDM0Ci0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMCAgICAgICAgICAgICAgICAweDgwMzUKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8xICAgICAgICAgICAgICAgIDB4ODAzNgotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzIgICAgICAgICAgICAgICAgMHg4MDM3Ci0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMyAgICAgICAgICAgICAgICAweDgwMzgKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX1BBRF9EUlZDVEwgICAgICAgICAgICAgICAgICAgIDB4ODAzOQotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfUElOX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg4MDNhCi0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSAgICAgICAgICAgICAgICAweDgwM2IKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yICAgICAgICAgICAgICAgIDB4ODAzYwotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfTUVNX0NUUkwgICAgICAgICAgICAgICAgICAgICAgMHg4MDNkCi0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19CVVNfU0VMICAgICAgICAgICAgICAgICAweDgwNDEKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0pUQUcgICAgICAgICAgICAgICAgICAgIDB4ODA0MgotI2RlZmluZSBXQ0Q5MzM1X1RFU1RfREVCVUdfREVCVUdfRU5fMSAgICAgICAgICAgICAgICAgICAgMHg4MDQzCi0jZGVmaW5lIFdDRDkzMzVfVEVTVF9ERUJVR19ERUJVR19FTl8yICAgICAgICAgICAgICAgICAgICAweDgwNDQKLSNkZWZpbmUgV0NEOTMzNV9URVNUX0RFQlVHX0RFQlVHX0VOXzMgICAgICAgICAgICAgICAgICAgIDB4ODA0NQotI2RlZmluZSBXQ0Q5MzM1X01BWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEZGCi0KLS8qIFNMSU1CVVMgU2xhdmUgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0VOMCAgICAgICAgICAgICAgICAgICAgICgweDMwKQotI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfUlhfMCAgICAgICAgICAgICAoMHgzNCkKLSNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzEgICAgICAgICAgICAgKDB4MzUpCi0jZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19UWF8wICAgICAgICAgICAgICgweDM2KQotI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMSAgICAgICAgICAgICAoMHgzNykKLSNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzAgICAgICAgICAgICAgICAgKDB4MzgpCi0jZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0NMUl9SWF8xICAgICAgICAgICAgICAgICgweDM5KQotI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9DTFJfVFhfMCAgICAgICAgICAgICAgICAoMHgzQSkKLSNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1RYXzEgICAgICAgICAgICAgICAgKDB4M0IpCi0jZGVmaW5lIFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX1JYX1NPVVJDRTAJCSgweDYwKQotI2RlZmluZSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9UWF9TT1VSQ0UwCQkoMHg3MCkKLQotLyogTWFjcm9zIGZvciBQYWNraW5nIFJlZ2lzdGVyIFdyaXRlcyBpbnRvIGEgVTMyICovCi0jZGVmaW5lIFRBU0hBX1BBQ0tFRF9SRUdfU0laRSBzaXplb2YodTMyKQotCi0jZGVmaW5lIFRBU0hBX0NPREVDX1BBQ0tfRU5UUlkocmVnLCBtYXNrLCB2YWwpICgodmFsICYgMHhmZil8XAotCSgobWFzayAmIDB4ZmYpIDw8IDgpfCgocmVnICYgMHhmZmZmKSA8PCAxNikpCi0jZGVmaW5lIFRBU0hBX0NPREVDX1VOUEFDS19FTlRSWShwYWNrZWQsIHJlZywgbWFzaywgdmFsKSBcCi0JZG8geyBcCi0JCSgocmVnKSA9ICgocGFja2VkID4+IDE2KSAmICgweGZmZmYpKSk7IFwKLQkJKChtYXNrKSA9ICgocGFja2VkID4+IDgpICYgKDB4ZmYpKSk7IFwKLQkJKCh2YWwpID0gKChwYWNrZWQpICYgKDB4ZmYpKSk7IFwKLQl9IHdoaWxlICgwKQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzR4L2lycS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd2NkOTM0eC9pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExOGJlMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzR4L2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19XQ0Q5MzRYX0lSUV9IXwotI2RlZmluZSBfX1dDRDkzNFhfSVJRX0hfCi0KLWVudW0gewotCS8qIElOVFJfUkVHIDAgKi8KLQlXQ0Q5MzRYX0lSUV9NSVNDID0gMSwKLQlXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKLQlXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKLQlXQ0Q5MzRYX0lSUV9FQVJfUEFfT0NQX0ZBVUxULAotCVdDRDkzNFhfSVJRX0hQSF9QQV9DTlBMX0NPTVBMRVRFLAotCVdDRDkzNFhfSVJRX0hQSF9QQV9DTlBSX0NPTVBMRVRFLAotCVdDRDkzNFhfSVJRX0VBUl9QQV9DTlBfQ09NUExFVEUsCi0JLyogSU5UUl9SRUcgMSAqLwotCVdDRDkzNFhfSVJRX01CSENfU1dfREVULAotCVdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9ERVQsCi0JV0NEOTM0WF9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAotCVdDRDkzNFhfSVJRX01CSENfQlVUVE9OX1JFTEVBU0VfREVULAotCVdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAotCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzAsCi0JV0NEOTM0WF9JUlFfUkVTRVJWRURfMSwKLQlXQ0Q5MzRYX0lSUV9SRVNFUlZFRF8yLAotCS8qIElOVFJfUkVHIDIgKi8KLQlXQ0Q5MzRYX0lSUV9MSU5FX1BBMV9DTlBfQ09NUExFVEUsCi0JV0NEOTM0WF9JUlFfTElORV9QQTJfQ05QX0NPTVBMRVRFLAotCVdDRDkzNFhfSVJRX1NMTlFfQU5BTE9HX0VSUk9SLAotCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzMsCi0JV0NEOTM0WF9JUlFfU09VTkRXSVJFLAotCVdDRDkzNFhfSVJRX1ZERF9ESUdfUkFNUF9DT01QTEVURSwKLQlXQ0Q5MzRYX0lSUV9SQ09fRVJST1IsCi0JV0NEOTM0WF9JUlFfQ1BFX0VSUk9SLAotCS8qIElOVFJfUkVHIDMgKi8KLQlXQ0Q5MzRYX0lSUV9NQURfQVVESU8sCi0JV0NEOTM0WF9JUlFfTUFEX0JFQUNPTiwKLQlXQ0Q5MzRYX0lSUV9NQURfVUxUUkFTT1VORCwKLQlXQ0Q5MzRYX0lSUV9WQkFUX0FUVEFDSywKLQlXQ0Q5MzRYX0lSUV9WQkFUX1JFU1RPUkUsCi0JV0NEOTM0WF9JUlFfQ1BFMV9JTlRSLAotCVdDRDkzNFhfSVJRX1JFU0VSVkVEXzQsCi0JV0NEOTM0WF9JUlFfU0xOUV9ESUdJVEFMLAotCVdDRDkzNFhfTlVNX0lSUVMsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5MzR4L3JlZ2lzdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODI0ODc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9XQ0Q5MzRYX1JFR0lTVEVSU19ICi0jZGVmaW5lIF9XQ0Q5MzRYX1JFR0lTVEVSU19ICi0KLSNkZWZpbmUgV0NEOTM0WF9QQUdFX1NJWkUgMjU2Ci0jZGVmaW5lIFdDRDkzNFhfTlVNX1BBR0VTIDI1NgotCi1leHRlcm4gY29uc3QgdTggKiBjb25zdCB3Y2Q5MzR4X3JlZ1tXQ0Q5MzRYX05VTV9QQUdFU107Ci0KLWVudW0gewotCVdDRDkzNFhfUEFHRV8wID0gMCwKLQlXQ0Q5MzRYX1BBR0VfMSwKLQlXQ0Q5MzRYX1BBR0VfMiwKLQlXQ0Q5MzRYX1BBR0VfNCA9IDQsCi0JV0NEOTM0WF9QQUdFXzUsCi0JV0NEOTM0WF9QQUdFXzYsCi0JV0NEOTM0WF9QQUdFXzcsCi0JV0NEOTM0WF9QQUdFXzEwID0gMHhBLAotCVdDRDkzNFhfUEFHRV8xMSwKLQlXQ0Q5MzRYX1BBR0VfMTIsCi0JV0NEOTM0WF9QQUdFXzEzLAotCVdDRDkzNFhfUEFHRV8xNCwKLQlXQ0Q5MzRYX1BBR0VfMTUsCi0JV0NEOTM0WF9QQUdFXzB4NTAsCi0JV0NEOTM0WF9QQUdFXzBYODAsCi19OwotCi1lbnVtIHsKLQlXQ0Q5MzRYX1dSSVRFID0gMCwKLQlXQ0Q5MzRYX1JFQUQsCi0JV0NEOTM0WF9SRUFEX1dSSVRFLAotfTsKLQotLyogUGFnZS0wIFJlZ2lzdGVycyAqLwotI2RlZmluZSBXQ0Q5MzRYX1BBR0UwX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0JZUEFTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcgICAgICAgICAgICAgICAgICAgICAweDAwMDMKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEsyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfUlBNX0kyU19EU0RfQ0xLX1NFTCAgICAgICAgICAgICAgICAgIDB4MDAwNQotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX1JQTV9SU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDkKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMICAgICAgICAgICAgICAgMHgwMDExCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMCAgICAgICAgICAgICAgIDB4MDAyMQotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTEgICAgICAgICAgICAgICAweDAwMjIKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9DSElQX0lEX0JZVEUyICAgICAgICAgICAgICAgMHgwMDIzCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfQ0hJUF9JRF9CWVRFMyAgICAgICAgICAgICAgIDB4MDAyNAotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCAgICAgICAgICAgICAgICAgICAweDAwMjUKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9URVNUMCAgICAgICAgICAgICAgICAgMHgwMDI2Ci0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVEVTVDEgICAgICAgICAgICAgICAgIDB4MDAyNwotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQwICAgICAgICAgICAgICAweDAwMjkKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMSAgICAgICAgICAgICAgMHgwMDJhCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDIgICAgICAgICAgICAgIDB4MDAyYgotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQzICAgICAgICAgICAgICAweDAwMmMKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNCAgICAgICAgICAgICAgMHgwMDJkCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDUgICAgICAgICAgICAgIDB4MDAyZQotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ2ICAgICAgICAgICAgICAweDAwMmYKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUNyAgICAgICAgICAgICAgMHgwMDMwCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDggICAgICAgICAgICAgIDB4MDAzMQotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQ5ICAgICAgICAgICAgICAweDAwMzIKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTAgICAgICAgICAgICAgMHgwMDMzCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDExICAgICAgICAgICAgIDB4MDAzNAotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMiAgICAgICAgICAgICAweDAwMzUKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMTMgICAgICAgICAgICAgMHgwMDM2Ci0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0ICAgICAgICAgICAgIDB4MDAzNwotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSAgICAgICAgICAgICAweDAwMzgKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMgICAgICAgICAgICAgICAgMHgwMDM5Ci0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEX05PTk5FR08gICAgICAgIDB4MDAzYQotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0kyQ19TTEFWRV9JRF8xICAgICAgICAgICAgICAweDAwM2IKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9JMkNfU0xBVkVfSURfMiAgICAgICAgICAgICAgMHgwMDNjCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX1NMQVZFX0lEXzMgICAgICAgICAgICAgIDB4MDAzZAotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0FOQV9XQUlUX1NUQVRFX0NUTCAgICAgICAgICAweDAwM2UKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9TTE5RX1dBSVRfU1RBVEVfQ1RMICAgICAgICAgMHgwMDNmCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfSTJDX0FDVElWRSAgICAgICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0FMVF9GVU5DX0VOICAgICAgICAgICAgICAgICAweDAwNDEKLSNkZWZpbmUgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9HUElPX0NUTF9PRSAgICAgICAgICAgICAgICAgMHgwMDQyCi0jZGVmaW5lIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfR1BJT19DVExfREFUQSAgICAgICAgICAgICAgIDB4MDA0MwotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1JYMF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTEKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDFfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDUyCi0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfUlgyX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MwotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1JYM19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTQKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU1Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfUlg1X0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NgotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1JYNl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNTcKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9SWDdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDU4Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgwX0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2MQotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMV9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjIKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDJfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDYzCi0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgzX0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2NAotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYNF9JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjUKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDVfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDY2Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFg2X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2NwotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYN19JTlBfQ0ZHICAgICAgICAgICAgICAgICAgICAweDAwNjgKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDhfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDY5Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFg5X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MDA2YQotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTBfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAweDAwNmIKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDExX0lOUF9DRkcgICAgICAgICAgICAgICAgICAgMHgwMDZjCi0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHICAgICAgICAgICAgICAgICAgIDB4MDA2ZQotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTRfSU5QX0NGRyAgICAgICAgICAgICAgICAgICAweDAwNmYKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9TQl9UWDE1X0lOUF9DRkcgICAgICAgICAgICAgICAgICAgMHgwMDcwCi0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTX1RYMF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MQotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19UWDFfMF9DRkcgICAgICAgICAgICAgICAgICAgICAweDAwNzMKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfVFgxXzFfQ0ZHICAgICAgICAgICAgICAgICAgICAgMHgwMDc0Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MQotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU18xX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODIKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfMl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgzCi0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTXzNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4NAotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19DTEtTUkNfQ1RMICAgICAgICAgICAgICAgICAgICAweDAwODUKLSNkZWZpbmUgV0NEOTM0WF9EQVRBX0hVQl9JMlNfQ09NTU9OX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwMDg2Ci0jZGVmaW5lIFdDRDkzNFhfREFUQV9IVUJfSTJTXzBfVERNX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MDA4NwotI2RlZmluZSBXQ0Q5MzRYX0RBVEFfSFVCX0kyU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAweDAwODgKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDkxCi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8wICAgICAgICAgICAgICAgICAgICAgIDB4MDA5MgotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMCAgICAgICAgICAgICAgICAgICAgICAweDAwOTMKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDk0Ci0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8xICAgICAgICAgICAgICAgICAgICAgIDB4MDA5NQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwOTYKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDk3Ci0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8yICAgICAgICAgICAgICAgICAgICAgIDB4MDA5OAotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwOTkKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDlBCi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV8zICAgICAgICAgICAgICAgICAgICAgIDB4MDA5QgotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfMyAgICAgICAgICAgICAgICAgICAgICAweDAwOUMKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQV9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDlECi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfUkRNQV80ICAgICAgICAgICAgICAgICAgICAgIDB4MDA5RQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1JETUFfNCAgICAgICAgICAgICAgICAgICAgICAweDAwOUYKLSNkZWZpbmUgV0NEOTM0WF9ETUFfUkRNQTRfUFJUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGIxCi0jZGVmaW5lIFdDRDkzNFhfRE1BX1JETUFfU0JUWDBfN19DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDBiOQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9SRE1BX1NCVFg4XzExX0NGRyAgICAgICAgICAgICAgICAgICAgICAweDAwYmEKLSNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGMxCi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8wICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMgotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMCAgICAgICAgICAgICAgICAgICAgICAweDAwYzMKLSNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM0Ci0jZGVmaW5lIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBDNgotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwQzcKLSNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzEgICAgICAgICAgICAgICAgICAgICAgMHgwMEM4Ci0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV8xICAgICAgICAgICAgICAgICAgICAgIDB4MDBDOQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwQ0IKLSNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfNF81X0NGR19XRE1BXzIgICAgICAgICAgICAgICAgICAgICAgMHgwMENDCi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8yICAgICAgICAgICAgICAgICAgICAgIDB4MDBDRAotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwQ0UKLSNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEQwCi0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzRfNV9DRkdfV0RNQV8zICAgICAgICAgICAgICAgICAgICAgIDB4MDBEMQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMyAgICAgICAgICAgICAgICAgICAgICAweDAwRDIKLSNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMEQzCi0jZGVmaW5lIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBENQotI2RlZmluZSBXQ0Q5MzRYX0RNQV9DSF80XzVfQ0ZHX1dETUFfNCAgICAgICAgICAgICAgICAgICAgICAweDAwRDYKLSNkZWZpbmUgV0NEOTM0WF9ETUFfQ0hfMl8zX0NGR19XRE1BXzQgICAgICAgICAgICAgICAgICAgICAgMHgwMEQ3Ci0jZGVmaW5lIFdDRDkzNFhfRE1BX0NIXzBfMV9DRkdfV0RNQV80ICAgICAgICAgICAgICAgICAgICAgIDB4MDBEOAotI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BMF9QUlRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRTEKLSNkZWZpbmUgV0NEOTM0WF9ETUFfV0RNQTNfUFJUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEUyCi0jZGVmaW5lIFdDRDkzNFhfRE1BX1dETUE0X1BSVDBfM19DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDBFMwotI2RlZmluZSBXQ0Q5MzRYX0RNQV9XRE1BNF9QUlQ0XzdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDAwRTQKLSNkZWZpbmUgV0NEOTM0WF9QQUdFMV9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDIKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAzCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDUKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA2Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF82ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDgKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA5Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF85ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwYQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfTF9WQUxfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMGIKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0xfVkFMX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBjCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9EU01fRlJBQ19DVExfMCAgICAgICAgICAgICAgICAgICAgIDB4MDEwZAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfRFNNX0ZSQUNfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAweDAxMGUKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTBmCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAweDAxMTEKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0NPTkZJR19DVExfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMTEyCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9DT05GSUdfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTQKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE1Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExNgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMTcKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTE4Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9URVNUX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExOQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfVEVTVF9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMWEKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1RFU1RfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFiCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9GUkVRX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExYwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfRlJFUV9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMWQKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0ZSRVFfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTFlCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9GUkVRX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExZgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjAKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1NTQ19DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIxCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9TU0NfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1NDX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjMKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX0ZMTF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI0Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyNQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjYKLSNkZWZpbmUgV0NEOTM0WF9DUEVfRkxMX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX0ZMTF9TVEFUVVNfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyOAotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDEKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQyCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0MwotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDQKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ1Ci0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0NgotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNDcKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1VTRVJfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTQ4Ci0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9VU0VSX0NUTF84ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0OQotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNGEKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0xfVkFMX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTRiCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9MX1ZBTF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0YwotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAweDAxNGQKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0RTTV9GUkFDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgMHgwMTRlCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE0ZgotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0NPTkZJR19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMTUxCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9DT05GSUdfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1MgotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAxNTMKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU0Ci0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1NQotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNTYKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTU3Ci0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1OAotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNTkKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1RFU1RfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVhCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9URVNUX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1YgotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNWMKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX0ZSRVFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTVkCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9GUkVRX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE1ZQotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNWYKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTYwCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9TU0NfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2MQotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjIKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NTQ19DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTYzCi0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9GTExfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NAotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjUKLSNkZWZpbmUgV0NEOTM0WF9JMlNfRkxMX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTY2Ci0jZGVmaW5lIFdDRDkzNFhfSTJTX0ZMTF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE2NwotI2RlZmluZSBXQ0Q5MzRYX0kyU19GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxNjgKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTgxCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4MgotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODMKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4NQotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODYKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1VTRVJfQ1RMXzcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4OAotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9VU0VSX0NUTF84ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxODkKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVVNFUl9DVExfOSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMThhCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0xfVkFMX0NUTF8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE4YgotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9MX1ZBTF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOGMKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfRFNNX0ZSQUNfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgMHgwMThkCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0RTTV9GUkFDX0NUTF8xICAgICAgICAgICAgICAgICAgICAgIDB4MDE4ZQotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOGYKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkwCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0NPTkZJR19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5MQotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9DT05GSUdfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTIKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfQ09ORklHX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTkzCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NAotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTUKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk2Ci0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5NwotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOTgKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfVEVTVF9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTk5Ci0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1RFU1RfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5YQotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9URVNUX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWIKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTljCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX0ZSRVFfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE5ZAotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9GUkVRX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOWUKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfRlJFUV9DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTlmCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMAotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9TU0NfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTEKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfU1NDX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWEyCi0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NTQ19DVExfMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhMwotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9GTExfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTQKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfU1RBVFVTXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE1Ci0jZGVmaW5lIFdDRDkzNFhfU0JfRkxMX1NUQVRVU18xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNgotI2RlZmluZSBXQ0Q5MzRYX1NCX0ZMTF9TVEFUVVNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxYTcKLSNkZWZpbmUgV0NEOTM0WF9TQl9GTExfU1RBVFVTXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMWE4Ci0jZGVmaW5lIFdDRDkzNFhfUEFHRTJfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19DUEVfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX1NZU19QU1RBVEVfQ1RMXzAgICAgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8xICAgICAgICAgICAgICAgIDB4MDIwMwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFRkxMX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8wICAgICAgICAgICAgMHgwMjA1Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMSAgICAgICAgICAgIDB4MDIwNgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQX09WRVJSSURFICAgICAweDAyMDcKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMCAgICAgICAgICAgMHgwMjA4Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzEgICAgICAgICAgIDB4MDIwOQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8yICAgICAgICAgICAweDAyMGEKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMyAgICAgICAgICAgMHgwMjBiCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzQgICAgICAgICAgIDB4MDIwYwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl81ICAgICAgICAgICAweDAyMGQKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9EUkFNMV9TSFVURE9XTiAgICAgICAgICAgICAgMHgwMjBlCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9DVEwgICAgICAgICAgICAgICAgIDB4MDIwZgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfT1ZFUlJJREVfQ1RMICAgICAgICAweDAyMTAKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX09WRVJSSURFX0NUTDEgICAgICAgMHgwMjExCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1VTX0JVRl9JTlRfUEVSSU9EICAgICAgICAgICAgICAgICAgIDB4MDIxMgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19DUEFSTUFEX0JVRlJEWV9JTlRfUEVSSU9EICAgICAgICAgICAweDAyMTMKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1ZBX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE0Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1VTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxNQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19NQURfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTYKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE3Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0RNSUMwX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxOAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19ETUlDMV9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMTkKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfRE1JQzJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFhCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0RNSUNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxYgotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWMKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfV0RPR19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjFkCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX0JBQ0tVUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxZQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMWYKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfQ1BFX09DRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjIwCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBBICAgICAgICAgICAgICAgIDB4MDIyMQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQiAgICAgICAgICAgICAgICAweDAyMjIKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMUEgICAgICAgICAgICAgICAgMHgwMjIzCi0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzFCICAgICAgICAgICAgICAgIDB4MDIyNAotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBBICAgICAgICAgICAgICAweDAyMjUKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18wQiAgICAgICAgICAgICAgMHgwMjI2Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVNfMUEgICAgICAgICAgICAgIDB4MDIyNwotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzFCICAgICAgICAgICAgICAweDAyMjgKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBBICAgICAgICAgICAgICAgMHgwMjI5Ci0jZGVmaW5lIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8wQiAgICAgICAgICAgICAgIDB4MDIyYQotI2RlZmluZSBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfQ0xFQVJfMUEgICAgICAgICAgICAgICAweDAyMmIKLSNkZWZpbmUgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzFCICAgICAgICAgICAgICAgMHgwMjJjCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9NQUlOX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4MQotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyODIKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjgzCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4NAotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDAyODUKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjg2Ci0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4NwotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAweDAyODgKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjg5Ci0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4YQotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fSUlSX0NUTF9QVFIgICAgICAgICAgICAgICAgICAweDAyOGIKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMICAgICAgICAgICAgICAgICAgMHgwMjhjCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI4ZAotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOGUKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjhmCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5MAotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOTEKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjkyCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5MwotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF8xICAgICAgICAgICAgICAgICAgICAgICAweDAyOTQKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMjk1Ci0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5NgotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF80ICAgICAgICAgICAgICAgICAgICAgICAweDAyOTcKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjk4Ci0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDI5OQotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF83ICAgICAgICAgICAgICAgICAgICAgICAweDAyOWEKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0JFQUNPTl9DVExfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjliCi0jZGVmaW5lIFdDRDkzNFhfU09DX01BRF9CRUFDT05fSUlSX0NUTF9QVFIgICAgICAgICAgICAgICAgIDB4MDI5YwotI2RlZmluZSBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMICAgICAgICAgICAgICAgICAweDAyOWQKLSNkZWZpbmUgV0NEOTM0WF9TT0NfTUFEX0lOUF9TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjllCi0jZGVmaW5lIFdDRDkzNFhfUEFHRTRfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDEKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0NMUl9DT01NSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAyCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX01BU0swICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwOQotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MGEKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfTUFTSzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDBiCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX01BU0szICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwYwotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMwICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MTEKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDEyCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxMwotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMzICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MTQKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDE5Ci0jZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4xX0NMRUFSMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQxYQotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMV9DTEVBUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MWIKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjFfQ0xFQVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDFjCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9QSU4yX01BU0szICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQyNAotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfUElOMl9TVEFUVVMzICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MmMKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1BJTjJfQ0xFQVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM0Ci0jZGVmaW5lIFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9NQVNLMiAgICAgICAgICAgICAgICAgICAgIDB4MDQzYgotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfTUFTSzMgICAgICAgICAgICAgICAgICAgICAweDA0M2MKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX1NUQVRVUzIgICAgICAgICAgICAgICAgICAgMHgwNDQzCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9DUEVTU19TVU1SWV9TVEFUVVMzICAgICAgICAgICAgICAgICAgIDB4MDQ0NAotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ1BFU1NfU1VNUllfQ0xFQVIyICAgICAgICAgICAgICAgICAgICAweDA0NGIKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0NQRVNTX1NVTVJZX0NMRUFSMyAgICAgICAgICAgICAgICAgICAgMHgwNDRjCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9MRVZFTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2MQotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfTEVWRUwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NjIKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0xFVkVMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDYzCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9MRVZFTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2NAotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQllQQVNTMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NjkKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0JZUEFTUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDZhCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9CWVBBU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ2YgotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQllQQVNTMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NmMKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1NFVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDcxCi0jZGVmaW5lIFdDRDkzNFhfSU5UUl9TRVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ3MgotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfU0VUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0NzMKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX1NFVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc0Ci0jZGVmaW5lIFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDRiMQotI2RlZmluZSBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweDA0YjIKLSNkZWZpbmUgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgMHgwNGIzCi0jZGVmaW5lIFdDRDkzNFhfUEFHRTVfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUwMAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MDEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19SRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTAyCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUxMQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX05VTUJFUl9PRl9CWVRFX01TQiAgICAgICAgICAgICAgICAweDA1MTIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19OVU1CRVJfT0ZfQllURV9MU0IgICAgICAgICAgICAgICAgMHgwNTEzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfTUFTVEVSX0FERFJFU1NfTVNCICAgICAgICAgICAgICAgIDB4MDUxNAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX01BU1RFUl9BRERSRVNTX0xTQiAgICAgICAgICAgICAgICAweDA1MTUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TTEFWRV9BRERSRVNTX01TQiAgICAgICAgICAgICAgICAgMHgwNTE2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU0xBVkVfQUREUkVTU19MU0IgICAgICAgICAgICAgICAgIDB4MDUxNwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMF9JTlRFUlJVUFRfTVNCICAgICAgICAgICAgICAweDA1MTgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19USU1FUjBfSU5URVJSVVBUX0xTQiAgICAgICAgICAgICAgMHgwNTE5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfVElNRVIxX0lOVEVSUlVQVF9NU0IgICAgICAgICAgICAgIDB4MDUxYQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RJTUVSMV9JTlRFUlJVUFRfTFNCICAgICAgICAgICAgICAweDA1MWIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19USU1FUjJfSU5URVJSVVBUX01TQiAgICAgICAgICAgICAgMHgwNTFjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfVElNRVIyX0lOVEVSUlVQVF9MU0IgICAgICAgICAgICAgIDB4MDUxZAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0NPTU1fQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1MjAKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19GUkFNRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgwNTQyCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNXzJORF9EQVRBX0NIMV8yICAgICAgICAgICAgICAgIDB4MDU1YwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV8yTkRfREFUQV9DSDNfNCAgICAgICAgICAgICAgICAweDA1NWQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fMk5EX0RBVEFfQ0g1ICAgICAgICAgICAgICAgICAgMHgwNTVlCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1dfRVZFTlRfUkQgICAgICAgICAgICAgICAgICAgICAgIDB4MDU2MQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NXX0VWRU5UX0NUUkwgICAgICAgICAgICAgICAgICAgICAweDA1NjIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fU0VMRUNUXzEgICAgICAgICAgICAgICAgICAgICAgMHgwNTYzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX1NFTEVDVF8yICAgICAgICAgICAgICAgICAgICAgIDB4MDU2NAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9TRUxFQ1RfMyAgICAgICAgICAgICAgICAgICAgICAweDA1NjUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fU0FNUExJTkdfRlJFUSAgICAgICAgICAgICAgICAgMHgwNTY2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZFUlNJT05fQ1RMICAgICAgICAgICAgIDB4MDU2OQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WRVJTSU9OX1NFTCAgICAgICAgICAgICAweDA1NmEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEFfTVNCICAgICAgICAgICAgICAgMHgwNTZiCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX0RDX0NPTlZfQ0hBX0xTQiAgICAgICAgICAgICAgIDB4MDU2YwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1BETV9EQ19DT05WX0NIQl9NU0IgICAgICAgICAgICAgICAweDA1NmQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fRENfQ09OVl9DSEJfTFNCICAgICAgICAgICAgICAgMHgwNTZlCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUkFNX0NOVFJMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3MQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQkFOSyAgICAgICAgICAgICAgICAgICAgICAgICAweDA1NzIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwNTczCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3NAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yICAgICAgICAgICAgICAgICAgICAgICAweDA1NzUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwNTc2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3NwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV81ICAgICAgICAgICAgICAgICAgICAgICAweDA1NzgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwNTc5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3YQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV84ICAgICAgICAgICAgICAgICAgICAgICAweDA1N2IKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwNTdjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0EgICAgICAgICAgICAgICAgICAgICAgIDB4MDU3ZAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9CICAgICAgICAgICAgICAgICAgICAgICAweDA1N2UKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfQyAgICAgICAgICAgICAgICAgICAgICAgMHgwNTdmCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFX0QgICAgICAgICAgICAgICAgICAgICAgIDB4MDU4MAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV9FICAgICAgICAgICAgICAgICAgICAgICAweDA1ODEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfRiAgICAgICAgICAgICAgICAgICAgICAgMHgwNTgyCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzEwICAgICAgICAgICAgICAgICAgICAgIDB4MDU4MwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xMSAgICAgICAgICAgICAgICAgICAgICAweDA1ODQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTIgICAgICAgICAgICAgICAgICAgICAgMHgwNTg1Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzEzICAgICAgICAgICAgICAgICAgICAgIDB4MDU4NgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNCAgICAgICAgICAgICAgICAgICAgICAweDA1ODcKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTUgICAgICAgICAgICAgICAgICAgICAgMHgwNTg4Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE2ICAgICAgICAgICAgICAgICAgICAgIDB4MDU4OQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xNyAgICAgICAgICAgICAgICAgICAgICAweDA1OGEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMTggICAgICAgICAgICAgICAgICAgICAgMHgwNThiCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzE5ICAgICAgICAgICAgICAgICAgICAgIDB4MDU4YwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xQSAgICAgICAgICAgICAgICAgICAgICAweDA1OGQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUIgICAgICAgICAgICAgICAgICAgICAgMHgwNThlCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFDICAgICAgICAgICAgICAgICAgICAgIDB4MDU4ZgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8xRCAgICAgICAgICAgICAgICAgICAgICAweDA1OTAKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMUUgICAgICAgICAgICAgICAgICAgICAgMHgwNTkxCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzFGICAgICAgICAgICAgICAgICAgICAgIDB4MDU5MgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMCAgICAgICAgICAgICAgICAgICAgICAweDA1OTMKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjEgICAgICAgICAgICAgICAgICAgICAgMHgwNTk0Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzIyICAgICAgICAgICAgICAgICAgICAgIDB4MDU5NQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yMyAgICAgICAgICAgICAgICAgICAgICAweDA1OTYKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjQgICAgICAgICAgICAgICAgICAgICAgMHgwNTk3Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI1ICAgICAgICAgICAgICAgICAgICAgIDB4MDU5OAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yNiAgICAgICAgICAgICAgICAgICAgICAweDA1OTkKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMjcgICAgICAgICAgICAgICAgICAgICAgMHgwNTlhCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzI4ICAgICAgICAgICAgICAgICAgICAgIDB4MDU5YgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yOSAgICAgICAgICAgICAgICAgICAgICAweDA1OWMKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkEgICAgICAgICAgICAgICAgICAgICAgMHgwNTlkCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJCICAgICAgICAgICAgICAgICAgICAgIDB4MDU5ZQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yQyAgICAgICAgICAgICAgICAgICAgICAweDA1OWYKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMkQgICAgICAgICAgICAgICAgICAgICAgMHgwNWEwCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzJFICAgICAgICAgICAgICAgICAgICAgIDB4MDVhMQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8yRiAgICAgICAgICAgICAgICAgICAgICAweDA1YTIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzAgICAgICAgICAgICAgICAgICAgICAgMHgwNWEzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzMxICAgICAgICAgICAgICAgICAgICAgIDB4MDVhNAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zMiAgICAgICAgICAgICAgICAgICAgICAweDA1YTUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzMgICAgICAgICAgICAgICAgICAgICAgMHgwNWE2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM0ICAgICAgICAgICAgICAgICAgICAgIDB4MDVhNwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zNSAgICAgICAgICAgICAgICAgICAgICAweDA1YTgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzYgICAgICAgICAgICAgICAgICAgICAgMHgwNWE5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzM3ICAgICAgICAgICAgICAgICAgICAgIDB4MDVhYQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zOCAgICAgICAgICAgICAgICAgICAgICAweDA1YWIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfMzkgICAgICAgICAgICAgICAgICAgICAgMHgwNWFjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNBICAgICAgICAgICAgICAgICAgICAgIDB4MDVhZAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zQiAgICAgICAgICAgICAgICAgICAgICAweDA1YWUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0MgICAgICAgICAgICAgICAgICAgICAgMHgwNWFmCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfU1JBTV9CWVRFXzNEICAgICAgICAgICAgICAgICAgICAgIDB4MDViMAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1NSQU1fQllURV8zRSAgICAgICAgICAgICAgICAgICAgICAweDA1YjEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19TUkFNX0JZVEVfM0YgICAgICAgICAgICAgICAgICAgICAgMHgwNWIyCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfVE9QX0NUUkwxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDViMwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX1RPUF9DVFJMMiAgICAgICAgICAgICAgICAgICAgICAgICAweDA1YjQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19QRE1fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNWI1Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfUERNX01VVEVfQ1RSTCAgICAgICAgICAgICAgICAgICAgIDB4MDViNgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfQ1RSTCAgICAgICAgICAgICAgICAgICAweDA1YjcKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19ERUNfQllQQVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgwNWI4Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfREVDX0JZUEFTU19GUyAgICAgICAgICAgICAgICAgICAgIDB4MDViOQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0RFQ19CWVBBU1NfSU5fU0VMICAgICAgICAgICAgICAgICAweDA1YmEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19HUE9VVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwNWJiCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfR1BPVVRfVkFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDViYwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0FOQV9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgICAgICAweDA1YmUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19BTkFfSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgMHgwNWJmCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfQU5BX0lOVEVSUlVQVF9DTFIgICAgICAgICAgICAgICAgIDB4MDVjMAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lQX1RFU1RJTkcgICAgICAgICAgICAgICAgICAgICAgICAweDA1YzEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05UUkwgICAgICAgICAgICAgICAgICAgMHgwNWUzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NOVCAgICAgICAgICAgICAgICAgICAgIDB4MDVlOQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTlRfTVNCICAgICAgICAgICAgICAgICAweDA1ZWIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ05UX0xTQiAgICAgICAgICAgICAgICAgMHgwNWVjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0swICAgICAgICAgICAgICAgICAgIDB4MDVmMQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLMSAgICAgICAgICAgICAgICAgICAweDA1ZjIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfTUFTSzIgICAgICAgICAgICAgICAgICAgMHgwNWYzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX01BU0szICAgICAgICAgICAgICAgICAgIDB4MDVmNAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9NQVNLNCAgICAgICAgICAgICAgICAgICAweDA1ZjUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMCAgICAgICAgICAgICAgICAgMHgwNWY2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzEgICAgICAgICAgICAgICAgIDB4MDVmNwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9TVEFUVVMyICAgICAgICAgICAgICAgICAweDA1ZjgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfU1RBVFVTMyAgICAgICAgICAgICAgICAgMHgwNWY5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX1NUQVRVUzQgICAgICAgICAgICAgICAgIDB4MDVmYQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIwICAgICAgICAgICAgICAgICAgICAweDA1ZmIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSMSAgICAgICAgICAgICAgICAgICAgMHgwNWZjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9ESUdfSU5URVJSVVBUX0NMUjIgICAgICAgICAgICAgICAgICAgIDB4MDVmZAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfRElHX0lOVEVSUlVQVF9DTFIzICAgICAgICAgICAgICAgICAgICAweDA1ZmUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0RJR19JTlRFUlJVUFRfQ0xSNCAgICAgICAgICAgICAgICAgICAgMHgwNWZmCi0jZGVmaW5lIFdDRDkzNFhfQU5BX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMAotI2RlZmluZSBXQ0Q5MzRYX0FOQV9CSUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDEKLSNkZWZpbmUgV0NEOTM0WF9BTkFfUkNPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAzCi0jZGVmaW5lIFdDRDkzNFhfQU5BX1BBR0U2X1NQQVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNAotI2RlZmluZSBXQ0Q5MzRYX0FOQV9QQUdFNl9TUEFSRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDUKLSNkZWZpbmUgV0NEOTM0WF9BTkFfQlVDS19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA2Ci0jZGVmaW5lIFdDRDkzNFhfQU5BX0JVQ0tfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwNwotI2RlZmluZSBXQ0Q5MzRYX0FOQV9SWF9TVVBQTElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MDgKLSNkZWZpbmUgV0NEOTM0WF9BTkFfSFBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjA5Ci0jZGVmaW5lIFdDRDkzNFhfQU5BX0VBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwYQotI2RlZmluZSBXQ0Q5MzRYX0FOQV9MT18xXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGIKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUFEX1NFVFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjBkCi0jZGVmaW5lIFdDRDkzNFhfQU5BX0FNSUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwZQotI2RlZmluZSBXQ0Q5MzRYX0FOQV9BTUlDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MGYKLSNkZWZpbmUgV0NEOTM0WF9BTkFfQU1JQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjEwCi0jZGVmaW5lIFdDRDkzNFhfQU5BX0FNSUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxMQotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTQKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE1Ci0jZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfWkRFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxNgotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MTcKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjE4Ci0jZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxOQotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWEKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFiCi0jZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfQlROMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxYwotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MWQKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjFlCi0jZGVmaW5lIFdDRDkzNFhfQU5BX01CSENfQlRONSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYxZgotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUJIQ19CVE43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjIxCi0jZGVmaW5lIFdDRDkzNFhfQU5BX01JQ0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyMgotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NSUNCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTUlDQjJfUkFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI0Ci0jZGVmaW5lIFdDRDkzNFhfQU5BX01JQ0IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyNQotI2RlZmluZSBXQ0Q5MzRYX0FOQV9NSUNCNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjYKLSNkZWZpbmUgV0NEOTM0WF9BTkFfVkJBREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjI3Ci0jZGVmaW5lIFdDRDkzNFhfQklBU19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyOAotI2RlZmluZSBXQ0Q5MzRYX0JJQVNfVkJHX0ZJTkVfQURKICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjkKLSNkZWZpbmUgV0NEOTM0WF9SQ09fQ1RSTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjJlCi0jZGVmaW5lIFdDRDkzNFhfUkNPX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYyZgotI2RlZmluZSBXQ0Q5MzRYX1JDT19DQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzAKLSNkZWZpbmUgV0NEOTM0WF9SQ09fQ0FMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjMxCi0jZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzMgotI2RlZmluZSBXQ0Q5MzRYX1JDT19URVNUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzMKLSNkZWZpbmUgV0NEOTM0WF9SQ09fQ0FMX09VVF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM0Ci0jZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF9PVVRfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzNQotI2RlZmluZSBXQ0Q5MzRYX1JDT19DQUxfT1VUXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MzYKLSNkZWZpbmUgV0NEOTM0WF9SQ09fQ0FMX09VVF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjM3Ci0jZGVmaW5lIFdDRDkzNFhfUkNPX0NBTF9PVVRfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzOAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTU9ERV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2EKLSNkZWZpbmUgV0NEOTM0WF9TSURPX01PREVfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNiCi0jZGVmaW5lIFdDRDkzNFhfU0lET19NT0RFXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzYwotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTU9ERV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2M2QKLSNkZWZpbmUgV0NEOTM0WF9TSURPX1ZDTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjNlCi0jZGVmaW5lIFdDRDkzNFhfU0lET19WQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYzZgotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fVkNMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDAKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQxCi0jZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0MgotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDMKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ0Ci0jZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0NQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDYKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjQ3Ci0jZGVmaW5lIFdDRDkzNFhfU0lET19DQ0xfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0OAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0NMXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NDkKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NDTF8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRhCi0jZGVmaW5lIFdDRDkzNFhfU0lET19GSUxURVJfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0YgotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fRklMVEVSXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NGMKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0RSSVZFUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjRkCi0jZGVmaW5lIFdDRDkzNFhfU0lET19EUklWRVJfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY0ZQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fRFJJVkVSXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NGYKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NBTF9DT0RFX0VYVF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjUwCi0jZGVmaW5lIFdDRDkzNFhfU0lET19DQUxfQ09ERV9FWFRfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1MQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fQ0FMX0NPREVfT1VUXzEgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTIKLSNkZWZpbmUgV0NEOTM0WF9TSURPX0NBTF9DT0RFX09VVF8yICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjUzCi0jZGVmaW5lIFdDRDkzNFhfU0lET19URVNUXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1NAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fVEVTVF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTUKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX0NUTF9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU2Ci0jZGVmaW5lIFdDRDkzNFhfTUJIQ19DVExfQU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1NwotI2RlZmluZSBXQ0Q5MzRYX01CSENfQ1RMX1NQQVJFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NTgKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX0NUTF9TUEFSRV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjU5Ci0jZGVmaW5lIFdDRDkzNFhfTUJIQ19DVExfQkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1YQotI2RlZmluZSBXQ0Q5MzRYX01CSENfU1RBVFVTX1NQQVJFXzEgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWIKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX1RFU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVjCi0jZGVmaW5lIFdDRDkzNFhfVkJBRENfU1VCQkxPQ0tfRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY1ZAotI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX0lCSUFTX0ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NWUKLSNkZWZpbmUgV0NEOTM0WF9WQkFEQ19CSUFTX0FEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjVmCi0jZGVmaW5lIFdDRDkzNFhfVkJBRENfRkVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2MAotI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX0FEQ19SRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjEKLSNkZWZpbmUgV0NEOTM0WF9WQkFEQ19BRENfSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjYyCi0jZGVmaW5lIFdDRDkzNFhfVkJBRENfQURDX1NBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2MwotI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjQKLSNkZWZpbmUgV0NEOTM0WF9MRE9IX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjY3Ci0jZGVmaW5lIFdDRDkzNFhfTERPSF9CSUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2OAotI2RlZmluZSBXQ0Q5MzRYX0xET0hfU1RCX0xPQURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NjkKLSNkZWZpbmUgV0NEOTM0WF9MRE9IX1NMT1dSQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZhCi0jZGVmaW5lIFdDRDkzNFhfTUlDQjFfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2YgotI2RlZmluZSBXQ0Q5MzRYX01JQ0IxX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmMKLSNkZWZpbmUgV0NEOTM0WF9NSUNCMV9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjZkCi0jZGVmaW5lIFdDRDkzNFhfTUlDQjJfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY2ZQotI2RlZmluZSBXQ0Q5MzRYX01JQ0IyX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NmYKLSNkZWZpbmUgV0NEOTM0WF9NSUNCMl9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjcwCi0jZGVmaW5lIFdDRDkzNFhfTUlDQjNfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3MQotI2RlZmluZSBXQ0Q5MzRYX01JQ0IzX1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzIKLSNkZWZpbmUgV0NEOTM0WF9NSUNCM19URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjczCi0jZGVmaW5lIFdDRDkzNFhfTUlDQjRfVEVTVF9DVExfMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NAotI2RlZmluZSBXQ0Q5MzRYX01JQ0I0X1RFU1RfQ1RMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzUKLSNkZWZpbmUgV0NEOTM0WF9NSUNCNF9URVNUX0NUTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc2Ci0jZGVmaW5lIFdDRDkzNFhfVFhfQ09NX0FEQ19WQ00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3NwotI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9CSUFTX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2NzgKLSNkZWZpbmUgV0NEOTM0WF9UWF9DT01fQURDX0lOVDFfSUIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjc5Ci0jZGVmaW5lIFdDRDkzNFhfVFhfQ09NX0FEQ19JTlQyX0lCICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY3YQotI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDA2N2IKLSNkZWZpbmUgV0NEOTM0WF9UWF9DT01fVFhGRV9ESVZfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwNjdjCi0jZGVmaW5lIFdDRDkzNFhfVFhfQ09NX1RYRkVfRElWX1NUT1BfOVA2TSAgICAgICAgICAgICAgICAgIDB4MDY3ZAotI2RlZmluZSBXQ0Q5MzRYX1RYX0NPTV9UWEZFX0RJVl9TVE9QXzEyUDI4OE0gICAgICAgICAgICAgICAweDA2N2UKLSNkZWZpbmUgV0NEOTM0WF9UWF8xXzJfVEVTVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjdmCi0jZGVmaW5lIFdDRDkzNFhfVFhfMV8yX0FEQ19JQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MAotI2RlZmluZSBXQ0Q5MzRYX1RYXzFfMl9BVEVTVF9SRUZDVEwgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODEKLSNkZWZpbmUgV0NEOTM0WF9UWF8xXzJfVEVTVF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjgyCi0jZGVmaW5lIFdDRDkzNFhfVFhfMV8yX1RFU1RfQkxLX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4MwotI2RlZmluZSBXQ0Q5MzRYX1RYXzFfMl9UWEZFX0NMS0RJViAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODQKLSNkZWZpbmUgV0NEOTM0WF9UWF8xXzJfU0FSMV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg1Ci0jZGVmaW5lIFdDRDkzNFhfVFhfMV8yX1NBUjJfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4NgotI2RlZmluZSBXQ0Q5MzRYX1RYXzNfNF9URVNUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ODcKLSNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfQURDX0lCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjg4Ci0jZGVmaW5lIFdDRDkzNFhfVFhfM180X0FURVNUX1JFRkNUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4OQotI2RlZmluZSBXQ0Q5MzRYX1RYXzNfNF9URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGEKLSNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfVEVTVF9CTEtfRU4gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhiCi0jZGVmaW5lIFdDRDkzNFhfVFhfM180X1RYRkVfQ0xLRElWICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY4YwotI2RlZmluZSBXQ0Q5MzRYX1RYXzNfNF9TQVIxX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OGQKLSNkZWZpbmUgV0NEOTM0WF9UWF8zXzRfU0FSMl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjhlCi0jZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX01PREVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5NwotI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9NT0RFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OTgKLSNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfTU9ERV8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjk5Ci0jZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0NUUkxfVkNMXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5YQotI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9DVFJMX1ZDTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWIKLSNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjljCi0jZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDY5ZAotI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9DVFJMX0NDTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2OWUKLSNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQ1RSTF9DQ0xfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjlmCi0jZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX0NUUkxfQ0NMXzUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhMAotI2RlZmluZSBXQ0Q5MzRYX0NMQVNTSF9CVUNLX1RNVVhfQV9EICAgICAgICAgICAgICAgICAgICAgICAweDA2YTEKLSNkZWZpbmUgV0NEOTM0WF9DTEFTU0hfQlVDS19TV19EUlZfQ05UTCAgICAgICAgICAgICAgICAgICAgMHgwNmEyCi0jZGVmaW5lIFdDRDkzNFhfQ0xBU1NIX1NQQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhMwotI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTQKLSNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF8xICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmE1Ci0jZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhNgotI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzMgICAgICAgICAgICAgICAgICAgICAgICAweDA2YTcKLSNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF80ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmE4Ci0jZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhOQotI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzYgICAgICAgICAgICAgICAgICAgICAgICAweDA2YWEKLSNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF83ICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmFiCi0jZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHX0NUUkxfOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZhYwotI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR19DVFJMXzkgICAgICAgICAgICAgICAgICAgICAgICAweDA2YWQKLSNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8xICAgICAgICAgICAgICAgICAgICAgMHgwNmFlCi0jZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19WTkVHREFDX0NUUkxfMiAgICAgICAgICAgICAgICAgICAgIDB4MDZhZgotI2RlZmluZSBXQ0Q5MzRYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzMgICAgICAgICAgICAgICAgICAgICAweDA2YjAKLSNkZWZpbmUgV0NEOTM0WF9GTFlCQUNLX0NUUkxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmIxCi0jZGVmaW5lIFdDRDkzNFhfRkxZQkFDS19URVNUX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiMgotI2RlZmluZSBXQ0Q5MzRYX1JYX0FVWF9TV19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjMKLSNkZWZpbmUgV0NEOTM0WF9SWF9QQV9BVVhfSU5fQ09OTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI0Ci0jZGVmaW5lIFdDRDkzNFhfUlhfVElNRVJfRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiNQotI2RlZmluZSBXQ0Q5MzRYX1JYX09DUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjYKLSNkZWZpbmUgV0NEOTM0WF9SWF9PQ1BfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmI3Ci0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19FQVJfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiOAotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRUFSX0FNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YjkKLSNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0hQSF9MRE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmJhCi0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19IUEhfUEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiYgotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfSFBIX1JEQUNCVUZGX0NOUDIgICAgICAgICAgICAgICAgICAweDA2YmMKLSNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0hQSF9SREFDX0xETyAgICAgICAgICAgICAgICAgICAgICAgMHgwNmJkCi0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19IUEhfQ05QMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZiZQotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfSFBIX0xPV1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAweDA2YmYKLSNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0RJRkZMT19QQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMwCi0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19ESUZGTE9fUkVGICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjMQotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRElGRkxPX0xETyAgICAgICAgICAgICAgICAgICAgICAgICAweDA2YzIKLSNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX1NFTE9fREFDX1BBICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmMzCi0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19CVUNLX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjNAotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfQlVDS19WUkVGX0VSUkFNUCAgICAgICAgICAgICAgICAgICAweDA2YzUKLSNkZWZpbmUgV0NEOTM0WF9SWF9CSUFTX0ZMWUJfRVJSQU1QICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmM2Ci0jZGVmaW5lIFdDRDkzNFhfUlhfQklBU19GTFlCX0JVRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjNwotI2RlZmluZSBXQ0Q5MzRYX1JYX0JJQVNfRkxZQl9NSURfUlNUICAgICAgICAgICAgICAgICAgICAgICAweDA2YzgKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmM5Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX1JfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjYQotI2RlZmluZSBXQ0Q5MzRYX0hQSF9DTlBfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2IKLSNkZWZpbmUgV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNjCi0jZGVmaW5lIFdDRDkzNFhfSFBIX0NOUF9XR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZjZAotI2RlZmluZSBXQ0Q5MzRYX0hQSF9PQ1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2Y2UKLSNkZWZpbmUgV0NEOTM0WF9IUEhfQVVUT19DSE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmNmCi0jZGVmaW5lIFdDRDkzNFhfSFBIX0NIT1BfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMAotI2RlZmluZSBXQ0Q5MzRYX0hQSF9QQV9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDEKLSNkZWZpbmUgV0NEOTM0WF9IUEhfUEFfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQyCi0jZGVmaW5lIFdDRDkzNFhfSFBIX0xfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkMwotI2RlZmluZSBXQ0Q5MzRYX0hQSF9MX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDQKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTF9BVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ1Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX1JfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkNgotI2RlZmluZSBXQ0Q5MzRYX0hQSF9SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZDcKLSNkZWZpbmUgV0NEOTM0WF9IUEhfUl9BVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmQ4Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX1JEQUNfQ0xLX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkOQotI2RlZmluZSBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwyICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGEKLSNkZWZpbmUgV0NEOTM0WF9IUEhfUkRBQ19MRE9fQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRiCi0jZGVmaW5lIFdDRDkzNFhfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMICAgICAgICAgICAgICAgICAgIDB4MDZkYwotI2RlZmluZSBXQ0Q5MzRYX0hQSF9SRUZCVUZGX1VIUUFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDA2ZGQKLSNkZWZpbmUgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmRlCi0jZGVmaW5lIFdDRDkzNFhfSFBIX0xfREFDX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZkZgotI2RlZmluZSBXQ0Q5MzRYX0hQSF9SX0RBQ19DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTAKLSNkZWZpbmUgV0NEOTM0WF9FQVJfRU5fUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmUxCi0jZGVmaW5lIFdDRDkzNFhfRUFSX0NNQlVGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlMgotI2RlZmluZSBXQ0Q5MzRYX0VBUl9JQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTMKLSNkZWZpbmUgV0NEOTM0WF9FQVJfRU5fREJHX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU0Ci0jZGVmaW5lIFdDRDkzNFhfRUFSX0NOUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlNQotI2RlZmluZSBXQ0Q5MzRYX0VBUl9EQUNfQ1RMX0FURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTYKLSNkZWZpbmUgV0NEOTM0WF9FQVJfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmU3Ci0jZGVmaW5lIFdDRDkzNFhfRUFSX0VBUl9NSVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlOAotI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZTkKLSNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0xPMl9DT01QQU5ERVIgICAgICAgICAgICAgICAgICAgICAgMHgwNmVhCi0jZGVmaW5lIFdDRDkzNFhfRElGRl9MT19MTzFfQ09NUEFOREVSICAgICAgICAgICAgICAgICAgICAgIDB4MDZlYgotI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fQ09NTU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZWMKLSNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0JZUEFTU19FTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNmVkCi0jZGVmaW5lIFdDRDkzNFhfRElGRl9MT19DTlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDZlZQotI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fQ09SRV9PVVRfUFJPRyAgICAgICAgICAgICAgICAgICAgICAweDA2ZWYKLSNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX0xET19PVVRfUFJPRyAgICAgICAgICAgICAgICAgICAgICAgMHgwNmYwCi0jZGVmaW5lIFdDRDkzNFhfRElGRl9MT19DT01fU1dDQVBfUkVGQlVGX0ZSRVEgICAgICAgICAgICAgIDB4MDZmMQotI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fQ09NX1BBX0ZSRVEgICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjIKLSNkZWZpbmUgV0NEOTM0WF9ESUZGX0xPX1JFU0VSVkVEX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMHgwNmYzCi0jZGVmaW5lIFdDRDkzNFhfRElGRl9MT19MTzFfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDZmNAotI2RlZmluZSBXQ0Q5MzRYX0RJRkZfTE9fTE8xX1NUQVRVU18yICAgICAgICAgICAgICAgICAgICAgICAweDA2ZjUKLSNkZWZpbmUgV0NEOTM0WF9BTkFfTkVXX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgMHgwNzAwCi0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwMQotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzAzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwNAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX0xET19DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAweDA3MDUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9MRE9fT0NQX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgMHgwNzA2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfVFhfTERPX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIDB4MDcwNwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1RYX0RSVl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAweDA3MDgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9SWF9DT05GSUdfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwNzA5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfUlhfQ09ORklHXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwYQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfQU5BX1BMTF9FTkFCTEVTICAgICAgICAgICAgICAgICAgICAgICAweDA3MGIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0FOQV9QTExfUFJFU0VUICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzBjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9BTkFfUExMX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcwZAotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfUExMX0VOQUJMRVMgICAgICAgICAgICAgICAgICAgICAgICAweDA3MGUKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX1BMTF9QUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzBmCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19QTExfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxMAotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTEKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzEyCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxMwotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfWE9fUFJHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTQKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX1hPX0NBUF9YVFAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzE1Ci0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19YT19DQVBfWFRNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxNgotI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0JTVF9FTl9ETFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MTgKLSNkZWZpbmUgV0NEOTM0WF9CT09TVF9DVFJMX0lMSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzE5Ci0jZGVmaW5lIFdDRDkzNFhfQk9PU1RfVk9VVF9TRVRUSU5HICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcxYQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfQV9TVEFSVFVQICAgICAgICAgICAgICAgICAgICAweDA3MWIKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfU1RBUlRVUCAgICAgICAgICAgICAgICAgICAgMHgwNzFjCi0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX0ZSRVExICAgICAgICAgICAgICAgICAgICAgIDB4MDcxZAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMiAgICAgICAgICAgICAgICAgICAgICAweDA3MWUKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19FTEVDVF9SRU1fQ0xBTVBfQ1RMICAgICAgICAgICAgICAgMHgwNzFmCi0jZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyMAotI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX0NUTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjEKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwNzIyCi0jZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MDcyMwotI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX1pERVRfUkFNUF9DVEwgICAgICAgICAgICAgICAgICAgICAweDA3MjQKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19GU01fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzI1Ci0jZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfQURDX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDcyNgotI2RlZmluZSBXQ0Q5MzRYX1RYX05FV19BTUlDXzRfNV9TRUwgICAgICAgICAgICAgICAgICAgICAgICAweDA3MjcKLSNkZWZpbmUgV0NEOTM0WF9WQkFEQ19ORVdfQURDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzJmCi0jZGVmaW5lIFdDRDkzNFhfVkJBRENfTkVXX0FEQ19ET1VUTVNCICAgICAgICAgICAgICAgICAgICAgIDB4MDczMAotI2RlZmluZSBXQ0Q5MzRYX1ZCQURDX05FV19BRENfRE9VVExTQiAgICAgICAgICAgICAgICAgICAgICAweDA3MzEKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgMHgwNzMyCi0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMICAgICAgICAgICAgICAgICAgIDB4MDczMwotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTF9MICAgICAgICAgICAgICAgICAweDA3MzMKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX1ZSRUZfQ1RMICAgICAgICAgICAgICAgICAgMHgwNzM0Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19PVkVSUklERV9DVEwgICAgICAgICAgICAgIDB4MDczNQotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfTUlTQzEgICAgICAgICAgICAgICAgICAgICAweDA3MzYKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfUiAgICAgICAgICAgICAgICAgMHgwNzM2Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDczNwotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyICAgICAgICAgICAgICAgICAgICAgICAweDA3MzgKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MgICAgICAgICAgICAgICAgICAgMHgwNzM5Ci0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSAgICAgICAgICAgICAgICAgICAgIDB4MDczYQotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIgICAgICAgICAgICAgICAgICAgICAweDA3M2IKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzICAgICAgICAgICAgICAgICAgICAgMHgwNzNjCi0jZGVmaW5lIFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCAgICAgICAgICAgICAgICAgICAgIDB4MDczZAotI2RlZmluZSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIgICAgICAgICAgICAgICAgICAweDA3M2UKLSNkZWZpbmUgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MzICAgICAgICAgICAgICAgICAgMHgwNzNmCi0jZGVmaW5lIFdDRDkzNFhfUlhfTkVXX0lOVF9IUEhfUkRBQ19CSUFTX0xPSElGSSAgICAgICAgICAgIDB4MDc0NQotI2RlZmluZSBXQ0Q5MzRYX1JYX05FV19JTlRfSFBIX1JEQUNfQklBU19VTFAgICAgICAgICAgICAgICAweDA3NDYKLSNkZWZpbmUgV0NEOTM0WF9SWF9ORVdfSU5UX0hQSF9SREFDX0xET19MUCAgICAgICAgICAgICAgICAgMHgwNzQ3Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9MRE9fVEVTVCAgICAgICAgICAgICAgICAgIDB4MDc0YgotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfTERPX0RFQlVHXzEgICAgICAgICAgICAgICAweDA3NGMKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX0xET19ERUJVR18yICAgICAgICAgICAgICAgMHgwNzRkCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9UWF9MRE9fVEVTVCAgICAgICAgICAgICAgIDB4MDc0ZQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfVFhfRFJWX1RFU1QgICAgICAgICAgICAgICAweDA3NGYKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwNzUwCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9SWF9URVNUX1NUQVRVUyAgICAgICAgICAgIDB4MDc1MQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUlhfREVCVUdfMSAgICAgICAgICAgICAgICAweDA3NTIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JYX0RFQlVHXzIgICAgICAgICAgICAgICAgMHgwNzUzCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9DTEtfQ1RSTCAgICAgICAgICAgICAgICAgIDB4MDc1NAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUkVTRVJWRURfMSAgICAgICAgICAgICAgICAweDA3NTUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1JFU0VSVkVEXzIgICAgICAgICAgICAgICAgMHgwNzU2Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUE9TVF9ESVZfUkVHMCAgICAgICAgIDB4MDc1NwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BPU1RfRElWX1JFRzEgICAgICAgICAweDA3NTgKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9SRUZfRElWX1JFRzAgICAgICAgICAgMHgwNzU5Ci0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfUkVGX0RJVl9SRUcxICAgICAgICAgIDB4MDc1YQotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0ZJTFRFUl9SRUcwICAgICAgICAgICAweDA3NWIKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9GSUxURVJfUkVHMSAgICAgICAgICAgMHgwNzVjCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfTF9WQUwgICAgICAgICAgICAgICAgIDB4MDc1ZAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX01fVkFMICAgICAgICAgICAgICAgICAweDA3NWUKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9OX1ZBTCAgICAgICAgICAgICAgICAgMHgwNzVmCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcwICAgICAgICAgICAgIDB4MDc2MAotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX1BGRF9DUF9EU01fUFJPRyAgICAgICAweDA3NjEKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9WQ09fUFJPRyAgICAgICAgICAgICAgMHgwNzYyCi0jZGVmaW5lIFdDRDkzNFhfU0xOUV9JTlRfQU5BX0lOVF9QTExfVEVTVF9SRUcxICAgICAgICAgICAgIDB4MDc2MwotI2RlZmluZSBXQ0Q5MzRYX1NMTlFfSU5UX0FOQV9JTlRfUExMX0xET19MT0NLX0NGRyAgICAgICAgICAweDA3NjQKLSNkZWZpbmUgV0NEOTM0WF9TTE5RX0lOVF9BTkFfSU5UX1BMTF9ESUdfTE9DS19ERVRfQ0ZHICAgICAgMHgwNzY1Ci0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfUE9TVF9ESVZfUkVHMCAgICAgICAgICAgICAgICAgIDB4MDc2YwotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzEgICAgICAgICAgICAgICAgICAweDA3NmQKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9SRUZfRElWX1JFRzAgICAgICAgICAgICAgICAgICAgMHgwNzZlCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcxICAgICAgICAgICAgICAgICAgIDB4MDc2ZgotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX0ZJTFRFUl9SRUcwICAgICAgICAgICAgICAgICAgICAweDA3NzAKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMSAgICAgICAgICAgICAgICAgICAgMHgwNzcxCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfUExMX0xfVkFMICAgICAgICAgICAgICAgICAgICAgIDB4MDc3MgotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BMTF9NX1ZBTCAgICAgICAgICAgICAgICAgICAgICAweDA3NzMKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTl9WQUwgICAgICAgICAgICAgICAgICAgICAgMHgwNzc0Ci0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcwICAgICAgICAgICAgICAgICAgICAgIDB4MDc3NQotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1BGRF9DUF9EU01fUFJPRyAgICAgICAgICAgICAgICAweDA3NzYKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9WQ09fUFJPRyAgICAgICAgICAgICAgICAgICAgICAgMHgwNzc3Ci0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcxICAgICAgICAgICAgICAgICAgICAgIDB4MDc3OAotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX0xET19MT0NLX0NGRyAgICAgICAgICAgICAgICAgICAweDA3NzkKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9ESUdfTE9DS19ERVRfQ0ZHICAgICAgICAgICAgICAgMHgwNzdhCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfQ0xLX1RFU1QxICAgICAgICAgICAgICAgICAgICAgIDB4MDc3YgotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX0NMS19URVNUMiAgICAgICAgICAgICAgICAgICAgICAweDA3N2MKLSNkZWZpbmUgV0NEOTM0WF9DTEtfU1lTX0lOVF9DTEtfVEVTVDMgICAgICAgICAgICAgICAgICAgICAgMHgwNzdkCi0jZGVmaW5lIFdDRDkzNFhfQ0xLX1NZU19JTlRfWE9fVEVTVDEgICAgICAgICAgICAgICAgICAgICAgIDB4MDc3ZQotI2RlZmluZSBXQ0Q5MzRYX0NMS19TWVNfSU5UX1hPX1RFU1QyICAgICAgICAgICAgICAgICAgICAgICAweDA3N2YKLSNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfVkNPTVBfSFlTVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNzg3Ci0jZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX1ZMT09QX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgIDB4MDc4OAotI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX0lERUxUQSAgICAgICAgICAgICAgICAgICAgICAweDA3ODkKLSNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9JTElNX1NUQVJUVVAgICAgICAgICAgICAgICAgMHgwNzhhCi0jZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX0NUUkxfTUlOX09OVElNRSAgICAgICAgICAgICAgICAgIDB4MDc4YgotI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9DVFJMX01BWF9PTlRJTUUgICAgICAgICAgICAgICAgICAweDA3OGMKLSNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfQ1RSTF9USU1JTkcgICAgICAgICAgICAgICAgICAgICAgMHgwNzhkCi0jZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX1RNVVhfQV9EICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc4ZQotI2RlZmluZSBXQ0Q5MzRYX0JPT1NUX0lOVF9TV19EUlZfQ05UTCAgICAgICAgICAgICAgICAgICAgICAweDA3OGYKLSNkZWZpbmUgV0NEOTM0WF9CT09TVF9JTlRfU1BBUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzkwCi0jZGVmaW5lIFdDRDkzNFhfQk9PU1RfSU5UX1NQQVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc5MQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDA3OTYKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfU1BBUkVfMSAgICAgICAgICAgICAgICAgICAgICAgMHgwNzk3Ci0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0RFQlVHX1ZPVVRfU0VUVElOR19BICAgICAgICAgIDB4MDc5OAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ERUJVR19WT1VUX1NFVFRJTkdfRCAgICAgICAgICAweDA3OTkKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9JTkNfV0FJVCAgICAgICAgICAgICAgICAgMHgwNzlhCi0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfQ1RMICAgICAgICAgICAgIDB4MDc5YgotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0lCTEVFRF9DVEwgICAgICAgICAgICAgICAweDA3OWMKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfREVCVUdfQ1BST1ZSX1RFU1QgICAgICAgICAgICAgMHgwNzlkCi0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX1JBTVBfQ1RMX0EgICAgICAgICAgICAgICAgICAgIDB4MDc5ZQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9SQU1QX0NUTF9EICAgICAgICAgICAgICAgICAgICAweDA3OWYKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfUkFNUF9USU1FT1VUX1BFUklPRCAgICAgICAgICAgMHgwN2EwCi0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0RZTkFNSUNfSVBFQUtfU0VUVElORzEgICAgICAgIDB4MDdhMQotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9EWU5BTUlDX0lQRUFLX1NFVFRJTkcyICAgICAgICAweDA3YTIKLSNkZWZpbmUgV0NEOTM0WF9TSURPX05FV19JTlRfRFlOQU1JQ19JUEVBS19TRVRUSU5HMyAgICAgICAgMHgwN2EzCi0jZGVmaW5lIFdDRDkzNFhfU0lET19ORVdfSU5UX0hJR0hfQUNDVV9NT0RFX1NFTDEgICAgICAgICAgIDB4MDdhNAotI2RlZmluZSBXQ0Q5MzRYX1NJRE9fTkVXX0lOVF9ISUdIX0FDQ1VfTU9ERV9TRUwyICAgICAgICAgICAweDA3YTUKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19JTlRfU0xOUV9IUEYgICAgICAgICAgICAgICAgICAgICAgMHgwN2FmCi0jZGVmaW5lIFdDRDkzNFhfTUJIQ19ORVdfSU5UX1NMTlFfUkVGICAgICAgICAgICAgICAgICAgICAgIDB4MDdiMAotI2RlZmluZSBXQ0Q5MzRYX01CSENfTkVXX0lOVF9TTE5RX0NPTVAgICAgICAgICAgICAgICAgICAgICAweDA3YjEKLSNkZWZpbmUgV0NEOTM0WF9NQkhDX05FV19JTlRfU1BBUkVfMiAgICAgICAgICAgICAgICAgICAgICAgMHgwN2IyCi0jZGVmaW5lIFdDRDkzNFhfUEFHRTEwX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwMAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9NT0RFXzFfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTAyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8yX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0ZGX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhMDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9GQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTA1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfTFBGX0ZGX0FfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGEwNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0xQRl9GRl9CX0NUTCAgICAgICAgICAgICAgICAgICAgICAweDBhMDcKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9MUEZfRkJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTA4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfU01MUEZfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEwOQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0RDRkxUX1NISUZUX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMGEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTBiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEwYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCAgICAgICAgICAgICAgICAgICAweDBhMGQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTBlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfRkZfQl9HQUlOX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGEwZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX0ZCX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBhMTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9SQ19DT01NT05fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTExCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfRklGT19DT01NT05fQ1RMICAgICAgICAgICAgICAgICAgIDB4MGExMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX1JDMF9TVEFUVVNfRk1JTl9DTlRSICAgICAgICAgICAgICAweDBhMTQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9SQzFfU1RBVFVTX0ZNSU5fQ05UUiAgICAgICAgICAgICAgMHgwYTE1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzBfUkMwX1NUQVRVU19GTUFYX0NOVFIgICAgICAgICAgICAgIDB4MGExNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMwX1JDMV9TVEFUVVNfRk1BWF9DTlRSICAgICAgICAgICAgICAweDBhMTcKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMF9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTE4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGExOQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX01PREVfMV9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhMWEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTFiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfRkZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGExYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0ZCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAweDBhMWQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9MUEZfRkZfQV9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYTFlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfTFBGX0ZGX0JfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MGExZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0xQRl9GQl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhMjAKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9TTUxQRl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTIxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfRENGTFRfU0hJRlRfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0lJUl9BREFQVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMjMKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTI0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMICAgICAgICAgICAgICAgICAgIDB4MGEyNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX0ZGX0FfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMjYKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9GRl9CX0dBSU5fQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYTI3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfRkJfR0FJTl9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGEyOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX1JDX0NPTU1PTl9DVEwgICAgICAgICAgICAgICAgICAgICAweDBhMjkKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9GSUZPX0NPTU1PTl9DVEwgICAgICAgICAgICAgICAgICAgMHgwYTJiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfUkMwX1NUQVRVU19GTUlOX0NOVFIgICAgICAgICAgICAgIDB4MGEyYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX1JDMV9TVEFUVVNfRk1JTl9DTlRSICAgICAgICAgICAgICAweDBhMmQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQU5DMV9SQzBfU1RBVFVTX0ZNQVhfQ05UUiAgICAgICAgICAgICAgMHgwYTJlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0FOQzFfUkMxX1NUQVRVU19GTUFYX0NOVFIgICAgICAgICAgICAgIDB4MGEyZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19BTkMxX1NUQVRVU19GSUZPICAgICAgICAgICAgICAgICAgICAgICAweDBhMzAKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTMxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhMzMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTM0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGEzNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhMzYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTM3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhMzkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTNhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhM2MKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTNkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMF9UWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAgIDB4MGEzZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhNDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTQyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhNDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTQ1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGE0NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBhNDcKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTQ4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBhNGEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTRiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGE0YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBhNGQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTUxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhNTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTU0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGE1NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhNTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTU3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhNTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYTVhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGE1YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhNWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTVkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhNjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTYzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhNjUKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYTY2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhNjgKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTY5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhNmIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTZjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYM19UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGE2ZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhNzEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTcyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhNzQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYTc1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGE3NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBhNzcKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTc4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBhN2EKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTdiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGE3YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBhN2QKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTgxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhODMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYTg0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGE4NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhODYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYTg3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhODkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYThhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGE4YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhOGMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYThkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBhOTIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTkzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF8xOTJfQ1RMICAgICAgICAgICAgICAgICAgICAweDBhOTUKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYTk2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBhOTgKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYTk5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBhOWIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYTljCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGE5ZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBhYTEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWEyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBhYTQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfMTkyX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYWE1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGFhNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBhYTcKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYWE4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhOQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBhYWEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfU0VDNCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWFiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGFhYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBhYWQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWIxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBhYjMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYWI0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGFiNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF8xOTJfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBhYjYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYWI3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBhYjkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGFiYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBhYmMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYWJkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgICAgIDB4MGFjMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAweDBhYzMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgICAgMHgwYWM2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgIDB4MGFjNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAweDBhY2EKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgICAgMHgwYWNiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAgIDB4MGFjZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgICAweDBhY2YKLSNkZWZpbmUgV0NEOTM0WF9QQUdFMTFfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjAwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEwyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjAzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDQgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDUKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjA2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIxX0NUTDcgICAgICAgICAgICAgICAgICAgICAgICAweDBiMDgKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjA5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAweDBiMGIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEwzICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjBjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIwZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDUgICAgICAgICAgICAgICAgICAgICAgICAweDBiMGUKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSMl9DVEw2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjBmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxMAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjEyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDMgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjE1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjNfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIzX0NUTDYgICAgICAgICAgICAgICAgICAgICAgICAweDBiMTcKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSM19DVEw3ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjE4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxOQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDEgICAgICAgICAgICAgICAgICAgICAgICAweDBiMWEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEwyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjFiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDQgICAgICAgICAgICAgICAgICAgICAgICAweDBiMWQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSNF9DVEw1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjFlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjRfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIxZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI0X0NUTDcgICAgICAgICAgICAgICAgICAgICAgICAweDBiMjAKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjMxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzMKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEwzICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjM0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDUgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzYKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSN19DVEw2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjM3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBiMzkKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjNhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMgICAgICAgICAgICAgICAgICAgICAgICAweDBiM2MKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjNkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MGIzZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDYgICAgICAgICAgICAgICAgICAgICAgICAweDBiM2YKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ09NUEFOREVSOF9DVEw3ICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiNDIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiNDUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYjQ2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGI0NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiNDgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjQ5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiNGIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjRjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzUgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUM2ICAgICAgICAgICAgICAgICAgICAgICAweDBiNGYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfU0VDNyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjUwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwICAgICAgICAgICAgICAgICAgIDB4MGI1MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9NSVhfU0VDMSAgICAgICAgICAgICAgICAgICAweDBiNTIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfRFNNREVNX0NUTCAgICAgICAgICAgICAgICAgMHgwYjUzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwICAgICAgICAgICAgICAgICAgICAgICAweDBiNTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjU3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAweDBiNTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgMHgwYjVhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcgICAgICAgICAgICAgICAgICAgIDB4MGI1YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBiNWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjVkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI1ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMyICAgICAgICAgICAgICAgICAgICAgICAweDBiNWYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMyAgICAgICAgICAgICAgICAgICAgICAgMHgwYjYwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgICAweDBiNjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjYzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgICAweDBiNjUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgICAgMHgwYjY2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0RTTURFTV9DVEwgICAgICAgICAgICAgICAgIDB4MGI2NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAweDBiNjkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwYjZhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGI2YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgICAweDBiNmMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjZkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAgIDB4MGI2ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgICAweDBiNmYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwYjcwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgICAweDBiNzIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjczCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDBiNzUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjc2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiNzgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYjc5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGI3YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiN2IKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjdkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI3ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBiN2YKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjgwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAweDBiODIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYjgzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGI4NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBiODUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjg2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBiODgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjhhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGI4YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiOGMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYjhkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGI4ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiOGYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYjkxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBiOTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYjk0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAweDBiOTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYjk3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGI5OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBiOTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjlhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBiOWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYjllCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGI5ZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiYTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYmExCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGJhMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiYTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmNkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJjZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBiY2YKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAweDBiZDIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYmQzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGJkNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBiZDUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmQ2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBiZDgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmRhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGJkYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiZGMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYmRkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGJkZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiZGYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYmUxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgICAweDBiZTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgMHgwYmU0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgICAweDBiZTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwYmU3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MGJlOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgICAweDBiZTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmVhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgICAweDBiZWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgICAgMHgwYmVlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAgIDB4MGJlZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgICAweDBiZjAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgICAgMHgwYmYxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAgIDB4MGJmMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9EU01ERU1fQ1RMICAgICAgICAgICAgICAgICAweDBiZjMKLSNkZWZpbmUgV0NEOTM0WF9QQUdFMTJfUEFHRV9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgMHgwYzAwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0RMWV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9ERUNBWV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzAzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSFBIX1ZfUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0VBUl9WX1BBICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDUKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9IUEhfVl9IRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfRUFSX1ZfSEQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0sxX01TQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMDgKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9LMV9MU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzA5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSzJfTVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0syX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9JRExFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfSURMRV9IUEggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMwZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX0lETEVfRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMGUKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xTSF9URVNUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzBmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMU0hfVEVTVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMxMAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTFNIX09WUl9WUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjMTEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgMHgwYzE5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGMxYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ0ZHMSAgICAgICAgICAgICAgICAgICAgICAweDBjMWIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzIgICAgICAgICAgICAgICAgICAgICAgMHgwYzFjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgIDB4MGMyMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBjMjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzEgICAgICAgICAgICAgICAgICAgICAgMHgwYzIzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcyICAgICAgICAgICAgICAgICAgICAgIDB4MGMyNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAweDBjM2QKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzNlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9BRENfQ0FMMSAgICAgICAgICAgICAgICAgICAgIDB4MGMzZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQURDX0NBTDIgICAgICAgICAgICAgICAgICAgICAweDBjNDAKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0FEQ19DQUwzICAgICAgICAgICAgICAgICAgICAgMHgwYzQxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9QS19FU1QxICAgICAgICAgICAgICAgICAgICAgIDB4MGM0MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUEtfRVNUMiAgICAgICAgICAgICAgICAgICAgICAweDBjNDMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1BLX0VTVDMgICAgICAgICAgICAgICAgICAgICAgMHgwYzQ0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9SRl9QUk9DMSAgICAgICAgICAgICAgICAgICAgIDB4MGM0NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfUkZfUFJPQzIgICAgICAgICAgICAgICAgICAgICAweDBjNDYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzQ3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9UQUMyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM0OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfVEFDMyAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNDkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX1RBQzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYzRhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDEgICAgICAgICAgICAgICAgICAgIDB4MGM0YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfR0FJTl9VUEQyICAgICAgICAgICAgICAgICAgICAweDBjNGMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEMyAgICAgICAgICAgICAgICAgICAgMHgwYzRkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX1VQRDQgICAgICAgICAgICAgICAgICAgIDB4MGM0ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfREVCVUcxICAgICAgICAgICAgICAgICAgICAgICAweDBjNGYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVkJBVF9WQkFUX0dBSU5fVVBEX01PTiAgICAgICAgICAgICAgICAgMHgwYzUwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1ZCQVRfVkJBVF9HQUlOX01PTl9WQUwgICAgICAgICAgICAgICAgIDB4MGM1MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19WQkFUX1ZCQVRfQkFOICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNTIKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYzU1Ci0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM1NgotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNTcKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfRklGT19DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYzU4Ci0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAgIDB4MGM1OQotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgICAweDBjNWEKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgICAgMHgwYzViCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAgIDB4MGM1YwotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMF9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAweDBjNWQKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYzYxCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM2MgotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNjMKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfRklGT19DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYzY0Ci0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAgIDB4MGM2NQotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgICAweDBjNjYKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgICAgMHgwYzY3Ci0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAgIDB4MGM2OAotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMV9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAweDBjNjkKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYzZkCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM2ZQotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjNmYKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfRklGT19DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYzcwCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAgIDB4MGM3MQotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgICAweDBjNzIKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzJfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgICAgMHgwYzczCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMyX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAgIDB4MGM3NAotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDMl9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAweDBjNzUKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgICAgMHgwYzc5Ci0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGM3YQotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19DVEwxICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjN2IKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfRklGT19DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwYzdjCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAgIDB4MGM3ZAotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgICAweDBjN2UKLSNkZWZpbmUgV0NEOTM0WF9NSVhJTkdfQVNSQzNfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgICAgMHgwYzdmCi0jZGVmaW5lIFdDRDkzNFhfTUlYSU5HX0FTUkMzX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAgIDB4MGM4MAotI2RlZmluZSBXQ0Q5MzRYX01JWElOR19BU1JDM19TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgICAweDBjODEKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzAgICAgICAgICAgICAgICAgICAgMHgwYzg1Ci0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfREFUQV8xICAgICAgICAgICAgICAgICAgIDB4MGM4NgotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMiAgICAgICAgICAgICAgICAgICAweDBjODcKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzMgICAgICAgICAgICAgICAgICAgMHgwYzg4Ci0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wICAgICAgICAgICAgICAgICAgIDB4MGM4OQotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMSAgICAgICAgICAgICAgICAgICAweDBjOGEKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzIgICAgICAgICAgICAgICAgICAgMHgwYzhiCi0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8zICAgICAgICAgICAgICAgICAgIDB4MGM4YwotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMCAgICAgICAgICAgICAgICAgICAweDBjOGQKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzEgICAgICAgICAgICAgICAgICAgMHgwYzhlCi0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfQUREUl8yICAgICAgICAgICAgICAgICAgIDB4MGM4ZgotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0FERFJfMyAgICAgICAgICAgICAgICAgICAweDBjOTAKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzAgICAgICAgICAgICAgICAgICAgMHgwYzkxCi0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfREFUQV8xICAgICAgICAgICAgICAgICAgIDB4MGM5MgotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMiAgICAgICAgICAgICAgICAgICAweDBjOTMKLSNkZWZpbmUgV0NEOTM0WF9TV1JfQUhCX0JSSURHRV9SRF9EQVRBXzMgICAgICAgICAgICAgICAgICAgMHgwYzk0Ci0jZGVmaW5lIFdDRDkzNFhfU1dSX0FIQl9CUklER0VfQUNDRVNTX0NGRyAgICAgICAgICAgICAgICAgIDB4MGM5NQotI2RlZmluZSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVMgICAgICAgICAgICAgICAweDBjOTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMF9TVF9TUkNfUEFUSF9DVEwgICAgICAgICAgMHgwY2I1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ0ZHMSAgICAgICAgIDB4MGNiNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCAgICAgICAgICAweDBjYjkKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfU1JDMV9TVF9TUkNfUEFUSF9DRkcxICAgICAgICAgMHgwY2JhCi0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgIDB4MGNiZAotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBjYmUKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2JmCi0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfRklGT19DVEwgICAgICAgICAgICAgICAgICAgIDB4MGNjMAotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAweDBjYzEKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgMHgwY2MyCi0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzBfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgIDB4MGNjMwotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAweDBjYzQKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMF9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgMHgwY2M1Ci0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAgIDB4MGNjOQotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX0NUTDAgICAgICAgICAgICAgICAgICAgICAgICAweDBjY2EKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9DVEwxICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2NiCi0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfRklGT19DVEwgICAgICAgICAgICAgICAgICAgIDB4MGNjYwotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUlOX0NOVFJfTFNCICAgICAgICAweDBjY2QKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX01TQiAgICAgICAgMHgwY2NlCi0jZGVmaW5lIFdDRDkzNFhfU0lERVRPTkVfQVNSQzFfU1RBVFVTX0ZNQVhfQ05UUl9MU0IgICAgICAgIDB4MGNjZgotI2RlZmluZSBXQ0Q5MzRYX1NJREVUT05FX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTVNCICAgICAgICAweDBjZDAKLSNkZWZpbmUgV0NEOTM0WF9TSURFVE9ORV9BU1JDMV9TVEFUVVNfRklGTyAgICAgICAgICAgICAgICAgMHgwY2QxCi0jZGVmaW5lIFdDRDkzNFhfRUNfUkVGX0hRMF9FQ19SRUZfSFFfUEFUSF9DVEwgICAgICAgICAgICAgIDB4MGNkNQotI2RlZmluZSBXQ0Q5MzRYX0VDX1JFRl9IUTBfRUNfUkVGX0hRX0NGRzAgICAgICAgICAgICAgICAgICAweDBjZDYKLSNkZWZpbmUgV0NEOTM0WF9FQ19SRUZfSFExX0VDX1JFRl9IUV9QQVRIX0NUTCAgICAgICAgICAgICAgMHgwY2RkCi0jZGVmaW5lIFdDRDkzNFhfRUNfUkVGX0hRMV9FQ19SRUZfSFFfQ0ZHMCAgICAgICAgICAgICAgICAgIDB4MGNkZQotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBjZTUKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2U2Ci0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNlNwotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjZTgKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAgICAgMHgwY2U5Ci0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgICAgIDB4MGNlYQotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMwX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgICAgICAweDBjZWIKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMF9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAgICAgMHgwY2VjCi0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzBfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4MGNlZAotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBjZjEKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9DVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwY2YyCi0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfQ1RMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGNmMwotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX0ZJRk9fQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDBjZjQKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1JTl9DTlRSX0xTQiAgICAgICAgICAgICAgMHgwY2Y1Ci0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZNSU5fQ05UUl9NU0IgICAgICAgICAgICAgIDB4MGNmNgotI2RlZmluZSBXQ0Q5MzRYX0VDX0FTUkMxX1NUQVRVU19GTUFYX0NOVFJfTFNCICAgICAgICAgICAgICAweDBjZjcKLSNkZWZpbmUgV0NEOTM0WF9FQ19BU1JDMV9TVEFUVVNfRk1BWF9DTlRSX01TQiAgICAgICAgICAgICAgMHgwY2Y4Ci0jZGVmaW5lIFdDRDkzNFhfRUNfQVNSQzFfU1RBVFVTX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4MGNmOQotI2RlZmluZSBXQ0Q5MzRYX1BBR0UxM19QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAweDBkMDAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAgICAgICAgICAgICAgICAgMHgwZDAxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxICAgICAgICAgICAgICAgIDB4MGQwMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCAgICAgICAgICAgICAgICAweDBkMDMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEgICAgICAgICAgICAgICAgMHgwZDA0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwICAgICAgICAgICAgICAgIDB4MGQwNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSAgICAgICAgICAgICAgICAweDBkMDYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAgICAgICAgICAgICAgICAgMHgwZDA3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxICAgICAgICAgICAgICAgIDB4MGQwOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCAgICAgICAgICAgICAgICAweDBkMDkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEgICAgICAgICAgICAgICAgMHgwZDBhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwICAgICAgICAgICAgICAgIDB4MGQwZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMSAgICAgICAgICAgICAgICAweDBkMTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAgICAgICAgICAgICAgICAgMHgwZDExCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxICAgICAgICAgICAgICAgIDB4MGQxMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwICAgICAgICAgICAgICAgICAweDBkMTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSAgICAgICAgICAgICAgICAgMHgwZDE0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfTUlYX0NGRzIgICAgICAgICAgICAgICAgIDB4MGQxNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczICAgICAgICAgICAgICAgICAweDBkMTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCAgICAgICAgICAgICAgICAgMHgwZDE3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAgICAgICAgICAgIDB4MGQxOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxICAgICAgICAgICAweDBkMTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCAgICAgICAgICAgICAgICAgICAgMHgwZDFhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCAgICAgICAgICAgIDB4MGQxYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0VDX1JFRl9IUV9DRkcwICAgICAgICAgICAgICAweDBkMWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwICAgICAgICAgICAgICAgMHgwZDFkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSAgICAgICAgICAgICAgIDB4MGQxZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAgICAgICAgICAgICAgICAweDBkMWYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxICAgICAgICAgICAgICAgMHgwZDIwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQyMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEgICAgICAgICAgICAgICAweDBkMjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwICAgICAgICAgICAgICAgMHgwZDIzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSAgICAgICAgICAgICAgIDB4MGQyNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAgICAgICAgICAgICAgICAweDBkMjYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNV9DRkcwICAgICAgICAgICAgICAgMHgwZDI3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCAgICAgICAgICAgICAgIDB4MGQyOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAgICAgICAgICAgICAgICAweDBkMjkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYOF9DRkcwICAgICAgICAgICAgICAgMHgwZDJhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAgICAgICAgICAgICAgIDB4MGQyYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwICAgICAgICAgICAgICAweDBkMmMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCAgICAgICAgICAgICAgMHgwZDJkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAgICAgICAgICAgICAgIDB4MGQyZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwICAgICAweDBkMzEKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMSAgICAgMHgwZDMyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIgICAgIDB4MGQzMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczICAgICAweDBkMzQKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMCAgICAgMHgwZDM1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEgICAgIDB4MGQzNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyICAgICAweDBkMzcKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMyAgICAgMHgwZDM4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCAgICAgICAgICAgICAgICAgIDB4MGQzYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEgICAgICAgICAgICAgICAgICAweDBkM2IKLSNkZWZpbmUgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyICAgICAgICAgICAgICAgICAgMHgwZDNjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMyAgICAgICAgICAgICAgICAgIDB4MGQzZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MICAgICAgICAgICAgICAweDBkNDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MICAgICAgICAgICAgMHgwZDQyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MGQ0MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wgICAgICAgICAgICAgICAweDBkNDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0FTUkNfU0hBUkVfQ09OVFJPTCAgICAgICAgMHgwZDQ1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9HRk1fQ09OVFJPTCAgICAgICAgICAgICAgIDB4MGQ0NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX0NUTCAgICAgICAgICAgICAgICAgICAweDBkNDkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9QT0xMX1BFUklPRDAgICAgICAgICAgMHgwZDRhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfUE9MTF9QRVJJT0QxICAgICAgICAgIDB4MGQ0YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1NJR19QQVRURVJOX0xTQiAgICAgICAweDBkNGMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9TSUdfUEFUVEVSTl9NU0IgICAgICAgMHgwZDRkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfU1RBVFVTICAgICAgICAgICAgICAgIDB4MGQ0ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQ1RSTCAgICAgICAgICAgICAweDBkNGYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTFNCICAgICAgICAgMHgwZDUwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfVEVTVF9CVUZGX01TQiAgICAgICAgIDB4MGQ1MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19QUk9YX0RFVEVDVF9QUk9YX1RFU1RfQlVGRl9MU0JfUkQgICAgICAweDBkNTIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUFJPWF9ERVRFQ1RfUFJPWF9URVNUX0JVRkZfTVNCX1JEICAgICAgMHgwZDUzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1BST1hfREVURUNUX1BST1hfQ1RMX1JFUEVBVF9QQVQgICAgICAgIDB4MGQ1NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9QQVRIX0NUTCAgICAgICAgICAgICAweDBkNTUKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMV9DVEwgICAgICAgICAgMHgwZDU2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMICAgICAgICAgIDB4MGQ1NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IzX0NUTCAgICAgICAgICAweDBkNTgKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNF9DVEwgICAgICAgICAgMHgwZDU5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjVfQ1RMICAgICAgICAgIDB4MGQ1YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I2X0NUTCAgICAgICAgICAweDBkNWIKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CN19DVEwgICAgICAgICAgMHgwZDVjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjhfQ1RMICAgICAgICAgIDB4MGQ1ZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwgICAgICAgICAgICAgICAgICAweDBkNWUKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9USU1FUl9DVEwgICAgICAgMHgwZDVmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICAgICAgICAgIDB4MGQ2MAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCAgICAgICAgICAweDBkNjEKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwgICAgICAgICAgICAgMHgwZDY1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMICAgICAgICAgIDB4MGQ2NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IyX0NUTCAgICAgICAgICAweDBkNjcKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwgICAgICAgICAgMHgwZDY4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMICAgICAgICAgIDB4MGQ2OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I1X0NUTCAgICAgICAgICAweDBkNmEKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CNl9DVEwgICAgICAgICAgMHgwZDZiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjdfQ1RMICAgICAgICAgIDB4MGQ2YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I4X0NUTCAgICAgICAgICAweDBkNmQKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ1RMICAgICAgICAgICAgICAgICAgMHgwZDZlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fVElNRVJfQ1RMICAgICAgIDB4MGQ2ZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9DT0VGX0IxX0NUTCAgICAgICAgICAweDBkNzAKLSNkZWZpbmUgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfQ09FRl9CMl9DVEwgICAgICAgICAgMHgwZDcxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGQ4MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfVE9QX0NGRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkODIKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX1RPUF9DRkc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZDg4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfV1JfTFNCICAgICAgICAgICAgICAgICAgIDB4MGQ4OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1dSX01TQiAgICAgICAgICAgICAgICAgICAweDBkOGEKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9MVVQgICAgICAgICAgICAgICAgICAgICAgMHgwZDhiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhMX0NPTVBfUkRfTFNCICAgICAgICAgICAgICAgICAgIDB4MGQ4YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBITF9DT01QX1JEX01TQiAgICAgICAgICAgICAgICAgICAweDBkOGQKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9XUl9MU0IgICAgICAgICAgICAgICAgICAgMHgwZDhlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgICAgIDB4MGQ4ZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX0xVVCAgICAgICAgICAgICAgICAgICAgICAweDBkOTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0hQSFJfQ09NUF9SRF9MU0IgICAgICAgICAgICAgICAgICAgMHgwZDkxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9IUEhSX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgICAgIDB4MGQ5MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9XUl9MU0IgICAgICAgICAgICAgICAgICAweDBkOTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfV1JfTVNCICAgICAgICAgICAgICAgICAgMHgwZDk0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGTF9DT01QX0xVVCAgICAgICAgICAgICAgICAgICAgIDB4MGQ5NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRkxfQ09NUF9SRF9MU0IgICAgICAgICAgICAgICAgICAweDBkOTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZMX0NPTVBfUkRfTVNCICAgICAgICAgICAgICAgICAgMHgwZDk3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1dSX0xTQiAgICAgICAgICAgICAgICAgIDB4MGQ5OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9XUl9NU0IgICAgICAgICAgICAgICAgICAweDBkOTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfVE9QX0RJRkZSX0NPTVBfTFVUICAgICAgICAgICAgICAgICAgICAgMHgwZDlhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1RPUF9ESUZGUl9DT01QX1JEX0xTQiAgICAgICAgICAgICAgICAgIDB4MGQ5YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19UT1BfRElGRlJfQ09NUF9SRF9NU0IgICAgICAgICAgICAgICAgICAweDBkOWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGIxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRiMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYjMKLSNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMF9DRkcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGI0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRiNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYjYKLSNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMF9DRkc1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGI3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYzIKLSNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMV9DRkcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGMzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBkYzUKLSNkZWZpbmUgV0NEOTM0WF9DRENfRFNEMV9DRkc0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZGM2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGRjNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAgICAweDBkZDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgMHgwZGQyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX0NGRzEgICAgICAgICAgICAgICAgICAgICAgIDB4MGRkMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkcyICAgICAgICAgICAgICAgICAgICAgICAweDBkZDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMyAgICAgICAgICAgICAgICAgICAgICAgMHgwZGQ1Ci0jZGVmaW5lIFdDRDkzNFhfUEFHRTE0X1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MGUwMAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAweDBlMDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwZTAyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9QVUxTRV9TVVBSX0NUTCAgICAgICAgICAgIDB4MGUwMwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfVElNRVIgICAgICAgICAgICAgICAgICAgICAweDBlMDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0JXX1NXICAgICAgICAgICAgICAgICAgICAgMHgwZTA1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9USFJFU0ggICAgICAgICAgICAgICAgICAgIDB4MGUwNgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDBlMDcKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfQ1RSTCAgICAgICAgICAgICAgICAgMHgwZTA5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX1RJTUVSMiAgICAgICAgICAgICAgIDB4MGUwYwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlcxICAgICAgICAgICAweDBlMGQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXMiAgICAgICAgICAgMHgwZTBlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX09GRlNFVF9CVzMgICAgICAgICAgIDB4MGUwZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19PRkZTRVRfQlc0ICAgICAgICAgICAweDBlMTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfT0ZGU0VUX0JXNSAgICAgICAgICAgMHgwZTExCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXMSAgICAgICAgICAgIDB4MGUxMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzIgICAgICAgICAgICAweDBlMTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVRfQlczICAgICAgICAgICAgMHgwZTE0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlUX0JXNCAgICAgICAgICAgIDB4MGUxNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVF9CVzUgICAgICAgICAgICAweDBlMTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzEgICAgICAgICAgMHgwZTE3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlcyICAgICAgICAgIDB4MGUxOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19MSU1JVEQxX0JXMyAgICAgICAgICAweDBlMTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfTElNSVREMV9CVzQgICAgICAgICAgMHgwZTFhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0xJTUlURDFfQlc1ICAgICAgICAgIDB4MGUxYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXMSAgICAgICAgICAgICAweDBlMWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzIgICAgICAgICAgICAgMHgwZTFkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0hZU1RfQlczICAgICAgICAgICAgIDB4MGUxZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfRElBR19IWVNUX0JXNCAgICAgICAgICAgICAweDBlMWYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX0RJQUdfSFlTVF9CVzUgICAgICAgICAgICAgMHgwZTIwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9STUFYX0RJQUcgICAgICAgICAgICAgICAgIDB4MGUyMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUk1JTl9ESUFHICAgICAgICAgICAgICAgICAweDBlMjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1BIX0RFVCAgICAgICAgICAgICAgICAgICAgMHgwZTIzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9ESUFHX0NMUiAgICAgICAgICAgICAgICAgIDB4MGUyNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfTUJfU1dfU1RBVEUgICAgICAgICAgICAgICAweDBlMjUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX01BU1RfRElBR19TVEFURSAgICAgICAgICAgMHgwZTI2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF83XzAgICAgICAgICAgICAgIDB4MGUyNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMTVfOCAgICAgICAgICAgICAweDBlMjgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzIzXzE2ICAgICAgICAgICAgMHgwZTI5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMF9SRV9SQVRFX09VVF8zMV8yNCAgICAgICAgICAgIDB4MGUyYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDBfUkVfUkFURV9PVVRfMzlfMzIgICAgICAgICAgICAweDBlMmIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QwX1JFX1JBVEVfT1VUXzQwXzQzICAgICAgICAgICAgMHgwZTJjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9DTEtfUlNUX0NUTCAgICAgICAgICAgICAgIDB4MGUzMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDBlMzIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1BVTFNFX1NVUFJfQ1RMICAgICAgICAgICAgMHgwZTMzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9USU1FUiAgICAgICAgICAgICAgICAgICAgIDB4MGUzNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfQldfU1cgICAgICAgICAgICAgICAgICAgICAweDBlMzUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgMHgwZTM2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4MGUzNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19DVFJMICAgICAgICAgICAgICAgICAweDBlMzkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfVElNRVIyICAgICAgICAgICAgICAgMHgwZTNjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzEgICAgICAgICAgIDB4MGUzZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlcyICAgICAgICAgICAweDBlM2UKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfT0ZGU0VUX0JXMyAgICAgICAgICAgMHgwZTNmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX09GRlNFVF9CVzQgICAgICAgICAgIDB4MGU0MAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19PRkZTRVRfQlc1ICAgICAgICAgICAweDBlNDEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlcxICAgICAgICAgICAgMHgwZTQyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXMiAgICAgICAgICAgIDB4MGU0MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVF9CVzMgICAgICAgICAgICAweDBlNDQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVRfQlc0ICAgICAgICAgICAgMHgwZTQ1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlUX0JXNSAgICAgICAgICAgIDB4MGU0NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXMSAgICAgICAgICAweDBlNDcKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzIgICAgICAgICAgMHgwZTQ4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0xJTUlURDFfQlczICAgICAgICAgIDB4MGU0OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19MSU1JVEQxX0JXNCAgICAgICAgICAweDBlNGEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfTElNSVREMV9CVzUgICAgICAgICAgMHgwZTRiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlcxICAgICAgICAgICAgIDB4MGU0YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXMiAgICAgICAgICAgICAweDBlNGQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfSFlTVF9CVzMgICAgICAgICAgICAgMHgwZTRlCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9ESUFHX0hZU1RfQlc0ICAgICAgICAgICAgIDB4MGU0ZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfRElBR19IWVNUX0JXNSAgICAgICAgICAgICAweDBlNTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JNQVhfRElBRyAgICAgICAgICAgICAgICAgMHgwZTUxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9STUlOX0RJQUcgICAgICAgICAgICAgICAgIDB4MGU1MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUEhfREVUICAgICAgICAgICAgICAgICAgICAweDBlNTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX0RJQUdfQ0xSICAgICAgICAgICAgICAgICAgMHgwZTU0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9NQl9TV19TVEFURSAgICAgICAgICAgICAgIDB4MGU1NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfTUFTVF9ESUFHX1NUQVRFICAgICAgICAgICAweDBlNTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzdfMCAgICAgICAgICAgICAgMHgwZTU3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8xNV84ICAgICAgICAgICAgIDB4MGU1OAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfMjNfMTYgICAgICAgICAgICAweDBlNTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QxX1JFX1JBVEVfT1VUXzMxXzI0ICAgICAgICAgICAgMHgwZTVhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMV9SRV9SQVRFX09VVF8zOV8zMiAgICAgICAgICAgIDB4MGU1YgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDFfUkVfUkFURV9PVVRfNDBfNDMgICAgICAgICAgICAweDBlNWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0NMS19SU1RfQ1RMICAgICAgICAgICAgICAgMHgwZTYxCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MGU2MgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUFVMU0VfU1VQUl9DVEwgICAgICAgICAgICAweDBlNjMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgMHgwZTY0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9CV19TVyAgICAgICAgICAgICAgICAgICAgIDB4MGU2NQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfVEhSRVNIICAgICAgICAgICAgICAgICAgICAweDBlNjYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHgwZTY3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0NUUkwgICAgICAgICAgICAgICAgIDB4MGU2OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19USU1FUjIgICAgICAgICAgICAgICAweDBlNmMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXMSAgICAgICAgICAgMHgwZTZkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzIgICAgICAgICAgIDB4MGU2ZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19PRkZTRVRfQlczICAgICAgICAgICAweDBlNmYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfT0ZGU0VUX0JXNCAgICAgICAgICAgMHgwZTcwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX09GRlNFVF9CVzUgICAgICAgICAgIDB4MGU3MQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzEgICAgICAgICAgICAweDBlNzIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlcyICAgICAgICAgICAgMHgwZTczCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlUX0JXMyAgICAgICAgICAgIDB4MGU3NAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVF9CVzQgICAgICAgICAgICAweDBlNzUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVRfQlc1ICAgICAgICAgICAgMHgwZTc2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlcxICAgICAgICAgIDB4MGU3NwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXMiAgICAgICAgICAweDBlNzgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfTElNSVREMV9CVzMgICAgICAgICAgMHgwZTc5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0xJTUlURDFfQlc0ICAgICAgICAgIDB4MGU3YQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19MSU1JVEQxX0JXNSAgICAgICAgICAweDBlN2IKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzEgICAgICAgICAgICAgMHgwZTdjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlcyICAgICAgICAgICAgIDB4MGU3ZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19IWVNUX0JXMyAgICAgICAgICAgICAweDBlN2UKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX0RJQUdfSFlTVF9CVzQgICAgICAgICAgICAgMHgwZTdmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9ESUFHX0hZU1RfQlc1ICAgICAgICAgICAgIDB4MGU4MAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUk1BWF9ESUFHICAgICAgICAgICAgICAgICAweDBlODEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JNSU5fRElBRyAgICAgICAgICAgICAgICAgMHgwZTgyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9QSF9ERVQgICAgICAgICAgICAgICAgICAgIDB4MGU4MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfRElBR19DTFIgICAgICAgICAgICAgICAgICAweDBlODQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX01CX1NXX1NUQVRFICAgICAgICAgICAgICAgMHgwZTg1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9NQVNUX0RJQUdfU1RBVEUgICAgICAgICAgIDB4MGU4NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfN18wICAgICAgICAgICAgICAweDBlODcKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzE1XzggICAgICAgICAgICAgMHgwZTg4Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF8yM18xNiAgICAgICAgICAgIDB4MGU4OQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDJfUkVfUkFURV9PVVRfMzFfMjQgICAgICAgICAgICAweDBlOGEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QyX1JFX1JBVEVfT1VUXzM5XzMyICAgICAgICAgICAgMHgwZThiCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUMl9SRV9SQVRFX09VVF80MF80MyAgICAgICAgICAgIDB4MGU4YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfQ0xLX1JTVF9DVEwgICAgICAgICAgICAgICAweDBlOTEKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0NUTCAgICAgICAgICAgICAgICAgICAgICAgMHgwZTkyCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9QVUxTRV9TVVBSX0NUTCAgICAgICAgICAgIDB4MGU5MwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfVElNRVIgICAgICAgICAgICAgICAgICAgICAweDBlOTQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0JXX1NXICAgICAgICAgICAgICAgICAgICAgMHgwZTk1Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9USFJFU0ggICAgICAgICAgICAgICAgICAgIDB4MGU5NgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDBlOTcKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfQ1RSTCAgICAgICAgICAgICAgICAgMHgwZTk5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX1RJTUVSMiAgICAgICAgICAgICAgIDB4MGU5YwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlcxICAgICAgICAgICAweDBlOWQKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXMiAgICAgICAgICAgMHgwZTllCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX09GRlNFVF9CVzMgICAgICAgICAgIDB4MGU5ZgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19PRkZTRVRfQlc0ICAgICAgICAgICAweDBlYTAKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfT0ZGU0VUX0JXNSAgICAgICAgICAgMHgwZWExCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXMSAgICAgICAgICAgIDB4MGVhMgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzIgICAgICAgICAgICAweDBlYTMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVRfQlczICAgICAgICAgICAgMHgwZWE0Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlUX0JXNCAgICAgICAgICAgIDB4MGVhNQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVF9CVzUgICAgICAgICAgICAweDBlYTYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzEgICAgICAgICAgMHgwZWE3Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlcyICAgICAgICAgIDB4MGVhOAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19MSU1JVEQxX0JXMyAgICAgICAgICAweDBlYTkKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfTElNSVREMV9CVzQgICAgICAgICAgMHgwZWFhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0xJTUlURDFfQlc1ICAgICAgICAgIDB4MGVhYgotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXMSAgICAgICAgICAgICAweDBlYWMKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzIgICAgICAgICAgICAgMHgwZWFkCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0hZU1RfQlczICAgICAgICAgICAgIDB4MGVhZQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfRElBR19IWVNUX0JXNCAgICAgICAgICAgICAweDBlYWYKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX0RJQUdfSFlTVF9CVzUgICAgICAgICAgICAgMHgwZWIwCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9STUFYX0RJQUcgICAgICAgICAgICAgICAgIDB4MGViMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUk1JTl9ESUFHICAgICAgICAgICAgICAgICAweDBlYjIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1BIX0RFVCAgICAgICAgICAgICAgICAgICAgMHgwZWIzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9ESUFHX0NMUiAgICAgICAgICAgICAgICAgIDB4MGViNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfTUJfU1dfU1RBVEUgICAgICAgICAgICAgICAweDBlYjUKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX01BU1RfRElBR19TVEFURSAgICAgICAgICAgMHgwZWI2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF83XzAgICAgICAgICAgICAgIDB4MGViNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMTVfOCAgICAgICAgICAgICAweDBlYjgKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzIzXzE2ICAgICAgICAgICAgMHgwZWI5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX1JBVEVfRVNUM19SRV9SQVRFX09VVF8zMV8yNCAgICAgICAgICAgIDB4MGViYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19SQVRFX0VTVDNfUkVfUkFURV9PVVRfMzlfMzIgICAgICAgICAgICAweDBlYmIKLSNkZWZpbmUgV0NEOTM0WF9DRENfUkFURV9FU1QzX1JFX1JBVEVfT1VUXzQwXzQzICAgICAgICAgICAgMHgwZWJjCi0jZGVmaW5lIFdDRDkzNFhfUEFHRTE1X1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgIDB4MGYwMAotI2RlZmluZSBXQ0Q5MzRYX1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAweDBmMDEKLSNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDMF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjAyCi0jZGVmaW5lIFdDRDkzNFhfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMCAgICAgICAgICAgICAgICAgIDB4MGYxOQotI2RlZmluZSBXQ0Q5MzRYX1NQTElORV9TUkMxX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAweDBmMWEKLSNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wICAgICAgICAgICAgICAgICAgMHgwZjMxCi0jZGVmaW5lIFdDRDkzNFhfU1BMSU5FX1NSQzJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGYzMgotI2RlZmluZSBXQ0Q5MzRYX1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzAgICAgICAgICAgICAgICAgICAweDBmNDkKLSNkZWZpbmUgV0NEOTM0WF9TUExJTkVfU1JDM19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwZjRhCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMCAgICAgICAgICAgICAgICAgIDB4MGZhMQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzEgICAgICAgICAgICAgICAgICAweDBmYTIKLSNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcyICAgICAgICAgICAgICAgICAgMHgwZmEzCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMyAgICAgICAgICAgICAgICAgIDB4MGZhNAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzAgICAgICAgICAgICAgICAgICAweDBmYTUKLSNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcxICAgICAgICAgICAgICAgICAgMHgwZmE2Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMiAgICAgICAgICAgICAgICAgIDB4MGZhNwotI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzMgICAgICAgICAgICAgICAgICAweDBmYTgKLSNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfU1BMSU5FX1NSQ19ERUJVR19DRkcwICAgICAgICAgICAgMHgwZmE5Ci0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX1NQTElORV9TUkNfREVCVUdfQ0ZHMSAgICAgICAgICAgIDB4MGZhYQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19SQ19SRV9BU1JDX0RFQlVHX0NGRzAgICAgICAgICAgICAweDBmYWIKLSNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfQU5DMF9SQzBfRklGT19DVEwgICAgICAgICAgICAgICAgMHgwZmFjCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0FOQzBfUkMxX0ZJRk9fQ1RMICAgICAgICAgICAgICAgIDB4MGZhZAotI2RlZmluZSBXQ0Q5MzRYX0NEQ19ERUJVR19BTkMxX1JDMF9GSUZPX0NUTCAgICAgICAgICAgICAgICAweDBmYWUKLSNkZWZpbmUgV0NEOTM0WF9DRENfREVCVUdfQU5DMV9SQzFfRklGT19DVEwgICAgICAgICAgICAgICAgMHgwZmFmCi0jZGVmaW5lIFdDRDkzNFhfQ0RDX0RFQlVHX0FOQ19SQ19SU1RfREJHX0NOVFIgICAgICAgICAgICAgIDB4MGZiMAotI2RlZmluZSBXQ0Q5MzRYX1BBR0U4MF9QQUdFX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAweDUwMDAKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAxCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0RBVEFfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwMgotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9EQVRBXzIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDMKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA0Ci0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMCAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwNQotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzEgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDYKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfV1JfQUREUl8yICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDA3Ci0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1dSX0FERFJfMyAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwOAotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMDkKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfQUREUl8xICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDBhCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0FERFJfMiAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwYgotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9BRERSXzMgICAgICAgICAgICAgICAgICAgICAgICAweDUwMGMKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8wICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDBkCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1JEX0RBVEFfMSAgICAgICAgICAgICAgICAgICAgICAgIDB4NTAwZQotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9SRF9EQVRBXzIgICAgICAgICAgICAgICAgICAgICAgICAweDUwMGYKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfUkRfREFUQV8zICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDEwCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX0FDQ0VTU19DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4NTAxMQotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9BQ0NFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDUwMTIKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX0NYX1ZERCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDIxCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19DWF9WREQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAyMgotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX0NYX1ZERCAgICAgICAgICAgICAgICAgICAgICAweDUwMjMKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfTk9NX01YX1ZERCAgICAgICAgICAgICAgICAgICAgICAgMHg1MDI0Ci0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1NWU19NWF9WREQgICAgICAgICAgICAgICAgICAgICAgIDB4NTAyNQotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9TVlMyX01YX1ZERCAgICAgICAgICAgICAgICAgICAgICAweDUwMjYKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9NSU5fQ1hfVkREICAgICAgICAgICAgICAgICAgMHg1MDI3Ci0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX01BWF9TVlMyX1NURVAgICAgICAgICAgICAgICAgICAgIDB4NTAyOAotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9DVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUwMjkKLSNkZWZpbmUgV0NEOTM0WF9DT0RFQ19DUFJfU1dfTU9ERUNITkdfU1RBVFVTICAgICAgICAgICAgICAgMHg1MDJhCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfQ1BSX1NXX01PREVDSE5HX1NUQVJUICAgICAgICAgICAgICAgIDB4NTAyYgotI2RlZmluZSBXQ0Q5MzRYX0NPREVDX0NQUl9DUFJfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAweDUwMmMKLSNkZWZpbmUgV0NEOTM0WF9QQUdFMTI4X1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9CSVNUX01PREVfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMQotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fUkZfUEFfT05fUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMDIKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0lOVFIxX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAzCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9JTlRSMl9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNAotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU1dSX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMDUKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX1NXUl9DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2Ci0jZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMl9TQ0tfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNwotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU0xJTUJVU19EQVRBMV9QSU5DRkcgICAgICAgICAgICAgICAgICAweDgwMDgKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX1NMSU1CVVNfREFUQTJfUElOQ0ZHICAgICAgICAgICAgICAgICAgMHg4MDA5Ci0jZGVmaW5lIFdDRDkzNFhfVExNTV9TTElNQlVTX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgIDB4ODAwYQotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJDX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAweDgwMGIKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyQ19EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDBjCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMF9SWF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwZAotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzBfVFhfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMGUKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18wX1NDS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDBmCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMF9XU19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMAotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzFfUlhfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMTEKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18xX1RYX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDEyCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9JMlNfMV9TQ0tfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAxMwotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzFfV1NfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMTQKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0RNSUMxX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDE1Ci0jZGVmaW5lIFdDRDkzNFhfVExNTV9ETUlDMV9EQVRBX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgIDB4ODAxNgotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fRE1JQzJfQ0xLX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMTcKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0RNSUMyX0RBVEFfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgMHg4MDE4Ci0jZGVmaW5lIFdDRDkzNFhfVExNTV9ETUlDM19DTEtfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgIDB4ODAxOQotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAweDgwMWEKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0pUQ0tfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFiCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9HUElPMV9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxYwotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fR1BJTzJfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMWQKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0dQSU8zX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDFlCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9HUElPNF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAxZgotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU1BJX1NfQ1NOX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMjAKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX1NQSV9TX0NMS19QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgMHg4MDIxCi0jZGVmaW5lIFdDRDkzNFhfVExNTV9TUElfU19ET1VUX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgIDB4ODAyMgotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fU1BJX1NfRElOX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAweDgwMjMKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0JBX05fUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDI0Ci0jZGVmaW5lIFdDRDkzNFhfVExNTV9HUElPMF9QSU5DRkcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAyNQotI2RlZmluZSBXQ0Q5MzRYX1RMTU1fSTJTXzJfUlhfUElOQ0ZHICAgICAgICAgICAgICAgICAgICAgICAweDgwMjYKLSNkZWZpbmUgV0NEOTM0WF9UTE1NX0kyU18yX1dTX1BJTkNGRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MDI3Ci0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzAgICAgICAgICAgICAgICAgICAgIDB4ODAzMQotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV8xICAgICAgICAgICAgICAgICAgICAweDgwMzIKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfT0VfMiAgICAgICAgICAgICAgICAgICAgMHg4MDMzCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzMgICAgICAgICAgICAgICAgICAgIDB4ODAzNAotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9PRV80ICAgICAgICAgICAgICAgICAgICAweDgwMzUKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8wICAgICAgICAgICAgICAgICAgMHg4MDM2Ci0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfMSAgICAgICAgICAgICAgICAgIDB4ODAzNwotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUElOX0NUTF9EQVRBXzIgICAgICAgICAgICAgICAgICAweDgwMzgKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BJTl9DVExfREFUQV8zICAgICAgICAgICAgICAgICAgMHg4MDM5Ci0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX0RBVEFfNCAgICAgICAgICAgICAgICAgIDB4ODAzYQotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0RSVkNUTF8wICAgICAgICAgICAgICAgICAgICAweDgwM2IKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9EUlZDVExfMSAgICAgICAgICAgICAgICAgICAgMHg4MDNjCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4ODAzZAotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEgICAgICAgICAgICAgICAgICAweDgwM2UKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8yICAgICAgICAgICAgICAgICAgMHg4MDNmCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19NRU1fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MAotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfQlVTX1NFTCAgICAgICAgICAgICAgICAgICAweDgwNDEKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0pUQUcgICAgICAgICAgICAgICAgICAgICAgMHg4MDQyCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl8xICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MwotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fMiAgICAgICAgICAgICAgICAgICAgICAweDgwNDQKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0RFQlVHX0VOXzMgICAgICAgICAgICAgICAgICAgICAgMHg4MDQ1Ci0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19ERUJVR19FTl80ICAgICAgICAgICAgICAgICAgICAgIDB4ODA0NgotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfREVCVUdfRU5fNSAgICAgICAgICAgICAgICAgICAgICAweDgwNDcKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0FOQV9EVEVTVF9ESVIgICAgICAgICAgICAgICAgICAgMHg4MDRhCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMCAgICAgICAgICAgICAgIDB4ODA0YgotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzEgICAgICAgICAgICAgICAweDgwNGMKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1BBRF9JTlBfRElTQUJMRV8yICAgICAgICAgICAgICAgMHg4MDRkCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19QQURfSU5QX0RJU0FCTEVfMyAgICAgICAgICAgICAgIDB4ODA0ZQotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfUEFEX0lOUF9ESVNBQkxFXzQgICAgICAgICAgICAgICAweDgwNGYKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1NZU01FTV9DVFJMICAgICAgICAgICAgICAgICAgICAgMHg4MDUwCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19TT0NfU1dfUFdSX1NFUV9ERUxBWSAgICAgICAgICAgIDB4ODA1MQotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fTE9XICAgICAgICAgICAgICAgICAgICAweDgwNTIKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfTk9NX0hJR0ggICAgICAgICAgICAgICAgICAgMHg4MDUzCi0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0xPVyAgICAgICAgICAgICAgIDB4ODA1NAotI2RlZmluZSBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9TVlNfU1ZTMl9ISUdIICAgICAgICAgICAgICAweDgwNTUKLSNkZWZpbmUgV0NEOTM0WF9URVNUX0RFQlVHX1NQSV9TTEFWRV9DSEFSICAgICAgICAgICAgICAgICAgMHg4MDU2Ci0jZGVmaW5lIFdDRDkzNFhfVEVTVF9ERUJVR19DT0RFQ19ESUFHUyAgICAgICAgICAgICAgICAgICAgIDB4ODA1NwotI2RlZmluZSBXQ0Q5MzRYX01BWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRkYKLQotLyogU0xJTUJVUyBTbGF2ZSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9FTjAgICAgICAgICAgICAgICAgICAgICAoMHgzMCkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgICAgICAgICAgICAgICAgICAgICAoMHgzMikKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfUlhfMCAgICAgICAgICAgICAgICAoMHgzNCkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfUlhfMSAgICAgICAgICAgICAgICAoMHgzNSkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMCAgICAgICAgICAgICAgICAoMHgzNikKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9TVEFUVVNfVFhfMSAgICAgICAgICAgICAgICAoMHgzNykKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMCAgICAgICAgICAgICAgICAgICAoMHgzOCkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMSAgICAgICAgICAgICAgICAgICAoMHgzOSkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9DTFJfVFhfMCAgICAgICAgICAgICAgICAgICAoMHgzQSkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9DTFJfVFhfMSAgICAgICAgICAgICAgICAgICAoMHgzQikKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwICAgICAgICAgICAgICAgICAoMHg2MCkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9TT1VSQ0UwICAgICAgICAgICAgICAgICAoMHg3MCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvS2J1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU1OTY1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvS2J1aWxkCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1oZWFkZXIteSArPSB3Y2Q5eHh4X3JlZ2lzdGVycy5oCi1oZWFkZXIteSArPSB3Y2Q5MzIwX3JlZ2lzdGVycy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTk0MDEwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NRkRfVEFCTEFfQ09SRV9IX18KLSNkZWZpbmUgX19NRkRfVEFCTEFfQ09SRV9IX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0KLSNkZWZpbmUgV0NEOVhYWF9NQVhfSVJRX1JFR1MgNAotI2RlZmluZSBXQ0Q5WFhYX01BWF9OVU1fSVJRUyAoV0NEOVhYWF9NQVhfSVJRX1JFR1MgKiA4KQotI2RlZmluZSBXQ0Q5WFhYX1NMSU1fTlVNX1BPUlRfUkVHIDMKLSNkZWZpbmUgVEFCTEFfVkVSU0lPTl8xXzAJMAotI2RlZmluZSBUQUJMQV9WRVJTSU9OXzFfMQkxCi0jZGVmaW5lIFRBQkxBX1ZFUlNJT05fMl8wCTIKLSNkZWZpbmUgVEFCTEFfSVNfMV9YKHZlcikgXAotCSgoKHZlciA9PSBUQUJMQV9WRVJTSU9OXzFfMCkgfHwgKHZlciA9PSBUQUJMQV9WRVJTSU9OXzFfMSkpID8gMSA6IDApCi0jZGVmaW5lIFRBQkxBX0lTXzJfMCh2ZXIpICgodmVyID09IFRBQkxBX1ZFUlNJT05fMl8wKSA/IDEgOiAwKQotCi0jZGVmaW5lIFdDRDlYWFhfU1VQUExZX0JVQ0tfTkFNRSAiY2RjLXZkZC1idWNrIgotCi0jZGVmaW5lIFNJVEFSX1ZFUlNJT05fMVAwIDAKLSNkZWZpbmUgU0lUQVJfVkVSU0lPTl8xUDEgMQotI2RlZmluZSBTSVRBUl9JU18xUDAodmVyKSBcCi0JKCh2ZXIgPT0gU0lUQVJfVkVSU0lPTl8xUDApID8gMSA6IDApCi0jZGVmaW5lIFNJVEFSX0lTXzFQMSh2ZXIpIFwKLQkoKHZlciA9PSBTSVRBUl9WRVJTSU9OXzFQMSkgPyAxIDogMCkKLQotI2RlZmluZSBUQUlLT19WRVJTSU9OXzFfMAkxCi0jZGVmaW5lIFRBSUtPX0lTXzFfMCh2ZXIpIFwKLQkoKHZlciA9PSBUQUlLT19WRVJTSU9OXzFfMCkgPyAxIDogMCkKLQotI2RlZmluZSBUQVBBTl9WRVJTSU9OXzFfMAkwCi0jZGVmaW5lIFRBUEFOX0lTXzFfMCh2ZXIpIFwKLQkoKHZlciA9PSBUQVBBTl9WRVJTSU9OXzFfMCkgPyAxIDogMCkKLQotI2RlZmluZSBUT01UT01fVkVSU0lPTl8xXzAJMQotI2RlZmluZSBUT01UT01fSVNfMV8wKHZlcikgXAotCSgodmVyID09IFRPTVRPTV9WRVJTSU9OXzFfMCkgPyAxIDogMCkKLQotI2RlZmluZSBUQVNIQV9WRVJTSU9OXzFfMCAgICAgMAotI2RlZmluZSBUQVNIQV9WRVJTSU9OXzFfMSAgICAgMQotI2RlZmluZSBUQVNIQV9WRVJTSU9OXzJfMCAgICAgMgotCi0jZGVmaW5lIFRBU0hBX0lTXzFfMCh3Y2QpIFwKLQkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzM1IHx8IHdjZC0+dHlwZSA9PSBXQ0Q5MzI2KSA/IFwKLQkoKHdjZC0+dmVyc2lvbiA9PSBUQVNIQV9WRVJTSU9OXzFfMCkgPyAxIDogMCkgOiAwKQotCi0jZGVmaW5lIFRBU0hBX0lTXzFfMSh3Y2QpIFwKLQkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzM1IHx8IHdjZC0+dHlwZSA9PSBXQ0Q5MzI2KSA/IFwKLQkoKHdjZC0+dmVyc2lvbiA9PSBUQVNIQV9WRVJTSU9OXzFfMSkgPyAxIDogMCkgOiAwKQotCi0jZGVmaW5lIFRBU0hBX0lTXzJfMCh3Y2QpIFwKLQkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzM1IHx8IHdjZC0+dHlwZSA9PSBXQ0Q5MzI2KSA/IFwKLQkoKHdjZC0+dmVyc2lvbiA9PSBUQVNIQV9WRVJTSU9OXzJfMCkgPyAxIDogMCkgOiAwKQotCi0vKgotICogQXMgZmluZSB2ZXJzaW9uIGluZm8gY2Fubm90IGJlIHJldHJpZXZlZCBiZWZvcmUgdGF2aWwgcHJvYmUuCi0gKiBEZWZpbmUgdGhyZWUgY29hcnNlIHZlcnNpb25zIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIGJlZm9yZSB0YXZpbCBwcm9iZS4KLSAqLwotI2RlZmluZSBUQVZJTF9WRVJTSU9OXzFfMCAgICAgICAgICAgICAwCi0jZGVmaW5lIFRBVklMX1ZFUlNJT05fMV8xICAgICAgICAgICAgIDEKLSNkZWZpbmUgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMCAgICAgMgotI2RlZmluZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDFfMV8wICAgICAzCi0jZGVmaW5lIFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzEgICAgIDQKLSNkZWZpbmUgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMSAgICAgNQotCi0jZGVmaW5lIFRBVklMX0lTXzFfMCh3Y2QpIFwKLQkoKHdjZC0+dHlwZSA9PSBXQ0Q5MzRYKSA/IFwKLQkgKCh3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzAgfHwgXAotCSAgIHdjZC0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8wIHx8IFwKLQkgICB3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMCkgPyAxIDogMCkgOiAwKQotI2RlZmluZSBUQVZJTF9JU18xXzEod2NkKSBcCi0JKCh3Y2QtPnR5cGUgPT0gV0NEOTM0WCkgPyBcCi0JICgod2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8xIHx8IFwKLQkgICB3Y2QtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMSB8fCBcCi0JICAgd2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzEpID8gMSA6IDApIDogMCkKLSNkZWZpbmUgVEFWSUxfSVNfV0NEOTM0MF8xXzAod2NkKSBcCi0JKCh3Y2QtPnR5cGUgPT0gV0NEOTM0WCkgPyBcCi0JICgod2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzApID8gMSA6IDApIDogMCkKLSNkZWZpbmUgVEFWSUxfSVNfV0NEOTM0MV8xXzAod2NkKSBcCi0JKCh3Y2QtPnR5cGUgPT0gV0NEOTM0WCkgPyBcCi0JICgod2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzApID8gMSA6IDApIDogMCkKLSNkZWZpbmUgVEFWSUxfSVNfV0NEOTM0MF8xXzEod2NkKSBcCi0JKCh3Y2QtPnR5cGUgPT0gV0NEOTM0WCkgPyBcCi0JICgod2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MF8xXzEpID8gMSA6IDApIDogMCkKLSNkZWZpbmUgVEFWSUxfSVNfV0NEOTM0MV8xXzEod2NkKSBcCi0JKCh3Y2QtPnR5cGUgPT0gV0NEOTM0WCkgPyBcCi0JICgod2NkLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzEpID8gMSA6IDApIDogMCkKLQotI2RlZmluZSBJU19DT0RFQ19UWVBFKHdjZCwgd2NkdHlwZSkgXAotCSgod2NkLT50eXBlID09IHdjZHR5cGUpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19DT0RFQ19WRVJTSU9OKHdjZCwgd2NkdmVyc2lvbikgXAotCSgod2NkLT52ZXJzaW9uID09IHdjZHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKQotCi1lbnVtIHsKLQlDRENfVl8xXzAsCi0JQ0RDX1ZfMV8xLAotCUNEQ19WXzJfMCwKLX07Ci0KLWVudW0gY29kZWNfdmFyaWFudCB7Ci0JV0NEOVhYWCwKLQlXQ0Q5MzMwLAotCVdDRDkzMzUsCi0JV0NEOTMyNiwKLQlXQ0Q5MzRYLAotfTsKLQotZW51bSB3Y2Q5eHh4X3NsaW1fc2xhdmVfYWRkcl90eXBlIHsKLQlXQ0Q5WFhYX1NMSU1fU0xBVkVfQUREUl9UWVBFXzAsCi0JV0NEOVhYWF9TTElNX1NMQVZFX0FERFJfVFlQRV8xLAotfTsKLQotZW51bSB3Y2Q5eHh4X3BtX3N0YXRlIHsKLQlXQ0Q5WFhYX1BNX1NMRUVQQUJMRSwKLQlXQ0Q5WFhYX1BNX0FXQUtFLAotCVdDRDlYWFhfUE1fQVNMRUVQLAotfTsKLQotZW51bSB7Ci0JV0NEOVhYWF9JTlRSX1NUQVRVU19CQVNFID0gMCwKLQlXQ0Q5WFhYX0lOVFJfQ0xFQVJfQkFTRSwKLQlXQ0Q5WFhYX0lOVFJfTUFTS19CQVNFLAotCVdDRDlYWFhfSU5UUl9MRVZFTF9CQVNFLAotCVdDRDlYWFhfSU5UUl9DTFJfQ09NTUlULAotCVdDRDlYWFhfSU5UUl9SRUdfTUFYLAotfTsKLQotZW51bSB3Y2Q5eHh4X2ludGZfc3RhdHVzIHsKLQlXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1BST0JJTkcsCi0JV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTLAotCVdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDLAotfTsKLQotZW51bSB7Ci0JLyogSU5UUl9SRUcgMCAqLwotCVdDRDlYWFhfSVJRX1NMSU1CVVMgPSAwLAotCVdDRDlYWFhfSVJRX01CSENfUkVNT1ZBTCwKLQlXQ0Q5WFhYX0lSUV9NQkhDX1NIT1JUX1RFUk0sCi0JV0NEOVhYWF9JUlFfTUJIQ19QUkVTUywKLQlXQ0Q5WFhYX0lSUV9NQkhDX1JFTEVBU0UsCi0JV0NEOVhYWF9JUlFfTUJIQ19QT1RFTlRJQUwsCi0JV0NEOVhYWF9JUlFfTUJIQ19JTlNFUlRJT04sCi0JV0NEOVhYWF9JUlFfQkdfUFJFQ0hBUkdFLAotCS8qIElOVFJfUkVHIDEgKi8KLQlXQ0Q5WFhYX0lSUV9QQTFfU1RBUlRVUCwKLQlXQ0Q5WFhYX0lSUV9QQTJfU1RBUlRVUCwKLQlXQ0Q5WFhYX0lSUV9QQTNfU1RBUlRVUCwKLQlXQ0Q5WFhYX0lSUV9QQTRfU1RBUlRVUCwKLQlXQ0Q5MzA2X0lSUV9IUEhfUEFfT0NQUl9GQVVMVCA9IFdDRDlYWFhfSVJRX1BBNF9TVEFSVFVQLAotCVdDRDlYWFhfSVJRX1BBNV9TVEFSVFVQLAotCVdDRDlYWFhfSVJRX01JQ0JJQVMxX1BSRUNIQVJHRSwKLQlXQ0Q5MzA2X0lSUV9IUEhfUEFfT0NQTF9GQVVMVCA9IFdDRDlYWFhfSVJRX01JQ0JJQVMxX1BSRUNIQVJHRSwKLQlXQ0Q5WFhYX0lSUV9NSUNCSUFTMl9QUkVDSEFSR0UsCi0JV0NEOVhYWF9JUlFfTUlDQklBUzNfUFJFQ0hBUkdFLAotCS8qIElOVFJfUkVHIDIgKi8KLQlXQ0Q5WFhYX0lSUV9IUEhfUEFfT0NQTF9GQVVMVCwKLQlXQ0Q5WFhYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKLQlXQ0Q5WFhYX0lSUV9FQVJfUEFfT0NQTF9GQVVMVCwKLQlXQ0Q5WFhYX0lSUV9IUEhfTF9QQV9TVEFSVFVQLAotCVdDRDlYWFhfSVJRX0hQSF9SX1BBX1NUQVJUVVAsCi0JV0NEOTMyMF9JUlFfRUFSX1BBX1NUQVJUVVAsCi0JV0NEOTMwNl9JUlFfTUJIQ19KQUNLX1NXSVRDSCA9IFdDRDkzMjBfSVJRX0VBUl9QQV9TVEFSVFVQLAotCVdDRDkzMTBfTlVNX0lSUVMsCi0JV0NEOVhYWF9JUlFfUkVTRVJWRURfMCA9IFdDRDkzMTBfTlVNX0lSUVMsCi0JV0NEOVhYWF9JUlFfUkVTRVJWRURfMSwKLQlXQ0Q5MzMwX0lSUV9TVkFTU19FUlJfRVhDRVBUSU9OID0gV0NEOTMxMF9OVU1fSVJRUywKLQlXQ0Q5MzMwX0lSUV9NQkhDX0pBQ0tfU1dJVENILAotCS8qIElOVFJfUkVHIDMgKi8KLQlXQ0Q5WFhYX0lSUV9NQURfQVVESU8sCi0JV0NEOVhYWF9JUlFfTUFEX1VMVFJBU09VTkQsCi0JV0NEOVhYWF9JUlFfTUFEX0JFQUNPTiwKLQlXQ0Q5WFhYX0lSUV9TUEVBS0VSX0NMSVBQSU5HLAotCVdDRDkzMjBfSVJRX01CSENfSkFDS19TV0lUQ0gsCi0JV0NEOTMwNl9OVU1fSVJRUywKLQlXQ0Q5WFhYX0lSUV9WQkFUX01PTklUT1JfQVRUQUNLID0gV0NEOTMwNl9OVU1fSVJRUywKLQlXQ0Q5WFhYX0lSUV9WQkFUX01PTklUT1JfUkVMRUFTRSwKLQlXQ0Q5WFhYX05VTV9JUlFTLAotCS8qIFdDRDkzMzAgSU5UUjFfUkVHIDMqLwotCVdDRDkzMzBfSVJRX1NWQVNTX0VOR0lORSA9IFdDRDlYWFhfSVJRX01BRF9BVURJTywKLQlXQ0Q5MzMwX0lSUV9NQURfQVVESU8sCi0JV0NEOTMzMF9JUlFfTUFEX1VMVFJBU09VTkQsCi0JV0NEOTMzMF9JUlFfTUFEX0JFQUNPTiwKLQlXQ0Q5MzMwX0lSUV9TUEVBS0VSMV9DTElQUElORywKLQlXQ0Q5MzMwX0lSUV9TUEVBS0VSMl9DTElQUElORywKLQlXQ0Q5MzMwX0lSUV9WQkFUX01PTklUT1JfQVRUQUNLLAotCVdDRDkzMzBfSVJRX1ZCQVRfTU9OSVRPUl9SRUxFQVNFLAotCVdDRDkzMzBfTlVNX0lSUVMsCi0JV0NEOVhYWF9JUlFfUkVTRVJWRURfMiA9IFdDRDkzMzBfTlVNX0lSUVMsCi19OwotCi1lbnVtIHsKLQlUQUJMQV9OVU1fSVJRUyA9IFdDRDkzMTBfTlVNX0lSUVMsCi0JU0lUQVJfTlVNX0lSUVMgPSBXQ0Q5MzEwX05VTV9JUlFTLAotCVRBSUtPX05VTV9JUlFTID0gV0NEOVhYWF9OVU1fSVJRUywKLQlUQVBBTl9OVU1fSVJRUyA9IFdDRDkzMDZfTlVNX0lSUVMsCi0JVE9NVE9NX05VTV9JUlFTID0gV0NEOTMzMF9OVU1fSVJRUywKLX07Ci0KLXN0cnVjdCBpbnRyX2RhdGEgewotCWludCBpbnRyX251bTsKLQlib29sIGNsZWFyX2ZpcnN0OwotfTsKLQotc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSB7Ci0Jc3RydWN0IG11dGV4IGlycV9sb2NrOwotCXN0cnVjdCBtdXRleCBuZXN0ZWRfaXJxX2xvY2s7Ci0KLQllbnVtIHdjZDl4eHhfcG1fc3RhdGUgcG1fc3RhdGU7Ci0Jc3RydWN0IG11dGV4IHBtX2xvY2s7Ci0JLyogcG1fd3Egbm90aWZpZXMgY2hhbmdlIG9mIHBtX3N0YXRlICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgcG1fd3E7Ci0Jc3RydWN0IHBtX3Fvc19yZXF1ZXN0IHBtX3Fvc19yZXE7Ci0JaW50IHdsb2NrX2hvbGRlcnM7Ci0KLQotCS8qIGhvbGRzIHRoZSB0YWJsZSBvZiBpbnRlcnJ1cHRzIHBlciBjb2RlYyAqLwotCWNvbnN0IHN0cnVjdCBpbnRyX2RhdGEgKmludHJfdGFibGU7Ci0JaW50IGludHJfdGFibGVfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7Ci0JdW5zaWduZWQgaW50IGlycTsKLQl1OCBpcnFfbWFza3NfY3VyW1dDRDlYWFhfTUFYX0lSUV9SRUdTXTsKLQl1OCBpcnFfbWFza3NfY2FjaGVbV0NEOVhYWF9NQVhfSVJRX1JFR1NdOwotCWJvb2wgaXJxX2xldmVsX2hpZ2hbV0NEOVhYWF9NQVhfTlVNX0lSUVNdOwotCWludCBudW1faXJxczsKLQlpbnQgbnVtX2lycV9yZWdzOwotCXUxNiBpbnRyX3JlZ1tXQ0Q5WFhYX0lOVFJfUkVHX01BWF07Ci0Jc3RydWN0IHJlZ21hcCAqd2NkX2NvcmVfcmVnbWFwOwotCi0JLyogUG9pbnRlciB0byBwYXJlbnQgY29udGFpbmVyIGRhdGEgc3RydWN0dXJlICovCi0Jdm9pZCAqcGFyZW50OwotCi0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci19OwotCi0vKgotICogZGF0YSBzdHJ1Y3R1cmUgZm9yIFNsaW1idXMgYW5kIEkyUyBjaGFubmVsLgotICogU29tZSBvZiBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpbiBzbWlsYnVzIG1vZGUKLSAqLwotc3RydWN0IHdjZDl4eHhfY2ggewotCXUzMiBzcGg7CQkvKiBzaGFyZSBjaGFubmVsIGhhbmRsZSAtIHNsaW1idXMgb25seQkqLwotCXUzMiBjaF9udW07CQkvKgotCQkJCSAqIHZpdHJ1YWwgY2hhbm5lbCBudW1iZXIsIHN1Y2ggYXMgMTI4IC0xNDQuCi0JCQkJICogYXBwbHkgZm9yIHNsaW1idXMgb25seQotCQkJCSAqLwotCXUxNiBjaF9oOwkJLyogY2hhbmVsIGhhbmRsZSAtIHNsaW1idXMgb25seSAqLwotCXUxNiBwb3J0OwkJLyoKLQkJCQkgKiB0YWJsYSBwb3J0IGZvciBSWCBhbmQgVFgKLQkJCQkgKiBzdWNoIGFzIDAtOSBmb3IgVFggYW5kIDEwIC0xNiBmb3IgUlgKLQkJCQkgKiBhcHBseSBmb3IgYm90aCBpMnMgYW5kIHNsaW1idXMKLQkJCQkgKi8KLQl1MTYgc2hpZnQ7CQkvKgotCQkJCSAqIHNoaWZ0IGJpdCBmb3IgUlggYW5kIFRYCi0JCQkJICogYXBwbHkgZm9yIGJvdGggaTJzIGFuZCBzbGltYnVzCi0JCQkJICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKgotCQkJCSAqIGNoYW5uZWwgbGluayBsaXN0Ci0JCQkJICogYXBwbHkgZm9yIGJvdGggaTJzIGFuZCBzbGltYnVzCi0JCQkJICovCi19OwotCi1zdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSB7Ci0JdTMyIHJhdGU7CQkJCS8qIHNhbXBsZSByYXRlICAgICAgICAgICovCi0JdTMyIGJpdF93aWR0aDsJCQkJLyogc2l0IHdpZHRoIDE2LDI0LDMyICAgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHdjZDl4eHhfY2hfbGlzdDsJLyogY2hhbm5lbCBsaXN0ICAgICAgICAgKi8KLQl1MTYgZ3JwaDsJCQkJLyogc2xpbWJ1cyBncm91cCBoYW5kbGUgKi8KLQl1bnNpZ25lZCBsb25nIGNoX21hc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZGFpX3dhaXQ7Ci0JYm9vbCBidXNfZG93bl9pbl9yZWNvdmVyeTsKLX07Ci0KLSNkZWZpbmUgV0NEOVhYWF9DSCh4cG9ydCwgeHNoaWZ0KSBcCi0Jey5wb3J0ID0geHBvcnQsIC5zaGlmdCA9IHhzaGlmdH0KLQotZW51bSB3Y2Q5eHh4X2NoaXBpZF9tYWpvciB7Ci0JVEFCTEFfTUFKT1IgPSBjcHVfdG9fbGUxNigweDEwMCksCi0JU0lUQVJfTUFKT1IgPSBjcHVfdG9fbGUxNigweDEwMSksCi0JVEFJS09fTUFKT1IgPSBjcHVfdG9fbGUxNigweDEwMiksCi0JVEFQQU5fTUFKT1IgPSBjcHVfdG9fbGUxNigweDEwMyksCi0JVE9NVE9NX01BSk9SID0gY3B1X3RvX2xlMTYoMHgxMDUpLAotCVRBU0hBX01BSk9SID0gY3B1X3RvX2xlMTYoMHgwKSwKLQlUQVNIQTJQMF9NQUpPUiA9IGNwdV90b19sZTE2KDB4MTA3KSwKLQlUQVZJTF9NQUpPUiA9IGNwdV90b19sZTE2KDB4MTA4KSwKLX07Ci0KLWVudW0gY29kZWNfcG93ZXJfc3RhdGVzIHsKLQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX0JFR0lOLAotCVdDRF9SRUdJT05fUE9XRVJfRE9XTiwKLX07Ci0KLWVudW0gd2NkX3Bvd2VyX3JlZ2lvbnMgewotCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEsCi0JV0NEOVhYWF9NQVhfUFdSX1JFR0lPTlMsCi19OwotCi1zdHJ1Y3Qgd2NkOXh4eF9jb2RlY190eXBlIHsKLQl1MTYgaWRfbWFqb3I7Ci0JdTE2IGlkX21pbm9yOwotCXN0cnVjdCBtZmRfY2VsbCAqZGV2OwotCWludCBzaXplOwotCWludCBudW1faXJxczsKLQlpbnQgdmVyc2lvbjsgLyogLTEgdG8gcmV0cmlldmUgdmVyc2lvbiBmcm9tIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwotCWVudW0gd2NkOXh4eF9zbGltX3NsYXZlX2FkZHJfdHlwZSBzbGltX3NsYXZlX3R5cGU7Ci0JdTE2IGkyY19jaGlwX3N0YXR1czsKLQljb25zdCBzdHJ1Y3QgaW50cl9kYXRhICppbnRyX3RibDsKLQlpbnQgaW50cl90Ymxfc2l6ZTsKLQl1MTYgaW50cl9yZWdbV0NEOVhYWF9JTlRSX1JFR19NQVhdOwotfTsKLQotc3RydWN0IHdjZDl4eHhfcG93ZXJfcmVnaW9uIHsKLQllbnVtIGNvZGVjX3Bvd2VyX3N0YXRlcyBwb3dlcl9zdGF0ZTsKLQl1MTYgcHdyX2NvbGxhcHNlX3JlZ19taW47Ci0JdTE2IHB3cl9jb2xsYXBzZV9yZWdfbWF4OwotfTsKLQotc3RydWN0IHdjZDl4eHggewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNsaW07Ci0Jc3RydWN0IHNsaW1fZGV2aWNlICpzbGltX3NsYXZlOwotCXN0cnVjdCBtdXRleCBpb19sb2NrOwotCXN0cnVjdCBtdXRleCB4ZmVyX2xvY2s7Ci0Jc3RydWN0IG11dGV4IHJlc2V0X2xvY2s7Ci0JdTggdmVyc2lvbjsKLQotCWludCByZXNldF9ncGlvOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqd2NkX3JzdF9ucDsKLQotCWludCAoKnJlYWRfZGV2KShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJaW50IGJ5dGVzLCB2b2lkICpkZXN0LCBib29sIGludGVyZmFjZV9yZWcpOwotCWludCAoKndyaXRlX2Rldikoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCWludCBieXRlcywgdm9pZCAqc3JjLCBib29sIGludGVyZmFjZV9yZWcpOwotCWludCAoKm11bHRpX3JlZ193cml0ZSkoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50KTsKLQlpbnQgKCpkZXZfZG93bikoc3RydWN0IHdjZDl4eHggKndjZDl4eHgpOwotCWludCAoKnBvc3RfcmVzZXQpKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KTsKLQotCXZvaWQgKnNzcl9wcml2OwotCXVuc2lnbmVkIGxvbmcgZGV2X3VwOwotCi0JdTMyIG51bV9vZl9zdXBwbGllczsKLQlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqc3VwcGxpZXM7Ci0KLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlIGNvcmVfcmVzOwotCi0JdTE2IGlkX21pbm9yOwotCXUxNiBpZF9tYWpvcjsKLQotCS8qIFNsaW1idXMgb3IgSTJTIHBvcnQgKi8KLQl1MzIgbnVtX3J4X3BvcnQ7Ci0JdTMyIG51bV90eF9wb3J0OwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpyeF9jaHM7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKnR4X2NoczsKLQl1MzIgbWNsa19yYXRlOwotCWVudW0gY29kZWNfdmFyaWFudCB0eXBlOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKLQotCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX3R5cGUgKmNvZGVjX3R5cGU7Ci0JYm9vbCBwcmV2X3BnX3ZhbGlkOwotCXU4IHByZXZfcGc7Ci0JdTggYXZvaWRfY2RjX3JzdGxvdzsKLQlzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24gKndjZDl4eHhfcHdyW1dDRDlYWFhfTUFYX1BXUl9SRUdJT05TXTsKLX07Ci0KLXN0cnVjdCB3Y2Q5eHh4X3JlZ192YWwgewotCXVuc2lnbmVkIHNob3J0IHJlZzsgLyogcmVnaXN0ZXIgYWRkcmVzcyAqLwotCXU4ICpidWY7ICAgICAgICAgICAgLyogYnVmZmVyIHRvIGJlIHdyaXR0ZW4gdG8gcmVnLiBhZGRyICovCi0JaW50IGJ5dGVzOyAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiAqLwotfTsKLQotaW50IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LCB1bnNpZ25lZCBzaG9ydCByZWcpOwotaW50IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgdW5zaWduZWQgc2hvcnQgcmVnLAotCQl1OCB2YWwpOwotaW50IHdjZDl4eHhfZ2V0X2xvZ2ljYWxfYWRkcmVzc2VzKHU4ICpwZ2RfbGEsIHU4ICppbmZfbGEpOwotaW50IHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCSAgICAgaW50IGJ5dGVzLCB2b2lkICpzcmMpOwotaW50IHdjZDl4eHhfc2xpbV9yZXNlcnZlX2J3KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgIHUzMiBid19vcHMsIGJvb2wgY29tbWl0KTsKLWludCB3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwgZW51bSBjb2RlY19wb3dlcl9zdGF0ZXMsCi0JCQkgICAgZW51bSB3Y2RfcG93ZXJfcmVnaW9ucyk7Ci1pbnQgd2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZShzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCQkgICAgZW51bSB3Y2RfcG93ZXJfcmVnaW9ucyk7Ci0KLWludCB3Y2Q5eHh4X3BhZ2Vfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsIHVuc2lnbmVkIHNob3J0ICpyZWcpOwotCi1pbnQgd2NkOXh4eF9zbGltX2J1bGtfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkgICAgc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWcsCi0JCQkgICAgdW5zaWduZWQgaW50IHNpemUsIGJvb2wgaW50ZXJmYWNlKTsKLQotZXh0ZXJuIGludCB3Y2Q5eHh4X2NvcmVfcmVzX2luaXQoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKLQlpbnQgbnVtX2lycXMsIGludCBudW1faXJxX3JlZ3MsIHN0cnVjdCByZWdtYXAgKndjZF9yZWdtYXApOwotCi1leHRlcm4gdm9pZCB3Y2Q5eHh4X2NvcmVfcmVzX2RlaW5pdCgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzKTsKLQotZXh0ZXJuIGludCB3Y2Q5eHh4X2NvcmVfcmVzX3N1c3BlbmQoCi0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKLQlwbV9tZXNzYWdlX3QgcG1lc2cpOwotCi1leHRlcm4gaW50IHdjZDl4eHhfY29yZV9yZXNfcmVzdW1lKAotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMpOwotCi1leHRlcm4gaW50IHdjZDl4eHhfY29yZV9pcnFfaW5pdCgKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X2NvcmVfcmVzKTsKLQotZXh0ZXJuIGludCB3Y2Q5eHh4X2Fzc2lnbl9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9jb3JlX3JlcywKLQkJCSAgICAgIHVuc2lnbmVkIGludCBpcnEsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaXJxX2Jhc2UpOwotCi1leHRlcm4gZW51bSB3Y2Q5eHh4X2ludGZfc3RhdHVzIHdjZDl4eHhfZ2V0X2ludGZfdHlwZSh2b2lkKTsKLWV4dGVybiB2b2lkIHdjZDl4eHhfc2V0X2ludGZfdHlwZShlbnVtIHdjZDl4eHhfaW50Zl9zdGF0dXMpOwotCi1leHRlcm4gZW51bSB3Y2Q5eHh4X3BtX3N0YXRlIHdjZDl4eHhfcG1fY21weGNoZygKLQkJCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfY29yZV9yZXMsCi0JCQllbnVtIHdjZDl4eHhfcG1fc3RhdGUgbywKLQkJCWVudW0gd2NkOXh4eF9wbV9zdGF0ZSBuKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9faW5pdCB3Y2Q5eHh4X2lycV9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHdjZDl4eHhfaW5pdCh2b2lkKTsKLXZvaWQgd2NkOXh4eF9leGl0KHZvaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTQ3MjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NRkRfV0NEOVhYWF9QREFUQV9IX18KLQotI2RlZmluZSBfX01GRF9XQ0Q5WFhYX1BEQVRBX0hfXwotCi0jaW5jbHVkZSA8bGludXgvc2xpbWJ1cy9zbGltYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtc3VwcGx5Lmg+Ci0KLSNkZWZpbmUgTUlDQklBU19FWFRfQllQX0NBUCAweDAwCi0jZGVmaW5lIE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVAgMHgwMQotCi0jZGVmaW5lIFNJVEFSX0xET0hfMVA5NV9WIDB4MAotI2RlZmluZSBTSVRBUl9MRE9IXzJQMzVfViAweDEKLSNkZWZpbmUgU0lUQVJfTERPSF8yUDc1X1YgMHgyCi0jZGVmaW5lIFNJVEFSX0xET0hfMlA4NV9WIDB4MwotCi0jZGVmaW5lIFNJVEFSX0NGSUxUMV9TRUwgMHgwCi0jZGVmaW5lIFNJVEFSX0NGSUxUMl9TRUwgMHgxCi0jZGVmaW5lIFNJVEFSX0NGSUxUM19TRUwgMHgyCi0KLSNkZWZpbmUgV0NEOVhYWF9MRE9IXzFQOTVfViAweDAKLSNkZWZpbmUgV0NEOVhYWF9MRE9IXzJQMzVfViAweDEKLSNkZWZpbmUgV0NEOVhYWF9MRE9IXzJQNzVfViAweDIKLSNkZWZpbmUgV0NEOVhYWF9MRE9IXzJQODVfViAweDMKLSNkZWZpbmUgV0NEOVhYWF9MRE9IXzNQMF9WIDB4MwotCi0jZGVmaW5lIFRBQkxBX0xET0hfMVA5NV9WIDB4MAotI2RlZmluZSBUQUJMQV9MRE9IXzJQMzVfViAweDEKLSNkZWZpbmUgVEFCTEFfTERPSF8yUDc1X1YgMHgyCi0jZGVmaW5lIFRBQkxBX0xET0hfMlA4NV9WIDB4MwotCi0jZGVmaW5lIFRBQkxBX0NGSUxUMV9TRUwgMHgwCi0jZGVmaW5lIFRBQkxBX0NGSUxUMl9TRUwgMHgxCi0jZGVmaW5lIFRBQkxBX0NGSUxUM19TRUwgMHgyCi0KLSNkZWZpbmUgTUFYX0FNSUNfQ0hBTk5FTCA3Ci0KLSNkZWZpbmUgVEFCTEFfT0NQXzMwMF9NQSAweDAKLSNkZWZpbmUgVEFCTEFfT0NQXzM1MF9NQSAweDIKLSNkZWZpbmUgVEFCTEFfT0NQXzM2NV9NQSAweDMKLSNkZWZpbmUgVEFCTEFfT0NQXzE1MF9NQSAweDQKLSNkZWZpbmUgVEFCTEFfT0NQXzE5MF9NQSAweDYKLSNkZWZpbmUgVEFCTEFfT0NQXzIyMF9NQSAweDcKLQotI2RlZmluZSBUQUJMQV9EQ1lDTEVfMjU1ICAweDAKLSNkZWZpbmUgVEFCTEFfRENZQ0xFXzUxMSAgMHgxCi0jZGVmaW5lIFRBQkxBX0RDWUNMRV83NjcgIDB4MgotI2RlZmluZSBUQUJMQV9EQ1lDTEVfMTAyMyAweDMKLSNkZWZpbmUgVEFCTEFfRENZQ0xFXzEyNzkgMHg0Ci0jZGVmaW5lIFRBQkxBX0RDWUNMRV8xNTM1IDB4NQotI2RlZmluZSBUQUJMQV9EQ1lDTEVfMTc5MSAweDYKLSNkZWZpbmUgVEFCTEFfRENZQ0xFXzIwNDcgMHg3Ci0jZGVmaW5lIFRBQkxBX0RDWUNMRV8yMzAzIDB4OAotI2RlZmluZSBUQUJMQV9EQ1lDTEVfMjU1OSAweDkKLSNkZWZpbmUgVEFCTEFfRENZQ0xFXzI4MTUgMHhBCi0jZGVmaW5lIFRBQkxBX0RDWUNMRV8zMDcxIDB4QgotI2RlZmluZSBUQUJMQV9EQ1lDTEVfMzMyNyAweEMKLSNkZWZpbmUgVEFCTEFfRENZQ0xFXzM1ODMgMHhECi0jZGVmaW5lIFRBQkxBX0RDWUNMRV8zODM5IDB4RQotI2RlZmluZSBUQUJMQV9EQ1lDTEVfNDA5NSAweEYKLQotI2RlZmluZSBXQ0Q5WFhYX01DTEtfQ0xLXzEyUDI4OE1IWiAxMjI4ODAwMAotI2RlZmluZSBXQ0Q5WFhYX01DTEtfQ0xLXzlQNkhaIDk2MDAwMDAKLQotLyogT25seSB2YWxpZCBmb3IgOS42IE1IeiBtY2xrICovCi0jZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV82MDBLSFogNjAwMDAwCi0jZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV8yUDRNSFogMjQwMDAwMAotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfM1AyTUhaIDMyMDAwMDAKLSNkZWZpbmUgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQOE1IWiA0ODAwMDAwCi0KLS8qIE9ubHkgdmFsaWQgZm9yIDEyLjI4OCBNSHogbWNsayAqLwotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNzY4S0haIDc2ODAwMAotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfMlAwNDhNSFogMjA0ODAwMAotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfM1AwNzJNSFogMzA3MjAwMAotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNFAwOTZNSFogNDA5NjAwMAotI2RlZmluZSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNlAxNDRNSFogNjE0NDAwMAotCi0jZGVmaW5lIFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV9VTkRFRklORUQgMAotCi0jZGVmaW5lIFdDRDlYWFhfRE1JQ19DTEtfRFJJVkVfVU5ERUZJTkVEIDAKLQotc3RydWN0IHdjZDl4eHhfYW1pYyB7Ci0JLypsZWdhY3kgbW9kZSwgdHhmZV9lbmFibGUgYW5kIHR4ZmVfYnVmZiB0YWtlIDcgaW5wdXQKLQkgKiBlYWNoIGJpdCByZXByZXNlbnQgdGhlIGNoYW5uZWwgLyBUWEZFIG51bWJlcgotCSAqIGFuZCBudW1iZXJlZCBhcyBiZWxvdwotCSAqIGJpdCAwID0gY2hhbm5lbCAxIC8gVFhGRTFfRU5BQkxFIC8gVFhGRTFfQlVGRgotCSAqIGJpdCAxID0gY2hhbm5lbCAyIC8gVFhGRTJfRU5BQkxFIC8gVFhGRTJfQlVGRgotCSAqIC4uLgotCSAqIGJpdCA3ID0gY2hhbm5lbCA3IC8gVFhGRTdfRU5BQkxFIC8gVFhGRTdfQlVGRgotCSAqLwotCXU4IGxlZ2FjeV9tb2RlOk1BWF9BTUlDX0NIQU5ORUw7Ci0JdTggdHhmZV9lbmFibGU6TUFYX0FNSUNfQ0hBTk5FTDsKLQl1OCB0eGZlX2J1ZmY6TUFYX0FNSUNfQ0hBTk5FTDsKLQl1OCB1c2VfcGRhdGE6TUFYX0FNSUNfQ0hBTk5FTDsKLX07Ci0KLS8qIEVhY2ggbWljYmlhcyBjYW4gYmUgYXNzaWduZWQgdG8gb25lIG9mIHRocmVlIGNmaWx0ZXJzCi0gKiBWYmF0dF9taW4gPj0gLjE1ViArIGxkb2hfdgotICogbGRvaF92ID49IC4xNXYgKyBjZmlsdHhfbXYKLSAqIElmIGxkb2hfdiA9IDEuOTUgMTYwIG12IDwgY2ZpbHR4X212IDwgMTgwMCBtdgotICogSWYgbGRvaF92ID0gMi4zNSAyMDAgbXYgPCBjZmlsdHhfbXYgPCAyMjAwIG12Ci0gKiBJZiBsZG9oX3YgPSAyLjc1IDI0MCBtdiA8IGNmaWx0eF9tdiA8IDI2MDAgbXYKLSAqIElmIGxkb2hfdiA9IDIuODUgMjUwIG12IDwgY2ZpbHR4X212IDwgMjcwMCBtdgotICovCi0KLXN0cnVjdCB3Y2Q5eHh4X21pY2JpYXNfc2V0dGluZyB7Ci0JdTggbGRvaF92OwotCXUzMiBjZmlsdDFfbXY7IC8qIGluIG12ICovCi0JdTMyIGNmaWx0Ml9tdjsgLyogaW4gbXYgKi8KLQl1MzIgY2ZpbHQzX212OyAvKiBpbiBtdiAqLwotCXUzMiBtaWNiMV9tdjsKLQl1MzIgbWljYjJfbXY7Ci0JdTMyIG1pY2IzX212OwotCXUzMiBtaWNiNF9tdjsKLQkvKiBEaWZmZXJlbnQgV0NEOXh4eCBzZXJpZXMgY29kZWNzIG1heSBub3QKLQkgKiBoYXZlIDQgbWljIGJpYXNlcy4gSWYgYSBjb2RlYyBoYXMgZmV3ZXIKLQkgKiBtaWMgYmlhc2VzLCBzb21lIG9mIHRoZXNlIHByb3BlcnRpZXMgd2lsbAotCSAqIG5vdCBiZSB1c2VkLgotCSAqLwotCXU4IGJpYXMxX2NmaWx0X3NlbDsKLQl1OCBiaWFzMl9jZmlsdF9zZWw7Ci0JdTggYmlhczNfY2ZpbHRfc2VsOwotCXU4IGJpYXM0X2NmaWx0X3NlbDsKLQl1OCBiaWFzMV9jYXBfbW9kZTsKLQl1OCBiaWFzMl9jYXBfbW9kZTsKLQl1OCBiaWFzM19jYXBfbW9kZTsKLQl1OCBiaWFzNF9jYXBfbW9kZTsKLQlib29sIGJpYXMyX2lzX2hlYWRzZXRfb25seTsKLX07Ci0KLXN0cnVjdCB3Y2Q5eHh4X29jcF9zZXR0aW5nIHsKLQl1bnNpZ25lZCBpbnQJdXNlX3BkYXRhOjE7IC8qIDAgLSB1c2Ugc3lzIGRlZmF1bHQgYXMgcmVjb21tZW5kZWQgKi8KLQl1bnNpZ25lZCBpbnQJbnVtX2F0dGVtcHRzOjQ7IC8qIHVwIHRvIDE1IGF0dGVtcHRzICovCi0JdW5zaWduZWQgaW50CXJ1bl90aW1lOjQ7IC8qIGluIGR1dHkgY3ljbGUgKi8KLQl1bnNpZ25lZCBpbnQJd2FpdF90aW1lOjQ7IC8qIGluIGR1dHkgY3ljbGUgKi8KLQl1bnNpZ25lZCBpbnQJaHBoX29jcF9saW1pdDozOyAvKiBIZWFkcGhvbmUgT0NQIGN1cnJlbnQgbGltaXQgKi8KLX07Ci0KLSNkZWZpbmUgV0NEOVhYWF9NQVhfUkVHVUxBVE9SCTkKLS8qCi0gKiAgICAgIGZvcm1hdCA6IFRBQkxBXzxQT1dFUl9TVVBQTFlfUElOX05BTUU+X0NVUl9NQVgKLSAqCi0gKiAgICAgIDxQT1dFUl9TVVBQTFlfUElOX05BTUU+IGZyb20gVGFibGEgb2JqZWN0aXZlIHNwZWMKLSAqLwotCi0jZGVmaW5lICBXQ0Q5WFhYX0NEQ19WRERBX0NQX0NVUl9NQVggICAgICA1MDAwMDAKLSNkZWZpbmUgIFdDRDlYWFhfQ0RDX1ZEREFfUlhfQ1VSX01BWCAgICAgIDIwMDAwCi0jZGVmaW5lICBXQ0Q5WFhYX0NEQ19WRERBX1RYX0NVUl9NQVggICAgICAyMDAwMAotI2RlZmluZSAgV0NEOVhYWF9WRERJT19DRENfQ1VSX01BWCAgICAgICAgNTAwMAotCi0jZGVmaW5lICBXQ0Q5WFhYX1ZERERfQ0RDX0RfQ1VSX01BWCAgICAgICA1MDAwCi0jZGVmaW5lICBXQ0Q5WFhYX1ZERERfQ0RDX0FfQ1VSX01BWCAgICAgICA1MDAwCi0KLSNkZWZpbmUgV0NEOVhYWF9WRERfU1BLRFJWX05BTUUgImNkYy12ZGQtc3BrZHJ2IgotI2RlZmluZSBXQ0Q5WFhYX1ZERF9TUEtEUlYyX05BTUUgImNkYy12ZGQtc3BrZHJ2LTIiCi0KLXN0cnVjdCB3Y2Q5eHh4X3JlZ3VsYXRvciB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgbWluX3VWOwotCWludCBtYXhfdVY7Ci0JaW50IG9wdGltdW1fdUE7Ci0JYm9vbCBvbmRlbWFuZDsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7Ci19OwotCi1zdHJ1Y3Qgd2NkOXh4eF9wZGF0YSB7Ci0JaW50IGlycTsKLQlpbnQgaXJxX2Jhc2U7Ci0JaW50IG51bV9pcnFzOwotCWludCByZXNldF9ncGlvOwotCWJvb2wgaGFzX2J1Y2tfdnNlbF9ncGlvOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVja192c2VsX2N0bF9ucDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKndjZF9yc3RfbnA7Ci0Jc3RydWN0IHdjZDl4eHhfYW1pYyBhbWljX3NldHRpbmdzOwotCXN0cnVjdCBzbGltX2RldmljZSBzbGltYnVzX3NsYXZlX2RldmljZTsKLQlzdHJ1Y3Qgd2NkOXh4eF9taWNiaWFzX3NldHRpbmcgbWljYmlhczsKLQlzdHJ1Y3Qgd2NkOXh4eF9vY3Bfc2V0dGluZyBvY3A7Ci0Jc3RydWN0IGNkY19yZWd1bGF0b3IgKnJlZ3VsYXRvcjsKLQlpbnQgbnVtX3N1cHBsaWVzOwotCXUzMiBtY2xrX3JhdGU7Ci0JdTMyIGRtaWNfc2FtcGxlX3JhdGU7Ci0JdTMyIG1hZF9kbWljX3NhbXBsZV9yYXRlOwotCXUzMiBlY3BwX2RtaWNfc2FtcGxlX3JhdGU7Ci0JdTMyIGRtaWNfY2xrX2RydjsKLQl1MTYgdXNlX3BpbmN0cmw7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC1pcnEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljZTYwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0KLSNpZm5kZWYgX19NRkRfV0NEOVhYWF9JUlFfSAotI2RlZmluZSBfX01GRF9XQ0Q5WFhYX0lSUV9ICi1ib29sIHdjZDl4eHhfbG9ja19zbGVlcChzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7Ci12b2lkIHdjZDl4eHhfdW5sb2NrX3NsZWVwKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKLXZvaWQgd2NkOXh4eF9uZXN0ZWRfaXJxX2xvY2soc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMpOwotdm9pZCB3Y2Q5eHh4X25lc3RlZF9pcnFfdW5sb2NrKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKLWludCB3Y2Q5eHh4X3JlcXVlc3RfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLCBpbnQgaXJxLAotCQkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkYXRhKTsKLQotdm9pZCB3Y2Q5eHh4X2ZyZWVfaXJxKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAotCQkJaW50IGlycSwgdm9pZCAqZGF0YSk7Ci12b2lkIHdjZDl4eHhfZW5hYmxlX2lycShzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3JlcywgaW50IGlycSk7Ci12b2lkIHdjZDl4eHhfZGlzYWJsZV9pcnEoc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqd2NkOXh4eF9yZXMsCi0JCQlpbnQgaXJxKTsKLXZvaWQgd2NkOXh4eF9kaXNhYmxlX2lycV9zeW5jKHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzLAotCQkJaW50IGlycSk7Ci0KLWludCB3Y2Q5eHh4X2lycV9pbml0KHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKndjZDl4eHhfcmVzKTsKLXZvaWQgd2NkOXh4eF9pcnFfZXhpdChzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICp3Y2Q5eHh4X3Jlcyk7Ci1pbnQgd2NkOXh4eF9pcnFfZHJ2X2luaXQodm9pZCk7Ci12b2lkIHdjZDl4eHhfaXJxX2Rydl9leGl0KHZvaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmRiMDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXNsaW1zbGF2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19XQ0Q5MzEwX1NMSU1TTEFWRV9IXwotI2RlZmluZSBfX1dDRDkzMTBfU0xJTVNMQVZFX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9zbGltYnVzL3NsaW1idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0KLQotLyoKLSAqICBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gZ2l2ZSBwb3J0IGlkcyBpbiB0aGUgcmFuZ2Ugb2YKLSAqICAxLTEwIGZvciBwcmUgVGFpa28gVHggcG9ydHMgYW5kIDEtMTYgZm9yIFRhaWtvCi0gKiAgMS03IGZvciBwcmUgVGFpa28gUnggcG9ydHMgYW5kIDEtMTYgZm9yIFRha28sCi0gKiAgd2UgbmVlZCB0byBhZGQgb2Zmc2V0IGZvciBnZXR0aW5nIHRoZSBhYnNvbHV0ZSBzbGF2ZQotICogIHBvcnQgaWQgYmVmb3JlIGNvbmZpZ3VyaW5nIHRoZSBIVwotICovCi0jZGVmaW5lIFRBQkxBX1NCX1BHRF9NQVhfTlVNQkVSX09GX1RYX1NMQVZFX0RFVl9QT1JUUyAxMAotI2RlZmluZSBUQUlLT19TQl9QR0RfTUFYX05VTUJFUl9PRl9UWF9TTEFWRV9ERVZfUE9SVFMgMTYKLQotI2RlZmluZSBTTElNX01BWF9UWF9QT1JUUyBUQUlLT19TQl9QR0RfTUFYX05VTUJFUl9PRl9UWF9TTEFWRV9ERVZfUE9SVFMKLQotI2RlZmluZSBUQUJMQV9TQl9QR0RfT0ZGU0VUX09GX1JYX1NMQVZFX0RFVl9QT1JUUyBcCi0JVEFCTEFfU0JfUEdEX01BWF9OVU1CRVJfT0ZfVFhfU0xBVkVfREVWX1BPUlRTCi0jZGVmaW5lIFRBSUtPX1NCX1BHRF9PRkZTRVRfT0ZfUlhfU0xBVkVfREVWX1BPUlRTIFwKLQlUQUlLT19TQl9QR0RfTUFYX05VTUJFUl9PRl9UWF9TTEFWRV9ERVZfUE9SVFMKLQotI2RlZmluZSBUQUJMQV9TQl9QR0RfTUFYX05VTUJFUl9PRl9SWF9TTEFWRV9ERVZfUE9SVFMgNwotI2RlZmluZSBUQUlLT19TQl9QR0RfTUFYX05VTUJFUl9PRl9SWF9TTEFWRV9ERVZfUE9SVFMgMTMKLQotI2RlZmluZSBTTElNX01BWF9SWF9QT1JUUyBUQUlLT19TQl9QR0RfTUFYX05VTUJFUl9PRl9SWF9TTEFWRV9ERVZfUE9SVFMKLQotI2RlZmluZSBTTElNX01BWF9SRUdfQUREUiAoMHgxODAgKyA0ICogKFNMSU1fTUFYX1JYX1BPUlRTKSkKLQotI2RlZmluZSBUQUJMQV9TQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzBfU1RBUlRfUE9SVF9JRCBcCi0JVEFCTEFfU0JfUEdEX09GRlNFVF9PRl9SWF9TTEFWRV9ERVZfUE9SVFMKLSNkZWZpbmUgVEFJS09fU0JfUEdEX1JYX1BPUlRfTVVMVElfQ0hBTk5FTF8wX1NUQVJUX1BPUlRfSUQgXAotCVRBSUtPX1NCX1BHRF9PRkZTRVRfT0ZfUlhfU0xBVkVfREVWX1BPUlRTCi0KLSNkZWZpbmUgVEFCTEFfU0JfUEdEX1JYX1BPUlRfTVVMVElfQ0hBTk5FTF8wX0VORF9QT1JUX0lEIDE2Ci0jZGVmaW5lIFRBSUtPX1NCX1BHRF9SWF9QT1JUX01VTFRJX0NIQU5ORUxfMF9FTkRfUE9SVF9JRCAzMQotCi0jZGVmaW5lIFRBQkxBX1NCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMV9FTkRfUE9SVF9JRCA5Ci0jZGVmaW5lIFRBSUtPX1NCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMV9FTkRfUE9SVF9JRCAxNQotCi0vKiBiZWxvdyBkZXRhaWxzIGFyZSB0YWtlbiBmcm9tIFNMSU1CVVMgc2xhdmUgU1dJICovCi0jZGVmaW5lIFNCX1BHRF9QT1JUX0JBU0UgMHgwMDAKLQotI2RlZmluZSBTQl9QR0RfUE9SVF9DRkdfQllURV9BRERSKG9mZnNldCwgcG9ydF9udW0pIFwKLQkJKFNCX1BHRF9QT1JUX0JBU0UgKyBvZmZzZXQgKyAoMSAqIHBvcnRfbnVtKSkKLQotI2RlZmluZSBTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzAocG9ydF9udW0pIFwKLQkJKFNCX1BHRF9QT1JUX0JBU0UgKyAweDEwMCArIDQqcG9ydF9udW0pCi0jZGVmaW5lIFNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMF9TVEFSVF9QT1JUX0lEICAgMAotI2RlZmluZSBTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzBfRU5EX1BPUlRfSUQgICAgIDcKLQotI2RlZmluZSBTQl9QR0RfVFhfUE9SVF9NVUxUSV9DSEFOTkVMXzEocG9ydF9udW0pIFwKLQkJKFNCX1BHRF9QT1JUX0JBU0UgKyAweDEwMSArIDQqcG9ydF9udW0pCi0jZGVmaW5lIFNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMV9TVEFSVF9QT1JUX0lEICAgOAotCi0jZGVmaW5lIFNCX1BHRF9SWF9QT1JUX01VTFRJX0NIQU5ORUxfMChvZmZzZXQsIHBvcnRfbnVtKSBcCi0JCShTQl9QR0RfUE9SVF9CQVNFICsgb2Zmc2V0ICsgKDQgKiBwb3J0X251bSkpCi0KLS8qIHNsYXZlIHBvcnQgd2F0ZXIgbWFyayBsZXZlbAotICogICAoMDogNmJ5dGVzLCAxOiA5Ynl0ZXMsIDI6IDEyIGJ5dGVzLCAzOiAxNSBieXRlcykKLSAqLwotI2RlZmluZSBTTEFWRV9QT1JUX1dBVEVSX01BUktfNkJZVEVTICAwCi0jZGVmaW5lIFNMQVZFX1BPUlRfV0FURVJfTUFSS185QllURVMgIDEKLSNkZWZpbmUgU0xBVkVfUE9SVF9XQVRFUl9NQVJLXzEyQllURVMgMgotI2RlZmluZSBTTEFWRV9QT1JUX1dBVEVSX01BUktfMTVCWVRFUyAzCi0jZGVmaW5lIFNMQVZFX1BPUlRfV0FURVJfTUFSS19TSElGVCAxCi0jZGVmaW5lIFNMQVZFX1BPUlRfRU5BQkxFICAgICAgICAgICAxCi0jZGVmaW5lIFNMQVZFX1BPUlRfRElTQUJMRSAgICAgICAgICAwCi0jZGVmaW5lIFdBVEVSX01BUktfVkFMIFwKLQkoKFNMQVZFX1BPUlRfV0FURVJfTUFSS18xMkJZVEVTIDw8IFNMQVZFX1BPUlRfV0FURVJfTUFSS19TSElGVCkgfCBcCi0JIChTTEFWRV9QT1JUX0VOQUJMRSkpCi0jZGVmaW5lIEJBU0VfQ0hfTlVNIDEyOAotCi0KLWludCB3Y2Q5eHh4X2luaXRfc2xpbXNsYXZlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgdTggd2NkOXh4eF9wZ2RfbGEsCi0JCQkgICB1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCi0JCQkgICB1bnNpZ25lZCBpbnQgcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpOwotCi1pbnQgd2NkOXh4eF9kZWluaXRfc2xpbXNsYXZlKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4KTsKLQotaW50IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3J4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGJpdF93aWR0aCwKLQkJCSAgICB1MTYgKmdycGgpOwotaW50IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSwgdW5zaWduZWQgaW50IGJpdF93aWR0aCwKLQkJCQl1MTYgKmdycGgpOwotaW50IHdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfcngoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp3Y2Q5eHh4X2NoX2xpc3QsIHUxNiBncnBoKTsKLWludCB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqd2NkOXh4eF9jaF9saXN0LCB1MTYgZ3JwaCk7Ci1pbnQgd2NkOXh4eF9nZXRfY2hhbm5lbChzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCwKLQkJCXVuc2lnbmVkIGludCAqcnhfY2gsCi0JCQl1bnNpZ25lZCBpbnQgKnR4X2NoKTsKLWludCB3Y2Q5eHh4X2dldF9zbGF2ZV9wb3J0KHVuc2lnbmVkIGludCBjaF9udW0pOwotaW50IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKndjZDl4eHhfY2hfbGlzdCwgdTE2IGdycGgpOwotaW50IHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbih1MzIgcG9ydF9pZCwKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpjb2RlY19kYWlfbGlzdCk7Ci1pbnQgd2NkOXh4eF90eF92cG9ydF92YWxpZGF0aW9uKHUzMiB2dGFibGUsIHUzMiBwb3J0X2lkLAotCQkJCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpjb2RlY19kYWksCi0JCQkJdTMyIG51bV9jb2RlY19kYWlzKTsKLSNlbmRpZiAvKiBfX1dDRDkzMTBfU0xJTVNMQVZFX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtdXRpbHMuaCBiL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC11dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEzZGQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3djZDl4eHgvd2NkOXh4eC11dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1dDRDlYWFhfVVRJTFNfSF9fCi0jZGVmaW5lIF9fV0NEOVhYWF9VVElMU19IX18KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3BkYXRhLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotCi1zdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqd2NkOXh4eF9wb3B1bGF0ZV9kdF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1pbnQgd2NkOXh4eF9icmluZ3VwKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1pbnQgd2NkOXh4eF9icmluZ2Rvd24oc3RydWN0IGRldmljZSAqZGV2KTsKLXN0cnVjdCByZWdtYXAgKndjZDl4eHhfcmVnbWFwX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwotaW50IHdjZDl4eHhfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KTsKLWludCB3Y2Q5eHh4X3Jlc2V0X2xvdyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwotaW50IHdjZDl4eHhfZ2V0X2NvZGVjX2luZm8oc3RydWN0IGRldmljZSAqZGV2KTsKLQotdHlwZWRlZiBpbnQgKCpjb2RlY19icmluZ3VwX2ZuKShzdHJ1Y3Qgd2NkOXh4eCAqKTsKLXR5cGVkZWYgaW50ICgqY29kZWNfYnJpbmdkb3duX2ZuKShzdHJ1Y3Qgd2NkOXh4eCAqKTsKLXR5cGVkZWYgaW50ICgqY29kZWNfdHlwZV9mbikoc3RydWN0IHdjZDl4eHggKiwKLQkJCSAgICAgc3RydWN0IHdjZDl4eHhfY29kZWNfdHlwZSAqKTsKLQotY29kZWNfYnJpbmdkb3duX2ZuIHdjZDl4eHhfYnJpbmdkb3duX2ZuKGludCB0eXBlKTsKLWNvZGVjX2JyaW5ndXBfZm4gd2NkOXh4eF9icmluZ3VwX2ZuKGludCB0eXBlKTsKLWNvZGVjX3R5cGVfZm4gd2NkOXh4eF9nZXRfY29kZWNfaW5mb19mbihpbnQgdHlwZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCmluZGV4IGM5ZjM3OTYuLjgwZmFmNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKQEAgLTEzODQsNiArMTM4NCw4IEBACiBpbnQgZ2V0X3Bodl9iaXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCAqcGh2KTsKIGludCBtbHg0X2dldF9pc192bGFuX29mZmxvYWRfZGlzYWJsZWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCiAJCQkJICAgICAgYm9vbCAqdmxhbl9vZmZsb2FkX2Rpc2FibGVkKTsKK3ZvaWQgbWx4NF9oYW5kbGVfZXRoX2hlYWRlcl9tY2FzdF9wcmlvKHN0cnVjdCBtbHg0X25ldF90cmFuc19ydWxlX2h3X2N0cmwgKmN0cmwsCisJCQkJICAgICAgIHN0cnVjdCBfcnVsZV9odyAqZXRoX2hlYWRlcik7CiBpbnQgbWx4NF9maW5kX2NhY2hlZF9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMsIGludCAqaWR4KTsKIGludCBtbHg0X2ZpbmRfY2FjaGVkX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUxNiB2aWQsIGludCAqaWR4KTsKIGludCBtbHg0X3JlZ2lzdGVyX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUxNiB2bGFuLCBpbnQgKmluZGV4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAppbmRleCAzMTM5ZWE0Li41OTQyNDc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCkBAIC01MTUsNiArNTE1LDEwIEBACiAJICovCiAJYm9vbCB0bGJfZmx1c2hfcGVuZGluZzsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX1dBTlRfQkFUQ0hFRF9VTk1BUF9UTEJfRkxVU0gKKwkvKiBTZWUgZmx1c2hfdGxiX2JhdGNoZWRfcGVuZGluZygpICovCisJYm9vbCB0bGJfZmx1c2hfYmF0Y2hlZDsKKyNlbmRpZgogCXN0cnVjdCB1cHJvYmVzX3N0YXRlIHVwcm9iZXNfc3RhdGU7CiAjaWZkZWYgQ09ORklHX1g4Nl9JTlRFTF9NUFgKIAkvKiBhZGRyZXNzIG9mIHRoZSBib3VuZHMgZGlyZWN0b3J5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKaW5kZXggZjIxNGIwYy4uMWUwN2VkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaApAQCAtMjI2LDYgKzIyNiw3IEBACiAJdW5zaWduZWQgaW50CQlyZXNwX2FyZzsKIAl1bnNpZ25lZCBpbnQJCWRldl9wZW5kX3Rhc2tzOwogCWJvb2wJCQlyZXNwX2VycjsKKwlib29sCQkJc2tpcF9lcnJfaGFuZGxpbmc7CiAJaW50CQkJdGFnOyAvKiB1c2VkIGZvciBjb21tYW5kIHF1ZXVpbmcgKi8KIAl1OAkJCWN0eF9pZDsKIH07CkBAIC01NDMsNiArNTQ0LDcgQEAKIAl1bnNpZ25lZCBpbnQJCWJ1c19yZXN1bWVfZmxhZ3M7CiAjZGVmaW5lIE1NQ19CVVNSRVNVTUVfTUFOVUFMX1JFU1VNRQkoMSA8PCAwKQogI2RlZmluZSBNTUNfQlVTUkVTVU1FX05FRURTX1JFU1VNRQkoMSA8PCAxKQorCWJvb2wgaWdub3JlX2J1c19yZXN1bWVfZmxhZ3M7CiAKIAl1bnNpZ25lZCBpbnQJCXNkaW9faXJxczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnNkaW9faXJxX3RocmVhZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IGVkMDA5OWM5Li4wN2UxYWNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTE1OCw3ICsxNTgsNiBAQAogCU5SX1VORVZJQ1RBQkxFLAkJLyogICIgICAgICIgICAgICIgICAiICAgICAgICIgICAgICAgICAqLwogCU5SX0lTT0xBVEVEX0FOT04sCS8qIFRlbXBvcmFyeSBpc29sYXRlZCBwYWdlcyBmcm9tIGFub24gbHJ1ICovCiAJTlJfSVNPTEFURURfRklMRSwJLyogVGVtcG9yYXJ5IGlzb2xhdGVkIHBhZ2VzIGZyb20gZmlsZSBscnUgKi8KLQlOUl9QQUdFU19TQ0FOTkVELAkvKiBwYWdlcyBzY2FubmVkIHNpbmNlIGxhc3QgcmVjbGFpbSAqLwogCVdPUktJTkdTRVRfUkVGQVVMVCwKIAlXT1JLSU5HU0VUX0FDVElWQVRFLAogCVdPUktJTkdTRVRfTk9ERVJFQ0xBSU0sCkBAIC02NDUsNiArNjQ0LDggQEAKIAlpbnQga3N3YXBkX29yZGVyOwogCWVudW0gem9uZV90eXBlIGtzd2FwZF9jbGFzc3pvbmVfaWR4OwogCisJaW50IGtzd2FwZF9mYWlsdXJlczsJCS8qIE51bWJlciBvZiAncmVjbGFpbWVkID09IDAnIHJ1bnMgKi8KKwogI2lmZGVmIENPTkZJR19DT01QQUNUSU9OCiAJaW50IGtjb21wYWN0ZF9tYXhfb3JkZXI7CiAJZW51bSB6b25lX3R5cGUga2NvbXBhY3RkX2NsYXNzem9uZV9pZHg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zbS1idXMuaCBiL2luY2x1ZGUvbGludXgvbXNtLWJ1cy5oCmluZGV4IGMyOTg2NjYuLmE1ODRlMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXNtLWJ1cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNtLWJ1cy5oCkBAIC0xMzAsNiArMTMwLDggQEAKIAkJCQkJdWludDMyX3QgY2wsIHVuc2lnbmVkIGludCBpbmRleCk7CiBpbnQgbXNtX2J1c19zY2FsZV9xdWVyeV90Y3NfY21kX2FsbChzdHJ1Y3QgbXNtX2J1c190Y3NfaGFuZGxlICp0Y3NfaGFuZGxlLAogCQkJCQl1aW50MzJfdCBjbCk7CitpbnQgbXNtX2J1c19ub2NfdGhyb3R0bGVfd2EoYm9vbCBlbmFibGUpOworaW50IG1zbV9idXNfbm9jX3ByaW9yaXR5X3dhKGJvb2wgZW5hYmxlKTsKIAogLyogQVhJIFBvcnQgY29uZmlndXJhdGlvbiBBUElzICovCiBpbnQgbXNtX2J1c19heGlfcG9ydGhhbHQoaW50IG1hc3Rlcl9wb3J0KTsKQEAgLTIxMSw2ICsyMTMsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbXNtX2J1c19ub2NfdGhyb3R0bGVfd2EoYm9vbCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9idXNfbm9jX3ByaW9yaXR5X3dhKGJvb2wgZW5hYmxlKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX09GKSAmJiBkZWZpbmVkKENPTkZJR19RQ09NX0JVU19TQ0FMSU5HKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tc21fYXVkaW9faW9uLmggYi9pbmNsdWRlL2xpbnV4L21zbV9hdWRpb19pb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2MWI4OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21zbV9hdWRpb19pb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9NU01fQVVESU9fSU9OX0gKLSNkZWZpbmUgX0xJTlVYX01TTV9BVURJT19JT05fSAotI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0KLWludCBtc21fYXVkaW9faW9uX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpb25fY2xpZW50ICoqY2xpZW50LAotCQkJc3RydWN0IGlvbl9oYW5kbGUgKipoYW5kbGUsIHNpemVfdCBidWZzeiwKLQkJCWlvbl9waHlzX2FkZHJfdCAqcGFkZHIsIHNpemVfdCAqcGFfbGVuLCB2b2lkICoqdmFkZHIpOwotCi1pbnQgbXNtX2F1ZGlvX2lvbl9pbXBvcnQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGlvbl9jbGllbnQgKipjbGllbnQsCi0JCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmhhbmRsZSwgaW50IGZkLAotCQkJdW5zaWduZWQgbG9uZyAqaW9uZmxhZywgc2l6ZV90IGJ1ZnN6LAotCQkJaW9uX3BoeXNfYWRkcl90ICpwYWRkciwgc2l6ZV90ICpwYV9sZW4sIHZvaWQgKip2YWRkcik7Ci1pbnQgbXNtX2F1ZGlvX2lvbl9mcmVlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOwotaW50IG1zbV9hdWRpb19pb25fbW1hcChzdHJ1Y3QgYXVkaW9fYnVmZmVyICpzdWJzdHJlYW0sCi0JCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KLWJvb2wgbXNtX2F1ZGlvX2lvbl9pc19zbW11X2F2YWlsYWJsZSh2b2lkKTsKLWludCBtc21fYXVkaW9faW9uX2NhY2hlX29wZXJhdGlvbnMoc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWJ1ZmYsIGludCBjYWNoZV9vcCk7Ci0KLXN0cnVjdCBpb25fY2xpZW50ICptc21fYXVkaW9faW9uX2NsaWVudF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkIG1zbV9hdWRpb19pb25fY2xpZW50X2Rlc3Ryb3koc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCk7Ci1pbnQgbXNtX2F1ZGlvX2lvbl9pbXBvcnRfbGVnYWN5KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqKmhhbmRsZSwgaW50IGZkLAotCQkJdW5zaWduZWQgbG9uZyAqaW9uZmxhZywgc2l6ZV90IGJ1ZnN6LAotCQkJaW9uX3BoeXNfYWRkcl90ICpwYWRkciwgc2l6ZV90ICpwYV9sZW4sIHZvaWQgKip2YWRkcik7Ci1pbnQgbXNtX2F1ZGlvX2lvbl9mcmVlX2xlZ2FjeShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7Ci11MzIgbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoaW9uX3BoeXNfYWRkcl90IHBhKTsKLSNlbmRpZiAvKiBfTElOVVhfTVNNX0FVRElPX0lPTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCBkOTJkOWE2Li4yNjY0NzFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTM5MDUsNiArMzkwNSw4IEBACiAJICAgICB1cGRldjsgXAogCSAgICAgdXBkZXYgPSBuZXRkZXZfYWxsX3VwcGVyX2dldF9uZXh0X2Rldl9yY3UoZGV2LCAmKGl0ZXIpKSkKIAorYm9vbCBuZXRkZXZfaGFzX2FueV91cHBlcl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKIHZvaWQgKm5ldGRldl9sb3dlcl9nZXRfbmV4dF9wcml2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKippdGVyKTsKIHZvaWQgKm5ldGRldl9sb3dlcl9nZXRfbmV4dF9wcml2YXRlX3JjdShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCBiZWIxZTEwLi4zYmY4NjdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTE5OSw3ICsxMTk5LDcgQEAKIAogc3RydWN0IG5mczQxX2V4Y2hhbmdlX2lkX2FyZ3MgewogCXN0cnVjdCBuZnNfY2xpZW50CQkqY2xpZW50OwotCW5mczRfdmVyaWZpZXIJCQkqdmVyaWZpZXI7CisJbmZzNF92ZXJpZmllcgkJCXZlcmlmaWVyOwogCXUzMgkJCQlmbGFnczsKIAlzdHJ1Y3QgbmZzNDFfc3RhdGVfcHJvdGVjdGlvbglzdGF0ZV9wcm90ZWN0OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbm1pLmggYi9pbmNsdWRlL2xpbnV4L25taS5oCmluZGV4IDNjYTI1MjYuLjQ0NDNhMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbm1pLmgKKysrIGIvaW5jbHVkZS9saW51eC9ubWkuaApAQCAtMjQsNiArMjQsOSBAQAogI2RlZmluZSBOTUlfV0FUQ0hET0dfRU5BQkxFRCAgICAgICgxIDw8IE5NSV9XQVRDSERPR19FTkFCTEVEX0JJVCkKICNkZWZpbmUgU09GVF9XQVRDSERPR19FTkFCTEVEICAgICAoMSA8PCBTT0ZUX1dBVENIRE9HX0VOQUJMRURfQklUKQogCitERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaHJ0aW1lcl9pbnRlcnJ1cHRzKTsKK0RFQ0xBUkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBocnRpbWVyX2ludGVycnVwdHNfc2F2ZWQpOworCiAvKioKICAqIHRvdWNoX25taV93YXRjaGRvZyAtIHJlc3RhcnQgTk1JIHdhdGNoZG9nIHRpbWVvdXQuCiAgKgpAQCAtMzEsOCArMzQsMTEgQEAKICAqIG1heSBiZSB1c2VkIHRvIHJlc2V0IHRoZSB0aW1lb3V0IC0gZm9yIGNvZGUgd2hpY2ggaW50ZW50aW9uYWxseQogICogZGlzYWJsZXMgaW50ZXJydXB0cyBmb3IgYSBsb25nIHRpbWUuIFRoaXMgY2FsbCBpcyBzdGF0ZWxlc3MuCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19IQVZFX05NSV9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUikKKyNpZiBkZWZpbmVkKENPTkZJR19IQVZFX05NSV9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUl9OTUkpCiAjaW5jbHVkZSA8YXNtL25taS5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19IQVZFX05NSV9XQVRDSERPRykgfHwgZGVmaW5lZChDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUikKIGV4dGVybiB2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nKHZvaWQpCkBAIC0xMzAsNiArMTM2LDcgQEAKICNkZWZpbmUgc3lzY3RsX3NvZnRsb2NrdXBfYWxsX2NwdV9iYWNrdHJhY2UgMAogI2RlZmluZSBzeXNjdGxfaGFyZGxvY2t1cF9hbGxfY3B1X2JhY2t0cmFjZSAwCiAjZW5kaWYKKwogZXh0ZXJuIGJvb2wgaXNfaGFyZGxvY2t1cCh2b2lkKTsKIHN0cnVjdCBjdGxfdGFibGU7CiBleHRlcm4gaW50IHByb2Nfd2F0Y2hkb2coc3RydWN0IGN0bF90YWJsZSAqLCBpbnQgLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vb20uaCBiL2luY2x1ZGUvbGludXgvb29tLmgKaW5kZXggYjk4Njg0MC4uNWI1ZDRjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L29vbS5oCkBAIC04Miw2ICs4Miw4IEBACiBleHRlcm4gdm9pZCBkdW1wX3Rhc2tzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKIAkJY29uc3Qgbm9kZW1hc2tfdCAqbm9kZW1hc2spOwogCitleHRlcm4gdm9pZCB3YWtlX29vbV9yZWFwZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCiAvKiBzeXNjdGxzICovCiBleHRlcm4gaW50IHN5c2N0bF9vb21fZHVtcF90YXNrczsKIGV4dGVybiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggM2U1ZGJiZS4uNDMwODIwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTU3NCw2ICs1NzQsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfRUhDICAgIDB4MjA5NQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfVURDICAgIDB4MjA5NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfVU9DICAgIDB4MjA5NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfREVWX0lERSAgICAweDIwOTIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSAgICAweDIwOUEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTFhfVklERU8gIDB4MjA4MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MWF9BRVMgICAgMHgyMDgyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCmluZGV4IDNjODA1ODMuLjZlMzg2ODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC01ODMsNiArNTgzLDEyIEBACiAJaW50CQkJCWdyb3VwX2NhcHM7CiAKIAlzdHJ1Y3QgcGVyZl9ldmVudAkJKmdyb3VwX2xlYWRlcjsKKworCS8qCisJICogUHJvdGVjdCB0aGUgcG11LCBhdHRyaWJ1dGVzIGFuZCBjb250ZXh0IG9mIGEgZ3JvdXAgbGVhZGVyLgorCSAqIE5vdGU6IGRvZXMgbm90IHByb3RlY3QgdGhlIHBvaW50ZXIgdG8gdGhlIGdyb3VwX2xlYWRlci4KKwkgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQlncm91cF9sZWFkZXJfbXV0ZXg7CiAJc3RydWN0IHBtdQkJCSpwbXU7CiAJdm9pZAkJCQkqcG11X3ByaXZhdGU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS5oCmluZGV4IDZjOWIxZTAuLjg0MzFjOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtNzk5LDYgKzc5OSwxMCBAQAogaW50IGdlbnBoeV9zdXNwZW5kKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpOwogaW50IGdlbnBoeV9yZXN1bWUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CiBpbnQgZ2VucGh5X3NvZnRfcmVzZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldik7CitzdGF0aWMgaW5saW5lIGludCBnZW5waHlfbm9fc29mdF9yZXNldChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXJldHVybiAwOworfQogdm9pZCBwaHlfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBoeV9kcml2ZXIgKmRydik7CiB2b2lkIHBoeV9kcml2ZXJzX3VucmVnaXN0ZXIoc3RydWN0IHBoeV9kcml2ZXIgKmRydiwgaW50IG4pOwogaW50IHBoeV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBoeV9kcml2ZXIgKm5ld19kcml2ZXIsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9tc21fc2VyaWFsX2hzLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbXNtX3NlcmlhbF9ocy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzc2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbXNtX3NlcmlhbF9ocy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE5pY2sgUGVsbHkgPG5wZWxseUBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01TTV9TRVJJQUxfSFNfSAorI2RlZmluZSBfX0FTTV9BUkNIX01TTV9TRVJJQUxfSFNfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKworLyoqCisgKiBzdHJ1Y3QgbXNtX3NlcmlhbF9oc19wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gZGV2aWNlIGRhdGEKKyAqCQkJCQlmb3IgbXNtIGhzdWFydCBkZXZpY2UKKyAqIEB3YWtldXBfaXJxIDogSVJRIGxpbmUgdG8gYmUgY29uZmlndXJlZCBhcyBXYWtldXAgc291cmNlLgorICogQGluamVjdF9yeF9vbl93YWtldXAgOiBTZXQgMSBpZiBzcGVjaWZpYyBjaGFyYWN0ZXIgdG8gYmUgaW5zZXJ0ZWQgb24gd2FrZXVwCisgKiBAcnhfdG9faW5qZWN0IDogQ2hhcmFjdGVyIHRvIGJlIGluc2VydGVkIG9uIHdha2V1cAorICogQGdwaW9fY29uZmlnIDogQ29uZmlndXJlIGdwaW9zIHRoYXQgYXJlIHVzZWQgZm9yIHVhcnQgY29tbXVuaWNhdGlvbgorICogQHVzZXJpZCA6IFVzZXItZGVmaW5lZCBudW1iZXIgdG8gYmUgdXNlZCB0byBlbnVtZXJhdGUgZGV2aWNlIGFzIHR0eTx1c2VyaWQ+CisgKiBAdWFydF90eF9ncGlvOiBHUElPIG51bWJlciBmb3IgVUFSVCBUeCBMaW5lLgorICogQHVhcnRfcnhfZ3BpbzogR1BJTyBudW1iZXIgZm9yIFVBUlQgUnggTGluZS4KKyAqIEB1YXJ0X2N0c19ncGlvOiBHUElPIG51bWJlciBmb3IgVUFSVCBDVFMgTGluZS4KKyAqIEB1YXJ0X3Jmcl9ncGlvOiBHUElPIG51bWJlciBmb3IgVUFSVCBSRlIgTGluZS4KKyAqIEBiYW1fdHhfZXBfcGlwZV9pbmRleCA6IEJBTSBUWCBFbmRwb2ludCBQaXBlIEluZGV4IGZvciBIU1VBUlQKKyAqIEBiYW1fdHhfZXBfcGlwZV9pbmRleCA6IEJBTSBSWCBFbmRwb2ludCBQaXBlIEluZGV4IGZvciBIU1VBUlQKKyAqIEBub19zdXNwZW5kX2RlbGF5IDogRmxhZyB1c2VkIHRvIG1ha2Ugc3lzdGVtIGdvIHRvIHN1c3BlbmQKKyAqIGltbWVkaWF0ZWx5IG9yIG5vdAorICogQG9iczogRmxhZyB0byBlbmFibGUgb3V0IG9mIGJhbmQgc2xlZXAgZmVhdHVyZSBzdXBwb3J0CisgKi8KK3N0cnVjdCBtc21fc2VyaWFsX2hzX3BsYXRmb3JtX2RhdGEgeworCWludCB3YWtldXBfaXJxOyAgLyogd2FrZXVwIGlycSAqLworCWJvb2wgaW5qZWN0X3J4X29uX3dha2V1cDsKKwl1OCByeF90b19pbmplY3Q7CisJaW50ICgqZ3Bpb19jb25maWcpKGludCk7CisJaW50IHVzZXJpZDsKKworCWludCB1YXJ0X3R4X2dwaW87CisJaW50IHVhcnRfcnhfZ3BpbzsKKwlpbnQgdWFydF9jdHNfZ3BpbzsKKwlpbnQgdWFydF9yZnJfZ3BpbzsKKwl1bnNpZ25lZCBpbnQgYmFtX3R4X2VwX3BpcGVfaW5kZXg7CisJdW5zaWduZWQgaW50IGJhbV9yeF9lcF9waXBlX2luZGV4OworCWJvb2wgbm9fc3VzcGVuZF9kZWxheTsKKwlib29sIG9iczsKK307CisKKy8qIHJldHVybiB0cnVlIHdoZW4gdHggaXMgZW1wdHkgKi8KK3Vuc2lnbmVkIGludCBtc21faHNfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpOworaW50IG1zbV9oc19yZXF1ZXN0X2Nsb2NrX29mZihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCk7CitpbnQgbXNtX2hzX3JlcXVlc3RfY2xvY2tfb24oc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpOworc3RydWN0IHVhcnRfcG9ydCAqbXNtX2hzX2dldF91YXJ0X3BvcnQoaW50IHBvcnRfaW5kZXgpOwordm9pZCBtc21faHNfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbWN0cmwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oIGIvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAppbmRleCBlYzNiZTdiLi5iNmM4YzkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKQEAgLTE5OSw2ICsxOTksOCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0xPV19QT1dFUiwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DT09MX1RFTVAsCiAJUE9XRVJfU1VQUExZX1BST1BfV0FSTV9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTERfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IT1RfVEVNUCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9TWVNURU1fVEVNUF9MRVZFTCwKIAlQT1dFUl9TVVBQTFlfUFJPUF9SRVNJU1RBTkNFLAogCVBPV0VSX1NVUFBMWV9QUk9QX1JFU0lTVEFOQ0VfQ0FQQUNJVElWRSwKQEAgLTI1Miw2ICsyNTQsOSBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0NDX1NURVAsCiAJUE9XRVJfU1VQUExZX1BST1BfQ0NfU1RFUF9TRUwsCiAJUE9XRVJfU1VQUExZX1BST1BfU1dfSkVJVEFfRU5BQkxFRCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QRF9WT0xUQUdFX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QRF9WT0xUQUdFX01JTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9TRFBfQ1VSUkVOVF9NQVgsCiAJLyogTG9jYWwgZXh0ZW5zaW9ucyBvZiB0eXBlIGludDY0X3QgKi8KIAlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUl9FWFQsCiAJLyogUHJvcGVydGllcyBvZiB0eXBlIGBjb25zdCBjaGFyIConICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmggYi9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmgKaW5kZXggODU2ZTUwYi4uMzM4ZjliNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvcGVydHkuaApAQCAtMzMsNiArMzMsOCBAQAogCURFVl9ETUFfQ09IRVJFTlQsCiB9OwogCitzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZGV2X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiBib29sIGRldmljZV9wcm9wZXJ0eV9wcmVzZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJvcG5hbWUpOwogaW50IGRldmljZV9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICB1OCAqdmFsLCBzaXplX3QgbnZhbCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZV9yYW0uaCBiL2luY2x1ZGUvbGludXgvcHN0b3JlX3JhbS5oCmluZGV4IDQ4NWNjOGUuLmNiNWVkZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHN0b3JlX3JhbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlX3JhbS5oCkBAIC0yNCw2ICsyNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCisvKgorICogQ2hvb3NlIHdoZXRoZXIgYWNjZXNzIHRvIHRoZSBSQU0gem9uZSByZXF1aXJlcyBsb2NraW5nIG9yIG5vdC4gIElmIGEgem9uZQorICogY2FuIGJlIHdyaXR0ZW4gdG8gZnJvbSBkaWZmZXJlbnQgQ1BVcyBsaWtlIHdpdGggZnRyYWNlIGZvciBleGFtcGxlLCB0aGVuCisgKiBQUlpfRkxBR19OT19MT0NLIGlzIHVzZWQuIEZvciBhbGwgb3RoZXIgY2FzZXMsIGxvY2tpbmcgaXMgcmVxdWlyZWQuCisgKi8KKyNkZWZpbmUgUFJaX0ZMQUdfTk9fTE9DSwlCSVQoMCkKKwogc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlcjsKIHN0cnVjdCByc19jb250cm9sOwogCkBAIC00MCw2ICs0Nyw4IEBACiAJdm9pZCAqdmFkZHI7CiAJc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlciAqYnVmZmVyOwogCXNpemVfdCBidWZmZXJfc2l6ZTsKKwl1MzIgZmxhZ3M7CisJcmF3X3NwaW5sb2NrX3QgYnVmZmVyX2xvY2s7CiAKIAkvKiBFQ0MgY29ycmVjdGlvbiAqLwogCWNoYXIgKnBhcl9idWZmZXI7CkBAIC01NSw3ICs2NCw3IEBACiAKIHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwZXJzaXN0ZW50X3JhbV9uZXcocGh5c19hZGRyX3Qgc3RhcnQsIHNpemVfdCBzaXplLAogCQkJdTMyIHNpZywgc3RydWN0IHBlcnNpc3RlbnRfcmFtX2VjY19pbmZvICplY2NfaW5mbywKLQkJCXVuc2lnbmVkIGludCBtZW10eXBlKTsKKwkJCXVuc2lnbmVkIGludCBtZW10eXBlLCB1MzIgZmxhZ3MpOwogdm9pZCBwZXJzaXN0ZW50X3JhbV9mcmVlKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnopOwogdm9pZCBwZXJzaXN0ZW50X3JhbV96YXAoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRyX3JpbmcuaCBiL2luY2x1ZGUvbGludXgvcHRyX3JpbmcuaAppbmRleCA2YzcwNDQ0Li5iODM1MDdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cl9yaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHJfcmluZy5oCkBAIC0zNDAsOSArMzQwLDkgQEAKIAlfX1BUUl9SSU5HX1BFRUtfQ0FMTF92OyBcCiB9KQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKipfX3B0cl9yaW5nX2luaXRfcXVldWVfYWxsb2MoaW50IHNpemUsIGdmcF90IGdmcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqKl9fcHRyX3JpbmdfaW5pdF9xdWV1ZV9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZ2ZwKQogewotCXJldHVybiBremFsbG9jKEFMSUdOKHNpemUgKiBzaXplb2Yodm9pZCAqKSwgU01QX0NBQ0hFX0JZVEVTKSwgZ2ZwKTsKKwlyZXR1cm4ga2NhbGxvYyhzaXplLCBzaXplb2Yodm9pZCAqKSwgZ2ZwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcHRyX3JpbmdfaW5pdChzdHJ1Y3QgcHRyX3JpbmcgKnIsIGludCBzaXplLCBnZnBfdCBnZnApCkBAIC00MTcsNyArNDE3LDggQEAKICAqIEluIHBhcnRpY3VsYXIgaWYgeW91IGNvbnN1bWUgcmluZyBpbiBpbnRlcnJ1cHQgb3IgQkggY29udGV4dCwgeW91IG11c3QKICAqIGRpc2FibGUgaW50ZXJydXB0cy9CSCB3aGVuIGRvaW5nIHNvLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdHJfcmluZ19yZXNpemVfbXVsdGlwbGUoc3RydWN0IHB0cl9yaW5nICoqcmluZ3MsIGludCBucmluZ3MsCitzdGF0aWMgaW5saW5lIGludCBwdHJfcmluZ19yZXNpemVfbXVsdGlwbGUoc3RydWN0IHB0cl9yaW5nICoqcmluZ3MsCisJCQkJCSAgIHVuc2lnbmVkIGludCBucmluZ3MsCiAJCQkJCSAgIGludCBzaXplLAogCQkJCQkgICBnZnBfdCBnZnAsIHZvaWQgKCpkZXN0cm95KSh2b2lkICopKQogewpAQCAtNDI1LDcgKzQyNiw3IEBACiAJdm9pZCAqKipxdWV1ZXM7CiAJaW50IGk7CiAKLQlxdWV1ZXMgPSBrbWFsbG9jKG5yaW5ncyAqIHNpemVvZiAqcXVldWVzLCBnZnApOworCXF1ZXVlcyA9IGttYWxsb2NfYXJyYXkobnJpbmdzLCBzaXplb2YoKnF1ZXVlcyksIGdmcCk7CiAJaWYgKCFxdWV1ZXMpCiAJCWdvdG8gbm9xdWV1ZXM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWNvbS1nZW5pLXNlLmggYi9pbmNsdWRlL2xpbnV4L3Fjb20tZ2VuaS1zZS5oCmluZGV4IGFhNGMxZWQuLjc3YTQ2YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWNvbS1nZW5pLXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9xY29tLWdlbmktc2UuaApAQCAtMTE3LDYgKzExNyw3IEBACiAjZGVmaW5lIFNFX0hXX1BBUkFNXzAJCQkoMHhFMjQpCiAjZGVmaW5lIFNFX0hXX1BBUkFNXzEJCQkoMHhFMjgpCiAjZGVmaW5lIFNFX0RNQV9HRU5FUkFMX0NGRwkJKDB4RTMwKQorI2RlZmluZSBTRV9ETUFfREVCVUdfUkVHMAkJKDB4RTQwKQogCiAvKiBHRU5JX09VVFBVVF9DVFJMIGZpZWxkcyAqLwogI2RlZmluZSBERUZBVUxUX0lPX09VVFBVVF9DVFJMX01TSwkoR0VOTUFTSyg2LCAwKSkKQEAgLTczNiw2ICs3MzcsMjIgQEAKIGludCBnZW5pX3NlX2lvbW11X2ZyZWVfYnVmKHN0cnVjdCBkZXZpY2UgKndyYXBwZXJfZGV2LCBkbWFfYWRkcl90ICppb3ZhLAogCQkJICAgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7CiAKKworLyoqCisgKiBnZW5pX3NlX2R1bXBfZGJnX3JlZ3MoKSAtIFByaW50IHJlbGV2YW50IHJlZ2lzdGVycyB0aGF0IGNhcHR1cmUgbW9zdAorICoJCQlhY2N1cmF0ZWx5IHRoZSBzdGF0ZSBvZiBhbiBTRTsgbWVhbnQgdG8gYmUgY2FsbGVkCisgKgkJCWluIGNhc2Ugb2YgZXJyb3JzIHRvIGhlbHAgZGVidWcuCisgKiBAX2RldjoJCVBvaW50ZXIgdG8gdGhlIFNFJ3MgZGV2aWNlLgorICogQGlvbWVtOgkJQmFzZSBhZGRyZXNzIG9mIHRoZSBTRSdzIHJlZ2lzdGVyIHNwYWNlLgorICogQGlwYzoJCUlQQyBsb2cgY29udGV4dCBoYW5kbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByaW50IG91dCBhbGwgdGhlIHJlZ2lzdGVycyB0aGF0IGNhcHR1cmUgdGhlIHN0YXRlCisgKiBvZiBhbiBTRSB0byBoZWxwIGRlYnVnIGFueSBlcnJvcnMuCisgKgorICogUmV0dXJuOglOb25lCisgKi8KK3ZvaWQgZ2VuaV9zZV9kdW1wX2RiZ19yZWdzKHN0cnVjdCBzZV9nZW5pX3JzYyAqcnNjLCB2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkJdm9pZCAqaXBjKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZW5pX3JlYWRfcmVnX25vbG9nKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IG9mZnNldCkKIHsKQEAgLTkwNyw1ICs5MjQsMTAgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCitzdGF0aWMgdm9pZCBnZW5pX3NlX2R1bXBfZGJnX3JlZ3Moc3RydWN0IHNlX2dlbmlfcnNjICpyc2MsIHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQl2b2lkICppcGMpCit7Cit9CisKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByLmggYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGViM2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMC0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX0FQUl9IXwotI2RlZmluZSBfX0FQUl9IXwotCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9zdWJzeXN0ZW1fbm90aWYuaD4KLQotZW51bSBhcHJfc3Vic3lzX3N0YXRlIHsKLQlBUFJfU1VCU1lTX0RPV04sCi0JQVBSX1NVQlNZU19VUCwKLQlBUFJfU1VCU1lTX0xPQURFRCwKLX07Ci0KLXN0cnVjdCBhcHJfcTYgewotCXZvaWQgKnBpbDsKLQlhdG9taWNfdCBxNl9zdGF0ZTsKLQlhdG9taWNfdCBtb2RlbV9zdGF0ZTsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLX07Ci0KLXN0cnVjdCBhcHJfaGRyIHsKLQl1aW50MTZfdCBoZHJfZmllbGQ7Ci0JdWludDE2X3QgcGt0X3NpemU7Ci0JdWludDhfdCBzcmNfc3ZjOwotCXVpbnQ4X3Qgc3JjX2RvbWFpbjsKLQl1aW50MTZfdCBzcmNfcG9ydDsKLQl1aW50OF90IGRlc3Rfc3ZjOwotCXVpbnQ4X3QgZGVzdF9kb21haW47Ci0JdWludDE2X3QgZGVzdF9wb3J0OwotCXVpbnQzMl90IHRva2VuOwotCXVpbnQzMl90IG9wY29kZTsKLX07Ci0KLSNkZWZpbmUgQVBSX0hEUl9MRU4oaGRyX2xlbikgKChoZHJfbGVuKS80KQotI2RlZmluZSBBUFJfUEtUX1NJWkUoaGRyX2xlbiwgcGF5bG9hZF9sZW4pICgoaGRyX2xlbikgKyAocGF5bG9hZF9sZW4pKQotI2RlZmluZSBBUFJfSERSX0ZJRUxEKG1zZ190eXBlLCBoZHJfbGVuLCB2ZXIpXAotCSgoKG1zZ190eXBlICYgMHgzKSA8PCA4KSB8ICgoaGRyX2xlbiAmIDB4RikgPDwgNCkgfCAodmVyICYgMHhGKSkKLQotI2RlZmluZSBBUFJfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKQotCi0vKiBWZXJzaW9uICovCi0jZGVmaW5lIEFQUl9QS1RfVkVSCQkweDAKLQotLyogQ29tbWFuZCBhbmQgUmVzcG9uc2UgVHlwZXMgKi8KLSNkZWZpbmUgQVBSX01TR19UWVBFX0VWRU5UCTB4MAotI2RlZmluZSBBUFJfTVNHX1RZUEVfQ01EX1JTUAkweDEKLSNkZWZpbmUgQVBSX01TR19UWVBFX1NFUV9DTUQJMHgyCi0jZGVmaW5lIEFQUl9NU0dfVFlQRV9OU0VRX0NNRAkweDMKLSNkZWZpbmUgQVBSX01TR19UWVBFX01BWAkweDA0Ci0KLS8qIEFQUiBCYXNpYyBSZXNwb25zZSBNZXNzYWdlICovCi0jZGVmaW5lIEFQUl9CQVNJQ19SU1BfUkVTVUxUIDB4MDAwMTEwRTgKLSNkZWZpbmUgQVBSX1JTUF9BQ0NFUFRFRCAgICAgMHgwMDAxMDBCRQotCi0vKiBEb21haW4gSURzICovCi0jZGVmaW5lIEFQUl9ET01BSU5fU0lNCTB4MQotI2RlZmluZSBBUFJfRE9NQUlOX1BDCQkweDIKLSNkZWZpbmUgQVBSX0RPTUFJTl9NT0RFTQkweDMKLSNkZWZpbmUgQVBSX0RPTUFJTl9BRFNQCTB4NAotI2RlZmluZSBBUFJfRE9NQUlOX0FQUFMJMHg1Ci0jZGVmaW5lIEFQUl9ET01BSU5fTUFYCTB4NgotCi0vKiBBRFNQIHNlcnZpY2UgSURzICovCi0jZGVmaW5lIEFQUl9TVkNfVEVTVF9DTElFTlQgICAgIDB4MgotI2RlZmluZSBBUFJfU1ZDX0FEU1BfQ09SRQkweDMKLSNkZWZpbmUgQVBSX1NWQ19BRkUJCTB4NAotI2RlZmluZSBBUFJfU1ZDX1ZTTQkJMHg1Ci0jZGVmaW5lIEFQUl9TVkNfVlBNCQkweDYKLSNkZWZpbmUgQVBSX1NWQ19BU00JCTB4NwotI2RlZmluZSBBUFJfU1ZDX0FETQkJMHg4Ci0jZGVmaW5lIEFQUl9TVkNfQURTUF9NVk0JMHgwOQotI2RlZmluZSBBUFJfU1ZDX0FEU1BfQ1ZTCTB4MEEKLSNkZWZpbmUgQVBSX1NWQ19BRFNQX0NWUAkweDBCCi0jZGVmaW5lIEFQUl9TVkNfVVNNCQkweDBDCi0jZGVmaW5lIEFQUl9TVkNfTFNNCQkweDBECi0jZGVmaW5lIEFQUl9TVkNfVklEQwkJMHgxNgotI2RlZmluZSBBUFJfU1ZDX01BWAkJMHgxNwotCi0vKiBNb2RlbSBTZXJ2aWNlIElEcyAqLwotI2RlZmluZSBBUFJfU1ZDX01WUwkJMHgzCi0jZGVmaW5lIEFQUl9TVkNfTVZNCQkweDQKLSNkZWZpbmUgQVBSX1NWQ19DVlMJCTB4NQotI2RlZmluZSBBUFJfU1ZDX0NWUAkJMHg2Ci0jZGVmaW5lIEFQUl9TVkNfU1JECQkweDcKLQotLyogQVBSIFBvcnQgSURzICovCi0jZGVmaW5lIEFQUl9NQVhfUE9SVFMJCTB4ODAKLQotI2RlZmluZSBBUFJfTkFNRV9NQVgJCTB4NDAKLQotI2RlZmluZSBSRVNFVF9FVkVOVFMJCTB4MDAwMTMwRDcKLQotI2RlZmluZSBMUEFTU19SRVNUQVJUX0VWRU5UCTB4MTAwMAotI2RlZmluZSBMUEFTU19SRVNUQVJUX1JFQURZCTB4MTAwMQotCi1zdHJ1Y3QgYXByX2NsaWVudF9kYXRhIHsKLQl1aW50MTZfdCByZXNldF9ldmVudDsKLQl1aW50MTZfdCByZXNldF9wcm9jOwotCXVpbnQxNl90IHBheWxvYWRfc2l6ZTsKLQl1aW50MTZfdCBoZHJfbGVuOwotCXVpbnQxNl90IG1zZ190eXBlOwotCXVpbnQxNl90IHNyYzsKLQl1aW50MTZfdCBkZXN0X3N2YzsKLQl1aW50MTZfdCBzcmNfcG9ydDsKLQl1aW50MTZfdCBkZXN0X3BvcnQ7Ci0JdWludDMyX3QgdG9rZW47Ci0JdWludDMyX3Qgb3Bjb2RlOwotCXZvaWQgKnBheWxvYWQ7Ci19OwotCi10eXBlZGVmIGludDMyX3QgKCphcHJfZm4pKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOwotCi1zdHJ1Y3QgYXByX3N2YyB7Ci0JdWludDE2X3QgaWQ7Ci0JdWludDE2X3QgZGVzdF9pZDsKLQl1aW50MTZfdCBjbGllbnRfaWQ7Ci0JdWludDE2X3QgZGVzdF9kb21haW47Ci0JdWludDhfdCBydmQ7Ci0JdWludDhfdCBwb3J0X2NudDsKLQl1aW50OF90IHN2Y19jbnQ7Ci0JdWludDhfdCBuZWVkX3Jlc2V0OwotCWFwcl9mbiBwb3J0X2ZuW0FQUl9NQVhfUE9SVFNdOwotCXZvaWQgKnBvcnRfcHJpdltBUFJfTUFYX1BPUlRTXTsKLQlhcHJfZm4gZm47Ci0Jdm9pZCAqcHJpdjsKLQlzdHJ1Y3QgbXV0ZXggbV9sb2NrOwotCXNwaW5sb2NrX3Qgd19sb2NrOwotCXVpbnQ4X3QgcGt0X293bmVyOwotfTsKLQotc3RydWN0IGFwcl9jbGllbnQgewotCXVpbnQ4X3QgaWQ7Ci0JdWludDhfdCBzdmNfY250OwotCXVpbnQ4X3QgcnZkOwotCXN0cnVjdCBtdXRleCBtX2xvY2s7Ci0Jc3RydWN0IGFwcl9zdmNfY2hfZGV2ICpoYW5kbGU7Ci0Jc3RydWN0IGFwcl9zdmMgc3ZjW0FQUl9TVkNfTUFYXTsKLX07Ci0KLXN0cnVjdCBhcHJfcnhfaW50ZW50cyB7Ci0JaW50IG51bV9vZl9pbnRlbnRzOwotCXVpbnQzMl90IHNpemU7Ci19OwotCi1zdHJ1Y3QgYXByX3BrdF9jZmcgewotCXVpbnQ4X3QgcGt0X293bmVyOwotCXN0cnVjdCBhcHJfcnhfaW50ZW50cyBpbnRlbnRzOwotfTsKLQotaW50IGFwcl9sb2FkX2Fkc3BfaW1hZ2Uodm9pZCk7Ci1zdHJ1Y3QgYXByX2NsaWVudCAqYXByX2dldF9jbGllbnQoaW50IGRlc3RfaWQsIGludCBjbGllbnRfaWQpOwotaW50IGFwcl93YWl0X2Zvcl9kZXZpY2VfdXAoaW50IGRlc3RfaWQpOwotaW50IGFwcl9nZXRfc3ZjKGNvbnN0IGNoYXIgKnN2Y19uYW1lLCBpbnQgZGVzdF9pZCwgaW50ICpjbGllbnRfaWQsCi0JCWludCAqc3ZjX2lkeCwgaW50ICpzdmNfaWQpOwotdm9pZCBhcHJfY2JfZnVuYyh2b2lkICpidWYsIGludCBsZW4sIHZvaWQgKnByaXYpOwotc3RydWN0IGFwcl9zdmMgKmFwcl9yZWdpc3RlcihjaGFyICpkZXN0LCBjaGFyICpzdmNfbmFtZSwgYXByX2ZuIHN2Y19mbiwKLQkJCQkJdWludDMyX3Qgc3JjX3BvcnQsIHZvaWQgKnByaXYpOwotaW5saW5lIGludCBhcHJfZmlsbF9oZHIodm9pZCAqaGFuZGxlLCB1aW50MzJfdCAqYnVmLCB1aW50MTZfdCBzcmNfcG9ydCwKLQkJCXVpbnQxNl90IG1zZ190eXBlLCB1aW50MTZfdCBkZXN0X3BvcnQsCi0JCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3Qgb3Bjb2RlLCB1aW50MTZfdCBsZW4pOwotCi1pbnQgYXByX3NlbmRfcGt0KHZvaWQgKmhhbmRsZSwgdWludDMyX3QgKmJ1Zik7Ci1pbnQgYXByX2RlcmVnaXN0ZXIodm9pZCAqaGFuZGxlKTsKLXZvaWQgc3Vic3lzX25vdGlmX3JlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lLCBpbnQgZG9tYWluLAotCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Ci1pbnQgYXByX2dldF9kZXN0X2lkKGNoYXIgKmRlc3QpOwotdWludDE2X3QgYXByX2dldF9kYXRhX3NyYyhzdHJ1Y3QgYXByX2hkciAqaGRyKTsKLXZvaWQgY2hhbmdlX3E2X3N0YXRlKGludCBzdGF0ZSk7Ci12b2lkIHE2YXVkaW9fZHNwX25vdF9yZXNwb25kaW5nKHZvaWQpOwotdm9pZCBhcHJfcmVzZXQodm9pZCAqaGFuZGxlKTsKLWVudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfZ2V0X3N1YnN5c19zdGF0ZSh2b2lkKTsKLWVudW0gYXByX3N1YnN5c19zdGF0ZSBhcHJfZ2V0X21vZGVtX3N0YXRlKHZvaWQpOwotdm9pZCBhcHJfc2V0X21vZGVtX3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSk7Ci1lbnVtIGFwcl9zdWJzeXNfc3RhdGUgYXByX2dldF9xNl9zdGF0ZSh2b2lkKTsKLWludCBhcHJfc2V0X3E2X3N0YXRlKGVudW0gYXByX3N1YnN5c19zdGF0ZSBzdGF0ZSk7Ci12b2lkIGFwcl9zZXRfc3Vic3lzX3N0YXRlKHZvaWQpOwotY29uc3QgY2hhciAqYXByX2dldF9scGFzc19zdWJzeXNfbmFtZSh2b2lkKTsKLXVpbnQxNl90IGFwcl9nZXRfcmVzZXRfZG9tYWluKHVpbnQxNl90IHByb2MpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByX3RhbC5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl90YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMWE0Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXByX3RhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfX0FQUl9UQUxfSF8KLSNkZWZpbmUgX19BUFJfVEFMX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi0vKiBBUFIgQ2xpZW50IElEcyAqLwotI2RlZmluZSBBUFJfQ0xJRU5UX0FVRElPCTB4MAotI2RlZmluZSBBUFJfQ0xJRU5UX1ZPSUNFCTB4MQotI2RlZmluZSBBUFJfQ0xJRU5UX01BWAkJMHgyCi0KLSNkZWZpbmUgQVBSX0RMX1NNRCAgICAwCi0jZGVmaW5lIEFQUl9ETF9NQVggICAgMQotCi0jZGVmaW5lIEFQUl9ERVNUX01PREVNIDAKLSNkZWZpbmUgQVBSX0RFU1RfUURTUDYgMQotI2RlZmluZSBBUFJfREVTVF9NQVggICAyCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NU01fUURTUDZfQVBSVjJfR0xJTkspIHx8IFwKLQlkZWZpbmVkKENPTkZJR19NU01fUURTUDZfQVBSVjNfR0xJTkspCi0jZGVmaW5lIEFQUl9NQVhfQlVGCQkJNTEyCi0jZWxzZQotI2RlZmluZSBBUFJfTUFYX0JVRgkJCTgwOTIKLSNlbmRpZgotCi0jZGVmaW5lIEFQUl9ERUZBVUxUX05VTV9PRl9JTlRFTlRTIDIwCi0KLSNkZWZpbmUgQVBSX09QRU5fVElNRU9VVF9NUyA1MDAwCi0KLWVudW0gewotCS8qIElmIGNsaWVudCBzZXRzIHRoZSBwa3Rfb3duZXIgdG8gQVBSX1BLVF9PV05FUl9EUklWRVIsIEFQUgotCSAqIGRyaXZlciB3aWxsIGFsbG9jYXRlIGEgYnVmZmVyLCB3aGVyZSB0aGUgdXNlciBwYWNrZXQgaXMKLQkgKiBjb3BpZWQgaW50bywgZm9yIGVhY2ggYW5kIGV2ZXJ5IHNpbmdsZSBUeCB0cmFuc21pc3Npb24uCi0JICogVGhlIGJ1ZmZlciBpcyB0aGVyZWFmdGVyIHBhc3NlZCB0byB1bmRlcmx5aW5nIGxpbmsgbGF5ZXIKLQkgKiBhbmQgZnJlZWQgdXBvbiB0aGUgbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gdGhlIGxpbmsgbGF5ZXIKLQkgKiB0aGF0IHRoZSBwYWNrZXQgaGFzIGJlZW4gY29uc3VtZWQuCi0JICovCi0JQVBSX1BLVF9PV05FUl9EUklWRVIsCi0JLyogSWYgY2xpZW50IHNldHMgdGhlIHBrdF9vd25lciB0byBBUFJfUEtUX09XTkVSX0NMSUVOVCwgQVBSCi0JICogd2lsbCBwYXNzIHRoZSB1c2VyIHBhY2tldCBtZW1vcnkgYWRkcmVzcyBkaXJlY3RseSB0byB1bmRlcmx5aW5nCi0JICogbGluayBsYXllci4gSW4gdGhpcyBjYXNlIGl0IGlzIHRoZSBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0bwotCSAqIG1ha2Ugc3VyZSB0aGUgcGFja2V0IGlzIGludGFjdCB1bnRpbCBiZWluZyBub3RpZmllZCB0aGF0IHRoZQotCSAqIHBhY2tldCBoYXMgYmVlbiBjb25zdW1lZC4KLQkgKi8KLQlBUFJfUEtUX09XTkVSX0NMSUVOVCwKLX07Ci0KLXN0cnVjdCBhcHJfcGt0X3ByaXYgewotCS8qIFRoaXMgcHJvcGVydHkgaXMgb25seSBhcHBsaWNhYmxlIGZvciBBUFIgb3ZlciBHbGluay4KLQkgKiBJdCBpcyBpZ25vcmVkIGluIEFQUiBvdmVyIFNNRCBjYXNlcy4KLQkgKi8KLQl1aW50OF90IHBrdF9vd25lcjsKLX07Ci0KLXR5cGVkZWYgdm9pZCAoKmFwcl9zdmNfY2JfZm4pKHZvaWQgKmJ1ZiwgaW50IGxlbiwgdm9pZCAqcHJpdik7Ci1zdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl90YWxfb3Blbih1aW50MzJfdCBzdmMsIHVpbnQzMl90IGRlc3QsCi0JCQl1aW50MzJfdCBkbCwgYXByX3N2Y19jYl9mbiBmdW5jLCB2b2lkICpwcml2KTsKLWludCBhcHJfdGFsX3dyaXRlKHN0cnVjdCBhcHJfc3ZjX2NoX2RldiAqYXByX2NoLCB2b2lkICpkYXRhLAotCQlzdHJ1Y3QgYXByX3BrdF9wcml2ICpwa3RfcHJpdiwgaW50IGxlbik7Ci1pbnQgYXByX3RhbF9jbG9zZShzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCk7Ci1pbnQgYXByX3RhbF9yeF9pbnRlbnRzX2NvbmZpZyhzdHJ1Y3QgYXByX3N2Y19jaF9kZXYgKmFwcl9jaCwKLQkJaW50IG51bV9vZl9pbnRlbnRzLCB1aW50MzJfdCBzaXplKTsKLQotCi1zdHJ1Y3QgYXByX3N2Y19jaF9kZXYgewotCXZvaWQgICAgICAgICAgICAgICAqaGFuZGxlOwotCXNwaW5sb2NrX3QgICAgICAgICB3X2xvY2s7Ci0Jc3BpbmxvY2tfdCAgICAgICAgIHJfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggICAgICAgbV9sb2NrOwotCWFwcl9zdmNfY2JfZm4gICAgICBmdW5jOwotCXdhaXRfcXVldWVfaGVhZF90ICB3YWl0OwotCXZvaWQgICAgICAgICAgICAgICAqcHJpdjsKLQl1bnNpZ25lZCBpbnQgICAgICAgY2hhbm5lbF9zdGF0ZTsKLQlib29sICAgICAgICAgICAgICAgaWZfcmVtb3RlX2ludGVudF9yZWFkeTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl91cy5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2Fwcl91cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTY4MDRhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hcHJfdXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX19BUFJfVVNfSF9fCi0jZGVmaW5lIF9fQVBSX1VTX0hfXwotCi0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBTZXNzaW9uIExldmVsIGNvbW1hbmRzICovCi0KLSNkZWZpbmUgVVNNX1NFU1NJT05fQ01EX1JVTgkJCQkweDAwMDEyMzA2Ci1zdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfcnVuIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgZmxhZ3M7Ci0JdTMyICAgICAgICAgICAgbXN3X3RzOwotCXUzMiAgICAgICAgICAgIGxzd190czsKLX0gX19wYWNrZWQ7Ci0KLS8qIFN0cmVhbSBsZXZlbCBjb21tYW5kcyAqLwotI2RlZmluZSBVU01fU1RSRUFNX0NNRF9PUEVOX1JFQUQJCQkweDAwMDEyMzA5Ci1zdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgdU1vZGU7Ci0JdTMyICAgICAgICAgICAgc3JjX2VuZHBvaW50OwotCXUzMiAgICAgICAgICAgIHByZV9wcm9jX3RvcDsKLQl1MzIgICAgICAgICAgICBmb3JtYXQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIFVTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEUJCQkweDAwMDExMjcxCi1zdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfb3Blbl93cml0ZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIGZvcm1hdDsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBVU01fU1RSRUFNX0NNRF9DTE9TRQkJCQkweDAwMDEyMzBBCi0KLSNkZWZpbmUgVVNNX1NUUkVBTV9DTURfU0VUX1BBUkFNCQkJMHgwMDAxMjczMQotc3RydWN0IHVzbV9zdHJlYW1fY21kX3NldF9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIGJ1Zl9hZGRyX2xzdzsKLQl1MzIgICAgICAgICAgICBidWZfYWRkcl9tc3c7Ci0JdTMyICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci0JdTMyICAgICAgICAgICAgYnVmX3NpemU7Ci0JdTMyICAgICAgICAgICAgbW9kdWxlX2lkOwotCXUzMiAgICAgICAgICAgIHBhcmFtX2lkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBVU01fU1RSRUFNX0NNRF9HRVRfUEFSQU0JCQkweDAwMDEyNzMyCi1zdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfZ2V0X3BhcmFtIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgYnVmX2FkZHJfbHN3OwotCXUzMiAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKLQl1MzIgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLQl1MzIgICAgICAgICAgICBidWZfc2l6ZTsKLQl1MzIgICAgICAgICAgICBtb2R1bGVfaWQ7Ci0JdTMyICAgICAgICAgICAgcGFyYW1faWQ7Ci19IF9fcGFja2VkOwotCi0vKiBFbmNvZGVyIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgVVNNX1NUUkVBTV9DTURfU0VUX0VOQ19QQVJBTQkJCTB4MDAwMTIzMEIKLS8qIERlY29kZXIgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBVU01fREFUQV9DTURfTUVESUFfRk9STUFUX1VQREFURQkJMHgwMDAxMTI3MgotCi0vKiBFbmNvZGVyL2RlY29kZXIgY29uZmlndXJhdGlvbiBibG9jayAqLwotI2RlZmluZSBVU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLCQkJMHgwMDAxMjMwRAotCi0vKiBNYXggbnVtYmVyIG9mIHN0YXRpYyBsb2NhdGVkIHBvcnRzIChieXRlcykgKi8KLSNkZWZpbmUgVVNNX01BWF9QT1JUX05VTUJFUiA4Ci0KLS8qIE1heCBudW1iZXIgb2Ygc3RhdGljIGxvY2F0ZWQgdHJhbnNwYXJlbnQgZGF0YSAoYnl0ZXMpICovCi0jZGVmaW5lIFVTTV9NQVhfQ0ZHX0RBVEFfU0laRSAxMDAKLQotLyogUGFyYW1ldGVyIHN0cnVjdHVyZXMgdXNlZCBpbiAgVVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kICovCi0vKiBjb21tb24gZGVjbGFyYXRpb25zICovCi1zdHJ1Y3QgdXNtX2NmZ19jb21tb24gewotCXUxNiBjaF9jZmc7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGRldl9pZDsKLQl1OCBkYXRhX21hcFtVU01fTUFYX1BPUlRfTlVNQkVSXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB1c19lbmNkZWNfY2ZnIHsKLQl1MzIgZm9ybWF0X2lkOwotCXN0cnVjdCB1c21fY2ZnX2NvbW1vbiBjZmdfY29tbW9uOwotCXUxNiBwYXJhbXNfc2l6ZTsKLQl1OCAqcGFyYW1zOwotfSBfX3BhY2tlZDsKLQotLyogU3RhcnQvc3RvcCBVUyBzaWduYWwgZGV0ZWN0aW9uICovCi0jZGVmaW5lIFVTTV9TRVNTSU9OX0NNRF9TSUdOQUxfREVURUNUX01PREUJCTB4MDAwMTI3MTkKLQotc3RydWN0IHVzbV9zZXNzaW9uX2NtZF9kZXRlY3RfaW5mbyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiBkZXRlY3RfbW9kZTsKLQl1MzIgc2tpcF9pbnRlcnZhbDsKLQl1MzIgYWxnb3JpdGhtX2NmZ19zaXplOwotfSBfX3BhY2tlZDsKLQotLyogVVMgc2lnbmFsIGRldGVjdGlvbiByZXN1bHQgKi8KLSNkZWZpbmUgVVNNX1NFU1NJT05fRVZFTlRfU0lHTkFMX0RFVEVDVF9SRVNVTFQJCTB4MDAwMTI3MjAKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBTZXNzaW9uIExldmVsIGNvbW1hbmRzICovCi0jZGVmaW5lIFVTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OCQkweDAwMDEyNzI4Ci1zdHJ1Y3QgdXNtX2NtZF9tZW1vcnlfbWFwX3JlZ2lvbiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgIG1lbXBvb2xfaWQ7Ci0JdTE2ICAgICAgICAgICAgbnVtX3JlZ2lvbnM7Ci0JdTMyICAgICAgICAgICAgZmxhZ3M7Ci0JdTMyICAgICAgICAgICAgc2htX2FkZHJfbHN3OwotCXUzMiAgICAgICAgICAgIHNobV9hZGRyX21zdzsKLQl1MzIgICAgICAgICAgICBtZW1fc2l6ZV9ieXRlczsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgVVNNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT04JMHgwMDAxMjcyOQotc3RydWN0IHVzbV9jbWRyc3BfbWVtb3J5X21hcF9yZWdpb24gewotCXUzMiAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBVU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OICAgICAgICAgMHgwMDAxMjcyQQotc3RydWN0IHVzbV9jbWRfbWVtb3J5X3VubWFwX3JlZ2lvbiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBVU01fREFUQV9DTURfUkVBRAkJCTB4MDAwMTI3MjQKLXN0cnVjdCB1c21fc3RyZWFtX2NtZF9yZWFkIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgYnVmX2FkZHJfbHN3OwotCXUzMiAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKLQl1MzIgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLQl1MzIgICAgICAgICAgICBidWZfc2l6ZTsKLQl1MzIgICAgICAgICAgICBzZXFfaWQ7Ci0JdTMyICAgICAgICAgICAgY291bnRlcjsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgVVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FCQkweDAwMDEyNzI1Ci0KLSNkZWZpbmUgVVNNX0RBVEFfQ01EX1dSSVRFCQkJMHgwMDAxMjcyNgotc3RydWN0IHVzbV9zdHJlYW1fY21kX3dyaXRlIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgYnVmX2FkZHJfbHN3OwotCXUzMiAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKLQl1MzIgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLQl1MzIgICAgICAgICAgICBidWZfc2l6ZTsKLQl1MzIgICAgICAgICAgICBzZXFfaWQ7Ci0JdTMyICAgICAgICAgICAgcmVzMDsKLQl1MzIgICAgICAgICAgICByZXMxOwotCXUzMiAgICAgICAgICAgIHJlczI7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIFVTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkUJCTB4MDAwMTI3MjcKLQotc3RydWN0IHVzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X3VwZGF0ZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiBmb3JtYXRfaWQ7Ci0JLyogPGNmZ19zaXplPiA9IHNpemVvZih1c21fY2ZnX2NvbW1vbikrfHRyYW5zcF9kYXRhfCAqLwotCXUzMiBjZmdfc2l6ZTsKLQlzdHJ1Y3QgdXNtX2NmZ19jb21tb24gY2ZnX2NvbW1vbjsKLQkvKiBUcmFuc3BhcmVudCBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHNwZWNpZmljIGVuY29kZXIgKi8KLQl1OCAgdHJhbnNwX2RhdGFbVVNNX01BWF9DRkdfREFUQV9TSVpFXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB1c21fZW5jb2RlX2NmZ19ibGsgewotCXUzMiBmcmFtZXNfcGVyX2J1ZjsKLQl1MzIgZm9ybWF0X2lkOwotCS8qIDxjZmdfc2l6ZT4gPSBzaXplb2YodXNtX2NmZ19jb21tb24pK3x0cmFuc3BfZGF0YXwgKi8KLQl1MzIgY2ZnX3NpemU7Ci0Jc3RydWN0IHVzbV9jZmdfY29tbW9uIGNmZ19jb21tb247Ci0JLyogVHJhbnNwYXJlbnQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBzcGVjaWZpYyBlbmNvZGVyICovCi0JdTggIHRyYW5zcF9kYXRhW1VTTV9NQVhfQ0ZHX0RBVEFfU0laRV07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdXNtX3N0cmVhbV9jbWRfZW5jZGVjX2NmZ19ibGsgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgcGFyYW1faWQ7Ci0JdTMyIHBhcmFtX3NpemU7Ci0Jc3RydWN0IHVzbV9lbmNvZGVfY2ZnX2JsayBlbmNfYmxrOwotfSBfX3BhY2tlZDsKLQotI2VuZGlmIC8qIF9fQVBSX1VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmggYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4N2I0OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19BVURJT19OT1RJRklFUl9IXwotI2RlZmluZSBfX0FVRElPX05PVElGSUVSX0hfCi0KLS8qIFN0YXRlIG9mIHRoZSBub3RpZmllciBkb21haW4gKi8KLWVudW0gewotCUFVRElPX05PVElGSUVSX1NFUlZJQ0VfRE9XTiwKLQlBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQCi19OwotCi0vKiBTZXJ2aWNlIG9yZGVyIGRldGVybWluZXMgY29ubmVjdGlvbiBwcmlvcml0eQotICogSGlnaGVzdCBudW1iZXIgY29ubmVjdGVkIGZpcnN0Ci0gKi8KLWVudW0gewotCUFVRElPX05PVElGSUVSX1NTUl9TRVJWSUNFLAotCUFVRElPX05PVElGSUVSX1BEUl9TRVJWSUNFLAotCUFVRElPX05PVElGSUVSX01BWF9TRVJWSUNFUwotfTsKLQotZW51bSB7Ci0JQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU4sCi0JQVVESU9fTk9USUZJRVJfTU9ERU1fRE9NQUlOLAotCUFVRElPX05PVElGSUVSX01BWF9ET01BSU5TCi19OwotCi0vKiBTdHJ1Y3R1cmUgcG9wdWxhdGVkIGluIHZvaWQgKmRhdGEgb2YgbmIgZnVuY3Rpb24KLSAqIGNhbGxiYWNrIHVzZWQgZm9yIGF1ZGlvX25vdGlmaWVyX3JlZ2lzdGVyCi0gKi8KLXN0cnVjdCBhdWRpb19ub3RpZmllcl9jYl9kYXRhIHsKLQlpbnQgc2VydmljZTsKLQlpbnQgZG9tYWluOwotfTsKLQotI2lmZGVmIENPTkZJR19NU01fUURTUDZfTk9USUZJRVIKLQotLyoKLSAqIFVzZSBhdWRpb19ub3RpZmllcl9yZWdpc3RlciB0byByZWdpc3RlciBhbnkgYXVkaW8KLSAqIGNsaWVudHMgd2hvIG5lZWQgdG8gYmUgbm90aWZpZWQgb2YgYSByZW1vdGUgcHJvY2Vzcy4KLSAqIFRoaXMgQVBJIHdpbGwgZGV0ZXJtaW5lIGFuZCByZWdpc3RlciB0aGUgY2xpZW50IHdpdGgKLSAqIHRoZSBiZXN0IGF2YWlsYWJsZSBzdWJzeXN0ZW0gKFNTUiBvciBQRFIpIGZvciB0aGF0Ci0gKiBkb21haW4gKEFkc3Agb3IgTW9kZW0pLiBXaGVuIGFuIGV2ZW50IGlzIHNlbnQgZnJvbSB0aGF0Ci0gKiBkb21haW4gdGhlIG5vdGlmaWVyIGJsb2NrIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLgotICoKLSAqIGNsaWVudF9uYW1lIC0gQSB1bmlxdWUgdXNlciBuYW1lIGRlZmluZWQgYnkgdGhlIGNsaWVudC4KLSAqCUlmIHRoZSBzYW1lIG5hbWUgaXMgdXNlZCBmb3IgbXVsdGlwbGUgY2FsbHMgZWFjaCB3aWxsCi0gKgliZSB0cmFja2VkICYgY2FsbGVkIGJhY2sgc2VwYXJhdGVseSBhbmQgYSBzaW5nbGUgY2FsbAotICoJdG8gZGVyZWdpc3RlciB3aWxsIGRlbGV0ZSB0aGVtIGFsbC4KLSAqIGRvbWFpbiAtIERvbWFpbiB0aGUgY2xpZW50IHdhbnRzIHRvIGdldCBldmVudHMgZnJvbS4KLSAqCUFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOCi0gKglBVURJT19OT1RJRklFUl9NT0RFTV9ET01BSU4KLSAqICpuYiAtIFBvaW50ZXIgdG8gYSBub3RpZmllciBibG9jay4gUHJvdmlkZSBhIGNhbGxiYWNrIGZ1bmN0aW9uCi0gKgl0byBiZSBub3RpZmllZCBvZiBhbiBldmVuIG9uIHRoYXQgZG9tYWluLgotICoKLSAqICAgICAgbmJfZnVuYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgb3Bjb2RlLCB2b2lkICpkYXRhKQotICoJCXRoaXMgLSBwb2ludGVyIHRvIG93biBuYgotICoJCW9wY29kZSAtIGV2ZW50IGZyb20gcmVnaXN0ZXJlZCBkb21haW4KLSAqCQkJQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOCi0gKgkJCUFVRElPX05PVElGSUVSX1NFUlZJQ0VfVVAKLSAqCQkqZGF0YSAtIHBvaW50ZXIgdG8gc3RydWN0IGF1ZGlvX25vdGlmaWVyX2NiX2RhdGEKLSAqCi0gKiBSZXR1cm5zOglTdWNjZXNzOiAwCi0gKgkJRXJyb3I6IC0jCi0gKi8KLWludCBhdWRpb19ub3RpZmllcl9yZWdpc3RlcihjaGFyICpjbGllbnRfbmFtZSwgaW50IGRvbWFpbiwKLQkJCSAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKLQotLyoKLSAqIFVzZSBhdWRpb19ub3RpZmllcl9kZXJlZ2lzdGVyIHRvIGRlcmVnaXN0ZXIgdGhlIGNsaWVudHMgZnJvbQotICogYWxsIGRvbWFpbnMgcmVnaXN0ZXJlZCB1c2luZyBhdWRpb19ub3RpZmllcl9yZWdpc3RlciB0aGF0Ci0gKiBtYXRjaCB0aGUgY2xpZW50IG5hbWUuCi0gKgotICogY2xpZW50X25hbWUgLSBVbmlxdWUgdXNlciBuYW1lIHVzZWQgaW4gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIuCi0gKiBSZXR1cm5zOglTdWNjZXNzOiAwCi0gKgkJRXJyb3I6IC0jCi0gKi8KLWludCBhdWRpb19ub3RpZmllcl9kZXJlZ2lzdGVyKGNoYXIgKmNsaWVudF9uYW1lKTsKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSBpbnQgYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoY2hhciAqY2xpZW50X25hbWUsIGludCBkb21haW4sCi0JCQkJCSAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXVkaW9fbm90aWZpZXJfZGVyZWdpc3RlcihjaGFyICpjbGllbnRfbmFtZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19NU01fUURTUDZfUERSICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Bkci5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Bkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmZkMzY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hdWRpb19wZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FVRElPX1BEUl9IXwotI2RlZmluZSBfX0FVRElPX1BEUl9IXwotCi1lbnVtIHsKLQlBVURJT19QRFJfRE9NQUlOX0FEU1AsCi0JQVVESU9fUERSX0RPTUFJTl9NQVgKLX07Ci0KLWVudW0gewotCUFVRElPX1BEUl9GUkFNRVdPUktfRE9XTiwKLQlBVURJT19QRFJfRlJBTUVXT1JLX1VQCi19OwotCi0jaWZkZWYgQ09ORklHX01TTV9RRFNQNl9QRFIKLQotLyoKLSAqIFVzZSBhdWRpb19wZHJfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgUERSIHN1YnN5c3RlbSB0aGlzCi0gKiBzaG91bGQgYmUgZG9uZSBiZWZvcmUgbW9kdWxlIGxhdGUgaW5pdCBvdGhlcndpc2Ugbm90aWZpY2F0aW9uCi0gKiBvZiB0aGUgQVVESU9fUERSX0ZSQU1FV09SS19VUCBjYW5ub3QgYmUgZ3VhcmFudGVlZC4KLSAqCi0gKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgdG8gYmUgbm90aWZpZWQgb25jZSB0aGUgUERSIGZyYW1ld29yayBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAqICAgICAgIENhbGxiYWNrIHdpbGwgcmVjZWl2ZSBlaXRoZXIgdGhlIEFVRElPX1BEUl9GUkFNRVdPUktfRE9XTgotICogICAgICAgb3IgQVVESU9fUERSX0ZSQU1FV09SS19VUCBpb2N0bCBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mCi0gKiAgICAgICB0aGUgUERSIGZyYW1ld29yay4KLSAqCi0gKiBSZXR1cm5zOiBTdWNjZXNzOiAwCi0gKiAgICAgICAgICBGYWlsdXJlOiBFcnJvciBjb2RlCi0gKi8KLWludCBhdWRpb19wZHJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Ci0KLS8qCi0gKiBVc2UgYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgd2l0aCBhIFBEUiBzZXJ2aWNlCi0gKiBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIG5iIGNhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aAotICogYXVkaW9fcGRyX3JlZ2lzdGVyIGhhcyBiZWVuIGNhbGxlZCBiYWNrIHdpdGggdGhlCi0gKiBBVURJT19QRFJfRlJBTUVXT1JLX1VQIGlvY3RsLgotICoKLSAqIGRvbWFpbl9pZCAtIERvbWFpbiB0byB1c2UsIGV4YW1wbGU6IEFVRElPX1BEUl9BRFNQCi0gKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIHRoZSBzdGF0ZSBvZiB0aGUgZG9tYWluCi0gKiAgICAgICByZXF1ZXN0ZWQuIFRoZSBpb2N0bHMgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGFyZQotICogICAgICAgZGVmaW5lZCBpbiBzZXJ2aWNlLW5vdGlmaWVyLmguCi0gKgotICogUmV0dXJuczogU3VjY2VzczogQ2xpZW50IGhhbmRsZQotICogICAgICAgICAgRmFpbHVyZTogUG9pbnRlciBlcnJvciBjb2RlCi0gKi8KLXZvaWQgKmF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyKGludCBkb21haW5faWQsCi0JCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIGludCAqY3Vycl9zdGF0ZSk7Ci0KLS8qCi0gKiBVc2UgYXVkaW9fcGRyX3NlcnZpY2VfZGVyZWdpc3RlciB0byBkZXJlZ2lzdGVyIHdpdGggYSBQRFIKLSAqIHNlcnZpY2UgdGhhdCB3YXMgcmVnaXN0ZXJlZCB1c2luZyB0aGUgYXVkaW9fcGRyX3NlcnZpY2VfcmVnaXN0ZXIKLSAqIEFQSS4KLSAqCi0gKiAqc2VydmljZV9oYW5kbGUgLSBTZXJ2aWNlIGhhbmRsZSByZXR1cm5lZCBieSBhdWRpb19wZHJfc2VydmljZV9yZWdpc3RlcgotICogKm5iIC0gUG9pbnRlciB0byB0aGUgbm90aWZpZXIgYmxvY2suIFVzZWQgaW4gdGhlIGNhbGwgdG8KLSAqICAgICAgIGF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyLgotICoKLSAqIFJldHVybnM6IFN1Y2Nlc3M6IENsaWVudCBoYW5kbGUKLSAqICAgICAgICAgIEZhaWx1cmU6IEVycm9yIGNvZGUKLSAqLwotaW50IGF1ZGlvX3Bkcl9zZXJ2aWNlX2RlcmVnaXN0ZXIodm9pZCAqc2VydmljZV9oYW5kbGUsCi0JCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIGludCBhdWRpb19wZHJfcmVnaXN0ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmF1ZGlvX3Bkcl9zZXJ2aWNlX3JlZ2lzdGVyKGludCBkb21haW5faWQsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCQkgICAgICAgaW50ICpjdXJyX3N0YXRlKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhdWRpb19wZHJfc2VydmljZV9kZXJlZ2lzdGVyKHZvaWQgKnNlcnZpY2VfaGFuZGxlLAotCQkJCQkgICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19NU01fUURTUDZfUERSICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL2F1ZGlvX3Nzci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3MDIxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9hdWRpb19zc3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FVRElPX1NTUl9IXwotI2RlZmluZSBfX0FVRElPX1NTUl9IXwotCi1lbnVtIHsKLQlBVURJT19TU1JfRE9NQUlOX0FEU1AsCi0JQVVESU9fU1NSX0RPTUFJTl9NT0RFTSwKLQlBVURJT19TU1JfRE9NQUlOX01BWAotfTsKLQotI2lmZGVmIENPTkZJR19NU01fUURTUDZfU1NSCi0KLS8qCi0gKiBVc2UgYXVkaW9fc3NyX3JlZ2lzdGVyIHRvIHJlZ2lzdGVyIHdpdGggdGhlIFNTUiBzdWJzeXN0ZW0KLSAqCi0gKiBkb21haW5faWQgLSBTZXJ2aWNlIHRvIHVzZSwgZXhhbXBsZTogQVVESU9fU1NSX0RPTUFJTl9BRFNQCi0gKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIFByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgotICogICAgICAgdG8gYmUgbm90aWZpZWQgb2YgYW4gZXZlbnQgZm9yIHRoYXQgc2VydmljZS4gVGhlIGlvY3RscwotICogICAgICAgdXNlZCBieSB0aGUgY2FsbGJhY2sgYXJlIGRlZmluZWQgaW4gc3Vic3lzdGVtX25vdGlmLmguCi0gKgotICogUmV0dXJuczogU3VjY2VzczogQ2xpZW50IGhhbmRsZQotICogICAgICAgICAgRmFpbHVyZTogUG9pbnRlciBlcnJvciBjb2RlCi0gKi8KLXZvaWQgKmF1ZGlvX3Nzcl9yZWdpc3RlcihpbnQgZG9tYWluX2lkLCBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKLQotLyoKLSAqIFVzZSBhdWRpb19zc3JfZGVyZWdpc3RlciB0byByZWdpc3RlciB3aXRoIHRoZSBTU1Igc3Vic3lzdGVtCi0gKgotICogaGFuZGxlIC0gSGFuZGxlIHJlY2VpdmVkIGZyb20gYXVkaW9fc3NyX3JlZ2lzdGVyCi0gKiAqbmIgLSBQb2ludGVyIHRvIGEgbm90aWZpZXIgYmxvY2suIENhbGxiYWNrIGZ1bmN0aW9uCi0gKiAgICAgICBVc2VkIGZyb20gYXVkaW9fc3NyX3JlZ2lzdGVyLgotICoKLSAqIFJldHVybnM6IFN1Y2Nlc3M6IDAKLSAqICAgICAgICAgIEZhaWx1cmU6IEVycm9yIGNvZGUKLSAqLwotaW50IGF1ZGlvX3Nzcl9kZXJlZ2lzdGVyKHZvaWQgKmhhbmRsZSwgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Ci0KLQotLyoKLSAqIFVzZSBhdWRpb19zc3Jfc2VuZF9ubWkgdG8gZm9yY2UgYSBSQU0gZHVtcCBvbiBBRFNQCi0gKiBkb3duIGV2ZW50LgotICoKLSAqICpzc3JfY2JfZGF0YSAtICpkYXRhIHJlY2VpdmVkIGZyb20gbm90aWZpZXIgY2FsbGJhY2sKLSAqLwotdm9pZCBhdWRpb19zc3Jfc2VuZF9ubWkodm9pZCAqc3NyX2NiX2RhdGEpOwotCi0jZWxzZQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmF1ZGlvX3Nzcl9yZWdpc3RlcihpbnQgZG9tYWluX2lkLAotCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQotewotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhdWRpb19zc3JfZGVyZWdpc3Rlcih2b2lkICpoYW5kbGUsIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdWRpb19zc3Jfc2VuZF9ubWkodm9pZCAqc3NyX2NiX2RhdGEpCi17Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTVNNX1FEU1A2X1NTUiAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9ydGFjLmggYi9pbmNsdWRlL2xpbnV4L3Fkc3A2djIvcnRhYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWVhMGViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi9ydGFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEzLTIwMTUsIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fUlRBQ19IX18KLSNkZWZpbmUgX19SVEFDX0hfXwotCi0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0KLS8qIFZvaWNlIE1vZGVzICovCi0jZGVmaW5lIFJUQUNfQ1ZQCQkwCi0jZGVmaW5lIFJUQUNfQ1ZTCQkxCi0jZGVmaW5lIFJUQUNfVk9JQ0VfTU9ERVMJMgotCi0jZGVmaW5lIFJUQUNfTUFYX0FDVElWRV9ERVZJQ0VTCQk0Ci0jZGVmaW5lIFJUQUNfTUFYX0FDVElWRV9QT1BQCQk4Ci0KLSNkZWZpbmUgREVGQVVMVF9BUFBfVFlQRQkweDAwMDExMTMwCi0KLWVudW0gewotCUFETV9SVEFDX0NBTCwKLQlBU01fUlRBQ19DQUwsCi0JVk9JQ0VfUlRBQ19DQUwsCi0JQUZFX1JUQUNfQ0FMLAotCU1BWF9SVEFDX0JMT0NLUwotfTsKLQotc3RydWN0IHJ0YWNfY2FsX21lbV9tYXBfZGF0YSB7Ci0JdWludDMyX3QJCW1hcF9zaXplOwotCXVpbnQzMl90CQltYXBfaGFuZGxlOwotCXN0cnVjdCBpb25fY2xpZW50CSppb25fY2xpZW50OwotCXN0cnVjdCBpb25faGFuZGxlCSppb25faGFuZGxlOwotfTsKLQotc3RydWN0IHJ0YWNfY2FsX2RhdGEgewotCXNpemVfdAkJCXNpemU7Ci0Jdm9pZAkJCSprdmFkZHI7Ci0JcGh5c19hZGRyX3QJCXBhZGRyOwotfTsKLQotc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEgewotCXN0cnVjdCBydGFjX2NhbF9tZW1fbWFwX2RhdGEJbWFwX2RhdGE7Ci0Jc3RydWN0IHJ0YWNfY2FsX2RhdGEJCWNhbF9kYXRhOwotfTsKLQotc3RydWN0IHJ0YWNfcG9wcF9kYXRhIHsKLQl1aW50MzJfdAlwb3BwOwotCXVpbnQzMl90CXBvcHBfdG9wb2xvZ3k7Ci0JdWludDMyX3QJYXBwX3R5cGU7Ci19OwotCi1zdHJ1Y3QgcnRhY19hZG1fZGF0YSB7Ci0JdWludDMyX3QJCXRvcG9sb2d5X2lkOwotCXVpbnQzMl90CQlhZmVfdG9wb2xvZ3k7Ci0JdWludDMyX3QJCWFmZV9wb3J0OwotCXVpbnQzMl90CQljb3BwOwotCXVpbnQzMl90CQludW1fb2ZfcG9wcDsKLQl1aW50MzJfdAkJYXBwX3R5cGU7Ci0JdWludDMyX3QJCWFjZGJfZGV2X2lkOwotCXN0cnVjdCBydGFjX3BvcHBfZGF0YQlwb3BwW1JUQUNfTUFYX0FDVElWRV9QT1BQXTsKLX07Ci0KLXN0cnVjdCBydGFjX2FkbSB7Ci0JdWludDMyX3QJCQludW1fb2ZfZGV2OwotCXN0cnVjdCBydGFjX2FkbV9kYXRhCQlkZXZpY2VbUlRBQ19NQVhfQUNUSVZFX0RFVklDRVNdOwotfTsKLQotdm9pZCBydGFjX2FkZF9hZG1fZGV2aWNlKHUzMiBwb3J0X2lkLCB1MzIgY29wcF9pZCwgdTMyIHBhdGhfaWQsIHUzMiBwb3BwX2lkLAotCQkJdTMyIGFwcF90eXBlLCB1MzIgYWNkYl9kZXZfaWQpOwotdm9pZCBydGFjX3JlbW92ZV9hZG1fZGV2aWNlKHUzMiBwb3J0X2lkLCB1MzIgY29wcF9pZCk7Ci12b2lkIHJ0YWNfcmVtb3ZlX3BvcHBfZnJvbV9hZG1fZGV2aWNlcyh1MzIgcG9wcF9pZCk7Ci12b2lkIHJ0YWNfYWRkX3ZvaWNlKHUzMiBjdnNfaGFuZGxlLCB1MzIgY3ZwX2hhbmRsZSwgdTMyIHJ4X2FmZV9wb3J0LAotCXUzMiB0eF9hZmVfcG9ydCwgdTMyIHJ4X2FjZGJfaWQsIHUzMiB0eF9hY2RiX2lkLCB1MzIgc2Vzc2lvbl9pZCk7Ci12b2lkIHJ0YWNfcmVtb3ZlX3ZvaWNlKHUzMiBjdnNfaGFuZGxlKTsKLXZvaWQgcnRhY19zZXRfYWRtX2hhbmRsZSh2b2lkICpoYW5kbGUpOwotYm9vbCBydGFjX21ha2VfYWRtX2NhbGxiYWNrKHVpbnQzMl90ICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKTsKLXZvaWQgcnRhY19jb3B5X2FkbV9wYXlsb2FkX3RvX3VzZXIodm9pZCAqcGF5bG9hZCwgdTMyIHBheWxvYWRfc2l6ZSk7Ci12b2lkIHJ0YWNfc2V0X2FzbV9oYW5kbGUodTMyIHNlc3Npb25faWQsIHZvaWQgKmhhbmRsZSk7Ci1ib29sIHJ0YWNfbWFrZV9hc21fY2FsbGJhY2sodTMyIHNlc3Npb25faWQsIHVpbnQzMl90ICpwYXlsb2FkLAotCXUzMiBwYXlsb2FkX3NpemUpOwotdm9pZCBydGFjX2NvcHlfYXNtX3BheWxvYWRfdG9fdXNlcih2b2lkICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKTsKLXZvaWQgcnRhY19zZXRfdm9pY2VfaGFuZGxlKHUzMiBtb2RlLCB2b2lkICpoYW5kbGUpOwotYm9vbCBydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2sodTMyIG1vZGUsIHVpbnQzMl90ICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKTsKLXZvaWQgcnRhY19jb3B5X3ZvaWNlX3BheWxvYWRfdG9fdXNlcih2b2lkICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKTsKLWludCBydGFjX2NsZWFyX21hcHBpbmcodWludDMyX3QgY2FsX3R5cGUpOwotYm9vbCBydGFjX21ha2VfYWZlX2NhbGxiYWNrKHVpbnQzMl90ICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKTsKLXZvaWQgcnRhY19zZXRfYWZlX2hhbmRsZSh2b2lkICpoYW5kbGUpOwotdm9pZCBnZXRfcnRhY19hZG1fZGF0YShzdHJ1Y3QgcnRhY19hZG0gKmFkbV9kYXRhKTsKLXZvaWQgcnRhY191cGRhdGVfYWZlX3RvcG9sb2d5KHUzMiBwb3J0X2lkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZHNwNnYyL3VzZi5oIGIvaW5jbHVkZS9saW51eC9xZHNwNnYyL3VzZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRiNjI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcWRzcDZ2Mi91c2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX1VTRl9IX18KLSNkZWZpbmUgX19VU0ZfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgVVNGX0lPQ1RMX01BR0lDICdVJwotCi0jZGVmaW5lIFVTX1NFVF9UWF9JTkZPICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDAsIFwKLQkJCQlzdHJ1Y3QgdXNfdHhfaW5mb190eXBlKQotI2RlZmluZSBVU19TVEFSVF9UWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDEpCi0jZGVmaW5lIFVTX0dFVF9UWF9VUERBVEUgX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCAyLCBcCi0JCQkJc3RydWN0IHVzX3R4X3VwZGF0ZV9pbmZvX3R5cGUpCi0jZGVmaW5lIFVTX1NFVF9SWF9JTkZPICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDMsIFwKLQkJCQlzdHJ1Y3QgdXNfcnhfaW5mb190eXBlKQotI2RlZmluZSBVU19TRVRfUlhfVVBEQVRFIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgNCwgXAotCQkJCXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlKQotI2RlZmluZSBVU19TVEFSVF9SWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDUpCi0KLSNkZWZpbmUgVVNfU1RPUF9UWCAgICAgIF9JTyhVU0ZfSU9DVExfTUFHSUMsIDYpCi0jZGVmaW5lIFVTX1NUT1BfUlggICAgICBfSU8oVVNGX0lPQ1RMX01BR0lDLCA3KQotCi0jZGVmaW5lIFVTX1NFVF9ERVRFQ1RJT04gX0lPV1IoVVNGX0lPQ1RMX01BR0lDLCA4LCBcCi0JCQkJc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUpCi0KLSNkZWZpbmUgVVNfR0VUX1ZFUlNJT04gIF9JT1dSKFVTRl9JT0NUTF9NQUdJQywgOSwgXAotCQkJCXN0cnVjdCB1c192ZXJzaW9uX2luZm9fdHlwZSkKLQotI2RlZmluZSBVU19TRVRfVFhfU1RSRUFNX1BBUkFNICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEwLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQotI2RlZmluZSBVU19HRVRfVFhfU1RSRUFNX1BBUkFNICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDExLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQotI2RlZmluZSBVU19TRVRfUlhfU1RSRUFNX1BBUkFNICAgX0lPVyhVU0ZfSU9DVExfTUFHSUMsIDEyLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQotI2RlZmluZSBVU19HRVRfUlhfU1RSRUFNX1BBUkFNICBfSU9XUihVU0ZfSU9DVExfTUFHSUMsIDEzLCBcCi0JCQkJc3RydWN0IHVzX3N0cmVhbV9wYXJhbV90eXBlKQotCi0vKiBTcGVjaWFsIHRpbWVvdXQgdmFsdWVzICovCi0jZGVmaW5lIFVTRl9OT19XQUlUX1RJTUVPVVQJMHgwMDAwMDAwMAotLyogSW5maW5pdGl2ZSAqLwotI2RlZmluZSBVU0ZfSU5GSU5JVElWRV9USU1FT1VUCTB4ZmZmZmZmZmYKLS8qIERlZmF1bHQgdmFsdWUsIHVzZWQgYnkgdGhlIGRyaXZlciAqLwotI2RlZmluZSBVU0ZfREVGQVVMVF9USU1FT1VUCTB4ZmZmZmZmZmUKLQotLyogVVMgZGV0ZWN0aW9uIHBsYWNlIChIV3xGVykgKi8KLWVudW0gdXNfZGV0ZWN0X3BsYWNlX2VudW0gewotLyogVVMgaXMgZGV0ZWN0ZWQgaW4gSFcgKi8KLQlVU19ERVRFQ1RfSFcsCi0vKiBVUyBpcyBkZXRlY3RlZCBpbiBGVyAqLwotCVVTX0RFVEVDVF9GVwotfTsKLQotLyogVVMgZGV0ZWN0aW9uIG1vZGUgKi8KLWVudW0gdXNfZGV0ZWN0X21vZGVfZW51bSB7Ci0vKiBVUyBkZXRlY3Rpb24gaXMgZGlzYWJsZWQgKi8KLQlVU19ERVRFQ1RfRElTQUJMRURfTU9ERSwKLS8qIFVTIGRldGVjdGlvbiBpcyBlbmFibGVkIGluIGNvbnRpbnVlIG1vZGUgKi8KLQlVU19ERVRFQ1RfQ09OVElOVUVfTU9ERSwKLS8qIFVTIGRldGVjdGlvbiBpcyBlbmFibGVkIGluIG9uZSBzaG90IG1vZGUgKi8KLQlVU19ERVRFQ1RfU0hPVF9NT0RFCi19OwotCi0vKiBFbmNvZGVyIChUWCksIGRlY29kZXIgKFJYKSBzdXBwb3J0ZWQgVVMgZGF0YSBmb3JtYXRzICovCi0jZGVmaW5lIFVTRl9QT0lOVF9FUE9TX0ZPUk1BVAkwCi0jZGVmaW5lIFVTRl9SQVdfRk9STUFUCQkxCi0KLS8qIEluZGV4ZXMgb2YgZXZlbnQgdHlwZXMsIHByb2R1Y2VkIGJ5IHRoZSBjYWxjdWxhdG9ycyAqLwotI2RlZmluZSBVU0ZfVFNDX0VWRU5UX0lORCAgICAgIDAKLSNkZWZpbmUgVVNGX1RTQ19QVFJfRVZFTlRfSU5EICAxCi0jZGVmaW5lIFVTRl9NT1VTRV9FVkVOVF9JTkQgICAgMgotI2RlZmluZSBVU0ZfS0VZQk9BUkRfRVZFTlRfSU5EIDMKLSNkZWZpbmUgVVNGX1RTQ19FWFRfRVZFTlRfSU5EICA0Ci0jZGVmaW5lIFVTRl9NQVhfRVZFTlRfSU5EICAgICAgNQotCi0vKiBUeXBlcyBvZiBldmVudHMsIHByb2R1Y2VkIGJ5IHRoZSBjYWxjdWxhdG9ycyAqLwotI2RlZmluZSBVU0ZfTk9fRVZFTlQgMAotI2RlZmluZSBVU0ZfVFNDX0VWRU5UICAgICAgKDEgPDwgVVNGX1RTQ19FVkVOVF9JTkQpCi0jZGVmaW5lIFVTRl9UU0NfUFRSX0VWRU5UICAoMSA8PCBVU0ZfVFNDX1BUUl9FVkVOVF9JTkQpCi0jZGVmaW5lIFVTRl9NT1VTRV9FVkVOVCAgICAoMSA8PCBVU0ZfTU9VU0VfRVZFTlRfSU5EKQotI2RlZmluZSBVU0ZfS0VZQk9BUkRfRVZFTlQgKDEgPDwgVVNGX0tFWUJPQVJEX0VWRU5UX0lORCkKLSNkZWZpbmUgVVNGX1RTQ19FWFRfRVZFTlQgICgxIDw8IFVTRl9UU0NfRVhUX0VWRU5UX0lORCkKLSNkZWZpbmUgVVNGX0FMTF9FVkVOVFMgICAgICAgICAoVVNGX1RTQ19FVkVOVCB8XAotCQkJCVVTRl9UU0NfUFRSX0VWRU5UIHxcCi0JCQkJVVNGX01PVVNFX0VWRU5UIHxcCi0JCQkJVVNGX0tFWUJPQVJEX0VWRU5UIHxcCi0JCQkJVVNGX1RTQ19FWFRfRVZFTlQpCi0KLS8qIG1pbiwgbWF4IGFycmF5IGRpbWVuc2lvbiAqLwotI2RlZmluZSBNSU5fTUFYX0RJTSAyCi0KLS8qIGNvb3JkaW5hdGVzICh4LHkseikgYXJyYXkgZGltZW5zaW9uICovCi0jZGVmaW5lIENPT1JESU5BVEVTX0RJTSAzCi0KLS8qIHRpbHRzICh4LHkpIGFycmF5IGRpbWVuc2lvbiAqLwotI2RlZmluZSBUSUxUU19ESU0gMgotCi0vKiBNYXggc2l6ZSBvZiB0aGUgY2xpZW50IG5hbWUgKi8KLSNkZWZpbmUgVVNGX01BWF9DTElFTlRfTkFNRV9TSVpFCTIwCi0KLS8qIE1heCBudW1iZXIgb2YgdGhlIHBvcnRzIChtaWNzL3NwZWFrZXJzKSAqLwotI2RlZmluZSBVU0ZfTUFYX1BPUlRfTlVNICAgICAgICAgICAgICAgIDgKLQotLyogSW5mbyBzdHJ1Y3R1cmUgY29tbW9uIGZvciBUWCBhbmQgUlggKi8KLXN0cnVjdCB1c194eF9pbmZvX3R5cGUgewotLyogSW5wdXQ6ICBnZW5lcmFsIGluZm8gKi8KLS8qIE5hbWUgb2YgdGhlIGNsaWVudCAtIGV2ZW50IGNhbGN1bGF0b3IgKi8KLQljb25zdCBjaGFyIF9fdXNlciAqY2xpZW50X25hbWU7Ci0vKiBTZWxlY3RlZCBkZXZpY2UgaWRlbnRpZmljYXRpb24sIGFjY2VwdGVkIGluIHRoZSBrZXJuZWwncyBDQUQgKi8KLQl1aW50MzJfdCBkZXZfaWQ7Ci0vKiAwIC0gcG9pbnRfZXBvcyB0eXBlOyAoZS5nLiAxIC0gZ3JfbW1yZCkgKi8KLQl1aW50MzJfdCBzdHJlYW1fZm9ybWF0OwotLyogUmVxdWlyZWQgc2FtcGxlIHJhdGUgaW4gSHogKi8KLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLS8qIFNpemUgb2YgYSBidWZmZXIgKGJ5dGVzKSBmb3IgVVMgZGF0YSB0cmFuc2ZlciBiZXR3ZWVuIHRoZSBtb2R1bGUgYW5kIFVTRiAqLwotCXVpbnQzMl90IGJ1Zl9zaXplOwotLyogTnVtYmVyIG9mIHRoZSBidWZmZXJzIGZvciB0aGUgVVMgZGF0YSB0cmFuc2ZlciAqLwotCXVpbnQxNl90IGJ1Zl9udW07Ci0vKiBOdW1iZXIgb2YgdGhlIG1pY3JvcGhvbmVzIChUWCkgb3Igc3BlYWtlcnMoUlgpICovCi0JdWludDE2X3QgcG9ydF9jbnQ7Ci0vKiBNaWNyb3Bob25lcyhUWCkgb3Igc3BlYWtlcnMoUlgpIGluZGV4ZXMgaW4gdGhlaXIgZW51bWVyYXRpb24gKi8KLQl1aW50OF90ICBwb3J0X2lkW1VTRl9NQVhfUE9SVF9OVU1dOwotLyogQml0cyBwZXIgc2FtcGxlIDE2IG9yIDMyICovCi0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlOwotLyogSW5wdXQ6ICBUcmFuc3BhcmVudCBpbmZvIGZvciBlbmNvZGVyIGluIHRoZSBMUEFTUyAqLwotLyogUGFyYW1ldGVycyBkYXRhIHNpemUgaW4gYnl0ZXMgKi8KLQl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOwotLyogUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyAqLwotCXVpbnQ4X3QgX191c2VyICpwYXJhbXNfZGF0YTsKLS8qIE1heCBzaXplIG9mIGJ1ZmZlciBmb3IgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyICovCi0JdWludDMyX3QgbWF4X2dldF9zZXRfcGFyYW1fYnVmX3NpemU7Ci19OwotCi1zdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlIHsKLQkvKiBUb3VjaCBzY3JlZW4gZGltZW5zaW9uczogbWluICYgbWF4O2ZvciBpbnB1dCBtb2R1bGUgKi8KLQlpbnQgdHNjX3hfZGltW01JTl9NQVhfRElNXTsKLQlpbnQgdHNjX3lfZGltW01JTl9NQVhfRElNXTsKLQlpbnQgdHNjX3pfZGltW01JTl9NQVhfRElNXTsKLQkvKiBUb3VjaCBzY3JlZW4gdGlsdCBkaW1lbnNpb25zOiBtaW4gJiBtYXg7Zm9yIGlucHV0IG1vZHVsZSAqLwotCWludCB0c2NfeF90aWx0W01JTl9NQVhfRElNXTsKLQlpbnQgdHNjX3lfdGlsdFtNSU5fTUFYX0RJTV07Ci0JLyogVG91Y2ggc2NyZWVuIHByZXNzdXJlIGxpbWl0czogbWluICYgbWF4OyBmb3IgaW5wdXQgbW9kdWxlICovCi0JaW50IHRzY19wcmVzc3VyZVtNSU5fTUFYX0RJTV07Ci0JLyogVGhlIHJlcXVlc3RlZCBidXR0b25zIGJpdG1hcCAqLwotCXVpbnQxNl90IHJlcV9idXR0b25zX2JpdG1hcDsKLQkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIChVU0ZfWF9FVkVOVCksIHByb2R1Y2VkIGJ5IGNhbGN1bGF0b3IgKi8KLQl1aW50MTZfdCBldmVudF90eXBlczsKLQkvKiBCaXRtYXAgb2YgdHlwZXMgb2YgZXZlbnRzIGZyb20gZGV2cywgY29uZmxpY3Rpbmcgd2l0aCBVU0YgKi8KLQl1aW50MTZfdCBjb25mbGljdGluZ19ldmVudF90eXBlczsKLX07Ci0KLXN0cnVjdCB1c190eF9pbmZvX3R5cGUgewotCS8qIENvbW1vbiBpbmZvICovCi0Jc3RydWN0IHVzX3h4X2luZm9fdHlwZSB1c194eF9pbmZvOwotCS8qIEluZm8gc3BlY2lmaWMgZm9yIFRYKi8KLQlzdHJ1Y3QgdXNfaW5wdXRfaW5mb190eXBlIGlucHV0X2luZm87Ci19OwotCi1zdHJ1Y3QgdXNfcnhfaW5mb190eXBlIHsKLQkvKiBDb21tb24gaW5mbyAqLwotCXN0cnVjdCB1c194eF9pbmZvX3R5cGUgdXNfeHhfaW5mbzsKLQkvKiBJbmZvIHNwZWNpZmljIGZvciBSWCovCi19OwotCi1zdHJ1Y3QgcG9pbnRfZXZlbnRfdHlwZSB7Ci0vKiBQZW4gY29vcmRpbmF0ZXMgKHgsIHksIHopIGluIHVuaXRzLCBkZWZpbmVkIGJ5IDxjb29yZGluYXRlc190eXBlPiAgKi8KLQlpbnQgY29vcmRpbmF0ZXNbQ09PUkRJTkFURVNfRElNXTsKLQkvKiB7eDt5fSAgaW4gdHJhbnNwYXJlbnQgdW5pdHMgKi8KLQlpbnQgaW5jbGluYXRpb25zW1RJTFRTX0RJTV07Ci0vKiBbMC0xMDIzXSAoMTBiaXRzKTsgMCAtIHBlbiB1cCAqLwotCXVpbnQzMl90IHByZXNzdXJlOwotLyogQml0bWFwIGZvciBidXR0b24gc3RhdGUuIDEgLSBkb3duLCAwIC0gdXAgKi8KLQl1aW50MTZfdCBidXR0b25zX3N0YXRlX2JpdG1hcDsKLX07Ci0KLS8qIE1vdXNlIGJ1dHRvbnMsIHN1cHBvcnRlZCBieSBVU0YgKi8KLSNkZWZpbmUgVVNGX0JVVFRPTl9MRUZUX01BU0sgICAxCi0jZGVmaW5lIFVTRl9CVVRUT05fTUlERExFX01BU0sgMgotI2RlZmluZSBVU0ZfQlVUVE9OX1JJR0hUX01BU0sgIDQKLXN0cnVjdCBtb3VzZV9ldmVudF90eXBlIHsKLS8qIFRoZSBtb3VzZSByZWxhdGl2ZSBtb3ZlbWVudCAoZFgsIGRZLCBkWikgKi8KLQlpbnQgcmVsc1tDT09SRElOQVRFU19ESU1dOwotLyogQml0bWFwIG9mIG1vdXNlIGJ1dHRvbnMgc3RhdGVzOiAxIC0gZG93biwgMCAtIHVwOyAqLwotCXVpbnQxNl90IGJ1dHRvbnNfc3RhdGVzOwotfTsKLQotc3RydWN0IGtleV9ldmVudF90eXBlIHsKLS8qICBDYWxjdWxhdGVkIE1TIGtleS0gc2VlIGlucHV0LmguICovCi0JdWludDMyX3Qga2V5OwotLyogS2V5Ym9hcmQncyBrZXkgc3RhdGU6IDEgLSBkb3duLCAwIC0gdXA7ICovCi0JdWludDhfdCBrZXlfc3RhdGU7Ci19OwotCi1zdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgewotLyogRXZlbnQgc2VxdWVuY2UgbnVtYmVyICovCi0JdWludDMyX3Qgc2VxX251bTsKLS8qIEV2ZW50IGdlbmVyYXRpb24gc3lzdGVtIHRpbWUgKi8KLQl1aW50MzJfdCB0aW1lc3RhbXA7Ci0vKiBEZXN0aW5hdGlvbiBpbnB1dCBldmVudCB0eXBlIGluZGV4IChlLmcuIHRvdWNoIHNjcmVlbiwgbW91c2UsIGtleSkgKi8KLQl1aW50MTZfdCBldmVudF90eXBlX2luZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBwb2ludF9ldmVudF90eXBlIHBvaW50X2V2ZW50OwotCQlzdHJ1Y3QgbW91c2VfZXZlbnRfdHlwZSBtb3VzZV9ldmVudDsKLQkJc3RydWN0IGtleV9ldmVudF90eXBlICAga2V5X2V2ZW50OwotCX0gZXZlbnRfZGF0YTsKLX07Ci0KLXN0cnVjdCB1c190eF91cGRhdGVfaW5mb190eXBlIHsKLS8qIElucHV0ICBnZW5lcmFsOiAqLwotLyogTnVtYmVyIG9mIGNhbGN1bGF0ZWQgZXZlbnRzICovCi0JdWludDE2X3QgZXZlbnRfY291bnRlcjsKLS8qIENhbGN1bGF0ZWQgZXZlbnRzIG9yIE5VTEwgKi8KLQlzdHJ1Y3QgdXNmX2V2ZW50X3R5cGUgX191c2VyICpldmVudDsKLS8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLwotLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLwotCXVpbnQzMl90IGZyZWVfcmVnaW9uOwotLyogVGltZSAoc2VjKSB0byB3YWl0IGZvciBkYXRhIG9yIHNwZWNpYWwgdmFsdWVzOiAqLwotLyogVVNGX05PX1dBSVRfVElNRU9VVCwgVVNGX0lORklOSVRJVkVfVElNRU9VVCwgVVNGX0RFRkFVTFRfVElNRU9VVCAqLwotCXVpbnQzMl90IHRpbWVvdXQ7Ci0vKiBFdmVudHMgKGZyb20gY29uZmxpY3RpbmcgZGV2cykgdG8gYmUgZGlzYWJsZWQvZW5hYmxlZCAqLwotCXVpbnQxNl90IGV2ZW50X2ZpbHRlcnM7Ci0KLS8qIElucHV0ICB0cmFuc3BhcmVudCBkYXRhOiAqLwotLyogUGFyYW1ldGVycyBzaXplICovCi0JdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKLS8qIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgKi8KLQl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7Ci0vKiBPdXRwdXQgcGFyYW1ldGVyczogKi8KLS8qIFBvaW50ZXIgKHdyaXRlIGluZGV4KSB0byB0aGUgZW5kIG9mIHJlYWR5IFVTIGRhdGEgcmVnaW9uICovCi0vKiBpbiB0aGUgc2hhcmVkIG1lbW9yeSAqLwotCXVpbnQzMl90IHJlYWR5X3JlZ2lvbjsKLX07Ci0KLXN0cnVjdCB1c19yeF91cGRhdGVfaW5mb190eXBlIHsKLS8qIElucHV0ICBnZW5lcmFsOiAqLwotLyogUG9pbnRlciAod3JpdGUgaW5kZXgpIHRvIHRoZSBlbmQgb2YgcmVhZHkgVVMgZGF0YSByZWdpb24gKi8KLS8qIGluIHRoZSBzaGFyZWQgbWVtb3J5ICovCi0JdWludDMyX3QgcmVhZHlfcmVnaW9uOwotLyogSW5wdXQgIHRyYW5zcGFyZW50IGRhdGE6ICovCi0vKiBQYXJhbWV0ZXJzIHNpemUgKi8KLQl1aW50MTZfdCBwYXJhbXNfZGF0YV9zaXplOwotLyogcFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgKi8KLQl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7Ci0vKiBPdXRwdXQgcGFyYW1ldGVyczogKi8KLS8qIFBvaW50ZXIgKHJlYWQgaW5kZXgpIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIHJlZ2lvbiAqLwotLyogaW4gdGhlIHNoYXJlZCBVUyBkYXRhIG1lbW9yeSAqLwotCXVpbnQzMl90IGZyZWVfcmVnaW9uOwotfTsKLQotc3RydWN0IHVzX2RldGVjdF9pbmZvX3R5cGUgewotLyogVVMgZGV0ZWN0aW9uIHBsYWNlIChIV3xGVykgKi8KLS8qIE5BIGluIHRoZSBBY3RpdmUgYW5kIE9GRiBzdGF0ZXMgKi8KLQllbnVtIHVzX2RldGVjdF9wbGFjZV9lbnVtIHVzX2RldGVjdG9yOwotLyogVVMgZGV0ZWN0aW9uIG1vZGUgKi8KLQllbnVtIHVzX2RldGVjdF9tb2RlX2VudW0gIHVzX2RldGVjdF9tb2RlOwotLyogVVMgZGF0YSBkcm9wcGVkIGR1cmluZyB0aGlzIHRpbWUgKG1zZWMpICovCi0JdWludDMyX3Qgc2tpcF90aW1lOwotLyogVHJhbnNwYXJlbnQgZGF0YSBzaXplICovCi0JdWludDE2X3QgcGFyYW1zX2RhdGFfc2l6ZTsKLS8qIFBvaW50ZXIgdG8gdGhlIHRyYW5zcGFyZW50IGRhdGEgKi8KLQl1aW50OF90IF9fdXNlciAqcGFyYW1zX2RhdGE7Ci0vKiBUaW1lIChzZWMpIHRvIHdhaXQgZm9yIFVTIHByZXNlbmNlIGV2ZW50ICovCi0JdWludDMyX3QgZGV0ZWN0X3RpbWVvdXQ7Ci0vKiBPdXQgcGFyYW1ldGVyOiBVUyBwcmVzZW5jZSAqLwotCWJvb2wgaXNfdXM7Ci19OwotCi1zdHJ1Y3QgdXNfdmVyc2lvbl9pbmZvX3R5cGUgewotLyogU2l6ZSBvZiBtZW1vcnkgZm9yIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCXVpbnQxNl90IGJ1Zl9zaXplOwotLyogUG9pbnRlciB0byB0aGUgbWVtb3J5IGZvciB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQljaGFyIF9fdXNlciAqcGJ1ZjsKLX07Ci0KLXN0cnVjdCB1c19zdHJlYW1fcGFyYW1fdHlwZSB7Ci0vKiBJZCBvZiBtb2R1bGUgKi8KLQl1aW50MzJfdCBtb2R1bGVfaWQ7Ci0vKiBJZCBvZiBwYXJhbWV0ZXIgKi8KLQl1aW50MzJfdCBwYXJhbV9pZDsKLS8qIFNpemUgb2YgbWVtb3J5IG9mIHRoZSBwYXJhbWV0ZXIgYnVmZmVyICovCi0JdWludDMyX3QgYnVmX3NpemU7Ci0vKiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgb2YgdGhlIHBhcmFtZXRlciBidWZmZXIgKi8KLQl1aW50OF90IF9fdXNlciAqcGJ1ZjsKLX07Ci0KLSNlbmRpZiAvKiBfX1VTRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcXBucC9xcG5wLXJldmlkLmggYi9pbmNsdWRlL2xpbnV4L3FwbnAvcXBucC1yZXZpZC5oCmluZGV4IDdmY2E2NzQuLjQyZmQzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXBucC9xcG5wLXJldmlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9xcG5wL3FwbnAtcmV2aWQuaApAQCAtMjQ3LDYgKzI0Nyw3IEBACiAJdTgJCXBtaWNfc3VidHlwZTsKIAljb25zdCBjaGFyCSpwbWljX25hbWU7CiAJaW50CQlmYWJfaWQ7CisJaW50CQl0cF9yZXY7CiB9OwogCiAjaWZkZWYgQ09ORklHX1FQTlBfUkVWSUQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCAwNzM3Y2I2Li42Nzg2MGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC05MjgsNiArOTI4LDE2IEBACiAKICNkZWZpbmUgU0lHTkFMX1VOS0lMTEFCTEUJMHgwMDAwMDA0MCAvKiBmb3IgaW5pdDogaWdub3JlIGZhdGFsIHNpZ25hbHMgKi8KIAorI2RlZmluZSBTSUdOQUxfU1RPUF9NQVNLIChTSUdOQUxfQ0xEX01BU0sgfCBTSUdOQUxfU1RPUF9TVE9QUEVEIHwgXAorCQkJICBTSUdOQUxfU1RPUF9DT05USU5VRUQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaWduYWxfc2V0X3N0b3BfZmxhZ3Moc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZywKKwkJCQkJIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlXQVJOX09OKHNpZy0+ZmxhZ3MgJiAoU0lHTkFMX0dST1VQX0VYSVR8U0lHTkFMX0dST1VQX0NPUkVEVU1QKSk7CisJc2lnLT5mbGFncyA9IChzaWctPmZsYWdzICYgflNJR05BTF9TVE9QX01BU0spIHwgZmxhZ3M7Cit9CisKIC8qIElmIHRydWUsIGFsbCB0aHJlYWRzIGV4Y2VwdCAtPmdyb3VwX2V4aXRfdGFzayBoYXZlIHBlbmRpbmcgU0lHS0lMTCAqLwogc3RhdGljIGlubGluZSBpbnQgc2lnbmFsX2dyb3VwX2V4aXQoY29uc3Qgc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKIHsKQEAgLTExOTcsNiArMTIwNywzNyBAQAogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXA7CiAKK3N0cnVjdCBlYXNfc3RhdHMgeworCS8qIHNlbGVjdF9pZGxlX3NpYmxpbmcoKSBzdGF0cyAqLworCXU2NCBzaXNfYXR0ZW1wdHM7CisJdTY0IHNpc19pZGxlOworCXU2NCBzaXNfY2FjaGVfYWZmaW5lOworCXU2NCBzaXNfc3VmZl9jYXA7CisJdTY0IHNpc19pZGxlX2NwdTsKKwl1NjQgc2lzX2NvdW50OworCisJLyogc2VsZWN0X2VuZXJneV9jcHVfYnJ1dGUoKSBzdGF0cyAqLworCXU2NCBzZWNiX2F0dGVtcHRzOworCXU2NCBzZWNiX3N5bmM7CisJdTY0IHNlY2JfaWRsZV9idDsKKwl1NjQgc2VjYl9pbnN1ZmZfY2FwOworCXU2NCBzZWNiX25vX25yZ19zYXY7CisJdTY0IHNlY2JfbnJnX3NhdjsKKwl1NjQgc2VjYl9jb3VudDsKKworCS8qIGZpbmRfYmVzdF90YXJnZXQoKSBzdGF0cyAqLworCXU2NCBmYnRfYXR0ZW1wdHM7CisJdTY0IGZidF9ub19jcHU7CisJdTY0IGZidF9ub19zZDsKKwl1NjQgZmJ0X3ByZWZfaWRsZTsKKwl1NjQgZmJ0X2NvdW50OworCisJLyogY2FzICovCisJLyogc2VsZWN0X3Rhc2tfcnFfZmFpcigpIHN0YXRzICovCisJdTY0IGNhc19hdHRlbXB0czsKKwl1NjQgY2FzX2NvdW50OworfTsKKwogc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgewogCWF0b21pY190CXJlZjsKIAlhdG9taWNfdAlucl9idXN5X2NwdXM7CkBAIC0xMjY1LDYgKzEzMDYsOCBAQAogCXVuc2lnbmVkIGludCB0dHd1X3dha2VfcmVtb3RlOwogCXVuc2lnbmVkIGludCB0dHd1X21vdmVfYWZmaW5lOwogCXVuc2lnbmVkIGludCB0dHd1X21vdmVfYmFsYW5jZTsKKworCXN0cnVjdCBlYXNfc3RhdHMgZWFzX3N0YXRzOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCiAJY2hhciAqbmFtZTsKQEAgLTE0NjMsNiArMTUwNiwzNSBAQAogCXU2NAkJCW5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzOwogCXU2NAkJCW5yX3dha2V1cHNfcGFzc2l2ZTsKIAl1NjQJCQlucl93YWtldXBzX2lkbGU7CisKKwkvKiBzZWxlY3RfaWRsZV9zaWJsaW5nKCkgKi8KKwl1NjQJCQlucl93YWtldXBzX3Npc19hdHRlbXB0czsKKwl1NjQJCQlucl93YWtldXBzX3Npc19pZGxlOworCXU2NAkJCW5yX3dha2V1cHNfc2lzX2NhY2hlX2FmZmluZTsKKwl1NjQJCQlucl93YWtldXBzX3Npc19zdWZmX2NhcDsKKwl1NjQJCQlucl93YWtldXBzX3Npc19pZGxlX2NwdTsKKwl1NjQJCQlucl93YWtldXBzX3Npc19jb3VudDsKKworCS8qIGVuZXJneV9hd2FyZV93YWtlX2NwdSgpICovCisJdTY0CQkJbnJfd2FrZXVwc19zZWNiX2F0dGVtcHRzOworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9zeW5jOworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9pZGxlX2J0OworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9pbnN1ZmZfY2FwOworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9ub19ucmdfc2F2OworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9ucmdfc2F2OworCXU2NAkJCW5yX3dha2V1cHNfc2VjYl9jb3VudDsKKworCS8qIGZpbmRfYmVzdF90YXJnZXQoKSAqLworCXU2NAkJCW5yX3dha2V1cHNfZmJ0X2F0dGVtcHRzOworCXU2NAkJCW5yX3dha2V1cHNfZmJ0X25vX2NwdTsKKwl1NjQJCQlucl93YWtldXBzX2ZidF9ub19zZDsKKwl1NjQJCQlucl93YWtldXBzX2ZidF9wcmVmX2lkbGU7CisJdTY0CQkJbnJfd2FrZXVwc19mYnRfY291bnQ7CisKKwkvKiBjYXMgKi8KKwkvKiBzZWxlY3RfdGFza19ycV9mYWlyKCkgKi8KKwl1NjQJCQlucl93YWtldXBzX2Nhc19hdHRlbXB0czsKKwl1NjQJCQlucl93YWtldXBzX2Nhc19jb3VudDsKIH07CiAjZW5kaWYKIApAQCAtMjMxOCwyMyArMjM5MCw2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHBpZF9hbGl2ZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotc3RhdGljIGlubGluZSBwaWRfdCB0YXNrX3RnaWRfbnJfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyk7Ci1zdGF0aWMgaW5saW5lIHBpZF90IHRhc2tfcHBpZF9ucl9ucyhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQotewotCXBpZF90IHBpZCA9IDA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKHBpZF9hbGl2ZSh0c2spKQotCQlwaWQgPSB0YXNrX3RnaWRfbnJfbnMocmN1X2RlcmVmZXJlbmNlKHRzay0+cmVhbF9wYXJlbnQpLCBucyk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcGlkOwotfQotCi1zdGF0aWMgaW5saW5lIHBpZF90IHRhc2tfcHBpZF9ucihjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gdGFza19wcGlkX25yX25zKHRzaywgJmluaXRfcGlkX25zKTsKLX0KIAogc3RhdGljIGlubGluZSBwaWRfdCB0YXNrX3BncnBfbnJfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKQEAgLTIzNjksNiArMjQyNCwyMyBAQAogCXJldHVybiBfX3Rhc2tfcGlkX25yX25zKHRzaywgX19QSURUWVBFX1RHSUQsIE5VTEwpOwogfQogCitzdGF0aWMgaW5saW5lIHBpZF90IHRhc2tfcHBpZF9ucl9ucyhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQoreworCXBpZF90IHBpZCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHBpZF9hbGl2ZSh0c2spKQorCQlwaWQgPSB0YXNrX3RnaWRfbnJfbnMocmN1X2RlcmVmZXJlbmNlKHRzay0+cmVhbF9wYXJlbnQpLCBucyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gcGlkOworfQorCitzdGF0aWMgaW5saW5lIHBpZF90IHRhc2tfcHBpZF9ucihjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gdGFza19wcGlkX25yX25zKHRzaywgJmluaXRfcGlkX25zKTsKK30KKwogLyogb2Jzb2xldGUsIGRvIG5vdCB1c2UgKi8KIHN0YXRpYyBpbmxpbmUgcGlkX3QgdGFza19wZ3JwX25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtMzg4OCw2ICszOTYwLDcgQEAKICNkZWZpbmUgU0NIRURfQ1BVRlJFUV9JTlRFUkNMVVNURVJfTUlHICgxVSA8PCAzKQogI2RlZmluZSBTQ0hFRF9DUFVGUkVRX1dBTFQgKDFVIDw8IDQpCiAjZGVmaW5lIFNDSEVEX0NQVUZSRVFfUEwJKDFVIDw8IDUpCisjZGVmaW5lIFNDSEVEX0NQVUZSRVFfRUFSTFlfREVUCSgxVSA8PCA2KQogCiAjZGVmaW5lIFNDSEVEX0NQVUZSRVFfUlRfREwJKFNDSEVEX0NQVUZSRVFfUlQgfCBTQ0hFRF9DUFVGUkVRX0RMKQogCkBAIC0zOTAyLDQgKzM5NzUsNiBAQAogdm9pZCBjcHVmcmVxX3JlbW92ZV91cGRhdGVfdXRpbF9ob29rKGludCBjcHUpOwogI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUSAqLwogCitleHRlcm4gREVGSU5FX1BFUl9DUFVfUkVBRF9NT1NUTFkoaW50LCBzY2hlZF9sb2FkX2Jvb3N0KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYl9hcnJheS5oIGIvaW5jbHVkZS9saW51eC9za2JfYXJyYXkuaAppbmRleCBmNGRmYWRlLi5iZThiOTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYl9hcnJheS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tiX2FycmF5LmgKQEAgLTE2Miw3ICsxNjIsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBza2JfYXJyYXlfcmVzaXplX211bHRpcGxlKHN0cnVjdCBza2JfYXJyYXkgKipyaW5ncywKLQkJCQkJICAgIGludCBucmluZ3MsIGludCBzaXplLCBnZnBfdCBnZnApCisJCQkJCSAgICBpbnQgbnJpbmdzLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICAgIGdmcF90IGdmcCkKIHsKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHNrYl9hcnJheSwgcmluZykpOwogCXJldHVybiBwdHJfcmluZ19yZXNpemVfbXVsdGlwbGUoKHN0cnVjdCBwdHJfcmluZyAqKilyaW5ncywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggMDg0YjEyYi4uNGM1MzYzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTIyNiw3ICsyMjYsNyBAQAogICogKFBBR0VfU0laRSoyKS4gIExhcmdlciByZXF1ZXN0cyBhcmUgcGFzc2VkIHRvIHRoZSBwYWdlIGFsbG9jYXRvci4KICAqLwogI2RlZmluZSBLTUFMTE9DX1NISUZUX0hJR0gJKFBBR0VfU0hJRlQgKyAxKQotI2RlZmluZSBLTUFMTE9DX1NISUZUX01BWAkoTUFYX09SREVSICsgUEFHRV9TSElGVCkKKyNkZWZpbmUgS01BTExPQ19TSElGVF9NQVgJKE1BWF9PUkRFUiArIFBBR0VfU0hJRlQgLSAxKQogI2lmbmRlZiBLTUFMTE9DX1NISUZUX0xPVwogI2RlZmluZSBLTUFMTE9DX1NISUZUX0xPVwkzCiAjZW5kaWYKQEAgLTIzOSw3ICsyMzksNyBAQAogICogYmUgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgcGFnZS4KICAqLwogI2RlZmluZSBLTUFMTE9DX1NISUZUX0hJR0gJUEFHRV9TSElGVAotI2RlZmluZSBLTUFMTE9DX1NISUZUX01BWAkzMAorI2RlZmluZSBLTUFMTE9DX1NISUZUX01BWAkoTUFYX09SREVSICsgUEFHRV9TSElGVCAtIDEpCiAjaWZuZGVmIEtNQUxMT0NfU0hJRlRfTE9XCiAjZGVmaW5lIEtNQUxMT0NfU0hJRlRfTE9XCTMKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb3VuZHdpcmUvc291bmR3aXJlLmggYi9pbmNsdWRlL2xpbnV4L3NvdW5kd2lyZS9zb3VuZHdpcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwZDc4Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvdW5kd2lyZS9zb3VuZHdpcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9TT1VORFdJUkVfSAotI2RlZmluZSBfTElOVVhfU09VTkRXSVJFX0gKLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgotCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIHNvdW5kd2lyZV90eXBlOwotCi0vKiBTb3VuZHdpcmUgc3VwcG9ydHMgbWF4LiBvZiA4IGNoYW5uZWxzIHBlciBwb3J0ICovCi0jZGVmaW5lIFNXUl9NQVhfQ0hBTk5FTF9OVU0JOAotLyogU291bmR3aXJlIHN1cHBvcnRzIG1heC4gb2YgMTQgcG9ydHMgb24gZWFjaCBkZXZpY2UgKi8KLSNkZWZpbmUgU1dSX01BWF9ERVZfUE9SVF9OVU0JMTQKLS8qIE1heGltdW0gbnVtYmVyIG9mIHNsYXZlIGRldmljZXMgdGhhdCBhIG1hc3RlciBjYW4gY29udHJvbCAqLwotI2RlZmluZSBTV1JfTUFYX0RFVl9OVU0JCTExCi0vKiBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyBvbiBtYXN0ZXIgc28gdGhhdCBpdCBjYW4gYWNjb21tb2RhdGUgYWxsIHRoZSBwb3J0Ci0gKiBjb25maWd1cmF0aW9ucyBvZiBhbGwgZGV2aWNlcwotICovCi0jZGVmaW5lIFNXUl9NQVhfTVNUUl9QT1JUX05VTQkoU1dSX01BWF9ERVZfTlVNICogU1dSX01BWF9ERVZfUE9SVF9OVU0pCi0KLS8qIEluZGljYXRlcyBzb3VuZHdpcmUgZGV2aWNlcyBncm91cCBpbmZvcm1hdGlvbiAqLwotZW51bSB7Ci0JU1dSX0dST1VQX05PTkUgPSAwLAotCVNXUl9HUk9VUF8xMiA9IDEyLAotCVNXUl9HUk9VUF8xMyA9IDEzLAotCVNXUl9CUk9BRENBU1QgPSAxNSwKLX07Ci0KLS8qCi0gKiBzdHJ1Y3Qgc3dyX3BvcnRfaW5mbyAtIHJlcHJlc2VudCBzb3VuZHdpcmUgZnJhbWUgc2hhcGUKLSAqIEBkZXZfaWQ6IGxvZ2ljYWwgZGV2aWNlIG51bWJlciBvZiB0aGUgc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQHBvcnRfZW46IGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBvcnQgaXMgZW5hYmxlZAotICogQHBvcnRfaWQ6IGxvZ2ljYWwgcG9ydCBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBvZmZzZXQxOiBzYW1wbGUgb2Zmc2V0IGluZGljYXRpbmcgdGhlIG9mZnNldCBvZiB0aGUgY2hhbm5lbAotICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lCi0gKiBAb2Zmc2V0MjogY2hhbm5lbCBvZmZzZXQgaW5kaWNhdGluZyBvZmZzZXQgYmV0d2VlbiB0byBjaGFubmVscwotICogQHNpbnRlcnZhbDogc2FtcGxlIGludGVydmFsIGluZGljYXRlcyBzcGFjaW5nIGZyb20gb25lIHNhbXBsZQotICogZXZlbnQgdG8gdGhlIG5leHQKLSAqIEBjaF9lbjogY2hhbm5lbHMgaW4gYSBwb3J0IHRoYXQgbmVlZCB0byBiZSBlbmFibGVkCi0gKiBAbnVtX2NoOiBudW1iZXIgb2YgY2hhbm5lbHMgZW5hYmxlZCBpbiBhIHBvcnQKLSAqIEBjaF9yYXRlOiBzYW1wbGluZyByYXRlIG9mIHRoZSBjaGFubmVsIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlCi0gKiB0cmFuc2ZlcnJlZAotICoKLSAqIFNvdW5kd2lyZSBmcmFtZSBzaGFwZSBpcyBjcmVhdGVkIGJhc2VkIG9uIHN3cl9wb3J0X2luZm8gc3RydWN0Ci0gKiBwYXJhbWV0ZXJzLgotICovCi1zdHJ1Y3Qgc3dyX3BvcnRfaW5mbyB7Ci0JdTggZGV2X2lkOwotCXU4IHBvcnRfZW47Ci0JdTggcG9ydF9pZDsKLQl1OCBvZmZzZXQxOwotCXU4IG9mZnNldDI7Ci0JdTggc2ludGVydmFsOwotCXU4IGNoX2VuOwotCXU4IG51bV9jaDsKLQl1MzIgY2hfcmF0ZTsKLX07Ci0KLS8qCi0gKiBzdHJ1Y3Qgc3dyX3BhcmFtcyAtIHJlcHJlc2VudCB0cmFuc2ZlciBvZiBkYXRhIGZyb20gc291bmR3aXJlIHNsYXZlCi0gKiB0byBzb3VuZHdpcmUgbWFzdGVyCi0gKiBAdGlkOiB0cmFuc2FjdGlvbiBJRCB0byB0cmFjayBlYWNoIHRyYW5zYWN0aW9uCi0gKiBAZGV2X2lkOiBsb2dpY2FsIGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBudW1fcG9ydDogbnVtYmVyIG9mIHBvcnRzIHRoYXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZAotICogQHBvcnRfaWQ6IGFycmF5IG9mIGxvZ2ljYWwgcG9ydCBudW1iZXJzIG9mIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAbnVtX2NoOiBhcnJheSBvZiBudW1iZXIgb2YgY2hhbm5lbHMgZW5hYmxlZAotICogQGNoX3JhdGU6IGFycmF5IG9mIHNhbXBsaW5nIHJhdGUgb2YgZGlmZmVyZW50IGNoYW5uZWxzIHRoYXQgbmVlZCB0bwotICogYmUgY29uZmlndXJlZAotICogQGNoX2VuOiBhcnJheSBvZiBjaGFubmVscyBtYXNrIGZvciBhbGwgdGhlIHBvcnRzCi0gKi8KLXN0cnVjdCBzd3JfcGFyYW1zIHsKLQl1OCB0aWQ7Ci0JdTggZGV2X2lkOwotCXU4IG51bV9wb3J0OwotCXU4IHBvcnRfaWRbU1dSX01BWF9ERVZfUE9SVF9OVU1dOwotCXU4IG51bV9jaFtTV1JfTUFYX0RFVl9QT1JUX05VTV07Ci0JdTMyIGNoX3JhdGVbU1dSX01BWF9ERVZfUE9SVF9OVU1dOwotCXU4IGNoX2VuW1NXUl9NQVhfREVWX1BPUlRfTlVNXTsKLX07Ci0KLS8qCi0gKiBzdHJ1Y3Qgc3dyX3JlZyAtIHN0cnVjdCB0byBoYW5kbGUgc291bmR3aXJlIHNsYXZlIHJlZ2lzdGVyIHJlYWQvd3JpdGVzCi0gKiBAdGlkOiB0cmFuc2FjdGlvbiBpZCBmb3IgcmVnIHJlYWQvd3JpdGVzCi0gKiBAZGV2X2lkOiBsb2dpY2FsIGRldmljZSBudW1iZXIgb2YgdGhlIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEByZWdhZGRyOiAxNiBiaXQgcmVnYWRkciBvZiBzb3VuZHdpcmUgc2xhdmUKLSAqIEBidWY6IHZhbHVlIHRvIGJlIHdyaXR0ZW4vcmVhZCB0by9mcm9tIHJlZ2FkZHIKLSAqIEBsZW46IGxlbmd0aCBvZiB0aGUgYnVmZmVyIGJ1ZgotICovCi1zdHJ1Y3Qgc3dyX3JlZyB7Ci0JdTggIHRpZDsKLQl1OCAgZGV2X2lkOwotCXUzMiByZWdhZGRyOwotCXUzMiAqYnVmOwotCXUzMiBsZW47Ci19OwotCi0vKgotICogc3RydWN0IHN3cl9tYXN0ZXIgLSBJbnRlcmZhY2UgdG8gdGhlIHNvdW5kd2lyZSBtYXN0ZXIgY29udHJvbGxlcgotICogQGRldjogZGV2aWNlIGludGVyZmFjZSB0byB0aGlzIGRyaXZlcgotICogQGxpc3Q6IGxpbmsgd2l0aCBvdGhlciBzb3VuZHdpcmUgbWFzdGVyIGNvbnRyb2xsZXJzCi0gKiBAYnVzX251bTogYm9hcmQvU29DIHNwZWNpZmljIGlkZW50aWZpZXIgZm9yIGEgc291bmR3aXJlIG1hc3RlcgotICogQG1sb2NrOiBtdXRleCBwcm90ZWN0aW5nIG1hc3RlciBkYXRhIHN0cnVjdHVyZXMKLSAqIEBkZXZpY2VzOiBsaXN0IG9mIGRldmljZXMgb24gdGhpcyBtYXN0ZXIKLSAqIEBwb3J0OiBsb2dpY2FsIHBvcnQgbnVtYmVycyBvZiB0aGUgc291bmR3aXJlIG1hc3Rlci4gVGhpcyBhcnJheQotICogY2FuIGhvbGQgbWF4aW11bSBtYXN0ZXIgcG9ydHMgd2hpY2ggaXMgZXF1YWwgdG8gbnVtYmVyIG9mIHNsYXZlCi0gKiBkZXZpY2VzIG11bHRpcGxpZWQgYnkgbnVtYmVyIG9mIHBvcnRzIGluIGVhY2ggc2xhdmUgZGV2aWNlCi0gKiBAcG9ydF90eG46IHRhYmxlIG9mIHBvcnQgY29uZmlnIHRyYW5zYWN0aW9ucyB3aXRoIHRyYW5zYWN0aW9uIGlkCi0gKiBAcmVnX3R4bjogdGFibGUgb2YgcmVnaXN0ZXIgdHJhbnNhY3Rpb25zIHdpdGggdHJhbnNhY3Rpb24gaWQKLSAqIEBsYXN0X3RpZDogc2l6ZSBvZiB0YWJsZSBwb3J0X3R4biAoY2FuJ3QgZ3JvdyBiZXlvbmQgMjU2IHNpbmNlCi0gKiB0aWQgaXMgOCBiaXRzKQotICogQG51bV9wb3J0OiBudW1iZXIgb2YgYWN0aXZlIHBvcnRzIG9uIHNvdW5kd2lyZSBtYXN0ZXIKLSAqIEBncl9zaWQ6IHNsYXZlIGlkIHVzZWQgYnkgdGhlIGdyb3VwIGZvciB3cml0ZSBvcGVyYXRpb25zCi0gKiBAY29ubmVjdF9wb3J0OiBjYWxsYmFjayBmb3IgY29uZmlndXJhdGlvbiBvZiBzb3VuZHdpcmUgcG9ydChzKQotICogQGRpc2Nvbm5lY3RfcG9ydDogY2FsbGJhY2sgZm9yIGRpc2FibGUgb2Ygc291bmR3aXJlIHBvcnQocykKLSAqIEByZWFkOiBjYWxsYmFjayBmb3Igc291bmR3aXJlIHNsYXZlIHJlZ2lzdGVyIHJlYWQKLSAqIEB3cml0ZTogY2FsbGJhY2sgZm9yIHNvdW5kd2lyZSBzbGF2ZSByZWdpc3RlciB3cml0ZQotICogQGdldF9sb2dpY2FsX2Rldl9udW06IGNhbGxiYWNrIHRvIGdldCBzb3VuZHdpcmUgc2xhdmUgbG9naWNhbAotICogZGV2aWNlIG51bWJlcgotICovCi1zdHJ1Y3Qgc3dyX21hc3RlciB7Ci0Jc3RydWN0IGRldmljZSBkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXVuc2lnbmVkIGludCBidXNfbnVtOwotCXN0cnVjdCBtdXRleCBtbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7Ci0Jc3RydWN0IHN3cl9wb3J0X2luZm8gcG9ydFtTV1JfTUFYX01TVFJfUE9SVF9OVU1dOwotCXN0cnVjdCBzd3JfcGFyYW1zICoqcG9ydF90eG47Ci0Jc3RydWN0IHN3cl9yZWcgKipyZWdfdHhuOwotCXU4IGxhc3RfdGlkOwotCXU4IG51bV9wb3J0OwotCXU4IG51bV9kZXY7Ci0JdTggZ3Jfc2lkOwotCWludCAoKmNvbm5lY3RfcG9ydCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHN0cnVjdCBzd3JfcGFyYW1zICp0eG4pOwotCWludCAoKmRpc2Nvbm5lY3RfcG9ydCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHN0cnVjdCBzd3JfcGFyYW1zICp0eG4pOwotCWludCAoKnJlYWQpKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyLCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCi0JCQl2b2lkICpidWYsIHUzMiBsZW4pOwotCWludCAoKndyaXRlKShzdHJ1Y3Qgc3dyX21hc3RlciAqbXN0ciwgdTggZGV2X251bSwgdTE2IHJlZ19hZGRyLAotCQkJY29uc3Qgdm9pZCAqYnVmKTsKLQlpbnQgKCpidWxrX3dyaXRlKShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLCB1OCBkZXZfbnVtLCB2b2lkICpyZWcsCi0JCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7Ci0JaW50ICgqZ2V0X2xvZ2ljYWxfZGV2X251bSkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHU2NCBkZXZfaWQsCi0JCQkJdTggKmRldl9udW0pOwotCXZvaWQgKCpzbHZkZXZfZGF0YXBhdGhfY29udHJvbCkoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIGJvb2wgZW5hYmxlKTsKLQlib29sICgqcmVtb3ZlX2Zyb21fZ3JvdXApKHN0cnVjdCBzd3JfbWFzdGVyICptc3RyKTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHN3cl9tYXN0ZXIgKnRvX3N3cl9tYXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXYgPyBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3dyX21hc3RlciwgZGV2KSA6IE5VTEw7Ci19Ci0KLS8qCi0gKiBzdHJ1Y3Qgc3dyX2RldmljZSAtIHJlcHJlc2VudCBhIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2UKLSAqIEBuYW1lOiBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIGRldmljZSwgZGVmaW5lZCBpbiBkZXZpY2V0cmVlCi0gKiBiaW5kaW5nIHVuZGVyIHNvdW5kd2lyZSBzbGF2ZSBkZXZpY2Ugbm9kZSBhcyBhIGNvbXBhdGlibGUgZmllbGQuCi0gKiBAbWFzdGVyOiBzb3VuZHdpcmUgbWFzdGVyIG1hbmFnaW5nIHRoZSBidXMgaG9zdGluZyB0aGlzIGRldmljZQotICogQGRyaXZlcjogRGV2aWNlJ3MgZHJpdmVyLiBQb2ludGVyIHRvIGFjY2VzcyByb3V0aW5lcwotICogQGRldl9saXN0OiBsaXN0IG9mIGRldmljZXMgb24gYSBjb250cm9sbGVyCi0gKiBAZGV2X251bTogbG9naWNhbCBkZXZpY2UgbnVtYmVyIG9mIHRoZSBzb3VuZHdpcmUgc2xhdmUgZGV2aWNlCi0gKiBAZGV2OiBkcml2ZXIgbW9kZWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZQotICogQGFkZHI6IHJlcHJlc2VudHMgImVhLWFkZHIiIHdoaWNoIGlzIHVuaXF1ZS1pZCBvZiBzb3VuZHdpcmUgc2xhdmUKLSAqIGRldmljZQotICogQGdyb3VwX2lkOiBncm91cCBpZCBzdXBwb3J0ZWQgYnkgdGhlIHNsYXZlIGRldmljZQotICovCi1zdHJ1Y3Qgc3dyX2RldmljZSB7Ci0JY2hhciBuYW1lW1NPVU5EV0lSRV9OQU1FX1NJWkVdOwotCXN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IHN3cl9kcml2ZXIgKmRyaXZlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwotCXU4ICAgICAgICAgICAgICAgZGV2X251bTsKLQlzdHJ1Y3QgZGV2aWNlICAgIGRldjsKLQl1bnNpZ25lZCBsb25nICAgIGFkZHI7Ci0JdTggZ3JvdXBfaWQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzd3JfZGV2aWNlICp0b19zd3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2ID8gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN3cl9kZXZpY2UsIGRldikgOiBOVUxMOwotfQotCi0vKgotICogc3RydWN0IHN3cl9kcml2ZXIgLSBNYW5hZ2Ugc291bmR3aXJlIHNsYXZlIGRldmljZSBkcml2ZXIKLSAqIEBwcm9iZTogYmluZHMgdGhpcyBkcml2ZXIgdG8gc291bmR3aXJlIGRldmljZQotICogQHJlbW92ZTogdW5iaW5kcyB0aGlzIGRyaXZlciBmcm9tIHNvdW5kd2lyZSBkZXZpY2UKLSAqIEBzaHV0ZG93bjogc3RhbmRhcmQgc2h1dGRvd24gY2FsbGJhY2sgdXNlZCBkdXJpbmcgcG93ZXIgZG93bi9oYWx0Ci0gKiBAc3VzcGVuZDogc3RhbmRhcmQgc3VzcGVuZCBjYWxsYmFjayB1c2VkIGR1cmluZyBzeXN0ZW0gc3VzcGVuZAotICogQHJlc3VtZTogc3RhbmRhcmQgcmVzdW1lIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHN5c3RlbSByZXN1bWUKLSAqIEBkcml2ZXI6IHNvdW5kd2lyZSBkZXZpY2UgZHJpdmVycyBzaG91bGQgaW5pdGlhbGl6ZSBuYW1lIGFuZAotICogb3duZXIgZmllbGQgb2YgdGhpcyBzdHJ1Y3R1cmUKLSAqIEBpZF90YWJsZTogbGlzdCBvZiBzb3VuZHdpcmUgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIKLSAqLwotc3RydWN0IHN3cl9kcml2ZXIgewotCWludAkoKnByb2JlKShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKTsKLQlpbnQJKCpyZW1vdmUpKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOwotCXZvaWQJKCpzaHV0ZG93bikoc3RydWN0IHN3cl9kZXZpY2UgKnN3cik7Ci0JaW50CSgqc3VzcGVuZCkoc3RydWN0IHN3cl9kZXZpY2UgKnN3ciwgcG1fbWVzc2FnZV90IHBtZXNnKTsKLQlpbnQJKCpyZXN1bWUpKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOwotCWludAkoKmRldmljZV91cCkoc3RydWN0IHN3cl9kZXZpY2UgKnN3cik7Ci0JaW50CSgqZGV2aWNlX2Rvd24pKHN0cnVjdCBzd3JfZGV2aWNlICpzd3IpOwotCWludAkoKnJlc2V0X2RldmljZSkoc3RydWN0IHN3cl9kZXZpY2UgKnN3cik7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIJCWRyaXZlcjsKLQljb25zdCBzdHJ1Y3Qgc3dyX2RldmljZV9pZAkqaWRfdGFibGU7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzd3JfZHJpdmVyICp0b19zd3JfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIGRydiA/IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBzd3JfZHJpdmVyLCBkcml2ZXIpIDogTlVMTDsKLX0KLQotLyoKLSAqIHN0cnVjdCBzd3JfYm9hcmRpbmZvIC0gRGVjbGFyZSBib2FyZCBpbmZvIGZvciBzb3VuZHdpcmUgZGV2aWNlIGJyaW5ndXAKLSAqIEBuYW1lOiBuYW1lIHRvIGluaXRpYWxpemUgc3dyX2RldmljZS5uYW1lCi0gKiBAYnVzX251bTogaWRlbnRpZmllcyB3aGljaCBzb3VuZHdpcmUgbWFzdGVyIHBhcmVudHMgdGhlIHNvdW5kd2lyZQotICogc2xhdmVfZGV2aWNlCi0gKiBAYWRkcjogcmVwcmVzZW50cyAiZWEtYWRkciIgb2Ygc291bmR3aXJlIHNsYXZlIGRldmljZQotICogQG9mX25vZGU6IHBvaW50ZXIgdG8gT3BlbkZpcm13YXJlIGRldmljZSBub2RlCi0gKiBAc3dyX3NsYXZlOiBkZXZpY2UgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHNvdW5kd2lyZQotICovCi1zdHJ1Y3Qgc3dyX2JvYXJkaW5mbyB7Ci0JY2hhciAgICAgICAgICAgICAgIG5hbWVbU09VTkRXSVJFX05BTUVfU0laRV07Ci0JaW50ICAgICAgICAgICAgICAgIGJ1c19udW07Ci0JdTY0CQkgICBhZGRyOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKLQlzdHJ1Y3Qgc3dyX2RldmljZSAgKnN3cl9zbGF2ZTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqc3dyX2dldF9jdHJsX2RhdGEoY29uc3Qgc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3RlcikKLXsKLQlyZXR1cm4gbWFzdGVyID8gZGV2X2dldF9kcnZkYXRhKCZtYXN0ZXItPmRldikgOiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dyX3NldF9jdHJsX2RhdGEoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3Rlciwgdm9pZCAqZGF0YSkKLXsKLQlkZXZfc2V0X2RydmRhdGEoJm1hc3Rlci0+ZGV2LCBkYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpzd3JfZ2V0X2Rldl9kYXRhKGNvbnN0IHN0cnVjdCBzd3JfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldiA/IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpIDogTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN3cl9zZXRfZGV2X2RhdGEoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBkYXRhKTsKLX0KLQotZXh0ZXJuIGludCBzd3Jfc3RhcnR1cF9kZXZpY2VzKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KTsKLQotZXh0ZXJuIHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfbmV3X2RldmljZShzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyLAotCQkJCXN0cnVjdCBzd3JfYm9hcmRpbmZvIGNvbnN0ICppbmZvKTsKLQotZXh0ZXJuIGludCBvZl9yZWdpc3Rlcl9zd3JfZGV2aWNlcyhzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKTsKLQotZXh0ZXJuIHZvaWQgc3dyX3BvcnRfcmVzcG9uc2Uoc3RydWN0IHN3cl9tYXN0ZXIgKm1zdHIsIHU4IHRpZCk7Ci0KLWV4dGVybiBpbnQgc3dyX2dldF9sb2dpY2FsX2Rldl9udW0oc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTY0IGRldl9pZCwKLQkJCXU4ICpkZXZfbnVtKTsKLQotZXh0ZXJuIGludCBzd3JfcmVhZChzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCi0JCQl2b2lkICpidWYsIHUzMiBsZW4pOwotCi1leHRlcm4gaW50IHN3cl93cml0ZShzdHJ1Y3Qgc3dyX2RldmljZSAqZGV2LCB1OCBkZXZfbnVtLCB1MTYgcmVnX2FkZHIsCi0JCQljb25zdCB2b2lkICpidWYpOwotCi1leHRlcm4gaW50IHN3cl9idWxrX3dyaXRlKHN0cnVjdCBzd3JfZGV2aWNlICpkZXYsIHU4IGRldl9udW0sIHZvaWQgKnJlZ19hZGRyLAotCQkJICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwotCi1leHRlcm4gaW50IHN3cl9jb25uZWN0X3BvcnQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggKnBvcnRfaWQsIHU4IG51bV9wb3J0LAotCQkJCXU4ICpjaF9tYXNrLCB1MzIgKmNoX3JhdGUsIHU4ICpudW1fY2gpOwotCi1leHRlcm4gaW50IHN3cl9kaXNjb25uZWN0X3BvcnQoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwKLQkJCQl1OCAqcG9ydF9pZCwgdTggbnVtX3BvcnQpOwotCi1leHRlcm4gaW50IHN3cl9zZXRfZGV2aWNlX2dyb3VwKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2LCB1OCBpZCk7Ci0KLWV4dGVybiBpbnQgc3dyX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3Qgc3dyX2RyaXZlciAqZHJ2KTsKLQotZXh0ZXJuIHZvaWQgc3dyX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBzd3JfZHJpdmVyICpkcnYpOwotCi1leHRlcm4gaW50IHN3cl9hZGRfZGV2aWNlKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIsCi0JCQkJc3RydWN0IHN3cl9kZXZpY2UgKnN3cmRldik7Ci1leHRlcm4gdm9pZCBzd3JfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyKTsKLQotZXh0ZXJuIHZvaWQgc3dyX21hc3Rlcl9hZGRfYm9hcmRkZXZpY2VzKHN0cnVjdCBzd3JfbWFzdGVyICptYXN0ZXIpOwotCi1leHRlcm4gdm9pZCBzd3JfdW5yZWdpc3Rlcl9tYXN0ZXIoc3RydWN0IHN3cl9tYXN0ZXIgKm1hc3Rlcik7Ci0KLWV4dGVybiBpbnQgc3dyX3JlZ2lzdGVyX21hc3RlcihzdHJ1Y3Qgc3dyX21hc3RlciAqbWFzdGVyKTsKLQotZXh0ZXJuIGludCBzd3JfZGV2aWNlX3VwKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KTsKLQotZXh0ZXJuIGludCBzd3JfZGV2aWNlX2Rvd24oc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpOwotCi1leHRlcm4gaW50IHN3cl9yZXNldF9kZXZpY2Uoc3RydWN0IHN3cl9kZXZpY2UgKnN3cl9kZXYpOwotCi1leHRlcm4gaW50IHN3cl9zbHZkZXZfZGF0YXBhdGhfY29udHJvbChzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX2RldiwgdTggZGV2X251bSwKLQkJCQkgICAgICAgYm9vbCBlbmFibGUpOwotZXh0ZXJuIGludCBzd3JfcmVtb3ZlX2Zyb21fZ3JvdXAoc3RydWN0IHN3cl9kZXZpY2UgKmRldiwgdTggZGV2X251bSk7Ci0KLWV4dGVybiB2b2lkIHN3cl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzd3JfZGV2aWNlICpzd3JfZGV2KTsKLSNlbmRpZiAvKiBfTElOVVhfU09VTkRXSVJFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc291bmR3aXJlL3N3ci13Y2QuaCBiL2luY2x1ZGUvbGludXgvc291bmR3aXJlL3N3ci13Y2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxYjkwMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvdW5kd2lyZS9zd3Itd2NkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfU1dSX1dDRF9ICi0jZGVmaW5lIF9MSU5VWF9TV1JfV0NEX0gKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotZW51bSB7Ci0JU1dSX0NIX01BUCwKLQlTV1JfREVWSUNFX0RPV04sCi0JU1dSX0RFVklDRV9VUCwKLQlTV1JfU1VCU1lTX1JFU1RBUlQsCi0JU1dSX1NFVF9OVU1fUlhfQ0gsCi19OwotCi1zdHJ1Y3Qgc3dyX21zdHJfcG9ydCB7Ci0JaW50IG51bV9wb3J0OwotCXU4ICpwb3J0OwotfTsKLQotZXh0ZXJuIGludCBzd3JtX3djZF9ub3RpZnkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTMyIGlkLCB2b2lkICpkYXRhKTsKLQotI2VuZGlmIC8qIF9MSU5VWF9TV1JfV0NEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3Fjb20tc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9xY29tLXNwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODQ4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9xY29tLXNwaS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisvKgorICogU1BJIGRyaXZlciBmb3IgUXVhbGNvbW0gTVNNIHBsYXRmb3Jtcy4KKyAqLworCisvKioKKyAqIG1zbV9zcGlfcGxhdGZvcm1fZGF0YTogbXNtIHNwaS1jb250cm9sbGVyJ3MgY29uZmlndXJhdGlvbiBkYXRhCisgKgorICogQG1heF9jbG9ja19zcGVlZCBtYXggc3BpIGNsb2NrIHNwZWVkCisgKiBAYWN0aXZlX29ubHkgd2hlbiBzZXQsIHZvdGVzIHdoZW4gc3lzdGVtIGFjdGl2ZSBhbmQgcmVtb3ZlcyB0aGUgdm90ZSB3aGVuCisgKiAgICAgICBzeXN0ZW0gZ29lcyBpZGxlIChvcHRpbWlzZXMgZm9yIHBlcmZvcm1hbmNlKS4gV2hlbiB1bnNldCwgdm90aW5nIHVzaW5nCisgKiAgICAgICBydW50aW1lIHBtIChvcHRpbWl6ZXMgZm9yIHBvd2VyKS4KKyAqIEBtYXN0ZXJfaWQgbWFzdGVyIGlkIG51bWJlciBvZiB0aGUgY29udHJvbGxlcidzIHdyYXBwZXIgKEJMU1Agb3IgR1NCSSkuCisgKiAgICAgICBXaGVuIHplcm8sIGNsb2NrIHBhdGggdm90aW5nIGlzIGRpc2FibGVkLgorICogQGdwaW9fY29uZmlnIHBvaW50ZXIgdG8gZnVuY3Rpb24gZm9yIGNvbmZpZ3VyaW5nIGdwaW8KKyAqIEBncGlvX3JlbGVhc2UgcG9pbnRlciB0byBmdW5jdGlvbiBmb3IgcmVsZWFzaW5nIGdwaW8gcGlucworICogQGRtYV9jb25maWcgZnVuY3Rpb24gcG9uaXRlciBmb3IgY29uZmlndXJpbmcgZG1hIGVuZ2luZQorICogQHBtX2xhdCBwb3dlciBtYW5hZ2VtZW50IGxhdGVuY3kKKyAqIEBpbmZpbml0ZV9tb2RlIHVzZSBGSUZPIG1vZGUgaW4gaW5maW5pdGUgbW9kZQorICogQHZlcl9yZWdfZXhpc3RzIGlmIHRoZSB2ZXJzaW9uIHJlZ2lzdGVyIGV4aXN0cworICogQHVzZV9iZWFtIHRydWUgaWYgQkFNIGlzIGF2YWlsYWJsZQorICogQGJhbV9jb25zdW1lcl9waXBlX2luZGV4IEJBTSBjb251c21lciBwaXBlCisgKiBAYmFtX3Byb2R1Y2VyX3BpcGVfaW5kZXggQkFNIHByb2R1Y2VyIHBpcGUKKyAqIEBydF9wcmlvcml0eSB0cnVlIGlmIFJUIHRocmVhZAorICogQHVzZV9waW5jdHJsIHRydWUgaWYgcGluY3RybCBsaWJyYXJ5IGlzIHVzZWQKKyAqIEBpc19zaGFyZWQgdHJ1ZSB3aGVuIHF1cCBpcyBzaGFyZWQgYmV0d2VlbiBlZSdzCisgKi8KK3N0cnVjdCBtc21fc3BpX3BsYXRmb3JtX2RhdGEgeworCXUzMiBtYXhfY2xvY2tfc3BlZWQ7CisJdTMyICBtYXN0ZXJfaWQ7CisJdTMyIGJ1c193aWR0aDsKKwlpbnQgKCpncGlvX2NvbmZpZykodm9pZCk7CisJdm9pZCAoKmdwaW9fcmVsZWFzZSkodm9pZCk7CisJaW50ICgqZG1hX2NvbmZpZykodm9pZCk7CisJY29uc3QgY2hhciAqcnNsX2lkOworCXUzMiAgcG1fbGF0OworCXUzMiAgaW5maW5pdGVfbW9kZTsKKwlib29sIHZlcl9yZWdfZXhpc3RzOworCWJvb2wgdXNlX2JhbTsKKwl1MzIgIGJhbV9jb25zdW1lcl9waXBlX2luZGV4OworCXUzMiAgYmFtX3Byb2R1Y2VyX3BpcGVfaW5kZXg7CisJYm9vbCBydF9wcmlvcml0eTsKKwlib29sIHVzZV9waW5jdHJsOworCWJvb2wgaXNfc2hhcmVkOworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLWdlbmktcWNvbS5oCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBzb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuaApjb3B5IHRvIGluY2x1ZGUvbGludXgvc3BpL3NwaS1nZW5pLXFjb20uaAppbmRleCA4YTAyMzJlLi44YWVlODhhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGktZ2VuaS1xY29tLmgKQEAgLTcsMTQgKzcsMTcgQEAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgogICovCiAKLSNpZm5kZWYgX19BVURJT19FWFRfQ0xLX1VQX0hfCi0jZGVmaW5lIF9fQVVESU9fRVhUX0NMS19VUF9IXworI2lmbmRlZiBfX1NQSV9HRU5JX1FDT01fSEVBREVSX19fCisjZGVmaW5lIF9fU1BJX0dFTklfUUNPTV9IRUFERVJfX18KIAotaW50IGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1faW5pdCh2b2lkKTsKLXZvaWQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9leGl0KHZvaWQpOworc3RydWN0IHNwaV9nZW5pX3Fjb21fY3RybF9kYXRhIHsKKwl1MzIgc3BpX2NzX2Nsa19kZWxheTsKKwl1MzIgc3BpX2ludGVyX3dvcmRzX2RlbGF5OworfTsKIAotI2VuZGlmCisjZW5kaWYgLypfX1NQSV9HRU5JX1FDT01fSEVBREVSX19fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKaW5kZXggMGEzNDQ4OS4uMTdhMzNmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKQEAgLTIzLDYgKzIzLDggQEAKIGV4dGVybiBpbnQgc25wcmludF9zdGFja190cmFjZShjaGFyICpidWYsIHNpemVfdCBzaXplLAogCQkJc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgaW50IHNwYWNlcyk7CiAKKyNkZWZpbmUgQkFDS1BPUlRFRF9FWFBPUlRfU0FWRV9TVEFDS19UUkFDRV9UU0tfQVJNCisKICNpZmRlZiBDT05GSUdfVVNFUl9TVEFDS1RSQUNFX1NVUFBPUlQKIGV4dGVybiB2b2lkIHNhdmVfc3RhY2tfdHJhY2VfdXNlcihzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaAppbmRleCA0ZTUxMGRmLi4wNDYzZGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKQEAgLTE3OCwxNyArMTc4LDYgQEAKIHZvaWQgX193cml0ZV9vdmVyZmxvdyh2b2lkKSBfX2NvbXBpbGV0aW1lX2Vycm9yKCJkZXRlY3RlZCB3cml0ZSBiZXlvbmQgc2l6ZSBvZiBvYmplY3QgcGFzc2VkIGFzIDFzdCBwYXJhbWV0ZXIiKTsKIAogI2lmICFkZWZpbmVkKF9fTk9fRk9SVElGWSkgJiYgZGVmaW5lZChfX09QVElNSVpFX18pICYmIGRlZmluZWQoQ09ORklHX0ZPUlRJRllfU09VUkNFKQotX19GT1JUSUZZX0lOTElORSBjaGFyICpzdHJjcHkoY2hhciAqcCwgY29uc3QgY2hhciAqcSkKLXsKLQlzaXplX3QgcF9zaXplID0gX19idWlsdGluX29iamVjdF9zaXplKHAsIDApOwotCXNpemVfdCBxX3NpemUgPSBfX2J1aWx0aW5fb2JqZWN0X3NpemUocSwgMCk7Ci0JaWYgKHBfc2l6ZSA9PSAoc2l6ZV90KS0xICYmIHFfc2l6ZSA9PSAoc2l6ZV90KS0xKQotCQlyZXR1cm4gX19idWlsdGluX3N0cmNweShwLCBxKTsKLQlpZiAoc3Ryc2NweShwLCBxLCBwX3NpemUgPCBxX3NpemUgPyBwX3NpemUgOiBxX3NpemUpIDwgMCkKLQkJZm9ydGlmeV9wYW5pYyhfX2Z1bmNfXyk7Ci0JcmV0dXJuIHA7Ci19Ci0KIF9fRk9SVElGWV9JTkxJTkUgY2hhciAqc3RybmNweShjaGFyICpwLCBjb25zdCBjaGFyICpxLCBfX2tlcm5lbF9zaXplX3Qgc2l6ZSkKIHsKIAlzaXplX3QgcF9zaXplID0gX19idWlsdGluX29iamVjdF9zaXplKHAsIDApOwpAQCAtMzY3LDYgKzM1NiwxOCBAQAogCQlmb3J0aWZ5X3BhbmljKF9fZnVuY19fKTsKIAlyZXR1cm4gX19yZWFsX2ttZW1kdXAocCwgc2l6ZSwgZ2ZwKTsKIH0KKworLyogZGVmaW5lZCBhZnRlciBmb3J0aWZpZWQgc3RybGVuIGFuZCBtZW1jcHkgdG8gcmV1c2UgdGhlbSAqLworX19GT1JUSUZZX0lOTElORSBjaGFyICpzdHJjcHkoY2hhciAqcCwgY29uc3QgY2hhciAqcSkKK3sKKwlzaXplX3QgcF9zaXplID0gX19idWlsdGluX29iamVjdF9zaXplKHAsIDApOworCXNpemVfdCBxX3NpemUgPSBfX2J1aWx0aW5fb2JqZWN0X3NpemUocSwgMCk7CisJaWYgKHBfc2l6ZSA9PSAoc2l6ZV90KS0xICYmIHFfc2l6ZSA9PSAoc2l6ZV90KS0xKQorCQlyZXR1cm4gX19idWlsdGluX3N0cmNweShwLCBxKTsKKwltZW1jcHkocCwgcSwgc3RybGVuKHEpICsgMSk7CisJcmV0dXJuIHA7Cit9CisKICNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeW5jX2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvc3luY19maWxlLmgKaW5kZXggYWExN2NjZi4uYzk3ZmFjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeW5jX2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5bmNfZmlsZS5oCkBAIC00Myw5ICs0MywxMCBAQAogCiAJc3RydWN0IGZlbmNlCQkqZmVuY2U7CiAJc3RydWN0IGZlbmNlX2NiIGNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCi0jZGVmaW5lIFBPTExfRU5BQkxFRCBGRU5DRV9GTEFHX1VTRVJfQklUUworI2RlZmluZSBQT0xMX0VOQUJMRUQgMAogCiBzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGVfY3JlYXRlKHN0cnVjdCBmZW5jZSAqZmVuY2UpOwogc3RydWN0IGZlbmNlICpzeW5jX2ZpbGVfZ2V0X2ZlbmNlKGludCBmZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaCBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCmluZGV4IDZlNDliODYuLmE3MDBlNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCkBAIC00NywxMSArNDcsMTcgQEAKICNkZWZpbmUgVEhFUk1BTF9XRUlHSFRfREVGQVVMVCAwCiAKIC8qIE1heCBzZW5zb3JzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgc2luZ2xlIHZpcnR1YWwgdGhlcm1hbHpvbmUgKi8KLSNkZWZpbmUgVEhFUk1BTF9NQVhfVklSVF9TRU5TT1JTIDUKKyNkZWZpbmUgVEhFUk1BTF9NQVhfVklSVF9TRU5TT1JTIDgKIAogLyogdXNlIHZhbHVlLCB3aGljaCA8IDBLLCB0byBpbmRpY2F0ZSBhbiBpbnZhbGlkL3VuaW5pdGlhbGl6ZWQgdGVtcGVyYXR1cmUgKi8KICNkZWZpbmUgVEhFUk1BTF9URU1QX0lOVkFMSUQJLTI3NDAwMAogCisvKgorICogdXNlIGEgaGlnaCB2YWx1ZSBmb3IgbG93IHRlbXAgdHJhY2tpbmcgem9uZSwKKyAqIHRvIGluZGljYXRlIGFuIGludmFsaWQvdW5pbml0aWFsaXplZCB0ZW1wZXJhdHVyZQorICovCisjZGVmaW5lIFRIRVJNQUxfVEVNUF9JTlZBTElEX0xPVyAyNzQwMDAKKwogLyogVW5pdCBjb252ZXJzaW9uIG1hY3JvcyAqLwogI2RlZmluZSBERUNJX0tFTFZJTl9UT19DRUxTSVVTKHQpCSh7CQkJXAogCWxvbmcgX3QgPSAodCk7CQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aWNrLmggYi9pbmNsdWRlL2xpbnV4L3RpY2suaAppbmRleCA1MTNjZDRmZC4uZmM3MjQ2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC90aWNrLmgKQEAgLTExOSw2ICsxMTksNyBAQAogZXh0ZXJuIHZvaWQgdGlja19ub2h6X2lkbGVfZXhpdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRpY2tfbm9oel9pcnFfZXhpdCh2b2lkKTsKIGV4dGVybiBrdGltZV90IHRpY2tfbm9oel9nZXRfc2xlZXBfbGVuZ3RoKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGlja19ub2h6X2dldF9pZGxlX2NhbGxzKHZvaWQpOwogZXh0ZXJuIHU2NCBnZXRfY3B1X2lkbGVfdGltZV91cyhpbnQgY3B1LCB1NjQgKmxhc3RfdXBkYXRlX3RpbWUpOwogZXh0ZXJuIHU2NCBnZXRfY3B1X2lvd2FpdF90aW1lX3VzKGludCBjcHUsIHU2NCAqbGFzdF91cGRhdGVfdGltZSk7CiAjZWxzZSAvKiAhQ09ORklHX05PX0haX0NPTU1PTiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggMGY5ZmZmMy4uMjMyYzNlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC03NTEsMTEgKzc1MSwxMSBAQAogZXh0ZXJuIGludCB1c2Jfc2VjX2V2ZW50X3JpbmdfY2xlYW51cChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAogCXVuc2lnbmVkIGludCBpbnRyX251bSk7CiAKLWV4dGVybiBkbWFfYWRkcl90IHVzYl9nZXRfc2VjX2V2ZW50X3JpbmdfZG1hX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQl1bnNpZ25lZCBpbnQgaW50cl9udW0pOwotZXh0ZXJuIGRtYV9hZGRyX3QgdXNiX2dldF9kY2JhX2RtYV9hZGRyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwotZXh0ZXJuIGRtYV9hZGRyX3QgdXNiX2dldF94ZmVyX3JpbmdfZG1hX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKTsKK2V4dGVybiBwaHlzX2FkZHJfdCB1c2JfZ2V0X3NlY19ldmVudF9yaW5nX3BoeXNfYWRkcigKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW50cl9udW0sIGRtYV9hZGRyX3QgKmRtYSk7CitleHRlcm4gcGh5c19hZGRyX3QgdXNiX2dldF94ZmVyX3JpbmdfcGh5c19hZGRyKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwgZG1hX2FkZHJfdCAqZG1hKTsKK2V4dGVybiBpbnQgdXNiX2dldF9jb250cm9sbGVyX2lkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwogCiAvKiBTZXRzIHVwIGEgZ3JvdXAgb2YgYnVsayBlbmRwb2ludHMgdG8gc3VwcG9ydCBtdWx0aXBsZSBzdHJlYW0gSURzLiAqLwogZXh0ZXJuIGludCB1c2JfYWxsb2Nfc3RyZWFtcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLApAQCAtMTcyNSw2ICsxNzI1LDggQEAKIGV4dGVybiBpbnQgdXNiX2NsZWFyX2hhbHQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IHBpcGUpOwogZXh0ZXJuIGludCB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgdXNiX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtLCBpbnQgYWx0ZXJuYXRlKTsKK2V4dGVybiBpbnQgdXNiX3NldF9pbnRlcmZhY2VfdGltZW91dChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaWZudW0sCisJCWludCBhbHRlcm5hdGUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CiBleHRlcm4gdm9pZCB1c2JfcmVzZXRfZW5kcG9pbnQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVwYWRkcik7CiAKIC8qIHRoaXMgcmVxdWVzdCBpc24ndCByZWFsbHkgc3luY2hyb25vdXMsIGJ1dCBpdCBiZWxvbmdzIHdpdGggdGhlIG90aGVycyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY2NpZF9kZXNjLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9jY2lkX2Rlc2MuaAppbmRleCA5YTBjNzI2Li4yZTZkYmI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9jY2lkX2Rlc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jY2lkX2Rlc2MuaApAQCAtODYsMjcgKzg2LDI3IEBACiAgKiBUYWJsZSA1LjEtMSBTbWFydCBDYXJkIERldmljZSBDbGFzcyBkZXNjcmlwdG9ycwogICovCiBzdHJ1Y3QgdXNiX2NjaWRfY2xhc3NfZGVzY3JpcHRvciB7Ci0JdW5zaWduZWQgY2hhciAgYkxlbmd0aDsKLQl1bnNpZ25lZCBjaGFyICBiRGVzY3JpcHRvclR5cGU7Ci0JdW5zaWduZWQgc2hvcnQgYmNkQ0NJRDsKLQl1bnNpZ25lZCBjaGFyICBiTWF4U2xvdEluZGV4OwotCXVuc2lnbmVkIGNoYXIgIGJWb2x0YWdlU3VwcG9ydDsKLQl1bnNpZ25lZCBsb25nICBkd1Byb3RvY29sczsKLQl1bnNpZ25lZCBsb25nICBkd0RlZmF1bHRDbG9jazsKLQl1bnNpZ25lZCBsb25nICBkd01heGltdW1DbG9jazsKLQl1bnNpZ25lZCBjaGFyICBiTnVtQ2xvY2tTdXBwb3J0ZWQ7Ci0JdW5zaWduZWQgbG9uZyAgZHdEYXRhUmF0ZTsKLQl1bnNpZ25lZCBsb25nICBkd01heERhdGFSYXRlOwotCXVuc2lnbmVkIGNoYXIgIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQ7Ci0JdW5zaWduZWQgbG9uZyAgZHdNYXhJRlNEOwotCXVuc2lnbmVkIGxvbmcgIGR3U3luY2hQcm90b2NvbHM7Ci0JdW5zaWduZWQgbG9uZyAgZHdNZWNoYW5pY2FsOwotCXVuc2lnbmVkIGxvbmcgIGR3RmVhdHVyZXM7Ci0JdW5zaWduZWQgbG9uZyAgZHdNYXhDQ0lETWVzc2FnZUxlbmd0aDsKLQl1bnNpZ25lZCBjaGFyICBiQ2xhc3NHZXRSZXNwb25zZTsKLQl1bnNpZ25lZCBjaGFyICBiQ2xhc3NFbnZlbG9wZTsKLQl1bnNpZ25lZCBzaG9ydCB3TGNkTGF5b3V0OwotCXVuc2lnbmVkIGNoYXIgIGJQSU5TdXBwb3J0OwotCXVuc2lnbmVkIGNoYXIgIGJNYXhDQ0lEQnVzeVNsb3RzOworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTE2IGJjZENDSUQ7CisJX191OCAgYk1heFNsb3RJbmRleDsKKwlfX3U4ICBiVm9sdGFnZVN1cHBvcnQ7CisJX191MzIgIGR3UHJvdG9jb2xzOworCV9fdTMyICBkd0RlZmF1bHRDbG9jazsKKwlfX3UzMiAgZHdNYXhpbXVtQ2xvY2s7CisJX191OCAgYk51bUNsb2NrU3VwcG9ydGVkOworCV9fdTMyICBkd0RhdGFSYXRlOworCV9fdTMyICBkd01heERhdGFSYXRlOworCV9fdTggIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQ7CisJX191MzIgIGR3TWF4SUZTRDsKKwlfX3UzMiAgZHdTeW5jaFByb3RvY29sczsKKwlfX3UzMiAgZHdNZWNoYW5pY2FsOworCV9fdTMyICBkd0ZlYXR1cmVzOworCV9fdTMyICBkd01heENDSURNZXNzYWdlTGVuZ3RoOworCV9fdTggIGJDbGFzc0dldFJlc3BvbnNlOworCV9fdTggIGJDbGFzc0VudmVsb3BlOworCV9fdTE2IHdMY2RMYXlvdXQ7CisJX191OCAgYlBJTlN1cHBvcnQ7CisJX191OCAgYk1heENDSURCdXN5U2xvdHM7CiB9IF9fcGFja2VkOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9oY2QuaCBiL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCmluZGV4IGIzMDViMGUuLjE2OTlkMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2hjZC5oCkBAIC00MDEsMTIgKzQwMSwxMiBAQAogCWludCAoKnNlY19ldmVudF9yaW5nX3NldHVwKShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1bnNpZ25lZCBpbnQgaW50cl9udW0pOwogCWludCAoKnNlY19ldmVudF9yaW5nX2NsZWFudXApKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCQl1bnNpZ25lZCBpbnQgaW50cl9udW0pOwotCWRtYV9hZGRyX3QgKCpnZXRfc2VjX2V2ZW50X3JpbmdfZG1hX2FkZHIpKHN0cnVjdCB1c2JfaGNkICpoY2QsCi0JCQl1bnNpZ25lZCBpbnQgaW50cl9udW0pOwotCWRtYV9hZGRyX3QgKCpnZXRfeGZlcl9yaW5nX2RtYV9hZGRyKShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAotCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApOwotCWRtYV9hZGRyX3QgKCpnZXRfZGNiYV9kbWFfYWRkcikoc3RydWN0IHVzYl9oY2QgKmhjZCwKLQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKKwlwaHlzX2FkZHJfdCAoKmdldF9zZWNfZXZlbnRfcmluZ19waHlzX2FkZHIpKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJCQl1bnNpZ25lZCBpbnQgaW50cl9udW0sIGRtYV9hZGRyX3QgKmRtYSk7CisJcGh5c19hZGRyX3QgKCpnZXRfeGZlcl9yaW5nX3BoeXNfYWRkcikoc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAorCQkJZG1hX2FkZHJfdCAqZG1hKTsKKwlpbnQgKCpnZXRfY29yZV9pZCkoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBoY2RfZ2l2ZWJhY2tfdXJiX2luX2JoKHN0cnVjdCB1c2JfaGNkICpoY2QpCkBAIC00NDksMTEgKzQ0OSwxMSBAQAogCXVuc2lnbmVkIGludCBpbnRyX251bSk7CiBleHRlcm4gaW50IHVzYl9oY2Rfc2VjX2V2ZW50X3JpbmdfY2xlYW51cChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAl1bnNpZ25lZCBpbnQgaW50cl9udW0pOwotZXh0ZXJuIGRtYV9hZGRyX3QgdXNiX2hjZF9nZXRfc2VjX2V2ZW50X3JpbmdfZG1hX2FkZHIoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JCXVuc2lnbmVkIGludCBpbnRyX251bSk7Ci1leHRlcm4gZG1hX2FkZHJfdCB1c2JfaGNkX2dldF9kY2JhX2RtYV9hZGRyKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKLWV4dGVybiBkbWFfYWRkcl90IHVzYl9oY2RfZ2V0X3hmZXJfcmluZ19kbWFfYWRkcihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKLQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKTsKK2V4dGVybiBwaHlzX2FkZHJfdCB1c2JfaGNkX2dldF9zZWNfZXZlbnRfcmluZ19waHlzX2FkZHIoCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHVuc2lnbmVkIGludCBpbnRyX251bSwgZG1hX2FkZHJfdCAqZG1hKTsKK2V4dGVybiBwaHlzX2FkZHJfdCB1c2JfaGNkX2dldF94ZmVyX3JpbmdfcGh5c19hZGRyKAorCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLCBkbWFfYWRkcl90ICpkbWEpOworZXh0ZXJuIGludCB1c2JfaGNkX2dldF9jb250cm9sbGVyX2lkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKIAogc3RydWN0IHVzYl9oY2QgKl9fdXNiX2NyZWF0ZV9oY2QoY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyLAogCQlzdHJ1Y3QgZGV2aWNlICpzeXNkZXYsIHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVzX25hbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCBmYzZlMjIxLi4xMDYxYWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTMxMiw2ICszMTIsNyBAQAogCV9fV1FfRFJBSU5JTkcJCT0gMSA8PCAxNiwgLyogaW50ZXJuYWw6IHdvcmtxdWV1ZSBpcyBkcmFpbmluZyAqLwogCV9fV1FfT1JERVJFRAkJPSAxIDw8IDE3LCAvKiBpbnRlcm5hbDogd29ya3F1ZXVlIGlzIG9yZGVyZWQgKi8KIAlfX1dRX0xFR0FDWQkJPSAxIDw8IDE4LCAvKiBpbnRlcm5hbDogY3JlYXRlKl93b3JrcXVldWUoKSAqLworCV9fV1FfT1JERVJFRF9FWFBMSUNJVAk9IDEgPDwgMTksIC8qIGludGVybmFsOiBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgpICovCiAKIAlXUV9NQVhfQUNUSVZFCQk9IDUxMiwJICAvKiBJIGxpa2UgNTEyLCBiZXR0ZXIgaWRlYXM/ICovCiAJV1FfTUFYX1VOQk9VTkRfUEVSX0NQVQk9IDQsCSAgLyogNCAqICNjcHVzIGZvciB1bmJvdW5kIHdxICovCkBAIC00MDksNyArNDEwLDggQEAKICAqIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCB3b3JrcXVldWUgb24gc3VjY2VzcywgJU5VTEwgb24gZmFpbHVyZS4KICAqLwogI2RlZmluZSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZShmbXQsIGZsYWdzLCBhcmdzLi4uKQkJCVwKLQlhbGxvY193b3JrcXVldWUoZm10LCBXUV9VTkJPVU5EIHwgX19XUV9PUkRFUkVEIHwgKGZsYWdzKSwgMSwgIyNhcmdzKQorCWFsbG9jX3dvcmtxdWV1ZShmbXQsIFdRX1VOQk9VTkQgfCBfX1dRX09SREVSRUQgfAkJXAorCQkJX19XUV9PUkRFUkVEX0VYUExJQ0lUIHwgKGZsYWdzKSwgMSwgIyNhcmdzKQogCiAjZGVmaW5lIGNyZWF0ZV93b3JrcXVldWUobmFtZSkJCQkJCQlcCiAJYWxsb2Nfd29ya3F1ZXVlKCIlcyIsIF9fV1FfTEVHQUNZIHwgV1FfTUVNX1JFQ0xBSU0sIDEsIChuYW1lKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmggYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCmluZGV4IDgyYjRiNTMuLjczZGEzMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaApAQCAtNDksNiArNDksMTMgQEAKICNkZWZpbmUgQ0ZHODAyMTFfUkVLRVlfREFUQV9LRUtfTEVOIDEKIAogLyoqCisgKiBJbmRpY2F0ZSBiYWNrcG9ydCBzdXBwb3J0IGZvciB0aGUgbmV3IGNmZzgwMjExX3JvYW1lZCBldmVudCB3aGljaCB1bmlmaWVzIHRoZQorICogb2xkIEFQSXMgY2ZnODAyMTFfcm9hbWVkIGFuZCBjZmc4MDIxMV9yb2FtZWRfYnNzIGFuZCB0YWtlcyBhIHN0cnVjdHVyZSB0bworICogdXBkYXRlIHJvYW0gaW5mb3JtYXRpb24gdG8gdGhlIGtlcm5lbC4KKyAqLworI2RlZmluZSBDRkc4MDIxMV9ST0FNRURfQVBJX1VOSUZJRUQgMQorCisvKioKICAqIERPQzogSW50cm9kdWN0aW9uCiAgKgogICogY2ZnODAyMTEgaXMgdGhlIGNvbmZpZ3VyYXRpb24gQVBJIGZvciA4MDIuMTEgZGV2aWNlcyBpbiBMaW51eC4gSXQgYnJpZGdlcwpAQCAtMjY2MSw4ICsyNjY4LDcgQEAKICAqCWluZGljYXRpb24gb2YgcmVxdWVzdGluZyByZWFzc29jaWF0aW9uLgogICoJSW4gYm90aCB0aGUgZHJpdmVyLWluaXRpYXRlZCBhbmQgbmV3IGNvbm5lY3QoKSBjYWxsIGluaXRpYXRlZCByb2FtaW5nCiAgKgljYXNlcywgdGhlIHJlc3VsdCBvZiByb2FtaW5nIGlzIGluZGljYXRlZCB3aXRoIGEgY2FsbCB0bwotICoJY2ZnODAyMTFfcm9hbWVkKCkgb3IgY2ZnODAyMTFfcm9hbWVkX2JzcygpLgotICoJKGludm9rZWQgd2l0aCB0aGUgd2lyZWxlc3NfZGV2IG11dGV4IGhlbGQpCisgKgljZmc4MDIxMV9yb2FtZWQoKS4gKGludm9rZWQgd2l0aCB0aGUgd2lyZWxlc3NfZGV2IG11dGV4IGhlbGQpCiAgKiBAdXBkYXRlX2Nvbm5lY3RfcGFyYW1zOiBVcGRhdGUgdGhlIGNvbm5lY3QgcGFyYW1ldGVycyB3aGlsZSBjb25uZWN0ZWQgdG8gYQogICoJQlNTLiBUaGUgdXBkYXRlZCBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIGJ5IGRyaXZlci9maXJtd2FyZSBmb3IKICAqCXN1YnNlcXVlbnQgQlNTIHNlbGVjdGlvbiAocm9hbWluZykgZGVjaXNpb25zIGFuZCB0byBmb3JtIHRoZQpAQCAtNTMwMSw1MSArNTMwNyw1MCBAQAogfQogCiAvKioKKyAqIHN0cnVjdCBjZmc4MDIxMV9yb2FtX2luZm8gLSBkcml2ZXIgaW5pdGlhdGVkIHJvYW1pbmcgaW5mb3JtYXRpb24KKyAqCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgb2YgdGhlIG5ldyBBUAorICogQGJzczogZW50cnkgb2YgYnNzIHRvIHdoaWNoIFNUQSBnb3Qgcm9hbWVkIChtYXkgYmUgJU5VTEwgaWYgJWJzc2lkIGlzIHNldCkKKyAqIEBic3NpZDogdGhlIEJTU0lEIG9mIHRoZSBuZXcgQVAgKG1heSBiZSAlTlVMTCBpZiAlYnNzIGlzIHNldCkKKyAqIEByZXFfaWU6IGFzc29jaWF0aW9uIHJlcXVlc3QgSUVzIChtYXliZSBiZSAlTlVMTCkKKyAqIEByZXFfaWVfbGVuOiBhc3NvY2lhdGlvbiByZXF1ZXN0IElFcyBsZW5ndGgKKyAqIEByZXNwX2llOiBhc3NvY2lhdGlvbiByZXNwb25zZSBJRXMgKG1heSBiZSAlTlVMTCkKKyAqIEByZXNwX2llX2xlbjogYXNzb2MgcmVzcG9uc2UgSUVzIGxlbmd0aAorICogQGF1dGhvcml6ZWQ6IHRydWUgaWYgdGhlIDgwMi4xWCBhdXRoZW50aWNhdGlvbiB3YXMgZG9uZSBieSB0aGUgZHJpdmVyIG9yIGlzCisgKglub3QgbmVlZGVkIChlLmcuLCB3aGVuIEZhc3QgVHJhbnNpdGlvbiBwcm90b2NvbCB3YXMgdXNlZCksIGZhbHNlCisgKglvdGhlcndpc2UuIElnbm9yZWQgZm9yIG5ldHdvcmtzIHRoYXQgZG9uJ3QgdXNlIDgwMi4xWCBhdXRoZW50aWNhdGlvbi4KKyAqLworc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyB7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKKwljb25zdCB1OCAqYnNzaWQ7CisJY29uc3QgdTggKnJlcV9pZTsKKwlzaXplX3QgcmVxX2llX2xlbjsKKwljb25zdCB1OCAqcmVzcF9pZTsKKwlzaXplX3QgcmVzcF9pZV9sZW47CisJYm9vbCBhdXRob3JpemVkOworfTsKKworLyoqCiAgKiBjZmc4MDIxMV9yb2FtZWQgLSBub3RpZnkgY2ZnODAyMTEgb2Ygcm9hbWluZwogICoKICAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlCi0gKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgb2YgdGhlIG5ldyBBUAotICogQGJzc2lkOiB0aGUgQlNTSUQgb2YgdGhlIG5ldyBBUAotICogQHJlcV9pZTogYXNzb2NpYXRpb24gcmVxdWVzdCBJRXMgKG1heWJlIGJlICVOVUxMKQotICogQHJlcV9pZV9sZW46IGFzc29jaWF0aW9uIHJlcXVlc3QgSUVzIGxlbmd0aAotICogQHJlc3BfaWU6IGFzc29jaWF0aW9uIHJlc3BvbnNlIElFcyAobWF5IGJlICVOVUxMKQotICogQHJlc3BfaWVfbGVuOiBhc3NvYyByZXNwb25zZSBJRXMgbGVuZ3RoCisgKiBAaW5mbzogaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBCU1MuIHN0cnVjdCAmY2ZnODAyMTFfcm9hbV9pbmZvLgogICogQGdmcDogYWxsb2NhdGlvbiBmbGFncwogICoKLSAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIHVuZGVybHlpbmcgZHJpdmVyIHdoZW5ldmVyIGl0IHJvYW1lZAotICogZnJvbSBvbmUgQVAgdG8gYW5vdGhlciB3aGlsZSBjb25uZWN0ZWQuCi0gKi8KLXZvaWQgY2ZnODAyMTFfcm9hbWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAotCQkgICAgIGNvbnN0IHU4ICpic3NpZCwKLQkJICAgICBjb25zdCB1OCAqcmVxX2llLCBzaXplX3QgcmVxX2llX2xlbiwKLQkJICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApOwotCi0vKioKLSAqIGNmZzgwMjExX3JvYW1lZF9ic3MgLSBub3RpZnkgY2ZnODAyMTEgb2Ygcm9hbWluZwotICoKLSAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlCi0gKiBAYnNzOiBlbnRyeSBvZiBic3MgdG8gd2hpY2ggU1RBIGdvdCByb2FtZWQKLSAqIEByZXFfaWU6IGFzc29jaWF0aW9uIHJlcXVlc3QgSUVzIChtYXliZSBiZSAlTlVMTCkKLSAqIEByZXFfaWVfbGVuOiBhc3NvY2lhdGlvbiByZXF1ZXN0IElFcyBsZW5ndGgKLSAqIEByZXNwX2llOiBhc3NvY2lhdGlvbiByZXNwb25zZSBJRXMgKG1heSBiZSAlTlVMTCkKLSAqIEByZXNwX2llX2xlbjogYXNzb2MgcmVzcG9uc2UgSUVzIGxlbmd0aAotICogQGdmcDogYWxsb2NhdGlvbiBmbGFncwotICoKLSAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgdG8gbm90aWZ5IGNmZzgwMjExIG9mIHJvYW1pbmcgZXZlbnQgd2l0aCBkcml2ZXIKLSAqIHBhc3NpbmcgYnNzIHRvIGF2b2lkIGEgcmFjZSBpbiB0aW1lb3V0IG9mIHRoZSBic3MgZW50cnkuIEl0IHNob3VsZCBiZQotICogY2FsbGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGRyaXZlciB3aGVuZXZlciBpdCByb2FtZWQgZnJvbSBvbmUgQVAgdG8gYW5vdGhlcgotICogd2hpbGUgY29ubmVjdGVkLiBEcml2ZXJzIHdoaWNoIGhhdmUgcm9hbWluZyBpbXBsZW1lbnRlZCBpbiBmaXJtd2FyZQotICogbWF5IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGF2b2lkIGEgcmFjZSBpbiBic3MgZW50cnkgdGltZW91dCB3aGVyZSB0aGUgYnNzCi0gKiBlbnRyeSBvZiB0aGUgbmV3IEFQIGlzIHNlZW4gaW4gdGhlIGRyaXZlciwgYnV0IGdldHMgdGltZWQgb3V0IGJ5IHRoZSB0aW1lCi0gKiBpdCBpcyBhY2Nlc3NlZCBpbiBfX2NmZzgwMjExX3JvYW1lZCgpIGR1ZSB0byBkZWxheSBpbiBzY2hlZHVsaW5nCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgZHJpdmVyIHBhc3NpbmcgZWl0aGVyIHRoZSBCU1NJRCBvZiB0aGUKKyAqIG5ldyBBUCBvciBwYXNzaW5nIHRoZSBic3MgZW50cnkgdG8gYXZvaWQgYSByYWNlIGluIHRpbWVvdXQgb2YgdGhlIGJzcyBlbnRyeS4KKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIHVuZGVybHlpbmcgZHJpdmVyIHdoZW5ldmVyIGl0IHJvYW1lZCBmcm9tIG9uZSBBUAorICogdG8gYW5vdGhlciB3aGlsZSBjb25uZWN0ZWQuIERyaXZlcnMgd2hpY2ggaGF2ZSByb2FtaW5nIGltcGxlbWVudGVkIGluCisgKiBmaXJtd2FyZSBzaG91bGQgcGFzcyB0aGUgYnNzIGVudHJ5IHRvIGF2b2lkIGEgcmFjZSBpbiBic3MgZW50cnkgdGltZW91dCB3aGVyZQorICogdGhlIGJzcyBlbnRyeSBvZiB0aGUgbmV3IEFQIGlzIHNlZW4gaW4gdGhlIGRyaXZlciwgYnV0IGdldHMgdGltZWQgb3V0IGJ5IHRoZQorICogdGltZSBpdCBpcyBhY2Nlc3NlZCBpbiBfX2NmZzgwMjExX3JvYW1lZCgpIGR1ZSB0byBkZWxheSBpbiBzY2hlZHVsaW5nCiAgKiByZGV2LT5ldmVudF93b3JrLiBJbiBjYXNlIG9mIGFueSBmYWlsdXJlcywgdGhlIHJlZmVyZW5jZSBpcyByZWxlYXNlZAotICogZWl0aGVyIGluIGNmZzgwMjExX3JvYW1lZF9ic3MoKSBvciBpbiBfX2NmZzgwMjExX3JvbWVkKCksIE90aGVyd2lzZSwKLSAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hpbGUgZGljb25uZXRpbmcgZnJvbSB0aGUgY3VycmVudCBic3MuCisgKiBlaXRoZXIgaW4gY2ZnODAyMTFfcm9hbWVkKCkgb3IgaW4gX19jZmc4MDIxMV9yb21lZCgpLCBPdGhlcndpc2UsIGl0IHdpbGwgYmUKKyAqIHJlbGVhc2VkIHdoaWxlIGRpY29ubmV0aW5nIGZyb20gdGhlIGN1cnJlbnQgYnNzLgogICovCi12b2lkIGNmZzgwMjExX3JvYW1lZF9ic3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLAotCQkJIGNvbnN0IHU4ICpyZXFfaWUsIHNpemVfdCByZXFfaWVfbGVuLAotCQkJIGNvbnN0IHU4ICpyZXNwX2llLCBzaXplX3QgcmVzcF9pZV9sZW4sIGdmcF90IGdmcCk7Cit2b2lkIGNmZzgwMjExX3JvYW1lZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZnODAyMTFfcm9hbV9pbmZvICppbmZvLAorCQkgICAgIGdmcF90IGdmcCk7CiAKIC8qKgogICogY2ZnODAyMTFfZGlzY29ubmVjdGVkIC0gbm90aWZ5IGNmZzgwMjExIHRoYXQgY29ubmVjdGlvbiB3YXMgZHJvcHBlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmggYi9pbmNsdWRlL25ldC9maWJfcnVsZXMuaAppbmRleCAyNjEyMDJmLi44ZGJmZGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9maWJfcnVsZXMuaAorKysgYi9pbmNsdWRlL25ldC9maWJfcnVsZXMuaApAQCAtOTUsOCArOTUsNiBAQAogCVtGUkFfRldNQVJLXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKIAlbRlJBX0ZXTUFTS10JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCiAJW0ZSQV9UQUJMRV0gICAgID0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAotCVtGUkFfVUlEX1NUQVJUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKLQlbRlJBX1VJRF9FTkRdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAogCVtGUkFfU1VQUFJFU1NfUFJFRklYTEVOXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sIFwKIAlbRlJBX1NVUFBSRVNTX0lGR1JPVVBdID0geyAudHlwZSA9IE5MQV9VMzIgfSwgXAogCVtGUkFfR09UT10JPSB7IC50eXBlID0gTkxBX1UzMiB9LCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2ZyYWcuaCBiL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCmluZGV4IDkwOTk3MmEuLjYzNGQxOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfZnJhZy5oCkBAIC0xLDE0ICsxLDkgQEAKICNpZm5kZWYgX19ORVRfRlJBR19IX18KICNkZWZpbmUgX19ORVRfRlJBR19IX18KIAotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+Ci0KIHN0cnVjdCBuZXRuc19mcmFncyB7Ci0JLyogVGhlIHBlcmNwdV9jb3VudGVyICJtZW0iIG5lZWQgdG8gYmUgY2FjaGVsaW5lIGFsaWduZWQuCi0JICogIG1lbS5jb3VudCBtdXN0IG5vdCBzaGFyZSBjYWNoZWxpbmUgd2l0aCBvdGhlciB3cml0ZXJzCi0JICovCi0Jc3RydWN0IHBlcmNwdV9jb3VudGVyICAgbWVtIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci0KKwkvKiBLZWVwIGF0b21pYyBtZW0gb24gc2VwYXJhdGUgY2FjaGVsaW5lcyBpbiBzdHJ1Y3RzIHRoYXQgaW5jbHVkZSBpdCAqLworCWF0b21pY190CQltZW0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAkvKiBzeXNjdGxzICovCiAJaW50CQkJdGltZW91dDsKIAlpbnQJCQloaWdoX3RocmVzaDsKQEAgLTEwOCwxNSArMTAzLDEwIEBACiBpbnQgaW5ldF9mcmFnc19pbml0KHN0cnVjdCBpbmV0X2ZyYWdzICopOwogdm9pZCBpbmV0X2ZyYWdzX2Zpbmkoc3RydWN0IGluZXRfZnJhZ3MgKik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfZnJhZ3NfaW5pdF9uZXQoc3RydWN0IG5ldG5zX2ZyYWdzICpuZikKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X2ZyYWdzX2luaXRfbmV0KHN0cnVjdCBuZXRuc19mcmFncyAqbmYpCiB7Ci0JcmV0dXJuIHBlcmNwdV9jb3VudGVyX2luaXQoJm5mLT5tZW0sIDAsIEdGUF9LRVJORUwpOworCWF0b21pY19zZXQoJm5mLT5tZW0sIDApOwogfQotc3RhdGljIGlubGluZSB2b2lkIGluZXRfZnJhZ3NfdW5pbml0X25ldChzdHJ1Y3QgbmV0bnNfZnJhZ3MgKm5mKQotewotCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJm5mLT5tZW0pOwotfQotCiB2b2lkIGluZXRfZnJhZ3NfZXhpdF9uZXQoc3RydWN0IG5ldG5zX2ZyYWdzICpuZiwgc3RydWN0IGluZXRfZnJhZ3MgKmYpOwogCiB2b2lkIGluZXRfZnJhZ19raWxsKHN0cnVjdCBpbmV0X2ZyYWdfcXVldWUgKnEsIHN0cnVjdCBpbmV0X2ZyYWdzICpmKTsKQEAgLTE0MCwzNyArMTMwLDI0IEBACiAKIC8qIE1lbW9yeSBUcmFja2luZyBGdW5jdGlvbnMuICovCiAKLS8qIFRoZSBkZWZhdWx0IHBlcmNwdV9jb3VudGVyIGJhdGNoIHNpemUgaXMgbm90IGJpZyBlbm91Z2ggdG8gc2NhbGUgdG8KLSAqIGZyYWdtZW50YXRpb24gbWVtIGFjY3Qgc2l6ZXMuCi0gKiBUaGUgbWVtIHNpemUgb2YgYSA2NEsgZnJhZ21lbnQgaXMgYXBwcm94OgotICogICg0NCBmcmFnbWVudHMgKiAyOTQ0IHRydWVzaXplKSArIGZyYWdfcXVldWUgc3RydWN0KDIwMCkgPSAxMjk3MzYgYnl0ZXMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBmcmFnX3BlcmNwdV9jb3VudGVyX2JhdGNoID0gMTMwMDAwOwotCiBzdGF0aWMgaW5saW5lIGludCBmcmFnX21lbV9saW1pdChzdHJ1Y3QgbmV0bnNfZnJhZ3MgKm5mKQogewotCXJldHVybiBwZXJjcHVfY291bnRlcl9yZWFkKCZuZi0+bWVtKTsKKwlyZXR1cm4gYXRvbWljX3JlYWQoJm5mLT5tZW0pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3ViX2ZyYWdfbWVtX2xpbWl0KHN0cnVjdCBuZXRuc19mcmFncyAqbmYsIGludCBpKQogewotCV9fcGVyY3B1X2NvdW50ZXJfYWRkKCZuZi0+bWVtLCAtaSwgZnJhZ19wZXJjcHVfY291bnRlcl9iYXRjaCk7CisJYXRvbWljX3N1YihpLCAmbmYtPm1lbSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfZnJhZ19tZW1fbGltaXQoc3RydWN0IG5ldG5zX2ZyYWdzICpuZiwgaW50IGkpCiB7Ci0JX19wZXJjcHVfY291bnRlcl9hZGQoJm5mLT5tZW0sIGksIGZyYWdfcGVyY3B1X2NvdW50ZXJfYmF0Y2gpOworCWF0b21pY19hZGQoaSwgJm5mLT5tZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzdW1fZnJhZ19tZW1fbGltaXQoc3RydWN0IG5ldG5zX2ZyYWdzICpuZikKK3N0YXRpYyBpbmxpbmUgaW50IHN1bV9mcmFnX21lbV9saW1pdChzdHJ1Y3QgbmV0bnNfZnJhZ3MgKm5mKQogewotCXVuc2lnbmVkIGludCByZXM7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JcmVzID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZuZi0+bWVtKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCXJldHVybiByZXM7CisJcmV0dXJuIGF0b21pY19yZWFkKCZuZi0+bWVtKTsKIH0KIAogLyogUkZDIDMxNjggc3VwcG9ydCA6CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcC5oIGIvaW5jbHVkZS9uZXQvaXAuaAppbmRleCA5ODE2MzY1Li40ZWY2NzkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwLmgKQEAgLTM0Miw3ICszNDIsNyBAQAogCSAgICAhZm9yd2FyZGluZykKIAkJcmV0dXJuIGRzdF9tdHUoZHN0KTsKIAotCXJldHVybiBtaW4oZHN0LT5kZXYtPm10dSwgSVBfTUFYX01UVSk7CisJcmV0dXJuIG1pbihSRUFEX09OQ0UoZHN0LT5kZXYtPm10dSksIElQX01BWF9NVFUpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcF9za2JfZHN0X210dShzdHJ1Y3Qgc29jayAqc2ssCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkJcmV0dXJuIGlwX2RzdF9tdHVfbWF5YmVfZm9yd2FyZChza2JfZHN0KHNrYiksIGZvcndhcmRpbmcpOwogCX0KIAotCXJldHVybiBtaW4oc2tiX2RzdChza2IpLT5kZXYtPm10dSwgSVBfTUFYX01UVSk7CisJcmV0dXJuIG1pbihSRUFEX09OQ0Uoc2tiX2RzdChza2IpLT5kZXYtPm10dSksIElQX01BWF9NVFUpOwogfQogCiB1MzIgaXBfaWRlbnRzX3Jlc2VydmUodTMyIGhhc2gsIGludCBzZWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaCBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaAppbmRleCBhNzRlMmFhLi5hNmJjYjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCkBAIC02OCw2ICs2OCw3IEBACiAJX191MTYJCQlmbl9mbGFnczsKIAlpbnQJCQlmbl9zZXJudW07CiAJc3RydWN0IHJ0Nl9pbmZvCQkqcnJfcHRyOworCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogfTsKIAogI2lmbmRlZiBDT05GSUdfSVBWNl9TVUJUUkVFUwpAQCAtMTAyLDcgKzEwMyw3IEBACiAJICogdGhlIHNhbWUgY2FjaGUgbGluZS4KIAkgKi8KIAlzdHJ1Y3QgZmliNl90YWJsZQkJKnJ0NmlfdGFibGU7Ci0Jc3RydWN0IGZpYjZfbm9kZQkJKnJ0Nmlfbm9kZTsKKwlzdHJ1Y3QgZmliNl9ub2RlIF9fcmN1CQkqcnQ2aV9ub2RlOwogCiAJc3RydWN0IGluNl9hZGRyCQkJcnQ2aV9nYXRld2F5OwogCkBAIC0xNjUsMTMgKzE2Niw0MCBAQAogCXJ0MC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIH0KIAorLyogRnVuY3Rpb24gdG8gc2FmZWx5IGdldCBmbi0+c2VybnVtIGZvciBwYXNzZWQgaW4gcnQKKyAqIGFuZCBzdG9yZSByZXN1bHQgaW4gcGFzc2VkIGluIGNvb2tpZS4KKyAqIFJldHVybiB0cnVlIGlmIHdlIGNhbiBnZXQgY29va2llIHNhZmVseQorICogUmV0dXJuIGZhbHNlIGlmIG5vdAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcnQ2X2dldF9jb29raWVfc2FmZShjb25zdCBzdHJ1Y3QgcnQ2X2luZm8gKnJ0LAorCQkJCSAgICAgICB1MzIgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbjsKKwlib29sIHN0YXR1cyA9IGZhbHNlOworCisJcmN1X3JlYWRfbG9jaygpOworCWZuID0gcmN1X2RlcmVmZXJlbmNlKHJ0LT5ydDZpX25vZGUpOworCisJaWYgKGZuKSB7CisJCSpjb29raWUgPSBmbi0+Zm5fc2VybnVtOworCQlzdGF0dXMgPSB0cnVlOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBzdGF0dXM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIHJ0Nl9nZXRfY29va2llKGNvbnN0IHN0cnVjdCBydDZfaW5mbyAqcnQpCiB7CisJdTMyIGNvb2tpZSA9IDA7CisKIAlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfUENQVSB8fAogCSAgICAodW5saWtlbHkocnQtPmRzdC5mbGFncyAmIERTVF9OT0NBQ0hFKSAmJiBydC0+ZHN0LmZyb20pKQogCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikocnQtPmRzdC5mcm9tKTsKIAotCXJldHVybiBydC0+cnQ2aV9ub2RlID8gcnQtPnJ0Nmlfbm9kZS0+Zm5fc2VybnVtIDogMDsKKwlydDZfZ2V0X2Nvb2tpZV9zYWZlKHJ0LCAmY29va2llKTsKKworCXJldHVybiBjb29raWU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcDZfcnRfcHV0KHN0cnVjdCBydDZfaW5mbyAqcnQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmggYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKaW5kZXggZTBmNDEwOS4uYzJhYTczZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaApAQCAtNTU2LDcgKzU1Niw4IEBACiAJCW1lbWNweShzdHJlYW0gKyBsY3BfbGVuLAogCQkgICAgICAgKChjaGFyICopICZpd2UtPnUpICsgSVdfRVZfUE9JTlRfT0ZGLAogCQkgICAgICAgSVdfRVZfUE9JTlRfUEtfTEVOIC0gSVdfRVZfTENQX1BLX0xFTik7Ci0JCW1lbWNweShzdHJlYW0gKyBwb2ludF9sZW4sIGV4dHJhLCBpd2UtPnUuZGF0YS5sZW5ndGgpOworCQlpZiAoaXdlLT51LmRhdGEubGVuZ3RoICYmIGV4dHJhKQorCQkJbWVtY3B5KHN0cmVhbSArIHBvaW50X2xlbiwgZXh0cmEsIGl3ZS0+dS5kYXRhLmxlbmd0aCk7CiAJCXN0cmVhbSArPSBldmVudF9sZW47CiAJfQogCXJldHVybiBzdHJlYW07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCBlNmFhMGEyLi5mMThmYzFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTc2OCw4ICs3NjgsMTEgQEAKIAlvbGQgPSAqcG9sZDsKIAkqcG9sZCA9IG5ldzsKIAlpZiAob2xkICE9IE5VTEwpIHsKLQkJcWRpc2NfdHJlZV9yZWR1Y2VfYmFja2xvZyhvbGQsIG9sZC0+cS5xbGVuLCBvbGQtPnFzdGF0cy5iYWNrbG9nKTsKKwkJdW5zaWduZWQgaW50IHFsZW4gPSBvbGQtPnEucWxlbjsKKwkJdW5zaWduZWQgaW50IGJhY2tsb2cgPSBvbGQtPnFzdGF0cy5iYWNrbG9nOworCiAJCXFkaXNjX3Jlc2V0KG9sZCk7CisJCXFkaXNjX3RyZWVfcmVkdWNlX2JhY2tsb2cob2xkLCBxbGVuLCBiYWNrbG9nKTsKIAl9CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKaW5kZXggMzFhY2MzZi4uNjFkOWNlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKQEAgLTQ2MCw2ICs0NjAsOCBAQAogCiAjZGVmaW5lIF9zY3RwX3dhbGtfcGFyYW1zKHBvcywgY2h1bmssIGVuZCwgbWVtYmVyKVwKIGZvciAocG9zLnYgPSBjaHVuay0+bWVtYmVyO1wKKyAgICAgKHBvcy52ICsgb2Zmc2V0b2Yoc3RydWN0IHNjdHBfcGFyYW1oZHIsIGxlbmd0aCkgKyBzaXplb2YocG9zLnAtPmxlbmd0aCkgPD1cCisgICAgICAodm9pZCAqKWNodW5rICsgZW5kKSAmJlwKICAgICAgcG9zLnYgPD0gKHZvaWQgKiljaHVuayArIGVuZCAtIG50b2hzKHBvcy5wLT5sZW5ndGgpICYmXAogICAgICBudG9ocyhwb3MucC0+bGVuZ3RoKSA+PSBzaXplb2Yoc2N0cF9wYXJhbWhkcl90KTtcCiAgICAgIHBvcy52ICs9IFNDVFBfUEFENChudG9ocyhwb3MucC0+bGVuZ3RoKSkpCkBAIC00NzAsNiArNDcyLDggQEAKICNkZWZpbmUgX3NjdHBfd2Fsa19lcnJvcnMoZXJyLCBjaHVua19oZHIsIGVuZClcCiBmb3IgKGVyciA9IChzY3RwX2Vycmhkcl90ICopKCh2b2lkICopY2h1bmtfaGRyICsgXAogCSAgICBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7XAorICAgICAoKHZvaWQgKillcnIgKyBvZmZzZXRvZihzY3RwX2Vycmhkcl90LCBsZW5ndGgpICsgc2l6ZW9mKGVyci0+bGVuZ3RoKSA8PVwKKyAgICAgICh2b2lkICopY2h1bmtfaGRyICsgZW5kKSAmJlwKICAgICAgKHZvaWQgKillcnIgPD0gKHZvaWQgKiljaHVua19oZHIgKyBlbmQgLSBudG9ocyhlcnItPmxlbmd0aCkgJiZcCiAgICAgIG50b2hzKGVyci0+bGVuZ3RoKSA+PSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7IFwKICAgICAgZXJyID0gKHNjdHBfZXJyaGRyX3QgKikoKHZvaWQgKillcnIgKyBTQ1RQX1BBRDQobnRvaHMoZXJyLT5sZW5ndGgpKSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9xY29tL2ljbnNzLmggYi9pbmNsdWRlL3NvYy9xY29tL2ljbnNzLmgKaW5kZXggMzUyN2MzNS4uZTU4YTUyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb2MvcWNvbS9pY25zcy5oCisrKyBiL2luY2x1ZGUvc29jL3Fjb20vaWNuc3MuaApAQCAtMTI3LDE2ICsxMjcsNyBAQAogZXh0ZXJuIGludCBpY25zc19zbW11X21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBhZGRyLAogCQkJICB1aW50MzJfdCAqaW92YV9hZGRyLCBzaXplX3Qgc2l6ZSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGljbnNzX3NvY2luZm9fZ2V0X3NlcmlhbF9udW1iZXIoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgaWNuc3Nfc2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwodTE2ICp1bnNhZmVfY2hfbGlzdCwgdTE2IGNoX2NvdW50KTsKLWV4dGVybiBpbnQgaWNuc3NfZ2V0X3dsYW5fdW5zYWZlX2NoYW5uZWwodTE2ICp1bnNhZmVfY2hfbGlzdCwgdTE2ICpjaF9jb3VudCwKLQkJCQkJIHUxNiBidWZfbGVuKTsKLWV4dGVybiBpbnQgaWNuc3Nfd2xhbl9zZXRfZGZzX25vbChjb25zdCB2b2lkICppbmZvLCB1MTYgaW5mb19sZW4pOwotZXh0ZXJuIGludCBpY25zc193bGFuX2dldF9kZnNfbm9sKHZvaWQgKmluZm8sIHUxNiBpbmZvX2xlbik7CiBleHRlcm4gYm9vbCBpY25zc19pc19xbWlfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiBib29sIGljbnNzX2lzX2Z3X3JlYWR5KHZvaWQpOwotZXh0ZXJuIGludCBpY25zc19zZXRfd2xhbl9tYWNfYWRkcmVzcyhjb25zdCB1OCAqaW4sIGNvbnN0IHVpbnQzMl90IGxlbik7Ci1leHRlcm4gdTggKmljbnNzX2dldF93bGFuX21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdWludDMyX3QgKm51bSk7CiBleHRlcm4gaW50IGljbnNzX3RyaWdnZXJfcmVjb3Zlcnkoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgaWNuc3NfZ2V0X2RyaXZlcl9sb2FkX2NudCh2b2lkKTsKLWV4dGVybiB2b2lkIGljbnNzX2luY3JlbWVudF9kcml2ZXJfbG9hZF9jbnQodm9pZCk7CiAjZW5kaWYgLyogX0lDTlNTX1dMQU5fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc29jL3Fjb20vanRhZy5oIGIvaW5jbHVkZS9zb2MvcWNvbS9qdGFnLmgKaW5kZXggNTcxOWUwNS4uZGZmNjAxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb2MvcWNvbS9qdGFnLmgKKysrIGIvaW5jbHVkZS9zb2MvcWNvbS9qdGFnLmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE1LCAyMDE3LiBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9xY29tL21lbW9yeV9kdW1wLmggYi9pbmNsdWRlL3NvYy9xY29tL21lbW9yeV9kdW1wLmgKaW5kZXggNTBlNGI4Yy4uZTY3ZWUwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb2MvcWNvbS9tZW1vcnlfZHVtcC5oCisrKyBiL2luY2x1ZGUvc29jL3Fjb20vbWVtb3J5X2R1bXAuaApAQCAtODMsNiArODMsNyBAQAogCU1TTV9EVU1QX0RBVEFfUlBNID0gMHhFQSwKIAlNU01fRFVNUF9EQVRBX1NDQU5EVU1QID0gMHhFQiwKIAlNU01fRFVNUF9EQVRBX1JQTUggPSAweEVDLAorCU1TTV9EVU1QX0RBVEFfUE9XRVJfUkVHUyA9IDB4RUQsCiAJTVNNX0RVTVBfREFUQV9UTUNfRVRGID0gMHhGMCwKIAlNU01fRFVNUF9EQVRBX1RNQ19SRUcgPSAweDEwMCwKIAlNU01fRFVNUF9EQVRBX0xPR19CVUYgPSAweDExMCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc29jL3Fjb20vcmFtZHVtcC5oIGIvaW5jbHVkZS9zb2MvcWNvbS9yYW1kdW1wLmgKaW5kZXggNTBhMTdjOC4uNGUyM2NjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb2MvcWNvbS9yYW1kdW1wLmgKKysrIGIvaW5jbHVkZS9zb2MvcWNvbS9yYW1kdW1wLmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC0xNiw2ICsxNiw3IEBACiBzdHJ1Y3QgZGV2aWNlOwogCiBzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50IHsKKwljaGFyICpuYW1lOwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl2b2lkICp2X2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBzaXplOwpAQCAtMjgsNiArMjksOCBAQAogCQlpbnQgbnNlZ21lbnRzKTsKIGV4dGVybiBpbnQgZG9fZWxmX3JhbWR1bXAodm9pZCAqaGFuZGxlLCBzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50ICpzZWdtZW50cywKIAkJaW50IG5zZWdtZW50cyk7CitleHRlcm4gaW50IGRvX21pbmlkdW1wKHZvaWQgKmhhbmRsZSwgc3RydWN0IHJhbWR1bXBfc2VnbWVudCAqc2VnbWVudHMsCisJCSAgICAgICBpbnQgbnNlZ21lbnRzKTsKIAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCAqY3JlYXRlX3JhbWR1bXBfZGV2aWNlKGNvbnN0IGNoYXIgKmRldl9uYW1lLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb2MvcWNvbS9ycG1oLmggYi9pbmNsdWRlL3NvYy9xY29tL3JwbWguaAppbmRleCBmMGIzZDAyLi4xOTgyYmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvYy9xY29tL3JwbWguaAorKysgYi9pbmNsdWRlL3NvYy9xY29tL3JwbWguaApAQCAtMzEsNyArMzEsNyBAQAogaW50IHJwbWhfd3JpdGVfYXN5bmMoc3RydWN0IHJwbWhfY2xpZW50ICpyYywgZW51bSBycG1oX3N0YXRlIHN0YXRlLAogCQkJc3RydWN0IHRjc19jbWQgKmNtZCwgaW50IG4pOwogCi1pbnQgcnBtaF93cml0ZV9wYXNzdGhydShzdHJ1Y3QgcnBtaF9jbGllbnQgKnJjLCBlbnVtIHJwbWhfc3RhdGUgc3RhdGUsCitpbnQgcnBtaF93cml0ZV9iYXRjaChzdHJ1Y3QgcnBtaF9jbGllbnQgKnJjLCBlbnVtIHJwbWhfc3RhdGUgc3RhdGUsCiAJCQlzdHJ1Y3QgdGNzX2NtZCAqY21kLCBpbnQgKm4pOwogCiBpbnQgcnBtaF9tb2RlX3NvbHZlcl9zZXQoc3RydWN0IHJwbWhfY2xpZW50ICpyYywgYm9vbCBlbmFibGUpOwpAQCAtNzAsNyArNzAsNyBAQAogCQkJZW51bSBycG1oX3N0YXRlIHN0YXRlLCBzdHJ1Y3QgdGNzX2NtZCAqY21kLCBpbnQgbikKIHsgcmV0dXJuIC1FTk9ERVY7IH0KIAotc3RhdGljIGlubGluZSBpbnQgcnBtaF93cml0ZV9wYXNzdGhydShzdHJ1Y3QgcnBtaF9jbGllbnQgKnJjLAorc3RhdGljIGlubGluZSBpbnQgcnBtaF93cml0ZV9iYXRjaChzdHJ1Y3QgcnBtaF9jbGllbnQgKnJjLAogCQkJZW51bSBycG1oX3N0YXRlIHN0YXRlLCBzdHJ1Y3QgdGNzX2NtZCAqY21kLCBpbnQgKm4pCiB7IHJldHVybiAtRU5PREVWOyB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc29jL3Fjb20vc29jaW5mby5oIGIvaW5jbHVkZS9zb2MvcWNvbS9zb2NpbmZvLmgKaW5kZXggZjE5NmQ0MC4uNzFiZDA3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb2MvcWNvbS9zb2NpbmZvLmgKKysrIGIvaW5jbHVkZS9zb2MvcWNvbS9zb2NpbmZvLmgKQEAgLTEwMiw2ICsxMDIsMTAgQEAKIAlvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCAicWNvbSxzZG04NDUiKQogI2RlZmluZSBlYXJseV9tYWNoaW5lX2lzX3NkbTY3MCgpCVwKIAlvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCAicWNvbSxzZG02NzAiKQorI2RlZmluZSBlYXJseV9tYWNoaW5lX2lzX3FjczYwNSgpCVwKKwlvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCAicWNvbSxxY3M2MDUiKQorI2RlZmluZSBlYXJseV9tYWNoaW5lX2lzX3NkYTY3MCgpCVwKKwlvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCAicWNvbSxzZGE2NzAiKQogI2Vsc2UKICNkZWZpbmUgb2ZfYm9hcmRfaXNfc2ltKCkJCTAKICNkZWZpbmUgb2ZfYm9hcmRfaXNfcnVtaSgpCQkwCkBAIC0xNDIsNiArMTQ2LDggQEAKICNkZWZpbmUgZWFybHlfbWFjaGluZV9pc19zZHhwb29yd2lsbHMoKQkwCiAjZGVmaW5lIGVhcmx5X21hY2hpbmVfaXNfc2RtODQ1KCkJMAogI2RlZmluZSBlYXJseV9tYWNoaW5lX2lzX3NkbTY3MCgpCTAKKyNkZWZpbmUgZWFybHlfbWFjaGluZV9pc19xY3M2MDUoKQkwCisjZGVmaW5lIGVhcmx5X21hY2hpbmVfaXNfc2RhNjcwKCkJMAogI2VuZGlmCiAKICNkZWZpbmUgUExBVEZPUk1fU1VCVFlQRV9NRE0JMQpAQCAtMjA0LDYgKzIxMCw4IEBACiAJU0RYX0NQVV9TRFhQT09SV0lMTFMsCiAJTVNNX0NQVV9TRE04NDUsCiAJTVNNX0NQVV9TRE02NzAsCisJTVNNX0NQVV9RQ1M2MDUsCisJTVNNX0NQVV9TREE2NzAsCiB9OwogCiBzdHJ1Y3QgbXNtX3NvY19pbmZvIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWRzcF9lcnIuaCBiL2luY2x1ZGUvc291bmQvYWRzcF9lcnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiZTkxZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL2Fkc3BfZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fQURTUF9FUlJfXwotI2RlZmluZSBfX0FEU1BfRVJSX18KLQotaW50IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUodTMyIGFkc3BfZXJyb3IpOwotCi1jaGFyICphZHNwX2Vycl9nZXRfZXJyX3N0cih1MzIgYWRzcF9lcnJvcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8tdjIuaCBiL2luY2x1ZGUvc291bmQvYXByX2F1ZGlvLXYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWIwYjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8tdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzUzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLQotI2lmbmRlZiBfQVBSX0FVRElPX1YyX0hfCi0jZGVmaW5lIF9BUFJfQVVESU9fVjJfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLS8qIHNpemUgb2YgaGVhZGVyIG5lZWRlZCBmb3IgcGFzc2luZyBkYXRhIG91dCBvZiBiYW5kICovCi0jZGVmaW5lIEFQUl9DTURfT0JfSERSX1NaICAxMgotCi0vKiBzaXplIG9mIGhlYWRlciBuZWVkZWQgZm9yIGdldHRpbmcgZGF0YSAqLwotI2RlZmluZSBBUFJfQ01EX0dFVF9IRFJfU1ogMTYKLQotc3RydWN0IHBhcmFtX291dGJhbmQgewotCXNpemVfdCAgICAgICBzaXplOwotCXZvaWQgICAgICAgICprdmFkZHI7Ci0JcGh5c19hZGRyX3QgIHBhZGRyOwotfTsKLQotI2RlZmluZSBBRFNQX0FETV9WRVJTSU9OICAgIDB4MDAwNzAwMDAKLQotI2RlZmluZSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgICAgMHgwMDAxMDMyMgotI2RlZmluZSBBRE1fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgMHgwMDAxMDMyMwotI2RlZmluZSBBRE1fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUyAweDAwMDEwMzI0Ci0KLSNkZWZpbmUgQURNX0NNRF9NQVRSSVhfTUFQX1JPVVRJTkdTX1Y1IDB4MDAwMTAzMjUKLSNkZWZpbmUgQURNX0NNRF9TVFJFQU1fREVWSUNFX01BUF9ST1VUSU5HU19WNSAweDAwMDEwMzNECi0vKiBFbnVtZXJhdGlvbiBmb3IgYW4gYXVkaW8gUnggbWF0cml4IElELiovCi0jZGVmaW5lIEFETV9NQVRSSVhfSURfQVVESU9fUlggICAgICAgICAgICAgIDAKLQotI2RlZmluZSBBRE1fTUFUUklYX0lEX0FVRElPX1RYICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQURNX01BVFJJWF9JRF9DT01QUkVTU0VEX0FVRElPX1JYICAgMgotCi0jZGVmaW5lIEFETV9NQVRSSVhfSURfQ09NUFJFU1NFRF9BVURJT19UWCAgIDMKLQotI2RlZmluZSBBRE1fTUFUUklYX0lEX0xJU1RFTl9UWCAgICAgICAgICAgICA0Ci0vKiBFbnVtZXJhdGlvbiBmb3IgYW4gYXVkaW8gVHggbWF0cml4IElELiovCi0jZGVmaW5lIEFETV9NQVRSSVhfSURfQVVESU9YICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQURNX01BWF9DT1BQUyA1Ci0KLS8qIG1ha2Ugc3VyZSB0aGlzIG1hdGNoZXMgd2l0aCBtc21fYXVkaW9fY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgU1BfVjJfTlVNX01BWF9TUEtSIDIKLQotLyogU2Vzc2lvbiBtYXAgbm9kZSBzdHJ1Y3R1cmUuCi0gKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIG51bV9jb3BwcwotICogZW50cmllcyBvZiBDT1BQIElEcy4gVGhlIENPUFAgSURzIGFyZSAxNiBiaXRzLCBzbwotICogdGhlcmUgbWlnaHQgYmUgYSBwYWRkaW5nIDE2LWJpdCBmaWVsZCBpZiBudW1fY29wcHMKLSAqIGlzIG9kZC4KLSAqLwotc3RydWN0IGFkbV9zZXNzaW9uX21hcF9ub2RlX3Y1IHsKLQl1MTYgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOwotCS8qIEhhbmRsZSBvZiB0aGUgQVNNIHNlc3Npb24gdG8gYmUgcm91dGVkLiBTdXBwb3J0ZWQgdmFsdWVzOiAxCi0JICogdG8gOC4KLQkgKi8KLQotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NvcHBzOwotCS8qIE51bWJlciBvZiBDT1BQcyB0byB3aGljaCB0aGlzIHNlc3Npb24gaXMgdG8gYmUgcm91dGVkLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgPCBudW1fY29wcHMgPD0gQURNX01BWF9DT1BQUy4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRF9NQVRSSVhfTUFQX1JPVVRJTkdTX1Y1IGNvbW1hbmQuCi0gKglJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIG51bV9zZXNzaW9ucyBvZiB0aGUgc2Vzc2lvbiBtYXAKLSAqCW5vZGUgcGF5bG9hZCAoYWRtX3Nlc3Npb25fbWFwX25vZGVfdjUpLgotICovCi0KLXN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQotCXUzMiAgICAgICAgICAgICAgICAgIG1hdHJpeF9pZDsKLQkvKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IElEIGlzIEF1ZGlvIFJ4ICgwKSBvciBBdWRpbyBUeAotCSAqICgxKS4gVXNlIHRoZSBBRE1fTUFUUklYX0lEX0FVRElPX1JYIG9yIEFETV9NQVRSSVhfSURfQVVESU9YCi0JICogbWFjcm9zIHRvIHNldCB0aGlzIGZpZWxkLgotCSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIG51bV9zZXNzaW9uczsKLQkvKiBOdW1iZXIgb2Ygc2Vzc2lvbnMgYmVpbmcgdXBkYXRlZCBieSB0aGlzIGNvbW1hbmQgKG9wdGlvbmFsKS4gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFRoaXMgY29tbWFuZCBhbGxvd3MgYSBjbGllbnQgdG8gb3BlbiBhIENPUFAvVm9pY2UgUHJvYy4gVFggbW9kdWxlCi0gKiBhbmQgc2V0cyB1cCB0aGUgZGV2aWNlIHNlc3Npb246IE1hdHJpeCAtPiBDT1BQIC0+IEFGRSBvbiB0aGUgUlgKLSAqIGFuZCBBRkUgLT4gQ09QUCAtPiBNYXRyaXggb24gdGhlIFRYLiBUaGlzIGVuYWJsZXMgUENNIGRhdGEgdG8KLSAqIGJlIHRyYW5zZmVycmVkIHRvL2Zyb20gdGhlIGVuZHBvaW50IChBRkVQb3J0SUQpLgotICoKLSAqIEByZXR1cm4KLSAqICNBRE1fQ01EUlNQX0RFVklDRV9PUEVOX1Y1IHdpdGggdGhlIHJlc3VsdGluZyBzdGF0dXMgYW5kIENPUFAgSUQuCi0gKi8KLSNkZWZpbmUgQURNX0NNRF9ERVZJQ0VfT1BFTl9WNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMyNgotCi0vKiBUaGlzIGNvbW1hbmQgYWxsb3dzIGEgY2xpZW50IHRvIG9wZW4gYSBDT1BQL1ZvaWNlIFByb2MgdGhlCi0gKgl3YXkgYXMgQURNX0NNRF9ERVZJQ0VfT1BFTl9WNSBidXQgc3VwcG9ydHMgbXVsdGlwbGUgZW5kcG9pbnQyCi0gKgljaGFubmVscy4KLSAqCi0gKglAcmV0dXJuCi0gKgkjQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNiB3aXRoIHRoZSByZXN1bHRpbmcgc3RhdHVzIGFuZAotICoJQ09QUCBJRC4KLSAqLwotI2RlZmluZSBBRE1fQ01EX0RFVklDRV9PUEVOX1Y2ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzNTYKLQotLyogRGVmaW5pdGlvbiBmb3IgYSBsb3cgbGF0ZW5jeSBzdHJlYW0gc2Vzc2lvbi4gKi8KLSNkZWZpbmUgQURNX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OCQkJMHgyMDAwCi0KLS8qIERlZmluaXRpb24gZm9yIGEgdWx0cmEgbG93IGxhdGVuY3kgc3RyZWFtIHNlc3Npb24uICovCi0jZGVmaW5lIEFETV9VTFRSQV9MT1dfTEFURU5DWV9ERVZJQ0VfU0VTU0lPTgkJMHg0MDAwCi0KLS8qIERlZmluaXRpb24gZm9yIGEgdWx0cmEgbG93IGxhdGVuY3kgd2l0aCBQb3N0IFByb2Nlc3Npbmcgc3RyZWFtIHNlc3Npb24uICovCi0jZGVmaW5lIEFETV9VTExfUE9TVF9QUk9DRVNTSU5HX0RFVklDRV9TRVNTSU9OCQkweDgwMDAKLQotLyogRGVmaW5pdGlvbiBmb3IgYSBsZWdhY3kgZGV2aWNlIHNlc3Npb24uICovCi0jZGVmaW5lIEFETV9MRUdBQ1lfREVWSUNFX1NFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogSW5kaWNhdGVzIHRoYXQgZW5kcG9pbnRfaWRfMiBpcyB0byBiZSBpZ25vcmVkLiovCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX0VORF9QT0lOVF9JRF8yX0lHTk9SRQkJCQkweEZGRkYKLQotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9NT0RFX09GX09QRVJBVElPTl9SWF9QQVRIX0NPUFAJCSAxCi0KLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5fTU9ERV9PRl9PUEVSQVRJT05YX1BBVEhfTElWRV9DT1BQCQkgMgotCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX01PREVfT0ZfT1BFUkFUSU9OWF9QQVRIX05PTl9MSVZFX0NPUFAJIDMKLQotLyogSW5kaWNhdGVzIHRoYXQgYW4gYXVkaW8gQ09QUCBpcyB0byBzZW5kL3JlY2VpdmUgYSBtb25vIFBDTQotICogc3RyZWFtIHRvL2Zyb20KLSAqCUVORF9QT0lOVF9JRF8xLgotICovCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX0NIQU5ORUxfQ09ORklHX01PTk8JCTEKLQotLyogSW5kaWNhdGVzIHRoYXQgYW4gYXVkaW8gQ09QUCBpcyB0byBzZW5kL3JlY2VpdmUgYQotICoJc3RlcmVvIFBDTSBzdHJlYW0gdG8vZnJvbSBFTkRfUE9JTlRfSURfMS4KLSAqLwotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9DSEFOTkVMX0NPTkZJR19TVEVSRU8JCTIKLQotLyogU2FtcGxlIHJhdGUgaXMgODAwMCBIei4qLwotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9TQU1QTEVfUkFURV84SyA4MDAwCi0KLS8qIFNhbXBsZSByYXRlIGlzIDE2MDAwIEh6LiovCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX1NBTVBMRV9SQVRFXzE2SyAxNjAwMAotCi0vKiBTYW1wbGUgcmF0ZSBpcyA0ODAwMCBIei4qLwotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTl9TQU1QTEVfUkFURV80OEsgNDgwMDAKLQotLyogRGVmaW5pdGlvbiBmb3IgYSBDT1BQIGxpdmUgaW5wdXQgZmxhZyBiaXRtYXNrLiovCi0jZGVmaW5lIEFETV9CSVRfTUFTS19DT1BQX0xJVkVfSU5QVVRfRkxBRyAoMHgwMDAxVSkKLQotLyogRGVmaW5pdGlvbiBmb3IgYSBDT1BQIGxpdmUgc2hpZnQgdmFsdWUgYml0bWFzay4qLwotI2RlZmluZSBBRE1fU0hJRlRfQ09QUF9MSVZFX0lOUFVUX0ZMQUcJIDAKLQotLyogRGVmaW5pdGlvbiBmb3IgdGhlIENPUFAgSUQgYml0bWFzay4qLwotI2RlZmluZSBBRE1fQklUX01BU0tfQ09QUF9JRCAgKDB4MDAwMEZGRkZVTCkKLQotLyogRGVmaW5pdGlvbiBmb3IgdGhlIENPUFAgSUQgc2hpZnQgdmFsdWUuKi8KLSNkZWZpbmUgQURNX1NISUZUX0NPUFBfSUQJMAotCi0vKiBEZWZpbml0aW9uIGZvciB0aGUgc2VydmljZSBJRCBiaXRtYXNrLiovCi0jZGVmaW5lIEFETV9CSVRfTUFTS19TRVJWSUNFX0lEICAoMHgwMEZGMDAwMFVMKQotCi0vKiBEZWZpbml0aW9uIGZvciB0aGUgc2VydmljZSBJRCBzaGlmdCB2YWx1ZS4qLwotI2RlZmluZSBBRE1fU0hJRlRfU0VSVklDRV9JRAkxNgotCi0vKiBEZWZpbml0aW9uIGZvciB0aGUgZG9tYWluIElEIGJpdG1hc2suKi8KLSNkZWZpbmUgQURNX0JJVF9NQVNLX0RPTUFJTl9JRCAgICAoMHhGRjAwMDAwMFVMKQotCi0vKiBEZWZpbml0aW9uIGZvciB0aGUgZG9tYWluIElEIHNoaWZ0IHZhbHVlLiovCi0jZGVmaW5lIEFETV9TSElGVF9ET01BSU5fSUQJMjQKLQotLyogQURNIGRldmljZSBvcGVuIGNvbW1hbmQgcGF5bG9hZCBvZiB0aGUKLSAqICNBRE1fQ01EX0RFVklDRV9PUEVOX1Y1IGNvbW1hbmQuCi0gKi8KLXN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1IHsKLQlzdHJ1Y3QgYXByX2hkcgkJaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIGZsYWdzOwotLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZAotICogdG8gemVyby4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgbW9kZV9vZl9vcGVyYXRpb247Ci0vKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgQ09QUCBtdXN0IGJlIG9wZW5lZCBvbiB0aGUgVHggb3IgUngKLSAqIHBhdGguIFVzZSB0aGUgQURNX0NNRF9DT1BQX09QRU5fTU9ERV9PRl9PUEVSQVRJT05fKiBtYWNyb3MgZm9yCi0gKiBzdXBwb3J0ZWQgdmFsdWVzIGFuZCBpbnRlcnByZXRhdGlvbi4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDB4MSAtLSBSeCBwYXRoIENPUFAKLSAqIC0gMHgyIC0tIFR4IHBhdGggbGl2ZSBDT1BQCi0gKiAtIDB4MyAtLSBUeCBwYXRoIG5vbmxpdmUgQ09QUAotICogTGl2ZSBjb25uZWN0aW9ucyBjYXVzZSBzYW1wbGUgZGlzY2FyZGluZyBpbiB0aGUgVHggZGV2aWNlCi0gKiBtYXRyaXggaWYgdGhlIGRlc3RpbmF0aW9uIG91dHB1dCBwb3J0cyBkbyBub3QgcHVsbCB0aGVtCi0gKiBmYXN0IGVub3VnaC4gTm9ubGl2ZSBjb25uZWN0aW9ucyBxdWV1ZSB0aGUgc2FtcGxlcwotICogaW5kZWZpbml0ZWx5LgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBlbmRwb2ludF9pZF8xOwotLyogTG9naWNhbCBhbmQgcGh5c2ljYWwgZW5kcG9pbnQgSUQgb2YgdGhlIGF1ZGlvIHBhdGguCi0gKiBJZiB0aGUgSUQgaXMgYSB2b2ljZSBwcm9jZXNzb3IgVHggYmxvY2ssIGl0IHJlY2VpdmVzIG5lYXIKLSAqIHNhbXBsZXMuCVN1cHBvcnRlZCB2YWx1ZXM6IEFueSBwc2V1ZG9wb3J0LCBBRkUgUnggcG9ydCwKLSAqIG9yIEFGRSBUeCBwb3J0IEZvciBhIGxpc3Qgb2YgdmFsaWQgSURzLCByZWZlciB0bwotICogQHhoeXBlcnJlZntRNCxbUTRdfS4KLSAqIFE0ID0gSGV4YWdvbiBNdWx0aW1lZGlhOiBBRkUgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfaWRfMjsKLS8qIExvZ2ljYWwgYW5kIHBoeXNpY2FsIGVuZHBvaW50IElEIDIgZm9yIGEgdm9pY2UgcHJvY2Vzc29yCi0gKiBUeCBibG9jay4KLSAqIFRoaXMgaXMgbm90IGFwcGxpY2FibGUgdG8gYXVkaW8gQ09QUC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIEFGRSBSeCBwb3J0Ci0gKiAtIDB4RkZGRiAtLSBFbmRwb2ludCAyIGlzIHVuYXZhaWxhYmxlIGFuZCB0aGUgdm9pY2UKLSAqIHByb2Nlc3NvciBUeAotICogYmxvY2sgaWdub3JlcyB0aGlzIGVuZHBvaW50Ci0gKiBXaGVuIHRoZSB2b2ljZSBwcm9jZXNzb3IgVHggYmxvY2sgaXMgY3JlYXRlZCBvbiB0aGUgYXVkaW8KLSAqIHJlY29yZCBwYXRoLAotICogaXQgY2FuIHJlY2VpdmUgZmFyLWVuZCBzYW1wbGVzIGZyb20gYW4gQUZFIFJ4IHBvcnQgaWYgdGhlCi0gKiB2b2ljZSBjYWxsCi0gKiBpcyBhY3RpdmUuIFRoZSBJRCBvZiB0aGUgQUZFIHBvcnQgaXMgcHJvdmlkZWQgaW4gdGhpcwotICogZmllbGQuCi0gKiBGb3IgYSBsaXN0IG9mIHZhbGlkIElEcywgcmVmZXIgQHhoeXBlcnJlZntRNCxbUTRdfS4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgdG9wb2xvZ3lfaWQ7Ci0vKiBBdWRpbyBDT1BQIHRvcG9sb2d5IElEOyAzMi1iaXQgR1VJRC4gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGRldl9udW1fY2hhbm5lbDsKLS8qIE51bWJlciBvZiBjaGFubmVscyB0aGUgYXVkaW8gQ09QUCBzZW5kcyB0by9yZWNlaXZlcyBmcm9tCi0gKiB0aGUgZW5kcG9pbnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDguCi0gKiBUaGUgdmFsdWUgaXMgaWdub3JlZCBmb3IgdGhlIHZvaWNlIHByb2Nlc3NvciBUeCBibG9jaywKLSAqIHdoZXJlIGNoYW5uZWwKLSAqIGNvbmZpZ3VyYXRpb24gaXMgZGVyaXZlZCBmcm9tIHRoZSB0b3BvbG9neSBJRC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOwotLyogQml0IHdpZHRoIChpbiBiaXRzKSB0aGF0IHRoZSBhdWRpbyBDT1BQIHNlbmRzIHRvL3JlY2VpdmVzCi0gKiBmcm9tIHRoZQotICogZW5kcG9pbnQuIFRoZSB2YWx1ZSBpcyBpZ25vcmVkIGZvciB0aGUgdm9pY2UgcHJvY2Vzc2luZwotICogVHggYmxvY2ssCi0gKiB3aGVyZSB0aGUgUENNIHdpZHRoIGlzIDE2IGJpdHMuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogU2FtcGxpbmcgcmF0ZSBhdCB3aGljaCB0aGUgYXVkaW8gQ09QUC92b2ljZSBwcm9jZXNzb3IKLSAqIFR4IGJsb2NrCi0gKiBpbnRlcmZhY2VzIHdpdGggdGhlIGVuZHBvaW50LgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3Igdm9pY2UgcHJvY2Vzc29yIFR4OiA4MDAwLCAxNjAwMCwKLSAqIDQ4MDAwIEh6Ci0gKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhdWRpbyBDT1BQOiA+MCBhbmQgPD0xOTIga0h6Ci0gKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgIGRldl9jaGFubmVsX21hcHBpbmdbOF07Ci0vKiBBcnJheSBvZiBjaGFubmVsIG1hcHBpbmcgb2YgYnVmZmVycyB0aGF0IHRoZSBhdWRpbyBDT1BQCi0gKiBzZW5kcyB0byB0aGUgZW5kcG9pbnQuIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbAotICogSSBpbnNpZGUgdGhlIGJ1ZmZlciwgd2hlcmUgMCA8IGkgPCBkZXZfbnVtX2NoYW5uZWwuCi0gKiBUaGlzIHZhbHVlIGlzIHJlbGV2YW50IG9ubHkgZm9yIGFuIGF1ZGlvIFJ4IENPUFAuCi0gKiBGb3IgdGhlIHZvaWNlIHByb2Nlc3NvciBibG9jayBhbmQgVHggYXVkaW8gYmxvY2ssIHRoaXMgZmllbGQKLSAqIGlzIHNldCB0byB6ZXJvIGFuZCBpcyBpZ25vcmVkLgotICovCi19IF9fcGFja2VkOwotCi0vKiAgQURNIGRldmljZSBvcGVuIGNvbW1hbmQgcGF5bG9hZCBvZiB0aGUKLSAqICAjQURNX0NNRF9ERVZJQ0VfT1BFTl9WNiBjb21tYW5kLgotICovCi1zdHJ1Y3QgYWRtX2NtZF9kZXZpY2Vfb3Blbl92NiB7Ci0Jc3RydWN0IGFwcl9oZHIJCWhkcjsKLQl1MTYgICAgICAgICAgICAgICAgICBmbGFnczsKLS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQKLSAqIHRvIHplcm8uCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIG1vZGVfb2Zfb3BlcmF0aW9uOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIENPUFAgbXVzdCBiZSBvcGVuZWQgb24gdGhlIFR4IG9yIFJ4Ci0gKiBwYXRoLiBVc2UgdGhlIEFETV9DTURfQ09QUF9PUEVOX01PREVfT0ZfT1BFUkFUSU9OXyogbWFjcm9zIGZvcgotICogc3VwcG9ydGVkIHZhbHVlcyBhbmQgaW50ZXJwcmV0YXRpb24uCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAweDEgLS0gUnggcGF0aCBDT1BQCi0gKiAtIDB4MiAtLSBUeCBwYXRoIGxpdmUgQ09QUAotICogLSAweDMgLS0gVHggcGF0aCBub25saXZlIENPUFAKLSAqIExpdmUgY29ubmVjdGlvbnMgY2F1c2Ugc2FtcGxlIGRpc2NhcmRpbmcgaW4gdGhlIFR4IGRldmljZQotICogbWF0cml4IGlmIHRoZSBkZXN0aW5hdGlvbiBvdXRwdXQgcG9ydHMgZG8gbm90IHB1bGwgdGhlbQotICogZmFzdCBlbm91Z2guIE5vbmxpdmUgY29ubmVjdGlvbnMgcXVldWUgdGhlIHNhbXBsZXMKLSAqIGluZGVmaW5pdGVseS4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZW5kcG9pbnRfaWRfMTsKLS8qIExvZ2ljYWwgYW5kIHBoeXNpY2FsIGVuZHBvaW50IElEIG9mIHRoZSBhdWRpbyBwYXRoLgotICogSWYgdGhlIElEIGlzIGEgdm9pY2UgcHJvY2Vzc29yIFR4IGJsb2NrLCBpdCByZWNlaXZlcyBuZWFyCi0gKiBzYW1wbGVzLglTdXBwb3J0ZWQgdmFsdWVzOiBBbnkgcHNldWRvcG9ydCwgQUZFIFJ4IHBvcnQsCi0gKiBvciBBRkUgVHggcG9ydCBGb3IgYSBsaXN0IG9mIHZhbGlkIElEcywgcmVmZXIgdG8KLSAqIEB4aHlwZXJyZWZ7UTQsW1E0XX0uCi0gKiBRNCA9IEhleGFnb24gTXVsdGltZWRpYTogQUZFIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGVuZHBvaW50X2lkXzI7Ci0vKiBMb2dpY2FsIGFuZCBwaHlzaWNhbCBlbmRwb2ludCBJRCAyIGZvciBhIHZvaWNlIHByb2Nlc3NvcgotICogVHggYmxvY2suCi0gKiBUaGlzIGlzIG5vdCBhcHBsaWNhYmxlIHRvIGF1ZGlvIENPUFAuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSBBRkUgUnggcG9ydAotICogLSAweEZGRkYgLS0gRW5kcG9pbnQgMiBpcyB1bmF2YWlsYWJsZSBhbmQgdGhlIHZvaWNlCi0gKiBwcm9jZXNzb3IgVHgKLSAqIGJsb2NrIGlnbm9yZXMgdGhpcyBlbmRwb2ludAotICogV2hlbiB0aGUgdm9pY2UgcHJvY2Vzc29yIFR4IGJsb2NrIGlzIGNyZWF0ZWQgb24gdGhlIGF1ZGlvCi0gKiByZWNvcmQgcGF0aCwKLSAqIGl0IGNhbiByZWNlaXZlIGZhci1lbmQgc2FtcGxlcyBmcm9tIGFuIEFGRSBSeCBwb3J0IGlmIHRoZQotICogdm9pY2UgY2FsbAotICogaXMgYWN0aXZlLiBUaGUgSUQgb2YgdGhlIEFGRSBwb3J0IGlzIHByb3ZpZGVkIGluIHRoaXMKLSAqIGZpZWxkLgotICogRm9yIGEgbGlzdCBvZiB2YWxpZCBJRHMsIHJlZmVyIEB4aHlwZXJyZWZ7UTQsW1E0XX0uCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHRvcG9sb2d5X2lkOwotLyogQXVkaW8gQ09QUCB0b3BvbG9neSBJRDsgMzItYml0IEdVSUQuICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBkZXZfbnVtX2NoYW5uZWw7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMgdGhlIGF1ZGlvIENPUFAgc2VuZHMgdG8vcmVjZWl2ZXMgZnJvbQotICogdGhlIGVuZHBvaW50LgotICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4LgotICogVGhlIHZhbHVlIGlzIGlnbm9yZWQgZm9yIHRoZSB2b2ljZSBwcm9jZXNzb3IgVHggYmxvY2ssCi0gKiB3aGVyZSBjaGFubmVsCi0gKiBjb25maWd1cmF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgdG9wb2xvZ3kgSUQuCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKLS8qIEJpdCB3aWR0aCAoaW4gYml0cykgdGhhdCB0aGUgYXVkaW8gQ09QUCBzZW5kcyB0by9yZWNlaXZlcwotICogZnJvbSB0aGUKLSAqIGVuZHBvaW50LiBUaGUgdmFsdWUgaXMgaWdub3JlZCBmb3IgdGhlIHZvaWNlIHByb2Nlc3NpbmcKLSAqIFR4IGJsb2NrLAotICogd2hlcmUgdGhlIFBDTSB3aWR0aCBpcyAxNiBiaXRzLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIFNhbXBsaW5nIHJhdGUgYXQgd2hpY2ggdGhlIGF1ZGlvIENPUFAvdm9pY2UgcHJvY2Vzc29yCi0gKiBUeCBibG9jawotICogaW50ZXJmYWNlcyB3aXRoIHRoZSBlbmRwb2ludC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIHZvaWNlIHByb2Nlc3NvciBUeDogODAwMCwgMTYwMDAsCi0gKiA0ODAwMCBIegotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYXVkaW8gQ09QUDogPjAgYW5kIDw9MTkyIGtIegotICovCi0KLQl1OCAgICAgICAgICAgICAgICAgICBkZXZfY2hhbm5lbF9tYXBwaW5nWzhdOwotLyogQXJyYXkgb2YgY2hhbm5lbCBtYXBwaW5nIG9mIGJ1ZmZlcnMgdGhhdCB0aGUgYXVkaW8gQ09QUAotICogc2VuZHMgdG8gdGhlIGVuZHBvaW50LiBDaGFubmVsW2ldIG1hcHBpbmcgZGVzY3JpYmVzIGNoYW5uZWwKLSAqIEkgaW5zaWRlIHRoZSBidWZmZXIsIHdoZXJlIDAgPCBpIDwgZGV2X251bV9jaGFubmVsLgotICogVGhpcyB2YWx1ZSBpcyByZWxldmFudCBvbmx5IGZvciBhbiBhdWRpbyBSeCBDT1BQLgotICogRm9yIHRoZSB2b2ljZSBwcm9jZXNzb3IgYmxvY2sgYW5kIFR4IGF1ZGlvIGJsb2NrLCB0aGlzIGZpZWxkCi0gKiBpcyBzZXQgdG8gemVybyBhbmQgaXMgaWdub3JlZC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZGV2X251bV9jaGFubmVsX2VpZDI7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMgdGhlIHZvaWNlIHByb2Nlc3NvciBibG9jayBzZW5kcwotICogdG8vcmVjZWl2ZXMgZnJvbSB0aGUgZW5kcG9pbnQyLgotICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4LgotICogVGhlIHZhbHVlIGlzIGlnbm9yZWQgZm9yIGF1ZGlvIENPUFAgb3IgaWYgZW5kcG9pbnRfaWRfMiBpcwotICogc2V0IHRvIDB4RkZGRi4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoX2VpZDI7Ci0vKiBCaXQgd2lkdGggKGluIGJpdHMpIHRoYXQgdGhlIHZvaWNlIHByb2Nlc3NvciBzZW5kcwotICogdG8vcmVjZWl2ZXMgZnJvbSB0aGUgZW5kcG9pbnQyLgotICogU3VwcG9ydGVkIHZhbHVlczogMTYgYW5kIDI0LgotICogVGhlIHZhbHVlIGlzIGlnbm9yZWQgZm9yIGF1ZGlvIENPUFAgb3IgaWYgZW5kcG9pbnRfaWRfMiBpcwotICogc2V0IHRvIDB4RkZGRi4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGVfZWlkMjsKLS8qIFNhbXBsaW5nIHJhdGUgYXQgd2hpY2ggdGhlIHZvaWNlIHByb2Nlc3NvciBUeCBibG9jawotICogaW50ZXJmYWNlcyB3aXRoIHRoZSBlbmRwb2ludDIuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBUeCB2b2ljZSBwcm9jZXNzb3I6ID4wIGFuZCA8PTM4NCBrSHoKLSAqIFRoZSB2YWx1ZSBpcyBpZ25vcmVkIGZvciBhdWRpbyBDT1BQIG9yIGlmIGVuZHBvaW50X2lkXzIgaXMKLSAqIHNldCB0byAweEZGRkYuCi0gKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgIGRldl9jaGFubmVsX21hcHBpbmdfZWlkMls4XTsKLS8qIEFycmF5IG9mIGNoYW5uZWwgbWFwcGluZyBvZiBidWZmZXJzIHRoYXQgdGhlIHZvaWNlIHByb2Nlc3NvcgotICogc2VuZHMgdG8gdGhlIGVuZHBvaW50LiBDaGFubmVsW2ldIG1hcHBpbmcgZGVzY3JpYmVzIGNoYW5uZWwKLSAqIEkgaW5zaWRlIHRoZSBidWZmZXIsIHdoZXJlIDAgPCBpIDwgZGV2X251bV9jaGFubmVsLgotICogVGhpcyB2YWx1ZSBpcyByZWxldmFudCBvbmx5IGZvciB0aGUgVHggdm9pY2UgcHJvY2Vzc29yLgotICogVGhlIHZhbHVlcyBhcmUgaWdub3JlZCBmb3IgYXVkaW8gQ09QUCBvciBpZiBlbmRwb2ludF9pZF8yIGlzCi0gKiBzZXQgdG8gMHhGRkZGLgotICovCi19IF9fcGFja2VkOwotCi0vKgotICoJVGhpcyBjb21tYW5kIGFsbG93cyB0aGUgY2xpZW50IHRvIGNsb3NlIGEgQ09QUCBhbmQgZGlzY29ubmVjdAotICoJdGhlIGRldmljZSBzZXNzaW9uLgotICovCi0jZGVmaW5lIEFETV9DTURfREVWSUNFX0NMT1NFX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMjcKLQotLyogU2V0cyBvbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHRvIGEgQ09QUC4gKi8KLSNkZWZpbmUgQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMyOAotCi0vKiAgUGF5bG9hZCBvZiB0aGUgI0FETV9DTURfU0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLgotICoJSWYgdGhlIGRhdGFfcGF5bG9hZF9hZGRyX2xzdyBhbmQgZGF0YV9wYXlsb2FkX2FkZHJfbXN3IGVsZW1lbnQKLSAqCWFyZSBOVUxMLCBhIHNlcmllcyBvZiBhZG1fcGFyYW1fZGF0YXN0cnVjdHVyZXMgaW1tZWRpYXRlbHkKLSAqCWZvbGxvd3MsIHdob3NlIHRvdGFsIHNpemUgaXMgZGF0YV9wYXlsb2FkX3NpemUgYnl0ZXMuCi0gKi8KLXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIJCXBheWxvYWRfYWRkcl9sc3c7Ci0vKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLwotCXUzMgkJcGF5bG9hZF9hZGRyX21zdzsKLS8qIE1TVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuICovCi0KLQl1MzIJCW1lbV9tYXBfaGFuZGxlOwotLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCi0gKiBjb21tYW5kCi0gKgotICogSWYgbWVtX21hcF9oYW5kbGUgaXMgemVybyBpbXBsaWVzIHRoZSBtZXNzYWdlIGlzIGluCi0gKiB0aGUgcGF5bG9hZAotICovCi0KLQl1MzIJCXBheWxvYWRfc2l6ZTsKLS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhcmlhYmxlIHBheWxvYWQgYWNjb21wYW55aW5nIHRoaXMKLSAqIG1lc3NhZ2Ugb3IKLSAqIGluIHNoYXJlZCBtZW1vcnkuIFRoaXMgaXMgdXNlZCBmb3IgcGFyc2luZyB0aGUgcGFyYW1ldGVyCi0gKiBwYXlsb2FkLgotICovCi19IF9fcGFja2VkOwotCi0vKiAgUGF5bG9hZCBmb3JtYXQgZm9yIENPUFAgcGFyYW1ldGVyIGRhdGEuCi0gKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIHBhcmFtX3NpemUgYnl0ZXMKLSAqIG9mIHBhcmFtZXRlcgotICogZGF0YS4KLSAqLwotc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IHsKLQl1MzIgICAgICAgICAgICAgICAgICBtb2R1bGVfaWQ7Ci0JLyogVW5pcXVlIElEIG9mIHRoZSBtb2R1bGUuICovCi0JdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7Ci0JLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLQkvKiBEYXRhIHNpemUgb2YgdGhlIHBhcmFtX2lkL21vZHVsZV9pZCBjb21iaW5hdGlvbi4KLQkgKiBUaGlzIHZhbHVlIGlzIGEKLQkgKiBtdWx0aXBsZSBvZiA0IGJ5dGVzLgotCSAqLwotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgZW5oYW5jZW1lbnRzLgotCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfUFBfRVZFTlRTIDB4MDAwMTMyMTMKLSNkZWZpbmUgQVNNX1NUUkVBTV9QUF9FVkVOVCAweDAwMDEzMjE0Ci0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX1JFR0lTVEVSX0lFQ182MTkzN19GTVRfVVBEQVRFIDB4MTMzMzMKLSNkZWZpbmUgQVNNX0lFQ182MTkzN19NRURJQV9GTVRfRVZFTlQgMHgxMzMzNAotCi0jZGVmaW5lIERTUF9TVFJFQU1fQ01EICJBRFNQIFN0cmVhbSBDbWQiCi0jZGVmaW5lIERTUF9TVFJFQU1fQ0FMTEJBQ0sgIkFEU1AgU3RyZWFtIENhbGxiYWNrIEV2ZW50IgotI2RlZmluZSBEU1BfU1RSRUFNX0NBTExCQUNLX1FVRVVFX1NJWkUgMTAyNAotCi1zdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEgZXZlbnQ7Ci19OwotCi1zdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19wcnRkIHsKLQl1aW50MTZfdCBldmVudF9jb3VudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X3F1ZXVlOwotCXNwaW5sb2NrX3QgcHJ0ZF9zcGluX2xvY2s7Ci19OwotCi0vKiBzZXQgY3VzdG9taXplZCBtaXhpbmcgb24gbWF0cml4IG1peGVyICovCi0jZGVmaW5lIEFETV9DTURfU0VUX1BTUERfTVRNWF9TVFJUUl9QQVJBTVNfVjUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzQ0Ci1zdHJ1Y3QgYWRtX2NtZF9zZXRfcHNwZF9tdG14X3N0cnRyX3BhcmFtc192NSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCS8qIExTVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuKi8KLQl1MzIJCXBheWxvYWRfYWRkcl9sc3c7Ci0JLyogTVNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLwotCXUzMgkJcGF5bG9hZF9hZGRyX21zdzsKLQkvKiBNZW1vcnkgbWFwIGhhbmRsZSByZXR1cm5lZCBieSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgKi8KLQkvKiBjb21tYW5kLiBJZiBtZW1fbWFwX2hhbmRsZSBpcyB6ZXJvIGltcGxpZXMgdGhlIG1lc3NhZ2UgaXMgaW4gKi8KLQkvKiB0aGUgcGF5bG9hZCAqLwotCXUzMgkJbWVtX21hcF9oYW5kbGU7Ci0JLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgdmFyaWFibGUgcGF5bG9hZCBhY2NvbXBhbnlpbmcgdGhpcyAqLwotCS8qIG1lc3NhZ2Ugb3IgaW4gc2hhcmVkIG1lbW9yeS4gVGhpcyBpcyB1c2VkIGZvciBwYXJzaW5nIHRoZSAqLwotCS8qIHBhcmFtZXRlciBwYXlsb2FkLiAqLwotCXUzMgkJcGF5bG9hZF9zaXplOwotCXUxNgkJZGlyZWN0aW9uOwotCXUxNgkJc2Vzc2lvbmlkOwotCXUxNgkJZGV2aWNlaWQ7Ci0JdTE2CQlyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qIERlZmluZWQgc3BlY2lmaWNhbGx5IGZvciBpbi1iYW5kIHVzZSwgaW5jbHVkZXMgcGFyYW1zICovCi1zdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCS8qIExTVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuKi8KLQl1MzIgICAgICAgICAgICAgcGF5bG9hZF9hZGRyX2xzdzsKLQkvKiBNU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiovCi0JdTMyICAgICAgICAgICAgIHBheWxvYWRfYWRkcl9tc3c7Ci0JLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TICovCi0JLyogY29tbWFuZC4gSWYgbWVtX21hcF9oYW5kbGUgaXMgemVybyBpbXBsaWVzIHRoZSBtZXNzYWdlIGlzIGluICovCi0JLyogdGhlIHBheWxvYWQgKi8KLQl1MzIgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci0JLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgdmFyaWFibGUgcGF5bG9hZCBhY2NvbXBhbnlpbmcgdGhpcyAqLwotCS8qIG1lc3NhZ2Ugb3IgaW4gc2hhcmVkIG1lbW9yeS4gVGhpcyBpcyB1c2VkIGZvciBwYXJzaW5nIHRoZSAqLwotCS8qIHBhcmFtZXRlciBwYXlsb2FkLiAqLwotCXUzMiAgICAgICAgICAgICBwYXlsb2FkX3NpemU7Ci0JLyogUGFyYW1ldGVycyBwYXNzZWQgZm9yIGluIGJhbmQgcGF5bG9hZCAqLwotCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSAgICAgICAgcGFyYW1zOwotfSBfX3BhY2tlZDsKLQotLyogUmV0dXJucyB0aGUgc3RhdHVzIGFuZCBDT1BQIElEIHRvIGFuICNBRE1fQ01EX0RFVklDRV9PUEVOX1Y1IGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUgQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzI5Ci0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNSBtZXNzYWdlLAotICoJd2hpY2ggcmV0dXJucyB0aGUKLSAqCXN0YXR1cyBhbmQgQ09QUCBJRCB0byBhbiAjQURNX0NNRF9ERVZJQ0VfT1BFTl9WNSBjb21tYW5kLgotICovCi1zdHJ1Y3QgYWRtX2NtZF9yc3BfZGV2aWNlX29wZW5fdjUgewotCXUzMiAgICAgICAgICAgICAgICAgIHN0YXR1czsKLQkvKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkuKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGNvcHBfaWQ7Ci0JLyogQ09QUCBJRDogIFN1cHBvcnRlZCB2YWx1ZXM6IDAgPD0gY29wcF9pZCA8IEFETV9NQVhfQ09QUFMqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogUmVzZXJ2ZWQuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLQotLyogUmV0dXJucyB0aGUgc3RhdHVzIGFuZCBDT1BQIElEIHRvIGFuICNBRE1fQ01EX0RFVklDRV9PUEVOX1Y2IGNvbW1hbmQuICovCi0jZGVmaW5lIEFETV9DTURSU1BfREVWSUNFX09QRU5fVjYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDM1NwotCi0vKiAgUGF5bG9hZCBvZiB0aGUgI0FETV9DTURSU1BfREVWSUNFX09QRU5fVjYgbWVzc2FnZSwKLSAqCXdoaWNoIHJldHVybnMgdGhlCi0gKglzdGF0dXMgYW5kIENPUFAgSUQgdG8gYW4gI0FETV9DTURfREVWSUNFX09QRU5fVjYgY29tbWFuZAotICoJaXMgdGhlIGV4YWN0IHNhbWUgYXMgQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNS4KLSAqLwotCi0vKiBUaGlzIGNvbW1hbmQgYWxsb3dzIGEgcXVlcnkgb2Ygb25lIENPUFAgcGFyYW1ldGVyLiAqLwotI2RlZmluZSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMkEKLQotLyogIFBheWxvYWQgYW4gI0FETV9DTURfR0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLiAqLwotc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX2xzdzsKLQkvKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9tc3c7Ci0JLyogTVNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLwotCi0JLyogSWYgdGhlIG1lbV9tYXBfaGFuZGxlIGlzIG5vbiB6ZXJvLAotCSAqIG9uIEFDSywgdGhlIFBhcmFtRGF0YSBwYXlsb2FkcyBiZWdpbiBhdAotCSAqIHRoZSBhZGRyZXNzIHNwZWNpZmllZCAob3V0LW9mLWJhbmQpLgotCSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci0JLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQKLQkgKiBieSBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZC4KLQkgKiBJZiB0aGUgbWVtX21hcF9oYW5kbGUgaXMgMCwgaXQgaW1wbGllcyB0aGF0Ci0JICogdGhlIEFDSydzIHBheWxvYWQgd2lsbCBjb250YWluIHRoZSBQYXJhbURhdGEgKGluLWJhbmQpLgotCSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgbW9kdWxlX2lkOwotCS8qIFVuaXF1ZSBJRCBvZiB0aGUgbW9kdWxlLiAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7Ci0JLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBwYXJhbV9tYXhfc2l6ZTsKLQkvKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyCi0JICpJRC9tb2R1bGUgSUQgY29tYmluYXRpb24uIFRoaXMKLQkgKiBmaWVsZCBpcyBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCi0JICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBlbmhhbmNlbWVudHMuCi0JICogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgotCSAqLwotfSBfX3BhY2tlZDsKLQotLyogUmV0dXJucyBwYXJhbWV0ZXIgdmFsdWVzCi0gKglpbiByZXNwb25zZSB0byBhbiAjQURNX0NNRF9HRVRfUFBfUEFSQU1TX1Y1IGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUgQURNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1Y1CQkweDAwMDEwMzJCCi0KLS8qIFBheWxvYWQgb2YgdGhlICNBRE1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjUgbWVzc2FnZSwKLSAqIHdoaWNoIHJldHVybnMgcGFyYW1ldGVyIHZhbHVlcyBpbiByZXNwb25zZQotICogdG8gYW4gI0FETV9DTURfR0VUX1BQX1BBUkFNU19WNSBjb21tYW5kLgotICogSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMKLSAqIHN0cnVjdHVyZSBpcyB0aGUgYWRtX3BhcmFtX2RhdGFfdjUKLSAqIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBwcmUvcG9zdHByb2Nlc3NpbmcKLSAqIHBhcmFtZXRlciBkYXRhLiBGb3IgYW4gaW4tYmFuZAotICogc2NlbmFyaW8sIHRoZSB2YXJpYWJsZSBwYXlsb2FkIGRlcGVuZHMKLSAqIG9uIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIuCi0gKi8KLXN0cnVjdCBhZG1fY21kX3JzcF9nZXRfcHBfcGFyYW1zX3Y1IHsKLQl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0JLyogU3RhdHVzIG1lc3NhZ2UgKGVycm9yIGNvZGUpLiovCi19IF9fcGFja2VkOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgc29mdCBzdGVwcGluZyB2b2x1bWUgcGFyYW1ldGVycy4gKi8KLQotLyoKLSAqIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUwotICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUuCi0gKi8KLQotc3RydWN0IGF1ZHByb2Nfc29mdHZvbHVtZV9wYXJhbXMgewotCXUzMiBwZXJpb2Q7Ci0JdTMyIHN0ZXA7Ci0JdTMyIHJhbXBpbmdjdXJ2ZTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBJRCBvZiB0aGUgTWVkaWEgRm9ybWF0IENvbnZlcnRlciAoTUZDKSBtb2R1bGUuCi0gKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6Ci0gKiAjQVVEUFJPQ19QQVJBTV9JRF9NRkNfT1VUUFVUX01FRElBX0ZPUk1BVAotICogI0FVRFBST0NfQ0hNSVhFUl9QQVJBTV9JRF9DT0VGRgotICovCi0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX01GQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOTEyCi0KLS8qIElEIG9mIHRoZSBPdXRwdXQgTWVkaWEgRm9ybWF0IHBhcmFtZXRlcnMgdXNlZCBieSBBVURQUk9DX01PRFVMRV9JRF9NRkMuCi0gKgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfTUZDX09VVFBVVF9NRURJQV9GT1JNQVQgICAgICAgICAgICAweDAwMDEwOTEzCi0KLQotc3RydWN0IGF1ZHByb2NfbWZjX291dHB1dF9tZWRpYV9mbXQgewotCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgcGFyYW1zOwotCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBkYXRhOwotCXVpbnQzMl90IHNhbXBsaW5nX3JhdGU7Ci0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlOwotCXVpbnQxNl90IG51bV9jaGFubmVsczsKLQl1aW50MTZfdCBjaGFubmVsX3R5cGVbOF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXVkcHJvY192b2x1bWVfY3RybF9tYXN0ZXJfZ2FpbiB7Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBwYXJhbXM7Ci0Jc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IGRhdGE7Ci0JLyogTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG1hc3Rlcl9nYWluOwotCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLwotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXVkcHJvY19zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyB7Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBwYXJhbXM7Ci0Jc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IGRhdGE7Ci0vKgotICogUGVyaW9kIGluIG1pbGxpc2Vjb25kcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTUwMDAKLSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGVyaW9kOwotLyoKLSAqIFN0ZXAgaW4gbWljcm9zZWNvbmRzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxNTAwMDAwMAotICovCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBzdGVwOwotLyoKLSAqIFJhbXBpbmcgY3VydmUgdHlwZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTElORUFSCi0gKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfRVhQCi0gKiAtICNBVURQUk9DX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTE9HCi0gKi8KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHJhbXBpbmdfY3VydmU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXVkcHJvY19lbmFibGVfcGFyYW1fdCB7Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUgcHBfcGFyYW1zOwotCS8qCi0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlIGlzIGVuYWJsZWQuCi0JICogVGhpcyBwYXJhbWV0ZXIgaXMgZ2VuZXJpYy9jb21tb24gcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBvcgotCSAqIGRldGVybWluZSB0aGUgc3RhdGUgb2YgYW55IGF1ZGlvIHByb2Nlc3NpbmcgbW9kdWxlLgotCi0JICogQHZhbHVlcyAwIDogRGlzYWJsZSAxOiBFbmFibGUKLQkgKi8KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZTsKLX07Ci0KLS8qCi0gKiBBbGxvd3MgYSBjbGllbnQgdG8gY29udHJvbCB0aGUgZ2FpbnMgb24gdmFyaW91cyBzZXNzaW9uLXRvLUNPUFAgcGF0aHMuCi0gKi8KLSNkZWZpbmUgQURNX0NNRF9NQVRSSVhfUkFNUF9HQUlOU19WNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMkMKLQotLyogSW5kaWNhdGVzIHRoYXQgdGhlIHRhcmdldCBnYWluIGluIHRoZQotICoJY3VycmVudCBhZG1fc2Vzc2lvbl9jb3BwX2dhaW5fdjUKLSAqCXN0cnVjdHVyZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbAotICoJdGhlIHNlc3Npb24tdG8tQ09QUCBwYXRocyB0aGF0IGV4aXN0IGZvcgotICoJdGhlIHNwZWNpZmllZCBzZXNzaW9uLgotICovCi0jZGVmaW5lIEFETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfQ09QUF9JRF9BTExfQ09OTkVDVEVEX0NPUFBTICAgICAweEZGRkYKLQotLyogSW5kaWNhdGVzIHRoYXQgdGhlIHRhcmdldCBnYWluIGlzCi0gKiB0byBiZSBpbW1lZGlhdGVseSBhcHBsaWVkIHRvIHRoZQotICogc3BlY2lmaWVkIHNlc3Npb24tdG8tQ09QUCBwYXRoLAotICogd2l0aG91dCBhIHJhbXBpbmcgZmFzaGlvbi4KLSAqLwotI2RlZmluZSBBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfRFVSQVRJT05fSU1NRURJQVRFICAgICAgICAgMHgwMDAwCi0KLS8qIEVudW1lcmF0aW9uIGZvciBhIGxpbmVhciByYW1waW5nIGN1cnZlLiovCi0jZGVmaW5lIEFETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfUkFNUF9DVVJWRV9MSU5FQVIgICAgICAgICAgICAgICAweDAwMDAKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1Y1IGNvbW1hbmQuCi0gKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlIG51bV9nYWlucyBvZiB0aGUKLSAqIGFkbV9zZXNzaW9uX2NvcHBfZ2Fpbl92NXN0cnVjdHVyZS4KLSAqLwotc3RydWN0IGFkbV9jbWRfbWF0cml4X3JhbXBfZ2FpbnNfdjUgewotCXUzMiAgICAgICAgICAgICAgICAgIG1hdHJpeF9pZDsKLS8qIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtYXRyaXggSUQgaXMgQXVkaW8gUnggKDApIG9yIEF1ZGlvIFR4ICgxKS4KLSAqIFVzZSB0aGUgQURNX01BVFJJWF9JRF9BVURJT19SWCBvciAgQURNX01BVFJJWF9JRF9BVURJT1gKLSAqIG1hY3JvcyB0byBzZXQgdGhpcyBmaWVsZC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX2dhaW5zOwotCS8qIE51bWJlciBvZiBnYWlucyBiZWluZyBhcHBsaWVkLiAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfZm9yX2FsaWduOwotCS8qIFJlc2VydmVkLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uKi8KLX0gX19wYWNrZWQ7Ci0KLS8qICBTZXNzaW9uLXRvLUNPUFAgcGF0aCBnYWluIHN0cnVjdHVyZSwgdXNlZCBieSB0aGUKLSAqCSNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1Y1IGNvbW1hbmQuCi0gKglUaGlzIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIHRhcmdldAotICoJZ2FpbiAocGVyIGNoYW5uZWwpIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gKgl0byBhIHBhcnRpY3VsYXIgc2Vzc2lvbi10by1DT1BQIHBhdGggaW4KLSAqCXRoZSBhdWRpbyBtYXRyaXguIFRoZSBzdHJ1Y3R1cmUgY2FuCi0gKglhbHNvIGJlIHVzZWQgdG8gYXBwbHkgdGhlIGdhaW4gZ2xvYmFsbHkKLSAqCXRvIGFsbCBzZXNzaW9uLXRvLUNPUFAgcGF0aHMgdGhhdAotICoJZXhpc3QgZm9yIHRoZSBnaXZlbiBzZXNzaW9uLgotICoJVGhlIGFEU1AgdXNlcyBkZXZpY2UgY2hhbm5lbCBtYXBwaW5nIHRvCi0gKglkZXRlcm1pbmUgd2hpY2ggY2hhbm5lbCBnYWlucyB0bwotICoJdXNlIGZyb20gdGhpcyBjb21tYW5kLiBGb3IgZXhhbXBsZSwKLSAqCWlmIHRoZSBkZXZpY2UgaXMgY29uZmlndXJlZCBhcyBzdGVyZW8sCi0gKgl0aGUgYURTUCB1c2VzIG9ubHkgdGFyZ2V0X2dhaW5fY2hfMSBhbmQKLSAqCXRhcmdldF9nYWluX2NoXzIsIGFuZCBpdCBpZ25vcmVzCi0gKgl0aGUgb3RoZXJzLgotICovCi1zdHJ1Y3QgYWRtX3Nlc3Npb25fY29wcF9nYWluX3Y1IHsKLQl1MTYgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOwotLyogSGFuZGxlIG9mIHRoZSBBU00gc2Vzc2lvbi4KLSAqCVN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgY29wcF9pZDsKLS8qIEhhbmRsZSBvZiB0aGUgQ09QUC4gR2FpbiB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIFNlc3Npb24gSUQKLSAqIENPUFAgSUQgcGF0aC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmFtcF9kdXJhdGlvbjsKLS8qIER1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIG9mIHRoZSByYW1wIG92ZXIKLSAqIHdoaWNoIHRhcmdldCBnYWlucyBhcmUKLSAqIHRvIGJlIGFwcGxpZWQuIFVzZQotICogI0FETV9DTURfTUFUUklYX1JBTVBfR0FJTlNfUkFNUF9EVVJBVElPTl9JTU1FRElBVEUKLSAqIHRvIGluZGljYXRlIHRoYXQgZ2FpbiBtdXN0IGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHN0ZXBfZHVyYXRpb247Ci0vKiBEdXJhdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSBvZiBlYWNoIHN0ZXAgaW4gdGhlIHJhbXAuCi0gKiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGlmIHJhbXBfZHVyYXRpb24gaXMgZXF1YWwgdG8KLSAqICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfRFVSQVRJT05fSU1NRURJQVRFLgotICogU3VwcG9ydGVkIHZhbHVlOiAxCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJhbXBfY3VydmU7Ci0vKiBUeXBlIG9mIHJhbXBpbmcgY3VydmUuCi0gKiBTdXBwb3J0ZWQgdmFsdWU6ICNBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TX1JBTVBfQ1VSVkVfTElORUFSCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkX2Zvcl9hbGlnbjsKLQkvKiBSZXNlcnZlZC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMTsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMSBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMjsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMiBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfMzsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgMyBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNDsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNCBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNTsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNSBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNjsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNiBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfNzsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgNyBpbiBRMTMgZm9ybWF0OyAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgdGFyZ2V0X2dhaW5fY2hfODsKLQkvKiBUYXJnZXQgbGluZWFyIGdhaW4gZm9yIGNoYW5uZWwgOCBpbiBRMTMgZm9ybWF0OyAqLwotfSBfX3BhY2tlZDsKLQotLyogQWxsb3dzIHRvIHNldCBtdXRlL3VubXV0ZSBvbiB2YXJpb3VzIHNlc3Npb24tdG8tQ09QUCBwYXRocy4KLSAqCUZvciBldmVyeSBzZXNzaW9uLXRvLUNPUFAgcGF0aCAoc3RyZWFtLWRldmljZSBpbnRlcmNvbm5lY3Rpb24pLAotICoJbXV0ZS91bm11dGUgY2FuIGJlIHNldCBpbmRpdmlkdWFsbHkgb24gdGhlIG91dHB1dCBjaGFubmVscy4KLSAqLwotI2RlZmluZSBBRE1fQ01EX01BVFJJWF9NVVRFX1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzJECi0KLS8qIEluZGljYXRlcyB0aGF0IG11dGUvdW5tdXRlIGluIHRoZQotICoJY3VycmVudCBhZG1fc2Vzc2lvbl9jb3BwX211dGVfdjVzdHJ1Y3R1cmUKLSAqCWlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzZXNzaW9uLXRvLUNPUFAKLSAqCXBhdGhzIHRoYXQgZXhpc3QgZm9yIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4KLSAqLwotI2RlZmluZSBBRE1fQ01EX01BVFJJWF9NVVRFX0NPUFBfSURfQUxMX0NPTk5FQ1RFRF9DT1BQUyAgICAgMHhGRkZGCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRF9NQVRSSVhfTVVURV9WNSBjb21tYW5kKi8KLXN0cnVjdCBhZG1fY21kX21hdHJpeF9tdXRlX3Y1IHsKLQl1MzIgICAgICAgICAgICAgICAgICBtYXRyaXhfaWQ7Ci0vKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgbWF0cml4IElEIGlzIEF1ZGlvIFJ4ICgwKSBvciBBdWRpbyBUeCAoMSkuCi0gKiBVc2UgdGhlIEFETV9NQVRSSVhfSURfQVVESU9fUlggb3IgIEFETV9NQVRSSVhfSURfQVVESU9YCi0gKiBtYWNyb3MgdG8gc2V0IHRoaXMgZmllbGQuCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQ7Ci0vKiBIYW5kbGUgb2YgdGhlIEFTTSBzZXNzaW9uLgotICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4LgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBjb3BwX2lkOwotLyogSGFuZGxlIG9mIHRoZSBDT1BQLgotICogVXNlIEFETV9DTURfTUFUUklYX01VVEVfQ09QUF9JRF9BTExfQ09OTkVDVEVEX0NPUFBTCi0gKiB0byBpbmRpY2F0ZSB0aGF0IG11dGUvdW5tdXRlIG11c3QgYmUgYXBwbGllZCB0bwotICogYWxsIHRoZSBDT1BQcyBjb25uZWN0ZWQgdG8gc2Vzc2lvbl9pZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDB4RkZGRiAtLSBBcHBseSBtdXRlL3VubXV0ZSB0byBhbGwgY29ubmVjdGVkIENPUFBzCi0gKiAtIE90aGVyIHZhbHVlcyAtLSBWYWxpZCBDT1BQIElECi0gKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzE7Ci0JLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDEgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCi0KLQl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF8yOwotCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCAyIGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLwotCi0JdTggICAgICAgICAgICAgICAgICBtdXRlX2ZsYWdfY2hfMzsKLQkvKiBNdXRlIGZsYWcgZm9yIGNoYW5uZWwgMyBpcyBzZXQgdG8gdW5tdXRlICgwKSBvciBtdXRlICgxKS4gKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzQ7Ci0JLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDQgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCi0KLQl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF81OwotCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCA1IGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLwotCi0JdTggICAgICAgICAgICAgICAgICBtdXRlX2ZsYWdfY2hfNjsKLQkvKiBNdXRlIGZsYWcgZm9yIGNoYW5uZWwgNiBpcyBzZXQgdG8gdW5tdXRlICgwKSBvciBtdXRlICgxKS4gKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgbXV0ZV9mbGFnX2NoXzc7Ci0JLyogTXV0ZSBmbGFnIGZvciBjaGFubmVsIDcgaXMgc2V0IHRvIHVubXV0ZSAoMCkgb3IgbXV0ZSAoMSkuICovCi0KLQl1OCAgICAgICAgICAgICAgICAgIG11dGVfZmxhZ19jaF84OwotCS8qIE11dGUgZmxhZyBmb3IgY2hhbm5lbCA4IGlzIHNldCB0byB1bm11dGUgKDApIG9yIG11dGUgKDEpLiAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICByYW1wX2R1cmF0aW9uOwotLyogUGVyaW9kIChpbiBtaWxsaXNlY29uZHMpIG92ZXIgd2hpY2ggdGhlIHNvZnQgbXV0ZS91bm11dGUgd2lsbCBiZQotICogYXBwbGllZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgKERlZmF1bHQpIHRvIDB4RkZGRgotICogVGhlIGRlZmF1bHQgb2YgMCBtZWFucyBtdXRlL3VubXV0ZSB3aWxsIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRfZm9yX2FsaWduOwotCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9BQUNfU1RFUkVPX01JWF9DT0VGRl9TRUxFQ1RJT05fRkxBR19WMiAoMHgwMDAxMEREOCkKLQotc3RydWN0IGFzbV9hYWNfc3RlcmVvX21peF9jb2VmZl9zZWxlY3Rpb25fcGFyYW1fdjIgewotCXN0cnVjdCBhcHJfaGRyICAgICAgICAgIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zaXplOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGFhY19zdGVyZW9fbWl4X2NvZWZmX2ZsYWc7Ci19IF9fcGFja2VkOwotCi0vKiBBbGxvd3MgYSBjbGllbnQgdG8gY29ubmVjdCB0aGUgZGVzaXJlZCBzdHJlYW0gdG8KLSAqIHRoZSBkZXNpcmVkIEFGRSBwb3J0IHRocm91Z2ggdGhlIHN0cmVhbSByb3V0ZXIKLSAqCi0gKiBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBjbGllbnQgdG8gY29ubmVjdCBzcGVjaWZpZWQgc2Vzc2lvbiB0bwotICogc3BlY2lmaWVkIEFGRSBwb3J0LiBUaGlzIGlzIHVzZWQgZm9yIGNvbXByZXNzZWQgc3RyZWFtcyBvbmx5Ci0gKiBvcGVuZWQgdXNpbmcgdGhlICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQgb3IKLSAqICNBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfQ09NUFJFU1NFRCBjb21tYW5kLgotICoKLSAqIEBwcmVyZXF1aXNpdGVzCi0gKiBTZXNzaW9uIElEIGFuZCBBRkUgUG9ydCBJRCBtdXN0IGJlIHZhbGlkLgotICogI0FTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfQ09NUFJFU1NFRCBvcgotICogI0FTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9DT01QUkVTU0VECi0gKiBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcyBzZXNzaW9uLgotICovCi0KLSNkZWZpbmUgQURNX0NNRF9DT05ORUNUX0FGRV9QT1JUX1Y1CTB4MDAwMTAzMkUKLSNkZWZpbmUgQURNX0NNRF9ESVNDT05ORUNUX0FGRV9QT1JUX1Y1CTB4MDAwMTAzMkYKLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgUnggc3RyZWFtIHJvdXRlciBJRC4qLwotI2RlZmluZSBBRE1fU1RSVFJfSURfUlggICAgICAgICAgICAgICAgICAgIDAKLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgVHggc3RyZWFtIHJvdXRlciBJRC4qLwotI2RlZmluZSBBRE1fU1RSVFJfSURYICAgICAgICAgICAgICAgICAgICAxCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQURNX0NNRF9DT05ORUNUX0FGRV9QT1JUX1Y1IGNvbW1hbmQuKi8KLXN0cnVjdCBhZG1fY21kX2Nvbm5lY3RfYWZlX3BvcnRfdjUgewotCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7Ci0JdTggICAgICAgICAgICAgICAgICBtb2RlOwotLyogSUQgb2YgdGhlIHN0cmVhbSByb3V0ZXIgKFJYL1RYKS4gVXNlIHRoZQotICogQURNX1NUUlRSX0lEX1JYIG9yIEFETV9TVFJUUl9JRFggbWFjcm9zCi0gKiB0byBzZXQgdGhpcyBmaWVsZC4KLSAqLwotCi0JdTggICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOwotCS8qIFNlc3Npb24gSUQgb2YgdGhlIHN0cmVhbSB0byBjb25uZWN0ICovCi0KLQl1MTYgICAgICAgICAgICAgICAgIGFmZV9wb3J0X2lkOwotCS8qIFBvcnQgSUQgb2YgdGhlIEFGRSBwb3J0IHRvIGNvbm5lY3QgdG8uKi8KLQl1MzIgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKLS8qIE51bWJlciBvZiBkZXZpY2UgY2hhbm5lbHMKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDIoQXVkaW8gU2FtcGxlIFBhY2tldCksCi0gKiA4IChIQlIgQXVkaW8gU3RyZWFtIFNhbXBsZSBQYWNrZXQpCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgc2FtcGxpbmdfcmF0ZTsKLS8qIERldmljZSBzYW1wbGluZyByYXRlCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkKLSAqLwotfSBfX3BhY2tlZDsKLQotCi0vKiBhZHNwX2FkbV9hcGkuaCAqLwotCi0KLS8qIFBvcnQgSUQuIFVwZGF0ZSBhZmVfZ2V0X3BvcnRfaW5kZXgKLSAqIHdoZW4gYSBuZXcgcG9ydCBpcyBhZGRlZCBoZXJlLgotICovCi0jZGVmaW5lIFBSSU1BUllfSTJTX1JYIDAKLSNkZWZpbmUgUFJJTUFSWV9JMlNfVFggMQotI2RlZmluZSBTRUNPTkRBUllfSTJTX1JYIDQKLSNkZWZpbmUgU0VDT05EQVJZX0kyU19UWCA1Ci0jZGVmaW5lIE1JMlNfUlggNgotI2RlZmluZSBNSTJTX1RYIDcKLSNkZWZpbmUgSERNSV9SWCA4Ci0jZGVmaW5lIFJTVkRfMiA5Ci0jZGVmaW5lIFJTVkRfMyAxMAotI2RlZmluZSBESUdJX01JQ19UWCAxMQotI2RlZmluZSBWT0lDRTJfUExBWUJBQ0tfVFggMHg4MDAyCi0jZGVmaW5lIFZPSUNFX1JFQ09SRF9SWCAweDgwMDMKLSNkZWZpbmUgVk9JQ0VfUkVDT1JEX1RYIDB4ODAwNAotI2RlZmluZSBWT0lDRV9QTEFZQkFDS19UWCAweDgwMDUKLQotLyogU2xpbWJ1cyBNdWx0aSBjaGFubmVsIHBvcnQgaWQgcG9vbCAgKi8KLSNkZWZpbmUgU0xJTUJVU18wX1JYCQkweDQwMDAKLSNkZWZpbmUgU0xJTUJVU18wX1RYCQkweDQwMDEKLSNkZWZpbmUgU0xJTUJVU18xX1JYCQkweDQwMDIKLSNkZWZpbmUgU0xJTUJVU18xX1RYCQkweDQwMDMKLSNkZWZpbmUgU0xJTUJVU18yX1JYCQkweDQwMDQKLSNkZWZpbmUgU0xJTUJVU18yX1RYCQkweDQwMDUKLSNkZWZpbmUgU0xJTUJVU18zX1JYCQkweDQwMDYKLSNkZWZpbmUgU0xJTUJVU18zX1RYCQkweDQwMDcKLSNkZWZpbmUgU0xJTUJVU180X1JYCQkweDQwMDgKLSNkZWZpbmUgU0xJTUJVU180X1RYCQkweDQwMDkKLSNkZWZpbmUgU0xJTUJVU181X1JYCQkweDQwMGEKLSNkZWZpbmUgU0xJTUJVU181X1RYCQkweDQwMGIKLSNkZWZpbmUgU0xJTUJVU182X1JYCQkweDQwMGMKLSNkZWZpbmUgU0xJTUJVU182X1RYCQkweDQwMGQKLSNkZWZpbmUgU0xJTUJVU183X1JYCQkweDQwMGUKLSNkZWZpbmUgU0xJTUJVU183X1RYCQkweDQwMGYKLSNkZWZpbmUgU0xJTUJVU184X1JYCQkweDQwMTAKLSNkZWZpbmUgU0xJTUJVU184X1RYCQkweDQwMTEKLSNkZWZpbmUgU0xJTUJVU19QT1JUX0xBU1QJU0xJTUJVU184X1RYCi0jZGVmaW5lIElOVF9CVF9TQ09fUlggMHgzMDAwCi0jZGVmaW5lIElOVF9CVF9TQ09fVFggMHgzMDAxCi0jZGVmaW5lIElOVF9CVF9BMkRQX1JYIDB4MzAwMgotI2RlZmluZSBJTlRfRk1fUlggMHgzMDA0Ci0jZGVmaW5lIElOVF9GTV9UWCAweDMwMDUKLSNkZWZpbmUgUlRfUFJPWFlfUE9SVF8wMDFfUlgJMHgyMDAwCi0jZGVmaW5lIFJUX1BST1hZX1BPUlRfMDAxX1RYCTB4MjAwMQotI2RlZmluZSBESVNQTEFZX1BPUlRfUlgJMHg2MDIwCi0KLSNkZWZpbmUgQUZFX1BPUlRfSU5WQUxJRCAweEZGRkYKLSNkZWZpbmUgU0xJTUJVU19JTlZBTElEIEFGRV9QT1JUX0lOVkFMSUQKLQotI2RlZmluZSBBRkVfUE9SVF9DTURfU1RBUlQgMHgwMDAxMDBjYQotCi0jZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfU1RBUlQgMAotI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX1NUT1AgMQotI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX0xPV19XTSAyCi0jZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfSElfV00gMwotCi0jZGVmaW5lIEFEU1BfQUZFX1ZFUlNJT04gICAgMHgwMDIwMDAwMAotCi0vKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgdGhlIGF1ZGlvIGludGVyZmFjZS4gKi8KLSNkZWZpbmUgIEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU0laRQkweEYKLQotLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIGludGVybmFsIEJULUZNIHBvcnRzLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9TSVpFCTB4NgotCi0vKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgU0xJTWJ1czxzdXA+JnJlZzsKLSAqIDwvc3VwPiBtdWx0aWNoYW5uZWwKLSAqIHBvcnRzLgotICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfUkFOR0VfU0laRQkweEEKLQotLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KLSNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU0laRQkweDIKLQotLyogU2l6ZSBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHBzZXVkb3BvcnRzLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9QU0VVRE9QT1JUX1JBTkdFX1NJWkUJMHg1Ci0KLS8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgdGhlIGF1ZGlvIGludGVyZmFjZS4gKi8KLSNkZWZpbmUgIEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU1RBUlQJMHgxMDAwCi0KLS8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHRoZSBhdWRpbyBpbnRlcmZhY2UuICovCi0jZGVmaW5lICBBRkVfUE9SVF9JRF9BVURJT19JRl9QT1JUX1JBTkdFX0VORCBcCi0JKEFGRV9QT1JUX0lEX0FVRElPX0lGX1BPUlRfUkFOR0VfU1RBUlQgK1wKLQlBRkVfUE9SVF9JRF9BVURJT19JRl9QT1JUX1JBTkdFX1NJWkUgLSAxKQotCi0vKiBTdGFydCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KLSNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQJMHgyMDAwCi0KLS8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHJlYWwtdGltZSBwcm94eSBwb3J0cy4gKi8KLSNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfRU5EIFwKLQkoQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9TVEFSVCArXAotCUFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU0laRS0xKQotCi0vKiBTdGFydCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIGludGVybmFsIEJULUZNIGRldmljZXMuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0ZNX1JBTkdFX1NUQVJUCTB4MzAwMAotCi0vKiBFbmQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBpbnRlcm5hbCBCVC1GTSBkZXZpY2VzLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9FTkQgXAotCShBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9GTV9SQU5HRV9TVEFSVCArXAotCUFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0ZNX1JBTkdFX1NJWkUtMSkKLQotLyoJU3RhcnQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBTTElNYnVzIGRldmljZXMuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfUkFOR0VfU1RBUlQJMHg0MDAwCi0KLS8qCUVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIFNMSU1idXMgZGV2aWNlcy4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19SQU5HRV9FTkQgXAotCShBRkVfUE9SVF9JRF9TTElNQlVTX1JBTkdFX1NUQVJUICtcCi0JQUZFX1BPUlRfSURfU0xJTUJVU19SQU5HRV9TSVpFLTEpCi0KLS8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgcHNldWRvcG9ydHMuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1BTRVVET1BPUlRfUkFOR0VfU1RBUlQJMHg4MDAxCi0KLS8qIEVuZCBvZiB0aGUgcmFuZ2Ugb2YgcG9ydCBJRHMgZm9yIHBzZXVkb3BvcnRzLiAgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfUFNFVURPUE9SVF9SQU5HRV9FTkQgXAotCShBRkVfUE9SVF9JRF9QU0VVRE9QT1JUX1JBTkdFX1NUQVJUICtcCi0JQUZFX1BPUlRfSURfUFNFVURPUE9SVF9SQU5HRV9TSVpFLTEpCi0KLS8qIFN0YXJ0IG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgVERNIGRldmljZXMuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUCTB4OTAwMAotCi0vKiBFbmQgb2YgdGhlIHJhbmdlIG9mIHBvcnQgSURzIGZvciBURE0gZGV2aWNlcy4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfRU5EIFwKLQkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQrMHg0MC0xKQotCi0vKiBTaXplIG9mIHRoZSByYW5nZSBvZiBwb3J0IElEcyBmb3IgVERNIHBvcnRzLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TSVpFIFwKLQkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfRU5EIC0gXAotCUFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUKzEpCi0KLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWCAgICAgICAgIDB4MTAwMQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWCAgICAgICAweDEwMDIKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFggICAgICAgMHgxMDAzCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlggICAgICAgIDB4MTAwNAotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYICAgICAgICAweDEwMDUKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYICAgICAgMHgxMDA2Ci0jZGVmaW5lIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCAgICAgIDB4MTAwNwotI2RlZmluZSBBVURJT19QT1JUX0lEX0kyU19SWCAgICAgICAgICAgICAgICAweDEwMDgKLSNkZWZpbmUgQUZFX1BPUlRfSURfRElHSVRBTF9NSUNfVFggICAgICAgICAgMHgxMDA5Ci0jZGVmaW5lIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYICAgICAgICAgIDB4MTAwQQotI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCAgICAgICAgICAweDEwMEIKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWCAgICAgICAgMHgxMDBDCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFggICAgICAgIDB4MTAwRAotI2RlZmluZSBBRkVfUE9SVF9JRF9NVUxUSUNIQU5fSERNSV9SWCAgICAgICAweDEwMEUKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxICAgMHgxMDEwCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWCAgICAgICAgIDB4MTAxMgotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFggICAgICAgICAweDEwMTMKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlggICAgICAgMHgxMDE0Ci0jZGVmaW5lIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYICAgICAgIDB4MTAxNQotI2RlZmluZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlggICAgICAgICAweDEwMTYKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYICAgICAgICAgMHgxMDE3Ci0vKiBJRCBvZiB0aGUgc2VuYXJ5IE1JMlMgUnggcG9ydC4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfUlggICAgICAgICAgMHgxMDE4Ci0vKiBJRCBvZiB0aGUgc2VuYXJ5IE1JMlMgVHggcG9ydC4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFggICAgICAgICAgMHgxMDE5Ci0vKiBJRCBvZiB0aGUgSW50ZXJuYWwgMCBNSTJTIFJ4IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwMkUKLS8qIElEIG9mIHRoZSBJbnRlcm5hbCAwIE1JMlMgVHggcG9ydCAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAyRgotLyogSUQgb2YgdGhlIEludGVybmFsIDEgTUkyUyBSeCBwb3J0ICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWCAgICAgICAgICAgICAgICAgMHgxMDMwCi0vKiBJRCBvZiB0aGUgSW50ZXJuYWwgMSBNSTJTIFR4IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYICAgICAgICAgICAgICAgICAweDEwMzEKLS8qIElEIG9mIHRoZSBJbnRlcm5hbCAyIE1JMlMgUnggcG9ydCAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlggICAgICAgICAgICAgICAgIDB4MTAzMgotLyogSUQgb2YgdGhlIEludGVybmFsIDIgTUkyUyBUeCBwb3J0ICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWCAgICAgICAgICAgICAgICAgMHgxMDMzCi0vKiBJRCBvZiB0aGUgSW50ZXJuYWwgMyBNSTJTIFJ4IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwMzQKLS8qIElEIG9mIHRoZSBJbnRlcm5hbCAzIE1JMlMgVHggcG9ydCAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAzNQotLyogSUQgb2YgdGhlIEludGVybmFsIDQgTUkyUyBSeCBwb3J0ICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWCAgICAgICAgICAgICAgICAgMHgxMDM2Ci0vKiBJRCBvZiB0aGUgSW50ZXJuYWwgNCBNSTJTIFR4IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYICAgICAgICAgICAgICAgICAweDEwMzcKLS8qIElEIG9mIHRoZSBJbnRlcm5hbCA1IE1JMlMgUnggcG9ydCAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlggICAgICAgICAgICAgICAgIDB4MTAzOAotLyogSUQgb2YgdGhlIEludGVybmFsIDUgTUkyUyBUeCBwb3J0ICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWCAgICAgICAgICAgICAgICAgMHgxMDM5Ci0vKiBJRCBvZiB0aGUgSW50ZXJuYWwgNiBNSTJTIFJ4IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYICAgICAgICAgICAgICAgICAweDEwM0EKLS8qIElEIG9mIHRoZSBJbnRlcm5hbCA2IE1JMlMgVHggcG9ydCAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFggICAgICAgICAgICAgICAgIDB4MTAzQgotI2RlZmluZSBBRkVfUE9SVF9JRF9TUERJRl9SWCAgICAgICAgICAgICAgICAweDUwMDAKLSNkZWZpbmUgIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfMDAxX1JYICAgMHgyMDAwCi0jZGVmaW5lICBBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUXzAwMV9UWCAgIDB4MjAwMQotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9CVF9TQ09fUlggICAgICAweDMwMDAKLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5URVJOQUxfQlRfU0NPX1RYICAgICAgMHgzMDAxCi0jZGVmaW5lIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX0EyRFBfUlggICAgIDB4MzAwMgotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlRFUk5BTF9GTV9SWCAgICAgICAgICAweDMwMDQKLSNkZWZpbmUgQUZFX1BPUlRfSURfSU5URVJOQUxfRk1fVFggICAgICAgICAgMHgzMDA1Ci0vKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCAwLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMF9SWCAgICAgIDB4NDAwMAotLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgMC4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzBfVFggICAgICAweDQwMDEKLS8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDEuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8xX1JYICAgICAgMHg0MDAyCi0vKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCAxLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMV9UWCAgICAgIDB4NDAwMwotLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgMi4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzJfUlggICAgICAweDQwMDQKLS8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDIuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8yX1RYICAgICAgMHg0MDA1Ci0vKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCAzLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fM19SWCAgICAgIDB4NDAwNgotLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgMy4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzNfVFggICAgICAweDQwMDcKLS8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDQuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl80X1JYICAgICAgMHg0MDA4Ci0vKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCA0LiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNF9UWCAgICAgIDB4NDAwOQotLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgNS4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzVfUlggICAgICAweDQwMGEKLS8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDUuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl81X1RYICAgICAgMHg0MDBiCi0vKiBTTElNYnVzIFJ4IHBvcnQgb24gY2hhbm5lbCA2LiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNl9SWCAgICAgIDB4NDAwYwotLyogU0xJTWJ1cyBUeCBwb3J0IG9uIGNoYW5uZWwgNi4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzZfVFggICAgICAweDQwMGQKLS8qIFNMSU1idXMgUnggcG9ydCBvbiBjaGFubmVsIDcuICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl83X1JYICAgICAgMHg0MDBlCi0vKiBTTElNYnVzIFR4IHBvcnQgb24gY2hhbm5lbCA3LiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fN19UWCAgICAgIDB4NDAwZgotLyogU0xJTWJ1cyBSeCBwb3J0IG9uIGNoYW5uZWwgOC4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzhfUlggICAgICAweDQwMTAKLS8qIFNMSU1idXMgVHggcG9ydCBvbiBjaGFubmVsIDguICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl84X1RYICAgICAgMHg0MDExCi0vKiBBRkUgUnggcG9ydCBmb3IgYXVkaW8gb3ZlciBEaXNwbGF5IHBvcnQgKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfSERNSV9PVkVSX0RQX1JYICAgICAgICAgICAgICAweDYwMjAKLS8qVVNCIEFGRSBwb3J0ICovCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1VTQl9SWCAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1VTQl9UWCAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAxCi0KLS8qIEdlbmVyaWMgcHNldWRvcG9ydCAxLiAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9QU0VVRE9QT1JUXzAxICAgICAgMHg4MDAxCi0vKiBHZW5lcmljIHBzZXVkb3BvcnQgMi4gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfUFNFVURPUE9SVF8wMiAgICAgIDB4ODAwMgotCi0vKiBAeHJlZmxhYmVse2hkcjpBZmVQb3J0SWRQcmltYXJ5QXV4UGNtVHh9Ci0gKiBQcmltYXJ5IEF1eCBQQ00gVHggcG9ydCBJRC4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCAgICAgIDB4MTAwQgotLyogUHNldWRvcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB2b2ljZSBSeCBwYXRoLgotICogRm9yIHJlY29yZGluZywgdGhlIHZvaWNlIFJ4IHBhdGggc2FtcGxlcyBhcmUgd3JpdHRlbiB0byB0aGlzCi0gKiBwb3J0IGFuZCBjb25zdW1lZCBieSB0aGUgYXVkaW8gcGF0aC4KLSAqLwotCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9SWAkweDgwMDMKLQotLyogUHNldWRvcG9ydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB2b2ljZSBUeCBwYXRoLgotICogRm9yIHJlY29yZGluZywgdGhlIHZvaWNlIFR4IHBhdGggc2FtcGxlcyBhcmUgd3JpdHRlbiB0byB0aGlzCi0gKiBwb3J0IGFuZCBjb25zdW1lZCBieSB0aGUgYXVkaW8gcGF0aC4KLSAqLwotCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9UWAkweDgwMDQKLS8qIFBzZXVkb3BvcnQgdGhhdCBjb3JyZXNwb25kcyB0byBpbi1jYWxsIHZvaWNlIGRlbGl2ZXJ5IHNhbXBsZXMuCi0gKiBEdXJpbmcgaW4tY2FsbCBhdWRpbyBkZWxpdmVyeSwgdGhlIGF1ZGlvIHBhdGggZGVsaXZlcnMgc2FtcGxlcwotICogdG8gdGhpcyBwb3J0IGZyb20gd2hlcmUgdGhlIHZvaWNlIHBhdGggZGVsaXZlcnMgdGhlbSBvbiB0aGUKLSAqIFJ4IHBhdGguCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfSURfVk9JQ0UyX1BMQVlCQUNLX1RYICAweDgwMDIKLSNkZWZpbmUgQUZFX1BPUlRfSURfVk9JQ0VfUExBWUJBQ0tfVFggICAweDgwMDUKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWCBcCi0JKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgwMCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMiBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwNCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMyBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwNikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNSBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwQSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNiBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwQykKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNyBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWCBcCi0JKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgwMSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMSBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMiBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwNCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMyBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwNikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNCBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNSBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwQSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNiBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwQykKLSNkZWZpbmUgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNyBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYIFwKLQkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQgKyAweDEwKQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yIFwKLQkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWCArIDB4MDQpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMyBcCi0JKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlggKyAweDA2KQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81IFwKLQkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWCArIDB4MEEpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNiBcCi0JKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlggKyAweDBDKQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYIFwKLQkoQUZFX1BPUlRfSURfVERNX1BPUlRfUkFOR0VfU1RBUlQgKyAweDExKQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzEgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yIFwKLQkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCArIDB4MDQpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMyBcCi0JKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFggKyAweDA2KQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81IFwKLQkoQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCArIDB4MEEpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNiBcCi0JKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFggKyAweDBDKQotI2RlZmluZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzcgXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggXAotCShBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TVEFSVCArIDB4MjApCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xIFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzIgXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggKyAweDA0KQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMyBcCi0JKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCArIDB4MDYpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80IFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzUgXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggKyAweDBBKQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNiBcCi0JKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCArIDB4MEMpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83IFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggXAotCShBRkVfUE9SVF9JRF9URE1fUE9SVF9SQU5HRV9TVEFSVCArIDB4MjEpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xIFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzIgXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggKyAweDA0KQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMyBcCi0JKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWCArIDB4MDYpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80IFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzUgXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggKyAweDBBKQotI2RlZmluZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNiBcCi0JKEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWCArIDB4MEMpCi0jZGVmaW5lIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83IFwKLQkoQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCBcCi0JKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgzMCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMiBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwNCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMyBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwNikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNSBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwQSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNiBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwQykKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNyBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWCBcCi0JKEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUICsgMHgzMSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMSBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwMikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMiBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwNCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMyBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwNikKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNCBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwOCkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNSBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwQSkKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNiBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwQykKLSNkZWZpbmUgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNyBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYICsgMHgwRSkKLQotI2RlZmluZSBBRkVfUE9SVF9JRF9JTlZBTElEICAgICAgICAgICAgIDB4RkZGRgotCi0jZGVmaW5lIEFBQ19FTkNfTU9ERV9BQUNfTEMgMHgwMgotI2RlZmluZSBBQUNfRU5DX01PREVfQUFDX1AgMHgwNQotI2RlZmluZSBBQUNfRU5DX01PREVfRUFBQ19QIDB4MUQKLQotI2RlZmluZSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQgMHgwMDAxMDBjZgotc3RydWN0IGFmZV9wc2V1ZG9wb3J0X3N0YXJ0X2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsJCS8qIFBzZXVkbyBQb3J0IDEgPSAweDgwMDAgKi8KLQkJCQkvKiBQc2V1ZG8gUG9ydCAyID0gMHg4MDAxICovCi0JCQkJLyogUHNldWRvIFBvcnQgMyA9IDB4ODAwMiAqLwotCXUxNiB0aW1pbmc7CQkvKiBGVFJUID0gMCAsIEFWVGltZXIgPSAxLCAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUFNFVURPUE9SVF9DTURfU1RPUCAweDAwMDEwMGQwCi1zdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RvcF9jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2IHBvcnRfaWQ7CQkvKiBQc2V1ZG8gUG9ydCAxID0gMHg4MDAwICovCi0JCQkJLyogUHNldWRvIFBvcnQgMiA9IDB4ODAwMSAqLwotCQkJCS8qIFBzZXVkbyBQb3J0IDMgPSAweDgwMDIgKi8KLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQUZFX01PRFVMRV9TSURFVE9ORV9JSVJfRklMVEVSCTB4MDAwMTAyMDIKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0VOQUJMRQkweDAwMDEwMjAzCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1BBUkFNX0lEX0VOQUJMRQotICogcGFyYW1ldGVyLCB3aGljaCBlbmFibGVzIG9yCi0gKiBkaXNhYmxlcyBhbnkgbW9kdWxlLgotICogVGhlIGZpeGVkIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgZm91ciBieXRlcy4KLSAqLwotCi1zdHJ1Y3QgYWZlX21vZF9lbmFibGVfcGFyYW0gewotCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZTsKLQkvKiBFbmFibGVzICgxKSBvciBkaXNhYmxlcyAoMCkgdGhlIG1vZHVsZS4gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIElEIG9mIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQotICogI0FGRV9NT0RVTEVfU0lERVRPTkVfSUlSX0ZJTFRFUiBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NJREVUT05FX0lJUl9GSUxURVJfQ09ORklHCTB4MDAwMTAyMDQKLSNkZWZpbmUgTUFYX1NJREVUT05FX0lJUl9EQVRBX1NJWkUgMjI0Ci0jZGVmaW5lIE1BWF9OT19JSVJfRklMVEVSX1NUQUdFICAgIDEwCi0KLXN0cnVjdCBhZmVfc2lkZXRvbmVfaWlyX2ZpbHRlcl9jb25maWdfcGFyYW1zIHsKLQl1MTYgICAgICAgICAgICAgICAgICBudW1fYmlxdWFkX3N0YWdlczsKLS8qIE51bWJlciBvZiBzdGFnZXMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBNaW5pbXVtIG9mIDUgYW5kIG1heGltdW0gb2YgMTAKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcHJlZ2FpbjsKLS8qIFByZWdhaW4gZm9yIHRoZSBjb21wZW5zYXRpbmcgZmlsdGVyIHJlc3BvbnNlLgotICogU3VwcG9ydGVkIHZhbHVlczogQW55IG51bWJlciBpbiBRMTMgZm9ybWF0Ci0gKi8KLQl1aW50OF90ICAgaWlyX2NvbmZpZ1tNQVhfU0lERVRPTkVfSUlSX0RBVEFfU0laRV07Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9NT0RVTEVfTE9PUEJBQ0sJMHgwMDAxMDIwNQotI2RlZmluZSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfR0FJTl9QRVJfUEFUSAkweDAwMDEwMjA2Ci0KLS8qIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfTE9PUEJBQ0tfR0FJTl9QRVJfUEFUSCBwYXJhbWV0ZXIsCi0gKiB3aGljaCBnZXRzL3NldHMgbG9vcGJhY2sgZ2FpbiBvZiBhIHBvcnQgdG8gYW4gUnggcG9ydC4KLSAqIFRoZSBUeCBwb3J0IElEIG9mIHRoZSBsb29wYmFjayBpcyBwYXJ0IG9mIHRoZSBzZXRfcGFyYW0gY29tbWFuZC4KLSAqLwotCi0vKiAgUGF5bG9hZCBvZiB0aGUgI0FGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIgY29tbWFuZCdzCi0gKiBjb25maWd1cmF0aW9uL2NhbGlicmF0aW9uIHNldHRpbmdzIGZvciB0aGUgQUZFIHBvcnQuCi0gKi8KLXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHsKLQl1MTYgcG9ydF9pZDsKLS8qIFBvcnQgaW50ZXJmYWNlIGFuZCBkaXJlY3Rpb24gKFJ4IG9yIFR4KSB0byBzdGFydC4gKi8KLQotCXUxNiBwYXlsb2FkX3NpemU7Ci0vKiBBY3R1YWwgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpbiBieXRlcy4KLSAqIFRoaXMgaXMgdXNlZCBmb3IgcGFyc2luZyB0aGUgcGFyYW1ldGVyIHBheWxvYWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKLSAqLwotCi11MzIgcGF5bG9hZF9hZGRyZXNzX2xzdzsKLS8qIExTVyBvZiA2NCBiaXQgUGF5bG9hZCBhZGRyZXNzLgotICogQWRkcmVzcyBzaG91bGQgYmUgMzItYnl0ZSwKLSAqIDRrYnl0ZSBhbGlnbmVkIGFuZCBtdXN0IGJlIGNvbnRpZ3VvdXMgbWVtb3J5LgotICovCi0KLXUzMiBwYXlsb2FkX2FkZHJlc3NfbXN3OwotLyogTVNXIG9mIDY0IGJpdCBQYXlsb2FkIGFkZHJlc3MuCi0gKiBJbiBjYXNlIG9mIDMyLWJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsCi0gKiB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uCi0gKiBJbiBjYXNlIG9mIDM2LWJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsCi0gKiBiaXQtNCB0byBiaXQtMzEgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAqIEFkZHJlc3Mgc2hvdWxkIGJlIDMyLWJ5dGUsIDRrYnl0ZSBhbGlnbmVkCi0gKiBhbmQgbXVzdCBiZSBjb250aWd1b3VzIG1lbW9yeS4KLSAqLwotCi11MzIgbWVtX21hcF9oYW5kbGU7Ci0vKiBNZW1vcnkgbWFwIGhhbmRsZSByZXR1cm5lZCBieQotICogQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZHMuCi0gKiBTdXBwb3J0ZWQgVmFsdWVzOgotICogLSBOVUxMIC0tIE1lc3NhZ2UuIFRoZSBwYXJhbWV0ZXIgZGF0YSBpcyBpbi1iYW5kLgotICogLSBOb24tTlVMTCAtLSBUaGUgcGFyYW1ldGVyIGRhdGEgaXMgT3V0LWJhbmQuUG9pbnRlciB0bwotICogdGhlIHBoeXNpY2FsIGFkZHJlc3MKLSAqIGluIHNoYXJlZCBtZW1vcnkgb2YgdGhlIHBheWxvYWQgZGF0YS4KLSAqIEFuIG9wdGlvbmFsIGZpZWxkIGlzIGF2YWlsYWJsZSBpZiBwYXJhbWV0ZXIKLSAqIGRhdGEgaXMgaW4tYmFuZDoKLSAqIGFmZV9wYXJhbV9kYXRhX3YyIHBhcmFtX2RhdGFbLi4uXS4KLSAqIEZvciBkZXRhaWxlZCBwYXlsb2FkIGNvbnRlbnQsIHNlZSB0aGUKLSAqIGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgc3RydWN0dXJlLgotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIJMHgwMDAxMDBFRgotCi1zdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiB7Ci0JdTMyIG1vZHVsZV9pZDsKLS8qIElEIG9mIHRoZSBtb2R1bGUgdG8gYmUgY29uZmlndXJlZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IFZhbGlkIG1vZHVsZSBJRAotICovCi0KLXUzMiBwYXJhbV9pZDsKLS8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMKLSAqIGZvciB0aGUgbW9kdWxlIElELgotICogU3VwcG9ydGVkIHZhbHVlczogVmFsaWQgcGFyYW1ldGVyIElECi0gKi8KLQotdTE2IHBhcmFtX3NpemU7Ci0vKiBBY3R1YWwgc2l6ZSBvZiB0aGUgZGF0YSBmb3IgdGhlCi0gKiBtb2R1bGVfaWQvcGFyYW1faWQgcGFpci4gVGhlIHNpemUgaXMgYQotICogbXVsdGlwbGUgb2YgZm91ciBieXRlcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAotICovCi0KLXUxNiByZXNlcnZlZDsKLS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9sb29wYmFja19nYWluX3Blcl9wYXRoX3BhcmFtIHsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgcGRhdGE7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcnhfcG9ydF9pZDsKLS8qIFJ4IHBvcnQgb2YgdGhlIGxvb3BiYWNrLiAqLwotCi11MTYgICAgICAgICAgICAgICAgICBnYWluOwotLyogTG9vcGJhY2sgZ2FpbiBwZXIgcGF0aCBvZiB0aGUgcG9ydC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IEFueSBudW1iZXIgaW4gUTEzIGZvcm1hdAotICovCi19IF9fcGFja2VkOwotCi0vKiBQYXJhbWV0ZXIgSUQgdXNlZCB0byBjb25maWd1cmUgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZQotICogbG9vcGJhY2sgcGF0aC4gVGhlIGRpZmZlcmVuY2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBleGlzdGluZwotICogQVBJLCBBRkVfUE9SVF9DTURfTE9PUEJBQ0ssIGlzIHRoYXQgaXQgYWxsb3dzIFJ4IHBvcnQgdG8gYmUKLSAqIGNvbmZpZ3VyZWQgYXMgc291cmNlIHBvcnQgaW4gbG9vcGJhY2sgcGF0aC4gUG9ydC1pZCBpbgotICogQUZFX1BPUlRfQ01EX1NFVF9QQVJBTSBjbWQgaXMgdGhlIHNvdXJjZSBwb3J0IHdoaWNoIGNhbiBiZQotICogVHggb3IgUnggcG9ydC4gSW4gYWRkaXRpb24sIHdlIGNhbiBjb25maWd1cmUgdGhlIHR5cGUgb2YKLSAqIHJvdXRpbmcgbW9kZSB0byBoYW5kbGUgZGlmZmVyZW50IHVzZSBjYXNlcy4KLSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfQ09ORklHCTB4MDAwMTAyMEIKLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0xPT1BCQUNLX0NPTkZJRwkweDEKLQotZW51bSBhZmVfbG9vcGJhY2tfcm91dGluZ19tb2RlIHsKLQlMQl9NT0RFX0RFRkFVTFQgPSAxLAotCS8qIFJlZ3VsYXIgbG9vcGJhY2sgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gcG9ydCAqLwotCUxCX01PREVfU0lERVRPTkUsCi0JLyogU2lkZXRvbmUgZmVlZCBmcm9tIFR4IHNvdXJjZSB0byBSeCBkZXN0aW5hdGlvbiBwb3J0ICovCi0JTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQVVESU8sCi0JLyogRWNobyBjYW5jZWxsZXIgcmVmZXJlbmNlLCB2b2ljZSArIGF1ZGlvICsgRFRNRiAqLwotCUxCX01PREVfRUNfUkVGX1ZPSUNFCi0JLyogRWNobyBjYW5jZWxsZXIgcmVmZXJlbmNlLCB2b2ljZSBhbG9uZSAqLwotfSBfX3BhY2tlZDsKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfTE9PUEJBQ0tfQ09ORklHICwKLSAqIHdoaWNoIGVuYWJsZXMvZGlzYWJsZXMgb25lIEFGRSBsb29wYmFjay4KLSAqLwotc3RydWN0IGFmZV9sb29wYmFja19jZmdfdjEgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICBwZGF0YTsKLQl1MzIJCWxvb3BiYWNrX2NmZ19taW5vcl92ZXJzaW9uOwotLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgUk1DIG1vZHVsZQotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0xPT1BCQUNLX0NPTkZJRwotICovCi0JdTE2ICAgICAgICAgICAgICAgICAgZHN0X3BvcnRfaWQ7Ci0JLyogRGVzdGluYXRpb24gUG9ydCBJZC4gKi8KLQl1MTYgICAgICAgICAgICAgICAgICByb3V0aW5nX21vZGU7Ci0vKiBTcGVjaWZpZXMgZGF0YSBwYXRoIHR5cGUgZnJvbSBzcmMgdG8gZGVzdCBwb3J0LgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqICNMQl9NT0RFX0RFRkFVTFQKLSAqICNMQl9NT0RFX1NJREVUT05FCi0gKiAjTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQVVESU8KLSAqICNMQl9NT0RFX0VDX1JFRl9WT0lDRV9BCi0gKiAjTEJfTU9ERV9FQ19SRUZfVk9JQ0UKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZW5hYmxlOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlICgxKSBvcgotICogZGlzYWJsZSAoMCkgYW4gQUZFIGxvb3BiYWNrLgotICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLgotICovCi0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfbG9vcGJhY2tfc2lkZXRvbmVfZ2FpbiB7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcnhfcG9ydF9pZDsKLQl1MTYgICAgICAgICAgICAgICAgICBnYWluOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxvb3BiYWNrX2NmZ19kYXRhIHsKLQl1MzIgICAgICAgICAgICAgICAgICBsb29wYmFja19jZmdfbWlub3JfdmVyc2lvbjsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIFJNQyBtb2R1bGUKLSAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9MT09QQkFDS19DT05GSUcKLSAqLwotCXUxNiAgICAgICAgICAgICAgICAgIGRzdF9wb3J0X2lkOwotCS8qIERlc3RpbmF0aW9uIFBvcnQgSWQuICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcm91dGluZ19tb2RlOwotLyogU3BlY2lmaWVzIGRhdGEgcGF0aCB0eXBlIGZyb20gc3JjIHRvIGRlc3QgcG9ydC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAjTEJfTU9ERV9ERUZBVUxUCi0gKiAjTEJfTU9ERV9TSURFVE9ORQotICogI0xCX01PREVfRUNfUkVGX1ZPSUNFX0FVRElPCi0gKiAjTEJfTU9ERV9FQ19SRUZfVk9JQ0VfQQotICogI0xCX01PREVfRUNfUkVGX1ZPSUNFCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZTsKLS8qIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSAoMSkgb3IKLSAqIGRpc2FibGUgKDApIGFuIEFGRSBsb29wYmFjay4KLSAqLwotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotLyogUmVzZXJ2ZWQgZm9yIDMyLWJpdCBhbGlnbm1lbnQuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gMC4KLSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zdF9sb29wYmFja19jZmdfdjEgewotCXN0cnVjdCBhcHJfaGRyICAgICAgICAgICAgICAgICAgICBoZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgICBnYWluX3BkYXRhOwotCXN0cnVjdCBhZmVfbG9vcGJhY2tfc2lkZXRvbmVfZ2FpbiBnYWluX2RhdGE7Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgIGNmZ19wZGF0YTsKLQlzdHJ1Y3QgbG9vcGJhY2tfY2ZnX2RhdGEgICAgICAgICAgY2ZnX2RhdGE7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2xvb3BiYWNrX2lpcl9jZmdfdjIgewotCXN0cnVjdCBhcHJfaGRyICAgICAgICAgICAgICAgICAgICAgICAgICBoZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgICAgICAgIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgICAgICAgICBzdF9paXJfZW5hYmxlX3BkYXRhOwotCXN0cnVjdCBhZmVfbW9kX2VuYWJsZV9wYXJhbSAgICAgICAgICAgICBzdF9paXJfbW9kZV9lbmFibGVfZGF0YTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICAgICAgICAgc3RfaWlyX2ZpbHRlcl9jb25maWdfcGRhdGE7Ci0Jc3RydWN0IGFmZV9zaWRldG9uZV9paXJfZmlsdGVyX2NvbmZpZ19wYXJhbXMgc3RfaWlyX2ZpbHRlcl9jb25maWdfZGF0YTsKLX0gX19wYWNrZWQ7Ci0jZGVmaW5lIEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OCTB4MDAwMTAyMDkKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQS1JfUFJPVF9DT05GSUcJMHgwMDAxMDIwYQotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU1BLUl9QUk9UX0NPTkZJRwkweDEKLSNkZWZpbmUgQUZFX1NQS1JfUFJPVF9FWENVUlNJT05GX0xFTgk1MTIKLXN0cnVjdCBhZmVfc3Brcl9wcm90X2NmZ19wYXJhbV92MSB7Ci0JdTMyICAgICAgIHNwa3JfcHJvdF9taW5vcl92ZXJzaW9uOwotLyoKLSAqIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlCi0gKiBzcGVha2VyIHByb3RlY3Rpb24gbW9kdWxlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9TUEtSX1BST1RfQ09ORklHCi0gKi8KLQotaW50MTZfdCAgICAgICAgd2luX3NpemU7Ci0vKiBBbmFseXNpcyBhbmQgc3ludGhlc2lzIHdpbmRvdyBzaXplIChuV2luU2l6ZSkuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMDI0LCA1MTIsIDI1NiBzYW1wbGVzCi0gKi8KLQotaW50MTZfdCAgICAgICAgbWFyZ2luOwotLyogQWxsb3dhYmxlIG1hcmdpbiBmb3IgZXhjdXJzaW9uIHByZWRpY3Rpb24sCi0gKiBpbiBMMTZRMTUgZm9ybWF0LiBUaGlzIGlzIGEKLSAqIGNvbnRyb2wgcGFyYW1ldGVyIHRvIGFsbG93Ci0gKiBmb3Igb3ZlcmVzdGltYXRpb24gb2YgcGVhayBleGN1cnNpb24uCi0gKi8KLQotaW50MTZfdCAgICAgICAgc3Brcl9leGNfbGltaXQ7Ci0vKiBTcGVha2VyIGV4Y3Vyc2lvbiBsaW1pdCwgaW4gTDE2UTE1IGZvcm1hdC4qLwotCi1pbnQxNl90ICAgICAgICBzcGtyX3Jlc29uYW5jZV9mcmVxOwotLyogUmVzb25hbmNlIGZyZXF1ZW5jeSBvZiB0aGUgc3BlYWtlcjsgdXNlZAotICogdG8gZGVmaW5lIGEgZnJlcXVlbmN5IHJhbmdlCi0gKiBmb3Igc2lnbmFsIG1vZGlmaWNhdGlvbi4KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDIwMDAgSHoKLSAqLwotCi1pbnQxNl90ICAgICAgICBsaW1ocmVzaDsKLS8qIFRocmVzaG9sZCBvZiB0aGUgaGFyZCBsaW1pdGVyOyB1c2VkIHRvCi0gKiBwcmV2ZW50IG92ZXJzaG9vdGluZyBiZXlvbmQgYQotICogc2lnbmFsIGxldmVsIHRoYXQgd2FzIHNldCBieSB0aGUgbGltaXRlcgotICogcHJpb3IgdG8gc3BlYWtlciBwcm90ZWN0aW9uLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAzMjc2NwotICovCi0KLWludDE2X3QgICAgICAgIGhwZl9jdXRfb2ZmX2ZyZXE7Ci0vKiBIaWdoIHBhc3MgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMDAsIDIwMCwgMzAwIEh6Ci0gKi8KLQotaW50MTZfdCAgICAgICAgaHBmX2VuYWJsZTsKLS8qIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBoaWdoIHBhc3MgZmlsdGVyCi0gKiBpcyBlbmFibGVkICgwKSBvciBkaXNhYmxlZCAoMSkuCi0gKi8KLQotaW50MTZfdCAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCi0KLWludDMyX3QgICAgICAgIGFtcF9nYWluOwotLyogQW1wbGlmaWVyIGdhaW4gaW4gTDMyUTE1IGZvcm1hdC4KLSAqIFRoaXMgaXMgdGhlIFJNUyB2b2x0YWdlIGF0IHRoZQotICogbG91ZHNwZWFrZXIgd2hlbiBhIDBkQkZTIHRvbmUKLSAqIGlzIHBsYXllZCBpbiB0aGUgZGlnaXRhbCBkb21haW4uCi0gKi8KLQotaW50MTZfdCAgICAgICAgZXhjdXJzaW9uZltBRkVfU1BLUl9QUk9UX0VYQ1VSU0lPTkZfTEVOXTsKLS8qIEFycmF5IG9mIHRoZSBleGN1cnNpb24gdHJhbnNmZXIgZnVuY3Rpb24uCi0gKiBUaGUgcGVhayBleGN1cnNpb24gb2YgdGhlCi0gKiBsb3Vkc3BlYWtlciBkaWFwaHJhZ20gaXMKLSAqIG1lYXN1cmVkIGluIG1pbGxpbWV0ZXJzIGZvciAxIFZybXMgU2luZQotICogdG9uZSBhdCBhbGwgRkZUIGJpbiBmcmVxdWVuY2llcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IFExNSBmb3JtYXQKLSAqLwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9SRUdJU1RFUl9SVF9QT1JUX0RSSVZFUgkweDAwMDEwMEUwCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1NFUlZJQ0VfQ01EX1JFR0lTVEVSX1JUX1BPUlRfRFJJVkVSCi0gKiBjb21tYW5kLCB3aGljaCByZWdpc3RlcnMgYSByZWFsLXRpbWUgcG9ydCBkcml2ZXIKLSAqIHdpdGggdGhlIEFGRSBzZXJ2aWNlLgotICovCi1zdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3JlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKLS8qIFBvcnQgSUQgd2l0aCB3aGljaCB0aGUgcmVhbC10aW1lIGRyaXZlciBleGNoYW5nZXMgZGF0YQotICogKHJlZ2lzdGVycyBmb3IgZXZlbnRzKS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX1NUQVJUIHRvCi0gKiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9FTkQKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfU0VSVklDRV9DTURfVU5SRUdJU1RFUl9SVF9QT1JUX0RSSVZFUgkweDAwMDEwMEUxCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX1NFUlZJQ0VfQ01EX1VOUkVHSVNURVJfUlRfUE9SVF9EUklWRVIKLSAqIGNvbW1hbmQsIHdoaWNoIHVucmVnaXN0ZXJzIGEgcmVhbC10aW1lIHBvcnQgZHJpdmVyIGZyb20KLSAqIHRoZSBBRkUgc2VydmljZS4KLSAqLwotc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF91bnJlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKLS8qIFBvcnQgSUQgZnJvbSB3aGljaCB0aGUgcmVhbC10aW1lCi0gKiBkcml2ZXIgdW5yZWdpc3RlcnMgZm9yIGV2ZW50cy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX1NUQVJUIHRvCi0gKiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9FTkQKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLgkqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfRVZFTlRfUlRfUFJPWFlfUE9SVF9TVEFUVVMJMHgwMDAxMDEwNQotI2RlZmluZSBBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9TVEFSVAkwCi0jZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX1NUT1AJMQotI2RlZmluZSBBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9MT1dfV0FURVJfTUFSSwkyCi0jZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0hJR0hfV0FURVJfTUFSSwkzCi0jZGVmaW5lIEFGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0lOVkFMSUQJMHhGRkZGCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTCi0gKiBtZXNzYWdlLCB3aGljaCBzZW5kcyBhbiBldmVudCBmcm9tIHRoZSBBRkUgc2VydmljZQotICogdG8gYSByZWdpc3RlcmVkIGNsaWVudC4KLSAqLwotc3RydWN0IGFmZV9ldmVudF9ydF9wcm94eV9wb3J0X3N0YXR1cyB7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKLS8qIFBvcnQgSUQgdG8gd2hpY2ggdGhlIGV2ZW50IGlzIHNlbnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX1BPUlRfSURfUlRfUFJPWFlfUE9SVF9SQU5HRV9TVEFSVCB0bwotICogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfRU5ECi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGV2ZW50eXBlOwotLyogVHlwZSBvZiBldmVudC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfRVZFTlRZUEVfUlRfUFJPWFlfUE9SVF9TVEFSVAotICogLSAjQUZFX0VWRU5UWVBFX1JUX1BST1hZX1BPUlRfU1RPUAotICogLSAjQUZFX0VWRU5UWVBFX1JUX1BST1hZX1BPUlRfTE9XX1dBVEVSX01BUksKLSAqIC0gI0FGRV9FVkVOVFlQRV9SVF9QUk9YWV9QT1JUX0hJR0hfV0FURVJfTUFSSwotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfV1JJVEVfVjIgMHgwMDAxMDBFRAotCi1zdHJ1Y3QgYWZlX3BvcnRfZGF0YV9jbWRfcnRfcHJveHlfcG9ydF93cml0ZV92MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7Ci0vKiBUeCAobWljKSBwcm94eSBwb3J0IElEIHdpdGggd2hpY2ggdGhlIHJlYWwtdGltZQotICogZHJpdmVyIGV4Y2hhbmdlcyBkYXRhLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQgdG8KLSAqICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX0VORAotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLQkvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBidWZmZXJfYWRkcmVzc19sc3c7Ci0vKiBMU1cgQWRkcmVzcyBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCi0gKiBkYXRhIGZyb20gdGhlIHJlYWwtdGltZSBzb3VyY2UKLSAqIGRldmljZSBvbiBhIGNsaWVudC4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgYnVmZmVyX2FkZHJlc3NfbXN3OwotLyogTVNXIEFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZQotICogZGF0YSBmcm9tIHRoZSByZWFsLXRpbWUgc291cmNlCi0gKiBkZXZpY2Ugb24gYSBjbGllbnQuCi0gKi8KLQotCXUzMgkJCQkJbWVtX21hcF9oYW5kbGU7Ci0vKiBBIG1lbW9yeSBtYXAgaGFuZGxlIGVuY2Fwc3VsYXRpbmcgc2hhcmVkIG1lbW9yeQotICogYXR0cmlidXRlcyBpcyByZXR1cm5lZCBpZgotICogQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMKLSAqIGNvbW1hbmQgaXMgc3VjY2Vzc2Z1bC4KLSAqIFN1cHBvcnRlZCBWYWx1ZXM6Ci0gKiAtIEFueSAzMiBiaXQgdmFsdWUKLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2J5dGVzOwotLyogTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGF2YWlsYWJsZQotICogaW4gdGhlIGJ1ZmZlciAoaW5jbHVkaW5nIGFsbAotICogY2hhbm5lbHM6IG51bWJlciBvZiBieXRlcyBwZXIKLSAqIGNoYW5uZWwgPSBhdmFpbGFibGVCeXRlc3VtQ2hhbm5lbHMpLgotICogU3VwcG9ydGVkIHZhbHVlczogPiAwCi0gKgotICogVGhpcyBmaWVsZCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBmcmFtZQotICogc2l6ZSBzcGVjaWZpZWQgaW4gdGhlICNBRkVfUE9SVF9BVURJT19JRl9DT05GSUcKLSAqIGNvbW1hbmQgdGhhdCB3YXMgc2VudCB0byBjb25maWd1cmUgdGhpcwotICogcG9ydC4KLSAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjIJMHgwMDAxMDBFRQotCi0vKiAgUGF5bG9hZCBvZiB0aGUKLSAqICNBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjIgY29tbWFuZCwgd2hpY2gKLSAqIGRlbGl2ZXJzIGFuIGVtcHR5IGJ1ZmZlciB0byB0aGUgQUZFIHNlcnZpY2UuIE9uCi0gKiBhY2tub3dsZWRnbWVudCwgZGF0YSBpcyBmaWxsZWQgaW4gdGhlIGJ1ZmZlci4KLSAqLwotc3RydWN0IGFmZV9wb3J0X2RhdGFfY21kX3J0X3Byb3h5X3BvcnRfcmVhZF92MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7Ci0vKiBSeCBwcm94eSBwb3J0IElEIHdpdGggd2hpY2ggdGhlIHJlYWwtdGltZQotICogZHJpdmVyIGV4Y2hhbmdlcyBkYXRhLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfUkFOR0VfU1RBUlQgdG8KLSAqICNBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUX1JBTkdFX0VORAotICogKFRoaXMgbXVzdCBiZSBhbiBSeCAoc3BlYWtlcikgcG9ydC4pCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hZGRyZXNzX2xzdzsKLS8qIExTVyBBZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSBzZW50IGZyb20gdGhlIEFGRQotICogc2VydmljZSB0byBhIHJlYWwtdGltZSBzaW5rIGRldmljZSBvbiB0aGUgY2xpZW50LgotICovCi0KLQotCXUzMiAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hZGRyZXNzX21zdzsKLS8qIE1TVyBBZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSBzZW50IGZyb20gdGhlIEFGRQotICogc2VydmljZSB0byBhIHJlYWwtdGltZSBzaW5rIGRldmljZSBvbiB0aGUgY2xpZW50LgotICovCi0KLQkJdTMyCQkJCW1lbV9tYXBfaGFuZGxlOwotLyogQSBtZW1vcnkgbWFwIGhhbmRsZSBlbmNhcHN1bGF0aW5nIHNoYXJlZCBtZW1vcnkgYXR0cmlidXRlcyBpcwotICogcmV0dXJuZWQgaWYgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZCBpcwotICogc3VjY2Vzc2Z1bC4KLSAqIFN1cHBvcnRlZCBWYWx1ZXM6Ci0gKiAtIEFueSAzMiBiaXQgdmFsdWUKLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2J5dGVzOwotLyogTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyIChpbmNsdWRpbmcgYWxsCi0gKiBjaGFubmVscykuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKLSAqIFRoaXMgZmllbGQgbXVzdCBiZSBlcXVhbCB0byB0aGUgZnJhbWUgc2l6ZSBzcGVjaWZpZWQgaW4gdGhlCi0gKiAjQUZFX1BPUlRfQVVESU9fSUZfQ09ORklHIGNvbW1hbmQgdGhhdCB3YXMgc2VudCB0byBjb25maWd1cmUKLSAqIHRoaXMgcG9ydC4KLSAqLwotfSBfX3BhY2tlZDsKLQotLyogVGhpcyBtb2R1bGUgSUQgaXMgcmVsYXRlZCB0byBkZXZpY2UgY29uZmlndXJpbmcgbGlrZSBJMlMsUENNLAotICogSERNSSwgU0xJTUJ1cyBldGMuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIGZvbGxvd2luZyBwYXJhbWV0ZXIgaWRzLgotICogLSAjQUZFX1BBUkFNX0lEX0kyU19DT05GSUcKLSAqIC0gI0FGRV9QQVJBTV9JRF9QQ01fQ09ORklHCi0gKiAtICNBRkVfUEFSQU1fSURfRElHSV9NSUNfQ09ORklHCi0gKiAtICNBRkVfUEFSQU1fSURfSERNSV9DT05GSUcKLSAqIC0gI0FGRV9QQVJBTV9JRF9JTlRFUk5BTF9CVF9GTV9DT05GSUcKLSAqIC0gI0FGRV9QQVJBTV9JRF9TTElNQlVTX0NPTkZJRwotICogLSAjQUZFX1BBUkFNX0lEX1JUX1BST1hZX0NPTkZJRwotICovCi0KLSNkZWZpbmUgQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFICAgIDB4MDAwMTAyMEMKLSNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLICAgICAgICAgIDE2MDAwCi0jZGVmaW5lIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SyAgICAgICAgICA0ODAwMAotI2RlZmluZSBBRkVfUE9SVF9TQU1QTEVfUkFURV85NksgICAgICAgICAgOTYwMDAKLSNkZWZpbmUgQUZFX1BPUlRfU0FNUExFX1JBVEVfMTc2UDRLICAgICAgIDE3NjQwMAotI2RlZmluZSBBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLICAgICAgICAgMTkyMDAwCi0jZGVmaW5lIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzM1MlA4SyAgICAgICAzNTI4MDAKLSNkZWZpbmUgQUZFX0xJTkVBUl9QQ01fREFUQQkJCQkweDAKLSNkZWZpbmUgQUZFX05PTl9MSU5FQVJfREFUQQkJCQkweDEKLSNkZWZpbmUgQUZFX0xJTkVBUl9QQ01fREFUQV9QQUNLRURfNjA5NTggMHgyCi0jZGVmaW5lIEFGRV9OT05fTElORUFSX0RBVEFfUEFDS0VEXzYwOTU4IDB4MwotI2RlZmluZSBBRkVfR0VORVJJQ19DT01QUkVTU0VEICAgICAgICAgICAweDgKLQotLyogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBJMlMgaW50ZXJmYWNlICovCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9JMlNfQ09ORklHCTB4MDAwMTAyMEQKLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcJMHgxCi0vKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgSTJTIGNvbmZpZ3VyYXRpb24KLSAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8KLSAqIHNlcmlhbCBkYXRhIHdpcmUgbnVtYmVyIDEtMyAoU0QzKS4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9JMlNfU0QwICAgICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIEFGRV9QT1JUX0kyU19TRDEgICAgICAgICAgICAgICAgICAgICAweDIKLSNkZWZpbmUgQUZFX1BPUlRfSTJTX1NEMiAgICAgICAgICAgICAgICAgICAgIDB4MwotI2RlZmluZSBBRkVfUE9SVF9JMlNfU0QzICAgICAgICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIEFGRV9QT1JUX0kyU19RVUFEMDEgICAgICAgICAgICAgICAgICAweDUKLSNkZWZpbmUgQUZFX1BPUlRfSTJTX1FVQUQyMyAgICAgICAgICAgICAgICAgIDB4NgotI2RlZmluZSBBRkVfUE9SVF9JMlNfNkNIUyAgICAgICAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIEFGRV9QT1JUX0kyU184Q0hTICAgICAgICAgICAgICAgICAgICAweDgKLSNkZWZpbmUgQUZFX1BPUlRfSTJTX01PTk8gICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBBRkVfUE9SVF9JMlNfU1RFUkVPICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIEFGRV9QT1JUX0NPTkZJR19JMlNfV1NfU1JDX0VYVEVSTkFMICAweDAKLSNkZWZpbmUgQUZFX1BPUlRfQ09ORklHX0kyU19XU19TUkNfSU5URVJOQUwgIDB4MQotCi0vKiAgUGF5bG9hZCBvZiB0aGUgI0FGRV9QQVJBTV9JRF9JMlNfQ09ORklHCi0gKiBjb21tYW5kJ3MgKEkyUyBjb25maWd1cmF0aW9uCi0gKiBwYXJhbWV0ZXIpLgotICovCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX2kyc19jZmcgewotCXUzMiAgICAgICAgICAgICAgICAgIGkyc19jZmdfbWlub3JfdmVyc2lvbjsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIEkyUwotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOwotLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tb2RlOwotLyogSTJTIGxpbmVzIGFuZCBtdWx0aWNoYW5uZWwgb3BlcmF0aW9uLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FGRV9QT1JUX0kyU19TRDAKLSAqIC0gI0FGRV9QT1JUX0kyU19TRDEKLSAqIC0gI0FGRV9QT1JUX0kyU19TRDIKLSAqIC0gI0FGRV9QT1JUX0kyU19TRDMKLSAqIC0gI0FGRV9QT1JUX0kyU19RVUFEMDEKLSAqIC0gI0FGRV9QT1JUX0kyU19RVUFEMjMKLSAqIC0gI0FGRV9QT1JUX0kyU182Q0hTCi0gKiAtICNBRkVfUE9SVF9JMlNfOENIUwotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBtb25vX3N0ZXJlbzsKLS8qIFNwZWNpZmllcyBtb25vIG9yIHN0ZXJlby4gVGhpcyBhcHBsaWVzIG9ubHkgd2hlbgotICogYSBzaW5nbGUgSTJTIGxpbmUgaXMgdXNlZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9JMlNfTU9OTwotICogLSAjQUZFX1BPUlRfSTJTX1NURVJFTwotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICB3c19zcmM7Ci0vKiBXb3JkIHNlbGVjdCBzb3VyY2U6IGludGVybmFsIG9yIGV4dGVybmFsLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FGRV9QT1JUX0NPTkZJR19JMlNfV1NfU1JDX0VYVEVSTkFMCi0gKiAtICNBRkVfUE9SVF9DT05GSUdfSTJTX1dTX1NSQ19JTlRFUk5BTAotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfNDhLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV85NksKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE5MksKLSAqLwotCi0JdTE2CQkJCQlkYXRhX2Zvcm1hdDsKLS8qIGRhdGEgZm9ybWF0Ci0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjTElORUFSX1BDTV9EQVRBCi0gKiAtICNOT05fTElORUFSX0RBVEEKLSAqIC0gI0xJTkVBUl9QQ01fREFUQV9QQUNLRURfSU5fNjA5NTgKLSAqIC0gI05PTl9MSU5FQVJfREFUQV9QQUNLRURfSU5fNjA5NTgKLSAqLwotCQl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLQkvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCi19IF9fcGFja2VkOwotCi0vKgotICogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBQQ00gaW50ZXJmYWNlCi0gKi8KLQotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU1BESUZfQ09ORklHIDB4MQotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU1BESUZfQ0hfU1RBVFVTX0NPTkZJRyAweDEKLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1NQRElGX0NMS19DT05GSUcgMHgxCi0jZGVmaW5lIEFGRV9DSF9TVEFUVVNfQSAxCi0jZGVmaW5lIEFGRV9DSF9TVEFUVVNfQiAyCi0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQRElGX0NPTkZJRyAweDAwMDEwMjQ0Ci0jZGVmaW5lIEFGRV9QQVJBTV9JRF9DSF9TVEFUVVNfQ09ORklHIDB4MDAwMTAyNDUKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQRElGX0NMS19DT05GSUcgMHgwMDAxMDI0NgotCi0jZGVmaW5lIEFGRV9QT1JUX0NMS19ST09UX0xQQVBMTCAweDMKLSNkZWZpbmUgQUZFX1BPUlRfQ0xLX1JPT1RfTFBBUTZQTEwgICAweDQKLQotc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jZmcgewotLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgU1BESUYKLSAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9TUERJRl9DT05GSUcKLSAqLwotCXUzMglzcGRpZl9jZmdfbWlub3JfdmVyc2lvbjsKLQotLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8yMl8wNUsKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzMySwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfNDRfMUsKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNzZfNEsKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE5MksKLSAqLwotCXUzMglzYW1wbGVfcmF0ZTsKLQotLyogZGF0YSBmb3JtYXQKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfTElORUFSX1BDTV9EQVRBCi0gKiAtICNBRkVfTk9OX0xJTkVBUl9EQVRBCi0gKi8KLQl1MTYJZGF0YV9mb3JtYXQ7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0Ci0gKiAtIFBDTSAtIDEsIENvbXByZXNzZWQgQ2FzZSAtIDIKLSAqLwotCXUxNgludW1fY2hhbm5lbHM7Ci0vKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNAotICovCi0JdTE2CWJpdF93aWR0aDsKLS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLQl1MTYJcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2NoX3N0YXR1c19jZmcgewotCXUzMiBjaF9zdGF0dXNfY2ZnX21pbm9yX3ZlcnNpb247Ci0vKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIGNoYW5uZWwKLSAqIHN0YXR1cyBjb25maWd1cmF0aW9uLiBDdXJyZW50IHN1cHBvcnRlZCB2ZXJzaW9uIGlzIDEKLSAqLwotCi0JdTMyIHN0YXR1c190eXBlOwotLyogSW5kaWNhdGUgaWYgdGhlIGNoYW5uZWwgc3RhdHVzIGlzIGZvciBjaGFubmVsIEEgb3IgQgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FGRV9DSF9TVEFUVVNfQQotICogLSAjQUZFX0NIX1NUQVRVU19CCi0gKi8KLQotCXU4IHN0YXR1c19iaXRzWzI0XTsKLS8qIENoYW5uZWwgc3RhdHVzIC0gMTkyIGJpdHMgZm9yIGNoYW5uZWwKLSAqIEJ5dGUgb3JkZXJpbmcgYXMgZGVmaW5lZCBieSBJRUM2MDk1OC0zCi0gKi8KLQotCXU4IHN0YXR1c19tYXNrWzI0XTsKLS8qIENoYW5uZWwgc3RhdHVzIHdpdGggbWFzayBiaXRzIDEgd2lsbCBiZSBhcHBsaWVkLgotICogQnl0ZSBvcmRlcmluZyBhcyBkZWZpbmVkIGJ5IElFQzYwOTU4LTMKLSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jbGtfY2ZnIHsKLQl1MzIgY2xrX2NmZ19taW5vcl92ZXJzaW9uOwotLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiBTUERJRgotICogaW50ZXJmYWNlIGNsb2NrIGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgc3VwcG9ydGVkIHZlcnNpb24KLSAqIGlzIDEKLSAqLwotCi0JdTMyIGNsa192YWx1ZTsKLS8qIFNwZWNpZmllcyB0aGUgY2xvY2sgZnJlcXVlbmN5IGluIEh6IHRvIHNldAotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIDAgLSBEaXNhYmxlIHRoZSBjbG9jawotICogMiAoYnlwaGFzZSkgKiAzMiAoNjA5NTggc3ViZnJhbWUgc2l6ZSkgKiBzYW1wbGluZyByYXRlICogMgotICogKGNoYW5uZWxzIEEgYW5kIEIpCi0gKi8KLQotCXUzMiBjbGtfcm9vdDsKLS8qIFNwZWNpZmllcyBTUERJRiByb290IGNsayBzb3VyY2UKLSAqIFN1cHBvcnRlZCBWYWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9DTEtfUk9PVF9MUEFQTEwKLSAqIC0gI0FGRV9QT1JUX0NMS19ST09UX0xQQVE2UExMCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfc3BkaWZfY2xrX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgICAgICAgICAgICAgICAgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyICBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICAgcGRhdGE7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jbGtfY2ZnIGNsa19jZmc7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwZGlmX2Noc3RhdHVzX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgICAgICAgICAgICAgICAgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyICBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICAgcGRhdGE7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jaF9zdGF0dXNfY2ZnIGNoX3N0YXR1czsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfc3BkaWZfcG9ydF9jb25maWcgewotCXN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2ZnICAgICAgICAgICAgY2ZnOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2hfc3RhdHVzX2NmZyAgY2hfc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUEFSQU1fSURfUENNX0NPTkZJRyAgICAgICAgMHgwMDAxMDIwRQotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fUENNX0NPTkZJRwkweDEKLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgYXV4aWxpYXJ5IFBDTSBzeW5jaHJvbml6YXRpb24gc2lnbmFsCi0gKiBwcm92aWRlZCBieSBhbiBleHRlcm5hbCBzb3VyY2UuCi0gKi8KLQotI2RlZmluZSBBRkVfUE9SVF9QQ01fU1lOQ19TUkNfRVhURVJOQUwgMHgwCi0vKglFbnVtZXJhdGlvbiBmb3IgdGhlIGF1eGlsaWFyeSBQQ00gc3luY2hyb25pemF0aW9uIHNpZ25hbAotICogcHJvdmlkZWQgYnkgYW4gaW50ZXJuYWwgc291cmNlLgotICovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9TWU5DX1NSQ19JTlRFUk5BTCAgMHgxCi0vKglFbnVtZXJhdGlvbiBmb3IgdGhlIFBDTSBjb25maWd1cmF0aW9uIGF1eF9tb2RlIHBhcmFtZXRlciwKLSAqIHdoaWNoIGNvbmZpZ3VyZXMgdGhlIGF1eGlsaWFyeSBQQ00gaW50ZXJmYWNlIHRvIHVzZQotICogc2hvcnQgc3luY2hyb25pemF0aW9uLgotICovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9BVVhfTU9ERV9QQ00gIDB4MAotLyoKLSAqIEVudW1lcmF0aW9uIGZvciB0aGUgUENNIGNvbmZpZ3VyYXRpb24gYXV4X21vZGUgcGFyYW1ldGVyLAotICogd2hpY2ggY29uZmlndXJlcyB0aGUgYXV4aWxpYXJ5IFBDTSBpbnRlcmZhY2UgdG8gdXNlIGxvbmcKLSAqIHN5bmNocm9uaXphdGlvbi4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fQVVYX01PREVfQVVYICAgIDB4MQotLyoKLSAqIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBmcmFtZSB0byA4LgotICovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV84ICAweDAKLS8qCi0gKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gZnJhbWUgdG8gMTYuCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzE2ICAgMHgxCi0KLS8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBmcmFtZSB0byAzMi4qLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMzIgMHgyCi0KLS8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBmcmFtZSB0byA2NC4qLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfNjQgICAweDMKLQotLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIGZyYW1lIHRvIDEyOC4qLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMTI4IDB4NAotCi0vKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gZnJhbWUgdG8gMjU2LiovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8yNTYgMHg1Ci0KLS8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbgotICogcXVhbnR5cGUgcGFyYW1ldGVyIHRvIEEtbGF3IHdpdGggbm8gcGFkZGluZy4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fQUxBV19OT1BBRERJTkcgMHgwCi0KLS8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBxdWFudHlwZQotICogcGFyYW1ldGVyIHRvIG11LWxhdyB3aXRoIG5vIHBhZGRpbmcuCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfUENNX01VTEFXX05PUEFERElORyAweDEKLS8qCUVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbiBxdWFudHlwZQotICogcGFyYW1ldGVyIHRvIGxpbmVhciB3aXRoIG5vIHBhZGRpbmcuCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfUENNX0xJTkVBUl9OT1BBRERJTkcgMHgyCi0vKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gcXVhbnR5cGUKLSAqIHBhcmFtZXRlciB0byBBLWxhdyB3aXRoIHBhZGRpbmcuCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfUENNX0FMQVdfUEFERElORyAgMHgzCi0vKglFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24gcXVhbnR5cGUKLSAqIHBhcmFtZXRlciB0byBtdS1sYXcgd2l0aCBwYWRkaW5nLgotICovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9NVUxBV19QQURESU5HIDB4NAotLyoJRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIFBDTSBjb25maWd1cmF0aW9uIHF1YW50eXBlCi0gKiBwYXJhbWV0ZXIgdG8gbGluZWFyIHdpdGggcGFkZGluZy4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9QQ01fTElORUFSX1BBRERJTkcgMHg1Ci0vKglFbnVtZXJhdGlvbiBmb3IgZGlzYWJsaW5nIHRoZSBQQ00gY29uZmlndXJhdGlvbgotICogY3RybF9kYXRhX291dF9lbmFibGUgcGFyYW1ldGVyLgotICogVGhlIFBDTSBibG9jayBpcyB0aGUgb25seSBtYXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUZFX1BPUlRfUENNX0NUUkxfREFUQV9PRV9ESVNBQkxFIDB4MAotLyoKLSAqIEVudW1lcmF0aW9uIGZvciBlbmFibGluZyB0aGUgUENNIGNvbmZpZ3VyYXRpb24KLSAqIGN0cmxfZGF0YV9vdXRfZW5hYmxlIHBhcmFtZXRlci4gVGhlIFBDTSBibG9jayBzaGFyZXMKLSAqIHRoZSBzaWduYWwgd2l0aCBvdGhlciBtYXN0ZXJzLgotICovCi0jZGVmaW5lIEFGRV9QT1JUX1BDTV9DVFJMX0RBVEFfT0VfRU5BQkxFICAweDEKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfUENNX0NPTkZJRyBjb21tYW5kJ3MKLSAqIChQQ00gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIpLgotICovCi0KLXN0cnVjdCBhZmVfcGFyYW1faWRfcGNtX2NmZyB7Ci0JdTMyICAgICAgICAgICAgICAgICAgcGNtX2NmZ19taW5vcl92ZXJzaW9uOwotLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgQVVYIFBDTQotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX1BDTV9DT05GSUcKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYXV4X21vZGU7Ci0vKiBQQ00gc3luY2hyb25pemF0aW9uIHNldHRpbmcuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfUENNX0FVWF9NT0RFX1BDTQotICogLSAjQUZFX1BPUlRfUENNX0FVWF9NT0RFX0FVWAotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBzeW5jX3NyYzsKLS8qIFN5bmNocm9uaXphdGlvbiBzb3VyY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfUENNX1NZTkNfU1JDX0VYVEVSTkFMCi0gKiAtICNBRkVfUE9SVF9QQ01fU1lOQ19TUkNfSU5URVJOQUwKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZzsKLS8qIE51bWJlciBvZiBiaXRzIHBlciBmcmFtZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfOAotICogLSAjQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzE2Ci0gKiAtICNBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMzIKLSAqIC0gI0FGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV82NAotICogLSAjQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzEyOAotICogLSAjQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzI1NgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBxdWFudHlwZTsKLS8qIFBDTSBxdWFudGl6YXRpb24gdHlwZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9QQ01fQUxBV19OT1BBRERJTkcKLSAqIC0gI0FGRV9QT1JUX1BDTV9NVUxBV19OT1BBRERJTkcKLSAqIC0gI0FGRV9QT1JUX1BDTV9MSU5FQVJfTk9QQURESU5HCi0gKiAtICNBRkVfUE9SVF9QQ01fQUxBV19QQURESU5HCi0gKiAtICNBRkVfUE9SVF9QQ01fTVVMQVdfUEFERElORwotICogLSAjQUZFX1BPUlRfUENNX0xJTkVBUl9QQURESU5HCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGN0cmxfZGF0YV9vdXRfZW5hYmxlOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFBDTSBibG9jayBzaGFyZXMgdGhlIGRhdGEtb3V0Ci0gKiBzaWduYWwgdG8gdGhlIGRyaXZlIHdpdGggb3RoZXIgbWFzdGVycy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9QQ01fQ1RSTF9EQVRBX09FX0RJU0FCTEUKLSAqIC0gI0FGRV9QT1JUX1BDTV9DVFJMX0RBVEFfT0VfRU5BQkxFCi0gKi8KLQkJdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0vKiBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOwotLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDQKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgc2xvdF9udW1iZXJfbWFwcGluZ1s0XTsKLS8qIFNwZWNpZmllcyB0aGUgc2xvdCBudW1iZXIgZm9yIHRoZSBlYWNoIGNoYW5uZWwgaW4KLSAqIG11bHRpIGNoYW5uZWwgc2NlbmFyaW8uCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDMyCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIERJR0kgTUlDIGludGVyZmFjZQotICovCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9ESUdJX01JQ19DT05GSUcJMHgwMDAxMDIwRgotLyogIFRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgbmV3Ci0gKiAgIGFkZGl0aW9ucyB0byB0aGUgY29uZmlnIGludGVyZmFjZSBpbiBmdXR1cmUgaW4gYmFja3dhcmQKLSAqICAgY29tcGF0aWJsZSBtYW5uZXIuCi0gKi8KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0RJR0lfTUlDX0NPTkZJRyAweDEKLQotLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KLSAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gbGVmdCAwLgotICovCi0KLSNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9MRUZUMCAgMHgxCi0KLS8qRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KLSAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gcmlnaHQgMC4KLSAqLwotCi0KLSNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9SSUdIVDAgIDB4MgotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgZGlnaXRhbCBtaWMgY29uZmlndXJhdGlvbgotICogY2hhbm5lbF9tb2RlIHBhcmFtZXRlciB0byBsZWZ0IDEuCi0gKi8KLQotI2RlZmluZSBBRkVfUE9SVF9ESUdJX01JQ19NT0RFX0xFRlQxICAweDMKLQotLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGRpZ2l0YWwgbWljIGNvbmZpZ3VyYXRpb24KLSAqIGNoYW5uZWxfbW9kZSBwYXJhbWV0ZXIgdG8gcmlnaHQgMS4KLSAqLwotCi0jZGVmaW5lIEFGRV9QT1JUX0RJR0lfTUlDX01PREVfUklHSFQxIDB4NAotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgZGlnaXRhbCBtaWMgY29uZmlndXJhdGlvbgotICogY2hhbm5lbF9tb2RlIHBhcmFtZXRlciB0byBzdGVyZW8gMC4KLSAqLwotI2RlZmluZSBBRkVfUE9SVF9ESUdJX01JQ19NT0RFX1NURVJFTzAgIDB4NQotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgZGlnaXRhbCBtaWMgY29uZmlndXJhdGlvbgotICogY2hhbm5lbF9tb2RlIHBhcmFtZXRlciB0byBzdGVyZW8gMS4KLSAqLwotCi0KLSNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9TVEVSRU8xICAgIDB4NgotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgZGlnaXRhbCBtaWMgY29uZmlndXJhdGlvbgotICogY2hhbm5lbF9tb2RlIHBhcmFtZXRlciB0byBxdWFkLgotICovCi0KLSNkZWZpbmUgQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9RVUFEICAgICAweDcKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfRElHSV9NSUNfQ09ORklHIGNvbW1hbmQncwotICogKERJR0kgTUlDIGNvbmZpZ3VyYXRpb24KLSAqIHBhcmFtZXRlcikuCi0gKi8KLXN0cnVjdCBhZmVfcGFyYW1faWRfZGlnaV9taWNfY2ZnIHsKLQl1MzIgICAgICAgICAgICAgICAgICBkaWdpX21pY19jZmdfbWlub3JfdmVyc2lvbjsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIERJR0kgTWljCi0gKiBjb25maWd1cmF0aW9uIGludGVyZmFjZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ICNBRkVfQVBJX1ZFUlNJT05fRElHSV9NSUNfQ09ORklHCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGJpdF93aWR0aDsKLS8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgotICogU3VwcG9ydGVkIHZhbHVlczogMTYKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tb2RlOwotLyogRGlnaXRhbCBtaWMgYW5kIG11bHRpY2hhbm5lbCBvcGVyYXRpb24uCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9MRUZUMAotICogLSAjQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9SSUdIVDAKLSAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfTEVGVDEKLSAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfUklHSFQxCi0gKiAtICNBRkVfUE9SVF9ESUdJX01JQ19NT0RFX1NURVJFTzAKLSAqIC0gI0FGRV9QT1JUX0RJR0lfTUlDX01PREVfU1RFUkVPMQotICogLSAjQUZFX1BPUlRfRElHSV9NSUNfTU9ERV9RVUFECi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKLSAqLwotfSBfX3BhY2tlZDsKLQotLyogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBIRE1JIGludGVyZmFjZSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfSERNSV9DT05GSUcgICAgIDB4MDAwMTAyMTAKLQotLyogVGhpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSBuZXcKLSAqIGFkZGl0aW9ucyB0byB0aGUgY29uZmlnIGludGVyZmFjZSBpbiBmdXR1cmUgaW4gYmFja3dhcmQKLSAqIGNvbXBhdGlibGUgbWFubmVyLgotICovCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9IRE1JX0NPTkZJRyAweDEKLQotLyogUGF5bG9hZCBvZiB0aGUgI0FGRV9QQVJBTV9JRF9IRE1JX0NPTkZJRyBjb21tYW5kLAotICogd2hpY2ggY29uZmlndXJlcyBhIG11bHRpY2hhbm5lbCBIRE1JIGF1ZGlvIGludGVyZmFjZS4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF9oZG1pX211bHRpX2NoYW5fYXVkaW9fY2ZnIHsKLQl1MzIgICAgICAgICAgICAgICAgICBoZG1pX2NmZ19taW5vcl92ZXJzaW9uOwotLyogTWlub3IgdmVyc2lvbiB1c2VkIGZvciB0cmFja2luZyB0aGUgdmVyc2lvbiBvZiB0aGUgSERNSQotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0hETUlfQ09ORklHCi0gKi8KLQotdTE2ICAgICAgICAgICAgICAgICAgZGF0YXR5cGU7Ci0vKiBkYXRhIHR5cGUKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNMSU5FQVJfUENNX0RBVEEKLSAqIC0gI05PTl9MSU5FQVJfREFUQQotICogLSAjTElORUFSX1BDTV9EQVRBX1BBQ0tFRF9JTl82MDk1OAotICogLSAjTk9OX0xJTkVBUl9EQVRBX1BBQ0tFRF9JTl82MDk1OAotICovCi0KLXUxNiAgICAgICAgICAgICAgICAgIGNoYW5uZWxfYWxsb2NhdGlvbjsKLS8qIEhETUkgY2hhbm5lbCBhbGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBwcm9ncmFtbWluZyBhbiBIRE1JCi0gKiBmcmFtZS4gVGhlIGRlZmF1bHQgaXMgMCAoU3RlcmVvKS4KLSAqCi0gKiBUaGlzIGluZm9ybWF0aW9uIGlzIGRlZmluZWQgaW4gdGhlIEhETUkgc3RhbmRhcmQsIENFQSA4NjEtRAotICogKHJlZmVyIHRvIEB4aHlwZXJyZWZ7UzEsW1MxXX0pLiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIGFsc28KLSAqIGluZmVycmVkIGZyb20gdGhpcyBwYXJhbWV0ZXIuCi0gKi8KLQotCi11MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfNDhLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV85NksKLSAqIC0gMjIwNTAsIDQ0MTAwLCAxNzY0MDAgZm9yIGNvbXByZXNzZWQgc3RyZWFtcwotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7Ci0vKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNAotICovCi0JCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgQlQgb3IgRk0oUklWQSkgaW50ZXJmYWNlICovCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9JTlRFUk5BTF9CVF9GTV9DT05GSUcgIDB4MDAwMTAyMTEKLQotLyogVGhpcyB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIHRoZSBuZXcKLSAqIGFkZGl0aW9ucyB0byB0aGUgY29uZmlnIGludGVyZmFjZSBpbiBmdXR1cmUgaW4gYmFja3dhcmQKLSAqIGNvbXBhdGlibGUgbWFubmVyLgotICovCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9JTlRFUk5BTF9CVF9GTV9DT05GSUcJMHgxCi0KLS8qIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfSU5URVJOQUxfQlRfRk1fQ09ORklHCi0gKiBjb21tYW5kJ3MgQlQgdm9pY2UvQlQgYXVkaW8vRk0gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuCi0gKi8KLXN0cnVjdCBhZmVfcGFyYW1faWRfaW50ZXJuYWxfYnRfZm1fY2ZnIHsKLQl1MzIgICAgICAgICAgICAgICAgICBidF9mbV9jZmdfbWlub3JfdmVyc2lvbjsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIEJUIGFuZCBGTQotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0lOVEVSTkFMX0JUX0ZNX0NPTkZJRwotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDIKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgYml0X3dpZHRoOwotLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsgKG9ubHkgZm9yIEJUU0NPKQotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLIChvbmx5IGZvciBCVFNDTykKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SyAoRk0gYW5kIEEyRFApCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgU0xJTUJVUyBpbnRlcmZhY2UgdXNpbmcKLSAqIHNoYXJlZCBjaGFubmVsIGFwcHJvYWNoLgotICovCi0KLQotI2RlZmluZSBBRkVfUEFSQU1fSURfU0xJTUJVU19DT05GSUcgICAgMHgwMDAxMDIxMgotCi0vKiBUaGlzIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgdXNlZCB0byBoYW5kbGUgdGhlIG5ldwotICogYWRkaXRpb25zIHRvIHRoZSBjb25maWcgaW50ZXJmYWNlIGluIGZ1dHVyZSBpbiBiYWNrd2FyZAotICogY29tcGF0aWJsZSBtYW5uZXIuCi0gKi8KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1NMSU1CVVNfQ09ORklHIDB4MQotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyBTTElNYnVzIGRldmljZSBJRCAxLiAqLwotI2RlZmluZSBBRkVfU0xJTUJVU19ERVZJQ0VfMSAgICAgICAgICAgMHgwCi0KLS8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIFNMSU1idXMgZGV2aWNlIElEIDIuICovCi0jZGVmaW5lIEFGRV9TTElNQlVTX0RFVklDRV8yICAgICAgICAgIDB4MQotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgU0xJTWJ1cyBkYXRhIGZvcm1hdHMuICovCi0jZGVmaW5lIEFGRV9TQl9EQVRBX0ZPUk1BVF9OT1RfSU5ESUNBVEVEIDB4MAotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyBwZXIKLSAqIGRldmljZS4KLSAqLwotCi0jZGVmaW5lIEFGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVAkweDgKLQotLyogUGF5bG9hZCBvZiB0aGUgI0FGRV9QT1JUX0NNRF9TTElNQlVTX0NPTkZJRyBjb21tYW5kJ3MgU0xJTWJ1cwotICogcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KLSAqLwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX3NsaW1idXNfY2ZnIHsKLQl1MzIgICAgICAgICAgICAgICAgICBzYl9jZmdfbWlub3JfdmVyc2lvbjsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIFNMSU1CVVMKLSAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9TTElNQlVTX0NPTkZJRwotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBzbGltYnVzX2Rldl9pZDsKLS8qIFNMSU1idXMgaGFyZHdhcmUgZGV2aWNlIElELCB3aGljaCBpcyByZXF1aXJlZCB0byBoYW5kbGUKLSAqIG11bHRpcGxlIFNMSU1idXMgaGFyZHdhcmUgYmxvY2tzLgotICogU3VwcG9ydGVkIHZhbHVlczogLSAjQUZFX1NMSU1CVVNfREVWSUNFXzEgLSAjQUZFX1NMSU1CVVNfREVWSUNFXzIKLSAqLwotCi0KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7Ci0vKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2LCAyNAotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBkYXRhX2Zvcm1hdDsKLS8qIERhdGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgU0xJTWJ1cyBoYXJkd2FyZS4gVGhlIGRlZmF1bHQgaXMKLSAqIDAgKCNBRkVfU0JfREFUQV9GT1JNQVRfTk9UX0lORElDQVRFRCksIHdoaWNoIGluZGljYXRlcyB0aGUKLSAqIGhhcmR3YXJlIGRvZXMgbm90IHBlcmZvcm0gYW55IGZvcm1hdCBjb252ZXJzaW9ucyBiZWZvcmUgdGhlIGRhdGEKLSAqIHRyYW5zZmVyLgotICovCi0KLQotCXUxNiAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKLS8qIE51bWJlciBvZiBjaGFubmVscy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gI0FGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVAotICovCi0KLQl1OCAgc2hhcmVkX2NoX21hcHBpbmdbQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UXTsKLS8qIE1hcHBpbmcgb2Ygc2hhcmVkIGNoYW5uZWwgSURzICgxMjggdG8gMjU1KSB0byB3aGljaCB0aGUKLSAqIG1hc3RlciBwb3J0IGlzIHRvIGJlIGNvbm5lY3RlZC4KLSAqIFNoYXJlZF9jaGFubmVsX21hcHBpbmdbaV0gcmVwcmVzZW50cyB0aGUgc2hhcmVkIGNoYW5uZWwgYXNzaWduZWQKLSAqIGZvciBhdWRpbyBjaGFubmVsIGkgaW4gbXVsdGljaGFubmVsIGF1ZGlvIGRhdGEuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0vKiBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKLSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogSUQgb2YgdGhlIHBhcmFtZXRlciB1c2VkIGJ5IEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fREVWX1BBUkFNUyB0byBjb25maWd1cmUKLSAqIFVTQiBhdWRpbyBkZXZpY2UgcGFyYW1ldGVyLiBJdCBzaG91bGQgYmUgdXNlZCB3aXRoCi0gKiBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0UKLSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0RFVl9QQVJBTVMgICAgMHgwMDAxMDJBNQotCi0KLS8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZCB0byBzZXQgdGhlIGVuZGlhbm5lc3MgdmFsdWUgZm9yIHRoZQotICogVVNCIGF1ZGlvIGRldmljZS4gSXQgc2hvdWxkIGJlIHVzZWQgd2l0aAotICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFCi0gKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1VTQl9BVURJT19ERVZfTFBDTV9GTVQgMHgwMDAxMDJBQQotCi0vKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIFVTQiBhdWRpbyAgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBBRkVfQVBJX01JTklPUl9WRVJTSU9OX1VTQl9BVURJT19DT05GSUcgMHgxCi0KLS8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fREVWX1BBUkFNUyBwYXJhbWV0ZXIgdXNlZCBieQotICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgotICovCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX3VzYl9hdWRpb19kZXZfcGFyYW1zIHsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgVVNCIGF1ZGlvIGRldmljZSBwYXJhbWV0ZXIuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBBRkVfQVBJX01JTklPUl9WRVJTSU9OX1VTQl9BVURJT19DT05GSUcKLSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGNmZ19taW5vcl92ZXJzaW9uOwotLyogVG9rZW4gb2YgYWN0dWFsIGVuZCBVU0IgYWR1aW8gZGV2aWNlICovCi0JdTMyICAgICAgICAgICAgICAgICAgZGV2X3Rva2VuOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9pZF91c2JfYXVkaW9fZGV2X2xwY21fZm10IHsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgVVNCIGF1ZGlvIGRldmljZSBwYXJhbWV0ZXIuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBBRkVfQVBJX01JTklPUl9WRVJTSU9OX1VTQl9BVURJT19DT05GSUcKLSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGNmZ19taW5vcl92ZXJzaW9uOwotLyogRW5kaWFubmVzcyBvZiBhY3R1YWwgZW5kIFVTQiBhdWRpbyBkZXZpY2UgKi8KLQl1MzIgICAgICAgICAgICAgICAgICBlbmRpYW47Ci19IF9fcGFja2VkOwotCi0vKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgQUZFX1BBUkFNX0lEX1VTQl9BVURJT19DT05GSUcgdG8gY29uZmlndXJlCi0gKiBVU0IgYXVkaW8gaW50ZXJmYWNlLiBJdCBzaG91bGQgYmUgdXNlZCB3aXRoIEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRQotICovCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fQ09ORklHICAgIDB4MDAwMTAyQTQKLQotLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX1VTQl9BVURJT19DT05GSUcgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRS4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF91c2JfYXVkaW9fY2ZnIHsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgVVNCIGF1ZGlvIGRldmljZSBjb25maWd1cmF0aW9uLgotICogU3VwcG9ydGVkIHZhbHVlczogQUZFX0FQSV9NSU5JT1JfVkVSU0lPTl9VU0JfQVVESU9fQ09ORklHCi0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBjZmdfbWlub3JfdmVyc2lvbjsKLS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHBvcnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV84SwotICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV8xMTAyNQotICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV8xMksKLSAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCi0gKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzIyMDUwCi0gKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzI0SwotICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV8zMksKLSAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfNDRQMUsKLSAqIC0gQUZFX1BPUlRfU0FNUExFX1JBVEVfNDhLCi0gKiAtIEFGRV9QT1JUX1NBTVBMRV9SQVRFXzk2SwotICogLSBBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCi0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgotICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0Ci0gKi8KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIGFuZCAyCi0gKi8KLQl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBEYXRhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIFVTQi4gVGhlIHN1cHBvcnRlZCB2YWx1ZSBpcwotICogMCAoI0FGRV9VU0JfQVVESU9fREFUQV9GT1JNQVRfTElORUFSX1BDTSkuCi0gKi8KLQl1MTYgICAgICAgICAgICAgICAgICBkYXRhX2Zvcm1hdDsKLS8qIHRoaXMgZmllbGQgbXVzdCBiZSAwICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBkZXZpY2UgdG9rZW4gb2YgYWN0dWFsIGVuZCBVU0IgYWR1aW8gZGV2aWNlICovCi0JdTMyICAgICAgICAgICAgICAgICAgZGV2X3Rva2VuOwotLyogZW5kaWFubmVzcyBvZiB0aGlzIGludGVyZmFjZSAqLwotCXUzMiAgICAgICAgICAgICAgICAgICBlbmRpYW47Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3VzYl9hdWRpb19kZXZfcGFyYW1fY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICAgIHBkYXRhOwotCXVuaW9uIHsKLQkJc3RydWN0IGFmZV9wYXJhbV9pZF91c2JfYXVkaW9fZGV2X3BhcmFtcyB1c2JfZGV2OwotCQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3VzYl9hdWRpb19kZXZfbHBjbV9mbXQgbHBjbV9mbXQ7Ci0JfTsKLX0gX19wYWNrZWQ7Ci0KLS8qIFRoaXMgcGFyYW0gaWQgaXMgdXNlZCB0byBjb25maWd1cmUgUmVhbCBUaW1lIFByb3h5IGludGVyZmFjZS4gKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1JUX1BST1hZX0NPTkZJRyAweDAwMDEwMjEzCi0KLS8qIFRoaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGUgbmV3Ci0gKiBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZyBpbnRlcmZhY2UgaW4gZnV0dXJlIGluIGJhY2t3YXJkCi0gKiBjb21wYXRpYmxlIG1hbm5lci4KLSAqLwotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fUlRfUFJPWFlfQ09ORklHIDB4MQotCi0vKiAgUGF5bG9hZCBvZiB0aGUgI0FGRV9QQVJBTV9JRF9SVF9QUk9YWV9DT05GSUcKLSAqIGNvbW1hbmQgKHJlYWwtdGltZSBwcm94eSBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyKS4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF9ydF9wcm94eV9wb3J0X2NmZyB7Ci0JdTMyICAgICAgICAgICAgICAgICAgcnRfcHJveHlfY2ZnX21pbm9yX3ZlcnNpb247Ci0vKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHJ0LXByb3h5Ci0gKiBjb25maWcgaW50ZXJmYWNlLgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7Ci0vKiBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2Ci0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIEFGRQotICogaW50ZXJmYWNlIGFuZCByZWFsLXRpbWUgcG9ydCBpcyBpbnRlcmxlYXZlZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IC0gMCAtLSBOb24taW50ZXJsZWF2ZWQgKHNhbXBsZXMgZnJvbSBlYWNoCi0gKiBjaGFubmVsIGFyZSBjb250aWd1b3VzIGluIHRoZSBidWZmZXIpIC0gMSAtLSBJbnRlcmxlYXZlZAotICogKGNvcnJlc3BvbmRpbmcgc2FtcGxlcyBmcm9tIGVhY2ggaW5wdXQgY2hhbm5lbCBhcmUgaW50ZXJsZWF2ZWQKLSAqIHdpdGhpbiB0aGUgYnVmZmVyKQotICovCi0KLQotCXUxNiAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemU7Ci0vKiBTaXplIG9mIHRoZSBmcmFtZXMgdGhhdCBhcmUgdXNlZCBmb3IgUENNIGV4Y2hhbmdlcyB3aXRoIHRoaXMKLSAqIHBvcnQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAsIGluIGJ5dGVzCi0gKiBGb3IgZXhhbXBsZSwgNSBtcyBidWZmZXJzIG9mIDE2IGJpdHMgYW5kIDE2IGtIeiBzdGVyZW8gc2FtcGxlcwotICogaXMgNSBtcyAqIDE2IHNhbXBsZXMvbXMgKiAyIGJ5dGVzL3NhbXBsZSAqIDIgY2hhbm5lbHMgPSAzMjAKLSAqIGJ5dGVzLgotICovCi0JdTE2ICAgICAgICAgICAgICAgICAgaml0dGVyX2FsbG93YW5jZTsKLS8qIENvbmZpZ3VyZXMgdGhlIGFtb3VudCBvZiBqaXR0ZXIgdGhhdCB0aGUgcG9ydCB3aWxsIGFsbG93LgotICogU3VwcG9ydGVkIHZhbHVlczogPiAwCi0gKiBGb3IgZXhhbXBsZSwgaWYgKy8tMTAgbXMgb2Ygaml0dGVyIGlzIGFudGljaXBhdGVkIGluIHRoZSB0aW1pbmcKLSAqIG9mIHNlbmRpbmcgZnJhbWVzIHRvIHRoZSBwb3J0LCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgMTYga0h6Ci0gKiBtb25vIHdpdGggMTYtYml0IHNhbXBsZXMsIHRoaXMgZmllbGQgaXMgMTAgbXMgKiAxNiBzYW1wbGVzL21zICogMgotICogYnl0ZXMvc2FtcGxlID0gMzIwLgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBsb3dfd2F0ZXJfbWFyazsKLS8qIExvdyB3YXRlcm1hcmsgaW4gYnl0ZXMgKGluY2x1ZGluZyBhbGwgY2hhbm5lbHMpLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBEbyBub3Qgc2VuZCBhbnkgbG93IHdhdGVybWFyayBldmVudHMKLSAqIC0gPiAwIC0tIExvdyB3YXRlcm1hcmsgZm9yIHRyaWdnZXJpbmcgYW4gZXZlbnQKLSAqIElmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYW4gaW50ZXJuYWwgY2lyY3VsYXIgYnVmZmVyIGlzIGxvd2VyCi0gKiB0aGFuIHRoaXMgbG93X3dhdGVyX21hcmsgcGFyYW1ldGVyLCBhIExPV19XQVRFUl9NQVJLIGV2ZW50IGlzCi0gKiBzZW50IHRvIGFwcGxpY2F0aW9ucyAodmlhIHRoZSAjQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTCi0gKiBldmVudCkuCi0gKiBVc2Ugb2Ygd2F0ZXJtYXJrIGV2ZW50cyBpcyBvcHRpb25hbCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBoaWdoX3dhdGVyX21hcms7Ci0vKiBIaWdoIHdhdGVybWFyayBpbiBieXRlcyAoaW5jbHVkaW5nIGFsbCBjaGFubmVscykuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAwIC0tIERvIG5vdCBzZW5kIGFueSBoaWdoIHdhdGVybWFyayBldmVudHMKLSAqIC0gPiAwIC0tIEhpZ2ggd2F0ZXJtYXJrIGZvciB0cmlnZ2VyaW5nIGFuIGV2ZW50Ci0gKiBJZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGludGVybmFsIGNpcmN1bGFyIGJ1ZmZlciBleGNlZWRzCi0gKiBUT1RBTF9DSVJDX0JVRl9TSVpFIG1pbnVzIGhpZ2hfd2F0ZXJfbWFyaywgYSBoaWdoIHdhdGVybWFyayBldmVudAotICogaXMgc2VudCB0byBhcHBsaWNhdGlvbnMgKHZpYSB0aGUgI0FGRV9FVkVOVF9SVF9QUk9YWV9QT1JUX1NUQVRVUwotICogZXZlbnQpLgotICogVGhlIHVzZSBvZiB3YXRlcm1hcmsgZXZlbnRzIGlzIG9wdGlvbmFsIGFuZCBmb3IgZGVidWdnaW5nCi0gKiBwdXJwb3Nlcy4KLSAqLwotCi0KLQl1MzIJCQkJCXNhbXBsZV9yYXRlOwotLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SwotICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTZLCi0gKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOwotLyogTnVtYmVyIG9mIGNoYW5uZWxzLgotICogU3VwcG9ydGVkIHZhbHVlczogMSB0byAjQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIEZvciAzMiBiaXQgYWxpZ25tZW50LiAqLwotfSBfX3BhY2tlZDsKLQotCi0vKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQc2V1ZG9wb3J0IGludGVyZmFjZSAqLwotCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9QU0VVRE9fUE9SVF9DT05GSUcJMHgwMDAxMDIxOQotCi0vKiBWZXJzaW9uIGluZm9ybWF0aW9uIHVzZWQgdG8gaGFuZGxlIGZ1dHVyZSBhZGRpdGlvbnMgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAqIGludGVyZmFjZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgotICovCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9QU0VVRE9fUE9SVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc2V0dGluZyB0aGUgdGltaW5nX21vZGUgcGFyYW1ldGVyIHRvIGZhc3RlciB0aGFuIHJlYWwKLSAqIHRpbWUuCi0gKi8KLSNkZWZpbmUgQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfRlRSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCi0KLS8qIEVudW1lcmF0aW9uIGZvciBzZXR0aW5nIHRoZSB0aW1pbmdfbW9kZSBwYXJhbWV0ZXIgdG8gcmVhbCB0aW1lIHVzaW5nCi0gKiB0aW1lcnMuCi0gKi8KLSNkZWZpbmUgQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCi0KLS8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9QU0VVRE9fUE9SVF9DT05GSUcgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRS4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcgewotCXUzMiAgICAgICAgICAgICAgICAgIHBzZXVkX3BvcnRfY2ZnX21pbm9yX3ZlcnNpb247Ci0JLyoKLQkgKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBwc2V1ZG9wb3J0Ci0JICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0JICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRfd2lkdGg7Ci0JLyogQml0IHdpZHRoIG9mIHRoZSBzYW1wbGUgYXQgdmFsdWVzIDE2LCAyNCAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOwotCS8qIE51bWJlciBvZiBjaGFubmVscyBhdCB2YWx1ZXMgIDEgdG8gOCAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgZGF0YV9mb3JtYXQ7Ci0JLyogTm9uLWxpbmVhciBkYXRhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBzZXVkb3BvcnQgKGZvciBmdXR1cmUgdXNlKS4KLQkgKiBBdCB2YWx1ZXMgI0FGRV9MSU5FQVJfUENNX0RBVEEKLQkgKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHRpbWluZ19tb2RlOwotCS8qIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwc2V1ZG9wb3J0IHN5bmNocm9uaXplcyB0byB0aGUgY2xvY2sgb3IKLQkgKiBvcGVyYXRlcyBmYXN0ZXIgdGhhbiByZWFsIHRpbWUuCi0JICogYXQgdmFsdWVzCi0JICogLSAjQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfRlRSVAotCSAqIC0gI0FGRV9QU0VVRE9QT1JUX1RJTUlOR19NT0RFX1RJTUVSIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0JLyogU2FtcGxlIHJhdGUgYXQgd2hpY2ggdGhlIHBzZXVkb3BvcnQgd2lsbCBydW4uCi0JICogYXQgdmFsdWVzCi0JICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zMksKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV85NksKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUEFSQU1fSURfVERNX0NPTkZJRwkJMHgwMDAxMDI5RAotCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9URE1fQ09ORklHICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfQklUX01PREUgICAgICAgIDAKLSNkZWZpbmUgQUZFX1BPUlRfVERNX0xPTkdfU1lOQ19NT0RFICAgICAgICAgICAgIDEKLSNkZWZpbmUgQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfU0xPVF9NT0RFICAgICAgIDIKLQotI2RlZmluZSBBRkVfUE9SVF9URE1fU1lOQ19TUkNfRVhURVJOQUwgICAgICAgICAgMAotI2RlZmluZSBBRkVfUE9SVF9URE1fU1lOQ19TUkNfSU5URVJOQUwgICAgICAgICAgMQotCi0jZGVmaW5lIEFGRV9QT1JUX1RETV9DVFJMX0RBVEFfT0VfRElTQUJMRSAgICAgICAwCi0jZGVmaW5lIEFGRV9QT1JUX1RETV9DVFJMX0RBVEFfT0VfRU5BQkxFICAgICAgICAxCi0KLSNkZWZpbmUgQUZFX1BPUlRfVERNX1NZTkNfTk9STUFMICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQUZFX1BPUlRfVERNX1NZTkNfSU5WRVJUICAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8wX0JDTEtfQ1lDTEUgICAgMAotI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8xX0JDTEtfQ1lDTEUgICAgMQotI2RlZmluZSBBRkVfUE9SVF9URE1fREFUQV9ERUxBWV8yX0JDTEtfQ1lDTEUgICAgMgotCi0vKiBQYXlsb2FkIG9mIHRoZSBBRkVfUEFSQU1fSURfVERNX0NPTkZJRyBwYXJhbWV0ZXIgdXNlZCBieQotICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgotICovCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX3RkbV9jZmcgewotCXUzMgl0ZG1fY2ZnX21pbm9yX3ZlcnNpb247Ci0JLyogPCBNaW5vciB2ZXJzaW9uIHVzZWQgdG8gdHJhY2sgVERNIGNvbmZpZ3VyYXRpb24uCi0JICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX1RETV9DT05GSUcKLQkgKi8KLQotCXUzMgludW1fY2hhbm5lbHM7Ci0JLyogPCBOdW1iZXIgb2YgZW5hYmxlZCBzbG90cyBmb3IgVERNIGZyYW1lLgotCSAqIEB2YWx1ZXMgMSB0byA4Ci0JICovCi0KLQl1MzIJc2FtcGxlX3JhdGU7Ci0JLyogPCBTYW1wbGluZyByYXRlIG9mIHRoZSBwb3J0LgotCSAqIEB2YWx1ZXMKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV84SwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzI0SwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzMySwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzQ4SwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE3NlA0SwotCSAqIC0gI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzM1MlA4SyBAdGFibGVidWxsZXRlbmQKLQkgKi8KLQotCXUzMgliaXRfd2lkdGg7Ci0JLyogPCBCaXQgd2lkdGggb2YgdGhlIHNhbXBsZS4KLQkgKiBAdmFsdWVzIDE2LCAyNAotCSAqLwotCi0JdTE2CWRhdGFfZm9ybWF0OwotCS8qIDwgRGF0YSBmb3JtYXQ6IGxpbmVhciAsY29tcHJlc3NlZCwgZ2VuZXJpYyBjb21wcmVzc3NlZAotCSAqIEB2YWx1ZXMKLQkgKiAtICNBRkVfTElORUFSX1BDTV9EQVRBCi0JICogLSAjQUZFX05PTl9MSU5FQVJfREFUQQotCSAqIC0gI0FGRV9HRU5FUklDX0NPTVBSRVNTRUQKLQkgKi8KLQotCXUxNglzeW5jX21vZGU7Ci0JLyogPCBURE0gc3luY2hyb25pemF0aW9uIHNldHRpbmcuCi0JICogQHZhbHVlcyAoc2hvcnQsIGxvbmcsIHNsb3QpIHN5bmMgbW9kZQotCSAqIC0gI0FGRV9QT1JUX1RETV9TSE9SVF9TWU5DX0JJVF9NT0RFCi0JICogLSAjQUZFX1BPUlRfVERNX0xPTkdfU1lOQ19NT0RFCi0JICogLSAjQUZFX1BPUlRfVERNX1NIT1JUX1NZTkNfU0xPVF9NT0RFIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCi0JdTE2CXN5bmNfc3JjOwotCS8qIDwgU3luY2hyb25pemF0aW9uIHNvdXJjZS4KLQkgKiBAdmFsdWVzCi0JICogLSAjQUZFX1BPUlRfVERNX1NZTkNfU1JDX0VYVEVSTkFMCi0JICogLSAjQUZFX1BPUlRfVERNX1NZTkNfU1JDX0lOVEVSTkFMIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCi0JdTE2CW5zbG90c19wZXJfZnJhbWU7Ci0JLyogPCBOdW1iZXIgb2Ygc2xvdHMgcGVyIGZyYW1lLiBUeXBpY2FsIDogMSwgMiwgNCwgOCwgMTYsIDMyLgotCSAqIEB2YWx1ZXMgMSAtIDMyCi0JICovCi0KLQl1MTYJY3RybF9kYXRhX291dF9lbmFibGU7Ci0JLyogPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgVERNIGJsb2NrIHNoYXJlcyB0aGUgZGF0YS1vdXQgc2lnbmFsIHRvIHRoZQotCSAqIGRyaXZlIHdpdGggb3RoZXIgbWFzdGVycy4KLQkgKiBAdmFsdWVzCi0JICogLSAjQUZFX1BPUlRfVERNX0NUUkxfREFUQV9PRV9ESVNBQkxFCi0JICogLSAjQUZFX1BPUlRfVERNX0NUUkxfREFUQV9PRV9FTkFCTEUgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0KLQl1MTYJY3RybF9pbnZlcnRfc3luY19wdWxzZTsKLQkvKiA8IFNwZWNpZmllcyB3aGV0aGVyIHRvIGludmVydCB0aGUgc3luYyBvciBub3QuCi0JICogQHZhbHVlcwotCSAqIC0gI0FGRV9QT1JUX1RETV9TWU5DX05PUk1BTAotCSAqIC0gI0FGRV9QT1JUX1RETV9TWU5DX0lOVkVSVCBAdGFibGVidWxsZXRlbmQKLQkgKi8KLQotCXUxNgljdHJsX3N5bmNfZGF0YV9kZWxheTsKLQkvKiA8IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJpdCBjbG9jayB0byBkZWxheSBkYXRhIHdpdGggcmVzcGVjdCB0bwotCSAqIHN5bmMgZWRnZS4KLQkgKiBAdmFsdWVzCi0JICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMF9CQ0xLX0NZQ0xFCi0JICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMV9CQ0xLX0NZQ0xFCi0JICogLSAjQUZFX1BPUlRfVERNX0RBVEFfREVMQVlfMl9CQ0xLX0NZQ0xFIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCi0JdTE2CXNsb3Rfd2lkdGg7Ci0JLyogPCBTbG90IHdpZHRoIG9mIHRoZSBzbG90IGluIGEgVERNIGZyYW1lLiAgKHNsb3Rfd2lkdGggPj0gYml0X3dpZHRoKQotCSAqIGhhdmUgdG8gYmUgc2F0aXNmaWVkLgotCSAqIEB2YWx1ZXMgMTYsIDI0LCAzMgotCSAqLwotCi0JdTMyCXNsb3RfbWFzazsKLQkvKiA8IFBvc2l0aW9uIG9mIGFjdGl2ZSBzbG90cy4gIFdoZW4gdGhhdCBiaXQgaXMgc2V0LAotCSAqIHRoYXQgcGFyaWN1bGFyIHNsb3QgaXMgYWN0aXZlLgotCSAqIE51bWJlciBvZiBhY3RpdmUgc2xvdHMgY2FuIGJlIGluZmVycmVkIGJ5IG51bWJlciBvZgotCSAqIGJpdHMgc2V0IGluIHRoZSBtYXNrLiAgT25seSA4IGluZGl2aWR1YWwgYml0cyBjYW4gYmUgZW5hYmxlZC4KLQkgKiBCaXRzIDAuLjMxIGNvcnJlc3BvbmRpbmcgdG8gc2xvdCAwLi4zMQotCSAqIEB2YWx1ZXMgMSB0byAyXjMyIC0gMQotCSAqLwotfSBfX3BhY2tlZDsKLQotLyogSUQgb2YgVGltZSBEaXZzaW9uIE11bHRpcGxleGluZyAoVERNKSBtb2R1bGUsCi0gKiB3aGljaCBpcyB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgQUZFIFRETS4KLSAqCi0gKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKLSAqIC0gI0FGRV9QT1JUX1RETV9TTE9UX0NPTkZJRwotICoKLSAqIFRvIGNvbmZpZ3VyZSB0aGUgVERNIGludGVyZmFjZSwgdGhlIGNsaWVudCBtdXN0IHVzZSB0aGUKLSAqICNBRkVfUE9SVF9DTURfU0VUX1BBUkFNIGNvbW1hbmQsIGFuZCBmaWxsIHRoZSBtb2R1bGUgSUQgd2l0aCB0aGUKLSAqIHJlc3BlY3RpdmUgcGFyYW1ldGVyIElEcyBhcyBsaXN0ZWQgYWJvdmUuCi0gKi8KLQotI2RlZmluZSBBRkVfTU9EVUxFX1RETQkJMHgwMDAxMDI4QQotCi0vKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgI0FGRV9NT0RVTEVfVERNIHRvIGNvbmZpZ3VyZQotICogdGhlIFRETSBzbG90IG1hcHBpbmcuICNBRkVfUE9SVF9DTURfU0VUX1BBUkFNIGNhbiB1c2UgdGhpcyBwYXJhbWV0ZXIgSUQuCi0gKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1BPUlRfU0xPVF9NQVBQSU5HX0NPTkZJRwkweDAwMDEwMjk3Ci0KLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gdXNlZCB0byBoYW5kbGUgZnV0dXJlIGFkZGl0aW9ucyB0byBzbG90IG1hcHBpbmcKLSAqIGNvbmZpZ3VyYXRpb24gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KLSAqLwotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fU0xPVF9NQVBQSU5HX0NPTkZJRwkweDEKLQotLyogRGF0YSBhbGlnbiB0eXBlICAqLwotI2RlZmluZSBBRkVfU0xPVF9NQVBQSU5HX0RBVEFfQUxJR05fTVNCCQkwCi0jZGVmaW5lIEFGRV9TTE9UX01BUFBJTkdfREFUQV9BTElHTl9MU0IJCTEKLQotI2RlZmluZSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElECQkweEZGRkYKLQotLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX1BPUlRfU0xPVF9NQVBQSU5HX0NPTkZJRwotICogY29tbWFuZCdzIFRETSBjb25maWd1cmF0aW9uIHBhcmFtZXRlci4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF9zbG90X21hcHBpbmdfY2ZnIHsKLQl1MzIJbWlub3JfdmVyc2lvbjsKLQkvKiA8IE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgVERNIHNsb3QgY29uZmlndXJhdGlvbi4KLQkgKiBAdmFsdWVzICNBRkVfQVBJX1ZFUlNJT05fVERNX1NMT1RfQ09ORklHCi0JICovCi0KLQl1MTYJbnVtX2NoYW5uZWw7Ci0JLyogPCBudW1iZXIgb2YgY2hhbm5lbCBvZiB0aGUgYXVkaW8gc2FtcGxlLgotCSAqIEB2YWx1ZXMgMSwgMiwgNCwgNiwgOCBAdGFibGVidWxsZXRlbmQKLQkgKi8KLQotCXUxNgliaXR3aWR0aDsKLQkvKiA8IFNsb3QgYml0IHdpZHRoIGZvciBlYWNoIGNoYW5uZWwKLQkgKiBAdmFsdWVzIDE2LCAyNCwgMzIKLQkgKi8KLQotCXUzMglkYXRhX2FsaWduX3R5cGU7Ci0JLyogPCBpbmRpY2F0ZSBob3cgZGF0YSBwYWNrZWQgZnJvbSBzbG90X29mZnNldCBmb3IgMzIgc2xvdCBiaXQgd2lkdGgKLQkgKiBpbiBjYXNlIG9mIHNhbXBsZSBiaXQgd2lkdGggaXMgMjQuCi0JICogQHZhbHVlcwotCSAqICNBRkVfU0xPVF9NQVBQSU5HX0RBVEFfQUxJR05fTVNCCi0JICogI0FGRV9TTE9UX01BUFBJTkdfREFUQV9BTElHTl9MU0IKLQkgKi8KLQotCXUxNglvZmZzZXRbQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UXTsKLQkvKiA8IEFycmF5IG9mIHRoZSBzbG90IG1hcHBpbmcgc3RhcnQgb2Zmc2V0IGluIGJ5dGVzIGZvciB0aGlzIGZyYW1lLgotCSAqIFRoZSBieXRlcyBpcyBjb3VudGVkIGZyb20gMC4gVGhlIDAgaXMgbWFwcGVkIHRvIHRoZSAxc3QgYnl0ZQotCSAqIGluIG9yIG91dCBvZiB0aGUgZGlnaXRhbCBzZXJpYWwgZGF0YSBsaW5lIHRoaXMgc3ViLWZyYW1lIGJlbG9uZyB0by4KLQkgKiBzbG90X29mZnNldFtdIHNldHRpbmcgaXMgcGVyLWNoYW5uZWwgYmFzZWQuCi0JICogVGhlIG1heCBudW0gb2YgY2hhbm5lbCBzdXBwb3J0ZWQgaXMgOC4KLQkgKiBUaGUgdmFsaWQgb2Zmc2V0IHZhbHVlIG11c3QgYWx3YXlzIGJlIGNvbnRpbnVseSBwbGFjZWQgaW4gZnJvbQotCSAqIGluZGV4IDAuCi0JICogU2V0IG9mZnNldCBhcyBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEIGZvciBub3QgdXNlZCBhcnJheXMuCi0JICogSWYgInNsb3RfYml0d2lkdGhfcGVyX2NoYW5uZWwiIGlzIDMyIGFuZCAic2FtcGxlX2JpdHdpZHRoIiBpcyAyNCwKLQkgKiAiZGF0YV9hbGlnbl90eXBlIiBpcyB1c2VkIHRvIGluZGljYXRlIGhvdyAyNCBiaXQgc2FtcGxlIGRhdGEgaW4KLQkgKiBhbGlnbmluZyB3aXRoIDMyIGJpdCBzbG90IHdpZHRoIHBlci1jaGFubmVsLgotCSAqIEB2YWx1ZXMsIGluIGJ5dGUKLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIElEIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZCBieSAjQUZFX01PRFVMRV9URE0gdG8gY29uZmlndXJlCi0gKiB0aGUgY3VzdG9tZXIgVERNIGhlYWRlci4gI0FGRV9QT1JUX0NNRF9TRVRfUEFSQU0gY2FuIHVzZSB0aGlzIHBhcmFtZXRlciBJRC4KLSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfQ1VTVE9NX1RETV9IRUFERVJfQ09ORklHCQkweDAwMDEwMjk4Ci0KLS8qIFZlcnNpb24gaW5mb3JtYXRpb24gdXNlZCB0byBoYW5kbGUgZnV0dXJlIGFkZGl0aW9ucyB0byBjdXN0b20gVERNIGhlYWRlcgotICogY29uZmlndXJhdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgotICovCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9DVVNUT01fVERNX0hFQURFUl9DT05GSUcJMHgxCi0KLSNkZWZpbmUgQUZFX0NVU1RPTV9URE1fSEVBREVSX1RZUEVfSU5WQUxJRAkJMHgwCi0jZGVmaW5lIEFGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0RFRkFVTFQJCTB4MQotI2RlZmluZSBBRkVfQ1VTVE9NX1RETV9IRUFERVJfVFlQRV9FTlRFUlRBSU5NRU5UX01PU1QJMHgyCi0KLSNkZWZpbmUgQUZFX0NVU1RPTV9URE1fSEVBREVSX01BWF9DTlQJMHg4Ci0KLS8qIFBheWxvYWQgb2YgdGhlIEFGRV9QQVJBTV9JRF9DVVNUT01fVERNX0hFQURFUl9DT05GSUcgcGFyYW1ldGVyIElEICovCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX2N1c3RvbV90ZG1faGVhZGVyX2NmZyB7Ci0JdTMyCW1pbm9yX3ZlcnNpb247Ci0JLyogPCBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIGN1c3RvbSBURE0gaGVhZGVyIGNvbmZpZ3VyYXRpb24uCi0JICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX0NVU1RPTV9URE1fSEVBREVSX0NPTkZJRwotCSAqLwotCi0JdTE2CXN0YXJ0X29mZnNldDsKLQkvKiA8IHRoZSBzbG90IG1hcHBpbmcgc3RhcnQgb2Zmc2V0IGluIGJ5dGVzIGZyb20gdGhpcyBzdWItZnJhbWUKLQkgKiBUaGUgYnl0ZXMgaXMgY291bnRlZCBmcm9tIDAuIFRoZSAwIGlzIG1hcHBlZCB0byB0aGUgMXN0IGJ5dGUgaW4gb3IKLQkgKiBvdXQgb2YgdGhlIGRpZ2l0YWwgc2VyaWFsIGRhdGEgbGluZSB0aGlzIHN1Yi1mcmFtZSBiZWxvbmcgdG8uCi0JICogQHZhbHVlcywgaW4gYnl0ZSwKLQkgKiBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAwLCA0LCA4Ci0JICovCi0KLQl1MTYJaGVhZGVyX3dpZHRoOwotCS8qIDwgdGhlIGhlYWRlciB3aWR0aCBwZXItZnJhbWUgZm9sbG93ZWQuCi0JICogMiBieXRlcyBmb3IgTU9TVC9URE0gY2FzZQotCSAqIEB2YWx1ZXMsIGluIGJ5dGUKLQkgKiBzdXBwb3J0ZWQgdmFsdWUgaXMgMgotCSAqLwotCi0JdTE2CWhlYWRlcl90eXBlOwotCS8qIDwgSW5kaWNhdGUgd2hhdCBraW5kIG9mIGN1c3RvbSBURE0gaGVhZGVyIGl0IGlzLgotCSAqIEB2YWx1ZXMgI0FGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0lOVkFMSUQgPSAwCi0JICogI0FGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0RFRkFVTFQgPSAxICAoZm9yIEFBTiBjaGFubmVsIHBlciBNT1NUKQotCSAqICNBRkVfQ1VTVE9NX1RETV9IRUFERVJfVFlQRV9FTlRFUlRBSU5NRU5UX01PU1QgPSAyCi0JICogKGZvciBlbnRlcnRhaW5tZW50IGNoYW5uZWwsIHdoaWNoIHdpbGwgb3ZlcndyaXRlCi0JICogQUZFX0FQSV9WRVJTSU9OX1RETV9TQURfSEVBREVSX1RZUEVfREVGQVVMVCBwZXIgTU9TVCkKLQkgKi8KLQotCXUxNgludW1fZnJhbWVfcmVwZWF0OwotCS8qIDwgbnVtIG9mIGhlYWRlciBmb2xsb3dlZC4KLQkgKiBAdmFsdWVzLCBzdXBwb3J0ZWQgdmFsdWUgaXMgOAotCSAqLwotCXUxNgloZWFkZXJbQUZFX0NVU1RPTV9URE1fSEVBREVSX01BWF9DTlRdOwotCS8qIDwgU0FEIGhlYWRlciBmb3IgTU9TVC9URE0gY2FzZSBpcyBmb2xsb3dlZCBhcyBwYXlsb2FkIGFzIGJlbG93LgotCSAqIFRoZSBzaXplIG9mIGZvbGxvd2VkIFNBRCBoZWFkZXIgaW4gYnl0ZXMgaXMgbnVtX29mX2ZyYW1lX3JlcGVhdCAqCi0JICogaGVhZGVyX3dpZHRoX3Blcl9mcmFtZSwgd2hpY2ggaXMgMiAqIDggPSAxNiBieXRlcyBoZXJlLgotCSAqIHRoZSBzdXBwb3J0ZWQgcGF5bG9hZCBmb3JtYXQgaXMgaW4gdWludDE2X3QgYXMgYmVsb3cKLQkgKiB1aW50MTZfdCBoZWFkZXIwOyBTeW5jSGkgMHgzQyBJbmZvWzRdIC0gQ29kZWNUeXBlIC0+IDB4M0MwMAotCSAqIHVpbnQxNl90IGhlYWRlcjE7IFN5bmNMbyAweEIyIEluZm9bNV0gLSBTYW1wbGVXaWR0aCAtPiAweEIyMTgKLQkgKiB1aW50MTZfdCBoZWFkZXIyOyBEVENQIEluZm8gICAgIEluZm9bNl0gLSB1bnVzZWQgLT4gMHgwCi0JICogdWludDE2X3QgaGVhZGVyMzsgRXh0ZW5zaW9uIEluZm9bN10gLSBBU0FELVZhbHVlIC0+IDB4QzAKLQkgKiB1aW50MTZfdCBoZWFkZXI0OyBSZXNlcnZlZCBJbmZvWzBdIC0gTnVtIG9mIGJ5dGVzIGZvbGxvd2luZyAgLT4gMHg3Ci0JICogdWludDE2X3QgaGVhZGVyNTsgUmVzZXJ2ZWQgSW5mb1sxXSAtIE1lZGlhIFR5cGUgLT4gMHgwCi0JICogdWludDE2X3QgaGVhZGVyNjsgUmVzZXJ2ZWQgSW5mb1syXSAtIEJpdHJhdGVba2Jwc10gLSBIaWdoIEJ5dGUgLT4gMHgwCi0JICogdWludDE2X3QgaGVhZGVyNzsgUmVzZXJ2ZWQgSW5mb1szXSAtIEJpdHJhdGVba2Jwc10gLSBMb3cgIEJ5dGUgLT4gMHgwCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3Nsb3RfbWFwcGluZ19jb25maWdfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyCXBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyCXBkYXRhOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfc2xvdF9tYXBwaW5nX2NmZwlzbG90X21hcHBpbmc7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2N1c3RvbV90ZG1faGVhZGVyX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIJcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIJcGRhdGE7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcJY3VzdG9tX3RkbV9oZWFkZXI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3RkbV9wb3J0X2NvbmZpZyB7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF90ZG1fY2ZnCQkJCXRkbTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3Nsb3RfbWFwcGluZ19jZmcJCXNsb3RfbWFwcGluZzsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2N1c3RvbV90ZG1faGVhZGVyX2NmZwljdXN0b21fdGRtX2hlYWRlcjsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0RFVklDRV9IV19ERUxBWSAgICAgMHgwMDAxMDI0MwotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fREVWSUNFX0hXX0RFTEFZICAweDEKLQotc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZpY2VfaHdfZGVsYXlfY2ZnIHsKLQl1aW50MzJfdCAgICBkZXZpY2VfaHdfZGVsYXlfbWlub3JfdmVyc2lvbjsKLQl1aW50MzJfdCAgICBkZWxheV9pbl91czsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NFVF9UT1BPTE9HWSAgICAweDAwMDEwMjVBCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9UT1BPTE9HWV9WMSAweDEKLQotc3RydWN0IGFmZV9wYXJhbV9pZF9zZXRfdG9wb2xvZ3lfY2ZnIHsKLQkvKgotCSAqIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgYWZlIHRvcG9sb2d5IGlkIGNvbmZpZ3VyYXRpb24uCi0JICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX1RPUE9MT0dZX1YxCi0JICovCi0JdTMyCQltaW5vcl92ZXJzaW9uOwotCS8qCi0JICogSWQgb2YgdGhlIHRvcG9sb2d5IGZvciB0aGUgYWZlIHNlc3Npb24uCi0JICogQHZhbHVlcyBBbnkgdmFsaWQgQUZFIHRvcG9sb2d5IElECi0JICovCi0JdTMyCQl0b3BvbG9neV9pZDsKLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIEdlbmVyaWMgZW5jb2RlciBtb2R1bGUgSUQuCi0gKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6Ci0gKiAjQVZTX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCAoY2Fubm90IGJlIHNldCBydW4gdGltZSkKLSAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9FTkNfQ0ZHX0JMSyAobWF5IGJlIHNldCBydW4gdGltZSkKLSAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9FTkNfQklUUkFURSAobWF5IGJlIHNldCBydW4gdGltZSkKLSAqICNBVlNfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEIChjYW5ub3QgYmUgc2V0IHJ1biB0aW1lKQotICogT3Bjb2RlIC0gQVZTX01PRFVMRV9JRF9FTkNPREVSCi0gKiBBRkUgQ29tbWFuZCBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyIHN1cHBvcnRzIHRoaXMgbW9kdWxlIElELgotICovCi0jZGVmaW5lIEFGRV9NT0RVTEVfSURfRU5DT0RFUiAgICAgICAgMHgwMDAxMzIyOQotCi0vKiBNYWNybyBmb3IgZGVmaW5pbmcgdGhlIHBhY2tldGl6ZXIgSUQ6IENPUC4gKi8KLSNkZWZpbmUgQUZFX01PRFVMRV9JRF9QQUNLRVRJWkVSX0NPUCAweDAwMDEzMjJBCi0KLS8qCi0gKiBQYWNrZXRpemVyIHR5cGUgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCi0gKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IHJ1bnRpbWUuCi0gKi8KLSNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfUEFDS0VUSVpFUl9JRCAweDAwMDEzMjJFCi0KLS8qCi0gKiBFbmNvZGVyIGNvbmZpZyBibG9jayAgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCi0gKiBUaGlzIHBhcmFtZXRlciBtYXkgYmUgc2V0IHJ1bnRpbWUuCi0gKi8KLSNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgMHgwMDAxMzIyQwotCi0vKgotICogRW5jb2RlciBmb3JtYXQgSUQgcGFyYW1ldGVyIGZvciB0aGUgI0FWU19NT0RVTEVfSURfRU5DT0RFUiBtb2R1bGUuCi0gKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgc2V0IHJ1bnRpbWUuCi0gKi8KLSNkZWZpbmUgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCAgICAgICAgIDB4MDAwMTMyMkIKLQotLyoKLSAqIERhdGEgZm9ybWF0IHRvIHNlbmQgY29tcHJlc3NlZCBkYXRhCi0gKiBpcyB0cmFuc21pdHRlZC9yZWNlaXZlZCBvdmVyIFNsaW1idXMgbGluZXMuCi0gKi8KLSNkZWZpbmUgQUZFX1NCX0RBVEFfRk9STUFUX0dFTkVSSUNfQ09NUFJFU1NFRCAgICAweDMKLQotLyoKLSAqIElEIGZvciBBRkUgcG9ydCBtb2R1bGUuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRlZmluZSBwb3J0IHByb3BlcnRpZXMuCi0gKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKLSAqICNBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFCi0gKiBUbyBjb25maWd1cmUgdGhlIHBvcnQgcHJvcGVydHksIHRoZSBjbGllbnQgbXVzdCB1c2UgdGhlCi0gKiAjQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMiBjb21tYW5kLAotICogYW5kIGZpbGwgdGhlIG1vZHVsZSBJRCB3aXRoIHRoZSByZXNwZWN0aXZlIHBhcmFtZXRlciBJRHMgYXMgbGlzdGVkIGFib3ZlLgotICogQGFwcl9oZHJfZmllbGRzCi0gKiBPcGNvZGUgLS0gQUZFX01PRFVMRV9QT1JUCi0gKi8KLSNkZWZpbmUgQUZFX01PRFVMRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMmE2Ci0KLS8qCi0gKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgI0FGRV9NT0RVTEVfUE9SVCB0byBzZXQgdGhlIHBvcnQgbWVkaWEgdHlwZS4KLSAqIHBhcmFtZXRlciBJRCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIHVzaW5nI0FGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIgY29tbWFuZC4KLSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFICAgICAgICAgICAgICAweDAwMDEwMmE3Ci0KLS8qCi0gKiBNYWNyb3MgZm9yIGRlZmluaW5nIHRoZSAiZGF0YV9mb3JtYXQiIGZpZWxkIGluIHRoZQotICogI0FGRV9QQVJBTV9JRF9QT1JUX01FRElBX1RZUEUKLSAqLwotI2RlZmluZSBBRkVfUE9SVF9EQVRBX0ZPUk1BVF9QQ00gICAgICAgICAgICAgICAgICAweDAKLSNkZWZpbmUgQUZFX1BPUlRfREFUQV9GT1JNQVRfR0VORVJJQ19DT01QUkVTU0VEICAgMHgxCi0KLS8qCi0gKiBNYWNybyBmb3IgZGVmaW5pbmcgdGhlICJtaW5vcl92ZXJzaW9uIiBmaWVsZCBpbiB0aGUKLSAqICNBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFCi0gKi8KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX1BPUlRfTUVESUFfVFlQRSAgICAgICAgICAgMHgxCi0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgMHgwCi0KLS8qCi0gKiBNZWRpYSBmb3JtYXQgSUQgZm9yIFNCQyBlbmNvZGUgY29uZmlndXJhdGlvbi4KLSAqIEBwYXIgU0JDIGVuY29kZSBjb25maWd1cmF0aW9uIChhc21fc2JjX2VuY19jZmdfdCkKLSAqIEB0YWJsZXt3ZWFrX19hc21fX3NiY19fZW5jX19jZmdfX3R9Ci0gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJGMgotCi0vKiBTQkMgY2hhbm5lbCBNb25vIG1vZGUuKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX01PTk8gICAgICAgICAgICAgICAgICAgICAxCi0KLS8qIFNCQyBjaGFubmVsIFN0ZXJlbyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX1NCQ19DSEFOTkVMX01PREVfU1RFUkVPICAgICAgICAgICAgICAgICAgIDIKLQotLyogU0JDIGNoYW5uZWwgRHVhbCBNb25vIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9EVUFMX01PTk8gICAgICAgICAgICAgICAgOAotCi0vKiBTQkMgY2hhbm5lbCBKb2ludCBTdGVyZW8gbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX0pPSU5UX1NURVJFTyAgICAgICAgICAgICA5Ci0KLS8qIFNCQyBiaXQgYWxsb2NhdGlvbiBtZXRob2QgPSBsb3VkbmVzcy4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfTE9VRE5FU1MgICAgICAgICAgICAwCi0KLS8qIFNCQyBiaXQgYWxsb2NhdGlvbiBtZXRob2QgPSBTTlIuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfU0JDX0FMTE9DQVRJT05fTUVUSE9EX1NOUiAgICAgICAgICAgICAgICAgMQotCi0KLS8qCi0gKiBQYXlsb2FkIG9mIHRoZSBTQkMgZW5jb2RlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4gdGhlCi0gKiAjQVNNX01FRElBX0ZNVF9TQkMgbWVkaWEgZm9ybWF0LgotICovCi1zdHJ1Y3QgYXNtX3NiY19lbmNfY2ZnX3QgewotCS8qCi0JICogTnVtYmVyIG9mIHN1YmJhbmRzLgotCSAqIEB2YWx1ZXMgNCwgOAotCSAqLwotCXVpbnQzMl90ICAgIG51bV9zdWJiYW5kczsKLQotCS8qCi0JICogU2l6ZSBvZiB0aGUgZW5jb2RlZCBibG9jayBpbiBzYW1wbGVzLgotCSAqIEB2YWx1ZXMgNCwgOCwgMTIsIDE2Ci0JICovCi0JdWludDMyX3QgICAgYmxrX2xlbjsKLQotCS8qCi0JICogTW9kZSB1c2VkIHRvIGFsbG9jYXRlIGJpdHMgYmV0d2VlbiBjaGFubmVscy4KLQkgKiBAdmFsdWVzCi0JICogMCAoTmF0aXZlIG1vZGUpCi0JICogI0FTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9NT05PCi0JICogI0FTTV9NRURJQV9GTVRfU0JDX0NIQU5ORUxfTU9ERV9TVEVSRU8KLQkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQ0hBTk5FTF9NT0RFX0RVQUxfTU9OTwotCSAqICNBU01fTUVESUFfRk1UX1NCQ19DSEFOTkVMX01PREVfSk9JTlRfU1RFUkVPCi0JICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUgbnVtYmVyCi0JICogb2YgY2hhbm5lbHMgYXQgdGhlIGlucHV0LgotCSAqIElmIHBvc3Rwcm9jZXNzaW5nIG91dHB1dHMgb25lLWNoYW5uZWwgZGF0YSwgTW9ubyBtb2RlIGlzIHVzZWQuIElmCi0JICogcG9zdHByb2Nlc3Npbmcgb3V0cHV0cyB0d28tY2hhbm5lbCBkYXRhLCBTdGVyZW8gbW9kZSBpcyB1c2VkLgotCSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KLQkgKi8KLQl1aW50MzJfdCAgICBjaGFubmVsX21vZGU7Ci0KLQkvKgotCSAqIEVuY29kZXIgYml0IGFsbG9jYXRpb24gbWV0aG9kLgotCSAqIEB2YWx1ZXMKLQkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfTE9VRE5FU1MKLQkgKiAjQVNNX01FRElBX0ZNVF9TQkNfQUxMT0NBVElPTl9NRVRIT0RfU05SIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCXVpbnQzMl90ICAgIGFsbG9jX21ldGhvZDsKLQotCS8qCi0JICogTnVtYmVyIG9mIGVuY29kZWQgYml0cyBwZXIgc2Vjb25kLgotCSAqIEB2YWx1ZXMKLQkgKiBNb25vIGNoYW5uZWwgLS0gTWF4aW11bSBvZiAzMjAga2JwcwotCSAqIFN0ZXJlbyBjaGFubmVsIC0tIE1heGltdW0gb2YgNTEyIGticHMgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDMyX3QgICAgYml0X3JhdGU7Ci0KLQkvKgotCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCi0JICogQHZhbHVlcyAwIChOYXRpdmUgbW9kZSksIDE2MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwJm5ic3A7SHoKLQkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQotCSAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgotCSAqIFRoZSBzYW1wbGluZyByYXRlIG11c3Qgbm90IGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcuCi0JICovCi0JdWludDMyX3QgICAgc2FtcGxlX3JhdGU7Ci19OwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0FPVF9MQyAgICAgICAgICAgIDIKLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfQU9UX1NCUiAgICAgICAgICAgNQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfUFMgICAgICAgICAgICAyOQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRFRTICAwCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX1JBVyAgIDMKLQotc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90IHsKLQotCS8qIEVuY29kaW5nIHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiovCi0JdWludDMyX3QgICAgIGJpdF9yYXRlOwotCi0JLyoKLQkgKiBFbmNvZGluZyBtb2RlLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9MQwotCSAqICNBU01fTUVESUFfRk1UX0FBQ19BT1RfU0JSCi0JICogI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9QUwotCSAqLwotCXVpbnQzMl90ICAgICBlbmNfbW9kZTsKLQotCS8qCi0JICogQUFDIGZvcm1hdCBmbGFnLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogI0FTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX0FEVFMKLQkgKiAjQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfUkFXCi0JICovCi0JdWludDE2X3QgICAgIGFhY19mbXRfZmxhZzsKLQotCS8qCi0JICogTnVtYmVyIG9mIGNoYW5uZWxzIHRvIGVuY29kZS4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIDAgLSBOYXRpdmUgbW9kZQotCSAqIDEgLSBNb25vCi0JICogMiAtIFN0ZXJlbwotCSAqIE90aGVyIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4KLQkgKiBAbm90ZTFoYW5nIFRoZSBlQUFDKyBlbmNvZGVyIG1vZGUgc3VwcG9ydHMgb25seSBzdGVyZW8uCi0JICogTmF0aXZlIG1vZGUgaW5kaWNhdGVzIHRoYXQgZW5jb2RpbmcgbXVzdCBiZSBwZXJmb3JtZWQgd2l0aCB0aGUKLQkgKiBudW1iZXIgb2YgY2hhbm5lbHMgYXQgdGhlIGlucHV0LgotCSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KLQkgKi8KLQl1aW50MTZfdCAgICAgY2hhbm5lbF9jZmc7Ci0KLQkvKgotCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCi0JICogU3VwcG9ydGVkIHZhbHVlczogLSAwIC0tIE5hdGl2ZSBtb2RlIC0gRm9yIG90aGVyIHZhbHVlcywKLQkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQotCSAqIHNhbXBsaW5nIHJhdGUgYXQgdGhlIGlucHV0LgotCSAqIFRoZSBzYW1wbGluZyByYXRlIG11c3Qgbm90IGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcuCi0JICovCi0JdWludDMyX3QgICAgIHNhbXBsZV9yYXRlOwotfSBfX3BhY2tlZDsKLQotLyogRk1UIElEIGZvciBhcHQtWCBDbGFzc2ljICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQVBUWCAweDAwMDEzMWZmCi0KLS8qIEZNVCBJRCBmb3IgYXB0LVggSEQgKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BUFRYX0hEIDB4MDAwMTMyMDAKLQotI2RlZmluZSBQQ01fQ0hBTk5FTF9MICAgICAgICAgMQotI2RlZmluZSBQQ01fQ0hBTk5FTF9SICAgICAgICAgMgotI2RlZmluZSBQQ01fQ0hBTk5FTF9DICAgICAgICAgMwotCi1zdHJ1Y3QgYXNtX2N1c3RvbV9lbmNfY2ZnX2FwdHhfdCB7Ci0JdWludDMyX3QgICAgc2FtcGxlX3JhdGU7Ci0JLyogTW9ubyBvciBzdGVyZW8gKi8KLQl1aW50MTZfdCAgICBudW1fY2hhbm5lbHM7Ci0JdWludDE2X3QgICAgcmVzZXJ2ZWQ7Ci0JLyogbnVtX2NoID09IDEsIHRoZW4gUENNX0NIQU5ORUxfQywKLQkgKiBudW1fY2ggPT0gMiwgdGhlbiB7UENNX0NIQU5ORUxfTCwgUENNX0NIQU5ORUxfUn0KLQkgKi8KLQl1aW50OF90ICAgICBjaGFubmVsX21hcHBpbmdbOF07Ci0JdWludDMyX3QgICAgY3VzdG9tX3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2VuY19mbXRfaWRfcGFyYW1fdCB7Ci0JLyoKLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqICAjQVNNX01FRElBX0ZNVF9TQkMKLQkgKiAgI0FTTV9NRURJQV9GTVRfQUFDX1YyCi0JICogQW55IE9wZW5EU1Agc3VwcG9ydGVkIHZhbHVlcwotCSAqLwotCXVpbnQzMl90ICAgIGZtdF9pZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfcG9ydF9tZWRpYV90eXBlX3QgewotCS8qCi0JICogTWlub3IgdmVyc2lvbgotCSAqIEB2YWx1ZXMgI0FGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEUuCi0JICovCi0JdWludDMyX3QgICAgbWlub3JfdmVyc2lvbjsKLQotCS8qCi0JICogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KLQkgKiBAdmFsdWVzCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzhLCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzExXzAyNUsKLQkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMTJLCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE2SwotCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8yMl8wNUsKLQkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfMjRLCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzMySwotCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV80NF8xSwotCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsKLQkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfODhfMksKLQkgKiAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOTZLCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzE3Nl80SwotCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xOTJLCi0JICogI0FGRV9QT1JUX1NBTVBMRV9SQVRFXzM1Ml84SwotCSAqICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zODRLCi0JICovCi0JdWludDMyX3QgICAgc2FtcGxlX3JhdGU7Ci0KLQkvKgotCSAqIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgotCSAqIEB2YWx1ZXMgMTYsIDI0Ci0JICovCi0JdWludDE2X3QgICAgYml0X3dpZHRoOwotCi0JLyoKLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMuCi0JICogQHZhbHVlcyAxIHRvICNBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQKLQkgKi8KLQl1aW50MTZfdCAgICBudW1fY2hhbm5lbHM7Ci0KLQkvKgotCSAqIERhdGEgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIHBvcnQuCi0JICogSWYgdGhlIHBvcnQgbWVkaWEgdHlwZSBhbmQgZGV2aWNlIG1lZGlhIHR5cGUgYXJlIGRpZmZlcmVudCwKLQkgKiBpdCBzaWduaWZpZXMgYSBlbmNvZGluZy9kZWNvZGluZyB1c2UgY2FzZQotCSAqIEB2YWx1ZXMKLQkgKiAjQUZFX1BPUlRfREFUQV9GT1JNQVRfUENNCi0JICogI0FGRV9QT1JUX0RBVEFfRk9STUFUX0dFTkVSSUNfQ09NUFJFU1NFRAotCSAqLwotCXVpbnQxNl90ICAgZGF0YV9mb3JtYXQ7Ci0KLQkvKlRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4qLwotCXVpbnQxNl90ICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi11bmlvbiBhZmVfZW5jX2NvbmZpZ19kYXRhIHsKLQlzdHJ1Y3QgYXNtX3NiY19lbmNfY2ZnX3Qgc2JjX2NvbmZpZzsKLQlzdHJ1Y3QgYXNtX2FhY19lbmNfY2ZnX3YyX3QgYWFjX2NvbmZpZzsKLQlzdHJ1Y3QgYXNtX2N1c3RvbV9lbmNfY2ZnX2FwdHhfdCAgYXB0eF9jb25maWc7Ci19OwotCi1zdHJ1Y3QgYWZlX2VuY19jb25maWcgewotCXUzMiBmb3JtYXQ7Ci0JdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSBkYXRhOwotfTsKLQotc3RydWN0IGFmZV9lbmNfY2ZnX2Jsa19wYXJhbV90IHsKLQl1aW50MzJfdCBlbmNfY2ZnX2Jsa19zaXplOwotCS8qCi0JICpTaXplIG9mIHRoZSBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYmxvY2sgdGhhdCBmb2xsb3dzIHRoaXMgbWVtYmVyCi0JICovCi0JdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSBlbmNfYmxrX2NvbmZpZzsKLX07Ci0KLS8qCi0gKiBQYXlsb2FkIG9mIHRoZSBBVlNfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEIHBhcmFtZXRlci4KLSAqLwotc3RydWN0IGF2c19lbmNfcGFja2V0aXplcl9pZF9wYXJhbV90IHsKLQkvKgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogI0FWU19NT0RVTEVfSURfUEFDS0VUSVpFUl9DT1AKLQkgKiBBbnkgT3BlbkRTUCBzdXBwb3J0ZWQgdmFsdWVzCi0JICovCi0JdWludDMyX3QgZW5jX3BhY2tldGl6ZXJfaWQ7Ci19OwotCi11bmlvbiBhZmVfcG9ydF9jb25maWcgewotCXN0cnVjdCBhZmVfcGFyYW1faWRfcGNtX2NmZyAgICAgICAgICAgICAgIHBjbTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2kyc19jZmcgICAgICAgICAgICAgICBpMnM7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9oZG1pX211bHRpX2NoYW5fYXVkaW9fY2ZnIGhkbWlfbXVsdGlfY2g7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zbGltYnVzX2NmZyAgICAgICAgICAgc2xpbV9zY2g7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9ydF9wcm94eV9wb3J0X2NmZyAgICAgcnRwcm94eTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2ludGVybmFsX2J0X2ZtX2NmZyAgICBpbnRfYnRfZm07Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcgICAgICAgcHNldWRvX3BvcnQ7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZpY2VfaHdfZGVsYXlfY2ZnICAgaHdfZGVsYXk7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jZmcgICAgICAgICAgICAgc3BkaWY7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zZXRfdG9wb2xvZ3lfY2ZnICAgICAgdG9wb2xvZ3k7Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF90ZG1fY2ZnICAgICAgICAgICAgICAgdGRtOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfdXNiX2F1ZGlvX2NmZyAgICAgICAgIHVzYl9hdWRpbzsKLQlzdHJ1Y3QgYWZlX2VuY19mbXRfaWRfcGFyYW1fdCAgICAgICAgICAgICBlbmNfZm10OwotCXN0cnVjdCBhZmVfcG9ydF9tZWRpYV90eXBlX3QgICAgICAgICAgICAgIG1lZGlhX3R5cGU7Ci0Jc3RydWN0IGFmZV9lbmNfY2ZnX2Jsa19wYXJhbV90ICAgICAgICAgICAgZW5jX2Jsa19wYXJhbTsKLQlzdHJ1Y3QgYXZzX2VuY19wYWNrZXRpemVyX2lkX3BhcmFtX3QgICAgICBlbmNfcGt0X2lkX3BhcmFtOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kX25vX3BheWxvYWQgewotCXN0cnVjdCBhcHJfaGRyCQkJaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCWhkcjsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICBwZGF0YTsKLQl1bmlvbiBhZmVfcG9ydF9jb25maWcgICAgICAgICAgICBwb3J0OwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUIDB4MDAwMTAwRTUKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJULiovCi1zdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdGFydCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIHBvcnRfaWQ7Ci0vKiBQb3J0IGludGVyZmFjZSBhbmQgZGlyZWN0aW9uIChSeCBvciBUeCkgdG8gc3RhcnQuIEFuIGV2ZW4KLSAqIG51bWJlciByZXByZXNlbnRzIHRoZSBSeCBkaXJlY3Rpb24sIGFuZCBhbiBvZGQgbnVtYmVyIHJlcHJlc2VudHMKLSAqIHRoZSBUeCBkaXJlY3Rpb24uCi0gKi8KLQotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLiovCi0KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQ01EX0RFVklDRV9TVE9QICAweDAwMDEwMEU2Ci0KLS8qIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfREVWSUNFX1NUT1AuICovCi1zdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2ICAgICAgICAgICAgICAgICAgcG9ydF9pZDsKLS8qIFBvcnQgaW50ZXJmYWNlIGFuZCBkaXJlY3Rpb24gKFJ4IG9yIFR4KSB0byBzdGFydC4gQW4gZXZlbgotICogbnVtYmVyIHJlcHJlc2VudHMgdGhlIFJ4IGRpcmVjdGlvbiwgYW5kIGFuIG9kZCBudW1iZXIgcmVwcmVzZW50cwotICogdGhlIFR4IGRpcmVjdGlvbi4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLiovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIDB4MDAwMTAwRUEKLQotLyogIE1lbW9yeSBtYXAgcmVnaW9ucyBjb21tYW5kIHBheWxvYWQgdXNlZCBieSB0aGUKLSAqICNBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAuCi0gKiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgY2xpZW50cyB0byBtYXAgbXVsdGlwbGUgc2hhcmVkIG1lbW9yeQotICogcmVnaW9ucyBpbiBhIHNpbmdsZSBjb21tYW5kLiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlCi0gKiBudW1fcmVnaW9ucyBvZiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkLgotICovCi1zdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLXUxNiAgICAgICAgICAgICAgICAgIG1lbV9wb29sX2lkOwotLyogVHlwZSBvZiBtZW1vcnkgb24gd2hpY2ggdGhpcyBtZW1vcnkgcmVnaW9uIGlzIG1hcHBlZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBRFNQX01FTU9SWV9NQVBfRUJJX1BPT0wKLSAqIC0gI0FEU1BfTUVNT1JZX01BUF9TTUlfUE9PTAotICogLSAjQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MCi0gKiAtIE90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKLSAqCi0gKiBUaGUgbWVtb3J5IHBvb2wgSUQgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi0gKiBtZW1vcnkuIENoYXJhY3RlcmlzdGljcyBtYXkgaW5jbHVkZSBhbGlnbm1lbnQgdHlwZSwgcGVybWlzc2lvbnMsCi0gKiBldGMuCi0gKgotICogQURTUF9NRU1PUllfTUFQX0VCSV9QT09MIGlzIEV4dGVybmFsIEJ1ZmZlciBJbnRlcmZhY2UgdHlwZSBtZW1vcnkKLSAqIEFEU1BfTUVNT1JZX01BUF9TTUlfUE9PTCBpcyBTaGFyZWQgTWVtb3J5IEludGVyZmFjZSB0eXBlIG1lbW9yeQotICogQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MIGlzIHNoYXJlZCBtZW1vcnksIGJ5dGUKLSAqIGFkZHJlc3NhYmxlLCBhbmQgNCBLQiBhbGlnbmVkLgotICovCi0KLQotCXUxNiAgICAgICAgICAgICAgICAgIG51bV9yZWdpb25zOwotLyogTnVtYmVyIG9mIHJlZ2lvbnMgdG8gbWFwLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZsYWc7Ci0vKiBDb25maWd1cmVzIG9uZSBjb21tb24gcHJvcGVydHkgZm9yIGFsbCB0aGUgcmVnaW9ucyBpbiB0aGUKLSAqIHBheWxvYWQuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlczogLSAweDAwMDAwMDAwIHRvIDB4MDAwMDAwMDEKLSAqCi0gKiBiMCAtIGJpdCAwIGluZGljYXRlcyBwaHlzaWNhbCBvciB2aXJ0dWFsIG1hcHBpbmcgMCBTaGFyZWQgbWVtb3J5Ci0gKiBhZGRyZXNzIHByb3ZpZGVkIGluIGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWRpcyBhCi0gKiBwaHlzaWNhbCBhZGRyZXNzLiBUaGUgc2hhcmVkIG1lbW9yeSBuZWVkcyB0byBiZSBtYXBwZWQoIGhhcmR3YXJlCi0gKiBUTEIgZW50cnkpIGFuZCBhIHNvZnR3YXJlIGVudHJ5IG5lZWRzIHRvIGJlIGFkZGVkIGZvciBpbnRlcm5hbAotICogYm9vayBrZWVwaW5nLgotICoKLSAqIDEgU2hhcmVkIG1lbW9yeSBhZGRyZXNzIHByb3ZpZGVkIGluCi0gKiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkaXMgYSB2aXJ0dWFsIGFkZHJlc3MuIFRoZQotICogc2hhcmVkIG1lbW9yeSBtdXN0IG5vdCBiZSBtYXBwZWQgKHNpbmNlIGhhcmR3YXJlIFRMQiBlbnRyeSBpcwotICogYWxyZWFkeSBhdmFpbGFibGUpIGJ1dCBhIHNvZnR3YXJlIGVudHJ5IG5lZWRzIHRvIGJlIGFkZGVkIGZvcgotICogaW50ZXJuYWwgYm9vayBrZWVwaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgdHdvIHNlcnZpY2VzIHdpdGggaW4KLSAqIEFEU1AgaXMgY29tbXVuaWNhdGluZyB2aWEgQVBSLiBUaGV5IGNhbiBub3cgZGlyZWN0bHkgY29tbXVuaWNhdGUKLSAqIHZpYSB0aGUgVmlydHVhbCBhZGRyZXNzIGluc3RlYWQgb2YgUGh5c2ljYWwgYWRkcmVzcy4gVGhlIHZpcnR1YWwKLSAqIHJlZ2lvbnMgbXVzdCBiZSBjb250aWd1b3VzLiBudW1fcmVnaW9ucyBtdXN0IGJlIDEgaW4gdGhpcyBjYXNlLgotICoKLSAqIGIzMS1iMSAtIHJlc2VydmVkIGJpdHMuIG11c3QgYmUgc2V0IHRvIHplcm8KLSAqLwotCi0KLX0gX19wYWNrZWQ7Ci0vKiAgTWFwIHJlZ2lvbiBwYXlsb2FkIHVzZWQgYnkgdGhlCi0gKiBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2Fkc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgYWZlX3NlcnZpY2Vfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCB7Ci0JdTMyICAgICAgICAgICAgICAgICAgc2htX2FkZHJfbHN3OwotLyogbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCBvZiBzdGFydGluZyBhZGRyZXNzIGluIHRoZSBtZW1vcnkKLSAqIHJlZ2lvbiB0byBtYXAuIEl0IG11c3QgYmUgY29udGlndW91cyBtZW1vcnksIGFuZCBpdCBtdXN0IGJlIDQgS0IKLSAqIGFsaWduZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIEFueSAzMiBiaXQgdmFsdWUKLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzaG1fYWRkcl9tc3c7Ci0vKiBtb3N0IHNpZ25pZmljYW50IHdvcmQgb2Ygc3RhcnRuZyBhZGRyZXNzIGluIHRoZSBtZW1vcnkgcmVnaW9uCi0gKiB0byBtYXAuIEZvciAzMiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0Ci0gKiB0byB6ZXJvLiBGb3IgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0MzEgdG8gYml0IDQgbXVzdCBiZQotICogc2V0IHRvIHplcm8KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIEZvciAzMiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCB0aGlzIGZpZWxkCi0gKiBtdXN0IGJlIHNldCB0byB6ZXJvLiAtIEZvciAzNiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQzMSB0bwotICogYml0IDQgbXVzdCBiZSBzZXQgdG8gemVybyAtIEZvciA2NCBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBhbnkKLSAqIDMyIGJpdCB2YWx1ZQotICovCi0KLQotCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9zaXplX2J5dGVzOwotLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZWdpb24uIFRoZSBhRFNQIHdpbGwgYWx3YXlzIG1hcCB0aGUKLSAqIHJlZ2lvbnMgYXMgdmlydHVhbCBjb250aWd1b3VzIG1lbW9yeSwgYnV0IHRoZSBtZW1vcnkgc2l6ZSBtdXN0IGJlCi0gKiBpbiBtdWx0aXBsZXMgb2YgNCBLQiB0byBhdm9pZCBnYXBzIGluIHRoZSB2aXJ0dWFsbHkgY29udGlndW91cwotICogbWFwcGVkIG1lbW9yeS4KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIG11bHRpcGxlcyBvZiA0S0IKLSAqLwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TIDB4MDAwMTAwRUIKLXN0cnVjdCBhZmVfc2VydmljZV9jbWRyc3Bfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyB7Ci0JdTMyICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci0vKiBBIG1lbW9yeSBtYXAgaGFuZGxlIGVuY2Fwc3VsYXRpbmcgc2hhcmVkIG1lbW9yeSBhdHRyaWJ1dGVzIGlzCi0gKiByZXR1cm5lZCBpZmYgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZCBpcwotICogc3VjY2Vzc2Z1bC4gSW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSAsIGEgZ2VuZXJpYyBBUFIgZXJyb3IgcmVzcG9uc2UKLSAqIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi0gKgotICogU3VwcG9ydGVkIFZhbHVlczogLSBBbnkgMzIgYml0IHZhbHVlCi0gKi8KLQotfSBfX3BhY2tlZDsKLSNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUyAweDAwMDEwMEVDCi0vKiBNZW1vcnkgdW5tYXAgcmVnaW9ucyBjb21tYW5kIHBheWxvYWQgdXNlZCBieSB0aGUKLSAqICNBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIGNsaWVudHMgdG8gdW5tYXAgbXVsdGlwbGUgc2hhcmVkIG1lbW9yeQotICogcmVnaW9ucyBpbiBhIHNpbmdsZSBjb21tYW5kLgotICovCi0KLQotc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkKLSAqIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGNvbW1hbmRzCi0gKgotICogU3VwcG9ydGVkIFZhbHVlczoKLSAqIC0gQW55IDMyIGJpdCB2YWx1ZQotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyIDB4MDAwMTAwRjAKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyIGNvbW1hbmQsCi0gKiB3aGljaCBxdWVyaWVzIGZvciBvbmUgcG9zdC9wcmVwcm9jZXNzaW5nIHBhcmFtZXRlciBvZiBhCi0gKiBzdHJlYW0uCi0gKi8KLXN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyIHsKLQl1MTYgcG9ydF9pZDsKLS8qIFBvcnQgaW50ZXJmYWNlIGFuZCBkaXJlY3Rpb24gKFJ4IG9yIFR4KSB0byBzdGFydC4gKi8KLQotCXUxNiBwYXlsb2FkX3NpemU7Ci0vKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIElEL21vZHVsZSBJRCBjb21iaW5hdGlvbi4KLSAqIFRoaXMgaXMgYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA+IDAKLSAqLwotCi0JdTMyIHBheWxvYWRfYWRkcmVzc19sc3c7Ci0vKiBMU1cgb2YgNjQgYml0IFBheWxvYWQgYWRkcmVzcy4gQWRkcmVzcyBzaG91bGQgYmUgMzItYnl0ZSwKLSAqIDRrYnl0ZSBhbGlnbmVkIGFuZCBtdXN0IGJlIGNvbnRpZyBtZW1vcnkuCi0gKi8KLQotCi0JdTMyIHBheWxvYWRfYWRkcmVzc19tc3c7Ci0vKiBNU1cgb2YgNjQgYml0IFBheWxvYWQgYWRkcmVzcy4gSW4gY2FzZSBvZiAzMi1iaXQgc2hhcmVkCi0gKiBtZW1vcnkgYWRkcmVzcywgdGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiBJbiBjYXNlIG9mIDM2LWJpdAotICogc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQtNCB0byBiaXQtMzEgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAqIEFkZHJlc3Mgc2hvdWxkIGJlIDMyLWJ5dGUsIDRrYnl0ZSBhbGlnbmVkIGFuZCBtdXN0IGJlIGNvbnRpZ3VvdXMKLSAqIG1lbW9yeS4KLSAqLwotCi0JdTMyIG1lbV9tYXBfaGFuZGxlOwotLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkKLSAqIEFGRV9TRVJWSUNFX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGNvbW1hbmRzLgotICogU3VwcG9ydGVkIFZhbHVlczogLSBOVUxMIC0tIE1lc3NhZ2UuIFRoZSBwYXJhbWV0ZXIgZGF0YSBpcwotICogaW4tYmFuZC4gLSBOb24tTlVMTCAtLSBUaGUgcGFyYW1ldGVyIGRhdGEgaXMgT3V0LWJhbmQuUG9pbnRlciB0bwotICogLSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiBzaGFyZWQgbWVtb3J5IG9mIHRoZSBwYXlsb2FkIGRhdGEuCi0gKiBGb3IgZGV0YWlsZWQgcGF5bG9hZCBjb250ZW50LCBzZWUgdGhlIGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIKLSAqIHN0cnVjdHVyZQotICovCi0KLQotCXUzMiBtb2R1bGVfaWQ7Ci0vKiBJRCBvZiB0aGUgbW9kdWxlIHRvIGJlIHF1ZXJpZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBWYWxpZCBtb2R1bGUgSUQKLSAqLwotCi0JdTMyIHBhcmFtX2lkOwotLyogSUQgb2YgdGhlIHBhcmFtZXRlciB0byBiZSBxdWVyaWVkLgotICogU3VwcG9ydGVkIHZhbHVlczogVmFsaWQgcGFyYW1ldGVyIElECi0gKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQ01EUlNQX0dFVF9QQVJBTV9WMiAweDAwMDEwMTA2Ci0KLS8qIFBheWxvYWQgb2YgdGhlICNBRkVfUE9SVF9DTURSU1BfR0VUX1BBUkFNX1YyIG1lc3NhZ2UsIHdoaWNoCi0gKiByZXNwb25kcyB0byBhbiAjQUZFX1BPUlRfQ01EX0dFVF9QQVJBTV9WMiBjb21tYW5kLgotICoKLSAqIEltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIHN0cnVjdHVyZSBpcyB0aGUgcGFyYW1ldGVycyBzdHJ1Y3R1cmUKLSAqIChhZmVfcG9ydF9wYXJhbV9kYXRhKSBjb250YWluaW5nIHRoZSByZXNwb25zZShhY2tub3dsZWRnbWVudCkKLSAqIHBhcmFtZXRlciBwYXlsb2FkLiBUaGlzIHBheWxvYWQgaXMgaW5jbHVkZWQgZm9yIGFuIGluLWJhbmQKLSAqIHNjZW5hcmlvLiBGb3IgYW4gYWRkcmVzcy9zaGFyZWQgbWVtb3J5LWJhc2VkIHNldCBwYXJhbWV0ZXIsIHRoaXMKLSAqIHBheWxvYWQgaXMgbm90IG5lZWRlZC4KLSAqLwotCi0KLXN0cnVjdCBhZmVfcG9ydF9jbWRyc3BfZ2V0X3BhcmFtX3YyIHsKLQl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9MUEFTU19DT1JFX1NIQVJFRF9DTE9DS19DT05GSUcJMHgwMDAxMDI4QwotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fTFBBU1NfQ09SRV9TSEFSRURfQ0xLX0NPTkZJRwkweDEKLQotLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX0xQQVNTX0NPUkVfU0hBUkVEX0NMT0NLX0NPTkZJRyBwYXJhbWV0ZXIgdXNlZCBieQotICogQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFLgotICovCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jZmcgewotCXUzMglscGFzc19jb3JlX3NoYXJlZF9jbGtfY2ZnX21pbm9yX3ZlcnNpb247Ci0vKgotICogTWlub3IgdmVyc2lvbiB1c2VkIGZvciBscGFzcyBjb3JlIHNoYXJlZCBjbG9jayBjb25maWd1cmF0aW9uCi0gKiBTdXBwb3J0ZWQgdmFsdWU6IEFGRV9BUElfVkVSU0lPTl9MUEFTU19DT1JFX1NIQVJFRF9DTEtfQ09ORklHCi0gKi8KLQl1MzIJZW5hYmxlOwotLyoKLSAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBscGFzcyBjb3JlIHNoYXJlZCBjbG9jayBpcwotICogZW5hYmxlZCAoMSkgb3IgZGlzYWJsZWQgKDApLgotICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jb25maWdfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIJCSAgIGhkcjsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiAgICBwZGF0YTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jZmcgY2xrX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLS8qIGFkc3BfYWZlX3NlcnZpY2VfY29tbWFuZHMuaCAqLwotCi0jZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9FQklfUE9PTCAgICAgIDAKLQotI2RlZmluZSBBRFNQX01FTU9SWV9NQVBfU01JX1BPT0wgICAgICAxCi0jZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9JTUVNX1BPT0wgICAgICAyCi0jZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9TSE1FTThfNEtfUE9PTCAgICAgIDMKLQotLyogRGVmaW5pdGlvbiBvZiB2aXJ0dWFsIG1lbW9yeSBmbGFnICovCi0jZGVmaW5lIEFEU1BfTUVNT1JZX01BUF9WSVJUVUFMX01FTU9SWSAxCi0KLS8qIERlZmluaXRpb24gb2YgcGh5c2ljYWwgbWVtb3J5IGZsYWcgKi8KLSNkZWZpbmUgQURTUF9NRU1PUllfTUFQX1BIWVNJQ0FMX01FTU9SWSAwCi0KLSNkZWZpbmUgTlVMTF9QT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBDNjgKLSNkZWZpbmUgTlVMTF9DT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTAzMTIKLSNkZWZpbmUgREVGQVVMVF9DT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTAzMTQKLSNkZWZpbmUgREVGQVVMVF9QT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBCRTQKLSNkZWZpbmUgQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9ERUZBVUxUX1RPUE9MT0dZICAgICAgICAgMHgwMDAxMDc2QgotI2RlZmluZSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX05PTkVfVE9QT0xPR1kgICAgICAgICAgICAweDAwMDEwNzc0Ci0jZGVmaW5lIFZQTV9UWF9TTV9FQ05TX1YyX0NPUFBfVE9QT0xPR1kJCQkweDAwMDEwRjg5Ci0jZGVmaW5lIFZQTV9UWF9ETV9GTFVFTkNFX0NPUFBfVE9QT0xPR1kJCQkweDAwMDEwRjcyCi0jZGVmaW5lIFZQTV9UWF9RTUlDX0ZMVUVOQ0VfQ09QUF9UT1BPTE9HWQkJMHgwMDAxMEY3NQotI2RlZmluZSBWUE1fVFhfRE1fUkZFQ05TX0NPUFBfVE9QT0xPR1kJCQkweDAwMDEwRjg2Ci0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0RUU19IUFgJCTB4MTAwMTUwMDIKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5fVE9QT0xPR1lfSURfQVVESU9TUEhFUkUJMHgxMDAyODAwMAotCi0vKiBNZW1vcnkgbWFwIHJlZ2lvbnMgY29tbWFuZCBwYXlsb2FkIHVzZWQgYnkgdGhlCi0gKiAjQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TICwjQURNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCi0gKiBjb21tYW5kcy4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBhbGxvd3MgY2xpZW50cyB0byBtYXAgbXVsdGlwbGUgc2hhcmVkIG1lbW9yeQotICogcmVnaW9ucyBpbiBhIHNpbmdsZSBjb21tYW5kLiBGb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgYXJlCi0gKiBudW1fcmVnaW9ucyBvZiBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZC4KLSAqLwotCi0KLXN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgICAgICAgICAgICAgICAgICBtZW1fcG9vbF9pZDsKLS8qIFR5cGUgb2YgbWVtb3J5IG9uIHdoaWNoIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyBtYXBwZWQuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlczogLSAjQURTUF9NRU1PUllfTUFQX0VCSV9QT09MIC0KLSAqICNBRFNQX01FTU9SWV9NQVBfU01JX1BPT0wgLSAjQURTUF9NRU1PUllfTUFQX0lNRU1fUE9PTAotICogKHVuc3VwcG9ydGVkKSAtICNBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0wgLSBPdGhlciB2YWx1ZXMKLSAqIGFyZSByZXNlcnZlZAotICoKLSAqIFRoZSBtZW1vcnkgSUQgaW1wbGljaXRseSBkZWZpbmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi0gKiBtZW1vcnkuIENoYXJhY3RlcmlzdGljcyBtYXkgaW5jbHVkZSBhbGlnbm1lbnQgdHlwZSwgcGVybWlzc2lvbnMsCi0gKiBldGMuCi0gKgotICogU0hNRU04XzRLIGlzIHNoYXJlZCBtZW1vcnksIGJ5dGUgYWRkcmVzc2FibGUsIGFuZCA0IEtCIGFsaWduZWQuCi0gKi8KLQotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX3JlZ2lvbnM7Ci0JLyogTnVtYmVyIG9mIHJlZ2lvbnMgdG8gbWFwLiovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9mbGFnOwotLyogQ29uZmlndXJlcyBvbmUgY29tbW9uIHByb3BlcnR5IGZvciBhbGwgdGhlIHJlZ2lvbnMgaW4gdGhlCi0gKiBwYXlsb2FkLiBObyB0d28gcmVnaW9ucyBpbiB0aGUgc2FtZSBtZW1vcnkgbWFwIHJlZ2lvbnMgY21kIGNhbgotICogaGF2ZSBkaWZmZXJudCBwcm9wZXJ0eS4gU3VwcG9ydGVkIHZhbHVlczogLSAweDAwMDAwMDAwIHRvCi0gKiAweDAwMDAwMDAxCi0gKgotICogYjAgLSBiaXQgMCBpbmRpY2F0ZXMgcGh5c2ljYWwgb3IgdmlydHVhbCBtYXBwaW5nIDAgc2hhcmVkIG1lbW9yeQotICogYWRkcmVzcyBwcm92aWRlZCBpbiBhdnNfc2hhcmVkX21hcF9yZWdpb25zX3BheWxvYWQgaXMgcGh5c2ljYWwKLSAqIGFkZHJlc3MuIFRoZSBzaGFyZWQgbWVtb3J5IG5lZWRzIHRvIGJlIG1hcHBlZCggaGFyZHdhcmUgVExCCi0gKiBlbnRyeSkKLSAqCi0gKiBhbmQgYSBzb2Z0d2FyZSBlbnRyeSBuZWVkcyB0byBiZSBhZGRlZCBmb3IgaW50ZXJuYWwgYm9vayBrZWVwaW5nLgotICoKLSAqIDEgU2hhcmVkIG1lbW9yeSBhZGRyZXNzIHByb3ZpZGVkIGluIE1heVBheWxvYWRbdXNSZWdpb25zXSBpcwotICogdmlydHVhbCBhZGRyZXNzLiBUaGUgc2hhcmVkIG1lbW9yeSBtdXN0IG5vdCBiZSBtYXBwZWQgKHNpbmNlCi0gKiBoYXJkd2FyZSBUTEIgZW50cnkgaXMgYWxyZWFkeSBhdmFpbGFibGUpIGJ1dCBhIHNvZnR3YXJlIGVudHJ5Ci0gKiBuZWVkcyB0byBiZSBhZGRlZCBmb3IgaW50ZXJuYWwgYm9vayBrZWVwaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWwKLSAqIGlmIHR3byBzZXJ2aWNlcyB3aXRoIGluIEFEU1AgaXMgY29tbXVuaWNhdGluZyB2aWEgQVBSLiBUaGV5IGNhbgotICogbm93IGRpcmVjdGx5IGNvbW11bmljYXRlIHZpYSB0aGUgVmlydHVhbCBhZGRyZXNzIGluc3RlYWQgb2YKLSAqIFBoeXNpY2FsIGFkZHJlc3MuIFRoZSB2aXJ0dWFsIHJlZ2lvbnMgbXVzdCBiZSBjb250aWd1b3VzLgotICoKLSAqIGIzMS1iMSAtIHJlc2VydmVkIGJpdHMuIG11c3QgYmUgc2V0IHRvIHplcm8KLSAqLwotCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgewotCXUzMiAgICAgICAgICAgICAgICAgIHNobV9hZGRyX2xzdzsKLS8qIGxlYXN0IHNpZ25pZmljYW50IHdvcmQgb2Ygc2hhcmVkIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKLSAqIHJlZ2lvbiB0byBtYXAuIEl0IG11c3QgYmUgY29udGlndW91cyBtZW1vcnksIGFuZCBpdCBtdXN0IGJlIDQgS0IKLSAqIGFsaWduZWQuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHNobV9hZGRyX21zdzsKLS8qIG1vc3Qgc2lnbmlmaWNhbnQgd29yZCBvZiBzaGFyZWQgbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotICogcmVnaW9uIHRvIG1hcC4gRm9yIDMyIGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIHRoaXMgZmllbGQgbXVzdAotICogdGJlIHNldCB0byB6ZXJvLiBGb3IgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0MzEgdG8gYml0IDQKLSAqIG11c3QgYmUgc2V0IHRvIHplcm8KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgbWVtX3NpemVfYnl0ZXM7Ci0vKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlZ2lvbi4KLSAqCi0gKiBUaGUgYURTUCB3aWxsIGFsd2F5cyBtYXAgdGhlIHJlZ2lvbnMgYXMgdmlydHVhbCBjb250aWd1b3VzCi0gKiBtZW1vcnksIGJ1dCB0aGUgbWVtb3J5IHNpemUgbXVzdCBiZSBpbiBtdWx0aXBsZXMgb2YgNCBLQiB0byBhdm9pZAotICogZ2FwcyBpbiB0aGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWFwcGVkIG1lbW9yeS4KLSAqLwotCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyICAgICAgIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLS8qIG1lbW9yeSBtYXAgaGFuZGxlIHJldHVybmVkIGJ5IEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUwotICogLCBBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMsIGNvbW1hbmRzCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotLyogTWVtb3J5IG1hcCBjb21tYW5kIHJlc3BvbnNlIHBheWxvYWQgdXNlZCBieSB0aGUKLSAqICNBU01fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMKLSAqICwjQURNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TCi0gKi8KLQotCi1zdHJ1Y3QgYXZzX2NtZHJzcF9zaGFyZWRfbWVtX21hcF9yZWdpb25zIHsKLQl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLS8qIEEgbWVtb3J5IG1hcCBoYW5kbGUgZW5jYXBzdWxhdGluZyBzaGFyZWQgbWVtb3J5IGF0dHJpYnV0ZXMgaXMKLSAqIHJldHVybmVkCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotLyphZHNwX2F1ZGlvX21lbW1hcF9hcGkuaCovCi0KLS8qIEFTTSByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyAqLwotc3RydWN0IGFzbV93bWFfY2ZnIHsKLQl1MTYgZm9ybWF0X3RhZzsKLQl1MTYgY2hfY2ZnOwotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MzIgYXZnX2J5dGVzX3Blcl9zZWM7Ci0JdTE2IGJsb2NrX2FsaWduOwotCXUxNiB2YWxpZF9iaXRzX3Blcl9zYW1wbGU7Ci0JdTMyIGNoX21hc2s7Ci0JdTE2IGVuY29kZV9vcHQ7Ci0JdTE2IGFkdl9lbmNvZGVfb3B0OwotCXUzMiBhZHZfZW5jb2RlX29wdDI7Ci0JdTMyIGRyY19wZWFrX3JlZjsKLQl1MzIgZHJjX3BlYWtfdGFyZ2V0OwotCXUzMiBkcmNfYXZlX3JlZjsKLQl1MzIgZHJjX2F2ZV90YXJnZXQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX3dtYXByb19jZmcgewotCXUxNiBmb3JtYXRfdGFnOwotCXUxNiBjaF9jZmc7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBhdmdfYnl0ZXNfcGVyX3NlYzsKLQl1MTYgYmxvY2tfYWxpZ247Ci0JdTE2IHZhbGlkX2JpdHNfcGVyX3NhbXBsZTsKLQl1MzIgY2hfbWFzazsKLQl1MTYgZW5jb2RlX29wdDsKLQl1MTYgYWR2X2VuY29kZV9vcHQ7Ci0JdTMyIGFkdl9lbmNvZGVfb3B0MjsKLQl1MzIgZHJjX3BlYWtfcmVmOwotCXUzMiBkcmNfcGVha190YXJnZXQ7Ci0JdTMyIGRyY19hdmVfcmVmOwotCXUzMiBkcmNfYXZlX3RhcmdldDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fYWFjX2NmZyB7Ci0JdTE2IGZvcm1hdDsKLQl1MTYgYW90OwotCXUxNiBlcF9jb25maWc7Ci0JdTE2IHNlY3Rpb25fZGF0YV9yZXNpbGllbmNlOwotCXUxNiBzY2FsZWZhY3Rvcl9kYXRhX3Jlc2lsaWVuY2U7Ci0JdTE2IHNwZWN0cmFsX2RhdGFfcmVzaWxpZW5jZTsKLQl1MTYgY2hfY2ZnOwotCXUxNiByZXNlcnZlZDsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX2FtcndicGx1c19jZmcgewotCXUzMiAgc2l6ZV9ieXRlczsKLQl1MzIgIHZlcnNpb247Ci0JdTMyICBudW1fY2hhbm5lbHM7Ci0JdTMyICBhbXJfYmFuZF9tb2RlOwotCXUzMiAgYW1yX2R0eF9tb2RlOwotCXUzMiAgYW1yX2ZyYW1lX2ZtdDsKLQl1MzIgIGFtcl9sc2ZfaWR4OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9mbGFjX2NmZyB7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBleHRfc2FtcGxlX3JhdGU7Ci0JdTMyIG1pbl9mcmFtZV9zaXplOwotCXUzMiBtYXhfZnJhbWVfc2l6ZTsKLQl1MTYgc3RyZWFtX2luZm9fcHJlc2VudDsKLQl1MTYgbWluX2Jsa19zaXplOwotCXUxNiBtYXhfYmxrX3NpemU7Ci0JdTE2IGNoX2NmZzsKLQl1MTYgc2FtcGxlX3NpemU7Ci0JdTE2IG1kNV9zdW07Ci19OwotCi1zdHJ1Y3QgYXNtX2FsYWNfY2ZnIHsKLQl1MzIgZnJhbWVfbGVuZ3RoOwotCXU4IGNvbXBhdGlibGVfdmVyc2lvbjsKLQl1OCBiaXRfZGVwdGg7Ci0JdTggcGI7Ci0JdTggbWI7Ci0JdTgga2I7Ci0JdTggbnVtX2NoYW5uZWxzOwotCXUxNiBtYXhfcnVuOwotCXUzMiBtYXhfZnJhbWVfYnl0ZXM7Ci0JdTMyIGF2Z19iaXRfcmF0ZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGNoYW5uZWxfbGF5b3V0X3RhZzsKLX07Ci0KLXN0cnVjdCBhc21fZzcxMV9kZWNfY2ZnIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXNtX3ZvcmJpc19jZmcgewotCXUzMiBiaXRfc3RyZWFtX2ZtdDsKLX07Ci0KLXN0cnVjdCBhc21fYXBlX2NmZyB7Ci0JdTE2IGNvbXBhdGlibGVfdmVyc2lvbjsKLQl1MTYgY29tcHJlc3Npb25fbGV2ZWw7Ci0JdTMyIGZvcm1hdF9mbGFnczsKLQl1MzIgYmxvY2tzX3Blcl9mcmFtZTsKLQl1MzIgZmluYWxfZnJhbWVfYmxvY2tzOwotCXUzMiB0b3RhbF9mcmFtZXM7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MTYgbnVtX2NoYW5uZWxzOwotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MzIgc2Vla190YWJsZV9wcmVzZW50OwotfTsKLQotc3RydWN0IGFzbV9kc2RfY2ZnIHsKLQl1MTYgbnVtX3ZlcnNpb247Ci0JdTE2IGlzX2JpdHdpc2VfYmlnX2VuZGlhbjsKLQl1MTYgZHNkX2NoYW5uZWxfYmxvY2tfc2l6ZTsKLQl1MTYgbnVtX2NoYW5uZWxzOwotCXU4ICBjaGFubmVsX21hcHBpbmdbOF07Ci0JdTMyIGRzZF9kYXRhX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgewotCXUzMiBlbmFibGU7Ci0JdTMyIHBlcmlvZDsKLQl1MzIgc3RlcDsKLQl1MzIgcmFtcGluZ2N1cnZlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyB7Ci0JdTMyIHBlcmlvZDsKLQl1MzIgc3RlcDsKLQl1MzIgcmFtcGluZ2N1cnZlOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fRU5EX1BPSU5UX0RFVklDRV9NQVRSSVggICAgIDAKLQotI2RlZmluZSBQQ01fQ0hBTk5FTF9OVUxMIDAKLQotLyogRnJvbnQgbGVmdCBjaGFubmVsLiAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTF9GTCAgICAxCi0KLS8qIEZyb250IHJpZ2h0IGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0ZSICAgIDIKLQotLyogRnJvbnQgY2VudGVyIGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0ZDICAgIDMKLQotLyogTGVmdCBzdXJyb3VuZCBjaGFubmVsLiovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0xTICAgNAotCi0vKiBSaWdodCBzdXJyb3VuZCBjaGFubmVsLiovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX1JTICAgNQotCi0vKiBMb3cgZnJlcXVlbmN5IGVmZmVjdCBjaGFubmVsLiAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTF9MRkUgIDYKLQotLyogQ2VudGVyIHN1cnJvdW5kIGNoYW5uZWw7IFJlYXIgY2VudGVyIGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0NTICAgNwotCi0vKiBMZWZ0IGJhY2sgY2hhbm5lbDsgUmVhciBsZWZ0IGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0xCICAgOAotCi0vKiBSaWdodCBiYWNrIGNoYW5uZWw7IFJlYXIgcmlnaHQgY2hhbm5lbC4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfUkIgICA5Ci0KLS8qIFRvcCBzdXJyb3VuZCBjaGFubmVsLiAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTFMgICAxMAotCi0vKiBDZW50ZXIgdmVydGljYWwgaGVpZ2h0IGNoYW5uZWwuKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfQ1ZIICAxMQotCi0vKiBNb25vIHN1cnJvdW5kIGNoYW5uZWwuKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfTVMgICAxMgotCi0vKiBGcm9udCBsZWZ0IG9mIGNlbnRlci4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfRkxDICAxMwotCi0vKiBGcm9udCByaWdodCBvZiBjZW50ZXIuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0ZSQyAgMTQKLQotLyogUmVhciBsZWZ0IG9mIGNlbnRlci4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfUkxDICAxNQotCi0vKiBSZWFyIHJpZ2h0IG9mIGNlbnRlci4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfUlJDICAxNgotCi0jZGVmaW5lIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMICA4Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMiAweDAwMDEwREE1Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMyAweDAwMDEwRERDCi0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WNCAweDAwMDEzMjBDCi0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9FVlJDQl9GUyAweDAwMDEwQkVGCi0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9FVlJDV0JfRlMgMHgwMDAxMEJGMAotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfR0VORVJJQ19DT01QUkVTU0VEICAweDAwMDEzMjEyCi0KLSNkZWZpbmUgQVNNX01BWF9FUV9CQU5EUyAxMgotCi0jZGVmaW5lIEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyIDB4MDAwMTBEOTgKLQotc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIHsKLXUzMiAgICAgICAgICAgICAgICAgICAgZm10X2Jsa19zaXplOwotCS8qIE1lZGlhIGZvcm1hdCBibG9jayBzaXplIGluIGJ5dGVzLiovCi19ICBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9nZW5lcmljX2NvbXByZXNzZWRfZm10X2Jsa190IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdF9ibGs7Ci0KLQkvKgotCSAqIENoYW5uZWwgbWFwcGluZyBhcnJheSBvZiBiaXRzdHJlYW0gb3V0cHV0LgotCSAqIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbCBpIGluc2lkZSB0aGUgYnVmZmVyLCB3aGVyZQotCSAqIGkgPCBudW1fY2hhbm5lbHMuIEFsbCB2YWxpZCB1c2VkIGNoYW5uZWxzIG11c3QgYmUKLQkgKiBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgotCSAqLwotCXVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nWzhdOwotCi0JLyoKLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGluY29taW5nIGJpdHN0cmVhbS4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxLDIsMyw0LDUsNiw3LDgKLQkgKi8KLQl1aW50MTZfdCBudW1fY2hhbm5lbHM7Ci0KLQkvKgotCSAqIE5vbWluYWwgYml0cyBwZXIgc2FtcGxlIHZhbHVlIG9mIHRoZSBpbmNvbWluZyBiaXRzdHJlYW0uCi0JICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDMyCi0JICovCi0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlOwotCi0JLyoKLQkgKiBOb21pbmFsIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGluY29taW5nIGJpdHN0cmVhbS4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOiA4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsCi0JICogICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwLAotCSAqICAgICAgICAgICAgICAgICAgIDM1MjgwMCwgMzg0MDAwCi0JICovCi0JdWludDMyX3Qgc2FtcGxpbmdfcmF0ZTsKLQotfSBfX3BhY2tlZDsKLQotCi0vKiBDb21tYW5kIHRvIHNlbmQgc2FtcGxlIHJhdGUgJiBjaGFubmVscyBmb3IgSUVDNjE5MzcgKGNvbXByZXNzZWQpIG9yIElFQzYwOTU4Ci0gKiAocGNtKSBzdHJlYW1zLiBCb3RoIGF1ZGlvIHN0YW5kYXJkcyB1c2UgdGhlIHNhbWUgZm9ybWF0IGFuZCBhcmUgdXNlZCBmb3IKLSAqIEhETUkgb3IgU1BESUYuCi0gKi8KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX0lFQ182MDk1OF9NRURJQV9GTVQgICAgICAgIDB4MDAwMTMyMUUKLQotc3RydWN0IGFzbV9pZWNfY29tcHJlc3NlZF9mbXRfYmxrX3QgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQotCS8qCi0JICogTm9taW5hbCBzYW1wbGluZyByYXRlIG9mIHRoZSBpbmNvbWluZyBiaXRzdHJlYW0uCi0JICogU3VwcG9ydGVkIHZhbHVlczogODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLAotCSAqICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwKLQkgKiAgICAgICAgICAgICAgICAgICAzNTI4MDAsIDM4NDAwMAotCSAqLwotCXVpbnQzMl90IHNhbXBsaW5nX3JhdGU7Ci0KLQkvKgotCSAqIE51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgaW5jb21pbmcgYml0c3RyZWFtLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEsMiwzLDQsNSw2LDcsOAotCSAqLwotCXVpbnQzMl90IG51bV9jaGFubmVsczsKLQotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdF9ibGs7Ci0KLQl1MTYgIG51bV9jaGFubmVsczsKLQkvKiBOdW1iZXIgb2YgY2hhbm5lbHMuIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOCAqLwotCXUxNiAgYml0c19wZXJfc2FtcGxlOwotLyogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwZXIgY2hhbm5lbC4gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogMTYsIDI0ICogV2hlbiB1c2VkIGZvciBwbGF5YmFjaywgdGhlIGNsaWVudCBtdXN0IHNlbmQgMjQtYml0Ci0gKiBzYW1wbGVzIHBhY2tlZCBpbiAzMi1iaXQgd29yZHMuIFRoZSAyNC1iaXQgc2FtcGxlcyBtdXN0IGJlIHBsYWNlZAotICogaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMjQgYml0cyBvZiB0aGUgMzItYml0IHdvcmQuIFdoZW4gdXNlZCBmb3IKLSAqIHJlY29yZGluZywgdGhlIGFEU1Agc2VuZHMgMjQtYml0IHNhbXBsZXMgcGFja2VkIGluIDMyLWJpdCB3b3Jkcy4KLSAqIFRoZSAyNC1iaXQgc2FtcGxlcyBhcmUgcGxhY2VkIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IDI0IGJpdHMgb2YKLSAqIHRoZSAzMi1iaXQgd29yZC4KLSAqLwotCi0KLQl1MzIgIHNhbXBsZV9yYXRlOwotLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCAoaW4gSGVydHopLgotICogU3VwcG9ydGVkIHZhbHVlczogMjAwMCB0byA0ODAwMAotICovCi0KLQl1MTYgIGlzX3NpZ25lZDsKLQkvKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBzYW1wbGVzIGFyZSBzaWduZWQgKDEpLiAqLwotCi0JdTE2ICByZXNlcnZlZDsKLQkvKiByZXNlcnZlZCBmaWVsZCBmb3IgMzIgYml0IGFsaWdubWVudC4gbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLQotCXU4ICAgY2hhbm5lbF9tYXBwaW5nWzhdOwotLyogQ2hhbm5lbCBhcnJheSBvZiBzaXplIDguCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjUENNX0NIQU5ORUxfTAotICogLSAjUENNX0NIQU5ORUxfUgotICogLSAjUENNX0NIQU5ORUxfQwotICogLSAjUENNX0NIQU5ORUxfTFMKLSAqIC0gI1BDTV9DSEFOTkVMX1JTCi0gKiAtICNQQ01fQ0hBTk5FTF9MRkUKLSAqIC0gI1BDTV9DSEFOTkVMX0NTCi0gKiAtICNQQ01fQ0hBTk5FTF9MQgotICogLSAjUENNX0NIQU5ORUxfUkIKLSAqIC0gI1BDTV9DSEFOTkVMUwotICogLSAjUENNX0NIQU5ORUxfQ1ZICi0gKiAtICNQQ01fQ0hBTk5FTF9NUwotICogLSAjUENNX0NIQU5ORUxfRkxDCi0gKiAtICNQQ01fQ0hBTk5FTF9GUkMKLSAqIC0gI1BDTV9DSEFOTkVMX1JMQwotICogLSAjUENNX0NIQU5ORUxfUlJDCi0gKgotICogQ2hhbm5lbFtpXSBtYXBwaW5nIGRlc2NyaWJlcyBjaGFubmVsIEkuIEVhY2ggZWxlbWVudCBpIG9mIHRoZQotICogYXJyYXkgZGVzY3JpYmVzIGNoYW5uZWwgSSBpbnNpZGUgdGhlIGJ1ZmZlciB3aGVyZSAwIEBsZSBJIDwKLSAqIG51bV9jaGFubmVscy4gQW4gdW51c2VkIGNoYW5uZWwgaXMgc2V0IHRvIHplcm8uCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192MyB7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOwotLyoKLSAqIE51bWJlciBvZiBjaGFubmVscwotICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4Ci0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKLS8qCi0gKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHBlciBjaGFubmVsCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0vKgotICogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZAotICogU3VwcG9ydGVkIHZhbHVlczogMjAwMCB0byA0ODAwMCwgOTYwMDAsMTkyMDAwIEh6Ci0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgIGlzX3NpZ25lZDsKLS8qIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBQQ00gc2FtcGxlcyBhcmUgc2lnbmVkICgxKSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgc2FtcGxlX3dvcmRfc2l6ZTsKLS8qCi0gKiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMiwyNCwzMgotICovCi0KLQl1aW50OF90ICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbOF07Ci0vKgotICogRWFjaCBlbGVtZW50LCBpLCBpbiB0aGUgYXJyYXkgZGVzY3JpYmVzIGNoYW5uZWwgaSBpbnNpZGUgdGhlIGJ1ZmZlciB3aGVyZQotICogMCA8PSBpIDwgbnVtX2NoYW5uZWxzLiBVbnVzZWQgY2hhbm5lbHMgYXJlIHNldCB0byAwLgotICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfdjQgewotCXVpbnQxNl90ICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKLS8qCi0gKiBOdW1iZXIgb2YgY2hhbm5lbHMKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAotICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7Ci0vKgotICogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwZXIgY2hhbm5lbAotICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0LCAzMgotICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qCi0gKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDQ4MDAwLCA5NjAwMCwxOTIwMDAgSHoKLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgaXNfc2lnbmVkOwotLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IFBDTSBzYW1wbGVzIGFyZSBzaWduZWQgKDEpICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICBzYW1wbGVfd29yZF9zaXplOwotLyoKLSAqIFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEyLDI0LDMyCi0gKi8KLQotCXVpbnQ4X3QgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKLS8qCi0gKiBFYWNoIGVsZW1lbnQsIGksIGluIHRoZSBhcnJheSBkZXNjcmliZXMgY2hhbm5lbCBpIGluc2lkZSB0aGUgYnVmZmVyIHdoZXJlCi0gKiAwIDw9IGkgPCBudW1fY2hhbm5lbHMuIFVudXNlZCBjaGFubmVscyBhcmUgc2V0IHRvIDAuCi0gKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICBlbmRpYW5uZXNzOwotLyoKLSAqIEZsYWcgdG8gaW5kaWNhdGUgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHBjbSBzYW1wbGUKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgLSBMaXR0bGUgZW5kaWFuIChhbGwgb3RoZXIgZm9ybWF0cykKLSAqICAgICAgICAgICAgICAgICAgIDEgLSBCaWcgZW5kaWFuIChBSUZGKQotICovCi0JdWludDE2X3QgICAgICAgICAgICAgICAgbW9kZTsKLS8qCi0gKiBNb2RlIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvIGFib3V0IHRoZSBwY20gaW5wdXQgZGF0YS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgLSBEZWZhdWx0IFFGcyAoUTE1IGZvciAxNmIsIFEyMyBmb3IgcGFja2VkIDI0YiwKLSAqICAgICAgICAgICAgICAgICAgICAgICBRMzEgZm9yIHVucGFja2VkIDI0YiBvciAzMmIpCi0gKiAgICAgICAgICAgICAgICAgIDE1IC0gZm9yIDE2IGJpdAotICogICAgICAgICAgICAgICAgICAyMyAtIGZvciAyNGIgcGFja2VkIG9yIDguMjQgZm9ybWF0Ci0gKiAgICAgICAgICAgICAgICAgIDMxIC0gZm9yIDI0YiB1bnBhY2tlZCBvciAzMmJpdAotICovCi19IF9fcGFja2VkOwotCi0vKgotICogUGF5bG9hZCBvZiB0aGUgbXVsdGljaGFubmVsIFBDTSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4KLSAqIHRoZSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzIG1lZGlhIGZvcm1hdC4KLSAqLwotc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3BhcmFtX3YzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdF9ibGs7Ci0Jc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YzIHBhcmFtOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFBheWxvYWQgb2YgdGhlIG11bHRpY2hhbm5lbCBQQ00gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluCi0gKiB0aGUgQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WNCBtZWRpYSBmb3JtYXQuCi0gKi8KLXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa19wYXJhbV92NCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRfYmxrOwotCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192NCBwYXJhbTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtIHsKLQl1MzIgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKLQkvKiBJRCBvZiB0aGUgcGFyYW1ldGVyLiAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLS8qIERhdGEgc2l6ZSBvZiB0aGlzIHBhcmFtZXRlciwgaW4gYnl0ZXMuIFRoZSBzaXplIGlzIGEgbXVsdGlwbGUKLSAqIG9mIDQgYnl0ZXMuCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgZnJhbWVzX3Blcl9idWY7Ci0vKiBOdW1iZXIgb2YgZW5jb2RlZCBmcmFtZXMgdG8gcGFjayBpbnRvIGVhY2ggYnVmZmVyLgotICoKLSAqIEBub3RlMWhhbmcgVGhpcyBpcyBvbmx5IGd1aWRhbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgYURTUC4gVGhlCi0gKiBudW1iZXIgb2YgZW5jb2RlZCBmcmFtZXMgcHV0IGludG8gZWFjaCBidWZmZXIgKHNwZWNpZmllZCBieSB0aGUKLSAqIGNsaWVudCkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgbnVtYmVyLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBlbmNfY2ZnX2Jsa19zaXplOwotLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgZW5jb2RlciBjb25maWd1cmF0aW9uIGJsb2NrIHRoYXQgZm9sbG93cwotICogdGhpcyBtZW1iZXIuCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotLyogQGJyaWVmIERvbGJ5IERpZ2l0YWwgUGx1cyBlbmQgcG9pbnQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLSAqLwotc3RydWN0IGFzbV9kZWNfZGRwX2VuZHBfcGFyYW1fdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOwotCWludCBlbmRwX3BhcmFtX3ZhbHVlOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFBheWxvYWQgb2YgdGhlIG11bHRpY2hhbm5lbCBQQ00gZW5jb2RlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4KLSAqIHRoZSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1Y0IG1lZGlhIGZvcm1hdC4KLSAqLwotCi1zdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MiBlbmNibGs7Ci0JdWludDE2X3QgbnVtX2NoYW5uZWxzOwotCS8qCi0JICogTnVtYmVyIG9mIFBDTSBjaGFubmVscy4KLQkgKiBAdmFsdWVzCi0JICogLSAwIC0tIE5hdGl2ZSBtb2RlCi0JICogLSAxIC0tIDggY2hhbm5lbHMKLQkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBudW1iZXIKLQkgKiBvZiBjaGFubmVscyBhdCB0aGUgaW5wdXQuCi0JICovCi0JdWludDE2X3QgIGJpdHNfcGVyX3NhbXBsZTsKLQkvKgotCSAqIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcGVyIGNoYW5uZWwuCi0JICogQHZhbHVlcyAxNiwgMjQKLQkgKi8KLQl1aW50MzJfdCAgc2FtcGxlX3JhdGU7Ci0JLyoKLQkgKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kLgotCSAqIEB2YWx1ZXMgMCwgODAwMCB0byA0ODAwMCBIegotCSAqIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhlIG5hdGl2ZSBzYW1wbGluZyByYXRlLiBFbmNvZGluZyBpcwotCSAqIHBlcmZvcm1lZCBhdCB0aGUgaW5wdXQgc2FtcGxpbmcgcmF0ZS4KLQkgKi8KLQl1aW50MTZfdCAgaXNfc2lnbmVkOwotCS8qCi0JICogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgUENNIHNhbXBsZXMgYXJlIHNpZ25lZCAoMSkuIEN1cnJlbnRseSwgb25seQotCSAqIHNpZ25lZCBQQ00gc2FtcGxlcyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCXVpbnQxNl90ICAgIHNhbXBsZV93b3JkX3NpemU7Ci0JLyoKLQkgKiBUaGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsLgotCSAqIEB2YWx1ZXMgMTYsIDI0LCAzMgotCSAqIDE2LWJpdCBzYW1wbGVzIGFyZSBhbHdheXMgcGxhY2VkIGluIDE2LWJpdCB3b3JkczoKLQkgKiBzYW1wbGVfd29yZF9zaXplID0gMS4KLQkgKiAyNC1iaXQgc2FtcGxlcyBjYW4gYmUgcGxhY2VkIGluIDMyLWJpdCB3b3JkcyBvciBpbiBjb25zZWN1dGl2ZQotCSAqIDI0LWJpdCB3b3Jkcy4KLQkgKiAtIElmIHNhbXBsZV93b3JkX3NpemUgPSAzMiwgMjQtYml0IHNhbXBsZXMgYXJlIHBsYWNlZCBpbiB0aGUKLQkgKiBtb3N0IHNpZ25pZmljYW50IDI0IGJpdHMgb2YgYSAzMi1iaXQgd29yZC4KLQkgKiAtIElmIHNhbXBsZV93b3JkX3NpemUgPSAyNCwgMjQtYml0IHNhbXBsZXMgYXJlIHBsYWNlZCBpbgotCSAqIDI0LWJpdCB3b3Jkcy4gQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDhfdCAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKLQkvKgotCSAqIENoYW5uZWwgbWFwcGluZyBhcnJheSBleHBlY3RlZCBhdCB0aGUgZW5jb2RlciBvdXRwdXQuCi0JICogIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbCBpIGluc2lkZSB0aGUgYnVmZmVyLCB3aGVyZQotCSAqICAwIEBsZSBpIDwgbnVtX2NoYW5uZWxzLiBBbGwgdmFsaWQgdXNlZCBjaGFubmVscyBtdXN0IGJlIHByZXNlbnQgYXQKLQkgKiAgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuCi0JICogSWYgTmF0aXZlIG1vZGUgaXMgc2V0IGZvciB0aGUgY2hhbm5lbHMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4KLQkgKiBAdmFsdWVzIFNlZSBTZWN0aW9uIEB4cmVme2RveDpQY21DaGFubmVsRGVmc30KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICBlbmRpYW5uZXNzOwotCS8qCi0JICogRmxhZyB0byBpbmRpY2F0ZSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgcGNtIHNhbXBsZQotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgLSBMaXR0bGUgZW5kaWFuIChhbGwgb3RoZXIgZm9ybWF0cykKLQkgKiAgICAgICAgICAgICAgICAgICAxIC0gQmlnIGVuZGlhbiAoQUlGRikKLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICBtb2RlOwotCS8qCi0JICogTW9kZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgcGNtIGlucHV0IGRhdGEuCi0JICogU3VwcG9ydGVkIHZhbHVlczogMCAtIERlZmF1bHQgUUZzIChRMTUgZm9yIDE2YiwgUTIzIGZvciBwYWNrZWQgMjRiLAotCSAqICAgICAgICAgICAgICAgICAgICAgICBRMzEgZm9yIHVucGFja2VkIDI0YiBvciAzMmIpCi0JICogICAgICAgICAgICAgICAgICAxNSAtIGZvciAxNiBiaXQKLQkgKiAgICAgICAgICAgICAgICAgIDIzIC0gZm9yIDI0YiBwYWNrZWQgb3IgOC4yNCBmb3JtYXQKLQkgKiAgICAgICAgICAgICAgICAgIDMxIC0gZm9yIDI0YiB1bnBhY2tlZCBvciAzMmJpdAotCSAqLwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFBheWxvYWQgb2YgdGhlIG11bHRpY2hhbm5lbCBQQ00gZW5jb2RlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW4KLSAqIHRoZSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzIG1lZGlhIGZvcm1hdC4KLSAqLwotCi1zdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MiBlbmNibGs7Ci0JdWludDE2X3QgbnVtX2NoYW5uZWxzOwotCS8qCi0JICogTnVtYmVyIG9mIFBDTSBjaGFubmVscy4KLQkgKiBAdmFsdWVzCi0JICogLSAwIC0tIE5hdGl2ZSBtb2RlCi0JICogLSAxIC0tIDggY2hhbm5lbHMKLQkgKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBudW1iZXIKLQkgKiBvZiBjaGFubmVscyBhdCB0aGUgaW5wdXQuCi0JICovCi0JdWludDE2X3QgIGJpdHNfcGVyX3NhbXBsZTsKLQkvKgotCSAqIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcGVyIGNoYW5uZWwuCi0JICogQHZhbHVlcyAxNiwgMjQKLQkgKi8KLQl1aW50MzJfdCAgc2FtcGxlX3JhdGU7Ci0JLyoKLQkgKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kLgotCSAqIEB2YWx1ZXMgMCwgODAwMCB0byA0ODAwMCBIegotCSAqIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhlIG5hdGl2ZSBzYW1wbGluZyByYXRlLiBFbmNvZGluZyBpcwotCSAqIHBlcmZvcm1lZCBhdCB0aGUgaW5wdXQgc2FtcGxpbmcgcmF0ZS4KLQkgKi8KLQl1aW50MTZfdCAgaXNfc2lnbmVkOwotCS8qCi0JICogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgUENNIHNhbXBsZXMgYXJlIHNpZ25lZCAoMSkuIEN1cnJlbnRseSwgb25seQotCSAqIHNpZ25lZCBQQ00gc2FtcGxlcyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCXVpbnQxNl90ICAgIHNhbXBsZV93b3JkX3NpemU7Ci0JLyoKLQkgKiBUaGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsLgotCSAqIEB2YWx1ZXMgMTYsIDI0LCAzMgotCSAqIDE2LWJpdCBzYW1wbGVzIGFyZSBhbHdheXMgcGxhY2VkIGluIDE2LWJpdCB3b3JkczoKLQkgKiBzYW1wbGVfd29yZF9zaXplID0gMS4KLQkgKiAyNC1iaXQgc2FtcGxlcyBjYW4gYmUgcGxhY2VkIGluIDMyLWJpdCB3b3JkcyBvciBpbiBjb25zZWN1dGl2ZQotCSAqIDI0LWJpdCB3b3Jkcy4KLQkgKiAtIElmIHNhbXBsZV93b3JkX3NpemUgPSAzMiwgMjQtYml0IHNhbXBsZXMgYXJlIHBsYWNlZCBpbiB0aGUKLQkgKiBtb3N0IHNpZ25pZmljYW50IDI0IGJpdHMgb2YgYSAzMi1iaXQgd29yZC4KLQkgKiAtIElmIHNhbXBsZV93b3JkX3NpemUgPSAyNCwgMjQtYml0IHNhbXBsZXMgYXJlIHBsYWNlZCBpbgotCSAqIDI0LWJpdCB3b3Jkcy4gQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDhfdCAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKLQkvKgotCSAqIENoYW5uZWwgbWFwcGluZyBhcnJheSBleHBlY3RlZCBhdCB0aGUgZW5jb2RlciBvdXRwdXQuCi0JICogIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbCBpIGluc2lkZSB0aGUgYnVmZmVyLCB3aGVyZQotCSAqICAwIEBsZSBpIDwgbnVtX2NoYW5uZWxzLiBBbGwgdmFsaWQgdXNlZCBjaGFubmVscyBtdXN0IGJlIHByZXNlbnQgYXQKLQkgKiAgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuCi0JICogSWYgTmF0aXZlIG1vZGUgaXMgc2V0IGZvciB0aGUgY2hhbm5lbHMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4KLQkgKiBAdmFsdWVzIFNlZSBTZWN0aW9uIEB4cmVme2RveDpQY21DaGFubmVsRGVmc30KLQkgKi8KLX07Ci0KLS8qIEBicmllZiBNdWx0aWNoYW5uZWwgUENNIGVuY29kZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdXNlZAotICogaW4gdGhlICNBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyIGNvbW1hbmQuCi0gKi8KLQotc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9lbmNfY2ZnX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gIGVuY2RlYzsKLQlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyCWVuY2JsazsKLQl1aW50MTZfdCAgbnVtX2NoYW5uZWxzOwotLyo8IE51bWJlciBvZiBQQ00gY2hhbm5lbHMuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlczogLSAwIC0tIE5hdGl2ZSBtb2RlIC0gMSAtLSA4IE5hdGl2ZSBtb2RlCi0gKiBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBudW1iZXIgb2YKLSAqIGNoYW5uZWxzIGF0IHRoZSBpbnB1dC4KLSAqLwotCi0JdWludDE2X3QgIGJpdHNfcGVyX3NhbXBsZTsKLS8qPCBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHBlciBjaGFubmVsLgotICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0Ci0gKi8KLQotCXVpbnQzMl90ICBzYW1wbGVfcmF0ZTsKLS8qPCBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kIChpbiBIZXJ0eikuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlczogMCwgODAwMCB0byA0ODAwMCBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoZQotICogbmF0aXZlIHNhbXBsaW5nIHJhdGUuIEVuY29kaW5nIGlzIHBlcmZvcm1lZCBhdCB0aGUgaW5wdXQgc2FtcGxpbmcKLSAqIHJhdGUuCi0gKi8KLQotCXVpbnQxNl90ICBpc19zaWduZWQ7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNhbXBsZXMgYXJlIHNpZ25lZCAoMSkuIEN1cnJlbnRseSwKLSAqIG9ubHkgc2lnbmVkIHNhbXBsZXMgYXJlIHN1cHBvcnRlZC4KLSAqLwotCi0JdWludDE2X3QgIHJlc2VydmVkOwotLyo8IHJlc2VydmVkIGZpZWxkIGZvciAzMiBiaXQgYWxpZ25tZW50LiBtdXN0IGJlIHNldCB0byB6ZXJvLiovCi0KLQotCXVpbnQ4X3QgICBjaGFubmVsX21hcHBpbmdbOF07Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfTVAzIDB4MDAwMTBCRTkKLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfVjIgMHgwMDAxMERBNgotCi0vKiBAeHJlZmxhYmVsCi0gKiB7aGRyOkFzbU1lZGlhRm10RG9sYnlBYWN9IE1lZGlhIGZvcm1hdCBJRCBmb3IgdGhlCi0gKiBEb2xieSBBQUMgZGVjb2Rlci4gVGhpcyBmb3JtYXQgSUQgaXMgYmUgdXNlZCBpZiB0aGUgY2xpZW50IHdhbnRzCi0gKiB0byB1c2UgdGhlIERvbGJ5IEFBQyBkZWNvZGVyIHRvIGRlY29kZSBNUEVHMiBhbmQgTVBFRzQgQUFDCi0gKiBjb250ZW50cy4KLSAqLwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfRE9MQllfQUFDIDB4MDAwMTBEODYKLQotLyogRW51bWVyYXRpb24gZm9yIHRoZSBhdWRpbyBkYXRhIHRyYW5zcG9ydCBzdHJlYW0gQUFDIGZvcm1hdC4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BQUNfRk9STUFUX0ZMQUdfQURUUyAwCi0KLS8qIEVudW1lcmF0aW9uIGZvciBsb3cgb3ZlcmhlYWQgYXVkaW8gc3RyZWFtIEFBQyBmb3JtYXQuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX0xPQVMgICAgICAgICAgICAgICAgICAgICAgMQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGF1ZGlvIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBBQUMgZm9ybWF0LgotICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX0FESUYgICAyCi0KLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgcmF3IEFBQyBmb3JtYXQuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0ZPUk1BVF9GTEFHX1JBVyAgICAzCi0KLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgQUFDIExBVE0gZm9ybWF0LiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19MQVRNICAgNAotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0FPVF9MQyAgICAgICAgICAgICAyCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0FPVF9TQlIgICAgICAgICAgICA1Ci0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQUFDX0FPVF9QUyAgICAgICAgICAgICAyOQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FBQ19BT1RfQlNBQyAgICAgICAgICAgMjIKLQotc3RydWN0IGFzbV9hYWNfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRfYmxrOwotCi0JCXUxNiAgICAgICAgICBhYWNfZm10X2ZsYWc7Ci0vKiBCaXRzdHJlYW0gZm9ybWF0IG9wdGlvbi4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRFRTCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19MT0FTCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRElGCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19SQVcKLSAqLwotCi0JdTE2ICAgICAgICAgIGF1ZGlvX29ianlwZTsKLS8qIEF1ZGlvIE9iamVjdCBUeXBlIChBT1QpIHByZXNlbnQgaW4gdGhlIEFBQyBzdHJlYW0uCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX01FRElBX0ZNVF9BQUNfQU9UX0xDCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19BT1RfU0JSCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19BT1RfQlNBQwotICogLSAjQVNNX01FRElBX0ZNVF9BQUNfQU9UX1BTCi0gKiAtIE90aGVyd2lzZSAtLSBOb3Qgc3VwcG9ydGVkCi0gKi8KLQotCXUxNiAgICAgICAgICBjaGFubmVsX2NvbmZpZzsKLS8qIE51bWJlciBvZiBjaGFubmVscyBwcmVzZW50IGluIHRoZSBBQUMgc3RyZWFtLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMSAtLSBNb25vCi0gKiAtIDIgLS0gU3RlcmVvCi0gKiAtIDYgLS0gNS4xIGNvbnRlbnQKLSAqLwotCi0JdTE2ICAgICAgICAgIHRvdGFsX3NpemVfb2ZfUENFX2JpdHM7Ci0vKiBncmVhdGVyIG9yIGVxdWFsIHRvIHplcm8uICogLUluIGNhc2Ugb2YgUkFXIGZvcm1hdHMgYW5kCi0gKiBjaGFubmVsIGNvbmZpZyA9IDAgKFBDRSksIGNsaWVudCBjYW4gc2VuZCAqIHRoZSBiaXQgc3RyZWFtCi0gKiBjb250YWluaW5nIFBDRSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgKiAoaW4tYmFuZCkuCi0gKiAtVGhpcyBudW1iZXIgZG9lcyBub3QgaW5jbHVkZSBiaXRzIGluY2x1ZGVkIGZvciAzMiBiaXQgYWxpZ25tZW50LgotICogLUlmIHplcm8sIHRoZW4gdGhlIFBDRSBpbmZvIGlzIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZQotICogYXVkaW8gLWJpdCBzdHJlYW0gJiBub3QgaW4tYmFuZC4KLSAqLwotCi0JdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCAoaW4gSGVydHopLgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsCi0gKiA0NDEwMCwgNDgwMDAKLSAqCi0gKiBUaGlzIGZpZWxkIG11c3QgYmUgZXF1YWwgdG8gdGhlIHNhbXBsZSByYXRlIG9mIHRoZSBBQUMtTEMKLSAqIGRlY29kZXIncyBvdXRwdXQuIC0gRm9yIE1QNCBvciAzR1AgY29udGFpbmVycywgdGhpcyBpcyBpbmRpY2F0ZWQKLSAqIGJ5IHRoZSBzYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IGZpZWxkIGluIHRoZSBBdWRpb1NwZWNpZmljQ29uZmlnCi0gKiBlbGVtZW50LiAtIEZvciBBRFRTIGZvcm1hdCwgdGhpcyBpcyBpbmRpY2F0ZWQgYnkgdGhlCi0gKiBzYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IGluIHRoZSBBRFRTIGZpeGVkIGhlYWRlci4gLSBGb3IgQURJRgotICogZm9ybWF0LCB0aGlzIGlzIGluZGljYXRlZCBieSB0aGUgc2FtcGxpbmdGcmVxdWVuY3lJbmRleCBpbiB0aGUKLSAqIHByb2dyYW1fY29uZmlnX2VsZW1lbnQgcHJlc2VudCBpbiB0aGUgQURJRiBoZWFkZXIuCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7Ci0KLQl1MzIgICAgICAgICAgYml0X3JhdGU7Ci0JLyogRW5jb2RpbmcgcmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuICovCi0JdTMyICAgICAgICAgIGVuY19tb2RlOwotLyogRW5jb2RpbmcgbW9kZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19BT1RfTEMKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9TQlIKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX0FPVF9QUwotICovCi0JdTE2ICAgICAgICAgIGFhY19mbXRfZmxhZzsKLS8qIEFBQyBmb3JtYXQgZmxhZy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19BRFRTCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19GT1JNQVRfRkxBR19SQVcKLSAqLwotCXUxNiAgICAgICAgICBjaGFubmVsX2NmZzsKLS8qIE51bWJlciBvZiBjaGFubmVscyB0byBlbmNvZGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAwIC0tIE5hdGl2ZSBtb2RlCi0gKiAtIDEgLS0gTW9ubwotICogLSAyIC0tIFN0ZXJlbwotICogLSBPdGhlciB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gKiBAbm90ZTFoYW5nIFRoZSBlQUFDKyBlbmNvZGVyIG1vZGUgc3VwcG9ydHMgb25seSBzdGVyZW8uCi0gKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQotICogbnVtYmVyIG9mIGNoYW5uZWxzIGF0IHRoZSBpbnB1dC4KLSAqIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBub3QgY2hhbmdlIGR1cmluZyBlbmNvZGluZy4KLSAqLwotCi0JdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IC0gMCAtLSBOYXRpdmUgbW9kZSAtIEZvciBvdGhlciB2YWx1ZXMsCi0gKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQotICogc2FtcGxpbmcgcmF0ZSBhdCB0aGUgaW5wdXQuCi0gKiBUaGUgc2FtcGxpbmcgcmF0ZSBtdXN0IG5vdCBjaGFuZ2UgZHVyaW5nIGVuY29kaW5nLgotICovCi0KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9HNzExX0FMQVdfRlMgMHgwMDAxMEJGNwotI2RlZmluZSBBU01fTUVESUFfRk1UX0c3MTFfTUxBV19GUyAweDAwMDEwQzJFCi0KLXN0cnVjdCBhc21fZzcxMV9lbmNfY2ZnX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gZW5jZGVjOwotCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIgZW5jYmxrOwotCi0JdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyoKLSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA4MDAwLCAxNjAwMCBIegotICovCi0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fdm9yYmlzX2ZtdF9ibGtfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOwotCXUzMiAgICAgICAgICBiaXRfc3RyZWFtX2ZtdDsKLS8qIEJpdCBzdHJlYW0gZm9ybWF0LgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBSYXcgYml0c3RyZWFtCi0gKiAtIDEgLS0gVHJhbnNjb2RlZCBiaXRzdHJlYW0KLSAqCi0gKiBUcmFuc2NvZGVkIGJpdHN0cmVhbSBjb250YWluaW5nIHRoZSBzaXplIG9mIHRoZSBmcmFtZSBhcyB0aGUgZmlyc3QKLSAqIHdvcmQgaW4gZWFjaCBmcmFtZS4KLSAqLwotCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX2ZsYWNfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7Ci0KLQl1MTYgaXNfc3RyZWFtX2luZm9fcHJlc2VudDsKLS8qIFNwZWNpZmllcyB3aGV0aGVyIHN0cmVhbSBpbmZvcm1hdGlvbiBpcyBwcmVzZW50IGluIHRoZSBGTEFDIGZvcm1hdAotICogYmxvY2suCi0gKgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBTdHJlYW0gaW5mb3JtYXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlCi0gKiAtIDEgLS0gU3RyZWFtIGluZm9ybWF0aW9uIGlzIHByZXNlbnQgaW4gdGhpcyBtZXNzYWdlCi0gKgotICogV2hlbiBzZXQgdG8gMSwgdGhlIEZMQUMgYml0c3RyZWFtIHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkIGJ5IHRoZQotICogY2xpZW50LCBhbmQgb3RoZXIgZmllbGRzIGluIHRoZSBGTEFDIGZvcm1hdCBibG9jayBjYW4gYmUgcmVhZCBieSB0aGUKLSAqIGRlY29kZXIgdG8gZ2V0IG1ldGFkYXRhIHN0cmVhbSBpbmZvcm1hdGlvbi4KLSAqLwotCi0JdTE2IG51bV9jaGFubmVsczsKLS8qIE51bWJlciBvZiBjaGFubmVscyBmb3IgZGVjb2RpbmcuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDIKLSAqLwotCi0JdTE2IG1pbl9ibGtfc2l6ZTsKLS8qIE1pbmltdW0gYmxvY2sgc2l6ZSAoaW4gc2FtcGxlcykgdXNlZCBpbiB0aGUgc3RyZWFtLiBJdCBtdXN0IGJlIGxlc3MKLSAqIHRoYW4gb3IgZXF1YWwgdG8gbWF4X2Jsa19zaXplLgotICovCi0KLQl1MTYgbWF4X2Jsa19zaXplOwotLyogTWF4aW11bSBibG9jayBzaXplIChpbiBzYW1wbGVzKSB1c2VkIGluIHRoZSBzdHJlYW0uIElmIHRoZQotICogbWluaW11bSBibG9jayBzaXplIGVxdWFscyB0aGUgbWF4aW11bSBibG9jayBzaXplLCBhIGZpeGVkIGJsb2NrCi0gKiBzaXplIHN0cmVhbSBpcyBpbXBsaWVkLgotICovCi0KLQl1MTYgbWQ1X3N1bVs4XTsKLS8qIE1ENSBzaWduYXR1cmUgYXJyYXkgb2YgdGhlIHVuZW5jb2RlZCBhdWRpbyBkYXRhLiBUaGlzIGFsbG93cyB0aGUKLSAqIGRlY29kZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgYXVkaW8gZGF0YSwgZXZlbiB3aGVuCi0gKiB0aGUgZXJyb3IgZG9lcyBub3QgcmVzdWx0IGluIGFuIGludmFsaWQgYml0c3RyZWFtLgotICovCi0KLQl1MzIgc2FtcGxlX3JhdGU7Ci0vKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kLgotICogU3VwcG9ydGVkIHZhbHVlczogODAwMCB0byA0ODAwMCBIegotICovCi0KLQl1MzIgbWluX2ZyYW1lX3NpemU7Ci0vKiBNaW5pbXVtIGZyYW1lIHNpemUgdXNlZCBpbiB0aGUgc3RyZWFtLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gPiAwIGJ5dGVzCi0gKiAtIDAgLS0gVGhlIHZhbHVlIGlzIHVua25vd24KLSAqLwotCi0JdTMyIG1heF9mcmFtZV9zaXplOwotLyogTWF4aW11bSBmcmFtZSBzaXplIHVzZWQgaW4gdGhlIHN0cmVhbS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtLSA+IDAgYnl0ZXMKLSAqIC0tIDAgLiBUaGUgdmFsdWUgaXMgdW5rbm93bgotICovCi0KLQl1MTYgc2FtcGxlX3NpemU7Ci0vKiBCaXRzIHBlciBzYW1wbGUuU3VwcG9ydGVkIHZhbHVlczogOCwgMTYgKi8KLQotCXUxNiByZXNlcnZlZDsKLS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9hbGFjX2ZtdF9ibGtfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOwotCi0JdTMyIGZyYW1lX2xlbmd0aDsKLQl1OCBjb21wYXRpYmxlX3ZlcnNpb247Ci0JdTggYml0X2RlcHRoOwotCXU4IHBiOwotCXU4IG1iOwotCXU4IGtiOwotCXU4IG51bV9jaGFubmVsczsKLQl1MTYgbWF4X3J1bjsKLQl1MzIgbWF4X2ZyYW1lX2J5dGVzOwotCXUzMiBhdmdfYml0X3JhdGU7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBjaGFubmVsX2xheW91dF90YWc7Ci0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fZzcxMV9kZWNfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7Ci0JdTMyIHNhbXBsZV9yYXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9hcGVfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7Ci0KLQl1MTYgY29tcGF0aWJsZV92ZXJzaW9uOwotCXUxNiBjb21wcmVzc2lvbl9sZXZlbDsKLQl1MzIgZm9ybWF0X2ZsYWdzOwotCXUzMiBibG9ja3NfcGVyX2ZyYW1lOwotCXUzMiBmaW5hbF9mcmFtZV9ibG9ja3M7Ci0JdTMyIHRvdGFsX2ZyYW1lczsKLQl1MTYgYml0c19wZXJfc2FtcGxlOwotCXUxNiBudW1fY2hhbm5lbHM7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBzZWVrX3RhYmxlX3ByZXNlbnQ7Ci0KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fZHNkX2ZtdF9ibGtfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOwotCi0JdTE2IG51bV92ZXJzaW9uOwotCXUxNiBpc19iaXR3aXNlX2JpZ19lbmRpYW47Ci0JdTE2IGRzZF9jaGFubmVsX2Jsb2NrX3NpemU7Ci0JdTE2IG51bV9jaGFubmVsczsKLQl1OCAgY2hhbm5lbF9tYXBwaW5nWzhdOwotCXUzMiBkc2RfZGF0YV9yYXRlOwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlMgICAgICAgICAgICAgICAgICAweDAwMDEwQkVCCi0KLS8qIEVudW1lcmF0aW9uIGZvciA0Ljc1IGticHMgQU1SLU5CIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfTVI0NzUgICAgICAgICAgICAgICAgMAotCi0vKiBFbnVtZXJhdGlvbiBmb3IgNS4xNSBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01SNTE1ICAgICAgICAgICAgICAgIDEKLQotLyogRW51bWVyYXRpb24gZm9yIDUuOTAga2JwcyBBTVItTkIgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV9NTVI1OSAgICAgICAgICAgICAgICAyCi0KLS8qIEVudW1lcmF0aW9uIGZvciA2LjcwIGticHMgQU1SLU5CIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfTU1SNjcgICAgICAgICAgICAgICAgMwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgNy40MCBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01NUjc0ICAgICAgICAgICAgICAgIDQKLQotLyogRW51bWVyYXRpb24gZm9yIDcuOTUga2JwcyBBTVItTkIgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV9NTVI3OTUgICAgICAgICAgICAgICA1Ci0KLS8qIEVudW1lcmF0aW9uIGZvciAxMC4yMCBrYnBzIEFNUi1OQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0VOQ09ERV9NT0RFX01NUjEwMiAgICAgICAgICAgICAgIDYKLQotLyogRW51bWVyYXRpb24gZm9yIDEyLjIwIGticHMgQU1SLU5CIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1STkJfRlNfRU5DT0RFX01PREVfTU1SMTIyICAgICAgICAgICAgICAgNwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgQU1SLU5CIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIG1vZGUgb2ZmLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX09GRiAgICAgICAgICAgICAgICAgICAgIDAKLQotLyogRW51bWVyYXRpb24gZm9yIEFNUi1OQiBEVFggbW9kZSBWQUQxLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX1ZBRDEgICAgICAgICAgICAgICAgICAgIDEKLQotLyogRW51bWVyYXRpb24gZm9yIEFNUi1OQiBEVFggbW9kZSBWQUQyLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX1ZBRDIgICAgICAgICAgICAgICAgICAgIDIKLQotLyogRW51bWVyYXRpb24gZm9yIEFNUi1OQiBEVFggbW9kZSBhdXRvLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX0FVVE8gICAgICAgICAgICAgICAgICAgIDMKLQotc3RydWN0IGFzbV9hbXJuYl9lbmNfY2ZnIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gIGVuY2RlYzsKLQlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyCWVuY2JsazsKLQotCXUxNiAgICAgICAgICBlbmNfbW9kZTsKLS8qIEFNUi1OQiBlbmNvZGluZyByYXRlLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIFVzZSB0aGUgQVNNX01FRElBX0ZNVF9BTVJOQl9GU19FTkNPREVfTU9ERV8qCi0gKiBtYWNyb3MKLSAqLwotCi0JdTE2ICAgICAgICAgIGR0eF9tb2RlOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgRFRYIG1vZGUgaXMgZGlzYWJsZWQgb3IgZW5hYmxlZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTX0RUWF9NT0RFX09GRgotICogLSAjQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9WQUQxCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GUyAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRUMKLQotLyogRW51bWVyYXRpb24gZm9yIDYuNiBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SNjYgICAgICAgICAgICAgICAgIDAKLQotLyogRW51bWVyYXRpb24gZm9yIDguODUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjg4NSAgICAgICAgICAgICAgICAxCi0KLS8qIEVudW1lcmF0aW9uIGZvciAxMi42NSBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SMTI2NSAgICAgICAgICAgICAgIDIKLQotLyogRW51bWVyYXRpb24gZm9yIDE0LjI1IGticHMgQU1SLVdCIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfTVIxNDI1ICAgICAgICAgICAgICAgMwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgMTUuODUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjE1ODUgICAgICAgICAgICAgICA0Ci0KLS8qIEVudW1lcmF0aW9uIGZvciAxOC4yNSBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SMTgyNSAgICAgICAgICAgICAgIDUKLQotLyogRW51bWVyYXRpb24gZm9yIDE5Ljg1IGticHMgQU1SLVdCIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfTVIxOTg1ICAgICAgICAgICAgICAgNgotCi0vKiBFbnVtZXJhdGlvbiBmb3IgMjMuMDUga2JwcyBBTVItV0IgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9BTVJXQl9GU19FTkNPREVfTU9ERV9NUjIzMDUgICAgICAgICAgICAgICA3Ci0KLS8qIEVudW1lcmF0aW9uIGZvciAyMy44NSBrYnBzIEFNUi1XQiBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUldCX0ZTX0VOQ09ERV9NT0RFX01SMjM4NSAgICAgICAgICAgICAgIDgKLQotc3RydWN0IGFzbV9hbXJ3Yl9lbmNfY2ZnIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0gIGVuY2RlYzsKLQlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyCWVuY2JsazsKLQotCXUxNiAgICAgICAgICBlbmNfbW9kZTsKLS8qIEFNUi1XQiBlbmNvZGluZyByYXRlLgotICogU3V1cHBvcnRlZCB2YWx1ZXM6Ci0gKiBVc2UgdGhlIEFTTV9NRURJQV9GTVRfQU1SV0JfRlNfRU5DT0RFX01PREVfKgotICogbWFjcm9zCi0gKi8KLQotCXUxNiAgICAgICAgICBkdHhfbW9kZTsKLS8qIFNwZWNpZmllcyB3aGV0aGVyIERUWCBtb2RlIGlzIGRpc2FibGVkIG9yIGVuYWJsZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX01FRElBX0ZNVF9BTVJOQl9GU19EVFhfTU9ERV9PRkYKLSAqIC0gI0FTTV9NRURJQV9GTVRfQU1STkJfRlNfRFRYX01PREVfVkFEMQotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfVjEzS19GUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkVECi0KLS8qIEVudW1lcmF0aW9uIGZvciAxNC40IGticHMgVjEzSyBFbmNvZGluZyBtb2RlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVIxNDQwICAgICAgICAgICAgICAgIDAKLQotLyogRW51bWVyYXRpb24gZm9yIDEyLjIga2JwcyBWMTNLIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjEyMjAgICAgICAgICAgICAgICAgMQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgMTEuMiBrYnBzIFYxM0sgRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SMTEyMCAgICAgICAgICAgICAgICAyCi0KLS8qIEVudW1lcmF0aW9uIGZvciA5LjAga2JwcyBWMTNLIEVuY29kaW5nIG1vZGUuICovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjkwICAgICAgICAgICAgICAgICAgMwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgNy4yIGticHMgVjEzSyBlRW5jb2RpbmcgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SNzIwICAgICAgICAgICAgICAgICA0Ci0KLS8qIEVudW1lcmF0aW9uIGZvciAxLzggdm9jb2RlciByYXRlLiovCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfVk9DX09ORV9FSUdIVEhfUkFURSAgICAgICAgICAxCi0KLS8qIEVudW1lcmF0aW9uIGZvciAxLzQgdm9jb2RlciByYXRlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX1ZPQ19PTkVfRk9VUlRIX1JBVEUgICAgICAgMgotCi0vKiBFbnVtZXJhdGlvbiBmb3IgMS8yIHZvY29kZXIgcmF0ZS4gKi8KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9WT0NfSEFMRl9SQVRFICAgICAgICAgICAgIDMKLQotLyogRW51bWVyYXRpb24gZm9yIGZ1bGwgdm9jb2RlciByYXRlLiAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX1ZPQ19GVUxMX1JBVEUgICAgICAgICAgICAgNAotCi1zdHJ1Y3QgYXNtX3YxM2tfZW5jX2NmZyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7Ci0JCXUxNiAgICAgICAgICBtYXhfcmF0ZTsKLS8qIE1heGltdW0gYWxsb3dlZCBlbmNvZGVyIGZyYW1lIHJhdGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0VJR0hUSF9SQVRFCi0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRk9VUlRIX1JBVEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0hBTEZfUkFURQotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfRlVMTF9SQVRFCi0gKi8KLQotCXUxNiAgICAgICAgICBtaW5fcmF0ZTsKLS8qIE1pbmltdW0gYWxsb3dlZCBlbmNvZGVyIGZyYW1lIHJhdGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfT05FX0VJR0hUSF9SQVRFCi0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRk9VUlRIX1JBVEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX0hBTEZfUkFURQotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfRlVMTF9SQVRFCi0gKi8KLQotCXUxNiAgICAgICAgICByZWR1Y2VkX3JhdGVfY21kOwotLyogUmVkdWNlZCByYXRlIGNvbW1hbmQsIHVzZWQgdG8gY2hhbmdlCi0gKiB0aGUgYXZlcmFnZSBiaXRyYXRlIG9mIHRoZSBWMTNLCi0gKiB2b2NvZGVyLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FTTV9NRURJQV9GTVRfVjEzS19GU19FTkNPREVfTU9ERV9NUjE0NDAgKERlZmF1bHQpCi0gKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVIxMjIwCi0gKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVIxMTIwCi0gKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlNfRU5DT0RFX01PREVfTVI5MAotICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTX0VOQ09ERV9NT0RFX01SNzIwCi0gKi8KLQotCXUxNiAgICAgICAgICByYXRlX21vZF9jbWQ7Ci0vKiBSYXRlIG1vZHVsYXRpb24gY29tbWFuZC4gRGVmYXVsdCA9IDAuCi0gKi0gSWYgYml0IDA9MSwgcmF0ZSBjb250cm9sIGlzIGVuYWJsZWQuCi0gKi0gSWYgYml0IDE9MSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZ1bGwgcmF0ZQotICoJCQlmcmFtZXMgaXMgbGltaXRlZCB3aXRoIG51bWJlcnMgc3VwcGxpZWQgaW4KLSAqCQkJYml0cyAyIHRvIDEwLgotICotIElmIGJpdCAxPTAsIHRoZSBtaW5pbXVtIG51bWJlciBvZiBub24tZnVsbCByYXRlIGZyYW1lcwotICoJCQlpbiBiZXR3ZWVuIHR3byBmdWxsIHJhdGUgZnJhbWVzIGlzIGZvcmNlZCB0bwotICogdGhlIG51bWJlciBzdXBwbGllZCBpbiBiaXRzIDIgdG8gMTAuIEluIGJvdGggY2FzZXMsIGlmIG5lY2Vzc2FyeSwKLSAqIGhhbGYgcmF0ZSBpcyB1c2VkIHRvIHN1YnN0aXR1dGUgZnVsbCByYXRlLiAtIEJpdHMgMTUgdG8gMTAgYXJlCi0gKiByZXNlcnZlZCBhbmQgbXVzdCBhbGwgYmUgc2V0IHRvIHplcm8uCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fTUVESUFfRk1UX0VWUkNfRlMgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJFRQotCi0vKiAgRVZSQyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIHVzZWQgaW4gdGhlCi0gKiAjQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMiBjb21tYW5kLgotICovCi1zdHJ1Y3QgYXNtX2V2cmNfZW5jX2NmZyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7Ci0JdTE2ICAgICAgICAgIG1heF9yYXRlOwotLyogTWF4aW11bSBhbGxvd2VkIGVuY29kZXIgZnJhbWUgcmF0ZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRUlHSFRIX1JBVEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX09ORV9GT1VSVEhfUkFURQotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfSEFMRl9SQVRFCi0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19GVUxMX1JBVEUKLSAqLwotCi0JdTE2ICAgICAgICAgIG1pbl9yYXRlOwotLyogTWluaW11bSBhbGxvd2VkIGVuY29kZXIgZnJhbWUgcmF0ZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19PTkVfRUlHSFRIX1JBVEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfVk9DX09ORV9GT1VSVEhfUkFURQotICogLSAjQVNNX01FRElBX0ZNVF9WT0NfSEFMRl9SQVRFCi0gKiAtICNBU01fTUVESUFfRk1UX1ZPQ19GVUxMX1JBVEUKLSAqLwotCi0JdTE2ICAgICAgICAgIHJhdGVfbW9kX2NtZDsKLS8qIFJhdGUgbW9kdWxhdGlvbiBjb21tYW5kLiBEZWZhdWx0OiAwLgotICogLSBJZiBiaXQgMD0xLCByYXRlIGNvbnRyb2wgaXMgZW5hYmxlZC4KLSAqIC0gSWYgYml0IDE9MSwgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZ1bGwgcmF0ZSBmcmFtZXMKLSAqIGlzIGxpbWl0ZWQgd2l0aCBudW1iZXJzIHN1cHBsaWVkIGluIGJpdHMgMiB0byAxMC4KLSAqCi0gKiAtIElmIGJpdCAxPTAsIHRoZSBtaW5pbXVtIG51bWJlciBvZiBub24tZnVsbCByYXRlIGZyYW1lcyBpbgotICogYmV0d2VlbiB0d28gZnVsbCByYXRlIGZyYW1lcyBpcyBmb3JjZWQgdG8gdGhlIG51bWJlciBzdXBwbGllZCBpbgotICogYml0cyAyIHRvIDEwLiBJbiBib3RoIGNhc2VzLCBpZiBuZWNlc3NhcnksIGhhbGYgcmF0ZSBpcyB1c2VkIHRvCi0gKiBzdWJzdGl0dXRlIGZ1bGwgcmF0ZS4KLSAqCi0gKiAtIEJpdHMgMTUgdG8gMTAgYXJlIHJlc2VydmVkIGFuZCBtdXN0IGFsbCBiZSBzZXQgdG8gemVyby4KLSAqLwotCi0JdTE2ICAgICAgICAgIHJlc2VydmVkOwotCS8qIFJlc2VydmVkLiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9XTUFfVjEwUFJPX1YyICAgICAgICAgICAgICAgIDB4MDAwMTBEQTcKLQotc3RydWN0IGFzbV93bWFwcm92MTBfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7Ci0KLQl1MTYgICAgICAgICAgZm10YWc7Ci0vKiBXTUEgZm9ybWF0IHR5cGUuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAweDE2MiAtLSBXTUEgOSBQcm8KLSAqIC0gMHgxNjMgLS0gV01BIDkgUHJvIExvc3NsZXNzCi0gKiAtIDB4MTY2IC0tIFdNQSAxMCBQcm8KLSAqIC0gMHgxNjcgLS0gV01BIDEwIFBybyBMb3NzbGVzcwotICovCi0KLQl1MTYgICAgICAgICAgbnVtX2NoYW5uZWxzOwotLyogTnVtYmVyIG9mIGNoYW5uZWxzIGVuY29kZWQgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAotICovCi0KLQl1MzIgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0vKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kIChpbiBIZXJ0eikuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxMTAyNSwgMTYwMDAsIDIyMDUwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLAotICogODgyMDAsIDk2MDAwCi0gKi8KLQotCXUzMiAgICAgICAgICBhdmdfYnl0ZXNfcGVyX3NlYzsKLS8qIEJpdHJhdGUgZXhwcmVzc2VkIGFzIHRoZSBhdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDk2MDAwCi0gKi8KLQotCXUxNiAgICAgICAgICBibGtfYWxpZ247Ci0vKiBTaXplIG9mIHRoZSBiaXRzdHJlYW0gcGFja2V0IHNpemUgaW4gYnl0ZXMuIFdNQSBQcm8gZmlsZXMKLSAqIGhhdmUgYSBwYXlsb2FkIG9mIG9uZSBibG9jayBwZXIgYml0c3RyZWFtIHBhY2tldC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IEBsZSAxMzM3NgotICovCi0KLQl1MTYgICAgICAgICAgYml0c19wZXJfc2FtcGxlOwotLyogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBpbiB0aGUgZW5jb2RlZCBXTUEgc3RyZWFtLgotICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0Ci0gKi8KLQotCXUzMiAgICAgICAgICBjaGFubmVsX21hc2s7Ci0vKiBCaXQtcGFja2VkIGRvdWJsZSB3b3JkICgzMi1iaXRzKSB0aGF0IGluZGljYXRlcyB0aGUKLSAqIHJlY29tbWVuZGVkIHNwZWFrZXIgcG9zaXRpb25zIGZvciBlYWNoIHNvdXJjZSBjaGFubmVsLgotICovCi0KLQl1MTYgICAgICAgICAgZW5jX29wdGlvbnM7Ci0vKiBCaXQtcGFja2VkIHdvcmQgd2l0aCB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGNlcnRhaW4KLSAqIGZlYXR1cmVzIG9mIHRoZSBiaXRzdHJlYW0gYXJlIHVzZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAtIDB4MDAwMSAtLSBFTkNPUFQzX1BVUkVfTE9TU0xFU1MgLSAweDAwMDYgLS0KLSAqIEVOQ09QVDNfRlJNX1NJWkVfTU9EIC0gMHgwMDM4IC0tIEVOQ09QVDNfU1VCRlJNX0RJViAtIDB4MDA0MCAtLQotICogRU5DT1BUM19XUklURV9GUkFNRVNJWkVfSU5fSERSIC0gMHgwMDgwIC0tCi0gKiBFTkNPUFQzX0dFTkVSQVRFX0RSQ19QQVJBTVMgLSAweDAxMDAgLS0gRU5DT1BUM19SVE1CSVRTCi0gKi8KLQotCi0JdTE2ICAgICAgICAgIHVzQWR2YW5jZWRFbmNvZGVPcHQ7Ci0JLyogQWR2YW5jZWQgZW5jb2Rpbmcgb3B0aW9uLiAgKi8KLQotCXUzMiAgICAgICAgICBhZHZhbmNlZF9lbmNfb3B0aW9uczI7Ci0JLyogQWR2YW5jZWQgZW5jb2Rpbmcgb3B0aW9uIDIuICovCi0KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX01FRElBX0ZNVF9XTUFfVjlfVjIgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBEQTgKLXN0cnVjdCBhc21fd21hc3RkdjlfZm10X2Jsa192MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fZGF0YV9jbWRfbWVkaWFfZm10X3VwZGF0ZV92MiBmbXRibGs7Ci0JdTE2ICAgICAgICAgIGZtdGFnOwotLyogV01BIGZvcm1hdCB0YWcuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAweDE2MSAoV01BIDkgc3RhbmRhcmQpCi0gKi8KLQotCXUxNiAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHN0cmVhbS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEsIDIKLSAqLwotCi0JdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZCAoaW4gSGVydHopLgotICogU3VwcG9ydGVkIHZhbHVlczogNDgwMDAKLSAqLwotCi0JdTMyICAgICAgICAgIGF2Z19ieXRlc19wZXJfc2VjOwotCS8qIEJpdHJhdGUgZXhwcmVzc2VkIGFzIHRoZSBhdmVyYWdlIGJ5dGVzIHBlciBzZWNvbmQuICovCi0KLQl1MTYgICAgICAgICAgYmxrX2FsaWduOwotLyogQmxvY2sgYWxpZ24uIEFsbCBXTUEgZmlsZXMgd2l0aCBhIG1heGltdW0gcGFja2V0IHNpemUgb2YKLSAqIDEzMzc2IGFyZSBzdXBwb3J0ZWQuCi0gKi8KLQotCi0JdTE2ICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKLS8qIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgaW4gdGhlIG91dHB1dC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2Ci0gKi8KLQotCXUzMiAgICAgICAgICBjaGFubmVsX21hc2s7Ci0vKiBDaGFubmVsIG1hc2suCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAzIC0tIFN0ZXJlbyAoZnJvbnQgbGVmdC9mcm9udCByaWdodCkKLSAqIC0gNCAtLSBNb25vIChjZW50ZXIpCi0gKi8KLQotCXUxNiAgICAgICAgICBlbmNfb3B0aW9uczsKLQkvKiBPcHRpb25zIHVzZWQgZHVyaW5nIGVuY29kaW5nLiAqLwotCi0JdTE2ICAgICAgICAgIHJlc2VydmVkOwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfV01BX1Y4ICAgICAgICAgICAgICAgICAgICAweDAwMDEwRDkxCi0KLXN0cnVjdCBhc21fd21hc3RkdjhfZW5jX2NmZyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7Ci0JdTMyICAgICAgICAgIGJpdF9yYXRlOwotCS8qIEVuY29kaW5nIHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAqLwotCi0JdTMyICAgICAgICAgIHNhbXBsZV9yYXRlOwotLyogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIHNlY29uZC4KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAwIC0tIE5hdGl2ZSBtb2RlCi0gKiAtIE90aGVyIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIDIyMDUwLCAzMjAwMCwgNDQxMDAsIGFuZCA0ODAwMC4KLSAqCi0gKiBOYXRpdmUgbW9kZSBpbmRpY2F0ZXMgdGhhdCBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCB3aXRoIHRoZQotICogc2FtcGxpbmcgcmF0ZSBhdCB0aGUgaW5wdXQuCi0gKiBUaGUgc2FtcGxpbmcgcmF0ZSBtdXN0IG5vdCBjaGFuZ2UgZHVyaW5nIGVuY29kaW5nLgotICovCi0KLQl1MTYgICAgICAgICAgY2hhbm5lbF9jZmc7Ci0vKiBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gZW5jb2RlLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBOYXRpdmUgbW9kZQotICogLSAxIC0tIE1vbm8KLSAqIC0gMiAtLSBTdGVyZW8KLSAqIC0gT3RoZXIgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLgotICoKLSAqIE5hdGl2ZSBtb2RlIGluZGljYXRlcyB0aGF0IGVuY29kaW5nIG11c3QgYmUgcGVyZm9ybWVkIHdpdGggdGhlCi0gKiBudW1iZXIgb2YgY2hhbm5lbHMgYXQgdGhlIGlucHV0LgotICogVGhlIG51bWJlciBvZiBjaGFubmVscyBtdXN0IG5vdCBjaGFuZ2UgZHVyaW5nIGVuY29kaW5nLgotICovCi0KLQl1MTYgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogUmVzZXJ2ZWQuIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCi0JfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FNUl9XQl9QTFVTX1YyICAgICAgICAgICAgICAgMHgwMDAxMERBOQotCi1zdHJ1Y3QgYXNtX2FtcndicGx1c19mbXRfYmxrX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF9tZWRpYV9mbXRfdXBkYXRlX3YyIGZtdGJsazsKLQl1MzIgICAgICAgICAgYW1yX2ZyYW1lX2ZtdDsKLS8qIEFNUiBmcmFtZSBmb3JtYXQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSA2IC0tIFRyYW5zcG9ydCBJbnRlcmZhY2UgRm9ybWF0IChUSUYpCi0gKiAtIEFueSBvdGhlciB2YWx1ZSAtLSBGaWxlIHN0b3JhZ2UgZm9ybWF0IChGU0YpCi0gKgotICogVElGIHN0cmVhbSBjb250YWlucyAyLWJ5dGUgaGVhZGVyIGZvciBlYWNoIGZyYW1lIHdpdGhpbiB0aGUKLSAqIHN1cGVyZnJhbWUuIEZTRiBzdHJlYW0gY29udGFpbnMgb25lIDItYnl0ZSBoZWFkZXIgcGVyIHN1cGVyZnJhbWUuCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FDMyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERFRQotI2RlZmluZSBBU01fTUVESUFfRk1UX0VBQzMgICAgICAgICAgICAgICAgICAgMHgwMDAxMERFRgotI2RlZmluZSBBU01fTUVESUFfRk1UX0RUUyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEQ4OAotI2RlZmluZSBBU01fTUVESUFfRk1UX01QMiAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERFOQotI2RlZmluZSBBU01fTUVESUFfRk1UX0ZMQUMgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMxNgotI2RlZmluZSBBU01fTUVESUFfRk1UX0FMQUMgICAgICAgICAgICAgICAgICAgMHgwMDAxMkYzMQotI2RlZmluZSBBU01fTUVESUFfRk1UX1ZPUkJJUyAgICAgICAgICAgICAgICAgMHgwMDAxMEMxNQotI2RlZmluZSBBU01fTUVESUFfRk1UX0FQRSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMkYzMgotI2RlZmluZSBBU01fTUVESUFfRk1UX0RTRCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMkYzRQotI2RlZmluZSBBU01fTUVESUFfRk1UX1RSVUVIRCAgICAgICAgICAgICAgICAgMHgwMDAxMzIxNQotLyogMHgwIGlzIHVzZWQgZm9yIGZvbWF0IElEIHNpbmNlIEFEU1AgZHluYW1pY2FsbHkgZGV0ZXJtaW5lcyB0aGUKLSAqIGZvcm1hdCBlbmNhcHN1bGF0ZWQgaW4gdGhlIElFQzYxOTM3IChjb21wcmVzc2VkKSBvciBJRUM2MDk1OAotICogKHBjbSkgcGFja2V0cy4KLSAqLwotI2RlZmluZSBBU01fTUVESUFfRk1UX0lFQyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotCi0vKiBNZWRpYSBmb3JtYXQgSUQgZm9yIGFkYXB0aXZlIHRyYW5zZm9ybSBhY291c3RpYyBjb2RpbmcuIFRoaXMKLSAqIElEIGlzIHVzZWQgYnkgdGhlICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQgY29tbWFuZAotICogb25seS4KLSAqLwotCi0jZGVmaW5lIEFTTV9NRURJQV9GTVRfQVRSQUMgICAgICAgICAgICAgICAgICAweDAwMDEwRDg5Ci0KLS8qIE1lZGlhIGZvcm1hdCBJRCBmb3IgbWV0YWRhdGEtZW5oYW5jZWQgYXVkaW8gdHJhbnNtaXNzaW9uLgotICogVGhpcyBJRCBpcyB1c2VkIGJ5IHRoZSAjQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VECi0gKiBjb21tYW5kIG9ubHkuCi0gKi8KLQotI2RlZmluZSBBU01fTUVESUFfRk1UX01BVCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEQ4QQotCi0vKiAgYWRzcF9tZWRpYV9mbXQuaCAqLwotCi0jZGVmaW5lIEFTTV9EQVRBX0NNRF9XUklURV9WMiAweDAwMDEwREFCCi0KLXN0cnVjdCBhc21fZGF0YV9jbWRfd3JpdGVfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7Ci0vKiBUaGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuCi0gKiA2NCBiaXQgYWRkcmVzcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcwotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9tc3c7Ci0vKiBUaGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuCi0gKiA2NCBiaXQgYWRkcmVzcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcy4KLSAqIC1BZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSBkZWNvZGVkLgotICogVGhlIGJ1ZmZlciBzaG91bGQgYmUgYWxpZ25lZCB0byBhIDMyIGJ5dGUgYm91bmRhcnkuCi0gKiAtSW4gdGhlIGNhc2Ugb2YgMzIgYml0IFNoYXJlZCBtZW1vcnkgYWRkcmVzcywgbXN3IGZpZWxkIG11c3QKLSAqIC1iZSBzZXQgdG8gemVyby4KLSAqIC1JbiB0aGUgY2FzZSBvZiAzNiBiaXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBiaXQgMzEgdG8gYml0IDQKLSAqIC1vZiBtc3cgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgRFNQIHRocm91Z2gKLSAqIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kCi0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBidWZfc2l6ZTsKLS8qIE51bWJlciBvZiB2YWxpZCBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlciBmb3IgZGVjb2RpbmcuIFRoZQotICogZmlyc3QgYnl0ZSBzdGFydHMgYXQgYnVmX2FkZHIuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHNlcV9pZDsKLQkvKiBPcHRpb25hbCBidWZmZXIgc2VxdWVuY2UgSUQuICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbHN3OwotLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCi0gKiBmaXJzdCBidWZmZXIgc2FtcGxlLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbXN3OwotLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCi0gKiBmaXJzdCBidWZmZXIgc2FtcGxlLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBmbGFnczsKLS8qIEJpdGZpZWxkIG9mIGZsYWdzLgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDMxOgotICogLSAxIC0tIFZhbGlkIHRpbWVzdGFtcC4KLSAqIC0gMCAtLSBJbnZhbGlkIHRpbWVzdGFtcC4KLSAqIC0gVXNlICNBU01fQklUX01BU0tJTUVTVEFNUF9WQUxJRF9GTEFHIGFzIHRoZSBiaXRtYXNrIGFuZAotICogI0FTTV9TSElGVElNRVNUQU1QX1ZBTElEX0ZMQUcgYXMgdGhlIHNoaWZ0IHZhbHVlIHRvIHNldCB0aGlzIGJpdC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMDoKLSAqIC0gMSAtLSBMYXN0IGJ1ZmZlci4KLSAqIC0gMCAtLSBOb3QgdGhlIGxhc3QgYnVmZmVyLgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAyOToKLSAqIC0gMSAtLSBDb250aW51ZSB0aGUgdGltZXN0YW1wIGZyb20gdGhlIHByZXZpb3VzIGJ1ZmZlci4KLSAqIC0gMCAtLSBUaW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIG5vdCByZWxhdGVkCi0gKiB0byB0aGUgdGltZXN0YW1wIG9mIHRoZSBwcmV2aW91cyBidWZmZXIuCi0gKiAtIFVzZSAjQVNNX0JJVF9NQVNLU19DT05USU5VRV9GTEFHIGFuZCAjQVNNX1NISUZUU19DT05USU5VRV9GTEFHCi0gKiB0byBzZXQgdGhpcyBiaXQuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDQ6Ci0gKiAtIDEgLS0gRW5kIG9mIHRoZSBmcmFtZS4KLSAqIC0gMCAtLSBOb3QgdGhlIGVuZCBvZiBmcmFtZSwgb3IgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3Qga25vd24uCi0gKiAtIFVzZSAjQVNNX0JJVF9NQVNLX0VPRl9GTEFHIGFzIHRoZSBiaXRtYXNrIGFuZCAjQVNNX1NISUZUX0VPRl9GTEFHCi0gKiBhcyB0aGUgc2hpZnQgdmFsdWUgdG8gc2V0IHRoaXMgYml0LgotICoKLSAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBiZSBzZXQgdG8gMC4KLSAqCi0gKiBJZiBiaXQgMzE9MCBhbmQgYml0IDI5PTE6IFRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbgotICogdGhpcyBidWZmZXIgY29udGludWVzIGZyb20gdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzYW1wbGUgaW4KLSAqIHRoZSBwcmV2aW91cyBidWZmZXIuIElmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGJ1ZmZlciAoaS5lLiwgdGhpcwotICogaXMgdGhlIGZpcnN0IGJ1ZmZlciBzZW50IGFmdGVyIG9wZW5pbmcgdGhlIHN0cmVhbSBvciBhZnRlciBhCi0gKiBmbHVzaCBvcGVyYXRpb24pLCBvciBpZiB0aGUgcHJldmlvdXMgYnVmZmVyIGRvZXMgbm90IGhhdmUgYSB2YWxpZAotICogdGltZXN0YW1wLCB0aGUgc2FtcGxlcyBpbiB0aGUgY3VycmVudCBidWZmZXIgYWxzbyBkbyBub3QgaGF2ZSBhCi0gKiB2YWxpZCB0aW1lc3RhbXAuIFRoZXkgYXJlIHBsYXllZCBvdXQgYXMgc29vbiBhcyBwb3NzaWJsZS4KLSAqCi0gKgotICogSWYgYml0IDMxPTAgYW5kIGJpdCAyOT0wOiBObyB0aW1lc3RhbXAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogZmlyc3Qgc2FtcGxlIGluIHRoaXMgYnVmZmVyLiBUaGUgc2FtcGxlcyBhcmUgcGxheWVkIG91dCBhcyBzb29uCi0gKiBhcyBwb3NzaWJsZS4KLSAqCi0gKgotICogSWYgYml0IDMxPTEgYW5kIGJpdCAyOSBpcyBpZ25vcmVkOiBUaGUgdGltZXN0YW1wIHNwZWNpZmllZCBpbgotICogdGhpcyBwYXlsb2FkIGlzIGhvbm9yZWQuCi0gKgotICoKLSAqIElmIGJpdCAzMD0wOiBOb3QgdGhlIGxhc3QgYnVmZmVyIGluIHRoZSBzdHJlYW0uIFRoaXMgaXMgdXNlZnVsCi0gKiBpbiByZW1vdmluZyB0cmFpbGluZyBzYW1wbGVzLgotICoKLSAqCi0gKiBGb3IgYml0IDQ6IFRoZSBjbGllbnQgY2FuIHNldCB0aGlzIGZsYWcgZm9yIGV2ZXJ5IGJ1ZmZlciBzZW50IGluCi0gKiB3aGljaCB0aGUgbGFzdCBieXRlIGlzIHRoZSBlbmQgb2YgYSBmcmFtZS4gSWYgdGhpcyBmbGFnIGlzIHNldCwKLSAqIHRoZSBidWZmZXIgY2FuIGNvbnRhaW4gZGF0YSBmcm9tIG11bHRpcGxlIGZyYW1lcywgYnV0IGl0IHNob3VsZAotICogYWx3YXlzIGVuZCBhdCBhIGZyYW1lIGJvdW5kYXJ5LiBSZXN0cmljdGlvbnMgYWxsb3cgdGhlIGFEU1AgdG8KLSAqIGRldGVjdCBhbiBlbmQgb2YgZnJhbWUgd2l0aG91dCByZXF1aXJpbmcgYWRkaXRpb25hbCBwcm9jZXNzaW5nLgotICovCi0KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX1JFQURfVjIgMHgwMDAxMERBQwotCi1zdHJ1Y3QgYXNtX2RhdGFfY21kX3JlYWRfdjIgewotCXN0cnVjdCBhcHJfaGRyICAgICAgIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7Ci0vKiB0aGUgNjQgYml0IGFkZHJlc3MgbXN3LWxzdyBzaG91bGQgYmUgYSB2YWxpZCBtYXBwZWQgYWRkcmVzcwotICogYW5kIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzCi0gKi8KLQotCi0JdTMyICAgICAgICAgICAgICAgICAgYnVmX2FkZHJfbXN3OwotLyogdGhlIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgc2hvdWxkIGJlIGEgdmFsaWQgbWFwcGVkIGFkZHJlc3MKLSAqIGFuZCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiAzMiBieXRlcy4KLSAqIC0gQWRkcmVzcyBvZiB0aGUgYnVmZmVyIHdoZXJlIHRoZSBEU1AgcHV0cyB0aGUgZW5jb2RlZCBkYXRhLAotICogcG90ZW50aWFsbHksIGF0IGFuIG9mZnNldCBzcGVjaWZpZWQgYnkgdGhlIHVPZmZzZXQgZmllbGQgaW4KLSAqIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSBzdHJ1Y3R1cmUuIFRoZSBidWZmZXIgc2hvdWxkIGJlIGFsaWduZWQKLSAqIHRvIGEgMzIgYnl0ZSBib3VuZGFyeS4KLSAqIC0gSW4gdGhlIGNhc2Ugb2YgMzIgYml0IFNoYXJlZCBtZW1vcnkgYWRkcmVzcywgbXN3IGZpZWxkIG11c3QKLSAqIC0gYmUgc2V0IHRvIHplcm8uCi0gKiAtIEluIHRoZSBjYXNlIG9mIDM2IGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIGJpdCAzMSB0byBiaXQKLSAqIC0gNCBvZiBtc3cgbXVzdCBiZSBzZXQgdG8gemVyby4KLSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotLyogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgRFNQIHRocm91Z2gKLSAqIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBidWZfc2l6ZTsKLS8qIE51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHRoZSBhRFNQIHRvIHdyaXRlLiBUaGUgYURTUAotICogc3RhcnRzIHdyaXRpbmcgZnJvbSBidWZfYWRkci4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgc2VxX2lkOwotCS8qIE9wdGlvbmFsIGJ1ZmZlciBzZXF1ZW5jZSBJRC4gKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX0VPUyAgICAgICAgICAgICAgIDB4MDAwMTBCREIKLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TICAgIDB4MDAwMTBDMUMKLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfRU9TICAgICAgICAgICAgIDB4MDAwMTBCREQKLQotI2RlZmluZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyIDB4MDAwMTBEOTkKLXN0cnVjdCBhc21fZGF0YV9ldmVudF93cml0ZV9kb25lX3YyIHsKLQl1MzIgICAgICAgICAgICAgICAgICBidWZfYWRkcl9sc3c7Ci0JLyogbHN3IG9mIHRoZSA2NCBiaXQgYWRkcmVzcyAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKLQkvKiBtc3cgb2YgdGhlIDY0IGJpdCBhZGRyZXNzLiBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBjbGllbnQgaW4KLQkgKiBBU01fREFUQV9DTURfV1JJVEVfVjIgY29tbWFuZC4KLQkgKi8KLQl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLQkvKiBtZW1vcnkgbWFwIGhhbmRsZSBpbiB0aGUgQVNNX0RBVEFfQ01EX1dSSVRFX1YyICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0vKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUKLSAqIHJlZmVyZW5jZWQgYnVmZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25zdW1lZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IFJlZmVyIHRvIEB4aHlwZXJyZWZ7UTMsW1EzXX0KLSAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjIgMHgwMDAxMEQ5QQotCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBmcmFtZSBtZXRhZGF0YSBmbGFnIGJpdG1hc2suKi8KLSNkZWZpbmUgQVNNX0JJVF9NQVNLX0ZSQU1FX01FVEFEQVRBX0ZMQUcgKDB4NDAwMDAwMDBVTCkKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgZnJhbWUgbWV0YWRhdGEgZmxhZyBzaGlmdCB2YWx1ZS4gKi8KLSNkZWZpbmUgQVNNX1NISUZUX0ZSQU1FX01FVEFEQVRBX0ZMQUcgMzAKLQotc3RydWN0IGFzbV9kYXRhX2V2ZW50X3JlYWRfZG9uZV92MiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOwotLyogU3RhdHVzIG1lc3NhZ2UgKGVycm9yIGNvZGUpLgotICogU3VwcG9ydGVkIHZhbHVlczogUmVmZXIgdG8gQHhoeXBlcnJlZntRMyxbUTNdfQotICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX2xzdzsKLS8qIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgaXMgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuIDY0IGJpdAotICogYWRkcmVzcyBpcyBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzLgotICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIGJ1Zl9hZGRyX21zdzsKLS8qIDY0IGJpdCBhZGRyZXNzIG1zdy1sc3cgaXMgYSB2YWxpZCwgbWFwcGVkIGFkZHJlc3MuIDY0IGJpdAotICogYWRkcmVzcyBpcyBhIG11bHRpcGxlIG9mIDMyIGJ5dGVzLgotICoKLSAqIC1TYW1lIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiBBU01fREFUQV9DTURfUkVBRF9WMgotICogLUluIHRoZSBjYXNlIG9mIDMyIGJpdCBTaGFyZWQgbWVtb3J5IGFkZHJlc3MsIG1zdyBmaWVsZCBpcyBzZXQgdG8KLSAqIHplcm8uCi0gKiAtSW4gdGhlIGNhc2Ugb2YgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0IDMxIHRvIGJpdCA0Ci0gKiAtb2YgbXN3IGlzIHNldCB0byB6ZXJvLgotICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotLyogbWVtb3J5IG1hcCBoYW5kbGUgaW4gdGhlIEFTTV9EQVRBX0NNRF9SRUFEX1YyICAqLwotCi11MzIgICAgICAgICAgICAgICAgICBlbmNfZnJhbWVzb3RhbF9zaXplOwotLyogVG90YWwgc2l6ZSBvZiB0aGUgZW5jb2RlZCBmcmFtZXMgaW4gYnl0ZXMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiA+MAotICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIG9mZnNldDsKLS8qIE9mZnNldCAoZnJvbSBidWZfYWRkcikgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpcnN0IGVuY29kZWQKLSAqIGZyYW1lLiBBbGwgZW5jb2RlZCBmcmFtZXMgYXJlIGNvbnNlY3V0aXZlLCBzdGFydGluZyBmcm9tIHRoaXMKLSAqIG9mZnNldC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAotICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9sc3c7Ci0vKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgc2Vzc2lvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcyBvZgotICogdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgYnVmZmVyLiBJZiBCaXQgNSBvZiBtb2RlX2ZsYWdzIGZsYWcgb2YKLSAqIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9WMiBpcyAxIHRoZW4gdGhlIDY0IGJpdCB0aW1lc3RhbXAgaXMKLSAqIGFic29sdXRlIGNhcHR1cmUgdGltZSBvdGhlcndpc2UgaXQgaXMgcmVsYXRpdmUgc2Vzc2lvbiB0aW1lLiBUaGUKLSAqIGFic29sdXRlIHRpbWVzdGFtcCBkb2Vzbid0IHJlc2V0IHVubGVzcyB0aGUgc3lzdGVtIGlzIHJlc2V0LgotICovCi0KLQotdTMyICAgICAgICAgICAgICAgICAgdGltZXN0YW1wX21zdzsKLS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzIG9mCi0gKiB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoZSBidWZmZXIuCi0gKi8KLQotCi11MzIgICAgICAgICAgICAgICAgICBmbGFnczsKLS8qIEJpdGZpZWxkIG9mIGZsYWdzLiBCaXQgMzAgaW5kaWNhdGVzIHdoZXRoZXIgZnJhbWUgbWV0YWRhdGEgaXMKLSAqIHByZXNlbnQuIElmIGZyYW1lIG1ldGFkYXRhIGlzIHByZXNlbnQsIG51bV9mcmFtZXMgY29uc2VjdXRpdmUKLSAqIGluc3RhbmNlcyBvZiBAeGh5cGVycmVme2hkcjpGcmFtZU1ldGFEYXRhLEZyYW1lIG1ldGFkYXRhfSBzdGFydAotICogYXQgdGhlIGJ1ZmZlciBhZGRyZXNzLgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDMxOgotICogLSAxIC0tIFRpbWVzdGFtcCBpcyB2YWxpZC4KLSAqIC0gMCAtLSBUaW1lc3RhbXAgaXMgaW52YWxpZC4KLSAqIC0gVXNlICNBU01fQklUX01BU0tJTUVTVEFNUF9WQUxJRF9GTEFHIGFuZAotICogI0FTTV9TSElGVElNRVNUQU1QX1ZBTElEX0ZMQUcgdG8gc2V0IHRoaXMgYml0LgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMDoKLSAqIC0gMSAtLSBGcmFtZSBtZXRhZGF0YSBpcyBwcmVzZW50LgotICogLSAwIC0tIEZyYW1lIG1ldGFkYXRhIGlzIGFic2VudC4KLSAqIC0gVXNlICNBU01fQklUX01BU0tfRlJBTUVfTUVUQURBVEFfRkxBRyBhbmQKLSAqICNBU01fU0hJRlRfRlJBTUVfTUVUQURBVEFfRkxBRyB0byBzZXQgdGhpcyBiaXQuCi0gKgotICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyB0aGUgYURTUCBzZXRzIHRoZW0gdG8gMC4KLSAqLwotCi11MzIgICAgICAgICAgICAgICAgICBudW1fZnJhbWVzOwotLyogTnVtYmVyIG9mIGVuY29kZWQgZnJhbWVzIGluIHRoZSBidWZmZXIuICovCi0KLXUzMiAgICAgICAgICAgICAgICAgIHNlcV9pZDsKLS8qIE9wdGlvbmFsIGJ1ZmZlciBzZXF1ZW5jZSBJRC4JKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fZGF0YV9yZWFkX2J1Zl9tZXRhZGF0YV92MiB7Ci0JdTMyICAgICAgICAgIG9mZnNldDsKLS8qIE9mZnNldCBmcm9tIGJ1Zl9hZGRyIGluICNBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfUEFZTE9BRCB0bwotICogdGhlIGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1ldGFkYXRhLgotICogU3VwcG9ydGVkIHZhbHVlczogPiAwCi0gKi8KLQotdTMyICAgICAgICAgIGZybV9zaXplOwotLyogU2l6ZSBvZiB0aGUgZW5jb2RlZCBmcmFtZSBpbiBieXRlcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAotICovCi0KLXUzMiAgICAgICAgICBudW1fZW5jb2RlZF9wY21fc2FtcGxlczsKLS8qIE51bWJlciBvZiBlbmNvZGVkIFBDTSBzYW1wbGVzIChwZXIgY2hhbm5lbCkgaW4gdGhlIGZyYW1lCi0gKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXRhZGF0YS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ID4gMAotICovCi0KLXUzMiAgICAgICAgICB0aW1lc3RhbXBfbHN3OwotLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHNlc3Npb24gdGltZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlCi0gKiBmaXJzdCBzYW1wbGUgZm9yIHRoaXMgZnJhbWUuCi0gKiBJZiBCaXQgNSBvZiBtb2RlX2ZsYWdzIGZsYWcgb2YgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEX1YyIGlzIDEKLSAqIHRoZW4gdGhlIDY0IGJpdCB0aW1lc3RhbXAgaXMgYWJzb2x1dGUgY2FwdHVyZSB0aW1lIG90aGVyd2lzZSBpdAotICogaXMgcmVsYXRpdmUgc2Vzc2lvbiB0aW1lLiBUaGUgYWJzb2x1dGUgdGltZXN0YW1wIGRvZXNuJ3QgcmVzZXQKLSAqIHVubGVzcyB0aGUgc3lzdGVtIGlzIHJlc2V0LgotICovCi0KLQotdTMyICAgICAgICAgIHRpbWVzdGFtcF9tc3c7Ci0vKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgc2Vzc2lvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcyBvZiB0aGUKLSAqIGZpcnN0IHNhbXBsZSBmb3IgdGhpcyBmcmFtZS4KLSAqLwotCi11MzIgICAgICAgICAgZmxhZ3M7Ci0vKiBGcmFtZSBmbGFncy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMToKLSAqIC0gMSAtLSBUaW1lIHN0YW1wIGlzIHZhbGlkCi0gKiAtIDAgLS0gVGltZSBzdGFtcCBpcyBub3QgdmFsaWQKLSAqIC0gQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyB0aGUgYURTUCBzZXRzIHRoZW0gdG8gMC4KLSAqLwotfSBfX3BhY2tlZDsKLQotLyogTm90aWZpZXMgdGhlIGNsaWVudCBvZiBhIGNoYW5nZSBpbiB0aGUgZGF0YSBzYW1wbGluZyByYXRlIG9yCi0gKiBDaGFubmVsIG1vZGUuIFRoaXMgZXZlbnQgaXMgcmFpc2VkIGJ5IHRoZSBkZWNvZGVyIHNlcnZpY2UuIFRoZQotICogZXZlbnQgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBtb2RlIGZsYWdzIG9mCi0gKiAjQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMiBvcgotICogI0FTTV9TVFJFQU1fQ01EX09QRU5fUkVBRFdSSVRFX1YyLiAtIFRoZSBkZWNvZGVyIGRldGVjdHMgYSBjaGFuZ2UKLSAqIGluIHRoZSBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBudW1iZXIvcG9zaXRpb25pbmcgb2YKLSAqIG91dHB1dCBjaGFubmVscywgb3IgaWYgaXQgaXMgdGhlIGZpcnN0IGZyYW1lIGRlY29kZWQuVGhlIG5ldwotICogc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBuZXcgY2hhbm5lbCBjb25maWd1cmF0aW9uIGlzCi0gKiBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IGFzeW5jaHJvbm91c2x5LgotICovCi0KLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSAweDAwMDEwQzY1Ci0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSBldmVudC4KLSAqIFRoaXMgZXZlbnQgaXMgcmFpc2VkIHdoZW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBib3RoIHRydWU6Ci0gKiAtIFRoZSBldmVudCBpcyBlbmFibGVkIHRocm91Z2ggdGhlIG1vZGVfZmxhZ3Mgb2YKLSAqICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX1YyIG9yCi0gKiAjQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEVfVjIuIC0gVGhlIGRlY29kZXIgZGV0ZWN0cyBhIGNoYW5nZQotICogaW4gZWl0aGVyIHRoZSBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5IG9yIHRoZSBudW1iZXIvcG9zaXRpb25pbmcKLSAqIG9mIG91dHB1dCBjaGFubmVscywgb3IgaWYgaXQgaXMgdGhlIGZpcnN0IGZyYW1lIGRlY29kZWQuCi0gKiBUaGlzIGV2ZW50IGlzIG5vdCByYWlzZWQgKGV2ZW4gaWYgZW5hYmxlZCkgaWYgdGhlIGRlY29kZXIgaXMKLSAqIE1JREksIGJlY2F1c2UKLSAqLwotCi0KLXN0cnVjdCBhc21fZGF0YV9ldmVudF9zcl9jbV9jaGFuZ2Vfbm90aWZ5IHsKLQl1MzIgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZTsKLS8qIE5ldyBzYW1wbGluZyByYXRlIChpbiBIZXJ0eikgYWZ0ZXIgZGV0ZWN0aW5nIGEgY2hhbmdlIGluIHRoZQotICogYml0c3RyZWFtLgotICogU3VwcG9ydGVkIHZhbHVlczogMjAwMCB0byA0ODAwMAotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBOZXcgbnVtYmVyIG9mIGNoYW5uZWxzIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUKLSAqIGJpdHN0cmVhbS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAotICovCi0KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIDAuKi8KLQotCXU4ICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZ1s4XTsKLQotfSBfX3BhY2tlZDsKLQotLyogTm90aWZpZXMgdGhlIGNsaWVudCBvZiBhIGRhdGEgc2FtcGxpbmcgcmF0ZSBvciBjaGFubmVsIG1vZGUKLSAqIGNoYW5nZS4gVGhpcyBldmVudCBpcyByYWlzZWQgYnkgdGhlIGVuY29kZXIgc2VydmljZS4KLSAqIFRoaXMgZXZlbnQgaXMgcmFpc2VkIHdoZW4gOgotICogLSBOYXRpdmUgbW9kZSBlbmNvZGluZyB3YXMgcmVxdWVzdGVkIGluIHRoZSBlbmNvZGVyCi0gKiBjb25maWd1cmF0aW9uIChpLmUuLCB0aGUgY2hhbm5lbCBudW1iZXIgd2FzIDApLCB0aGUgc2FtcGxlIHJhdGUKLSAqIHdhcyAwLCBvciBib3RoIHdlcmUgMC4KLSAqCi0gKiAtIFRoZSBpbnB1dCBkYXRhIGZyYW1lIGF0IHRoZSBlbmNvZGVyIGlzIHRoZSBmaXJzdCBvbmUsIG9yIHRoZQotICogc2FtcGxpbmcgcmF0ZS9jaGFubmVsIG1vZGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHByZXZpb3VzIGlucHV0Ci0gKiBkYXRhIGZyYW1lLgotICoKLSAqLwotI2RlZmluZSBBU01fREFUQV9FVkVOVF9FTkNfU1JfQ01fQ0hBTkdFX05PVElGWSAweDAwMDEwQkRFCi0KLXN0cnVjdCBhc21fZGF0YV9ldmVudF9lbmNfc3JfY21fY2hhbmdlX25vdGlmeSB7Ci0JdTMyICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGU7Ci0vKiBOZXcgc2FtcGxpbmcgcmF0ZSAoaW4gSGVydHopIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUKLSAqIGlucHV0IGRhdGEuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAyMDAwIHRvIDQ4MDAwCi0gKi8KLQotCi0JdTE2ICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOwotLyogTmV3IG51bWJlciBvZiBjaGFubmVscyBhZnRlciBkZXRlY3RpbmcgYSBjaGFuZ2UgaW4gdGhlIGlucHV0Ci0gKiBkYXRhLiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDgKLSAqLwotCi0KLQl1MTYgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7Ci0vKiBOZXcgYml0cyBwZXIgc2FtcGxlIGFmdGVyIGRldGVjdGluZyBhIGNoYW5nZSBpbiB0aGUgaW5wdXQKLSAqIGRhdGEuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQKLSAqLwotCi0KLQl1OCAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmdbOF07Ci0KLX0gX19wYWNrZWQ7Ci0jZGVmaW5lIEFTTV9EQVRBX0NNRF9JRUNfNjA5NThfRlJBTUVfUkFURSAweDAwMDEwRDg3Ci0KLQotLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9EQVRBX0NNRF9JRUNfNjA5NThfRlJBTUVfUkFURSBjb21tYW5kLAotICogd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgSUVDIDYwOTU4IGZyYW1lIHJhdGUgb2YgYSBnaXZlbgotICogcGFja2V0aXplZCBhdWRpbyBzdHJlYW0uCi0gKi8KLQotc3RydWN0IGFzbV9kYXRhX2NtZF9pZWNfNjA5NThfZnJhbWVfcmF0ZSB7Ci0JdTMyICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZTsKLS8qIElFQyA2MDk1OCBmcmFtZSByYXRlIG9mIHRoZSBpbmNvbWluZyBJRUMgNjE5MzcgcGFja2V0aXplZCBzdHJlYW0uCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBBbnkgdmFsaWQgZnJhbWUgcmF0ZQotICovCi19IF9fcGFja2VkOwotCi0vKiBhZHNwX2FzbV9kYXRhX2NvbW1hbmRzLmgqLwotLyogRGVmaW5pdGlvbiBvZiB0aGUgc3RyZWFtIElEIGJpdG1hc2suKi8KLSNkZWZpbmUgQVNNX0JJVF9NQVNLX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAgKDB4MDAwMDAwRkZVTCkKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgc3RyZWFtIElEIHNoaWZ0IHZhbHVlLiovCi0jZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fSUQgICAgICAgICAgICAgICAgICAgIDAKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgc2Vzc2lvbiBJRCBiaXRtYXNrLiovCi0jZGVmaW5lIEFTTV9CSVRfTUFTS19TRVNTSU9OX0lEICAgICAgICAgICAgICAgICgweDAwMDBGRjAwVUwpCi0KLS8qIERlZmluaXRpb24gb2YgdGhlIHNlc3Npb24gSUQgc2hpZnQgdmFsdWUuKi8KLSNkZWZpbmUgQVNNX1NISUZUX1NFU1NJT05fSUQgICAgICAgICAgICAgICAgICAgOAotCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBzZXJ2aWNlIElEIGJpdG1hc2suKi8KLSNkZWZpbmUgQVNNX0JJVF9NQVNLX1NFUlZJQ0VfSUQgICAgICAgICAgICAgICAgKDB4MDBGRjAwMDBVTCkKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgc2VydmljZSBJRCBzaGlmdCB2YWx1ZS4qLwotI2RlZmluZSBBU01fU0hJRlRfU0VSVklDRV9JRCAgICAgICAgICAgICAgICAgICAxNgotCi0vKiBEZWZpbml0aW9uIG9mIHRoZSBkb21haW4gSUQgYml0bWFzay4qLwotI2RlZmluZSBBU01fQklUX01BU0tfRE9NQUlOX0lEICAgICAgICAgICAgICAgICgweEZGMDAwMDAwVUwpCi0KLS8qIERlZmluaXRpb24gb2YgdGhlIGRvbWFpbiBJRCBzaGlmdCB2YWx1ZS4qLwotI2RlZmluZSBBU01fU0hJRlRfRE9NQUlOX0lEICAgICAgICAgICAgICAgICAgICAyNAotCi0jZGVmaW5lIEFTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAgICAgICAgICAgICAgIDB4MDAwMTBEOTIKLSNkZWZpbmUgQVNNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TICAgICAweDAwMDEwRDkzCi0jZGVmaW5lIEFTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TICAgICAgICAgICAgICAweDAwMDEwRDk0Ci0KLS8qIGFkc3BfYXNtX3NlcnZpY2VfY29tbWFuZHMuaCAqLwotCi0jZGVmaW5lIEFTTV9NQVhfU0VTU0lPTl9JRCAgKDE1KQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBzZXNzaW9ucy4qLwotI2RlZmluZSBBU01fTUFYX05VTV9TRVNTSU9OUyAgICAgICAgICAgICAgICBBU01fTUFYX1NFU1NJT05fSUQKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyBwZXIgc2Vzc2lvbi4qLwotI2RlZmluZSBBU01fTUFYX1NUUkVBTVNfUEVSX1NFU1NJT04gKDgpCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjIgICAgICAgICAgICAgICAgICAgMHgwMDAxMERBQQotI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9JTU1FRElBVEUgIDAKLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVElNRV9SVU5fQVRfQUJTT0xVVEVJTUUgMQotI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9SRUxBVElWRUlNRSAyCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SVU5fU1RBUlRJTUVfUlVOX1dJVEhfREVMQVkgICAgIDMKLQotI2RlZmluZSBBU01fQklUX01BU0tfUlVOX1NUQVJUSU1FICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwM1VMKQotCi0vKiBCaXQgc2hpZnQgdmFsdWUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdGFydCB0aW1lIGZvciB0aGUKLSAqIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjIgY29tbWFuZC4KLSAqLwotI2RlZmluZSBBU01fU0hJRlRfUlVOX1NUQVJUSU1FIDAKLXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcnVuX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0vKiBTcGVjaWZpZXMgd2hldGhlciB0byBydW4gaW1tZWRpYXRlbHkgb3IgYXQgYSBzcGVjaWZpYwotICogcmVuZGVyaW5nIHRpbWUgb3Igd2l0aCBhIHNwZWNpZmllZCBkZWxheS4gUnVuIHdpdGggZGVsYXkgaXMKLSAqIHVzZWZ1bCBmb3IgZGVsYXlpbmcgaW4gY2FzZSBvZiBBU00gbG9vcGJhY2sgb3BlbmVkIHRocm91Z2gKLSAqIEFTTV9TVFJFQU1fQ01EX09QRU5fTE9PUEJBQ0tfVjIuIFVzZSAjQVNNX0JJVF9NQVNLX1JVTl9TVEFSVElNRQotICogYW5kICNBU01fU0hJRlRfUlVOX1NUQVJUSU1FIHRvIHNldCB0aGlzIDItYml0IGZsYWcuCi0gKgotICoKLSAqQml0cyAwIGFuZCAxIGNhbiB0YWtlIG9uZSBvZiBmb3VyIHBvc3NpYmxlIHZhbHVlczoKLSAqCi0gKi0gI0FTTV9TRVNTSU9OX0NNRF9SVU5fU1RBUlRJTUVfUlVOX0lNTUVESUFURQotICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9BQlNPTFVURUlNRQotICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9BVF9SRUxBVElWRUlNRQotICotICNBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9XSVRIX0RFTEFZCi0gKgotICpBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQ7IGNsaWVudHMgbXVzdCBzZXQgdGhlbSB0byB6ZXJvLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICB0aW1lX2xzdzsKLS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHRpbWUgaW4gbWljcm9zZWNvbmRzIHVzZWQgdG8gYWxpZ24gdGhlCi0gKiBzZXNzaW9uIG9yaWdpbiB0aW1lLiBXaGVuIGJpdHMgMC0xIG9mIGZsYWdzIGlzCi0gKiBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUX1JVTl9XSVRIX0RFTEFZLCB0aW1lIGxzdyBpcyB0aGUgbHN3IG9mCi0gKiB0aGUgZGVsYXkgaW4gdXMuIEZvciBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUX1JVTl9XSVRIX0RFTEFZLAotICogbWF4aW11bSB2YWx1ZSBvZiB0aGUgNjQgYml0IGRlbGF5IGlzIDE1MCBtcy4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgdGltZV9tc3c7Ci0vKiBVcHBlciAzMiBiaXRzIG9mIHRoZSB0aW1lIGluIG1pY3Jvc2Vjb25kcyB1c2VkIHRvIGFsaWduIHRoZQotICogc2Vzc2lvbiBvcmlnaW4gdGltZS4gV2hlbiBiaXRzIDAtMSBvZiBmbGFncyBpcwotICogQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVF9SVU5fV0lUSF9ERUxBWSwgdGltZSBtc3cgaXMgdGhlIG1zdyBvZgotICogdGhlIGRlbGF5IGluIHVzLiBGb3IgQVNNX1NFU1NJT05fQ01EX1JVTl9TVEFSVF9SVU5fV0lUSF9ERUxBWSwKLSAqIG1heGltdW0gdmFsdWUgb2YgdGhlIDY0IGJpdCBkZWxheSBpcyAxNTAgbXMuCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUEFVU0UgMHgwMDAxMEJEMwotI2RlZmluZSBBU01fU0VTU0lPTl9DTURfU1VTUEVORCAweDAwMDEwREVDCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9HRVRfU0VTU0lPTlRJTUVfVjMgMHgwMDAxMEQ5RAotI2RlZmluZSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SX1JYX1VOREVSRkxPV19FVkVOVFMgMHgwMDAxMEJENQotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX3Jnc3RyX3J4X3VuZGVyZmxvdyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgYSBjbGllbnQgaXMgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhbiBSeAotICogc2Vzc2lvbiB1bmRlcmZsb3dzLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBEbyBub3Qgc2VuZCB1bmRlcmZsb3cgZXZlbnRzCi0gKiAtIDEgLS0gU2VuZCB1bmRlcmZsb3cgZXZlbnRzCi0gKi8KLQl1MTYgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLQkvKiBSZXNlcnZlZC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9GT1JYX09WRVJGTE9XX0VWRU5UUyAweDAwMDEwQkQ2Ci0KLXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcmVneF9vdmVyZmxvdyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgYSBjbGllbnQgaXMgdG8gcmVjZWl2ZSBldmVudHMgd2hlbiBhIFR4Ci0gKiBzZXNzaW9uIG92ZXJmbG93cy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDAgLS0gRG8gbm90IHNlbmQgb3ZlcmZsb3cgZXZlbnRzCi0gKiAtIDEgLS0gU2VuZCBvdmVyZmxvdyBldmVudHMKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogUmVzZXJ2ZWQuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU0VTU0lPTl9FVkVOVF9SWF9VTkRFUkZMT1cgICAgICAgIDB4MDAwMTBDMTcKLSNkZWZpbmUgQVNNX1NFU1NJT05fRVZFTlRYX09WRVJGTE9XICAgICAgICAgICAweDAwMDEwQzE4Ci0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTlRJTUVfVjMgMHgwMDAxMEQ5RQotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fY21kcnNwX2dldF9zZXNzaW9udGltZV92MyB7Ci0JdTMyICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCS8qIFN0YXR1cyBtZXNzYWdlIChlcnJvciBjb2RlKS4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOiBSZWZlciB0byBAeGh5cGVycmVme1EzLFtRM119Ci0JICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzZXNzaW9udGltZV9sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLiovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBzZXNzaW9udGltZV9tc3c7Ci0JLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLiovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZXRpbWVfbHN3OwotLyogTG93ZXIgMzIgYml0cyBpbiBtaWNybyBzZWNvbmRzIG9mIHRoZSBhYnNvbHV0ZSB0aW1lIGF0IHdoaWNoCi0gKiB0aGUgKiBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJvdmUgc2Vzc2lvbiB0aW1lIGdldHMKLSAqIHJlbmRlcmVkICogdG8gaGFyZHdhcmUuIFRoaXMgYWJzb2x1dGUgdGltZSBtYXkgYmUgc2xpZ2h0bHkgaW4gdGhlCi0gKiBmdXR1cmUgb3IgcGFzdC4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZXRpbWVfbXN3OwotLyogVXBwZXIgMzIgYml0cyBpbiBtaWNybyBzZWNvbmRzIG9mIHRoZSBhYnNvbHV0ZSB0aW1lIGF0IHdoaWNoCi0gKiB0aGUgKiBzYW1wbGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJvdmUgc2Vzc2lvbiB0aW1lIGdldHMKLSAqIHJlbmRlcmVkIHRvICogaGFyZHdhcmUuIFRoaXMgYWJzb2x1dGUgdGltZSBtYXkgYmUgc2xpZ2h0bHkgaW4gdGhlCi0gKiBmdXR1cmUgb3IgcGFzdC4KLSAqLwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9BREpVU1RfU0VTU0lPTl9DTE9DS19WMiAgICAgMHgwMDAxMEQ5RgotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fY21kX2FkanVzdF9zZXNzaW9uX2Nsb2NrX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci11MzIgICAgICAgICAgICAgICAgICBhZGp1c3RpbWVfbHN3OwotLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgc2lnbmVkIDY0LWJpdCBxdWFudGl0eSB0aGF0IHNwZWNpZmllcyB0aGUKLSAqIGFkanVzdG1lbnQgdGltZSBpbiBtaWNyb3NlY29uZHMgdG8gdGhlIHNlc3Npb24gY2xvY2suCi0gKgotICogUG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIGFkdmFuY2VtZW50IG9mIHRoZSBzZXNzaW9uIGNsb2NrLgotICogTmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGRlbGF5IG9mIHRoZSBzZXNzaW9uIGNsb2NrLgotICovCi0KLQotCXUzMiAgICAgICAgICAgICAgICAgIGFkanVzdGltZV9tc3c7Ci0vKiBVcHBlciAzMiBiaXRzIG9mIHRoZSBzaWduZWQgNjQtYml0IHF1YW50aXR5IHRoYXQgc3BlY2lmaWVzCi0gKiB0aGUgYWRqdXN0bWVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcyB0byB0aGUgc2Vzc2lvbiBjbG9jay4KLSAqIFBvc2l0aXZlIHZhbHVlcyBpbmRpY2F0ZSBhZHZhbmNlbWVudCBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KLSAqIE5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KLSAqLwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRFJTUF9BREpVU1RfU0VTU0lPTl9DTE9DS19WMiAgICAweDAwMDEwREEwCi0KLXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRyc3BfYWRqdXN0X3Nlc3Npb25fY2xvY2tfdjIgewotCXUzMiAgICAgICAgICAgICAgICAgIHN0YXR1czsKLS8qIFN0YXR1cyBtZXNzYWdlIChlcnJvciBjb2RlKS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IFJlZmVyIHRvIEB4aHlwZXJyZWZ7UTMsW1EzXX0KLSAqIEFuIGVycm9yIG1lYW5zIHRoZSBzZXNzaW9uIGNsb2NrIGlzIG5vdCBhZGp1c3RlZC4gSW4gdGhpcyBjYXNlLAotICogdGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgaXJyZWxldmFudC4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBhY3R1YWxfYWRqdXN0aW1lX2xzdzsKLS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKLSAqIHRoZSBhY3R1YWwgYWRqdXN0bWVudCBpbiBtaWNyb3NlY29uZHMgcGVyZm9ybWVkIGJ5IHRoZSBhRFNQLgotICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgYWR2YW5jZW1lbnQgb2YgdGhlIHNlc3Npb24gY2xvY2suIEEKLSAqIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBhY3R1YWxfYWRqdXN0aW1lX21zdzsKLS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIHNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKLSAqIHRoZSBhY3R1YWwgYWRqdXN0bWVudCBpbiBtaWNyb3NlY29uZHMgcGVyZm9ybWVkIGJ5IHRoZSBhRFNQLgotICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgYWR2YW5jZW1lbnQgb2YgdGhlIHNlc3Npb24gY2xvY2suIEEKLSAqIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBkZWxheSBvZiB0aGUgc2Vzc2lvbiBjbG9jay4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBjbWRfbGF0ZW5jeV9sc3c7Ci0vKiBMb3dlciAzMiBiaXRzIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKLSAqIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWNyb3NlY29uZHMgdGFrZW4gdG8gcGVyZm9ybSB0aGUgc2Vzc2lvbgotICogY2xvY2sgYWRqdXN0bWVudC4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICBjbWRfbGF0ZW5jeV9tc3c7Ci0vKiBVcHBlciAzMiBiaXRzIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgcXVhbnRpdHkgdGhhdCBzcGVjaWZpZXMKLSAqIHRoZSBhbW91bnQgb2YgdGltZSBpbiBtaWNyb3NlY29uZHMgdGFrZW4gdG8gcGVyZm9ybSB0aGUgc2Vzc2lvbgotICogY2xvY2sgYWRqdXN0bWVudC4KLSAqLwotCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9HRVRfUEFUSF9ERUxBWV9WMgkgMHgwMDAxMERBRgotI2RlZmluZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1BBVEhfREVMQVlfVjIgMHgwMDAxMERCMAotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fY21kcnNwX2dldF9wYXRoX2RlbGF5X3YyIHsKLQl1MzIgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0vKiBTdGF0dXMgbWVzc2FnZSAoZXJyb3IgY29kZSkuIFdoZXRoZXIgdGhpcyBnZXQgZGVsYXkgb3BlcmF0aW9uCi0gKiBpcyBzdWNjZXNzZnVsIG9yIG5vdC4gRGVsYXkgdmFsdWUgaXMgdmFsaWQgb25seSBpZiBzdGF0dXMgaXMKLSAqIHN1Y2Nlc3MuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBSZWZlciB0byBAeGh5cGVycmVme1E1LFtRNV19Ci0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X2xzdzsKLQkvKiBVcHBlciAzMiBiaXRzIG9mIHRoZSBhRFNQIGRlbGF5IGluIG1pY3Jvc2Vjb25kcy4gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIGF1ZGlvX2RlbGF5X21zdzsKLQkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSBhRFNQIGRlbGF5ICBpbiBtaWNyb3NlY29uZHMuICovCi0KLX0gX19wYWNrZWQ7Ci0KLS8qIGFkc3BfYXNtX3Nlc3Npb25fY29tbWFuZC5oKi8KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9WMyAgICAgICAweDAwMDEwREIzCi0KLSNkZWZpbmUgQVNNX0xPV19MQVRFTkNZX1NUUkVBTV9TRVNTSU9OCQkJCTB4MTAwMDAwMDAKLQotI2RlZmluZSBBU01fVUxUUkFfTE9XX0xBVEVOQ1lfU1RSRUFNX1NFU1NJT04JCQkweDIwMDAwMDAwCi0KLSNkZWZpbmUgQVNNX1VMTF9QT1NUX1BST0NFU1NJTkdfU1RSRUFNX1NFU1NJT04JCQkweDQwMDAwMDAwCi0KLSNkZWZpbmUgQVNNX0xFR0FDWV9TVFJFQU1fU0VTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlX3YzIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCWhkcjsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKLS8qIE1vZGUgZmxhZ3MgdGhhdCBjb25maWd1cmUgdGhlIHN0cmVhbSB0byBub3RpZnkgdGhlIGNsaWVudAotICogd2hlbmV2ZXIgaXQgZGV0ZWN0cyBhbiBTUi9DTSBjaGFuZ2UgYXQgdGhlIGlucHV0IHRvIGl0cyBQT1BQLgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0cyAwIHRvIDE6Ci0gKiAtIFJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAyOgotICogLSAwIC0tIFNSL0NNIGNoYW5nZSBub3RpZmljYXRpb24gZXZlbnQgaXMgZGlzYWJsZWQuCi0gKiAtIDEgLS0gU1IvQ00gY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudCBpcyBlbmFibGVkLgotICogLSBVc2UgI0FTTV9CSVRfTUFTS19TUl9DTV9DSEFOR0VfTk9USUZZX0ZMQUcgYW5kCi0gKiAjQVNNX1NISUZUX1NSX0NNX0NIQU5HRV9OT1RJRllfRkxBRyB0byBzZXQgb3IgZ2V0IHRoaXMgYml0LgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGJpdCAzMToKLSAqIC0gMCAtLSBTdHJlYW0gdG8gYmUgb3BlbmVkIGluIG9uLUdhcGxlc3MgbW9kZS4KLSAqIC0gMSAtLSBTdHJlYW0gdG8gYmUgb3BlbmVkIGluIEdhcGxlc3MgbW9kZS4gSW4gR2FwbGVzcyBtb2RlLAotICogc3VjY2Vzc2l2ZSBzdHJlYW1zIG11c3QgYmUgb3BlbmVkIHdpdGggc2FtZSBzZXNzaW9uIElEIGJ1dAotICogZGlmZmVyZW50IHN0cmVhbSBJRHMuCi0gKgotICogLSBVc2UgI0FTTV9CSVRfTUFTS19HQVBMRVNTX01PREVfRkxBRyBhbmQKLSAqICNBU01fU0hJRlRfR0FQTEVTU19NT0RFX0ZMQUcgdG8gc2V0IG9yIGdldCB0aGlzIGJpdC4KLSAqCi0gKgotICogQG5vdGUxaGFuZyBNSURJIGFuZCBEVE1GIHN0cmVhbXMgY2Fubm90IGJlIG9wZW5lZCBpbiBHYXBsZXNzIG1vZGUuCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgICBzaW5rX2VuZHBvaW50eXBlOwotLyo8IFNpbmsgcG9pbnQgdHlwZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDAgLS0gRGV2aWNlIG1hdHJpeAotICogLSBPdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgotICoKLSAqIFRoZSBkZXZpY2UgbWF0cml4IGlzIHRoZSBnYXRld2F5IHRvIHRoZSBoYXJkd2FyZSBwb3J0cy4KLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKLS8qPCBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2IGFuZCAyNCBiaXRzIHBlciBzYW1wbGUKLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jb3BvX2lkOwotLyo8IFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mCi0gKiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLiA8aT5Ob25lPC9pPiBtZWFucyBubyBwb3N0cHJvY2Vzc2luZy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX0RFRkFVTFQKLSAqIC0gI0FTTV9TVFJFQU1fUE9TVFBST0NPUE9fSURfTUNIX1BFQUtfVk9MCi0gKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX05PTkUKLSAqCi0gKiBUaGlzIGZpZWxkIGNhbiBhbHNvIGJlIGVuYWJsZWQgdGhyb3VnaCBTZXRQYXJhbXMgZmxhZ3MuCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkZWNfZm10X2lkOwotLyo8IENvbmZpZ3VyYXRpb24gSUQgb2YgdGhlIGRlY29kZXIgbWVkaWEgZm9ybWF0LgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyCi0gKiAtICNBU01fTUVESUFfRk1UX0FEUENNCi0gKiAtICNBU01fTUVESUFfRk1UX01QMwotICogLSAjQVNNX01FRElBX0ZNVF9BQUNfVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfRE9MQllfQUFDCi0gKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0FNUldCX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0FNUl9XQl9QTFVTX1YyCi0gKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ19GUwotICogLSAjQVNNX01FRElBX0ZNVF9FVlJDQl9GUwotICogLSAjQVNNX01FRElBX0ZNVF9FVlJDV0JfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfU0JDCi0gKiAtICNBU01fTUVESUFfRk1UX1dNQV9WMTBQUk9fVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1Y5X1YyCi0gKiAtICNBU01fTUVESUFfRk1UX0FDMwotICogLSAjQVNNX01FRElBX0ZNVF9FQUMzCi0gKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUwotICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRlJfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfVk9SQklTCi0gKiAtICNBU01fTUVESUFfRk1UX0ZMQUMKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUxBQwotICogLSAjQVNNX01FRElBX0ZNVF9BUEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVMTF9NT0RFX1dSSVRFICAgIDB4MDAwMTBERDkKLQotLyogQml0bWFzayBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCi0jZGVmaW5lIEFTTV9CSVRfTUFTS19TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURSAweEUwMDAwMDAwVUwKLQotLyogQml0bWFzayBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCi0jZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURSAyOQotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVTSF9NT0RFX1JFQUQgIDB4MDAwMTBEREEKLQotI2RlZmluZSBBU01fQklUX01BU0tfU1RSRUFNX1BFUkZfRkxBR19QVVNIX01PREVfUkVBRCAweEUwMDAwMDAwVUwKLQotI2RlZmluZSBBU01fU0hJRlRfU1RSRUFNX1BFUkZfRkxBR19QVVNIX01PREVfUkVBRCAyOQotCi0jZGVmaW5lIEFTTV9EQVRBX0VWRU5UX1dBVEVSTUFSSyAweDAwMDEwRERCCi0KLXN0cnVjdCBhc21fc2hhcmVkX3Bvc2l0aW9uX2J1ZmZlciB7Ci0Jdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICBmcmFtZV9jb3VudGVyOwotLyogQ291bnRlciB1c2VkIHRvIGhhbmRsZSBpbnRlcnByb2Nlc3NvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzLgotICogV2hlbiBmcmFtZV9jb3VudGVyIGlzIDA6IHJlYWRfaW5kZXgsIHdhbGxfY2xvY2tfdXNfbHN3LCBhbmQKLSAqIHdhbGxfY2xvY2tfdXNfbXN3IGFyZSBpbnZhbGlkLgotICogU3VwcG9ydGVkIHZhbHVlczogPj0gMC4KLSAqLwotCi0Jdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICBpbmRleDsKLS8qIEluZGV4IGluIGJ5dGVzIGZyb20gd2hlcmUgdGhlIGFEU1AgaXMgcmVhZGluZy93cml0aW5nLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byBjaXJjdWxhciBidWZmZXIgc2l6ZSAtIDEKLSAqLwotCi0Jdm9sYXRpbGUgdWludDMyX3QgICAgICAgICAgICAgICB3YWxsX2Nsb2NrX3VzX2xzdzsKLS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCB3YWxsIGNsb2NrIHRpbWUgaW4gbWljcm9zZWNvbmRzIHdoZW4gdGhlCi0gKiByZWFkIGluZGV4IHdhcyB1cGRhdGVkLgotICogU3VwcG9ydGVkIHZhbHVlczogPj0gMAotICovCi0KLQl2b2xhdGlsZSB1aW50MzJfdCAgICAgICAgICAgICAgIHdhbGxfY2xvY2tfdXNfbXN3OwotLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQgYml0IHdhbGwgY2xvY2sgdGltZSBpbiBtaWNyb3NlY29uZHMgd2hlbiB0aGUKLSAqIHJlYWQgaW5kZXggd2FzIHVwZGF0ZWQKLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ID49IDAKLSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zaGFyZWRfd2F0ZXJtYXJrX2xldmVsIHsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICB3YXRlcm1hcmtfbGV2ZWxfYnl0ZXM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8gewotCXN0cnVjdCBhcHJfaGRyICAgICAgICAgIGhkcjsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOwotCXVpbnQxNl90ICAgICAgICAgICAgICAgIGVuZHBvaW50X3R5cGU7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgdG9wb19iaXRzX3Blcl9zYW1wbGU7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgdG9wb19pZDsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICBmbXRfaWQ7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgc2hhcmVkX3Bvc19idWZfcGh5X2FkZHJfbHN3OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9wb3NfYnVmX3BoeV9hZGRyX21zdzsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9tZW1fcG9vbF9pZDsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9udW1fcmVnaW9uczsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICBzaGFyZWRfcG9zX2J1Zl9wcm9wZXJ0eV9mbGFnOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9jaXJjX2J1Zl9zdGFydF9waHlfYWRkcl9sc3c7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgc2hhcmVkX2NpcmNfYnVmX3N0YXJ0X3BoeV9hZGRyX21zdzsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICBzaGFyZWRfY2lyY19idWZfc2l6ZTsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICBzaGFyZWRfY2lyY19idWZfbWVtX3Bvb2xfaWQ7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgc2hhcmVkX2NpcmNfYnVmX251bV9yZWdpb25zOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgIHNoYXJlZF9jaXJjX2J1Zl9wcm9wZXJ0eV9mbGFnOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgIG51bV93YXRlcm1hcmtfbGV2ZWxzOwotCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192MyAgICAgICAgIGZtdDsKLQlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgICAgICAgICAgICBtYXBfcmVnaW9uX3Bvc19idWY7Ci0Jc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICAgICAgICAgICAgbWFwX3JlZ2lvbl9jaXJjX2J1ZjsKLQlzdHJ1Y3QgYXNtX3NoYXJlZF93YXRlcm1hcmtfbGV2ZWwgd2F0ZXJtYXJrWzBdOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfVjMgICAgICAgICAgICAgICAgIDB4MDAwMTBEQjQKLQotLyogRGVmaW5pdGlvbiBvZiB0aGUgdGltZXN0YW1wIHR5cGUgZmxhZyBiaXRtYXNrICovCi0jZGVmaW5lIEFTTV9CSVRfTUFTS0lNRVNUQU1QWVBFX0ZMQUcgICAgICAgICgweDAwMDAwMDIwVUwpCi0KLS8qIERlZmluaXRpb24gb2YgdGhlIHRpbWVzdGFtcCB0eXBlIGZsYWcgc2hpZnQgdmFsdWUuICovCi0jZGVmaW5lIEFTTV9TSElGVElNRVNUQU1QWVBFX0ZMQUcgNQotCi0vKiBSZWxhdGl2ZSB0aW1lc3RhbXAgaXMgaWRlbnRpZmllZCBieSB0aGlzIHZhbHVlLiovCi0jZGVmaW5lIEFTTV9SRUxBVElWRUlNRVNUQU1QICAgICAgMAotCi0vKiBBYnNvbHV0ZSB0aW1lc3RhbXAgaXMgaWRlbnRpZmllZCBieSB0aGlzIHZhbHVlLiovCi0jZGVmaW5lIEFTTV9BQlNPTFVURUlNRVNUQU1QICAgICAgMQotCi0vKiBCaXQgdmFsdWUgZm9yIExvdyBMYXRlbmN5IFR4IHN0cmVhbSBzdWJmaWVsZCAqLwotI2RlZmluZSBBU01fTE9XX0xBVEVOQ1lfVFhfU1RSRUFNX1NFU1NJT04JCQkxCi0KLS8qIEJpdCBzaGlmdCBmb3IgdGhlIHN0cmVhbV9wZXJmX21vZGUgc3ViZmllbGQuICovCi0jZGVmaW5lIEFTTV9TSElGVF9TVFJFQU1fUEVSRl9NT0RFX0ZMQUdfSU5fT1BFTl9SRUFEICAgICAgICAgICAgICAyOQotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkX3YzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOwotLyogTW9kZSBmbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgbWV0YSBpbmZvcm1hdGlvbiBwZXIgZW5jb2RlZAotICogZnJhbWUgaXMgdG8gYmUgcHJvdmlkZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBiaXQgNDoKLSAqCi0gKiAtIDAgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFsbCBlbmNvZGVkIGZyYW1lcyBvbmx5OyBpdAotICogZG9lcyBub3QgY29udGFpbiBmcmFtZSBtZXRhZGF0YS4KLSAqCi0gKiAtIDEgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFuIGFycmF5IG9mIG1ldGFkYXRhIGFuZAotICogZW5jb2RlZCBmcmFtZXMuCi0gKgotICogLSBVc2UgI0FTTV9CSVRfTUFTS19NRVRBX0lORk9fRkxBRyBhcyB0aGUgYml0bWFzayBhbmQKLSAqICNBU01fU0hJRlRfTUVUQV9JTkZPX0ZMQUcgYXMgdGhlIHNoaWZ0IHZhbHVlIGZvciB0aGlzIGJpdC4KLSAqCi0gKgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDU6Ci0gKgotICogLSBBU01fUkVMQVRJVkVJTUVTVEFNUCAtLSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjIgd2lsbCBoYXZlCi0gKiAtIHJlbGF0aXZlIHRpbWUtc3RhbXAuCi0gKiAtIEFTTV9BQlNPTFVURUlNRVNUQU1QIC0tIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORV9WMiB3aWxsCi0gKiAtIGhhdmUgYWJzb2x1dGUgdGltZS1zdGFtcC4KLSAqCi0gKiAtIFVzZSAjQVNNX0JJVF9NQVNLSU1FU1RBTVBZUEVfRkxBRyBhcyB0aGUgYml0bWFzayBhbmQKLSAqICNBU01fU0hJRlRJTUVTVEFNUFlQRV9GTEFHIGFzIHRoZSBzaGlmdCB2YWx1ZSBmb3IgdGhpcyBiaXQuCi0gKgotICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgICBzcmNfZW5kcG9pbnR5cGU7Ci0vKiBTcGVjaWZpZXMgdGhlIGVuZHBvaW50IHByb3ZpZGluZyB0aGUgaW5wdXQgc2FtcGxlcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDAgLS0gRGV2aWNlIG1hdHJpeAotICogLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZDsgY2xpZW50cyBtdXN0IHNldCB0aGVtIHRvIHplcm8uCi0gKiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHJldHVybmVkLgotICogVGhlIGRldmljZSBtYXRyaXggaXMgdGhlIGdhdGV3YXkgZnJvbSB0aGUgdHVubmVsZWQgVHggcG9ydHMuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgICAgcHJlcHJvY29wb19pZDsKLS8qIFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mIHByZXByb2Nlc3NpbmcKLSAqIGFsZ29yaXRobXMuIDxpPk5vbmU8L2k+IG1lYW5zIG5vIHByZXByb2Nlc3NpbmcuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX1NUUkVBTV9QUkVQUk9DT1BPX0lEX0RFRkFVTFQKLSAqIC0gI0FTTV9TVFJFQU1fUFJFUFJPQ09QT19JRF9OT05FCi0gKgotICogVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSBlbmFibGVkIHRocm91Z2ggU2V0UGFyYW1zIGZsYWdzLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgIGVuY19jZmdfaWQ7Ci0vKiBNZWRpYSBjb25maWd1cmF0aW9uIElEIGZvciBlbmNvZGVkIG91dHB1dC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19WMgotICogLSAjQVNNX01FRElBX0ZNVF9BTVJOQl9GUwotICogLSAjQVNNX01FRElBX0ZNVF9BTVJXQl9GUwotICogLSAjQVNNX01FRElBX0ZNVF9WMTNLX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0VWUkNfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ0JfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ1dCX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX1NCQwotICogLSAjQVNNX01FRElBX0ZNVF9HNzExX0FMQVdfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRzcxMV9NTEFXX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0c3MjlBX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0VYQU1QTEUKLSAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1Y4Ci0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlOwotLyogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwcm9jZXNzZWQgYnkgQVNNIG1vZHVsZXMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiBhbmQgMjQgYml0cyBwZXIgc2FtcGxlCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0vKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9QT1BQX09VVFBVVF9TUl9OQVRJVkVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgbWF4aW11bSBzYW1wbGluZyByYXRlIGF0IHRoZSBQT1BQIG91dHB1dC4qLwotI2RlZmluZSBBU01fUE9QUF9PVVRQVVRfU1JfTUFYX1JBVEUgICAgICAgICAgICAgNDgwMDAKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURXUklURV9WMiAgICAgICAgMHgwMDAxMEQ4RAotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURXUklURV9WMiAgICAgICAgMHgwMDAxMEQ4RAotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9yZWFkd3JpdGVfdjIgewotCXN0cnVjdCBhcHJfaGRyICAgICAgICAgaGRyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKLS8qIE1vZGUgZmxhZ3MuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBiaXQgMjoKLSAqIC0gMCAtLSBTUi9DTSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV2ZW50IGlzIGRpc2FibGVkLgotICogLSAxIC0tIFNSL0NNIGNoYW5nZSBub3RpZmljYXRpb24gZXZlbnQgaXMgZW5hYmxlZC4gVXNlCi0gKiAjQVNNX0JJVF9NQVNLX1NSX0NNX0NIQU5HRV9OT1RJRllfRkxBRyBhbmQKLSAqICNBU01fU0hJRlRfU1JfQ01fQ0hBTkdFX05PVElGWV9GTEFHIHRvIHNldCBvcgotICogZ2V0dGluZyB0aGlzIGZsYWcuCi0gKgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDQ6Ci0gKiAtIDAgLS0gUmV0dXJuIHJlYWQgZGF0YSBidWZmZXIgY29udGFpbnMgYWxsIGVuY29kZWQgZnJhbWVzIG9ubHk7IGl0Ci0gKiBkb2VzIG5vdCBjb250YWluIGZyYW1lIG1ldGFkYXRhLgotICogLSAxIC0tIFJldHVybiByZWFkIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFuIGFycmF5IG9mIG1ldGFkYXRhIGFuZAotICogZW5jb2RlZCBmcmFtZXMuCi0gKgotICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY29wb19pZDsKLS8qIFNwZWNpZmllcyB0aGUgdG9wb2xvZ3kgKG9yZGVyIG9mIHByb2Nlc3NpbmcpIG9mIHBvc3Rwcm9jZXNzaW5nCi0gKiBhbGdvcml0aG1zLiA8aT5Ob25lPC9pPiBtZWFucyBubyBwb3N0cHJvY2Vzc2luZy4KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9ERUZBVUxUCi0gKiAtICNBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX01DSF9QRUFLX1ZPTAotICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9OT05FCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgICAgZGVjX2ZtdF9pZDsKLS8qIFNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YS4gUENNIGluZGljYXRlcyB0aGF0Ci0gKiBubyBkZWNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgZS5nLiwgdGhpcyBpcyBhbiBOVCBlbmNvZGVyCi0gKiBzZXNzaW9uLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfQURQQ00KLSAqIC0gI0FTTV9NRURJQV9GTVRfTVAzCi0gKiAtICNBU01fTUVESUFfRk1UX0FBQ19WMgotICogLSAjQVNNX01FRElBX0ZNVF9ET0xCWV9BQUMKLSAqIC0gI0FTTV9NRURJQV9GTVRfQU1STkJfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfQU1SV0JfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfVjEzS19GUwotICogLSAjQVNNX01FRElBX0ZNVF9FVlJDX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0VWUkNCX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0VWUkNXQl9GUwotICogLSAjQVNNX01FRElBX0ZNVF9TQkMKLSAqIC0gI0FTTV9NRURJQV9GTVRfV01BX1YxMFBST19WMgotICogLSAjQVNNX01FRElBX0ZNVF9XTUFfVjlfVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfQU1SX1dCX1BMVVNfVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUMzCi0gKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUwotICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgIGVuY19jZmdfaWQ7Ci0vKiBTcGVjaWZpZXMgdGhlIG1lZGlhIHR5cGUgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIHN0cmVhbS4gUENNCi0gKiBpbmRpY2F0ZXMgdGhhdCBubyBlbmNvZGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgZS5nLiwgdGhpcyBpcyBhbiBOVAotICogZGVjb2RlciBzZXNzaW9uLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUFDX1YyCi0gKiAtICNBU01fTUVESUFfRk1UX0FNUk5CX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX0FNUldCX0ZTCi0gKiAtICNBU01fTUVESUFfRk1UX1YxM0tfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVZSQ19GUwotICogLSAjQVNNX01FRElBX0ZNVF9FVlJDQl9GUwotICogLSAjQVNNX01FRElBX0ZNVF9FVlJDV0JfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfU0JDCi0gKiAtICNBU01fTUVESUFfRk1UX0c3MTFfQUxBV19GUwotICogLSAjQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRzcyOUFfRlMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRVhBTVBMRQotICogLSAjQVNNX01FRElBX0ZNVF9XTUFfVjgKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7Ci0vKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2IGFuZCAyNCBiaXRzIHBlciBzYW1wbGUKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX0xPT1BCQUNLX1YyIDB4MDAwMTBEOEUKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX2xvb3BiYWNrX3YyIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgICAgIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgIG1vZGVfZmxhZ3M7Ci0vKiBNb2RlIGZsYWdzLgotICogQml0IDAtMzE6IHJlc2VydmVkOyBjbGllbnQgc2hvdWxkIHNldCB0aGVzZSBiaXRzIHRvIDAKLSAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgc3JjX2VuZHBvaW50eXBlOwotCS8qIEVuZHBvaW50IHR5cGUuIDAgPSBUeCBNYXRyaXggKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgIHNpbmtfZW5kcG9pbnR5cGU7Ci0JLyogRW5kcG9pbnQgdHlwZS4gMCA9IFJ4IE1hdHJpeCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgcG9zdHByb2NvcG9faWQ7Ci0vKiBQb3N0cHJvY2Vzc29yIHRvcG9sb2d5IElELiBTcGVjaWZpZXMgdGhlIHRvcG9sb2d5IG9mCi0gKiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZTsKLS8qIFRoZSBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSBBU00gbW9kdWxlcwotICogU3VwcG9ydGVkIHZhbHVlczogMTYgYW5kIDI0IGJpdHMgcGVyIHNhbXBsZQotICovCi0JdTE2ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCi19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9UUkFOU0NPREVfTE9PUEJBQ0sgICAgMHgwMDAxMERCQQotCi0vKiBCaXRtYXNrIGZvciB0aGUgc3RyZWFtJ3MgUGVyZm9ybWFuY2UgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX0JJVF9NQVNLX1NUUkVBTV9QRVJGX01PREVfRkxBR19JTl9PUEVOX1RSQU5TQ09ERV9MT09QQkFDSyBcCi0JKDB4NzAwMDAwMDBVTCkKLQotLyogQml0IHNoaWZ0IGZvciB0aGUgc3RyZWFtJ3MgUGVyZm9ybWFuY2UgbW9kZS4gKi8KLSNkZWZpbmUgQVNNX1NISUZUX1NUUkVBTV9QRVJGX01PREVfRkxBR19JTl9PUEVOX1RSQU5TQ09ERV9MT09QQkFDSyAgICAyOAotCi0vKiBCaXRtYXNrIGZvciB0aGUgZGVjb2RlciBjb252ZXJ0ZXIgZW5hYmxlIGZsYWcuICovCi0jZGVmaW5lIEFTTV9CSVRfTUFTS19ERUNPREVSX0NPTlZFUlRFUl9GTEFHICAgICgweDAwMDAwMDc4VUwpCi0KLS8qIFNoaWZ0IHZhbHVlIGZvciB0aGUgZGVjb2RlciBjb252ZXJ0ZXIgZW5hYmxlIGZsYWcuICovCi0jZGVmaW5lIEFTTV9TSElGVF9ERUNPREVSX0NPTlZFUlRFUl9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotCi0vKiBDb252ZXJ0ZXIgbW9kZSBpcyBOb25lIChEZWZhdWx0KS4gKi8KLSNkZWZpbmUgQVNNX0NPTlZFUlRFUl9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qIENvbnZlcnRlciBtb2RlIGlzIEREUC10by1ERC4gKi8KLSNkZWZpbmUgQVNNX0REUF9ERF9DT05WRVJURVJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLS8qICBJZGVudGlmaWVzIGEgc3BlY2lhbCBjb252ZXJ0ZXIgbW9kZSB3aGVyZSBzb3VyY2UgYW5kIHNpbmsgZm9ybWF0cwotICogIGFyZSB0aGUgc2FtZSBidXQgcG9zdHByb2Nlc3NpbmcgbXVzdCBhcHBsaWVkLiBUaGVyZWZvcmUsIERlY29kZQotICogIEByYXJyb3cgUmUtZW5jb2RlIGlzIG5lY2Vzc2FyeS4KLSAqLwotI2RlZmluZSBBU01fUE9TVF9QUk9DRVNTX0NPTlZFUlRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLQotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl90cmFuc2NvZGVfbG9vcGJhY2tfdCB7Ci0Jc3RydWN0IGFwcl9oZHIgICAgICAgICBoZHI7Ci0JdTMyICAgICAgICAgICAgICAgICAgICBtb2RlX2ZsYWdzOwotLyogTW9kZSBGbGFncyBzcGVjaWZpZXMgdGhlIHBlcmZvcm1hbmNlIG1vZGUgaW4gd2hpY2ggdGhpcyBzdHJlYW0KLSAqIGlzIHRvIGJlIG9wZW5lZC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXN7Zm9yIGJpdHMgMzAgdG8gMjh9KHN0cmVhbV9wZXJmX21vZGUgZmxhZykKLSAqCi0gKiAjQVNNX0xFR0FDWV9TVFJFQU1fU0VTU0lPTiAtLSBUaGlzIG1vZGUgZW5zdXJlcyBiYWNrd2FyZAotICogICAgICAgY29tcGF0aWJpbGl0eSB0byB0aGUgb3JpZ2luYWwgYmVoYXZpb3IKLSAqICAgICAgIG9mIEFTTV9TVFJFQU1fQ01EX09QRU5fVFJBTlNDT0RFX0xPT1BCQUNLCi0gKgotICogI0FTTV9MT1dfTEFURU5DWV9TVFJFQU1fU0VTU0lPTiAtLSBPcGVucyBhIGxvb3BiYWNrIHNlc3Npb24gYnkgdXNpbmcKLSAqICBzaG9ydGVuZWQgYnVmZmVycyBpbiBsb3cgbGF0ZW5jeSBQT1BQCi0gKiAgLSBSZWNvbW1lbmRhdGlvbjogRG8gbm90IGVuYWJsZSBoaWdoIGxhdGVuY3kgYWxnb3JpdGhtcy4gVGhleSBtaWdodAotICogICAgbmVnYXRlIHRoZSBiZW5lZml0cyBvZiBvcGVuaW5nIGEgbG93IGxhdGVuY3kgc3RyZWFtLCBhbmQgdGhleQotICogICAgbWlnaHQgYWxzbyBzdWZmZXIgcXVhbGl0eSBkZWdyYWRhdGlvbiBmcm9tIHVuZXhwZWN0ZWQgaml0dGVyLgotICogIC0gVGhpcyBMb3cgTGF0ZW5jeSBtb2RlIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBQQ00gSW4gYW5kIFBDTSBPdXQKLSAqICAgIGxvb3BiYWNrcy4gQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgTG93IExhdGVuY3kgbW9kZSBpcyBvcGVuZWQgZm9yCi0gKiAgICBvdGhlciB0cmFuc2NvZGUgbG9vcGJhY2sgbW9kZXMuCi0gKiAgLSBUbyBjb25maWd1cmUgdGhpcyBzdWJmaWVsZCwgdXNlCi0gKiAgICAgQVNNX0JJVF9NQVNLX1NUUkVBTV9QRVJGX01PREVfRkxBR19JTl9PUEVOX1RSQU5TQ09ERV9MT09QQkFDSyBhbmQKLSAqICAgICBBU01fU0hJRlRfU1RSRUFNX1BFUkZfTU9ERV9GTEFHX0lOX09QRU5fVFJBTlNDT0RFX0xPT1BCQUNLLgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXN7Zm9yIGJpdHMgNiB0byAzfSAoZGVjb2Rlci1jb252ZXJ0ZXIgY29tcGF0aWJpbGl0eSkKLSAqICNBU01fQ09OVkVSVEVSX01PREVfTk9ORSAoMHgwKSAtLSBEZWZhdWx0Ci0gKiAjQVNNX0REUF9ERF9DT05WRVJURVJfTU9ERSAoMHgxKQotICogI0FTTV9QT1NUX1BST0NFU1NfQ09OVkVSVEVSX01PREUgKDB4MikKLSAqIDB4My0weEYgLS0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLSAqIC0gVXNlICNBU01fQklUX01BU0tfREVDT0RFUl9DT05WRVJURVJfRkxBRyBhbmQKLSAqICAgICAgICBBU01fU0hJRlRfREVDT0RFUl9DT05WRVJURVJfRkxBRyB0byBzZXQgdGhpcyBiaXQKLSAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZDsgY2xpZW50cyBtdXN0IHNldCB0aGVtIHRvIDAuCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgICAgc3JjX2Zvcm1hdF9pZDsKLS8qIFNwZWNpZmllcyB0aGUgbWVkaWEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhdWRpbyBzdHJlYW0uCi0gKgotICogU3VwcG9ydGVkIHZhbHVlcwotICogLSAjQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMgotICogLSAjQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMwotICogLSAjQVNNX01FRElBX0ZNVF9EVFMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRUFDM19ERUMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRUFDMwotICogLSAjQVNNX01FRElBX0ZNVF9BQzNfREVDCi0gKiAtICNBU01fTUVESUFfRk1UX0FDMwotICovCi0JdTMyICAgICAgICAgICAgICAgICAgICBzaW5rX2Zvcm1hdF9pZDsKLS8qIFNwZWNpZmllcyB0aGUgbWVkaWEgZm9ybWF0IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXMKLSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjIKLSAqIC0gI0FTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRFRTIChub3Qgc3VwcG9ydGVkIGluIExvdyBMYXRlbmN5IG1vZGUpCi0gKiAtICNBU01fTUVESUFfRk1UX0VBQzNfREVDIChub3Qgc3VwcG9ydGVkIGluIExvdyBMYXRlbmN5IG1vZGUpCi0gKiAtICNBU01fTUVESUFfRk1UX0VBQzMgKG5vdCBzdXBwb3J0ZWQgaW4gTG93IExhdGVuY3kgbW9kZSkKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUMzX0RFQyAobm90IHN1cHBvcnRlZCBpbiBMb3cgTGF0ZW5jeSBtb2RlKQotICogLSAjQVNNX01FRElBX0ZNVF9BQzMgKG5vdCBzdXBwb3J0ZWQgaW4gTG93IExhdGVuY3kgbW9kZSkKLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgICBhdWRwcm9jX3RvcG9faWQ7Ci0vKiBQb3N0cHJvY2Vzc2luZyB0b3BvbG9neSBJRCwgd2hpY2ggc3BlY2lmaWVzIHRoZSB0b3BvbG9neSAob3JkZXIgb2YKLSAqICAgICAgICBwcm9jZXNzaW5nKSBvZiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLgotICoKLSAqIFN1cHBvcnRlZCB2YWx1ZXMKLSAqICAgIC0gI0FTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9ERUZBVUxUCi0gKiAgICAtICNBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfUEVBS01FVEVSCi0gKiAgICAtICNBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfTUNIX1BFQUtfVk9MCi0gKiAgICAtICNBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfTk9ORQotICogIFRvcG9sb2dpZXMgY2FuIGJlIGFkZGVkIHRocm91Z2ggI0FTTV9DTURfQUREX1RPUE9MT0dJRVMuCi0gKiAgVGhpcyBmaWVsZCBpcyBpZ25vcmVkIGZvciB0aGUgQ29udmVydGVyIG1vZGUsIGluIHdoaWNoIG5vCi0gKiAgcG9zdHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkLgotICovCi0KLQl1MTYgICAgICAgICAgICAgICAgICAgIHNyY19lbmRwb2ludF90eXBlOwotLyogU3BlY2lmaWVzIHRoZSBzb3VyY2UgZW5kcG9pbnQgdGhhdCBwcm92aWRlcyB0aGUgaW5wdXQgc2FtcGxlcy4KLSAqCi0gKiBTdXBwb3J0ZWQgdmFsdWVzCi0gKiAgLSAwIC0tIFR4IGRldmljZSBtYXRyaXggb3Igc3RyZWFtIHJvdXRlciAoZ2F0ZXdheSB0byB0aGUgaGFyZHdhcmUKLSAqICAgIHBvcnRzKQotICogIC0gQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKLSAqICBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gMC4gT3RoZXJ3aXNlLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgICBzaW5rX2VuZHBvaW50X3R5cGU7Ci0vKiAgU3BlY2lmaWVzIHRoZSBzaW5rIGVuZHBvaW50IHR5cGUuCi0gKgotICogIFN1cHBvcnRlZCB2YWx1ZXMKLSAqICAtIDAgLS0gUnggZGV2aWNlIG1hdHJpeCBvciBzdHJlYW0gcm91dGVyIChnYXRld2F5IHRvIHRoZSBoYXJkd2FyZQotICogICAgcG9ydHMpCi0gKiAgLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAotICogICBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gMC4gT3RoZXJ3aXNlLCBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9zYW1wbGU7Ci0vKiAgIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgcHJvY2Vzc2VkIGJ5IHRoZSBBU00gbW9kdWxlcy4KLSAqICAgU3VwcG9ydGVkIHZhbHVlcyAxNiwgMjQKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLS8qICAgVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLgotICovCi19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfQ0xPU0UgICAgICAgICAgICAgMHgwMDAxMEJDRAotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9GTFVTSCAgICAgICAgICAgICAweDAwMDEwQkNFCi0KLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9GTFVTSF9SRUFEQlVGUyAgIDB4MDAwMTBDMDkKLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMiAweDAwMDEwREExCi0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHsKLQl1MzIgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9sc3c7Ci0vKiBMU1cgb2YgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBhZGRyZXNzLiBTdXBwb3J0ZWQgdmFsdWVzOiBhbnkuICovCi0JdTMyICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbXN3OwotLyogTVNXIG9mIFBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4gU3VwcG9ydGVkIHZhbHVlczogYW55LgotICogLSBNdXN0IGJlIHNldCB0byB6ZXJvIGZvciBpbi1iYW5kIGRhdGEuCi0gKiAtIEluIHRoZSBjYXNlIG9mIDMyIGJpdCBTaGFyZWQgbWVtb3J5IGFkZHJlc3MsIG1zdyAgZmllbGQgbXVzdCBiZQotICogLSBzZXQgdG8gemVyby4KLSAqIC0gSW4gdGhlIGNhc2Ugb2YgMzYgYml0IHNoYXJlZCBtZW1vcnkgYWRkcmVzcywgYml0IDMxIHRvIGJpdCA0IG9mCi0gKiBtc3cKLSAqCi0gKiAtIG11c3QgYmUgc2V0IHRvIHplcm8uCi0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLS8qIFN1cHBvcnRlZCBWYWx1ZXM6IEFueS4KLSAqIG1lbW9yeSBtYXAgaGFuZGxlIHJldHVybmVkIGJ5IERTUCB0aHJvdWdoCi0gKiBBU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMKLSAqIGNvbW1hbmQuCi0gKiBpZiBtbWhhbmRsZSBpcyBOVUxMLCB0aGUgUGFyYW1EYXRhIHBheWxvYWRzIGFyZSB3aXRoaW4gdGhlCi0gKiBtZXNzYWdlIHBheWxvYWQgKGluLWJhbmQpLgotICogSWYgbW1oYW5kbGUgaXMgbm9uLU5VTEwsIHRoZSBQYXJhbURhdGEgcGF5bG9hZHMgYmVnaW4gYXQgdGhlCi0gKiBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYWRkcmVzcyBtc3cgYW5kIGxzdyAob3V0LW9mLWJhbmQpLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfc2l6ZTsKLS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhcmlhYmxlIHBheWxvYWQgYWNjb21wYW55aW5nIHRoZQotICogbWVzc2FnZSwgb3IgaW4gc2hhcmVkIG1lbW9yeS4gVGhpcyBmaWVsZCBpcyB1c2VkIGZvciBwYXJzaW5nIHRoZQotICogcGFyYW1ldGVyIHBheWxvYWQuCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiB7Ci0JdTMyICAgICAgICAgICAgICAgICAgbW9kdWxlX2lkOwotCS8qIFVuaXF1ZSBtb2R1bGUgSUQuICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKLQkvKiBVbmlxdWUgcGFyYW1ldGVyIElELiAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLS8qIERhdGEgc2l6ZSBvZiB0aGUgcGFyYW1faWQvbW9kdWxlX2lkIGNvbWJpbmF0aW9uLiBUaGlzIGlzCi0gKiBhIG11bHRpcGxlIG9mIDQgYnl0ZXMuCi0gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBlbmhhbmNlbWVudHMuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8KLSAqIHplcm8uCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TX1YyCQkweDAwMDEwREEyCi0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9nZXRfcHBfcGFyYW1zX3YyIHsKLQl1MzIgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9sc3c7Ci0JLyogTFNXIG9mIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuICovCi0JdTMyICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbXN3OwotLyogTVNXIG9mIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuCi0gKiAtIFNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnksIGlmIHNwZWNpZmllZCwgc2hhbGwgYmUgbGFyZ2UgZW5vdWdoCi0gKiB0byBjb250YWluIHRoZSB3aG9sZSBQYXJhbURhdGEgcGF5bG9hZCwgaW5jbHVkaW5nIE1vZHVsZSBJRCwKLSAqIFBhcmFtIElELCBQYXJhbSBTaXplLCBhbmQgUGFyYW0gVmFsdWVzCi0gKiAtIE11c3QgYmUgc2V0IHRvIHplcm8gZm9yIGluLWJhbmQgZGF0YQotICogLSBJbiB0aGUgY2FzZSBvZiAzMiBiaXQgU2hhcmVkIG1lbW9yeSBhZGRyZXNzLCBtc3cgZmllbGQgbXVzdCBiZQotICogc2V0IHRvIHplcm8uCi0gKiAtIEluIHRoZSBjYXNlIG9mIDM2IGJpdCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MsIGJpdCAzMSB0byBiaXQgNCBvZgotICogbXN3IG11c3QgYmUgc2V0IHRvIHplcm8uCi0gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotLyogU3VwcG9ydGVkIFZhbHVlczogQW55LgotICogbWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgRFNQIHRocm91Z2ggQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCi0gKiBjb21tYW5kLgotICogaWYgbW1oYW5kbGUgaXMgTlVMTCwgdGhlIFBhcmFtRGF0YSBwYXlsb2FkcyBpbiB0aGUgQUNLIGFyZSB3aXRoaW4gdGhlCi0gKiBtZXNzYWdlIHBheWxvYWQgKGluLWJhbmQpLgotICogSWYgbW1oYW5kbGUgaXMgbm9uLU5VTEwsIHRoZSBQYXJhbURhdGEgcGF5bG9hZHMgaW4gdGhlIEFDSyBiZWdpbiBhdCB0aGUKLSAqIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBhZGRyZXNzIG1zdyBhbmQgbHN3LgotICogKG91dC1vZi1iYW5kKS4KLSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICAgbW9kdWxlX2lkOwotLyogVW5pcXVlIG1vZHVsZSBJRC4gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHBhcmFtX2lkOwotLyogVW5pcXVlIHBhcmFtZXRlciBJRC4gKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHBhcmFtX21heF9zaXplOwotLyogTWF4aW11bSBkYXRhIHNpemUgb2YgdGhlIG1vZHVsZV9pZC9wYXJhbV9pZCBjb21iaW5hdGlvbi4gVGhpcwotICogaXMgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLgotICovCi0KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotLyogUmVzZXJ2ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIENsaWVudHMgbXVzdCBzZXQgdGhpcwotICogZmllbGQgdG8gemVyby4KLSAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIDB4MDAwMTBDMTAKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNX1YyICAgICAweDAwMDEzMjE4Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtX3YyIHsKLQl1MTYgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2lkOwotCS8qIDAgLSBBU01fRU5DT0RFUl9TVkM7IDEgLSBBU01fREVDT0RFUl9TVkMgKi8KLQotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCi0JdTMyICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7Ci0JLyogSUQgb2YgdGhlIHBhcmFtZXRlci4gKi8KLQotCXUzMiAgICAgICAgICAgICAgICAgIHBhcmFtX3NpemU7Ci0JLyoKLQkgKiBEYXRhIHNpemUgb2YgdGhpcyBwYXJhbWV0ZXIsIGluIGJ5dGVzLiBUaGUgc2l6ZSBpcyBhIG11bHRpcGxlCi0JICogb2YgNCBieXRlcy4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfRU5DREVDX0VWRU5UUyAgMHgwMDAxMzIxOQotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX0VOQ0RFQ19FVkVOVFMgICAgICAgICAgIDB4MDAwMTMyMUEKLQotI2RlZmluZSBBVlNfUEFSQU1fSURfUlRJQ19TSEFSRURfTUVNT1JZX0FERFIgICAweDAwMDEzMjM3Ci0KLXN0cnVjdCBhdnNfcnRpY19zaGFyZWRfbWVtX2FkZHIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbV92MiAgZW5jZGVjOwotCXUzMiAgICAgICAgICAgICAgICAgc2htX2J1Zl9hZGRyX2xzdzsKLQkvKiBMb3dlciAzMiBiaXQgb2YgdGhlIFJUSUMgc2hhcmVkIG1lbW9yeSAqLwotCi0JdTMyICAgICAgICAgICAgICAgICBzaG1fYnVmX2FkZHJfbXN3OwotCS8qIFVwcGVyIDMyIGJpdCBvZiB0aGUgUlRJQyBzaGFyZWQgbWVtb3J5ICovCi0KLQl1MzIgICAgICAgICAgICAgICAgIGJ1Zl9zaXplOwotCS8qIFNpemUgb2YgYnVmZmVyICovCi0KLQl1MTYgICAgICAgICAgICAgICAgIHNobV9idWZfbWVtX3Bvb2xfaWQ7Ci0JLyogQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MICovCi0KLQl1MTYgICAgICAgICAgICAgICAgIHNobV9idWZfbnVtX3JlZ2lvbnM7Ci0JLyogbnVtYmVyIG9mIHJlZ2lvbnMgdG8gbWFwICovCi0KLQl1MzIgICAgICAgICAgICAgICAgIHNobV9idWZfZmxhZzsKLQkvKiBidWZmZXIgcHJvcGVydHkgZmxhZyAqLwotCi0Jc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkIG1hcF9yZWdpb247Ci0JLyogbWVtb3J5IG1hcCByZWdpb24qLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBVlNfUEFSQU1fSURfUlRJQ19FVkVOVF9BQ0sgICAgICAgICAgIDB4MDAwMTMyMzgKLQotc3RydWN0IGF2c19wYXJhbV9ydGljX2V2ZW50X2FjayB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtX3YyICBlbmNkZWM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9FTkNERUNfQklUUkFURSAgICAgMHgwMDAxMEMxMwotCi1zdHJ1Y3QgYXNtX2JpdHJhdGVfcGFyYW0gewotCXUzMiAgICAgICAgICAgICAgICAgIGJpdHJhdGU7Ci0vKiBNYXhpbXVtIHN1cHBvcnRlZCBiaXRyYXRlLiBPbmx5IHRoZSBBQUMgZW5jb2RlciBpcyBzdXBwb3J0ZWQuKi8KLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyIDB4MDAwMTBEQTMKLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FBQ19TQlJfUFNfRkxBRwkJIDB4MDAwMTBDNjMKLQotLyogRmxhZyB0byB0dXJuIG9mZiBib3RoIFNCUiBhbmQgUFMgcHJvY2Vzc2luZywgaWYgdGhleSBhcmUKLSAqIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbS4KLSAqLwotCi0jZGVmaW5lIEFTTV9BQUNfU0JSX09GRl9QU19PRkYgKDIpCi0KLS8qIEZsYWcgdG8gdHVybiBvbiBTQlIgYnV0IHR1cm4gb2ZmIFBTIHByb2Nlc3NpbmcsaWYgdGhleSBhcmUKLSAqIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbS4KLSAqLwotCi0jZGVmaW5lIEFTTV9BQUNfU0JSX09OX1BTX09GRiAgKDEpCi0KLS8qIEZsYWcgdG8gdHVybiBvbiBib3RoIFNCUiBhbmQgUFMgcHJvY2Vzc2luZywgaWYgdGhleSBhcmUKLSAqIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbSAoZGVmYXVsdCBiZWhhdmlvcikuCi0gKi8KLQotCi0jZGVmaW5lIEFTTV9BQUNfU0JSX09OX1BTX09OICAgKDApCi0KLS8qIFN0cnVjdHVyZSBmb3IgYW4gQUFDIFNCUiBQUyBwcm9jZXNzaW5nIGZsYWcuICovCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX0FBQ19TQlJfUFNfRkxBRyBwYXJhbWV0ZXIgaW4gdGhlCi0gKiAjQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kLgotICovCi1zdHJ1Y3QgYXNtX2FhY19zYnJfcHNfZmxhZ19wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MgllbmNibGs7Ci0KLQl1MzIgICAgICAgICAgICAgICAgICBzYnJfcHNfZmxhZzsKLS8qIENvbnRyb2wgcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNCUi9QUyBwcm9jZXNzaW5nIGluCi0gKiB0aGUgQUFDIGJpdHN0cmVhbS4gVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIHNldCB0aGlzIGZpZWxkOgotICogLSAjQVNNX0FBQ19TQlJfT0ZGX1BTX09GRiAtLSBUdXJuIG9mZiBib3RoIFNCUiBhbmQgUFMKLSAqIHByb2Nlc3NpbmcsIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIGJpdHN0cmVhbS4KLSAqIC0gI0FTTV9BQUNfU0JSX09OX1BTX09GRiAtLSBUdXJuIG9uIFNCUiBwcm9jZXNzaW5nLCBidXQgbm90IFBTCi0gKiBwcm9jZXNzaW5nLCBpZiB0aGV5IGFyZSBwcmVzZW50IGluIHRoZSBiaXRzdHJlYW0uCi0gKiAtICNBU01fQUFDX1NCUl9PTl9QU19PTiAtLSBUdXJuIG9uIGJvdGggU0JSIGFuZCBQUyBwcm9jZXNzaW5nLAotICogaWYgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgYml0c3RyZWFtIChkZWZhdWx0IGJlaGF2aW9yKS4KLSAqIC0gQWxsIG90aGVyIHZhbHVlcyBhcmUgaW52YWxpZC4KLSAqIENoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIG5leHQgZGVjb2RlZCBmcmFtZS4KLSAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fUEFSQU1fSURfQUFDX0RVQUxfTU9OT19NQVBQSU5HICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDNjQKLQotLyoJRmlyc3Qgc2luZ2xlIGNoYW5uZWwgZWxlbWVudCBpbiBhIGR1YWwgbW9ubyBiaXRzdHJlYW0uKi8KLSNkZWZpbmUgQVNNX0FBQ19EVUFMX01PTk9fTUFQX1NDRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEpCi0KLS8qCVNlY29uZCBzaW5nbGUgY2hhbm5lbCBlbGVtZW50IGluIGEgZHVhbCBtb25vIGJpdHN0cmVhbS4qLwotI2RlZmluZSBBU01fQUFDX0RVQUxfTU9OT19NQVBfU0NFXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMikKLQotLyogU3RydWN0dXJlIGZvciBBQUMgZGVjb2RlciBkdWFsIG1vbm8gY2hhbm5lbCBtYXBwaW5nLiAqLwotCi0KLXN0cnVjdCBhc21fYWFjX2R1YWxfbW9ub19tYXBwaW5nX3BhcmFtIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCQkJCQloZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0JZW5jZGVjOwotCXUxNiAgICBsZWZ0X2NoYW5uZWxfc2NlOwotCXUxNiAgICByaWdodF9jaGFubmVsX3NjZTsKLQotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1YyIDB4MDAwMTBEQTQKLQotc3RydWN0IGFzbV9zdHJlYW1fY21kcnNwX2dldF9wcF9wYXJhbXNfdjIgewotCXUzMiAgICAgICAgICAgICAgICAgIHN0YXR1czsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19LQVJBT0tFX01PREUgMHgwMDAxMEQ3MwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgYm90aCB2b2NhbHMgaW4gYSBrYXJhb2tlIHN0cmVhbS4qLwotI2RlZmluZSBBQzNfS0FSQU9LRV9NT0RFX05PX1ZPQ0FMICAgICAoMCkKLQotLyogRW51bWVyYXRpb24gZm9yIG9ubHkgdGhlIGxlZnQgdm9jYWwgaW4gYSBrYXJhb2tlIHN0cmVhbS4qLwotI2RlZmluZSBBQzNfS0FSQU9LRV9NT0RFX0xFRlRfVk9DQUwgICAoMSkKLQotLyogRW51bWVyYXRpb24gZm9yIG9ubHkgdGhlIHJpZ2h0IHZvY2FsIGluIGEga2FyYW9rZSBzdHJlYW0uKi8KLSNkZWZpbmUgQUMzX0tBUkFPS0VfTU9ERV9SSUdIVF9WT0NBTCAoMikKLQotLyogRW51bWVyYXRpb24gZm9yIGJvdGggdm9jYWwgY2hhbm5lbHMgaW4gYSBrYXJhb2tlIHN0cmVhbS4qLwotI2RlZmluZSBBQzNfS0FSQU9LRV9NT0RFX0JPVEhfVk9DQUwgICAgICAgICAgICAgKDMpCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9BQzNfRFJDX01PREUgICAgICAgICAgICAgICAweDAwMDEwRDc0Ci0vKiBFbnVtZXJhdGlvbiBmb3IgdGhlIEN1c3RvbSBBbmFsb2cgbW9kZS4qLwotI2RlZmluZSBBQzNfRFJDX01PREVfQ1VTVE9NX0FOQUxPRyAgICAgICAgICAgICAgKDApCi0KLS8qIEVudW1lcmF0aW9uIGZvciB0aGUgQ3VzdG9tIERpZ2l0YWwgbW9kZS4qLwotI2RlZmluZSBBQzNfRFJDX01PREVfQ1VTVE9NX0RJR0lUQUwgICAgICAgICAgICAgKDEpCi0vKiBFbnVtZXJhdGlvbiBmb3IgdGhlIExpbmUgT3V0IG1vZGUgKGxpZ2h0IGNvbXByZXNzaW9uKS4qLwotI2RlZmluZSBBQzNfRFJDX01PREVfTElORV9PVVQgICgyKQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgdGhlIFJGIHJlbW9kdWxhdGlvbiBtb2RlIChoZWF2eSBjb21wcmVzc2lvbikuKi8KLSNkZWZpbmUgQUMzX0RSQ19NT0RFX1JGX1JFTU9EICAgICAgICAgICAgICAgICAgICAgICAgICgzKQotI2RlZmluZSBBU01fUEFSQU1fSURfQUMzX0RVQUxfTU9OT19NT0RFICAgICAgICAgICAgICAgMHgwMDAxMEQ3NQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgcGxheWluZyBkdWFsIG1vbm8gaW4gc3RlcmVvIG1vZGUuKi8KLSNkZWZpbmUgQUMzX0RVQUxfTU9OT19NT0RFX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICgwKQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgcGxheWluZyBsZWZ0IG1vbm8uKi8KLSNkZWZpbmUgQUMzX0RVQUxfTU9OT19NT0RFX0xFRlRfTU9OTyAgICAgICAgICAgICAgICAgICgxKQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgcGxheWluZyByaWdodCBtb25vLiovCi0jZGVmaW5lIEFDM19EVUFMX01PTk9fTU9ERV9SSUdIVF9NT05PICAgICAgICAgICAgICAgICAoMikKLQotLyogRW51bWVyYXRpb24gZm9yIG1peGluZyBib3RoIGR1YWwgbW9ubyBjaGFubmVscyBhbmQgcGxheWluZyB0aGVtLiovCi0jZGVmaW5lIEFDM19EVUFMX01PTk9fTU9ERV9NSVhFRF9NT05PICAgICAgICAoMykKLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19TVEVSRU9fRE9XTk1JWF9NT0RFIDB4MDAwMTBENzYKLQotLyogRW51bWVyYXRpb24gZm9yIHVzaW5nIHRoZSBEb3dubWl4IG1vZGUgaW5kaWNhdGVkIGluIHRoZSBiaXRzdHJlYW0uICovCi0KLSNkZWZpbmUgQUMzX1NURVJFT19ET1dOTUlYX01PREVfQVVUT19ERVRFQ1QgICgwKQotCi0vKiBFbnVtZXJhdGlvbiBmb3IgU3Vycm91bmQgQ29tcGF0aWJsZSBtb2RlIChwcmVzZXJ2ZXMgdGhlCi0gKiBzdXJyb3VuZCBpbmZvcm1hdGlvbikuCi0gKi8KLQotI2RlZmluZSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9MVF9SVCAgICAgICAgKDEpCi0vKiBFbnVtZXJhdGlvbiBmb3IgTW9ubyBDb21wYXRpYmxlIG1vZGUgKGlmIHRoZSBvdXRwdXQgaXMgdG8gYmUKLSAqIGZ1cnRoZXIgZG93bm1peGVkIHRvIG1vbm8pLgotICovCi0KLSNkZWZpbmUgQUMzX1NURVJFT19ET1dOTUlYX01PREVfTE9fUk8gKDIpCi0KLS8qIElEIG9mIHRoZSBBQzMgUENNIHNjYWxlIGZhY3RvciBwYXJhbWV0ZXIgaW4gdGhlCi0gKiAjQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kLgotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9BQzNfUENNX1NDQUxFRkFDVE9SIDB4MDAwMTBENzgKLQotLyogSUQgb2YgdGhlIEFDMyBEUkMgYm9vc3Qgc2NhbGUgZmFjdG9yIHBhcmFtZXRlciBpbiB0aGUKLSAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19EUkNfQk9PU1RfU0NBTEVGQUNUT1IgMHgwMDAxMEQ3OQotCi0vKiBJRCBvZiB0aGUgQUMzIERSQyBjdXQgc2NhbGUgZmFjdG9yIHBhcmFtZXRlciBpbiB0aGUKLSAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FDM19EUkNfQ1VUX1NDQUxFRkFDVE9SIDB4MDAwMTBEN0EKLQotLyogU3RydWN0dXJlIGZvciBBQzMgR2VuZXJpYyBQYXJhbWV0ZXIuICovCi0KLS8qICBQYXlsb2FkIG9mIHRoZSBBQzMgcGFyYW1ldGVycyBpbiB0aGUKLSAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCi0gKi8KLXN0cnVjdCBhc21fYWMzX2dlbmVyaWNfcGFyYW0gewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSAgZW5jZGVjOwotCXN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIJZW5jYmxrOwotCXUzMiAgICAgICAgICAgICAgICAgIGdlbmVyaWNfcGFyYW1ldGVyOwotLyogQUMzIGdlbmVyaWMgcGFyYW1ldGVyLiBTZWxlY3QgZnJvbSBvbmUgb2YgdGhlIGZvbGxvd2luZwotICogcG9zc2libGUgdmFsdWVzLgotICoKLSAqIEZvciAjQVNNX1BBUkFNX0lEX0FDM19LQVJBT0tFX01PREUsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlOgotICogLSBBQzNfS0FSQU9LRV9NT0RFX05PX1ZPQ0FMCi0gKiAtIEFDM19LQVJBT0tFX01PREVfTEVGVF9WT0NBTAotICogLSBBQzNfS0FSQU9LRV9NT0RFX1JJR0hUX1ZPQ0FMCi0gKiAtIEFDM19LQVJBT0tFX01PREVfQk9USF9WT0NBTAotICoKLSAqIEZvciAjQVNNX1BBUkFNX0lEX0FDM19EUkNfTU9ERSwgc3VwcG9ydGVkIHZhbHVlcyBhcmU6Ci0gKiAtIEFDM19EUkNfTU9ERV9DVVNUT01fQU5BTE9HCi0gKiAtIEFDM19EUkNfTU9ERV9DVVNUT01fRElHSVRBTAotICogLSBBQzNfRFJDX01PREVfTElORV9PVVQKLSAqIC0gQUMzX0RSQ19NT0RFX1JGX1JFTU9ECi0gKgotICogRm9yICNBU01fUEFSQU1fSURfQUMzX0RVQUxfTU9OT19NT0RFLCBzdXBwb3J0ZWQgdmFsdWVzIGFyZToKLSAqIC0gQUMzX0RVQUxfTU9OT19NT0RFX1NURVJFTwotICogLSBBQzNfRFVBTF9NT05PX01PREVfTEVGVF9NT05PCi0gKiAtIEFDM19EVUFMX01PTk9fTU9ERV9SSUdIVF9NT05PCi0gKiAtIEFDM19EVUFMX01PTk9fTU9ERV9NSVhFRF9NT05PCi0gKgotICogRm9yICNBU01fUEFSQU1fSURfQUMzX1NURVJFT19ET1dOTUlYX01PREUsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlOgotICogLSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9BVVRPX0RFVEVDVAotICogLSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9MVF9SVAotICogLSBBQzNfU1RFUkVPX0RPV05NSVhfTU9ERV9MT19STwotICoKLSAqIEZvciAjQVNNX1BBUkFNX0lEX0FDM19QQ01fU0NBTEVGQUNUT1IsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlCi0gKiAwIHRvIDEgaW4gUTMxIGZvcm1hdC4KLSAqCi0gKiBGb3IgI0FTTV9QQVJBTV9JRF9BQzNfRFJDX0JPT1NUX1NDQUxFRkFDVE9SLCBzdXBwb3J0ZWQgdmFsdWVzIGFyZQotICogMCB0byAxIGluIFEzMSBmb3JtYXQuCi0gKgotICogRm9yICNBU01fUEFSQU1fSURfQUMzX0RSQ19DVVRfU0NBTEVGQUNUT1IsIHN1cHBvcnRlZCB2YWx1ZXMgYXJlCi0gKiAwIHRvIDEgaW4gUTMxIGZvcm1hdC4KLSAqLwotfSBfX3BhY2tlZDsKLQotLyogRW51bWVyYXRpb24gZm9yIFJhdyBtb2RlIChubyBkb3dubWl4aW5nKSwgd2hpY2ggc3BlY2lmaWVzCi0gKiB0aGF0IGFsbCBjaGFubmVscyBpbiB0aGUgYml0c3RyZWFtIGFyZSB0byBiZSBwbGF5ZWQgb3V0IGFzIGlzCi0gKiB3aXRob3V0IGFueSBkb3dubWl4aW5nLiAoRGVmYXVsdCkKLSAqLwotCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfUkFXICgtMSkKLQotLyogRW51bWVyYXRpb24gZm9yIHNldHRpbmcgdGhlIGNoYW5uZWwgbWFzayB0byAwLiBUaGUgNy4xIG1vZGUKLSAqIChIb21lIFRoZWF0ZXIpIGlzIGFzc2lnbmVkLgotICovCi0KLQotI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLX1pFUk8gMHgwMDAwCi0KLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIG9uZSBjaGFubmVsIChIb21lIFRoZWF0ZXIsIG1vbm8pLgotICogLSBTcGVha2VyIGZyb250IGNlbnRlcgotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfMV9DIDB4MDAwNAotCi0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciB0d28gY2hhbm5lbHMgKEhvbWUgVGhlYXRlciwgc3RlcmVvKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqLwotI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzJfTF9SIDB4MDAwMwotCi0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciB0aHJlZSBjaGFubmVscyAoSG9tZSBUaGVhdGVyKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqLwotI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzNfTF9DX1IgMHgwMDA3Ci0KLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHR3byBjaGFubmVscyAoc3RlcmVvKS4KLSAqIC0gU3BlYWtlciBiYWNrIGxlZnQKLSAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0Ci0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS18yX0JsX0JyICAweDAwMzAKLQotLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZm91ciBjaGFubmVscy4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBiYWNrIGxlZnQKLSAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0Ci0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS180X0xfUl9CbF9CciAweDAwMzMKLQotLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZm91ciBjaGFubmVscyAoSG9tZSBUaGVhdGVyKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqIC0gU3BlYWtlciBiYWNrIGNlbnRlcgotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNF9MX1JfQ19CY19IVCAweDAxMDcKLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIGZpdmUgY2hhbm5lbHMuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgYmFjayBsZWZ0Ci0gKiAtIFNwZWFrZXIgYmFjayByaWdodAotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNV9MX0NfUl9CbF9CciAgMHgwMDM3Ci0KLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIGZpdmUgY2hhbm5lbHMgKDUgbW9kZSwgSG9tZSBUaGVhdGVyKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqIC0gU3BlYWtlciBzaWRlIGxlZnQKLSAqIC0gU3BlYWtlciBzaWRlIHJpZ2h0Ci0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS181X0xfQ19SX1NsX1NyX0hUICAgMHgwNjA3Ci0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBzaXggY2hhbm5lbHMgKDUuMSBtb2RlKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5Ci0gKiAtIFNwZWFrZXIgYmFjayBsZWZ0Ci0gKiAtIFNwZWFrZXIgYmFjayByaWdodAotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNURPVDFfTF9DX1JfQmxfQnJfU0xGICAweDAwM0YKLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNpeCBjaGFubmVscyAoNS4xIG1vZGUsIEhvbWUgVGhlYXRlcikuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgbG93IGZyZXF1ZW5jeQotICogLSBTcGVha2VyIHNpZGUgbGVmdAotICogLSBTcGVha2VyIHNpZGUgcmlnaHQKLSAqLwotI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzVET1QxX0xfQ19SX1NsX1NyX1NMRl9IVCAgMHgwNjBGCi0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBzaXggY2hhbm5lbHMgKDUuMSBtb2RlLCBubyBMRkUpLgotICogLSBTcGVha2VyIGZyb250IGxlZnQKLSAqIC0gU3BlYWtlciBmcm9udCByaWdodAotICogLSBTcGVha2VyIGZyb250IGNlbnRlcgotICogLSBTcGVha2VyIGJhY2sgbGVmdAotICogLSBTcGVha2VyIGJhY2sgcmlnaHQKLSAqIC0gU3BlYWtlciBiYWNrIGNlbnRlcgotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNURPVDFfTF9DX1JfQmxfQnJfQmMgIDB4MDEzNwotLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3Igc2l4IGNoYW5uZWxzICg1LjEgbW9kZSwgSG9tZSBUaGVhdGVyLAotICogbm8gTEZFKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqIC0gU3BlYWtlciBiYWNrIGNlbnRlcgotICogLSBTcGVha2VyIHNpZGUgbGVmdAotICogLSBTcGVha2VyIHNpZGUgcmlnaHQKLSAqLwotI2RlZmluZSBXTUFQUk9fQ0hBTk5FTF9NQVNLXzVET1QxX0xfQ19SX1NsX1NyX0JjX0hUICAgMHgwNzA3Ci0KLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNldmVuIGNoYW5uZWxzICg2LjEgbW9kZSkuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgbG93IGZyZXF1ZW5jeQotICogLSBTcGVha2VyIGJhY2sgbGVmdAotICogLSBTcGVha2VyIGJhY2sgcmlnaHQKLSAqIC0gU3BlYWtlciBiYWNrIGNlbnRlcgotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNkRPVDFfTF9DX1JfQmxfQnJfQmNfU0xGICAgMHgwMTNGCi0KLS8qIFNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIHNldmVuIGNoYW5uZWxzICg2LjEgbW9kZSwgSG9tZQotICogVGhlYXRlcikuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgbG93IGZyZXF1ZW5jeQotICogLSBTcGVha2VyIGJhY2sgY2VudGVyCi0gKiAtIFNwZWFrZXIgc2lkZSBsZWZ0Ci0gKiAtIFNwZWFrZXIgc2lkZSByaWdodAotICovCi0jZGVmaW5lIFdNQVBST19DSEFOTkVMX01BU0tfNkRPVDFfTF9DX1JfU2xfU3JfQmNfU0xGX0hUIDB4MDcwRgotCi0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBzZXZlbiBjaGFubmVscyAoNi4xIG1vZGUsIG5vIExGRSkuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgYmFjayBsZWZ0Ci0gKiAtIFNwZWFrZXIgYmFjayByaWdodAotICogLSBTcGVha2VyIGZyb250IGxlZnQgb2YgY2VudGVyCi0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQgb2YgY2VudGVyCi0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS182RE9UMV9MX0NfUl9CbF9Ccl9TRkxPQ19TRlJPQyAgIDB4MDBGNwotCi0vKiBTcGVha2VyIGxheW91dCBtYXNrIGZvciBzZXZlbiBjaGFubmVscyAoNi4xIG1vZGUsIEhvbWUKLSAqIFRoZWF0ZXIsIG5vIExGRSkuCi0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdAotICogLSBTcGVha2VyIGZyb250IHJpZ2h0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgY2VudGVyCi0gKiAtIFNwZWFrZXIgc2lkZSBsZWZ0Ci0gKiAtIFNwZWFrZXIgc2lkZSByaWdodAotICogLSBTcGVha2VyIGZyb250IGxlZnQgb2YgY2VudGVyCi0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQgb2YgY2VudGVyCi0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS182RE9UMV9MX0NfUl9TbF9Tcl9TRkxPQ19TRlJPQ19IVCAweDA2MzcKLQotLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZWlnaHQgY2hhbm5lbHMgKDcuMSBtb2RlKS4KLSAqIC0gU3BlYWtlciBmcm9udCBsZWZ0Ci0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQKLSAqIC0gU3BlYWtlciBmcm9udCBjZW50ZXIKLSAqIC0gU3BlYWtlciBiYWNrIGxlZnQKLSAqIC0gU3BlYWtlciBiYWNrIHJpZ2h0Ci0gKiAtIFNwZWFrZXIgbG93IGZyZXF1ZW5jeQotICogLSBTcGVha2VyIGZyb250IGxlZnQgb2YgY2VudGVyCi0gKiAtIFNwZWFrZXIgZnJvbnQgcmlnaHQgb2YgY2VudGVyCi0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS183RE9UMV9MX0NfUl9CbF9Ccl9TTEZfU0ZMT0NfU0ZST0MgXAotCQkJCQkweDAwRkYKLQotLyogU3BlYWtlciBsYXlvdXQgbWFzayBmb3IgZWlnaHQgY2hhbm5lbHMgKDcuMSBtb2RlLCBIb21lIFRoZWF0ZXIpLgotICogLSBTcGVha2VyIGZyb250IGxlZnQKLSAqIC0gU3BlYWtlciBmcm9udCByaWdodAotICogLSBTcGVha2VyIGZyb250IGNlbnRlcgotICogLSBTcGVha2VyIHNpZGUgbGVmdAotICogLSBTcGVha2VyIHNpZGUgcmlnaHQKLSAqIC0gU3BlYWtlciBsb3cgZnJlcXVlbmN5Ci0gKiAtIFNwZWFrZXIgZnJvbnQgbGVmdCBvZiBjZW50ZXIKLSAqIC0gU3BlYWtlciBmcm9udCByaWdodCBvZiBjZW50ZXIKLSAqCi0gKi8KLSNkZWZpbmUgV01BUFJPX0NIQU5ORUxfTUFTS183RE9UMV9MX0NfUl9TbF9Tcl9TTEZfU0ZMT0NfU0ZST0NfSFQgXAotCQkJCQkweDA2M0YKLQotI2RlZmluZSBBU01fUEFSQU1fSURfREVDX09VVFBVVF9DSEFOX01BUCAgMHgwMDAxMEQ4MgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBkZWNvZGVyIG91dHB1dCBjaGFubmVscy4gKi8KLSNkZWZpbmUgTUFYX0NIQU5fTUFQX0NIQU5ORUxTICAxNgotCi0vKiBTdHJ1Y3R1cmUgZm9yIGRlY29kZXIgb3V0cHV0IGNoYW5uZWwgbWFwcGluZy4gKi8KLQotLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9ERUNfT1VUUFVUX0NIQU5fTUFQIHBhcmFtZXRlciBpbiB0aGUKLSAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCi0gKi8KLXN0cnVjdCBhc21fZGVjX291dF9jaGFuX21hcF9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtICBlbmNkZWM7Ci0JdTMyICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0vKiBOdW1iZXIgb2YgZGVjb2RlciBvdXRwdXQgY2hhbm5lbHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvICNNQVhfQ0hBTl9NQVBfQ0hBTk5FTFMKLSAqCi0gKiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIG5hdGl2ZSBjaGFubmVsIG1hcHBpbmcsIHdoaWNoIGlzIHZhbGlkCi0gKiBvbmx5IGZvciBOVCBtb2RlLiBUaGlzIG1lYW5zIHRoZSBvdXRwdXQgb2YgdGhlIGRlY29kZXIgaXMgdG8gYmUKLSAqIHByZXNlcnZlZCBhcyBpcy4KLSAqLwotCXU4ICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nW01BWF9DSEFOX01BUF9DSEFOTkVMU107Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfQ09NUFJFU1NFRCAgMHgwMDAxMEQ4NAotCi0vKiBCaXRtYXNrIGZvciB0aGUgSUVDIDYxOTM3IGVuYWJsZSBmbGFnLiovCi0jZGVmaW5lIEFTTV9CSVRfTUFTS19JRUNfNjE5MzdfU1RSRUFNX0ZMQUcgICAoMHgwMDAwMDAwMVVMKQotCi0vKiBTaGlmdCB2YWx1ZSBmb3IgdGhlIElFQyA2MTkzNyBlbmFibGUgZmxhZy4qLwotI2RlZmluZSBBU01fU0hJRlRfSUVDXzYxOTM3X1NUUkVBTV9GTEFHICAwCi0KLS8qIEJpdG1hc2sgZm9yIHRoZSBJRUMgNjA5NTggZW5hYmxlIGZsYWcuKi8KLSNkZWZpbmUgQVNNX0JJVF9NQVNLX0lFQ182MDk1OF9TVFJFQU1fRkxBRyAgICgweDAwMDAwMDAyVUwpCi0KLS8qIFNoaWZ0IHZhbHVlIGZvciB0aGUgSUVDIDYwOTU4IGVuYWJsZSBmbGFnLiovCi0jZGVmaW5lIEFTTV9TSElGVF9JRUNfNjA5NThfU1RSRUFNX0ZMQUcgICAxCi0KLS8qIFBheWxvYWQgZm9ybWF0IGZvciBvcGVuIHdyaXRlIGNvbXByZXNzZWQgY29tbWFuZCAqLwotCi0vKiBQYXlsb2FkIGZvcm1hdCBmb3IgdGhlICNBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX0NPTVBSRVNTRUQKLSAqIGNvbW1hbmQsIHdoaWNoIG9wZW5zIGEgc3RyZWFtIGZvciBhIGdpdmVuIHNlc3Npb24gSUQgYW5kIHN0cmVhbSBJRAotICogdG8gYmUgcmVuZGVyZWQgaW4gdGhlIGNvbXByZXNzZWQgZm9ybWF0LgotICovCi0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlX2NvbXByZXNzZWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotLyogTW9kZSBmbGFncyB0aGF0IGNvbmZpZ3VyZSB0aGUgc3RyZWFtIGZvciBhIHNwZWNpZmljIGZvcm1hdC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIEJpdCAwIC0tIElFQyA2MTkzNyBjb21wYXRpYmlsaXR5Ci0gKiAgIC0gMCAtLSBTdHJlYW0gaXMgbm90IGluIElFQyA2MTkzNyBmb3JtYXQKLSAqICAgLSAxIC0tIFN0cmVhbSBpcyBpbiBJRUMgNjE5MzcgZm9ybWF0Ci0gKiAtIEJpdCAxIC0tIElFQyA2MDk1OCBjb21wYXRpYmlsaXR5Ci0gKiAgIC0gMCAtLSBTdHJlYW0gaXMgbm90IGluIElFQyA2MDk1OCBmb3JtYXQKLSAqICAgLSAxIC0tIFN0cmVhbSBpcyBpbiBJRUMgNjA5NTggZm9ybWF0Ci0gKiAtIEJpdHMgMiB0byAzMSAtLSAwIChSZXNlcnZlZCkKLSAqCi0gKiBGb3IgdGhlIHNhbWUgc3RyZWFtLCBiaXQgMCBjYW5ub3QgYmUgc2V0IHRvIDAgYW5kIGJpdCAxIGNhbm5vdAotICogYmUgc2V0IHRvIDEuIEEgY29tcHJlc3NlZCBzdHJlYW0gY29ubm90IGhhdmUgSUVDIDYwOTU4Ci0gKiBwYWNrZXRpemF0aW9uIGFwcGxpZWQgd2l0aG91dCBJRUMgNjE5MzcgcGFja2V0aXphdGlvbi4KLSAqIEBub3RlMWhhbmcgQ3VycmVudGx5LCBJRUMgNjA5NTggcGFja2V0aXplZCBpbnB1dCBzdHJlYW1zIGFyZSBub3QKLSAqIHN1cHBvcnRlZC4KLSAqLwotCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgIGZtdF9pZDsKLS8qIFNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgSERNSSBzdHJlYW0gdG8gYmUgb3BlbmVkLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FTTV9NRURJQV9GTVRfQUMzCi0gKiAtICNBU01fTUVESUFfRk1UX0VBQzMKLSAqIC0gI0FTTV9NRURJQV9GTVRfRFRTCi0gKiAtICNBU01fTUVESUFfRk1UX0FUUkFDCi0gKiAtICNBU01fTUVESUFfRk1UX01BVAotICoKLSAqIEBub3RlMWhhbmcgVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byBhIHZhbGlkIG1lZGlhIHR5cGUgZXZlbiBpZgotICogSUVDIDYxOTM3IHBhY2tldGl6YXRpb24gaXMgbm90IHBlcmZvcm1lZCBieSB0aGUgYURTUC4KLSAqLwotCi19IF9fcGFja2VkOwotCi0KLS8qIEluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQotICogYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gKi8KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX1JFTU9WRV9JTklUSUFMX1NJTEVOQ0UgMHgwMDAxMEQ2NwotCi0vKiBJbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBjaGFubmVsIHRvIGJlIHJlbW92ZWQgZnJvbQotICogdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgotICovCi0jZGVmaW5lIEFTTV9EQVRBX0NNRF9SRU1PVkVfVFJBSUxJTkdfU0lMRU5DRSAweDAwMDEwRDY4Ci0KLXN0cnVjdCBhc21fZGF0YV9jbWRfcmVtb3ZlX3NpbGVuY2UgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIJbnVtX3NhbXBsZXNfdG9fcmVtb3ZlOwotCS8qIDwgTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGNoYW5uZWwgdG8gYmUgcmVtb3ZlZC4KLQkgKiBAdmFsdWVzIDAgdG8gKDJAc3NjcnszMn0tMSkKLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEX0NPTVBSRVNTRUQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwRDk1Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWRfY29tcHJlc3NlZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgbW9kZV9mbGFnczsKLS8qIE1vZGUgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG1ldGEgaW5mb3JtYXRpb24gcGVyIGVuY29kZWQKLSAqIGZyYW1lIGlzIHRvIGJlIHByb3ZpZGVkLgotICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgYml0IDQ6Ci0gKiAtIDAgLS0gUmV0dXJuIGRhdGEgYnVmZmVyIGNvbnRhaW5zIGFsbCBlbmNvZGVkIGZyYW1lcyBvbmx5OyBpdCBkb2VzCi0gKiAgICAgIG5vdCBjb250YWluIGZyYW1lIG1ldGFkYXRhLgotICogLSAxIC0tIFJldHVybiBkYXRhIGJ1ZmZlciBjb250YWlucyBhbiBhcnJheSBvZiBtZXRhZGF0YSBhbmQgZW5jb2RlZAotICogICAgICBmcmFtZXMuCi0gKiAtIFVzZSAjQVNNX0JJVF9NQVNLX01FVEFfSU5GT19GTEFHIHRvIHNldCB0aGUgYml0bWFzayBhbmQKLSAqICNBU01fU0hJRlRfTUVUQV9JTkZPX0ZMQUcgdG8gc2V0IHRoZSBzaGlmdCB2YWx1ZSBmb3IgdGhpcyBiaXQuCi0gKiBBbGwgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQ7IGNsaWVudHMgbXVzdCBzZXQgdGhlbSB0byB6ZXJvLgotICovCi0KLQl1MzIgICAgICAgICAgICAgICAgICAgIGZyYW1lc19wZXJfYnVmOwotLyogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSByZXR1cm5lZCBwZXIKLSAqIHJlYWQgYnVmZmVyCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAKLSAqLwotCi19IF9fcGFja2VkOwotCi0vKiBhZHNwX2FzbV9zdHJlYW1fY29tbWFuZHMuaCovCi0KLQotLyogYWRzcF9hc21fYXBpLmggKG5vIGNoYW5nZXMpKi8KLSNkZWZpbmUgQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9ERUZBVUxUIFwKLQkJCQkJCQkJMHgwMDAxMEJFNAotI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX1BFQUtNRVRFUiBcCi0JCQkJCQkJCTB4MDAwMTBEODMKLSNkZWZpbmUgQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9OT05FIFwKLQkJCQkJCQkJMHgwMDAxMEM2OAotI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX01DSF9QRUFLX1ZPTCBcCi0JCQkJCQkJCTB4MDAwMTBEOEIKLSNkZWZpbmUgQVNNX1NUUkVBTV9QUkVQUk9DT1BPX0lEX0RFRkFVTFQgXAotCQkJQVNNX1NUUkVBTV9QT1NUUFJPQ09QT19JRF9ERUZBVUxUCi0jZGVmaW5lIEFTTV9TVFJFQU1fUFJFUFJPQ09QT19JRF9OT05FIFwKLQkJCUFTTV9TVFJFQU1fUE9TVFBST0NPUE9fSURfTk9ORQotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfTk9ORV9BVURJT19DT1BQIFwKLQkJCTB4MDAwMTAzMTIKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfTU9OT19BVURJT19DT1BQIFwKLQkJCQkJCQkJMHgwMDAxMDMxMwotI2RlZmluZSBBRE1fQ01EX0NPUFBfT1BFTk9QT0xPR1lfSURfU1BFQUtFUl9TVEVSRU9fQVVESU9fQ09QUCBcCi0JCQkJCQkJCTB4MDAwMTAzMTQKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfU1RFUkVPX0lJUl9BVURJT19DT1BQXAotCQkJCQkJCQkweDAwMDEwNzA0Ci0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9TUEVBS0VSX01PTk9fQVVESU9fQ09QUF9NQkRSQ1YyXAotCQkJCQkJCQkweDAwMDEwNzBECi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9TUEVBS0VSX1NURVJFT19BVURJT19DT1BQX01CRFJDVjJcCi0JCQkJCQkJCTB4MDAwMTA3MEUKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfU1RFUkVPX0lJUl9BVURJT19DT1BQX01CRFJDVjJcCi0JCQkJCQkJCTB4MDAwMTA3MEYKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX1NQRUFLRVJfU1RFUkVPX0FVRElPX0NPUFBfTUJEUkNfVjMgXAotCQkJCQkJCQkweDExMDAwMDAwCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9TUEVBS0VSX01DSF9QRUFLX1ZPTCBcCi0JCQkJCQkJCTB4MDAwMTAzMUIKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX01JQ19NT05PX0FVRElPX0NPUFAgIDB4MDAwMTAzMTUKLSNkZWZpbmUgQURNX0NNRF9DT1BQX09QRU5PUE9MT0dZX0lEX01JQ19TVEVSRU9fQVVESU9fQ09QUCAweDAwMDEwMzE2Ci0jZGVmaW5lIEFVRFBST0NfQ09QUE9QT0xPR1lfSURfTUNIQU5fSUlSX0FVRElPICAgICAgICAgICAweDAwMDEwNzE1Ci0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9ERUZBVUxUX0FVRElPX0NPUFAgICAweDAwMDEwQkUzCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOT1BPTE9HWV9JRF9QRUFLTUVURVJfQVVESU9fQ09QUCAweDAwMDEwMzE3Ci0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX0FJRyAgIDB4MDAwMTA3MTYKLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BSUdfRU5BQkxFCQkweDAwMDEwNzE3Ci0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQUlHX0NPTkZJRwkJMHgwMDAxMDcxOAotCi1zdHJ1Y3QgQXVkaW9fQWlnUGFyYW0gewotCXVpbnQxNl90CW1vZGU7Ci0vKjwgTW9kZSB3b3JkIGZvciBlbmFibGluZyBBSUcvU0lHIG1vZGUgLgotICogQnl0ZSBvZmZzZXQ6IDAKLSAqLwotCWludDE2X3QJCXN0YXRpY0dhaW5MMTZRMTI7Ci0vKjwgU3RhdGljIGlucHV0IGdhaW4gd2hlbiBhaWdNb2RlIGlzIHNldCB0byAxLgotICogQnl0ZSBvZmZzZXQ6IDIKLSAqLwotCWludDE2X3QJCWluaXRpYWxHYWluREJMMTZRNzsKLS8qPEluaXRpYWwgdmFsdWUgdGhhdCB0aGUgYWRhcHRpdmUgZ2FpbiB1cGRhdGUgc3RhcnRzIGZyb20gZEIKLSAqIFE3IEJ5dGUgb2Zmc2V0OiA0Ci0gKi8KLQlpbnQxNl90CQlpZGVhbFJNU0RCTDE2UTc7Ci0vKjxBdmVyYWdlIFJNUyBsZXZlbCB0aGF0IEFJRyBhdHRlbXB0cyB0byBhY2hpZXZlIFE4LjcKLSAqIEJ5dGUgb2Zmc2V0OiA2Ci0gKi8KLQlpbnQzMl90CQlub2lzZUdhdGVMMzI7Ci0vKlRocmVzaG9sZCBiZWxvdyB3aGljaCBzaWduYWwgaXMgY29uc2lkZXJlZCBhcyBub2lzZSBhbmQgQUlHCi0gKiBCeXRlIG9mZnNldDogOAotICovCi0JaW50MzJfdAkJbWluR2FpbkwzMlExNTsKLS8qTWluaW11bSBnYWluIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IEFJRyBRMTYuMTUKLSAqIEJ5dGUgb2Zmc2V0OiAxMgotICovCi0JaW50MzJfdAkJbWF4R2FpbkwzMlExNTsKLS8qTWF4aW11bSBnYWluIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IEFJRyBRMTYuMTUKLSAqIEJ5dGUgb2Zmc2V0OiAxNgotICovCi0JdWludDMyX3QJCWdhaW5BdFJ0VUwzMlEzMTsKLS8qQXR0YWNrL3JlbGVhc2UgdGltZSBmb3IgQUlHIHVwZGF0ZSBRMS4zMQotICogQnl0ZSBvZmZzZXQ6IDIwCi0gKi8KLQl1aW50MzJfdAkJbG9uZ0dhaW5BdFJ0VUwzMlEzMTsKLS8qTG9uZyBhdHRhY2svcmVsZWFzZSB0aW1lIHdoaWxlIHVwZGF0aW5nIGdhaW4gZm9yCi0gKiBub2lzZS9zaWxlbmNlIFExLjMxIEJ5dGUgb2Zmc2V0OiAyNAotICovCi0KLQl1aW50MzJfdAkJcm1zVGF2VUwzMlEzMjsKLS8qIFJNUyBzbW9vdGhpbmcgdGltZSBjb25zdGFudCB1c2VkIGZvciBsb25nLXRlcm0gUk1TIGVzdGltYXRlCi0gKiBRMC4zMiBCeXRlIG9mZnNldDogMjgKLSAqLwotCi0JdWludDMyX3QJCWdhaW5VcGRhdGVTdGFydFRpbU1zVUwzMlEwOwotLyogVGhlIHdhaXRpbmcgdGltZSBiZWZvcmUgd2hpY2ggQUlHIHN0YXJ0cyB0byBhcHBseSBhZGFwdGl2ZQotICogZ2FpbiB1cGRhdGUgUTMyLjAgQnl0ZSBvZmZzZXQ6IDMyCi0gKi8KLQotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFETV9NT0RVTEVfSURfRUFOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzRBCi0jZGVmaW5lIEFETV9QQVJBTV9JRF9FQU5TX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzRCCi0jZGVmaW5lIEFETV9QQVJBTV9JRF9FQU5TX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzRDCi0KLXN0cnVjdCBhZG1fZWFuc19lbmFibGUgewotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKLS8qPCBTcGVjaWZpZXMgd2hldGhlciBFQU5TIGlzIGRpc2FibGVkICgwKSBvciBlbmFibGVkCi0gKiAobm9uemVybykuCi0gKiBUaGlzIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBzYW1wbGluZyByYXRlcyBvZiA4LCAxMiwgMTYsIDI0LCAzMiwKLSAqIGFuZCA0OCBrSHouIEl0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNhbXBsaW5nIHJhdGVzIG9mIDExLjAyNSwKLSAqIDIyLjA1LCBvciA0NC4xIGtIei4KLSAqLwotCi19IF9fcGFja2VkOwotCi0KLXN0cnVjdCBhZG1fZWFuc19wYXJhbXMgewotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19tb2RlOwotLyo8IE1vZGUgd29yZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHN1Ym1vZHVsZXMuCi0gKiBCeXRlIG9mZnNldDogMAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfaW5wdXRfZ2FpbjsKLS8qPCBRMi4xMyBpbnB1dCBnYWluIHRvIHRoZSBFQU5TIG1vZHVsZS4KLSAqIEJ5dGUgb2Zmc2V0OiAyCi0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19vdXRwdXRfZ2FpbjsKLS8qPCBRMi4xMyBvdXRwdXQgZ2FpbiB0byB0aGUgRUFOUyBtb2R1bGUuCi0gKiBCeXRlIG9mZnNldDogNAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNhcmdldF9uczsKLS8qPCBUYXJnZXQgbm9pc2Ugc3VwcHJlc3Npb24gbGV2ZWwgaW4gZEIuCi0gKiBCeXRlIG9mZnNldDogNgotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfc19hbHBoYTsKLS8qPCBRMy4xMiBvdmVyLXN1YnRyYWN0aW9uIGZhY3RvciBmb3Igc3RhdGlvbmFyeSBub2lzZQotICogc3VwcHJlc3Npb24uCi0gKiBCeXRlIG9mZnNldDogOAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbl9hbHBoYTsKLS8qIDwgUTMuMTIgb3Zlci1zdWJ0cmFjdGlvbiBmYWN0b3IgZm9yIG5vbnN0YXRpb25hcnkgbm9pc2UKLSAqIHN1cHByZXNzaW9uLgotICogQnl0ZSBvZmZzZXQ6IDEwCi0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uX2FscGhhbWF4OwotLyo8IFEzLjEyIG1heGltdW0gb3Zlci1zdWJ0cmFjdGlvbiBmYWN0b3IgZm9yIG5vbnN0YXRpb25hcnkKLSAqIG5vaXNlIHN1cHByZXNzaW9uLgotICogQnl0ZSBvZmZzZXQ6IDEyCi0gKi8KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfZV9hbHBoYTsKLS8qPCBRMTUgc2NhbGluZyBmYWN0b3IgZm9yIGV4Y2VzcyBub2lzZSBzdXBwcmVzc2lvbi4KLSAqIEJ5dGUgb2Zmc2V0OiAxNAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbnNfc25ybWF4OwotLyo8IFVwcGVyIGJvdW5kYXJ5IGluIGRCIGZvciBTTlIgZXN0aW1hdGlvbi4KLSAqIEJ5dGUgb2Zmc2V0OiAxNgotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfc25zX2Jsb2NrOwotLyo8IFF1YXJ0ZXIgYmxvY2sgc2l6ZSBmb3Igc3RhdGlvbmFyeSBub2lzZSBzdXBwcmVzc2lvbi4KLSAqIEJ5dGUgb2Zmc2V0OiAxOAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbnNfaTsKLS8qPCBJbml0aWFsaXphdGlvbiBibG9jayBzaXplIGZvciBub2lzZSBzdXBwcmVzc2lvbi4KLSAqIEJ5dGUgb2Zmc2V0OiAyMAotICovCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX25wX3NjYWxlOwotLyo8IFBvd2VyIHNjYWxlIGZhY3RvciBmb3Igbm9uc3RhdGlvbmFyeSBub2lzZSB1cGRhdGUuCi0gKiBCeXRlIG9mZnNldDogMjIKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX25fbGFtYmRhOwotLyo8IFNtb290aGluZyBmYWN0b3IgZm9yIGhpZ2hlciBsZXZlbCBub25zdGF0aW9uYXJ5IG5vaXNlCi0gKiB1cGRhdGUuCi0gKiBCeXRlIG9mZnNldDogMjQKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX25fbGFtYmRhZjsKLS8qPCBNZWRpdW0gYXZlcmFnaW5nIGZhY3RvciBmb3Igbm9pc2UgdXBkYXRlLgotICogQnl0ZSBvZmZzZXQ6IDI2Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19nc19iaWFzOwotLyo8IEJpYXMgZmFjdG9yIGluIGRCIGZvciBnYWluIGNhbGN1bGF0aW9uLgotICogQnl0ZSBvZmZzZXQ6IDI4Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19nc19tYXg7Ci0vKjwgU05SIGxvd2VyIGJvdW5kYXJ5IGluIGRCIGZvciBhZ2dyZXNzaXZlIGdhaW4gY2FsY3VsYXRpb24uCi0gKiBCeXRlIG9mZnNldDogMzAKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX3NfYWxwaGFfaGI7Ci0vKjwgUTMuMTIgb3Zlci1zdWJ0cmFjdGlvbiBmYWN0b3IgZm9yIGhpZ2gtYmFuZCBzdGF0aW9uYXJ5Ci0gKiBub2lzZSBzdXBwcmVzc2lvbi4KLSAqIEJ5dGUgb2Zmc2V0OiAzMgotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfbl9hbHBoYW1heF9oYjsKLS8qPCBRMy4xMiBtYXhpbXVtIG92ZXItc3VidHJhY3Rpb24gZmFjdG9yIGZvciBoaWdoLWJhbmQKLSAqIG5vbnN0YXRpb25hcnkgbm9pc2Ugc3VwcHJlc3Npb24uCi0gKiBCeXRlIG9mZnNldDogMzQKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBlYW5zX2VfYWxwaGFfaGI7Ci0vKjwgUTE1IHNjYWxpbmcgZmFjdG9yIGZvciBoaWdoLWJhbmQgZXhjZXNzIG5vaXNlIHN1cHByZXNzaW9uLgotICogQnl0ZSBvZmZzZXQ6IDM2Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19uX2xhbWJkYTA7Ci0vKjwgU21vb3RoaW5nIGZhY3RvciBmb3Igbm9uc3RhdGlvbmFyeSBub2lzZSB1cGRhdGUgZHVyaW5nCi0gKiBzcGVlY2ggYWN0aXZpdHkuCi0gKiBCeXRlIG9mZnNldDogMzgKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2g7Ci0vKjwgVGhyZXNob2xkIGZvciBnZW5lcmF0aW5nIGEgYmluYXJ5IFZBRCBkZWNpc2lvbi4KLSAqIEJ5dGUgb2Zmc2V0OiA0MAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIHB3cl9zY2FsZTsKLS8qPCBJbmRpcmVjdCBsb3dlciBib3VuZGFyeSBvZiB0aGUgbm9pc2UgbGV2ZWwgZXN0aW1hdGUuCi0gKiBCeXRlIG9mZnNldDogNDIKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBoYW5nb3Zlcl9tYXg7Ci0vKjwgQXZvaWRzIG1pZC1zcGVlY2ggY2xpcHBpbmcgYW5kIHJlbGlhYmx5IGRldGVjdHMgd2VhayBzcGVlY2gKLSAqIGJ1cnN0cyBhdCB0aGUgZW5kIG9mIHNwZWVjaCBhY3Rpdml0eS4KLSAqIEJ5dGUgb2Zmc2V0OiA0NAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX3NucjsKLS8qPCBDb250cm9scyByZXNwb25zaXZlbmVzcyBvZiB0aGUgVkFELgotICogQnl0ZSBvZmZzZXQ6IDQ2Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgc25yX2RpZmZfbWF4OwotLyo8IE1heGltdW0gU05SIGRpZmZlcmVuY2UuIERlY3JlYXNpbmcgdGhpcyBwYXJhbWV0ZXIgdmFsdWUgbWF5Ci0gKiBoZWxwIGluIG1ha2luZyBjb3JyZWN0IGRlY2lzaW9ucyBkdXJpbmcgYWJydXB0IGNoYW5nZXM7IGhvd2V2ZXIsCi0gKiBkZWNyZWFzaW5nIHRvbyBtdWNoIG1heSBpbmNyZWFzZSBmYWxzZSBhbGFybXMgZHVyaW5nIGxvbmcKLSAqIHBhdXNlcy9zaWxlbmNlcy4KLSAqIEJ5dGUgb2Zmc2V0OiA0OAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIHNucl9kaWZmX21pbjsKLS8qPCBNaW5pbXVtIFNOUiBkaWZmZXJlbmNlLiBEZWNyZWFzaW5nIHRoaXMgcGFyYW1ldGVyIHZhbHVlIG1heQotICogaGVscCBpbiBtYWtpbmcgY29ycmVjdCBkZWNpc2lvbnMgZHVyaW5nIGFicnVwdCBjaGFuZ2VzOyBob3dldmVyLAotICogZGVjcmVhc2luZyB0b28gbXVjaCBtYXkgaW5jcmVhc2UgZmFsc2UgYWxhcm1zIGR1cmluZyBsb25nCi0gKiBwYXVzZXMvc2lsZW5jZXMuCi0gKiBCeXRlIG9mZnNldDogNTAKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2xlbmd0aDsKLS8qPCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGZvciB3aGljaCBhIG5vaXNlIGxldmVsCi0gKiBlc3RpbWF0ZSBpcyBzZXQgdG8gYSBmaXhlZCB2YWx1ZS4KLSAqIEJ5dGUgb2Zmc2V0OiA1MgotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWw7Ci0vKjwgRGVmaW5lcyB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIG5vaXNlIGxldmVsLgotICogQnl0ZSBvZmZzZXQ6IDU0Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9ib3VuZDsKLS8qPCBEZWZpbmVzIHRoZSBpbml0aWFsIGJvdW5kaW5nIHZhbHVlIGZvciB0aGUgbm9pc2UgbGV2ZWwKLSAqIGVzdGltYXRlLiBUaGlzIGlzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsIHNlZ21lbnQgZGVmaW5lZCBieSB0aGUKLSAqIGluaXRfbGVuZ3RoIHBhcmFtZXRlci4KLSAqIEJ5dGUgb2Zmc2V0OiA1NgotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X2JvdW5kOwotLyo8IFJlc2V0IGJvdW5kYXJ5IGZvciBub2lzZSB0cmFja2luZy4KLSAqIEJ5dGUgb2Zmc2V0OiA1OAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGF2YXJfc2NhbGU7Ci0vKjwgRGVmaW5lcyB0aGUgYmlhcyBmYWN0b3IgaW4gbm9pc2UgZXN0aW1hdGlvbi4KLSAqIEJ5dGUgb2Zmc2V0OiA2MAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9uYzsKLS8qPCBEZWZpbmVzIHRoZSB3aW5kb3cgbGVuZ3RoIGZvciBub2lzZSBlc3RpbWF0aW9uLgotICogQnl0ZSBvZmZzZXQ6IDYyCi0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgc3Bvd19taW47Ci0vKjwgRGVmaW5lcyB0aGUgbWluaW11bSBzaWduYWwgcG93ZXIgcmVxdWlyZWQgdG8gdXBkYXRlIHRoZQotICogYm91bmRhcmllcyBmb3IgdGhlIG5vaXNlIGZsb29yIGVzdGltYXRlLgotICogQnl0ZSBvZmZzZXQ6IDY0Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19nc19mYXN0OwotLyo8IEZhc3Qgc21vb3RoaW5nIGZhY3RvciBmb3IgcG9zdHByb2Nlc3NvciBnYWluLgotICogQnl0ZSBvZmZzZXQ6IDY2Ci0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19nc19tZWQ7Ci0vKjwgTWVkaXVtIHNtb290aGluZyBmYWN0b3IgZm9yIHBvc3Rwcm9jZXNzb3IgZ2Fpbi4KLSAqIEJ5dGUgb2Zmc2V0OiA2OAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfZ3Nfc2xvdzsKLS8qPCBTbG93IHNtb290aGluZyBmYWN0b3IgZm9yIHBvc3Rwcm9jZXNzb3IgZ2Fpbi4KLSAqIEJ5dGUgb2Zmc2V0OiA3MAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIGVhbnNfc3diX3NhbHBoYTsKLS8qPCBRMy4xMiBzdXBlciB3aWRlYmFuZCBhZ2dyZXNzaXZlbmVzcyBmYWN0b3IgZm9yIHN0YXRpb25hcnkKLSAqIG5vaXNlIHN1cHByZXNzaW9uLgotICogQnl0ZSBvZmZzZXQ6IDcyCi0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgZWFuc19zd2JfbmFscGhhOwotLyo8IFEzLjEyIHN1cGVyIHdpZGViYW5kIGFnZ3Jlc3NpdmVuZXNzIGZhY3RvciBmb3IKLSAqIG5vbnN0YXRpb25hcnkgbm9pc2Ugc3VwcHJlc3Npb24uCi0gKiBCeXRlIG9mZnNldDogNzQKLSAqLwotfSBfX3BhY2tlZDsKLSNkZWZpbmUgQURNX01PRFVMRV9JRFhfTUlDX0dBSU5fQ1RSTCAgIDB4MDAwMTBDMzUKLQotLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzCi0gKiBJRCBvZiB0aGUgVHggbWljIGdhaW4gY29udHJvbCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBRE1fTU9EVUxFX0lEWF9NSUNfR0FJTl9DVFJMIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthZG14X21pY19nYWlufQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRFhfTUlDX0dBSU4udGV4fQotICovCi0jZGVmaW5lIEFETV9QQVJBTV9JRFhfTUlDX0dBSU4gICAgICAgMHgwMDAxMEMzNgotCi0vKiBTdHJ1Y3R1cmUgZm9yIGEgVHggbWljIGdhaW4gcGFyYW1ldGVyIGZvciB0aGUgbWljIGdhaW4KLSAqIGNvbnRyb2wgbW9kdWxlLgotICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURYX01JQ19HQUlOIHBhcmFtZXRlciBpbiB0aGUKLSAqIFR4IE1pYyBHYWluIENvbnRyb2wgbW9kdWxlLgotICovCi1zdHJ1Y3QgYWRteF9taWNfZ2FpbiB7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgICB0eF9taWNfZ2FpbjsKLQkvKjwgTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFkbV9zZXRfbWljX2dhaW5fcGFyYW1zIHsKLQlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1IHBhcmFtczsKLQlzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUgZGF0YTsKLQlzdHJ1Y3QgYWRteF9taWNfZ2FpbiBtaWNfZ2Fpbl9kYXRhOwotfSBfX3BhY2tlZDsKLQotLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCi0KLS8qIEBpbmdyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMKLSAqIElEIG9mIHRoZSBSeCBDb2RlYyBHYWluIENvbnRyb2wgbW9kdWxlLgotICoKLSAqIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEOgotICogLSAjQURNX1BBUkFNX0lEX1JYX0NPREVDX0dBSU4KLSAqLwotI2RlZmluZSBBRE1fTU9EVUxFX0lEX1JYX0NPREVDX0dBSU5fQ1RSTCAgICAgICAweDAwMDEwQzM3Ci0KLS8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcwotICogSUQgb2YgdGhlIFJ4IGNvZGVjIGdhaW4gY29udHJvbCBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBRE1fTU9EVUxFX0lEX1JYX0NPREVDX0dBSU5fQ1RSTCBtb2R1bGUuCi0gKgotICogQG1lc3NhZ2VwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9yeF9jb2RlY19nYWlufQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9SWF9DT0RFQ19HQUlOLnRleH0KLSAqLwotI2RlZmluZSBBRE1fUEFSQU1fSURfUlhfQ09ERUNfR0FJTiAgIDB4MDAwMTBDMzgKLQotLyogU3RydWN0dXJlIGZvciB0aGUgUnggY29tbW9uIGNvZGVjIGdhaW4gY29udHJvbCBtb2R1bGUuICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURfUlhfQ09ERUNfR0FJTiBwYXJhbWV0ZXIKLSAqIGluIHRoZSBSeCBDb2RlYyBHYWluIENvbnRyb2wgbW9kdWxlLgotICovCi0KLQotc3RydWN0IGFkbV9yeF9jb2RlY19nYWluIHsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJ4X2NvZGVjX2dhaW47Ci0JLyogTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIGVuZF9hZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLwotCi0vKiBAaW5ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzCi0gKiBJRCBvZiB0aGUgSFBGIFR1bmluZyBGaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9FTkFCTEVfQ09ORklHCi0gKiAtICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX1BSRV9HQUlOCi0gKiAtICNBRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0NPTkZJR19QQVJBTVMKLSAqLwotI2RlZmluZSBBRE1fTU9EVUxFX0lEX0hQRl9JSVJYX0ZJTFRFUiAgICAweDAwMDEwQzNECi0KLS8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLwotLyogSUQgb2YgdGhlIFR4IEhQRiBJSVIgZmlsdGVyIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBRE1fTU9EVUxFX0lEX0hQRl9JSVJYX0ZJTFRFUiBtb2R1bGUuCi0gKiBAcGFyc3BhY2UgTWVzc2FnZSBwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9ocGZ4X2lpcl9maWx0ZXJfZW5hYmxlX2NmZ30KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0VOQUJMRV9DT05GSUcudGV4fQotICovCi0jZGVmaW5lIEFETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfRU5BQkxFX0NPTkZJRyAgIDB4MDAwMTBDM0UKLQotLyogSUQgb2YgdGhlIFR4IEhQRiBJSVIgZmlsdGVyIHByZWdhaW4gcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRF9IUEZfSUlSWF9GSUxURVIgbW9kdWxlLgotICogQHBhcnNwYWNlIE1lc3NhZ2UgcGF5bG9hZAotICogQHN0cnVjdHVyZXthZG1faHBmeF9paXJfZmlsdGVyX3ByZV9nYWlufQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfUFJFX0dBSU4udGV4fQotICovCi0jZGVmaW5lIEFETV9QQVJBTV9JRF9IUEZfSUlSWF9GSUxURVJfUFJFX0dBSU4gICAweDAwMDEwQzNGCi0KLS8qIElEIG9mIHRoZSBUeCBIUEYgSUlSIGZpbHRlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKLSAqICNBRE1fTU9EVUxFX0lEX0hQRl9JSVJYX0ZJTFRFUiBtb2R1bGUuCi0gKiBAcGFyc3BhY2UgTWVzc2FnZSBwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9ocGZ4X2lpcl9maWx0ZXJfY2ZnX3BhcmFtc30KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BRE1fUEFSQU1fSURfSFBGX0lJUlhfRklMVEVSX0NPTkZJR19QQQotICogUkFNUy50ZXh9Ci0gKi8KLSNkZWZpbmUgQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9DT05GSUdfUEFSQU1TICAweDAwMDEwQzQwCi0KLS8qIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IKLSAqIHRoZSBIUEYgSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgotICovCi0KLS8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9FTkFCTEVfQ09ORklHCi0gKiBwYXJhbWV0ZXIgaW4gdGhlIFR4IHBhdGggSFBGIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgotICovCi1zdHJ1Y3QgYWRtX2hwZnhfaWlyX2ZpbHRlcl9lbmFibGVfY2ZnIHsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOwotLyogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIEhQRiB0dW5pbmcgZmlsdGVyIGlzIGRpc2FibGVkICgwKSBvcgotICogZW5hYmxlZCAobm9uemVybykuCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogU3RydWN0dXJlIGZvciB0aGUgcHJlZ2FpbiBwYXJhbWV0ZXIgZm9yIHRoZSBIUEYKLSAqIElJUiB0dW5pbmcgZmlsdGVyIG1vZHVsZSBvbiB0aGUgVHggcGF0aC4KLSAqLwotCi0KLS8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9QUkVfR0FJTiBwYXJhbWV0ZXIKLSAqIGluIHRoZSBUeCBwYXRoIEhQRiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4KLSAqLwotc3RydWN0IGFkbV9ocGZ4X2lpcl9maWx0ZXJfcHJlX2dhaW4gewotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcHJlX2dhaW47Ci0JLyogTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogU3RydWN0dXJlIGZvciB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZQotICogSFBGIElJUiB0dW5pbmcgZmlsdGVyIG1vZHVsZSBvbiB0aGUgVHggcGF0aC4KLSAqLwotCi0KLS8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQURNX1BBUkFNX0lEX0hQRl9JSVJYX0ZJTFRFUl9DT05GSUdfUEFSQU1TCi0gKiBwYXJhbWV0ZXJzIGluIHRoZSBUeCBwYXRoIEhQRiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4gXG4KLSAqIFxuCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBmb2xsb3dlZCBieSB0dW5pbmcgZmlsdGVyIGNvZWZmaWNpZW50cyBhcyBmb2xsb3dzOiBcbgotICogLSBTZXF1ZW5jZSBvZiBpbnQzMl90IEZpbHRlckNvZWZmcy4KLSAqIEVhY2ggYmFuZCBoYXMgZml2ZSBjb2VmZmljaWVudHMsIGVhY2ggaW4gaW50MzJfdCBmb3JtYXQgaW4gdGhlIG9yZGVyIG9mCi0gKiBiMCwgYjEsIGIyLCBhMSwgYTIuCi0gKiAtIFNlcXVlbmNlIG9mIGludDE2X3QgTnVtU2hpZnRGYWN0b3IuCi0gKiBPbmUgaW50MTZfdCBwZXIgYmFuZC4gVGhlIG51bWVyYXRvciBzaGlmdCBmYWN0b3IgaXMgcmVsYXRlZCB0byB0aGUgUQotICogZmFjdG9yIG9mIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzLgotICogLSBTZXF1ZW5jZSBvZiB1aW50MTZfdCBQYW5TZXR0aW5nLgotICogT25lIHVpbnQxNl90IGZvciBlYWNoIGJhbmQgdG8gaW5kaWNhdGUgYXBwbGljYXRpb24gb2YgdGhlIGZpbHRlciB0bwotICogbGVmdCAoMCksIHJpZ2h0ICgxKSwgb3IgYm90aCAoMikgY2hhbm5lbHMuCi0gKi8KLXN0cnVjdCBhZG1faHBmeF9paXJfZmlsdGVyX2NmZ19wYXJhbXMgewotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgbnVtX2JpcXVhZF9zdGFnZXM7Ci0vKjwgTnVtYmVyIG9mIGJhbmRzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAyMAotICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLQotLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfbW9kdWxlX2lkcyAqLwotCi0vKiBAYWRkdG9ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzICovCi0vKiBJRCBvZiB0aGUgVHggcGF0aCBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCi0gKglUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6Ci0gKgktICNBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfRU5BQkxFX0NPTkZJRwotICovCi0jZGVmaW5lIEFETV9NT0RVTEVfSURYX0lJUl9GSUxURVIgMHgwMDAxMEM0MQotCi0vKiBJRCBvZiB0aGUgUnggcGF0aCBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUgZm9yIHRoZSBsZWZ0IGNoYW5uZWwuCi0gKglUaGUgcGFyYW1ldGVyIElEcyBvZiB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlCi0gKgkoI0FTTV9NT0RVTEVfSURfSUlSVU5JTkdfRklMVEVSKSBhcmUgdXNlZCBmb3IgdGhlIGxlZnQgSUlSIFJ4IHR1bmluZwotICoJZmlsdGVyLgotICoKLSAqIFBhbiBwYXJhbWV0ZXJzIGFyZSBub3QgcmVxdWlyZWQgZm9yIHRoaXMgcGVyLWNoYW5uZWwgSUlSIGZpbHRlcjsgdGhlIHBhbgotICogcGFyYW1ldGVycyBhcmUgaWdub3JlZCBieSB0aGlzIG1vZHVsZS4KLSAqLwotI2RlZmluZSBBRE1fTU9EVUxFX0lEX0xFRlRfSUlSVU5JTkdfRklMVEVSICAgICAgMHgwMDAxMDcwNQotCi0vKiBJRCBvZiB0aGUgdGhlIFJ4IHBhdGggSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlIGZvciB0aGUgcmlnaHQKLSAqIGNoYW5uZWwuCi0gKiBUaGUgcGFyYW1ldGVyIElEcyBvZiB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgbW9kdWxlCi0gKiAoI0FTTV9NT0RVTEVfSURfSUlSVU5JTkdfRklMVEVSKSBhcmUgdXNlZCBmb3IgdGhlIHJpZ2h0IElJUiBSeAotICogdHVuaW5nIGZpbHRlci4KLSAqCi0gKiBQYW4gcGFyYW1ldGVycyBhcmUgbm90IHJlcXVpcmVkIGZvciB0aGlzIHBlci1jaGFubmVsIElJUiBmaWx0ZXI7Ci0gKiB0aGUgcGFuIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQgYnkgdGhpcyBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgQURNX01PRFVMRV9JRF9SSUdIVF9JSVJVTklOR19GSUxURVIgICAgMHgwMDAxMDcwNgotCi0vKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzICovCi0KLS8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLwotCi0vKiBJRCBvZiB0aGUgVHggSUlSIGZpbHRlciBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRFhfSUlSX0ZJTFRFUiBtb2R1bGUuCi0gKiBAcGFyc3BhY2UgTWVzc2FnZSBwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbXhfaWlyX2ZpbHRlcl9lbmFibGVfY2ZnfQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9FTkFCTEVfQ09ORklHLnRleH0KLSAqLwotI2RlZmluZSBBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfRU5BQkxFX0NPTkZJRyAgIDB4MDAwMTBDNDIKLQotLyogSUQgb2YgdGhlIFR4IElJUiBmaWx0ZXIgcHJlZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBRE1fTU9EVUxFX0lEWF9JSVJfRklMVEVSIG1vZHVsZS4KLSAqIEBwYXJzcGFjZSBNZXNzYWdlIHBheWxvYWQKLSAqIEBzdHJ1Y3R1cmV7YWRteF9paXJfZmlsdGVyX3ByZV9nYWlufQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9QUkVfR0FJTi50ZXh9Ci0gKi8KLSNkZWZpbmUgQURNX1BBUkFNX0lEWF9JSVJfRklMVEVSX1BSRV9HQUlOICAgIDB4MDAwMTBDNDMKLQotLyogSUQgb2YgdGhlIFR4IElJUiBmaWx0ZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRFhfSUlSX0ZJTFRFUiBtb2R1bGUuCi0gKiBAcGFyc3BhY2UgTWVzc2FnZSBwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbXhfaWlyX2ZpbHRlcl9jZmdfcGFyYW1zfQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9DT05GSUdfUEFSQU1TLnRleH0KLSAqLwotI2RlZmluZSBBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfQ09ORklHX1BBUkFNUyAgICAgMHgwMDAxMEM0NAotCi0vKiBTdHJ1Y3R1cmUgZm9yIGVuYWJsaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IgdGhlCi0gKiBJSVIgZmlsdGVyIG1vZHVsZSBvbiB0aGUgVHggcGF0aC4KLSAqLwotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRFhfSUlSX0ZJTFRFUl9FTkFCTEVfQ09ORklHCi0gKiBwYXJhbWV0ZXIgaW4gdGhlIFR4IFBhdGggSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgotICovCi0KLXN0cnVjdCBhZG14X2lpcl9maWx0ZXJfZW5hYmxlX2NmZyB7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBlbmFibGVfZmxhZzsKLS8qPCBTcGVjaWZpZXMgd2hldGhlciB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgaXMgZGlzYWJsZWQgKDApIG9yCi0gKiBlbmFibGVkIChub256ZXJvKS4KLSAqLwotCi19IF9fcGFja2VkOwotCi0KLS8qIFN0cnVjdHVyZSBmb3IgdGhlIHByZWdhaW4gcGFyYW1ldGVyIGZvciB0aGUKLSAqIElJUiBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgotICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfUFJFX0dBSU4KLSAqIHBhcmFtZXRlciBpbiB0aGUgVHggUGF0aCBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuCi0gKi8KLQotc3RydWN0IGFkbXhfaWlyX2ZpbHRlcl9wcmVfZ2FpbiB7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgICBwcmVfZ2FpbjsKLQkvKjwgTGluZWFyIGdhaW4gaW4gUTEzIGZvcm1hdC4gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0KLS8qIFN0cnVjdHVyZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciB0aGUKLSAqIElJUiBmaWx0ZXIgbW9kdWxlIG9uIHRoZSBUeCBwYXRoLgotICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURYX0lJUl9GSUxURVJfQ09ORklHX1BBUkFNUwotICogcGFyYW1ldGVyIGluIHRoZSBUeCBQYXRoIElJUiBUdW5pbmcgRmlsdGVyIG1vZHVsZS4gXG4KLSAqCVxuCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBmb2xsb3dlZCBieSB0aGUgSFBGIElJUiBmaWx0ZXIgY29lZmZpY2llbnRzIG9uCi0gKiB0aGUgVHggcGF0aCBhcyBmb2xsb3dzOiBcbgotICogLSBTZXF1ZW5jZSBvZiBpbnQzMl90IHVsRmlsdGVyQ29lZmZzLiBFYWNoIGJhbmQgaGFzIGZpdmUKLSAqIGNvZWZmaWNpZW50cywgZWFjaCBpbiBpbnQzMl90IGZvcm1hdCBpbiB0aGUgb3JkZXIgb2YgYjAsIGIxLCBiMiwKLSAqIGExLCBhMi4KLSAqIC0gU2VxdWVuY2Ugb2YgaW50MTZfdCBzTnVtU2hpZnRGYWN0b3IuIE9uZSBpbnQxNl90IHBlciBiYW5kLiBUaGUKLSAqIG51bWVyYXRvciBzaGlmdCBmYWN0b3IgaXMgcmVsYXRlZCB0byB0aGUgUSBmYWN0b3Igb2YgdGhlIGZpbHRlcgotICogY29lZmZpY2llbnRzLgotICogLSBTZXF1ZW5jZSBvZiB1aW50MTZfdCB1c1BhblNldHRpbmcuIE9uZSB1aW50MTZfdCBmb3IgZWFjaCBiYW5kCi0gKiB0byBpbmRpY2F0ZSBpZiB0aGUgZmlsdGVyIGlzIGFwcGxpZWQgdG8gbGVmdCAoMCksIHJpZ2h0ICgxKSwgb3IKLSAqIGJvdGggKDIpIGNoYW5uZWxzLgotICovCi1zdHJ1Y3QgYWRteF9paXJfZmlsdGVyX2NmZ19wYXJhbXMgewotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgbnVtX2JpcXVhZF9zdGFnZXM7Ci0vKjwgTnVtYmVyIG9mIGJhbmRzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAyMAotICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLQotLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfbW9kdWxlX2lkcyAqLwotCi0vKiBAaW5ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzCi0gKglJRCBvZiB0aGUgUUVuc2VtYmxlIG1vZHVsZS4KLSAqCVRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKLSAqCS0gI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfRU5BQkxFCi0gKgktICNBRE1fUEFSQU1fSURfUUVOU0VNQkxFX0JBQ0tHQUlOCi0gKgktICNBRE1fUEFSQU1fSURfUUVOU0VNQkxFX1NFVF9ORVdfQU5HTEUKLSAqLwotI2RlZmluZSBBRE1fTU9EVUxFX0lEX1FFTlNFTUJMRSAgICAweDAwMDEwQzU5Ci0KLS8qIEBhZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLwotLyogSUQgb2YgdGhlIFFFbnNlbWJsZSBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRF9RRU5TRU1CTEUgbW9kdWxlLgotICogQG1lc3NhZ2VwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9xZW5zZW1ibGVfZW5hYmxlfQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfRU5BQkxFLnRleH0KLSAqLwotI2RlZmluZSBBRE1fUEFSQU1fSURfUUVOU0VNQkxFX0VOQUJMRSAgIDB4MDAwMTBDNjAKLQotLyogSUQgb2YgdGhlIFFFbnNlbWJsZSBiYWNrIGdhaW4gcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRF9RRU5TRU1CTEUgbW9kdWxlLgotICogQG1lc3NhZ2VwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9xZW5zZW1ibGVfcGFyYW1fYmFja2dhaW59Ci0gKiBAdGFibGVzcGFjZQotICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9CQUNLR0FJTi50ZXh9Ci0gKi8KLSNkZWZpbmUgQURNX1BBUkFNX0lEX1FFTlNFTUJMRV9CQUNLR0FJTiAgIDB4MDAwMTBDNjEKLQotLyogSUQgb2YgdGhlIFFFbnNlbWJsZSBuZXcgYW5nbGUgcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQURNX01PRFVMRV9JRF9RRU5TRU1CTEUgbW9kdWxlLgotICogQG1lc3NhZ2VwYXlsb2FkCi0gKiBAc3RydWN0dXJle2FkbV9xZW5zZW1ibGVfcGFyYW1fc2V0X25ld19hbmdsZX0KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BRE1fUEFSQU1fSURfUUVOU0VNQkxFX1NFVF9ORVdfQU5HTEUudGV4fQotICovCi0jZGVmaW5lIEFETV9QQVJBTV9JRF9RRU5TRU1CTEVfU0VUX05FV19BTkdMRSAgICAweDAwMDEwQzYyCi0KLS8qIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciB0aGUKLSAqIFFFbnNlbWJsZSBtb2R1bGUuCi0gKi8KLQotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfRU5BQkxFCi0gKiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgUUVuc2VtYmxlIG1vZHVsZS4KLSAqLwotc3RydWN0IGFkbV9xZW5zZW1ibGVfZW5hYmxlIHsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGVuYWJsZV9mbGFnOwotLyo8IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBRRW5zZW1ibGUgbW9kdWxlIGlzIGRpc2FibGVkICgwKSBvciBlbmFibGVkCi0gKiAobm9uemVybykuCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogU3RydWN0dXJlIGZvciB0aGUgYmFja2dyb3VuZCBnYWluIGZvciB0aGUgUUVuc2VtYmxlIG1vZHVsZS4gKi8KLQotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FETV9QQVJBTV9JRF9RRU5TRU1CTEVfQkFDS0dBSU4KLSAqIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiB0aGUgUUVuc2VtYmxlIG1vZHVsZS4KLSAqLwotc3RydWN0IGFkbV9xZW5zZW1ibGVfcGFyYW1fYmFja2dhaW4gewotCWludDE2X3QgICAgICAgICAgICAgICAgICBiYWNrX2dhaW47Ci0vKjwgTGluZWFyIGdhaW4gaW4gUTE1IGZvcm1hdC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMzI3NjcKLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLS8qIFN0cnVjdHVyZSBmb3Igc2V0dGluZyBhIG5ldyBhbmdsZSBmb3IgdGhlIFFFbnNlbWJsZSBtb2R1bGUuICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBRE1fUEFSQU1fSURfUUVOU0VNQkxFX1NFVF9ORVdfQU5HTEUKLSAqIHBhcmFtZXRlciB1c2VkCi0gKiBieSB0aGUgUUVuc2VtYmxlIG1vZHVsZS4KLSAqLwotc3RydWN0IGFkbV9xZW5zZW1ibGVfcGFyYW1fc2V0X25ld19hbmdsZSB7Ci0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgbmV3X2FuZ2xlOwotLyo8IE5ldyBhbmdsZSBpbiBkZWdyZWVzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAzNTkKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICAgdGltZV9tczsKLS8qPCBUcmFuc2l0aW9uIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHNldCB0aGUgbmV3IGFuZ2xlLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAzMjc2NwotICovCi19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQURNX0NNRF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVAkJCQkweDAwMDEwMzQ5Ci0jZGVmaW5lIEFETV9DTURSU1BfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1QJCQkweDAwMDEwMzUwCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRU5BQkxFCQkJCQkweDAwMDEwOTA0Ci0gLyoKLSAgKiBQYXlsb2FkIG9mIHRoZSBBRE1fQ01EX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUIGNvbW1hbmQuCi0gICovCi1zdHJ1Y3QgYWRtX2NtZF9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdF90IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4gKi8KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGRhdGFfcGF5bG9hZF9hZGRyX2xzdzsKLQkvKgotCSAqIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuCi0JICoKLQkgKgotCSAqIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5LCBpZiBzcGVjaWZpZWQsIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvCi0JICogY29udGFpbiB0aGUgZW50aXJlIHBhcmFtZXRlciBkYXRhIHBheWxvYWQsIGluY2x1ZGluZyB0aGUgbW9kdWxlIElELAotCSAqIHBhcmFtZXRlciBJRCwgcGFyYW1ldGVyIHNpemUsIGFuZCBwYXJhbWV0ZXIgdmFsdWVzLgotCSAqLwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX2FkZHJfbXN3OwotCS8qCi0JICogIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzLgotCSAqCi0JICogVGhpcyBtZW1vcnkgbWFwIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgYURTUCB0aHJvdWdoIHRoZQotCSAqICNBRE1fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZC4KLQkgKgotCSAqIEB2YWx1ZXMKLQkgKiAtIE5vbi1OVUxMIC0tIE9uIGFja25vd2xlZGdtZW50LCB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMgYmVnaW4gYXQKLQkgKiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgKG91dC1vZi1iYW5kKQotCSAqIC0gTlVMTCAtLSBUaGUgYWNrbm93bGVkZ21lbnQncyBwYXlsb2FkIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgZGF0YQotCSAqIChpbi1iYW5kKSBAdGFibGVidWxsZXRlbmQKLQkgKi8KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotCS8qCi0JICogTWF4aW11bSBkYXRhIHNpemUgb2YgdGhlIGxpc3Qgb2YgbW9kdWxlcy4gVGhpcwotCSAqIGZpZWxkIGlzIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBhcmFtX21heF9zaXplOwotCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFBheWxvYWQgb2YgdGhlIEFETV9DTURSU1BfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1QgbWVzc2FnZSwgd2hpY2ggcmV0dXJucwotICogbW9kdWxlIGlkcyBpbiByZXNwb25zZSB0byBhbiBBRE1fQ01EX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUIGNvbW1hbmQuCi0gKiBJbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGFja25vd2xlZGdtZW50IDxiPm1vZHVsZSBpZAotICogZGF0YSB2YXJpYWJsZSBwYXlsb2FkPC9iPiBjb250YWluaW5nIHRoZSBwcmUvcG9zdHByb2Nlc3NpbmcgbW9kdWxlIGlkCi0gKiB2YWx1ZXMuIEZvciBhbiBpbi1iYW5kIHNjZW5hcmlvLCB0aGUgdmFyaWFibGUgcGF5bG9hZCBkZXBlbmRzIG9uIHRoZSBzaXplCi0gKiBvZiB0aGUgcGFyYW1ldGVyLgotICovCi1zdHJ1Y3QgYWRtX2NtZF9yc3BfZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3RfdCB7Ci0JLyogU3RhdHVzIG1lc3NhZ2UgKGVycm9yIGNvZGUpLiAqLwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGF1ZHByb2NfdG9wb2xvZ3lfbW9kdWxlX2lkX2luZm9fdCB7Ci0JdWludDMyX3QJbnVtX21vZHVsZXM7Ci19IF9fcGFja2VkOwotCi0vKiBlbmRfYWRkdG9ncm91cCBhdWRpb19wcF9tb2R1bGVfaWRzICovCi0KLS8qIEBpbmdyb3VwIGF1ZGlvX3BwX21vZHVsZV9pZHMKLSAqIElEIG9mIHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUgcHJlL3Bvc3Rwcm9jZXNzaW5nIGJsb2NrLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOCi0gKiAtICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU4KLSAqIC0gI0FTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NVVRFX0NPTkZJRwotICogLSAjQVNNX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVRFUlMKLSAqIC0gI0FTTV9QQVJBTV9JRF9TT0ZUX1BBVVNFX1BBUkFNRVRFUlMKLSAqIC0gI0FTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTgotICogLSAjQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9NVVRFCi0gKi8KLSNkZWZpbmUgQVNNX01PRFVMRV9JRF9WT0xfQ1RSTCAgIDB4MDAwMTBCRkUKLSNkZWZpbmUgQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDIgIDB4MDAwMTA5MTAKLSNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfVk9MX0NUUkwgQVNNX01PRFVMRV9JRF9WT0xfQ1RSTAotCi0vKiBAYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMgKi8KLS8qIElEIG9mIHRoZSBtYXN0ZXIgZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgI0FTTV9NT0RVTEVfSURfVk9MX0NUUkwKLSAqIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthc21fdm9sdW1lX2N0cmxfbWFzdGVyX2dhaW59Ci0gKiBAdGFibGVzcGFjZQotICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOLnRleH0KLSAqLwotI2RlZmluZSBBU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU4gICAgMHgwMDAxMEJGRgotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOIEFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NQVNURVJfR0FJTgotCi0vKiBJRCBvZiB0aGUgbGVmdC9yaWdodCBjaGFubmVsIGdhaW4gcGFyYW1ldGVyIHVzZWQgYnkgdGhlCi0gKiAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTCBtb2R1bGUuCi0gKiBAbWVzc2FnZXBheWxvYWQKLSAqIEBzdHJ1Y3R1cmV7YXNtX3ZvbHVtZV9jdHJsX2xyX2NoYW5fZ2Fpbn0KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU4udGV4fQotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9MUl9DSEFOTkVMX0dBSU4gICAgIDB4MDAwMTBDMDAKLQotLyogSUQgb2YgdGhlIG11dGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBU01fTU9EVUxFX0lEX1ZPTF9DVFJMIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthc21fdm9sdW1lX2N0cmxfbXV0ZV9jb25maWd9Ci0gKiBAdGFibGVzcGFjZQotICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01VVEVfQ09ORklHLnRleH0KLSAqLwotI2RlZmluZSBBU01fUEFSQU1fSURfVk9MX0NUUkxfTVVURV9DT05GSUcgICAweDAwMDEwQzAxCi0KLS8qIElEIG9mIHRoZSBzb2Z0IHN0ZXBwaW5nIHZvbHVtZSBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlCi0gKiAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTCBtb2R1bGUuCi0gKiBAbWVzc2FnZXBheWxvYWQKLSAqIEBzdHJ1Y3R1cmV7YXNtX3NvZnRfc3RlcF92b2x1bWVfcGFyYW1zfQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FTTV9QQVJBTV9JRF9TT0ZUX1ZPTF9TVEVQUElOR19QQVJBTUVUCi0gKiBFUlMudGV4fQotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9TT0ZUX1ZPTF9TVEVQUElOR19QQVJBTUVURVJTICAweDAwMDEwQzI5Ci0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSU1wKLQkJCUFTTV9QQVJBTV9JRF9TT0ZUX1ZPTF9TVEVQUElOR19QQVJBTUVURVJTCi0KLS8qIElEIG9mIHRoZSBzb2Z0IHBhdXNlIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgI0FTTV9NT0RVTEVfSURfVk9MX0NUUkwKLSAqIG1vZHVsZS4KLSAqLwotI2RlZmluZSBBU01fUEFSQU1fSURfU09GVF9QQVVTRV9QQVJBTUVURVJTICAgMHgwMDAxMEQ2QQotCi0vKiBJRCBvZiB0aGUgbXVsdGlwbGUtY2hhbm5lbCB2b2x1bWUgY29udHJvbCBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlCi0gKiAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTCBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9HQUlOICAweDAwMDEwNzEzCi0KLS8qIElEIG9mIHRoZSBtdWx0aXBsZS1jaGFubmVsIG11dGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlCi0gKiAjQVNNX01PRFVMRV9JRF9WT0xfQ1RSTCBtb2R1bGUuCi0gKi8KLQotI2RlZmluZSBBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX01VVEUgIDB4MDAwMTA3MTQKLQotLyogU3RydWN0dXJlIGZvciB0aGUgbWFzdGVyIGdhaW4gcGFyYW1ldGVyIGZvciBhIHZvbHVtZSBjb250cm9sCi0gKiBtb2R1bGUuCi0gKi8KLQotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NQVNURVJfR0FJTgotICogcGFyYW1ldGVyIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4KLSAqLwotCi0KLQotc3RydWN0IGFzbV92b2x1bWVfY3RybF9tYXN0ZXJfZ2FpbiB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOwotCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG1hc3Rlcl9nYWluOwotCS8qIExpbmVhciBnYWluIGluIFExMyBmb3JtYXQuICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLwotfSBfX3BhY2tlZDsKLQotCi1zdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX2xyX2NoYW5fZ2FpbiB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOwotCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgbF9jaGFuX2dhaW47Ci0JLyo8IExpbmVhciBnYWluIGluIFExMyBmb3JtYXQgZm9yIHRoZSBsZWZ0IGNoYW5uZWwuICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJfY2hhbl9nYWluOwotCS8qPCBMaW5lYXIgZ2FpbiBpbiBRMTMgZm9ybWF0IGZvciB0aGUgcmlnaHQgY2hhbm5lbC4qLwotfSBfX3BhY2tlZDsKLQotCi0vKiBTdHJ1Y3R1cmUgZm9yIHRoZSBtdXRlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZvciBhCi0gKiB2b2x1bWUgY29udHJvbCBtb2R1bGUuCi0gKi8KLQotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9WT0xfQ1RSTF9NVVRFX0NPTkZJRwotICogcGFyYW1ldGVyIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4KLSAqLwotCi0KLXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbXV0ZV9jb25maWcgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBtdXRlX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgbXV0ZSBpcyBkaXNhYmxlZCAoMCkgb3IgZW5hYmxlZCAobm9uemVybykuKi8KLQotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZvciBhIHNvZnQgc3RlcHBpbmcgbGluZWFyIHJhbXBpbmcgY3VydmUuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTElORUFSICAwCi0KLS8qCi0gKiBFeHBvbmVudGlhbCByYW1waW5nIGN1cnZlLgotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0VYUCAgICAxCi0KLS8qCi0gKiBMb2dhcml0aG1pYyByYW1waW5nIGN1cnZlLgotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0xPRyAgICAyCi0KLS8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBzb2Z0IHN0ZXBwaW5nIHZvbHVtZSBwYXJhbWV0ZXJzLiAqLwotCi0KLS8qICBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX1NPRlRfVk9MX1NURVBQSU5HX1BBUkFNRVRFUlMKLSAqIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLgotICovCi1zdHJ1Y3QgYXNtX3NvZnRfc3RlcF92b2x1bWVfcGFyYW1zIHsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07Ci0Jc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGVyaW9kOwotLyo8IFBlcmlvZCBpbiBtaWxsaXNlY29uZHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDE1MDAwCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgc3RlcDsKLS8qPCBTdGVwIGluIG1pY3Jvc2Vjb25kcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTUwMDAwMDAKLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICByYW1waW5nX2N1cnZlOwotLyo8IFJhbXBpbmcgY3VydmUgdHlwZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fUEFSQU1fU1ZDX1JBTVBJTkdDVVJWRV9MSU5FQVIKLSAqIC0gI0FTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0VYUAotICogLSAjQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTE9HCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogU3RydWN0dXJlIGZvciBob2xkaW5nIHNvZnQgcGF1c2UgcGFyYW1ldGVycy4gKi8KLQotCi0vKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX1NPRlRfUEFVU0VfUEFSQU1FVEVSUwotICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBWb2x1bWUgQ29udHJvbCBtb2R1bGUuCi0gKi8KLQotCi1zdHJ1Y3QgYXNtX3NvZnRfcGF1c2VfcGFyYW1zIHsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGFyYW07Ci0Jc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MiBkYXRhOwotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgc29mdCBwYXVzZSBpcyBkaXNhYmxlZCAoMCkgb3IgZW5hYmxlZAotICogKG5vbnplcm8pLgotICovCi0KLQotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBwZXJpb2Q7Ci0vKjwgUGVyaW9kIGluIG1pbGxpc2Vjb25kcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMTUwMDAKLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBzdGVwOwotLyo8IFN0ZXAgaW4gbWljcm9zZWNvbmRzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxNTAwMDAwMAotICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHJhbXBpbmdfY3VydmU7Ci0vKjwgUmFtcGluZyBjdXJ2ZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtICNBU01fUEFSQU1fU1ZDX1JBTVBJTkdDVVJWRV9MSU5FQVIKLSAqIC0gI0FTTV9QQVJBTV9TVkNfUkFNUElOR0NVUlZFX0VYUAotICogLSAjQVNNX1BBUkFNX1NWQ19SQU1QSU5HQ1VSVkVfTE9HCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyogTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMuKi8KLSNkZWZpbmUgVk9MVU1FX0NPTlRST0xfTUFYX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgICA4Ci0KLS8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBvbmUgY2hhbm5lbCB0eXBlIC0gZ2FpbiBwYWlyLiAqLwotCi0KLS8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX0dBSU4gY2hhbm5lbAotICogdHlwZS9nYWluIHBhaXJzIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4gXG4gXG4gVGhpcwotICogc3RydWN0dXJlIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0gKiBhc21fdm9sdW1lX2N0cmxfbXVsdGljaGFubmVsX2dhaW4gc3RydWN0dXJlLgotICovCi0KLQotc3RydWN0IGFzbV92b2x1bWVfY3RybF9jaGFubmVsdHlwZV9nYWluX3BhaXIgewotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgY2hhbm5lbHR5cGU7Ci0JLyoKLQkgKiBDaGFubmVsIHR5cGUgZm9yIHdoaWNoIHRoZSBnYWluIHNldHRpbmcgaXMgdG8gYmUgYXBwbGllZC4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIC0gI1BDTV9DSEFOTkVMX0wKLQkgKiAtICNQQ01fQ0hBTk5FTF9SCi0JICogLSAjUENNX0NIQU5ORUxfQwotCSAqIC0gI1BDTV9DSEFOTkVMX0xTCi0JICogLSAjUENNX0NIQU5ORUxfUlMKLQkgKiAtICNQQ01fQ0hBTk5FTF9MRkUKLQkgKiAtICNQQ01fQ0hBTk5FTF9DUwotCSAqIC0gI1BDTV9DSEFOTkVMX0xCCi0JICogLSAjUENNX0NIQU5ORUxfUkIKLQkgKiAtICNQQ01fQ0hBTk5FTFMKLQkgKiAtICNQQ01fQ0hBTk5FTF9DVkgKLQkgKiAtICNQQ01fQ0hBTk5FTF9NUwotCSAqIC0gI1BDTV9DSEFOTkVMX0ZMQwotCSAqIC0gI1BDTV9DSEFOTkVMX0ZSQwotCSAqIC0gI1BDTV9DSEFOTkVMX1JMQwotCSAqIC0gI1BDTV9DSEFOTkVMX1JSQwotCSAqLwotCi0JdWludDhfdCAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7Ci0JLyogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCi0KLQl1aW50OF90ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsKLQkvKiBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KLQotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOwotCS8qIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBnYWluOwotCS8qCi0JICogR2FpbiB2YWx1ZSBmb3IgdGhpcyBjaGFubmVsIGluIFEyOCBmb3JtYXQuCi0JICogU3VwcG9ydGVkIHZhbHVlczogQW55Ci0JICovCi19IF9fcGFja2VkOwotCi0KLS8qIFN0cnVjdHVyZSBmb3IgdGhlIG11bHRpY2hhbm5lbCBnYWluIGNvbW1hbmQgKi8KLQotCi0vKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9HQUlOCi0gKiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4KLSAqLwotCi0KLXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbXVsdGljaGFubmVsX2dhaW4gewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHM7Ci0JLyoKLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIHdoaWNoIGdhaW4gdmFsdWVzIGFyZSBwcm92aWRlZC4gQW55Ci0JICogY2hhbm5lbHMgcHJlc2VudCBpbiB0aGUgZGF0YSBmb3Igd2hpY2ggZ2FpbiBpcyBub3QgcHJvdmlkZWQgYXJlCi0JICogc2V0IHRvIHVuaXR5IGdhaW4uCi0JICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA4Ci0JICovCi0KLQlzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX2NoYW5uZWx0eXBlX2dhaW5fcGFpcgotCQlnYWluX2RhdGFbVk9MVU1FX0NPTlRST0xfTUFYX0NIQU5ORUxTXTsKLQkvKiBBcnJheSBvZiBjaGFubmVsIHR5cGUvZ2FpbiBwYWlycy4qLwotfSBfX3BhY2tlZDsKLQotCi0vKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgb25lIGNoYW5uZWwgdHlwZSAtIG11dGUgcGFpci4gKi8KLQotCi0vKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9NVVRFIGNoYW5uZWwKLSAqIHR5cGUvbXV0ZSBzZXR0aW5nIHBhaXJzIHVzZWQgYnkgdGhlIFZvbHVtZSBDb250cm9sIG1vZHVsZS4gXG4gXG4KLSAqIFRoaXMgc3RydWN0dXJlIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0gKiBhc21fdm9sdW1lX2N0cmxfbXVsdGljaGFubmVsX211dGUgc3RydWN0dXJlLgotICovCi0KLQotc3RydWN0IGFzbV92b2x1bWVfY3RybF9jaGFubmVseXBlX211dGVfcGFpciB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOwotCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgIGNoYW5uZWx5cGU7Ci0vKjwgQ2hhbm5lbCB0eXBlIGZvciB3aGljaCB0aGUgbXV0ZSBzZXR0aW5nIGlzIHRvIGJlIGFwcGxpZWQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAjUENNX0NIQU5ORUxfTAotICogLSAjUENNX0NIQU5ORUxfUgotICogLSAjUENNX0NIQU5ORUxfQwotICogLSAjUENNX0NIQU5ORUxfTFMKLSAqIC0gI1BDTV9DSEFOTkVMX1JTCi0gKiAtICNQQ01fQ0hBTk5FTF9MRkUKLSAqIC0gI1BDTV9DSEFOTkVMX0NTCi0gKiAtICNQQ01fQ0hBTk5FTF9MQgotICogLSAjUENNX0NIQU5ORUxfUkIKLSAqIC0gI1BDTV9DSEFOTkVMUwotICogLSAjUENNX0NIQU5ORUxfQ1ZICi0gKiAtICNQQ01fQ0hBTk5FTF9NUwotICogLSAjUENNX0NIQU5ORUxfRkxDCi0gKiAtICNQQ01fQ0hBTk5FTF9GUkMKLSAqIC0gI1BDTV9DSEFOTkVMX1JMQwotICogLSAjUENNX0NIQU5ORUxfUlJDCi0gKi8KLQotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KLQotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KLQotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbXV0ZTsKLS8qPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgY2hhbm5lbC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0gKiAtIDAgPSBVbm11dGUKLSAqIC0gTm9uemVybyA9IE11dGUKLSAqLwotfSBfX3BhY2tlZDsKLQotCi0vKiBTdHJ1Y3R1cmUgZm9yIHRoZSBtdWx0aWNoYW5uZWwgbXV0ZSBjb21tYW5kICovCi0KLQotLyogQGJyaWVmIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTVVMVElDSEFOTkVMX01VVEUKLSAqIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgVm9sdW1lIENvbnRyb2wgbW9kdWxlLgotICovCi0KLQotc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfbXV0ZSB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfcHBfcGFyYW1zX3YyIHBhcmFtOwotCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVsczsKLS8qPCBOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIHdoaWNoIG11dGUgY29uZmlndXJhdGlvbiBpcwotICogcHJvdmlkZWQuIEFueSBjaGFubmVscyBwcmVzZW50IGluIHRoZSBkYXRhIGZvciB3aGljaCBtdXRlCi0gKiBjb25maWd1cmF0aW9uIGlzIG5vdCBwcm92aWRlZCBhcmUgc2V0IHRvIHVubXV0ZS4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAotICovCi0KLXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfY2hhbm5lbHlwZV9tdXRlX3BhaXIKLQkJCQltdXRlX2RhdGFbVk9MVU1FX0NPTlRST0xfTUFYX0NIQU5ORUxTXTsKLQkvKjwgQXJyYXkgb2YgY2hhbm5lbCB0eXBlL211dGUgc2V0dGluZyBwYWlycy4qLwotfSBfX3BhY2tlZDsKLS8qIGVuZF9hZGR0b2dyb3VwIGF1ZGlvX3BwX3BhcmFtX2lkcyAqLwotCi0vKiBhdWRpb19wcF9tb2R1bGVfaWRzCi0gKiBJRCBvZiB0aGUgSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9FTkFCTEVfQ09ORklHCi0gKiAtICNBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX1BSRV9HQUlOCi0gKiAtICNBU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX0NPTkZJR19QQVJBTVMKLSAqLwotI2RlZmluZSBBU01fTU9EVUxFX0lEX0lJUlVOSU5HX0ZJTFRFUiAgIDB4MDAwMTBDMDIKLQotLyogQGFkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCi0vKiBJRCBvZiB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5IHRoZQotICogI0FTTV9NT0RVTEVfSURfSUlSVU5JTkdfRklMVEVSIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthc21faWlydW5pbmdfZmlsdGVyX2VuYWJsZX0KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfSUlSVU5JTkdfRklMVEVSX0VOQUJMRV9DTwotICogTkZJRy50ZXh9Ci0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9FTkFCTEVfQ09ORklHICAgMHgwMDAxMEMwMwotCi0vKiBJRCBvZiB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgcHJlZ2FpbiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqICNBU01fTU9EVUxFX0lEX0lJUlVOSU5HX0ZJTFRFUiBtb2R1bGUuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9QUkVfR0FJTiAgMHgwMDAxMEMwNAotCi0vKiBJRCBvZiB0aGUgSUlSIHR1bmluZyBmaWx0ZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHVzZWQgYnkgdGhlCi0gKiAjQVNNX01PRFVMRV9JRF9JSVJVTklOR19GSUxURVIgbW9kdWxlLgotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfQ09ORklHX1BBUkFNUyAgMHgwMDAxMEMwNQotCi0vKiBTdHJ1Y3R1cmUgZm9yIGFuIGVuYWJsZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBmb3IgYW4KLSAqIElJUiB0dW5pbmcgZmlsdGVyIG1vZHVsZS4KLSAqLwotCi0KLS8qIEBicmllZiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX0lJUlVOSU5HX0ZJTFRFUl9FTkFCTEVfQ09ORklHCi0gKiBwYXJhbWV0ZXIgdXNlZCBieSB0aGUgSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgotICovCi1zdHJ1Y3QgYXNtX2lpcnVuaW5nX2ZpbHRlcl9lbmFibGUgewotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIElJUiB0dW5pbmcgZmlsdGVyIGlzIGRpc2FibGVkICgwKSBvcgotICogZW5hYmxlZCAoMSkuCi0gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFN0cnVjdHVyZSBmb3IgdGhlIHByZWdhaW4gcGFyYW1ldGVyIGZvciBhbiBJSVIgdHVuaW5nIGZpbHRlciBtb2R1bGUuICovCi0KLQotLyogUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfUFJFX0dBSU4KLSAqIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgSUlSIFR1bmluZyBGaWx0ZXIgbW9kdWxlLgotICovCi1zdHJ1Y3QgYXNtX2lpcnVuaW5nX2ZpbHRlcl9wcmVnYWluIHsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHByZWdhaW47Ci0JLyo8IExpbmVhciBnYWluIGluIFExMyBmb3JtYXQuICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotCS8qPCBDbGllbnRzIG11c3Qgc2V0IHRoaXMgZmllbGQgdG8gemVyby4qLwotfSBfX3BhY2tlZDsKLQotLyogU3RydWN0dXJlIGZvciB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIElJUiB0dW5pbmcgZmlsdGVyCi0gKiBtb2R1bGUuCi0gKi8KLQotCi0vKiBAYnJpZWYgUGF5bG9hZCBvZiB0aGUgI0FTTV9QQVJBTV9JRF9JSVJVTklOR19GSUxURVJfQ09ORklHX1BBUkFNUwotICogcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBJSVIgVHVuaW5nIEZpbHRlciBtb2R1bGUuIFxuCi0gKiBcbgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgZm9sbG93ZWQgYnkgdGhlIElJUiBmaWx0ZXIgY29lZmZpY2llbnRzOiBcbgotICogLSBTZXF1ZW5jZSBvZiBpbnQzMl90IEZpbHRlckNvZWZmcyBcbgotICogRml2ZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZC4gRWFjaCBjb2VmZmljaWVudCBpcyBpbiBpbnQzMl90IGZvcm1hdCwgaW4KLSAqIHRoZSBvcmRlciBvZiBiMCwgYjEsIGIyLCBhMSwgYTIuCi0gKiAtIFNlcXVlbmNlIG9mIGludDE2X3QgTnVtU2hpZnRGYWN0b3IgXG4KLSAqIE9uZSBpbnQxNl90IHBlciBiYW5kLiBUaGUgbnVtZXJhdG9yIHNoaWZ0IGZhY3RvciBpcyByZWxhdGVkIHRvIHRoZSBRCi0gKiBmYWN0b3Igb2YgdGhlIGZpbHRlciBjb2VmZmljaWVudHMuCi0gKiAtIFNlcXVlbmNlIG9mIHVpbnQxNl90IFBhblNldHRpbmcgXG4KLSAqIE9uZSB1aW50MTZfdCBwZXIgYmFuZCwgaW5kaWNhdGluZyBpZiB0aGUgZmlsdGVyIGlzIGFwcGxpZWQgdG8gbGVmdCAoMCksCi0gKiByaWdodCAoMSksIG9yIGJvdGggKDIpIGNoYW5uZWxzLgotICovCi1zdHJ1Y3QgYXNtX2lpcl9maWx0ZXJfY29uZmlnX3BhcmFtcyB7Ci0JdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1fYmlxdWFkX3N0YWdlczsKLS8qPCBOdW1iZXIgb2YgYmFuZHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDIwCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci0JLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0vKiBhdWRpb19wcF9tb2R1bGVfaWRzCi0gKiBJRCBvZiB0aGUgTXVsdGliYW5kIER5bmFtaWMgUmFuZ2UgQ29udHJvbCAoTUJEUkMpIG1vZHVsZSBvbiB0aGUgVHgvUngKLSAqIHBhdGhzLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQVNNX1BBUkFNX0lEX01CRFJDX0VOQUJMRQotICogLSAjQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVMKLSAqLwotI2RlZmluZSBBU01fTU9EVUxFX0lEX01CRFJDICAgMHgwMDAxMEMwNgotCi0vKiBhdWRpb19wcF9wYXJhbV9pZHMgKi8KLS8qIElEIG9mIHRoZSBNQkRSQyBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkgdGhlICNBU01fTU9EVUxFX0lEX01CRFJDIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthc21fbWJkcmNfZW5hYmxlfQotICogQHRhYmxlc3BhY2UKLSAqIEBpbnB1dHRhYmxle0F1ZGlvX1Bvc3Rwcm9jX0FTTV9QQVJBTV9JRF9NQkRSQ19FTkFCTEUudGV4fQotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9NQkRSQ19FTkFCTEUgICAweDAwMDEwQzA3Ci0KLS8qIElEIG9mIHRoZSBNQkRSQyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKLSAqICNBU01fTU9EVUxFX0lEX01CRFJDIG1vZHVsZS4KLSAqIEBtZXNzYWdlcGF5bG9hZAotICogQHN0cnVjdHVyZXthc21fbWJkcmNfY29uZmlnX3BhcmFtc30KLSAqIEB0YWJsZXNwYWNlCi0gKiBAaW5wdXR0YWJsZXtBdWRpb19Qb3N0cHJvY19BU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUy50ZXh9Ci0gKgotICogQHBhcnNwYWNlIFN1Yi1iYW5kIERSQyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKLSAqIEBzdHJ1Y3R1cmV7YXNtX3N1YmJhbmRfZHJjX2NvbmZpZ19wYXJhbXN9Ci0gKiBAdGFibGVzcGFjZQotICogQGlucHV0dGFibGV7QXVkaW9fUG9zdHByb2NfQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVNfc3ViYmFuZF9EUkMudGV4fQotICoKLSAqIEBrZWVwezZ9Ci0gKiBUbyBvYnRhaW4gbGVnYWN5IEFEUkMgZnJvbSBNQkRSQywgdXNlIHRoZSBjYWxpYnJhdGlvbiB0b29sIHRvOgotICoKLSAqIC0gRW5hYmxlIE1CRFJDIChFbmFibGVGbGFnID0gVFJVRSkKLSAqIC0gU2V0IG51bWJlciBvZiBiYW5kcyB0byAxICh1aU51bUJhbmRzID0gMSkKLSAqIC0gRW5hYmxlIHRoZSBmaXJzdCBNQkRSQyBiYW5kIChEcmNNb2RlWzBdID0gRFJDX0VOQUJMRUQgPSAxKQotICogLSBDbGVhciB0aGUgZmlyc3QgYmFuZCBtdXRlIGZsYWcgKE11dGVGbGFnWzBdID0gMCkKLSAqIC0gU2V0IHRoZSBmaXJzdCBiYW5kIG1ha2V1cCBnYWluIHRvIHVuaXR5IChjb21wTWFrZVVwR2FpblswXSA9IDB4MjAwMCkKLSAqIC0gVXNlIHRoZSBsZWdhY3kgQURSQyBwYXJhbWV0ZXJzIHRvIGNhbGlicmF0ZSB0aGUgcmVzdCBvZiB0aGUgTUJEUkMKLSAqIHBhcmFtZXRlcnMuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVMgIDB4MDAwMTBDMDgKLQotLyogZW5kX2FkZHRvZ3JvdXAgYXVkaW9fcHBfcGFyYW1faWRzICovCi0KLS8qIGF1ZGlvX3BwX21vZHVsZV9pZHMKLSAqIElEIG9mIHRoZSBNTUJEUkMgbW9kdWxlIHZlcnNpb24gMiBwcmUvcG9zdHByb2Nlc3NpbmcgYmxvY2suCi0gKiBUaGlzIG1vZHVsZSBkaWZmZXJzIGZyb20gdGhlIG9yaWdpbmFsIE1CRFJDICgjQVNNX01PRFVMRV9JRF9NQkRSQykgaW4KLSAqIHRoZSBsZW5ndGggb2YgdGhlIGZpbHRlcnMgdXNlZCBpbiBlYWNoIHN1Yi1iYW5kLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSUQ6Ci0gKiAtICNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNU19JTVBST1ZFRF9GSUxUQkFOS19WMgotICovCi0jZGVmaW5lIEFTTV9NT0RVTEVfSURfTUJEUkNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDcwQgotCi0vKiBAYWRkdG9ncm91cCBhdWRpb19wcF9wYXJhbV9pZHMgKi8KLS8qIElEIG9mIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUKLSAqICNBU01fTU9EVUxFX0lEX01CRFJDVjIgbW9kdWxlIGZvciB0aGUgaW1wcm92ZWQgZmlsdGVyIHN0cnVjdHVyZQotICogb2YgdGhlIE1CRFJDIHYyIHByZS9wb3N0cHJvY2Vzc2luZyBibG9jay4KLSAqIFRoZSB1cGRhdGUgdG8gdGhpcyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBmcm9tIHRoZSBvcmlnaW5hbAotICogTUJEUkMgaXMgdGhlIG51bWJlciBvZiBmaWx0ZXIgY29lZmZpY2llbnRzIGluIHRoZSBmaWx0ZXIKLSAqIHN0cnVjdHVyZS4gVGhlIHNlcXVlbmNlIGZvciBpcyBhcyBmb2xsb3dzOgotICogLSAxIGJhbmQgPSAwIEZJUiBjb2VmZmljaWVudCArIDEgbXV0ZSBmbGFnICsgdWludDE2X3QgcGFkZGluZwotICogLSAyIGJhbmRzID0gMTQxIEZJUiBjb2VmZmljaWVudHMgKyAyIG11dGUgZmxhZ3MgKyB1aW50MTZfdCBwYWRkaW5nCi0gKiAtIDMgYmFuZHMgPSAxNDErODEgRklSIGNvZWZmaWNpZW50cyArIDMgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKLSAqIC0gNCBiYW5kcyA9IDE0MSs4MSs2MSBGSVIgY29lZmZpY2llbnRzICsgNCBtdXRlIGZsYWdzICsgdWludDE2X3QKLSAqIHBhZGRpbmcKLSAqIC0gNSBiYW5kcyA9IDE0MSs4MSs2MSs2MSBGSVIgY29lZmZpY2llbnRzICsgNSBtdXRlIGZsYWdzICsKLSAqIHVpbnQxNl90IHBhZGRpbmcKLSAqCVRoaXMgYmxvY2sgdXNlcyB0aGUgc2FtZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGFzCi0gKgkjQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVMuCi0gKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVNfSU1QUk9WRURfRklMVEJBTktfVjIgXAotCQkJCQkJCQkweDAwMDEwNzBDCi0KLSNkZWZpbmUgQVNNX01PRFVMRV9JRF9NQkRSQ1YzCQkJCQkweDAwMDEwOTBCCi0vKgotICogSUQgb2YgdGhlIE1NQkRSQyBtb2R1bGUgdmVyc2lvbiAzIHByZS9wb3N0cHJvY2Vzc2luZyBibG9jay4KLSAqIFRoaXMgbW9kdWxlIGRpZmZlcnMgZnJvbSBNQkRSQ3YyICgjQVNNX01PRFVMRV9JRF9NQkRSQ1YyKSBpbgotICogdGhhdCBpdCBzdXBwb3J0cyBib3RoIDE2LSBhbmQgMjQtYml0IGRhdGEuCi0gKiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBJRDoKLSAqIC0gI0FTTV9QQVJBTV9JRF9NQkRSQ19FTkFCTEUKLSAqIC0gI0FTTV9QQVJBTV9JRF9NQkRSQ19DT05GSUdfUEFSQU1TCi0gKiAtICNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNU19WMwotICogLSAjQVNNX1BBUkFNX0lEX01CRFJDX0ZJTFRFUl9YT1ZFUl9GUkVRUwotICovCi0KLS8qIFN0cnVjdHVyZSBmb3IgdGhlIGVuYWJsZSBwYXJhbWV0ZXIgZm9yIGFuIE1CRFJDIG1vZHVsZS4gKi8KLQotCi0vKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX01CRFJDX0VOQUJMRSBwYXJhbWV0ZXIgdXNlZCBieSB0aGUKLSAqIE1CRFJDIG1vZHVsZS4KLSAqLwotc3RydWN0IGFzbV9tYmRyY19lbmFibGUgewotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgTUJEUkMgaXMgZGlzYWJsZWQgKDApIG9yIGVuYWJsZWQgKG5vbnplcm8pLiovCi19IF9fcGFja2VkOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIGFuIE1CRFJDIG1vZHVsZS4gKi8KLQotCi0vKiBQYXlsb2FkIG9mIHRoZSAjQVNNX1BBUkFNX0lEX01CRFJDX0NPTkZJR19QQVJBTVMKLSAqIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgTUJEUkMgbW9kdWxlLiBcbiBcbiBGb2xsb3dpbmcgdGhpcwotICogc3RydWN0dXJlIGlzIHRoZSBwYXlsb2FkIGZvciBzdWItYmFuZCBEUkMgY29uZmlndXJhdGlvbgotICogcGFyYW1ldGVycyAoYXNtX3N1YmJhbmRfZHJjX2NvbmZpZ19wYXJhbXMpLiBUaGlzIHN1Yi1iYW5kCi0gKiBzdHJ1Y3R1cmUgbXVzdCBiZSByZXBlYXRlZCBmb3IgZWFjaCBiYW5kLgotICovCi0KLQotc3RydWN0IGFzbV9tYmRyY19jb25maWdfcGFyYW1zIHsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG51bV9iYW5kczsKLS8qPCBOdW1iZXIgb2YgYmFuZHMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAxIHRvIDUKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICBsaW1pdGVyaHJlc2hvbGQ7Ci0vKjwgVGhyZXNob2xkIGluIGRlY2liZWxzIGZvciB0aGUgbGltaXRlciBvdXRwdXQuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAtNzIgdG8gMTggXG4KLSAqIFJlY29tbWVuZGVkIHZhbHVlOiAzOTk0ICgtMC4yMiBkYiBpbiBRMy4xMiBmb3JtYXQpCi0gKi8KLQotCWludDE2X3QgICAgICAgICAgICAgICAgICAgbGltaXRlcl9tYWtldXBfZ2FpbjsKLS8qPCBNYWtldXAgZ2FpbiBpbiBkZWNpYmVscyBmb3IgdGhlIGxpbWl0ZXIgb3V0cHV0LgotICogU3VwcG9ydGVkIHZhbHVlczogLTQyIHRvIDQyIFxuCi0gKiBSZWNvbW1lbmRlZCB2YWx1ZTogMjU2ICgwIGRCIGluIFE3LjggZm9ybWF0KQotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGxpbWl0ZXJfZ2M7Ci0vKjwgTGltaXRlciBnYWluIHJlY292ZXJ5IGNvZWZmaWNpZW50LgotICogU3VwcG9ydGVkIHZhbHVlczogMC41IHRvIDAuOTkgXG4KLSAqIFJlY29tbWVuZGVkIHZhbHVlOiAzMjQ0MCAoMC45OSBpbiBRMTUgZm9ybWF0KQotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGxpbWl0ZXJfZGVsYXk7Ci0vKjwgTGltaXRlciBkZWxheSBpbiBzYW1wbGVzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxMCBcbgotICogUmVjb21tZW5kZWQgdmFsdWU6IDI2MiAoMC4wMDggc2FtcGxlcyBpbiBRMTUgZm9ybWF0KQotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGxpbWl0ZXJfbWF4X3dhaXQ7Ci0vKjwgTWF4aW11bSBsaW1pdGVyIHdhaXRpbmcgdGltZSBpbiBzYW1wbGVzLgotICogU3VwcG9ydGVkIHZhbHVlczogMCB0byAxMCBcbgotICogUmVjb21tZW5kZWQgdmFsdWU6IDI2MiAoMC4wMDggc2FtcGxlcyBpbiBRMTUgZm9ybWF0KQotICovCi19IF9fcGFja2VkOwotCi0vKiBEUkMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIGVhY2ggc3ViLWJhbmQgb2YgYW4gTUJEUkMgbW9kdWxlLiAqLwotCi0KLS8qIFBheWxvYWQgb2YgdGhlICNBU01fUEFSQU1fSURfTUJEUkNfQ09ORklHX1BBUkFNUyBEUkMKLSAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgZWFjaCBzdWItYmFuZCBpbiB0aGUgTUJEUkMgbW9kdWxlLgotICogQWZ0ZXIgdGhpcyBEUkMgc3RydWN0dXJlIGlzIGNvbmZpZ3VyZWQgZm9yIHZhbGlkIGJhbmRzLCB0aGUgbmV4dAotICogTUJEUkMgc2V0cGFyYW1zIGV4cGVjdHMgdGhlIHNlcXVlbmNlIG9mIHN1Yi1iYW5kIE1CRFJDIGZpbHRlcgotICogY29lZmZpY2llbnRzICh0aGUgbGVuZ3RoIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBiYW5kcykgcGx1cyB0aGUKLSAqIG11dGUgZmxhZyBmb3IgdGhhdCBiYW5kIHBsdXMgdWludDE2X3QgcGFkZGluZy4KLSAqCi0gKiBAa2VlcHsxMH0KLSAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnQgYW5kIG11dGUgZmxhZyBhcmUgb2YgdHlwZSBpbnQxNl90OgotICogLSBGSVIgY29lZmZpY2llbnQgPSBpbnQxNl90IGZpckZpbHRlcgotICogLSBNdXRlIGZsYWcgPSBpbnQxNl90IGZNdXRlRmxhZwotICoKLSAqIFRoZSBzZXF1ZW5jZSBpcyBhcyBmb2xsb3dzOgotICogLSAxIGJhbmQgPSAwIEZJUiBjb2VmZmljaWVudCArIDEgbXV0ZSBmbGFnICsgdWludDE2X3QgcGFkZGluZwotICogLSAyIGJhbmRzID0gOTcgRklSIGNvZWZmaWNpZW50cyArIDIgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKLSAqIC0gMyBiYW5kcyA9IDk3KzMzIEZJUiBjb2VmZmljaWVudHMgKyAzIG11dGUgZmxhZ3MgKyB1aW50MTZfdCBwYWRkaW5nCi0gKiAtIDQgYmFuZHMgPSA5NyszMyszMyBGSVIgY29lZmZpY2llbnRzICsgNCBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZwotICogLSA1IGJhbmRzID0gOTcrMzMrMzMrMzMgRklSIGNvZWZmaWNpZW50cyArIDUgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKLSAqCi0gKiBGb3IgaW1wcm92ZWQgZmlsdGVyYmFuaywgdGhlIHNlcXVlbmNlIGlzIGFzIGZvbGxvd3M6Ci0gKiAtIDEgYmFuZCA9IDAgRklSIGNvZWZmaWNpZW50ICsgMSBtdXRlIGZsYWcgKyB1aW50MTZfdCBwYWRkaW5nCi0gKiAtIDIgYmFuZHMgPSAxNDEgRklSIGNvZWZmaWNpZW50cyArIDIgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKLSAqIC0gMyBiYW5kcyA9IDE0MSs4MSBGSVIgY29lZmZpY2llbnRzICsgMyBtdXRlIGZsYWdzICsgdWludDE2X3QgcGFkZGluZwotICogLSA0IGJhbmRzID0gMTQxKzgxKzYxIEZJUiBjb2VmZmljaWVudHMgKyA0IG11dGUgZmxhZ3MgKyB1aW50MTZfdCBwYWRkaW5nCi0gKiAtIDUgYmFuZHMgPSAxNDErODErNjErNjEgRklSIGNvZWZmaWNpZW50cyArIDUgbXV0ZSBmbGFncyArIHVpbnQxNl90IHBhZGRpbmcKLSAqLwotc3RydWN0IGFzbV9zdWJiYW5kX2RyY19jb25maWdfcGFyYW1zIHsKLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRyY19zdGVyZW9fbGlua2VkX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgYWxsIHN0ZXJlbyBjaGFubmVscyBoYXZlIHRoZSBzYW1lIGFwcGxpZWQKLSAqIGR5bmFtaWNzICgxKSBvciBpZiB0aGV5IHByb2Nlc3MgdGhlaXIgZHluYW1pY3MgaW5kZXBlbmRlbnRseSAoMCkuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOgotICogLSAwIC0tIE5vdCBsaW5rZWQKLSAqIC0gMSAtLSBMaW5rZWQKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICBkcmNfbW9kZTsKLS8qPCBTcGVjaWZpZXMgd2hldGhlciBEUkMgbW9kZSBpcyBieXBhc3NlZCBmb3Igc3ViLWJhbmRzLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gMCAtLSBEaXNhYmxlZAotICogLSAxIC0tIEVuYWJsZWQKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICBkcmNfZG93bl9zYW1wbGVfbGV2ZWw7Ci0vKjwgRFJDIGRvd24gc2FtcGxlIGxldmVsLgotICogU3VwcG9ydGVkIHZhbHVlczogQGdlIDEKLSAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICBkcmNfZGVsYXk7Ci0vKjwgRFJDIGRlbGF5IGluIHNhbXBsZXMuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDEyMDAKLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICBkcmNfcm1zaW1lX2F2Z19jb25zdDsKLS8qPCBSTVMgc2lnbmFsIGVuZXJneSB0aW1lLWF2ZXJhZ2luZyBjb25zdGFudC4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDAgdG8gMl4xNi0xCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZHJjX21ha2V1cF9nYWluOwotLyo8IERSQyBtYWtldXAgZ2FpbiBpbiBkZWNpYmVscy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDI1OCB0byA2NDkxNwotICovCi0JLyogRG93biBleHBhbmRlciBzZXR0aW5ncyAqLwotCWludDE2X3QgICAgICAgICAgICAgICAgICAgZG93bl9leHBkcmhyZXNob2xkOwotLyo8IERvd24gZXhwYW5kZXIgdGhyZXNob2xkLgotICogU3VwcG9ydGVkIFE3IGZvcm1hdCB2YWx1ZXM6IDEzMjAgdG8gdXBfY21wc3JocmVzaG9sZAotICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRvd25fZXhwZHJfc2xvcGU7Ci0vKjwgRG93biBleHBhbmRlciBzbG9wZS4KLSAqIFN1cHBvcnRlZCBROCBmb3JtYXQgdmFsdWVzOiAtMzI3NjggdG8gMC4KLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkb3duX2V4cGRyX2F0dGFjazsKLS8qPCBEb3duIGV4cGFuZGVyIGF0dGFjayBjb25zdGFudC4KLSAqIFN1cHBvcnRlZCBRMzEgZm9ybWF0IHZhbHVlczogMTk2ODQ0IHRvIDJeMzEuCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZG93bl9leHBkcl9yZWxlYXNlOwotLyo8IERvd24gZXhwYW5kZXIgcmVsZWFzZSBjb25zdGFudC4KLSAqIFN1cHBvcnRlZCBRMzEgZm9ybWF0IHZhbHVlczogMTk2ODUgdG8gMl4zMQotICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGRvd25fZXhwZHJfaHlzdGVyZXNpczsKLS8qPCBEb3duIGV4cGFuZGVyIGh5c3RlcmVzaXMgY29uc3RhbnQuCi0gKiBTdXBwb3J0ZWQgUTE0IGZvcm1hdCB2YWx1ZXM6IDEgdG8gMzI2OTAKLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKLQkvKjwgQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uICovCi0KLQlpbnQzMl90ICAgICAgICAgICAgICAgICAgIGRvd25fZXhwZHJfbWluX2dhaW5fZGI7Ci0vKjwgRG93biBleHBhbmRlciBtaW5pbXVtIGdhaW4uCi0gKiBTdXBwb3J0ZWQgUTIzIGZvcm1hdCB2YWx1ZXM6IC04MDUzMDYzNjggdG8gMC4KLSAqLwotCi0JLyogVXAgY29tcHJlc3NvciBzZXR0aW5ncyAqLwotCi0JaW50MTZfdCAgICAgICAgICAgICAgICAgICB1cF9jbXBzcmhyZXNob2xkOwotLyo8IFVwIGNvbXByZXNzb3IgdGhyZXNob2xkLgotICogU3VwcG9ydGVkIFE3IGZvcm1hdCB2YWx1ZXM6IGRvd25fZXhwZHJocmVzaG9sZCB0bwotICogZG93bl9jbXBzcmhyZXNob2xkLgotICovCi0KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHVwX2NtcHNyX3Nsb3BlOwotLyo8IFVwIGNvbXByZXNzb3Igc2xvcGUuCi0gKiBTdXBwb3J0ZWQgUTE2IGZvcm1hdCB2YWx1ZXM6IDAgdG8gNjQ4ODEuCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgdXBfY21wc3JfYXR0YWNrOwotLyo8IFVwIGNvbXByZXNzb3IgYXR0YWNrIGNvbnN0YW50LgotICogU3VwcG9ydGVkIFEzMSBmb3JtYXQgdmFsdWVzOiAxOTY4NDQgdG8gMl4zMS4KLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICB1cF9jbXBzcl9yZWxlYXNlOwotLyo8IFVwIGNvbXByZXNzb3IgcmVsZWFzZSBjb25zdGFudC4KLSAqIFN1cHBvcnRlZCBRMzEgZm9ybWF0IHZhbHVlczogMTk2ODUgdG8gMl4zMS4KLSAqLwotCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICB1cF9jbXBzcl9oeXN0ZXJlc2lzOwotLyo8IFVwIGNvbXByZXNzb3IgaHlzdGVyZXNpcyBjb25zdGFudC4KLSAqIFN1cHBvcnRlZCBRMTQgZm9ybWF0IHZhbHVlczogMSB0byAzMjY5MC4KLSAqLwotCi0JLyogRG93biBjb21wcmVzc29yIHNldHRpbmdzICovCi0KLQlpbnQxNl90ICAgICAgICAgICAgICAgICAgIGRvd25fY21wc3JocmVzaG9sZDsKLS8qPCBEb3duIGNvbXByZXNzb3IgdGhyZXNob2xkLgotICogU3VwcG9ydGVkIFE3IGZvcm1hdCB2YWx1ZXM6IHVwX2NtcHNyaHJlc2hvbGQgdG8gMTE1NjAuCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZG93bl9jbXBzcl9zbG9wZTsKLS8qPCBEb3duIGNvbXByZXNzb3Igc2xvcGUuCi0gKiBTdXBwb3J0ZWQgUTE2IGZvcm1hdCB2YWx1ZXM6IDAgdG8gNjQ4ODEuCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwotLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkb3duX2NtcHNyX2F0dGFjazsKLS8qPCBEb3duIGNvbXByZXNzb3IgYXR0YWNrIGNvbnN0YW50LgotICogU3VwcG9ydGVkIFEzMSBmb3JtYXQgdmFsdWVzOiAxOTY4NDQgdG8gMl4zMS4KLSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkb3duX2NtcHNyX3JlbGVhc2U7Ci0vKjwgRG93biBjb21wcmVzc29yIHJlbGVhc2UgY29uc3RhbnQuCi0gKiBTdXBwb3J0ZWQgUTMxIGZvcm1hdCB2YWx1ZXM6IDE5Njg1IHRvIDJeMzEuCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZG93bl9jbXBzcl9oeXN0ZXJlc2lzOwotLyo8IERvd24gY29tcHJlc3NvciBoeXN0ZXJlc2lzIGNvbnN0YW50LgotICogU3VwcG9ydGVkIFExNCB2YWx1ZXM6IDEgdG8gMzI2OTAuCi0gKi8KLQotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyOwotLyo8IENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9NT0RVTEVfSURfRVFVQUxJWkVSICAgICAgICAgICAgMHgwMDAxMEMyNwotI2RlZmluZSBBU01fUEFSQU1fSURfRVFVQUxJWkVSX1BBUkFNRVRFUlMgIDB4MDAwMTBDMjgKLQotI2RlZmluZSBBU01fTUFYX0VRX0JBTkRTIDEyCi0KLXN0cnVjdCBhc21fZXFfcGVyX2JhbmRfcGFyYW1zIHsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGJhbmRfaWR4OwotLyo8IEJhbmQgaW5kZXguCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAwIHRvIDExCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZmlsdGVyeXBlOwotLyo8IFR5cGUgb2YgZmlsdGVyLgotICogU3VwcG9ydGVkIHZhbHVlczoKLSAqIC0gI0FTTV9QQVJBTV9FUVlQRV9OT05FCi0gKiAtICNBU01fUEFSQU1fRVFfQkFTU19CT09TVAotICogLSAjQVNNX1BBUkFNX0VRX0JBU1NfQ1VUCi0gKiAtICNBU01fUEFSQU1fRVFSRUJMRV9CT09TVAotICogLSAjQVNNX1BBUkFNX0VRUkVCTEVfQ1VUCi0gKiAtICNBU01fUEFSQU1fRVFfQkFORF9CT09TVAotICogLSAjQVNNX1BBUkFNX0VRX0JBTkRfQ1VUCi0gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgY2VudGVyX2ZyZXFfaHo7Ci0JLyo8IEZpbHRlciBiYW5kIGNlbnRlciBmcmVxdWVuY3kgaW4gSGVydHouICovCi0KLQlpbnQzMl90ICAgICAgICAgICAgICAgICAgIGZpbHRlcl9nYWluOwotLyo8IEZpbHRlciBiYW5kIGluaXRpYWwgZ2Fpbi4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6ICsxMiB0byAtMTIgZEIgaW4gMSBkQiBpbmNyZW1lbnRzCi0gKi8KLQotCWludDMyX3QgICAgICAgICAgICAgICAgICAgcV9mYWN0b3I7Ci0vKjwgRmlsdGVyIGJhbmQgcXVhbGl0eSBmYWN0b3IgZXhwcmVzc2VkIGFzIGEgUTggbnVtYmVyLCBpLmUuLCBhCi0gKiBmaXhlZC1wb2ludCBudW1iZXIgd2l0aCBxIGZhY3RvciBvZiA4LiBGb3IgZXhhbXBsZSwgMzAwMC8oMl44KS4KLSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9lcV9wYXJhbXMgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7Ci0JCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZW5hYmxlX2ZsYWc7Ci0vKjwgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVxdWFsaXplciBtb2R1bGUgaXMgZGlzYWJsZWQgKDApIG9yIGVuYWJsZWQKLSAqIChub256ZXJvKS4KLSAqLwotCi0JCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbnVtX2JhbmRzOwotLyo8IE51bWJlciBvZiBiYW5kcy4KLSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gMTIKLSAqLwotCXN0cnVjdCBhc21fZXFfcGVyX2JhbmRfcGFyYW1zIGVxX2JhbmRzW0FTTV9NQVhfRVFfQkFORFNdOwotCi19IF9fcGFja2VkOwotCi0vKglObyBlcXVhbGl6ZXIgZWZmZWN0LiovCi0jZGVmaW5lIEFTTV9QQVJBTV9FUVlQRV9OT05FICAgICAgMAotCi0vKglCYXNzIGJvb3N0IGVxdWFsaXplciBlZmZlY3QuKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0VRX0JBU1NfQk9PU1QgICAgIDEKLQotLypCYXNzIGN1dCBlcXVhbGl6ZXIgZWZmZWN0LiovCi0jZGVmaW5lIEFTTV9QQVJBTV9FUV9CQVNTX0NVVCAgICAgICAyCi0KLS8qCVRyZWJsZSBib29zdCBlcXVhbGl6ZXIgZWZmZWN0ICovCi0jZGVmaW5lIEFTTV9QQVJBTV9FUVJFQkxFX0JPT1NUICAgMwotCi0vKglUcmVibGUgY3V0IGVxdWFsaXplciBlZmZlY3QuKi8KLSNkZWZpbmUgQVNNX1BBUkFNX0VRUkVCTEVfQ1VUICAgICA0Ci0KLS8qCUJhbmQgYm9vc3QgZXF1YWxpemVyIGVmZmVjdC4qLwotI2RlZmluZSBBU01fUEFSQU1fRVFfQkFORF9CT09TVCAgICAgNQotCi0vKglCYW5kIGN1dCBlcXVhbGl6ZXIgZWZmZWN0LiovCi0jZGVmaW5lIEFTTV9QQVJBTV9FUV9CQU5EX0NVVCAgICAgICA2Ci0KLS8qIEdldCAmIHNldCBwYXJhbXMgKi8KLSNkZWZpbmUgVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMgkweDAwMDExMzNECi0jZGVmaW5lIFZTU19JQ09NTU9OX0NNRF9HRVRfUEFSQU1fVjIJMHgwMDAxMTMzRQotI2RlZmluZSBWU1NfSUNPTU1PTl9SU1BfR0VUX1BBUkFNCTB4MDAwMTEwMDgKLQotI2RlZmluZSBWU1NfTUFYX0FWQ1NfTlVNX1NFUlZJQ0VTCTI1Ci0KLS8qIElEIG9mIHRoZSBCYXNzIEJvb3N0IG1vZHVsZS4KLSAqIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIElEczoKLSAqICAtICNBVURQUk9DX1BBUkFNX0lEX0JBU1NfQk9PU1RfRU5BQkxFCi0gKiAgLSAjQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX01PREUKLSAqICAtICNBVURQUk9DX1BBUkFNX0lEX0JBU1NfQk9PU1RfU1RSRU5HVEgKLSAqLwotI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEExCi0vKiBJRCBvZiB0aGUgQmFzcyBCb29zdCBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1QuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBMgotLyogSUQgb2YgdGhlIEJhc3MgQm9vc3QgbW9kZSBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVC4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0JBU1NfQk9PU1RfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEEzCi0vKiBJRCBvZiB0aGUgQmFzcyBCb29zdCBzdHJlbmd0aCBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVC4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0JBU1NfQk9PU1RfU1RSRU5HVEggICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEE0Ci0KLS8qIElEIG9mIHRoZSBQQkUgbW9kdWxlLgotICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9QQkVfRU5BQkxFCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1BCRV9QQVJBTV9DT05GSUcKLSAqLwotI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9QQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzJBCi0vKiBJRCBvZiB0aGUgQmFzcyBCb29zdCBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1QuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9QQkVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMyQgotLyogSUQgb2YgdGhlIEJhc3MgQm9vc3QgbW9kZSBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVC4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1BCRV9QQVJBTV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQzQ5Ci0KLS8qIElEIG9mIHRoZSBWaXJ0dWFsaXplciBtb2R1bGUuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZQotICogZm9sbG93aW5nIHBhcmFtZXRlciBJRHM6Ci0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX0VOQUJMRQotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9TVFJFTkdUSAotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9PVVRfVFlQRQotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9HQUlOX0FESlVTVAotICovCi0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QTUKLS8qIElEIG9mIHRoZSBWaXJ0dWFsaXplciBlbmFibGUgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QTYKLS8qIElEIG9mIHRoZSBWaXJ0dWFsaXplciBzdHJlbmd0aCBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9TVFJFTkdUSCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBNwotLyogSUQgb2YgdGhlIFZpcnR1YWxpemVyIG91dCB0eXBlIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUi4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX09VVF9UWVBFICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEE4Ci0vKiBJRCBvZiB0aGUgVmlydHVhbGl6ZXIgb3V0IHR5cGUgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfVklSVFVBTElaRVJfR0FJTl9BREpVU1QgICAgICAgICAgICAgICAgIDB4MDAwMTA4QTkKLQotLyogSUQgb2YgdGhlIFJldmVyYiBtb2R1bGUuIFRoaXMgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcKLSAqIHBhcmFtZXRlciBJRHM6Ci0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9FTkFCTEUKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX01PREUKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX1BSRVNFVAotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfV0VUX01JWAotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfR0FJTl9BREpVU1QKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JPT01fTEVWRUwKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JPT01fSEZfTEVWRUwKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX1RJTUUKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX0hGX1JBVElPCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9SRUZMRUNUSU9OU19MRVZFTAotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUkVGTEVDVElPTlNfREVMQVkKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfUkVWRVJCX0xFVkVMCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUxBWQotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfRElGRlVTSU9OCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERU5TSVRZCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEFBCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIGVuYWJsZSBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBQgotLyogSUQgb2YgdGhlIFJldmVyYiBtb2RlIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEFDCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIHByZXNldCBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1BSRVNFVCAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhBRAotLyogSUQgb2YgdGhlIFJldmVyYiB3ZXQgbWl4IHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfV0VUX01JWCAgICAgICAgICAgICAgICAgICAweDAwMDEwOEFFCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIGdhaW4gYWRqdXN0IHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfR0FJTl9BREpVU1QgICAgICAgICAgICAgICAweDAwMDEwOEFGCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIHJvb20gbGV2ZWwgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQi4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0xFVkVMICAgICAgICAgICAgICAgIDB4MDAwMTA4QjAKLS8qIElEIG9mIHRoZSBSZXZlcmIgcm9vbSBoZiBsZXZlbCBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JPT01fSEZfTEVWRUwgICAgICAgICAgICAgMHgwMDAxMDhCMQotLyogSUQgb2YgdGhlIFJldmVyYiBkZWNheSB0aW1lIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVDQVlfVElNRSAgICAgICAgICAgICAgICAweDAwMDEwOEIyCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIGRlY2F5IGhmIHJhdGlvIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVDQVlfSEZfUkFUSU8gICAgICAgICAgICAweDAwMDEwOEIzCi0vKiBJRCBvZiB0aGUgUmV2ZXJiIHJlZmxlY3Rpb25zIGxldmVsIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUkVGTEVDVElPTlNfTEVWRUwgICAgICAgICAweDAwMDEwOEI0Ci0vKiBJRCBvZiB0aGUgUmV2ZXJiIHJlZmxlY3Rpb25zIGRlbGF5IHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUkVGTEVDVElPTlNfREVMQVkgICAgICAgICAweDAwMDEwOEI1Ci0vKiBJRCBvZiB0aGUgUmV2ZXJiIGxldmVsIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCNgotLyogSUQgb2YgdGhlIFJldmVyYiBkZWxheSBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFTEFZICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QjcKLS8qIElEIG9mIHRoZSBSZXZlcmIgZGlmZnVzaW9uIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfRElGRlVTSU9OICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCOAotLyogSUQgb2YgdGhlIFJldmVyYiBkZW5zaXR5IHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9SRVZFUkIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCOQotCi0vKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgbW9kdWxlLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyB0aGUKLSAqIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9FTkFCTEUKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfQ09ORklHCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX05VTV9CQU5EUwotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0xFVkVMUwotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0xFVkVMX1JBTkdFCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX0JBTkRfRlJFUVMKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRQotICogLSAjQVVEUFJPQ19QQVJBTV9JRF9FUV9TSU5HTEVfQkFORF9GUkVRCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX0JBTkRfSU5ERVgKLSAqIC0gI0FVRFBST0NfUEFSQU1fSURfRVFfUFJFU0VUX0lECi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX05VTV9QUkVTRVRTCi0gKiAtICNBVURQUk9DX1BBUkFNX0lEX0VRX0dFVF9QUkVTRVRfTkFNRQotICovCi0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEJBCi0vKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgZW5hYmxlIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCQgotLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIGNvbmZpZyBwYXJhbWV0ZXIgdXNlZCBieQotICogQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QkMKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBudW1iZXIgb2YgYmFuZHMgcGFyYW1ldGVyIHVzZWQKLSAqIGJ5IEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLiBUaGlzIHBhcmFtIElEIGlzCi0gKiB1c2VkIGZvciBnZXQgcGFyYW0gb25seS4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX05VTV9CQU5EUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhCRAotLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIGJhbmQgbGV2ZWxzIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcwotICogdXNlZCBmb3IgZ2V0IHBhcmFtIG9ubHkuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0xFVkVMUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QkUKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBiYW5kIGxldmVsIHJhbmdlIHBhcmFtZXRlciB1c2VkCi0gKiBieSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcwotICogdXNlZCBmb3IgZ2V0IHBhcmFtIG9ubHkuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0xFVkVMX1JBTkdFICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QkYKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBiYW5kIGZyZXF1ZW5jaWVzIHBhcmFtZXRlciB1c2VkCi0gKiBieSBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcwotICogdXNlZCBmb3IgZ2V0IHBhcmFtIG9ubHkuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9CQU5EX0ZSRVFTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QzAKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBzaW5nbGUgYmFuZCBmcmVxdWVuY3kgcmFuZ2UKLSAqIHBhcmFtZXRlciB1c2VkIGJ5IEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLgotICogIFRoaXMgcGFyYW0gSUQgaXMgdXNlZCBmb3IgZ2V0IHBhcmFtIG9ubHkuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9TSU5HTEVfQkFORF9GUkVRX1JBTkdFICAgICAgICAgICAgIDB4MDAwMTA4QzEKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBzaW5nbGUgYmFuZCBmcmVxdWVuY3kgcGFyYW1ldGVyCi0gKiB1c2VkIGJ5IEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLiBUaGlzIHBhcmFtIElECi0gKiBpcyB1c2VkIGZvciBzZXQgcGFyYW0gb25seS4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX1NJTkdMRV9CQU5EX0ZSRVEgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhDMgotLyogSUQgb2YgdGhlIFBvcGxlc3MgRXF1YWxpemVyIGJhbmQgaW5kZXggcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfQkFORF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEMzCi0vKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgcHJlc2V0IGlkIHBhcmFtZXRlciB1c2VkIGJ5Ci0gKiBBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUi4gVGhpcyBwYXJhbSBJRCBpcyB1c2VkCi0gKiBmb3IgZ2V0IHBhcmFtIG9ubHkuCi0gKi8KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9FUV9QUkVTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4QzQKLS8qIElEIG9mIHRoZSBQb3BsZXNzIEVxdWFsaXplciBudW1iZXIgb2YgcHJlc2V0cyBwYXJhbWV0ZXIgdXNlZAotICogYnkgQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVIuIFRoaXMgcGFyYW0gSUQgaXMgdXNlZAotICogZm9yIGdldCBwYXJhbSBvbmx5LgotICovCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfRVFfTlVNX1BSRVNFVFMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwOEM1Ci0vKiBJRCBvZiB0aGUgUG9wbGVzcyBFcXVhbGl6ZXIgcHJlc2V0IG5hbWUgcGFyYW1ldGVyIHVzZWQgYnkKLSAqIEFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSLiBUaGlzIHBhcmFtIElEIGlzIHVzZWQKLSAqIGZvciBnZXQgcGFyYW0gb25seS4KLSAqLwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VRX1BSRVNFVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDhDNgotCi0vKiBTZXQgUTYgdG9wb2xvZ2llcyAqLwotI2RlZmluZSBBU01fQ01EX0FERF9UT1BPTE9HSUVTCQkJCTB4MDAwMTBEQkUKLSNkZWZpbmUgQURNX0NNRF9BRERfVE9QT0xPR0lFUwkJCQkweDAwMDEwMzM1Ci0jZGVmaW5lIEFGRV9DTURfQUREX1RPUE9MT0dJRVMJCQkJMHgwMDAxMDBmOAotLyogc3RydWN0dXJlIHVzZWQgZm9yIGJvdGggaW9jdGxzICovCi1zdHJ1Y3QgY21kX3NldF90b3BvbG9naWVzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyCQlwYXlsb2FkX2FkZHJfbHN3OwotCS8qIExTVyBvZiBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGFkZHJlc3MuKi8KLQl1MzIJCXBheWxvYWRfYWRkcl9tc3c7Ci0JLyogTVNXIG9mIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgYWRkcmVzcy4qLwotCXUzMgkJbWVtX21hcF9oYW5kbGU7Ci0JLyogTWVtb3J5IG1hcCBoYW5kbGUgcmV0dXJuZWQgYnkgbWVtIG1hcCBjb21tYW5kICovCi0JdTMyCQlwYXlsb2FkX3NpemU7Ci0JLyogU2l6ZSBpbiBieXRlcyBvZiB0aGUgdmFyaWFibGUgcGF5bG9hZCBpbiBzaGFyZWQgbWVtb3J5ICovCi19IF9fcGFja2VkOwotCi0vKiBUaGlzIG1vZHVsZSByZXByZXNlbnRzIHRoZSBSeCBwcm9jZXNzaW5nIG9mIEZlZWRiYWNrIHNwZWFrZXIgcHJvdGVjdGlvbi4KLSAqIEl0IGNvbnRhaW5zIHRoZSBleGN1cnNpb24gY29udHJvbCwgdGhlcm1hbCBwcm90ZWN0aW9uLAotICogYW5hbG9nIGNsaXAgbWFuYWdlciBmZWF0dXJlcyBpbiBpdC4KLSAqIFRoaXMgbW9kdWxlIGlkIHdpbGwgc3VwcG9ydCBmb2xsb3dpbmcgcGFyYW0gaWRzLgotICogLSBBRkVfUEFSQU1fSURfRkJTUF9NT0RFX1JYX0NGRwotICovCi0KLSNkZWZpbmUgQUZFX01PRFVMRV9GQl9TUEtSX1BST1RfUlggMHgwMDAxMDIxQwotI2RlZmluZSBBRkVfTU9EVUxFX0ZCX1NQS1JfUFJPVF9WMl9SWCAweDAwMDEwMjVGCi0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0ZCU1BfTU9ERV9SWF9DRkcgMHgwMDAxMDIxRAotI2RlZmluZSBBRkVfUEFSQU1fSURfRkJTUF9QVE9ORV9SQU1QX0NGRyAweDAwMDEwMjYwCi0KLXN0cnVjdCBhc21fZmJzcF9tb2RlX3J4X2NmZyB7Ci0JdWludDMyX3QgbWlub3JfdmVyc2lvbjsKLQl1aW50MzJfdCBtb2RlOwotfSBfX3BhY2tlZDsKLQotLyogVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgVkkgcHJvY2Vzc2luZyBvZiBmZWVkYmFjayBzcGVha2VyIHByb3RlY3Rpb24uCi0gKiBJdCB3aWxsIHJlY2VpdmUgVnNlbnMgYW5kIElzZW5zIGZyb20gY29kZWMgYW5kIGdlbmVyYXRlcyBuZWNlc3NhcnkKLSAqIHBhcmFtZXRlcnMgbmVlZGVkIGJ5IFJ4IHByb2Nlc3NpbmcuCi0gKiBUaGlzIG1vZHVsZSBpZCB3aWxsIHN1cHBvcnQgZm9sbG93aW5nIHBhcmFtIGlkcy4KLSAqIC0gQUZFX1BBUkFNX0lEX1NQS1JfQ0FMSUJfVklfUFJPQ19DRkcKLSAqIC0gQUZFX1BBUkFNX0lEX0NBTElCX1JFU19DRkcKLSAqIC0gQUZFX1BBUkFNX0lEX0ZFRURCQUNLX1BBVEhfQ0ZHCi0gKi8KLQotI2RlZmluZSBBRkVfTU9EVUxFX0ZCX1NQS1JfUFJPVF9WSV9QUk9DIDB4MDAwMTAyMjYKLSNkZWZpbmUgQUZFX01PRFVMRV9GQl9TUEtSX1BST1RfVklfUFJPQ19WMiAweDAwMDEwMjZBCi0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQS1JfQ0FMSUJfVklfUFJPQ19DRkcgMHgwMDAxMDIyQQotI2RlZmluZSBBRkVfUEFSQU1fSURfU1BLUl9DQUxJQl9WSV9QUk9DX0NGR19WMiAgMHgwMDAxMDI2QgotCi1zdHJ1Y3QgYXNtX3Nwa3JfY2FsaWJfdmlfcHJvY19jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7Ci0JdWludDMyX3QgcjBfdDBfc2VsZWN0aW9uX2ZsYWdbU1BfVjJfTlVNX01BWF9TUEtSXTsKLQlpbnQzMl90IHIwX2NhbGlfcTI0W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JaW50MTZfdAl0MF9jYWxpX3E2W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JdWludDMyX3QgcXVpY2tfY2FsaWJfZmxhZzsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0NBTElCX1JFU19DRkcgMHgwMDAxMDIyQgotI2RlZmluZSBBRkVfUEFSQU1fSURfQ0FMSUJfUkVTX0NGR19WMiAweDAwMDEwMjZFCi0KLXN0cnVjdCBhc21fY2FsaWJfcmVzX2NmZyB7Ci0JdWludDMyX3QgbWlub3JfdmVyc2lvbjsKLQlpbnQzMl90CXIwX2NhbGlfcTI0W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JdWludDMyX3QgdGhfdmlfY2Ffc3RhdGU7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9GRUVEQkFDS19QQVRIX0NGRyAweDAwMDEwMjJDCi0jZGVmaW5lIEFGRV9NT0RVTEVfRkVFREJBQ0sgMHgwMDAxMDI1NwotCi1zdHJ1Y3QgYXNtX2ZlZWRiYWNrX3BhdGhfY2ZnIHsKLQl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOwotCWludDMyX3QJZHN0X3BvcnRpZDsKLQlpbnQzMl90CW51bV9jaGFubmVsczsKLQlpbnQzMl90CWNoYW5faW5mb1s0XTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX01PREVfVklfUFJPQ19DRkcgMHgwMDAxMDIyNwotCi1zdHJ1Y3QgYXNtX21vZGVfdmlfcHJvY19jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3QgY2FsX21vZGU7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX1RIX1ZJCTB4MDAwMTAyNkEKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX01PREVfQ0ZHCTB4MDAwMTAyNkIKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX0ZUTV9DRkcJMHgwMDAxMDI5RgotI2RlZmluZSBBRkVfUEFSQU1fSURfU1BfVjJfVEhfVklfRlRNX1BBUkFNUwkweDAwMDEwMkEwCi0KLXN0cnVjdCBhZmVfc3BfdGhfdmlfbW9kZV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7Ci0JLyoKLQkgKiBPcGVyYXRpb24gbW9kZSBvZiB0aGVybWFsIFZJIG1vZHVsZS4KLQkgKiAgIDAgLS0gTm9ybWFsIFJ1bm5pbmcgbW9kZQotCSAqICAgMSAtLSBDYWxpYnJhdGlvbiBtb2RlCi0JICogICAyIC0tIEZUTSBtb2RlCi0JICovCi0JdWludDMyX3QgcjB0MF9zZWxlY3Rpb25fZmxhZ1tTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogU3BlY2lmaWVzIHdoaWNoIHNldCBvZiBSMCwgVDAgdmFsdWVzIHRoZSBhbGdvcml0aG0gd2lsbCB1c2UuCi0JICogVGhpcyBmaWVsZCBpcyB2YWxpZCBvbmx5IGluIE5vcm1hbCBtb2RlIChvcGVyYXRpb25fbW9kZSA9IDApLgotCSAqIDAgLS0gVXNlIGNhbGlicmF0ZWQgUjAsIFQwIHZhbHVlCi0JICogMSAtLSBVc2Ugc2FmZSBSMCwgVDAgdmFsdWUKLQkgKi8KLQlpbnQzMl90IHIwX2NhbGlfcTI0W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBDYWxpYnJhdGlvbiBwb2ludCByZXNpc3RhbmNlIHBlciBkZXZpY2UuIFRoaXMgZmllbGQgaXMgdmFsaWQKLQkgKiBvbmx5IGluIE5vcm1hbCBtb2RlIChvcGVyYXRpb25fbW9kZSA9IDApLgotCSAqIHZhbHVlcyAzMzU1NDQzMiB0byAxMDczNzQxODI0IE9obXMgKGluIFEyNCBmb3JtYXQpCi0JICovCi0JaW50MTZfdCB0MF9jYWxpX3E2W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBDYWxpYnJhdGlvbiBwb2ludCB0ZW1wZXJhdHVyZSBwZXIgZGV2aWNlLiBUaGlzIGZpZWxkIGlzIHZhbGlkCi0JICogaW4gYm90aCBOb3JtYWwgbW9kZSBhbmQgQ2FsaWJyYXRpb24gbW9kZS4KLQkgKiB2YWx1ZXMgLTE5MjAgdG8gNTEyMCBkZWdyZWVzIEMgKGluIFE2IGZvcm1hdCkKLQkgKi8KLQl1aW50MzJfdCBxdWlja19jYWxpYl9mbGFnOwotCS8qCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgY2FsaWJyYXRpb24gaXMgdG8gYmUgZG9uZSBpbiBxdWljayBtb2RlIG9yIG5vdC4KLQkgKiBUaGlzIGZpZWxkIGlzIHZhbGlkIG9ubHkgaW4gQ2FsaWJyYXRpb24gbW9kZSAob3BlcmF0aW9uX21vZGUgPSAxKS4KLQkgKiAwIC0tIERpc2FibGVkCi0JICogMSAtLSBFbmFibGVkCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX3RoX3ZpX2Z0bV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3Qgd2FpdF90aW1lX21zW1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBXYWl0IHRpbWUgdG8gaGVhdCB1cCBzcGVha2VyIGJlZm9yZSBjb2xsZWN0aW5nIHN0YXRpc3RpY3MKLQkgKiBmb3IgZnRtIG1vZGUgaW4gbXMuCi0JICogdmFsdWVzIDAgdG8gNDI5NDk2NzI5NSBtcwotCSAqLwotCXVpbnQzMl90IGZ0bV90aW1lX21zW1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBkdXJhdGlvbiBmb3Igd2hpY2ggRlRNIHN0YXRpc3RpY3MgYXJlIGNvbGxlY3RlZCBpbiBtcy4KLQkgKiB2YWx1ZXMgMCB0byAyMDAwIG1zCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX3RoX3ZpX2Z0bV9wYXJhbXMgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JaW50MzJfdCBkY19yZXNfcTI0W1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBEQyByZXNpc3RhbmNlIHZhbHVlIGluIHEyNCBmb3JtYXQKLQkgKiB2YWx1ZXMgMCB0byAyMTQ3NDgzNjQ3IE9obXMgKGluIFEyNCBmb3JtYXQpCi0JICovCi0JaW50MzJfdCB0ZW1wX3EyMltTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogdGVtcGVyYXR1cmUgdmFsdWUgaW4gcTIyIGZvcm1hdAotCSAqIHZhbHVlcyAtMTI1ODI5MTIwIHRvIDIxNDc0ODM2NDcgZGVnQyAoaW4gUTIyIGZvcm1hdCkKLQkgKi8KLQl1aW50MzJfdCBzdGF0dXNbU1BfVjJfTlVNX01BWF9TUEtSXTsKLQkvKgotCSAqIEZUTSBwYWNrZXQgc3RhdHVzCi0JICogMCAtIEluY29ycmVjdCBvcGVyYXRpb24gbW9kZS5UaGlzIHN0YXR1cyBpcyByZXR1cm5lZAotCSAqICAgICB3aGVuIEdFVF9QQVJBTSBpcyBjYWxsZWQgaW4gbm9uIEZUTSBNb2RlCi0JICogMSAtIEluYWN0aXZlIG1vZGUgLS0gUG9ydCBpcyBub3QgeWV0IHN0YXJ0ZWQuCi0JICogMiAtIFdhaXQgc3RhdGUuIHdhaXRfdGltZV9tcyBoYXMgbm90IHlldCBlbGFwc2VkCi0JICogMyAtIEluIHByb2dyZXNzIHN0YXRlLiBmdG1fdGltZV9tcyBoYXMgbm90IHlldCBlbGFwc2VkLgotCSAqIDQgLSBTdWNjZXNzLgotCSAqIDUgLSBGYWlsZWQuCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX3RoX3ZpX2dldF9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyIGdldF9wYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKLQlzdHJ1Y3QgYWZlX3NwX3RoX3ZpX2Z0bV9wYXJhbXMgcGFyYW07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX3RoX3ZpX2dldF9wYXJhbV9yZXNwIHsKLQl1aW50MzJfdCBzdGF0dXM7Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7Ci0Jc3RydWN0IGFmZV9zcF90aF92aV9mdG1fcGFyYW1zIHBhcmFtOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX0VYX1ZJCTB4MDAwMTAyNkYKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX01PREVfQ0ZHCTB4MDAwMTAyQTEKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX0ZUTV9DRkcJMHgwMDAxMDJBMgotI2RlZmluZSBBRkVfUEFSQU1fSURfU1BfVjJfRVhfVklfRlRNX1BBUkFNUwkweDAwMDEwMkEzCi0KLXN0cnVjdCBhZmVfc3BfZXhfdmlfbW9kZV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3Qgb3BlcmF0aW9uX21vZGU7Ci0JLyoKLQkgKiBPcGVyYXRpb24gbW9kZSBvZiBFeGN1cnNpb24gVkkgbW9kdWxlLgotCSAqIDAgLSBOb3JtYWwgUnVubmluZyBtb2RlCi0JICogMiAtIEZUTSBtb2RlCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX2V4X3ZpX2Z0bV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3Qgd2FpdF90aW1lX21zW1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBXYWl0IHRpbWUgdG8gaGVhdCB1cCBzcGVha2VyIGJlZm9yZSBjb2xsZWN0aW5nIHN0YXRpc3RpY3MKLQkgKiBmb3IgZnRtIG1vZGUgaW4gbXMuCi0JICogdmFsdWVzIDAgdG8gNDI5NDk2NzI5NSBtcwotCSAqLwotCXVpbnQzMl90IGZ0bV90aW1lX21zW1NQX1YyX05VTV9NQVhfU1BLUl07Ci0JLyoKLQkgKiBkdXJhdGlvbiBmb3Igd2hpY2ggRlRNIHN0YXRpc3RpY3MgYXJlIGNvbGxlY3RlZCBpbiBtcy4KLQkgKiB2YWx1ZXMgMCB0byAyMDAwIG1zCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3NwX2V4X3ZpX2Z0bV9wYXJhbXMgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JaW50MzJfdCBmcmVxX3EyMFtTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogUmVzb25hbmNlIGZyZXF1ZW5jeSBpbiBxMjAgZm9ybWF0Ci0JICogdmFsdWVzIDAgdG8gMjE0NzQ4MzY0NyBIeiAoaW4gUTIwIGZvcm1hdCkKLQkgKi8KLQlpbnQzMl90IHJlc2lzX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogTWVjaGFuaWNhbCByZXNpc3RhbmNlIGluIHEyNCBmb3JtYXQKLQkgKiB2YWx1ZXMgMCB0byAyMTQ3NDgzNjQ3IE9obXMgKGluIFEyNCBmb3JtYXQpCi0JICovCi0JaW50MzJfdCBxbWN0X3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogTWVjaGFuaWNhbCBRZmFjdG9yIGluIHEyNCBmb3JtYXQKLQkgKiB2YWx1ZXMgMCB0byAyMTQ3NDgzNjQ3IChpbiBRMjQgZm9ybWF0KQotCSAqLwotCXVpbnQzMl90IHN0YXR1c1tTUF9WMl9OVU1fTUFYX1NQS1JdOwotCS8qCi0JICogRlRNIHBhY2tldCBzdGF0dXMKLQkgKiAwIC0gSW5jb3JyZWN0IG9wZXJhdGlvbiBtb2RlLlRoaXMgc3RhdHVzIGlzIHJldHVybmVkCi0JICogICAgICB3aGVuIEdFVF9QQVJBTSBpcyBjYWxsZWQgaW4gbm9uIEZUTSBNb2RlLgotCSAqIDEgLSBJbmFjdGl2ZSBtb2RlIC0tIFBvcnQgaXMgbm90IHlldCBzdGFydGVkLgotCSAqIDIgLSBXYWl0IHN0YXRlLiB3YWl0X3RpbWVfbXMgaGFzIG5vdCB5ZXQgZWxhcHNlZAotCSAqIDMgLSBJbiBwcm9ncmVzcyBzdGF0ZS4gZnRtX3RpbWVfbXMgaGFzIG5vdCB5ZXQgZWxhcHNlZC4KLQkgKiA0IC0gU3VjY2Vzcy4KLQkgKiA1IC0gRmFpbGVkLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zcF9leF92aV9nZXRfcGFyYW0gewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX2dldF9wYXJhbV92MiBnZXRfcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7Ci0Jc3RydWN0IGFmZV9zcF9leF92aV9mdG1fcGFyYW1zIHBhcmFtOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zcF9leF92aV9nZXRfcGFyYW1fcmVzcCB7Ci0JdWludDMyX3Qgc3RhdHVzOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXN0cnVjdCBhZmVfc3BfZXhfdmlfZnRtX3BhcmFtcyBwYXJhbTsKLX0gX19wYWNrZWQ7Ci0KLXVuaW9uIGFmZV9zcGtyX3Byb3RfY29uZmlnIHsKLQlzdHJ1Y3QgYXNtX2Zic3BfbW9kZV9yeF9jZmcgbW9kZV9yeF9jZmc7Ci0Jc3RydWN0IGFzbV9zcGtyX2NhbGliX3ZpX3Byb2NfY2ZnIHZpX3Byb2NfY2ZnOwotCXN0cnVjdCBhc21fZmVlZGJhY2tfcGF0aF9jZmcgZmVlZGJhY2tfcGF0aF9jZmc7Ci0Jc3RydWN0IGFzbV9tb2RlX3ZpX3Byb2NfY2ZnIG1vZGVfdmlfcHJvY19jZmc7Ci0Jc3RydWN0IGFmZV9zcF90aF92aV9tb2RlX2NmZyB0aF92aV9tb2RlX2NmZzsKLQlzdHJ1Y3QgYWZlX3NwX3RoX3ZpX2Z0bV9jZmcgdGhfdmlfZnRtX2NmZzsKLQlzdHJ1Y3QgYWZlX3NwX2V4X3ZpX21vZGVfY2ZnIGV4X3ZpX21vZGVfY2ZnOwotCXN0cnVjdCBhZmVfc3BfZXhfdmlfZnRtX2NmZyBleF92aV9mdG1fY2ZnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zcGtyX3Byb3RfY29uZmlnX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKLQl1bmlvbiBhZmVfc3Brcl9wcm90X2NvbmZpZyBwcm90X2NvbmZpZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfc3Brcl9wcm90X2dldF92aV9jYWxpYiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyIGdldF9wYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKLQlzdHJ1Y3QgYXNtX2NhbGliX3Jlc19jZmcgcmVzX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfc3Brcl9wcm90X2NhbGliX2dldF9yZXNwIHsKLQl1aW50MzJfdCBzdGF0dXM7Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7Ci0Jc3RydWN0IGFzbV9jYWxpYl9yZXNfY2ZnIHJlc19jZmc7Ci19IF9fcGFja2VkOwotCi0KLS8qIFNSUyBUUlVNRURJQSBzdGFydCAqLwotLyogdG9wb2xvZ3kgKi8KLSNkZWZpbmUgU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lECQkJMHgwMDAxMEQ5MAotLyogbW9kdWxlICovCi0jZGVmaW5lIFNSU19UUlVNRURJQV9NT0RVTEVfSUQJCQkJMHgxMDAwNTAxMAotLyogcGFyYW1ldGVycyAqLwotI2RlZmluZSBTUlNfVFJVTUVESUFfUEFSQU1TCQkJCTB4MTAwMDUwMTEKLSNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19XT1dIRAkJCTB4MTAwMDUwMTIKLSNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19DU0hQCQkJMHgxMDAwNTAxMwotI2RlZmluZSBTUlNfVFJVTUVESUFfUEFSQU1TX0hQRgkJCQkweDEwMDA1MDE0Ci0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfQUVRCQkJCTB4MTAwMDUwMTUKLSNkZWZpbmUgU1JTX1RSVU1FRElBX1BBUkFNU19ITAkJCQkweDEwMDA1MDE2Ci0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfR0VRCQkJCTB4MTAwMDUwMTcKLQotI2RlZmluZSBTUlNfSURfR0xPQkFMCTB4MDAwMDAwMDEKLSNkZWZpbmUgU1JTX0lEX1dPV0hECTB4MDAwMDAwMDIKLSNkZWZpbmUgU1JTX0lEX0NTSFAJMHgwMDAwMDAwMwotI2RlZmluZSBTUlNfSURfSFBGCTB4MDAwMDAwMDQKLSNkZWZpbmUgU1JTX0lEX0FFUQkweDAwMDAwMDA1Ci0jZGVmaW5lIFNSU19JRF9ITAkJMHgwMDAwMDAwNgotI2RlZmluZSBTUlNfSURfR0VRCTB4MDAwMDAwMDcKLQotI2RlZmluZSBTUlNfQ01EX1VQTE9BRAkJMHg3RkZGMDAwMAotI2RlZmluZSBTUlNfUEFSQU1fT0ZGU0VUX01BU0sJMHgzRkZGMDAwMAotI2RlZmluZSBTUlNfUEFSQU1fVkFMVUVfTUFTSwkweDAwMDBGRkZGCi0KLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCB7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHYxOwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MjsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjM7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHY0OwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NTsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjY7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHY3OwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2ODsKLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgdjk7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCB7Ci0JdWludDMyX3QJCQkJdjE7Ci0JdWludDE2X3QJCQkJdjI7Ci0JdWludDE2X3QJCQkJdjM7Ci0JdWludDE2X3QJCQkJdjQ7Ci0JdWludDE2X3QJCQkJdjU7Ci0JdWludDE2X3QJCQkJdjY7Ci0JdWludDE2X3QJCQkJdjc7Ci0JdWludDE2X3QJCQkJdjg7Ci0JdWludDE2X3QJCQkJdl9fX19BMTsKLQl1aW50MzJfdAkJCQl2OTsKLQl1aW50MTZfdAkJCQl2MTA7Ci0JdWludDE2X3QJCQkJdjExOwotCXVpbnQzMl90CQkJCXYxMlsxNl07Ci0JdWludDMyX3QJdjEzWzE2XTsKLQl1aW50MzJfdAl2MTRbMTZdOwotCXVpbnQzMl90CXYxNVsxNl07Ci0JdWludDMyX3QJdjE2OwotCXVpbnQxNl90CXYxNzsKLQl1aW50MTZfdAl2MTg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQIHsKLQl1aW50MzJfdAkJdjE7Ci0JdWludDE2X3QJCXYyOwotCXVpbnQxNl90CQl2MzsKLQl1aW50MTZfdAkJdjQ7Ci0JdWludDE2X3QJCXY1OwotCXVpbnQxNl90CQl2NjsKLQl1aW50MTZfdAkJdl9fX19BMTsKLQl1aW50MzJfdAkJdjc7Ci0JdWludDE2X3QJCXY4OwotCXVpbnQxNl90CQl2OTsKLQl1aW50MzJfdAkJdjEwWzE2XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRiB7Ci0JdWludDMyX3QJCXYxOwotCXVpbnQzMl90CQl2MlsyNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19BRVEgewotCXVpbnQzMl90CQl2MTsKLQl1aW50MTZfdAkJdjI7Ci0JdWludDE2X3QJCXYzOwotCXVpbnQxNl90CQl2NDsKLQl1aW50MTZfdAkJdl9fX19BMTsKLQl1aW50MzJfdAl2NVs3NF07Ci0JdWludDMyX3QJdjZbNzRdOwotCXVpbnQxNl90CXY3WzIwNDhdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwgewotCXVpbnQxNl90CQl2MTsKLQl1aW50MTZfdAkJdjI7Ci0JdWludDE2X3QJCXYzOwotCXVpbnQxNl90CQl2X19fX0ExOwotCWludDMyX3QJCQl2NDsKLQl1aW50MzJfdAkJdjU7Ci0JdWludDE2X3QJCXY2OwotCXVpbnQxNl90CQl2X19fX0EyOwotCXVpbnQzMl90CQl2NzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUSB7Ci0JaW50MTZfdAkJdjFbMTBdOwotfSBfX3BhY2tlZDsKLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zIHsKLQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwJZ2xvYmFsOwotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1dPV0hECXdvd2hkOwotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFAJCWNzaHA7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGCQlocGY7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQUVRCQlhZXE7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwJCWhsOwotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUQkJZ2VxOwotfSBfX3BhY2tlZDsKLS8qIFNSUyBUcnVNZWRpYSBlbmQgKi8KLQotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0VOQUJMRQkJMHgwMDAxMDkwNAotI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfU0FfUExVUyAweDEwMDBGRkZGCi0vKiBEVFMgRWFnbGUgKi8KLSNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfRFRTX0hQWF9QUkVNSVggMHgwMDAxMDc3QwotI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9EVFNfSFBYX1BPU1RNSVggMHgwMDAxMDc3QgotI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfRFRTX0hQWCAweDAwMDEwREVECi0jZGVmaW5lIEFTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9IUFhfUExVUyAgMHgxMDAxNTAwMAotI2RlZmluZSBBU01fU1RSRUFNX1BPU1RQUk9DX1RPUE9fSURfSFBYX01BU1RFUiAgMHgxMDAxNTAwMQotc3RydWN0IGFzbV9kdHNfZWFnbGVfcGFyYW0gewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXJhbTsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIGRhdGE7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX2R0c19lYWdsZV9wYXJhbV9nZXQgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZ2V0X3BwX3BhcmFtc192MiBwYXJhbTsKLX0gX19wYWNrZWQ7Ci0KLS8qIE9wY29kZSB0byBzZXQgQlQgYWRkcmVzcyBhbmQgbGljZW5zZSBmb3IgYXB0eCBkZWNvZGVyICovCi0jZGVmaW5lIEFQVFhfREVDT0RFUl9CVF9BRERSRVNTIDB4MDAwMTMyMDEKLSNkZWZpbmUgQVBUWF9DTEFTU0lDX0RFQ19MSUNFTlNFX0lEIDB4MDAwMTMyMDIKLQotc3RydWN0IGFwdHhfZGVjX2J0X2FkZHJfY2ZnIHsKLQl1aW50MzJfdCBsYXA7Ci0JdWludDMyX3QgdWFwOwotCXVpbnQzMl90IG5hcDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhcHR4X2RlY19idF9kZXZfYWRkciB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtIGVuY2RlYzsKLQlzdHJ1Y3QgYXB0eF9kZWNfYnRfYWRkcl9jZmcgYnRfYWRkcl9jZmc7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX2FwdHhfZGVjX2ZtdF9ibGtfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX21lZGlhX2ZtdF91cGRhdGVfdjIgZm10YmxrOwotCXUzMiAgICAgc2FtcGxlX3JhdGU7Ci0vKiBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgc2Vjb25kLgotICogU3VwcG9ydGVkIHZhbHVlczogNDQxMDAgYW5kIDQ4MDAwIEh6Ci0gKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFE2Q29yZSBTcGVjaWZpYyAqLwotI2RlZmluZSBBVkNTX0NNRF9HRVRfRldLX1ZFUlNJT04gKDB4MDAwMTI5MkMpCi0jZGVmaW5lIEFWQ1NfQ01EUlNQX0dFVF9GV0tfVkVSU0lPTiAoMHgwMDAxMjkyRCkKLQotI2RlZmluZSBBVkNTX1NFUlZJQ0VfSURfQUxMICgweEZGRkZGRkZGKQotI2RlZmluZSBBUFJWMl9JRFNfU0VSVklDRV9JRF9BRFNQX0NWUF9WCSgweEIpCi0KLXN0cnVjdCBhdmNzX2dldF9md2tfdmVyc2lvbiB7Ci0JLyoKLQkgKiBJbmRpY2F0ZXMgdGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIEFWUyBidWlsZC4KLQkgKiBUaGlzIHZhbHVlIGlzIGluY3JlbWVudGVkIG9uIGNoaXBzZXQgZmFtaWx5IGJvdW5kYXJpZXMuCi0JICovCi0JdWludDMyX3QgYnVpbGRfbWFqb3JfdmVyc2lvbjsKLQotCS8qCi0JICogTWlub3IgdmVyc2lvbiBvZiB0aGUgQVZTIGJ1aWxkLgotCSAqIFRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWFpbmxpbmUgdG8gd2hpY2ggdGhlIEFWUyBidWlsZCBiZWxvbmdzLgotCSAqLwotCXVpbnQzMl90IGJ1aWxkX21pbm9yX3ZlcnNpb247Ci0KLQkvKiBJbmRpY2F0ZXMgdGhlIEFWUyBicmFuY2ggdmVyc2lvbiB0byB3aGljaCB0aGUgaW1hZ2UgYmVsb25ncy4gKi8KLQl1aW50MzJfdCBidWlsZF9icmFuY2hfdmVyc2lvbjsKLQotCS8qIEluZGljYXRlcyB0aGUgQVZTIHN1Yi1icmFuY2ggb3IgY3VzdG9tZXIgcHJvZHVjdCBsaW5lIGluZm9ybWF0aW9uLiAqLwotCXVpbnQzMl90IGJ1aWxkX3N1YmJyYW5jaF92ZXJzaW9uOwotCi0JLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBBVlMgc2VydmljZXMgaW4gdGhlIGN1cnJlbnQgYnVpbGQuICovCi0JdWludDMyX3QgbnVtX3NlcnZpY2VzOwotfTsKLQotc3RydWN0IGF2c19zdmNfYXBpX2luZm8gewotCS8qCi0JICogQVBSVjIgc2VydmljZSBJRHMgZm9yIHRoZSBpbmRpdmlkdWFsIHN0YXRpYyBzZXJ2aWNlcy4KLQkgKgotCSAqCSBAdmFsdWVzCi0JICoJIC0gQVBSVjJfSURTX1NFUlZJQ0VfSURfQURTUF9DT1JFX1YKLQkgKgkgLSBBUFJWMl9JRFNfU0VSVklDRV9JRF9BRFNQX0FGRV9WCi0JICoJIC0gQVBSVjJfSURTX1NFUlZJQ0VfSURfQURTUF9BU01fVgotCSAqCSAtIEFQUlYyX0lEU19TRVJWSUNFX0lEX0FEU1BfQURNX1YKLQkgKgkgLSBBUFJWMl9JRFNfU0VSVklDRV9JRF9BRFNQX01WTV9WCi0JICoJIC0gQVBSVjJfSURTX1NFUlZJQ0VfSURfQURTUF9DVlNfVgotCSAqCSAtIEFQUlYyX0lEU19TRVJWSUNFX0lEX0FEU1BfQ1ZQX1YKLQkgKgkgLSBBUFJWMl9JRFNfU0VSVklDRV9JRF9BRFNQX0xTTV9WCi0JICovCi0JdWludDMyX3Qgc2VydmljZV9pZDsKLQotCS8qCi0JICogSW5kaWNhdGVzIHRoZSBBUEkgdmVyc2lvbiBvZiB0aGUgc2VydmljZS4KLQkgKgotCSAqIEVhY2ggbmV3IEFQSSB1cGRhdGUgdGhhdCB3YXJyYW50cyBhIGNoYW5nZSBvbiB0aGUgSExPUyBzaWRlIHRyaWdnZXJzCi0JICogYW4gaW5jcmVtZW50IGluIHRoZSB2ZXJzaW9uLgotCSAqLwotCXVpbnQzMl90IGFwaV92ZXJzaW9uOwotCi0JLyoKLQkgKiBJbmRpY2F0ZXMgdGhlIEFQSSBpbmNyZW1lbnRzIG9uIGEgc3ViLWJyYW5jaCAobm90IG9uIHRoZSBtYWlubGluZSkuCi0JICoKLQkgKiBBUEkgYnJhbmNoIHZlcnNpb24gbnVtYmVycyBjYW4gaW5jcmVtZW50IGluZGVwZW5kZW50bHkgb24gZGlmZmVyZW50Ci0JICogc3ViLWJyYW5jaGVzLgotCSAqLwotCXVpbnQzMl90IGFwaV9icmFuY2hfdmVyc2lvbjsKLX07Ci0KLXN0cnVjdCBhdmNzX2Z3a192ZXJfaW5mbyB7Ci0Jc3RydWN0IGF2Y3NfZ2V0X2Z3a192ZXJzaW9uIGF2Y3NfZndrX3ZlcnNpb247Ci0Jc3RydWN0IGF2c19zdmNfYXBpX2luZm8gKnNlcnZpY2VzOwotfSBfX3BhY2tlZDsKLQotLyogTFNNIFNwZWNpZmljICovCi0jZGVmaW5lIFZXX0ZFQVRfRElNCQkJCQkoMzkpCi0KLSNkZWZpbmUgQVBSVjJfSURTX1NFUlZJQ0VfSURfQURTUF9MU01fVgkJCSgweEQpCi0jZGVmaW5lIEFQUlYyX0lEU19ET01BSU5fSURfQURTUF9WCQkJKDB4NCkKLSNkZWZpbmUgQVBSVjJfSURTX0RPTUFJTl9JRF9BUFBTX1YJCQkoMHg1KQotCi0jZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TCQkoMHgwMDAxMkE3RikKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMJKDB4MDAwMTJBODApCi0jZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlMJKDB4MDAwMTJBODEpCi0jZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9PUEVOX1RYCQkJCSgweDAwMDEyQTgyKQotI2RlZmluZSBMU01fU0VTU0lPTl9DTURfQ0xPU0VfVFgJCQkoMHgwMDAxMkE4OCkKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMJCQkoMHgwMDAxMkE4MykKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIJCQkoMHgwMDAxMkE4RikKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX1NPVU5EX01PREVMCQkoMHgwMDAxMkE4NCkKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX0RFUkVHSVNURVJfU09VTkRfTU9ERUwJCSgweDAwMDEyQTg1KQotI2RlZmluZSBMU01fU0VTU0lPTl9DTURfU1RBUlQJCQkJKDB4MDAwMTJBODYpCi0jZGVmaW5lIExTTV9TRVNTSU9OX0NNRF9TVE9QCQkJCSgweDAwMDEyQTg3KQotI2RlZmluZSBMU01fU0VTU0lPTl9DTURfRU9CCQkJCSgweDAwMDEyQTg5KQotI2RlZmluZSBMU01fU0VTU0lPTl9DTURfUkVBRAkJCQkoMHgwMDAxMkE4QSkKLSNkZWZpbmUgTFNNX1NFU1NJT05fQ01EX09QRU5fVFhfVjIJCQkoMHgwMDAxMkE4QikKLSNkZWZpbmUgTFNNX0NNRF9BRERfVE9QT0xPR0lFUwkJCQkoMHgwMDAxMkE4QykKLQotI2RlZmluZSBMU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTCQkoMHgwMDAxMkIwMCkKLSNkZWZpbmUgTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMgkJKDB4MDAwMTJCMDEpCi0jZGVmaW5lIExTTV9EQVRBX0VWRU5UX1JFQURfRE9ORQkJCSgweDAwMDEyQjAyKQotI2RlZmluZSBMU01fREFUQV9FVkVOVF9TVEFUVVMJCQkJKDB4MDAwMTJCMDMpCi0jZGVmaW5lIExTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjMJCSgweDAwMDEyQjA0KQotCi0jZGVmaW5lIExTTV9NT0RVTEVfSURfVk9JQ0VfV0FLRVVQCQkJKDB4MDAwMTJDMDApCi0jZGVmaW5lIExTTV9QQVJBTV9JRF9FTkRQT0lOVF9ERVRFQ1RfVEhSRVNIT0xECQkoMHgwMDAxMkMwMSkKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX09QRVJBVElPTl9NT0RFCQkJKDB4MDAwMTJDMDIpCi0jZGVmaW5lIExTTV9QQVJBTV9JRF9HQUlOCQkJCSgweDAwMDEyQzAzKQotI2RlZmluZSBMU01fUEFSQU1fSURfQ09OTkVDVF9UT19QT1JUCQkJKDB4MDAwMTJDMDQpCi0jZGVmaW5lIExTTV9QQVJBTV9JRF9GRUFUVVJFX0NPTVBFTlNBVElPTl9EQVRBCQkoMHgwMDAxMkMwNykKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX01JTl9DT05GSURFTkNFX0xFVkVMUwkJKDB4MDAwMTJDMDcpCi0jZGVmaW5lIExTTV9NT0RVTEVfSURfTEFCCQkJCSgweDAwMDEyQzA4KQotI2RlZmluZSBMU01fUEFSQU1fSURfTEFCX0VOQUJMRQkJCQkoMHgwMDAxMkMwOSkKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX0xBQl9DT05GSUcJCQkJKDB4MDAwMTJDMEEpCi0jZGVmaW5lIExTTV9NT0RVTEVfSURfRlJBTUVXT1JLCQkJCSgweDAwMDEyQzBFKQotI2RlZmluZSBMU01fUEFSQU1fSURfU1dNQURfQ0ZHCQkJCSgweDAwMDEyQzE4KQotI2RlZmluZSBMU01fUEFSQU1fSURfU1dNQURfTU9ERUwJCQkoMHgwMDAxMkMxOSkKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX1NXTUFEX0VOQUJMRQkJCSgweDAwMDEyQzFBKQotI2RlZmluZSBMU01fUEFSQU1fSURfUE9MTElOR19FTkFCTEUJCQkoMHgwMDAxMkMxQikKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX01FRElBX0ZNVAkJCQkoMHgwMDAxMkMxRSkKLSNkZWZpbmUgTFNNX1BBUkFNX0lEX0ZXS19NT0RFX0NPTkZJRwkJCSgweDAwMDEyQzI3KQotCi0vKiBIVyBNQUQgc3BlY2lmaWMgKi8KLSNkZWZpbmUgQUZFX01PRFVMRV9IV19NQUQJCQkJKDB4MDAwMTAyMzApCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9IV19NQURfQ0ZHCQkJCSgweDAwMDEwMjMxKQotI2RlZmluZSBBRkVfUEFSQU1fSURfSFdfTUFEX0NUUkwJCQkoMHgwMDAxMDIzMikKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NMSU1CVVNfU0xBVkVfUE9SVF9DRkcJCSgweDAwMDEwMjMzKQotCi0vKiBTVyBNQUQgc3BlY2lmaWMgKi8KLSNkZWZpbmUgQUZFX01PRFVMRV9TV19NQUQJCQkJKDB4MDAwMTAyMkQpCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9TV19NQURfQ0ZHCQkJCSgweDAwMDEwMjJFKQotI2RlZmluZSBBRkVfUEFSQU1fSURfU1ZNX01PREVMCQkJCSgweDAwMDEwMjJGKQotCi0vKiBDb21tYW5kcy9QYXJhbXMgdG8gcGFzcyB0aGUgY29kZWMvc2xpbWJ1cyBkYXRhIHRvIERTUCAqLwotI2RlZmluZSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU0JCQkJKDB4MDAwMTAwZjMpCi0jZGVmaW5lIEFGRV9NT0RVTEVfQ0RDX0RFVl9DRkcJCQkJKDB4MDAwMTAyMzQpCi0jZGVmaW5lIEFGRV9QQVJBTV9JRF9DRENfU0xJTUJVU19TTEFWRV9DRkcJCSgweDAwMDEwMjM1KQotI2RlZmluZSBBRkVfUEFSQU1fSURfQ0RDX1JFR19DRkcJCQkoMHgwMDAxMDIzNikKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHX0lOSVQJCQkoMHgwMDAxMDIzNykKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0NEQ19SRUdfUEFHRV9DRkcgICAgICAgICAgICAgICAgICAgKDB4MDAwMTAyOTYpCi0KLSNkZWZpbmUgQUZFX01BWF9DRENfUkVHSVNURVJTX1RPX0NPTkZJRwkJCSgyMCkKLQotLyogQUFOQyBQb3J0IENvbmZpZyBTcGVjaWZpYyAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfQUFOQ19QT1JUX0NPTkZJRwkJCSgweDAwMDEwMjE1KQotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fQUFOQ19QT1JUX0NPTkZJRwkJKDB4MSkKLSNkZWZpbmUgQUFOQ19UWF9NSUNfVU5VU0VECQkJCSgwKQotI2RlZmluZSBBQU5DX1RYX1ZPSUNFX01JQwkJCQkoMSkKLSNkZWZpbmUgQUFOQ19UWF9FUlJPUl9NSUMJCQkJKDIpCi0jZGVmaW5lIEFBTkNfVFhfTk9JU0VfTUlDCQkJCSgzKQotI2RlZmluZSBBRkVfUE9SVF9NQVhfQ0hBTk5FTF9DTlQJCQkoOCkKLSNkZWZpbmUgQUZFX01PRFVMRV9BQU5DCQkJCQkoMHgwMDAxMDIxNCkKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0NEQ19BQU5DX1ZFUlNJT04JCQkoMHgwMDAxMDIzQSkKLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0NEQ19BQU5DX1ZFUlNJT04JCSgweDEpCi0jZGVmaW5lIEFBTkNfSFdfQkxPQ0tfVkVSU0lPTl8xCQkJCSgxKQotI2RlZmluZSBBQU5DX0hXX0JMT0NLX1ZFUlNJT05fMgkJCQkoMikKLQotLypDbGlwIGJhbmsgc2VsZWN0aW9uKi8KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0NMSVBfQkFOS19TRUxfQ0ZHIDB4MQotI2RlZmluZSBBRkVfQ0xJUF9NQVhfQkFOS1MJCTQKLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0NMSVBfQkFOS19TRUxfQ0ZHIDB4MDAwMTAyNDIKLQotc3RydWN0IGFmZV9wYXJhbV9hYW5jX3BvcnRfY2ZnIHsKLQkvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUncwotCSAqIHNvdXJjZSBwb3J0IGNvbmZpZ3VyYXRpb24uCi0JICovCi0JdWludDMyX3QgYWFuY19wb3J0X2NmZ19taW5vcl92ZXJzaW9uOwotCi0JLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIFR4IHBvcnQuIDhrIC0gMTkyayovCi0JdWludDMyX3QgdHhfcG9ydF9zYW1wbGVfcmF0ZTsKLQotCS8qIENoYW5uZWwgbWFwcGluZyBmb3IgdGhlIFR4IHBvcnQgc2lnbmFsIGNhcnJ5aW5nIE5vaXNlIChYKSwKLQkgKiBFcnJvciAoRSksIGFuZCBWb2ljZSAoVikgc2lnbmFscy4KLQkgKi8KLQl1aW50OF90IHR4X3BvcnRfY2hhbm5lbF9tYXBbQUZFX1BPUlRfTUFYX0NIQU5ORUxfQ05UXTsKLQotCS8qIE51bWJlciBvZiBjaGFubmVscyBvbiB0aGUgc291cmNlIFR4IHBvcnQuICovCi0JdWludDE2X3QgdHhfcG9ydF9udW1fY2hhbm5lbHM7Ci0KLQkvKiBQb3J0IElEIG9mIHRoZSBSeCBwYXRoIHJlZmVyZW5jZSBzaWduYWwuICovCi0JdWludDE2X3QgcnhfcGF0aF9yZWZfcG9ydF9pZDsKLQotCS8qIFNhbXBsaW5nIHJhdGUgb2YgdGhlIHJlZmVyZW5jZSBwb3J0LiA4ayAtIDE5MmsqLwotCXVpbnQzMl90IHJlZl9wb3J0X3NhbXBsZV9yYXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9pZF9jZGNfYWFuY192ZXJzaW9uIHsKLQkvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUncwotCSAqIGh3IHZlcnNpb24KLQkgKi8KLQl1aW50MzJfdCBjZGNfYWFuY19taW5vcl92ZXJzaW9uOwotCi0JLyogSFcgdmVyc2lvbi4gKi8KLQl1aW50MzJfdCBhYW5jX2h3X3ZlcnNpb247Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2lkX2NsaXBfYmFua19zZWwgewotCS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIG1vZHVsZSdzCi0JICogaHcgdmVyc2lvbgotCSAqLwotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0KLQkvKiBOdW1iZXIgb2YgYmFua3MgdG8gYmUgcmVhZCAqLwotCXVpbnQzMl90IG51bV9iYW5rczsKLQotCXVpbnQzMl90IGJhbmtfbWFwW0FGRV9DTElQX01BWF9CQU5LU107Ci19IF9fcGFja2VkOwotCi0vKiBFUlJPUiBDT0RFUyAqLwotLyogU3VjY2Vzcy4gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBubyBlcnJvcnMuICovCi0jZGVmaW5lIEFEU1BfRU9LICAgICAgICAgIDB4MDAwMDAwMDAKLS8qIEdlbmVyYWwgZmFpbHVyZS4gKi8KLSNkZWZpbmUgQURTUF9FRkFJTEVEICAgICAgMHgwMDAwMDAwMQotLyogQmFkIG9wZXJhdGlvbiBwYXJhbWV0ZXIuICovCi0jZGVmaW5lIEFEU1BfRUJBRFBBUkFNICAgIDB4MDAwMDAwMDIKLS8qIFVuc3VwcG9ydGVkIHJvdXRpbmUgb3Igb3BlcmF0aW9uLiAqLwotI2RlZmluZSBBRFNQX0VVTlNVUFBPUlRFRCAweDAwMDAwMDAzCi0vKiBVbnN1cHBvcnRlZCB2ZXJzaW9uLiAqLwotI2RlZmluZSBBRFNQX0VWRVJTSU9OICAgICAweDAwMDAwMDA0Ci0vKiBVbmV4cGVjdGVkIHByb2JsZW0gZW5jb3VudGVyZWQuICovCi0jZGVmaW5lIEFEU1BfRVVORVhQRUNURUQgIDB4MDAwMDAwMDUKLS8qIFVuaGFuZGxlZCBwcm9ibGVtIG9jY3VycmVkLiAqLwotI2RlZmluZSBBRFNQX0VQQU5JQyAgICAgICAweDAwMDAwMDA2Ci0vKiBVbmFibGUgdG8gYWxsb2NhdGUgcmVzb3VyY2UuICovCi0jZGVmaW5lIEFEU1BfRU5PUkVTT1VSQ0UgIDB4MDAwMDAwMDcKLS8qIEludmFsaWQgaGFuZGxlLiAqLwotI2RlZmluZSBBRFNQX0VIQU5ETEUgICAgICAweDAwMDAwMDA4Ci0vKiBPcGVyYXRpb24gaXMgYWxyZWFkeSBwcm9jZXNzZWQuICovCi0jZGVmaW5lIEFEU1BfRUFMUkVBRFkgICAgIDB4MDAwMDAwMDkKLS8qIE9wZXJhdGlvbiBpcyBub3QgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBBRFNQX0VOT1RSRUFEWSAgICAweDAwMDAwMDBBCi0vKiBPcGVyYXRpb24gaXMgcGVuZGluZyBjb21wbGV0aW9uLiAqLwotI2RlZmluZSBBRFNQX0VQRU5ESU5HICAgICAweDAwMDAwMDBCCi0vKiBPcGVyYXRpb24gY291bGQgbm90IGJlIGFjY2VwdGVkIG9yIHByb2Nlc3NlZC4gKi8KLSNkZWZpbmUgQURTUF9FQlVTWSAgICAgICAgMHgwMDAwMDAwQwotLyogT3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLiAqLwotI2RlZmluZSBBRFNQX0VBQk9SVEVEICAgICAweDAwMDAwMDBECi0vKiBPcGVyYXRpb24gcHJlZW1wdGVkIGJ5IGEgaGlnaGVyIHByaW9yaXR5LiAqLwotI2RlZmluZSBBRFNQX0VQUkVFTVBURUQgICAweDAwMDAwMDBFCi0vKiBPcGVyYXRpb24gcmVxdWVzdHMgaW50ZXJ2ZW50aW9uIHRvIGNvbXBsZXRlLiAqLwotI2RlZmluZSBBRFNQX0VDT05USU5VRSAgICAweDAwMDAwMDBGCi0vKiBPcGVyYXRpb24gcmVxdWVzdHMgaW1tZWRpYXRlIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KLSNkZWZpbmUgQURTUF9FSU1NRURJQVRFICAgMHgwMDAwMDAxMAotLyogT3BlcmF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZC4gKi8KLSNkZWZpbmUgQURTUF9FTk9USU1QTCAgICAgMHgwMDAwMDAxMQotLyogT3BlcmF0aW9uIG5lZWRzIG1vcmUgZGF0YSBvciByZXNvdXJjZXMuICovCi0jZGVmaW5lIEFEU1BfRU5FRURNT1JFICAgIDB4MDAwMDAwMTIKLS8qIE9wZXJhdGlvbiBkb2VzIG5vdCBoYXZlIG1lbW9yeS4gKi8KLSNkZWZpbmUgQURTUF9FTk9NRU1PUlkgICAgMHgwMDAwMDAxNAotLyogSXRlbSBkb2VzIG5vdCBleGlzdC4gKi8KLSNkZWZpbmUgQURTUF9FTk9URVhJU1QgICAgMHgwMDAwMDAxNQotLyogTWF4IGNvdW50IGZvciBhZHNwIGVycm9yIGNvZGUgc2VudCB0byBITE9TKi8KLSNkZWZpbmUgQURTUF9FUlJfTUFYICAgICAgKEFEU1BfRU5PVEVYSVNUICsgMSkKLS8qIE9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gKi8KLSNkZWZpbmUgQURTUF9FVEVSTUlOQVRFRCAgICAweDAwMDExMTc0Ci0KLS8qYmhhcmF0aCwgYWRzcF9lcnJvcl9jb2Rlcy5oICovCi0KLS8qIExQQVNTIGNsb2NrIGZvciBJMlMgSW50ZXJmYWNlICovCi0KLS8qIFN1cHBvcnRlZCBPU1IgY2xvY2sgdmFsdWVzICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfMTJfUDI4OF9NSFoJCTB4QkI4MDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfMTFfUDI4OTZfTUhaCQkweEFDNDQwMAotI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzlfUDYwMF9NSFoJCTB4OTI3QzAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfOF9QMTkyX01IWgkJMHg3RDAwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS182X1AxNDRfTUhaCQkweDVEQzAwMAotI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzRfUDA5Nl9NSFoJCTB4M0U4MDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfM19QMDcyX01IWgkJMHgyRUUwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS18yX1AwNDhfTUhaCQkweDFGNDAwMAotI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzFfUDUzNl9NSFoJCTB4MTc3MDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfMV9QMDI0X01IWgkJIDB4RkEwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfT1NSX0NMS183Njhfa0haCQkgMHhCQjgwMAotI2RlZmluZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzUxMl9rSFoJCSAweDdEMDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX09TUl9DTEtfRElTQUJMRQkJICAgICAweDAKLQotLyogU3VwcG9ydGVkIEJpdCBjbG9jayB2YWx1ZXMgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMTJfUDI4OF9NSFoJMHhCQjgwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMTFfUDI4OTZfTUhaCTB4QUM0NDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzhfUDE5Ml9NSFoJCTB4N0QwMDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzZfUDE0NF9NSFoJCTB4NURDMDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzRfUDA5Nl9NSFoJCTB4M0U4MDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzNfUDA3Ml9NSFoJCTB4MkVFMDAwCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0lCSVRfQ0xLXzJfUDgyMjRfTUhaCQkweDJiMTEwMAotI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS18yX1AwNDhfTUhaCQkweDFGNDAwMAotI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaCQkweDE3NzAwMAotI2RlZmluZSBRNkFGRV9MUEFTU19JQklUX0NMS18xX1A0MTEyX01IWgkJMHgxNTg4ODAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QMDI0X01IWgkJIDB4RkEwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfNzY4X0tIWgkJIDB4QkI4MDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfNTEyX0tIWgkJIDB4N0QwMDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfMjU2X0tIWgkJIDB4M0U4MDAKLSNkZWZpbmUgUTZBRkVfTFBBU1NfSUJJVF9DTEtfRElTQUJMRQkJICAgICAweDAKLQotLyogU3VwcG9ydGVkIExQQVNTIENMSyBzb3VyY2VzICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19TUkNfRVhURVJOQUwgMAotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfU1JDX0lOVEVSTkFMIDEKLQotLyogU3VwcG9ydGVkIExQQVNTIENMSyByb290Ki8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCAwCi0KLWVudW0gYWZlX2xwYXNzX2Nsa19tb2RlIHsKLQlRNkFGRV9MUEFTU19NT0RFX0JPVEhfSU5WQUxJRCwKLQlRNkFGRV9MUEFTU19NT0RFX0NMSzFfVkFMSUQsCi0JUTZBRkVfTFBBU1NfTU9ERV9DTEsyX1ZBTElELAotCVE2QUZFX0xQQVNTX01PREVfQk9USF9WQUxJRCwKLX0gX19wYWNrZWQ7Ci0KLS8qIENsb2NrIElEIEVudW1lcmF0aW9uIERlZmluZS4gKi8KLS8qIENsb2NrIElEIGZvciBQcmltYXJ5IEkyUyBJQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMAotLyogQ2xvY2sgSUQgZm9yIFByaW1hcnkgSTJTIEVCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9NSTJTX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxCi0vKiBDbG9jayBJRCBmb3IgU2Vjb25kYXJ5IEkyUyBJQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRUNfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMgotLyogQ2xvY2sgSUQgZm9yIFNlY29uZGFyeSBJMlMgRUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX01JMlNfRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDMKLS8qIENsb2NrIElEIGZvciBUZXJ0aWFyeSBJMlMgSUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfVEVSX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDQKLS8qIENsb2NrIElEIGZvciBUZXJ0aWFyeSBJMlMgRUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfVEVSX01JMlNfRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDUKLS8qIENsb2NrIElEIGZvciBRdWFydG5lcnkgSTJTIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA2Ci0vKiBDbG9jayBJRCBmb3IgUXVhcnRuZXJ5IEkyUyBFQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNwotLyogQ2xvY2sgSUQgZm9yIFNwZWFrZXIgSTJTIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRUFLRVJfSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTA4Ci0vKiBDbG9jayBJRCBmb3IgU3BlYWtlciBJMlMgRUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU1BFQUtFUl9JMlNfRUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDkKLS8qIENsb2NrIElEIGZvciBTcGVha2VyIEkyUyBPU1IgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRUFLRVJfSTJTX09TUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBBCi0KLS8qIENsb2NrIElEIGZvciBRVUlOQVJZICBJMlMgSUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVJX01JMlNfSUJJVAkJCTB4MTBCCi0vKiBDbG9jayBJRCBmb3IgUVVJTkFSWSAgSTJTIEVCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1FVSV9NSTJTX0VCSVQJCQkweDEwQwotLyogQ2xvY2sgSUQgZm9yIFNFTkFSWSAgSTJTIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NFTl9NSTJTX0lCSVQJCQkweDEwRAotLyogQ2xvY2sgSUQgZm9yIFNFTkFSWSAgSTJTIEVCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NFTl9NSTJTX0VCSVQJCQkweDEwRQotLyogQ2xvY2sgSUQgZm9yIElOVDAgSTJTIElCSVQgICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlQwX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMEYKLS8qIENsb2NrIElEIGZvciBJTlQxIEkyUyBJQklUICAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UMV9NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwCi0vKiBDbG9jayBJRCBmb3IgSU5UMiBJMlMgSUJJVCAgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDJfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAweDExMQotLyogQ2xvY2sgSUQgZm9yIElOVDMgSTJTIElCSVQgICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlQzX01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMTIKLS8qIENsb2NrIElEIGZvciBJTlQ0IEkyUyBJQklUICAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5UNF9NSTJTX0lCSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTEzCi0vKiBDbG9jayBJRCBmb3IgSU5UNSBJMlMgSUJJVCAgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDVfTUkyU19JQklUICAgICAgICAgICAgICAgICAgICAgICAweDExNAotLyogQ2xvY2sgSUQgZm9yIElOVDYgSTJTIElCSVQgICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlQ2X01JMlNfSUJJVCAgICAgICAgICAgICAgICAgICAgICAgMHgxMTUKLQotLyogQ2xvY2sgSUQgZm9yIFByaW1hcnkgUENNIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9QQ01fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCi0vKiBDbG9jayBJRCBmb3IgUHJpbWFyeSBQQ00gRUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUFJJX1BDTV9FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDEKLS8qIENsb2NrIElEIGZvciBTZWNvbmRhcnkgUENNIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19QQ01fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAyCi0vKiBDbG9jayBJRCBmb3IgU2Vjb25kYXJ5IFBDTSBFQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRUNfUENNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMwotLyogQ2xvY2sgSUQgZm9yIFRlcnRpYXJ5IFBDTSBJQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9URVJfUENNX0lCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNAotLyogQ2xvY2sgSUQgZm9yIFRlcnRpYXJ5IFBDTSBFQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9URVJfUENNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNQotLyogQ2xvY2sgSUQgZm9yIFF1YXJ0ZXJ5IFBDTSBJQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1BDTV9JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNgotLyogQ2xvY2sgSUQgZm9yIFF1YXJ0ZXJ5IFBDTSBFQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1BDTV9FQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNwotCi0vKiogQ2xvY2sgSUQgZm9yIFByaW1hcnkgVERNIElCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9URE1fSUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCi0vKiogQ2xvY2sgSUQgZm9yIFByaW1hcnkgVERNIEVCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9URE1fRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAxCi0vKiogQ2xvY2sgSUQgZm9yIFNlY29uZGFyeSBURE0gSUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX1RETV9JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDIKLS8qKiBDbG9jayBJRCBmb3IgU2Vjb25kYXJ5IFRETSBFQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9TRUNfVERNX0VCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMwotLyoqIENsb2NrIElEIGZvciBUZXJ0aWFyeSBURE0gSUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfVEVSX1RETV9JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDQKLS8qKiBDbG9jayBJRCBmb3IgVGVydGlhcnkgVERNIEVCSVQgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9URE1fRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjA1Ci0vKiogQ2xvY2sgSUQgZm9yIFF1YXJ0ZXJ5IFRETSBJQklUICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1RETV9JQklUICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwNgotLyoqIENsb2NrIElEIGZvciBRdWFydGVyeSBURE0gRUJJVCAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9URE1fRUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDcKLQotLyogQ2xvY2sgSUQgZm9yIE1DTEsxICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMAotLyogQ2xvY2sgSUQgZm9yIE1DTEsyICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMQotLyogQ2xvY2sgSUQgZm9yIE1DTEszICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMgotLyogQ2xvY2sgSUQgZm9yIE1DTEs0ICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwNAotLyogQ2xvY2sgSUQgZm9yIEludGVybmFsIERpZ2l0YWwgQ29kZWMgQ29yZSAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfSU5URVJOQUxfRElHSVRBTF9DT0RFQ19DT1JFICAgICAgICAgICAgMHgzMDMKLS8qIENsb2NrIElEIGZvciBJTlQgTUNMSzAgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVF9NQ0xLXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzA1Ci0vKiBDbG9jayBJRCBmb3IgSU5UIE1DTEsxICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9JTlRfTUNMS18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwNgotLyoKLSAqIENsb2NrIElEIGZvciBzb3VuZHdpcmUgTlBMLgotICogVGhpcyBpcyB0aGUgY2xvY2sgdG8gYmUgdXNlZCB0byBlbmFibGUgTlBMIGNsb2NrIGZvciAgaW50ZXJuYWwgU291bmR3aXJlLgotICovCi0jZGVmaW5lIEFGRV9DTE9DS19TRVRfQ0xPQ0tfSURfU1dSX05QTF9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDcKLQotLyogQ2xvY2sgSUQgZm9yIEFIQiBIRE1JIGlucHV0ICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19JRF9BSEJfSERNSV9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAotCi0vKiBDbG9jayBJRCBmb3IgU1BESUYgY29yZSAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfSURfU1BESUZfQ09SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MDAKLQotCi0vKiBDbG9jayBhdHRyaWJ1dGUgZm9yIGludmFsaWQgdXNlIChyZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UpICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfSU5WQUxJRAkJMHgwCi0vKiBDbG9jayBhdHRyaWJ1dGUgZm9yIG5vIGNvdXBsZSBjYXNlICovCi0jZGVmaW5lIFE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PCQkweDEKLS8qIENsb2NrIGF0dHJpYnV0ZSBmb3IgZGl2aWRlbmQgY291cGxlIGNhc2UgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfRElWSURFTkQJMHgyCi0vKiBDbG9jayBhdHRyaWJ1dGUgZm9yIGRpdmlzb3IgY291cGxlIGNhc2UgKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfRElWSVNPUgkweDMKLS8qIENsb2NrIGF0dHJpYnV0ZSBmb3IgaW52ZXJ0IGFuZCBubyBjb3VwbGUgY2FzZSAqLwotI2RlZmluZSBRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0lOVkVSVF9DT1VQTEVfTk8JMHg0Ci0vKiBDbG9jayBzZXQgQVBJIHZlcnNpb24gKi8KLSNkZWZpbmUgUTZBRkVfTFBBU1NfQ0xLX0NPTkZJR19BUElfVkVSU0lPTgkJMHgxCi0KLXN0cnVjdCBhZmVfY2xrX3NldCB7Ci0JLyoKLQkgKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIGNsb2NrIHNldC4KLQkgKglAdmFsdWVzICNBRkVfQVBJX1ZFUlNJT05fQ0xPQ0tfU0VUCi0JICovCi0JdWludDMyX3QgY2xrX3NldF9taW5vcl92ZXJzaW9uOwotCi0JLyoKLQkgKiBDbG9jayBJRAotCSAqCUB2YWx1ZXMKLQkgKgktIDB4MTAwIHRvIDB4MTBBIC0gTVNNODk5NgotCSAqCS0gMHgyMDAgdG8gMHgyMDcgLSBNU004OTk2Ci0JICoJLSAweDMwMCB0byAweDMwMiAtIE1TTTg5OTYgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDMyX3QgY2xrX2lkOwotCi0JLyoKLQkgKiBDbG9jayBmcmVxdWVuY3kgIChpbiBIZXJ0eikgdG8gYmUgc2V0LgotCSAqCUB2YWx1ZXMKLQkgKgktID49IDAgZm9yIGNsb2NrIGZyZXF1ZW5jeSB0byBzZXQgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDMyX3QgY2xrX2ZyZXFfaW5faHo7Ci0KLQkvKiBVc2UgdG8gc3BlY2lmaWMgZGl2aWRlciBmb3IgdHdvIGNsb2NrcyBpZiBuZWVkZWQuCi0JICoJU2V0IHRvIFE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PIGZvciBubyBkaXZpZGVyCi0JICoJcmVsYXRpb24gY2xvY2tzCi0JICoJQHZhbHVlcwotCSAqCS0gI1E2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PCi0JICoJLSAjUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfRElWSURFTkQKLQkgKgktICNRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9ESVZJU09SIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCXVpbnQxNl90IGNsa19hdHRyaTsKLQotCS8qCi0JICogU3BlY2lmaWVzIHRoZSByb290IGNsb2NrIHNvdXJjZS4KLQkgKglDdXJyZW50bHksIG9ubHkgUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCBpcyB2YWxpZAotCSAqCUB2YWx1ZXMKLQkgKgktIDAgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0JdWludDE2X3QgY2xrX3Jvb3Q7Ci0KLQkvKgotCSAqIGZvciBlbmFibGUgYW5kIGRpc2FibGUgY2xvY2suCi0JICoJImNsa19mcmVxX2luX2h6IiwgImNsa19hdHRyaSIsIGFuZCAiY2xrX3Jvb3QiCi0JICoJYXJlIGlnbm9yZWQgaW4gZGlzYWJsZSBjbG9jayBjYXNlLgotCSAqCUB2YWx1ZXOgCi0JICoJLSAwIC0tIERpc2FibGVkCi0JICoJLSAxIC0tIEVuYWJsZWQgIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCXVpbnQzMl90IGVuYWJsZTsKLX07Ci0KLXN0cnVjdCBhZmVfY2xrX2NmZyB7Ci0vKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBJMlMKLSAqIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlLgotICogU3VwcG9ydGVkIHZhbHVlczogI0FGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHCi0gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBpMnNfY2ZnX21pbm9yX3ZlcnNpb247Ci0KLS8qIGNsayB2YWx1ZSAxIGluIE1Iei4gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBjbGtfdmFsMTsKLQotLyogY2xrIHZhbHVlIDIgaW4gTUh6LiAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGNsa192YWwyOwotCi0vKiBjbGtfc3JjCi0gKiAjUTZBRkVfTFBBU1NfQ0xLX1NSQ19FWFRFUk5BTAotICogI1E2QUZFX0xQQVNTX0NMS19TUkNfSU5URVJOQUwKLSAqLwotCi0JdTE2ICAgICAgICAgICAgICAgICAgY2xrX3NyYzsKLQotLyogY2xrX3Jvb3QgLTAgZm9yIGRlZmF1bHQgKi8KLQl1MTYgICAgICAgICAgICAgICAgICBjbGtfcm9vdDsKLQotLyogY2xrX3NldF9tb2RlCi0gKiAjUTZBRkVfTFBBU1NfTU9ERV9CT1RIX0lOVkFMSUQKLSAqICNRNkFGRV9MUEFTU19NT0RFX0NMSzFfVkFMSUQKLSAqICNRNkFGRV9MUEFTU19NT0RFX0NMSzJfVkFMSUQKLSAqICNRNkFGRV9MUEFTU19NT0RFX0JPVEhfVkFMSUQKLSAqLwotCXUxNiAgICAgICAgICAgICAgICAgIGNsa19zZXRfbW9kZTsKLQotLyogVGhpcyBwYXJhbSBpZCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBJMlMgY2xrICovCi0JdTE2ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIEkyUyBjbGsgKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0xQQUlGX0NMS19DT05GSUcJMHgwMDAxMDIzOAotI2RlZmluZSBBRkVfTU9EVUxFX0NMT0NLX1NFVAkJMHgwMDAxMDI4RgotI2RlZmluZSBBRkVfUEFSQU1fSURfQ0xPQ0tfU0VUCQkweDAwMDEwMjkwCi0KLXN0cnVjdCBhZmVfbHBhc3NfY2xrX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCSBoZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgcGRhdGE7Ci0Jc3RydWN0IGFmZV9jbGtfY2ZnIGNsa19jZmc7Ci19IF9fcGFja2VkOwotCi1lbnVtIGFmZV9scGFzc19kaWdpdGFsX2Nsa19zcmMgewotCVE2QUZFX0xQQVNTX0RJR0lUQUxfUk9PVF9JTlZBTElELAotCVE2QUZFX0xQQVNTX0RJR0lUQUxfUk9PVF9QUklfTUkyU19PU1IsCi0JUTZBRkVfTFBBU1NfRElHSVRBTF9ST09UX1NFQ19NSTJTX09TUiwKLQlRNkFGRV9MUEFTU19ESUdJVEFMX1JPT1RfVEVSX01JMlNfT1NSLAotCVE2QUZFX0xQQVNTX0RJR0lUQUxfUk9PVF9RVUFEX01JMlNfT1NSLAotCVE2QUZFX0xQQVNTX0RJR0lUQUxfUk9PVF9DRENfUk9PVF9DTEssCi19IF9fcGFja2VkOwotCi0vKiBUaGlzIHBhcmFtIGlkIGlzIHVzZWQgdG8gY29uZmlndXJlIGludGVybmFsIGNsayAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfSU5URVJOQUxfRElHSUFUTF9DRENfQ0xLX0NPTkZJRwkweDAwMDEwMjM5Ci0KLXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnIHsKLS8qIE1pbm9yIHZlcnNpb24gdXNlZCBmb3IgdHJhY2tpbmcgdGhlIHZlcnNpb24gb2YgdGhlIEkyUwotICogY29uZmlndXJhdGlvbiBpbnRlcmZhY2UuCi0gKiBTdXBwb3J0ZWQgdmFsdWVzOiAjQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcKLSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGkyc19jZmdfbWlub3JfdmVyc2lvbjsKLQotLyogY2xrIHZhbHVlIGluIE1Iei4gKi8KLQl1MzIgICAgICAgICAgICAgICAgICBjbGtfdmFsOwotCi0vKglJTlZBTElECi0gKglQUklfTUkyU19PU1IKLSAqCVNFQ19NSTJTX09TUgotICoJVEVSX01JMlNfT1NSCi0gKglRVUFEX01JMlNfT1NSCi0gKglESUdUX0NEQ19ST09UCi0gKi8KLQl1MTYgICAgICAgICAgICAgICAgICBjbGtfcm9vdDsKLQotLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLwotCXUxNiAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotCi1zdHJ1Y3QgYWZlX2xwYXNzX2RpZ2l0YWxfY2xrX2NvbmZpZ19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCSBoZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgcGRhdGE7Ci0Jc3RydWN0IGFmZV9kaWdpdGFsX2Nsa19jZmcgY2xrX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBPcGNvZGUgZm9yIEFGRSB0byBzdGFydCBEVE1GLgotICovCi0jZGVmaW5lIEFGRV9QT1JUU19DTURfRFRNRl9DVEwJMHgwMDAxMDEwMgotCi0vKiogRFRNRiBwYXlsb2FkLiovCi1zdHJ1Y3QgYWZlX2R0bWZfZ2VuZXJhdGlvbl9jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0KLQkvKgotCSAqIER1cmF0aW9uIG9mIHRoZSBEVE1GIHRvbmUgaW4gbXMuCi0JICogLTEgICAgICAtPiBjb250aW51b3VzLAotCSAqICAwICAgICAgLT4gZGlzYWJsZQotCSAqLwotCWludDY0X3QgICAgICAgICAgICAgICAgICAgZHVyYXRpb25faW5fbXM7Ci0KLQkvKgotCSAqIFRoZSBEVE1GIGhpZ2ggdG9uZSBmcmVxdWVuY3kuCi0JICovCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICBoaWdoX2ZyZXE7Ci0KLQkvKgotCSAqIFRoZSBEVE1GIGxvdyB0b25lIGZyZXF1ZW5jeS4KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGxvd19mcmVxOwotCi0JLyoKLQkgKiBUaGUgRFRNRiB2b2x1bWUgc2V0dGluZwotCSAqLwotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgZ2FpbjsKLQotCS8qCi0JICogVGhlIG51bWJlciBvZiBwb3J0cyB0byBlbmFibGUvZGlzYWJsZSBvbi4KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIG51bV9wb3J0czsKLQotCS8qCi0JICogVGhlIERlc3RpbmF0aW9uIHBvcnRzIC0gYXJyYXkgIC4KLQkgKiBGb3IgRFRNRiBvbiBtdWx0aXBsZSBwb3J0cywgcG9ydElkcyBuZWVkcyB0bwotCSAqIGJlIHBvcHVsYXRlZCBudW1Qb3J0cyB0aW1lcy4KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHBvcnRfaWRzOwotCi0JLyoKLQkgKiB2YXJpYWJsZSBmb3IgMzIgYml0IGFsaWdubWVudCBvZiBBUFIgcGFja2V0LgotCSAqLwotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1lbnVtIGFmZV9jb25maWdfdHlwZSB7Ci0JQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcsCi0JQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHLAotCUFGRV9DRENfUkVHSVNURVJTX0NPTkZJRywKLQlBRkVfQUFOQ19WRVJTSU9OLAotCUFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHLAotCUFGRV9DTElQX0JBTktfU0VMLAotCUFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUcsCi0JQUZFX01BWF9DT05GSUdfVFlQRVMsCi19OwotCi1zdHJ1Y3QgYWZlX3BhcmFtX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDE2X3Qgc2xpbWJ1c19kZXZfaWQ7Ci0JdWludDE2X3Qgc2xhdmVfZGV2X3BnZF9sYTsKLQl1aW50MTZfdCBzbGF2ZV9kZXZfaW50ZmRldl9sYTsKLQl1aW50MTZfdCBiaXRfd2lkdGg7Ci0JdWludDE2X3QgZGF0YV9mb3JtYXQ7Ci0JdWludDE2X3QgbnVtX2NoYW5uZWxzOwotCXVpbnQxNl90IHNsYXZlX3BvcnRfbWFwcGluZ1tBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlRdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3QgZGV2aWNlX2VudW1fYWRkcl9sc3c7Ci0JdWludDMyX3QgZGV2aWNlX2VudW1fYWRkcl9tc3c7Ci0JdWludDE2X3QgdHhfc2xhdmVfcG9ydF9vZmZzZXQ7Ci0JdWludDE2X3Qgcnhfc2xhdmVfcG9ydF9vZmZzZXQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnIHsKLQl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOwotCXVpbnQzMl90IHJlZ19sb2dpY2FsX2FkZHI7Ci0JdWludDMyX3QgcmVnX2ZpZWxkX3R5cGU7Ci0JdWludDMyX3QgcmVnX2ZpZWxkX2JpdF9tYXNrOwotCXVpbnQxNl90IHJlZ19iaXRfd2lkdGg7Ci0JdWludDE2X3QgcmVnX29mZnNldF9zY2FsZTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0NEQ19SRUdfUEFHRV9DRkcgICAxCi0KLWVudW0gewotCUFGRV9DRENfUkVHX1BBR0VfQVNTSUdOX1BST0NfSURfMCA9IDAsCi0JQUZFX0NEQ19SRUdfUEFHRV9BU1NJR05fUFJPQ19JRF8xLAotCUFGRV9DRENfUkVHX1BBR0VfQVNTSUdOX1BST0NfSURfMiwKLQlBRkVfQ0RDX1JFR19QQUdFX0FTU0lHTl9QUk9DX0lEXzMsCi19OwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgewotCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3QgZW5hYmxlOwotCXVpbnQzMl90IHByb2NfaWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX2RhdGEgewotCXVpbnQzMl90IG51bV9yZWdpc3RlcnM7Ci0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZyAqcmVnX2RhdGE7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHsKLQl1aW50MzJfdCBwYXlsb2FkX3NpemU7Ci0JdWludDMyX3QgcGF5bG9hZF9hZGRyZXNzX2xzdzsKLQl1aW50MzJfdCBwYXlsb2FkX2FkZHJlc3NfbXN3OwotCXVpbnQzMl90IG1lbV9tYXBfaGFuZGxlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zdmNfcGFyYW1fZGF0YSB7Ci0JdWludDMyX3QgbW9kdWxlX2lkOwotCXVpbnQzMl90IHBhcmFtX2lkOwotCXVpbnQxNl90IHBhcmFtX3NpemU7Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BhcmFtX2h3X21hZF9jdHJsIHsKLQl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOwotCXVpbnQxNl90IG1hZF90eXBlOwotCXVpbnQxNl90IG1hZF9lbmFibGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2NtZF9od19tYWRfY3RybCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXN0cnVjdCBhZmVfcGFyYW1faHdfbWFkX2N0cmwgcGF5bG9hZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfY21kX2h3X21hZF9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7Ci0Jc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnIHNiX3BvcnRfY2ZnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9jbWRfc3dfbWFkX2VuYWJsZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19wYXlsb2FkIHsKLQlzdHJ1Y3QgYWZlX3N2Y19wYXJhbV9kYXRhICAgICBjb21tb247Ci0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZyAgcmVnX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfbHBhc3NfY2xrX2NvbmZpZ19jb21tYW5kX3YyIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCWhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtCXBhcmFtOwotCXN0cnVjdCBhZmVfc3ZjX3BhcmFtX2RhdGEJcGRhdGE7Ci0Jc3RydWN0IGFmZV9jbGtfc2V0CQljbGtfY2ZnOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIHJlZ19kYXRhJ3Mgc2l6ZSBjYW4gYmUgdXAgdG8gQUZFX01BWF9DRENfUkVHSVNURVJTX1RPX0NPTkZJRwotICovCi1zdHJ1Y3QgYWZlX3N2Y19jbWRfY2RjX3JlZ19jZmcgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOwotCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmdfcGF5bG9hZCByZWdfZGF0YVswXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfc3ZjX2NtZF9pbml0X2NkY19yZWdfY2ZnIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IGFmZV9zdmNfY21kX3NldF9wYXJhbSBwYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBpbml0OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zdmNfY21kX3NiX3NsYXZlX2NmZyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfc3ZjX2NtZF9zZXRfcGFyYW0gcGFyYW07Ci0Jc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgcGRhdGE7Ci0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgc2Jfc2xhdmVfY2ZnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zdmNfY21kX2NkY19yZWdfcGFnZV9jZmcgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19wYWdlX2NmZyBjZGNfcmVnX3BhZ2VfY2ZnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9zdmNfY21kX2NkY19hYW5jX3ZlcnNpb24gewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbiB2ZXJzaW9uOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfYWFuY19wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXVuaW9uIHsKLQkJc3RydWN0IGFmZV9wYXJhbV9hYW5jX3BvcnRfY2ZnIGFhbmNfcG9ydF9jZmc7Ci0JCXN0cnVjdCBhZmVfbW9kX2VuYWJsZV9wYXJhbSAgICBtb2RfZW5hYmxlOwotCX0gX19wYWNrZWQgZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X2FhbmNfYWNkYl90YWJsZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyIHBhcmFtOwotfSBfX3BhY2tlZDsKLQotLyogRG9sYnkgREFQIHRvcG9sb2d5ICovCi0jZGVmaW5lIERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lECTB4MDAwMTAzM0IKLSNkZWZpbmUgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lECTB4MTMwMTAzM0IKLQotLyogUk1TIHZhbHVlIGZyb20gRFNQICovCi0jZGVmaW5lIFJNU19NT0RVTEVJRF9BUFBJX1BBU1NUSFJVICAweDEwMDA5MDExCi0jZGVmaW5lIFJNU19QQVJBTV9GSVJTVF9TQU1QTEUgMHgxMDAwOTAxMgotI2RlZmluZSBSTVNfUEFZTE9BRF9MRU4gNAotCi0vKiBDdXN0b21pemVkIG1peGluZyBpbiBtYXRpeCBtaXhlciAqLwotI2RlZmluZSBNVE1YX01PRFVMRV9JRF9ERUZBVUxUX0NITUlYRVIgIDB4MDAwMTAzNDEKLSNkZWZpbmUgREVGQVVMVF9DSE1JWEVSX1BBUkFNX0lEX0NPRUZGICAweDAwMDEwMzQyCi0jZGVmaW5lIENVU1RPTV9TVEVSRU9fUEFZTE9BRF9TSVpFCTkKLSNkZWZpbmUgQ1VTVE9NX1NURVJFT19DTURfUEFSQU1fU0laRQkyNAotI2RlZmluZSBDVVNUT01fU1RFUkVPX05VTV9PVVRfQ0gJMHgwMDAyCi0jZGVmaW5lIENVU1RPTV9TVEVSRU9fTlVNX0lOX0NICQkweDAwMDIKLSNkZWZpbmUgQ1VTVE9NX1NURVJFT19JTkRFWF9QQVJBTQkweDAwMDIKLSNkZWZpbmUgUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFCTB4MjAwMAotI2RlZmluZSBRMTRfR0FJTl9VTklUWQkJCTB4NDAwMAotCi1zdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X2NsaXBfYmFua19zZWxlY3Rpb24gewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfY2xpcF9iYW5rX3NlbCBiYW5rX3NlbDsKLX0gX19wYWNrZWQ7Ci0KLS8qIFVsdHJhc291bmQgc3VwcG9ydGVkIGZvcm1hdHMgKi8KLSNkZWZpbmUgVVNfUE9JTlRfRVBPU19GT1JNQVRfVjIgMHgwMDAxMjcyRAotI2RlZmluZSBVU19SQVdfRk9STUFUX1YyICAgICAgICAweDAwMDEyNzJDCi0jZGVmaW5lIFVTX1BST1hfRk9STUFUX1Y0ICAgICAgIDB4MDAwMTI3M0IKLSNkZWZpbmUgVVNfUkFXX1NZTkNfRk9STUFUICAgICAgMHgwMDAxMjcyRgotI2RlZmluZSBVU19HRVNfU1lOQ19GT1JNQVQgICAgICAweDAwMDEyNzMwCi0KLSNkZWZpbmUgQUZFX01PRFVMRV9HUk9VUF9ERVZJQ0UJMHgwMDAxMDI1NAotI2RlZmluZSBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0NGRwkweDAwMDEwMjU1Ci0jZGVmaW5lIEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfRU5BQkxFIDB4MDAwMTAyNTYKLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfTUkyU19SWAkweDExMDIKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0NGRwotICogcGFyYW1ldGVyLCB3aGljaCBjb25maWd1cmVzIG1heCBvZiA4IEFGRSBwb3J0cwotICogaW50byBhIGdyb3VwLgotICogVGhlIGZpeGVkIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgc2l4dGVlbiBieXRlcy4KLSAqLwotc3RydWN0IGFmZV9ncm91cF9kZXZpY2VfZ3JvdXBfY2ZnIHsKLQl1MzIgbWlub3JfdmVyc2lvbjsKLQl1MTYgZ3JvdXBfaWQ7Ci0JdTE2IG51bV9jaGFubmVsczsKLQl1MTYgcG9ydF9pZFs4XTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9SWCBcCi0JKEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYICsgMHgxMDApCi0jZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fVFggXAotCShBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWCArIDB4MTAwKQotI2RlZmluZSBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9URE1fUlggXAotCShBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYICsgMHgxMDApCi0jZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9UWCBcCi0JKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFggKyAweDEwMCkKLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fUlggXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlggKyAweDEwMCkKLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fVFggXAotCShBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFggKyAweDEwMCkKLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9SWCBcCi0JKEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYICsgMHgxMDApCi0jZGVmaW5lIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fVFggXAotCShBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWCArIDB4MTAwKQotCi0vKiBJRCBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgYnkgI0FGRV9NT0RVTEVfR1JPVVBfREVWSUNFIHRvIGNvbmZpZ3VyZSB0aGUKLSAqIGdyb3VwIGRldmljZS4gI0FGRV9TVkNfQ01EX1NFVF9QQVJBTSBjYW4gdXNlIHRoaXMgcGFyYW1ldGVyIElELgotICoKLSAqIFJlcXVpcmVtZW50czoKLSAqIC0gQ29uZmlndXJlIHRoZSBncm91cCBiZWZvcmUgdGhlIG1lbWJlciBwb3J0cyBpbiB0aGUgZ3JvdXAgYXJlCi0gKiBjb25maWd1cmVkIGFuZCBzdGFydGVkLgotICogLSBFbmFibGUgdGhlIGdyb3VwIG9ubHkgYWZ0ZXIgaXQgaXMgY29uZmlndXJlZC4KLSAqIC0gU3RvcCBhbGwgbWVtYmVyIHBvcnRzIGluIHRoZSBncm91cCBiZWZvcmUgZGlzYWJsaW5nIHRoZSBncm91cC4KLSAqLwotI2RlZmluZSBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX1RETV9DT05GSUcJMHgwMDAxMDI5RQotCi0vKiBWZXJzaW9uIGluZm9ybWF0aW9uIHVzZWQgdG8gaGFuZGxlIGZ1dHVyZSBhZGRpdGlvbnMgdG8KLSAqIEFGRV9QQVJBTV9JRF9HUk9VUF9ERVZJQ0VfVERNX0NPTkZJRyBwcm9jZXNzaW5nIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCi0gKi8KLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0dST1VQX0RFVklDRV9URE1fQ09ORklHCTB4MQotCi0vKiBOdW1iZXIgb2YgQUZFIHBvcnRzIGluIGdyb3VwIGRldmljZSAgKi8KLSNkZWZpbmUgQUZFX0dST1VQX0RFVklDRV9OVU1fUE9SVFMJCQkJCTgKLQotLyogUGF5bG9hZCBvZiB0aGUgQUZFX1BBUkFNX0lEX0dST1VQX0RFVklDRV9URE1fQ09ORklHIHBhcmFtZXRlciBJRAotICogdXNlZCBieSBBRkVfTU9EVUxFX0dST1VQX0RFVklDRS4KLSAqLwotc3RydWN0IGFmZV9wYXJhbV9pZF9ncm91cF9kZXZpY2VfdGRtX2NmZyB7Ci0JdTMyCWdyb3VwX2RldmljZV9jZmdfbWlub3JfdmVyc2lvbjsKLQkvKiBNaW5vciB2ZXJzaW9uIHVzZWQgdG8gdHJhY2sgZ3JvdXAgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCi0JICogQHZhbHVlcyAjQUZFX0FQSV9WRVJTSU9OX0dST1VQX0RFVklDRV9URE1fQ09ORklHCi0JICovCi0KLQl1MTYJZ3JvdXBfaWQ7Ci0JLyogSUQgZm9yIHRoZSBncm91cCBkZXZpY2UuCi0JICogQHZhbHVlcwotCSAqIC0gI0FGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fUlgKLQkgKiAtICNBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1RYCi0JICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1JYCi0JICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1RYCi0JICogLSAjQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fUlgKLQkgKiAtICNBRkVfR1JPVVBfREVWSUNFX0lEX1RFUlRJQVJZX1RETV9UWAotCSAqIC0gI0FGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fUlgKLQkgKiAtICNBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1RYCi0JICovCi0KLQl1MTYJcmVzZXJ2ZWQ7Ci0JLyogMCAqLwotCi0JdTE2CXBvcnRfaWRbQUZFX0dST1VQX0RFVklDRV9OVU1fUE9SVFNdOwotCS8qIEFycmF5IG9mIG1lbWJlciBwb3J0IElEcyBvZiB0aGlzIGdyb3VwLgotCSAqIEB2YWx1ZXMKLQkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWAotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzEKLQkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yCi0JICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMwotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQKLQkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81Ci0JICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNgotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzcKLQotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYCi0JICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMQotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzIKLQkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zCi0JICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNAotCSAqIC0gI0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzUKLQkgKiAtICNBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82Ci0JICogLSAjQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNwotCi0JICogLSAjQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWAotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMQotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMgotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMwotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNAotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNQotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNgotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNwotCi0JICogLSAjQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWAotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMQotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMgotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMwotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNAotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNQotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNgotCSAqIC0gI0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNwotCi0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYCi0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzEKLQkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMgotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zCi0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQKLQkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNQotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82Ci0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzcKLQotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWAotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xCi0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzIKLQkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMwotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80Ci0JICogLSAjQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzUKLQkgKiAtICNBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNgotCSAqIC0gI0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83Ci0KLQkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWAotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzEKLQkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yCi0JICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMwotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQKLQkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81Ci0JICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNgotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzcKLQotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYCi0JICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMQotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzIKLQkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zCi0JICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNAotCSAqIC0gI0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzUKLQkgKiAtICNBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82Ci0JICogLSAjQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNwotCSAqIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCi0JdTMyCW51bV9jaGFubmVsczsKLQkvKiBOdW1iZXIgb2YgZW5hYmxlZCBzbG90cyBmb3IgVERNIGZyYW1lLgotCSAqIEB2YWx1ZXMgMSB0byA4Ci0JICovCi0KLQl1MzIJc2FtcGxlX3JhdGU7Ci0JLyogU2FtcGxpbmcgcmF0ZSBvZiB0aGUgcG9ydC4KLQkgKiBAdmFsdWVzCi0JICogLSAjQUZFX1BPUlRfU0FNUExFX1JBVEVfOEsKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8xNksKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8yNEsKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV8zMksKLQkgKiAtICNBRkVfUE9SVF9TQU1QTEVfUkFURV80OEsgQHRhYmxlYnVsbGV0ZW5kCi0JICovCi0KLQl1MzIJYml0X3dpZHRoOwotCS8qIEJpdCB3aWR0aCBvZiB0aGUgc2FtcGxlLgotCSAqIEB2YWx1ZXMgMTYsIDI0LCAoMzIpCi0JICovCi0KLQl1MTYJbnNsb3RzX3Blcl9mcmFtZTsKLQkvKiBOdW1iZXIgb2Ygc2xvdHMgcGVyIGZyYW1lLiBUeXBpY2FsIDogMSwgMiwgNCwgOCwgMTYsIDMyLgotCSAqIEB2YWx1ZXMgMSAtIDMyCi0JICovCi0KLQl1MTYJc2xvdF93aWR0aDsKLQkvKiBTbG90IHdpZHRoIG9mIHRoZSBzbG90IGluIGEgVERNIGZyYW1lLiAgKHNsb3Rfd2lkdGggPj0gYml0X3dpZHRoKQotCSAqIGhhdmUgdG8gYmUgc2F0aXNmaWVkLgotCSAqIEB2YWx1ZXMgMTYsIDI0LCAzMgotCSAqLwotCi0JdTMyCXNsb3RfbWFzazsKLQkvKiBQb3NpdGlvbiBvZiBhY3RpdmUgc2xvdHMuICBXaGVuIHRoYXQgYml0IGlzIHNldCwgdGhhdCBwYXJpY3VsYXIKLQkgKiBzbG90IGlzIGFjdGl2ZS4KLQkgKiBOdW1iZXIgb2YgYWN0aXZlIHNsb3RzIGNhbiBiZSBpbmZlcnJlZCBieSBudW1iZXIgb2YgYml0cyBzZXQgaW4KLQkgKiB0aGUgbWFzay4gIE9ubHkgOCBpbmRpdmlkdWFsIGJpdHMgY2FuIGJlIGVuYWJsZWQuCi0JICogQml0cyAwLi4zMSBjb3JyZXNwb25kaW5nIHRvIHNsb3QgMC4uMzEKLQkgKiBAdmFsdWVzIDEgdG8gMl4zMiAtMQotCSAqLwotfSBfX3BhY2tlZDsKLQotLyogIFBheWxvYWQgb2YgdGhlICNBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0VOQUJMRQotICogcGFyYW1ldGVyLCB3aGljaCBlbmFibGVzIG9yCi0gKiBkaXNhYmxlcyBhbnkgbW9kdWxlLgotICogVGhlIGZpeGVkIHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgZm91ciBieXRlcy4KLSAqLwotCi1zdHJ1Y3QgYWZlX2dyb3VwX2RldmljZV9lbmFibGUgewotCXUxNiBncm91cF9pZDsKLQkvKiB2YWxpZCB2YWx1ZSBpcyBBRkVfR1JPVVBfREVWSUNFX0lEX1NFQ09OREFSWV9NSTJTX1JYICovCi0JdTE2IGVuYWJsZTsKLQkvKiBFbmFibGVzICgxKSBvciBkaXNhYmxlcyAoMCkgdGhlIG1vZHVsZS4gKi8KLX0gX19wYWNrZWQ7Ci0KLXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyB7Ci0Jc3RydWN0IGFmZV9ncm91cF9kZXZpY2VfZ3JvdXBfY2ZnIGdyb3VwX2NmZzsKLQlzdHJ1Y3QgYWZlX2dyb3VwX2RldmljZV9lbmFibGUgZ3JvdXBfZW5hYmxlOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfZ3JvdXBfZGV2aWNlX3RkbV9jZmcgdGRtX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfcG9ydF9ncm91cF9jcmVhdGUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtIHBhcmFtOwotCXN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyIHBkYXRhOwotCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyBkYXRhOwotfSBfX3BhY2tlZDsKLQotLyogSUQgb2YgdGhlIHBhcmFtZXRlciB1c2VkIGJ5ICNBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0UgdG8gc3BlY2lmeQotICogdGhlIHRpbWluZyBzdGF0aXN0aWNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBpbnRlcmZhY2UuCi0gKiBDbGllbnQgY2FuIHBlcmlvZGljYWxseSBxdWVyeSBmb3IgdGhlIGRldmljZSB0aW1lIHN0YXRpc3RpY3MgdG8gaGVscCBhZGp1c3QKLSAqIHRoZSBQTEwgYmFzZWQgb24gdGhlIGRyaWZ0IHZhbHVlLiBUaGUgZ2V0IHBhcmFtIGNvbW1hbmQgbXVzdCBiZSBzZW50IHRvCi0gKiBBRkUgcG9ydCBJRCBjb3JyZXNwb25kaW5nIHRvIGRldmljZSBpbnRlcmZhY2UKLQotICogVGhpcyBwYXJhbWV0ZXIgSUQgc3VwcG9ydHMgZm9sbG93aW5nIGdldCBwYXJhbSBjb21tYW5kczoKLSAqICNBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyIGFuZAotICogI0FGRV9QT1JUX0NNRF9HRVRfUEFSQU1fVjMuCi0gKi8KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0RFVl9USU1JTkdfU1RBVFMgICAgICAgICAgIDB4MDAwMTAyQUQKLQotLyogVmVyc2lvbiBpbmZvcm1hdGlvbiB1c2VkIHRvIGhhbmRsZSBmdXR1cmUgYWRkaXRpb25zIHRvIEFGRSBkZXZpY2UKLSAqIGludGVyZmFjZSB0aW1pbmcgc3RhdGlzdGljcyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgotICovCi0jZGVmaW5lIEFGRV9BUElfVkVSU0lPTl9ERVZfVElNSU5HX1NUQVRTICAgICAgICAweDEKLQotLyogRW51bWVyYXRpb24gZm9yIHNwZWNpZnlpbmcgYSBzaW5rKFJ4KSBkZXZpY2UgKi8KLSNkZWZpbmUgQUZFX1NJTktfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotCi0vKiBFbnVtZXJhdGlvbiBmb3Igc3BlY2lmeWluZyBhIHNvdXJjZShUeCkgZGV2aWNlICovCi0jZGVmaW5lIEFGRV9TT1VSQ0VfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAweDEKLQotLyogRW51bWVyYXRpb24gZm9yIHNwZWNpZnlpbmcgdGhlIGRyaWZ0IHJlZmVyZW5jZSBpcyBvZiB0eXBlIEFWIFRpbWVyICovCi0jZGVmaW5lIEFGRV9SRUZfVElNRVJfVFlQRV9BVlRJTUVSICAgICAgICAgICAgICAweDAKLQotLyogTWVzc2FnZSBwYXlsb2FkIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiBBRkVfUEFSQU1fSURfREVWX1RJTUlOR19TVEFUUyBwYXJhbWV0ZXIuCi0gKi8KLXN0cnVjdCBhZmVfcGFyYW1faWRfZGV2X3RpbWluZ19zdGF0cyB7Ci0JLyogTWlub3IgdmVyc2lvbiB1c2VkIHRvIHRyYWNrIHRoZSB2ZXJzaW9uIG9mIGRldmljZSBpbnRlcmZhY2UgdGltaW5nCi0JICogc3RhdGlzdGljcy4gQ3VycmVudGx5LCB0aGUgc3VwcG9ydGVkIHZlcnNpb24gaXMgMS4KLQkgKiBAdmFsdWVzICNBRkVfQVBJX1ZFUlNJT05fREVWX1RJTUlOR19TVEFUUwotCSAqLwotCXUzMiAgICAgICBtaW5vcl92ZXJzaW9uOwotCi0JLyogSW5kaWNhdGVzIHRoZSBkZXZpY2UgaW50ZXJmYWNlIGRpcmVjdGlvbiBhcyBlaXRoZXIKLQkgKiBzb3VyY2UgKFR4KSBvciBzaW5rIChSeCkuCi0JICogQHZhbHVlcwotCSAqICNBRkVfU0lOS19ERVZJQ0UKLQkgKiAjQUZFX1NPVVJDRV9ERVZJQ0UKLQkgKi8KLQl1MTYgICAgICAgIGRldmljZV9kaXJlY3Rpb247Ci0KLQkvKiBSZWZlcmVuY2UgdGltZXIgZm9yIGRyaWZ0IGFjY3VtdWxhdGlvbiBhbmQgdGltZSBzdGFtcCBpbmZvcm1hdGlvbi4KLQkgKiBAdmFsdWVzCi0JICogI0FGRV9SRUZfVElNRVJfVFlQRV9BVlRJTUVSIEB0YWJsZWJ1bGxldGVuZAotCSAqLwotCXUxNiAgICAgICAgcmVmZXJlbmNlX3RpbWVyOwotCi0JLyoKLQkgKiBGbGFnIHRvIGluZGljYXRlIGlmIHJlc3luYyBpcyByZXF1aXJlZCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yCi0JICogZHJpZnQgY29ycmVjdGlvbi4gRmxhZyBpcyBzZXQgdG8gVFJVRSBmb3IgdGhlIGZpcnN0IGdldF9wYXJhbQotCSAqIHJlc3BvbnNlIGFmdGVyIGRldmljZSBpbnRlcmZhY2Ugc3RhcnRzLiBUaGlzIGZsYWcgdmFsdWUgY2FuIGJlCi0JICogdXNlZCBieSBjbGllbnQgdG8gaWRlbnRpZnkgaWYgZGV2aWNlIGludGVyZmFjZSByZXN0YXJ0IGhhcwotCSAqIGhhcHBlbmVkIGFuZCBpZiBhbnkgcmUtc3luYyBpcyByZXF1aXJlZCBhdCB0aGVpciBlbmQgZm9yIGRyaWZ0Ci0JICogY29ycmVjdGlvbi4KLQkgKiBAdmFsdWVzCi0JICogMDogRkFMU0UgKFJlc3luYyBub3QgcmVxdWlyZWQpCi0JICogMTogVFJVRSAoUmVzeW5jIHJlcXVpcmVkKSBAdGFibGVidWxsZXRlbmQKLQkgKi8KLQl1MzIgICAgICAgIHJlc3luY19mbGFnOwotCi0JLyogQWNjdW11bGF0ZWQgZHJpZnQgdmFsdWUgaW4gbWljcm9zZWNvbmRzLiBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQKLQkgKiBldmVyeSAxMDB0aCBtcy4KLQkgKiBQb3NpdGl2ZSBkcmlmdCB2YWx1ZSBpbmRpY2F0ZXMgQVYgdGltZXIgaXMgcnVubmluZyBmYXN0ZXIgdGhhbiBkZXZpY2UKLQkgKiBOZWdhdGl2ZSBkcmlmdCB2YWx1ZSBpbmRpY2F0ZXMgQVYgdGltZXIgaXMgcnVubmluZyBzbG93ZXIgdGhhbiBkZXZpY2UKLQkgKiBAdmFsdWVzIEFueSB2YWxpZCBpbnQzMiBudW1iZXIKLQkgKi8KLQlzMzIgICAgICAgICBhY2NfZHJpZnRfdmFsdWU7Ci0KLQkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgYWJzb2x1dGUgdGltZXN0YW1wIG9mIHJlZmVyZW5jZQotCSAqIHRpbWVyIGluIG1pY3Jvc2Vjb25kcy4KLQotCSAqIFRoaXMgdGltZXN0YW1wIGNvcnJlc3BvbmRzIHRvIHRoZSB0aW1lIHdoZW4gdGhlIGRyaWZ0IHZhbHVlcwotCSAqIGFyZSBhY2N1bWxhdGVkIGZvciBldmVyeSAxMDB0aCBtcy4KLQkgKiBAdmFsdWVzIEFueSB2YWxpZCB1aW50MzIgbnVtYmVyCi0JICovCi0JdTMyICAgICAgICByZWZfdGltZXJfYWJzX3RzX2xzdzsKLQotCS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIDY0LWJpdCBhYnNvbHV0ZSB0aW1lc3RhbXAgb2YgcmVmZXJlbmNlCi0JICogdGltZXIgaW4gbWljcm9zZWNvbmRzLgotCSAqIFRoaXMgdGltZXN0YW1wIGNvcnJlc3BvbmRzIHRvIHRoZSB0aW1lIHdoZW4gdGhlIGRyaWZ0IHZhbHVlcwotCSAqIGFyZSBhY2N1bWxhdGVkIGZvciBldmVyeSAxMDB0aCBtcy4KLQkgKiBAdmFsdWVzIEFueSB2YWxpZCB1aW50MzIgbnVtYmVyCi0JICovCi0JdTMyICAgICAgICByZWZfdGltZXJfYWJzX3RzX21zdzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfYXZfZGV2X2RyaWZ0X2dldF9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyIGdldF9wYXJhbTsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMgdGltaW5nX3N0YXRzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9hdl9kZXZfZHJpZnRfZ2V0X3BhcmFtX3Jlc3AgewotCXVpbnQzMl90IHN0YXR1czsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MiBwZGF0YTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMgdGltaW5nX3N0YXRzOwotfSBfX3BhY2tlZDsKLQotLyogQ29tbWFuZCBmb3IgTWF0cml4IG9yIFN0cmVhbSBSb3V0ZXIgKi8KLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1NFVF9NVE1YX1NUUlRSX1BBUkFNU19WMiAgICAweDAwMDEwRENFCi0vKiBNb2R1bGUgZm9yIEFWU1lOQyAqLwotI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX01PRFVMRV9JRF9BVlNZTkMgICAgMHgwMDAxMERDNgotCi0vKiBQYXJhbWV0ZXIgdXNlZCBieSAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DIHRvIHNwZWNpZnkgdGhlCi0gKiByZW5kZXIgd2luZG93IHN0YXJ0IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBpcyBzdXBwb3J0ZWQgb25seSBmb3IgYSBTZXQKLSAqIGNvbW1hbmQgKG5vdCBhIEdldCBjb21tYW5kKSBpbiB0aGUgUnggZGlyZWN0aW9uCi0gKiAoI0FTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjIpLgotICogUmVuZGVyIHdpbmRvdyBzdGFydCBpcyBhIHZhbHVlIChzZXNzaW9uIHRpbWUgbWludXMgdGltZXN0YW1wLCBvciBTVC1UUykKLSAqIGJlbG93IHdoaWNoIGZyYW1lcyBhcmUgaGVsZCwgYW5kIGFmdGVyIHdoaWNoIGZyYW1lcyBhcmUgaW1tZWRpYXRlbHkKLSAqIHJlbmRlcmVkLgotICovCi0jZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX1dJTkRPV19TVEFSVF9WMiAweDAwMDEwREQxCi0KLS8qIFBhcmFtZXRlciB1c2VkIGJ5ICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX01PRFVMRV9JRF9BVlNZTkMgdG8gc3BlY2lmeSB0aGUKLSAqIHJlbmRlciB3aW5kb3cgZW5kIHZhbHVlLiBUaGlzIHBhcmFtZXRlciBpcyBzdXBwb3J0ZWQgb25seSBmb3IgYSBTZXQKLSAqIGNvbW1hbmQgKG5vdCBhIEdldCBjb21tYW5kKSBpbiB0aGUgUnggZGlyZWN0aW9uCi0gKiAoI0FTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjIpLiBSZW5kZXIgd2luZG93IGVuZCBpcyBhIHZhbHVlCi0gKiAoc2Vzc2lvbiB0aW1lIG1pbnVzIHRpbWVzdGFtcCkgYWJvdmUgd2hpY2ggZnJhbWVzIGFyZSBkcm9wcGVkLCBhbmQgYmVsb3cKLSAqIHdoaWNoIGZyYW1lcyBhcmUgaW1tZWRpYXRlbHkgcmVuZGVyZWQuCi0gKi8KLSNkZWZpbmUgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX0VORF9WMiAgIDB4MDAwMTBERDIKLQotLyogR2VuZXJpYyBwYXlsb2FkIG9mIHRoZSB3aW5kb3cgcGFyYW1ldGVycyBpbiB0aGUKLSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX01PRFVMRV9JRF9BVlNZTkMgbW9kdWxlLgotICogVGhpcyBwYXlsb2FkIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBhIFNldCBjb21tYW5kCi0gKiAobm90IGEgR2V0IGNvbW1hbmQpIG9uIHRoZSBSeCBwYXRoLgotICovCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV93aW5kb3dfdjJfdCB7Ci0JdTMyICAgIHdpbmRvd19sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgcmVuZGVyIHdpbmRvdyBzdGFydCB2YWx1ZS4gKi8KLQotCXUzMiAgICB3aW5kb3dfbXN3OwotCS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIHJlbmRlciB3aW5kb3cgc3RhcnQgdmFsdWUuCi0JICoKLQkgKiBUaGUgNjQtYml0IG51bWJlciBmb3JtZWQgYnkgd2luZG93X2xzdyBhbmQgd2luZG93X21zdyBzcGVjaWZpZXMgYQotCSAqIHNpZ25lZCA2NC1iaXQgd2luZG93IHZhbHVlIGluIG1pY3Jvc2Vjb25kcy4gVGhlIHNpZ24gZXh0ZW5zaW9uIGlzCi0JICogbmVjZXNzYXJ5LiBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgSURzOgotCSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9XSU5ET1dfU1RBUlRfVjIKLQkgKiAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX0VORF9WMgotCSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NUQVRfV0lORE9XX1NUQVJUX1YyCi0JICogI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fU1RBVF9XSU5ET1dfRU5EX1YyCi0JICogVGhlIHZhbHVlIGRlcGVuZHMgb24gd2hpY2ggcGFyYW1ldGVyIElEIGlzIHVzZWQuCi0JICogVGhlIGFEU1AgaG9ub3JzIHRoZSB3aW5kb3dzIGF0IGEgZ3JhbnVsYXJpdHkgb2YgMSBtcy4KLQkgKi8KLX07Ci0KLXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfc2V0X210bXhfc3Ryc3RyX3BhcmFtc192MiB7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9tc3c7Ci0JLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IGRhdGEgcGF5bG9hZCBhZGRyZXNzLgotCSAqIElmIHRoZSBhZGRyZXNzIGlzIG5vdCBzZW50IChOVUxMKSwgdGhlIG1lc3NhZ2UgaXMgaW4gdGhlIHBheWxvYWQuCi0JICogSWYgdGhlIGFkZHJlc3MgaXMgc2VudCAobm9uLU5VTEwpLCB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMKLQkgKiBiZWdpbiBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCi0JICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotCS8qIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzLiBUaGlzIG1lbW9yeSBtYXAgaGFuZGxlIGlzIHJldHVybmVkCi0JICogYnkgdGhlIGFEU1AgdGhyb3VnaCB0aGUgI0FTTV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyBjb21tYW5kLgotCSAqIHZhbHVlcwotCSAqIC0gTlVMTCAtLSBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcyBhcmUgd2l0aGluIHRoZSBtZXNzYWdlIHBheWxvYWQKLQkgKiAoaW4tYmFuZCkuCi0JICogLSBOb24tTlVMTCAtLSBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcyBiZWdpbiBhdCB0aGUgYWRkcmVzcyBzcGVjaWZpZWQKLQkgKiBpbiB0aGUgZGF0YV9wYXlsb2FkX2FkZHJfbHN3IGFuZCBkYXRhX3BheWxvYWRfYWRkcl9tc3cgZmllbGRzCi0JICogKG91dC1vZi1iYW5kKS4KLQkgKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgZGF0YV9wYXlsb2FkX3NpemU7Ci0JLyogQWN0dWFsIHNpemUgb2YgdGhlIHZhcmlhYmxlIHBheWxvYWQgYWNjb21wYW55aW5nIHRoZSBtZXNzYWdlLCBvciBpbgotCSAqIHNoYXJlZCBtZW1vcnkuIFRoaXMgZmllbGQgaXMgdXNlZCBmb3IgcGFyc2luZyB0aGUgcGFyYW1ldGVyIHBheWxvYWQuCi0JICogdmFsdWVzID4gMCBieXRlcwotCSAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkaXJlY3Rpb247Ci0JLyogRGlyZWN0aW9uIG9mIHRoZSBlbnRpdHkgKG1hdHJpeCBtaXhlciBvciBzdHJlYW0gcm91dGVyKSBvbiB3aGljaAotCSAqIHRoZSBwYXJhbWV0ZXIgaXMgdG8gYmUgc2V0LgotCSAqIHZhbHVlcwotCSAqIC0gMCAtLSBSeCAoZm9yIFJ4IHN0cmVhbSByb3V0ZXIgb3IgUnggbWF0cml4IG1peGVyKQotCSAqIC0gMSAtLSBUeCAoZm9yIFR4IHN0cmVhbSByb3V0ZXIgb3IgVHggbWF0cml4IG1peGVyKQotCSAqLwotfTsKLQotLyogUGFyYW1ldGVyIHVzZWQgYnkgI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQyB3aGljaCBhbGxvd3MgdGhlCi0gKiBhdWRpbyBjbGllbnQgY2hvb3NlIHRoZSByZW5kZXJpbmcgZGVjaXNpb24gdGhhdCB0aGUgYXVkaW8gRFNQIHNob3VsZCB1c2UuCi0gKi8KLSNkZWZpbmUgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfTU9ERV9DTUQgIDB4MDAwMTJGMEQKLQotLyogSW5kaWNhdGVzIHRoYXQgcmVuZGVyaW5nIGRlY2lzaW9uIHdpbGwgYmUgYmFzZWQgb24gZGVmYXVsdCByYXRlCi0gKiAoc2Vzc2lvbiBjbG9jayBiYXNlZCByZW5kZXJpbmcsIGRldmljZSBkcml2ZW4pLgotICogMS4gVGhlIGRlZmF1bHQgc2Vzc2lvbiBjbG9jayBiYXNlZCByZW5kZXJpbmcgaXMgaW5oZXJlbnRseSBkcml2ZW4KLSAqICAgIGJ5IHRoZSB0aW1pbmcgb2YgdGhlIGRldmljZS4KLSAqIDIuIEFmdGVyIHRoZSBpbml0aWFsIGRlY2lzaW9uIGlzIG1hZGUgKGZpcnN0IGJ1ZmZlciBhZnRlciBhIHJ1bgotICogICAgY29tbWFuZCksIHN1YnNlcXVlbnQgZGF0YSByZW5kZXJpbmcgZGVjaXNpb25zIGFyZSBtYWRlIHdpdGgKLSAqICAgIHJlc3BlY3QgdG8gdGhlIHJhdGUgYXQgd2hpY2ggdGhlIGRldmljZSBpcyByZW5kZXJpbmcsIHRodXMgZGVyaXZpbmcKLSAqICAgIGl0cyB0aW1pbmcgZnJvbSB0aGUgZGV2aWNlLgotICogMy4gV2hpbGUgdGhpcyBkZWNpc2lvbiBtYWtpbmcgaXMgc2ltcGxlLCBpdCBoYXMgc29tZSBpbmhlcmVudCBsaW1pdGF0aW9ucwotICogICAgKG1lbnRpb25lZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KLSAqIDQuIElmIHRoaXMgQVBJIGlzIG5vdCBzZXQsIHRoZSBzZXNzaW9uIGNsb2NrIGJhc2VkIHJlbmRlcmluZyB3aWxsIGJlIGFzc3VtZWQKLSAqICAgIGFuZCB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIERTUCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlLgotICovCi0jZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX0RFRkFVTFQgMAotCi0vKiBJbmRpY2F0ZXMgdGhhdCByZW5kZXJpbmcgZGVjaXNpb24gd2lsbCBiZSBiYXNlZCBvbiBsb2NhbCBjbG9jayByYXRlLgotICogMS4gSW4gdGhlIERTUCBsb29wYmFjay9jbGllbnQgbG9vcGJhY2sgdXNlIGNhc2VzIChmcmFtZSBiYXNlZAotICogICAgaW5wdXRzKSwgdGhlIGluY29taW5nIGRhdGEgaW50byBhdWRpbyBEU1AgaXMgdGltZS1zdGFtcGVkIGF0IHRoZQotICogICAgbG9jYWwgY2xvY2sgcmF0ZSAoU1RDKS4KLSAqIDIuIFRoaXMgVFMgcmF0ZSBtYXkgbWF0Y2ggdGhlIGluY29taW5nIGRhdGEgcmF0ZSBvciBtYXliZSBkaWZmZXJlbnQKLSAqICAgIGZyb20gdGhlIGluY29taW5nIGRhdGEgcmF0ZS4KLSAqIDMuIFJlZ2FyZGxlc3MsIHRoZSBkYXRhIHdpbGwgYmUgdGltZS1zdGFtcGVkIHdpdGggbG9jYWwgU1RDIGFuZAotICogICAgdGhlcmVmb3JlLCB0aGUgY2xpZW50IGlzIHJlY29tbWVuZGVkIHRvIHNldCB0aGlzIG1vZGUgZm9yIHRoZXNlCi0gKiAgICB1c2UgY2FzZXMuIFRoaXMgbWV0aG9kIGlzIGluaGVyZW50bHkgbW9yZSByb2J1c3QgdG8gc2VxdWVuY2luZwotICogICAgKEFGRSBTdGFydC9TdG9wKSBhbmQgZGV2aWNlIHN3aXRjaGVzLCBhbW9uZyBvdGhlciBiZW5lZml0cy4KLSAqIDQuIFRoaXMgQVBJIHdpbGwgaW5mb3JtIHRoZSBEU1AgdG8gY29tcGFyZSBldmVyeSBpbmNvbWluZyBidWZmZXIgVFMKLSAqICAgIGFnYWluc3QgbG9jYWwgU1RDLgotICogNS4gRFNQIHdpbGwgY29udGludWUgdG8gaG9ub3IgcmVuZGVyIHdpbmRvd3MgQVBJcywgYXMgYmVmb3JlLgotICovCi0jZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX0xPQ0FMX1NUQyAxCi0KLS8qIFN0cnVjdHVyZSBmb3IgcmVuZGVyaW5nIGRlY2lzaW9uIHBhcmFtZXRlciAqLwotc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCB7Ci0JLyogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHJlbmRlcmluZyBkZWNpc2lvbiB0aGUgYXVkaW8gRFNQIHNob3VsZCB1c2UuCi0JICoKLQkgKiBAdmFsdWVzCi0JICogLSAjQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfREVGQVVMVAotCSAqIC0gI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX0xPQ0FMX1NUQwotCSAqLwotCXUzMiAgICAgICAgICAgICAgICAgIGZsYWdzOwotfSBfX3BhY2tlZDsKLQotLyogUGFyYW1ldGVyIHVzZWQgYnkgI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQyB3aGljaCBhbGxvd3MgdGhlCi0gKiBhdWRpbyBjbGllbnQgdG8gc3BlY2lmeSB0aGUgY2xvY2sgcmVjb3ZlcnkgbWVjaGFuaXNtIHRoYXQgdGhlIGF1ZGlvIERTUAotICogc2hvdWxkIHVzZS4KLSAqLwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19DTUQgMHgwMDAxMkYwRQotCi0vKiBJbmRpY2F0ZXMgdGhhdCBkZWZhdWx0IGNsb2NrIHJlY292ZXJ5IHdpbGwgYmUgdXNlZCAobm8gY2xvY2sgcmVjb3ZlcnkpLgotICogSWYgdGhlIGNsaWVudCB3aXNoZXMgdGhhdCBubyBjbG9jayByZWNvdmVyeSBiZSBkb25lLCB0aGUgY2xpZW50IGNhbgotICogY2hvb3NlIHRoaXMuIFRoaXMgbWVhbnMgdGhhdCBubyBhdHRlbXB0IHdpbGwgbWFkZSBieSB0aGUgRFNQIHRvIHRyeSBhbmQKLSAqIG1hdGNoIHRoZSByYXRlcyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBhdWRpby4KLSAqLwotI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX0NMS19SRUNfTk9ORSAwCi0KLS8qIEluZGljYXRlcyB0aGF0IGluZGVwZW5kZW50IGNsb2NrIHJlY292ZXJ5IG5lZWRzIHRvIGJlIHVzZWQuCi0gKiAxLiBJbiB0aGUgRFNQIGxvb3BiYWNrL2NsaWVudCBsb29wYmFjayB1c2UgY2FzZXMgKGZyYW1lIGJhc2VkIGlucHV0cyksCi0gKiAgICB0aGUgY2xpZW50IHNob3VsZCBjaG9vc2UgdGhlIGluZGVwZW5kZW50IGNsb2NrIHJlY292ZXJ5IG9wdGlvbi4KLSAqIDIuIFRoaXMgYmFzaWNhbGx5IGRlLWNvdXBsZXMgdGhlIGF1ZGlvIGFuZCB2aWRlbyBmcm9tIGtub3dpbmcgZWFjaCBvdGhlcnMKLSAqICAgIGNsb2NrIHNvdXJjZXMgYW5kIGxldHMgdGhlIGF1ZGlvIERTUCBpbmRlcGVuZGVudGx5IHJhdGUgbWF0Y2ggdGhlIGlucHV0Ci0gKiAgICBhbmQgb3V0cHV0IHJhdGVzLgotICogMy4gQWZ0ZXIgZHJpZnQgZGV0ZWN0aW9uLCB0aGUgZHJpZnQgY29ycmVjdGlvbiBpcyBhY2hpZXZlZCBieSBlaXRoZXIgcHVsbGluZwotICogICAgdGhlIFBMTHMgKGlmIGFwcGxpY2FibGUpIG9yIGJ5IHN0cmVhbSB0byBkZXZpY2UgcmF0ZSBtYXRjaGluZwotICogICAgKGZvciBQQ00gdXNlIGNhc2VzKSBieSBjb21wYXJpbmcgZHJpZnQgd2l0aCByZXNwZWN0IHRvIFNUQy4KLSAqIDQuIEZvciBwYXNzdGhyb3VnaCB1c2UgY2FzZXMsIHNpbmNlIHRoZSBQTEwgcHVsbGluZyBpcyB0aGUgb25seSBvcHRpb24sCi0gKiAgICBhIGJlc3QgZWZmb3J0IHdpbGwgYmUgbWFkZS4KLSAqICAgIElmIFBMTCBwdWxsaW5nIGlzIG5vdCBwb3NzaWJsZSAvIGF2YWlsYWJsZSwgdGhlIHJlbmRlcmluZyB3aWxsIGJlCi0gKiAgICBkb25lIHdpdGhvdXQgcmF0ZSBtYXRjaGluZy4KLSAqLwotI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX0NMS19SRUNfQVVUTyAxCi0KLS8qIFBheWxvYWQgb2YgdGhlICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX0NMS19SRUMgcGFyYW1ldGVyLgotICovCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9jbGtfcmVjX3QgewotCS8qIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBjbG9jayByZWNvdmVyeSB0aGF0IHRoZSBhdWRpbyBEU1Agc2hvdWxkCi0JICogdXNlIGZvciByYXRlIG1hdGNoaW5nLgotCSAqLwotCi0JLyogQHZhbHVlcwotCSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX0NMS19SRUNfREVGQVVMVAotCSAqICNBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX0NMS19SRUNfSU5ERVBFTkRFTlQKLQkgKi8KLQl1MzIgICAgICAgICAgICAgICAgICBmbGFnczsKLX0gX19wYWNrZWQ7Ci0KLQotLyogUGFyYW1ldGVyIHVzZWQgYnkgI0FTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQyB0bwotICogcmVhbGl6ZSBzbW9vdGhlciBhZGp1c3RtZW50IG9mIGF1ZGlvIHNlc3Npb24gY2xvY2sgZm9yIGEgc3BlY2lmaWVkIHNlc3Npb24uCi0gKiBUaGUgZGVzaXJlZCBhdWRpbyBzZXNzaW9uIGNsb2NrIGFkanVzdG1lbnQoaW4gbWljcm8gc2Vjb25kcykgaXMgc3BlY2lmaWVkCi0gKiB1c2luZyB0aGUgY29tbWFuZCAjQVNNX1NFU1NJT05fQ01EX0FESlVTVF9TRVNTSU9OX0NMT0NLX1YyLgotICogRGVsYXlpbmcvQWR2YW5jaW5nIHRoZSBzZXNzaW9uIGNsb2NrIHdvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGluc2VydGluZwotICogaW50ZXJwb2xhdGVkL2Ryb3BwaW5nIGF1ZGlvIHNhbXBsZXMgaW4gdGhlIHBsYXliYWNrIHBhdGggcmVzcGVjdGl2ZWx5LgotICogQWxzbywgdGhpcyBwYXJhbWV0ZXIgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgYmVmb3JlIHRoZSBBdWRpbyBTZXNzaW9uIGlzIHB1dAotICogdG8gUlVOIHN0YXRlIHRvIGF2b2lkIGNvbGQgc3RhcnQgbGF0ZW5jeS9nbGl0Y2hlcyBpbiB0aGUgcGxheWJhY2suCi0gKi8KLQotI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1BBUkFNX0FESlVTVF9TRVNTSU9OX1RJTUVfQ1RMICAgICAgICAgMHgwMDAxMzIxNwotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9wYXJhbV9hZGp1c3Rfc2Vzc2lvbl90aW1lX2N0bF90IHsKLQkvKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgbW9kdWxlIGlzIGVuYWJsZWQgb3Igbm90Ci0JICogQHZhbHVlcwotCSAqIDAgLS0gZGlzYWJsZWQKLQkgKiAxIC0tIGVuYWJsZWQKLQkgKi8KLQl1MzIgICAgICAgICAgICAgICAgIGVuYWJsZTsKLX07Ci0KLXVuaW9uIGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fY29uZmlnIHsKLQlzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV93aW5kb3dfdjJfdCB3aW5kb3dfcGFyYW07Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCByZW5kZXJfcGFyYW07Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fY2xrX3JlY190IGNsa19yZWNfcGFyYW07Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfcGFyYW1fYWRqdXN0X3Nlc3Npb25fdGltZV9jdGxfdCBhZGpfdGltZV9wYXJhbTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMgewotCXN0cnVjdCBhcHJfaGRyICBoZHI7Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9zZXRfbXRteF9zdHJzdHJfcGFyYW1zX3YyIHBhcmFtOwotCXN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIgZGF0YTsKLQl1bmlvbiBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX2NvbmZpZyBjb25maWc7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9HRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjIgMHgwMDAxMERDRgotI2RlZmluZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyIDB4MDAwMTBERDAKLQotI2RlZmluZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NFU1NJT05fVElNRV9WMyAweDAwMDEyRjBCCi0jZGVmaW5lIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fU1RJTUVfVFNUTVBfRkxHX0JNQVNLICgweDgwMDAwMDAwVUwpCi0KLXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfZ2V0X210bXhfc3Ryc3RyX3BhcmFtc192MiB7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IGRhdGEgcGF5bG9hZCBhZGRyZXNzLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkYXRhX3BheWxvYWRfYWRkcl9tc3c7Ci0JLyoKLQkgKiBVcHBlciAzMiBiaXRzIG9mIHRoZSA2NC1iaXQgZGF0YSBwYXlsb2FkIGFkZHJlc3MuCi0JICogSWYgdGhlIGFkZHJlc3MgaXMgbm90IHNlbnQgKE5VTEwpLCB0aGUgbWVzc2FnZSBpcyBpbiB0aGUgcGF5bG9hZC4KLQkgKiBJZiB0aGUgYWRkcmVzcyBpcyBzZW50IChub24tTlVMTCksIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkcwotCSAqIGJlZ2luIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KLQkgKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci0JLyoKLQkgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYW4gYWRkcmVzcy4gVGhpcyBtZW1vcnkgbWFwIGhhbmRsZSBpcyByZXR1cm5lZAotCSAqIGJ5IHRoZSBhRFNQIHRocm91Z2ggdGhlICNBU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgY29tbWFuZC4KLQkgKiB2YWx1ZXMKLQkgKiAtIE5VTEwgLS0gUGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMgYXJlIHdpdGhpbiB0aGUgbWVzc2FnZSBwYXlsb2FkCi0JICogKGluLWJhbmQpLgotCSAqIC0gTm9uLU5VTEwgLS0gUGFyYW1ldGVyIGRhdGEgcGF5bG9hZHMgYmVnaW4gYXQgdGhlIGFkZHJlc3Mgc3BlY2lmaWVkCi0JICogaW4gdGhlIGRhdGFfcGF5bG9hZF9hZGRyX2xzdyBhbmQgZGF0YV9wYXlsb2FkX2FkZHJfbXN3IGZpZWxkcwotCSAqIChvdXQtb2YtYmFuZCkuCi0JICovCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBkaXJlY3Rpb247Ci0JLyoKLQkgKiBEaXJlY3Rpb24gb2YgdGhlIGVudGl0eSAobWF0cml4IG1peGVyIG9yIHN0cmVhbSByb3V0ZXIpIG9uIHdoaWNoCi0JICogdGhlIHBhcmFtZXRlciBpcyB0byBiZSBzZXQuCi0JICogdmFsdWVzCi0JICogLSAwIC0tIFJ4IChmb3IgUnggc3RyZWFtIHJvdXRlciBvciBSeCBtYXRyaXggbWl4ZXIpCi0JICogLSAxIC0tIFR4IChmb3IgVHggc3RyZWFtIHJvdXRlciBvciBUeCBtYXRyaXggbWl4ZXIpCi0JICovCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBtb2R1bGVfaWQ7Ci0JLyogVW5pcXVlIG1vZHVsZSBJRC4gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGFyYW1faWQ7Ci0JLyogVW5pcXVlIHBhcmFtZXRlciBJRC4gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGFyYW1fbWF4X3NpemU7Ci19OwotCi1zdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9zZXNzaW9uX3RpbWVfdjNfdCB7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBzZXNzaW9uX3RpbWVfbHN3OwotCS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcyAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBzZXNzaW9uX3RpbWVfbXN3OwotCS8qCi0JICogVXBwZXIgMzIgYml0cyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqIFRoZSA2NC1iaXQgbnVtYmVyIGZvcm1lZCBieSBzZXNzaW9uX3RpbWVfbHN3IGFuZCBzZXNzaW9uX3RpbWVfbXN3Ci0JICogaXMgdHJlYXRlZCBhcyBzaWduZWQuCi0JICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGFic29sdXRlX3RpbWVfbHN3OwotCS8qCi0JICogTG93ZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IGFic29sdXRlIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqIFRoaXMgaXMgdGhlIHRpbWUgd2hlbiB0aGUgc2FtcGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0JICogc2Vzc2lvbl90aW1lX2xzdyBpcyByZW5kZXJlZCB0byB0aGUgaGFyZHdhcmUuIFRoaXMgYWJzb2x1dGUKLQkgKiB0aW1lIGNhbiBiZSBzbGlnaHRseSBpbiB0aGUgZnV0dXJlIG9yIHBhc3QuCi0JICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGFic29sdXRlX3RpbWVfbXN3OwotCS8qCi0JICogVXBwZXIgMzIgYml0cyBvZiB0aGUgNjQtYml0IGFic29sdXRlIHRpbWUgaW4gbWljcm9zZWNvbmRzLgotCSAqIFRoaXMgaXMgdGhlIHRpbWUgd2hlbiB0aGUgc2FtcGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0JICogc2Vzc2lvbl90aW1lX21zdyBpcyByZW5kZXJlZCB0byBoYXJkd2FyZS4gVGhpcyBhYnNvbHV0ZQotCSAqIHRpbWUgY2FuIGJlIHNsaWdodGx5IGluIHRoZSBmdXR1cmUgb3IgcGFzdC4gVGhlIDY0LWJpdCBudW1iZXIKLQkgKiBmb3JtZWQgYnkgYWJzb2x1dGVfdGltZV9sc3cgYW5kIGFic29sdXRlX3RpbWVfbXN3IGlzIHRyZWF0ZWQgYXMKLQkgKiB1bnNpZ25lZC4KLQkgKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgdGltZV9zdGFtcF9sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgdGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcyAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICB0aW1lX3N0YW1wX21zdzsKLQkvKgotCSAqIFVwcGVyIDMyIGJpdHMgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMuCi0JICogVGhlIDY0LWJpdCBudW1iZXIgZm9ybWVkIGJ5IHRpbWVfc3RhbXBfbHN3IGFuZCB0aW1lX3N0YW1wX2xzdwotCSAqIGlzIHRyZWF0ZWQgYXMgdW5zaWduZWQuCi0JICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIGZsYWdzOwotCS8qCi0JICogS2VlcHMgdHJhY2sgb2YgYW55IGFkZGl0aW9uYWwgZmxhZ3MgbmVlZGVkLgotCSAqIEB2YWx1ZXN7Zm9yIGJpdCAzMX0KLQkgKiAtIDAgLS0gVW5pbml0aWFsaXplZC9pbnZhbGlkCi0JICogLSAxIC0tIFZhbGlkCi0JICogQWxsIG90aGVyIGJpdHMgYXJlIHJlc2VydmVkOyBjbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KLQkgKi8KLX07Ci0KLXVuaW9uIGFzbV9zZXNzaW9uX210bXhfc3RydHJfZGF0YV90eXBlIHsKLQlzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9zZXNzaW9uX3RpbWVfdjNfdCBzZXNzaW9uX3RpbWU7Ci19OwotCi1zdHJ1Y3QgYXNtX210bXhfc3RydHJfZ2V0X3BhcmFtcyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfZ2V0X210bXhfc3Ryc3RyX3BhcmFtc192MiBwYXJhbV9pbmZvOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9tdG14X3N0cnRyX2dldF9wYXJhbXNfY21kcnNwIHsKLQl1aW50MzJfdCBlcnJfY29kZTsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyIHBhcmFtX2luZm87Ci0JdW5pb24gYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9kYXRhX3R5cGUgcGFyYW1fZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfUkVTQU1QTEVSIDB4MDAwMTA3MTkKLQotZW51bSB7Ci0JTEVHQUNZX1BDTSA9IDAsCi0JQ09NUFJFU1NFRF9QQVNTVEhST1VHSCwKLQlDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0NPTlZFUlQsCi0JQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9EU0QsCi0JTElTVEVOLAotCUNPTVBSRVNTRURfUEFTU1RIUk9VR0hfR0VOLAotCUNPTVBSRVNTRURfUEFTU1RIUk9VR0hfSUVDNjE5MzcKLX07Ci0KLSNkZWZpbmUgQVVEUFJPQ19NT0RVTEVfSURfQ09NUFJFU1NFRF9NVVRFICAgICAgICAgICAgICAgIDB4MDAwMTA3NzAKLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9DT01QUkVTU0VEX01VVEUgICAgICAgICAgICAgICAgIDB4MDAwMTA3NzEKLQotc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbXV0ZSB7Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSBjb21tYW5kOwotCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBwYXJhbXM7Ci0JdTMyICAgIG11dGVfb247Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX0NPTVBSRVNTRURfTEFURU5DWSAgICAgICAgICAgICAweDAwMDEwNzZFCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQ09NUFJFU1NFRF9MQVRFTkNZICAgICAgICAgICAgICAweDAwMDEwNzZGCi0KLXN0cnVjdCBhZG1fc2V0X2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3kgewotCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgY29tbWFuZDsKLQlzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUgcGFyYW1zOwotCXUzMiAgICBsYXRlbmN5OwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBWT0lDRVBST0NfTU9EVUxFX0lEX0dFTkVSSUNfVFggICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEVGNgotI2RlZmluZSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VOREZPQ1VTICAgICAgICAgICAgICAgMHgwMDAxMEUzNwotI2RlZmluZSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VSQ0VUUkFDS0lORyAgICAgICAgICAgMHgwMDAxMEUzOAotI2RlZmluZSBNQVhfU0VDVE9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlMgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBNQVhfUE9MQVJfQUNUSVZJVFlfSU5ESUNBVE9SUyAgICAgICAgICAgICAgICAgICAgICAgMzYwCi0KLXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSB7Ci0JdWludDE2X3Qgc3RhcnRfYW5nbGVbTUFYX1NFQ1RPUlNdOwotCXVpbnQ4X3QgZW5hYmxlW01BWF9TRUNUT1JTXTsKLQl1aW50MTZfdCBnYWluX3N0ZXA7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtIHsKLQl1aW50OF90IHZhZFtNQVhfU0VDVE9SU107Ci0JdWludDE2X3QgZG9hX3NwZWVjaDsKLQl1aW50MTZfdCBkb2Ffbm9pc2VbTUFYX05PSVNFX1NPVVJDRV9JTkRJQ0FUT1JTXTsKLQl1aW50OF90IHBvbGFyX2FjdGl2aXR5W01BWF9QT0xBUl9BQ1RJVklUWV9JTkRJQ0FUT1JTXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgewotCXVpbnQxNl90IHN0YXJ0X2FuZ2xlc1tNQVhfU0VDVE9SU107Ci0JdWludDhfdCBlbmFibGVzW01BWF9TRUNUT1JTXTsKLQl1aW50MTZfdCBnYWluX3N0ZXA7Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWRtX3NldF9mbHVlbmNlX3NvdW5kZm9jdXNfcGFyYW0gewotCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgcGFyYW1zOwotCXN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSBkYXRhOwotCXN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3Qgc291bmRmb2N1c19kYXRhOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QgewotCXVpbnQ4X3QgdmFkW01BWF9TRUNUT1JTXTsKLQl1aW50MTZfdCBkb2Ffc3BlZWNoOwotCXVpbnQxNl90IGRvYV9ub2lzZVtNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlNdOwotCXVpbnQ4X3QgcG9sYXJfYWN0aXZpdHlbTUFYX1BPTEFSX0FDVElWSVRZX0lORElDQVRPUlNdOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBVURQUk9DX01PRFVMRV9JRF9BVURJT1NQSEVSRSAgICAgICAgICAgICAgIDB4MDAwMTA5MTYKLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9FTkFCTEUgICAgICAgICAweDAwMDEwOTE3Ci0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQVVESU9TUEhFUkVfU1RSRU5HVEggICAgICAgMHgwMDAxMDkxOAotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0NPTkZJR19NT0RFICAgIDB4MDAwMTA5MTkKLQotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0NPRUZGU19TVEVSRU9fSU5QVVQgICAgICAgICAweDAwMDEwOTFBCi0jZGVmaW5lIEFVRFBST0NfUEFSQU1fSURfQVVESU9TUEhFUkVfQ09FRkZTX01VTFRJQ0hBTk5FTF9JTlBVVCAgIDB4MDAwMTA5MUIKLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9ERVNJR05fU1RFUkVPX0lOUFVUICAgICAgICAgMHgwMDAxMDkxQwotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX0RFU0lHTl9NVUxUSUNIQU5ORUxfSU5QVVQgICAweDAwMDEwOTFECi0KLSNkZWZpbmUgQVVEUFJPQ19QQVJBTV9JRF9BVURJT1NQSEVSRV9PUEVSQVRJTkdfSU5QVVRfTUVESUFfSU5GTyAgMHgwMDAxMDkxRQotCi0jZGVmaW5lIEFVRFBST0NfTU9EVUxFX0lEX1ZPSUNFX1RYX1NFQ05TICAgMHgxMDAyNzA1OQotI2RlZmluZSBBVURQUk9DX1BBUkFNX0lEWF9TRUNfUFJJTUFSWV9NSUNfQ0ggMHgxMDAxNDQ0NAotCi1zdHJ1Y3QgYWRteF9zZWNfcHJpbWFyeV9taWNfY2ggewotCXVpbnQxNl90IHZlcnNpb247Ci0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JdWludDE2X3Qgc2VjX3ByaW1hcnlfbWljX2NoOwotCXVpbnQxNl90IHJlc2VydmVkMTsKLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IGFkbV9zZXRfc2VjX3ByaW1hcnlfY2hfcGFyYW1zIHsKLQlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1IHBhcmFtczsKLQlzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUgZGF0YTsKLQlzdHJ1Y3QgYWRteF9zZWNfcHJpbWFyeV9taWNfY2ggc2VjX3ByaW1hcnlfbWljX2NoX2RhdGE7Ci19IF9fcGFja2VkOwotI2VuZGlmIC8qX0FQUl9BVURJT19WMl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8uaCBiL2luY2x1ZGUvc291bmQvYXByX2F1ZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWZmNTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9hcHJfYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MzEgKzAsMCBAQAotLyoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMywgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9BUFJfQVVESU9fSF8KLSNkZWZpbmUgX0FQUl9BVURJT19IXwotCi0vKiBBU00gb3Bjb2RlcyB3aXRob3V0IEFQUiBwYXlsb2FkcyovCi0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLQotLyoKLSAqIEF1ZGlvIEZyb250IEVuZCAoQUZFKQotICovCi0KLS8qIFBvcnQgSUQuIFVwZGF0ZSBhZmVfZ2V0X3BvcnRfaW5kZXggd2hlbiBhIG5ldyBwb3J0IGlzIGFkZGVkIGhlcmUuICovCi0jZGVmaW5lIFBSSU1BUllfSTJTX1JYIDAJCS8qIGluZGV4ID0gMCAqLwotI2RlZmluZSBQUklNQVJZX0kyU19UWCAxCQkvKiBpbmRleCA9IDEgKi8KLSNkZWZpbmUgUENNX1JYIDIJCQkvKiBpbmRleCA9IDIgKi8KLSNkZWZpbmUgUENNX1RYIDMJCQkvKiBpbmRleCA9IDMgKi8KLSNkZWZpbmUgU0VDT05EQVJZX0kyU19SWCA0CQkvKiBpbmRleCA9IDQgKi8KLSNkZWZpbmUgU0VDT05EQVJZX0kyU19UWCA1CQkvKiBpbmRleCA9IDUgKi8KLSNkZWZpbmUgTUkyU19SWCA2CQkJLyogaW5kZXggPSA2ICovCi0jZGVmaW5lIE1JMlNfVFggNwkJCS8qIGluZGV4ID0gNyAqLwotI2RlZmluZSBIRE1JX1JYIDgJCQkvKiBpbmRleCA9IDggKi8KLSNkZWZpbmUgUlNWRF8yIDkJCQkvKiBpbmRleCA9IDkgKi8KLSNkZWZpbmUgUlNWRF8zIDEwCQkJLyogaW5kZXggPSAxMCAqLwotI2RlZmluZSBESUdJX01JQ19UWCAxMQkJCS8qIGluZGV4ID0gMTEgKi8KLSNkZWZpbmUgVk9JQ0VfUkVDT1JEX1JYIDB4ODAwMwkJLyogaW5kZXggPSAxMiAqLwotI2RlZmluZSBWT0lDRV9SRUNPUkRfVFggMHg4MDA0CQkvKiBpbmRleCA9IDEzICovCi0jZGVmaW5lIFZPSUNFX1BMQVlCQUNLX1RYIDB4ODAwNQkvKiBpbmRleCA9IDE0ICovCi0KLS8qIFNsaW1idXMgTXVsdGkgY2hhbm5lbCBwb3J0IGlkIHBvb2wgICovCi0jZGVmaW5lIFNMSU1CVVNfMF9SWAkJMHg0MDAwCQkvKiBpbmRleCA9IDE1ICovCi0jZGVmaW5lIFNMSU1CVVNfMF9UWAkJMHg0MDAxCQkvKiBpbmRleCA9IDE2ICovCi0jZGVmaW5lIFNMSU1CVVNfMV9SWAkJMHg0MDAyCQkvKiBpbmRleCA9IDE3ICovCi0jZGVmaW5lIFNMSU1CVVNfMV9UWAkJMHg0MDAzCQkvKiBpbmRleCA9IDE4ICovCi0jZGVmaW5lIFNMSU1CVVNfMl9SWAkJMHg0MDA0Ci0jZGVmaW5lIFNMSU1CVVNfMl9UWAkJMHg0MDA1Ci0jZGVmaW5lIFNMSU1CVVNfM19SWAkJMHg0MDA2Ci0jZGVmaW5lIFNMSU1CVVNfM19UWAkJMHg0MDA3Ci0jZGVmaW5lIFNMSU1CVVNfNF9SWAkJMHg0MDA4Ci0jZGVmaW5lIFNMSU1CVVNfNF9UWAkJMHg0MDA5CQkvKiBpbmRleCA9IDI0ICovCi0KLSNkZWZpbmUgSU5UX0JUX1NDT19SWCAweDMwMDAJCS8qIGluZGV4ID0gMjUgKi8KLSNkZWZpbmUgSU5UX0JUX1NDT19UWCAweDMwMDEJCS8qIGluZGV4ID0gMjYgKi8KLSNkZWZpbmUgSU5UX0JUX0EyRFBfUlggMHgzMDAyCQkvKiBpbmRleCA9IDI3ICovCi0jZGVmaW5lIElOVF9GTV9SWCAweDMwMDQJCS8qIGluZGV4ID0gMjggKi8KLSNkZWZpbmUgSU5UX0ZNX1RYIDB4MzAwNQkJLyogaW5kZXggPSAyOSAqLwotI2RlZmluZSBSVF9QUk9YWV9QT1JUXzAwMV9SWAkweDIwMDAgICAgLyogaW5kZXggPSAzMCAqLwotI2RlZmluZSBSVF9QUk9YWV9QT1JUXzAwMV9UWAkweDIwMDEgICAgLyogaW5kZXggPSAzMSAqLwotI2RlZmluZSBTRUNPTkRBUllfUENNX1JYIDEyCQkJLyogaW5kZXggPSAzMiAqLwotI2RlZmluZSBTRUNPTkRBUllfUENNX1RYIDEzCQkJLyogaW5kZXggPSAzMyAqLwotI2RlZmluZSBQU0VVRE9QT1JUXzAxICAgICAgICAgICAweDgwMDEgICAgLyogaW5kZXggPTM0ICovCi0KLSNkZWZpbmUgQUZFX1BPUlRfSU5WQUxJRCAweEZGRkYKLSNkZWZpbmUgU0xJTUJVU19FWFRQUk9DX1JYIEFGRV9QT1JUX0lOVkFMSUQKLQotI2RlZmluZSBBRkVfUE9SVF9DTURfU1RBUlQgMHgwMDAxMDBjYQotCi0jZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfU1RBUlQgMAotI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX1NUT1AgMQotI2RlZmluZSBBRkVfRVZFTlRfUlRQT1JUX0xPV19XTSAyCi0jZGVmaW5lIEFGRV9FVkVOVF9SVFBPUlRfSElfV00gMwotCi1zdHJ1Y3QgYWZlX3BvcnRfc3RhcnRfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiBwb3J0X2lkOwotCXUxNiBnYWluOwkJLyogUTEzICovCi0JdTMyIHNhbXBsZV9yYXRlOwkvKiA4ICwgMTYsIDQ4a2h6ICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QT1JUX0NNRF9TVE9QIDB4MDAwMTAwY2IKLXN0cnVjdCBhZmVfcG9ydF9zdG9wX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QT1JUX0NNRF9BUFBMWV9HQUlOIDB4MDAwMTAwY2MKLXN0cnVjdCBhZmVfcG9ydF9nYWluX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1MTYJZ2FpbjsvKiBRMTMgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQ01EX1NJREVUT05FX0NUTCAweDAwMDEwMGNkCi1zdHJ1Y3QgYWZlX3BvcnRfc2lkZXRvbmVfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiByeF9wb3J0X2lkOwkJLyogUHJpbWFyeSBpMnMgdHggPSAxICovCi0JCQkJLyogUENNIHR4ID0gMyAqLwotCQkJCS8qIFNlY29uZGFyeSBpMnMgdHggPSA1ICovCi0JCQkJLyogTWkycyB0eCA9IDcgKi8KLQkJCQkvKiBEaWdpdGFsIG1pYyB0eCA9IDExICovCi0JdTE2IHR4X3BvcnRfaWQ7CQkvKiBQcmltYXJ5IGkycyByeCA9IDAgKi8KLQkJCQkvKiBQQ00gcnggPSAyICovCi0JCQkJLyogU2Vjb25kYXJ5IGkycyByeCA9IDQgKi8KLQkJCQkvKiBNaTJTIHJ4ID0gNiAqLwotCQkJCS8qIEhETUkgcnggPSA4ICovCi0JdTE2IGdhaW47CQkvKiBRMTMgKi8KLQl1MTYgZW5hYmxlOwkJLyogMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQ01EX0xPT1BCQUNLIDB4MDAwMTAwY2UKLXN0cnVjdCBhZmVfbG9vcGJhY2tfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiB0eF9wb3J0X2lkOwkJLyogUHJpbWFyeSBpMnMgcnggPSAwICovCi0JCQkJLyogUENNIHJ4ID0gMiAqLwotCQkJCS8qIFNlY29uZGFyeSBpMnMgcnggPSA0ICovCi0JCQkJLyogTWkyUyByeCA9IDYgKi8KLQkJCQkvKiBIRE1JIHJ4ID0gOCAqLwotCXUxNiByeF9wb3J0X2lkOwkJLyogUHJpbWFyeSBpMnMgdHggPSAxICovCi0JCQkJLyogUENNIHR4ID0gMyAqLwotCQkJCS8qIFNlY29uZGFyeSBpMnMgdHggPSA1ICovCi0JCQkJLyogTWkycyB0eCA9IDcgKi8KLQkJCQkvKiBEaWdpdGFsIG1pYyB0eCA9IDExICovCi0JdTE2IG1vZGU7CQkvKiBEZWZhdWx0IC0xLCBEU1Agd2lsbCBjb252ZXIKLQkJCQkgKiB0aGUgdHggdG8gcnggZm9ybWF0Ci0JCQkJICovCi0JdTE2IGVuYWJsZTsJCS8qIDEgPSBlbmFibGUsIDAgPSBkaXNhYmxlICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QU0VVRE9QT1JUX0NNRF9TVEFSVCAweDAwMDEwMGNmCi1zdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RhcnRfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiBwb3J0X2lkOwkJLyogUHNldWRvIFBvcnQgMSA9IDB4ODAwMCAqLwotCQkJCS8qIFBzZXVkbyBQb3J0IDIgPSAweDgwMDEgKi8KLQkJCQkvKiBQc2V1ZG8gUG9ydCAzID0gMHg4MDAyICovCi0JdTE2IHRpbWluZzsJCS8qIEZUUlQgPSAwICwgQVZUaW1lciA9IDEsICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9QU0VVRE9QT1JUX0NNRF9TVE9QIDB4MDAwMTAwZDAKLXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdG9wX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsJCS8qIFBzZXVkbyBQb3J0IDEgPSAweDgwMDAgKi8KLQkJCQkvKiBQc2V1ZG8gUG9ydCAyID0gMHg4MDAxICovCi0JCQkJLyogUHNldWRvIFBvcnQgMyA9IDB4ODAwMiAqLwotCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX0NNRF9HRVRfQUNUSVZFX1BPUlRTIDB4MDAwMTAwZDEKLQotCi0jZGVmaW5lIEFGRV9DTURfR0VUX0FDVElWRV9IQU5ETEVTX0ZPUl9QT1JUIDB4MDAwMTAwZDIKLXN0cnVjdCBhZmVfZ2V0X2FjdGl2ZV9oYW5kbGVzX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0vKgotICogT3Bjb2RlIGZvciBBRkUgdG8gc3RhcnQgRFRNRi4KLSAqLwotI2RlZmluZSBBRkVfUE9SVFNfQ01EX0RUTUZfQ1RMCTB4MDAwMTAxMDIKLQotLyoqIERUTUYgcGF5bG9hZC4qLwotc3RydWN0IGFmZV9kdG1mX2dlbmVyYXRpb25fY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCi0JLyoKLQkgKiBEdXJhdGlvbiBvZiB0aGUgRFRNRiB0b25lIGluIG1zLgotCSAqIC0xICAgICAgLT4gY29udGludW91cywKLQkgKiAgMCAgICAgIC0+IGRpc2FibGUKLQkgKi8KLQlpbnQ2NF90ICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2luX21zOwotCi0JLyoKLQkgKiBUaGUgRFRNRiBoaWdoIHRvbmUgZnJlcXVlbmN5LgotCSAqLwotCXVpbnQxNl90ICAgICAgICAgICAgICAgICAgaGlnaF9mcmVxOwotCi0JLyoKLQkgKiBUaGUgRFRNRiBsb3cgdG9uZSBmcmVxdWVuY3kuCi0JICovCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICBsb3dfZnJlcTsKLQotCS8qCi0JICogVGhlIERUTUYgdm9sdW1lIHNldHRpbmcKLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIGdhaW47Ci0KLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgcG9ydHMgdG8gZW5hYmxlL2Rpc2FibGUgb24uCi0JICovCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICBudW1fcG9ydHM7Ci0KLQkvKgotCSAqIFRoZSBEZXN0aW5hdGlvbiBwb3J0cyAtIGFycmF5ICAuCi0JICogRm9yIERUTUYgb24gbXVsdGlwbGUgcG9ydHMsIHBvcnRJZHMgbmVlZHMgdG8KLQkgKiBiZSBwb3B1bGF0ZWQgbnVtUG9ydHMgdGltZXMuCi0JICovCi0JdWludDE2X3QgICAgICAgICAgICAgICAgICBwb3J0X2lkczsKLQotCS8qCi0JICogdmFyaWFibGUgZm9yIDMyIGJpdCBhbGlnbm1lbnQgb2YgQVBSIHBhY2tldC4KLQkgKi8KLQl1aW50MTZfdCAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfUENNX0NGR19NT0RFX1BDTQkJCTB4MAotI2RlZmluZSBBRkVfUENNX0NGR19NT0RFX0FVWAkJCTB4MQotI2RlZmluZSBBRkVfUENNX0NGR19TWU5DX0VYVAkJCTB4MAotI2RlZmluZSBBRkVfUENNX0NGR19TWU5DX0lOVAkJCTB4MQotI2RlZmluZSBBRkVfUENNX0NGR19GUk1fOEJQRgkJCTB4MAotI2RlZmluZSBBRkVfUENNX0NGR19GUk1fMTZCUEYJCQkweDEKLSNkZWZpbmUgQUZFX1BDTV9DRkdfRlJNXzMyQlBGCQkJMHgyCi0jZGVmaW5lIEFGRV9QQ01fQ0ZHX0ZSTV82NEJQRgkJCTB4MwotI2RlZmluZSBBRkVfUENNX0NGR19GUk1fMTI4QlBGCQkJMHg0Ci0jZGVmaW5lIEFGRV9QQ01fQ0ZHX0ZSTV8yNTZCUEYJCQkweDUKLSNkZWZpbmUgQUZFX1BDTV9DRkdfUVVBTlRfQUxBV19OT1BBRAkJMHgwCi0jZGVmaW5lIEFGRV9QQ01fQ0ZHX1FVQU5UX01VTEFXX05PUEFECQkweDEKLSNkZWZpbmUgQUZFX1BDTV9DRkdfUVVBTlRfTElORUFSX05PUEFECQkweDIKLSNkZWZpbmUgQUZFX1BDTV9DRkdfUVVBTlRfQUxBV19QQUQJCTB4MwotI2RlZmluZSBBRkVfUENNX0NGR19RVUFOVF9NVUxBV19QQUQJCTB4NAotI2RlZmluZSBBRkVfUENNX0NGR19RVUFOVF9MSU5FQVJfUEFECQkweDUKLSNkZWZpbmUgQUZFX1BDTV9DRkdfQ0RBVEFPRV9NQVNURVIJCTB4MAotI2RlZmluZSBBRkVfUENNX0NGR19DREFUQU9FX1NIQVJFCQkweDEKLQotc3RydWN0IGFmZV9wb3J0X3BjbV9jZmcgewotCXUxNgltb2RlOwkvKiBQQ00gKHNob3J0IHN5bmMpID0gMCwgQVVYUENNIChsb25nIHN5bmMpID0gMSAqLwotCXUxNglzeW5jOwkvKiBleHRlcm5hbCA9IDAgLCBpbnRlcm5hbCA9IDEgKi8KLQl1MTYJZnJhbWU7CS8qIDggYnBmID0gMCAqLwotCQkJLyogMTYgYnBmID0gMSAqLwotCQkJLyogMzIgYnBmID0gMiAqLwotCQkJLyogNjQgYnBmID0gMyAqLwotCQkJLyogMTI4IGJwZiA9IDQgKi8KLQkJCS8qIDI1NiBicGYgPSA1ICovCi0JdTE2ICAgICBxdWFudDsKLQl1MTYJc2xvdDsJLyogU2xvdCBmb3IgUENNIHN0cmVhbSAsIDAgLSAzMSAqLwotCXUxNglkYXRhOwkvKiAwLCBQQ00gYmxvY2sgaXMgdGhlIG9ubHkgbWFzdGVyICovCi0JCQkvKiAxLCBQQ00gYmxvY2sgaXMgc2hhcmVzIHRvIGRyaXZlciBkYXRhIG91dCBzaWduYWwgKi8KLQkJCS8qICAgIG90aGVyIG1hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXUxNglyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLWVudW0gewotCUFGRV9JMlNfU0QwID0gMSwKLQlBRkVfSTJTX1NEMSwKLQlBRkVfSTJTX1NEMiwKLQlBRkVfSTJTX1NEMywKLQlBRkVfSTJTX1FVQUQwMSwKLQlBRkVfSTJTX1FVQUQyMywKLQlBRkVfSTJTXzZDSFMsCi0JQUZFX0kyU184Q0hTLAotfTsKLQotI2RlZmluZSBBRkVfTUkyU19NT05PIDAKLSNkZWZpbmUgQUZFX01JMlNfU1RFUkVPIDMKLSNkZWZpbmUgQUZFX01JMlNfNENIQU5ORUxTIDQKLSNkZWZpbmUgQUZFX01JMlNfNkNIQU5ORUxTIDYKLSNkZWZpbmUgQUZFX01JMlNfOENIQU5ORUxTIDgKLQotc3RydWN0IGFmZV9wb3J0X21pMnNfY2ZnIHsKLQl1MTYJYml0d2lkdGg7CS8qIDE2LDI0LDMyICovCi0JdTE2CWxpbmU7CQkvKiBDYWxsZWQgQ2hhbm5lbE1vZGUgaW4gZG9jdW1lbnRhdGlvbiAqLwotCQkJCS8qIGkyc19zZDAgPSAxICovCi0JCQkJLyogaTJzX3NkMSA9IDIgKi8KLQkJCQkvKiBpMnNfc2QyID0gMyAqLwotCQkJCS8qIGkyc19zZDMgPSA0ICovCi0JCQkJLyogaTJzX3F1YWQwMSA9IDUgKi8KLQkJCQkvKiBpMnNfcXVhZDIzID0gNiAqLwotCQkJCS8qIGkyc182Y2hzID0gNyAqLwotCQkJCS8qIGkyc184Y2hzID0gOCAqLwotCXUxNgljaGFubmVsOwkvKiBDYWxsZWQgTW9ub1N0ZXJlbyBpbiBkb2N1bWVudGF0aW9uICovCi0JCQkJLyogaTJzIG1vbm8gPSAwICovCi0JCQkJLyogaTJzIG1vbm8gcmlnaHQgPSAxICovCi0JCQkJLyogaTJzIG1vbm8gbGVmdCA9IDIgKi8KLQkJCQkvKiBpMnMgc3RlcmVvID0gMyAqLwotCXUxNgl3czsJCS8qIDAsIHdvcmQgc2VsZWN0IHNpZ25hbCBmcm9tIGV4dGVybmFsIHNvdXJjZSAqLwotCQkJCS8qIDEsIHdvcmQgc2VsZWN0IHNpZ25hbCBmcm9tIGludGVybmFsIHNvdXJjZSAqLwotCXUxNglmb3JtYXQ7CS8qIGRvbid0IHRvdWNoIHRoaXMgZmllbGQgaWYgaXQgaXMgbm90IGZvciAqLwotCQkJCS8qIEFGRV9QT1JUX0NNRF9JMlNfQ09ORklHIG9wY29kZSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wb3J0X2hkbWlfY2ZnIHsKLQl1MTYJYml0d2lkdGg7CS8qIDE2LDI0LDMyICovCi0JdTE2CWNoYW5uZWxfbW9kZTsJLyogSERNSSBTdGVyZW8gPSAwICovCi0JCQkJLyogSERNSV8zUG9pbnQxICg0LWNoKSA9IDEgKi8KLQkJCQkvKiBIRE1JXzVQb2ludDEgKDYtY2gpID0gMiAqLwotCQkJCS8qIEhETUlfNlBvaW50MSAoOC1jaCkgPSAzICovCi0JdTE2CWRhdGFfdHlwZTsJLyogSERNSV9MaW5lYXIgPSAwICovCi0JCQkJLyogSERNSV9ub25fTGluZWFyID0gMSAqLwotfSBfX3BhY2tlZDsKLQotCi1zdHJ1Y3QgYWZlX3BvcnRfaGRtaV9tdWx0aV9jaF9jZmcgewotCXUxNglkYXRhX3R5cGU7CQkvKiBIRE1JX0xpbmVhciA9IDAgKi8KLQkJCQkJLyogSERNSV9ub25fTGluZWFyID0gMSAqLwotCXUxNgljaGFubmVsX2FsbG9jYXRpb247CS8qIFRoZSBkZWZhdWx0IGlzIDAgKFN0ZXJlbykgKi8KLQl1MTYJcmVzZXJ2ZWQ7CQkvKiBtdXN0IGJlIHNldCB0byAwICovCi19IF9fcGFja2VkOwotCi0KLS8qIFNsaW1idXMgRGV2aWNlIElkcyAqLwotI2RlZmluZSBBRkVfU0xJTUJVU19ERVZJQ0VfMQkJMHgwCi0jZGVmaW5lIEFGRV9TTElNQlVTX0RFVklDRV8yCQkweDEKLSNkZWZpbmUgQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UCTE2Ci0KLXN0cnVjdCBhZmVfcG9ydF9zbGltYnVzX2NmZyB7Ci0JdTE2CXNsaW1idXNfZGV2X2lkOwkJLyogU0xJTUJVUyBEZXZpY2UgaWQuKi8KLQotCXUxNglzbGF2ZV9kZXZfcGdkX2xhOwkvKiBTbGF2ZSBwb3J0ZWQgZ2VuZXJpYyBkZXZpY2UKLQkJCQkJICogbG9naWNhbCBhZGRyZXNzLgotCQkJCQkgKi8KLQl1MTYJc2xhdmVfZGV2X2ludGZkZXZfbGE7CS8qIFNsYXZlIGludGVyZmFjZSBkZXZpY2UgbG9naWNhbAotCQkJCQkgKiBhZGRyZXNzLgotCQkJCQkgKi8KLQl1MTYJYml0X3dpZHRoOwkJLyogYml0IHdpZHRoIG9mIHRoZSBzYW1wbGVzLCAxNiwgMjQuKi8KLQotCXUxNglkYXRhX2Zvcm1hdDsJCS8qIGRhdGEgZm9ybWF0LiovCi0KLQl1MTYJbnVtX2NoYW5uZWxzOwkJLyogTnVtYmVyIG9mIGNoYW5uZWxzLiovCi0KLQkvKiBTbGF2ZSBwb3J0IG1hcHBpbmcgZm9yIHJlc3BlY3RpdmUgY2hhbm5lbHMuKi8KLQl1MTYJc2xhdmVfcG9ydF9tYXBwaW5nW0FGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVF07Ci0KLQl1MTYJcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX3BvcnRfc2xpbWJ1c19zY2hfY2ZnIHsKLQl1MTYJc2xpbWJ1c19kZXZfaWQ7CQkvKiBTTElNQlVTIERldmljZSBpZC4qLwotCXUxNgliaXRfd2lkdGg7CQkvKiBiaXQgd2lkdGggb2YgdGhlIHNhbXBsZXMsIDE2LCAyNC4qLwotCXUxNglkYXRhX2Zvcm1hdDsJCS8qIGRhdGEgZm9ybWF0LiovCi0JdTE2CW51bV9jaGFubmVsczsJCS8qIE51bWJlciBvZiBjaGFubmVscy4qLwotCXUxNglyZXNlcnZlZDsKLQkvKiBTbGF2ZSBjaGFubmVsICBtYXBwaW5nIGZvciByZXNwZWN0aXZlIGNoYW5uZWxzLiovCi0JdTgJc2xhdmVfY2hfbWFwcGluZ1s4XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfcG9ydF9ydHByb3h5X2NmZyB7Ci0JdTE2CWJpdHdpZHRoOwkvKiAxNiwyNCwzMiAqLwotCXUxNglpbnRlcmxlYXZlZDsgICAgLyogaW50ZXJsZWF2ZWQgPSAxICovCi0JCQkJLyogTm9uaW50ZXJsZWF2ZWQgPSAwICovCi0JdTE2CWZyYW1lX3N6OwkvKiA1bXMgYnVmZmVycyA9IDE2MGJ5dGVzICovCi0JdTE2CWppdHRlcjsJCS8qIDEwbXMgb2Ygaml0dGVyID0gMzIwICovCi0JdTE2CWx3X21hcms7CS8qIExvdyB3YXRlcm1hcmsgaW4gYnl0ZXMgZm9yIHRyaWdnZXJpbmcgZXZlbnQqLwotCXUxNglod19tYXJrOwkvKiBIaWdoIHdhdGVybWFyayBieXRlcyBmb3IgdHJpZ2dlcmluZyBldmVudCovCi0JdTE2CXJzdmQ7Ci0JaW50CW51bV9jaDsJCS8qIDEgdG8gOCAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wb3J0X3BzZXVkb19jZmcgewotCXUxNiBiaXRfd2lkdGg7Ci0JdTE2IG51bV9jaGFubmVsczsKLQl1MTYgZGF0YV9mb3JtYXQ7Ci0JdTE2IHRpbWluZ19tb2RlOwotCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQVVESU9fSUZfQ09ORklHIDB4MDAwMTAwZDMKLSNkZWZpbmUgQUZFX1BPUlRfQVVESU9fU0xJTV9TQ0hfQ09ORklHIDB4MDAwMTAwZTQKLSNkZWZpbmUgQUZFX1BPUlRfTVVMVElfQ0hBTl9IRE1JX0FVRElPX0lGX0NPTkZJRwkweDAwMDEwMEQ5Ci0jZGVmaW5lIEFGRV9QT1JUX0NNRF9JMlNfQ09ORklHCTB4MDAwMTAwRTcKLQotdW5pb24gYWZlX3BvcnRfY29uZmlnIHsKLQlzdHJ1Y3QgYWZlX3BvcnRfcGNtX2NmZyAgICAgICAgICAgcGNtOwotCXN0cnVjdCBhZmVfcG9ydF9taTJzX2NmZyAgICAgICAgICBtaTJzOwotCXN0cnVjdCBhZmVfcG9ydF9oZG1pX2NmZyAgICAgICAgICBoZG1pOwotCXN0cnVjdCBhZmVfcG9ydF9oZG1pX211bHRpX2NoX2NmZyBoZG1pX211bHRpX2NoOwotCXN0cnVjdCBhZmVfcG9ydF9zbGltYnVzX2NmZwkgIHNsaW1idXM7Ci0Jc3RydWN0IGFmZV9wb3J0X3NsaW1idXNfc2NoX2NmZwkgIHNsaW1fc2NoOwotCXN0cnVjdCBhZmVfcG9ydF9ydHByb3h5X2NmZyAgICAgICBydHByb3h5OwotCXN0cnVjdCBhZmVfcG9ydF9wc2V1ZG9fY2ZnICAgICAgICBwc2V1ZG87Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1bmlvbiBhZmVfcG9ydF9jb25maWcgcG9ydDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1RFU1RfQ09ERUNfTE9PUEJBQ0tfQ1RMIDB4MDAwMTAwZDUKLXN0cnVjdCBhZmVfY29kZWNfbG9vcGJhY2tfY29tbWFuZCB7Ci0JdTE2CXBvcnRfaW5mOwkvKiBQcmltYXJ5IGkycyA9IDAgKi8KLQkJCQkvKiBQQ00gPSAyICovCi0JCQkJLyogU2Vjb25kYXJ5IGkycyA9IDQgKi8KLQkJCQkvKiBNaTJzID0gNiAqLwotCXUxNgllbmFibGU7CQkvKiAwLCBkaXNhYmxlLiAxLCBlbmFibGUgKi8KLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBBRkVfUEFSQU1fSURfU0lERVRPTkVfR0FJTgkweDAwMDEwMzAwCi1zdHJ1Y3QgYWZlX3BhcmFtX3NpZGV0b25lX2dhaW4gewotCXUxNiBnYWluOwotCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX1NBTVBMSU5HX1JBVEUJMHgwMDAxMDMwMQotc3RydWN0IGFmZV9wYXJhbV9zYW1wbGluZ19yYXRlIHsKLQl1MzIgc2FtcGxpbmdfcmF0ZTsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBBRkVfUEFSQU1fSURfQ0hBTk5FTFMJCTB4MDAwMTAzMDIKLXN0cnVjdCBhZmVfcGFyYW1fY2hhbm5lbHMgewotCXUxNiBjaGFubmVsczsKLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQUZFX1BBUkFNX0lEX0xPT1BCQUNLX0dBSU4JMHgwMDAxMDMwMwotc3RydWN0IGFmZV9wYXJhbV9sb29wYmFja19nYWluIHsKLQl1MTYgZ2FpbjsKLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBQYXJhbWV0ZXIgSUQgdXNlZCB0byBjb25maWd1cmUgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSBsb29wYmFjayBwYXRoLiBUaGUKLSAqIGRpZmZlcmVuY2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBleGlzdGluZyBBUEksIEFGRV9QT1JUX0NNRF9MT09QQkFDSywgaXMgdGhhdAotICogaXQgYWxsb3dzIFJ4IHBvcnQgdG8gYmUgY29uZmlndXJlZCBhcyBzb3VyY2UgcG9ydCBpbiBsb29wYmFjayBwYXRoLiBQb3J0LWlkCi0gKiBpbiBBRkVfUE9SVF9DTURfU0VUX1BBUkFNIGNtZCBpcyB0aGUgc291cmNlIHBvcnQgd2hpY2ggY2FuIGJlIFR4IG9yIFJ4IHBvcnQuCi0gKiBJbiBhZGRpdGlvbiwgd2UgY2FuIGNvbmZpZ3VyZSB0aGUgdHlwZSBvZiByb3V0aW5nIG1vZGUgdG8gaGFuZGxlIGRpZmZlcmVudAotICogdXNlIGNhc2VzLgotICovCi1lbnVtIHsKLQkvKiBSZWd1bGFyIGxvb3BiYWNrIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIHBvcnQgKi8KLQlMQl9NT0RFX0RFRkFVTFQgPSAxLAotCS8qIFNpZGV0b25lIGZlZWQgZnJvbSBUeCBzb3VyY2UgdG8gUnggZGVzdGluYXRpb24gcG9ydCAqLwotCUxCX01PREVfU0lERVRPTkUsCi0JLyogRWNobyBjYW5jZWxsZXIgcmVmZXJlbmNlLCB2b2ljZSArIGF1ZGlvICsgRFRNRiAqLwotCUxCX01PREVfRUNfUkVGX1ZPSUNFX0FVRElPLAotCS8qIEVjaG8gY2FuY2VsbGVyIHJlZmVyZW5jZSwgdm9pY2UgYWxvbmUgKi8KLQlMQl9NT0RFX0VDX1JFRl9WT0lDRQotfTsKLQotI2RlZmluZSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfQ09ORklHIDB4MDAwMTAyMEIKLSNkZWZpbmUgQUZFX0FQSV9WRVJTSU9OX0xPT1BCQUNLX0NPTkZJRyAweDEKLXN0cnVjdCBhZmVfcGFyYW1fbG9vcGJhY2tfY2ZnIHsKLQkvKiBNaW5vciB2ZXJzaW9uIHVzZWQgZm9yIHRyYWNraW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25maWd1cmF0aW9uCi0JICogaW50ZXJmYWNlLgotCSAqLwotCXVpbnQzMl90IGxvb3BiYWNrX2NmZ19taW5vcl92ZXJzaW9uOwotCi0JLyogRGVzdGluYXRpb24gUG9ydCBJZC4gKi8KLQl1aW50MTZfdCBkc3RfcG9ydF9pZDsKLQotCS8qIFNwZWNpZmllcyBkYXRhIHBhdGggdHlwZSBmcm9tIHNyYyB0byBkZXN0IHBvcnQuIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogTEJfTU9ERV9ERUZBVUxUCi0JICogTEJfTU9ERV9TSURFVE9ORQotCSAqIExCX01PREVfRUNfUkVGX1ZPSUNFX0FVRElPCi0JICogTEJfTU9ERV9FQ19SRUZfVk9JQ0UKLQkgKi8KLQl1aW50MTZfdCByb3V0aW5nX21vZGU7Ci0KLQkvKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgKDEpIG9yIGRpc2FibGUgKDApIGFuIEFGRSBsb29wYmFjay4gKi8KLQl1aW50MTZfdCBlbmFibGU7Ci0KLQkvKiBSZXNlcnZlZCBmb3IgMzItYml0IGFsaWdubWVudC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byAwLiAqLwotCXVpbnQxNl90IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfTU9EVUxFX0lEX1BPUlRfSU5GTwkJMHgwMDAxMDIwMAotLyogTW9kdWxlIElEIGZvciB0aGUgbG9vcGJhY2stcmVsYXRlZCBwYXJhbWV0ZXJzLiAqLwotI2RlZmluZSBBRkVfTU9EVUxFX0xPT1BCQUNLICAgICAgICAgICAweDAwMDEwMjA1Ci1zdHJ1Y3QgYWZlX3BhcmFtX3BheWxvYWRfYmFzZSB7Ci0JdTMyIG1vZHVsZV9pZDsKLQl1MzIgcGFyYW1faWQ7Ci0JdTE2IHBhcmFtX3NpemU7Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFmZV9wYXJhbV9wYXlsb2FkIHsKLQlzdHJ1Y3QgYWZlX3BhcmFtX3BheWxvYWRfYmFzZSBiYXNlOwotCXVuaW9uIHsKLQkJc3RydWN0IGFmZV9wYXJhbV9zaWRldG9uZV9nYWluIHNpZGV0b25lX2dhaW47Ci0JCXN0cnVjdCBhZmVfcGFyYW1fc2FtcGxpbmdfcmF0ZSBzYW1wbGluZ19yYXRlOwotCQlzdHJ1Y3QgYWZlX3BhcmFtX2NoYW5uZWxzICAgICAgY2hhbm5lbHM7Ci0JCXN0cnVjdCBhZmVfcGFyYW1fbG9vcGJhY2tfZ2FpbiBsb29wYmFja19nYWluOwotCQlzdHJ1Y3QgYWZlX3BhcmFtX2xvb3BiYWNrX2NmZyBsb29wYmFja19jZmc7Ci0JfSBfX3BhY2tlZCBwYXJhbTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1BPUlRfQ01EX1NFVF9QQVJBTQkJMHgwMDAxMDBkYwotCi1zdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiBwb3J0X2lkOwotCXUxNiBwYXlsb2FkX3NpemU7Ci0JdTMyIHBheWxvYWRfYWRkcmVzczsKLQlzdHJ1Y3QgYWZlX3BhcmFtX3BheWxvYWQgcGF5bG9hZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX25vX3BheWxvYWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1MTYgcGF5bG9hZF9zaXplOwotCXUzMiBwYXlsb2FkX2FkZHJlc3M7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9FVkVOVF9HRVRfQUNUSVZFX1BPUlRTIDB4MDAwMTAxMDAKLXN0cnVjdCBhZmVfZ2V0X2FjdGl2ZV9wb3J0c19yc3AgewotCXUxNgludW1fcG9ydHM7Ci0JdTE2CXBvcnRfaWQ7Ci19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQUZFX0VWRU5UX0dFVF9BQ1RJVkVfSEFORExFUyAweDAwMDEwMTAyCi1zdHJ1Y3QgYWZlX2dldF9hY3RpdmVfaGFuZGxlc19yc3AgewotCXUxNglwb3J0X2lkOwotCXUxNgludW1faGFuZGxlczsKLQl1MTYJbW9kZTsJCS8qIDAsIHZvaWNlIHJ4ICovCi0JCQkJLyogMSwgdm9pY2UgdHggKi8KLQkJCQkvKiAyLCBhdWRpbyByeCAqLwotCQkJCS8qIDMsIGF1ZGlvIHR4ICovCi0JdTE2CWhhbmRsZTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX01FTU9SWV9NQVAgMHgwMDAxMDBERQotc3RydWN0IGFmZV9jbWRfbWVtb3J5X21hcCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiBwaHlfYWRkcjsKLQl1MzIgbWVtX3N6OwotCXUxNiBtZW1faWQ7Ci0JdTE2IHJzdmQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9NRU1PUllfVU5NQVAgMHgwMDAxMDBERgotc3RydWN0IGFmZV9jbWRfbWVtb3J5X3VubWFwIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyIHBoeV9hZGRyOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfU0VSVklDRV9DTURfUkVHX1JUUE9SVCAweDAwMDEwMEUwCi1zdHJ1Y3QgYWZlX2NtZF9yZWdfcnRwb3J0IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2IHBvcnRfaWQ7Ci0JdTE2IHJzdmQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9VTlJFR19SVFBPUlQgMHgwMDAxMDBFMQotc3RydWN0IGFmZV9jbWRfdW5yZWdfcnRwb3J0IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2IHBvcnRfaWQ7Ci0JdTE2IHJzdmQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFGRV9TRVJWSUNFX0NNRF9SVFBPUlRfV1IgMHgwMDAxMDBFMgotc3RydWN0IGFmZV9jbWRfcnRwb3J0X3dyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2IHBvcnRfaWQ7Ci0JdTE2IHJzdmQ7Ci0JdTMyIGJ1Zl9hZGRyOwotCXUzMiBieXRlc19hdmFpbDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQUZFX1NFUlZJQ0VfQ01EX1JUUE9SVF9SRCAweDAwMDEwMEUzCi1zdHJ1Y3QgYWZlX2NtZF9ydHBvcnRfcmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgcG9ydF9pZDsKLQl1MTYgcnN2ZDsKLQl1MzIgYnVmX2FkZHI7Ci0JdTMyIGJ5dGVzX2F2YWlsOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRkVfRVZFTlRfUlRfUFJPWFlfUE9SVF9TVEFUVVMgMHgwMDAxMDEwNQotCi0jZGVmaW5lIEFETV9NQVhfQ09QUFMgNQotCi0jZGVmaW5lIEFETV9TRVJWSUNFX0NNRF9HRVRfQ09QUF9IQU5ETEVTICAgICAgICAgICAgICAgICAweDAwMDEwMzAwCi1zdHJ1Y3QgYWRtX2dldF9jb3BwX2hhbmRsZXNfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRE1fQ01EX01BVFJJWF9NQVBfUk9VVElOR1MgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwMQotc3RydWN0IGFkbV9yb3V0aW5nc19zZXNzaW9uIHsKLQl1MTYgaWQ7Ci0JdTE2IG51bV9jb3BwczsKLQl1MTYgY29wcF9pZFtBRE1fTUFYX0NPUFBTKzFdOyAvKlBhZGRpbmcgaWYgbnVtQ29wcHMgaXMgb2RkICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWRtX3JvdXRpbmdzX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgcGF0aDsgLyogMCA9IFJ4LCAxIFR4ICovCi0JdTMyIG51bV9zZXNzaW9uczsKLQlzdHJ1Y3QgYWRtX3JvdXRpbmdzX3Nlc3Npb24gc2Vzc2lvbls4XTsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBBRE1fQ01EX01BVFJJWF9SQU1QX0dBSU5TICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDMwMgotc3RydWN0IGFkbV9yYW1wX2dhaW4gewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgc2Vzc2lvbl9pZDsKLQl1MTYgY29wcF9pZDsKLQl1MTYgaW5pdGlhbF9nYWluOwotCXUxNiBnYWluX2luY3JlbWVudDsKLQl1MTYgcmFtcF9kdXJhdGlvbjsKLQl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWRtX3JhbXBfZ2FpbnNfY29tbWFuZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiBpZDsKLQl1MzIgbnVtX2dhaW5zOwotCXN0cnVjdCBhZG1fcmFtcF9nYWluIGdhaW5zW0FETV9NQVhfQ09QUFNdOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFETV9DTURfQ09QUF9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzA0Ci1zdHJ1Y3QgYWRtX2NvcHBfb3Blbl9jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2IGZsYWdzOwotCXUxNiBtb2RlOyAvKiAxLVJYLCAyLUxpdmUgVFgsIDMtTm9uIExpdmUgVFggKi8KLQl1MTYgZW5kcG9pbnRfaWQxOwotCXUxNiBlbmRwb2ludF9pZDI7Ci0JdTMyIHRvcG9sb2d5X2lkOwotCXUxNiBjaGFubmVsX2NvbmZpZzsKLQl1MTYgcmVzZXJ2ZWQ7Ci0JdTMyIHJhdGU7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFETV9DTURfQ09QUF9DTE9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzA1Ci0KLSNkZWZpbmUgQURNX0NNRF9NVUxUSV9DSEFOTkVMX0NPUFBfT1BFTiAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMTAKLSNkZWZpbmUgQURNX0NNRF9NVUxUSV9DSEFOTkVMX0NPUFBfT1BFTl9WMyAgICAgICAgICAgICAgIDB4MDAwMTAzMzMKLXN0cnVjdCBhZG1fbXVsdGlfY2hfY29wcF9vcGVuX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgZmxhZ3M7Ci0JdTE2IG1vZGU7IC8qIDEtUlgsIDItTGl2ZSBUWCwgMy1Ob24gTGl2ZSBUWCAqLwotCXUxNiBlbmRwb2ludF9pZDE7Ci0JdTE2IGVuZHBvaW50X2lkMjsKLQl1MzIgdG9wb2xvZ3lfaWQ7Ci0JdTE2IGNoYW5uZWxfY29uZmlnOwotCXUxNiByZXNlcnZlZDsKLQl1MzIgcmF0ZTsKLQl1OCBkZXZfY2hhbm5lbF9tYXBwaW5nWzhdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFkbV9tdWx0aV9jaGFubmVsX2NvcHBfb3Blbl92MyB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiBmbGFnczsKLQl1MTYgbW9kZTsKLQl1MTYgZW5kcG9pbnRfaWQxOwotCXUxNiBlbmRwb2ludF9pZDI7Ci0JdTMyIHRvcG9sb2d5X2lkOwotCXUxNiBjaGFubmVsX2NvbmZpZzsKLQl1MTYgYml0X3dpZHRoOwotCXUzMiByYXRlOwotCXU4ICBkZXZfY2hhbm5lbF9tYXBwaW5nWzhdOwotfTsKLQotI2RlZmluZSBBRE1fQ01EX01FTU9SWV9NQVAJCQkJMHgwMDAxMEMzMAotc3RydWN0IGFkbV9jbWRfbWVtb3J5X21hcCB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXUzMgkJYnVmX2FkZDsKLQl1MzIJCWJ1Zl9zaXplOwotCXUxNgkJbWVtcG9vbF9pZDsKLQl1MTYJCXJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRE1fQ01EX01FTU9SWV9VTk1BUAkJCQkweDAwMDEwQzMxCi1zdHJ1Y3QgYWRtX2NtZF9tZW1vcnlfdW5tYXAgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MzIJCWJ1Zl9hZGQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFETV9DTURfTUVNT1JZX01BUF9SRUdJT05TCQkJMHgwMDAxMEM0Nwotc3RydWN0IGFkbV9tZW1vcnlfbWFwX3JlZ2lvbnMgewotCXUzMgkJcGh5czsKLQl1MzIJCWJ1Zl9zaXplOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFkbV9jbWRfbWVtb3J5X21hcF9yZWdpb25zIHsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0JdTE2CQltZW1wb29sX2lkOwotCXUxNgkJbnJlZ2lvbnM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFETV9DTURfTUVNT1JZX1VOTUFQX1JFR0lPTlMJCQkweDAwMDEwQzQ4Ci1zdHJ1Y3QgYWRtX21lbW9yeV91bm1hcF9yZWdpb25zIHsKLQl1MzIJCXBoeXM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYWRtX2NtZF9tZW1vcnlfdW5tYXBfcmVnaW9ucyB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXUxNgkJbnJlZ2lvbnM7Ci0JdTE2CQlyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgREVGQVVMVF9DT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBiZTMKLSNkZWZpbmUgREVGQVVMVF9QT1BQX1RPUE9MT0dZCQkJCTB4MDAwMTBiZTQKLSNkZWZpbmUgVlBNX1RYX1NNX0VDTlNfVjJfQ09QUF9UT1BPTE9HWQkJCTB4MDAwMTBGODkKLSNkZWZpbmUgVlBNX1RYX0RNX0ZMVUVOQ0VfQ09QUF9UT1BPTE9HWQkJCTB4MDAwMTBGNzIKLSNkZWZpbmUgVlBNX1RYX1FNSUNfRkxVRU5DRV9DT1BQX1RPUE9MT0dZCQkweDAwMDEwRjc1Ci0KLSNkZWZpbmUgTE9XTEFURU5DWV9QT1BQX1RPUE9MT0dZCQkJMHgwMDAxMEM2OAotI2RlZmluZSBMT1dMQVRFTkNZX0NPUFBfVE9QT0xPR1kJCQkweDAwMDEwMzEyCi0jZGVmaW5lIFBDTV9CSVRTX1BFUl9TQU1QTEUJCQkJMTYKLQotI2RlZmluZSBBU01fT1BFTl9XUklURV9QRVJGX01PREVfQklUCQkJKDE8PDI4KQotI2RlZmluZSBBU01fT1BFTl9SRUFEX1BFUkZfTU9ERV9CSVQJCQkoMTw8MjkpCi0jZGVmaW5lIEFETV9NVUxUSV9DSF9DT1BQX09QRU5fUEVSRl9NT0RFX0JJVAkJKDE8PDEzKQotCi0KLSNkZWZpbmUgQVNNX01BWF9FUV9CQU5EUyAxMgotCi1zdHJ1Y3QgYXNtX2VxX2JhbmQgewotCXUzMiBiYW5kX2lkeDsgLyogVGhlIGJhbmQgaW5kZXgsIDAgLi4gMTEgKi8KLQl1MzIgZmlsdGVyX3R5cGU7IC8qIEZpbHRlciBiYW5kIHR5cGUgKi8KLQl1MzIgY2VudGVyX2ZyZXFfaHo7IC8qIEZpbHRlciBiYW5kIGNlbnRlciBmcmVxdWVuY3kgKi8KLQl1MzIgZmlsdGVyX2dhaW47IC8qIEZpbHRlciBiYW5kIGluaXRpYWwgZ2FpbiAoZEIpICovCi0JCQkvKiBSYW5nZSBpcyArMTIgZEIgdG8gLTEyIGRCIHdpdGggMWRCIGluY3JlbWVudHMuICovCi0JdTMyIHFfZmFjdG9yOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9lcXVhbGl6ZXJfcGFyYW1zIHsKLQl1MzIgZW5hYmxlOwotCXUzMiBudW1fYmFuZHM7Ci0Jc3RydWN0IGFzbV9lcV9iYW5kIGVxX2JhbmRzW0FTTV9NQVhfRVFfQkFORFNdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9tYXN0ZXJfZ2Fpbl9wYXJhbXMgewotCXUxNiBtYXN0ZXJfZ2FpbjsKLQl1MTYgcGFkZGluZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fbHJjaGFubmVsX2dhaW5fcGFyYW1zIHsKLQl1MTYgbGVmdF9nYWluOwotCXUxNiByaWdodF9nYWluOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9tdXRlX3BhcmFtcyB7Ci0JdTMyIG11dGVmbGFnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyB7Ci0JdTMyIHBlcmlvZDsKLQl1MzIgc3RlcDsKLQl1MzIgcmFtcGluZ2N1cnZlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zb2Z0cGF1c2VfcGFyYW1zIHsKLQl1MzIgZW5hYmxlOwotCXUzMiBwZXJpb2Q7Ci0JdTMyIHN0ZXA7Ci0JdTMyIHJhbXBpbmdjdXJ2ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fcHBfcGFyYW1fZGF0YV9oZHIgewotCXUzMiBtb2R1bGVfaWQ7Ci0JdTMyIHBhcmFtX2lkOwotCXUxNiBwYXJhbV9zaXplOwotCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fcHBfcGFyYW1zX2NvbW1hbmQgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MzIgICAgKnBheWxvYWQ7Ci0JdTMyCXBheWxvYWRfc2l6ZTsKLQlzdHJ1Y3QgIGFzbV9wcF9wYXJhbV9kYXRhX2hkciBwYXJhbXM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEVRVUFMSVpFUl9NT0RVTEVfSUQJCTB4MDAwMTBjMjcKLSNkZWZpbmUgRVFVQUxJWkVSX1BBUkFNX0lECQkweDAwMDEwYzI4Ci0KLSNkZWZpbmUgVk9MVU1FX0NPTlRST0xfTU9EVUxFX0lECTB4MDAwMTBiZmUKLSNkZWZpbmUgTUFTVEVSX0dBSU5fUEFSQU1fSUQJCTB4MDAwMTBiZmYKLSNkZWZpbmUgTF9SX0NIQU5ORUxfR0FJTl9QQVJBTV9JRAkweDAwMDEwYzAwCi0jZGVmaW5lIE1VVEVfQ09ORklHX1BBUkFNX0lEIDB4MDAwMTBjMDEKLSNkZWZpbmUgU09GVF9QQVVTRV9QQVJBTV9JRCAweDAwMDEwRDZBCi0jZGVmaW5lIFNPRlRfVk9MVU1FX1BBUkFNX0lEIDB4MDAwMTBDMjkKLQotI2RlZmluZSBJSVJfRklMVEVSX0VOQUJMRV9QQVJBTV9JRCAweDAwMDEwYzAzCi0jZGVmaW5lIElJUl9GSUxURVJfUFJFR0FJTl9QQVJBTV9JRCAweDAwMDEwYzA0Ci0jZGVmaW5lIElJUl9GSUxURVJfQ09ORklHX1BBUkFNX0lEIDB4MDAwMTBjMDUKLQotI2RlZmluZSBNQkFEUkNfTU9EVUxFX0lEIDB4MDAwMTBjMDYKLSNkZWZpbmUgTUJBRFJDX0VOQUJMRV9QQVJBTV9JRCAweDAwMDEwYzA3Ci0jZGVmaW5lIE1CQURSQ19DT05GSUdfUEFSQU1fSUQgMHgwMDAxMGMwOAotCi0KLSNkZWZpbmUgQURNX0NNRF9TRVRfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMDYKLSNkZWZpbmUgQURNX0NNRF9HRVRfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMEIKLSNkZWZpbmUgQURNX0NNRFJTUF9HRVRfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMEMKLXN0cnVjdCBhZG1fc2V0X3BhcmFtc19jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkcgkJaGRyOwotCXUzMgkJCXBheWxvYWQ7Ci0JdTMyCQkJcGF5bG9hZF9zaXplOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFETV9DTURfVEFQX0NPUFBfUENNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMzA3Ci1zdHJ1Y3QgYWRtX3RhcF9jb3BwX3BjbV9jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci19IF9fcGFja2VkOwotCi0KLS8qIFFEU1A2IHRvIENsaWVudCBtZXNzYWdlcyAqLwotI2RlZmluZSBBRE1fU0VSVklDRV9DTURSU1BfR0VUX0NPUFBfSEFORExFUyAgICAgICAgICAgICAgMHgwMDAxMDMwOAotc3RydWN0IGFkbV9nZXRfY29wcF9oYW5kbGVzX3Jlc3BvbmQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgaGFuZGxlczsKLQl1MzIgY29wcF9pZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQURNX0NNRFJTUF9DT1BQX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAzMEEKLXN0cnVjdCBhZG1fY29wcF9vcGVuX3Jlc3BvbmQgewotCXUzMiBzdGF0dXM7Ci0JdTE2IGNvcHBfaWQ7Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRE1fQ01EUlNQX01VTFRJX0NIQU5ORUxfQ09QUF9PUEVOICAgICAgICAgICAgICAgMHgwMDAxMDMxMQotI2RlZmluZSBBRE1fQ01EUlNQX01VTFRJX0NIQU5ORUxfQ09QUF9PUEVOX1YzICAgICAgICAgICAgMHgwMDAxMDMzNAotCi0KLSNkZWZpbmUgQVNNX1NUUkVBTV9QUklPUklUWV9OT1JNQUwJMAotI2RlZmluZSBBU01fU1RSRUFNX1BSSU9SSVRZX0xPVwkJMQotI2RlZmluZSBBU01fU1RSRUFNX1BSSU9SSVRZX0hJR0gJMgotI2RlZmluZSBBU01fU1RSRUFNX1BSSU9SSVRZX1JFU0VSVkVECTMKLQotI2RlZmluZSBBU01fRU5EX1BPSU5UX0RFVklDRV9NQVRSSVgJMAotI2RlZmluZSBBU01fRU5EX1BPSU5UX1NUUkVBTQkJMQotCi0jZGVmaW5lIEFBQ19FTkNfTU9ERV9BQUNfTEMgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFBQ19FTkNfTU9ERV9BQUNfUCAgICAgICAgICAgICAweDA1Ci0jZGVmaW5lIEFBQ19FTkNfTU9ERV9FQUFDX1AgICAgICAgICAgICAweDFECi0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfQ0xPU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCQ0QKLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfRkxVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCQ0UKLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCQ0YKLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfR0VUX1BQX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDAKLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURSU1BfR0VUX1BQX1BBUkFNUyAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDEKLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDMKLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX0dFVF9TRVNTSU9OX1RJTUUgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDQKLSNkZWZpbmUgQVNNX0RBVEFfQ01EX0VPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCREIKLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCREQKLQotI2RlZmluZSBBU01fU0VSVklDRV9DTURfR0VUX1NUUkVBTV9IQU5ETEVTICAgICAgICAgICAgICAgMHgwMDAxMEMwQgotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9GTFVTSF9SRUFEQlVGUyAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMwOQotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0VWRU5UX1JYX1VOREVSRkxPVwkJCSAweDAwMDEwQzE3Ci0jZGVmaW5lIEFTTV9TRVNTSU9OX0VWRU5UX1RYX09WRVJGTE9XCQkJIDB4MDAwMTBDMTgKLSNkZWZpbmUgQVNNX1NFUlZJQ0VfQ01EX0dFVF9XQUxMQ0xPQ0tfVElNRSAgICAgICAgICAgICAgIDB4MDAwMTBDMTkKLSNkZWZpbmUgQVNNX0RBVEFfQ01EUlNQX0VPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBDMUMKLQotLyogQVNNIERhdGEgc3RydWN0dXJlcyAqLwotCi0vKiBjb21tb24gZGVjbGFyYXRpb25zICovCi1zdHJ1Y3QgYXNtX3BjbV9jZmcgewotCXUxNiBjaF9jZmc7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTE2IGlzX3NpZ25lZDsKLQl1MTYgaW50ZXJsZWF2ZWQ7Ci19OwotCi0jZGVmaW5lIFBDTV9DSEFOTkVMX05VTEwgMAotCi0vKiBGcm9udCBsZWZ0IGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0ZMICAgIDEKLQotLyogRnJvbnQgcmlnaHQgY2hhbm5lbC4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfRlIgICAgMgotCi0vKiBGcm9udCBjZW50ZXIgY2hhbm5lbC4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfRkMgICAgMwotCi0vKiBMZWZ0IHN1cnJvdW5kIGNoYW5uZWwuKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfTFMgICA0Ci0KLS8qIFJpZ2h0IHN1cnJvdW5kIGNoYW5uZWwuKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfUlMgICA1Ci0KLS8qIExvdyBmcmVxdWVuY3kgZWZmZWN0IGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0xGRSAgNgotCi0vKiBDZW50ZXIgc3Vycm91bmQgY2hhbm5lbDsgUmVhciBjZW50ZXIgY2hhbm5lbC4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfQ1MgICA3Ci0KLS8qIExlZnQgYmFjayBjaGFubmVsOyBSZWFyIGxlZnQgY2hhbm5lbC4gKi8KLSNkZWZpbmUgUENNX0NIQU5ORUxfTEIgICA4Ci0KLS8qIFJpZ2h0IGJhY2sgY2hhbm5lbDsgUmVhciByaWdodCBjaGFubmVsLiAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTF9SQiAgIDkKLQotLyogVG9wIHN1cnJvdW5kIGNoYW5uZWwuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX1RTICAgMTAKLQotLyogQ2VudGVyIHZlcnRpY2FsIGhlaWdodCBjaGFubmVsLiovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0NWSCAgMTEKLQotLyogTW9ubyBzdXJyb3VuZCBjaGFubmVsLiovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX01TICAgMTIKLQotLyogRnJvbnQgbGVmdCBvZiBjZW50ZXIuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX0ZMQyAgMTMKLQotLyogRnJvbnQgcmlnaHQgb2YgY2VudGVyLiAqLwotI2RlZmluZSBQQ01fQ0hBTk5FTF9GUkMgIDE0Ci0KLS8qIFJlYXIgbGVmdCBvZiBjZW50ZXIuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX1JMQyAgMTUKLQotLyogUmVhciByaWdodCBvZiBjZW50ZXIuICovCi0jZGVmaW5lIFBDTV9DSEFOTkVMX1JSQyAgMTYKLQotI2RlZmluZSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCAgOAotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQKLSAqIGluIEFTTV9FTkNERUNfREVDX0NIQU5fTUFQIGNvbW1hbmQKLSAqLwotI2RlZmluZSBNQVhfQ0hBTl9NQVBfQ0hBTk5FTFMgMTYKLS8qCi0gKiAgTXVsdGlwbGUtY2hhbm5lbCBQQ00gZGVjb2RlciBmb3JtYXQgYmxvY2sgc3RydWN0dXJlIHVzZWQgaW4gdGhlCi0gKiAgI0FTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEUgY29tbWFuZC4KLSAqICBUaGUgZGF0YSBtdXN0IGJlIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotICovCi1zdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGsgewotCi0JdTE2IG51bV9jaGFubmVsczsJLyoKLQkJCQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMuCi0JCQkJICogU3VwcG9ydGVkIHZhbHVlczoxIHRvIDgKLQkJCQkgKi8KLQotCXUxNiBiaXRzX3Blcl9zYW1wbGU7CS8qCi0JCQkJICogTnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZSBwZXIgY2hhbm5lbC4KLQkJCQkgKiBTdXBwb3J0ZWQgdmFsdWVzOiAxNiwgMjQgV2hlbiB1c2VkIGZvcgotCQkJCSAqIHBsYXliYWNrLCB0aGUgY2xpZW50IG11c3Qgc2VuZCAyNC1iaXQKLQkJCQkgKiBzYW1wbGVzIHBhY2tlZCBpbiAzMi1iaXQgd29yZHMuIFRoZQotCQkJCSAqIDI0LWJpdCBzYW1wbGVzIG11c3QgYmUgcGxhY2VkIGluIHRoZSBtb3N0Ci0JCQkJICogc2lnbmlmaWNhbnQgMjQgYml0cyBvZiB0aGUgMzItYml0IHdvcmQuIFdoZW4KLQkJCQkgKiB1c2VkIGZvciByZWNvcmRpbmcsIHRoZSBhRFNQIHNlbmRzIDI0LWJpdAotCQkJCSAqIHNhbXBsZXMgcGFja2VkIGluIDMyLWJpdCB3b3Jkcy4gVGhlIDI0LWJpdAotCQkJCSAqIHNhbXBsZXMgYXJlIHBsYWNlZCBpbiB0aGUgbW9zdCBzaWduaWZpY2FudAotCQkJCSAqIDI0IGJpdHMgb2YgdGhlIDMyLWJpdCB3b3JkLgotCQkJCSAqLwotCi0JdTMyIHNhbXBsZV9yYXRlOwkvKgotCQkJCSAqIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQKLQkJCQkgKiAoaW4gSGVydHopLiBTdXBwb3J0ZWQgdmFsdWVzOgotCQkJCSAqIDIwMDAgdG8gNDgwMDAKLQkJCQkgKi8KLQotCXUxNiBpc19zaWduZWQ7CQkvKgotCQkJCSAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhlIHNhbXBsZXMKLQkJCQkgKiBhcmUgc2lnbmVkICgxKS4KLQkJCQkgKi8KLQotCXUxNiBpc19pbnRlcmxlYXZlZDsJLyoKLQkJCQkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNoYW5uZWxzIGFyZQotCQkJCSAqIGRlLWludGVybGVhdmVkICgwKSBvciBpbnRlcmxlYXZlZCAoMSkuCi0JCQkJICogSW50ZXJsZWF2ZWQgZm9ybWF0IG1lYW5zIGNvcnJlc3BvbmRpbmcKLQkJCQkgKiBzYW1wbGVzIGZyb20gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzIGFyZQotCQkJCSAqIGludGVybGVhdmVkIHdpdGhpbiB0aGUgYnVmZmVyLgotCQkJCSAqIERlLWludGVybGVhdmVkIGZvcm1hdCBtZWFucyBzYW1wbGVzIGZyb20KLQkJCQkgKiBlYWNoIGNoYW5uZWwgYXJlIGNvbnRpZ3VvdXMgaW4gdGhlIGJ1ZmZlci4KLQkJCQkgKiBUaGUgc2FtcGxlcyBmcm9tIG9uZSBjaGFubmVsIGltbWVkaWF0ZWx5Ci0JCQkJICogZm9sbG93IHRob3NlIG9mIHRoZSBwcmV2aW91cyBjaGFubmVsLgotCQkJCSAqLwotCi0JdTggY2hhbm5lbF9tYXBwaW5nWzhdOwkvKgotCQkJCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JCQkJICogUENNX0NIQU5ORUxfTlVMTCwgUENNX0NIQU5ORUxfRkwsCi0JCQkJICogUENNX0NIQU5ORUxfRlIsIFBDTV9DSEFOTkVMX0ZDLAotCQkJCSAqIFBDTV9DSEFOTkVMX0xTLCBQQ01fQ0hBTk5FTF9SUywKLQkJCQkgKiBQQ01fQ0hBTk5FTF9MRkUsIFBDTV9DSEFOTkVMX0NTLAotCQkJCSAqIFBDTV9DSEFOTkVMX0xCLCBQQ01fQ0hBTk5FTF9SQiwKLQkJCQkgKiBQQ01fQ0hBTk5FTF9UUywgUENNX0NIQU5ORUxfQ1ZILAotCQkJCSAqIFBDTV9DSEFOTkVMX01TLCBQQ01fQ0hBTk5FTF9GTEMsCi0JCQkJICogUENNX0NIQU5ORUxfRlJDLCBQQ01fQ0hBTk5FTF9STEMsCi0JCQkJICogUENNX0NIQU5ORUxfUlJDLgotCQkJCSAqIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbCBJLiBFYWNoCi0JCQkJICogZWxlbWVudCBpIG9mIHRoZSBhcnJheSBkZXNjcmliZXMgY2hhbm5lbCBJCi0JCQkJICogaW5zaWRlIHRoZSBidWZmZXIgd2hlcmUgIEkgPCBudW1fY2hhbm5lbHMuCi0JCQkJICogQW4gdW51c2VkIGNoYW5uZWwgaXMgc2V0IHRvIHplcm8uCi0JCQkJICovCi19Owotc3RydWN0IGFzbV9kdHNfZW5jX2NmZyB7Ci0JdWludDMyX3QJc2FtcGxlX3JhdGU7Ci0JLyoKLQkgKiBTYW1wbGVzIGF0IHdoaWNoIGlucHV0IGlzIHRvIGJlIGVuY29kZWQuCi0JICogU3VwcG9ydGVkIHZhbHVlczoKLQkgKiA0NDEwMCAtLSBlbmNvZGUgYXQgNDQuMSBLaHoKLQkgKiA0ODAwMCAtLSBlbmNvZGUgYXQgNDggS2h6Ci0JICovCi0KLQl1aW50MzJfdAludW1fY2hhbm5lbHM7Ci0JLyoKLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIG11bHRpLWNoYW5uZWwgZW5jb2RpbmcuCi0JICogU3VwcG9ydGVkIHZhbHVlczogMSB0byA2Ci0JICovCi0KLQl1aW50OF90CQljaGFubmVsX21hcHBpbmdbNl07Ci0JLyoKLQkgKiBDaGFubmVsIGFycmF5IG9mIHNpemUgMTYuIENoYW5uZWxbaV0gbWFwcGluZyBkZXNjcmliZXMgY2hhbm5lbCBJLgotCSAqIEVhY2ggZWxlbWVudCBpIG9mIHRoZSBhcnJheSBkZXNjcmliZXMgY2hhbm5lbCBJIGluc2lkZSB0aGUgYnVmZmVyCi0JICogd2hlcmUgbnVtX2NoYW5uZWxzLiBBbiB1bnVzZWQgY2hhbm5lbCBpcyBzZXQgdG8gemVyby4gT25seSBmaXJzdAotCSAqIG51bV9jaGFubmVscyBlbGVtZW50cyBhcmUgdmFsaWQKLQkgKgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogLSAjIFBDTV9DSEFOTkVMX0wKLQkgKiAtICMgUENNX0NIQU5ORUxfUgotCSAqIC0gIyBQQ01fQ0hBTk5FTF9DCi0JICogLSAjIFBDTV9DSEFOTkVMX0xTCi0JICogLSAjIFBDTV9DSEFOTkVMX1JTCi0JICogLSAjIFBDTV9DSEFOTkVMX0xGRQotCSAqLwotCi19Owotc3RydWN0IGFzbV9hZHBjbV9jZmcgewotCXUxNiBjaF9jZmc7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGJsb2NrX3NpemU7Ci19OwotCi1zdHJ1Y3QgYXNtX3lhZHBjbV9jZmcgewotCXUxNiBjaF9jZmc7Ci0JdTE2IGJpdHNfcGVyX3NhbXBsZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXNtX21pZGlfY2ZnIHsKLQl1MzIgbk1vZGU7Ci19OwotCi1zdHJ1Y3QgYXNtX3dtYV9jZmcgewotCXUxNiBmb3JtYXRfdGFnOwotCXUxNiBjaF9jZmc7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBhdmdfYnl0ZXNfcGVyX3NlYzsKLQl1MTYgYmxvY2tfYWxpZ247Ci0JdTE2IHZhbGlkX2JpdHNfcGVyX3NhbXBsZTsKLQl1MzIgY2hfbWFzazsKLQl1MTYgZW5jb2RlX29wdDsKLQl1MTYgYWR2X2VuY29kZV9vcHQ7Ci0JdTMyIGFkdl9lbmNvZGVfb3B0MjsKLQl1MzIgZHJjX3BlYWtfcmVmOwotCXUzMiBkcmNfcGVha190YXJnZXQ7Ci0JdTMyIGRyY19hdmVfcmVmOwotCXUzMiBkcmNfYXZlX3RhcmdldDsKLX07Ci0KLXN0cnVjdCBhc21fd21hcHJvX2NmZyB7Ci0JdTE2IGZvcm1hdF90YWc7Ci0JdTE2IGNoX2NmZzsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGF2Z19ieXRlc19wZXJfc2VjOwotCXUxNiBibG9ja19hbGlnbjsKLQl1MTYgdmFsaWRfYml0c19wZXJfc2FtcGxlOwotCXUzMiBjaF9tYXNrOwotCXUxNiBlbmNvZGVfb3B0OwotCXUxNiBhZHZfZW5jb2RlX29wdDsKLQl1MzIgYWR2X2VuY29kZV9vcHQyOwotCXUzMiBkcmNfcGVha19yZWY7Ci0JdTMyIGRyY19wZWFrX3RhcmdldDsKLQl1MzIgZHJjX2F2ZV9yZWY7Ci0JdTMyIGRyY19hdmVfdGFyZ2V0OwotfTsKLQotc3RydWN0IGFzbV9hYWNfY2ZnIHsKLQl1MTYgZm9ybWF0OwotCXUxNiBhb3Q7Ci0JdTE2IGVwX2NvbmZpZzsKLQl1MTYgc2VjdGlvbl9kYXRhX3Jlc2lsaWVuY2U7Ci0JdTE2IHNjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZTsKLQl1MTYgc3BlY3RyYWxfZGF0YV9yZXNpbGllbmNlOwotCXUxNiBjaF9jZmc7Ci0JdTE2IHJlc2VydmVkOwotCXUzMiBzYW1wbGVfcmF0ZTsKLX07Ci0KLXN0cnVjdCBhc21fYW1yd2JwbHVzX2NmZyB7Ci0JdTMyICBzaXplX2J5dGVzOwotCXUzMiAgdmVyc2lvbjsKLQl1MzIgIG51bV9jaGFubmVsczsKLQl1MzIgIGFtcl9iYW5kX21vZGU7Ci0JdTMyICBhbXJfZHR4X21vZGU7Ci0JdTMyICBhbXJfZnJhbWVfZm10OwotCXUzMiAgYW1yX2xzZl9pZHg7Ci19OwotCi1zdHJ1Y3QgYXNtX2ZsYWNfY2ZnIHsKLQl1MTYgc3RyZWFtX2luZm9fcHJlc2VudDsKLQl1MTYgbWluX2Jsa19zaXplOwotCXUxNiBtYXhfYmxrX3NpemU7Ci0JdTE2IGNoX2NmZzsKLQl1MTYgc2FtcGxlX3NpemU7Ci0JdTE2IHNhbXBsZV9yYXRlOwotCXUxNiBtZDVfc3VtOwotCXUzMiBleHRfc2FtcGxlX3JhdGU7Ci0JdTMyIG1pbl9mcmFtZV9zaXplOwotCXUzMiBtYXhfZnJhbWVfc2l6ZTsKLX07Ci0KLXN0cnVjdCBhc21fdm9yYmlzX2NmZyB7Ci0JdTMyIGNoX2NmZzsKLQl1MzIgYml0X3JhdGU7Ci0JdTMyIG1pbl9iaXRfcmF0ZTsKLQl1MzIgbWF4X2JpdF9yYXRlOwotCXUxNiBiaXRfZGVwdGhfcGNtX3NhbXBsZTsKLQl1MTYgYml0X3N0cmVhbV9mb3JtYXQ7Ci19OwotCi1zdHJ1Y3QgYXNtX2FhY19yZWFkX2NmZyB7Ci0JdTMyIGJpdHJhdGU7Ci0JdTMyIGVuY19tb2RlOwotCXUxNiBmb3JtYXQ7Ci0JdTE2IGNoX2NmZzsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXNtX2Ftcm5iX3JlYWRfY2ZnIHsKLQl1MTYgbW9kZTsKLQl1MTYgZHR4X21vZGU7Ci19OwotCi1zdHJ1Y3QgYXNtX2FtcndiX3JlYWRfY2ZnIHsKLQl1MTYgbW9kZTsKLQl1MTYgZHR4X21vZGU7Ci19OwotCi1zdHJ1Y3QgYXNtX2V2cmNfcmVhZF9jZmcgewotCXUxNiBtYXhfcmF0ZTsKLQl1MTYgbWluX3JhdGU7Ci0JdTE2IHJhdGVfbW9kdWxhdGlvbl9jbWQ7Ci0JdTE2IHJlc2VydmVkOwotfTsKLQotc3RydWN0IGFzbV9xY2VscDEzX3JlYWRfY2ZnIHsKLQl1MTYgbWF4X3JhdGU7Ci0JdTE2IG1pbl9yYXRlOwotCXUxNiByZWR1Y2VkX3JhdGVfbGV2ZWw7Ci0JdTE2IHJhdGVfbW9kdWxhdGlvbl9jbWQ7Ci19OwotCi1zdHJ1Y3QgYXNtX3NiY19yZWFkX2NmZyB7Ci0JdTMyIHN1YmJhbmQ7Ci0JdTMyIGJsb2NrX2xlbjsKLQl1MzIgY2hfbW9kZTsKLQl1MzIgYWxsb2NfbWV0aG9kOwotCXUzMiBiaXRfcmF0ZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXNtX3NiY19iaXRyYXRlIHsKLQl1MzIgYml0cmF0ZTsKLX07Ci0KLXN0cnVjdCBhc21faW1tZWRfZGVjb2RlIHsKLQl1MzIgbW9kZTsKLX07Ci0KLXN0cnVjdCBhc21fc2JyX3BzIHsKLQl1MzIgZW5hYmxlOwotfTsKLQotc3RydWN0IGFzbV9kdWFsX21vbm8gewotCXUxNiBzY2VfbGVmdDsKLQl1MTYgc2NlX3JpZ2h0OwotfTsKLQotc3RydWN0IGFzbV9kZWNfY2hhbl9tYXAgewotCXUzMiBudW1fY2hhbm5lbHM7CQkJICAvKiBOdW1iZXIgb2YgZGVjb2RlciBvdXRwdXQKLQkJCQkJCSAgICogY2hhbm5lbHMuIEEgdmFsdWUgb2YgMAotCQkJCQkJICAgKiBpbmRpY2F0ZXMgbmF0aXZlIGNoYW5uZWwKLQkJCQkJCSAgICogbWFwcGluZywgd2hpY2ggaXMgdmFsaWQKLQkJCQkJCSAgICogb25seSBmb3IgTlQgbW9kZS4gVGhpcwotCQkJCQkJICAgKiBtZWFucyB0aGUgb3V0cHV0IG9mIHRoZQotCQkJCQkJICAgKiBkZWNvZGVyIGlzIHRvIGJlIHByZXNlcnZlZAotCQkJCQkJICAgKiBhcyBpcy4KLQkJCQkJCSAgICovCi0KLQl1OCBjaGFubmVsX21hcHBpbmdbTUFYX0NIQU5fTUFQX0NIQU5ORUxTXTsvKiBDaGFubmVsIGFycmF5IG9mIHNpemUKLQkJCQkJCSAgICogbnVtX2NoYW5uZWxzLiBJdCBjYW4gZ3JvdwotCQkJCQkJICAgKiB0aWxsIE1BWF9DSEFOX01BUF9DSEFOTkVMUy4KLQkJCQkJCSAgICogQ2hhbm5lbFtpXSBtYXBwaW5nCi0JCQkJCQkgICAqIGRlc2NyaWJlcyBjaGFubmVsIEkgaW5zaWRlCi0JCQkJCQkgICAqIHRoZSBkZWNvZGVyIG91dHB1dCBidWZmZXIuCi0JCQkJCQkgICAqIFZhbGlkIGNoYW5uZWwgbWFwcGluZwotCQkJCQkJICAgKiB2YWx1ZXMgYXJlIHRvIGJlIHByZXNlbnQgYXQKLQkJCQkJCSAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuCi0JCQkJCQkgICAqIEFsbCByZW1haW5pbmcgZWxlbWVudHMgb2YKLQkJCQkJCSAgICogdGhlIGFycmF5IGFyZSB0byBiZSBmaWxsZWQKLQkJCQkJCSAgICogd2l0aCBQQ01fQ0hBTk5FTF9OVUxMLgotCQkJCQkJICAgKi8KLX07Ci0KLXN0cnVjdCBhc21fZW5jb2RlX2NmZ19ibGsgewotCXUzMiBmcmFtZXNfcGVyX2J1ZjsKLQl1MzIgZm9ybWF0X2lkOwotCXUzMiBjZmdfc2l6ZTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBhc21fcGNtX2NmZyAgICAgICAgICBwY207Ci0JCXN0cnVjdCBhc21fYWFjX3JlYWRfY2ZnICAgICBhYWM7Ci0JCXN0cnVjdCBhc21fYW1ybmJfcmVhZF9jZmcgICBhbXJuYjsKLQkJc3RydWN0IGFzbV9ldnJjX3JlYWRfY2ZnICAgIGV2cmM7Ci0JCXN0cnVjdCBhc21fcWNlbHAxM19yZWFkX2NmZyBxY2VscDEzOwotCQlzdHJ1Y3QgYXNtX3NiY19yZWFkX2NmZyAgICAgc2JjOwotCQlzdHJ1Y3QgYXNtX2FtcndiX3JlYWRfY2ZnICAgYW1yd2I7Ci0JCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2JsayAgICAgIG1wY207Ci0JCXN0cnVjdCBhc21fZHRzX2VuY19jZmcgICAgICBkdHM7Ci0JfSBfX3BhY2tlZCBjZmc7Ci19OwotCi1zdHJ1Y3QgYXNtX2ZyYW1lX21ldGFfaW5mbyB7Ci0JdTMyIG9mZnNldF90b19mcmFtZTsKLQl1MzIgZnJhbWVfc2l6ZTsKLQl1MzIgZW5jb2RlZF9wY21fc2FtcGxlczsKLQl1MzIgbXN3X3RzOwotCXUzMiBsc3dfdHM7Ci0JdTMyIG5mbGFnczsKLX07Ci0KLS8qIFN0cmVhbSBsZXZlbCBjb21tYW5kcyAqLwotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMEJDQgotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfVjJfMSAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERCMgotc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHVNb2RlOwotCXUzMiAgICAgICAgICAgIHNyY19lbmRwb2ludDsKLQl1MzIgICAgICAgICAgICBwcmVfcHJvY190b3A7Ci0JdTMyICAgICAgICAgICAgZm9ybWF0OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fcmVhZF92Ml8xIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgdU1vZGU7Ci0JdTMyICAgICAgICAgICAgc3JjX2VuZHBvaW50OwotCXUzMiAgICAgICAgICAgIHByZV9wcm9jX3RvcDsKLQl1MzIgICAgICAgICAgICBmb3JtYXQ7Ci0JdTE2ICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlOwotCXUxNiAgICAgICAgICAgIHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotLyogU3VwcG9ydGVkIGZvcm1hdHMgKi8KLSNkZWZpbmUgTElORUFSX1BDTSAgIDB4MDAwMTBCRTUKLSNkZWZpbmUgRFRNRiAgICAgICAgIDB4MDAwMTBCRTYKLSNkZWZpbmUgQURQQ00gICAgICAgIDB4MDAwMTBCRTcKLSNkZWZpbmUgWUFEUENNICAgICAgIDB4MDAwMTBCRTgKLSNkZWZpbmUgTVAzICAgICAgICAgIDB4MDAwMTBCRTkKLSNkZWZpbmUgTVBFRzRfQUFDICAgIDB4MDAwMTBCRUEKLSNkZWZpbmUgQU1STkJfRlMgICAgIDB4MDAwMTBCRUIKLSNkZWZpbmUgQU1SV0JfRlMgICAgIDB4MDAwMTBCRUMKLSNkZWZpbmUgVjEzS19GUyAgICAgIDB4MDAwMTBCRUQKLSNkZWZpbmUgRVZSQ19GUyAgICAgIDB4MDAwMTBCRUUKLSNkZWZpbmUgRVZSQ0JfRlMgICAgIDB4MDAwMTBCRUYKLSNkZWZpbmUgRVZSQ1dCX0ZTICAgIDB4MDAwMTBCRjAKLSNkZWZpbmUgTUlESSAgICAgICAgIDB4MDAwMTBCRjEKLSNkZWZpbmUgU0JDICAgICAgICAgIDB4MDAwMTBCRjIKLSNkZWZpbmUgV01BX1YxMFBSTyAgIDB4MDAwMTBCRjMKLSNkZWZpbmUgV01BX1Y5ICAgICAgIDB4MDAwMTBCRjQKLSNkZWZpbmUgQU1SX1dCX1BMVVMgIDB4MDAwMTBCRjUKLSNkZWZpbmUgQUMzX0RFQ09ERVIgIDB4MDAwMTBCRjYKLSNkZWZpbmUgRUFDM19ERUNPREVSIDB4MDAwMTBDM0MKLSNkZWZpbmUgRFRTCTB4MDAwMTBEODgKLSNkZWZpbmUgRFRTX0xCUgkweDAwMDEwREJCCi0jZGVmaW5lIE1QMiAgICAgICAgICAweDAwMDEwREJFCi0jZGVmaW5lIEFUUkFDCTB4MDAwMTBEODkKLSNkZWZpbmUgTUFUCTB4MDAwMTBEOEEKLSNkZWZpbmUgRzcxMV9BTEFXX0ZTIDB4MDAwMTBCRjcKLSNkZWZpbmUgRzcxMV9NTEFXX0ZTIDB4MDAwMTBCRjgKLSNkZWZpbmUgRzcxMV9QQ01fRlMgIDB4MDAwMTBCRjkKLSNkZWZpbmUgTVBFRzRfTVVMVElfQUFDIDB4MDAwMTBEODYKLSNkZWZpbmUgVVNfUE9JTlRfRVBPU19GT1JNQVQgMHgwMDAxMjMxMAotI2RlZmluZSBVU19SQVdfRk9STUFUICAgICAgICAweDAwMDExMjdDCi0jZGVmaW5lIFVTX1BST1hfRk9STUFUICAgICAgIDB4MDAwMTI3MkIKLSNkZWZpbmUgTVVMVElfQ0hBTk5FTF9QQ00gICAgMHgwMDAxMEM2NgotCi0jZGVmaW5lIEFTTV9FTkNERUNfU0JDUkFURSAgICAgICAgIDB4MDAwMTBDMTMKLSNkZWZpbmUgQVNNX0VOQ0RFQ19JTU1ESUFURV9ERUNPREUgMHgwMDAxMEMxNAotI2RlZmluZSBBU01fRU5DREVDX0NGR19CTEsgICAgICAgICAweDAwMDEwQzJDCi0KLSNkZWZpbmUgQVNNX0VOQ0RFQ19TQkNSQVRFICAgICAgICAgMHgwMDAxMEMxMwotI2RlZmluZSBBU01fRU5DREVDX0lNTURJQVRFX0RFQ09ERSAweDAwMDEwQzE0Ci0jZGVmaW5lIEFTTV9FTkNERUNfQ0ZHX0JMSyAgICAgICAgIDB4MDAwMTBDMkMKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX1JFQURfQ09NUFJFU1NFRCAgICAgICAgICAgICAgIDB4MDAwMTBEOTUKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWRfY29tcHJlc3NlZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHVNb2RlOwotCXUzMiAgICAgICAgICAgIGZyYW1lX3Blcl9idWY7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkNBCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfVjJfMSAgICAgICAgICAgICAgICAgICAweDAwMDEwREIxCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl93cml0ZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHVNb2RlOwotCXUxNiAgICAgICAgICAgIHNpbmtfZW5kcG9pbnQ7Ci0JdTE2ICAgICAgICAgICAgc3RyZWFtX2hhbmRsZTsKLQl1MzIgICAgICAgICAgICBwb3N0X3Byb2NfdG9wOwotCXUzMiAgICAgICAgICAgIGZvcm1hdDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgSUVDXzYxOTM3X01BU0sJMHgwMDAwMDAwMQotI2RlZmluZSBJRUNfNjA5NThfTUFTSwkweDAwMDAwMDAyCi0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VECTB4MDAwMTBEODQKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3dyaXRlX2NvbXByZXNzZWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIJZmxhZ3M7Ci0JdTMyCWZvcm1hdDsKLX0gX19wYWNrZWQ7Ci0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fVFJBTlNDT0RFX0xPT1BCQUNLICAgICAweDAwMDEwREJBCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl90cmFuc2NvZGVfbG9vcGJhY2sgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdAltb2RlX2ZsYWdzOwotCS8qCi0JICogQWxsIGJpdHMgYXJlIHJlc2VydmVkLiBDbGllbnRzIG11c3Qgc2V0IHRoZW0gdG8gemVyby4KLQkgKi8KLQotCXVpbnQzMl90CXNyY19mb3JtYXRfaWQ7Ci0JLyoKLQkgKiBTcGVjaWZpZXMgdGhlIG1lZGlhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYXVkaW8gc3RyZWFtLgotCSAqCi0JICogU3VwcG9ydGVkIHZhbHVlczoKLQkgKiAtICNBU01fTUVESUFfRk1UX0xJTkVBUl9QQ00KLQkgKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNCi0JICovCi0KLQl1aW50MzJfdAlzaW5rX2Zvcm1hdF9pZDsKLQkvKgotCSAqIFNwZWNpZmllcyB0aGUgbWVkaWEgZm9ybWF0IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqCi0JICogU3VwcG9ydGVkIHZhbHVlczoKLQkgKiAtICNBU01fTUVESUFfRk1UX0xJTkVBUl9QQ00KLQkgKiAtICNBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNCi0JICogLSAjQVNNX01FRElBX0ZNVF9EVFMKLQkgKi8KLQotCXVpbnQzMl90CWF1ZHByb2NfdG9wb19pZDsKLQkvKgotCSAqIFBvc3Rwcm9jZXNzaW5nIHRvcG9sb2d5IElELCB3aGljaCBzcGVjaWZpZXMgdGhlIHRvcG9sb2d5IChvcmRlciBvZgotCSAqIHByb2Nlc3NpbmcpIG9mIHBvc3Rwcm9jZXNzaW5nIGFsZ29yaXRobXMuCi0JICoKLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIC0gI0FTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9ERUZBVUxUCi0JICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX1BFQUtNRVRFUgotCSAqIC0gI0FTTV9TVFJFQU1fUE9TVFBST0NfVE9QT19JRF9OT05FCi0JICogLSAjQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX01DSF9QRUFLX1ZPTAotCSAqLwotCi0JdWludDE2X3QJc3JjX2VuZHBvaW50X3R5cGU7Ci0JLyoKLQkgKiBTcGVjaWZpZXMgdGhlIHNvdXJjZSBlbmRwb2ludCB0aGF0IHByb3ZpZGVzIHRoZSBpbnB1dCBzYW1wbGVzLgotCSAqCi0JICogU3VwcG9ydGVkIHZhbHVlczoKLQkgKiAtIDAgLS0gVHggZGV2aWNlIG1hdHJpeCBvciBzdHJlYW0gcm91dGVyCi0JICogKGdhdGV3YXkgdG8gdGhlIGhhcmR3YXJlIHBvcnRzKQotCSAqIC0gQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKLQkgKgotCSAqIENsaWVudHMgbXVzdCBzZXQgdGhpcyBmaWVsZCB0byB6ZXJvLiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHJldHVybmVkLgotCSAqLwotCi0JdWludDE2X3QJc2lua19lbmRwb2ludF90eXBlOwotCS8qCi0JICogU3BlY2lmaWVzIHRoZSBzaW5rIGVuZHBvaW50IHR5cGUuCi0JICoKLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIC0gMCAtLSBSeCBkZXZpY2UgbWF0cml4IG9yIHN0cmVhbSByb3V0ZXIKLQkgKiAoZ2F0ZXdheSB0byB0aGUgaGFyZHdhcmUgcG9ydHMpCi0JICogLSBBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAotCSAqCi0JICogQ2xpZW50cyBtdXN0IHNldCB0aGlzIGZpZWxkIHRvIHplcm8uIE90aGVyd2lzZSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0JICovCi0KLQl1aW50MTZfdAliaXRzX3Blcl9zYW1wbGU7Ci0JLyoKLQkgKiBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlIHByb2Nlc3NlZCBieSB0aGUgQVNNIG1vZHVsZXMuCi0JICogU3VwcG9ydGVkIHZhbHVlczogMTYsIDI0Ci0JICovCi0KLQl1aW50MTZfdAlyZXNlcnZlZDsKLQkvKgotCSAqIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBJRCBvZiB0aGUgRFRTIG1peCBMRkUgY2hhbm5lbCB0byBmcm9udCBjaGFubmVscyBwYXJhbWV0ZXIgaW4gdGhlCi0gKiAjQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kLgotICogYXNtX2R0c19nZW5lcmljX3BhcmFtX3QKLSAqIEFTTV9QQVJBTV9JRF9EVFNfTUlYX0xGRV9UT19GUk9OVAotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9EVFNfTUlYX0xGRV9UT19GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERCNgotCi0vKgotICogSUQgb2YgdGhlIERUUyBEUkMgcmF0aW8gcGFyYW1ldGVyIGluIHRoZQotICogI0FTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0gY29tbWFuZC4KLSAqIGFzbV9kdHNfZ2VuZXJpY19wYXJhbV90Ci0gKiBBU01fUEFSQU1fSURfRFRTX0RSQ19SQVRJTwotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9EVFNfRFJDX1JBVElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwREI3Ci0KLS8qCi0gKiBJRCBvZiB0aGUgRFRTIGVuYWJsZSBkaWFsb2cgbm9ybWFsaXphdGlvbiBwYXJhbWV0ZXIgaW4gdGhlCi0gKiAjQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSBjb21tYW5kLgotICoKLSAqIGFzbV9kdHNfZ2VuZXJpY19wYXJhbV90Ci0gKiBBU01fUEFSQU1fSURfRFRTX0VOQUJMRV9ESUFMTk9STQotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9EVFNfRU5BQkxFX0RJQUxOT1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwREI4Ci0KLS8qCi0gKiBJRCBvZiB0aGUgRFRTIGVuYWJsZSBwYXJzZSBSRVYyQVVYIHBhcmFtZXRlciBpbiB0aGUKLSAqICNBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNIGNvbW1hbmQuCi0gKiBhc21fZHRzX2dlbmVyaWNfcGFyYW1fdAotICogQVNNX1BBUkFNX0lEX0RUU19FTkFCTEVfUEFSU0VfUkVWMkFVWAotICovCi0jZGVmaW5lIEFTTV9QQVJBTV9JRF9EVFNfRU5BQkxFX1BBUlNFX1JFVjJBVVggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERCOQotCi1zdHJ1Y3QgYXNtX2R0c19nZW5lcmljX3BhcmFtIHsKLQlpbnQzMl90CQlnZW5lcmljX3BhcmFtZXRlcjsKLQkvKgotCSAqICNBU01fUEFSQU1fSURfRFRTX01JWF9MRkVfVE9fRlJPTlQ6Ci0JICogLSBpZiBlbmFibGVkLCBtaXhlcyBMRkUgY2hhbm5lbCB0byBmcm9udAotCSAqIHdoaWxlIGRvd25taXhpbmcgKGlmIG5lY2Vzc2FyeSkKLQkgKiAtIFN1cHBvcnRlZCB2YWx1ZXM6IDEtPiBlbmFibGUsIDAtPiBkaXNhYmxlCi0JICogLSBEZWZhdWx0OiBkaXNhYmxlZAotCSAqCi0JICogI0FTTV9QQVJBTV9JRF9EVFNfRFJDX1JBVElPOgotCSAqIC0gcGVyY2VudGFnZSBvZiBEUkMgcmF0aW8uCi0JICogLSBTdXBwb3J0ZWQgdmFsdWVzOiAwLTEwMAotCSAqIC0gRGVmYXVsdDogMCwgRFJDIGlzIGRpc2FibGVkLgotCSAqCi0JICogI0FTTV9QQVJBTV9JRF9EVFNfRU5BQkxFX0RJQUxOT1JNOgotCSAqIC0gZmxhZyB0byBlbmFibGUgZGlhbG9nIG5vcm1hbGl6YXRpb24gcG9zdCBwcm9jZXNzaW5nLgotCSAqIC0gU3VwcG9ydGVkIHZhbHVlczogMS0+IGVuYWJsZSwgMC0+IGRpc2FibGUuCi0JICogLSBEZWZhdWx0OiBlbmFibGVkLgotCSAqCi0JICogI0FTTV9QQVJBTV9JRF9EVFNfRU5BQkxFX1BBUlNFX1JFVjJBVVg6Ci0JICogLSBmbGFnIHRvIGVuYWJsZSBwYXJzaW5nIG9mIHJldjJhdXggY2h1bmsgaW4gdGhlIGJpdHN0cmVhbS4KLQkgKiBUaGlzIGNodW5rIGNvbnRhaW5zIGJyb2FkY2FzdCBtZXRhZGF0YS4KLQkgKiAtIFN1cHBvcnRlZCB2YWx1ZXM6IDEtPiBlbmFibGUsIDAtPiBkaXNhYmxlLgotCSAqIC0gRGVmYXVsdDogZGlzYWJsZWQuCi0JICovCi19OwotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZHRzX2RlY19wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHBhcmFtX2lkOwotCXUzMiAgICAgICAgICAgIHBhcmFtX3NpemU7Ci0Jc3RydWN0IGFzbV9kdHNfZ2VuZXJpY19wYXJhbSBnZW5lcmljX3BhcmFtOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRFdSSVRFICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkNDCi0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWRfd3JpdGUgewotCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7Ci0JdTMyICAgICAgICAgICAgICAgIHVNb2RlOwotCXUzMiAgICAgICAgICAgICAgICBwb3N0X3Byb2NfdG9wOwotCXUzMiAgICAgICAgICAgICAgICB3cml0ZV9mb3JtYXQ7Ci0JdTMyICAgICAgICAgICAgICAgIHJlYWRfZm9ybWF0OwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9PUEVOX0xPT1BCQUNLCTB4MDAwMTBENkUKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX2xvb3BiYWNrIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgICAgIGhkcjsKLQl1MzIgICAgICAgICAgICAgICAgICAgIG1vZGVfZmxhZ3M7Ci0vKiBNb2RlIGZsYWdzLgotICogQml0IDAtMzE6IHJlc2VydmVkOyBjbGllbnQgc2hvdWxkIHNldCB0aGVzZSBiaXRzIHRvIDAKLSAqLwotCXUxNiAgICAgICAgICAgICAgICAgICAgc3JjX2VuZHBvaW50eXBlOwotCS8qIEVuZHBvaW50IHR5cGUuIDAgPSBUeCBNYXRyaXggKi8KLQl1MTYgICAgICAgICAgICAgICAgICAgIHNpbmtfZW5kcG9pbnR5cGU7Ci0JLyogRW5kcG9pbnQgdHlwZS4gMCA9IFJ4IE1hdHJpeCAqLwotCXUzMiAgICAgICAgICAgICAgICAgICAgcG9zdHByb2NvcG9faWQ7Ci0vKiBQb3N0cHJvY2Vzc29yIHRvcG9sb2d5IElELiBTcGVjaWZpZXMgdGhlIHRvcG9sb2d5IG9mCi0gKiBwb3N0cHJvY2Vzc2luZyBhbGdvcml0aG1zLgotICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFETV9DTURfQ09OTkVDVF9BRkVfUE9SVCAweDAwMDEwMzIwCi0jZGVmaW5lIEFETV9DTURfRElTQ09OTkVDVF9BRkVfUE9SVCAweDAwMDEwMzIxCi0KLXN0cnVjdCBhZG1fY21kX2Nvbm5lY3RfYWZlX3BvcnQgewotCXN0cnVjdCBhcHJfaGRyICAgICBoZHI7Ci0JdTgJbW9kZTsgLyptb2RlIHJlcHJlc2VudCB0aGUgaW50ZXJmYWNlIGlzIGZvciBSWCBvciBUWCovCi0JdTgJc2Vzc2lvbl9pZDsgLypBU00gc2Vzc2lvbiBJRCovCi0JdTE2CWFmZV9wb3J0X2lkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBRE1fQ01EX0NPTk5FQ1RfQUZFX1BPUlRfVjIgMHgwMDAxMDMzMgotCi1zdHJ1Y3QgYWRtX2NtZF9jb25uZWN0X2FmZV9wb3J0X3YyIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgaGRyOwotCXU4CW1vZGU7IC8qbW9kZSByZXByZXNlbnQgdGhlIGludGVyZmFjZSBpcyBmb3IgUlggb3IgVFgqLwotCXU4CXNlc3Npb25faWQ7IC8qQVNNIHNlc3Npb24gSUQqLwotCXUxNglhZmVfcG9ydF9pZDsKLQl1MzIJbnVtX2NoYW5uZWxzOwotCXUzMglzYW1wbGluZ19yYXRlOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNICAgICAgICAgICAgICAgICAgMHgwMDAxMEMxMAotI2RlZmluZSBBU01fU1RSRUFNX0NNRF9HRVRfRU5DREVDX1BBUkFNICAgICAgICAgICAgICAgICAgMHgwMDAxMEMxMQotI2RlZmluZSBBU01fRU5DREVDX0NGR19CTEtfSUQJCQkJIDB4MDAwMTBDMkMKLSNkZWZpbmUgQVNNX0VOQUJMRV9TQlJfUFMJCQkJIDB4MDAwMTBDNjMKLSNkZWZpbmUgQVNNX0NPTkZJR1VSRV9EVUFMX01PTk8JCQkgMHgwMDAxMEM2NAotc3RydWN0IGFzbV9zdHJlYW1fY21kX2VuY2RlY19jZmdfYmxrIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgICAgICAgICAgaGRyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9pZDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLQlzdHJ1Y3QgYXNtX2VuY29kZV9jZmdfYmxrICAgZW5jX2JsazsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9lbmNkZWNfc2JjX2JpdHJhdGUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKLQkJc3RydWN0IGFzbV9zYmNfYml0cmF0ZSAgICAgIHNiY19iaXRyYXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGFzbV9zdHJlYW1fY21kX2VuY2RlY19pbW1lZF9kZWNvZGUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKLQl1MzIgICAgICAgICAgICBwYXJhbV9zaXplOwotCXN0cnVjdCBhc21faW1tZWRfZGVjb2RlIGRlYzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9lbmNkZWNfc2JyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgcGFyYW1faWQ7Ci0JdTMyICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLQlzdHJ1Y3QgYXNtX3Nicl9wcyBzYnJfcHM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfZW5jZGVjX2R1YWxtb25vIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgcGFyYW1faWQ7Ci0JdTMyICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLQlzdHJ1Y3QgYXNtX2R1YWxfbW9ubyBjaGFubmVsX21hcDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1BBUkFNX0lEX0FBQ19TVEVSRU9fTUlYX0NPRUZGX1NFTEVDVElPTl9GTEFHICAgICAgICAweDAwMDEwREQ4Ci0KLS8qIFN0cnVjdHVyZSBmb3IgQUFDIGRlY29kZXIgc3RlcmVvIGNvZWZmaWNpZW50IHNldHRpbmcuICovCi0KLXN0cnVjdCBhc21fYWFjX3N0ZXJlb19taXhfY29lZmZfc2VsZWN0aW9uX3BhcmFtIHsKLQlzdHJ1Y3QgYXByX2hkcgkJCQloZHI7Ci0JdTMyCQkJCQlwYXJhbV9pZDsKLQl1MzIJCQkJCXBhcmFtX3NpemU7Ci0JdTMyCQkJCQlhYWNfc3RlcmVvX21peF9jb2VmZl9mbGFnOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fRU5DREVDX0RFQ19DSEFOX01BUAkJCQkgMHgwMDAxMEQ4Mgotc3RydWN0IGFzbV9zdHJlYW1fY21kX2VuY2RlY19jaGFubmVsbWFwIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgcGFyYW1faWQ7Ci0JdTMyICAgICAgICAgICAgcGFyYW1fc2l6ZTsKLQlzdHJ1Y3QgYXNtX2RlY19jaGFuX21hcCBjaGFuX21hcDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NUUkVBTV9DTURfQURKVVNUX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgMHgwMDAxMEMwQQotc3RydWN0IGFzbV9zdHJlYW1fY21kX2FkanVzdF9zYW1wbGVzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2ICAgICAgICAgICAgbnNhbXBsZXM7Ci0JdTE2ICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EX1RBUF9QT1BQX1BDTSAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkY5Ci1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfdGFwX3BvcHBfcGNtIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTE2ICAgICAgICAgICAgZW5hYmxlOwotCXUxNiAgICAgICAgICAgIHJlc2VydmVkOwotCXUzMiAgICAgICAgICAgIG1vZHVsZV9pZDsKLX0gX19wYWNrZWQ7Ci0KLS8qICBTZXNzaW9uIExldmVsIGNvbW1hbmRzICovCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9NRU1PUllfTUFQCQkJMHgwMDAxMEMzMgotc3RydWN0IGFzbV9zdHJlYW1fY21kX21lbW9yeV9tYXAgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MzIJCWJ1Zl9hZGQ7Ci0JdTMyCQlidWZfc2l6ZTsKLQl1MTYJCW1lbXBvb2xfaWQ7Ci0JdTE2CQlyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX01FTU9SWV9VTk1BUAkJCTB4MDAwMTBDMzMKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9tZW1vcnlfdW5tYXAgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MzIJCWJ1Zl9hZGQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9NRU1PUllfTUFQX1JFR0lPTlMJCTB4MDAwMTBDNDUKLXN0cnVjdCBhc21fbWVtb3J5X21hcF9yZWdpb25zIHsKLQl1MzIJCXBoeXM7Ci0JdTMyCQlidWZfc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9tZW1vcnlfbWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MTYJCW1lbXBvb2xfaWQ7Ci0JdTE2CQlucmVnaW9uczsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX01FTU9SWV9VTk1BUF9SRUdJT05TCQkweDAwMDEwQzQ2Ci1zdHJ1Y3QgYXNtX21lbW9yeV91bm1hcF9yZWdpb25zIHsKLQl1MzIJCXBoeXM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfbWVtb3J5X3VubWFwX3JlZ2lvbnMgewotCXN0cnVjdCBhcHJfaGRyCWhkcjsKLQl1MTYJCW5yZWdpb25zOwotCXUxNgkJcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkQyCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfcnVuIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdTMyICAgICAgICAgICAgZmxhZ3M7Ci0JdTMyICAgICAgICAgICAgbXN3X3RzOwotCXUzMiAgICAgICAgICAgIGxzd190czsKLX0gX19wYWNrZWQ7Ci0KLS8qIFNlc3Npb24gbGV2ZWwgZXZlbnRzICovCi0jZGVmaW5lIEFTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9GT1JfUlhfVU5ERVJGTE9XX0VWRU5UUyAweDAwMDEwQkQ1Ci1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfcmVnX3J4X3VuZGVyZmxvd19ldmVudCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUxNiAgICAgICAgICAgIGVuYWJsZTsKLQl1MTYgICAgICAgICAgICByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX0ZPUl9UWF9PVkVSRkxPV19FVkVOVFMgIDB4MDAwMTBCRDYKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9yZWdfdHhfb3ZlcmZsb3dfZXZlbnQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MTYgICAgICAgICAgICBlbmFibGU7Ci0JdTE2ICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkOwotCi0vKiBEYXRhIFBhdGggY29tbWFuZHMgKi8KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCRDkKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF93cml0ZSB7Ci0Jc3RydWN0IGFwcl9oZHIgICAgIGhkcjsKLQl1MzIJYnVmX2FkZDsKLQl1MzIJYXZhaWxfYnl0ZXM7Ci0JdTMyCXVpZDsKLQl1MzIJbXN3X3RzOwotCXUzMglsc3dfdHM7Ci0JdTMyCXVmbGFnczsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCREEKLXN0cnVjdCBhc21fc3RyZWFtX2NtZF9yZWFkIHsKLQlzdHJ1Y3QgYXByX2hkciAgICAgaGRyOwotCXUzMglidWZfYWRkOwotCXUzMglidWZfc2l6ZTsKLQl1MzIJdWlkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fREFUQV9DTURfUkVBRF9DT01QUkVTU0VEICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMERCRgotc3RydWN0IGFzbV9zdHJlYW1fY21kX3JlYWRfY29tcHJlc3NlZCB7Ci0Jc3RydWN0IGFwcl9oZHIgICAgIGhkcjsKLQl1MzIJYnVmX2FkZDsKLQl1MzIJYnVmX3NpemU7Ci0JdTMyCXVpZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX0RBVEFfQ01EX01FRElBX0ZPUk1BVF9VUERBVEUgICAgICAgICAgICAgICAgIDB4MDAwMTBCREMKLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfRU5DX1NSX0NNX05PVElGWSAgICAgICAgICAgICAgICAgIDB4MDAwMTBCREUKLXN0cnVjdCBhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF91cGRhdGUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICBmb3JtYXQ7Ci0JdTMyICAgICAgICAgICAgY2ZnX3NpemU7Ci0JdW5pb24gewotCQlzdHJ1Y3QgYXNtX3BjbV9jZmcgICAgICAgICBwY21fY2ZnOwotCQlzdHJ1Y3QgYXNtX2FkcGNtX2NmZyAgICAgICBhZHBjbV9jZmc7Ci0JCXN0cnVjdCBhc21feWFkcGNtX2NmZyAgICAgIHlhZHBjbV9jZmc7Ci0JCXN0cnVjdCBhc21fbWlkaV9jZmcgICAgICAgIG1pZGlfY2ZnOwotCQlzdHJ1Y3QgYXNtX3dtYV9jZmcgICAgICAgICB3bWFfY2ZnOwotCQlzdHJ1Y3QgYXNtX3dtYXByb19jZmcgICAgICB3bWFwcm9fY2ZnOwotCQlzdHJ1Y3QgYXNtX2FhY19jZmcgICAgICAgICBhYWNfY2ZnOwotCQlzdHJ1Y3QgYXNtX2ZsYWNfY2ZnICAgICAgICBmbGFjX2NmZzsKLQkJc3RydWN0IGFzbV92b3JiaXNfY2ZnICAgICAgdm9yYmlzX2NmZzsKLQkJc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrIG11bHRpX2NoX3BjbV9jZmc7Ci0JCXN0cnVjdCBhc21fYW1yd2JwbHVzX2NmZyAgIGFtcndicGx1c19jZmc7Ci0JfSBfX3BhY2tlZCB3cml0ZV9jZmc7Ci19IF9fcGFja2VkOwotCi0KLS8qIENvbW1hbmQgUmVzcG9uc2VzICovCi0jZGVmaW5lIEFTTV9TVFJFQU1fQ01EUlNQX0dFVF9FTkNERUNfUEFSQU0gICAgICAgICAgICAgICAweDAwMDEwQzEyCi1zdHJ1Y3QgYXNtX3N0cmVhbV9jbWRyc3BfZ2V0X3JlYWR3cml0ZV9wYXJhbSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICBwYXJhbV9pZDsKLQl1MTYgICAgICAgICAgICBwYXJhbV9zaXplOwotCXUxNiAgICAgICAgICAgIHBhZGRpbmc7Ci0JdW5pb24gewotCQlzdHJ1Y3QgYXNtX3NiY19iaXRyYXRlICAgICAgc2JjX2JpdHJhdGU7Ci0JCXN0cnVjdCBhc21faW1tZWRfZGVjb2RlIGFhY19kZWM7Ci0JfSBfX3BhY2tlZCByZWFkX3dyaXRlX2NmZzsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1NFU1NJT05fVElNRSAgICAgICAgICAgICAgMHgwMDAxMEJEOAotc3RydWN0IGFzbV9zdHJlYW1fY21kcnNwX2dldF9zZXNzaW9uX3RpbWUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgbXN3X3RzOwotCXUzMiAgICAgICAgICAgIGxzd190czsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgQVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBCREYKLXN0cnVjdCBhc21fZGF0YV9ldmVudF93cml0ZV9kb25lIHsKLQl1MzIJYnVmX2FkZDsKLQl1MzIgICAgICAgICAgICBzdGF0dXM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwQkUwCi1zdHJ1Y3QgYXNtX2RhdGFfZXZlbnRfcmVhZF9kb25lIHsKLQl1MzIgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgYnVmZmVyX2FkZDsKLQl1MzIgICAgICAgICAgICBlbmNfZnJhbWVfc2l6ZTsKLQl1MzIgICAgICAgICAgICBvZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgbXN3X3RzOwotCXUzMiAgICAgICAgICAgIGxzd190czsKLQl1MzIgICAgICAgICAgICBmbGFnczsKLQl1MzIgICAgICAgICAgICBudW1fZnJhbWVzOwotCXUzMiAgICAgICAgICAgIGlkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fREFUQV9FVkVOVF9SRUFEX0NPTVBSRVNTRURfRE9ORSAgICAgICAgICAgICAgMHgwMDAxMERDMAotc3RydWN0IGFzbV9kYXRhX2V2ZW50X3JlYWRfY29tcHJlc3NlZF9kb25lIHsKLQl1MzIgICAgICAgICAgICBzdGF0dXM7Ci0JdTMyICAgICAgICAgICAgYnVmZmVyX2FkZDsKLQl1MzIgICAgICAgICAgICBlbmNfZnJhbWVfc2l6ZTsKLQl1MzIgICAgICAgICAgICBvZmZzZXQ7Ci0JdTMyICAgICAgICAgICAgbXN3X3RzOwotCXUzMiAgICAgICAgICAgIGxzd190czsKLQl1MzIgICAgICAgICAgICBmbGFnczsKLQl1MzIgICAgICAgICAgICBudW1fZnJhbWVzOwotCXUzMiAgICAgICAgICAgIGlkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZICAgICAgICAgICAgICAgMHgwMDAxMEM2NQotc3RydWN0IGFzbV9kYXRhX2V2ZW50X3NyX2NtX2NoYW5nZV9ub3RpZnkgewotCXUzMiAgICAgICAgICAgIHNhbXBsZV9yYXRlOwotCXUxNgkgICAgICAgICAgIG5vX29mX2NoYW5uZWxzOwotCXUxNiAgICAgICAgICAgIHJlc2VydmVkOwotCXU4ICAgICAgICAgICAgIGNoYW5uZWxfbWFwWzhdOwotfSBfX3BhY2tlZDsKLQotLyogc2VydmljZSBsZXZlbCBldmVudHMgKi8KLQotI2RlZmluZSBBU01fU0VSVklDRV9DTURSU1BfR0VUX1NUUkVBTV9IQU5ETEVTICAgICAgICAgICAgMHgwMDAxMEMxQgotc3RydWN0IGFzbV9zdmNfY21kcnNwX2dldF9zdHJtX2hhbmRsZXMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1MzIgICAgICAgICAgICBudW1faGFuZGxlczsKLQl1MzIgICAgICAgICAgICBzdHJlYW1faGFuZGxlczsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBBU01fU0VSVklDRV9DTURSU1BfR0VUX1dBTExDTE9DS19USU1FICAgICAgICAgICAgMHgwMDAxMEMxQQotc3RydWN0IGFzbV9zdmNfY21kcnNwX2dldF93YWxsY2xvY2tfdGltZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXUzMiAgICAgICAgICAgIHN0YXR1czsKLQl1MzIgICAgICAgICAgICBtc3dfdHM7Ci0JdTMyICAgICAgICAgICAgbHN3X3RzOwotfSBfX3BhY2tlZDsKLQotLyogRXJyb3IgY29kZSAqLwotI2RlZmluZSBBRFNQX0VPSyAgICAgICAgICAweDAwMDAwMDAwIC8qIFN1Y2Nlc3MgLyBjb21wbGV0ZWQgLyBubyBlcnJvcnMuICovCi0jZGVmaW5lIEFEU1BfRUZBSUxFRCAgICAgIDB4MDAwMDAwMDEgLyogR2VuZXJhbCBmYWlsdXJlLiAqLwotI2RlZmluZSBBRFNQX0VCQURQQVJBTSAgICAweDAwMDAwMDAyIC8qIEJhZCBvcGVyYXRpb24gcGFyYW1ldGVyKHMpLiAqLwotI2RlZmluZSBBRFNQX0VVTlNVUFBPUlRFRCAweDAwMDAwMDAzIC8qIFVuc3VwcG9ydGVkIHJvdXRpbmUvb3BlcmF0aW9uLiAqLwotI2RlZmluZSBBRFNQX0VWRVJTSU9OICAgICAweDAwMDAwMDA0IC8qIFVuc3VwcG9ydGVkIHZlcnNpb24uICovCi0jZGVmaW5lIEFEU1BfRVVORVhQRUNURUQgIDB4MDAwMDAwMDUgLyogVW5leHBlY3RlZCBwcm9ibGVtIGVuY291bnRlcmVkLiAqLwotI2RlZmluZSBBRFNQX0VQQU5JQyAgICAgICAweDAwMDAwMDA2IC8qIFVuaGFuZGxlZCBwcm9ibGVtIG9jY3VycmVkLiAqLwotI2RlZmluZSBBRFNQX0VOT1JFU09VUkNFICAweDAwMDAwMDA3IC8qIFVuYWJsZSB0byBhbGxvY2F0ZSByZXNvdXJjZShzKS4gKi8KLSNkZWZpbmUgQURTUF9FSEFORExFICAgICAgMHgwMDAwMDAwOCAvKiBJbnZhbGlkIGhhbmRsZS4gKi8KLSNkZWZpbmUgQURTUF9FQUxSRUFEWSAgICAgMHgwMDAwMDAwOSAvKiBPcGVyYXRpb24gaXMgYWxyZWFkeSBwcm9jZXNzZWQuICovCi0jZGVmaW5lIEFEU1BfRU5PVFJFQURZICAgIDB4MDAwMDAwMEEgLyogT3BlcmF0aW9uIG5vdCByZWFkeSB0byBiZSBwcm9jZXNzZWQqLwotI2RlZmluZSBBRFNQX0VQRU5ESU5HICAgICAweDAwMDAwMDBCIC8qIE9wZXJhdGlvbiBpcyBwZW5kaW5nIGNvbXBsZXRpb24qLwotI2RlZmluZSBBRFNQX0VCVVNZICAgICAgICAweDAwMDAwMDBDIC8qIE9wZXJhdGlvbiBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgb3IKLQkJCQkgICAgICAqIHByb2Nlc3NlZC4KLQkJCQkgICAgICAqLwotI2RlZmluZSBBRFNQX0VBQk9SVEVEICAgICAweDAwMDAwMDBEIC8qIE9wZXJhdGlvbiBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4gKi8KLSNkZWZpbmUgQURTUF9FUFJFRU1QVEVEICAgMHgwMDAwMDAwRSAvKiBPcGVyYXRpb24gcHJlZW1wdGVkIGJ5IGhpZ2hlciBwcmlvcml0eSovCi0jZGVmaW5lIEFEU1BfRUNPTlRJTlVFICAgIDB4MDAwMDAwMEYgLyogT3BlcmF0aW9uIHJlcXVlc3RzIGludGVydmVudGlvbgotCQkJCSAgICAgICogdG8gY29tcGxldGUuCi0JCQkJICAgICAgKi8KLSNkZWZpbmUgQURTUF9FSU1NRURJQVRFICAgMHgwMDAwMDAxMCAvKiBPcGVyYXRpb24gcmVxdWVzdHMgaW1tZWRpYXRlCi0JCQkJICAgICAgKiBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuCi0JCQkJICAgICAgKi8KLSNkZWZpbmUgQURTUF9FTk9USU1QTCAgICAgMHgwMDAwMDAxMSAvKiBPcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiAqLwotI2RlZmluZSBBRFNQX0VORUVETU9SRSAgICAweDAwMDAwMDEyIC8qIE9wZXJhdGlvbiBuZWVkcyBtb3JlIGRhdGEgb3IgcmVzb3VyY2VzKi8KLQotLyogU1JTIFRSVU1FRElBIEdVSURTICovCi0jZGVmaW5lIFNSU19UUlVNRURJQV9UT1BPTE9HWV9JRCAgICAweDAwMDEwRDkwCi0jZGVmaW5lIFNSU19UUlVNRURJQV9NT0RVTEVfSUQgICAgICAweDEwMDA1MDEwCi0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVMgICAgICAgICAweDEwMDA1MDExCi0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfV09XSEQgICAweDEwMDA1MDEyCi0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfQ1NIUCAgICAweDEwMDA1MDEzCi0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfSFBGICAgICAweDEwMDA1MDE0Ci0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfUEVRICAgICAweDEwMDA1MDE1Ci0jZGVmaW5lIFNSU19UUlVNRURJQV9QQVJBTVNfSEwgICAgICAweDEwMDA1MDE2Ci0KLS8qIFNSUyBTVFVESU8gU09VTkQgM0QgR1VJRFMgKi8KLSNkZWZpbmUgU1JTX1NTM0RfVE9QT0xPR1lfSUQgICAgICAgIDB4MDAwMTA3MjAKLSNkZWZpbmUgU1JTX1NTM0RfTU9EVUxFX0lEICAgICAgICAgIDB4MTAwMDUwMjAKLSNkZWZpbmUgU1JTX1NTM0RfUEFSQU1TICAgICAgICAgICAgIDB4MTAwMDUwMjEKLSNkZWZpbmUgU1JTX1NTM0RfUEFSQU1TX0NUUkwgICAgICAgIDB4MTAwMDUwMjIKLSNkZWZpbmUgU1JTX1NTM0RfUEFSQU1TX0ZJTFRFUiAgICAgIDB4MTAwMDUwMjMKLQotLyogU1JTIEFMU0EgQ01EIE1BU0tTICovCi0jZGVmaW5lIFNSU19DTURfVVBMT0FEICAgICAgICAgICAgICAweDdGRkYwMDAwCi0jZGVmaW5lIFNSU19QQVJBTV9JTkRFWF9NQVNLICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIFNSU19QQVJBTV9PRkZTRVRfTUFTSyAgICAgICAweDNGRkYwMDAwCi0jZGVmaW5lIFNSU19QQVJBTV9WQUxVRV9NQVNLICAgICAgICAweDAwMDBGRkZGCi0KLS8qIFNSUyBUUlVNRURJQSBzdGFydCAqLwotI2RlZmluZSBTUlNfSURfR0xPQkFMICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUlNfSURfV09XSEQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUlNfSURfQ1NIUCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBTUlNfSURfSFBGICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUlNfSURfUEVRICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQotI2RlZmluZSBTUlNfSURfSEwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwgewotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MTsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjI7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHYzOwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NDsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjU7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHY2OwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NzsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCB7Ci0JdWludDMyX3QJCQkJdjE7Ci0JdWludDE2X3QJCQkJdjI7Ci0JdWludDE2X3QJCQkJdjM7Ci0JdWludDE2X3QJCQkJdjQ7Ci0JdWludDE2X3QJCQkJdjU7Ci0JdWludDE2X3QJCQkJdjY7Ci0JdWludDE2X3QJCQkJdjc7Ci0JdWludDE2X3QJCQkJdjg7Ci0JdWludDE2X3QJCQkJdl9fX19BMTsKLQl1aW50MzJfdAkJCQl2OTsKLQl1aW50MTZfdAkJCQl2MTA7Ci0JdWludDE2X3QJCQkJdjExOwotCXVpbnQzMl90CQkJCXYxMlsxNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQIHsKLQl1aW50MzJfdAkJCQl2MTsKLQl1aW50MTZfdAkJCQl2MjsKLQl1aW50MTZfdAkJCQl2MzsKLQl1aW50MTZfdAkJCQl2NDsKLQl1aW50MTZfdAkJCQl2NTsKLQl1aW50MTZfdAkJCQl2NjsKLQl1aW50MTZfdAkJCQl2X19fX0ExOwotCXVpbnQzMl90CQkJCXY3OwotCXVpbnQxNl90CQkJCXY4OwotCXVpbnQxNl90CQkJCXY5OwotCXVpbnQzMl90CQkJCXYxMFsxNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYgewotCXVpbnQzMl90CQkJCXYxOwotCXVpbnQzMl90CQkJCXYyWzI2XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1BFUSB7Ci0JdWludDMyX3QJCQkJdjE7Ci0JdWludDE2X3QJCQkJdjI7Ci0JdWludDE2X3QJCQkJdjM7Ci0JdWludDE2X3QJCQkJdjQ7Ci0JdWludDE2X3QJCQkJdl9fX19BMTsKLQl1aW50MzJfdAkJCQl2NVsyNl07Ci0JdWludDMyX3QJCQkJdjZbMjZdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwgewotCXVpbnQxNl90CQkJCXYxOwotCXVpbnQxNl90CQkJCXYyOwotCXVpbnQxNl90CQkJCXYzOwotCXVpbnQxNl90CQkJCXZfX19fQTE7Ci0JaW50MzJfdAkJCQkJdjQ7Ci0JdWludDMyX3QJCQkJdjU7Ci0JdWludDE2X3QJCQkJdjY7Ci0JdWludDE2X3QJCQkJdl9fX19BMjsKLQl1aW50MzJfdAkJCQl2NzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zIHsKLQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwJZ2xvYmFsOwotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX1dPV0hECXdvd2hkOwotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFAJCWNzaHA7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGCQlocGY7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfUEVRCQlwZXE7Ci0Jc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwJCWhsOwotfSBfX3BhY2tlZDsKLQotaW50IHNyc190cnVtZWRpYV9vcGVuKGludCBwb3J0X2lkLCBpbnQgc3JzX3RlY2hfaWQsIHZvaWQgKnNyc19wYXJhbXMpOwotLyogU1JTIFRydU1lZGlhIGVuZCAqLwotCi0vKiBTUlMgU3R1ZGlvIFNvdW5kIDNEIHN0YXJ0ICovCi0jZGVmaW5lIFNSU19JRF9TUzNEX0dMT0JBTAkweDAwMDAwMDAxCi0jZGVmaW5lIFNSU19JRF9TUzNEX0NUUkwJMHgwMDAwMDAwMgotI2RlZmluZSBTUlNfSURfU1MzRF9GSUxURVIJMHgwMDAwMDAwMwotCi1zdHJ1Y3Qgc3JzX1NTM0RfcGFyYW1zX0dMT0JBTCB7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHYxOwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2MjsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjM7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHY0OwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2NTsKLQl1aW50OF90ICAgICAgICAgICAgICAgICAgdjY7Ci0JdWludDhfdCAgICAgICAgICAgICAgICAgIHY3OwotCXVpbnQ4X3QgICAgICAgICAgICAgICAgICB2ODsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzcnNfU1MzRF9jdHJsX3BhcmFtcyB7Ci0JdWludDhfdAkJCQl2WzIzNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX1NTM0RfZmlsdGVyX3BhcmFtcyB7Ci0JdWludDhfdAkJCQl2WzI4ICsgMjc1Ml07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3JzX1NTM0RfcGFyYW1zIHsKLQlzdHJ1Y3Qgc3JzX1NTM0RfcGFyYW1zX0dMT0JBTCAgIGdsb2JhbDsKLQlzdHJ1Y3Qgc3JzX1NTM0RfY3RybF9wYXJhbXMgICAgIHNzM2Q7Ci0Jc3RydWN0IHNyc19TUzNEX2ZpbHRlcl9wYXJhbXMgICBzczNkX2Y7Ci19IF9fcGFja2VkOwotCi1pbnQgc3JzX3NzM2Rfb3BlbihpbnQgcG9ydF9pZCwgaW50IHNyc190ZWNoX2lkLCB2b2lkICpzcnNfcGFyYW1zKTsKLS8qIFNSUyBTdHVkaW8gU291bmQgM0QgZW5kICovCi0jZW5kaWYgLypfQVBSX0FVRElPX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYXVkaW9fY2FsX3V0aWxzLmggYi9pbmNsdWRlL3NvdW5kL2F1ZGlvX2NhbF91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjhiM2JkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvYXVkaW9fY2FsX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2lmbmRlZiBfQVVESU9fQ0FMX1VUSUxTX0gKLSNkZWZpbmUgX0FVRElPX0NBTF9VVElMU19ICi0KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oPgotI2luY2x1ZGUgImF1ZGlvX2NhbGlicmF0aW9uLmgiCi0KLXN0cnVjdCBjYWxfZGF0YSB7Ci0Jc2l6ZV90CQlzaXplOwotCXZvaWQJCSprdmFkZHI7Ci0JcGh5c19hZGRyX3QJcGFkZHI7Ci19OwotCi1zdHJ1Y3QgbWVtX21hcF9kYXRhIHsKLQlzaXplX3QJCQltYXBfc2l6ZTsKLQlpbnQzMl90CQkJcTZtYXBfaGFuZGxlOwotCWludDMyX3QJCQlpb25fbWFwX2hhbmRsZTsKLQlzdHJ1Y3QgaW9uX2NsaWVudAkqaW9uX2NsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZQkqaW9uX2hhbmRsZTsKLX07Ci0KLXN0cnVjdCBjYWxfYmxvY2tfZGF0YSB7Ci0Jc2l6ZV90CQkJY2xpZW50X2luZm9fc2l6ZTsKLQl2b2lkCQkJKmNsaWVudF9pbmZvOwotCXZvaWQJCQkqY2FsX2luZm87Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBjYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IG1lbV9tYXBfZGF0YQltYXBfZGF0YTsKLQlpbnQzMl90CQkJYnVmZmVyX251bWJlcjsKLX07Ci0KLXN0cnVjdCBjYWxfdXRpbF9jYWxsYmFja3MgewotCWludCAoKm1hcF9jYWwpCi0JCShpbnQzMl90IGNhbF90eXBlLCBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayk7Ci0JaW50ICgqdW5tYXBfY2FsKQotCQkoaW50MzJfdCBjYWxfdHlwZSwgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spOwotCWJvb2wgKCptYXRjaF9ibG9jaykKLQkJKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLCB2b2lkICp1c2VyX2RhdGEpOwotfTsKLQotc3RydWN0IGNhbF90eXBlX2luZm8gewotCXN0cnVjdCBhdWRpb19jYWxfcmVnCQlyZWc7Ci0Jc3RydWN0IGNhbF91dGlsX2NhbGxiYWNrcwljYWxfdXRpbF9jYWxsYmFja3M7Ci19OwotCi1zdHJ1Y3QgY2FsX3R5cGVfZGF0YSB7Ci0Jc3RydWN0IGNhbF90eXBlX2luZm8JCWluZm87Ci0Jc3RydWN0IG11dGV4CQkJbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQljYWxfYmxvY2tzOwotfTsKLQotCi0vKiB0byByZWdpc3RlciAmIGRlZ3JlZ2lzdGVyIHdpdGggY2FsIHV0aWwgZHJpdmVyICovCi1pbnQgY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoaW50IG51bV9jYWxfdHlwZXMsCi0JCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlLAotCQkJc3RydWN0IGNhbF90eXBlX2luZm8gKmluZm8pOwotdm9pZCBjYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoaW50IG51bV9jYWxfdHlwZXMsCi0JCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlKTsKLQotLyogY29tbW9uIGZ1bmN0aW9ucyBmb3IgY2FsbGJhY2tzICovCi1pbnQgY2FsX3V0aWxzX2FsbG9jX2NhbChzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhLAotCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLAotCQkJc2l6ZV90IGNsaWVudF9pbmZvX3NpemUsIHZvaWQgKmNsaWVudF9pbmZvKTsKLWludCBjYWxfdXRpbHNfZGVhbGxvY19jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSk7Ci1pbnQgY2FsX3V0aWxzX3NldF9jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKLQkJCXNpemVfdCBjbGllbnRfaW5mb19zaXplLCB2b2lkICpjbGllbnRfaW5mbyk7Ci0KLS8qIHVzZSBmb3IgU1NSICovCi12b2lkIGNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKGludCBudW1fY2FsX3R5cGVzLAotCQkJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlKTsKLQotCi0vKiBjb21tb24gbWF0Y2hpbmcgZnVuY3Rpb25zIHVzZWQgdG8gYWRkIGJsb2NrcyAqLwotYm9vbCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywKLQkJCQkJdm9pZCAqdXNlcl9kYXRhKTsKLQotLyogY29tbW9uIG1hdGNoaW5nIGZ1bmN0aW9ucyB0byBmaW5kIGNhbCBibG9ja3MgKi8KLXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSk7Ci0KLS8qIFNpemUgb2YgY2FsaWJyYXRpb24gc3BlY2lmaWMgZGF0YSAqLwotc2l6ZV90IGdldF9jYWxfaW5mb19zaXplKGludDMyX3QgY2FsX3R5cGUpOwotc2l6ZV90IGdldF91c2VyX2NhbF90eXBlX3NpemUoaW50MzJfdCBjYWxfdHlwZSk7Ci0KLS8qIFZlcnNpb24gb2YgdGhlIGNhbCB0eXBlKi8KLWludDMyX3QgY2FsX3V0aWxzX2dldF9jYWxfdHlwZV92ZXJzaW9uKHZvaWQgKmNhbF90eXBlX2RhdGEpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2F1ZGlvX2NhbGlicmF0aW9uLmggYi9pbmNsdWRlL3NvdW5kL2F1ZGlvX2NhbGlicmF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWNmZjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9hdWRpb19jYWxpYnJhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaWZuZGVmIF9BVURJT19DQUxJQlJBVElPTl9ICi0jZGVmaW5lIF9BVURJT19DQUxJQlJBVElPTl9ICi0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9fY2FsaWJyYXRpb24uaD4KLQotLyogVXNlZCBieSBkcml2ZXIgaW4gYnVmZmVyX251bWJlciBmaWVsZCB0byBub3RpZnkgY2xpZW50Ci0gKiBUbyB1cGRhdGUgYWxsIGJsb2NrcywgZm9yIGV4YW1wbGU6IGZyZWVpbmcgYWxsIG1lbW9yeQotICovCi0jZGVmaW5lIEFMTF9DQUxfQkxPQ0tTCQktMQotCi0KLXN0cnVjdCBhdWRpb19jYWxfY2FsbGJhY2tzIHsKLQlpbnQgKCphbGxvYykoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqZGVhbGxvYykoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqcHJlX2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqc2V0X2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqZ2V0X2NhbCkoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqcG9zdF9jYWwpKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9yZWcgewotCWludDMyX3QJCQkJY2FsX3R5cGU7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MJY2FsbGJhY2tzOwotfTsKLQotaW50IGF1ZGlvX2NhbF9yZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKTsKLWludCBhdWRpb19jYWxfZGVyZWdpc3RlcihpbnQgbnVtX2NhbF90eXBlcywgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2F1ZGlvX3NsaW1zbGF2ZS5oIGIvaW5jbHVkZS9zb3VuZC9hdWRpb19zbGltc2xhdmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YTU1Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL2F1ZGlvX3NsaW1zbGF2ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI2lmbmRlZiBfX0FVRElPX1NMSU1TTEFWRV9IX18KLSNkZWZpbmUgX19BVURJT19TTElNU0xBVkVfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgQVVESU9fU0xJTVNMQVZFX0lPQ1RMX05BTUUgImF1ZGlvX3NsaW1zbGF2ZSIKLSNkZWZpbmUgQVVESU9fU0xJTVNMQVZFX01BR0lDICdTJwotCi0jZGVmaW5lIEFVRElPX1NMSU1TTEFWRV9JT0NUTF9VTlZPVEUJX0lPKEFVRElPX1NMSU1TTEFWRV9NQUdJQywgMHgwMCkKLSNkZWZpbmUgQVVESU9fU0xJTVNMQVZFX0lPQ1RMX1ZPVEUJX0lPKEFVRElPX1NMSU1TTEFWRV9NQUdJQywgMHgwMSkKLQotZW51bSB7Ci0JQVVESU9fU0xJTVNMQVZFX1VOVk9URSwKLQlBVURJT19TTElNU0xBVkVfVk9URQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2NwZV9jbWkuaCBiL2luY2x1ZGUvc291bmQvY3BlX2NtaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmY4M2U3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvY3BlX2NtaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19DUEVfQ01JX0hfXwotI2RlZmluZSBfX0NQRV9DTUlfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jZGVmaW5lIENQRV9BRkVfUE9SVF8xX1RYIDEKLSNkZWZpbmUgQ1BFX0FGRV9QT1JUXzNfVFggMwotI2RlZmluZSBDUEVfQUZFX1BPUlRfSURfMl9PVVQgMHgwMgotI2RlZmluZSBDTUlfSU5CQU5EX01FU1NBR0VfU0laRSAxMjcKLQotLyoKLSAqIE11bHRpcGxlIG1hZCB0eXBlcyBjYW4gYmUgc3VwcG9ydGVkIGF0IG9uY2UuCi0gKiB0aGVzZSB2YWx1ZXMgY2FuIGJlIE9SJ2VkIHRvIGZvcm0gdGhlIHNldCBvZgotICogc3VwcG9ydGVkIG1hZCB0eXBlcwotICovCi0jZGVmaW5lIE1BRF9UWVBFX0FVRElPICgxIDw8IDApCi0jZGVmaW5lIE1BRF9UWVBFX0JFQUNPTiAoMSA8PCAxKQotI2RlZmluZSBNQURfVFlQRV9VTFRSQVNORCAoMSA8PCAyKQotCi0vKiBDb3JlIHNlcnZpY2UgY29tbWFuZCBvcGNvZGVzICovCi0jZGVmaW5lIENQRV9DT1JFX1NWQ19DTURfU0hBUkVEX01FTV9BTExPQwkoMHgzMDAxKQotI2RlZmluZSBDUEVfQ09SRV9TVkNfQ01EUlNQX1NIQVJFRF9NRU1fQUxMT0MJKDB4MzAwMikKLSNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0NNRF9TSEFSRURfTUVNX0RFQUxMT0MJKDB4MzAwMykKLSNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0NNRF9EUkFNX0FDQ0VTU19SRVEJKDB4MzAwNCkKLSNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0VWRU5UX1NZU1RFTV9CT09UCQkoMHgzMDA1KQotLyogY29yZSBzZXJ2aWNlIGNvbW1hbmQgb3Bjb2RlcyBmb3IgV0NEOTMzNSAqLwotI2RlZmluZSBDUEVfQ09SRV9TVkNfQ01EX0NGR19DTEtfUExBTgkJKDB4MzAwNikKLSNkZWZpbmUgQ1BFX0NPUkVfU1ZDX0NNRF9DTEtfRlJFUV9SRVFVRVNUCSgweDMwMDcpCi0KLSNkZWZpbmUgQ1BFX0JPT1RfU1VDQ0VTUyAweDAwCi0jZGVmaW5lIENQRV9CT09UX0ZBSUxFRCAweDAxCi0KLSNkZWZpbmUgQ1BFX0NPUkVfVkVSU0lPTl9TWVNURU1fQk9PVF9FVkVOVCAweDAxCi0KLS8qIExTTSBTZXJ2aWNlIGNvbW1hbmQgb3Bjb2RlcyAqLwotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX09QRU5fVFgJCSgweDIwMDApCi0jZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUwkJKDB4MjAwMSkKLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9TT1VORF9NT0RFTCAoMHgyMDAyKQotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX0RFUkVHSVNURVJfU09VTkRfTU9ERUwgKDB4MjAwMykKLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TVEFSVAkJKDB4MjAwNCkKLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TVE9QCQkoMHgyMDA1KQotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMiAoMHgyMDA2KQotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX0NMT1NFX1RYCQkoMHgyMDA3KQotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fQUxMT0MJKDB4MjAwOCkKLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRFJTUF9TSEFSRURfTUVNX0FMTE9DICgweDIwMDkpCi0jZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfU0hBUkVEX01FTV9ERUFMTE9DCSgweDIwMEEpCi0jZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfVFhfQlVGRl9PVVRQVVRfQ09ORklHICgweDIwMGYpCi0jZGVmaW5lIENQRV9MU01fU0VTU0lPTl9DTURfT1BFTl9UWF9WMgkJKDB4MjAwRCkKLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyCSgweDIwMEUpCi0KLS8qIExTTSBTZXJ2aWNlIG1vZHVsZSBhbmQgcGFyYW0gSURzICovCi0jZGVmaW5lIENQRV9MU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUAkJKDB4MDAwMTJDMDApCi0jZGVmaW5lIENQRV9MU01fTU9EVUxFX0lEX1ZPSUNFX1dBS0VVUF9WMgkoMHgwMDAxMkMwRCkKLSNkZWZpbmUgQ1BFX0xTTV9NT0RVTEVfRlJBTUVXT1JLCQkoMHgwMDAxMkMwRSkKLQotI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQgKDB4MDAwMTJDMDEpCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfT1BFUkFUSU9OX01PREUJCSgweDAwMDEyQzAyKQotI2RlZmluZSBDUEVfTFNNX1BBUkFNX0lEX0dBSU4JCQkoMHgwMDAxMkMwMykKLSNkZWZpbmUgQ1BFX0xTTV9QQVJBTV9JRF9DT05ORUNUX1RPX1BPUlQJKDB4MDAwMTJDMDQpCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfTUlOX0NPTkZJREVOQ0VfTEVWRUxTCSgweDAwMDEyQzA3KQotCi0vKiBMU00gTEFCIGNvbW1hbmQgb3Bjb2RlcyAqLwotI2RlZmluZSBDUEVfTFNNX1NFU1NJT05fQ01EX0VPQgkJMHgwMDAwMjAwQgotI2RlZmluZSBDUEVfTFNNX01PRFVMRV9JRF9MQUIJCTB4MDAwMTJDMDgKLS8qIHVzZWQgZm9yIGVuYWJsZS9kaXNhYmxlIGxhYiovCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfTEFCX0VOQUJMRQkweDAwMDEyQzA5Ci0vKiB1c2VkIGZvciBUIGluIExBQiBjb25maWcgRFNQIGludGVybmFsIGJ1ZmZlciovCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfTEFCX0NPTkZJRwkweDAwMDEyQzBBCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfUkVHSVNURVJfU09VTkRfTU9ERUwJKDB4MDAwMTJDMTQpCi0jZGVmaW5lIENQRV9MU01fUEFSQU1fSURfREVSRUdJU1RFUl9TT1VORF9NT0RFTAkoMHgwMDAxMkMxNSkKLSNkZWZpbmUgQ1BFX0xTTV9QQVJBTV9JRF9NRURJQV9GTVQJCSgweDAwMDEyQzFFKQotCi0vKiBBRkUgU2VydmljZSBjb21tYW5kIG9wY29kZXMgKi8KLSNkZWZpbmUgQ1BFX0FGRV9QT1JUX0NNRF9TVEFSVAkJCSgweDEwMDEpCi0jZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfU1RPUAkJCSgweDEwMDIpCi0jZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfU1VTUEVORAkJKDB4MTAwMykKLSNkZWZpbmUgQ1BFX0FGRV9QT1JUX0NNRF9SRVNVTUUJCQkoMHgxMDA0KQotI2RlZmluZSBDUEVfQUZFX1BPUlRfQ01EX1NIQVJFRF9NRU1fQUxMT0MJKDB4MTAwNSkKLSNkZWZpbmUgQ1BFX0FGRV9QT1JUX0NNRFJTUF9TSEFSRURfTUVNX0FMTE9DCSgweDEwMDYpCi0jZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfU0hBUkVEX01FTV9ERUFMTE9DCSgweDEwMDcpCi0jZGVmaW5lIENQRV9BRkVfUE9SVF9DTURfR0VORVJJQ19DT05GSUcJCSgweDEwMDgpCi0jZGVmaW5lIENQRV9BRkVfU1ZDX0NNRF9MQUJfTU9ERQkJKDB4MTAwOSkKLQotLyogQUZFIFNlcnZpY2UgbW9kdWxlIGFuZCBwYXJhbSBJRHMgKi8KLSNkZWZpbmUgQ1BFX0FGRV9DTURfU0VUX1BBUkFNCQkJKDB4MTAwMCkKLSNkZWZpbmUgQ1BFX0FGRV9NT0RVTEVfSURfU1dfTUFECQkoMHgwMDAxMDIyRCkKLSNkZWZpbmUgQ1BFX0FGRV9QQVJBTV9JRF9TV19NQURfQ0ZHCQkoMHgwMDAxMDIyRSkKLSNkZWZpbmUgQ1BFX0FGRV9QQVJBTV9JRF9TVk1fTU9ERUwJCSgweDAwMDEwMjJGKQotCi0jZGVmaW5lIENQRV9BRkVfTU9EVUxFX0hXX01BRAkJCSgweDAwMDEwMjMwKQotI2RlZmluZSBDUEVfQUZFX1BBUkFNX0lEX0hXX01BRF9DVEwJCSgweDAwMDEwMjMyKQotI2RlZmluZSBDUEVfQUZFX1BBUkFNX0lEX0hXX01BRF9DRkcJCSgweDAwMDEwMjMxKQotCi0jZGVmaW5lIENQRV9BRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0UJKDB4MDAwMTAyMEMpCi0jZGVmaW5lIENQRV9BRkVfUEFSQU1fSURfR0VORVJJQ19QT1JUX0NPTkZJRwkoMHgwMDAxMDI1MykKLQotI2RlZmluZSBDUEVfQ01JX0JBU0lDX1JTUF9PUENPREUJKDB4MDAwMSkKLSNkZWZpbmUgQ1BFX0hEUl9NQVhfUExEX1NJWkUJKDB4N0YpCi0KLSNkZWZpbmUgQ01JX09CTV9GTEFHX0lOX0JBTkQJMAotI2RlZmluZSBDTUlfT0JNX0ZMQUdfT1VUX0JBTkQJMQotCi0jZGVmaW5lIENNSV9TSE1FTV9BTExPQ19GQUlMRUQgMHhmZgotCi0vKgotICogRnV0dXJlIFNlcnZpY2UgSUQncyBjYW4gYmUgYWRkZWQgb25lIGxpbmUKLSAqIGJlZm9yZSB0aGUgQ01JX0NQRV9TRVJWSUNFX0lEX01BWAotICovCi1lbnVtIHsKLQlDTUlfQ1BFX1NFUlZJQ0VfSURfTUlOID0gMCwKLQlDTUlfQ1BFX0NPUkVfU0VSVklDRV9JRCwKLQlDTUlfQ1BFX0FGRV9TRVJWSUNFX0lELAotCUNNSV9DUEVfTFNNX1NFUlZJQ0VfSUQsCi0JQ01JX0NQRV9TRVJWSUNFX0lEX01BWCwKLX07Ci0KLSNkZWZpbmUgQ1BFX0xTTV9TRVNTSU9OX0lEX01BWCAyCi0KLSNkZWZpbmUgSVNfVkFMSURfU0VTU0lPTl9JRChzX2lkKSBcCi0JKHNfaWQgPD0gQ1BFX0xTTV9TRVNTSU9OX0lEX01BWCkKLQotI2RlZmluZSBJU19WQUxJRF9TRVJWSUNFX0lEKHNfaWQpIFwKLQkoc19pZCA+IENNSV9DUEVfU0VSVklDRV9JRF9NSU4gJiYgXAotCSBzX2lkIDwgQ01JX0NQRV9TRVJWSUNFX0lEX01BWCkKLQotI2RlZmluZSBJU19WQUxJRF9QTERfU0laRShwX3NpemUpIFwKLQkocF9zaXplIDw9IENQRV9IRFJfTUFYX1BMRF9TSVpFKQotCi0jZGVmaW5lIENNSV9IRFJfU0VUX09QQ09ERShoZHIsIGNtZCkgKGhkci0+b3Bjb2RlID0gY21kKQotCi0KLSNkZWZpbmUgQ01JX0hEUl9TRVQoaGRyX2luZm8sIG1hc2ssIHNoaWZ0LCB2YWx1ZSkgXAotCQkoaGRyX2luZm8gPSAoKChoZHJfaW5mbykgJiB+KG1hc2spKSB8IFwKLQkJCSgodmFsdWUgPDwgc2hpZnQpICYgbWFzaykpKQotCi0jZGVmaW5lIFNWQ19JRF9TSElGVCA0Ci0jZGVmaW5lIFNWQ19JRF9NQVNLICgweDA3IDw8IFNWQ19JRF9TSElGVCkKLQotI2RlZmluZSBTRVNTSU9OX0lEX1NISUZUIDAKLSNkZWZpbmUgU0VTU0lPTl9JRF9NQVNLICgweDBGIDw8IFNFU1NJT05fSURfU0hJRlQpCi0KLSNkZWZpbmUgUEFZTERfU0laRV9TSElGVCAwCi0jZGVmaW5lIFBBWUxEX1NJWkVfTUFTSyAoMHg3RiA8PCBQQVlMRF9TSVpFX1NISUZUKQotCi0jZGVmaW5lIE9CTV9GTEFHX1NISUZUIDcKLSNkZWZpbmUgT0JNX0ZMQUdfTUFTSyAoMSA8PCBPQk1fRkxBR19TSElGVCkKLQotI2RlZmluZSBWRVJTSU9OX1NISUZUIDcKLSNkZWZpbmUgVkVSU0lPTl9NQVNLICgxIDw8IFZFUlNJT05fU0hJRlQpCi0KLSNkZWZpbmUgQ01JX0hEUl9TRVRfU0VSVklDRShoZHIsIHNfaWQpIFwKLQkJQ01JX0hEUl9TRVQoaGRyLT5oZHJfaW5mbywgU1ZDX0lEX01BU0ssXAotCQkJICAgIFNWQ19JRF9TSElGVCwgc19pZCkKLSNkZWZpbmUgQ01JX0hEUl9HRVRfU0VSVklDRShoZHIpIFwKLQkJKChoZHItPmhkcl9pbmZvID4+IFNWQ19JRF9TSElGVCkgJiBcCi0JCQkoU1ZDX0lEX01BU0sgPj4gU1ZDX0lEX1NISUZUKSkKLQotCi0jZGVmaW5lIENNSV9IRFJfU0VUX1NFU1NJT04oaGRyLCBzX2lkKSBcCi0JCUNNSV9IRFJfU0VUKGhkci0+aGRyX2luZm8sIFNFU1NJT05fSURfTUFTSyxcCi0JCQkgICAgU0VTU0lPTl9JRF9TSElGVCwgc19pZCkKLQotI2RlZmluZSBDTUlfSERSX0dFVF9TRVNTSU9OX0lEKGhkcikgXAotCQkoKGhkci0+aGRyX2luZm8gPj4gU0VTU0lPTl9JRF9TSElGVCkgJiBcCi0JCQkgKFNFU1NJT05fSURfTUFTSyA+PiBTRVNTSU9OX0lEX1NISUZUKSkKLQotI2RlZmluZSBDTUlfR0VUX0hFQURFUihtc2cpCSgoc3RydWN0IGNtaV9oZHIgKikobXNnKSkKLSNkZWZpbmUgQ01JX0dFVF9QQVlMT0FEKG1zZykJKCh2b2lkICopKENNSV9HRVRfSEVBREVSKG1zZykgKyAxKSkKLSNkZWZpbmUgQ01JX0dFVF9PUENPREUobXNnKQkoQ01JX0dFVF9IRUFERVIobXNnKS0+b3Bjb2RlKQotCi0jZGVmaW5lIENNSV9IRFJfU0VUX1ZFUlNJT04oaGRyLCB2ZXIpIFwKLQkJQ01JX0hEUl9TRVQoaGRyLT5oZHJfaW5mbywgVkVSU0lPTl9NQVNLLCBcCi0JCQkJVkVSU0lPTl9TSElGVCwgdmVyKQotCi0jZGVmaW5lIENNSV9IRFJfU0VUX1BBWUxPQURfU0laRShoZHIsIHBfc2l6ZSkgXAotCQlDTUlfSERSX1NFVChoZHItPnBsZF9pbmZvLCBQQVlMRF9TSVpFX01BU0ssIFwKLQkJCSAgICBQQVlMRF9TSVpFX1NISUZULCBwX3NpemUpCi0KLSNkZWZpbmUgQ01JX0hEUl9HRVRfUEFZTE9BRF9TSVpFKGhkcikgXAotCQkoKGhkci0+cGxkX2luZm8gPj4gUEFZTERfU0laRV9TSElGVCkgJiBcCi0JCQkoUEFZTERfU0laRV9NQVNLID4+IFBBWUxEX1NJWkVfU0hJRlQpKQotCi0jZGVmaW5lIENNSV9IRFJfU0VUX09CTShoZHIsIG9ibV9mbGFnKSBcCi0JCUNNSV9IRFJfU0VUKGhkci0+cGxkX2luZm8sIE9CTV9GTEFHX01BU0ssIFwKLQkJCSAgICBPQk1fRkxBR19TSElGVCwgb2JtX2ZsYWcpCi0KLSNkZWZpbmUgQ01JX0hEUl9HRVRfT0JNX0ZMQUcoaGRyKSBcCi0JKChoZHItPnBsZF9pbmZvID4+IE9CTV9GTEFHX1NISUZUKSAmIFwKLQkJKE9CTV9GTEFHX01BU0sgPj4gT0JNX0ZMQUdfU0hJRlQpKQotCi1zdHJ1Y3QgY21pX2hkciB7Ci0JLyoKLQkgKiBiaXRzIDA6MyBpcyBzZXNzaW9uIGlkCi0JICogYml0cyA0OjYgaXMgc2VydmljZSBpZAotCSAqIGJpdCA3IGlzIHRoZSB2ZXJzaW9uIGZsYWcKLQkgKi8KLQl1OCBoZHJfaW5mbzsKLQotCS8qCi0JICogYml0cyAwOjYgaXMgcGF5bG9hZCBzaXplIGluIGNhc2Ugb2YgaW4tYmFuZCBtZXNzYWdlCi0JICogYml0cyAwOjYgaXMgc2l6ZSAoT0JNIG1lc3NhZ2Ugc2l6ZSkKLQkgKiBiaXQgNyBpcyB0aGUgT0JNIGZsYWcKLQkgKi8KLQl1OCBwbGRfaW5mbzsKLQotCS8qIDE2IGJpdCBjb21tYW5kIG9wY29kZSAqLwotCXUxNiBvcGNvZGU7Ci19IF9fcGFja2VkOwotCi11bmlvbiBjcGVfYWRkciB7Ci0JdTY0IG1zd19sc3c7Ci0Jdm9pZCAqa3ZhZGRyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNtaV9vYm0gewotCXUzMiB2ZXJzaW9uOwotCXUzMiBzaXplOwotCXVuaW9uIGNwZV9hZGRyIGRhdGFfcHRyOwotCXUzMiBtZW1faGFuZGxlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNtaV9vYm1fbXNnIHsKLQlzdHJ1Y3QgY21pX2hkciBoZHI7Ci0Jc3RydWN0IGNtaV9vYm0gcGxkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNtaV9jb3JlX3N2Y19ldmVudF9zeXN0ZW1fYm9vdCB7Ci0JdTggc3RhdHVzOwotCXU4IHZlcnNpb247Ci0JdTE2IHNmcl9idWZmX3NpemU7Ci0JdTMyIHNmcl9idWZmX2FkZHJlc3M7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9zaGFyZWRfbWVtX2FsbG9jIHsKLQl1MzIgc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjbWlfY29yZV9zdmNfY21kcnNwX3NoYXJlZF9tZW1fYWxsb2MgewotCXUzMiBhZGRyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRfY2xrX2ZyZXFfcmVxdWVzdCB7Ci0JdTMyIGNsa19mcmVxOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNtaV9tc2dfdHJhbnNwb3J0IHsKLQl1MzIgc2l6ZTsKLQl1MzIgYWRkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjbWlfYmFzaWNfcnNwX3Jlc3VsdCB7Ci0JdTggc3RhdHVzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHggewotCXN0cnVjdCBjbWlfaGRyCWhkcjsKLQl1MTYgYXBwX2lkOwotCXUxNiByZXNlcnZlZDsKLQl1MzIgc2FtcGxpbmdfcmF0ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4X3YyIHsKLQlzdHJ1Y3QgY21pX2hkciBoZHI7Ci0JdTMyIHRvcG9sb2d5X2lkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9jbWRfc2htZW1fYWxsb2MgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQl1MzIgc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfY21kcnNwX3NobWVtX2FsbG9jIHsKLQlzdHJ1Y3QgY21pX2hkciBoZHI7Ci0JdTMyIGFkZHI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2NtZF9zaG1lbV9kZWFsbG9jIHsKLQlzdHJ1Y3QgY21pX2hkcgloZHI7Ci0JdTMyIGFkZHI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2xzbV9ldmVudF9kZXRlY3RfdjIgewotCXN0cnVjdCBjbWlfaGRyCWhkcjsKLQl1OCBkZXRlY3Rpb25fc3RhdHVzOwotCXU4IHNpemU7Ci0JdTggcGF5bG9hZFswXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfbHNtX3BzaXplX3JlcyB7Ci0JdTE2IHBhcmFtX3NpemU7Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotdW5pb24gY3BlX2xzbV9wYXJhbV9zaXplIHsKLQl1MzIgcGFyYW1fc2l6ZTsKLQlzdHJ1Y3QgY3BlX2xzbV9wc2l6ZV9yZXMgc3I7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgewotCXUzMiBtb2R1bGVfaWQ7Ci0JdTMyIHBhcmFtX2lkOwotCXVuaW9uIGNwZV9sc21fcGFyYW1fc2l6ZSBwX3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2xzbV9wYXJhbV9lcGRfdGhyZXMgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcnNpb247Ci0JdTMyIGVwZF9iZWdpbjsKLQl1MzIgZXBkX2VuZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfbHNtX3BhcmFtX2dhaW4gewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcnNpb247Ci0JdTE2IGdhaW47Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9hZmVfaHdfbWFkX2N0cmwgewotCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSBwYXJhbTsKLQl1MzIgbWlub3JfdmVyc2lvbjsKLQl1MTYgbWFkX3R5cGU7Ci0JdTE2IG1hZF9lbmFibGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2FmZV9wb3J0X2NmZyB7Ci0Jc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOwotCXUzMiBtaW5vcl92ZXJzaW9uOwotCXUxNiBiaXRfd2lkdGg7Ci0JdTE2IG51bV9jaGFubmVsczsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2FmZV9jbWRfcG9ydF9jZmcgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQl1OCBiaXRfd2lkdGg7Ci0JdTggbnVtX2NoYW5uZWxzOwotCXUxNiBidWZmZXJfc2l6ZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2FmZV9wYXJhbXMgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX2FmZV9od19tYWRfY3RybCBod19tYWRfY3RybDsKLQlzdHJ1Y3QgY3BlX2FmZV9wb3J0X2NmZyBwb3J0X2NmZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfYWZlX3N2Y19jbWRfbW9kZSB7Ci0Jc3RydWN0IGNtaV9oZHIgaGRyOwotCXU4IG1vZGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2xzbV9wYXJhbV9vcG1vZGUgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcnNpb247Ci0JdTE2IG1vZGU7Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9sc21fcGFyYW1fY29ubmVjdHBvcnQgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcnNpb247Ci0JdTE2IGFmZV9wb3J0X2lkOwotCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBUaGlzIGNhbm5vdCBiZSBzZW50IHRvIENQRSBhcyBpcywKLSAqIG5lZWQgdG8gYXBwZW5kIHRoZSBjb25mX2xldmVscyBkeW5hbWljYWxseQotICovCi1zdHJ1Y3QgY3BlX2xzbV9jb25mX2xldmVsIHsKLQlzdHJ1Y3QgY21pX2hkciBoZHI7Ci0Jc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOwotCXU4IG51bV9hY3RpdmVfbW9kZWxzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9sc21fb3V0cHV0X2Zvcm1hdF9jZmcgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQl1OCBmb3JtYXQ7Ci0JdTggcGFja2luZzsKLQl1OCBkYXRhX3BhdGhfZXZlbnRzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9sc21fbGFiX2VuYWJsZSB7Ci0Jc3RydWN0IGNwZV9wYXJhbV9kYXRhIHBhcmFtOwotCXUxNiBlbmFibGU7Ci0JdTE2IHJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGNwZV9sc21fY29udHJvbF9sYWIgewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX2xzbV9sYWJfZW5hYmxlIGxhYl9lbmFibGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2xzbV9sYWJfY29uZmlnIHsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcjsKLQl1MzIgbGF0ZW5jeTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjcGVfbHNtX2xhYl9sYXRlbmN5X2NvbmZpZyB7Ci0Jc3RydWN0IGNtaV9oZHIgaGRyOwotCXN0cnVjdCBjcGVfbHNtX2xhYl9jb25maWcgbGF0ZW5jeV9jZmc7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3BlX2xzbV9tZWRpYV9mbXRfcGFyYW0gewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgcGFyYW07Ci0JdTMyIG1pbm9yX3ZlcnNpb247Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUxNiBudW1fY2hhbm5lbHM7Ci0JdTE2IGJpdF93aWR0aDsKLX0gX19wYWNrZWQ7Ci0KLQotI2RlZmluZSBDUEVfUEFSQU1fTFNNX0xBQl9MQVRFTkNZX1NJWkUgKFwKLQkJCQlzaXplb2Yoc3RydWN0IGNwZV9sc21fbGFiX2xhdGVuY3lfY29uZmlnKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotI2RlZmluZSBQQVJBTV9TSVpFX0xTTV9MQVRFTkNZX1NJWkUgKFwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2xhYl9jb25maWcpIC0gXAotCQkJCQlzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKLSNkZWZpbmUgQ1BFX1BBUkFNX1NJWkVfTFNNX0xBQl9DT05UUk9MIChcCi0JCQkJc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2NvbnRyb2xfbGFiKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotI2RlZmluZSBQQVJBTV9TSVpFX0xTTV9DT05UUk9MX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9sYWJfZW5hYmxlKSAtIFwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCi0jZGVmaW5lIFBBUkFNX1NJWkVfQUZFX0hXX01BRF9DVFJMIChzaXplb2Yoc3RydWN0IGNwZV9hZmVfaHdfbWFkX2N0cmwpIC0gXAotCQkJCXNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQotI2RlZmluZSBQQVJBTV9TSVpFX0FGRV9QT1JUX0NGRyAoc2l6ZW9mKHN0cnVjdCBjcGVfYWZlX3BvcnRfY2ZnKSAtIFwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCi0jZGVmaW5lIENQRV9BRkVfUEFSQU1fUEFZTE9BRF9TSVpFIChzaXplb2Yoc3RydWN0IGNwZV9hZmVfcGFyYW1zKSAtIFwKLQkJCQlzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotCi0jZGVmaW5lIE9QRU5fQ01EX1BBWUxPQURfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4KSAtIFwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotI2RlZmluZSBPUEVOX1YyX0NNRF9QQVlMT0FEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jbWRfb3Blbl90eF92MikgLSBcCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKLSNkZWZpbmUgU0hNRU1fQUxMT0NfQ01EX1BMRF9TSVpFIChzaXplb2Yoc3RydWN0IGNwZV9jbWRfc2htZW1fYWxsb2MpIC0gXAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCi0KLSNkZWZpbmUgU0hNRU1fREVBTExPQ19DTURfUExEX1NJWkUgKHNpemVvZihzdHJ1Y3QgY3BlX2NtZF9zaG1lbV9kZWFsbG9jKSAtIFwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotI2RlZmluZSBPVVRfRk1UX0NGR19DTURfUEFZTE9BRF9TSVpFICggXAotCQlzaXplb2Yoc3RydWN0IGNwZV9sc21fb3V0cHV0X2Zvcm1hdF9jZmcpIC0gXAotCQlzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotCi0jZGVmaW5lIENQRV9BRkVfQ01EX1BPUlRfQ0ZHX1BBWUxPQURfU0laRSBcCi0JCShzaXplb2Yoc3RydWN0IGNwZV9hZmVfY21kX3BvcnRfY2ZnKSAtIFwKLQkJIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCi0KLSNkZWZpbmUgQ1BFX0FGRV9DTURfTU9ERV9QQVlMT0FEX1NJWkUgXAotCQkoc2l6ZW9mKHN0cnVjdCBjcGVfYWZlX3N2Y19jbWRfbW9kZSkgLSBcCi0JCSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKQotI2RlZmluZSBDUEVfQ01EX0VQRF9USFJFU19QTERfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX3BhcmFtX2VwZF90aHJlcykgLSBcCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCi0jZGVmaW5lIENQRV9FUERfVEhSRVNfUEFSQU1fU0laRSAoKENQRV9DTURfRVBEX1RIUkVTX1BMRF9TSVpFKSAtIFwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQotI2RlZmluZSBDUEVfQ01EX09QTU9ERV9QTERfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX3BhcmFtX29wbW9kZSkgLSBcCi0JCQkJIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCi0jZGVmaW5lIENQRV9PUE1PREVfUEFSQU1fU0laRSAoKENQRV9DTURfT1BNT0RFX1BMRF9TSVpFKSAtXAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEpKQotI2RlZmluZSBDUEVfQ01EX0NPTk5FQ1RQT1JUX1BMRF9TSVpFIFwKLQkoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX3BhcmFtX2Nvbm5lY3Rwb3J0KSAtIFwKLQkgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKLSNkZWZpbmUgQ1BFX0NPTk5FQ1RQT1JUX1BBUkFNX1NJWkUgKChDUEVfQ01EX0NPTk5FQ1RQT1JUX1BMRF9TSVpFKSAtIFwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSkpCi0jZGVmaW5lIENQRV9DTURfR0FJTl9QTERfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX3BhcmFtX2dhaW4pIC0gXAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY21pX2hkcikpCi0jZGVmaW5lIENQRV9HQUlOX1BBUkFNX1NJWkUgKChDUEVfQ01EX0dBSU5fUExEX1NJWkUpIC0gXAotCQkJICAgICBzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKLSNkZWZpbmUgQ1BFX01FRElBX0ZNVF9QTERfU0laRSAoc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX21lZGlhX2ZtdF9wYXJhbSkgLSBcCi0JCQkJc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSkKLSNkZWZpbmUgQ1BFX01FRElBX0ZNVF9QQVJBTV9TSVpFICgoQ1BFX01FRElBX0ZNVF9QTERfU0laRSkgLSBcCi0JCQkJICBzaXplb2Yoc3RydWN0IGNwZV9wYXJhbV9kYXRhKSkKLSNlbmRpZiAvKiBfX0NQRV9DTUlfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2NwZV9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NwZV9jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWMyZmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9jcGVfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19DUEVfQ09SRV9IX18KLSNkZWZpbmUgX19DUEVfQ09SRV9IX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8c291bmQvbHNtX3BhcmFtcy5oPgotCi1lbnVtIHsKLQlDTURfSU5JVF9TVEFURSA9IDAsCi0JQ01EX1NFTlQsCi0JQ01EX1JFU1BfUkNWRCwKLX07Ci0KLWVudW0gd2NkX2NwZV9ldmVudCB7Ci0JV0NEX0NQRV9QUkVfRU5BQkxFID0gMSwKLQlXQ0RfQ1BFX1BPU1RfRU5BQkxFLAotCVdDRF9DUEVfUFJFX0RJU0FCTEUsCi0JV0NEX0NQRV9QT1NUX0RJU0FCTEUsCi19OwotCi1zdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgewotCXU4IHBvcnRfaWQ7Ci0JdTE2IGJpdF93aWR0aDsKLQl1MTYgbnVtX2NoYW5uZWxzOwotCXUzMiBzYW1wbGVfcmF0ZTsKLX07Ci0KLXN0cnVjdCBsc21fb3V0X2ZtdF9jZmcgewotCXU4IGZvcm1hdDsKLQl1OCBwYWNrX21vZGU7Ci0JdTggZGF0YV9wYXRoX2V2ZW50czsKLQl1OCB0cmFuc2Zlcl9tb2RlOwotfTsKLQotc3RydWN0IGxzbV9od19wYXJhbXMgewotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MTYgbnVtX2NoczsKLQl1MTYgYml0X3dpZHRoOwotfTsKLQotc3RydWN0IGNwZV9sc21fc2Vzc2lvbiB7Ci0JLyogc291bmQgbW9kZWwgcmVsYXRlZCAqLwotCXZvaWQgKnNuZF9tb2RlbF9kYXRhOwotCXU4ICpjb25mX2xldmVsczsKLQl2b2lkICpjbWlfcmVnX2hhbmRsZTsKLQotCS8qIENsaWVudHMgcHJpdmF0ZSBkYXRhICovCi0Jdm9pZCAqcHJpdl9kOwotCi0Jdm9pZCAoKmV2ZW50X2NiKSh2b2lkICpwcml2X2RhdGEsCi0JCQkgIHU4IGRldGVjdF9zdGF0dXMsCi0JCQkgIHU4IHNpemUsIHU4ICpwYXlsb2FkKTsKLQotCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9jb21wOwotCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyBhZmVfcG9ydF9jZmc7Ci0Jc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnIGFmZV9vdXRfcG9ydF9jZmc7Ci0Jc3RydWN0IG11dGV4IGxzbV9sb2NrOwotCi0JdTMyIHNuZF9tb2RlbF9zaXplOwotCXUzMiBsc21fbWVtX2hhbmRsZTsKLQl1MTYgY21kX2Vycl9jb2RlOwotCXU4IGlkOwotCXU4IG51bV9jb25maWRlbmNlX2xldmVsczsKLQl1MTYgYWZlX291dF9wb3J0X2lkOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbHNtX2xhYl90aHJlYWQ7Ci0JYm9vbCBzdGFydGVkOwotCi0JdTMyIGxhYl9lbmFibGU7Ci0Jc3RydWN0IGxzbV9vdXRfZm10X2NmZyBvdXRfZm10X2NmZzsKLQotCWJvb2wgaXNfdG9wb2xvZ3lfdXNlZDsKLX07Ci0KLXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgewotCWludCAoKmFmZV9zZXRfcGFyYW1zKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZywKLQkJCSAgICAgICBib29sIGFmZV9tYWRfY3RsKTsKLQotCWludCAoKmFmZV9wb3J0X3N0YXJ0KSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7Ci0KLQlpbnQgKCphZmVfcG9ydF9zdG9wKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7Ci0KLQlpbnQgKCphZmVfcG9ydF9zdXNwZW5kKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmNmZyk7Ci0KLQlpbnQgKCphZmVfcG9ydF9yZXN1bWUpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJICAgICAgIHN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqY2ZnKTsKLQotCWludCAoKmFmZV9wb3J0X2NtZF9jZmcpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqY2ZnKTsKLX07Ci0KLXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgewotCi0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKCpsc21fYWxsb2Nfc2Vzc2lvbikKLQkJCSh2b2lkICpjb3JlX2hhbmRsZSwgdm9pZCAqbHNtX3ByaXZfZCwKLQkJCSB2b2lkICgqZXZlbnRfY2IpKHZvaWQgKnByaXZfZGF0YSwKLQkJCQkJICAgdTggZGV0ZWN0X3N0YXR1cywKLQkJCQkJICAgdTggc2l6ZSwgdTggKnBheWxvYWQpKTsKLQotCWludCAoKmxzbV9kZWFsbG9jX3Nlc3Npb24pCi0JCSh2b2lkICpjb3JlX2hhbmRsZSwgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKLQotCWludCAoKmxzbV9vcGVuX3R4KSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICosIHUxNiwgdTE2KTsKLQotCWludCAoKmxzbV9jbG9zZV90eCkodm9pZCAqY29yZV9oYW5kbGUsCi0JCQkgICAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKik7Ci0KLQlpbnQgKCpsc21fc2htZW1fYWxsb2MpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKiwgdTMyIHNpemUpOwotCi0JaW50ICgqbHNtX3NobWVtX2RlYWxsb2MpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKLQotCWludCAoKmxzbV9yZWdpc3Rlcl9zbmRfbW9kZWwpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCSAgICAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICosCi0JCQkJICAgICAgIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlLCBib29sKTsKLQotCWludCAoKmxzbV9kZXJlZ2lzdGVyX3NuZF9tb2RlbCkodm9pZCAqY29yZV9oYW5kbGUsCi0JCQkJCSBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICopOwotCi0JaW50ICgqbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJICAgICAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pOwotCi0JaW50ICgqbHNtX3N0YXJ0KSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqKTsKLQotCWludCAoKmxzbV9zdG9wKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICopOwotCi0JaW50ICgqbHNtX2xhYl9jb250cm9sKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCSAgICAgICBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKLQotCWludCAoKmxhYl9jaF9zZXR1cCkodm9pZCAqY29yZV9oYW5kbGUsCi0JCQkJICAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkgICBlbnVtIHdjZF9jcGVfZXZlbnQgZXZlbnQpOwotCi0JaW50ICgqbHNtX3NldF9kYXRhKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCi0JCQllbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBkZXRlY3RfbW9kZSwKLQkJCWJvb2wgZGV0ZWN0X2ZhaWx1cmUpOwotCWludCAoKmxzbV9zZXRfZm10X2NmZykodm9pZCAqY29yZV9oYW5kbGUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKTsKLQlpbnQgKCpsc21fc2V0X29uZV9wYXJhbSkodm9pZCAqY29yZV9oYW5kbGUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvLAotCQkJdm9pZCAqZGF0YSwgdWludDMyX3QgcGFyYW1fdHlwZSk7Ci0Jdm9pZCAoKmxzbV9nZXRfc25kX21vZGVsX29mZnNldCkKLQkJKHZvaWQgKmNvcmVfaGFuZGxlLCBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICosCi0JCSBzaXplX3QgKm9mZnNldCk7Ci0JaW50ICgqbHNtX3NldF9tZWRpYV9mbXRfcGFyYW1zKSh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCQkgICAgICAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkgICAgICAgc3RydWN0IGxzbV9od19wYXJhbXMgKnBhcmFtKTsKLQlpbnQgKCpsc21fc2V0X3BvcnQpKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJICAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sIHZvaWQgKmRhdGEpOwotfTsKLQotaW50IHdjZF9jcGVfZ2V0X2xzbV9vcHMoc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wcyk7Ci1pbnQgd2NkX2NwZV9nZXRfYWZlX29wcyhzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzKTsKLXZvaWQgKndjZF9jcGVfZ2V0X2NvcmVfaGFuZGxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY3BlX2Vyci5oIGIvaW5jbHVkZS9zb3VuZC9jcGVfZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTU4MDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9jcGVfZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0NQRV9FUlJfXwotI2RlZmluZSBfX0NQRV9FUlJfXwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLQotLyogRVJST1IgQ09ERVMgKi8KLS8qIFN1Y2Nlc3MuIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHdpdGggbm8gZXJyb3JzLiAqLwotI2RlZmluZSBDUEVfRU9LICAgICAgICAgIDB4MDAwMDAwMDAKLS8qIEdlbmVyYWwgZmFpbHVyZS4gKi8KLSNkZWZpbmUgQ1BFX0VGQUlMRUQgICAgICAweDAwMDAwMDAxCi0vKiBCYWQgb3BlcmF0aW9uIHBhcmFtZXRlci4gKi8KLSNkZWZpbmUgQ1BFX0VCQURQQVJBTSAgICAweDAwMDAwMDAyCi0vKiBVbnN1cHBvcnRlZCByb3V0aW5lIG9yIG9wZXJhdGlvbi4gKi8KLSNkZWZpbmUgQ1BFX0VVTlNVUFBPUlRFRCAweDAwMDAwMDAzCi0vKiBVbnN1cHBvcnRlZCB2ZXJzaW9uLiAqLwotI2RlZmluZSBDUEVfRVZFUlNJT04gICAgIDB4MDAwMDAwMDQKLS8qIFVuZXhwZWN0ZWQgcHJvYmxlbSBlbmNvdW50ZXJlZC4gKi8KLSNkZWZpbmUgQ1BFX0VVTkVYUEVDVEVEICAweDAwMDAwMDA1Ci0vKiBVbmhhbmRsZWQgcHJvYmxlbSBvY2N1cnJlZC4gKi8KLSNkZWZpbmUgQ1BFX0VQQU5JQyAgICAgICAweDAwMDAwMDA2Ci0vKiBVbmFibGUgdG8gYWxsb2NhdGUgcmVzb3VyY2UuICovCi0jZGVmaW5lIENQRV9FTk9SRVNPVVJDRSAgMHgwMDAwMDAwNwotLyogSW52YWxpZCBoYW5kbGUuICovCi0jZGVmaW5lIENQRV9FSEFORExFICAgICAgMHgwMDAwMDAwOAotLyogT3BlcmF0aW9uIGlzIGFscmVhZHkgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBDUEVfRUFMUkVBRFkgICAgIDB4MDAwMDAwMDkKLS8qIE9wZXJhdGlvbiBpcyBub3QgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBDUEVfRU5PVFJFQURZICAgIDB4MDAwMDAwMEEKLS8qIE9wZXJhdGlvbiBpcyBwZW5kaW5nIGNvbXBsZXRpb24uICovCi0jZGVmaW5lIENQRV9FUEVORElORyAgICAgMHgwMDAwMDAwQgotLyogT3BlcmF0aW9uIGNvdWxkIG5vdCBiZSBhY2NlcHRlZCBvciBwcm9jZXNzZWQuICovCi0jZGVmaW5lIENQRV9FQlVTWSAgICAgICAgMHgwMDAwMDAwQwotLyogT3BlcmF0aW9uIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLiAqLwotI2RlZmluZSBDUEVfRUFCT1JURUQgICAgIDB4MDAwMDAwMEQKLS8qIE9wZXJhdGlvbiBwcmVlbXB0ZWQgYnkgYSBoaWdoZXIgcHJpb3JpdHkuICovCi0jZGVmaW5lIENQRV9FUFJFRU1QVEVEICAgMHgwMDAwMDAwRQotLyogT3BlcmF0aW9uIHJlcXVlc3RzIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KLSNkZWZpbmUgQ1BFX0VDT05USU5VRSAgICAweDAwMDAwMDBGCi0vKiBPcGVyYXRpb24gcmVxdWVzdHMgaW1tZWRpYXRlIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KLSNkZWZpbmUgQ1BFX0VJTU1FRElBVEUgICAweDAwMDAwMDEwCi0vKiBPcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkLiAqLwotI2RlZmluZSBDUEVfRU5PVElNUEwgICAgIDB4MDAwMDAwMTEKLS8qIE9wZXJhdGlvbiBuZWVkcyBtb3JlIGRhdGEgb3IgcmVzb3VyY2VzLiAqLwotI2RlZmluZSBDUEVfRU5FRURNT1JFICAgIDB4MDAwMDAwMTIKLS8qIE9wZXJhdGlvbiBkb2VzIG5vdCBoYXZlIG1lbW9yeS4gKi8KLSNkZWZpbmUgQ1BFX0VOT01FTU9SWSAgICAweDAwMDAwMDE0Ci0vKiBJdGVtIGRvZXMgbm90IGV4aXN0LiAqLwotI2RlZmluZSBDUEVfRU5PVEVYSVNUICAgIDB4MDAwMDAwMTUKLS8qIE9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gKi8KLSNkZWZpbmUgQ1BFX0VURVJNSU5BVEVEICAweDAwMDAwMDE2Ci0vKiBNYXggY291bnQgZm9yIGFkc3AgZXJyb3IgY29kZSBzZW50IHRvIEhMT1MqLwotI2RlZmluZSBDUEVfRVJSX01BWCAgICAgIChDUEVfRVRFUk1JTkFURUQgKyAxKQotCi0KLS8qIEVSUk9SIFNUUklORyAqLwotLyogU3VjY2Vzcy4gVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBubyBlcnJvcnMuICovCi0jZGVmaW5lIENQRV9FT0tfU1RSICAgICAgICAgICJDUEVfRU9LIgotLyogR2VuZXJhbCBmYWlsdXJlLiAqLwotI2RlZmluZSBDUEVfRUZBSUxFRF9TVFIgICAgICAiQ1BFX0VGQUlMRUQiCi0vKiBCYWQgb3BlcmF0aW9uIHBhcmFtZXRlci4gKi8KLSNkZWZpbmUgQ1BFX0VCQURQQVJBTV9TVFIgICAgIkNQRV9FQkFEUEFSQU0iCi0vKiBVbnN1cHBvcnRlZCByb3V0aW5lIG9yIG9wZXJhdGlvbi4gKi8KLSNkZWZpbmUgQ1BFX0VVTlNVUFBPUlRFRF9TVFIgIkNQRV9FVU5TVVBQT1JURUQiCi0vKiBVbnN1cHBvcnRlZCB2ZXJzaW9uLiAqLwotI2RlZmluZSBDUEVfRVZFUlNJT05fU1RSICAgICAiQ1BFX0VWRVJTSU9OIgotLyogVW5leHBlY3RlZCBwcm9ibGVtIGVuY291bnRlcmVkLiAqLwotI2RlZmluZSBDUEVfRVVORVhQRUNURURfU1RSICAiQ1BFX0VVTkVYUEVDVEVEIgotLyogVW5oYW5kbGVkIHByb2JsZW0gb2NjdXJyZWQuICovCi0jZGVmaW5lIENQRV9FUEFOSUNfU1RSICAgICAgICJDUEVfRVBBTklDIgotLyogVW5hYmxlIHRvIGFsbG9jYXRlIHJlc291cmNlLiAqLwotI2RlZmluZSBDUEVfRU5PUkVTT1VSQ0VfU1RSICAiQ1BFX0VOT1JFU09VUkNFIgotLyogSW52YWxpZCBoYW5kbGUuICovCi0jZGVmaW5lIENQRV9FSEFORExFX1NUUiAgICAgICJDUEVfRUhBTkRMRSIKLS8qIE9wZXJhdGlvbiBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gKi8KLSNkZWZpbmUgQ1BFX0VBTFJFQURZX1NUUiAgICAgIkNQRV9FQUxSRUFEWSIKLS8qIE9wZXJhdGlvbiBpcyBub3QgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBDUEVfRU5PVFJFQURZX1NUUiAgICAiQ1BFX0VOT1RSRUFEWSIKLS8qIE9wZXJhdGlvbiBpcyBwZW5kaW5nIGNvbXBsZXRpb24uICovCi0jZGVmaW5lIENQRV9FUEVORElOR19TVFIgICAgICJDUEVfRVBFTkRJTkciCi0vKiBPcGVyYXRpb24gY291bGQgbm90IGJlIGFjY2VwdGVkIG9yIHByb2Nlc3NlZC4gKi8KLSNkZWZpbmUgQ1BFX0VCVVNZX1NUUiAgICAgICAgIkNQRV9FQlVTWSIKLS8qIE9wZXJhdGlvbiBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4gKi8KLSNkZWZpbmUgQ1BFX0VBQk9SVEVEX1NUUiAgICAgIkNQRV9FQUJPUlRFRCIKLS8qIE9wZXJhdGlvbiBwcmVlbXB0ZWQgYnkgYSBoaWdoZXIgcHJpb3JpdHkuICovCi0jZGVmaW5lIENQRV9FUFJFRU1QVEVEX1NUUiAgICJDUEVfRVBSRUVNUFRFRCIKLS8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCi0jZGVmaW5lIENQRV9FQ09OVElOVUVfU1RSICAgICJDUEVfRUNPTlRJTlVFIgotLyogT3BlcmF0aW9uIHJlcXVlc3RzIGltbWVkaWF0ZSBpbnRlcnZlbnRpb24gdG8gY29tcGxldGUuICovCi0jZGVmaW5lIENQRV9FSU1NRURJQVRFX1NUUiAgICJDUEVfRUlNTUVESUFURSIKLS8qIE9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuICovCi0jZGVmaW5lIENQRV9FTk9USU1QTF9TVFIgICAgICJDUEVfRU5PVElNUEwiCi0vKiBPcGVyYXRpb24gbmVlZHMgbW9yZSBkYXRhIG9yIHJlc291cmNlcy4gKi8KLSNkZWZpbmUgQ1BFX0VORUVETU9SRV9TVFIgICAgIkNQRV9FTkVFRE1PUkUiCi0vKiBPcGVyYXRpb24gZG9lcyBub3QgaGF2ZSBtZW1vcnkuICovCi0jZGVmaW5lIENQRV9FTk9NRU1PUllfU1RSICAgICJDUEVfRU5PTUVNT1JZIgotLyogSXRlbSBkb2VzIG5vdCBleGlzdC4gKi8KLSNkZWZpbmUgQ1BFX0VOT1RFWElTVF9TVFIgICAgIkNQRV9FTk9URVhJU1QiCi0vKiBPcGVyYXRpb24gaXMgZmluaXNoZWQuICovCi0jZGVmaW5lIENQRV9FVEVSTUlOQVRFRF9TVFIgICJDUEVfRVRFUk1JTkFURUQiCi0vKiBVbmV4cGVjdGVkIGVycm9yIGNvZGUuICovCi0jZGVmaW5lIENQRV9FUlJfTUFYX1NUUiAgICAgICJDUEVfRVJSX01BWCIKLQotCi1zdHJ1Y3QgY3BlX2Vycl9jb2RlIHsKLQlpbnQgICAgIGxueF9lcnJfY29kZTsKLQljaGFyICAgICpjcGVfZXJyX3N0cjsKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBjcGVfZXJyX2NvZGUgY3BlX2Vycl9jb2RlX2luZm9bQ1BFX0VSUl9NQVgrMV0gPSB7Ci0JeyAwLCBDUEVfRU9LX1NUUn0sCi0JeyAtRU5PVFJFQ09WRVJBQkxFLCBDUEVfRUZBSUxFRF9TVFJ9LAotCXsgLUVJTlZBTCwgQ1BFX0VCQURQQVJBTV9TVFJ9LAotCXsgLUVPUE5PVFNVUFAsIENQRV9FVU5TVVBQT1JURURfU1RSfSwKLQl7IC1FTk9QUk9UT09QVCwgQ1BFX0VWRVJTSU9OX1NUUn0sCi0JeyAtRU5PVFJFQ09WRVJBQkxFLCBDUEVfRVVORVhQRUNURURfU1RSfSwKLQl7IC1FTk9UUkVDT1ZFUkFCTEUsIENQRV9FUEFOSUNfU1RSfSwKLQl7IC1FTk9TUEMsIENQRV9FTk9SRVNPVVJDRV9TVFJ9LAotCXsgLUVCQURSLCBDUEVfRUhBTkRMRV9TVFJ9LAotCXsgLUVBTFJFQURZLCBDUEVfRUFMUkVBRFlfU1RSfSwKLQl7IC1FUEVSTSwgQ1BFX0VOT1RSRUFEWV9TVFJ9LAotCXsgLUVJTlBST0dSRVNTLCBDUEVfRVBFTkRJTkdfU1RSfSwKLQl7IC1FQlVTWSwgQ1BFX0VCVVNZX1NUUn0sCi0JeyAtRUNBTkNFTEVELCBDUEVfRUFCT1JURURfU1RSfSwKLQl7IC1FQUdBSU4sIENQRV9FUFJFRU1QVEVEX1NUUn0sCi0JeyAtRUFHQUlOLCBDUEVfRUNPTlRJTlVFX1NUUn0sCi0JeyAtRUFHQUlOLCBDUEVfRUlNTUVESUFURV9TVFJ9LAotCXsgLUVBR0FJTiwgQ1BFX0VOT1RJTVBMX1NUUn0sCi0JeyAtRU5PREFUQSwgQ1BFX0VORUVETU9SRV9TVFJ9LAotCXsgLUVBRFYsIENQRV9FUlJfTUFYX1NUUn0sCi0JeyAtRU5PTUVNLCBDUEVfRU5PTUVNT1JZX1NUUn0sCi0JeyAtRU5PREVWLCBDUEVfRU5PVEVYSVNUX1NUUn0sCi0JeyAtRUFEViwgQ1BFX0VURVJNSU5BVEVEX1NUUn0sCi0JeyAtRUFEViwgQ1BFX0VSUl9NQVhfU1RSfSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNwZV9lcnJfZ2V0X2xueF9lcnJfY29kZSh1MzIgY3BlX2Vycm9yKQotewotCWlmIChjcGVfZXJyb3IgPiBDUEVfRVJSX01BWCkKLQkJcmV0dXJuIGNwZV9lcnJfY29kZV9pbmZvW0NQRV9FUlJfTUFYXS5sbnhfZXJyX2NvZGU7Ci0JZWxzZQotCQlyZXR1cm4gY3BlX2Vycl9jb2RlX2luZm9bY3BlX2Vycm9yXS5sbnhfZXJyX2NvZGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciAqY3BlX2Vycl9nZXRfZXJyX3N0cih1MzIgY3BlX2Vycm9yKQotewotCWlmIChjcGVfZXJyb3IgPiBDUEVfRVJSX01BWCkKLQkJcmV0dXJuIGNwZV9lcnJfY29kZV9pbmZvW0NQRV9FUlJfTUFYXS5jcGVfZXJyX3N0cjsKLQllbHNlCi0JCXJldHVybiBjcGVfZXJyX2NvZGVfaW5mb1tjcGVfZXJyb3JdLmNwZV9lcnJfc3RyOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuaCBiL2luY2x1ZGUvc291bmQvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjMjMzOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL21zbS1hdWRpby1lZmZlY3RzLXE2LXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfTVNNX0FVRElPX0VGRkVDVFNfSAotI2RlZmluZSBfTVNNX0FVRElPX0VGRkVDVFNfSAotCi0jaW5jbHVkZSA8c291bmQvYXVkaW9fZWZmZWN0cy5oPgotCi0jZGVmaW5lIE1BWF9QUF9QQVJBTVNfU1ogICAxMjgKLQotYm9vbCBtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoaW50IGVmZmVjdF9tb2R1bGUsCi0JCQkJCQlpbnQgdG9wb2xvZ3kpOwotCi1pbnQgbXNtX2F1ZGlvX2VmZmVjdHNfZW5hYmxlX2V4dG4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgIHN0cnVjdCBtc21fbnRfZWZmX2FsbF9jb25maWcgKmVmZmVjdHMsCi0JCQkgICAgIGJvb2wgZmxhZyk7Ci0KLWludCBtc21fYXVkaW9fZWZmZWN0c19yZXZlcmJfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkgICAgIHN0cnVjdCByZXZlcmJfcGFyYW1zICpyZXZlcmIsCi0JCQkJICAgICBsb25nICp2YWx1ZXMpOwotCi1pbnQgbXNtX2F1ZGlvX2VmZmVjdHNfYmFzc19ib29zdF9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQlzdHJ1Y3QgYmFzc19ib29zdF9wYXJhbXMgKmJhc3NfYm9vc3QsCi0JCQkJCWxvbmcgKnZhbHVlcyk7Ci0KLWludCBtc21fYXVkaW9fZWZmZWN0c19wYmVfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJc3RydWN0IHBiZV9wYXJhbXMgKnBiZSwKLQkJCQkJbG9uZyAqdmFsdWVzKTsKLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZpcnR1YWxpemVyX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IHZpcnR1YWxpemVyX3BhcmFtcyAqdmlydHVhbGl6ZXIsCi0JCQkJbG9uZyAqdmFsdWVzKTsKLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3BvcGxlc3NfZXFfaGFuZGxlcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJIHN0cnVjdCBlcV9wYXJhbXMgKmVxLAotCQkJCQkgbG9uZyAqdmFsdWVzKTsKLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCSAgICAgc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyAqdm9sLAotCQkJCSAgICAgbG9uZyAqdmFsdWVzKTsKLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQlzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zICp2b2wsCi0JCQkJCWxvbmcgKnZhbHVlcywgaW50IGluc3RhbmNlKTsKLSNlbmRpZiAvKl9NU01fQVVESU9fRUZGRUNUU19IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXNtLWRhaS1xNi12Mi5oIGIvaW5jbHVkZS9zb3VuZC9tc20tZGFpLXE2LXYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDc2YmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9tc20tZGFpLXE2LXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fTVNNX0RBSV9RNl9QREFUQV9IX18KLQotI2RlZmluZSBfX01TTV9EQUlfUTZfUERBVEFfSF9fCi0KLSNkZWZpbmUgTVNNX01JMlNfU0QwICgxIDw8IDApCi0jZGVmaW5lIE1TTV9NSTJTX1NEMSAoMSA8PCAxKQotI2RlZmluZSBNU01fTUkyU19TRDIgKDEgPDwgMikKLSNkZWZpbmUgTVNNX01JMlNfU0QzICgxIDw8IDMpCi0jZGVmaW5lIE1TTV9NSTJTX0NBUF9SWCAwCi0jZGVmaW5lIE1TTV9NSTJTX0NBUF9UWCAxCi0KLSNkZWZpbmUgTVNNX1BSSU1fTUkyUyAwCi0jZGVmaW5lIE1TTV9TRUNfTUkyUyAgMQotI2RlZmluZSBNU01fVEVSVF9NSTJTIDIKLSNkZWZpbmUgTVNNX1FVQVRfTUkyUyAgMwotI2RlZmluZSBNU01fU0VDX01JMlNfU0QxICA0Ci0jZGVmaW5lIE1TTV9RVUlOX01JMlMgIDUKLSNkZWZpbmUgTVNNX1NFTkFSWV9NSTJTICA2Ci0jZGVmaW5lIE1TTV9JTlQwX01JMlMgIDcKLSNkZWZpbmUgTVNNX0lOVDFfTUkyUyAgOAotI2RlZmluZSBNU01fSU5UMl9NSTJTICA5Ci0jZGVmaW5lIE1TTV9JTlQzX01JMlMgIDEwCi0jZGVmaW5lIE1TTV9JTlQ0X01JMlMgIDExCi0jZGVmaW5lIE1TTV9JTlQ1X01JMlMgIDEyCi0jZGVmaW5lIE1TTV9JTlQ2X01JMlMgIDEzCi0jZGVmaW5lIE1TTV9NSTJTX01JTiBNU01fUFJJTV9NSTJTCi0jZGVmaW5lIE1TTV9NSTJTX01BWCBNU01fSU5UNl9NSTJTCi0KLXN0cnVjdCBtc21fZGFpX2F1eHBjbV9jb25maWcgewotCXUxNiBtb2RlOwotCXUxNiBzeW5jOwotCXUxNiBmcmFtZTsKLQl1MTYgcXVhbnQ7Ci0JdTE2IG51bV9zbG90czsKLQl1MTYgKnNsb3RfbWFwcGluZzsKLQl1MTYgZGF0YTsKLQl1MzIgcGNtX2Nsa19yYXRlOwotfTsKLQotc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhIHsKLQlzdHJ1Y3QgbXNtX2RhaV9hdXhwY21fY29uZmlnIG1vZGVfOGs7Ci0Jc3RydWN0IG1zbV9kYWlfYXV4cGNtX2NvbmZpZyBtb2RlXzE2azsKLX07Ci0KLXN0cnVjdCBtc21fbWkyc19wZGF0YSB7Ci0JdTE2IHJ4X3NkX2xpbmVzOwotCXUxNiB0eF9zZF9saW5lczsKLQl1MTYgaW50Zl9pZDsKLX07Ci0KLXN0cnVjdCBtc21faTJzX2RhdGEgewotCXUzMiBjYXBhYmlsaXR5OyAvKiBSWCBvciBUWCAqLwotCXUxNiBzZF9saW5lczsKLX07Ci0KLXN0cnVjdCBtc21fZGFpX3RkbV9ncm91cF9jb25maWcgewotCXUxNiBncm91cF9pZDsKLQl1MTYgbnVtX3BvcnRzOwotCXUxNiAqcG9ydF9pZDsKLQl1MzIgY2xrX3JhdGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2RhaV90ZG1fY29uZmlnIHsKLQl1MTYgc3luY19tb2RlOwotCXUxNiBzeW5jX3NyYzsKLQl1MTYgZGF0YV9vdXQ7Ci0JdTE2IGludmVydF9zeW5jOwotCXUxNiBkYXRhX2RlbGF5OwotCXUzMiBkYXRhX2FsaWduOwotCXUxNiBoZWFkZXJfc3RhcnRfb2Zmc2V0OwotCXUxNiBoZWFkZXJfd2lkdGg7Ci0JdTE2IGhlYWRlcl9udW1fZnJhbWVfcmVwZWF0OwotfTsKLQotc3RydWN0IG1zbV9kYWlfdGRtX3BkYXRhIHsKLQlzdHJ1Y3QgbXNtX2RhaV90ZG1fZ3JvdXBfY29uZmlnIGdyb3VwX2NvbmZpZzsKLQlzdHJ1Y3QgbXNtX2RhaV90ZG1fY29uZmlnIGNvbmZpZzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9tc20tc2xpbS1kbWEuaCBiL2luY2x1ZGUvc291bmQvbXNtLXNsaW0tZG1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjM5NGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9tc20tc2xpbS1kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLSNpZm5kZWYgX01TTV9TTElNQlVTX0RNQV9ICi0jZGVmaW5lIF9NU01fU0xJTUJVU19ETUFfSAotCi0jaW5jbHVkZSA8bGludXgvc2xpbWJ1cy9zbGltYnVzLmg+Ci0KLS8qCi0gKiBzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgLSBETUEgZGF0YSBmb3Igc2xpbWJ1cyBkYXRhIHRyYW5zZmVyCi0gKgotICogQHNkZXY6IEhhbmRsZSB0byB0aGUgc2xpbV9kZXZpY2UgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZQotICoJICBkYXRhIHRyYW5zZmVyLgotICogQHBoOglQb3J0IGhhbmRsZSBmb3IgdGhlIHNsaW1idXMgcG9ydHMuCi0gKiBAZGFpX2NoYW5uZWxfY3RsOiBjYWxsYmFjayBmdW5jdGlvbiBpbnRvIHRoZSBDUFUgZGFpIGRyaXZlcgotICoJCSAgICAgdG8gc2V0dXAgdGhlIGRhdGEgcGF0aC4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNoYXJlIHRoZSBzbGltYnVzIHBvcnQgaGFuZGxlcyBhbmQKLSAqIG90aGVyIGRhdGEgcGF0aCBzZXR1cCByZWxhdGVkIGhhbmRsZXMgd2l0aCBvdGhlciBkcml2ZXJzLgotICovCi1zdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgewotCi0JLyogSGFuZGxlIHRvIHNsaW1idXMgZGV2aWNlICovCi0Jc3RydWN0IHNsaW1fZGV2aWNlICpzZGV2OwotCi0JLyogUG9ydCBIYW5kbGUgKi8KLQl1MzIgcGg7Ci0KLQkvKiBDYWxsYmFjayBmb3IgZGF0YSBjaGFubmVsIGNvbnRyb2wgKi8KLQlpbnQgKCpkYWlfY2hhbm5lbF9jdGwpKHN0cnVjdCBtc21fc2xpbV9kbWFfZGF0YSAqZG1hX2RhdGEsCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGJvb2wgZW5hYmxlKTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmFkbS12Mi5oIGIvaW5jbHVkZS9zb3VuZC9xNmFkbS12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg5ZTkzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvcTZhZG0tdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1E2X0FETV9WMl9IX18KLSNkZWZpbmUgX19RNl9BRE1fVjJfSF9fCi0KLQotI2RlZmluZSBBRE1fUEFUSF9QTEFZQkFDSyAweDEKLSNkZWZpbmUgQURNX1BBVEhfTElWRV9SRUMgMHgyCi0jZGVmaW5lIEFETV9QQVRIX05PTkxJVkVfUkVDIDB4MwotI2RlZmluZSBBRE1fUEFUSF9DT01QUkVTU0VEX1JYIDB4NQotI2RlZmluZSBBRE1fUEFUSF9DT01QUkVTU0VEX1RYIDB4NgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvcnRhYy5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhdWRpby12Mi5oPgotCi0jZGVmaW5lIE1BWF9NT0RVTEVTX0lOX1RPUE8gMTYKLSNkZWZpbmUgQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSFwKLQkJKChNQVhfTU9EVUxFU19JTl9UT1BPICsgMSkgKiBzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBBVURfUFJPQ19CTE9DS19TSVpFCTQwOTYKLSNkZWZpbmUgQVVEX1ZPTF9CTE9DS19TSVpFCTQwOTYKLSNkZWZpbmUgQVVESU9fUlhfQ0FMSUJSQVRJT05fU0laRQkoQVVEX1BST0NfQkxPQ0tfU0laRSArIFwKLQkJCQkJCUFVRF9WT0xfQkxPQ0tfU0laRSkKLWVudW0gewotCUFETV9DVVNUT01fVE9QX0NBTCA9IDAsCi0JQURNX0FVRFBST0NfQ0FMLAotCUFETV9BVURWT0xfQ0FMLAotCUFETV9SVEFDX0lORk9fQ0FMLAotCUFETV9SVEFDX0FQUl9DQUwsCi0JQURNX1NSU19UUlVNRURJQSwKLQlBRE1fUlRBQ19BVURWT0xfQ0FMLAotCUFETV9NQVhfQ0FMX1RZUEVTCi19OwotCi1lbnVtIHsKLQlBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkcgPSBBRE1fTUFYX0NBTF9UWVBFUywKLQlBRE1fTUVNX01BUF9JTkRFWF9NQVgKLX07Ci0KLWVudW0gewotCUFETV9DTElFTlRfSURfREVGQVVMVCA9IDAsCi0JQURNX0NMSUVOVF9JRF9TT1VSQ0VfVFJBQ0tJTkcsCi0JQURNX0NMSUVOVF9JRF9NQVgsCi19OwotCi0jZGVmaW5lIE1BWF9DT1BQU19QRVJfUE9SVCAweDgKLSNkZWZpbmUgQURNX01BWF9DSEFOTkVMUyA4Ci0KLS8qIG11bHRpcGxlIGNvcHAgcGVyIHN0cmVhbS4gKi8KLXN0cnVjdCByb3V0ZV9wYXlsb2FkIHsKLQl1bnNpZ25lZCBpbnQgY29wcF9pZHhbTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQl1bnNpZ25lZCBpbnQgcG9ydF9pZFtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWludCBhcHBfdHlwZVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWludCBhY2RiX2Rldl9pZFtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWludCBzYW1wbGVfcmF0ZVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCXVuc2lnbmVkIHNob3J0IG51bV9jb3BwczsKLQl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZDsKLX07Ci0KLXN0cnVjdCBkZWZhdWx0X2NobWl4ZXJfcGFyYW1faWRfY29lZmYgewotCXVpbnQzMl90IGluZGV4OwotCXVpbnQxNl90IG51bV9vdXRwdXRfY2hhbm5lbHM7Ci0JdWludDE2X3QgbnVtX2lucHV0X2NoYW5uZWxzOwotfTsKLQotc3RydWN0IG1zbV9wY21fY2hhbm5lbF9taXhlciB7Ci0JaW50IG91dHB1dF9jaGFubmVsOwotCWludCBpbnB1dF9jaGFubmVsc1tBRE1fTUFYX0NIQU5ORUxTXTsKLQlib29sIGVuYWJsZTsKLQlpbnQgcnVsZTsKLQlpbnQgY2hhbm5lbF93ZWlnaHRbQURNX01BWF9DSEFOTkVMU11bQURNX01BWF9DSEFOTkVMU107Ci19OwotCi1pbnQgc3JzX3RydW1lZGlhX29wZW4oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgX19zMzIgc3JzX3RlY2hfaWQsCi0JCSAgICAgIHZvaWQgKnNyc19wYXJhbXMpOwotCi1pbnQgYWRtX2R0c19lYWdsZV9zZXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhcmFtX2lkLAotCQkgICAgICB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplKTsKLQotaW50IGFkbV9kdHNfZWFnbGVfZ2V0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXJhbV9pZCwKLQkJICAgICAgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZSk7Ci0KLXZvaWQgYWRtX2NvcHBfbWZjX2NmZyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgZHN0X3NhbXBsZV9yYXRlKTsKLQotaW50IGFkbV9nZXRfcGFyYW1zKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIHVpbnQzMl90IG1vZHVsZV9pZCwKLQkJICAgdWludDMyX3QgcGFyYW1faWQsIHVpbnQzMl90IHBhcmFtc19sZW5ndGgsIGNoYXIgKnBhcmFtcyk7Ci0KLWludCBhZG1fc2VuZF9wYXJhbXNfdjUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgY2hhciAqcGFyYW1zLAotCQkJICAgICAgdWludDMyX3QgcGFyYW1zX2xlbmd0aCk7Ci0KLWludCBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGNoYXIgKnBhcmFtcywKLQkJCSAgICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpOwotCi1pbnQgYWRtX29wZW4oaW50IHBvcnQsIGludCBwYXRoLCBpbnQgcmF0ZSwgaW50IG1vZGUsIGludCB0b3BvbG9neSwKLQkJCSAgIGludCBwZXJmX21vZGUsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCSAgIGludCBhcHBfdHlwZSwgaW50IGFjZGJkZXZfaWQpOwotCi1pbnQgYWRtX21hcF9ydGFjX2Jsb2NrKHN0cnVjdCBydGFjX2NhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spOwotCi1pbnQgYWRtX3VubWFwX3J0YWNfYmxvY2sodWludDMyX3QgKm1lbV9tYXBfaGFuZGxlKTsKLQotaW50IGFkbV9jbG9zZShpbnQgcG9ydCwgaW50IHRvcG9sb2d5LCBpbnQgcGVyZl9tb2RlKTsKLQotaW50IGFkbV9tYXRyaXhfbWFwKGludCBwYXRoLCBzdHJ1Y3Qgcm91dGVfcGF5bG9hZCBwYXlsb2FkX21hcCwKLQkJICAgaW50IHBlcmZfbW9kZSwgdWludDMyX3QgcGFzc3Rocl9tb2RlKTsKLQotaW50IGFkbV9jb25uZWN0X2FmZV9wb3J0KGludCBtb2RlLCBpbnQgc2Vzc2lvbl9pZCwgaW50IHBvcnRfaWQpOwotCi12b2lkIGFkbV9lY19yZWZfcnhfaWQoaW50ICBwb3J0X2lkKTsKLQotdm9pZCBhZG1fbnVtX2VjX3JlZl9yeF9jaGFucyhpbnQgbnVtX2NoYW5zKTsKLQotdm9pZCBhZG1fZWNfcmVmX3J4X2JpdF93aWR0aChpbnQgYml0X3dpZHRoKTsKLQotdm9pZCBhZG1fZWNfcmVmX3J4X3NhbXBsaW5nX3JhdGUoaW50IHNhbXBsaW5nX3JhdGUpOwotCi1pbnQgYWRtX2dldF9sb3dsYXRlbmN5X2NvcHBfaWQoaW50IHBvcnRfaWQpOwotCi1pbnQgYWRtX3NldF9tdWx0aV9jaF9tYXAoY2hhciAqY2hhbm5lbF9tYXAsIGludCBwYXRoKTsKLQotaW50IGFkbV9nZXRfbXVsdGlfY2hfbWFwKGNoYXIgKmNoYW5uZWxfbWFwLCBpbnQgcGF0aCk7Ci0KLWludCBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KGludCBwb3J0X2lkKTsKLQotaW50IGFkbV9nZXRfZGVmYXVsdF9jb3BwX2lkeChpbnQgcG9ydF9pZCk7Ci0KLWludCBhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2Zyb21fY29wcF9pZChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWQpOwotCi1pbnQgYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKLQotaW50IGFkbV9nZXRfaW5kZXhlc19mcm9tX2NvcHBfaWQoaW50IGNvcHBfaWQsIGludCAqcG9ydF9pZHgsIGludCAqY29wcF9pZHgpOwotCi1pbnQgYWRtX3NldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlbyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCwKLQkJCQkgICAgY2hhciAqcGFyYW1zLCB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKTsKLQotaW50IGFkbV9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQzMl90IHBhcmFtX2xlbmd0aCwKLQkJCQljaGFyICpwYXJhbXMpOwotCi1pbnQgYWRtX3NldF92b2x1bWUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHZvbHVtZSk7Ci0KLWludCBhZG1fc2V0X3NvZnR2b2x1bWUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJICAgICAgIHN0cnVjdCBhdWRwcm9jX3NvZnR2b2x1bWVfcGFyYW1zICpzb2Z0dm9sX3BhcmFtKTsKLQotaW50IGFkbV9zZXRfbWljX2dhaW4oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHZvbHVtZSk7Ci0KLWludCBhZG1fc2VuZF9zZXRfbXVsdGljaGFubmVsX2VjX3ByaW1hcnlfbWljX2NoKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQkJaW50IHByaW1hcnlfbWljX2NoKTsKLQotaW50IGFkbV9wYXJhbV9lbmFibGUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IG1vZHVsZV9pZCwgIGludCBlbmFibGUpOwotCi1pbnQgYWRtX3NlbmRfY2FsaWJyYXRpb24oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhdGgsIGludCBwZXJmX21vZGUsCi0JCQkgaW50IGNhbF90eXBlLCBjaGFyICpwYXJhbXMsIGludCBzaXplKTsKLQotaW50IGFkbV9zZXRfd2FpdF9wYXJhbWV0ZXJzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpOwotCi1pbnQgYWRtX3Jlc2V0X3dhaXRfcGFyYW1ldGVycyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKLQotaW50IGFkbV93YWl0X3RpbWVvdXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHdhaXRfdGltZSk7Ci0KLWludCBhZG1fc3RvcmVfY2FsX2RhdGEoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhdGgsIGludCBwZXJmX21vZGUsCi0JCSAgICAgICBpbnQgY2FsX3R5cGUsIGNoYXIgKnBhcmFtcywgaW50ICpzaXplKTsKLQotaW50IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgYm9vbCBtdXRlX29uKTsKLQotaW50IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3koaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGxhdGVuY3kpOwotaW50IGFkbV9zZXRfc291bmRfZm9jdXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YSk7Ci1pbnQgYWRtX2dldF9zb3VuZF9mb2N1cyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSk7Ci1pbnQgYWRtX2dldF9zb3VyY2VfdHJhY2tpbmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCSAgICBzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpOwotaW50IGFkbV9zd2FwX3NwZWFrZXJfY2hhbm5lbHMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHNhbXBsZV9yYXRlLAotCQkJCWJvb2wgc3BrX3N3YXApOwotaW50IGFkbV9wcm9ncmFtYWJsZV9jaGFubmVsX21peGVyKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBzZXNzaW9uX2lkLAotCQkJaW50IHNlc3Npb25fdHlwZSwKLQkJCXN0cnVjdCBtc21fcGNtX2NoYW5uZWxfbWl4ZXIgKmNoX21peGVyLAotCQkJaW50IGNoYW5uZWxfaW5kZXgpOwotI2VuZGlmIC8qIF9fUTZfQURNX1YyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmFmZS12Mi5oIGIvaW5jbHVkZS9zb3VuZC9xNmFmZS12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzYxMTc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvcTZhZmUtdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1E2QUZFX1YyX0hfXwotI2RlZmluZSBfX1E2QUZFX1YyX0hfXwotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvcnRhYy5oPgotCi0jZGVmaW5lIElOCQkJMHgwMDAKLSNkZWZpbmUgT1VUCQkJMHgwMDEKLSNkZWZpbmUgTVNNX0FGRV9NT05PICAgICAgICAwCi0jZGVmaW5lIE1TTV9BRkVfQ0hfU1RFUkVPICAgMQotI2RlZmluZSBNU01fQUZFX01PTk9fUklHSFQgIDEKLSNkZWZpbmUgTVNNX0FGRV9NT05PX0xFRlQgICAyCi0jZGVmaW5lIE1TTV9BRkVfU1RFUkVPICAgICAgMwotI2RlZmluZSBNU01fQUZFXzRDSEFOTkVMUyAgIDQKLSNkZWZpbmUgTVNNX0FGRV82Q0hBTk5FTFMgICA2Ci0jZGVmaW5lIE1TTV9BRkVfOENIQU5ORUxTICAgOAotCi0jZGVmaW5lIE1TTV9BRkVfSTJTX0ZPUk1BVF9MUENNCQkwCi0jZGVmaW5lIE1TTV9BRkVfSTJTX0ZPUk1BVF9DT01QUgkJMQotI2RlZmluZSBNU01fQUZFX0kyU19GT1JNQVRfSUVDNjA5NThfTFBDTQkyCi0jZGVmaW5lIE1TTV9BRkVfSTJTX0ZPUk1BVF9JRUM2MDk1OF9DT01QUgkzCi0KLSNkZWZpbmUgTVNNX0FGRV9QT1JUX1RZUEVfUlggMAotI2RlZmluZSBNU01fQUZFX1BPUlRfVFlQRV9UWCAxCi0KLSNkZWZpbmUgUlRfUFJPWFlfREFJXzAwMV9SWAkweEUwCi0jZGVmaW5lIFJUX1BST1hZX0RBSV8wMDFfVFgJMHhGMAotI2RlZmluZSBSVF9QUk9YWV9EQUlfMDAyX1JYCTB4RjEKLSNkZWZpbmUgUlRfUFJPWFlfREFJXzAwMl9UWAkweEUxCi0jZGVmaW5lIFZJUlRVQUxfSURfVE9fUE9SVElEKHZhbCkgKCh2YWwgJiAweEYpIHwgMHgyMDAwKQotCi0jZGVmaW5lIEFGRV9DTEtfVkVSU0lPTl9WMSAgICAxCi0jZGVmaW5lIEFGRV9DTEtfVkVSU0lPTl9WMiAgICAyCi0KLXR5cGVkZWYgaW50ICgqcm91dGluZ19jYikoaW50IHBvcnQpOwotCi1lbnVtIHsKLQkvKiBJRFggMC0+NCAqLwotCUlEWF9QUklNQVJZX0kyU19SWCwKLQlJRFhfUFJJTUFSWV9JMlNfVFgsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWCwKLQlJRFhfU0VDT05EQVJZX0kyU19SWCwKLQkvKiBJRFggNS0+OSAqLwotCUlEWF9TRUNPTkRBUllfSTJTX1RYLAotCUlEWF9NSTJTX1JYLAotCUlEWF9NSTJTX1RYLAotCUlEWF9IRE1JX1JYLAotCUlEWF9SU1ZEXzIsCi0JLyogSURYIDEwLT4xNCAqLwotCUlEWF9SU1ZEXzMsCi0JSURYX0RJR0lfTUlDX1RYLAotCUlEWF9WT0lDRV9SRUNPUkRfUlgsCi0JSURYX1ZPSUNFX1JFQ09SRF9UWCwKLQlJRFhfVk9JQ0VfUExBWUJBQ0tfVFgsCi0JLyogSURYIDE1LT4xOSAqLwotCUlEWF9TTElNQlVTXzBfUlgsCi0JSURYX1NMSU1CVVNfMF9UWCwKLQlJRFhfU0xJTUJVU18xX1JYLAotCUlEWF9TTElNQlVTXzFfVFgsCi0JSURYX1NMSU1CVVNfMl9SWCwKLQkvKiBJRFggMjAtPjI0ICovCi0JSURYX1NMSU1CVVNfMl9UWCwKLQlJRFhfU0xJTUJVU18zX1JYLAotCUlEWF9TTElNQlVTXzNfVFgsCi0JSURYX1NMSU1CVVNfNF9SWCwKLQlJRFhfU0xJTUJVU180X1RYLAotCS8qIElEWCAyNS0+MjkgKi8KLQlJRFhfU0xJTUJVU181X1JYLAotCUlEWF9TTElNQlVTXzVfVFgsCi0JSURYX0lOVF9CVF9TQ09fUlgsCi0JSURYX0lOVF9CVF9TQ09fVFgsCi0JSURYX0lOVF9CVF9BMkRQX1JYLAotCS8qIElEWCAzMC0+MzQgKi8KLQlJRFhfSU5UX0ZNX1JYLAotCUlEWF9JTlRfRk1fVFgsCi0JSURYX1JUX1BST1hZX1BPUlRfMDAxX1JYLAotCUlEWF9SVF9QUk9YWV9QT1JUXzAwMV9UWCwKLQlJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYLAotCS8qIElEWCAzNS0+MzkgKi8KLQlJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYLAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWCwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFgsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlgsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFgsCi0JLyogSURYIDQwLT40NCAqLwotCUlEWF9BRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlgsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWCwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWCwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWCwKLQlJRFhfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCS8qIElEWCA0NS0+NDkgKi8KLQlJRFhfU0xJTUJVU182X1JYLAotCUlEWF9TTElNQlVTXzZfVFgsCi0JSURYX1NQRElGX1JYLAotCUlEWF9HTE9CQUxfQ0ZHLAotCUlEWF9BVURJT19QT1JUX0lEX0kyU19SWCwKLQkvKiBJRFggNTAtPjUzICovCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMSwKLQlJRFhfQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFgsCi0JSURYX0FGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYLAotCS8qIElEWCA1NC0+MTE3ICovCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzAsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzAsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzIsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzIsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzMsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzMsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzUsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzUsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzYsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzYsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzcsCi0JSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzcsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMCwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8wLAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMSwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yLAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzIsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMywKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zLAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNCwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81LAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzUsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNiwKLQlJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82LAotCUlEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcsCi0JSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNywKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzAsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8wLAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMSwKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yLAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMiwKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzMsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zLAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNCwKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81LAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNSwKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzYsCi0JSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82LAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNywKLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzcsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzAsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzAsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzEsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzIsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzIsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzMsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzMsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzUsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzUsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzYsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzYsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzcsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzcsCi0JLyogSURYIDExOC0+MTIxICovCi0JSURYX1NMSU1CVVNfN19SWCwKLQlJRFhfU0xJTUJVU183X1RYLAotCUlEWF9TTElNQlVTXzhfUlgsCi0JSURYX1NMSU1CVVNfOF9UWCwKLQkvKiBJRFggMTIyLT4gMTIzICovCi0JSURYX0FGRV9QT1JUX0lEX1VTQl9SWCwKLQlJRFhfQUZFX1BPUlRfSURfVVNCX1RYLAotCS8qIElEWCAxMjQgKi8KLQlJRFhfRElTUExBWV9QT1JUX1JYLAotCS8qIElEWCAxMjUtPiAxMjggKi8KLQlJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFgsCi0JSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWCwKLQkvKiBJRFggMTI5LT4gMTQyICovCi0JSURYX0FGRV9QT1JUX0lEX0lOVDBfTUkyU19SWCwKLQlJRFhfQUZFX1BPUlRfSURfSU5UMF9NSTJTX1RYLAotCUlEWF9BRkVfUE9SVF9JRF9JTlQxX01JMlNfUlgsCi0JSURYX0FGRV9QT1JUX0lEX0lOVDFfTUkyU19UWCwKLQlJRFhfQUZFX1BPUlRfSURfSU5UMl9NSTJTX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9JTlQyX01JMlNfVFgsCi0JSURYX0FGRV9QT1JUX0lEX0lOVDNfTUkyU19SWCwKLQlJRFhfQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYLAotCUlEWF9BRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlgsCi0JSURYX0FGRV9QT1JUX0lEX0lOVDRfTUkyU19UWCwKLQlJRFhfQUZFX1BPUlRfSURfSU5UNV9NSTJTX1JYLAotCUlEWF9BRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFgsCi0JSURYX0FGRV9QT1JUX0lEX0lOVDZfTUkyU19SWCwKLQlJRFhfQUZFX1BPUlRfSURfSU5UNl9NSTJTX1RYLAotCUFGRV9NQVhfUE9SVFMKLX07Ci0KLWVudW0gYWZlX21hZF90eXBlIHsKLQlNQURfSFdfTk9ORSA9IDB4MDAsCi0JTUFEX0hXX0FVRElPID0gMHgwMSwKLQlNQURfSFdfQkVBQ09OID0gMHgwMiwKLQlNQURfSFdfVUxUUkFTT1VORCA9IDB4MDQsCi0JTUFEX1NXX0FVRElPID0gMHgwNSwKLX07Ci0KLWVudW0gYWZlX2NhbF9tb2RlIHsKLQlBRkVfQ0FMX01PREVfREVGQVVMVCA9IDB4MDAsCi0JQUZFX0NBTF9NT0RFX05PTkUsCi19OwotCi1zdHJ1Y3QgYWZlX2F1ZGlvX2J1ZmZlciB7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgICAgICAgKmRhdGE7Ci0JdWludDMyX3QgICB1c2VkOwotCXVpbnQzMl90ICAgc2l6ZTsvKiBzaXplIG9mIGJ1ZmZlciAqLwotCXVpbnQzMl90ICAgYWN0dWFsX3NpemU7IC8qIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSBEU1AgKi8KLQlzdHJ1Y3QgICAgICBpb25faGFuZGxlICpoYW5kbGU7Ci0Jc3RydWN0ICAgICAgaW9uX2NsaWVudCAqY2xpZW50OwotfTsKLQotc3RydWN0IGFmZV9hdWRpb19wb3J0X2RhdGEgewotCXN0cnVjdCBhZmVfYXVkaW9fYnVmZmVyICpidWY7Ci0JdWludDMyX3QJICAgIG1heF9idWZfY250OwotCXVpbnQzMl90CSAgICBkc3BfYnVmOwotCXVpbnQzMl90CSAgICBjcHVfYnVmOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgbWVtX21hcF9oYW5kbGU7Ci0JdWludDMyX3QJICAgIHRtcF9oZGw7Ci0JLyogcmVhZCBvciB3cml0ZSBsb2NrcyAqLwotCXN0cnVjdCBtdXRleAkgICAgbG9jazsKLQlzcGlubG9ja190CSAgICBkc3BfbG9jazsKLX07Ci0KLXN0cnVjdCBhZmVfYXVkaW9fY2xpZW50IHsKLQlhdG9taWNfdAkgICAgICAgY21kX3N0YXRlOwotCS8qIFJlbGF0aXZlIG9yIGFic29sdXRlIFRTICovCi0JdWludDMyX3QJICAgICAgIHRpbWVfZmxhZzsKLQl2b2lkCQkgICAgICAgKnByaXY7Ci0JdWludDY0X3QJICAgICAgIHRpbWVfc3RhbXA7Ci0Jc3RydWN0IG11dGV4CSAgICAgICBjbWRfbG9jazsKLQkvKiBpZHg6MSBvdXQgcG9ydCwgMDogaW4gcG9ydCovCi0Jc3RydWN0IGFmZV9hdWRpb19wb3J0X2RhdGEgcG9ydFsyXTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIGNtZF93YWl0OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgbWVtX21hcF9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgYWFuY19kYXRhIHsKLQlib29sIGFhbmNfYWN0aXZlOwotCXVpbnQxNl90IGFhbmNfcnhfcG9ydDsKLQl1aW50MTZfdCBhYW5jX3R4X3BvcnQ7Ci0JdWludDMyX3QgYWFuY19yeF9wb3J0X3NhbXBsZV9yYXRlOwotCXVpbnQzMl90IGFhbmNfdHhfcG9ydF9zYW1wbGVfcmF0ZTsKLX07Ci0KLWludCBhZmVfb3Blbih1MTYgcG9ydF9pZCwgdW5pb24gYWZlX3BvcnRfY29uZmlnICphZmVfY29uZmlnLCBpbnQgcmF0ZSk7Ci1pbnQgYWZlX2Nsb3NlKGludCBwb3J0X2lkKTsKLWludCBhZmVfbG9vcGJhY2sodTE2IGVuYWJsZSwgdTE2IHJ4X3BvcnQsIHUxNiB0eF9wb3J0KTsKLWludCBhZmVfc2lkZXRvbmVfZW5hYmxlKHUxNiB0eF9wb3J0X2lkLCB1MTYgcnhfcG9ydF9pZCwgYm9vbCBlbmFibGUpOwotaW50IGFmZV9sb29wYmFja19nYWluKHUxNiBwb3J0X2lkLCB1MTYgdm9sdW1lKTsKLWludCBhZmVfdmFsaWRhdGVfcG9ydCh1MTYgcG9ydF9pZCk7Ci1pbnQgYWZlX2dldF9wb3J0X2luZGV4KHUxNiBwb3J0X2lkKTsKLWludCBhZmVfZ2V0X3RvcG9sb2d5KGludCBwb3J0X2lkKTsKLWludCBhZmVfc3RhcnRfcHNldWRvX3BvcnQodTE2IHBvcnRfaWQpOwotaW50IGFmZV9zdG9wX3BzZXVkb19wb3J0KHUxNiBwb3J0X2lkKTsKLXVpbnQzMl90IGFmZV9yZXFfbW1hcF9oYW5kbGUoc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjKTsKLWludCBhZmVfbWVtb3J5X21hcChwaHlzX2FkZHJfdCBkbWFfYWRkcl9wLCB1MzIgZG1hX2J1Zl9zeiwKLQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjKTsKLWludCBhZmVfY21kX21lbW9yeV9tYXAocGh5c19hZGRyX3QgZG1hX2FkZHJfcCwgdTMyIGRtYV9idWZfc3opOwotaW50IGFmZV9jbWRfbWVtb3J5X21hcF9ub3dhaXQoaW50IHBvcnRfaWQsIHBoeXNfYWRkcl90IGRtYV9hZGRyX3AsCi0JCQl1MzIgZG1hX2J1Zl9zeik7Ci1pbnQgYWZlX2NtZF9tZW1vcnlfdW5tYXAodTMyIGRtYV9hZGRyX3ApOwotaW50IGFmZV9jbWRfbWVtb3J5X3VubWFwX25vd2FpdCh1MzIgZG1hX2FkZHJfcCk7Ci12b2lkIGFmZV9zZXRfZHRtZl9nZW5fcnhfcG9ydGlkKHUxNiByeF9wb3J0X2lkLCBpbnQgc2V0KTsKLWludCBhZmVfZHRtZl9nZW5lcmF0ZV9yeChpbnQ2NF90IGR1cmF0aW9uX2luX21zLAotCQkJIHVpbnQxNl90IGhpZ2hfZnJlcSwKLQkJCSB1aW50MTZfdCBsb3dfZnJlcSwgdWludDE2X3QgZ2Fpbik7Ci1pbnQgYWZlX3JlZ2lzdGVyX2dldF9ldmVudHModTE2IHBvcnRfaWQsCi0JCXZvaWQgKCpjYikodWludDMyX3Qgb3Bjb2RlLAotCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpLAotCQl2b2lkICpwcml2YXRlX2RhdGEpOwotaW50IGFmZV91bnJlZ2lzdGVyX2dldF9ldmVudHModTE2IHBvcnRfaWQpOwotaW50IGFmZV9ydF9wcm94eV9wb3J0X3dyaXRlKHBoeXNfYWRkcl90IGJ1Zl9hZGRyX3AsCi0JCQl1MzIgbWVtX21hcF9oYW5kbGUsIGludCBieXRlcyk7Ci1pbnQgYWZlX3J0X3Byb3h5X3BvcnRfcmVhZChwaHlzX2FkZHJfdCBidWZfYWRkcl9wLAotCQkJdTMyIG1lbV9tYXBfaGFuZGxlLCBpbnQgYnl0ZXMpOwotdm9pZCBhZmVfc2V0X2NhbF9tb2RlKHUxNiBwb3J0X2lkLCBlbnVtIGFmZV9jYWxfbW9kZSBhZmVfY2FsX21vZGUpOwotaW50IGFmZV9wb3J0X3N0YXJ0KHUxNiBwb3J0X2lkLCB1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcsCi0JdTMyIHJhdGUpOwotaW50IGFmZV9wb3J0X3N0YXJ0X3YyKHUxNiBwb3J0X2lkLCB1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcsCi0JCSAgICAgIHUzMiByYXRlLCB1MTYgYWZlX2luX2NoYW5uZWxzLCB1MTYgYWZlX2luX2JpdF93aWR0aCwKLQkJICAgICAgc3RydWN0IGFmZV9lbmNfY29uZmlnICplbmNfY29uZmlnKTsKLWludCBhZmVfc3BrX3Byb3RfZmVlZF9iYWNrX2NmZyhpbnQgc3JjX3BvcnQsIGludCBkc3RfcG9ydCwKLQlpbnQgbF9jaCwgaW50IHJfY2gsIHUzMiBlbmFibGUpOwotaW50IGFmZV9zcGtfcHJvdF9nZXRfY2FsaWJfZGF0YShzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9nZXRfdmlfY2FsaWIgKmNhbGliKTsKLWludCBhZmVfcG9ydF9zdG9wX25vd2FpdChpbnQgcG9ydF9pZCk7Ci1pbnQgYWZlX2FwcGx5X2dhaW4odTE2IHBvcnRfaWQsIHUxNiBnYWluKTsKLWludCBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUodm9pZCk7Ci1pbnQgYWZlX2dldF9wb3J0X3R5cGUodTE2IHBvcnRfaWQpOwotaW50IHE2YWZlX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjLAotCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAotCQkJdW5zaWduZWQgaW50IGJ1ZmNudCk7Ci1zdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqcTZhZmVfYXVkaW9fY2xpZW50X2FsbG9jKHZvaWQgKnByaXYpOwotaW50IHE2YWZlX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKHVuc2lnbmVkIGludCBkaXIsCi0JCQlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpOwotdm9pZCBxNmFmZV9hdWRpb19jbGllbnRfZnJlZShzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpOwotLyogaWYgcG9ydF9pZCBpcyB2aXJ0dWFsLCBjb252ZXJ0IHRvIHBoeXNpY2FsLi4KLSAqIGlmIHBvcnRfaWQgaXMgYWxyZWFkeSBwaHlzaWNhbCwgcmV0dXJuIHBoeXNpY2FsCi0gKi8KLWludCBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZCh1MTYgcG9ydF9pZCk7Ci0KLWludCBhZmVfcHNldWRvX3BvcnRfc3RhcnRfbm93YWl0KHUxNiBwb3J0X2lkKTsKLWludCBhZmVfcHNldWRvX3BvcnRfc3RvcF9ub3dhaXQodTE2IHBvcnRfaWQpOwotaW50IGFmZV9zZXRfbHBhc3NfY2xvY2sodTE2IHBvcnRfaWQsIHN0cnVjdCBhZmVfY2xrX2NmZyAqY2ZnKTsKLWludCBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX2Nsa19zZXQgKmNmZyk7Ci1pbnQgYWZlX3NldF9scGFzc19jbGtfY2ZnKGludCBpbmRleCwgc3RydWN0IGFmZV9jbGtfc2V0ICpjZmcpOwotaW50IGFmZV9zZXRfZGlnaXRhbF9jb2RlY19jb3JlX2Nsb2NrKHUxNiBwb3J0X2lkLAotCQkJc3RydWN0IGFmZV9kaWdpdGFsX2Nsa19jZmcgKmNmZyk7Ci1pbnQgYWZlX3NldF9scGFzc19pbnRlcm5hbF9kaWdpdGFsX2NvZGVjX2Nsb2NrKHUxNiBwb3J0X2lkLAotCQkJCXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnICpjZmcpOwotaW50IGFmZV9lbmFibGVfbHBhc3NfY29yZV9zaGFyZWRfY2xvY2sodTE2IHBvcnRfaWQsIHUzMiBlbmFibGUpOwotCi1pbnQgcTZhZmVfY2hlY2tfb3NyX2Nsa19mcmVxKHUzMiBmcmVxKTsKLQotaW50IGFmZV9zZW5kX3NwZGlmX2Nsa19jZmcoc3RydWN0IGFmZV9wYXJhbV9pZF9zcGRpZl9jbGtfY2ZnICpjZmcsCi0JCXUxNiBwb3J0X2lkKTsKLWludCBhZmVfc2VuZF9zcGRpZl9jaF9zdGF0dXNfY2ZnKHN0cnVjdCBhZmVfcGFyYW1faWRfc3BkaWZfY2hfc3RhdHVzX2NmZwotCQkqY2hfc3RhdHVzX2NmZywJdTE2IHBvcnRfaWQpOwotCi1pbnQgYWZlX3NwZGlmX3BvcnRfc3RhcnQodTE2IHBvcnRfaWQsIHN0cnVjdCBhZmVfc3BkaWZfcG9ydF9jb25maWcgKnNwZGlmX3BvcnQsCi0JCXUzMiByYXRlKTsKLQotaW50IGFmZV90dXJuX29ub2ZmX2h3X21hZCh1MTYgbWFkX3R5cGUsIHUxNiBtYWRfZW5hYmxlKTsKLWludCBhZmVfcG9ydF9zZXRfbWFkX3R5cGUodTE2IHBvcnRfaWQsIGVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlKTsKLWVudW0gYWZlX21hZF90eXBlIGFmZV9wb3J0X2dldF9tYWRfdHlwZSh1MTYgcG9ydF9pZCk7Ci1pbnQgYWZlX3NldF9jb25maWcoZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUsIHZvaWQgKmNvbmZpZ19kYXRhLAotCQkgICBpbnQgYXJnKTsKLXZvaWQgYWZlX2NsZWFyX2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWcpOwotYm9vbCBhZmVfaGFzX2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWcpOwotCi12b2lkIGFmZV9zZXRfYWFuY19pbmZvKHN0cnVjdCBhYW5jX2RhdGEgKmFhbmNfaW5mbyk7Ci1pbnQgYWZlX3BvcnRfZ3JvdXBfc2V0X3BhcmFtKHUxNiBncm91cF9pZCwKLQl1bmlvbiBhZmVfcG9ydF9ncm91cF9jb25maWcgKmFmZV9ncm91cF9jb25maWcpOwotaW50IGFmZV9wb3J0X2dyb3VwX2VuYWJsZSh1MTYgZ3JvdXBfaWQsCi0JdW5pb24gYWZlX3BvcnRfZ3JvdXBfY29uZmlnICphZmVfZ3JvdXBfY29uZmlnLCB1MTYgZW5hYmxlKTsKLWludCBhZmVfdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpOwotaW50IGFmZV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKTsKLWludCBhZmVfc2VuZF9zbG90X21hcHBpbmdfY2ZnKAotCXN0cnVjdCBhZmVfcGFyYW1faWRfc2xvdF9tYXBwaW5nX2NmZyAqc2xvdF9tYXBwaW5nX2NmZywKLQl1MTYgcG9ydF9pZCk7Ci1pbnQgYWZlX3NlbmRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnKAotCXN0cnVjdCBhZmVfcGFyYW1faWRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnICpjdXN0b21fdGRtX2hlYWRlcl9jZmcsCi0JdTE2IHBvcnRfaWQpOwotaW50IGFmZV90ZG1fcG9ydF9zdGFydCh1MTYgcG9ydF9pZCwgc3RydWN0IGFmZV90ZG1fcG9ydF9jb25maWcgKnRkbV9wb3J0LAotCQkgICAgICAgdTMyIHJhdGUsIHUxNiBudW1fZ3JvdXBzKTsKLXZvaWQgYWZlX3NldF9yb3V0aW5nX2NhbGxiYWNrKHJvdXRpbmdfY2IgY2IpOwotaW50IGFmZV9nZXRfYXZfZGV2X2RyaWZ0KHN0cnVjdCBhZmVfcGFyYW1faWRfZGV2X3RpbWluZ19zdGF0cyAqdGltaW5nX3N0YXRzLAotCQl1MTYgcG9ydCk7Ci0jZW5kaWYgLyogX19RNkFGRV9WMl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcTZhc20tdjIuaCBiL2luY2x1ZGUvc291bmQvcTZhc20tdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiNDZhNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL3E2YXNtLXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX19RNl9BU01fVjJfSF9fCi0jZGVmaW5lIF9fUTZfQVNNX1YyX0hfXwotCi0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3J0YWMuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotCi0jZGVmaW5lIElOICAgICAgICAgICAgICAgICAgICAgIDB4MDAwCi0jZGVmaW5lIE9VVCAgICAgICAgICAgICAgICAgICAgIDB4MDAxCi0jZGVmaW5lIENIX01PREVfTU9OTyAgICAgICAgICAgIDB4MDAxCi0jZGVmaW5lIENIX01PREVfU1RFUkVPICAgICAgICAgIDB4MDAyCi0KLSNkZWZpbmUgRk9STUFUX0xJTkVBUl9QQ00gICAweDAwMDAKLSNkZWZpbmUgRk9STUFUX0RUTUYgICAgICAgICAweDAwMDEKLSNkZWZpbmUgRk9STUFUX0FEUENNCSAgICAweDAwMDIKLSNkZWZpbmUgRk9STUFUX1lBRFBDTSAgICAgICAweDAwMDMKLSNkZWZpbmUgRk9STUFUX01QMyAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgRk9STUFUX01QRUc0X0FBQyAgICAweDAwMDUKLSNkZWZpbmUgRk9STUFUX0FNUk5CCSAgICAweDAwMDYKLSNkZWZpbmUgRk9STUFUX0FNUldCCSAgICAweDAwMDcKLSNkZWZpbmUgRk9STUFUX1YxM0sJICAgIDB4MDAwOAotI2RlZmluZSBGT1JNQVRfRVZSQwkgICAgMHgwMDA5Ci0jZGVmaW5lIEZPUk1BVF9FVlJDQgkgICAgMHgwMDBhCi0jZGVmaW5lIEZPUk1BVF9FVlJDV0IJICAgIDB4MDAwYgotI2RlZmluZSBGT1JNQVRfTUlESQkgICAgMHgwMDBjCi0jZGVmaW5lIEZPUk1BVF9TQkMJICAgIDB4MDAwZAotI2RlZmluZSBGT1JNQVRfV01BX1YxMFBSTyAgIDB4MDAwZQotI2RlZmluZSBGT1JNQVRfV01BX1Y5CSAgICAweDAwMGYKLSNkZWZpbmUgRk9STUFUX0FNUl9XQl9QTFVTICAweDAwMTAKLSNkZWZpbmUgRk9STUFUX01QRUc0X01VTFRJX0FBQyAweDAwMTEKLSNkZWZpbmUgRk9STUFUX01VTFRJX0NIQU5ORUxfTElORUFSX1BDTSAweDAwMTIKLSNkZWZpbmUgRk9STUFUX0FDMyAgICAgICAgICAweDAwMTMKLSNkZWZpbmUgRk9STUFUX0VBQzMgICAgICAgICAweDAwMTQKLSNkZWZpbmUgRk9STUFUX01QMiAgICAgICAgICAweDAwMTUKLSNkZWZpbmUgRk9STUFUX0ZMQUMgICAgICAgICAweDAwMTYKLSNkZWZpbmUgRk9STUFUX0FMQUMgICAgICAgICAweDAwMTcKLSNkZWZpbmUgRk9STUFUX1ZPUkJJUyAgICAgICAweDAwMTgKLSNkZWZpbmUgRk9STUFUX0FQRSAgICAgICAgICAweDAwMTkKLSNkZWZpbmUgRk9STUFUX0c3MTFfQUxBV19GUyAweDAwMWEKLSNkZWZpbmUgRk9STUFUX0c3MTFfTUxBV19GUyAweDAwMWIKLSNkZWZpbmUgRk9STUFUX0RUUyAgICAgICAgICAweDAwMWMKLSNkZWZpbmUgRk9STUFUX0RTRCAgICAgICAgICAweDAwMWQKLSNkZWZpbmUgRk9STUFUX0FQVFggICAgICAgICAweDAwMWUKLSNkZWZpbmUgRk9STUFUX0dFTl9DT01QUiAgICAweDAwMWYKLSNkZWZpbmUgRk9STUFUX1RSVUVIRCAgICAgICAweDAwMjAKLSNkZWZpbmUgRk9STUFUX0lFQzYxOTM3ICAgICAweDAwMjEKLQotI2RlZmluZSBFTkNERUNfU0JDQklUUkFURSAgIDB4MDAwMQotI2RlZmluZSBFTkNERUNfSU1NRURJQVRFX0RFQ09ERSAweDAwMDIKLSNkZWZpbmUgRU5DREVDX0NGR19CTEsgICAgICAgICAgMHgwMDAzCi0KLSNkZWZpbmUgQ01EX1BBVVNFICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBDTURfRkxVU0ggICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIENNRF9FT1MgICAgICAgICAgICAweDAwMDMKLSNkZWZpbmUgQ01EX0NMT1NFICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBDTURfT1VUX0ZMVVNIICAgICAgMHgwMDA1Ci0jZGVmaW5lIENNRF9TVVNQRU5EICAgICAgICAweDAwMDYKLQotLyogYml0IDA6MSByZXByZXNlbnRzIHByaW9yaXR5IG9mIHN0cmVhbSAqLwotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfTk9STUFMCTB4MDAwMAotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfTE9XCTB4MDAwMQotI2RlZmluZSBTVFJFQU1fUFJJT1JJVFlfSElHSAkweDAwMDIKLQotLyogYml0IDQgcmVwcmVzZW50cyBNRVRBIGVuYWJsZSBvZiBlbmNvZGVkIGRhdGEgYnVmZmVyICovCi0jZGVmaW5lIEJVRkZFUl9NRVRBX0VOQUJMRQkweDAwMTAKLQotLyogYml0IDUgcmVwcmVzZW50cyB0aW1lc3RhbXAgKi8KLS8qIGJpdCA1IC0gMCAtLSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkUgd2lsbCBoYXZlIHJlbGF0aXZlIHRpbWUtc3RhbXAqLwotLyogYml0IDUgLSAxIC0tIEFTTV9EQVRBX0VWRU5UX1JFQURfRE9ORSB3aWxsIGhhdmUgYWJzb2x1dGUgdGltZS1zdGFtcCovCi0jZGVmaW5lIEFCU09MVVRFX1RJTUVTVEFNUF9FTkFCTEUgIDB4MDAyMAotCi0vKiBFbmFibGUgU2FtcGxlX1JhdGUvQ2hhbm5lbF9Nb2RlIG5vdGlmaWNhdGlvbiBldmVudCBmcm9tIERlY29kZXIgKi8KLSNkZWZpbmUgU1JfQ01fTk9USUZZX0VOQUJMRQkweDAwMDQKLQotI2RlZmluZSBUVU5fV1JJVEVfSU9fTU9ERSAweDAwMDggLyogdHVubmVsIHJlYWQgd3JpdGUgbW9kZSAqLwotI2RlZmluZSBUVU5fUkVBRF9JT19NT0RFICAweDAwMDQgLyogdHVubmVsIHJlYWQgd3JpdGUgbW9kZSAqLwotI2RlZmluZSBTWU5DX0lPX01PREUJMHgwMDAxCi0jZGVmaW5lIEFTWU5DX0lPX01PREUJMHgwMDAyCi0jZGVmaW5lIENPTVBSRVNTRURfSU8JMHgwMDQwCi0jZGVmaW5lIENPTVBSRVNTRURfU1RSRUFNX0lPCTB4MDA4MAotI2RlZmluZSBOVF9NT0RFICAgICAgICAweDA0MDAKLQotI2RlZmluZSBOT19USU1FU1RBTVAgICAgMHhGRjAwCi0jZGVmaW5lIFNFVF9USU1FU1RBTVAgICAweDAwMDAKLQotI2RlZmluZSBTT0ZUX1BBVVNFX0VOQUJMRQkxCi0jZGVmaW5lIFNPRlRfUEFVU0VfRElTQUJMRQkwCi0KLSNkZWZpbmUgQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQJMHg4Ci0vKiBDb250cm9sIHNlc3Npb24gaXMgdXNlZCBmb3IgbWFwcGluZyBjYWxpYnJhdGlvbiBtZW1vcnkgKi8KLSNkZWZpbmUgQVNNX0NPTlRST0xfU0VTU0lPTgkoQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQgKyAxKQotCi0jZGVmaW5lIEFTTV9TSElGVF9HQVBMRVNTX01PREVfRkxBRwkzMQotI2RlZmluZSBBU01fU0hJRlRfTEFTVF9CVUZGRVJfRkxBRwkzMAotCi0jZGVmaW5lIEFTTV9MSVRUTEVfRU5ESUFOIDAKLSNkZWZpbmUgQVNNX0JJR19FTkRJQU4gMQotCi0vKiBQQ01fTUVESUFfRk9STUFUX1ZlcnNpb24gKi8KLWVudW0gewotCVBDTV9NRURJQV9GT1JNQVRfVjIgPSAwLAotCVBDTV9NRURJQV9GT1JNQVRfVjMsCi0JUENNX01FRElBX0ZPUk1BVF9WNCwKLX07Ci0KLS8qIFBDTSBmb3JtYXQgbW9kZXMgaW4gRFNQICovCi1lbnVtIHsKLQlERUZBVUxUX1FGID0gMCwKLQlRMTUgPSAxNSwKLQlRMjMgPSAyMywKLQlRMzEgPSAzMSwKLX07Ci0KLS8qIHBheWxvYWQgc3RydWN0dXJlIGJ5dGVzICovCi0jZGVmaW5lIFJFQURET05FX0lEWF9TVEFUVVMgMAotI2RlZmluZSBSRUFERE9ORV9JRFhfQlVGQUREX0xTVyAxCi0jZGVmaW5lIFJFQURET05FX0lEWF9CVUZBRERfTVNXIDIKLSNkZWZpbmUgUkVBRERPTkVfSURYX01FTU1BUF9IREwgMwotI2RlZmluZSBSRUFERE9ORV9JRFhfU0laRSA0Ci0jZGVmaW5lIFJFQURET05FX0lEWF9PRkZTRVQgNQotI2RlZmluZSBSRUFERE9ORV9JRFhfTFNXX1RTIDYKLSNkZWZpbmUgUkVBRERPTkVfSURYX01TV19UUyA3Ci0jZGVmaW5lIFJFQURET05FX0lEWF9GTEFHUyA4Ci0jZGVmaW5lIFJFQURET05FX0lEWF9OVU1GUkFNRVMgOQotI2RlZmluZSBSRUFERE9ORV9JRFhfU0VRX0lEIDEwCi0KLSNkZWZpbmUgU09GVF9QQVVTRV9QRVJJT0QgICAgICAgMzAgICAvKiByYW1wIHVwL2Rvd24gZm9yIDMwbXMgICAgKi8KLSNkZWZpbmUgU09GVF9QQVVTRV9TVEVQICAgICAgICAgMCAvKiBTdGVwIHZhbHVlIDBtcyBvciAwdXMgKi8KLWVudW0gewotCVNPRlRfUEFVU0VfQ1VSVkVfTElORUFSID0gMCwKLQlTT0ZUX1BBVVNFX0NVUlZFX0VYUCwKLQlTT0ZUX1BBVVNFX0NVUlZFX0xPRywKLX07Ci0KLSNkZWZpbmUgU09GVF9WT0xVTUVfUEVSSU9EICAgICAgIDMwICAgLyogcmFtcCB1cC9kb3duIGZvciAzMG1zICAgICovCi0jZGVmaW5lIFNPRlRfVk9MVU1FX1NURVAgICAgICAgICAwIC8qIFN0ZXAgdmFsdWUgMG1zIG9yIDB1cyAqLwotZW51bSB7Ci0JU09GVF9WT0xVTUVfQ1VSVkVfTElORUFSID0gMCwKLQlTT0ZUX1ZPTFVNRV9DVVJWRV9FWFAsCi0JU09GVF9WT0xVTUVfQ1VSVkVfTE9HLAotfTsKLQotI2RlZmluZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xCTEKLSNkZWZpbmUgU09GVF9WT0xVTUVfSU5TVEFOQ0VfMgkyCi0KLXR5cGVkZWYgdm9pZCAoKmFwcF9jYikodWludDMyX3Qgb3Bjb2RlLCB1aW50MzJfdCB0b2tlbiwKLQkJCXVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KTsKLQotc3RydWN0IGF1ZGlvX2J1ZmZlciB7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgICAgICAgKmRhdGE7Ci0JdWludDMyX3QgICB1c2VkOwotCXVpbnQzMl90ICAgc2l6ZTsvKiBzaXplIG9mIGJ1ZmZlciAqLwotCXVpbnQzMl90ICAgYWN0dWFsX3NpemU7IC8qIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSBEU1AgKi8KLQlzdHJ1Y3QgICAgICBpb25faGFuZGxlICpoYW5kbGU7Ci0Jc3RydWN0ICAgICAgaW9uX2NsaWVudCAqY2xpZW50OwotfTsKLQotc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSB7Ci0JcGh5c19hZGRyX3QgICBwYWRkcjsKLQl1aW50MzJfdCAgICAgIGxlbjsKLQl1aW50MzJfdCAgICAgIHVpZDsKLQl1aW50MzJfdCAgICAgIGxzd190czsKLQl1aW50MzJfdCAgICAgIG1zd190czsKLQl1aW50MzJfdCAgICAgIGZsYWdzOwotCXVpbnQzMl90ICAgICAgbWV0YWRhdGFfbGVuOwotCXVpbnQzMl90ICAgICAgbGFzdF9idWZmZXI7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gewotCXBoeXNfYWRkcl90ICAgcGFkZHI7Ci0JdWludDMyX3QgICAgICBsZW47Ci0JdWludDMyX3QgICAgICB1aWQ7Ci0JdWludDMyX3QgICAgICBmbGFnczsvKm1ldGEgZGF0YSBmbGFncyovCi19OwotCi1zdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhIHsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWY7Ci0JdWludDMyX3QJICAgIG1heF9idWZfY250OwotCXVpbnQzMl90CSAgICBkc3BfYnVmOwotCXVpbnQzMl90CSAgICBjcHVfYnVmOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgbWVtX21hcF9oYW5kbGU7Ci0JdWludDMyX3QJICAgIHRtcF9oZGw7Ci0JLyogcmVhZCBvciB3cml0ZSBsb2NrcyAqLwotCXN0cnVjdCBtdXRleAkgICAgbG9jazsKLQlzcGlubG9ja190CSAgICBkc3BfbG9jazsKLX07Ci0KLXN0cnVjdCBzaGFyZWRfaW9fY29uZmlnIHsKLQl1aW50MzJfdCBmb3JtYXQ7Ci0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlOwotCXVpbnQzMl90IHJhdGU7Ci0JdWludDMyX3QgY2hhbm5lbHM7Ci0JdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZTsKLQl1aW50MzJfdCBidWZzejsKLQl1aW50MzJfdCBidWZjbnQ7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50IHsKLQlpbnQgICAgICAgICAgICAgICAgICAgIHNlc3Npb247Ci0JYXBwX2NiCQkgICAgICAgY2I7Ci0JYXRvbWljX3QJICAgICAgIGNtZF9zdGF0ZTsKLQlhdG9taWNfdAkgICAgICAgY21kX3N0YXRlX3BwOwotCS8qIFJlbGF0aXZlIG9yIGFic29sdXRlIFRTICovCi0JYXRvbWljX3QJICAgICAgIHRpbWVfZmxhZzsKLQlhdG9taWNfdAkgICAgICAgbm93YWl0X2NtZF9jbnQ7Ci0JYXRvbWljX3QgICAgICAgICAgICAgICBtZW1fc3RhdGU7Ci0Jdm9pZAkJICAgICAgICpwcml2OwotCXVpbnQzMl90ICAgICAgICAgICAgICAgaW9fbW9kZTsKLQl1aW50NjRfdAkgICAgICAgdGltZV9zdGFtcDsKLQlzdHJ1Y3QgYXByX3N2YyAgICAgICAgICphcHI7Ci0Jc3RydWN0IGFwcl9zdmMgICAgICAgICAqbW1hcF9hcHI7Ci0Jc3RydWN0IGFwcl9zdmMgICAgICAgICAqYXByMjsKLQlzdHJ1Y3QgbXV0ZXgJICAgICAgIGNtZF9sb2NrOwotCS8qIGlkeDoxIG91dCBwb3J0LCAwOiBpbiBwb3J0Ki8KLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhIHBvcnRbMl07Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgICAgICBjbWRfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIHRpbWVfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIG1lbV93YWl0OwotCWludCAgICAgICAgICAgICAgICAgICAgcGVyZl9tb2RlOwotCWludAkJCQkJICAgc3RyZWFtX2lkOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQJCSAgICAgICB0b3BvbG9neTsKLQlpbnQJCSAgICAgICBhcHBfdHlwZTsKLQkvKiBhdWRpbyBjYWNoZSBvcGVyYXRpb25zIGZwdHIqLwotCWludCAoKmZwdHJfY2FjaGVfb3BzKShzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYnVmZiwgaW50IGNhY2hlX29wKTsKLQlhdG9taWNfdCAgICAgICAgICAgICAgIHVubWFwX2NiX3N1Y2Nlc3M7Ci0JYXRvbWljX3QgICAgICAgICAgICAgICByZXNldDsKLQkvKiBob2xkcyBsYXRlc3QgRFNQIHBpcGVsaW5lIGRlbGF5ICovCi0JdWludDMyX3QgICAgICAgICAgICAgICBwYXRoX2RlbGF5OwotCS8qIHNoYXJlZCBpbyAqLwotCXN0cnVjdCBhdWRpb19idWZmZXIgc2hhcmVkX3Bvc19idWY7Ci0Jc3RydWN0IHNoYXJlZF9pb19jb25maWcgY29uZmlnOwotfTsKLQotdm9pZCBxNmFzbV9hdWRpb19jbGllbnRfZnJlZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7Ci0KLXN0cnVjdCBhdWRpb19jbGllbnQgKnE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYyhhcHBfY2IgY2IsIHZvaWQgKnByaXYpOwotCi1zdHJ1Y3QgYXVkaW9fY2xpZW50ICpxNmFzbV9nZXRfYXVkaW9fY2xpZW50KGludCBzZXNzaW9uX2lkKTsKLQotaW50IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2ModW5zaWduZWQgaW50IGRpci8qIDE6T3V0LDA6SW4gKi8sCi0JCQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAotCQkJCXVpbnQzMl90IGJ1ZmNudCk7Ci1pbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvY19jb250aWd1b3VzKHVuc2lnbmVkIGludCBkaXIKLQkJCQkvKiAxOk91dCwwOkluICovLAotCQkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXVuc2lnbmVkIGludCBidWZzeiwKLQkJCQl1bnNpZ25lZCBpbnQgYnVmY250KTsKLQotaW50IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKHVuc2lnbmVkIGludCBkaXIsCi0JCQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7Ci0KLWludCBxNmFzbV9vcGVuX3JlYWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdAotCQkvKiwgdWludDE2X3QgYml0c19wZXJfc2FtcGxlKi8pOwotCi1pbnQgcTZhc21fb3Blbl9yZWFkX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCi0JCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOwotCi1pbnQgcTZhc21fb3Blbl9yZWFkX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCi0JCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOwotCi1pbnQgcTZhc21fb3Blbl9yZWFkX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCi0JCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGJvb2wgdHNfbW9kZSk7Ci0KLWludCBxNmFzbV9vcGVuX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQKLQkJLyosIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSovKTsKLQotaW50IHE2YXNtX29wZW5fd3JpdGVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7Ci0KLWludCBxNmFzbV9vcGVuX3NoYXJlZF9pbyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSBzdHJ1Y3Qgc2hhcmVkX2lvX2NvbmZpZyAqYywgaW50IGRpcik7Ci0KLWludCBxNmFzbV9vcGVuX3dyaXRlX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCi0JCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpOwotCi1pbnQgcTZhc21fb3Blbl93cml0ZV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKTsKLQotaW50IHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQsCi0JCQkgICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBpbnQzMl90IHN0cmVhbV9pZCwKLQkJCSAgICAgICBib29sIGlzX2dhcGxlc3NfbW9kZSk7Ci0KLWludCBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50MzJfdCBzdHJlYW1faWQsCi0JCQkgICAgICAgYm9vbCBpc19nYXBsZXNzX21vZGUpOwotCi1pbnQgcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludDMyX3Qgc3RyZWFtX2lkLAotCQkJICAgICAgIGJvb2wgaXNfZ2FwbGVzc19tb2RlKTsKLQotaW50IHE2YXNtX29wZW5fd3JpdGVfY29tcHJlc3NlZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJCXVpbnQzMl90IHBhc3N0aHJvdWdoX2ZsYWcpOwotCi1pbnQgcTZhc21fb3Blbl9yZWFkX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgcmRfZm9ybWF0LAotCQkJdWludDMyX3Qgd3JfZm9ybWF0KTsKLQotaW50IHE2YXNtX29wZW5fcmVhZF93cml0ZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmRfZm9ybWF0LAotCQkJICAgICB1aW50MzJfdCB3cl9mb3JtYXQsIGJvb2wgaXNfbWV0YV9kYXRhX21vZGUsCi0JCQkgICAgIHVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCBvdmVyd3JpdGVfdG9wb2xvZ3ksCi0JCQkgICAgIGludCB0b3BvbG9neSk7Ci0KLWludCBxNmFzbV9vcGVuX2xvb3BiYWNrX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlKTsKLQotaW50IHE2YXNtX29wZW5fdHJhbnNjb2RlX2xvb3BiYWNrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCB1aW50MzJfdCBzb3VyY2VfZm9ybWF0LAotCQkJICAgdWludDMyX3Qgc2lua19mb3JtYXQpOwotCi1pbnQgcTZhc21fd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGxlbiwgdWludDMyX3QgbXN3X3RzLAotCQkJCXVpbnQzMl90IGxzd190cywgdWludDMyX3QgZmxhZ3MpOwotaW50IHE2YXNtX3dyaXRlX25vbG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbGVuLCB1aW50MzJfdCBtc3dfdHMsCi0JCQkJdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBmbGFncyk7Ci0KLWludCBxNmFzbV9hc3luY193cml0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICBzdHJ1Y3QgYXVkaW9fYWlvX3dyaXRlX3BhcmFtICpwYXJhbSk7Ci0KLWludCBxNmFzbV9hc3luY19yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkgIHN0cnVjdCBhdWRpb19haW9fcmVhZF9wYXJhbSAqcGFyYW0pOwotCi1pbnQgcTZhc21fcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7Ci1pbnQgcTZhc21fcmVhZF92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbGVuKTsKLWludCBxNmFzbV9yZWFkX25vbG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyk7Ci0KLWludCBxNmFzbV9tZW1vcnlfbWFwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBwaHlzX2FkZHJfdCBidWZfYWRkLAotCQkJaW50IGRpciwgdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCk7Ci0KLWludCBxNmFzbV9tZW1vcnlfdW5tYXAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHBoeXNfYWRkcl90IGJ1Zl9hZGQsCi0JCQkJCQkJaW50IGRpcik7Ci0KLXN0cnVjdCBhdWRpb19idWZmZXIgKnE2YXNtX3NoYXJlZF9pb19idWYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpOwotCi1pbnQgcTZhc21fc2hhcmVkX2lvX2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpOwotCi1pbnQgcTZhc21fZ2V0X3NoYXJlZF9wb3Moc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90ICpzaSwgdWludDMyX3QgKm1zdywKLQkJCSB1aW50MzJfdCAqbHN3KTsKLQotaW50IHE2YXNtX21hcF9ydGFjX2Jsb2NrKHN0cnVjdCBydGFjX2NhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spOwotCi1pbnQgcTZhc21fdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpOwotCi1pbnQgcTZhc21fc2VuZF9jYWwoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOwotCi1pbnQgcTZhc21fcnVuKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKLQkJdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMpOwotCi1pbnQgcTZhc21fcnVuX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCi0JCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzKTsKLQotaW50IHE2YXNtX3N0cmVhbV9ydW5fbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKLQkJdWludDMyX3QgbXN3X3RzLCB1aW50MzJfdCBsc3dfdHMsIHVpbnQzMl90IHN0cmVhbV9pZCk7Ci0KLWludCBxNmFzbV9yZWdfdHhfb3ZlcmZsb3coc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQxNl90IGVuYWJsZSk7Ci0KLWludCBxNmFzbV9yZWdfcnhfdW5kZXJmbG93KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBlbmFibGUpOwotCi1pbnQgcTZhc21fY21kKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kKTsKLQotaW50IHE2YXNtX3N0cmVhbV9jbWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBjbWQsIHVpbnQzMl90IHN0cmVhbV9pZCk7Ci0KLWludCBxNmFzbV9jbWRfbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kKTsKLQotaW50IHE2YXNtX3N0cmVhbV9jbWRfbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kLAotCQkJICAgIHVpbnQzMl90IHN0cmVhbV9pZCk7Ci0KLXZvaWQgKnE2YXNtX2lzX2NwdV9idWZfYXZhaWwoaW50IGRpciwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdWludDMyX3QgKnNpemUsIHVpbnQzMl90ICppZHgpOwotCi1pbnQgcTZhc21fY3B1X2J1Zl9yZWxlYXNlKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKTsKLQotdm9pZCAqcTZhc21faXNfY3B1X2J1Zl9hdmFpbF9ub2xvY2soaW50IGRpciwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCXVpbnQzMl90ICpzaXplLCB1aW50MzJfdCAqaWR4KTsKLQotaW50IHE2YXNtX2lzX2RzcF9idWZfYXZhaWwoaW50IGRpciwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOwotCi0vKiBGaWxlIGZvcm1hdCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucyB0byBiZSBhZGRlZCBiZWxvdyAqLwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfYWFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQkJdWludDMyX3Qgc2FtcGxlX3JhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJIHVpbnQzMl90IGJpdF9yYXRlLAotCQkJIHVpbnQzMl90IG1vZGUsIHVpbnQzMl90IGZvcm1hdCk7Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19nNzExKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQkJdWludDMyX3Qgc2FtcGxlX3JhdGUpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBib29sIHVzZV9iYWNrX2ZsYXZvciwKLQkJCXU4ICpjaGFubmVsX21hcCk7Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkgICAgIGJvb2wgdXNlX2JhY2tfZmxhdm9yLCB1OCAqY2hhbm5lbF9tYXAsCi0JCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCSAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJICAgICBib29sIHVzZV9iYWNrX2ZsYXZvciwgdTggKmNoYW5uZWxfbWFwLAotCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLCB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJICAgICB1aW50MTZfdCBtb2RlKTsKLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKTsKLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCQkgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJCQkgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSk7Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUsCi0JCQkJCSAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJCQkgICAgdWludDE2X3QgbW9kZSk7Ci0KLWludCBxNmFzbV9zZXRfZW5jZGVjX2NoYW5fbWFwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQl1aW50MzJfdCBudW1fY2hhbm5lbHMpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX25hdGl2ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKTsKLQotaW50IHE2YXNtX2VuYWJsZV9zYnJwcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHNicl9wcyk7Ci0KLWludCBxNmFzbV9jZmdfZHVhbF9tb25vX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQxNl90IHNjZV9sZWZ0LCB1aW50MTZfdCBzY2VfcmlnaHQpOwotCi1pbnQgcTZhc21fY2ZnX2FhY19zZWxfbWl4X2NvZWYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IG1peF9jb2VmZik7Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19xY2VscChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZnJhbWVzX3Blcl9idWYsCi0JCXVpbnQxNl90IG1pbl9yYXRlLCB1aW50MTZfdCBtYXhfcmF0ZSwKLQkJdWludDE2X3QgcmVkdWNlZF9yYXRlX2xldmVsLCB1aW50MTZfdCByYXRlX21vZHVsYXRpb25fY21kKTsKLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX2V2cmMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQl1aW50MTZfdCBtaW5fcmF0ZSwgdWludDE2X3QgbWF4X3JhdGUsCi0JCXVpbnQxNl90IHJhdGVfbW9kdWxhdGlvbl9jbWQpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfYW1ybmIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQl1aW50MTZfdCBiYW5kX21vZGUsIHVpbnQxNl90IGR0eF9lbmFibGUpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfYW1yd2Ioc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQl1aW50MTZfdCBiYW5kX21vZGUsIHVpbnQxNl90IGR0eF9lbmFibGUpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKTsKLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50IHN0cmVhbV9pZCwKLQkJCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkJICAgdWludDMyX3QgcmF0ZSwKLQkJCQkJCSAgIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCQkJICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJCQkJICAgaW50IHN0cmVhbV9pZCwKLQkJCQkJCSAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCQkgICBjaGFyICpjaGFubmVsX21hcCwKLQkJCQkJCSAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJCSAgIHVpbnQzMl90IHJhdGUsCi0JCQkJCQkgICB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJCSAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJCSAgIGludCBzdHJlYW1faWQsCi0JCQkJCQkgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkJICAgY2hhciAqY2hhbm5lbF9tYXAsCi0JCQkJCQkgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAotCQkJCQkJICAgdWludDE2X3QgZW5kaWFubmVzcywKLQkJCQkJCSAgIHVpbnQxNl90IG1vZGUpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgY2hhciAqY2hhbm5lbF9tYXApOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MigKLQkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCwKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7Ci1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2dlbl9jb21wcigKLQkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCwKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfaWVjKAotCQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscyk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCQkgICAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCSAgICAgY2hhciAqY2hhbm5lbF9tYXAsCi0JCQkJCSAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAotCQkJCQkgICAgIHVpbnQxNl90IGVuZGlhbm5lc3MsCi0JCQkJCSAgICAgdWludDE2X3QgbW9kZSk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYWFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcpOwotCi1pbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2FhY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3dtYShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXZvaWQgKmNmZywgaW50IHN0cmVhbV9pZCk7Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfd21hcHJvKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdm9pZCAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hbXJ3YnBsdXMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2FtcndicGx1c19jZmcgKmNmZyk7Ci0KLWludCBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX2ZsYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2ZsYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FsYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2FsYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2c3MTEoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2c3MTFfZGVjX2NmZyAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKLQotaW50IHE2YXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfYmxvY2tfdm9yYmlzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJc3RydWN0IGFzbV92b3JiaXNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpOwotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXN0cnVjdCBhc21fYXBlX2NmZyAqY2ZnLCBpbnQgc3RyZWFtX2lkKTsKLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19kc2Qoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2RzZF9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCk7Ci0KLWludCBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwdHhfZGVjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkJdWludDMyX3Qgc3IsIGludCBzdHJlYW1faWQpOwotCi1pbnQgcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlpbnQgcGFyYW1faWQsIGludCBwYXJhbV92YWx1ZSk7Ci0KLS8qIFNlbmQgc3RyZWFtIGJhc2VkIGVuZCBwYXJhbXMgKi8KLWludCBxNmFzbV9kczFfc2V0X3N0cmVhbV9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHBhcmFtX2lkLAotCQkJCSAgICAgaW50IHBhcmFtX3ZhbHVlLCBpbnQgc3RyZWFtX2lkKTsKLQotLyogUFAgc3BlY2lmaWMgKi8KLWludCBxNmFzbV9lcXVhbGl6ZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHZvaWQgKmVxKTsKLQotLyogU2VuZCBWb2x1bWUgQ29tbWFuZCAqLwotaW50IHE2YXNtX3NldF92b2x1bWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCB2b2x1bWUpOwotCi0vKiBTZW5kIFZvbHVtZSBDb21tYW5kICovCi1pbnQgcTZhc21fc2V0X3ZvbHVtZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHZvbHVtZSwgaW50IGluc3RhbmNlKTsKLQotLyogRFRTIEVhZ2xlIFBhcmFtcyAqLwotaW50IHE2YXNtX2R0c19lYWdsZV9zZXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBwYXJhbV9pZCwgdWludDMyX3Qgc2l6ZSwKLQkJCXZvaWQgKmRhdGEsIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbywgaW50IG1faWQpOwotaW50IHE2YXNtX2R0c19lYWdsZV9nZXQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBwYXJhbV9pZCwgdWludDMyX3Qgc2l6ZSwKLQkJCXZvaWQgKmRhdGEsIHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwbywgaW50IG1faWQpOwotCi0vKiBTZW5kIGFwdHggZGVjb2RlciBCVCBhZGRyZXNzICovCi1pbnQgcTZhc21fc2V0X2FwdHhfZGVjX2J0X2FkZHIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IGFwdHhfZGVjX2J0X2FkZHJfY2ZnICpjZmcpOwotCi0vKiBTZXQgU29mdFBhdXNlIFBhcmFtcyAqLwotaW50IHE2YXNtX3NldF9zb2Z0cGF1c2Uoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgKnBhcmFtKTsKLQotLyogU2V0IFNvZnR2b2x1bWUgUGFyYW1zICovCi1pbnQgcTZhc21fc2V0X3NvZnR2b2x1bWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zICpwYXJhbSk7Ci0KLS8qIFNldCBTb2Z0dm9sdW1lIFBhcmFtcyAqLwotaW50IHE2YXNtX3NldF9zb2Z0dm9sdW1lX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgIHN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgKnBhcmFtLCBpbnQgaW5zdGFuY2UpOwotCi0vKiBTZW5kIGxlZnQtcmlnaHQgY2hhbm5lbCBnYWluICovCi1pbnQgcTZhc21fc2V0X2xyZ2FpbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGxlZnRfZ2FpbiwgaW50IHJpZ2h0X2dhaW4pOwotCi0vKiBTZW5kIG11bHRpIGNoYW5uZWwgZ2FpbiAqLwotaW50IHE2YXNtX3NldF9tdWx0aWNoX2dhaW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJICAgdWludDMyX3QgKmdhaW5zLCB1aW50OF90ICpjaF9tYXAsIGJvb2wgdXNlX2RlZmF1bHQpOwotCi0vKiBFbmFibGUgTXV0ZS91bm11dGUgZmxhZyAqLwotaW50IHE2YXNtX3NldF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgbXV0ZWZsYWcpOwotCi1pbnQgcTZhc21fZ2V0X3Nlc3Npb25fdGltZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDY0X3QgKnRzdGFtcCk7Ci0KLWludCBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lX2xlZ2FjeShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDY0X3QgKnRzdGFtcCk7Ci0KLWludCBxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBjaGFyICpwYXJhbXMsCi0JCQkJICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpOwotCi1pbnQgcTZhc21fc2VuZF9zdHJlYW1fY21kKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICBzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqZGF0YSk7Ci0KLWludCBxNmFzbV9zZW5kX2lvbl9mZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGZkKTsKLQotaW50IHE2YXNtX3NlbmRfcnRpY19ldmVudF9hY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgICB2b2lkICpwYXJhbSwgdWludDMyX3QgcGFyYW1zX2xlbmd0aCk7Ci0KLS8qIENsaWVudCBjYW4gc2V0IHRoZSBJTyBtb2RlIHRvIGVpdGhlciBBSU8vU0lPIG1vZGUgKi8KLWludCBxNmFzbV9zZXRfaW9fbW9kZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbW9kZSk7Ci0KLS8qIEdldCBTZXJ2aWNlIElEIGZvciBBUFIgY29tbXVuaWNhdGlvbiAqLwotaW50IHE2YXNtX2dldF9hcHJfc2VydmljZV9pZChpbnQgc2Vzc2lvbl9pZCk7Ci0KLS8qIENvbW1vbiBmb3JtYXQgYmxvY2sgd2l0aG91dCBhbnkgcGF5bG9hZCAqLwotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0KTsKLQotLyogU2VuZCB0aGUgbWV0YSBkYXRhIHRvIHJlbW92ZSBpbml0aWFsIGFuZCB0cmFpbGluZyBzaWxlbmNlICovCi1pbnQgcTZhc21fc2VuZF9tZXRhX2RhdGEoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGluaXRpYWxfc2FtcGxlcywKLQkJdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlcyk7Ci0KLS8qIFNlbmQgdGhlIHN0cmVhbSBtZXRhIGRhdGEgdG8gcmVtb3ZlIGluaXRpYWwgYW5kIHRyYWlsaW5nIHNpbGVuY2UgKi8KLWludCBxNmFzbV9zdHJlYW1fc2VuZF9tZXRhX2RhdGEoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IHN0cmVhbV9pZCwKLQkJdWludDMyX3QgaW5pdGlhbF9zYW1wbGVzLCB1aW50MzJfdCB0cmFpbGluZ19zYW1wbGVzKTsKLQotaW50IHE2YXNtX2dldF9hc21fdG9wb2xvZ3koaW50IHNlc3Npb25faWQpOwotaW50IHE2YXNtX2dldF9hc21fYXBwX3R5cGUoaW50IHNlc3Npb25faWQpOwotCi1pbnQgcTZhc21fc2VuZF9tdG14X3N0cnRyX3dpbmRvdyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fd2luZG93X3YyX3QgKndpbmRvd19wYXJhbSwKLQkJdWludDMyX3QgcGFyYW1faWQpOwotCi0vKiBDb25maWd1cmUgRFNQIHJlbmRlciBtb2RlICovCi1pbnQgcTZhc21fc2VuZF9tdG14X3N0cnRyX3JlbmRlcl9tb2RlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQl1aW50MzJfdCByZW5kZXJfbW9kZSk7Ci0KLS8qIENvbmZpZ3VyZSBEU1AgY2xvY2sgcmVjb3ZlcnkgbW9kZSAqLwotaW50IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl9jbGtfcmVjX21vZGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IGNsa19yZWNfbW9kZSk7Ci0KLS8qIEVuYWJsZSBhZGp1c3Qgc2Vzc2lvbiBjbG9jayBpbiBEU1AgKi8KLWludCBxNmFzbV9zZW5kX210bXhfc3RydHJfZW5hYmxlX2FkanVzdF9zZXNzaW9uX2Nsb2NrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQlib29sIGVuYWJsZSk7Ci0KLS8qIFJldHJpZXZlIHRoZSBjdXJyZW50IERTUCBwYXRoIGRlbGF5ICovCi1pbnQgcTZhc21fZ2V0X3BhdGhfZGVsYXkoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOwotCi0vKiBIZWxwZXIgZnVuY3Rpb25zIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0b2tlbiAqLwotdWludDhfdCBxNmFzbV9nZXRfYnVmX2luZGV4X2Zyb21fdG9rZW4odWludDMyX3QgdG9rZW4pOwotdWludDhfdCBxNmFzbV9nZXRfc3RyZWFtX2lkX2Zyb21fdG9rZW4odWludDMyX3QgdG9rZW4pOwotCi0vKiBBZGp1c3Qgc2Vzc2lvbiBjbG9jayBpbiBEU1AgKi8KLWludCBxNmFzbV9hZGp1c3Rfc2Vzc2lvbl9jbG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3QgYWRqdXN0X3RpbWVfbHN3LAotCQl1aW50MzJfdCBhZGp1c3RfdGltZV9tc3cpOwotI2VuZGlmIC8qIF9fUTZfQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmF1ZGlvLXYyLmggYi9pbmNsdWRlL3NvdW5kL3E2YXVkaW8tdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxNGYzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL3E2YXVkaW8tdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCAyMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfUTZfQVVESU9fSF8KLSNkZWZpbmUgX1E2X0FVRElPX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotCi1lbnVtIHsKLQlMRUdBQ1lfUENNX01PREUgPSAwLAotCUxPV19MQVRFTkNZX1BDTV9NT0RFLAotCVVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFLAotCVVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREUsCi19OwotCi0KLWludCBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHUxNiBwb3J0X2lkKTsKLQotaW50IHE2YXVkaW9fY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZCh1MTYgcG9ydF9pZCk7Ci0KLWludCBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQodTE2IHBvcnRfaWQpOwotCi1pbnQgcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UodTE2IHBvcnRfaWQpOwotCi1pbnQgcTZhdWRpb19nZXRfcG9ydF9pZCh1MTYgcG9ydF9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmNvcmUuaCBiL2luY2x1ZGUvc291bmQvcTZjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMWFmNjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zb3VuZC9xNmNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fUTZDT1JFX0hfXwotI2RlZmluZSBfX1E2Q09SRV9IX18KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotCi0KLQotI2RlZmluZSBBVkNTX0NNRF9BRFNQX0VWRU5UX0dFVF9TVEFURQkJMHgwMDAxMjkwQwotI2RlZmluZSBBVkNTX0NNRFJTUF9BRFNQX0VWRU5UX0dFVF9TVEFURQkweDAwMDEyOTBECi0KLWJvb2wgcTZjb3JlX2lzX2Fkc3BfcmVhZHkodm9pZCk7Ci0KLWludCBxNmNvcmVfZ2V0X3NlcnZpY2VfdmVyc2lvbih1aW50MzJfdCBzZXJ2aWNlX2lkLAotCQkJICAgICAgIHN0cnVjdCBhdmNzX2Z3a192ZXJfaW5mbyAqdmVyX2luZm8sCi0JCQkgICAgICAgc2l6ZV90IHNpemUpOwotc2l6ZV90IHE2Y29yZV9nZXRfYXZjc19zZXJ2aWNlX3NpemUodWludDMyX3Qgc2VydmljZV9pZCk7Ci0KLSNkZWZpbmUgQURTUF9DTURfU0VUX0RUU19FQUdMRV9EQVRBX0lEIDB4MDAwMTI5MTkKLSNkZWZpbmUgRFRTX0VBR0xFX0xJQ0VOU0VfSUQgICAgICAgICAgIDB4MDAwMjgzNDYKLXN0cnVjdCBhZHNwX2R0c19lYWdsZSB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXVpbnQzMl90IGlkOwotCXVpbnQzMl90IG92ZXJ3cml0ZTsKLQl1aW50MzJfdCBzaXplOwotCWNoYXIgZGF0YVtdOwotfTsKLWludCBjb3JlX2R0c19lYWdsZV9zZXQoaW50IHNpemUsIGNoYXIgKmRhdGEpOwotaW50IGNvcmVfZHRzX2VhZ2xlX2dldChpbnQgaWQsIGludCBzaXplLCBjaGFyICpkYXRhKTsKLQotI2RlZmluZSBBRFNQX0NNRF9TRVRfRE9MQllfTUFOVUZBQ1RVUkVSX0lEIDB4MDAwMTI5MTgKLQotc3RydWN0IGFkc3BfZG9sYnlfbWFudWZhY3R1cmVyX2lkIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JaW50IG1hbnVmYWN0dXJlcl9pZDsKLX07Ci0KLXVpbnQzMl90IGNvcmVfc2V0X2RvbGJ5X21hbnVmYWN0dXJlcl9pZChpbnQgbWFudWZhY3R1cmVyX2lkKTsKLQotLyogRG9sYnkgU3Vycm91bmQxIE1vZHVsZSBMaWNlbnNlIElELiBUaGlzIElEIGlzIHVzZWQgYXMgYW4gaWRlbnRpZmllcgotICogZm9yIERTMSBsaWNlbnNlIHZpYSBBRFNQIGdlbmVyaWMgbGljZW5zZSBtZWNoYW5pc20uCi0gKiBQbGVhc2UgcmVmZXIgQVZDU19DTURfU0VUX0xJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2RlZmluZSBET0xCWV9EUzFfTElDRU5TRV9JRAkweDAwMDAwMDAxCi0KLSNkZWZpbmUgQVZDU19DTURfU0VUX0xJQ0VOU0UJMHgwMDAxMjkxOQotc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QgaWQ7IC8qKjwgQSB1bmlxdWUgSUQgdXNlZCB0byByZWZlciB0byB0aGlzIGxpY2Vuc2UgKi8KLQl1aW50MzJfdCBvdmVyd3JpdGU7Ci0JLyogMCA9IGRvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgbGljZW5zZSB3aXRoIHRoaXMgaWQuCi0JICogMSA9IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBsaWNlbnNlIHdpdGggdGhpcyBpZC4KLQkgKi8KLQl1aW50MzJfdCBzaXplOwotCS8qKjwgU2l6ZSBpbiBieXRlcyBvZiB0aGUgbGljZW5zZSBkYXRhIGZvbGxvd2luZyB0aGlzIGhlYWRlci4gKi8KLQkvKiB1aW50OF90KiBkYXRhICwgIGRhdGEgYW5kIHBhZGRpbmcgZm9sbG93cyB0aGlzIHN0cnVjdHVyZQotCSAqIHRvdGFsIHBhY2tldCBzaXplIG5lZWRzIHRvIGJlIG11bHRpcGxlIG9mIDQgQnl0ZXMKLQkgKi8KLQotfTsKLQotI2RlZmluZSBBVkNTX0NNRF9HRVRfTElDRU5TRV9WQUxJREFUSU9OX1JFU1VMVCAgICAgICAgMHgwMDAxMjkxQQotc3RydWN0IGF2Y3NfY21kX2dldF9saWNlbnNlX3ZhbGlkYXRpb25fcmVzdWx0IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QgaWQ7IC8qKjwgQSB1bmlxdWUgSUQgdXNlZCB0byByZWZlciB0byB0aGlzIGxpY2Vuc2UgKi8KLX07Ci0KLSNkZWZpbmUgQVZDU19DTURSU1BfR0VUX0xJQ0VOU0VfVkFMSURBVElPTl9SRVNVTFQgICAgICAgIDB4MDAwMTI5MUIKLXN0cnVjdCBhdmNzX2NtZHJzcF9nZXRfbGljZW5zZV92YWxpZGF0aW9uX3Jlc3VsdCB7Ci0JdWludDMyX3QgcmVzdWx0OwotCS8qIEFEU1BfRU9LIGlmIHRoZSBsaWNlbnNlIHZhbGlkYXRpb24gcmVzdWx0IHdhcyBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLgotCSAqIEFEU1BfRU5PVEVYSVNUIGlmIHRoZXJlIGlzIG5vIGxpY2Vuc2Ugd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogQURTUF9FTk9USU1QTCBpZiB0aGVyZSBpcyBubyB2YWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBhIGxpY2Vuc2UKLQkgKiB3aXRoIHRoaXMgaWQuCi0JICovCi0JdWludDMyX3Qgc2l6ZTsKLQkvKiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHJlc3VsdCB0aGF0IGZvbGxvd3MgdGhpcyBzdHJ1Y3R1cmUqLwotfTsKLQotLyogU2V0IFE2IHRvcG9sb2dpZXMgKi8KLS8qCi0gKglSZWdpc3RlcnMgY3VzdG9tIHRvcG9sb2dpZXMgaW4gdGhlIGFEU1AgZm9yCi0gKgl1c2UgaW4gYXVkaW8sIHZvaWNlLCBBRkUgYW5kIExTTS4KLSAqLwotCi0KLSNkZWZpbmUgQVZDU19DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMjkyNAotI2RlZmluZSBBVkNTX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEyOTI1Ci0jZGVmaW5lIEFWQ1NfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTI5MjYKLQotCi0jZGVmaW5lIEFWQ1NfQ01EX1JFR0lTVEVSX1RPUE9MT0dJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTI5MjMKLQotLyogVGhlIHBheWxvYWQgZm9yIHRoZSBBVkNTX0NNRF9SRUdJU1RFUl9UT1BPTE9HSUVTIGNvbW1hbmQgKi8KLXN0cnVjdCBhdmNzX2NtZF9yZWdpc3Rlcl90b3BvbG9naWVzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QgICAgICAgICAgICAgICAgICBwYXlsb2FkX2FkZHJfbHN3OwotCS8qIExvd2VyIDMyIGJpdHMgb2YgdGhlIHRvcG9sb2d5IGJ1ZmZlciBhZGRyZXNzLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBwYXlsb2FkX2FkZHJfbXN3OwotCS8qIFVwcGVyIDMyIGJpdHMgb2YgdGhlIHRvcG9sb2d5IGJ1ZmZlciBhZGRyZXNzLiAqLwotCi0JdWludDMyX3QgICAgICAgICAgICAgICAgICBtZW1fbWFwX2hhbmRsZTsKLQkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYW4gYWRkcmVzcy4KLQkgKiAtVGhpcyBtZW1vcnkgbWFwIGhhbmRsZSBpcyByZXR1cm5lZCBieSB0aGUgYURTUCB0aHJvdWdoIHRoZQotCSAqIG1lbW9yeSBtYXAgY29tbWFuZC4KLQkgKiAtTlVMTCBtZW1fbWFwX2hhbmRsZSBpcyBpbnRlcnByZXRlZCBhcyBpbi1iYW5kIHBhcmFtZXRlcgotCSAqIHBhc3NpbmcuCi0JICogLUNsaWVudCBoYXMgdGhlIGZsZXhpYmlsaXR5IHRvIGNob29zZSBpbi1iYW5kIG9yIG91dC1vZi1iYW5kLgotCSAqIC1PdXQtb2YtYmFuZCBpcyByZWNvbW1lbmRlZCBpbiB0aGlzIGNhc2UuCi0JICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZTsKLQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB2YWxpZCBkYXRhIGluIHRoZSB0b3BvbG9neSBidWZmZXIuICovCi19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgQVZDU19DTURfREVSRUdJU1RFUl9UT1BPTE9HSUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEyOTJhCi0KLS8qIFRoZSBwYXlsb2FkIGZvciB0aGUgQVZDU19DTURfREVSRUdJU1RFUl9UT1BPTE9HSUVTIGNvbW1hbmQgKi8KLXN0cnVjdCBhdmNzX2NtZF9kZXJlZ2lzdGVyX3RvcG9sb2dpZXMgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBheWxvYWRfYWRkcl9sc3c7Ci0JLyogTG93ZXIgMzIgYml0cyBvZiB0aGUgdG9wb2xvZ3kgYnVmZmVyIGFkZHJlc3MuICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIHBheWxvYWRfYWRkcl9tc3c7Ci0JLyogVXBwZXIgMzIgYml0cyBvZiB0aGUgdG9wb2xvZ3kgYnVmZmVyIGFkZHJlc3MuICovCi0KLQl1aW50MzJfdCAgICAgICAgICAgICAgICAgIG1lbV9tYXBfaGFuZGxlOwotCS8qIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzLgotCSAqIC1UaGlzIG1lbW9yeSBtYXAgaGFuZGxlIGlzIHJldHVybmVkIGJ5IHRoZSBhRFNQIHRocm91Z2ggdGhlCi0JICogbWVtb3J5IG1hcCBjb21tYW5kLgotCSAqIC1OVUxMIG1lbV9tYXBfaGFuZGxlIGlzIGludGVycHJldGVkIGFzIGluLWJhbmQgcGFyYW1ldGVyCi0JICogcGFzc2luZy4KLQkgKiAtQ2xpZW50IGhhcyB0aGUgZmxleGliaWxpdHkgdG8gY2hvb3NlIGluLWJhbmQgb3Igb3V0LW9mLWJhbmQuCi0JICogLU91dC1vZi1iYW5kIGlzIHJlY29tbWVuZGVkIGluIHRoaXMgY2FzZS4KLQkgKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplOwotCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhbGlkIGRhdGEgaW4gdGhlIHRvcG9sb2d5IGJ1ZmZlci4gKi8KLQotCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgbW9kZTsKLQkvKiAxOiBEZXJlZ2lzdGVyIHNlbGVjdGVkIHRvcG9sb2dpZXMKLQkgKiAyOiBEZXJlZ2lzdGVyIGFsbCB0b3BvbG9naWVzCi0JICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIEFWQ1NfTU9ERV9ERVJFR0lTVEVSX0FMTF9DVVNUT01fVE9QT0xPR0lFUwkyCi0KLQotaW50MzJfdCBjb3JlX3NldF9saWNlbnNlKHVpbnQzMl90IGtleSwgdWludDMyX3QgbW9kdWxlX2lkKTsKLWludDMyX3QgY29yZV9nZXRfbGljZW5zZV9zdGF0dXModWludDMyX3QgbW9kdWxlX2lkKTsKLQotI2VuZGlmIC8qIF9fUTZDT1JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9xNmxzbS5oIGIvaW5jbHVkZS9zb3VuZC9xNmxzbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjEwNmE4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvc291bmQvcTZsc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1E2TFNNX0hfXwotI2RlZmluZSBfX1E2TFNNX0hfXwotCi0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9sc21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLQotI2RlZmluZSBNQVhfTlVNX0NPTkZJREVOQ0UgMjAKLQotI2RlZmluZSBBRE1fTFNNX1BPUlRfSUQgMHhBRENCCi0KLSNkZWZpbmUgTFNNX01BWF9OVU1fQ0hBTk5FTFMgOAotCi10eXBlZGVmIHZvaWQgKCpsc21fYXBwX2NiKSh1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQkgICAgICAgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpOwotCi1zdHJ1Y3QgbHNtX3NvdW5kX21vZGVsIHsKLQlkbWFfYWRkcl90ICAgICAgcGh5czsKLQl2b2lkCQkqZGF0YTsKLQlzaXplX3QJCXNpemU7IC8qIHNpemUgb2YgYnVmZmVyICovCi0JdWludDMyX3QJYWN0dWFsX3NpemU7IC8qIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSBEU1AgKi8KLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7Ci0JdWludDMyX3QJbWVtX21hcF9oYW5kbGU7Ci19OwotCi1zdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjIgewotCXVpbnQxNl90IHN0YXR1czsKLQl1aW50MTZfdCBwYXlsb2FkX3NpemU7Ci0JdWludDhfdCAgY29uZmlkZW5jZV92YWx1ZVswXTsKLX07Ci0KLXN0cnVjdCBsc21fbGFiX2J1ZmZlciB7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKmRhdGE7Ci0Jc2l6ZV90IHNpemU7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50OwotCXVpbnQzMl90IG1lbV9tYXBfaGFuZGxlOwotfTsKLQotc3RydWN0IGxzbV9od19wYXJhbXMgewotCXUxNiBzYW1wbGVfcmF0ZTsKLQl1MTYgc2FtcGxlX3NpemU7Ci0JdTMyIGJ1Zl9zejsKLQl1MzIgcGVyaW9kX2NvdW50OwotCXUxNiBudW1fY2hzOwotfTsKLQotc3RydWN0IGxzbV9jbGllbnQgewotCWludAkJc2Vzc2lvbjsKLQlsc21fYXBwX2NiCWNiOwotCWF0b21pY190CWNtZF9zdGF0ZTsKLQl2b2lkCQkqcHJpdjsKLQlzdHJ1Y3QgYXByX3N2YyAgKmFwcjsKLQlzdHJ1Y3QgYXByX3N2YyAgKm1tYXBfYXByOwotCXN0cnVjdCBtdXRleCAgICBjbWRfbG9jazsKLQlzdHJ1Y3QgbHNtX3NvdW5kX21vZGVsIHNvdW5kX21vZGVsOwotCXdhaXRfcXVldWVfaGVhZF90IGNtZF93YWl0OwotCXVpbnQzMl90CWNtZF9lcnJfY29kZTsKLQl1aW50MTZfdAltb2RlOwotCXVpbnQxNl90CWNvbm5lY3RfdG9fcG9ydDsKLQl1aW50OF90CQludW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JdWludDhfdAkJKmNvbmZpZGVuY2VfbGV2ZWxzOwotCWJvb2wJCW9wZW5lZDsKLQlib29sCQlzdGFydGVkOwotCWRtYV9hZGRyX3QJbHNtX2NhbF9waHlfYWRkcjsKLQl1aW50MzJfdAlsc21fY2FsX3NpemU7Ci0JdWludDMyX3QJYXBwX2lkOwotCWJvb2wJCWxhYl9lbmFibGU7Ci0JYm9vbAkJbGFiX3N0YXJ0ZWQ7Ci0Jc3RydWN0IGxzbV9sYWJfYnVmZmVyICpsYWJfYnVmZmVyOwotCXN0cnVjdCBsc21faHdfcGFyYW1zIGh3X3BhcmFtczsKLQlib29sCQl1c2VfdG9wb2xvZ3k7Ci0JaW50CQlzZXNzaW9uX3N0YXRlOwotCWJvb2wJCXBvbGxfZW5hYmxlOwotCWludAkJcGVyZl9tb2RlOwotCXVpbnQzMl90CWV2ZW50X21vZGU7Ci19OwotCi1zdHJ1Y3QgbHNtX3N0cmVhbV9jbWRfb3Blbl90eCB7Ci0Jc3RydWN0IGFwcl9oZHIgIGhkcjsKLQl1aW50MTZfdAlhcHBfaWQ7Ci0JdWludDE2X3QJcmVzZXJ2ZWQ7Ci0JdWludDMyX3QJc2FtcGxpbmdfcmF0ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fc3RyZWFtX2NtZF9vcGVuX3R4X3YyIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QJdG9wb2xvZ3lfaWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2N1c3RvbV90b3BvbG9naWVzIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QgZGF0YV9wYXlsb2FkX2FkZHJfbHN3OwotCXVpbnQzMl90IGRhdGFfcGF5bG9hZF9hZGRyX21zdzsKLQl1aW50MzJfdCBtZW1fbWFwX2hhbmRsZTsKLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1fc2l6ZV9yZXNlcnZlZCB7Ci0JdWludDE2X3QgcGFyYW1fc2l6ZTsKLQl1aW50MTZfdCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXVuaW9uIGxzbV9wYXJhbV9zaXplIHsKLQl1aW50MzJfdCBwYXJhbV9zaXplOwotCXN0cnVjdCBsc21fcGFyYW1fc2l6ZV9yZXNlcnZlZCBzcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gewotCXVpbnQzMl90CW1vZHVsZV9pZDsKLQl1aW50MzJfdAlwYXJhbV9pZDsKLQl1bmlvbiBsc21fcGFyYW1fc2l6ZSBwX3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX3BhcmFtX29wX21vZGUgewotCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gY29tbW9uOwotCXVpbnQzMl90CW1pbm9yX3ZlcnNpb247Ci0JdWludDE2X3QJbW9kZTsKLQl1aW50MTZfdAlyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1fY29ubmVjdF90b19wb3J0IHsKLQlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIGNvbW1vbjsKLQl1aW50MzJfdAltaW5vcl92ZXJzaW9uOwotCS8qIEFGRSBwb3J0IGlkIHRoYXQgcmVjZWl2ZXMgdm9pY2Ugd2FrZSB1cCBkYXRhICovCi0JdWludDE2X3QJcG9ydF9pZDsKLQl1aW50MTZfdAlyZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1fcG9sbF9lbmFibGUgewotCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gY29tbW9uOwotCXVpbnQzMl90CW1pbm9yX3ZlcnNpb247Ci0JLyogaW5kaWNhdGVzIHRvIHZvaWNlIHdha2V1cCB0aGF0IEhXIE1BRC9TVyBwb2xsaW5nIGlzIGVuYWJsZWQgb3Igbm90ICovCi0JdWludDMyX3QJcG9sbGluZ19lbmFibGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX3BhcmFtX2Z3a19tb2RlX2NmZyB7Ci0Jc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247Ci0JdWludDMyX3QJbWlub3JfdmVyc2lvbjsKLQl1aW50MzJfdAltb2RlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9wYXJhbV9tZWRpYV9mbXQgewotCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gY29tbW9uOwotCXVpbnQzMl90CW1pbm9yX3ZlcnNpb247Ci0JdWludDMyX3QJc2FtcGxlX3JhdGU7Ci0JdWludDE2X3QJbnVtX2NoYW5uZWxzOwotCXVpbnQxNl90CWJpdF93aWR0aDsKLQl1aW50OF90CQljaGFubmVsX21hcHBpbmdbTFNNX01BWF9OVU1fQ0hBTk5FTFNdOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFRoaXMgcGFyYW0gY2Fubm90IGJlIHNlbnQgaW4gdGhpcyBmb3JtYXQuCi0gKiBUaGUgYWN0dWFsIG51bWJlciBvZiBjb25maWRlbmNlIGxldmVsIHZhbHVlcwotICogbmVlZCB0byBhcHBlbmRlZCB0byB0aGlzIHBhcmFtIHBheWxvYWQuCi0gKi8KLXN0cnVjdCBsc21fcGFyYW1fbWluX2NvbmZpZGVuY2VfbGV2ZWxzIHsKLQlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIGNvbW1vbjsKLQl1aW50OF90CQludW1fY29uZmlkZW5jZV9sZXZlbHM7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyIHsKLQl1aW50MzJfdAlkYXRhX3BheWxvYWRfc2l6ZTsKLQl1aW50MzJfdAlkYXRhX3BheWxvYWRfYWRkcl9sc3c7Ci0JdWludDMyX3QJZGF0YV9wYXlsb2FkX2FkZHJfbXN3OwotCXVpbnQzMl90CW1lbV9tYXBfaGFuZGxlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtcyB7Ci0Jc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbV9oZHI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zX2NvbmYgewotCXN0cnVjdCBhcHJfaGRyICBtc2dfaGRyOwotCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgcGFyYW1zX2hkcjsKLQlzdHJ1Y3QgbHNtX3BhcmFtX21pbl9jb25maWRlbmNlX2xldmVscwljb25mX3BheWxvYWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zX29wbW9kZSB7Ci0Jc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOwotCXN0cnVjdCBsc21fcGFyYW1fb3BfbW9kZSBvcF9tb2RlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfc2V0X2Nvbm5lY3Rwb3J0IHsKLQlzdHJ1Y3QgYXByX2hkciBtc2dfaGRyOwotCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgcGFyYW1zX2hkcjsKLQlzdHJ1Y3QgbHNtX3BhcmFtX2Nvbm5lY3RfdG9fcG9ydCBjb25uZWN0X3RvX3BvcnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2NtZF9wb2xsX2VuYWJsZSB7Ci0Jc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOwotCXN0cnVjdCBsc21fcGFyYW1fcG9sbF9lbmFibGUgcG9sbF9lbmFibGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX3BhcmFtX2VwZF90aHJlcyB7Ci0Jc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247Ci0JdWludDMyX3QJbWlub3JfdmVyc2lvbjsKLQl1aW50MzJfdAllcGRfYmVnaW47Ci0JdWludDMyX3QJZXBkX2VuZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fY21kX3NldF9lcGRfdGhyZXNob2xkIHsKLQlzdHJ1Y3QgYXByX2hkciBtc2dfaGRyOwotCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgcGFyYW1faGRyOwotCXN0cnVjdCBsc21fcGFyYW1fZXBkX3RocmVzIGVwZF90aHJlczsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1fZ2FpbiB7Ci0Jc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiBjb21tb247Ci0JdWludDMyX3QJbWlub3JfdmVyc2lvbjsKLQl1aW50MTZfdAlnYWluOwotCXVpbnQxNl90CXJlc2VydmVkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfc2V0X2dhaW4gewotCXN0cnVjdCBhcHJfaGRyIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbV9oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9nYWluIGxzbV9nYWluOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfcmVnX3NuZF9tb2RlbCB7Ci0Jc3RydWN0IGFwcl9oZHIJaGRyOwotCXVpbnQzMl90CW1vZGVsX3NpemU7Ci0JdWludDMyX3QJbW9kZWxfYWRkcl9sc3c7Ci0JdWludDMyX3QJbW9kZWxfYWRkcl9tc3c7Ci0JdWludDMyX3QJbWVtX21hcF9oYW5kbGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2xhYl9lbmFibGUgewotCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gY29tbW9uOwotCXVpbnQxNl90IGVuYWJsZTsKLQl1aW50MTZfdCByZXNlcnZlZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBsc21fcGFyYW1zX2xhYl9lbmFibGUgewotCXN0cnVjdCBhcHJfaGRyIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOwotCXN0cnVjdCBsc21fbGFiX2VuYWJsZSBsYWJfZW5hYmxlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9sYWJfY29uZmlnIHsKLQlzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uIGNvbW1vbjsKLQl1aW50MzJfdCBtaW5vcl92ZXJzaW9uOwotCXVpbnQzMl90IHdha2VfdXBfbGF0ZW5jeV9tczsKLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IGxzbV9wYXJhbXNfbGFiX2NvbmZpZyB7Ci0Jc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOwotCXN0cnVjdCBsc21fbGFiX2NvbmZpZyBsYWJfY29uZmlnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfcmVhZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXVpbnQzMl90IGJ1Zl9hZGRyX2xzdzsKLQl1aW50MzJfdCBidWZfYWRkcl9tc3c7Ci0JdWludDMyX3QgbWVtX21hcF9oYW5kbGU7Ci0JdWludDMyX3QgYnVmX3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2NtZF9yZWFkX2RvbmUgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdCBzdGF0dXM7Ci0JdWludDMyX3QgYnVmX2FkZHJfbHN3OwotCXVpbnQzMl90IGJ1Zl9hZGRyX21zdzsKLQl1aW50MzJfdCBtZW1fbWFwX2hhbmRsZTsKLQl1aW50MzJfdCB0b3RhbF9zaXplOwotCXVpbnQzMl90IG9mZnNldDsKLQl1aW50MzJfdCB0aW1lc3RhbXBfbHN3OwotCXVpbnQzMl90IHRpbWVzdGFtcF9tc3c7Ci0JdWludDMyX3QgZmxhZ3M7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbHNtX2NtZF9zZXRfZndrX21vZGVfY2ZnIHsKLQlzdHJ1Y3QgYXByX2hkciAgbXNnX2hkcjsKLQlzdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyIHBhcmFtc19oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9md2tfbW9kZV9jZmcgZndrX21vZGVfY2ZnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxzbV9jbWRfc2V0X21lZGlhX2ZtdCB7Ci0Jc3RydWN0IGFwcl9oZHIgIG1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkciBwYXJhbXNfaGRyOwotCXN0cnVjdCBsc21fcGFyYW1fbWVkaWFfZm10IG1lZGlhX2ZtdDsKLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IGxzbV9jbGllbnQgKnE2bHNtX2NsaWVudF9hbGxvYyhsc21fYXBwX2NiIGNiLCB2b2lkICpwcml2KTsKLXZvaWQgcTZsc21fY2xpZW50X2ZyZWUoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCk7Ci1pbnQgcTZsc21fb3BlbihzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCB1aW50MTZfdCBhcHBfaWQpOwotaW50IHE2bHNtX3N0YXJ0KHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIGJvb2wgd2FpdCk7Ci1pbnQgcTZsc21fc3RvcChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBib29sIHdhaXQpOwotaW50IHE2bHNtX3NuZF9tb2RlbF9idWZfYWxsb2Moc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgc2l6ZV90IGxlbiwKLQkJCSAgICAgIGJvb2wgYWxsb2NhdGVfbW9kdWxlX2RhdGEpOwotaW50IHE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKLWludCBxNmxzbV9jbG9zZShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKLWludCBxNmxzbV9yZWdpc3Rlcl9zb3VuZF9tb2RlbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJICAgICAgIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlIG1vZGUsCi0JCQkgICAgICAgYm9vbCBkZXRlY3RmYWlsdXJlKTsKLWludCBxNmxzbV9zZXRfZGF0YShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkgICBlbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBtb2RlLAotCQkgICBib29sIGRldGVjdGZhaWx1cmUpOwotaW50IHE2bHNtX2RlcmVnaXN0ZXJfc291bmRfbW9kZWwoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCk7Ci12b2lkIHNldF9sc21fcG9ydChpbnQgbHNtX3BvcnQpOwotaW50IGdldF9sc21fcG9ydCh2b2lkKTsKLWludCBxNmxzbV9sYWJfY29udHJvbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCB1MzIgZW5hYmxlKTsKLWludCBxNmxzbV9zdG9wX2xhYihzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKLWludCBxNmxzbV9yZWFkKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsc21fY21kX3JlYWQgKnJlYWQpOwotaW50IHE2bHNtX2xhYl9idWZmZXJfYWxsb2Moc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgYm9vbCBhbGxvYyk7Ci1pbnQgcTZsc21fc2V0X29uZV9wYXJhbShzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvLCB2b2lkICpkYXRhLAotCQkJdWludDMyX3QgcGFyYW1fdHlwZSk7Ci12b2lkIHE2bHNtX3NtX3NldF9wYXJhbV9kYXRhKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbywKLQkJc2l6ZV90ICpvZmZzZXQpOwotaW50IHE2bHNtX3NldF9wb3J0X2Nvbm5lY3RlZChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50KTsKLWludCBxNmxzbV9zZXRfZndrX21vZGVfY2ZnKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHVpbnQzMl90IGV2ZW50X21vZGUpOwotaW50IHE2bHNtX3NldF9tZWRpYV9mbXRfcGFyYW1zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpOwotI2VuZGlmIC8qIF9fUTZMU01fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3ZvaWNlX3BhcmFtcy5oIGIvaW5jbHVkZS9zb3VuZC92b2ljZV9wYXJhbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlM2I5ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3NvdW5kL3ZvaWNlX3BhcmFtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2lmbmRlZiBfX1ZPSUNFX1BBUkFNU19IX18KLSNkZWZpbmUgX19WT0lDRV9QQVJBTVNfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgotCi1lbnVtIHZvaWNlX2xjaF9tb2RlIHsKLQlWT0lDRV9MQ0hfU1RBUlQgPSAxLAotCVZPSUNFX0xDSF9TVE9QCi19OwotCi0jZGVmaW5lIFNORFJWX1ZPSUNFX0lPQ1RMX0xDSCBfSU9XKCdVJywgMHgwMCwgZW51bSB2b2ljZV9sY2hfbW9kZSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oIGIvaW5jbHVkZS90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvcmUuaAppbmRleCAzM2IyZTc1Li42MDIxYzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb3JlLmgKQEAgLTU2Myw2ICs1NjMsNyBAQAogI2RlZmluZSBMT0dJTl9GTEFHU19SRUFEX0FDVElWRQkJMQogI2RlZmluZSBMT0dJTl9GTEFHU19DTE9TRUQJCTIKICNkZWZpbmUgTE9HSU5fRkxBR1NfUkVBRFkJCTQKKyNkZWZpbmUgTE9HSU5fRkxBR1NfSU5JVElBTF9QRFUJCTgKIAl1bnNpZ25lZCBsb25nCQlsb2dpbl9mbGFnczsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWxvZ2luX3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlsb2dpbl9jbGVhbnVwX3dvcms7CkBAIC03ODQsNiArNzg1LDcgQEAKIAlpbnQJCQlucF9zb2NrX3R5cGU7CiAJZW51bSBucF90aHJlYWRfc3RhdGVfdGFibGUgbnBfdGhyZWFkX3N0YXRlOwogCWJvb2wgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ7CisJYXRvbWljX3QJCW5wX3Jlc2V0X2NvdW50OwogCWVudW0gaXNjc2lfdGltZXJfZmxhZ3NfdGFibGUgbnBfbG9naW5fdGltZXJfZmxhZ3M7CiAJdTMyCQkJbnBfZXhwb3J0czsKIAllbnVtIG5wX2ZsYWdzX3RhYmxlCW5wX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXhjZXB0aW9uLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZThkZGMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXhjZXB0aW9uLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGV4Y2VwdGlvbgorCisjaWYgIWRlZmluZWQoX1RSQUNFX0VYQ0VQVElPTl9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfRVhDRVBUSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCitUUkFDRV9FVkVOVCh1c2VyX2ZhdWx0LAorCisJVFBfUFJPVE8oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciksCisKKwlUUF9BUkdTKHRzaywgYWRkciwgZnNyKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKHRhc2tfbmFtZSwgdHNrLT5jb21tKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGFkZHIpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBmc3IpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCV9fYXNzaWduX3N0cih0YXNrX25hbWUsIHRzay0+Y29tbSkKKwkJX19lbnRyeS0+YWRkcgk9IGFkZHI7CisJCV9fZW50cnktPmZzcgk9IGZzcjsKKwkpLAorCisJVFBfcHJpbnRrKCJ0YXNrX25hbWU6JXMgYWRkcjolbHUsIGZzcjoldSIsIF9fZ2V0X3N0cih0YXNrX25hbWUpLAorCQlfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5mc3IpCispOworCisKK3N0cnVjdCBwdF9yZWdzOworCitUUkFDRV9FVkVOVCh1bmRlZl9pbnN0ciwKKworCVRQX1BST1RPKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkIF9fdXNlciAqcHJvZ19jbnQpLAorCisJVFBfQVJHUyhyZWdzLCBwcm9nX2NudCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHZvaWQgX191c2VyICosIHByb2dfY250KQorCQlfX2ZpZWxkKHN0cnVjdCBwdF9yZWdzICosIHJlZ3MpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5yZWdzCQk9IHJlZ3M7CisJCV9fZW50cnktPnByb2dfY250CT0gcHJvZ19jbnQ7CisJKSwKKworCVRQX3ByaW50aygicGM6JXAiLCBfX2VudHJ5LT5wcm9nX2NudCkKKyk7CisKK1RSQUNFX0VWRU5UKHVuaGFuZGxlZF9hYm9ydCwKKworCVRQX1BST1RPKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IpLAorCisJVFBfQVJHUyhyZWdzLCBhZGRyLCBmc3IpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChzdHJ1Y3QgcHRfcmVncyAqLCByZWdzKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGFkZHIpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBmc3IpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5yZWdzCT0gcmVnczsKKwkJX19lbnRyeS0+YWRkcgk9IGFkZHI7CisJCV9fZW50cnktPmZzcgk9IGZzcjsKKwkpLAorCisJVFBfcHJpbnRrKCJhZGRyOiVsdSwgZnNyOiV1IiwgX19lbnRyeS0+YWRkciwgX19lbnRyeS0+ZnNyKQorKTsKKworVFJBQ0VfRVZFTlQoa2VybmVsX3BhbmljLAorCisJVFBfUFJPVE8obG9uZyBkdW1teSksCisKKwlUUF9BUkdTKGR1bW15KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQobG9uZywgZHVtbXkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kdW1teQk9IGR1bW15OworCSksCisKKwlUUF9wcmludGsoImR1bW15OiVsZCIsIF9fZW50cnktPmR1bW15KQorKTsKKworVFJBQ0VfRVZFTlQoa2VybmVsX3BhbmljX2xhdGUsCisKKwlUUF9QUk9UTyhsb25nIGR1bW15KSwKKworCVRQX0FSR1MoZHVtbXkpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChsb25nLCBkdW1teSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmR1bW15CT0gZHVtbXk7CisJKSwKKworCVRQX3ByaW50aygiZHVtbXk6JWxkIiwgX19lbnRyeS0+ZHVtbXkpCispOworCisjZW5kaWYKKworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9tbXUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lvbW11LmgKaW5kZXggMmM3YmVmYi4uOTY1MjAzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW9tbXUuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pb21tdS5oCkBAIC0xNjEsNiArMTYxLDYyIEBACiAKIAlUUF9BUkdTKGRldiwgaW92YSwgZmxhZ3MpCiApOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGlvbW11X2VycmF0YV90bGJpLAorCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1NjQgdGltZSksCisKKwlUUF9BUkdTKGRldiwgdGltZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyhkZXZpY2UsIGRldl9uYW1lKGRldikpCisJCV9fZmllbGQodTY0LCB0aW1lKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKGRldmljZSwgZGV2X25hbWUoZGV2KSk7CisJCV9fZW50cnktPnRpbWUgPSB0aW1lOworCSksCisKKwlUUF9wcmludGsoIklPTU1VOiVzICVsbGQgdXMiLAorCQkJX19nZXRfc3RyKGRldmljZSksIF9fZW50cnktPnRpbWUKKwkpCispOworCitERUZJTkVfRVZFTlQoaW9tbXVfZXJyYXRhX3RsYmksIGVycmF0YV90bGJpX3N0YXJ0LAorCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1NjQgdGltZSksCisKKwlUUF9BUkdTKGRldiwgdGltZSkKKyk7CisKK0RFRklORV9FVkVOVChpb21tdV9lcnJhdGFfdGxiaSwgZXJyYXRhX3RsYmlfZW5kLAorCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1NjQgdGltZSksCisKKwlUUF9BUkdTKGRldiwgdGltZSkKKyk7CisKK0RFRklORV9FVkVOVChpb21tdV9lcnJhdGFfdGxiaSwgZXJyYXRhX3Rocm90dGxlX3N0YXJ0LAorCisJVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1NjQgdGltZSksCisKKwlUUF9BUkdTKGRldiwgdGltZSkKKyk7CisKK0RFRklORV9FVkVOVChpb21tdV9lcnJhdGFfdGxiaSwgZXJyYXRhX3Rocm90dGxlX2VuZCwKKworCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IHRpbWUpLAorCisJVFBfQVJHUyhkZXYsIHRpbWUpCispOworCitERUZJTkVfRVZFTlQoaW9tbXVfZXJyYXRhX3RsYmksIGVycmF0YV9mYWlsZWQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCB0aW1lKSwKKworCVRQX0FSR1MoZGV2LCB0aW1lKQorKTsKICNlbmRpZiAvKiBfVFJBQ0VfSU9NTVVfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RoZXJtYWwuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RoZXJtYWwuaAppbmRleCBjMDQ3NWEyLi45NGVlMjg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90aGVybWFsLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvdGhlcm1hbC5oCkBAIC0yMCw2ICsyMCwyOSBAQAogCQkJIHsgVEhFUk1BTF9UUklQX1BBU1NJVkUsICAiUEFTU0lWRSJ9LAlcCiAJCQkgeyBUSEVSTUFMX1RSSVBfQUNUSVZFLCAgICJBQ1RJVkUifSkKIAorVFJBQ0VfRVZFTlQodGhlcm1hbF9xdWVyeV90ZW1wLAorCisJVFBfUFJPVE8oc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6LCBpbnQgdGVtcCksCisKKwlUUF9BUkdTKHR6LCB0ZW1wKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKHRoZXJtYWxfem9uZSwgdHotPnR5cGUpCisJCV9fZmllbGQoaW50LCBpZCkKKwkJX19maWVsZChpbnQsIHRlbXApCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIodGhlcm1hbF96b25lLCB0ei0+dHlwZSk7CisJCV9fZW50cnktPmlkID0gdHotPmlkOworCQlfX2VudHJ5LT50ZW1wID0gdGVtcDsKKwkpLAorCisJVFBfcHJpbnRrKCJ0aGVybWFsX3pvbmU9JXMgaWQ9JWQgdGVtcD0lZCIsCisJCV9fZ2V0X3N0cih0aGVybWFsX3pvbmUpLCBfX2VudHJ5LT5pZCwKKwkJX19lbnRyeS0+dGVtcCkKKyk7CisKIFRSQUNFX0VWRU5UKHRoZXJtYWxfdGVtcGVyYXR1cmUsCiAKIAlUUF9QUk9UTyhzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHopLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdm1zY2FuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAppbmRleCBjODhmZDA5Li4yZjg1MzZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92bXNjYW4uaApAQCAtMjY5LDIzICsyNjksMjQgQEAKIAkJX19lbnRyeS0+cmV0dmFsKQogKTsKIAotREVDTEFSRV9FVkVOVF9DTEFTUyhtbV92bXNjYW5fbHJ1X2lzb2xhdGVfdGVtcGxhdGUsCi0KK1RSQUNFX0VWRU5UKG1tX3Ztc2Nhbl9scnVfaXNvbGF0ZSwKIAlUUF9QUk9UTyhpbnQgY2xhc3N6b25lX2lkeCwKIAkJaW50IG9yZGVyLAogCQl1bnNpZ25lZCBsb25nIG5yX3JlcXVlc3RlZCwKIAkJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkLAorCQl1bnNpZ25lZCBsb25nIG5yX3NraXBwZWQsCiAJCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW4sCiAJCWlzb2xhdGVfbW9kZV90IGlzb2xhdGVfbW9kZSwKIAkJaW50IGZpbGUpLAogCi0JVFBfQVJHUyhjbGFzc3pvbmVfaWR4LCBvcmRlciwgbnJfcmVxdWVzdGVkLCBucl9zY2FubmVkLCBucl90YWtlbiwgaXNvbGF0ZV9tb2RlLCBmaWxlKSwKKwlUUF9BUkdTKGNsYXNzem9uZV9pZHgsIG9yZGVyLCBucl9yZXF1ZXN0ZWQsIG5yX3NjYW5uZWQsIG5yX3NraXBwZWQsIG5yX3Rha2VuLCBpc29sYXRlX21vZGUsIGZpbGUpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZChpbnQsIGNsYXNzem9uZV9pZHgpCiAJCV9fZmllbGQoaW50LCBvcmRlcikKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9yZXF1ZXN0ZWQpCiAJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbnJfc2Nhbm5lZCkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBucl9za2lwcGVkKQogCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG5yX3Rha2VuKQogCQlfX2ZpZWxkKGlzb2xhdGVfbW9kZV90LCBpc29sYXRlX21vZGUpCiAJCV9fZmllbGQoaW50LCBmaWxlKQpAQCAtMjk2LDQ5ICsyOTcsMjMgQEAKIAkJX19lbnRyeS0+b3JkZXIgPSBvcmRlcjsKIAkJX19lbnRyeS0+bnJfcmVxdWVzdGVkID0gbnJfcmVxdWVzdGVkOwogCQlfX2VudHJ5LT5ucl9zY2FubmVkID0gbnJfc2Nhbm5lZDsKKwkJX19lbnRyeS0+bnJfc2tpcHBlZCA9IG5yX3NraXBwZWQ7CiAJCV9fZW50cnktPm5yX3Rha2VuID0gbnJfdGFrZW47CiAJCV9fZW50cnktPmlzb2xhdGVfbW9kZSA9IGlzb2xhdGVfbW9kZTsKIAkJX19lbnRyeS0+ZmlsZSA9IGZpbGU7CiAJKSwKIAotCVRQX3ByaW50aygiaXNvbGF0ZV9tb2RlPSVkIGNsYXNzem9uZT0lZCBvcmRlcj0lZCBucl9yZXF1ZXN0ZWQ9JWx1IG5yX3NjYW5uZWQ9JWx1IG5yX3Rha2VuPSVsdSBmaWxlPSVkIiwKKwlUUF9wcmludGsoImlzb2xhdGVfbW9kZT0lZCBjbGFzc3pvbmU9JWQgb3JkZXI9JWQgbnJfcmVxdWVzdGVkPSVsdSBucl9zY2FubmVkPSVsdSBucl9za2lwcGVkPSVsdSBucl90YWtlbj0lbHUgZmlsZT0lZCIsCiAJCV9fZW50cnktPmlzb2xhdGVfbW9kZSwKIAkJX19lbnRyeS0+Y2xhc3N6b25lX2lkeCwKIAkJX19lbnRyeS0+b3JkZXIsCiAJCV9fZW50cnktPm5yX3JlcXVlc3RlZCwKIAkJX19lbnRyeS0+bnJfc2Nhbm5lZCwKKwkJX19lbnRyeS0+bnJfc2tpcHBlZCwKIAkJX19lbnRyeS0+bnJfdGFrZW4sCiAJCV9fZW50cnktPmZpbGUpCiApOwogCi1ERUZJTkVfRVZFTlQobW1fdm1zY2FuX2xydV9pc29sYXRlX3RlbXBsYXRlLCBtbV92bXNjYW5fbHJ1X2lzb2xhdGUsCi0KLQlUUF9QUk9UTyhpbnQgY2xhc3N6b25lX2lkeCwKLQkJaW50IG9yZGVyLAotCQl1bnNpZ25lZCBsb25nIG5yX3JlcXVlc3RlZCwKLQkJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkLAotCQl1bnNpZ25lZCBsb25nIG5yX3Rha2VuLAotCQlpc29sYXRlX21vZGVfdCBpc29sYXRlX21vZGUsCi0JCWludCBmaWxlKSwKLQotCVRQX0FSR1MoY2xhc3N6b25lX2lkeCwgb3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIGlzb2xhdGVfbW9kZSwgZmlsZSkKLQotKTsKLQotREVGSU5FX0VWRU5UKG1tX3Ztc2Nhbl9scnVfaXNvbGF0ZV90ZW1wbGF0ZSwgbW1fdm1zY2FuX21lbWNnX2lzb2xhdGUsCi0KLQlUUF9QUk9UTyhpbnQgY2xhc3N6b25lX2lkeCwKLQkJaW50IG9yZGVyLAotCQl1bnNpZ25lZCBsb25nIG5yX3JlcXVlc3RlZCwKLQkJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkLAotCQl1bnNpZ25lZCBsb25nIG5yX3Rha2VuLAotCQlpc29sYXRlX21vZGVfdCBpc29sYXRlX21vZGUsCi0JCWludCBmaWxlKSwKLQotCVRQX0FSR1MoY2xhc3N6b25lX2lkeCwgb3JkZXIsIG5yX3JlcXVlc3RlZCwgbnJfc2Nhbm5lZCwgbnJfdGFrZW4sIGlzb2xhdGVfbW9kZSwgZmlsZSkKLQotKTsKLQogVFJBQ0VfRVZFTlQobW1fdm1zY2FuX3dyaXRlcGFnZSwKIAogCVRQX1BST1RPKHN0cnVjdCBwYWdlICpwYWdlKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vbXNtX2RybS5oIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtLmgKaW5kZXggNmZmMDhkZS4uZDU0MzhkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtLmgKQEAgLTMyNCw2ICszMjQsNyBAQAogI2RlZmluZSBEUk1fRVZFTlRfU1lTX0JBQ0tMSUdIVCAweDgwMDAwMDAzCiAjZGVmaW5lIERSTV9FVkVOVF9TREVfUE9XRVIgMHg4MDAwMDAwNAogI2RlZmluZSBEUk1fRVZFTlRfSURMRV9OT1RJRlkgMHg4MDAwMDAwNQorI2RlZmluZSBEUk1fRVZFTlRfUEFORUxfREVBRCAweDgwMDAwMDA2IC8qIEVTRCBldmVudCAqLwogCiAjZGVmaW5lIERSTV9JT0NUTF9NU01fR0VUX1BBUkFNICAgICAgICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX01TTV9HRVRfUEFSQU0sIHN0cnVjdCBkcm1fbXNtX3BhcmFtKQogI2RlZmluZSBEUk1fSU9DVExfTVNNX0dFTV9ORVcgICAgICAgICAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9NU01fR0VNX05FVywgc3RydWN0IGRybV9tc21fZ2VtX25ldykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9kcm0vbXNtX2RybV9wcC5oIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKaW5kZXggNWY3MGE1Ny4uMDc2NTUyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKKysrIGIvaW5jbHVkZS91YXBpL2RybS9tc21fZHJtX3BwLmgKQEAgLTE3NCw2ICsxNzQsMTcgQEAKIAlfX3UzMiBzdHJlbmd0aDsKIH07CiAKKyNkZWZpbmUgSElTVF9WX1NJWkUgMjU2CisvKioKKyAqIHN0cnVjdCBkcm1fbXNtX2hpc3QgLSBoaXN0b2dyYW0gZmVhdHVyZSBzdHJ1Y3R1cmUKKyAqIEBmbGFnczogZm9yIGN1c3RvbWl6aW5nIG9wZXJhdGlvbnMKKyAqIEBkYXRhOiBoaXN0b2dyYW0gZGF0YQorICovCitzdHJ1Y3QgZHJtX21zbV9oaXN0IHsKKwlfX3U2NCBmbGFnczsKKwlfX3UzMiBkYXRhW0hJU1RfVl9TSVpFXTsKK307CisKICNkZWZpbmUgQUQ0X0xVVF9HUlAwX1NJWkUgMzMKICNkZWZpbmUgQUQ0X0xVVF9HUlAxX1NJWkUgMzIKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvZHJtL3NkZV9kcm0uaCBiL2luY2x1ZGUvdWFwaS9kcm0vc2RlX2RybS5oCmluZGV4IDI4NTUwOGEuLjFhNDM2NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9kcm0vc2RlX2RybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9kcm0vc2RlX2RybS5oCkBAIC0yOTUsNiArMjk1LDQ0IEBACiAJc3RydWN0IHNkZV9kcm1fZGVfdjEgZGU7CiB9OwogCisvKiBOdW1iZXIgb2YgZGVzdCBzY2FsZXJzIHN1cHBvcnRlZCAqLworI2RlZmluZSBTREVfTUFYX0RTX0NPVU5UIDIKKworLyoKKyAqIERlc3RpbmF0aW9uIHNjYWxlciBmbGFnIGNvbmZpZworICovCisjZGVmaW5lIFNERV9EUk1fREVTVFNDQUxFUl9FTkFCTEUgICAgICAgICAgIDB4MQorI2RlZmluZSBTREVfRFJNX0RFU1RTQ0FMRVJfU0NBTEVfVVBEQVRFICAgICAweDIKKyNkZWZpbmUgU0RFX0RSTV9ERVNUU0NBTEVSX0VOSEFOQ0VSX1VQREFURSAgMHg0CisjZGVmaW5lIFNERV9EUk1fREVTVFNDQUxFUl9QVV9FTkFCTEUgICAgICAgIDB4OAorCisvKioKKyAqIHN0cnVjdCBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2NmZyAtIGRlc3RpbmF0aW9uIHNjYWxlciBjb25maWcgc3RydWN0dXJlCisgKiBAZmxhZ3M6ICAgICAgRmxhZyB0byBzd2l0Y2ggYmV0d2VlbiBtb2RlIGZvciBkZXN0aW5hdGlvbiBzY2FsZXIKKyAqICAgICAgICAgICAgICByZWZlciB0byBkZXN0aW5hdGlvbiBzY2FsZXIgZmxhZyBjb25maWcKKyAqIEBpbmRleDogICAgICBEZXN0aW5hdGlvbiBzY2FsZXIgc2VsZWN0aW9uIGluZGV4CisgKiBAbG1fd2lkdGg6ICAgTGF5ZXIgbWl4ZXIgd2lkdGggY29uZmlndXJhdGlvbgorICogQGxtX2hlaWdodDogIExheWVyIG1peGVyIGhlaWdodCBjb25maWd1cmF0aW9uCisgKiBAc2NhbGVyX2NmZzogVGhlIHNjYWxpbmcgcGFyYW1ldGVycyBmb3IgYWxsIHRoZSBtb2RlIGV4Y2VwdCBkaXNhYmxlCisgKiAgICAgICAgICAgICAgVXNlcnNwYWNlIHBvaW50ZXIgdG8gc3RydWN0IHNkZV9kcm1fc2NhbGVyX3YyCisgKi8KK3N0cnVjdCBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2NmZyB7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgbG1fd2lkdGg7CisJdWludDMyX3QgbG1faGVpZ2h0OworCXVpbnQ2NF90IHNjYWxlcl9jZmc7Cit9OworCisvKioKKyAqIHN0cnVjdCBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2RhdGEgLSBkZXN0aW5hdGlvbiBzY2FsZXIgZGF0YSBzdHJ1Y3QKKyAqIEBudW1fZGVzdF9zY2FsZXI6IE51bWJlciBvZiBkZXN0IHNjYWxlcnMgdG8gYmUgY29uZmlndXJlZAorICogQGRzX2NmZzogICAgICAgICAgRGVzdGluYXRpb24gc2NhbGVyIGJsb2NrIGNvbmZpZ3VyYXRpb24KKyAqLworc3RydWN0IHNkZV9kcm1fZGVzdF9zY2FsZXJfZGF0YSB7CisJdWludDMyX3QgbnVtX2Rlc3Rfc2NhbGVyOworCXN0cnVjdCBzZGVfZHJtX2Rlc3Rfc2NhbGVyX2NmZyBkc19jZmdbU0RFX01BWF9EU19DT1VOVF07Cit9OwogCiAvKgogICogRGVmaW5lIGNvbnN0YW50cyBmb3Igc3RydWN0IHNkZV9kcm1fY3NjCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAppbmRleCBjZDc1OGMyLi5lYTcyN2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKQEAgLTYzLDcgKzYzLDYgQEAKIGhlYWRlci15ICs9IGF1dG9fZnM0LmgKIGhlYWRlci15ICs9IGF1dG9fZnMuaAogaGVhZGVyLXkgKz0gYXV4dmVjLmgKLWhlYWRlci15ICs9IGF2dGltZXIuaAogaGVhZGVyLXkgKz0gYXgyNS5oCiBoZWFkZXIteSArPSBiMWxsaS5oCiBoZWFkZXIteSArPSBiYXljb20uaApAQCAtMjg3LDIzICsyODYsNiBAQAogaGVhZGVyLXkgKz0gbXJvdXRlLmgKIGhlYWRlci15ICs9IG1zZG9zX2ZzLmgKIGhlYWRlci15ICs9IG1zZy5oCi1oZWFkZXIteSArPSBtc21fYXVkaW8uaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX2FhYy5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fYWMzLmgKLWhlYWRlci15ICs9IG1zbV9hdWRpb19hbXJuYi5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fYW1yd2IuaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX2FtcndicGx1cy5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fY2FsaWJyYXRpb24uaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX212cy5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fcWNwLmgKLWhlYWRlci15ICs9IG1zbV9hdWRpb19zYmMuaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX3ZvaWNlbWVtby5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fd21hLmgKLWhlYWRlci15ICs9IG1zbV9hdWRpb193bWFwcm8uaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX2FsYWMuaAotaGVhZGVyLXkgKz0gbXNtX2F1ZGlvX2FwZS5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fZzcxMS5oCi1oZWFkZXIteSArPSBtc21fYXVkaW9fZzcxMV9kZWMuaAogaGVhZGVyLXkgKz0gbXNtX2lvbi5oCiBoZWFkZXIteSArPSBtc21faXBjLmgKIGhlYWRlci15ICs9IG1zbV9rZ3NsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hdnRpbWVyLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYXZ0aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmI1NDgzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9hdnRpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9VQVBJX0FWVElNRVJfSAotI2RlZmluZSBfVUFQSV9BVlRJTUVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgTUFKT1JfTlVNIDEwMAotCi0jZGVmaW5lIElPQ1RMX0dFVF9BVlRJTUVSX1RJQ0sgX0lPUihNQUpPUl9OVU0sIDAsIHVpbnQ2NF90KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9maWJfcnVsZXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9maWJfcnVsZXMuaAppbmRleCBhNjZjNGJhLi5iYmYwMmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZmliX3J1bGVzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZpYl9ydWxlcy5oCkBAIC01NCw4ICs1NCw2IEBACiAJRlJBX1RBQkxFLAkvKiBFeHRlbmRlZCB0YWJsZSBpZCAqLwogCUZSQV9GV01BU0ssCS8qIG1hc2sgZm9yIG5ldGZpbHRlciBtYXJrICovCiAJRlJBX09JRk5BTUUsCi0JRlJBX1VJRF9TVEFSVCwJLyogVUlEIHJhbmdlICovCi0JRlJBX1VJRF9FTkQsCiAJRlJBX1BBRCwKIAlGUkFfTDNNREVWLAkvKiBpaWYgb3Igb2lmIGlzIGwzbWRldiBnb3RvIGl0cyB0YWJsZSAqLwogCUZSQV9VSURfUkFOR0UsCS8qIFVJRCByYW5nZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjEzZDAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKiBpbmNsdWRlL2xpbnV4L21zbV9hdWRpby5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX1VBUElfTElOVVhfTVNNX0FVRElPX0gKLSNkZWZpbmUgX1VBUElfTElOVVhfTVNNX0FVRElPX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotLyogUENNIEF1ZGlvICovCi0KLSNkZWZpbmUgQVVESU9fSU9DVExfTUFHSUMgJ2EnCi0KLSNkZWZpbmUgQVVESU9fU1RBUlQgICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDAsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fU1RPUCAgICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fRkxVU0ggICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDIsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fR0VUX0NPTkZJRyAgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDMsIFwKLQkJc3RydWN0IG1zbV9hdWRpb19jb25maWcpCi0jZGVmaW5lIEFVRElPX1NFVF9DT05GSUcgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA0LCBcCi0JCXN0cnVjdCBtc21fYXVkaW9fY29uZmlnKQotI2RlZmluZSBBVURJT19HRVRfU1RBVFMgICAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgNSwgXAotCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzKQotI2RlZmluZSBBVURJT19FTkFCTEVfQVVEUFAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgNiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfQURSQyAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgNywgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfRVEgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOCwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfUlhfSUlSICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfVk9MVU1FICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTAsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fUEFVU0UgICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDExLCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX1BMQVlfRFRNRiAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19HRVRfRVZFTlQgICAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgMTMsIFwKLQkJc3RydWN0IG1zbV9hdWRpb19ldmVudCkKLSNkZWZpbmUgQVVESU9fQUJPUlRfR0VUX0VWRU5UIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDE0LCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX1JFR0lTVEVSX1BNRU0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTUsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fREVSRUdJU1RFUl9QTUVNIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDE2LCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX0FTWU5DX1dSSVRFIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDE3LCBcCi0JCXN0cnVjdCBtc21fYXVkaW9fYWlvX2J1ZikKLSNkZWZpbmUgQVVESU9fQVNZTkNfUkVBRCBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxOCwgXAotCQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYpCi0jZGVmaW5lIEFVRElPX1NFVF9JTkNBTEwgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTksIHN0cnVjdCBtc21fdm9pY2VyZWNfbW9kZSkKLSNkZWZpbmUgQVVESU9fR0VUX05VTV9TTkRfREVWSUNFIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDIwLCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX0dFVF9TTkRfREVWSUNFUyBfSU9XUihBVURJT19JT0NUTF9NQUdJQywgMjEsIFwKLQkJCQlzdHJ1Y3QgbXNtX3NuZF9kZXZpY2VfbGlzdCkKLSNkZWZpbmUgQVVESU9fRU5BQkxFX1NORF9ERVZJQ0UgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMjIsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fRElTQUJMRV9TTkRfREVWSUNFIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDIzLCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX1JPVVRFX1NUUkVBTSBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAyNCwgXAotCQkJCXN0cnVjdCBtc21fYXVkaW9fcm91dGVfY29uZmlnKQotI2RlZmluZSBBVURJT19HRVRfUENNX0NPTkZJRyBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCAzMCwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfUENNX0NPTkZJRyBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzMSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TV0lUQ0hfREVWSUNFICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzMiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfTVVURSAgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzMywgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19VUERBVEVfQUNEQiAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzNCwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TVEFSVF9WT0lDRSAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzNSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TVE9QX1ZPSUNFICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzNiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19SRUlOSVRfQUNEQiAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAzOSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19PVVRQT1JUX0ZMVVNIICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA0MCwgdW5zaWduZWQgc2hvcnQpCi0jZGVmaW5lIEFVRElPX1NFVF9FUlJfVEhSRVNIT0xEX1ZBTFVFIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDQxLCBcCi0JCQkJCXVuc2lnbmVkIHNob3J0KQotI2RlZmluZSBBVURJT19HRVRfQklUU1RSRUFNX0VSUk9SX0lORk8gX0lPUihBVURJT19JT0NUTF9NQUdJQywgNDIsIFwKLQkJCSAgICAgICBzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9lcnJvcl9pbmZvKQotCi0jZGVmaW5lIEFVRElPX1NFVF9TUlNfVFJVTUVESUFfUEFSQU0gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgNDMsIHVuc2lnbmVkIGludCkKLQotLyogUXVhbGNvbW0gdGVjaG5vbG9naWVzIGluYyBleHRlbnNpb25zICovCi0jZGVmaW5lIEFVRElPX1NFVF9TVFJFQU1fQ09ORklHICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgODAsIFwKLQkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpCi0jZGVmaW5lIEFVRElPX0dFVF9TVFJFQU1fQ09ORklHICAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgODEsIFwKLQkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX3N0cmVhbV9jb25maWcpCi0jZGVmaW5lIEFVRElPX0dFVF9TRVNTSU9OX0lEIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIDgyLCB1bnNpZ25lZCBzaG9ydCkKLSNkZWZpbmUgQVVESU9fR0VUX1NUUkVBTV9JTkZPICAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgODMsIFwKLQkJCSAgICAgICBzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvKQotI2RlZmluZSBBVURJT19TRVRfUEFOICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDg0LCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX1NFVF9RQ09OQ0VSVF9QTFVTICAgICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDg1LCB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIEFVRElPX1NFVF9NQkFEUkMgICAgICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgODYsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fU0VUX1ZPTFVNRV9QQVRIICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgODcsIFwKLQkJCQkgICAgIHN0cnVjdCBtc21fdm9sX2luZm8pCi0jZGVmaW5lIEFVRElPX1NFVF9NQVhfVk9MX0FMTCBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4OCwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19FTkFCTEVfQVVEUFJFICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA4OSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfQUdDICAgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MCwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfTlMgICAgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfVFhfSUlSICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MiwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19HRVRfQlVGX0NGRyAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCA5MywgXAotCQkJCQlzdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcpCi0jZGVmaW5lIEFVRElPX1NFVF9CVUZfQ0ZHICAgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk0LCBcCi0JCQkJCXN0cnVjdCBtc21fYXVkaW9fYnVmX2NmZykKLSNkZWZpbmUgQVVESU9fU0VUX0FDREJfQkxLIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk1LCAgXAotCQkJCQlzdHJ1Y3QgbXNtX2FjZGJfY21kX2RldmljZSkKLSNkZWZpbmUgQVVESU9fR0VUX0FDREJfQkxLIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDk2LCAgXAotCQkJCQlzdHJ1Y3QgbXNtX2FjZGJfY21kX2RldmljZSkKLQotI2RlZmluZSBBVURJT19SRUdJU1RFUl9JT04gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTcsIFwKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbykKLSNkZWZpbmUgQVVESU9fREVSRUdJU1RFUl9JT04gX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTgsIFwKLQkJc3RydWN0IG1zbV9hdWRpb19pb25faW5mbykKLSNkZWZpbmUgQVVESU9fU0VUX0VGRkVDVFNfQ09ORklHICAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgOTksIFwKLQkJCQlzdHJ1Y3QgbXNtX2h3YWNjX2VmZmVjdHNfY29uZmlnKQotI2RlZmluZSBBVURJT19FRkZFQ1RTX1NFVF9CVUZfTEVOIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMCwgXAotCQkJCXN0cnVjdCBtc21faHdhY2NfYnVmX2NmZykKLSNkZWZpbmUgQVVESU9fRUZGRUNUU19HRVRfQlVGX0FWQUlMIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMSwgXAotCQkJCXN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsKQotI2RlZmluZSBBVURJT19FRkZFQ1RTX1dSSVRFIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIDEwMiwgdm9pZCAqKQotI2RlZmluZSBBVURJT19FRkZFQ1RTX1JFQUQgX0lPV1IoQVVESU9fSU9DVExfTUFHSUMsIDEwMywgdm9pZCAqKQotI2RlZmluZSBBVURJT19FRkZFQ1RTX1NFVF9QUF9QQVJBTVMgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgMTA0LCB2b2lkICopCi0KLSNkZWZpbmUgQVVESU9fUE1fQVdBS0UgICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDUsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fUE1fUkVMQVggICAgICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCAxMDYsIHVuc2lnbmVkIGludCkKLQotI2RlZmluZQlBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTQkxMDcKLQotCi0jZGVmaW5lIEhBTkRTRVRfTUlDCQkJMHgwMQotI2RlZmluZSBIQU5EU0VUX1NQS1IJCQkweDAyCi0jZGVmaW5lIEhFQURTRVRfTUlDCQkJMHgwMwotI2RlZmluZSBIRUFEU0VUX1NQS1JfTU9OTwkJMHgwNAotI2RlZmluZSBIRUFEU0VUX1NQS1JfU1RFUkVPCQkweDA1Ci0jZGVmaW5lIFNQS1JfUEhPTkVfTUlDCQkJMHgwNgotI2RlZmluZSBTUEtSX1BIT05FX01PTk8JCQkweDA3Ci0jZGVmaW5lIFNQS1JfUEhPTkVfU1RFUkVPCQkweDA4Ci0jZGVmaW5lIEJUX1NDT19NSUMJCQkweDA5Ci0jZGVmaW5lIEJUX1NDT19TUEtSCQkJMHgwQQotI2RlZmluZSBCVF9BMkRQX1NQS1IJCQkweDBCCi0jZGVmaW5lIFRUWV9IRUFEU0VUX01JQwkJCTB4MEMKLSNkZWZpbmUgVFRZX0hFQURTRVRfU1BLUgkJMHgwRAotCi0vKiBEZWZhdWx0IGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYSAqLwotLyogZGV2aWNlIHN3aXRjaGluZyBjb250ZXh0LiBPbmx5IHN1cHBvcnRlZCAqLwotLyogZm9yIHN0cmVhbSBkZXZpY2VzLiAqLwotLyogRE8gTk9UIFVTRSAqLwotI2RlZmluZSBERUZBVUxUX1RYCQkJMHgwRQotI2RlZmluZSBERUZBVUxUX1JYCQkJMHgwRgotCi0jZGVmaW5lIEJUX0EyRFBfVFgJCQkweDEwCi0KLSNkZWZpbmUgSEVBRFNFVF9NT05PX1BMVVNfU1BLUl9NT05PX1JYICAgICAgICAgMHgxMQotI2RlZmluZSBIRUFEU0VUX01PTk9fUExVU19TUEtSX1NURVJFT19SWCAgICAgICAweDEyCi0jZGVmaW5lIEhFQURTRVRfU1RFUkVPX1BMVVNfU1BLUl9NT05PX1JYICAgICAgIDB4MTMKLSNkZWZpbmUgSEVBRFNFVF9TVEVSRU9fUExVU19TUEtSX1NURVJFT19SWCAgICAgMHgxNAotCi0jZGVmaW5lIEkyU19SWAkJCQkweDIwCi0jZGVmaW5lIEkyU19UWAkJCQkweDIxCi0KLSNkZWZpbmUgQURSQ19FTkFCTEUJCTB4MDAwMQotI2RlZmluZSBFUVVBTElaRVJfRU5BQkxFCTB4MDAwMgotI2RlZmluZSBJSVJfRU5BQkxFCQkweDAwMDQKLSNkZWZpbmUgUUNPTkNFUlRfUExVU19FTkFCTEUJMHgwMDA4Ci0jZGVmaW5lIE1CQURSQ19FTkFCTEUJCTB4MDAxMAotI2RlZmluZSBTUlNfRU5BQkxFCQkweDAwMjAKLSNkZWZpbmUgU1JTX0RJU0FCTEUJMHgwMDQwCi0KLSNkZWZpbmUgQUdDX0VOQUJMRQkJMHgwMDAxCi0jZGVmaW5lIE5TX0VOQUJMRQkJMHgwMDAyCi0jZGVmaW5lIFRYX0lJUl9FTkFCTEUJCTB4MDAwNAotI2RlZmluZSBGTFVFTkNFX0VOQUJMRQkJMHgwMDA4Ci0KLSNkZWZpbmUgVk9DX1JFQ19VUExJTksJCTB4MDAKLSNkZWZpbmUgVk9DX1JFQ19ET1dOTElOSwkweDAxCi0jZGVmaW5lIFZPQ19SRUNfQk9USAkJMHgwMgotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2NvbmZpZyB7Ci0JdWludDMyX3QgYnVmZmVyX3NpemU7Ci0JdWludDMyX3QgYnVmZmVyX2NvdW50OwotCXVpbnQzMl90IGNoYW5uZWxfY291bnQ7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgdHlwZTsKLQl1aW50MzJfdCBtZXRhX2ZpZWxkOwotCXVpbnQzMl90IGJpdHM7Ci0JdWludDMyX3QgdW51c2VkWzNdOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19zdHJlYW1fY29uZmlnIHsKLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsKLQl1aW50MzJfdCBidWZmZXJfY291bnQ7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2J1Zl9jZmcgewotCXVpbnQzMl90IG1ldGFfaW5mb19lbmFibGU7Ci0JdWludDMyX3QgZnJhbWVzX3Blcl9idWY7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3N0YXRzIHsKLQl1aW50MzJfdCBieXRlX2NvdW50OwotCXVpbnQzMl90IHNhbXBsZV9jb3VudDsKLQl1aW50MzJfdCB1bnVzZWRbMl07Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2lvbl9pbmZvIHsKLQlpbnQgZmQ7Ci0Jdm9pZCAqdmFkZHI7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3BtZW1faW5mbyB7Ci0JaW50IGZkOwotCXZvaWQgKnZhZGRyOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19haW9fYnVmIHsKLQl2b2lkICpidWZfYWRkcjsKLQl1aW50MzJfdCBidWZfbGVuOwotCXVpbnQzMl90IGRhdGFfbGVuOwotCXZvaWQgKnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBzaG9ydCBtZmllbGRfc3o7IC8qb25seSB1c2VmdWwgZm9yIGRhdGEgaGFzIG1ldGEgZmllbGQgKi8KLX07Ci0KLS8qIEF1ZGlvIHJvdXRpbmcgKi8KLQotI2RlZmluZSBTTkRfSU9DVExfTUFHSUMgJ3MnCi0KLSNkZWZpbmUgU05EX01VVEVfVU5NVVRFRCAwCi0jZGVmaW5lIFNORF9NVVRFX01VVEVEICAgMQotCi1zdHJ1Y3QgbXNtX211dGVfaW5mbyB7Ci0JdWludDMyX3QgbXV0ZTsKLQl1aW50MzJfdCBwYXRoOwotfTsKLQotc3RydWN0IG1zbV92b2xfaW5mbyB7Ci0JdWludDMyX3Qgdm9sOwotCXVpbnQzMl90IHBhdGg7Ci19OwotCi1zdHJ1Y3QgbXNtX3ZvaWNlcmVjX21vZGUgewotCXVpbnQzMl90IHJlY19tb2RlOwotfTsKLQotc3RydWN0IG1zbV9zbmRfZGV2aWNlX2NvbmZpZyB7Ci0JdWludDMyX3QgZGV2aWNlOwotCXVpbnQzMl90IGVhcl9tdXRlOwotCXVpbnQzMl90IG1pY19tdXRlOwotfTsKLQotI2RlZmluZSBTTkRfU0VUX0RFVklDRSBfSU9XKFNORF9JT0NUTF9NQUdJQywgMiwgc3RydWN0IG1zbV9kZXZpY2VfY29uZmlnICopCi0KLWVudW0gY2FkX2RldmljZV9wYXRoX3R5cGUgewotCUNBRF9ERVZJQ0VfUEFUSF9SWCwJLypGb3IgRGVjb2Rpbmcgc2Vzc2lvbiovCi0JQ0FEX0RFVklDRV9QQVRIX1RYLAkvKiBGb3IgRW5jb2Rpbmcgc2Vzc2lvbiovCi0JQ0FEX0RFVklDRV9QQVRIX1JYX1RYLCAvKiBGb3IgVm9pY2UgY2FsbCAqLwotCUNBRF9ERVZJQ0VfUEFUSF9MQiwJLyogRm9yIGxvb3BiYWNrIChGTSBBbmFsb2cpKi8KLQlDQURfREVWSUNFX1BBVEhfTUFYCi19OwotCi1zdHJ1Y3QgY2FkX2RldmljZXNfdHlwZSB7Ci0JdWludDMyX3QgcnhfZGV2aWNlOwotCXVpbnQzMl90IHR4X2RldmljZTsKLQllbnVtIGNhZF9kZXZpY2VfcGF0aF90eXBlIHBhdGh0eXBlOwotfTsKLQotc3RydWN0IG1zbV9jYWRfZGV2aWNlX2NvbmZpZyB7Ci0Jc3RydWN0IGNhZF9kZXZpY2VzX3R5cGUgZGV2aWNlOwotCXVpbnQzMl90IGVhcl9tdXRlOwotCXVpbnQzMl90IG1pY19tdXRlOwotfTsKLQotI2RlZmluZSBDQURfU0VUX0RFVklDRSBfSU9XKFNORF9JT0NUTF9NQUdJQywgMiwgc3RydWN0IG1zbV9jYWRfZGV2aWNlX2NvbmZpZyAqKQotCi0jZGVmaW5lIFNORF9NRVRIT0RfVk9JQ0UgMAotI2RlZmluZSBTTkRfTUVUSE9EX01JREkgNAotCi1zdHJ1Y3QgbXNtX3NuZF92b2x1bWVfY29uZmlnIHsKLQl1aW50MzJfdCBkZXZpY2U7Ci0JdWludDMyX3QgbWV0aG9kOwotCXVpbnQzMl90IHZvbHVtZTsKLX07Ci0KLSNkZWZpbmUgU05EX1NFVF9WT0xVTUUgX0lPVyhTTkRfSU9DVExfTUFHSUMsIDMsIHN0cnVjdCBtc21fc25kX3ZvbHVtZV9jb25maWcgKikKLQotc3RydWN0IG1zbV9jYWRfdm9sdW1lX2NvbmZpZyB7Ci0Jc3RydWN0IGNhZF9kZXZpY2VzX3R5cGUgZGV2aWNlOwotCXVpbnQzMl90IG1ldGhvZDsKLQl1aW50MzJfdCB2b2x1bWU7Ci19OwotCi0jZGVmaW5lIENBRF9TRVRfVk9MVU1FIF9JT1coU05EX0lPQ1RMX01BR0lDLCAzLCBzdHJ1Y3QgbXNtX2NhZF92b2x1bWVfY29uZmlnICopCi0KLS8qIFJldHVybnMgdGhlIG51bWJlciBvZiBTTkQgZW5kcG9pbnRzIHN1cHBvcnRlZC4gKi8KLQotI2RlZmluZSBTTkRfR0VUX05VTV9FTkRQT0lOVFMgX0lPUihTTkRfSU9DVExfTUFHSUMsIDQsIHVuc2lnbmVkIGludCAqKQotCi1zdHJ1Y3QgbXNtX3NuZF9lbmRwb2ludCB7Ci0JaW50IGlkOyAvKiBpbnB1dCBhbmQgb3V0cHV0ICovCi0JY2hhciBuYW1lWzY0XTsgLyogb3V0cHV0IG9ubHkgKi8KLX07Ci0KLS8qIFRha2VzIGFuIGluZGV4IGJldHdlZW4gMCBhbmQgb25lIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJldHVybmVkIGJ5Ci0gKiBTTkRfR0VUX05VTV9FTkRQT0lOVFMsIGFuZCByZXR1cm5zIHRoZSBTTkQgaW5kZXggYW5kIG5hbWUgb2YgYQotICogU05EIGVuZHBvaW50LiAgT24gaW5wdXQsIHRoZSAuaWQgZmllbGQgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUKLSAqIGVuZHBvaW50LCBhbmQgb24gZXhpdCBpdCBjb250YWlucyB0aGUgU05EIGluZGV4LCB3aGlsZSAubmFtZSBjb250YWlucwotICogdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbmRwb2ludC4KLSAqLwotCi0jZGVmaW5lIFNORF9HRVRfRU5EUE9JTlQgX0lPV1IoU05EX0lPQ1RMX01BR0lDLCA1LCBzdHJ1Y3QgbXNtX3NuZF9lbmRwb2ludCAqKQotCi0KLSNkZWZpbmUgU05EX0FWQ19DVEwgX0lPVyhTTkRfSU9DVExfTUFHSUMsIDYsIHVuc2lnbmVkIGludCAqKQotI2RlZmluZSBTTkRfQUdDX0NUTCBfSU9XKFNORF9JT0NUTF9NQUdJQywgNywgdW5zaWduZWQgaW50ICopCi0KLS8qcmV0dXJuIHRoZSBudW1iZXIgb2YgQ0FEIGVuZHBvaW50cyBzdXBwb3J0ZWQuICovCi0KLSNkZWZpbmUgQ0FEX0dFVF9OVU1fRU5EUE9JTlRTIF9JT1IoU05EX0lPQ1RMX01BR0lDLCA0LCB1bnNpZ25lZCBpbnQgKikKLQotc3RydWN0IG1zbV9jYWRfZW5kcG9pbnQgewotCWludCBpZDsgLyogaW5wdXQgYW5kIG91dHB1dCAqLwotCWNoYXIgbmFtZVs2NF07IC8qIG91dHB1dCBvbmx5ICovCi19OwotCi0vKiBUYWtlcyBhbiBpbmRleCBiZXR3ZWVuIDAgYW5kIG9uZSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXR1cm5lZCBieQotICogU05EX0dFVF9OVU1fRU5EUE9JTlRTLCBhbmQgcmV0dXJucyB0aGUgQ0FEIGluZGV4IGFuZCBuYW1lIG9mIGEKLSAqIENBRCBlbmRwb2ludC4gIE9uIGlucHV0LCB0aGUgLmlkIGZpZWxkIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlCi0gKiBlbmRwb2ludCwgYW5kIG9uIGV4aXQgaXQgY29udGFpbnMgdGhlIFNORCBpbmRleCwgd2hpbGUgLm5hbWUgY29udGFpbnMKLSAqIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZW5kcG9pbnQuCi0gKi8KLQotI2RlZmluZSBDQURfR0VUX0VORFBPSU5UIF9JT1dSKFNORF9JT0NUTF9NQUdJQywgNSwgc3RydWN0IG1zbV9jYWRfZW5kcG9pbnQgKikKLQotc3RydWN0IG1zbV9hdWRpb19wY21fY29uZmlnIHsKLQl1aW50MzJfdCBwY21fZmVlZGJhY2s7CS8qIDAgLSBkaXNhYmxlID4gMCAtIGVuYWJsZSAqLwotCXVpbnQzMl90IGJ1ZmZlcl9jb3VudDsJLyogTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYWxsb2NhdGUgKi8KLQl1aW50MzJfdCBidWZmZXJfc2l6ZTsJLyogU2l6ZSBvZiBidWZmZXIgZm9yIGNhcHR1cmluZyBvZgotCQkJCSAqIFBDTSBzYW1wbGVzCi0JCQkJICovCi19OwotCi0jZGVmaW5lIEFVRElPX0VWRU5UX1NVU1BFTkQgMAotI2RlZmluZSBBVURJT19FVkVOVF9SRVNVTUUgMQotI2RlZmluZSBBVURJT19FVkVOVF9XUklURV9ET05FIDIKLSNkZWZpbmUgQVVESU9fRVZFTlRfUkVBRF9ET05FICAgMwotI2RlZmluZSBBVURJT19FVkVOVF9TVFJFQU1fSU5GTyA0Ci0jZGVmaW5lIEFVRElPX0VWRU5UX0JJVFNUUkVBTV9FUlJPUl9JTkZPIDUKLQotI2RlZmluZSBBVURJT19DT0RFQ19UWVBFX01QMyAwCi0jZGVmaW5lIEFVRElPX0NPREVDX1RZUEVfQUFDIDEKLQotc3RydWN0IG1zbV9hdWRpb19iaXRzdHJlYW1faW5mbyB7Ci0JdWludDMyX3QgY29kZWNfdHlwZTsKLQl1aW50MzJfdCBjaGFuX2luZm87Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgYml0X3N0cmVhbV9pbmZvOwotCXVpbnQzMl90IGJpdF9yYXRlOwotCXVpbnQzMl90IHVudXNlZFszXTsKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8gewotCXVpbnQzMl90IGRlY19pZDsKLQl1aW50MzJfdCBlcnJfbXNnX2luZGljYXRvcjsKLQl1aW50MzJfdCBlcnJfdHlwZTsKLX07Ci0KLXVuaW9uIG1zbV9hdWRpb19ldmVudF9wYXlsb2FkIHsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Fpb19idWYgYWlvX2J1ZjsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2JpdHN0cmVhbV9pbmZvIHN0cmVhbV9pbmZvOwotCXN0cnVjdCBtc21fYXVkaW9fYml0c3RyZWFtX2Vycm9yX2luZm8gZXJyb3JfaW5mbzsKLQlpbnQgcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2V2ZW50IHsKLQlpbnQgZXZlbnRfdHlwZTsKLQlpbnQgdGltZW91dF9tczsKLQl1bmlvbiBtc21fYXVkaW9fZXZlbnRfcGF5bG9hZCBldmVudF9wYXlsb2FkOwotfTsKLQotI2RlZmluZSBNU01fU05EREVWX0NBUF9SWCAweDEKLSNkZWZpbmUgTVNNX1NORERFVl9DQVBfVFggMHgyCi0jZGVmaW5lIE1TTV9TTkRERVZfQ0FQX1ZPSUNFIDB4NAotCi1zdHJ1Y3QgbXNtX3NuZF9kZXZpY2VfaW5mbyB7Ci0JdWludDMyX3QgZGV2X2lkOwotCXVpbnQzMl90IGRldl9jYXA7IC8qIGJpdG1hc2sgZGVzY3JpYmUgY2FwYWJpbGl0eSBvZiBkZXZpY2UgKi8KLQljaGFyIGRldl9uYW1lWzY0XTsKLX07Ci0KLXN0cnVjdCBtc21fc25kX2RldmljZV9saXN0IHsKLQl1aW50MzJfdCAgbnVtX2RldjsgLyogSW5kaWNhdGUgbnVtYmVyIG9mIGRldmljZSBpbmZvIHRvIGJlIHJldHJpZXZlZCAqLwotCXN0cnVjdCBtc21fc25kX2RldmljZV9pbmZvICpsaXN0OwotfTsKLQotc3RydWN0IG1zbV9kdG1mX2NvbmZpZyB7Ci0JdWludDE2X3QgcGF0aDsKLQl1aW50MTZfdCBkdG1mX2hpOwotCXVpbnQxNl90IGR0bWZfbG93OwotCXVpbnQxNl90IGR1cmF0aW9uOwotCXVpbnQxNl90IHR4X2dhaW47Ci0JdWludDE2X3QgcnhfZ2FpbjsKLQl1aW50MTZfdCBtaXhpbmc7Ci19OwotCi0jZGVmaW5lIEFVRElPX1JPVVRFX1NUUkVBTV9WT0lDRV9SWCAwCi0jZGVmaW5lIEFVRElPX1JPVVRFX1NUUkVBTV9WT0lDRV9UWCAxCi0jZGVmaW5lIEFVRElPX1JPVVRFX1NUUkVBTV9QTEFZQkFDSyAyCi0jZGVmaW5lIEFVRElPX1JPVVRFX1NUUkVBTV9SRUMgICAgICAzCi0KLXN0cnVjdCBtc21fYXVkaW9fcm91dGVfY29uZmlnIHsKLQl1aW50MzJfdCBzdHJlYW1fdHlwZTsKLQl1aW50MzJfdCBzdHJlYW1faWQ7Ci0JdWludDMyX3QgZGV2X2lkOwotfTsKLQotI2RlZmluZSBBVURJT19NQVhfRVFfQkFORFMgMTIKLQotc3RydWN0IG1zbV9hdWRpb19lcV9iYW5kIHsKLQl1aW50MTZfdCAgICAgYmFuZF9pZHg7IC8qIFRoZSBiYW5kIGluZGV4LCAwIC4uIDExICovCi0JdWludDMyX3QgICAgIGZpbHRlcl90eXBlOyAvKiBGaWx0ZXIgYmFuZCB0eXBlICovCi0JdWludDMyX3QgICAgIGNlbnRlcl9mcmVxX2h6OyAvKiBGaWx0ZXIgYmFuZCBjZW50ZXIgZnJlcXVlbmN5ICovCi0JdWludDMyX3QgICAgIGZpbHRlcl9nYWluOyAvKiBGaWx0ZXIgYmFuZCBpbml0aWFsIGdhaW4gKGRCKSAqLwotCQkJLyogUmFuZ2UgaXMgKzEyIGRCIHRvIC0xMiBkQiB3aXRoIDFkQiBpbmNyZW1lbnRzLiAqLwotCXVpbnQzMl90ICAgICBxX2ZhY3RvcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcgewotCXVpbnQzMl90CWVuYWJsZTsgLyogTnVtYmVyIG9mIGNvbnNlcXV0aXZlIGJhbmRzIHNwZWNpZmllZCAqLwotCXVpbnQzMl90CW51bV9iYW5kczsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2VxX2JhbmQJZXFfYmFuZHNbQVVESU9fTUFYX0VRX0JBTkRTXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgbXNtX2FjZGJfY21kX2RldmljZSB7Ci0JdWludDMyX3QgICAgIGNvbW1hbmRfaWQ7Ci0JdWludDMyX3QgICAgIGRldmljZV9pZDsKLQl1aW50MzJfdCAgICAgbmV0d29ya19pZDsKLQl1aW50MzJfdCAgICAgc2FtcGxlX3JhdGVfaWQ7ICAgICAgLyogQWN0dWFsIHNhbXBsZSByYXRlIHZhbHVlICovCi0JdWludDMyX3QgICAgIGludGVyZmFjZV9pZDsgICAgICAgIC8qIFNlZSBpbnRlcmZhY2UgaWQncyBhYm92ZSAqLwotCXVpbnQzMl90ICAgICBhbGdvcml0aG1fYmxvY2tfaWQ7ICAvKiBTZWUgZW51bWVyYXRpb25zIGFib3ZlICovCi0JdWludDMyX3QgICAgIHRvdGFsX2J5dGVzOyAgICAgICAgIC8qIExlbmd0aCBpbiBieXRlcyB1c2VkIGJ5IGJ1ZmZlciAqLwotCXVpbnQzMl90ICAgICAqcGh5c19idWY7ICAgICAgICAgICAvKiBQaHlzaWNhbCBBZGRyZXNzIG9mIGRhdGEgKi8KLX07Ci0KLXN0cnVjdCBtc21faHdhY2NfZGF0YV9jb25maWcgewotCV9fdTMyIGJ1Zl9zaXplOwotCV9fdTMyIG51bV9idWY7Ci0JX191MzIgbnVtX2NoYW5uZWxzOwotCV9fdTggY2hhbm5lbF9tYXBbOF07Ci0JX191MzIgc2FtcGxlX3JhdGU7Ci0JX191MzIgYml0c19wZXJfc2FtcGxlOwotfTsKLQotc3RydWN0IG1zbV9od2FjY19idWZfY2ZnIHsKLQlfX3UzMiBpbnB1dF9sZW47Ci0JX191MzIgb3V0cHV0X2xlbjsKLX07Ci0KLXN0cnVjdCBtc21faHdhY2NfYnVmX2F2YWlsIHsKLQlfX3UzMiBpbnB1dF9udW1fYXZhaWw7Ci0JX191MzIgb3V0cHV0X251bV9hdmFpbDsKLX07Ci0KLXN0cnVjdCBtc21faHdhY2NfZWZmZWN0c19jb25maWcgewotCXN0cnVjdCBtc21faHdhY2NfZGF0YV9jb25maWcgaW5wdXQ7Ci0Jc3RydWN0IG1zbV9od2FjY19kYXRhX2NvbmZpZyBvdXRwdXQ7Ci0Jc3RydWN0IG1zbV9od2FjY19idWZfY2ZnIGJ1Zl9jZmc7Ci0JX191MzIgbWV0YV9tb2RlX2VuYWJsZWQ7Ci0JX191MzIgb3ZlcndyaXRlX3RvcG9sb2d5OwotCV9fczMyIHRvcG9sb2d5OwotfTsKLQotI2RlZmluZSBBRFNQX1NUUkVBTV9QUF9FVkVOVAkJCQkwCi0jZGVmaW5lIEFEU1BfU1RSRUFNX0VOQ0RFQ19FVkVOVAkJCTEKLSNkZWZpbmUgQURTUF9TVFJFQU1fSUVDXzYxOTM3X0ZNVF9VUERBVEVfRVZFTlQJCTIKLSNkZWZpbmUgQURTUF9TVFJFQU1fRVZFTlRfTUFYCQkJCTMKLQotc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEgewotCV9fdTMyIGV2ZW50X3R5cGU7Ci0JX191MzIgcGF5bG9hZF9sZW47Ci0JX191OCBwYXlsb2FkWzBdOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FhYy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZTFiNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FhYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fQUFDX0gKLSNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FBQ19ICi0KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW8uaD4KLQotI2RlZmluZSBBVURJT19TRVRfQUFDX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKQotI2RlZmluZSBBVURJT19HRVRfQUFDX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfY29uZmlnKQotCi0jZGVmaW5lIEFVRElPX1NFVF9BQUNfRU5DX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb19hYWNfZW5jX2NvbmZpZykKLQotI2RlZmluZSBBVURJT19HRVRfQUFDX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rNCksIHN0cnVjdCBtc21fYXVkaW9fYWFjX2VuY19jb25maWcpCi0KLSNkZWZpbmUgQVVESU9fU0VUX0FBQ19NSVhfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzUpLCB1aW50MzJfdCkKLQotI2RlZmluZSBBVURJT19BQUNfRk9STUFUX0FEVFMJCS0xCi0jZGVmaW5lCUFVRElPX0FBQ19GT1JNQVRfUkFXCQkweDAwMDAKLSNkZWZpbmUJQVVESU9fQUFDX0ZPUk1BVF9QU1VFRE9fUkFXCTB4MDAwMQotI2RlZmluZSBBVURJT19BQUNfRk9STUFUX0xPQVMJCTB4MDAwMgotI2RlZmluZSBBVURJT19BQUNfRk9STUFUX0FESUYJCTB4MDAwMwotCi0jZGVmaW5lIEFVRElPX0FBQ19PQkpFQ1RfTEMJCTB4MDAwMgotI2RlZmluZSBBVURJT19BQUNfT0JKRUNUX0xUUAkJMHgwMDA0Ci0jZGVmaW5lIEFVRElPX0FBQ19PQkpFQ1RfRVJMQwkJMHgwMDExCi0jZGVmaW5lIEFVRElPX0FBQ19PQkpFQ1RfQlNBQwkJMHgwMDE2Ci0KLSNkZWZpbmUgQVVESU9fQUFDX1NFQ19EQVRBX1JFU19PTiAgICAgICAweDAwMDEKLSNkZWZpbmUgQVVESU9fQUFDX1NFQ19EQVRBX1JFU19PRkYgICAgICAweDAwMDAKLQotI2RlZmluZSBBVURJT19BQUNfU0NBX0RBVEFfUkVTX09OICAgICAgIDB4MDAwMQotI2RlZmluZSBBVURJT19BQUNfU0NBX0RBVEFfUkVTX09GRiAgICAgIDB4MDAwMAotCi0jZGVmaW5lIEFVRElPX0FBQ19TUEVDX0RBVEFfUkVTX09OICAgICAgMHgwMDAxCi0jZGVmaW5lIEFVRElPX0FBQ19TUEVDX0RBVEFfUkVTX09GRiAgICAgMHgwMDAwCi0KLSNkZWZpbmUgQVVESU9fQUFDX1NCUl9PTl9GTEFHX09OCTB4MDAwMQotI2RlZmluZSBBVURJT19BQUNfU0JSX09OX0ZMQUdfT0ZGCTB4MDAwMAotCi0jZGVmaW5lIEFVRElPX0FBQ19TQlJfUFNfT05fRkxBR19PTgkweDAwMDEKLSNkZWZpbmUgQVVESU9fQUFDX1NCUl9QU19PTl9GTEFHX09GRgkweDAwMDAKLQotLyogUHJpbWFyeSBjaGFubmVsIG9uIGJvdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgKi8KLSNkZWZpbmUgQVVESU9fQUFDX0RVQUxfTU9OT19QTF9QUiAgMAotLyogU2Vjb25kYXJ5IGNoYW5uZWwgb24gYm90aCBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLwotI2RlZmluZSBBVURJT19BQUNfRFVBTF9NT05PX1NMX1NSICAxCi0vKiBQcmltYXJ5IGNoYW5uZWwgb24gcmlnaHQgY2hhbm5lbCBhbmQgMm5kIG9uIGxlZnQgY2hhbm5lbCAqLwotI2RlZmluZSBBVURJT19BQUNfRFVBTF9NT05PX1NMX1BSICAyCi0vKiAybmQgY2hhbm5lbCBvbiByaWdodCBjaGFubmVsIGFuZCBwcmltYXJ5IG9uIGxlZnQgY2hhbm5lbCAqLwotI2RlZmluZSBBVURJT19BQUNfRFVBTF9NT05PX1BMX1NSICAzCi0KLXN0cnVjdCBtc21fYXVkaW9fYWFjX2NvbmZpZyB7Ci0Jc2lnbmVkIHNob3J0IGZvcm1hdDsKLQl1bnNpZ25lZCBzaG9ydCBhdWRpb19vYmplY3Q7Ci0JdW5zaWduZWQgc2hvcnQgZXBfY29uZmlnOwkvKiAwIH4gMyB1c2VmdWwgb25seSBvYmogPSBFUkxDICovCi0JdW5zaWduZWQgc2hvcnQgYWFjX3NlY3Rpb25fZGF0YV9yZXNpbGllbmNlX2ZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgYWFjX3NjYWxlZmFjdG9yX2RhdGFfcmVzaWxpZW5jZV9mbGFnOwotCXVuc2lnbmVkIHNob3J0IGFhY19zcGVjdHJhbF9kYXRhX3Jlc2lsaWVuY2VfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBzYnJfb25fZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBzYnJfcHNfb25fZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBkdWFsX21vbm9fbW9kZTsKLQl1bnNpZ25lZCBzaG9ydCBjaGFubmVsX2NvbmZpZ3VyYXRpb247Ci0JdW5zaWduZWQgc2hvcnQgc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FhY19lbmNfY29uZmlnIHsKLQl1aW50MzJfdCBjaGFubmVsczsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQl1aW50MzJfdCBiaXRfcmF0ZTsKLQl1aW50MzJfdCBzdHJlYW1fZm9ybWF0OwotfTsKLQotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BQUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hYzMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYWMzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjZlNjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hYzMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FDM19ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19BQzNfSAotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNkZWZpbmUgQVVESU9fU0VUX0FDM19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fR0VUX0FDM19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHVuc2lnbmVkIGludCkKLQotI2RlZmluZSBBVURBQzNfREVGX1dPUkRTSVpFIDAKLSNkZWZpbmUgQVVEQUMzX0RFRl9VU0VSX0RPV05NSVhfRkxBRyAweDAKLSNkZWZpbmUgQVVEQUMzX0RFRl9VU0VSX0tBUkFPS0VfRkxBRyAweDAKLSNkZWZpbmUgQVVEQUMzX0RFRl9FUlJPUl9DT05DRUFMTUVOVCAwCi0jZGVmaW5lIEFVREFDM19ERUZfTUFYX1JFUEVBVF9DT1VOVCAgMAotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FjM19jb25maWcgewotCXVuc2lnbmVkIHNob3J0CQludW1DaGFuczsKLQl1bnNpZ25lZCBzaG9ydAkJd29yZFNpemU7Ci0JdW5zaWduZWQgc2hvcnQJCWtDYXBhYmxlTW9kZTsKLQl1bnNpZ25lZCBzaG9ydAkJY29tcE1vZGU7Ci0JdW5zaWduZWQgc2hvcnQJCW91dExmZU9uOwotCXVuc2lnbmVkIHNob3J0CQlvdXRwdXRNb2RlOwotCXVuc2lnbmVkIHNob3J0CQlzdGVyZW9Nb2RlOwotCXVuc2lnbmVkIHNob3J0CQlkdWFsTW9ub01vZGU7Ci0JdW5zaWduZWQgc2hvcnQJCWZzQ29kOwotCXVuc2lnbmVkIHNob3J0CQlwY21TY2FsZUZhYzsKLQl1bnNpZ25lZCBzaG9ydAkJZHluUm5nU2NhbGVIaTsKLQl1bnNpZ25lZCBzaG9ydAkJZHluUm5nU2NhbGVMb3c7Ci0JdW5zaWduZWQgc2hvcnQJCXVzZXJfZG93bm1peF9mbGFnOwotCXVuc2lnbmVkIHNob3J0CQl1c2VyX2thcmFva2VfZmxhZzsKLQl1bnNpZ25lZCBzaG9ydAkJZG1fYWRkcmVzc19oaWdoOwotCXVuc2lnbmVkIHNob3J0CQlkbV9hZGRyZXNzX2xvdzsKLQl1bnNpZ25lZCBzaG9ydAkJa29fYWRkcmVzc19oaWdoOwotCXVuc2lnbmVkIHNob3J0CQlrb19hZGRyZXNzX2xvdzsKLQl1bnNpZ25lZCBzaG9ydAkJZXJyb3JfY29uY2VhbG1lbnQ7Ci0JdW5zaWduZWQgc2hvcnQJCW1heF9yZXBfY291bnQ7Ci0JdW5zaWduZWQgc2hvcnQJCWNoYW5uZWxfcm91dGluZ19tb2RlWzZdOwotfTsKLQotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19BQzNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbGFjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FsYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3NmU5Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FsYWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FMQUNfSAotI2RlZmluZSBfVUFQSV9NU01fQVVESU9fQUxBQ19ICi0KLSNkZWZpbmUgQVVESU9fR0VUX0FMQUNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fYWxhY19jb25maWcpCi0jZGVmaW5lIEFVRElPX1NFVF9BTEFDX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnKQotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FsYWNfY29uZmlnIHsKLQl1aW50MzJfdCBmcmFtZUxlbmd0aDsKLQl1aW50OF90IGNvbXBhdFZlcnNpb247Ci0JdWludDhfdCBiaXREZXB0aDsKLQl1aW50OF90IHBiOyAvKiBjdXJyZW50bHkgdW51c2VkICovCi0JdWludDhfdCBtYjsgLyogY3VycmVudGx5IHVudXNlZCAqLwotCXVpbnQ4X3Qga2I7IC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KLQl1aW50OF90IGNoYW5uZWxDb3VudDsKLQl1aW50MTZfdCBtYXhSdW47IC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KLQl1aW50MzJfdCBtYXhTaXplOwotCXVpbnQzMl90IGF2ZXJhZ2VCaXRSYXRlOwotCXVpbnQzMl90IHNhbXBsZVJhdGU7Ci0JdWludDMyX3QgY2hhbm5lbExheW91dDsKLX07Ci0KLSNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fQUxBQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2Ftcm5iLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2Ftcm5iLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOWY5MjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbXJuYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fQU1STkJfSAotI2RlZmluZSBfVUFQSV9NU01fQVVESU9fQU1STkJfSAotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNkZWZpbmUgQVVESU9fR0VUX0FNUk5CX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fU0VUX0FNUk5CX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fR0VUX0FNUk5CX0VOQ19DT05GSUdfVjIgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMiksIFwKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWdfdjIpCi0jZGVmaW5lIEFVRElPX1NFVF9BTVJOQl9FTkNfQ09ORklHX1YyICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzMpLCBcCi0Jc3RydWN0IG1zbV9hdWRpb19hbXJuYl9lbmNfY29uZmlnX3YyKQotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2Ftcm5iX2VuY19jb25maWcgewotCXVuc2lnbmVkIHNob3J0IHZvaWNlbWVtb2VuY3dlaWdodDE7Ci0JdW5zaWduZWQgc2hvcnQgdm9pY2VtZW1vZW5jd2VpZ2h0MjsKLQl1bnNpZ25lZCBzaG9ydCB2b2ljZW1lbW9lbmN3ZWlnaHQzOwotCXVuc2lnbmVkIHNob3J0IHZvaWNlbWVtb2VuY3dlaWdodDQ7Ci0JdW5zaWduZWQgc2hvcnQgZHR4X21vZGVfZW5hYmxlOyAvKiAweEZGRkYgLSBlbmFibGUsIDAtIGRpc2FibGUgKi8KLQl1bnNpZ25lZCBzaG9ydCB0ZXN0X21vZGVfZW5hYmxlOyAvKiAweEZGRkYgLSBlbmFibGUsIDAtIGRpc2FibGUgKi8KLQl1bnNpZ25lZCBzaG9ydCBlbmNfbW9kZTsgLyogMC1NUjQ3NSwxLU1SNTE1LDItTVI1OSwzLU1SNjcsNC1NUjc0Ci0JCQkJICAqIDUtTVI3OTUsIDYtIE1SMTAyLCA3LSBNUjEyMihkZWZhdWx0KQotCQkJCSAgKi8KLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fYW1ybmJfZW5jX2NvbmZpZ192MiB7Ci0JdWludDMyX3QgYmFuZF9tb2RlOwotCXVpbnQzMl90IGR0eF9lbmFibGU7Ci0JdWludDMyX3QgZnJhbWVfZm9ybWF0OwotfTsKLSNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fQU1STkJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbXJ3Yi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hbXJ3Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI0MDM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0FNUldCX0gKLSNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0FNUldCX0gKLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jZGVmaW5lIEFVRElPX0dFVF9BTVJXQl9FTkNfQ09ORklHIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIFwKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcpCi0jZGVmaW5lIEFVRElPX1NFVF9BTVJXQl9FTkNfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBcCi0Jc3RydWN0IG1zbV9hdWRpb19hbXJ3Yl9lbmNfY29uZmlnKQotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2FtcndiX2VuY19jb25maWcgewotCXVpbnQzMl90IGJhbmRfbW9kZTsKLQl1aW50MzJfdCBkdHhfZW5hYmxlOwotCXVpbnQzMl90IGZyYW1lX2Zvcm1hdDsKLX07Ci0jZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX0FNUldCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2JwbHVzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2FtcndicGx1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJkMDZlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYW1yd2JwbHVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jaWZuZGVmIF9VQVBJX01TTV9BVURJT19BTVJfV0JfUExVU19ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19BTVJfV0JfUExVU19ICi0KLSNkZWZpbmUgQVVESU9fR0VUX0FNUldCUExVU19DT05GSUdfVjIgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMiksIHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikKLSNkZWZpbmUgQVVESU9fU0VUX0FNUldCUExVU19DT05GSUdfVjIgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMyksIHN0cnVjdCBtc21fYXVkaW9fYW1yd2JwbHVzX2NvbmZpZ192MikKLQotc3RydWN0IG1zbV9hdWRpb19hbXJ3YnBsdXNfY29uZmlnX3YyIHsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9ieXRlczsKLQl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKLQl1bnNpZ25lZCBpbnQgbnVtX2NoYW5uZWxzOwotCXVuc2lnbmVkIGludCBhbXJfYmFuZF9tb2RlOwotCXVuc2lnbmVkIGludCBhbXJfZHR4X21vZGU7Ci0JdW5zaWduZWQgaW50IGFtcl9mcmFtZV9mbXQ7Ci0JdW5zaWduZWQgaW50IGFtcl9sc2ZfaWR4OwotfTsKLSNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fQU1SX1dCX1BMVVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hcGUuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fYXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2QzYmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19hcGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGhhcyBiZWVuIHRha2VuCi0gKiBmcm9tIE1vbmtleSdzIEF1ZGlvIFNESyB3aXRoIHBlcm1pc3Npb24KLSAqLwotCi0jaWZuZGVmIF9VQVBJX01TTV9BVURJT19BUEVfSAotI2RlZmluZSBfVUFQSV9NU01fQVVESU9fQVBFX0gKLQotI2RlZmluZSBBVURJT19HRVRfQVBFX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX2FwZV9jb25maWcpCi0jZGVmaW5lIEFVRElPX1NFVF9BUEVfQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fYXBlX2NvbmZpZykKLQotc3RydWN0IG1zbV9hdWRpb19hcGVfY29uZmlnIHsKLQl1aW50MTZfdCBjb21wYXRpYmxlVmVyc2lvbjsKLQl1aW50MTZfdCBjb21wcmVzc2lvbkxldmVsOwotCXVpbnQzMl90IGZvcm1hdEZsYWdzOwotCXVpbnQzMl90IGJsb2Nrc1BlckZyYW1lOwotCXVpbnQzMl90IGZpbmFsRnJhbWVCbG9ja3M7Ci0JdWludDMyX3QgdG90YWxGcmFtZXM7Ci0JdWludDE2X3QgYml0c1BlclNhbXBsZTsKLQl1aW50MTZfdCBudW1DaGFubmVsczsKLQl1aW50MzJfdCBzYW1wbGVSYXRlOwotCXVpbnQzMl90IHNlZWtUYWJsZVByZXNlbnQ7Ci19OwotCi0jZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX0FQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2NhbGlicmF0aW9uLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2NhbGlicmF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMGI4NjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzE5ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX0NBTElCUkFUSU9OX0gKLSNkZWZpbmUgX1VBUElfTVNNX0FVRElPX0NBTElCUkFUSU9OX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotI2RlZmluZSBDQUxfSU9DVExfTUFHSUMgJ2EnCi0KLSNkZWZpbmUgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjAwLCB2b2lkICopCi0jZGVmaW5lIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjAxLCB2b2lkICopCi0jZGVmaW5lIEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT04JX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjAyLCB2b2lkICopCi0jZGVmaW5lIEFVRElPX1NFVF9DQUxJQlJBVElPTgkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjAzLCB2b2lkICopCi0jZGVmaW5lIEFVRElPX0dFVF9DQUxJQlJBVElPTgkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjA0LCB2b2lkICopCi0jZGVmaW5lIEFVRElPX1BPU1RfQ0FMSUJSQVRJT04JCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwNSwgdm9pZCAqKQotCi0vKiBGb3IgUmVhbC1UaW1lIEF1ZGlvIENhbGlicmF0aW9uICovCi0jZGVmaW5lIEFVRElPX0dFVF9SVEFDX0FETV9JTkZPCQlfSU9SKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwNywgdm9pZCAqKQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19WT0lDRV9JTkZPCV9JT1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjA4LCB2b2lkICopCi0jZGVmaW5lIEFVRElPX0dFVF9SVEFDX0FETV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwOSwgdm9pZCAqKQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19BRE1fQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKLQkJCQkJCQkyMTAsIHZvaWQgKikKLSNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQVNNX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjExLCB2b2lkICopCi0jZGVmaW5lIEFVRElPX1NFVF9SVEFDX0FTTV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIxMiwgdm9pZCAqKQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19DVlNfQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKLQkJCQkJCQkyMTMsIHZvaWQgKikKLSNkZWZpbmUgQVVESU9fU0VUX1JUQUNfQ1ZTX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjE0LCB2b2lkICopCi0jZGVmaW5lIEFVRElPX0dFVF9SVEFDX0NWUF9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIxNSwgdm9pZCAqKQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19DVlBfQ0FMCQlfSU9XUihDQUxfSU9DVExfTUFHSUMsIFwKLQkJCQkJCQkyMTYsIHZvaWQgKikKLSNkZWZpbmUgQVVESU9fR0VUX1JUQUNfQUZFX0NBTAkJX0lPV1IoQ0FMX0lPQ1RMX01BR0lDLCBcCi0JCQkJCQkJMjE3LCB2b2lkICopCi0jZGVmaW5lIEFVRElPX1NFVF9SVEFDX0FGRV9DQUwJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIxOCwgdm9pZCAqKQotZW51bSB7Ci0JQ1ZQX1ZPQ19SWF9UT1BPTE9HWV9DQUxfVFlQRSA9IDAsCi0JQ1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUxfVFlQRSwKLQlDVlBfVk9DUFJPQ19TVEFUSUNfQ0FMX1RZUEUsCi0JQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DQUxfVFlQRSwKLQlDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEUsCi0JQ1ZQX1ZPQ0RFVl9DRkdfQ0FMX1RZUEUsCi0JQ1ZQX1ZPQ1BST0NfU1RBVElDX0NPTF9DQUxfVFlQRSwKLQlDVlBfVk9DUFJPQ19EWU5BTUlDX0NPTF9DQUxfVFlQRSwKLQlDVlNfVk9DU1RSTV9TVEFUSUNfQ09MX0NBTF9UWVBFLAotCi0JQURNX1RPUE9MT0dZX0NBTF9UWVBFLAotCUFETV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAotCUFETV9BVURQUk9DX0NBTF9UWVBFLAotCUFETV9BVURWT0xfQ0FMX1RZUEUsCi0KLQlBU01fVE9QT0xPR1lfQ0FMX1RZUEUsCi0JQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCi0JQVNNX0FVRFNUUk1fQ0FMX1RZUEUsCi0KLQlBRkVfQ09NTU9OX1JYX0NBTF9UWVBFLAotCUFGRV9DT01NT05fVFhfQ0FMX1RZUEUsCi0JQUZFX0FOQ19DQUxfVFlQRSwKLQlBRkVfQUFOQ19DQUxfVFlQRSwKLQlBRkVfRkJfU1BLUl9QUk9UX0NBTF9UWVBFLAotCUFGRV9IV19ERUxBWV9DQUxfVFlQRSwKLQlBRkVfU0lERVRPTkVfQ0FMX1RZUEUsCi0JQUZFX1RPUE9MT0dZX0NBTF9UWVBFLAotCUFGRV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAotCi0JTFNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCi0JTFNNX1RPUE9MT0dZX0NBTF9UWVBFLAotCUxTTV9DQUxfVFlQRSwKLQotCUFETV9SVEFDX0lORk9fQ0FMX1RZUEUsCi0JVk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFLAotCUFETV9SVEFDX0FQUl9DQUxfVFlQRSwKLQlBU01fUlRBQ19BUFJfQ0FMX1RZUEUsCi0JVk9JQ0VfUlRBQ19BUFJfQ0FMX1RZUEUsCi0KLQlNQURfQ0FMX1RZUEUsCi0JVUxQX0FGRV9DQUxfVFlQRSwKLQlVTFBfTFNNX0NBTF9UWVBFLAotCi0JRFRTX0VBR0xFX0NBTF9UWVBFLAotCUFVRElPX0NPUkVfTUVUQUlORk9fQ0FMX1RZUEUsCi0JU1JTX1RSVU1FRElBX0NBTF9UWVBFLAotCi0JQ09SRV9DVVNUT01fVE9QT0xPR0lFU19DQUxfVFlQRSwKLQlBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEUsCi0KLQlVTFBfTFNNX1RPUE9MT0dZX0lEX0NBTF9UWVBFLAotCUFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEUsCi0JQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxfVFlQRSwKLQlBRkVfU0lERVRPTkVfSUlSX0NBTF9UWVBFLAotCU1BWF9DQUxfVFlQRVMsCi19OwotCi0jZGVmaW5lIEFGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMX1RZUEUgQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxfVFlQRQotI2RlZmluZSBBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF9UWVBFIEFGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMX1RZUEUKLQotI2RlZmluZSBBRkVfU0lERVRPTkVfSUlSX0NBTF9UWVBFIEFGRV9TSURFVE9ORV9JSVJfQ0FMX1RZUEUKLQotZW51bSB7Ci0JVkVSU0lPTl8wXzAsCi19OwotCi1lbnVtIHsKLQlQRVJfVk9DT0RFUl9DQUxfQklUX01BU0sgPSAweDEwMDAwLAotfTsKLQotI2RlZmluZSBNQVhfSU9DVExfQ01EX1NJWkUJNTEyCi0KLS8qIGNvbW1vbiBzdHJ1Y3R1cmVzICovCi0KLXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyIHsKLQlpbnQzMl90CQlkYXRhX3NpemU7Ci0JaW50MzJfdAkJdmVyc2lvbjsKLQlpbnQzMl90CQljYWxfdHlwZTsKLQlpbnQzMl90CQljYWxfdHlwZV9zaXplOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlciB7Ci0JaW50MzJfdAkJdmVyc2lvbjsKLQlpbnQzMl90CQlidWZmZXJfbnVtYmVyOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9kYXRhIHsKLQkvKiBTaXplIG9mIGNhbCBkYXRhIGF0IG1lbV9oYW5kbGUgYWxsb2NhdGlvbiBvciBhdCB2YWRkciAqLwotCWludDMyX3QJCWNhbF9zaXplOwotCS8qIElmIG1lbV9oYW5kbGUgaWYgc2hhcmVkIG1lbW9yeSBpcyB1c2VkKi8KLQlpbnQzMl90CQltZW1faGFuZGxlOwotCS8qIHNpemUgb2YgdmlydHVhbCBtZW1vcnkgaWYgc2hhcmVkIG1lbW9yeSBub3QgdXNlZCAqLwotfTsKLQotCi0vKiBBVURJT19BTExPQ0FURV9DQUxJQlJBVElPTiAqLwotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FsbG9jIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfYWxsb2MgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FsbG9jCWNhbF90eXBlOwotfTsKLQotCi0vKiBBVURJT19ERUFMTE9DQVRFX0NBTElCUkFUSU9OICovCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZGVhbGxvYyB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2RlYWxsb2MgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2RlYWxsb2MJY2FsX3R5cGU7Ci19OwotCi0KLS8qIEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT04gKi8KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9wcmVwYXJlIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfcHJlcGFyZSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfcHJlcGFyZQljYWxfdHlwZTsKLX07Ci0KLQotLyogQVVESU9fUE9TVF9DQUxJQlJBVElPTiAqLwotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3Bvc3QgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9wb3N0IHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9wb3N0CWNhbF90eXBlOwotfTsKLQotLypBVURJT19DT1JFX01FVEFfSU5GTyAqLwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbWV0YWluZm8gewotCXVpbnQzMl90IG5LZXk7Ci19OwotCi0vKiBDYWwgaW5mbyB0eXBlcyAqLwotZW51bSB7Ci0JUlhfREVWSUNFLAotCVRYX0RFVklDRSwKLQlNQVhfUEFUSF9UWVBFCi19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWRtX3RvcCB7Ci0JaW50MzJfdAkJdG9wb2xvZ3k7Ci0JaW50MzJfdAkJYWNkYl9pZDsKLQkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCi0JaW50MzJfdAkJcGF0aDsKLQlpbnQzMl90CQlhcHBfdHlwZTsKLQlpbnQzMl90CQlzYW1wbGVfcmF0ZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jIHsKLQlpbnQzMl90CQlhY2RiX2lkOwotCS8qIFJYX0RFVklDRSBvciBUWF9ERVZJQ0UgKi8KLQlpbnQzMl90CQlwYXRoOwotCWludDMyX3QJCWFwcF90eXBlOwotCWludDMyX3QJCXNhbXBsZV9yYXRlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbCB7Ci0JaW50MzJfdAkJYWNkYl9pZDsKLQkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCi0JaW50MzJfdAkJcGF0aDsKLQlpbnQzMl90CQlhcHBfdHlwZTsKLQlpbnQzMl90CQl2b2xfaW5kZXg7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlIHsKLQlpbnQzMl90CQlhY2RiX2lkOwotCS8qIFJYX0RFVklDRSBvciBUWF9ERVZJQ0UgKi8KLQlpbnQzMl90CQlwYXRoOwotCWludDMyX3QJCXNhbXBsZV9yYXRlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZV90b3AgewotCWludDMyX3QJCXRvcG9sb2d5OwotCWludDMyX3QJCWFjZGJfaWQ7Ci0JLyogUlhfREVWSUNFIG9yIFRYX0RFVklDRSAqLwotCWludDMyX3QJCXBhdGg7Ci0JaW50MzJfdAkJc2FtcGxlX3JhdGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXNtX3RvcCB7Ci0JaW50MzJfdAkJdG9wb2xvZ3k7Ci0JaW50MzJfdAkJYXBwX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkc3RybSB7Ci0JaW50MzJfdAkJYXBwX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWFuYyB7Ci0JaW50MzJfdAkJYWNkYl9pZDsKLX07Ci0KLSNkZWZpbmUgTUFYX0hXX0RFTEFZX0VOVFJJRVMJMjUKLQotc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheV9lbnRyeSB7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci0JdWludDMyX3QgZGVsYXlfdXNlYzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZGF0YSB7Ci0JdWludDMyX3QJCQkJbnVtX2VudHJpZXM7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheV9lbnRyeQkJZW50cnlbTUFYX0hXX0RFTEFZX0VOVFJJRVNdOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5IHsKLQlpbnQzMl90CQkJCQlhY2RiX2lkOwotCS8qIFJYX0RFVklDRSBvciBUWF9ERVZJQ0UgKi8KLQlpbnQzMl90CQkJCQlwYXRoOwotCWludDMyX3QJCQkJCXByb3BlcnR5X3R5cGU7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheV9kYXRhCQlkYXRhOwotfTsKLQotZW51bSBtc21fc3Brcl9wcm90X3N0YXRlcyB7Ci0JTVNNX1NQS1JfUFJPVF9DQUxJQlJBVEVELAotCU1TTV9TUEtSX1BST1RfQ0FMSUJSQVRJT05fSU5fUFJPR1JFU1MsCi0JTVNNX1NQS1JfUFJPVF9ESVNBQkxFRCwKLQlNU01fU1BLUl9QUk9UX05PVF9DQUxJQlJBVEVELAotCU1TTV9TUEtSX1BST1RfUFJFX0NBTElCUkFURUQsCi0JTVNNX1NQS1JfUFJPVF9JTl9GVE1fTU9ERQotfTsKLSNkZWZpbmUgTVNNX1NQS1JfUFJPVF9JTl9GVE1fTU9ERSBNU01fU1BLUl9QUk9UX0lOX0ZUTV9NT0RFCi0KLWVudW0gbXNtX3Nwa3JfY291bnQgewotCVNQX1YyX1NQS1JfMSwKLQlTUF9WMl9TUEtSXzIsCi0JU1BfVjJfTlVNX01BWF9TUEtSUwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3Nwa19wcm90X2NmZyB7Ci0JaW50MzJfdAkJcjBbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JaW50MzJfdAkJdDBbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JdWludDMyX3QJcXVpY2tfY2FsaWJfZmxhZzsKLQl1aW50MzJfdAltb2RlOwotCS8qCi0JICogMCAtIFN0YXJ0IHNwayBwcm90Ci0JICogMSAtIFN0YXJ0IGNhbGliCi0JICogMiAtIERpc2FibGUgc3BrIHByb3QKLQkgKi8KLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfaW5mb19zcF90aF92aV9mdG1fY2ZnIHsKLQl1aW50MzJfdAl3YWl0X3RpbWVbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JdWludDMyX3QJZnRtX3RpbWVbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JdWludDMyX3QJbW9kZTsKLQkvKgotCSAqIDAgLSBub3JtYWwgcnVubmluZyBtb2RlCi0JICogMSAtIENhbGlicmF0aW9uCi0JICogMiAtIEZUTSBtb2RlCi0JICovCi19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfZXhfdmlfZnRtX2NmZyB7Ci0JdWludDMyX3QJd2FpdF90aW1lW1NQX1YyX05VTV9NQVhfU1BLUlNdOwotCXVpbnQzMl90CWZ0bV90aW1lW1NQX1YyX05VTV9NQVhfU1BLUlNdOwotCXVpbnQzMl90CW1vZGU7Ci0JLyoKLQkgKiAwIC0gbm9ybWFsIHJ1bm5pbmcgbW9kZQotCSAqIDIgLSBGVE0gbW9kZQotCSAqLwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX3BhcmFtIHsKLQlpbnQzMl90CQlmcmVxX3EyMFtTUF9WMl9OVU1fTUFYX1NQS1JTXTsKLQlpbnQzMl90CQlyZXNpc19xMjRbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JaW50MzJfdAkJcW1jdF9xMjRbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JaW50MzJfdAkJc3RhdHVzW1NQX1YyX05VTV9NQVhfU1BLUlNdOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX3BhcmFtIHsKLQlpbnQzMl90CQlyX2RjX3EyNFtTUF9WMl9OVU1fTUFYX1NQS1JTXTsKLQlpbnQzMl90CQl0ZW1wX3EyMltTUF9WMl9OVU1fTUFYX1NQS1JTXTsKLQlpbnQzMl90CQlzdGF0dXNbU1BfVjJfTlVNX01BWF9TUEtSU107Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbXNtX3Nwa19wcm90X3N0YXR1cyB7Ci0JaW50MzJfdAkJcjBbU1BfVjJfTlVNX01BWF9TUEtSU107Ci0JaW50MzJfdAkJc3RhdHVzOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lIHsKLQl1aW50MTZfdAllbmFibGU7Ci0JdWludDE2X3QJZ2FpbjsKLQlpbnQzMl90CQl0eF9hY2RiX2lkOwotCWludDMyX3QJCXJ4X2FjZGJfaWQ7Ci0JaW50MzJfdAkJbWlkOwotCWludDMyX3QJCXBpZDsKLX07Ci0KLSNkZWZpbmUgTUFYX1NJREVUT05FX0lJUl9EQVRBX1NJWkUgICAyMjQKLSNkZWZpbmUgTUFYX05PX0lJUl9GSUxURVJfU1RBR0UgICAgICAxMAotCi1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmVfaWlyIHsKLQl1aW50MTZfdAlpaXJfZW5hYmxlOwotCXVpbnQxNl90CW51bV9iaXF1YWRfc3RhZ2VzOwotCXVpbnQxNl90CXByZWdhaW47Ci0JaW50MzJfdAkgICAgICAgIHR4X2FjZGJfaWQ7Ci0JaW50MzJfdAkgICAgICAgIHJ4X2FjZGJfaWQ7Ci0JaW50MzJfdAkgICAgICAgIG1pZDsKLQlpbnQzMl90CSAgICAgICAgcGlkOwotCXVpbnQ4X3QJICAgICAgICBpaXJfY29uZmlnW01BWF9TSURFVE9ORV9JSVJfREFUQV9TSVpFXTsKLX07Ci1zdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCB7Ci0JaW50MzJfdAkJdG9wb2xvZ3k7Ci0JaW50MzJfdAkJYWNkYl9pZDsKLQlpbnQzMl90CQlhcHBfdHlwZTsKLX07Ci0KLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbSB7Ci0JaW50MzJfdAkJYWNkYl9pZDsKLQkvKiBSWF9ERVZJQ0Ugb3IgVFhfREVWSUNFICovCi0JaW50MzJfdAkJcGF0aDsKLQlpbnQzMl90CQlhcHBfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfdG9wIHsKLQlpbnQzMl90CQl0b3BvbG9neTsKLQlpbnQzMl90CQlhY2RiX2lkOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3Byb2MgewotCWludDMyX3QJCXR4X2FjZGJfaWQ7Ci0JaW50MzJfdAkJcnhfYWNkYl9pZDsKLQlpbnQzMl90CQl0eF9zYW1wbGVfcmF0ZTsKLQlpbnQzMl90CQlyeF9zYW1wbGVfcmF0ZTsKLX07Ci0KLWVudW0gewotCURFRkFVTFRfRkVBVFVSRV9TRVQsCi0JVk9MX0JPT1NUX0ZFQVRVUkVfU0VULAotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3ZvbCB7Ci0JaW50MzJfdAkJdHhfYWNkYl9pZDsKLQlpbnQzMl90CQlyeF9hY2RiX2lkOwotCS8qIERFRkFVTFRfIG9yIFZPTF9CT09TVF9GRUFUVVJFX1NFVCAqLwotCWludDMyX3QJCWZlYXR1cmVfc2V0OwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY2Rldl9jZmcgewotCWludDMyX3QJCXR4X2FjZGJfaWQ7Ci0JaW50MzJfdAkJcnhfYWNkYl9pZDsKLX07Ci0KLSNkZWZpbmUgTUFYX1ZPSUNFX0NPTFVNTlMJMjAKLQotdW5pb24gYXVkaW9fY2FsX2NvbF9uYSB7Ci0JdWludDhfdAkJdmFsODsKLQl1aW50MTZfdAl2YWwxNjsKLQl1aW50MzJfdAl2YWwzMjsKLQl1aW50NjRfdAl2YWw2NDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19jYWxfY29sIHsKLQl1aW50MzJfdAkJaWQ7Ci0JdWludDMyX3QJCXR5cGU7Ci0JdW5pb24gYXVkaW9fY2FsX2NvbF9uYQluYV92YWx1ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBhdWRpb19jYWxfY29sX2RhdGEgewotCXVpbnQzMl90CQludW1fY29sdW1uczsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NvbAljb2x1bW5bTUFYX1ZPSUNFX0NPTFVNTlNdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wgewotCWludDMyX3QJCQkJdGFibGVfaWQ7Ci0JaW50MzJfdAkJCQl0eF9hY2RiX2lkOwotCWludDMyX3QJCQkJcnhfYWNkYl9pZDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NvbF9kYXRhCWRhdGE7Ci19OwotCi0vKiBBVURJT19TRVRfQ0FMSUJSQVRJT04gJiAqLwotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfYmFzaWMgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FkbV90b3AgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9hZG1fdG9wIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZG1fdG9wCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX21ldGFpbmZvIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbWV0YWluZm8JY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY29yZV9tZXRhaW5mbyB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJICBoZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX21ldGFpbmZvIGNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHByb2MgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9hdWRwcm9jIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hdWRwcm9jCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHZvbCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbAljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfYXVkdm9sIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hdWR2b2wJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXNtX3RvcCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FzbV90b3AJY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2FzbV90b3AgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FzbV90b3AJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYXVkc3RybSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHN0cm0JY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2F1ZHN0cm0gewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHN0cm0JY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9hZmUgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FmZQljYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZmVfdG9wIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcAljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfYWZlX3RvcCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlX3RvcAljYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9hYW5jIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWFuYwljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfYWFuYyB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWFuYwljYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9mYl9zcGtfcHJvdF9jZmcgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3Nwa19wcm90X2NmZwljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfZmJfc3BrX3Byb3RfY2ZnIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3RfY2ZnCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX2Z0bV9jZmcgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX2Z0bV9jZmcJY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3NwX3RoX3ZpX2Z0bV9jZmcgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9mdG1fY2ZnCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX2Z0bV9jZmcgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX2Z0bV9jZmcJY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3NwX2V4X3ZpX2Z0bV9jZmcgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF9leF92aV9mdG1fY2ZnCWNhbF90eXBlOwotfTsKLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9od19kZWxheSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5CWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaHdfZGVsYXkJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc2lkZXRvbmUgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lCQljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfc2lkZXRvbmUgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zaWRldG9uZQkJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc2lkZXRvbmVfaWlyIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCSAgIGNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkgICBjYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmVfaWlyIGNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9zaWRldG9uZV9paXIgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQkgICBoZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NpZGV0b25lX2lpciBjYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc21fdG9wIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfaGVhZGVyCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcAljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfbHNtX3RvcCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfbHNtX3RvcAljYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc20gewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19sc20JY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX2xzbSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCWhkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfbHNtCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY190b3AgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfdG9wCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF92b2NfdG9wIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NfdG9wCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY3Byb2MgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb192b2Nwcm9jCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF92b2Nwcm9jIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2Nwcm9jCWNhbF90eXBlOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY3ZvbCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY3ZvbAljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdm9jdm9sIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2N2b2wJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jZGV2X2NmZyB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgkJY2FsX2hkcjsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2RhdGEJCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jZGV2X2NmZwljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdm9jZGV2X2NmZyB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY2Rldl9jZmcJY2FsX3R5cGU7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfdm9jX2NvbCB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJY2FsX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wJY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3ZvY19jb2wgewotCXN0cnVjdCBhdWRpb19jYWxfaGVhZGVyCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY19jb2wJY2FsX3R5cGU7Ci19OwotCi0vKiBBVURJT19HRVRfQ0FMSUJSQVRJT04gKi8KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9mYl9zcGtfcHJvdF9zdGF0dXMgewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCQljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbXNtX3Nwa19wcm90X3N0YXR1cwljYWxfaW5mbzsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfZmJfc3BrX3Byb3Rfc3RhdHVzIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2ZiX3Nwa19wcm90X3N0YXR1cwljYWxfdHlwZTsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9wYXJhbSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2hlYWRlcgkJCWNhbF9oZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9kYXRhCQkJCWNhbF9kYXRhOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19zcF90aF92aV9wYXJhbQkJY2FsX2luZm87Ci19OwotCi1zdHJ1Y3QgYXVkaW9fY2FsX3NwX3RoX3ZpX3BhcmFtIHsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2hlYWRlcgkJCQloZHI7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX3BhcmFtCQljYWxfdHlwZTsKLX07Ci1zdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfZXhfdmlfcGFyYW0gewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9oZWFkZXIJCQljYWxfaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfZGF0YQkJCQljYWxfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfZXhfdmlfcGFyYW0JCWNhbF9pbmZvOwotfTsKLQotc3RydWN0IGF1ZGlvX2NhbF9zcF9leF92aV9wYXJhbSB7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9oZWFkZXIJCQkJaGRyOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF9leF92aV9wYXJhbQkJY2FsX3R5cGU7Ci19OwotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19DQUxJQlJBVElPTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTEuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fZzcxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGViZDZhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fZzcxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fRzcxMV9ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19HNzExX0gKLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZW5jX2NvbmZpZyB7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci19OwotCi0jZGVmaW5lIEFVRElPX1NFVF9HNzExX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnKQotCi0jZGVmaW5lIEFVRElPX0dFVF9HNzExX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9lbmNfY29uZmlnKQotCi0KLSNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fRzcxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTFfZGVjLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX2c3MTFfZGVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2U0Y2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19nNzExX2RlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fRzcxMV9ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19HNzExX0gKLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2c3MTFfZGVjX2NvbmZpZyB7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGU7Ci19OwotCi0jZGVmaW5lIEFVRElPX1NFVF9HNzExX0RFQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnKQotCi0jZGVmaW5lIEFVRElPX0dFVF9HNzExX0RFQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHN0cnVjdCBtc21fYXVkaW9fZzcxMV9kZWNfY29uZmlnKQotCi0jZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX0c3MTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19tdnMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fbXZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzZiZjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19tdnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jaWZuZGVmIF9VQVBJX01TTV9BVURJT19NVlNfSAotI2RlZmluZSBfVUFQSV9NU01fQVVESU9fTVZTX0gKLQotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jZGVmaW5lIEFVRElPX0dFVF9NVlNfQ09ORklHIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0gKyAwKSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBBVURJT19TRVRfTVZTX0NPTkZJRyBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNICsgMSksIHVuc2lnbmVkIGludCkKLQotLyogTVZTIG1vZGVzICovCi0jZGVmaW5lIE1WU19NT0RFX0lTNzMzIDB4MSAvKlFDRUxQIDEzSyovCi0jZGVmaW5lIE1WU19NT0RFX0lTMTI3IDB4MiAvKkVWUkMtOGsqLwotI2RlZmluZSBNVlNfTU9ERV80R1ZfTkIgMHgzIC8qRVZSQy1CKi8KLSNkZWZpbmUgTVZTX01PREVfNEdWX1dCIDB4NCAvKkVWUkMtV0IqLwotI2RlZmluZSBNVlNfTU9ERV9BTVIgMHg1Ci0jZGVmaW5lIE1WU19NT0RFX0VGUiAweDYKLSNkZWZpbmUgTVZTX01PREVfRlIgMHg3Ci0jZGVmaW5lIE1WU19NT0RFX0hSIDB4OAotI2RlZmluZSBNVlNfTU9ERV9MSU5FQVJfUENNIDB4OQotI2RlZmluZSBNVlNfTU9ERV9HNzExIDB4QQotI2RlZmluZSBNVlNfTU9ERV9QQ00gMHhDCi0jZGVmaW5lIE1WU19NT0RFX0FNUl9XQiAweEQKLSNkZWZpbmUgTVZTX01PREVfRzcyOUEgMHhFCi0jZGVmaW5lIE1WU19NT0RFX0c3MTFBIDB4RgotI2RlZmluZSBNVlNfTU9ERV9HNzIyIDB4MTAKLSNkZWZpbmUgTVZTX01PREVfUENNX1dCIDB4MTIKLQotZW51bSBtc21fYXVkaW9fYW1yX21vZGUgewotCU1WU19BTVJfTU9ERV8wNDc1LCAvKiBBTVIgNC43NSBrYnBzICovCi0JTVZTX0FNUl9NT0RFXzA1MTUsIC8qIEFNUiA1LjE1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMDU5MCwgLyogQU1SIDUuOTAga2JwcyAqLwotCU1WU19BTVJfTU9ERV8wNjcwLCAvKiBBTVIgNi43MCBrYnBzICovCi0JTVZTX0FNUl9NT0RFXzA3NDAsIC8qIEFNUiA3LjQwIGticHMgKi8KLQlNVlNfQU1SX01PREVfMDc5NSwgLyogQU1SIDcuOTUga2JwcyAqLwotCU1WU19BTVJfTU9ERV8xMDIwLCAvKiBBTVIgMTAuMjAga2JwcyAqLwotCU1WU19BTVJfTU9ERV8xMjIwLCAvKiBBTVIgMTIuMjAga2JwcyAqLwotCU1WU19BTVJfTU9ERV8wNjYwLCAvKiBBTVItV0IgNi42MCBrYnBzICovCi0JTVZTX0FNUl9NT0RFXzA4ODUsIC8qIEFNUi1XQiA4Ljg1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMTI2NSwgLyogQU1SLVdCIDEyLjY1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMTQyNSwgLyogQU1SLVdCIDE0LjI1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMTU4NSwgLyogQU1SLVdCIDE1Ljg1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMTgyNSwgLyogQU1SLVdCIDE4LjI1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMTk4NSwgLyogQU1SLVdCIDE5Ljg1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMjMwNSwgLyogQU1SLVdCIDIzLjA1IGticHMgKi8KLQlNVlNfQU1SX01PREVfMjM4NSwgLyogQU1SLVdCIDIzLjg1IGticHMgKi8KLQlNVlNfQU1SX01PREVfVU5ERUYKLX07Ci0KLS8qIFRoZSBNVlMgVk9DIHJhdGUgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSByYXRlIG9mIFFDRUxQIDEzSyhJUzczMyksCi0gKiBFVlJDKElTMTI3KSwgNEdWLCBvciA0R1YtV0IgZnJhbWUuCi0gKi8KLWVudW0gbXNtX2F1ZGlvX3ZvY19yYXRlIHsKLQkJTVZTX1ZPQ18wX1JBVEUsIC8qIEJsYW5rIGZyYW1lICovCi0JCU1WU19WT0NfOF9SQVRFLCAvKiAxLzggcmF0ZSAgICAqLwotCQlNVlNfVk9DXzRfUkFURSwgLyogMS80IHJhdGUgICAgKi8KLQkJTVZTX1ZPQ18yX1JBVEUsIC8qIDEvMiByYXRlICAgICovCi0JCU1WU19WT0NfMV9SQVRFLCAvKiBGdWxsIHJhdGUgICAqLwotCQlNVlNfVk9DX0VSQVNVUkUsIC8qIGVyYXN1cmUgZnJhbWUgKi8KLQkJTVZTX1ZPQ19SQVRFX01BWCwKLQkJTVZTX1ZPQ19SQVRFX1VOREVGID0gTVZTX1ZPQ19SQVRFX01BWAotfTsKLQotZW51bSBtc21fYXVkaW9fYW1yX2ZyYW1lX3R5cGUgewotCU1WU19BTVJfU1BFRUNIX0dPT0QsCSAgICAgIC8qIEdvb2Qgc3BlZWNoIGZyYW1lICAgICAgICAgICAgICAqLwotCU1WU19BTVJfU1BFRUNIX0RFR1JBREVELCAgICAgIC8qIFNwZWVjaCBkZWdyYWRlZCAgICAgICAgICAgICAgICAqLwotCU1WU19BTVJfT05TRVQsCQkgICAgICAvKiBPbnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlNVlNfQU1SX1NQRUVDSF9CQUQsCSAgICAgIC8qIENvcnJ1cHQgc3BlZWNoIGZyYW1lIChiYWQgQ1JDKSAqLwotCU1WU19BTVJfU0lEX0ZJUlNULAkgICAgICAvKiBGaXJzdCBzaWxlbmNlIGRlc2NyaXB0b3IgICAgICAgKi8KLQlNVlNfQU1SX1NJRF9VUERBVEUsCSAgICAgIC8qIENvbWZvcnQgbm9pc2UgZnJhbWUgICAgICAgICAgICAqLwotCU1WU19BTVJfU0lEX0JBRCwJICAgICAgLyogQ29ycnVwdCBTSUQgZnJhbWUgKGJhZCBDUkMpICAgICovCi0JTVZTX0FNUl9OT19EQVRBLAkgICAgICAvKiBOb3RoaW5nIHRvIHRyYW5zbWl0ICAgICAgICAgICAgKi8KLQlNVlNfQU1SX1NQRUVDSF9MT1NUCSAgICAgIC8qIERvd25saW5rIHNwZWVjaCBsb3N0ICAgICAgICAgICAqLwotfTsKLQotZW51bSBtc21fYXVkaW9fZzcxMWFfbW9kZSB7Ci0JTVZTX0c3MTFBX01PREVfTVVMQVcsCi0JTVZTX0c3MTFBX01PREVfQUxBVwotfTsKLQotZW51bSBtc21fYXVkaW9fZzcxMV9tb2RlIHsKLQlNVlNfRzcxMV9NT0RFX01VTEFXLAotCU1WU19HNzExX01PREVfQUxBVwotfTsKLQotZW51bSBtdnNfZzcyMl9tb2RlX3R5cGUgewotCU1WU19HNzIyX01PREVfMDEsCi0JTVZTX0c3MjJfTU9ERV8wMiwKLQlNVlNfRzcyMl9NT0RFXzAzLAotCU1WU19HNzIyX01PREVfTUFYLAotCU1WU19HNzIyX01PREVfVU5ERUYKLX07Ci0KLWVudW0gbXNtX2F1ZGlvX2c3MTFhX2ZyYW1lX3R5cGUgewotCU1WU19HNzExQV9TUEVFQ0hfR09PRCwKLQlNVlNfRzcxMUFfU0lELAotCU1WU19HNzExQV9OT19EQVRBLAotCU1WU19HNzExQV9FUkFTVVJFCi19OwotCi1lbnVtIG1zbV9hdWRpb19nNzI5YV9mcmFtZV90eXBlIHsKLQlNVlNfRzcyOUFfTk9fREFUQSwKLQlNVlNfRzcyOUFfU1BFRUNIX0dPT0QsCi0JTVZTX0c3MjlBX1NJRCwKLQlNVlNfRzcyOUFfRVJBU1VSRQotfTsKLQotc3RydWN0IG1pbl9tYXhfcmF0ZSB7Ci0JdWludDMyX3QgbWluX3JhdGU7Ci0JdWludDMyX3QgbWF4X3JhdGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX212c19jb25maWcgewotCXVpbnQzMl90IG12c19tb2RlOwotCXVpbnQzMl90IHJhdGVfdHlwZTsKLQlzdHJ1Y3QgbWluX21heF9yYXRlIG1pbl9tYXhfcmF0ZTsKLQl1aW50MzJfdCBkdHhfbW9kZTsKLX07Ci0KLSNkZWZpbmUgTVZTX01BWF9WT0NfUEtUX1NJWkUgNjQwCi0KLXN0cnVjdCBnc21faGVhZGVyIHsKLQl1aW50OF90IGJmaTsKLQl1aW50OF90IHNpZDsKLQl1aW50OF90IHRhZjsKLQl1aW50OF90IHVmaTsKLX07Ci0KLXN0cnVjdCBxNl9tc21fYXVkaW9fbXZzX2ZyYW1lIHsKLQl1bmlvbiB7Ci0JdWludDMyX3QgZnJhbWVfdHlwZTsKLQl1aW50MzJfdCBwYWNrZXRfcmF0ZTsKLQlzdHJ1Y3QgZ3NtX2hlYWRlciBnc21fZnJhbWVfdHlwZTsKLQl9IGhlYWRlcjsKLQl1aW50MzJfdCBsZW47Ci0JdWludDhfdCB2b2NfcGt0W01WU19NQVhfVk9DX1BLVF9TSVpFXTsKLQotfTsKLQotc3RydWN0IG1zbV9hdWRpb19tdnNfZnJhbWUgewotCXVpbnQzMl90IGZyYW1lX3R5cGU7Ci0JdWludDMyX3QgbGVuOwotCXVpbnQ4X3Qgdm9jX3BrdFtNVlNfTUFYX1ZPQ19QS1RfU0laRV07Ci0KLX07Ci0KLSNkZWZpbmUgUTVWMl9NVlNfTUFYX1ZPQ19QS1RfU0laRSAzMjAKLQotc3RydWN0IHE1djJfbXNtX2F1ZGlvX212c19mcmFtZSB7Ci0JdWludDMyX3QgZnJhbWVfdHlwZTsKLQl1aW50MzJfdCBsZW47Ci0JdWludDhfdCB2b2NfcGt0W1E1VjJfTVZTX01BWF9WT0NfUEtUX1NJWkVdOwotCi19OwotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19NVlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19xY3AuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fcWNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjIzNGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19xY3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1FDUF9ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19RQ1BfSAotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNkZWZpbmUgQVVESU9fU0VUX1FDRUxQX0VOQ19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkwLCBzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcpCi0KLSNkZWZpbmUgQVVESU9fR0VUX1FDRUxQX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkxLCBzdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcpCi0KLSNkZWZpbmUgQVVESU9fU0VUX0VWUkNfRU5DX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAotCTIsIHN0cnVjdCBtc21fYXVkaW9fZXZyY19lbmNfY29uZmlnKQotCi0jZGVmaW5lIEFVRElPX0dFVF9FVlJDX0VOQ19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkzLCBzdHJ1Y3QgbXNtX2F1ZGlvX2V2cmNfZW5jX2NvbmZpZykKLQotI2RlZmluZSBDRE1BX1JBVEVfQkxBTksJCTB4MDAKLSNkZWZpbmUgQ0RNQV9SQVRFX0VJR0hUSAkweDAxCi0jZGVmaW5lIENETUFfUkFURV9RVUFSVEVSCTB4MDIKLSNkZWZpbmUgQ0RNQV9SQVRFX0hBTEYJCTB4MDMKLSNkZWZpbmUgQ0RNQV9SQVRFX0ZVTEwJCTB4MDQKLSNkZWZpbmUgQ0RNQV9SQVRFX0VSQVNVUkUJMHgwNQotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3FjZWxwX2VuY19jb25maWcgewotCXVpbnQzMl90IGNkbWFfcmF0ZTsKLQl1aW50MzJfdCBtaW5fYml0X3JhdGU7Ci0JdWludDMyX3QgbWF4X2JpdF9yYXRlOwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19ldnJjX2VuY19jb25maWcgewotCXVpbnQzMl90IGNkbWFfcmF0ZTsKLQl1aW50MzJfdCBtaW5fYml0X3JhdGU7Ci0JdWludDMyX3QgbWF4X2JpdF9yYXRlOwotfTsKLQotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19RQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19zYmMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fc2JjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2M2M2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb19zYmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1NCQ19ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19TQkNfSAotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNkZWZpbmUgQVVESU9fU0VUX1NCQ19FTkNfQ09ORklHICBfSU9XKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzApLCBzdHJ1Y3QgbXNtX2F1ZGlvX3NiY19lbmNfY29uZmlnKQotCi0jZGVmaW5lIEFVRElPX0dFVF9TQkNfRU5DX0NPTkZJRyAgX0lPUihBVURJT19JT0NUTF9NQUdJQywgXAotCShBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgc3RydWN0IG1zbV9hdWRpb19zYmNfZW5jX2NvbmZpZykKLQotI2RlZmluZSBBVURJT19TQkNfQkFfTE9VRE5FU1MJCTB4MAotI2RlZmluZSBBVURJT19TQkNfQkFfU05SCQkweDEKLQotI2RlZmluZSBBVURJT19TQkNfTU9ERV9NT05PCQkweDAKLSNkZWZpbmUgQVVESU9fU0JDX01PREVfRFVBTAkJMHgxCi0jZGVmaW5lIEFVRElPX1NCQ19NT0RFX1NURVJFTwkJMHgyCi0jZGVmaW5lIEFVRElPX1NCQ19NT0RFX0pTVEVSRU8JCTB4MwotCi0jZGVmaW5lIEFVRElPX1NCQ19CQU5EU184CQkweDEKLQotI2RlZmluZSBBVURJT19TQkNfQkxPQ0tTXzQJCTB4MAotI2RlZmluZSBBVURJT19TQkNfQkxPQ0tTXzgJCTB4MQotI2RlZmluZSBBVURJT19TQkNfQkxPQ0tTXzEyCQkweDIKLSNkZWZpbmUgQVVESU9fU0JDX0JMT0NLU18xNgkJMHgzCi0KLXN0cnVjdCBtc21fYXVkaW9fc2JjX2VuY19jb25maWcgewotCXVpbnQzMl90IGNoYW5uZWxzOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotCXVpbnQzMl90IGJpdF9hbGxvY2F0aW9uOwotCXVpbnQzMl90IG51bWJlcl9vZl9zdWJiYW5kczsKLQl1aW50MzJfdCBudW1iZXJfb2ZfYmxvY2tzOwotCXVpbnQzMl90IGJpdF9yYXRlOwotCXVpbnQzMl90IG1vZGU7Ci19OwotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19TQkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb192b2ljZW1lbW8uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fdm9pY2VtZW1vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTdhNGQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb192b2ljZW1lbW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1ZPSUNFTUVNT19ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19WT0lDRU1FTU9fSAotCi0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNkZWZpbmUgQVVESU9fR0VUX1ZPSUNFTUVNT19DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fU0VUX1ZPSUNFTUVNT19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMSksIHVuc2lnbmVkIGludCkKLQotLyogcmVjX3R5cGUgKi8KLWVudW0gcnBjX3ZvY19yZWNfZGlyX3R5cGUgewotCVJQQ19WT0NfUkVDX05PTkUsCi0JUlBDX1ZPQ19SRUNfRk9SV0FSRCwKLQlSUENfVk9DX1JFQ19SRVZFUlNFLAotCVJQQ19WT0NfUkVDX0JPVEgsCi0JUlBDX1ZPQ19NQVhfUkVDX1RZUEUKLX07Ci0KLS8qIGNhcGFiaWxpdHkgKi8KLWVudW0gcnBjX3ZvY19jYXBhYmlsaXR5X3R5cGUgewotCVJQQ19WT0NfQ0FQX0lTNzMzID0gNCwKLQlSUENfVk9DX0NBUF9JUzEyNyA9IDgsCi0JUlBDX1ZPQ19DQVBfQU1SID0gNjQsCi0JUlBDX1ZPQ19DQVBfMzJCSVRfRFVNTVkgPSAyMTQ3NDgzNjQ3Ci19OwotCi0vKiBSYXRlICovCi1lbnVtIHJwY192b2NfcmF0ZV90eXBlIHsKLQlSUENfVk9DXzBfUkFURSA9IDAsCi0JUlBDX1ZPQ184X1JBVEUsCi0JUlBDX1ZPQ180X1JBVEUsCi0JUlBDX1ZPQ18yX1JBVEUsCi0JUlBDX1ZPQ18xX1JBVEUsCi0JUlBDX1ZPQ19FUkFTVVJFLAotCVJQQ19WT0NfRVJSX1JBVEUsCi0JUlBDX1ZPQ19BTVJfUkFURV80NzUgPSAwLAotCVJQQ19WT0NfQU1SX1JBVEVfNTE1ID0gMSwKLQlSUENfVk9DX0FNUl9SQVRFXzU5MCA9IDIsCi0JUlBDX1ZPQ19BTVJfUkFURV82NzAgPSAzLAotCVJQQ19WT0NfQU1SX1JBVEVfNzQwID0gNCwKLQlSUENfVk9DX0FNUl9SQVRFXzc5NSA9IDUsCi0JUlBDX1ZPQ19BTVJfUkFURV8xMDIwID0gNiwKLQlSUENfVk9DX0FNUl9SQVRFXzEyMjAgPSA3LAotfTsKLQotLyogZnJhbWVfZm9ybWF0ICovCi1lbnVtIHJwY192b2NfcGJfbGVuX3JhdGVfdmFyX3R5cGUgewotCVJQQ19WT0NfUEJfTkFUSVZFX1FDUCA9IDMsCi0JUlBDX1ZPQ19QQl9BTVIsCi0JUlBDX1ZPQ19QQl9FVkIKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fdm9pY2VtZW1vX2NvbmZpZyB7Ci0JdWludDMyX3QgcmVjX3R5cGU7Ci0JdWludDMyX3QgcmVjX2ludGVydmFsX21zOwotCXVpbnQzMl90IGF1dG9fc3RvcF9tczsKLQl1aW50MzJfdCBjYXBhYmlsaXR5OwotCXVpbnQzMl90IG1heF9yYXRlOwotCXVpbnQzMl90IG1pbl9yYXRlOwotCXVpbnQzMl90IGZyYW1lX2Zvcm1hdDsKLQl1aW50MzJfdCBkdHhfZW5hYmxlOwotCXVpbnQzMl90IGRhdGFfcmVxX21zOwotfTsKLQotI2VuZGlmIC8qIF9VQVBJX01TTV9BVURJT19WT0lDRU1FTU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb193bWEuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9tc21fYXVkaW9fd21hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2ZhZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb193bWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSNpZm5kZWYgX1VBUElfTVNNX0FVRElPX1dNQV9ICi0jZGVmaW5lIF9VQVBJX01TTV9BVURJT19XTUFfSAotCi0jZGVmaW5lIEFVRElPX0dFVF9XTUFfQ09ORklHICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMCksIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgQVVESU9fU0VUX1dNQV9DT05GSUcgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSsxKSwgdW5zaWduZWQgaW50KQotCi0jZGVmaW5lIEFVRElPX0dFVF9XTUFfQ09ORklHX1YyICBfSU9SKEFVRElPX0lPQ1RMX01BR0lDLCBcCi0JICAoQVVESU9fTUFYX0NPTU1PTl9JT0NUTF9OVU0rMiksIHN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MikKLSNkZWZpbmUgQVVESU9fU0VUX1dNQV9DT05GSUdfVjIgIF9JT1coQVVESU9fSU9DVExfTUFHSUMsIFwKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSszKSwgc3RydWN0IG1zbV9hdWRpb193bWFfY29uZmlnX3YyKQotCi1zdHJ1Y3QgbXNtX2F1ZGlvX3dtYV9jb25maWcgewotCXVuc2lnbmVkIHNob3J0CWFybWRhdGFyZXF0aHI7Ci0JdW5zaWduZWQgc2hvcnQJY2hhbm5lbHNkZWNvZGVkOwotCXVuc2lnbmVkIHNob3J0CXdtYWJ5dGVzcGVyc2VjOwotCXVuc2lnbmVkIHNob3J0CXdtYXNhbXBsaW5nZnJlcTsKLQl1bnNpZ25lZCBzaG9ydAl3bWFlbmNvZGVyb3B0czsKLX07Ci0KLXN0cnVjdCBtc21fYXVkaW9fd21hX2NvbmZpZ192MiB7Ci0JdW5zaWduZWQgc2hvcnQJZm9ybWF0X3RhZzsKLQl1bnNpZ25lZCBzaG9ydAludW1jaGFubmVsczsKLQl1aW50MzJfdAlzYW1wbGluZ3JhdGU7Ci0JdWludDMyX3QJYXZnYnl0ZXNwZXJzZWNvbmQ7Ci0JdW5zaWduZWQgc2hvcnQJYmxvY2tfYWxpZ247Ci0JdW5zaWduZWQgc2hvcnQgIHZhbGlkYml0c3BlcnNhbXBsZTsKLQl1aW50MzJfdAljaGFubmVsbWFzazsKLQl1bnNpZ25lZCBzaG9ydAllbmNvZGVvcHQ7Ci19OwotCi0jZW5kaWYgLyogX1VBUElfTVNNX0FVRElPX1dNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3dtYXByby5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21zbV9hdWRpb193bWFwcm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjYmY5ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbXNtX2F1ZGlvX3dtYXByby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9NU01fQVVESU9fV01BUFJPX0gKLSNkZWZpbmUgX1VBUElfTVNNX0FVRElPX1dNQVBST19ICi0KLSNkZWZpbmUgQVVESU9fR0VUX1dNQVBST19DT05GSUcgIF9JT1IoQVVESU9fSU9DVExfTUFHSUMsIFwKLQkgIChBVURJT19NQVhfQ09NTU9OX0lPQ1RMX05VTSswKSwgc3RydWN0IG1zbV9hdWRpb193bWFwcm9fY29uZmlnKQotI2RlZmluZSBBVURJT19TRVRfV01BUFJPX0NPTkZJRyAgX0lPVyhBVURJT19JT0NUTF9NQUdJQywgXAotCSAgKEFVRElPX01BWF9DT01NT05fSU9DVExfTlVNKzEpLCBzdHJ1Y3QgbXNtX2F1ZGlvX3dtYXByb19jb25maWcpCi0KLXN0cnVjdCBtc21fYXVkaW9fd21hcHJvX2NvbmZpZyB7Ci0JdW5zaWduZWQgc2hvcnQgIGFybWRhdGFyZXF0aHI7Ci0JdWludDhfdCAgICAgICAgIHZhbGlkYml0c3BlcnNhbXBsZTsKLQl1aW50OF90ICAgICAgICAgbnVtY2hhbm5lbHM7Ci0JdW5zaWduZWQgc2hvcnQgIGZvcm1hdHRhZzsKLQl1aW50MzJfdCAgICAgICAgc2FtcGxpbmdyYXRlOwotCXVpbnQzMl90ICAgICAgICBhdmdieXRlc3BlcnNlY29uZDsKLQl1bnNpZ25lZCBzaG9ydCAgYXNmcGFja2V0bGVuZ3RoOwotCXVpbnQzMl90ICAgICAgICBjaGFubmVsbWFzazsKLQl1bnNpZ25lZCBzaG9ydCAgZW5jb2Rlb3B0OwotCXVuc2lnbmVkIHNob3J0ICBhZHZhbmNlZGVuY29kZW9wdDsKLQl1aW50MzJfdCAgICAgICAgYWR2YW5jZWRlbmNvZGVvcHQyOwotfTsKLSNlbmRpZiAvKiBfVUFQSV9NU01fQVVESU9fV01BUFJPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCmluZGV4IDhjMGZjN2IuLjlmYmRjMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaApAQCAtNTQ2LDYgKzU0NiwxMiBAQAogICoJd2VsbCB0byByZW1haW4gYmFja3dhcmRzIGNvbXBhdGlibGUuCiAgKiBATkw4MDIxMV9DTURfUk9BTTogcmVxdWVzdCB0aGF0IHRoZSBjYXJkIHJvYW0gKGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQpLAogICoJc2VudCBhcyBhbiBldmVudCB3aGVuIHRoZSBjYXJkL2RyaXZlciByb2FtZWQgYnkgaXRzZWxmLgorICoJV2hlbiB1c2VkIGFzIGFuIGV2ZW50LCBhbmQgdGhlIGRyaXZlciByb2FtZWQgaW4gYSBuZXR3b3JrIHRoYXQgcmVxdWlyZXMKKyAqCTgwMi4xWCBhdXRoZW50aWNhdGlvbiwgJU5MODAyMTFfQVRUUl9QT1JUX0FVVEhPUklaRUQgc2hvdWxkIGJlIHNldAorICoJaWYgdGhlIDgwMi4xWCBhdXRoZW50aWNhdGlvbiB3YXMgZG9uZSBieSB0aGUgZHJpdmVyIG9yIGlmIHJvYW1pbmcgd2FzCisgKglkb25lIHVzaW5nIEZhc3QgVHJhbnNpdGlvbiBwcm90b2NvbCAoaW4gd2hpY2ggY2FzZSA4MDIuMVggYXV0aGVudGljYXRpb24KKyAqCWlzIG5vdCBuZWVkZWQpLiBJZiAlTkw4MDIxMV9BVFRSX1BPUlRfQVVUSE9SSVpFRCBpcyBub3Qgc2V0LCB1c2VyIHNwYWNlCisgKglpcyByZXNwb25zaWJsZSBmb3IgdGhlIDgwMi4xWCBhdXRoZW50aWNhdGlvbi4KICAqIEBOTDgwMjExX0NNRF9ESVNDT05ORUNUOiBkcm9wIGEgZ2l2ZW4gY29ubmVjdGlvbjsgYWxzbyB1c2VkIHRvIG5vdGlmeQogICoJdXNlcnNwYWNlIHRoYXQgYSBjb25uZWN0aW9uIHdhcyBkcm9wcGVkIGJ5IHRoZSBBUCBvciBkdWUgdG8gb3RoZXIKICAqCXJlYXNvbnMsIGZvciB0aGlzIHRoZSAlTkw4MDIxMV9BVFRSX0RJU0NPTk5FQ1RFRF9CWV9BUCBhbmQKQEAgLTIwNjYsNiArMjA3MiwxMCBAQAogICoKICAqIEBOTDgwMjExX0FUVFJfUE1LOiBQTUsgZm9yIHRoZSBQTUtTQSBpZGVudGlmaWVkIGJ5ICVOTDgwMjExX0FUVFJfUE1LSUQuCiAgKglUaGlzIGlzIHVzZWQgd2l0aCBATkw4MDIxMV9DTURfU0VUX1BNS1NBLgorICogQE5MODAyMTFfQVRUUl9QT1JUX0FVVEhPUklaRUQ6IGZsYWcgYXR0cmlidXRlIHVzZWQgaW4gJU5MODAyMTFfQ01EX1JPQU1FRAorICoJbm90aWZpY2F0aW9uIGluZGljYXRpbmcgdGhhdCB0aGF0IDgwMi4xWCBhdXRoZW50aWNhdGlvbiB3YXMgZG9uZSBieQorICoJdGhlIGRyaXZlciBvciBpcyBub3QgbmVlZGVkIChiZWNhdXNlIHJvYW1pbmcgdXNlZCB0aGUgRmFzdCBUcmFuc2l0aW9uCisgKglwcm90b2NvbCkuCiAgKgogICogQE5VTV9OTDgwMjExX0FUVFI6IHRvdGFsIG51bWJlciBvZiBubDgwMjExX2F0dHJzIGF2YWlsYWJsZQogICogQE5MODAyMTFfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZApAQCAtMjQ4Niw2ICsyNDk2LDEzIEBACiAKIAlOTDgwMjExX0FUVFJfUE1LLAogCisJTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fTVVMVEksCisJTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fTUFYX1JFUVMsCisKKwlOTDgwMjExX0FUVFJfV0FOVF8xWF80V0FZX0hTLAorCU5MODAyMTFfQVRUUl9QTUtSMF9OQU1FLAorCU5MODAyMTFfQVRUUl9QT1JUX0FVVEhPUklaRUQsCisKIAkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KIAogCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcm1uZXRfaXBhX2ZkX2lvY3RsLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcm1uZXRfaXBhX2ZkX2lvY3RsLmgKaW5kZXggZjA0YWM0OS4uMDRhYWFhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3JtbmV0X2lwYV9mZF9pb2N0bC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ybW5ldF9pcGFfZmRfaW9jdGwuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBXQU5fSU9DVExfUVVFUllfRExfRklMVEVSX1NUQVRTICA4CiAjZGVmaW5lIFdBTl9JT0NUTF9BRERfRkxUX1JVTEVfRVggICAgICAgIDkKICNkZWZpbmUgV0FOX0lPQ1RMX1FVRVJZX1RFVEhFUl9TVEFUU19BTEwgIDEwCisjZGVmaW5lIFdBTl9JT0NUTF9OT1RJRllfV0FOX1NUQVRFICAxMQogCiAvKiBVc2VyIHNwYWNlIG1heSBub3QgaGF2ZSB0aGlzIGRlZmluZWQuICovCiAjaWZuZGVmIElGTkFNU0laCkBAIC0xMjYsNiArMTI3LDEwIEBACiAJdWludDMyX3QgaW5kZXg7CiB9OwogCitzdHJ1Y3Qgd2FuX2lvY3RsX25vdGlmeV93YW5fc3RhdGUgeworCXVpbnQ4X3QgdXA7Cit9OworCiAjZGVmaW5lIFdBTl9JT0NfQUREX0ZMVF9SVUxFIF9JT1dSKFdBTl9JT0NfTUFHSUMsIFwKIAkJV0FOX0lPQ1RMX0FERF9GTFRfUlVMRSwgXAogCQlzdHJ1Y3QgaXBhX2luc3RhbGxfZmx0cl9ydWxlX3JlcV9tc2dfdjAxICopCkBAIC0xNzAsNCArMTc1LDggQEAKIAkJV0FOX0lPQ1RMX1FVRVJZX1RFVEhFUl9TVEFUU19BTEwsIFwKIAkJc3RydWN0IHdhbl9pb2N0bF9xdWVyeV90ZXRoZXJfc3RhdHNfYWxsICopCiAKKyNkZWZpbmUgV0FOX0lPQ19OT1RJRllfV0FOX1NUQVRFIF9JT1dSKFdBTl9JT0NfTUFHSUMsIFwKKwkJV0FOX0lPQ1RMX05PVElGWV9XQU5fU1RBVEUsIFwKKwkJc3RydWN0IHdhbl9pb2N0bF9ub3RpZnlfd2FuX3N0YXRlICopCisKICNlbmRpZiAvKiBfUk1ORVRfSVBBX0ZEX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRyb2xzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdjRsMi1jb250cm9scy5oCmluZGV4IDI2NTA2ZDUuLmQ3NTA1NjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC92NGwyLWNvbnRyb2xzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3Y0bDItY29udHJvbHMuaApAQCAtMTEyNiw2ICsxMTI2LDE0IEBACiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19WUEVfQ1NDX0NVU1RPTV9NQVRSSVggXAogCQkoVjRMMl9DSURfTVBFR19NU01fVklEQ19CQVNFICsgMTE0KQogCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQIChWNEwyX0NJRF9NUEVHX01TTV9WSURDX0JBU0UgKyAxMTUpCitlbnVtIHY0bDJfbXBlZ192aWRjX3ZpZGVvX2ZsaXAgeworCVY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX05PTkUgPSAwLAorCVY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX0hPUkkgPSAxLAorCVY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX1ZFUlQgPSAyLAorCVY0TDJfQ0lEX01QRUdfVklEQ19WSURFT19GTElQX0JPVEggPSAzLAorfTsKKwogLyogIENhbWVyYSBjbGFzcyBjb250cm9sIElEcyAqLwogCiAjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFIAkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4OTAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL21lZGlhL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9LYnVpbGQKaW5kZXggNGRlZDBhNC4uZTcyYTFmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL21lZGlhL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvbWVkaWEvS2J1aWxkCkBAIC0xLDUgKzEsNiBAQAogaGVhZGVyLXkgKz0gY2FtX2NwYXMuaAogaGVhZGVyLXkgKz0gY2FtX2RlZnMuaAoraGVhZGVyLXkgKz0gY2FtX2ZkLmgKIGhlYWRlci15ICs9IGNhbV9pY3AuaAogaGVhZGVyLXkgKz0gY2FtX2lzcC5oCiBoZWFkZXIteSArPSBjYW1faXNwX3ZmZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX2RlZnMuaCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fZGVmcy5oCmluZGV4IDVmMGYwNzAuLjlhNzY3ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fZGVmcy5oCisrKyBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fZGVmcy5oCkBAIC0yMSw2ICsyMSwyNCBAQAogI2RlZmluZSBDQU1fSEFORExFX1VTRVJfUE9JTlRFUiAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBDQU1fSEFORExFX01FTV9IQU5ETEUgICAgICAgICAgICAgICAgICAgMgogCisvKiBHZW5lcmljIEJsb2IgQ21kQnVmZmVyIGhlYWRlciBwcm9wZXJ0aWVzICovCisjZGVmaW5lIENBTV9HRU5FUklDX0JMT0JfQ01EQlVGRkVSX1NJWkVfTUFTSyAgICAweEZGRkZGRjAwCisjZGVmaW5lIENBTV9HRU5FUklDX0JMT0JfQ01EQlVGRkVSX1NJWkVfU0hJRlQgICA4CisjZGVmaW5lIENBTV9HRU5FUklDX0JMT0JfQ01EQlVGRkVSX1RZUEVfTUFTSyAgICAweEZGCisjZGVmaW5lIENBTV9HRU5FUklDX0JMT0JfQ01EQlVGRkVSX1RZUEVfU0hJRlQgICAwCisKKy8qIENvbW1hbmQgQnVmZmVyIFR5cGVzICovCisjZGVmaW5lIENBTV9DTURfQlVGX0RNSSAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDQU1fQ01EX0JVRl9ETUkxNiAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQ0FNX0NNRF9CVUZfRE1JMzIgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lIENBTV9DTURfQlVGX0RNSTY0ICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBDQU1fQ01EX0JVRl9ESVJFQ1QgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgQ0FNX0NNRF9CVUZfSU5ESVJFQ1QgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lIENBTV9DTURfQlVGX0kyQyAgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBDQU1fQ01EX0JVRl9GVyAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgQ0FNX0NNRF9CVUZfR0VORVJJQyAgICAgICAgICAgICAgICAgMHg5CisjZGVmaW5lIENBTV9DTURfQlVGX0xFR0FDWSAgICAgICAgICAgICAgICAgIDB4QQorCiAvKioKICAqIHN0cnVjdCBjYW1fY29udHJvbCAtIFN0cnVjdHVyZSB1c2VkIGJ5IGlvY3RsIGNvbnRyb2wgZm9yIGNhbWVyYQogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fZmQuaCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmViNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9mZC5oCkBAIC0wLDAgKzEsMTI3IEBACisjaWZuZGVmIF9fVUFQSV9DQU1fRkRfSF9fCisjZGVmaW5lIF9fVUFQSV9DQU1fRkRfSF9fCisKKyNpbmNsdWRlICJjYW1fZGVmcy5oIgorCisjZGVmaW5lIENBTV9GRF9NQVhfRkFDRVMgICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIENBTV9GRF9SQVdfUkVTVUxUX0VOVFJJRVMgICAgICAgICAgICAgIDUxMgorCisvKiBGRCBPcCBDb2RlcyAqLworI2RlZmluZSBDQU1fUEFDS0VUX09QQ09ERVNfRkRfRlJBTUVfVVBEQVRFICAgICAweDAKKworLyogRkQgQ29tbWFuZCBCdWZmZXIgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgQ0FNX0ZEX0NNRF9CVUZGRVJfSURfR0VORVJJQyAgICAgICAgICAgMHgwCisjZGVmaW5lIENBTV9GRF9DTURfQlVGRkVSX0lEX0NETSAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBDQU1fRkRfQ01EX0JVRkZFUl9JRF9NQVggICAgICAgICAgICAgICAweDIKKworLyogRkQgQmxvYiB0eXBlcyAqLworI2RlZmluZSBDQU1fRkRfQkxPQl9UWVBFX1NPQ19DTE9DS19CV19SRVFVRVNUICAweDAKKyNkZWZpbmUgQ0FNX0ZEX0JMT0JfVFlQRV9SQVdfUkVTVUxUU19SRVFVSVJFRCAgMHgxCisKKy8qIEZEIFJlc291cmNlIElEcyAqLworI2RlZmluZSBDQU1fRkRfSU5QVVRfUE9SVF9JRF9JTUFHRSAgICAgICAgICAgICAweDAKKyNkZWZpbmUgQ0FNX0ZEX0lOUFVUX1BPUlRfSURfTUFYICAgICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgQ0FNX0ZEX09VVFBVVF9QT1JUX0lEX1JFU1VMVFMgICAgICAgICAgMHgwCisjZGVmaW5lIENBTV9GRF9PVVRQVVRfUE9SVF9JRF9SQVdfUkVTVUxUUyAgICAgIDB4MQorI2RlZmluZSBDQU1fRkRfT1VUUFVUX1BPUlRfSURfV09SS19CVUZGRVIgICAgICAweDIKKyNkZWZpbmUgQ0FNX0ZEX09VVFBVVF9QT1JUX0lEX01BWCAgICAgICAgICAgICAgMHgzCisKKy8qKgorICogc3RydWN0IGNhbV9mZF9zb2NfY2xvY2tfYndfcmVxdWVzdCAtIFNPQyBjbG9jaywgYmFuZHdpZHRoIHJlcXVlc3QgaW5mbworICoKKyAqIEBjbG9ja19yYXRlIDogQ2xvY2sgcmF0ZSByZXF1aXJlZCB3aGlsZSBwcm9jZXNzaW5nIGZyYW1lCisgKiBAYmFuZHdpZHRoICA6IEJhbmR3aWR0aCByZXF1aXJlZCB3aGlsZSBwcm9jZXNzaW5nIGZyYW1lCisgKiBAcmVzZXJ2ZWQgICA6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgKi8KK3N0cnVjdCBjYW1fZmRfc29jX2Nsb2NrX2J3X3JlcXVlc3QgeworCXVpbnQ2NF90ICAgIGNsb2NrX3JhdGU7CisJdWludDY0X3QgICAgYmFuZHdpZHRoOworCXVpbnQ2NF90ICAgIHJlc2VydmVkWzRdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2ZhY2UgLSBGYWNlIHByb3BlcnRpZXMKKyAqCisgKiBAcHJvcDEgOiBQcm9wZXJ0eSAxIG9mIGZhY2UKKyAqIEBwcm9wMiA6IFByb3BlcnR5IDIgb2YgZmFjZQorICogQHByb3AzIDogUHJvcGVydHkgMyBvZiBmYWNlCisgKiBAcHJvcDQgOiBQcm9wZXJ0eSA0IG9mIGZhY2UKKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoaXMgbGF5b3V0LCB0aGlzIGlzIGlubGluZSB3aXRoIGhvdyBIVyB3cml0ZXMKKyAqIHRoZXNlIHZhbHVlcyBkaXJlY3RseSB3aGVuIHRoZSBidWZmZXIgaXMgcHJvZ3JhbW1lZCB0byBIVworICovCitzdHJ1Y3QgY2FtX2ZkX2ZhY2UgeworCXVpbnQzMl90ICAgIHByb3AxOworCXVpbnQzMl90ICAgIHByb3AyOworCXVpbnQzMl90ICAgIHByb3AzOworCXVpbnQzMl90ICAgIHByb3A0OworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX3Jlc3VsdHMgLSBGRCByZXN1bHRzIGxheW91dAorICoKKyAqIEBmYWNlcyAgICAgIDogQXJyYXkgb2YgZmFjZXMgd2l0aCBmYWNlIHByb3BlcnRpZXMKKyAqIEBmYWNlX2NvdW50IDogTnVtYmVyIG9mIGZhY2VzIGRldGVjdGVkCisgKiBAcmVzZXJ2ZWQgICA6IFJlc2VydmVkIGZvciBhbGlnbm1lbnQKKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoaXMgbGF5b3V0LCB0aGlzIGlzIGlubGluZSB3aXRoIGhvdyBIVyB3cml0ZXMKKyAqIHRoZXNlIHZhbHVlcyBkaXJlY3RseSB3aGVuIHRoZSBidWZmZXIgaXMgcHJvZ3JhbW1lZCB0byBIVworICovCitzdHJ1Y3QgY2FtX2ZkX3Jlc3VsdHMgeworCXN0cnVjdCBjYW1fZmRfZmFjZSAgICBmYWNlc1tDQU1fRkRfTUFYX0ZBQ0VTXTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgZmFjZV9jb3VudDsKKwl1aW50MzJfdCAgICAgICAgICAgICAgcmVzZXJ2ZWRbM107Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfaHdfY2FwcyAtIEZhY2UgcHJvcGVydGllcworICoKKyAqIEBjb3JlX3ZlcnNpb24gICAgICAgICAgOiBGRCBjb3JlIHZlcnNpb24KKyAqIEB3cmFwcGVyX3ZlcnNpb24gICAgICAgOiBGRCB3cmFwcGVyIHZlcnNpb24KKyAqIEByYXdfcmVzdWx0c19hdmFpbGFibGUgOiBXaGV0aGVyIHJhdyByZXN1bHRzIGFyZSBhdmFpbGFibGUgb24gdGhpcyBIVworICogQHN1cHBvcnRlZF9tb2RlcyAgICAgICA6IE1vZGVzIHN1cHBvcnRlZCBieSB0aGlzIEhXLgorICogQHJlc2VydmVkICAgICAgICAgICAgICA6IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgKi8KK3N0cnVjdCBjYW1fZmRfaHdfY2FwcyB7CisJc3RydWN0IGNhbV9od192ZXJzaW9uICAgIGNvcmVfdmVyc2lvbjsKKwlzdHJ1Y3QgY2FtX2h3X3ZlcnNpb24gICAgd3JhcHBlcl92ZXJzaW9uOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICByYXdfcmVzdWx0c19hdmFpbGFibGU7CisJdWludDMyX3QgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9tb2RlczsKKwl1aW50NjRfdCAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1fZmRfcXVlcnlfY2FwX2NtZCAtIEZEIFF1ZXJ5IGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbgorICoKKyAqIEBkZXZpY2VfaW9tbXUgOiBGRCBJT01NVSBoYW5kbGVzCisgKiBAY2RtX2lvbW11ICAgIDogQ0RNIGlvbW11IGhhbmRsZXMKKyAqIEBod19jYXBzICAgICAgOiBGRCBIVyBjYXBhYmlsaXRpZXMKKyAqIEByZXNlcnZlZCAgICAgOiBSZXNlcnZlZCBmb3IgYWxpZ25tZW50CisgKi8KK3N0cnVjdCBjYW1fZmRfcXVlcnlfY2FwX2NtZCB7CisJc3RydWN0IGNhbV9pb21tdV9oYW5kbGUgICAgZGV2aWNlX2lvbW11OworCXN0cnVjdCBjYW1faW9tbXVfaGFuZGxlICAgIGNkbV9pb21tdTsKKwlzdHJ1Y3QgY2FtX2ZkX2h3X2NhcHMgICAgICBod19jYXBzOworCXVpbnQ2NF90ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2ZkX2FjcXVpcmVfZGV2X2luZm8gLSBGRCBhY3F1aXJlIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEBjbGtfYndfcmVxdWVzdCAgOiBTT0MgY2xvY2ssIGJhbmR3aWR0aCByZXF1ZXN0CisgKiBAcHJpb3JpdHkgICAgICAgIDogUHJpb3JpdHkgZm9yIHRoaXMgYWNxdWlyZQorICogQG1vZGUgICAgICAgICAgICA6IE1vZGUgaW4gd2hpY2ggdG8gcnVuIEZEIEhXLgorICogQGdldF9yYXdfcmVzdWx0cyA6IFdoZXRoZXIgdGhpcyBhY3F1aXJlIG5lZWRzIGZhY2UgcmF3IHJlc3VsdHMKKyAqICAgICAgICAgICAgICAgICAgICB3aGlsZSBmcmFtZSBwcm9jZXNzaW5nCisgKiBAcmVzZXJ2ZWQgICAgICAgIDogUmVzZXJ2ZWQgZmllbGQgZm9yIDY0IGJpdCBhbGlnbm1lbnQKKyAqLworc3RydWN0IGNhbV9mZF9hY3F1aXJlX2Rldl9pbmZvIHsKKwlzdHJ1Y3QgY2FtX2ZkX3NvY19jbG9ja19id19yZXF1ZXN0IGNsa19id19yZXF1ZXN0OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jhd19yZXN1bHRzOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMTNdOworfTsKKworI2VuZGlmIC8qIF9fVUFQSV9DQU1fRkRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX2ljcC5oIGIvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9pY3AuaAppbmRleCA5MzUxZDJkLi5jZDJkMmQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX2ljcC5oCisrKyBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1faWNwLmgKQEAgLTU2LDYgKzU2LDI5IEBACiAKICNkZWZpbmUgQ0FNX0lDUF9CUFNfSU9fSU1BR0VTX01BWCAgICAgICAgICAgICAgIDB4OQogCisvKiBDb21tYW5kIG1ldGEgdHlwZXMgKi8KKyNkZWZpbmUgQ0FNX0lDUF9DTURfTUVUQV9HRU5FUklDX0JMT0IgICAgICAgICAgIDB4MQorCisvKiBHZW5lcmljIGJsb24gdHlwZXMgKi8KKyNkZWZpbmUgQ0FNX0lDUF9DTURfR0VORVJJQ19CTE9CX0NMSyAgICAgICAgICAgIDB4MQorCisvKioKKyAqIHN0cnVjdCBjYW1faWNwX2Nsa19id19yZXF1ZXN0CisgKgorICogQGJ1ZGdldF9uczogVGltZSByZXF1aXJlZCB0byBwcm9jZXNzIGZyYW1lCisgKiBAZnJhbWVfY3ljbGVzOiBGcmFtZSBjeWNsZXMgbmVlZGVkIHRvIHByb2Nlc3MgdGhlIGZyYW1lCisgKiBAcnRfZmxhZzogRmxhZyB0byBpbmRpY2F0ZSByZWFsIHRpbWUgc3RyZWFtCisgKiBAdW5jb21wcmVzc2VkX2J3OiBCYW5kd2lkdGggcmVxdWlyZWQgdG8gcHJvY2VzcyBmcmFtZQorICogQGNvbXByZXNzZWRfYnc6IENvbXByZXNzZWQgYmFuZHdpZHRoIHRvIHByb2Nlc3MgZnJhbWUKKyAqLworc3RydWN0IGNhbV9pY3BfY2xrX2J3X3JlcXVlc3QgeworCXVpbnQ2NF90IGJ1ZGdldF9uczsKKwl1aW50MzJfdCBmcmFtZV9jeWNsZXM7CisJdWludDMyX3QgcnRfZmxhZzsKKwl1aW50NjRfdCB1bmNvbXByZXNzZWRfYnc7CisJdWludDY0X3QgY29tcHJlc3NlZF9idzsKK307CisKIC8qKgogICogc3RydWN0IGNhbV9pY3BfZGV2X3ZlciAtIERldmljZSBpbmZvcm1hdGlvbiBmb3IgcGFydGljdWxhciBodyB0eXBlCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9pc3AuaCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1faXNwLmgKaW5kZXggMmE1NzEzMC4uMDVjOTI4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9pc3AuaAorKysgYi9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX2lzcC5oCkBAIC03MywxMyArNzMsMTcgQEAKICNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9ETUlfQ09NTU9OICAgICAgICAgIDYKICNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9DTE9DSyAgICAgICAgICAgICAgIDcKICNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9DU0lEICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9NQVggICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9EVUFMX0NPTkZJRyAgICAgICAgIDkKKyNkZWZpbmUgQ0FNX0lTUF9QQUNLRVRfTUVUQV9HRU5FUklDX0JMT0IgICAgICAgIDEwCisjZGVmaW5lIENBTV9JU1BfUEFDS0VUX01FVEFfTUFYICAgICAgICAgICAgICAgICAxMQogCiAvKiBEU1AgbW9kZSAqLwogI2RlZmluZSBDQU1fSVNQX0RTUF9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBDQU1fSVNQX0RTUF9NT0RFX09ORV9XQVkgICAgICAgICAgICAgICAgMQogI2RlZmluZSBDQU1fSVNQX0RTUF9NT0RFX1JPVU5EICAgICAgICAgICAgICAgICAgMgogCisvKiBJU1AgR2VuZXJpYyBDbWQgQnVmZmVyIEJsb2IgdHlwZXMgKi8KKyNkZWZpbmUgQ0FNX0lTUF9HRU5FUklDX0JMT0JfVFlQRV9IRlJfQ09ORklHICAgIDAKIAogLyogUXVlcnkgZGV2aWNlcyAqLwogLyoqCkBAIC0yMjIsNCArMjI2LDk2IEBACiAJdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgIHJlc19oZGw7CiB9OwogCisvKioKKyAqIHN0cnVjdCBjYW1faXNwX3BvcnRfaGZyX2NvbmZpZyAtIEhGUiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHBvcnQKKyAqCisgKiBAcmVzb3VyY2VfdHlwZTogICAgICAgICAgICAgIFJlc291cmNlIHR5cGUKKyAqIEBzdWJzYW1wbGVfcGF0dGVybjogICAgICAgICAgU3Vic2FtcGxlIHBhdHRlcm4uIFVzZWQgaW4gSEZSIG1vZGUuIEl0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggYmF0Y2hTaXplIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1JRiBwcm9ncmFtbWluZy4KKyAqIEBzdWJzYW1wbGVfcGVyaW9kOiAgICAgICAgICAgU3Vic2FtcGxlIHBlcmlvZC4gVXNlZCBpbiBIRlIgbW9kZS4gSXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBiYXRjaFNpemUgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUlGIHByb2dyYW1taW5nLgorICogQGZyYW1lZHJvcF9wYXR0ZXJuOiAgICAgICAgICBGcmFtZWRyb3AgcGF0dGVybgorICogQGZyYW1lZHJvcF9wZXJpb2Q6ICAgICAgICAgICBGcmFtZWRyb3AgcGVyaW9kCisgKiBAcmVzZXJ2ZWQ6ICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIGZvciBhbGlnbm1lbnQKKyAqLworc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnIHsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgc3Vic2FtcGxlX3BhdHRlcm47CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIHN1YnNhbXBsZV9wZXJpb2Q7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZHJvcF9wYXR0ZXJuOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWRyb3BfcGVyaW9kOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKK307CisKKy8qKgorICogc3RydWN0IGNhbV9pc3BfcmVzb3VyY2VfaGZyX2NvbmZpZyAtIFJlc291cmNlIEhGUiBjb25maWd1cmF0aW9uCisgKgorICogQG51bV9pb19jb25maWdzOiAgICAgICAgICAgICBOdW1iZXIgb2YgcG9ydHMKKyAqIEByZXNlcnZlZDogICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQgZm9yIGFsaWdubWVudAorICogQGlvX2hmcl9jb25maWc6ICAgICAgICAgICAgICBIRlIgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBJTyBwb3J0CisgKi8KK3N0cnVjdCBjYW1faXNwX3Jlc291cmNlX2hmcl9jb25maWcgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBudW1faW9fY29uZmlnczsKKwl1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7CisJc3RydWN0IGNhbV9pc3BfcG9ydF9oZnJfY29uZmlnIGlvX2hmcl9jb25maWdbMV07Cit9OworCisvKioKKyAqIHN0cnVjdCBjYW1faXNwX2R1YWxfc3BsaXRfcGFyYW1zIC0gZHVhbCBpc3Agc3BpbHQgcGFyYW1ldGVycworICoKKyAqIEBzcGxpdF9wb2ludDogICAgICAgICAgICAgICAgU3BsaXQgcG9pbnQgaW5mb3JtYXRpb24geCwgd2hlcmUgKDAgPCB4IDwgd2lkdGgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgSVNQJ3MgaW5wdXQgZW5kcyBhdCB4ICsgcmlnaCBwYWRkaW5nIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodCBJU1AncyBpbnB1dCBzdGFydHMgYXQgeCAtIGxlZnQgcGFkZGluZworICogQHJpZ2h0X3BhZGRpbmc6ICAgICAgICAgICAgICBQYWRkaW5nIGFkZGVkIHBhc3QgdGhlIHNwbGl0IHBvaW50IGZvciBsZWZ0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTUCdzIGlucHV0CisgKiBAbGVmdF9wYWRkaW5nOiAgICAgICAgICAgICAgIFBhZGRpbmcgYWRkZWQgYmVmb3JlIHNwbGl0IHBvaW50IGZvciByaWdodAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1AncyBpbnB1dAorICogQHJlc2VydmVkOiAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBmaWxlZCBmb3IgYWxpZ25tZW50CisgKgorICovCitzdHJ1Y3QgY2FtX2lzcF9kdWFsX3NwbGl0X3BhcmFtcyB7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0X3BvaW50OworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICByaWdodF9wYWRkaW5nOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X3BhZGRpbmc7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2lzcF9kdWFsX3N0cmlwZV9jb25maWcgLSBzdHJpcGUgY29uZmlnIHBlciBidXMgY2xpZW50CisgKgorICogQG9mZnNldDogICAgICAgICAgICAgICAgICAgICBTdGFydCBob3Jpem9udGFsIG9mZnNldCByZWxhdGl2ZSB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIFVCV0MgbW9kZSwgdGhpcyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIEhfSU5JVAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbiBwaXhlbAorICogQHdpZHRoOiAgICAgICAgICAgICAgICAgICAgICBXaWR0aCBvZiB0aGUgc3RyaXBlIGluIGJ5dGVzCisgKiBAdGlsZWNvbmZpZyAgICAgICAgICAgICAgICAgIFVid2MgbWV0YSB0aWxlIGNvbmZpZy4gQ29udGFpbiB0aGUgcGFydGlhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlIGluZm8KKyAqIEBwb3J0X2lkOiAgICAgICAgICAgICAgICAgICAgcG9ydCBpZCBvZiBJU1Agb3V0cHV0CisgKgorICovCitzdHJ1Y3QgY2FtX2lzcF9kdWFsX3N0cmlwZV9jb25maWcgeworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICB0aWxlY29uZmlnOworCXVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2lzcF9kdWFsX2NvbmZpZyAtIGR1YWwgaXNwIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBAbnVtX3BvcnRzICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpc3Agb3V0cHV0IHBvcnRzCisgKiBAcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIGZpZWxkIGZvciBhbGlnbm1lbnQKKyAqIEBzcGxpdF9wYXJhbXM6ICAgICAgICAgICAgICAgSW5wcHV0IHNwbGl0IHBhcmFtZXRlcnMKKyAqIEBzdHJpcGVzOiAgICAgICAgICAgICAgICAgICAgU3RyaXBlIGluZm9ybWF0aW9uCisgKgorICovCitzdHJ1Y3QgY2FtX2lzcF9kdWFsX2NvbmZpZyB7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcG9ydHM7CisJdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsKKwlzdHJ1Y3QgY2FtX2lzcF9kdWFsX3NwbGl0X3BhcmFtcyAgIHNwbGl0X3BhcmFtczsKKwlzdHJ1Y3QgY2FtX2lzcF9kdWFsX3N0cmlwZV9jb25maWcgIHN0cmlwZXNbMV07Cit9OworCiAjZW5kaWYgLyogX19VQVBJX0NBTV9JU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX3JlcV9tZ3IuaCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fcmVxX21nci5oCmluZGV4IDIzYThjY2YuLjliN2QwNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fcmVxX21nci5oCisrKyBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fcmVxX21nci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIENBTV9DQ0lfREVWSUNFX1RZUEUgICAgICAgKENBTV9ERVZJQ0VfVFlQRV9CQVNFICsgMTApCiAjZGVmaW5lIENBTV9GTEFTSF9ERVZJQ0VfVFlQRSAgICAgKENBTV9ERVZJQ0VfVFlQRV9CQVNFICsgMTEpCiAjZGVmaW5lIENBTV9FRVBST01fREVWSUNFX1RZUEUgICAgKENBTV9ERVZJQ0VfVFlQRV9CQVNFICsgMTIpCisjZGVmaW5lIENBTV9PSVNfREVWSUNFX1RZUEUgICAgICAgKENBTV9ERVZJQ0VfVFlQRV9CQVNFICsgMTMpCiAKIC8qIGNhbV9yZXFfbWdyIGhkbCBpbmZvICovCiAjZGVmaW5lIENBTV9SRVFfTUdSX0hETF9JRFhfUE9TICAgICAgICAgICA4CkBAIC0yMTUsNyArMjE2LDggQEAKIC8qIE1heGltdW0gYWxsb3dlZCBidWZmZXJzIGluIGV4aXN0ZW5jZSAqLwogI2RlZmluZSBDQU1fTUVNX0JVRlFfTUFYICAgICAgICAgICAgICAgICAgICAgICAgMTAyNAogCi0jZGVmaW5lIENBTV9NRU1fTUdSX0hETF9JRFhfU0laRSAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBDQU1fTUVNX01HUl9TRUNVUkVfQklUX1BPUyAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ0FNX01FTV9NR1JfSERMX0lEWF9TSVpFICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENBTV9NRU1fTUdSX0hETF9GRF9TSVpFICAgICAgICAgICAgICAgICAxNgogI2RlZmluZSBDQU1fTUVNX01HUl9IRExfSURYX0VORF9QT1MgICAgICAgICAgICAgMTYKICNkZWZpbmUgQ0FNX01FTV9NR1JfSERMX0ZEX0VORF9QT1MgICAgICAgICAgICAgIDMyCkBAIC0yMjMsMTEgKzIyNSwxOSBAQAogI2RlZmluZSBDQU1fTUVNX01HUl9IRExfSURYX01BU0sgICAgICAoKDEgPDwgQ0FNX01FTV9NR1JfSERMX0lEWF9TSVpFKSAtIDEpCiAKICNkZWZpbmUgR0VUX01FTV9IQU5ETEUoaWR4LCBmZCkgXAotCSgoaWR4IDw8IChDQU1fTUVNX01HUl9IRExfSURYX0VORF9QT1MgLSBDQU1fTUVNX01HUl9IRExfSURYX1NJWkUpKSB8IFwKKwkoKGlkeCAmIENBTV9NRU1fTUdSX0hETF9JRFhfTUFTSykgfCBcCiAJKGZkIDw8IChDQU1fTUVNX01HUl9IRExfRkRfRU5EX1BPUyAtIENBTV9NRU1fTUdSX0hETF9GRF9TSVpFKSkpIFwKIAogI2RlZmluZSBDQU1fTUVNX01HUl9HRVRfSERMX0lEWChoZGwpIChoZGwgJiBDQU1fTUVNX01HUl9IRExfSURYX01BU0spCiAKKyNkZWZpbmUgQ0FNX01FTV9NR1JfU0VUX1NFQ1VSRV9IREwoaGRsLCBmbGFnKSBcCisJKChmbGFnKSA/IChoZGwgfD0gKDEgPDwgQ0FNX01FTV9NR1JfU0VDVVJFX0JJVF9QT1MpKSA6IFwKKwkoKGhkbCkgJj0gfigxIDw8IENBTV9NRU1fTUdSX1NFQ1VSRV9CSVRfUE9TKSkpCisKKyNkZWZpbmUgQ0FNX01FTV9NR1JfSVNfU0VDVVJFX0hETChoZGwpIFwKKwkoKChoZGwpICYgXAorCSgxPDxDQU1fTUVNX01HUl9TRUNVUkVfQklUX1BPUykpID4+IENBTV9NRU1fTUdSX1NFQ1VSRV9CSVRfUE9TKQorCiAvKioKICAqIG1lbW9yeSBhbGxvY2F0aW9uIHR5cGUKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9zZW5zb3IuaCBiL2luY2x1ZGUvdWFwaS9tZWRpYS9jYW1fc2Vuc29yLmgKaW5kZXggYWMzNzBiYS4uODdmMjViMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL21lZGlhL2NhbV9zZW5zb3IuaAorKysgYi9pbmNsdWRlL3VhcGkvbWVkaWEvY2FtX3NlbnNvci5oCkBAIC03LDYgKzcsOCBAQAogCiAjZGVmaW5lIENBTV9TRU5TT1JfUFJPQkVfQ01EICAgKENBTV9DT01NT05fT1BDT0RFX01BWCArIDEpCiAjZGVmaW5lIENBTV9GTEFTSF9NQVhfTEVEX1RSSUdHRVJTIDMKKyNkZWZpbmUgTUFYX09JU19OQU1FX1NJWkUgMzIKKyNkZWZpbmUgQ0FNX0NTSVBIWV9TRUNVUkVfTU9ERV9FTkFCTEVEIDEKIC8qKgogICogc3RydWN0IGNhbV9zZW5zb3JfcXVlcnlfY2FwIC0gY2FwYWJpbGl0aWVzIGluZm8gZm9yIHNlbnNvcgogICoKQEAgLTc1LDYgKzc3LDE2IEBACiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKioKKyAqIHN0cnVjdCBjYW1fb2lzX3F1ZXJ5X2NhcF90IC0gY2FwYWJpbGl0aWVzIGluZm8gZm9yIG9pcworICoKKyAqIEBzbG90X2luZm8gICAgICAgICAgICAgICAgICA6ICBJbmRpY2F0ZXMgYWJvdXQgdGhlIHNsb3RJZCBvciBjZWxsIEluZGV4CisgKi8KK3N0cnVjdCBjYW1fb2lzX3F1ZXJ5X2NhcF90IHsKKwl1aW50MzJfdCAgICAgICAgICAgIHNsb3RfaW5mbzsKKwl1aW50MTZfdCAgICAgICAgICAgIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCiAgKiBzdHJ1Y3QgY2FtX2NtZF9pMmNfaW5mbyAtIENvbnRhaW5zIHNsYXZlIEkyQyByZWxhdGVkIGluZm8KICAqCiAgKiBAc2xhdmVfYWRkciAgICAgIDogICAgU2xhdmUgYWRkcmVzcwpAQCAtODgsNiArMTAwLDQyIEBACiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKioKKyAqIHN0cnVjdCBjYW1fb2lzX29wY29kZSAtIENvbnRhaW5zIE9JUyBvcGNvZGUKKyAqCisgKiBAcHJvZyAgICAgICAgICAgIDogICAgT0lTIEZXIHByb2cgcmVnaXN0ZXIgYWRkcmVzcworICogQGNvZWZmICAgICAgICAgICA6ICAgIE9JUyBGVyBjb2VmZiByZWdpc3RlciBhZGRyZXNzCisgKiBAcGhlcmlwaGVyYWwgICAgIDogICAgT0lTIHBoZXJpcGhlcmFsCisgKiBAbWVtb3J5ICAgICAgICAgIDogICAgT0lTIG1lbW9yeQorICovCitzdHJ1Y3QgY2FtX29pc19vcGNvZGUgeworCXVpbnQzMl90IHByb2c7CisJdWludDMyX3QgY29lZmY7CisJdWludDMyX3QgcGhlcmlwaGVyYWw7CisJdWludDMyX3QgbWVtb3J5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoqCisgKiBzdHJ1Y3QgY2FtX2NtZF9vaXNfaW5mbyAtIENvbnRhaW5zIE9JUyBzbGF2ZSBpbmZvCisgKgorICogQHNsYXZlX2FkZHIgICAgICAgICAgICA6ICAgIE9JUyBpMmMgc2xhdmUgYWRkcmVzcworICogQGkyY19mcmVxX21vZGUgICAgICAgICA6ICAgIGkyYyBmcmVxdWVuY3kgbW9kZQorICogQG9pc19md19mbGFnICAgICAgICAgICA6ICAgIGluZGljYXRlcyBpZiBmdyBpcyBwcmVzZW50IG9yIG5vdAorICogQGlzX29pc19jYWxpYiAgICAgICAgICA6ICAgIGluZGljYXRlcyB0aGUgY2FsaWJyYXRpb24gZGF0YSBpcyBhdmFpbGFibGUKKyAqIEBvaXNfbmFtZSAgICAgICAgICAgICAgOiAgICBPSVMgbmFtZQorICogQG9wY29kZSAgICAgICAgICAgICAgICA6ICAgIG9wY29kZQorICogQGNtZF90eXBlICAgICAgICAgICAgICA6ICAgIEV4cGxhaW5zIHR5cGUgb2YgY29tbWFuZAorICovCitzdHJ1Y3QgY2FtX2NtZF9vaXNfaW5mbyB7CisJdWludDE2X3QgICAgICAgICAgICAgIHNsYXZlX2FkZHI7CisJdWludDhfdCAgICAgICAgICAgICAgIGkyY19mcmVxX21vZGU7CisJdWludDhfdCAgICAgICAgICAgICAgIG9pc19md19mbGFnOworCXVpbnQ4X3QgICAgICAgICAgICAgICBpc19vaXNfY2FsaWI7CisJY2hhciAgICAgICAgICAgICAgICAgIG9pc19uYW1lW01BWF9PSVNfTkFNRV9TSVpFXTsKKwlzdHJ1Y3QgY2FtX29pc19vcGNvZGUgb3Bjb2RlOworCXVpbnQ4X3QgICAgICAgICAgICAgICBjbWRfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qKgogICogc3RydWN0IGNhbV9jbWRfcHJvYmUgLSBDb250YWlucyBzZW5zb3Igc2xhdmUgaW5mbwogICoKICAqIEBkYXRhX3R5cGUgICAgICAgOiAgIFNsYXZlIHJlZ2lzdGVyIGRhdGEgdHlwZQpAQCAtMjY5LDE1ICszMTcsMTUgQEAKIAogLyoqCiAgKiBjYW1fY3NpcGh5X2luZm86IFByb3ZpZGVzIGNtZGJ1ZmZlciBzdHJ1Y3RyZQotICogQGxhbmVfbWFzayAgICAgOiAgTGFuZSBtYXNrIGRldGFpbHMKLSAqIEBsYW5lX2Fzc2lnbiAgIDogIExhbmUgc2Vuc29yIHdpbGwgYmUgdXNpbmcKLSAqIEBjc2lwaHlfM3BoYXNlIDogIFRvdGFsIG51bWJlciBvZiBsYW5lcwotICogQGNvbWJvX21vZGUgICAgOiAgSW5mbyByZWdhcmRpbmcgY29tYm9fbW9kZSBpcyBlbmFibGUgLyBkaXNhYmxlCi0gKiBAbGFuZV9jbnQgICAgICA6ICBUb3RhbCBudW1iZXIgb2YgbGFuZXMKLSAqIEByZXNlcnZlZAotICogQDNwaGFzZSAgICAgICAgOiAgRGV0YWlscyB3aGV0aGVyIDNQaGFzZSAvIDJQaGFzZSBvcGVyYXRpb24KLSAqIEBzZXR0bGVfdGltZSAgIDogIFNldHRsaW5nIHRpbWUgaW4gbXMKLSAqIEBkYXRhX3JhdGUgICAgIDogIERhdGEgcmF0ZQorICogQGxhbmVfbWFzayAgICAgOiBMYW5lIG1hc2sgZGV0YWlscworICogQGxhbmVfYXNzaWduICAgOiBMYW5lIHNlbnNvciB3aWxsIGJlIHVzaW5nCisgKiBAY3NpcGh5XzNwaGFzZSA6IFRvdGFsIG51bWJlciBvZiBsYW5lcworICogQGNvbWJvX21vZGUgICAgOiBJbmZvIHJlZ2FyZGluZyBjb21ib19tb2RlIGlzIGVuYWJsZSAvIGRpc2FibGUKKyAqIEBsYW5lX2NudCAgICAgIDogVG90YWwgbnVtYmVyIG9mIGxhbmVzCisgKiBAc2VjdXJlX21vZGUgICA6IFNlY3VyZSBtb2RlIGZsYWcgdG8gZW5hYmxlIC8gZGlzYWJsZQorICogQDNwaGFzZSAgICAgICAgOiBEZXRhaWxzIHdoZXRoZXIgM1BoYXNlIC8gMlBoYXNlIG9wZXJhdGlvbgorICogQHNldHRsZV90aW1lICAgOiBTZXR0bGluZyB0aW1lIGluIG1zCisgKiBAZGF0YV9yYXRlICAgICA6IERhdGEgcmF0ZQogICoKICAqLwogc3RydWN0IGNhbV9jc2lwaHlfaW5mbyB7CkBAIC0yODYsNyArMzM0LDcgQEAKIAl1aW50OF90ICAgICBjc2lwaHlfM3BoYXNlOwogCXVpbnQ4X3QgICAgIGNvbWJvX21vZGU7CiAJdWludDhfdCAgICAgbGFuZV9jbnQ7Ci0JdWludDhfdCAgICAgcmVzZXJ2ZWQ7CisJdWludDhfdCAgICAgc2VjdXJlX21vZGU7CiAJdWludDY0X3QgICAgc2V0dGxlX3RpbWU7CiAJdWludDY0X3QgICAgZGF0YV9yYXRlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvc291bmQvS2J1aWxkCmluZGV4IDI3ZTllZjguLjk1NzhkOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZApAQCAtMTQsMTAgKzE0LDMgQEAKIGhlYWRlci15ICs9IHRsdi5oCiBoZWFkZXIteSArPSB1c2Jfc3RyZWFtLmgKIGhlYWRlci15ICs9IHNuZF9zc3RfdG9rZW5zLmgKLWhlYWRlci15ICs9IGxzbV9wYXJhbXMuaAotaGVhZGVyLXkgKz0gYXVkaW9fc2xpbXNsYXZlLmgKLWhlYWRlci15ICs9IHZvaWNlX3BhcmFtcy5oCi1oZWFkZXIteSArPSBhdWRpb19lZmZlY3RzLmgKLWhlYWRlci15ICs9IGRldmRlcF9wYXJhbXMuaAotaGVhZGVyLXkgKz0gbXNtY2FsLWh3ZGVwLmgKLWhlYWRlci15ICs9IHdjZC1kc3AtZ2xpbmsuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2F1ZGlvX2VmZmVjdHMuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hdWRpb19lZmZlY3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2M2I1YzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2F1ZGlvX2VmZmVjdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9BVURJT19FRkZFQ1RTX0gKLSNkZWZpbmUgX0FVRElPX0VGRkVDVFNfSAotCi0vKiogQVVESU8gRUZGRUNUUyAqKi8KLQotCi0vKiBDT05GSUcgR0VUL1NFVCAqLwotI2RlZmluZSBDT05GSUdfQ0FDSEUJCQkwCi0jZGVmaW5lIENPTkZJR19TRVQJCQkxCi0jZGVmaW5lIENPTkZJR19HRVQJCQkyCi0KLS8qIENPTkZJRyBIRUFERVIgKi8KLS8qCi0gKiBNT0RVTEVfSUQsCi0gKiBERVZJQ0UsCi0gKiBOVU1fQ09NTUFORFMsCi0gKiBDT01NQU5EX0lEXzEsCi0gKiBDT05GSUdfQ0FDSEUvU0VUL0dFVCwKLSAqIE9GRlNFVF8xLAotICogTEVOR1RIXzEsCi0gKiBWQUxVRVNfMSwKLSAqIC4uLiwKLSAqIC4uLiwKLSAqIENPTU1BTkRfSURfMiwKLSAqIENPTkZJR19DQUNIRS9TRVQvR0VULAotICogT0ZGU0VUXzIsCi0gKiBMRU5HVEhfMiwKLSAqIFZBTFVFU18yLAotICogLi4uLAotICogLi4uLAotICogQ09NTUFORF9JRF8zLAotICogLi4uCi0gKi8KLQotCi0vKiBDT05GSUcgUEFSQU0gSURzICovCi0jZGVmaW5lIFZJUlRVQUxJWkVSX01PRFVMRQkJMHgwMDAwMTAwMAotI2RlZmluZSBWSVJUVUFMSVpFUl9FTkFCTEUJCTB4MDAwMDEwMDEKLSNkZWZpbmUgVklSVFVBTElaRVJfU1RSRU5HVEgJCTB4MDAwMDEwMDIKLSNkZWZpbmUgVklSVFVBTElaRVJfT1VUX1RZUEUJCTB4MDAwMDEwMDMKLSNkZWZpbmUgVklSVFVBTElaRVJfR0FJTl9BREpVU1QJCTB4MDAwMDEwMDQKLSNkZWZpbmUgVklSVFVBTElaRVJfRU5BQkxFX1BBUkFNX0xFTgkJMQotI2RlZmluZSBWSVJUVUFMSVpFUl9TVFJFTkdUSF9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgVklSVFVBTElaRVJfT1VUX1RZUEVfUEFSQU1fTEVOCQkxCi0jZGVmaW5lIFZJUlRVQUxJWkVSX0dBSU5fQURKVVNUX1BBUkFNX0xFTgkxCi0KLSNkZWZpbmUgUkVWRVJCX01PRFVMRQkJCTB4MDAwMDIwMDAKLSNkZWZpbmUgUkVWRVJCX0VOQUJMRQkJCTB4MDAwMDIwMDEKLSNkZWZpbmUgUkVWRVJCX01PREUJCQkweDAwMDAyMDAyCi0jZGVmaW5lIFJFVkVSQl9QUkVTRVQJCQkweDAwMDAyMDAzCi0jZGVmaW5lIFJFVkVSQl9XRVRfTUlYCQkJMHgwMDAwMjAwNAotI2RlZmluZSBSRVZFUkJfR0FJTl9BREpVU1QJCTB4MDAwMDIwMDUKLSNkZWZpbmUgUkVWRVJCX1JPT01fTEVWRUwJCTB4MDAwMDIwMDYKLSNkZWZpbmUgUkVWRVJCX1JPT01fSEZfTEVWRUwJCTB4MDAwMDIwMDcKLSNkZWZpbmUgUkVWRVJCX0RFQ0FZX1RJTUUJCTB4MDAwMDIwMDgKLSNkZWZpbmUgUkVWRVJCX0RFQ0FZX0hGX1JBVElPCQkweDAwMDAyMDA5Ci0jZGVmaW5lIFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTAkweDAwMDAyMDBhCi0jZGVmaW5lIFJFVkVSQl9SRUZMRUNUSU9OU19ERUxBWQkweDAwMDAyMDBiCi0jZGVmaW5lIFJFVkVSQl9MRVZFTAkJCTB4MDAwMDIwMGMKLSNkZWZpbmUgUkVWRVJCX0RFTEFZCQkJMHgwMDAwMjAwZAotI2RlZmluZSBSRVZFUkJfRElGRlVTSU9OCQkweDAwMDAyMDBlCi0jZGVmaW5lIFJFVkVSQl9ERU5TSVRZCQkJMHgwMDAwMjAwZgotI2RlZmluZSBSRVZFUkJfRU5BQkxFX1BBUkFNX0xFTgkJCTEKLSNkZWZpbmUgUkVWRVJCX01PREVfUEFSQU1fTEVOCQkJMQotI2RlZmluZSBSRVZFUkJfUFJFU0VUX1BBUkFNX0xFTgkJCTEKLSNkZWZpbmUgUkVWRVJCX1dFVF9NSVhfUEFSQU1fTEVOCQkxCi0jZGVmaW5lIFJFVkVSQl9HQUlOX0FESlVTVF9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgUkVWRVJCX1JPT01fTEVWRUxfUEFSQU1fTEVOCQkxCi0jZGVmaW5lIFJFVkVSQl9ST09NX0hGX0xFVkVMX1BBUkFNX0xFTgkJMQotI2RlZmluZSBSRVZFUkJfREVDQVlfVElNRV9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgUkVWRVJCX0RFQ0FZX0hGX1JBVElPX1BBUkFNX0xFTgkJMQotI2RlZmluZSBSRVZFUkJfUkVGTEVDVElPTlNfTEVWRUxfUEFSQU1fTEVOCTEKLSNkZWZpbmUgUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZX1BBUkFNX0xFTgkxCi0jZGVmaW5lIFJFVkVSQl9MRVZFTF9QQVJBTV9MRU4JCQkxCi0jZGVmaW5lIFJFVkVSQl9ERUxBWV9QQVJBTV9MRU4JCQkxCi0jZGVmaW5lIFJFVkVSQl9ESUZGVVNJT05fUEFSQU1fTEVOCQkxCi0jZGVmaW5lIFJFVkVSQl9ERU5TSVRZX1BBUkFNX0xFTgkJMQotCi0jZGVmaW5lIEJBU1NfQk9PU1RfTU9EVUxFCQkweDAwMDAzMDAwCi0jZGVmaW5lIEJBU1NfQk9PU1RfRU5BQkxFCQkweDAwMDAzMDAxCi0jZGVmaW5lIEJBU1NfQk9PU1RfTU9ERQkJCTB4MDAwMDMwMDIKLSNkZWZpbmUgQkFTU19CT09TVF9TVFJFTkdUSAkJMHgwMDAwMzAwMwotI2RlZmluZSBCQVNTX0JPT1NUX0VOQUJMRV9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgQkFTU19CT09TVF9NT0RFX1BBUkFNX0xFTgkJMQotI2RlZmluZSBCQVNTX0JPT1NUX1NUUkVOR1RIX1BBUkFNX0xFTgkJMQotCi0jZGVmaW5lIEVRX01PRFVMRQkJCTB4MDAwMDQwMDAKLSNkZWZpbmUgRVFfRU5BQkxFCQkJMHgwMDAwNDAwMQotI2RlZmluZSBFUV9DT05GSUcJCQkweDAwMDA0MDAyCi0jZGVmaW5lIEVRX05VTV9CQU5EUwkJCTB4MDAwMDQwMDMKLSNkZWZpbmUgRVFfQkFORF9MRVZFTFMJCQkweDAwMDA0MDA0Ci0jZGVmaW5lIEVRX0JBTkRfTEVWRUxfUkFOR0UJCTB4MDAwMDQwMDUKLSNkZWZpbmUgRVFfQkFORF9GUkVRUwkJCTB4MDAwMDQwMDYKLSNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRQkweDAwMDA0MDA3Ci0jZGVmaW5lIEVRX1NJTkdMRV9CQU5EX0ZSRVEJCTB4MDAwMDQwMDgKLSNkZWZpbmUgRVFfQkFORF9JTkRFWAkJCTB4MDAwMDQwMDkKLSNkZWZpbmUgRVFfUFJFU0VUX0lECQkJMHgwMDAwNDAwYQotI2RlZmluZSBFUV9OVU1fUFJFU0VUUwkJCTB4MDAwMDQwMGIKLSNkZWZpbmUgRVFfUFJFU0VUX05BTUUJCQkweDAwMDA0MDBjCi0jZGVmaW5lIEVRX0VOQUJMRV9QQVJBTV9MRU4JCQkxCi0jZGVmaW5lIEVRX0NPTkZJR19QQVJBTV9MRU4JCQkzCi0jZGVmaW5lIEVRX0NPTkZJR19QRVJfQkFORF9QQVJBTV9MRU4JCTUKLSNkZWZpbmUgRVFfTlVNX0JBTkRTX1BBUkFNX0xFTgkJCTEKLSNkZWZpbmUgRVFfQkFORF9MRVZFTFNfUEFSQU1fTEVOCQkxMwotI2RlZmluZSBFUV9CQU5EX0xFVkVMX1JBTkdFX1BBUkFNX0xFTgkJMgotI2RlZmluZSBFUV9CQU5EX0ZSRVFTX1BBUkFNX0xFTgkJCTEzCi0jZGVmaW5lIEVRX1NJTkdMRV9CQU5EX0ZSRVFfUkFOR0VfUEFSQU1fTEVOCTIKLSNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUV9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgRVFfQkFORF9JTkRFWF9QQVJBTV9MRU4JCQkxCi0jZGVmaW5lIEVRX1BSRVNFVF9JRF9QQVJBTV9MRU4JCQkxCi0jZGVmaW5lIEVRX05VTV9QUkVTRVRTX1BBUkFNX0xFTgkJMQotI2RlZmluZSBFUV9QUkVTRVRfTkFNRV9QQVJBTV9MRU4JCTMyCi0KLSNkZWZpbmUgRVFfVFlQRV9OT05FCTAKLSNkZWZpbmUgRVFfQkFTU19CT09TVAkxCi0jZGVmaW5lIEVRX0JBU1NfQ1VUCTIKLSNkZWZpbmUgRVFfVFJFQkxFX0JPT1NUCTMKLSNkZWZpbmUgRVFfVFJFQkxFX0NVVAk0Ci0jZGVmaW5lIEVRX0JBTkRfQk9PU1QJNQotI2RlZmluZSBFUV9CQU5EX0NVVAk2Ci0KLSNkZWZpbmUgU09GVF9WT0xVTUVfTU9EVUxFCQkweDAwMDA2MDAwCi0jZGVmaW5lIFNPRlRfVk9MVU1FX0VOQUJMRQkJMHgwMDAwNjAwMQotI2RlZmluZSBTT0ZUX1ZPTFVNRV9HQUlOXzJDSAkJMHgwMDAwNjAwMgotI2RlZmluZSBTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUgkJMHgwMDAwNjAwMwotI2RlZmluZSBTT0ZUX1ZPTFVNRV9FTkFCTEVfUEFSQU1fTEVOCQkxCi0jZGVmaW5lIFNPRlRfVk9MVU1FX0dBSU5fMkNIX1BBUkFNX0xFTgkJMgotI2RlZmluZSBTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9MRU4JMQotCi0jZGVmaW5lIFNPRlRfVk9MVU1FMl9NT0RVTEUJCTB4MDAwMDcwMDAKLSNkZWZpbmUgU09GVF9WT0xVTUUyX0VOQUJMRQkJMHgwMDAwNzAwMQotI2RlZmluZSBTT0ZUX1ZPTFVNRTJfR0FJTl8yQ0gJCTB4MDAwMDcwMDIKLSNkZWZpbmUgU09GVF9WT0xVTUUyX0dBSU5fTUFTVEVSCTB4MDAwMDcwMDMKLSNkZWZpbmUgU09GVF9WT0xVTUUyX0VOQUJMRV9QQVJBTV9MRU4JCVNPRlRfVk9MVU1FX0VOQUJMRV9QQVJBTV9MRU4KLSNkZWZpbmUgU09GVF9WT0xVTUUyX0dBSU5fMkNIX1BBUkFNX0xFTgkJU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fTEVOCi0jZGVmaW5lIFNPRlRfVk9MVU1FMl9HQUlOX01BU1RFUl9QQVJBTV9MRU4JXAotCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9MRU4KLQotI2RlZmluZSBQQkVfQ09ORl9NT0RVTEVfSUQJMHgwMDAxMEMyQQotI2RlZmluZSBQQkVfQ09ORl9QQVJBTV9JRAkweDAwMDEwQzQ5Ci0KLSNkZWZpbmUgUEJFX01PRFVMRQkJMHgwMDAwODAwMAotI2RlZmluZSBQQkVfRU5BQkxFCQkweDAwMDA4MDAxCi0jZGVmaW5lIFBCRV9DT05GSUcJCTB4MDAwMDgwMDIKLSNkZWZpbmUgUEJFX0VOQUJMRV9QQVJBTV9MRU4JCTEKLSNkZWZpbmUgUEJFX0NPTkZJR19QQVJBTV9MRU4JCTI4Ci0KLSNkZWZpbmUgQ09NTUFORF9QQVlMT0FEX0xFTgkzCi0jZGVmaW5lIENPTU1BTkRfUEFZTE9BRF9TWgkoQ09NTUFORF9QQVlMT0FEX0xFTiAqIHNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIE1BWF9JTkJBTkRfUEFSQU1fU1oJNDA5NgotI2RlZmluZSBRMjdfVU5JVFkJCSgxIDw8IDI3KQotI2RlZmluZSBROF9VTklUWQkJKDEgPDwgOCkKLSNkZWZpbmUgQ1VTVE9NX09QRU5TTF9QUkVTRVQJMTgKLQotI2RlZmluZSBWSVJUVUFMSVpFUl9FTkFCTEVfUEFSQU1fU1oJXAotCQkJKFZJUlRVQUxJWkVSX0VOQUJMRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgVklSVFVBTElaRVJfU1RSRU5HVEhfUEFSQU1fU1oJXAotCQkJKFZJUlRVQUxJWkVSX1NUUkVOR1RIX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9TWglcCi0JCQkoVklSVFVBTElaRVJfT1VUX1RZUEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIFZJUlRVQUxJWkVSX0dBSU5fQURKVVNUX1BBUkFNX1NaCVwKLQkJCShWSVJUVUFMSVpFUl9HQUlOX0FESlVTVF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLXN0cnVjdCB2aXJ0dWFsaXplcl9wYXJhbXMgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBlbmFibGVfZmxhZzsKLQl1aW50MzJfdCBzdHJlbmd0aDsKLQl1aW50MzJfdCBvdXRfdHlwZTsKLQlpbnQzMl90IGdhaW5fYWRqdXN0OwotfTsKLQotI2RlZmluZSBOVU1fT1NMX1JFVkVSQl9QUkVTRVRTX1NVUFBPUlRFRAk2Ci0jZGVmaW5lIFJFVkVSQl9FTkFCTEVfUEFSQU1fU1oJCVwKLQkJCShSRVZFUkJfRU5BQkxFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfTU9ERV9QQVJBTV9TWgkJXAotCQkJKFJFVkVSQl9NT0RFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfUFJFU0VUX1BBUkFNX1NaCQlcCi0JCQkoUkVWRVJCX1BSRVNFVF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgUkVWRVJCX1dFVF9NSVhfUEFSQU1fU1oJCVwKLQkJCShSRVZFUkJfV0VUX01JWF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgUkVWRVJCX0dBSU5fQURKVVNUX1BBUkFNX1NaCVwKLQkJCShSRVZFUkJfR0FJTl9BREpVU1RfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIFJFVkVSQl9ST09NX0xFVkVMX1BBUkFNX1NaCVwKLQkJCShSRVZFUkJfUk9PTV9MRVZFTF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgUkVWRVJCX1JPT01fSEZfTEVWRUxfUEFSQU1fU1oJXAotCQkJKFJFVkVSQl9ST09NX0hGX0xFVkVMX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfREVDQVlfVElNRV9QQVJBTV9TWglcCi0JCQkoUkVWRVJCX0RFQ0FZX1RJTUVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIFJFVkVSQl9ERUNBWV9IRl9SQVRJT19QQVJBTV9TWglcCi0JCQkoUkVWRVJCX0RFQ0FZX0hGX1JBVElPX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfUkVGTEVDVElPTlNfTEVWRUxfUEFSQU1fU1oJXAotCQkJKFJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZX1BBUkFNX1NaCVwKLQkJCShSRVZFUkJfUkVGTEVDVElPTlNfREVMQVlfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIFJFVkVSQl9MRVZFTF9QQVJBTV9TWgkJXAotCQkJKFJFVkVSQl9MRVZFTF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgUkVWRVJCX0RFTEFZX1BBUkFNX1NaCQlcCi0JCQkoUkVWRVJCX0RFTEFZX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfRElGRlVTSU9OX1BBUkFNX1NaCVwKLQkJCShSRVZFUkJfRElGRlVTSU9OX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBSRVZFUkJfREVOU0lUWV9QQVJBTV9TWgkJXAotCQkJKFJFVkVSQl9ERU5TSVRZX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotc3RydWN0IHJldmVyYl9wYXJhbXMgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBlbmFibGVfZmxhZzsKLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IHByZXNldDsKLQl1aW50MzJfdCB3ZXRfbWl4OwotCWludDMyX3QgIGdhaW5fYWRqdXN0OwotCWludDMyX3QgIHJvb21fbGV2ZWw7Ci0JaW50MzJfdCAgcm9vbV9oZl9sZXZlbDsKLQl1aW50MzJfdCBkZWNheV90aW1lOwotCXVpbnQzMl90IGRlY2F5X2hmX3JhdGlvOwotCWludDMyX3QgIHJlZmxlY3Rpb25zX2xldmVsOwotCXVpbnQzMl90IHJlZmxlY3Rpb25zX2RlbGF5OwotCWludDMyX3QgIGxldmVsOwotCXVpbnQzMl90IGRlbGF5OwotCXVpbnQzMl90IGRpZmZ1c2lvbjsKLQl1aW50MzJfdCBkZW5zaXR5OwotfTsKLQotI2RlZmluZSBCQVNTX0JPT1NUX0VOQUJMRV9QQVJBTV9TWglcCi0JCQkoQkFTU19CT09TVF9FTkFCTEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIEJBU1NfQk9PU1RfTU9ERV9QQVJBTV9TWglcCi0JCQkoQkFTU19CT09TVF9NT0RFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBCQVNTX0JPT1NUX1NUUkVOR1RIX1BBUkFNX1NaCVwKLQkJCShCQVNTX0JPT1NUX1NUUkVOR1RIX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotc3RydWN0IGJhc3NfYm9vc3RfcGFyYW1zIHsKLQl1aW50MzJfdCBkZXZpY2U7Ci0JdWludDMyX3QgZW5hYmxlX2ZsYWc7Ci0JdWludDMyX3QgbW9kZTsKLQl1aW50MzJfdCBzdHJlbmd0aDsKLX07Ci0KLQotI2RlZmluZSBNQVhfRVFfQkFORFMgMTIKLSNkZWZpbmUgTUFYX09TTF9FUV9CQU5EUyA1Ci0jZGVmaW5lIEVRX0VOQUJMRV9QQVJBTV9TWgkJCVwKLQkJCShFUV9FTkFCTEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIEVRX0NPTkZJR19QQVJBTV9TWgkJCVwKLQkJCShFUV9DT05GSUdfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIEVRX0NPTkZJR19QRVJfQkFORF9QQVJBTV9TWgkJXAotCQkJKEVRX0NPTkZJR19QRVJfQkFORF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfQ09ORklHX1BBUkFNX01BWF9MRU4JCQkoRVFfQ09ORklHX1BBUkFNX0xFTitcCi0JCQlNQVhfRVFfQkFORFMqRVFfQ09ORklHX1BFUl9CQU5EX1BBUkFNX0xFTikKLSNkZWZpbmUgRVFfQ09ORklHX1BBUkFNX01BWF9TWgkJCVwKLQkJCShFUV9DT05GSUdfUEFSQU1fTUFYX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBFUV9OVU1fQkFORFNfUEFSQU1fU1oJCQlcCi0JCQkoRVFfTlVNX0JBTkRTX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBFUV9CQU5EX0xFVkVMU19QQVJBTV9TWgkJCVwKLQkJCShFUV9CQU5EX0xFVkVMU19QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfQkFORF9MRVZFTF9SQU5HRV9QQVJBTV9TWgkJXAotCQkJKEVRX0JBTkRfTEVWRUxfUkFOR0VfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIEVRX0JBTkRfRlJFUVNfUEFSQU1fU1oJCQlcCi0JCQkoRVFfQkFORF9GUkVRU19QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRV9QQVJBTV9TWglcCi0JCQkoRVFfU0lOR0xFX0JBTkRfRlJFUV9SQU5HRV9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfU0lOR0xFX0JBTkRfRlJFUV9QQVJBTV9TWgkJXAotCQkJKEVRX1NJTkdMRV9CQU5EX0ZSRVFfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIEVRX0JBTkRfSU5ERVhfUEFSQU1fU1oJCQlcCi0JCQkoRVFfQkFORF9JTkRFWF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfUFJFU0VUX0lEX1BBUkFNX1NaCQkJXAotCQkJKEVRX1BSRVNFVF9JRF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgRVFfTlVNX1BSRVNFVFNfUEFSQU1fU1oJCQlcCi0JCQkoRVFfTlVNX1BSRVNFVFNfUEFSQU1fTEVOKnNpemVvZih1aW50OF90KSkKLXN0cnVjdCBlcV9jb25maWdfdCB7Ci0JaW50MzJfdCBlcV9wcmVnYWluOwotCWludDMyX3QgcHJlc2V0X2lkOwotCXVpbnQzMl90IG51bV9iYW5kczsKLX07Ci1zdHJ1Y3QgZXFfcGVyX2JhbmRfY29uZmlnX3QgewotCWludDMyX3QgYmFuZF9pZHg7Ci0JdWludDMyX3QgZmlsdGVyX3R5cGU7Ci0JdWludDMyX3QgZnJlcV9taWxsaWhlcnR6OwotCWludDMyX3QgIGdhaW5fbWlsbGliZWxzOwotCXVpbnQzMl90IHF1YWxpdHlfZmFjdG9yOwotfTsKLXN0cnVjdCBlcV9wZXJfYmFuZF9mcmVxX3JhbmdlX3QgewotCXVpbnQzMl90IGJhbmRfaW5kZXg7Ci0JdWludDMyX3QgbWluX2ZyZXFfbWlsbGloZXJ0ejsKLQl1aW50MzJfdCBtYXhfZnJlcV9taWxsaWhlcnR6OwotfTsKLQotc3RydWN0IGVxX3BhcmFtcyB7Ci0JdWludDMyX3QgZGV2aWNlOwotCXVpbnQzMl90IGVuYWJsZV9mbGFnOwotCXN0cnVjdCBlcV9jb25maWdfdCBjb25maWc7Ci0Jc3RydWN0IGVxX3Blcl9iYW5kX2NvbmZpZ190IHBlcl9iYW5kX2NmZ1tNQVhfRVFfQkFORFNdOwotCXN0cnVjdCBlcV9wZXJfYmFuZF9mcmVxX3JhbmdlX3QgcGVyX2JhbmRfZnJlcV9yYW5nZVtNQVhfRVFfQkFORFNdOwotCXVpbnQzMl90IGJhbmRfaW5kZXg7Ci0JdWludDMyX3QgZnJlcV9taWxsaWhlcnR6OwotfTsKLQotI2RlZmluZSBQQkVfRU5BQkxFX1BBUkFNX1NaCVwKLQkJCShQQkVfRU5BQkxFX1BBUkFNX0xFTipzaXplb2YodWludDMyX3QpKQotI2RlZmluZSBQQkVfQ09ORklHX1BBUkFNX1NaCVwKLQkJCShQQkVfQ09ORklHX1BBUkFNX0xFTipzaXplb2YodWludDE2X3QpKQotc3RydWN0IHBiZV9jb25maWdfdCB7Ci0JaW50MTZfdCAgcmVhbF9iYXNzX21peDsKLQlpbnQxNl90ICBiYXNzX2NvbG9yX2NvbnRyb2w7Ci0JdWludDE2X3QgbWFpbl9jaGFpbl9kZWxheTsKLQl1aW50MTZfdCB4b3Zlcl9maWx0ZXJfb3JkZXI7Ci0JdWludDE2X3QgYmFuZHBhc3NfZmlsdGVyX29yZGVyOwotCWludDE2X3QgIGRyY19kZWxheTsKLQl1aW50MTZfdCBybXNfdGF2OwotCWludDE2X3QgZXhwX3RocmVzaG9sZDsKLQl1aW50MTZfdCBleHBfc2xvcGU7Ci0JaW50MTZfdCBjb21wX3RocmVzaG9sZDsKLQl1aW50MTZfdCBjb21wX3Nsb3BlOwotCXVpbnQxNl90IG1ha2V1cF9nYWluOwotCXVpbnQzMl90IGNvbXBfYXR0YWNrOwotCXVpbnQzMl90IGNvbXBfcmVsZWFzZTsKLQl1aW50MzJfdCBleHBfYXR0YWNrOwotCXVpbnQzMl90IGV4cF9yZWxlYXNlOwotCWludDE2X3QgbGltaXRlcl9iYXNzX3RocmVzaG9sZDsKLQlpbnQxNl90IGxpbWl0ZXJfaGlnaF90aHJlc2hvbGQ7Ci0JaW50MTZfdCBsaW1pdGVyX2Jhc3NfbWFrZXVwX2dhaW47Ci0JaW50MTZfdCBsaW1pdGVyX2hpZ2hfbWFrZXVwX2dhaW47Ci0JaW50MTZfdCBsaW1pdGVyX2Jhc3NfZ2M7Ci0JaW50MTZfdCBsaW1pdGVyX2hpZ2hfZ2M7Ci0JaW50MTZfdCAgbGltaXRlcl9kZWxheTsKLQl1aW50MTZfdCByZXNlcnZlZDsKLQkvKiBwbGFjZSBob2xkZXIgZm9yIGZpbHRlciBjb2VmZnMgdG8gYmUgZm9sbG93ZWQgKi8KLQlpbnQzMl90IHAxTG93UGFzc0NvZWZmc1s1KjJdOwotCWludDMyX3QgcDFIaWdoUGFzc0NvZWZmc1s1KjJdOwotCWludDMyX3QgcDFCYW5kUGFzc0NvZWZmc1s1KjNdOwotCWludDMyX3QgcDFCYXNzU2hlbGZDb2VmZnNbNV07Ci0JaW50MzJfdCBwMVRyZWJsZVNoZWxmQ29lZmZzWzVdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHBiZV9wYXJhbXMgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBlbmFibGVfZmxhZzsKLQl1aW50MzJfdCBjZmdfbGVuOwotCXN0cnVjdCBwYmVfY29uZmlnX3QgY29uZmlnOwotfTsKLQotI2RlZmluZSBTT0ZUX1ZPTFVNRV9FTkFCTEVfUEFSQU1fU1oJCVwKLQkJCShTT0ZUX1ZPTFVNRV9FTkFCTEVfUEFSQU1fTEVOKnNpemVvZih1aW50MzJfdCkpCi0jZGVmaW5lIFNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX1NaCVwKLQkJCShTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQzMl90KSkKLSNkZWZpbmUgU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fU1oJCVwKLQkJCShTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9MRU4qc2l6ZW9mKHVpbnQxNl90KSkKLXN0cnVjdCBzb2Z0X3ZvbHVtZV9wYXJhbXMgewotCXVpbnQzMl90IGRldmljZTsKLQl1aW50MzJfdCBlbmFibGVfZmxhZzsKLQl1aW50MzJfdCBtYXN0ZXJfZ2FpbjsKLQl1aW50MzJfdCBsZWZ0X2dhaW47Ci0JdWludDMyX3QgcmlnaHRfZ2FpbjsKLX07Ci0KLXN0cnVjdCBtc21fbnRfZWZmX2FsbF9jb25maWcgewotCXN0cnVjdCBiYXNzX2Jvb3N0X3BhcmFtcyBiYXNzX2Jvb3N0OwotCXN0cnVjdCBwYmVfcGFyYW1zIHBiZTsKLQlzdHJ1Y3QgdmlydHVhbGl6ZXJfcGFyYW1zIHZpcnR1YWxpemVyOwotCXN0cnVjdCByZXZlcmJfcGFyYW1zIHJldmVyYjsKLQlzdHJ1Y3QgZXFfcGFyYW1zIGVxdWFsaXplcjsKLQlzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zIHNhcGx1c192b2w7Ci0Jc3RydWN0IHNvZnRfdm9sdW1lX3BhcmFtcyB0b3BvX3N3aXRjaF92b2w7Ci19OwotCi0jZW5kaWYgLypfTVNNX0FVRElPX0VGRkVDVFNfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvZGV2ZGVwX3BhcmFtcy5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL2RldmRlcF9wYXJhbXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzMTMzYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvc291bmQvZGV2ZGVwX3BhcmFtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0RFVl9ERVBfSAotI2RlZmluZSBfREVWX0RFUF9ICi0KLXN0cnVjdCBkb2xieV9wYXJhbV9kYXRhIHsKLQlpbnQzMl90IHZlcnNpb247Ci0JaW50MzJfdCBkZXZpY2VfaWQ7Ci0JaW50MzJfdCBiZV9pZDsKLQlpbnQzMl90IHBhcmFtX2lkOwotCWludDMyX3QgbGVuZ3RoOwotCWludDMyX3QgX191c2VyICpkYXRhOwotfTsKLQotc3RydWN0IGRvbGJ5X3BhcmFtX2xpY2Vuc2UgewotCWludDMyX3QgZG1pZDsKLQlpbnQzMl90IGxpY2Vuc2Vfa2V5OwotfTsKLQotI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTVwKLQkJX0lPV1IoJ1UnLCAweDEwLCBzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSkKLSNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU1cCi0JCV9JT1IoJ1UnLCAweDExLCBzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSkKLSNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfQ09NTUFORFwKLQkJX0lPV1IoJ1UnLCAweDEzLCBzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSkKLSNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfTElDRU5TRVwKLQkJX0lPV1IoJ1UnLCAweDE0LCBzdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZSkKLSNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUlwKLQkJX0lPUignVScsIDB4MTUsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKQotCi0jZGVmaW5lIERUU19FQUdMRV9NT0RVTEUJCQkweDAwMDA1MDAwCi0jZGVmaW5lIERUU19FQUdMRV9NT0RVTEVfRU5BQkxFCQkJMHgwMDAwNTAwMQotI2RlZmluZSBFQUdMRV9EUklWRVJfSUQJCQkJMHhGMgotI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfR0VUX0NBQ0hFX1NJWkUJCV9JT1IoRUFHTEVfRFJJVkVSX0lELCAwLCBpbnQpCi0jZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfU0laRQkJX0lPVyhFQUdMRV9EUklWRVJfSUQsIDEsIGludCkKLSNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX0dFVF9QQVJBTQkJX0lPUihFQUdMRV9EUklWRVJfSUQsIDIsIHZvaWQqKQotI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfU0VUX1BBUkFNCQlfSU9XKEVBR0xFX0RSSVZFUl9JRCwgMywgdm9pZCopCi0jZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRVRfQ0FDSEVfQkxPQ0sJCV9JT1coRUFHTEVfRFJJVkVSX0lELCA0LCB2b2lkKikKLSNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX1NFVF9BQ1RJVkVfREVWSUNFCV9JT1coRUFHTEVfRFJJVkVSX0lELCA1LCB2b2lkKikKLSNkZWZpbmUgRFRTX0VBR0xFX0lPQ1RMX0dFVF9MSUNFTlNFCQlfSU9SKEVBR0xFX0RSSVZFUl9JRCwgNiwgdm9pZCopCi0jZGVmaW5lIERUU19FQUdMRV9JT0NUTF9TRVRfTElDRU5TRQkJX0lPVyhFQUdMRV9EUklWRVJfSUQsIDcsIHZvaWQqKQotI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfU0VORF9MSUNFTlNFCQlfSU9XKEVBR0xFX0RSSVZFUl9JRCwgOCwgaW50KQotI2RlZmluZSBEVFNfRUFHTEVfSU9DVExfU0VUX1ZPTFVNRV9DT01NQU5EUwlfSU9XKEVBR0xFX0RSSVZFUl9JRCwgOSwgdm9pZCopCi0jZGVmaW5lIERUU19FQUdMRV9GTEFHX0lPQ1RMX1BSRQkJKDE8PDMwKQotI2RlZmluZSBEVFNfRUFHTEVfRkxBR19JT0NUTF9KVVNUU0VUQ0FDSEUJKDE8PDMxKQotI2RlZmluZSBEVFNfRUFHTEVfRkxBR19JT0NUTF9HRVRGUk9NQ09SRSAgICAgICBEVFNfRUFHTEVfRkxBR19JT0NUTF9KVVNUU0VUQ0FDSEUKLSNkZWZpbmUgRFRTX0VBR0xFX0ZMQUdfSU9DVExfTUFTSwkJKH4oRFRTX0VBR0xFX0ZMQUdfSU9DVExfUFJFIHwgXAotCQkJCQkgICAgIERUU19FQUdMRV9GTEFHX0lPQ1RMX0pVU1RTRVRDQUNIRSkpCi0jZGVmaW5lIERUU19FQUdMRV9GTEFHX0FMU0FfR0VUCQkJKDE8PDMxKQotCi1zdHJ1Y3QgZHRzX2VhZ2xlX3BhcmFtX2Rlc2MgewotCXVpbnQzMl90IGlkOwotCXVpbnQzMl90IHNpemU7Ci0JaW50MzJfdCBvZmZzZXQ7Ci0JdWludDMyX3QgZGV2aWNlOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBIV0RFUF9GRV9CQVNFICAgICAgICAgICAgICAgICAgIDMwMDAgLyp1bmlxdWUgYmFzZSBmb3IgRkUgaHcgZGVwIG5vZGVzKi8KLXN0cnVjdCBzbmRfcGNtX21tYXBfZmQgewotCWludDMyX3QgZGlyOwotCWludDMyX3QgZmQ7Ci0JaW50MzJfdCBzaXplOwotCWludDMyX3QgYWN0dWFsX3NpemU7Ci19OwotCi0jZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9NTUFQX0RBVEFfRkQgICAgX0lPV1IoJ1UnLCAweGQyLCBzdHJ1Y3Qgc25kX3BjbV9tbWFwX2ZkKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9sc21fcGFyYW1zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvbHNtX3BhcmFtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1OTMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWFwaS9zb3VuZC9sc21fcGFyYW1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotI2lmbmRlZiBfVUFQSV9MU01fUEFSQU1TX0hfXwotI2RlZmluZSBfVUFQSV9MU01fUEFSQU1TX0hfXwotCi0jZGVmaW5lIExTTV9QT0xMSU5HX0VOQUJMRV9TVVBQT1JUCi0jZGVmaW5lIExTTV9FVkVOVF9USU1FU1RBTVBfTU9ERV9TVVBQT1JUCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgotCi0jZGVmaW5lIFNORFJWX0xTTV9WRVJTSU9OIFNORFJWX1BST1RPQ09MX1ZFUlNJT04oMCwgMSwgMCkKLQotI2RlZmluZSBMU01fT1VUX0ZPUk1BVF9QQ00gKDApCi0jZGVmaW5lIExTTV9PVVRfRk9STUFUX0FEUENNICgxIDw8IDApCi0KLSNkZWZpbmUgTFNNX09VVF9EQVRBX1JBVyAoMCkKLSNkZWZpbmUgTFNNX09VVF9EQVRBX1BBQ0tFRCAoMSkKLQotI2RlZmluZSBMU01fT1VUX0RBVEFfRVZFTlRTX0RJU0FCTEVEICgwKQotI2RlZmluZSBMU01fT1VUX0RBVEFfRVZFTlRTX0VOQUJMRUQgKDEpCi0KLSNkZWZpbmUgTFNNX09VVF9UUkFOU0ZFUl9NT0RFX1JUICgwKQotI2RlZmluZSBMU01fT1VUX1RSQU5TRkVSX01PREVfRlRSVCAoMSkKLQotI2RlZmluZSBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRCAoMCkKLSNkZWZpbmUgTFNNX09QRVJBVElPTl9NT0RFICgxKQotI2RlZmluZSBMU01fR0FJTiAoMikKLSNkZWZpbmUgTFNNX01JTl9DT05GSURFTkNFX0xFVkVMUyAoMykKLSNkZWZpbmUgTFNNX1JFR19TTkRfTU9ERUwgKDQpCi0jZGVmaW5lIExTTV9ERVJFR19TTkRfTU9ERUwgKDUpCi0jZGVmaW5lIExTTV9DVVNUT01fUEFSQU1TICg2KQotI2RlZmluZSBMU01fUE9MTElOR19FTkFCTEUgKDcpCi0jZGVmaW5lIExTTV9QQVJBTVNfTUFYIChMU01fUE9MTElOR19FTkFCTEUgKyAxKQotCi0jZGVmaW5lIExTTV9FVkVOVF9OT05fVElNRV9TVEFNUF9NT0RFICgwKQotI2RlZmluZSBMU01fRVZFTlRfVElNRV9TVEFNUF9NT0RFICgxKQotCi1lbnVtIGxzbV9hcHBfaWQgewotCUxTTV9WT0lDRV9XQUtFVVBfQVBQX0lEID0gMSwKLQlMU01fVk9JQ0VfV0FLRVVQX0FQUF9JRF9WMiA9IDIsCi19OwotCi1lbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSB7Ci0JTFNNX01PREVfS0VZV09SRF9PTkxZX0RFVEVDVElPTiA9IDEsCi0JTFNNX01PREVfVVNFUl9LRVlXT1JEX0RFVEVDVElPTgotfTsKLQotZW51bSBsc21fdndfc3RhdHVzIHsKLQlMU01fVk9JQ0VfV0FLRVVQX1NUQVRVU19SVU5OSU5HID0gMSwKLQlMU01fVk9JQ0VfV0FLRVVQX1NUQVRVU19ERVRFQ1RFRCwKLQlMU01fVk9JQ0VfV0FLRVVQX1NUQVRVU19FTkRfU1BFRUNILAotCUxTTV9WT0lDRV9XQUtFVVBfU1RBVFVTX1JFSkVDVEVECi19OwotCi0vKgotICogRGF0YSBmb3IgTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQgcGFyYW1fdHlwZQotICogQGVwZF9iZWdpbjogQmVnaW4gdGhyZXNob2xkCi0gKiBAZXBkX2VuZDogRW5kIHRocmVzaG9sZAotICovCi1zdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgewotCV9fdTMyIGVwZF9iZWdpbjsKLQlfX3UzMiBlcGRfZW5kOwotfTsKLQotLyoKLSAqIERhdGEgZm9yIExTTV9PUEVSQVRJT05fTU9ERSBwYXJhbV90eXBlCi0gKiBAbW9kZTogVGhlIGRldGVjdGlvbiBtb2RlIHRvIGJlIHVzZWQKLSAqIEBkZXRlY3RfZmFpbHVyZTogU2V0dGluZyB0byBlbmFibGUgZmFpbHVyZSBkZXRlY3Rpb25zLgotICovCi1zdHJ1Y3Qgc25kX2xzbV9kZXRlY3RfbW9kZSB7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgbW9kZTsKLQlib29sIGRldGVjdF9mYWlsdXJlOwotfTsKLQotLyoKLSAqIERhdGEgZm9yIExTTV9HQUlOIHBhcmFtX3R5cGUKLSAqIEBnYWluOiBUaGUgZ2FpbiB0byBiZSBhcHBsaWVkIG9uIExTTQotICovCi1zdHJ1Y3Qgc25kX2xzbV9nYWluIHsKLQlfX3UxNiBnYWluOwotfTsKLQotLyoKLSAqIERhdGEgZm9yIExTTV9QT0xMSU5HX0VOQUJMRSBwYXJhbV90eXBlCi0gKiBAcG9sbF9lbjogUG9sbGluZyBlbmFibGUgb3IgZGlzYWJsZQotICovCi1zdHJ1Y3Qgc25kX2xzbV9wb2xsX2VuYWJsZSB7Ci0JYm9vbCBwb2xsX2VuOwotfTsKLQotCi1zdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiB7Ci0JX191OCBfX3VzZXIgKmRhdGE7Ci0JX191OCAqY29uZmlkZW5jZV9sZXZlbDsKLQlfX3UzMiBkYXRhX3NpemU7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0aW9uX21vZGU7Ci0JX191OCBudW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JYm9vbCBkZXRlY3RfZmFpbHVyZTsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX3Nlc3Npb25fZGF0YSB7Ci0JZW51bSBsc21fYXBwX2lkIGFwcF9pZDsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyB7Ci0JX191MTYgc3RhdHVzOwotCV9fdTE2IHBheWxvYWRfc2l6ZTsKLQlfX3U4IHBheWxvYWRbMF07Ci19OwotCi1zdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjMgewotCV9fdTMyIHRpbWVzdGFtcF9sc3c7Ci0JX191MzIgdGltZXN0YW1wX21zdzsKLQlfX3UxNiBzdGF0dXM7Ci0JX191MTYgcGF5bG9hZF9zaXplOwotCV9fdTggcGF5bG9hZFswXTsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMgewotCV9fdTggKmNvbmZfbGV2ZWw7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGU7Ci0JX191OCBudW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JYm9vbCBkZXRlY3RfZmFpbHVyZTsKLQlib29sIHBvbGxfZW5hYmxlOwotfTsKLQotLyoKLSAqIFBhcmFtIGluZm8gZm9yIGVhY2ggcGFyYW1ldGVyIHR5cGUKLSAqIEBtb2R1bGVfaWQ6IE1vZHVsZSB0byB3aGljaCBwYXJhbWV0ZXIgaXMgdG8gYmUgc2V0Ci0gKiBAcGFyYW1faWQ6IFBhcmFtZXRlciB0aGF0IGlzIHRvIGJlIHNldAotICogQHBhcmFtX3NpemU6IHNpemUgKGluIG51bWJlciBvZiBieXRlcykgZm9yIHRoZSBkYXRhCi0gKgkJaW4gcGFyYW1fZGF0YS4KLSAqCQlGb3IgY29uZmlkZW5jZSBsZXZlbHMsIHRoaXMgaXMgbnVtX2NvbmZfbGV2ZWxzCi0gKgkJRm9yIFJFR19TTkRfTU9ERUwsIHRoaXMgaXMgc2l6ZSBvZiBzb3VuZCBtb2RlbAotICoJCUZvciBDVVNUT01fUEFSQU1TLCB0aGlzIGlzIHNpemUgb2YgdGhlIGVudGlyZSBibG9iIG9mIGRhdGEKLSAqIEBwYXJhbV9kYXRhOiBEYXRhIGZvciB0aGUgcGFyYW1ldGVyLgotICoJCUZvciBzb21lIHBhcmFtX3R5cGVzIHRoaXMgaXMgYSBzdHJ1Y3R1cmUgZGVmaW5lZCwgZXg6IExTTV9HQUlOCi0gKgkJRm9yIENPTkZJREVOQ0VfTEVWRUxTLCB0aGlzIGlzIGFycmF5IG9mIGNvbmZpZGVuY2UgbGV2ZWxzCi0gKgkJRm9yIFJFR19TTkRfTU9ERUwsIHRoaXMgaXMgdGhlIHNvdW5kIG1vZGVsIGRhdGEKLSAqCQlGb3IgQ1VTVE9NX1BBUkFNUywgdGhpcyBpcyB0aGUgYmxvYiBvZiBjdXN0b20gZGF0YS4KLSAqLwotc3RydWN0IGxzbV9wYXJhbXNfaW5mbyB7Ci0JX191MzIgbW9kdWxlX2lkOwotCV9fdTMyIHBhcmFtX2lkOwotCV9fdTMyIHBhcmFtX3NpemU7Ci0JX191OCBfX3VzZXIgKnBhcmFtX2RhdGE7Ci0JdWludDMyX3QgcGFyYW1fdHlwZTsKLX07Ci0KLS8qCi0gKiBEYXRhIHBhc3NlZCB0byB0aGUgU0VUX1BBUkFNX1YyIElPQ1RMCi0gKiBAbnVtX3BhcmFtczogTnVtYmVyIG9mIHBhcmFtcyB0aGF0IGFyZSB0byBiZSBzZXQKLSAqCQlzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiBMU01fUEFSQU1TX01BWAotICogQHBhcmFtczogUG9pbnRzIHRvIGFuIGFycmF5IG9mIGxzbV9wYXJhbXNfaW5mbwotICoJICAgIEVhY2ggZW50cnkgcG9pbnRzIHRvIG9uZSBwYXJhbWV0ZXIgdG8gc2V0Ci0gKiBAZGF0YV9zaXplOiBzaXplIChpbiBieXRlcykgZm9yIHBhcmFtcwotICoJICAgICAgIHNob3VsZCBiZSBlcXVhbCB0bwotICoJICAgICAgIG51bV9wYXJhbXMgKiBzaXplb2Yoc3RydWN0IGxzbV9wYXJtc19pbmZvKQotICovCi1zdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zIHsKLQlfX3U4IF9fdXNlciAqcGFyYW1zOwotCV9fdTMyIG51bV9wYXJhbXM7Ci0JX191MzIgZGF0YV9zaXplOwotfTsKLQotLyoKLSAqIERhdGEgcGFzc2VkIHRvIExTTV9PVVRfRk9STUFUX0NGRyBJT0NUTAotICogQGZvcm1hdDogVGhlIG1lZGlhIGZvcm1hdCBlbnVtCi0gKiBAcGFja2luZzogaW5kaWNhdGVzIHRoZSBwYWNraW5nIG1ldGhvZCB1c2VkIGZvciBkYXRhIHBhdGgKLSAqIEBldmVudHM6IGluZGljYXRlcyB3aGV0aGVyIGRhdGEgcGF0aCBldmVudHMgbmVlZCB0byBiZSBlbmFibGVkCi0gKiBAdHJhbnNmZXJfbW9kZTogaW5kaWNhdGVzIHdoZXRoZXIgRlRSVCBtb2RlIG9yIFJUIG1vZGUuCi0gKi8KLXN0cnVjdCBzbmRfbHNtX291dHB1dF9mb3JtYXRfY2ZnIHsKLQlfX3U4IGZvcm1hdDsKLQlfX3U4IHBhY2tpbmc7Ci0JX191OCBldmVudHM7Ci0JX191OCBtb2RlOwotfTsKLQotI2RlZmluZSBTTkRSVl9MU01fREVSRUdfU05EX01PREVMIF9JT1coJ1UnLCAweDAxLCBpbnQpCi0jZGVmaW5lIFNORFJWX0xTTV9FVkVOVF9TVEFUVVMJX0lPVygnVScsIDB4MDIsIHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykKLSNkZWZpbmUgU05EUlZfTFNNX0FCT1JUX0VWRU5UCV9JT1coJ1UnLCAweDAzLCBpbnQpCi0jZGVmaW5lIFNORFJWX0xTTV9TVEFSVAkJX0lPVygnVScsIDB4MDQsIGludCkKLSNkZWZpbmUgU05EUlZfTFNNX1NUT1AJCV9JT1coJ1UnLCAweDA1LCBpbnQpCi0jZGVmaW5lIFNORFJWX0xTTV9TRVRfU0VTU0lPTl9EQVRBIF9JT1coJ1UnLCAweDA2LCBzdHJ1Y3Qgc25kX2xzbV9zZXNzaW9uX2RhdGEpCi0jZGVmaW5lIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyIF9JT1coJ1UnLCAweDA3LFwKLQkJCQkJc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIpCi0jZGVmaW5lIFNORFJWX0xTTV9MQUJfQ09OVFJPTAlfSU9XKCdVJywgMHgwOCwgdWludDMyX3QpCi0jZGVmaW5lIFNORFJWX0xTTV9TVE9QX0xBQglfSU8oJ1UnLCAweDA5KQotI2RlZmluZSBTTkRSVl9MU01fU0VUX1BBUkFNUwlfSU9XKCdVJywgMHgwQSwgXAotCQkJCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zKQotI2RlZmluZSBTTkRSVl9MU01fU0VUX01PRFVMRV9QQVJBTVMJX0lPVygnVScsIDB4MEIsIFwKLQkJCQkJc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtcykKLSNkZWZpbmUgU05EUlZfTFNNX09VVF9GT1JNQVRfQ0ZHIF9JT1coJ1UnLCAweDBDLCBcCi0JCQkJICAgICAgc3RydWN0IHNuZF9sc21fb3V0cHV0X2Zvcm1hdF9jZmcpCi0jZGVmaW5lIFNORFJWX0xTTV9TRVRfUE9SVAlfSU8oJ1UnLCAweDBEKQotI2RlZmluZSBTTkRSVl9MU01fU0VUX0ZXS19NT0RFX0NPTkZJRwlfSU9XKCdVJywgMHgwRSwgdWludDMyX3QpCi0jZGVmaW5lIFNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjMJX0lPVygnVScsIDB4MEYsIFwKLQkJCQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9tc21jYWwtaHdkZXAuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9tc21jYWwtaHdkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyOTQ4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvc291bmQvbXNtY2FsLWh3ZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX0NBTElCX0hXREVQX0gKLSNkZWZpbmUgX0NBTElCX0hXREVQX0gKLQotI2RlZmluZSBXQ0Q5WFhYX0NPREVDX0hXREVQX05PREUgICAgMTAwMAotZW51bSB3Y2RfY2FsX3R5cGUgewotCVdDRDlYWFhfTUlOX0NBTCwKLQlXQ0Q5WFhYX0FOQ19DQUwgPSBXQ0Q5WFhYX01JTl9DQUwsCi0JV0NEOVhYWF9NQURfQ0FMLAotCVdDRDlYWFhfTUJIQ19DQUwsCi0JV0NEOVhYWF9WQkFUX0NBTCwKLQlXQ0Q5WFhYX01BWF9DQUwsCi19OwotCi1zdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlciB7Ci0JX191MzIgc2l6ZTsKLQlfX3U4IF9fdXNlciAqYnVmZmVyOwotCWVudW0gd2NkX2NhbF90eXBlIGNhbF90eXBlOwotfTsKLQotI2RlZmluZSBTTkRSVl9DVExfSU9DVExfSFdERVBfQ0FMX1RZUEUgXAotCV9JT1coJ1UnLCAweDEsIHN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyKQotCi0jZW5kaWYgLypfQ0FMSUJfSFdERVBfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvd2NkLWRzcC1nbGluay5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL3djZC1kc3AtZ2xpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkMTI4ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VhcGkvc291bmQvd2NkLWRzcC1nbGluay5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI2lmbmRlZiBfV0NEX0RTUF9HTElOS19ICi0jZGVmaW5lIF9XQ0RfRFNQX0dMSU5LX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNkZWZpbmUgV0RTUF9DSF9OQU1FX01BWF9MRU4gNTAKLQotZW51bSB7Ci0JV0RTUF9SRUdfUEtUID0gMSwKLQlXRFNQX0NNRF9QS1QsCi0JV0RTUF9SRUFEWV9QS1QsCi19OwotI2RlZmluZSBXRFNQX1JFQURZX1BLVCBXRFNQX1JFQURZX1BLVAotCi0vKgotICogc3RydWN0IHdkc3BfcmVnX3BrdCAtICBHbGluayBjaGFubmVsIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3JtYXQKLSAqIEBub19vZl9jaGFubmVsczogICBOdW1iZXIgb2YgZ2xpbmsgY2hhbm5lbHMgdG8gb3BlbgotICogQHBheWxvYWRbMF06ICAgICAgIER5bmFtaWMgYXJyYXkgY29udGFpbnMgYWxsIHRoZSBnbGluayBjaGFubmVscyBpbmZvcm1hdGlvbgotICovCi1zdHJ1Y3Qgd2RzcF9yZWdfcGt0IHsKLQlfX3U4IG5vX29mX2NoYW5uZWxzOwotCV9fdTggcGF5bG9hZFswXTsKLX07Ci0KLS8qCi0gKiBzdHJ1Y3Qgd2RzcF9jbWRfcGt0IC0gV0RTUCBjb21tYW5kIHBhY2tldCBmb3JtYXQKLSAqIEBjaF9uYW1lOiAgICAgICAgIE5hbWUgb2YgdGhlIGdsaW5rIGNoYW5uZWwKLSAqIEBwYXlsb2FkX3NpemU6ICAgIFNpemUgb2YgdGhlIHBheWxvYWQKLSAqIEBwYXlsb2FkWzBdOiAgICAgIEFjdHVhbCBkYXRhIHBheWxvYWQKLSAqLwotc3RydWN0IHdkc3BfY21kX3BrdCB7Ci0JY2hhciBjaF9uYW1lW1dEU1BfQ0hfTkFNRV9NQVhfTEVOXTsKLQlfX3UzMiBwYXlsb2FkX3NpemU7Ci0JX191OCBwYXlsb2FkWzBdOwotfTsKLQotLyoKLSAqIHN0cnVjdCB3ZHNwX3dyaXRlX3BrdCAtIEZvcm1hdCB0aGF0IHVzZXJzcGFjZSBzZW5kIHRoZSBkYXRhIHRvIGRyaXZlci4KLSAqIEBwa3RfdHlwZTogICAgICBUeXBlIG9mIHRoZSBwYWNrZXQoUkVHIG9yIENNRCBQS1QpCi0gKiBAcGF5bG9hZFswXTogICAgUGF5bG9hZCBpcyBlaXRoZXIgY21kIG9yIHJlZyBwa3Qgc3RydWN0dXJlIGJhc2VkIG9uIHBrdCB0eXBlCi0gKi8KLXN0cnVjdCB3ZHNwX3dyaXRlX3BrdCB7Ci0JX191OCBwa3RfdHlwZTsKLQlfX3U4IHBheWxvYWRbMF07Ci19OwotCi0vKgotICogc3RydWN0IHdkc3BfZ2xpbmtfY2hfY2ZnIC0gRGVmaW5lcyB0aGUgZ2xpbmsgY2hhbm5lbCBjb25maWd1cmF0aW9uLgotICogQGNoX25hbWU6ICAgICAgICAgICBOYW1lIG9mIHRoZSBnbGluayBjaGFubmVsCi0gKiBAbGF0ZW5jeV9pbl91czogICAgIExhdGVuY3kgc3BlY2lmaWVkIGluIG1pY3JvIHNlY29uZHMgZm9yIFFPUwotICogQG5vX29mX2ludGVudHM6ICAgICBOdW1iZXIgb2YgaW50ZW50cyBwcmVxdWV1ZWQKLSAqIEBpbnRlbnRzX3NpemVbMF06ICAgRHluYW1pYyBhcnJheSB0byBzcGVjaWZ5IHNpemUgb2YgZWFjaCBpbnRlbnQKLSAqLwotc3RydWN0IHdkc3BfZ2xpbmtfY2hfY2ZnIHsKLQljaGFyIG5hbWVbV0RTUF9DSF9OQU1FX01BWF9MRU5dOwotCV9fdTMyIGxhdGVuY3lfaW5fdXM7Ci0JX191MzIgbm9fb2ZfaW50ZW50czsKLQlfX3UzMiBpbnRlbnRzX3NpemVbMF07Ci19OwotI2VuZGlmIC8qIF9XQ0RfRFNQX0dMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBhZjAwMGM3Li45NzgyZGZjIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0xMjkzLDYgKzEyOTMsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTiBoZXJlLgogCitjb25maWcgU0NIRURfQ09SRV9ST1RBVEUKKwlib29sICJTY2hlZHVsZXIgY29yZSByb3RhdGlvbiIKKwlkZXBlbmRzIG9uIFNNUAorCWhlbHAKKwkgIFRoaXMgb3B0aW9ucyBlbmFibGVzIHRoZSBjb3JlIHJvdGF0aW9uIGZ1bmN0aW9uYWxpdHkgaW4KKwkgIHRoZSBzY2hlZHVsZXIuIFNjaGVkdWxlciB3aXRoIGNvcmUgcm90YXRpb24gYWltcyB0byB1dGlsaXplCisJICBDUFVzIGV2ZW5seS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTiBoZXJlLgorCiBjb25maWcgQ0hFQ0tQT0lOVF9SRVNUT1JFCiAJYm9vbCAiQ2hlY2twb2ludC9yZXN0b3JlIHN1cHBvcnQiIGlmIEVYUEVSVAogCXNlbGVjdCBQUk9DX0NISUxEUkVOCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRfd2F0Y2guYyBiL2tlcm5lbC9hdWRpdF93YXRjaC5jCmluZGV4IDBkMzAyYTguLjY5MGUxZTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdF93YXRjaC5jCisrKyBiL2tlcm5lbC9hdWRpdF93YXRjaC5jCkBAIC00NTcsMTMgKzQ1NywxNSBAQAogCWxpc3RfZGVsKCZrcnVsZS0+cmxpc3QpOwogCiAJaWYgKGxpc3RfZW1wdHkoJndhdGNoLT5ydWxlcykpIHsKKwkJLyoKKwkJICogYXVkaXRfcmVtb3ZlX3dhdGNoKCkgZHJvcHMgb3VyIHJlZmVyZW5jZSB0byAncGFyZW50JyB3aGljaAorCQkgKiBjYW4gZ2V0IGZyZWVkLiBHcmFiIG91ciBvd24gcmVmZXJlbmNlIHRvIGJlIHNhZmUuCisJCSAqLworCQlhdWRpdF9nZXRfcGFyZW50KHBhcmVudCk7CiAJCWF1ZGl0X3JlbW92ZV93YXRjaCh3YXRjaCk7Ci0KLQkJaWYgKGxpc3RfZW1wdHkoJnBhcmVudC0+d2F0Y2hlcykpIHsKLQkJCWF1ZGl0X2dldF9wYXJlbnQocGFyZW50KTsKKwkJaWYgKGxpc3RfZW1wdHkoJnBhcmVudC0+d2F0Y2hlcykpCiAJCQlmc25vdGlmeV9kZXN0cm95X21hcmsoJnBhcmVudC0+bWFyaywgYXVkaXRfd2F0Y2hfZ3JvdXApOwotCQkJYXVkaXRfcHV0X3BhcmVudChwYXJlbnQpOwotCQl9CisJCWF1ZGl0X3B1dF9wYXJlbnQocGFyZW50KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCA4Y2U2NzlkLi43NzljODcxIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gKm5leHQ7CiB9OwogCi0jZGVmaW5lIEJQRl9DT01QTEVYSVRZX0xJTUlUX0lOU05TCTY1NTM2CisjZGVmaW5lIEJQRl9DT01QTEVYSVRZX0xJTUlUX0lOU05TCTk4MzA0CiAjZGVmaW5lIEJQRl9DT01QTEVYSVRZX0xJTUlUX1NUQUNLCTEwMjQKIAogc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhIHsKQEAgLTY4MiwxMiArNjgyLDEzIEBACiAJcmV0dXJuIC1FQUNDRVM7CiB9CiAKLXN0YXRpYyBib29sIGlzX3BvaW50ZXJfdmFsdWUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IHJlZ25vKQorc3RhdGljIGJvb2wgX19pc19wb2ludGVyX3ZhbHVlKGJvb2wgYWxsb3dfcHRyX2xlYWtzLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcpCiB7Ci0JaWYgKGVudi0+YWxsb3dfcHRyX2xlYWtzKQorCWlmIChhbGxvd19wdHJfbGVha3MpCiAJCXJldHVybiBmYWxzZTsKIAotCXN3aXRjaCAoZW52LT5jdXJfc3RhdGUucmVnc1tyZWdub10udHlwZSkgeworCXN3aXRjaCAocmVnLT50eXBlKSB7CiAJY2FzZSBVTktOT1dOX1ZBTFVFOgogCWNhc2UgQ09OU1RfSU1NOgogCQlyZXR1cm4gZmFsc2U7CkBAIC02OTYsNiArNjk3LDExIEBACiAJfQogfQogCitzdGF0aWMgYm9vbCBpc19wb2ludGVyX3ZhbHVlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCByZWdubykKK3sKKwlyZXR1cm4gX19pc19wb2ludGVyX3ZhbHVlKGVudi0+YWxsb3dfcHRyX2xlYWtzLCAmZW52LT5jdXJfc3RhdGUucmVnc1tyZWdub10pOworfQorCiBzdGF0aWMgaW50IGNoZWNrX3B0cl9hbGlnbm1lbnQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCSAgICAgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKIHsKQEAgLTE0NjcsNiArMTQ3Myw2NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19pbW1fYWx1X3Vua25vd24oc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuKQoreworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107CisJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOworCXM2NCBpbW1fbG9nMiA9IF9faWxvZzJfdTY0KChsb25nIGxvbmcpZHN0X3JlZy0+aW1tKTsKKworCS8qIEJQRl9YIGNvZGUgd2l0aCBzcmNfcmVnLT50eXBlIFVOS05PV05fVkFMVUUgaGVyZS4gKi8KKwlpZiAoc3JjX3JlZy0+aW1tID4gMCAmJiBkc3RfcmVnLT5pbW0pIHsKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBCUEZfQUREOgorCQkJLyogZHJlZyArPSBzcmVnCisJCQkgKiB3aGVyZSBib3RoIGhhdmUgemVybyB1cHBlciBiaXRzLiBBZGRpbmcgdGhlbQorCQkJICogY2FuIG9ubHkgcmVzdWx0IG1ha2luZyBvbmUgbW9yZSBiaXQgbm9uLXplcm8KKwkJCSAqIGluIHRoZSBsYXJnZXIgdmFsdWUuCisJCQkgKiBFeC4gMHhmZmZmIChpbW09NDgpICsgMSAoaW1tPTYzKSA9IDB4MTAwMDAgKGltbT00NykKKwkJCSAqICAgICAweGZmZmYgKGltbT00OCkgKyAweGZmZmYgPSAweDFmZmZlIChpbW09NDcpCisJCQkgKi8KKwkJCWRzdF9yZWctPmltbSA9IG1pbihzcmNfcmVnLT5pbW0sIDYzIC0gaW1tX2xvZzIpOworCQkJZHN0X3JlZy0+aW1tLS07CisJCQlicmVhazsKKwkJY2FzZSBCUEZfQU5EOgorCQkJLyogZHJlZyAmPSBzcmVnCisJCQkgKiBBTkQgY2FuIG5vdCBleHRlbmQgemVybyBiaXRzIG9ubHkgc2hyaW5rCisJCQkgKiBFeC4gIDB4MDAuLjAwZmZmZmZmCisJCQkgKiAgICAmIDB4MGYuLmZmZmZmZmZmCisJCQkgKiAgICAgLS0tLS0tLS0tLS0tLS0tLQorCQkJICogICAgICAweDAwLi4wMGZmZmZmZgorCQkJICovCisJCQlkc3RfcmVnLT5pbW0gPSBtYXgoc3JjX3JlZy0+aW1tLCA2MyAtIGltbV9sb2cyKTsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9PUjoKKwkJCS8qIGRyZWcgfD0gc3JlZworCQkJICogT1IgY2FuIG9ubHkgZXh0ZW5kIHplcm8gYml0cworCQkJICogRXguICAweDAwLi4wMGZmZmZmZgorCQkJICogICAgfCAweDBmLi5mZmZmZmZmZgorCQkJICogICAgIC0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqICAgICAgMHgwZi4uMDBmZmZmZmYKKwkJCSAqLworCQkJZHN0X3JlZy0+aW1tID0gbWluKHNyY19yZWctPmltbSwgNjMgLSBpbW1fbG9nMik7CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU1VCOgorCQljYXNlIEJQRl9NVUw6CisJCWNhc2UgQlBGX1JTSDoKKwkJY2FzZSBCUEZfTFNIOgorCQkJLyogVGhlc2UgbWF5IGJlIGZsdXNoZWQgb3V0IGxhdGVyICovCisJCWRlZmF1bHQ6CisJCQltYXJrX3JlZ191bmtub3duX3ZhbHVlKHJlZ3MsIGluc24tPmRzdF9yZWcpOworCQl9CisJfSBlbHNlIHsKKwkJbWFya19yZWdfdW5rbm93bl92YWx1ZShyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwl9CisKKwlkc3RfcmVnLT50eXBlID0gVU5LTk9XTl9WQUxVRTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBldmFsdWF0ZV9yZWdfaW1tX2FsdShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQkJCXN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKQEAgLTE0NzUsNiArMTU0MCw5IEBACiAJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAKKwlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCAmJiBzcmNfcmVnLT50eXBlID09IFVOS05PV05fVkFMVUUpCisJCXJldHVybiBldmFsdWF0ZV9yZWdfaW1tX2FsdV91bmtub3duKGVudiwgaW5zbik7CisKIAkvKiBkc3RfcmVnLT50eXBlID09IENPTlNUX0lNTSBoZXJlLCBzaW11bGF0ZSBleGVjdXRpb24gb2YgJ2FkZCcgaW5zbi4KIAkgKiBEb24ndCBjYXJlIGFib3V0IG92ZXJmbG93IG9yIG5lZ2F0aXZlIHZhbHVlcywganVzdCBhZGQgdGhlbQogCSAqLwpAQCAtMTUzMCwxMCArMTU5OCwyNCBAQAogCX0KIAogCS8qIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgd2hhdCB3YXMgZG9uZSB0byB0aGlzIHJlZ2lzdGVyLCBtYXJrIGl0Ci0JICogYXMgdW5rbm93bi4KKwkgKiBhcyB1bmtub3duLiBBbHNvLCBpZiBib3RoIGRlcml2ZWQgYm91bmRzIGNhbWUgZnJvbSBzaWduZWQvdW5zaWduZWQKKwkgKiBtaXhlZCBjb21wYXJlcyBhbmQgb25lIHNpZGUgaXMgdW5ib3VuZGVkLCB3ZSBjYW5ub3QgcmVhbGx5IGRvIGFueXRoaW5nCisJICogd2l0aCB0aGVtIGFzIGJvdW5kYXJpZXMgY2Fubm90IGJlIHRydXN0ZWQuIFRodXMsIGFyaXRobWV0aWMgb2YgdHdvCisJICogcmVncyBvZiBzdWNoIGtpbmQgd2lsbCBnZXQgaW52YWxpZGF0ZWQgYm91bmRzIG9uIHRoZSBkc3Qgc2lkZS4KIAkgKi8KLQlpZiAobWluX3ZhbCA9PSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFICYmCi0JICAgIG1heF92YWwgPT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkgeworCWlmICgobWluX3ZhbCA9PSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFICYmCisJICAgICBtYXhfdmFsID09IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHx8CisJICAgIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YICYmCisJICAgICAoKG1pbl92YWwgIT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSAmJgorCSAgICAgICBtYXhfdmFsID09IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHx8CisJICAgICAgKG1pbl92YWwgPT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSAmJgorCSAgICAgICBtYXhfdmFsICE9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHx8CisJICAgICAgKGRzdF9yZWctPm1pbl92YWx1ZSAhPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFICYmCisJICAgICAgIGRzdF9yZWctPm1heF92YWx1ZSA9PSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFKSB8fAorCSAgICAgIChkc3RfcmVnLT5taW5fdmFsdWUgPT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSAmJgorCSAgICAgICBkc3RfcmVnLT5tYXhfdmFsdWUgIT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkpICYmCisJICAgICByZWdzW2luc24tPmRzdF9yZWddLnZhbHVlX2Zyb21fc2lnbmVkICE9CisJICAgICByZWdzW2luc24tPnNyY19yZWddLnZhbHVlX2Zyb21fc2lnbmVkKSkgewogCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU0MiwxMCArMTYyNCwxMiBAQAogCSAqIGRvIG91ciBub3JtYWwgb3BlcmF0aW9ucyB0byB0aGUgcmVnaXN0ZXIsIHdlIG5lZWQgdG8gc2V0IHRoZSB2YWx1ZXMKIAkgKiB0byB0aGUgbWluL21heCBzaW5jZSB0aGV5IGFyZSB1bmRlZmluZWQuCiAJICovCi0JaWYgKG1pbl92YWwgPT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSkKLQkJZHN0X3JlZy0+bWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKLQlpZiAobWF4X3ZhbCA9PSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFKQotCQlkc3RfcmVnLT5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCWlmIChvcGNvZGUgIT0gQlBGX1NVQikgeworCQlpZiAobWluX3ZhbCA9PSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFKQorCQkJZHN0X3JlZy0+bWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKKwkJaWYgKG1heF92YWwgPT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKKwkJCWRzdF9yZWctPm1heF92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0U7CisJfQogCiAJc3dpdGNoIChvcGNvZGUpIHsKIAljYXNlIEJQRl9BREQ6CkBAIC0xNTU1LDEwICsxNjM5LDE3IEBACiAJCQlkc3RfcmVnLT5tYXhfdmFsdWUgKz0gbWF4X3ZhbDsKIAkJYnJlYWs7CiAJY2FzZSBCUEZfU1VCOgorCQkvKiBJZiBvbmUgb2Ygb3VyIHZhbHVlcyB3YXMgYXQgdGhlIGVuZCBvZiBvdXIgcmFuZ2VzLCB0aGVuIHRoZQorCQkgKiBfb3Bwb3NpdGVfIHZhbHVlIGluIHRoZSBkc3RfcmVnIGdvZXMgdG8gdGhlIGVuZCBvZiBvdXIgcmFuZ2UuCisJCSAqLworCQlpZiAobWluX3ZhbCA9PSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFKQorCQkJZHN0X3JlZy0+bWF4X3ZhbHVlID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwkJaWYgKG1heF92YWwgPT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKKwkJCWRzdF9yZWctPm1pbl92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CiAJCWlmIChkc3RfcmVnLT5taW5fdmFsdWUgIT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSkKLQkJCWRzdF9yZWctPm1pbl92YWx1ZSAtPSBtaW5fdmFsOworCQkJZHN0X3JlZy0+bWluX3ZhbHVlIC09IG1heF92YWw7CiAJCWlmIChkc3RfcmVnLT5tYXhfdmFsdWUgIT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKLQkJCWRzdF9yZWctPm1heF92YWx1ZSAtPSBtYXhfdmFsOworCQkJZHN0X3JlZy0+bWF4X3ZhbHVlIC09IG1pbl92YWw7CiAJCWJyZWFrOwogCWNhc2UgQlBGX01VTDoKIAkJaWYgKGRzdF9yZWctPm1pbl92YWx1ZSAhPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFKQpAQCAtMTgwOCw2ICsxODk5LDcgQEAKIAkJICogcmVnaXN0ZXIgYXMgdW5rbm93bi4KIAkJICovCiAJCWlmIChlbnYtPmFsbG93X3B0cl9sZWFrcyAmJgorCQkgICAgQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NCAmJiBvcGNvZGUgPT0gQlBGX0FERCAmJgogCQkgICAgKGRzdF9yZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRSB8fAogCQkgICAgIGRzdF9yZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRV9BREopKQogCQkJZHN0X3JlZy0+dHlwZSA9IFBUUl9UT19NQVBfVkFMVUVfQURKOwpAQCAtMTg3NiwzOCArMTk2OCw2MyBAQAogCQkJICAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpmYWxzZV9yZWcsIHU2NCB2YWwsCiAJCQkgICAgdTggb3Bjb2RlKQogeworCWJvb2wgdmFsdWVfZnJvbV9zaWduZWQgPSB0cnVlOworCWJvb2wgaXNfcmFuZ2UgPSB0cnVlOworCiAJc3dpdGNoIChvcGNvZGUpIHsKIAljYXNlIEJQRl9KRVE6CiAJCS8qIElmIHRoaXMgaXMgZmFsc2UgdGhlbiB3ZSBrbm93IG5vdGhpbmcgSm9uIFNub3csIGJ1dCBpZiBpdCBpcwogCQkgKiB0cnVlIHRoZW4gd2Uga25vdyBmb3Igc3VyZS4KIAkJICovCiAJCXRydWVfcmVnLT5tYXhfdmFsdWUgPSB0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlpc19yYW5nZSA9IGZhbHNlOwogCQlicmVhazsKIAljYXNlIEJQRl9KTkU6CiAJCS8qIElmIHRoaXMgaXMgdHJ1ZSB3ZSBrbm93IG5vdGhpbmcgSm9uIFNub3csIGJ1dCBpZiBpdCBpcyBmYWxzZQogCQkgKiB3ZSBrbm93IHRoZSB2YWx1ZSBmb3Igc3VyZTsKIAkJICovCiAJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gZmFsc2VfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCWlzX3JhbmdlID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgQlBGX0pHVDoKLQkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KLQkJZmFsc2VfcmVnLT5taW5fdmFsdWUgPSAwOworCQl2YWx1ZV9mcm9tX3NpZ25lZCA9IGZhbHNlOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgQlBGX0pTR1Q6CisJCWlmICh0cnVlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgIT0gdmFsdWVfZnJvbV9zaWduZWQpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHRydWVfcmVnLCAwKTsKKwkJaWYgKGZhbHNlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgIT0gdmFsdWVfZnJvbV9zaWduZWQpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKGZhbHNlX3JlZywgMCk7CisJCWlmIChvcGNvZGUgPT0gQlBGX0pHVCkgeworCQkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KKwkJCWZhbHNlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwkJfQogCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyB0aGUgbWF4aW11bSB2YWwgaXMgdmFsLAogCQkgKiBvdGhlcndpc2Ugd2Uga25vdyB0aGUgbWluIHZhbCBpcyB2YWwrMS4KIAkJICovCiAJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gdmFsOworCQlmYWxzZV9yZWctPnZhbHVlX2Zyb21fc2lnbmVkID0gdmFsdWVfZnJvbV9zaWduZWQ7CiAJCXRydWVfcmVnLT5taW5fdmFsdWUgPSB2YWwgKyAxOworCQl0cnVlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgPSB2YWx1ZV9mcm9tX3NpZ25lZDsKIAkJYnJlYWs7CiAJY2FzZSBCUEZfSkdFOgotCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLwotCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJCXZhbHVlX2Zyb21fc2lnbmVkID0gZmFsc2U7CisJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBCUEZfSlNHRToKKwkJaWYgKHRydWVfcmVnLT52YWx1ZV9mcm9tX3NpZ25lZCAhPSB2YWx1ZV9mcm9tX3NpZ25lZCkKKwkJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXModHJ1ZV9yZWcsIDApOworCQlpZiAoZmFsc2VfcmVnLT52YWx1ZV9mcm9tX3NpZ25lZCAhPSB2YWx1ZV9mcm9tX3NpZ25lZCkKKwkJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXMoZmFsc2VfcmVnLCAwKTsKKwkJaWYgKG9wY29kZSA9PSBCUEZfSkdFKSB7CisJCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLworCQkJZmFsc2VfcmVnLT5taW5fdmFsdWUgPSAwOworCQl9CiAJCS8qIElmIHRoaXMgaXMgZmFsc2UgdGhlbiB3ZSBrbm93IHRoZSBtYXhpbXVtIHZhbHVlIGlzIHZhbCAtIDEsCiAJCSAqIG90aGVyd2lzZSB3ZSBrbm93IHRoZSBtaW1pbXVtIHZhbHVlIGlzIHZhbC4KIAkJICovCiAJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gdmFsIC0gMTsKKwkJZmFsc2VfcmVnLT52YWx1ZV9mcm9tX3NpZ25lZCA9IHZhbHVlX2Zyb21fc2lnbmVkOwogCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQl0cnVlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgPSB2YWx1ZV9mcm9tX3NpZ25lZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xOTE1LDYgKzIwMzIsMTIgQEAKIAogCWNoZWNrX3JlZ19vdmVyZmxvdyhmYWxzZV9yZWcpOwogCWNoZWNrX3JlZ19vdmVyZmxvdyh0cnVlX3JlZyk7CisJaWYgKGlzX3JhbmdlKSB7CisJCWlmIChfX2lzX3BvaW50ZXJfdmFsdWUoZmFsc2UsIGZhbHNlX3JlZykpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKGZhbHNlX3JlZywgMCk7CisJCWlmIChfX2lzX3BvaW50ZXJfdmFsdWUoZmFsc2UsIHRydWVfcmVnKSkKKwkJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXModHJ1ZV9yZWcsIDApOworCX0KIH0KIAogLyogU2FtZSBhcyBhYm92ZSwgYnV0IGZvciB0aGUgY2FzZSB0aGF0IGRzdF9yZWcgaXMgYSBDT05TVF9JTU0gcmVnIGFuZCBzcmNfcmVnCkBAIC0xOTI0LDM5ICsyMDQ3LDY0IEBACiAJCQkJc3RydWN0IGJwZl9yZWdfc3RhdGUgKmZhbHNlX3JlZywgdTY0IHZhbCwKIAkJCQl1OCBvcGNvZGUpCiB7CisJYm9vbCB2YWx1ZV9mcm9tX3NpZ25lZCA9IHRydWU7CisJYm9vbCBpc19yYW5nZSA9IHRydWU7CisKIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgQlBGX0pFUToKIAkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzCiAJCSAqIHRydWUgdGhlbiB3ZSBrbm93IGZvciBzdXJlLgogCQkgKi8KIAkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHRydWVfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCWlzX3JhbmdlID0gZmFsc2U7CiAJCWJyZWFrOwogCWNhc2UgQlBGX0pORToKIAkJLyogSWYgdGhpcyBpcyB0cnVlIHdlIGtub3cgbm90aGluZyBKb24gU25vdywgYnV0IGlmIGl0IGlzIGZhbHNlCiAJCSAqIHdlIGtub3cgdGhlIHZhbHVlIGZvciBzdXJlOwogCQkgKi8KIAkJZmFsc2VfcmVnLT5tYXhfdmFsdWUgPSBmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJaXNfcmFuZ2UgPSBmYWxzZTsKIAkJYnJlYWs7CiAJY2FzZSBCUEZfSkdUOgotCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLwotCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwkJdmFsdWVfZnJvbV9zaWduZWQgPSBmYWxzZTsKKwkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIEJQRl9KU0dUOgorCQlpZiAodHJ1ZV9yZWctPnZhbHVlX2Zyb21fc2lnbmVkICE9IHZhbHVlX2Zyb21fc2lnbmVkKQorCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyh0cnVlX3JlZywgMCk7CisJCWlmIChmYWxzZV9yZWctPnZhbHVlX2Zyb21fc2lnbmVkICE9IHZhbHVlX2Zyb21fc2lnbmVkKQorCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhmYWxzZV9yZWcsIDApOworCQlpZiAob3Bjb2RlID09IEJQRl9KR1QpIHsKKwkJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwkJfQogCQkvKgogCQkgKiBJZiB0aGlzIGlzIGZhbHNlLCB0aGVuIHRoZSB2YWwgaXMgPD0gdGhlIHJlZ2lzdGVyLCBpZiBpdCBpcwogCQkgKiB0cnVlIHRoZSByZWdpc3RlciA8PSB0byB0aGUgdmFsLgogCQkgKi8KIAkJZmFsc2VfcmVnLT5taW5fdmFsdWUgPSB2YWw7CisJCWZhbHNlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgPSB2YWx1ZV9mcm9tX3NpZ25lZDsKIAkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbCAtIDE7CisJCXRydWVfcmVnLT52YWx1ZV9mcm9tX3NpZ25lZCA9IHZhbHVlX2Zyb21fc2lnbmVkOwogCQlicmVhazsKIAljYXNlIEJQRl9KR0U6Ci0JCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCi0JCXRydWVfcmVnLT5taW5fdmFsdWUgPSAwOworCQl2YWx1ZV9mcm9tX3NpZ25lZCA9IGZhbHNlOworCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgQlBGX0pTR0U6CisJCWlmICh0cnVlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgIT0gdmFsdWVfZnJvbV9zaWduZWQpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHRydWVfcmVnLCAwKTsKKwkJaWYgKGZhbHNlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgIT0gdmFsdWVfZnJvbV9zaWduZWQpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKGZhbHNlX3JlZywgMCk7CisJCWlmIChvcGNvZGUgPT0gQlBGX0pHRSkgeworCQkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KKwkJCXRydWVfcmVnLT5taW5fdmFsdWUgPSAwOworCQl9CiAJCS8qIElmIHRoaXMgaXMgZmFsc2UgdGhlbiBjb25zdGFudCA8IHJlZ2lzdGVyLCBpZiBpdCBpcyB0cnVlIHRoZW4KIAkJICogdGhlIHJlZ2lzdGVyIDwgY29uc3RhbnQuCiAJCSAqLwogCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbCArIDE7CisJCWZhbHNlX3JlZy0+dmFsdWVfZnJvbV9zaWduZWQgPSB2YWx1ZV9mcm9tX3NpZ25lZDsKIAkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbDsKKwkJdHJ1ZV9yZWctPnZhbHVlX2Zyb21fc2lnbmVkID0gdmFsdWVfZnJvbV9zaWduZWQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTk2NCw2ICsyMTEyLDEyIEBACiAKIAljaGVja19yZWdfb3ZlcmZsb3coZmFsc2VfcmVnKTsKIAljaGVja19yZWdfb3ZlcmZsb3codHJ1ZV9yZWcpOworCWlmIChpc19yYW5nZSkgeworCQlpZiAoX19pc19wb2ludGVyX3ZhbHVlKGZhbHNlLCBmYWxzZV9yZWcpKQorCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhmYWxzZV9yZWcsIDApOworCQlpZiAoX19pc19wb2ludGVyX3ZhbHVlKGZhbHNlLCB0cnVlX3JlZykpCisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHRydWVfcmVnLCAwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIG1hcmtfbWFwX3JlZyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vLCB1MzIgaWQsCkBAIC0yMzkwLDYgKzI1NDQsNyBAQAogCQkJCWVudi0+ZXhwbG9yZWRfc3RhdGVzW3QgKyAxXSA9IFNUQVRFX0xJU1RfTUFSSzsKIAkJfSBlbHNlIHsKIAkJCS8qIGNvbmRpdGlvbmFsIGp1bXAgd2l0aCB0d28gZWRnZXMgKi8KKwkJCWVudi0+ZXhwbG9yZWRfc3RhdGVzW3RdID0gU1RBVEVfTElTVF9NQVJLOwogCQkJcmV0ID0gcHVzaF9pbnNuKHQsIHQgKyAxLCBGQUxMVEhST1VHSCwgZW52KTsKIAkJCWlmIChyZXQgPT0gMSkKIAkJCQlnb3RvIHBlZWtfc3RhY2s7CkBAIC0yNTQ4LDYgKzI3MDMsMTIgQEAKIAkJICAgICByY3VyLT50eXBlICE9IE5PVF9JTklUKSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlZy0+aWQgaW4gdGhpcyBjYXNlLiAqLworCQlpZiAocm9sZC0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwgJiYKKwkJICAgIHJjdXItPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMICYmCisJCSAgICByb2xkLT5tYXBfcHRyID09IHJjdXItPm1hcF9wdHIpCisJCQljb250aW51ZTsKKwogCQlpZiAocm9sZC0+dHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmIHJjdXItPnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCAmJgogCQkgICAgY29tcGFyZV9wdHJzX3RvX3BhY2tldChyb2xkLCByY3VyKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjY4Miw2ICsyODQzLDkgQEAKIAkJCWdvdG8gcHJvY2Vzc19icGZfZXhpdDsKIAkJfQogCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCWNvbmRfcmVzY2hlZCgpOworCiAJCWlmIChsb2dfbGV2ZWwgJiYgZG9fcHJpbnRfc3RhdGUpIHsKIAkJCXZlcmJvc2UoIlxuZnJvbSAlZCB0byAlZDoiLCBwcmV2X2luc25faWR4LCBpbnNuX2lkeCk7CiAJCQlwcmludF92ZXJpZmllcl9zdGF0ZSgmZW52LT5jdXJfc3RhdGUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IDdiYjIxZmQuLjI2YzYyNGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTM1MDgsMTEgKzM1MDgsMTEgQEAKIAljZ3JwLT5zdWJ0cmVlX2NvbnRyb2wgJj0gfmRpc2FibGU7CiAKIAlyZXQgPSBjZ3JvdXBfYXBwbHlfY29udHJvbChjZ3JwKTsKLQogCWNncm91cF9maW5hbGl6ZV9jb250cm9sKGNncnAsIHJldCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJa2VybmZzX2FjdGl2YXRlKGNncnAtPmtuKTsKLQlyZXQgPSAwOwogb3V0X3VubG9jazoKIAljZ3JvdXBfa25fdW5sb2NrKG9mLT5rbik7CiAJcmV0dXJuIHJldCA/OiBuYnl0ZXM7CkBAIC01NzQ0LDYgKzU3NDQsMTAgQEAKIAogCQlpZiAoc3MtPmJpbmQpCiAJCQlzcy0+YmluZChpbml0X2Nzc19zZXQuc3Vic3lzW3NzaWRdKTsKKworCQltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOworCQljc3NfcG9wdWxhdGVfZGlyKGluaXRfY3NzX3NldC5zdWJzeXNbc3NpZF0pOworCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAJfQogCiAJLyogaW5pdF9jc3Nfc2V0LnN1YnN5c1tdIGhhcyBiZWVuIHVwZGF0ZWQsIHJlLWhhc2ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb25maWdzL1JFQURNRS5hbmRyb2lkIGIva2VybmVsL2NvbmZpZ3MvUkVBRE1FLmFuZHJvaWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMmQ3YzAuLjAwMDAwMDAKLS0tIGEva2VybmVsL2NvbmZpZ3MvUkVBRE1FLmFuZHJvaWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1UaGUgYW5kcm9pZC0qLmNvbmZpZyBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGJhc2UKLWZvciBhbiBBbmRyb2lkIGtlcm5lbCBjb25maWcuIEFsbCBkZXZpY2VzIHNob3VsZCBoYXZlIHRoZSBvcHRpb25zIGluCi1hbmRyb2lkLWJhc2UuY29uZmlnIGVuYWJsZWQuIFdoaWxlIG5vdCBtYW5kYXRvcnksIHRoZSBvcHRpb25zIGluCi1hbmRyb2lkLXJlY29tbWVuZGVkLmNvbmZpZyBlbmFibGUgYWR2YW5jZWQgQW5kcm9pZCBmZWF0dXJlcy4KLQotQXNzdW1pbmcgeW91IGFscmVhZHkgaGF2ZSBhIG1pbmltYWxpc3QgZGVmY29uZmlnIGZvciB5b3VyIGRldmljZSwgYSBwb3NzaWJsZQotd2F5IHRvIGVuYWJsZSB0aGVzZSBvcHRpb25zIHdvdWxkIGJlOgotCi0gICAgIEFSQ0g9PGFyY2g+IHNjcmlwdHMva2NvbmZpZy9tZXJnZV9jb25maWcuc2ggPHBhdGhfdG8+LzxkZXZpY2U+X2RlZmNvbmZpZyBrZXJuZWwvY29uZmlncy9hbmRyb2lkLWJhc2UuY29uZmlnIGtlcm5lbC9jb25maWdzL2FuZHJvaWQtcmVjb21tZW5kZWQuY29uZmlnCi0KLVRoaXMgd2lsbCBnZW5lcmF0ZSBhIC5jb25maWcgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIHRvIHNhdmUgYSBuZXcgZGVmY29uZmlnIG9yCi1jb21waWxlIGEgbmV3IGtlcm5lbCB3aXRoIEFuZHJvaWQgZmVhdHVyZXMgZW5hYmxlZC4KLQotQmVjYXVzZSB0aGVyZSBpcyBubyB0b29sIHRvIGNvbnNpc3RlbnRseSBnZW5lcmF0ZSB0aGVzZSBjb25maWcgZnJhZ21lbnRzLAotbGV0cyBrZWVwIHRoZW0gYWxwaGFiZXRpY2FsbHkgc29ydGVkIGluc3RlYWQgb2YgcmFuZG9tLgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbmZpZ3MvYW5kcm9pZC1iYXNlLWFybTY0LmNmZyBiL2tlcm5lbC9jb25maWdzL2FuZHJvaWQtYmFzZS1hcm02NC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjIzZDYuLjAwMDAwMDAKLS0tIGEva2VybmVsL2NvbmZpZ3MvYW5kcm9pZC1iYXNlLWFybTY0LmNmZworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyAgS0VFUCBBTFBIQUJFVElDQUxMWSBTT1JURUQKLUNPTkZJR19BUk1WOF9ERVBSRUNBVEVEPXkKLUNPTkZJR19DUDE1X0JBUlJJRVJfRU1VTEFUSU9OPXkKLUNPTkZJR19TRVRFTkRfRU1VTEFUSU9OPXkKLUNPTkZJR19TV1BfRU1VTEFUSU9OPXkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jb25maWdzL2FuZHJvaWQtYmFzZS5jb25maWcgYi9rZXJuZWwvY29uZmlncy9hbmRyb2lkLWJhc2UuY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGRmMDQ4Li4wMDAwMDAwCi0tLSBhL2tlcm5lbC9jb25maWdzL2FuZHJvaWQtYmFzZS5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotIyAgS0VFUCBBTFBIQUJFVElDQUxMWSBTT1JURUQKLSMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAotIyBDT05GSUdfREVWTUVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZIQU5ETEUgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VMSUIgaXMgbm90IHNldAotQ09ORklHX0FORFJPSUQ9eQotQ09ORklHX0FORFJPSURfQklOREVSX0RFVklDRVM9YmluZGVyLGh3YmluZGVyLHZuZGJpbmRlcgotQ09ORklHX0FORFJPSURfQklOREVSX0lQQz15Ci1DT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUj15Ci1DT05GSUdfQVNITUVNPXkKLUNPTkZJR19BVURJVD15Ci1DT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0NHUk9VUFM9eQotQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKLUNPTkZJR19DR1JPVVBfRlJFRVpFUj15Ci1DT05GSUdfQ0dST1VQX1NDSEVEPXkKLUNPTkZJR19DR1JPVVBfQlBGPXkKLUNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1NFTElOVVg9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19GQj15Ci1DT05GSUdfSEFSREVORURfVVNFUkNPUFk9eQotQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15Ci1DT05GSUdfSUtDT05GSUc9eQotQ09ORklHX0lLQ09ORklHX1BST0M9eQotQ09ORklHX0lORVQ2X0FIPXkKLUNPTkZJR19JTkVUNl9FU1A9eQotQ09ORklHX0lORVQ2X0lQQ09NUD15Ci1DT05GSUdfSU5FVD15Ci1DT05GSUdfSU5FVF9ESUFHX0RFU1RST1k9eQotQ09ORklHX0lORVRfRVNQPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQotQ09ORklHX0lQNl9ORl9GSUxURVI9eQotQ09ORklHX0lQNl9ORl9JUFRBQkxFUz15Ci1DT05GSUdfSVA2X05GX01BTkdMRT15Ci1DT05GSUdfSVA2X05GX1JBVz15Ci1DT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9eQotQ09ORklHX0lQVjY9eQotQ09ORklHX0lQVjZfTUlQNj15Ci1DT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVM9eQotQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQotQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQotQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15Ci1DT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15Ci1DT05GSUdfSVBfTkZfQVJQRklMVEVSPXkKLUNPTkZJR19JUF9ORl9BUlBUQUJMRVM9eQotQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9eQotQ09ORklHX0lQX05GX0ZJTFRFUj15Ci1DT05GSUdfSVBfTkZfSVBUQUJMRVM9eQotQ09ORklHX0lQX05GX01BTkdMRT15Ci1DT05GSUdfSVBfTkZfTUFUQ0hfQUg9eQotQ09ORklHX0lQX05GX01BVENIX0VDTj15Ci1DT05GSUdfSVBfTkZfTUFUQ0hfVFRMPXkKLUNPTkZJR19JUF9ORl9OQVQ9eQotQ09ORklHX0lQX05GX1JBVz15Ci1DT05GSUdfSVBfTkZfU0VDVVJJVFk9eQotQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPXkKLUNPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9eQotQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9eQotQ09ORklHX01PRFVMRVM9eQotQ09ORklHX01PRFVMRV9VTkxPQUQ9eQotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19ORVQ9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTElNSVQ9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVRBR1VJRD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBMj15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU09DS0VUPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUM9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkc9eQotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVTMyPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5TRUNNQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0lETEVUSU1FUj15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUU9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfU0VDTUFSSz15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9eQotQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFBST1hZPXkKLUNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFPXkKLUNPTkZJR19ORVRfQ0xTX0FDVD15Ci1DT05GSUdfTkVUX0NMU19VMzI9eQotQ09ORklHX05FVF9FTUFUQ0g9eQotQ09ORklHX05FVF9FTUFUQ0hfVTMyPXkKLUNPTkZJR19ORVRfS0VZPXkKLUNPTkZJR19ORVRfU0NIRUQ9eQotQ09ORklHX05FVF9TQ0hfSFRCPXkKLUNPTkZJR19ORl9DT05OVFJBQ0s9eQotQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREE9eQotQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFM9eQotQ09ORklHX05GX0NPTk5UUkFDS19GVFA9eQotQ09ORklHX05GX0NPTk5UUkFDS19IMzIzPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9eQotQ09ORklHX05GX0NPTk5UUkFDS19JUkM9eQotQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfUFBUUD15Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1NBTkU9eQotQ09ORklHX05GX0NPTk5UUkFDS19TRUNNQVJLPXkKLUNPTkZJR19ORl9DT05OVFJBQ0tfVEZUUD15Ci1DT05GSUdfTkZfQ1RfTkVUTElOSz15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fRENDUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fU0NUUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT15Ci1DT05GSUdfTkZfTkFUPXkKLUNPTkZJR19OT19IWj15Ci1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QTV9BVVRPU0xFRVA9eQotQ09ORklHX1BNX1dBS0VMT0NLUz15Ci1DT05GSUdfUFBQPXkKLUNPTkZJR19QUFBPTEFDPXkKLUNPTkZJR19QUFBPUE5TPXkKLUNPTkZJR19QUFBfQlNEQ09NUD15Ci1DT05GSUdfUFBQX0RFRkxBVEU9eQotQ09ORklHX1BQUF9NUFBFPXkKLUNPTkZJR19QUkVFTVBUPXkKLUNPTkZJR19QUk9GSUxJTkc9eQotQ09ORklHX1FGTVRfVjI9eQotQ09ORklHX1FVT1RBPXkKLUNPTkZJR19RVU9UQUNUTD15Ci1DT05GSUdfUVVPVEFfTkVUTElOS19JTlRFUkZBQ0U9eQotQ09ORklHX1FVT1RBX1RSRUU9eQotQ09ORklHX1JBTkRPTUlaRV9CQVNFPXkKLUNPTkZJR19SVENfQ0xBU1M9eQotQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKLUNPTkZJR19TRUNDT01QPXkKLUNPTkZJR19TRUNVUklUWT15Ci1DT05GSUdfU0VDVVJJVFlfTkVUV09SSz15Ci1DT05GSUdfU0VDVVJJVFlfUEVSRl9FVkVOVFNfUkVTVFJJQ1Q9eQotQ09ORklHX1NFQ1VSSVRZX1NFTElOVVg9eQotQ09ORklHX1NUQUdJTkc9eQotQ09ORklHX1NZTkM9eQotQ09ORklHX1RVTj15Ci1DT05GSUdfVUlEX1NZU19TVEFUUz15Ci1DT05GSUdfVU5JWD15Ci1DT05GSUdfVVNCX0NPTkZJR0ZTPXkKLUNPTkZJR19VU0JfQ09ORklHRlNfRl9BQ0M9eQotQ09ORklHX1VTQl9DT05GSUdGU19GX0FVRElPX1NSQz15Ci1DT05GSUdfVVNCX0NPTkZJR0ZTX0ZfRlM9eQotQ09ORklHX1VTQl9DT05GSUdGU19GX01JREk9eQotQ09ORklHX1VTQl9DT05GSUdGU19GX01UUD15Ci1DT05GSUdfVVNCX0NPTkZJR0ZTX0ZfUFRQPXkKLUNPTkZJR19VU0JfQ09ORklHRlNfVUVWRU5UPXkKLUNPTkZJR19VU0JfR0FER0VUPXkKLUNPTkZJR19YRlJNX1VTRVI9eQpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbmZpZ3MvYW5kcm9pZC1yZWNvbW1lbmRlZC5jb25maWcgYi9rZXJuZWwvY29uZmlncy9hbmRyb2lkLXJlY29tbWVuZGVkLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlYzZjMS4uMDAwMDAwMAotLS0gYS9rZXJuZWwvY29uZmlncy9hbmRyb2lkLXJlY29tbWVuZGVkLmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jICBLRUVQIEFMUEhBQkVUSUNBTExZIFNPUlRFRAotIyBDT05GSUdfQUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19TSVAgaXMgbm90IHNldAotIyBDT05GSUdfUE1fV0FLRUxPQ0tTX0dDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLUNPTkZJR19BUk02NF9TV19UVEJSMF9QQU49eQotQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15Ci1DT05GSUdfQkxLX0RFVl9ETT15Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT04MTkyCi1DT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1JfU1RST05HPXkKLUNPTkZJR19DT01QQUNUSU9OPXkKLUNPTkZJR19DUFVfU1dfRE9NQUlOX1BBTj15Ci1DT05GSUdfREVCVUdfUk9EQVRBPXkKLUNPTkZJR19ETV9DUllQVD15Ci1DT05GSUdfRE1fVUVWRU5UPXkKLUNPTkZJR19ETV9WRVJJVFk9eQotQ09ORklHX0RNX1ZFUklUWV9GRUM9eQotQ09ORklHX0RSQUdPTlJJU0VfRkY9eQotQ09ORklHX0VOQUJMRV9ERUZBVUxUX1RSQUNFUlM9eQotQ09ORklHX0VYVDRfRlM9eQotQ09ORklHX0VYVDRfRlNfU0VDVVJJVFk9eQotQ09ORklHX0ZVU0VfRlM9eQotQ09ORklHX0dSRUVOQVNJQV9GRj15Ci1DT05GSUdfSElEUkFXPXkKLUNPTkZJR19ISURfQTRURUNIPXkKLUNPTkZJR19ISURfQUNSVVg9eQotQ09ORklHX0hJRF9BQ1JVWF9GRj15Ci1DT05GSUdfSElEX0FQUExFPXkKLUNPTkZJR19ISURfQkVMS0lOPXkKLUNPTkZJR19ISURfQ0hFUlJZPXkKLUNPTkZJR19ISURfQ0hJQ09OWT15Ci1DT05GSUdfSElEX0NZUFJFU1M9eQotQ09ORklHX0hJRF9EUkFHT05SSVNFPXkKLUNPTkZJR19ISURfRUxFQ09NPXkKLUNPTkZJR19ISURfRU1TX0ZGPXkKLUNPTkZJR19ISURfRVpLRVk9eQotQ09ORklHX0hJRF9HUkVFTkFTSUE9eQotQ09ORklHX0hJRF9HWVJBVElPTj15Ci1DT05GSUdfSElEX0hPTFRFSz15Ci1DT05GSUdfSElEX0tFTlNJTkdUT049eQotQ09ORklHX0hJRF9LRVlUT1VDSD15Ci1DT05GSUdfSElEX0tZRT15Ci1DT05GSUdfSElEX0xDUE9XRVI9eQotQ09ORklHX0hJRF9MT0dJVEVDSD15Ci1DT05GSUdfSElEX0xPR0lURUNIX0RKPXkKLUNPTkZJR19ISURfTUFHSUNNT1VTRT15Ci1DT05GSUdfSElEX01JQ1JPU09GVD15Ci1DT05GSUdfSElEX01PTlRFUkVZPXkKLUNPTkZJR19ISURfTVVMVElUT1VDSD15Ci1DT05GSUdfSElEX05UUklHPXkKLUNPTkZJR19ISURfT1JURUs9eQotQ09ORklHX0hJRF9QQU5USEVSTE9SRD15Ci1DT05GSUdfSElEX1BFVEFMWU5YPXkKLUNPTkZJR19ISURfUElDT0xDRD15Ci1DT05GSUdfSElEX1BSSU1BWD15Ci1DT05GSUdfSElEX1BST0RJS0VZUz15Ci1DT05GSUdfSElEX1JPQ0NBVD15Ci1DT05GSUdfSElEX1NBSVRFSz15Ci1DT05GSUdfSElEX1NBTVNVTkc9eQotQ09ORklHX0hJRF9TTUFSVEpPWVBMVVM9eQotQ09ORklHX0hJRF9TT05ZPXkKLUNPTkZJR19ISURfU1BFRURMSU5LPXkKLUNPTkZJR19ISURfU1VOUExVUz15Ci1DT05GSUdfSElEX1RIUlVTVE1BU1RFUj15Ci1DT05GSUdfSElEX1RJVk89eQotQ09ORklHX0hJRF9UT1BTRUVEPXkKLUNPTkZJR19ISURfVFdJTkhBTj15Ci1DT05GSUdfSElEX1VDTE9HSUM9eQotQ09ORklHX0hJRF9XQUNPTT15Ci1DT05GSUdfSElEX1dBTFRPUD15Ci1DT05GSUdfSElEX1dJSU1PVEU9eQotQ09ORklHX0hJRF9aRVJPUExVUz15Ci1DT05GSUdfSElEX1pZREFDUk9OPXkKLUNPTkZJR19JTlBVVF9FVkRFVj15Ci1DT05GSUdfSU5QVVRfR1BJTz15Ci1DT05GSUdfSU5QVVRfSk9ZU1RJQ0s9eQotQ09ORklHX0lOUFVUX0tFWUNIT1JEPXkKLUNPTkZJR19JTlBVVF9LRVlSRVNFVD15Ci1DT05GSUdfSU5QVVRfTUlTQz15Ci1DT05GSUdfSU5QVVRfVEFCTEVUPXkKLUNPTkZJR19JTlBVVF9VSU5QVVQ9eQotQ09ORklHX0lPTj15Ci1DT05GSUdfSk9ZU1RJQ0tfWFBBRD15Ci1DT05GSUdfSk9ZU1RJQ0tfWFBBRF9GRj15Ci1DT05GSUdfSk9ZU1RJQ0tfWFBBRF9MRURTPXkKLUNPTkZJR19LQUxMU1lNU19BTEw9eQotQ09ORklHX0tTTT15Ci1DT05GSUdfTE9HSUc5NDBfRkY9eQotQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGPXkKLUNPTkZJR19MT0dJVEVDSF9GRj15Ci1DT05GSUdfTUQ9eQotQ09ORklHX01FRElBX1NVUFBPUlQ9eQotQ09ORklHX01FTU9SWV9TVEFURV9USU1FPXkKLUNPTkZJR19NU0RPU19GUz15Ci1DT05GSUdfUEFOSUNfVElNRU9VVD01Ci1DT05GSUdfUEFOVEhFUkxPUkRfRkY9eQotQ09ORklHX1BFUkZfRVZFTlRTPXkKLUNPTkZJR19QTV9ERUJVRz15Ci1DT05GSUdfUE1fUlVOVElNRT15Ci1DT05GSUdfUE1fV0FLRUxPQ0tTX0xJTUlUPTAKLUNPTkZJR19QT1dFUl9TVVBQTFk9eQotQ09ORklHX1BTVE9SRT15Ci1DT05GSUdfUFNUT1JFX0NPTlNPTEU9eQotQ09ORklHX1BTVE9SRV9SQU09eQotQ09ORklHX1NDSEVEU1RBVFM9eQotQ09ORklHX1NNQVJUSk9ZUExVU19GRj15Ci1DT05GSUdfU05EPXkKLUNPTkZJR19TT1VORD15Ci1DT05GSUdfU1VTUEVORF9USU1FPXkKLUNPTkZJR19UQUJMRVRfVVNCX0FDRUNBRD15Ci1DT05GSUdfVEFCTEVUX1VTQl9BSVBURUs9eQotQ09ORklHX1RBQkxFVF9VU0JfR1RDTz15Ci1DT05GSUdfVEFCTEVUX1VTQl9IQU5XQU5HPXkKLUNPTkZJR19UQUJMRVRfVVNCX0tCVEFCPXkKLUNPTkZJR19UQVNLU1RBVFM9eQotQ09ORklHX1RBU0tfREVMQVlfQUNDVD15Ci1DT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKLUNPTkZJR19UQVNLX1hBQ0NUPXkKLUNPTkZJR19USU1FUl9TVEFUUz15Ci1DT05GSUdfVE1QRlM9eQotQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15Ci1DT05GSUdfVUhJRD15Ci1DT05GSUdfTUVNT1JZX1NUQVRFX1RJTUU9eQotQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15Ci1DT05GSUdfVVNCX0VIQ0lfSENEPXkKLUNPTkZJR19VU0JfSElEREVWPXkKLUNPTkZJR19VU0JfVVNCTkVUPXkKLUNPTkZJR19WRkFUX0ZTPXkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCA3ZTNkZmE2Li42OWRjNDI4IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC00MTEsMTMgKzQxMSwxNiBAQAogfQogc3RhdGljIHZvaWQgX19jcHVocF9raWNrX2FwX3dvcmsoc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QpOwogCitzdGF0aWMgdm9pZCBfX2NwdWhwX2tpY2tfYXBfd29yayhzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCk7CisKIHN0YXRpYyBpbnQgYnJpbmd1cF93YWl0X2Zvcl9hcCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOwogCiAJLyogV2FpdCBmb3IgdGhlIENQVSB0byByZWFjaCBDUFVIUF9BUF9PTkxJTkVfSURMRSAqLwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnN0LT5kb25lKTsKLQlCVUdfT04oIWNwdV9vbmxpbmUoY3B1KSk7CisJaWYgKFdBUk5fT05fT05DRSgoIWNwdV9vbmxpbmUoY3B1KSkpKQorCQlyZXR1cm4gLUVDQU5DRUxFRDsKIAogCS8qIFVucGFyayB0aGUgc3RvcHBlciB0aHJlYWQgYW5kIHRoZSBob3RwbHVnIHRocmVhZCBvZiB0aGUgdGFyZ2V0IGNwdSAqLwogCXN0b3BfbWFjaGluZV91bnBhcmsoY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBhOTljZDhkLi5kM2E3NDExIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC02MSw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShjcHVzZXRzX3ByZV9lbmFibGVfa2V5KTsKIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGNwdXNldHNfZW5hYmxlZF9rZXkpOwogCiAvKiBTZWUgIkZyZXF1ZW5jeSBtZXRlciIgY29tbWVudHMsIGJlbG93LiAqLwpAQCAtMTkwNyw2ICsxOTA4LDcgQEAKIAl7CiAJCS5uYW1lID0gIm1lbW9yeV9wcmVzc3VyZSIsCiAJCS5yZWFkX3U2NCA9IGNwdXNldF9yZWFkX3U2NCwKKwkJLnByaXZhdGUgPSBGSUxFX01FTU9SWV9QUkVTU1VSRSwKIAl9LAogCiAJewpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9jb3JlLmMgYi9rZXJuZWwvZXZlbnRzL2NvcmUuYwppbmRleCBkMWJlZDYzLi5mNmU4MWI1IDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL2NvcmUuYworKysgYi9rZXJuZWwvZXZlbnRzL2NvcmUuYwpAQCAtMTc1NywxMCArMTc1NywxNyBAQAogCSAqIElmIHRoaXMgd2FzIGEgZ3JvdXAgZXZlbnQgd2l0aCBzaWJsaW5nIGV2ZW50cyB0aGVuCiAJICogdXBncmFkZSB0aGUgc2libGluZ3MgdG8gc2luZ2xldG9uIGV2ZW50cyBieSBhZGRpbmcgdGhlbQogCSAqIHRvIHdoYXRldmVyIGxpc3Qgd2UgYXJlIG9uLgorCSAqIElmIHRoaXMgaXNuJ3Qgb24gYSBsaXN0LCBtYWtlIHN1cmUgd2Ugc3RpbGwgcmVtb3ZlIHRoZSBzaWJsaW5nJ3MKKwkgKiBncm91cF9lbnRyeSBmcm9tIHRoaXMgc2libGluZ19saXN0OyBvdGhlcndpc2UsIHdoZW4gdGhhdCBzaWJsaW5nCisJICogaXMgbGF0ZXIgZGVhbGxvY2F0ZWQsIGl0IHdpbGwgdHJ5IHRvIHJlbW92ZSBpdHNlbGYgZnJvbSB0aGlzCisJICogc2libGluZ19saXN0LCB3aGljaCBtYXkgd2VsbCBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQgYWxyZWFkeSwKKwkgKiByZXN1bHRpbmcgaW4gYSB1c2UtYWZ0ZXItZnJlZS4KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2libGluZywgdG1wLCAmZXZlbnQtPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKIAkJaWYgKGxpc3QpCiAJCQlsaXN0X21vdmVfdGFpbCgmc2libGluZy0+Z3JvdXBfZW50cnksIGxpc3QpOworCQllbHNlCisJCQlsaXN0X2RlbF9pbml0KCZzaWJsaW5nLT5ncm91cF9lbnRyeSk7CiAJCXNpYmxpbmctPmdyb3VwX2xlYWRlciA9IHNpYmxpbmc7CiAKIAkJLyogSW5oZXJpdCBncm91cCBmbGFncyBmcm9tIHRoZSBwcmV2aW91cyBsZWFkZXIgKi8KQEAgLTkyNDIsNiArOTI0OSw3IEBACiAJaWYgKCFncm91cF9sZWFkZXIpCiAJCWdyb3VwX2xlYWRlciA9IGV2ZW50OwogCisJbXV0ZXhfaW5pdCgmZXZlbnQtPmdyb3VwX2xlYWRlcl9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmZXZlbnQtPmNoaWxkX211dGV4KTsKIAlJTklUX0xJU1RfSEVBRCgmZXZlbnQtPmNoaWxkX2xpc3QpOwogCkBAIC05NzU1LDYgKzk3NjMsMTYgQEAKIAkJCWdyb3VwX2xlYWRlciA9IE5VTEw7CiAJfQogCisJLyoKKwkgKiBUYWtlIHRoZSBncm91cF9sZWFkZXIncyBncm91cF9sZWFkZXJfbXV0ZXggYmVmb3JlIG9ic2VydmluZworCSAqIGFueXRoaW5nIGluIHRoZSBncm91cCBsZWFkZXIgdGhhdCBsZWFkcyB0byBjaGFuZ2VzIGluIGN0eCwKKwkgKiBtYW55IG9mIHdoaWNoIG1heSBiZSBjaGFuZ2luZyBvbiBhbm90aGVyIHRocmVhZC4KKwkgKiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIHRha2UgdGhpcyBsb2NrIGJlZm9yZSBkZWNpZGluZworCSAqIHdoZXRoZXIgd2UgbmVlZCB0byBtb3ZlX2dyb3VwLgorCSAqLworCWlmIChncm91cF9sZWFkZXIpCisJCW11dGV4X2xvY2soJmdyb3VwX2xlYWRlci0+Z3JvdXBfbGVhZGVyX211dGV4KTsKKwogCWlmIChwaWQgIT0gLTEgJiYgIShmbGFncyAmIFBFUkZfRkxBR19QSURfQ0dST1VQKSkgewogCQl0YXNrID0gZmluZF9saXZlbHlfdGFza19ieV92cGlkKHBpZCk7CiAJCWlmIChJU19FUlIodGFzaykpIHsKQEAgLTk4NzYsMjggKzk4OTQsMjcgQEAKIAkJCWdvdG8gZXJyX2NvbnRleHQ7CiAKIAkJLyoKLQkJICogRG8gbm90IGFsbG93IHRvIGF0dGFjaCB0byBhIGdyb3VwIGluIGEgZGlmZmVyZW50Ci0JCSAqIHRhc2sgb3IgQ1BVIGNvbnRleHQ6CisJCSAqIE1ha2Ugc3VyZSB3ZSdyZSBib3RoIGV2ZW50cyBmb3IgdGhlIHNhbWUgQ1BVOworCQkgKiBncm91cGluZyBldmVudHMgZm9yIGRpZmZlcmVudCBDUFVzIGlzIGJyb2tlbjsgc2luY2UKKwkJICogeW91IGNhbiBuZXZlciBjb25jdXJyZW50bHkgc2NoZWR1bGUgdGhlbSBhbnlob3cuCiAJCSAqLwotCQlpZiAobW92ZV9ncm91cCkgewotCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB3ZSdyZSBib3RoIG9uIHRoZSBzYW1lIHRhc2ssIG9yIGJvdGgKLQkJCSAqIHBlci1jcHUgZXZlbnRzLgotCQkJICovCi0JCQlpZiAoZ3JvdXBfbGVhZGVyLT5jdHgtPnRhc2sgIT0gY3R4LT50YXNrKQotCQkJCWdvdG8gZXJyX2NvbnRleHQ7CisJCWlmIChncm91cF9sZWFkZXItPmNwdSAhPSBldmVudC0+Y3B1KQorCQkJZ290byBlcnJfY29udGV4dDsKIAotCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB3ZSdyZSBib3RoIGV2ZW50cyBmb3IgdGhlIHNhbWUgQ1BVOwotCQkJICogZ3JvdXBpbmcgZXZlbnRzIGZvciBkaWZmZXJlbnQgQ1BVcyBpcyBicm9rZW47IHNpbmNlCi0JCQkgKiB5b3UgY2FuIG5ldmVyIGNvbmN1cnJlbnRseSBzY2hlZHVsZSB0aGVtIGFueWhvdy4KLQkJCSAqLwotCQkJaWYgKGdyb3VwX2xlYWRlci0+Y3B1ICE9IGV2ZW50LT5jcHUpCi0JCQkJZ290byBlcnJfY29udGV4dDsKLQkJfSBlbHNlIHsKLQkJCWlmIChncm91cF9sZWFkZXItPmN0eCAhPSBjdHgpCi0JCQkJZ290byBlcnJfY29udGV4dDsKLQkJfQorCQkvKgorCQkgKiBNYWtlIHN1cmUgd2UncmUgYm90aCBvbiB0aGUgc2FtZSB0YXNrLCBvciBib3RoCisJCSAqIHBlci1DUFUgZXZlbnRzLgorCQkgKi8KKwkJaWYgKGdyb3VwX2xlYWRlci0+Y3R4LT50YXNrICE9IGN0eC0+dGFzaykKKwkJCWdvdG8gZXJyX2NvbnRleHQ7CisKKwkJLyoKKwkJICogRG8gbm90IGFsbG93IHRvIGF0dGFjaCB0byBhIGdyb3VwIGluIGEgZGlmZmVyZW50IHRhc2sKKwkJICogb3IgQ1BVIGNvbnRleHQuIElmIHdlJ3JlIG1vdmluZyBTVyBldmVudHMsIHdlJ2xsIGZpeAorCQkgKiB0aGlzIHVwIGxhdGVyLCBzbyBhbGxvdyB0aGF0LgorCQkgKi8KKwkJaWYgKCFtb3ZlX2dyb3VwICYmIGdyb3VwX2xlYWRlci0+Y3R4ICE9IGN0eCkKKwkJCWdvdG8gZXJyX2NvbnRleHQ7CiAKIAkJLyoKIAkJICogT25seSBhIGdyb3VwIGxlYWRlciBjYW4gYmUgZXhjbHVzaXZlIG9yIHBpbm5lZApAQCAtMTAwNDksNiArMTAwNjYsOCBAQAogCWlmIChtb3ZlX2dyb3VwKQogCQlwZXJmX2V2ZW50X2N0eF91bmxvY2soZ3JvdXBfbGVhZGVyLCBnY3R4KTsKIAltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOworCWlmIChncm91cF9sZWFkZXIpCisJCW11dGV4X3VubG9jaygmZ3JvdXBfbGVhZGVyLT5ncm91cF9sZWFkZXJfbXV0ZXgpOwogCiAJaWYgKHRhc2spIHsKIAkJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5zaWduYWwtPmNyZWRfZ3VhcmRfbXV0ZXgpOwpAQCAtMTAwOTYsNiArMTAxMTUsOCBAQAogCWlmICh0YXNrKQogCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CiBlcnJfZ3JvdXBfZmQ6CisJaWYgKGdyb3VwX2xlYWRlcikKKwkJbXV0ZXhfdW5sb2NrKCZncm91cF9sZWFkZXItPmdyb3VwX2xlYWRlcl9tdXRleCk7CiAJZmRwdXQoZ3JvdXApOwogZXJyX2ZkOgogCXB1dF91bnVzZWRfZmQoZXZlbnRfZmQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy91cHJvYmVzLmMgYi9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYwppbmRleCBmOWVjOWFkLi5hMWRlMDIxIDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYworKysgYi9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYwpAQCAtMTI1NCw4ICsxMjU0LDYgQEAKIAogdm9pZCB1cHJvYmVfZHVwX21tYXAoc3RydWN0IG1tX3N0cnVjdCAqb2xkbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm5ld21tKQogewotCW5ld21tLT51cHJvYmVzX3N0YXRlLnhvbF9hcmVhID0gTlVMTDsKLQogCWlmICh0ZXN0X2JpdChNTUZfSEFTX1VQUk9CRVMsICZvbGRtbS0+ZmxhZ3MpKSB7CiAJCXNldF9iaXQoTU1GX0hBU19VUFJPQkVTLCAmbmV3bW0tPmZsYWdzKTsKIAkJLyogdW5jb25kaXRpb25hbGx5LCBkdXBfbW1hcCgpIHNraXBzIFZNX0RPTlRDT1BZIHZtYXMgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDM5YzA3MDkuLjYxMGFkZWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtNzQ1LDYgKzc0NSwxMyBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkIG1tX2luaXRfdXByb2Jlc19zdGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKyNpZmRlZiBDT05GSUdfVVBST0JFUworCW1tLT51cHJvYmVzX3N0YXRlLnhvbF9hcmVhID0gTlVMTDsKKyNlbmRpZgorfQorCiBzdGF0aWMgc3RydWN0IG1tX3N0cnVjdCAqbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucykKIHsKQEAgLTc2NiwxMSArNzczLDEzIEBACiAJbW1faW5pdF9jcHVtYXNrKG1tKTsKIAltbV9pbml0X2FpbyhtbSk7CiAJbW1faW5pdF9vd25lcihtbSwgcCk7CisJUkNVX0lOSVRfUE9JTlRFUihtbS0+ZXhlX2ZpbGUsIE5VTEwpOwogCW1tdV9ub3RpZmllcl9tbV9pbml0KG1tKTsKIAljbGVhcl90bGJfZmx1c2hfcGVuZGluZyhtbSk7CiAjaWYgZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpICYmICFVU0VfU1BMSVRfUE1EX1BUTE9DS1MKIAltbS0+cG1kX2h1Z2VfcHRlID0gTlVMTDsKICNlbmRpZgorCW1tX2luaXRfdXByb2Jlc19zdGF0ZShtbSk7CiAKIAlpZiAoY3VycmVudC0+bW0pIHsKIAkJbW0tPmZsYWdzID0gY3VycmVudC0+bW0tPmZsYWdzICYgTU1GX0lOSVRfTUFTSzsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggNGM2YjZlNi4uODhiYWQ4NiAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTY2OCwxMyArNjY4LDE0IEBACiAJCSAqIHRoaXMgcmVmZXJlbmNlIHdhcyB0YWtlbiBieSBpaG9sZCB1bmRlciB0aGUgcGFnZSBsb2NrCiAJCSAqIHBpbm5pbmcgdGhlIGlub2RlIGluIHBsYWNlIHNvIGlfbG9jayB3YXMgdW5uZWNlc3NhcnkuIFRoZQogCQkgKiBvbmx5IHdheSBmb3IgdGhpcyBjaGVjayB0byBmYWlsIGlzIGlmIHRoZSBpbm9kZSB3YXMKLQkJICogdHJ1bmNhdGVkIGluIHBhcmFsbGVsIHNvIHdhcm4gZm9yIG5vdyBpZiB0aGlzIGhhcHBlbnMuCisJCSAqIHRydW5jYXRlZCBpbiBwYXJhbGxlbCB3aGljaCBpcyBhbG1vc3QgY2VydGFpbmx5IGFuCisJCSAqIGFwcGxpY2F0aW9uIGJ1Zy4gSW4gc3VjaCBhIGNhc2UsIGp1c3QgcmV0cnkuCiAJCSAqCiAJCSAqIFdlIGFyZSBub3QgY2FsbGluZyBpbnRvIGdldF9mdXRleF9rZXlfcmVmcygpIGluIGZpbGUtYmFja2VkCiAJCSAqIGNhc2VzLCB0aGVyZWZvcmUgYSBzdWNjZXNzZnVsIGF0b21pY19pbmMgcmV0dXJuIGJlbG93IHdpbGwKIAkJICogZ3VhcmFudGVlIHRoYXQgZ2V0X2Z1dGV4X2tleSgpIHdpbGwgc3RpbGwgaW1wbHkgc21wX21iKCk7IChCKS4KIAkJICovCi0JCWlmIChXQVJOX09OX09OQ0UoIWF0b21pY19pbmNfbm90X3plcm8oJmlub2RlLT5pX2NvdW50KSkpIHsKKwkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZpbm9kZS0+aV9jb3VudCkpIHsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcHV0X3BhZ2UocGFnZSk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9nY292L2Jhc2UuYyBiL2tlcm5lbC9nY292L2Jhc2UuYwppbmRleCAyZjlkZjM3Li5jNTFhNDljIDEwMDY0NAotLS0gYS9rZXJuZWwvZ2Nvdi9iYXNlLmMKKysrIGIva2VybmVsL2djb3YvYmFzZS5jCkBAIC05OCw2ICs5OCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChfX2djb3ZfbWVyZ2VfaWNhbGxfdG9wbik7CiAKK3ZvaWQgX19nY292X2V4aXQodm9pZCkKK3sKKwkvKiBVbnVzZWQuICovCit9CitFWFBPUlRfU1lNQk9MKF9fZ2Nvdl9leGl0KTsKKwogLyoqCiAgKiBnY292X2VuYWJsZV9ldmVudHMgLSBlbmFibGUgZXZlbnQgcmVwb3J0aW5nIHRocm91Z2ggZ2Nvdl9ldmVudCgpCiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL2djb3YvZ2NjXzRfNy5jIGIva2VybmVsL2djb3YvZ2NjXzRfNy5jCmluZGV4IDZhNWMyMzkuLjQ2YTE4ZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9nY292L2djY180XzcuYworKysgYi9rZXJuZWwvZ2Nvdi9nY2NfNF83LmMKQEAgLTE4LDcgKzE4LDkgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAiZ2Nvdi5oIgogCi0jaWYgKF9fR05VQ19fID4gNSkgfHwgKF9fR05VQ19fID09IDUgJiYgX19HTlVDX01JTk9SX18gPj0gMSkKKyNpZiAoX19HTlVDX18gPj0gNykKKyNkZWZpbmUgR0NPVl9DT1VOVEVSUwkJCTkKKyNlbGlmIChfX0dOVUNfXyA+IDUpIHx8IChfX0dOVUNfXyA9PSA1ICYmIF9fR05VQ19NSU5PUl9fID49IDEpCiAjZGVmaW5lIEdDT1ZfQ09VTlRFUlMJCQkxMAogI2VsaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5CiAjZGVmaW5lIEdDT1ZfQ09VTlRFUlMJCQk5CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDA3N2M4N2YuLmYzMDExMGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC04OTUsMTMgKzg5NSwxNSBAQAogCiB2b2lkIGlycV9tb2RpZnlfc3RhdHVzKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGxvbmcgY2xyLCB1bnNpZ25lZCBsb25nIHNldCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRyaWdnZXIsIHRtcDsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZ2V0X2Rlc2NfbG9jayhpcnEsICZmbGFncywgMCk7CiAKIAlpZiAoIWRlc2MpCiAJCXJldHVybjsKIAlpcnFfc2V0dGluZ3NfY2xyX2FuZF9zZXQoZGVzYywgY2xyLCBzZXQpOwogCisJdHJpZ2dlciA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZSgmZGVzYy0+aXJxX2RhdGEpOworCiAJaXJxZF9jbGVhcigmZGVzYy0+aXJxX2RhdGEsIElSUURfTk9fQkFMQU5DSU5HIHwgSVJRRF9QRVJfQ1BVIHwKIAkJICAgSVJRRF9UUklHR0VSX01BU0sgfCBJUlFEX0xFVkVMIHwgSVJRRF9NT1ZFX1BDTlRYVCk7CiAJaWYgKGlycV9zZXR0aW5nc19oYXNfbm9fYmFsYW5jZV9zZXQoZGVzYykpCkBAIC05MTMsNyArOTE1LDExIEBACiAJaWYgKGlycV9zZXR0aW5nc19pc19sZXZlbChkZXNjKSkKIAkJaXJxZF9zZXQoJmRlc2MtPmlycV9kYXRhLCBJUlFEX0xFVkVMKTsKIAotCWlycWRfc2V0KCZkZXNjLT5pcnFfZGF0YSwgaXJxX3NldHRpbmdzX2dldF90cmlnZ2VyX21hc2soZGVzYykpOworCXRtcCA9IGlycV9zZXR0aW5nc19nZXRfdHJpZ2dlcl9tYXNrKGRlc2MpOworCWlmICh0bXAgIT0gSVJRX1RZUEVfTk9ORSkKKwkJdHJpZ2dlciA9IHRtcDsKKworCWlycWRfc2V0KCZkZXNjLT5pcnFfZGF0YSwgdHJpZ2dlcik7CiAKIAlpcnFfcHV0X2Rlc2NfdW5sb2NrKGRlc2MsIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXBpLmMgYi9rZXJuZWwvaXJxL2lwaS5jCmluZGV4IDFhOWFiYzEuLjI1OWEyMmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXBpLmMKKysrIGIva2VybmVsL2lycS9pcGkuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOwogCXN0cnVjdCBjcHVtYXNrICppcGltYXNrID0gZGF0YSA/IGlycV9kYXRhX2dldF9hZmZpbml0eV9tYXNrKGRhdGEpIDogTlVMTDsKIAotCWlmICghZGF0YSB8fCAhaXBpbWFzayB8fCBjcHUgPiBucl9jcHVfaWRzKQorCWlmICghZGF0YSB8fCAhaXBpbWFzayB8fCBjcHUgPj0gbnJfY3B1X2lkcykKIAkJcmV0dXJuIElOVkFMSURfSFdJUlE7CiAKIAlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBpcGltYXNrKSkKQEAgLTE5NSw3ICsxOTUsNyBAQAogCWlmICghY2hpcC0+aXBpX3NlbmRfc2luZ2xlICYmICFjaGlwLT5pcGlfc2VuZF9tYXNrKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjcHUgPiBucl9jcHVfaWRzKQorCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoZGVzdCkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2tjb3YuYyBiL2tlcm5lbC9rY292LmMKaW5kZXggM2NiYjBjOC4uZjhmM2Y0YyAxMDA2NDQKLS0tIGEva2VybmVsL2tjb3YuYworKysgYi9rZXJuZWwva2Nvdi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9rY292Lmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKIC8qCiAgKiBrY292IGRlc2NyaXB0b3IgKG9uZSBwZXIgb3BlbmVkIGRlYnVnZnMgZmlsZSkuCkBAIC02OCw2ICs2OSwxMSBAQAogCWlmIChtb2RlID09IEtDT1ZfTU9ERV9UUkFDRSkgewogCQl1bnNpZ25lZCBsb25nICphcmVhOwogCQl1bnNpZ25lZCBsb25nIHBvczsKKwkJdW5zaWduZWQgbG9uZyBpcCA9IF9SRVRfSVBfOworCisjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCisJCWlwIC09IGthc2xyX29mZnNldCgpOworI2VuZGlmCiAKIAkJLyoKIAkJICogVGhlcmUgaXMgc29tZSBjb2RlIHRoYXQgcnVucyBpbiBpbnRlcnJ1cHRzIGJ1dCBmb3Igd2hpY2gKQEAgLTgxLDcgKzg3LDcgQEAKIAkJLyogVGhlIGZpcnN0IHdvcmQgaXMgbnVtYmVyIG9mIHN1YnNlcXVlbnQgUENzLiAqLwogCQlwb3MgPSBSRUFEX09OQ0UoYXJlYVswXSkgKyAxOwogCQlpZiAobGlrZWx5KHBvcyA8IHQtPmtjb3Zfc2l6ZSkpIHsKLQkJCWFyZWFbcG9zXSA9IF9SRVRfSVBfOworCQkJYXJlYVtwb3NdID0gaXA7CiAJCQlXUklURV9PTkNFKGFyZWFbMF0sIHBvcyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9sb2NrdG9ydHVyZS5jIGIva2VybmVsL2xvY2tpbmcvbG9ja3RvcnR1cmUuYwppbmRleCBmOGM1YWY1Li5kM2RlMDRiIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9sb2NrdG9ydHVyZS5jCisrKyBiL2tlcm5lbC9sb2NraW5nL2xvY2t0b3J0dXJlLmMKQEAgLTc4MCw2ICs3ODAsMTAgQEAKIAllbHNlCiAJCWxvY2tfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoY3h0LmN1cl9vcHMsCiAJCQkJCQkiRW5kIG9mIHRlc3Q6IFNVQ0NFU1MiKTsKKworCWtmcmVlKGN4dC5sd3NhKTsKKwlrZnJlZShjeHQubHJzYSk7CisKIGVuZDoKIAl0b3J0dXJlX2NsZWFudXBfZW5kKCk7CiB9CkBAIC05MjQsNiArOTI4LDggQEAKIAkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZWFkZXJfdGFza3MgPT0gTlVMTCkgewogCQkJVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKCJyZWFkZXJfdGFza3M6IE91dCBvZiBtZW1vcnkiKTsKKwkJCWtmcmVlKHdyaXRlcl90YXNrcyk7CisJCQl3cml0ZXJfdGFza3MgPSBOVUxMOwogCQkJZmlyc3RlcnIgPSAtRU5PTUVNOwogCQkJZ290byB1bndpbmQ7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9wYW5pYy5jIGIva2VybmVsL3BhbmljLmMKaW5kZXggZGJlYzM4Ny4uZmNjODc4NiAxMDA2NDQKLS0tIGEva2VybmVsL3BhbmljLmMKKysrIGIva2VybmVsL3BhbmljLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXhjZXB0aW9uLmg+CiAKICNkZWZpbmUgUEFOSUNfVElNRVJfU1RFUCAxMDAKICNkZWZpbmUgUEFOSUNfQkxJTktfU1BEIDE4CkBAIC0xMzYsNiArMTM4LDggQEAKIAlpbnQgb2xkX2NwdSwgdGhpc19jcHU7CiAJYm9vbCBfY3Jhc2hfa2V4ZWNfcG9zdF9ub3RpZmllcnMgPSBjcmFzaF9rZXhlY19wb3N0X25vdGlmaWVyczsKIAorCXRyYWNlX2tlcm5lbF9wYW5pYygwKTsKKwogCS8qCiAJICogRGlzYWJsZSBsb2NhbCBpbnRlcnJ1cHRzLiBUaGlzIHdpbGwgcHJldmVudCBwYW5pY19zbXBfc2VsZl9zdG9wCiAJICogZnJvbSBkZWFkbG9ja2luZyB0aGUgZmlyc3QgY3B1IHRoYXQgaW52b2tlcyB0aGUgcGFuaWMsIHNpbmNlCkBAIC0yNjAsNiArMjY0LDkgQEAKIAkJCW1kZWxheShQQU5JQ19USU1FUl9TVEVQKTsKIAkJfQogCX0KKworCXRyYWNlX2tlcm5lbF9wYW5pY19sYXRlKDApOworCiAJaWYgKHBhbmljX3RpbWVvdXQgIT0gMCkgewogCQkvKgogCQkgKiBUaGlzIHdpbGwgbm90IGJlIGEgY2xlYW4gcmVib290LCB3aXRoIGV2ZXJ5dGhpbmcKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jb3JlLmMgYi9rZXJuZWwvc2NoZWQvY29yZS5jCmluZGV4IGE4MzZhZDYuLmQ0M2FkNjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jb3JlLmMKKysrIGIva2VybmVsL3NjaGVkL2NvcmUuYwpAQCAtMzIzMiwyMCArMzIzMiwyMSBAQAogCiBzdGF0aWMgaW5saW5lCiB1bnNpZ25lZCBsb25nIHN1bV9jYXBhY2l0eV9yZXFzKHVuc2lnbmVkIGxvbmcgY2ZzX2NhcCwKLQkJCQlzdHJ1Y3Qgc2NoZWRfY2FwYWNpdHlfcmVxcyAqc2NyKQorCQkJCXN0cnVjdCBzY2hlZF9jYXBhY2l0eV9yZXFzICpzY3IsIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbCA9IGFkZF9jYXBhY2l0eV9tYXJnaW4oY2ZzX2NhcCArIHNjci0+cnQpOworCXVuc2lnbmVkIGxvbmcgdG90YWwgPSBhZGRfY2FwYWNpdHlfbWFyZ2luKGNmc19jYXAgKyBzY3ItPnJ0LCBjcHUpOwogCXJldHVybiB0b3RhbCArPSBzY3ItPmRsOwogfQogCit1bnNpZ25lZCBsb25nIGJvb3N0ZWRfY3B1X3V0aWwoaW50IGNwdSk7CiBzdGF0aWMgdm9pZCBzY2hlZF9mcmVxX3RpY2tfcGVsdChpbnQgY3B1KQogewotCXVuc2lnbmVkIGxvbmcgY3B1X3V0aWxpemF0aW9uID0gY2FwYWNpdHlfbWF4OworCXVuc2lnbmVkIGxvbmcgY3B1X3V0aWxpemF0aW9uID0gYm9vc3RlZF9jcHVfdXRpbChjcHUpOwogCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHlfY3VyciA9IGNhcGFjaXR5X2N1cnJfb2YoY3B1KTsKIAlzdHJ1Y3Qgc2NoZWRfY2FwYWNpdHlfcmVxcyAqc2NyOwogCiAJc2NyID0gJnBlcl9jcHUoY3B1X3NjaGVkX2NhcGFjaXR5X3JlcXMsIGNwdSk7Ci0JaWYgKHN1bV9jYXBhY2l0eV9yZXFzKGNwdV91dGlsaXphdGlvbiwgc2NyKSA8IGNhcGFjaXR5X2N1cnIpCisJaWYgKHN1bV9jYXBhY2l0eV9yZXFzKGNwdV91dGlsaXphdGlvbiwgc2NyLCBjcHUpIDwgY2FwYWNpdHlfY3VycikKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTMzMDQsNiArMzMwNSw3IEBACiAJYm9vbCBlYXJseV9ub3RpZjsKIAl1MzIgb2xkX2xvYWQ7CiAJc3RydWN0IHJlbGF0ZWRfdGhyZWFkX2dyb3VwICpncnA7CisJdW5zaWduZWQgaW50IGZsYWcgPSAwOwogCiAJc2NoZWRfY2xvY2tfdGljaygpOwogCkBAIC0zMzIwLDEwICszMzIyLDEyIEBACiAJY3B1X2xvYWRfdXBkYXRlX2FjdGl2ZShycSk7CiAJY2FsY19nbG9iYWxfbG9hZF90aWNrKHJxKTsKIAlzY2hlZF9mcmVxX3RpY2soY3B1KTsKLQljcHVmcmVxX3VwZGF0ZV91dGlsKHJxLCAwKTsKIAogCWVhcmx5X25vdGlmID0gZWFybHlfZGV0ZWN0aW9uX25vdGlmeShycSwgd2FsbGNsb2NrKTsKKwlpZiAoZWFybHlfbm90aWYpCisJCWZsYWcgPSBTQ0hFRF9DUFVGUkVRX1dBTFQgfCBTQ0hFRF9DUFVGUkVRX0VBUkxZX0RFVDsKIAorCWNwdWZyZXFfdXBkYXRlX3V0aWwocnEsIGZsYWcpOwogCXJhd19zcGluX3VubG9jaygmcnEtPmxvY2spOwogCiAJaWYgKGVhcmx5X25vdGlmKQpAQCAtNjIyMiw5ICs2MjI2LDYgQEAKIAogCWlmICghKHNkLT5mbGFncyAmIFNEX0xPQURfQkFMQU5DRSkpIHsKIAkJcHJpbnRrKCJkb2VzIG5vdCBsb2FkLWJhbGFuY2VcbiIpOwotCQlpZiAoc2QtPnBhcmVudCkKLQkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6ICFTRF9MT0FEX0JBTEFOQ0UgZG9tYWluIgotCQkJCQkiIGhhcyBwYXJlbnQiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjMxOSw4ICs2MzIwLDEyIEBACiAKIHN0YXRpYyBpbnQgc2RfZGVnZW5lcmF0ZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlpZiAoY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSA9PSAxKQotCQlyZXR1cm4gMTsKKwlpZiAoY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSA9PSAxKSB7CisJCWlmIChzZC0+Z3JvdXBzLT5zZ2UpCisJCQlzZC0+ZmxhZ3MgJj0gflNEX0xPQURfQkFMQU5DRTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQogCiAJLyogRm9sbG93aW5nIGZsYWdzIG5lZWQgYXQgbGVhc3QgMiBncm91cHMgKi8KIAlpZiAoc2QtPmZsYWdzICYgKFNEX0xPQURfQkFMQU5DRSB8CkBAIC02MzY2LDYgKzYzNzEsMTAgQEAKIAkJCQlTRF9QUkVGRVJfU0lCTElORyB8CiAJCQkJU0RfU0hBUkVfUE9XRVJET01BSU4gfAogCQkJCVNEX1NIQVJFX0NBUF9TVEFURVMpOworCQlpZiAocGFyZW50LT5ncm91cHMtPnNnZSkgeworCQkJcGFyZW50LT5mbGFncyAmPSB+U0RfTE9BRF9CQUxBTkNFOworCQkJcmV0dXJuIDA7CisJCX0KIAkJaWYgKG5yX25vZGVfaWRzID09IDEpCiAJCQlwZmxhZ3MgJj0gflNEX1NFUklBTElaRTsKIAl9CkBAIC02NDQ2LDYgKzY0NTUsOSBAQAogCQlnb3RvIGZyZWVfcnRvX21hc2s7CiAKIAlpbml0X21heF9jcHVfY2FwYWNpdHkoJnJkLT5tYXhfY3B1X2NhcGFjaXR5KTsKKworCXJkLT5tYXhfY2FwX29yaWdfY3B1ID0gcmQtPm1pbl9jYXBfb3JpZ19jcHUgPSAtMTsKKwogCXJldHVybiAwOwogCiBmcmVlX3J0b19tYXNrOgpAQCAtNjc5MCw2ICs2ODAyLDcgQEAKIAkJICovCiAJCXNnLT5zZ2MtPmNhcGFjaXR5ID0gU0NIRURfQ0FQQUNJVFlfU0NBTEUgKiBjcHVtYXNrX3dlaWdodChzZ19zcGFuKTsKIAkJc2ctPnNnYy0+bWF4X2NhcGFjaXR5ID0gU0NIRURfQ0FQQUNJVFlfU0NBTEU7CisJCXNnLT5zZ2MtPm1pbl9jYXBhY2l0eSA9IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB0aGUgZmlyc3QgZ3JvdXAgb2YgdGhpcyBkb21haW4gY29udGFpbnMgdGhlCkBAIC03NjY4LDcgKzc2ODEsNiBAQAogCWVudW0gc19hbGxvYyBhbGxvY19zdGF0ZTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAlzdHJ1Y3Qgc19kYXRhIGQ7Ci0Jc3RydWN0IHJxICpycSA9IE5VTEw7CiAJaW50IGksIHJldCA9IC1FTk9NRU07CiAKIAlhbGxvY19zdGF0ZSA9IF9fdmlzaXRfZG9tYWluX2FsbG9jYXRpb25faGVsbCgmZCwgY3B1X21hcCk7CkBAIC03Njg2LDggKzc2OTgsNiBAQAogCQkJCSpwZXJfY3B1X3B0cihkLnNkLCBpKSA9IHNkOwogCQkJaWYgKHRsLT5mbGFncyAmIFNEVExfT1ZFUkxBUCB8fCBzY2hlZF9mZWF0KEZPUkNFX1NEX09WRVJMQVApKQogCQkJCXNkLT5mbGFncyB8PSBTRF9PVkVSTEFQOwotCQkJaWYgKGNwdW1hc2tfZXF1YWwoY3B1X21hcCwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkKLQkJCQlicmVhazsKIAkJfQogCX0KIApAQCAtNzcyMiw4ICs3NzMyLDE5IEBACiAJLyogQXR0YWNoIHRoZSBkb21haW5zICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7Ci0JCXJxID0gY3B1X3JxKGkpOworCQlpbnQgbWF4X2NwdSA9IFJFQURfT05DRShkLnJkLT5tYXhfY2FwX29yaWdfY3B1KTsKKwkJaW50IG1pbl9jcHUgPSBSRUFEX09OQ0UoZC5yZC0+bWluX2NhcF9vcmlnX2NwdSk7CisKKwkJaWYgKChtYXhfY3B1IDwgMCkgfHwgKGNwdV9ycShpKS0+Y3B1X2NhcGFjaXR5X29yaWcgPgorCQkgICAgY3B1X3JxKG1heF9jcHUpLT5jcHVfY2FwYWNpdHlfb3JpZykpCisJCQlXUklURV9PTkNFKGQucmQtPm1heF9jYXBfb3JpZ19jcHUsIGkpOworCisJCWlmICgobWluX2NwdSA8IDApIHx8IChjcHVfcnEoaSktPmNwdV9jYXBhY2l0eV9vcmlnIDwKKwkJICAgIGNwdV9ycShtaW5fY3B1KS0+Y3B1X2NhcGFjaXR5X29yaWcpKQorCQkJV1JJVEVfT05DRShkLnJkLT5taW5fY2FwX29yaWdfY3B1LCBpKTsKKwogCQlzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsKKwogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgZC5yZCwgaSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtODI2MCw2ICs4MjgxLDcgQEAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCQlyb290X3Rhc2tfZ3JvdXAuc2hhcmVzID0gUk9PVF9UQVNLX0dST1VQX0xPQUQ7CiAJCUlOSVRfTElTVF9IRUFEKCZycS0+bGVhZl9jZnNfcnFfbGlzdCk7CisJCXJxLT50bXBfYWxvbmVfYnJhbmNoID0gJnJxLT5sZWFmX2Nmc19ycV9saXN0OwogCQkvKgogCQkgKiBIb3cgbXVjaCBjcHUgYmFuZHdpZHRoIGRvZXMgcm9vdF90YXNrX2dyb3VwIGdldD8KIAkJICoKQEAgLTkwODEsMTEgKzkxMDMsMjAgQEAKIAlpZiAoSVNfRVJSKHRnKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlzY2hlZF9vbmxpbmVfZ3JvdXAodGcsIHBhcmVudCk7Ci0KIAlyZXR1cm4gJnRnLT5jc3M7CiB9CiAKKy8qIEV4cG9zZSB0YXNrIGdyb3VwIG9ubHkgYWZ0ZXIgY29tcGxldGluZyBjZ3JvdXAgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyBpbnQgY3B1X2Nncm91cF9jc3Nfb25saW5lKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCit7CisJc3RydWN0IHRhc2tfZ3JvdXAgKnRnID0gY3NzX3RnKGNzcyk7CisJc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCA9IGNzc190Zyhjc3MtPnBhcmVudCk7CisKKwlpZiAocGFyZW50KQorCQlzY2hlZF9vbmxpbmVfZ3JvdXAodGcsIHBhcmVudCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGNwdV9jZ3JvdXBfY3NzX3JlbGVhc2VkKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCiB7CiAJc3RydWN0IHRhc2tfZ3JvdXAgKnRnID0gY3NzX3RnKGNzcyk7CkBAIC05NDg4LDYgKzk1MTksNyBAQAogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBjcHVfY2dycF9zdWJzeXMgPSB7CiAJLmNzc19hbGxvYwk9IGNwdV9jZ3JvdXBfY3NzX2FsbG9jLAorCS5jc3Nfb25saW5lCT0gY3B1X2Nncm91cF9jc3Nfb25saW5lLAogCS5jc3NfcmVsZWFzZWQJPSBjcHVfY2dyb3VwX2Nzc19yZWxlYXNlZCwKIAkuY3NzX2ZyZWUJPSBjcHVfY2dyb3VwX2Nzc19mcmVlLAogCS5mb3JrCQk9IGNwdV9jZ3JvdXBfZm9yaywKQEAgLTk1OTEsNCArOTYyMyw1MSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9XQUxUICovCiAKLV9fcmVhZF9tb3N0bHkgYm9vbCBzY2hlZF9wcmVkbDsKK19fcmVhZF9tb3N0bHkgYm9vbCBzY2hlZF9wcmVkbCA9IDE7CisKKyNpZmRlZiBDT05GSUdfU0NIRURfQ09SRV9ST1RBVEUKK2ludAorZmluZF9maXJzdF9jcHVfYml0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY29uc3QgY3B1bWFza190ICpzZWFyY2hfY3B1cywKKwkJICAgc3RydWN0IHNjaGVkX2dyb3VwICpzZ190YXJnZXQsIGJvb2wgKmF2b2lkX3ByZXZfY3B1LAorCQkgICBib29sICpkb19yb3RhdGUsIHN0cnVjdCBmaW5kX2ZpcnN0X2NwdV9iaXRfZW52ICplbnYpCit7CisJaW50IGkgPSAtMTsKKwl1bnNpZ25lZCBsb25nIG1jYzsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJbWNjID0gY3B1X3JxKGNwdSktPnJkLT5tYXhfY3B1X2NhcGFjaXR5LnZhbDsKKworCS8qIGRvIHJvdGF0aW9uIG9ubHkgZm9yIGJpZyBDUFVzLiAqLworCSpkb19yb3RhdGUgPSAoY3B1bWFza19maXJzdChzZWFyY2hfY3B1cykgPCBucl9jcHVfaWRzICYmCisJCSAgICAgY2FwYWNpdHlfb3JpZ19vZihjcHVtYXNrX2ZpcnN0KHNlYXJjaF9jcHVzKSkgPT0gbWNjKTsKKworCWlmICgqZG9fcm90YXRlKSB7CisJCWlmICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCAqZW52LT5hdm9pZF9wcmV2X2NwdV9sYXN0ICsKKwkJCQkgICBlbnYtPmludGVydmFsKSkKKwkJCXJldHVybiAqZW52LT5yb3RhdGVfY3B1X3N0YXJ0OworCisJCXNwaW5fbG9jayhlbnYtPnJvdGF0ZV9sb2NrKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgKmVudi0+YXZvaWRfcHJldl9jcHVfbGFzdCArCisJCQkJCWVudi0+aW50ZXJ2YWwpKSB7CisJCQljcHVtYXNrX3QgdG1wbWFzazsKKworCQkJKmVudi0+YXZvaWRfcHJldl9jcHVfbGFzdCA9IGppZmZpZXM7CisJCQkqYXZvaWRfcHJldl9jcHUgPSB0cnVlOworCisJCQljcHVtYXNrX2NvcHkoJnRtcG1hc2ssIHNjaGVkX2dyb3VwX2NwdXMoc2dfdGFyZ2V0KSk7CisJCQljcHVtYXNrX2FuZG5vdCgmdG1wbWFzaywgJnRtcG1hc2ssIGNwdV9pc29sYXRlZF9tYXNrKTsKKworCQkJaSA9IGNwdW1hc2tfbmV4dCgqZW52LT5yb3RhdGVfY3B1X3N0YXJ0LCAmdG1wbWFzayk7CisJCQlpZiAoaSA+PSBucl9jcHVfaWRzKQorCQkJCWkgPSBjcHVtYXNrX2ZpcnN0KCZ0bXBtYXNrKSAtIDE7CisJCQkvKiBDaGFuZ2Ugc3RhcnQgQ1BVIGV2ZXJ5IGludGVydmFsLiAqLworCQkJKmVudi0+cm90YXRlX2NwdV9zdGFydCA9IGk7CisJCX0gZWxzZSB7CisJCQlpID0gKmVudi0+cm90YXRlX2NwdV9zdGFydDsKKwkJfQorCQlzcGluX3VubG9jayhlbnYtPnJvdGF0ZV9sb2NrKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NvcmVfY3RsLmMgYi9rZXJuZWwvc2NoZWQvY29yZV9jdGwuYwppbmRleCBlNTZhZjQxLi43NzJkOTdiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZV9jdGwuYworKysgYi9rZXJuZWwvc2NoZWQvY29yZV9jdGwuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgogCkBAIC0zNSw2ICszNiwxMCBAQAogCXVuc2lnbmVkIGludCBhY3RpdmVfY3B1czsKIAl1bnNpZ25lZCBpbnQgbnVtX2NwdXM7CiAJdW5zaWduZWQgaW50IG5yX2lzb2xhdGVkX2NwdXM7CisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCisJdW5zaWduZWQgbG9uZyBzZXRfbWF4OworCXVuc2lnbmVkIGxvbmcgc2V0X2N1cjsKKyNlbmRpZgogCWNwdW1hc2tfdCBjcHVfbWFzazsKIAl1bnNpZ25lZCBpbnQgbmVlZF9jcHVzOwogCXVuc2lnbmVkIGludCB0YXNrX3RocmVzOwpAQCAtNzYsNiArODEsNyBAQAogc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2FjdGl2ZV9jcHVfY291bnQoY29uc3Qgc3RydWN0IGNsdXN0ZXJfZGF0YSAqY2x1c3Rlcik7CitzdGF0aWMgdm9pZCBjcHVzZXRfbmV4dChzdHJ1Y3QgY2x1c3Rlcl9kYXRhICpjbHVzdGVyKTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBzeXNmcyBpbnRlcmZhY2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKQEAgLTg4LDYgKzk0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzdGF0ZS0+bWluX2NwdXMgPSBtaW4odmFsLCBzdGF0ZS0+bWF4X2NwdXMpOworCWNwdXNldF9uZXh0KHN0YXRlKTsKIAl3YWtlX3VwX2NvcmVfY3RsX3RocmVhZChzdGF0ZSk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xMDksNiArMTE2LDcgQEAKIAl2YWwgPSBtaW4odmFsLCBzdGF0ZS0+bnVtX2NwdXMpOwogCXN0YXRlLT5tYXhfY3B1cyA9IHZhbDsKIAlzdGF0ZS0+bWluX2NwdXMgPSBtaW4oc3RhdGUtPm1pbl9jcHVzLCBzdGF0ZS0+bWF4X2NwdXMpOworCWNwdXNldF9uZXh0KHN0YXRlKTsKIAl3YWtlX3VwX2NvcmVfY3RsX3RocmVhZChzdGF0ZSk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC03MDIsNiArNzEwLDY3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGVfbG9jaywgZmxhZ3MpOwogfQogCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCitzdGF0aWMgdm9pZCBjcHVzZXRfbmV4dChzdHJ1Y3QgY2x1c3Rlcl9kYXRhICpjbHVzdGVyKQoreworCWludCBjcHVzX25lZWRlZCA9IGNsdXN0ZXItPm51bV9jcHVzIC0gY2x1c3Rlci0+bWluX2NwdXM7CisKKwljbHVzdGVyLT5zZXRfY3VyKys7CisJY2x1c3Rlci0+c2V0X2N1ciA9IG1pbihjbHVzdGVyLT5zZXRfY3VyLCBjbHVzdGVyLT5zZXRfbWF4KTsKKworCS8qCisJICogVGhpcyBsb29wIGdlbmVyYXRlcyBiaXQgc2V0cyBmcm9tIDAgdG8gcG93KG51bV9jcHVzLCAyKSAtIDEuCisJICogV2Ugc3RhcnQgbG9vcCBmcm9tIHNldF9jdXIgdG8gc2V0X2N1ciAtIDEgYW5kIGJyZWFrIHdoZW4gd2VpZ2h0IG9mCisJICogc2V0X2N1ciBlcXVhbHMgdG8gY3B1c19uZWVkZWQuCisJICovCisKKwl3aGlsZSAoMSkgeworCQlpZiAoYml0bWFwX3dlaWdodCgmY2x1c3Rlci0+c2V0X2N1ciwgQklUU19QRVJfTE9ORykgPT0KKwkJICAgIGNwdXNfbmVlZGVkKSB7CisJCQlicmVhazsKKwkJfQorCQljbHVzdGVyLT5zZXRfY3VyKys7CisJCWNsdXN0ZXItPnNldF9jdXIgPSBtaW4oY2x1c3Rlci0+c2V0X2N1ciwgY2x1c3Rlci0+c2V0X21heCk7CisJCWlmIChjbHVzdGVyLT5zZXRfY3VyID09IGNsdXN0ZXItPnNldF9tYXgpCisJCQkvKiByb2xsIG92ZXIgKi8KKwkJCWNsdXN0ZXItPnNldF9jdXIgPSAwOworCX07CisKKwlwcl9kZWJ1ZygiZmlyc3RfY3B1PSVkIGNwdXNfbmVlZGVkPSVkIHNldF9jdXI9MHglbHhcbiIsCisJCSBjbHVzdGVyLT5maXJzdF9jcHUsIGNwdXNfbmVlZGVkLCBjbHVzdGVyLT5zZXRfY3VyKTsKK30KKworc3RhdGljIGJvb2wgc2hvdWxkX3dlX2lzb2xhdGUoaW50IGNwdSwgc3RydWN0IGNsdXN0ZXJfZGF0YSAqY2x1c3RlcikKK3sKKwkvKiBjcHUgc2hvdWxkIGJlIHBhcnQgb2YgY2x1c3RlciAqLworCXJldHVybiAhIShjbHVzdGVyLT5zZXRfY3VyICYgKDEgPDwgKGNwdSAtIGNsdXN0ZXItPmZpcnN0X2NwdSkpKTsKK30KKworc3RhdGljIHZvaWQgY29yZV9jdGxfcmVzdW1lKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGkgPSAwOworCXN0cnVjdCBjbHVzdGVyX2RhdGEgKmNsdXN0ZXI7CisKKwkvKiBtb3ZlIHRvIG5leHQgaXNvbGF0aW9uIGNwdSBzZXQgKi8KKwlmb3JfZWFjaF9jbHVzdGVyKGNsdXN0ZXIsIGkpCisJCWNwdXNldF9uZXh0KGNsdXN0ZXIpOworfQorCitzdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIGNvcmVfY3RsX3N5c2NvcmVfb3BzID0geworCS5yZXN1bWUJPSBjb3JlX2N0bF9yZXN1bWUsCit9OworCisjZWxzZQorCitzdGF0aWMgdm9pZCBjcHVzZXRfbmV4dChzdHJ1Y3QgY2x1c3Rlcl9kYXRhICpjbHVzdGVyKSB7IH0KKworc3RhdGljIGJvb2wgc2hvdWxkX3dlX2lzb2xhdGUoaW50IGNwdSwgc3RydWN0IGNsdXN0ZXJfZGF0YSAqY2x1c3RlcikKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKIHN0YXRpYyB2b2lkIHRyeV90b19pc29sYXRlKHN0cnVjdCBjbHVzdGVyX2RhdGEgKmNsdXN0ZXIsIHVuc2lnbmVkIGludCBuZWVkKQogewogCXN0cnVjdCBjcHVfZGF0YSAqYywgKnRtcDsKQEAgLTcyNiw2ICs3OTUsOSBAQAogCQlpZiAoYy0+aXNfYnVzeSkKIAkJCWNvbnRpbnVlOwogCisJCWlmICghc2hvdWxkX3dlX2lzb2xhdGUoYy0+Y3B1LCBjbHVzdGVyKSkKKwkJCWNvbnRpbnVlOworCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlX2xvY2ssIGZsYWdzKTsKIAogCQlwcl9kZWJ1ZygiVHJ5aW5nIHRvIGlzb2xhdGUgQ1BVJXVcbiIsIGMtPmNwdSk7CkBAIC0xMDI5LDYgKzExMDEsMTEgQEAKIAljbHVzdGVyLT5vZmZsaW5lX2RlbGF5X21zID0gMTAwOwogCWNsdXN0ZXItPnRhc2tfdGhyZXMgPSBVSU5UX01BWDsKIAljbHVzdGVyLT5ucnJ1biA9IGNsdXN0ZXItPm51bV9jcHVzOworI2lmZGVmIENPTkZJR19TQ0hFRF9DT1JFX1JPVEFURQorCWNsdXN0ZXItPnNldF9tYXggPSBjbHVzdGVyLT5udW1fY3B1cyAqIGNsdXN0ZXItPm51bV9jcHVzOworCS8qIGJ5IGRlZmF1bHQgbWFyayBhbGwgY3B1cyBhcyBlbGlnaWJsZSAqLworCWNsdXN0ZXItPnNldF9jdXIgPSBjbHVzdGVyLT5zZXRfbWF4IC0gMTsKKyNlbmRpZgogCWNsdXN0ZXItPmVuYWJsZSA9IHRydWU7CiAJSU5JVF9MSVNUX0hFQUQoJmNsdXN0ZXItPmxydSk7CiAJc3Bpbl9sb2NrX2luaXQoJmNsdXN0ZXItPnBlbmRpbmdfbG9jayk7CkBAIC0xMDY1LDYgKzExNDIsMTAgQEAKIAlpZiAoc2hvdWxkX3NraXAoY3B1X3Bvc3NpYmxlX21hc2spKQogCQlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19TQ0hFRF9DT1JFX1JPVEFURQorCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZjb3JlX2N0bF9zeXNjb3JlX29wcyk7CisjZW5kaWYKKwogCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKIAkJCSJjb3JlX2N0bC9pc29sYXRpb246b25saW5lIiwKIAkJCWNvcmVfY3RsX2lzb2xhdGlvbl9vbmxpbmVfY3B1LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZC5jCmluZGV4IDExYjc1ZTMuLjg0M2VhYTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdWZyZXFfc2NoZWQuYwpAQCAtMzIsNiArMzIsMTIgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBlbmFibGVkKTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9jYXBhY2l0eV9yZXFzLCBjcHVfc2NoZWRfY2FwYWNpdHlfcmVxcyk7CiAKK3N0cnVjdCBnb3ZfdHVuYWJsZXMgeworCXN0cnVjdCBnb3ZfYXR0cl9zZXQgYXR0cl9zZXQ7CisJdW5zaWduZWQgaW50IHVwX3Rocm90dGxlX25zZWM7CisJdW5zaWduZWQgaW50IGRvd25fdGhyb3R0bGVfbnNlYzsKK307CisKIC8qKgogICogZ292X2RhdGEgLSBwZXItcG9saWN5IGRhdGEgaW50ZXJuYWwgdG8gdGhlIGdvdmVybm9yCiAgKiBAdXBfdGhyb3R0bGU6IG5leHQgdGhyb3R0bGluZyBwZXJpb2QgZXhwaXJ5IGlmIGluY3JlYXNpbmcgT1BQCkBAIC01Myw4ICs1OSw4IEBACiBzdHJ1Y3QgZ292X2RhdGEgewogCWt0aW1lX3QgdXBfdGhyb3R0bGU7CiAJa3RpbWVfdCBkb3duX3Rocm90dGxlOwotCXVuc2lnbmVkIGludCB1cF90aHJvdHRsZV9uc2VjOwotCXVuc2lnbmVkIGludCBkb3duX3Rocm90dGxlX25zZWM7CisJc3RydWN0IGdvdl90dW5hYmxlcyAqdHVuYWJsZXM7CisJc3RydWN0IGxpc3RfaGVhZCB0dW5hYmxlc19ob29rOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAlzdHJ1Y3QgaXJxX3dvcmsgaXJxX3dvcms7CiAJdW5zaWduZWQgaW50IHJlcXVlc3RlZF9mcmVxOwpAQCAtNzEsOCArNzcsMTAgQEAKIAogCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgZnJlcSwgQ1BVRlJFUV9SRUxBVElPTl9MKTsKIAotCWdkLT51cF90aHJvdHRsZSA9IGt0aW1lX2FkZF9ucyhrdGltZV9nZXQoKSwgZ2QtPnVwX3Rocm90dGxlX25zZWMpOwotCWdkLT5kb3duX3Rocm90dGxlID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCBnZC0+ZG93bl90aHJvdHRsZV9uc2VjKTsKKwlnZC0+dXBfdGhyb3R0bGUgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksCisJCQkJICAgICAgIGdkLT50dW5hYmxlcy0+dXBfdGhyb3R0bGVfbnNlYyk7CisJZ2QtPmRvd25fdGhyb3R0bGUgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksCisJCQkJCSBnZC0+dHVuYWJsZXMtPmRvd25fdGhyb3R0bGVfbnNlYyk7CiAJdXBfd3JpdGUoJnBvbGljeS0+cndzZW0pOwogfQogCkBAIC0yNjMsMTIgKzI3MSw3MCBAQAogCXN0YXRpY19rZXlfc2xvd19kZWMoJl9fc2NoZWRfZnJlcSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjaGVkX2F0dHJfZ3JvdXBfZ292X3BvbDsKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpnZXRfc3lzZnNfYXR0cih2b2lkKQorLyogVHVuYWJsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZ292X3R1bmFibGVzICpnbG9iYWxfdHVuYWJsZXM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdvdl90dW5hYmxlcyAqdG9fdHVuYWJsZXMoc3RydWN0IGdvdl9hdHRyX3NldCAqYXR0cl9zZXQpCiB7Ci0JcmV0dXJuICZzY2hlZF9hdHRyX2dyb3VwX2dvdl9wb2w7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihhdHRyX3NldCwgc3RydWN0IGdvdl90dW5hYmxlcywgYXR0cl9zZXQpOwogfQogCitzdGF0aWMgc3NpemVfdCB1cF90aHJvdHRsZV9uc2VjX3Nob3coc3RydWN0IGdvdl9hdHRyX3NldCAqYXR0cl9zZXQsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ292X3R1bmFibGVzICp0dW5hYmxlcyA9IHRvX3R1bmFibGVzKGF0dHJfc2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB0dW5hYmxlcy0+dXBfdGhyb3R0bGVfbnNlYyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHVwX3Rocm90dGxlX25zZWNfc3RvcmUoc3RydWN0IGdvdl9hdHRyX3NldCAqYXR0cl9zZXQsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGdvdl90dW5hYmxlcyAqdHVuYWJsZXMgPSB0b190dW5hYmxlcyhhdHRyX3NldCk7CisJaW50IHJldDsKKwlsb25nIHVuc2lnbmVkIGludCB2YWw7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXR1bmFibGVzLT51cF90aHJvdHRsZV9uc2VjID0gdmFsOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZG93bl90aHJvdHRsZV9uc2VjX3Nob3coc3RydWN0IGdvdl9hdHRyX3NldCAqYXR0cl9zZXQsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ292X3R1bmFibGVzICp0dW5hYmxlcyA9IHRvX3R1bmFibGVzKGF0dHJfc2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB0dW5hYmxlcy0+ZG93bl90aHJvdHRsZV9uc2VjKTsKK30KKworc3RhdGljIHNzaXplX3QgZG93bl90aHJvdHRsZV9uc2VjX3N0b3JlKHN0cnVjdCBnb3ZfYXR0cl9zZXQgKmF0dHJfc2V0LAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZ292X3R1bmFibGVzICp0dW5hYmxlcyA9IHRvX3R1bmFibGVzKGF0dHJfc2V0KTsKKwlpbnQgcmV0OworCWxvbmcgdW5zaWduZWQgaW50IHZhbDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJdHVuYWJsZXMtPmRvd25fdGhyb3R0bGVfbnNlYyA9IHZhbDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ292ZXJub3JfYXR0ciB1cF90aHJvdHRsZV9uc2VjID0gX19BVFRSX1JXKHVwX3Rocm90dGxlX25zZWMpOworc3RhdGljIHN0cnVjdCBnb3Zlcm5vcl9hdHRyIGRvd25fdGhyb3R0bGVfbnNlYyA9IF9fQVRUUl9SVyhkb3duX3Rocm90dGxlX25zZWMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2NoZWRmcmVxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmdXBfdGhyb3R0bGVfbnNlYy5hdHRyLAorCSZkb3duX3Rocm90dGxlX25zZWMuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB0dW5hYmxlc19rdHlwZSA9IHsKKwkuZGVmYXVsdF9hdHRycyA9IHNjaGVkZnJlcV9hdHRyaWJ1dGVzLAorCS5zeXNmc19vcHMgPSAmZ292ZXJub3Jfc3lzZnNfb3BzLAorfTsKKwogc3RhdGljIGludCBjcHVmcmVxX3NjaGVkX3BvbGljeV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQogewogCXN0cnVjdCBnb3ZfZGF0YSAqZ2Q7CkBAIC0yODMsMTcgKzM0OSwzOSBAQAogCWlmICghZ2QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZ2QtPnVwX3Rocm90dGxlX25zZWMgPSBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID8KLQkJCSAgICBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5IDoKLQkJCSAgICBUSFJPVFRMRV9VUF9OU0VDOwotCWdkLT5kb3duX3Rocm90dGxlX25zZWMgPSBUSFJPVFRMRV9ET1dOX05TRUM7Ci0JcHJfZGVidWcoIiVzOiB0aHJvdHRsZSB0aHJlc2hvbGQgPSAldSBbbnNdXG4iLAotCQkgIF9fZnVuY19fLCBnZC0+dXBfdGhyb3R0bGVfbnNlYyk7CisJcG9saWN5LT5nb3Zlcm5vcl9kYXRhID0gZ2Q7CiAKLQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcG9saWN5LT5rb2JqLCBnZXRfc3lzZnNfYXR0cigpKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogY291bGRuJ3QgY3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXM6ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGVycjsKKwlpZiAoIWdsb2JhbF90dW5hYmxlcykgeworCQlnZC0+dHVuYWJsZXMgPSBremFsbG9jKHNpemVvZigqZ2QtPnR1bmFibGVzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZ2QtPnR1bmFibGVzKQorCQkJZ290byBmcmVlX2dkOworCisJCWdkLT50dW5hYmxlcy0+dXBfdGhyb3R0bGVfbnNlYyA9CisJCQlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID8KKwkJCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgOgorCQkJVEhST1RUTEVfVVBfTlNFQzsKKwkJZ2QtPnR1bmFibGVzLT5kb3duX3Rocm90dGxlX25zZWMgPQorCQkJVEhST1RUTEVfRE9XTl9OU0VDOworCisJCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmdkLT50dW5hYmxlcy0+YXR0cl9zZXQua29iaiwKKwkJCQkJICAmdHVuYWJsZXNfa3R5cGUsCisJCQkJCSAgZ2V0X2dvdmVybm9yX3BhcmVudF9rb2JqKHBvbGljeSksCisJCQkJCSAgIiVzIiwgY3B1ZnJlcV9nb3Zfc2NoZWQubmFtZSk7CisJCWlmIChyYykKKwkJCWdvdG8gZnJlZV90dW5hYmxlczsKKworCQlnb3ZfYXR0cl9zZXRfaW5pdCgmZ2QtPnR1bmFibGVzLT5hdHRyX3NldCwKKwkJCQkgICZnZC0+dHVuYWJsZXNfaG9vayk7CisKKwkJcHJfZGVidWcoIiVzOiB0aHJvdHRsZV90aHJlc2hvbGQgPSAldSBbbnNdXG4iLAorCQkJIF9fZnVuY19fLCBnZC0+dHVuYWJsZXMtPnVwX3Rocm90dGxlX25zZWMpOworCisJCWlmICghaGF2ZV9nb3Zlcm5vcl9wZXJfcG9saWN5KCkpCisJCQlnbG9iYWxfdHVuYWJsZXMgPSBnZC0+dHVuYWJsZXM7CisJfSBlbHNlIHsKKwkJZ2QtPnR1bmFibGVzID0gZ2xvYmFsX3R1bmFibGVzOworCQlnb3ZfYXR0cl9zZXRfZ2V0KCZnbG9iYWxfdHVuYWJsZXMtPmF0dHJfc2V0LAorCQkJCSAmZ2QtPnR1bmFibGVzX2hvb2spOwogCX0KIAogCXBvbGljeS0+Z292ZXJub3JfZGF0YSA9IGdkOwpAQCAtMzA1LDcgKzM5Myw3IEBACiAJCWlmIChJU19FUlJfT1JfTlVMTChnZC0+dGFzaykpIHsKIAkJCXByX2VycigiJXM6IGZhaWxlZCB0byBjcmVhdGUga3NjaGVkZnJlcSB0aHJlYWRcbiIsCiAJCQkgICAgICAgX19mdW5jX18pOwotCQkJZ290byBlcnI7CisJCQlnb3RvIGZyZWVfdHVuYWJsZXM7CiAJCX0KIAkJZ2V0X3Rhc2tfc3RydWN0KGdkLT50YXNrKTsKIAkJa3RocmVhZF9iaW5kX21hc2soZ2QtPnRhc2ssIHBvbGljeS0+cmVsYXRlZF9jcHVzKTsKQEAgLTMxNyw3ICs0MDUsOSBAQAogCiAJcmV0dXJuIDA7CiAKLWVycjoKK2ZyZWVfdHVuYWJsZXM6CisJa2ZyZWUoZ2QtPnR1bmFibGVzKTsKK2ZyZWVfZ2Q6CiAJcG9saWN5LT5nb3Zlcm5vcl9kYXRhID0gTlVMTDsKIAlrZnJlZShnZCk7CiAJcmV0dXJuIC1FTk9NRU07CkBAIC0zMjUsNiArNDE1LDcgQEAKIAogc3RhdGljIHZvaWQgY3B1ZnJlcV9zY2hlZF9wb2xpY3lfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CiAJc3RydWN0IGdvdl9kYXRhICpnZCA9IHBvbGljeS0+Z292ZXJub3JfZGF0YTsKIAogCWNsZWFyX3NjaGVkX2ZyZXEoKTsKQEAgLTMzMyw3ICs0MjQsMTIgQEAKIAkJcHV0X3Rhc2tfc3RydWN0KGdkLT50YXNrKTsKIAl9CiAKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnBvbGljeS0+a29iaiwgZ2V0X3N5c2ZzX2F0dHIoKSk7CisJY291bnQgPSBnb3ZfYXR0cl9zZXRfcHV0KCZnZC0+dHVuYWJsZXMtPmF0dHJfc2V0LCAmZ2QtPnR1bmFibGVzX2hvb2spOworCWlmICghY291bnQpIHsKKwkJaWYgKCFoYXZlX2dvdmVybm9yX3Blcl9wb2xpY3koKSkKKwkJCWdsb2JhbF90dW5hYmxlcyA9IE5VTEw7CisJCWtmcmVlKGdkLT50dW5hYmxlcyk7CisJfQogCiAJcG9saWN5LT5nb3Zlcm5vcl9kYXRhID0gTlVMTDsKIApAQCAtMzczLDg4ICs0NjksNiBAQAogCQlwZXJfY3B1KGVuYWJsZWQsIGNwdSkgPSAwOwogfQogCi0vKiBUdW5hYmxlcyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd191cF90aHJvdHRsZV9uc2VjKHN0cnVjdCBnb3ZfZGF0YSAqZ2QsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZ2QtPnVwX3Rocm90dGxlX25zZWMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV91cF90aHJvdHRsZV9uc2VjKHN0cnVjdCBnb3ZfZGF0YSAqZ2QsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JbG9uZyB1bnNpZ25lZCBpbnQgdmFsOwotCi0JcmV0ID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlnZC0+dXBfdGhyb3R0bGVfbnNlYyA9IHZhbDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZG93bl90aHJvdHRsZV9uc2VjKHN0cnVjdCBnb3ZfZGF0YSAqZ2QsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZ2QtPmRvd25fdGhyb3R0bGVfbnNlYyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2Rvd25fdGhyb3R0bGVfbnNlYyhzdHJ1Y3QgZ292X2RhdGEgKmdkLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmV0OwotCWxvbmcgdW5zaWduZWQgaW50IHZhbDsKLQotCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JZ2QtPmRvd25fdGhyb3R0bGVfbnNlYyA9IHZhbDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgc2hvdy9zdG9yZSByb3V0aW5lcwotICogLSBzeXM6IE9uZSBnb3Zlcm5vciBpbnN0YW5jZSBmb3IgY29tcGxldGUgU1lTVEVNCi0gKiAtIHBvbDogT25lIGdvdmVybm9yIGluc3RhbmNlIHBlciBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kKLSAqLwotI2RlZmluZSBzaG93X2dvdl9wb2xfc3lzKGZpbGVfbmFtZSkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWxlX25hbWUjI19nb3ZfcG9sCQkJCVwKLShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQkJCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93XyMjZmlsZV9uYW1lKHBvbGljeS0+Z292ZXJub3JfZGF0YSwgYnVmKTsJCVwKLX0KLQotI2RlZmluZSBzdG9yZV9nb3ZfcG9sX3N5cyhmaWxlX25hbWUpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzdG9yZV8jI2ZpbGVfbmFtZSMjX2dvdl9wb2wJCQkJXAotKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIHN0b3JlXyMjZmlsZV9uYW1lKHBvbGljeS0+Z292ZXJub3JfZGF0YSwgYnVmLCBjb3VudCk7CVwKLX0KLQotI2RlZmluZSBnb3ZfcG9sX2F0dHJfcncoX25hbWUpCQkJCQkJXAotCXN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyIF9uYW1lIyNfZ292X3BvbCA9CQkJCVwKLQlfX0FUVFIoX25hbWUsIDA2NDQsIHNob3dfIyNfbmFtZSMjX2dvdl9wb2wsIHN0b3JlXyMjX25hbWUjI19nb3ZfcG9sKQotCi0jZGVmaW5lIHNob3dfc3RvcmVfZ292X3BvbF9zeXMoZmlsZV9uYW1lKQkJCQlcCi0Jc2hvd19nb3ZfcG9sX3N5cyhmaWxlX25hbWUpOwkJCQkJCVwKLQlzdG9yZV9nb3ZfcG9sX3N5cyhmaWxlX25hbWUpCi0jZGVmaW5lIHR1bmFibGVfaGFuZGxlcnMoZmlsZV9uYW1lKSBcCi0Jc2hvd19nb3ZfcG9sX3N5cyhmaWxlX25hbWUpOyBcCi0Jc3RvcmVfZ292X3BvbF9zeXMoZmlsZV9uYW1lKTsgXAotCWdvdl9wb2xfYXR0cl9ydyhmaWxlX25hbWUpCi0KLXR1bmFibGVfaGFuZGxlcnMoZG93bl90aHJvdHRsZV9uc2VjKTsKLXR1bmFibGVfaGFuZGxlcnModXBfdGhyb3R0bGVfbnNlYyk7Ci0KLS8qIFBlciBwb2xpY3kgZ292ZXJub3IgaW5zdGFuY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzY2hlZF9hdHRyaWJ1dGVzX2dvdl9wb2xbXSA9IHsKLQkmdXBfdGhyb3R0bGVfbnNlY19nb3ZfcG9sLmF0dHIsCi0JJmRvd25fdGhyb3R0bGVfbnNlY19nb3ZfcG9sLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjaGVkX2F0dHJfZ3JvdXBfZ292X3BvbCA9IHsKLQkuYXR0cnMgPSBzY2hlZF9hdHRyaWJ1dGVzX2dvdl9wb2wsCi0JLm5hbWUgPSAic2NoZWQiLAotfTsKIAogI2lmbmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfU0NIRUQKIHN0YXRpYwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWZyZXFfc2NoZWR1dGlsLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYwppbmRleCA4ZDMyN2MzLi4yZWI5NjZjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYwpAQCAtMTcsMTIgKzE3LDE4IEBACiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3Bvd2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvc3lzY3RsLmg+CiAjaW5jbHVkZSAic2NoZWQuaCIKKyNpbmNsdWRlICJ0dW5lLmgiCisKKyNpZmRlZiBDT05GSUdfU0NIRURfV0FMVAordW5zaWduZWQgbG9uZyBib29zdGVkX2NwdV91dGlsKGludCBjcHUpOworI2VuZGlmCiAKICNkZWZpbmUgU1VHT1ZfS1RIUkVBRF9QUklPUklUWQk1MAogCiBzdHJ1Y3Qgc3Vnb3ZfdHVuYWJsZXMgewogCXN0cnVjdCBnb3ZfYXR0cl9zZXQgYXR0cl9zZXQ7CiAJdW5zaWduZWQgaW50IHJhdGVfbGltaXRfdXM7CisJdW5zaWduZWQgaW50IGhpc3BlZWRfbG9hZDsKIAl1bnNpZ25lZCBpbnQgaGlzcGVlZF9mcmVxOwogCWJvb2wgcGw7CiB9OwpAQCAtNzEsOSArNzcsMTUgQEAKIAl1bnNpZ25lZCBsb25nIG1heDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNwdTsKKworCS8qIFRoZSBmaWVsZCBiZWxvdyBpcyBmb3Igc2luZ2xlLUNQVSBwb2xpY2llcyBvbmx5LiAqLworI2lmZGVmIENPTkZJR19OT19IWl9DT01NT04KKwl1bnNpZ25lZCBsb25nIHNhdmVkX2lkbGVfY2FsbHM7CisjZW5kaWYKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3Vnb3ZfY3B1LCBzdWdvdl9jcHUpOworc3RhdGljIHVuc2lnbmVkIGludCBzdGFsZV9uczsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBHb3Zlcm5vciBpbnRlcm5hbHMgKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEwMCwyMiArMTEyLDIwIEBACiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBzZ19wb2xpY3ktPnBvbGljeTsKIAorCWlmIChzZ19wb2xpY3ktPm5leHRfZnJlcSA9PSBuZXh0X2ZyZXEpCisJCXJldHVybjsKKworCXNnX3BvbGljeS0+bmV4dF9mcmVxID0gbmV4dF9mcmVxOwogCXNnX3BvbGljeS0+bGFzdF9mcmVxX3VwZGF0ZV90aW1lID0gdGltZTsKIAogCWlmIChwb2xpY3ktPmZhc3Rfc3dpdGNoX2VuYWJsZWQpIHsKLQkJaWYgKHNnX3BvbGljeS0+bmV4dF9mcmVxID09IG5leHRfZnJlcSkgewotCQkJdHJhY2VfY3B1X2ZyZXF1ZW5jeShwb2xpY3ktPmN1ciwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzZ19wb2xpY3ktPm5leHRfZnJlcSA9IG5leHRfZnJlcTsKIAkJbmV4dF9mcmVxID0gY3B1ZnJlcV9kcml2ZXJfZmFzdF9zd2l0Y2gocG9saWN5LCBuZXh0X2ZyZXEpOwogCQlpZiAobmV4dF9mcmVxID09IENQVUZSRVFfRU5UUllfSU5WQUxJRCkKIAkJCXJldHVybjsKIAogCQlwb2xpY3ktPmN1ciA9IG5leHRfZnJlcTsKIAkJdHJhY2VfY3B1X2ZyZXF1ZW5jeShuZXh0X2ZyZXEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JfSBlbHNlIGlmIChzZ19wb2xpY3ktPm5leHRfZnJlcSAhPSBuZXh0X2ZyZXEpIHsKLQkJc2dfcG9saWN5LT5uZXh0X2ZyZXEgPSBuZXh0X2ZyZXE7CisJfSBlbHNlIHsKIAkJc2dfcG9saWN5LT53b3JrX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAkJaXJxX3dvcmtfcXVldWUoJnNnX3BvbGljeS0+aXJxX3dvcmspOwogCX0KQEAgLTE3MSw2ICsxODEsNyBAQAogCSptYXggPSBjZnNfbWF4OwogCiAJKnV0aWwgPSBjcHVfdXRpbF9mcmVxKGNwdSwgJmxvYWRjcHUtPndhbHRfbG9hZCk7CisJKnV0aWwgPSBib29zdGVkX2NwdV91dGlsKGNwdSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1Z292X3NldF9pb3dhaXRfYm9vc3Qoc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1LCB1NjQgdGltZSwKQEAgLTI1Niw3ICsyNjcsNyBAQAogfQogCiAjZGVmaW5lIE5MX1JBVElPIDc1Ci0jZGVmaW5lIEhJU1BFRURfTE9BRCA5MAorI2RlZmluZSBERUZBVUxUX0hJU1BFRURfTE9BRCA5MAogc3RhdGljIHZvaWQgc3Vnb3Zfd2FsdF9hZGp1c3Qoc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1LCB1bnNpZ25lZCBsb25nICp1dGlsLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWF4KQogewpAQCAtMjcwLDcgKzI4MSw3IEBACiAJCXJldHVybjsKIAogCWlzX2hpbG9hZCA9IChjcHVfdXRpbCA+PSBtdWx0X2ZyYWMoc2dfcG9saWN5LT5hdmdfY2FwLAotCQkJCQkgICBISVNQRUVEX0xPQUQsCisJCQkJCSAgIHNnX3BvbGljeS0+dHVuYWJsZXMtPmhpc3BlZWRfbG9hZCwKIAkJCQkJICAgMTAwKSk7CiAKIAlpZiAoaXNfaGlsb2FkICYmICFpc19taWdyYXRpb24pCkBAIC0yODMsNiArMjk0LDE5IEBACiAJCSp1dGlsID0gbWF4KCp1dGlsLCBzZ19jcHUtPndhbHRfbG9hZC5wbCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTk9fSFpfQ09NTU9OCitzdGF0aWMgYm9vbCBzdWdvdl9jcHVfaXNfYnVzeShzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUpCit7CisJdW5zaWduZWQgbG9uZyBpZGxlX2NhbGxzID0gdGlja19ub2h6X2dldF9pZGxlX2NhbGxzKCk7CisJYm9vbCByZXQgPSBpZGxlX2NhbGxzID09IHNnX2NwdS0+c2F2ZWRfaWRsZV9jYWxsczsKKworCXNnX2NwdS0+c2F2ZWRfaWRsZV9jYWxscyA9IGlkbGVfY2FsbHM7CisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgc3Vnb3ZfY3B1X2lzX2J1c3koc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1KSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmIC8qIENPTkZJR19OT19IWl9DT01NT04gKi8KKwogc3RhdGljIHZvaWQgc3Vnb3ZfdXBkYXRlX3NpbmdsZShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqaG9vaywgdTY0IHRpbWUsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzKQogewpAQCAtMjkxLDYgKzMxNSw3IEBACiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBzZ19wb2xpY3ktPnBvbGljeTsKIAl1bnNpZ25lZCBsb25nIHV0aWwsIG1heDsKIAl1bnNpZ25lZCBpbnQgbmV4dF9mOworCWJvb2wgYnVzeTsKIAogCXN1Z292X3NldF9pb3dhaXRfYm9vc3Qoc2dfY3B1LCB0aW1lLCBmbGFncyk7CiAJc2dfY3B1LT5sYXN0X3VwZGF0ZSA9IHRpbWU7CkBAIC0yOTgsNiArMzIzLDcgQEAKIAlpZiAoIXN1Z292X3Nob3VsZF91cGRhdGVfZnJlcShzZ19wb2xpY3ksIHRpbWUpKQogCQlyZXR1cm47CiAKKwlidXN5ID0gc3Vnb3ZfY3B1X2lzX2J1c3koc2dfY3B1KTsKIAlmbGFncyAmPSB+U0NIRURfQ1BVRlJFUV9SVF9ETDsKIAogCWlmIChmbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpIHsKQEAgLTMwOSwzNSArMzM1LDI5IEBACiAJCQkJICAgc2dfcG9saWN5LT5wb2xpY3ktPmN1cik7CiAJCXN1Z292X3dhbHRfYWRqdXN0KHNnX2NwdSwgJnV0aWwsICZtYXgpOwogCQluZXh0X2YgPSBnZXRfbmV4dF9mcmVxKHNnX3BvbGljeSwgdXRpbCwgbWF4KTsKKwkJLyoKKwkJICogRG8gbm90IHJlZHVjZSB0aGUgZnJlcXVlbmN5IGlmIHRoZSBDUFUgaGFzIG5vdCBiZWVuIGlkbGUKKwkJICogcmVjZW50bHksIGFzIHRoZSByZWR1Y3Rpb24gaXMgbGlrZWx5IHRvIGJlIHByZW1hdHVyZSB0aGVuLgorCQkgKi8KKwkJaWYgKGJ1c3kgJiYgbmV4dF9mIDwgc2dfcG9saWN5LT5uZXh0X2ZyZXEpCisJCQluZXh0X2YgPSBzZ19wb2xpY3ktPm5leHRfZnJlcTsKIAl9CiAJc3Vnb3ZfdXBkYXRlX2NvbW1pdChzZ19wb2xpY3ksIHRpbWUsIG5leHRfZik7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUpCiB7CiAJc3RydWN0IHN1Z292X3BvbGljeSAqc2dfcG9saWN5ID0gc2dfY3B1LT5zZ19wb2xpY3k7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBzZ19wb2xpY3ktPnBvbGljeTsKLQl1bnNpZ25lZCBpbnQgbWF4X2YgPSBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CiAJdTY0IGxhc3RfZnJlcV91cGRhdGVfdGltZSA9IHNnX3BvbGljeS0+bGFzdF9mcmVxX3VwZGF0ZV90aW1lOworCXVuc2lnbmVkIGxvbmcgdXRpbCA9IDAsIG1heCA9IDE7CiAJdW5zaWduZWQgaW50IGo7CiAKLQlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX1JUX0RMKQotCQlyZXR1cm4gbWF4X2Y7Ci0KLQlzdWdvdl9pb3dhaXRfYm9vc3Qoc2dfY3B1LCAmdXRpbCwgJm1heCk7Ci0Jc3Vnb3Zfd2FsdF9hZGp1c3Qoc2dfY3B1LCAmdXRpbCwgJm1heCk7Ci0KIAlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7Ci0JCXN0cnVjdCBzdWdvdl9jcHUgKmpfc2dfY3B1OworCQlzdHJ1Y3Qgc3Vnb3ZfY3B1ICpqX3NnX2NwdSA9ICZwZXJfY3B1KHN1Z292X2NwdSwgaik7CiAJCXVuc2lnbmVkIGxvbmcgal91dGlsLCBqX21heDsKIAkJczY0IGRlbHRhX25zOwogCi0JCWlmIChqID09IHNnX2NwdS0+Y3B1KQotCQkJY29udGludWU7Ci0KLQkJal9zZ19jcHUgPSAmcGVyX2NwdShzdWdvdl9jcHUsIGopOwogCQkvKgogCQkgKiBJZiB0aGUgQ1BVIHV0aWxpemF0aW9uIHdhcyBsYXN0IHVwZGF0ZWQgYmVmb3JlIHRoZSBwcmV2aW91cwogCQkgKiBmcmVxdWVuY3kgdXBkYXRlIGFuZCB0aGUgdGltZSBlbGFwc2VkIGJldHdlZW4gdGhlIGxhc3QgdXBkYXRlCkBAIC0zNDYsMTIgKzM2NiwxMiBAQAogCQkgKiBpZGxlIG5vdyAoYW5kIGNsZWFyIGlvd2FpdF9ib29zdCBmb3IgaXQpLgogCQkgKi8KIAkJZGVsdGFfbnMgPSBsYXN0X2ZyZXFfdXBkYXRlX3RpbWUgLSBqX3NnX2NwdS0+bGFzdF91cGRhdGU7Ci0JCWlmIChkZWx0YV9ucyA+IHNjaGVkX3Jhdmdfd2luZG93KSB7CisJCWlmIChkZWx0YV9ucyA+IHN0YWxlX25zKSB7CiAJCQlqX3NnX2NwdS0+aW93YWl0X2Jvb3N0ID0gMDsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChqX3NnX2NwdS0+ZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX1JUX0RMKQotCQkJcmV0dXJuIG1heF9mOworCQkJcmV0dXJuIHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKIAogCQlqX3V0aWwgPSBqX3NnX2NwdS0+dXRpbDsKIAkJal9tYXggPSBqX3NnX2NwdS0+bWF4OwpAQCAtNDA0LDcgKzQyNCwxMSBAQAogCQkJCXNnX2NwdS0+d2FsdF9sb2FkLnBsLCBmbGFncyk7CiAKIAlpZiAoc3Vnb3Zfc2hvdWxkX3VwZGF0ZV9mcmVxKHNnX3BvbGljeSwgdGltZSkpIHsKLQkJbmV4dF9mID0gc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzZ19jcHUsIHV0aWwsIG1heCwgZmxhZ3MpOworCQlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX1JUX0RMKQorCQkJbmV4dF9mID0gc2dfcG9saWN5LT5wb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CisJCWVsc2UKKwkJCW5leHRfZiA9IHN1Z292X25leHRfZnJlcV9zaGFyZWQoc2dfY3B1KTsKKwogCQlzdWdvdl91cGRhdGVfY29tbWl0KHNnX3BvbGljeSwgdGltZSwgbmV4dF9mKTsKIAl9CiAKQEAgLTQ4NSw2ICs1MDksMjYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGhpc3BlZWRfbG9hZF9zaG93KHN0cnVjdCBnb3ZfYXR0cl9zZXQgKmF0dHJfc2V0LCBjaGFyICpidWYpCit7CisJc3RydWN0IHN1Z292X3R1bmFibGVzICp0dW5hYmxlcyA9IHRvX3N1Z292X3R1bmFibGVzKGF0dHJfc2V0KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB0dW5hYmxlcy0+aGlzcGVlZF9sb2FkKTsKK30KKworc3RhdGljIHNzaXplX3QgaGlzcGVlZF9sb2FkX3N0b3JlKHN0cnVjdCBnb3ZfYXR0cl9zZXQgKmF0dHJfc2V0LAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHN1Z292X3R1bmFibGVzICp0dW5hYmxlcyA9IHRvX3N1Z292X3R1bmFibGVzKGF0dHJfc2V0KTsKKworCWlmIChrc3RydG91aW50KGJ1ZiwgMTAsICZ0dW5hYmxlcy0+aGlzcGVlZF9sb2FkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0dW5hYmxlcy0+aGlzcGVlZF9sb2FkID0gbWluKDEwMFUsIHR1bmFibGVzLT5oaXNwZWVkX2xvYWQpOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBoaXNwZWVkX2ZyZXFfc2hvdyhzdHJ1Y3QgZ292X2F0dHJfc2V0ICphdHRyX3NldCwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzdWdvdl90dW5hYmxlcyAqdHVuYWJsZXMgPSB0b19zdWdvdl90dW5hYmxlcyhhdHRyX3NldCk7CkBAIC01MzYsMTEgKzU4MCwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGdvdmVybm9yX2F0dHIgcmF0ZV9saW1pdF91cyA9IF9fQVRUUl9SVyhyYXRlX2xpbWl0X3VzKTsKK3N0YXRpYyBzdHJ1Y3QgZ292ZXJub3JfYXR0ciBoaXNwZWVkX2xvYWQgPSBfX0FUVFJfUlcoaGlzcGVlZF9sb2FkKTsKIHN0YXRpYyBzdHJ1Y3QgZ292ZXJub3JfYXR0ciBoaXNwZWVkX2ZyZXEgPSBfX0FUVFJfUlcoaGlzcGVlZF9mcmVxKTsKIHN0YXRpYyBzdHJ1Y3QgZ292ZXJub3JfYXR0ciBwbCA9IF9fQVRUUl9SVyhwbCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzdWdvdl9hdHRyaWJ1dGVzW10gPSB7CiAJJnJhdGVfbGltaXRfdXMuYXR0ciwKKwkmaGlzcGVlZF9sb2FkLmF0dHIsCiAJJmhpc3BlZWRfZnJlcS5hdHRyLAogCSZwbC5hdHRyLAogCU5VTEwKQEAgLTY4Nyw2ICs3MzMsNyBAQAogCX0KIAogCXR1bmFibGVzLT5yYXRlX2xpbWl0X3VzID0gTEFURU5DWV9NVUxUSVBMSUVSOworCXR1bmFibGVzLT5oaXNwZWVkX2xvYWQgPSBERUZBVUxUX0hJU1BFRURfTE9BRDsKIAl0dW5hYmxlcy0+aGlzcGVlZF9mcmVxID0gMDsKIAlsYXQgPSBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5IC8gTlNFQ19QRVJfVVNFQzsKIAlpZiAobGF0KQpAQCAtNjk0LDYgKzc0MSw3IEBACiAKIAlwb2xpY3ktPmdvdmVybm9yX2RhdGEgPSBzZ19wb2xpY3k7CiAJc2dfcG9saWN5LT50dW5hYmxlcyA9IHR1bmFibGVzOworCXN0YWxlX25zID0gc2NoZWRfcmF2Z193aW5kb3cgKyAoc2NoZWRfcmF2Z193aW5kb3cgPj4gMyk7CiAKIAlyZXQgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmdHVuYWJsZXMtPmF0dHJfc2V0LmtvYmosICZzdWdvdl90dW5hYmxlc19rdHlwZSwKIAkJCQkgICBnZXRfZ292ZXJub3JfcGFyZW50X2tvYmoocG9saWN5KSwgIiVzIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jIGIva2VybmVsL3NjaGVkL2RlYnVnLmMKaW5kZXggMGY4YzBiMi4uYzA5MWNhNCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkL2RlYnVnLmMKQEAgLTEwMDgsNiArMTAwOCwzMyBAQAogCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzKTsKIAkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Bhc3NpdmUpOwogCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSk7CisJCS8qIGVhcyAqLworCQkvKiBzZWxlY3RfaWRsZV9zaWJsaW5nKCkgKi8KKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Npc19hdHRlbXB0cyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zaXNfaWRsZSk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zaXNfY2FjaGVfYWZmaW5lKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Npc19zdWZmX2NhcCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zaXNfaWRsZV9jcHUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2lzX2NvdW50KTsKKwkJLyogc2VsZWN0X2VuZXJneV9jcHVfYnJ1dGUoKSAqLworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2VjYl9hdHRlbXB0cyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zZWNiX3N5bmMpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2VjYl9pZGxlX2J0KTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3NlY2JfaW5zdWZmX2NhcCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zZWNiX25vX25yZ19zYXYpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2VjYl9ucmdfc2F2KTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3NlY2JfY291bnQpOworCQkvKiBmaW5kX2Jlc3RfdGFyZ2V0KCkgKi8KKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2ZidF9hdHRlbXB0cyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19mYnRfbm9fY3B1KTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2ZidF9ub19zZCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19mYnRfcHJlZl9pZGxlKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2ZidF9jb3VudCk7CisJCS8qIGNhcyAqLworCQkvKiBzZWxlY3RfdGFza19ycV9mYWlyKCkgKi8KKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2Nhc19hdHRlbXB0cyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19jYXNfY291bnQpOworIAogI2lmZGVmIENPTkZJR19TQ0hFRF9XQUxUCiAJCVAocmF2Zy5kZW1hbmQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZmFpci5jIGIva2VybmVsL3NjaGVkL2ZhaXIuYwppbmRleCA2MmEyOWVkLi43YjQ1OWNhIDEwMDc1NQotLS0gYS9rZXJuZWwvc2NoZWQvZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZC9mYWlyLmMKQEAgLTg5LDYgKzg5LDcgQEAKIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfc3luY19oaW50X2VuYWJsZSA9IDE7CiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2luaXRpYWxfdGFza191dGlsID0gMDsKIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfY3N0YXRlX2F3YXJlID0gMTsKK0RFRklORV9QRVJfQ1BVX1JFQURfTU9TVExZKGludCwgc2NoZWRfbG9hZF9ib29zdCk7CiAKICNpZmRlZiBDT05GSUdfU0NIRURfV0FMVAogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF91c2Vfd2FsdF9jcHVfdXRpbCA9IDE7CkBAIC0xNjAsNyArMTYxLDcgQEAKIAogLyoKICAqIFRoZSBtYXJnaW4gdXNlZCB3aGVuIGNvbXBhcmluZyB1dGlsaXphdGlvbiB3aXRoIENQVSBjYXBhY2l0eToKLSAqIHV0aWwgKiAxMDI0IDwgY2FwYWNpdHkgKiBtYXJnaW4KKyAqIHV0aWwgKiBtYXJnaW4gPCBjYXBhY2l0eSAqIDEwMjQKICAqLwogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jYXBhY2l0eV9tYXJnaW4gPSAxMDc4OyAvKiB+NSUgbWFyZ2luICovCiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2NhcGFjaXR5X21hcmdpbl9kb3duID0gMTIwNTsgLyogfjE1JSBtYXJnaW4gKi8KQEAgLTMzOCwxOSArMzM5LDU5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9hZGRfbGVhZl9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCWlmICghY2ZzX3JxLT5vbl9saXN0KSB7CisJCXN0cnVjdCBycSAqcnEgPSBycV9vZihjZnNfcnEpOworCQlpbnQgY3B1ID0gY3B1X29mKHJxKTsKIAkJLyoKIAkJICogRW5zdXJlIHdlIGVpdGhlciBhcHBlYXIgYmVmb3JlIG91ciBwYXJlbnQgKGlmIGFscmVhZHkKIAkJICogZW5xdWV1ZWQpIG9yIGZvcmNlIG91ciBwYXJlbnQgdG8gYXBwZWFyIGFmdGVyIHVzIHdoZW4gaXQgaXMKLQkJICogZW5xdWV1ZWQuICBUaGUgZmFjdCB0aGF0IHdlIGFsd2F5cyBlbnF1ZXVlIGJvdHRvbS11cAotCQkgKiByZWR1Y2VzIHRoaXMgdG8gdHdvIGNhc2VzLgorCQkgKiBlbnF1ZXVlZC4gVGhlIGZhY3QgdGhhdCB3ZSBhbHdheXMgZW5xdWV1ZSBib3R0b20tdXAKKwkJICogcmVkdWNlcyB0aGlzIHRvIHR3byBjYXNlcyBhbmQgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSByb290CisJCSAqIGNmc19ycS4gRnVydGhlcm1vcmUsIGl0IGFsc28gbWVhbnMgdGhhdCB3ZSB3aWxsIGFsd2F5cyByZXNldAorCQkgKiB0bXBfYWxvbmVfYnJhbmNoIGVpdGhlciB3aGVuIHRoZSBicmFuY2ggaXMgY29ubmVjdGVkCisJCSAqIHRvIGEgdHJlZSBvciB3aGVuIHdlIHJlYWNoIHRoZSBiZWcgb2YgdGhlIHRyZWUKIAkJICovCiAJCWlmIChjZnNfcnEtPnRnLT5wYXJlbnQgJiYKLQkJICAgIGNmc19ycS0+dGctPnBhcmVudC0+Y2ZzX3JxW2NwdV9vZihycV9vZihjZnNfcnEpKV0tPm9uX2xpc3QpIHsKLQkJCWxpc3RfYWRkX3JjdSgmY2ZzX3JxLT5sZWFmX2Nmc19ycV9saXN0LAotCQkJCSZycV9vZihjZnNfcnEpLT5sZWFmX2Nmc19ycV9saXN0KTsKLQkJfSBlbHNlIHsKKwkJICAgIGNmc19ycS0+dGctPnBhcmVudC0+Y2ZzX3JxW2NwdV0tPm9uX2xpc3QpIHsKKwkJCS8qCisJCQkgKiBJZiBwYXJlbnQgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdCwgd2UgYWRkIHRoZSBjaGlsZAorCQkJICoganVzdCBiZWZvcmUuIFRoYW5rcyB0byBjaXJjdWxhciBsaW5rZWQgcHJvcGVydHkgb2YKKwkJCSAqIHRoZSBsaXN0LCB0aGlzIG1lYW5zIHRvIHB1dCB0aGUgY2hpbGQgYXQgdGhlIHRhaWwKKwkJCSAqIG9mIHRoZSBsaXN0IHRoYXQgc3RhcnRzIGJ5IHBhcmVudC4KKwkJCSAqLwogCQkJbGlzdF9hZGRfdGFpbF9yY3UoJmNmc19ycS0+bGVhZl9jZnNfcnFfbGlzdCwKLQkJCQkmcnFfb2YoY2ZzX3JxKS0+bGVhZl9jZnNfcnFfbGlzdCk7CisJCQkJJihjZnNfcnEtPnRnLT5wYXJlbnQtPmNmc19ycVtjcHVdLT5sZWFmX2Nmc19ycV9saXN0KSk7CisJCQkvKgorCQkJICogVGhlIGJyYW5jaCBpcyBub3cgY29ubmVjdGVkIHRvIGl0cyB0cmVlIHNvIHdlIGNhbgorCQkJICogcmVzZXQgdG1wX2Fsb25lX2JyYW5jaCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCQkJICogbGlzdC4KKwkJCSAqLworCQkJcnEtPnRtcF9hbG9uZV9icmFuY2ggPSAmcnEtPmxlYWZfY2ZzX3JxX2xpc3Q7CisJCX0gZWxzZSBpZiAoIWNmc19ycS0+dGctPnBhcmVudCkgeworCQkJLyoKKwkJCSAqIGNmcyBycSB3aXRob3V0IHBhcmVudCBzaG91bGQgYmUgcHV0CisJCQkgKiBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdC4KKwkJCSAqLworCQkJbGlzdF9hZGRfdGFpbF9yY3UoJmNmc19ycS0+bGVhZl9jZnNfcnFfbGlzdCwKKwkJCQkmcnEtPmxlYWZfY2ZzX3JxX2xpc3QpOworCQkJLyoKKwkJCSAqIFdlIGhhdmUgcmVhY2ggdGhlIGJlZyBvZiBhIHRyZWUgc28gd2UgY2FuIHJlc2V0CisJCQkgKiB0bXBfYWxvbmVfYnJhbmNoIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuCisJCQkgKi8KKwkJCXJxLT50bXBfYWxvbmVfYnJhbmNoID0gJnJxLT5sZWFmX2Nmc19ycV9saXN0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBwYXJlbnQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgc28gd2Ugd2FudCB0bworCQkJICogbWFrZSBzdXJlIHRoYXQgaXQgd2lsbCBiZSBwdXQgYWZ0ZXIgdXMuCisJCQkgKiB0bXBfYWxvbmVfYnJhbmNoIHBvaW50cyB0byB0aGUgYmVnIG9mIHRoZSBicmFuY2gKKwkJCSAqIHdoZXJlIHdlIHdpbGwgYWRkIHBhcmVudC4KKwkJCSAqLworCQkJbGlzdF9hZGRfcmN1KCZjZnNfcnEtPmxlYWZfY2ZzX3JxX2xpc3QsCisJCQkJcnEtPnRtcF9hbG9uZV9icmFuY2gpOworCQkJLyoKKwkJCSAqIHVwZGF0ZSB0bXBfYWxvbmVfYnJhbmNoIHRvIHBvaW50cyB0byB0aGUgbmV3IGJlZworCQkJICogb2YgdGhlIGJyYW5jaAorCQkJICovCisJCQlycS0+dG1wX2Fsb25lX2JyYW5jaCA9ICZjZnNfcnEtPmxlYWZfY2ZzX3JxX2xpc3Q7CiAJCX0KIAogCQljZnNfcnEtPm9uX2xpc3QgPSAxOwpAQCAtNzU5LDkgKzgwMCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGNmc19ycV9jbG9ja190YXNrKHN0cnVjdCBjZnNfcnEgKmNmc19ycSk7Ci1zdGF0aWMgaW50IHVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcodTY0IG5vdywgc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBib29sIHVwZGF0ZV9mcmVxKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV90Z19sb2FkX2F2ZyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIGludCBmb3JjZSk7Ci1zdGF0aWMgdm9pZCBhdHRhY2hfZW50aXR5X2xvYWRfYXZnKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpOworc3RhdGljIHZvaWQgYXR0YWNoX2VudGl0eV9jZnNfcnEoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpOwogCiAvKgogICogV2l0aCBuZXcgdGFza3MgYmVpbmcgY3JlYXRlZCwgdGhlaXIgaW5pdGlhbCB1dGlsX2F2Z3MgYXJlIGV4dHJhcG9sYXRlZApAQCAtNzkzLDcgKzgzMiw2IEBACiAJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gY2ZzX3JxX29mKHNlKTsKIAlzdHJ1Y3Qgc2NoZWRfYXZnICpzYSA9ICZzZS0+YXZnOwogCWxvbmcgY2FwID0gKGxvbmcpKFNDSEVEX0NBUEFDSVRZX1NDQUxFIC0gY2ZzX3JxLT5hdmcudXRpbF9hdmcpIC8gMjsKLQl1NjQgbm93ID0gY2ZzX3JxX2Nsb2NrX3Rhc2soY2ZzX3JxKTsKIAogCWlmIChjYXAgPiAwKSB7CiAJCWlmIChjZnNfcnEtPmF2Zy51dGlsX2F2ZyAhPSAwKSB7CkBAIC04MjEsMTQgKzg1OSwxMiBAQAogCQkJICogc3VjaCB0aGF0IHRoZSBuZXh0IHN3aXRjaGVkX3RvX2ZhaXIoKSBoYXMgdGhlCiAJCQkgKiBleHBlY3RlZCBzdGF0ZS4KIAkJCSAqLwotCQkJc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lID0gbm93OworCQkJc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lID0gY2ZzX3JxX2Nsb2NrX3Rhc2soY2ZzX3JxKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAotCXVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKLQlhdHRhY2hfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwotCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKKwlhdHRhY2hfZW50aXR5X2Nmc19ycShzZSk7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfU01QICovCkBAIC0yNjk3LDE2ICsyNzMzLDIwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHRocm90dGxlZF9oaWVyYXJjaHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKIAotc3RhdGljIHZvaWQgdXBkYXRlX2Nmc19zaGFyZXMoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQorc3RhdGljIHZvaWQgdXBkYXRlX2Nmc19zaGFyZXMoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CisJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gZ3JvdXBfY2ZzX3JxKHNlKTsKIAlzdHJ1Y3QgdGFza19ncm91cCAqdGc7Ci0Jc3RydWN0IHNjaGVkX2VudGl0eSAqc2U7CiAJbG9uZyBzaGFyZXM7CiAKLQl0ZyA9IGNmc19ycS0+dGc7Ci0Jc2UgPSB0Zy0+c2VbY3B1X29mKHJxX29mKGNmc19ycSkpXTsKLQlpZiAoIXNlIHx8IHRocm90dGxlZF9oaWVyYXJjaHkoY2ZzX3JxKSkKKwlpZiAoIWNmc19ycSkKIAkJcmV0dXJuOworCisJaWYgKHRocm90dGxlZF9oaWVyYXJjaHkoY2ZzX3JxKSkKKwkJcmV0dXJuOworCisJdGcgPSBjZnNfcnEtPnRnOworCiAjaWZuZGVmIENPTkZJR19TTVAKIAlpZiAobGlrZWx5KHNlLT5sb2FkLndlaWdodCA9PSB0Zy0+c2hhcmVzKSkKIAkJcmV0dXJuOwpAQCAtMjcxNSw4ICsyNzU1LDkgQEAKIAogCXJld2VpZ2h0X2VudGl0eShjZnNfcnFfb2Yoc2UpLCBzZSwgc2hhcmVzKTsKIH0KKwogI2Vsc2UgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfY2ZzX3NoYXJlcyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2Nmc19zaGFyZXMoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KQEAgLTI5NjIsNiArMzAwMywyNiBAQAogCXJldHVybiBkZWNheWVkOwogfQogCisvKgorICogU2lnbmVkIGFkZCBhbmQgY2xhbXAgb24gdW5kZXJmbG93LgorICoKKyAqIEV4cGxpY2l0bHkgZG8gYSBsb2FkLXN0b3JlIHRvIGVuc3VyZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlIG5ldmVyIGhpdHMKKyAqIG1lbW9yeS4gVGhpcyBhbGxvd3MgbG9ja2xlc3Mgb2JzZXJ2YXRpb25zIHdpdGhvdXQgZXZlciBzZWVpbmcgdGhlIG5lZ2F0aXZlCisgKiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgYWRkX3Bvc2l0aXZlKF9wdHIsIF92YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdHlwZW9mKF9wdHIpIHB0ciA9IChfcHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdHlwZW9mKF92YWwpIHZhbCA9IChfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdHlwZW9mKCpwdHIpIHJlcywgdmFyID0gUkVBRF9PTkNFKCpwdHIpOyAgICAgICAgICAgICAgICBcCisJCQkJCQkJCVwKKwlyZXMgPSB2YXIgKyB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJXAorCWlmICh2YWwgPCAwICYmIHJlcyA+IHZhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCVwKKwlXUklURV9PTkNFKCpwdHIsIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogLyoqCiAgKiB1cGRhdGVfdGdfbG9hZF9hdmcgLSB1cGRhdGUgdGhlIHRnJ3MgbG9hZCBhdmcKQEAgLTMwNDEsOCArMzEwMiwxMzggQEAKIAkJc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lID0gbl9sYXN0X3VwZGF0ZV90aW1lOwogCX0KIH0KKworLyogVGFrZSBpbnRvIGFjY291bnQgY2hhbmdlIG9mIHV0aWxpemF0aW9uIG9mIGEgY2hpbGQgdGFzayBncm91cCAqLworc3RhdGljIGlubGluZSB2b2lkCit1cGRhdGVfdGdfY2ZzX3V0aWwoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpnY2ZzX3JxID0gZ3JvdXBfY2ZzX3JxKHNlKTsKKwlsb25nIGRlbHRhID0gZ2Nmc19ycS0+YXZnLnV0aWxfYXZnIC0gc2UtPmF2Zy51dGlsX2F2ZzsKKworCS8qIE5vdGhpbmcgdG8gdXBkYXRlICovCisJaWYgKCFkZWx0YSkKKwkJcmV0dXJuOworCisJLyogU2V0IG5ldyBzY2hlZF9lbnRpdHkncyB1dGlsaXphdGlvbiAqLworCXNlLT5hdmcudXRpbF9hdmcgPSBnY2ZzX3JxLT5hdmcudXRpbF9hdmc7CisJc2UtPmF2Zy51dGlsX3N1bSA9IHNlLT5hdmcudXRpbF9hdmcgKiBMT0FEX0FWR19NQVg7CisKKwkvKiBVcGRhdGUgcGFyZW50IGNmc19ycSB1dGlsaXphdGlvbiAqLworCWFkZF9wb3NpdGl2ZSgmY2ZzX3JxLT5hdmcudXRpbF9hdmcsIGRlbHRhKTsKKwljZnNfcnEtPmF2Zy51dGlsX3N1bSA9IGNmc19ycS0+YXZnLnV0aWxfYXZnICogTE9BRF9BVkdfTUFYOworfQorCisvKiBUYWtlIGludG8gYWNjb3VudCBjaGFuZ2Ugb2YgbG9hZCBvZiBhIGNoaWxkIHRhc2sgZ3JvdXAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAordXBkYXRlX3RnX2Nmc19sb2FkKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCit7CisJc3RydWN0IGNmc19ycSAqZ2Nmc19ycSA9IGdyb3VwX2Nmc19ycShzZSk7CisJbG9uZyBkZWx0YSwgbG9hZCA9IGdjZnNfcnEtPmF2Zy5sb2FkX2F2ZzsKKworCS8qCisJICogSWYgdGhlIGxvYWQgb2YgZ3JvdXAgY2ZzX3JxIGlzIG51bGwsIHRoZSBsb2FkIG9mIHRoZQorCSAqIHNjaGVkX2VudGl0eSB3aWxsIGFsc28gYmUgbnVsbCBzbyB3ZSBjYW4gc2tpcCB0aGUgZm9ybXVsYQorCSAqLworCWlmIChsb2FkKSB7CisJCWxvbmcgdGdfbG9hZDsKKworCQkvKiBHZXQgdGcncyBsb2FkIGFuZCBlbnN1cmUgdGdfbG9hZCA+IDAgKi8KKwkJdGdfbG9hZCA9IGF0b21pY19sb25nX3JlYWQoJmdjZnNfcnEtPnRnLT5sb2FkX2F2ZykgKyAxOworCisJCS8qIEVuc3VyZSB0Z19sb2FkID49IGxvYWQgYW5kIHVwZGF0ZWQgd2l0aCBjdXJyZW50IGxvYWQqLworCQl0Z19sb2FkIC09IGdjZnNfcnEtPnRnX2xvYWRfYXZnX2NvbnRyaWI7CisJCXRnX2xvYWQgKz0gbG9hZDsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGNvbXB1dGUgYSBjb3JyZWN0aW9uIHRlcm0gaW4gdGhlIGNhc2UgdGhhdCB0aGUKKwkJICogdGFzayBncm91cCBpcyBjb25zdW1pbmcgbW9yZSBDUFUgdGhhbiBhIHRhc2sgb2YgZXF1YWwKKwkJICogd2VpZ2h0LiBBIHRhc2sgd2l0aCBhIHdlaWdodCBlcXVhbHMgdG8gdGctPnNoYXJlcyB3aWxsIGhhdmUKKwkJICogYSBsb2FkIGxlc3Mgb3IgZXF1YWwgdG8gc2NhbGVfbG9hZF9kb3duKHRnLT5zaGFyZXMpLgorCQkgKiBTaW1pbGFybHksIHRoZSBzY2hlZF9lbnRpdGllcyB0aGF0IHJlcHJlc2VudCB0aGUgdGFzayBncm91cAorCQkgKiBhdCBwYXJlbnQgbGV2ZWwsIGNhbid0IGhhdmUgYSBsb2FkIGhpZ2hlciB0aGFuCisJCSAqIHNjYWxlX2xvYWRfZG93bih0Zy0+c2hhcmVzKS4gQW5kIHRoZSBTdW0gb2Ygc2NoZWRfZW50aXRpZXMnCisJCSAqIGxvYWQgbXVzdCBiZSA8PSBzY2FsZV9sb2FkX2Rvd24odGctPnNoYXJlcykuCisJCSAqLworCQlpZiAodGdfbG9hZCA+IHNjYWxlX2xvYWRfZG93bihnY2ZzX3JxLT50Zy0+c2hhcmVzKSkgeworCQkJLyogc2NhbGUgZ2Nmc19ycSdzIGxvYWQgaW50byB0ZydzIHNoYXJlcyovCisJCQlsb2FkICo9IHNjYWxlX2xvYWRfZG93bihnY2ZzX3JxLT50Zy0+c2hhcmVzKTsKKwkJCWxvYWQgLz0gdGdfbG9hZDsKKwkJfQorCX0KKworCWRlbHRhID0gbG9hZCAtIHNlLT5hdmcubG9hZF9hdmc7CisKKwkvKiBOb3RoaW5nIHRvIHVwZGF0ZSAqLworCWlmICghZGVsdGEpCisJCXJldHVybjsKKworCS8qIFNldCBuZXcgc2NoZWRfZW50aXR5J3MgbG9hZCAqLworCXNlLT5hdmcubG9hZF9hdmcgPSBsb2FkOworCXNlLT5hdmcubG9hZF9zdW0gPSBzZS0+YXZnLmxvYWRfYXZnICogTE9BRF9BVkdfTUFYOworCisJLyogVXBkYXRlIHBhcmVudCBjZnNfcnEgbG9hZCAqLworCWFkZF9wb3NpdGl2ZSgmY2ZzX3JxLT5hdmcubG9hZF9hdmcsIGRlbHRhKTsKKwljZnNfcnEtPmF2Zy5sb2FkX3N1bSA9IGNmc19ycS0+YXZnLmxvYWRfYXZnICogTE9BRF9BVkdfTUFYOworCisJLyoKKwkgKiBJZiB0aGUgc2NoZWRfZW50aXR5IGlzIGFscmVhZHkgZW5xdWV1ZWQsIHdlIGFsc28gaGF2ZSB0byB1cGRhdGUgdGhlCisJICogcnVubmFibGUgbG9hZCBhdmcuCisJICovCisJaWYgKHNlLT5vbl9ycSkgeworCQkvKiBVcGRhdGUgcGFyZW50IGNmc19ycSBydW5uYWJsZV9sb2FkX2F2ZyAqLworCQlhZGRfcG9zaXRpdmUoJmNmc19ycS0+cnVubmFibGVfbG9hZF9hdmcsIGRlbHRhKTsKKwkJY2ZzX3JxLT5ydW5uYWJsZV9sb2FkX3N1bSA9IGNmc19ycS0+cnVubmFibGVfbG9hZF9hdmcgKiBMT0FEX0FWR19NQVg7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RnX2Nmc19wcm9wYWdhdGUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQoreworCWNmc19ycS0+cHJvcGFnYXRlX2F2ZyA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NsZWFyX3RnX2Nmc19wcm9wYWdhdGUoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCit7CisJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gZ3JvdXBfY2ZzX3JxKHNlKTsKKworCWlmICghY2ZzX3JxLT5wcm9wYWdhdGVfYXZnKQorCQlyZXR1cm4gMDsKKworCWNmc19ycS0+cHJvcGFnYXRlX2F2ZyA9IDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFVwZGF0ZSB0YXNrIGFuZCBpdHMgY2ZzX3JxIGxvYWQgYXZlcmFnZSAqLworc3RhdGljIGlubGluZSBpbnQgcHJvcGFnYXRlX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7CisKKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKQorCQlyZXR1cm4gMDsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfdGdfY2ZzX3Byb3BhZ2F0ZShzZSkpCisJCXJldHVybiAwOworCisJY2ZzX3JxID0gY2ZzX3JxX29mKHNlKTsKKworCXNldF90Z19jZnNfcHJvcGFnYXRlKGNmc19ycSk7CisKKwl1cGRhdGVfdGdfY2ZzX3V0aWwoY2ZzX3JxLCBzZSk7CisJdXBkYXRlX3RnX2Nmc19sb2FkKGNmc19ycSwgc2UpOworCisJcmV0dXJuIDE7Cit9CisKICNlbHNlIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfdGdfbG9hZF9hdmcoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBpbnQgZm9yY2UpIHt9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb3BhZ2F0ZV9lbnRpdHlfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGdfY2ZzX3Byb3BhZ2F0ZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpIHt9CisKICNlbmRpZiAvKiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2ZzX3JxX3V0aWxfY2hhbmdlKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKQEAgLTMxMTMsNiArMzMwNCw3IEBACiAJCXN1Yl9wb3NpdGl2ZSgmc2EtPmxvYWRfYXZnLCByKTsKIAkJc3ViX3Bvc2l0aXZlKCZzYS0+bG9hZF9zdW0sIHIgKiBMT0FEX0FWR19NQVgpOwogCQlyZW1vdmVkX2xvYWQgPSAxOworCQlzZXRfdGdfY2ZzX3Byb3BhZ2F0ZShjZnNfcnEpOwogCX0KIAogCWlmIChhdG9taWNfbG9uZ19yZWFkKCZjZnNfcnEtPnJlbW92ZWRfdXRpbF9hdmcpKSB7CkBAIC0zMTIwLDYgKzMzMTIsNyBAQAogCQlzdWJfcG9zaXRpdmUoJnNhLT51dGlsX2F2Zywgcik7CiAJCXN1Yl9wb3NpdGl2ZSgmc2EtPnV0aWxfc3VtLCByICogTE9BRF9BVkdfTUFYKTsKIAkJcmVtb3ZlZF91dGlsID0gMTsKKwkJc2V0X3RnX2Nmc19wcm9wYWdhdGUoY2ZzX3JxKTsKIAl9CiAKIAlkZWNheWVkID0gX191cGRhdGVfbG9hZF9hdmcobm93LCBjcHVfb2YocnFfb2YoY2ZzX3JxKSksIHNhLApAQCAtMzEzMywzMSArMzMyNiw0NiBAQAogCWlmICh1cGRhdGVfZnJlcSAmJiAoZGVjYXllZCB8fCByZW1vdmVkX3V0aWwpKQogCQljZnNfcnFfdXRpbF9jaGFuZ2UoY2ZzX3JxKTsKIAorCS8qIFRyYWNlIENQVSBsb2FkLCB1bmxlc3MgY2ZzX3JxIGJlbG9uZ3MgdG8gYSBub24tcm9vdCB0YXNrX2dyb3VwICovCisJaWYgKGNmc19ycSA9PSAmcnFfb2YoY2ZzX3JxKS0+Y2ZzKQorCQl0cmFjZV9zY2hlZF9sb2FkX2F2Z19jcHUoY3B1X29mKHJxX29mKGNmc19ycSkpLCBjZnNfcnEpOworCiAJcmV0dXJuIGRlY2F5ZWQgfHwgcmVtb3ZlZF9sb2FkOwogfQogCisvKgorICogT3B0aW9uYWwgYWN0aW9uIHRvIGJlIGRvbmUgd2hpbGUgdXBkYXRpbmcgdGhlIGxvYWQgYXZlcmFnZQorICovCisjZGVmaW5lIFVQREFURV9URwkweDEKKyNkZWZpbmUgU0tJUF9BR0VfTE9BRAkweDIKKwogLyogVXBkYXRlIHRhc2sgYW5kIGl0cyBjZnNfcnEgbG9hZCBhdmVyYWdlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2xvYWRfYXZnKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgdXBkYXRlX3RnKQorc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9sb2FkX2F2ZyhzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CiAJdTY0IG5vdyA9IGNmc19ycV9jbG9ja190YXNrKGNmc19ycSk7CiAJc3RydWN0IHJxICpycSA9IHJxX29mKGNmc19ycSk7CiAJaW50IGNwdSA9IGNwdV9vZihycSk7CisJaW50IGRlY2F5ZWQ7CiAKIAkvKgogCSAqIFRyYWNrIHRhc2sgbG9hZCBhdmVyYWdlIGZvciBjYXJyeWluZyBpdCB0byBuZXcgQ1BVIGFmdGVyIG1pZ3JhdGVkLCBhbmQKIAkgKiB0cmFjayBncm91cCBzY2hlZF9lbnRpdHkgbG9hZCBhdmVyYWdlIGZvciB0YXNrX2hfbG9hZCBjYWxjIGluIG1pZ3JhdGlvbgogCSAqLwotCV9fdXBkYXRlX2xvYWRfYXZnKG5vdywgY3B1LCAmc2UtPmF2ZywKKwlpZiAoc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lICYmICEoZmxhZ3MgJiBTS0lQX0FHRV9MT0FEKSkgeworCQlfX3VwZGF0ZV9sb2FkX2F2Zyhub3csIGNwdSwgJnNlLT5hdmcsCiAJCQkgIHNlLT5vbl9ycSAqIHNjYWxlX2xvYWRfZG93bihzZS0+bG9hZC53ZWlnaHQpLAogCQkJICBjZnNfcnEtPmN1cnIgPT0gc2UsIE5VTEwpOworCX0KIAotCWlmICh1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCB0cnVlKSAmJiB1cGRhdGVfdGcpCisJZGVjYXllZCAgPSB1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCB0cnVlKTsKKwlkZWNheWVkIHw9IHByb3BhZ2F0ZV9lbnRpdHlfbG9hZF9hdmcoc2UpOworCisJaWYgKGRlY2F5ZWQgJiYgKGZsYWdzICYgVVBEQVRFX1RHKSkKIAkJdXBkYXRlX3RnX2xvYWRfYXZnKGNmc19ycSwgMCk7CiAKIAlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKQogCQl0cmFjZV9zY2hlZF9sb2FkX2F2Z190YXNrKHRhc2tfb2Yoc2UpLCAmc2UtPmF2Zyk7Ci0JdHJhY2Vfc2NoZWRfbG9hZF9hdmdfY3B1KGNwdSwgY2ZzX3JxKTsKIH0KIAogLyoqCkBAIC0zMTcwLDMxICszMzc4LDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0dGFjaF9lbnRpdHlfbG9hZF9hdmcoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKLQlpZiAoIXNjaGVkX2ZlYXQoQVRUQUNIX0FHRV9MT0FEKSkKLQkJZ290byBza2lwX2FnaW5nOwotCi0JLyoKLQkgKiBJZiB3ZSBnb3QgbWlncmF0ZWQgKGVpdGhlciBiZXR3ZWVuIENQVXMgb3IgYmV0d2VlbiBjZ3JvdXBzKSB3ZSdsbAotCSAqIGhhdmUgYWdlZCB0aGUgYXZlcmFnZSByaWdodCBiZWZvcmUgY2xlYXJpbmcgQGxhc3RfdXBkYXRlX3RpbWUuCi0JICoKLQkgKiBPciB3ZSdyZSBmcmVzaCB0aHJvdWdoIHBvc3RfaW5pdF9lbnRpdHlfdXRpbF9hdmcoKS4KLQkgKi8KLQlpZiAoc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lKSB7Ci0JCV9fdXBkYXRlX2xvYWRfYXZnKGNmc19ycS0+YXZnLmxhc3RfdXBkYXRlX3RpbWUsIGNwdV9vZihycV9vZihjZnNfcnEpKSwKLQkJCQkgICZzZS0+YXZnLCAwLCAwLCBOVUxMKTsKLQotCQkvKgotCQkgKiBYWFg6IHdlIGNvdWxkIGhhdmUganVzdCBhZ2VkIHRoZSBlbnRpcmUgbG9hZCBhd2F5IGlmIHdlJ3ZlIGJlZW4KLQkJICogYWJzZW50IGZyb20gdGhlIGZhaXIgY2xhc3MgZm9yIHRvbyBsb25nLgotCQkgKi8KLQl9Ci0KLXNraXBfYWdpbmc6CiAJc2UtPmF2Zy5sYXN0X3VwZGF0ZV90aW1lID0gY2ZzX3JxLT5hdmcubGFzdF91cGRhdGVfdGltZTsKIAljZnNfcnEtPmF2Zy5sb2FkX2F2ZyArPSBzZS0+YXZnLmxvYWRfYXZnOwogCWNmc19ycS0+YXZnLmxvYWRfc3VtICs9IHNlLT5hdmcubG9hZF9zdW07CiAJY2ZzX3JxLT5hdmcudXRpbF9hdmcgKz0gc2UtPmF2Zy51dGlsX2F2ZzsKIAljZnNfcnEtPmF2Zy51dGlsX3N1bSArPSBzZS0+YXZnLnV0aWxfc3VtOworCXNldF90Z19jZnNfcHJvcGFnYXRlKGNmc19ycSk7CiAKIAljZnNfcnFfdXRpbF9jaGFuZ2UoY2ZzX3JxKTsKIH0KQEAgLTMyMDksMTQgKzMzOTgsMTIgQEAKICAqLwogc3RhdGljIHZvaWQgZGV0YWNoX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewotCV9fdXBkYXRlX2xvYWRfYXZnKGNmc19ycS0+YXZnLmxhc3RfdXBkYXRlX3RpbWUsIGNwdV9vZihycV9vZihjZnNfcnEpKSwKLQkJCSAgJnNlLT5hdmcsIHNlLT5vbl9ycSAqIHNjYWxlX2xvYWRfZG93bihzZS0+bG9hZC53ZWlnaHQpLAotCQkJICBjZnNfcnEtPmN1cnIgPT0gc2UsIE5VTEwpOwogCiAJc3ViX3Bvc2l0aXZlKCZjZnNfcnEtPmF2Zy5sb2FkX2F2Zywgc2UtPmF2Zy5sb2FkX2F2Zyk7CiAJc3ViX3Bvc2l0aXZlKCZjZnNfcnEtPmF2Zy5sb2FkX3N1bSwgc2UtPmF2Zy5sb2FkX3N1bSk7CiAJc3ViX3Bvc2l0aXZlKCZjZnNfcnEtPmF2Zy51dGlsX2F2Zywgc2UtPmF2Zy51dGlsX2F2Zyk7CiAJc3ViX3Bvc2l0aXZlKCZjZnNfcnEtPmF2Zy51dGlsX3N1bSwgc2UtPmF2Zy51dGlsX3N1bSk7CisJc2V0X3RnX2Nmc19wcm9wYWdhdGUoY2ZzX3JxKTsKIAogCWNmc19ycV91dGlsX2NoYW5nZShjZnNfcnEpOwogfQpAQCAtMzIyNiwzNCArMzQxMywyMCBAQAogZW5xdWV1ZV9lbnRpdHlfbG9hZF9hdmcoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfYXZnICpzYSA9ICZzZS0+YXZnOwotCXU2NCBub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhjZnNfcnEpOwotCWludCBtaWdyYXRlZCwgZGVjYXllZDsKLQotCW1pZ3JhdGVkID0gIXNhLT5sYXN0X3VwZGF0ZV90aW1lOwotCWlmICghbWlncmF0ZWQpIHsKLQkJX191cGRhdGVfbG9hZF9hdmcobm93LCBjcHVfb2YocnFfb2YoY2ZzX3JxKSksIHNhLAotCQkJc2UtPm9uX3JxICogc2NhbGVfbG9hZF9kb3duKHNlLT5sb2FkLndlaWdodCksCi0JCQljZnNfcnEtPmN1cnIgPT0gc2UsIE5VTEwpOwotCX0KLQotCWRlY2F5ZWQgPSB1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCAhbWlncmF0ZWQpOwogCiAJY2ZzX3JxLT5ydW5uYWJsZV9sb2FkX2F2ZyArPSBzYS0+bG9hZF9hdmc7CiAJY2ZzX3JxLT5ydW5uYWJsZV9sb2FkX3N1bSArPSBzYS0+bG9hZF9zdW07CiAKLQlpZiAobWlncmF0ZWQpCisJaWYgKCFzYS0+bGFzdF91cGRhdGVfdGltZSkgewogCQlhdHRhY2hfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwotCi0JaWYgKGRlY2F5ZWQgfHwgbWlncmF0ZWQpCiAJCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIDApOworCX0KIH0KIAogLyogUmVtb3ZlIHRoZSBydW5uYWJsZSBsb2FkIGdlbmVyYXRlZCBieSBzZSBmcm9tIGNmc19ycSdzIHJ1bm5hYmxlIGxvYWQgYXZlcmFnZSAqLwogc3RhdGljIGlubGluZSB2b2lkCiBkZXF1ZXVlX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewotCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMSk7Ci0KIAljZnNfcnEtPnJ1bm5hYmxlX2xvYWRfYXZnID0KIAkJbWF4X3QobG9uZywgY2ZzX3JxLT5ydW5uYWJsZV9sb2FkX2F2ZyAtIHNlLT5hdmcubG9hZF9hdmcsIDApOwogCWNmc19ycS0+cnVubmFibGVfbG9hZF9zdW0gPQpAQCAtMzI4MiwxMyArMzQ1NSwyNSBAQAogI2VuZGlmCiAKIC8qCisgKiBTeW5jaHJvbml6ZSBlbnRpdHkgbG9hZCBhdmcgb2YgZGVxdWV1ZWQgZW50aXR5IHdpdGhvdXQgbG9ja2luZworICogdGhlIHByZXZpb3VzIHJxLgorICovCit2b2lkIHN5bmNfZW50aXR5X2xvYWRfYXZnKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQoreworCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CisJdTY0IGxhc3RfdXBkYXRlX3RpbWU7CisKKwlsYXN0X3VwZGF0ZV90aW1lID0gY2ZzX3JxX2xhc3RfdXBkYXRlX3RpbWUoY2ZzX3JxKTsKKwlfX3VwZGF0ZV9sb2FkX2F2ZyhsYXN0X3VwZGF0ZV90aW1lLCBjcHVfb2YocnFfb2YoY2ZzX3JxKSksICZzZS0+YXZnLCAwLCAwLCBOVUxMKTsKK30KKworLyoKICAqIFRhc2sgZmlyc3QgY2F0Y2hlcyB1cCB3aXRoIGNmc19ycSwgYW5kIHRoZW4gc3VidHJhY3QKICAqIGl0c2VsZiBmcm9tIHRoZSBjZnNfcnEgKHRhc2sgbXVzdCBiZSBvZmYgdGhlIHF1ZXVlIG5vdykuCiAgKi8KIHZvaWQgcmVtb3ZlX2VudGl0eV9sb2FkX2F2ZyhzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKIHsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCXU2NCBsYXN0X3VwZGF0ZV90aW1lOwogCiAJLyoKIAkgKiB0YXNrcyBjYW5ub3QgZXhpdCB3aXRob3V0IGhhdmluZyBnb25lIHRocm91Z2ggd2FrZV91cF9uZXdfdGFzaygpIC0+CkBAIC0zMzAwLDkgKzM0ODUsNyBAQAogCSAqIGNhbGxzIHRoaXMuCiAJICovCiAKLQlsYXN0X3VwZGF0ZV90aW1lID0gY2ZzX3JxX2xhc3RfdXBkYXRlX3RpbWUoY2ZzX3JxKTsKLQotCV9fdXBkYXRlX2xvYWRfYXZnKGxhc3RfdXBkYXRlX3RpbWUsIGNwdV9vZihycV9vZihjZnNfcnEpKSwgJnNlLT5hdmcsIDAsIDAsIE5VTEwpOworCXN5bmNfZW50aXR5X2xvYWRfYXZnKHNlKTsKIAlhdG9taWNfbG9uZ19hZGQoc2UtPmF2Zy5sb2FkX2F2ZywgJmNmc19ycS0+cmVtb3ZlZF9sb2FkX2F2Zyk7CiAJYXRvbWljX2xvbmdfYWRkKHNlLT5hdmcudXRpbF9hdmcsICZjZnNfcnEtPnJlbW92ZWRfdXRpbF9hdmcpOwogfQpAQCAtMzMyNyw3ICszNTEwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBub3RfdXNlZCkKKyNkZWZpbmUgVVBEQVRFX1RHCTB4MAorI2RlZmluZSBTS0lQX0FHRV9MT0FECTB4MAorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2xvYWRfYXZnKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgbm90X3VzZWQxKQogewogCWNwdWZyZXFfdXBkYXRlX3V0aWwocnFfb2YoY2ZzX3JxX29mKHNlKSksIDApOwogfQpAQCAtMzQ3Miw5ICszNjU4LDE4IEBACiAJaWYgKHJlbm9ybSAmJiAhY3VycikKIAkJc2UtPnZydW50aW1lICs9IGNmc19ycS0+bWluX3ZydW50aW1lOwogCisJLyoKKwkgKiBXaGVuIGVucXVldWluZyBhIHNjaGVkX2VudGl0eSwgd2UgbXVzdDoKKwkgKiAgIC0gVXBkYXRlIGxvYWRzIHRvIGhhdmUgYm90aCBlbnRpdHkgYW5kIGNmc19ycSBzeW5jZWQgd2l0aCBub3cuCisJICogICAtIEFkZCBpdHMgbG9hZCB0byBjZnNfcnEtPnJ1bm5hYmxlX2F2ZworCSAqICAgLSBGb3IgZ3JvdXBfZW50aXR5LCB1cGRhdGUgaXRzIHdlaWdodCB0byByZWZsZWN0IHRoZSBuZXcgc2hhcmUgb2YKKwkgKiAgICAgaXRzIGdyb3VwIGNmc19ycQorCSAqICAgLSBBZGQgaXRzIG5ldyB3ZWlnaHQgdG8gY2ZzX3JxLT5sb2FkLndlaWdodAorCSAqLworCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgVVBEQVRFX1RHKTsKIAllbnF1ZXVlX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKKwl1cGRhdGVfY2ZzX3NoYXJlcyhzZSk7CiAJYWNjb3VudF9lbnRpdHlfZW5xdWV1ZShjZnNfcnEsIHNlKTsKLQl1cGRhdGVfY2ZzX3NoYXJlcyhjZnNfcnEpOwogCiAJaWYgKGZsYWdzICYgRU5RVUVVRV9XQUtFVVApCiAJCXBsYWNlX2VudGl0eShjZnNfcnEsIHNlLCAwKTsKQEAgLTM1NDYsNiArMzc0MSwxNiBAQAogCSAqIFVwZGF0ZSBydW4tdGltZSBzdGF0aXN0aWNzIG9mIHRoZSAnY3VycmVudCcuCiAJICovCiAJdXBkYXRlX2N1cnIoY2ZzX3JxKTsKKworCS8qCisJICogV2hlbiBkZXF1ZXVpbmcgYSBzY2hlZF9lbnRpdHksIHdlIG11c3Q6CisJICogICAtIFVwZGF0ZSBsb2FkcyB0byBoYXZlIGJvdGggZW50aXR5IGFuZCBjZnNfcnEgc3luY2VkIHdpdGggbm93LgorCSAqICAgLSBTdWJzdHJhY3QgaXRzIGxvYWQgZnJvbSB0aGUgY2ZzX3JxLT5ydW5uYWJsZV9hdmcuCisJICogICAtIFN1YnN0cmFjdCBpdHMgcHJldmlvdXMgd2VpZ2h0IGZyb20gY2ZzX3JxLT5sb2FkLndlaWdodC4KKwkgKiAgIC0gRm9yIGdyb3VwIGVudGl0eSwgdXBkYXRlIGl0cyB3ZWlnaHQgdG8gcmVmbGVjdCB0aGUgbmV3IHNoYXJlCisJICogICAgIG9mIGl0cyBncm91cCBjZnNfcnEuCisJICovCisJdXBkYXRlX2xvYWRfYXZnKHNlLCBVUERBVEVfVEcpOwogCWRlcXVldWVfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwogCiAJdXBkYXRlX3N0YXRzX2RlcXVldWUoY2ZzX3JxLCBzZSwgZmxhZ3MpOwpAQCAtMzU2OSw3ICszNzc0LDcgQEAKIAkvKiByZXR1cm4gZXhjZXNzIHJ1bnRpbWUgb24gbGFzdCBkZXF1ZXVlICovCiAJcmV0dXJuX2Nmc19ycV9ydW50aW1lKGNmc19ycSk7CiAKLQl1cGRhdGVfY2ZzX3NoYXJlcyhjZnNfcnEpOworCXVwZGF0ZV9jZnNfc2hhcmVzKHNlKTsKIAogCS8qCiAJICogTm93IGFkdmFuY2UgbWluX3ZydW50aW1lIGlmIEBzZSB3YXMgdGhlIGVudGl0eSBob2xkaW5nIGl0IGJhY2ssCkBAIC0zNjMzLDcgKzM4MzgsNyBAQAogCQkgKi8KIAkJdXBkYXRlX3N0YXRzX3dhaXRfZW5kKGNmc19ycSwgc2UpOwogCQlfX2RlcXVldWVfZW50aXR5KGNmc19ycSwgc2UpOwotCQl1cGRhdGVfbG9hZF9hdmcoc2UsIDEpOworCQl1cGRhdGVfbG9hZF9hdmcoc2UsIFVQREFURV9URyk7CiAJfQogCiAJdXBkYXRlX3N0YXRzX2N1cnJfc3RhcnQoY2ZzX3JxLCBzZSk7CkBAIC0zNzUxLDggKzM5NTYsOCBAQAogCS8qCiAJICogRW5zdXJlIHRoYXQgcnVubmFibGUgYXZlcmFnZSBpcyBwZXJpb2RpY2FsbHkgdXBkYXRlZC4KIAkgKi8KLQl1cGRhdGVfbG9hZF9hdmcoY3VyciwgMSk7Ci0JdXBkYXRlX2Nmc19zaGFyZXMoY2ZzX3JxKTsKKwl1cGRhdGVfbG9hZF9hdmcoY3VyciwgVVBEQVRFX1RHKTsKKwl1cGRhdGVfY2ZzX3NoYXJlcyhjdXJyKTsKIAogI2lmZGVmIENPTkZJR19TQ0hFRF9IUlRJQ0sKIAkvKgpAQCAtNDYxNCw5ICs0ODE5LDkgQEAKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYXBhY2l0eV9vcmlnX29mKGludCBjcHUpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X3V0aWwoaW50IGNwdSk7Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYm9vc3RlZF9jcHVfdXRpbChpbnQgY3B1KTsKK3Vuc2lnbmVkIGxvbmcgYm9vc3RlZF9jcHVfdXRpbChpbnQgY3B1KTsKICNlbHNlCi0jZGVmaW5lIGJvb3N0ZWRfY3B1X3V0aWwoY3B1KSBjcHVfdXRpbChjcHUpCisjZGVmaW5lIGJvb3N0ZWRfY3B1X3V0aWwoY3B1KSBjcHVfdXRpbF9mcmVxKGNwdSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDY4OCw4ICs0ODkzLDggQEAKIAkJaWYgKGNmc19ycV90aHJvdHRsZWQoY2ZzX3JxKSkKIAkJCWJyZWFrOwogCi0JCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMSk7Ci0JCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CisJCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgVVBEQVRFX1RHKTsKKwkJdXBkYXRlX2Nmc19zaGFyZXMoc2UpOwogCX0KIAogCWlmICghc2UpIHsKQEAgLTQ2OTksNiArNDkwNCwyNSBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCisJLyoKKwkgKiBVcGRhdGUgU2NoZWRUdW5lIGFjY291bnRpbmcuCisJICoKKwkgKiBXZSBkbyBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIENQVSBjYXBhY2l0eSB0byBlbnN1cmUgdGhlCisJICogYm9vc3QgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGFzayBpcyBhY2NvdW50ZWQgZm9yIGluIHRoZQorCSAqIHNlbGVjdGlvbiBvZiB0aGUgT1BQLgorCSAqCisJICogV2UgZG8gaXQgYWxzbyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSBlbnF1ZXVlIGEgdGhyb3R0bGVkIHRhc2s7CisJICogd2UgY291bGQgYXJndWUgdGhhdCBhIHRocm90dGxlZCB0YXNrIHNob3VsZCBub3QgYm9vc3QgYSBDUFUsCisJICogaG93ZXZlcjoKKwkgKiBhKSBwcm9wZXJseSBpbXBsZW1lbnRpbmcgQ1BVIGJvb3N0aW5nIGNvbnNpZGVyaW5nIHRocm90dGxlZAorCSAqICAgIHRhc2tzIHdpbGwgaW5jcmVhc2UgYSBsb3QgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHNvbHV0aW9uCisJICogYikgaXQncyBub3QgZWFzeSB0byBxdWFudGlmeSB0aGUgYmVuZWZpdHMgaW50cm9kdWNlZCBieQorCSAqICAgIHN1Y2ggYSBtb3JlIGNvbXBsZXggc29sdXRpb24uCisJICogVGh1cywgZm9yIHRoZSB0aW1lIGJlaW5nIHdlIGdvIGZvciB0aGUgc2ltcGxlIHNvbHV0aW9uIGFuZCBib29zdAorCSAqIGFsc28gZm9yIHRocm90dGxlZCBSUXMuCisJICovCisJc2NoZWR0dW5lX2VucXVldWVfdGFzayhwLCBjcHVfb2YocnEpKTsKKwogCWlmICghc2UpIHsKIAkJaWYgKCF0YXNrX25ldyAmJiAhcnEtPnJkLT5vdmVydXRpbGl6ZWQgJiYKIAkJICAgIGNwdV9vdmVydXRpbGl6ZWQocnEtPmNwdSkpIHsKQEAgLTQ3MTcsOSArNDk0MSw2IEBACiAJCQl1cGRhdGVfY2FwYWNpdHlfb2YoY3B1X29mKHJxKSk7CiAJfQogCi0JLyogVXBkYXRlIFNjaGVkVHVuZSBhY2NvdXRpbmcgKi8KLQlzY2hlZHR1bmVfZW5xdWV1ZV90YXNrKHAsIGNwdV9vZihycSkpOwotCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCWhydGlja191cGRhdGUocnEpOwogfQpAQCAtNDc3NSw4ICs0OTk2LDggQEAKIAkJaWYgKGNmc19ycV90aHJvdHRsZWQoY2ZzX3JxKSkKIAkJCWJyZWFrOwogCi0JCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMSk7Ci0JCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CisJCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgVVBEQVRFX1RHKTsKKwkJdXBkYXRlX2Nmc19zaGFyZXMoc2UpOwogCX0KIAogCWlmICghc2UpIHsKQEAgLTQ3ODYsNiArNTAwNywxNSBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCisJLyoKKwkgKiBVcGRhdGUgU2NoZWRUdW5lIGFjY291bnRpbmcKKwkgKgorCSAqIFdlIGRvIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQ1BVIGNhcGFjaXR5IHRvIGVuc3VyZSB0aGUKKwkgKiBib29zdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0YXNrIGlzIGFjY291bnRlZCBmb3IgaW4gdGhlCisJICogc2VsZWN0aW9uIG9mIHRoZSBPUFAuCisJICovCisJc2NoZWR0dW5lX2RlcXVldWVfdGFzayhwLCBjcHVfb2YocnEpKTsKKwogCWlmICghc2UpIHsKIAkJaWYgKHJxLT5jZnMubnJfcnVubmluZykKIAkJCXVwZGF0ZV9jYXBhY2l0eV9vZihjcHVfb2YocnEpKTsKQEAgLTQ3OTMsOSArNTAyMyw2IEBACiAJCQlzZXRfY2ZzX2NwdV9jYXBhY2l0eShjcHVfb2YocnEpLCBmYWxzZSwgMCk7CiAJfQogCi0JLyogVXBkYXRlIFNjaGVkVHVuZSBhY2NvdXRpbmcgKi8KLQlzY2hlZHR1bmVfZGVxdWV1ZV90YXNrKHAsIGNwdV9vZihycSkpOwotCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAJaHJ0aWNrX3VwZGF0ZShycSk7CkBAIC00ODA3LDYgKzUwMzQsMTkgQEAKIERFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIGxvYWRfYmFsYW5jZV9tYXNrKTsKIERFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIHNlbGVjdF9pZGxlX21hc2spOwogCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCitzdGF0aWMgaW50IHJvdGF0ZV9jcHVfc3RhcnQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJvdGF0ZV9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF2b2lkX3ByZXZfY3B1X2xhc3Q7CisKK3N0YXRpYyBzdHJ1Y3QgZmluZF9maXJzdF9jcHVfYml0X2VudiBmaXJzdF9jcHVfYml0X2VudiA9IHsKKwkuYXZvaWRfcHJldl9jcHVfbGFzdCA9ICZhdm9pZF9wcmV2X2NwdV9sYXN0LAorCS5yb3RhdGVfY3B1X3N0YXJ0ID0gJnJvdGF0ZV9jcHVfc3RhcnQsCisJLmludGVydmFsID0gSFosCisJLnJvdGF0ZV9sb2NrID0gJnJvdGF0ZV9sb2NrLAorfTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX05PX0haX0NPTU1PTgogLyoKICAqIHBlciBycSAnbG9hZCcgYXJycmF5IGNyYXA7IFhYWCBraWxsIHRoaXMuCkBAIC01NDMxLDEwICs1NjcxLDEwIEBACiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IHNnZS0+bnJfY2FwX3N0YXRlczsgaWR4KyspIHsKIAkJaWYgKHNnZS0+Y2FwX3N0YXRlc1tpZHhdLmNhcCA+PSB1dGlsKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gaWR4OwogCX0KIAotCXJldHVybiBpZHg7CisJcmV0dXJuIChzZ2UtPm5yX2NhcF9zdGF0ZXMgLSAxKTsKIH0KIAogc3RhdGljIGludCBmaW5kX25ld19jYXBhY2l0eShzdHJ1Y3QgZW5lcmd5X2VudiAqZWVudiwKQEAgLTU0NDksOSArNTY4OSwxMSBAQAogCXJldHVybiBpZHg7CiB9CiAKLXN0YXRpYyBpbnQgZ3JvdXBfaWRsZV9zdGF0ZShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnKQorc3RhdGljIGludCBncm91cF9pZGxlX3N0YXRlKHN0cnVjdCBlbmVyZ3lfZW52ICplZW52LCBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnKQogewogCWludCBpLCBzdGF0ZSA9IElOVF9NQVg7CisJaW50IHNyY19pbl9ncnAsIGRzdF9pbl9ncnA7CisJbG9uZyBncnBfdXRpbCA9IDA7CiAKIAkvKiBGaW5kIHRoZSBzaGFsbG93ZXN0IGlkbGUgc3RhdGUgaW4gdGhlIHNjaGVkIGdyb3VwLiAqLwogCWZvcl9lYWNoX2NwdShpLCBzY2hlZF9ncm91cF9jcHVzKHNnKSkKQEAgLTU0NjMsNiArNTcwNSw1NCBAQAogCS8qIFRha2Ugbm9uLWNwdWlkbGUgaWRsaW5nIGludG8gYWNjb3VudCAoYWN0aXZlIGlkbGUvYXJjaF9jcHVfaWRsZSgpKSAqLwogCXN0YXRlKys7CiAKKwkvKgorCSAqIFRyeSB0byBlc3RpbWF0ZSBpZiBhIGRlZXBlciBpZGxlIHN0YXRlIGlzCisJICogYWNoaWV2YWJsZSB3aGVuIHdlIG1vdmUgdGhlIHRhc2suCisJICovCisJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2dyb3VwX2NwdXMoc2cpKQorCQlncnBfdXRpbCArPSBjcHVfdXRpbChpKTsKKworCXNyY19pbl9ncnAgPSBjcHVtYXNrX3Rlc3RfY3B1KGVlbnYtPnNyY19jcHUsIHNjaGVkX2dyb3VwX2NwdXMoc2cpKTsKKwlkc3RfaW5fZ3JwID0gY3B1bWFza190ZXN0X2NwdShlZW52LT5kc3RfY3B1LCBzY2hlZF9ncm91cF9jcHVzKHNnKSk7CisJaWYgKHNyY19pbl9ncnAgPT0gZHN0X2luX2dycCkgeworCQkvKiBib3RoIENQVXMgdW5kZXIgY29uc2lkZXJhdGlvbiBhcmUgaW4gdGhlIHNhbWUgZ3JvdXAgb3Igbm90IGluCisJCSAqIGVpdGhlciBncm91cCwgbWlncmF0aW9uIHNob3VsZCBsZWF2ZSBpZGxlIHN0YXRlIHRoZSBzYW1lLgorCQkgKi8KKwkJZ290byBlbmQ7CisJfQorCS8qIGFkZCBvciByZW1vdmUgdXRpbCBhcyBhcHByb3ByaWF0ZSB0byBpbmRpY2F0ZSB3aGF0IGdyb3VwIHV0aWwKKwkgKiB3aWxsIGJlICh3b3JzdCBjYXNlIC0gbm8gY29uY3VycmVudCBleGVjdXRpb24pIGFmdGVyIG1vdmluZyB0aGUgdGFzaworCSAqLworCWdycF91dGlsICs9IHNyY19pbl9ncnAgPyAtZWVudi0+dXRpbF9kZWx0YSA6IGVlbnYtPnV0aWxfZGVsdGE7CisKKwlpZiAoZ3JwX3V0aWwgPD0KKwkJKChsb25nKXNnLT5zZ2MtPm1heF9jYXBhY2l0eSAqIChpbnQpc2ctPmdyb3VwX3dlaWdodCkpIHsKKwkJLyogYWZ0ZXIgbW92aW5nLCB0aGlzIGdyb3VwIGlzIGF0IG1vc3QgcGFydGx5CisJCSAqIG9jY3VwaWVkLCBzbyBpdCBzaG91bGQgaGF2ZSBzb21lIGlkbGUgdGltZS4KKwkJICovCisJCWludCBtYXhfaWRsZV9zdGF0ZV9pZHggPSBzZy0+c2dlLT5ucl9pZGxlX3N0YXRlcyAtIDI7CisJCWludCBuZXdfc3RhdGUgPSBncnBfdXRpbCAqIG1heF9pZGxlX3N0YXRlX2lkeDsKKwkJaWYgKGdycF91dGlsIDw9IDApCisJCQkvKiBncm91cCB3aWxsIGhhdmUgbm8gdXRpbCwgdXNlIGxvd2VzdCBzdGF0ZSAqLworCQkJbmV3X3N0YXRlID0gbWF4X2lkbGVfc3RhdGVfaWR4ICsgMTsKKwkJZWxzZSB7CisJCQkvKiBmb3IgcGFydGlhbGx5IGlkbGUsIGxpbmVhcmx5IG1hcCB1dGlsIHRvIGlkbGUKKwkJCSAqIHN0YXRlcywgZXhjbHVkaW5nIHRoZSBsb3dlc3Qgb25lLiBUaGlzIGRvZXMgbm90CisJCQkgKiBjb3JyZXNwb25kIHRvIHRoZSBzdGF0ZSB3ZSBleHBlY3QgdG8gZW50ZXIgaW4KKwkJCSAqIHJlYWxpdHksIGJ1dCBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgbWlnaHQgaGFwcGVuLgorCQkJICovCisJCQluZXdfc3RhdGUgPSBtaW4obWF4X2lkbGVfc3RhdGVfaWR4LCAoaW50KQorCQkJCQkobmV3X3N0YXRlIC8gc2ctPnNnYy0+bWF4X2NhcGFjaXR5KSk7CisJCQluZXdfc3RhdGUgPSBtYXhfaWRsZV9zdGF0ZV9pZHggLSBuZXdfc3RhdGU7CisJCX0KKwkJc3RhdGUgPSBuZXdfc3RhdGU7CisJfSBlbHNlIHsKKwkJLyogQWZ0ZXIgbW92aW5nLCB0aGUgZ3JvdXAgd2lsbCBiZSBmdWxseSBvY2N1cGllZAorCQkgKiBzbyBhc3N1bWUgaXQgd2lsbCBub3QgYmUgaWRsZSBhdCBhbGwuCisJCSAqLworCQlzdGF0ZSA9IDA7CisJfQorZW5kOgogCXJldHVybiBzdGF0ZTsKIH0KIApAQCAtNTQ5OSwxNSArNTc4OSw3IEBACiAJCSAqLwogCQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX3NjcywgY3B1KSk7CiAKLQkJaWYgKCFzZCkKLQkJCS8qCi0JCQkgKiBXZSBtb3N0IHByb2JhYmx5IHJhY2VkIHdpdGggaG90cGx1ZzsgcmV0dXJuaW5nIGEKLQkJCSAqIHdyb25nIGVuZXJneSBlc3RpbWF0aW9uIGlzIGJldHRlciB0aGFuIGVudGVyaW5nIGFuCi0JCQkgKiBpbmZpbml0ZSBsb29wLgotCQkJICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoc2QtPnBhcmVudCkKKwkJaWYgKHNkICYmIHNkLT5wYXJlbnQpCiAJCQlzZ19zaGFyZWRfY2FwID0gc2QtPnBhcmVudC0+Z3JvdXBzOwogCiAJCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CkBAIC01NTQ0LDcgKzU4MjYsNyBAQAogCQkJCQl9CiAJCQkJfQogCi0JCQkJaWRsZV9pZHggPSBncm91cF9pZGxlX3N0YXRlKHNnKTsKKwkJCQlpZGxlX2lkeCA9IGdyb3VwX2lkbGVfc3RhdGUoZWVudiwgc2cpOwogCQkJCWlmICh1bmxpa2VseShpZGxlX2lkeCA8IDApKQogCQkJCQlyZXR1cm4gaWRsZV9pZHg7CiAKQEAgLTU1NzcsNiArNTg1OSwxNCBAQAogCiAJCQl9IHdoaWxlIChzZyA9IHNnLT5uZXh0LCBzZyAhPSBzZC0+Z3JvdXBzKTsKIAkJfQorCisJCS8qCisJCSAqIElmIHdlIHJhY2VkIHdpdGggaG90cGx1ZyBhbmQgZ290IGFuIHNkIE5VTEwtcG9pbnRlcjsKKwkJICogcmV0dXJuaW5nIGEgd3JvbmcgZW5lcmd5IGVzdGltYXRpb24gaXMgYmV0dGVyIHRoYW4KKwkJICogZW50ZXJpbmcgYW4gaW5maW5pdGUgbG9vcC4KKwkJICovCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnZpc2l0X2NwdXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiBuZXh0X2NwdToKIAkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmdmlzaXRfY3B1cyk7CiAJCWNvbnRpbnVlOwpAQCAtNTYwMyw2ICs1ODkzLDcgQEAKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwogCWludCBzZF9jcHUgPSAtMSwgZW5lcmd5X2JlZm9yZSA9IDAsIGVuZXJneV9hZnRlciA9IDA7CisJaW50IGRpZmYsIG1hcmdpbjsKIAogCXN0cnVjdCBlbmVyZ3lfZW52IGVlbnZfYmVmb3JlID0gewogCQkudXRpbF9kZWx0YQk9IDAsCkBAIC01NjQ3LDEyICs1OTM4LDIyIEBACiAJZWVudi0+bnJnLmFmdGVyID0gZW5lcmd5X2FmdGVyOwogCWVlbnYtPm5yZy5kaWZmID0gZWVudi0+bnJnLmFmdGVyIC0gZWVudi0+bnJnLmJlZm9yZTsKIAllZW52LT5wYXlvZmYgPSAwOwotCisjaWZuZGVmIENPTkZJR19TQ0hFRF9UVU5FCiAJdHJhY2Vfc2NoZWRfZW5lcmd5X2RpZmYoZWVudi0+dGFzaywKIAkJCWVlbnYtPnNyY19jcHUsIGVlbnYtPmRzdF9jcHUsIGVlbnYtPnV0aWxfZGVsdGEsCiAJCQllZW52LT5ucmcuYmVmb3JlLCBlZW52LT5ucmcuYWZ0ZXIsIGVlbnYtPm5yZy5kaWZmLAogCQkJZWVudi0+Y2FwLmJlZm9yZSwgZWVudi0+Y2FwLmFmdGVyLCBlZW52LT5jYXAuZGVsdGEsCiAJCQllZW52LT5ucmcuZGVsdGEsIGVlbnYtPnBheW9mZik7CisjZW5kaWYKKwkvKgorCSAqIERlYWQtem9uZSBtYXJnaW4gcHJldmVudGluZyB0b28gbWFueSBtaWdyYXRpb25zLgorCSAqLworCisJbWFyZ2luID0gZWVudi0+bnJnLmJlZm9yZSA+PiA2OyAvKiB+MS41NiUgKi8KKworCWRpZmYgPSBlZW52LT5ucmcuYWZ0ZXIgLSBlZW52LT5ucmcuYmVmb3JlOworCisJZWVudi0+bnJnLmRpZmYgPSAoYWJzKGRpZmYpIDwgbWFyZ2luKSA/IDAgOiBlZW52LT5ucmcuZGlmZjsKIAogCXJldHVybiBlZW52LT5ucmcuZGlmZjsKIH0KQEAgLTU2NjAsMjMgKzU5NjEsMzAgQEAKICNpZmRlZiBDT05GSUdfU0NIRURfVFVORQogCiBzdHJ1Y3QgdGFyZ2V0X25yZyBzY2hlZHR1bmVfdGFyZ2V0X25yZzsKLQorZXh0ZXJuIGJvb2wgc2NoZWR0dW5lX2luaXRpYWxpemVkOwogLyoKICAqIFN5c3RlbSBlbmVyZ3kgbm9ybWFsaXphdGlvbgotICogUmV0dXJucyB0aGUgbm9ybWFsaXplZCB2YWx1ZSwgaW4gdGhlIHJhbmdlIFswLi5TQ0hFRF9MT0FEX1NDQUxFXSwKKyAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgdmFsdWUsIGluIHRoZSByYW5nZSBbMC4uU0NIRURfQ0FQQUNJVFlfU0NBTEVdLAogICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVuZXJneSB2YXJpYXRpb24uCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBub3JtYWxpemVfZW5lcmd5KGludCBlbmVyZ3lfZGlmZikKIHsKIAl1MzIgbm9ybWFsaXplZF9ucmc7CisKKwkvKiBkdXJpbmcgZWFybHkgc2V0dXAsIHdlIGRvbid0IGtub3cgdGhlIGV4dGVudHMgKi8KKwlpZiAodW5saWtlbHkoIXNjaGVkdHVuZV9pbml0aWFsaXplZCkpCisJCXJldHVybiBlbmVyZ3lfZGlmZiA8IDAgPyAtMSA6IDEgOworCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisJewogCWludCBtYXhfZGVsdGE7CiAKIAkvKiBDaGVjayBmb3IgYm91bmRhcmllcyAqLwogCW1heF9kZWx0YSAgPSBzY2hlZHR1bmVfdGFyZ2V0X25yZy5tYXhfcG93ZXI7CiAJbWF4X2RlbHRhIC09IHNjaGVkdHVuZV90YXJnZXRfbnJnLm1pbl9wb3dlcjsKIAlXQVJOX09OKGFicyhlbmVyZ3lfZGlmZikgPj0gbWF4X2RlbHRhKTsKKwl9CiAjZW5kaWYKIAogCS8qIERvIHNjYWxpbmcgdXNpbmcgcG9zaXRpdmUgbnVtYmVycyB0byBpbmNyZWFzZSB0aGUgcmFuZ2UgKi8KQEAgLTU2OTUsMTggKzYwMDMsMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBlbmVyZ3lfZGlmZihzdHJ1Y3QgZW5lcmd5X2VudiAqZWVudikKIHsKLQl1bnNpZ25lZCBpbnQgYm9vc3Q7CisJaW50IGJvb3N0ID0gc2NoZWR0dW5lX3Rhc2tfYm9vc3QoZWVudi0+dGFzayk7CiAJaW50IG5yZ19kZWx0YTsKIAogCS8qIENvbnB1dGUgImFic29sdXRlIiBlbmVyZ3kgZGlmZiAqLwogCV9fZW5lcmd5X2RpZmYoZWVudik7CiAKIAkvKiBSZXR1cm4gZW5lcmd5IGRpZmYgd2hlbiBib29zdCBtYXJnaW4gaXMgMCAqLwotI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRURUVU5FCi0JYm9vc3QgPSBzY2hlZHR1bmVfdGFza19ib29zdChlZW52LT50YXNrKTsKLSNlbHNlCi0JYm9vc3QgPSBnZXRfc3lzY3RsX3NjaGVkX2Nmc19ib29zdCgpOwotI2VuZGlmCiAJaWYgKGJvb3N0ID09IDApCiAJCXJldHVybiBlZW52LT5ucmcuZGlmZjsKIApAQCAtNTcxOSw2ICs2MDIyLDEyIEBACiAJCQllZW52LT5jYXAuZGVsdGEsCiAJCQllZW52LT50YXNrKTsKIAorCXRyYWNlX3NjaGVkX2VuZXJneV9kaWZmKGVlbnYtPnRhc2ssCisJCQllZW52LT5zcmNfY3B1LCBlZW52LT5kc3RfY3B1LCBlZW52LT51dGlsX2RlbHRhLAorCQkJZWVudi0+bnJnLmJlZm9yZSwgZWVudi0+bnJnLmFmdGVyLCBlZW52LT5ucmcuZGlmZiwKKwkJCWVlbnYtPmNhcC5iZWZvcmUsIGVlbnYtPmNhcC5hZnRlciwgZWVudi0+Y2FwLmRlbHRhLAorCQkJZWVudi0+bnJnLmRlbHRhLCBlZW52LT5wYXlvZmYpOworCiAJLyoKIAkgKiBXaGVuIFNjaGVkVHVuZSBpcyBlbmFibGVkLCB0aGUgZW5lcmd5X2RpZmYoKSBmdW5jdGlvbiB3aWxsIHJldHVybgogCSAqIHRoZSBjb21wdXRlZCBlbmVyZ3kgcGF5b2ZmIHZhbHVlLiBTaW5jZSB0aGUgZW5lcmd5X2RpZmYoKSByZXR1cm4KQEAgLTU4NjUsMTkgKzYxNzQsMjEgQEAKIAlyZXR1cm4gX190YXNrX2ZpdHMocCwgY3B1LCBjcHVfdXRpbChjcHUpKTsKIH0KIAotc3RhdGljIGJvb2wgX19jcHVfb3ZlcnV0aWxpemVkKGludCBjcHUsIGludCBkZWx0YSkKK2Jvb2wgX19jcHVfb3ZlcnV0aWxpemVkKGludCBjcHUsIHVuc2lnbmVkIGxvbmcgdXRpbCkKIHsKLQlyZXR1cm4gKGNhcGFjaXR5X29yaWdfb2YoY3B1KSAqIDEwMjQpIDwKLQkgICAgICAgKChjcHVfdXRpbChjcHUpICsgZGVsdGEpICogc3lzY3RsX3NjaGVkX2NhcGFjaXR5X21hcmdpbik7CisJcmV0dXJuIChjYXBhY2l0eV9vcmlnX29mKGNwdSkgKiAxMDI0IDwKKwkJdXRpbCAqIHN5c2N0bF9zY2hlZF9jYXBhY2l0eV9tYXJnaW4pOwogfQogCiBib29sIGNwdV9vdmVydXRpbGl6ZWQoaW50IGNwdSkKIHsKLQlyZXR1cm4gX19jcHVfb3ZlcnV0aWxpemVkKGNwdSwgMCk7CisJcmV0dXJuIF9fY3B1X292ZXJ1dGlsaXplZChjcHUsIGNwdV91dGlsKGNwdSkpOwogfQogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1RVTkUKIAorc3RydWN0IHJlY2lwcm9jYWxfdmFsdWUgc2NoZWR0dW5lX3NwY19yZGl2OworCiBzdGF0aWMgbG9uZwogc2NoZWR0dW5lX21hcmdpbih1bnNpZ25lZCBsb25nIHNpZ25hbCwgbG9uZyBib29zdCkKIHsKQEAgLTU4ODgsMzAgKzYxOTksMTYgQEAKIAkgKgogCSAqIFRoZSBCb29zdCAoQikgdmFsdWUgaXMgdXNlZCB0byBjb21wdXRlIGEgTWFyZ2luIChNKSB3aGljaCBpcwogCSAqIHByb3BvcnRpb25hbCB0byB0aGUgY29tcGxlbWVudCBvZiB0aGUgb3JpZ2luYWwgU2lnbmFsIChTKToKLQkgKiAgIE0gPSBCICogKFNDSEVEX0xPQURfU0NBTEUgLSBTKSwgaWYgQiBpcyBwb3NpdGl2ZQotCSAqICAgTSA9IEIgKiBTLCBpZiBCIGlzIG5lZ2F0aXZlCisJICogICBNID0gQiAqIChTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSAtIFMpCiAJICogVGhlIG9idGFpbmVkIE0gY291bGQgYmUgdXNlZCBieSB0aGUgY2FsbGVyIHRvICJib29zdCIgUy4KIAkgKi8KLQogCWlmIChib29zdCA+PSAwKSB7CiAJCW1hcmdpbiAgPSBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSAtIHNpZ25hbDsKIAkJbWFyZ2luICo9IGJvb3N0OwogCX0gZWxzZQogCQltYXJnaW4gPSAtc2lnbmFsICogYm9vc3Q7Ci0JLyoKLQkgKiBGYXN0IGludGVnZXIgZGl2aXNpb24gYnkgY29uc3RhbnQ6Ci0JICogIENvbnN0YW50ICAgOiAgICAgICAgICAgICAgICAgKEMpID0gMTAwCi0JICogIFByZWNpc2lvbiAgOiAwLjElICAgICAgICAgICAgKFApID0gMC4xCi0JICogIFJlZmVyZW5jZSAgOiBDICogMTAwIC8gUCAgICAgKFIpID0gMTAwMDAwCi0JICoKLQkgKiBUaHVzOgotCSAqICBTaGlmdCBiaXRzIDogY2VpbChsb2coUiwyKSkgIChTKSA9IDE3Ci0JICogIE11bHQgY29uc3QgOiByb3VuZCgyXlMvQykgICAgKE0pID0gMTMxMQotCSAqCi0JICoKLQkgKi8KLQltYXJnaW4gICo9IDEzMTE7Ci0JbWFyZ2luID4+PSAxNzsKKworCW1hcmdpbiAgPSByZWNpcHJvY2FsX2RpdmlkZShtYXJnaW4sIHNjaGVkdHVuZV9zcGNfcmRpdik7CiAKIAlpZiAoYm9vc3QgPCAwKQogCQltYXJnaW4gKj0gLTE7CkBAIC01OTIxLDEzICs2MjE4LDggQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBzY2hlZHR1bmVfY3B1X21hcmdpbih1bnNpZ25lZCBsb25nIHV0aWwsIGludCBjcHUpCiB7Ci0JaW50IGJvb3N0OworCWludCBib29zdCA9IHNjaGVkdHVuZV9jcHVfYm9vc3QoY3B1KTsKIAotI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRURUVU5FCi0JYm9vc3QgPSBzY2hlZHR1bmVfY3B1X2Jvb3N0KGNwdSk7Ci0jZWxzZQotCWJvb3N0ID0gZ2V0X3N5c2N0bF9zY2hlZF9jZnNfYm9vc3QoKTsKLSNlbmRpZgogCWlmIChib29zdCA9PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtNTkzNywxNSArNjIyOSwxMCBAQAogc3RhdGljIGlubGluZSBsb25nCiBzY2hlZHR1bmVfdGFza19tYXJnaW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWludCBib29zdDsKKwlpbnQgYm9vc3QgPSBzY2hlZHR1bmVfdGFza19ib29zdCh0YXNrKTsKIAl1bnNpZ25lZCBsb25nIHV0aWw7CiAJbG9uZyBtYXJnaW47CiAKLSNpZmRlZiBDT05GSUdfQ0dST1VQX1NDSEVEVFVORQotCWJvb3N0ID0gc2NoZWR0dW5lX3Rhc2tfYm9vc3QodGFzayk7Ci0jZWxzZQotCWJvb3N0ID0gZ2V0X3N5c2N0bF9zY2hlZF9jZnNfYm9vc3QoKTsKLSNlbmRpZgogCWlmIChib29zdCA9PSAwKQogCQlyZXR1cm4gMDsKIApAQCAtNTk3MSw3ICs2MjU4LDcgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9UVU5FICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordW5zaWduZWQgbG9uZwogYm9vc3RlZF9jcHVfdXRpbChpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgdXRpbCA9IGNwdV91dGlsX2ZyZXEoY3B1LCBOVUxMKTsKQEAgLTYzMTcsMjAgKzY2MDQsMjkgQEAKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwogCWludCBpID0gdGFza19jcHUocCk7Ci0JaW50IGJlc3RfaWRsZSA9IC0xOwotCWludCBiZXN0X2lkbGVfY3N0YXRlID0gLTE7Ci0JaW50IGJlc3RfaWRsZV9jYXBhY2l0eSA9IElOVF9NQVg7CisJaW50IGJlc3RfaWRsZV9jcHUgPSAtMTsKKwlpbnQgYmVzdF9pZGxlX2NzdGF0ZSA9IElOVF9NQVg7CisJdW5zaWduZWQgbG9uZyBiZXN0X2lkbGVfY2FwYWNpdHkgPSBVTE9OR19NQVg7CisKKwlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zaXNfYXR0ZW1wdHMpOworCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLT5lYXNfc3RhdHMuc2lzX2F0dGVtcHRzKTsKIAogCWlmICghc3lzY3RsX3NjaGVkX2NzdGF0ZV9hd2FyZSkgewotCQlpZiAoaWRsZV9jcHUodGFyZ2V0KSAmJiAhY3B1X2lzb2xhdGVkKHRhcmdldCkpCisJCWlmIChpZGxlX2NwdSh0YXJnZXQpICYmICFjcHVfaXNvbGF0ZWQodGFyZ2V0KSkgeworCQkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2lzX2lkbGUpOworCQkJc2NoZWRzdGF0X2luYyh0aGlzX3JxKCktPmVhc19zdGF0cy5zaXNfaWRsZSk7CiAJCQlyZXR1cm4gdGFyZ2V0OworCQl9CiAKIAkJLyoKIAkJICogSWYgdGhlIHByZXZvdXMgY3B1IGlzIGNhY2hlIGFmZmluZSBhbmQgaWRsZSwgZG9uJ3QgYmUgc3R1cGlkLgogCQkgKi8KIAkJaWYgKGkgIT0gdGFyZ2V0ICYmIGNwdXNfc2hhcmVfY2FjaGUoaSwgdGFyZ2V0KSAmJgotCQkJCWlkbGVfY3B1KGkpICYmICFjcHVfaXNvbGF0ZWQoaSkpCisJCQkJaWRsZV9jcHUoaSkgJiYgIWNwdV9pc29sYXRlZChpKSkgeworCQkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2lzX2NhY2hlX2FmZmluZSk7CisJCQlzY2hlZHN0YXRfaW5jKHRoaXNfcnEoKS0+ZWFzX3N0YXRzLnNpc19jYWNoZV9hZmZpbmUpOwogCQkJcmV0dXJuIGk7CisJCX0KIAogCQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgdGFyZ2V0KSk7CiAJCWlmICghc2QpCkBAIC02MzYzLDggKzY2NTksNyBAQAogCiAJCQlpZiAoc3lzY3RsX3NjaGVkX2NzdGF0ZV9hd2FyZSkgewogCQkJCWZvcl9lYWNoX2NwdV9hbmQoaSwgdHNrX2NwdXNfYWxsb3dlZChwKSwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpIHsKLQkJCQkJc3RydWN0IHJxICpycSA9IGNwdV9ycShpKTsKLQkJCQkJaW50IGlkbGVfaWR4ID0gaWRsZV9nZXRfc3RhdGVfaWR4KHJxKTsKKwkJCQkJaW50IGlkbGVfaWR4ID0gaWRsZV9nZXRfc3RhdGVfaWR4KGNwdV9ycShpKSk7CiAJCQkJCXVuc2lnbmVkIGxvbmcgbmV3X3VzYWdlID0gYm9vc3RlZF90YXNrX3V0aWwocCk7CiAJCQkJCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHlfb3JpZyA9IGNhcGFjaXR5X29yaWdfb2YoaSk7CiAKQEAgLTYzNzQsMTEgKzY2NjksMTYgQEAKIAkJCQkJaWYgKG5ld191c2FnZSA+IGNhcGFjaXR5X29yaWcgfHwgIWlkbGVfY3B1KGkpKQogCQkJCQkJZ290byBuZXh0OwogCi0JCQkJCWlmIChpID09IHRhcmdldCAmJiBuZXdfdXNhZ2UgPD0gY2FwYWNpdHlfY3Vycl9vZih0YXJnZXQpKQorCQkJCQlpZiAoaSA9PSB0YXJnZXQgJiYgbmV3X3VzYWdlIDw9IGNhcGFjaXR5X2N1cnJfb2YodGFyZ2V0KSkgeworCQkJCQkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2lzX3N1ZmZfY2FwKTsKKwkJCQkJCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLT5lYXNfc3RhdHMuc2lzX3N1ZmZfY2FwKTsKKwkJCQkJCXNjaGVkc3RhdF9pbmMoc2QtPmVhc19zdGF0cy5zaXNfc3VmZl9jYXApOwogCQkJCQkJcmV0dXJuIHRhcmdldDsKKwkJCQkJfQogCi0JCQkJCWlmIChiZXN0X2lkbGUgPCAwIHx8IChpZGxlX2lkeCA8IGJlc3RfaWRsZV9jc3RhdGUgJiYgY2FwYWNpdHlfb3JpZyA8PSBiZXN0X2lkbGVfY2FwYWNpdHkpKSB7Ci0JCQkJCQliZXN0X2lkbGUgPSBpOworCQkJCQlpZiAoaWRsZV9pZHggPCBiZXN0X2lkbGVfY3N0YXRlICYmCisJCQkJCSAgICBjYXBhY2l0eV9vcmlnIDw9IGJlc3RfaWRsZV9jYXBhY2l0eSkgeworCQkJCQkJYmVzdF9pZGxlX2NwdSA9IGk7CiAJCQkJCQliZXN0X2lkbGVfY3N0YXRlID0gaWRsZV9pZHg7CiAJCQkJCQliZXN0X2lkbGVfY2FwYWNpdHkgPSBjYXBhY2l0eV9vcmlnOwogCQkJCQl9CkBAIC02Mzk0LDE5ICs2Njk0LDI2IEBACiAKIAkJCQl0YXJnZXQgPSBjcHVtYXNrX2ZpcnN0X2FuZChzY2hlZF9ncm91cF9jcHVzKHNnKSwKIAkJCQkJdHNrX2NwdXNfYWxsb3dlZChwKSk7CisJCQkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc2lzX2lkbGVfY3B1KTsKKwkJCQlzY2hlZHN0YXRfaW5jKHRoaXNfcnEoKS0+ZWFzX3N0YXRzLnNpc19pZGxlX2NwdSk7CisJCQkJc2NoZWRzdGF0X2luYyhzZC0+ZWFzX3N0YXRzLnNpc19pZGxlX2NwdSk7CiAJCQkJZ290byBkb25lOwogCQkJfQogbmV4dDoKIAkJCXNnID0gc2ctPm5leHQ7CiAJCX0gd2hpbGUgKHNnICE9IHNkLT5ncm91cHMpOwogCX0KLQlpZiAoYmVzdF9pZGxlID4gMCkKLQkJdGFyZ2V0ID0gYmVzdF9pZGxlOworCisJaWYgKGJlc3RfaWRsZV9jcHUgPj0gMCkKKwkJdGFyZ2V0ID0gYmVzdF9pZGxlX2NwdTsKIAogZG9uZToKKwlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zaXNfY291bnQpOworCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLT5lYXNfc3RhdHMuc2lzX2NvdW50KTsKKwogCXJldHVybiB0YXJnZXQ7CiB9Ci0KKyAKIHN0YXRpYyBpbmxpbmUgaW50IGZpbmRfYmVzdF90YXJnZXQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBib29sIGJvb3N0ZWQsIGJvb2wgcHJlZmVyX2lkbGUpCiB7CiAJaW50IGl0ZXJfY3B1OwpAQCAtNjU4OSw3ICs2ODk2LDcgQEAKIAlpbnQgdGFyZ2V0X2NwdSwgdGFyZ2V0ZWRfY3B1cyA9IDA7CiAJdW5zaWduZWQgbG9uZyB0YXNrX3V0aWxfYm9vc3RlZCA9IDAsIGN1cnJfdXRpbCA9IDA7CiAJbG9uZyBuZXdfdXRpbCwgbmV3X3V0aWxfY3VtOwotCWludCBpOworCWludCBpID0gLTE7CiAJaW50IGVkaWZmID0gLTE7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlpbnQgbWluX3V0aWxfY3B1ID0gLTE7CkBAIC02NjA4LDggKzY5MTUsMTcgQEAKIAllbnVtIHNjaGVkX2Jvb3N0X3BvbGljeSBwbGFjZW1lbnRfYm9vc3QgPSB0YXNrX3NjaGVkX2Jvb3N0KHApID8KIAkJCQlzY2hlZF9ib29zdF9wb2xpY3koKSA6IFNDSEVEX0JPT1NUX05PTkU7CiAJc3RydWN0IHJlbGF0ZWRfdGhyZWFkX2dyb3VwICpncnA7CisJY3B1bWFza190IHNlYXJjaF9jcHVzOworCWludCBwcmV2X2NwdSA9IHRhc2tfY3B1KHApOworI2lmZGVmIENPTkZJR19TQ0hFRF9DT1JFX1JPVEFURQorCWJvb2wgZG9fcm90YXRlID0gZmFsc2U7CisJYm9vbCBhdm9pZF9wcmV2X2NwdSA9IGZhbHNlOworI2Vsc2UKKyNkZWZpbmUgZG9fcm90YXRlIGZhbHNlCisjZGVmaW5lIGF2b2lkX3ByZXZfY3B1IGZhbHNlCisjZW5kaWYKIAotCXNkID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfZWEsIHRhc2tfY3B1KHApKSk7CisJc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9lYSwgcHJldl9jcHUpKTsKIAogCWlmICghc2QpCiAJCXJldHVybiB0YXJnZXQ7CkBAIC02NjI4LDcgKzY5NDQsNyBAQAogCQlydGdfdGFyZ2V0ID0gJmdycC0+cHJlZmVycmVkX2NsdXN0ZXItPmNwdXM7CiAKIAlpZiAoc3luYyAmJiBiaWFzX3RvX3dha2VyX2NwdShwLCBjcHUsIHJ0Z190YXJnZXQpKSB7Ci0JCXRyYWNlX3NjaGVkX3Rhc2tfdXRpbF9iaWFzX3RvX3dha2VyKHAsIHRhc2tfY3B1KHApLAorCQl0cmFjZV9zY2hlZF90YXNrX3V0aWxfYmlhc190b193YWtlcihwLCBwcmV2X2NwdSwKIAkJCQkJdGFza191dGlsKHApLCBjcHUsIGNwdSwgMCwgbmVlZF9pZGxlKTsKIAkJcmV0dXJuIGNwdTsKIAl9CkBAIC02NjkxLDE4ICs3MDA3LDM0IEBACiAKIAkJdGFyZ2V0X2NwdSA9IC0xOwogCisJCWNwdW1hc2tfY29weSgmc2VhcmNoX2NwdXMsIHRza19jcHVzX2FsbG93ZWQocCkpOworCQljcHVtYXNrX2FuZCgmc2VhcmNoX2NwdXMsICZzZWFyY2hfY3B1cywKKwkJCSAgICBzY2hlZF9ncm91cF9jcHVzKHNnX3RhcmdldCkpOworCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCisJCWkgPSBmaW5kX2ZpcnN0X2NwdV9iaXQocCwgJnNlYXJjaF9jcHVzLCBzZ190YXJnZXQsCisJCQkJICAgICAgICZhdm9pZF9wcmV2X2NwdSwgJmRvX3JvdGF0ZSwKKwkJCQkgICAgICAgJmZpcnN0X2NwdV9iaXRfZW52KTsKKworcmV0cnk6CisjZW5kaWYKIAkJLyogRmluZCBjcHUgd2l0aCBzdWZmaWNpZW50IGNhcGFjaXR5ICovCi0JCWZvcl9lYWNoX2NwdV9hbmQoaSwgdHNrX2NwdXNfYWxsb3dlZChwKSwgc2NoZWRfZ3JvdXBfY3B1cyhzZ190YXJnZXQpKSB7CisJCXdoaWxlICgoaSA9IGNwdW1hc2tfbmV4dChpLCAmc2VhcmNoX2NwdXMpKSA8IG5yX2NwdV9pZHMpIHsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGksICZzZWFyY2hfY3B1cyk7CisKIAkJCWlmIChjcHVfaXNvbGF0ZWQoaSkpCiAJCQkJY29udGludWU7CiAKIAkJCWlmIChpc29sYXRlZF9jYW5kaWRhdGUgPT0gLTEpCiAJCQkJaXNvbGF0ZWRfY2FuZGlkYXRlID0gaTsKIAorCQkJaWYgKGF2b2lkX3ByZXZfY3B1ICYmIGkgPT0gcHJldl9jcHUpCisJCQkJY29udGludWU7CisKIAkJCWlmIChpc19yZXNlcnZlZChpKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKHNjaGVkX2NwdV9oaWdoX2lycWxvYWQoY3B1KSkKKwkJCWlmIChzY2hlZF9jcHVfaGlnaF9pcnFsb2FkKGkpKQogCQkJCWNvbnRpbnVlOwogCiAJCQkvKgpAQCAtNjc1MCw3ICs3MDgyLDcgQEAKIAkJCWNwdV9pZGxlX2lkeCA9IGlkbGVfZ2V0X3N0YXRlX2lkeChjcHVfcnEoaSkpOwogCiAJCQlpZiAoIW5lZWRfaWRsZSAmJgotCQkJICAgIGFkZF9jYXBhY2l0eV9tYXJnaW4obmV3X3V0aWxfY3VtKSA8CisJCQkgICAgYWRkX2NhcGFjaXR5X21hcmdpbihuZXdfdXRpbF9jdW0sIGkpIDwKIAkJCSAgICBjYXBhY2l0eV9jdXJyX29mKGkpKSB7CiAJCQkJaWYgKHN5c2N0bF9zY2hlZF9jc3RhdGVfYXdhcmUpIHsKIAkJCQkJaWYgKGNwdV9pZGxlX2lkeCA8IG1pbl9pZGxlX2lkeCkgewpAQCAtNjc2Nyw5ICs3MDk5LDkgQEAKIAkJCQkJCSAgICBuZXdfdXRpbCB8fAogCQkJCQkJICAgICh0YXJnZXRfY3B1X3V0aWwgPT0KIAkJCQkJCSAgICAgbmV3X3V0aWwgJiYKLQkJCQkJCSAgICAgKGkgPT0gdGFza19jcHUocCkgfHwKKwkJCQkJCSAgICAgKGkgPT0gcHJldl9jcHUgfHwKIAkJCQkJCSAgICAgICh0YXJnZXRfY3B1ICE9Ci0JCQkJCQkgICAgICAgdGFza19jcHUocCkgJiYKKwkJCQkJCSAgICAgICBwcmV2X2NwdSAmJgogCQkJCQkJICAgICAgIHRhcmdldF9jcHVfbmV3X3V0aWxfY3VtID4KIAkJCQkJCSAgICAgICBuZXdfdXRpbF9jdW0pKSkpKSB7CiAJCQkJCQltaW5faWRsZV9pZHhfY3B1ID0gaTsKQEAgLTY3ODEsNiArNzExMyw5IEBACiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKGNwdV9ycShpKS0+bnJfcnVubmluZykgewogCQkJCQl0YXJnZXRfY3B1ID0gaTsKKyNpZmRlZiBDT05GSUdfU0NIRURfQ09SRV9ST1RBVEUKKwkJCQkJZG9fcm90YXRlID0gZmFsc2U7CisjZW5kaWYKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfSBlbHNlIGlmICghbmVlZF9pZGxlKSB7CkBAIC02ODIwLDYgKzcxNTUsMTkgQEAKIAkJCX0KIAkJfQogCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCisJCWlmIChkb19yb3RhdGUpIHsKKwkJCS8qCisJCQkgKiBXZSBzdGFydGVkIGl0ZXJhdGlvbiBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZgorCQkJICogY3B1bWFzay4gIEl0ZXJhdGUgb25jZSBhZ2FpbiBmcm9tIGJpdCAwIHRvIHRoZQorCQkJICogcHJldmlvdXMgc3RhcnRpbmcgcG9pbnQgYml0LgorCQkJICovCisJCQlkb19yb3RhdGUgPSBmYWxzZTsKKwkJCWkgPSAtMTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKyNlbmRpZgorCiAJCWlmICh0YXJnZXRfY3B1ID09IC0xIHx8CiAJCSAgICAodGFyZ2V0X2NwdSAhPSBtaW5fdXRpbF9jcHUgJiYgIXNhZmVfdG9fcGFjayAmJgogCQkgICAgICFpc19wYWNraW5nX2VsaWdpYmxlKHAsIHRhc2tfdXRpbF9ib29zdGVkLCBzZ190YXJnZXQsCkBAIC02ODU0LDcgKzcyMDIsOCBAQAogCQl9CiAJfQogCi0JaWYgKHRhcmdldF9jcHUgIT0gdGFza19jcHUocCkgJiYgIWNwdV9pc29sYXRlZCh0YXNrX2NwdShwKSkpIHsKKwlpZiAodGFyZ2V0X2NwdSAhPSB0YXNrX2NwdShwKSAmJiAhYXZvaWRfcHJldl9jcHUgJiYKKwkgICAgIWNwdV9pc29sYXRlZCh0YXNrX2NwdShwKSkpIHsKIAkJc3RydWN0IGVuZXJneV9lbnYgZWVudiA9IHsKIAkJCS51dGlsX2RlbHRhCT0gdGFza191dGlsKHApLAogCQkJLnNyY19jcHUJPSB0YXNrX2NwdShwKSwKQEAgLTY4OTQsNyArNzI0Myw5IEBACiAJCXRhc2tfdXRpbF9ib29zdGVkID0gMDsKICNlbmRpZgogCQkvKiBOb3QgZW5vdWdoIHNwYXJlIGNhcGFjaXR5IG9uIHByZXZpb3VzIGNwdSAqLwotCQlpZiAoX19jcHVfb3ZlcnV0aWxpemVkKHRhc2tfY3B1KHApLCB0YXNrX3V0aWxfYm9vc3RlZCkpIHsKKwkJaWYgKF9fY3B1X292ZXJ1dGlsaXplZCh0YXNrX2NwdShwKSwKKwkJCQkgICAgICAgY3B1X3V0aWwodGFza19jcHUocCkpICsKKwkJCQkJCXRhc2tfdXRpbF9ib29zdGVkKSkgewogCQkJdHJhY2Vfc2NoZWRfdGFza191dGlsX292ZXJ1dGlsemVkKHAsIHRhc2tfY3B1KHApLAogCQkJCQkJdGFza191dGlsKHApLCB0YXJnZXRfY3B1LAogCQkJCQkJdGFyZ2V0X2NwdSwgMCwgbmVlZF9pZGxlKTsKQEAgLTgwNDYsNiArODM5NywxMCBAQAogCiAJCWlmICh1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKGNmc19ycV9jbG9ja190YXNrKGNmc19ycSksIGNmc19ycSwgdHJ1ZSkpCiAJCQl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCAwKTsKKworCQkvKiBQcm9wYWdhdGUgcGVuZGluZyBsb2FkIGNoYW5nZXMgdG8gdGhlIHBhcmVudCAqLworCQlpZiAoY2ZzX3JxLT50Zy0+c2VbY3B1XSkKKwkJCXVwZGF0ZV9sb2FkX2F2ZyhjZnNfcnEtPnRnLT5zZVtjcHVdLCAwKTsKIAl9CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiB9CkBAIC04MjcwLDcgKzg2MjUsNiBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2MtPmxvY2ssIGZsYWdzKTsKIAogc2tpcF91bmxvY2s6IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLQlzZGctPnNnYy0+bWF4X2NhcGFjaXR5ID0gY2FwYWNpdHk7CiAKIAljYXBhY2l0eSAqPSBzY2FsZV9ydF9jYXBhY2l0eShjcHUpOwogCWNhcGFjaXR5ID4+PSBTQ0hFRF9DQVBBQ0lUWV9TSElGVDsKQEAgLTgyODAsMTMgKzg2MzQsMTUgQEAKIAogCWNwdV9ycShjcHUpLT5jcHVfY2FwYWNpdHkgPSBjYXBhY2l0eTsKIAlzZGctPnNnYy0+Y2FwYWNpdHkgPSBjYXBhY2l0eTsKKwlzZGctPnNnYy0+bWF4X2NhcGFjaXR5ID0gY2FwYWNpdHk7CisJc2RnLT5zZ2MtPm1pbl9jYXBhY2l0eSA9IGNhcGFjaXR5OwogfQogCiB2b2lkIHVwZGF0ZV9ncm91cF9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZCA9IHNkLT5jaGlsZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwLCAqc2RnID0gc2QtPmdyb3VwczsKLQl1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCBtYXhfY2FwYWNpdHk7CisJdW5zaWduZWQgbG9uZyBjYXBhY2l0eSwgbWF4X2NhcGFjaXR5LCBtaW5fY2FwYWNpdHk7CiAJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKIAogCWludGVydmFsID0gbXNlY3NfdG9famlmZmllcyhzZC0+YmFsYW5jZV9pbnRlcnZhbCk7CkBAIC04MzAwLDYgKzg2NTYsNyBAQAogCiAJY2FwYWNpdHkgPSAwOwogCW1heF9jYXBhY2l0eSA9IDA7CisJbWluX2NhcGFjaXR5ID0gVUxPTkdfTUFYOwogCiAJaWYgKGNoaWxkLT5mbGFncyAmIFNEX09WRVJMQVApIHsKIAkJLyoKQEAgLTgzMzIsNiArODY4OSw3IEBACiAJCQl9CiAKIAkJCW1heF9jYXBhY2l0eSA9IG1heChjYXBhY2l0eSwgbWF4X2NhcGFjaXR5KTsKKwkJCW1pbl9jYXBhY2l0eSA9IG1pbihjYXBhY2l0eSwgbWluX2NhcGFjaXR5KTsKIAkJfQogCX0gZWxzZSAgewogCQkvKgpAQCAtODM0OCw2ICs4NzA2LDcgQEAKIAkJCWlmICghY3B1X2lzb2xhdGVkKGNwdW1hc2tfZmlyc3QoY3B1cykpKSB7CiAJCQkJY2FwYWNpdHkgKz0gc2djLT5jYXBhY2l0eTsKIAkJCQltYXhfY2FwYWNpdHkgPSBtYXgoc2djLT5tYXhfY2FwYWNpdHksIG1heF9jYXBhY2l0eSk7CisJCQkJbWluX2NhcGFjaXR5ID0gbWluKHNnYy0+bWluX2NhcGFjaXR5LCBtaW5fY2FwYWNpdHkpOwogCQkJfQogCQkJZ3JvdXAgPSBncm91cC0+bmV4dDsKIAkJfSB3aGlsZSAoZ3JvdXAgIT0gY2hpbGQtPmdyb3Vwcyk7CkBAIC04MzU1LDYgKzg3MTQsNyBAQAogCiAJc2RnLT5zZ2MtPmNhcGFjaXR5ID0gY2FwYWNpdHk7CiAJc2RnLT5zZ2MtPm1heF9jYXBhY2l0eSA9IG1heF9jYXBhY2l0eTsKKwlzZGctPnNnYy0+bWluX2NhcGFjaXR5ID0gbWluX2NhcGFjaXR5OwogfQogCiAvKgpAQCAtODU5OCw2ICs4OTU4LDE2IEBACiAJaWYgKHNncy0+YXZnX2xvYWQgPD0gYnVzaWVzdC0+YXZnX2xvYWQpCiAJCXJldHVybiBmYWxzZTsKIAorCWlmICghKGVudi0+c2QtPmZsYWdzICYgU0RfQVNZTV9DUFVDQVBBQ0lUWSkpCisJCWdvdG8gYXN5bV9wYWNraW5nOworCisJLyoKKwkgKiBDYW5kaWRhdGUgc2cgaGFzIG5vIG1vcmUgdGhhbiBvbmUgdGFzayBwZXIgQ1BVIGFuZAorCSAqIGhhcyBoaWdoZXIgcGVyLUNQVSBjYXBhY2l0eS4gTWlncmF0aW5nIHRhc2tzIHRvIGxlc3MKKwkgKiBjYXBhYmxlIENQVXMgbWF5IGhhcm0gdGhyb3VnaHB1dC4gTWF4aW1pemUgdGhyb3VnaHB1dCwKKwkgKiBwb3dlci9lbmVyZ3kgY29uc2VxdWVuY2VzIGFyZSBub3QgY29uc2lkZXJlZC4KKwkgKi8KKwogCS8qCiAJICogQ2FuZGlhdGUgc2cgaGFzIG5vIG1vcmUgdGhhbiBvbmUgdGFzayBwZXIgY3B1IGFuZCBoYXMgaGlnaGVyCiAJICogcGVyLWNwdSBjYXBhY2l0eS4gTm8gcmVhc29uIHRvIHB1bGwgdGFza3MgdG8gbGVzcyBjYXBhYmxlIGNwdXMuCkBAIC04NjA2LDYgKzg5NzYsNyBAQAogCSAgICBncm91cF9zbWFsbGVyX2NwdV9jYXBhY2l0eShzZHMtPmxvY2FsLCBzZykpCiAJCXJldHVybiBmYWxzZTsKIAorYXN5bV9wYWNraW5nOgogCS8qIFRoaXMgaXMgdGhlIGJ1c2llc3Qgbm9kZSBpbiBpdHMgY2xhc3MuICovCiAJaWYgKCEoZW52LT5zZC0+ZmxhZ3MgJiBTRF9BU1lNX1BBQ0tJTkcpKQogCQlyZXR1cm4gdHJ1ZTsKQEAgLTg2NjAsNiArOTAzMSw5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX05VTUFfQkFMQU5DSU5HICovCiAKKyNkZWZpbmUgbGJfc2RfcGFyZW50KHNkKSBcCisJKHNkLT5wYXJlbnQgJiYgc2QtPnBhcmVudC0+Z3JvdXBzICE9IHNkLT5wYXJlbnQtPmdyb3Vwcy0+bmV4dCkKKwogLyoqCiAgKiB1cGRhdGVfc2RfbGJfc3RhdHMgLSBVcGRhdGUgc2NoZWRfZG9tYWluJ3Mgc3RhdGlzdGljcyBmb3IgbG9hZCBiYWxhbmNpbmcuCiAgKiBAZW52OiBUaGUgbG9hZCBiYWxhbmNpbmcgZW52aXJvbm1lbnQuCkBAIC04NzQ0LDcgKzkxMTgsNyBAQAogCiAJZW52LT5zcmNfZ3JwX25yX3J1bm5pbmcgPSBzZHMtPmJ1c2llc3Rfc3RhdC5zdW1fbnJfcnVubmluZzsKIAotCWlmICghZW52LT5zZC0+cGFyZW50KSB7CisJaWYgKCFsYl9zZF9wYXJlbnQoZW52LT5zZCkpIHsKIAkJLyogdXBkYXRlIG92ZXJsb2FkIGluZGljYXRvciBpZiB3ZSBhcmUgYXQgcm9vdCBkb21haW4gKi8KIAkJaWYgKGVudi0+ZHN0X3JxLT5yZC0+b3ZlcmxvYWQgIT0gb3ZlcmxvYWQpCiAJCQllbnYtPmRzdF9ycS0+cmQtPm92ZXJsb2FkID0gb3ZlcmxvYWQ7CkBAIC0xMDI0Niw4ICsxMDYyMCwxMyBAQAogCWlmICh0aW1lX2JlZm9yZShub3csIG5vaHoubmV4dF9iYWxhbmNlKSkKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKHJxLT5ucl9ydW5uaW5nID49IDIgJiYKKwkgICAgKCFlbmVyZ3lfYXdhcmUoKSB8fCBjcHVfb3ZlcnV0aWxpemVkKGNwdSkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIERvIGlkbGUgbG9hZCBiYWxhbmNlIGlmIHRoZXJlIGhhdmUgbWlzZml0IHRhc2sgKi8KIAlpZiAoZW5lcmd5X2F3YXJlKCkpCi0JCXJldHVybiBycS0+bnJfcnVubmluZyA+PSAyICYmIGNwdV9vdmVydXRpbGl6ZWQoY3B1KTsKKwkJcmV0dXJuIHJxLT5taXNmaXRfdGFzazsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlzZHMgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9sbGNfc2hhcmVkLCBjcHUpKTsKQEAgLTEwNDc1LDExICsxMDg1NCw2NSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECisvKgorICogUHJvcGFnYXRlIHRoZSBjaGFuZ2VzIG9mIHRoZSBzY2hlZF9lbnRpdHkgYWNyb3NzIHRoZSB0ZyB0cmVlIHRvIG1ha2UgaXQKKyAqIHZpc2libGUgdG8gdGhlIHJvb3QKKyAqLworc3RhdGljIHZvaWQgcHJvcGFnYXRlX2VudGl0eV9jZnNfcnEoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCit7CisJc3RydWN0IGNmc19ycSAqY2ZzX3JxOworCisJLyogU3RhcnQgdG8gcHJvcGFnYXRlIGF0IHBhcmVudCAqLworCXNlID0gc2UtPnBhcmVudDsKKworCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkgeworCQljZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOworCisJCWlmIChjZnNfcnFfdGhyb3R0bGVkKGNmc19ycSkpCisJCQlicmVhazsKKworCQl1cGRhdGVfbG9hZF9hdmcoc2UsIFVQREFURV9URyk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHByb3BhZ2F0ZV9lbnRpdHlfY2ZzX3JxKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXRhY2hfZW50aXR5X2Nmc19ycShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOworCisJLyogQ2F0Y2ggdXAgd2l0aCB0aGUgY2ZzX3JxIGFuZCByZW1vdmUgb3VyIGxvYWQgd2hlbiB3ZSBsZWF2ZSAqLworCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMCk7CisJZGV0YWNoX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKKwl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CisJcHJvcGFnYXRlX2VudGl0eV9jZnNfcnEoc2UpOworfQorCitzdGF0aWMgdm9pZCBhdHRhY2hfZW50aXR5X2Nmc19ycShzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOworCisjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKKwkvKgorCSAqIFNpbmNlIHRoZSByZWFsLWRlcHRoIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIChvbmx5IEZBSVIKKwkgKiBjbGFzcyBtYWludGFpbiBkZXB0aCB2YWx1ZSksIHJlc2V0IGRlcHRoIHByb3Blcmx5LgorCSAqLworCXNlLT5kZXB0aCA9IHNlLT5wYXJlbnQgPyBzZS0+cGFyZW50LT5kZXB0aCArIDEgOiAwOworI2VuZGlmCisKKwkvKiBTeW5jaHJvbml6ZSBlbnRpdHkgd2l0aCBpdHMgY2ZzX3JxICovCisJdXBkYXRlX2xvYWRfYXZnKHNlLCBzY2hlZF9mZWF0KEFUVEFDSF9BR0VfTE9BRCkgPyAwIDogU0tJUF9BR0VfTE9BRCk7CisJYXR0YWNoX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKKwl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CisJcHJvcGFnYXRlX2VudGl0eV9jZnNfcnEoc2UpOworfQorCiBzdGF0aWMgdm9pZCBkZXRhY2hfdGFza19jZnNfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7Ci0JdTY0IG5vdyA9IGNmc19ycV9jbG9ja190YXNrKGNmc19ycSk7CiAKIAlpZiAoIXZydW50aW1lX25vcm1hbGl6ZWQocCkpIHsKIAkJLyoKQEAgLTEwNDkwLDMwICsxMDkyMywxNSBAQAogCQlzZS0+dnJ1bnRpbWUgLT0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CiAJfQogCi0JLyogQ2F0Y2ggdXAgd2l0aCB0aGUgY2ZzX3JxIGFuZCByZW1vdmUgb3VyIGxvYWQgd2hlbiB3ZSBsZWF2ZSAqLwotCXVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKLQlkZXRhY2hfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwotCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKKwlkZXRhY2hfZW50aXR5X2Nmc19ycShzZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0dGFjaF90YXNrX2Nmc19ycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2UgPSAmcC0+c2U7CiAJc3RydWN0IGNmc19ycSAqY2ZzX3JxID0gY2ZzX3JxX29mKHNlKTsKLQl1NjQgbm93ID0gY2ZzX3JxX2Nsb2NrX3Rhc2soY2ZzX3JxKTsKIAotI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECi0JLyoKLQkgKiBTaW5jZSB0aGUgcmVhbC1kZXB0aCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCAob25seSBGQUlSCi0JICogY2xhc3MgbWFpbnRhaW4gZGVwdGggdmFsdWUpLCByZXNldCBkZXB0aCBwcm9wZXJseS4KLQkgKi8KLQlzZS0+ZGVwdGggPSBzZS0+cGFyZW50ID8gc2UtPnBhcmVudC0+ZGVwdGggKyAxIDogMDsKLSNlbmRpZgotCi0JLyogU3luY2hyb25pemUgdGFzayB3aXRoIGl0cyBjZnNfcnEgKi8KLQl1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCBmYWxzZSk7Ci0JYXR0YWNoX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKLQl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CisJYXR0YWNoX2VudGl0eV9jZnNfcnEoc2UpOwogCiAJaWYgKCF2cnVudGltZV9ub3JtYWxpemVkKHApKQogCQlzZS0+dnJ1bnRpbWUgKz0gY2ZzX3JxLT5taW5fdnJ1bnRpbWU7CkBAIC0xMDU2Nyw2ICsxMDk4NSw5IEBACiAJY2ZzX3JxLT5taW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NNUAorI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECisJY2ZzX3JxLT5wcm9wYWdhdGVfYXZnID0gMDsKKyNlbmRpZgogCWF0b21pY19sb25nX3NldCgmY2ZzX3JxLT5yZW1vdmVkX2xvYWRfYXZnLCAwKTsKIAlhdG9taWNfbG9uZ19zZXQoJmNmc19ycS0+cmVtb3ZlZF91dGlsX2F2ZywgMCk7CiAjZW5kaWYKQEAgLTEwNzY3LDggKzExMTg4LDEwIEBACiAKIAkJLyogUG9zc2libGUgY2FsbHMgdG8gdXBkYXRlX2N1cnIoKSBuZWVkIHJxIGNsb2NrICovCiAJCXVwZGF0ZV9ycV9jbG9jayhycSk7Ci0JCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKLQkJCXVwZGF0ZV9jZnNfc2hhcmVzKGdyb3VwX2Nmc19ycShzZSkpOworCQlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKKwkJCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgVVBEQVRFX1RHKTsKKwkJCXVwZGF0ZV9jZnNfc2hhcmVzKHNlKTsKKwkJfQogCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9ydC5jIGIva2VybmVsL3NjaGVkL3J0LmMKaW5kZXggNmI5MzVlNy4uN2ZlYmE4NSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3J0LmMKKysrIGIva2VybmVsL3NjaGVkL3J0LmMKQEAgLTE3MTEsNiArMTcxMSwxOSBAQAogCXJldHVybiBOVUxMOwogfQogCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCitzdGF0aWMgaW50IHJvdGF0ZV9jcHVfc3RhcnQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJvdGF0ZV9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGF2b2lkX3ByZXZfY3B1X2xhc3Q7CisKK3N0YXRpYyBzdHJ1Y3QgZmluZF9maXJzdF9jcHVfYml0X2VudiBmaXJzdF9jcHVfYml0X2VudiA9IHsKKwkuYXZvaWRfcHJldl9jcHVfbGFzdCA9ICZhdm9pZF9wcmV2X2NwdV9sYXN0LAorCS5yb3RhdGVfY3B1X3N0YXJ0ID0gJnJvdGF0ZV9jcHVfc3RhcnQsCisJLmludGVydmFsID0gSFosCisJLnJvdGF0ZV9sb2NrID0gJnJvdGF0ZV9sb2NrLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoY3B1bWFza192YXJfdCwgbG9jYWxfY3B1X21hc2spOwogCiBzdGF0aWMgaW50IGZpbmRfbG93ZXN0X3JxKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTE3MTksMTcgKzE3MzIsMjQgQEAKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCAqc2dfdGFyZ2V0OwogCXN0cnVjdCBjcHVtYXNrICpsb3dlc3RfbWFzayA9IHRoaXNfY3B1X2NwdW1hc2tfdmFyX3B0cihsb2NhbF9jcHVfbWFzayk7CiAJaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBjcHUsIGJlc3RfY3B1OworCWludCBjcHUgPSAtMSwgYmVzdF9jcHU7CiAJc3RydWN0IGNwdW1hc2sgc2VhcmNoX2NwdSwgYmFja3VwX3NlYXJjaF9jcHU7CiAJdW5zaWduZWQgbG9uZyBjcHVfY2FwYWNpdHk7CiAJdW5zaWduZWQgbG9uZyBiZXN0X2NhcGFjaXR5OwogCXVuc2lnbmVkIGxvbmcgdXRpbCwgYmVzdF9jcHVfdXRpbCA9IFVMT05HX01BWDsKKwl1bnNpZ25lZCBsb25nIGJlc3RfY3B1X3V0aWxfY3VtID0gVUxPTkdfTUFYOworCXVuc2lnbmVkIGxvbmcgdXRpbF9jdW07CisJdW5zaWduZWQgbG9uZyB0dXRpbCA9IHRhc2tfdXRpbCh0YXNrKTsKIAlpbnQgYmVzdF9jcHVfaWRsZV9pZHggPSBJTlRfTUFYOwogCWludCBjcHVfaWRsZV9pZHggPSAtMTsKLQlsb25nIG5ld191dGlsX2N1bTsKLQlpbnQgbWF4X3NwYXJlX2NhcF9jcHUgPSAtMTsKLQlsb25nIG1heF9zcGFyZV9jYXAgPSAtTE9OR19NQVg7CiAJYm9vbCBwbGFjZW1lbnRfYm9vc3Q7CisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCisJYm9vbCBkb19yb3RhdGUgPSBmYWxzZTsKKwlib29sIGF2b2lkX3ByZXZfY3B1ID0gZmFsc2U7CisjZWxzZQorI2RlZmluZSBkb19yb3RhdGUgZmFsc2UKKyNkZWZpbmUgYXZvaWRfcHJldl9jcHUgZmFsc2UKKyNlbmRpZgogCiAJLyogTWFrZSBzdXJlIHRoZSBtYXNrIGlzIGluaXRpYWxpemVkIGZpcnN0ICovCiAJaWYgKHVubGlrZWx5KCFsb3dlc3RfbWFzaykpCkBAIC0xNzYxLDYgKzE3ODEsMTAgQEAKIAogCQlzZyA9IHNkLT5ncm91cHM7CiAJCWRvIHsKKwkJCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGxvd2VzdF9tYXNrLAorCQkJCQkJc2NoZWRfZ3JvdXBfY3B1cyhzZykpKQorCQkJCWNvbnRpbnVlOworCiAJCQljcHUgPSBncm91cF9maXJzdF9jcHUoc2cpOwogCQkJY3B1X2NhcGFjaXR5ID0gY2FwYWNpdHlfb3JpZ19vZihjcHUpOwogCkBAIC0xNzc4LDY4ICsxODAyLDk4IEBACiAJCX0gd2hpbGUgKHNnID0gc2ctPm5leHQsIHNnICE9IHNkLT5ncm91cHMpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQljcHVtYXNrX2FuZCgmc2VhcmNoX2NwdSwgbG93ZXN0X21hc2ssCi0JCQkgICAgc2NoZWRfZ3JvdXBfY3B1cyhzZ190YXJnZXQpKTsKLQkJY3B1bWFza19jb3B5KCZiYWNrdXBfc2VhcmNoX2NwdSwgbG93ZXN0X21hc2spOwotCQljcHVtYXNrX2FuZG5vdCgmYmFja3VwX3NlYXJjaF9jcHUsICZiYWNrdXBfc2VhcmNoX2NwdSwKLQkJCSAgICAgICAmc2VhcmNoX2NwdSk7CisJCWlmIChzZ190YXJnZXQpIHsKKwkJCWNwdW1hc2tfYW5kKCZzZWFyY2hfY3B1LCBsb3dlc3RfbWFzaywKKwkJCQkgICAgc2NoZWRfZ3JvdXBfY3B1cyhzZ190YXJnZXQpKTsKKwkJCWNwdW1hc2tfY29weSgmYmFja3VwX3NlYXJjaF9jcHUsIGxvd2VzdF9tYXNrKTsKKwkJCWNwdW1hc2tfYW5kbm90KCZiYWNrdXBfc2VhcmNoX2NwdSwgJmJhY2t1cF9zZWFyY2hfY3B1LAorCQkJCSAgICAgICAmc2VhcmNoX2NwdSk7CisKKyNpZmRlZiBDT05GSUdfU0NIRURfQ09SRV9ST1RBVEUKKwkJCWNwdSA9IGZpbmRfZmlyc3RfY3B1X2JpdCh0YXNrLCAmc2VhcmNoX2NwdSwgc2dfdGFyZ2V0LAorCQkJCQkJICZhdm9pZF9wcmV2X2NwdSwgJmRvX3JvdGF0ZSwKKwkJCQkJCSAmZmlyc3RfY3B1X2JpdF9lbnYpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQljcHVtYXNrX2NvcHkoJnNlYXJjaF9jcHUsIGxvd2VzdF9tYXNrKTsKKwkJCWNwdW1hc2tfY2xlYXIoJmJhY2t1cF9zZWFyY2hfY3B1KTsKKwkJCWNwdSA9IC0xOworCQl9CiAKIHJldHJ5OgotCQlmb3JfZWFjaF9jcHUoY3B1LCAmc2VhcmNoX2NwdSkgeworCQl3aGlsZSAoKGNwdSA9IGNwdW1hc2tfbmV4dChjcHUsICZzZWFyY2hfY3B1KSkgPCBucl9jcHVfaWRzKSB7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZzZWFyY2hfY3B1KTsKKwogCQkJLyoKIAkJCSAqIERvbid0IHVzZSBjYXBjaXR5X2N1cnJfb2YoKSBzaW5jZSBpdCB3aWxsCiAJCQkgKiBkb3VibGUgY291bnQgcnQgdGFzayBsb2FkLgogCQkJICovCiAJCQl1dGlsID0gY3B1X3V0aWwoY3B1KTsKLQkJCWlmICghY3B1X292ZXJ1dGlsaXplZChjcHUpKSB7Ci0JCQkJaWYgKGNwdV9pc29sYXRlZChjcHUpKQorCisJCQlpZiAoYXZvaWRfcHJldl9jcHUgJiYgY3B1ID09IHRhc2tfY3B1KHRhc2spKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoX19jcHVfb3ZlcnV0aWxpemVkKGNwdSwgdXRpbCArIHR1dGlsKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGNwdV9pc29sYXRlZChjcHUpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc2NoZWRfY3B1X2hpZ2hfaXJxbG9hZChjcHUpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBGaW5kIHRoZSBsZWFzdCBsb2FkZWQgQ1BVICovCisJCQlpZiAodXRpbCA+IGJlc3RfY3B1X3V0aWwpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgcHJldmlvdXMgQ1BVIGhhcyBzYW1lIGxvYWQsIGtlZXAgaXQgYXMKKwkJCSAqIGJlc3RfY3B1LgorCQkJICovCisJCQlpZiAoYmVzdF9jcHVfdXRpbCA9PSB1dGlsICYmIGJlc3RfY3B1ID09IHRhc2tfY3B1KHRhc2spKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogSWYgY2FuZGlkYXRlIENQVSBpcyB0aGUgcHJldmlvdXMgQ1BVLCBzZWxlY3QgaXQuCisJCQkgKiBPdGhlcndpc2UsIGlmIGl0cyBsb2FkIGlzIHNhbWUgd2l0aCBiZXN0X2NwdSBhbmQgaW4KKwkJCSAqIGEgc2hhbGxvd2VyIEMtc3RhdGUsIHNlbGVjdCBpdC4gIElmIGFsbCBhYm92ZQorCQkJICogY29uZGl0aW9ucyBhcmUgc2FtZSwgc2VsZWN0IHRoZSBsZWFzdCBjdW11bGF0aXZlCisJCQkgKiB3aW5kb3cgZGVtYW5kIENQVS4KKwkJCSAqLworCQkJaWYgKHN5c2N0bF9zY2hlZF9jc3RhdGVfYXdhcmUpCisJCQkJY3B1X2lkbGVfaWR4ID0gaWRsZV9nZXRfc3RhdGVfaWR4KGNwdV9ycShjcHUpKTsKKworCQkJdXRpbF9jdW0gPSBjcHVfdXRpbF9jdW0oY3B1LCAwKTsKKwkJCWlmIChjcHUgIT0gdGFza19jcHUodGFzaykgJiYgYmVzdF9jcHVfdXRpbCA9PSB1dGlsKSB7CisJCQkJaWYgKGJlc3RfY3B1X2lkbGVfaWR4IDwgY3B1X2lkbGVfaWR4KQogCQkJCQljb250aW51ZTsKIAotCQkJCWlmIChzY2hlZF9jcHVfaGlnaF9pcnFsb2FkKGNwdSkpCisJCQkJaWYgKGJlc3RfY3B1X2lkbGVfaWR4ID09IGNwdV9pZGxlX2lkeCAmJgorCQkJCSAgICBiZXN0X2NwdV91dGlsX2N1bSA8IHV0aWxfY3VtKQogCQkJCQljb250aW51ZTsKLQotCQkJCW5ld191dGlsX2N1bSA9IGNwdV91dGlsX2N1bShjcHUsIDApOwotCi0JCQkJaWYgKCF0YXNrX2luX2N1bV93aW5kb3dfZGVtYW5kKGNwdV9ycShjcHUpLAotCQkJCQkJCSAgICAgICB0YXNrKSkKLQkJCQkJbmV3X3V0aWxfY3VtICs9IHRhc2tfdXRpbCh0YXNrKTsKLQotCQkJCXRyYWNlX3NjaGVkX2NwdV91dGlsKHRhc2ssIGNwdSwgdGFza191dGlsKHRhc2spLAotCQkJCQkJICAgICAwLCBuZXdfdXRpbF9jdW0sIDApOwotCi0JCQkJaWYgKHN5c2N0bF9zY2hlZF9jc3RhdGVfYXdhcmUpCi0JCQkJCWNwdV9pZGxlX2lkeCA9Ci0JCQkJCSAgICAgaWRsZV9nZXRfc3RhdGVfaWR4KGNwdV9ycShjcHUpKTsKLQotCQkJCWlmIChhZGRfY2FwYWNpdHlfbWFyZ2luKG5ld191dGlsX2N1bSkgPAotCQkJCSAgICBjYXBhY2l0eV9jdXJyX29mKGNwdSkpIHsKLQkJCQkJaWYgKGNwdV9pZGxlX2lkeCA8IGJlc3RfY3B1X2lkbGVfaWR4IHx8Ci0JCQkJCSAgICAoYmVzdF9jcHUgIT0gdGFza19jcHUodGFzaykgJiYKLQkJCQkJICAgICAoYmVzdF9jcHVfaWRsZV9pZHggPT0KLQkJCQkJICAgICAgY3B1X2lkbGVfaWR4ICYmCi0JCQkJCSAgICAgIGJlc3RfY3B1X3V0aWwgPiB1dGlsKSkpIHsKLQkJCQkJCWJlc3RfY3B1X3V0aWwgPSB1dGlsOwotCQkJCQkJYmVzdF9jcHUgPSBjcHU7Ci0JCQkJCQliZXN0X2NwdV9pZGxlX2lkeCA9Ci0JCQkJCQkgICAgY3B1X2lkbGVfaWR4OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9uZyBzcGFyZV9jYXAgPSBjYXBhY2l0eV9vZihjcHUpIC0KLQkJCQkJCQkgdXRpbDsKLQotCQkJCQlpZiAoc3BhcmVfY2FwID4gMCAmJgotCQkJCQkgICAgbWF4X3NwYXJlX2NhcCA8IHNwYXJlX2NhcCkgewotCQkJCQkJbWF4X3NwYXJlX2NhcF9jcHUgPSBjcHU7Ci0JCQkJCQltYXhfc3BhcmVfY2FwID0gc3BhcmVfY2FwOwotCQkJCQl9Ci0JCQkJfQogCQkJfQorCisJCQliZXN0X2NwdV9pZGxlX2lkeCA9IGNwdV9pZGxlX2lkeDsKKwkJCWJlc3RfY3B1X3V0aWxfY3VtID0gdXRpbF9jdW07CisJCQliZXN0X2NwdV91dGlsID0gdXRpbDsKKwkJCWJlc3RfY3B1ID0gY3B1OwogCQl9CiAKKyNpZmRlZiBDT05GSUdfU0NIRURfQ09SRV9ST1RBVEUKKwkJaWYgKGRvX3JvdGF0ZSkgeworCQkJLyoKKwkJCSAqIFdlIHN0YXJ0ZWQgaXRlcmF0aW9uIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mCisJCQkgKiBjcHVtYXNrLiAgSXRlcmF0ZSBvbmNlIGFnYWluIGZyb20gYml0IDAgdG8gdGhlCisJCQkgKiBwcmV2aW91cyBzdGFydGluZyBwb2ludCBiaXQuCisJCQkgKi8KKwkJCWRvX3JvdGF0ZSA9IGZhbHNlOworCQkJY3B1ID0gLTE7CisJCQlnb3RvIHJldHJ5OworCQl9CisjZW5kaWYKKwogCQlpZiAoYmVzdF9jcHUgIT0gLTEpIHsKIAkJCXJldHVybiBiZXN0X2NwdTsKLQkJfSBlbHNlIGlmIChtYXhfc3BhcmVfY2FwX2NwdSAhPSAtMSkgewotCQkJcmV0dXJuIG1heF9zcGFyZV9jYXBfY3B1OwogCQl9IGVsc2UgaWYgKCFjcHVtYXNrX2VtcHR5KCZiYWNrdXBfc2VhcmNoX2NwdSkpIHsKIAkJCWNwdW1hc2tfY29weSgmc2VhcmNoX2NwdSwgJmJhY2t1cF9zZWFyY2hfY3B1KTsKIAkJCWNwdW1hc2tfY2xlYXIoJmJhY2t1cF9zZWFyY2hfY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKaW5kZXggM2RmNTVhYy4uN2FjNzMxZCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3NjaGVkLmgKKysrIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2lmZGVmIENPTkZJR19TQ0hFRF9XQUxUCiBleHRlcm4gdW5zaWduZWQgaW50IHNjaGVkX3Jhdmdfd2luZG93OworZXh0ZXJuIHVuc2lnbmVkIGludCB3YWx0X2NwdV91dGlsX2ZyZXFfZGl2aXNvcjsKIAogc3RydWN0IHdhbHRfc2NoZWRfc3RhdHMgewogCWludCBucl9iaWdfdGFza3M7CkBAIC00NzcsNiArNDc4LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJ1bm5hYmxlX2xvYWRfYXZnOwogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECiAJdW5zaWduZWQgbG9uZyB0Z19sb2FkX2F2Z19jb250cmliOworCXVuc2lnbmVkIGxvbmcgcHJvcGFnYXRlX2F2ZzsKICNlbmRpZgogCWF0b21pY19sb25nX3QgcmVtb3ZlZF9sb2FkX2F2ZywgcmVtb3ZlZF91dGlsX2F2ZzsKICNpZm5kZWYgQ09ORklHXzY0QklUCkBAIC02NjIsNiArNjY0LDkgQEAKIAogCS8qIE1heGltdW0gY3B1IGNhcGFjaXR5IGluIHRoZSBzeXN0ZW0uICovCiAJc3RydWN0IG1heF9jcHVfY2FwYWNpdHkgbWF4X2NwdV9jYXBhY2l0eTsKKworCS8qIEZpcnN0IGNwdSB3aXRoIG1heGltdW0gYW5kIG1pbmltdW0gb3JpZ2luYWwgY2FwYWNpdHkgKi8KKwlpbnQgbWF4X2NhcF9vcmlnX2NwdSwgbWluX2NhcF9vcmlnX2NwdTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgcm9vdF9kb21haW4gZGVmX3Jvb3RfZG9tYWluOwpAQCAtNzIwLDYgKzcyNSw3IEBACiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKIAkvKiBsaXN0IG9mIGxlYWYgY2ZzX3JxIG9uIHRoaXMgY3B1OiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9jZnNfcnFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXBfYWxvbmVfYnJhbmNoOwogI2VuZGlmIC8qIENPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCiAKIAkvKgpAQCAtODQyLDYgKzg0OCw5IEBACiAJLyogdHJ5X3RvX3dha2VfdXAoKSBzdGF0cyAqLwogCXVuc2lnbmVkIGludCB0dHd1X2NvdW50OwogCXVuc2lnbmVkIGludCB0dHd1X2xvY2FsOworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgZWFzX3N0YXRzIGVhc19zdGF0czsKKyNlbmRpZgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0xMDEyLDYgKzEwMjEsNyBAQAogCSAqLwogCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7CiAJdW5zaWduZWQgbG9uZyBtYXhfY2FwYWNpdHk7IC8qIE1heCBwZXItY3B1IGNhcGFjaXR5IGluIGdyb3VwICovCisJdW5zaWduZWQgbG9uZyBtaW5fY2FwYWNpdHk7IC8qIE1pbiBwZXItQ1BVIGNhcGFjaXR5IGluIGdyb3VwICovCiAJdW5zaWduZWQgbG9uZyBuZXh0X3VwZGF0ZTsKIAlpbnQgaW1iYWxhbmNlOyAvKiBYWFggdW5yZWxhdGVkIHRvIGNhcGFjaXR5IGJ1dCBzaGFyZWQgZ3JvdXAgc3RhdGUgKi8KIApAQCAtMTQ0Nyw2ICsxNDU3LDcgQEAKIAogZXh0ZXJuIHZvaWQgc2V0X2NwdXNfYWxsb3dlZF9jb21tb24oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbmV3X21hc2spOwogCitib29sIF9fY3B1X292ZXJ1dGlsaXplZChpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHV0aWwpOwogYm9vbCBjcHVfb3ZlcnV0aWxpemVkKGludCBjcHUpOwogCiAjZW5kaWYKQEAgLTE3OTYsNDcgKzE4MDcsODcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWNwdV91dGlsX2ZyZXEoaW50IGNwdSwgc3RydWN0IHNjaGVkX3dhbHRfY3B1X2xvYWQgKndhbHRfbG9hZCkKK2NwdV91dGlsX2ZyZXFfcGVsdChpbnQgY3B1KQogewogCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKLQl1NjQgdXRpbCA9IHJxLT5jZnMuYXZnLnV0aWxfYXZnOworCXVuc2lnbmVkIGxvbmcgdXRpbCA9IHJxLT5jZnMuYXZnLnV0aWxfYXZnOwogCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHkgPSBjYXBhY2l0eV9vcmlnX29mKGNwdSk7CiAKLSNpZmRlZiBDT05GSUdfU0NIRURfV0FMVAotCWlmICghd2FsdF9kaXNhYmxlZCAmJiBzeXNjdGxfc2NoZWRfdXNlX3dhbHRfY3B1X3V0aWwpIHsKKwl1dGlsICo9ICgxMDAgKyBwZXJfY3B1KHNjaGVkX2xvYWRfYm9vc3QsIGNwdSkpOworCWRvX2Rpdih1dGlsLCAxMDApOwogCi0JCXV0aWwgPSBmcmVxX3BvbGljeV9sb2FkKHJxKTsKLQkJdXRpbCA9IGRpdjY0X3U2NCh1dGlsLAotCQkJCSBzY2hlZF9yYXZnX3dpbmRvdyA+PiBTQ0hFRF9DQVBBQ0lUWV9TSElGVCk7Ci0KLQkJaWYgKHdhbHRfbG9hZCkgewotCQkJdTY0IG5sID0gY3B1X3JxKGNwdSktPm50X3ByZXZfcnVubmFibGVfc3VtICsKLQkJCQlycS0+Z3JwX3RpbWUubnRfcHJldl9ydW5uYWJsZV9zdW07Ci0JCQl1NjQgcGwgPSBycS0+d2FsdF9zdGF0cy5wcmVkX2RlbWFuZHNfc3VtOwotCi0JCQlubCA9IGRpdjY0X3U2NChubCwgc2NoZWRfcmF2Z193aW5kb3cgPj4KLQkJCQkJCVNDSEVEX0NBUEFDSVRZX1NISUZUKTsKLQkJCXBsID0gZGl2NjRfdTY0KHBsLCBzY2hlZF9yYXZnX3dpbmRvdyA+PgotCQkJCQkJU0NIRURfQ0FQQUNJVFlfU0hJRlQpOwotCi0JCQl3YWx0X2xvYWQtPnByZXZfd2luZG93X3V0aWwgPSB1dGlsOwotCQkJd2FsdF9sb2FkLT5ubCA9IG5sOwotCQkJd2FsdF9sb2FkLT5wbCA9IHBsOwotCQkJcnEtPm9sZF9idXN5X3RpbWUgPSB1dGlsOwotCQkJcnEtPm9sZF9lc3RpbWF0ZWRfdGltZSA9IHBsOwotCQkJd2FsdF9sb2FkLT53cyA9IHJxLT53aW5kb3dfc3RhcnQ7Ci0JCX0KLQl9Ci0jZW5kaWYKIAlyZXR1cm4gKHV0aWwgPj0gY2FwYWNpdHkpID8gY2FwYWNpdHkgOiB1dGlsOwogfQorCisjaWZkZWYgQ09ORklHX1NDSEVEX1dBTFQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworY3B1X3V0aWxfZnJlcV93YWx0KGludCBjcHUsIHN0cnVjdCBzY2hlZF93YWx0X2NwdV9sb2FkICp3YWx0X2xvYWQpCit7CisJdTY0IHV0aWwsIHV0aWxfdW5ib29zdGVkOworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5ID0gY2FwYWNpdHlfb3JpZ19vZihjcHUpOworCWludCBib29zdDsKKworCWlmICh3YWx0X2Rpc2FibGVkIHx8ICFzeXNjdGxfc2NoZWRfdXNlX3dhbHRfY3B1X3V0aWwpCisJCXJldHVybiBjcHVfdXRpbF9mcmVxX3BlbHQoY3B1KTsKKworCWJvb3N0ID0gcGVyX2NwdShzY2hlZF9sb2FkX2Jvb3N0LCBjcHUpOworCXV0aWxfdW5ib29zdGVkID0gdXRpbCA9IGZyZXFfcG9saWN5X2xvYWQocnEpOworCXV0aWwgPSBkaXY2NF91NjQodXRpbCAqICgxMDAgKyBib29zdCksCisJCQkgd2FsdF9jcHVfdXRpbF9mcmVxX2Rpdmlzb3IpOworCisJaWYgKHdhbHRfbG9hZCkgeworCQl1NjQgbmwgPSBjcHVfcnEoY3B1KS0+bnRfcHJldl9ydW5uYWJsZV9zdW0gKworCQkJcnEtPmdycF90aW1lLm50X3ByZXZfcnVubmFibGVfc3VtOworCQl1NjQgcGwgPSBycS0+d2FsdF9zdGF0cy5wcmVkX2RlbWFuZHNfc3VtOworCisJCS8qIGRvX3BsX25vdGlmKCkgbmVlZHMgdW5ib29zdGVkIHNpZ25hbHMgKi8KKwkJcnEtPm9sZF9idXN5X3RpbWUgPSBkaXY2NF91NjQodXRpbF91bmJvb3N0ZWQsCisJCQkJCSAgICAgIHNjaGVkX3Jhdmdfd2luZG93ID4+CisJCQkJCSAgICAgIFNDSEVEX0NBUEFDSVRZX1NISUZUKTsKKwkJcnEtPm9sZF9lc3RpbWF0ZWRfdGltZSA9IGRpdjY0X3U2NChwbCwgc2NoZWRfcmF2Z193aW5kb3cgPj4KKwkJCQkJCSAgICAgICBTQ0hFRF9DQVBBQ0lUWV9TSElGVCk7CisKKwkJbmwgPSBkaXY2NF91NjQobmwgKiAoMTAwICsgYm9vc3QpLAorCQkJICAgICAgIHdhbHRfY3B1X3V0aWxfZnJlcV9kaXZpc29yKTsKKwkJcGwgPSBkaXY2NF91NjQocGwgKiAoMTAwICsgYm9vc3QpLAorCQkJICAgICAgIHdhbHRfY3B1X3V0aWxfZnJlcV9kaXZpc29yKTsKKworCQl3YWx0X2xvYWQtPnByZXZfd2luZG93X3V0aWwgPSB1dGlsOworCQl3YWx0X2xvYWQtPm5sID0gbmw7CisJCXdhbHRfbG9hZC0+cGwgPSBwbDsKKwkJd2FsdF9sb2FkLT53cyA9IHJxLT53aW5kb3dfc3RhcnQ7CisJfQorCisJcmV0dXJuICh1dGlsID49IGNhcGFjaXR5KSA/IGNhcGFjaXR5IDogdXRpbDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitjcHVfdXRpbF9mcmVxKGludCBjcHUsIHN0cnVjdCBzY2hlZF93YWx0X2NwdV9sb2FkICp3YWx0X2xvYWQpCit7CisJcmV0dXJuIGNwdV91dGlsX2ZyZXFfd2FsdChjcHUsIHdhbHRfbG9hZCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworY3B1X3V0aWxfZnJlcShpbnQgY3B1LCBzdHJ1Y3Qgc2NoZWRfd2FsdF9jcHVfbG9hZCAqd2FsdF9sb2FkKQoreworCXJldHVybiBjcHVfdXRpbF9mcmVxX3BlbHQoY3B1KTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9XQUxUICovCisKICNlbmRpZgogCiBleHRlcm4gdW5zaWduZWQgaW50IGNhcGFjaXR5X21hcmdpbl9mcmVxOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRkX2NhcGFjaXR5X21hcmdpbih1bnNpZ25lZCBsb25nIGNwdV9jYXBhY2l0eSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworYWRkX2NhcGFjaXR5X21hcmdpbih1bnNpZ25lZCBsb25nIGNwdV9jYXBhY2l0eSwgaW50IGNwdSkKIHsKLQljcHVfY2FwYWNpdHkgID0gY3B1X2NhcGFjaXR5ICogY2FwYWNpdHlfbWFyZ2luX2ZyZXE7CisJY3B1X2NhcGFjaXR5ICA9IGNwdV9jYXBhY2l0eSAqIGNhcGFjaXR5X21hcmdpbl9mcmVxICoKKwkJCSgxMDAgKyBwZXJfY3B1KHNjaGVkX2xvYWRfYm9vc3QsIGNwdSkpOworCWNwdV9jYXBhY2l0eSAvPSAxMDA7CiAJY3B1X2NhcGFjaXR5IC89IFNDSEVEX0NBUEFDSVRZX1NDQUxFOwogCXJldHVybiBjcHVfY2FwYWNpdHk7CiB9CkBAIC0yMjQxLDcgKzIyOTIsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1dBTFQKIAl1bnNpZ25lZCBpbnQgZXhjZXB0aW9uX2ZsYWdzID0gU0NIRURfQ1BVRlJFUV9JTlRFUkNMVVNURVJfTUlHIHwKLQkJCQkJCVNDSEVEX0NQVUZSRVFfUEw7CisJCQkJU0NIRURfQ1BVRlJFUV9QTCB8IFNDSEVEX0NQVUZSRVFfRUFSTFlfREVUOwogCiAJLyoKIAkgKiBTa2lwIGlmIHdlJ3ZlIGFscmVhZHkgcmVwb3J0ZWQsIGJ1dCBub3QgaWYgdGhpcyBpcyBhbiBpbnRlci1jbHVzdGVyCkBAIC0yNzkwLDMgKzI4NDEsMTcgQEAKIHsKIAlyZXR1cm4gc2NoZWRfZmVhdChFTkVSR1lfQVdBUkUpOwogfQorCisjaWZkZWYgQ09ORklHX1NDSEVEX0NPUkVfUk9UQVRFCitzdHJ1Y3QgZmluZF9maXJzdF9jcHVfYml0X2VudiB7CisJdW5zaWduZWQgbG9uZyAqYXZvaWRfcHJldl9jcHVfbGFzdDsKKwlpbnQgKnJvdGF0ZV9jcHVfc3RhcnQ7CisJaW50IGludGVydmFsOworCXNwaW5sb2NrX3QgKnJvdGF0ZV9sb2NrOworfTsKKworaW50CitmaW5kX2ZpcnN0X2NwdV9iaXQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBjcHVtYXNrX3QgKnNlYXJjaF9jcHVzLAorCQkgICBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnX3RhcmdldCwgYm9vbCAqYXZvaWRfcHJldl9jcHUsCisJCSAgIGJvb2wgKmRvX3JvdGF0ZSwgc3RydWN0IGZpbmRfZmlyc3RfY3B1X2JpdF9lbnYgKmVudik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zdGF0cy5jIGIva2VybmVsL3NjaGVkL3N0YXRzLmMKaW5kZXggODdlMmM5Zi4uNmQ3NGE3YyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3N0YXRzLmMKKysrIGIva2VybmVsL3NjaGVkL3N0YXRzLmMKQEAgLTEyLDYgKzEyLDI4IEBACiAgKi8KICNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTUKIAorI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X2Vhc3N0YXQoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBlYXNfc3RhdHMgKnN0YXRzKQoreworCS8qIGVhcy1zcGVjaWZpYyBydW5xdWV1ZSBzdGF0cyAqLworCXNlcV9wcmludGYoc2VxLCAiZWFzICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICIsCisJICAgIHN0YXRzLT5zaXNfYXR0ZW1wdHMsIHN0YXRzLT5zaXNfaWRsZSwgc3RhdHMtPnNpc19jYWNoZV9hZmZpbmUsCisJICAgIHN0YXRzLT5zaXNfc3VmZl9jYXAsIHN0YXRzLT5zaXNfaWRsZV9jcHUsIHN0YXRzLT5zaXNfY291bnQpOworCisJc2VxX3ByaW50ZihzZXEsICIlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICIsCisJICAgIHN0YXRzLT5zZWNiX2F0dGVtcHRzLCBzdGF0cy0+c2VjYl9zeW5jLCBzdGF0cy0+c2VjYl9pZGxlX2J0LAorCSAgICBzdGF0cy0+c2VjYl9pbnN1ZmZfY2FwLCBzdGF0cy0+c2VjYl9ub19ucmdfc2F2LAorCSAgICBzdGF0cy0+c2VjYl9ucmdfc2F2LCBzdGF0cy0+c2VjYl9jb3VudCk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAiLAorCSAgICBzdGF0cy0+ZmJ0X2F0dGVtcHRzLCBzdGF0cy0+ZmJ0X25vX2NwdSwgc3RhdHMtPmZidF9ub19zZCwKKwkgICAgc3RhdHMtPmZidF9wcmVmX2lkbGUsIHN0YXRzLT5mYnRfY291bnQpOworCisJc2VxX3ByaW50ZihzZXEsICIlbGx1ICVsbHVcbiIsCisJICAgIHN0YXRzLT5jYXNfYXR0ZW1wdHMsIHN0YXRzLT5jYXNfY291bnQpOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgc2hvd19zY2hlZHN0YXQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJaW50IGNwdTsKQEAgLTQwLDYgKzYyLDggQEAKIAkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NNUAorCQlzaG93X2Vhc3N0YXQoc2VxLCAmcnEtPmVhc19zdGF0cyk7CisKIAkJLyogZG9tYWluLXNwZWNpZmljIHN0YXRzICovCiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKQEAgLTY2LDYgKzkwLDggQEAKIAkJCSAgICBzZC0+c2JmX2NvdW50LCBzZC0+c2JmX2JhbGFuY2VkLCBzZC0+c2JmX3B1c2hlZCwKIAkJCSAgICBzZC0+dHR3dV93YWtlX3JlbW90ZSwgc2QtPnR0d3VfbW92ZV9hZmZpbmUsCiAJCQkgICAgc2QtPnR0d3VfbW92ZV9iYWxhbmNlKTsKKworCQkJc2hvd19lYXNzdGF0KHNlcSwgJnNkLT5lYXNfc3RhdHMpOwogCQl9CiAJCXJjdV9yZWFkX3VubG9jaygpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvdHVuZS5jIGIva2VybmVsL3NjaGVkL3R1bmUuYwppbmRleCA4NmExNjdiLi45MzY0M2JhIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvdHVuZS5jCisrKyBiL2tlcm5lbC9zY2hlZC90dW5lLmMKQEAgLTE0LDExICsxNCwxMiBAQAogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jZnNfYm9vc3QgX19yZWFkX21vc3RseTsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRURUVU5FCi1zdGF0aWMgYm9vbCBzY2hlZHR1bmVfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSNlbmRpZiAvKiBDT05GSUdfQ0dST1VQX1NDSEVEVFVORSAqLworYm9vbCBzY2hlZHR1bmVfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyNlbmRpZgogCiB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2Nmc19ib29zdCBfX3JlYWRfbW9zdGx5OwogCitleHRlcm4gc3RydWN0IHJlY2lwcm9jYWxfdmFsdWUgc2NoZWR0dW5lX3NwY19yZGl2OwogZXh0ZXJuIHN0cnVjdCB0YXJnZXRfbnJnIHNjaGVkdHVuZV90YXJnZXRfbnJnOwogCiAvKiBQZXJmb3JtYW5jZSBCb29zdCByZWdpb24gKEIpIHRocmVzaG9sZCBwYXJhbXMgKi8KQEAgLTY4MCw2ICs2ODEsOSBAQAogCXN0cnVjdCBzY2hlZHR1bmUgKnN0OwogCWludCB0YXNrX2Jvb3N0OwogCisJaWYgKCF1bmxpa2VseShzY2hlZHR1bmVfaW5pdGlhbGl6ZWQpKQorCQlyZXR1cm4gMDsKKwogCS8qIEdldCB0YXNrIGJvb3N0IHZhbHVlICovCiAJcmN1X3JlYWRfbG9jaygpOwogCXN0ID0gdGFza19zY2hlZHR1bmUocCk7CkBAIC02OTQsNiArNjk4LDkgQEAKIAlzdHJ1Y3Qgc2NoZWR0dW5lICpzdDsKIAlpbnQgcHJlZmVyX2lkbGU7CiAKKwlpZiAoIXVubGlrZWx5KHNjaGVkdHVuZV9pbml0aWFsaXplZCkpCisJCXJldHVybiAwOworCiAJLyogR2V0IHByZWZlcl9pZGxlIHZhbHVlICovCiAJcmN1X3JlYWRfbG9jaygpOwogCXN0ID0gdGFza19zY2hlZHR1bmUocCk7CkBAIC0xMTI2LDkgKzExMzMsMTIgQEAKIAlwcl9pbmZvKCJzY2hlZHR1bmU6IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBnbG9iYWwgYm9vc3Rpbmcgb25seVxuIik7CiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9TQ0hFRFRVTkUgKi8KIAorCXNjaGVkdHVuZV9zcGNfcmRpdiA9IHJlY2lwcm9jYWxfdmFsdWUoMTAwKTsKKwogCXJldHVybiAwOwogCiBub2RhdGE6CisJcHJfd2FybmluZygic2NoZWR0dW5lOiBkaXNhYmxlZCFcbiIpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3dhbHQuYyBiL2tlcm5lbC9zY2hlZC93YWx0LmMKaW5kZXggY2JjNzVjMC4uMzE2YzI3NiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3dhbHQuYworKysgYi9rZXJuZWwvc2NoZWQvd2FsdC5jCkBAIC02OSw2ICs2OSwyMCBAQAogCWxvY2FsX2lycV9yZXN0b3JlKCpmbGFncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSFpfMzAwCisvKgorICogVGljayBpbnRlcnZhbCBiZWNvbWVzIHRvIDMzMzMzMzMgZHVlIHRvCisgKiByb3VuZGluZyBlcnJvciB3aGVuIEhaPTMwMC4KKyAqLworI2RlZmluZSBNSU5fU0NIRURfUkFWR19XSU5ET1cgKDMzMzMzMzMgKiA2KQorI2Vsc2UKKy8qIE1pbiB3aW5kb3cgc2l6ZSAoaW4gbnMpID0gMjBtcyAqLworI2RlZmluZSBNSU5fU0NIRURfUkFWR19XSU5ET1cgMjAwMDAwMDAKKyNlbmRpZgorCisvKiBNYXggd2luZG93IHNpemUgKGluIG5zKSA9IDFzICovCisjZGVmaW5lIE1BWF9TQ0hFRF9SQVZHX1dJTkRPVyAxMDAwMDAwMDAwCisKIC8qIDEgLT4gdXNlIFBFTFQgYmFzZWQgbG9hZCBzdGF0cywgMCAtPiB1c2Ugd2luZG93LWJhc2VkIGxvYWQgc3RhdHMgKi8KIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHdhbHRfZGlzYWJsZWQgPSAwOwogCkBAIC05NSw2ICsxMDksMTIgQEAKIC8qIFdpbmRvdyBzaXplIChpbiBucykgKi8KIF9fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IHNjaGVkX3Jhdmdfd2luZG93ID0gTUlOX1NDSEVEX1JBVkdfV0lORE9XOwogCisvKgorICogQSBhZnRlci1ib290IGNvbnN0YW50IGRpdmlzb3IgZm9yIGNwdV91dGlsX2ZyZXFfd2FsdCgpIHRvIGFwcGx5IHRoZSBsb2FkCisgKiBib29zdC4KKyAqLworX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgd2FsdF9jcHVfdXRpbF9mcmVxX2Rpdmlzb3I7CisKIC8qIEluaXRpYWwgdGFzayBsb2FkLiBOZXdseSBjcmVhdGVkIHRhc2tzIGFyZSBhc3NpZ25lZCB0aGlzIGxvYWQuICovCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSBzY2hlZF9pbml0X3Rhc2tfbG9hZF93aW5kb3dzOwogdW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgc3lzY3RsX3NjaGVkX2luaXRfdGFza19sb2FkX3BjdCA9IDE1OwpAQCAtMTMyLDcgKzE1Miw2IEBACiAgKi8KIF9fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IHNjaGVkX2xvYWRfZ3JhbnVsZSA9CiAJCQlNSU5fU0NIRURfUkFWR19XSU5ET1cgLyBOVU1fTE9BRF9JTkRJQ0VTOwotCiAvKiBTaXplIG9mIGJpdG1hcHMgbWFpbnRhaW5lZCB0byB0cmFjayB0b3AgdGFza3MgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdG9wX3Rhc2tzX2JpdG1hcF9zaXplID0KIAkJQklUU19UT19MT05HUyhOVU1fTE9BRF9JTkRJQ0VTICsgMSkgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CkBAIC0zMDk0LDQgKzMxMTMsNyBAQAogCQljbGVhcl90b3BfdGFza3NfYml0bWFwKHJxLT50b3BfdGFza3NfYml0bWFwW2pdKTsKIAl9CiAJcnEtPmN1bV93aW5kb3dfZGVtYW5kID0gMDsKKworCXdhbHRfY3B1X3V0aWxfZnJlcV9kaXZpc29yID0KKwkgICAgKHNjaGVkX3Jhdmdfd2luZG93ID4+IFNDSEVEX0NBUEFDSVRZX1NISUZUKSAqIDEwMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC93YWx0LmggYi9rZXJuZWwvc2NoZWQvd2FsdC5oCmluZGV4IDUzNWYxNGIuLjg2ZDViZmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC93YWx0LmgKKysrIGIva2VybmVsL3NjaGVkL3dhbHQuaApAQCAtMjQsMTIgKzI0LDYgQEAKICNkZWZpbmUgV0lORE9XX1NUQVRTX0FWRwkJMwogI2RlZmluZSBXSU5ET1dfU1RBVFNfSU5WQUxJRF9QT0xJQ1kJNAogCi0vKiBNaW4gd2luZG93IHNpemUgKGluIG5zKSA9IDIwbXMgKi8KLSNkZWZpbmUgTUlOX1NDSEVEX1JBVkdfV0lORE9XIDIwMDAwMDAwCi0KLS8qIE1heCB3aW5kb3cgc2l6ZSAoaW4gbnMpID0gMXMgKi8KLSNkZWZpbmUgTUFYX1NDSEVEX1JBVkdfV0lORE9XIDEwMDAwMDAwMDAKLQogI2RlZmluZSBFWElUSU5HX1RBU0tfTUFSS0VSCTB4ZGVhZGRlYWQKIAogI2RlZmluZSBGUkVRX1JFUE9SVF9NQVhfQ1BVX0xPQURfVE9QX1RBU0sJMApkaWZmIC0tZ2l0IGEva2VybmVsL3NpZ25hbC5jIGIva2VybmVsL3NpZ25hbC5jCmluZGV4IGRlYjA0ZDUuLmU0ODY2OGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCSAqIGZyZXNoIGdyb3VwIHN0b3AuICBSZWFkIGNvbW1lbnQgaW4gZG9fc2lnbmFsX3N0b3AoKSBmb3IgZGV0YWlscy4KIAkgKi8KIAlpZiAoIXNpZy0+Z3JvdXBfc3RvcF9jb3VudCAmJiAhKHNpZy0+ZmxhZ3MgJiBTSUdOQUxfU1RPUF9TVE9QUEVEKSkgewotCQlzaWctPmZsYWdzID0gU0lHTkFMX1NUT1BfU1RPUFBFRDsKKwkJc2lnbmFsX3NldF9zdG9wX2ZsYWdzKHNpZywgU0lHTkFMX1NUT1BfU1RPUFBFRCk7CiAJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC04NDUsNyArODQ1LDcgQEAKIAkJCSAqIHdpbGwgdGFrZSAtPnNpZ2xvY2ssIG5vdGljZSBTSUdOQUxfQ0xEX01BU0ssIGFuZAogCQkJICogbm90aWZ5IGl0cyBwYXJlbnQuIFNlZSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoKS4KIAkJCSAqLwotCQkJc2lnbmFsLT5mbGFncyA9IHdoeSB8IFNJR05BTF9TVE9QX0NPTlRJTlVFRDsKKwkJCXNpZ25hbF9zZXRfc3RvcF9mbGFncyhzaWduYWwsIHdoeSB8IFNJR05BTF9TVE9QX0NPTlRJTlVFRCk7CiAJCQlzaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOwogCQkJc2lnbmFsLT5ncm91cF9leGl0X2NvZGUgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvc21wLmMgYi9rZXJuZWwvc21wLmMKaW5kZXggZWU4MGNjOC4uMzEzZDlhOCAxMDA2NDQKLS0tIGEva2VybmVsL3NtcC5jCisrKyBiL2tlcm5lbC9zbXAuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogI2luY2x1ZGUgInNtcGJvb3QuaCIKIApAQCAtNzUxLDcgKzc1Miw4IEBACiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCiAJCQljb250aW51ZTsKLQkJaWYgKCFjcHVfaXNvbGF0ZWQoY3B1KSkKKwkJaWYgKHN1c3BlbmRfZnJlZXplX3N0YXRlID09IEZSRUVaRV9TVEFURV9FTlRFUiB8fAorCQkgICAgIWNwdV9pc29sYXRlZChjcHUpKQogCQkJd2FrZV91cF9pZl9pZGxlKGNwdSk7CiAJfQogCXByZWVtcHRfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggMWQ4OTRmYy4uMmM0Y2QxNyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtMzM1LDggKzMzNSw4IEBACiAJCS5leHRyYTIJCT0gJm1heF9zY2hlZF9ncmFudWxhcml0eV9ucywKIAl9LAogCXsKLQkJLnByb2NuYW1lCT0gInNjaGVkX2lzX2JpZ19saXR0bGUiLAotCQkuZGF0YQkJPSAmc3lzY3RsX3NjaGVkX2lzX2JpZ19saXR0bGUsCisJCS5wcm9jbmFtZQk9ICJzY2hlZF9zeW5jX2hpbnRfZW5hYmxlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF9zeW5jX2hpbnRfZW5hYmxlLAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKQEAgLTM2NywxMyArMzY3LDYgQEAKIAl9LAogI2VuZGlmCiAJewotCQkucHJvY25hbWUJPSAic2NoZWRfc3luY19oaW50X2VuYWJsZSIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfc2NoZWRfc3luY19oaW50X2VuYWJsZSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7CiAJCS5wcm9jbmFtZQk9ICJzY2hlZF9pbml0aWFsX3Rhc2tfdXRpbCIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfc2NoZWRfaW5pdGlhbF90YXNrX3V0aWwsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKaW5kZXggNDRjYzM1MC4uZGYzMTkxZSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwpAQCAtMTAyMCw2ICsxMDIwLDE4IEBACiAJcmV0dXJuIHRzLT5zbGVlcF9sZW5ndGg7CiB9CiAKKy8qKgorICogdGlja19ub2h6X2dldF9pZGxlX2NhbGxzIC0gcmV0dXJuIHRoZSBjdXJyZW50IGlkbGUgY2FsbHMgY291bnRlciB2YWx1ZQorICoKKyAqIENhbGxlZCBmcm9tIHRoZSBzY2hlZHV0aWwgZnJlcXVlbmN5IHNjYWxpbmcgZ292ZXJub3IgaW4gc2NoZWR1bGVyIGNvbnRleHQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdGlja19ub2h6X2dldF9pZGxlX2NhbGxzKHZvaWQpCit7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gdGhpc19jcHVfcHRyKCZ0aWNrX2NwdV9zY2hlZCk7CisKKwlyZXR1cm4gdHMtPmlkbGVfY2FsbHM7Cit9CisKIHN0YXRpYyB2b2lkIHRpY2tfbm9oel9hY2NvdW50X2lkbGVfdGlja3Moc3RydWN0IHRpY2tfc2NoZWQgKnRzKQogewogI2lmbmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElOR19OQVRJVkUKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyLmMgYi9rZXJuZWwvdGltZS90aW1lci5jCmluZGV4IDNhMmRkODYuLjgwYWEzMGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWUvdGltZXIuYwpAQCAtMjAxLDYgKzIwMSw3IEBACiAJYm9vbAkJCW1pZ3JhdGlvbl9lbmFibGVkOwogCWJvb2wJCQlub2h6X2FjdGl2ZTsKIAlib29sCQkJaXNfaWRsZTsKKwlib29sCQkJbXVzdF9mb3J3YXJkX2NsazsKIAlERUNMQVJFX0JJVE1BUChwZW5kaW5nX21hcCwgV0hFRUxfU0laRSk7CiAJc3RydWN0IGhsaXN0X2hlYWQJdmVjdG9yc1tXSEVFTF9TSVpFXTsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwpAQCAtNDcyLDE3ICs0NzMsMjYgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjYWxjX2luZGV4KHVuc2lnbmVkIGV4cGlyZXMsIHVuc2lnbmVkIGx2bCkKIHsKLQlleHBpcmVzID0gKGV4cGlyZXMgKyBMVkxfR1JBTihsdmwpKSA+PiBMVkxfU0hJRlQobHZsKTsKKwlpZiAoZXhwaXJlcyAmIH4oVUlOVF9NQVggPDwgTFZMX1NISUZUKGx2bCkpKQorCQlleHBpcmVzID0gKGV4cGlyZXMgKyBMVkxfR1JBTihsdmwpKSA+PiBMVkxfU0hJRlQobHZsKTsKKwllbHNlCisJCWV4cGlyZXMgPSBleHBpcmVzID4+IExWTF9TSElGVChsdmwpOworCiAJcmV0dXJuIExWTF9PRkZTKGx2bCkgKyAoZXhwaXJlcyAmIExWTF9NQVNLKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY19pbmRleF9taW5fZ3JhbnVsYXJpdHkodW5zaWduZWQgaW50ICBleHBpcmVzKQoreworCXJldHVybiBMVkxfT0ZGUygwKSArICgoZXhwaXJlcyA+PiBMVkxfU0hJRlQoMCkpICYgTFZMX01BU0spOworfQorCiBzdGF0aWMgaW50IGNhbGNfd2hlZWxfaW5kZXgodW5zaWduZWQgbG9uZyBleHBpcmVzLCB1bnNpZ25lZCBsb25nIGNsaykKIHsKIAl1bnNpZ25lZCBsb25nIGRlbHRhID0gZXhwaXJlcyAtIGNsazsKIAl1bnNpZ25lZCBpbnQgaWR4OwogCiAJaWYgKGRlbHRhIDwgTFZMX1NUQVJUKDEpKSB7Ci0JCWlkeCA9IGNhbGNfaW5kZXgoZXhwaXJlcywgMCk7CisJCWlkeCA9IGNhbGNfaW5kZXhfbWluX2dyYW51bGFyaXR5KGV4cGlyZXMpOwogCX0gZWxzZSBpZiAoZGVsdGEgPCBMVkxfU1RBUlQoMikpIHsKIAkJaWR4ID0gY2FsY19pbmRleChleHBpcmVzLCAxKTsKIAl9IGVsc2UgaWYgKGRlbHRhIDwgTFZMX1NUQVJUKDMpKSB7CkBAIC04NjUsMTMgKzg3NSwxOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZm9yd2FyZF90aW1lcl9iYXNlKHN0cnVjdCB0aW1lcl9iYXNlICpiYXNlKQogewotCXVuc2lnbmVkIGxvbmcgam5vdyA9IFJFQURfT05DRShqaWZmaWVzKTsKKwl1bnNpZ25lZCBsb25nIGpub3c7CiAKIAkvKgotCSAqIFdlIG9ubHkgZm9yd2FyZCB0aGUgYmFzZSB3aGVuIGl0J3MgaWRsZSBhbmQgd2UgaGF2ZSBhIGRlbHRhIGJldHdlZW4KLQkgKiBiYXNlIGNsb2NrIGFuZCBqaWZmaWVzLgorCSAqIFdlIG9ubHkgZm9yd2FyZCB0aGUgYmFzZSB3aGVuIHdlIGFyZSBpZGxlIG9yIGhhdmUganVzdCBjb21lIG91dCBvZgorCSAqIGlkbGUgKG11c3RfZm9yd2FyZF9jbGsgbG9naWMpLCBhbmQgaGF2ZSBhIGRlbHRhIGJldHdlZW4gYmFzZSBjbG9jaworCSAqIGFuZCBqaWZmaWVzLiBJbiB0aGUgY29tbW9uIGNhc2UsIHJ1bl90aW1lcnMgd2lsbCB0YWtlIGNhcmUgb2YgaXQuCiAJICovCi0JaWYgKCFiYXNlLT5pc19pZGxlIHx8IChsb25nKSAoam5vdyAtIGJhc2UtPmNsaykgPCAyKQorCWlmIChsaWtlbHkoIWJhc2UtPm11c3RfZm9yd2FyZF9jbGspKQorCQlyZXR1cm47CisKKwlqbm93ID0gUkVBRF9PTkNFKGppZmZpZXMpOworCWJhc2UtPm11c3RfZm9yd2FyZF9jbGsgPSBiYXNlLT5pc19pZGxlOworCWlmICgobG9uZykoam5vdyAtIGJhc2UtPmNsaykgPCAyKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtOTQ3LDYgKzk2MywxMSBAQAogCSAqIHNhbWUgYXJyYXkgYnVja2V0IHRoZW4ganVzdCByZXR1cm46CiAJICovCiAJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKSB7CisJCS8qCisJCSAqIFRoZSBkb3duc2lkZSBvZiB0aGlzIG9wdGltaXphdGlvbiBpcyB0aGF0IGl0IGNhbiByZXN1bHQgaW4KKwkJICogbGFyZ2VyIGdyYW51bGFyaXR5IHRoYW4geW91IHdvdWxkIGdldCBmcm9tIGFkZGluZyBhIG5ldworCQkgKiB0aW1lciB3aXRoIHRoaXMgZXhwaXJ5LgorCQkgKi8KIAkJaWYgKHRpbWVyLT5leHBpcmVzID09IGV4cGlyZXMpCiAJCQlyZXR1cm4gMTsKIApAQCAtOTU3LDYgKzk3OCw3IEBACiAJCSAqIGRlcXVldWUvZW5xdWV1ZSBkYW5jZS4KIAkJICovCiAJCWJhc2UgPSBsb2NrX3RpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CisJCWZvcndhcmRfdGltZXJfYmFzZShiYXNlKTsKIAogCQljbGsgPSBiYXNlLT5jbGs7CiAJCWlkeCA9IGNhbGNfd2hlZWxfaW5kZXgoZXhwaXJlcywgY2xrKTsKQEAgLTk3Myw2ICs5OTUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKKwkJZm9yd2FyZF90aW1lcl9iYXNlKGJhc2UpOwogCX0KIAogCXJldCA9IGRldGFjaF9pZl9wZW5kaW5nKHRpbWVyLCBiYXNlLCBmYWxzZSk7CkBAIC0xMDAwLDEyICsxMDIzLDEwIEBACiAJCQlzcGluX2xvY2soJmJhc2UtPmxvY2spOwogCQkJV1JJVEVfT05DRSh0aW1lci0+ZmxhZ3MsCiAJCQkJICAgKHRpbWVyLT5mbGFncyAmIH5USU1FUl9CQVNFTUFTSykgfCBiYXNlLT5jcHUpOworCQkJZm9yd2FyZF90aW1lcl9iYXNlKGJhc2UpOwogCQl9CiAJfQogCi0JLyogVHJ5IHRvIGZvcndhcmQgYSBzdGFsZSB0aW1lciBiYXNlIGNsb2NrICovCi0JZm9yd2FyZF90aW1lcl9iYXNlKGJhc2UpOwotCiAJdGltZXItPmV4cGlyZXMgPSBleHBpcmVzOwogCS8qCiAJICogSWYgJ2lkeCcgd2FzIGNhbGN1bGF0ZWQgYWJvdmUgYW5kIHRoZSBiYXNlIHRpbWUgZGlkIG5vdCBhZHZhbmNlCkBAIC0xMTIxLDYgKzExNDIsNyBAQAogCQlXUklURV9PTkNFKHRpbWVyLT5mbGFncywKIAkJCSAgICh0aW1lci0+ZmxhZ3MgJiB+VElNRVJfQkFTRU1BU0spIHwgY3B1KTsKIAl9CisJZm9yd2FyZF90aW1lcl9iYXNlKGJhc2UpOwogCiAJZGVidWdfYWN0aXZhdGUodGltZXIsIHRpbWVyLT5leHBpcmVzKTsKIAlpbnRlcm5hbF9hZGRfdGltZXIoYmFzZSwgdGltZXIpOwpAQCAtMTM1MSwxNyArMTM3MywyMiBAQAogICogKEBvZmZzZXQpIHVwIHRvIEBvZmZzZXQgKyBjbGsuCiAgKi8KIHN0YXRpYyBpbnQgbmV4dF9wZW5kaW5nX2J1Y2tldChzdHJ1Y3QgdGltZXJfYmFzZSAqYmFzZSwgdW5zaWduZWQgb2Zmc2V0LAotCQkJICAgICAgIHVuc2lnbmVkIGNsaykKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2xrLCBpbnQgbHZsKQogewotCXVuc2lnbmVkIHBvcywgc3RhcnQgPSBvZmZzZXQgKyBjbGs7CisJdW5zaWduZWQgaW50IHBvc191cCA9IC0xLCBwb3NfZG93biwgc3RhcnQgPSBvZmZzZXQgKyBjbGs7CiAJdW5zaWduZWQgZW5kID0gb2Zmc2V0ICsgTFZMX1NJWkU7CisJdW5zaWduZWQgaW50IHBvczsKIAogCXBvcyA9IGZpbmRfbmV4dF9iaXQoYmFzZS0+cGVuZGluZ19tYXAsIGVuZCwgc3RhcnQpOwogCWlmIChwb3MgPCBlbmQpCi0JCXJldHVybiBwb3MgLSBzdGFydDsKKwkJcG9zX3VwID0gcG9zIC0gc3RhcnQ7CiAKIAlwb3MgPSBmaW5kX25leHRfYml0KGJhc2UtPnBlbmRpbmdfbWFwLCBzdGFydCwgb2Zmc2V0KTsKLQlyZXR1cm4gcG9zIDwgc3RhcnQgPyBwb3MgKyBMVkxfU0laRSAtIHN0YXJ0IDogLTE7CisJcG9zX2Rvd24gPSBwb3MgPCBzdGFydCA/IHBvcyArIExWTF9TSVpFIC0gc3RhcnQgOiAtMTsKKwlpZiAoKChwb3NfdXAgKyBiYXNlLT5jbGspIDw8IExWTF9TSElGVChsdmwpKSA+CisJCSgocG9zX2Rvd24gKyBiYXNlLT5jbGspIDw8IExWTF9TSElGVChsdmwpKSkKKwkJcmV0dXJuIHBvc19kb3duOworCXJldHVybiBwb3NfdXA7CiB9CiAKIC8qCkBAIC0xMzc2LDcgKzE0MDMsOCBAQAogCW5leHQgPSBiYXNlLT5jbGsgKyBORVhUX1RJTUVSX01BWF9ERUxUQTsKIAljbGsgPSBiYXNlLT5jbGs7CiAJZm9yIChsdmwgPSAwOyBsdmwgPCBMVkxfREVQVEg7IGx2bCsrLCBvZmZzZXQgKz0gTFZMX1NJWkUpIHsKLQkJaW50IHBvcyA9IG5leHRfcGVuZGluZ19idWNrZXQoYmFzZSwgb2Zmc2V0LCBjbGsgJiBMVkxfTUFTSyk7CisJCWludCBwb3MgPSBuZXh0X3BlbmRpbmdfYnVja2V0KGJhc2UsIG9mZnNldCwgY2xrICYgTFZMX01BU0ssCisJCQkgIGx2bCk7CiAKIAkJaWYgKHBvcyA+PSAwKSB7CiAJCQl1bnNpZ25lZCBsb25nIHRtcCA9IGNsayArICh1bnNpZ25lZCBsb25nKSBwb3M7CkBAIC0xNTI5LDEyICsxNTU3LDE4IEBACiAJCWJhc2UtPmlzX2lkbGUgPSBmYWxzZTsKIAl9IGVsc2UgewogCQlpZiAoIWlzX21heF9kZWx0YSkKLQkJCWV4cGlyZXMgPSBiYXNlbSArIChuZXh0ZXZ0IC0gYmFzZWopICogVElDS19OU0VDOworCQkJZXhwaXJlcyA9IGJhc2VtICsgKHU2NCkobmV4dGV2dCAtIGJhc2VqKSAqIFRJQ0tfTlNFQzsKIAkJLyoKLQkJICogSWYgd2UgZXhwZWN0IHRvIHNsZWVwIG1vcmUgdGhhbiBhIHRpY2ssIG1hcmsgdGhlIGJhc2UgaWRsZToKKwkJICogSWYgd2UgZXhwZWN0IHRvIHNsZWVwIG1vcmUgdGhhbiBhIHRpY2ssIG1hcmsgdGhlIGJhc2UgaWRsZS4KKwkJICogQWxzbyB0aGUgdGljayBpcyBzdG9wcGVkIHNvIGFueSBhZGRlZCB0aW1lciBtdXN0IGZvcndhcmQKKwkJICogdGhlIGJhc2UgY2xrIGl0c2VsZiB0byBrZWVwIGdyYW51bGFyaXR5IHNtYWxsLiBUaGlzIGlkbGUKKwkJICogbG9naWMgaXMgb25seSBtYWludGFpbmVkIGZvciB0aGUgQkFTRV9TVEQgYmFzZSwgZGVmZXJyYWJsZQorCQkgKiB0aW1lcnMgbWF5IHN0aWxsIHNlZSBsYXJnZSBncmFudWxhcml0eSBza2V3IChieSBkZXNpZ24pLgogCQkgKi8KLQkJaWYgKChleHBpcmVzIC0gYmFzZW0pID4gVElDS19OU0VDKQorCQlpZiAoKGV4cGlyZXMgLSBiYXNlbSkgPiBUSUNLX05TRUMpIHsKKwkJCWJhc2UtPm11c3RfZm9yd2FyZF9jbGsgPSB0cnVlOwogCQkJYmFzZS0+aXNfaWRsZSA9IHRydWU7CisJCX0KIAl9CiAJc3Bpbl91bmxvY2soJmJhc2UtPmxvY2spOwogCkBAIC0xNjQ0LDYgKzE2NzgsMTkgQEAKIHsKIAlzdHJ1Y3QgdGltZXJfYmFzZSAqYmFzZSA9IHRoaXNfY3B1X3B0cigmdGltZXJfYmFzZXNbQkFTRV9TVERdKTsKIAorCS8qCisJICogbXVzdF9mb3J3YXJkX2NsayBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJ1bm5pbmcgdGltZXJzIHNvIHRoYXQgYW55CisJICogdGltZXIgZnVuY3Rpb25zIHRoYXQgY2FsbCBtb2RfdGltZXIgd2lsbCBub3QgdHJ5IHRvIGZvcndhcmQgdGhlCisJICogYmFzZS4gaWRsZSB0cmNraW5nIC8gY2xvY2sgZm9yd2FyZGluZyBsb2dpYyBpcyBvbmx5IHVzZWQgd2l0aAorCSAqIEJBU0VfU1REIHRpbWVycy4KKwkgKgorCSAqIFRoZSBkZWZlcnJhYmxlIGJhc2UgZG9lcyBub3QgZG8gaWRsZSB0cmFja2luZyBhdCBhbGwsIHNvIHdlIGRvCisJICogbm90IGZvcndhcmQgaXQuIFRoaXMgY2FuIHJlc3VsdCBpbiB2ZXJ5IGxhcmdlIHZhcmlhdGlvbnMgaW4KKwkgKiBncmFudWxhcml0eSBmb3IgZGVmZXJyYWJsZSB0aW1lcnMsIGJ1dCB0aGV5IGNhbiBiZSBkZWZlcnJlZCBmb3IKKwkgKiBsb25nIHBlcmlvZHMgZHVlIHRvIGlkbGUuCisJICovCisJYmFzZS0+bXVzdF9mb3J3YXJkX2NsayA9IGZhbHNlOworCiAJX19ydW5fdGltZXJzKGJhc2UpOwogCWlmIChJU19FTkFCTEVEKENPTkZJR19OT19IWl9DT01NT04pICYmIGJhc2UtPm5vaHpfYWN0aXZlKQogCQlfX3J1bl90aW1lcnModGhpc19jcHVfcHRyKCZ0aW1lcl9iYXNlc1tCQVNFX0RFRl0pKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYwppbmRleCA1ZGNiOTkyLi40MTgwNWZiIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYnBmX3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jCkBAIC0yMDMsMTAgKzIwMywzNiBAQAogCQlmbXRfY250Kys7CiAJfQogCi0JcmV0dXJuIF9fdHJhY2VfcHJpbnRrKDEvKiBmYWtlIGlwIHdpbGwgbm90IGJlIHByaW50ZWQgKi8sIGZtdCwKLQkJCSAgICAgIG1vZFswXSA9PSAyID8gYXJnMSA6IG1vZFswXSA9PSAxID8gKGxvbmcpIGFyZzEgOiAodTMyKSBhcmcxLAotCQkJICAgICAgbW9kWzFdID09IDIgPyBhcmcyIDogbW9kWzFdID09IDEgPyAobG9uZykgYXJnMiA6ICh1MzIpIGFyZzIsCi0JCQkgICAgICBtb2RbMl0gPT0gMiA/IGFyZzMgOiBtb2RbMl0gPT0gMSA/IChsb25nKSBhcmczIDogKHUzMikgYXJnMyk7CisvKiBIb3JyaWQgd29ya2Fyb3VuZCBmb3IgZ2V0dGluZyB2YV9saXN0IGhhbmRsaW5nIHdvcmtpbmcgd2l0aCBkaWZmZXJlbnQKKyAqIGFyZ3VtZW50IHR5cGUgY29tYmluYXRpb25zIGdlbmVyaWNhbGx5IGZvciAzMiBhbmQgNjQgYml0IGFyY2hzLgorICovCisjZGVmaW5lIF9fQlBGX1RQX0VNSVQoKQlfX0JQRl9BUkczX1RQKCkKKyNkZWZpbmUgX19CUEZfVFAoLi4uKQkJCQkJCQlcCisJX190cmFjZV9wcmludGsoMSAvKiBGYWtlIGlwIHdpbGwgbm90IGJlIHByaW50ZWQuICovLAkJXAorCQkgICAgICAgZm10LCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fQlBGX0FSRzFfVFAoLi4uKQkJCQkJCVwKKwkoKG1vZFswXSA9PSAyIHx8IChtb2RbMF0gPT0gMSAmJiBfX0JJVFNfUEVSX0xPTkcgPT0gNjQpKQlcCisJICA/IF9fQlBGX1RQKGFyZzEsICMjX19WQV9BUkdTX18pCQkJCVwKKwkgIDogKChtb2RbMF0gPT0gMSB8fCAobW9kWzBdID09IDAgJiYgX19CSVRTX1BFUl9MT05HID09IDMyKSkJXAorCSAgICAgID8gX19CUEZfVFAoKGxvbmcpYXJnMSwgIyNfX1ZBX0FSR1NfXykJCQlcCisJICAgICAgOiBfX0JQRl9UUCgodTMyKWFyZzEsICMjX19WQV9BUkdTX18pKSkKKworI2RlZmluZSBfX0JQRl9BUkcyX1RQKC4uLikJCQkJCQlcCisJKChtb2RbMV0gPT0gMiB8fCAobW9kWzFdID09IDEgJiYgX19CSVRTX1BFUl9MT05HID09IDY0KSkJXAorCSAgPyBfX0JQRl9BUkcxX1RQKGFyZzIsICMjX19WQV9BUkdTX18pCQkJCVwKKwkgIDogKChtb2RbMV0gPT0gMSB8fCAobW9kWzFdID09IDAgJiYgX19CSVRTX1BFUl9MT05HID09IDMyKSkJXAorCSAgICAgID8gX19CUEZfQVJHMV9UUCgobG9uZylhcmcyLCAjI19fVkFfQVJHU19fKQkJXAorCSAgICAgIDogX19CUEZfQVJHMV9UUCgodTMyKWFyZzIsICMjX19WQV9BUkdTX18pKSkKKworI2RlZmluZSBfX0JQRl9BUkczX1RQKC4uLikJCQkJCQlcCisJKChtb2RbMl0gPT0gMiB8fCAobW9kWzJdID09IDEgJiYgX19CSVRTX1BFUl9MT05HID09IDY0KSkJXAorCSAgPyBfX0JQRl9BUkcyX1RQKGFyZzMsICMjX19WQV9BUkdTX18pCQkJCVwKKwkgIDogKChtb2RbMl0gPT0gMSB8fCAobW9kWzJdID09IDAgJiYgX19CSVRTX1BFUl9MT05HID09IDMyKSkJXAorCSAgICAgID8gX19CUEZfQVJHMl9UUCgobG9uZylhcmczLCAjI19fVkFfQVJHU19fKQkJXAorCSAgICAgIDogX19CUEZfQVJHMl9UUCgodTMyKWFyZzMsICMjX19WQV9BUkdTX18pKSkKKworCXJldHVybiBfX0JQRl9UUF9FTUlUKCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3RyYWNlX3ByaW50a19wcm90byA9IHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCA0ZjdlYTg0Li42ZTQzMmVkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC04NzYsNiArODc2LDEwIEBACiAKIAlmdW5jdGlvbl9wcm9maWxlX2NhbGwodHJhY2UtPmZ1bmMsIDAsIE5VTEwsIE5VTEwpOwogCisJLyogSWYgZnVuY3Rpb24gZ3JhcGggaXMgc2h1dHRpbmcgZG93biwgcmV0X3N0YWNrIGNhbiBiZSBOVUxMICovCisJaWYgKCFjdXJyZW50LT5yZXRfc3RhY2spCisJCXJldHVybiAwOworCiAJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBGVFJBQ0VfUkVURlVOQ19ERVBUSCkKIAkJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lID0gMDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCA0YTg0OGY3Li5jZGRlZGI1IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTU5OSwxMSArMTU5OSwxMSBAQAogCiAjZGVmaW5lIFNBVkVEX0NNRExJTkVTX0RFRkFVTFQgMTI4CiAjZGVmaW5lIE5PX0NNRExJTkVfTUFQIFVJTlRfTUFYCi1zdGF0aWMgdW5zaWduZWQgc2F2ZWRfdGdpZHNbU0FWRURfQ01ETElORVNfREVGQVVMVF07CiBzdGF0aWMgYXJjaF9zcGlubG9ja190IHRyYWNlX2NtZGxpbmVfbG9jayA9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQ7CiBzdHJ1Y3Qgc2F2ZWRfY21kbGluZXNfYnVmZmVyIHsKIAl1bnNpZ25lZCBtYXBfcGlkX3RvX2NtZGxpbmVbUElEX01BWF9ERUZBVUxUKzFdOwogCXVuc2lnbmVkICptYXBfY21kbGluZV90b19waWQ7CisJdW5zaWduZWQgKm1hcF9jbWRsaW5lX3RvX3RnaWQ7CiAJdW5zaWduZWQgY21kbGluZV9udW07CiAJaW50IGNtZGxpbmVfaWR4OwogCWNoYXIgKnNhdmVkX2NtZGxpbmVzOwpAQCAtMTYzNywxMiArMTYzNywyMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlzLT5tYXBfY21kbGluZV90b190Z2lkID0ga21hbGxvY19hcnJheSh2YWwsCisJCQkJCSAgICAgICBzaXplb2YoKnMtPm1hcF9jbWRsaW5lX3RvX3RnaWQpLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzLT5tYXBfY21kbGluZV90b190Z2lkKSB7CisJCWtmcmVlKHMtPm1hcF9jbWRsaW5lX3RvX3BpZCk7CisJCWtmcmVlKHMtPnNhdmVkX2NtZGxpbmVzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcy0+Y21kbGluZV9pZHggPSAwOwogCXMtPmNtZGxpbmVfbnVtID0gdmFsOwogCW1lbXNldCgmcy0+bWFwX3BpZF90b19jbWRsaW5lLCBOT19DTURMSU5FX01BUCwKIAkgICAgICAgc2l6ZW9mKHMtPm1hcF9waWRfdG9fY21kbGluZSkpOwogCW1lbXNldChzLT5tYXBfY21kbGluZV90b19waWQsIE5PX0NNRExJTkVfTUFQLAogCSAgICAgICB2YWwgKiBzaXplb2YoKnMtPm1hcF9jbWRsaW5lX3RvX3BpZCkpOworCW1lbXNldChzLT5tYXBfY21kbGluZV90b190Z2lkLCBOT19DTURMSU5FX01BUCwKKwkgICAgICAgdmFsICogc2l6ZW9mKCpzLT5tYXBfY21kbGluZV90b190Z2lkKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MDgsMTQgKzE4MTksMTcgQEAKIAlpZiAoIXRzay0+cGlkIHx8IHVubGlrZWx5KHRzay0+cGlkID4gUElEX01BWF9ERUZBVUxUKSkKIAkJcmV0dXJuIDA7CiAKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKgogCSAqIEl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkIGlmIHdlIGRvbid0IGdldAogCSAqIHRoZSBsb2NrLCBidXQgd2UgYWxzbyBkb24ndCB3YW50IHRvIHNwaW4KIAkgKiBub3IgZG8gd2Ugd2FudCB0byBkaXNhYmxlIGludGVycnVwdHMsCiAJICogc28gaWYgd2UgbWlzcyBoZXJlLCB0aGVuIGJldHRlciBsdWNrIG5leHQgdGltZS4KIAkgKi8KLQlpZiAoIWFyY2hfc3Bpbl90cnlsb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spKQorCWlmICghYXJjaF9zcGluX3RyeWxvY2soJnRyYWNlX2NtZGxpbmVfbG9jaykpIHsKKwkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJaWR4ID0gc2F2ZWRjbWQtPm1hcF9waWRfdG9fY21kbGluZVt0c2stPnBpZF07CiAJaWYgKGlkeCA9PSBOT19DTURMSU5FX01BUCkgewpAQCAtMTgzOCw4ICsxODUyLDkgQEAKIAl9CiAKIAlzZXRfY21kbGluZShpZHgsIHRzay0+Y29tbSk7Ci0Jc2F2ZWRfdGdpZHNbaWR4XSA9IHRzay0+dGdpZDsKKwlzYXZlZGNtZC0+bWFwX2NtZGxpbmVfdG9fdGdpZFtpZHhdID0gdHNrLT50Z2lkOwogCWFyY2hfc3Bpbl91bmxvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTg4MSwxOSArMTg5NiwyOSBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKLWludCB0cmFjZV9maW5kX3RnaWQoaW50IHBpZCkKK3N0YXRpYyBpbnQgX19maW5kX3RnaWRfbG9ja2VkKGludCBwaWQpCiB7CiAJdW5zaWduZWQgbWFwOwogCWludCB0Z2lkOwogCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JYXJjaF9zcGluX2xvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CiAJbWFwID0gc2F2ZWRjbWQtPm1hcF9waWRfdG9fY21kbGluZVtwaWRdOwogCWlmIChtYXAgIT0gTk9fQ01ETElORV9NQVApCi0JCXRnaWQgPSBzYXZlZF90Z2lkc1ttYXBdOworCQl0Z2lkID0gc2F2ZWRjbWQtPm1hcF9jbWRsaW5lX3RvX3RnaWRbbWFwXTsKIAllbHNlCiAJCXRnaWQgPSAtMTsKIAorCXJldHVybiB0Z2lkOworfQorCitpbnQgdHJhY2VfZmluZF90Z2lkKGludCBwaWQpCit7CisJaW50IHRnaWQ7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlhcmNoX3NwaW5fbG9jaygmdHJhY2VfY21kbGluZV9sb2NrKTsKKworCXRnaWQgPSBfX2ZpbmRfdGdpZF9sb2NrZWQocGlkKTsKKwogCWFyY2hfc3Bpbl91bmxvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIApAQCAtNDM4NiwxMCArNDQxMSwxNSBAQAogewogCWNoYXIgYnVmWzY0XTsKIAlpbnQgcjsKKwl1bnNpZ25lZCBpbnQgbjsKIAorCXByZWVtcHRfZGlzYWJsZSgpOwogCWFyY2hfc3Bpbl9sb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spOwotCXIgPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBzYXZlZGNtZC0+Y21kbGluZV9udW0pOworCW4gPSBzYXZlZGNtZC0+Y21kbGluZV9udW07CiAJYXJjaF9zcGluX3VubG9jaygmdHJhY2VfY21kbGluZV9sb2NrKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJciA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXVcbiIsIG4pOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCByKTsKIH0KQEAgLTQzOTgsNiArNDQyOCw3IEBACiB7CiAJa2ZyZWUocy0+c2F2ZWRfY21kbGluZXMpOwogCWtmcmVlKHMtPm1hcF9jbWRsaW5lX3RvX3BpZCk7CisJa2ZyZWUocy0+bWFwX2NtZGxpbmVfdG9fdGdpZCk7CiAJa2ZyZWUocyk7CiB9CiAKQEAgLTQ0MTQsMTAgKzQ0NDUsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJYXJjaF9zcGluX2xvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CiAJc2F2ZWRjbWRfdGVtcCA9IHNhdmVkY21kOwogCXNhdmVkY21kID0gczsKIAlhcmNoX3NwaW5fdW5sb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CiAJZnJlZV9zYXZlZF9jbWRsaW5lc19idWZmZXIoc2F2ZWRjbWRfdGVtcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTQ2MzYsMzMgKzQ2NjksNjEgQEAKIAljaGFyICpmaWxlX2J1ZjsKIAljaGFyICpidWY7CiAJaW50IGxlbiA9IDA7Ci0JaW50IHBpZDsKIAlpbnQgaTsKKwlpbnQgKnBpZHM7CisJaW50IG4gPSAwOwogCi0JZmlsZV9idWYgPSBrbWFsbG9jKFNBVkVEX0NNRExJTkVTX0RFRkFVTFQqKDE2KzErMTYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZpbGVfYnVmKQorCXByZWVtcHRfZGlzYWJsZSgpOworCWFyY2hfc3Bpbl9sb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spOworCisJcGlkcyA9IGttYWxsb2NfYXJyYXkoc2F2ZWRjbWQtPmNtZGxpbmVfbnVtLCAyKnNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBpZHMpIHsKKwkJYXJjaF9zcGluX3VubG9jaygmdHJhY2VfY21kbGluZV9sb2NrKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0JYnVmID0gZmlsZV9idWY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU0FWRURfQ01ETElORVNfREVGQVVMVDsgaSsrKSB7Ci0JCWludCB0Z2lkOwotCQlpbnQgcjsKKwlmb3IgKGkgPSAwOyBpIDwgc2F2ZWRjbWQtPmNtZGxpbmVfbnVtOyBpKyspIHsKKwkJaW50IHBpZDsKIAogCQlwaWQgPSBzYXZlZGNtZC0+bWFwX2NtZGxpbmVfdG9fcGlkW2ldOwogCQlpZiAocGlkID09IC0xIHx8IHBpZCA9PSBOT19DTURMSU5FX01BUCkKIAkJCWNvbnRpbnVlOwogCi0JCXRnaWQgPSB0cmFjZV9maW5kX3RnaWQocGlkKTsKLQkJciA9IHNwcmludGYoYnVmLCAiJWQgJWRcbiIsIHBpZCwgdGdpZCk7CisJCXBpZHNbbl0gPSBwaWQ7CisJCXBpZHNbbisxXSA9IF9fZmluZF90Z2lkX2xvY2tlZChwaWQpOworCQluICs9IDI7CisJfQorCWFyY2hfc3Bpbl91bmxvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCWlmIChuID09IDApIHsKKwkJa2ZyZWUocGlkcyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGVub3VnaCB0byBob2xkIG1heCBwYWlyIG9mIHBpZHMgKyBzcGFjZSwgbHIgYW5kIG51bCAqLworCWxlbiA9IG4gKiAxMjsKKwlmaWxlX2J1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGVfYnVmKSB7CisJCWtmcmVlKHBpZHMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWYgPSBmaWxlX2J1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgbiAmJiBsZW4gPiAwOyBpICs9IDIpIHsKKwkJaW50IHI7CisKKwkJciA9IHNucHJpbnRmKGJ1ZiwgbGVuLCAiJWQgJWRcbiIsIHBpZHNbaV0sIHBpZHNbaSsxXSk7CiAJCWJ1ZiArPSByOwotCQlsZW4gKz0gcjsKKwkJbGVuIC09IHI7CiAJfQogCiAJbGVuID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY250LCBwcG9zLAotCQkJCSAgICAgIGZpbGVfYnVmLCBsZW4pOworCQkJCSAgICAgIGZpbGVfYnVmLCBidWYgLSBmaWxlX2J1Zik7CiAKIAlrZnJlZShmaWxlX2J1Zik7CisJa2ZyZWUocGlkcyk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtNzg2NSw0ICs3OTI2LDQgQEAKIH0KIAogZnNfaW5pdGNhbGwodHJhY2VyX2luaXRfdHJhY2Vmcyk7Ci1sYXRlX2luaXRjYWxsKGNsZWFyX2Jvb3RfdHJhY2VyKTsKK2xhdGVfaW5pdGNhbGxfc3luYyhjbGVhcl9ib290X3RyYWNlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwppbmRleCA5ZGFhOWIzLi4wMTkzZjU4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKQEAgLTE5MjYsNiArMTkyNiwxMCBAQAogCQlpZiAoZXJyICYmIHNldF9zdHIpCiAJCQlhcHBlbmRfZmlsdGVyX2VycihwcywgZmlsdGVyKTsKIAl9CisJaWYgKGVyciAmJiAhc2V0X3N0cikgeworCQlmcmVlX2V2ZW50X2ZpbHRlcihmaWx0ZXIpOworCQlmaWx0ZXIgPSBOVUxMOworCX0KIAljcmVhdGVfZmlsdGVyX2ZpbmlzaChwcyk7CiAKIAkqZmlsdGVycCA9IGZpbHRlcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjaW5nX21hcC5jIGIva2VybmVsL3RyYWNlL3RyYWNpbmdfbWFwLmMKaW5kZXggMGE2ODliYi4uMzA1MDM5YiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNpbmdfbWFwLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNpbmdfbWFwLmMKQEAgLTIyMSwxNiArMjIxLDE5IEBACiAJaWYgKCFhKQogCQlyZXR1cm47CiAKLQlpZiAoIWEtPnBhZ2VzKSB7Ci0JCWtmcmVlKGEpOwotCQlyZXR1cm47Ci0JfQorCWlmICghYS0+cGFnZXMpCisJCWdvdG8gZnJlZTsKIAogCWZvciAoaSA9IDA7IGkgPCBhLT5uX3BhZ2VzOyBpKyspIHsKIAkJaWYgKCFhLT5wYWdlc1tpXSkKIAkJCWJyZWFrOwogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYS0+cGFnZXNbaV0pOwogCX0KKworCWtmcmVlKGEtPnBhZ2VzKTsKKworIGZyZWU6CisJa2ZyZWUoYSk7CiB9CiAKIHN0cnVjdCB0cmFjaW5nX21hcF9hcnJheSAqdHJhY2luZ19tYXBfYXJyYXlfYWxsb2ModW5zaWduZWQgaW50IG5fZWx0cywKZGlmZiAtLWdpdCBhL2tlcm5lbC93YXRjaGRvZy5jIGIva2VybmVsL3dhdGNoZG9nLmMKaW5kZXggY2ZmYjVmMi4uY2ZiZjAyNyAxMDA2NDQKLS0tIGEva2VybmVsL3dhdGNoZG9nLmMKKysrIGIva2VybmVsL3dhdGNoZG9nLmMKQEAgLTgxLDEwICs4MSwxMCBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgd2F0Y2hkb2dfZW4pOwogc3RhdGljIERFRklORV9QRVJfQ1BVKGJvb2wsIHNvZnRsb2NrdXBfdG91Y2hfc3luYyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwgc29mdF93YXRjaGRvZ193YXJuKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBocnRpbWVyX2ludGVycnVwdHMpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHNvZnRfbG9ja3VwX2hydGltZXJfY250KTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgc29mdGxvY2t1cF90YXNrX3B0cl9zYXZlZCk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgaHJ0aW1lcl9pbnRlcnJ1cHRzX3NhdmVkKTsKK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGhydGltZXJfaW50ZXJydXB0cyk7CitERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBocnRpbWVyX2ludGVycnVwdHNfc2F2ZWQpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc29mdF9sb2NrdXBfbm1pX3dhcm47CiAKIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHNvZnRsb2NrdXBfcGFuaWMgPQpAQCAtMjU0LDYgKzI1NCwxMCBAQAogewogfQogCit2b2lkIF9fd2VhayB3YXRjaGRvZ19jaGVja19oYXJkbG9ja3VwX290aGVyX2NwdSh2b2lkKQoreworfQorCiBzdGF0aWMgaW50IHdhdGNoZG9nX2VuYWJsZV9hbGxfY3B1cyh2b2lkKTsKIHN0YXRpYyB2b2lkIHdhdGNoZG9nX2Rpc2FibGVfYWxsX2NwdXModm9pZCk7CiAKQEAgLTI3MSw2ICsyNzUsOSBAQAogCS8qIGtpY2sgdGhlIGhhcmRsb2NrdXAgZGV0ZWN0b3IgKi8KIAl3YXRjaGRvZ19pbnRlcnJ1cHRfY291bnQoKTsKIAorCS8qIHRlc3QgZm9yIGhhcmRsb2NrdXBzIG9uIHRoZSBuZXh0IGNwdSAqLworCXdhdGNoZG9nX2NoZWNrX2hhcmRsb2NrdXBfb3RoZXJfY3B1KCk7CisKIAkvKiBraWNrIHRoZSBzb2Z0bG9ja3VwIGRldGVjdG9yICovCiAJd2FrZV91cF9wcm9jZXNzKF9fdGhpc19jcHVfcmVhZChzb2Z0bG9ja3VwX3dhdGNoZG9nKSk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC93YXRjaGRvZ19obGQuYyBiL2tlcm5lbC93YXRjaGRvZ19obGQuYwppbmRleCAxMmI4ZGQ2Li41YjJjMTI3IDEwMDY0NAotLS0gYS9rZXJuZWwvd2F0Y2hkb2dfaGxkLmMKKysrIGIva2VybmVsL3dhdGNoZG9nX2hsZC5jCkBAIC0xOCw3ICsxOCwxMSBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYm9vbCwgaGFyZF93YXRjaGRvZ193YXJuKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShib29sLCB3YXRjaGRvZ19ubWlfdG91Y2gpOworI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SX09USEVSX0NQVQorc3RhdGljIGNwdW1hc2tfdCBfX3JlYWRfbW9zdGx5IHdhdGNoZG9nX2NwdXM7CisjZWxzZQogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2V2ZW50ICosIHdhdGNoZG9nX2V2KTsKKyNlbmRpZgogCiAvKiBib290IGNvbW1hbmRzICovCiAvKgpAQCAtMjYsNyArMzAsMTAgQEAKICAqLwogdW5zaWduZWQgaW50IF9fcmVhZF9tb3N0bHkgaGFyZGxvY2t1cF9wYW5pYyA9CiAJCQlDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUNfVkFMVUU7CisKKyNpZmRlZiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUl9OTUkKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhhcmRsb2NrdXBfYWxsY3B1X2R1bXBlZDsKKyNlbmRpZgogLyoKICAqIFdlIG1heSBub3Qgd2FudCB0byBlbmFibGUgaGFyZCBsb2NrdXAgZGV0ZWN0aW9uIGJ5IGRlZmF1bHQgaW4gYWxsIGNhc2VzLAogICogZm9yIGV4YW1wbGUgd2hlbiBydW5uaW5nIHRoZSBrZXJuZWwgYXMgYSBndWVzdCBvbiBhIGh5cGVydmlzb3IuIEluIHRoZXNlCkBAIC02OCw2ICs3NSwxMDggQEAKIH0KIEVYUE9SVF9TWU1CT0wodG91Y2hfbm1pX3dhdGNoZG9nKTsKIAorI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SX09USEVSX0NQVQorc3RhdGljIHVuc2lnbmVkIGludCB3YXRjaGRvZ19uZXh0X2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWNwdW1hc2tfdCBjcHVzID0gd2F0Y2hkb2dfY3B1czsKKwl1bnNpZ25lZCBpbnQgbmV4dF9jcHU7CisKKwluZXh0X2NwdSA9IGNwdW1hc2tfbmV4dChjcHUsICZjcHVzKTsKKwlpZiAobmV4dF9jcHUgPj0gbnJfY3B1X2lkcykKKwkJbmV4dF9jcHUgPSBjcHVtYXNrX2ZpcnN0KCZjcHVzKTsKKworCWlmIChuZXh0X2NwdSA9PSBjcHUpCisJCXJldHVybiBucl9jcHVfaWRzOworCisJcmV0dXJuIG5leHRfY3B1OworfQorCitzdGF0aWMgaW50IGlzX2hhcmRsb2NrdXBfb3RoZXJfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBocmludCA9IHBlcl9jcHUoaHJ0aW1lcl9pbnRlcnJ1cHRzLCBjcHUpOworCisJaWYgKHBlcl9jcHUoaHJ0aW1lcl9pbnRlcnJ1cHRzX3NhdmVkLCBjcHUpID09IGhyaW50KQorCQlyZXR1cm4gMTsKKworCXBlcl9jcHUoaHJ0aW1lcl9pbnRlcnJ1cHRzX3NhdmVkLCBjcHUpID0gaHJpbnQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd2F0Y2hkb2dfY2hlY2tfaGFyZGxvY2t1cF9vdGhlcl9jcHUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV4dF9jcHU7CisKKwkvKgorCSAqIFRlc3QgZm9yIGhhcmRsb2NrdXBzIGV2ZXJ5IDMgc2FtcGxlcy4gIFRoZSBzYW1wbGUgcGVyaW9kIGlzCisJICogIHdhdGNoZG9nX3RocmVzaCAqIDIgLyA1LCBzbyAzIHNhbXBsZXMgZ2V0cyB1cyBiYWNrIHRvIHNsaWdodGx5IG92ZXIKKwkgKiAgd2F0Y2hkb2dfdGhyZXNoIChvdmVyIGJ5IDIwJSkuCisJICovCisJaWYgKF9fdGhpc19jcHVfcmVhZChocnRpbWVyX2ludGVycnVwdHMpICUgMyAhPSAwKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBmb3IgYSBoYXJkbG9ja3VwIG9uIHRoZSBuZXh0IGNwdSAqLworCW5leHRfY3B1ID0gd2F0Y2hkb2dfbmV4dF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAobmV4dF9jcHUgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuOworCisJc21wX3JtYigpOworCisJaWYgKHBlcl9jcHUod2F0Y2hkb2dfbm1pX3RvdWNoLCBuZXh0X2NwdSkgPT0gdHJ1ZSkgeworCQlwZXJfY3B1KHdhdGNoZG9nX25taV90b3VjaCwgbmV4dF9jcHUpID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfaGFyZGxvY2t1cF9vdGhlcl9jcHUobmV4dF9jcHUpKSB7CisJCS8qIG9ubHkgd2FybiBvbmNlICovCisJCWlmIChwZXJfY3B1KGhhcmRfd2F0Y2hkb2dfd2FybiwgbmV4dF9jcHUpID09IHRydWUpCisJCQlyZXR1cm47CisKKwkJaWYgKGhhcmRsb2NrdXBfcGFuaWMpCisJCQlwYW5pYygiV2F0Y2hkb2cgZGV0ZWN0ZWQgaGFyZCBMT0NLVVAgb24gY3B1ICV1IiwKKwkJCQluZXh0X2NwdSk7CisJCWVsc2UKKwkJCVdBUk4oMSwgIldhdGNoZG9nIGRldGVjdGVkIGhhcmQgTE9DS1VQIG9uIGNwdSAldSIsCisJCQkJbmV4dF9jcHUpOworCisJCXBlcl9jcHUoaGFyZF93YXRjaGRvZ193YXJuLCBuZXh0X2NwdSkgPSB0cnVlOworCX0gZWxzZSB7CisJCXBlcl9jcHUoaGFyZF93YXRjaGRvZ193YXJuLCBuZXh0X2NwdSkgPSBmYWxzZTsKKwl9Cit9CisKK2ludCB3YXRjaGRvZ19ubWlfZW5hYmxlKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBUaGUgbmV3IGNwdSB3aWxsIGJlIG1hcmtlZCBvbmxpbmUgYmVmb3JlIHRoZSBmaXJzdCBocnRpbWVyIGludGVycnVwdAorCSAqIHJ1bnMgb24gaXQuICBJZiBhbm90aGVyIGNwdSB0ZXN0cyBmb3IgYSBoYXJkbG9ja3VwIG9uIHRoZSBuZXcgY3B1CisJICogYmVmb3JlIGl0IGhhcyBydW4gaXRzIGZpcnN0IGhydGltZXIsIGl0IHdpbGwgZ2V0IGEgZmFsc2UgcG9zaXRpdmUuCisJICogVG91Y2ggdGhlIHdhdGNoZG9nIG9uIHRoZSBuZXcgY3B1IHRvIGRlbGF5IHRoZSBmaXJzdCBjaGVjayBmb3IgYXQKKwkgKiBsZWFzdCAzIHNhbXBsaW5nIHBlcmlvZHMgdG8gZ3VhcmFudGVlIG9uZSBocnRpbWVyIGhhcyBydW4gb24gdGhlIG5ldworCSAqIGNwdS4KKwkgKi8KKwlwZXJfY3B1KHdhdGNoZG9nX25taV90b3VjaCwgY3B1KSA9IHRydWU7CisJc21wX3dtYigpOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZ3YXRjaGRvZ19jcHVzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB3YXRjaGRvZ19ubWlfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCBuZXh0X2NwdSA9IHdhdGNoZG9nX25leHRfY3B1KGNwdSk7CisKKwkvKgorCSAqIE9mZmxpbmluZyB0aGlzIGNwdSB3aWxsIGNhdXNlIHRoZSBjcHUgYmVmb3JlIHRoaXMgb25lIHRvIHN0YXJ0CisJICogY2hlY2tpbmcgdGhlIG9uZSBhZnRlciB0aGlzIG9uZS4gIElmIHRoaXMgY3B1IGp1c3QgZmluaXNoZWQgY2hlY2tpbmcKKwkgKiB0aGUgbmV4dCBjcHUgYW5kIHVwZGF0aW5nIGhydGltZXJfaW50ZXJydXB0c19zYXZlZCwgYW5kIHRoZW4gdGhlCisJICogcHJldmlvdXMgY3B1IGNoZWNrcyBpdCB3aXRoaW4gb25lIHNhbXBsZSBwZXJpb2QsIGl0IHdpbGwgdHJpZ2dlciBhCisJICogZmFsc2UgcG9zaXRpdmUuICBUb3VjaCB0aGUgd2F0Y2hkb2cgb24gdGhlIG5leHQgY3B1IHRvIHByZXZlbnQgaXQuCisJICovCisJaWYgKG5leHRfY3B1IDwgbnJfY3B1X2lkcykKKwkJcGVyX2NwdSh3YXRjaGRvZ19ubWlfdG91Y2gsIG5leHRfY3B1KSA9IHRydWU7CisJc21wX3dtYigpOworCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhdGNoZG9nX2NwdXMpOworfQorI2Vsc2UKIHN0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIHdkX2h3X2F0dHIgPSB7CiAJLnR5cGUJCT0gUEVSRl9UWVBFX0hBUkRXQVJFLAogCS5jb25maWcJCT0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLApAQCAtMjI4LDMgKzMzNyw0IEBACiAJCWNwdTBfZXJyID0gMDsKIAl9CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCA4MTJiOGY4Li4wZTVlNTRmIDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0zNzM3LDggKzM3MzcsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBjcmVhdGluZyBtdWx0aXBsZSBwd3FzIGJyZWFrcyBvcmRlcmluZyBndWFyYW50ZWUgKi8KLQlpZiAoV0FSTl9PTigod3EtPmZsYWdzICYgX19XUV9PUkRFUkVEKSAmJiAhbGlzdF9lbXB0eSgmd3EtPnB3cXMpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFsaXN0X2VtcHR5KCZ3cS0+cHdxcykpIHsKKwkJaWYgKFdBUk5fT04od3EtPmZsYWdzICYgX19XUV9PUkRFUkVEX0VYUExJQ0lUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXdxLT5mbGFncyAmPSB+X19XUV9PUkRFUkVEOworCX0KIAogCWN0eCA9IGFwcGx5X3dxYXR0cnNfcHJlcGFyZSh3cSwgYXR0cnMpOwogCWlmICghY3R4KQpAQCAtMzkyMiw2ICszOTI2LDE2IEBACiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCXN0cnVjdCBwb29sX3dvcmtxdWV1ZSAqcHdxOwogCisJLyoKKwkgKiBVbmJvdW5kICYmIG1heF9hY3RpdmUgPT0gMSB1c2VkIHRvIGltcGx5IG9yZGVyZWQsIHdoaWNoIGlzIG5vCisJICogbG9uZ2VyIHRoZSBjYXNlIG9uIE5VTUEgbWFjaGluZXMgZHVlIHRvIHBlci1ub2RlIHBvb2xzLiAgV2hpbGUKKwkgKiBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgpIGlzIHRoZSByaWdodCB3YXkgdG8gY3JlYXRlIGFuIG9yZGVyZWQKKwkgKiB3b3JrcXVldWUsIGtlZXAgdGhlIHByZXZpb3VzIGJlaGF2aW9yIHRvIGF2b2lkIHN1YnRsZSBicmVha2FnZXMKKwkgKiBvbiBOVU1BLgorCSAqLworCWlmICgoZmxhZ3MgJiBXUV9VTkJPVU5EKSAmJiBtYXhfYWN0aXZlID09IDEpCisJCWZsYWdzIHw9IF9fV1FfT1JERVJFRDsKKwogCS8qIHNlZSB0aGUgY29tbWVudCBhYm92ZSB0aGUgZGVmaW5pdGlvbiBvZiBXUV9QT1dFUl9FRkZJQ0lFTlQgKi8KIAlpZiAoKGZsYWdzICYgV1FfUE9XRVJfRUZGSUNJRU5UKSAmJiB3cV9wb3dlcl9lZmZpY2llbnQpCiAJCWZsYWdzIHw9IFdRX1VOQk9VTkQ7CkBAIC00MTEwLDEzICs0MTI0LDE0IEBACiAJc3RydWN0IHBvb2xfd29ya3F1ZXVlICpwd3E7CiAKIAkvKiBkaXNhbGxvdyBtZWRkbGluZyB3aXRoIG1heF9hY3RpdmUgZm9yIG9yZGVyZWQgd29ya3F1ZXVlcyAqLwotCWlmIChXQVJOX09OKHdxLT5mbGFncyAmIF9fV1FfT1JERVJFRCkpCisJaWYgKFdBUk5fT04od3EtPmZsYWdzICYgX19XUV9PUkRFUkVEX0VYUExJQ0lUKSkKIAkJcmV0dXJuOwogCiAJbWF4X2FjdGl2ZSA9IHdxX2NsYW1wX21heF9hY3RpdmUobWF4X2FjdGl2ZSwgd3EtPmZsYWdzLCB3cS0+bmFtZSk7CiAKIAltdXRleF9sb2NrKCZ3cS0+bXV0ZXgpOwogCisJd3EtPmZsYWdzICY9IH5fX1dRX09SREVSRUQ7CiAJd3EtPnNhdmVkX21heF9hY3RpdmUgPSBtYXhfYWN0aXZlOwogCiAJZm9yX2VhY2hfcHdxKHB3cSwgd3EpCkBAIC01MjIxLDcgKzUyMzYsNyBAQAogCSAqIGF0dHJpYnV0ZXMgYnJlYWtzIG9yZGVyaW5nIGd1YXJhbnRlZS4gIERpc2FsbG93IGV4cG9zaW5nIG9yZGVyZWQKIAkgKiB3b3JrcXVldWVzLgogCSAqLwotCWlmIChXQVJOX09OKHdxLT5mbGFncyAmIF9fV1FfT1JERVJFRCkpCisJaWYgKFdBUk5fT04od3EtPmZsYWdzICYgX19XUV9PUkRFUkVEX0VYUExJQ0lUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3cS0+d3FfZGV2ID0gd3FfZGV2ID0ga3phbGxvYyhzaXplb2YoKndxX2RldiksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAyZjlmN2FhLi4yODEyNTgwIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIGNvbmZpZyBERUJVR19JTkZPX1NQTElUCiAJYm9vbCAiUHJvZHVjZSBzcGxpdCBkZWJ1Z2luZm8gaW4gLmR3byBmaWxlcyIKLQlkZXBlbmRzIG9uIERFQlVHX0lORk8KKwlkZXBlbmRzIG9uIERFQlVHX0lORk8gJiYgIUZSVgogCWhlbHAKIAkgIEdlbmVyYXRlIGRlYnVnIGluZm8gaW50byBzZXBhcmF0ZSAuZHdvIGZpbGVzLiBUaGlzIHNpZ25pZmljYW50bHkKIAkgIHJlZHVjZXMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBzaXplIGZvciBidWlsZHMgd2l0aCBERUJVR19JTkZPLApAQCAtNzc5LDExICs3NzksMjAgQEAKIAkgIFRoZSBmcmVxdWVuY3kgb2YgaHJ0aW1lciBhbmQgTk1JIGV2ZW50cyBhbmQgdGhlIHNvZnQgYW5kIGhhcmQgbG9ja3VwCiAJICB0aHJlc2hvbGRzIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggdGhlIHN5c2N0bCB3YXRjaGRvZ190aHJlc2guCiAKLWNvbmZpZyBIQVJETE9DS1VQX0RFVEVDVE9SCitjb25maWcgSEFSRExPQ0tVUF9ERVRFQ1RPUl9OTUkKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBMT0NLVVBfREVURUNUT1IgJiYgIUhBVkVfTk1JX1dBVENIRE9HCiAJZGVwZW5kcyBvbiBQRVJGX0VWRU5UUyAmJiBIQVZFX1BFUkZfRVZFTlRTX05NSQogCitjb25maWcgSEFSRExPQ0tVUF9ERVRFQ1RPUl9PVEhFUl9DUFUKKyAgICAgICBkZWZfYm9vbCB5CisgICAgICAgZGVwZW5kcyBvbiBMT0NLVVBfREVURUNUT1IgJiYgU01QCisgICAgICAgZGVwZW5kcyBvbiAhSEFSRExPQ0tVUF9ERVRFQ1RPUl9OTUkgJiYgIUhBVkVfTk1JX1dBVENIRE9HCisKK2NvbmZpZyBIQVJETE9DS1VQX0RFVEVDVE9SCisgICAgICAgZGVmX2Jvb2wgeQorICAgICAgIGRlcGVuZHMgb24gSEFSRExPQ0tVUF9ERVRFQ1RPUl9OTUkgfHwgSEFSRExPQ0tVUF9ERVRFQ1RPUl9PVEhFUl9DUFUKKwogY29uZmlnIEJPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDCiAJYm9vbCAiUGFuaWMgKFJlYm9vdCkgT24gSGFyZCBMb2NrdXBzIgogCWRlcGVuZHMgb24gSEFSRExPQ0tVUF9ERVRFQ1RPUgpkaWZmIC0tZ2l0IGEvbGliL2x6NC9sejRoY19jb21wcmVzcy5jIGIvbGliL2x6NC9sejRoY19jb21wcmVzcy5jCmluZGV4IGYzNDRmNzYuLjZiMmUwNDYgMTAwNjQ0Ci0tLSBhL2xpYi9sejQvbHo0aGNfY29tcHJlc3MuYworKysgYi9saWIvbHo0L2x6NGhjX2NvbXByZXNzLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogI2VuZGlmCiAJaW50IG5iYXR0ZW1wdHMgPSBNQVhfTkJfQVRURU1QVFM7CiAJc2l6ZV90IHJlcGwgPSAwLCBtbCA9IDA7Ci0JdTE2IGRlbHRhOworCXUxNiBkZWx0YSA9IDA7CiAKIAkvKiBIQzQgbWF0Y2ggZmluZGVyICovCiAJbHo0aGNfaW5zZXJ0KGhjNCwgaXApOwpkaWZmIC0tZ2l0IGEvbGliL21waS9tcGljb2Rlci5jIGIvbGliL21waS9tcGljb2Rlci5jCmluZGV4IDVhMGY3NWEuLmVlYWQ0YjMgMTAwNjQ0Ci0tLSBhL2xpYi9tcGkvbXBpY29kZXIuYworKysgYi9saWIvbXBpL21waWNvZGVyLmMKQEAgLTM2NCwxMSArMzY0LDExIEBACiAJfQogCiAJbWl0ZXIuY29uc3VtZWQgPSBsemVyb3M7Ci0Jc2dfbWl0ZXJfc3RvcCgmbWl0ZXIpOwogCiAJbmJ5dGVzIC09IGx6ZXJvczsKIAluYml0cyA9IG5ieXRlcyAqIDg7CiAJaWYgKG5iaXRzID4gTUFYX0VYVEVSTl9NUElfQklUUykgeworCQlzZ19taXRlcl9zdG9wKCZtaXRlcik7CiAJCXByX2luZm8oIk1QSTogbXBpIHRvbyBsYXJnZSAoJXUgYml0cylcbiIsIG5iaXRzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzc2LDYgKzM3Niw4IEBACiAJaWYgKG5ieXRlcyA+IDApCiAJCW5iaXRzIC09IGNvdW50X2xlYWRpbmdfemVyb3MoKmJ1ZmYpIC0gKEJJVFNfUEVSX0xPTkcgLSA4KTsKIAorCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKKwogCW5saW1icyA9IERJVl9ST1VORF9VUChuYnl0ZXMsIEJZVEVTX1BFUl9NUElfTElNQik7CiAJdmFsID0gbXBpX2FsbG9jKG5saW1icyk7CiAJaWYgKCF2YWwpCmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCA1MzdhYzk5Li4wZWU0ZjU0IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCisrKyBiL21tL2ludGVybmFsLmgKQEAgLTc0LDExICs3NCwxNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaGlnaGVzdF9tZW1tYXBfcGZuOwogCiAvKgorICogTWF4aW11bSBudW1iZXIgb2YgcmVjbGFpbSByZXRyaWVzIHdpdGhvdXQgcHJvZ3Jlc3MgYmVmb3JlIHRoZSBPT00KKyAqIGtpbGxlciBpcyBjb25zaWRlciB0aGUgb25seSB3YXkgZm9yd2FyZC4KKyAqLworI2RlZmluZSBNQVhfUkVDTEFJTV9SRVRSSUVTIDE2CisKKy8qCiAgKiBpbiBtbS92bXNjYW4uYzoKICAqLwogZXh0ZXJuIGludCBpc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIHB1dGJhY2tfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIGJvb2wgcGdkYXRfcmVjbGFpbWFibGUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCk7CiAKIC8qCiAgKiBpbiBtbS9ybWFwLmM6CkBAIC00NzIsNiArNDc3LDcgQEAKICNpZmRlZiBDT05GSUdfQVJDSF9XQU5UX0JBVENIRURfVU5NQVBfVExCX0ZMVVNICiB2b2lkIHRyeV90b191bm1hcF9mbHVzaCh2b2lkKTsKIHZvaWQgdHJ5X3RvX3VubWFwX2ZsdXNoX2RpcnR5KHZvaWQpOwordm9pZCBmbHVzaF90bGJfYmF0Y2hlZF9wZW5kaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdHJ5X3RvX3VubWFwX2ZsdXNoKHZvaWQpCiB7CkBAIC00NzksNyArNDg1LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkodm9pZCkKIHsKIH0KLQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9iYXRjaGVkX3BlbmRpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfV0FOVF9CQVRDSEVEX1VOTUFQX1RMQl9GTFVTSCAqLwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzIHBhZ2VmbGFnX25hbWVzW107CmRpZmYgLS1naXQgYS9tbS9tYWR2aXNlLmMgYi9tbS9tYWR2aXNlLmMKaW5kZXggMjc5NjI3YS4uMDg4YTViMjIgMTAwNjQ0Ci0tLSBhL21tL21hZHZpc2UuYworKysgYi9tbS9tYWR2aXNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKQEAgLTI4Miw2ICsyODMsNyBAQAogCQlyZXR1cm4gMDsKIAogCW9yaWdfcHRlID0gcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKKwlmbHVzaF90bGJfYmF0Y2hlZF9wZW5kaW5nKG1tKTsKIAlhcmNoX2VudGVyX2xhenlfbW11X21vZGUoKTsKIAlmb3IgKDsgYWRkciAhPSBlbmQ7IHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSkgewogCQlwdGVudCA9ICpwdGU7CkBAIC0zMjksOCArMzMxLDggQEAKIAkJCQlwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZwdGwpOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJcHV0X3BhZ2UocGFnZSk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXB1dF9wYWdlKHBhZ2UpOwogCQkJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKIAkJCXB0ZS0tOwogCQkJYWRkciAtPSBQQUdFX1NJWkU7CkBAIC01MzEsNiArNTMzLDggQEAKIHN0YXRpYyBpbnQgbWFkdmlzZV9od3BvaXNvbihpbnQgYmh2LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcDsKKwlzdHJ1Y3Qgem9uZSAqem9uZTsKKwogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IFBBR0VfU0laRSA8PApAQCAtNTU5LDYgKzU2MywxMSBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CisKKwkvKiBFbnN1cmUgdGhhdCBhbGwgcG9pc29uZWQgcGFnZXMgYXJlIHJlbW92ZWQgZnJvbSBwZXItY3B1IGxpc3RzICovCisJZm9yX2VhY2hfcG9wdWxhdGVkX3pvbmUoem9uZSkKKwkJZHJhaW5fYWxsX3BhZ2VzKHpvbmUpOworCiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IGYxZWFiY2MuLjNiN2QyM2MgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtMzAxLDMxICszMDEsMjcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19BUkNIX0RJU0NBUkRfTUVNQkxPQ0sKLQotcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIGdldF9hbGxvY2F0ZWRfbWVtYmxvY2tfcmVzZXJ2ZWRfcmVnaW9uc19pbmZvKAotCQkJCQlwaHlzX2FkZHJfdCAqYWRkcikKKy8qKgorICogRGlzY2FyZCBtZW1vcnkgYW5kIHJlc2VydmVkIGFycmF5cyBpZiB0aGV5IHdlcmUgYWxsb2NhdGVkCisgKi8KK3ZvaWQgX19pbml0IG1lbWJsb2NrX2Rpc2NhcmQodm9pZCkKIHsKLQlpZiAobWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9ucyA9PSBtZW1ibG9ja19yZXNlcnZlZF9pbml0X3JlZ2lvbnMpCi0JCXJldHVybiAwOworCXBoeXNfYWRkcl90IGFkZHIsIHNpemU7CiAKLQkqYWRkciA9IF9fcGEobWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9ucyk7CisJaWYgKG1lbWJsb2NrLnJlc2VydmVkLnJlZ2lvbnMgIT0gbWVtYmxvY2tfcmVzZXJ2ZWRfaW5pdF9yZWdpb25zKSB7CisJCWFkZHIgPSBfX3BhKG1lbWJsb2NrLnJlc2VydmVkLnJlZ2lvbnMpOworCQlzaXplID0gUEFHRV9BTElHTihzaXplb2Yoc3RydWN0IG1lbWJsb2NrX3JlZ2lvbikgKgorCQkJCSAgbWVtYmxvY2sucmVzZXJ2ZWQubWF4KTsKKwkJX19tZW1ibG9ja19mcmVlX2xhdGUoYWRkciwgc2l6ZSk7CisJfQogCi0JcmV0dXJuIFBBR0VfQUxJR04oc2l6ZW9mKHN0cnVjdCBtZW1ibG9ja19yZWdpb24pICoKLQkJCSAgbWVtYmxvY2sucmVzZXJ2ZWQubWF4KTsKKwlpZiAobWVtYmxvY2subWVtb3J5LnJlZ2lvbnMgIT0gbWVtYmxvY2tfbWVtb3J5X2luaXRfcmVnaW9ucykgeworCQlhZGRyID0gX19wYShtZW1ibG9jay5tZW1vcnkucmVnaW9ucyk7CisJCXNpemUgPSBQQUdFX0FMSUdOKHNpemVvZihzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uKSAqCisJCQkJICBtZW1ibG9jay5tZW1vcnkubWF4KTsKKwkJX19tZW1ibG9ja19mcmVlX2xhdGUoYWRkciwgc2l6ZSk7CisJfQogfQotCi1waHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgZ2V0X2FsbG9jYXRlZF9tZW1ibG9ja19tZW1vcnlfcmVnaW9uc19pbmZvKAotCQkJCQlwaHlzX2FkZHJfdCAqYWRkcikKLXsKLQlpZiAobWVtYmxvY2subWVtb3J5LnJlZ2lvbnMgPT0gbWVtYmxvY2tfbWVtb3J5X2luaXRfcmVnaW9ucykKLQkJcmV0dXJuIDA7Ci0KLQkqYWRkciA9IF9fcGEobWVtYmxvY2subWVtb3J5LnJlZ2lvbnMpOwotCi0JcmV0dXJuIFBBR0VfQUxJR04oc2l6ZW9mKHN0cnVjdCBtZW1ibG9ja19yZWdpb24pICoKLQkJCSAgbWVtYmxvY2subWVtb3J5Lm1heCk7Ci19Ci0KICNlbmRpZgogCiAvKioKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggNDlkOWI0Mi4uMzc4ZWJjMCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTExMjQsNiArMTEyNCw3IEBACiAJaW5pdF9yc3NfdmVjKHJzcyk7CiAJc3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCAmcHRsKTsKIAlwdGUgPSBzdGFydF9wdGU7CisJZmx1c2hfdGxiX2JhdGNoZWRfcGVuZGluZyhtbSk7CiAJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CiAJZG8gewogCQlwdGVfdCBwdGVudCA9ICpwdGU7CkBAIC0zNTk1LDYgKzM1OTYsMTEgQEAKIAkvKiBkbyBjb3VudGVyIHVwZGF0ZXMgYmVmb3JlIGVudGVyaW5nIHJlYWxseSBjcml0aWNhbCBzZWN0aW9uLiAqLwogCWNoZWNrX3N5bmNfcnNzX3N0YXQoY3VycmVudCk7CiAKKwlpZiAoIWFyY2hfdm1hX2FjY2Vzc19wZXJtaXR0ZWQodm1hLCBmbGFncyAmIEZBVUxUX0ZMQUdfV1JJVEUsCisJCQkJCSAgICBmbGFncyAmIEZBVUxUX0ZMQUdfSU5TVFJVQ1RJT04sCisJCQkJCSAgICBmbGFncyAmIEZBVUxUX0ZMQUdfUkVNT1RFKSkKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR1NFR1Y7CisKIAkvKgogCSAqIEVuYWJsZSB0aGUgbWVtY2cgT09NIGhhbmRsaW5nIGZvciBmYXVsdHMgdHJpZ2dlcmVkIGluIHVzZXIKIAkgKiBzcGFjZS4gIEtlcm5lbCBmYXVsdHMgYXJlIGhhbmRsZWQgbW9yZSBncmFjZWZ1bGx5LgpAQCAtMzYwMiwxMSArMzYwOCw2IEBACiAJaWYgKGZsYWdzICYgRkFVTFRfRkxBR19VU0VSKQogCQltZW1fY2dyb3VwX29vbV9lbmFibGUoKTsKIAotCWlmICghYXJjaF92bWFfYWNjZXNzX3Blcm1pdHRlZCh2bWEsIGZsYWdzICYgRkFVTFRfRkxBR19XUklURSwKLQkJCQkJICAgIGZsYWdzICYgRkFVTFRfRkxBR19JTlNUUlVDVElPTiwKLQkJCQkJICAgIGZsYWdzICYgRkFVTFRfRkxBR19SRU1PVEUpKQotCQlyZXR1cm4gVk1fRkFVTFRfU0lHU0VHVjsKLQogCWlmICh1bmxpa2VseShpc192bV9odWdldGxiX3BhZ2Uodm1hKSkpCiAJCXJldCA9IGh1Z2V0bGJfZmF1bHQodm1hLT52bV9tbSwgdm1hLCBhZGRyZXNzLCBmbGFncyk7CiAJZWxzZQpAQCAtMzYzNCw4ICszNjM1LDE4IEBACiAJICogZnVydGhlci4KIAkgKi8KIAlpZiAodW5saWtlbHkoKGN1cnJlbnQtPmZsYWdzICYgUEZfS1RIUkVBRCkgJiYgIShyZXQgJiBWTV9GQVVMVF9FUlJPUikKLQkJCQkmJiB0ZXN0X2JpdChNTUZfVU5TVEFCTEUsICZ2bWEtPnZtX21tLT5mbGFncykpKQorCQkJCSYmIHRlc3RfYml0KE1NRl9VTlNUQUJMRSwgJnZtYS0+dm1fbW0tPmZsYWdzKSkpIHsKKworCQkvKgorCQkgKiBXZSBhcmUgZ29pbmcgdG8gZW5mb3JjZSBTSUdCVVMgYnV0IHRoZSBQRiBwYXRoIG1pZ2h0IGhhdmUKKwkJICogZHJvcHBlZCB0aGUgbW1hcF9zZW0gYWxyZWFkeSBzbyB0YWtlIGl0IGFnYWluIHNvIHRoYXQKKwkJICogd2UgZG8gbm90IGJyZWFrIGV4cGVjdGF0aW9ucyBvZiBhbGwgYXJjaCBzcGVjaWZpYyBQRiBwYXRocworCQkgKiBhbmQgZy11LXAKKwkJICovCisJCWlmIChyZXQgJiBWTV9GQVVMVF9SRVRSWSkKKwkJCWRvd25fcmVhZCgmdm1hLT52bV9tbS0+bW1hcF9zZW0pOwogCQlyZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IGVkZTEzNzM0Li42ZWI2MWE0IDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTEyMDEsNyArMTIwMSwxMSBAQAogCiAJCWFyY2hfcmVmcmVzaF9ub2RlZGF0YShuaWQsIHBnZGF0KTsKIAl9IGVsc2UgewotCQkvKiBSZXNldCB0aGUgbnJfem9uZXMsIG9yZGVyIGFuZCBjbGFzc3pvbmVfaWR4IGJlZm9yZSByZXVzZSAqLworCQkvKgorCQkgKiBSZXNldCB0aGUgbnJfem9uZXMsIG9yZGVyIGFuZCBjbGFzc3pvbmVfaWR4IGJlZm9yZSByZXVzZS4KKwkJICogTm90ZSB0aGF0IGtzd2FwZCB3aWxsIGluaXQga3N3YXBkX2NsYXNzem9uZV9pZHggcHJvcGVybHkKKwkJICogd2hlbiBpdCBzdGFydHMgaW4gdGhlIG5lYXIgZnV0dXJlLgorCQkgKi8KIAkJcGdkYXQtPm5yX3pvbmVzID0gMDsKIAkJcGdkYXQtPmtzd2FwZF9vcmRlciA9IDA7CiAJCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IDA7CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDlmZjU2NTcuLjk1NDc1ODMgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC05MjcsMTEgKzkyNyw2IEBACiAJCSpwb2xpY3kgfD0gKHBvbC0+ZmxhZ3MgJiBNUE9MX01PREVfRkxBR1MpOwogCX0KIAotCWlmICh2bWEpIHsKLQkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJdm1hID0gTlVMTDsKLQl9Ci0KIAllcnIgPSAwOwogCWlmIChubWFzaykgewogCQlpZiAobXBvbF9zdG9yZV91c2VyX25vZGVtYXNrKHBvbCkpIHsKZGlmZiAtLWdpdCBhL21tL21pZ3JhdGUuYyBiL21tL21pZ3JhdGUuYwppbmRleCBmMGI3ODZkLi5lYjFmMDQzIDEwMDY0NAotLS0gYS9tbS9taWdyYXRlLmMKKysrIGIvbW0vbWlncmF0ZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9pZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9vd25lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKQEAgLTE2NjUsNyArMTY2Niw2IEBACiAJCWNvbnN0IGludCBfX3VzZXIgKiwgbm9kZXMsCiAJCWludCBfX3VzZXIgKiwgc3RhdHVzLCBpbnQsIGZsYWdzKQogewotCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCksICp0Y3JlZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJaW50IGVycjsKQEAgLTE2ODksMTQgKzE2ODksOSBAQAogCiAJLyoKIAkgKiBDaGVjayBpZiB0aGlzIHByb2Nlc3MgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhlIHNwZWNpZmllZAotCSAqIHByb2Nlc3MuIFRoZSByaWdodCBleGlzdHMgaWYgdGhlIHByb2Nlc3MgaGFzIGFkbWluaXN0cmF0aXZlCi0JICogY2FwYWJpbGl0aWVzLCBzdXBlcnVzZXIgcHJpdmlsZWdlcyBvciB0aGUgc2FtZQotCSAqIHVzZXJpZCBhcyB0aGUgdGFyZ2V0IHByb2Nlc3MuCisJICogcHJvY2Vzcy4gVXNlIHRoZSByZWd1bGFyICJwdHJhY2VfbWF5X2FjY2VzcygpIiBjaGVja3MuCiAJICovCi0JdGNyZWQgPSBfX3Rhc2tfY3JlZCh0YXNrKTsKLQlpZiAoIXVpZF9lcShjcmVkLT5ldWlkLCB0Y3JlZC0+c3VpZCkgJiYgIXVpZF9lcShjcmVkLT5ldWlkLCB0Y3JlZC0+dWlkKSAmJgotCSAgICAhdWlkX2VxKGNyZWQtPnVpZCwgIHRjcmVkLT5zdWlkKSAmJiAhdWlkX2VxKGNyZWQtPnVpZCwgIHRjcmVkLT51aWQpICYmCi0JICAgICFjYXBhYmxlKENBUF9TWVNfTklDRSkpIHsKKwlpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQURfUkVBTENSRURTKSkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJZXJyID0gLUVQRVJNOwogCQlnb3RvIG91dDsKQEAgLTE3MzgsOSArMTczMyw2IEBACiB7CiAJaW50IHo7CiAKLQlpZiAoIXBnZGF0X3JlY2xhaW1hYmxlKHBnZGF0KSkKLQkJcmV0dXJuIGZhbHNlOwotCiAJZm9yICh6ID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsgeiA+PSAwOyB6LS0pIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIHo7CiAKZGlmZiAtLWdpdCBhL21tL21wcm90ZWN0LmMgYi9tbS9tcHJvdGVjdC5jCmluZGV4IDJjNDA4MzYuLjFmMmM5NjkgMTAwNjQ0Ci0tLSBhL21tL21wcm90ZWN0LmMKKysrIGIvbW0vbXByb3RlY3QuYwpAQCAtNzQsNiArNzQsNyBAQAogCWlmICghcHRlKQogCQlyZXR1cm4gMDsKIAorCWZsdXNoX3RsYl9iYXRjaGVkX3BlbmRpbmcodm1hLT52bV9tbSk7CiAJYXJjaF9lbnRlcl9sYXp5X21tdV9tb2RlKCk7CiAJZG8gewogCQlvbGRwdGUgPSAqcHRlOwpkaWZmIC0tZ2l0IGEvbW0vbXJlbWFwLmMgYi9tbS9tcmVtYXAuYwppbmRleCAzMGQ3ZDI0Li4xNTk3NjcxIDEwMDY0NAotLS0gYS9tbS9tcmVtYXAuYworKysgYi9tbS9tcmVtYXAuYwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJbmV3X3B0bCA9IHB0ZV9sb2NrcHRyKG1tLCBuZXdfcG1kKTsKIAlpZiAobmV3X3B0bCAhPSBvbGRfcHRsKQogCQlzcGluX2xvY2tfbmVzdGVkKG5ld19wdGwsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwlmbHVzaF90bGJfYmF0Y2hlZF9wZW5kaW5nKHZtYS0+dm1fbW0pOwogCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogCiAJZm9yICg7IG9sZF9hZGRyIDwgb2xkX2VuZDsgb2xkX3B0ZSsrLCBvbGRfYWRkciArPSBQQUdFX1NJWkUsCmRpZmYgLS1naXQgYS9tbS9ub2Jvb3RtZW0uYyBiL21tL25vYm9vdG1lbS5jCmluZGV4IGUxZThjNjMuLmFhNTk1NzIgMTAwNjQ0Ci0tLSBhL21tL25vYm9vdG1lbS5jCisrKyBiL21tL25vYm9vdG1lbS5jCkBAIC0xNDYsMjIgKzE0Niw2IEBACiAJCQkJTlVMTCkKIAkJY291bnQgKz0gX19mcmVlX21lbW9yeV9jb3JlKHN0YXJ0LCBlbmQpOwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfRElTQ0FSRF9NRU1CTE9DSwotCXsKLQkJcGh5c19hZGRyX3Qgc2l6ZTsKLQotCQkvKiBGcmVlIG1lbWJsb2NrLnJlc2VydmVkIGFycmF5IGlmIGl0IHdhcyBhbGxvY2F0ZWQgKi8KLQkJc2l6ZSA9IGdldF9hbGxvY2F0ZWRfbWVtYmxvY2tfcmVzZXJ2ZWRfcmVnaW9uc19pbmZvKCZzdGFydCk7Ci0JCWlmIChzaXplKQotCQkJY291bnQgKz0gX19mcmVlX21lbW9yeV9jb3JlKHN0YXJ0LCBzdGFydCArIHNpemUpOwotCi0JCS8qIEZyZWUgbWVtYmxvY2subWVtb3J5IGFycmF5IGlmIGl0IHdhcyBhbGxvY2F0ZWQgKi8KLQkJc2l6ZSA9IGdldF9hbGxvY2F0ZWRfbWVtYmxvY2tfbWVtb3J5X3JlZ2lvbnNfaW5mbygmc3RhcnQpOwotCQlpZiAoc2l6ZSkKLQkJCWNvdW50ICs9IF9fZnJlZV9tZW1vcnlfY29yZShzdGFydCwgc3RhcnQgKyBzaXplKTsKLQl9Ci0jZW5kaWYKLQogCXJldHVybiBjb3VudDsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggM2EyMmIxNC4uYWY3ODNhNiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC02MDgsMTggKzYwOCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB3YWtlX29vbV9yZWFwZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit2b2lkIHdha2Vfb29tX3JlYXBlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlpZiAoIW9vbV9yZWFwZXJfdGgpCiAJCXJldHVybjsKIAorCS8qIG1vdmUgdGhlIGxvY2sgaGVyZSB0byBhdm9pZCBzY2VuYXJpbyBvZiBxdWV1aW5nCisJICogdGhlIHNhbWUgdGFzayBieSBib3RoIE9PTSBraWxsZXIgYW5kIExNSy4KKwkgKi8KKwlzcGluX2xvY2soJm9vbV9yZWFwZXJfbG9jayk7CiAJLyogdHNrIGlzIGFscmVhZHkgcXVldWVkPyAqLwotCWlmICh0c2sgPT0gb29tX3JlYXBlcl9saXN0IHx8IHRzay0+b29tX3JlYXBlcl9saXN0KQorCWlmICh0c2sgPT0gb29tX3JlYXBlcl9saXN0IHx8IHRzay0+b29tX3JlYXBlcl9saXN0KSB7CisJCXNwaW5fdW5sb2NrKCZvb21fcmVhcGVyX2xvY2spOwogCQlyZXR1cm47CisJfQogCiAJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CiAKLQlzcGluX2xvY2soJm9vbV9yZWFwZXJfbG9jayk7CiAJdHNrLT5vb21fcmVhcGVyX2xpc3QgPSBvb21fcmVhcGVyX2xpc3Q7CiAJb29tX3JlYXBlcl9saXN0ID0gdHNrOwogCXNwaW5fdW5sb2NrKCZvb21fcmVhcGVyX2xvY2spOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDQ0MDg1YjIuLmFjZjQxMWMgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTEwOTksMTQgKzEwOTksMTAgQEAKIHsKIAlpbnQgbWlncmF0ZXR5cGUgPSAwOwogCWludCBiYXRjaF9mcmVlID0gMDsKLQl1bnNpZ25lZCBsb25nIG5yX3NjYW5uZWQ7CiAJYm9vbCBpc29sYXRlZF9wYWdlYmxvY2tzOwogCiAJc3Bpbl9sb2NrKCZ6b25lLT5sb2NrKTsKIAlpc29sYXRlZF9wYWdlYmxvY2tzID0gaGFzX2lzb2xhdGVfcGFnZWJsb2NrKHpvbmUpOwotCW5yX3NjYW5uZWQgPSBub2RlX3BhZ2Vfc3RhdGUoem9uZS0+em9uZV9wZ2RhdCwgTlJfUEFHRVNfU0NBTk5FRCk7Ci0JaWYgKG5yX3NjYW5uZWQpCi0JCV9fbW9kX25vZGVfcGFnZV9zdGF0ZSh6b25lLT56b25lX3BnZGF0LCBOUl9QQUdFU19TQ0FOTkVELCAtbnJfc2Nhbm5lZCk7CiAKIAl3aGlsZSAoY291bnQpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMTU5LDEyICsxMTU1LDcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgb3JkZXIsCiAJCQkJaW50IG1pZ3JhdGV0eXBlKQogewotCXVuc2lnbmVkIGxvbmcgbnJfc2Nhbm5lZDsKIAlzcGluX2xvY2soJnpvbmUtPmxvY2spOwotCW5yX3NjYW5uZWQgPSBub2RlX3BhZ2Vfc3RhdGUoem9uZS0+em9uZV9wZ2RhdCwgTlJfUEFHRVNfU0NBTk5FRCk7Ci0JaWYgKG5yX3NjYW5uZWQpCi0JCV9fbW9kX25vZGVfcGFnZV9zdGF0ZSh6b25lLT56b25lX3BnZGF0LCBOUl9QQUdFU19TQ0FOTkVELCAtbnJfc2Nhbm5lZCk7Ci0KIAlpZiAodW5saWtlbHkoaGFzX2lzb2xhdGVfcGFnZWJsb2NrKHpvbmUpIHx8CiAJCWlzX21pZ3JhdGVfaXNvbGF0ZShtaWdyYXRldHlwZSkpKSB7CiAJCW1pZ3JhdGV0eXBlID0gZ2V0X3BmbmJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIHBmbik7CkBAIC0xNTg4LDYgKzE1NzksMTAgQEAKIAkvKiBSZWluaXQgbGltaXRzIHRoYXQgYXJlIGJhc2VkIG9uIGZyZWUgcGFnZXMgYWZ0ZXIgdGhlIGtlcm5lbCBpcyB1cCAqLwogCWZpbGVzX21heGZpbGVzX2luaXQoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX0RJU0NBUkRfTUVNQkxPQ0sKKwkvKiBEaXNjYXJkIG1lbWJsb2NrIHByaXZhdGUgbWVtb3J5ICovCisJbWVtYmxvY2tfZGlzY2FyZCgpOworI2VuZGlmCiAKIAlmb3JfZWFjaF9wb3B1bGF0ZWRfem9uZSh6b25lKQogCQlzZXRfem9uZV9jb250aWd1b3VzKHpvbmUpOwpAQCAtMTg3NCwxNCArMTg2OSwxNCBAQAogI2VuZGlmCiAKIAlmb3IgKHBhZ2UgPSBzdGFydF9wYWdlOyBwYWdlIDw9IGVuZF9wYWdlOykgewotCQkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBpbmFkdmVydGVudGx5IGNoYW5naW5nIG5vZGVzICovCi0JCVZNX0JVR19PTl9QQUdFKHBhZ2VfdG9fbmlkKHBhZ2UpICE9IHpvbmVfdG9fbmlkKHpvbmUpLCBwYWdlKTsKLQogCQlpZiAoIXBmbl92YWxpZF93aXRoaW4ocGFnZV90b19wZm4ocGFnZSkpKSB7CiAJCQlwYWdlKys7CiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGluYWR2ZXJ0ZW50bHkgY2hhbmdpbmcgbm9kZXMgKi8KKwkJVk1fQlVHX09OX1BBR0UocGFnZV90b19uaWQocGFnZSkgIT0gem9uZV90b19uaWQoem9uZSksIHBhZ2UpOworCiAJCWlmICghUGFnZUJ1ZGR5KHBhZ2UpKSB7CiAJCQlwYWdlKys7CiAJCQljb250aW51ZTsKQEAgLTM1MDEsMTkgKzM0OTYsMTIgQEAKIH0KIAogLyoKLSAqIE1heGltdW0gbnVtYmVyIG9mIHJlY2xhaW0gcmV0cmllcyB3aXRob3V0IGFueSBwcm9ncmVzcyBiZWZvcmUgT09NIGtpbGxlcgotICogaXMgY29uc2lkZXIgYXMgdGhlIG9ubHkgd2F5IHRvIG1vdmUgZm9yd2FyZC4KLSAqLwotI2RlZmluZSBNQVhfUkVDTEFJTV9SRVRSSUVTIDE2Ci0KLS8qCiAgKiBDaGVja3Mgd2hldGhlciBpdCBtYWtlcyBzZW5zZSB0byByZXRyeSB0aGUgcmVjbGFpbSB0byBtYWtlIGEgZm9yd2FyZCBwcm9ncmVzcwogICogZm9yIHRoZSBnaXZlbiBhbGxvY2F0aW9uIHJlcXVlc3QuCi0gKiBUaGUgcmVjbGFpbSBmZWVkYmFjayByZXByZXNlbnRlZCBieSBkaWRfc29tZV9wcm9ncmVzcyAoYW55IHByb2dyZXNzIGR1cmluZwotICogdGhlIGxhc3QgcmVjbGFpbSByb3VuZCkgYW5kIG5vX3Byb2dyZXNzX2xvb3BzIChudW1iZXIgb2YgcmVjbGFpbSByb3VuZHMgd2l0aG91dAotICogYW55IHByb2dyZXNzIGluIGEgcm93KSBpcyBjb25zaWRlcmVkIGFzIHdlbGwgYXMgdGhlIHJlY2xhaW1hYmxlIHBhZ2VzIG9uIHRoZQotICogYXBwbGljYWJsZSB6b25lIGxpc3QgKHdpdGggYSBiYWNrb2ZmIG1lY2hhbmlzbSB3aGljaCBpcyBhIGZ1bmN0aW9uIG9mCi0gKiBub19wcm9ncmVzc19sb29wcykuCisgKgorICogV2UgZ2l2ZSB1cCB3aGVuIHdlIGVpdGhlciBoYXZlIHRyaWVkIE1BWF9SRUNMQUlNX1JFVFJJRVMgaW4gYSByb3cKKyAqIHdpdGhvdXQgc3VjY2Vzcywgb3Igd2hlbiB3ZSBjb3VsZG4ndCBldmVuIG1lZXQgdGhlIHdhdGVybWFyayBpZiB3ZQorICogcmVjbGFpbWVkIGFsbCByZW1haW5pbmcgcGFnZXMgb24gdGhlIExSVSBsaXN0cy4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgYSByZXRyeSBpcyB2aWFibGUgb3IgZmFsc2UgdG8gZW50ZXIgdGhlIG9vbSBwYXRoLgogICovCkBAIC0zNTU2LDEzICszNTQ0LDExIEBACiAJCXVuc2lnbmVkIGxvbmcgcmVjbGFpbWFibGU7CiAKIAkJYXZhaWxhYmxlID0gcmVjbGFpbWFibGUgPSB6b25lX3JlY2xhaW1hYmxlX3BhZ2VzKHpvbmUpOwotCQlhdmFpbGFibGUgLT0gRElWX1JPVU5EX1VQKCgqbm9fcHJvZ3Jlc3NfbG9vcHMpICogYXZhaWxhYmxlLAotCQkJCQkgIE1BWF9SRUNMQUlNX1JFVFJJRVMpOwogCQlhdmFpbGFibGUgKz0gem9uZV9wYWdlX3N0YXRlX3NuYXBzaG90KHpvbmUsIE5SX0ZSRUVfUEFHRVMpOwogCiAJCS8qCi0JCSAqIFdvdWxkIHRoZSBhbGxvY2F0aW9uIHN1Y2NlZWQgaWYgd2UgcmVjbGFpbWVkIHRoZSB3aG9sZQotCQkgKiBhdmFpbGFibGU/CisJCSAqIFdvdWxkIHRoZSBhbGxvY2F0aW9uIHN1Y2NlZWQgaWYgd2UgcmVjbGFpbWVkIGFsbAorCQkgKiByZWNsYWltYWJsZSBwYWdlcz8KIAkJICovCiAJCWlmIChfX3pvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCBtaW5fd21hcmtfcGFnZXMoem9uZSksCiAJCQkJYWNfY2xhc3N6b25lX2lkeChhYyksIGFsbG9jX2ZsYWdzLCBhdmFpbGFibGUpKSB7CkBAIC00NDQyLDcgKzQ0MjgsNiBAQAogI2VuZGlmCiAJCQkiIHdyaXRlYmFja190bXA6JWx1a0IiCiAJCQkiIHVuc3RhYmxlOiVsdWtCIgotCQkJIiBwYWdlc19zY2FubmVkOiVsdSIKIAkJCSIgYWxsX3VucmVjbGFpbWFibGU/ICVzIgogCQkJIlxuIiwKIAkJCXBnZGF0LT5ub2RlX2lkLApAQCAtNDQ2NSw4ICs0NDUwLDggQEAKICNlbmRpZgogCQkJSyhub2RlX3BhZ2Vfc3RhdGUocGdkYXQsIE5SX1dSSVRFQkFDS19URU1QKSksCiAJCQlLKG5vZGVfcGFnZV9zdGF0ZShwZ2RhdCwgTlJfVU5TVEFCTEVfTkZTKSksCi0JCQlub2RlX3BhZ2Vfc3RhdGUocGdkYXQsIE5SX1BBR0VTX1NDQU5ORUQpLAotCQkJIXBnZGF0X3JlY2xhaW1hYmxlKHBnZGF0KSA/ICJ5ZXMiIDogIm5vIik7CisJCQlwZ2RhdC0+a3N3YXBkX2ZhaWx1cmVzID49IE1BWF9SRUNMQUlNX1JFVFJJRVMgPworCQkJCSJ5ZXMiIDogIm5vIik7CiAJfQogCiAJZm9yX2VhY2hfcG9wdWxhdGVkX3pvbmUoem9uZSkgewpAQCAtNjU0NCw4ICs2NTI5LDggQEAKIAl9CiAKIAlpZiAocGFnZXMgJiYgcykKLQkJcHJfaW5mbygiRnJlZWluZyAlcyBtZW1vcnk6ICVsZEsgKCVwIC0gJXApXG4iLAotCQkJcywgcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCksIHN0YXJ0LCBlbmQpOworCQlwcl9pbmZvKCJGcmVlaW5nICVzIG1lbW9yeTogJWxkS1xuIiwKKwkJCXMsIHBhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApKTsKIAogCXJldHVybiBwYWdlczsKIH0KQEAgLTc0MzUsNyArNzQyMCw3IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhlIHJhbmdlIGlzIHJlYWxseSBpc29sYXRlZC4gKi8KIAlpZiAodGVzdF9wYWdlc19pc29sYXRlZChvdXRlcl9zdGFydCwgZW5kLCBmYWxzZSkpIHsKLQkJcHJfaW5mbygiJXM6IFslbHgsICVseCkgUEZOcyBidXN5XG4iLAorCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCIlczogWyVseCwgJWx4KSBQRk5zIGJ1c3lcbiIsCiAJCQlfX2Z1bmNfXywgb3V0ZXJfc3RhcnQsIGVuZCk7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9vd25lci5jIGIvbW0vcGFnZV9vd25lci5jCmluZGV4IDY1ZTI0ZmIuLmZlODUwYjkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Vfb3duZXIuYworKysgYi9tbS9wYWdlX293bmVyLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQkubnJfZW50cmllcyA9IDAsCiAJCS5lbnRyaWVzID0gZW50cmllcywKIAkJLm1heF9lbnRyaWVzID0gUEFHRV9PV05FUl9TVEFDS19ERVBUSCwKLQkJLnNraXAgPSAwCisJCS5za2lwID0gMgogCX07CiAJZGVwb3Rfc3RhY2tfaGFuZGxlX3QgaGFuZGxlOwogCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggZGZiMTlmMC4uNGQxOWRkMSAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNjE3LDYgKzYxNywxMyBAQAogCXRsYl91YmMtPmZsdXNoX3JlcXVpcmVkID0gdHJ1ZTsKIAogCS8qCisJICogRW5zdXJlIGNvbXBpbGVyIGRvZXMgbm90IHJlLW9yZGVyIHRoZSBzZXR0aW5nIG9mIHRsYl9mbHVzaF9iYXRjaGVkCisJICogYmVmb3JlIHRoZSBQVEUgaXMgY2xlYXJlZC4KKwkgKi8KKwliYXJyaWVyKCk7CisJbW0tPnRsYl9mbHVzaF9iYXRjaGVkID0gdHJ1ZTsKKworCS8qCiAJICogSWYgdGhlIFBURSB3YXMgZGlydHkgdGhlbiBpdCdzIGJlc3QgdG8gYXNzdW1lIGl0J3Mgd3JpdGFibGUuIFRoZQogCSAqIGNhbGxlciBtdXN0IHVzZSB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkoKSBvciB0cnlfdG9fdW5tYXBfZmx1c2goKQogCSAqIGJlZm9yZSB0aGUgcGFnZSBpcyBxdWV1ZWQgZm9yIElPLgpAQCAtNjQzLDYgKzY1MCwzNSBAQAogCiAJcmV0dXJuIHNob3VsZF9kZWZlcjsKIH0KKworLyoKKyAqIFJlY2xhaW0gdW5tYXBzIHBhZ2VzIHVuZGVyIHRoZSBQVEwgYnV0IGRvIG5vdCBmbHVzaCB0aGUgVExCIHByaW9yIHRvCisgKiByZWxlYXNpbmcgdGhlIFBUTCBpZiBUTEIgZmx1c2hlcyBhcmUgYmF0Y2hlZC4gSXQncyBwb3NzaWJsZSBmb3IgYSBwYXJhbGxlbAorICogb3BlcmF0aW9uIHN1Y2ggYXMgbXByb3RlY3Qgb3IgbXVubWFwIHRvIHJhY2UgYmV0d2VlbiByZWNsYWltIHVubWFwcGluZworICogdGhlIHBhZ2UgYW5kIGZsdXNoaW5nIHRoZSBwYWdlLiBJZiB0aGlzIHJhY2Ugb2NjdXJzLCBpdCBwb3RlbnRpYWxseSBhbGxvd3MKKyAqIGFjY2VzcyB0byBkYXRhIHZpYSBhIHN0YWxlIFRMQiBlbnRyeS4gVHJhY2tpbmcgYWxsIG1tJ3MgdGhhdCBoYXZlIFRMQgorICogYmF0Y2hpbmcgaW4gZmxpZ2h0IHdvdWxkIGJlIGV4cGVuc2l2ZSBkdXJpbmcgcmVjbGFpbSBzbyBpbnN0ZWFkIHRyYWNrCisgKiB3aGV0aGVyIFRMQiBiYXRjaGluZyBvY2N1cnJlZCBpbiB0aGUgcGFzdCBhbmQgaWYgc28gdGhlbiBkbyBhIGZsdXNoIGhlcmUKKyAqIGlmIHJlcXVpcmVkLiBUaGlzIHdpbGwgY29zdCBvbmUgYWRkaXRpb25hbCBmbHVzaCBwZXIgcmVjbGFpbSBjeWNsZSBwYWlkCisgKiBieSB0aGUgZmlyc3Qgb3BlcmF0aW9uIGF0IHJpc2sgc3VjaCBhcyBtcHJvdGVjdCBhbmQgbXVtYXAuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciB0aGUgUFRMIHNvIHRoYXQgYW4gYWNjZXNzIHRvIHRsYl9mbHVzaF9iYXRjaGVkCisgKiB0aGF0IGlzIHBvdGVudGlhbGx5IGEgInJlY2xhaW0gdnMgbXByb3RlY3QvbXVubWFwL2V0YyIgcmFjZSB3aWxsIHN5bmNocm9uaXNlCisgKiB2aWEgdGhlIFBUTC4KKyAqLwordm9pZCBmbHVzaF90bGJfYmF0Y2hlZF9wZW5kaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmIChtbS0+dGxiX2ZsdXNoX2JhdGNoZWQpIHsKKwkJZmx1c2hfdGxiX21tKG1tKTsKKworCQkvKgorCQkgKiBEbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHJlLW9yZGVyIHRoZSBjbGVhcmluZyBvZgorCQkgKiB0bGJfZmx1c2hfYmF0Y2hlZCBiZWZvcmUgdGhlIHRsYiBpcyBmbHVzaGVkLgorCQkgKi8KKwkJYmFycmllcigpOworCQltbS0+dGxiX2ZsdXNoX2JhdGNoZWQgPSBmYWxzZTsKKwl9Cit9CiAjZWxzZQogc3RhdGljIHZvaWQgc2V0X3RsYl91YmNfZmx1c2hfcGVuZGluZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJc3RydWN0IHBhZ2UgKnBhZ2UsIGJvb2wgd3JpdGFibGUpCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCAxNDI4ODdmLi43YTc0YjZkIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTEwMDcsNyArMTAwNywxMSBAQAogCQkJICovCiAJCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRV9QQUdFQ0FDSEUpKSB7CiAJCQkJc3Bpbl9sb2NrKCZzYmluZm8tPnNocmlua2xpc3RfbG9jayk7Ci0JCQkJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnNocmlua2xpc3QpKSB7CisJCQkJLyoKKwkJCQkgKiBfY2FyZWZ1bCB0byBkZWZlbmQgYWdhaW5zdCB1bmxvY2tlZCBhY2Nlc3MgdG8KKwkJCQkgKiAtPnNocmlua19saXN0IGluIHNobWVtX3VudXNlZF9odWdlX3NocmluaygpCisJCQkJICovCisJCQkJaWYgKGxpc3RfZW1wdHlfY2FyZWZ1bCgmaW5mby0+c2hyaW5rbGlzdCkpIHsKIAkJCQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c2hyaW5rbGlzdCwKIAkJCQkJCQkmc2JpbmZvLT5zaHJpbmtsaXN0KTsKIAkJCQkJc2JpbmZvLT5zaHJpbmtsaXN0X2xlbisrOwpAQCAtMTc3NCw3ICsxNzc4LDExIEBACiAJCQkgKiB0byBzaHJpbmsgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgogCQkJICovCiAJCQlzcGluX2xvY2soJnNiaW5mby0+c2hyaW5rbGlzdF9sb2NrKTsKLQkJCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zaHJpbmtsaXN0KSkgeworCQkJLyoKKwkJCSAqIF9jYXJlZnVsIHRvIGRlZmVuZCBhZ2FpbnN0IHVubG9ja2VkIGFjY2VzcyB0bworCQkJICogLT5zaHJpbmtfbGlzdCBpbiBzaG1lbV91bnVzZWRfaHVnZV9zaHJpbmsoKQorCQkJICovCisJCQlpZiAobGlzdF9lbXB0eV9jYXJlZnVsKCZpbmZvLT5zaHJpbmtsaXN0KSkgewogCQkJCWxpc3RfYWRkX3RhaWwoJmluZm8tPnNocmlua2xpc3QsCiAJCQkJCQkmc2JpbmZvLT5zaHJpbmtsaXN0KTsKIAkJCQlzYmluZm8tPnNocmlua2xpc3RfbGVuKys7CkBAIC0zODAyLDcgKzM4MTAsNyBAQAogCX0KIAogI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFX1BBR0VDQUNIRQotCWlmIChoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSAmJiBzaG1lbV9odWdlIDwgU0hNRU1fSFVHRV9ERU5ZKQorCWlmIChoYXNfdHJhbnNwYXJlbnRfaHVnZXBhZ2UoKSAmJiBzaG1lbV9odWdlID4gU0hNRU1fSFVHRV9ERU5ZKQogCQlTSE1FTV9TQihzaG1fbW50LT5tbnRfc2IpLT5odWdlID0gc2htZW1faHVnZTsKIAllbHNlCiAJCXNobWVtX2h1Z2UgPSAwOyAvKiBqdXN0IGluIGNhc2UgaXQgd2FzIHBhdGNoZWQgKi8KQEAgLTM4NjMsNyArMzg3MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2htZW1faHVnZSA9IGh1Z2U7Ci0JaWYgKHNobWVtX2h1Z2UgPCBTSE1FTV9IVUdFX0RFTlkpCisJaWYgKHNobWVtX2h1Z2UgPiBTSE1FTV9IVUdFX0RFTlkpCiAJCVNITUVNX1NCKHNobV9tbnQtPm1udF9zYiktPmh1Z2UgPSBzaG1lbV9odWdlOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggN2I1ODQ4Y2YuLmJiMThiNDcgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC0yMzUsMTIgKzIzNSw2IEBACiAJcmV0dXJuIG5yOwogfQogCi1ib29sIHBnZGF0X3JlY2xhaW1hYmxlKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQpCi17Ci0JcmV0dXJuIG5vZGVfcGFnZV9zdGF0ZV9zbmFwc2hvdChwZ2RhdCwgTlJfUEFHRVNfU0NBTk5FRCkgPAotCQlwZ2RhdF9yZWNsYWltYWJsZV9wYWdlcyhwZ2RhdCkgKiA2OwotfQotCiAvKioKICAqIGxydXZlY19scnVfc2l6ZSAtICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFnZXMgb24gdGhlIGdpdmVuIExSVSBsaXN0LgogICogQGxydXZlYzogbHJ1IHZlY3RvcgpAQCAtMTQ5NSw3ICsxNDg5LDcgQEAKICAqCiAgKiBBcHByb3ByaWF0ZSBsb2NrcyBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICAqCi0gKiBAbnJfdG9fc2NhbjoJVGhlIG51bWJlciBvZiBwYWdlcyB0byBsb29rIHRocm91Z2ggb24gdGhlIGxpc3QuCisgKiBAbnJfdG9fc2NhbjoJVGhlIG51bWJlciBvZiBlbGlnaWJsZSBwYWdlcyB0byBsb29rIHRocm91Z2ggb24gdGhlIGxpc3QuCiAgKiBAbHJ1dmVjOglUaGUgTFJVIHZlY3RvciB0byBwdWxsIHBhZ2VzIGZyb20uCiAgKiBAZHN0OglUaGUgdGVtcCBsaXN0IHRvIHB1dCBwYWdlcyBvbiB0by4KICAqIEBucl9zY2FubmVkOglUaGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBzY2FubmVkLgpAQCAtMTUxNCwxMSArMTUwOCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgbnJfem9uZV90YWtlbltNQVhfTlJfWk9ORVNdID0geyAwIH07CiAJdW5zaWduZWQgbG9uZyBucl9za2lwcGVkW01BWF9OUl9aT05FU10gPSB7IDAsIH07Ci0JdW5zaWduZWQgbG9uZyBzY2FuLCBucl9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHNraXBwZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgc2NhbiwgdG90YWxfc2NhbiwgbnJfcGFnZXM7CiAJTElTVF9IRUFEKHBhZ2VzX3NraXBwZWQpOwogCi0JZm9yIChzY2FuID0gMDsgc2NhbiA8IG5yX3RvX3NjYW4gJiYgbnJfdGFrZW4gPCBucl90b19zY2FuICYmCi0JCQkJCSFsaXN0X2VtcHR5KHNyYyk7KSB7CisJc2NhbiA9IDA7CisJZm9yICh0b3RhbF9zY2FuID0gMDsKKwkgICAgIHNjYW4gPCBucl90b19zY2FuICYmIG5yX3Rha2VuIDwgbnJfdG9fc2NhbiAmJiAhbGlzdF9lbXB0eShzcmMpOworCSAgICAgdG90YWxfc2NhbisrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJCXBhZ2UgPSBscnVfdG9fcGFnZShzcmMpOwpAQCAtMTUzMywxMSArMTUzMCwxMiBAQAogCQl9CiAKIAkJLyoKLQkJICogQWNjb3VudCBmb3Igc2Nhbm5lZCBhbmQgc2tpcHBlZCBzZXBhcmV0bHkgdG8gYXZvaWQgdGhlIHBnZGF0Ci0JCSAqIGJlaW5nIHByZW1hdHVyZWx5IG1hcmtlZCB1bnJlY2xhaW1hYmxlIGJ5IHBnZGF0X3JlY2xhaW1hYmxlLgorCQkgKiBEbyBub3QgY291bnQgc2tpcHBlZCBwYWdlcyBiZWNhdXNlIHRoYXQgbWFrZXMgdGhlIGZ1bmN0aW9uCisJCSAqIHJldHVybiB3aXRoIG5vIGlzb2xhdGVkIHBhZ2VzIGlmIHRoZSBMUlUgbW9zdGx5IGNvbnRhaW5zCisJCSAqIGluZWxpZ2libGUgcGFnZXMuICBUaGlzIGNhdXNlcyB0aGUgVk0gdG8gbm90IHJlY2xhaW0gYW55CisJCSAqIHBhZ2VzLCB0cmlnZ2VyaW5nIGEgcHJlbWF0dXJlIE9PTS4KIAkJICovCiAJCXNjYW4rKzsKLQogCQlzd2l0Y2ggKF9faXNvbGF0ZV9scnVfcGFnZShwYWdlLCBtb2RlKSkgewogCQljYXNlIDA6CiAJCQlucl9wYWdlcyA9IGhwYWdlX25yX3BhZ2VzKHBhZ2UpOwpAQCAtMTU2NSwyOCArMTU2MywyMCBAQAogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmcGFnZXNfc2tpcHBlZCkpIHsKIAkJaW50IHppZDsKLQkJdW5zaWduZWQgbG9uZyB0b3RhbF9za2lwcGVkID0gMDsKIAorCQlsaXN0X3NwbGljZSgmcGFnZXNfc2tpcHBlZCwgc3JjKTsKIAkJZm9yICh6aWQgPSAwOyB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CiAJCQlpZiAoIW5yX3NraXBwZWRbemlkXSkKIAkJCQljb250aW51ZTsKIAogCQkJX19jb3VudF96aWRfdm1fZXZlbnRzKFBHU0NBTl9TS0lQLCB6aWQsIG5yX3NraXBwZWRbemlkXSk7Ci0JCQl0b3RhbF9za2lwcGVkICs9IG5yX3NraXBwZWRbemlkXTsKKwkJCXNraXBwZWQgKz0gbnJfc2tpcHBlZFt6aWRdOwogCQl9Ci0KLQkJLyoKLQkJICogQWNjb3VudCBza2lwcGVkIHBhZ2VzIGFzIGEgcGFydGlhbCBzY2FuIGFzIHRoZSBwZ2RhdCBtYXkgYmUKLQkJICogY2xvc2UgdG8gdW5yZWNsYWltYWJsZS4gSWYgdGhlIExSVSBsaXN0IGlzIGVtcHR5LCBhY2NvdW50Ci0JCSAqIHNraXBwZWQgcGFnZXMgYXMgYSBmdWxsIHNjYW4uCi0JCSAqLwotCQlzY2FuICs9IGxpc3RfZW1wdHkoc3JjKSA/IHRvdGFsX3NraXBwZWQgOiB0b3RhbF9za2lwcGVkID4+IDI7Ci0KLQkJbGlzdF9zcGxpY2UoJnBhZ2VzX3NraXBwZWQsIHNyYyk7CiAJfQotCSpucl9zY2FubmVkID0gc2NhbjsKLQl0cmFjZV9tbV92bXNjYW5fbHJ1X2lzb2xhdGUoc2MtPnJlY2xhaW1faWR4LCBzYy0+b3JkZXIsIG5yX3RvX3NjYW4sIHNjYW4sCi0JCQkJICAgIG5yX3Rha2VuLCBtb2RlLCBpc19maWxlX2xydShscnUpKTsKKwkqbnJfc2Nhbm5lZCA9IHRvdGFsX3NjYW47CisJdHJhY2VfbW1fdm1zY2FuX2xydV9pc29sYXRlKHNjLT5yZWNsYWltX2lkeCwgc2MtPm9yZGVyLCBucl90b19zY2FuLAorCQkJCQl0b3RhbF9zY2FuLCBza2lwcGVkLCBucl90YWtlbiwgbW9kZSwKKwkJCQkJaXNfZmlsZV9scnUobHJ1KSk7CiAJdXBkYXRlX2xydV9zaXplcyhscnV2ZWMsIGxydSwgbnJfem9uZV90YWtlbik7CiAJcmV0dXJuIG5yX3Rha2VuOwogfQpAQCAtMTg0OSw3ICsxODM5LDYgQEAKIAlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkW2ZpbGVdICs9IG5yX3Rha2VuOwogCiAJaWYgKGdsb2JhbF9yZWNsYWltKHNjKSkgewotCQlfX21vZF9ub2RlX3BhZ2Vfc3RhdGUocGdkYXQsIE5SX1BBR0VTX1NDQU5ORUQsIG5yX3NjYW5uZWQpOwogCQlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKIAkJCV9fY291bnRfdm1fZXZlbnRzKFBHU0NBTl9LU1dBUEQsIG5yX3NjYW5uZWQpOwogCQllbHNlCkBAIC0yMDM4LDggKzIwMjcsNiBAQAogCV9fbW9kX25vZGVfcGFnZV9zdGF0ZShwZ2RhdCwgTlJfSVNPTEFURURfQU5PTiArIGZpbGUsIG5yX3Rha2VuKTsKIAlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkW2ZpbGVdICs9IG5yX3Rha2VuOwogCi0JaWYgKGdsb2JhbF9yZWNsYWltKHNjKSkKLQkJX19tb2Rfbm9kZV9wYWdlX3N0YXRlKHBnZGF0LCBOUl9QQUdFU19TQ0FOTkVELCBucl9zY2FubmVkKTsKIAlfX2NvdW50X3ZtX2V2ZW50cyhQR1JFRklMTCwgbnJfc2Nhbm5lZCk7CiAKIAlzcGluX3VubG9ja19pcnEoJnBnZGF0LT5scnVfbG9jayk7CkBAIC0yMTk5LDMwICsyMTg2LDggQEAKIAl1bnNpZ25lZCBsb25nIGFub25fcHJpbywgZmlsZV9wcmlvOwogCWVudW0gc2Nhbl9iYWxhbmNlIHNjYW5fYmFsYW5jZTsKIAl1bnNpZ25lZCBsb25nIGFub24sIGZpbGU7Ci0JYm9vbCBmb3JjZV9zY2FuID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyBhcCwgZnA7CiAJZW51bSBscnVfbGlzdCBscnU7Ci0JYm9vbCBzb21lX3NjYW5uZWQ7Ci0JaW50IHBhc3M7Ci0KLQkvKgotCSAqIElmIHRoZSB6b25lIG9yIG1lbWNnIGlzIHNtYWxsLCBucltsXSBjYW4gYmUgMC4gIFRoaXMKLQkgKiByZXN1bHRzIGluIG5vIHNjYW5uaW5nIG9uIHRoaXMgcHJpb3JpdHkgYW5kIGEgcG90ZW50aWFsCi0JICogcHJpb3JpdHkgZHJvcC4gIEdsb2JhbCBkaXJlY3QgcmVjbGFpbSBjYW4gZ28gdG8gdGhlIG5leHQKLQkgKiB6b25lIGFuZCB0ZW5kcyB0byBoYXZlIG5vIHByb2JsZW1zLiBHbG9iYWwga3N3YXBkIGlzIGZvcgotCSAqIHpvbmUgYmFsYW5jaW5nIGFuZCBpdCBuZWVkcyB0byBzY2FuIGEgbWluaW11bSBhbW91bnQuIFdoZW4KLQkgKiByZWNsYWltaW5nIGZvciBhIG1lbWNnLCBhIHByaW9yaXR5IGRyb3AgY2FuIGNhdXNlIGhpZ2gKLQkgKiBsYXRlbmNpZXMsIHNvIGl0J3MgYmV0dGVyIHRvIHNjYW4gYSBtaW5pbXVtIGFtb3VudCB0aGVyZSBhcwotCSAqIHdlbGwuCi0JICovCi0JaWYgKGN1cnJlbnRfaXNfa3N3YXBkKCkpIHsKLQkJaWYgKCFwZ2RhdF9yZWNsYWltYWJsZShwZ2RhdCkpCi0JCQlmb3JjZV9zY2FuID0gdHJ1ZTsKLQkJaWYgKCFtZW1fY2dyb3VwX29ubGluZShtZW1jZykpCi0JCQlmb3JjZV9zY2FuID0gdHJ1ZTsKLQl9Ci0JaWYgKCFnbG9iYWxfcmVjbGFpbShzYykpCi0JCWZvcmNlX3NjYW4gPSB0cnVlOwogCiAJLyogSWYgd2UgaGF2ZSBubyBzd2FwIHNwYWNlLCBkbyBub3QgYm90aGVyIHNjYW5uaW5nIGFub24gcGFnZXMuICovCiAJaWYgKCFzYy0+bWF5X3N3YXAgfHwgbWVtX2Nncm91cF9nZXRfbnJfc3dhcF9wYWdlcyhtZW1jZykgPD0gMCkgewpAQCAtMjM1NCw1NSArMjMxOSw0OCBAQAogCWZyYWN0aW9uWzFdID0gZnA7CiAJZGVub21pbmF0b3IgPSBhcCArIGZwICsgMTsKIG91dDoKLQlzb21lX3NjYW5uZWQgPSBmYWxzZTsKLQkvKiBPbmx5IHVzZSBmb3JjZV9zY2FuIG9uIHNlY29uZCBwYXNzLiAqLwotCWZvciAocGFzcyA9IDA7ICFzb21lX3NjYW5uZWQgJiYgcGFzcyA8IDI7IHBhc3MrKykgewotCQkqbHJ1X3BhZ2VzID0gMDsKLQkJZm9yX2VhY2hfZXZpY3RhYmxlX2xydShscnUpIHsKLQkJCWludCBmaWxlID0gaXNfZmlsZV9scnUobHJ1KTsKLQkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQkJCXVuc2lnbmVkIGxvbmcgc2NhbjsKKwkqbHJ1X3BhZ2VzID0gMDsKKwlmb3JfZWFjaF9ldmljdGFibGVfbHJ1KGxydSkgeworCQlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGxydSk7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBzY2FuOwogCi0JCQlzaXplID0gbHJ1dmVjX2xydV9zaXplKGxydXZlYywgbHJ1LCBzYy0+cmVjbGFpbV9pZHgpOwotCQkJc2NhbiA9IHNpemUgPj4gc2MtPnByaW9yaXR5OworCQlzaXplID0gbHJ1dmVjX2xydV9zaXplKGxydXZlYywgbHJ1LCBzYy0+cmVjbGFpbV9pZHgpOworCQlzY2FuID0gc2l6ZSA+PiBzYy0+cHJpb3JpdHk7CisJCS8qCisJCSAqIElmIHRoZSBjZ3JvdXAncyBhbHJlYWR5IGJlZW4gZGVsZXRlZCwgbWFrZSBzdXJlIHRvCisJCSAqIHNjcmFwZSBvdXQgdGhlIHJlbWFpbmluZyBjYWNoZS4KKwkJICovCisJCWlmICghc2NhbiAmJiAhbWVtX2Nncm91cF9vbmxpbmUobWVtY2cpKQorCQkJc2NhbiA9IG1pbihzaXplLCBTV0FQX0NMVVNURVJfTUFYKTsKIAotCQkJaWYgKCFzY2FuICYmIHBhc3MgJiYgZm9yY2Vfc2NhbikKLQkJCQlzY2FuID0gbWluKHNpemUsIFNXQVBfQ0xVU1RFUl9NQVgpOwotCi0JCQlzd2l0Y2ggKHNjYW5fYmFsYW5jZSkgewotCQkJY2FzZSBTQ0FOX0VRVUFMOgotCQkJCS8qIFNjYW4gbGlzdHMgcmVsYXRpdmUgdG8gc2l6ZSAqLwotCQkJCWJyZWFrOwotCQkJY2FzZSBTQ0FOX0ZSQUNUOgotCQkJCS8qCi0JCQkJICogU2NhbiB0eXBlcyBwcm9wb3J0aW9uYWwgdG8gc3dhcHBpbmVzcyBhbmQKLQkJCQkgKiB0aGVpciByZWxhdGl2ZSByZWNlbnQgcmVjbGFpbSBlZmZpY2llbmN5LgotCQkJCSAqLwotCQkJCXNjYW4gPSBkaXY2NF91NjQoc2NhbiAqIGZyYWN0aW9uW2ZpbGVdLAotCQkJCQkJCWRlbm9taW5hdG9yKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU0NBTl9GSUxFOgotCQkJY2FzZSBTQ0FOX0FOT046Ci0JCQkJLyogU2NhbiBvbmUgdHlwZSBleGNsdXNpdmVseSAqLwotCQkJCWlmICgoc2Nhbl9iYWxhbmNlID09IFNDQU5fRklMRSkgIT0gZmlsZSkgewotCQkJCQlzaXplID0gMDsKLQkJCQkJc2NhbiA9IDA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvKiBMb29rIG1hLCBubyBicmFpbiAqLwotCQkJCUJVRygpOwotCQkJfQotCi0JCQkqbHJ1X3BhZ2VzICs9IHNpemU7Ci0JCQlucltscnVdID0gc2NhbjsKLQorCQlzd2l0Y2ggKHNjYW5fYmFsYW5jZSkgeworCQljYXNlIFNDQU5fRVFVQUw6CisJCQkvKiBTY2FuIGxpc3RzIHJlbGF0aXZlIHRvIHNpemUgKi8KKwkJCWJyZWFrOworCQljYXNlIFNDQU5fRlJBQ1Q6CiAJCQkvKgotCQkJICogU2tpcCB0aGUgc2Vjb25kIHBhc3MgYW5kIGRvbid0IGZvcmNlX3NjYW4sCi0JCQkgKiBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgdG8gc2Nhbi4KKwkJCSAqIFNjYW4gdHlwZXMgcHJvcG9ydGlvbmFsIHRvIHN3YXBwaW5lc3MgYW5kCisJCQkgKiB0aGVpciByZWxhdGl2ZSByZWNlbnQgcmVjbGFpbSBlZmZpY2llbmN5LgogCQkJICovCi0JCQlzb21lX3NjYW5uZWQgfD0gISFzY2FuOworCQkJc2NhbiA9IGRpdjY0X3U2NChzY2FuICogZnJhY3Rpb25bZmlsZV0sCisJCQkJCSBkZW5vbWluYXRvcik7CisJCQlicmVhazsKKwkJY2FzZSBTQ0FOX0ZJTEU6CisJCWNhc2UgU0NBTl9BTk9OOgorCQkJLyogU2NhbiBvbmUgdHlwZSBleGNsdXNpdmVseSAqLworCQkJaWYgKChzY2FuX2JhbGFuY2UgPT0gU0NBTl9GSUxFKSAhPSBmaWxlKSB7CisJCQkJc2l6ZSA9IDA7CisJCQkJc2NhbiA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIExvb2sgbWEsIG5vIGJyYWluICovCisJCQlCVUcoKTsKIAkJfQorCisJCSpscnVfcGFnZXMgKz0gc2l6ZTsKKwkJbnJbbHJ1XSA9IHNjYW47CiAJfQogfQogCkBAIC0yNzA0LDYgKzI2NjIsMTUgQEAKIAl9IHdoaWxlIChzaG91bGRfY29udGludWVfcmVjbGFpbShwZ2RhdCwgc2MtPm5yX3JlY2xhaW1lZCAtIG5yX3JlY2xhaW1lZCwKIAkJCQkJIHNjLT5ucl9zY2FubmVkIC0gbnJfc2Nhbm5lZCwgc2MpKTsKIAorCS8qCisJICogS3N3YXBkIGdpdmVzIHVwIG9uIGJhbGFuY2luZyBwYXJ0aWN1bGFyIG5vZGVzIGFmdGVyIHRvbworCSAqIG1hbnkgZmFpbHVyZXMgdG8gcmVjbGFpbSBhbnl0aGluZyBmcm9tIHRoZW0gYW5kIGdvZXMgdG8KKwkgKiBzbGVlcC4gT24gcmVjbGFpbSBwcm9ncmVzcywgcmVzZXQgdGhlIGZhaWx1cmUgY291bnRlci4gQQorCSAqIHN1Y2Nlc3NmdWwgZGlyZWN0IHJlY2xhaW0gcnVuIHdpbGwgcmV2aXZlIGEgZG9ybWFudCBrc3dhcGQuCisJICovCisJaWYgKHJlY2xhaW1hYmxlKQorCQlwZ2RhdC0+a3N3YXBkX2ZhaWx1cmVzID0gMDsKKwogCXJldHVybiByZWNsYWltYWJsZTsKIH0KIApAQCAtMjc3OCwxMCArMjc0NSw2IEBACiAJCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hBUkRXQUxMKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKHNjLT5wcmlvcml0eSAhPSBERUZfUFJJT1JJVFkgJiYKLQkJCSAgICAhcGdkYXRfcmVjbGFpbWFibGUoem9uZS0+em9uZV9wZ2RhdCkpCi0JCQkJY29udGludWU7CS8qIExldCBrc3dhcGQgcG9sbCBpdCAqLwotCiAJCQkvKgogCQkJICogSWYgd2UgYWxyZWFkeSBoYXZlIHBsZW50eSBvZiBtZW1vcnkgZnJlZSBmb3IKIAkJCSAqIGNvbXBhY3Rpb24gaW4gdGhpcyB6b25lLCBkb24ndCBmcmVlIGFueSBtb3JlLgpAQCAtMjkxOCw3ICsyODgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgcGZtZW1hbGxvY193YXRlcm1hcmtfb2socGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyBib29sIGFsbG93X2RpcmVjdF9yZWNsYWltKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJdW5zaWduZWQgbG9uZyBwZm1lbWFsbG9jX3Jlc2VydmUgPSAwOwpAQCAtMjkyNiwxMCArMjg4OSwxNSBAQAogCWludCBpOwogCWJvb2wgd21hcmtfb2s7CiAKKwlpZiAocGdkYXQtPmtzd2FwZF9mYWlsdXJlcyA+PSBNQVhfUkVDTEFJTV9SRVRSSUVTKQorCQlyZXR1cm4gdHJ1ZTsKKwogCWZvciAoaSA9IDA7IGkgPD0gWk9ORV9OT1JNQUw7IGkrKykgewogCQl6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW2ldOwotCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSB8fAotCQkgICAgcGdkYXRfcmVjbGFpbWFibGVfcGFnZXMocGdkYXQpID09IDApCisJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQorCQkJY29udGludWU7CisKKwkJaWYgKCF6b25lX3JlY2xhaW1hYmxlX3BhZ2VzKHpvbmUpKQogCQkJY29udGludWU7CiAKIAkJcGZtZW1hbGxvY19yZXNlcnZlICs9IG1pbl93bWFya19wYWdlcyh6b25lKTsKQEAgLTMwMDYsNyArMjk3NCw3IEBACiAKIAkJLyogVGhyb3R0bGUgYmFzZWQgb24gdGhlIGZpcnN0IHVzYWJsZSBub2RlICovCiAJCXBnZGF0ID0gem9uZS0+em9uZV9wZ2RhdDsKLQkJaWYgKHBmbWVtYWxsb2Nfd2F0ZXJtYXJrX29rKHBnZGF0KSkKKwkJaWYgKGFsbG93X2RpcmVjdF9yZWNsYWltKHBnZGF0KSkKIAkJCWdvdG8gb3V0OwogCQlicmVhazsKIAl9CkBAIC0zMDI4LDE0ICsyOTk2LDE0IEBACiAJICovCiAJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpIHsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocGdkYXQtPnBmbWVtYWxsb2Nfd2FpdCwKLQkJCXBmbWVtYWxsb2Nfd2F0ZXJtYXJrX29rKHBnZGF0KSwgSFopOworCQkJYWxsb3dfZGlyZWN0X3JlY2xhaW0ocGdkYXQpLCBIWik7CiAKIAkJZ290byBjaGVja19wZW5kaW5nOwogCX0KIAogCS8qIFRocm90dGxlIHVudGlsIGtzd2FwZCB3YWtlcyB0aGUgcHJvY2VzcyAqLwogCXdhaXRfZXZlbnRfa2lsbGFibGUoem9uZS0+em9uZV9wZ2RhdC0+cGZtZW1hbGxvY193YWl0LAotCQlwZm1lbWFsbG9jX3dhdGVybWFya19vayhwZ2RhdCkpOworCQlhbGxvd19kaXJlY3RfcmVjbGFpbShwZ2RhdCkpOwogCiBjaGVja19wZW5kaW5nOgogCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkKQEAgLTMxODUsMjEgKzMxNTMsNDQgQEAKIAl9IHdoaWxlIChtZW1jZyk7CiB9CiAKLXN0YXRpYyBib29sIHpvbmVfYmFsYW5jZWQoc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwgaW50IGNsYXNzem9uZV9pZHgpCisvKgorICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGVsaWdpYmxlIHpvbmUgYmFsYW5jZWQgZm9yIHRoZSByZXF1ZXN0IG9yZGVyCisgKiBhbmQgY2xhc3N6b25lX2lkeAorICovCitzdGF0aWMgYm9vbCBwZ2RhdF9iYWxhbmNlZChwZ19kYXRhX3QgKnBnZGF0LCBpbnQgb3JkZXIsIGludCBjbGFzc3pvbmVfaWR4KQogewotCXVuc2lnbmVkIGxvbmcgbWFyayA9IGhpZ2hfd21hcmtfcGFnZXMoem9uZSk7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gLTE7CisJc3RydWN0IHpvbmUgKnpvbmU7CiAKLQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rX3NhZmUoem9uZSwgb3JkZXIsIG1hcmssIGNsYXNzem9uZV9pZHgpKQotCQlyZXR1cm4gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspIHsKKwkJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKKworCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKKwkJCWNvbnRpbnVlOworCisJCW1hcmsgPSBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpOworCQlpZiAoem9uZV93YXRlcm1hcmtfb2tfc2FmZSh6b25lLCBvcmRlciwgbWFyaywgY2xhc3N6b25lX2lkeCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CiAKIAkvKgotCSAqIElmIGFueSBlbGlnaWJsZSB6b25lIGlzIGJhbGFuY2VkIHRoZW4gdGhlIG5vZGUgaXMgbm90IGNvbnNpZGVyZWQKLQkgKiB0byBiZSBjb25nZXN0ZWQgb3IgZGlydHkKKwkgKiBJZiBhIG5vZGUgaGFzIG5vIHBvcHVsYXRlZCB6b25lIHdpdGhpbiBjbGFzc3pvbmVfaWR4LCBpdCBkb2VzIG5vdAorCSAqIG5lZWQgYmFsYW5jaW5nIGJ5IGRlZmluaXRpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHpvbmUtcmVzdHJpY3RlZAorCSAqIGFsbG9jYXRpb24gdHJpZXMgdG8gd2FrZSBhIHJlbW90ZSBrc3dhcGQuCiAJICovCi0JY2xlYXJfYml0KFBHREFUX0NPTkdFU1RFRCwgJnpvbmUtPnpvbmVfcGdkYXQtPmZsYWdzKTsKLQljbGVhcl9iaXQoUEdEQVRfRElSVFksICZ6b25lLT56b25lX3BnZGF0LT5mbGFncyk7CisJaWYgKG1hcmsgPT0gLTEpCisJCXJldHVybiB0cnVlOwogCi0JcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisvKiBDbGVhciBwZ2RhdCBzdGF0ZSBmb3IgY29uZ2VzdGVkLCBkaXJ0eSBvciB1bmRlciB3cml0ZWJhY2suICovCitzdGF0aWMgdm9pZCBjbGVhcl9wZ2RhdF9jb25nZXN0ZWQocGdfZGF0YV90ICpwZ2RhdCkKK3sKKwljbGVhcl9iaXQoUEdEQVRfQ09OR0VTVEVELCAmcGdkYXQtPmZsYWdzKTsKKwljbGVhcl9iaXQoUEdEQVRfRElSVFksICZwZ2RhdC0+ZmxhZ3MpOworCWNsZWFyX2JpdChQR0RBVF9XUklURUJBQ0ssICZwZ2RhdC0+ZmxhZ3MpOwogfQogCiAvKgpAQCAtMzIxMCwxMSArMzIwMSw5IEBACiAgKi8KIHN0YXRpYyBib29sIHByZXBhcmVfa3N3YXBkX3NsZWVwKHBnX2RhdGFfdCAqcGdkYXQsIGludCBvcmRlciwgaW50IGNsYXNzem9uZV9pZHgpCiB7Ci0JaW50IGk7Ci0KIAkvKgogCSAqIFRoZSB0aHJvdHRsZWQgcHJvY2Vzc2VzIGFyZSBub3JtYWxseSB3b2tlbiB1cCBpbiBiYWxhbmNlX3BnZGF0KCkgYXMKLQkgKiBzb29uIGFzIHBmbWVtYWxsb2Nfd2F0ZXJtYXJrX29rKCkgaXMgdHJ1ZS4gQnV0IHRoZXJlIGlzIGEgcG90ZW50aWFsCisJICogc29vbiBhcyBhbGxvd19kaXJlY3RfcmVjbGFpbSgpIGlzIHRydWUuIEJ1dCB0aGVyZSBpcyBhIHBvdGVudGlhbAogCSAqIHJhY2UgYmV0d2VlbiB3aGVuIGtzd2FwZCBjaGVja3MgdGhlIHdhdGVybWFya3MgYW5kIGEgcHJvY2VzcyBnZXRzCiAJICogdGhyb3R0bGVkLiBUaGVyZSBpcyBhbHNvIGEgcG90ZW50aWFsIHJhY2UgaWYgcHJvY2Vzc2VzIGdldAogCSAqIHRocm90dGxlZCwga3N3YXBkIHdha2VzLCBhIGxhcmdlIHByb2Nlc3MgZXhpdHMgdGhlcmVieSBiYWxhbmNpbmcgdGhlCkBAIC0zMjI4LDE3ICszMjE3LDE2IEBACiAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnBnZGF0LT5wZm1lbWFsbG9jX3dhaXQpKQogCQl3YWtlX3VwX2FsbCgmcGdkYXQtPnBmbWVtYWxsb2Nfd2FpdCk7CiAKLQlmb3IgKGkgPSAwOyBpIDw9IGNsYXNzem9uZV9pZHg7IGkrKykgewotCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKKwkvKiBIb3BlbGVzcyBub2RlLCBsZWF2ZSBpdCB0byBkaXJlY3QgcmVjbGFpbSAqLworCWlmIChwZ2RhdC0+a3N3YXBkX2ZhaWx1cmVzID49IE1BWF9SRUNMQUlNX1JFVFJJRVMpCisJCXJldHVybiB0cnVlOwogCi0JCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCF6b25lX2JhbGFuY2VkKHpvbmUsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KSkKLQkJCXJldHVybiBmYWxzZTsKKwlpZiAocGdkYXRfYmFsYW5jZWQocGdkYXQsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KSkgeworCQljbGVhcl9wZ2RhdF9jb25nZXN0ZWQocGdkYXQpOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC0zMzE0LDkgKzMzMDIsOSBAQAogCWNvdW50X3ZtX2V2ZW50KFBBR0VPVVRSVU4pOwogCiAJZG8geworCQl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IHNjLm5yX3JlY2xhaW1lZDsKIAkJYm9vbCByYWlzZV9wcmlvcml0eSA9IHRydWU7CiAKLQkJc2MubnJfcmVjbGFpbWVkID0gMDsKIAkJc2MucmVjbGFpbV9pZHggPSBjbGFzc3pvbmVfaWR4OwogCiAJCS8qCkBAIC0zMzQxLDIzICszMzI5LDEyIEBACiAJCX0KIAogCQkvKgotCQkgKiBPbmx5IHJlY2xhaW0gaWYgdGhlcmUgYXJlIG5vIGVsaWdpYmxlIHpvbmVzLiBDaGVjayBmcm9tCi0JCSAqIGhpZ2ggdG8gbG93IHpvbmUgYXMgYWxsb2NhdGlvbnMgcHJlZmVyIGhpZ2hlciB6b25lcy4KLQkJICogU2Nhbm5pbmcgZnJvbSBsb3cgdG8gaGlnaCB6b25lIHdvdWxkIGFsbG93IGNvbmdlc3Rpb24gdG8gYmUKLQkJICogY2xlYXJlZCBkdXJpbmcgYSB2ZXJ5IHNtYWxsIHdpbmRvdyB3aGVuIGEgc21hbGwgbG93Ci0JCSAqIHpvbmUgd2FzIGJhbGFuY2VkIGV2ZW4gdW5kZXIgZXh0cmVtZSBwcmVzc3VyZSB3aGVuIHRoZQotCQkgKiBvdmVyYWxsIG5vZGUgbWF5IGJlIGNvbmdlc3RlZC4gTm90ZSB0aGF0IHNjLnJlY2xhaW1faWR4Ci0JCSAqIGlzIG5vdCB1c2VkIGFzIGJ1ZmZlcl9oZWFkc19vdmVyX2xpbWl0IG1heSBoYXZlIGFkanVzdGVkCi0JCSAqIGl0LgorCQkgKiBPbmx5IHJlY2xhaW0gaWYgdGhlcmUgYXJlIG5vIGVsaWdpYmxlIHpvbmVzLiBOb3RlIHRoYXQKKwkJICogc2MucmVjbGFpbV9pZHggaXMgbm90IHVzZWQgYXMgYnVmZmVyX2hlYWRzX292ZXJfbGltaXQgbWF5CisJCSAqIGhhdmUgYWRqdXN0ZWQgaXQuCiAJCSAqLwotCQlmb3IgKGkgPSBjbGFzc3pvbmVfaWR4OyBpID49IDA7IGktLSkgewotCQkJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKLQkJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoem9uZV9iYWxhbmNlZCh6b25lLCBzYy5vcmRlciwgY2xhc3N6b25lX2lkeCkpCi0JCQkJZ290byBvdXQ7Ci0JCX0KKwkJaWYgKHBnZGF0X2JhbGFuY2VkKHBnZGF0LCBzYy5vcmRlciwgY2xhc3N6b25lX2lkeCkpCisJCQlnb3RvIG91dDsKIAogCQkvKgogCQkgKiBEbyBzb21lIGJhY2tncm91bmQgYWdpbmcgb2YgdGhlIGFub24gbGlzdCwgdG8gZ2l2ZQpAQCAtMzM3MSw3ICszMzQ4LDcgQEAKIAkJICogSWYgd2UncmUgZ2V0dGluZyB0cm91YmxlIHJlY2xhaW1pbmcsIHN0YXJ0IGRvaW5nIHdyaXRlcGFnZQogCQkgKiBldmVuIGluIGxhcHRvcCBtb2RlLgogCQkgKi8KLQkJaWYgKHNjLnByaW9yaXR5IDwgREVGX1BSSU9SSVRZIC0gMiB8fCAhcGdkYXRfcmVjbGFpbWFibGUocGdkYXQpKQorCQlpZiAoc2MucHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyKQogCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAKIAkJLyogQ2FsbCBzb2Z0IGxpbWl0IHJlY2xhaW0gYmVmb3JlIGNhbGxpbmcgc2hyaW5rX25vZGUuICovCkBAIC0zMzk1LDcgKzMzNzIsNyBAQAogCQkgKiBhYmxlIHRvIHNhZmVseSBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MuIFdha2UgdGhlbQogCQkgKi8KIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnBnZGF0LT5wZm1lbWFsbG9jX3dhaXQpICYmCi0JCQkJcGZtZW1hbGxvY193YXRlcm1hcmtfb2socGdkYXQpKQorCQkJCWFsbG93X2RpcmVjdF9yZWNsYWltKHBnZGF0KSkKIAkJCXdha2VfdXBfYWxsKCZwZ2RhdC0+cGZtZW1hbGxvY193YWl0KTsKIAogCQkvKiBDaGVjayBpZiBrc3dhcGQgc2hvdWxkIGJlIHN1c3BlbmRpbmcgKi8KQEAgLTM0MDYsMTAgKzMzODMsMTQgQEAKIAkJICogUmFpc2UgcHJpb3JpdHkgaWYgc2Nhbm5pbmcgcmF0ZSBpcyB0b28gbG93IG9yIHRoZXJlIHdhcyBubwogCQkgKiBwcm9ncmVzcyBpbiByZWNsYWltaW5nIHBhZ2VzCiAJCSAqLwotCQlpZiAocmFpc2VfcHJpb3JpdHkgfHwgIXNjLm5yX3JlY2xhaW1lZCkKKwkJbnJfcmVjbGFpbWVkID0gc2MubnJfcmVjbGFpbWVkIC0gbnJfcmVjbGFpbWVkOworCQlpZiAocmFpc2VfcHJpb3JpdHkgfHwgIW5yX3JlY2xhaW1lZCkKIAkJCXNjLnByaW9yaXR5LS07CiAJfSB3aGlsZSAoc2MucHJpb3JpdHkgPj0gMSk7CiAKKwlpZiAoIXNjLm5yX3JlY2xhaW1lZCkKKwkJcGdkYXQtPmtzd2FwZF9mYWlsdXJlcysrOworCiBvdXQ6CiAJLyoKIAkgKiBSZXR1cm4gdGhlIG9yZGVyIGtzd2FwZCBzdG9wcGVkIHJlY2xhaW1pbmcgYXQgYXMKQEAgLTM0MjAsNiArMzQwMSwyMiBAQAogCXJldHVybiBzYy5vcmRlcjsKIH0KIAorLyoKKyAqIHBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCBpcyB0aGUgaGlnaGVzdCB6b25lIGluZGV4IHRoYXQgYSByZWNlbnQKKyAqIGFsbG9jYXRpb24gcmVxdWVzdCB3b2tlIGtzd2FwZCBmb3IuIFdoZW4ga3N3YXBkIGhhcyBub3Qgd29rZW4gcmVjZW50bHksCisgKiB0aGUgdmFsdWUgaXMgTUFYX05SX1pPTkVTIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGluZGV4LiBUaGlzIGNvbXBhcmVzIGEKKyAqIGdpdmVuIGNsYXNzem9uZSBhbmQgcmV0dXJucyBpdCBvciB0aGUgaGlnaGVzdCBjbGFzc3pvbmUgaW5kZXgga3N3YXBkCisgKiB3YXMgcmVjZW50bHkgd29rZSBmb3IuCisgKi8KK3N0YXRpYyBlbnVtIHpvbmVfdHlwZSBrc3dhcGRfY2xhc3N6b25lX2lkeChwZ19kYXRhX3QgKnBnZGF0LAorCQkJCQkgICBlbnVtIHpvbmVfdHlwZSBjbGFzc3pvbmVfaWR4KQoreworCWlmIChwZ2RhdC0+a3N3YXBkX2NsYXNzem9uZV9pZHggPT0gTUFYX05SX1pPTkVTKQorCQlyZXR1cm4gY2xhc3N6b25lX2lkeDsKKworCXJldHVybiBtYXgocGdkYXQtPmtzd2FwZF9jbGFzc3pvbmVfaWR4LCBjbGFzc3pvbmVfaWR4KTsKK30KKwogc3RhdGljIHZvaWQga3N3YXBkX3RyeV90b19zbGVlcChwZ19kYXRhX3QgKnBnZGF0LCBpbnQgYWxsb2Nfb3JkZXIsIGludCByZWNsYWltX29yZGVyLAogCQkJCXVuc2lnbmVkIGludCBjbGFzc3pvbmVfaWR4KQogewpAQCAtMzQzMSw3ICszNDI4LDEzIEBACiAKIAlwcmVwYXJlX3RvX3dhaXQoJnBnZGF0LT5rc3dhcGRfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKLQkvKiBUcnkgdG8gc2xlZXAgZm9yIGEgc2hvcnQgaW50ZXJ2YWwgKi8KKwkvKgorCSAqIFRyeSB0byBzbGVlcCBmb3IgYSBzaG9ydCBpbnRlcnZhbC4gTm90ZSB0aGF0IGtjb21wYWN0ZCB3aWxsIG9ubHkgYmUKKwkgKiB3b2tlbiBpZiBpdCBpcyBwb3NzaWJsZSB0byBzbGVlcCBmb3IgYSBzaG9ydCBpbnRlcnZhbC4gVGhpcyBpcworCSAqIGRlbGliZXJhdGUgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBpZiByZWNsYWltIGNhbm5vdCBrZWVwIGFuCisJICogZWxpZ2libGUgem9uZSBiYWxhbmNlZCB0aGF0IGl0J3MgYWxzbyB1bmxpa2VseSB0aGF0IGNvbXBhY3Rpb24gd2lsbAorCSAqIHN1Y2NlZWQuCisJICovCiAJaWYgKHByZXBhcmVfa3N3YXBkX3NsZWVwKHBnZGF0LCByZWNsYWltX29yZGVyLCBjbGFzc3pvbmVfaWR4KSkgewogCQkvKgogCQkgKiBDb21wYWN0aW9uIHJlY29yZHMgd2hhdCBwYWdlIGJsb2NrcyBpdCByZWNlbnRseSBmYWlsZWQgdG8KQEAgLTM0NTUsNyArMzQ1OCw3IEBACiAJCSAqIHRoZSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgc2xlcHQgcHJlbWF0dXJlbHkuCiAJCSAqLwogCQlpZiAocmVtYWluaW5nKSB7Ci0JCQlwZ2RhdC0+a3N3YXBkX2NsYXNzem9uZV9pZHggPSBtYXgocGdkYXQtPmtzd2FwZF9jbGFzc3pvbmVfaWR4LCBjbGFzc3pvbmVfaWR4KTsKKwkJCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IGtzd2FwZF9jbGFzc3pvbmVfaWR4KHBnZGF0LCBjbGFzc3pvbmVfaWR4KTsKIAkJCXBnZGF0LT5rc3dhcGRfb3JkZXIgPSBtYXgocGdkYXQtPmtzd2FwZF9vcmRlciwgcmVjbGFpbV9vcmRlcik7CiAJCX0KIApAQCAtMzUwOSw3ICszNTEyLDggQEAKICAqLwogc3RhdGljIGludCBrc3dhcGQodm9pZCAqcCkKIHsKLQl1bnNpZ25lZCBpbnQgYWxsb2Nfb3JkZXIsIHJlY2xhaW1fb3JkZXIsIGNsYXNzem9uZV9pZHg7CisJdW5zaWduZWQgaW50IGFsbG9jX29yZGVyLCByZWNsYWltX29yZGVyOworCXVuc2lnbmVkIGludCBjbGFzc3pvbmVfaWR4ID0gTUFYX05SX1pPTkVTIC0gMTsKIAlwZ19kYXRhX3QgKnBnZGF0ID0gKHBnX2RhdGFfdCopcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKQEAgLTM1MzksMjAgKzM1NDMsMjMgQEAKIAl0c2stPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEOwogCXNldF9mcmVlemFibGUoKTsKIAotCXBnZGF0LT5rc3dhcGRfb3JkZXIgPSBhbGxvY19vcmRlciA9IHJlY2xhaW1fb3JkZXIgPSAwOwotCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IGNsYXNzem9uZV9pZHggPSAwOworCXBnZGF0LT5rc3dhcGRfb3JkZXIgPSAwOworCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUzsKIAlmb3IgKCA7IDsgKSB7CiAJCWJvb2wgcmV0OwogCisJCWFsbG9jX29yZGVyID0gcmVjbGFpbV9vcmRlciA9IHBnZGF0LT5rc3dhcGRfb3JkZXI7CisJCWNsYXNzem9uZV9pZHggPSBrc3dhcGRfY2xhc3N6b25lX2lkeChwZ2RhdCwgY2xhc3N6b25lX2lkeCk7CisKIGtzd2FwZF90cnlfc2xlZXA6CiAJCWtzd2FwZF90cnlfdG9fc2xlZXAocGdkYXQsIGFsbG9jX29yZGVyLCByZWNsYWltX29yZGVyLAogCQkJCQljbGFzc3pvbmVfaWR4KTsKIAogCQkvKiBSZWFkIHRoZSBuZXcgb3JkZXIgYW5kIGNsYXNzem9uZV9pZHggKi8KIAkJYWxsb2Nfb3JkZXIgPSByZWNsYWltX29yZGVyID0gcGdkYXQtPmtzd2FwZF9vcmRlcjsKLQkJY2xhc3N6b25lX2lkeCA9IHBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeDsKKwkJY2xhc3N6b25lX2lkeCA9IGtzd2FwZF9jbGFzc3pvbmVfaWR4KHBnZGF0LCAwKTsKIAkJcGdkYXQtPmtzd2FwZF9vcmRlciA9IDA7Ci0JCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IDA7CisJCXBnZGF0LT5rc3dhcGRfY2xhc3N6b25lX2lkeCA9IE1BWF9OUl9aT05FUzsKIAogCQlyZXQgPSB0cnlfdG9fZnJlZXplKCk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCkBAIC0zNTc4LDkgKzM1ODUsNiBAQAogCQlyZWNsYWltX29yZGVyID0gYmFsYW5jZV9wZ2RhdChwZ2RhdCwgYWxsb2Nfb3JkZXIsIGNsYXNzem9uZV9pZHgpOwogCQlpZiAocmVjbGFpbV9vcmRlciA8IGFsbG9jX29yZGVyKQogCQkJZ290byBrc3dhcGRfdHJ5X3NsZWVwOwotCi0JCWFsbG9jX29yZGVyID0gcmVjbGFpbV9vcmRlciA9IHBnZGF0LT5rc3dhcGRfb3JkZXI7Ci0JCWNsYXNzem9uZV9pZHggPSBwZ2RhdC0+a3N3YXBkX2NsYXNzem9uZV9pZHg7CiAJfQogCiAJdHNrLT5mbGFncyAmPSB+KFBGX01FTUFMTE9DIHwgUEZfU1dBUFdSSVRFIHwgUEZfS1NXQVBEKTsKQEAgLTM1OTYsNyArMzYwMCw2IEBACiB2b2lkIHdha2V1cF9rc3dhcGQoc3RydWN0IHpvbmUgKnpvbmUsIGludCBvcmRlciwgZW51bSB6b25lX3R5cGUgY2xhc3N6b25lX2lkeCkKIHsKIAlwZ19kYXRhX3QgKnBnZGF0OwotCWludCB6OwogCiAJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCXJldHVybjsKQEAgLTM2MDQsMjIgKzM2MDcsMjAgQEAKIAlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hBUkRXQUxMKSkKIAkJcmV0dXJuOwogCXBnZGF0ID0gem9uZS0+em9uZV9wZ2RhdDsKLQlwZ2RhdC0+a3N3YXBkX2NsYXNzem9uZV9pZHggPSBtYXgocGdkYXQtPmtzd2FwZF9jbGFzc3pvbmVfaWR4LCBjbGFzc3pvbmVfaWR4KTsKKwlwZ2RhdC0+a3N3YXBkX2NsYXNzem9uZV9pZHggPSBrc3dhcGRfY2xhc3N6b25lX2lkeChwZ2RhdCwKKwkJCQkJCQkgICBjbGFzc3pvbmVfaWR4KTsKIAlwZ2RhdC0+a3N3YXBkX29yZGVyID0gbWF4KHBnZGF0LT5rc3dhcGRfb3JkZXIsIG9yZGVyKTsKIAlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJnBnZGF0LT5rc3dhcGRfd2FpdCkpCiAJCXJldHVybjsKIAotCS8qIE9ubHkgd2FrZSBrc3dhcGQgaWYgYWxsIHpvbmVzIGFyZSB1bmJhbGFuY2VkICovCi0JZm9yICh6ID0gMDsgeiA8PSBjbGFzc3pvbmVfaWR4OyB6KyspIHsKLQkJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgejsKLQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCi0JCQljb250aW51ZTsKKwkvKiBIb3BlbGVzcyBub2RlLCBsZWF2ZSBpdCB0byBkaXJlY3QgcmVjbGFpbSAqLworCWlmIChwZ2RhdC0+a3N3YXBkX2ZhaWx1cmVzID49IE1BWF9SRUNMQUlNX1JFVFJJRVMpCisJCXJldHVybjsKIAotCQlpZiAoem9uZV9iYWxhbmNlZCh6b25lLCBvcmRlciwgY2xhc3N6b25lX2lkeCkpCi0JCQlyZXR1cm47Ci0JfQorCWlmIChwZ2RhdF9iYWxhbmNlZChwZ2RhdCwgb3JkZXIsIGNsYXNzem9uZV9pZHgpKQorCQlyZXR1cm47CiAKLQl0cmFjZV9tbV92bXNjYW5fd2FrZXVwX2tzd2FwZChwZ2RhdC0+bm9kZV9pZCwgem9uZV9pZHgoem9uZSksIG9yZGVyKTsKKwl0cmFjZV9tbV92bXNjYW5fd2FrZXVwX2tzd2FwZChwZ2RhdC0+bm9kZV9pZCwgY2xhc3N6b25lX2lkeCwgb3JkZXIpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGdkYXQtPmtzd2FwZF93YWl0KTsKIH0KIApAQCAtMzg3OSw5ICszODgwLDYgQEAKIAkgICAgc3VtX3pvbmVfbm9kZV9wYWdlX3N0YXRlKHBnZGF0LT5ub2RlX2lkLCBOUl9TTEFCX1JFQ0xBSU1BQkxFKSA8PSBwZ2RhdC0+bWluX3NsYWJfcGFnZXMpCiAJCXJldHVybiBOT0RFX1JFQ0xBSU1fRlVMTDsKIAotCWlmICghcGdkYXRfcmVjbGFpbWFibGUocGdkYXQpKQotCQlyZXR1cm4gTk9ERV9SRUNMQUlNX0ZVTEw7Ci0KIAkvKgogCSAqIERvIG5vdCBzY2FuIGlmIHRoZSBhbGxvY2F0aW9uIHNob3VsZCBub3QgYmUgZGVsYXllZC4KIAkgKi8KZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggNTEzYzM3YS4uMmFiNzk3MyAxMDA2NDQKLS0tIGEvbW0vdm1zdGF0LmMKKysrIGIvbW0vdm1zdGF0LmMKQEAgLTk1NCw3ICs5NTQsNiBAQAogCSJucl91bmV2aWN0YWJsZSIsCiAJIm5yX2lzb2xhdGVkX2Fub24iLAogCSJucl9pc29sYXRlZF9maWxlIiwKLQkibnJfcGFnZXNfc2Nhbm5lZCIsCiAJIndvcmtpbmdzZXRfcmVmYXVsdCIsCiAJIndvcmtpbmdzZXRfYWN0aXZhdGUiLAogCSJ3b3JraW5nc2V0X25vZGVyZWNsYWltIiwKQEAgLTEzNzksNyArMTM3OCw2IEBACiAJCSAgICJcbiAgICAgICAgbWluICAgICAgJWx1IgogCQkgICAiXG4gICAgICAgIGxvdyAgICAgICVsdSIKIAkJICAgIlxuICAgICAgICBoaWdoICAgICAlbHUiCi0JCSAgICJcbiAgIG5vZGVfc2Nhbm5lZCAgJWx1IgogCQkgICAiXG4gICAgICAgIHNwYW5uZWQgICVsdSIKIAkJICAgIlxuICAgICAgICBwcmVzZW50ICAlbHUiCiAJCSAgICJcbiAgICAgICAgbWFuYWdlZCAgJWx1IiwKQEAgLTEzODcsNyArMTM4NSw2IEBACiAJCSAgIG1pbl93bWFya19wYWdlcyh6b25lKSwKIAkJICAgbG93X3dtYXJrX3BhZ2VzKHpvbmUpLAogCQkgICBoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLAotCQkgICBub2RlX3BhZ2Vfc3RhdGUoem9uZS0+em9uZV9wZ2RhdCwgTlJfUEFHRVNfU0NBTk5FRCksCiAJCSAgIHpvbmUtPnNwYW5uZWRfcGFnZXMsCiAJCSAgIHpvbmUtPnByZXNlbnRfcGFnZXMsCiAJCSAgIHpvbmUtPm1hbmFnZWRfcGFnZXMpOwpAQCAtMTQyNiw3ICsxNDIzLDcgQEAKIAkJICAgIlxuICBub2RlX3VucmVjbGFpbWFibGU6ICAldSIKIAkJICAgIlxuICBzdGFydF9wZm46ICAgICAgICAgICAlbHUiCiAJCSAgICJcbiAgbm9kZV9pbmFjdGl2ZV9yYXRpbzogJXUiLAotCQkgICAhcGdkYXRfcmVjbGFpbWFibGUoem9uZS0+em9uZV9wZ2RhdCksCisJCSAgIHBnZGF0LT5rc3dhcGRfZmFpbHVyZXMgPj0gTUFYX1JFQ0xBSU1fUkVUUklFUywKIAkJICAgem9uZS0+em9uZV9zdGFydF9wZm4sCiAJCSAgIHpvbmUtPnpvbmVfcGdkYXQtPmluYWN0aXZlX3JhdGlvKTsKIAlzZXFfcHV0YyhtLCAnXG4nKTsKQEAgLTE1ODgsMjIgKzE1ODUsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBOUl9WTV9aT05FX1NUQVRfSVRFTVM7IGkrKykgewogCQl2YWwgPSBhdG9taWNfbG9uZ19yZWFkKCZ2bV96b25lX3N0YXRbaV0pOwogCQlpZiAodmFsIDwgMCkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIE5SX1BBR0VTX1NDQU5ORUQ6Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGlzIG9mdGVuIHNlZW4gdG8gZ28gbmVnYXRpdmUgaW4KLQkJCQkgKiByZWNlbnQga2VybmVscywgYnV0IG5vdCB0byBnbyBwZXJtYW5lbnRseQotCQkJCSAqIG5lZ2F0aXZlLiAgV2hpbHN0IGl0IHdvdWxkIGJlIG5pY2VyIG5vdCB0bwotCQkJCSAqIGhhdmUgZXhjZXB0aW9ucywgcm9vdGluZyB0aGVtIG91dCB3b3VsZCBiZQotCQkJCSAqIGFub3RoZXIgdGFzaywgb2YgcmF0aGVyIGxvdyBwcmlvcml0eS4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJfd2FybigiJXM6ICVzICVsZFxuIiwKLQkJCQkJX19mdW5jX18sIHZtc3RhdF90ZXh0W2ldLCB2YWwpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlwcl93YXJuKCIlczogJXMgJWxkXG4iLAorCQkJCV9fZnVuY19fLCB2bXN0YXRfdGV4dFtpXSwgdmFsKTsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCmluZGV4IGZiZjI1MWYuLjRkNmI5NGQgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwpAQCAtNDg0LDE2ICs0ODQsMTYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcy0+ZGV2OwogCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jd2FpdF9xdWV1ZV90IHdhaXQ7CisJREVGSU5FX1dBSVRfRlVOQyh3YWl0LCB3b2tlbl93YWtlX2Z1bmN0aW9uKTsKIAogCUJUX0RCRygiIik7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7CiAKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoc2spLCAmd2FpdCk7CiAJd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyogRW5zdXJlIHNlc3Npb24tPnRlcm1pbmF0ZSBpcyB1cGRhdGVkICovCisJCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOwogCiAJCWlmIChhdG9taWNfcmVhZCgmcy0+dGVybWluYXRlKSkKIAkJCWJyZWFrOwpAQCAtNTE1LDkgKzUxNSw4IEBACiAJCQkJYnJlYWs7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAotCQlzY2hlZHVsZSgpOworCQl3YWl0X3dva2VuKCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKIAl9Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKHNrKSwgJndhaXQpOwogCiAJLyogQ2xlYW51cCBzZXNzaW9uICovCkBAIC02NjYsNyArNjY1LDcgQEAKIAlzID0gX19ibmVwX2dldF9zZXNzaW9uKHJlcS0+ZHN0KTsKIAlpZiAocykgewogCQlhdG9taWNfaW5jKCZzLT50ZXJtaW5hdGUpOwotCQl3YWtlX3VwX3Byb2Nlc3Mocy0+dGFzayk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShza19zbGVlcChzLT5zb2NrLT5zaykpOwogCX0gZWxzZQogCQllcnIgPSAtRU5PRU5UOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCA5ZTU5YjY2Li4xMTUyY2UzIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTI4MCwxNiArMjgwLDE2IEBACiAJc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGFyZzsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzZXNzaW9uLT5zb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXdhaXRfcXVldWVfdCB3YWl0OworCURFRklORV9XQUlUX0ZVTkMod2FpdCwgd29rZW5fd2FrZV9mdW5jdGlvbik7CiAKIAlCVF9EQkcoInNlc3Npb24gJXAiLCBzZXNzaW9uKTsKIAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZShza19zbGVlcChzayksICZ3YWl0KTsKIAl3aGlsZSAoMSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkvKiBFbnN1cmUgc2Vzc2lvbi0+dGVybWluYXRlIGlzIHVwZGF0ZWQgKi8KKwkJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZzZXNzaW9uLT50ZXJtaW5hdGUpKQogCQkJYnJlYWs7CkBAIC0zMDYsOSArMzA2LDggQEAKIAogCQljbXRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CiAKLQkJc2NoZWR1bGUoKTsKKwkJd2FpdF93b2tlbigmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZShza19zbGVlcChzayksICZ3YWl0KTsKIAogCWRvd25fd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOwpAQCAtMzkzLDcgKzM5Miw3IEBACiAJCWVyciA9IGNtdHBfYXR0YWNoX2RldmljZShzZXNzaW9uKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7Ci0JCQl3YWtlX3VwX3Byb2Nlc3Moc2Vzc2lvbi0+dGFzayk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2tfc2xlZXAoc2Vzc2lvbi0+c29jay0+c2spKTsKIAkJCXVwX3dyaXRlKCZjbXRwX3Nlc3Npb25fc2VtKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTQzMSw3ICs0MzAsMTEgQEAKIAogCQkvKiBTdG9wIHNlc3Npb24gdGhyZWFkICovCiAJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7Ci0JCXdha2VfdXBfcHJvY2VzcyhzZXNzaW9uLT50YXNrKTsKKworCQkvKiBFbnN1cmUgc2Vzc2lvbi0+dGVybWluYXRlIGlzIHVwZGF0ZWQgKi8KKwkJc21wX21iX19hZnRlcl9hdG9taWMoKTsKKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2tfc2xlZXAoc2Vzc2lvbi0+c29jay0+c2spKTsKIAl9IGVsc2UKIAkJZXJyID0gLUVOT0VOVDsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKaW5kZXggMGJlYzQ1OC4uMWZjMDc2NCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCkBAIC0zNiw2ICszNiw3IEBACiAjZGVmaW5lIFZFUlNJT04gIjEuMiIKIAogc3RhdGljIERFQ0xBUkVfUldTRU0oaGlkcF9zZXNzaW9uX3NlbSk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoaGlkcF9zZXNzaW9uX3dxKTsKIHN0YXRpYyBMSVNUX0hFQUQoaGlkcF9zZXNzaW9uX2xpc3QpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBoaWRwX2tleWNvZGVbMjU2XSA9IHsKQEAgLTEwNjgsMTIgKzEwNjksMTIgQEAKICAqIFdha2UgdXAgc2Vzc2lvbiB0aHJlYWQgYW5kIG5vdGlmeSBpdCB0byBzdG9wLiBUaGlzIGlzIGFzeW5jaHJvbm91cyBhbmQKICAqIHJldHVybnMgaW1tZWRpYXRlbHkuIENhbGwgdGhpcyB3aGVuZXZlciBhIHJ1bnRpbWUgZXJyb3Igb2NjdXJzIGFuZCB5b3Ugd2FudAogICogdGhlIHNlc3Npb24gdG8gc3RvcC4KLSAqIE5vdGU6IHdha2VfdXBfcHJvY2VzcygpIHBlcmZvcm1zIGFueSBuZWNlc3NhcnkgbWVtb3J5LWJhcnJpZXJzIGZvciB1cy4KKyAqIE5vdGU6IHdha2VfdXBfaW50ZXJydXB0aWJsZSgpIHBlcmZvcm1zIGFueSBuZWNlc3NhcnkgbWVtb3J5LWJhcnJpZXJzIGZvciB1cy4KICAqLwogc3RhdGljIHZvaWQgaGlkcF9zZXNzaW9uX3Rlcm1pbmF0ZShzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQogewogCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7Ci0Jd2FrZV91cF9wcm9jZXNzKHNlc3Npb24tPnRhc2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGlkcF9zZXNzaW9uX3dxKTsKIH0KIAogLyoKQEAgLTExODAsNyArMTE4MSw5IEBACiAJc3RydWN0IHNvY2sgKmN0cmxfc2sgPSBzZXNzaW9uLT5jdHJsX3NvY2stPnNrOwogCXN0cnVjdCBzb2NrICppbnRyX3NrID0gc2Vzc2lvbi0+aW50cl9zb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCURFRklORV9XQUlUX0ZVTkMod2FpdCwgd29rZW5fd2FrZV9mdW5jdGlvbik7CiAKKwlhZGRfd2FpdF9xdWV1ZSgmaGlkcF9zZXNzaW9uX3dxLCAmd2FpdCk7CiAJZm9yICg7OykgewogCQkvKgogCQkgKiBUaGlzIHRocmVhZCBjYW4gYmUgd29rZW4gdXAgdHdvIHdheXM6CkBAIC0xMTg4LDEyICsxMTkxLDEwIEBACiAJCSAqICAgIHNlc3Npb24tPnRlcm1pbmF0ZSBmbGFnIGFuZCB3YWtlcyB0aGlzIHRocmVhZCB1cC4KIAkJICogIC0gVmlhIG1vZGlmeWluZyB0aGUgc29ja2V0IHN0YXRlIG9mIGN0cmwvaW50cl9zb2NrLiBUaGlzCiAJCSAqICAgIHRocmVhZCBpcyB3b2tlbiB1cCBieSAtPnNrX3N0YXRlX2NoYW5nZWQoKS4KLQkJICoKLQkJICogTm90ZTogc2V0X2N1cnJlbnRfc3RhdGUoKSBwZXJmb3JtcyBhbnkgbmVjZXNzYXJ5Ci0JCSAqIG1lbW9yeS1iYXJyaWVycyBmb3IgdXMuCiAJCSAqLwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCisJCS8qIEVuc3VyZSBzZXNzaW9uLT50ZXJtaW5hdGUgaXMgdXBkYXRlZCAqLworCQlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKIAkJaWYgKGF0b21pY19yZWFkKCZzZXNzaW9uLT50ZXJtaW5hdGUpKQogCQkJYnJlYWs7CiAKQEAgLTEyMjcsMTEgKzEyMjgsMjIgQEAKIAkJaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHNlc3Npb24sICZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0LAogCQkJCSAgICAgIHNlc3Npb24tPmN0cmxfc29jayk7CiAKLQkJc2NoZWR1bGUoKTsKKwkJd2FpdF93b2tlbigmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CiAJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZoaWRwX3Nlc3Npb25fd3EsICZ3YWl0KTsKIAogCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qIEVuc3VyZSBzZXNzaW9uLT50ZXJtaW5hdGUgaXMgdXBkYXRlZCAqLworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7Cit9CisKK3N0YXRpYyBpbnQgaGlkcF9zZXNzaW9uX3dha2VfZnVuY3Rpb24od2FpdF9xdWV1ZV90ICp3YWl0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBtb2RlLAorCQkJCSAgICAgIGludCBzeW5jLCB2b2lkICprZXkpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoaWRwX3Nlc3Npb25fd3EpOworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTEyNDQsNyArMTI1Niw4IEBACiBzdGF0aWMgaW50IGhpZHBfc2Vzc2lvbl90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBhcmc7Ci0Jd2FpdF9xdWV1ZV90IGN0cmxfd2FpdCwgaW50cl93YWl0OworCURFRklORV9XQUlUX0ZVTkMoY3RybF93YWl0LCBoaWRwX3Nlc3Npb25fd2FrZV9mdW5jdGlvbik7CisJREVGSU5FX1dBSVRfRlVOQyhpbnRyX3dhaXQsIGhpZHBfc2Vzc2lvbl93YWtlX2Z1bmN0aW9uKTsKIAogCUJUX0RCRygic2Vzc2lvbiAlcCIsIHNlc3Npb24pOwogCkBAIC0xMjU0LDggKzEyNjcsNiBAQAogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKIAloaWRwX3NldF90aW1lcihzZXNzaW9uKTsKIAotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZjdHJsX3dhaXQsIGN1cnJlbnQpOwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZpbnRyX3dhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKHNrX3NsZWVwKHNlc3Npb24tPmN0cmxfc29jay0+c2spLCAmY3RybF93YWl0KTsKIAlhZGRfd2FpdF9xdWV1ZShza19zbGVlcChzZXNzaW9uLT5pbnRyX3NvY2stPnNrKSwgJmludHJfd2FpdCk7CiAJLyogVGhpcyBtZW1vcnkgYmFycmllciBpcyBwYWlyZWQgd2l0aCB3cV9oYXNfc2xlZXBlcigpLiBTZWUKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggNTc3ZjFjMC4uZmZkMDljMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAkJCQkgICAgICAgdTggY29kZSwgdTggaWRlbnQsIHUxNiBkbGVuLCB2b2lkICpkYXRhKTsKIHN0YXRpYyB2b2lkIGwyY2FwX3NlbmRfY21kKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBpZGVudCwgdTggY29kZSwgdTE2IGxlbiwKIAkJCSAgIHZvaWQgKmRhdGEpOwotc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IGwyY2FwX2J1aWxkX2NvbmZfcmVxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKIHN0YXRpYyB2b2lkIGwyY2FwX3NlbmRfZGlzY29ubl9yZXEoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIGludCBlcnIpOwogCiBzdGF0aWMgdm9pZCBsMmNhcF90eChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IGwyY2FwX2N0cmwgKmNvbnRyb2wsCkBAIC0xNDczLDcgKzE0NzMsNyBAQAogCiAJCQlzZXRfYml0KENPTkZfUkVRX1NFTlQsICZjaGFuLT5jb25mX3N0YXRlKTsKIAkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCi0JCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1ZiksIGJ1Zik7CisJCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCBidWYpOwogCQkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CiAJCX0KIApAQCAtMjk3NywxMiArMjk3NywxNSBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyB2b2lkIGwyY2FwX2FkZF9jb25mX29wdCh2b2lkICoqcHRyLCB1OCB0eXBlLCB1OCBsZW4sIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIHZvaWQgbDJjYXBfYWRkX2NvbmZfb3B0KHZvaWQgKipwdHIsIHU4IHR5cGUsIHU4IGxlbiwgdW5zaWduZWQgbG9uZyB2YWwsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBsMmNhcF9jb25mX29wdCAqb3B0ID0gKnB0cjsKIAogCUJUX0RCRygidHlwZSAweCUyLjJ4IGxlbiAldSB2YWwgMHglbHgiLCB0eXBlLCBsZW4sIHZhbCk7CiAKKwlpZiAoc2l6ZSA8IEwyQ0FQX0NPTkZfT1BUX1NJWkUgKyBsZW4pCisJCXJldHVybjsKKwogCW9wdC0+dHlwZSA9IHR5cGU7CiAJb3B0LT5sZW4gID0gbGVuOwogCkBAIC0zMDA3LDcgKzMwMTAsNyBAQAogCSpwdHIgKz0gTDJDQVBfQ09ORl9PUFRfU0laRSArIGxlbjsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfYWRkX29wdF9lZnModm9pZCAqKnB0ciwgc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCitzdGF0aWMgdm9pZCBsMmNhcF9hZGRfb3B0X2Vmcyh2b2lkICoqcHRyLCBzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IGwyY2FwX2NvbmZfZWZzIGVmczsKIApAQCAtMzAzNSw3ICszMDM4LDcgQEAKIAl9CiAKIAlsMmNhcF9hZGRfY29uZl9vcHQocHRyLCBMMkNBUF9DT05GX0VGUywgc2l6ZW9mKGVmcyksCi0JCQkgICAodW5zaWduZWQgbG9uZykgJmVmcyk7CisJCQkgICAodW5zaWduZWQgbG9uZykgJmVmcywgc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX2Fja190aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTMxODEsMTEgKzMxODQsMTIgQEAKIAljaGFuLT5hY2tfd2luID0gY2hhbi0+dHhfd2luOwogfQogCi1zdGF0aWMgaW50IGwyY2FwX2J1aWxkX2NvbmZfcmVxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CiAJc3RydWN0IGwyY2FwX2NvbmZfcmZjIHJmYyA9IHsgLm1vZGUgPSBjaGFuLT5tb2RlIH07CiAJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCXZvaWQgKmVuZHB0ciA9IGRhdGEgKyBkYXRhX3NpemU7CiAJdTE2IHNpemU7CiAKIAlCVF9EQkcoImNoYW4gJXAiLCBjaGFuKTsKQEAgLTMyMTAsNyArMzIxNCw3IEBACiAKIGRvbmU6CiAJaWYgKGNoYW4tPmltdHUgIT0gTDJDQVBfREVGQVVMVF9NVFUpCi0JCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+aW10dSk7CisJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+aW10dSwgZW5kcHRyIC0gcHRyKTsKIAogCXN3aXRjaCAoY2hhbi0+bW9kZSkgewogCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKQEAgLTMyMjksNyArMzIzMyw3IEBACiAJCXJmYy5tYXhfcGR1X3NpemUgICAgPSAwOwogCiAJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX1JGQywgc2l6ZW9mKHJmYyksCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpICZyZmMpOworCQkJCSAgICh1bnNpZ25lZCBsb25nKSAmcmZjLCBlbmRwdHIgLSBwdHIpOwogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgpAQCAtMzI0OSwyMSArMzI1MywyMSBAQAogCQkJCSAgICAgICBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVyk7CiAKIAkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLCBzaXplb2YocmZjKSwKLQkJCQkgICAodW5zaWduZWQgbG9uZykgJnJmYyk7CisJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZyZmMsIGVuZHB0ciAtIHB0cik7CiAKIAkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkKLQkJCWwyY2FwX2FkZF9vcHRfZWZzKCZwdHIsIGNoYW4pOworCQkJbDJjYXBfYWRkX29wdF9lZnMoJnB0ciwgY2hhbiwgZW5kcHRyIC0gcHRyKTsKIAogCQlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VXUywgMiwKLQkJCQkJICAgY2hhbi0+dHhfd2luKTsKKwkJCQkJICAgY2hhbi0+dHhfd2luLCBlbmRwdHIgLSBwdHIpOwogCiAJCWlmIChjaGFuLT5jb25uLT5mZWF0X21hc2sgJiBMMkNBUF9GRUFUX0ZDUykKIAkJCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX05PTkUgfHwKIAkJCSAgICB0ZXN0X2JpdChDT05GX1JFQ1ZfTk9fRkNTLCAmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKIAkJCQljaGFuLT5mY3MgPSBMMkNBUF9GQ1NfTk9ORTsKIAkJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9GQ1MsIDEsCi0JCQkJCQkgICBjaGFuLT5mY3MpOworCQkJCQkJICAgY2hhbi0+ZmNzLCBlbmRwdHIgLSBwdHIpOwogCQkJfQogCQlicmVhazsKIApAQCAtMzI4MSwxNyArMzI4NSwxNyBAQAogCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLCBzaXplb2YocmZjKSwKLQkJCQkgICAodW5zaWduZWQgbG9uZykgJnJmYyk7CisJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZyZmMsIGVuZHB0ciAtIHB0cik7CiAKIAkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkKLQkJCWwyY2FwX2FkZF9vcHRfZWZzKCZwdHIsIGNoYW4pOworCQkJbDJjYXBfYWRkX29wdF9lZnMoJnB0ciwgY2hhbiwgZW5kcHRyIC0gcHRyKTsKIAogCQlpZiAoY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9GQ1MpCiAJCQlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19OT05FIHx8CiAJCQkgICAgdGVzdF9iaXQoQ09ORl9SRUNWX05PX0ZDUywgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CiAJCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CiAJCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfRkNTLCAxLAotCQkJCQkJICAgY2hhbi0+ZmNzKTsKKwkJCQkJCSAgIGNoYW4tPmZjcywgZW5kcHRyIC0gcHRyKTsKIAkJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMzMwMiwxMCArMzMwNiwxMSBAQAogCXJldHVybiBwdHIgLSBkYXRhOwogfQogCi1zdGF0aWMgaW50IGwyY2FwX3BhcnNlX2NvbmZfcmVxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBsMmNhcF9wYXJzZV9jb25mX3JlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yc3AgKnJzcCA9IGRhdGE7CiAJdm9pZCAqcHRyID0gcnNwLT5kYXRhOworCXZvaWQgKmVuZHB0ciA9IGRhdGEgKyBkYXRhX3NpemU7CiAJdm9pZCAqcmVxID0gY2hhbi0+Y29uZl9yZXE7CiAJaW50IGxlbiA9IGNoYW4tPmNvbmZfbGVuOwogCWludCB0eXBlLCBoaW50LCBvbGVuOwpAQCAtMzQwNyw3ICszNDEyLDcgQEAKIAkJCXJldHVybiAtRUNPTk5SRUZVU0VEOwogCiAJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX1JGQywgc2l6ZW9mKHJmYyksCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpICZyZmMpOworCQkJCSAgICh1bnNpZ25lZCBsb25nKSAmcmZjLCBlbmRwdHIgLSBwdHIpOwogCX0KIAogCWlmIChyZXN1bHQgPT0gTDJDQVBfQ09ORl9TVUNDRVNTKSB7CkBAIC0zNDIwLDcgKzM0MjUsNyBAQAogCQkJY2hhbi0+b210dSA9IG10dTsKIAkJCXNldF9iaXQoQ09ORl9NVFVfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQl9Ci0JCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+b210dSk7CisJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+b210dSwgZW5kcHRyIC0gcHRyKTsKIAogCQlpZiAocmVtb3RlX2VmcykgewogCQkJaWYgKGNoYW4tPmxvY2FsX3N0eXBlICE9IEwyQ0FQX1NFUlZfTk9UUkFGSUMgJiYKQEAgLTM0MzQsNyArMzQzOSw3IEBACiAKIAkJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9FRlMsCiAJCQkJCQkgICBzaXplb2YoZWZzKSwKLQkJCQkJCSAgICh1bnNpZ25lZCBsb25nKSAmZWZzKTsKKwkJCQkJCSAgICh1bnNpZ25lZCBsb25nKSAmZWZzLCBlbmRwdHIgLSBwdHIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBTZW5kIFBFTkRJTkcgQ29uZiBSc3AgKi8KIAkJCQlyZXN1bHQgPSBMMkNBUF9DT05GX1BFTkRJTkc7CkBAIC0zNDY3LDcgKzM0NzIsNyBAQAogCQkJc2V0X2JpdChDT05GX01PREVfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsCi0JCQkJCSAgIHNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7CisJCQkJCSAgIHNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYywgZW5kcHRyIC0gcHRyKTsKIAogCQkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkgewogCQkJCWNoYW4tPnJlbW90ZV9pZCA9IGVmcy5pZDsKQEAgLTM0ODEsNyArMzQ4Niw3IEBACiAJCQkJCWxlMzJfdG9fY3B1KGVmcy5zZHVfaXRpbWUpOwogCQkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VGUywKIAkJCQkJCSAgIHNpemVvZihlZnMpLAotCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZlZnMpOworCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZlZnMsIGVuZHB0ciAtIHB0cik7CiAJCQl9CiAJCQlicmVhazsKIApAQCAtMzQ5NSw3ICszNTAwLDcgQEAKIAkJCXNldF9iaXQoQ09ORl9NT0RFX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKIAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLCBzaXplb2YocmZjKSwKLQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZyZmMpOworCQkJCQkgICAodW5zaWduZWQgbG9uZykgJnJmYywgZW5kcHRyIC0gcHRyKTsKIAogCQkJYnJlYWs7CiAKQEAgLTM1MTcsMTAgKzM1MjIsMTEgQEAKIH0KIAogc3RhdGljIGludCBsMmNhcF9wYXJzZV9jb25mX3JzcChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqcnNwLCBpbnQgbGVuLAotCQkJCXZvaWQgKmRhdGEsIHUxNiAqcmVzdWx0KQorCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB1MTYgKnJlc3VsdCkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CiAJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCXZvaWQgKmVuZHB0ciA9IGRhdGEgKyBzaXplOwogCWludCB0eXBlLCBvbGVuOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCXN0cnVjdCBsMmNhcF9jb25mX3JmYyByZmMgPSB7IC5tb2RlID0gTDJDQVBfTU9ERV9CQVNJQyB9OwpAQCAtMzUzOCwxMyArMzU0NCwxMyBAQAogCQkJCWNoYW4tPmltdHUgPSBMMkNBUF9ERUZBVUxUX01JTl9NVFU7CiAJCQl9IGVsc2UKIAkJCQljaGFuLT5pbXR1ID0gdmFsOwotCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfTVRVLCAyLCBjaGFuLT5pbXR1KTsKKwkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+aW10dSwgZW5kcHRyIC0gcHRyKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTDJDQVBfQ09ORl9GTFVTSF9UTzoKIAkJCWNoYW4tPmZsdXNoX3RvID0gdmFsOwogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfRkxVU0hfVE8sCi0JCQkJCSAgIDIsIGNoYW4tPmZsdXNoX3RvKTsKKwkJCQkJICAgMiwgY2hhbi0+Zmx1c2hfdG8sIGVuZHB0ciAtIHB0cik7CiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX0NPTkZfUkZDOgpAQCAtMzU1OCwxMyArMzU2NCwxMyBAQAogCQkJY2hhbi0+ZmNzID0gMDsKIAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLAotCQkJCQkgICBzaXplb2YocmZjKSwgKHVuc2lnbmVkIGxvbmcpICZyZmMpOworCQkJCQkgICBzaXplb2YocmZjKSwgKHVuc2lnbmVkIGxvbmcpICZyZmMsIGVuZHB0ciAtIHB0cik7CiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX0NPTkZfRVdTOgogCQkJY2hhbi0+YWNrX3dpbiA9IG1pbl90KHUxNiwgdmFsLCBjaGFuLT5hY2tfd2luKTsKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VXUywgMiwKLQkJCQkJICAgY2hhbi0+dHhfd2luKTsKKwkJCQkJICAgY2hhbi0+dHhfd2luLCBlbmRwdHIgLSBwdHIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBMMkNBUF9DT05GX0VGUzoKQEAgLTM1NzcsNyArMzU4Myw3IEBACiAJCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VGUywgc2l6ZW9mKGVmcyksCi0JCQkJCSAgICh1bnNpZ25lZCBsb25nKSAmZWZzKTsKKwkJCQkJICAgKHVuc2lnbmVkIGxvbmcpICZlZnMsIGVuZHB0ciAtIHB0cik7CiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX0NPTkZfRkNTOgpAQCAtMzY4Miw3ICszNjg4LDcgQEAKIAkJcmV0dXJuOwogCiAJbDJjYXBfc2VuZF9jbWQoY29ubiwgbDJjYXBfZ2V0X2lkZW50KGNvbm4pLCBMMkNBUF9DT05GX1JFUSwKLQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1ZiksIGJ1Zik7CisJCSAgICAgICBsMmNhcF9idWlsZF9jb25mX3JlcShjaGFuLCBidWYsIHNpemVvZihidWYpKSwgYnVmKTsKIAljaGFuLT5udW1fY29uZl9yZXErKzsKIH0KIApAQCAtMzg5MCw3ICszODk2LDcgQEAKIAkJdTggYnVmWzEyOF07CiAJCXNldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBsMmNhcF9nZXRfaWRlbnQoY29ubiksIEwyQ0FQX0NPTkZfUkVRLAotCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1ZiksIGJ1Zik7CisJCQkgICAgICAgbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgYnVmLCBzaXplb2YoYnVmKSksIGJ1Zik7CiAJCWNoYW4tPm51bV9jb25mX3JlcSsrOwogCX0KIApAQCAtMzk2OCw3ICszOTc0LDcgQEAKIAkJCWJyZWFrOwogCiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCi0JCQkgICAgICAgbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgcmVxKSwgcmVxKTsKKwkJCSAgICAgICBsMmNhcF9idWlsZF9jb25mX3JlcShjaGFuLCByZXEsIHNpemVvZihyZXEpKSwgcmVxKTsKIAkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CiAJCWJyZWFrOwogCkBAIC00MDgwLDcgKzQwODYsNyBAQAogCX0KIAogCS8qIENvbXBsZXRlIGNvbmZpZy4gKi8KLQlsZW4gPSBsMmNhcF9wYXJzZV9jb25mX3JlcShjaGFuLCByc3ApOworCWxlbiA9IGwyY2FwX3BhcnNlX2NvbmZfcmVxKGNoYW4sIHJzcCwgc2l6ZW9mKHJzcCkpOwogCWlmIChsZW4gPCAwKSB7CiAJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbiwgRUNPTk5SRVNFVCk7CiAJCWdvdG8gdW5sb2NrOwpAQCAtNDExNCw3ICs0MTIwLDcgQEAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpKSB7CiAJCXU4IGJ1Zls2NF07CiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwgTDJDQVBfQ09ORl9SRVEsCi0JCQkgICAgICAgbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgYnVmKSwgYnVmKTsKKwkJCSAgICAgICBsMmNhcF9idWlsZF9jb25mX3JlcShjaGFuLCBidWYsIHNpemVvZihidWYpKSwgYnVmKTsKIAkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CiAJfQogCkBAIC00MTc0LDcgKzQxODAsNyBAQAogCQkJY2hhciBidWZbNjRdOwogCiAJCQlsZW4gPSBsMmNhcF9wYXJzZV9jb25mX3JzcChjaGFuLCByc3AtPmRhdGEsIGxlbiwKLQkJCQkJCSAgIGJ1ZiwgJnJlc3VsdCk7CisJCQkJCQkgICBidWYsIHNpemVvZihidWYpLCAmcmVzdWx0KTsKIAkJCWlmIChsZW4gPCAwKSB7CiAJCQkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLCBFQ09OTlJFU0VUKTsKIAkJCQlnb3RvIGRvbmU7CkBAIC00MjA0LDcgKzQyMTAsNyBAQAogCQkJLyogdGhyb3cgb3V0IGFueSBvbGQgc3RvcmVkIGNvbmYgcmVxdWVzdHMgKi8KIAkJCXJlc3VsdCA9IEwyQ0FQX0NPTkZfU1VDQ0VTUzsKIAkJCWxlbiA9IGwyY2FwX3BhcnNlX2NvbmZfcnNwKGNoYW4sIHJzcC0+ZGF0YSwgbGVuLAotCQkJCQkJICAgcmVxLCAmcmVzdWx0KTsKKwkJCQkJCSAgIHJlcSwgc2l6ZW9mKHJlcSksICZyZXN1bHQpOwogCQkJaWYgKGxlbiA8IDApIHsKIAkJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4sIEVDT05OUkVTRVQpOwogCQkJCWdvdG8gZG9uZTsKQEAgLTQ3ODEsNyArNDc4Nyw3IEBACiAJCQlzZXRfYml0KENPTkZfUkVRX1NFTlQsICZjaGFuLT5jb25mX3N0YXRlKTsKIAkJCWwyY2FwX3NlbmRfY21kKGNoYW4tPmNvbm4sIGwyY2FwX2dldF9pZGVudChjaGFuLT5jb25uKSwKIAkJCQkgICAgICAgTDJDQVBfQ09ORl9SRVEsCi0JCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1ZiksIGJ1Zik7CisJCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCBidWYpOwogCQkJY2hhbi0+bnVtX2NvbmZfcmVxKys7CiAJCX0KIAl9CkBAIC03NDU3LDcgKzc0NjMsNyBAQAogCQkJCXNldF9iaXQoQ09ORl9SRVFfU0VOVCwgJmNoYW4tPmNvbmZfc3RhdGUpOwogCQkJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGwyY2FwX2dldF9pZGVudChjb25uKSwKIAkJCQkJICAgICAgIEwyQ0FQX0NPTkZfUkVRLAotCQkJCQkgICAgICAgbDJjYXBfYnVpbGRfY29uZl9yZXEoY2hhbiwgYnVmKSwKKwkJCQkJICAgICAgIGwyY2FwX2J1aWxkX2NvbmZfcmVxKGNoYW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpLAogCQkJCQkgICAgICAgYnVmKTsKIAkJCQljaGFuLT5udW1fY29uZl9yZXErKzsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCmluZGV4IGZjYWE0ODQuLjA0ZWVhMmYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKKysrIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwpAQCAtNDgsNiArNDgsOSBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAorI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrID0gMDsKKyNlbmRpZgogCUJSX0lOUFVUX1NLQl9DQihza2IpLT5icmRldiA9IGRldjsKIAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kYXRhZ3JhbS5jIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwppbmRleCA1OGRmYTIzLi40ZmE0MDExIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kYXRhZ3JhbS5jCisrKyBiL25ldC9jb3JlL2RhdGFncmFtLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCWlmIChmbGFncyAmIE1TR19QRUVLKSB7CiAJCWVyciA9IC1FTk9FTlQ7CiAJCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCWlmIChza2IgPT0gc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkgeworCQlpZiAoc2tiLT5uZXh0KSB7CiAJCQlfX3NrYl91bmxpbmsoc2tiLCAmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQkJYXRvbWljX2RlYygmc2tiLT51c2Vycyk7CiAJCQllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA3ZTE2OGQwLi5iYzEyOWIwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMjcwNCw5ICsyNzA0LDEwIEBACiBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX25lZWRzX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgdHhfcGF0aCkKIHsKIAlpZiAodHhfcGF0aCkKLQkJcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUw7Ci0JZWxzZQotCQlyZXR1cm4gc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fTk9ORTsKKwkJcmV0dXJuIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwgJiYKKwkJICAgICAgIHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCisJcmV0dXJuIHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkU7CiB9CiAKIC8qKgpAQCAtMjcyNSwxMSArMjcyNiwxMiBAQAogc3RydWN0IHNrX2J1ZmYgKl9fc2tiX2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywgYm9vbCB0eF9wYXRoKQogeworCXN0cnVjdCBza19idWZmICpzZWdzOworCiAJaWYgKHVubGlrZWx5KHNrYl9uZWVkc19jaGVjayhza2IsIHR4X3BhdGgpKSkgewogCQlpbnQgZXJyOwogCi0JCXNrYl93YXJuX2JhZF9vZmZsb2FkKHNrYik7Ci0KKwkJLyogV2UncmUgZ29pbmcgdG8gaW5pdCAtPmNoZWNrIGZpZWxkIGluIFRDUCBvciBVRFAgaGVhZGVyICovCiAJCWVyciA9IHNrYl9jb3dfaGVhZChza2IsIDApOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yNzU3LDcgKzI3NTksMTIgQEAKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9yZXNldF9tYWNfbGVuKHNrYik7CiAKLQlyZXR1cm4gc2tiX21hY19nc29fc2VnbWVudChza2IsIGZlYXR1cmVzKTsKKwlzZWdzID0gc2tiX21hY19nc29fc2VnbWVudChza2IsIGZlYXR1cmVzKTsKKworCWlmICh1bmxpa2VseShza2JfbmVlZHNfY2hlY2soc2tiLCB0eF9wYXRoKSkpCisJCXNrYl93YXJuX2JhZF9vZmZsb2FkKHNrYik7CisKKwlyZXR1cm4gc2VnczsKIH0KIEVYUE9SVF9TWU1CT0woX19za2JfZ3NvX3NlZ21lbnQpOwogCkBAIC01MzYwLDEyICs1MzY3LDEzIEBACiAgKiBGaW5kIG91dCBpZiBhIGRldmljZSBpcyBsaW5rZWQgdG8gYW4gdXBwZXIgZGV2aWNlIGFuZCByZXR1cm4gdHJ1ZSBpbiBjYXNlCiAgKiBpdCBpcy4gVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJUTkwgbG9jay4KICAqLwotc3RhdGljIGJvb2wgbmV0ZGV2X2hhc19hbnlfdXBwZXJfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitib29sIG5ldGRldl9oYXNfYW55X3VwcGVyX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCUFTU0VSVF9SVE5MKCk7CiAKIAlyZXR1cm4gIWxpc3RfZW1wdHkoJmRldi0+YWxsX2Fkal9saXN0LnVwcGVyKTsKIH0KK0VYUE9SVF9TWU1CT0wobmV0ZGV2X2hhc19hbnlfdXBwZXJfZGV2KTsKIAogLyoqCiAgKiBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXQgLSBHZXQgbWFzdGVyIHVwcGVyIGRldmljZQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2X2lvY3RsLmMgYi9uZXQvY29yZS9kZXZfaW9jdGwuYwppbmRleCBiOTRiMWQyLi4xNTFlMDQ3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXZfaW9jdGwuYworKysgYi9uZXQvY29yZS9kZXZfaW9jdGwuYwpAQCAtMjgsNiArMjgsNyBAQAogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZpZnIsIGFyZywgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKKwlpZnIuaWZyX25hbWVbSUZOQU1TSVotMV0gPSAwOwogCiAJZXJyb3IgPSBuZXRkZXZfZ2V0X25hbWUobmV0LCBpZnIuaWZyX25hbWUsIGlmci5pZnJfaWZpbmRleCk7CiAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHN0LmMgYi9uZXQvY29yZS9kc3QuYwppbmRleCAzOWNjMTE5Li5iNWRlMzY2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kc3QuYworKysgYi9uZXQvY29yZS9kc3QuYwpAQCAtMzQ5LDggKzM0OSwxNSBAQAogCiAJbmV3ID0gKCh1bnNpZ25lZCBsb25nKSAmZHN0X2RlZmF1bHRfbWV0cmljcykgfCBEU1RfTUVUUklDU19SRUFEX09OTFk7CiAJcHJldiA9IGNtcHhjaGcoJmRzdC0+X21ldHJpY3MsIG9sZCwgbmV3KTsKLQlpZiAocHJldiA9PSBvbGQpCi0JCWtmcmVlKF9fRFNUX01FVFJJQ1NfUFRSKG9sZCkpOworCWlmIChwcmV2ID09IG9sZCkgeworCQlzdHJ1Y3QgZHN0X21ldHJpY3MgKm9sZF9wID0gKHN0cnVjdCBkc3RfbWV0cmljcyAqKQorCQkJCQkgICAgX19EU1RfTUVUUklDU19QVFIob2xkKTsKKworCQlpZiAocHJldiAmIERTVF9NRVRSSUNTX1JFRkNPVU5URUQpIHsKKwkJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvbGRfcC0+cmVmY250KSkKKwkJCQlrZnJlZShvbGRfcCk7CisJCX0KKwl9CiB9CiBFWFBPUlRfU1lNQk9MKF9fZHN0X2Rlc3Ryb3lfbWV0cmljc19nZW5lcmljKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCA5YzZmZDdmLi40ZDI2Mjk3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtMTk2NSw3ICsxOTY1LDggQEAKIAkJc3RydWN0IHNvY2thZGRyICpzYTsKIAkJaW50IGxlbjsKIAotCQlsZW4gPSBzaXplb2Yoc2FfZmFtaWx5X3QpICsgZGV2LT5hZGRyX2xlbjsKKwkJbGVuID0gc2l6ZW9mKHNhX2ZhbWlseV90KSArIG1heF90KHNpemVfdCwgZGV2LT5hZGRyX2xlbiwKKwkJCQkJCSAgc2l6ZW9mKCpzYSkpOwogCQlzYSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzYSkgewogCQkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2ZlYXQuYyBiL25ldC9kY2NwL2ZlYXQuYwppbmRleCAxNzA0OTQ4Li5mMjI3ZjAwIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9mZWF0LmMKKysrIGIvbmV0L2RjY3AvZmVhdC5jCkBAIC0xNDcxLDkgKzE0NzEsMTIgQEAKIAkgKiBzaW5nbGV0b24gdmFsdWVzICh3aGljaCBhbHdheXMgbGVhZHMgdG8gZmFpbHVyZSkuCiAJICogVGhlc2Ugc2V0dGluZ3MgY2FuIHN0aWxsIChsYXRlcikgYmUgb3ZlcnJpZGRlbiB2aWEgc29ja29wdHMuCiAJICovCi0JaWYgKGNjaWRfZ2V0X2J1aWx0aW5fY2NpZHMoJnR4LnZhbCwgJnR4LmxlbikgfHwKLQkgICAgY2NpZF9nZXRfYnVpbHRpbl9jY2lkcygmcngudmFsLCAmcngubGVuKSkKKwlpZiAoY2NpZF9nZXRfYnVpbHRpbl9jY2lkcygmdHgudmFsLCAmdHgubGVuKSkKIAkJcmV0dXJuIC1FTk9CVUZTOworCWlmIChjY2lkX2dldF9idWlsdGluX2NjaWRzKCZyeC52YWwsICZyeC5sZW4pKSB7CisJCWtmcmVlKHR4LnZhbCk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CiAKIAlpZiAoIWRjY3BfZmVhdF9wcmVmZXIoc3lzY3RsX2RjY3BfdHhfY2NpZCwgdHgudmFsLCB0eC5sZW4pIHx8CiAJICAgICFkY2NwX2ZlYXRfcHJlZmVyKHN5c2N0bF9kY2NwX3J4X2NjaWQsIHJ4LnZhbCwgcngubGVuKSkKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCA4NmIwOTMzLi44ZmMxNjAwIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC02MzcsNiArNjM3LDcgQEAKIAkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJaW5ldF9jc2tfcmVxc2tfcXVldWVfaGFzaF9hZGQoc2ssIHJlcSwgRENDUF9USU1FT1VUX0lOSVQpOworCXJlcXNrX3B1dChyZXEpOwogCXJldHVybiAwOwogCiBkcm9wX2FuZF9mcmVlOgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvaXB2Ni5jIGIvbmV0L2RjY3AvaXB2Ni5jCmluZGV4IDJhYzlkMmEuLjI4ZTgyNTIgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2lwdjYuYworKysgYi9uZXQvZGNjcC9pcHY2LmMKQEAgLTM4MCw2ICszODAsNyBAQAogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAKIAlpbmV0X2Nza19yZXFza19xdWV1ZV9oYXNoX2FkZChzaywgcmVxLCBEQ0NQX1RJTUVPVVRfSU5JVCk7CisJcmVxc2tfcHV0KHJlcSk7CiAJcmV0dXJuIDA7CiAKIGRyb3BfYW5kX2ZyZWU6CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm90by5jIGIvbmV0L2RjY3AvcHJvdG8uYwppbmRleCA5ZmUyNWJmLi5iNjgxNjhmIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm90by5jCisrKyBiL25ldC9kY2NwL3Byb3RvLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAKQEAgLTE3MCw2ICsxNzEsMTUgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZGNjcF9wYWNrZXRfbmFtZSk7CiAKK3N0YXRpYyB2b2lkIGRjY3Bfc2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CisKKwljY2lkX2hjX3R4X2RlbGV0ZShkcC0+ZGNjcHNfaGNfdHhfY2NpZCwgc2spOworCWRwLT5kY2Nwc19oY190eF9jY2lkID0gTlVMTDsKKwlpbmV0X3NvY2tfZGVzdHJ1Y3Qoc2spOworfQorCiBpbnQgZGNjcF9pbml0X3NvY2soc3RydWN0IHNvY2sgKnNrLCBjb25zdCBfX3U4IGN0bF9zb2NrX2luaXRpYWxpemVkKQogewogCXN0cnVjdCBkY2NwX3NvY2sgKmRwID0gZGNjcF9zayhzayk7CkBAIC0xNzksNiArMTg5LDcgQEAKIAlpY3NrLT5pY3NrX3N5bl9yZXRyaWVzCT0gc3lzY3RsX2RjY3BfcmVxdWVzdF9yZXRyaWVzOwogCXNrLT5za19zdGF0ZQkJPSBEQ0NQX0NMT1NFRDsKIAlzay0+c2tfd3JpdGVfc3BhY2UJPSBkY2NwX3dyaXRlX3NwYWNlOworCXNrLT5za19kZXN0cnVjdAkJPSBkY2NwX3NrX2Rlc3RydWN0OwogCWljc2stPmljc2tfc3luY19tc3MJPSBkY2NwX3N5bmNfbXNzOwogCWRwLT5kY2Nwc19tc3NfY2FjaGUJPSA1MzY7CiAJZHAtPmRjY3BzX3JhdGVfbGFzdAk9IGppZmZpZXM7CkBAIC0yMDEsMTAgKzIxMiw3IEBACiB7CiAJc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAotCS8qCi0JICogRENDUCBkb2Vzbid0IHVzZSBza193cml0ZV9xdWV1ZSwganVzdCBza19zZW5kX2hlYWQKLQkgKiBmb3IgcmV0cmFuc21pc3Npb25zCi0JICovCisJX19za2JfcXVldWVfcHVyZ2UoJnNrLT5za193cml0ZV9xdWV1ZSk7CiAJaWYgKHNrLT5za19zZW5kX2hlYWQgIT0gTlVMTCkgewogCQlrZnJlZV9za2Ioc2stPnNrX3NlbmRfaGVhZCk7CiAJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOwpAQCAtMjIyLDggKzIzMCw3IEBACiAJCWRwLT5kY2Nwc19oY19yeF9hY2t2ZWMgPSBOVUxMOwogCX0KIAljY2lkX2hjX3J4X2RlbGV0ZShkcC0+ZGNjcHNfaGNfcnhfY2NpZCwgc2spOwotCWNjaWRfaGNfdHhfZGVsZXRlKGRwLT5kY2Nwc19oY190eF9jY2lkLCBzayk7Ci0JZHAtPmRjY3BzX2hjX3J4X2NjaWQgPSBkcC0+ZGNjcHNfaGNfdHhfY2NpZCA9IE5VTEw7CisJZHAtPmRjY3BzX2hjX3J4X2NjaWQgPSBOVUxMOwogCiAJLyogY2xlYW4gdXAgZmVhdHVyZSBuZWdvdGlhdGlvbiBzdGF0ZSAqLwogCWRjY3BfZmVhdF9saXN0X3B1cmdlKCZkcC0+ZGNjcHNfZmVhdG5lZyk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC82bG93cGFuL3JlYXNzZW1ibHkuYyBiL25ldC9pZWVlODAyMTU0LzZsb3dwYW4vcmVhc3NlbWJseS5jCmluZGV4IDMwZDg3NWQuLmY4NWIwOGIgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0LzZsb3dwYW4vcmVhc3NlbWJseS5jCisrKyBiL25ldC9pZWVlODAyMTU0LzZsb3dwYW4vcmVhc3NlbWJseS5jCkBAIC01ODAsMTkgKzU4MCwxNCBAQAogewogCXN0cnVjdCBuZXRuc19pZWVlODAyMTU0X2xvd3BhbiAqaWVlZTgwMjE1NF9sb3dwYW4gPQogCQluZXRfaWVlZTgwMjE1NF9sb3dwYW4obmV0KTsKLQlpbnQgcmVzOwogCiAJaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzLmhpZ2hfdGhyZXNoID0gSVBWNl9GUkFHX0hJR0hfVEhSRVNIOwogCWllZWU4MDIxNTRfbG93cGFuLT5mcmFncy5sb3dfdGhyZXNoID0gSVBWNl9GUkFHX0xPV19USFJFU0g7CiAJaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzLnRpbWVvdXQgPSBJUFY2X0ZSQUdfVElNRU9VVDsKIAotCXJlcyA9IGluZXRfZnJhZ3NfaW5pdF9uZXQoJmllZWU4MDIxNTRfbG93cGFuLT5mcmFncyk7Ci0JaWYgKHJlcykKLQkJcmV0dXJuIHJlczsKLQlyZXMgPSBsb3dwYW5fZnJhZ3NfbnNfc3lzY3RsX3JlZ2lzdGVyKG5ldCk7Ci0JaWYgKHJlcykKLQkJaW5ldF9mcmFnc191bmluaXRfbmV0KCZpZWVlODAyMTU0X2xvd3Bhbi0+ZnJhZ3MpOwotCXJldHVybiByZXM7CisJaW5ldF9mcmFnc19pbml0X25ldCgmaWVlZTgwMjE1NF9sb3dwYW4tPmZyYWdzKTsKKworCXJldHVybiBsb3dwYW5fZnJhZ3NfbnNfc3lzY3RsX3JlZ2lzdGVyKG5ldCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgbG93cGFuX2ZyYWdzX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCBjZWRkZjQyLi4yYjg4N2M1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0xNzE0LDYgKzE3MTQsMTMgQEAKIAluZXQtPmlwdjQuc3lzY3RsX2lwX2R5bmFkZHIgPSAwOwogCW5ldC0+aXB2NC5zeXNjdGxfaXBfZWFybHlfZGVtdXggPSAxOwogCisJLyogU29tZSBpZ21wIHN5c2N0bCwgd2hvc2UgdmFsdWVzIGFyZSBhbHdheXMgdXNlZCAqLworCW5ldC0+aXB2NC5zeXNjdGxfaWdtcF9tYXhfbWVtYmVyc2hpcHMgPSAyMDsKKwluZXQtPmlwdjQuc3lzY3RsX2lnbXBfbWF4X21zZiA9IDEwOworCS8qIElHTVAgcmVwb3J0cyBmb3IgbGluay1sb2NhbCBtdWx0aWNhc3QgZ3JvdXBzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwluZXQtPmlwdjQuc3lzY3RsX2lnbXBfbGxtX3JlcG9ydHMgPSAxOworCW5ldC0+aXB2NC5zeXNjdGxfaWdtcF9xcnYgPSAyOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKaW5kZXggMzdmNDU3OC4uYzg0MDljYTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC0xMzIwLDEzICsxMzIwLDE0IEBACiAKIHZvaWQgX19pbml0IGlwX2ZpYl9pbml0KHZvaWQpCiB7Ci0JcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fTkVXUk9VVEUsIGluZXRfcnRtX25ld3JvdXRlLCBOVUxMLCBOVUxMKTsKLQlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9ERUxST1VURSwgaW5ldF9ydG1fZGVscm91dGUsIE5VTEwsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX0dFVFJPVVRFLCBOVUxMLCBpbmV0X2R1bXBfZmliLCBOVUxMKTsKKwlmaWJfdHJpZV9pbml0KCk7CiAKIAlyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZmaWJfbmV0X29wcyk7CisKIAlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmZpYl9uZXRkZXZfbm90aWZpZXIpOwogCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZmaWJfaW5ldGFkZHJfbm90aWZpZXIpOwogCi0JZmliX3RyaWVfaW5pdCgpOworCXJ0bmxfcmVnaXN0ZXIoUEZfSU5FVCwgUlRNX05FV1JPVVRFLCBpbmV0X3J0bV9uZXdyb3V0ZSwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9JTkVULCBSVE1fREVMUk9VVEUsIGluZXRfcnRtX2RlbHJvdXRlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX0lORVQsIFJUTV9HRVRST1VURSwgTlVMTCwgaW5ldF9kdW1wX2ZpYiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggNzU2MzgzMS4uMzhjMWM5NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMTA0NCwxNSArMTA0NCwxNyBAQAogCWZpID0ga3phbGxvYyhzaXplb2YoKmZpKStuaHMqc2l6ZW9mKHN0cnVjdCBmaWJfbmgpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZpKQogCQlnb3RvIGZhaWx1cmU7Ci0JZmliX2luZm9fY250Kys7CiAJaWYgKGNmZy0+ZmNfbXgpIHsKIAkJZmktPmZpYl9tZXRyaWNzID0ga3phbGxvYyhzaXplb2YoKmZpLT5maWJfbWV0cmljcyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWZpLT5maWJfbWV0cmljcykKLQkJCWdvdG8gZmFpbHVyZTsKKwkJaWYgKHVubGlrZWx5KCFmaS0+ZmliX21ldHJpY3MpKSB7CisJCQlrZnJlZShmaSk7CisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQl9CiAJCWF0b21pY19zZXQoJmZpLT5maWJfbWV0cmljcy0+cmVmY250LCAxKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlmaS0+ZmliX21ldHJpY3MgPSAoc3RydWN0IGRzdF9tZXRyaWNzICopJmRzdF9kZWZhdWx0X21ldHJpY3M7Ci0KKwl9CisJZmliX2luZm9fY250Kys7CiAJZmktPmZpYl9uZXQgPSBuZXQ7CiAJZmktPmZpYl9wcm90b2NvbCA9IGNmZy0+ZmNfcHJvdG9jb2w7CiAJZmktPmZpYl9zY29wZSA9IGNmZy0+ZmNfc2NvcGU7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pZ21wLmMgYi9uZXQvaXB2NC9pZ21wLmMKaW5kZXggMTk5MzBkYS4uMDg1NzVlMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWdtcC5jCisrKyBiL25ldC9pcHY0L2lnbXAuYwpAQCAtMjk3NCwxMiArMjk3NCw2IEBACiAJCWdvdG8gb3V0X3NvY2s7CiAJfQogCi0JLyogU3lzY3RsIGluaXRpYWxpemF0aW9uICovCi0JbmV0LT5pcHY0LnN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwcyA9IDIwOwotCW5ldC0+aXB2NC5zeXNjdGxfaWdtcF9tYXhfbXNmID0gMTA7Ci0JLyogSUdNUCByZXBvcnRzIGZvciBsaW5rLWxvY2FsIG11bHRpY2FzdCBncm91cHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCAqLwotCW5ldC0+aXB2NC5zeXNjdGxfaWdtcF9sbG1fcmVwb3J0cyA9IDE7Ci0JbmV0LT5pcHY0LnN5c2N0bF9pZ21wX3FydiA9IDI7CiAJcmV0dXJuIDA7CiAKIG91dF9zb2NrOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9mcmFnbWVudC5jIGIvbmV0L2lwdjQvaW5ldF9mcmFnbWVudC5jCmluZGV4IGI1ZTkzMTcuLjYzMWMwZDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pbmV0X2ZyYWdtZW50LmMKQEAgLTIzNCwxMCArMjM0LDggQEAKIAljb25kX3Jlc2NoZWQoKTsKIAogCWlmIChyZWFkX3NlcXJldHJ5KCZmLT5ybmRfc2VxbG9jaywgc2VxKSB8fAotCSAgICBwZXJjcHVfY291bnRlcl9zdW0oJm5mLT5tZW0pKQorCSAgICBzdW1fZnJhZ19tZW1fbGltaXQobmYpKQogCQlnb3RvIGV2aWN0X2FnYWluOwotCi0JcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmbmYtPm1lbSk7CiB9CiBFWFBPUlRfU1lNQk9MKGluZXRfZnJhZ3NfZXhpdF9uZXQpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwppbmRleCBiYmU3ZjcyLi40NTNkYjk1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCisrKyBiL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKQEAgLTgzNSw4ICs4MzUsNiBAQAogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgaXB2NF9mcmFnc19pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0JaW50IHJlczsKLQogCS8qIEZyYWdtZW50IGNhY2hlIGxpbWl0cy4KIAkgKgogCSAqIFRoZSBmcmFnbWVudCBtZW1vcnkgYWNjb3VudGluZyBjb2RlLCAodHJpZXMgdG8pIGFjY291bnQgZm9yCkBAIC04NjIsMTMgKzg2MCw5IEBACiAKIAluZXQtPmlwdjQuZnJhZ3MubWF4X2Rpc3QgPSA2NDsKIAotCXJlcyA9IGluZXRfZnJhZ3NfaW5pdF9uZXQoJm5ldC0+aXB2NC5mcmFncyk7Ci0JaWYgKHJlcykKLQkJcmV0dXJuIHJlczsKLQlyZXMgPSBpcDRfZnJhZ3NfbnNfY3RsX3JlZ2lzdGVyKG5ldCk7Ci0JaWYgKHJlcykKLQkJaW5ldF9mcmFnc191bmluaXRfbmV0KCZuZXQtPmlwdjQuZnJhZ3MpOwotCXJldHVybiByZXM7CisJaW5ldF9mcmFnc19pbml0X25ldCgmbmV0LT5pcHY0LmZyYWdzKTsKKworCXJldHVybiBpcDRfZnJhZ3NfbnNfY3RsX3JlZ2lzdGVyKG5ldCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgaXB2NF9mcmFnc19leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IDJjMThiY2YuLmU2MGY5ZmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC05NTgsMTAgKzk1OCwxMiBAQAogCQljc3VtbW9kZSA9IENIRUNLU1VNX1BBUlRJQUw7CiAKIAljb3JrLT5sZW5ndGggKz0gbGVuZ3RoOwotCWlmICgoKGxlbmd0aCA+IG10dSkgfHwgKHNrYiAmJiBza2JfaXNfZ3NvKHNrYikpKSAmJgorCWlmICgoc2tiICYmIHNrYl9pc19nc28oc2tiKSkgfHwKKwkgICAgKChsZW5ndGggPiBtdHUpICYmCisJICAgIChza2JfcXVldWVfbGVuKHF1ZXVlKSA8PSAxKSAmJgogCSAgICAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVURQKSAmJgogCSAgICAocnQtPmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pICYmICFydC0+ZHN0LmhlYWRlcl9sZW4gJiYKLQkgICAgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pICYmICFzay0+c2tfbm9fY2hlY2tfdHgpIHsKKwkgICAgKHNrLT5za190eXBlID09IFNPQ0tfREdSQU0pICYmICFzay0+c2tfbm9fY2hlY2tfdHgpKSB7CiAJCWVyciA9IGlwX3Vmb19hcHBlbmRfZGF0YShzaywgcXVldWUsIGdldGZyYWcsIGZyb20sIGxlbmd0aCwKIAkJCQkJIGhoX2xlbiwgZnJhZ2hlYWRlcmxlbiwgdHJhbnNoZHJsZW4sCiAJCQkJCSBtYXhmcmFnbGVuLCBmbGFncyk7CkBAIC0xMjc3LDYgKzEyNzksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICgoc2l6ZSArIHNrYi0+bGVuID4gbXR1KSAmJgorCSAgICAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3dyaXRlX3F1ZXVlKSA9PSAxKSAmJgogCSAgICAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVURQKSAmJgogCSAgICAocnQtPmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pKSB7CiAJCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfdHVubmVsLmMgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwppbmRleCA1NzE5ZDZiLi5iZDdmMTgzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWwuYworKysgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwpAQCAtNjA5LDggKzYwOSw4IEBACiAJCWlwX3J0X3B1dChydCk7CiAJCWdvdG8gdHhfZHJvcHBlZDsKIAl9Ci0JaXB0dW5uZWxfeG1pdChOVUxMLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwgcHJvdG8sIGtleS0+dG9zLAotCQkgICAgICBrZXktPnR0bCwgZGYsICFuZXRfZXEodHVubmVsLT5uZXQsIGRldl9uZXQoZGV2KSkpOworCWlwdHVubmVsX3htaXQoTlVMTCwgcnQsIHNrYiwgZmw0LnNhZGRyLCBmbDQuZGFkZHIsIHByb3RvLCB0b3MsIHR0bCwKKwkJICAgICAgZGYsICFuZXRfZXEodHVubmVsLT5uZXQsIGRldl9uZXQoZGV2KSkpOwogCXJldHVybjsKIHR4X2Vycm9yOgogCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfcmVqZWN0X2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCmluZGV4IGZkODIyMDIuLjE0NmQ4NjEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCkBAIC0xMjYsNiArMTI2LDggQEAKIAkvKiBpcF9yb3V0ZV9tZV9oYXJkZXIgZXhwZWN0cyBza2ItPmRzdCB0byBiZSBzZXQgKi8KIAlza2JfZHN0X3NldF9ub3JlZihuc2tiLCBza2JfZHN0KG9sZHNrYikpOwogCisJbnNrYi0+bWFyayA9IElQNF9SRVBMWV9NQVJLKG5ldCwgb2xkc2tiLT5tYXJrKTsKKwogCXNrYl9yZXNlcnZlKG5za2IsIExMX01BWF9IRUFERVIpOwogCW5pcGggPSBuZl9yZWplY3RfaXBoZHJfcHV0KG5za2IsIG9sZHNrYiwgSVBQUk9UT19UQ1AsCiAJCQkJICAgaXA0X2RzdF9ob3BsaW1pdChza2JfZHN0KG5za2IpKSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCAxOGM2ZTc5Li5hNGZhZjMwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTEyNTMsNyArMTI1Myw3IEBACiAJaWYgKG10dSkKIAkJcmV0dXJuIG10dTsKIAotCW10dSA9IGRzdC0+ZGV2LT5tdHU7CisJbXR1ID0gUkVBRF9PTkNFKGRzdC0+ZGV2LT5tdHUpOwogCiAJaWYgKHVubGlrZWx5KGRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9NVFUpKSkgewogCQlpZiAocnQtPnJ0X3VzZXNfZ2F0ZXdheSAmJiBtdHUgPiA1NzYpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggMGRjNjI4Ni4uZjU2YTY2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMzM0LDYgKzMzNCw3IEBACiAJdHJlcSA9IHRjcF9yc2socmVxKTsKIAl0cmVxLT5yY3ZfaXNuCQk9IG50b2hsKHRoLT5zZXEpIC0gMTsKIAl0cmVxLT5zbnRfaXNuCQk9IGNvb2tpZTsKKwl0cmVxLT50eGhhc2gJCT0gbmV0X3R4X3JuZGhhc2goKTsKIAlyZXEtPm1zcwkJPSBtc3M7CiAJaXJlcS0+aXJfbnVtCQk9IG50b2hzKHRoLT5kZXN0KTsKIAlpcmVxLT5pcl9ybXRfcG9ydAk9IHRoLT5zb3VyY2U7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCmluZGV4IDUxYWM3N2UuLmNjYzQ4NGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCisrKyBiL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jCkBAIC0xMDEwLDcgKzEwMTAsNyBAQAogCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX25vdHNlbnRfbG93YXQsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb3VpbnR2ZWMsCiAJfSwKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICiAJewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCA3YzkwMTMwLi40OTQ2ZThmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMjMwNiw2ICsyMzA2LDEwIEBACiAJdGNwX3NldF9jYV9zdGF0ZShzaywgVENQX0NBX09wZW4pOwogCXRjcF9jbGVhcl9yZXRyYW5zKHRwKTsKIAlpbmV0X2Nza19kZWxhY2tfaW5pdChzayk7CisJLyogSW5pdGlhbGl6ZSByY3ZfbXNzIHRvIFRDUF9NSU5fTVNTIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IDAKKwkgKiBpc3N1ZSBpbiBfX3RjcF9zZWxlY3Rfd2luZG93KCkKKwkgKi8KKwlpY3NrLT5pY3NrX2Fjay5yY3ZfbXNzID0gVENQX01JTl9NU1M7CiAJdGNwX2luaXRfc2VuZF9oZWFkKHNrKTsKIAltZW1zZXQoJnRwLT5yeF9vcHQsIDAsIHNpemVvZih0cC0+cnhfb3B0KSk7CiAJX19za19kc3RfcmVzZXQoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Jici5jIGIvbmV0L2lwdjQvdGNwX2Jici5jCmluZGV4IDBlYTY2YzIuLmNiOGRiMzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9iYnIuYworKysgYi9uZXQvaXB2NC90Y3BfYmJyLmMKQEAgLTgzLDcgKzgzLDggQEAKIAkJY3duZF9nYWluOjEwLAkvKiBjdXJyZW50IGdhaW4gZm9yIHNldHRpbmcgY3duZCAqLwogCQlmdWxsX2J3X2NudDozLAkvKiBudW1iZXIgb2Ygcm91bmRzIHdpdGhvdXQgbGFyZ2UgYncgZ2FpbnMgKi8KIAkJY3ljbGVfaWR4OjMsCS8qIGN1cnJlbnQgaW5kZXggaW4gcGFjaW5nX2dhaW4gY3ljbGUgYXJyYXkgKi8KLQkJdW51c2VkX2I6NjsKKwkJaGFzX3NlZW5fcnR0OjEsIC8qIGhhdmUgd2Ugc2VlbiBhbiBSVFQgc2FtcGxlIHlldD8gKi8KKwkJdW51c2VkX2I6NTsKIAl1MzIJcHJpb3JfY3duZDsJLyogcHJpb3IgY3duZCB1cG9uIGVudGVyaW5nIGxvc3MgcmVjb3ZlcnkgKi8KIAl1MzIJZnVsbF9idzsJLyogcmVjZW50IGJ3LCB0byBlc3RpbWF0ZSBpZiBwaXBlIGlzIGZ1bGwgKi8KIH07CkBAIC0xODIsNiArMTgzLDM1IEBACiAJcmV0dXJuIHJhdGUgPj4gQldfU0NBTEU7CiB9CiAKKy8qIENvbnZlcnQgYSBCQlIgYncgYW5kIGdhaW4gZmFjdG9yIHRvIGEgcGFjaW5nIHJhdGUgaW4gYnl0ZXMgcGVyIHNlY29uZC4gKi8KK3N0YXRpYyB1MzIgYmJyX2J3X3RvX3BhY2luZ19yYXRlKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3LCBpbnQgZ2FpbikKK3sKKwl1NjQgcmF0ZSA9IGJ3OworCisJcmF0ZSA9IGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIHJhdGUsIGdhaW4pOworCXJhdGUgPSBtaW5fdCh1NjQsIHJhdGUsIHNrLT5za19tYXhfcGFjaW5nX3JhdGUpOworCXJldHVybiByYXRlOworfQorCisvKiBJbml0aWFsaXplIHBhY2luZyByYXRlIHRvOiBoaWdoX2dhaW4gKiBpbml0X2N3bmQgLyBSVFQuICovCitzdGF0aWMgdm9pZCBiYnJfaW5pdF9wYWNpbmdfcmF0ZV9mcm9tX3J0dChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXU2NCBidzsKKwl1MzIgcnR0X3VzOworCisJaWYgKHRwLT5zcnR0X3VzKSB7CQkvKiBhbnkgUlRUIHNhbXBsZSB5ZXQ/ICovCisJCXJ0dF91cyA9IG1heCh0cC0+c3J0dF91cyA+PiAzLCAxVSk7CisJCWJici0+aGFzX3NlZW5fcnR0ID0gMTsKKwl9IGVsc2UgewkJCSAvKiBubyBSVFQgc2FtcGxlIHlldCAqLworCQlydHRfdXMgPSBVU0VDX1BFUl9NU0VDOwkgLyogdXNlIG5vbWluYWwgZGVmYXVsdCBSVFQgKi8KKwl9CisJYncgPSAodTY0KXRwLT5zbmRfY3duZCAqIEJXX1VOSVQ7CisJZG9fZGl2KGJ3LCBydHRfdXMpOworCXNrLT5za19wYWNpbmdfcmF0ZSA9IGJicl9id190b19wYWNpbmdfcmF0ZShzaywgYncsIGJicl9oaWdoX2dhaW4pOworfQorCiAvKiBQYWNlIHVzaW5nIGN1cnJlbnQgYncgZXN0aW1hdGUgYW5kIGEgZ2FpbiBmYWN0b3IuIEluIG9yZGVyIHRvIGhlbHAgZHJpdmUgdGhlCiAgKiBuZXR3b3JrIHRvd2FyZCBsb3dlciBxdWV1ZXMgd2hpbGUgbWFpbnRhaW5pbmcgaGlnaCB1dGlsaXphdGlvbiBhbmQgbG93CiAgKiBsYXRlbmN5LCB0aGUgYXZlcmFnZSBwYWNpbmcgcmF0ZSBhaW1zIHRvIGJlIHNsaWdodGx5ICh+MSUpIGxvd2VyIHRoYW4gdGhlCkBAIC0xOTEsMTIgKzIyMSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBiYnJfc2V0X3BhY2luZ19yYXRlKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3LCBpbnQgZ2FpbikKIHsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7Ci0JdTY0IHJhdGUgPSBidzsKKwl1MzIgcmF0ZSA9IGJicl9id190b19wYWNpbmdfcmF0ZShzaywgYncsIGdhaW4pOwogCi0JcmF0ZSA9IGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIHJhdGUsIGdhaW4pOwotCXJhdGUgPSBtaW5fdCh1NjQsIHJhdGUsIHNrLT5za19tYXhfcGFjaW5nX3JhdGUpOwotCWlmIChiYnItPm1vZGUgIT0gQkJSX1NUQVJUVVAgfHwgcmF0ZSA+IHNrLT5za19wYWNpbmdfcmF0ZSkKKwlpZiAodW5saWtlbHkoIWJici0+aGFzX3NlZW5fcnR0ICYmIHRwLT5zcnR0X3VzKSkKKwkJYmJyX2luaXRfcGFjaW5nX3JhdGVfZnJvbV9ydHQoc2spOworCWlmIChiYnJfZnVsbF9id19yZWFjaGVkKHNrKSB8fCByYXRlID4gc2stPnNrX3BhY2luZ19yYXRlKQogCQlzay0+c2tfcGFjaW5nX3JhdGUgPSByYXRlOwogfQogCkBAIC03NjksNyArODAwLDYgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7Ci0JdTY0IGJ3OwogCiAJYmJyLT5wcmlvcl9jd25kID0gMDsKIAliYnItPnRzb19zZWdzX2dvYWwgPSAwOwkgLyogZGVmYXVsdCBzZWdzIHBlciBza2IgdW50aWwgZmlyc3QgQUNLICovCkBAIC03ODUsMTEgKzgxNSw4IEBACiAKIAltaW5tYXhfcmVzZXQoJmJici0+YncsIGJici0+cnR0X2NudCwgMCk7ICAvKiBpbml0IG1heCBidyB0byAwICovCiAKLQkvKiBJbml0aWFsaXplIHBhY2luZyByYXRlIHRvOiBoaWdoX2dhaW4gKiBpbml0X2N3bmQgLyBSVFQuICovCi0JYncgPSAodTY0KXRwLT5zbmRfY3duZCAqIEJXX1VOSVQ7Ci0JZG9fZGl2KGJ3LCAodHAtPnNydHRfdXMgPj4gMykgPyA6IFVTRUNfUEVSX01TRUMpOwotCXNrLT5za19wYWNpbmdfcmF0ZSA9IDA7CQkvKiBmb3JjZSBhbiB1cGRhdGUgb2Ygc2tfcGFjaW5nX3JhdGUgKi8KLQliYnJfc2V0X3BhY2luZ19yYXRlKHNrLCBidywgYmJyX2hpZ2hfZ2Fpbik7CisJYmJyLT5oYXNfc2Vlbl9ydHQgPSAwOworCWJicl9pbml0X3BhY2luZ19yYXRlX2Zyb21fcnR0KHNrKTsKIAogCWJici0+cmVzdG9yZV9jd25kID0gMDsKIAliYnItPnJvdW5kX3N0YXJ0ID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggM2Q5ODBkNi4uNDkxYjAzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTI1NjEsOCArMjU2MSw4IEBACiAJCXJldHVybjsKIAogCS8qIFJlc2V0IGN3bmQgdG8gc3N0aHJlc2ggaW4gQ1dSIG9yIFJlY292ZXJ5ICh1bmxlc3MgaXQncyB1bmRvbmUpICovCi0JaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfQ1dSIHx8Ci0JICAgICh0cC0+dW5kb19tYXJrZXIgJiYgdHAtPnNuZF9zc3RocmVzaCA8IFRDUF9JTkZJTklURV9TU1RIUkVTSCkpIHsKKwlpZiAodHAtPnNuZF9zc3RocmVzaCA8IFRDUF9JTkZJTklURV9TU1RIUkVTSCAmJgorCSAgICAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9DV1IgfHwgdHAtPnVuZG9fbWFya2VyKSkgewogCQl0cC0+c25kX2N3bmQgPSB0cC0+c25kX3NzdGhyZXNoOwogCQl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKIAl9CkBAIC0zMDM3LDggKzMwMzcsNyBAQAogCQkJLyogZGVsdGEgbWF5IG5vdCBiZSBwb3NpdGl2ZSBpZiB0aGUgc29ja2V0IGlzIGxvY2tlZAogCQkJICogd2hlbiB0aGUgcmV0cmFucyB0aW1lciBmaXJlcyBhbmQgaXMgcmVzY2hlZHVsZWQuCiAJCQkgKi8KLQkJCWlmIChkZWx0YSA+IDApCi0JCQkJcnRvID0gZGVsdGE7CisJCQlydG8gPSBtYXgoZGVsdGEsIDEpOwogCQl9CiAJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLCBydG8sCiAJCQkJCSAgVENQX1JUT19NQVgpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX291dHB1dC5jIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCmluZGV4IGU2YmYwMTEuLmE4MzU3MTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKQEAgLTMzNDQsNiArMzM0NCw5IEBACiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CiAJaW50IGVycjsKIAorCWlmIChpbmV0X2NzayhzayktPmljc2tfYWZfb3BzLT5yZWJ1aWxkX2hlYWRlcihzaykpCisJCXJldHVybiAtRUhPU1RVTlJFQUNIOyAvKiBSb3V0aW5nIGZhaWx1cmUgb3Igc2ltaWxhci4gKi8KKwogCXRjcF9jb25uZWN0X2luaXQoc2spOwogCiAJaWYgKHVubGlrZWx5KHRwLT5yZXBhaXIpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IDczMjA2MGQuLmQzZDNlZjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC02ODYsNyArNjg2LDggQEAKIAkJZ290byBkZWF0aDsKIAl9CiAKLQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTikgfHwgc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkKKwlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19LRUVQT1BFTikgfHwKKwkgICAgKCgxIDw8IHNrLT5za19zdGF0ZSkgJiAoVENQRl9DTE9TRSB8IFRDUEZfU1lOX1NFTlQpKSkKIAkJZ290byBvdXQ7CiAKIAllbGFwc2VkID0ga2VlcGFsaXZlX3RpbWVfd2hlbih0cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGZlMjQ0MjQuLjdjMWY1ZjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC04MTgsNyArODE4LDcgQEAKIAlpZiAoaXNfdWRwbGl0ZSkgIAkJCQkgLyogICAgIFVEUC1MaXRlICAgICAgKi8KIAkJY3N1bSA9IHVkcGxpdGVfY3N1bShza2IpOwogCi0JZWxzZSBpZiAoc2stPnNrX25vX2NoZWNrX3R4KSB7ICAgLyogVURQIGNzdW0gZGlzYWJsZWQgKi8KKwllbHNlIGlmIChzay0+c2tfbm9fY2hlY2tfdHggJiYgIXNrYl9pc19nc28oc2tiKSkgeyAgIC8qIFVEUCBjc3VtIG9mZiAqLwogCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJZ290byBzZW5kOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX29mZmxvYWQuYyBiL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKaW5kZXggYjJiZTFkOS4uNmRlMDE2ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwX29mZmxvYWQuYworKysgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAlpZiAodWgtPmNoZWNrID09IDApCiAJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOwogCi0Jc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKIAkvKiBJZiB0aGVyZSBpcyBubyBvdXRlciBoZWFkZXIgd2UgY2FuIGZha2UgYSBjaGVja3N1bSBvZmZsb2FkCiAJICogZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGRvbmUgdGhlIGNoZWNrc3VtIGluCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCBmZTUzMDVhLi4zNzEzMTJiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTU0ODUsNyArNTQ4NSw3IEBACiAJCSAqIG91ciBEQUQgcHJvY2Vzcywgc28gd2UgZG9uJ3QgbmVlZAogCQkgKiB0byBkbyBpdCBhZ2FpbgogCQkgKi8KLQkJaWYgKCEoaWZwLT5ydC0+cnQ2aV9ub2RlKSkKKwkJaWYgKCFyY3VfYWNjZXNzX3BvaW50ZXIoaWZwLT5ydC0+cnQ2aV9ub2RlKSkKIAkJCWlwNl9pbnNfcnQoaWZwLT5ydCk7CiAJCWlmIChpZnAtPmlkZXYtPmNuZi5mb3J3YXJkaW5nKQogCQkJYWRkcmNvbmZfam9pbl9hbnljYXN0KGlmcCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggNDM0NWVlMy4uNWRhODY0OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTQ4LDExICsxNDgsMjMgQEAKIAlyZXR1cm4gZm47CiB9CiAKLXN0YXRpYyB2b2lkIG5vZGVfZnJlZShzdHJ1Y3QgZmliNl9ub2RlICpmbikKK3N0YXRpYyB2b2lkIG5vZGVfZnJlZV9pbW1lZGlhdGUoc3RydWN0IGZpYjZfbm9kZSAqZm4pCiB7CiAJa21lbV9jYWNoZV9mcmVlKGZpYjZfbm9kZV9rbWVtLCBmbik7CiB9CiAKK3N0YXRpYyB2b2lkIG5vZGVfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBmaWI2X25vZGUgKmZuID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWI2X25vZGUsIHJjdSk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoZmliNl9ub2RlX2ttZW0sIGZuKTsKK30KKworc3RhdGljIHZvaWQgbm9kZV9mcmVlKHN0cnVjdCBmaWI2X25vZGUgKmZuKQoreworCWNhbGxfcmN1KCZmbi0+cmN1LCBub2RlX2ZyZWVfcmN1KTsKK30KKwogc3RhdGljIHZvaWQgcnQ2X3JjdV9mcmVlKHN0cnVjdCBydDZfaW5mbyAqcnQpCiB7CiAJY2FsbF9yY3UoJnJ0LT5kc3QucmN1X2hlYWQsIGRzdF9yY3VfZnJlZSk7CkBAIC0xODksNiArMjAxLDEyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmaWI2X2ZyZWVfdGFibGUoc3RydWN0IGZpYjZfdGFibGUgKnRhYmxlKQoreworCWluZXRwZWVyX2ludmFsaWRhdGVfdHJlZSgmdGFibGUtPnRiNl9wZWVycyk7CisJa2ZyZWUodGFibGUpOworfQorCiBzdGF0aWMgdm9pZCBmaWI2X2xpbmtfdGFibGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliNl90YWJsZSAqdGIpCiB7CiAJdW5zaWduZWQgaW50IGg7CkBAIC01ODksOSArNjA3LDkgQEAKIAogCQlpZiAoIWluIHx8ICFsbikgewogCQkJaWYgKGluKQotCQkJCW5vZGVfZnJlZShpbik7CisJCQkJbm9kZV9mcmVlX2ltbWVkaWF0ZShpbik7CiAJCQlpZiAobG4pCi0JCQkJbm9kZV9mcmVlKGxuKTsKKwkJCQlub2RlX2ZyZWVfaW1tZWRpYXRlKGxuKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQl9CiAKQEAgLTg2Miw3ICs4ODAsNyBAQAogCiAJCXJ0LT5kc3QucnQ2X25leHQgPSBpdGVyOwogCQkqaW5zID0gcnQ7Ci0JCXJ0LT5ydDZpX25vZGUgPSBmbjsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHJ0LT5ydDZpX25vZGUsIGZuKTsKIAkJYXRvbWljX2luYygmcnQtPnJ0NmlfcmVmKTsKIAkJaW5ldDZfcnRfbm90aWZ5KFJUTV9ORVdST1VURSwgcnQsIGluZm8sIG5sZmxhZ3MpOwogCQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcnRfZW50cmllcysrOwpAQCAtODg3LDcgKzkwNSw3IEBACiAJCQlyZXR1cm4gZXJyOwogCiAJCSppbnMgPSBydDsKLQkJcnQtPnJ0Nmlfbm9kZSA9IGZuOworCQlyY3VfYXNzaWduX3BvaW50ZXIocnQtPnJ0Nmlfbm9kZSwgZm4pOwogCQlydC0+ZHN0LnJ0Nl9uZXh0ID0gaXRlci0+ZHN0LnJ0Nl9uZXh0OwogCQlhdG9taWNfaW5jKCZydC0+cnQ2aV9yZWYpOwogCQlpbmV0Nl9ydF9ub3RpZnkoUlRNX05FV1JPVVRFLCBydCwgaW5mbywgTkxNX0ZfUkVQTEFDRSk7CkBAIC04OTcsNiArOTE1LDggQEAKIAkJfQogCQluc2libGluZ3MgPSBpdGVyLT5ydDZpX25zaWJsaW5nczsKIAkJZmliNl9wdXJnZV9ydChpdGVyLCBmbiwgaW5mby0+bmxfbmV0KTsKKwkJaWYgKGZuLT5ycl9wdHIgPT0gaXRlcikKKwkJCWZuLT5ycl9wdHIgPSBOVUxMOwogCQlydDZfcmVsZWFzZShpdGVyKTsKIAogCQlpZiAobnNpYmxpbmdzKSB7CkBAIC05MDksNiArOTI5LDggQEAKIAkJCQlpZiAocnQ2X3F1YWxpZnlfZm9yX2VjbXAoaXRlcikpIHsKIAkJCQkJKmlucyA9IGl0ZXItPmRzdC5ydDZfbmV4dDsKIAkJCQkJZmliNl9wdXJnZV9ydChpdGVyLCBmbiwgaW5mby0+bmxfbmV0KTsKKwkJCQkJaWYgKGZuLT5ycl9wdHIgPT0gaXRlcikKKwkJCQkJCWZuLT5ycl9wdHIgPSBOVUxMOwogCQkJCQlydDZfcmVsZWFzZShpdGVyKTsKIAkJCQkJbnNpYmxpbmdzLS07CiAJCQkJfSBlbHNlIHsKQEAgLTk5Nyw3ICsxMDE5LDcgQEAKIAkJCS8qIENyZWF0ZSBzdWJ0cmVlIHJvb3Qgbm9kZSAqLwogCQkJc2ZuID0gbm9kZV9hbGxvYygpOwogCQkJaWYgKCFzZm4pCi0JCQkJZ290byBzdF9mYWlsdXJlOworCQkJCWdvdG8gZmFpbHVyZTsKIAogCQkJc2ZuLT5sZWFmID0gaW5mby0+bmxfbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5OwogCQkJYXRvbWljX2luYygmaW5mby0+bmxfbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT5ydDZpX3JlZik7CkBAIC0xMDEzLDEyICsxMDM1LDEyIEBACiAKIAkJCWlmIChJU19FUlIoc24pKSB7CiAJCQkJLyogSWYgaXQgaXMgZmFpbGVkLCBkaXNjYXJkIGp1c3QgYWxsb2NhdGVkCi0JCQkJICAgcm9vdCwgYW5kIHRoZW4gKGluIHN0X2ZhaWx1cmUpIHN0YWxlIG5vZGUKKwkJCQkgICByb290LCBhbmQgdGhlbiAoaW4gZmFpbHVyZSkgc3RhbGUgbm9kZQogCQkJCSAgIGluIG1haW4gdHJlZS4KIAkJCQkgKi8KLQkJCQlub2RlX2ZyZWUoc2ZuKTsKKwkJCQlub2RlX2ZyZWVfaW1tZWRpYXRlKHNmbik7CiAJCQkJZXJyID0gUFRSX0VSUihzbik7Ci0JCQkJZ290byBzdF9mYWlsdXJlOworCQkJCWdvdG8gZmFpbHVyZTsKIAkJCX0KIAogCQkJLyogTm93IGxpbmsgbmV3IHN1YnRyZWUgdG8gbWFpbiB0cmVlICovCkBAIC0xMDMyLDcgKzEwNTQsNyBAQAogCiAJCQlpZiAoSVNfRVJSKHNuKSkgewogCQkJCWVyciA9IFBUUl9FUlIoc24pOwotCQkJCWdvdG8gc3RfZmFpbHVyZTsKKwkJCQlnb3RvIGZhaWx1cmU7CiAJCQl9CiAJCX0KIApAQCAtMTA3NCwyMiArMTA5NiwyMiBAQAogCQkJYXRvbWljX2luYygmcG4tPmxlYWYtPnJ0NmlfcmVmKTsKIAkJfQogI2VuZGlmCi0JCWlmICghKHJ0LT5kc3QuZmxhZ3MgJiBEU1RfTk9DQUNIRSkpCi0JCQlkc3RfZnJlZSgmcnQtPmRzdCk7CisJCWdvdG8gZmFpbHVyZTsKIAl9CiAJcmV0dXJuIGVycjsKIAotI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCi0JLyogU3VidHJlZSBjcmVhdGlvbiBmYWlsZWQsIHByb2JhYmx5IG1haW4gdHJlZSBub2RlCi0JICAgaXMgb3JwaGFuLiBJZiBpdCBpcywgc2hvb3QgaXQuCitmYWlsdXJlOgorCS8qIGZuLT5sZWFmIGNvdWxkIGJlIE5VTEwgaWYgZm4gaXMgYW4gaW50ZXJtZWRpYXRlIG5vZGUgYW5kIHdlCisJICogZmFpbGVkIHRvIGFkZCB0aGUgbmV3IHJvdXRlIHRvIGl0IGluIGJvdGggc3VidHJlZSBjcmVhdGlvbgorCSAqIGZhaWx1cmUgYW5kIGZpYjZfYWRkX3J0Mm5vZGUoKSBmYWlsdXJlIGNhc2UuCisJICogSW4gYm90aCBjYXNlcywgZmliNl9yZXBhaXJfdHJlZSgpIHNob3VsZCBiZSBjYWxsZWQgdG8gZml4CisJICogZm4tPmxlYWYuCiAJICovCi1zdF9mYWlsdXJlOgogCWlmIChmbiAmJiAhKGZuLT5mbl9mbGFncyAmIChSVE5fUlRJTkZPfFJUTl9ST09UKSkpCiAJCWZpYjZfcmVwYWlyX3RyZWUoaW5mby0+bmxfbmV0LCBmbik7CiAJaWYgKCEocnQtPmRzdC5mbGFncyAmIERTVF9OT0NBQ0hFKSkKIAkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCXJldHVybiBlcnI7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTE0NDMsOCArMTQ2NSw5IEBACiAKIGludCBmaWI2X2RlbChzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCBzdHJ1Y3QgbmxfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgZmliNl9ub2RlICpmbiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocnQtPnJ0Nmlfbm9kZSwKKwkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZydC0+cnQ2aV90YWJsZS0+dGI2X2xvY2spKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBpbmZvLT5ubF9uZXQ7Ci0Jc3RydWN0IGZpYjZfbm9kZSAqZm4gPSBydC0+cnQ2aV9ub2RlOwogCXN0cnVjdCBydDZfaW5mbyAqKnJ0cDsKIAogI2lmIFJUNl9ERUJVRyA+PSAyCkBAIC0xNjMzLDcgKzE2NTYsOSBAQAogCQkJaWYgKHJlcykgewogI2lmIFJUNl9ERUJVRyA+PSAyCiAJCQkJcHJfZGVidWcoIiVzOiBkZWwgZmFpbGVkOiBydD0lcEAlcCBlcnI9JWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcnQsIHJ0LT5ydDZpX25vZGUsIHJlcyk7CisJCQkJCSBfX2Z1bmNfXywgcnQsCisJCQkJCSByY3VfYWNjZXNzX3BvaW50ZXIocnQtPnJ0Nmlfbm9kZSksCisJCQkJCSByZXMpOwogI2VuZGlmCiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0xODc0LDE1ICsxODk5LDIyIEBACiAKIHN0YXRpYyB2b2lkIGZpYjZfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQogeworCXVuc2lnbmVkIGludCBpOworCiAJcnQ2X2lmZG93bihuZXQsIE5VTEwpOwogCWRlbF90aW1lcl9zeW5jKCZuZXQtPmlwdjYuaXA2X2ZpYl90aW1lcik7CiAKLSNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKLQlpbmV0cGVlcl9pbnZhbGlkYXRlX3RyZWUoJm5ldC0+aXB2Ni5maWI2X2xvY2FsX3RibC0+dGI2X3BlZXJzKTsKLQlrZnJlZShuZXQtPmlwdjYuZmliNl9sb2NhbF90YmwpOwotI2VuZGlmCi0JaW5ldHBlZXJfaW52YWxpZGF0ZV90cmVlKCZuZXQtPmlwdjYuZmliNl9tYWluX3RibC0+dGI2X3BlZXJzKTsKLQlrZnJlZShuZXQtPmlwdjYuZmliNl9tYWluX3RibCk7CisJZm9yIChpID0gMDsgaSA8IEZJQjZfVEFCTEVfSEFTSFNaOyBpKyspIHsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmbmV0LT5pcHY2LmZpYl90YWJsZV9oYXNoW2ldOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCQlzdHJ1Y3QgZmliNl90YWJsZSAqdGI7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0YjZfaGxpc3QpIHsKKwkJCWhsaXN0X2RlbCgmdGItPnRiNl9obGlzdCk7CisJCQlmaWI2X2ZyZWVfdGFibGUodGIpOworCQl9CisJfQorCiAJa2ZyZWUobmV0LT5pcHY2LmZpYl90YWJsZV9oYXNoKTsKIAlrZnJlZShuZXQtPmlwdjYucnQ2X3N0YXRzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9ncmUuYyBiL25ldC9pcHY2L2lwNl9ncmUuYwppbmRleCBjMzI5YTE1Li5hZTg3YjlhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZ3JlLmMKKysrIGIvbmV0L2lwdjYvaXA2X2dyZS5jCkBAIC00MzIsNyArNDMyLDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIElDTVBWNl9QS1RfVE9PQklHOgotCQltdHUgPSBiZTMyX3RvX2NwdShpbmZvKSAtIG9mZnNldDsKKwkJbXR1ID0gYmUzMl90b19jcHUoaW5mbykgLSBvZmZzZXQgLSB0LT50dW5faGxlbjsKKwkJaWYgKHQtPmRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCisJCQltdHUgLT0gRVRIX0hMRU47CiAJCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCiAJCQltdHUgPSBJUFY2X01JTl9NVFU7CiAJCXQtPmRldi0+bXR1ID0gbXR1OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IDNlNDIyMjEuLjgyMWFhMGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTY3MSw4ICs2NzEsNiBAQAogCQkqcHJldmhkciA9IE5FWFRIRFJfRlJBR01FTlQ7CiAJCXRtcF9oZHIgPSBrbWVtZHVwKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpLCBobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF0bXBfaGRyKSB7Ci0JCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KHNrYl9kc3Qoc2tiKSksCi0JCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWw7CiAJCX0KQEAgLTc5MSw4ICs3ODksNiBAQAogCQlmcmFnID0gYWxsb2Nfc2tiKGxlbiArIGhsZW4gKyBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSArCiAJCQkJIGhyb29tICsgdHJvb20sIEdGUF9BVE9NSUMpOwogCQlpZiAoIWZyYWcpIHsKLQkJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKSwKLQkJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHRkFJTFMpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtMTM4NCwxMSArMTM4MCwxMiBAQAogCSAqLwogCiAJY29yay0+bGVuZ3RoICs9IGxlbmd0aDsKLQlpZiAoKChsZW5ndGggPiBtdHUpIHx8Ci0JICAgICAoc2tiICYmIHNrYl9pc19nc28oc2tiKSkpICYmCisJaWYgKChza2IgJiYgc2tiX2lzX2dzbyhza2IpKSB8fAorCSAgICAoKChsZW5ndGggKyBmcmFnaGVhZGVybGVuKSA+IG10dSkgJiYKKwkgICAgKHNrYl9xdWV1ZV9sZW4ocXVldWUpIDw9IDEpICYmCiAJICAgIChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19VRFApICYmCiAJICAgIChydC0+ZHN0LmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1VGTykgJiYgIXJ0LT5kc3QuaGVhZGVyX2xlbiAmJgotCSAgICAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkgJiYgIXVkcF9nZXRfbm9fY2hlY2s2X3R4KHNrKSkgeworCSAgICAoc2stPnNrX3R5cGUgPT0gU09DS19ER1JBTSkgJiYgIXVkcF9nZXRfbm9fY2hlY2s2X3R4KHNrKSkpIHsKIAkJZXJyID0gaXA2X3Vmb19hcHBlbmRfZGF0YShzaywgcXVldWUsIGdldGZyYWcsIGZyb20sIGxlbmd0aCwKIAkJCQkJICBoaF9sZW4sIGZyYWdoZWFkZXJsZW4sIGV4dGhkcmxlbiwKIAkJCQkJICB0cmFuc2hkcmxlbiwgbXR1LCBmbGFncywgZmw2KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCA5ODZkNGNhLi5iMjYzYmYzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC02MjIsMTggKzYyMiwxMiBAQAogCiBzdGF0aWMgaW50IG5mX2N0X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlpbnQgcmVzOwotCiAJbmV0LT5uZl9mcmFnLmZyYWdzLmhpZ2hfdGhyZXNoID0gSVBWNl9GUkFHX0hJR0hfVEhSRVNIOwogCW5ldC0+bmZfZnJhZy5mcmFncy5sb3dfdGhyZXNoID0gSVBWNl9GUkFHX0xPV19USFJFU0g7CiAJbmV0LT5uZl9mcmFnLmZyYWdzLnRpbWVvdXQgPSBJUFY2X0ZSQUdfVElNRU9VVDsKLQlyZXMgPSBpbmV0X2ZyYWdzX2luaXRfbmV0KCZuZXQtPm5mX2ZyYWcuZnJhZ3MpOwotCWlmIChyZXMpCi0JCXJldHVybiByZXM7Ci0JcmVzID0gbmZfY3RfZnJhZzZfc3lzY3RsX3JlZ2lzdGVyKG5ldCk7Ci0JaWYgKHJlcykKLQkJaW5ldF9mcmFnc191bmluaXRfbmV0KCZuZXQtPm5mX2ZyYWcuZnJhZ3MpOwotCXJldHVybiByZXM7CisJaW5ldF9mcmFnc19pbml0X25ldCgmbmV0LT5uZl9mcmFnLmZyYWdzKTsKKworCXJldHVybiBuZl9jdF9mcmFnNl9zeXNjdGxfcmVnaXN0ZXIobmV0KTsKIH0KIAogc3RhdGljIHZvaWQgbmZfY3RfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3JlamVjdF9pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfcmVqZWN0X2lwdjYuYwppbmRleCAxMDA5MDQwLi5lZWRlZTVkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfcmVqZWN0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfcmVqZWN0X2lwdjYuYwpAQCAtMTU3LDYgKzE1Nyw3IEBACiAJZmw2LmZsNl9zcG9ydCA9IG90Y3BoLT5kZXN0OwogCWZsNi5mbDZfZHBvcnQgPSBvdGNwaC0+c291cmNlOwogCWZsNi5mbG93aTZfb2lmID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4KHNrYl9kc3Qob2xkc2tiKS0+ZGV2KTsKKwlmbDYuZmxvd2k2X21hcmsgPSBJUDZfUkVQTFlfTUFSSyhuZXQsIG9sZHNrYi0+bWFyayk7CiAJc2VjdXJpdHlfc2tiX2NsYXNzaWZ5X2Zsb3cob2xkc2tiLCBmbG93aTZfdG9fZmxvd2koJmZsNikpOwogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmw2KTsKIAlpZiAoZHN0LT5lcnJvcikgewpAQCAtMTgwLDYgKzE4MSw4IEBACiAKIAlza2JfZHN0X3NldChuc2tiLCBkc3QpOwogCisJbnNrYi0+bWFyayA9IGZsNi5mbG93aTZfbWFyazsKKwogCXNrYl9yZXNlcnZlKG5za2IsIGhoX2xlbiArIGRzdC0+aGVhZGVyX2xlbik7CiAJaXA2aCA9IG5mX3JlamVjdF9pcDZoZHJfcHV0KG5za2IsIG9sZHNrYiwgSVBQUk9UT19UQ1AsCiAJCQkJICAgIGlwNl9kc3RfaG9wbGltaXQoZHN0KSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwppbmRleCBlOTA2NWI4Li5hMzM4YmJjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jCisrKyBiL25ldC9pcHY2L291dHB1dF9jb3JlLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAogaW50IGlwNl9maW5kXzFzdGZyYWdvcHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKipuZXh0aGRyKQogewotCXUxNiBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwogCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0KIAkJc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJaW50IGZvdW5kX3JoZHIgPSAwOwpAQCAtMTEyLDYgKzExMiw4IEBACiAJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsKIAkJCQkJCSBvZmZzZXQpOwogCQlvZmZzZXQgKz0gaXB2Nl9vcHRsZW4oZXh0aGRyKTsKKwkJaWYgKG9mZnNldCA+IElQVjZfTUFYUExFTikKKwkJCXJldHVybiAtRUlOVkFMOwogCQkqbmV4dGhkciA9ICZleHRoZHItPm5leHRoZHI7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKaW5kZXggMzgxNWU4NS4uZTU4NWMwYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jCisrKyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwpAQCAtNzA5LDE5ICs3MDksMTMgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IGlwdjZfZnJhZ3NfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQogewotCWludCByZXM7Ci0KIAluZXQtPmlwdjYuZnJhZ3MuaGlnaF90aHJlc2ggPSBJUFY2X0ZSQUdfSElHSF9USFJFU0g7CiAJbmV0LT5pcHY2LmZyYWdzLmxvd190aHJlc2ggPSBJUFY2X0ZSQUdfTE9XX1RIUkVTSDsKIAluZXQtPmlwdjYuZnJhZ3MudGltZW91dCA9IElQVjZfRlJBR19USU1FT1VUOwogCi0JcmVzID0gaW5ldF9mcmFnc19pbml0X25ldCgmbmV0LT5pcHY2LmZyYWdzKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCXJlcyA9IGlwNl9mcmFnc19uc19zeXNjdGxfcmVnaXN0ZXIobmV0KTsKLQlpZiAocmVzKQotCQlpbmV0X2ZyYWdzX3VuaW5pdF9uZXQoJm5ldC0+aXB2Ni5mcmFncyk7Ci0JcmV0dXJuIHJlczsKKwlpbmV0X2ZyYWdzX2luaXRfbmV0KCZuZXQtPmlwdjYuZnJhZ3MpOworCisJcmV0dXJuIGlwNl9mcmFnc19uc19zeXNjdGxfcmVnaXN0ZXIobmV0KTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBpcHY2X2ZyYWdzX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IGQ4MTIzZjYuLjVhY2Q4NTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtMTI2MSw3ICsxMjYxLDkgQEAKIAogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKnJ0Nl9jaGVjayhzdHJ1Y3QgcnQ2X2luZm8gKnJ0LCB1MzIgY29va2llKQogewotCWlmICghcnQtPnJ0Nmlfbm9kZSB8fCAocnQtPnJ0Nmlfbm9kZS0+Zm5fc2VybnVtICE9IGNvb2tpZSkpCisJdTMyIHJ0X2Nvb2tpZSA9IDA7CisKKwlpZiAoIXJ0Nl9nZXRfY29va2llX3NhZmUocnQsICZydF9jb29raWUpIHx8IHJ0X2Nvb2tpZSAhPSBjb29raWUpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKHJ0Nl9jaGVja19leHBpcmVkKHJ0KSkKQEAgLTEzMjksOCArMTMzMSwxNCBAQAogCQlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpIHsKIAkJCWRzdF9ob2xkKCZydC0+ZHN0KTsKIAkJCWlwNl9kZWxfcnQocnQpOwotCQl9IGVsc2UgaWYgKHJ0LT5ydDZpX25vZGUgJiYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0RFRkFVTFQpKSB7Ci0JCQlydC0+cnQ2aV9ub2RlLT5mbl9zZXJudW0gPSAtMTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBmaWI2X25vZGUgKmZuOworCisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlmbiA9IHJjdV9kZXJlZmVyZW5jZShydC0+cnQ2aV9ub2RlKTsKKwkJCWlmIChmbiAmJiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfREVGQVVMVCkpCisJCQkJZm4tPmZuX3Nlcm51bSA9IC0xOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCX0KIAl9CiB9CkBAIC0xMzQ3LDcgKzEzNTUsOCBAQAogc3RhdGljIGJvb2wgcnQ2X2NhY2hlX2FsbG93ZWRfZm9yX3BtdHUoY29uc3Qgc3RydWN0IHJ0Nl9pbmZvICpydCkKIHsKIAlyZXR1cm4gIShydC0+cnQ2aV9mbGFncyAmIFJURl9DQUNIRSkgJiYKLQkJKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX1BDUFUgfHwgcnQtPnJ0Nmlfbm9kZSk7CisJCShydC0+cnQ2aV9mbGFncyAmIFJURl9QQ1BVIHx8CisJCSByY3VfYWNjZXNzX3BvaW50ZXIocnQtPnJ0Nmlfbm9kZSkpOwogfQogCiBzdGF0aWMgdm9pZCBfX2lwNl9ydF91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwppbmRleCA5NzgzMGE2Li5hNjcxNzRlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeW5jb29raWVzLmMKKysrIGIvbmV0L2lwdjYvc3luY29va2llcy5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAl0cmVxLT5zbnRfc3luYWNrLnY2NAk9IDA7CiAJdHJlcS0+cmN2X2lzbiA9IG50b2hsKHRoLT5zZXEpIC0gMTsKIAl0cmVxLT5zbnRfaXNuID0gY29va2llOworCXRyZXEtPnR4aGFzaCA9IG5ldF90eF9ybmRoYXNoKCk7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gbG9va3VwIHRoZSBkc3RfZW50cnkgdG8gZ2V0IHRoZSBjb3JyZWN0IHdpbmRvdyBzaXplLgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBjOTI1ZmQ5Li5jNDNlZjBjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtOTE1LDYgKzkxNSw3IEBACiAJCSAqLwogCQlvZmZzZXQgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwogCQlza2ItPmNzdW0gPSBza2JfY2hlY2tzdW0oc2tiLCBvZmZzZXQsIHNrYi0+bGVuIC0gb2Zmc2V0LCAwKTsKKwkJY3N1bSA9IHNrYi0+Y3N1bTsKIAogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcF9vZmZsb2FkLmMgYi9uZXQvaXB2Ni91ZHBfb2ZmbG9hZC5jCmluZGV4IGEyMjY3ZjguLmU3ZDM3OGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjYvdWRwX29mZmxvYWQuYwpAQCAtNzIsNyArNzIsNyBAQAogCQlpZiAodWgtPmNoZWNrID09IDApCiAJCQl1aC0+Y2hlY2sgPSBDU1VNX01BTkdMRURfMDsKIAotCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAKIAkJLyogSWYgdGhlcmUgaXMgbm8gb3V0ZXIgaGVhZGVyIHdlIGNhbiBmYWtlIGEgY2hlY2tzdW0gb2ZmbG9hZAogCQkgKiBkdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZG9uZSB0aGUgY2hlY2tzdW0gaW4KZGlmZiAtLWdpdCBhL25ldC9pcmRhL2FmX2lyZGEuYyBiL25ldC9pcmRhL2FmX2lyZGEuYwppbmRleCAzOTFjM2NiLi4xMDFlZDZjIDEwMDY0NAotLS0gYS9uZXQvaXJkYS9hZl9pcmRhLmMKKysrIGIvbmV0L2lyZGEvYWZfaXJkYS5jCkBAIC0yMjIzLDcgKzIyMjMsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKLQlzdHJ1Y3QgaXJkYV9kZXZpY2VfbGlzdCBsaXN0OworCXN0cnVjdCBpcmRhX2RldmljZV9saXN0IGxpc3QgPSB7IDAgfTsKIAlzdHJ1Y3QgaXJkYV9kZXZpY2VfaW5mbyAqZGlzY292ZXJpZXM7CiAJc3RydWN0IGlyZGFfaWFzX3NldCAqCWlhc19vcHQ7CS8qIElBUyBnZXQvcXVlcnkgcGFyYW1zICovCiAJc3RydWN0IGlhc19vYmplY3QgKglpYXNfb2JqOwkvKiBPYmplY3QgaW4gSUFTICovCmRpZmYgLS1naXQgYS9uZXQva2NtL2tjbXNvY2suYyBiL25ldC9rY20va2Ntc29jay5jCmluZGV4IGZlY2FkMTAuLjdlYjBlOGYgMTAwNjQ0Ci0tLSBhL25ldC9rY20va2Ntc29jay5jCisrKyBiL25ldC9rY20va2Ntc29jay5jCkBAIC0xMzgxLDYgKzEzODEsMTAgQEAKIAlpZiAoIWNzaykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBXZSBtdXN0IHByZXZlbnQgbG9vcHMgb3IgcmlzayBkZWFkbG9jayAhICovCisJaWYgKGNzay0+c2tfZmFtaWx5ID09IFBGX0tDTSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJcHNvY2sgPSBrbWVtX2NhY2hlX3phbGxvYyhrY21fcHNvY2twLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBzb2NrKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IGQ4ZDk1YjYuLjk0YmY4MTAgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtNjMsNiArNjMsNyBAQAogCQl9IHU7CiAJCXN0cnVjdCBza19idWZmCSpza2I7CiAJfSBkdW1wOworCXN0cnVjdCBtdXRleCBkdW1wX2xvY2s7CiB9OwogCiBzdGF0aWMgaW50IHBhcnNlX3NvY2thZGRyX3BhaXIoc3RydWN0IHNvY2thZGRyICpzYSwgaW50IGV4dF9sZW4sCkBAIC0xNDMsNiArMTQ0LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0bnNfcGZrZXkgKm5ldF9wZmtleSA9IG5ldF9nZW5lcmljKG5ldCwgcGZrZXlfbmV0X2lkKTsKIAlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHBma2V5X3NvY2sgKnBmazsKIAlpbnQgZXJyOwogCiAJaWYgKCFuc19jYXBhYmxlKG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCkBAIC0xNTcsNiArMTU5LDkgQEAKIAlpZiAoc2sgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKKwlwZmsgPSBwZmtleV9zayhzayk7CisJbXV0ZXhfaW5pdCgmcGZrLT5kdW1wX2xvY2spOworCiAJc29jay0+b3BzID0gJnBma2V5X29wczsKIAlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CiAKQEAgLTIyMyw3ICsyMjgsNyBAQAogI2RlZmluZSBCUk9BRENBU1RfT05FCQkxCiAjZGVmaW5lIEJST0FEQ0FTVF9SRUdJU1RFUkVECTIKICNkZWZpbmUgQlJPQURDQVNUX1BST01JU0NfT05MWQk0Ci1zdGF0aWMgaW50IHBma2V5X2Jyb2FkY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBwZmtleV9icm9hZGNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgYWxsb2NhdGlvbiwKIAkJCSAgIGludCBicm9hZGNhc3RfZmxhZ3MsIHN0cnVjdCBzb2NrICpvbmVfc2ssCiAJCQkgICBzdHJ1Y3QgbmV0ICpuZXQpCiB7CkBAIC0yNzMsNyArMjc4LDcgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChvbmVfc2sgIT0gTlVMTCkKLQkJZXJyID0gcGZrZXlfYnJvYWRjYXN0X29uZShza2IsICZza2IyLCBHRlBfS0VSTkVMLCBvbmVfc2spOworCQllcnIgPSBwZmtleV9icm9hZGNhc3Rfb25lKHNrYiwgJnNrYjIsIGFsbG9jYXRpb24sIG9uZV9zayk7CiAKIAlrZnJlZV9za2Ioc2tiMik7CiAJa2ZyZWVfc2tiKHNrYik7CkBAIC0yODUsMjMgKzI5MCwzNiBAQAogCXN0cnVjdCBzYWRiX21zZyAqaGRyOwogCWludCByYzsKIAorCW11dGV4X2xvY2soJnBmay0+ZHVtcF9sb2NrKTsKKwlpZiAoIXBmay0+ZHVtcC5kdW1wKSB7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQorCiAJcmMgPSBwZmstPmR1bXAuZHVtcChwZmspOwotCWlmIChyYyA9PSAtRU5PQlVGUykKLQkJcmV0dXJuIDA7CisJaWYgKHJjID09IC1FTk9CVUZTKSB7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQogCiAJaWYgKHBmay0+ZHVtcC5za2IpIHsKLQkJaWYgKCFwZmtleV9jYW5fZHVtcCgmcGZrLT5zaykpCi0JCQlyZXR1cm4gMDsKKwkJaWYgKCFwZmtleV9jYW5fZHVtcCgmcGZrLT5zaykpIHsKKwkJCXJjID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CiAKIAkJaGRyID0gKHN0cnVjdCBzYWRiX21zZyAqKSBwZmstPmR1bXAuc2tiLT5kYXRhOwogCQloZHItPnNhZGJfbXNnX3NlcSA9IDA7CiAJCWhkci0+c2FkYl9tc2dfZXJybm8gPSByYzsKLQkJcGZrZXlfYnJvYWRjYXN0KHBmay0+ZHVtcC5za2IsIEJST0FEQ0FTVF9PTkUsCisJCXBma2V5X2Jyb2FkY2FzdChwZmstPmR1bXAuc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLAogCQkJCSZwZmstPnNrLCBzb2NrX25ldCgmcGZrLT5zaykpOwogCQlwZmstPmR1bXAuc2tiID0gTlVMTDsKIAl9CiAKIAlwZmtleV90ZXJtaW5hdGVfZHVtcChwZmspOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwZmstPmR1bXBfbG9jayk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMzcsNyArMzU1LDcgQEAKIAloZHItPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvCiAJCQkgICAgIHNpemVvZih1aW50NjRfdCkpOwogCi0JcGZrZXlfYnJvYWRjYXN0KHNrYiwgQlJPQURDQVNUX09ORSwgc2ssIHNvY2tfbmV0KHNrKSk7CisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0tFUk5FTCwgQlJPQURDQVNUX09ORSwgc2ssIHNvY2tfbmV0KHNrKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNzgsNyArMTM5Niw3IEBACiAKIAl4ZnJtX3N0YXRlX3B1dCh4KTsKIAotCXBma2V5X2Jyb2FkY2FzdChyZXNwX3NrYiwgQlJPQURDQVNUX09ORSwgc2ssIG5ldCk7CisJcGZrZXlfYnJvYWRjYXN0KHJlc3Bfc2tiLCBHRlBfS0VSTkVMLCBCUk9BRENBU1RfT05FLCBzaywgbmV0KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQ2NSw3ICsxNDgzLDcgQEAKIAloZHItPnNhZGJfbXNnX3NlcSA9IGMtPnNlcTsKIAloZHItPnNhZGJfbXNnX3BpZCA9IGMtPnBvcnRpZDsKIAotCXBma2V5X2Jyb2FkY2FzdChza2IsIEJST0FEQ0FTVF9BTEwsIE5VTEwsIHhzX25ldCh4KSk7CisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX0FMTCwgTlVMTCwgeHNfbmV0KHgpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTU3OCw3ICsxNTk2LDcgQEAKIAlvdXRfaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7CiAJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gaGRyLT5zYWRiX21zZ19zZXE7CiAJb3V0X2hkci0+c2FkYl9tc2dfcGlkID0gaGRyLT5zYWRiX21zZ19waWQ7Ci0JcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEJST0FEQ0FTVF9PTkUsIHNrLCBzb2NrX25ldChzaykpOworCXBma2V5X2Jyb2FkY2FzdChvdXRfc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLCBzaywgc29ja19uZXQoc2spKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY4Myw4ICsxNzAxLDggQEAKIAkJcmV0dXJuIC1FTk9CVUZTOwogCX0KIAotCXBma2V5X2Jyb2FkY2FzdChzdXBwX3NrYiwgQlJPQURDQVNUX1JFR0lTVEVSRUQsIHNrLCBzb2NrX25ldChzaykpOwotCisJcGZrZXlfYnJvYWRjYXN0KHN1cHBfc2tiLCBHRlBfS0VSTkVMLCBCUk9BRENBU1RfUkVHSVNURVJFRCwgc2ssCisJCQlzb2NrX25ldChzaykpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzAyLDcgKzE3MjAsOCBAQAogCWhkci0+c2FkYl9tc2dfZXJybm8gPSAodWludDhfdCkgMDsKIAloZHItPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvIHNpemVvZih1aW50NjRfdCkpOwogCi0JcmV0dXJuIHBma2V5X2Jyb2FkY2FzdChza2IsIEJST0FEQ0FTVF9PTkUsIHNrLCBzb2NrX25ldChzaykpOworCXJldHVybiBwZmtleV9icm9hZGNhc3Qoc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLCBzaywKKwkJCSAgICAgICBzb2NrX25ldChzaykpOwogfQogCiBzdGF0aWMgaW50IGtleV9ub3RpZnlfc2FfZmx1c2goY29uc3Qgc3RydWN0IGttX2V2ZW50ICpjKQpAQCAtMTcyMyw3ICsxNzQyLDcgQEAKIAloZHItPnNhZGJfbXNnX2xlbiA9IChzaXplb2Yoc3RydWN0IHNhZGJfbXNnKSAvIHNpemVvZih1aW50NjRfdCkpOwogCWhkci0+c2FkYl9tc2dfcmVzZXJ2ZWQgPSAwOwogCi0JcGZrZXlfYnJvYWRjYXN0KHNrYiwgQlJPQURDQVNUX0FMTCwgTlVMTCwgYy0+bmV0KTsKKwlwZmtleV9icm9hZGNhc3Qoc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfQUxMLCBOVUxMLCBjLT5uZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzgwLDcgKzE3OTksNyBAQAogCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IHBmay0+ZHVtcC5tc2dfcG9ydGlkOwogCiAJaWYgKHBmay0+ZHVtcC5za2IpCi0JCXBma2V5X2Jyb2FkY2FzdChwZmstPmR1bXAuc2tiLCBCUk9BRENBU1RfT05FLAorCQlwZmtleV9icm9hZGNhc3QocGZrLT5kdW1wLnNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX09ORSwKIAkJCQkmcGZrLT5zaywgc29ja19uZXQoJnBmay0+c2spKTsKIAlwZmstPmR1bXAuc2tiID0gb3V0X3NrYjsKIApAQCAtMTgwNiwxOSArMTgyNSwyNiBAQAogCXN0cnVjdCB4ZnJtX2FkZHJlc3NfZmlsdGVyICpmaWx0ZXIgPSBOVUxMOwogCXN0cnVjdCBwZmtleV9zb2NrICpwZmsgPSBwZmtleV9zayhzayk7CiAKLQlpZiAocGZrLT5kdW1wLmR1bXAgIT0gTlVMTCkKKwltdXRleF9sb2NrKCZwZmstPmR1bXBfbG9jayk7CisJaWYgKHBmay0+ZHVtcC5kdW1wICE9IE5VTEwpIHsKKwkJbXV0ZXhfdW5sb2NrKCZwZmstPmR1bXBfbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJcHJvdG8gPSBwZmtleV9zYXR5cGUycHJvdG8oaGRyLT5zYWRiX21zZ19zYXR5cGUpOwotCWlmIChwcm90byA9PSAwKQorCWlmIChwcm90byA9PSAwKSB7CisJCW11dGV4X3VubG9jaygmcGZrLT5kdW1wX2xvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlpZiAoZXh0X2hkcnNbU0FEQl9YX0VYVF9GSUxURVIgLSAxXSkgewogCQlzdHJ1Y3Qgc2FkYl94X2ZpbHRlciAqeGZpbHRlciA9IGV4dF9oZHJzW1NBREJfWF9FWFRfRklMVEVSIC0gMV07CiAKIAkJZmlsdGVyID0ga21hbGxvYyhzaXplb2YoKmZpbHRlciksIEdGUF9LRVJORUwpOwotCQlpZiAoZmlsdGVyID09IE5VTEwpCisJCWlmIChmaWx0ZXIgPT0gTlVMTCkgeworCQkJbXV0ZXhfdW5sb2NrKCZwZmstPmR1bXBfbG9jayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCiAJCW1lbWNweSgmZmlsdGVyLT5zYWRkciwgJnhmaWx0ZXItPnNhZGJfeF9maWx0ZXJfc2FkZHIsCiAJCSAgICAgICBzaXplb2YoeGZybV9hZGRyZXNzX3QpKTsKQEAgLTE4MzQsNiArMTg2MCw3IEBACiAJcGZrLT5kdW1wLmR1bXAgPSBwZmtleV9kdW1wX3NhOwogCXBmay0+ZHVtcC5kb25lID0gcGZrZXlfZHVtcF9zYV9kb25lOwogCXhmcm1fc3RhdGVfd2Fsa19pbml0KCZwZmstPmR1bXAudS5zdGF0ZSwgcHJvdG8sIGZpbHRlcik7CisJbXV0ZXhfdW5sb2NrKCZwZmstPmR1bXBfbG9jayk7CiAKIAlyZXR1cm4gcGZrZXlfZG9fZHVtcChwZmspOwogfQpAQCAtMTg2MCw3ICsxODg3LDcgQEAKIAkJbmV3X2hkci0+c2FkYl9tc2dfZXJybm8gPSAwOwogCX0KIAotCXBma2V5X2Jyb2FkY2FzdChza2IsIEJST0FEQ0FTVF9BTEwsIE5VTEwsIHNvY2tfbmV0KHNrKSk7CisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0tFUk5FTCwgQlJPQURDQVNUX0FMTCwgTlVMTCwgc29ja19uZXQoc2spKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE5Myw3ICsyMjIwLDcgQEAKIAlvdXRfaGRyLT5zYWRiX21zZ19lcnJubyA9IDA7CiAJb3V0X2hkci0+c2FkYl9tc2dfc2VxID0gYy0+c2VxOwogCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IGMtPnBvcnRpZDsKLQlwZmtleV9icm9hZGNhc3Qob3V0X3NrYiwgQlJPQURDQVNUX0FMTCwgTlVMTCwgeHBfbmV0KHhwKSk7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9BTEwsIE5VTEwsIHhwX25ldCh4cCkpOwogCXJldHVybiAwOwogCiB9CkBAIC0yNDEzLDcgKzI0NDAsNyBAQAogCW91dF9oZHItPnNhZGJfbXNnX2Vycm5vID0gMDsKIAlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSBoZHItPnNhZGJfbXNnX3NlcTsKIAlvdXRfaGRyLT5zYWRiX21zZ19waWQgPSBoZHItPnNhZGJfbXNnX3BpZDsKLQlwZmtleV9icm9hZGNhc3Qob3V0X3NrYiwgQlJPQURDQVNUX09ORSwgc2ssIHhwX25ldCh4cCkpOworCXBma2V5X2Jyb2FkY2FzdChvdXRfc2tiLCBHRlBfQVRPTUlDLCBCUk9BRENBU1RfT05FLCBzaywgeHBfbmV0KHhwKSk7CiAJZXJyID0gMDsKIAogb3V0OgpAQCAtMjY2OSw3ICsyNjk2LDcgQEAKIAlvdXRfaGRyLT5zYWRiX21zZ19waWQgPSBwZmstPmR1bXAubXNnX3BvcnRpZDsKIAogCWlmIChwZmstPmR1bXAuc2tiKQotCQlwZmtleV9icm9hZGNhc3QocGZrLT5kdW1wLnNrYiwgQlJPQURDQVNUX09ORSwKKwkJcGZrZXlfYnJvYWRjYXN0KHBmay0+ZHVtcC5za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9PTkUsCiAJCQkJJnBmay0+c2ssIHNvY2tfbmV0KCZwZmstPnNrKSk7CiAJcGZrLT5kdW1wLnNrYiA9IG91dF9za2I7CiAKQEAgLTI2OTMsMTQgKzI3MjAsMTggQEAKIHsKIAlzdHJ1Y3QgcGZrZXlfc29jayAqcGZrID0gcGZrZXlfc2soc2spOwogCi0JaWYgKHBmay0+ZHVtcC5kdW1wICE9IE5VTEwpCisJbXV0ZXhfbG9jaygmcGZrLT5kdW1wX2xvY2spOworCWlmIChwZmstPmR1bXAuZHVtcCAhPSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmcGZrLT5kdW1wX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCXBmay0+ZHVtcC5tc2dfdmVyc2lvbiA9IGhkci0+c2FkYl9tc2dfdmVyc2lvbjsKIAlwZmstPmR1bXAubXNnX3BvcnRpZCA9IGhkci0+c2FkYl9tc2dfcGlkOwogCXBmay0+ZHVtcC5kdW1wID0gcGZrZXlfZHVtcF9zcDsKIAlwZmstPmR1bXAuZG9uZSA9IHBma2V5X2R1bXBfc3BfZG9uZTsKIAl4ZnJtX3BvbGljeV93YWxrX2luaXQoJnBmay0+ZHVtcC51LnBvbGljeSwgWEZSTV9QT0xJQ1lfVFlQRV9NQUlOKTsKKwltdXRleF91bmxvY2soJnBmay0+ZHVtcF9sb2NrKTsKIAogCXJldHVybiBwZmtleV9kb19kdW1wKHBmayk7CiB9CkBAIC0yNzIyLDcgKzI3NTMsNyBAQAogCWhkci0+c2FkYl9tc2dfc2F0eXBlID0gU0FEQl9TQVRZUEVfVU5TUEVDOwogCWhkci0+c2FkYl9tc2dfbGVuID0gKHNpemVvZihzdHJ1Y3Qgc2FkYl9tc2cpIC8gc2l6ZW9mKHVpbnQ2NF90KSk7CiAJaGRyLT5zYWRiX21zZ19yZXNlcnZlZCA9IDA7Ci0JcGZrZXlfYnJvYWRjYXN0KHNrYl9vdXQsIEJST0FEQ0FTVF9BTEwsIE5VTEwsIGMtPm5ldCk7CisJcGZrZXlfYnJvYWRjYXN0KHNrYl9vdXQsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9BTEwsIE5VTEwsIGMtPm5ldCk7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTI3ODQsNyArMjgxNSw3IEBACiAJdm9pZCAqZXh0X2hkcnNbU0FEQl9FWFRfTUFYXTsKIAlpbnQgZXJyOwogCi0JcGZrZXlfYnJvYWRjYXN0KHNrYl9jbG9uZShza2IsIEdGUF9LRVJORUwpLAorCXBma2V5X2Jyb2FkY2FzdChza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSwgR0ZQX0tFUk5FTCwKIAkJCUJST0FEQ0FTVF9QUk9NSVNDX09OTFksIE5VTEwsIHNvY2tfbmV0KHNrKSk7CiAKIAltZW1zZXQoZXh0X2hkcnMsIDAsIHNpemVvZihleHRfaGRycykpOwpAQCAtMzAwNiw3ICszMDM3LDggQEAKIAlvdXRfaGRyLT5zYWRiX21zZ19zZXEgPSAwOwogCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IDA7CiAKLQlwZmtleV9icm9hZGNhc3Qob3V0X3NrYiwgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwsIHhzX25ldCh4KSk7CisJcGZrZXlfYnJvYWRjYXN0KG91dF9za2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBOVUxMLAorCQkJeHNfbmV0KHgpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzE5Niw3ICszMjI4LDggQEAKIAkJICAgICAgIHhmcm1fY3R4LT5jdHhfbGVuKTsKIAl9CiAKLQlyZXR1cm4gcGZrZXlfYnJvYWRjYXN0KHNrYiwgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwsIHhzX25ldCh4KSk7CisJcmV0dXJuIHBma2V5X2Jyb2FkY2FzdChza2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBOVUxMLAorCQkJICAgICAgIHhzX25ldCh4KSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3kgKnBma2V5X2NvbXBpbGVfcG9saWN5KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdCwKQEAgLTMzOTQsNyArMzQyNyw4IEBACiAJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9wb3J0ID0gc3BvcnQ7CiAJbl9wb3J0LT5zYWRiX3hfbmF0X3RfcG9ydF9yZXNlcnZlZCA9IDA7CiAKLQlyZXR1cm4gcGZrZXlfYnJvYWRjYXN0KHNrYiwgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwsIHhzX25ldCh4KSk7CisJcmV0dXJuIHBma2V5X2Jyb2FkY2FzdChza2IsIEdGUF9BVE9NSUMsIEJST0FEQ0FTVF9SRUdJU1RFUkVELCBOVUxMLAorCQkJICAgICAgIHhzX25ldCh4KSk7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX0tFWV9NSUdSQVRFCkBAIC0zNTg2LDcgKzM2MjAsNyBAQAogCX0KIAogCS8qIGJyb2FkY2FzdCBtaWdyYXRlIG1lc3NhZ2UgdG8gc29ja2V0cyAqLwotCXBma2V5X2Jyb2FkY2FzdChza2IsIEJST0FEQ0FTVF9BTEwsIE5VTEwsICZpbml0X25ldCk7CisJcGZrZXlfYnJvYWRjYXN0KHNrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX0FMTCwgTlVMTCwgJmluaXRfbmV0KTsKIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2lwNi5jIGIvbmV0L2wydHAvbDJ0cF9pcDYuYwppbmRleCA3NGQwZDMzLi45NmVmZTQ3IDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2lwNi5jCisrKyBiL25ldC9sMnRwL2wydHBfaXA2LmMKQEAgLTY0LDcgKzY0LDcgQEAKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKIAlza19mb3JfZWFjaF9ib3VuZChzaywgJmwydHBfaXA2X2JpbmRfdGFibGUpIHsKLQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyID0gaW5ldDZfcmN2X3NhZGRyKHNrKTsKKwkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpza19sYWRkciA9IGluZXQ2X3Jjdl9zYWRkcihzayk7CiAJCXN0cnVjdCBsMnRwX2lwNl9zb2NrICpsMnRwID0gbDJ0cF9pcDZfc2soc2spOwogCiAJCWlmIChsMnRwID09IE5VTEwpCkBAIC03Miw3ICs3Miw3IEBACiAKIAkJaWYgKChsMnRwLT5jb25uX2lkID09IHR1bm5lbF9pZCkgJiYKIAkJICAgIG5ldF9lcShzb2NrX25ldChzayksIG5ldCkgJiYKLQkJICAgICghYWRkciB8fCBpcHY2X2FkZHJfZXF1YWwoYWRkciwgbGFkZHIpKSAmJgorCQkgICAgKCFza19sYWRkciB8fCBpcHY2X2FkZHJfYW55KHNrX2xhZGRyKSB8fCBpcHY2X2FkZHJfZXF1YWwoc2tfbGFkZHIsIGxhZGRyKSkgJiYKIAkJICAgICghc2stPnNrX2JvdW5kX2Rldl9pZiB8fCAhZGlmIHx8CiAJCSAgICAgc2stPnNrX2JvdW5kX2Rldl9pZiA9PSBkaWYpKQogCQkJZ290byBmb3VuZDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwppbmRleCAxOWI4OWIxLi5mZjJkMzJlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIHN0YXRpYyB2b2lkCiBjbGVhbl9mcm9tX2xpc3RzKHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQlwcl9kZWJ1ZygiY2xlYW5fZnJvbV9saXN0cyglcClcbiIsIGN0KTsKKwlwcl9kZWJ1ZygiY2xlYW5fZnJvbV9saXN0cyglcEspXG4iLCBjdCk7CiAJaGxpc3RfbnVsbHNfZGVsX3JjdSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmhubm9kZSk7CiAJaGxpc3RfbnVsbHNfZGVsX3JjdSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmhubm9kZSk7CiAKQEAgLTM4NCw3ICszODQsNyBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKW5mY3Q7CiAJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCi0JcHJfZGVidWcoImRlc3Ryb3lfY29ubnRyYWNrKCVwKVxuIiwgY3QpOworCXByX2RlYnVnKCJkZXN0cm95X2Nvbm50cmFjayglcEspXG4iLCBjdCk7CiAJTkZfQ1RfQVNTRVJUKGF0b21pY19yZWFkKCZuZmN0LT51c2UpID09IDApOwogCiAJaWYgKHVubGlrZWx5KG5mX2N0X2lzX3RlbXBsYXRlKGN0KSkpIHsKQEAgLTQxMyw3ICs0MTMsNyBAQAogCWlmIChjdC0+bWFzdGVyKQogCQluZl9jdF9wdXQoY3QtPm1hc3Rlcik7CiAKLQlwcl9kZWJ1ZygiZGVzdHJveV9jb25udHJhY2s6IHJldHVybmluZyBjdD0lcCB0byBzbGFiXG4iLCBjdCk7CisJcHJfZGVidWcoImRlc3Ryb3lfY29ubnRyYWNrOiByZXR1cm5pbmcgY3Q9JXBLIHRvIHNsYWJcbiIsIGN0KTsKIAluZl9jb25udHJhY2tfZnJlZShjdCk7CiB9CiAKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCSAqIGNvbmZpcm1lZCB1cy4KIAkgKi8KIAlORl9DVF9BU1NFUlQoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpOwotCXByX2RlYnVnKCJDb25maXJtaW5nIGNvbm50cmFjayAlcFxuIiwgY3QpOworCXByX2RlYnVnKCJDb25maXJtaW5nIGNvbm50cmFjayAlcEtcbiIsIGN0KTsKIAkvKiBXZSBoYXZlIHRvIGNoZWNrIHRoZSBEWUlORyBmbGFnIGFmdGVyIHVubGluayB0byBwcmV2ZW50CiAJICogYSByYWNlIGFnYWluc3QgbmZfY3RfZ2V0X25leHRfY29ycHNlKCkgcG9zc2libHkgY2FsbGVkIGZyb20KIAkgKiB1c2VyIGNvbnRleHQsIGVsc2Ugd2UgaW5zZXJ0IGFuIGFscmVhZHkgJ2RlYWQnIGhhc2gsIGJsb2NraW5nCkBAIC0xMTc3LDcgKzExNzcsNyBAQAogCQlzcGluX2xvY2soJm5mX2Nvbm50cmFja19leHBlY3RfbG9jayk7CiAJCWV4cCA9IG5mX2N0X2ZpbmRfZXhwZWN0YXRpb24obmV0LCB6b25lLCB0dXBsZSk7CiAJCWlmIChleHApIHsKLQkJCXByX2RlYnVnKCJleHBlY3RhdGlvbiBhcnJpdmVzIGN0PSVwIGV4cD0lcFxuIiwKKwkJCXByX2RlYnVnKCJleHBlY3RhdGlvbiBhcnJpdmVzIGN0PSVwSyBleHA9JXBLXG4iLAogCQkJCSBjdCwgZXhwKTsKIAkJCS8qIFdlbGNvbWUsIE1yLiBCb25kLiAgV2UndmUgYmVlbiBleHBlY3RpbmcgeW91Li4uICovCiAJCQlfX3NldF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpOwpAQCAtMTI2NiwxMyArMTI2NiwxMyBAQAogCX0gZWxzZSB7CiAJCS8qIE9uY2Ugd2UndmUgaGFkIHR3byB3YXkgY29tbXMsIGFsd2F5cyBFU1RBQkxJU0hFRC4gKi8KIAkJaWYgKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmN0LT5zdGF0dXMpKSB7Ci0JCQlwcl9kZWJ1Zygibm9ybWFsIHBhY2tldCBmb3IgJXBcbiIsIGN0KTsKKwkJCXByX2RlYnVnKCJub3JtYWwgcGFja2V0IGZvciAlcEtcbiIsIGN0KTsKIAkJCSpjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRDsKIAkJfSBlbHNlIGlmICh0ZXN0X2JpdChJUFNfRVhQRUNURURfQklULCAmY3QtPnN0YXR1cykpIHsKLQkJCXByX2RlYnVnKCJyZWxhdGVkIHBhY2tldCBmb3IgJXBcbiIsIGN0KTsKKwkJCXByX2RlYnVnKCJyZWxhdGVkIHBhY2tldCBmb3IgJXBLXG4iLCBjdCk7CiAJCQkqY3RpbmZvID0gSVBfQ1RfUkVMQVRFRDsKIAkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCJuZXcgcGFja2V0IGZvciAlcFxuIiwgY3QpOworCQkJcHJfZGVidWcoIm5ldyBwYWNrZXQgZm9yICVwS1xuIiwgY3QpOwogCQkJKmN0aW5mbyA9IElQX0NUX05FVzsKIAkJfQogCQkqc2V0X3JlcGx5ID0gMDsKQEAgLTE0MTQsNyArMTQxNCw3IEBACiAJLyogU2hvdWxkIGJlIHVuY29uZmlybWVkLCBzbyBub3QgaW4gaGFzaCB0YWJsZSB5ZXQgKi8KIAlORl9DVF9BU1NFUlQoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpOwogCi0JcHJfZGVidWcoIkFsdGVyaW5nIHJlcGx5IHR1cGxlIG9mICVwIHRvICIsIGN0KTsKKwlwcl9kZWJ1ZygiQWx0ZXJpbmcgcmVwbHkgdHVwbGUgb2YgJXBLIHRvICIsIGN0KTsKIAluZl9jdF9kdW1wX3R1cGxlKG5ld3JlcGx5KTsKIAogCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9ICpuZXdyZXBseTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKaW5kZXggMDJiY2YwMC4uMDA4Mjk5YiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmMKQEAgLTUzLDcgKzUzLDExIEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJdCA9IHJjdV9kZXJlZmVyZW5jZShuZl9jdF9leHRfdHlwZXNbaWRdKTsKLQlCVUdfT04odCA9PSBOVUxMKTsKKwlpZiAoIXQpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBOVUxMOworCX0KKwogCW9mZiA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgbmZfY3RfZXh0KSwgdC0+YWxpZ24pOwogCWxlbiA9IG9mZiArIHQtPmxlbiArIHZhcl9hbGxvY19sZW47CiAJYWxsb2Nfc2l6ZSA9IHQtPmFsbG9jX3NpemUgKyB2YXJfYWxsb2NfbGVuOwpAQCAtODgsNyArOTIsMTAgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAl0ID0gcmN1X2RlcmVmZXJlbmNlKG5mX2N0X2V4dF90eXBlc1tpZF0pOwotCUJVR19PTih0ID09IE5VTEwpOworCWlmICghdCkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJbmV3b2ZmID0gQUxJR04ob2xkLT5sZW4sIHQtPmFsaWduKTsKIAluZXdsZW4gPSBuZXdvZmYgKyB0LT5sZW4gKyB2YXJfYWxsb2NfbGVuOwpAQCAtMTc1LDYgKzE4Miw2IEBACiAJUkNVX0lOSVRfUE9JTlRFUihuZl9jdF9leHRfdHlwZXNbdHlwZS0+aWRdLCBOVUxMKTsKIAl1cGRhdGVfYWxsb2Nfc2l6ZSh0eXBlKTsKIAltdXRleF91bmxvY2soJm5mX2N0X2V4dF90eXBlX211dGV4KTsKLQlyY3VfYmFycmllcigpOyAvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkncyAqLworCXN5bmNocm9uaXplX3JjdSgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZXh0ZW5kX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDViOWM4ODQuLmRkZTY0YzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTIyNSwyMCArMjI1LDIxIEBACiAJCS50dXBsZSA9IHR1cGxlLAogCQkuem9uZSA9IHpvbmUKIAl9OwotCXN0cnVjdCByaGxpc3RfaGVhZCAqaGw7CisJc3RydWN0IHJobGlzdF9oZWFkICpobCwgKmg7CiAKIAlobCA9IHJobHRhYmxlX2xvb2t1cCgmbmZfbmF0X2J5c291cmNlX3RhYmxlLCAma2V5LAogCQkJICAgICBuZl9uYXRfYnlzb3VyY2VfcGFyYW1zKTsKLQlpZiAoIWhsKQotCQlyZXR1cm4gMDsKIAotCWN0ID0gY29udGFpbmVyX29mKGhsLCB0eXBlb2YoKmN0KSwgbmF0X2J5c291cmNlKTsKKwlyaGxfZm9yX2VhY2hfZW50cnlfcmN1KGN0LCBoLCBobCwgbmF0X2J5c291cmNlKSB7CisJCW5mX2N0X2ludmVydF90dXBsZXByKHJlc3VsdCwKKwkJCQkgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOworCQlyZXN1bHQtPmRzdCA9IHR1cGxlLT5kc3Q7CiAKLQluZl9jdF9pbnZlcnRfdHVwbGVwcihyZXN1bHQsCi0JCQkgICAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCXJlc3VsdC0+ZHN0ID0gdHVwbGUtPmRzdDsKKwkJaWYgKGluX3JhbmdlKGwzcHJvdG8sIGw0cHJvdG8sIHJlc3VsdCwgcmFuZ2UpKQorCQkJcmV0dXJuIDE7CisJfQogCi0JcmV0dXJuIGluX3JhbmdlKGwzcHJvdG8sIGw0cHJvdG8sIHJlc3VsdCwgcmFuZ2UpOworCXJldHVybiAwOwogfQogCiAvKiBGb3IgW0ZVVFVSRV0gZnJhZ21lbnRhdGlvbiBoYW5kbGluZywgd2Ugd2FudCB0aGUgbGVhc3QtdXNlZApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9xdGFndWlkLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWQuYwppbmRleCAxZmJlNGI2Li4xY2YyODc0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWQuYwpAQCAtMTU5NywxNCArMTU5Nyw2IEBACiAJaWYgKHNrKSB7CiAJCU1UX0RFQlVHKCJxdGFndWlkOiAlcC0+c2tfcHJvdG89JXUgIgogCQkJICItPnNrX3N0YXRlPSVkXG4iLCBzaywgc2stPnNrX3Byb3RvY29sLCBzay0+c2tfc3RhdGUpOwotCQkvKgotCQkgKiBXaGVuIGluIFRDUF9USU1FX1dBSVQgdGhlIHNrIGlzIG5vdCBhICJzdHJ1Y3Qgc29jayIgYnV0Ci0JCSAqICJzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrIiB3aGljaCBpcyBtaXNzaW5nIGZpZWxkcy4KLQkJICovCi0JCWlmICghc2tfZnVsbHNvY2soc2spIHx8IHNrLT5za19zdGF0ZSAgPT0gVENQX1RJTUVfV0FJVCkgewotCQkJc29ja19nZW5fcHV0KHNrKTsKLQkJCXNrID0gTlVMTDsKLQkJfQogCX0KIAlyZXR1cm4gc2s7CiB9CkBAIC0xNjk3LDEwICsxNjg5LDI1IEBACiAJCSAqLwogCQlzayA9IHF0YWd1aWRfZmluZF9zayhza2IsIHBhcik7CiAJCS8qCi0JCSAqIElmIHdlIGdvdCB0aGUgc29ja2V0IGZyb20gdGhlIGZpbmRfc2soKSwgd2Ugd2lsbCBuZWVkIHRvIHB1dAotCQkgKiBpdCBiYWNrLCBhcyBuZl90cHJveHlfZ2V0X3NvY2tfdjQoKSBnb3QgaXQuCisJCSAqIFRDUF9ORVdfU1lOX1JFQ1YgYXJlIG5vdCAic3RydWN0IHNvY2siIGJ1dCAic3RydWN0IHJlcXVlc3Rfc29jayIKKwkJICogd2hlcmUgd2UgY2FuIGdldCBhIHBvaW50ZXIgdG8gYSBmdWxsIHNvY2tldCB0byByZXRyaWV2ZSB1aWQvZ2lkLgorCQkgKiBXaGVuIGluIFRDUF9USU1FX1dBSVQsIHNrIGlzIGEgc3RydWN0IGluZXRfdGltZXdhaXRfc29jaworCQkgKiB3aGljaCBpcyBtaXNzaW5nIGZpZWxkcyBhbmQgZG9lcyBub3QgY29udGFpbiBhbnkgcmVmZXJlbmNlCisJCSAqIHRvIGEgZnVsbCBzb2NrZXQsIHNvIGp1c3QgaWdub3JlIHRoZSBzb2NrZXQuCiAJCSAqLwotCQlnb3Rfc29jayA9IHNrOworCQlpZiAoc2sgJiYgc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpIHsKKwkJCXNvY2tfZ2VuX3B1dChzayk7CisJCQlzayA9IHNrX3RvX2Z1bGxfc2soc2spOworCQl9IGVsc2UgaWYgKHNrICYmICghc2tfZnVsbHNvY2soc2spIHx8IHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKSkgeworCQkJc29ja19nZW5fcHV0KHNrKTsKKwkJCXNrID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBnb3QgdGhlIHNvY2tldCBmcm9tIHRoZSBmaW5kX3NrKCksIHdlIHdpbGwgbmVlZCB0byBwdXQKKwkJCSAqIGl0IGJhY2ssIGFzIG5mX3Rwcm94eV9nZXRfc29ja192NCgpIGdvdCBpdC4KKwkJCSAqLworCQkJZ290X3NvY2sgPSBzazsKKwkJfQogCQlpZiAoc2spCiAJCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfZm91bmRfc2tfaW5fY3QpOwogCQllbHNlCkBAIC0xNzEwLDE4ICsxNzE3LDkgQEAKIAl9CiAJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBzaz0lcCBnb3Rfc29jaz0lZCBmYW09JWQgcHJvdG89JWRcbiIsCiAJCSBwYXItPmhvb2tudW0sIHNrLCBnb3Rfc29jaywgcGFyLT5mYW1pbHksIGlweF9wcm90byhza2IsIHBhcikpOwotCWlmIChzayAhPSBOVUxMKSB7Ci0JCXNldF9za19jYWxsYmFja19sb2NrID0gdHJ1ZTsKLQkJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7Ci0JCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogc2s9JXAtPnNrX3NvY2tldD0lcC0+ZmlsZT0lcFxuIiwKLQkJCXBhci0+aG9va251bSwgc2ssIHNrLT5za19zb2NrZXQsCi0JCQlzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6ICh2b2lkICopLTFMTCk7Ci0JCWZpbHAgPSBzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6IE5VTEw7Ci0JCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogZmlscC4uLnVpZD0ldVxuIiwKLQkJCXBhci0+aG9va251bSwgZmlscCA/IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBmaWxwLT5mX2NyZWQtPmZzdWlkKSA6IC0xKTsKLQl9CiAKLQlpZiAoc2sgPT0gTlVMTCB8fCBzay0+c2tfc29ja2V0ID09IE5VTEwpIHsKKworCWlmIChzayA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIEhlcmUsIHRoZSBxdGFndWlkX2ZpbmRfc2soKSB1c2luZyBjb25uZWN0aW9uIHRyYWNraW5nCiAJCSAqIGNvdWxkbid0IGZpbmQgdGhlIG93bmVyLCBzbyBmb3Igbm93IHdlIGp1c3QgY291bnQgdGhlbQpAQCAtMTczNCw5ICsxNzMyLDcgQEAKIAkJICovCiAJCWlmICghKGluZm8tPm1hdGNoICYgWFRfUVRBR1VJRF9VSUQpKQogCQkJYWNjb3VudF9mb3JfdWlkKHNrYiwgc2ssIDAsIHBhcik7Ci0JCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogbGVhdmluZyAoc2s/c2stPnNrX3NvY2tldCk9JXBcbiIsCi0JCQlwYXItPmhvb2tudW0sCi0JCQlzayA/IHNrLT5za19zb2NrZXQgOiBOVUxMKTsKKwkJTVRfREVCVUcoInF0YWd1aWRbJWRdOiBsZWF2aW5nIChzaz1OVUxMKVxuIiwgcGFyLT5ob29rbnVtKTsKIAkJcmVzID0gKGluZm8tPm1hdGNoIF4gaW5mby0+aW52ZXJ0KSA9PSAwOwogCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2spOwogCQlnb3RvIHB1dF9zb2NrX3JldF9yZXM7CkBAIC0xNzQ0LDE2ICsxNzQwLDcgQEAKIAkJcmVzID0gZmFsc2U7CiAJCWdvdG8gcHV0X3NvY2tfcmV0X3JlczsKIAl9Ci0JZmlscCA9IHNrLT5za19zb2NrZXQtPmZpbGU7Ci0JaWYgKGZpbHAgPT0gTlVMTCkgewotCQlNVF9ERUJVRygicXRhZ3VpZFslZF06IGxlYXZpbmcgZmlscD1OVUxMXG4iLCBwYXItPmhvb2tudW0pOwotCQlhY2NvdW50X2Zvcl91aWQoc2tiLCBzaywgMCwgcGFyKTsKLQkJcmVzID0gKChpbmZvLT5tYXRjaCBeIGluZm8tPmludmVydCkgJgotCQkJKFhUX1FUQUdVSURfVUlEIHwgWFRfUVRBR1VJRF9HSUQpKSA9PSAwOwotCQlhdG9taWM2NF9pbmMoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2tfZmlsZSk7Ci0JCWdvdG8gcHV0X3NvY2tfcmV0X3JlczsKLQl9Ci0Jc29ja191aWQgPSBmaWxwLT5mX2NyZWQtPmZzdWlkOworCXNvY2tfdWlkID0gc2stPnNrX3VpZDsKIAkvKgogCSAqIFRPRE86IHVuaGFjayBob3cgdG8gZm9yY2UganVzdCBhY2NvdW50aW5nLgogCSAqIEZvciBub3cgd2Ugb25seSBkbyBpZmFjZSBzdGF0cyB3aGVuIHRoZSB1aWQtb3duZXIgaXMgbm90IHJlcXVlc3RlZApAQCAtMTc3MSw4ICsxNzU4LDggQEAKIAkJa3VpZF90IHVpZF9taW4gPSBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgaW5mby0+dWlkX21pbik7CiAJCWt1aWRfdCB1aWRfbWF4ID0gbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIGluZm8tPnVpZF9tYXgpOwogCi0JCWlmICgodWlkX2d0ZShmaWxwLT5mX2NyZWQtPmZzdWlkLCB1aWRfbWluKSAmJgotCQkgICAgIHVpZF9sdGUoZmlscC0+Zl9jcmVkLT5mc3VpZCwgdWlkX21heCkpIF4KKwkJaWYgKCh1aWRfZ3RlKHNrLT5za191aWQsIHVpZF9taW4pICYmCisJCSAgICAgdWlkX2x0ZShzay0+c2tfdWlkLCB1aWRfbWF4KSkgXgogCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9RVEFHVUlEX1VJRCkpIHsKIAkJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogbGVhdmluZyB1aWQgbm90IG1hdGNoaW5nXG4iLAogCQkJCSBwYXItPmhvb2tudW0pOwpAQCAtMTc4Myw3ICsxNzcwLDE5IEBACiAJaWYgKGluZm8tPm1hdGNoICYgWFRfUVRBR1VJRF9HSUQpIHsKIAkJa2dpZF90IGdpZF9taW4gPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgaW5mby0+Z2lkX21pbik7CiAJCWtnaWRfdCBnaWRfbWF4ID0gbWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGluZm8tPmdpZF9tYXgpOwotCisJCXNldF9za19jYWxsYmFja19sb2NrID0gdHJ1ZTsKKwkJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CisJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogc2s9JXBLLT5za19zb2NrZXQ9JXBLLT5maWxlPSVwS1xuIiwKKwkJCXBhci0+aG9va251bSwgc2ssIHNrLT5za19zb2NrZXQsCisJCQlzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6ICh2b2lkICopLTFMTCk7CisJCWZpbHAgPSBzay0+c2tfc29ja2V0ID8gc2stPnNrX3NvY2tldC0+ZmlsZSA6IE5VTEw7CisJCWlmICghZmlscCkgeworCQkJcmVzID0gKChpbmZvLT5tYXRjaCBeIGluZm8tPmludmVydCkgJiBYVF9RVEFHVUlEX0dJRCkgPT0gMDsKKwkJCWF0b21pYzY0X2luYygmcXR1X2V2ZW50cy5tYXRjaF9ub19za19naWQpOworCQkJZ290byBwdXRfc29ja19yZXRfcmVzOworCQl9CisJCU1UX0RFQlVHKCJxdGFndWlkWyVkXTogZmlscC4uLnVpZD0ldVxuIiwKKwkJCXBhci0+aG9va251bSwgZmlscCA/IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBmaWxwLT5mX2NyZWQtPmZzdWlkKSA6IC0xKTsKIAkJaWYgKChnaWRfZ3RlKGZpbHAtPmZfY3JlZC0+ZnNnaWQsIGdpZF9taW4pICYmCiAJCQkJZ2lkX2x0ZShmaWxwLT5mX2NyZWQtPmZzZ2lkLCBnaWRfbWF4KSkgXgogCQkJIShpbmZvLT5pbnZlcnQgJiBYVF9RVEFHVUlEX0dJRCkpIHsKQEAgLTE5NTUsNyArMTk1NCw3IEBACiAJCQkgICAibWF0Y2hfZm91bmRfc2tfaW5fY3Q9JWxsdSAiCiAJCQkgICAibWF0Y2hfZm91bmRfbm9fc2tfaW5fY3Q9JWxsdSAiCiAJCQkgICAibWF0Y2hfbm9fc2s9JWxsdSAiCi0JCQkgICAibWF0Y2hfbm9fc2tfZmlsZT0lbGx1XG4iLAorCQkJICAgIm1hdGNoX25vX3NrX2dpZD0lbGx1XG4iLAogCQkJICAgKHU2NClhdG9taWM2NF9yZWFkKCZxdHVfZXZlbnRzLnNvY2tldHNfdGFnZ2VkKSwKIAkJCSAgICh1NjQpYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5zb2NrZXRzX3VudGFnZ2VkKSwKIAkJCSAgICh1NjQpYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5jb3VudGVyX3NldF9jaGFuZ2VzKSwKQEAgLTE5NjcsNyArMTk2Niw3IEBACiAJCQkgICAodTY0KWF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfZm91bmRfc2tfaW5fY3QpLAogCQkJICAgKHU2NClhdG9taWM2NF9yZWFkKCZxdHVfZXZlbnRzLm1hdGNoX2ZvdW5kX25vX3NrX2luX2N0KSwKIAkJCSAgICh1NjQpYXRvbWljNjRfcmVhZCgmcXR1X2V2ZW50cy5tYXRjaF9ub19zayksCi0JCQkgICAodTY0KWF0b21pYzY0X3JlYWQoJnF0dV9ldmVudHMubWF0Y2hfbm9fc2tfZmlsZSkpOworCQkJICAgKHU2NClhdG9taWM2NF9yZWFkKCZxdHVfZXZlbnRzLm1hdGNoX25vX3NrX2dpZCkpOwogCiAJCS8qIENvdW50IHRoZSBmb2xsb3dpbmcgYXMgcGFydCBvZiB0aGUgbGFzdCBpdGVtX2luZGV4LiBObyBuZWVkCiAJCSAqIHRvIGxvY2sgdGhlIHNvY2tfdGFnX2xpc3QgaGVyZSBzaW5jZSBpdCBpcyBhbHJlYWR5IGxvY2tlZCB3aGVuCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3F0YWd1aWRfaW50ZXJuYWwuaCBiL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9pbnRlcm5hbC5oCmluZGV4IDgxNzhmYmQuLmM3MDUyNzAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9pbnRlcm5hbC5oCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcXRhZ3VpZF9pbnRlcm5hbC5oCkBAIC0yODksMTAgKzI4OSwxMCBAQAogCSAqLwogCWF0b21pYzY0X3QgbWF0Y2hfbm9fc2s7CiAJLyoKLQkgKiBUaGUgZmlsZSBwdHIgaW4gdGhlIHNrX3NvY2tldCB3YXNuJ3QgdGhlcmUuCisJICogVGhlIGZpbGUgcHRyIGluIHRoZSBza19zb2NrZXQgd2Fzbid0IHRoZXJlIGFuZCB3ZSBjb3VsZG4ndCBnZXQgR0lELgogCSAqIFRoaXMgbWlnaHQgaGFwcGVuIGZvciB0cmFmZmljIHdoaWxlIHRoZSBzb2NrZXQgaXMgYmVpbmcgY2xvc2VkLgogCSAqLwotCWF0b21pYzY0X3QgbWF0Y2hfbm9fc2tfZmlsZTsKKwlhdG9taWM2NF90IG1hdGNoX25vX3NrX2dpZDsKIH07CiAKIC8qIFRyYWNrIHRoZSBzZXQgYWN0aXZlX3NldCBmb3IgdGhlIGdpdmVuIHRhZy4gKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCmluZGV4IGE1MmZiYWYuLmVjODc0NjcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCQl0cmFuc3BhcmVudCA9IHh0X3NvY2tldF9za19pc190cmFuc3BhcmVudChzayk7CiAKIAkJaWYgKGluZm8tPmZsYWdzICYgWFRfU09DS0VUX1JFU1RPUkVTS01BUksgJiYgIXdpbGRjYXJkICYmCi0JCSAgICB0cmFuc3BhcmVudCkKKwkJICAgIHRyYW5zcGFyZW50ICYmIHNrX2Z1bGxzb2NrKHNrKSkKIAkJCXBza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKIAogCQlzb2NrX2dlbl9wdXQoc2spOwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJCQl0cmFuc3BhcmVudCA9IHh0X3NvY2tldF9za19pc190cmFuc3BhcmVudChzayk7CiAKIAkJaWYgKGluZm8tPmZsYWdzICYgWFRfU09DS0VUX1JFU1RPUkVTS01BUksgJiYgIXdpbGRjYXJkICYmCi0JCSAgICB0cmFuc3BhcmVudCkKKwkJICAgIHRyYW5zcGFyZW50ICYmIHNrX2Z1bGxzb2NrKHNrKSkKIAkJCXBza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKIAogCQlpZiAoc2sgIT0gc2tiLT5zaykKZGlmZiAtLWdpdCBhL25ldC9uZmMvaGNpL2NvcmUuYyBiL25ldC9uZmMvaGNpL2NvcmUuYwppbmRleCAyYjBmMGFjLi41YTU4ZjlmIDEwMDY0NAotLS0gYS9uZXQvbmZjL2hjaS9jb3JlLmMKKysrIGIvbmV0L25mYy9oY2kvY29yZS5jCkBAIC0yMDksNiArMjA5LDExIEBACiAJCX0KIAkJY3JlYXRlX2luZm8gPSAoc3RydWN0IGhjaV9jcmVhdGVfcGlwZV9yZXNwICopc2tiLT5kYXRhOwogCisJCWlmIChjcmVhdGVfaW5mby0+cGlwZSA+PSBORkNfSENJX01BWF9QSVBFUykgeworCQkJc3RhdHVzID0gTkZDX0hDSV9BTllfRV9OT0s7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwogCQkvKiBTYXZlIHRoZSBuZXcgY3JlYXRlZCBwaXBlIGFuZCBiaW5kIHdpdGggbG9jYWwgZ2F0ZSwKIAkJICogdGhlIGRlc2NyaXB0aW9uIGZvciBza2ItPmRhdGFbM10gaXMgZGVzdGluYXRpb24gZ2F0ZSBpZAogCQkgKiBidXQgc2luY2Ugd2UgcmVjZWl2ZWQgdGhpcyBjbWQgZnJvbSBob3N0IGNvbnRyb2xsZXIsIHdlCkBAIC0yMzIsNiArMjM3LDExIEBACiAJCX0KIAkJZGVsZXRlX2luZm8gPSAoc3RydWN0IGhjaV9kZWxldGVfcGlwZV9ub3RpICopc2tiLT5kYXRhOwogCisJCWlmIChkZWxldGVfaW5mby0+cGlwZSA+PSBORkNfSENJX01BWF9QSVBFUykgeworCQkJc3RhdHVzID0gTkZDX0hDSV9BTllfRV9OT0s7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwogCQloZGV2LT5waXBlc1tkZWxldGVfaW5mby0+cGlwZV0uZ2F0ZSA9IE5GQ19IQ0lfSU5WQUxJRF9HQVRFOwogCQloZGV2LT5waXBlc1tkZWxldGVfaW5mby0+cGlwZV0uZGVzdF9ob3N0ID0gTkZDX0hDSV9JTlZBTElEX0hPU1Q7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYyBiL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKaW5kZXggNGUwM2Y2NC4uMDVkOWY0MiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCkBAIC0xMjQwLDYgKzEyNDAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlPVlNfQ0Ioc2tiKS0+YWN0c19vcmlnbGVuID0gYWN0cy0+b3JpZ19sZW47CiAJZXJyID0gZG9fZXhlY3V0ZV9hY3Rpb25zKGRwLCBza2IsIGtleSwKIAkJCQkgYWN0cy0+YWN0aW9ucywgYWN0cy0+YWN0aW9uc19sZW4pOwogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKaW5kZXggNDgzODZiZi4uYjI4ZTQ1YiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwpAQCAtMTA4OCw4ICsxMDg4LDggQEAKIAogCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYSwgYXR0ciwgcmVtKSB7CiAJCWludCB0eXBlID0gbmxhX3R5cGUoYSk7Ci0JCWludCBtYXhsZW4gPSBvdnNfY3RfYXR0cl9sZW5zW3R5cGVdLm1heGxlbjsKLQkJaW50IG1pbmxlbiA9IG92c19jdF9hdHRyX2xlbnNbdHlwZV0ubWlubGVuOworCQlpbnQgbWF4bGVuOworCQlpbnQgbWlubGVuOwogCiAJCWlmICh0eXBlID4gT1ZTX0NUX0FUVFJfTUFYKSB7CiAJCQlPVlNfTkxFUlIobG9nLApAQCAtMTA5Nyw2ICsxMDk3LDkgQEAKIAkJCQkgIHR5cGUsIE9WU19DVF9BVFRSX01BWCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCisJCW1heGxlbiA9IG92c19jdF9hdHRyX2xlbnNbdHlwZV0ubWF4bGVuOworCQltaW5sZW4gPSBvdnNfY3RfYXR0cl9sZW5zW3R5cGVdLm1pbmxlbjsKIAkJaWYgKG5sYV9sZW4oYSkgPCBtaW5sZW4gfHwgbmxhX2xlbihhKSA+IG1heGxlbikgewogCQkJT1ZTX05MRVJSKGxvZywKIAkJCQkgICJDb25udHJhY2sgYXR0ciB0eXBlIGhhcyB1bmV4cGVjdGVkIGxlbmd0aCAodHlwZT0lZCwgbGVuZ3RoPSVkLCBleHBlY3RlZD0lZCkiLApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwppbmRleCA0ZDY3ZWE4Li40NTNmODA2IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwpAQCAtMzgzLDcgKzM4Myw3IEBACiB9CiAKIHN0YXRpYyBzaXplX3QgdXBjYWxsX21zZ19zaXplKGNvbnN0IHN0cnVjdCBkcF91cGNhbGxfaW5mbyAqdXBjYWxsX2luZm8sCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaGRybGVuKQorCQkJICAgICAgdW5zaWduZWQgaW50IGhkcmxlbiwgaW50IGFjdGlvbnNfYXR0cmxlbikKIHsKIAlzaXplX3Qgc2l6ZSA9IE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3Qgb3ZzX2hlYWRlcikpCiAJCSsgbmxhX3RvdGFsX3NpemUoaGRybGVuKSAvKiBPVlNfUEFDS0VUX0FUVFJfUEFDS0VUICovCkBAIC00MDAsNyArNDAwLDcgQEAKIAogCS8qIE9WU19QQUNLRVRfQVRUUl9BQ1RJT05TICovCiAJaWYgKHVwY2FsbF9pbmZvLT5hY3Rpb25zX2xlbikKLQkJc2l6ZSArPSBubGFfdG90YWxfc2l6ZSh1cGNhbGxfaW5mby0+YWN0aW9uc19sZW4pOworCQlzaXplICs9IG5sYV90b3RhbF9zaXplKGFjdGlvbnNfYXR0cmxlbik7CiAKIAkvKiBPVlNfUEFDS0VUX0FUVFJfTVJVICovCiAJaWYgKHVwY2FsbF9pbmZvLT5tcnUpCkBAIC00NjcsNyArNDY3LDggQEAKIAllbHNlCiAJCWhsZW4gPSBza2ItPmxlbjsKIAotCWxlbiA9IHVwY2FsbF9tc2dfc2l6ZSh1cGNhbGxfaW5mbywgaGxlbiAtIGN1dGxlbik7CisJbGVuID0gdXBjYWxsX21zZ19zaXplKHVwY2FsbF9pbmZvLCBobGVuIC0gY3V0bGVuLAorCQkJICAgICAgT1ZTX0NCKHNrYiktPmFjdHNfb3JpZ2xlbik7CiAJdXNlcl9za2IgPSBnZW5sbXNnX25ldyhsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghdXNlcl9za2IpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5oIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKaW5kZXggYWI4NWMxYy4uZTE5YWNlNCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKQEAgLTEwMCwxMiArMTAwLDE0IEBACiAgKiBAaW5wdXRfdnBvcnQ6IFRoZSBvcmlnaW5hbCB2cG9ydCBwYWNrZXQgY2FtZSBpbiBvbi4gVGhpcyB2YWx1ZSBpcyBjYWNoZWQKICAqIHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQgYnkgT1ZTLgogICogQG1ydTogVGhlIG1heGltdW0gcmVjZWl2ZWQgZnJhZ2VtZW50IHNpemU7IDAgaWYgdGhlIHBhY2tldCBpcyBub3QKKyAqIEBhY3RzX29yaWdsZW46IFRoZSBuZXRsaW5rIHNpemUgb2YgdGhlIGZsb3cgYWN0aW9ucyBhcHBsaWVkIHRvIHRoaXMgc2tiLgogICogQGN1dGxlbjogVGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBwYWNrZXQgZW5kIHRvIGJlIHJlbW92ZWQuCiAgKiBmcmFnbWVudGVkLgogICovCiBzdHJ1Y3Qgb3ZzX3NrYl9jYiB7CiAJc3RydWN0IHZwb3J0CQkqaW5wdXRfdnBvcnQ7CiAJdTE2CQkJbXJ1OworCXUxNgkJCWFjdHNfb3JpZ2xlbjsKIAl1MzIJCQljdXRsZW47CiB9OwogI2RlZmluZSBPVlNfQ0Ioc2tiKSAoKHN0cnVjdCBvdnNfc2tiX2NiICopKHNrYiktPmNiKQpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggNmE1NjNlNi4uMzViYTRiNiAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC0yMTUxLDYgKzIxNTEsNyBAQAogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlfX3UzMiB0c19zdGF0dXM7CiAJYm9vbCBpc19kcm9wX25fYWNjb3VudCA9IGZhbHNlOworCWJvb2wgZG9fdm5ldCA9IGZhbHNlOwogCiAJLyogc3RydWN0IHRwYWNrZXR7MiwzfV9oZHIgaXMgYWxpZ25lZCB0byBhIG11bHRpcGxlIG9mIFRQQUNLRVRfQUxJR05NRU5ULgogCSAqIFdlIG1heSBhZGQgbWVtYmVycyB0byB0aGVtIHVudGlsIGN1cnJlbnQgYWxpZ25lZCBzaXplIHdpdGhvdXQgZm9yY2luZwpAQCAtMjIwMSw4ICsyMjAyLDEwIEBACiAJCW5ldG9mZiA9IFRQQUNLRVRfQUxJR04ocG8tPnRwX2hkcmxlbiArCiAJCQkJICAgICAgIChtYWNsZW4gPCAxNiA/IDE2IDogbWFjbGVuKSkgKwogCQkJCSAgICAgICBwby0+dHBfcmVzZXJ2ZTsKLQkJaWYgKHBvLT5oYXNfdm5ldF9oZHIpCisJCWlmIChwby0+aGFzX3ZuZXRfaGRyKSB7CiAJCQluZXRvZmYgKz0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CisJCQlkb192bmV0ID0gdHJ1ZTsKKwkJfQogCQltYWNvZmYgPSBuZXRvZmYgLSBtYWNsZW47CiAJfQogCWlmIChwby0+dHBfdmVyc2lvbiA8PSBUUEFDS0VUX1YyKSB7CkBAIC0yMjE5LDggKzIyMjIsMTAgQEAKIAkJCQkJc2tiX3NldF9vd25lcl9yKGNvcHlfc2tiLCBzayk7CiAJCQl9CiAJCQlzbmFwbGVuID0gcG8tPnJ4X3JpbmcuZnJhbWVfc2l6ZSAtIG1hY29mZjsKLQkJCWlmICgoaW50KXNuYXBsZW4gPCAwKQorCQkJaWYgKChpbnQpc25hcGxlbiA8IDApIHsKIAkJCQlzbmFwbGVuID0gMDsKKwkJCQlkb192bmV0ID0gZmFsc2U7CisJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKHVubGlrZWx5KG1hY29mZiArIHNuYXBsZW4gPgogCQkJICAgIEdFVF9QQkRRQ19GUk9NX1JCKCZwby0+cnhfcmluZyktPm1heF9mcmFtZV9sZW4pKSB7CkBAIC0yMjMzLDYgKzIyMzgsNyBAQAogCQlpZiAodW5saWtlbHkoKGludClzbmFwbGVuIDwgMCkpIHsKIAkJCXNuYXBsZW4gPSAwOwogCQkJbWFjb2ZmID0gR0VUX1BCRFFDX0ZST01fUkIoJnBvLT5yeF9yaW5nKS0+bWF4X2ZyYW1lX2xlbjsKKwkJCWRvX3ZuZXQgPSBmYWxzZTsKIAkJfQogCX0KIAlzcGluX2xvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwpAQCAtMjI1OCw3ICsyMjY0LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCi0JaWYgKHBvLT5oYXNfdm5ldF9oZHIpIHsKKwlpZiAoZG9fdm5ldCkgewogCQlpZiAoX19wYWNrZXRfcmN2X3ZuZXQoc2tiLCBoLnJhdyArIG1hY29mZiAtCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHIpKSkgewogCQkJc3Bpbl9sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKQEAgLTM2OTgsMTQgKzM3MDQsMTkgQEAKIAogCQlpZiAob3B0bGVuICE9IHNpemVvZih2YWwpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChwby0+cnhfcmluZy5wZ192ZWMgfHwgcG8tPnR4X3JpbmcucGdfdmVjKQotCQkJcmV0dXJuIC1FQlVTWTsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIG9wdHZhbCwgc2l6ZW9mKHZhbCkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmICh2YWwgPiBJTlRfTUFYKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBvLT50cF9yZXNlcnZlID0gdmFsOwotCQlyZXR1cm4gMDsKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKHBvLT5yeF9yaW5nLnBnX3ZlYyB8fCBwby0+dHhfcmluZy5wZ192ZWMpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXBvLT50cF9yZXNlcnZlID0gdmFsOworCQkJcmV0ID0gMDsKKwkJfQorCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gcmV0OwogCX0KIAljYXNlIFBBQ0tFVF9MT1NTOgogCXsKQEAgLTQzMjIsNyArNDMzMyw3IEBACiAJCXJlZ2lzdGVyX3Byb3RfaG9vayhzayk7CiAJfQogCXNwaW5fdW5sb2NrKCZwby0+YmluZF9sb2NrKTsKLQlpZiAoY2xvc2luZyAmJiAocG8tPnRwX3ZlcnNpb24gPiBUUEFDS0VUX1YyKSkgeworCWlmIChwZ192ZWMgJiYgKHBvLT50cF92ZXJzaW9uID4gVFBBQ0tFVF9WMikpIHsKIAkJLyogQmVjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IGJsb2NrLWJhc2VkIFYzIG9uIHR4LXJpbmcgKi8KIAkJaWYgKCF0eF9yaW5nKQogCQkJcHJiX3NodXRkb3duX3JldGlyZV9ibGtfdGltZXIocG8sIHJiX3F1ZXVlKTsKZGlmZiAtLWdpdCBhL25ldC9ybW5ldF9kYXRhL3JtbmV0X2RhdGFfaGFuZGxlcnMuYyBiL25ldC9ybW5ldF9kYXRhL3JtbmV0X2RhdGFfaGFuZGxlcnMuYwppbmRleCAzNWJlNzllLi41NzY0NmVmIDEwMDY0NAotLS0gYS9uZXQvcm1uZXRfZGF0YS9ybW5ldF9kYXRhX2hhbmRsZXJzLmMKKysrIGIvbmV0L3JtbmV0X2RhdGEvcm1uZXRfZGF0YV9oYW5kbGVycy5jCkBAIC01MzcsNiArNTM3LDcgQEAKIHsKIAlpbnQgcmVxdWlyZWRfaGVhZHJvb20sIGFkZGl0aW9uYWxfaGVhZGVyX2xlbmd0aCwgY2tyZXN1bHQ7CiAJc3RydWN0IHJtbmV0X21hcF9oZWFkZXJfcyAqbWFwX2hlYWRlcjsKKwlpbnQgbm9uX2xpbmVhcl9za2I7CiAKIAlhZGRpdGlvbmFsX2hlYWRlcl9sZW5ndGggPSAwOwogCkBAIC01NjUsOSArNTY2LDExIEBACiAJCXJtbmV0X3N0YXRzX3VsX2NoZWNrc3VtKGNrcmVzdWx0KTsKIAl9CiAKKwlub25fbGluZWFyX3NrYiA9IChvcmlnX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dTTykgJiYKKwkJCSBza2JfaXNfbm9ubGluZWFyKHNrYik7CisKIAlpZiAoKCEoY29uZmlnLT5lZ3Jlc3NfZGF0YV9mb3JtYXQgJgotCSAgICBSTU5FVF9FR1JFU1NfRk9STUFUX0FHR1JFR0FUSU9OKSkgfHwKLQkgICAgKChvcmlnX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0dTTykgJiYgc2tiX2lzX25vbmxpbmVhcihza2IpKSkKKwkgICAgUk1ORVRfRUdSRVNTX0ZPUk1BVF9BR0dSRUdBVElPTikpIHx8IG5vbl9saW5lYXJfc2tiKQogCQltYXBfaGVhZGVyID0gcm1uZXRfbWFwX2FkZF9tYXBfaGVhZGVyCiAJCShza2IsIGFkZGl0aW9uYWxfaGVhZGVyX2xlbmd0aCwgUk1ORVRfTUFQX05PX1BBRF9CWVRFUyk7CiAJZWxzZQpAQCAtNTg5LDcgKzU5Miw4IEBACiAKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfTUFQKTsKIAotCWlmIChjb25maWctPmVncmVzc19kYXRhX2Zvcm1hdCAmIFJNTkVUX0VHUkVTU19GT1JNQVRfQUdHUkVHQVRJT04pIHsKKwlpZiAoKGNvbmZpZy0+ZWdyZXNzX2RhdGFfZm9ybWF0ICYgUk1ORVRfRUdSRVNTX0ZPUk1BVF9BR0dSRUdBVElPTikgJiYKKwkgICAgIW5vbl9saW5lYXJfc2tiKSB7CiAJCXJtbmV0X21hcF9hZ2dyZWdhdGUoc2tiLCBjb25maWcpOwogCQlyZXR1cm4gUk1ORVRfTUFQX0NPTlNVTUVEOwogCX0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaXB0LmMgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCmluZGV4IDM3OGMxYzkuLjUwMDMwNTEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaXB0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpAQCAtNDEsNiArNDEsNyBAQAogewogCXN0cnVjdCB4dF90Z2Noa19wYXJhbSBwYXI7CiAJc3RydWN0IHh0X3RhcmdldCAqdGFyZ2V0OworCXN0cnVjdCBpcHRfZW50cnkgZSA9IHt9OwogCWludCByZXQgPSAwOwogCiAJdGFyZ2V0ID0geHRfcmVxdWVzdF9maW5kX3RhcmdldChBRl9JTkVULCB0LT51LnVzZXIubmFtZSwKQEAgLTQ5LDggKzUwLDkgQEAKIAkJcmV0dXJuIFBUUl9FUlIodGFyZ2V0KTsKIAogCXQtPnUua2VybmVsLnRhcmdldCA9IHRhcmdldDsKKwltZW1zZXQoJnBhciwgMCwgc2l6ZW9mKHBhcikpOwogCXBhci50YWJsZSAgICAgPSB0YWJsZTsKLQlwYXIuZW50cnlpbmZvID0gTlVMTDsKKwlwYXIuZW50cnlpbmZvID0gJmU7CiAJcGFyLnRhcmdldCAgICA9IHRhcmdldDsKIAlwYXIudGFyZ2luZm8gID0gdC0+ZGF0YTsKIAlwYXIuaG9va19tYXNrID0gaG9vazsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IGRhZjY2MjQuLmE3NGQzMmUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMjc3LDkgKzI3Nyw2IEBACiB2b2lkIHFkaXNjX2hhc2hfYWRkKHN0cnVjdCBRZGlzYyAqcSkKIHsKIAlpZiAoKHEtPnBhcmVudCAhPSBUQ19IX1JPT1QpICYmICEocS0+ZmxhZ3MgJiBUQ1FfRl9JTkdSRVNTKSkgewotCQlzdHJ1Y3QgUWRpc2MgKnJvb3QgPSBxZGlzY19kZXYocSktPnFkaXNjOwotCi0JCVdBUk5fT05fT05DRShyb290ID09ICZub29wX3FkaXNjKTsKIAkJQVNTRVJUX1JUTkwoKTsKIAkJaGFzaF9hZGRfcmN1KHFkaXNjX2RldihxKS0+cWRpc2NfaGFzaCwgJnEtPmhhc2gsIHEtPmhhbmRsZSk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggYmM1ZTk5NS4uZWE4YTU2ZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC00MzQsNiArNDM0LDcgQEAKIAkJcWRpc2NfZHJvcChoZWFkLCBzY2gsIHRvX2ZyZWUpOwogCiAJCXNsb3RfcXVldWVfYWRkKHNsb3QsIHNrYik7CisJCXFkaXNjX3RyZWVfcmVkdWNlX2JhY2tsb2coc2NoLCAwLCBkZWx0YSk7CiAJCXJldHVybiBORVRfWE1JVF9DTjsKIAl9CiAKQEAgLTQ2NSw4ICs0NjYsMTAgQEAKIAkvKiBSZXR1cm4gQ29uZ2VzdGlvbiBOb3RpZmljYXRpb24gb25seSBpZiB3ZSBkcm9wcGVkIGEgcGFja2V0CiAJICogZnJvbSB0aGlzIGZsb3cuCiAJICovCi0JaWYgKHFsZW4gIT0gc2xvdC0+cWxlbikKKwlpZiAocWxlbiAhPSBzbG90LT5xbGVuKSB7CisJCXFkaXNjX3RyZWVfcmVkdWNlX2JhY2tsb2coc2NoLCAwLCBkcm9wcGVkIC0gcWRpc2NfcGt0X2xlbihza2IpKTsKIAkJcmV0dXJuIE5FVF9YTUlUX0NOOworCX0KIAogCS8qIEFzIHdlIGRyb3BwZWQgYSBwYWNrZXQsIGJldHRlciBsZXQgdXBwZXIgc3RhY2sga25vdyB0aGlzICovCiAJcWRpc2NfdHJlZV9yZWR1Y2VfYmFja2xvZyhzY2gsIDEsIGRyb3BwZWQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaXB2Ni5jIGIvbmV0L3NjdHAvaXB2Ni5jCmluZGV4IDBjMDkwNjAuLmNhNGE2M2UgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lwdjYuYworKysgYi9uZXQvc2N0cC9pcHY2LmMKQEAgLTUxMiw3ICs1MTIsOSBAQAogewogCWFkZHItPnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OwogCWFkZHItPnY2LnNpbjZfcG9ydCA9IHBvcnQ7CisJYWRkci0+djYuc2luNl9mbG93aW5mbyA9IDA7CiAJYWRkci0+djYuc2luNl9hZGRyID0gKnNhZGRyOworCWFkZHItPnY2LnNpbjZfc2NvcGVfaWQgPSAwOwogfQogCiAvKiBDb21wYXJlIGFkZHJlc3NlcyBleGFjdGx5LgpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc2N0cF9kaWFnLmMgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwppbmRleCAwNDg5NTRlLi5lOGY1NmI3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zY3RwX2RpYWcuYworKysgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwpAQCAtNzAsNyArNzAsOCBAQAogCiAJaW5mbyA9IG5sYV9kYXRhKGF0dHIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxhZGRyLCBhZGRyZXNzX2xpc3QsIGxpc3QpIHsKLQkJbWVtY3B5KGluZm8sICZsYWRkci0+YSwgYWRkcmxlbik7CisJCW1lbWNweShpbmZvLCAmbGFkZHItPmEsIHNpemVvZihsYWRkci0+YSkpOworCQltZW1zZXQoaW5mbyArIHNpemVvZihsYWRkci0+YSksIDAsIGFkZHJsZW4gLSBzaXplb2YobGFkZHItPmEpKTsKIAkJaW5mbyArPSBhZGRybGVuOwogCX0KIApAQCAtOTMsNyArOTQsOSBAQAogCWluZm8gPSBubGFfZGF0YShhdHRyKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZyb20sICZhc29jLT5wZWVyLnRyYW5zcG9ydF9hZGRyX2xpc3QsCiAJCQkgICAgdHJhbnNwb3J0cykgewotCQltZW1jcHkoaW5mbywgJmZyb20tPmlwYWRkciwgYWRkcmxlbik7CisJCW1lbWNweShpbmZvLCAmZnJvbS0+aXBhZGRyLCBzaXplb2YoZnJvbS0+aXBhZGRyKSk7CisJCW1lbXNldChpbmZvICsgc2l6ZW9mKGZyb20tPmlwYWRkciksIDAsCisJCSAgICAgICBhZGRybGVuIC0gc2l6ZW9mKGZyb20tPmlwYWRkcikpOwogCQlpbmZvICs9IGFkZHJsZW47CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDk2NDdlMzEuLjNlZjcyNTIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC00MzczLDggKzQzNzMsNyBAQAogCWluZm8tPnNjdHBpX2ljdHJsY2h1bmtzID0gYXNvYy0+c3RhdHMuaWN0cmxjaHVua3M7CiAKIAlwcmltID0gYXNvYy0+cGVlci5wcmltYXJ5X3BhdGg7Ci0JbWVtY3B5KCZpbmZvLT5zY3RwaV9wX2FkZHJlc3MsICZwcmltLT5pcGFkZHIsCi0JICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpOworCW1lbWNweSgmaW5mby0+c2N0cGlfcF9hZGRyZXNzLCAmcHJpbS0+aXBhZGRyLCBzaXplb2YocHJpbS0+aXBhZGRyKSk7CiAJaW5mby0+c2N0cGlfcF9zdGF0ZSA9IHByaW0tPnN0YXRlOwogCWluZm8tPnNjdHBpX3BfY3duZCA9IHByaW0tPmN3bmQ7CiAJaW5mby0+c2N0cGlfcF9zcnR0ID0gcHJpbS0+c3J0dDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscHF1ZXVlLmMgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCmluZGV4IDg0ZDBmZGEuLmQzY2ZiZjIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvdWxwcXVldWUuYwpAQCAtMjY1LDcgKzI2NSw4IEBACiAJCXNjdHBfdWxwcV9jbGVhcl9wZCh1bHBxKTsKIAogCWlmIChxdWV1ZSA9PSAmc2stPnNrX3JlY2VpdmVfcXVldWUgJiYgIXNwLT5kYXRhX3JlYWR5X3NpZ25hbGxlZCkgewotCQlzcC0+ZGF0YV9yZWFkeV9zaWduYWxsZWQgPSAxOworCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpCisJCQlzcC0+ZGF0YV9yZWFkeV9zaWduYWxsZWQgPSAxOwogCQlzay0+c2tfZGF0YV9yZWFkeShzayk7CiAJfQogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCBhNGJjOTgyLi4yNjZhMzBjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtNDA4LDYgKzQwOCw5IEBACiAJCWRwcmludGsoInN2Yzogc29ja2V0ICVwKGluZXQgJXApLCBidXN5PSVkXG4iLAogCQkJc3Zzaywgc2ssCiAJCQl0ZXN0X2JpdChYUFRfQlVTWSwgJnN2c2stPnNrX3hwcnQueHB0X2ZsYWdzKSk7CisKKwkJLyogUmVmZXIgdG8gc3ZjX3NldHVwX3NvY2tldCgpIGZvciBkZXRhaWxzLiAqLworCQlybWIoKTsKIAkJc3Zzay0+c2tfb2RhdGEoc2spOwogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoWFBUX0RBVEEsICZzdnNrLT5za194cHJ0LnhwdF9mbGFncykpCiAJCQlzdmNfeHBydF9lbnF1ZXVlKCZzdnNrLT5za194cHJ0KTsKQEAgLTQyNCw2ICs0MjcsOSBAQAogCWlmIChzdnNrKSB7CiAJCWRwcmludGsoInN2Yzogc29ja2V0ICVwKGluZXQgJXApLCB3cml0ZV9zcGFjZSBidXN5PSVkXG4iLAogCQkJc3Zzaywgc2ssIHRlc3RfYml0KFhQVF9CVVNZLCAmc3Zzay0+c2tfeHBydC54cHRfZmxhZ3MpKTsKKworCQkvKiBSZWZlciB0byBzdmNfc2V0dXBfc29ja2V0KCkgZm9yIGRldGFpbHMuICovCisJCXJtYigpOwogCQlzdnNrLT5za19vd3NwYWNlKHNrKTsKIAkJc3ZjX3hwcnRfZW5xdWV1ZSgmc3Zzay0+c2tfeHBydCk7CiAJfQpAQCAtNzQ4LDggKzc1NCwxMiBAQAogCWRwcmludGsoInN2Yzogc29ja2V0ICVwIFRDUCAobGlzdGVuKSBzdGF0ZSBjaGFuZ2UgJWRcbiIsCiAJCXNrLCBzay0+c2tfc3RhdGUpOwogCi0JaWYgKHN2c2spCisJaWYgKHN2c2spIHsKKwkJLyogUmVmZXIgdG8gc3ZjX3NldHVwX3NvY2tldCgpIGZvciBkZXRhaWxzLiAqLworCQlybWIoKTsKIAkJc3Zzay0+c2tfb2RhdGEoc2spOworCX0KKwogCS8qCiAJICogVGhpcyBjYWxsYmFjayBtYXkgY2FsbGVkIHR3aWNlIHdoZW4gYSBuZXcgY29ubmVjdGlvbgogCSAqIGlzIGVzdGFibGlzaGVkIGFzIGEgY2hpbGQgc29ja2V0IGluaGVyaXRzIGV2ZXJ5dGhpbmcKQEAgLTc4Miw2ICs3OTIsOCBAQAogCWlmICghc3ZzaykKIAkJcHJpbnRrKCJzdmM6IHNvY2tldCAlcDogbm8gdXNlciBkYXRhXG4iLCBzayk7CiAJZWxzZSB7CisJCS8qIFJlZmVyIHRvIHN2Y19zZXR1cF9zb2NrZXQoKSBmb3IgZGV0YWlscy4gKi8KKwkJcm1iKCk7CiAJCXN2c2stPnNrX29zdGF0ZShzayk7CiAJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKSB7CiAJCQlzZXRfYml0KFhQVF9DTE9TRSwgJnN2c2stPnNrX3hwcnQueHB0X2ZsYWdzKTsKQEAgLTEzNjgsMTIgKzEzODAsMTggQEAKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAl9CiAKLQlpbmV0LT5za191c2VyX2RhdGEgPSBzdnNrOwogCXN2c2stPnNrX3NvY2sgPSBzb2NrOwogCXN2c2stPnNrX3NrID0gaW5ldDsKIAlzdnNrLT5za19vc3RhdGUgPSBpbmV0LT5za19zdGF0ZV9jaGFuZ2U7CiAJc3Zzay0+c2tfb2RhdGEgPSBpbmV0LT5za19kYXRhX3JlYWR5OwogCXN2c2stPnNrX293c3BhY2UgPSBpbmV0LT5za193cml0ZV9zcGFjZTsKKwkvKgorCSAqIFRoaXMgYmFycmllciBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbgorCSAqIHdpdGggc3ZjX2RhdGFfcmVhZHkoKSwgc3ZjX2xpc3Rlbl9kYXRhX3JlYWR5KCkgYW5kIG90aGVycworCSAqIHdoZW4gY2FsbGluZyBjYWxsYmFja3MgYWJvdmUuCisJICovCisJd21iKCk7CisJaW5ldC0+c2tfdXNlcl9kYXRhID0gc3ZzazsKIAogCS8qIEluaXRpYWxpemUgdGhlIHNvY2tldCAqLwogCWlmIChzb2NrLT50eXBlID09IFNPQ0tfREdSQU0pCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXRsaW5rX2NvbXBhdC5jIGIvbmV0L3RpcGMvbmV0bGlua19jb21wYXQuYwppbmRleCAxZmQ0NjQ3Li5hZWRjNDc2IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uZXRsaW5rX2NvbXBhdC5jCisrKyBiL25ldC90aXBjL25ldGxpbmtfY29tcGF0LmMKQEAgLTI1OCwxMyArMjU4LDE1IEBACiAJYXJnID0gbmxtc2dfbmV3KDAsIEdGUF9LRVJORUwpOwogCWlmICghYXJnKSB7CiAJCWtmcmVlX3NrYihtc2ctPnJlcCk7CisJCW1zZy0+cmVwID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJZXJyID0gX190aXBjX25sX2NvbXBhdF9kdW1waXQoY21kLCBtc2csIGFyZyk7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CiAJCWtmcmVlX3NrYihtc2ctPnJlcCk7Ci0KKwkJbXNnLT5yZXAgPSBOVUxMOworCX0KIAlrZnJlZV9za2IoYXJnKTsKIAogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY29yZS5oIGIvbmV0L3dpcmVsZXNzL2NvcmUuaAppbmRleCBjZjcwNjNhLi5jNDBmM2RlIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY29yZS5oCisrKyBiL25ldC93aXJlbGVzcy9jb3JlLmgKQEAgLTIyMSwxMyArMjIxLDcgQEAKIAogCXVuaW9uIHsKIAkJc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcmVzcF9wYXJhbXMgY3I7Ci0JCXN0cnVjdCB7Ci0JCQljb25zdCB1OCAqcmVxX2llOwotCQkJY29uc3QgdTggKnJlc3BfaWU7Ci0JCQlzaXplX3QgcmVxX2llX2xlbjsKLQkJCXNpemVfdCByZXNwX2llX2xlbjsKLQkJCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKLQkJfSBybTsKKwkJc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyBybTsKIAkJc3RydWN0IHsKIAkJCWNvbnN0IHU4ICppZTsKIAkJCXNpemVfdCBpZV9sZW47CkBAIC0zODUsOSArMzc5LDcgQEAKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWFzb24sCiAJCQlib29sIHdleHRldik7CiB2b2lkIF9fY2ZnODAyMTFfcm9hbWVkKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MsCi0JCSAgICAgICBjb25zdCB1OCAqcmVxX2llLCBzaXplX3QgcmVxX2llX2xlbiwKLQkJICAgICAgIGNvbnN0IHU4ICpyZXNwX2llLCBzaXplX3QgcmVzcF9pZV9sZW4pOworCQkgICAgICAgc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyAqaW5mbyk7CiBpbnQgY2ZnODAyMTFfbWdkX3dleHRfY29ubmVjdChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2RiLnR4dCBiL25ldC93aXJlbGVzcy9kYi50eHQKaW5kZXggNDEzZGVmZi4uY2FkODJhNCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2RiLnR4dAorKysgYi9uZXQvd2lyZWxlc3MvZGIudHh0CkBAIC0yMjMsMTcgKzIyMywxNiBAQAogCSg1NDkwIC0gNTcxMCBAIDE2MCksICgzMCksIERGUwogCiBjb3VudHJ5IEJaOgotCSgyNDAyIC0gMjQ4MiBAIDQwKSwgKDM2KQotCSg1MTcwIC0gNTMzMCBAIDE2MCksICgyNykKLQkoNTQ5MCAtIDU3MzAgQCAxNjApLCAoMzYpCi0JKDU3MzUgLSA1ODM1IEAgODApLCAoMzYpCisJKDI0MDIgLSAyNDgyIEAgNDApLCAoMjApCisJKDUxNzAgLSA1MzMwIEAgMTYwKSwgKDIzKQorCSg1NDkwIC0gNTczMCBAIDE2MCksICgzMCkKKwkoNTczNSAtIDU4MzUgQCA4MCksICgzMCkKIAogY291bnRyeSBDQTogREZTLUZDQwogCSgyNDAyIC0gMjQ3MiBAIDQwKSwgKDMwKQogCSg1MTcwIC0gNTI1MCBAIDgwKSwgKDI0KSwgQVVUTy1CVwogCSg1MjUwIC0gNTMzMCBAIDgwKSwgKDI0KSwgREZTLCBBVVRPLUJXCi0JKDU0OTAgLSA1NTkwIEAgODApLCAoMjQpLCBERlMKLQkoNTY1MCAtIDU3MzAgQCA4MCksICgyNCksIERGUworCSg1NDkwIC0gNTczMCBAIDE2MCksICgyNCksIERGUwogCSg1NzM1IC0gNTgzNSBAIDgwKSwgKDMwKQogCSMgNjAgZ0h6IGJhbmQgY2hhbm5lbHMgMS0zCiAJKDU3MjQwIC0gNjM3MjAgQCAyMTYwKSwgKDQwKQpAQCAtNjgyLDcgKzY4MSwxMyBAQAogY291bnRyeSBJTjoKIAkoMjQwMiAtIDI0ODIgQCA0MCksICgyMCkKIAkoNTE3MCAtIDUzMzAgQCAxNjApLCAoMjMpCi0JKDU3MzUgLSA1ODM1IEAgODApLCAoMzApCisJKDU3MzUgLSA1ODM1IEAgODApLCAoMzMpCisKK2NvdW50cnkgSVE6IERGUy1FVFNJCisJKDI0MDIgLSAyNDgyIEAgNDApLCAoMjApCisJKDUxNzAgLSA1MjUwIEAgODApLCAoMjMpLCBBVVRPLUJXCisJKDUyNTAgLSA1MzMwIEAgODApLCAoMjMpLCBERlMsIEFVVE8tQlcKKwkoNTQ5MCAtIDU3MTAgQCAxNjApLCAoMzApLCBERlMKIAogY291bnRyeSBJUzogREZTLUVUU0kKIAkoMjQwMiAtIDI0ODIgQCA0MCksICgyMCkKQEAgLTczNiw3ICs3NDEsNiBAQAogCiBjb3VudHJ5IEpQOiBERlMtSlAKIAkoMjQwMiAtIDI0ODIgQCA0MCksICgyMCkKLQkoMjQ3NCAtIDI0OTQgQCAyMCksICgyMCksIE5PLU9GRE0KIAkoNTE3MCAtIDUyNTAgQCA4MCksICgyMCksIEFVVE8tQlcsIE5PLU9VVERPT1IKIAkoNTI1MCAtIDUzMzAgQCA4MCksICgyMCksIERGUywgQVVUTy1CVywgTk8tT1VURE9PUgogCSg1NDkwIC0gNTcxMCBAIDE2MCksICgyMCksIERGUwpAQCAtNzU4LDcgKzc2Miw3IEBACiBjb3VudHJ5IEtOOiBERlMtRkNDCiAJKDI0MDIgLSAyNDgyIEAgNDApLCAoMjApCiAJKDUxNzAgLSA1MjUwIEAgODApLCAoMjMpLCBBVVRPLUJXCi0JKDUyNTAgLSA1MzMwIEAgODApLCAoMjMpLCBERlMsIEFVVE8tQlcKKwkoNTI1MCAtIDUzMzAgQCA4MCksICgzMCksIERGUywgQVVUTy1CVwogCSg1NDkwIC0gNTcxMCBAIDE2MCksICgzMCksIERGUwogCSg1NzM1IC0gNTgxNSBAIDgwKSwgKDMwKQogCkBAIC0xMDA5LDcgKzEwMTMsNyBAQAogCSg1MTcwIC0gNTI1MCBAIDgwKSwgKDI0KSwgQVVUTy1CVwogCSg1MjUwIC0gNTMzMCBAIDgwKSwgKDI0KSwgREZTLCBBVVRPLUJXCiAJKDU0OTAgLSA1NjUwIEAgMTYwKSwgKDI0KSwgREZTCi0JKDU3MzUgLSA1ODE1IEAgODApLCAoMjQpCisJKDU3MzUgLSA1ODM1IEAgODApLCAoMjQpCiAJIyA2MCBnSHogYmFuZCBjaGFubmVscyAxLTMKIAkoNTcyNDAgLSA2MzcyMCBAIDIxNjApLCAoNDApCiAKQEAgLTEwODksNyArMTA5Myw3IEBACiAJKDU0OTAgLSA1NzEwIEAgMTYwKSwgKDMwKSwgREZTCiAKIGNvdW50cnkgUEE6Ci0JKDI0MDIgLSAyNDcyIEAgNDApLCAoMzApCisJKDI0MDIgLSAyNDcyIEAgNDApLCAoMzYpCiAJKDUxNzAgLSA1MjUwIEAgODApLCAoMjMpLCBBVVQwLUJXCiAJKDUyNTAgLSA1MzMwIEAgODApLCAoMzApLCBBVVRPLUJXCiAJKDU3MzUgLSA1ODM1IEAgODApLCAoMzYpCkBAIC0xMzc0LDkgKzEzNzgsOSBAQAogCiBjb3VudHJ5IFRUOgogCSgyNDAyIC0gMjQ4MiBAIDQwKSwgKDIwKQotCSg1MTcwIC0gNTMzMCBAIDE2MCksICgyNykKLQkoNTQ5MCAtIDU3MzAgQCAxNjApLCAoMzYpCi0JKDU3MzUgLSA1ODM1IEAgODApLCAoMzYpCisJKDUxNzAgLSA1MzMwIEAgMTYwKSwgKDI0KQorCSg1NDkwIC0gNTczMCBAIDE2MCksICgyNCkKKwkoNTczNSAtIDU4MzUgQCA4MCksICgzMCkKIAkjIDYwIGdIeiBiYW5kIGNoYW5uZWxzIDEtMywgRkNDCiAJKDU3MjQwIC0gNjM3MjAgQCAyMTYwKSwgKDQwKQogCkBAIC0xNDUwLDcgKzE0NTQsNyBAQAogY291bnRyeSBVWjogREZTLUVUU0kKIAkoMjQwMiAtIDI0ODIgQCA0MCksICgyMCkKIAkoNTE3MCAtIDUyNTAgQCA4MCksICgyMyksIEFVVE8tQlcKLQkoNTI1MCAtIDUzMzAgQCA4MCksICgyMCksIERGUywgQVVUTy1CVworCSg1MjUwIC0gNTMzMCBAIDgwKSwgKDIzKSwgREZTLCBBVVRPLUJXCiAKIGNvdW50cnkgVkM6IERGUy1FVFNJCiAJKDI0MDIgLSAyNDgyIEAgNDApLCAoMjApCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCBlYmQ5YTRiLi5hZGY3ZDAzIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTEzNDE1LDE0ICsxMzQxNSwxNCBAQAogfQogCiB2b2lkIG5sODAyMTFfc2VuZF9yb2FtZWQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAotCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHU4ICpic3NpZCwKLQkJCSBjb25zdCB1OCAqcmVxX2llLCBzaXplX3QgcmVxX2llX2xlbiwKLQkJCSBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApCisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSBzdHJ1Y3QgY2ZnODAyMTFfcm9hbV9pbmZvICppbmZvLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CisJY29uc3QgdTggKmJzc2lkID0gaW5mby0+YnNzID8gaW5mby0+YnNzLT5ic3NpZCA6IGluZm8tPmJzc2lkOwogCi0JbXNnID0gbmxtc2dfbmV3KDEwMCArIHJlcV9pZV9sZW4gKyByZXNwX2llX2xlbiwgZ2ZwKTsKKwltc2cgPSBubG1zZ19uZXcoMTAwICsgaW5mby0+cmVxX2llX2xlbiArIGluZm8tPnJlc3BfaWVfbGVuLCBnZnApOwogCWlmICghbXNnKQogCQlyZXR1cm47CiAKQEAgLTEzNDM1LDEwICsxMzQzNSwxNCBAQAogCWlmIChubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KSB8fAogCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBuZXRkZXYtPmlmaW5kZXgpIHx8CiAJICAgIG5sYV9wdXQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYnNzaWQpIHx8Ci0JICAgIChyZXFfaWUgJiYKLQkgICAgIG5sYV9wdXQobXNnLCBOTDgwMjExX0FUVFJfUkVRX0lFLCByZXFfaWVfbGVuLCByZXFfaWUpKSB8fAotCSAgICAocmVzcF9pZSAmJgotCSAgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9SRVNQX0lFLCByZXNwX2llX2xlbiwgcmVzcF9pZSkpKQorCSAgICAoaW5mby0+cmVxX2llICYmCisJICAgICBubGFfcHV0KG1zZywgTkw4MDIxMV9BVFRSX1JFUV9JRSwgaW5mby0+cmVxX2llX2xlbiwKKwkJICAgICBpbmZvLT5yZXFfaWUpKSB8fAorCSAgICAoaW5mby0+cmVzcF9pZSAmJgorCSAgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9SRVNQX0lFLCBpbmZvLT5yZXNwX2llX2xlbiwKKwkJICAgICBpbmZvLT5yZXNwX2llKSkgfHwKKwkgICAgKGluZm8tPmF1dGhvcml6ZWQgJiYKKwkgICAgIG5sYV9wdXRfZmxhZyhtc2csIE5MODAyMTFfQVRUUl9QT1JUX0FVVEhPUklaRUQpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlnZW5sbXNnX2VuZChtc2csIGhkcik7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCAyYTg0ZDE4Li5jOWQ0ODA1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTU5LDkgKzU5LDggQEAKIAkJCQkgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcmVzcF9wYXJhbXMgKnBhcmFtcywKIAkJCQkgZ2ZwX3QgZ2ZwKTsKIHZvaWQgbmw4MDIxMV9zZW5kX3JvYW1lZChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgY29uc3QgdTggKmJzc2lkLAotCQkJIGNvbnN0IHU4ICpyZXFfaWUsIHNpemVfdCByZXFfaWVfbGVuLAotCQkJIGNvbnN0IHU4ICpyZXNwX2llLCBzaXplX3QgcmVzcF9pZV9sZW4sIGdmcF90IGdmcCk7CisJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSBzdHJ1Y3QgY2ZnODAyMTFfcm9hbV9pbmZvICppbmZvLCBnZnBfdCBnZnApOwogdm9pZCBubDgwMjExX3NlbmRfZGlzY29ubmVjdGVkKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgcmVhc29uLAogCQkJICAgICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgYm9vbCBmcm9tX2FwKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zbWUuYyBiL25ldC93aXJlbGVzcy9zbWUuYwppbmRleCBkN2U2YWJjLi5iYjdmNWJlIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NtZS5jCkBAIC01LDYgKzUsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA5CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDE3CUludGVsIERldXRzY2hsYW5kIEdtYkgKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTg5Myw5ICs4OTQsNyBAQAogCiAvKiBDb25zdW1lcyBic3Mgb2JqZWN0IG9uZSB3YXkgb3IgYW5vdGhlciAqLwogdm9pZCBfX2NmZzgwMjExX3JvYW1lZChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAotCQkgICAgICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzLAotCQkgICAgICAgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCi0JCSAgICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuKQorCQkgICAgICAgc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyAqaW5mbykKIHsKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKQEAgLTkxMyw5NyArOTEyLDg1IEBACiAJY2ZnODAyMTFfcHV0X2Jzcyh3ZGV2LT53aXBoeSwgJndkZXYtPmN1cnJlbnRfYnNzLT5wdWIpOwogCXdkZXYtPmN1cnJlbnRfYnNzID0gTlVMTDsKIAotCWNmZzgwMjExX2hvbGRfYnNzKGJzc19mcm9tX3B1Yihic3MpKTsKLQl3ZGV2LT5jdXJyZW50X2JzcyA9IGJzc19mcm9tX3B1Yihic3MpOworCWlmIChXQVJOX09OKCFpbmZvLT5ic3MpKQorCQlyZXR1cm47CisKKwljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIoaW5mby0+YnNzKSk7CisJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoaW5mby0+YnNzKTsKIAogCW5sODAyMTFfc2VuZF9yb2FtZWQod2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSksCi0JCQkgICAgd2Rldi0+bmV0ZGV2LCBic3MtPmJzc2lkLAotCQkJICAgIHJlcV9pZSwgcmVxX2llX2xlbiwgcmVzcF9pZSwgcmVzcF9pZV9sZW4sCi0JCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkgICAgd2Rldi0+bmV0ZGV2LCBpbmZvLCBHRlBfS0VSTkVMKTsKIAogI2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUCi0JaWYgKHJlcV9pZSkgeworCWlmIChpbmZvLT5yZXFfaWUpIHsKIAkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCQl3cnF1LmRhdGEubGVuZ3RoID0gcmVxX2llX2xlbjsKKwkJd3JxdS5kYXRhLmxlbmd0aCA9IGluZm8tPnJlcV9pZV9sZW47CiAJCXdpcmVsZXNzX3NlbmRfZXZlbnQod2Rldi0+bmV0ZGV2LCBJV0VWQVNTT0NSRVFJRSwKLQkJCQkgICAgJndycXUsIHJlcV9pZSk7CisJCQkJICAgICZ3cnF1LCBpbmZvLT5yZXFfaWUpOwogCX0KIAotCWlmIChyZXNwX2llKSB7CisJaWYgKGluZm8tPnJlc3BfaWUpIHsKIAkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCQl3cnF1LmRhdGEubGVuZ3RoID0gcmVzcF9pZV9sZW47CisJCXdycXUuZGF0YS5sZW5ndGggPSBpbmZvLT5yZXNwX2llX2xlbjsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudCh3ZGV2LT5uZXRkZXYsIElXRVZBU1NPQ1JFU1BJRSwKLQkJCQkgICAgJndycXUsIHJlc3BfaWUpOworCQkJCSAgICAmd3JxdSwgaW5mby0+cmVzcF9pZSk7CiAJfQogCiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwogCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHdkZXYtPndleHQucHJldl9ic3NpZCwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgaW5mby0+YnNzLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweSh3ZGV2LT53ZXh0LnByZXZfYnNzaWQsIGluZm8tPmJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKIAl3ZGV2LT53ZXh0LnByZXZfYnNzaWRfdmFsaWQgPSB0cnVlOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQod2Rldi0+bmV0ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKICNlbmRpZgogCiAJcmV0dXJuOwogb3V0OgotCWNmZzgwMjExX3B1dF9ic3Mod2Rldi0+d2lwaHksIGJzcyk7CisJY2ZnODAyMTFfcHV0X2Jzcyh3ZGV2LT53aXBoeSwgaW5mby0+YnNzKTsKIH0KIAotdm9pZCBjZmc4MDIxMV9yb2FtZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCi0JCSAgICAgY29uc3QgdTggKmJzc2lkLAotCQkgICAgIGNvbnN0IHU4ICpyZXFfaWUsIHNpemVfdCByZXFfaWVfbGVuLAotCQkgICAgIGNvbnN0IHU4ICpyZXNwX2llLCBzaXplX3QgcmVzcF9pZV9sZW4sIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwotCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKLQotCWJzcyA9IGNmZzgwMjExX2dldF9ic3Mod2Rldi0+d2lwaHksIGNoYW5uZWwsIGJzc2lkLCB3ZGV2LT5zc2lkLAotCQkJICAgICAgIHdkZXYtPnNzaWRfbGVuLAotCQkJICAgICAgIHdkZXYtPmNvbm5fYnNzX3R5cGUsIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7Ci0JaWYgKFdBUk5fT04oIWJzcykpCi0JCXJldHVybjsKLQotCWNmZzgwMjExX3JvYW1lZF9ic3MoZGV2LCBic3MsIHJlcV9pZSwgcmVxX2llX2xlbiwgcmVzcF9pZSwKLQkJCSAgICByZXNwX2llX2xlbiwgZ2ZwKTsKLX0KLUVYUE9SVF9TWU1CT0woY2ZnODAyMTFfcm9hbWVkKTsKLQotLyogQ29uc3VtZXMgYnNzIG9iamVjdCBvbmUgd2F5IG9yIGFub3RoZXIgKi8KLXZvaWQgY2ZnODAyMTFfcm9hbWVkX2JzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcywgY29uc3QgdTggKnJlcV9pZSwKLQkJCSBzaXplX3QgcmVxX2llX2xlbiwgY29uc3QgdTggKnJlc3BfaWUsCi0JCQkgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApCisvKiBDb25zdW1lcyBpbmZvLT5ic3Mgb2JqZWN0IG9uZSB3YXkgb3IgYW5vdGhlciAqLwordm9pZCBjZmc4MDIxMV9yb2FtZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNmZzgwMjExX3JvYW1faW5mbyAqaW5mbywKKwkJICAgICBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfZXZlbnQgKmV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoV0FSTl9PTighYnNzKSkKKwlpZiAoIWluZm8tPmJzcykgeworCQlpbmZvLT5ic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCBpbmZvLT5jaGFubmVsLAorCQkJCQkgICAgIGluZm8tPmJzc2lkLCB3ZGV2LT5zc2lkLAorCQkJCQkgICAgIHdkZXYtPnNzaWRfbGVuLAorCQkJCQkgICAgIHdkZXYtPmNvbm5fYnNzX3R5cGUsCisJCQkJCSAgICAgSUVFRTgwMjExX1BSSVZBQ1lfQU5ZKTsKKwl9CisKKwlpZiAoV0FSTl9PTighaW5mby0+YnNzKSkKIAkJcmV0dXJuOwogCi0JZXYgPSBremFsbG9jKHNpemVvZigqZXYpICsgcmVxX2llX2xlbiArIHJlc3BfaWVfbGVuLCBnZnApOworCWV2ID0ga3phbGxvYyhzaXplb2YoKmV2KSArIGluZm8tPnJlcV9pZV9sZW4gKyBpbmZvLT5yZXNwX2llX2xlbiwgZ2ZwKTsKIAlpZiAoIWV2KSB7Ci0JCWNmZzgwMjExX3B1dF9ic3Mod2Rldi0+d2lwaHksIGJzcyk7CisJCWNmZzgwMjExX3B1dF9ic3Mod2Rldi0+d2lwaHksIGluZm8tPmJzcyk7CiAJCXJldHVybjsKIAl9CiAKIAlldi0+dHlwZSA9IEVWRU5UX1JPQU1FRDsKIAlldi0+cm0ucmVxX2llID0gKCh1OCAqKWV2KSArIHNpemVvZigqZXYpOwotCWV2LT5ybS5yZXFfaWVfbGVuID0gcmVxX2llX2xlbjsKLQltZW1jcHkoKHZvaWQgKilldi0+cm0ucmVxX2llLCByZXFfaWUsIHJlcV9pZV9sZW4pOwotCWV2LT5ybS5yZXNwX2llID0gKCh1OCAqKWV2KSArIHNpemVvZigqZXYpICsgcmVxX2llX2xlbjsKLQlldi0+cm0ucmVzcF9pZV9sZW4gPSByZXNwX2llX2xlbjsKLQltZW1jcHkoKHZvaWQgKilldi0+cm0ucmVzcF9pZSwgcmVzcF9pZSwgcmVzcF9pZV9sZW4pOwotCWV2LT5ybS5ic3MgPSBic3M7CisJZXYtPnJtLnJlcV9pZV9sZW4gPSBpbmZvLT5yZXFfaWVfbGVuOworCW1lbWNweSgodm9pZCAqKWV2LT5ybS5yZXFfaWUsIGluZm8tPnJlcV9pZSwgaW5mby0+cmVxX2llX2xlbik7CisJZXYtPnJtLnJlc3BfaWUgPSAoKHU4ICopZXYpICsgc2l6ZW9mKCpldikgKyBpbmZvLT5yZXFfaWVfbGVuOworCWV2LT5ybS5yZXNwX2llX2xlbiA9IGluZm8tPnJlc3BfaWVfbGVuOworCW1lbWNweSgodm9pZCAqKWV2LT5ybS5yZXNwX2llLCBpbmZvLT5yZXNwX2llLCBpbmZvLT5yZXNwX2llX2xlbik7CisJZXYtPnJtLmJzcyA9IGluZm8tPmJzczsKKwlldi0+cm0uYXV0aG9yaXplZCA9IGluZm8tPmF1dGhvcml6ZWQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2Rldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJmV2LT5saXN0LCAmd2Rldi0+ZXZlbnRfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2Rldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCXF1ZXVlX3dvcmsoY2ZnODAyMTFfd3EsICZyZGV2LT5ldmVudF93b3JrKTsKIH0KLUVYUE9SVF9TWU1CT0woY2ZnODAyMTFfcm9hbWVkX2Jzcyk7CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3JvYW1lZCk7CiAKIHZvaWQgX19jZmc4MDIxMV9kaXNjb25uZWN0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmllLAogCQkJICAgICBzaXplX3QgaWVfbGVuLCB1MTYgcmVhc29uLCBib29sIGZyb21fYXApCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCA4YWM0MTNmLi5hNGFiMjBhIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTk1Myw5ICs5NTMsNyBAQAogCQkJCWV2LT5jci5zdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CiAJCQlicmVhazsKIAkJY2FzZSBFVkVOVF9ST0FNRUQ6Ci0JCQlfX2NmZzgwMjExX3JvYW1lZCh3ZGV2LCBldi0+cm0uYnNzLCBldi0+cm0ucmVxX2llLAotCQkJCQkgIGV2LT5ybS5yZXFfaWVfbGVuLCBldi0+cm0ucmVzcF9pZSwKLQkJCQkJICBldi0+cm0ucmVzcF9pZV9sZW4pOworCQkJX19jZmc4MDIxMV9yb2FtZWQod2RldiwgJmV2LT5ybSk7CiAJCQlicmVhazsKIAkJY2FzZSBFVkVOVF9ESVNDT05ORUNURUQ6CiAJCQlfX2NmZzgwMjExX2Rpc2Nvbm5lY3RlZCh3ZGV2LT5uZXRkZXYsCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCA4ZGE2N2Y3Li44Y2U1NzExIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTEyNDgsNyArMTI0OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3kgKnhmcm1fc2tfcG9saWN5X2xvb2t1cChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGludCBkaXIsCi0JCQkJCQkgY29uc3Qgc3RydWN0IGZsb3dpICpmbCkKKwkJCQkJCSBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLCB1MTYgZmFtaWx5KQogewogCXN0cnVjdCB4ZnJtX3BvbGljeSAqcG9sOwogCkBAIC0xMjU2LDggKzEyNTYsNyBAQAogIGFnYWluOgogCXBvbCA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfcG9saWN5W2Rpcl0pOwogCWlmIChwb2wgIT0gTlVMTCkgewotCQlib29sIG1hdGNoID0geGZybV9zZWxlY3Rvcl9tYXRjaCgmcG9sLT5zZWxlY3RvciwgZmwsCi0JCQkJCQkgc2stPnNrX2ZhbWlseSk7CisJCWJvb2wgbWF0Y2ggPSB4ZnJtX3NlbGVjdG9yX21hdGNoKCZwb2wtPnNlbGVjdG9yLCBmbCwgZmFtaWx5KTsKIAkJaW50IGVyciA9IDA7CiAKIAkJaWYgKG1hdGNoKSB7CkBAIC0yMjA2LDcgKzIyMDUsNyBAQAogCXNrID0gc2tfY29uc3RfdG9fZnVsbF9zayhzayk7CiAJaWYgKHNrICYmIHNrLT5za19wb2xpY3lbWEZSTV9QT0xJQ1lfT1VUXSkgewogCQludW1fcG9scyA9IDE7Ci0JCXBvbHNbMF0gPSB4ZnJtX3NrX3BvbGljeV9sb29rdXAoc2ssIFhGUk1fUE9MSUNZX09VVCwgZmwpOworCQlwb2xzWzBdID0geGZybV9za19wb2xpY3lfbG9va3VwKHNrLCBYRlJNX1BPTElDWV9PVVQsIGZsLCBmYW1pbHkpOwogCQllcnIgPSB4ZnJtX2V4cGFuZF9wb2xpY2llcyhmbCwgZmFtaWx5LCBwb2xzLAogCQkJCQkgICAmbnVtX3BvbHMsICZudW1feGZybXMpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTI0ODUsNyArMjQ4NCw3IEBACiAJcG9sID0gTlVMTDsKIAlzayA9IHNrX3RvX2Z1bGxfc2soc2spOwogCWlmIChzayAmJiBzay0+c2tfcG9saWN5W2Rpcl0pIHsKLQkJcG9sID0geGZybV9za19wb2xpY3lfbG9va3VwKHNrLCBkaXIsICZmbCk7CisJCXBvbCA9IHhmcm1fc2tfcG9saWN5X2xvb2t1cChzaywgZGlyLCAmZmwsIGZhbWlseSk7CiAJCWlmIChJU19FUlIocG9sKSkgewogCQkJWEZSTV9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfWEZSTUlOUE9MRVJST1IpOwogCQkJcmV0dXJuIDA7CkBAIC0zMzA5LDkgKzMzMDgsMTUgQEAKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeF9uZXdbWEZSTV9NQVhfREVQVEhdOwogCXN0cnVjdCB4ZnJtX21pZ3JhdGUgKm1wOwogCisJLyogU3RhZ2UgMCAtIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoKGVyciA9IHhmcm1fbWlncmF0ZV9jaGVjayhtLCBudW1fbWlncmF0ZSkpIDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoZGlyID49IFhGUk1fUE9MSUNZX01BWCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBTdGFnZSAxIC0gZmluZCBwb2xpY3kgKi8KIAlpZiAoKHBvbCA9IHhmcm1fbWlncmF0ZV9wb2xpY3lfZmluZChzZWwsIGRpciwgdHlwZSwgbmV0KSkgPT0gTlVMTCkgewogCQllcnIgPSAtRU5PRU5UOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV91c2VyLmMgYi9uZXQveGZybS94ZnJtX3VzZXIuYwppbmRleCBhN2UyN2UxLi5iMmJiYTM1IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3VzZXIuYworKysgYi9uZXQveGZybS94ZnJtX3VzZXIuYwpAQCAtMTY5NSw2ICsxNjk1LDEwIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyOwogCisJZXJyID0gdmVyaWZ5X3BvbGljeV9kaXIoZGlyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCiAJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwpAQCAtMjIxNiw2ICsyMjIwLDEwIEBACiAJaW50IG4gPSAwOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCisJZXJyID0gdmVyaWZ5X3BvbGljeV9kaXIocGktPmRpcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWlmIChhdHRyc1tYRlJNQV9NSUdSQVRFXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjMzMSw2ICsyMzM5LDExIEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gJmluaXRfbmV0OwogCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGVycjsKKworCWVyciA9IHZlcmlmeV9wb2xpY3lfZGlyKGRpcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXNrYiA9IG5sbXNnX25ldyh4ZnJtX21pZ3JhdGVfbXNnc2l6ZShudW1fbWlncmF0ZSwgISFrKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNrYiA9PSBOVUxMKQpAQCAtMjk4NSw2ICsyOTk4LDExIEBACiAKIHN0YXRpYyBpbnQgeGZybV9zZW5kX3BvbGljeV9ub3RpZnkoc3RydWN0IHhmcm1fcG9saWN5ICp4cCwgaW50IGRpciwgY29uc3Qgc3RydWN0IGttX2V2ZW50ICpjKQogeworCWludCBlcnI7CisKKwllcnIgPSB2ZXJpZnlfcG9saWN5X2RpcihkaXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlzd2l0Y2ggKGMtPmV2ZW50KSB7CiAJY2FzZSBYRlJNX01TR19ORVdQT0xJQ1k6CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmR0Ym8gYi9zY3JpcHRzL01ha2VmaWxlLmR0Ym8KaW5kZXggZGI0YTBmNC4uYjI5OGY0YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5kdGJvCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuZHRibwpAQCAtMTAsNyArMTAsNyBAQAogaWZuZXEgKCQoRFRDX09WRVJMQVlfVEVTVF9FWFQpLCkKIERUQ19PVkVSTEFZX1RFU1QgPSAkKERUQ19PVkVSTEFZX1RFU1RfRVhUKQogcXVpZXRfY21kX2R0Ym9fdmVyaWZ5CT0gVkVSSUZZICAkQAotY21kX2R0Ym9fdmVyaWZ5ID0gJChEVENfT1ZFUkxBWV9URVNUKSAkKGFkZHByZWZpeCAkKG9iaikvLCQoJChARiktYmFzZSkpICRAICQoZG90LXRhcmdldCkuZHRiCitjbWRfZHRib192ZXJpZnkgPSAkKERUQ19PVkVSTEFZX1RFU1QpICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGKS1iYXNlKSkgJEAgJChkb3QtdGFyZ2V0KS50bXAKIGVsc2UKIGNtZF9kdGJvX3ZlcmlmeSA9IHRydWUKIGVuZGlmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9jb21tb25jYXAuYyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCmluZGV4IDNlNDRkMDEuLmI1YWNhNDIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jCisrKyBiL3NlY3VyaXR5L2NvbW1vbmNhcC5jCkBAIC01OCw3ICs1OCw3IEBACiB9CiAKIC8qKgotICogY2FwX2NhcGFibGUgLSBEZXRlcm1pbmUgd2hldGhlciBhIHRhc2sgaGFzIGEgcGFydGljdWxhciBlZmZlY3RpdmUgY2FwYWJpbGl0eQorICogX19jYXBfY2FwYWJsZSAtIERldGVybWluZSB3aGV0aGVyIGEgdGFzayBoYXMgYSBwYXJ0aWN1bGFyIGVmZmVjdGl2ZSBjYXBhYmlsaXR5CiAgKiBAY3JlZDogVGhlIGNyZWRlbnRpYWxzIHRvIHVzZQogICogQG5zOiAgVGhlIHVzZXIgbmFtZXNwYWNlIGluIHdoaWNoIHdlIG5lZWQgdGhlIGNhcGFiaWxpdHkKICAqIEBjYXA6IFRoZSBjYXBhYmlsaXR5IHRvIGNoZWNrIGZvcgpAQCAtNzIsMTggKzcyLDExIEBACiAgKiBjYXBfaGFzX2NhcGFiaWxpdHkoKSByZXR1cm5zIDAgd2hlbiBhIHRhc2sgaGFzIGEgY2FwYWJpbGl0eSwgYnV0IHRoZQogICoga2VybmVsJ3MgY2FwYWJsZSgpIGFuZCBoYXNfY2FwYWJpbGl0eSgpIHJldHVybnMgMSBmb3IgdGhpcyBjYXNlLgogICovCi1pbnQgY2FwX2NhcGFibGUoY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdGFyZ19ucywKK2ludCBfX2NhcF9jYXBhYmxlKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRhcmdfbnMsCiAJCWludCBjYXAsIGludCBhdWRpdCkKIHsKIAlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zID0gdGFyZ19uczsKIAotI2lmZGVmIENPTkZJR19BTkRST0lEX1BBUkFOT0lEX05FVFdPUksKLQlpZiAoY2FwID09IENBUF9ORVRfUkFXICYmIGluX2Vncm91cF9wKEFJRF9ORVRfUkFXKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNhcCA9PSBDQVBfTkVUX0FETUlOICYmIGluX2Vncm91cF9wKEFJRF9ORVRfQURNSU4pKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCiAJLyogU2VlIGlmIGNyZWQgaGFzIHRoZSBjYXBhYmlsaXR5IGluIHRoZSB0YXJnZXQgdXNlciBuYW1lc3BhY2UKIAkgKiBieSBleGFtaW5pbmcgdGhlIHRhcmdldCB1c2VyIG5hbWVzcGFjZSBhbmQgYWxsIG9mIHRoZSB0YXJnZXQKIAkgKiB1c2VyIG5hbWVzcGFjZSdzIHBhcmVudHMuCkBAIC0xMTQsNiArMTA3LDI3IEBACiAJLyogV2UgbmV2ZXIgZ2V0IGhlcmUgKi8KIH0KIAoraW50IGNhcF9jYXBhYmxlKGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRhcmdfbnMsCisJCWludCBjYXAsIGludCBhdWRpdCkKK3sKKwlpbnQgcmV0ID0gX19jYXBfY2FwYWJsZShjcmVkLCB0YXJnX25zLCBjYXAsIGF1ZGl0KTsKKworI2lmZGVmIENPTkZJR19BTkRST0lEX1BBUkFOT0lEX05FVFdPUksKKwlpZiAocmV0ICE9IDAgJiYgY2FwID09IENBUF9ORVRfUkFXICYmIGluX2Vncm91cF9wKEFJRF9ORVRfUkFXKSkgeworCQlwcmludGsoIlByb2Nlc3MgJXMgZ3JhbnRlZCBDQVBfTkVUX1JBVyBmcm9tIEFuZHJvaWQgZ3JvdXAgbmV0X3Jhdy5cbiIsIGN1cnJlbnQtPmNvbW0pOworCQlwcmludGsoIiAgUGxlYXNlIHVwZGF0ZSB0aGUgLnJjIGZpbGUgdG8gZXhwbGljdGx5IHNldCAnY2FwYWJpbGl0aWVzIE5FVF9SQVcnXG4iKTsKKwkJcHJpbnRrKCIgIEltcGxpY2l0IGdyYW50cyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyZXQgIT0gMCAmJiBjYXAgPT0gQ0FQX05FVF9BRE1JTiAmJiBpbl9lZ3JvdXBfcChBSURfTkVUX0FETUlOKSkgeworCQlwcmludGsoIlByb2Nlc3MgJXMgZ3JhbnRlZCBDQVBfTkVUX0FETUlOIGZyb20gQW5kcm9pZCBncm91cCBuZXRfYWRtaW4uXG4iLCBjdXJyZW50LT5jb21tKTsKKwkJcHJpbnRrKCIgIFBsZWFzZSB1cGRhdGUgdGhlIC5yYyBmaWxlIHRvIGV4cGxpY3RseSBzZXQgJ2NhcGFiaWxpdGllcyBORVRfQURNSU4nXG4iKTsKKwkJcHJpbnRrKCIgIEltcGxpY2l0IGdyYW50cyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KIC8qKgogICogY2FwX3NldHRpbWUgLSBEZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCBwcm9jZXNzIG1heSBzZXQgdGhlIHN5c3RlbSBjbG9jawogICogQHRzOiBUaGUgdGltZSB0byBzZXQKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29udHJvbC5jIGIvc291bmQvY29yZS9jb250cm9sLmMKaW5kZXggZmIwOTZjYi4uOTk1Y2RlNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTExNTYsNyArMTE1Niw3IEBACiAJCW11dGV4X2xvY2soJnVlLT5jYXJkLT51c2VyX2N0bF9sb2NrKTsKIAkJY2hhbmdlID0gdWUtPnRsdl9kYXRhX3NpemUgIT0gc2l6ZTsKIAkJaWYgKCFjaGFuZ2UpCi0JCQljaGFuZ2UgPSBtZW1jbXAodWUtPnRsdl9kYXRhLCBuZXdfZGF0YSwgc2l6ZSk7CisJCQljaGFuZ2UgPSBtZW1jbXAodWUtPnRsdl9kYXRhLCBuZXdfZGF0YSwgc2l6ZSkgIT0gMDsKIAkJa2ZyZWUodWUtPnRsdl9kYXRhKTsKIAkJdWUtPnRsdl9kYXRhID0gbmV3X2RhdGE7CiAJCXVlLT50bHZfZGF0YV9zaXplID0gc2l6ZTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggMmZmYTNmYS4uMDg1NThhZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTczNSw4ICs3MzUsMTEgQEAKIAlJTklUX0xJU1RfSEVBRCgmZW50cnktPmNoaWxkcmVuKTsKIAlJTklUX0xJU1RfSEVBRCgmZW50cnktPmxpc3QpOwogCWVudHJ5LT5wYXJlbnQgPSBwYXJlbnQ7Ci0JaWYgKHBhcmVudCkKKwlpZiAocGFyZW50KSB7CisJCW11dGV4X2xvY2soJnBhcmVudC0+YWNjZXNzKTsKIAkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZwYXJlbnQtPmNoaWxkcmVuKTsKKwkJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmFjY2Vzcyk7CisJfQogCXJldHVybiBlbnRyeTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCmluZGV4IGYzYjFkN2YuLjY3YzRjNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKQEAgLTE1MDIsMTYgKzE1MDIsMTEgQEAKIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jcmVhdGVfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwotCWludCByZXN1bHQ7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKLQlyZXN1bHQgPSBzbmRfc2VxX3F1ZXVlX2FsbG9jKGNsaWVudC0+bnVtYmVyLCBpbmZvLT5sb2NrZWQsIGluZm8tPmZsYWdzKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCXEgPSBxdWV1ZXB0cihyZXN1bHQpOwotCWlmIChxID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOworCXEgPSBzbmRfc2VxX3F1ZXVlX2FsbG9jKGNsaWVudC0+bnVtYmVyLCBpbmZvLT5sb2NrZWQsIGluZm8tPmZsYWdzKTsKKwlpZiAoSVNfRVJSKHEpKQorCQlyZXR1cm4gUFRSX0VSUihxKTsKIAogCWluZm8tPnF1ZXVlID0gcS0+cXVldWU7CiAJaW5mby0+bG9ja2VkID0gcS0+bG9ja2VkOwpAQCAtMTUyMSw3ICsxNTE2LDcgQEAKIAlpZiAoIWluZm8tPm5hbWVbMF0pCiAJCXNucHJpbnRmKGluZm8tPm5hbWUsIHNpemVvZihpbmZvLT5uYW1lKSwgIlF1ZXVlLSVkIiwgcS0+cXVldWUpOwogCXN0cmxjcHkocS0+bmFtZSwgaW5mby0+bmFtZSwgc2l6ZW9mKHEtPm5hbWUpKTsKLQlxdWV1ZWZyZWUocSk7CisJc25kX3VzZV9sb2NrX2ZyZWUoJnEtPnVzZV9sb2NrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYwppbmRleCA0NTBjNTE4Li43OWUwYzU2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYwpAQCAtMTg0LDIyICsxODQsMjYgQEAKIHN0YXRpYyB2b2lkIHF1ZXVlX3VzZShzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcXVldWUsIGludCBjbGllbnQsIGludCB1c2UpOwogCiAvKiBhbGxvY2F0ZSBhIG5ldyBxdWV1ZSAtCi0gKiByZXR1cm4gcXVldWUgaW5kZXggdmFsdWUgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGVycm9yCisgKiByZXR1cm4gcG9pbnRlciB0byBuZXcgcXVldWUgb3IgRVJSX1BUUigtZXJybm8pIGZvciBlcnJvcgorICogVGhlIG5ldyBxdWV1ZSdzIHVzZV9sb2NrIGlzIHNldCB0byAxLiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8KKyAqIGNhbGwgc25kX3VzZV9sb2NrX2ZyZWUoJnEtPnVzZV9sb2NrKS4KICAqLwotaW50IHNuZF9zZXFfcXVldWVfYWxsb2MoaW50IGNsaWVudCwgaW50IGxvY2tlZCwgdW5zaWduZWQgaW50IGluZm9fZmxhZ3MpCitzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqc25kX3NlcV9xdWV1ZV9hbGxvYyhpbnQgY2xpZW50LCBpbnQgbG9ja2VkLCB1bnNpZ25lZCBpbnQgaW5mb19mbGFncykKIHsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAogCXEgPSBxdWV1ZV9uZXcoY2xpZW50LCBsb2NrZWQpOwogCWlmIChxID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlxLT5pbmZvX2ZsYWdzID0gaW5mb19mbGFnczsKIAlxdWV1ZV91c2UocSwgY2xpZW50LCAxKTsKKwlzbmRfdXNlX2xvY2tfdXNlKCZxLT51c2VfbG9jayk7CiAJaWYgKHF1ZXVlX2xpc3RfYWRkKHEpIDwgMCkgeworCQlzbmRfdXNlX2xvY2tfZnJlZSgmcS0+dXNlX2xvY2spOwogCQlxdWV1ZV9kZWxldGUocSk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9Ci0JcmV0dXJuIHEtPnF1ZXVlOworCXJldHVybiBxOwogfQogCiAvKiBkZWxldGUgYSBxdWV1ZSAtIHF1ZXVlIG11c3QgYmUgb3duZWQgYnkgdGhlIGNsaWVudCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX3F1ZXVlLmggYi9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuaAppbmRleCAzMGM4MTExLi43MTkwOTM0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuaAorKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuaApAQCAtNzEsNyArNzEsNyBAQAogCiAKIC8qIGNyZWF0ZSBuZXcgcXVldWUgKGNvbnN0cnVjdG9yKSAqLwotaW50IHNuZF9zZXFfcXVldWVfYWxsb2MoaW50IGNsaWVudCwgaW50IGxvY2tlZCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK3N0cnVjdCBzbmRfc2VxX3F1ZXVlICpzbmRfc2VxX3F1ZXVlX2FsbG9jKGludCBjbGllbnQsIGludCBsb2NrZWQsIHVuc2lnbmVkIGludCBmbGFncyk7CiAKIC8qIGRlbGV0ZSBxdWV1ZSAoZGVzdHJ1Y3RvcikgKi8KIGludCBzbmRfc2VxX3F1ZXVlX2RlbGV0ZShpbnQgY2xpZW50LCBpbnQgcXVldWVpZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmMgYi9zb3VuZC9maXJld2lyZS9pc28tcmVzb3VyY2VzLmMKaW5kZXggZjBlNGQ1MC4uMDY2YjVkZiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvaXNvLXJlc291cmNlcy5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2lzby1yZXNvdXJjZXMuYwpAQCAtMjEwLDkgKzIxMCwxNCBAQAogICovCiB2b2lkIGZ3X2lzb19yZXNvdXJjZXNfZnJlZShzdHJ1Y3QgZndfaXNvX3Jlc291cmNlcyAqcikKIHsKLQlzdHJ1Y3QgZndfY2FyZCAqY2FyZCA9IGZ3X3BhcmVudF9kZXZpY2Uoci0+dW5pdCktPmNhcmQ7CisJc3RydWN0IGZ3X2NhcmQgKmNhcmQ7CiAJaW50IGJhbmR3aWR0aCwgY2hhbm5lbDsKIAorCS8qIE5vdCBpbml0aWFsaXplZC4gKi8KKwlpZiAoci0+dW5pdCA9PSBOVUxMKQorCQlyZXR1cm47CisJY2FyZCA9IGZ3X3BhcmVudF9kZXZpY2Uoci0+dW5pdCktPmNhcmQ7CisKIAltdXRleF9sb2NrKCZyLT5tdXRleCk7CiAKIAlpZiAoci0+YWxsb2NhdGVkKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvbXNuZC9tc25kX21pZGkuYyBiL3NvdW5kL2lzYS9tc25kL21zbmRfbWlkaS5jCmluZGV4IGZmYzY3ZmQuLjU4ZTU5Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9tc25kL21zbmRfbWlkaS5jCisrKyBiL3NvdW5kL2lzYS9tc25kL21zbmRfbWlkaS5jCkBAIC0xMjAsMjQgKzEyMCwyNCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNuZF9tc25kbWlkaSAqbXB1ID0gbXB1djsKIAl2b2lkICpwd01JRFFEYXRhID0gbXB1LT5kZXYtPm1hcHBlZGJhc2UgKyBNSURRX0RBVEFfQlVGRjsKKwl1MTYgaGVhZCwgdGFpbCwgc2l6ZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtcHUtPmlucHV0X2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAocmVhZHcobXB1LT5kZXYtPk1JRFEgKyBKUVNfd1RhaWwpICE9Ci0JICAgICAgIHJlYWR3KG1wdS0+ZGV2LT5NSURRICsgSlFTX3dIZWFkKSkgewotCQl1MTYgd1RtcCwgdmFsOwotCQl2YWwgPSByZWFkdyhwd01JRFFEYXRhICsgMiAqIHJlYWR3KG1wdS0+ZGV2LT5NSURRICsgSlFTX3dIZWFkKSk7CisJaGVhZCA9IHJlYWR3KG1wdS0+ZGV2LT5NSURRICsgSlFTX3dIZWFkKTsKKwl0YWlsID0gcmVhZHcobXB1LT5kZXYtPk1JRFEgKyBKUVNfd1RhaWwpOworCXNpemUgPSByZWFkdyhtcHUtPmRldi0+TUlEUSArIEpRU193U2l6ZSk7CisJaWYgKGhlYWQgPiBzaXplIHx8IHRhaWwgPiBzaXplKQorCQlnb3RvIG91dDsKKwl3aGlsZSAoaGVhZCAhPSB0YWlsKSB7CisJCXVuc2lnbmVkIGNoYXIgdmFsID0gcmVhZHcocHdNSURRRGF0YSArIDIgKiBoZWFkKTsKIAotCQkJaWYgKHRlc3RfYml0KE1TTkRNSURJX01PREVfQklUX0lOUFVUX1RSSUdHRVIsCi0JCQkJICAgICAmbXB1LT5tb2RlKSkKLQkJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKG1wdS0+c3Vic3RyZWFtX2lucHV0LAotCQkJCQkJICAgICh1bnNpZ25lZCBjaGFyICopJnZhbCwgMSk7Ci0KLQkJd1RtcCA9IHJlYWR3KG1wdS0+ZGV2LT5NSURRICsgSlFTX3dIZWFkKSArIDE7Ci0JCWlmICh3VG1wID4gcmVhZHcobXB1LT5kZXYtPk1JRFEgKyBKUVNfd1NpemUpKQotCQkJd3JpdGV3KDAsICBtcHUtPmRldi0+TUlEUSArIEpRU193SGVhZCk7Ci0JCWVsc2UKLQkJCXdyaXRldyh3VG1wLCAgbXB1LT5kZXYtPk1JRFEgKyBKUVNfd0hlYWQpOworCQlpZiAodGVzdF9iaXQoTVNORE1JRElfTU9ERV9CSVRfSU5QVVRfVFJJR0dFUiwgJm1wdS0+bW9kZSkpCisJCQlzbmRfcmF3bWlkaV9yZWNlaXZlKG1wdS0+c3Vic3RyZWFtX2lucHV0LCAmdmFsLCAxKTsKKwkJaWYgKCsraGVhZCA+IHNpemUpCisJCQloZWFkID0gMDsKKwkJd3JpdGV3KGhlYWQsIG1wdS0+ZGV2LT5NSURRICsgSlFTX3dIZWFkKTsKIAl9Cisgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wdS0+aW5wdXRfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChzbmRfbXNuZG1pZGlfaW5wdXRfcmVhZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMgYi9zb3VuZC9pc2EvbXNuZC9tc25kX3Bpbm5hY2xlLmMKaW5kZXggNGMwNzI2Ni4uYTMxZWE2YyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL21zbmQvbXNuZF9waW5uYWNsZS5jCisrKyBiL3NvdW5kL2lzYS9tc25kL21zbmRfcGlubmFjbGUuYwpAQCAtMTcwLDIzICsxNzAsMjQgQEAKIHsKIAlzdHJ1Y3Qgc25kX21zbmQgKmNoaXAgPSBkZXZfaWQ7CiAJdm9pZCAqcHdEU1BRRGF0YSA9IGNoaXAtPm1hcHBlZGJhc2UgKyBEU1BRX0RBVEFfQlVGRjsKKwl1MTYgaGVhZCwgdGFpbCwgc2l6ZTsKIAogCS8qIFNlbmQgYWNrIHRvIERTUCAqLwogCS8qIGluYihjaGlwLT5pbyArIEhQX1JYTCk7ICovCiAKIAkvKiBFdmFsdWF0ZSBxdWV1ZWQgRFNQIG1lc3NhZ2VzICovCi0Jd2hpbGUgKHJlYWR3KGNoaXAtPkRTUFEgKyBKUVNfd1RhaWwpICE9IHJlYWR3KGNoaXAtPkRTUFEgKyBKUVNfd0hlYWQpKSB7Ci0JCXUxNiB3VG1wOwotCi0JCXNuZF9tc25kX2V2YWxfZHNwX21zZyhjaGlwLAotCQkJcmVhZHcocHdEU1BRRGF0YSArIDIgKiByZWFkdyhjaGlwLT5EU1BRICsgSlFTX3dIZWFkKSkpOwotCi0JCXdUbXAgPSByZWFkdyhjaGlwLT5EU1BRICsgSlFTX3dIZWFkKSArIDE7Ci0JCWlmICh3VG1wID4gcmVhZHcoY2hpcC0+RFNQUSArIEpRU193U2l6ZSkpCi0JCQl3cml0ZXcoMCwgY2hpcC0+RFNQUSArIEpRU193SGVhZCk7Ci0JCWVsc2UKLQkJCXdyaXRldyh3VG1wLCBjaGlwLT5EU1BRICsgSlFTX3dIZWFkKTsKKwloZWFkID0gcmVhZHcoY2hpcC0+RFNQUSArIEpRU193SGVhZCk7CisJdGFpbCA9IHJlYWR3KGNoaXAtPkRTUFEgKyBKUVNfd1RhaWwpOworCXNpemUgPSByZWFkdyhjaGlwLT5EU1BRICsgSlFTX3dTaXplKTsKKwlpZiAoaGVhZCA+IHNpemUgfHwgdGFpbCA+IHNpemUpCisJCWdvdG8gb3V0OworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJc25kX21zbmRfZXZhbF9kc3BfbXNnKGNoaXAsIHJlYWR3KHB3RFNQUURhdGEgKyAyICogaGVhZCkpOworCQlpZiAoKytoZWFkID4gc2l6ZSkKKwkJCWhlYWQgPSAwOworCQl3cml0ZXcoaGVhZCwgY2hpcC0+RFNQUSArIEpRU193SGVhZCk7CiAJfQorIG91dDoKIAkvKiBTZW5kIGFjayB0byBEU1AgKi8KIAlpbmIoY2hpcC0+aW8gKyBIUF9SWEwpOwogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggYzQ3Mjg3ZC4uYTE3OGUwZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTEyMzUsOCArMTIzNSw2IEBACiAJCX0KIAl9CiAKLQlzbmRfZm04MDFfY2hpcF9pbml0KGNoaXApOwotCiAJaWYgKChjaGlwLT50ZWE1NzV4X3R1bmVyICYgVFVORVJfT05MWSkgPT0gMCkgewogCQlpZiAoZGV2bV9yZXF1ZXN0X2lycSgmcGNpLT5kZXYsIHBjaS0+aXJxLCBzbmRfZm04MDFfaW50ZXJydXB0LAogCQkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgY2hpcCkpIHsKQEAgLTEyNDgsNiArMTI0Niw4IEBACiAJCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAJfQogCisJc25kX2ZtODAxX2NoaXBfaW5pdChjaGlwKTsKKwogCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjaGlwLCAmb3BzKSkgPCAwKSB7CiAJCXNuZF9mbTgwMV9mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IGMxNWM1MWIuLmYyZTRlOTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTg1NCw2ICs4NTQsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM5MGIsICJMZW5vdm8gRzUwLTgwIiwgQ1hUX0ZJWFVQX1NURVJFT19ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzOTc1LCAiTGVub3ZvIFUzMDBzIiwgQ1hUX0ZJWFVQX1NURVJFT19ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgzOTc3LCAiTGVub3ZvIElkZWFQYWQgVTMxMCIsIENYVF9GSVhVUF9TVEVSRU9fRE1JQyksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4Mzk3OCwgIkxlbm92byBHNTAtNzAiLCBDWFRfRklYVVBfU1RFUkVPX0RNSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM5N2IsICJMZW5vdm8gUzIwNSIsIENYVF9GSVhVUF9TVEVSRU9fRE1JQyksCiAJU05EX1BDSV9RVUlSS19WRU5ET1IoMHgxN2FhLCAiVGhpbmtwYWQiLCBDWFRfRklYVVBfVEhJTktQQURfQUNQSSksCiAJU05EX1BDSV9RVUlSSygweDFjMDYsIDB4MjAxMSwgIkxlbW90ZSBBMTAwNCIsIENYVF9QSU5DRkdfTEVNT1RFX0ExMDA0KSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKaW5kZXggNGJmNDgzMy4uNzc1YzY3OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9oZG1pLmMKQEAgLTM2MDAsMTEgKzM2MDAsMTUgQEAKIEhEQV9DT0RFQ19FTlRSWSgweDEwOTUxMzkwLCAiU2lJMTM5MCBIRE1JIiwJcGF0Y2hfZ2VuZXJpY19oZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwOTUxMzkyLCAiU2lJMTM5MiBIRE1JIiwJcGF0Y2hfZ2VuZXJpY19oZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDE3ZTgwMDQ3LCAiQ2hyb250ZWwgSERNSSIsCXBhdGNoX2dlbmVyaWNfaGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDAwMSwgIk1DUDczIEhETUkiLAlwYXRjaF9udmhkbWlfMmNoKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDAyLCAiTUNQNzcvNzggSERNSSIsCXBhdGNoX252aGRtaV84Y2hfN3gpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwMDMsICJNQ1A3Ny83OCBIRE1JIiwJcGF0Y2hfbnZoZG1pXzhjaF83eCksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDAwNCwgIkdQVSAwNCBIRE1JIiwJcGF0Y2hfbnZoZG1pXzhjaF83eCksCiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDAwNSwgIk1DUDc3Lzc4IEhETUkiLAlwYXRjaF9udmhkbWlfOGNoXzd4KSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDA2LCAiTUNQNzcvNzggSERNSSIsCXBhdGNoX252aGRtaV84Y2hfN3gpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwMDcsICJNQ1A3OS83QSBIRE1JIiwJcGF0Y2hfbnZoZG1pXzhjaF83eCksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDAwOCwgIkdQVSAwOCBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDA5LCAiR1BVIDA5IEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwMGEsICJHUFUgMGEgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDAwYiwgIkdQVSAwYiBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDBjLCAiTUNQODkgSERNSSIsCXBhdGNoX252aGRtaSksCkBAIC0zNjMxLDE3ICszNjM1LDQwIEBACiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA0MiwgIkdQVSA0MiBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDQzLCAiR1BVIDQzIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwNDQsICJHUFUgNDQgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA0NSwgIkdQVSA0NSBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDUwLCAiR1BVIDUwIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwNTEsICJHUFUgNTEgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA1MiwgIkdQVSA1MiBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDYwLCAiR1BVIDYwIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwNjEsICJHUFUgNjEgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA2MiwgIkdQVSA2MiBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDY3LCAiTUNQNjcgSERNSSIsCXBhdGNoX252aGRtaV8yY2gpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwNzAsICJHUFUgNzAgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA3MSwgIkdQVSA3MSBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDcyLCAiR1BVIDcyIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwNzMsICJHUFUgNzMgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA3NCwgIkdQVSA3NCBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDc2LCAiR1BVIDc2IEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwN2IsICJHUFUgN2IgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA3YywgIkdQVSA3YyBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDdkLCAiR1BVIDdkIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwN2UsICJHUFUgN2UgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA4MCwgIkdQVSA4MCBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDgxLCAiR1BVIDgxIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwODIsICJHUFUgODIgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCiBIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA4MywgIkdQVSA4MyBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDg0LCAiR1BVIDg0IEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwOTAsICJHUFUgOTAgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA5MSwgIkdQVSA5MSBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDkyLCAiR1BVIDkyIEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwOTMsICJHUFUgOTMgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA5NCwgIkdQVSA5NCBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDk1LCAiR1BVIDk1IEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAorSERBX0NPREVDX0VOVFJZKDB4MTBkZTAwOTcsICJHUFUgOTcgSERNSS9EUCIsCXBhdGNoX252aGRtaSksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlMDA5OCwgIkdQVSA5OCBIRE1JL0RQIiwJcGF0Y2hfbnZoZG1pKSwKK0hEQV9DT0RFQ19FTlRSWSgweDEwZGUwMDk5LCAiR1BVIDk5IEhETUkvRFAiLAlwYXRjaF9udmhkbWkpLAogSERBX0NPREVDX0VOVFJZKDB4MTBkZTgwMDEsICJNQ1A3MyBIRE1JIiwJcGF0Y2hfbnZoZG1pXzJjaCksCitIREFfQ09ERUNfRU5UUlkoMHgxMGRlODA2NywgIk1DUDY3LzY4IEhETUkiLAlwYXRjaF9udmhkbWlfMmNoKSwKIEhEQV9DT0RFQ19FTlRSWSgweDExMDY5ZjgwLCAiVlg5MDAgSERNSS9EUCIsCXBhdGNoX3ZpYV9oZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDExMDY5ZjgxLCAiVlg5MDAgSERNSS9EUCIsCXBhdGNoX3ZpYV9oZG1pKSwKIEhEQV9DT0RFQ19FTlRSWSgweDExMDY5Zjg0LCAiVlgxMSBIRE1JL0RQIiwJcGF0Y2hfZ2VuZXJpY19oZG1pKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKaW5kZXggYmIxYWFkMy4uNmYzMzdmMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMKQEAgLTIyMzMsNiArMjIzMyw3IEBACiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODY5MSwgIkFTVVMgUk9HIFJhbmdlciBWSUlJIiwgQUxDODgyX0ZJWFVQX0dQSU8zKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDQ3LCAiU29ueSBWYWlvIFRUIiwgQUxDODg5X0ZJWFVQX1ZBSU9fVFQpLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNWEsICJTb255IFZhaW8gWiIsIEFMQzg4Ml9GSVhVUF9OT19QUklNQVJZX0hQKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDYwLCAiU29ueSBWYWlvIFZQQ0wxNE0xUiIsIEFMQzg4Ml9GSVhVUF9OT19QUklNQVJZX0hQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDQzLCAiU29ueSBWYWlvIFZHQy1MTjUxSkdCIiwgQUxDODgyX0ZJWFVQX05PX1BSSU1BUllfSFApLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNDQsICJTb255IFZBSU8gQWlPIiwgQUxDODgyX0ZJWFVQX05PX1BSSU1BUllfSFApLAogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvS2NvbmZpZyBiL3NvdW5kL3NvYy9LY29uZmlnCmluZGV4IDIyYjMwNzMuLjE4MmQ5MmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9LY29uZmlnCkBAIC01NCw3ICs1NCw2IEBACiBzb3VyY2UgInNvdW5kL3NvYy9pbWcvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL2ludGVsL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9tZWRpYXRlay9LY29uZmlnIgotc291cmNlICJzb3VuZC9zb2MvbXNtL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9teHMvS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3B4YS9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvcWNvbS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IDE0NjYwNzUuLjlhMzBmMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTMxLDcgKzMxLDYgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBpbWcvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gaW50ZWwvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gbWVkaWF0ZWsvCi1vYmotJChDT05GSUdfU05EX1NPQykJKz0gbXNtLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IG14cy8KIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBudWM5MDAvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gb21hcC8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwppbmRleCAyN2Y1ZDM0Li5jNjc2NjdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCkBAIC04NzUsNzEgKzg3NSw2IEBACiBjb25maWcgU05EX1NPQ19VREExMzgwCiAgICAgICAgIHRyaXN0YXRlCiAKLWNvbmZpZyBTTkRfU09DX1dDRDkzNFhfRFNECi0gICAgICAgIHRyaXN0YXRlCi0KLWNvbmZpZyBTTkRfU09DX1dDRDkzMzUKLSAgICAgICAgdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFdDRDlYWFhfQ09ERUNfQ09SRQotCXNlbGVjdCBTTkRfU09DX1dDRDlYWFgKLQlzZWxlY3QgU05EX1NPQ19XQ0RfTUJIQ19MRUdBQ1kKLQlzZWxlY3QgU05EX1NPQ19XQ0RfQ1BFCi0KLWNvbmZpZyBTTkRfU09DX1dDRDkzNFgKLSAgICAgICAgdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFdDRDlYWFhfQ09ERUNfQ09SRQotCXNlbGVjdCBTTkRfU09DX1dDRDlYWFgKLQlzZWxlY3QgQVVESU9fRVhUX0NMSwotCXNlbGVjdCBTTkRfU09DX1dDRF9EU1BfTUdSCi0Jc2VsZWN0IFNORF9TT0NfV0NEX1NQSQotCXNlbGVjdCBTTkRfU09DX1dDRDkzNFhfTUJIQwotICAgICAgICBzZWxlY3QgU05EX1NPQ19XQ0Q5MzRYX0RTRAotCXNlbGVjdCBXQ0RfRFNQX0dMSU5LCi0KLWNvbmZpZyBTTkRfU09DX1dDRDkzNFhfTUJIQwotICAgICAgICB0cmlzdGF0ZQotCWRlcGVuZHMgb24gU05EX1NPQ19XQ0Q5MzRYCi0Jc2VsZWN0IFNORF9TT0NfV0NEX01CSENfQURDCi0KLWNvbmZpZyBSRUdNQVBfU1dSCi0JdHJpc3RhdGUKLQlkZWZhdWx0IHkKLQotY29uZmlnIFNORF9TT0NfV1NBODgxWAotICAgICAgICB0cmlzdGF0ZQotCWRlcGVuZHMgb24gUkVHTUFQX1NXUgotCXNlbGVjdCBNU01fQ0RDX1BJTkNUUkwKLQotY29uZmlnIFNORF9TT0NfV0NEOVhYWAotCXRyaXN0YXRlCi0JZGVmYXVsdCB5IGlmIFNORF9TT0NfV0NEOTMzNT15IHx8IFNORF9TT0NfV0NEOTM0WD15Ci0KLWNvbmZpZyBTTkRfU09DX1dDRF9DUEUKLQl0cmlzdGF0ZQotCWRlZmF1bHQgeSBpZiBTTkRfU09DX1dDRDkzMzU9eQotCi1jb25maWcgQVVESU9fRVhUX0NMSwotCXRyaXN0YXRlCi0JZGVmYXVsdCB5IGlmIFNORF9TT0NfV0NEOTMzNT15IHx8IFNORF9TT0NfU0RNNjYwX0NEQz15Ci0KLWNvbmZpZyBTTkRfU09DX1dDRF9NQkhDCi0JdHJpc3RhdGUKLQotY29uZmlnIFNORF9TT0NfV0NEX01CSENfTEVHQUNZCi0JdHJpc3RhdGUKLQlzZWxlY3QgU05EX1NPQ19XQ0RfTUJIQwotCi1jb25maWcgU05EX1NPQ19XQ0RfTUJIQ19BREMKLQl0cmlzdGF0ZQotCXNlbGVjdCBTTkRfU09DX1dDRF9NQkhDCi0KLWNvbmZpZyBTTkRfU09DX1dDRF9EU1BfTUdSCi0JdHJpc3RhdGUKLQotY29uZmlnIFNORF9TT0NfV0NEX1NQSQotCWRlcGVuZHMgb24gU1BJCi0JdHJpc3RhdGUKLQogY29uZmlnIFNORF9TT0NfV0wxMjczCiAJdHJpc3RhdGUKIApAQCAtMTE1NCwxNyArMTA4OSw0IEBACiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRQQTYxMzBBMiBoZWFkcGhvbmUgYW1wbGlmaWVyIgogCWRlcGVuZHMgb24gSTJDCiAKLWNvbmZpZyBTTkRfU09DX01TTV9TVFVCCi0JdHJpc3RhdGUKLQotY29uZmlnIFNORF9TT0NfTVNNX0hETUlfQ09ERUNfUlgKLQlib29sICJIRE1JIEF1ZGlvIFBsYXliYWNrIgotCWRlcGVuZHMgb24gRFJNX01TTSAmJiAoU05EX1NPQ19NU004OTk4IHx8IFNORF9TT0NfNjYwIHx8IFNORF9TT0NfU0RNODQ1KQotCWhlbHAKLQlIRE1JIGF1ZGlvIGRyaXZlcnMgc2hvdWxkIGJlIGJ1aWx0IG9ubHkgaWYgdGhlIHBsYXRmb3JtCi0Jc3VwcG9ydHMgaGRtaSBwYW5lbC4KLQotc291cmNlICJzb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvS2NvbmZpZyIKLXNvdXJjZSAic291bmQvc29jL2NvZGVjcy9tc21fc2R3L0tjb25maWciCi0KIGVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IGRhZjA1ZDguLjk1OGNkNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtMTU4LDIxICsxNTgsNiBAQAogc25kLXNvYy10d2w2MDQwLW9ianMgOj0gdHdsNjA0MC5vCiBzbmQtc29jLXVkYTEzNHgtb2JqcyA6PSB1ZGExMzR4Lm8KIHNuZC1zb2MtdWRhMTM4MC1vYmpzIDo9IHVkYTEzODAubwotc25kLXNvYy13Y2Q5MzM1LW9ianMgOj0gd2NkOTMzNS5vCi1zbmQtc29jLXdjZDkzNHgtb2JqcyA6PSB3Y2Q5MzR4Lm8KLXNuZC1zb2Mtd2NkOXh4eC1vYmpzIDo9IHdjZDl4eHgtY29tbW9uLXYyLm8gd2NkOXh4eC1yZXNtZ3ItdjIubyBcCi0JCQl3Y2RjYWwtaHdkZXAubyB3Y2QtZHNwLW1nci5vIHdjZC1kc3AtdXRpbHMubyBcCi0JCQl3Y2Q5eHh4LXNvYy1pbml0Lm8gYXVkaW8tZXh0LWNsay11cC5vCi1zbmQtc29jLXdjZC1jcGUtb2JqcyA6PSB3Y2RfY3BlX3NlcnZpY2VzLm8gd2NkX2NwZV9jb3JlLm8KLXNuZC1zb2Mtd3NhODgxeC1vYmpzIDo9IHdzYTg4MXgubyB3c2E4ODF4LXRhYmxlcy5vIHdzYTg4MXgtcmVnbWFwLm8gd3NhODgxeC10ZW1wLXNlbnNvci5vCi1zbmQtc29jLXdjZC1tYmhjLW9ianMgOj0gd2NkLW1iaGMtdjIubwotaWZuZXEgKCwkKGZpbHRlciAkKENPTkZJR19TTkRfU09DX1dDRF9NQkhDX0xFR0FDWSkseSBtKSkKLQlzbmQtc29jLXdjZC1tYmhjLW9ianMgKz0gd2NkLW1iaGMtbGVnYWN5Lm8KLWVuZGlmCi1pZm5lcSAoLCQoZmlsdGVyICQoQ09ORklHX1NORF9TT0NfV0NEX01CSENfQURDKSx5IG0pKQotCXNuZC1zb2Mtd2NkLW1iaGMtb2JqcyArPSB3Y2QtbWJoYy1hZGMubwotZW5kaWYKLXNuZC1zb2Mtd2NkLXNwaS1vYmpzIDo9IHdjZC1zcGkubwogc25kLXNvYy13bDEyNzMtb2JqcyA6PSB3bDEyNzMubwogc25kLXNvYy13bS1hZHNwLW9ianMgOj0gd21fYWRzcC5vCiBzbmQtc29jLXdtMDAxMC1vYmpzIDo9IHdtMDAxMC5vCkBAIC0yMjksOCArMjE0LDYgQEAKIHNuZC1zb2Mtd205NzEyLW9ianMgOj0gd205NzEyLm8KIHNuZC1zb2Mtd205NzEzLW9ianMgOj0gd205NzEzLm8KIHNuZC1zb2Mtd20taHVicy1vYmpzIDo9IHdtX2h1YnMubwotc25kLXNvYy1tc20tc3R1Yi1vYmpzIDo9IG1zbV9zdHViLm8KLW9iai0kKENPTkZJR19TTkRfU09DX01TTV9IRE1JX0NPREVDX1JYKSA6PSBtc21faGRtaV9jb2RlY19yeC5vCiAKICMgQW1wCiBzbmQtc29jLW1heDk4Nzctb2JqcyA6PSBtYXg5ODc3Lm8KQEAgLTM5NiwxNSArMzc5LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1RXTDYwNDApCSs9IHNuZC1zb2MtdHdsNjA0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19VREExMzRYKQkrPSBzbmQtc29jLXVkYTEzNHgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVURBMTM4MCkJKz0gc25kLXNvYy11ZGExMzgwLm8KLW9iai0kKENPTkZJR19TTkRfU09DX1dDRDkzMjApCSs9IHNuZC1zb2Mtd2NkOTMyMC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5MzM1KQkrPSBzbmQtc29jLXdjZDkzMzUubwotb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEOTM0WCkJKz0gd2NkOTM0eC8KLW9iai0kKENPTkZJR19TTkRfU09DX1dDRDlYWFgpICs9IHNuZC1zb2Mtd2NkOXh4eC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19XQ0RfQ1BFKSAgICs9IHNuZC1zb2Mtd2NkLWNwZS5vCi1vYmotJChDT05GSUdfU05EX1NPQ19XQ0RfTUJIQykgICs9IHNuZC1zb2Mtd2NkLW1iaGMubwotb2JqLSQoQ09ORklHX1NORF9TT0NfV1NBODgxWCkJKz0gc25kLXNvYy13c2E4ODF4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dMMTI3MykJKz0gc25kLXNvYy13bDEyNzMubwotb2JqLSQoQ09ORklHX1NORF9TT0NfV0NEX1NQSSkgICs9IHNuZC1zb2Mtd2NkLXNwaS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTAwMTApCSs9IHNuZC1zb2Mtd20wMDEwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNMTI1MF9FVjEpICs9IHNuZC1zb2Mtd20xMjUwLWV2MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTIwMDApCSs9IHNuZC1zb2Mtd20yMDAwLm8KQEAgLTQ2MCwxMSArNDM1LDggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1dNOTcxMykJKz0gc25kLXNvYy13bTk3MTMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV01fQURTUCkJKz0gc25kLXNvYy13bS1hZHNwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNX0hVQlMpCSs9IHNuZC1zb2Mtd20taHVicy5vCi1vYmotJChDT05GSUdfU05EX1NPQ19NU01fU1RVQikgICs9IHNuZC1zb2MtbXNtLXN0dWIubwogCiAjIEFtcAogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTg3NykJKz0gc25kLXNvYy1tYXg5ODc3Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX01BWDk4NTA0KQkrPSBzbmQtc29jLW1heDk4NTA0Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RQQTYxMzBBMikJKz0gc25kLXNvYy10cGE2MTMwYTIubwotb2JqLXkgKz0gc2RtNjYwX2NkYy8KLW9iai15ICs9IG1zbV9zZHcvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2F1ZGlvLWV4dC1jbGstdXAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWMwNjNkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYXVkaW8tZXh0LWNsay11cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KLSNpbmNsdWRlICIuLi8uLi8uLi9kcml2ZXJzL2Nsay9xY29tL2NvbW1vbi5oIgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxhdWRpby1leHQtY2xrLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLSNpbmNsdWRlICJhdWRpby1leHQtY2xrLXVwLmgiCi0KLWVudW0gYXVkaW9fY2xrX211eCB7Ci0JQVBfQ0xLMiwKLQlMUEFTU19NQ0xLLAotCUxQQVNTX01DTEsyLAotfTsKLQotc3RydWN0IHBpbmN0cmxfaW5mbyB7Ci0Jc3RydWN0IHBpbmN0cmwgKnBpbmN0cmw7Ci0Jc3RydWN0IHBpbmN0cmxfc3RhdGUgKnNsZWVwOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICphY3RpdmU7Ci0JY2hhciBfX2lvbWVtICpiYXNlOwotfTsKLQotc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgewotCWJvb2wgZW5hYmxlZDsKLQlpbnQgZ3BpbzsKLQlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBmYWN0OwotfTsKLQotc3RydWN0IGF1ZGlvX2V4dF9wbWlfY2xrIHsKLQlpbnQgZ3BpbzsKLQlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBmYWN0OwotfTsKLQotc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyIHsKLQlib29sIGVuYWJsZWQ7Ci0Jc3RydWN0IHBpbmN0cmxfaW5mbyBwbmN0cmxfaW5mbzsKLQlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBmYWN0OwotfTsKLQotc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrIHsKLQlzdHJ1Y3QgcGluY3RybF9pbmZvIHBuY3RybF9pbmZvOwotCXN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yIGZhY3Q7Ci19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9jbGtfc2V0IGNsazJfY29uZmlnID0gewotCVE2QUZFX0xQQVNTX0NMS19DT05GSUdfQVBJX1ZFUlNJT04sCi0JUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRUFLRVJfSTJTX09TUiwKLQlRNkFGRV9MUEFTU19JQklUX0NMS18xMV9QMjg5Nl9NSFosCi0JUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkwLAotfTsKLQotc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBscGFzc19kZWZhdWx0ID0gewotCVE2QUZFX0xQQVNTX0NMS19DT05GSUdfQVBJX1ZFUlNJT04sCi0JUTZBRkVfTFBBU1NfQ0xLX0lEX1NQRUFLRVJfSTJTX09TUiwKLQlRNkFGRV9MUEFTU19JQklUX0NMS18xMV9QMjg5Nl9NSFosCi0JUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkwLAotfTsKLQotc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCBscGFzc19tY2xrID0gewotCVE2QUZFX0xQQVNTX0NMS19DT05GSUdfQVBJX1ZFUlNJT04sCi0JUTZBRkVfTFBBU1NfQ0xLX0lEX01DTEtfMSwKLQlRNkFGRV9MUEFTU19PU1JfQ0xLXzExX1AyODk2X01IWiwKLQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCTAsCi19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhdWRpb19leHRfYXBfY2xrICp0b19hdWRpb19hcF9jbGsoc3RydWN0IGNsa19odyAqaHcpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGssIGZhY3QuaHcpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2V4dF9jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsayAqYXVkaW9fY2xrID0gdG9fYXVkaW9fYXBfY2xrKGh3KTsKLQotCXByX2RlYnVnKCIlczogZ3BpbzogJWRcbiIsIF9fZnVuY19fLCBhdWRpb19jbGstPmdwaW8pOwotCWlmIChncGlvX2lzX3ZhbGlkKGF1ZGlvX2Nsay0+Z3BpbykpCi0JCXJldHVybiBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYXVkaW9fY2xrLT5ncGlvLCAxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZXh0X2Nsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgKmF1ZGlvX2NsayA9IHRvX2F1ZGlvX2FwX2Nsayhodyk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGdwaW86ICVkXG4iLCBfX2Z1bmNfXywgYXVkaW9fY2xrLT5ncGlvKTsKLQlpZiAoZ3Bpb19pc192YWxpZChhdWRpb19jbGstPmdwaW8pKQotCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoYXVkaW9fY2xrLT5ncGlvLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXVkaW9fZXh0X2FwX2NsazIgKnRvX2F1ZGlvX2FwX2NsazIoc3RydWN0IGNsa19odyAqaHcpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyLCBmYWN0Lmh3KTsKLX0KLQotc3RhdGljIGludCBhdWRpb19leHRfY2xrMl9wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBhdWRpb19leHRfYXBfY2xrMiAqYXVkaW9fY2xrMiA9IHRvX2F1ZGlvX2FwX2NsazIoaHcpOwotCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2NsazItPnBuY3RybF9pbmZvOwotCWludCByZXQ7Ci0KLQotCWlmICghcG5jdHJsX2luZm8tPnBpbmN0cmwgfHwgIXBuY3RybF9pbmZvLT5hY3RpdmUpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocG5jdHJsX2luZm8tPnBpbmN0cmwsCi0JCQkJICAgcG5jdHJsX2luZm8tPmFjdGl2ZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBhY3RpdmUgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWNsazJfY29uZmlnLmVuYWJsZSA9IDE7Ci0JcmV0ID0gYWZlX3NldF9scGFzc19jbGtfY2ZnKElEWF9SU1ZEXzMsICZjbGsyX2NvbmZpZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjbG9jaywgcmV0ID0gJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYXVkaW9fZXh0X2NsazJfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBhdWRpb19leHRfYXBfY2xrMiAqYXVkaW9fY2xrMiA9IHRvX2F1ZGlvX2FwX2NsazIoaHcpOwotCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2NsazItPnBuY3RybF9pbmZvOwotCWludCByZXQ7Ci0KLQlpZiAoIXBuY3RybF9pbmZvLT5waW5jdHJsIHx8ICFwbmN0cmxfaW5mby0+c2xlZXApCi0JCXJldHVybjsKLQotCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCSAgIHBuY3RybF9pbmZvLT5zbGVlcCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogc2xlZXAgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQljbGsyX2NvbmZpZy5lbmFibGUgPSAwOwotCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xrX2NmZyhJRFhfUlNWRF8zLCAmY2xrMl9jb25maWcpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXVkaW9fZXh0X2xwYXNzX21jbGsgKnRvX2F1ZGlvX2xwYXNzX21jbGsoCi0JCQkJCQlzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgYXVkaW9fZXh0X2xwYXNzX21jbGssIGZhY3QuaHcpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2V4dF9scGFzc19tY2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrICphdWRpb19scGFzc19tY2xrID0gdG9fYXVkaW9fbHBhc3NfbWNsayhodyk7Ci0Jc3RydWN0IHBpbmN0cmxfaW5mbyAqcG5jdHJsX2luZm8gPSAmYXVkaW9fbHBhc3NfbWNsay0+cG5jdHJsX2luZm87Ci0JaW50IHJldDsKLQotCWxwYXNzX21jbGsuZW5hYmxlID0gMTsKLQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWCwKLQkJCQkmbHBhc3NfbWNsayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlcyBhZmVfc2V0X2RpZ2l0YWxfY29kZWNfY29yZV9jbG9jayBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCXBuY3RybF9pbmZvLT5hY3RpdmUpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBhY3RpdmUgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlpZiAocG5jdHJsX2luZm8tPmJhc2UpCi0JCWlvd3JpdGUzMigxLCBwbmN0cmxfaW5mby0+YmFzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2V4dF9scGFzc19tY2xrX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgYXVkaW9fZXh0X2xwYXNzX21jbGsgKmF1ZGlvX2xwYXNzX21jbGsgPSB0b19hdWRpb19scGFzc19tY2xrKGh3KTsKLQlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbyA9ICZhdWRpb19scGFzc19tY2xrLT5wbmN0cmxfaW5mbzsKLQlpbnQgcmV0OwotCi0JaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQkgICBwbmN0cmxfaW5mby0+c2xlZXApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBhY3RpdmUgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JbHBhc3NfbWNsay5lbmFibGUgPSAwOwotCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYLAotCQkJJmxwYXNzX21jbGspOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBhZmVfc2V0X2RpZ2l0YWxfY29kZWNfY29yZV9jbG9jayBmYWlsZWQsIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JaWYgKHBuY3RybF9pbmZvLT5iYXNlKQotCQlpb3dyaXRlMzIoMCwgcG5jdHJsX2luZm8tPmJhc2UpOwotfQotCi1zdGF0aWMgaW50IGF1ZGlvX2V4dF9scGFzc19tY2xrMl9wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayAqYXVkaW9fbHBhc3NfbWNsazIgPQotCQkJCQl0b19hdWRpb19scGFzc19tY2xrKGh3KTsKLQlzdHJ1Y3QgcGluY3RybF9pbmZvICpwbmN0cmxfaW5mbyA9ICZhdWRpb19scGFzc19tY2xrMi0+cG5jdHJsX2luZm87Ci0JaW50IHJldDsKLQotCWlmIChwbmN0cmxfaW5mby0+cGluY3RybCkgewotCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwbmN0cmxfaW5mby0+cGluY3RybCwKLQkJCQkJICAgcG5jdHJsX2luZm8tPmFjdGl2ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGFjdGl2ZSBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCWxwYXNzX2RlZmF1bHQuZW5hYmxlID0gMTsKLQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoSURYX1JTVkRfMywgJmxwYXNzX2RlZmF1bHQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvX2V4dF9scGFzc19tY2xrMl91bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrICphdWRpb19scGFzc19tY2xrMiA9Ci0JCQkJCXRvX2F1ZGlvX2xwYXNzX21jbGsoaHcpOwotCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2xwYXNzX21jbGsyLT5wbmN0cmxfaW5mbzsKLQlpbnQgcmV0OwotCi0JaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBuY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQkgICBwbmN0cmxfaW5mby0+c2xlZXApOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogc2xlZXAgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotCWxwYXNzX2RlZmF1bHQuZW5hYmxlID0gMDsKLQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsa19jZmcoSURYX1JTVkRfMywgJmxwYXNzX2RlZmF1bHQpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVzZXQgY2xvY2ssIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGF1ZGlvX2V4dF9hcF9jbGtfb3BzID0gewotCS5wcmVwYXJlID0gYXVkaW9fZXh0X2Nsa19wcmVwYXJlLAotCS51bnByZXBhcmUgPSBhdWRpb19leHRfY2xrX3VucHJlcGFyZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBhdWRpb19leHRfYXBfY2xrMl9vcHMgPSB7Ci0JLnByZXBhcmUgPSBhdWRpb19leHRfY2xrMl9wcmVwYXJlLAotCS51bnByZXBhcmUgPSBhdWRpb19leHRfY2xrMl91bnByZXBhcmUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgYXVkaW9fZXh0X2xwYXNzX21jbGtfb3BzID0gewotCS5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGtfcHJlcGFyZSwKLQkudW5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGtfdW5wcmVwYXJlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGF1ZGlvX2V4dF9scGFzc19tY2xrMl9vcHMgPSB7Ci0JLnByZXBhcmUgPSBhdWRpb19leHRfbHBhc3NfbWNsazJfcHJlcGFyZSwKLQkudW5wcmVwYXJlID0gYXVkaW9fZXh0X2xwYXNzX21jbGsyX3VucHJlcGFyZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZXh0X3BtaV9jbGsgYXVkaW9fcG1pX2NsayA9IHsKLQkuZ3BpbyA9IC1FSU5WQUwsCi0JLmZhY3QgPSB7Ci0JCS5tdWx0ID0gMSwKLQkJLmRpdiA9IDEsCi0JCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCQkubmFtZSA9ICJhdWRpb19leHRfcG1pX2NsayIsCi0JCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImRpdl9jbGsxIiB9LAotCQkJLm51bV9wYXJlbnRzID0gMSwKLQkJCS5vcHMgPSAmY2xrX2R1bW15X29wcywKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRpb19leHRfcG1pX2NsayBhdWRpb19wbWlfbG5iYl9jbGsgPSB7Ci0JLmdwaW8gPSAtRUlOVkFMLAotCS5mYWN0ID0gewotCQkubXVsdCA9IDEsCi0JCS5kaXYgPSAxLAotCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkJLm5hbWUgPSAiYXVkaW9fZXh0X3BtaV9sbmJiX2NsayIsCi0JCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImxuX2JiX2NsazIiIH0sCi0JCQkubnVtX3BhcmVudHMgPSAxLAotCQkJLm9wcyA9ICZjbGtfZHVtbXlfb3BzLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsgYXVkaW9fYXBfY2xrID0gewotCS5ncGlvID0gLUVJTlZBTCwKLQkuZmFjdCA9IHsKLQkJLm11bHQgPSAxLAotCQkuZGl2ID0gMSwKLQkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJCS5uYW1lID0gImF1ZGlvX2FwX2NsayIsCi0JCQkub3BzID0gJmF1ZGlvX2V4dF9hcF9jbGtfb3BzLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9hcF9jbGsyIGF1ZGlvX2FwX2NsazIgPSB7Ci0JLmVuYWJsZWQgPSBmYWxzZSwKLQkucG5jdHJsX2luZm8gPSB7TlVMTH0sCi0JLmZhY3QgPSB7Ci0JCS5tdWx0ID0gMSwKLQkJLmRpdiA9IDEsCi0JCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCQkubmFtZSA9ICJhdWRpb19hcF9jbGsyIiwKLQkJCS5vcHMgPSAmYXVkaW9fZXh0X2FwX2NsazJfb3BzLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2V4dF9scGFzc19tY2xrIGF1ZGlvX2xwYXNzX21jbGsgPSB7Ci0JLnBuY3RybF9pbmZvID0ge05VTEx9LAotCS5mYWN0ID0gewotCQkubXVsdCA9IDEsCi0JCS5kaXYgPSAxLAotCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewotCQkJLm5hbWUgPSAiYXVkaW9fbHBhc3NfbWNsayIsCi0JCQkub3BzID0gJmF1ZGlvX2V4dF9scGFzc19tY2xrX29wcywKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhdWRpb19leHRfbHBhc3NfbWNsayBhdWRpb19scGFzc19tY2xrMiA9IHsKLQkucG5jdHJsX2luZm8gPSB7TlVMTH0sCi0JLmZhY3QgPSB7Ci0JCS5tdWx0ID0gMSwKLQkJLmRpdiA9IDEsCi0JCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCQkubmFtZSA9ICJhdWRpb19scGFzc19tY2xrMiIsCi0JCQkub3BzID0gJmF1ZGlvX2V4dF9scGFzc19tY2xrMl9vcHMsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2h3ICphdWRpb19tc21faHdzW10gPSB7Ci0JJmF1ZGlvX3BtaV9jbGsuZmFjdC5odywKLQkmYXVkaW9fYXBfY2xrLmZhY3QuaHcsCi0JJmF1ZGlvX2FwX2NsazIuZmFjdC5odywKLQkmYXVkaW9fbHBhc3NfbWNsay5mYWN0Lmh3LAotCSZhdWRpb19scGFzc19tY2xrMi5mYWN0Lmh3LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfaHcgKmF1ZGlvX21zbV9od3MxW10gPSB7Ci0JJmF1ZGlvX3BtaV9sbmJiX2Nsay5mYWN0Lmh3LAotfTsKLQotc3RhdGljIGludCBhdWRpb19nZXRfcGluY3RybChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJICAgICBlbnVtIGF1ZGlvX2Nsa19tdXggbXV4KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICAmcGRldi0+ZGV2OwotCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvOwotCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOwotCWludCByZXQ7Ci0JdTMyIHJlZzsKLQotCXN3aXRjaCAobXV4KSB7Ci0JY2FzZSBBUF9DTEsyOgotCQlwbmN0cmxfaW5mbyA9ICZhdWRpb19hcF9jbGsyLnBuY3RybF9pbmZvOwotCQlicmVhazsKLQljYXNlIExQQVNTX01DTEs6Ci0JCXBuY3RybF9pbmZvID0gJmF1ZGlvX2xwYXNzX21jbGsucG5jdHJsX2luZm87Ci0JCWJyZWFrOwotCWNhc2UgTFBBU1NfTUNMSzI6Ci0JCXBuY3RybF9pbmZvID0gJmF1ZGlvX2xwYXNzX21jbGsyLnBuY3RybF9pbmZvOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgIiVzIE5vdCBhIHZhbGlkIE1VWCBJRDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgbXV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCWRldl9kYmcoZGV2LCAiJXM6IGFscmVhZHkgcmVxdWVzdGVkIGJlZm9yZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoZGV2KTsKLQlpZiAoSVNfRVJSX09SX05VTEwocGluY3RybCkpIHsKLQkJZGV2X2RiZyhkZXYsICIlczogVW5hYmxlIHRvIGdldCBwaW5jdHJsIGhhbmRsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBuY3RybF9pbmZvLT5waW5jdHJsID0gcGluY3RybDsKLQkvKiBnZXQgYWxsIHN0YXRlIGhhbmRsZXMgZnJvbSBEZXZpY2UgVHJlZSAqLwotCXBuY3RybF9pbmZvLT5zbGVlcCA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKHBpbmN0cmwsICJzbGVlcCIpOwotCWlmIChJU19FUlIocG5jdHJsX2luZm8tPnNsZWVwKSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjb3VsZCBub3QgZ2V0IHNsZWVwIHBpbnN0YXRlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0JcG5jdHJsX2luZm8tPmFjdGl2ZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKHBpbmN0cmwsICJhY3RpdmUiKTsKLQlpZiAoSVNfRVJSKHBuY3RybF9pbmZvLT5hY3RpdmUpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBnZXQgYWN0aXZlIHBpbnN0YXRlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0JLyogUmVzZXQgdGhlIFRMTU0gcGlucyB0byBhIGRlZmF1bHQgc3RhdGUgKi8KLQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwbmN0cmxfaW5mby0+cGluY3RybCwKLQkJCQkgICBwbmN0cmxfaW5mby0+c2xlZXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICIlczogRGlzYWJsZSBUTE1NIHBpbnMgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAicWNvbSxtY2xrLWNsay1yZWciLCAmcmVnKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZGJnKGRldiwgIiVzOiBtaXNzIG1jbGsgcmVnXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJcG5jdHJsX2luZm8tPmJhc2UgPSBpb3JlbWFwKHJlZywgc2l6ZW9mKHUzMikpOwotCQlpZiAocG5jdHJsX2luZm8tPmJhc2UgPT0gIE5VTEwpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXMgaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlkZXZtX3BpbmN0cmxfcHV0KHBuY3RybF9pbmZvLT5waW5jdHJsKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGNsa19ncGlvOwotCWludCByZXQ7Ci0JdTMyIG1jbGtfZnJlcTsKLQlzdHJ1Y3QgY2xrICphdWRpb19jbGs7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgaTsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLGNvZGVjLW1jbGstY2xrLWZyZXEiLAotCQkJJm1jbGtfZnJlcSk7Ci0JaWYgKCFyZXQpIHsKLQkJbHBhc3NfbWNsay5jbGtfZnJlcV9pbl9oeiA9IG1jbGtfZnJlcTsKLQotCQlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBMUEFTU19NQ0xLKTsKLQkJaWYgKHJldCkKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBQYXJzaW5nIHBpbmN0cmwgJXMgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCAiTFBBU1NfTUNMSyIpOwotCQlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBMUEFTU19NQ0xLMik7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUGFyc2luZyBwaW5jdHJsICVzIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgIkxQQVNTX01DTEsyIik7Ci0JfQotCi0JY2xrX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkgICAgICJxY29tLGF1ZGlvLXJlZi1jbGstZ3BpbyIsIDApOwotCWlmIChjbGtfZ3BpbyA+IDApIHsKLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGNsa19ncGlvLCAiRVhUX0NMSyIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIlJlcXVlc3QgZXh0IGNsayBncGlvIGZhaWxlZCAlZCwgZXJyOiVkXG4iLAotCQkJCWNsa19ncGlvLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sbm9kZV9oYXNfcnBtX2Nsb2NrIikpIHsKLQkJCWF1ZGlvX3BtaV9jbGsuZ3BpbyA9IGNsa19ncGlvOwotCQl9IGVsc2UKLQkJCWF1ZGlvX2FwX2Nsay5ncGlvID0gY2xrX2dwaW87Ci0KLQl9Ci0KLQlyZXQgPSBhdWRpb19nZXRfcGluY3RybChwZGV2LCBBUF9DTEsyKTsKLQlpZiAocmV0KQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogUGFyc2luZyBwaW5jdHJsIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCWNsa19kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2xrX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa19kYXRhKQotCQlnb3RvIGVycl9ncGlvOwotCi0KLQljbGtfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSAgICAgInFjb20sYXVkaW8tcmVmLWNsay1ncGlvIiwgMCk7Ci0JaWYgKGNsa19ncGlvID4gMCkgewotCQljbGtfZGF0YS0+Y2xrX251bSA9IEFSUkFZX1NJWkUoYXVkaW9fbXNtX2h3cyk7Ci0JCWNsa19kYXRhLT5jbGtzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJCWNsa19kYXRhLT5jbGtfbnVtICoKLQkJCQkJc2l6ZW9mKHN0cnVjdCBjbGsgKiksCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIWNsa19kYXRhLT5jbGtzKQotCQkJZ290byBlcnJfY2xrOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGF1ZGlvX21zbV9od3MpOyBpKyspIHsKLQkJCWF1ZGlvX2NsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgYXVkaW9fbXNtX2h3c1tpXSk7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvX2NsaykpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSIlczogcmVmIGNsb2NrOiAlZCByZWdpc3RlciBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBpKTsKLQkJCQlyZXR1cm4gUFRSX0VSUihhdWRpb19jbGspOwotCQkJfQotCQkJY2xrX2RhdGEtPmNsa3NbaV0gPSBhdWRpb19jbGs7Ci0JCX0KLQl9IGVsc2UgewotCQljbGtfZGF0YS0+Y2xrX251bSA9IEFSUkFZX1NJWkUoYXVkaW9fbXNtX2h3czEpOwotCQljbGtfZGF0YS0+Y2xrcyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCQljbGtfZGF0YS0+Y2xrX251bSAqCi0JCQkJCXNpemVvZihzdHJ1Y3QgY2xrICopLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFjbGtfZGF0YS0+Y2xrcykKLQkJCWdvdG8gZXJyX2NsazsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdWRpb19tc21faHdzMSk7IGkrKykgewotCQkJYXVkaW9fY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCBhdWRpb19tc21faHdzMVtpXSk7Ci0JCQlpZiAoSVNfRVJSKGF1ZGlvX2NsaykpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSIlczogcmVmIGNsb2NrOiAlZCByZWdpc3RlciBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBpKTsKLQkJCQlyZXR1cm4gUFRSX0VSUihhdWRpb19jbGspOwotCQkJfQotCQkJY2xrX2RhdGEtPmNsa3NbaV0gPSBhdWRpb19jbGs7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCW9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBhdWRpbyByZWYgY2xvY2sgcmVnaXN0ZXIgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9ncGlvOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfY2xrOgotCWlmIChjbGtfZGF0YSkKLQkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBjbGtfZGF0YS0+Y2xrcyk7Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBjbGtfZGF0YSk7Ci1lcnJfZ3BpbzoKLQlncGlvX2ZyZWUoY2xrX2dwaW8pOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdWRpb19yZWZfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwaW5jdHJsX2luZm8gKnBuY3RybF9pbmZvID0gJmF1ZGlvX2FwX2NsazIucG5jdHJsX2luZm87Ci0KLQlpZiAoYXVkaW9fcG1pX2Nsay5ncGlvID4gMCkKLQkJZ3Bpb19mcmVlKGF1ZGlvX3BtaV9jbGsuZ3Bpbyk7Ci0JZWxzZSBpZiAoYXVkaW9fYXBfY2xrLmdwaW8gPiAwKQotCQlncGlvX2ZyZWUoYXVkaW9fYXBfY2xrLmdwaW8pOwotCi0JaWYgKHBuY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCWRldm1fcGluY3RybF9wdXQocG5jdHJsX2luZm8tPnBpbmN0cmwpOwotCQlwbmN0cmxfaW5mby0+cGluY3RybCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF1ZGlvX3JlZl9jbGtfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxhdWRpby1yZWYtY2xrIn0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdWRpb19yZWZfY2xrX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXVkaW9fcmVmX2Nsa19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYXVkaW8tcmVmLWNsayIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBhdWRpb19yZWZfY2xrX21hdGNoLAotCX0sCi0JLnByb2JlID0gYXVkaW9fcmVmX2Nsa19wcm9iZSwKLQkucmVtb3ZlID0gYXVkaW9fcmVmX2Nsa19yZW1vdmUsCi19OwotCi1pbnQgYXVkaW9fcmVmX2Nsa19wbGF0Zm9ybV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXVkaW9fcmVmX2Nsa19kcml2ZXIpOwotfQotCi12b2lkIGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdWRpb19yZWZfY2xrX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQXVkaW8gUmVmIFVwIENsb2NrIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtX2hkbWlfY29kZWNfcnguYyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtX2hkbWlfY29kZWNfcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjZmU3ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9oZG1pX2NvZGVjX3J4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9leHRfZGlzcGxheS5oPgotCi0jZGVmaW5lIE1TTV9FWFRfRElTUF9QQ01fUkFURVMJU05EUlZfUENNX1JBVEVfNDgwMDAKLSNkZWZpbmUgQVVEX0VYVF9ESVNQX0FDS19ESVNDT05ORUNUIChBVURJT19BQ0tfQ09OTkVDVCBeIEFVRElPX0FDS19DT05ORUNUKQotI2RlZmluZSBBVURfRVhUX0RJU1BfQUNLX0NPTk5FQ1QgICAgKEFVRElPX0FDS19DT05ORUNUKQotI2RlZmluZSBBVURfRVhUX0RJU1BfQUNLX0VOQUJMRSAgICAgKEFVRElPX0FDS19TRVRfRU5BQkxFIHwgQVVESU9fQUNLX0VOQUJMRSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGV4dF9kaXNwX2F1ZGlvX3R5cGVfdGV4dFtdID0geyJOb25lIiwgIkhETUkiLCAiRFAifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBleHRfZGlzcF9hdWRpb19hY2tfdGV4dFtdID0geyJEaXNjb25uZWN0IiwgICJDb25uZWN0IiwKLQkJCQkJCSAgICAgICJBY2tfRW5hYmxlIn07Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3BfYXVkaW9fdHlwZSwgZXh0X2Rpc3BfYXVkaW9fdHlwZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3BfYXVkaW9fYWNrX3N0YXRlLAotCQkJCWV4dF9kaXNwX2F1ZGlvX2Fja190ZXh0KTsKLQotc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpleHRfZGlzcF9jb3JlX3BkZXY7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19vcHMgZXh0X2Rpc3Bfb3BzOwotCWludCBjYWJsZV9zdGF0dXM7Ci19OwotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9lZGlkX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGE7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19lZGlkX2JsayBlZGlkX2JsazsKLQlpbnQgcmM7Ci0KLQljb2RlY19kYXRhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoIWNvZGVjX2RhdGEpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNvZGVjX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfYXVkaW9fZWRpZF9ibGspIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGdldF9hdWRpb19lZGlkX2JsaygpIGlzIE5VTExcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKLQkJdWluZm8tPmNvdW50ID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmMgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuZ2V0X2F1ZGlvX2VkaWRfYmxrKAotCQkJCWNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwgJmVkaWRfYmxrKTsKLQlpZiAocmMgPj0gMCkgewotCQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JCXVpbmZvLT5jb3VudCA9IGVkaWRfYmxrLmF1ZGlvX2RhdGFfYmxrX3NpemUgKwotCQkJZWRpZF9ibGsuc3BrX2FsbG9jX2RhdGFfYmxrX3NpemU7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNvdW50OiAlZFxuIiwgX19mdW5jX18sIHVpbmZvLT5jb3VudCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2VkaWRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKSB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOwotCXN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fZWRpZF9ibGsgZWRpZF9ibGs7Ci0JaW50IHJjOwotCi0JY29kZWNfZGF0YSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWlmICghY29kZWNfZGF0YSB8fCAhY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmdldF9hdWRpb19lZGlkX2JsaykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWNfZGF0YSBvciBnZXRfYXVkaW9fZWRpZF9ibGsoKSBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IGNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5nZXRfYXVkaW9fZWRpZF9ibGsoCi0JCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYsICZlZGlkX2Jsayk7Ci0JaWYgKHJjID49IDApIHsKLQkJaWYgKHNpemVvZih1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSkgPAotCQkJICAoZWRpZF9ibGsuYXVkaW9fZGF0YV9ibGtfc2l6ZSArCi0JCQkgICBlZGlkX2Jsay5zcGtfYWxsb2NfZGF0YV9ibGtfc2l6ZSkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgRURJRCBkYXRhXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAotCQkgICAgICAgZWRpZF9ibGsuYXVkaW9fZGF0YV9ibGssCi0JCSAgICAgICBlZGlkX2Jsay5hdWRpb19kYXRhX2Jsa19zaXplKTsKLQkJbWVtY3B5KCh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSArCi0JCSAgICAgICBlZGlkX2Jsay5hdWRpb19kYXRhX2Jsa19zaXplKSwKLQkJICAgICAgIGVkaWRfYmxrLnNwa19hbGxvY19kYXRhX2JsaywKLQkJICAgICAgIGVkaWRfYmxrLnNwa19hbGxvY19kYXRhX2Jsa19zaXplKTsKLQotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGF0YV9ibGtfc2l6ZTolZCwgc3BrX2FsbG9jX2RhdGFfYmxrX3NpemU6JWRcbiIsCi0JCQlfX2Z1bmNfXywgZWRpZF9ibGsuYXVkaW9fZGF0YV9ibGtfc2l6ZSwKLQkJCWVkaWRfYmxrLnNwa19hbGxvY19kYXRhX2Jsa19zaXplKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2F1ZGlvX3R5cGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGE7Ci0JZW51bSBtc21fZXh0X2Rpc3BfY2FibGVfc3RhdGUgY2FibGVfc3RhdGU7Ci0JZW51bSBtc21fZXh0X2Rpc3BfdHlwZSBkaXNwX3R5cGU7Ci0JaW50IHJjOwotCi0JY29kZWNfZGF0YSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWlmICghY29kZWNfZGF0YSB8fAotCSAgICAhY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmdldF9hdWRpb19lZGlkX2JsayB8fAotCSAgICAhY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmdldF9pbnRmX2lkKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjb2RlY19kYXRhLCBnZXRfYXVkaW9fZWRpZF9ibGsoKSBvciBnZXRfaW50Zl9pZCBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljYWJsZV9zdGF0ZSA9IGNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5jYWJsZV9zdGF0dXMoCi0JCQkJICAgY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2LCAxKTsKLQlpZiAoY2FibGVfc3RhdGUgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciByZXRyaWV2aW5nIGNhYmxlIHN0YXRlIGZyb20gZXh0X2Rpc3AsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCBjYWJsZV9zdGF0ZSk7Ci0JCXJjID0gY2FibGVfc3RhdGU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMgPSBjYWJsZV9zdGF0ZTsKLQlpZiAoY2FibGVfc3RhdGUgPT0gRVhUX0RJU1BMQVlfQ0FCTEVfRElTQ09OTkVDVCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRGlzcGxheSBjYWJsZSBkaXNjb25uZWN0ZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQkJcmMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGlzcF90eXBlID0gY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzLmdldF9pbnRmX2lkKAotCQkJCQkJY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2KTsKLQlpZiAoZGlzcF90eXBlID49IDApIHsKLQkJc3dpdGNoIChkaXNwX3R5cGUpIHsKLQkJY2FzZSBFWFRfRElTUExBWV9UWVBFX0RQOgotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVhUX0RJU1BMQVlfVFlQRV9IRE1JOgotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQkJcmMgPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkaXNwX3R5cGU6JWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGRpc3BfdHlwZSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc3BsYXkgdHlwZTogJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGlzcF90eXBlKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IgcmV0cmlldmluZyBkaXNwX3R5cGUgZnJvbSBleHRfZGlzcCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIGRpc3BfdHlwZSk7Ci0JCXJjID0gZGlzcF90eXBlOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2F1ZGlvX2Fja19zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOwotCXUzMiBhY2tfc3RhdGUgPSAwOwotCWludCByYzsKLQotCWNvZGVjX2RhdGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpZiAoIWNvZGVjX2RhdGEgfHwKLQkgICAgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5hY2tub3dsZWRnZSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IGNvZGVjX2RhdGEgb3Igb3BzIGFja25vd2xlZGdlKCkgaXMgTlVMTFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKSB7Ci0JY2FzZSAwOgotCQlhY2tfc3RhdGUgPSBBVURfRVhUX0RJU1BfQUNLX0RJU0NPTk5FQ1Q7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJYWNrX3N0YXRlID0gQVVEX0VYVF9ESVNQX0FDS19DT05ORUNUOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWFja19zdGF0ZSA9IEFVRF9FWFRfRElTUF9BQ0tfRU5BQkxFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FSU5WQUw7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogaW52YWxpZCB2YWx1ZSAlZCBmb3IgbWl4ZXIgY3RsXG4iLAotCQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjb250cm9sICVkLCBhY2sgc2V0IHZhbHVlIDB4JXhcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdLCBhY2tfc3RhdGUpOwotCi0JcmMgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuYWNrbm93bGVkZ2UoCi0JCQkgY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2LCBhY2tfc3RhdGUpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGVycm9yIGZyb20gYWNrbm93bGVkZ2UoKSwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX2V4dF9kaXNwX2NvZGVjX3J4X2NvbnRyb2xzW10gPSB7Ci0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfAotCQkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCi0JCS5pZmFjZSAgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lICAgPSAiSERNSSBFRElEIiwKLQkJLmluZm8gICA9IG1zbV9leHRfZGlzcF9lZGlkX2N0bF9pbmZvLAotCQkuZ2V0ICAgID0gbXNtX2V4dF9kaXNwX2VkaWRfZ2V0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfAotCQkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCi0JCS5pZmFjZSAgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lICAgPSAiRGlzcGxheSBQb3J0IEVESUQiLAotCQkuaW5mbyAgID0gbXNtX2V4dF9kaXNwX2VkaWRfY3RsX2luZm8sCi0JCS5nZXQgICAgPSBtc21fZXh0X2Rpc3BfZWRpZF9nZXQsCi0JfSwKLQlTT0NfRU5VTV9FWFQoIkV4dGVybmFsIERpc3BsYXkgVHlwZSIsIGV4dF9kaXNwX2F1ZGlvX3R5cGUsCi0JCSAgICAgbXNtX2V4dF9kaXNwX2F1ZGlvX3R5cGVfZ2V0LCBOVUxMKSwKLQlTT0NfRU5VTV9FWFQoIkV4dGVybmFsIERpc3BsYXkgQXVkaW8gQWNrIiwgZXh0X2Rpc3BfYXVkaW9fYWNrX3N0YXRlLAotCQkgICAgIE5VTEwsIG1zbV9leHRfZGlzcF9hdWRpb19hY2tfc2V0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9zdGFydHVwKAotCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhID0KLQkJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmNvZGVjLT5kZXYpOwotCi0JaWYgKCFjb2RlY19kYXRhIHx8ICFjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuY2FibGVfc3RhdHVzKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlcygpIGNvZGVjX2RhdGEgb3IgY2FibGVfc3RhdHVzIGlzIG51bGxcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cyA9Ci0JCWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5jYWJsZV9zdGF0dXMoCi0JCWNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwgMSk7Ci0JaWYgKGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYWktPmRldiwKLQkJCSIlcygpIGV4dCBkaXNwIGNvcmUgaXMgbm90IHJlYWR5IChyZXQgdmFsID0gJWQpXG4iLAotCQkJX19mdW5jX18sIGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cyk7Ci0JCXJldCA9IGNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1czsKLQl9IGVsc2UgaWYgKCFjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMpIHsKLQkJZGV2X2VycihkYWktPmRldiwKLQkJCSIlcygpIGV4dCBkaXNwIGNhYmxlIGlzIG5vdCBjb25uZWN0ZWQgKHJldCB2YWwgPSAlZClcbiIsCi0JCQlfX2Z1bmNfXywgY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfaHdfcGFyYW1zKAotCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXUzMiBjaGFubmVsX2FsbG9jYXRpb24gPSAwOwotCXUzMiBsZXZlbF9zaGlmdCAgPSAwOyAvKiAwZEIgKi8KLQlib29sIGRvd25fbWl4ID0gMDsKLQl1MzIgbnVtX2NoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX3NldHVwX3BhcmFtcyBhdWRpb19zZXR1cF9wYXJhbXMgPSB7MH07Ci0KLQlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGEgPQotCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+Y29kZWMtPmRldik7Ci0KLQlpZiAoIWNvZGVjX2RhdGEgfHwgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5hdWRpb19pbmZvX3NldHVwKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogY29kZWNfZGF0YSBvciBhdWRpb19pbmZvX3NldHVwIGlzIG51bGxcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMgPCAwKSB7Ci0JCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGFpLT5kZXYsCi0JCQkiJXMoKSBleHQgZGlzcCBjb3JlIGlzIG5vdCByZWFkeSAocmV0IHZhbCA9ICVkKVxuIiwKLQkJCV9fZnVuY19fLCBjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMpOwotCQlyZXR1cm4gY29kZWNfZGF0YS0+Y2FibGVfc3RhdHVzOwotCX0gZWxzZSBpZiAoIWNvZGVjX2RhdGEtPmNhYmxlX3N0YXR1cykgewotCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGRhaS0+ZGV2LAotCQkJIiVzKCkgZXh0IGRpc3AgY2FibGUgaXMgbm90IGNvbm5lY3RlZCAocmV0IHZhbCA9ICVkKVxuIiwKLQkJCV9fZnVuY19fLCBjb2RlY19kYXRhLT5jYWJsZV9zdGF0dXMpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKnJlZmVyIHRvIEhETUkgc3BlYyBDRUEtODYxLUU6IFRhYmxlIDI4IEF1ZGlvIEluZm9GcmFtZSBEYXRhIEJ5dGUgNCovCi0Jc3dpdGNoIChudW1fY2hhbm5lbHMpIHsKLQljYXNlIDI6Ci0JCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAwOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAweDAyOy8qZGVmYXVsdCB0byBGTC9GUi9GQyovCi0JCWF1ZGlvX3NldHVwX3BhcmFtcy5zYW1wbGVfcHJlc2VudCA9IDB4MzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQljaGFubmVsX2FsbG9jYXRpb24gID0gMHgwNjsvKmRlZmF1bHQgdG8gRkwvRlIvRkMvUkMqLwotCQlhdWRpb19zZXR1cF9wYXJhbXMuc2FtcGxlX3ByZXNlbnQgPSAweDc7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJY2hhbm5lbF9hbGxvY2F0aW9uICA9IDB4MEE7LypkZWZhdWx0IHRvIEZML0ZSL0ZDL1JSL1JMKi8KLQkJYXVkaW9fc2V0dXBfcGFyYW1zLnNhbXBsZV9wcmVzZW50ID0gMHg3OwotCQlicmVhazsKLQljYXNlIDY6Ci0JCWNoYW5uZWxfYWxsb2NhdGlvbiAgPSAweDBCOwotCQlhdWRpb19zZXR1cF9wYXJhbXMuc2FtcGxlX3ByZXNlbnQgPSAweDc7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJY2hhbm5lbF9hbGxvY2F0aW9uICA9IDB4MTI7LypkZWZhdWx0IHRvIEZML0ZSL0ZDL1JML1JSL1JSQy9STEMqLwotCQlhdWRpb19zZXR1cF9wYXJhbXMuc2FtcGxlX3ByZXNlbnQgPSAweGY7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJY2hhbm5lbF9hbGxvY2F0aW9uICA9IDB4MTM7Ci0JCWF1ZGlvX3NldHVwX3BhcmFtcy5zYW1wbGVfcHJlc2VudCA9IDB4ZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmRldiwgImludmFsaWQgQ2hhbm5lbHMgPSAldVxuIiwgbnVtX2NoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyhkYWktPmRldiwKLQkJIiVzKCkgbnVtX2NoICV1ICBzYW1wbGVyYXRlICV1IGNoYW5uZWxfYWxsb2NhdGlvbiA9ICV1XG4iLAotCQlfX2Z1bmNfXywgbnVtX2NoYW5uZWxzLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAotCQljaGFubmVsX2FsbG9jYXRpb24pOwotCi0JYXVkaW9fc2V0dXBfcGFyYW1zLnNhbXBsZV9yYXRlX2h6ID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQlhdWRpb19zZXR1cF9wYXJhbXMubnVtX29mX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOwotCWF1ZGlvX3NldHVwX3BhcmFtcy5jaGFubmVsX2FsbG9jYXRpb24gPSBjaGFubmVsX2FsbG9jYXRpb247Ci0JYXVkaW9fc2V0dXBfcGFyYW1zLmxldmVsX3NoaWZ0ID0gbGV2ZWxfc2hpZnQ7Ci0JYXVkaW9fc2V0dXBfcGFyYW1zLmRvd25fbWl4ID0gZG93bl9taXg7Ci0KLQlyYyA9IGNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy5hdWRpb19pbmZvX3NldHVwKAotCQkJY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2LCAmYXVkaW9fc2V0dXBfcGFyYW1zKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGFpLT5kZXYsCi0JCQkiJXMoKSBleHQgZGlzcCBjb3JlIGlzIG5vdCByZWFkeSwgcmM6ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfc2h1dGRvd24oCi0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlpbnQgcmM7Ci0KLQlzdHJ1Y3QgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhdGEgKmNvZGVjX2RhdGEgPQotCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+Y29kZWMtPmRldik7Ci0KLQlpZiAoIWNvZGVjX2RhdGEgfHwgIWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy50ZWFyZG93bl9kb25lIHx8Ci0JICAgICFjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuY2FibGVfc3RhdHVzKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogY29kZWMgZGF0YSBvciB0ZWFyZG93bl9kb25lIG9yIGNhYmxlX3N0YXR1cyBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcmMgPSBjb2RlY19kYXRhLT5leHRfZGlzcF9vcHMuY2FibGVfc3RhdHVzKAotCQkJY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2LCAwKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6IGV4dCBkaXNwIGNvcmUgaGFkIHByb2JsZW1zIHJlbGVhc2luZyBhdWRpbyBmbGFnXG4iLAotCQkJX19mdW5jX18pOwotCX0KLQotCWNvZGVjX2RhdGEtPmV4dF9kaXNwX29wcy50ZWFyZG93bl9kb25lKAotCQljb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYpOwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYXRhICpjb2RlY19kYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZV9wYXJlbnQgPSBOVUxMOwotCi0JY29kZWNfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGF0YSksCi0JCUdGUF9LRVJORUwpOwotCi0JaWYgKCFjb2RlY19kYXRhKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzKCk6IGZhaWwgdG8gYWxsb2NhdGUgZGFpIGRhdGFcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlvZl9ub2RlX3BhcmVudCA9IG9mX2dldF9wYXJlbnQoY29kZWMtPmRldi0+b2Zfbm9kZSk7Ci0JaWYgKCFvZl9ub2RlX3BhcmVudCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcygpOiBQYXJlbnQgZGV2aWNlIHRyZWUgbm9kZSBub3QgZm91bmRcbiIsCi0JCQkJX19mdW5jX18pOwotCQlrZnJlZShjb2RlY19kYXRhKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JY29kZWNfZGF0YS0+ZXh0X2Rpc3BfY29yZV9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShvZl9ub2RlX3BhcmVudCk7Ci0JaWYgKCFjb2RlY19kYXRhLT5leHRfZGlzcF9jb3JlX3BkZXYpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMoKTogY2FuJ3QgZ2V0IHBhcmVudCBwZGV2XG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlKGNvZGVjX2RhdGEpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAobXNtX2V4dF9kaXNwX3JlZ2lzdGVyX2F1ZGlvX2NvZGVjKGNvZGVjX2RhdGEtPmV4dF9kaXNwX2NvcmVfcGRldiwKLQkJCQkmY29kZWNfZGF0YS0+ZXh0X2Rpc3Bfb3BzKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcygpOiBjYW4ndCByZWdpc3RlciB3aXRoIGV4dCBkaXNwIGNvcmUiLAotCQkJCV9fZnVuY19fKTsKLQkJa2ZyZWUoY29kZWNfZGF0YSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWRldl9zZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LCBjb2RlY19kYXRhKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzKCk6IHJlZ2lzdGVyZWQgJXMgd2l0aCBleHQgZGlzcCBjb3JlXG4iLAotCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGF0YSAqY29kZWNfZGF0YTsKLQotCWNvZGVjX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7Ci0Ja2ZyZWUoY29kZWNfZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAgICA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfc3RhcnR1cCwKLQkuaHdfcGFyYW1zID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9od19wYXJhbXMsCi0JLnNodXRkb3duICA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfc2h1dGRvd24KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlzW10gPSB7Ci0JewotCQkubmFtZSA9ICJtc21faGRtaV9hdWRpb19jb2RlY19yeF9kYWkiLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSERNSSBQbGF5YmFjayIsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gNDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5yYXRlcyA9IE1TTV9FWFRfRElTUF9QQ01fUkFURVMsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQl9LAotCQkub3BzID0gJm1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJtc21fZHBfYXVkaW9fY29kZWNfcnhfZGFpIiwKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gNDgwMDAsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2RhaV9vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3NvY19kcml2ZXIgPSB7Ci0JLnByb2JlID0gbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3Byb2JlLAotCS5yZW1vdmUgPSAgbXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X3JlbW92ZSwKLQkuY29tcG9uZW50X2RyaXZlciA9IHsKLQkJLmNvbnRyb2xzID0gbXNtX2V4dF9kaXNwX2NvZGVjX3J4X2NvbnRyb2xzLAotCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtc21fZXh0X2Rpc3BfY29kZWNfcnhfY29udHJvbHMpLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wbGF0X3Byb2JlKAotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzKCk6IGRldiBuYW1lICVzXG4iLCBfX2Z1bmNfXywKLQkJZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldiwKLQkJJm1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9zb2NfZHJpdmVyLAotCQltc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGFpcywKLQkJQVJSQVlfU0laRShtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZGFpcykpOwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wbGF0X3JlbW92ZSgKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZHRfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IiwgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9wbGF0X3Byb2JlLAotCS5yZW1vdmUgPSBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfcGxhdF9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfaW5pdCh2b2lkKQotewotCWludCByYzsKLQotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZXh0X2Rpc3BfYXVkaW9fY29kZWNfcnhfZHJpdmVyKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dCBkaXNwIGNvZGVjIGRyaXZlciBlcnI6JWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCX0KLQotCXJldHVybiByYzsKLX0KLW1vZHVsZV9pbml0KG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9leHRfZGlzcF9hdWRpb19jb2RlY19yeF9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX2V4dF9kaXNwX2F1ZGlvX2NvZGVjX3J4X2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBFeHRlcm5hbCBEaXNwbGF5IEF1ZGlvIENPREVDIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkN2M4Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotY29uZmlnIFNORF9TT0NfTVNNX1NEVwotCXRyaXN0YXRlICJNU00gSW50ZXJuYWwgc291bmR3aXJlIGNvZGVjIgotCSBoZWxwCi0JIE1TTS1iYXNlZCBzb3VuZHdpcmUgY29kZWMgY29yZSBkcml2ZXIKLQkgc3VwcG9ydGVkIGFsb25nIHdpdGggaW50ZXJuYWwgZGlnaXRhbAotCSBjb2RlYyBjb3JlLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU5MzJiLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3Nkdy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc25kLXNvYy1tc20tc2R3LW9ianMgOj0gbXNtX3Nkd19jZGMubyBtc21fc2R3X3JlZ21hcC5vIG1zbS1zZHctdGFibGVzLm8gbXNtX3Nkd19jZGNfdXRpbHMubwotb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNX1NEVykJKz0gc25kLXNvYy1tc20tc2R3Lm8KLWNjZmxhZ3MteSArPSAtSSQoc3JjdHJlZSkvc291bmQvc29jL21zbQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbS1zZHctdGFibGVzLmMgYi9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtLXNkdy10YWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MTgwNS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtLXNkdy10YWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlICJtc21fc2R3LmgiCi0KLWNvbnN0IHU4IG1zbV9zZHdfcGFnZV9tYXBbTVNNX1NEV19NQVhfUkVHSVNURVJdID0gewotCVtNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVExdID0gMHhhLAotCVtNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDB4YSwKLQlbTVNNX1NEV19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTF0gPSAweGEsCi0JW01TTV9TRFdfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDB4YSwKLQlbTVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTF0gPSAweGEsCi0JW01TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDB4YSwKLQlbTVNNX1NEV19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTF0gPSAweGEsCi0JW01TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDB4YSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDBdID0gMHhiLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMV0gPSAweGIsCi0JW01TTV9TRFdfQ09NUEFOREVSN19DVEwyXSA9IDB4YiwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDNdID0gMHhiLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNF0gPSAweGIsCi0JW01TTV9TRFdfQ09NUEFOREVSN19DVEw1XSA9IDB4YiwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDZdID0gMHhiLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMN10gPSAweGIsCi0JW01TTV9TRFdfQ09NUEFOREVSOF9DVEwwXSA9IDB4YiwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDFdID0gMHhiLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMl0gPSAweGIsCi0JW01TTV9TRFdfQ09NUEFOREVSOF9DVEwzXSA9IDB4YiwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDRdID0gMHhiLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNV0gPSAweGIsCi0JW01TTV9TRFdfQ09NUEFOREVSOF9DVEw2XSA9IDB4YiwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDddID0gMHhiLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX0NUTF0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMF0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMV0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMl0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1ZPTF9DVExdID0gMHhiLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9DVExdID0gMHhiLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9DRkddID0gMHhiLAotCVtNU01fU0RXX1JYN19SWF9WT0xfTUlYX0NUTF0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMF0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMV0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMl0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDM10gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDNV0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDNl0gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDN10gPSAweGIsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX1NFQzBdID0gMHhiLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9TRUMxXSA9IDB4YiwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9DVExdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzBdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzFdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzJdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9WT0xfQ1RMXSA9IDB4YiwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ1RMXSA9IDB4YiwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ0ZHXSA9IDB4YiwKLQlbTVNNX1NEV19SWDhfUlhfVk9MX01JWF9DVExdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzBdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzFdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzJdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzNdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzVdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzZdID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzddID0gMHhiLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9TRUMwXSA9IDB4YiwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfU0VDMV0gPSAweGIsCi0JW01TTV9TRFdfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMXSA9IDB4YywKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfQ1RMXSA9IDB4YywKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfQ0ZHMV0gPSAweGMsCi0JW01TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzJdID0gMHhjLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9QQVRIX0NUTF0gPSAweGMsCi0JW01TTV9TRFdfQk9PU1QxX0JPT1NUX0NUTF0gPSAweGMsCi0JW01TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzFdID0gMHhjLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9DRkcyXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMF0gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzFdID0gMHhjLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8yXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfM10gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzBdID0gMHhjLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8xXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfMl0gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzNdID0gMHhjLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8wXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMV0gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzJdID0gMHhjLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8zXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfMF0gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzFdID0gMHhjLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8yXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfM10gPSAweGMsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9BQ0NFU1NfQ0ZHXSA9IDB4YywKLQlbTVNNX1NEV19BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVNdID0gMHhjLAotCVtNU01fU0RXX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0xdID0gMHhkLAotCVtNU01fU0RXX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTF0gPSAweGQsCi0JW01TTV9TRFdfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MXSA9IDB4ZCwKLQlbTVNNX1NEV19UT1BfVE9QX0NGRzBdID0gMHhkLAotCVtNU01fU0RXX1RPUF9UT1BfQ0ZHMV0gPSAweGQsCi0JW01TTV9TRFdfVE9QX1JYX0kyU19DVExdID0gMHhkLAotCVtNU01fU0RXX1RPUF9UWF9JMlNfQ1RMXSA9IDB4ZCwKLQlbTVNNX1NEV19UT1BfSTJTX0NMS10gPSAweGQsCi0JW01TTV9TRFdfVE9QX1JYN19QQVRIX0lOUFVUMF9NVVhdID0gMHhkLAotCVtNU01fU0RXX1RPUF9SWDdfUEFUSF9JTlBVVDFfTVVYXSA9IDB4ZCwKLQlbTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWF0gPSAweGQsCi0JW01TTV9TRFdfVE9QX1JYOF9QQVRIX0lOUFVUMV9NVVhdID0gMHhkLAotCVtNU01fU0RXX1RPUF9GUkVRX01DTEtdID0gMHhkLAotCVtNU01fU0RXX1RPUF9ERUJVR19CVVNfU0VMXSA9IDB4ZCwKLQlbTVNNX1NEV19UT1BfREVCVUdfRU5dID0gMHhkLAotCVtNU01fU0RXX1RPUF9JMlNfUkVTRVRdID0gMHhkLAotCVtNU01fU0RXX1RPUF9CTE9DS1NfUkVTRVRdID0gMHhkLAotfTsKLQotY29uc3QgdTggbXNtX3Nkd19yZWdfcmVhZGFibGVbTVNNX1NEV19NQVhfUkVHSVNURVJdID0gewotCVtNU01fU0RXX1BBR0VfUkVHSVNURVJdID0gMSwKLQlbTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzBdID0gMSwKLQlbTVNNX1NEV19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMF0gPSAxLAotCVtNU01fU0RXX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzBdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDBdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDFdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDJdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDNdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDRdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDVdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDZdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI3X0NUTDddID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDBdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDFdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDJdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDNdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDRdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDVdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDZdID0gMSwKLQlbTVNNX1NEV19DT01QQU5ERVI4X0NUTDddID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMV0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX0NGRzJdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfVk9MX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9NSVhfQ0ZHXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1ZPTF9NSVhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMF0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX1NFQzFdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMyXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDM10gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX1NFQzVdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9TRUM2XSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDN10gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9TRUMwXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX1NFQzFdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfQ0ZHMV0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzJdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfVk9MX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ0ZHXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1ZPTF9NSVhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfU0VDMF0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzFdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMyXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfU0VDM10gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzVdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9TRUM2XSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfU0VDN10gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9TRUMwXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfTUlYX1NFQzFdID0gMSwKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfQ1RMXSA9IDEsCi0JW01TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzFdID0gMSwKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfQ0ZHMl0gPSAxLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9DVExdID0gMSwKLQlbTVNNX1NEV19CT09TVDFfQk9PU1RfQ0ZHMV0gPSAxLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9DRkcyXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzBdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMV0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8yXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzNdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfMF0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8xXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzJdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfM10gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8wXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzFdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMl0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8zXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzBdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfMV0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8yXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzNdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX0FDQ0VTU19DRkddID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX0FDQ0VTU19TVEFUVVNdID0gMSwKLQlbTVNNX1NEV19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfVE9QX1RPUF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfVE9QX1RPUF9DRkcxXSA9IDEsCi0JW01TTV9TRFdfVE9QX1JYX0kyU19DVExdID0gMSwKLQlbTVNNX1NEV19UT1BfVFhfSTJTX0NUTF0gPSAxLAotCVtNU01fU0RXX1RPUF9SWDdfUEFUSF9JTlBVVDBfTVVYXSA9IDEsCi0JW01TTV9TRFdfVE9QX1JYN19QQVRIX0lOUFVUMV9NVVhdID0gMSwKLQlbTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWF0gPSAxLAotCVtNU01fU0RXX1RPUF9SWDhfUEFUSF9JTlBVVDFfTVVYXSA9IDEsCi0JW01TTV9TRFdfVE9QX0ZSRVFfTUNMS10gPSAxLAotCVtNU01fU0RXX1RPUF9ERUJVR19CVVNfU0VMXSA9IDEsCi0JW01TTV9TRFdfVE9QX0RFQlVHX0VOXSA9IDEsCi0JW01TTV9TRFdfVE9QX0kyU19SRVNFVF0gPSAxLAotCVtNU01fU0RXX1RPUF9CTE9DS1NfUkVTRVRdID0gMSwKLX07Ci0KLWNvbnN0IHU4IG1zbV9zZHdfcmVnX3dyaXRlYWJsZVtNU01fU0RXX01BWF9SRUdJU1RFUl0gPSB7Ci0JW01TTV9TRFdfUEFHRV9SRUdJU1RFUl0gPSAxLAotCVtNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMF0gPSAxLAotCVtNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DVExdID0gMSwKLQlbTVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzBdID0gMSwKLQlbTVNNX1NEV19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ0ZHMF0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMF0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMV0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMl0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMM10gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNF0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNV0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMN10gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMF0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMV0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMl0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMM10gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNF0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNV0gPSAxLAotCVtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMN10gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX0NGRzBdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9DRkcxXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMl0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9WT0xfQ1RMXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX01JWF9DRkddID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfVk9MX01JWF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMwXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMV0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX1NFQzJdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMzXSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfU0VDNV0gPSAxLAotCVtNU01fU0RXX1JYN19SWF9QQVRIX1NFQzZdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9TRUM3XSA9IDEsCi0JW01TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX1NFQzBdID0gMSwKLQlbTVNNX1NEV19SWDdfUlhfUEFUSF9NSVhfU0VDMV0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzBdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9DRkcxXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfQ0ZHMl0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9WT0xfQ1RMXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfTUlYX0NUTF0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9DRkddID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfVk9MX01JWF9DVExdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMwXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfU0VDMV0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzJdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMzXSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfU0VDNV0gPSAxLAotCVtNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzZdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9TRUM3XSA9IDEsCi0JW01TTV9TRFdfUlg4X1JYX1BBVEhfTUlYX1NFQzBdID0gMSwKLQlbTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfU0VDMV0gPSAxLAotCVtNU01fU0RXX0JPT1NUMF9CT09TVF9QQVRIX0NUTF0gPSAxLAotCVtNU01fU0RXX0JPT1NUMF9CT09TVF9DVExdID0gMSwKLQlbTVNNX1NEV19CT09TVDBfQk9PU1RfQ0ZHMV0gPSAxLAotCVtNU01fU0RXX0JPT1NUMF9CT09TVF9DRkcyXSA9IDEsCi0JW01TTV9TRFdfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMXSA9IDEsCi0JW01TTV9TRFdfQk9PU1QxX0JPT1NUX0NUTF0gPSAxLAotCVtNU01fU0RXX0JPT1NUMV9CT09TVF9DRkcxXSA9IDEsCi0JW01TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzJdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMF0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8xXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzJdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfM10gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8wXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzFdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfMl0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8zXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzBdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMV0gPSAxLAotCVtNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8yXSA9IDEsCi0JW01TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzNdID0gMSwKLQlbTVNNX1NEV19BSEJfQlJJREdFX0FDQ0VTU19DRkddID0gMSwKLQlbTVNNX1NEV19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MXSA9IDEsCi0JW01TTV9TRFdfVE9QX1RPUF9DRkcwXSA9IDEsCi0JW01TTV9TRFdfVE9QX1RPUF9DRkcxXSA9IDEsCi0JW01TTV9TRFdfVE9QX1JYX0kyU19DVExdID0gMSwKLQlbTVNNX1NEV19UT1BfVFhfSTJTX0NUTF0gPSAxLAotCVtNU01fU0RXX1RPUF9SWDdfUEFUSF9JTlBVVDBfTVVYXSA9IDEsCi0JW01TTV9TRFdfVE9QX1JYN19QQVRIX0lOUFVUMV9NVVhdID0gMSwKLQlbTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWF0gPSAxLAotCVtNU01fU0RXX1RPUF9SWDhfUEFUSF9JTlBVVDFfTVVYXSA9IDEsCi0JW01TTV9TRFdfVE9QX0ZSRVFfTUNMS10gPSAxLAotCVtNU01fU0RXX1RPUF9ERUJVR19CVVNfU0VMXSA9IDEsCi0JW01TTV9TRFdfVE9QX0RFQlVHX0VOXSA9IDEsCi0JW01TTV9TRFdfVE9QX0kyU19SRVNFVF0gPSAxLAotCVtNU01fU0RXX1RPUF9CTE9DS1NfUkVTRVRdID0gMSwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkdy5oIGIvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbV9zZHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2ZWJjNi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIE1TTV9TRFdfSAotI2RlZmluZSBNU01fU0RXX0gKLQotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSAibXNtX3Nkd19yZWdpc3RlcnMuaCIKLQotI2RlZmluZSBNU01fU0RXX01BWF9SRUdJU1RFUiAweDQwMAotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbXNtX3Nkd19yZWdtYXBfY29uZmlnOwotZXh0ZXJuIGNvbnN0IHU4IG1zbV9zZHdfcGFnZV9tYXBbTVNNX1NEV19NQVhfUkVHSVNURVJdOwotZXh0ZXJuIGNvbnN0IHU4IG1zbV9zZHdfcmVnX3JlYWRhYmxlW01TTV9TRFdfTUFYX1JFR0lTVEVSXTsKLWV4dGVybiBjb25zdCB1OCBtc21fc2R3X3JlZ193cml0ZWFibGVbTVNNX1NEV19NQVhfUkVHSVNURVJdOwotCi1lbnVtIHsKLQlNU01fU0RXX1JYNCA9IDAsCi0JTVNNX1NEV19SWDUsCi0JTVNNX1NEV19SWF9NQVgsCi19OwotCi1lbnVtIHsKLQlNU01fU0RXX1RYMCA9IDAsCi0JTVNNX1NEV19UWDEsCi0JTVNNX1NEV19UWF9NQVgsCi19OwotCi1lbnVtIHsKLQlDT01QMSwgLyogU1BLX0wgKi8KLQlDT01QMiwgLyogU1BLX1IgKi8KLQlDT01QX01BWAotfTsKLQotLyoKLSAqIFN0cnVjdHVyZSB1c2VkIHRvIHVwZGF0ZSBjb2RlYwotICogcmVnaXN0ZXIgZGVmYXVsdHMgYWZ0ZXIgcmVzZXQKLSAqLwotc3RydWN0IG1zbV9zZHdfcmVnX21hc2tfdmFsIHsKLQl1MTYgcmVnOwotCXU4IG1hc2s7Ci0JdTggdmFsOwotfTsKLQotLyoKLSAqIFNlbGVjdHMgY29tcGFuZGVyIGFuZCBzbWFydCBib29zdCBzZXR0aW5ncwotICogZm9yIGEgZ2l2ZW4gc3BlYWtlciBtb2RlCi0gKi8KLWVudW0gewotCVNQS1JfTU9ERV9ERUZBVUxULAotCVNQS1JfTU9ERV8xLCAgICAgICAgICAvKiBDT01QIEdhaW4gPSAxMmRCLCBTbWFydGJvb3N0IE1heCA9IDUuNVYgKi8KLX07Ci0KLS8qIFJ4IHBhdGggZ2FpbiBvZmZzZXRzICovCi1lbnVtIHsKLQlSWF9HQUlOX09GRlNFVF9NMVA1X0RCLAotCVJYX0dBSU5fT0ZGU0VUXzBfREIsCi19OwotCi1zdHJ1Y3QgbXNtX3Nkd19yZWdfdmFsIHsKLQl1bnNpZ25lZCBzaG9ydCByZWc7IC8qIHJlZ2lzdGVyIGFkZHJlc3MgKi8KLQl1OCAqYnVmOyAgICAgICAgICAgIC8qIGJ1ZmZlciB0byBiZSB3cml0dGVuIHRvIHJlZy4gYWRkciAqLwotCWludCBieXRlczsgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gKi8KLX07Ci0KLS8qIEhvbGQgaW5zdGFuY2UgdG8gc291bmR3aXJlIHBsYXRmb3JtIGRldmljZSAqLwotc3RydWN0IG1zbV9zZHdfY3RybF9kYXRhIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzZHdfcGRldjsKLX07Ci0KLXN0cnVjdCB3Y2Rfc2R3X2N0cmxfcGxhdGZvcm1fZGF0YSB7Ci0Jdm9pZCAqaGFuZGxlOyAvKiBob2xkcyBjb2RlYyBwcml2YXRlIGRhdGEgKi8KLQlpbnQgKCpyZWFkKSh2b2lkICpoYW5kbGUsIGludCByZWcpOwotCWludCAoKndyaXRlKSh2b2lkICpoYW5kbGUsIGludCByZWcsIGludCB2YWwpOwotCWludCAoKmJ1bGtfd3JpdGUpKHZvaWQgKmhhbmRsZSwgdTMyICpyZWcsIHUzMiAqdmFsLCBzaXplX3QgbGVuKTsKLQlpbnQgKCpjbGspKHZvaWQgKmhhbmRsZSwgYm9vbCBlbmFibGUpOwotCWludCAoKmhhbmRsZV9pcnEpKHZvaWQgKmhhbmRsZSwKLQkJCSAgaXJxcmV0dXJuX3QgKCpzd3JtX2lycV9oYW5kbGVyKShpbnQgaXJxLAotCQkJCQkJCSAgdm9pZCAqZGF0YSksCi0JCQkgIHZvaWQgKnN3cm1faGFuZGxlLAotCQkJICBpbnQgYWN0aW9uKTsKLX07Ci0KLXN0cnVjdCBtc21fc2R3X3ByaXYgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKLQotCWludCAoKnJlYWRfZGV2KShzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LCB1bnNpZ25lZCBzaG9ydCByZWcsCi0JCQlpbnQgYnl0ZXMsIHZvaWQgKmRlc3QpOwotCWludCAoKndyaXRlX2Rldikoc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdywgdW5zaWduZWQgc2hvcnQgcmVnLAotCQkJIGludCBieXRlcywgdm9pZCAqc3JjKTsKLQlpbnQgKCptdWx0aV9yZWdfd3JpdGUpKHN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcsIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50KTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpzZHdfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0JLyogU291bmRXaXJlIGRhdGEgc3RydWN0dXJlICovCi0Jc3RydWN0IG1zbV9zZHdfY3RybF9kYXRhICpzZHdfY3RybF9kYXRhOwotCWludCBucjsKLQotCS8qIGNvbXBhbmRlciAqLwotCWludCBjb21wX2VuYWJsZWRbQ09NUF9NQVhdOwotCWludCBlYXJfc3Brcl9nYWluOwotCi0JLyogdG8gdHJhY2sgdGhlIHN0YXR1cyAqLwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXNtX3Nkd19hZGRfY2hpbGRfZGV2aWNlc193b3JrOwotCXN0cnVjdCB3Y2Rfc2R3X2N0cmxfcGxhdGZvcm1fZGF0YSBzZHdfcGxhdF9kYXRhOwotCi0JdW5zaWduZWQgaW50IHZpX2ZlZWRfdmFsdWU7Ci0KLQlzdHJ1Y3QgbXV0ZXggc2R3X3JlYWRfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggc2R3X3dyaXRlX2xvY2s7Ci0Jc3RydWN0IG11dGV4IHNkd19jbGtfbG9jazsKLQlpbnQgc2R3X2Nsa191c2VyczsKLQlpbnQgc2R3X21jbGtfdXNlcnM7Ci0KLQlpbnQgc2R3X2lycTsKLQlpbnQgaW50X21jbGsxX3JzY19yZWY7Ci0JYm9vbCBpbnRfbWNsazFfZW5hYmxlZDsKLQlib29sIHNkd19ucGxfY2xrX2VuYWJsZWQ7Ci0Jc3RydWN0IG11dGV4IGNkY19pbnRfbWNsazFfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IHNkd19ucGxfY2xrX211dGV4OwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZGlzYWJsZV9pbnRfbWNsazFfd29yazsKLQlzdHJ1Y3QgYWZlX2Nsa19zZXQgc2R3X2NkY19jb3JlX2NsazsKLQlzdHJ1Y3QgYWZlX2Nsa19zZXQgc2R3X25wbF9jbGs7Ci0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNlcnZpY2VfbmI7Ci0JaW50ICgqc2R3X2NkY19ncGlvX2ZuKShib29sIGVuYWJsZSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLQlib29sIGRldl91cDsKLQotCWludCBzcGtyX2dhaW5fb2Zmc2V0OwotCWludCBzcGtyX21vZGU7Ci0Jc3RydWN0IG11dGV4IGNvZGVjX211dGV4OwotCWludCByeF80X2NvdW50OwotCWludCByeF81X2NvdW50OwotCXUzMiBtY2xrX3JhdGU7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCi0JYm9vbCBwcmV2X3BnX3ZhbGlkOwotCXU4IHByZXZfcGc7Ci0JdTMyIHNkd19iYXNlX2FkZHI7Ci0JY2hhciBfX2lvbWVtICpzZHdfYmFzZTsKLQl1MzIgdmVyc2lvbjsKLQotCS8qIEVudHJ5IGZvciB2ZXJzaW9uIGluZm8gKi8KLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKLX07Ci0KLWV4dGVybiBpbnQgbXNtX3Nkd19zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpOwotZXh0ZXJuIGludCBtc21fc2R3X3NldF9zcGtyX2dhaW5fb2Zmc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJaW50IG9mZnNldCk7Ci1leHRlcm4gdm9pZCBtc21fc2R3X2dwaW9fY2IoCi0JaW50ICgqc2R3X2NkY19ncGlvX2ZuKShib29sIGVuYWJsZSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKSwKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIHN0cnVjdCByZWdtYXAgKm1zbV9zZHdfcmVnbWFwX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnICpjb25maWcpOwotZXh0ZXJuIGludCBtc21fc2R3X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KAotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkd19jZGMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3Nkdy9tc21fc2R3X2NkYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUzYWVhLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3Nkdy9tc21fc2R3X2NkYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kd2lyZS9zd3Itd2NkLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgIm1zbV9zZHcuaCIKLSNpbmNsdWRlICJtc21fc2R3X3JlZ2lzdGVycy5oIgotCi0jZGVmaW5lIE1TTV9TRFdfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8XAotCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKLSNkZWZpbmUgTVNNX1NEV19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8XAotCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8XAotCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpCi0KLSNkZWZpbmUgTVNNX1NEV19TVFJJTkdfTEVOIDgwCi0KLSNkZWZpbmUgSU5UX01DTEsxX0ZSRVEgOTYwMDAwMAotI2RlZmluZSBTRFdfTlBMX0ZSRVEgMTUzNjAwMDAwCi0KLSNkZWZpbmUgTVNNX1NEV19WRVJTSU9OXzFfMCAweDAwMDEKLSNkZWZpbmUgTVNNX1NEV19WRVJTSU9OX0VOVFJZX1NJWkUgMzIKLQotLyoKLSAqIDIwMCBNaWxsaXNlY29uZHMgc3VmZmljaWVudCBmb3IgRFNQIGJyaW5nIHVwIGluIHRoZSBtb2RlbQotICogYWZ0ZXIgU3ViIFN5c3RlbSBSZXN0YXJ0Ci0gKi8KLSNkZWZpbmUgQURTUF9TVEFURV9SRUFEWV9USU1FT1VUX01TIDIwMAotCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF9nYWluLCAwLCAxLCAwKTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9zZHdfZGFpW107Ci1zdGF0aWMgYm9vbCBza2lwX2lycSA9IHRydWU7Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19jb25maWdfZWFyX3Nwa3JfZ2FpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBldmVudCwgaW50IGdhaW5fcmVnKTsKLXN0YXRpYyBpbnQgbXNtX3Nkd19jb25maWdfY29tcGFuZGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGludCwgaW50KTsKLXN0YXRpYyBpbnQgbXNtX3Nkd19tY2xrX2VuYWJsZShzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LAotCQkJICAgICAgIGludCBtY2xrX2VuYWJsZSwgYm9vbCBkYXBtKTsKLXN0YXRpYyBpbnQgbXNtX2ludF9lbmFibGVfc2R3X2NkY19jbGsoc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdywKLQkJCQkgICAgICBpbnQgZW5hYmxlLCBib29sIGRhcG0pOwotCi1lbnVtIHsKLQlWSV9TRU5TRV8xLAotCVZJX1NFTlNFXzIsCi19OwotCi1lbnVtIHsKLQlBSUYxX1NEV19QQiA9IDAsCi0JQUlGMV9TRFdfVklGRUVELAotCU5VTV9DT0RFQ19EQUlTLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtc21fc2R3X3JlZ19tYXNrX3ZhbCBtc21fc2R3X3Nwa3JfZGVmYXVsdFtdID0gewotCXtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHg4MH0sCi0Je01TTV9TRFdfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDgwfSwKLQl7TVNNX1NEV19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDF9LAotCXtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMX0sCi0Je01TTV9TRFdfQk9PU1QwX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCi0Je01TTV9TRFdfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9zZHdfcmVnX21hc2tfdmFsIG1zbV9zZHdfc3Brcl9tb2RlMVtdID0gewotCXtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHgwMH0sCi0Je01TTV9TRFdfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDAwfSwKLQl7TVNNX1NEV19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDB9LAotCXtNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMH0sCi0Je01TTV9TRFdfQk9PU1QwX0JPT1NUX0NUTCwgMHg3QywgMHg0NH0sCi0Je01TTV9TRFdfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg0NH0sCi19OwotCi0vKioKLSAqIG1zbV9zZHdfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQgLSBvZmZzZXQgdGhlIHNwZWFrZXIgcGF0aAotICogZ2FpbiB3aXRoIHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuCi0gKgotICogQGNvZGVjOiBjb2RlYyBpbnN0YW5jZQotICogQG9mZnNldDogSW5kaWNhdGVzIHNwZWFrZXIgcGF0aCBnYWluIG9mZnNldCB2YWx1ZS4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIG9uIGVycm9yLgotICovCi1pbnQgbXNtX3Nkd19zZXRfc3Brcl9nYWluX29mZnNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqcHJpdjsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBjb2RlYyBwb2ludGVyIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPnNwa3JfZ2Fpbl9vZmZzZXQgPSBvZmZzZXQ7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZHdfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQpOwotCi0vKioKLSAqIG1zbV9zZHdfc2V0X3Nwa3JfbW9kZSAtIENvbmZpZ3VyZXMgc3BlYWtlciBjb21wYW5kZXIgYW5kIHNtYXJ0Ym9vc3QKLSAqIHNldHRpbmdzIGJhc2VkIG9uIHNwZWFrZXIgbW9kZS4KLSAqCi0gKiBAY29kZWM6IGNvZGVjIGluc3RhbmNlCi0gKiBAbW9kZTogSW5kaWNhdGVzIHNwZWFrZXIgY29uZmlndXJhdGlvbiBtb2RlLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCi0gKi8KLWludCBtc21fc2R3X3NldF9zcGtyX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICpwcml2OwotCWludCBpOwotCWNvbnN0IHN0cnVjdCBtc21fc2R3X3JlZ19tYXNrX3ZhbCAqcmVnczsKLQlpbnQgc2l6ZTsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBjb2RlYyBwb2ludGVyIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgU1BLUl9NT0RFXzE6Ci0JCXJlZ3MgPSBtc21fc2R3X3Nwa3JfbW9kZTE7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKG1zbV9zZHdfc3Brcl9tb2RlMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJlZ3MgPSBtc21fc2R3X3Nwa3JfZGVmYXVsdDsKLQkJc2l6ZSA9IEFSUkFZX1NJWkUobXNtX3Nkd19zcGtyX2RlZmF1bHQpOwotCQlicmVhazsKLQl9Ci0KLQlwcml2LT5zcGtyX21vZGUgPSBtb2RlOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ3NbaV0ucmVnLAotCQkJCSAgICByZWdzW2ldLm1hc2ssIHJlZ3NbaV0udmFsKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3Nkd19zZXRfc3Brcl9tb2RlKTsKLQotc3RhdGljIGludCBtc21fZW5hYmxlX3Nkd19ucGxfY2xrKHN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcsIGludCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIiVzOiBlbmFibGUgJWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOwotCi0JbXV0ZXhfbG9jaygmbXNtX3Nkdy0+c2R3X25wbF9jbGtfbXV0ZXgpOwotCWlmIChlbmFibGUpIHsKLQkJaWYgKG1zbV9zZHctPnNkd19ucGxfY2xrX2VuYWJsZWQgPT0gZmFsc2UpIHsKLQkJCW1zbV9zZHctPnNkd19ucGxfY2xrLmVuYWJsZSA9IDE7Ci0JCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJCUFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWCwKLQkJCQkmbXNtX3Nkdy0+c2R3X25wbF9jbGspOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKG1zbV9zZHctPmRldiwKLQkJCQkJIiVzOiBmYWlsZWQgdG8gZW5hYmxlIFNEVyBOUEwgQ0xLXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZtc21fc2R3LT5zZHdfbnBsX2Nsa19tdXRleCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiZW5hYmxlZCBzZHcgbnBsIGNsa1xuIik7Ci0JCQltc21fc2R3LT5zZHdfbnBsX2Nsa19lbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChtc21fc2R3LT5zZHdfbnBsX2Nsa19lbmFibGVkID09IHRydWUpIHsKLQkJCW1zbV9zZHctPnNkd19ucGxfY2xrLmVuYWJsZSA9IDA7Ci0JCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJCUFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWCwKLQkJCQkmbXNtX3Nkdy0+c2R3X25wbF9jbGspOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkJCSIlczogZmFpbGVkIHRvIGRpc2FibGUgU0RXIE5QTCBDTEtcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCW1zbV9zZHctPnNkd19ucGxfY2xrX2VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJm1zbV9zZHctPnNkd19ucGxfY2xrX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9pbnRfZW5hYmxlX3Nkd19jZGNfY2xrKHN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcsCi0JCQkJICAgICAgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQotewotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmbXNtX3Nkdy0+Y2RjX2ludF9tY2xrMV9tdXRleCk7Ci0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICIlczogZW5hYmxlICVkIG1jbGsxIHJlZiBjb3VudGVyICVkXG4iLAotCQlfX2Z1bmNfXywgZW5hYmxlLCBtc21fc2R3LT5pbnRfbWNsazFfcnNjX3JlZik7Ci0JaWYgKGVuYWJsZSkgewotCQlpZiAobXNtX3Nkdy0+aW50X21jbGsxX3JzY19yZWYgPT0gMCkgewotCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAotCQkJCQkmbXNtX3Nkdy0+ZGlzYWJsZV9pbnRfbWNsazFfd29yayk7Ci0JCQlpZiAobXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPT0gZmFsc2UpIHsKLQkJCQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7Ci0JCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192MigKLQkJCQkJQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYLAotCQkJCQkmbXNtX3Nkdy0+c2R3X2NkY19jb3JlX2Nsayk7Ci0JCQkJaWYgKHJldCA8IDApIHsKLQkJCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkJCQkiJXM6IGZhaWxlZCB0byBlbmFibGUgU0RXIE1DTEtcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCWdvdG8gcnRuOwotCQkJCX0KLQkJCQlkZXZfZGJnKG1zbV9zZHctPmRldiwKLQkJCQkJImVuYWJsZWQgc2R3IGNvZGVjIGNvcmUgbWNsa1xuIik7Ci0JCQkJbXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCW1zbV9zZHctPmludF9tY2xrMV9yc2NfcmVmKys7Ci0JfSBlbHNlIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtc21fc2R3LT5kaXNhYmxlX2ludF9tY2xrMV93b3JrKTsKLQkJaWYgKG1zbV9zZHctPmludF9tY2xrMV9yc2NfcmVmID4gMCkgewotCQkJbXNtX3Nkdy0+aW50X21jbGsxX3JzY19yZWYtLTsKLQkJCWRldl9kYmcobXNtX3Nkdy0+ZGV2LAotCQkJCSIlczogZGVjcmVtZW50aW5nIG1jbGtfcmVzX3JlZiAlZFxuIiwKLQkJCQkgX19mdW5jX18sIG1zbV9zZHctPmludF9tY2xrMV9yc2NfcmVmKTsKLQkJfQotCQlpZiAobXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPT0gdHJ1ZSAmJgotCQkJbXNtX3Nkdy0+aW50X21jbGsxX3JzY19yZWYgPT0gMCkgewotCQkJbXNtX3Nkdy0+c2R3X2NkY19jb3JlX2Nsay5lbmFibGUgPSAwOwotCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192MigKLQkJCQlBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlgsCi0JCQkJJm1zbV9zZHctPnNkd19jZGNfY29yZV9jbGspOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkJCSIlczogZmFpbGVkIHRvIGRpc2FibGUgU0RXIE1DTEtcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCW1zbV9zZHctPmludF9tY2xrMV9lbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtc21fc2R3LT5jZGNfaW50X21jbGsxX211dGV4KTsKLXJ0bjoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChtc21faW50X2VuYWJsZV9zZHdfY2RjX2Nsayk7Ci0KLXN0YXRpYyB2b2lkIG1zbV9kaXNhYmxlX2ludF9tY2xrMShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IE5VTEw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0JaW50IHJldCA9IDA7Ci0KLQlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQltc21fc2R3ID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgbXNtX3Nkd19wcml2LAotCQkJZGlzYWJsZV9pbnRfbWNsazFfd29yayk7Ci0JbXV0ZXhfbG9jaygmbXNtX3Nkdy0+Y2RjX2ludF9tY2xrMV9tdXRleCk7Ci0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICIlczogbWNsazFfZW5hYmxlZCAlZCBtY2xrMV9yc2NfcmVmICVkXG4iLAotCQlfX2Z1bmNfXywgbXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQsCi0JCW1zbV9zZHctPmludF9tY2xrMV9yc2NfcmVmKTsKLQlpZiAobXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPT0gdHJ1ZQotCQkJJiYgbXNtX3Nkdy0+aW50X21jbGsxX3JzY19yZWYgPT0gMCkgewotCQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIkRpc2FibGUgdGhlIG1jbGsxXG4iKTsKLQkJbXNtX3Nkdy0+c2R3X2NkY19jb3JlX2Nsay5lbmFibGUgPSAwOwotCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYLAotCQkJJm1zbV9zZHctPnNkd19jZGNfY29yZV9jbGspOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIobXNtX3Nkdy0+ZGV2LAotCQkJCSIlcyBmYWlsZWQgdG8gZGlzYWJsZSB0aGUgTUNMSzFcbiIsCi0JCQkJX19mdW5jX18pOwotCQltc21fc2R3LT5pbnRfbWNsazFfZW5hYmxlZCA9IGZhbHNlOwotCX0KLQltdXRleF91bmxvY2soJm1zbV9zZHctPmNkY19pbnRfbWNsazFfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IG1zbV9pbnRfbWNsazFfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJLyogZW5hYmxlIHRoZSBjb2RlYyBtY2xrIGNvbmZpZyAqLwotCQltc21faW50X2VuYWJsZV9zZHdfY2RjX2Nsayhtc21fc2R3LCAxLCB0cnVlKTsKLQkJbXNtX3Nkd19tY2xrX2VuYWJsZShtc21fc2R3LCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIGRpc2FibGUgdGhlIGNvZGVjIG1jbGsgY29uZmlnICovCi0JCW1zbV9zZHdfbWNsa19lbmFibGUobXNtX3NkdywgMCwgdHJ1ZSk7Ci0JCW1zbV9pbnRfZW5hYmxlX3Nkd19jZGNfY2xrKG1zbV9zZHcsIDAsIHRydWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKG1zbV9zZHctPmRldiwKLQkJCSIlczogaW52YWxpZCBEQVBNIGV2ZW50ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfYWhiX3dyaXRlX2RldmljZShzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LAotCQkJCQl1MTYgcmVnLCB1OCAqdmFsdWUpCi17Ci0JdTMyIHRlbXAgPSAodTMyKSgqdmFsdWUpICYgMHgwMDAwMDBGRjsKLQotCWlmICghbXNtX3Nkdy0+ZGV2X3VwKSB7Ci0JCWRldl9lcnJfcmF0ZWxpbWl0ZWQobXNtX3Nkdy0+ZGV2LCAiJXM6IHE2IG5vdCByZWFkeVxuIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpb3dyaXRlMzIodGVtcCwgbXNtX3Nkdy0+c2R3X2Jhc2UgKyByZWcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfYWhiX3JlYWRfZGV2aWNlKHN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcsCi0JCQkJCXUxNiByZWcsIHU4ICp2YWx1ZSkKLXsKLQl1MzIgdGVtcDsKLQotCWlmICghbXNtX3Nkdy0+ZGV2X3VwKSB7Ci0JCWRldl9lcnJfcmF0ZWxpbWl0ZWQobXNtX3Nkdy0+ZGV2LCAiJXM6IHE2IG5vdCByZWFkeVxuIiwKLQkJCQkgICAgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0ZW1wID0gaW9yZWFkMzIobXNtX3Nkdy0+c2R3X2Jhc2UgKyByZWcpOwotCSp2YWx1ZSA9ICh1OCl0ZW1wOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbXNtX3Nkd19yZWdfcmVhZChzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LCB1bnNpZ25lZCBzaG9ydCByZWcsCi0JCQlpbnQgYnl0ZXMsIHZvaWQgKmRlc3QpCi17Ci0JaW50IHJldCA9IC1FSU5WQUwsIGk7Ci0JdTggdGVtcCA9IDA7Ci0KLQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIiVzIHJlZyA9ICV4XG4iLCBfX2Z1bmNfXywgcmVnKTsKLQltdXRleF9sb2NrKCZtc21fc2R3LT5jZGNfaW50X21jbGsxX211dGV4KTsKLQlpZiAobXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPT0gZmFsc2UpIHsKLQkJbXNtX3Nkdy0+c2R3X2NkY19jb3JlX2Nsay5lbmFibGUgPSAxOwotCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJCQlBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlgsCi0JCQkJCSZtc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIobXNtX3Nkdy0+ZGV2LAotCQkJCSIlczpmYWlsZWQgdG8gZW5hYmxlIHRoZSBJTlRfTUNMSzFcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byB1bmxvY2tfZXhpdDsKLQkJfQotCQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIiVzOmVuYWJsZWQgc2R3IGNvZGVjIGNvcmUgY2xrXG4iLAotCQkJX19mdW5jX18pOwotCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgIHsKLQkJCXJldCA9IG1zbV9zZHdfYWhiX3JlYWRfZGV2aWNlKAotCQkJCW1zbV9zZHcsIHJlZyArICg0ICogaSksICZ0ZW1wKTsKLQkJCSgodTggKilkZXN0KVtpXSA9IHRlbXA7Ci0JCX0KLQkJbXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPSB0cnVlOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1zbV9zZHctPmRpc2FibGVfaW50X21jbGsxX3dvcmssIDUwKTsKLQkJZ290byB1bmxvY2tfZXhpdDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspICB7Ci0JCXJldCA9IG1zbV9zZHdfYWhiX3JlYWRfZGV2aWNlKAotCQkJbXNtX3NkdywgcmVnICsgKDQgKiBpKSwgJnRlbXApOwotCQkoKHU4ICopZGVzdClbaV0gPSB0ZW1wOwotCX0KLXVubG9ja19leGl0OgotCW11dGV4X3VubG9jaygmbXNtX3Nkdy0+Y2RjX2ludF9tY2xrMV9tdXRleCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycl9yYXRlbGltaXRlZChtc21fc2R3LT5kZXYsCi0JCQkJICAgICIlczogY29kZWMgcmVhZCBmYWlsZWQgZm9yIHJlZyAweCV4XG4iLAotCQkJCSAgICBfX2Z1bmNfXywgcmVnKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICJSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsIHRlbXAsIHJlZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21zbV9zZHdfcmVnX3dyaXRlKHN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcsIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCSAgICAgICBpbnQgYnl0ZXMsIHZvaWQgKnNyYykKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTCwgaTsKLQotCW11dGV4X2xvY2soJm1zbV9zZHctPmNkY19pbnRfbWNsazFfbXV0ZXgpOwotCWlmIChtc21fc2R3LT5pbnRfbWNsazFfZW5hYmxlZCA9PSBmYWxzZSkgewotCQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7Ci0JCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYLAotCQkJCQkgICAgICZtc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIobXNtX3Nkdy0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSB0aGUgSU5UX01DTEsxXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IDA7Ci0JCQlnb3RvIHVubG9ja19leGl0OwotCQl9Ci0JCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiJXM6IGVuYWJsZWQgSU5UX01DTEsxXG4iLCBfX2Z1bmNfXyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSsrKQotCQkJcmV0ID0gbXNtX3Nkd19haGJfd3JpdGVfZGV2aWNlKG1zbV9zZHcsIHJlZyArICg0ICogaSksCi0JCQkJCQkgICAgICAgJigodTggKilzcmMpW2ldKTsKLQkJbXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPSB0cnVlOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm1zbV9zZHctPmRpc2FibGVfaW50X21jbGsxX3dvcmssIDUwKTsKLQkJZ290byB1bmxvY2tfZXhpdDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspCi0JCXJldCA9IG1zbV9zZHdfYWhiX3dyaXRlX2RldmljZShtc21fc2R3LCByZWcgKyAoNCAqIGkpLAotCQkJCQkgICAgICAgJigodTggKilzcmMpW2ldKTsKLXVubG9ja19leGl0OgotCW11dGV4X3VubG9jaygmbXNtX3Nkdy0+Y2RjX2ludF9tY2xrMV9tdXRleCk7Ci0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICJXcml0ZSAweCV4IHZhbCAweCUwMnhcbiIsCi0JCQkJcmVnLCAodTMyKSgqKHUzMiAqKXNyYykpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2NvZGVjX2VuYWJsZV92aV9mZWVkYmFjayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3Nkd19wID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghdykgewotCQlwcl9lcnIoIiVzIGludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQltc21fc2R3X3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBudW1fZGFpICVkIHN0cmVhbSBuYW1lICVzXG4iLAotCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcygpOiB3LT5uYW1lICVzIGV2ZW50ICVkIHctPnNoaWZ0ICVkXG4iLAotCQlfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQsIHctPnNoaWZ0KTsKLQlpZiAody0+c2hpZnQgIT0gQUlGMV9TRFdfVklGRUVEKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczpFcnJvciBpbiBlbmFibGluZyB0aGUgdmkgZmVlZGJhY2sgcGF0aFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfdmk7Ci0JfQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzEsICZtc21fc2R3X3AtPnN0YXR1c19tYXNrKSkgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNwa3IxIGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQkJCS8qIEVuYWJsZSBWJkkgc2Vuc2luZyAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsIDB4MDQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLCAweDA0KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLCAweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNX1NEV19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKLQkJCQkweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNX1NEV19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDAwKTsKLQkJfQotCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMiwgJm1zbV9zZHdfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjIgZW5hYmxlZFxuIiwgX19mdW5jX18pOwotCQkJLyogRW5hYmxlIFYmSSBzZW5zaW5nICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCi0JCQkJMHgwNCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCi0JCQkJMHgwNCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgwMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8xLCAmbXNtX3Nkd19wLT5zdGF0dXNfbWFzaykpIHsKLQkJCS8qIERpc2FibGUgViZJIHNlbnNpbmcgKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMSBkaXNhYmxlZFxuIiwgX19mdW5jX18pOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MDApOwotCQl9Ci0JCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8yLCAmbXNtX3Nkd19wLT5zdGF0dXNfbWFzaykpIHsKLQkJCS8qIERpc2FibGUgViZJIHNlbnNpbmcgKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMiBkaXNhYmxlZFxuIiwgX19mdW5jX18pOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU01fU0RXX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLW91dF92aToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdtX2hhbmRsZV9pcnEodm9pZCAqaGFuZGxlLAotCQkJICAgICAgIGlycXJldHVybl90ICgqc3dybV9pcnFfaGFuZGxlcikoaW50IGlycSwKLQkJCQkJCQkgICAgICAgdm9pZCAqZGF0YSksCi0JCQkgICAgICAgdm9pZCAqc3dybV9oYW5kbGUsCi0JCQkgICAgICAgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCWludCByZXQgPSAwOwotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogbnVsbCBoYW5kbGUgcmVjZWl2ZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1zbV9zZHcgPSAoc3RydWN0IG1zbV9zZHdfcHJpdiAqKSBoYW5kbGU7Ci0KLQlpZiAoc2tpcF9pcnEpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYWN0aW9uKSB7Ci0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKG1zbV9zZHctPnNkd19pcnEsIE5VTEwsCi0JCQkJCSAgIHN3cm1faXJxX2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAotCQkJCQkgICAic3dyX21hc3Rlcl9pcnEiLCBzd3JtX2hhbmRsZSk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKG1zbV9zZHctPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JfSBlbHNlCi0JCWZyZWVfaXJxKG1zbV9zZHctPnNkd19pcnEsIHN3cm1faGFuZGxlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9zZHdfY29kZWNfaGQyX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIHUxNiByZWcsIGludCBldmVudCkKLXsKLQl1MTYgaGQyX3NjYWxlX3JlZzsKLQl1MTYgaGQyX2VuYWJsZV9yZWcgPSAwOwotCi0JaWYgKHJlZyA9PSBNU01fU0RXX1JYN19SWF9QQVRIX0NUTCkgewotCQloZDJfc2NhbGVfcmVnID0gTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMzOwotCQloZDJfZW5hYmxlX3JlZyA9IE1TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMDsKLQl9Ci0JaWYgKHJlZyA9PSBNU01fU0RXX1JYOF9SWF9QQVRIX0NUTCkgewotCQloZDJfc2NhbGVfcmVnID0gTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMzOwotCQloZDJfZW5hYmxlX3JlZyA9IE1TTV9TRFdfUlg4X1JYX1BBVEhfQ0ZHMDsKLQl9Ci0KLQlpZiAoaGQyX2VuYWJsZV9yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDNDLCAweDEwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX3NjYWxlX3JlZywgMHgwMywgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9lbmFibGVfcmVnLCAweDA0LCAweDA0KTsKLQl9Ci0KLQlpZiAoaGQyX2VuYWJsZV9yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX2VuYWJsZV9yZWcsIDB4MDQsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDAzLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX3NjYWxlX3JlZywgMHgzQywgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfZW5hYmxlX3N3cihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdzsKLQlpbnQgaSwgY2hfY250OwotCi0JbXNtX3NkdyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKCFtc21fc2R3LT5ucikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKCEoc3RybnN0cih3LT5uYW1lLCAiUlg0Iiwgc2l6ZW9mKCJSWDQgTUlYIikpKSAmJgotCQkgICAgIW1zbV9zZHctPnJ4XzRfY291bnQpCi0JCQltc21fc2R3LT5yeF80X2NvdW50Kys7Ci0JCWlmICghKHN0cm5zdHIody0+bmFtZSwgIlJYNSIsIHNpemVvZigiUlg1IE1JWCIpKSkgJiYKLQkJICAgICFtc21fc2R3LT5yeF81X2NvdW50KQotCQkJbXNtX3Nkdy0+cnhfNV9jb3VudCsrOwotCQljaF9jbnQgPSBtc21fc2R3LT5yeF80X2NvdW50ICsgbXNtX3Nkdy0+cnhfNV9jb3VudDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbXNtX3Nkdy0+bnI7IGkrKykgewotCQkJc3dybV93Y2Rfbm90aWZ5KG1zbV9zZHctPnNkd19jdHJsX2RhdGFbaV0uc2R3X3BkZXYsCi0JCQkJCVNXUl9ERVZJQ0VfVVAsIE5VTEwpOwotCQkJc3dybV93Y2Rfbm90aWZ5KG1zbV9zZHctPnNkd19jdHJsX2RhdGFbaV0uc2R3X3BkZXYsCi0JCQkJCVNXUl9TRVRfTlVNX1JYX0NILCAmY2hfY250KTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKCEoc3RybnN0cih3LT5uYW1lLCAiUlg0Iiwgc2l6ZW9mKCJSWDQgTUlYIikpKSAmJgotCQkgICAgbXNtX3Nkdy0+cnhfNF9jb3VudCkKLQkJCW1zbV9zZHctPnJ4XzRfY291bnQtLTsKLQkJaWYgKCEoc3RybnN0cih3LT5uYW1lLCAiUlg1Iiwgc2l6ZW9mKCJSWDUgTUlYIikpKSAmJgotCQkgICAgbXNtX3Nkdy0+cnhfNV9jb3VudCkKLQkJCW1zbV9zZHctPnJ4XzVfY291bnQtLTsKLQkJY2hfY250ID0gbXNtX3Nkdy0+cnhfNF9jb3VudCArIG1zbV9zZHctPnJ4XzVfY291bnQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG1zbV9zZHctPm5yOyBpKyspCi0JCQlzd3JtX3djZF9ub3RpZnkobXNtX3Nkdy0+c2R3X2N0cmxfZGF0YVtpXS5zZHdfcGRldiwKLQkJCQkJU1dSX1NFVF9OVU1fUlhfQ0gsICZjaF9jbnQpOwotCQlicmVhazsKLQl9Ci0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICIlczogY3VycmVudCBzd3IgY2ggY250OiAlZFxuIiwKLQkJX19mdW5jX18sIG1zbV9zZHctPnJ4XzRfY291bnQgKyBtc21fc2R3LT5yeF81X2NvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgZ2Fpbl9yZWc7Ci0JdTE2IHJlZzsKLQlpbnQgdmFsOwotCWludCBvZmZzZXRfdmFsID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOwotCi0JaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQ0IElOVEVSUCIpKSkgewotCQlyZWcgPSBNU01fU0RXX1JYN19SWF9QQVRIX0NUTDsKLQkJZ2Fpbl9yZWcgPSBNU01fU0RXX1JYN19SWF9WT0xfQ1RMOwotCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDUgSU5URVJQIikpKSB7Ci0JCXJlZyA9IE1TTV9TRFdfUlg4X1JYX1BBVEhfQ1RMOwotCQlnYWluX3JlZyA9IE1TTV9TRFdfUlg4X1JYX1ZPTF9DVEw7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludGVycG9sYXRvciByZWcgbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDEwKTsKLQkJbXNtX3Nkd19jb2RlY19oZDJfY29udHJvbChjb2RlYywgcmVnLCBldmVudCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMSA8PCAweDUsIDEgPDwgMHg1KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCW1zbV9zZHdfY29uZmlnX2NvbXBhbmRlcihjb2RlYywgdy0+c2hpZnQsIGV2ZW50KTsKLQkJLyogYXBwbHkgZ2FpbiBhZnRlciBpbnQgY2xrIGlzIGVuYWJsZWQgKi8KLQkJaWYgKChtc21fc2R3LT5zcGtyX2dhaW5fb2Zmc2V0ID09IFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAobXNtX3Nkdy0+Y29tcF9lbmFibGVkW0NPTVAxXSB8fAotCQkgICAgIG1zbV9zZHctPmNvbXBfZW5hYmxlZFtDT01QMl0pICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gTVNNX1NEV19SWDdfUlhfVk9MX0NUTCB8fAotCQkgICAgIGdhaW5fcmVnID09IE1TTV9TRFdfUlg4X1JYX1ZPTF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBNU01fU0RXX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlvZmZzZXRfdmFsID0gLTI7Ci0JCX0KLQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBnYWluX3JlZyk7Ci0JCXZhbCArPSBvZmZzZXRfdmFsOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgdmFsKTsKLQkJbXNtX3Nkd19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMSA8PCAweDUsIDAgPDwgMHg1KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAkweDQwLCAweDQwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAkweDQwLCAweDAwKTsKLQkJbXNtX3Nkd19jb2RlY19oZDJfY29udHJvbChjb2RlYywgcmVnLCBldmVudCk7Ci0JCW1zbV9zZHdfY29uZmlnX2NvbXBhbmRlcihjb2RlYywgdy0+c2hpZnQsIGV2ZW50KTsKLQkJaWYgKChtc21fc2R3LT5zcGtyX2dhaW5fb2Zmc2V0ID09IFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAobXNtX3Nkdy0+Y29tcF9lbmFibGVkW0NPTVAxXSB8fAotCQkgICAgIG1zbV9zZHctPmNvbXBfZW5hYmxlZFtDT01QMl0pICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gTVNNX1NEV19SWDdfUlhfVk9MX0NUTCB8fAotCQkgICAgIGdhaW5fcmVnID09IE1TTV9TRFdfUlg4X1JYX1ZPTF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBNU01fU0RXX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlvZmZzZXRfdmFsID0gMjsKLQkJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZ2Fpbl9yZWcpOwotCQkJdmFsICs9IG9mZnNldF92YWw7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBnYWluX3JlZywgdmFsKTsKLQkJfQotCQltc21fc2R3X2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19jb25maWdfZWFyX3Nwa3JfZ2FpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBldmVudCwgaW50IGdhaW5fcmVnKQotewotCWludCBjb21wX2dhaW5fb2Zmc2V0LCB2YWw7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jc3dpdGNoIChtc21fc2R3LT5zcGtyX21vZGUpIHsKLQkvKiBDb21wYW5kZXIgZ2FpbiBpbiBTUEtSX01PREUxIGNhc2UgaXMgMTIgZEIgKi8KLQljYXNlIFNQS1JfTU9ERV8xOgotCQljb21wX2dhaW5fb2Zmc2V0ID0gLTEyOwotCQlicmVhazsKLQkvKiBEZWZhdWx0IGNhc2UgY29tcGFuZGVyIGdhaW4gaXMgMTUgZEIgKi8KLQlkZWZhdWx0OgotCQljb21wX2dhaW5fb2Zmc2V0ID0gLTE1OwotCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCS8qIEFwcGx5IGVhciBzcGtyIGdhaW4gb25seSBpZiBjb21wYW5kZXIgaXMgZW5hYmxlZCAqLwotCQlpZiAobXNtX3Nkdy0+Y29tcF9lbmFibGVkW0NPTVAxXSAmJgotCQkgICAgKGdhaW5fcmVnID09IE1TTV9TRFdfUlg3X1JYX1ZPTF9DVEwpICYmCi0JCSAgICAobXNtX3Nkdy0+ZWFyX3Nwa3JfZ2FpbiAhPSAwKSkgewotCQkJLyogRm9yIGV4YW1wbGUsIHZhbCBpcyAtOCgtMTIrNS0xKSBmb3IgNGRCIG9mIGdhaW4gKi8KLQkJCXZhbCA9IGNvbXBfZ2Fpbl9vZmZzZXQgKyBtc21fc2R3LT5lYXJfc3Brcl9nYWluIC0gMTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCi0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlg0IFZvbHVtZSAlZCBkQlxuIiwKLQkJCQlfX2Z1bmNfXywgdmFsKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJLyoKLQkJICogUmVzZXQgUlg0IHZvbHVtZSB0byAwIGRCIGlmIGNvbXBhbmRlciBpcyBlbmFibGVkIGFuZAotCQkgKiBlYXJfc3Brcl9nYWluIGlzIG5vbi16ZXJvLgotCQkgKi8KLQkJaWYgKG1zbV9zZHctPmNvbXBfZW5hYmxlZFtDT01QMV0gJiYKLQkJICAgIChnYWluX3JlZyA9PSBNU01fU0RXX1JYN19SWF9WT0xfQ1RMKSAmJgotCQkgICAgKG1zbV9zZHctPmVhcl9zcGtyX2dhaW4gIT0gMCkpIHsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCAweDApOwotCi0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUmVzZXQgUlg0IFZvbHVtZSB0byAwIGRCXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2NvZGVjX3Nwa19ib29zdF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQl1MTYgYm9vc3RfcGF0aF9jdGwsIGJvb3N0X3BhdGhfY2ZnMTsKLQl1MTYgcmVnOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNCBDSEFJTiIpKSB7Ci0JCWJvb3N0X3BhdGhfY3RsID0gTVNNX1NEV19CT09TVDBfQk9PU1RfUEFUSF9DVEw7Ci0JCWJvb3N0X3BhdGhfY2ZnMSA9IE1TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMTsKLQkJcmVnID0gTVNNX1NEV19SWDdfUlhfUEFUSF9DVEw7Ci0JfSBlbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ1IENIQUlOIikpIHsKLQkJYm9vc3RfcGF0aF9jdGwgPSBNU01fU0RXX0JPT1NUMV9CT09TVF9QQVRIX0NUTDsKLQkJYm9vc3RfcGF0aF9jZmcxID0gTVNNX1NEV19SWDhfUlhfUEFUSF9DRkcxOwotCQlyZWcgPSBNU01fU0RXX1JYOF9SWF9QQVRIX0NUTDsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogYm9vc3QgcmVnIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDEwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYm9vc3RfcGF0aF9jZmcxLCAweDAxLCAweDAxKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY2ZnMSwgMHgwMSwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfY29uZmlnX2NvbXBhbmRlcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBjb21wLAotCQkJCSAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBjb21wX2N0bDBfcmVnLCByeF9wYXRoX2NmZzBfcmVnOwotCi0JaWYgKGNvbXAgPCBDT01QMSB8fCBjb21wID49IENPTVBfTUFYKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBldmVudCAlZCBjb21wYW5kZXIgJWQsIGVuYWJsZWQgJWRcbiIsCi0JCV9fZnVuY19fLCBldmVudCwgY29tcCArIDEsIG1zbV9zZHctPmNvbXBfZW5hYmxlZFtjb21wXSk7Ci0KLQlpZiAoIW1zbV9zZHctPmNvbXBfZW5hYmxlZFtjb21wXSkKLQkJcmV0dXJuIDA7Ci0KLQljb21wX2N0bDBfcmVnID0gTVNNX1NEV19DT01QQU5ERVI3X0NUTDAgKyAoY29tcCAqIDB4MjApOwotCXJ4X3BhdGhfY2ZnMF9yZWcgPSBNU01fU0RXX1JYN19SWF9QQVRIX0NGRzAgKyAoY29tcCAqIDB4MUUwKTsKLQotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7Ci0JCS8qIEVuYWJsZSBDb21wYW5kZXIgQ2xvY2sgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMSwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmcwX3JlZywgMHgwMiwgMHgwMik7Ci0JfQotCi0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDQsIDB4MDQpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2NmZzBfcmVnLCAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAxLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwNCwgMHgwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19nZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9zZHctPmNvbXBfZW5hYmxlZFtjb21wXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X3NldF9jb21wYW5kZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBjb21wID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJICAgIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQ29tcGFuZGVyICVkIGVuYWJsZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCi0JCV9fZnVuY19fLCBjb21wICsgMSwgbXNtX3Nkdy0+Y29tcF9lbmFibGVkW2NvbXBdLCB2YWx1ZSk7Ci0JbXNtX3Nkdy0+Y29tcF9lbmFibGVkW2NvbXBdID0gdmFsdWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2Vhcl9zcGtyX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9zZHctPmVhcl9zcGtyX2dhaW47Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2Vhcl9zcGtyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQltc21fc2R3LT5lYXJfc3Brcl9nYWluID0gIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGdhaW4gPSAlZFxuIiwgX19mdW5jX18sCi0JCW1zbV9zZHctPmVhcl9zcGtyX2dhaW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd192aV9mZWVkX21peGVyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3Nkd19wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9zZHdfcC0+dmlfZmVlZF92YWx1ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfdmlfZmVlZF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHdfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqbWl4ZXIgPQotCQkoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKLQl1MzIgZGFpX2lkID0gd2lkZ2V0LT5zaGlmdDsKLQl1MzIgcG9ydF9pZCA9IG1peGVyLT5zaGlmdDsKLQl1MzIgZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiAlZCwgcG9ydF9pZDolZCwgZGFpX2lkOiAlZFxuIiwKLQkJX19mdW5jX18sIGVuYWJsZSwgcG9ydF9pZCwgZGFpX2lkKTsKLQotCW1zbV9zZHdfcC0+dmlfZmVlZF92YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JbXV0ZXhfbG9jaygmbXNtX3Nkd19wLT5jb2RlY19tdXRleCk7Ci0JaWYgKGVuYWJsZSkgewotCQlpZiAocG9ydF9pZCA9PSBNU01fU0RXX1RYMCAmJiAhdGVzdF9iaXQoVklfU0VOU0VfMSwKLQkJCQkJCSZtc21fc2R3X3AtPnN0YXR1c19tYXNrKSkKLQkJCXNldF9iaXQoVklfU0VOU0VfMSwgJm1zbV9zZHdfcC0+c3RhdHVzX21hc2spOwotCQlpZiAocG9ydF9pZCA9PSBNU01fU0RXX1RYMSAmJiAhdGVzdF9iaXQoVklfU0VOU0VfMiwKLQkJCQkJCSZtc21fc2R3X3AtPnN0YXR1c19tYXNrKSkKLQkJCXNldF9iaXQoVklfU0VOU0VfMiwgJm1zbV9zZHdfcC0+c3RhdHVzX21hc2spOwotCX0gZWxzZSB7Ci0JCWlmIChwb3J0X2lkID09IE1TTV9TRFdfVFgwICYmIHRlc3RfYml0KFZJX1NFTlNFXzEsCi0JCQkJCSZtc21fc2R3X3AtPnN0YXR1c19tYXNrKSkKLQkJCWNsZWFyX2JpdChWSV9TRU5TRV8xLCAmbXNtX3Nkd19wLT5zdGF0dXNfbWFzayk7Ci0JCWlmIChwb3J0X2lkID09IE1TTV9TRFdfVFgxICYmIHRlc3RfYml0KFZJX1NFTlNFXzIsCi0JCQkJCSZtc21fc2R3X3AtPnN0YXR1c19tYXNrKSkKLQkJCWNsZWFyX2JpdChWSV9TRU5TRV8yLCAmbXNtX3Nkd19wLT5zdGF0dXNfbWFzayk7Ci0JfQotCW11dGV4X3VubG9jaygmbXNtX3Nkd19wLT5jb2RlY19tdXRleCk7Ci0Jc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCBlbmFibGUsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19tY2xrX2VuYWJsZShzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LAotCQkJICAgICAgIGludCBtY2xrX2VuYWJsZSwgYm9vbCBkYXBtKQotewotCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiJXM6IG1jbGtfZW5hYmxlID0gJXUsIGRhcG0gPSAlZCBjbGtfdXNlcnM9ICVkXG4iLAotCQlfX2Z1bmNfXywgbWNsa19lbmFibGUsIGRhcG0sIG1zbV9zZHctPnNkd19tY2xrX3VzZXJzKTsKLQlpZiAobWNsa19lbmFibGUpIHsKLQkJbXNtX3Nkdy0+c2R3X21jbGtfdXNlcnMrKzsKLQkJaWYgKG1zbV9zZHctPnNkd19tY2xrX3VzZXJzID09IDEpIHsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyhtc21fc2R3LT5yZWdtYXAsCi0JCQkJCU1TTV9TRFdfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAotCQkJCQkweDAxLCAweDAxKTsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyhtc21fc2R3LT5yZWdtYXAsCi0JCQkJTVNNX1NEV19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAotCQkJCTB4MDEsIDB4MDEpOwotCQkJLyogOS42TUh6IE1DTEssIHNldCB2YWx1ZSAweDAwIGlmIG90aGVyIGZyZXF1ZW5jeSAqLwotCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1zbV9zZHctPnJlZ21hcCwKLQkJCQlNU01fU0RXX1RPUF9GUkVRX01DTEssIDB4MDEsIDB4MDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbXNtX3Nkdy0+c2R3X21jbGtfdXNlcnMtLTsKLQkJaWYgKG1zbV9zZHctPnNkd19tY2xrX3VzZXJzID09IDApIHsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyhtc21fc2R3LT5yZWdtYXAsCi0JCQkJCU1TTV9TRFdfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAotCQkJCQkweDAxLCAweDAwKTsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyhtc21fc2R3LT5yZWdtYXAsCi0JCQkJCU1TTV9TRFdfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKLQkJCQkJMHgwMSwgMHgwMCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZHdfbWNsa19lbmFibGUpOwotCi1zdGF0aWMgaW50IG1zbV9zZHdfc3dybV9yZWFkKHZvaWQgKmhhbmRsZSwgaW50IHJlZykKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCXVuc2lnbmVkIHNob3J0IHNkd19yZF9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc2R3X3JkX2RhdGFfYmFzZTsKLQlpbnQgdmFsLCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXNtX3NkdyA9IChzdHJ1Y3QgbXNtX3Nkd19wcml2ICopaGFuZGxlOwotCi0JZGV2X2RiZyhtc21fc2R3LT5kZXYsICIlczogUmVhZGluZyBzb3VuZHdpcmUgcmVnaXN0ZXIsIDB4JXhcbiIsCi0JCV9fZnVuY19fLCByZWcpOwotCXNkd19yZF9hZGRyX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8wOwotCXNkd19yZF9kYXRhX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8wOwotCS8qCi0JICogQWRkIHNsZWVwIGFzIFNXUiBzbGF2ZSBhY2Nlc3MgcmVhZCB0YWtlcyB0aW1lLgotCSAqIEFsbG93IGZvciBSRF9ET05FIHRvIGNvbXBsZXRlIGZvciBwcmV2aW91cyByZWdpc3RlciBpZiBhbnkuCi0JICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTA1KTsKLQotCS8qIHJlYWRfbG9jayAqLwotCW11dGV4X2xvY2soJm1zbV9zZHctPnNkd19yZWFkX2xvY2spOwotCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKG1zbV9zZHctPnJlZ21hcCwgc2R3X3JkX2FkZHJfYmFzZSwKLQkJCQkodTggKikmcmVnLCA0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKG1zbV9zZHctPmRldiwgIiVzOiBSRCBBZGRyIEZhaWx1cmVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCS8qIEFkZCBzbGVlcCBmb3IgU1dSIHJlZ2lzdGVyIHJlYWQgdmFsdWUgdG8gZ2V0IHVwZGF0ZWQuICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTA1KTsKLQkvKiBDaGVjayBmb3IgUkQgdmFsdWUgKi8KLQlyZXQgPSByZWdtYXBfYnVsa19yZWFkKG1zbV9zZHctPnJlZ21hcCwgc2R3X3JkX2RhdGFfYmFzZSwKLQkJCSAgICAgICAodTggKikmdmFsLCA0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKG1zbV9zZHctPmRldiwgIiVzOiBSRCBEYXRhIEZhaWx1cmVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCXJldCA9IHZhbDsKLWVycjoKLQkvKiByZWFkX3VubG9jayAqLwotCW11dGV4X3VubG9jaygmbXNtX3Nkdy0+c2R3X3JlYWRfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2J1bGtfd3JpdGUoc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdywKLQkJCQlzdHJ1Y3QgbXNtX3Nkd19yZWdfdmFsICpidWxrX3JlZywKLQkJCQlzaXplX3QgbGVuKQotewotCWludCBpLCByZXQgPSAwOwotCXVuc2lnbmVkIHNob3J0IHNkd193cl9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc2R3X3dyX2RhdGFfYmFzZTsKLQotCXNkd193cl9hZGRyX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8wOwotCXNkd193cl9kYXRhX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8wOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7Ci0JCS8qCi0JCSAqIEFkZCBzbGVlcCBhcyBTV1Igc2xhdmUgd3JpdGUgdGFrZXMgdGltZS4KLQkJICogQWxsb3cgZm9yIGFueSBwcmV2aW91cyBwZW5kaW5nIHdyaXRlIHRvIGNvbXBsZXRlLgotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMCwgMTA1KTsKLQkJLyogRmlyc3QgV3JpdGUgdGhlIERhdGEgdG8gcmVnaXN0ZXIgKi8KLQkJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUobXNtX3Nkdy0+cmVnbWFwLAotCQkJc2R3X3dyX2RhdGFfYmFzZSwgYnVsa19yZWdbaV0uYnVmLCA0KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIobXNtX3Nkdy0+ZGV2LCAiJXM6IFdSIERhdGEgRmFpbHVyZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBOZXh0IFdyaXRlIEFkZHJlc3MgKi8KLQkJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUobXNtX3Nkdy0+cmVnbWFwLAotCQkJc2R3X3dyX2FkZHJfYmFzZSwgYnVsa19yZWdbaSsxXS5idWYsIDQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkJIiVzOiBXUiBBZGRyIEZhaWx1cmU6IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sICh1MzIpKGJ1bGtfcmVnW2krMV0uYnVmWzBdKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfc3dybV9idWxrX3dyaXRlKHZvaWQgKmhhbmRsZSwgdTMyICpyZWcsIHUzMiAqdmFsLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHc7Ci0Jc3RydWN0IG1zbV9zZHdfcmVnX3ZhbCAqYnVsa19yZWc7Ci0JdW5zaWduZWQgc2hvcnQgc2R3X3dyX2FkZHJfYmFzZTsKLQl1bnNpZ25lZCBzaG9ydCBzZHdfd3JfZGF0YV9iYXNlOwotCWludCBpLCBqLCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltc21fc2R3ID0gKHN0cnVjdCBtc21fc2R3X3ByaXYgKiloYW5kbGU7Ci0JaWYgKGxlbiA8PSAwKSB7Ci0JCWRldl9lcnIobXNtX3Nkdy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHNpemU6ICV6dVxuIiwgX19mdW5jX18sIGxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNkd193cl9hZGRyX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8wOwotCXNkd193cl9kYXRhX2Jhc2UgPSBNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8wOwotCi0JYnVsa19yZWcgPSBremFsbG9jKCgyICogbGVuICogc2l6ZW9mKHN0cnVjdCBtc21fc2R3X3JlZ192YWwpKSwKLQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghYnVsa19yZWcpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCAobGVuICogMik7IGkgKz0gMiwgaisrKSB7Ci0JCWJ1bGtfcmVnW2ldLnJlZyA9IHNkd193cl9kYXRhX2Jhc2U7Ci0JCWJ1bGtfcmVnW2ldLmJ1ZiA9ICh1OCAqKSgmdmFsW2pdKTsKLQkJYnVsa19yZWdbaV0uYnl0ZXMgPSA0OwotCQlidWxrX3JlZ1tpKzFdLnJlZyA9IHNkd193cl9hZGRyX2Jhc2U7Ci0JCWJ1bGtfcmVnW2krMV0uYnVmID0gKHU4ICopKCZyZWdbal0pOwotCQlidWxrX3JlZ1tpKzFdLmJ5dGVzID0gNDsKLQl9Ci0JbXV0ZXhfbG9jaygmbXNtX3Nkdy0+c2R3X3dyaXRlX2xvY2spOwotCi0JcmV0ID0gbXNtX3Nkd19idWxrX3dyaXRlKG1zbV9zZHcsIGJ1bGtfcmVnLCAobGVuICogMikpOwotCWlmIChyZXQpCi0JCWRldl9lcnIobXNtX3Nkdy0+ZGV2LCAiJXM6IHN3cm0gYnVsayB3cml0ZSBmYWlsZWQsIHJldDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCW11dGV4X3VubG9jaygmbXNtX3Nkdy0+c2R3X3dyaXRlX2xvY2spOwotCWtmcmVlKGJ1bGtfcmVnKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19zd3JtX3dyaXRlKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCXVuc2lnbmVkIHNob3J0IHNkd193cl9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc2R3X3dyX2RhdGFfYmFzZTsKLQlzdHJ1Y3QgbXNtX3Nkd19yZWdfdmFsIGJ1bGtfcmVnWzJdOwotCWludCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXNtX3NkdyA9IChzdHJ1Y3QgbXNtX3Nkd19wcml2ICopaGFuZGxlOwotCi0Jc2R3X3dyX2FkZHJfYmFzZSA9IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzA7Ci0Jc2R3X3dyX2RhdGFfYmFzZSA9IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzA7Ci0KLQkvKiBGaXJzdCBXcml0ZSB0aGUgRGF0YSB0byByZWdpc3RlciAqLwotCWJ1bGtfcmVnWzBdLnJlZyA9IHNkd193cl9kYXRhX2Jhc2U7Ci0JYnVsa19yZWdbMF0uYnVmID0gKHU4ICopKCZ2YWwpOwotCWJ1bGtfcmVnWzBdLmJ5dGVzID0gNDsKLQlidWxrX3JlZ1sxXS5yZWcgPSBzZHdfd3JfYWRkcl9iYXNlOwotCWJ1bGtfcmVnWzFdLmJ1ZiA9ICh1OCAqKSgmcmVnKTsKLQlidWxrX3JlZ1sxXS5ieXRlcyA9IDQ7Ci0KLQltdXRleF9sb2NrKCZtc21fc2R3LT5zZHdfd3JpdGVfbG9jayk7Ci0KLQlyZXQgPSBtc21fc2R3X2J1bGtfd3JpdGUobXNtX3NkdywgYnVsa19yZWcsIDIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKG1zbV9zZHctPmRldiwgIiVzOiBXUiBEYXRhIEZhaWx1cmVcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X3VubG9jaygmbXNtX3Nkdy0+c2R3X3dyaXRlX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19zd3JtX2Nsb2NrKHZvaWQgKmhhbmRsZSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IChzdHJ1Y3QgbXNtX3Nkd19wcml2ICopIGhhbmRsZTsKLQotCW11dGV4X2xvY2soJm1zbV9zZHctPnNkd19jbGtfbG9jayk7Ci0KLQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIiVzOiBzd3JtIGNsb2NrICVzXG4iLAotCQlfX2Z1bmNfXywgKGVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKSk7Ci0JaWYgKGVuYWJsZSkgewotCQltc21fc2R3LT5zZHdfY2xrX3VzZXJzKys7Ci0JCWlmIChtc21fc2R3LT5zZHdfY2xrX3VzZXJzID09IDEpIHsKLQkJCW1zbV9pbnRfZW5hYmxlX3Nkd19jZGNfY2xrKG1zbV9zZHcsIDEsIHRydWUpOwotCQkJbXNtX3Nkd19tY2xrX2VuYWJsZShtc21fc2R3LCAxLCB0cnVlKTsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyhtc21fc2R3LT5yZWdtYXAsCi0JCQkJTVNNX1NEV19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsIDB4MDEsIDB4MDEpOwotCQkJbXNtX2VuYWJsZV9zZHdfbnBsX2Nsayhtc21fc2R3LCB0cnVlKTsKLQkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKAotCQkJCQkJCW1zbV9zZHctPnNkd19ncGlvX3ApOwotCQl9Ci0JfSBlbHNlIHsKLQkJbXNtX3Nkdy0+c2R3X2Nsa191c2Vycy0tOwotCQlpZiAobXNtX3Nkdy0+c2R3X2Nsa191c2VycyA9PSAwKSB7Ci0JCQlyZWdtYXBfdXBkYXRlX2JpdHMobXNtX3Nkdy0+cmVnbWFwLAotCQkJCU1TTV9TRFdfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MLAotCQkJCTB4MDEsIDB4MDApOwotCQkJbXNtX3Nkd19tY2xrX2VuYWJsZShtc21fc2R3LCAwLCB0cnVlKTsKLQkJCW1zbV9pbnRfZW5hYmxlX3Nkd19jZGNfY2xrKG1zbV9zZHcsIDAsIHRydWUpOwotCQkJbXNtX2VuYWJsZV9zZHdfbnBsX2Nsayhtc21fc2R3LCBmYWxzZSk7Ci0JCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKG1zbV9zZHctPnNkd19ncGlvX3ApOwotCQl9Ci0JfQotCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiJXM6IHN3cm0gY2xvY2sgdXNlcnMgJWRcbiIsCi0JCV9fZnVuY19fLCBtc21fc2R3LT5zZHdfY2xrX3VzZXJzKTsKLQltdXRleF91bmxvY2soJm1zbV9zZHctPnNkd19jbGtfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlkZXZfZGJnKGRhaS0+Y29kZWMtPmRldiwgIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwKLQkJX19mdW5jX18sCi0JCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXU4IGNsa19mc19yYXRlLCBmc19yYXRlOwotCi0JZGV2X2RiZyhkYWktPmNvZGVjLT5kZXYsCi0JCSIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWQgZm9ybWF0ICVkXG4iLAotCQlfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAotCQlwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSwgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQotCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgewotCWNhc2UgODAwMDoKLQkJY2xrX2ZzX3JhdGUgPSAweDAwOwotCQlmc19yYXRlID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjAwMDoKLQkJY2xrX2ZzX3JhdGUgPSAweDAxOwotCQlmc19yYXRlID0gMHgwMTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjAwMDoKLQkJY2xrX2ZzX3JhdGUgPSAweDAyOwotCQlmc19yYXRlID0gMHgwMzsKLQkJYnJlYWs7Ci0JY2FzZSA0ODAwMDoKLQkJY2xrX2ZzX3JhdGUgPSAweDAzOwotCQlmc19yYXRlID0gMHgwNDsKLQkJYnJlYWs7Ci0JY2FzZSA5NjAwMDoKLQkJY2xrX2ZzX3JhdGUgPSAweDA0OwotCQlmc19yYXRlID0gMHgwNTsKLQkJYnJlYWs7Ci0JY2FzZSAxOTIwMDA6Ci0JCWNsa19mc19yYXRlID0gMHgwNTsKLQkJZnNfcmF0ZSA9IDB4MDY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWRcbiIsIF9fZnVuY19fLAotCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAotCQkJCU1TTV9TRFdfVE9QX1RYX0kyU19DVEwsIDB4MUMsCi0JCQkJKGNsa19mc19yYXRlIDw8IDIpKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJTVNNX1NEV19UT1BfUlhfSTJTX0NUTCwgMHgxQywKLQkJCQkoY2xrX2ZzX3JhdGUgPDwgMikpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJTVNNX1NEV19SWDdfUlhfUEFUSF9DVEwsIDB4MEYsCi0JCQkJZnNfcmF0ZSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKLQkJCQlNU01fU0RXX1JYOF9SWF9QQVRIX0NUTCwgMHgwRiwKLQkJCQlmc19yYXRlKTsKLQl9Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJCU1TTV9TRFdfVE9QX1RYX0kyU19DVEwsIDB4MjAsIDB4MjApOwotCQllbHNlCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJCU1TTV9TRFdfVE9QX1JYX0kyU19DVEwsIDB4MjAsIDB4MjApOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAotCQkJCQlNU01fU0RXX1RPUF9UWF9JMlNfQ1RMLCAweDIwLCAweDAwKTsKLQkJZWxzZQotCQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAotCQkJCQlNU01fU0RXX1RPUF9SWF9JMlNfQ1RMLCAweDIwLCAweDAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsICIlczogd3JvbmcgZm9ybWF0IHNlbGVjdGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9zZHdfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWRldl9kYmcoZGFpLT5jb2RlYy0+ZGV2LAotCQkiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG1zbV9zZHdfY29kZWNfdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCi0JCQkJCSAgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsCi0JCQkJCSAgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkgIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdzsKLQljaGFyIGJ1ZmZlcltNU01fU0RXX1ZFUlNJT05fRU5UUllfU0laRV07Ci0JaW50IGxlbiA9IDA7Ci0KLQltc21fc2R3ID0gKHN0cnVjdCBtc21fc2R3X3ByaXYgKikgZW50cnktPnByaXZhdGVfZGF0YTsKLQlpZiAoIW1zbV9zZHcpIHsKLQkJcHJfZXJyKCIlczogbXNtX3NkdyBwcml2IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChtc21fc2R3LT52ZXJzaW9uKSB7Ci0JY2FzZSBNU01fU0RXX1ZFUlNJT05fMV8wOgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiU0RXLUNEQ18xXzBcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7Ci0JfQotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgbXNtX3Nkd19jb2RlY19pbmZvX29wcyA9IHsKLQkucmVhZCA9IG1zbV9zZHdfY29kZWNfdmVyc2lvbl9yZWFkLAotfTsKLQotLyoKLSAqIG1zbV9zZHdfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIG1zbV9zZHcgbW9kdWxlCi0gKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBDcmVhdGVzIG1zbV9zZHcgbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgotICogcGFyZW50IGRpcmVjdG9yeS4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludCBtc21fc2R3X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OwotCXN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHc7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQljaGFyIG5hbWVbODBdOwotCi0JaWYgKCFjb2RlY19yb290IHx8ICFjb2RlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltc21fc2R3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiV4LiVzIiwgKHUzMiltc21fc2R3LT5zZHdfYmFzZV9hZGRyLAotCQkJIm1zbS1zZHctY29kZWMiKTsKLQltc21fc2R3LT5lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY29kZWNfcm9vdC0+bW9kdWxlLAotCQkJCQkJKGNvbnN0IGNoYXIgKiluYW1lLAotCQkJCQkJY29kZWNfcm9vdCk7Ci0JaWYgKCFtc21fc2R3LT5lbnRyeSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBtc21fc2R3IGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZC0+c25kX2NhcmQsCi0JCQkJCQkgICAidmVyc2lvbiIsCi0JCQkJCQkgICBtc21fc2R3LT5lbnRyeSk7Ci0JaWYgKCF2ZXJzaW9uX2VudHJ5KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIG1zbV9zZHcgdmVyc2lvbiBlbnRyeVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdmVyc2lvbl9lbnRyeS0+cHJpdmF0ZV9kYXRhID0gbXNtX3NkdzsKLQl2ZXJzaW9uX2VudHJ5LT5zaXplID0gTVNNX1NEV19WRVJTSU9OX0VOVFJZX1NJWkU7Ci0JdmVyc2lvbl9lbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOwotCXZlcnNpb25fZW50cnktPmMub3BzID0gJm1zbV9zZHdfY29kZWNfaW5mb19vcHM7Ci0KLQlpZiAoc25kX2luZm9fcmVnaXN0ZXIodmVyc2lvbl9lbnRyeSkgPCAwKSB7Ci0JCXNuZF9pbmZvX2ZyZWVfZW50cnkodmVyc2lvbl9lbnRyeSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fc2R3LT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChtc21fc2R3X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX3Nkd19kYWlfb3BzID0gewotCS5zdGFydHVwID0gbXNtX3Nkd19zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9zZHdfc2h1dGRvd24sCi0JLmh3X3BhcmFtcyA9IG1zbV9zZHdfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX3Nkd19kYWlbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIm1zbV9zZHdfaTJzX3J4MSIsCi0JCS5pZCA9IEFJRjFfU0RXX1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMV9TRFcgUGxheWJhY2siLAotCQkJLnJhdGVzID0gTVNNX1NEV19SQVRFUywKLQkJCS5mb3JtYXRzID0gTVNNX1NEV19GT1JNQVRTLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX3Nkd19kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJtc21fc2R3X3ZpZmVlZGJhY2siLAotCQkuaWQgPSBBSUYxX1NEV19WSUZFRUQsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZJZmVlZF9TRFciLAotCQkJLnJhdGVzID0gTVNNX1NEV19SQVRFUywKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQl9LAotCQkub3BzID0gJm1zbV9zZHdfZGFpX29wcywKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9taXgxX3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWDQiLCAiUlg1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc21fc2R3X2Vhcl9zcGtyX3BhX2dhaW5fdGV4dFtdID0gewotCSJHX0RFRkFVTFQiLCAiR18wX0RCIiwgIkdfMV9EQiIsICJHXzJfREIiLCAiR18zX0RCIiwKLQkiR180X0RCIiwgIkdfNV9EQiIsICJHXzZfREIiCi19OwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKG1zbV9zZHdfZWFyX3Nwa3JfcGFfZ2Fpbl9lbnVtLAotCQkJCW1zbV9zZHdfZWFyX3Nwa3JfcGFfZ2Fpbl90ZXh0KTsKLS8qIFJYNCBNSVgxICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4NF9taXgxX2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTV9TRFdfVE9QX1JYN19QQVRIX0lOUFVUMF9NVVgsCi0JCTAsIDMsIHJ4X21peDFfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcng0X21peDFfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNX1NEV19UT1BfUlg3X1BBVEhfSU5QVVQxX01VWCwKLQkJMCwgMywgcnhfbWl4MV90ZXh0KTsKLQotLyogUlg1IE1JWDEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcng1X21peDFfaW5wMV9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWCwKLQkJMCwgMywgcnhfbWl4MV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDVfbWl4MV9pbnAyX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU01fU0RXX1RPUF9SWDhfUEFUSF9JTlBVVDFfTVVYLAotCQkwLCAzLCByeF9taXgxX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng0X21peDFfaW5wMV9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYNCBNSVgxIElOUDEgTXV4Iiwgcng0X21peDFfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4NF9taXgxX2lucDJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWDQgTUlYMSBJTlAyIE11eCIsIHJ4NF9taXgxX2lucDJfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDVfbWl4MV9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlg1IE1JWDEgSU5QMSBNdXgiLCByeDVfbWl4MV9pbnAxX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcng1X21peDFfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYNSBNSVgxIElOUDIgTXV4Iiwgcng1X21peDFfaW5wMl9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFfdmlfbWl4ZXJbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU1BLUl9WSV8xIiwgU05EX1NPQ19OT1BNLCBNU01fU0RXX1RYMCwgMSwgMCwKLQkJCW1zbV9zZHdfdmlfZmVlZF9taXhlcl9nZXQsIG1zbV9zZHdfdmlfZmVlZF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTUEtSX1ZJXzIiLCBTTkRfU09DX05PUE0sIE1TTV9TRFdfVFgxLCAxLCAwLAotCQkJbXNtX3Nkd192aV9mZWVkX21peGVyX2dldCwgbXNtX3Nkd192aV9mZWVkX21peGVyX3B1dCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX3Nkd19kYXBtX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJJMlMgUlg0IiwgIkFJRjFfU0RXIFBsYXliYWNrIiwgMCwKLQkJU05EX1NPQ19OT1BNLCAwLCAwKSwKLQotCVNORF9TT0NfREFQTV9BSUZfSU4oIkkyUyBSWDUiLCAiQUlGMV9TRFcgUGxheWJhY2siLCAwLAotCQlTTkRfU09DX05PUE0sIDAsIDApLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMV9TRFcgVkkiLCAiVklmZWVkX1NEVyIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGMV9TRFdfVklGRUVELCAwLCBtc21fc2R3X2NvZGVjX2VuYWJsZV92aV9mZWVkYmFjaywKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjFfVklfU0RXIE1peGVyIiwgU05EX1NPQ19OT1BNLCBBSUYxX1NEV19WSUZFRUQsCi0JCTAsIGFpZjFfdmlfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmMV92aV9taXhlcikpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWDQgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcng0X21peDFfaW5wMV9tdXgsIG1zbV9zZHdfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlg0IE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4NF9taXgxX2lucDJfbXV4LCBtc21fc2R3X2VuYWJsZV9zd3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYNSBNSVgxIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeDVfbWl4MV9pbnAxX211eCwgbXNtX3Nkd19lbmFibGVfc3dyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWDUgTUlYMSBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcng1X21peDFfaW5wMl9tdXgsIG1zbV9zZHdfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlg0IE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlg1IE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDQgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlDT01QMSwgMCwgTlVMTCwgMCwgbXNtX3Nkd19jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDUgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlDT01QMiwgMCwgTlVMTCwgMCwgbXNtX3Nkd19jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNCBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJTlVMTCwgMCwgbXNtX3Nkd19jb2RlY19zcGtfYm9vc3RfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNSBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJTlVMTCwgMCwgbXNtX3Nkd19jb2RlY19zcGtfYm9vc3RfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9JTlBVVCgiVklJTlBVVF9TRFciKSwKLQotCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQSzEgT1VUIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMiBPVVQiKSwKLQotCVNORF9TT0NfREFQTV9TVVBQTFlfUygiU0RXX0NPTk4iLCAtMSwgTVNNX1NEV19UT1BfSTJTX0NMSywKLQkJMCwgMCwgTlVMTCwgMCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZX1MoIklOVF9NQ0xLMSIsIC0yLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbXNtX2ludF9tY2xrMV9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIlNEV19SWF9JMlNfQ0xLIiwKLQkJTVNNX1NEV19UT1BfUlhfSTJTX0NUTCwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiU0RXX1RYX0kyU19DTEsiLAotCQlNU01fU0RXX1RPUF9UWF9JMlNfQ1RMLCAwLCAwLCBOVUxMLCAwKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fc2R3X3NuZF9jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiRUFSIFNQS1IgUEEgR2FpbiIsIG1zbV9zZHdfZWFyX3Nwa3JfcGFfZ2Fpbl9lbnVtLAotCQkgICAgIG1zbV9zZHdfZWFyX3Nwa3JfcGFfZ2Fpbl9nZXQsCi0JCSAgICAgbXNtX3Nkd19lYXJfc3Brcl9wYV9nYWluX3B1dCksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNCBEaWdpdGFsIFZvbHVtZSIsIE1TTV9TRFdfUlg3X1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNSBEaWdpdGFsIFZvbHVtZSIsIE1TTV9TRFdfUlg4X1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9FWFQoIkNPTVAxIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUDEsIDEsIDAsCi0JCW1zbV9zZHdfZ2V0X2NvbXBhbmRlciwgbXNtX3Nkd19zZXRfY29tcGFuZGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDIgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QMiwgMSwgMCwKLQkJbXNtX3Nkd19nZXRfY29tcGFuZGVyLCBtc21fc2R3X3NldF9jb21wYW5kZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYXVkaW9fbWFwW10gPSB7Ci0KLQl7IkFJRjFfU0RXIFZJIiwgTlVMTCwgIlNEV19UWF9JMlNfQ0xLIn0sCi0JeyJTRFdfVFhfSTJTX0NMSyIsIE5VTEwsICJJTlRfTUNMSzEifSwKLQl7IlNEV19UWF9JMlNfQ0xLIiwgTlVMTCwgIlNEV19DT05OIn0sCi0KLQkvKiBWSSBGZWVkYmFjayAqLwotCXsiQUlGMV9WSV9TRFcgTWl4ZXIiLCAiU1BLUl9WSV8xIiwgIlZJSU5QVVRfU0RXIn0sCi0JeyJBSUYxX1ZJX1NEVyBNaXhlciIsICJTUEtSX1ZJXzIiLCAiVklJTlBVVF9TRFcifSwKLQl7IkFJRjFfU0RXIFZJIiwgTlVMTCwgIkFJRjFfVklfU0RXIE1peGVyIn0sCi0KLQl7IlNEV19SWF9JMlNfQ0xLIiwgTlVMTCwgIklOVF9NQ0xLMSJ9LAotCXsiU0RXX1JYX0kyU19DTEsiLCBOVUxMLCAiU0RXX0NPTk4ifSwKLQl7IkkyUyBSWDQiLCBOVUxMLCAiU0RXX1JYX0kyU19DTEsifSwKLQl7IkkyUyBSWDUiLCBOVUxMLCAiU0RXX1JYX0kyU19DTEsifSwKLQotCXsiUlg0IE1JWDEgSU5QMSIsICJSWDQiLCAiSTJTIFJYNCJ9LAotCXsiUlg0IE1JWDEgSU5QMSIsICJSWDUiLCAiSTJTIFJYNSJ9LAotCXsiUlg0IE1JWDEgSU5QMiIsICJSWDQiLCAiSTJTIFJYNCJ9LAotCXsiUlg0IE1JWDEgSU5QMiIsICJSWDUiLCAiSTJTIFJYNSJ9LAotCXsiUlg1IE1JWDEgSU5QMSIsICJSWDQiLCAiSTJTIFJYNCJ9LAotCXsiUlg1IE1JWDEgSU5QMSIsICJSWDUiLCAiSTJTIFJYNSJ9LAotCXsiUlg1IE1JWDEgSU5QMiIsICJSWDQiLCAiSTJTIFJYNCJ9LAotCXsiUlg1IE1JWDEgSU5QMiIsICJSWDUiLCAiSTJTIFJYNSJ9LAotCi0JeyJSWDQgTUlYMSIsIE5VTEwsICJSWDQgTUlYMSBJTlAxIn0sCi0JeyJSWDQgTUlYMSIsIE5VTEwsICJSWDQgTUlYMSBJTlAyIn0sCi0JeyJSWDUgTUlYMSIsIE5VTEwsICJSWDUgTUlYMSBJTlAxIn0sCi0JeyJSWDUgTUlYMSIsIE5VTEwsICJSWDUgTUlYMSBJTlAyIn0sCi0KLQl7IlJYIElOVDQgSU5URVJQIiwgTlVMTCwgIlJYNCBNSVgxIn0sCi0JeyJSWCBJTlQ0IENIQUlOIiwgTlVMTCwgIlJYIElOVDQgSU5URVJQIn0sCi0JeyJTUEsxIE9VVCIsIE5VTEwsICJSWCBJTlQ0IENIQUlOIn0sCi0KLQl7IlJYIElOVDUgSU5URVJQIiwgTlVMTCwgIlJYNSBNSVgxIn0sCi0JeyJSWCBJTlQ1IENIQUlOIiwgTlVMTCwgIlJYIElOVDUgSU5URVJQIn0sCi0JeyJTUEsyIE9VVCIsIE5VTEwsICJSWCBJTlQ1IENIQUlOIn0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1zbV9zZHdfcmVnX21hc2tfdmFsIG1zbV9zZHdfcmVnX2luaXRbXSA9IHsKLQl7TVNNX1NEV19CT09TVDBfQk9PU1RfQ0ZHMSwgMHgzRiwgMHgxMn0sCi0Je01TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzIsIDB4MUMsIDB4MDh9LAotCXtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNywgMHgxRSwgMHgxOH0sCi0Je01TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzEsIDB4M0YsIDB4MTJ9LAotCXtNU01fU0RXX0JPT1NUMV9CT09TVF9DRkcyLCAweDFDLCAweDA4fSwKLQl7TVNNX1NEV19DT01QQU5ERVI4X0NUTDcsIDB4MUUsIDB4MTh9LAotCXtNU01fU0RXX0JPT1NUMF9CT09TVF9DVEwsIDB4NzAsIDB4NTB9LAotCXtNU01fU0RXX0JPT1NUMV9CT09TVF9DVEwsIDB4NzAsIDB4NTB9LAotCXtNU01fU0RXX1JYN19SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAotCXtNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAotCXtNU01fU0RXX1RPUF9UT1BfQ0ZHMSwgMHgwMiwgMHgwMn0sCi0Je01TTV9TRFdfVE9QX1RPUF9DRkcxLCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCi0Je01TTV9TRFdfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtNU01fU0RXX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCi0Je01TTV9TRFdfQ09NUEFOREVSN19DVEwzLCAweDgwLCAweDgwfSwKLQl7TVNNX1NEV19DT01QQU5ERVI4X0NUTDMsIDB4ODAsIDB4ODB9LAotCXtNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNywgMHgwMSwgMHgwMX0sCi0Je01TTV9TRFdfQ09NUEFOREVSOF9DVEw3LCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19SWDdfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19SWDhfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19SWDdfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKLQl7TVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKLX07Ci0KLXN0YXRpYyB2b2lkIG1zbV9zZHdfaW5pdF9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX3Nkd19yZWdfaW5pdCk7IGkrKykKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQltc21fc2R3X3JlZ19pbml0W2ldLnJlZywKLQkJCQltc21fc2R3X3JlZ19pbml0W2ldLm1hc2ssCi0JCQkJbXNtX3Nkd19yZWdfaW5pdFtpXS52YWwpOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfbm90aWZpZXJfc2VydmljZV9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9wY29kZSwgdm9pZCAqcHRyKQotewotCWludCBpOwotCXN0cnVjdCBtc21fc2R3X3ByaXYgKm1zbV9zZHcgPSBjb250YWluZXJfb2YobmIsCi0JCQkJCQkgICAgc3RydWN0IG1zbV9zZHdfcHJpdiwKLQkJCQkJCSAgICBzZXJ2aWNlX25iKTsKLQlib29sIGFkc3BfcmVhZHkgPSBmYWxzZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0Jc3RhdGljIGJvb2wgaW5pdGlhbF9ib290ID0gdHJ1ZTsKLQotCXByX2RlYnVnKCIlczogU2VydmljZSBvcGNvZGUgMHglbHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOwotCi0JbXV0ZXhfbG9jaygmbXNtX3Nkdy0+Y29kZWNfbXV0ZXgpOwotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046Ci0JCWlmIChpbml0aWFsX2Jvb3QpIHsKLQkJCWluaXRpYWxfYm9vdCA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXNtX3Nkdy0+aW50X21jbGsxX2VuYWJsZWQgPSBmYWxzZTsKLQkJbXNtX3Nkdy0+ZGV2X3VwID0gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBtc21fc2R3LT5ucjsgaSsrKQotCQkJc3dybV93Y2Rfbm90aWZ5KG1zbV9zZHctPnNkd19jdHJsX2RhdGFbaV0uc2R3X3BkZXYsCi0JCQkJCVNXUl9ERVZJQ0VfRE9XTiwgTlVMTCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKLQkJaWYgKGluaXRpYWxfYm9vdCkKLQkJCWluaXRpYWxfYm9vdCA9IGZhbHNlOwotCQlpZiAoIXE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKLQkJCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiQURTUCBpc24ndCByZWFkeVxuIik7Ci0JCQl0aW1lb3V0ID0gamlmZmllcyArCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKEFEU1BfU1RBVEVfUkVBRFlfVElNRU9VVF9NUyk7Ci0JCQl3aGlsZSAoIXRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCQlpZiAoIXE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKLQkJCQkJZGV2X2RiZyhtc21fc2R3LT5kZXYsCi0JCQkJCQkiQURTUCBpc24ndCByZWFkeVxuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGV2X2RiZyhtc21fc2R3LT5kZXYsCi0JCQkJCQkiQURTUCBpcyByZWFkeVxuIik7Ci0JCQkJCWFkc3BfcmVhZHkgPSB0cnVlOwotCQkJCQlnb3RvIHBvd2VydXA7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJYWRzcF9yZWFkeSA9IHRydWU7Ci0JCQlkZXZfZGJnKG1zbV9zZHctPmRldiwgIiVzOiBEU1AgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKLQkJfQotcG93ZXJ1cDoKLQkJaWYgKGFkc3BfcmVhZHkpIHsKLQkJCW1zbV9zZHctPmRldl91cCA9IHRydWU7Ci0JCQltc21fc2R3X2luaXRfcmVnKG1zbV9zZHctPmNvZGVjKTsKLQkJCXJlZ2NhY2hlX21hcmtfZGlydHkobXNtX3Nkdy0+cmVnbWFwKTsKLQkJCXJlZ2NhY2hlX3N5bmMobXNtX3Nkdy0+cmVnbWFwKTsKLQkJCW1zbV9zZHdfc2V0X3Nwa3JfbW9kZShtc21fc2R3LT5jb2RlYywKLQkJCQkJICAgICAgbXNtX3Nkdy0+c3Brcl9tb2RlKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtc21fc2R3LT5jb2RlY19tdXRleCk7Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCWludCBpLCByZXQ7Ci0KLQltc21fc2R3ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaWYgKCFtc21fc2R3KSB7Ci0JCXByX2VycigiJXM6U0RXIHByaXYgZGF0YSBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltc21fc2R3LT5jb2RlYyA9IGNvZGVjOwotCWZvciAoaSA9IDA7IGkgPCBDT01QX01BWDsgaSsrKQotCQltc21fc2R3LT5jb21wX2VuYWJsZWRbaV0gPSAwOwotCi0JbXNtX3Nkdy0+c3Brcl9nYWluX29mZnNldCA9IFJYX0dBSU5fT0ZGU0VUXzBfREI7Ci0JbXNtX3Nkd19pbml0X3JlZyhjb2RlYyk7Ci0JbXNtX3Nkdy0+dmVyc2lvbiA9IE1TTV9TRFdfVkVSU0lPTl8xXzA7Ci0KLQltc21fc2R3LT5zZXJ2aWNlX25iLm5vdGlmaWVyX2NhbGwgPSBtc21fc2R3X25vdGlmaWVyX3NlcnZpY2VfY2I7Ci0JcmV0ID0gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoIm1zbV9zZHciLAotCQkJCUFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOLAotCQkJCSZtc21fc2R3LT5zZXJ2aWNlX25iKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByZWdtYXAgKm1zbV9zZHdfZ2V0X3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIG1zbV9zZHctPnJlZ21hcDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X21zbV9zZHcgPSB7Ci0JLnByb2JlID0gbXNtX3Nkd19jb2RlY19wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3Nkd19jb2RlY19yZW1vdmUsCi0JLmdldF9yZWdtYXAgPSBtc21fc2R3X2dldF9yZWdtYXAsCi0JLmNvbXBvbmVudF9kcml2ZXIgPSB7Ci0JCS5jb250cm9scyA9IG1zbV9zZHdfc25kX2NvbnRyb2xzLAotCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtc21fc2R3X3NuZF9jb250cm9scyksCi0JCS5kYXBtX3dpZGdldHMgPSBtc21fc2R3X2RhcG1fd2lkZ2V0cywKLQkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1zbV9zZHdfZGFwbV93aWRnZXRzKSwKLQkJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAotCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBtc21fc2R3X2FkZF9jaGlsZF9kZXZpY2VzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCXN0cnVjdCBtc21fc2R3X2N0cmxfZGF0YSAqc2R3X2N0cmxfZGF0YSA9IE5VTEwsICp0ZW1wOwotCWludCByZXQsIGN0cmxfbnVtID0gMDsKLQlzdHJ1Y3Qgd2NkX3Nkd19jdHJsX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhOwotCWNoYXIgcGxhdF9kZXZfbmFtZVtNU01fU0RXX1NUUklOR19MRU5dOwotCi0JbXNtX3NkdyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtX3Nkd19wcml2LAotCQkJICAgICBtc21fc2R3X2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCWlmICghbXNtX3NkdykgewotCQlwcl9lcnIoIiVzOiBNZW1vcnkgZm9yIG1zbV9zZHcgZG9lcyBub3QgZXhpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFtc21fc2R3LT5kZXYtPm9mX25vZGUpIHsKLQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkiJXM6IERUIG5vZGUgZm9yIG1zbV9zZHcgZG9lcyBub3QgZXhpc3RcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXBsYXRkYXRhID0gJm1zbV9zZHctPnNkd19wbGF0X2RhdGE7Ci0KLQlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShtc21fc2R3LT5kZXYtPm9mX25vZGUsIG5vZGUpIHsKLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSkKLQkJCXN0cmxjcHkocGxhdF9kZXZfbmFtZSwgIm1zbV9zZHdfc3dyX2N0cmwiLAotCQkJCShNU01fU0RXX1NUUklOR19MRU4gLSAxKSk7Ci0JCWVsc2UgaWYgKHN0cm5zdHIobm9kZS0+bmFtZSwgIm1zbV9jZGNfcGluY3RybCIsCi0JCQkJIHN0cmxlbigibXNtX2NkY19waW5jdHJsIikpICE9IE5VTEwpCi0JCQlzdHJsY3B5KHBsYXRfZGV2X25hbWUsIG5vZGUtPm5hbWUsCi0JCQkJKE1TTV9TRFdfU1RSSU5HX0xFTiAtIDEpKTsKLQkJZWxzZQotCQkJY29udGludWU7Ci0KLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhwbGF0X2Rldl9uYW1lLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsICIlczogcGRldiBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlwZGV2LT5kZXYucGFyZW50ID0gbXNtX3Nkdy0+ZGV2OwotCQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5vZGU7Ci0KLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSkgewotCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBsYXRkYXRhLAotCQkJCQkJICAgICAgIHNpemVvZigqcGxhdGRhdGEpKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSIlczogY2Fubm90IGFkZCBwbGF0IGRhdGEgY3RybDolZFxuIiwKLQkJCQkJX19mdW5jX18sIGN0cmxfbnVtKTsKLQkJCQlnb3RvIGZhaWxfcGRldl9hZGQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBDYW5ub3QgYWRkIHBsYXRmb3JtIGRldmljZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfcGRldl9hZGQ7Ci0JCX0KLQotCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpKSB7Ci0JCQl0ZW1wID0ga3JlYWxsb2Moc2R3X2N0cmxfZGF0YSwKLQkJCQkJKGN0cmxfbnVtICsgMSkgKiBzaXplb2YoCi0JCQkJCXN0cnVjdCBtc21fc2R3X2N0cmxfZGF0YSksCi0JCQkJCUdGUF9LRVJORUwpOwotCQkJaWYgKCF0ZW1wKSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCXNkd19jdHJsX2RhdGEgPSB0ZW1wOwotCQkJc2R3X2N0cmxfZGF0YVtjdHJsX251bV0uc2R3X3BkZXYgPSBwZGV2OwotCQkJY3RybF9udW0rKzsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCQkiJXM6IEFkZGVkIHNvdW5kd2lyZSBjdHJsIGRldmljZShzKVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltc21fc2R3LT5uciA9IGN0cmxfbnVtOwotCQkJbXNtX3Nkdy0+c2R3X2N0cmxfZGF0YSA9IHNkd19jdHJsX2RhdGE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci1mYWlsX3BkZXZfYWRkOgotCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci1lcnI6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCWludCBhZHNwX3N0YXRlOwotCi0JYWRzcF9zdGF0ZSA9IGFwcl9nZXRfc3Vic3lzX3N0YXRlKCk7Ci0JaWYgKGFkc3Bfc3RhdGUgIT0gQVBSX1NVQlNZU19MT0FERUQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWRzcCBpcyBub3QgbG9hZGVkIHlldCAlZFxuIiwKLQkJCQlhZHNwX3N0YXRlKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCi0JbXNtX3NkdyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG1zbV9zZHdfcHJpdiksCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21fc2R3KQotCQlyZXR1cm4gLUVOT01FTTsKLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgbXNtX3Nkdyk7Ci0JbXNtX3Nkdy0+ZGV2X3VwID0gdHJ1ZTsKLQotCW1zbV9zZHctPmRldiA9ICZwZGV2LT5kZXY7Ci0JSU5JVF9XT1JLKCZtc21fc2R3LT5tc21fc2R3X2FkZF9jaGlsZF9kZXZpY2VzX3dvcmssCi0JCSAgbXNtX3Nkd19hZGRfY2hpbGRfZGV2aWNlcyk7Ci0JbXNtX3Nkdy0+c2R3X3BsYXRfZGF0YS5oYW5kbGUgPSAodm9pZCAqKSBtc21fc2R3OwotCW1zbV9zZHctPnNkd19wbGF0X2RhdGEucmVhZCA9IG1zbV9zZHdfc3dybV9yZWFkOwotCW1zbV9zZHctPnNkd19wbGF0X2RhdGEud3JpdGUgPSBtc21fc2R3X3N3cm1fd3JpdGU7Ci0JbXNtX3Nkdy0+c2R3X3BsYXRfZGF0YS5idWxrX3dyaXRlID0gbXNtX3Nkd19zd3JtX2J1bGtfd3JpdGU7Ci0JbXNtX3Nkdy0+c2R3X3BsYXRfZGF0YS5jbGsgPSBtc21fc2R3X3N3cm1fY2xvY2s7Ci0JbXNtX3Nkdy0+c2R3X3BsYXRfZGF0YS5oYW5kbGVfaXJxID0gbXNtX3Nkd21faGFuZGxlX2lycTsKLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInJlZyIsCi0JCQkJICAgJm1zbV9zZHctPnNkd19iYXNlX2FkZHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGNvdWxkIG5vdCBmaW5kICVzIGVudHJ5IGluIGR0XG4iLAotCQkJX19mdW5jX18sICJyZWciKTsKLQkJZ290byBlcnJfc2R3X2NkYzsKLQl9Ci0KLQltc21fc2R3LT5zZHdfZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sY2RjLXNkdy1ncGlvcyIsIDApOwotCW1zbV9zZHctPnNkd19iYXNlID0gaW9yZW1hcChtc21fc2R3LT5zZHdfYmFzZV9hZGRyLAotCQkJCSAgICBNU01fU0RXX01BWF9SRUdJU1RFUik7Ci0JbXNtX3Nkdy0+cmVhZF9kZXYgPSBfX21zbV9zZHdfcmVnX3JlYWQ7Ci0JbXNtX3Nkdy0+d3JpdGVfZGV2ID0gX19tc21fc2R3X3JlZ193cml0ZTsKLQotCW1zbV9zZHctPnJlZ21hcCA9IG1zbV9zZHdfcmVnbWFwX2luaXQobXNtX3Nkdy0+ZGV2LAotCQkJCQkgICAgICAmbXNtX3Nkd19yZWdtYXBfY29uZmlnKTsKLQltc21fc2R3LT5zZHdfaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInN3cl9tYXN0ZXJfaXJxIik7Ci0JaWYgKG1zbV9zZHctPnNkd19pcnEgPCAwKSB7Ci0JCWRldl9lcnIobXNtX3Nkdy0+ZGV2LCAiJXMoKSBlcnJvciBnZXR0aW5nIGlycSBoYW5kbGU6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBtc21fc2R3LT5zZHdfaXJxKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfc2R3X2NkYzsKLQl9Ci0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl9tc21fc2R3LAotCQkJCSAgICAgbXNtX3Nkd19kYWksIEFSUkFZX1NJWkUobXNtX3Nkd19kYWkpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDb2RlYyByZWdpc3RyYXRpb24gZmFpbGVkLCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9zZHdfY2RjOwotCX0KLQkvKiBpbml0aWFsaXplIHRoZSBpbnRfbWNsazEgKi8KLQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmNsa19zZXRfbWlub3JfdmVyc2lvbiA9Ci0JCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRzsKLQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmNsa19pZCA9Ci0JCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UX01DTEtfMTsKLQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmNsa19mcmVxX2luX2h6ID0KLQkJCUlOVF9NQ0xLMV9GUkVROwotCW1zbV9zZHctPnNkd19jZGNfY29yZV9jbGsuY2xrX2F0dHJpID0KLQkJCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05POwotCW1zbV9zZHctPnNkd19jZGNfY29yZV9jbGsuY2xrX3Jvb3QgPQotCQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVDsKLQltc21fc2R3LT5zZHdfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDA7Ci0KLQkvKiBpbml0aWFsaXplIHRoZSBzZHdfbnBsX2NsayAqLwotCW1zbV9zZHctPnNkd19ucGxfY2xrLmNsa19zZXRfbWlub3JfdmVyc2lvbiA9Ci0JCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRzsKLQltc21fc2R3LT5zZHdfbnBsX2Nsay5jbGtfaWQgPQotCQkJQUZFX0NMT0NLX1NFVF9DTE9DS19JRF9TV1JfTlBMX0NMSzsKLQltc21fc2R3LT5zZHdfbnBsX2Nsay5jbGtfZnJlcV9pbl9oeiA9IFNEV19OUExfRlJFUTsKLQltc21fc2R3LT5zZHdfbnBsX2Nsay5jbGtfYXR0cmkgPQotCQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk87Ci0JbXNtX3Nkdy0+c2R3X25wbF9jbGsuY2xrX3Jvb3QgPQotCQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVDsKLQltc21fc2R3LT5zZHdfbnBsX2Nsay5lbmFibGUgPSAwOwotCi0JSU5JVF9ERUxBWUVEX1dPUksoJm1zbV9zZHctPmRpc2FibGVfaW50X21jbGsxX3dvcmssCi0JCQkgIG1zbV9kaXNhYmxlX2ludF9tY2xrMSk7Ci0JbXV0ZXhfaW5pdCgmbXNtX3Nkdy0+Y2RjX2ludF9tY2xrMV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmbXNtX3Nkdy0+c2R3X25wbF9jbGtfbXV0ZXgpOwotCW11dGV4X2luaXQoJm1zbV9zZHctPmlvX2xvY2spOwotCW11dGV4X2luaXQoJm1zbV9zZHctPnNkd19yZWFkX2xvY2spOwotCW11dGV4X2luaXQoJm1zbV9zZHctPnNkd193cml0ZV9sb2NrKTsKLQltdXRleF9pbml0KCZtc21fc2R3LT5zZHdfY2xrX2xvY2spOwotCW11dGV4X2luaXQoJm1zbV9zZHctPmNvZGVjX211dGV4KTsKLQlzY2hlZHVsZV93b3JrKCZtc21fc2R3LT5tc21fc2R3X2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IG1zbV9zZHcgZHJpdmVyIHByb2JlIGRvbmVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotCi1lcnJfc2R3X2NkYzoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG1zbV9zZHcpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Nkd19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3OwotCi0JbXNtX3NkdyA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQotCW11dGV4X2Rlc3Ryb3koJm1zbV9zZHctPmlvX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJm1zbV9zZHctPnNkd19yZWFkX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJm1zbV9zZHctPnNkd193cml0ZV9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZtc21fc2R3LT5zZHdfY2xrX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJm1zbV9zZHctPmNvZGVjX211dGV4KTsKLQltdXRleF9kZXN0cm95KCZtc21fc2R3LT5jZGNfaW50X21jbGsxX211dGV4KTsKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG1zbV9zZHcpOwotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3Nkd19jb2RlY19kdF9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tc2R3LWNvZGVjIiwgfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3Nkd19jb2RlY19kcml2ZXIgPSB7Ci0JLnByb2JlID0gbXNtX3Nkd19wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3Nkd19yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtX3Nkd19jb2RlYyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fc2R3X2NvZGVjX2R0X21hdGNoLAotCX0sCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtc21fc2R3X2NvZGVjX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIFNvdW5kd2lyZSBDb2RlYyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3Nkdy9tc21fc2R3X2NkY191dGlscy5jIGIvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbV9zZHdfY2RjX3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWM4NWIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbV9zZHdfY2RjX3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgIm1zbV9zZHcuaCIKLQotI2RlZmluZSBSRUdfQllURVMgMgotI2RlZmluZSBWQUxfQllURVMgMQotLyoKLSAqIFBhZ2UgUmVnaXN0ZXIgQWRkcmVzcyB0aGF0IEFQUCBQcm9jIHVzZXMgdG8KLSAqIGFjY2VzcyBXQ0Q5MzM1IENvZGVjIHJlZ2lzdGVycyBpcyBpZGVudGlmaWVkCi0gKiBhcyAweDAwCi0gKi8KLSNkZWZpbmUgUEFHRV9SRUdfQUREUiAweDAwCi0KLS8qCi0gKiBtc21fc2R3X3BhZ2Vfd3JpdGU6Ci0gKiBSZXRyaWV2ZSBwYWdlIG51bWJlciBmcm9tIHJlZ2lzdGVyIGFuZAotICogd3JpdGUgdGhhdCBwYWdlIG51bWJlciB0byB0aGUgcGFnZSBhZGRyZXNzLgotICogQ2FsbGVkIHVuZGVyIGlvX2xvY2sgYWNxdWlzaXRpb24uCi0gKgotICogQG1zbV9zZHc6IHBvaW50ZXIgdG8gbXNtX3NkdwotICogQHJlZzogUmVnaXN0ZXIgYWRkcmVzcyBmcm9tIHdoaWNoIHBhZ2UgbnVtYmVyIGlzIHJldHJpZXZlZAotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZS4KLSAqLwotaW50IG1zbV9zZHdfcGFnZV93cml0ZShzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3LCB1bnNpZ25lZCBzaG9ydCByZWcpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTggcGdfbnVtLCBwcmV2X3BnX251bTsKLQotCXBnX251bSA9IG1zbV9zZHdfcGFnZV9tYXBbcmVnXTsKLQlpZiAobXNtX3Nkdy0+cHJldl9wZ192YWxpZCkgewotCQlwcmV2X3BnX251bSA9IG1zbV9zZHctPnByZXZfcGc7Ci0JCWlmIChwcmV2X3BnX251bSAhPSBwZ19udW0pIHsKLQkJCXJldCA9IG1zbV9zZHctPndyaXRlX2Rldihtc21fc2R3LCBQQUdFX1JFR19BRERSLCAxLAotCQkJCQkJICh2b2lkICopICZwZ19udW0pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKG1zbV9zZHctPmRldiwKLQkJCQkJInBhZ2Ugd3JpdGUgZXJyb3IsIHBnX251bTogMHgleFxuIiwKLQkJCQkJcGdfbnVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbXNtX3Nkdy0+cHJldl9wZyA9IHBnX251bTsKLQkJCQlkZXZfZGJnKG1zbV9zZHctPmRldiwKLQkJCQkJIiVzOiBQYWdlIDB4JXggV3JpdGUgdG8gMHgwMFxuIiwKLQkJCQkJX19mdW5jX18sIHBnX251bSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSBtc21fc2R3LT53cml0ZV9kZXYobXNtX3NkdywgUEFHRV9SRUdfQUREUiwgMSwKLQkJCQkJICh2b2lkICopICZwZ19udW0pOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihtc21fc2R3LT5kZXYsCi0JCQkJInBhZ2Ugd3JpdGUgZXJyb3IsIHBnX251bTogMHgleFxuIiwgcGdfbnVtKTsKLQkJfSBlbHNlIHsKLQkJCW1zbV9zZHctPnByZXZfcGcgPSBwZ19udW07Ci0JCQltc21fc2R3LT5wcmV2X3BnX3ZhbGlkID0gdHJ1ZTsKLQkJCWRldl9kYmcobXNtX3Nkdy0+ZGV2LCAiJXM6IFBhZ2UgMHgleCBXcml0ZSB0byAweDAwXG4iLAotCQkJCV9fZnVuY19fLCBwZ19udW0pOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZHdfcGFnZV93cml0ZSk7Ci0KLXN0YXRpYyBpbnQgcmVnbWFwX2J1c19yZWFkKHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAotCQkJICAgdm9pZCAqdmFsLCBzaXplX3QgdmFsX3NpemUpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgc2hvcnQgY19yZWc7Ci0JaW50IHJldCwgaTsKLQotCWlmICghbXNtX3NkdykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBtc21fc2R3IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghcmVnIHx8ICF2YWwpIHsKLQkJZGV2X2VycihkZXYsICIlczogcmVnIG9yIHZhbCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocmVnX3NpemUgIT0gUkVHX0JZVEVTKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ2lzdGVyIHNpemUgJXpkIGJ5dGVzLCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIHJlZ19zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghbXNtX3Nkdy0+ZGV2X3VwKSB7Ci0JCWRldl9kYmdfcmF0ZWxpbWl0ZWQoZGV2LCAiJXM6IE5vIHJlYWQgYWxsb3dlZC4gZGV2X3VwID0gJWRcbiIsCi0JCQkJICAgIF9fZnVuY19fLCBtc21fc2R3LT5kZXZfdXApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZtc21fc2R3LT5pb19sb2NrKTsKLQljX3JlZyA9ICoodTE2ICopcmVnOwotCXJldCA9IG1zbV9zZHdfcGFnZV93cml0ZShtc21fc2R3LCBjX3JlZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0JcmV0ID0gbXNtX3Nkdy0+cmVhZF9kZXYobXNtX3NkdywgY19yZWcsIHZhbF9zaXplLCB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwgIiVzOiBDb2RlYyByZWFkIGZhaWxlZCAoJWQpLCByZWc6IDB4JXgsIHNpemU6JXpkXG4iLAotCQkJX19mdW5jX18sIHJldCwgY19yZWcsIHZhbF9zaXplKTsKLQllbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IHZhbF9zaXplOyBpKyspCi0JCQlkZXZfZGJnKGRldiwgIiVzOiBSZWFkIDB4JTAyeCBmcm9tIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sICgodTggKil2YWwpW2ldLCBjX3JlZyArIGkpOwotCX0KLWVycjoKLQltdXRleF91bmxvY2soJm1zbV9zZHctPmlvX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWdtYXBfYnVzX2dhdGhlcl93cml0ZSh2b2lkICpjb250ZXh0LAotCQkJCSAgIGNvbnN0IHZvaWQgKnJlZywgc2l6ZV90IHJlZ19zaXplLAotCQkJCSAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9zaXplKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7Ci0Jc3RydWN0IG1zbV9zZHdfcHJpdiAqbXNtX3NkdyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIHNob3J0IGNfcmVnOwotCWludCByZXQsIGk7Ci0KLQlpZiAoIW1zbV9zZHcpIHsKLQkJZGV2X2VycihkZXYsICIlczogbXNtX3NkdyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXJlZyB8fCAhdmFsKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZyBvciB2YWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHJlZ19zaXplICE9IFJFR19CWVRFUykgewotCQlkZXZfZXJyKGRldiwgIiVzOiByZWdpc3RlciBzaXplICV6ZCBieXRlcywgbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCByZWdfc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIW1zbV9zZHctPmRldl91cCkgewotCQlkZXZfZGJnX3JhdGVsaW1pdGVkKGRldiwgIiVzOiBObyB3cml0ZSBhbGxvd2VkLiBkZXZfdXAgPSAlZFxuIiwKLQkJCQkgICAgX19mdW5jX18sIG1zbV9zZHctPmRldl91cCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJm1zbV9zZHctPmlvX2xvY2spOwotCWNfcmVnID0gKih1MTYgKilyZWc7Ci0JcmV0ID0gbXNtX3Nkd19wYWdlX3dyaXRlKG1zbV9zZHcsIGNfcmVnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCB2YWxfc2l6ZTsgaSsrKQotCQlkZXZfZGJnKGRldiwgIldyaXRlICUwMnggdG8gMHgleFxuIiwgKCh1OCAqKXZhbClbaV0sCi0JCQljX3JlZyArIGkqNCk7Ci0KLQlyZXQgPSBtc21fc2R3LT53cml0ZV9kZXYobXNtX3NkdywgY19yZWcsIHZhbF9zaXplLCAodm9pZCAqKSB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwKLQkJCSIlczogQ29kZWMgd3JpdGUgZmFpbGVkICglZCksIHJlZzoweCV4LCBzaXplOiV6ZFxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNfcmVnLCB2YWxfc2l6ZSk7Ci0KLWVycjoKLQltdXRleF91bmxvY2soJm1zbV9zZHctPmlvX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnbWFwX2J1c193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKLQlzdHJ1Y3QgbXNtX3Nkd19wcml2ICptc21fc2R3ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoIW1zbV9zZHcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JV0FSTl9PTihjb3VudCA8IFJFR19CWVRFUyk7Ci0KLQlyZXR1cm4gcmVnbWFwX2J1c19nYXRoZXJfd3JpdGUoY29udGV4dCwgZGF0YSwgUkVHX0JZVEVTLAotCQkJCSAgICAgICBkYXRhICsgUkVHX0JZVEVTLAotCQkJCSAgICAgICBjb3VudCAtIFJFR19CWVRFUyk7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHJlZ21hcF9idXNfY29uZmlnID0gewotCS53cml0ZSA9IHJlZ21hcF9idXNfd3JpdGUsCi0JLmdhdGhlcl93cml0ZSA9IHJlZ21hcF9idXNfZ2F0aGVyX3dyaXRlLAotCS5yZWFkID0gcmVnbWFwX2J1c19yZWFkLAotCS5yZWdfZm9ybWF0X2VuZGlhbl9kZWZhdWx0ID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCi0JLnZhbF9mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKLX07Ci0KLS8qCi0gKiBtc21fc2R3X3JlZ21hcF9pbml0OgotICogSW5pdGlhbGl6ZSBtc21fc2R3IHJlZ2lzdGVyIG1hcAotICoKLSAqIEBkZXY6IHBvaW50ZXIgdG8gd2NkIGRldmljZQotICogQGNvbmZpZzogcG9pbnRlciB0byByZWdpc3RlciBtYXAgY29uZmlnCi0gKgotICogUmV0dXJucyBwb2ludGVyIHRvIHJlZ21hcCBzdHJ1Y3R1cmUgZm9yIHN1Y2Nlc3MKLSAqIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgotICovCi1zdHJ1Y3QgcmVnbWFwICptc21fc2R3X3JlZ21hcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqY29uZmlnKQotewotCXJldHVybiBkZXZtX3JlZ21hcF9pbml0KGRldiwgJnJlZ21hcF9idXNfY29uZmlnLCBkZXYsIGNvbmZpZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9zZHdfcmVnbWFwX2luaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbV9zZHdfcmVnaXN0ZXJzLmggYi9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkd19yZWdpc3RlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI3YjBiMC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkd19yZWdpc3RlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBNU01fU0RXX1JFR0lTVEVSU19ICi0jZGVmaW5lIE1TTV9TRFdfUkVHSVNURVJTX0gKLQotI2RlZmluZSBNU01fU0RXX1BBR0VfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAweDAwMDAKLQotLyogUGFnZS1BIFJlZ2lzdGVycyAqLwotI2RlZmluZSBNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgICAweDAzMDgKLSNkZWZpbmUgTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgMHgwMzBjCi0jZGVmaW5lIE1TTV9TRFdfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwgICAgICAgICAgICAgIDB4MDMxOAotI2RlZmluZSBNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCAgICAgICAgICAgICAweDAzMWMKLSNkZWZpbmUgTVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCAgICAgICAgICAgICAgMHgwMzI4Ci0jZGVmaW5lIE1TTV9TRFdfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwICAgICAgICAgICAgIDB4MDMyYwotI2RlZmluZSBNU01fU0RXX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMICAgICAgICAgICAgICAweDAzMzgKLSNkZWZpbmUgTVNNX1NEV19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAgICAgICAgICAgICAgMHgwMzNjCi0KLS8qIFBhZ2UtQiBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI3X0NUTDAgICAgICAgICAgICAgICAgICAgICAgMHgwMDI0Ci0jZGVmaW5lIE1TTV9TRFdfQ09NUEFOREVSN19DVEwxICAgICAgICAgICAgICAgICAgICAgIDB4MDAyOAotI2RlZmluZSBNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMiAgICAgICAgICAgICAgICAgICAgICAweDAwMmMKLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI3X0NUTDMgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwCi0jZGVmaW5lIE1TTV9TRFdfQ09NUEFOREVSN19DVEw0ICAgICAgICAgICAgICAgICAgICAgIDB4MDAzNAotI2RlZmluZSBNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNSAgICAgICAgICAgICAgICAgICAgICAweDAwMzgKLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI3X0NUTDYgICAgICAgICAgICAgICAgICAgICAgMHgwMDNjCi0jZGVmaW5lIE1TTV9TRFdfQ09NUEFOREVSN19DVEw3ICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMCAgICAgICAgICAgICAgICAgICAgICAweDAwNDQKLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI4X0NUTDEgICAgICAgICAgICAgICAgICAgICAgMHgwMDQ4Ci0jZGVmaW5lIE1TTV9TRFdfQ09NUEFOREVSOF9DVEwyICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YwotI2RlZmluZSBNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMyAgICAgICAgICAgICAgICAgICAgICAweDAwNTAKLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI4X0NUTDQgICAgICAgICAgICAgICAgICAgICAgMHgwMDU0Ci0jZGVmaW5lIE1TTV9TRFdfQ09NUEFOREVSOF9DVEw1ICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OAotI2RlZmluZSBNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNiAgICAgICAgICAgICAgICAgICAgICAweDAwNWMKLSNkZWZpbmUgTVNNX1NEV19DT01QQU5ERVI4X0NUTDcgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwCi0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfQ1RMICAgICAgICAgICAgICAgICAgICAgIDB4MDFhNAotI2RlZmluZSBNU01fU0RXX1JYN19SWF9QQVRIX0NGRzAgICAgICAgICAgICAgICAgICAgICAweDAxYTgKLSNkZWZpbmUgTVNNX1NEV19SWDdfUlhfUEFUSF9DRkcxICAgICAgICAgICAgICAgICAgICAgMHgwMWFjCi0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMiAgICAgICAgICAgICAgICAgICAgIDB4MDFiMAotI2RlZmluZSBNU01fU0RXX1JYN19SWF9WT0xfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDAxYjQKLSNkZWZpbmUgTVNNX1NEV19SWDdfUlhfUEFUSF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgMHgwMWI4Ci0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX0NGRyAgICAgICAgICAgICAgICAgIDB4MDFiYwotI2RlZmluZSBNU01fU0RXX1JYN19SWF9WT0xfTUlYX0NUTCAgICAgICAgICAgICAgICAgICAweDAxYzAKLSNkZWZpbmUgTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMwICAgICAgICAgICAgICAgICAgICAgMHgwMWM0Ci0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfU0VDMSAgICAgICAgICAgICAgICAgICAgIDB4MDFjOAotI2RlZmluZSBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzIgICAgICAgICAgICAgICAgICAgICAweDAxY2MKLSNkZWZpbmUgTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMzICAgICAgICAgICAgICAgICAgICAgMHgwMWQwCi0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfU0VDNSAgICAgICAgICAgICAgICAgICAgIDB4MDFkOAotI2RlZmluZSBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzYgICAgICAgICAgICAgICAgICAgICAweDAxZGMKLSNkZWZpbmUgTVNNX1NEV19SWDdfUlhfUEFUSF9TRUM3ICAgICAgICAgICAgICAgICAgICAgMHgwMWUwCi0jZGVmaW5lIE1TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX1NFQzAgICAgICAgICAgICAgICAgIDB4MDFlNAotI2RlZmluZSBNU01fU0RXX1JYN19SWF9QQVRIX01JWF9TRUMxICAgICAgICAgICAgICAgICAweDAxZTgKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9DVEwgICAgICAgICAgICAgICAgICAgICAgMHgwMzg0Ci0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1BBVEhfQ0ZHMCAgICAgICAgICAgICAgICAgICAgIDB4MDM4OAotI2RlZmluZSBNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzEgICAgICAgICAgICAgICAgICAgICAweDAzOGMKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9DRkcyICAgICAgICAgICAgICAgICAgICAgMHgwMzkwCi0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1ZPTF9DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDM5NAotI2RlZmluZSBNU01fU0RXX1JYOF9SWF9QQVRIX01JWF9DVEwgICAgICAgICAgICAgICAgICAweDAzOTgKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ0ZHICAgICAgICAgICAgICAgICAgMHgwMzljCi0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1ZPTF9NSVhfQ1RMICAgICAgICAgICAgICAgICAgIDB4MDNhMAotI2RlZmluZSBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzAgICAgICAgICAgICAgICAgICAgICAweDAzYTQKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMxICAgICAgICAgICAgICAgICAgICAgMHgwM2E4Ci0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1BBVEhfU0VDMiAgICAgICAgICAgICAgICAgICAgIDB4MDNhYwotI2RlZmluZSBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzMgICAgICAgICAgICAgICAgICAgICAweDAzYjAKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9TRUM1ICAgICAgICAgICAgICAgICAgICAgMHgwM2I4Ci0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1BBVEhfU0VDNiAgICAgICAgICAgICAgICAgICAgIDB4MDNiYwotI2RlZmluZSBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzcgICAgICAgICAgICAgICAgICAgICAweDAzYzAKLSNkZWZpbmUgTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfU0VDMCAgICAgICAgICAgICAgICAgMHgwM2M0Ci0jZGVmaW5lIE1TTV9TRFdfUlg4X1JYX1BBVEhfTUlYX1NFQzEgICAgICAgICAgICAgICAgIDB4MDNjOAotCi0vKiBQYWdlLUMgUmVnaXN0ZXJzICovCi0jZGVmaW5lIE1TTV9TRFdfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMICAgICAgICAgICAgICAgIDB4MDA2NAotI2RlZmluZSBNU01fU0RXX0JPT1NUMF9CT09TVF9DVEwgICAgICAgICAgICAgICAgICAgICAweDAwNjgKLSNkZWZpbmUgTVNNX1NEV19CT09TVDBfQk9PU1RfQ0ZHMSAgICAgICAgICAgICAgICAgICAgMHgwMDZjCi0jZGVmaW5lIE1TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzIgICAgICAgICAgICAgICAgICAgIDB4MDA3MAotI2RlZmluZSBNU01fU0RXX0JPT1NUMV9CT09TVF9QQVRIX0NUTCAgICAgICAgICAgICAgICAweDAwODQKLSNkZWZpbmUgTVNNX1NEV19CT09TVDFfQk9PU1RfQ1RMICAgICAgICAgICAgICAgICAgICAgMHgwMDg4Ci0jZGVmaW5lIE1TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzEgICAgICAgICAgICAgICAgICAgIDB4MDA4YwotI2RlZmluZSBNU01fU0RXX0JPT1NUMV9CT09TVF9DRkcyICAgICAgICAgICAgICAgICAgICAweDAwOTAKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMCAgICAgICAgICAgICAgICAgMHgwMGE0Ci0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzEgICAgICAgICAgICAgICAgIDB4MDBhOAotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8yICAgICAgICAgICAgICAgICAweDAwYWMKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMyAgICAgICAgICAgICAgICAgMHgwMGIwCi0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzAgICAgICAgICAgICAgICAgIDB4MDBiNAotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8xICAgICAgICAgICAgICAgICAweDAwYjgKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfMiAgICAgICAgICAgICAgICAgMHgwMGJjCi0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzMgICAgICAgICAgICAgICAgIDB4MDBjMAotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8wICAgICAgICAgICAgICAgICAweDAwYzQKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMSAgICAgICAgICAgICAgICAgMHgwMGM4Ci0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzIgICAgICAgICAgICAgICAgIDB4MDBjYwotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8zICAgICAgICAgICAgICAgICAweDAwZDAKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfMCAgICAgICAgICAgICAgICAgMHgwMGQ0Ci0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzEgICAgICAgICAgICAgICAgIDB4MDBkOAotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8yICAgICAgICAgICAgICAgICAweDAwZGMKLSNkZWZpbmUgTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfMyAgICAgICAgICAgICAgICAgMHgwMGUwCi0jZGVmaW5lIE1TTV9TRFdfQUhCX0JSSURHRV9BQ0NFU1NfQ0ZHICAgICAgICAgICAgICAgIDB4MDBlNAotI2RlZmluZSBNU01fU0RXX0FIQl9CUklER0VfQUNDRVNTX1NUQVRVUyAgICAgICAgICAgICAweDAwZTgKLQotLyogUGFnZS1EIFJlZ2lzdGVycyAqLwotI2RlZmluZSBNU01fU0RXX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wgICAgICAgICAgICAweDAxMDQKLSNkZWZpbmUgTVNNX1NEV19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wgICAgICAgICAgMHgwMTA4Ci0jZGVmaW5lIE1TTV9TRFdfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MICAgICAgICAgICAgIDB4MDEwYwotI2RlZmluZSBNU01fU0RXX1RPUF9UT1BfQ0ZHMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKLSNkZWZpbmUgTVNNX1NEV19UT1BfVE9QX0NGRzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA4Ci0jZGVmaW5lIE1TTV9TRFdfVE9QX1JYX0kyU19DVEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwYwotI2RlZmluZSBNU01fU0RXX1RPUF9UWF9JMlNfQ1RMICAgICAgICAgICAgICAgICAgICAgICAweDAyMTAKLSNkZWZpbmUgTVNNX1NEV19UT1BfSTJTX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjE0Ci0jZGVmaW5lIE1TTV9TRFdfVE9QX1JYN19QQVRIX0lOUFVUMF9NVVggICAgICAgICAgICAgIDB4MDIxOAotI2RlZmluZSBNU01fU0RXX1RPUF9SWDdfUEFUSF9JTlBVVDFfTVVYICAgICAgICAgICAgICAweDAyMWMKLSNkZWZpbmUgTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWCAgICAgICAgICAgICAgMHgwMjIwCi0jZGVmaW5lIE1TTV9TRFdfVE9QX1JYOF9QQVRIX0lOUFVUMV9NVVggICAgICAgICAgICAgIDB4MDIyNAotI2RlZmluZSBNU01fU0RXX1RPUF9GUkVRX01DTEsgICAgICAgICAgICAgICAgICAgICAgICAweDAyMjgKLSNkZWZpbmUgTVNNX1NEV19UT1BfREVCVUdfQlVTX1NFTCAgICAgICAgICAgICAgICAgICAgMHgwMjJjCi0jZGVmaW5lIE1TTV9TRFdfVE9QX0RFQlVHX0VOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIzMAotI2RlZmluZSBNU01fU0RXX1RPUF9JMlNfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAweDAyMzQKLSNkZWZpbmUgTVNNX1NEV19UT1BfQkxPQ0tTX1JFU0VUICAgICAgICAgICAgICAgICAgICAgMHgwMjM4Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tc21fc2R3L21zbV9zZHdfcmVnbWFwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkd19yZWdtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NjMzOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zZHcvbXNtX3Nkd19yZWdtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSAibXNtX3Nkdy5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IG1zbV9zZHdfZGVmYXVsdHNbXSA9IHsKLQkvKiBQYWdlICMxMCByZWdpc3RlcnMgKi8KLQl7IE1TTV9TRFdfUEFHRV9SRUdJU1RFUiwgMHgwMCB9LAotCXsgTVNNX1NEV19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDAyIH0sCi0JeyBNU01fU0RXX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAwIH0sCi0JeyBNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDAyIH0sCi0JeyBNU01fU0RXX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ0ZHMCwgMHgwMCB9LAotCXsgTVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwMiB9LAotCXsgTVNNX1NEV19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MDIgfSwKLQl7IE1TTV9TRFdfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAwIH0sCi0JLyogUGFnZSAjMTEgcmVnaXN0ZXJzICovCi0JeyBNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMCwgMHg2MCB9LAotCXsgTVNNX1NEV19DT01QQU5ERVI3X0NUTDEsIDB4ZGIgfSwKLQl7IE1TTV9TRFdfQ09NUEFOREVSN19DVEwyLCAweGZmIH0sCi0JeyBNU01fU0RXX0NPTVBBTkRFUjdfQ1RMMywgMHgzNSB9LAotCXsgTVNNX1NEV19DT01QQU5ERVI3X0NUTDQsIDB4ZmYgfSwKLQl7IE1TTV9TRFdfQ09NUEFOREVSN19DVEw1LCAweDAwIH0sCi0JeyBNU01fU0RXX0NPTVBBTkRFUjdfQ1RMNiwgMHgwMSB9LAotCXsgTVNNX1NEV19DT01QQU5ERVI4X0NUTDAsIDB4NjAgfSwKLQl7IE1TTV9TRFdfQ09NUEFOREVSOF9DVEwxLCAweGRiIH0sCi0JeyBNU01fU0RXX0NPTVBBTkRFUjhfQ1RMMiwgMHhmZiB9LAotCXsgTVNNX1NEV19DT01QQU5ERVI4X0NUTDMsIDB4MzUgfSwKLQl7IE1TTV9TRFdfQ09NUEFOREVSOF9DVEw0LCAweGZmIH0sCi0JeyBNU01fU0RXX0NPTVBBTkRFUjhfQ1RMNSwgMHgwMCB9LAotCXsgTVNNX1NEV19DT01QQU5ERVI4X0NUTDYsIDB4MDEgfSwKLQl7IE1TTV9TRFdfUlg3X1JYX1BBVEhfQ1RMLCAweDA0IH0sCi0JeyBNU01fU0RXX1JYN19SWF9QQVRIX0NGRzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg3X1JYX1BBVEhfQ0ZHMiwgMHg4ZiB9LAotCXsgTVNNX1NEV19SWDdfUlhfVk9MX0NUTCwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDdfUlhfUEFUSF9NSVhfQ1RMLCAweDA0IH0sCi0JeyBNU01fU0RXX1JYN19SWF9WT0xfTUlYX0NUTCwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDdfUlhfUEFUSF9TRUMyLCAweDAwIH0sCi0JeyBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg3X1JYX1BBVEhfU0VDNSwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDdfUlhfUEFUSF9TRUM2LCAweDAwIH0sCi0JeyBNU01fU0RXX1JYN19SWF9QQVRIX1NFQzcsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg3X1JYX1BBVEhfTUlYX1NFQzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg4X1JYX1BBVEhfQ1RMLCAweDA0IH0sCi0JeyBNU01fU0RXX1JYOF9SWF9QQVRIX0NGRzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg4X1JYX1BBVEhfQ0ZHMiwgMHg4ZiB9LAotCXsgTVNNX1NEV19SWDhfUlhfVk9MX0NUTCwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDhfUlhfUEFUSF9NSVhfQ1RMLCAweDA0IH0sCi0JeyBNU01fU0RXX1JYOF9SWF9WT0xfTUlYX0NUTCwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDhfUlhfUEFUSF9TRUMyLCAweDAwIH0sCi0JeyBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg4X1JYX1BBVEhfU0VDNSwgMHgwMCB9LAotCXsgTVNNX1NEV19SWDhfUlhfUEFUSF9TRUM2LCAweDAwIH0sCi0JeyBNU01fU0RXX1JYOF9SWF9QQVRIX1NFQzcsIDB4MDAgfSwKLQl7IE1TTV9TRFdfUlg4X1JYX1BBVEhfTUlYX1NFQzEsIDB4MDAgfSwKLQkvKiBQYWdlICMxMiByZWdpc3RlcnMgKi8KLQl7IE1TTV9TRFdfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMLCAweDAwIH0sCi0JeyBNU01fU0RXX0JPT1NUMF9CT09TVF9DVEwsIDB4YjIgfSwKLQl7IE1TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQk9PU1QwX0JPT1NUX0NGRzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMLCAweDAwIH0sCi0JeyBNU01fU0RXX0JPT1NUMV9CT09TVF9DVEwsIDB4YjIgfSwKLQl7IE1TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQk9PU1QxX0JPT1NUX0NGRzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzAsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzEsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzIsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzMsIDB4MDAgfSwKLQl7IE1TTV9TRFdfQUhCX0JSSURHRV9BQ0NFU1NfQ0ZHLCAweDBmIH0sCi0JeyBNU01fU0RXX0FIQl9CUklER0VfQUNDRVNTX1NUQVRVUywgMHgwMyB9LAotCS8qIFBhZ2UgIzEzIHJlZ2lzdGVycyAqLwotCXsgTVNNX1NEV19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLCAweDAwIH0sCi0JeyBNU01fU0RXX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwgMHgwMCB9LAotCXsgTVNNX1NEV19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsIDB4MDAgfSwKLQl7IE1TTV9TRFdfVE9QX1RPUF9DRkcwLCAweDAwIH0sCi0JeyBNU01fU0RXX1RPUF9UT1BfQ0ZHMSwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfUlhfSTJTX0NUTCwgMHgwQyB9LAotCXsgTVNNX1NEV19UT1BfVFhfSTJTX0NUTCwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfSTJTX0NMSywgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfUlg3X1BBVEhfSU5QVVQwX01VWCwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfUlg3X1BBVEhfSU5QVVQxX01VWCwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQwX01VWCwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfUlg4X1BBVEhfSU5QVVQxX01VWCwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfRlJFUV9NQ0xLLCAweDAwIH0sCi0JeyBNU01fU0RXX1RPUF9ERUJVR19CVVNfU0VMLCAweDAwIH0sCi0JeyBNU01fU0RXX1RPUF9ERUJVR19FTiwgMHgwMCB9LAotCXsgTVNNX1NEV19UT1BfSTJTX1JFU0VULCAweDAwIH0sCi0JeyBNU01fU0RXX1RPUF9CTE9DS1NfUkVTRVQsIDB4MDAgfSwKLX07Ci0KLXN0YXRpYyBib29sIG1zbV9zZHdfaXNfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQotewotCXJldHVybiBtc21fc2R3X3JlZ19yZWFkYWJsZVtyZWddOwotfQotCi1zdGF0aWMgYm9vbCBtc21fc2R3X2lzX3dyaXRlYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIG1zbV9zZHdfcmVnX3dyaXRlYWJsZVtyZWddOwotfQotCi1zdGF0aWMgYm9vbCBtc21fc2R3X2lzX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMDoKLQljYXNlIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9EQVRBXzE6Ci0JY2FzZSBNU01fU0RXX0FIQl9CUklER0VfV1JfREFUQV8yOgotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1dSX0RBVEFfMzoKLQljYXNlIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzA6Ci0JY2FzZSBNU01fU0RXX0FIQl9CUklER0VfV1JfQUREUl8xOgotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1dSX0FERFJfMjoKLQljYXNlIE1TTV9TRFdfQUhCX0JSSURHRV9XUl9BRERSXzM6Ci0JY2FzZSBNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8wOgotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1JEX0RBVEFfMToKLQljYXNlIE1TTV9TRFdfQUhCX0JSSURHRV9SRF9EQVRBXzI6Ci0JY2FzZSBNU01fU0RXX0FIQl9CUklER0VfUkRfREFUQV8zOgotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMDoKLQljYXNlIE1TTV9TRFdfQUhCX0JSSURHRV9SRF9BRERSXzE6Ci0JY2FzZSBNU01fU0RXX0FIQl9CUklER0VfUkRfQUREUl8yOgotCWNhc2UgTVNNX1NEV19BSEJfQlJJREdFX1JEX0FERFJfMzoKLQljYXNlIE1TTV9TRFdfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTDoKLQljYXNlIE1TTV9TRFdfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1jb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtc21fc2R3X3JlZ21hcF9jb25maWcgPSB7Ci0JLnJlZ19iaXRzID0gMTYsCi0JLnZhbF9iaXRzID0gOCwKLQkucmVnX3N0cmlkZSA9IDQsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCi0JLnJlZ19kZWZhdWx0cyA9IG1zbV9zZHdfZGVmYXVsdHMsCi0JLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKG1zbV9zZHdfZGVmYXVsdHMpLAotCS5tYXhfcmVnaXN0ZXIgPSBNU01fU0RXX01BWF9SRUdJU1RFUiwKLQkud3JpdGVhYmxlX3JlZyA9IG1zbV9zZHdfaXNfd3JpdGVhYmxlX3JlZ2lzdGVyLAotCS52b2xhdGlsZV9yZWcgPSBtc21fc2R3X2lzX3ZvbGF0aWxlX3JlZ2lzdGVyLAotCS5yZWFkYWJsZV9yZWcgPSBtc21fc2R3X2lzX3JlYWRhYmxlX3JlZ2lzdGVyLAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3N0dWIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbXNtX3N0dWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlNTVhZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21zbV9zdHViLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotLyogQSBkdW1teSBkcml2ZXIgdXNlZnVsIG9ubHkgdG8gYWR2ZXJ0aXNlIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9zdHViX2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLnBsYXliYWNrID0geyAvKiBTdXBwb3J0IG1heGltdW0gcmFuZ2UgKi8KLQkJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCX0sCi0JfSwKLQl7Ci0JCS5uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLmNhcHR1cmUgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLwotCQkJLnN0cmVhbV9uYW1lID0gIlJlY29yZCIsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQl9LAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19tc21fc3R1YiA9IHt9OwotCi1zdGF0aWMgaW50IG1zbV9zdHViX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0KLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LAotCSZzb2NfbXNtX3N0dWIsIG1zbV9zdHViX2RhaXMsIEFSUkFZX1NJWkUobXNtX3N0dWJfZGFpcykpOwotfQotCi1zdGF0aWMgaW50IG1zbV9zdHViX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fc3R1Yl9jb2RlY19kdF9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tc3R1Yi1jb2RlYyIsIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9zdHViX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tc3R1Yi1jb2RlYyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fc3R1Yl9jb2RlY19kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9zdHViX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3N0dWJfZGV2X3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zdHViX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fc3R1Yl9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXNtX3N0dWJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc3R1Yl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9zdHViX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtc21fc3R1Yl9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIE1TTSBDT0RFQyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKaW5kZXggZTY0M2JlOS4uZjlmMjczNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKQEAgLTE5MjgsNyArMTkyOCw4IEBACiAJCQlOQVU4ODI1X0ZMTF9JTlRFR0VSX01BU0ssIGZsbF9wYXJhbS0+ZmxsX2ludCk7CiAJLyogRkxMIHByZS1zY2FsZXIgKi8KIAlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgyNS0+cmVnbWFwLCBOQVU4ODI1X1JFR19GTEw0LAotCQkJTkFVODgyNV9GTExfUkVGX0RJVl9NQVNLLCBmbGxfcGFyYW0tPmNsa19yZWZfZGl2KTsKKwkJCU5BVTg4MjVfRkxMX1JFRl9ESVZfTUFTSywKKwkJCWZsbF9wYXJhbS0+Y2xrX3JlZl9kaXYgPDwgTkFVODgyNV9GTExfUkVGX0RJVl9TRlQpOwogCS8qIHNlbGVjdCBkaXZpZGVkIFZDTyBpbnB1dCAqLwogCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODI1LT5yZWdtYXAsIE5BVTg4MjVfUkVHX0ZMTDUsCiAJCU5BVTg4MjVfRkxMX0NMS19TV19NQVNLLCBOQVU4ODI1X0ZMTF9DTEtfU1dfUkVGKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5oIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmgKaW5kZXggMWM2M2UyYS4uNTc0ZDZmOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmgKQEAgLTEyOSw3ICsxMjksOCBAQAogI2RlZmluZSBOQVU4ODI1X0ZMTF9DTEtfU1JDX0ZTCQkJKDB4MyA8PCBOQVU4ODI1X0ZMTF9DTEtfU1JDX1NGVCkKIAogLyogRkxMNCAoMHgwNykgKi8KLSNkZWZpbmUgTkFVODgyNV9GTExfUkVGX0RJVl9NQVNLCQkoMHgzIDw8IDEwKQorI2RlZmluZSBOQVU4ODI1X0ZMTF9SRUZfRElWX1NGVAkxMAorI2RlZmluZSBOQVU4ODI1X0ZMTF9SRUZfRElWX01BU0sJKDB4MyA8PCBOQVU4ODI1X0ZMTF9SRUZfRElWX1NGVCkKIAogLyogRkxMNSAoMHgwOCkgKi8KICNkZWZpbmUgTkFVODgyNV9GTExfUERCX0RBQ19FTgkJKDB4MSA8PCAxNSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCmluZGV4IDEwYzJhNTY0Li4xYWM5NmVmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMKQEAgLTM4MzMsNiArMzgzMyw5IEBACiAJCX0KIAl9CiAKKwlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjQ1LT5yZWdtYXAsIFJUNTY0NV9BRERBX0NMSzEsCisJCVJUNTY0NV9JMlNfUEQxX01BU0ssIFJUNTY0NV9JMlNfUEQxXzIpOworCiAJaWYgKHJ0NTY0NS0+cGRhdGEuamRfaW52ZXJ0KSB7CiAJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NDUtPnJlZ21hcCwgUlQ1NjQ1X0lSUV9DVFJMMiwKIAkJCVJUNTY0NV9KRF8xXzFfTUFTSywgUlQ1NjQ1X0pEXzFfMV9JTlYpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL0tjb25maWcgYi9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxODI1OC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1jb25maWcgU05EX1NPQ19TRE02NjBfQ0RDCi0JdHJpc3RhdGUgIk1TTSBJbnRlcm5hbCBQTUlDIGJhc2VkIGNvZGVjIgotCXNlbGVjdCBTTkRfU09DX1dDRF9NQkhDX0xFR0FDWQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ2ZmFlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotc25kLXNvYy1zZG02NjAtY2RjLW9ianMgOj0gbXNtLWFuYWxvZy1jZGMubyBtc20tZGlnaXRhbC1jZGMubyBzZG02NjAtcmVnbWFwLm8KLW9iai0kKENPTkZJR19TTkRfU09DX1NETTY2MF9DREMpICs9IHNuZC1zb2Mtc2RtNjYwLWNkYy5vIHNkbTY2MC1jZGMtaXJxLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tYW5hbG9nLWNkYy5jIGIvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL21zbS1hbmFsb2ctY2RjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjZkMzUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL21zbS1hbmFsb2ctY2RjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hdWRpb19ub3RpZmllci5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+Ci0jaW5jbHVkZSAibXNtLWFuYWxvZy1jZGMuaCIKLSNpbmNsdWRlICJzZG02NjAtY2RjLWlycS5oIgotI2luY2x1ZGUgInNkbTY2MC1jZGMtcmVnaXN0ZXJzLmgiCi0jaW5jbHVkZSAibXNtLWNkYy1jb21tb24uaCIKLSNpbmNsdWRlICIuLi8uLi9tc20vc2RtNjYwLWNvbW1vbi5oIgotI2luY2x1ZGUgIi4uL3djZC1tYmhjLXYyLWFwaS5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJwbWljX2FuYWxvZ19jb2RlYyIKLSNkZWZpbmUgU0RNNjYwX0NEQ19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHxcCi0JCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHxcCi0JCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHxcCi0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDApCi0jZGVmaW5lIFNETTY2MF9DRENfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfFwKLQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpCi0jZGVmaW5lIE1TTV9ESUdfQ0RDX1NUUklOR19MRU4gODAKLSNkZWZpbmUgTVNNX0FOTEdfQ0RDX1ZFUlNJT05fRU5UUllfU0laRSAzMgotCi0jZGVmaW5lIENPREVDX0RUX01BWF9QUk9QX1NJWkUJCQk0MAotI2RlZmluZSBNQVhfT05fREVNQU5EX1NVUFBMWV9OQU1FX0xFTkdUSAk2NAotI2RlZmluZSBCVVNfRE9XTiAxCi0KLS8qCi0gKiA1MCBNaWxsaXNlY29uZHMgc3VmZmljaWVudCBmb3IgRFNQIGJyaW5nIHVwIGluIHRoZSBscGFzcwotICogYWZ0ZXIgU3ViIFN5c3RlbSBSZXN0YXJ0Ci0gKi8KLSNkZWZpbmUgQURTUF9TVEFURV9SRUFEWV9USU1FT1VUX01TIDUwCi0KLSNkZWZpbmUgRUFSX1BNRCAwCi0jZGVmaW5lIEVBUl9QTVUgMQotI2RlZmluZSBTUEtfUE1EIDIKLSNkZWZpbmUgU1BLX1BNVSAzCi0KLSNkZWZpbmUgTUlDQklBU19ERUZBVUxUX1ZBTCAxODAwMDAwCi0jZGVmaW5lIE1JQ0JJQVNfTUlOX1ZBTCAxNjAwMDAwCi0jZGVmaW5lIE1JQ0JJQVNfU1RFUF9TSVpFIDUwMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9CT09TVF9WT0xUQUdFIDUwMDAKLSNkZWZpbmUgTUlOX0JPT1NUX1ZPTFRBR0UgNDAwMAotI2RlZmluZSBNQVhfQk9PU1RfVk9MVEFHRSA1NTUwCi0jZGVmaW5lIEJPT1NUX1ZPTFRBR0VfU1RFUCA1MAotCi0jZGVmaW5lIFNETTY2MF9DRENfTUJIQ19CVE5fQ09BUlNFX0FESiAgMTAwIC8qIGluIG1WICovCi0jZGVmaW5lIFNETTY2MF9DRENfTUJIQ19CVE5fRklORV9BREogMTIgLyogaW4gbVYgKi8KLQotI2RlZmluZSBWT0xUQUdFX0NPTlZFUlRFUih2YWx1ZSwgbWluX3ZhbHVlLCBzdGVwX3NpemUpXAotCSgodmFsdWUgLSBtaW5fdmFsdWUpL3N0ZXBfc2l6ZSkKLQotZW51bSB7Ci0JQk9PU1RfU1dJVENIID0gMCwKLQlCT09TVF9BTFdBWVMsCi0JQllQQVNTX0FMV0FZUywKLQlCT09TVF9PTl9GT1JFVkVSLAotfTsKLQotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFuYWxvZ19nYWluLCAwLCAyNSwgMSk7Ci1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fYW5sZ19jZGNfaTJzX2RhaVtdOwotLyogQnkgZGVmYXVsdCBlbmFibGUgdGhlIGludGVybmFsIHNwZWFrZXIgYm9vc3QgKi8KLXN0YXRpYyBib29sIHNwa3JfYm9vc3RfZW4gPSB0cnVlOwotCi1zdGF0aWMgY2hhciBvbl9kZW1hbmRfc3VwcGx5X25hbWVbXVtNQVhfT05fREVNQU5EX1NVUFBMWV9OQU1FX0xFTkdUSF0gPSB7Ci0JImNkYy12ZGQtbWljLWJpYXMiLAotfTsKLQotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19yZWdpc3RlcgotCXdjZF9tYmhjX3JlZ2lzdGVyc1tXQ0RfTUJIQ19SRUdfRlVOQ19NQVhdID0gewotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19MX0RFVF9FTiIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEsIDB4ODAsIDcsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19HTkRfREVUX0VOIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMSwgMHg0MCwgNiwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8xLCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX0NMQU1QX0NUTCIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEsIDB4MTgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDEsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NUUkwiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweEMwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DT01QX0NUUkwiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9QTFVHX1RZUEUiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDEwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX1BMVUdfVFlQRSIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19TV19IUEhfTFBfMTAwS19UT19HTkQiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yLCAweDAxLCAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQyIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDYsIDEsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fRU4iLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0lOU1JFTV9EQk5DIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIsIDB4RjAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fREJOQyIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSLCAweDBDLCAyLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfVlJFRiIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4zX0NUTCwgMHgwMywgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0NPTVBfUkVTVUxUIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweDAxLAotCQkJICAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX1NDSE1UX1JFU1VMVCIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19aREVUX0VMRUNUX1JFU1VMVCwgMHgwMiwKLQkJCSAgMSwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxUIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweDA4LAotCQkJICAzLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9TQ0hNVF9SRVNVTFQiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQsIDB4MDQsCi0JCQkgIDIsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19PQ1BfRlNNX0VOIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NUTCwgMHgxMCwgNCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9SRVNVTFQiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCwgMHhGRiwgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9JU1JDX0NUTCIsCi0JCQkgIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLCAweDcwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfUkVTVUxUIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX1pERVRfRUxFQ1RfUkVTVUxULCAweEZGLAotCQkJICAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDQl9DVFJMIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIDB4QzAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhGQywgMiwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSFJfUEFfRU4iLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sIDB4MTAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1BBX0VOIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIX1BBX0VOIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLCAweDMwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfU1dDSF9MRVZFTF9SRU1PVkUiLAotCQkJICBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQsCi0JCQkgIDB4MTAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19QVUxMRE9XTl9DVFJMIiwKLQkJCSAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIDB4MjAsIDUsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BTkNfREVUX0VOIiwgMCwgMCwgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0ZTTV9TVEFUVVMiLCAwLCAwLCAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTVVYX0NUTCIsIDAsIDAsIDAsIDApLAotfTsKLQotLyogTXVsdGlwbHkgZ2Fpbl9hZGogYW5kIG9mZnNldCBieSAxMDAwIGFuZCAxMDAgdG8gYXZvaWQgZmxvYXQgYXJpdGhtZXRpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfaW1wZWRfaV9yZWYgaW1wZWRfaV9yZWZbXSA9IHsKLQl7SV9oNF9VQSwgOCwgODAwLCA5MDAwLCAxMDAwMH0sCi0Je0lfcHQ1X1VBLCAxMCwgMTAwLCA5OTAsIDQ2MDB9LAotCXtJXzE0X1VBLCAxNywgMTQsIDEwNTAsIDcwMH0sCi0Je0lfbDRfVUEsIDEwLCA0LCAxMTY1LCAxMTB9LAotCXtJXzFfVUEsIDAsIDEsIDEyMDAsIDY1fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfaW50ciBpbnRyX2lkcyA9IHsKLQkubWJoY19zd19pbnRyID0gIE1TTTg5WFhfSVJRX01CSENfSFNfREVULAotCS5tYmhjX2J0bl9wcmVzc19pbnRyID0gTVNNODlYWF9JUlFfTUJIQ19QUkVTUywKLQkubWJoY19idG5fcmVsZWFzZV9pbnRyID0gTVNNODlYWF9JUlFfTUJIQ19SRUxFQVNFLAotCS5tYmhjX2hzX2luc19pbnRyID0gTVNNODlYWF9JUlFfTUJIQ19JTlNSRU1fREVUMSwKLQkubWJoY19oc19yZW1faW50ciA9IE1TTTg5WFhfSVJRX01CSENfSU5TUkVNX0RFVCwKLQkuaHBoX2xlZnRfb2NwID0gTVNNODlYWF9JUlFfSFBITF9PQ1AsCi0JLmhwaF9yaWdodF9vY3AgPSBNU004OVhYX0lSUV9IUEhSX09DUCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2R0X3BhcnNlX3ZyZWdfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBzZG02NjBfY2RjX3JlZ3VsYXRvciAqdnJlZywKLQkJCQkJICAgY29uc3QgY2hhciAqdnJlZ19uYW1lLAotCQkJCQkgICBib29sIG9uZGVtYW5kKTsKLXN0YXRpYyBzdHJ1Y3Qgc2RtNjYwX2NkY19wZGF0YSAqbXNtX2FubGdfY2RjX3BvcHVsYXRlX2R0X3BkYXRhKAotCQkJCQkJc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2VuYWJsZV9leHRfbWJfc291cmNlKHN0cnVjdCB3Y2RfbWJoYyAqd2NkX21iaGMsCi0JCQkJCSAgICAgYm9vbCB0dXJuX29uKTsKLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY190cmltX2J0bl9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19zZXRfbWljYl92KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfc2V0X2Jvb3N0X3Yoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19zZXRfYXV0b196ZXJvaW5nKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICBib29sIGVuYWJsZSk7Ci1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfY29uZmlndXJlX2NhcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIGJvb2wgbWljYmlhczEsIGJvb2wgbWljYmlhczIpOwotc3RhdGljIGJvb2wgbXNtX2FubGdfY2RjX3VzZV9tYihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotCi1zdGF0aWMgaW50IGdldF9jb2RlY192ZXJzaW9uKHN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMpCi17Ci0JaWYgKHNkbTY2MF9jZGMtPmNvZGVjX3ZlcnNpb24gPT0gRFJBWF9DREMpCi0JCXJldHVybiBEUkFYX0NEQzsKLQllbHNlIGlmIChzZG02NjBfY2RjLT5jb2RlY192ZXJzaW9uID09IERJQU5HVSkKLQkJcmV0dXJuIERJQU5HVTsKLQllbHNlIGlmIChzZG02NjBfY2RjLT5jb2RlY192ZXJzaW9uID09IENBSk9OXzJfMCkKLQkJcmV0dXJuIENBSk9OXzJfMDsKLQllbHNlIGlmIChzZG02NjBfY2RjLT5jb2RlY192ZXJzaW9uID09IENBSk9OKQotCQlyZXR1cm4gQ0FKT047Ci0JZWxzZSBpZiAoc2RtNjYwX2NkYy0+Y29kZWNfdmVyc2lvbiA9PSBDT05HQSkKLQkJcmV0dXJuIENPTkdBOwotCWVsc2UgaWYgKHNkbTY2MF9jZGMtPnBtaWNfcmV2ID09IFRPTUJBS18yXzApCi0JCXJldHVybiBUT01CQUtfMl8wOwotCWVsc2UgaWYgKHNkbTY2MF9jZGMtPnBtaWNfcmV2ID09IFRPTUJBS18xXzApCi0JCXJldHVybiBUT01CQUtfMV8wOwotCi0JcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29kZWMgdmVyc2lvblxuIiwgX19mdW5jX18pOwotCXJldHVybiBVTlNVUFBPUlRFRDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX21iaGNfbWVhc19pbXBlZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJczE2ICppbXBlZGFuY2VfbCwgczE2ICppbXBlZGFuY2VfcikKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoKHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0JPVEgpIHx8Ci0JICAgIChzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9IUEhMKSkgewotCQkvKiBFbmFibGUgWkRFVF9MX01FQVNfRU4gKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwKLQkJCQkweDA4LCAweDA4KTsKLQkJLyogV2FpdCBmb3IgMm1zIGZvciBtZWFzdXJlbWVudCB0byBjb21wbGV0ZSAqLwotCQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjEwMCk7Ci0JCS8qIFJlYWQgTGVmdCBpbXBlZGFuY2UgdmFsdWUgZnJvbSBSZXN1bHQxICovCi0JCSppbXBlZGFuY2VfbCA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCk7Ci0JCS8qIEVuYWJsZSBaREVUX1JfTUVBU19FTiAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJCTB4MDgsIDB4MDApOwotCX0KLQlpZiAoKHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0JPVEgpIHx8Ci0JICAgIChzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9IUEhSKSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJCTB4MDQsIDB4MDQpOwotCQkvKiBXYWl0IGZvciAybXMgZm9yIG1lYXN1cmVtZW50IHRvIGNvbXBsZXRlICovCi0JCXVzbGVlcF9yYW5nZSgyMDAwLCAyMTAwKTsKLQkJLyogUmVhZCBSaWdodCBpbXBlZGFuY2UgdmFsdWUgZnJvbSBSZXN1bHQxICovCi0JCSppbXBlZGFuY2VfciA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROX1JFU1VMVCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCi0JCQkJMHgwNCwgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfc2V0X3JlZl9jdXJyZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIGVudW0gd2NkX2N1cnJfcmVmIGN1cnJfcmVmKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjdXJyX3JlZjogJWRcbiIsIF9fZnVuY19fLCBjdXJyX3JlZik7Ci0KLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTikKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFNldHRpbmcgcmVmIGN1cnJlbnQgbm90IHJlcXVpcmVkXG4iLAotCQkJX19mdW5jX18pOwotCi0Jc2RtNjYwX2NkYy0+aW1wZWRfaV9yZWYgPSBpbXBlZF9pX3JlZltjdXJyX3JlZl07Ci0KLQlzd2l0Y2ggKGN1cnJfcmVmKSB7Ci0JY2FzZSBJX2g0X1VBOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCi0JCQkweDA3LCAweDAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBJX3B0NV9VQToKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAotCQkJMHgwNywgMHgwNCk7Ci0JCWJyZWFrOwotCWNhc2UgSV8xNF9VQToKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAotCQkJMHgwNywgMHgwMyk7Ci0JCWJyZWFrOwotCWNhc2UgSV9sNF9VQToKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLAotCQkJMHgwNywgMHgwMSk7Ci0JCWJyZWFrOwotCWNhc2UgSV8xX1VBOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCi0JCQkweDA3LCAweDAwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBObyByZWYgY3VycmVudCBzZXRcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBtc21fYW5sZ19jZGNfYWRqX3JlZl9jdXJyZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIHMxNiAqaW1wZWRhbmNlX2wsIHMxNiAqaW1wZWRhbmNlX3IpCi17Ci0JaW50IGkgPSAyOwotCXMxNiBjb21wYXJlX2ltcCA9IDA7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSFIpCi0JCWNvbXBhcmVfaW1wID0gKmltcGVkYW5jZV9yOwotCWVsc2UKLQkJY29tcGFyZV9pbXAgPSAqaW1wZWRhbmNlX2w7Ci0KLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTikgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IFJlZmVyZW5jZSBjdXJyZW50IGFkanVzdG1lbnQgbm90IHJlcXVpcmVkXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXdoaWxlIChjb21wYXJlX2ltcCA8IGltcGVkX2lfcmVmW2ldLm1pbl92YWwpIHsKLQkJbXNtX2FubGdfY2RjX3NldF9yZWZfY3VycmVudChjb2RlYywgaW1wZWRfaV9yZWZbKytpXS5jdXJyX3JlZik7Ci0JCXdjZF9tYmhjX21lYXNfaW1wZWQoY29kZWMsIGltcGVkYW5jZV9sLCBpbXBlZGFuY2Vfcik7Ci0JCWNvbXBhcmVfaW1wID0gKHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0KLQkJCSAgICAgICBXQ0RfTUJIQ19ERVRfSFBIUikgPyAqaW1wZWRhbmNlX3IgOiAqaW1wZWRhbmNlX2w7Ci0JCWlmIChpID49IElfMV9VQSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBtc21fYW5sZ19jZGNfc3BrX2V4dF9wYV9jYigKLQkJaW50ICgqY29kZWNfc3BrX2V4dF9wYSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJaW50IGVuYWJsZSksIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjOwotCi0JaWYgKCFjb2RlYykgewotCQlwcl9lcnIoIiVzOiBOVUxMIGNvZGVjIHBvaW50ZXIhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzZG02NjBfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQlzZG02NjBfY2RjLT5jb2RlY19zcGtfZXh0X3BhX2NiID0gY29kZWNfc3BrX2V4dF9wYTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2NvbXB1dGVfaW1wZWRhbmNlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgczE2IGwsCi0JCQkJCSAgIHMxNiByLCB1aW50MzJfdCAqemwsIHVpbnQzMl90ICp6ciwKLQkJCQkJICAgYm9vbCBoaWdoKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1aW50MzJfdCBybCA9IDAsIHJyID0gMDsKLQlzdHJ1Y3Qgd2NkX2ltcGVkX2lfcmVmIFIgPSBzZG02NjBfY2RjLT5pbXBlZF9pX3JlZjsKLQlpbnQgY29kZWNfdmVyID0gZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYyk7Ci0KLQlzd2l0Y2ggKGNvZGVjX3ZlcikgewotCWNhc2UgVE9NQkFLXzFfMDoKLQljYXNlIFRPTUJBS18yXzA6Ci0JY2FzZSBDT05HQToKLQkJaWYgKGhpZ2gpIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkiJXM6IFRoaXMgcGx1ZyBoYXMgaGlnaCByYW5nZSBpbXBlZGFuY2VcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCXJsID0gKHVpbnQzMl90KSgoKDEwMCAqIChsICogNDAwIC0gMjAwKSkvOTYpIC0gMjMwKTsKLQkJCXJyID0gKHVpbnQzMl90KSgoKDEwMCAqIChyICogNDAwIC0gMjAwKSkvOTYpIC0gMjMwKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkiJXM6IFRoaXMgcGx1ZyBoYXMgbG93IHJhbmdlIGltcGVkYW5jZVxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcmwgPSAodWludDMyX3QpKCgoMTAwMCAqIChsICogMiAtIDEpKS8xMTY1KSAtICgxMy8xMCkpOwotCQkJcnIgPSAodWludDMyX3QpKCgoMTAwMCAqIChyICogMiAtIDEpKS8xMTY1KSAtICgxMy8xMCkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ0FKT046Ci0JY2FzZSBDQUpPTl8yXzA6Ci0JY2FzZSBESUFOR1U6Ci0JY2FzZSBEUkFYX0NEQzoKLQkJaWYgKHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSEwpIHsKLQkJCXJyID0gKHVpbnQzMl90KSgoKERFRkFVTFRfTVVMVElQTElFUiAqICgxMCAqIHIgLSA1KSkgLQotCQkJICAgKERFRkFVTFRfT0ZGU0VUICogREVGQVVMVF9HQUlOKSkvREVGQVVMVF9HQUlOKTsKLQkJCXJsID0gKHVpbnQzMl90KSgoKDEwMDAwICogKFIubXVsdGlwbGllciAqICgxMCAqIGwgLSA1KSkpCi0JCQkgICAgICAtIFIub2Zmc2V0ICogUi5nYWluX2FkaikvKFIuZ2Fpbl9hZGogKiAxMDApKTsKLQkJfSBlbHNlIGlmIChzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9IUEhSKSB7Ci0JCQlyciA9ICh1aW50MzJfdCkoKCgxMDAwMCAqIChSLm11bHRpcGxpZXIgKiAoMTAgKiByIC0gNSkpKQotCQkJICAgICAgLSBSLm9mZnNldCAqIFIuZ2Fpbl9hZGopLyhSLmdhaW5fYWRqICogMTAwKSk7Ci0JCQlybCA9ICh1aW50MzJfdCkoKChERUZBVUxUX01VTFRJUExJRVIgKiAoMTAgKiBsIC0gNSkpLQotCQkJICAgKERFRkFVTFRfT0ZGU0VUICogREVGQVVMVF9HQUlOKSkvREVGQVVMVF9HQUlOKTsKLQkJfSBlbHNlIGlmIChzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9OT05FKSB7Ci0JCQlyciA9ICh1aW50MzJfdCkoKChERUZBVUxUX01VTFRJUExJRVIgKiAoMTAgKiByIC0gNSkpIC0KLQkJCSAgIChERUZBVUxUX09GRlNFVCAqIERFRkFVTFRfR0FJTikpL0RFRkFVTFRfR0FJTik7Ci0JCQlybCA9ICh1aW50MzJfdCkoKChERUZBVUxUX01VTFRJUExJRVIgKiAoMTAgKiBsIC0gNSkpLQotCQkJICAgKERFRkFVTFRfT0ZGU0VUICogREVGQVVMVF9HQUlOKSkvREVGQVVMVF9HQUlOKTsKLQkJfSBlbHNlIHsKLQkJCXJyID0gKHVpbnQzMl90KSgoKDEwMDAwICogKFIubXVsdGlwbGllciAqICgxMCAqIHIgLSA1KSkpCi0JCQkgICAgICAtIFIub2Zmc2V0ICogUi5nYWluX2FkaikvKFIuZ2Fpbl9hZGogKiAxMDApKTsKLQkJCXJsID0gKHVpbnQzMl90KSgoKDEwMDAwICogKFIubXVsdGlwbGllciAqICgxMCAqIGwgLSA1KSkpCi0JCQkgICAgICAtIFIub2Zmc2V0ICogUi5nYWluX2FkaikvKFIuZ2Fpbl9hZGogKiAxMDApKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTm8gY29kZWMgbWVudGlvbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLQkqemwgPSBybDsKLQkqenIgPSBycjsKLX0KLQotc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9jYWwgKm1zbV9hbmxnX2NkY19nZXRfaHdkZXBfZndfY2FsKAotCQlzdHJ1Y3Qgd2NkX21iaGMgKndjZF9tYmhjLAotCQllbnVtIHdjZF9jYWxfdHlwZSB0eXBlKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGM7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdjZF9tYmhjLT5jb2RlYzsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBjb2RlYyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzZG02NjBfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwoc2RtNjYwX2NkYy0+ZndfZGF0YSwgdHlwZSk7Ci0JaWYgKCFod2RlcF9jYWwpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNhbCBub3Qgc2VudCBieSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gaHdkZXBfY2FsOwotfQotCi1zdGF0aWMgdm9pZCB3Y2Q5eHh4X3NwbWlfaXJxX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgaW50IGlycSwgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkKLQkJd2NkOXh4eF9zcG1pX2VuYWJsZV9pcnEoaXJxKTsKLQllbHNlCi0JCXdjZDl4eHhfc3BtaV9kaXNhYmxlX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfbWJoY19jbGtfc2V0dXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQlib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCQkweDA4LCAweDA4KTsKLQllbHNlCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJCTB4MDgsIDB4MDApOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19tYmhjX21hcF9idG5fY29kZV90b19udW0oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWludCBidG5fY29kZTsKLQlpbnQgYnRuOwotCi0JYnRuX2NvZGUgPSBzbmRfc29jX3JlYWQoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUKTsKLQotCXN3aXRjaCAoYnRuX2NvZGUpIHsKLQljYXNlIDA6Ci0JCWJ0biA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJYnRuID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlidG4gPSAyOwotCQlicmVhazsKLQljYXNlIDc6Ci0JCWJ0biA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgMTU6Ci0JCWJ0biA9IDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJ0biA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gYnRuOwotfQotCi1zdGF0aWMgYm9vbCBtc21fYW5sZ19jZGNfc3BtaV9sb2NrX3NsZWVwKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgYm9vbCBsb2NrKQotewotCWlmIChsb2NrKQotCQlyZXR1cm4gd2NkOXh4eF9zcG1pX2xvY2tfc2xlZXAoKTsKLQl3Y2Q5eHh4X3NwbWlfdW5sb2NrX3NsZWVwKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIG1zbV9hbmxnX2NkY19taWNiX2VuX3N0YXR1cyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIGludCBtaWNiX251bSkKLXsKLQlpZiAobWljYl9udW0gPT0gTUlDX0JJQVNfMSkKLQkJcmV0dXJuIChzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsCi0JCQkJICAgICBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTikgJgotCQkJMHg4MCk7Ci0JaWYgKG1pY2JfbnVtID09IE1JQ19CSUFTXzIpCi0JCXJldHVybiAoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLAotCQkJCSAgICAgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4pICYKLQkJCTB4ODApOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2VuYWJsZV9tYXN0ZXJfYmlhcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICBib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTCwKLQkJCQkgICAgMHgzMCwgMHgzMCk7Ci0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTCwKLQkJCQkgICAgMHgzMCwgMHgwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19tYmhjX2NvbW1vbl9taWNiX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICAgaW50IGV2ZW50LCBib29sIGVuYWJsZSkKLXsKLQl1MTYgcmVnOwotCXU4IG1hc2s7Ci0JdTggdmFsOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgTUJIQ19DT01NT05fTUlDQl9QUkVDSEFSR0U6Ci0JCXJlZyA9IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0NUTDsKLQkJbWFzayA9IDB4NjA7Ci0JCXZhbCA9IChlbmFibGUgPyAweDYwIDogMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgTUJIQ19DT01NT05fTUlDQl9TRVRfVkFMOgotCQlyZWcgPSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9WQUw7Ci0JCW1hc2sgPSAweEZGOwotCQl2YWwgPSAoZW5hYmxlID8gMHhDMCA6IDB4MDApOwotCQlicmVhazsKLQljYXNlIE1CSENfQ09NTU9OX01JQ0JfVEFJTF9DVVJSOgotCQlyZWcgPSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTjsKLQkJbWFzayA9IDB4MDQ7Ci0JCXZhbCA9IChlbmFibGUgPyAweDA0IDogMHgwMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBldmVudCByZWNlaXZlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIG1hc2ssIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19tYmhjX2ludGVybmFsX21pY2JpYXNfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCQkgICAgaW50IG1pY2JpYXNfbnVtLAotCQkJCQkJICAgIGJvb2wgZW5hYmxlKQotewotCWlmIChtaWNiaWFzX251bSA9PSAxKSB7Ci0JCWlmIChlbmFibGUpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0lOVF9SQklBUywKLQkJCQkweDEwLCAweDEwKTsKLQkJZWxzZQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9JTlRfUkJJQVMsCi0JCQkJMHgxMCwgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBtc21fYW5sZ19jZGNfbWJoY19ocGhfcGFfb25fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gKHNuZF9zb2NfcmVhZChjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOKSAmCi0JCTB4MzApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfbWJoY19wcm9ncmFtX2J0bl90aHIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBzMTYgKmJ0bl9sb3csIHMxNiAqYnRuX2hpZ2gsCi0JCQkJCSAgICAgIGludCBudW1fYnRuLCBib29sIGlzX21pY2JpYXMpCi17Ci0JaW50IGk7Ci0JdTMyIGNvdXJzZSwgZmluZSwgcmVnX3ZhbDsKLQl1MTYgcmVnX2FkZHIgPSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEw7Ci0JczE2ICpidG5fdm9sdGFnZTsKLQotCWJ0bl92b2x0YWdlID0gKChpc19taWNiaWFzKSA/IGJ0bl9oaWdoIDogYnRuX2xvdyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgIG51bV9idG47IGkrKykgewotCQljb3Vyc2UgPSAoYnRuX3ZvbHRhZ2VbaV0gLyBTRE02NjBfQ0RDX01CSENfQlROX0NPQVJTRV9BREopOwotCQlmaW5lID0gKChidG5fdm9sdGFnZVtpXSAlIFNETTY2MF9DRENfTUJIQ19CVE5fQ09BUlNFX0FESikgLwotCQkJCVNETTY2MF9DRENfTUJIQ19CVE5fRklORV9BREopOwotCi0JCXJlZ192YWwgPSAoY291cnNlIDw8IDUpIHwgKGZpbmUgPDwgMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ19hZGRyLCAweEZDLCByZWdfdmFsKTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJIiVzOiBjb3Vyc2U6ICVkIGZpbmU6ICVkIHJlZ19hZGRyOiAleCByZWdfdmFsOiAleFxuIiwKLQkJCSAgX19mdW5jX18sIGNvdXJzZSwgZmluZSwgcmVnX2FkZHIsIHJlZ192YWwpOwotCQlyZWdfYWRkcisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX21iaGNfY2FsY19pbXBlZGFuY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQkgICAgIHVpbnQzMl90ICp6bCwgdWludDMyX3QgKnpyKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzMTYgaW1wZWRhbmNlX2wsIGltcGVkYW5jZV9yOwotCXMxNiBpbXBlZGFuY2VfbF9maXhlZDsKLQlzMTYgcmVnMCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNDsKLQlib29sIGhpZ2ggPSBmYWxzZTsKLQlib29sIG1pbl9yYW5nZV91c2VkID0gIGZhbHNlOwotCi0JV0NEX01CSENfUlNDX0FTU0VSVF9MT0NLRUQobWJoYyk7Ci0JcmVnMCA9IHNuZF9zb2NfcmVhZChjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIpOwotCXJlZzEgPSBzbmRfc29jX3JlYWQoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4yX1pERVRIX0NUTCk7Ci0JcmVnMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMik7Ci0JcmVnMyA9IHNuZF9zb2NfcmVhZChjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4pOwotCXJlZzQgPSBzbmRfc29jX3JlYWQoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMKTsKLQotCXNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPSBXQ0RfTUJIQ19ERVRfQk9USDsKLQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOwotCi0JLyogZGlzYWJsZSBGU00gYW5kIG1pY2JpYXMgYW5kIGVuYWJsZSBwdWxsdXAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwKLQkJCTB4ODAsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwKLQkJCTB4QTUsIDB4MjUpOwotCS8qCi0JICogRW5hYmxlIGxlZ2FjeSBlbGVjdHJpY2FsIGRldGVjdGlvbiBjdXJyZW50IHNvdXJjZXMKLQkgKiBhbmQgZGlzYWJsZSBmYXN0IHJhbXAgYW5kIGVuYWJsZSBtYW51YWwgc3dpdGNoaW5nCi0JICogb2YgZXh0cmEgY2FwYWNpdGFuY2UKLQkgKi8KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogU2V0dXAgZm9yIGltcGVkYW5jZSBkZXRcbiIsIF9fZnVuY19fKTsKLQotCW1zbV9hbmxnX2NkY19zZXRfcmVmX2N1cnJlbnQoY29kZWMsIElfaDRfVUEpOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsCi0JCQkweDA2LCAweDAyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIsCi0JCQkweDAyLCAweDAyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMLAotCQkJMHgwMiwgMHgwMCk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogU3RhcnQgcGVyZm9ybWluZyBpbXBlZGFuY2UgZGV0ZWN0aW9uXG4iLAotCQkgX19mdW5jX18pOwotCi0Jd2NkX21iaGNfbWVhc19pbXBlZChjb2RlYywgJmltcGVkYW5jZV9sLCAmaW1wZWRhbmNlX3IpOwotCi0JaWYgKGltcGVkYW5jZV9sID4gMiB8fCBpbXBlZGFuY2VfciA+IDIpIHsKLQkJaGlnaCA9IHRydWU7Ci0JCWlmICghbWJoYy0+bWJoY19jZmctPm1vbm9fc3Rlcm9fZGV0ZWN0aW9uKSB7Ci0JCQkvKiBTZXQgWkRFVF9DSEcgdG8gMCAgdG8gZGlzY2hhcmdlIHJhbXAgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJCQkweDAyLCAweDAwKTsKLQkJCS8qIHdhaXQgNDBtcyBmb3IgdGhlIGRpc2NoYXJnZSByYW1wIHRvIGNvbXBsZXRlICovCi0JCQl1c2xlZXBfcmFuZ2UoNDAwMDAsIDQwMTAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjBfWkRFVExfQ1RMLAotCQkJCTB4MDMsIDB4MDApOwotCQkJc2RtNjYwX2NkYy0+aW1wZWRfZGV0X3BpbiA9IChpbXBlZGFuY2VfbCA+IDIgJiYKLQkJCQkJCSAgICAgIGltcGVkYW5jZV9yID4gMikgPwotCQkJCQkJICAgICAgV0NEX01CSENfREVUX05PTkUgOgotCQkJCQkJICAgICAgKChpbXBlZGFuY2VfbCA+IDIpID8KLQkJCQkJCSAgICAgIFdDRF9NQkhDX0RFVF9IUEhSIDoKLQkJCQkJCSAgICAgIFdDRF9NQkhDX0RFVF9IUEhMKTsKLQkJCWlmIChzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9OT05FKQotCQkJCWdvdG8gZXhpdDsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBDQUpPTikgewotCQkJCWlmIChpbXBlZGFuY2VfbCA9PSA2MyAmJiBpbXBlZGFuY2VfciA9PSA2MykgewotCQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJCQkiJXM6IEhQSEwgYW5kIEhQSFIgYXJlIGZsb2F0aW5nXG4iLAotCQkJCQkJIF9fZnVuY19fKTsKLQkJCQkJc2RtNjYwX2NkYy0+aW1wZWRfZGV0X3BpbiA9Ci0JCQkJCQkJV0NEX01CSENfREVUX05PTkU7Ci0JCQkJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX05PTkU7Ci0JCQkJfSBlbHNlIGlmIChpbXBlZGFuY2VfbCA9PSA2MwotCQkJCQkgICAmJiBpbXBlZGFuY2VfciA8IDYzKSB7Ci0JCQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkJCSIlczogTW9ubyBIUyB3aXRoIEhQSEwgZmxvYXRpbmdcbiIsCi0JCQkJCQkgX19mdW5jX18pOwotCQkJCQlzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID0KLQkJCQkJCQlXQ0RfTUJIQ19ERVRfSFBIUjsKLQkJCQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKLQkJCQl9IGVsc2UgaWYgKGltcGVkYW5jZV9yID09IDYzICYmCi0JCQkJCSAgIGltcGVkYW5jZV9sIDwgNjMpIHsKLQkJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCQkJIiVzOiBNb25vIEhTIHdpdGggSFBIUiBmbG9hdGluZ1xuIiwKLQkJCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJCXNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPQotCQkJCQkJCVdDRF9NQkhDX0RFVF9IUEhMOwotCQkJCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9NT05POwotCQkJCX0gZWxzZSBpZiAoaW1wZWRhbmNlX2wgPiAzICYmIGltcGVkYW5jZV9yID4gMyAmJgotCQkJCQkoaW1wZWRhbmNlX2wgPT0gaW1wZWRhbmNlX3IpKSB7Ci0JCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsCi0JCQkJCTB4MDYsIDB4MDYpOwotCQkJCQl3Y2RfbWJoY19tZWFzX2ltcGVkKGNvZGVjLCAmaW1wZWRhbmNlX2wsCi0JCQkJCQkJICAgICZpbXBlZGFuY2Vfcik7Ci0JCQkJCWlmIChpbXBlZGFuY2VfciA9PSBpbXBlZGFuY2VfbCkKLQkJCQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkJCQkiJXM6IE1vbm8gSGVhZHNldFxuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCQlzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID0KLQkJCQkJCQlXQ0RfTUJIQ19ERVRfTk9ORTsKLQkJCQkJCW1iaGMtPmhwaF90eXBlID0KLQkJCQkJCQlXQ0RfTUJIQ19IUEhfTU9OTzsKLQkJCQl9IGVsc2UgewotCQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJCQkiJXM6IFNURVJFTyBoZWFkc2V0IGlzIGZvdW5kXG4iLAotCQkJCQkJIF9fZnVuY19fKTsKLQkJCQkJc2RtNjYwX2NkYy0+aW1wZWRfZGV0X3BpbiA9Ci0JCQkJCQkJV0NEX01CSENfREVUX0JPVEg7Ci0JCQkJCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX1NURVJFTzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQltc21fYW5sZ19jZGNfc2V0X3JlZl9jdXJyZW50KGNvZGVjLCBJX3B0NV9VQSk7Ci0JbXNtX2FubGdfY2RjX3NldF9yZWZfY3VycmVudChjb2RlYywgSV8xNF9VQSk7Ci0KLQkvKiBFbmFibGUgUkFNUF9MICwgUkFNUF9SICYgWkRFVF9DSEcqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwsCi0JCQkweDAzLCAweDAzKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCi0JCQkweDAyLCAweDAyKTsKLQkvKiB3YWl0IGZvciA1MG1zZWMgZm9yIHRoZSBIVyB0byBhcHBseSByYW1wIG9uIEhQSEwgYW5kIEhQSFIgKi8KLQl1c2xlZXBfcmFuZ2UoNTAwMDAsIDUwMTAwKTsKLQkvKiBFbmFibGUgWkRFVF9ESVNDSEdfQ0FQX0NUTCAgdG8gYWRkIGV4dHJhIGNhcGFjaXRhbmNlICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJMHgwMSwgMHgwMSk7Ci0JLyogd2FpdCBmb3IgNW1zZWMgZm9yIHRoZSB2b2x0YWdlIHRvIGdldCBzdGFibGUgKi8KLQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7Ci0KLQl3Y2RfbWJoY19tZWFzX2ltcGVkKGNvZGVjLCAmaW1wZWRhbmNlX2wsICZpbXBlZGFuY2Vfcik7Ci0KLQltaW5fcmFuZ2VfdXNlZCA9IG1zbV9hbmxnX2NkY19hZGpfcmVmX2N1cnJlbnQoY29kZWMsCi0JCQkJCQkmaW1wZWRhbmNlX2wsICZpbXBlZGFuY2Vfcik7Ci0JaWYgKCFtYmhjLT5tYmhjX2NmZy0+bW9ub19zdGVyb19kZXRlY3Rpb24pIHsKLQkJLyogU2V0IFpERVRfQ0hHIHRvIDAgIHRvIGRpc2NoYXJnZSByYW1wICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCi0JCQkJMHgwMiwgMHgwMCk7Ci0JCS8qIHdhaXQgZm9yIDQwbXNlYyBmb3IgdGhlIGNhcGFjaXRvciB0byBkaXNjaGFyZ2UgKi8KLQkJdXNsZWVwX3JhbmdlKDQwMDAwLCA0MDEwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjBfWkRFVExfQ1RMLAotCQkJCTB4MDMsIDB4MDApOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogd2UgYXJlIHNldHRpbmcgcmVmIGN1cnJlbnQgdG8gdGhlIG1pbmltdW4gcmFuZ2Ugb3IgdGhlIG1lYXN1cmVkCi0JICogdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUsIHNvIG1pbl9yYW5nZV91c2VkIGlzIHRydWUuCi0JICogSWYgdGhlIGhlYWRzZXQgaXMgbW9ubyBoZWFkc2V0IHdpdGggZWl0aGVyIEhQSEwgb3IgSFBIUiBmbG9hdGluZwotCSAqIHRoZW4gd2UgaGF2ZSBhbHJlYWR5IGRvbmUgdGhlIG1vbm8gc3RlcmVvIGRldGVjdGlvbiBhbmQgZG8gbm90Ci0JICogbmVlZCB0byBjb250aW51ZSBmdXJ0aGVyLgotCSAqLwotCi0JaWYgKCFtaW5fcmFuZ2VfdXNlZCB8fAotCSAgICBzZG02NjBfY2RjLT5pbXBlZF9kZXRfcGluID09IFdDRF9NQkhDX0RFVF9IUEhMIHx8Ci0JICAgIHNkbTY2MF9jZGMtPmltcGVkX2RldF9waW4gPT0gV0NEX01CSENfREVUX0hQSFIpCi0JCWdvdG8gZXhpdDsKLQotCi0JLyogRGlzYWJsZSBTZXQgWkRFVF9DT05OX1JBTVBfTCBhbmQgZW5hYmxlIFpERVRfQ09OTl9GSVhFRF9MICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTCwKLQkJCTB4MDIsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMV9aREVUTV9DVEwsCi0JCQkweDAyLCAweDAyKTsKLQkvKiBTZXQgWkRFVF9DSEcgdG8gMCAgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCi0JCQkweDAyLCAweDAwKTsKLQkvKiB3YWl0IGZvciA0MG1zZWMgZm9yIHRoZSBjYXBhY2l0b3IgdG8gZGlzY2hhcmdlICovCi0JdXNsZWVwX3JhbmdlKDQwMDAwLCA0MDEwMCk7Ci0KLQkvKiBTZXQgWkRFVF9DT05OX1JBTVBfUiB0byAwICAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwsCi0JCQkweDAxLCAweDAwKTsKLQkvKiBFbmFibGUgWkRFVF9MX01FQVNfRU4gKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0ZTTV9DVEwsCi0JCQkweDA4LCAweDA4KTsKLQkvKiB3YWl0IGZvciAybXNlYyBmb3IgdGhlIEhXIHRvIGNvbXB1dGUgbGVmdCBpbnBlZGFuY2UgdmFsdWUgKi8KLQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjEwMCk7Ci0JLyogUmVhZCBMZWZ0IGltcGVkYW5jZSB2YWx1ZSBmcm9tIFJlc3VsdDEgKi8KLQlpbXBlZGFuY2VfbF9maXhlZCA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUKTsKLQkvKiBEaXNhYmxlIFpERVRfTF9NRUFTX0VOICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJMHgwOCwgMHgwMCk7Ci0JLyoKLQkgKiBBc3N1bWUgaW1wZWRhbmNlX2wgaXMgTDEsIGltcGVkYW5jZV9sX2ZpeGVkIGlzIEwyLgotCSAqIElmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGlzIG1ldCwgd2UgY2FuIHRha2UgdGhpcwotCSAqIGhlYWRzZXQgYXMgbW9ubyBvbmUgd2l0aCBpbXBlZGFuY2Ugb2YgTDIuCi0JICogT3RoZXJ3aXNlLCB0YWtlIGl0IGFzIHN0ZXJlbyB3aXRoIGltcGVkYW5jZSBvZiBMMS4KLQkgKiBDb25kaXRpb246Ci0JICogYWJzWyhMMi0wLjVMMSkvKEwyKzAuNUwxKV0gPCBhYnMgWyhMMi1MMSkvKEwyK0wxKV0KLQkgKi8KLQlpZiAoKGFicyhpbXBlZGFuY2VfbF9maXhlZCAtIGltcGVkYW5jZV9sLzIpICoKLQkJKGltcGVkYW5jZV9sX2ZpeGVkICsgaW1wZWRhbmNlX2wpKSA+PQotCQkoYWJzKGltcGVkYW5jZV9sX2ZpeGVkIC0gaW1wZWRhbmNlX2wpICoKLQkJKGltcGVkYW5jZV9sX2ZpeGVkICsgaW1wZWRhbmNlX2wvMikpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogU1RFUkVPIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX1NURVJFTzsKLQl9IGVsc2UgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IE1PTk8gcGx1ZyB0eXBlIGRldGVjdGVkXG4iLAotCQkJX19mdW5jX18pOwotCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9NT05POwotCQlpbXBlZGFuY2VfbCA9IGltcGVkYW5jZV9sX2ZpeGVkOwotCX0KLQkvKiBFbmFibGUgWkRFVF9DSEcgICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJMHgwMiwgMHgwMik7Ci0JLyogd2FpdCBmb3IgMTBtc2VjIGZvciB0aGUgY2FwYWNpdG9yIHRvIGNoYXJnZSAqLwotCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwsCi0JCQkweDAyLCAweDAyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjFfWkRFVE1fQ1RMLAotCQkJMHgwMiwgMHgwMCk7Ci0JLyogU2V0IFpERVRfQ0hHIHRvIDAgIHRvIGRpc2NoYXJnZSBIUEhMICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19GU01fQ1RMLAotCQkJMHgwMiwgMHgwMCk7Ci0JLyogd2FpdCBmb3IgNDBtc2VjIGZvciB0aGUgY2FwYWNpdG9yIHRvIGRpc2NoYXJnZSAqLwotCXVzbGVlcF9yYW5nZSg0MDAwMCwgNDAxMDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMF9aREVUTF9DVEwsCi0JCQkweDAyLCAweDAwKTsKLQotZXhpdDoKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwgcmVnNCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIHJlZzMpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4yX1pERVRIX0NUTCwgcmVnMSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIsIHJlZzApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIHJlZzIpOwotCW1zbV9hbmxnX2NkY19jb21wdXRlX2ltcGVkYW5jZShjb2RlYywgaW1wZWRhbmNlX2wsIGltcGVkYW5jZV9yLAotCQkJCSAgICAgIHpsLCB6ciwgaGlnaCk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUkwgJWQgb2htLCBSUiAlZCBvaG1cbiIsIF9fZnVuY19fLCAqemwsICp6cik7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEltcGVkYW5jZSBkZXRlY3Rpb24gY29tcGxldGVkXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2RpZ19yZWdpc3Rlcl9ub3RpZmllcih2b2lkICpoYW5kbGUsCi0JCQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrLAotCQkJCQkgICAgICBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpoYW5kbGVfY2RjID0gaGFuZGxlOwotCi0JaWYgKGVuYWJsZSkKLQkJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZoYW5kbGVfY2RjLT5ub3RpZmllciwKLQkJCQkJCQluYmxvY2spOwotCi0JcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmhhbmRsZV9jZGMtPm5vdGlmaWVyLAotCQkJCQkJICBuYmxvY2spOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19tYmhjX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB3Y2RfbWJoYyAqd2NkX21iaGMsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaywKLQkJCQkJICAgICAgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdjZF9tYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoZW5hYmxlKQotCQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCi0JCQkJCQkmc2RtNjYwX2NkYy0+bm90aWZpZXJfbWJoYywKLQkJCQkJCW5ibG9jayk7Ci0KLQlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3Rlcigmc2RtNjYwX2NkYy0+bm90aWZpZXJfbWJoYywKLQkJCQkJCSAgbmJsb2NrKTsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfcmVxdWVzdF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICBpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHdjZDl4eHhfc3BtaV9yZXF1ZXN0X2lycShpcnEsIGhhbmRsZXIsIG5hbWUsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19mcmVlX2lycShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHdjZDl4eHhfc3BtaV9mcmVlX2lycShpcnEsIGRhdGEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiIG1iaGNfY2IgPSB7Ci0JLmVuYWJsZV9tYl9zb3VyY2UgPSBtc21fYW5sZ19jZGNfZW5hYmxlX2V4dF9tYl9zb3VyY2UsCi0JLnRyaW1fYnRuX3JlZyA9IG1zbV9hbmxnX2NkY190cmltX2J0bl9yZWcsCi0JLmNvbXB1dGVfaW1wZWRhbmNlID0gbXNtX2FubGdfY2RjX21iaGNfY2FsY19pbXBlZGFuY2UsCi0JLnNldF9taWNiaWFzX3ZhbHVlID0gbXNtX2FubGdfY2RjX3NldF9taWNiX3YsCi0JLnNldF9hdXRvX3plcm9pbmcgPSBtc21fYW5sZ19jZGNfc2V0X2F1dG9femVyb2luZywKLQkuZ2V0X2h3ZGVwX2Z3X2NhbCA9IG1zbV9hbmxnX2NkY19nZXRfaHdkZXBfZndfY2FsLAotCS5zZXRfY2FwX21vZGUgPSBtc21fYW5sZ19jZGNfY29uZmlndXJlX2NhcCwKLQkucmVnaXN0ZXJfbm90aWZpZXIgPSBtc21fYW5sZ19jZGNfbWJoY19yZWdpc3Rlcl9ub3RpZmllciwKLQkucmVxdWVzdF9pcnEgPSBtc21fYW5sZ19jZGNfcmVxdWVzdF9pcnEsCi0JLmlycV9jb250cm9sID0gd2NkOXh4eF9zcG1pX2lycV9jb250cm9sLAotCS5mcmVlX2lycSA9IG1zbV9hbmxnX2NkY19mcmVlX2lycSwKLQkuY2xrX3NldHVwID0gbXNtX2FubGdfY2RjX21iaGNfY2xrX3NldHVwLAotCS5tYXBfYnRuX2NvZGVfdG9fbnVtID0gbXNtX2FubGdfY2RjX21iaGNfbWFwX2J0bl9jb2RlX3RvX251bSwKLQkubG9ja19zbGVlcCA9IG1zbV9hbmxnX2NkY19zcG1pX2xvY2tfc2xlZXAsCi0JLm1pY2JpYXNfZW5hYmxlX3N0YXR1cyA9IG1zbV9hbmxnX2NkY19taWNiX2VuX3N0YXR1cywKLQkubWJoY19iaWFzID0gbXNtX2FubGdfY2RjX2VuYWJsZV9tYXN0ZXJfYmlhcywKLQkubWJoY19jb21tb25fbWljYl9jdHJsID0gbXNtX2FubGdfY2RjX21iaGNfY29tbW9uX21pY2JfY3RybCwKLQkubWljYl9pbnRlcm5hbCA9IG1zbV9hbmxnX2NkY19tYmhjX2ludGVybmFsX21pY2JpYXNfY3RybCwKLQkuaHBoX3BhX29uX3N0YXR1cyA9IG1zbV9hbmxnX2NkY19tYmhjX2hwaF9wYV9vbl9zdGF0dXMsCi0JLnNldF9idG5fdGhyID0gbXNtX2FubGdfY2RjX21iaGNfcHJvZ3JhbV9idG5fdGhyLAotCS5leHRuX3VzZV9tYiA9IG1zbV9hbmxnX2NkY191c2VfbWIsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qgd2NkX2ltcGVkX3ZhbFtdID0gezQsIDgsIDEyLCAxMywgMTYsCi0JCQkJCTIwLCAyNCwgMjgsIDMyLAotCQkJCQkzNiwgNDAsIDQ0LCA0OH07Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19kaWdfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWNvbnN0IGVudW0gZGlnX2NkY19ub3RpZnlfZXZlbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JcHJfZGVidWcoIiVzOiBub3RpZmllciBjYWxsIGV2ZW50ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnNkbTY2MF9jZGMtPm5vdGlmaWVyLAotCQkJCSAgICAgZXZlbnQsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIGNvbnN0IGVudW0gd2NkX25vdGlmeV9ldmVudCBldmVudCkKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbm90aWZpZXIgY2FsbCBldmVudCAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZzZG02NjBfY2RjLT5ub3RpZmllcl9tYmhjLCBldmVudCwKLQkJCQkgICAgICZzZG02NjBfY2RjLT5tYmhjKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2Jvb3N0X29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiwgMHgwRik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLCAweEE1KTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMsIDB4MEYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMLCAweDMwKTsKLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTl8yXzApCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfQ1VSUkVOVF9MSU1JVCwgMHg4Mik7Ci0JZWxzZQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4QTIpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAotCQkJICAgIDB4NjksIDB4NjkpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHLAotCQkJICAgIDB4MDEsIDB4MDEpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPLAotCQkJICAgIDB4ODgsIDB4ODgpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EQUNfQ1RMLAotCQkJICAgIDB4MDMsIDB4MDMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9PQ1BfQ1RMLAotCQkJICAgIDB4RTEsIDB4RTEpOwotCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA8IENBSk9OXzJfMCkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkJICAgIDB4MjAsIDB4MjApOwotCQkvKiBXYWl0IGZvciAxbXMgYWZ0ZXIgY2xvY2sgY3RsIGVuYWJsZSAqLwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVEwsCi0JCQkJICAgIDB4REYsIDB4REYpOwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwKLQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCQkgICAgMHgyMCwgMHgyMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAotCQkJCSAgICAweDgwLCAweDgwKTsKLQkJLyogV2FpdCBmb3IgNTAwdXMgYWZ0ZXIgQk9PU1RfRU4gdG8gaGFwcGVuICovCi0JCXVzbGVlcF9yYW5nZSg1MDAsIDUxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAotCQkJCSAgICAweDQwLCAweDQwKTsKLQkJLyogV2FpdCBmb3IgNTAwdXMgYWZ0ZXIgQk9PU1QgcHVsc2Vfc2tpcCAqLwotCQl1c2xlZXBfcmFuZ2UoNTAwLCA1MTApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2Jvb3N0X29mZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVEwsCi0JCQkgICAgMHhERiwgMHg1Rik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJICAgIDB4MjAsIDB4MDApOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfYnlwYXNzX29uKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTl8yXzApIHsKLQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywKLQkJCTB4QTUpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzLAotCQkJMHgwNyk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHgwMiwgMHgwMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHgwMSwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHg0MCwgMHg0MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHg4MCwgMHg4MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwKLQkJCTB4REYsIDB4REYpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkweDIwLCAweDIwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUsCi0JCQkweDIwLCAweDIwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19ieXBhc3Nfb2ZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTl8yXzApIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfRU5fQ1RMLAotCQkJMHg4MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHg4MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHgwMiwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLAotCQkJMHg0MCwgMHgwMCk7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUsCi0JCQkweDIwLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCTB4MjAsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2Jvb3N0X21vZGVfc2VxdWVuY2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgIGludCBmbGFnKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmIChmbGFnID09IEVBUl9QTVUpIHsKLQkJc3dpdGNoIChzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pIHsKLQkJY2FzZSBCT09TVF9TV0lUQ0g6Ci0JCQlpZiAoc2RtNjYwX2NkYy0+ZWFyX3BhX2Jvb3N0X3NldCkgewotCQkJCW1zbV9hbmxnX2NkY19ib29zdF9vZmYoY29kZWMpOwotCQkJCW1zbV9hbmxnX2NkY19ieXBhc3Nfb24oY29kZWMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQk9PU1RfQUxXQVlTOgotCQkJbXNtX2FubGdfY2RjX2Jvb3N0X29uKGNvZGVjKTsKLQkJCWJyZWFrOwotCQljYXNlIEJZUEFTU19BTFdBWVM6Ci0JCQltc21fYW5sZ19jZGNfYnlwYXNzX29uKGNvZGVjKTsKLQkJCWJyZWFrOwotCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6Ci0JCQltc21fYW5sZ19jZGNfYm9vc3Rfb24oY29kZWMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAoZmxhZyA9PSBFQVJfUE1EKSB7Ci0JCXN3aXRjaCAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKSB7Ci0JCWNhc2UgQk9PU1RfU1dJVENIOgotCQkJaWYgKHNkbTY2MF9jZGMtPmVhcl9wYV9ib29zdF9zZXQpCi0JCQkJbXNtX2FubGdfY2RjX2J5cGFzc19vZmYoY29kZWMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9PU1RfQUxXQVlTOgotCQkJbXNtX2FubGdfY2RjX2Jvb3N0X29mZihjb2RlYyk7Ci0JCQkvKiA4MG1zIGZvciBFQVIgYm9vc3QgdG8gc2V0dGxlIGRvd24gKi8KLQkJCW1zbGVlcCg4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBCWVBBU1NfQUxXQVlTOgotCQkJLyogbm90aGluZyB0byBkbyBhcyBieXBhc3Mgb24gYWx3YXlzICovCi0JCQlicmVhazsKLQkJY2FzZSBCT09TVF9PTl9GT1JFVkVSOgotCQkJLyogbm90aGluZyB0byBkbyBhcyBib29zdCBvbiBmb3JldmVyICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IGludmFsaWQgYm9vc3Qgb3B0aW9uOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmIChmbGFnID09IFNQS19QTVUpIHsKLQkJc3dpdGNoIChzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pIHsKLQkJY2FzZSBCT09TVF9TV0lUQ0g6Ci0JCQlpZiAoc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCkgewotCQkJCW1zbV9hbmxnX2NkY19ieXBhc3Nfb2ZmKGNvZGVjKTsKLQkJCQltc21fYW5sZ19jZGNfYm9vc3Rfb24oY29kZWMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQk9PU1RfQUxXQVlTOgotCQkJbXNtX2FubGdfY2RjX2Jvb3N0X29uKGNvZGVjKTsKLQkJCWJyZWFrOwotCQljYXNlIEJZUEFTU19BTFdBWVM6Ci0JCQltc21fYW5sZ19jZGNfYnlwYXNzX29uKGNvZGVjKTsKLQkJCWJyZWFrOwotCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6Ci0JCQltc21fYW5sZ19jZGNfYm9vc3Rfb24oY29kZWMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAoZmxhZyA9PSBTUEtfUE1EKSB7Ci0JCXN3aXRjaCAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKSB7Ci0JCWNhc2UgQk9PU1RfU1dJVENIOgotCQkJaWYgKHNkbTY2MF9jZGMtPnNwa19ib29zdF9zZXQpIHsKLQkJCQltc21fYW5sZ19jZGNfYm9vc3Rfb2ZmKGNvZGVjKTsKLQkJCQkvKgotCQkJCSAqIEFkZCA0MCBtcyBzbGVlcCBmb3IgdGhlIHNwawotCQkJCSAqIGJvb3N0IHRvIHNldHRsZSBkb3duCi0JCQkJICovCi0JCQkJbXNsZWVwKDQwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEJPT1NUX0FMV0FZUzoKLQkJCW1zbV9hbmxnX2NkY19ib29zdF9vZmYoY29kZWMpOwotCQkJLyoKLQkJCSAqIEFkZCA0MCBtcyBzbGVlcCBmb3IgdGhlIHNwawotCQkJICogYm9vc3QgdG8gc2V0dGxlIGRvd24KLQkJCSAqLwotCQkJbXNsZWVwKDQwKTsKLQkJCWJyZWFrOwotCQljYXNlIEJZUEFTU19BTFdBWVM6Ci0JCQkvKiBub3RoaW5nIHRvIGRvIGFzIGJ5cGFzcyBvbiBhbHdheXMgKi8KLQkJCWJyZWFrOwotCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6Ci0JCQkvKiBub3RoaW5nIHRvIGRvIGFzIGJvb3N0IG9uIGZvcmV2ZXIgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogaW52YWxpZCBib29zdCBvcHRpb246ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2R0X3BhcnNlX3ZyZWdfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IHNkbTY2MF9jZGNfcmVndWxhdG9yICp2cmVnLCBjb25zdCBjaGFyICp2cmVnX25hbWUsCi0JYm9vbCBvbmRlbWFuZCkKLXsKLQlpbnQgbGVuLCByZXQgPSAwOwotCWNvbnN0IF9fYmUzMiAqcHJvcDsKLQljaGFyIHByb3BfbmFtZVtDT0RFQ19EVF9NQVhfUFJPUF9TSVpFXTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJlZ25vZGUgPSBOVUxMOwotCXUzMiBwcm9wX3ZhbDsKLQotCXNucHJpbnRmKHByb3BfbmFtZSwgQ09ERUNfRFRfTUFYX1BST1BfU0laRSwgIiVzLXN1cHBseSIsCi0JCXZyZWdfbmFtZSk7Ci0JcmVnbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsIDApOwotCi0JaWYgKCFyZWdub2RlKSB7Ci0JCWRldl9lcnIoZGV2LCAiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZFxuIiwKLQkJCXByb3BfbmFtZSwgZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlkZXZfZGJnKGRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlc1xuIiwKLQkJcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0KLQl2cmVnLT5uYW1lID0gdnJlZ19uYW1lOwotCXZyZWctPm9uZGVtYW5kID0gb25kZW1hbmQ7Ci0KLQlzbnByaW50Zihwcm9wX25hbWUsIENPREVDX0RUX01BWF9QUk9QX1NJWkUsCi0JCSJxY29tLCVzLXZvbHRhZ2UiLCB2cmVnX25hbWUpOwotCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsICZsZW4pOwotCi0JaWYgKCFwcm9wIHx8IChsZW4gIT0gKDIgKiBzaXplb2YoX19iZTMyKSkpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgJXMgcHJvcGVydHlcbiIsCi0JCQlwcm9wID8gImludmFsaWQgZm9ybWF0IiA6ICJubyIsIHByb3BfbmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2cmVnLT5taW5fdXYgPSBiZTMyX3RvX2NwdXAoJnByb3BbMF0pOwotCXZyZWctPm1heF91diA9IGJlMzJfdG9fY3B1cCgmcHJvcFsxXSk7Ci0KLQlzbnByaW50Zihwcm9wX25hbWUsIENPREVDX0RUX01BWF9QUk9QX1NJWkUsCi0JCSJxY29tLCVzLWN1cnJlbnQiLCB2cmVnX25hbWUpOwotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsICZwcm9wX3ZhbCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQiLAotCQkJcHJvcF9uYW1lLCBkZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQl2cmVnLT5vcHRpbXVtX3VhID0gcHJvcF92YWw7Ci0KLQlkZXZfZGJnKGRldiwgIiVzOiB2b2w9WyVkICVkXXVWLCBjdXJyPVslZF11QSwgb25kICVkXG5cbiIsIHZyZWctPm5hbWUsCi0JCSB2cmVnLT5taW5fdXYsIHZyZWctPm1heF91diwgdnJlZy0+b3B0aW11bV91YSwgdnJlZy0+b25kZW1hbmQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfZHRfcGFyc2VfYm9vc3RfaW5mbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkY19wcml2ID0KLQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY29uc3QgY2hhciAqcHJvcF9uYW1lID0gInFjb20sY2RjLWJvb3N0LXZvbHRhZ2UiOwotCWludCBib29zdF92b2x0YWdlLCByZXQ7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjb2RlYy0+ZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsCi0JCQkmYm9vc3Rfdm9sdGFnZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkXG4iLAotCQkJcHJvcF9uYW1lLCBjb2RlYy0+ZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlib29zdF92b2x0YWdlID0gREVGQVVMVF9CT09TVF9WT0xUQUdFOwotCX0KLQlpZiAoYm9vc3Rfdm9sdGFnZSA8IE1JTl9CT09TVF9WT0xUQUdFIHx8Ci0JCQlib29zdF92b2x0YWdlID4gTUFYX0JPT1NUX1ZPTFRBR0UpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSJJbmNvcnJlY3QgYm9vc3Qgdm9sdGFnZS4gUmV2ZXJ0aW5nIHRvIGRlZmF1bHRcbiIpOwotCQlib29zdF92b2x0YWdlID0gREVGQVVMVF9CT09TVF9WT0xUQUdFOwotCX0KLQotCXNkbTY2MF9jZGNfcHJpdi0+Ym9vc3Rfdm9sdGFnZSA9Ci0JCVZPTFRBR0VfQ09OVkVSVEVSKGJvb3N0X3ZvbHRhZ2UsIE1JTl9CT09TVF9WT0xUQUdFLAotCQkJCUJPT1NUX1ZPTFRBR0VfU1RFUCk7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiQm9vc3Qgdm9sdGFnZSB2YWx1ZSBpczogJWRcbiIsCi0JCQlib29zdF92b2x0YWdlKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2R0X3BhcnNlX21pY2JpYXNfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IHdjZF9taWNiaWFzX3NldHRpbmcgKm1pY2JpYXMpCi17Ci0JY29uc3QgY2hhciAqcHJvcF9uYW1lID0gInFjb20sY2RjLW1pY2JpYXMtY2ZpbHQtbXYiOwotCWludCByZXQ7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwKLQkJCSZtaWNiaWFzLT5jZmlsdDFfbXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZyhkZXYsICJMb29raW5nIHVwICVzIHByb3BlcnR5IGluIG5vZGUgJXMgZmFpbGVkIiwKLQkJCXByb3BfbmFtZSwgZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQltaWNiaWFzLT5jZmlsdDFfbXYgPSBNSUNCSUFTX0RFRkFVTFRfVkFMOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICptc21fYW5sZ19jZGNfcG9wdWxhdGVfZHRfcGRhdGEoCi0JCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcGRhdGEgKnBkYXRhOwotCWludCByZXQsIHN0YXRpY19jbnQsIG9uZF9jbnQsIGlkeCwgaTsKLQljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQljb25zdCBjaGFyICpzdGF0aWNfcHJvcF9uYW1lID0gInFjb20sY2RjLXN0YXRpYy1zdXBwbGllcyI7Ci0JY29uc3QgY2hhciAqb25kX3Byb3BfbmFtZSA9ICJxY29tLGNkYy1vbi1kZW1hbmQtc3VwcGxpZXMiOwotCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzdGF0aWNfY250ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhkZXYtPm9mX25vZGUsIHN0YXRpY19wcm9wX25hbWUpOwotCWlmIChzdGF0aWNfY250IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBGYWlsZWQgdG8gZ2V0IHN0YXRpYyBzdXBwbGllcyAlZFxuIiwgX19mdW5jX18sCi0JCQlzdGF0aWNfY250KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogT24tZGVtYW5kIHN1cHBseSBsaXN0IGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5ICovCi0Jb25kX2NudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGV2LT5vZl9ub2RlLCBvbmRfcHJvcF9uYW1lKTsKLQlpZiAob25kX2NudCA8IDApCi0JCW9uZF9jbnQgPSAwOwotCi0JV0FSTl9PTihzdGF0aWNfY250IDw9IDAgfHwgb25kX2NudCA8IDApOwotCWlmICgoc3RhdGljX2NudCArIG9uZF9jbnQpID4gQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBOdW0gb2Ygc3VwcGxpZXMgJXUgPiBtYXggc3VwcG9ydGVkICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgKHN0YXRpY19jbnQgKyBvbmRfY250KSwKLQkJCQkJQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgc3RhdGljX2NudDsgaWR4KyspIHsKLQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLAotCQkJCQkJICAgIHN0YXRpY19wcm9wX25hbWUsIGlkeCwKLQkJCQkJCSAgICAmbmFtZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IG9mIHJlYWQgc3RyaW5nICVzIGlkeCAlZCBlcnJvciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc3RhdGljX3Byb3BfbmFtZSwgaWR4LCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlkZXZfZGJnKGRldiwgIiVzOiBGb3VuZCBzdGF0aWMgY2RjIHN1cHBseSAlc1xuIiwgX19mdW5jX18sCi0JCQluYW1lKTsKLQkJcmV0ID0gbXNtX2FubGdfY2RjX2R0X3BhcnNlX3ZyZWdfaW5mbyhkZXYsCi0JCQkJCQkmcGRhdGEtPnJlZ3VsYXRvcltpZHhdLAotCQkJCQkJbmFtZSwgZmFsc2UpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOmVyciBwYXJzaW5nIHZyZWcgZm9yICVzIGlkeCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgbmFtZSwgaWR4KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG9uZF9jbnQ7IGkrKywgaWR4KyspIHsKLQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLCBvbmRfcHJvcF9uYW1lLAotCQkJCQkJICAgIGksICZuYW1lKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICIlczogZXJyIHBhcnNpbmcgb25fZGVtYW5kIGZvciAlcyBpZHggJWRcbiIsCi0JCQkJX19mdW5jX18sIG9uZF9wcm9wX25hbWUsIGkpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlkZXZfZGJnKGRldiwgIiVzOiBGb3VuZCBvbi1kZW1hbmQgY2RjIHN1cHBseSAlc1xuIiwgX19mdW5jX18sCi0JCQluYW1lKTsKLQkJcmV0ID0gbXNtX2FubGdfY2RjX2R0X3BhcnNlX3ZyZWdfaW5mbyhkZXYsCi0JCQkJCQkmcGRhdGEtPnJlZ3VsYXRvcltpZHhdLAotCQkJCQkJbmFtZSwgdHJ1ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IGVyciBwYXJzaW5nIHZyZWcgb25fZGVtYW5kIGZvciAlcyBpZHggJWRcbiIsCi0JCQkJX19mdW5jX18sIG5hbWUsIGlkeCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQltc21fYW5sZ19jZGNfZHRfcGFyc2VfbWljYmlhc19pbmZvKGRldiwgJnBkYXRhLT5taWNiaWFzKTsKLQotCXJldHVybiBwZGF0YTsKLWVycjoKLQlkZXZtX2tmcmVlKGRldiwgcGRhdGEpOwotCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBwb3B1bGF0ZSBEVCBkYXRhIHJldCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX29uX2RlbWFuZF9zdXBwbHkoCi0JCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgKnN1cHBseTsKLQotCWlmICh3LT5zaGlmdCA+PSBPTl9ERU1BTkRfU1VQUExJRVNfTUFYKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlcnJvciBpbmRleCA+IE1BWCBEZW1hbmQgc3VwcGxpZXMiLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHN1cHBseTogJXMgZXZlbnQ6ICVkIHJlZjogJWRcbiIsCi0JCV9fZnVuY19fLCBvbl9kZW1hbmRfc3VwcGx5X25hbWVbdy0+c2hpZnRdLCBldmVudCwKLQkJYXRvbWljX3JlYWQoJnNkbTY2MF9jZGMtPm9uX2RlbWFuZF9saXN0W3ctPnNoaWZ0XS5yZWYpKTsKLQotCXN1cHBseSA9ICZzZG02NjBfY2RjLT5vbl9kZW1hbmRfbGlzdFt3LT5zaGlmdF07Ci0JV0FSTl9PTkNFKCFzdXBwbHktPnN1cHBseSwgIiVzIGlzbid0IGRlZmluZWRcbiIsCi0JCSAgb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7Ci0JaWYgKCFzdXBwbHktPnN1cHBseSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZXJyIHN1cHBseSBub3QgcHJlc2VudCBvbmQgZm9yICVkIiwKLQkJCV9fZnVuY19fLCB3LT5zaGlmdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzdXBwbHktPnJlZikgPT0gMSkgewotCQkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKHN1cHBseS0+c3VwcGx5LAotCQkJCQkJICAgIHN1cHBseS0+bWluX3V2LAotCQkJCQkJICAgIHN1cHBseS0+bWF4X3V2KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCSJTZXR0aW5nIHJlZ3VsYXRvciB2b2x0YWdlKGVuKSBmb3IgbWljYmlhcyB3aXRoIGVyciA9ICVkXG4iLAotCQkJCQlyZXQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJcmV0ID0gcmVndWxhdG9yX3NldF9sb2FkKHN1cHBseS0+c3VwcGx5LAotCQkJCQkJIHN1cHBseS0+b3B0aW11bV91YSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJIlNldHRpbmcgcmVndWxhdG9yIG9wdGltdW0gbW9kZShlbikgZmFpbGVkIGZvciBtaWNiaWFzIHdpdGggZXJyID0gJWRcbiIsCi0JCQkJCXJldCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN1cHBseS0+c3VwcGx5KTsKLQkJfQotCQlpZiAocmV0KQotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgJXNcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlpZiAoYXRvbWljX3JlYWQoJnN1cHBseS0+cmVmKSA9PSAwKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogJXMgc3VwcGx5IGhhcyBiZWVuIGRpc2FibGVkLlxuIiwKLQkJCQkgX19mdW5jX18sIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0pOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZzdXBwbHktPnJlZikgPT0gMCkgewotCQkJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUoc3VwcGx5LT5zdXBwbHkpOwotCQkJaWYgKHJldCkKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGRpc2FibGUgJXNcbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQlvbl9kZW1hbmRfc3VwcGx5X25hbWVbdy0+c2hpZnRdKTsKLQkJCXJldCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdXBwbHktPnN1cHBseSwKLQkJCQkJCSAgICAwLAotCQkJCQkJICAgIHN1cHBseS0+bWF4X3V2KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCSJTZXR0aW5nIHJlZ3VsYXRvciB2b2x0YWdlKGRpcykgZmFpbGVkIGZvciBtaWNiaWFzIHdpdGggZXJyID0gJWRcbiIsCi0JCQkJCXJldCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQoc3VwcGx5LT5zdXBwbHksIDApOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiU2V0dGluZyByZWd1bGF0b3Igb3B0aW11bSBtb2RlKGRpcykgZmFpbGVkIGZvciBtaWNiaWFzIHdpdGggZXJyID0gJWRcbiIsCi0JCQkJCXJldCk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9jbG9ja19ibG9jayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCQkgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCWlmIChlbmFibGUpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMLCAweDMwLCAweDMwKTsKLQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLCBESUdfQ0RDX0VWRU5UX0NMS19PTik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTCwgMHg4MCwgMHg4MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfVE9QX0NMS19DVEwsIDB4MEMsIDB4MEMpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfVE9QX0NMS19DVEwsIDB4MEMsIDB4MDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2NoYXJnZV9wdW1wKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkJIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfY2xvY2tfYmxvY2soY29kZWMsIDEpOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkVBUiBDUCIpKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJCQkweDgwLCAweDgwKTsKLQkJCW1zbV9hbmxnX2NkY19ib29zdF9tb2RlX3NlcXVlbmNlKGNvZGVjLCBFQVJfUE1VKTsKLQkJfSBlbHNlIGlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBESUFOR1UpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCQkJMHg4MCwgMHg4MCk7Ci0JCX0gZWxzZSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkJCTB4QzAsIDB4QzApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBXYWl0IGZvciAxbXMgcG9zdCBwb3dlcnVwIG9mIGNoYXJnZXB1bXAgKi8KLQkJdXNsZWVwX3JhbmdlKENPREVDX0RFTEFZXzFfTVMsIENPREVDX0RFTEFZXzFfMV9NUyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKiBXYWl0IGZvciAxbXMgcG9zdCBwb3dlcmRvd24gb2YgY2hhcmdlcHVtcCAqLwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJFQVIgQ1AiKSkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCQkJMHg4MCwgMHgwMCk7Ci0JCQlpZiAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uICE9IEJPT1NUX0FMV0FZUykgewotCQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBib29zdF9vcHRpb246JWQsIHRlYXIgZG93biBlYXJcbiIsCi0JCQkJCV9fZnVuY19fLCBzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pOwotCQkJCW1zbV9hbmxnX2NkY19ib29zdF9tb2RlX3NlcXVlbmNlKGNvZGVjLAotCQkJCQkJCQkgRUFSX1BNRCk7Ci0JCQl9Ci0JCQkvKgotCQkJICogUmVzZXQgcGEgc2VsZWN0IGJpdCBmcm9tIGVhciB0byBocGggYWZ0ZXIgZWFyIHBhCi0JCQkgKiBpcyBkaXNhYmxlZCBhbmQgSFBIIERBQyBkaXNhYmxlIHRvIHJlZHVjZSBlYXIKLQkJCSAqIHR1cm4gb2ZmIHBvcCBhbmQgYXZvaWQgSFBIIHBvcCBpbiBjb25jdXJyZW5jeQotCQkJICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwgMHg4MCwgMHgwMCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBESUFOR1UpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJCQkweDQwLCAweDAwKTsKLQkJCWlmIChzZG02NjBfY2RjLT5yeF9iaWFzX2NvdW50ID09IDApCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJCQkweDgwLCAweDAwKTsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiByeF9iaWFzX2NvdW50ID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBzZG02NjBfY2RjLT5yeF9iaWFzX2NvdW50KTsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2Vhcl9wYV9ib29zdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCShzZG02NjBfY2RjLT5lYXJfcGFfYm9vc3Rfc2V0ID8gMSA6IDApOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5lYXJfcGFfYm9vc3Rfc2V0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+ZWFyX3BhX2Jvb3N0X3NldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2Vhcl9wYV9ib29zdF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0Jc2RtNjYwX2NkYy0+ZWFyX3BhX2Jvb3N0X3NldCA9Ci0JCSh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA/IHRydWUgOiBmYWxzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2xvb3BiYWNrX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIHBkYXRhLT5sYl9tb2RlOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19sb29wYmFja19tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDA6Ci0JCXBkYXRhLT5sYl9tb2RlID0gZmFsc2U7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJcGRhdGEtPmxiX21vZGUgPSB0cnVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfcGFfZ2Fpbl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU4IGVhcl9wYV9nYWluOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBESUFOR1UpIHsKLQkJZWFyX3BhX2dhaW4gPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDKTsKLQkJZWFyX3BhX2dhaW4gPSAoZWFyX3BhX2dhaW4gPj4gMSkgJiAweDM7Ci0KLQkJaWYgKGVhcl9wYV9nYWluID09IDB4MDApIHsKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKLQkJfSBlbHNlIGlmIChlYXJfcGFfZ2FpbiA9PSAweDAxKSB7Ci0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDI7Ci0JCX0gZWxzZSBpZiAoZWFyX3BhX2dhaW4gPT0gMHgwMikgewotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPSAxOwotCQl9IGVsc2UgaWYgKGVhcl9wYV9nYWluID09IDB4MDMpIHsKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gMDsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IEVSUk9SOiBVbnN1cHBvcnRlZCBFYXIgR2FpbiA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGVhcl9wYV9nYWluKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJZWFyX3BhX2dhaW4gPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCSAgIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCk7Ci0JCWVhcl9wYV9nYWluID0gKGVhcl9wYV9nYWluID4+IDUpICYgMHgxOwotCQlpZiAoZWFyX3BhX2dhaW4gPT0gMHgwMCkgewotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQl9IGVsc2UgaWYgKGVhcl9wYV9nYWluID09IDB4MDEpIHsKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKLQkJfSBlbHNlICB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBFUlJPUjogVW5zdXBwb3J0ZWQgRWFyIEdhaW4gPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBlYXJfcGFfZ2Fpbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVhcl9wYV9nYWluOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlYXJfcGFfZ2FpbiA9IDB4JXhcbiIsIF9fZnVuY19fLCBlYXJfcGFfZ2Fpbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1OCBlYXJfcGFfZ2FpbjsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPj0gRElBTkdVKSB7Ci0JCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQkJY2FzZSAwOgotCQkJZWFyX3BhX2dhaW4gPSAweDA2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWVhcl9wYV9nYWluID0gMHgwNDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQllYXJfcGFfZ2FpbiA9IDB4MDI7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJZWFyX3BhX2dhaW4gPSAweDAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywKLQkJCSAgICAweDA2LCBlYXJfcGFfZ2Fpbik7Ci0JfSBlbHNlIHsKLQkJc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCQljYXNlIDA6Ci0JCQllYXJfcGFfZ2FpbiA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJZWFyX3BhX2dhaW4gPSAweDIwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAotCQkJICAgIDB4MjAsIGVhcl9wYV9nYWluKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2hwaF9tb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmIChzZG02NjBfY2RjLT5ocGhfbW9kZSA9PSBOT1JNQUxfTU9ERSkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JfSBlbHNlIGlmIChzZG02NjBfY2RjLT5ocGhfbW9kZSA9PSBIRDJfTU9ERSkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0JfSBlbHNlICB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFUlJPUjogRGVmYXVsdCBIUEggTW9kZT0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+aHBoX21vZGUpOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5ocGhfbW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCXNkbTY2MF9jZGMtPmhwaF9tb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfaHBoX21vZGVfc2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMDoKLQkJc2RtNjYwX2NkYy0+aHBoX21vZGUgPSBOT1JNQUxfTU9ERTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPj0gRElBTkdVKQotCQkJc2RtNjYwX2NkYy0+aHBoX21vZGUgPSBIRDJfTU9ERTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2RtNjYwX2NkYy0+aHBoX21vZGUgPSBOT1JNQUxfTU9ERTsKLQkJYnJlYWs7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5ocGhfbW9kZV9zZXQgPSAlZFxuIiwKLQkJX19mdW5jX18sIHNkbTY2MF9jZGMtPmhwaF9tb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfYm9vc3Rfb3B0aW9uX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmIChzZG02NjBfY2RjLT5ib29zdF9vcHRpb24gPT0gQk9PU1RfU1dJVENIKSB7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQl9IGVsc2UgaWYgKHNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbiA9PSBCT09TVF9BTFdBWVMpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCX0gZWxzZSBpZiAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uID09IEJZUEFTU19BTFdBWVMpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCX0gZWxzZSBpZiAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uID09IEJPT1NUX09OX0ZPUkVWRVIpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzOwotCX0gZWxzZSAgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRVJST1I6IFVuc3VwcG9ydGVkIEJvb3N0IG9wdGlvbj0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbiA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2Jvb3N0X29wdGlvbl9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAwOgotCQlzZG02NjBfY2RjLT5ib29zdF9vcHRpb24gPSBCT09TVF9TV0lUQ0g7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uID0gQk9PU1RfQUxXQVlTOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbiA9IEJZUEFTU19BTFdBWVM7Ci0JCW1zbV9hbmxnX2NkY19ieXBhc3Nfb24oY29kZWMpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbiA9IEJPT1NUX09OX0ZPUkVWRVI7Ci0JCW1zbV9hbmxnX2NkY19ib29zdF9vbihjb2RlYyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgYm9vc3Qgb3B0aW9uOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uX3NldCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfc3BrX2Jvb3N0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCA9PSBmYWxzZSkgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JfSBlbHNlIGlmIChzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID09IHRydWUpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCX0gZWxzZSAgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRVJST1I6IFVuc3VwcG9ydGVkIFNwZWFrZXIgQm9vc3QgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID0gJWRcbiIsIF9fZnVuY19fLAotCQkJc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX3Nwa19ib29zdF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAotCQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDA6Ci0JCXNkbTY2MF9jZGMtPnNwa19ib29zdF9zZXQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID0gJWRcbiIsCi0JCV9fZnVuY19fLCBzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfZXh0X3Nwa19ib29zdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHNkbTY2MF9jZGMtPmV4dF9zcGtfYm9vc3Rfc2V0ID09IGZhbHNlKQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JZWxzZQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2RtNjYwX2NkYy0+ZXh0X3Nwa19ib29zdF9zZXQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+ZXh0X3Nwa19ib29zdF9zZXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19leHRfc3BrX2Jvb3N0X3NldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAwOgotCQlzZG02NjBfY2RjLT5leHRfc3BrX2Jvb3N0X3NldCA9IGZhbHNlOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXNkbTY2MF9jZGMtPmV4dF9zcGtfYm9vc3Rfc2V0ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID0gJWRcbiIsCi0JCV9fZnVuY19fLCBzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zbV9hbmxnX2NkY19sb29wYmFja19tb2RlX2N0cmxfdGV4dFtdID0gewotCQkiRElTQUJMRSIsICJFTkFCTEUifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX2FubGdfY2RjX2xvb3BiYWNrX21vZGVfY3RsX2VudW1bXSA9IHsKLQkJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBtc21fYW5sZ19jZGNfbG9vcGJhY2tfbW9kZV9jdHJsX3RleHQpLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc21fYW5sZ19jZGNfZWFyX3BhX2Jvb3N0X2N0cmxfdGV4dFtdID0gewotCQkiRElTQUJMRSIsICJFTkFCTEUifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX2FubGdfY2RjX2Vhcl9wYV9ib29zdF9jdGxfZW51bVtdID0gewotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbV9hbmxnX2NkY19lYXJfcGFfYm9vc3RfY3RybF90ZXh0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNtX2FubGdfY2RjX2Vhcl9wYV9nYWluX3RleHRbXSA9IHsKLQkJIlBPU18xUDVfREIiLCAiUE9TXzNfREIiLCAiUE9TXzRQNV9EQiIsICJQT1NfNl9EQiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fYW5sZ19jZGNfZWFyX3BhX2dhaW5fZW51bVtdID0gewotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIG1zbV9hbmxnX2NkY19lYXJfcGFfZ2Fpbl90ZXh0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNtX2FubGdfY2RjX2Jvb3N0X29wdGlvbl9jdHJsX3RleHRbXSA9IHsKLQkJIkJPT1NUX1NXSVRDSCIsICJCT09TVF9BTFdBWVMiLCAiQllQQVNTX0FMV0FZUyIsCi0JCSJCT09TVF9PTl9GT1JFVkVSIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV9hbmxnX2NkY19ib29zdF9vcHRpb25fY3RsX2VudW1bXSA9IHsKLQkJU09DX0VOVU1fU0lOR0xFX0VYVCg0LCBtc21fYW5sZ19jZGNfYm9vc3Rfb3B0aW9uX2N0cmxfdGV4dCksCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc21fYW5sZ19jZGNfc3BrX2Jvb3N0X2N0cmxfdGV4dFtdID0gewotCQkiRElTQUJMRSIsICJFTkFCTEUifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX2FubGdfY2RjX3Nwa19ib29zdF9jdGxfZW51bVtdID0gewotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbV9hbmxnX2NkY19zcGtfYm9vc3RfY3RybF90ZXh0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNtX2FubGdfY2RjX2V4dF9zcGtfYm9vc3RfY3RybF90ZXh0W10gPSB7Ci0JCSJESVNBQkxFIiwgIkVOQUJMRSJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fYW5sZ19jZGNfZXh0X3Nwa19ib29zdF9jdGxfZW51bVtdID0gewotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIG1zbV9hbmxnX2NkY19leHRfc3BrX2Jvb3N0X2N0cmxfdGV4dCksCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1zbV9hbmxnX2NkY19ocGhfbW9kZV9jdHJsX3RleHRbXSA9IHsKLQkJIk5PUk1BTCIsICJIRDIifTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX2FubGdfY2RjX2hwaF9tb2RlX2N0bF9lbnVtW10gPSB7Ci0JCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShtc21fYW5sZ19jZGNfaHBoX21vZGVfY3RybF90ZXh0KSwKLQkJCW1zbV9hbmxnX2NkY19ocGhfbW9kZV9jdHJsX3RleHQpLAotfTsKLQotLypjdXQgb2YgZnJlcXVlbmN5IGZvciBoaWdoIHBhc3MgZmlsdGVyKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2ZfdGV4dFtdID0gewotCSJNSU5fM0RCXzRIeiIsICJNSU5fM0RCXzc1SHoiLCAiTUlOXzNEQl8xNTBIeiIKLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9hbmxnX2NkY19zbmRfY29udHJvbHNbXSA9IHsKLQotCVNPQ19FTlVNX0VYVCgiUlggSFBIIE1vZGUiLCBtc21fYW5sZ19jZGNfaHBoX21vZGVfY3RsX2VudW1bMF0sCi0JCW1zbV9hbmxnX2NkY19ocGhfbW9kZV9nZXQsIG1zbV9hbmxnX2NkY19ocGhfbW9kZV9zZXQpLAotCi0JU09DX0VOVU1fRVhUKCJCb29zdCBPcHRpb24iLCBtc21fYW5sZ19jZGNfYm9vc3Rfb3B0aW9uX2N0bF9lbnVtWzBdLAotCQltc21fYW5sZ19jZGNfYm9vc3Rfb3B0aW9uX2dldCwgbXNtX2FubGdfY2RjX2Jvb3N0X29wdGlvbl9zZXQpLAotCi0JU09DX0VOVU1fRVhUKCJFQVIgUEEgQm9vc3QiLCBtc21fYW5sZ19jZGNfZWFyX3BhX2Jvb3N0X2N0bF9lbnVtWzBdLAotCQltc21fYW5sZ19jZGNfZWFyX3BhX2Jvb3N0X2dldCwgbXNtX2FubGdfY2RjX2Vhcl9wYV9ib29zdF9zZXQpLAotCi0JU09DX0VOVU1fRVhUKCJFQVIgUEEgR2FpbiIsIG1zbV9hbmxnX2NkY19lYXJfcGFfZ2Fpbl9lbnVtWzBdLAotCQltc21fYW5sZ19jZGNfcGFfZ2Fpbl9nZXQsIG1zbV9hbmxnX2NkY19wYV9nYWluX3B1dCksCi0KLQlTT0NfRU5VTV9FWFQoIlNwZWFrZXIgQm9vc3QiLCBtc21fYW5sZ19jZGNfc3BrX2Jvb3N0X2N0bF9lbnVtWzBdLAotCQltc21fYW5sZ19jZGNfc3BrX2Jvb3N0X2dldCwgbXNtX2FubGdfY2RjX3Nwa19ib29zdF9zZXQpLAotCi0JU09DX0VOVU1fRVhUKCJFeHQgU3BrIEJvb3N0IiwgbXNtX2FubGdfY2RjX2V4dF9zcGtfYm9vc3RfY3RsX2VudW1bMF0sCi0JCW1zbV9hbmxnX2NkY19leHRfc3BrX2Jvb3N0X2dldCwgbXNtX2FubGdfY2RjX2V4dF9zcGtfYm9vc3Rfc2V0KSwKLQotCVNPQ19FTlVNX0VYVCgiTE9PUEJBQ0sgTW9kZSIsIG1zbV9hbmxnX2NkY19sb29wYmFja19tb2RlX2N0bF9lbnVtWzBdLAotCQltc21fYW5sZ19jZGNfbG9vcGJhY2tfbW9kZV9nZXQsIG1zbV9hbmxnX2NkY19sb29wYmFja19tb2RlX3B1dCksCi0JU09DX1NJTkdMRV9UTFYoIkFEQzEgVm9sdW1lIiwgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOLCAzLAotCQkJCQk4LCAwLCBhbmFsb2dfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkFEQzIgVm9sdW1lIiwgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOLCAzLAotCQkJCQk4LCAwLCBhbmFsb2dfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkFEQzMgVm9sdW1lIiwgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOLCAzLAotCQkJCQk4LCAwLCBhbmFsb2dfZ2FpbiksCi0KLQotfTsKLQotc3RhdGljIGludCB0b21iYWtfaHBoX2ltcGVkYW5jZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQ7Ci0JdWludDMyX3QgemwsIHpyOwotCWJvb2wgaHBocjsKLQlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1jOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCW1jID0gKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKShrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7Ci0KLQlocGhyID0gbWMtPnNoaWZ0OwotCXJldCA9IHdjZF9tYmhjX2dldF9pbXBlZGFuY2UoJnByaXYtPm1iaGMsICZ6bCwgJnpyKTsKLQlpZiAocmV0KQotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGdldCBtYmhjIGltcGVkIiwgX19mdW5jX18pOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB6bCAldSwgenIgJXVcbiIsIF9fZnVuY19fLCB6bCwgenIpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHBociA/IHpyIDogemw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiSFBITCBJbXBlZGFuY2UiLCAwLCAwLCBVSU5UX01BWCwgMCwKLQkJCXRvbWJha19ocGhfaW1wZWRhbmNlX2dldCwgTlVMTCksCi0JU09DX1NJTkdMRV9FWFQoIkhQSFIgSW1wZWRhbmNlIiwgMCwgMSwgVUlOVF9NQVgsIDAsCi0JCQl0b21iYWtfaHBoX2ltcGVkYW5jZV9nZXQsIE5VTEwpLAotfTsKLQotc3RhdGljIGludCB0b21iYWtfZ2V0X2hwaF90eXBlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7Ci0KLQlpZiAoIXByaXYpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBzZG02NjBfY2RjLXdjZCBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1iaGMgPSAmcHJpdi0+bWJoYzsKLQlpZiAoIW1iaGMpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHUzMikgbWJoYy0+aHBoX3R5cGU7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGhwaF90eXBlID0gJXVcbiIsIF9fZnVuY19fLCBtYmhjLT5ocGhfdHlwZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaF90eXBlX2RldGVjdF9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJIUEggVHlwZSIsIDAsIDAsIFVJTlRfTUFYLCAwLAotCXRvbWJha19nZXRfaHBoX3R5cGUsIE5VTEwpLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZGFjMl9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYMiIsICJSWDEiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjMV9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByZGFjMl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX0hQSFJfREFDX0NUTCwKLQkJMCwgMywgcmRhYzJfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkYzJfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJJTlAyIiwgIklOUDMiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dF9zcGtfdGV4dFtdID0gewotCSJPZmYiLCAiT24iCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdzYV9zcGtfdGV4dFtdID0gewotCSJaRVJPIiwgIldTQSIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYWRjMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLAotCQlBUlJBWV9TSVpFKGFkYzJfbXV4X3RleHQpLCBhZGMyX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBleHRfc3BrX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsCi0JCUFSUkFZX1NJWkUoZXh0X3Nwa190ZXh0KSwgZXh0X3Nwa190ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3c2Ffc3BrX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsCi0JCUFSUkFZX1NJWkUod3NhX3Nwa190ZXh0KSwgd3NhX3Nwa190ZXh0KTsKLQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfc3BrX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiRXh0IFNwayBTd2l0Y2ggTXV4IiwgZXh0X3Nwa19lbnVtKTsKLQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF9hZGMyX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiQURDMiBNVVggTXV4IiwgYWRjMl9lbnVtKTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmRhYzJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSREFDMiBNVVggTXV4IiwgcmRhYzJfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVhcl90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiU3dpdGNoIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZWFyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUoZWFyX3RleHQpLCBlYXJfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBlYXJfcGFfbXV4W10gPSB7Ci0JU09DX0RBUE1fRU5VTSgiRUFSX1MiLCBlYXJfZW51bSkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3c2Ffc3BrX211eFtdID0gewotCVNPQ19EQVBNX0VOVU0oIldTQSBTcGsgU3dpdGNoIiwgd3NhX3Nwa19lbnVtKQotfTsKLQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHBoX3RleHRbXSA9IHsKLQkiWkVSTyIsICJTd2l0Y2giLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBocGhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNORF9TT0NfTk9QTSwgMCwgQVJSQVlfU0laRShocGhfdGV4dCksIGhwaF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaGxfbXV4W10gPSB7Ci0JU09DX0RBUE1fRU5VTSgiSFBITCIsIGhwaF9lbnVtKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaHJfbXV4W10gPSB7Ci0JU09DX0RBUE1fRU5VTSgiSFBIUiIsIGhwaF9lbnVtKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa3JfbXV4W10gPSB7Ci0JU09DX0RBUE1fRU5VTSgiU1BLIiwgaHBoX2VudW0pCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxvX3RleHRbXSA9IHsKLQkiWkVSTyIsICJTd2l0Y2giLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsb19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCBBUlJBWV9TSVpFKGhwaF90ZXh0KSwgaHBoX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG9fbXV4W10gPSB7Ci0JU09DX0RBUE1fRU5VTSgiTElORV9PVVQiLCBsb19lbnVtKQotfTsKLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9hZGNfYmxvY2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICp3Y2Q4eDE2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXdjZDh4MTYtPmFkY19jb3VudCsrOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCSAgICBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsCi0JCQkJICAgIDB4MjAsIDB4MjApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCSAgICBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkJICAgIDB4MTAsIDB4MTApOwotCX0gZWxzZSB7Ci0JCXdjZDh4MTYtPmFkY19jb3VudC0tOwotCQlpZiAoIXdjZDh4MTYtPmFkY19jb3VudCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkgICAgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJCSAgICAweDEwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJICAgIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwKLQkJCQkJICAgIDB4MjAsIDB4MCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9hZGMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JdTE2IGFkY19yZWc7Ci0JdTggaW5pdF9iaXRfc2hpZnQ7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCWFkY19yZWcgPSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yOwotCi0JaWYgKHctPnJlZyA9PSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4pCi0JCWluaXRfYml0X3NoaWZ0ID0gNTsKLQllbHNlIGlmICgody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTikgfHwKLQkJICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOKSkKLQkJaW5pdF9iaXRfc2hpZnQgPSA0OwotCWVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IsIGludmFsaWQgYWRjIHJlZ2lzdGVyXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9hZGNfYmxvY2soY29kZWMsIDEpOwotCQlpZiAody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTikKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9DVEwsIDB4MDIsIDB4MDIpOwotCQkvKgotCQkgKiBBZGQgZGVsYXkgb2YgMTAgbXMgdG8gZ2l2ZSBzdWZmaWNpZW50IHRpbWUgZm9yIHRoZSB2b2x0YWdlCi0JCSAqIHRvIHNob290IHVwIGFuZCBzZXR0bGUgc28gdGhhdCB0aGUgdHhmZSBpbml0IGRvZXMgbm90Ci0JCSAqIGhhcHBlbiB3aGVuIHRoZSBpbnB1dCB2b2x0YWdlIGlzIGNoYW5naW5nIHRvbyBtdWNoLgotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDAxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGFkY19yZWcsIDEgPDwgaW5pdF9iaXRfc2hpZnQsCi0JCQkJMSA8PCBpbml0X2JpdF9zaGlmdCk7Ci0JCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9UWDFfQ1RMLAotCQkJCTB4MDMsIDB4MDApOwotCQllbHNlIGlmICgody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTikgfHwKLQkJCSh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTCwKLQkJCQkweDAzLCAweDAwKTsKLQkJLyogV2FpdCBmb3IgMW1zIHRvIGFsbG93IHR4ZmUgc2V0dGxpbmcgdGltZSAqLwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCS8qCi0JCSAqIEFkZCBkZWxheSBvZiAxMiBtcyBiZWZvcmUgZGVhc3NlcnRpbmcgdGhlIGluaXQKLQkJICogdG8gcmVkdWNlIHRoZSB0eCBwb3AKLQkJICovCi0JCXVzbGVlcF9yYW5nZSgxMjAwMCwgMTIwMTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhZGNfcmVnLCAxIDw8IGluaXRfYml0X3NoaWZ0LCAweDAwKTsKLQkJLyogV2FpdCBmb3IgMW1zIHRvIGFsbG93IHR4ZmUgc2V0dGxpbmcgdGltZSBwb3N0IHBvd2VydXAgKi8KLQkJdXNsZWVwX3JhbmdlKENPREVDX0RFTEFZXzFfTVMsIENPREVDX0RFTEFZXzFfMV9NUyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQltc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2FkY19ibG9jayhjb2RlYywgMCk7Ci0JCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0NUTCwgMHgwMiwgMHgwMCk7Ci0JCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9UWDFfQ1RMLAotCQkJCTB4MDMsIDB4MDIpOwotCQllbHNlIGlmICgody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTikgfHwKLQkJCSh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19UWF8zX0VOKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTCwKLQkJCQkweDAzLCAweDAyKTsKLQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9zcGtfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MTAsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwsIDB4MDEsIDB4MDEpOwotCQlzd2l0Y2ggKHNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbikgewotCQljYXNlIEJPT1NUX1NXSVRDSDoKLQkJCWlmICghc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwKLQkJCQkJMHgxMCwgMHgxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBCT09TVF9BTFdBWVM6Ci0JCWNhc2UgQk9PU1RfT05fRk9SRVZFUjoKLQkJCWJyZWFrOwotCQljYXNlIEJZUEFTU19BTFdBWVM6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EQUNfQ1RMLAotCQkJCTB4MTAsIDB4MTApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBXYWl0IGZvciAxbXMgYWZ0ZXIgU1BLX0RBQyBDVEwgc2V0dGluZyAqLwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLCAweEUwLCAweEUwKTsKLQkJaWYgKGdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpICE9IFRPTUJBS18xXzApCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwgMHgwMSwgMHgwMSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBXYWl0IGZvciAxbXMgYWZ0ZXIgU1BLX1ZCQVRfTERPIEVuYWJsZSAqLwotCQl1c2xlZXBfcmFuZ2UoQ09ERUNfREVMQVlfMV9NUywgQ09ERUNfREVMQVlfMV8xX01TKTsKLQkJc3dpdGNoIChzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pIHsKLQkJY2FzZSBCT09TVF9TV0lUQ0g6Ci0JCQlpZiAoc2RtNjYwX2NkYy0+c3BrX2Jvb3N0X3NldCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwKLQkJCQkJMHhFRiwgMHhFRik7Ci0JCQllbHNlCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsCi0JCQkJCTB4MTAsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9PU1RfQUxXQVlTOgotCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAotCQkJCTB4RUYsIDB4RUYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQllQQVNTX0FMV0FZUzoKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MTAsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIGJvb3N0IG9wdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQkJCXNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCQlicmVhazsKLQkJfQotCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCSAgICAgICBESUdfQ0RDX0VWRU5UX1JYM19NVVRFX09GRik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHctPnJlZywgMHg4MCwgMHg4MCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCW1zbV9hbmxnX2NkY19kaWdfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJICAgICAgIERJR19DRENfRVZFTlRfUlgzX01VVEVfT04pOwotCQkvKgotCQkgKiBBZGQgMSBtcyBzbGVlcCBmb3IgdGhlIG11dGUgdG8gdGFrZSBlZmZlY3QKLQkJICovCi0JCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MTAsIDB4MTApOwotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDQUpPTl8yXzApCi0JCQltc21fYW5sZ19jZGNfYm9vc3RfbW9kZV9zZXF1ZW5jZShjb2RlYywgU1BLX1BNRCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHctPnJlZywgMHg4MCwgMHgwMCk7Ci0JCXN3aXRjaCAoc2RtNjYwX2NkYy0+Ym9vc3Rfb3B0aW9uKSB7Ci0JCWNhc2UgQk9PU1RfU1dJVENIOgotCQkJaWYgKHNkbTY2MF9jZGMtPnNwa19ib29zdF9zZXQpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCi0JCQkJCTB4RUYsIDB4NjkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9PU1RfQUxXQVlTOgotCQljYXNlIEJPT1NUX09OX0ZPUkVWRVI6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLAotCQkJCTB4RUYsIDB4NjkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQllQQVNTX0FMV0FZUzoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogaW52YWxpZCBib29zdCBvcHRpb246ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlzZG02NjBfY2RjLT5ib29zdF9vcHRpb24pOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfUFdSU1RHX0NUTCwgMHhFMCwgMHgwMCk7Ci0JCS8qIFdhaXQgZm9yIDFtcyB0byBhbGxvdyBzZXR0aW5nIHRpbWUgZm9yIHNwa3IgcGF0aCBkaXNhYmxlICovCi0JCXVzbGVlcF9yYW5nZShDT0RFQ19ERUxBWV8xX01TLCBDT0RFQ19ERUxBWV8xXzFfTVMpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwsIDB4MDEsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MTAsIDB4MDApOwotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgIT0gVE9NQkFLXzFfMCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLCAweDAxLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwgMHgxMCwgMHgwMCk7Ci0JCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBDQUpPTl8yXzApCi0JCQltc21fYW5sZ19jZGNfYm9vc3RfbW9kZV9zZXF1ZW5jZShjb2RlYywgU1BLX1BNRCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2RpZ19jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGV2ZW50ICVkIHctPm5hbWUgJXNcbiIsIF9fZnVuY19fLAotCQkJZXZlbnQsIHctPm5hbWUpOwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQltc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2Nsb2NrX2Jsb2NrKGNvZGVjLCAxKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdy0+cmVnLCAweDgwLCAweDgwKTsKLQkJbXNtX2FubGdfY2RjX2Jvb3N0X21vZGVfc2VxdWVuY2UoY29kZWMsIFNQS19QTVUpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKHNkbTY2MF9jZGMtPnJ4X2JpYXNfY291bnQgPT0gMCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCQkJMHg4MCwgMHgwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGJvb2wgbXNtX2FubGdfY2RjX3VzZV9tYihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKGdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpIDwgQ0FKT04pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfc2V0X2F1dG9femVyb2luZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKGdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpIDwgQ09OR0EpIHsKLQkJaWYgKGVuYWJsZSkKLQkJCS8qCi0JCQkgKiBTZXQgYXV0b3plcm9pbmcgZm9yIHNwZWNpYWwgaGVhZHNldCBkZXRlY3Rpb24gYW5kCi0JCQkgKiBidXR0b25zIHRvIHdvcmsuCi0JCQkgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCi0JCQkJMHgxOCwgMHgxMCk7Ci0JCWVsc2UKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sCi0JCQkJMHgxOCwgMHgwMCk7Ci0KLQl9IGVsc2UgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEF1dG8gWmVyb2luZyBpcyBub3QgcmVxdWlyZWQgZnJvbSBDT05HQVxuIiwKLQkJCV9fZnVuY19fKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY190cmltX2J0bl9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA9PSBUT01CQUtfMV8wKSB7Ci0JCXByX2RlYnVnKCIlczogVGhpcyBkZXZpY2UgbmVlZHMgdG8gYmUgdHJpbW1lZFxuIiwgX19mdW5jX18pOwotCQkvKgotCQkgKiBDYWxjdWxhdGUgdGhlIHRyaW0gdmFsdWUgZm9yIGVhY2ggZGV2aWNlIHVzZWQKLQkJICogdGlsbCBpcyBjb21lcyBpbiBwcm9kdWN0aW9uIGJ5IGhhcmR3YXJlIHRlYW0KLQkJICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLAotCQkJCTB4QTUsIDB4QTUpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMiwKLQkJCQkweEZGLCAweDMwKTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVGhpcyBkZXZpY2UgaXMgdHJpbW1lZCBhdCBBVEVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19lbmFibGVfZXh0X21iX3NvdXJjZShzdHJ1Y3Qgd2NkX21iaGMgKndjZF9tYmhjLAotCQkJCQkgICAgIGJvb2wgdHVybl9vbikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdGF0aWMgaW50IGNvdW50OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdjZF9tYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHR1cm5fb246ICVkIGNvdW50OiAlZFxuIiwgX19mdW5jX18sIHR1cm5fb24sCi0JCQljb3VudCk7Ci0JaWYgKHR1cm5fb24pIHsKLQkJaWYgKCFjb3VudCkgewotCQkJcmV0ID0gc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwKLQkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKLQkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCQl9Ci0JCWNvdW50Kys7Ci0JfSBlbHNlIHsKLQkJaWYgKGNvdW50ID4gMCkKLQkJCWNvdW50LS07Ci0JCWlmICghY291bnQpIHsKLQkJCXJldCA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLAotCQkJCSJNSUNCSUFTX1JFR1VMQVRPUiIpOwotCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0JCX0KLQl9Ci0KLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAotCQkJX19mdW5jX18sIHR1cm5fb24gPyAiZW5hYmxlIiA6ICJkaXNhYmxlZCIpOwotCWVsc2UKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAotCQkJIF9fZnVuY19fLCB0dXJuX29uID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBtaWNiX2ludF9yZWc7Ci0JY2hhciAqaW50ZXJuYWwxX3RleHQgPSAiSW50ZXJuYWwxIjsKLQljaGFyICppbnRlcm5hbDJfdGV4dCA9ICJJbnRlcm5hbDIiOwotCWNoYXIgKmludGVybmFsM190ZXh0ID0gIkludGVybmFsMyI7Ci0JY2hhciAqZXh0ZXJuYWwyX3RleHQgPSAiRXh0ZXJuYWwyIjsKLQljaGFyICpleHRlcm5hbF90ZXh0ID0gIkV4dGVybmFsIjsKLQlib29sIG1pY2JpYXMyOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0Jc3dpdGNoICh3LT5yZWcpIHsKLQljYXNlIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOOgotCWNhc2UgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU46Ci0JCW1pY2JfaW50X3JlZyA9IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0lOVF9SQklBUzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBFcnJvciwgaW52YWxpZCBtaWNiaWFzIHJlZ2lzdGVyIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgdy0+cmVnKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWljYmlhczIgPSAoc25kX3NvY19yZWFkKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTikgJiAweDgwKTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwxX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKLQkJCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBDQUpPTikKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMiwKLQkJCQkJMHgwMiwgMHgwMik7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4ODAsIDB4ODApOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwyX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfaW50X3JlZywgMHgxMCwgMHgxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB3LT5yZWcsIDB4NjAsIDB4MDApOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwzX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfaW50X3JlZywgMHgyLCAweDIpOwotCQkvKgotCQkgKiB1cGRhdGUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzIKLQkJICogZm9yIGV4dGVybmFsIGJpYXMgb25seSwgbm90IGZvciBleHRlcm5hbDIuCi0JCSovCi0JCX0gZWxzZSBpZiAoIXN0cm5zdHIody0+bmFtZSwgZXh0ZXJuYWwyX3RleHQsIHN0cmxlbih3LT5uYW1lKSkgJiYKLQkJCQkJc3RybnN0cih3LT5uYW1lLCBleHRlcm5hbF90ZXh0LAotCQkJCQkJc3RybGVuKHctPm5hbWUpKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfQVRFU1RfQ1RMXzIsCi0JCQkJCTB4MDIsIDB4MDIpOwotCQl9Ci0JCWlmICghc3RybnN0cih3LT5uYW1lLCBleHRlcm5hbF90ZXh0LCBzdHJsZW4ody0+bmFtZSkpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwgMHgwNSwgMHgwNCk7Ci0JCWlmICh3LT5yZWcgPT0gTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4pCi0JCQltc21fYW5sZ19jZGNfY29uZmlndXJlX2NhcChjb2RlYywgdHJ1ZSwgbWljYmlhczIpOwotCi0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPD0gVE9NQkFLXzJfMCkKLQkJCS8qCi0JCQkgKiBXYWl0IGZvciAyMG1zIHBvc3QgbWljYmlhcyBlbmFibGUKLQkJCSAqIGZvciB2ZXJzaW9uIDwgdG9tYmFrIDIuMC4KLQkJCSAqLwotCQkJdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7Ci0JCWlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsMV90ZXh0LCBzdHJsZW4ody0+bmFtZSkpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4NDAsIDB4NDApOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgaW50ZXJuYWwyX3RleHQsICBzdHJsZW4ody0+bmFtZSkpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MDgsIDB4MDgpOwotCQkJbXNtX2FubGdfY2RjX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCVdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTik7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDNfdGV4dCwgMzApKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MDEsIDB4MDEpOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgZXh0ZXJuYWwyX3RleHQsIHN0cmxlbih3LT5uYW1lKSkpIHsKLQkJCW1zbV9hbmxnX2NkY19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCQlXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT04pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDFfdGV4dCwgc3RybGVuKHctPm5hbWUpKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9pbnRfcmVnLCAweEMwLCAweDQwKTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsIGludGVybmFsMl90ZXh0LCBzdHJsZW4ody0+bmFtZSkpKSB7Ci0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRik7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCBpbnRlcm5hbDNfdGV4dCwgMzApKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX2ludF9yZWcsIDB4MiwgMHgwKTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsIGV4dGVybmFsMl90ZXh0LCBzdHJsZW4ody0+bmFtZSkpKSB7Ci0JCQkvKgotCQkJICogc2VuZCBtaWNiaWFzIHR1cm4gb2ZmIGV2ZW50IHRvIG1iaGMgZHJpdmVyIGFuZCB0aGVuCi0JCQkgKiBicmVhaywgYXMgbm8gbmVlZCB0byBzZXQgTUlDQl8xX0VOIHJlZ2lzdGVyLgotCQkJICovCi0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAody0+cmVnID09IE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOKQotCQkJbXNtX2FubGdfY2RjX2NvbmZpZ3VyZV9jYXAoY29kZWMsIGZhbHNlLCBtaWNiaWFzMik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Nsa2Rpdih2b2lkICpoYW5kbGUsIGludCB2YWwpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqaGFuZGxlX2NkYyA9IGhhbmRsZTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBoYW5kbGVfY2RjLT5jb2RlYzsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkgICAgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVFhGRV9DTEtESVYsCi0JCQkgICAgMHhGRiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBnZXRfY2RjX3ZlcnNpb24odm9pZCAqaGFuZGxlKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPSBoYW5kbGU7Ci0KLQlyZXR1cm4gZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYyk7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtNjYwX3djZF9jb2RlY19lbmFibGVfdmRkX3Nwa3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFzZG02NjBfY2RjLT5leHRfc3BrX2Jvb3N0X3NldCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXh0X2Jvb3N0IG5vdCBzdXBwb3J0ZWQvZGlzYWJsZWRcbiIsCi0JCQkJCQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHNkbTY2MF9jZGMtPnNwa2Rydl9yZWcpIHsKLQkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc2RtNjYwX2NkYy0+c3BrZHJ2X3JlZyk7Ci0JCQlpZiAocmV0KQotCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJIiVzIEZhaWxlZCB0byBlbmFibGUgc3BrZHJ2IHJlZyAlc1xuIiwKLQkJCQkJX19mdW5jX18sIE1TTTg5WFhfVkREX1NQS0RSVl9OQU1FKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKHNkbTY2MF9jZGMtPnNwa2Rydl9yZWcpIHsKLQkJCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKHNkbTY2MF9jZGMtPnNwa2Rydl9yZWcpOwotCQkJaWYgKHJldCkKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCSIlczogRmFpbGVkIHRvIGRpc2FibGUgc3BrZHJ2X3JlZyAlc1xuIiwKLQkJCQkJX19mdW5jX18sIE1TTTg5WFhfVkREX1NQS0RSVl9OQU1FKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIHJlZ2lzdGVyIGFkZHJlc3MgaXMgdGhlIHNhbWUgYXMgb3RoZXIgY29kZWMgc28gaXQgY2FuIHVzZSByZXNtZ3IgKi8KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9yeF9iaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJc2RtNjYwX2NkYy0+cnhfYmlhc19jb3VudCsrOwotCQlpZiAoc2RtNjYwX2NkYy0+cnhfYmlhc19jb3VudCA9PSAxKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywKLQkJCQkJMHg4MCwgMHg4MCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywKLQkJCQkJMHgwMSwgMHgwMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNkbTY2MF9jZGMtPnJ4X2JpYXNfY291bnQtLTsKLQkJaWYgKHNkbTY2MF9jZGMtPnJ4X2JpYXNfY291bnQgPT0gMCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fQklBU19EQUMsCi0JCQkJCTB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fQklBU19EQUMsCi0JCQkJCTB4ODAsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyByeF9iaWFzX2NvdW50ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2RtNjYwX2NkYy0+cnhfYmlhc19jb3VudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCB3Y2RfZ2V0X2ltcGVkYW5jZV92YWx1ZSh1aW50MzJfdCBpbXBlZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdjZF9pbXBlZF92YWwpIC0gMTsgaSsrKSB7Ci0JCWlmIChpbXBlZCA+PSB3Y2RfaW1wZWRfdmFsW2ldICYmCi0JCQlpbXBlZCA8IHdjZF9pbXBlZF92YWxbaSArIDFdKQotCQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZWxlY3RlZCBpbXBlZGFuY2UgdmFsdWUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCB3Y2RfaW1wZWRfdmFsW2ldKTsKLQlyZXR1cm4gd2NkX2ltcGVkX3ZhbFtpXTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICAgIHVpbnQzMl90IGltcGVkLCBib29sIHNldF9nYWluKQotewotCXVpbnQzMl90IHZhbHVlOwotCWludCBjb2RlY192ZXJzaW9uOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdmFsdWUgPSB3Y2RfZ2V0X2ltcGVkYW5jZV92YWx1ZShpbXBlZCk7Ci0KLQlpZiAodmFsdWUgPCB3Y2RfaW1wZWRfdmFsWzBdKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlcywgZGV0ZWN0ZWQgaW1wZWRhbmNlIGlzIGxlc3MgdGhhbiA0IE9obVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljb2RlY192ZXJzaW9uID0gZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYyk7Ci0KLQlpZiAoc2V0X2dhaW4pIHsKLQkJc3dpdGNoIChjb2RlY192ZXJzaW9uKSB7Ci0JCWNhc2UgVE9NQkFLXzFfMDoKLQkJY2FzZSBUT01CQUtfMl8wOgotCQljYXNlIENPTkdBOgotCQkJLyoKLQkJCSAqIEZvciAzMk9obSBsb2FkIGFuZCBoaWdoZXIgbG9hZHMsIFNldCAweDE5RQotCQkJICogYml0IDUgdG8gMSAoUE9TXzBfREJfREkpLiBGb3IgbG9hZHMgbG93ZXIKLQkJCSAqIHRoYW4gMzJPaG0gKHN1Y2ggYXMgMTZPaG0gbG9hZCksIFNldCAweDE5RQotCQkJICogYml0IDUgdG8gMCAoUE9TX000UDVfREJfREkpCi0JCQkgKi8KLQkJCWlmICh2YWx1ZSA+PSAzMikKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsCi0JCQkJCTB4MjAsIDB4MjApOwotCQkJZWxzZQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKLQkJCQkJMHgyMCwgMHgwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBDQUpPTjoKLQkJY2FzZSBDQUpPTl8yXzA6Ci0JCWNhc2UgRElBTkdVOgotCQljYXNlIERSQVhfQ0RDOgotCQkJaWYgKHZhbHVlID49IDEzKSB7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAotCQkJCQkweDIwLCAweDIwKTsKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTCwKLQkJCQkJMHgwNywgMHgwNyk7Ci0JCQl9IGVsc2UgewotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKLQkJCQkJMHgyMCwgMHgwMCk7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwsCi0JCQkJCTB4MDcsIDB4MDQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAotCQkJMHgyMCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTCwKLQkJCTB4MDcsIDB4MDQpOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBFeGl0XG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2hwaGxfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgaW50IGV2ZW50KQotewotCXVpbnQzMl90IGltcGVkbCwgaW1wZWRyOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCXJldCA9IHdjZF9tYmhjX2dldF9pbXBlZGFuY2UoJnNkbTY2MF9jZGMtPm1iaGMsCi0JCQkmaW1wZWRsLCAmaW1wZWRyKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPiBDQUpPTikKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLAotCQkJCTB4MDgsIDB4MDgpOwotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPT0gQ0FKT04gfHwKLQkJCWdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpID09IENBSk9OXzJfMCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QsCi0JCQkJMHg4MCwgMHg4MCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVCwKLQkJCQkweDgwLCAweDgwKTsKLQkJfQotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPiBDQUpPTikKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLAotCQkJCTB4MDgsIDB4MDApOwotCQlpZiAoc2RtNjYwX2NkYy0+aHBoX21vZGUgPT0gSEQyX01PREUpCi0JCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCURJR19DRENfRVZFTlRfUFJFX1JYMV9JTlRfT04pOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9QQV9EQUNfQ1RMLCAweDAyLCAweDAyKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMSwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDIsIDB4MDIpOwotCQlpZiAoIXJldCkKLQkJCXdjZF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCwgdHJ1ZSk7Ci0JCWVsc2UKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIkZhaWxlZCB0byBnZXQgbWJoYyBpbXBlZGFuY2UgJWRcbiIsCi0JCQkJcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwsIDB4MDIsIDB4MDApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJd2NkX2ltcGVkX2NvbmZpZyhjb2RlYywgaW1wZWRsLCBmYWxzZSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDIsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLCAweDAxLCAweDAwKTsKLQkJaWYgKHNkbTY2MF9jZGMtPmhwaF9tb2RlID09IEhEMl9NT0RFKQotCQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCQlESUdfQ0RDX0VWRU5UX1BPU1RfUlgxX0lOVF9PRkYpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2xvX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MTAsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4MjAsIDB4MjApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsIDB4ODAsIDB4ODApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDA4LCAweDA4KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHg0MCwgMHg0MCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDgwLCAweDgwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHgwOCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTCwgMHg0MCwgMHg0MCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKiBXYWl0IGZvciAyMG1zIGJlZm9yZSBwb3dlcmRvd24gb2YgbGluZW91dF9kYWMgKi8KLQkJdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0RBQ19DVEwsIDB4ODAsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMLCAweDQwLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHgwOCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTCwgMHg4MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTCwgMHg0MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTCwgMHgyMCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MTAsIDB4MDApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2hwaHJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAoc2RtNjYwX2NkYy0+aHBoX21vZGUgPT0gSEQyX01PREUpCi0JCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCURJR19DRENfRVZFTlRfUFJFX1JYMl9JTlRfT04pOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMLCAweDAyLCAweDAyKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMiwgMHgwMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQU5BX0NMS19DVEwsIDB4MDEsIDB4MDEpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfUEFfREFDX0NUTCwgMHgwMiwgMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMLCAweDAxLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMiwgMHgwMCk7Ci0JCWlmIChzZG02NjBfY2RjLT5ocGhfbW9kZSA9PSBIRDJfTU9ERSkKLQkJCW1zbV9hbmxnX2NkY19kaWdfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJRElHX0NEQ19FVkVOVF9QT1NUX1JYMl9JTlRfT0ZGKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19ocGhfcGFfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVzIGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHctPnNoaWZ0ID09IDUpCi0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09OKTsKLQkJZWxzZSBpZiAody0+c2hpZnQgPT0gNCkKLQkJCW1zbV9hbmxnX2NkY19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCQlXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT04pOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHgyMCwgMHgyMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCS8qIFdhaXQgZm9yIDdtcyB0byBhbGxvdyBzZXR0aW5nIHRpbWUgZm9yIEhQSF9QQSBFbmFibGUgKi8KLQkJdXNsZWVwX3JhbmdlKDcwMDAsIDcxMDApOwotCQlpZiAody0+c2hpZnQgPT0gNSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QsIDB4MDQsIDB4MDQpOwotCQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCQkgICAgICAgRElHX0NEQ19FVkVOVF9SWDFfTVVURV9PRkYpOwotCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDQpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9URVNULCAweDA0LCAweDA0KTsKLQkJCW1zbV9hbmxnX2NkY19kaWdfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJICAgICAgIERJR19DRENfRVZFTlRfUlgyX01VVEVfT0ZGKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWlmICh3LT5zaGlmdCA9PSA1KSB7Ci0JCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCSAgICAgICBESUdfQ0RDX0VWRU5UX1JYMV9NVVRFX09OKTsKLQkJCS8qIFdhaXQgZm9yIDIwbXMgYWZ0ZXIgSFBITCBSWCBkaWdpdGFsIG11dGUgKi8KLQkJCW1zbGVlcCgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfVEVTVCwgMHgwNCwgMHgwMCk7Ci0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09GRik7Ci0JCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gNCkgewotCQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCQkgICAgICAgRElHX0NEQ19FVkVOVF9SWDJfTVVURV9PTik7Ci0JCQkvKiBXYWl0IGZvciAyMG1zIGFmdGVyIEhQSFIgUlggZGlnaXRhbCBtdXRlICovCi0JCQltc2xlZXAoMjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9SX1RFU1QsIDB4MDQsIDB4MDApOwotCQkJbXNtX2FubGdfY2RjX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCVdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkYpOwotCQl9Ci0JCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBDQUpPTikgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX0NOUCwKLQkJCQkweEYwLCAweDMwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKHctPnNoaWZ0ID09IDUpIHsKLQkJCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhMX1BBX09GRl9BQ0ssCi0JCQkJJnNkbTY2MF9jZGMtPm1iaGMuaHBoX3BhX2RhY19zdGF0ZSk7Ci0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYpOwotCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDQpIHsKLQkJCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhSX1BBX09GRl9BQ0ssCi0JCQkJJnNkbTY2MF9jZGMtPm1iaGMuaHBoX3BhX2RhY19zdGF0ZSk7Ci0JCQltc21fYW5sZ19jZGNfbm90aWZpZXJfY2FsbChjb2RlYywKLQkJCQkJV0NEX0VWRU5UX1BPU1RfSFBIUl9QQV9PRkYpOwotCQl9Ci0JCS8qIFdhaXQgZm9yIDE1bXMgYWZ0ZXIgSFBIIFJYIHRlYXJkb3duICovCi0JCXVzbGVlcF9yYW5nZSgxNTAwMCwgMTUxMDApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcFtdID0gewotCS8qIFJEQUMgQ29ubmVjdGlvbnMgKi8KLQl7IkhQSFIgREFDIiwgTlVMTCwgIlJEQUMyIE1VWCJ9LAotCXsiUkRBQzIgTVVYIiwgIlJYMSIsICJQRE1fSU5fUlgxIn0sCi0JeyJSREFDMiBNVVgiLCAiUlgyIiwgIlBETV9JTl9SWDIifSwKLQotCS8qIFdTQSAqLwotCXsiV1NBX1NQSyBPVVQiLCBOVUxMLCAiV1NBIFNwayBTd2l0Y2gifSwKLQl7IldTQSBTcGsgU3dpdGNoIiwgIldTQSIsICJFQVIgUEEifSwKLQotCS8qIEVhcnBpZWNlIChSWCBNSVgxKSAqLwotCXsiRUFSIiwgTlVMTCwgIkVBUl9TIn0sCi0JeyJFQVJfUyIsICJTd2l0Y2giLCAiRUFSIFBBIn0sCi0JeyJFQVIgUEEiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiRUFSIFBBIiwgTlVMTCwgIkhQSEwgREFDIn0sCi0JeyJFQVIgUEEiLCBOVUxMLCAiSFBIUiBEQUMifSwKLQl7IkVBUiBQQSIsIE5VTEwsICJFQVIgQ1AifSwKLQotCS8qIEhlYWRzZXQgKFJYIE1JWDEgYW5kIFJYIE1JWDIpICovCi0JeyJIRUFEUEhPTkUiLCBOVUxMLCAiSFBITCBQQSJ9LAotCXsiSEVBRFBIT05FIiwgTlVMTCwgIkhQSFIgUEEifSwKLQotCXsiRXh0IFNwayIsIE5VTEwsICJFeHQgU3BrIFN3aXRjaCJ9LAotCXsiRXh0IFNwayBTd2l0Y2giLCAiT24iLCAiSFBITCBQQSJ9LAotCXsiRXh0IFNwayBTd2l0Y2giLCAiT24iLCAiSFBIUiBQQSJ9LAotCi0JeyJIUEhMIFBBIiwgTlVMTCwgIkhQSEwifSwKLQl7IkhQSFIgUEEiLCBOVUxMLCAiSFBIUiJ9LAotCXsiSFBITCIsICJTd2l0Y2giLCAiSFBITCBEQUMifSwKLQl7IkhQSFIiLCAiU3dpdGNoIiwgIkhQSFIgREFDIn0sCi0JeyJIUEhMIFBBIiwgTlVMTCwgIkNQIn0sCi0JeyJIUEhMIFBBIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IkhQSFIgUEEiLCBOVUxMLCAiQ1AifSwKLQl7IkhQSFIgUEEiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiSFBITCBEQUMiLCBOVUxMLCAiUERNX0lOX1JYMSJ9LAotCi0JeyJTUEtfT1VUIiwgTlVMTCwgIlNQSyBQQSJ9LAotCXsiU1BLIFBBIiwgTlVMTCwgIlNQS19SWF9CSUFTIn0sCi0JeyJTUEsgUEEiLCBOVUxMLCAiU1BLIn0sCi0JeyJTUEsiLCAiU3dpdGNoIiwgIlNQSyBEQUMifSwKLQl7IlNQSyBEQUMiLCBOVUxMLCAiUERNX0lOX1JYMyJ9LAotCXsiU1BLIERBQyIsIE5VTEwsICJWRERfU1BLRFJWIn0sCi0KLQkvKiBsaW5lb3V0ICovCi0JeyJMSU5FT1VUIiwgTlVMTCwgIkxJTkVPVVQgUEEifSwKLQl7IkxJTkVPVVQgUEEiLCBOVUxMLCAiU1BLX1JYX0JJQVMifSwKLQl7IkxJTkVPVVQgUEEiLCBOVUxMLCAiTElORV9PVVQifSwKLQl7IkxJTkVfT1VUIiwgIlN3aXRjaCIsICJMSU5FT1VUIERBQyJ9LAotCXsiTElORU9VVCBEQUMiLCBOVUxMLCAiUERNX0lOX1JYMyJ9LAotCi0JLyogbGluZW91dCB0byBXU0EgKi8KLQl7IldTQV9TUEsgT1VUIiwgTlVMTCwgIkxJTkVPVVQgUEEifSwKLQotCXsiUERNX0lOX1JYMSIsIE5VTEwsICJSWDEgQ0xLIn0sCi0JeyJQRE1fSU5fUlgyIiwgTlVMTCwgIlJYMiBDTEsifSwKLQl7IlBETV9JTl9SWDMiLCBOVUxMLCAiUlgzIENMSyJ9LAotCi0JeyJBREMxX09VVCIsIE5VTEwsICJBREMxIn0sCi0JeyJBREMyX09VVCIsIE5VTEwsICJBREMyIn0sCi0JeyJBREMzX09VVCIsIE5VTEwsICJBREMzIn0sCi0KLQkvKiBBREMgQ29ubmVjdGlvbnMgKi8KLQl7IkFEQzIiLCBOVUxMLCAiQURDMiBNVVgifSwKLQl7IkFEQzMiLCBOVUxMLCAiQURDMiBNVVgifSwKLQl7IkFEQzIgTVVYIiwgIklOUDIiLCAiQURDMl9JTlAyIn0sCi0JeyJBREMyIE1VWCIsICJJTlAzIiwgIkFEQzJfSU5QMyJ9LAotCi0JeyJBREMxIiwgTlVMTCwgIkFEQzFfSU5QMSJ9LAotCXsiQURDMV9JTlAxIiwgIlN3aXRjaCIsICJBTUlDMSJ9LAotCXsiQURDMl9JTlAyIiwgTlVMTCwgIkFNSUMyIn0sCi0JeyJBREMyX0lOUDMiLCBOVUxMLCAiQU1JQzMifSwKLQotCXsiTUlDIEJJQVMgSW50ZXJuYWwxIiwgTlVMTCwgIklOVF9MRE9fSCJ9LAotCXsiTUlDIEJJQVMgSW50ZXJuYWwyIiwgTlVMTCwgIklOVF9MRE9fSCJ9LAotCXsiTUlDIEJJQVMgRXh0ZXJuYWwiLCBOVUxMLCAiSU5UX0xET19IIn0sCi0JeyJNSUMgQklBUyBFeHRlcm5hbDIiLCBOVUxMLCAiSU5UX0xET19IIn0sCi0JeyJNSUMgQklBUyBJbnRlcm5hbDEiLCBOVUxMLCAiTUlDQklBU19SRUdVTEFUT1IifSwKLQl7Ik1JQyBCSUFTIEludGVybmFsMiIsIE5VTEwsICJNSUNCSUFTX1JFR1VMQVRPUiJ9LAotCXsiTUlDIEJJQVMgRXh0ZXJuYWwiLCBOVUxMLCAiTUlDQklBU19SRUdVTEFUT1IifSwKLQl7Ik1JQyBCSUFTIEV4dGVybmFsMiIsIE5VTEwsICJNSUNCSUFTX1JFR1VMQVRPUiJ9LAotfTsKLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKLQotCWRldl9kYmcoZGFpLT5jb2RlYy0+ZGV2LCAiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLAotCQlfX2Z1bmNfXywKLQkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0JLyoKLQkgKiBJZiBzdGF0dXNfbWFzayBpcyBCVVNfRE9XTiBpdCBtZWFucyBTU1IgaXMgbm90IGNvbXBsZXRlLgotCSAqIFNvIHJldHVybiBlcnJvci4KLQkgKi8KLQlpZiAodGVzdF9iaXQoQlVTX0RPV04sICZzZG02NjBfY2RjLT5zdGF0dXNfbWFzaykpIHsKLQkJZGV2X2VycihkYWktPmNvZGVjLT5kZXYsICJFcnJvciwgRGV2aWNlIGlzIG5vdCB1cCBwb3N0IFNTUlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JZGV2X2RiZyhkYWktPmNvZGVjLT5kZXYsCi0JCSIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAotCQlzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLX0KLQotaW50IG1zbV9hbmxnX2NkY19tY2xrX2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICAgIGludCBtY2xrX2VuYWJsZSwgYm9vbCBkYXBtKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtY2xrX2VuYWJsZSA9ICV1LCBkYXBtID0gJWRcbiIsCi0JCV9fZnVuY19fLCBtY2xrX2VuYWJsZSwgZGFwbSk7Ci0JaWYgKG1jbGtfZW5hYmxlKSB7Ci0JCXNkbTY2MF9jZGMtPmludF9tY2xrMF9lbmFibGVkID0gdHJ1ZTsKLQkJbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9jbG9ja19ibG9jayhjb2RlYywgMSk7Ci0JfSBlbHNlIHsKLQkJaWYgKCFzZG02NjBfY2RjLT5pbnRfbWNsazBfZW5hYmxlZCkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRXJyb3IsIE1DTEsgYWxyZWFkeSBkaWFibGVkXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNkbTY2MF9jZGMtPmludF9tY2xrMF9lbmFibGVkID0gZmFsc2U7Ci0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfY2xvY2tfYmxvY2soY29kZWMsIDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQotewotCWRldl9kYmcoZGFpLT5jb2RlYy0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCi17Ci0JZGV2X2RiZyhkYWktPmNvZGVjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJdW5zaWduZWQgaW50IHR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAotCQkJCXVuc2lnbmVkIGludCByeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKLQotewotCWRldl9kYmcoZGFpLT5jb2RlYy0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCSB1bnNpZ25lZCBpbnQgKnR4X251bSwgdW5zaWduZWQgaW50ICp0eF9zbG90LAotCQkJCSB1bnNpZ25lZCBpbnQgKnJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotCi17Ci0JZGV2X2RiZyhkYWktPmNvZGVjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fYW5sZ19jZGNfZGFpX29wcyA9IHsKLQkuc3RhcnR1cCA9IG1zbV9hbmxnX2NkY19zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9hbmxnX2NkY19zaHV0ZG93biwKLQkuc2V0X3N5c2NsayA9IG1zbV9hbmxnX2NkY19zZXRfZGFpX3N5c2NsaywKLQkuc2V0X2ZtdCA9IG1zbV9hbmxnX2NkY19zZXRfZGFpX2ZtdCwKLQkuc2V0X2NoYW5uZWxfbWFwID0gbXNtX2FubGdfY2RjX3NldF9jaGFubmVsX21hcCwKLQkuZ2V0X2NoYW5uZWxfbWFwID0gbXNtX2FubGdfY2RjX2dldF9jaGFubmVsX21hcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9hbmxnX2NkY19pMnNfZGFpW10gPSB7Ci0JewotCQkubmFtZSA9ICJtc21fYW5sZ19jZGNfaTJzX3J4MSIsCi0JCS5pZCA9IEFJRjFfUEIsCi0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQRE0gUGxheWJhY2siLAotCQkJLnJhdGVzID0gU0RNNjYwX0NEQ19SQVRFUywKLQkJCS5mb3JtYXRzID0gU0RNNjYwX0NEQ19GT1JNQVRTLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDMsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2FubGdfY2RjX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIm1zbV9hbmxnX2NkY19pMnNfdHgxIiwKLQkJLmlkID0gQUlGMV9DQVAsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlBETSBDYXB0dXJlIiwKLQkJCS5yYXRlcyA9IFNETTY2MF9DRENfUkFURVMsCi0JCQkuZm9ybWF0cyA9IFNETTY2MF9DRENfRk9STUFUUywKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2FubGdfY2RjX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIm1zbV9hbmxnX2NkY19pMnNfdHgyIiwKLQkJLmlkID0gQUlGM19TVkEsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlJlY29yZFNWQSIsCi0JCQkucmF0ZXMgPSBTRE02NjBfQ0RDX1JBVEVTLAotCQkJLmZvcm1hdHMgPSBTRE02NjBfQ0RDX0ZPUk1BVFMsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQl9LAotCQkub3BzID0gJm1zbV9hbmxnX2NkY19kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJtc21fYW5sZ192aWZlZWRiYWNrIiwKLQkJLmlkID0gQUlGMl9WSUZFRUQsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZJZmVlZCIsCi0JCQkucmF0ZXMgPSBTRE02NjBfQ0RDX1JBVEVTLAotCQkJLmZvcm1hdHMgPSBTRE02NjBfQ0RDX0ZPUk1BVFMsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5yYXRlX21pbiA9IDQ4MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJfSwKLQkJLm9wcyA9ICZtc21fYW5sZ19jZGNfZGFpX29wcywKLQl9LAotfTsKLQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfbG9fcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCSAgICAgICBESUdfQ0RDX0VWRU5UX1JYM19NVVRFX09GRik7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJICAgICAgIERJR19DRENfRVZFTlRfUlgzX01VVEVfT04pOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX3Nwa19leHRfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJCWludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9Ci0JCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVzIGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IGVuYWJsZSBleHRlcm5hbCBzcGVha2VyIFBBXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChzZG02NjBfY2RjLT5jb2RlY19zcGtfZXh0X3BhX2NiKQotCQkJc2RtNjYwX2NkYy0+Y29kZWNfc3BrX2V4dF9wYV9jYihjb2RlYywgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogZW5hYmxlIGV4dGVybmFsIHNwZWFrZXIgUEFcbiIsIF9fZnVuY19fKTsKLQkJaWYgKHNkbTY2MF9jZGMtPmNvZGVjX3Nwa19leHRfcGFfY2IpCi0JCQlzZG02NjBfY2RjLT5jb2RlY19zcGtfZXh0X3BhX2NiKGNvZGVjLCAwKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfZWFyX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMgPQotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IFNsZWVwaW5nIDIwbXMgYWZ0ZXIgc2VsZWN0IEVBUiBQQVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAotCQkJICAgIDB4ODAsIDB4ODApOwotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPCBDT05HQSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfV0dfVElNRSwgMHhGRiwgMHgyQSk7Ci0JCWlmIChnZXRfY29kZWNfdmVyc2lvbihzZG02NjBfY2RjKSA+PSBESUFOR1UpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9CSUFTX0RBQywgMHgwOCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfVEVTVCwgMHgwNCwgMHgwNCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVCwgMHgwNCwgMHgwNCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogU2xlZXBpbmcgMjBtcyBhZnRlciBlbmFibGluZyBFQVIgUEFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX0NUTCwKLQkJCSAgICAweDQwLCAweDQwKTsKLQkJLyogV2FpdCBmb3IgN21zIGFmdGVyIEVBUiBQQSBlbmFibGUgKi8KLQkJdXNsZWVwX3JhbmdlKDcwMDAsIDcxMDApOwotCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJICAgICAgIERJR19DRENfRVZFTlRfUlgxX01VVEVfT0ZGKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKLQkJbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLAotCQkJCSAgICAgICBESUdfQ0RDX0VWRU5UX1JYMV9NVVRFX09OKTsKLQkJLyogV2FpdCBmb3IgMjBtcyBmb3IgUlggZGlnaXRhbCBtdXRlIHRvIHRha2UgZWZmZWN0ICovCi0JCW1zbGVlcCgyMCk7Ci0JCWlmIChzZG02NjBfY2RjLT5ib29zdF9vcHRpb24gPT0gQk9PU1RfQUxXQVlTKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBib29zdF9vcHRpb246JWQsIHRlYXIgZG93biBlYXJcbiIsCi0JCQkJX19mdW5jX18sIHNkbTY2MF9jZGMtPmJvb3N0X29wdGlvbik7Ci0JCQltc21fYW5sZ19jZGNfYm9vc3RfbW9kZV9zZXF1ZW5jZShjb2RlYywgRUFSX1BNRCk7Ci0JCX0KLQkJaWYgKGdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpID49IERJQU5HVSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1QsIDB4MDQsIDB4MCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVCwgMHgwNCwgMHgwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJIiVzOiBTbGVlcGluZyA3bXMgYWZ0ZXIgZGlzYWJsaW5nIEVBUiBQQVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLAotCQkJICAgIDB4NDAsIDB4MDApOwotCQkvKiBXYWl0IGZvciA3bXMgYWZ0ZXIgRUFSIFBBIHRlYXJkb3duICovCi0JCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKLQkJaWYgKGdldF9jb2RlY192ZXJzaW9uKHNkbTY2MF9jZGMpIDwgQ09OR0EpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUUsIDB4RkYsIDB4MTYpOwotCQlpZiAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYykgPj0gRElBTkdVKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDLCAweDA4LCAweDA4KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX2FubGdfY2RjX2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9QR0FfRSgiRUFSIFBBIiwgU05EX1NPQ19OT1BNLAotCQkJMCwgMCwgTlVMTCwgMCwgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9lYXJfcGEsCi0JCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhMIFBBIiwgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLAotCQk1LCAwLCBOVUxMLCAwLAotCQltc21fYW5sZ19jZGNfaHBoX3BhX2V2ZW50LCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSFIgUEEiLCBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU4sCi0JCTQsIDAsIE5VTEwsIDAsCi0JCW1zbV9hbmxnX2NkY19ocGhfcGFfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9QR0FfRSgiU1BLIFBBIiwgU05EX1NPQ19OT1BNLAotCQkJMCwgMCwgTlVMTCwgMCwgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9zcGtfcGEsCi0JCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJMSU5FT1VUIFBBIiwgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19FTl9DVEwsCi0JCQk1LCAwLCBOVUxMLCAwLCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2xvX3BhLAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIkVBUl9TIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBlYXJfcGFfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTUEsiLCBTTkRfU09DX05PUE0sIDAsIDAsIHNwa3JfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJIUEhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBocGhsX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiSFBIUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgaHBocl9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJEQUMyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnJkYWMyX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiV1NBIFNwayBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDAsIHdzYV9zcGtfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJFeHQgU3BrIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmV4dF9zcGtfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJMSU5FX09VVCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgbG9fbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBREMyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnR4X2FkYzJfbXV4KSwKLQotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJIUEhMIERBQyIsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfUEFfREFDX0NUTCwgMywgMCwgTlVMTCwKLQkJMCwgbXNtX2FubGdfY2RjX2hwaGxfZGFjX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIkhQSFIgREFDIiwKLQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMLCAzLCAwLCBOVUxMLAotCQkwLCBtc21fYW5sZ19jZGNfaHBocl9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFEQzIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiQURDMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0KLQlTTkRfU09DX0RBUE1fREFDKCJTUEsgREFDIiwgTlVMTCwgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsCi0JCQkgNywgMCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJMSU5FT1VUIERBQyIsIE5VTEwsCi0JCVNORF9TT0NfTk9QTSwgMCwgMCwgbXNtX2FubGdfY2RjX2xvX2RhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIG1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfc3BrX2V4dF9wYSksCi0KLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMxX0lOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgJmFkYzFfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWDEgQ0xLIiwgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLAotCQkJICAgIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYMiBDTEsiLCBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkgICAgMSwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUlgzIENMSyIsIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTCwKLQkJCSAgICAyLCAwLCBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2RpZ19jbGssCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIkNQIiwgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRU4sIDAsIDAsCi0JCQkgICAgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9jaGFyZ2VfcHVtcCwKLQkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJFQVIgQ1AiLCBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9FTiwgNCwgMCwKLQkJCSAgICBtc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX2NoYXJnZV9wdW1wLAotCQkJICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9TVVBQTFlfUygiUlhfQklBUyIsIDEsIFNORF9TT0NfTk9QTSwKLQkJMCwgMCwgbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9yeF9iaWFzLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJTUEtfUlhfQklBUyIsIDEsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9yeF9iaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiVkREX1NQS0RSViIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICBzZG02NjBfd2NkX2NvZGVjX2VuYWJsZV92ZGRfc3BrciwKLQkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiSU5UX0xET19IIiwgU05EX1NPQ19OT1BNLCAxLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTX1JFR1VMQVRPUiIsIFNORF9TT0NfTk9QTSwKLQkJT05fREVNQU5EX01JQ0JJQVMsIDAsCi0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfb25fZGVtYW5kX3N1cHBseSwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMgSW50ZXJuYWwxIiwKLQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sIDcsIDAsCi0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfbWljYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTIEludGVybmFsMiIsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOLCA3LCAwLAotCQltc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBJbnRlcm5hbDMiLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwgNywgMCwKLQkJbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9taWNiaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzEiLCBOVUxMLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4sIDcsIDAsCi0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJBREMyX0lOUDIiLAotCQlOVUxMLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzJfRU4sIDcsIDAsCi0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJBREMyX0lOUDMiLAotCQlOVUxMLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU4sIDcsIDAsCi0JCW1zbV9hbmxnX2NkY19jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBFeHRlcm5hbCIsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOLCA3LCAwLAotCQltc21fYW5sZ19jZGNfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUyBFeHRlcm5hbDIiLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMl9FTiwgNywgMCwKLQkJbXNtX2FubGdfY2RjX2NvZGVjX2VuYWJsZV9taWNiaWFzLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDMSIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzIiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMzIiksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUERNX0lOX1JYMSIsICJQRE0gUGxheWJhY2siLAotCQkwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBETV9JTl9SWDIiLCAiUERNIFBsYXliYWNrIiwKLQkJMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJQRE1fSU5fUlgzIiwgIlBETSBQbGF5YmFjayIsCi0JCTAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi0KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJFQVIiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJXU0FfU1BLIE9VVCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkhFQURQSE9ORSIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS19PVVQiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUIiksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFEQzFfT1VUIiwgIlBETSBDYXB0dXJlIiwKLQkJMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiQURDMl9PVVQiLCAiUERNIENhcHR1cmUiLAotCQkwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBREMzX09VVCIsICJQRE0gQ2FwdHVyZSIsCi0JCTAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkbTY2MF9jZGNfcmVnX21hc2tfdmFsIG1zbV9hbmxnX2NkY19yZWdfZGVmYXVsdHNbXSA9IHsKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MDMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4ODIpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwgMHhFMSksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkbTY2MF9jZGNfcmVnX21hc2tfdmFsCi0JCQkJCW1zbV9hbmxnX2NkY19yZWdfZGVmYXVsdHNfMl8wW10gPSB7Ci0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MsIDB4QTUpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfT1BBTVBfQklBUywgMHg0RiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTCwgMHgyOCksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMLCAweDY5KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9EQkcsIDB4MDEpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwgMHg1RiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPLCAweDg4KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTLCAweEE1KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzLCAweDBGKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19DVVJSRU5UX0xJTUlULCAweDgyKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MDMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwgMHhFMSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMLCAweDgwKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RtNjYwX2NkY19yZWdfbWFza192YWwgY29uZ2Ffd2NkX3JlZ19kZWZhdWx0c1tdID0gewotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTLCAweEE1KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywgMHhBNSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVMsIDB4NEMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkwsIDB4MjgpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwgMHg2OSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHLCAweDAxKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9TVUJUWVBFLCAweDBBKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MDMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTCwgMHhFMSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMLCAweDgwKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RtNjYwX2NkY19yZWdfbWFza192YWwgY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tdID0gewotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTLCAweEE1KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywgMHhBNSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMMywgMHgwRiksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVMsIDB4NEMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQsIDB4ODIpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkwsIDB4QTgpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTCwgMHhBNCksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9BTkFfQklBU19TRVQsIDB4NDEpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwgMHg2OSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHLCAweDAxKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX09DUF9DVEwsIDB4RTEpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHgwMyksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfUEEsIDB4RkEpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTCwgMHg4MCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkbTY2MF9jZGNfcmVnX21hc2tfdmFsIGNham9uMnAwX3djZF9yZWdfZGVmYXVsdHNbXSA9IHsKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0RJR0lUQUxfU0VDX0FDQ0VTUywgMHhBNSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDMsIDB4MEYpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1MsIDB4QTUpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMsIDB4MEYpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9PUEFNUF9CSUFTLCAweDRDKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19DVVJSRU5UX0xJTUlULCAweEEyKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRkJDVFJMLCAweEE4KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwsIDB4QTQpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfQU5BX0JJQVNfU0VULCAweDQxKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsIDB4NjkpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0RCRywgMHgwMSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9PQ1BfQ1RMLCAweEUxKSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4MDMpLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9TVEFUVVMsIDB4MTApLAotCU1TTTg5WFhfUkVHX1ZBTChNU004OVhYX1BNSUNfQU5BTE9HX0JZUEFTU19NT0RFLCAweDE4KSwKLQlNU004OVhYX1JFR19WQUwoTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19QQSwgMHhGQSksCi0JTVNNODlYWF9SRUdfVkFMKE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMLCAweDgwKSwKLX07Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY191cGRhdGVfcmVnX2RlZmF1bHRzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQl1MzIgaSwgdmVyc2lvbjsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0KLQkJCQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl2ZXJzaW9uID0gZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkYyk7Ci0JaWYgKHZlcnNpb24gPT0gVE9NQkFLXzFfMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fYW5sZ19jZGNfcmVnX2RlZmF1bHRzKTsgaSsrKQotCQkJc25kX3NvY193cml0ZShjb2RlYywgbXNtX2FubGdfY2RjX3JlZ19kZWZhdWx0c1tpXS5yZWcsCi0JCQkJCW1zbV9hbmxnX2NkY19yZWdfZGVmYXVsdHNbaV0udmFsKTsKLQl9IGVsc2UgaWYgKHZlcnNpb24gPT0gVE9NQkFLXzJfMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fYW5sZ19jZGNfcmVnX2RlZmF1bHRzXzJfMCk7IGkrKykKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJbXNtX2FubGdfY2RjX3JlZ19kZWZhdWx0c18yXzBbaV0ucmVnLAotCQkJCW1zbV9hbmxnX2NkY19yZWdfZGVmYXVsdHNfMl8wW2ldLnZhbCk7Ci0JfSBlbHNlIGlmICh2ZXJzaW9uID09IENPTkdBKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbmdhX3djZF9yZWdfZGVmYXVsdHMpOyBpKyspCi0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCWNvbmdhX3djZF9yZWdfZGVmYXVsdHNbaV0ucmVnLAotCQkJCWNvbmdhX3djZF9yZWdfZGVmYXVsdHNbaV0udmFsKTsKLQl9IGVsc2UgaWYgKHZlcnNpb24gPT0gQ0FKT04pIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2Fqb25fd2NkX3JlZ19kZWZhdWx0cyk7IGkrKykKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tpXS5yZWcsCi0JCQkJY2Fqb25fd2NkX3JlZ19kZWZhdWx0c1tpXS52YWwpOwotCX0gZWxzZSBpZiAodmVyc2lvbiA9PSBDQUpPTl8yXzAgfHwgdmVyc2lvbiA9PSBESUFOR1UKLQkJCQl8fCB2ZXJzaW9uID09IERSQVhfQ0RDKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNham9uMnAwX3djZF9yZWdfZGVmYXVsdHMpOyBpKyspCi0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCWNham9uMnAwX3djZF9yZWdfZGVmYXVsdHNbaV0ucmVnLAotCQkJCWNham9uMnAwX3djZF9yZWdfZGVmYXVsdHNbaV0udmFsKTsKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RtNjYwX2NkY19yZWdfbWFza192YWwKLQltc21fYW5sZ19jZGNfY29kZWNfcmVnX2luaXRfdmFsW10gPSB7Ci0KLQkvKiBJbml0aWFsaXplIGN1cnJlbnQgdGhyZXNob2xkIHRvIDM1ME1BCi0JICogbnVtYmVyIG9mIHdhaXQgYW5kIHJ1biBjeWNsZXMgdG8gNDA5NgotCSAqLwotCXtNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ1RMLCAweEZGLCAweDEyfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NPVU5ULCAweEZGLCAweEZGfSwKLX07Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19jb2RlY19pbml0X2NhY2hlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQl1MzIgaTsKLQotCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvbXBvbmVudC5yZWdtYXAsIHRydWUpOwotCS8qIHVwZGF0ZSBjYWNoZSB3aXRoIFBPUiB2YWx1ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc204OXh4X3BtaWNfY2RjX2RlZmF1bHRzKTsgaSsrKQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBtc204OXh4X3BtaWNfY2RjX2RlZmF1bHRzW2ldLnJlZywKLQkJCSAgICAgIG1zbTg5eHhfcG1pY19jZGNfZGVmYXVsdHNbaV0uZGVmKTsKLQlyZWdjYWNoZV9jYWNoZV9vbmx5KGNvZGVjLT5jb21wb25lbnQucmVnbWFwLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19jb2RlY19pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fYW5sZ19jZGNfY29kZWNfcmVnX2luaXRfdmFsKTsgaSsrKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCSAgICBtc21fYW5sZ19jZGNfY29kZWNfcmVnX2luaXRfdmFsW2ldLnJlZywKLQkJCQkgICAgbXNtX2FubGdfY2RjX2NvZGVjX3JlZ19pbml0X3ZhbFtpXS5tYXNrLAotCQkJCSAgICBtc21fYW5sZ19jZGNfY29kZWNfcmVnX2luaXRfdmFsW2ldLnZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2JyaW5ndXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCU1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MsCi0JCTB4QTUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDQsIDB4MDEpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfU0VDX0FDQ0VTUywKLQkJMHhBNSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEw0LCAweDAxKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQlNU004OVhYX1BNSUNfRElHSVRBTF9TRUNfQUNDRVNTLAotCQkweEE1KTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0LCAweDAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1MsCi0JCTB4QTUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfUkVTRVRfQ1RMNCwgMHgwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKm1zbV9hbmxnX2NkY19maW5kX3JlZ3VsYXRvcigKLQkJCQljb25zdCBzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjLAotCQkJCWNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKLQkJaWYgKHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLnN1cHBseSAmJgotCQkgICAgIXN0cmNtcChzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHksIG5hbWUpKQotCQkJcmV0dXJuIHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyOwotCX0KLQotCWRldl9lcnIoc2RtNjYwX2NkYy0+ZGV2LCAiRXJyb3I6IHJlZ3VsYXRvciBub3QgZm91bmQ6JXNcbiIKLQkJCQksIG5hbWUpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBtc21fYW5sZ19jZGNfdXBkYXRlX21pY2JpYXNfcmVndWxhdG9yKAotCQkJCWNvbnN0IHN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMsCi0JCQkJY29uc3QgY2hhciAqbmFtZSwKLQkJCQlzdHJ1Y3Qgb25fZGVtYW5kX3N1cHBseSAqbWljYmlhc19zdXBwbHkpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcGRhdGEgKnBkYXRhID0gc2RtNjYwX2NkYy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCi0JZm9yIChpID0gMDsgaSA8IHNkbTY2MF9jZGMtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7Ci0JCWlmIChzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHkgJiYKLQkJICAgICFzdHJjbXAoc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uc3VwcGx5LCBuYW1lKSkgewotCQkJbWljYmlhc19zdXBwbHktPnN1cHBseSA9Ci0JCQkJc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXI7Ci0JCQltaWNiaWFzX3N1cHBseS0+bWluX3V2ID0gcGRhdGEtPnJlZ3VsYXRvcltpXS5taW5fdXY7Ci0JCQltaWNiaWFzX3N1cHBseS0+bWF4X3V2ID0gcGRhdGEtPnJlZ3VsYXRvcltpXS5tYXhfdXY7Ci0JCQltaWNiaWFzX3N1cHBseS0+b3B0aW11bV91YSA9Ci0JCQkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ub3B0aW11bV91YTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWRldl9lcnIoc2RtNjYwX2NkYy0+ZGV2LCAiRXJyb3I6IHJlZ3VsYXRvciBub3QgZm91bmQ6JXNcbiIsIG5hbWUpOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19kZXZpY2VfZG93bihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOwotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGNfcHJpdiA9Ci0JCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXVuc2lnbmVkIGludCB0eF8xX2VuOwotCXVuc2lnbmVkIGludCB0eF8yX2VuOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGV2aWNlIGRvd24hXG4iLCBfX2Z1bmNfXyk7Ci0KLQl0eF8xX2VuID0gc25kX3NvY19yZWFkKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4pOwotCXR4XzJfZW4gPSBzbmRfc29jX3JlYWQoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTik7Ci0JdHhfMV9lbiA9IHR4XzFfZW4gJiAweDdmOwotCXR4XzJfZW4gPSB0eF8yX2VuICYgMHg3ZjsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4sIHR4XzFfZW4pOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTiwgdHhfMl9lbik7Ci0JaWYgKHNkbTY2MF9jZGNfcHJpdi0+Ym9vc3Rfb3B0aW9uID09IEJPT1NUX09OX0ZPUkVWRVIpIHsKLQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfQ1RMKQotCQkJJiAweDgwKSA9PSAwKSB7Ci0JCQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsCi0JCQkJCQkgICAgICAgRElHX0NEQ19FVkVOVF9DTEtfT04pOwotCQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01BU1RFUl9CSUFTX0NUTCwgMHgzMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMLCAweDgwLCAweDgwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1RPUF9DTEtfQ1RMLAotCQkJCTB4MEMsIDB4MEMpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwsCi0JCQkJMHg4NCwgMHg4NCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTCwKLQkJCQkweDEwLCAweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwsCi0JCQkJMHgxRiwgMHgxRik7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDLAotCQkJCTB4OTAsIDB4OTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwsCi0JCQkJMHhGRiwgMHhGRik7Ci0JCQkvKiBXYWl0IGZvciAyMHVzIGZvciBib29zdCBzZXR0aW5ncyB0byB0YWtlIGVmZmVjdCAqLwotCQkJdXNsZWVwX3JhbmdlKDIwLCAyMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9QV1JTVEdfQ1RMLAotCQkJCTB4RkYsIDB4RkYpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTCwKLQkJCQkweEU5LCAweEU5KTsKLQkJfQotCX0KLQltc21fYW5sZ19jZGNfYm9vc3Rfb2ZmKGNvZGVjKTsKLQlzZG02NjBfY2RjX3ByaXYtPmhwaF9tb2RlID0gTk9STUFMX01PREU7Ci0KLQkvKiA0MG1zIHRvIGFsbG93IGJvb3N0IHRvIGRpc2NoYXJnZSAqLwotCW1zbGVlcCg0MCk7Ci0JLyogRGlzYWJsZSBQQSB0byBhdm9pZCBwb3AgZHVyaW5nIGNvZGVjIGJyaW5nIHVwICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLAotCQkJMHgzMCwgMHgwMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsCi0JCQkweDgwLCAweDAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1BBX0RBQ19DVEwsIDB4MjApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCU1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfUEFfREFDX0NUTCwgMHgyMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLCAweDEyKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQlNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTCwgMHg5Myk7Ci0KLQltc21fYW5sZ19jZGNfZGlnX25vdGlmaWVyX2NhbGwoY29kZWMsIERJR19DRENfRVZFTlRfU1NSX0RPV04pOwotCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgZmFsc2UpOwotCXNldF9iaXQoQlVTX0RPV04sICZzZG02NjBfY2RjX3ByaXYtPnN0YXR1c19tYXNrKTsKLQlzbmRfc29jX2NhcmRfY2hhbmdlX29ubGluZV9zdGF0ZShjb2RlYy0+Y29tcG9uZW50LmNhcmQsIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2RldmljZV91cChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkY19wcml2ID0KLQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGV2aWNlIHVwIVxuIiwgX19mdW5jX18pOwotCi0JbXNtX2FubGdfY2RjX2RpZ19ub3RpZmllcl9jYWxsKGNvZGVjLCBESUdfQ0RDX0VWRU5UX1NTUl9VUCk7Ci0JY2xlYXJfYml0KEJVU19ET1dOLCAmc2RtNjYwX2NkY19wcml2LT5zdGF0dXNfbWFzayk7Ci0Jc25kX3NvY19jYXJkX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29kZWMtPmNvbXBvbmVudC5jYXJkLCAxKTsKLQkvKiBkZWxheSBpcyByZXF1aXJlZCB0byBtYWtlIHN1cmUgc291bmQgY2FyZCBzdGF0ZSB1cGRhdGVkICovCi0JdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVCwKLQkJCQlNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfRU5fU0VUX19QT1IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9DTFIsCi0JCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUl9fUE9SKTsKLQotCW1zbV9hbmxnX2NkY19zZXRfYm9vc3Rfdihjb2RlYyk7Ci0JbXNtX2FubGdfY2RjX3NldF9taWNiX3YoY29kZWMpOwotCWlmIChzZG02NjBfY2RjX3ByaXYtPmJvb3N0X29wdGlvbiA9PSBCT09TVF9PTl9GT1JFVkVSKQotCQltc21fYW5sZ19jZGNfYm9vc3Rfb24oY29kZWMpOwotCWVsc2UgaWYgKHNkbTY2MF9jZGNfcHJpdi0+Ym9vc3Rfb3B0aW9uID09IEJZUEFTU19BTFdBWVMpCi0JCW1zbV9hbmxnX2NkY19ieXBhc3Nfb24oY29kZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtNjYwX2NkY19ub3RpZmllcl9zZXJ2aWNlX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkY19wcml2ID0KLQkJCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBzZG02NjBfY2RjX3ByaXYsCi0JCQkJCSAgICAgYXVkaW9fc3NyX25iKTsKLQlib29sIGFkc3BfcmVhZHkgPSBmYWxzZTsKLQlib29sIHRpbWVkb3V0OwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQlzdGF0aWMgYm9vbCBpbml0aWFsX2Jvb3QgPSB0cnVlOwotCi0JY29kZWMgPSBzZG02NjBfY2RjX3ByaXYtPmNvZGVjOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBTZXJ2aWNlIG9wY29kZSAweCVseFxuIiwgX19mdW5jX18sIG9wY29kZSk7Ci0KLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9ET1dOOgotCQlpZiAoaW5pdGlhbF9ib290KSB7Ci0JCQlpbml0aWFsX2Jvb3QgPSBmYWxzZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSJBRFNQIGlzIGFib3V0IHRvIHBvd2VyIGRvd24uIHRlYXJkb3duL3Jlc2V0IGNvZGVjXG4iKTsKLQkJbXNtX2FubGdfY2RjX2RldmljZV9kb3duKGNvZGVjKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX1VQOgotCQlpZiAoaW5pdGlhbF9ib290KQotCQkJaW5pdGlhbF9ib290ID0gZmFsc2U7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSJBRFNQIGlzIGFib3V0IHRvIHBvd2VyIHVwLiBicmluZyB1cCBjb2RlY1xuIik7Ci0KLQkJaWYgKCFxNmNvcmVfaXNfYWRzcF9yZWFkeSgpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJIkFEU1AgaXNuJ3QgcmVhZHlcbiIpOwotCQkJdGltZW91dCA9IGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMpOwotCQkJd2hpbGUgKCEodGltZWRvdXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSkgewotCQkJCWlmICghcTZjb3JlX2lzX2Fkc3BfcmVhZHkoKSkgewotCQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJCQkiQURTUCBpc24ndCByZWFkeVxuIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCQkJIkFEU1AgaXMgcmVhZHlcbiIpOwotCQkJCQlhZHNwX3JlYWR5ID0gdHJ1ZTsKLQkJCQkJZ290byBwb3dlcnVwOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFkc3BfcmVhZHkgPSB0cnVlOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERTUCBpcyByZWFkeVxuIiwgX19mdW5jX18pOwotCQl9Ci1wb3dlcnVwOgotCQlpZiAoYWRzcF9yZWFkeSkKLQkJCW1zbV9hbmxnX2NkY19kZXZpY2VfdXAoY29kZWMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotaW50IG1zbV9hbmxnX2NkY19oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkY19wcml2ID0KLQkJc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXR1cm4gd2NkX21iaGNfc3RhcnQoJnNkbTY2MF9jZGNfcHJpdi0+bWJoYywgbWJoY19jZmcpOwotfQotRVhQT1JUX1NZTUJPTChtc21fYW5sZ19jZGNfaHNfZGV0ZWN0KTsKLQotdm9pZCBtc21fYW5sZ19jZGNfaHNfZGV0ZWN0X2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGNfcHJpdiA9Ci0JCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jd2NkX21iaGNfc3RvcCgmc2RtNjYwX2NkY19wcml2LT5tYmhjKTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2FubGdfY2RjX2hzX2RldGVjdF9leGl0KTsKLQotdm9pZCBtc21fYW5sZ19jZGNfdXBkYXRlX2ludF9zcGtfYm9vc3QoYm9vbCBlbmFibGUpCi17Ci0JcHJfZGVidWcoIiVzOiBlbmFibGUgPSAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0Jc3Brcl9ib29zdF9lbiA9IGVuYWJsZTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2FubGdfY2RjX3VwZGF0ZV9pbnRfc3BrX2Jvb3N0KTsKLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX3NldF9taWNiX3Yoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCi0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSA9IHNkbTY2MF9jZGMtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQl1OCByZWdfdmFsOwotCi0JcmVnX3ZhbCA9IFZPTFRBR0VfQ09OVkVSVEVSKHBkYXRhLT5taWNiaWFzLmNmaWx0MV9tdiwgTUlDQklBU19NSU5fVkFMLAotCQkJTUlDQklBU19TVEVQX1NJWkUpOwotCWRldl9kYmcoY29kZWMtPmRldiwgImNmaWx0MV9tdiAlZCByZWdfdmFsICV4XG4iLAotCQkJKHUzMilwZGF0YS0+bWljYmlhcy5jZmlsdDFfbXYsIHJlZ192YWwpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX1ZBTCwKLQkJCTB4RjgsIChyZWdfdmFsIDw8IDMpKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX3NldF9ib29zdF92KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjX3ByaXYgPQotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19PVVRQVVRfVk9MVEFHRSwKLQkJCTB4MUYsIHNkbTY2MF9jZGNfcHJpdi0+Ym9vc3Rfdm9sdGFnZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hbmxnX2NkY19jb25maWd1cmVfY2FwKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgICAgYm9vbCBtaWNiaWFzMSwgYm9vbCBtaWNiaWFzMikKLXsKLQotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0KLQlwcl9kZWJ1ZygiXG4gJXM6IG1pY2JpYXMxICV4IG1pY2JpYXMyID0gJWRcbiIsIF9fZnVuY19fLCBtaWNiaWFzMSwKLQkJCW1pY2JpYXMyKTsKLQlpZiAobWljYmlhczEgJiYgbWljYmlhczIpIHsKLQkJaWYgKChwZGF0YS0+bWljYmlhczFfY2FwX21vZGUKLQkJICAgICA9PSBNSUNCSUFTX0VYVF9CWVBfQ0FQKSB8fAotCQkgICAgKHBkYXRhLT5taWNiaWFzMl9jYXBfbW9kZQotCQkgICAgID09IE1JQ0JJQVNfRVhUX0JZUF9DQVApKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwKLQkJCQkweDQwLCAoTUlDQklBU19FWFRfQllQX0NBUCA8PCA2KSk7Ci0JCWVsc2UKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sCi0JCQkJMHg0MCwgKE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVAgPDwgNikpOwotCX0gZWxzZSBpZiAobWljYmlhczIpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4sCi0JCQkJMHg0MCwgKHBkYXRhLT5taWNiaWFzMl9jYXBfbW9kZSA8PCA2KSk7Ci0JfSBlbHNlIGlmIChtaWNiaWFzMSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwKLQkJCQkweDQwLCAocGRhdGEtPm1pY2JpYXMxX2NhcF9tb2RlIDw8IDYpKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9FTiwKLQkJCQkweDQwLCAweDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG1zbV9hbmxnX2NvZGVjX3ZlcnNpb25fcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAotCQkJCQkgICB2b2lkICpmaWxlX3ByaXZhdGVfZGF0YSwKLQkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJICAgbG9mZl90IHBvcykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjX3ByaXY7Ci0JY2hhciBidWZmZXJbTVNNX0FOTEdfQ0RDX1ZFUlNJT05fRU5UUllfU0laRV07Ci0JaW50IGxlbiA9IDA7Ci0KLQlzZG02NjBfY2RjX3ByaXYgPSAoc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwotCWlmICghc2RtNjYwX2NkY19wcml2KSB7Ci0JCXByX2VycigiJXM6IHNkbTY2MF9jZGNfcHJpdiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZ2V0X2NvZGVjX3ZlcnNpb24oc2RtNjYwX2NkY19wcml2KSkgewotCWNhc2UgRFJBWF9DREM6Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJEUkFYLUNEQ18xXzBcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7Ci0JfQotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgbXNtX2FubGdfY29kZWNfaW5mb19vcHMgPSB7Ci0JLnJlYWQgPSBtc21fYW5sZ19jb2RlY192ZXJzaW9uX3JlYWQsCi19OwotCi0vKgotICogbXNtX2FubGdfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIHBtaWNfYW5hbG9nIG1vZHVsZQotICogQGNvZGVjX3Jvb3Q6IFRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0gKiBAY29kZWM6IENvZGVjIGluc3RhbmNlCi0gKgotICogQ3JlYXRlcyBwbWljX2FuYWxvZyBtb2R1bGUgYW5kIHZlcnNpb24gZW50cnkgdW5kZXIgdGhlIGdpdmVuCi0gKiBwYXJlbnQgZGlyZWN0b3J5LgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotaW50IG1zbV9hbmxnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjX3ByaXY7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQlpbnQgcmV0OwotCi0JaWYgKCFjb2RlY19yb290IHx8ICFjb2RlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzZG02NjBfY2RjX3ByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXNkbTY2MF9jZGNfcHJpdi0+ZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNvZGVjX3Jvb3QtPm1vZHVsZSwKLQkJCQkJCQkgICAgICJzcG1pMC0wMyIsCi0JCQkJCQkJICAgICBjb2RlY19yb290KTsKLQlpZiAoIXNkbTY2MF9jZGNfcHJpdi0+ZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgcG1pY19hbmFsb2cgZW50cnlcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXZlcnNpb25fZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLT5zbmRfY2FyZCwKLQkJCQkJCSAgICJ2ZXJzaW9uIiwKLQkJCQkJCSAgIHNkbTY2MF9jZGNfcHJpdi0+ZW50cnkpOwotCWlmICghdmVyc2lvbl9lbnRyeSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBwbWljX2FuYWxvZyB2ZXJzaW9uIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSBzZG02NjBfY2RjX3ByaXY7Ci0JdmVyc2lvbl9lbnRyeS0+c2l6ZSA9IE1TTV9BTkxHX0NEQ19WRVJTSU9OX0VOVFJZX1NJWkU7Ci0JdmVyc2lvbl9lbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOwotCXZlcnNpb25fZW50cnktPmMub3BzID0gJm1zbV9hbmxnX2NvZGVjX2luZm9fb3BzOwotCi0JaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKHZlcnNpb25fZW50cnkpIDwgMCkgewotCQlzbmRfaW5mb19mcmVlX2VudHJ5KHZlcnNpb25fZW50cnkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc2RtNjYwX2NkY19wcml2LT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKLQotCXNkbTY2MF9jZGNfcHJpdi0+YXVkaW9fc3NyX25iLm5vdGlmaWVyX2NhbGwgPQotCQkJCXNkbTY2MF9jZGNfbm90aWZpZXJfc2VydmljZV9jYjsKLQlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3RlcigicG1pY19hbmFsb2dfY2RjIiwKLQkJCQkgICAgICBBVURJT19OT1RJRklFUl9BRFNQX0RPTUFJTiwKLQkJCQkgICAgICAmc2RtNjYwX2NkY19wcml2LT5hdWRpb19zc3JfbmIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEF1ZGlvIG5vdGlmaWVyIHJlZ2lzdGVyIGZhaWxlZCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2FubGdfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkpOwotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19zb2NfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7Ci0JaW50IHJldDsKLQotCXNkbTY2MF9jZGMgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldik7Ci0Jc2RtNjYwX2NkYy0+Y29kZWMgPSBjb2RlYzsKLQotCS8qIGNvZGVjIHJlc21nciBtb2R1bGUgaW5pdCAqLwotCXNkbTY2MF9jZGMtPnNwa2Rydl9yZWcgPQotCQkJCW1zbV9hbmxnX2NkY19maW5kX3JlZ3VsYXRvcihzZG02NjBfY2RjLAotCQkJCQkJTVNNODlYWF9WRERfU1BLRFJWX05BTUUpOwotCXNkbTY2MF9jZGMtPnBtaWNfcmV2ID0KLQkJCQlzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCSAgICAgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xKTsKLQlzZG02NjBfY2RjLT5jb2RlY192ZXJzaW9uID0KLQkJCQlzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCU1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1NVQlRZUEUpOwotCXNkbTY2MF9jZGMtPmFuYWxvZ19tYWpvcl9yZXYgPQotCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQkJICAgICBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONCk7Ci0KLQlpZiAoc2RtNjYwX2NkYy0+Y29kZWNfdmVyc2lvbiA9PSBDT05HQSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyA6Q29uZ2EgUkVWOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCXNkbTY2MF9jZGMtPmNvZGVjX3ZlcnNpb24pOwotCQlzZG02NjBfY2RjLT5leHRfc3BrX2Jvb3N0X3NldCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgOlBNSUMgUkVWOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCXNkbTY2MF9jZGMtPnBtaWNfcmV2KTsKLQkJaWYgKHNkbTY2MF9jZGMtPnBtaWNfcmV2ID09IFRPTUJBS18xXzAgJiYKLQkJCXNkbTY2MF9jZGMtPmNvZGVjX3ZlcnNpb24gPT0gQ0FKT05fMl8wKSB7Ci0JCQlpZiAoc2RtNjYwX2NkYy0+YW5hbG9nX21ham9yX3JldiA9PSAweDAyKSB7Ci0JCQkJc2RtNjYwX2NkYy0+Y29kZWNfdmVyc2lvbiA9IERSQVhfQ0RDOwotCQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkJIiVzIDogRHJheCBjb2RlYyBkZXRlY3RlZFxuIiwgX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQlzZG02NjBfY2RjLT5jb2RlY192ZXJzaW9uID0gRElBTkdVOwotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIDogRGlhbmd1IGRldGVjdGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc2RtNjYwX2NkYy0+cG1pY19yZXYgPT0gVE9NQkFLXzFfMCAmJgotCQkJKHNuZF9zb2NfcmVhZChjb2RlYywgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRkJDVFJMKQotCQkJICYgMHg4MCkpIHsKLQkJCXNkbTY2MF9jZGMtPmNvZGVjX3ZlcnNpb24gPSBDQUpPTjsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIDogQ2Fqb24gZGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKLQkJfSBlbHNlIGlmIChzZG02NjBfY2RjLT5wbWljX3JldiA9PSBUT01CQUtfMl8wICYmCi0JCQkoc25kX3NvY19yZWFkKGNvZGVjLCBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkwpCi0JCQkgJiAweDgwKSkgewotCQkJc2RtNjYwX2NkYy0+Y29kZWNfdmVyc2lvbiA9IENBSk9OXzJfMDsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIDogQ2Fqb24gMi4wIGRldGVjdGVkXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQl9Ci0JfQotCS8qCi0JICogc2V0IHRvIGRlZmF1bHQgYm9vc3Qgb3B0aW9uIEJPT1NUX1NXSVRDSCwgdXNlciBtaXhlciBwYXRoIGNhbiBjaGFuZ2UKLQkgKiBpdCB0byBCT09TVF9BTFdBWVMgb3IgQk9PU1RfQllQQVNTIGJhc2VkIG9uIHNvbHV0aW9uIGNob3Nlbi4KLQkgKi8KLQlzZG02NjBfY2RjLT5ib29zdF9vcHRpb24gPSBCT09TVF9TV0lUQ0g7Ci0Jc2RtNjYwX2NkYy0+aHBoX21vZGUgPSBOT1JNQUxfTU9ERTsKLQotCW1zbV9hbmxnX2NkY19kdF9wYXJzZV9ib29zdF9pbmZvKGNvZGVjKTsKLQltc21fYW5sZ19jZGNfc2V0X2Jvb3N0X3YoY29kZWMpOwotCi0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRShpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzKSk7Ci0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIGhwaF90eXBlX2RldGVjdF9jb250cm9scywKLQkJCQkgIEFSUkFZX1NJWkUoaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzKSk7Ci0KLQltc21fYW5sZ19jZGNfYnJpbmd1cChjb2RlYyk7Ci0JbXNtX2FubGdfY2RjX2NvZGVjX2luaXRfY2FjaGUoY29kZWMpOwotCW1zbV9hbmxnX2NkY19jb2RlY19pbml0X3JlZyhjb2RlYyk7Ci0JbXNtX2FubGdfY2RjX3VwZGF0ZV9yZWdfZGVmYXVsdHMoY29kZWMpOwotCi0Jd2NkOXh4eF9zcG1pX3NldF9jb2RlYyhjb2RlYyk7Ci0KLQltc21fYW5sZ19jZGNfdXBkYXRlX21pY2JpYXNfcmVndWxhdG9yKAotCQkJCXNkbTY2MF9jZGMsCi0JCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW09OX0RFTUFORF9NSUNCSUFTXSwKLQkJCQkmc2RtNjYwX2NkYy0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdKTsKLQlhdG9taWNfc2V0KCZzZG02NjBfY2RjLT5vbl9kZW1hbmRfbGlzdFtPTl9ERU1BTkRfTUlDQklBU10ucmVmLAotCQkgICAwKTsKLQotCXNkbTY2MF9jZGMtPmZ3X2RhdGEgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwKLQkJCQkJc2l6ZW9mKCooc2RtNjYwX2NkYy0+ZndfZGF0YSkpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXNkbTY2MF9jZGMtPmZ3X2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2V0X2JpdChXQ0Q5WFhYX01CSENfQ0FMLCBzZG02NjBfY2RjLT5md19kYXRhLT5jYWxfYml0KTsKLQlyZXQgPSB3Y2RfY2FsX2NyZWF0ZV9od2RlcChzZG02NjBfY2RjLT5md19kYXRhLAotCQkJV0NEOVhYWF9DT0RFQ19IV0RFUF9OT0RFLCBjb2RlYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXMgaHdkZXAgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl3Y2RfbWJoY19pbml0KCZzZG02NjBfY2RjLT5tYmhjLCBjb2RlYywgJm1iaGNfY2IsICZpbnRyX2lkcywKLQkJICAgICAgd2NkX21iaGNfcmVnaXN0ZXJzLCB0cnVlKTsKLQotCXNkbTY2MF9jZGMtPmludF9tY2xrMF9lbmFibGVkID0gZmFsc2U7Ci0JLypVcGRhdGUgc3BlYWtlciBib29zdCBjb25maWd1cmF0aW9uKi8KLQlzZG02NjBfY2RjLT5zcGtfYm9vc3Rfc2V0ID0gc3Brcl9ib29zdF9lbjsKLQlwcl9kZWJ1ZygiJXM6IHNwZWFrZXIgYm9vc3QgY29uZmlndXJlZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHNkbTY2MF9jZGMtPnNwa19ib29zdF9zZXQpOwotCi0JLyogU2V0IGluaXRpYWwgTUlDQklBUyB2b2x0YWdlIGxldmVsICovCi0JbXNtX2FubGdfY2RjX3NldF9taWNiX3YoY29kZWMpOwotCi0JLyogU2V0IGluaXRpYWwgY2FwIG1vZGUgKi8KLQltc21fYW5sZ19jZGNfY29uZmlndXJlX2NhcChjb2RlYywgZmFsc2UsIGZhbHNlKTsKLQotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiUERNIFBsYXliYWNrIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJQRE0gQ2FwdHVyZSIpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfc29jX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkY19wcml2ID0KLQkJCQkJZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOwotCi0Jc2RtNjYwX2NkY19wcml2LT5zcGtkcnZfcmVnID0gTlVMTDsKLQlzZG02NjBfY2RjX3ByaXYtPm9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9NSUNCSUFTXS5zdXBwbHkgPSBOVUxMOwotCWF0b21pY19zZXQoJnNkbTY2MF9jZGNfcHJpdi0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdLnJlZiwKLQkJICAgMCk7Ci0Jd2NkX21iaGNfZGVpbml0KCZzZG02NjBfY2RjX3ByaXYtPm1iaGMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXNfdG9fb3B0aW11bSgKLQkJCQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjLAotCQkJCXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzZG02NjBfY2RjLT5udW1fb2Zfc3VwcGxpZXM7IGkrKykgewotCQlpZiAocGRhdGEtPnJlZ3VsYXRvcltpXS5vbmRlbWFuZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmVndWxhdG9yX2NvdW50X3ZvbHRhZ2VzKAotCQkJCXNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyKSA8PSAwKQotCQkJY29udGludWU7Ci0KLQkJcmV0ID0gcmVndWxhdG9yX3NldF92b2x0YWdlKAotCQkJCXNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLAotCQkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWluX3V2LAotCQkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWF4X3V2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihzZG02NjBfY2RjLT5kZXYsCi0JCQkJIlNldHRpbmcgdm9sdCBmYWlsZWQgZm9yIHJlZ3VsYXRvciAlcyBlcnIgJWRcbiIsCi0JCQkJc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uc3VwcGx5LCByZXQpOwotCQl9Ci0KLQkJcmV0ID0gcmVndWxhdG9yX3NldF9sb2FkKHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLAotCQkJcGRhdGEtPnJlZ3VsYXRvcltpXS5vcHRpbXVtX3VhKTsKLQkJZGV2X2RiZyhzZG02NjBfY2RjLT5kZXYsICJSZWd1bGF0b3IgJXMgc2V0IG9wdGltdW0gbW9kZVxuIiwKLQkJCSBzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHkpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2Rpc2FibGVfc3RhdGljX3N1cHBsaWVzX3RvX29wdGltdW0oCi0JCQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjLAotCQkJc3RydWN0IHNkbTY2MF9jZGNfcGRhdGEgKnBkYXRhKQotewotCWludCBpOwotCWludCByZXQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHNkbTY2MF9jZGMtPm51bV9vZl9zdXBwbGllczsgaSsrKSB7Ci0JCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kKQotCQkJY29udGludWU7Ci0JCWlmIChyZWd1bGF0b3JfY291bnRfdm9sdGFnZXMoCi0JCQkJc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXIpIDw9IDApCi0JCQljb250aW51ZTsKLQkJcmVndWxhdG9yX3NldF92b2x0YWdlKHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLCAwLAotCQkJCXBkYXRhLT5yZWd1bGF0b3JbaV0ubWF4X3V2KTsKLQkJcmVndWxhdG9yX3NldF9sb2FkKHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLCAwKTsKLQkJZGV2X2RiZyhzZG02NjBfY2RjLT5kZXYsICJSZWd1bGF0b3IgJXMgc2V0IG9wdGltdW0gbW9kZVxuIiwKLQkJCQkgc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uc3VwcGx5KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcGRhdGEgKnNkbTY2MF9jZGNfcGRhdGEgPQotCQkJCQlzZG02NjBfY2RjLT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQltc21fYW5sZ19jZGNfZGlzYWJsZV9zdGF0aWNfc3VwcGxpZXNfdG9fb3B0aW11bShzZG02NjBfY2RjLAotCQkJCQkJCXNkbTY2MF9jZGNfcGRhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNkbTY2MF9jZGNfcGRhdGEgKnNkbTY2MF9jZGNfcGRhdGEgPQotCQkJCQlzZG02NjBfY2RjLT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCW1zbV9hbmxnX2NkY19lbmFibGVfc3RhdGljX3N1cHBsaWVzX3RvX29wdGltdW0oc2RtNjYwX2NkYywKLQkJCQkJCSAgICAgICBzZG02NjBfY2RjX3BkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByZWdtYXAgKm1zbV9hbmxnX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBkZXZfZ2V0X3JlZ21hcChkZXYtPnBhcmVudCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zZG02NjBfY2RjID0gewotCS5wcm9iZQk9IG1zbV9hbmxnX2NkY19zb2NfcHJvYmUsCi0JLnJlbW92ZQk9IG1zbV9hbmxnX2NkY19zb2NfcmVtb3ZlLAotCS5zdXNwZW5kID0gbXNtX2FubGdfY2RjX3N1c3BlbmQsCi0JLnJlc3VtZSA9IG1zbV9hbmxnX2NkY19yZXN1bWUsCi0JLnJlZ193b3JkX3NpemUgPSAxLAotCS5nZXRfcmVnbWFwID0gbXNtX2FubGdfZ2V0X3JlZ21hcCwKLQkuY29tcG9uZW50X2RyaXZlciA9IHsKLQkJLmNvbnRyb2xzID0gbXNtX2FubGdfY2RjX3NuZF9jb250cm9scywKLQkJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobXNtX2FubGdfY2RjX3NuZF9jb250cm9scyksCi0JCS5kYXBtX3dpZGdldHMgPSBtc21fYW5sZ19jZGNfZGFwbV93aWRnZXRzLAotCQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobXNtX2FubGdfY2RjX2RhcG1fd2lkZ2V0cyksCi0JCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKLQkJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKLQl9LAotfTsKLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfaW5pdF9zdXBwbGllcyhzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjLAotCQkJCXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSkKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCi0Jc2RtNjYwX2NkYy0+c3VwcGxpZXMgPSBkZXZtX2t6YWxsb2Moc2RtNjYwX2NkYy0+ZGV2LAotCQkJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEpICoKLQkJCQkJQVJSQVlfU0laRShwZGF0YS0+cmVndWxhdG9yKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZG02NjBfY2RjLT5zdXBwbGllcykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzZG02NjBfY2RjLT5udW1fb2Zfc3VwcGxpZXMgPSAwOwotCWlmIChBUlJBWV9TSVpFKHBkYXRhLT5yZWd1bGF0b3IpID4gTUFYX1JFR1VMQVRPUikgewotCQlkZXZfZXJyKHNkbTY2MF9jZGMtPmRldiwgIiVzOiBBcnJheSBTaXplIG91dCBvZiBib3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGRhdGEtPnJlZ3VsYXRvcik7IGkrKykgewotCQlpZiAocGRhdGEtPnJlZ3VsYXRvcltpXS5uYW1lKSB7Ci0JCQlzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHkgPQotCQkJCQkJcGRhdGEtPnJlZ3VsYXRvcltpXS5uYW1lOwotCQkJc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzKys7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChzZG02NjBfY2RjLT5kZXYsCi0JCQkJICAgICAgc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzLAotCQkJCSAgICAgIHNkbTY2MF9jZGMtPnN1cHBsaWVzKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2VycihzZG02NjBfY2RjLT5kZXYsCi0JCQkiRmFpbGVkIHRvIGdldCBzdXBwbGllczogZXJyID0gJWRcbiIsCi0JCQlyZXQpOwotCQlnb3RvIGVycl9zdXBwbGllczsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKLQkJaWYgKHJlZ3VsYXRvcl9jb3VudF92b2x0YWdlcygKLQkJCXNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyKSA8PSAwKQotCQkJY29udGludWU7Ci0JCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kKSB7Ci0JCQlyZXQgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoCi0JCQkJCXNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLAotCQkJCQkwLCBwZGF0YS0+cmVndWxhdG9yW2ldLm1heF91dik7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycihzZG02NjBfY2RjLT5kZXYsCi0JCQkJCSJTZXR0aW5nIHJlZ3VsYXRvciB2b2x0YWdlIGZhaWxlZCBmb3IgcmVndWxhdG9yICVzIGVyciA9ICVkXG4iLAotCQkJCQlzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHksIHJldCk7Ci0JCQkJZ290byBlcnJfc3VwcGxpZXM7Ci0JCQl9Ci0JCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQoCi0JCQkJc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXIsIDApOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKHNkbTY2MF9jZGMtPmRldiwKLQkJCQkJIlNldHRpbmcgcmVndWxhdG9yIG9wdGltdW0gbW9kZSBmYWlsZWQgZm9yIHJlZ3VsYXRvciAlcyBlcnIgPSAlZFxuIiwKLQkJCQkJc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uc3VwcGx5LCByZXQpOwotCQkJCWdvdG8gZXJyX3N1cHBsaWVzOwotCQkJfSBlbHNlIHsKLQkJCQlyZXQgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5jb25zdW1lciwKLQkJCQkJICAgIHBkYXRhLT5yZWd1bGF0b3JbaV0ubWluX3V2LAotCQkJCQkgICAgcGRhdGEtPnJlZ3VsYXRvcltpXS5tYXhfdXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHNkbTY2MF9jZGMtPmRldiwKLQkJCQkiU2V0dGluZyByZWd1bGF0b3Igdm9sdGFnZSBmYWlsZWQgZm9yIHJlZ3VsYXRvciAlcyBlcnIgPSAlZFxuIiwKLQkJCQlzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHksIHJldCk7Ci0JCQlnb3RvIGVycl9zdXBwbGllczsKLQkJfQotCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQoc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXIsCi0JCQkJCSBwZGF0YS0+cmVndWxhdG9yW2ldLm9wdGltdW1fdWEpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihzZG02NjBfY2RjLT5kZXYsCi0JCQkJIlNldHRpbmcgcmVndWxhdG9yIG9wdGltdW0gbW9kZSBmYWlsZWQgZm9yIHJlZ3VsYXRvciAlcyBlcnIgPSAlZFxuIiwKLQkJCQlzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHksIHJldCk7Ci0JCQlnb3RvIGVycl9zdXBwbGllczsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnJfc3VwcGxpZXM6Ci0Ja2ZyZWUoc2RtNjYwX2NkYy0+c3VwcGxpZXMpOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FubGdfY2RjX2VuYWJsZV9zdGF0aWNfc3VwcGxpZXMoCi0JCQkJCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnNkbTY2MF9jZGMsCi0JCQkJCXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzZG02NjBfY2RjLT5udW1fb2Zfc3VwcGxpZXM7IGkrKykgewotCQlpZiAocGRhdGEtPnJlZ3VsYXRvcltpXS5vbmRlbWFuZCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLmNvbnN1bWVyKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihzZG02NjBfY2RjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlICVzXG4iLAotCQkJICAgICAgIHNkbTY2MF9jZGMtPnN1cHBsaWVzW2ldLnN1cHBseSk7Ci0JCQlicmVhazsKLQkJfQotCQlkZXZfZGJnKHNkbTY2MF9jZGMtPmRldiwgIkVuYWJsZWQgcmVndWxhdG9yICVzXG4iLAotCQkJCSBzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5zdXBwbHkpOwotCX0KLQotCXdoaWxlIChyZXQgJiYgLS1pKQotCQlpZiAoIXBkYXRhLT5yZWd1bGF0b3JbaV0ub25kZW1hbmQpCi0JCQlyZWd1bGF0b3JfZGlzYWJsZShzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5jb25zdW1lcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FubGdfY2RjX2Rpc2FibGVfc3VwcGxpZXMoc3RydWN0IHNkbTY2MF9jZGNfcHJpdiAqc2RtNjYwX2NkYywKLQkJCQkgICAgIHN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSkKLXsKLQlpbnQgaTsKLQotCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzLAotCQkJICAgICAgIHNkbTY2MF9jZGMtPnN1cHBsaWVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2RtNjYwX2NkYy0+bnVtX29mX3N1cHBsaWVzOyBpKyspIHsKLQkJaWYgKHJlZ3VsYXRvcl9jb3VudF92b2x0YWdlcygKLQkJCQlzZG02NjBfY2RjLT5zdXBwbGllc1tpXS5jb25zdW1lcikgPD0gMCkKLQkJCWNvbnRpbnVlOwotCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXIsIDAsCi0JCQkJcGRhdGEtPnJlZ3VsYXRvcltpXS5tYXhfdXYpOwotCQlyZWd1bGF0b3Jfc2V0X2xvYWQoc2RtNjYwX2NkYy0+c3VwcGxpZXNbaV0uY29uc3VtZXIsIDApOwotCX0KLQlyZWd1bGF0b3JfYnVsa19mcmVlKHNkbTY2MF9jZGMtPm51bV9vZl9zdXBwbGllcywKLQkJCSAgICBzZG02NjBfY2RjLT5zdXBwbGllcyk7Ci0Ja2ZyZWUoc2RtNjYwX2NkYy0+c3VwcGxpZXMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzZG02NjBfY29kZWNfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20scG1pYy1hbmFsb2ctY29kZWMiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIHZvaWQgbXNtX2FubGdfYWRkX2NoaWxkX2RldmljZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgKnBkYXRhOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCXN0cnVjdCBtc21fZGlnX2N0cmxfZGF0YSAqZGlnX2N0cmxfZGF0YSA9IE5VTEwsICp0ZW1wOwotCWludCByZXQsIGN0cmxfbnVtID0gMDsKLQlzdHJ1Y3QgbXNtX2RpZ19jdHJsX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhOwotCWNoYXIgcGxhdF9kZXZfbmFtZVtNU01fRElHX0NEQ19TVFJJTkdfTEVOXTsKLQotCXBkYXRhID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzZG02NjBfY2RjX3ByaXYsCi0JCQkgICAgIG1zbV9hbmxnX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCWlmICghcGRhdGEpIHsKLQkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBwZGF0YSBkb2VzIG5vdCBleGlzdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoIXBkYXRhLT5kZXYtPm9mX25vZGUpIHsKLQkJZGV2X2VycihwZGF0YS0+ZGV2LAotCQkJIiVzOiBEVCBub2RlIGZvciBwZGF0YSBkb2VzIG5vdCBleGlzdFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcGxhdGRhdGEgPSAmcGRhdGEtPmRpZ19wbGF0X2RhdGE7Ci0KLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBkYXRhLT5kZXYtPm9mX25vZGUsIG5vZGUpIHsKLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgIm1zbS1kaWctY29kZWMiKSkKLQkJCXN0cmxjcHkocGxhdF9kZXZfbmFtZSwgIm1zbV9kaWdpdGFsX2NvZGVjIiwKLQkJCQkoTVNNX0RJR19DRENfU1RSSU5HX0xFTiAtIDEpKTsKLQkJZWxzZQotCQkJY29udGludWU7Ci0KLQkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhwbGF0X2Rldl9uYW1lLCAtMSk7Ci0JCWlmICghcGRldikgewotCQkJZGV2X2VycihwZGF0YS0+ZGV2LCAiJXM6IHBkZXYgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJcGRldi0+ZGV2LnBhcmVudCA9IHBkYXRhLT5kZXY7Ci0JCXBkZXYtPmRldi5vZl9ub2RlID0gbm9kZTsKLQotCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAibXNtLWRpZy1jb2RlYyIpKSB7Ci0JCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgcGxhdGRhdGEsCi0JCQkJCQkgICAgICAgc2l6ZW9mKCpwbGF0ZGF0YSkpOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkJIiVzOiBjYW5ub3QgYWRkIHBsYXQgZGF0YSBjdHJsOiVkXG4iLAotCQkJCQlfX2Z1bmNfXywgY3RybF9udW0pOwotCQkJCWdvdG8gZmFpbF9wZGV2X2FkZDsKLQkJCX0KLQkJfQotCi0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiJXM6IENhbm5vdCBhZGQgcGxhdGZvcm0gZGV2aWNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbF9wZGV2X2FkZDsKLQkJfQotCi0JCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJtc20tZGlnLWNvZGVjIikpIHsKLQkJCXRlbXAgPSBrcmVhbGxvYyhkaWdfY3RybF9kYXRhLAotCQkJCQkoY3RybF9udW0gKyAxKSAqIHNpemVvZigKLQkJCQkJc3RydWN0IG1zbV9kaWdfY3RybF9kYXRhKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXRlbXApIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGlnX2N0cmxfZGF0YSA9IHRlbXA7Ci0JCQlkaWdfY3RybF9kYXRhW2N0cmxfbnVtXS5kaWdfcGRldiA9IHBkZXY7Ci0JCQljdHJsX251bSsrOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJCSIlczogQWRkZWQgZGlnaXRhbCBjb2RlYyBkZXZpY2UocylcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcGRhdGEtPmRpZ19jdHJsX2RhdGEgPSBkaWdfY3RybF9kYXRhOwotCQl9Ci0JfQotCi0JcmV0dXJuOwotZmFpbF9wZGV2X2FkZDoKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotZXJyOgotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBtc21fYW5sZ19jZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0gTlVMTDsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wZGF0YSAqcGRhdGE7Ci0JaW50IGFkc3Bfc3RhdGU7Ci0KLQlhZHNwX3N0YXRlID0gYXByX2dldF9zdWJzeXNfc3RhdGUoKTsKLQlpZiAoYWRzcF9zdGF0ZSAhPSBBUFJfU1VCU1lTX0xPQURFRCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBZHNwIGlzIG5vdCBsb2FkZWQgeWV0ICVkXG4iLAotCQkJYWRzcF9zdGF0ZSk7Ci0JCXJldHVybiAtRVBST0JFX0RFRkVSOwotCX0KLQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgdHJ1ZSk7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6UGxhdGZvcm0gZGF0YSBmcm9tIGRldmljZSB0cmVlXG4iLAotCQkJX19mdW5jX18pOwotCQlwZGF0YSA9IG1zbV9hbmxnX2NkY19wb3B1bGF0ZV9kdF9wZGF0YSgmcGRldi0+ZGV2KTsKLQkJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczpQbGF0Zm9ybSBkYXRhIGZyb20gYm9hcmQgZmlsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQl9Ci0JaWYgKHBkYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6UGxhdGZvcm0gZGF0YSBmYWlsZWQgdG8gcG9wdWxhdGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gcnRuOwotCX0KLQlzZG02NjBfY2RjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2KSwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmIChzZG02NjBfY2RjID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBydG47Ci0JfQotCi0Jc2RtNjYwX2NkYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQlyZXQgPSBtc21fYW5sZ19jZGNfaW5pdF9zdXBwbGllcyhzZG02NjBfY2RjLCBwZGF0YSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbCB0byBlbmFibGUgQ29kZWMgc3VwcGxpZXNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gcnRuOwotCX0KLQlyZXQgPSBtc21fYW5sZ19jZGNfZW5hYmxlX3N0YXRpY19zdXBwbGllcyhzZG02NjBfY2RjLCBwZGF0YSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IEZhaWwgdG8gZW5hYmxlIENvZGVjIHByZS1yZXNldCBzdXBwbGllc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBydG47Ci0JfQotCS8qIEFsbG93IHN1cHBsaWVzIHRvIGJlIHJlYWR5ICovCi0JdXNsZWVwX3JhbmdlKDUsIDYpOwotCi0Jd2NkOXh4eF9zcG1pX3NldF9kZXYocGRldiwgMCk7Ci0Jd2NkOXh4eF9zcG1pX3NldF9kZXYocGRldiwgMSk7Ci0JaWYgKHdjZDl4eHhfc3BtaV9pcnFfaW5pdCgpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogaXJxIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogaXJxIGluaXRpYWxpemF0aW9uIHBhc3NlZFxuIiwgX19mdW5jX18pOwotCX0KLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgc2RtNjYwX2NkYyk7Ci0KLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsCi0JCQkJICAgICAmc29jX2NvZGVjX2Rldl9zZG02NjBfY2RjLAotCQkJCSAgICAgbXNtX2FubGdfY2RjX2kyc19kYWksCi0JCQkJICAgICBBUlJBWV9TSVpFKG1zbV9hbmxnX2NkY19pMnNfZGFpKSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6c25kX3NvY19yZWdpc3Rlcl9jb2RlYyBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9zdXBwbGllczsKLQl9Ci0JQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZzZG02NjBfY2RjLT5ub3RpZmllcik7Ci0JQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZzZG02NjBfY2RjLT5ub3RpZmllcl9tYmhjKTsKLQotCXNkbTY2MF9jZGMtPmRpZ19wbGF0X2RhdGEuaGFuZGxlID0gKHZvaWQgKikgc2RtNjYwX2NkYzsKLQlzZG02NjBfY2RjLT5kaWdfcGxhdF9kYXRhLnVwZGF0ZV9jbGtkaXYgPSB1cGRhdGVfY2xrZGl2OwotCXNkbTY2MF9jZGMtPmRpZ19wbGF0X2RhdGEuZ2V0X2NkY192ZXJzaW9uID0gZ2V0X2NkY192ZXJzaW9uOwotCXNkbTY2MF9jZGMtPmRpZ19wbGF0X2RhdGEucmVnaXN0ZXJfbm90aWZpZXIgPQotCQkJCQltc21fYW5sZ19jZGNfZGlnX3JlZ2lzdGVyX25vdGlmaWVyOwotCUlOSVRfV09SSygmc2RtNjYwX2NkYy0+bXNtX2FubGdfYWRkX2NoaWxkX2RldmljZXNfd29yaywKLQkJICBtc21fYW5sZ19hZGRfY2hpbGRfZGV2aWNlcyk7Ci0Jc2NoZWR1bGVfd29yaygmc2RtNjYwX2NkYy0+bXNtX2FubGdfYWRkX2NoaWxkX2RldmljZXNfd29yayk7Ci0KLQlyZXR1cm4gcmV0OwotZXJyX3N1cHBsaWVzOgotCW1zbV9hbmxnX2NkY19kaXNhYmxlX3N1cHBsaWVzKHNkbTY2MF9jZGMsIHBkYXRhKTsKLXJ0bjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hbmxnX2NkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc2RtNjYwX2NkY19wcml2ICpzZG02NjBfY2RjID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhICpwZGF0YSA9IHNkbTY2MF9jZGMtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKLQltc21fYW5sZ19jZGNfZGlzYWJsZV9zdXBwbGllcyhzZG02NjBfY2RjLCBwZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9hbmxnX2NvZGVjX2RyaXZlciA9IHsKLQkuZHJpdmVyCQk9IHsKLQkJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JCS5uYW1lICAgICAgICAgICA9IERSVl9OQU1FLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc2RtNjYwX2NvZGVjX29mX21hdGNoKQotCX0sCi0JLnByb2JlICAgICAgICAgID0gbXNtX2FubGdfY2RjX3Byb2JlLAotCS5yZW1vdmUgICAgICAgICA9IG1zbV9hbmxnX2NkY19yZW1vdmUsCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtc21fYW5sZ19jb2RlY19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBdWRpbyBBbmFsb2cgY29kZWMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvbXNtLWFuYWxvZy1jZGMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tYW5hbG9nLWNkYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYzNTY1Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tYW5hbG9nLWNkYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIE1TTV9BTkFMT0dfQ0RDX0gKLSNkZWZpbmUgTVNNX0FOQUxPR19DRENfSAotCi0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvamFjay5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSAiLi4vd2NkLW1iaGMtdjIuaCIKLSNpbmNsdWRlICIuLi93Y2RjYWwtaHdkZXAuaCIKLSNpbmNsdWRlICJzZG02NjAtY2RjLXJlZ2lzdGVycy5oIgotCi0jZGVmaW5lIE1JQ0JJQVNfRVhUX0JZUF9DQVAgMHgwMAotI2RlZmluZSBNSUNCSUFTX05PX0VYVF9CWVBfQ0FQIDB4MDEKLQotI2RlZmluZSBNU004OVhYX05VTV9JUlFfUkVHUwkyCi0jZGVmaW5lIE1BWF9SRUdVTEFUT1IJCTcKLSNkZWZpbmUgTVNNODlYWF9SRUdfVkFMKHJlZywgdmFsKQl7cmVnLCAwLCB2YWx9Ci0KLSNkZWZpbmUgTVNNODlYWF9WRERfU1BLRFJWX05BTUUgImNkYy12ZGQtc3BrZHJ2IgotCi0jZGVmaW5lIERFRkFVTFRfTVVMVElQTElFUiA4MDAKLSNkZWZpbmUgREVGQVVMVF9HQUlOIDkKLSNkZWZpbmUgREVGQVVMVF9PRkZTRVQgMTAwCi0KLWV4dGVybiBjb25zdCB1OCBtc204OXh4X3BtaWNfY2RjX3JlZ19yZWFkYWJsZVtNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkVdOwotZXh0ZXJuIGNvbnN0IHU4IG1zbTg5eHhfY2RjX2NvcmVfcmVnX3JlYWRhYmxlW01TTTg5WFhfQ0RDX0NPUkVfQ0FDSEVfU0laRV07Ci1leHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgbXNtODl4eF9jZGNfY29yZV9yZWdtYXBfY29uZmlnOwotZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIG1zbTg5eHhfcG1pY19jZGNfcmVnbWFwX2NvbmZpZzsKLQotZW51bSB3Y2RfY3Vycl9yZWYgewotCUlfaDRfVUEgPSAwLAotCUlfcHQ1X1VBLAotCUlfMTRfVUEsCi0JSV9sNF9VQSwKLQlJXzFfVUEsCi19OwotCi1lbnVtIHdjZF9tYmhjX2ltcF9kZXRfcGluIHsKLQlXQ0RfTUJIQ19ERVRfTk9ORSA9IDAsCi0JV0NEX01CSENfREVUX0hQSEwsCi0JV0NEX01CSENfREVUX0hQSFIsCi0JV0NEX01CSENfREVUX0JPVEgsCi19OwotCi0KLS8qIEVhY2ggbWljYmlhcyBjYW4gYmUgYXNzaWduZWQgdG8gb25lIG9mIHRocmVlIGNmaWx0ZXJzCi0gKiBWYmF0dF9taW4gPj0gLjE1ViArIGxkb2hfdgotICogbGRvaF92ID49IC4xNXYgKyBjZmlsdHhfbXYKLSAqIElmIGxkb2hfdiA9IDEuOTUgMTYwIG12IDwgY2ZpbHR4X212IDwgMTgwMCBtdgotICogSWYgbGRvaF92ID0gMi4zNSAyMDAgbXYgPCBjZmlsdHhfbXYgPCAyMjAwIG12Ci0gKiBJZiBsZG9oX3YgPSAyLjc1IDI0MCBtdiA8IGNmaWx0eF9tdiA8IDI2MDAgbXYKLSAqIElmIGxkb2hfdiA9IDIuODUgMjUwIG12IDwgY2ZpbHR4X212IDwgMjcwMCBtdgotICovCi0KLXN0cnVjdCB3Y2RfbWljYmlhc19zZXR0aW5nIHsKLQl1OCBsZG9oX3Y7Ci0JdTMyIGNmaWx0MV9tdjsgLyogaW4gbXYgKi8KLQl1MzIgY2ZpbHQyX212OyAvKiBpbiBtdiAqLwotCXUzMiBjZmlsdDNfbXY7IC8qIGluIG12ICovCi0JLyogRGlmZmVyZW50IFdDRDl4eHggc2VyaWVzIGNvZGVjcyBtYXkgbm90Ci0JICogaGF2ZSA0IG1pYyBiaWFzZXMuIElmIGEgY29kZWMgaGFzIGZld2VyCi0JICogbWljIGJpYXNlcywgc29tZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwKLQkgKiBub3QgYmUgdXNlZC4KLQkgKi8KLQl1OCBiaWFzMV9jZmlsdF9zZWw7Ci0JdTggYmlhczJfY2ZpbHRfc2VsOwotCXU4IGJpYXMzX2NmaWx0X3NlbDsKLQl1OCBiaWFzNF9jZmlsdF9zZWw7Ci0JdTggYmlhczFfY2FwX21vZGU7Ci0JdTggYmlhczJfY2FwX21vZGU7Ci0JdTggYmlhczNfY2FwX21vZGU7Ci0JdTggYmlhczRfY2FwX21vZGU7Ci0JYm9vbCBiaWFzMl9pc19oZWFkc2V0X29ubHk7Ci19OwotCi1lbnVtIHNkbTY2MF9jZGNfcGlkX2N1cnJlbnQgewotCU1TTTg5WFhfUElEX01JQ18yUDVfVUEsCi0JTVNNODlYWF9QSURfTUlDXzVfVUEsCi0JTVNNODlYWF9QSURfTUlDXzEwX1VBLAotCU1TTTg5WFhfUElEX01JQ18yMF9VQSwKLX07Ci0KLXN0cnVjdCBzZG02NjBfY2RjX3JlZ19tYXNrX3ZhbCB7Ci0JdTE2CXJlZzsKLQl1OAltYXNrOwotCXU4CXZhbDsKLX07Ci0KLWVudW0gewotCS8qIElOVFJfUkVHIDAgLSBEaWdpdGFsIFBlcmlwaCAqLwotCU1TTTg5WFhfSVJRX1NQS1JfQ05QID0gMCwKLQlNU004OVhYX0lSUV9TUEtSX0NMSVAsCi0JTVNNODlYWF9JUlFfU1BLUl9PQ1AsCi0JTVNNODlYWF9JUlFfTUJIQ19JTlNSRU1fREVUMSwKLQlNU004OVhYX0lSUV9NQkhDX1JFTEVBU0UsCi0JTVNNODlYWF9JUlFfTUJIQ19QUkVTUywKLQlNU004OVhYX0lSUV9NQkhDX0lOU1JFTV9ERVQsCi0JTVNNODlYWF9JUlFfTUJIQ19IU19ERVQsCi0JLyogSU5UUl9SRUcgMSAtIEFuYWxvZyBQZXJpcGggKi8KLQlNU004OVhYX0lSUV9FQVJfT0NQLAotCU1TTTg5WFhfSVJRX0hQSFJfT0NQLAotCU1TTTg5WFhfSVJRX0hQSExfT0NQLAotCU1TTTg5WFhfSVJRX0VBUl9DTlAsCi0JTVNNODlYWF9JUlFfSFBIUl9DTlAsCi0JTVNNODlYWF9JUlFfSFBITF9DTlAsCi0JTVNNODlYWF9OVU1fSVJRUywKLX07Ci0KLWVudW0gewotCU9OX0RFTUFORF9NSUNCSUFTID0gMCwKLQlPTl9ERU1BTkRfU1BLRFJWLAotCU9OX0RFTUFORF9TVVBQTElFU19NQVgsCi19OwotCi0vKgotICogVGhlIGRlbGF5IGxpc3QgaXMgcGVyIGNvZGVjIEhXIHNwZWNpZmljYXRpb24uCi0gKiBQbGVhc2UgYWRkIGRlbGF5IGluIHRoZSBsaXN0IGluIHRoZSBmdXR1cmUgaW5zdGVhZAotICogb2YgbWFnaWMgbnVtYmVyCi0gKi8KLWVudW0gewotCUNPREVDX0RFTEFZXzFfTVMgPSAxMDAwLAotCUNPREVDX0RFTEFZXzFfMV9NUyAgPSAxMTAwLAotfTsKLQotc3RydWN0IHNkbTY2MF9jZGNfcmVndWxhdG9yIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCBtaW5fdXY7Ci0JaW50IG1heF91djsKLQlpbnQgb3B0aW11bV91YTsKLQlib29sIG9uZGVtYW5kOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKLX07Ci0KLXN0cnVjdCBvbl9kZW1hbmRfc3VwcGx5IHsKLQlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHk7Ci0JYXRvbWljX3QgcmVmOwotCWludCBtaW5fdXY7Ci0JaW50IG1heF91djsKLQlpbnQgb3B0aW11bV91YTsKLX07Ci0KLXN0cnVjdCB3Y2RfaW1wZWRfaV9yZWYgewotCWVudW0gd2NkX2N1cnJfcmVmIGN1cnJfcmVmOwotCWludCBtaW5fdmFsOwotCWludCBtdWx0aXBsaWVyOwotCWludCBnYWluX2FkajsKLQlpbnQgb2Zmc2V0OwotfTsKLQotZW51bSBzZG02NjBfY2RjX21pY2JpYXNfbnVtIHsKLQlNU004OVhYX01JQ0JJQVMxID0gMCwKLX07Ci0KLS8qIEhvbGQgaW5zdGFuY2UgdG8gZGlnaXRhbCBjb2RlYyBwbGF0Zm9ybSBkZXZpY2UgKi8KLXN0cnVjdCBtc21fZGlnX2N0cmxfZGF0YSB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGlnX3BkZXY7Ci19OwotCi1zdHJ1Y3QgbXNtX2RpZ19jdHJsX3BsYXRmb3JtX2RhdGEgewotCXZvaWQgKmhhbmRsZTsKLQl2b2lkICgqdXBkYXRlX2Nsa2Rpdikodm9pZCAqaGFuZGxlLCBpbnQgdmFsKTsKLQlpbnQgKCpnZXRfY2RjX3ZlcnNpb24pKHZvaWQgKmhhbmRsZSk7Ci0JaW50ICgqcmVnaXN0ZXJfbm90aWZpZXIpKHZvaWQgKmhhbmRsZSwKLQkJCQkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2ssCi0JCQkJIGJvb2wgZW5hYmxlKTsKLX07Ci0KLXN0cnVjdCBzZG02NjBfY2RjX3ByaXYgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1MzIgbnVtX29mX3N1cHBsaWVzOwotCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllczsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IG1zbV9hbmxnX2FkZF9jaGlsZF9kZXZpY2VzX3dvcms7Ci0Jc3RydWN0IG1zbV9kaWdfY3RybF9wbGF0Zm9ybV9kYXRhIGRpZ19wbGF0X2RhdGE7Ci0JLyogZGlnaXRhbCBjb2RlYyBkYXRhIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBtc21fZGlnX2N0cmxfZGF0YSAqZGlnX2N0cmxfZGF0YTsKLQlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBub3RpZmllcjsKLQl1MTYgcG1pY19yZXY7Ci0JdTE2IGNvZGVjX3ZlcnNpb247Ci0JdTE2IGFuYWxvZ19tYWpvcl9yZXY7Ci0JdTMyIGJvb3N0X3ZvbHRhZ2U7Ci0JdTMyIGFkY19jb3VudDsKLQl1MzIgcnhfYmlhc19jb3VudDsKLQlib29sIGludF9tY2xrMF9lbmFibGVkOwotCXUxNiBib29zdF9vcHRpb247Ci0JLyogbW9kZSB0byBzZWxlY3QgaGQyICovCi0JdTMyIGhwaF9tb2RlOwotCS8qIGNvbXBhbmRlciB1c2VkIGZvciBlYWNoIHJ4IGNoYWluICovCi0JYm9vbCBzcGtfYm9vc3Rfc2V0OwotCWJvb2wgZWFyX3BhX2Jvb3N0X3NldDsKLQlib29sIGV4dF9zcGtfYm9vc3Rfc2V0OwotCXN0cnVjdCBvbl9kZW1hbmRfc3VwcGx5IG9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9TVVBQTElFU19NQVhdOwotCXN0cnVjdCByZWd1bGF0b3IgKnNwa2Rydl9yZWc7Ci0Jc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgbm90aWZpZXJfbWJoYzsKLQkvKiBtYmhjIG1vZHVsZSAqLwotCXN0cnVjdCB3Y2RfbWJoYyBtYmhjOwotCS8qIGNhbCBpbmZvIGZvciBjb2RlYyAqLwotCXN0cnVjdCBmd19pbmZvICpmd19kYXRhOwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBhdWRpb19zc3JfbmI7Ci0JaW50ICgqY29kZWNfc3BrX2V4dF9wYV9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlKTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1c19tYXNrOwotCXN0cnVjdCB3Y2RfaW1wZWRfaV9yZWYgaW1wZWRfaV9yZWY7Ci0JZW51bSB3Y2RfbWJoY19pbXBfZGV0X3BpbiBpbXBlZF9kZXRfcGluOwotCS8qIEVudHJ5IGZvciB2ZXJzaW9uIGluZm8gKi8KLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKLX07Ci0KLXN0cnVjdCBzZG02NjBfY2RjX3BkYXRhIHsKLQlzdHJ1Y3Qgd2NkX21pY2JpYXNfc2V0dGluZyBtaWNiaWFzOwotCXN0cnVjdCBzZG02NjBfY2RjX3JlZ3VsYXRvciByZWd1bGF0b3JbTUFYX1JFR1VMQVRPUl07Ci19OwotCi0KLWV4dGVybiBpbnQgbXNtX2FubGdfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgaW50IG1jbGtfZW5hYmxlLCBib29sIGRhcG0pOwotCi1leHRlcm4gaW50IG1zbV9hbmxnX2NkY19oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpOwotCi1leHRlcm4gdm9pZCBtc21fYW5sZ19jZGNfaHNfZGV0ZWN0X2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLQotZXh0ZXJuIHZvaWQgc2RtNjYwX2NkY191cGRhdGVfaW50X3Nwa19ib29zdChib29sIGVuYWJsZSk7Ci0KLWV4dGVybiB2b2lkIG1zbV9hbmxnX2NkY19zcGtfZXh0X3BhX2NiKAotCQlpbnQgKCpjb2RlY19zcGtfZXh0X3BhKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCWludCBlbmFibGUpLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotaW50IG1zbV9hbmxnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL21zbS1jZGMtY29tbW9uLmggYi9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvbXNtLWNkYy1jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0OTBhNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvbXNtLWNkYy1jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlICJzZG02NjAtY2RjLXJlZ2lzdGVycy5oIgotCi1leHRlcm4gc3RydWN0IHJlZ19kZWZhdWx0Ci0JCW1zbTg5eHhfY2RjX2NvcmVfZGVmYXVsdHNbTVNNODlYWF9DRENfQ09SRV9DQUNIRV9TSVpFXTsKLWV4dGVybiBzdHJ1Y3QgcmVnX2RlZmF1bHQKLQkJbXNtODl4eF9wbWljX2NkY19kZWZhdWx0c1tNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkVdOwotCi1ib29sIG1zbTg5eHhfY2RjX2NvcmVfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZyk7Ci1ib29sIG1zbTg5eHhfY2RjX2NvcmVfd3JpdGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpOwotYm9vbCBtc204OXh4X2NkY19jb3JlX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpOwotCi1lbnVtIHsKLQlBSUYxX1BCID0gMCwKLQlBSUYxX0NBUCwKLQlBSUYyX1ZJRkVFRCwKLQlBSUYzX1NWQSwKLQlOVU1fQ09ERUNfREFJUywKLX07Ci0KLWVudW0gY29kZWNfdmVyc2lvbnMgewotCVRPTUJBS18xXzAsCi0JVE9NQkFLXzJfMCwKLQlDT05HQSwKLQlDQUpPTiwKLQlDQUpPTl8yXzAsCi0JRElBTkdVLAotCURSQVhfQ0RDLAotCVVOU1VQUE9SVEVELAotfTsKLQotLyogU3VwcG9ydCBkaWZmZXJlbnQgaHBoIG1vZGVzICovCi1lbnVtIHsKLQlOT1JNQUxfTU9ERSA9IDAsCi0JSEQyX01PREUsCi19OwotCi1lbnVtIGRpZ19jZGNfbm90aWZ5X2V2ZW50IHsKLQlESUdfQ0RDX0VWRU5UX0lOVkFMSUQsCi0JRElHX0NEQ19FVkVOVF9DTEtfT04sCi0JRElHX0NEQ19FVkVOVF9DTEtfT0ZGLAotCURJR19DRENfRVZFTlRfUlgxX01VVEVfT04sCi0JRElHX0NEQ19FVkVOVF9SWDFfTVVURV9PRkYsCi0JRElHX0NEQ19FVkVOVF9SWDJfTVVURV9PTiwKLQlESUdfQ0RDX0VWRU5UX1JYMl9NVVRFX09GRiwKLQlESUdfQ0RDX0VWRU5UX1JYM19NVVRFX09OLAotCURJR19DRENfRVZFTlRfUlgzX01VVEVfT0ZGLAotCURJR19DRENfRVZFTlRfUFJFX1JYMV9JTlRfT04sCi0JRElHX0NEQ19FVkVOVF9QUkVfUlgyX0lOVF9PTiwKLQlESUdfQ0RDX0VWRU5UX1BPU1RfUlgxX0lOVF9PRkYsCi0JRElHX0NEQ19FVkVOVF9QT1NUX1JYMl9JTlRfT0ZGLAotCURJR19DRENfRVZFTlRfU1NSX0RPV04sCi0JRElHX0NEQ19FVkVOVF9TU1JfVVAsCi0JRElHX0NEQ19FVkVOVF9MQVNULAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tZGlnaXRhbC1jZGMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tZGlnaXRhbC1jZGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwYTEwNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvbXNtLWRpZ2l0YWwtY2RjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTg5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSAic2RtNjYwLWNkYy1yZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJtc20tZGlnaXRhbC1jZGMuaCIKLSNpbmNsdWRlICJtc20tY2RjLWNvbW1vbi5oIgotI2luY2x1ZGUgIi4uLy4uL21zbS9zZG02NjAtY29tbW9uLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJtc21fZGlnaXRhbF9jb2RlYyIKLSNkZWZpbmUgTUNMS19SQVRFXzlQNk1IWiAgICAgICAgOTYwMDAwMAotI2RlZmluZSBNQ0xLX1JBVEVfMTJQMjg4TUhaICAgICAxMjI4ODAwMAotI2RlZmluZSBUWF9NVVhfQ1RMX0NVVF9PRkZfRlJFUV9NQVNLCTB4MzAKLSNkZWZpbmUgQ0ZfTUlOXzNEQl80SFoJCQkweDAKLSNkZWZpbmUgQ0ZfTUlOXzNEQl83NUhaCQkJMHgxCi0jZGVmaW5lIENGX01JTl8zREJfMTUwSFoJCTB4MgotCi0jZGVmaW5lIE1TTV9ESUdfQ0RDX1ZFUlNJT05fRU5UUllfU0laRSAzMgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByeF9kaWdpdGFsX2dhaW5fcmVnW10gPSB7Ci0JTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVEwsCi0JTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMl9DVEwsCi0JTVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMl9DVEwsCi19OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9kaWdpdGFsX2dhaW5fcmVnW10gPSB7Ci0JTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9HQUlOLAotCU1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfR0FJTiwKLQlNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU4sCi0JTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9HQUlOLAotCU1TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfR0FJTiwKLX07Ci0KLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX2dhaW4sIDAsIDEsIDApOwotCi1zdHJ1Y3Qgc25kX3NvY19jb2RlYyAqcmVnaXN0ZXJlZF9kaWdjb2RlYzsKLXN0cnVjdCBocGZfd29yayB0eF9ocGZfd29ya1tOVU1fREVDSU1BVE9SU107Ci0KLS8qIENvZGVjIHN1cHBvcnRzIDIgSUlSIGZpbHRlcnMgKi8KLWVudW0gewotCUlJUjEgPSAwLAotCUlJUjIsCi0JSUlSX01BWCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ2NkY19jbG9ja19jb250cm9sKGJvb2wgZmxhZykKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9kaWdfcHJpdiAqbXNtX2RpZ19jZGMgPQotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEocmVnaXN0ZXJlZF9kaWdjb2RlYyk7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShyZWdpc3RlcmVkX2RpZ2NvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0KLQlpZiAoZmxhZykgewotCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSA9PSBmYWxzZSkgewotCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7Ci0JCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAotCQkJCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6ZmFpbGVkIHRvIGVuYWJsZSB0aGUgTUNMS1xuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCS8qCi0JCQkJICogQXZvaWQgYWNjZXNzIHRvIGxwYXNzIHJlZ2lzdGVyCi0JCQkJICogYXMgY2xvY2sgZW5hYmxlIGZhaWxlZCBkdXJpbmcgU1NSLgotCQkJCSAqLwotCQkJCWlmIChyZXQgPT0gLUVOT0RFVikKLQkJCQkJbXNtX2RpZ19jZGMtPnJlZ21hcC0+Y2FjaGVfb25seSA9IHRydWU7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJCXByX2RlYnVnKCJlbmFibGVkIGRpZ2l0YWwgY29kZWMgY29yZSBjbGtcbiIpOwotCQkJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkLCB0cnVlKTsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGRhdGEtPmRpc2FibGVfaW50X21jbGswX3dvcmssCi0JCQkJCSAgICAgIDUwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW11dGV4X3VubG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOwotCQlkZXZfZGJnKHJlZ2lzdGVyZWRfZGlnY29kZWMtPmRldiwKLQkJCSJkaXNhYmxlIE1DTEssIHdvcmtxIHRvIGRpc2FibGUgc2V0IGFscmVhZHlcbiIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2RpZ2l0YWxfY2FsbGJhY2sodm9pZCAqZmxhZykKLXsKLQltc21fZGlnY2RjX2Nsb2NrX2NvbnRyb2wodHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfZGlnaXRhbF9jYWxsYmFjayh2b2lkICpmbGFnKQotewotCW1zbV9kaWdjZGNfY2xvY2tfY29udHJvbChmYWxzZSk7Ci0JcHJfZGVidWcoImRpc2FibGUgbWNsayBoYXBwZW5zIGluIHdvcmtxXG4iKTsKLX0KLQotc3RhdGljIGludCBtc21fZGlnX2NkY19wdXRfZGVjX2VudW0oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3ID0gc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgZGVjX211eCwgZGVjaW1hdG9yOwotCWNoYXIgKmRlY19uYW1lID0gTlVMTDsKLQljaGFyICp3aWRnZXRfbmFtZSA9IE5VTEw7Ci0JY2hhciAqdGVtcDsKLQl1MTYgdHhfbXV4X2N0bF9yZWc7Ci0JdTggYWRjX2RtaWNfc2VsID0gMHgwOwotCWludCByZXQgPSAwOwotCWNoYXIgKmRlY19udW07Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IGUtPml0ZW1zKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGVudW0gdmFsdWU6ICVkXG4iLAotCQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGVjX211eCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0KLQl3aWRnZXRfbmFtZSA9IGtzdHJuZHVwKHctPm5hbWUsIDE1LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdpZGdldF9uYW1lKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBmYWlsZWQgdG8gY29weSBzdHJpbmdcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl0ZW1wID0gd2lkZ2V0X25hbWU7Ci0KLQlkZWNfbmFtZSA9IHN0cnNlcCgmd2lkZ2V0X25hbWUsICIgIik7Ci0Jd2lkZ2V0X25hbWUgPSB0ZW1wOwotCWlmICghZGVjX25hbWUpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgdy0+bmFtZSk7Ci0JCXJldCA9ICAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkZWNfbnVtID0gc3RycGJyayhkZWNfbmFtZSwgIjEyMzQ1Iik7Ci0JaWYgKGRlY19udW0gPT0gTlVMTCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBERUMgc2VsZWN0ZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdWludChkZWNfbnVtLCAxMCwgJmRlY2ltYXRvcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgZGVjX25hbWUpOwotCQlyZXQgPSAgLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2X2RiZyh3LT5kYXBtLT5kZXYsICIlcygpOiB3aWRnZXQgPSAlcyBkZWNpbWF0b3IgPSAldSBkZWNfbXV4ID0gJXVcbiIKLQkJLCBfX2Z1bmNfXywgdy0+bmFtZSwgZGVjaW1hdG9yLCBkZWNfbXV4KTsKLQotCXN3aXRjaCAoZGVjaW1hdG9yKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQljYXNlIDM6Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJaWYgKChkZWNfbXV4ID09IDQpIHx8IChkZWNfbXV4ID09IDUpIHx8Ci0JCSAgICAoZGVjX211eCA9PSA2KSB8fCAoZGVjX211eCA9PSA3KSkKLQkJCWFkY19kbWljX3NlbCA9IDB4MTsKLQkJZWxzZQotCQkJYWRjX2RtaWNfc2VsID0gMHgwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBEZWNpbWF0b3IgPSAldVxuIiwKLQkJCV9fZnVuY19fLCBkZWNpbWF0b3IpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0eF9tdXhfY3RsX3JlZyA9Ci0JCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwgKyAzMiAqIChkZWNpbWF0b3IgLSAxKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDEsIGFkY19kbWljX3NlbCk7Ci0KLQlyZXQgPSBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKGtjb250cm9sLCB1Y29udHJvbCk7Ci0KLW91dDoKLQlrZnJlZSh3aWRnZXRfbmFtZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX2NvZGVjX2NvbmZpZ19jb21wYW5kZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgICBpbnQgaW50ZXJwX24sIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICpkaWdfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgc2hpZnQgJWQsIGVuYWJsZWQgJWRcbiIsCi0JCV9fZnVuY19fLCBldmVudCwgaW50ZXJwX24sCi0JCWRpZ19jZGMtPmNvbXBfZW5hYmxlZFtpbnRlcnBfbl0pOwotCi0JLyogY29tcGFuZGVyIGlzIG5vdCBlbmFibGVkICovCi0JaWYgKCFkaWdfY2RjLT5jb21wX2VuYWJsZWRbaW50ZXJwX25dKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoZGlnX2NkYy0+Y29tcF9lbmFibGVkW2ludGVycF9uXSkgewotCWNhc2UgQ09NUEFOREVSXzE6Ci0JCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7Ci0JCQkvKiBFbmFibGUgQ29tcGFuZGVyIENsb2NrICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjJfQ1RMLCAweDBGLCAweDA5KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMLCAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMV9DVEwsCi0JCQkJMSA8PCBpbnRlcnBfbiwgMSA8PCBpbnRlcnBfbik7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMLCAweEZGLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVEwsIDB4RjAsIDB4NTApOwotCQkJLyogYWRkIHNsZWVwIGZvciBjb21wYW5kZXIgdG8gc2V0dGxlICovCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMLCAweEZGLCAweDI4KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVEwsIDB4RjAsIDB4QjApOwotCi0JCQkvKiBFbmFibGUgQ29tcGFuZGVyIEdQSU8gKi8KLQkJCWlmIChkaWdfY2RjLT5jb2RlY19ocGhfY29tcF9ncGlvKQotCQkJCWRpZ19jZGMtPmNvZGVjX2hwaF9jb21wX2dwaW8oMSwgY29kZWMpOwotCQl9IGVsc2UgaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCQkvKiBEaXNhYmxlIENvbXBhbmRlciBHUElPICovCi0JCQlpZiAoZGlnX2NkYy0+Y29kZWNfaHBoX2NvbXBfZ3BpbykKLQkJCQlkaWdfY2RjLT5jb2RlY19ocGhfY29tcF9ncGlvKDAsIGNvZGVjKTsKLQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IyX0NUTCwgMHgwRiwgMHgwNSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjFfQ1RMLAotCQkJCTEgPDwgaW50ZXJwX24sIDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMl9DVEwsIDB4MDEsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGNvbXBhbmRlciAlZFxuIiwgX19mdW5jX18sCi0JCQkJZGlnX2NkYy0+Y29tcF9lbmFibGVkW2ludGVycF9uXSk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBtc21fZGlnX2NkY19ocGhfY29tcF9jYiAtIHJlZ2lzdGVycyBjYWxsYmFjayB0byBjb2RlYyBieSBtYWNoaW5lIGRyaXZlci4KLSAqCi0gKiBAY29kZWNfaHBoX2NvbXBfZ3BpbzogZnVuY3Rpb24gcG9pbnRlciB0byBzZXQgY29tcCBncGlvIGF0IG1hY2hpbmUgZHJpdmVyCi0gKiBAY29kZWM6IGNvZGVjIHBvaW50ZXIKLSAqCi0gKi8KLXZvaWQgbXNtX2RpZ19jZGNfaHBoX2NvbXBfY2IoCi0JaW50ICgqY29kZWNfaHBoX2NvbXBfZ3BpbykoYm9vbCBlbmFibGUsIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyksCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBtc21fZGlnX3ByaXYgKmRpZ19jZGMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQlkaWdfY2RjLT5jb2RlY19ocGhfY29tcF9ncGlvID0gY29kZWNfaHBoX2NvbXBfZ3BpbzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2RpZ19jZGNfaHBoX2NvbXBfY2IpOwotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCQkgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICptc21fZGlnX2NkYyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7Ci0KLQlpZiAody0+c2hpZnQgPj0gTVNNODlYWF9SWF9NQVggfHwgdy0+c2hpZnQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3cm9uZyBSWCBpbmRleDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgdy0+c2hpZnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQltc21fZGlnX2NkY19jb2RlY19jb25maWdfY29tcGFuZGVyKGNvZGVjLCB3LT5zaGlmdCwgZXZlbnQpOwotCQkvKiBhcHBseSB0aGUgZGlnaXRhbCBnYWluIGFmdGVyIHRoZSBpbnRlcnBvbGF0b3IgaXMgZW5hYmxlZCovCi0JCWlmICgody0+c2hpZnQpIDwgQVJSQVlfU0laRShyeF9kaWdpdGFsX2dhaW5fcmVnKSkKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJICByeF9kaWdpdGFsX2dhaW5fcmVnW3ctPnNoaWZ0XSwKLQkJCQkgIHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQkgIHJ4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnRdKQotCQkJCSAgKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCW1zbV9kaWdfY2RjX2NvZGVjX2NvbmZpZ19jb21wYW5kZXIoY29kZWMsIHctPnNoaWZ0LCBldmVudCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9SRVNFVF9DVEwsCi0JCQkxIDw8IHctPnNoaWZ0LCAxIDw8IHctPnNoaWZ0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX1JFU0VUX0NUTCwKLQkJCTEgPDwgdy0+c2hpZnQsIDB4MCk7Ci0JCS8qCi0JCSAqIGRpc2FibGUgdGhlIG11dGUgZW5hYmxlZCBkdXJpbmcgdGhlIFBNRCBvZiB0aGlzIGRldmljZQotCQkgKi8KLQkJaWYgKCh3LT5zaGlmdCA9PSAwKSAmJgotCQkJKG1zbV9kaWdfY2RjLT5tdXRlX21hc2sgJiBIUEhMX1BBX0RJU0FCTEUpKSB7Ci0JCQlwcl9kZWJ1ZygiZGlzYWJsaW5nIEhQSEwgbXV0ZVxuIik7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTCwgMHgwMSwgMHgwMCk7Ci0JCQltc21fZGlnX2NkYy0+bXV0ZV9tYXNrICY9IH4oSFBITF9QQV9ESVNBQkxFKTsKLQkJfSBlbHNlIGlmICgody0+c2hpZnQgPT0gMSkgJiYKLQkJCQkobXNtX2RpZ19jZGMtPm11dGVfbWFzayAmIEhQSFJfUEFfRElTQUJMRSkpIHsKLQkJCXByX2RlYnVnKCJkaXNhYmxpbmcgSFBIUiBtdXRlXG4iKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMLCAweDAxLCAweDAwKTsKLQkJCW1zbV9kaWdfY2RjLT5tdXRlX21hc2sgJj0gfihIUEhSX1BBX0RJU0FCTEUpOwotCQl9IGVsc2UgaWYgKCh3LT5zaGlmdCA9PSAyKSAmJgotCQkJCShtc21fZGlnX2NkYy0+bXV0ZV9tYXNrICYgU1BLUl9QQV9ESVNBQkxFKSkgewotCQkJcHJfZGVidWcoImRpc2FibGluZyBTUEtSIG11dGVcbiIpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEwsIDB4MDEsIDB4MDApOwotCQkJbXNtX2RpZ19jZGMtPm11dGVfbWFzayAmPSB+KFNQS1JfUEFfRElTQUJMRSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIoCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOwotCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCShzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkgICAgKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVEwgKyA2NCAqIGlpcl9pZHgpKSAmCi0JCSgxIDw8IGJhbmRfaWR4KSkgIT0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCi0JCWlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JLyogTWFzayBmaXJzdCA1IGJpdHMsIDYtOCBhcmUgcmVzZXJ2ZWQgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NUTCArIDY0ICogaWlyX2lkeCksCi0JCQkgICAgKDEgPDwgYmFuZF9pZHgpLCAodmFsdWUgPDwgYmFuZF9pZHgpKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCi0JICBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJKChzbmRfc29jX3JlYWQoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ1RMICsgNjQgKiBpaXJfaWR4KSkgJgotCSAgKDEgPDwgYmFuZF9pZHgpKSAhPSAwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IGdldF9paXJfYmFuZF9jb2VmZihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgaW50IGlpcl9pZHgsIGludCBiYW5kX2lkeCwKLQkJCQkgICBpbnQgY29lZmZfaWR4KQotewotCXVpbnQzMl90IHZhbHVlID0gMDsKLQotCS8qIEFkZHJlc3MgZG9lcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGUgaWYgcmVhZGluZyAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwgKyA2NCAqIGlpcl9pZHgpLAotCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCi0JCSogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKLQotCXZhbHVlIHw9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IyX0NUTCArIDY0ICogaWlyX2lkeCkpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IxX0NUTCArIDY0ICogaWlyX2lkeCksCi0JCSgoYmFuZF9pZHggKiBCQU5EX01BWCArIGNvZWZmX2lkeCkKLQkJKiBzaXplb2YodWludDMyX3QpICsgMSkgJiAweDdGKTsKLQotCXZhbHVlIHw9IChzbmRfc29jX3JlYWQoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwgKyA2NCAqIGlpcl9pZHgpKSA8PCA4KTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwgKyA2NCAqIGlpcl9pZHgpLAotCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCi0JCSogc2l6ZW9mKHVpbnQzMl90KSArIDIpICYgMHg3Rik7Ci0KLQl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAotCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMICsgNjQgKiBpaXJfaWR4KSkgPDwgMTYpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IxX0NUTCArIDY0ICogaWlyX2lkeCksCi0JCSgoYmFuZF9pZHggKiBCQU5EX01BWCArIGNvZWZmX2lkeCkKLQkJKiBzaXplb2YodWludDMyX3QpICsgMykgJiAweDdGKTsKLQotCS8qIE1hc2sgYml0cyB0b3AgMiBiaXRzIHNpbmNlIHRoZXkgYXJlIHJlc2VydmVkICovCi0JdmFsdWUgfD0gKChzbmRfc29jX3JlYWQoY29kZWMsIChNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwKLQkJKyA2NCAqIGlpcl9pZHgpKSAmIDB4M2YpIDw8IDI0KTsKLQotCXJldHVybiB2YWx1ZTsKLQotfQotCi1zdGF0aWMgdm9pZCBzZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCi0JCQkgICAgICAgdWludDMyX3QgdmFsdWUpCi17Ci0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IyX0NUTCArIDY0ICogaWlyX2lkeCksCi0JCSh2YWx1ZSAmIDB4RkYpKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwgKyA2NCAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gOCkgJiAweEZGKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwgKyA2NCAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0KLQkvKiBNYXNrIHRvcCAyIGJpdHMsIDctOCBhcmUgcmVzZXJ2ZWQgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMICsgNjQgKiBpaXJfaWR4KSwKLQkJKHZhbHVlID4+IDI0KSAmIDB4M0YpOwotCi19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAwKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDEpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0KLQkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMik7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAzKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSA9Ci0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDQpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjAgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBiMSA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIyID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTEgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBhMiA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0sCi0JCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JLyogTWFzayB0b3AgYml0IGl0IGlzIHJlc2VydmVkICovCi0JLyogVXBkYXRlcyBhZGRyIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggQjIgd3JpdGUgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMICsgNjQgKiBpaXJfaWR4KSwKLQkJKGJhbmRfaWR4ICogQkFORF9NQVggKiBzaXplb2YodWludDMyX3QpKSAmIDB4N0YpOwotCi0KLQlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkJICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7Ci0Jc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJCSAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdKTsKLQlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkJICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogSUlSICMlZCBiYW5kICMlZCBiMCA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIxID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjIgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBhMSA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGEyID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAwKSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAxKSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAyKSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAzKSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCA0KSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4X2hwZl9jb3JuZXJfZnJlcV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqaHBmX2RlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgaHBmX3dvcmsgKmhwZl93b3JrOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICptc21fZGlnX2NkYzsKLQl1MTYgdHhfbXV4X2N0bF9yZWc7Ci0JdTggaHBmX2N1dF9vZl9mcmVxOwotCi0JaHBmX2RlbGF5ZWRfd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlocGZfd29yayA9IGNvbnRhaW5lcl9vZihocGZfZGVsYXllZF93b3JrLCBzdHJ1Y3QgaHBmX3dvcmssIGR3b3JrKTsKLQljb2RlYyA9IGhwZl93b3JrLT5kaWdfY2RjLT5jb2RlYzsKLQltc21fZGlnX2NkYyA9IGhwZl93b3JrLT5kaWdfY2RjOwotCWhwZl9jdXRfb2ZfZnJlcSA9IGhwZl93b3JrLT50eF9ocGZfY3V0X29mX2ZyZXE7Ci0KLQl0eF9tdXhfY3RsX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwgKwotCQkJKGhwZl93b3JrLT5kZWNpbWF0b3IgLSAxKSAqIDMyOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMoKTogZGVjaW1hdG9yICV1IGhwZl9jdXRfb2ZfZnJlcSAweCV4XG4iLAotCQkgX19mdW5jX18sIGhwZl93b3JrLT5kZWNpbWF0b3IsICh1bnNpZ25lZCBpbnQpaHBmX2N1dF9vZl9mcmVxKTsKLQltc21fZGlnX2NkYy0+dXBkYXRlX2Nsa2Rpdihtc21fZGlnX2NkYy0+aGFuZGxlLCAweDUxKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDMwLCBocGZfY3V0X29mX2ZyZXEgPDwgNCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfY29kZWNfc2V0X2lpcl9nYWluKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlpbnQgdmFsdWUgPSAwLCByZWc7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWlmICh3LT5zaGlmdCA9PSAwKQotCQkJcmVnID0gTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjFfQ1RMOwotCQllbHNlIGlmICh3LT5zaGlmdCA9PSAxKQotCQkJcmVnID0gTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjFfQ1RMOwotCQllbHNlCi0JCQlnb3RvIHJldDsKLQkJdmFsdWUgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgdmFsdWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBldmVudCA9ICVkIG5vdCBleHBlY3RlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQl9Ci1yZXQ6Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfY29tcGFuZGVyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBtc21fZGlnX3ByaXYgKmRpZ19jZGMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgY29tcF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgcnhfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtc21fZGlnX2NkYy0+Y29tcFslZF1fZW5hYmxlZFslZF0gPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjb21wX2lkeCwgcnhfaWR4LAotCQkJZGlnX2NkYy0+Y29tcF9lbmFibGVkW3J4X2lkeF0pOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkaWdfY2RjLT5jb21wX2VuYWJsZWRbcnhfaWR4XTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX2NvbXBhbmRlcl9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICpkaWdfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGNvbXBfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0JaW50IHJ4X2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlpZiAoZGlnX2NkYy0+dmVyc2lvbiA+PSBESUFOR1UpIHsKLQkJaWYgKCF2YWx1ZSkKLQkJCWRpZ19jZGMtPmNvbXBfZW5hYmxlZFtyeF9pZHhdID0gMDsKLQkJZWxzZQotCQkJZGlnX2NkYy0+Y29tcF9lbmFibGVkW3J4X2lkeF0gPSBjb21wX2lkeDsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbXNtX2RpZ19jZGMtPmNvbXBbJWRdX2VuYWJsZWRbJWRdID0gJWRcbiIsCi0JCV9fZnVuY19fLCBjb21wX2lkeCwgcnhfaWR4LAotCQlkaWdfY2RjLT5jb21wX2VuYWJsZWRbcnhfaWR4XSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNvbXBhbmRlcl9rY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDAgUlgxIiwgQ09NUEFOREVSXzEsIE1TTTg5WFhfUlgxLCAxLCAwLAotCW1zbV9kaWdfY2RjX2NvbXBhbmRlcl9nZXQsIG1zbV9kaWdfY2RjX2NvbXBhbmRlcl9zZXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkNPTVAwIFJYMiIsIENPTVBBTkRFUl8xLCBNU004OVhYX1JYMiwgMSwgMCwKLQltc21fZGlnX2NkY19jb21wYW5kZXJfZ2V0LCBtc21fZGlnX2NkY19jb21wYW5kZXJfc2V0KSwKLQotfTsKLQotc3RhdGljIGludCBtc21fZGlnX2NkY19zZXRfaW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJCSAgICAgdTggcnhfZnNfcmF0ZV9yZWdfdmFsLAotCQkJCQkgICAgIHUzMiBzYW1wbGVfcmF0ZSkKLXsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwsIDB4RjAsIHJ4X2ZzX3JhdGVfcmVnX3ZhbCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAotCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjVfQ1RMLCAweEYwLCByeF9mc19yYXRlX3JlZ192YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXU4IHR4X2ZzX3JhdGUsIHJ4X2ZzX3JhdGUsIHJ4X2Nsa19mc19yYXRlOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGRhaS0+Y29kZWMtPmRldiwKLQkJIiVzOiBkYWlfbmFtZSA9ICVzIERBSS1JRCAleCByYXRlICVkIG51bV9jaCAlZCBmb3JtYXQgJWRcbiIsCi0JCV9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQsIHBhcmFtc19yYXRlKHBhcmFtcyksCi0JCXBhcmFtc19jaGFubmVscyhwYXJhbXMpLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCi0Jc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7Ci0JY2FzZSA4MDAwOgotCQl0eF9mc19yYXRlID0gMHgwMDsKLQkJcnhfZnNfcmF0ZSA9IDB4MDA7Ci0JCXJ4X2Nsa19mc19yYXRlID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjAwMDoKLQkJdHhfZnNfcmF0ZSA9IDB4MjA7Ci0JCXJ4X2ZzX3JhdGUgPSAweDIwOwotCQlyeF9jbGtfZnNfcmF0ZSA9IDB4MDE7Ci0JCWJyZWFrOwotCWNhc2UgMzIwMDA6Ci0JCXR4X2ZzX3JhdGUgPSAweDQwOwotCQlyeF9mc19yYXRlID0gMHg0MDsKLQkJcnhfY2xrX2ZzX3JhdGUgPSAweDAyOwotCQlicmVhazsKLQljYXNlIDQ0MTAwOgotCWNhc2UgNDgwMDA6Ci0JCXR4X2ZzX3JhdGUgPSAweDYwOwotCQlyeF9mc19yYXRlID0gMHg2MDsKLQkJcnhfY2xrX2ZzX3JhdGUgPSAweDAzOwotCQlicmVhazsKLQljYXNlIDk2MDAwOgotCQl0eF9mc19yYXRlID0gMHg4MDsKLQkJcnhfZnNfcmF0ZSA9IDB4ODA7Ci0JCXJ4X2Nsa19mc19yYXRlID0gMHgwNDsKLQkJYnJlYWs7Ci0JY2FzZSAxOTIwMDA6Ci0JCXR4X2ZzX3JhdGUgPSAweEEwOwotCQlyeF9mc19yYXRlID0gMHhBMDsKLQkJcnhfY2xrX2ZzX3JhdGUgPSAweDA1OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBzYW1wbGluZyByYXRlICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBhcmFtc19yYXRlKHBhcmFtcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9JMlNfQ1RMLCAweDBGLCByeF9jbGtfZnNfcmF0ZSk7Ci0KLQlzd2l0Y2ggKHN1YnN0cmVhbS0+c3RyZWFtKSB7Ci0JY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKLQkJcmV0ID0gbXNtX2RpZ19jZGNfc2V0X2ludGVycG9sYXRvcl9yYXRlKGRhaSwgcnhfZnNfcmF0ZSwKLQkJCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRhaS0+Y29kZWMtPmRldiwKLQkJCQkiJXM6IHNldCBkZWNpbWF0b3IgcmF0ZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAotCQkJCXJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkXG4iLCBfX2Z1bmNfXywKLQkJCXN1YnN0cmVhbS0+c3RyZWFtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJc25kX3NvY191cGRhdGVfYml0cyhkYWktPmNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVEwsIDB4MjAsIDB4MjApOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTCwgMHgyMCwgMHgwMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5jb2RlYy0+ZGV2LCAiJXM6IHdyb25nIGZvcm1hdCBzZWxlY3RlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGlnX2NkY19jb2RlY19lbmFibGVfZG1pYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICpkaWdfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTggIGRtaWNfY2xrX2VuOwotCXUxNiBkbWljX2Nsa19yZWc7Ci0JczMyICpkbWljX2Nsa19jbnQ7Ci0JdW5zaWduZWQgaW50IGRtaWM7Ci0JaW50IHJldDsKLQljaGFyICpkbWljX251bSA9IHN0cnBicmsody0+bmFtZSwgIjEyMzQiKTsKLQotCWlmIChkbWljX251bSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdWludChkbWljX251bSwgMTAsICZkbWljKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgRE1JQyBsaW5lIG9uIHRoZSBjb2RlY1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGRtaWMpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQlkbWljX2Nsa19lbiA9IDB4MDE7Ci0JCWRtaWNfY2xrX2NudCA9ICYoZGlnX2NkYy0+ZG1pY18xXzJfY2xrX2NudCk7Ci0JCWRtaWNfY2xrX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjFfQ1RMOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXMoKSBldmVudCAlZCBETUlDJWQgZG1pY18xXzJfY2xrX2NudCAlZFxuIiwKLQkJCV9fZnVuY19fLCBldmVudCwgIGRtaWMsICpkbWljX2Nsa19jbnQpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JY2FzZSA0OgotCQlkbWljX2Nsa19lbiA9IDB4MDE7Ci0JCWRtaWNfY2xrX2NudCA9ICYoZGlnX2NkYy0+ZG1pY18zXzRfY2xrX2NudCk7Ci0JCWRtaWNfY2xrX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjJfQ1RMOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXMoKSBldmVudCAlZCBETUlDJWQgZG1pY18zXzRfY2xrX2NudCAlZFxuIiwKLQkJCV9fZnVuY19fLCBldmVudCwgIGRtaWMsICpkbWljX2Nsa19jbnQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBETUlDIFNlbGVjdGlvblxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJKCpkbWljX2Nsa19jbnQpKys7Ci0JCWlmICgqZG1pY19jbGtfY250ID09IDEpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKLQkJCQkJMHgwRSwgMHgwNCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCi0JCQkJCWRtaWNfY2xrX2VuLCBkbWljX2Nsa19lbik7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMICsgKGRtaWMgLSAxKSAqIDB4MjAsCi0JCQkweDA3LCAweDAyKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCSgqZG1pY19jbGtfY250KS0tOwotCQlpZiAoKmRtaWNfY2xrX2NudCAgPT0gMCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKLQkJCQkJZG1pY19jbGtfZW4sIDApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCWludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOwotCXVuc2lnbmVkIGludCBkZWNpbWF0b3I7Ci0Jc3RydWN0IG1zbV9kaWdfcHJpdiAqbXNtX2RpZ19jZGMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljaGFyICpkZWNfbmFtZSA9IE5VTEw7Ci0JY2hhciAqd2lkZ2V0X25hbWUgPSBOVUxMOwotCWNoYXIgKnRlbXA7Ci0JaW50IHJldCA9IDAsIGk7Ci0JdTE2IGRlY19yZXNldF9yZWcsIHR4X3ZvbF9jdGxfcmVnLCB0eF9tdXhfY3RsX3JlZzsKLQl1OCBkZWNfaHBmX2N1dF9vZl9mcmVxOwotCWludCBvZmZzZXQ7Ci0JY2hhciAqZGVjX251bTsKLQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQl3aWRnZXRfbmFtZSA9IGtzdHJuZHVwKHctPm5hbWUsIDE1LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdpZGdldF9uYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQl0ZW1wID0gd2lkZ2V0X25hbWU7Ci0KLQlkZWNfbmFtZSA9IHN0cnNlcCgmd2lkZ2V0X25hbWUsICIgIik7Ci0Jd2lkZ2V0X25hbWUgPSB0ZW1wOwotCWlmICghZGVjX25hbWUpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGRlY2ltYXRvciA9ICVzXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRlY19udW0gPSBzdHJwYnJrKGRlY19uYW1lLCAiMTIzNDUiKTsKLQlpZiAoZGVjX251bSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERlY2ltYXRvclxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBrc3RydG91aW50KGRlY19udW0sIDEwLCAmZGVjaW1hdG9yKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsIF9fZnVuY19fLCBkZWNfbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzKCk6IHdpZGdldCA9ICVzIGRlY19uYW1lID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAotCQl3LT5uYW1lLCBkZWNfbmFtZSwgZGVjaW1hdG9yKTsKLQotCWlmICh3LT5yZWcgPT0gTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTCkgewotCQlkZWNfcmVzZXRfcmVnID0gTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfUkVTRVRfQjFfQ1RMOwotCQlvZmZzZXQgPSAwOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciwgaW5jb3JyZWN0IGRlY1xuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0eF92b2xfY3RsX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfQ0ZHICsKLQkJCSAzMiAqIChkZWNpbWF0b3IgLSAxKTsKLQl0eF9tdXhfY3RsX3JlZyA9IE1TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVEwgKwotCQkJICAzMiAqIChkZWNpbWF0b3IgLSAxKTsKLQlpZiAoZGVjaW1hdG9yID09IDUpIHsKLQkJdHhfdm9sX2N0bF9yZWcgPSBNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0NGRzsKLQkJdHhfbXV4X2N0bF9yZWcgPSBNU004OVhYX0NEQ19DT1JFX1RYNV9NVVhfQ1RMOwotCX0KLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQkvKiBFbmFibGVhYmxlIFRYIGRpZ2l0YWwgbXV0ZSAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fREVDSU1BVE9SUzsgaSsrKSB7Ci0JCQlpZiAoZGVjaW1hdG9yID09IGkgKyAxKQotCQkJCW1zbV9kaWdfY2RjLT5kZWNfYWN0aXZlW2ldID0gdHJ1ZTsKLQkJfQotCi0JCWRlY19ocGZfY3V0X29mX2ZyZXEgPSBzbmRfc29jX3JlYWQoY29kZWMsIHR4X211eF9jdGxfcmVnKTsKLQotCQlkZWNfaHBmX2N1dF9vZl9mcmVxID0gKGRlY19ocGZfY3V0X29mX2ZyZXEgJiAweDMwKSA+PiA0OwotCi0JCXR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLnR4X2hwZl9jdXRfb2ZfZnJlcSA9Ci0JCQlkZWNfaHBmX2N1dF9vZl9mcmVxOwotCi0JCWlmIChkZWNfaHBmX2N1dF9vZl9mcmVxICE9IENGX01JTl8zREJfMTUwSFopIHsKLQotCQkJLyogc2V0IGN1dCBvZiBmcmVxIHRvIENGX01JTl8zREJfMTUwSFogKDB4MSk7ICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9tdXhfY3RsX3JlZywgMHgzMCwKLQkJCQkJICAgIENGX01JTl8zREJfMTUwSFogPDwgNCk7Ci0JCX0KLQkJbXNtX2RpZ19jZGMtPnVwZGF0ZV9jbGtkaXYobXNtX2RpZ19jZGMtPmhhbmRsZSwgMHg0Mik7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBlbmFibGUgSFBGICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X211eF9jdGxfcmVnLCAweDA4LCAweDAwKTsKLQotCQlpZiAodHhfaHBmX3dvcmtbZGVjaW1hdG9yIC0gMV0udHhfaHBmX2N1dF9vZl9mcmVxICE9Ci0JCQkJQ0ZfTUlOXzNEQl8xNTBIWikgewotCi0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLmR3b3JrLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDMwMCkpOwotCQl9Ci0JCS8qIGFwcGx5IHRoZSBkaWdpdGFsIGdhaW4gYWZ0ZXIgdGhlIGRlY2ltYXRvciBpcyBlbmFibGVkKi8KLQkJaWYgKCh3LT5zaGlmdCkgPCBBUlJBWV9TSVpFKHR4X2RpZ2l0YWxfZ2Fpbl9yZWcpKQotCQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCQkgIHR4X2RpZ2l0YWxfZ2Fpbl9yZWdbdy0+c2hpZnQgKyBvZmZzZXRdLAotCQkJCSAgc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCSAgdHhfZGlnaXRhbF9nYWluX3JlZ1t3LT5zaGlmdCArIG9mZnNldF0pCi0JCQkJICApOwotCQlpZiAocGRhdGEtPmxiX21vZGUpIHsKLQkJCXByX2RlYnVnKCIlczogbG9vcGJhY2sgbW9kZSB1bm11dGUgdGhlIERFQ1xuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMCk7Ci0JCX0KLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywKLQkJCQkJCTB4MDEsIDB4MDApOwotCi0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDAxLCAweDAxKTsKLQkJbXNsZWVwKDIwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MDgsIDB4MDgpOwotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnR4X2hwZl93b3JrW2RlY2ltYXRvciAtIDFdLmR3b3JrKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19yZXNldF9yZWcsIDEgPDwgdy0+c2hpZnQsCi0JCQkxIDw8IHctPnNoaWZ0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX3Jlc2V0X3JlZywgMSA8PCB3LT5zaGlmdCwgMHgwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfbXV4X2N0bF9yZWcsIDB4MDgsIDB4MDgpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9tdXhfY3RsX3JlZywgMHgzMCwKLQkJCSh0eF9ocGZfd29ya1tkZWNpbWF0b3IgLSAxXS50eF9ocGZfY3V0X29mX2ZyZXEpIDw8IDQpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgwMSwgMHgwMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fREVDSU1BVE9SUzsgaSsrKSB7Ci0JCQlpZiAoZGVjaW1hdG9yID09IGkgKyAxKQotCQkJCW1zbV9kaWdfY2RjLT5kZWNfYWN0aXZlW2ldID0gZmFsc2U7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotb3V0OgotCWtmcmVlKHdpZGdldF9uYW1lKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX2V2ZW50X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmJsb2NrLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwKLQkJCQkgICAgdm9pZCAqZGF0YSkKLXsKLQllbnVtIGRpZ19jZGNfbm90aWZ5X2V2ZW50IGV2ZW50ID0gKGVudW0gZGlnX2NkY19ub3RpZnlfZXZlbnQpdmFsOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJlZ2lzdGVyZWRfZGlnY29kZWM7Ci0Jc3RydWN0IG1zbV9kaWdfcHJpdiAqbXNtX2RpZ19jZGMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgRElHX0NEQ19FVkVOVF9DTEtfT046Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfUERNX0NUTCwgMHgwMywgMHgwMyk7Ci0JCWlmIChwZGF0YS0+bWNsa19mcmVxID09IE1DTEtfUkFURV8xMlAyODhNSFogfHwKLQkJICAgIHBkYXRhLT5uYXRpdmVfY2xrX3NldCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9UT1BfQ1RMLCAweDAxLCAweDAwKTsKLQkJZWxzZSBpZiAocGRhdGEtPm1jbGtfZnJlcSA9PSBNQ0xLX1JBVEVfOVA2TUhaKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1RPUF9DVEwsIDB4MDEsIDB4MDEpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVEwsIDB4MDEsIDB4MDEpOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfQ0xLX09GRjoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVEwsIDB4MDMsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVEwsIDB4MDEsIDB4MDApOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfUlgxX01VVEVfT046Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwsIDB4MDEsIDB4MDEpOwotCQltc21fZGlnX2NkYy0+bXV0ZV9tYXNrIHw9IEhQSExfUEFfRElTQUJMRTsKLQkJYnJlYWs7Ci0JY2FzZSBESUdfQ0RDX0VWRU5UX1JYMV9NVVRFX09GRjoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTCwgMHgwMSwgMHgwMCk7Ci0JCW1zbV9kaWdfY2RjLT5tdXRlX21hc2sgJj0gKH5IUEhMX1BBX0RJU0FCTEUpOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfUlgyX01VVEVfT046Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CNl9DVEwsIDB4MDEsIDB4MDEpOwotCQltc21fZGlnX2NkYy0+bXV0ZV9tYXNrIHw9IEhQSFJfUEFfRElTQUJMRTsKLQkJYnJlYWs7Ci0JY2FzZSBESUdfQ0RDX0VWRU5UX1JYMl9NVVRFX09GRjoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTCwgMHgwMSwgMHgwMCk7Ci0JCW1zbV9kaWdfY2RjLT5tdXRlX21hc2sgJj0gKH5IUEhSX1BBX0RJU0FCTEUpOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfUlgzX01VVEVfT046Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEwsIDB4MDEsIDB4MDEpOwotCQltc21fZGlnX2NkYy0+bXV0ZV9tYXNrIHw9IFNQS1JfUEFfRElTQUJMRTsKLQkJYnJlYWs7Ci0JY2FzZSBESUdfQ0RDX0VWRU5UX1JYM19NVVRFX09GRjoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgzX0I2X0NUTCwgMHgwMSwgMHgwMCk7Ci0JCW1zbV9kaWdfY2RjLT5tdXRlX21hc2sgJj0gKH5TUEtSX1BBX0RJU0FCTEUpOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfUFJFX1JYMV9JTlRfT046Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjNfQ1RMLCAweDNDLCAweDI4KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwsIDB4MTgsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0IzX0NUTCwgMHg4MCwgMHg4MCk7Ci0JCWJyZWFrOwotCWNhc2UgRElHX0NEQ19FVkVOVF9QUkVfUlgyX0lOVF9PTjoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVEwsIDB4M0MsIDB4MjgpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTCwgMHgxOCwgMHgxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjNfQ1RMLCAweDgwLCAweDgwKTsKLQkJYnJlYWs7Ci0JY2FzZSBESUdfQ0RDX0VWRU5UX1BPU1RfUlgxX0lOVF9PRkY6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9SWDFfQjNfQ1RMLCAweDNDLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwsIDB4MTgsIDB4RkYpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgxX0IzX0NUTCwgMHg4MCwgMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgRElHX0NEQ19FVkVOVF9QT1NUX1JYMl9JTlRfT0ZGOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTCwgMHgzQywgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjRfQ1RMLCAweDE4LCAweEZGKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVEwsIDB4ODAsIDB4MDApOwotCQlicmVhazsKLQljYXNlIERJR19DRENfRVZFTlRfU1NSX0RPV046Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkobXNtX2RpZ19jZGMtPnJlZ21hcCwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgRElHX0NEQ19FVkVOVF9TU1JfVVA6Ci0JCXJlZ2NhY2hlX2NhY2hlX29ubHkobXNtX2RpZ19jZGMtPnJlZ21hcCwgZmFsc2UpOwotCQlyZWdjYWNoZV9tYXJrX2RpcnR5KG1zbV9kaWdfY2RjLT5yZWdtYXApOwotCi0JCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7Ci0JCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCi0JCQkJCUFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWCwKLQkJCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOmZhaWxlZCB0byBlbmFibGUgdGhlIE1DTEtcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCQlicmVhazsKLQkJfQotCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQotCQlyZWdjYWNoZV9zeW5jKG1zbV9kaWdfY2RjLT5yZWdtYXApOwotCi0JCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDA7Ci0JCWFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCi0JCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAotCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOwotCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJYnJlYWs7Ci0JY2FzZSBESUdfQ0RDX0VWRU5UX0lOVkFMSUQ6Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBtc21fZGlnX2NvZGVjX3ZlcnNpb25fcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAotCQkJCQkgIHZvaWQgKmZpbGVfcHJpdmF0ZV9kYXRhLAotCQkJCQkgIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJICBsb2ZmX3QgcG9zKQotewotCXN0cnVjdCBtc21fZGlnX3ByaXYgKm1zbV9kaWc7Ci0JY2hhciBidWZmZXJbTVNNX0RJR19DRENfVkVSU0lPTl9FTlRSWV9TSVpFXTsKLQlpbnQgbGVuID0gMDsKLQotCW1zbV9kaWcgPSAoc3RydWN0IG1zbV9kaWdfcHJpdiAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwotCWlmICghbXNtX2RpZykgewotCQlwcl9lcnIoIiVzOiBtc21fZGlnIHByaXYgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKG1zbV9kaWctPnZlcnNpb24pIHsKLQljYXNlIERSQVhfQ0RDOgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiU0RNNjYwLUNEQ18xXzBcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7Ci0JfQotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgbXNtX2RpZ19jb2RlY19pbmZvX29wcyA9IHsKLQkucmVhZCA9IG1zbV9kaWdfY29kZWNfdmVyc2lvbl9yZWFkLAotfTsKLQotLyoKLSAqIG1zbV9kaWdfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIG1zbV9kaWcgbW9kdWxlCi0gKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBDcmVhdGVzIG1zbV9kaWcgbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgotICogcGFyZW50IGRpcmVjdG9yeS4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludCBtc21fZGlnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OwotCXN0cnVjdCBtc21fZGlnX3ByaXYgKm1zbV9kaWc7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQotCWlmICghY29kZWNfcm9vdCB8fCAhY29kZWMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXNtX2RpZyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0JbXNtX2RpZy0+ZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNvZGVjX3Jvb3QtPm1vZHVsZSwKLQkJCQkJCSAgIm1zbV9kaWdpdGFsX2NvZGVjIiwKLQkJCQkJCSAgY29kZWNfcm9vdCk7Ci0JaWYgKCFtc21fZGlnLT5lbnRyeSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBtc21fZGlnaXRhbCBlbnRyeVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdmVyc2lvbl9lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQtPnNuZF9jYXJkLAotCQkJCQkJICAgInZlcnNpb24iLAotCQkJCQkJICAgbXNtX2RpZy0+ZW50cnkpOwotCWlmICghdmVyc2lvbl9lbnRyeSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBtc21fZGlnaXRhbCB2ZXJzaW9uIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSBtc21fZGlnOwotCXZlcnNpb25fZW50cnktPnNpemUgPSBNU01fRElHX0NEQ19WRVJTSU9OX0VOVFJZX1NJWkU7Ci0JdmVyc2lvbl9lbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOwotCXZlcnNpb25fZW50cnktPmMub3BzID0gJm1zbV9kaWdfY29kZWNfaW5mb19vcHM7Ci0KLQlpZiAoc25kX2luZm9fcmVnaXN0ZXIodmVyc2lvbl9lbnRyeSkgPCAwKSB7Ci0JCXNuZF9pbmZvX2ZyZWVfZW50cnkodmVyc2lvbl9lbnRyeSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fZGlnLT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKLQlpZiAobXNtX2RpZy0+Z2V0X2NkY192ZXJzaW9uKQotCQltc21fZGlnLT52ZXJzaW9uID0gbXNtX2RpZy0+Z2V0X2NkY192ZXJzaW9uKG1zbV9kaWctPmhhbmRsZSk7Ci0JZWxzZQotCQltc21fZGlnLT52ZXJzaW9uID0gRFJBWF9DREM7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2RpZ19jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSk7Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfc29jX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICptc21fZGlnX2NkYyA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQlpbnQgaSwgcmV0OwotCi0JbXNtX2RpZ19jZGMtPmNvZGVjID0gY29kZWM7Ci0KLQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgY29tcGFuZGVyX2tjb250cm9scywKLQkJCUFSUkFZX1NJWkUoY29tcGFuZGVyX2tjb250cm9scykpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9ERUNJTUFUT1JTOyBpKyspIHsKLQkJdHhfaHBmX3dvcmtbaV0uZGlnX2NkYyA9IG1zbV9kaWdfY2RjOwotCQl0eF9ocGZfd29ya1tpXS5kZWNpbWF0b3IgPSBpICsgMTsKLQkJSU5JVF9ERUxBWUVEX1dPUksoJnR4X2hwZl93b3JrW2ldLmR3b3JrLAotCQkJdHhfaHBmX2Nvcm5lcl9mcmVxX2NhbGxiYWNrKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVNNODlYWF9SWF9NQVg7IGkrKykKLQkJbXNtX2RpZ19jZGMtPmNvbXBfZW5hYmxlZFtpXSA9IENPTVBBTkRFUl9OT05FOwotCi0JLyogUmVnaXN0ZXIgZXZlbnQgbm90aWZpZXIgKi8KLQltc21fZGlnX2NkYy0+bmJsb2NrLm5vdGlmaWVyX2NhbGwgPSBtc21fZGlnX2NkY19ldmVudF9ub3RpZnk7Ci0JaWYgKG1zbV9kaWdfY2RjLT5yZWdpc3Rlcl9ub3RpZmllcikgewotCQlyZXQgPSBtc21fZGlnX2NkYy0+cmVnaXN0ZXJfbm90aWZpZXIobXNtX2RpZ19jZGMtPmhhbmRsZSwKLQkJCQkJCSAgICAgJm1zbV9kaWdfY2RjLT5uYmxvY2ssCi0JCQkJCQkgICAgIHRydWUpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgbm90aWZpZXIgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXJlZ2lzdGVyZWRfZGlnY29kZWMgPSBjb2RlYzsKLQotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMSBQbGF5YmFjayIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMSBDYXB0dXJlIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBREMxX0lOIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBREMyX0lOIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBREMzX0lOIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJQRE1fT1VUX1JYMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiUERNX09VVF9SWDIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlBETV9PVVRfUlgzIik7Ci0KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfY2RjX3NvY19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBtc21fZGlnX3ByaXYgKm1zbV9kaWdfY2RjID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOwotCi0JaWYgKG1zbV9kaWdfY2RjLT5yZWdpc3Rlcl9ub3RpZmllcikKLQkJbXNtX2RpZ19jZGMtPnJlZ2lzdGVyX25vdGlmaWVyKG1zbV9kaWdfY2RjLT5oYW5kbGUsCi0JCQkJCSAgICAgICAmbXNtX2RpZ19jZGMtPm5ibG9jaywKLQkJCQkJICAgICAgIGZhbHNlKTsKLQlpb3VubWFwKG1zbV9kaWdfY2RjLT5kaWdfYmFzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX2RpZ19tYXBbXSA9IHsKLQl7IlJYX0kyU19DTEsiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKLQl7IkkyUyBSWDEiLCBOVUxMLCAiUlhfSTJTX0NMSyJ9LAotCXsiSTJTIFJYMiIsIE5VTEwsICJSWF9JMlNfQ0xLIn0sCi0JeyJJMlMgUlgzIiwgTlVMTCwgIlJYX0kyU19DTEsifSwKLQotCXsiSTJTIFRYMSIsIE5VTEwsICJUWF9JMlNfQ0xLIn0sCi0JeyJJMlMgVFgyIiwgTlVMTCwgIlRYX0kyU19DTEsifSwKLQl7IkkyUyBUWDMiLCBOVUxMLCAiVFhfSTJTX0NMSyJ9LAotCXsiSTJTIFRYNCIsIE5VTEwsICJUWF9JMlNfQ0xLIn0sCi0JeyJJMlMgVFg1IiwgTlVMTCwgIlRYX0kyU19DTEsifSwKLQl7IkkyUyBUWDYiLCBOVUxMLCAiVFhfSTJTX0NMSyJ9LAotCi0JeyJJMlMgVFgxIiwgTlVMTCwgIkRFQzEgTVVYIn0sCi0JeyJJMlMgVFgyIiwgTlVMTCwgIkRFQzIgTVVYIn0sCi0JeyJJMlMgVFgzIiwgTlVMTCwgIkkyUyBUWDIgSU5QMSJ9LAotCXsiSTJTIFRYNCIsIE5VTEwsICJJMlMgVFgyIElOUDIifSwKLQl7IkkyUyBUWDUiLCBOVUxMLCAiREVDMyBNVVgifSwKLQl7IkkyUyBUWDYiLCBOVUxMLCAiSTJTIFRYMyBJTlAyIn0sCi0KLQl7IkkyUyBUWDIgSU5QMSIsICJSWF9NSVgxIiwgIlJYMSBNSVgyIn0sCi0JeyJJMlMgVFgyIElOUDEiLCAiREVDMyIsICJERUMzIE1VWCJ9LAotCXsiSTJTIFRYMiBJTlAyIiwgIlJYX01JWDIiLCAiUlgyIE1JWDIifSwKLQl7IkkyUyBUWDIgSU5QMiIsICJSWF9NSVgzIiwgIlJYMyBNSVgxIn0sCi0JeyJJMlMgVFgyIElOUDIiLCAiREVDNCIsICJERUM0IE1VWCJ9LAotCXsiSTJTIFRYMyBJTlAyIiwgIkRFQzQiLCAiREVDNCBNVVgifSwKLQl7IkkyUyBUWDMgSU5QMiIsICJERUM1IiwgIkRFQzUgTVVYIn0sCi0KLQl7IlBETV9PVVRfUlgxIiwgTlVMTCwgIlJYMSBDSEFJTiJ9LAotCXsiUERNX09VVF9SWDIiLCBOVUxMLCAiUlgyIENIQUlOIn0sCi0JeyJQRE1fT1VUX1JYMyIsIE5VTEwsICJSWDMgQ0hBSU4ifSwKLQotCXsiUlgxIENIQUlOIiwgTlVMTCwgIlJYMSBNSVgyIn0sCi0JeyJSWDIgQ0hBSU4iLCBOVUxMLCAiUlgyIE1JWDIifSwKLQl7IlJYMyBDSEFJTiIsIE5VTEwsICJSWDMgTUlYMSJ9LAotCi0JeyJSWDEgTUlYMSIsIE5VTEwsICJSWDEgTUlYMSBJTlAxIn0sCi0JeyJSWDEgTUlYMSIsIE5VTEwsICJSWDEgTUlYMSBJTlAyIn0sCi0JeyJSWDEgTUlYMSIsIE5VTEwsICJSWDEgTUlYMSBJTlAzIn0sCi0JeyJSWDIgTUlYMSIsIE5VTEwsICJSWDIgTUlYMSBJTlAxIn0sCi0JeyJSWDIgTUlYMSIsIE5VTEwsICJSWDIgTUlYMSBJTlAyIn0sCi0JeyJSWDMgTUlYMSIsIE5VTEwsICJSWDMgTUlYMSBJTlAxIn0sCi0JeyJSWDMgTUlYMSIsIE5VTEwsICJSWDMgTUlYMSBJTlAyIn0sCi0JeyJSWDEgTUlYMiIsIE5VTEwsICJSWDEgTUlYMSJ9LAotCXsiUlgxIE1JWDIiLCBOVUxMLCAiUlgxIE1JWDIgSU5QMSJ9LAotCXsiUlgyIE1JWDIiLCBOVUxMLCAiUlgyIE1JWDEifSwKLQl7IlJYMiBNSVgyIiwgTlVMTCwgIlJYMiBNSVgyIElOUDEifSwKLQotCXsiUlgxIE1JWDEgSU5QMSIsICJSWDEiLCAiSTJTIFJYMSJ9LAotCXsiUlgxIE1JWDEgSU5QMSIsICJSWDIiLCAiSTJTIFJYMiJ9LAotCXsiUlgxIE1JWDEgSU5QMSIsICJSWDMiLCAiSTJTIFJYMyJ9LAotCXsiUlgxIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYMSBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCi0JeyJSWDEgTUlYMSBJTlAyIiwgIlJYMSIsICJJMlMgUlgxIn0sCi0JeyJSWDEgTUlYMSBJTlAyIiwgIlJYMiIsICJJMlMgUlgyIn0sCi0JeyJSWDEgTUlYMSBJTlAyIiwgIlJYMyIsICJJMlMgUlgzIn0sCi0JeyJSWDEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlgxIE1JWDEgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKLQl7IlJYMSBNSVgxIElOUDMiLCAiUlgxIiwgIkkyUyBSWDEifSwKLQl7IlJYMSBNSVgxIElOUDMiLCAiUlgyIiwgIkkyUyBSWDIifSwKLQl7IlJYMSBNSVgxIElOUDMiLCAiUlgzIiwgIkkyUyBSWDMifSwKLQotCXsiUlgyIE1JWDEgSU5QMSIsICJSWDEiLCAiSTJTIFJYMSJ9LAotCXsiUlgyIE1JWDEgSU5QMSIsICJSWDIiLCAiSTJTIFJYMiJ9LAotCXsiUlgyIE1JWDEgSU5QMSIsICJSWDMiLCAiSTJTIFJYMyJ9LAotCXsiUlgyIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYMiBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCi0JeyJSWDIgTUlYMSBJTlAyIiwgIlJYMSIsICJJMlMgUlgxIn0sCi0JeyJSWDIgTUlYMSBJTlAyIiwgIlJYMiIsICJJMlMgUlgyIn0sCi0JeyJSWDIgTUlYMSBJTlAyIiwgIlJYMyIsICJJMlMgUlgzIn0sCi0JeyJSWDIgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlgyIE1JWDEgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKLQotCXsiUlgzIE1JWDEgSU5QMSIsICJSWDEiLCAiSTJTIFJYMSJ9LAotCXsiUlgzIE1JWDEgSU5QMSIsICJSWDIiLCAiSTJTIFJYMiJ9LAotCXsiUlgzIE1JWDEgSU5QMSIsICJSWDMiLCAiSTJTIFJYMyJ9LAotCXsiUlgzIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYMyBNSVgxIElOUDEiLCAiSUlSMiIsICJJSVIyIn0sCi0JeyJSWDMgTUlYMSBJTlAyIiwgIlJYMSIsICJJMlMgUlgxIn0sCi0JeyJSWDMgTUlYMSBJTlAyIiwgIlJYMiIsICJJMlMgUlgyIn0sCi0JeyJSWDMgTUlYMSBJTlAyIiwgIlJYMyIsICJJMlMgUlgzIn0sCi0JeyJSWDMgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlgzIE1JWDEgSU5QMiIsICJJSVIyIiwgIklJUjIifSwKLQotCXsiUlgxIE1JWDIgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYMiBNSVgyIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWDEgTUlYMiBJTlAxIiwgIklJUjIiLCAiSUlSMiJ9LAotCXsiUlgyIE1JWDIgSU5QMSIsICJJSVIyIiwgIklJUjIifSwKLQotCQkvKiBEZWNpbWF0b3IgSW5wdXRzICovCi0JeyJERUMxIE1VWCIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiREVDMSBNVVgiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRFQzEgTVVYIiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJERUMxIE1VWCIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiREVDMSBNVVgiLCAiQURDMSIsICJBREMxX0lOIn0sCi0JeyJERUMxIE1VWCIsICJBREMyIiwgIkFEQzJfSU4ifSwKLQl7IkRFQzEgTVVYIiwgIkFEQzMiLCAiQURDM19JTiJ9LAotCXsiREVDMSBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKLQotCXsiREVDMiBNVVgiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRFQzIgTVVYIiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJERUMyIE1VWCIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiREVDMiBNVVgiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRFQzIgTVVYIiwgIkFEQzEiLCAiQURDMV9JTiJ9LAotCXsiREVDMiBNVVgiLCAiQURDMiIsICJBREMyX0lOIn0sCi0JeyJERUMyIE1VWCIsICJBREMzIiwgIkFEQzNfSU4ifSwKLQl7IkRFQzIgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCi0KLQl7IkRFQzMgTVVYIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJERUMzIE1VWCIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiREVDMyBNVVgiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRFQzMgTVVYIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJERUMzIE1VWCIsICJBREMxIiwgIkFEQzFfSU4ifSwKLQl7IkRFQzMgTVVYIiwgIkFEQzIiLCAiQURDMl9JTiJ9LAotCXsiREVDMyBNVVgiLCAiQURDMyIsICJBREMzX0lOIn0sCi0JeyJERUMzIE1VWCIsIE5VTEwsICJDRENfQ09OTiJ9LAotCi0JeyJERUM0IE1VWCIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiREVDNCBNVVgiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRFQzQgTVVYIiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJERUM0IE1VWCIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiREVDNCBNVVgiLCAiQURDMSIsICJBREMxX0lOIn0sCi0JeyJERUM0IE1VWCIsICJBREMyIiwgIkFEQzJfSU4ifSwKLQl7IkRFQzQgTVVYIiwgIkFEQzMiLCAiQURDM19JTiJ9LAotCXsiREVDNCBNVVgiLCBOVUxMLCAiQ0RDX0NPTk4ifSwKLQotCXsiREVDNSBNVVgiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRFQzUgTVVYIiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJERUM1IE1VWCIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiREVDNSBNVVgiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRFQzUgTVVYIiwgIkFEQzEiLCAiQURDMV9JTiJ9LAotCXsiREVDNSBNVVgiLCAiQURDMiIsICJBREMyX0lOIn0sCi0JeyJERUM1IE1VWCIsICJBREMzIiwgIkFEQzNfSU4ifSwKLQl7IkRFQzUgTVVYIiwgTlVMTCwgIkNEQ19DT05OIn0sCi0KLQl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAxIE1VWCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUMxIiwgIkRFQzEgTVVYIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzIiLCAiREVDMiBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDMyIsICJERUMzIE1VWCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUM0IiwgIkRFQzQgTVVYIn0sCi0JeyJJSVIyIiwgTlVMTCwgIklJUjIgSU5QMSBNVVgifSwKLQl7IklJUjIgSU5QMSBNVVgiLCAiREVDMSIsICJERUMxIE1VWCJ9LAotCXsiSUlSMiBJTlAxIE1VWCIsICJERUMyIiwgIkRFQzIgTVVYIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzMiLCAiREVDMyBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDNCIsICJERUM0IE1VWCJ9LAotfTsKLQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyc190eDJfaW5wMV90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYMSIsICJERUMzIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnNfdHgyX2lucDJfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWDIiLCAiUlhfTUlYMyIsICJERUM0IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnNfdHgzX2lucDJfdGV4dFtdID0gewotCSJERUM0IiwgIkRFQzUiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X21peDFfdGV4dFtdID0gewotCSJaRVJPIiwgIklJUjEiLCAiSUlSMiIsICJSWDEiLCAiUlgyIiwgIlJYMyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfbWl4Ml90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiSUlSMSIsICJJSVIyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZWNfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJBREMxIiwgIkFEQzIiLCAiQURDMyIsICJETUlDMSIsICJETUlDMiIsICJETUlDMyIsICJETUlDNCIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlyX2lucDFfdGV4dFtdID0gewotCSJaRVJPIiwgIkRFQzEiLCAiREVDMiIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJERUMzIiwgIkRFQzQiCi19OwotCi0vKiBJMlMgVFggTVVYZXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaTJzX3R4Ml9pbnAxX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfSTJTX1NEMV9DVEwsCi0JCTIsIDMsIGkyc190eDJfaW5wMV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpMnNfdHgyX2lucDJfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9JMlNfU0QxX0NUTCwKLQkJMCwgNCwgaTJzX3R4Ml9pbnAyX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGkyc190eDNfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0kyU19TRDFfQ1RMLAotCQk0LCAyLCBpMnNfdHgzX2lucDJfdGV4dCk7Ci0KLS8qIFJYMSBNSVgxICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X21peDFfaW5wMV9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMV9DVEwsCi0JCTAsIDYsIHJ4X21peDFfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfbWl4MV9pbnAyX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IxX0NUTCwKLQkJMywgNiwgcnhfbWl4MV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXgxX2lucDNfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjJfQ1RMLAotCQkwLCA2LCByeF9taXgxX3RleHQpOwotCi0vKiBSWDEgTUlYMiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXgyX2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjNfQ1RMLAotCQkwLCAzLCByeF9taXgyX3RleHQpOwotCi0vKiBSWDIgTUlYMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4MV9pbnAxX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTCwKLQkJMCwgNiwgcnhfbWl4MV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4MV9pbnAyX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTCwKLQkJMywgNiwgcnhfbWl4MV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeDJfbWl4MV9pbnAzX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTCwKLQkJMCwgNiwgcnhfbWl4MV90ZXh0KTsKLQotLyogUlgyIE1JWDIgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcngyX21peDJfaW5wMV9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CM19DVEwsCi0JCTAsIDMsIHJ4X21peDJfdGV4dCk7Ci0KLS8qIFJYMyBNSVgxICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4M19taXgxX2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjFfQ1RMLAotCQkwLCA2LCByeF9taXgxX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4M19taXgxX2lucDJfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjFfQ1RMLAotCQkzLCA2LCByeF9taXgxX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4M19taXgxX2lucDNfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjFfQ1RMLAotCQkwLCA2LCByeF9taXgxX3RleHQpOwotCi0vKiBERUMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGVjMV9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMV9DVEwsCi0JCTAsIDgsIGRlY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGVjMl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMV9DVEwsCi0JCTMsIDgsIGRlY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGVjM19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMl9DVEwsCi0JCTAsIDgsIGRlY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGVjNF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMl9DVEwsCi0JCTMsIDgsIGRlY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZGVjc3ZhX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IzX0NUTCwKLQkJMCwgOCwgZGVjX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIxX2lucDFfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IxX0NUTCwKLQkJMCwgOCwgaWlyX2lucDFfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMl9pbnAxX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMV9DVEwsCi0JCTAsIDgsIGlpcl9pbnAxX3RleHQpOwotCi0vKmN1dCBvZiBmcmVxdWVuY3kgZm9yIGhpZ2ggcGFzcyBmaWx0ZXIqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZl90ZXh0W10gPSB7Ci0JIk1JTl8zREJfNEh6IiwgIk1JTl8zREJfNzVIeiIsICJNSU5fM0RCXzE1MEh6IgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9yeG1peDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfUlgxX0I0X0NUTCwgMCwgMywgY2ZfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfcnhtaXgyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1JYMl9CNF9DVEwsIDAsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX3J4bWl4M19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMLCAwLCAzLCBjZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4M19taXgxX2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWDMgTUlYMSBJTlAxIE11eCIsIHJ4M19taXgxX2lucDFfY2hhaW5fZW51bSk7Ci0KLSNkZWZpbmUgTVNNODlYWF9ERUNfRU5VTSh4bmFtZSwgeGVudW0pIFwKLXsJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAotCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCBcCi0JLnB1dCA9IG1zbV9kaWdfY2RjX3B1dF9kZWNfZW51bSwgXAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRlYzFfbXV4ID0KLQlNU004OVhYX0RFQ19FTlVNKCJERUMxIE1VWCBNdXgiLCBkZWMxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRlYzJfbXV4ID0KLQlNU004OVhYX0RFQ19FTlVNKCJERUMyIE1VWCBNdXgiLCBkZWMyX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRlYzNfbXV4ID0KLQlNU004OVhYX0RFQ19FTlVNKCJERUMzIE1VWCBNdXgiLCBkZWMzX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRlYzRfbXV4ID0KLQlNU004OVhYX0RFQ19FTlVNKCJERUM0IE1VWCBNdXgiLCBkZWM0X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRlY3N2YV9tdXggPQotCU1TTTg5WFhfREVDX0VOVU0oIkRFQzUgTVVYIE11eCIsIGRlY3N2YV9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpMnNfdHgyX2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJJMlMgVFgyIElOUDEgTXV4IiwgaTJzX3R4Ml9pbnAxX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaTJzX3R4Ml9pbnAyX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiSTJTIFRYMiBJTlAyIE11eCIsIGkyc190eDJfaW5wMl9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGkyc190eDNfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIkkyUyBUWDMgSU5QMiBNdXgiLCBpMnNfdHgzX2lucDJfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIxX2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJJSVIxIElOUDEgTXV4IiwgaWlyMV9pbnAxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjJfaW5wMV9tdXggPQotCVNPQ19EQVBNX0VOVU0oIklJUjIgSU5QMSBNdXgiLCBpaXIyX2lucDFfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfbWl4MV9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlgxIE1JWDEgSU5QMSBNdXgiLCByeF9taXgxX2lucDFfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9taXgxX2lucDJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWDEgTUlYMSBJTlAyIE11eCIsIHJ4X21peDFfaW5wMl9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peDFfaW5wM19tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYMSBNSVgxIElOUDMgTXV4IiwgcnhfbWl4MV9pbnAzX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngyX21peDFfaW5wMV9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYMiBNSVgxIElOUDEgTXV4IiwgcngyX21peDFfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4Ml9taXgxX2lucDJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWDIgTUlYMSBJTlAyIE11eCIsIHJ4Ml9taXgxX2lucDJfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDJfbWl4MV9pbnAzX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlgyIE1JWDEgSU5QMyBNdXgiLCByeDJfbWl4MV9pbnAzX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcngzX21peDFfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYMyBNSVgxIElOUDIgTXV4IiwgcngzX21peDFfaW5wMl9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4M19taXgxX2lucDNfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWDMgTUlYMSBJTlAzIE11eCIsIHJ4M19taXgxX2lucDNfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDFfbWl4Ml9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlgxIE1JWDIgSU5QMSBNdXgiLCByeF9taXgyX2lucDFfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeDJfbWl4Ml9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlgyIE1JWDIgSU5QMSBNdXgiLCByeDJfbWl4Ml9pbnAxX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX2RpZ19kYXBtX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJJMlMgUlgxIiwgIkFJRjEgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIkkyUyBSWDIiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiSTJTIFJYMyIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJMlMgVFgxIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIkkyUyBUWDIiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSTJTIFRYMyIsICJBSUYxIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJMlMgVFg0IiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIkkyUyBUWDUiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSTJTIFRYNiIsICJBSUYyIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYMSBNSVgyIiwgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMLAotCQkJICAgICBNU004OVhYX1JYMSwgMCwgTlVMTCwgMCwKLQkJCSAgICAgbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKLQkJCSAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlgyIE1JWDIiLCBNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMV9DVEwsCi0JCQkgICAgIE1TTTg5WFhfUlgyLCAwLCBOVUxMLCAwLAotCQkJICAgICBtc21fZGlnX2NkY19jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAotCQkJICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWDMgTUlYMSIsIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IxX0NUTCwKLQkJCSAgICAgTVNNODlYWF9SWDMsIDAsIE5VTEwsIDAsCi0JCQkgICAgIG1zbV9kaWdfY2RjX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCQkgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYMiBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiUlgxIENIQUlOIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYMiBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWDMgQ0hBSU4iLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCi0JU05EX1NPQ19EQVBNX01VWCgiUlgxIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X21peDFfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9taXgxX2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWDEgTUlYMSBJTlAzIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4MV9pbnAzX211eCksCi0KLQlTTkRfU09DX0RBUE1fTVVYKCJSWDIgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcngyX21peDFfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYMiBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeDJfbWl4MV9pbnAyX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlgyIE1JWDEgSU5QMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4Ml9taXgxX2lucDNfbXV4KSwKLQotCVNORF9TT0NfREFQTV9NVVgoIlJYMyBNSVgxIElOUDEiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeDNfbWl4MV9pbnAxX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlgzIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4M19taXgxX2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWDMgTUlYMSBJTlAzIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcngzX21peDFfaW5wM19tdXgpLAotCi0JU05EX1NPQ19EQVBNX01VWCgiUlgxIE1JWDIgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4MV9taXgyX2lucDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWDIgTUlYMiBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcngyX21peDJfaW5wMV9tdXgpLAotCi0JU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJDRENfQ09OTiIsIC0yLCBNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX0NUTCwKLQkJMiwgMCwgTlVMTCwgMCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzEgTVVYIiwKLQkJTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgMCwgMCwKLQkJJmRlYzFfbXV4LCBtc21fZGlnX2NkY19jb2RlY19lbmFibGVfZGVjLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiREVDMiBNVVgiLAotCQlNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCAxLCAwLAotCQkmZGVjMl9tdXgsIG1zbV9kaWdfY2RjX2NvZGVjX2VuYWJsZV9kZWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJERUMzIE1VWCIsCi0JCU1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDIsIDAsCi0JCSZkZWMzX211eCwgbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2RlYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkRFQzQgTVVYIiwKLQkJTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTCwgMywgMCwKLQkJJmRlYzRfbXV4LCBtc21fZGlnX2NkY19jb2RlY19lbmFibGVfZGVjLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiREVDNSBNVVgiLAotCQlNU004OVhYX0NEQ19DT1JFX0NMS19UWF9DTEtfRU5fQjFfQ1RMLCA0LCAwLAotCQkmZGVjc3ZhX211eCwgbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2RlYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQkvKiBTaWRldG9uZSAqLwotCVNORF9TT0NfREFQTV9NVVgoIklJUjEgSU5QMSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIxX2lucDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIklJUjEiLCBNU004OVhYX0NEQ19DT1JFX0NMS19TRF9DVEwsIDAsIDAsIE5VTEwsIDAsCi0JCW1zbV9kaWdfY2RjX2NvZGVjX3NldF9paXJfZ2FpbiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIklJUjIgSU5QMSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIyX2lucDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIklJUjIiLCBNU004OVhYX0NEQ19DT1JFX0NMS19TRF9DVEwsIDEsIDAsIE5VTEwsIDAsCi0JCW1zbV9kaWdfY2RjX2NvZGVjX3NldF9paXJfZ2FpbiwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQotCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYX0kyU19DTEsiLAotCQlNU004OVhYX0NEQ19DT1JFX0NMS19SWF9JMlNfQ1RMLCA0LCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJUWF9JMlNfQ0xLIiwKLQkJTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfSTJTX0NUTCwgNCwgMCwgTlVMTCwgMCksCi0KLQotCVNORF9TT0NfREFQTV9NVVgoIkkyUyBUWDIgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSZpMnNfdHgyX2lucDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJJMlMgVFgyIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkmaTJzX3R4Ml9pbnAyX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiSTJTIFRYMyBJTlAyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJJmkyc190eDNfaW5wMl9tdXgpLAotCi0JLyogRGlnaXRhbCBNaWMgSW5wdXRzICovCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMSIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzIiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCW1zbV9kaWdfY2RjX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMzIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQltc21fZGlnX2NkY19jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDNCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJbXNtX2RpZ19jZGNfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9JTlBVVCgiQURDMV9JTiIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQURDMl9JTiIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQURDM19JTiIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIlBETV9PVVRfUlgxIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiUERNX09VVF9SWDIiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJQRE1fT1VUX1JYMyIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWMxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWMyX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYMl9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWMzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYM19NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWM0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMLCA0LCAzLCBjZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9kZWNzdmFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKE1TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVEwsIDQsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX2RpZ19zbmRfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX1NYX1RMVigiREVDMSBWb2x1bWUiLAotCQlNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0dBSU4sCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzIgVm9sdW1lIiwKLQkJICBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0dBSU4sCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzMgVm9sdW1lIiwKLQkJICBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU4sCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzQgVm9sdW1lIiwKLQkJICBNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX0dBSU4sCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzUgVm9sdW1lIiwKLQkJICBNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0dBSU4sCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0KLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAxIFZvbHVtZSIsCi0JCQkgIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IxX0NUTCwKLQkJCTAsICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDIgVm9sdW1lIiwKLQkJCSAgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjJfQ1RMLAotCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMyBWb2x1bWUiLAotCQkJICBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CM19DVEwsCi0JCQkwLCAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlA0IFZvbHVtZSIsCi0JCQkgIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I0X0NUTCwKLQkJCTAsICAtODQsCTQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIyIElOUDEgVm9sdW1lIiwKLQkJCSAgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjFfQ1RMLAotCQkJMCwgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0KLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgxIERpZ2l0YWwgVm9sdW1lIiwKLQkJTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMiBEaWdpdGFsIFZvbHVtZSIsCi0JCU1TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjJfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgRGlnaXRhbCBWb2x1bWUiLAotCQlNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IyX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMSIsIElJUjEsIEJBTkQxLCAxLCAwLAotCQltc21fZGlnX2NkY19nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMiIsIElJUjEsIEJBTkQyLCAxLCAwLAotCQltc21fZGlnX2NkY19nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMyIsIElJUjEsIEJBTkQzLCAxLCAwLAotCQltc21fZGlnX2NkY19nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAxLCAwLAotCQltc21fZGlnX2NkY19nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAxLCAwLAotCQltc21fZGlnX2NkY19nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCi0JU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQxIiwgSUlSMiwgQkFORDEsIDEsIDAsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQyIiwgSUlSMiwgQkFORDIsIDEsIDAsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQzIiwgSUlSMiwgQkFORDMsIDEsIDAsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQ0IiwgSUlSMiwgQkFORDQsIDEsIDAsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjIgRW5hYmxlIEJhbmQ1IiwgSUlSMiwgQkFORDUsIDEsIDAsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0KLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMSIsIElJUjEsIEJBTkQxLCAyNTUsIDAsIDUsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMiIsIElJUjEsIEJBTkQyLCAyNTUsIDAsIDUsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMyIsIElJUjEsIEJBTkQzLCAyNTUsIDAsIDUsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAyNTUsIDAsIDUsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNSIsIElJUjEsIEJBTkQ1LCAyNTUsIDAsIDUsCi0JCW1zbV9kaWdfY2RjX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwKLQkJbXNtX2RpZ19jZGNfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQxIiwgSUlSMiwgQkFORDEsIDI1NSwgMCwgNSwKLQkJbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQyIiwgSUlSMiwgQkFORDIsIDI1NSwgMCwgNSwKLQkJbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQzIiwgSUlSMiwgQkFORDMsIDI1NSwgMCwgNSwKLQkJbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQ0IiwgSUlSMiwgQkFORDQsIDI1NSwgMCwgNSwKLQkJbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIyIEJhbmQ1IiwgSUlSMiwgQkFORDUsIDI1NSwgMCwgNSwKLQkJbXNtX2RpZ19jZGNfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLAotCQltc21fZGlnX2NkY19wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCi0JU09DX1NJTkdMRSgiUlgxIEhQRiBTd2l0Y2giLAotCQlNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwsIDIsIDEsIDApLAotCVNPQ19TSU5HTEUoIlJYMiBIUEYgU3dpdGNoIiwKLQkJTVNNODlYWF9DRENfQ09SRV9SWDJfQjVfQ1RMLCAyLCAxLCAwKSwKLQlTT0NfU0lOR0xFKCJSWDMgSFBGIFN3aXRjaCIsCi0JCU1TTTg5WFhfQ0RDX0NPUkVfUlgzX0I1X0NUTCwgMiwgMSwgMCksCi0KLQlTT0NfRU5VTSgiUlgxIEhQRiBjdXQgb2ZmIiwgY2ZfcnhtaXgxX2VudW0pLAotCVNPQ19FTlVNKCJSWDIgSFBGIGN1dCBvZmYiLCBjZl9yeG1peDJfZW51bSksCi0JU09DX0VOVU0oIlJYMyBIUEYgY3V0IG9mZiIsIGNmX3J4bWl4M19lbnVtKSwKLQotCVNPQ19FTlVNKCJUWDEgSFBGIGN1dCBvZmYiLCBjZl9kZWMxX2VudW0pLAotCVNPQ19FTlVNKCJUWDIgSFBGIGN1dCBvZmYiLCBjZl9kZWMyX2VudW0pLAotCVNPQ19FTlVNKCJUWDMgSFBGIGN1dCBvZmYiLCBjZl9kZWMzX2VudW0pLAotCVNPQ19FTlVNKCJUWDQgSFBGIGN1dCBvZmYiLCBjZl9kZWM0X2VudW0pLAotCVNPQ19FTlVNKCJUWDUgSFBGIGN1dCBvZmYiLCBjZl9kZWNzdmFfZW51bSksCi0JU09DX1NJTkdMRSgiVFgxIEhQRiBTd2l0Y2giLAotCQlNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMLCAzLCAxLCAwKSwKLQlTT0NfU0lOR0xFKCJUWDIgSFBGIFN3aXRjaCIsCi0JCU1TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVEwsIDMsIDEsIDApLAotCVNPQ19TSU5HTEUoIlRYMyBIUEYgU3dpdGNoIiwKLQkJTVNNODlYWF9DRENfQ09SRV9UWDNfTVVYX0NUTCwgMywgMSwgMCksCi0JU09DX1NJTkdMRSgiVFg0IEhQRiBTd2l0Y2giLAotCQlNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMLCAzLCAxLCAwKSwKLQlTT0NfU0lOR0xFKCJUWDUgSFBGIFN3aXRjaCIsCi0JCU1TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVEwsIDMsIDEsIDApLAotfTsKLQotc3RhdGljIGludCBtc21fZGlnX2NkY19kaWdpdGFsX211dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBtdXRlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7Ci0JdTE2IHR4X3ZvbF9jdGxfcmVnID0gMDsKLQl1OCBkZWNpbWF0b3IgPSAwLCBpOwotCXN0cnVjdCBtc21fZGlnX3ByaXYgKmRpZ19jZGM7Ci0KLQlwcl9kZWJ1ZygiJXM6IERpZ2l0YWwgTXV0ZSB2YWwgPSAlZFxuIiwgX19mdW5jX18sIG11dGUpOwotCi0JaWYgKCFkYWkgfHwgIWRhaS0+Y29kZWMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvZGVjID0gZGFpLT5jb2RlYzsKLQlkaWdfY2RjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoZGFpLT5pZCA9PSBBSUYxX1BCKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBOb3QgY2FwdHVyZSB1c2UgY2FzZSBza2lwXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRlID0gKG11dGUpID8gMSA6IDA7Ci0JaWYgKCFtdXRlKSB7Ci0JCS8qCi0JCSAqIDE1IG1zIGlzIGFuIGVtcGVyaWNhbCB2YWx1ZSBmb3IgdGhlIG11dGUgdGltZQotCQkgKiB0aGF0IHdhcyBhcnJpdmVkIGJ5IGNoZWNraW5nIHRoZSBwb3AgbGV2ZWwKLQkJICogdG8gYmUgaW5hdWRpYmxlCi0JCSAqLwotCQl1c2xlZXBfcmFuZ2UoMTUwMDAsIDE1MDEwKTsKLQl9Ci0KLQlpZiAoZGFpLT5pZCA9PSBBSUYzX1NWQSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJTVNNODlYWF9DRENfQ09SRV9UWDVfVk9MX0NUTF9DRkcsIDB4MDEsIG11dGUpOwotCQlnb3RvIHJldDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IChOVU1fREVDSU1BVE9SUyAtIDEpOyBpKyspIHsKLQkJaWYgKGRpZ19jZGMtPmRlY19hY3RpdmVbaV0pCi0JCQlkZWNpbWF0b3IgPSBpICsgMTsKLQkJaWYgKGRlY2ltYXRvciAmJiBkZWNpbWF0b3IgPCBOVU1fREVDSU1BVE9SUykgewotCQkJLyogbXV0ZS91bm11dGUgZGVjaW1hdG9ycyBjb3JyZXNwb25kaW5nIHRvIFR4IERBSSdzICovCi0JCQl0eF92b2xfY3RsX3JlZyA9Ci0JCQlNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0NGRyArCi0JCQkJCTMyICogKGRlY2ltYXRvciAtIDEpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfdm9sX2N0bF9yZWcsCi0JCQkJCSAgICAweDAxLCBtdXRlKTsKLQkJfQotCQlkZWNpbWF0b3IgPSAwOwotCX0KLXJldDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2RpZ19kYWlfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fZGlnX2NkY19od19wYXJhbXMsCi0JLmRpZ2l0YWxfbXV0ZSA9IG1zbV9kaWdfY2RjX2RpZ2l0YWxfbXV0ZSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2NvZGVjX2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIm1zbV9kaWdfY2RjX2RhaV9yeDEiLAotCQkuaWQgPSBBSUYxX1BCLAotCQkucGxheWJhY2sgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLwotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCi0JCX0sCi0JCSAub3BzID0gJm1zbV9kaWdfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAibXNtX2RpZ19jZGNfZGFpX3R4MSIsCi0JCS5pZCA9IEFJRjFfQ0FQLAotCQkuY2FwdHVyZSA9IHsgLyogU3VwcG9ydCBtYXhpbXVtIHJhbmdlICovCi0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJfSwKLQkJIC5vcHMgPSAmbXNtX2RpZ19kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJtc21fZGlnX2NkY19kYWlfdHgyIiwKLQkJLmlkID0gQUlGM19TVkEsCi0JCS5jYXB0dXJlID0geyAvKiBTdXBwb3J0IG1heGltdW0gcmFuZ2UgKi8KLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQl9LAotCQkgLm9wcyA9ICZtc21fZGlnX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIm1zbV9kaWdfY2RjX2RhaV92aWZlZWQiLAotCQkuaWQgPSBBSUYyX1ZJRkVFRCwKLQkJLmNhcHR1cmUgPSB7IC8qIFN1cHBvcnQgbWF4aW11bSByYW5nZSAqLwotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCX0sCi0JCSAub3BzID0gJm1zbV9kaWdfZGFpX29wcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWdtYXAgKm1zbV9kaWdpdGFsX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBtc21fZGlnX3ByaXYgKm1zbV9kaWdfY2RjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gbXNtX2RpZ19jZGMtPnJlZ21hcDsKLX0KLQotc3RhdGljIGludCBtc21fZGlnX2NkY19zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICptc21fZGlnX2NkYyA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKLQotCW1zbV9kaWdfY2RjLT5kYXBtX2JpYXNfb2ZmID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGlnX2NkY19yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBtc21fZGlnX3ByaXYgKm1zbV9kaWdfY2RjID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOwotCi0JbXNtX2RpZ19jZGMtPmRhcG1fYmlhc19vZmYgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19tc21fZGlnX2NvZGVjID0gewotCS5wcm9iZSAgPSBtc21fZGlnX2NkY19zb2NfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9kaWdfY2RjX3NvY19yZW1vdmUsCi0JLnN1c3BlbmQgPSBtc21fZGlnX2NkY19zdXNwZW5kLAotCS5yZXN1bWUgPSBtc21fZGlnX2NkY19yZXN1bWUsCi0JLmdldF9yZWdtYXAgPSBtc21fZGlnaXRhbF9nZXRfcmVnbWFwLAotCS5jb21wb25lbnRfZHJpdmVyID0gewotCQkuY29udHJvbHMgPSBtc21fZGlnX3NuZF9jb250cm9scywKLQkJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobXNtX2RpZ19zbmRfY29udHJvbHMpLAotCQkuZGFwbV93aWRnZXRzID0gbXNtX2RpZ19kYXBtX3dpZGdldHMsCi0JCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtc21fZGlnX2RhcG1fd2lkZ2V0cyksCi0JCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX2RpZ19tYXAsCi0JCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX2RpZ19tYXApLAotCX0sCi19OwotCi1jb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtc21fZGlnaXRhbF9yZWdtYXBfY29uZmlnID0gewotCS5yZWdfYml0cyA9IDMyLAotCS5yZWdfc3RyaWRlID0gNCwKLQkudmFsX2JpdHMgPSA4LAotCS5sb2NrID0gZW5hYmxlX2RpZ2l0YWxfY2FsbGJhY2ssCi0JLnVubG9jayA9IGRpc2FibGVfZGlnaXRhbF9jYWxsYmFjaywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCi0JLnJlZ19kZWZhdWx0cyA9IG1zbTg5eHhfY2RjX2NvcmVfZGVmYXVsdHMsCi0JLm51bV9yZWdfZGVmYXVsdHMgPSBNU004OVhYX0NEQ19DT1JFX01BWF9SRUdJU1RFUiwKLQkud3JpdGVhYmxlX3JlZyA9IG1zbTg5eHhfY2RjX2NvcmVfd3JpdGVhYmxlX3JlZywKLQkucmVhZGFibGVfcmVnID0gbXNtODl4eF9jZGNfY29yZV9yZWFkYWJsZV9yZWcsCi0JLnZvbGF0aWxlX3JlZyA9IG1zbTg5eHhfY2RjX2NvcmVfdm9sYXRpbGVfcmVnLAotCS5yZWdfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAotCS52YWxfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAotCS5tYXhfcmVnaXN0ZXIgPSBNU004OVhYX0NEQ19DT1JFX01BWF9SRUdJU1RFUiwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0OwotCXUzMiBkaWdfY2RjX2FkZHI7Ci0Jc3RydWN0IG1zbV9kaWdfcHJpdiAqbXNtX2RpZ19jZGM7Ci0Jc3RydWN0IGRpZ19jdHJsX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCi0JbXNtX2RpZ19jZGMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBtc21fZGlnX3ByaXYpLAotCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21fZGlnX2NkYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHBkYXRhIGZyb20gcGFyZW50IGlzIE5VTExcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gcnRuOwotCX0KLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicmVnIiwKLQkJCQkJJmRpZ19jZGNfYWRkcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogY291bGQgbm90IGZpbmQgJXMgZW50cnkgaW4gZHRcbiIsCi0JCQlfX2Z1bmNfXywgInJlZyIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW1zbV9kaWdfY2RjLT5kaWdfYmFzZSA9IGlvcmVtYXAoZGlnX2NkY19hZGRyLAotCQkJCQlNU004OVhYX0NEQ19DT1JFX01BWF9SRUdJU1RFUik7Ci0JaWYgKG1zbV9kaWdfY2RjLT5kaWdfYmFzZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltc21fZGlnX2NkYy0+cmVnbWFwID0KLQkJZGV2bV9yZWdtYXBfaW5pdF9tbWlvX2NsaygmcGRldi0+ZGV2LCBOVUxMLAotCQkJbXNtX2RpZ19jZGMtPmRpZ19iYXNlLCAmbXNtX2RpZ2l0YWxfcmVnbWFwX2NvbmZpZyk7Ci0KLQltc21fZGlnX2NkYy0+dXBkYXRlX2Nsa2RpdiA9IHBkYXRhLT51cGRhdGVfY2xrZGl2OwotCW1zbV9kaWdfY2RjLT5nZXRfY2RjX3ZlcnNpb24gPSBwZGF0YS0+Z2V0X2NkY192ZXJzaW9uOwotCW1zbV9kaWdfY2RjLT5oYW5kbGUgPSBwZGF0YS0+aGFuZGxlOwotCW1zbV9kaWdfY2RjLT5yZWdpc3Rlcl9ub3RpZmllciA9IHBkYXRhLT5yZWdpc3Rlcl9ub3RpZmllcjsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtc21fZGlnX2NkYyk7Ci0Jc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX21zbV9kaWdfY29kZWMsCi0JCQkJbXNtX2NvZGVjX2RhaXMsIEFSUkFZX1NJWkUobXNtX2NvZGVjX2RhaXMpKTsKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcmVnaXN0ZXJlZCBESUcgQ09ERUMgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBkaWdfY2RjX2FkZHIpOwotcnRuOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RpZ19jZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IG1zbV9kaWdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IG1zbV9kaWdfcHJpdiAqbXNtX2RpZ19jZGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmICghcmVnaXN0ZXJlZF9kaWdjb2RlYyB8fCAhbXNtX2RpZ19jZGMpIHsKLQkJcHJfZGVidWcoIiVzOmRpZ2NvZGVjIG5vdCBpbml0aWFsaXplZCwgcmV0dXJuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShyZWdpc3RlcmVkX2RpZ2NvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0JaWYgKCFwZGF0YSkgewotCQlwcl9kZWJ1ZygiJXM6Y2FyZCBub3QgaW5pdGlhbGl6ZWQsIHJldHVyblxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG1zbV9kaWdfY2RjLT5kYXBtX2JpYXNfb2ZmKSB7Ci0JCXByX2RlYnVnKCIlczogbWNsayBjbnQgPSAlZCwgbWNsa19lbmFibGVkID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZiksCi0JCQlhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSk7Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQpID09IHRydWUpIHsKLQkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKLQkJCQkmcGRhdGEtPmRpc2FibGVfaW50X21jbGswX3dvcmspOwotCQkJbXV0ZXhfbG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOwotCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDA7Ci0JCQlhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWCwKLQkJCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOwotCQkJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkLCBmYWxzZSk7Ci0JCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kaWdfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG1zbV9kaWdfcG1fb3BzID0gewotCS5zdXNwZW5kX2xhdGUgPSBtc21fZGlnX3N1c3BlbmQsCi0JLnJlc3VtZV9lYXJseSA9IG1zbV9kaWdfcmVzdW1lLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGlnX2NkY19vZl9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kaWdpdGFsLWNvZGVjIn0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGlnY29kZWNfZHJpdmVyID0gewotCS5kcml2ZXIgICAgICAgICAgICAgICAgID0gewotCQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkJLm5hbWUgICAgICAgICAgID0gRFJWX05BTUUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kaWdfY2RjX29mX21hdGNoLAotI2lmZGVmIENPTkZJR19QTQotCS5wbSA9ICZtc21fZGlnX3BtX29wcywKLSNlbmRpZgotCX0sCi0JLnByb2JlICAgICAgICAgICAgICAgICAgPSBtc21fZGlnX2NkY19wcm9iZSwKLQkucmVtb3ZlICAgICAgICAgICAgICAgICA9IG1zbV9kaWdfY2RjX3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1zbV9kaWdjb2RlY19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSBBdWRpbyBEaWdpdGFsIGNvZGVjIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL21zbS1kaWdpdGFsLWNkYy5oIGIvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL21zbS1kaWdpdGFsLWNkYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU3YTljLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9tc20tZGlnaXRhbC1jZGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIE1TTV9ESUdJVEFMX0NEQ19ICi0jZGVmaW5lIE1TTV9ESUdJVEFMX0NEQ19ICi0KLSNkZWZpbmUgSFBITF9QQV9ESVNBQkxFICgweDAxIDw8IDEpCi0jZGVmaW5lIEhQSFJfUEFfRElTQUJMRSAoMHgwMSA8PCAyKQotI2RlZmluZSBTUEtSX1BBX0RJU0FCTEUgKDB4MDEgPDwgMykKLQotI2RlZmluZSBOVU1fREVDSU1BVE9SUwk1Ci0vKiBDb2RlYyBzdXBwb3J0cyAxIGNvbXBhbmRlciAqLwotZW51bSB7Ci0JQ09NUEFOREVSX05PTkUgPSAwLAotCUNPTVBBTkRFUl8xLCAvKiBIUEhML1IgKi8KLQlDT01QQU5ERVJfTUFYLAotfTsKLQotLyogTnVtYmVyIG9mIG91dHB1dCBJMlMgcG9ydCAqLwotZW51bSB7Ci0JTVNNODlYWF9SWDEgPSAwLAotCU1TTTg5WFhfUlgyLAotCU1TTTg5WFhfUlgzLAotCU1TTTg5WFhfUlhfTUFYLAotfTsKLQotc3RydWN0IG1zbV9kaWdfcHJpdiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXUzMiBjb21wX2VuYWJsZWRbTVNNODlYWF9SWF9NQVhdOwotCWludCAoKmNvZGVjX2hwaF9jb21wX2dwaW8pKGJvb2wgZW5hYmxlLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotCXMzMiBkbWljXzFfMl9jbGtfY250OwotCXMzMiBkbWljXzNfNF9jbGtfY250OwotCWJvb2wgZGVjX2FjdGl2ZVtOVU1fREVDSU1BVE9SU107Ci0JaW50IHZlcnNpb247Ci0JLyogRW50cnkgZm9yIHZlcnNpb24gaW5mbyAqLwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OwotCWNoYXIgX19pb21lbSAqZGlnX2Jhc2U7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYmxvY2s7Ci0JdTMyIG11dGVfbWFzazsKLQlpbnQgZGFwbV9iaWFzX29mZjsKLQl2b2lkICpoYW5kbGU7Ci0Jdm9pZCAoKnVwZGF0ZV9jbGtkaXYpKHZvaWQgKmhhbmRsZSwgaW50IHZhbCk7Ci0JaW50ICgqZ2V0X2NkY192ZXJzaW9uKSh2b2lkICpoYW5kbGUpOwotCWludCAoKnJlZ2lzdGVyX25vdGlmaWVyKSh2b2lkICpoYW5kbGUsCi0JCQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmJsb2NrLAotCQkJCSBib29sIGVuYWJsZSk7Ci19OwotCi1zdHJ1Y3QgZGlnX2N0cmxfcGxhdGZvcm1fZGF0YSB7Ci0Jdm9pZCAqaGFuZGxlOwotCXZvaWQgKCp1cGRhdGVfY2xrZGl2KSh2b2lkICpoYW5kbGUsIGludCB2YWwpOwotCWludCAoKmdldF9jZGNfdmVyc2lvbikodm9pZCAqaGFuZGxlKTsKLQlpbnQgKCpyZWdpc3Rlcl9ub3RpZmllcikodm9pZCAqaGFuZGxlLAotCQkJCSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaywKLQkJCQkgYm9vbCBlbmFibGUpOwotfTsKLQotc3RydWN0IGhwZl93b3JrIHsKLQlzdHJ1Y3QgbXNtX2RpZ19wcml2ICpkaWdfY2RjOwotCXUzMiBkZWNpbWF0b3I7Ci0JdTggdHhfaHBmX2N1dF9vZl9mcmVxOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcms7Ci19OwotCi0vKiBDb2RlYyBzdXBwb3J0cyA1IGJhbmRzICovCi1lbnVtIHsKLQlCQU5EMSA9IDAsCi0JQkFORDIsCi0JQkFORDMsCi0JQkFORDQsCi0JQkFORDUsCi0JQkFORF9NQVgsCi19OwotCi1leHRlcm4gdm9pZCBtc21fZGlnX2NkY19ocGhfY29tcF9jYigKLQkJaW50ICgqY29kZWNfaHBoX2NvbXBfZ3BpbykoCi0JCQlib29sIGVuYWJsZSwgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKSwKLQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLWludCBtc21fZGlnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvc2RtNjYwLWNkYy1pcnEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtY2RjLWlycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTRlYzM0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtY2RjLWlycS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BtaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9wbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgIm1zbS1hbmFsb2ctY2RjLmgiCi0jaW5jbHVkZSAic2RtNjYwLWNkYy1pcnEuaCIKLSNpbmNsdWRlICJzZG02NjAtY2RjLXJlZ2lzdGVycy5oIgotCi0jZGVmaW5lIE1BWF9OVU1fSVJRUyAxNAotI2RlZmluZSBOVU1fSVJRX1JFR1MgMgotI2RlZmluZSBXQ0Q5WFhYX1NZU1RFTV9SRVNVTUVfVElNRU9VVF9NUyA3MDAKLQotI2RlZmluZSBCWVRFX0JJVF9NQVNLKG5yKSAoMVVMIDw8ICgobnIpICUgQklUU19QRVJfQllURSkpCi0jZGVmaW5lIEJJVF9CWVRFKG5yKSAoKG5yKSAvIEJJVFNfUEVSX0JZVEUpCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2Q5eHh4X3NwbWlfaXJxX2hhbmRsZXIoaW50IGxpbnV4X2lycSwgdm9pZCAqZGF0YSk7Ci0KLWNoYXIgKmlycV9uYW1lc1tNQVhfTlVNX0lSUVNdID0gewotCSJzcGtfY25wX2ludCIsCi0JInNwa19jbGlwX2ludCIsCi0JInNwa19vY3BfaW50IiwKLQkiaW5zX3JlbV9kZXQxIiwKLQkiYnV0X3JlbF9kZXQiLAotCSJidXRfcHJlc3NfZGV0IiwKLQkiaW5zX3JlbV9kZXQiLAotCSJtYmhjX2ludCIsCi0JImVhcl9vY3BfaW50IiwKLQkiaHBocl9vY3BfaW50IiwKLQkiaHBobF9vY3BfZGV0IiwKLQkiZWFyX2NucF9pbnQiLAotCSJocGhyX2NucF9pbnQiLAotCSJocGhsX2NucF9pbnQiCi19OwotCi1pbnQgb3JkZXJbTUFYX05VTV9JUlFTXSA9IHsKLQlNU004OVhYX0lSUV9TUEtSX0NOUCwKLQlNU004OVhYX0lSUV9TUEtSX0NMSVAsCi0JTVNNODlYWF9JUlFfU1BLUl9PQ1AsCi0JTVNNODlYWF9JUlFfTUJIQ19JTlNSRU1fREVUMSwKLQlNU004OVhYX0lSUV9NQkhDX1JFTEVBU0UsCi0JTVNNODlYWF9JUlFfTUJIQ19QUkVTUywKLQlNU004OVhYX0lSUV9NQkhDX0lOU1JFTV9ERVQsCi0JTVNNODlYWF9JUlFfTUJIQ19IU19ERVQsCi0JTVNNODlYWF9JUlFfRUFSX09DUCwKLQlNU004OVhYX0lSUV9IUEhSX09DUCwKLQlNU004OVhYX0lSUV9IUEhMX09DUCwKLQlNU004OVhYX0lSUV9FQVJfQ05QLAotCU1TTTg5WFhfSVJRX0hQSFJfQ05QLAotCU1TTTg5WFhfSVJRX0hQSExfQ05QLAotfTsKLQotZW51bSB3Y2Q5eHh4X3NwbWlfcG1fc3RhdGUgewotCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAotCVdDRDlYWFhfUE1fQVdBS0UsCi0JV0NEOVhYWF9QTV9BU0xFRVAsCi19OwotCi1zdHJ1Y3Qgd2NkOXh4eF9zcG1pX21hcCB7Ci0JdWludDhfdCBoYW5kbGVkW05VTV9JUlFfUkVHU107Ci0JdWludDhfdCBtYXNrW05VTV9JUlFfUkVHU107Ci0JaW50IGxpbnV4aXJxW01BWF9OVU1fSVJRU107Ci0JaXJxX2hhbmRsZXJfdCBoYW5kbGVyW01BWF9OVU1fSVJRU107Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BtaVtOVU1fSVJRX1JFR1NdOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCWVudW0gd2NkOXh4eF9zcG1pX3BtX3N0YXRlIHBtX3N0YXRlOwotCXN0cnVjdCBtdXRleCBwbV9sb2NrOwotCS8qIHBtX3dxIG5vdGlmaWVzIGNoYW5nZSBvZiBwbV9zdGF0ZSAqLwotCXdhaXRfcXVldWVfaGVhZF90IHBtX3dxOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCBwbV9xb3NfcmVxOwotCWludCB3bG9ja19ob2xkZXJzOwotfTsKLQotc3RydWN0IHdjZDl4eHhfc3BtaV9tYXAgbWFwOwotCi12b2lkIHdjZDl4eHhfc3BtaV9lbmFibGVfaXJxKGludCBpcnEpCi17Ci0JcHJfZGVidWcoIiVzOiBpcnFubyA9JWRcbiIsIF9fZnVuY19fLCBpcnEpOwotCi0JaWYgKCEobWFwLm1hc2tbQklUX0JZVEUoaXJxKV0gJiAoQllURV9CSVRfTUFTSyhpcnEpKSkpCi0JCXJldHVybjsKLQotCW1hcC5tYXNrW0JJVF9CWVRFKGlycSldICY9Ci0JCX4oQllURV9CSVRfTUFTSyhpcnEpKTsKLQotCWVuYWJsZV9pcnEobWFwLmxpbnV4aXJxW2lycV0pOwotfQotCi12b2lkIHdjZDl4eHhfc3BtaV9kaXNhYmxlX2lycShpbnQgaXJxKQotewotCXByX2RlYnVnKCIlczogaXJxbm8gPSVkXG4iLCBfX2Z1bmNfXywgaXJxKTsKLQotCWlmIChtYXAubWFza1tCSVRfQllURShpcnEpXSAmIChCWVRFX0JJVF9NQVNLKGlycSkpKQotCQlyZXR1cm47Ci0KLQltYXAubWFza1tCSVRfQllURShpcnEpXSB8PQotCQkoQllURV9CSVRfTUFTSyhpcnEpKTsKLQotCWRpc2FibGVfaXJxX25vc3luYyhtYXAubGludXhpcnFbaXJxXSk7Ci19Ci0KLWludCB3Y2Q5eHh4X3NwbWlfcmVxdWVzdF9pcnEoaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdikKLXsKLQlpbnQgcmM7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQltYXAubGludXhpcnFbaXJxXSA9Ci0JCXBsYXRmb3JtX2dldF9pcnFfYnluYW1lKG1hcC5zcG1pW0JJVF9CWVRFKGlycSldLAotCQkJCQlpcnFfbmFtZXNbaXJxXSk7Ci0KLQlpZiAoc3RyY21wKG5hbWUsICJtYmhjIHN3IGludHIiKSkKLQkJaXJxX2ZsYWdzID0gSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HIHwKLQkJCUlSUUZfT05FU0hPVDsKLQllbHNlCi0JCWlycV9mbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORyB8Ci0JCQlJUlFGX09ORVNIT1QgfCBJUlFGX05PX1NVU1BFTkQ7Ci0JcHJfZGVidWcoIiVzOiBuYW1lOiVzIGlycV9mbGFncyA9ICVseFxuIiwgX19mdW5jX18sIG5hbWUsIGlycV9mbGFncyk7Ci0KLQlyYyA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJm1hcC5zcG1pW0JJVF9CWVRFKGlycSldLT5kZXYsCi0JCQkJbWFwLmxpbnV4aXJxW2lycV0sIE5VTEwsCi0JCQkJd2NkOXh4eF9zcG1pX2lycV9oYW5kbGVyLAotCQkJCWlycV9mbGFncywKLQkJCQluYW1lLCBwcml2KTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGV2X2VycigmbWFwLnNwbWlbQklUX0JZVEUoaXJxKV0tPmRldiwKLQkJCQkiQ2FuJ3QgcmVxdWVzdCAlZCBJUlFcbiIsIGlycSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCWRldl9kYmcoJm1hcC5zcG1pW0JJVF9CWVRFKGlycSldLT5kZXYsCi0JCQkiaXJxICVkIGxpbnV4SVJROiAlZFxuIiwgaXJxLCBtYXAubGludXhpcnFbaXJxXSk7Ci0JbWFwLm1hc2tbQklUX0JZVEUoaXJxKV0gJj0gfkJZVEVfQklUX01BU0soaXJxKTsKLQltYXAuaGFuZGxlcltpcnFdID0gaGFuZGxlcjsKLQllbmFibGVfaXJxX3dha2UobWFwLmxpbnV4aXJxW2lycV0pOwotCXJldHVybiAwOwotfQotCi1pbnQgd2NkOXh4eF9zcG1pX2ZyZWVfaXJxKGludCBpcnEsIHZvaWQgKnByaXYpCi17Ci0JZGV2bV9mcmVlX2lycSgmbWFwLnNwbWlbQklUX0JZVEUoaXJxKV0tPmRldiwgbWFwLmxpbnV4aXJxW2lycV0sCi0JCQkJCQlwcml2KTsKLQltYXAubWFza1tCSVRfQllURShpcnEpXSB8PSBCWVRFX0JJVF9NQVNLKGlycSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2lycV9iaXQoaW50IGxpbnV4X2lycSkKLXsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKDsgaSA8IE1BWF9OVU1fSVJRUzsgaSsrKQotCQlpZiAobWFwLmxpbnV4aXJxW2ldID09IGxpbnV4X2lycSkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X29yZGVyX2lycShpbnQgIGkpCi17Ci0JcmV0dXJuIG9yZGVyW2ldOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2NkOXh4eF9zcG1pX2lycV9oYW5kbGVyKGludCBsaW51eF9pcnEsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGlycSwgaSwgajsKLQl1bnNpZ25lZCBsb25nIHN0YXR1c1tOVU1fSVJRX1JFR1NdID0gezB9OwotCi0JaWYgKHVubGlrZWx5KHdjZDl4eHhfc3BtaV9sb2NrX3NsZWVwKCkgPT0gZmFsc2UpKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGhvbGQgc3VzcGVuZFxuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlpcnEgPSBnZXRfaXJxX2JpdChsaW51eF9pcnEpOwotCWlmIChpcnEgPT0gTUFYX05VTV9JUlFTKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlzdGF0dXNbQklUX0JZVEUoaXJxKV0gfD0gQllURV9CSVRfTUFTSyhpcnEpOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fSVJRX1JFR1M7IGkrKykgewotCQlzdGF0dXNbaV0gfD0gc25kX3NvY19yZWFkKG1hcC5jb2RlYywKLQkJCQlCSVRfQllURShpcnEpICogMHgxMDAgKwotCQkJTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfU1RTKTsKLQkJc3RhdHVzW2ldICY9IH5tYXAubWFza1tpXTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fSVJRUzsgaSsrKSB7Ci0JCWogPSBnZXRfb3JkZXJfaXJxKGkpOwotCQlpZiAoKHN0YXR1c1tCSVRfQllURShqKV0gJiBCWVRFX0JJVF9NQVNLKGopKSAmJgotCQkJKChtYXAuaGFuZGxlZFtCSVRfQllURShqKV0gJgotCQkJQllURV9CSVRfTUFTSyhqKSkgPT0gMCkpIHsKLQkJCW1hcC5oYW5kbGVyW2pdKGlycSwgZGF0YSk7Ci0JCQltYXAuaGFuZGxlZFtCSVRfQllURShqKV0gfD0KLQkJCQkJQllURV9CSVRfTUFTSyhqKTsKLQkJfQotCX0KLQltYXAuaGFuZGxlZFtCSVRfQllURShpcnEpXSAmPSB+QllURV9CSVRfTUFTSyhpcnEpOwotCXdjZDl4eHhfc3BtaV91bmxvY2tfc2xlZXAoKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotZW51bSB3Y2Q5eHh4X3NwbWlfcG1fc3RhdGUgd2NkOXh4eF9zcG1pX3BtX2NtcHhjaGcoCi0JCWVudW0gd2NkOXh4eF9zcG1pX3BtX3N0YXRlIG8sCi0JCWVudW0gd2NkOXh4eF9zcG1pX3BtX3N0YXRlIG4pCi17Ci0JZW51bSB3Y2Q5eHh4X3NwbWlfcG1fc3RhdGUgb2xkOwotCi0JbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOwotCW9sZCA9IG1hcC5wbV9zdGF0ZTsKLQlpZiAob2xkID09IG8pCi0JCW1hcC5wbV9zdGF0ZSA9IG47Ci0JcHJfZGVidWcoIiVzOiBtYXAucG1fc3RhdGUgPSAlZFxuIiwgX19mdW5jX18sIG1hcC5wbV9zdGF0ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZtYXAucG1fbG9jayk7Ci0JcmV0dXJuIG9sZDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9zcG1pX3BtX2NtcHhjaGcpOwotCi1pbnQgd2NkOXh4eF9zcG1pX3N1c3BlbmQocG1fbWVzc2FnZV90IHBtZXNnKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCS8qCi0JICogcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCkgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGlzIHN1c3BlbmQgY2hhaW4gY2FsbAotCSAqIHN0YXJ0ZWQuIHRodXMgc3VzcGVuZCBjYW4gYmUgY2FsbGVkIHdoaWxlIGxvY2sgaXMgYmVpbmcgaGVsZAotCSAqLwotCW11dGV4X2xvY2soJm1hcC5wbV9sb2NrKTsKLQlpZiAobWFwLnBtX3N0YXRlID09IFdDRDlYWFhfUE1fU0xFRVBBQkxFKSB7Ci0JCXByX2RlYnVnKCIlczogc3VzcGVuZGluZyBzeXN0ZW0sIHN0YXRlICVkLCB3bG9jayAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlLAotCQkJIG1hcC53bG9ja19ob2xkZXJzKTsKLQkJbWFwLnBtX3N0YXRlID0gV0NEOVhYWF9QTV9BU0xFRVA7Ci0JfSBlbHNlIGlmIChtYXAucG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9BV0FLRSkgewotCQkvKgotCQkgKiB1bmxvY2sgdG8gd2FpdCBmb3IgcG1fc3RhdGUgPT0gV0NEOVhYWF9QTV9TTEVFUEFCTEUKLQkJICogdGhlbiBzZXQgdG8gV0NEOVhYWF9QTV9BU0xFRVAKLQkJICovCi0JCXByX2RlYnVnKCIlczogd2FpdGluZyB0byBzdXNwZW5kIHN5c3RlbSwgc3RhdGUgJWQsIHdsb2NrICVkXG4iLAotCQkJIF9fZnVuY19fLCBtYXAucG1fc3RhdGUsCi0JCQkgbWFwLndsb2NrX2hvbGRlcnMpOwotCQltdXRleF91bmxvY2soJm1hcC5wbV9sb2NrKTsKLQkJaWYgKCEod2FpdF9ldmVudF90aW1lb3V0KG1hcC5wbV93cSwKLQkJCQkJIHdjZDl4eHhfc3BtaV9wbV9jbXB4Y2hnKAotCQkJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAotCQkJCQkJCVdDRDlYWFhfUE1fQVNMRUVQKSA9PQotCQkJCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFLAotCQkJCQkJCUhaKSkpIHsKLQkJCXByX2RlYnVnKCIlczogc3VzcGVuZCBmYWlsZWQgc3RhdGUgJWQsIHdsb2NrICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlLAotCQkJCSBtYXAud2xvY2tfaG9sZGVycyk7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGRvbmUsIHN0YXRlICVkLCB3bG9jayAlZFxuIiwgX19mdW5jX18sCi0JCQkJIG1hcC5wbV9zdGF0ZSwKLQkJCQkgbWFwLndsb2NrX2hvbGRlcnMpOwotCQl9Ci0JCW11dGV4X2xvY2soJm1hcC5wbV9sb2NrKTsKLQl9IGVsc2UgaWYgKG1hcC5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FTTEVFUCkgewotCQlwcl93YXJuKCIlczogc3lzdGVtIGlzIGFscmVhZHkgc3VzcGVuZGVkLCBzdGF0ZSAlZCwgd2xvY2sgJWRuIiwKLQkJCV9fZnVuY19fLCBtYXAucG1fc3RhdGUsCi0JCQltYXAud2xvY2tfaG9sZGVycyk7Ci0JfQotCW11dGV4X3VubG9jaygmbWFwLnBtX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9zcG1pX3N1c3BlbmQpOwotCi1pbnQgd2NkOXh4eF9zcG1pX3Jlc3VtZSh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCW11dGV4X2xvY2soJm1hcC5wbV9sb2NrKTsKLQlpZiAobWFwLnBtX3N0YXRlID09IFdDRDlYWFhfUE1fQVNMRUVQKSB7Ci0JCXByX2RlYnVnKCIlczogcmVzdW1pbmcgc3lzdGVtLCBzdGF0ZSAlZCwgd2xvY2sgJWRcbiIsIF9fZnVuY19fLAotCQkJCW1hcC5wbV9zdGF0ZSwKLQkJCQltYXAud2xvY2tfaG9sZGVycyk7Ci0JCW1hcC5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOwotCX0gZWxzZSB7Ci0JCXByX3dhcm4oIiVzOiBzeXN0ZW0gaXMgYWxyZWFkeSBhd2FrZSwgc3RhdGUgJWQgd2xvY2sgJWRcbiIsCi0JCQkJX19mdW5jX18sIG1hcC5wbV9zdGF0ZSwKLQkJCQltYXAud2xvY2tfaG9sZGVycyk7Ci0JfQotCW11dGV4X3VubG9jaygmbWFwLnBtX2xvY2spOwotCXdha2VfdXBfYWxsKCZtYXAucG1fd3EpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9zcG1pX3Jlc3VtZSk7Ci0KLWJvb2wgd2NkOXh4eF9zcG1pX2xvY2tfc2xlZXAodm9pZCkKLXsKLQkvKgotCSAqIHdjZDl4eHhfc3BtaV97bG9jay91bmxvY2t9X3NsZWVwIHdpbGwgYmUgY2FsbGVkIGJ5Ci0JICogd2NkOXh4eF9zcG1pX2lycV90aHJlYWQKLQkgKiBhbmQgaXRzIHN1YnJvdXRpbmVzIG9ubHkgbW90bHkuCi0JICogYnV0IGJ0bjBfbHByZXNzX2ZuIGlzIG5vdCB3Y2Q5eHh4X3NwbWlfaXJxX3RocmVhZCdzIHN1YnJvdXRpbmUgYW5kCi0JICogSXQgY2FuIHJhY2Ugd2l0aCB3Y2Q5eHh4X3NwbWlfaXJxX3RocmVhZC4KLQkgKiBTbyBuZWVkIHRvIGVtYnJhY2Ugd2xvY2tfaG9sZGVycyB3aXRoIG11dGV4LgotCSAqLwotCW11dGV4X2xvY2soJm1hcC5wbV9sb2NrKTsKLQlpZiAobWFwLndsb2NrX2hvbGRlcnMrKyA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogaG9sZGluZyB3YWtlIGxvY2tcbiIsIF9fZnVuY19fKTsKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZtYXAucG1fcW9zX3JlcSwKLQkJCQkgICAgICBtc21fY3B1aWRsZV9nZXRfZGVlcF9pZGxlX2xhdGVuY3koKSk7Ci0JCXBtX3N0YXlfYXdha2UoJm1hcC5zcG1pWzBdLT5kZXYpOwotCX0KLQltdXRleF91bmxvY2soJm1hcC5wbV9sb2NrKTsKLQlwcl9kZWJ1ZygiJXM6IHdha2UgbG9jayBjb3VudGVyICVkXG4iLCBfX2Z1bmNfXywKLQkJCW1hcC53bG9ja19ob2xkZXJzKTsKLQlwcl9kZWJ1ZygiJXM6IG1hcC5wbV9zdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlKTsKLQotCWlmICghd2FpdF9ldmVudF90aW1lb3V0KG1hcC5wbV93cSwKLQkJCQkoKHdjZDl4eHhfc3BtaV9wbV9jbXB4Y2hnKAotCQkJCQlXQ0Q5WFhYX1BNX1NMRUVQQUJMRSwKLQkJCQkJV0NEOVhYWF9QTV9BV0FLRSkpID09Ci0JCQkJCVdDRDlYWFhfUE1fU0xFRVBBQkxFIHx8Ci0JCQkJCSh3Y2Q5eHh4X3NwbWlfcG1fY21weGNoZygKLQkJCQkJCSBXQ0Q5WFhYX1BNX1NMRUVQQUJMRSwKLQkJCQkJCSBXQ0Q5WFhYX1BNX0FXQUtFKSA9PQotCQkJCQkJIFdDRDlYWFhfUE1fQVdBS0UpKSwKLQkJCQkJbXNlY3NfdG9famlmZmllcygKLQkJCQkJV0NEOVhYWF9TWVNURU1fUkVTVU1FX1RJTUVPVVRfTVMpKSkgewotCQlwcl93YXJuKCIlczogc3lzdGVtIGRpZG4ndCByZXN1bWUgd2l0aGluICVkbXMsIHMgJWQsIHcgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCVdDRDlYWFhfU1lTVEVNX1JFU1VNRV9USU1FT1VUX01TLCBtYXAucG1fc3RhdGUsCi0JCQltYXAud2xvY2tfaG9sZGVycyk7Ci0JCXdjZDl4eHhfc3BtaV91bmxvY2tfc2xlZXAoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQl3YWtlX3VwX2FsbCgmbWFwLnBtX3dxKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZpbmcgcG1fc3RhdGUgPSAlZFxuIiwgX19mdW5jX18sIG1hcC5wbV9zdGF0ZSk7Ci0JcmV0dXJuIHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDl4eHhfc3BtaV9sb2NrX3NsZWVwKTsKLQotdm9pZCB3Y2Q5eHh4X3NwbWlfdW5sb2NrX3NsZWVwKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmbWFwLnBtX2xvY2spOwotCWlmICgtLW1hcC53bG9ja19ob2xkZXJzID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiByZWxlYXNpbmcgd2FrZSBsb2NrIHBtX3N0YXRlICVkIC0+ICVkXG4iLAotCQkJIF9fZnVuY19fLCBtYXAucG1fc3RhdGUsIFdDRDlYWFhfUE1fU0xFRVBBQkxFKTsKLQkJLyoKLQkJICogaWYgd2NkOXh4eF9zcG1pX2xvY2tfc2xlZXAgZmFpbGVkLCBwbV9zdGF0ZSB3b3VsZCBiZSBzdGlsbAotCQkgKiBXQ0Q5WFhYX1BNX0FTTEVFUCwgZG9uJ3Qgb3ZlcndyaXRlCi0JCSAqLwotCQlpZiAobGlrZWx5KG1hcC5wbV9zdGF0ZSA9PSBXQ0Q5WFhYX1BNX0FXQUtFKSkKLQkJCW1hcC5wbV9zdGF0ZSA9IFdDRDlYWFhfUE1fU0xFRVBBQkxFOwotCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJm1hcC5wbV9xb3NfcmVxLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQkJcG1fcmVsYXgoJm1hcC5zcG1pWzBdLT5kZXYpOwotCX0KLQltdXRleF91bmxvY2soJm1hcC5wbV9sb2NrKTsKLQlwcl9kZWJ1ZygiJXM6IHdha2UgbG9jayBjb3VudGVyICVkXG4iLCBfX2Z1bmNfXywKLQkJCW1hcC53bG9ja19ob2xkZXJzKTsKLQlwcl9kZWJ1ZygiJXM6IG1hcC5wbV9zdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgbWFwLnBtX3N0YXRlKTsKLQl3YWtlX3VwX2FsbCgmbWFwLnBtX3dxKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkOXh4eF9zcG1pX3VubG9ja19zbGVlcCk7Ci0KLXZvaWQgd2NkOXh4eF9zcG1pX3NldF9jb2RlYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JbWFwLmNvZGVjID0gY29kZWM7Ci19Ci0KLXZvaWQgd2NkOXh4eF9zcG1pX3NldF9kZXYoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BtaSwgaW50IGkpCi17Ci0JaWYgKGkgPCBOVU1fSVJRX1JFR1MpCi0JCW1hcC5zcG1pW2ldID0gc3BtaTsKLX0KLQotaW50IHdjZDl4eHhfc3BtaV9pcnFfaW5pdCh2b2lkKQotewotCWludCBpID0gMDsKLQotCWZvciAoOyBpIDwgTUFYX05VTV9JUlFTOyBpKyspCi0JCW1hcC5tYXNrW0JJVF9CWVRFKGkpXSB8PSBCWVRFX0JJVF9NQVNLKGkpOwotCW11dGV4X2luaXQoJm1hcC5wbV9sb2NrKTsKLQltYXAud2xvY2tfaG9sZGVycyA9IDA7Ci0JbWFwLnBtX3N0YXRlID0gV0NEOVhYWF9QTV9TTEVFUEFCTEU7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWFwLnBtX3dxKTsKLQlwbV9xb3NfYWRkX3JlcXVlc3QoJm1hcC5wbV9xb3NfcmVxLAotCQkJCVBNX1FPU19DUFVfRE1BX0xBVEVOQ1ksCi0JCQkJUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNOHgxNiBTUE1JIElSUSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtY2RjLWlycS5oIGIvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL3NkbTY2MC1jZGMtaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjQ4ZDAuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zZG02NjBfY2RjL3NkbTY2MC1jZGMtaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1dDRDlYWFhfU1BNSV9JUlFfSF9fCi0jZGVmaW5lIF9fV0NEOVhYWF9TUE1JX0lSUV9IX18KLQotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLQotZXh0ZXJuIHZvaWQgd2NkOXh4eF9zcG1pX2VuYWJsZV9pcnEoaW50IGlycSk7Ci1leHRlcm4gdm9pZCB3Y2Q5eHh4X3NwbWlfZGlzYWJsZV9pcnEoaW50IGlycSk7Ci1leHRlcm4gaW50IHdjZDl4eHhfc3BtaV9yZXF1ZXN0X2lycShpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdik7Ci1leHRlcm4gaW50IHdjZDl4eHhfc3BtaV9mcmVlX2lycShpbnQgaXJxLCB2b2lkICpwcml2KTsKLWV4dGVybiB2b2lkIHdjZDl4eHhfc3BtaV9zZXRfY29kZWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLWV4dGVybiB2b2lkIHdjZDl4eHhfc3BtaV9zZXRfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNwbWksIGludCBpKTsKLWV4dGVybiBpbnQgd2NkOXh4eF9zcG1pX2lycV9pbml0KHZvaWQpOwotZXh0ZXJuIGludCB3Y2Q5eHh4X3NwbWlfc3VzcGVuZChwbV9tZXNzYWdlX3QgcG1lc2cpOwotZXh0ZXJuIGludCB3Y2Q5eHh4X3NwbWlfcmVzdW1lKHZvaWQpOwotYm9vbCB3Y2Q5eHh4X3NwbWlfbG9ja19zbGVlcCh2b2lkKTsKLXZvaWQgd2NkOXh4eF9zcG1pX3VubG9ja19zbGVlcCh2b2lkKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvc2RtNjYwLWNkYy1yZWdpc3RlcnMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtY2RjLXJlZ2lzdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzE3Y2UxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtY2RjLXJlZ2lzdGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIFNETTY2MF9XQ0RfUkVHSVNURVJTX0gKLSNkZWZpbmUgU0RNNjYwX1dDRF9SRUdJU1RFUlNfSAotCi0jZGVmaW5lIENEQ19ESUdfQkFTRQkJMHhGMDAwCi0jZGVmaW5lIENEQ19BTkFfQkFTRQkJMHhGMTAwCi0KLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xCQkoQ0RDX0RJR19CQVNFKzB4MDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9SRVZJU0lPTjFfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1JFVklTSU9OMgkJKENEQ19ESUdfQkFTRSsweDAwMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04yX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9UWVBFCQkoQ0RDX0RJR19CQVNFKzB4MDA0KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9UWVBFX19QT1IJCSgweDIzKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9TVUJUWVBFCQkoQ0RDX0RJR19CQVNFKzB4MDA1KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9TVUJUWVBFX19QT1IJCSgweDAxKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUlRfU1RTCQkoQ0RDX0RJR19CQVNFKzB4MDEwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUlRfU1RTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfU0VUX1RZUEUJCShDRENfRElHX0JBU0UrMHgwMTEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9TRVRfVFlQRV9fUE9SCQkoMHhGRikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0hJR0gJCShDRENfRElHX0JBU0UrMHgwMTIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QT0xBUklUWV9ISUdIX19QT1IJCSgweEZGKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfTE9XCQkoQ0RDX0RJR19CQVNFKzB4MDEzKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfTE9XX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9DTFIJCShDRENfRElHX0JBU0UrMHgwMTQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9MQVRDSEVEX0NMUl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVAkJKENEQ19ESUdfQkFTRSsweDAxNSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUgkJKENEQ19ESUdfQkFTRSsweDAxNikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX0NMUl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfU1RTCQkoQ0RDX0RJR19CQVNFKzB4MDE4KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9TVFNfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QRU5ESU5HX1NUUwkJKENEQ19ESUdfQkFTRSsweDAxOSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BFTkRJTkdfU1RTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTUlEX1NFTAkJKENEQ19ESUdfQkFTRSsweDAxQSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX01JRF9TRUxfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QUklPUklUWQkJKENEQ19ESUdfQkFTRSsweDAxQikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BSSU9SSVRZX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9HUElPX01PREUJCShDRENfRElHX0JBU0UrMHgwNDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0dQSU9fTU9ERV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX0NUTF9PRQkJKENEQ19ESUdfQkFTRSsweDA0MSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX0NUTF9PRV9fUE9SCQkoMHgwMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfUElOX0NUTF9EQVRBCQkoQ0RDX0RJR19CQVNFKzB4MDQyKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9QSU5fQ1RMX0RBVEFfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9TVEFUVVMJCShDRENfRElHX0JBU0UrMHgwNDMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9TVEFUVVNfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0hEUklWRV9DVEwJCShDRENfRElHX0JBU0UrMHgwNDQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0hEUklWRV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMCQkoQ0RDX0RJR19CQVNFKzB4MDQ2KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlNUX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1RPUF9DTEtfQ1RMCQkoQ0RDX0RJR19CQVNFKzB4MDQ4KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfVE9QX0NMS19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19BTkFfQ0xLX0NUTAkJKENEQ19ESUdfQkFTRSsweDA0OSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfRElHX0NMS19DVEwJCShDRENfRElHX0JBU0UrMHgwNEEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19ESUdfQ0xLX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgxX0NUTAkJKENEQ19ESUdfQkFTRSsweDA1MCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgxX0NUTF9fUE9SCQkoMHgwMikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTAkJKENEQ19ESUdfQkFTRSsweDA1MSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgyX0NUTF9fUE9SCQkoMHgwMikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fSFBIUl9EQUNfQ1RMCShDRENfRElHX0JBU0UrMHgwNTIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX0hQSFJfREFDX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgxX0NUTAkJKENEQ19ESUdfQkFTRSsweDA1MykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgyX0NUTAkJKENEQ19ESUdfQkFTRSsweDA1NCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgzX0NUTAkJKENEQ19ESUdfQkFTRSsweDA1NSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlhfTEJfQ1RMCShDRENfRElHX0JBU0UrMHgwNTYpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYX0xCX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDEJCShDRENfRElHX0JBU0UrMHgwNTgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwxX19QT1IJCSgweDdDKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMgkJKENEQ19ESUdfQkFTRSsweDA1OSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDJfX1BPUgkJKDB4N0MpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwzCQkoQ0RDX0RJR19CQVNFKzB4MDVBKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMM19fUE9SCQkoMHg3QykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMAkJKENEQ19ESUdfQkFTRSsweDA1QikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMQkJKENEQ19ESUdfQkFTRSsweDA1QykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMgkJKENEQ19ESUdfQkFTRSsweDA1RCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMwkJKENEQ19ESUdfQkFTRSsweDA1RSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBM19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0NUTAkJKENEQ19ESUdfQkFTRSsweDA2OCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0VOCQkoQ0RDX0RJR19CQVNFKzB4MDY5KQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9ESUdfREVCVUdfRU5fX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzAJCShDRENfRElHX0JBU0UrMHgwNzApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzBfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzEJCShDRENfRElHX0JBU0UrMHgwNzEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzFfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzIJCShDRENfRElHX0JBU0UrMHgwNzIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MJCShDRENfRElHX0JBU0UrMHgwRDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1NfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDEJCShDRENfRElHX0JBU0UrMHgwRDgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDFfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDIJCShDRENfRElHX0JBU0UrMHgwRDkpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDJfX1BPUgkJKDB4MDEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDMJCShDRENfRElHX0JBU0UrMHgwREEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDNfX1BPUgkJKDB4MDUpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDQJCShDRENfRElHX0JBU0UrMHgwREIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDRfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9URVNUMQkJKENEQ19ESUdfQkFTRSsweDBFMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1RFU1QxX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfVEVTVF9WQUwJCShDRENfRElHX0JBU0UrMHgwRTEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9URVNUX1ZBTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0RJR0lUQUxfVFJJTV9OVU0JCShDRENfRElHX0JBU0UrMHgwRjApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1RSSU1fTlVNX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfRElHSVRBTF9UUklNX0NUUkwJCShDRENfRElHX0JBU0UrMHgwRjEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19ESUdJVEFMX1RSSU1fQ1RSTF9fUE9SCQkoMHgwMCkKLQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMQkJKENEQ19BTkFfQkFTRSsweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjIJCShDRENfQU5BX0JBU0UrMHgwMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04zCQkoQ0RDX0FOQV9CQVNFKzB4MDIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04zX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONAkJKENEQ19BTkFfQkFTRSsweDAzKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9UWVBFCQkoQ0RDX0FOQV9CQVNFKzB4MDQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfVFlQRV9fUE9SCQkoMHgyMykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9TVUJUWVBFCQkoQ0RDX0FOQV9CQVNFKzB4MDUpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfU1VCVFlQRV9fUE9SCQkoMHgwOSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUlRfU1RTCQkoQ0RDX0FOQV9CQVNFKzB4MTApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1JUX1NUU19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfU0VUX1RZUEUJCShDRENfQU5BX0JBU0UrMHgxMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfU0VUX1RZUEVfX1BPUgkJKDB4M0YpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0hJR0gJCShDRENfQU5BX0JBU0UrMHgxMikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUE9MQVJJVFlfSElHSF9fUE9SCQkoMHgzRikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUE9MQVJJVFlfTE9XCQkoQ0RDX0FOQV9CQVNFKzB4MTMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0xPV19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTEFUQ0hFRF9DTFIJCShDRENfQU5BX0JBU0UrMHgxNCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTEFUQ0hFRF9DTFJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0VOX1NFVAkJKENEQ19BTkFfQkFTRSsweDE1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9TRVRfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0VOX0NMUgkJKENEQ19BTkFfQkFTRSsweDE2KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9FTl9DTFJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfU1RTCQkoQ0RDX0FOQV9CQVNFKzB4MTgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfU1RTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QRU5ESU5HX1NUUwkJKENEQ19BTkFfQkFTRSsweDE5KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QRU5ESU5HX1NUU19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTUlEX1NFTAkJKENEQ19BTkFfQkFTRSsweDFBKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9NSURfU0VMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QUklPUklUWQkJKENEQ19BTkFfQkFTRSsweDFCKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QUklPUklUWV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU4JCShDRENfQU5BX0JBU0UrMHg0MCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfRU5fX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX1ZBTAkJKENEQ19BTkFfQkFTRSsweDQxKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9WQUxfX1BPUgkJKDB4MjApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0NUTAkJKENEQ19BTkFfQkFTRSsweDQyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0lOVF9SQklBUwkJKENEQ19BTkFfQkFTRSsweDQzKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01JQ0JfMV9JTlRfUkJJQVNfX1BPUgkJKDB4NDkpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOCQkoQ0RDX0FOQV9CQVNFKzB4NDQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8yX0VOX19QT1IJCSgweDIwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMgkJKENEQ19BTkFfQkFTRSsweDQ1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVEwJCShDRENfQU5BX0JBU0UrMHg0NikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQVNURVJfQklBU19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzEJCShDRENfQU5BX0JBU0UrMHg0NykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMV9fUE9SCQkoMHgzNSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMgkJKENEQ19BTkFfQkFTRSsweDUwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfREVUX0NUTF8yX19QT1IJCSgweDA4KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTAkJKENEQ19BTkFfQkFTRSsweDUxKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVIJCShDRENfQU5BX0JBU0UrMHg1MikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RCTkNfVElNRVJfX1BPUgkJKDB4OTgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTAkoQ0RDX0FOQV9CQVNFKzB4NTMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4wX1pERVRMX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjFfWkRFVE1fQ1RMCShDRENfQU5BX0JBU0UrMHg1NCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjFfWkRFVE1fQ1RMX19QT1IJCSgweDIwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMl9aREVUSF9DVEwJKENEQ19BTkFfQkFTRSsweDU1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROMl9aREVUSF9DVExfX1BPUgkJKDB4NDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE4zX0NUTAkJKENEQ19BTkFfQkFTRSsweDU2KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlROM19DVExfX1BPUgkJKDB4NjEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE40X0NUTAkJKENEQ19BTkFfQkFTRSsweDU3KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfQlRONF9DVExfX1BPUgkJKDB4ODApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUCQkoQ0RDX0FOQV9CQVNFKzB4NTgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19CVE5fUkVTVUxUX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQJKENEQ19BTkFfQkFTRSsweDU5KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFRfX1BPUgkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xX0VOCQkoQ0RDX0FOQV9CQVNFKzB4NjApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV9FTl9fUE9SCQkoMHgwMykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8yX0VOCQkoQ0RDX0FOQV9CQVNFKzB4NjEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMl9FTl9fUE9SCQkoMHgwMykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVEVTVF9DVExfMQkJKENEQ19BTkFfQkFTRSsweDYyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8xX19QT1IJCSgweEJGKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8yCQkoQ0RDX0FOQV9CQVNFKzB4NjMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX1RFU1RfQ1RMXzJfX1BPUgkJKDB4OEMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX0FURVNUX0NUTAkJKENEQ19BTkFfQkFTRSsweDY0KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVMJCShDRENfQU5BX0JBU0UrMHg2NSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfT1BBTVBfQklBU19fUE9SCQkoMHg2QikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVFhGRV9DTEtESVYJCShDRENfQU5BX0JBU0UrMHg2NikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVFhGRV9DTEtESVZfX1BPUgkJKDB4NTEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFhfM19FTgkJKENEQ19BTkFfQkFTRSsweDY3KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1RYXzNfRU5fX1BPUgkJKDB4MDIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOCQkoQ0RDX0FOQV9CQVNFKzB4ODApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOX19QT1IJCSgweDI2KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9DTEsJCShDRENfQU5BX0JBU0UrMHg4MSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xLX19QT1IJCSgweDIzKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9ERUdMSVRDSAkJKENEQ19BTkFfQkFTRSsweDgyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9ERUdMSVRDSF9fUE9SCQkoMHg1QikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfRkJDVFJMCQkoQ0RDX0FOQV9CQVNFKzB4ODMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0ZCQ1RSTF9fUE9SCQkoMHgwOCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQklBUwkJKENEQ19BTkFfQkFTRSsweDg0KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9CSUFTX19QT1IJCSgweDI5KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTAkJKENEQ19BTkFfQkFTRSsweDg1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9WQ1RSTF9fUE9SCQkoMHgyNCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVEVTVAkJKENEQ19BTkFfQkFTRSsweDg2KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9URVNUX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX05DUF9DTElNX0FERFIJCShDRENfQU5BX0JBU0UrMHg4NykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xJTV9BRERSX19QT1IJCSgweEQ1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NMT0NLX0RJVklERVIJCShDRENfQU5BX0JBU0UrMHg5MCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9DTE9DS19ESVZJREVSX19QT1IJCSgweEU4KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ1RMCQkoQ0RDX0FOQV9CQVNFKzB4OTEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DVExfX1BPUgkJKDB4Q0YpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DT1VOVAkJKENEQ19BTkFfQkFTRSsweDkyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0NPTV9PQ1BfQ09VTlRfX1BPUgkJKDB4NkUpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDCQkoQ0RDX0FOQV9CQVNFKzB4OTMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDX19QT1IJCSgweDE4KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9CSUFTX1BBCQkoQ0RDX0FOQV9CQVNFKzB4OTQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfUEFfX1BPUgkJKDB4NUEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfTERPX09DUAkoQ0RDX0FOQV9CQVNFKzB4OTUpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfTERPX09DUF9fUE9SCQkoMHg2OSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19DTlAJCShDRENfQU5BX0JBU0UrMHg5NikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19DTlBfX1BPUgkJKDB4MjkpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9FTgkJKENEQ19BTkFfQkFTRSsweDk3KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9DTlBfRU5fX1BPUgkJKDB4ODApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9XR19DVEwJCShDRENfQU5BX0JBU0UrMHg5OCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX0NUTF9fUE9SCQkoMHhEQSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUUJCShDRENfQU5BX0JBU0UrMHg5OSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX1RJTUVfX1BPUgkJKDB4MTYpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfVEVTVAkJKENEQ19BTkFfQkFTRSsweDlBKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9MX1RFU1RfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfUEFfREFDX0NUTAkoQ0RDX0FOQV9CQVNFKzB4OUIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0xfUEFfREFDX0NUTF9fUE9SCQkoMHgyMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9URVNUCQkoQ0RDX0FOQV9CQVNFKzB4OUMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1JfVEVTVF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMCShDRENfQU5BX0JBU0UrMHg5RCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMX19QT1IJCSgweDIwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9DVEwJCShDRENfQU5BX0JBU0UrMHg5RSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMX19fUE9SCQkoMHgxMikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9BVEVTVAkJKENEQ19BTkFfQkFTRSsweDlGKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0FURVNUX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0hQSF9TVEFUVVMJCShDRENfQU5BX0JBU0UrMHhBMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfU1RBVFVTX19QT1IJCSgweDBDKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0VBUl9TVEFUVVMJCShDRENfQU5BX0JBU0UrMHhBMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfU1RBVFVTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0RBQ19DVEwJCShDRENfQU5BX0JBU0UrMHhBQykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SWF9MT19EQUNfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX0xPX0VOX0NUTAkJKENEQ19BTkFfQkFTRSsweEFEKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JYX1JYX0xPX0VOX0NUTF9fUE9SCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTAkJKENEQ19BTkFfQkFTRSsweEIwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfREFDX0NUTF9fUE9SCQkoMHg4MykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DTElQX0RFVAkJKENEQ19BTkFfQkFTRSsweEIxKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NMSVBfREVUX19QT1IJCSgweDkxKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTAkJKENEQ19BTkFfQkFTRSsweEIyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NUTF9fUE9SCQkoMHgyOSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0FOQV9CSUFTX1NFVAkJKENEQ19BTkFfQkFTRSsweEIzKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfQU5BX0JJQVNfU0VUX19QT1IJCSgweDREKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTAkJKENEQ19BTkFfQkFTRSsweEI0KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfT0NQX0NUTF9fUE9SCQkoMHhFMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVEwJCShDRENfQU5BX0JBU0UrMHhCNSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1BXUlNUR19DVExfX1BPUgkJKDB4MUUpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfTUlTQwkJKENEQ19BTkFfQkFTRSsweEI2KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX01JU0NfX1BPUgkJKDB4Q0IpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHCQkoQ0RDX0FOQV9CQVNFKzB4QjcpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0NVUlJFTlRfTElNSVQJCShDRENfQU5BX0JBU0UrMHhDMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19DVVJSRU5UX0xJTUlUX19QT1IJCSgweDAyKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX09VVFBVVF9WT0xUQUdFCQkoQ0RDX0FOQV9CQVNFKzB4QzEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfT1VUUFVUX1ZPTFRBR0VfX1BPUgkJKDB4MTQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUJCShDRENfQU5BX0JBU0UrMHhDMikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CWVBBU1NfTU9ERV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVEwJCShDRENfQU5BX0JBU0UrMHhDMykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9FTl9DVExfX1BPUgkJKDB4MUYpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPCQkoQ0RDX0FOQV9CQVNFKzB4QzQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPX19QT1IJCSgweDhDKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1JEU09OX01BWF9EVVRZX0NZQ0xFCShDRENfQU5BX0JBU0UrMHhDNSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19SRFNPTl9NQVhfRFVUWV9DWUNMRV9fUE9SCQkoMHhDMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9URVNUMV8xCQkoQ0RDX0FOQV9CQVNFKzB4QzYpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVDFfMV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9URVNUXzIJCShDRENfQU5BX0JBU0UrMHhDNykKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19CT09TVF9URVNUXzJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9TQVJfU1RBVFVTCQkoQ0RDX0FOQV9CQVNFKzB4QzgpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9TQVJfU1RBVFVTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX1NUQVRVUwkJKENEQ19BTkFfQkFTRSsweEM5KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX1NUQVRVU19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QQlVTX0FERF9DU1IJCShDRENfQU5BX0JBU0UrMHhDRSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QQlVTX0FERF9DU1JfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfU0VMCQkoQ0RDX0FOQV9CQVNFKzB4Q0YpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfU0VMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1MJCShDRENfQU5BX0JBU0UrMHhEMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19TRUNfQUNDRVNTX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDEJCShDRENfQU5BX0JBU0UrMHhEOCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwxX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDIJCShDRENfQU5BX0JBU0UrMHhEOSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwyX19QT1IJCSgweDAxKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMJCShDRENfQU5BX0JBU0UrMHhEQSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEwzX19QT1IJCSgweDA1KQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDQJCShDRENfQU5BX0JBU0UrMHhEQikKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19QRVJQSF9SRVNFVF9DVEw0X19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9URVNUMQkJKENEQ19BTkFfQkFTRSsweEUwKQotI2RlZmluZSBNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9URVNUMV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfVEVTVF9WQUwJCShDRENfQU5BX0JBU0UrMHhFMSkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19JTlRfVEVTVF9WQUxfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9OVU0JCShDRENfQU5BX0JBU0UrMHhGMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX05VTV9fUE9SCQkoMHgwNCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwxCQkoQ0RDX0FOQV9CQVNFKzB4RjEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMV9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwyCQkoQ0RDX0FOQV9CQVNFKzB4RjIpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkwzCQkoQ0RDX0FOQV9CQVNFKzB4RjMpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMM19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkw0CQkoQ0RDX0FOQV9CQVNFKzB4RjQpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMNF9fUE9SCQkoMHgwMCkKLQotI2RlZmluZSBNU004OVhYX1BNSUNfQ0RDX05VTV9SRUdJU1RFUlMgXAotCQkoTVNNODlYWF9QTUlDX0FOQUxPR19UUklNX0NUUkw0KzEpCi0jZGVmaW5lIE1TTTg5WFhfUE1JQ19DRENfTUFYX1JFR0lTVEVSIFwKLQkJKE1TTTg5WFhfUE1JQ19DRENfTlVNX1JFR0lTVEVSUy0xKQotI2RlZmluZSBNU004OVhYX1BNSUNfQ0RDX0NBQ0hFX1NJWkUgXAotCQlNU004OVhYX1BNSUNfQ0RDX05VTV9SRUdJU1RFUlMKLQotCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX1JFU0VUX0NUTAkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfUkVTRVRfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19UWF9SRVNFVF9CMV9DVEwJKDB4MDQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX1JFU0VUX0IxX0NUTF9fUE9SCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19ETUlDX0IxX0NUTAkoMHgwOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfRE1JQ19CMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0kyU19DVEwJCSgweDBDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19SWF9JMlNfQ1RMX19QT1IJCSgweDEzKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMCQkoMHgxMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfSTJTX0NUTF9fUE9SCQkoMHgxMykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9SRVNFVF9CMV9DVEwJKDB4MTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX09USFJfUkVTRVRfQjFfQ1RMX19QT1IJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVEwJKDB4MTgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVExfX1BPUgkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9DVEwJCSgweDFDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX0NUTF9fUE9SCQkoMHgwNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMCQkoMHgyMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19NQ0xLX0NUTAkJKDB4MjQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX01DTEtfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMCQkoMHgyOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfUERNX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfU0RfQ1RMCQkoMHgyQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfU0RfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NMS19ETUlDX0IyX0NUTAkoMHgzMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfRE1JQ19CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IyX0NUTAkJKDB4MzQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DTEtfVFgyX0kyU19DVEwJKDB4MzgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYMl9JMlNfQ1RMX19QT1IJCSgweDEzKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVEwJCSgweDQwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTAkJKDB4NjApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMCQkoMHg4MCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVEwJCSgweDQ0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IyX0NUTAkJKDB4NjQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMCQkoMHg4NCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVEwJCSgweDQ4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTAkJKDB4NjgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMCQkoMHg4OCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwJCSgweDRDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTAkJKDB4NkMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMCQkoMHg4QykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwJCSgweDUwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVExfX1BPUgkJKDB4NjgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTAkJKDB4NzApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTF9fUE9SCQkoMHg2OCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMCQkoMHg5MCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMX19QT1IJCSgweDY4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwJCSgweDU0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTAkJKDB4NzQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMCQkoMHg5NCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IxX0NUTAkoMHg1OCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMV9DVExfX1BPUgkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMV9DVEwJKDB4NzgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjFfQ1RMX19QT1IJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjFfQ1RMCSgweDk4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IxX0NUTF9fUE9SCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IyX0NUTAkoMHg1QykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDFfVk9MX0NUTF9CMl9DVExfX1BPUgkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMl9DVEwJKDB4N0MpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjJfQ1RMX19QT1IJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjJfQ1RMCSgweDlDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1JYM19WT0xfQ1RMX0IyX0NUTF9fUE9SCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RPUF9HQUlOX1VQREFURQkoMHhBMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UT1BfR0FJTl9VUERBVEVfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVE9QX0NUTAkJKDB4QTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVE9QX0NUTF9fUE9SCQkJKDB4MDEpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjFfQ1RMCQkoMHhCMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMV9DVExfX1BPUgkJKDB4MzApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjJfQ1RMCQkoMHhCNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVExfX1BPUgkJKDB4QjUpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMCQkoMHhCOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CM19DVExfX1BPUgkJKDB4MjgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjRfQ1RMCQkoMHhCQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CNF9DVExfX1BPUgkJKDB4MzcpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjVfQ1RMCQkoMHhDMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CNV9DVExfX1BPUgkJKDB4N0YpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjZfQ1RMCQkoMHhDNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9CNl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfU0hVVF9ET1dOX1NUQVRVUwkoMHhDOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9TSFVUX0RPV05fU1RBVFVTX19QT1IJKDB4MDMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfRlNfQ0ZHCQkoMHhDQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9GU19DRkdfX1BPUgkJKDB4MDMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfREVMQVlfQlVGX0NUTAkoMHhEMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT01QMF9ERUxBWV9CVUZfQ1RMX19QT1IJKDB4MDIpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIxX0NUTAkoMHhFMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0RFU0VSMl9DVEwJKDB4RTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19CMV9DVExfQ0ZHCSgweEU4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19CMl9DVExfQ0ZHCSgweEVDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfQ0ZHCSgweEYwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjFfQ1RMCSgweDEwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMV9DVEwJKDB4MTQwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IyX0NUTAkoMHgxMDQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjJfQ1RMCSgweDE0NCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjJfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CM19DVEwJKDB4MTA4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CM19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IzX0NUTAkoMHgxNDgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjRfQ1RMCSgweDEwQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjRfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNF9DVEwJKDB4MTRDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I1X0NUTAkoMHgxMTApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I1X0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjVfQ1RMCSgweDE1MCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjVfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNl9DVEwJKDB4MTE0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I2X0NUTAkoMHgxNTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I2X0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjdfQ1RMCSgweDExOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjdfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CN19DVEwJKDB4MTU4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CN19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I4X0NUTAkoMHgxMUMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I4X0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjhfQ1RMCSgweDE1QykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjhfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ1RMCQkoMHgxMjApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVExfX1BPUgkJCSgweDQwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjJfQ1RMCQkoMHgxNjApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DVExfX1BPUgkJCSgweDQwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9USU1FUl9DVEwJKDB4MTI0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9USU1FUl9DVExfX1BPUgkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMCSgweDE2NCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMX19QT1IJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IxX0NUTAkoMHgxMjgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DT0VGX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMCSgweDE2OCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwJKDB4MTJDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DT0VGX0IyX0NUTAkoMHgxNkMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DT0VGX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMV9DVEwJKDB4MTgwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CMl9DVEwJKDB4MTg0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CM19DVEwJKDB4MTg4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMV9DVEwJKDB4MThDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CMl9DVEwJKDB4MTkwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CM19DVEwJKDB4MTk0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IzX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMV9DVEwJKDB4MTk4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1JYM19CMl9DVEwJKDB4MTlDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IyX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IxX0NUTAkJKDB4MUEwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjFfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjJfQ1RMCQkoMHgxQTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjFfQ1RMCSgweDFBOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMCSgweDFBQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjNfQ1RMCSgweDFCMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CM19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjRfQ1RMCSgweDFCNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CNF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMCSgweDFCOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMV9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjJfQ1RMCSgweDFCQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMl9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjNfQ1RMCSgweDFDMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CM19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMCSgweDFDNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CNF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9JMlNfU0QxX0NUTAkoMHgxQzgpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9JMlNfU0QxX0NUTF9fUE9SCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfQjNfQ1RMCQkoMHgxQ0MpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CM19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfVElNRVIJKDB4MUUwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX1RJTUVSX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0dBSU4JKDB4MUU0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfQ0ZHCSgweDFFOCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDVfVk9MX0NUTF9DRkdfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVEwJCSgweDFFQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDVfTVVYX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDVfQ0xLX0ZTX0NUTAkJKDB4MUYwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9DTEtfRlNfQ1RMX19QT1IJCSgweDAzKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9ETUlDX0NUTAkJKDB4MUY0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNV9ETUlDX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9USU1FUgkoMHgyODApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfVElNRVJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfVElNRVIJKDB4MkEwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX1RJTUVSX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX1RJTUVSCSgweDJDMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9USU1FUl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9USU1FUgkoMHgyRTApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfVElNRVJfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTgkoMHgyODQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOCSgweDJBNCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU4JKDB4MkM0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU5fX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTgkoMHgyRTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTl9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9DRkcJKDB4Mjg4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0NGR19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9DRkcJKDB4MkE4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0NGR19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9DRkcJKDB4MkM4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0NGR19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9DRkcJKDB4MkU4KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX0NGR19fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDFfTVVYX0NUTAkJKDB4MjhDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9NVVhfQ1RMCQkoMHgyQUMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgzX01VWF9DVEwJCSgweDJDQykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfTVVYX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDRfTVVYX0NUTAkJKDB4MkVDKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMV9DTEtfRlNfQ1RMCQkoMHgyOTApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX0NMS19GU19DVExfX1BPUgkJKDB4MDMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX0NMS19GU19DVEwJCSgweDJCMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDJfQ0xLX0ZTX0NUTF9fUE9SCQkoMHgwMykKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfQ0xLX0ZTX0NUTAkJKDB4MkQwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYM19DTEtfRlNfQ1RMX19QT1IJCSgweDAzKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYNF9DTEtfRlNfQ1RMCQkoMHgyRjApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X0NMS19GU19DVExfX1BPUgkJKDB4MDMpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMCQkoMHgyOTQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMX19QT1IJCSgweDAwKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9ETUlDX0NUTAkJKDB4MkI0KQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX1RYMl9ETUlDX0NUTF9fUE9SCQkoMHgwMCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfRE1JQ19DVEwJCSgweDJENCkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9UWDNfRE1JQ19DVExfX1BPUgkJKDB4MDApCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X0RNSUNfQ1RMCQkoMHgyRjQpCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfVFg0X0RNSUNfQ1RMX19QT1IJCSgweDAwKQotCi0jZGVmaW5lIE1TTTg5WFhfQ0RDX0NPUkVfTlVNX1JFR0lTVEVSUyBcCi0JCShNU004OVhYX0NEQ19DT1JFX1RYNF9ETUlDX0NUTCsxKQotI2RlZmluZSBNU004OVhYX0NEQ19DT1JFX01BWF9SRUdJU1RFUiBcCi0JCShNU004OVhYX0NEQ19DT1JFX05VTV9SRUdJU1RFUlMtMSkKLSNkZWZpbmUgTVNNODlYWF9DRENfQ09SRV9DQUNIRV9TSVpFIFwKLQkJTVNNODlYWF9DRENfQ09SRV9OVU1fUkVHSVNURVJTCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtcmVnbWFwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NkbTY2MF9jZGMvc2RtNjYwLXJlZ21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhhYzZkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2RtNjYwX2NkYy9zZG02NjAtcmVnbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlICJtc20tY2RjLWNvbW1vbi5oIgotI2luY2x1ZGUgInNkbTY2MC1jZGMtcmVnaXN0ZXJzLmgiCi0KLS8qCi0gKiBEZWZhdWx0IHJlZ2lzdGVyIHJlc2V0IHZhbHVlcyB0aGF0IGFyZSBjb21tb24gYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucwotICogYXJlIGRlZmluZWQgaGVyZS4gSWYgYSByZWdpc3RlciByZXNldCB2YWx1ZSBpcyBjaGFuZ2VkIGJhc2VkIG9uIHZlcnNpb24KLSAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCBpbiB2ZXJzaW9uIHNwZWNpZmljCi0gKiBzdHJ1Y3R1cmVzLgotICovCi1zdHJ1Y3QgcmVnX2RlZmF1bHQKLQltc204OXh4X2NkY19jb3JlX2RlZmF1bHRzW01TTTg5WFhfQ0RDX0NPUkVfQ0FDSEVfU0laRV0gPSB7Ci0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX1JFU0VUX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX1JFU0VUX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTCwgMHgxM30sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0kyU19DVEwsIDB4MTN9LAotCXtNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX1JFU0VUX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX0NUTCwgMHgwNH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX01DTEtfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DTEtfUERNX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1NEX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DTEtfUlhfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DTEtfVFgyX0kyU19DVEwsIDB4MTN9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CNF9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CNF9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVEwsIDB4Njh9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CNV9DVEwsIDB4Njh9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CNV9DVEwsIDB4Njh9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMl9CNl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IyX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfUlgyX1ZPTF9DVExfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RPUF9HQUlOX1VQREFURSwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVE9QX0NUTCwgMHgwMX0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjFfQ1RMLCAweDMwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVEwsIDB4QjV9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IzX0NUTCwgMHgyOH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjRfQ1RMLCAweDM3fSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT01QMF9CNV9DVEwsIDB4N0Z9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I2X0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfU0hVVF9ET1dOX1NUQVRVUywgMHgwM30sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfRlNfQ0ZHLCAweDAzfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT01QMF9ERUxBWV9CVUZfQ1RMLCAweDAyfSwKLQl7TVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9ERUJVR19CMV9DVExfQ0ZHLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9ERUJVR19CMl9DVExfQ0ZHLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfQ0ZHLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjNfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjNfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjRfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjRfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjVfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjVfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjZfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjZfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjdfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjdfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjhfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjhfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9JSVIxX0NUTCwgMHg0MH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DVEwsIDB4NDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9USU1FUl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9USU1FUl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMV9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IxX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CM19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0I0X0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CMl9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IzX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0kyU19TRDFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IzX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfVElNRVIsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0dBSU4sIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYNV9WT0xfQ1RMX0NGRywgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYNV9DTEtfRlNfQ1RMLCAweDAzfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDVfRE1JQ19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX1RJTUVSLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9USU1FUiwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfVElNRVIsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX1RJTUVSLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9HQUlOLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9HQUlOLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9HQUlOLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9DRkcsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYMl9WT0xfQ1RMX0NGRywgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfQ0ZHLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9DRkcsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYMV9NVVhfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDJfTVVYX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFgzX01VWF9DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYNF9NVVhfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDFfQ0xLX0ZTX0NUTCwgMHgwM30sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFgyX0NMS19GU19DVEwsIDB4MDN9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYM19DTEtfRlNfQ1RMLCAweDAzfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDRfQ0xLX0ZTX0NUTCwgMHgwM30sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFgxX0RNSUNfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9DRENfQ09SRV9UWDJfRE1JQ19DVEwsIDB4MDB9LAotCXtNU004OVhYX0NEQ19DT1JFX1RYM19ETUlDX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfQ0RDX0NPUkVfVFg0X0RNSUNfQ1RMLCAweDAwfSwKLX07Ci0KLXN0cnVjdCByZWdfZGVmYXVsdAotCW1zbTg5eHhfcG1pY19jZGNfZGVmYXVsdHNbTVNNODlYWF9QTUlDX0NEQ19DQUNIRV9TSVpFXSA9IHsKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04xLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUkVWSVNJT04yLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfVFlQRSwgMHgyM30sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1NVQlRZUEUsIDB4MDF9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUlRfU1RTLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1NFVF9UWVBFLCAweEZGfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1BPTEFSSVRZX0hJR0gsIDB4RkZ9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUE9MQVJJVFlfTE9XLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0xBVENIRURfQ0xSLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX0VOX1NFVCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9FTl9DTFIsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTEFUQ0hFRF9TVFMsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfUEVORElOR19TVFMsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9JTlRfTUlEX1NFTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0lOVF9QUklPUklUWSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0dQSU9fTU9ERSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX1BJTl9DVExfT0UsIDB4MDF9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9QSU5fQ1RMX0RBVEEsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9QSU5fU1RBVFVTLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSERSSVZFX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SU1RfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1RPUF9DTEtfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0FOQV9DTEtfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0RJR19DTEtfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fVFgxX0NUTCwgMHgwMn0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1RYMl9DVEwsIDB4MDJ9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9IUEhSX0RBQ19DVEwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9SWDFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX0NPTk5fUlgyX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19DT05OX1JYM19DVEwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfQ09OTl9SWF9MQl9DVEwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9DRENfUlhfQ1RMMSwgMHg3Q30sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0NEQ19SWF9DVEwyLCAweDdDfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfQ0RDX1JYX0NUTDMsIDB4N0N9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEEwLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfREVNX0JZUEFTU19EQVRBMSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0RFTV9CWVBBU1NfREFUQTIsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9ERU1fQllQQVNTX0RBVEEzLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfRElHX0RFQlVHX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX0RJR19ERUJVR19FTiwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX1NQQVJFXzAsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9TUEFSRV8xLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfU1BBUkVfMiwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX1NFQ19BQ0NFU1MsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEwxLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfUEVSUEhfUkVTRVRfQ1RMMiwgMHgwMn0sCi0Je01TTTg5WFhfUE1JQ19ESUdJVEFMX1BFUlBIX1JFU0VUX0NUTDMsIDB4MDV9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9QRVJQSF9SRVNFVF9DVEw0LCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1RFU1QxLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfSU5UX1RFU1RfVkFMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0RJR0lUQUxfVFJJTV9OVU0sIDB4MDB9LAotCXtNU004OVhYX1BNSUNfRElHSVRBTF9UUklNX0NUUkwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9OMSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUkVWSVNJT04yLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SRVZJU0lPTjMsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1JFVklTSU9ONCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfVFlQRSwgMHgyM30sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUEVSUEhfU1VCVFlQRSwgMHgwOX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1JUX1NUUywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1NFVF9UWVBFLCAweDNGfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfUE9MQVJJVFlfSElHSCwgMHgzRn0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1BPTEFSSVRZX0xPVywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX0xBVENIRURfQ0xSLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fU0VULCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfRU5fQ0xSLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19JTlRfTEFUQ0hFRF9TVFMsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QRU5ESU5HX1NUUywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX01JRF9TRUwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9QUklPUklUWSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfTUlDQl8xX0VOLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfVkFMLCAweDIwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzFfSU5UX1JCSUFTLCAweDQ5fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NSUNCXzJfRU4sIDB4MjB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9BVEVTVF9DVExfMiwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfTUFTVEVSX0JJQVNfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0RFVF9DVExfMSwgMHgzNX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19ERVRfQ1RMXzIsIDB4MDh9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfRlNNX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfTUJIQ19EQk5DX1RJTUVSLCAweDk4fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjBfWkRFVExfQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjFfWkRFVE1fQ1RMLCAweDIwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjJfWkRFVEhfQ1RMLCAweDQwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjNfQ1RMLCAweDYxfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTjRfQ1RMLCAweDgwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19NQkhDX0JUTl9SRVNVTFQsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX01CSENfWkRFVF9FTEVDVF9SRVNVTFQsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfRU4sIDB4MDN9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzJfRU4sIDB4MDN9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9URVNUX0NUTF8xLCAweEJGfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19UWF8xXzJfVEVTVF9DVExfMiwgMHg4Q30sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX0FURVNUX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfMV8yX09QQU1QX0JJQVMsIDB4NkJ9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1RYXzFfMl9UWEZFX0NMS0RJViwgMHg1MX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFhfM19FTiwgMHgwMn0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfTkNQX0VOLCAweDI2fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xLLCAweDIzfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfREVHTElUQ0gsIDB4NUJ9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9GQkNUUkwsIDB4MDh9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9CSUFTLCAweDI5fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfVkNUUkwsIDB4MjR9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX05DUF9URVNULCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19OQ1BfQ0xJTV9BRERSLCAweEQ1fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DTE9DS19ESVZJREVSLCAweEU4fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9DT01fT0NQX0NUTCwgMHhDRn0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX09DUF9DT1VOVCwgMHg2RX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfQ09NX0JJQVNfREFDLCAweDE4fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQklBU19QQSwgMHg1QX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfTERPX09DUCwgMHg2OX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0JJQVNfQ05QLCAweDI5fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX0VOLCAweDgwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfQ05QX1dHX0NUTCwgMHhEQX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX0NOUF9XR19USU1FLCAweDE2fSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9URVNULCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfTF9QQV9EQUNfQ1RMLCAweDIwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9URVNULCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9IUEhfUl9QQV9EQUNfQ1RMLCAweDIwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9FQVJfQ1RMLCAweDEyfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SWF9BVEVTVCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfSFBIX1NUQVRVUywgMHgwQ30sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfRUFSX1NUQVRVUywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fREFDX0NUTCwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUlhfTE9fRU5fQ1RMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RBQ19DVEwsIDB4ODN9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX0NMSVBfREVULCAweDkxfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX0RSVl9DVEwsIDB4Mjl9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfQU5BX0JJQVNfU0VULCAweDREfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX09DUF9DVEwsIDB4RTF9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfUFdSU1RHX0NUTCwgMHgxRX0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfTUlTQywgMHhDQn0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfU1BLUl9EUlZfREJHLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19DVVJSRU5UX0xJTUlULCAweDAyfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19PVVRQVVRfVk9MVEFHRSwgMHgxNH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfQllQQVNTX01PREUsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX0JPT1NUX0VOX0NUTCwgMHgxRn0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfU0xPUEVfQ09NUF9JUF9aRVJPLCAweDhDfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19SRFNPTl9NQVhfRFVUWV9DWUNMRSwgMHhDMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVDFfMSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfQk9PU1RfVEVTVF8yLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19TUEtSX1NBUl9TVEFUVVMsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1NQS1JfRFJWX1NUQVRVUywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfUEJVU19BRERfQ1NSLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19QQlVTX0FERF9TRUwsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1NFQ19BQ0NFU1MsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDEsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDIsIDB4MDF9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDMsIDB4MDV9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX1BFUlBIX1JFU0VUX0NUTDQsIDB4MDB9LAotCXtNU004OVhYX1BNSUNfQU5BTE9HX0lOVF9URVNUMSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfSU5UX1RFU1RfVkFMLCAweDAwfSwKLQl7TVNNODlYWF9QTUlDX0FOQUxPR19UUklNX05VTSwgMHgwNH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMSwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMiwgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMMywgMHgwMH0sCi0Je01TTTg5WFhfUE1JQ19BTkFMT0dfVFJJTV9DVFJMNCwgMHgwMH0sCi19OwotCi1zdGF0aWMgY29uc3QgdTggbXNtODl4eF9jZGNfY29yZV9yZWdfcmVhZGFibGVbTVNNODlYWF9DRENfQ09SRV9DQUNIRV9TSVpFXSA9IHsKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX1JFU0VUX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfUkVTRVRfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19ETUlDX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfSTJTX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfSTJTX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9SRVNFVF9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYX0NMS19FTl9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX09USFJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX01DTEtfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19TRF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1RYMl9JMlNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0I0X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CNV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0I1X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjVfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgyX0I2X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfQjZfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMV9WT0xfQ1RMX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfVk9MX0NUTF9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgzX1ZPTF9DVExfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RPUF9HQUlOX1VQREFURV0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UT1BfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT01QMF9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I0X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT01QMF9CNV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjZfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX1NIVVRfRE9XTl9TVEFUVVNdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfRlNfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0RFTEFZX0JVRl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IxX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjJfQ1RMX0NGR10gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I0X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjVfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I2X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjZfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CN19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I3X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjhfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9COF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX1RJTUVSX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DT0VGX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfSTJTX1NEMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU5dID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0NGR10gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDVfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X0RNSUNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYMV9ETUlDX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfRE1JQ19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX0RNSUNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYNF9ETUlDX0NUTF0gPSAxLAotfTsKLQotc3RhdGljIGNvbnN0IHU4IG1zbTg5eHhfY2RjX2NvcmVfcmVnX3dyaXRlYWJsZVtNU004OVhYX0NEQ19DT1JFX0NBQ0hFX1NJWkVdID0gewotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfUlhfUkVTRVRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9SRVNFVF9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX0RNSUNfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19SWF9JMlNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19UWF9JMlNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NMS19PVEhSX1JFU0VUX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfVFhfQ0xLX0VOX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfT1RIUl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1BETV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1NEX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfRE1JQ19CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ0xLX1JYX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DTEtfVFgyX0kyU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0I0X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0I1X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjVfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CNV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX0I2X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDJfQjZfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX1ZPTF9DVExfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfUlgxX1ZPTF9DVExfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1JYMl9WT0xfQ1RMX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9SWDNfVk9MX0NUTF9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVE9QX0dBSU5fVVBEQVRFXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RPUF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT01QMF9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfQjRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0I1X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT01QMF9CNl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09NUDBfRlNfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTVAwX0RFTEFZX0JVRl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfREVTRVIxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19ERVNFUjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0RFQlVHX0IxX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfREVCVUdfQjJfQ1RMX0NGR10gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9ERUJVR19CM19DVExfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I0X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjVfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9CNV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX0I2X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fQjZfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfR0FJTl9CN19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9HQUlOX0I3X0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0dBSU5fQjhfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfR0FJTl9COF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMV9HQUlOX1RJTUVSX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIyX0dBSU5fVElNRVJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjFfQ09FRl9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfSUlSMl9DT0VGX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0lJUjJfQ09FRl9CMl9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDFfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgxX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMV9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDJfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgyX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1JYMl9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9SWDNfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fUlgzX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IxX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX1RYX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTFfQjJfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVExX0IzX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMV9CNF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjFfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fRVEyX0IyX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9DT05OX0VRMl9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9FUTJfQjRfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX0NPTk5fVFhfSTJTX1NEMV9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfQ09OTl9UWF9CM19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfVk9MX0NUTF9HQUlOXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0dBSU5dID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDFfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfQ0ZHXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYM19WT0xfQ1RMX0NGR10gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDRfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgxX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgyX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg0X0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfVElNRVJdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfR0FJTl0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDVfVk9MX0NUTF9DRkddID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X01VWF9DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X0NMS19GU19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFg1X0RNSUNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYMV9ETUlDX0NUTF0gPSAxLAotCQlbTVNNODlYWF9DRENfQ09SRV9UWDJfRE1JQ19DVExdID0gMSwKLQkJW01TTTg5WFhfQ0RDX0NPUkVfVFgzX0RNSUNfQ1RMXSA9IDEsCi0JCVtNU004OVhYX0NEQ19DT1JFX1RYNF9ETUlDX0NUTF0gPSAxLAotfTsKLQotYm9vbCBtc204OXh4X2NkY19jb3JlX3JlYWRhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIG1zbTg5eHhfY2RjX2NvcmVfcmVnX3JlYWRhYmxlW3JlZ107Ci19Ci0KLWJvb2wgbXNtODl4eF9jZGNfY29yZV93cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKLXsKLQlyZXR1cm4gbXNtODl4eF9jZGNfY29yZV9yZWdfd3JpdGVhYmxlW3JlZ107Ci19Ci0KLWJvb2wgbXNtODl4eF9jZGNfY29yZV92b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQotewotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CMV9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYMl9CMV9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYM19CMV9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYMV9CNl9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYMl9CNl9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1JYM19CNl9DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1RYMV9WT0xfQ1RMX0NGRzoKLQljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfVFgyX1ZPTF9DVExfQ0ZHOgotCWNhc2UgTVNNODlYWF9DRENfQ09SRV9UWDNfVk9MX0NUTF9DRkc6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX1RYNF9WT0xfQ1RMX0NGRzoKLQljYXNlIE1TTTg5WFhfQ0RDX0NPUkVfVFg1X1ZPTF9DVExfQ0ZHOgotCWNhc2UgTVNNODlYWF9DRENfQ09SRV9JSVIxX0NPRUZfQjFfQ1RMOgotCWNhc2UgTVNNODlYWF9DRENfQ09SRV9JSVIyX0NPRUZfQjFfQ1RMOgotCWNhc2UgTVNNODlYWF9DRENfQ09SRV9DTEtfTUNMS19DVEw6Ci0JY2FzZSBNU004OVhYX0NEQ19DT1JFX0NMS19QRE1fQ1RMOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IDVhOGQ5NmUuLmZlNDVhMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTEyNiw2ICsxMjYsMTYgQEAKIAl7IDEwOCwgMHgwMCB9LCB7IDEwOSwgMHgwMCB9LAogfTsKIAorc3RhdGljIGJvb2wgYWljM3hfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQUlDM1hfUkVTRVQ6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhaWMzeF9yZWdtYXAgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LApAQCAtMTMzLDYgKzE0Myw5IEBACiAJLm1heF9yZWdpc3RlciA9IERBQ19JQ0NfQURKLAogCS5yZWdfZGVmYXVsdHMgPSBhaWMzeF9yZWcsCiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGFpYzN4X3JlZyksCisKKwkudm9sYXRpbGVfcmVnID0gYWljM3hfdm9sYXRpbGVfcmVnLAorCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtbWdyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzlmOGMuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9yYW1kdW1wLmg+Ci0jaW5jbHVkZSA8c291bmQvd2NkLWRzcC1tZ3IuaD4KLSNpbmNsdWRlICJ3Y2QtZHNwLXV0aWxzLmgiCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1zdGF0aWMgY2hhciAqd2RzcF9nZXRfY21wbnRfdHlwZV9zdHJpbmcoZW51bSB3ZHNwX2NtcG50X3R5cGUpOwotCi0vKiBDb21wb25lbnQgcmVsYXRlZCBtYWNyb3MgKi8KLSNkZWZpbmUgV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIHgpICgoeCA+PSBXRFNQX0NNUE5UX1RZUEVfTUFYIHx8IHggPCAwKSA/IFwKLQkJCQkJTlVMTCA6ICgmKHdkc3AtPmNtcG50c1t4XSkpKQotI2RlZmluZSBXRFNQX0dFVF9DTVBOVF9UWVBFX1NUUih4KSB3ZHNwX2dldF9jbXBudF90eXBlX3N0cmluZyh4KQotCi0vKgotICogVGhlc2UgI2RlZmluZXMgaW5kaWNhdGUgdGhlIGJpdCBudW1iZXIgaW4gc3RhdHVzIGZpZWxkCi0gKiBmb3IgZWFjaCBvZiB0aGUgc3RhdHVzLiBJZiBiaXQgaXMgc2V0LCBpdCBpbmRpY2F0ZXMKLSAqIHRoZSBzdGF0dXMgYXMgZG9uZSwgZWxzZSBpZiBiaXQgaXMgbm90IHNldCwgaXQgaW5kaWNhdGVzCi0gKiB0aGUgc3RhdHVzIGlzIGVpdGhlciBmYWlsZWQgb3Igbm90IGRvbmUuCi0gKi8KLSNkZWZpbmUgV0RTUF9TVEFUVVNfSU5JVElBTElaRUQgICBCSVQoMCkKLSNkZWZpbmUgV0RTUF9TVEFUVVNfQ09ERV9ETE9BREVEICBCSVQoMSkKLSNkZWZpbmUgV0RTUF9TVEFUVVNfREFUQV9ETE9BREVEICBCSVQoMikKLSNkZWZpbmUgV0RTUF9TVEFUVVNfQk9PVEVEICAgICAgICBCSVQoMykKLQotLyogSGVscGVyIG1hY3JvcyBmb3IgcHJpbnRpbmcgd2RzcCBtZXNzYWdlcyAqLwotI2RlZmluZSBXRFNQX0VSUih3ZHNwLCBmbXQsIC4uLikJCVwKLQlkZXZfZXJyKHdkc3AtPm1kZXYsICIlczogIiBmbXQgIlxuIiwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIFdEU1BfREJHKHdkc3AsIGZtdCwgLi4uKQlcCi0JZGV2X2RiZyh3ZHNwLT5tZGV2LCAiJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQotCi0vKiBIZWxwZXIgbWFjcm9zIGZvciBsb2NraW5nICovCi0jZGVmaW5lIFdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgbG9jaykgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JV0RTUF9EQkcod2RzcCwgIm11dGV4X2xvY2soJXMpIiwgICAgICAgIFwKLQkJIF9fc3RyaW5naWZ5XzEobG9jaykpOyAgICAgICAgICBcCi0JbXV0ZXhfbG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBXRFNQX01HUl9NVVRFWF9VTkxPQ0sod2RzcCwgbG9jaykgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVdEU1BfREJHKHdkc3AsICJtdXRleF91bmxvY2soJXMpIiwgICAgICBcCi0JCSBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICAgICAgXAotCW11dGV4X3VubG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8qIEhlbHBlciBtYWNyb3MgZm9yIHVzaW5nIHN0YXR1cyBtYXNrICovCi0jZGVmaW5lIFdEU1BfU0VUX1NUQVRVUyh3ZHNwLCBzdGF0ZSkgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jd2RzcC0+c3RhdHVzIHw9IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlXRFNQX0RCRyh3ZHNwLCAic2V0IDB4JWx4LCBuZXdfc3RhdGUgPSAweCV4IiwgXAotCQkgc3RhdGUsIHdkc3AtPnN0YXR1cyk7ICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBzdGF0ZSkgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl3ZHNwLT5zdGF0dXMgJj0gKH5zdGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JV0RTUF9EQkcod2RzcCwgImNsZWFyIDB4JWx4LCBuZXdfc3RhdGUgPSAweCV4IiwgXAotCQkgc3RhdGUsIHdkc3AtPnN0YXR1cyk7ICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBzdGF0ZSkgKHdkc3AtPnN0YXR1cyAmIHN0YXRlKQotCi0vKiBTU1IgcmVsYXRlIHN0YXR1cyBtYWNyb3MgKi8KLSNkZWZpbmUgV0RTUF9TU1JfU1RBVFVTX1dEU1BfUkVBRFkgICAgQklUKDApCi0jZGVmaW5lIFdEU1BfU1NSX1NUQVRVU19DRENfUkVBRFkgICAgIEJJVCgxKQotI2RlZmluZSBXRFNQX1NTUl9TVEFUVVNfUkVBRFkgICAgICAgICBcCi0JKFdEU1BfU1NSX1NUQVRVU19XRFNQX1JFQURZIHwgV0RTUF9TU1JfU1RBVFVTX0NEQ19SRUFEWSkKLSNkZWZpbmUgV0RTUF9TU1JfUkVBRFlfV0FJVF9USU1FT1VUICAgKDEwICogSFopCi0KLWVudW0gd2RzcF9zc3JfdHlwZSB7Ci0KLQkvKiBJbml0IHZhbHVlLCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm8gU1NSIGluIHByb2dyZXNzICovCi0JV0RTUF9TU1JfVFlQRV9OT19TU1IgPSAwLAotCi0JLyoKLQkgKiBJbmRpY2F0ZXMgV0RTUCBjcmFzaGVkLiBUaGUgbWFuYWdlciBkcml2ZXIgaW50ZXJuYWxseQotCSAqIGRlY2lkZXMgd2hlbiB0byBwZXJmb3JtIFdEU1AgcmVzdGFydCBiYXNlZCBvbiB0aGUKLQkgKiB1c2VycyBvZiB3ZHNwLiBIZW5jZSB0aGVyZSBpcyBubyBleHBsaWNpdCBXRFNQX1VQLgotCSAqLwotCVdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOLAotCi0JLyogSW5kaWNhdGVzIGNvZGVjIGhhcmR3YXJlIGlzIGRvd24gKi8KLQlXRFNQX1NTUl9UWVBFX0NEQ19ET1dOLAotCi0JLyogSW5kaWNhdGVzIGNvZGVjIGhhcmR3YXJlIGlzIHVwLCB0cmlnZ2VyIHRvIHJlc3RhcnQgV0RTUCAqLwotCVdEU1BfU1NSX1RZUEVfQ0RDX1VQLAotfTsKLQotc3RydWN0IHdkc3BfY21wbnQgewotCi0JLyogT0Ygbm9kZSBvZiB0aGUgcGhhbmRsZSAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQkvKgotCSAqIENoaWxkIGNvbXBvbmVudCdzIGRldl9uYW1lLCBzaG91bGQgYmUgc2V0IGluIERUIGZvciB0aGUgY2hpbGQncwotCSAqIHBoYW5kbGUgaWYgY2hpbGQncyBkZXYtPm9mX25vZGUgZG9lcyBub3QgbWF0Y2ggdGhlIHBoYW5kbGUtPm9mX25vZGUKLQkgKi8KLQljb25zdCBjaGFyICpjZGV2X25hbWU7Ci0KLQkvKiBDaGlsZCBjb21wb25lbnQncyBkZXZpY2Ugbm9kZSAqLwotCXN0cnVjdCBkZXZpY2UgKmNkZXY7Ci0KLQkvKiBQcml2YXRlIGRhdGEgdGhhdCBjb21wb25lbnQgbWF5IHdhbnQgYmFjayBvbiBjYWxsYmFja3MgKi8KLQl2b2lkICpwcml2X2RhdGE7Ci0KLQkvKiBDaGlsZCBvcHMgKi8KLQlzdHJ1Y3Qgd2RzcF9jbXBudF9vcHMgKm9wczsKLX07Ci0KLXN0cnVjdCB3ZHNwX3JhbWR1bXBfZGF0YSB7Ci0KLQkvKiBSYW1kdW1wIGRldmljZSAqLwotCXZvaWQgKnJkX2RldjsKLQotCS8qIERNQSBhZGRyZXNzIG9mIHRoZSBkdW1wICovCi0JZG1hX2FkZHJfdCByZF9hZGRyOwotCi0JLyogVmlydHVhbCBhZGRyZXNzIG9mIHRoZSBkdW1wICovCi0Jdm9pZCAqcmRfdl9hZGRyOwotCi0JLyogRGF0YSBwcm92aWRlZCB0aHJvdWdoIGVycm9yIGludGVycnVwdCAqLwotCXN0cnVjdCB3ZHNwX2Vycl9zaWduYWxfYXJnIGVycl9kYXRhOwotfTsKLQotc3RydWN0IHdkc3BfbWdyX3ByaXYgewotCi0JLyogTWFuYWdlciBkcml2ZXIncyBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgKi8KLQlzdHJ1Y3QgZGV2aWNlICptZGV2OwotCi0JLyogTWF0Y2ggc3RydWN0IGZvciBjb21wb25lbnQgZnJhbWV3b3JrICovCi0Jc3RydWN0IGNvbXBvbmVudF9tYXRjaCAqbWF0Y2g7Ci0KLQkvKiBNYW5hZ2VyJ3Mgb3BzL2Z1bmN0aW9uIGNhbGxiYWNrcyAqLwotCXN0cnVjdCB3ZHNwX21ncl9vcHMgKm9wczsKLQotCS8qIEFycmF5IHRvIHN0b3JlIGluZm9ybWF0aW9uIGZvciBhbGwgZXhwZWN0ZWQgY29tcG9uZW50cyAqLwotCXN0cnVjdCB3ZHNwX2NtcG50IGNtcG50c1tXRFNQX0NNUE5UX1RZUEVfTUFYXTsKLQotCS8qIFRoZSBmaWxlbmFtZSBvZiBpbWFnZSB0byBiZSBkb3dubG9hZGVkICovCi0JY29uc3QgY2hhciAqaW1nX2ZuYW1lOwotCi0JLyogS2VlcHMgdHJhY2sgb2YgY3VycmVudCBzdGF0ZSBvZiBtYW5hZ2VyIGRyaXZlciAqLwotCXUzMiBzdGF0dXM7Ci0KLQkvKiBXb3JrIHRvIGxvYWQgdGhlIGZpcm13YXJlIGltYWdlIGFmdGVyIGNvbXBvbmVudCBiaW5kaW5nICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IGxvYWRfZndfd29yazsKLQotCS8qIExpc3Qgb2Ygc2VnbWVudHMgaW4gaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgKnNlZ19saXN0OwotCi0JLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBpbWFnZSBpbiBtZW1vcnkgKi8KLQl1MzIgYmFzZV9hZGRyOwotCi0JLyogSW5zdGFuY2VzIHVzaW5nIGRzcCAqLwotCWludCBkc3BfdXNlcnM7Ci0KLQkvKiBMb2NrIGZvciBzZXJpYWxpemluZyBvcHMgY2FsbGVkIGJ5IGNvbXBvbmVudHMgKi8KLQlzdHJ1Y3QgbXV0ZXggYXBpX211dGV4OwotCi0Jc3RydWN0IHdkc3BfcmFtZHVtcF9kYXRhIGR1bXBfZGF0YTsKLQotCS8qIFNTUiByZWxhdGVkICovCi0JZW51bSB3ZHNwX3Nzcl90eXBlIHNzcl90eXBlOwotCXN0cnVjdCBtdXRleCBzc3JfbXV0ZXg7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHNzcl93b3JrOwotCXUxNiByZWFkeV9zdGF0dXM7Ci0Jc3RydWN0IGNvbXBsZXRpb24gcmVhZHlfY29tcGw7Ci0KLQkvKiBEZWJ1Z2ZzIHJlbGF0ZWQgKi8KLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKLQlib29sIHBhbmljX29uX2Vycm9yOwotfTsKLQotc3RhdGljIGNoYXIgKndkc3BfZ2V0X3Nzcl90eXBlX3N0cmluZyhlbnVtIHdkc3Bfc3NyX3R5cGUgdHlwZSkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdEU1BfU1NSX1RZUEVfTk9fU1NSOgotCQlyZXR1cm4gIk5PX1NTUiI7Ci0JY2FzZSBXRFNQX1NTUl9UWVBFX1dEU1BfRE9XTjoKLQkJcmV0dXJuICJXRFNQX0RPV04iOwotCWNhc2UgV0RTUF9TU1JfVFlQRV9DRENfRE9XTjoKLQkJcmV0dXJuICJDRENfRE9XTiI7Ci0JY2FzZSBXRFNQX1NTUl9UWVBFX0NEQ19VUDoKLQkJcmV0dXJuICJDRENfVVAiOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgc3NyX3R5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdHlwZSk7Ci0JCXJldHVybiAiSW52YWxpZCI7Ci0JfQotfQotCi1zdGF0aWMgY2hhciAqd2RzcF9nZXRfY21wbnRfdHlwZV9zdHJpbmcoZW51bSB3ZHNwX2NtcG50X3R5cGUgdHlwZSkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdEU1BfQ01QTlRfQ09OVFJPTDoKLQkJcmV0dXJuICJjb250cm9sIjsKLQljYXNlIFdEU1BfQ01QTlRfSVBDOgotCQlyZXR1cm4gImlwYyI7Ci0JY2FzZSBXRFNQX0NNUE5UX1RSQU5TUE9SVDoKLQkJcmV0dXJuICJ0cmFuc3BvcnQiOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29tcG9uZW50IHR5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdHlwZSk7Ci0JCXJldHVybiAiSW52YWxpZCI7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX3dkc3BfY2xyX3JlYWR5X2xvY2tlZChzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKLQkJCQkgICAgdTE2IHZhbHVlKQotewotCXdkc3AtPnJlYWR5X3N0YXR1cyAmPSB+KHZhbHVlKTsKLQlXRFNQX0RCRyh3ZHNwLCAicmVhZHlfc3RhdHVzID0gMHgleCIsIHdkc3AtPnJlYWR5X3N0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fd2RzcF9zZXRfcmVhZHlfbG9ja2VkKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwLAotCQkJCSAgICB1MTYgdmFsdWUsIGJvb2wgbWFya19jb21wbGV0ZSkKLXsKLQl3ZHNwLT5yZWFkeV9zdGF0dXMgfD0gdmFsdWU7Ci0JV0RTUF9EQkcod2RzcCwgInJlYWR5X3N0YXR1cyA9IDB4JXgiLCB3ZHNwLT5yZWFkeV9zdGF0dXMpOwotCi0JaWYgKG1hcmtfY29tcGxldGUgJiYKLQkgICAgd2RzcC0+cmVhZHlfc3RhdHVzID09IFdEU1BfU1NSX1NUQVRVU19SRUFEWSkgewotCQlXRFNQX0RCRyh3ZHNwLCAibWFya2luZyByZWFkeSBjb21wbGV0aW9uIik7Ci0JCWNvbXBsZXRlKCZ3ZHNwLT5yZWFkeV9jb21wbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3ZHNwX2Jyb2FkY2FzdF9ldmVudF91cHNlcShzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKLQkJCQkgICAgICAgZW51bSB3ZHNwX2V2ZW50X3R5cGUgZXZlbnQsCi0JCQkJICAgICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFdEU1BfQ01QTlRfVFlQRV9NQVg7IGkrKykgewotCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKLQkJaWYgKGNtcG50ICYmIGNtcG50LT5vcHMgJiYgY21wbnQtPm9wcy0+ZXZlbnRfaGFuZGxlcikKLQkJCWNtcG50LT5vcHMtPmV2ZW50X2hhbmRsZXIoY21wbnQtPmNkZXYsIGNtcG50LT5wcml2X2RhdGEsCi0JCQkJCQkgIGV2ZW50LCBkYXRhKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AsCi0JCQkJCSBlbnVtIHdkc3BfZXZlbnRfdHlwZSBldmVudCwKLQkJCQkJIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OwotCWludCBpOwotCi0JZm9yIChpID0gV0RTUF9DTVBOVF9UWVBFX01BWCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIGkpOwotCQlpZiAoY21wbnQgJiYgY21wbnQtPm9wcyAmJiBjbXBudC0+b3BzLT5ldmVudF9oYW5kbGVyKQotCQkJY21wbnQtPm9wcy0+ZXZlbnRfaGFuZGxlcihjbXBudC0+Y2RldiwgY21wbnQtPnByaXZfZGF0YSwKLQkJCQkJCSAgZXZlbnQsIGRhdGEpOwotCX0KLX0KLQotc3RhdGljIGludCB3ZHNwX3VuaWNhc3RfZXZlbnQoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AsCi0JCQkgICAgICBlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlLAotCQkJICAgICAgZW51bSB3ZHNwX2V2ZW50X3R5cGUgZXZlbnQsCi0JCQkgICAgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKLQlpbnQgcmV0OwotCi0JY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgdHlwZSk7Ci0JaWYgKGNtcG50ICYmIGNtcG50LT5vcHMgJiYgY21wbnQtPm9wcy0+ZXZlbnRfaGFuZGxlcikgewotCQlyZXQgPSBjbXBudC0+b3BzLT5ldmVudF9oYW5kbGVyKGNtcG50LT5jZGV2LCBjbXBudC0+cHJpdl9kYXRhLAotCQkJCQkJZXZlbnQsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJub3QgdmFsaWQgZXZlbnRfaGFuZGxlciBmb3IgJXMiLAotCQkJIFdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKHR5cGUpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3ZHNwX2RlaW5pdF9jb21wb25lbnRzKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwKQotewotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IFdEU1BfQ01QTlRfVFlQRV9NQVggLSAxOyBpID49IDA7IGktLSkgewotCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKLQkJaWYgKGNtcG50ICYmIGNtcG50LT5vcHMgJiYgY21wbnQtPm9wcy0+ZGVpbml0KQotCQkJY21wbnQtPm9wcy0+ZGVpbml0KGNtcG50LT5jZGV2LCBjbXBudC0+cHJpdl9kYXRhKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9pbml0X2NvbXBvbmVudHMoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCi17Ci0Jc3RydWN0IHdkc3BfY21wbnQgKmNtcG50OwotCWludCBmYWlsX2lkeCA9IFdEU1BfQ01QTlRfVFlQRV9NQVg7Ci0JaW50IGksIHJldCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0RTUF9DTVBOVF9UWVBFX01BWDsgaSsrKSB7Ci0KLQkJY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgaSk7Ci0KLQkJLyogSW5pdCBpcyBhbGxvd2VkIHRvIGJlIE5VTEwgKi8KLQkJaWYgKCFjbXBudC0+b3BzIHx8ICFjbXBudC0+b3BzLT5pbml0KQotCQkJY29udGludWU7Ci0JCXJldCA9IGNtcG50LT5vcHMtPmluaXQoY21wbnQtPmNkZXYsIGNtcG50LT5wcml2X2RhdGEpOwotCQlpZiAocmV0KSB7Ci0JCQlXRFNQX0VSUih3ZHNwLCAiSW5pdCBmYWlsZWQgKCVkKSBmb3IgY29tcG9uZW50ICVzIiwKLQkJCQkgcmV0LCBXRFNQX0dFVF9DTVBOVF9UWVBFX1NUUihpKSk7Ci0JCQkJZmFpbF9pZHggPSBpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGZhaWxfaWR4IDwgV0RTUF9DTVBOVF9UWVBFX01BWCkgewotCQkvKiBVbmRvIGluaXQgZm9yIGFscmVhZHkgaW5pdGlhbGl6ZWQgY29tcG9uZW50cyAqLwotCQlmb3IgKGkgPSBmYWlsX2lkeCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgaSk7Ci0KLQkJCWlmIChjbXBudC0+b3BzICYmIGNtcG50LT5vcHMtPmRlaW5pdCkKLQkJCQljbXBudC0+b3BzLT5kZWluaXQoY21wbnQtPmNkZXYsCi0JCQkJCQkgICBjbXBudC0+cHJpdl9kYXRhKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QT1NUX0lOSVQsIE5VTEwpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9sb2FkX2VhY2hfc2VnbWVudChzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKLQkJCQkgIHN0cnVjdCB3ZHNwX2ltZ19zZWdtZW50ICpzZWcpCi17Ci0Jc3RydWN0IHdkc3BfaW1nX3NlY3Rpb24gaW1nX3NlY3Rpb247Ci0JaW50IHJldDsKLQotCVdEU1BfREJHKHdkc3AsCi0JCSAiYmFzZV9hZGRyIDB4JXgsIHNwbGl0X2ZuYW1lICVzLCBsb2FkX2FkZHIgMHgleCwgc2l6ZSAweCV6eCIsCi0JCSB3ZHNwLT5iYXNlX2FkZHIsIHNlZy0+c3BsaXRfZm5hbWUsIHNlZy0+bG9hZF9hZGRyLCBzZWctPnNpemUpOwotCi0JaWYgKHNlZy0+bG9hZF9hZGRyIDwgd2RzcC0+YmFzZV9hZGRyKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJJbnZhbGlkIGFkZHIgMHgleCwgYmFzZV9hZGRyID0gMHgleCIsCi0JCQkgc2VnLT5sb2FkX2FkZHIsIHdkc3AtPmJhc2VfYWRkcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWltZ19zZWN0aW9uLmFkZHIgPSBzZWctPmxvYWRfYWRkciAtIHdkc3AtPmJhc2VfYWRkcjsKLQlpbWdfc2VjdGlvbi5zaXplID0gc2VnLT5zaXplOwotCWltZ19zZWN0aW9uLmRhdGEgPSBzZWctPmRhdGE7Ci0KLQlyZXQgPSB3ZHNwX3VuaWNhc3RfZXZlbnQod2RzcCwgV0RTUF9DTVBOVF9UUkFOU1BPUlQsCi0JCQkJIFdEU1BfRVZFTlRfRExPQURfU0VDVElPTiwKLQkJCQkgJmltZ19zZWN0aW9uKTsKLQlpZiAocmV0IDwgMCkKLQkJV0RTUF9FUlIod2RzcCwKLQkJCSAiRmFpbGVkLCBlcnIgPSAlZCBmb3IgYmFzZV9hZGRyID0gMHgleCBzcGxpdF9mbmFtZSA9ICVzLCBsb2FkX2FkZHIgPSAweCV4LCBzaXplID0gMHglengiLAotCQkJIHJldCwgd2RzcC0+YmFzZV9hZGRyLCBzZWctPnNwbGl0X2ZuYW1lLAotCQkJIHNlZy0+bG9hZF9hZGRyLCBzZWctPnNpemUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9kb3dubG9hZF9zZWdtZW50cyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCwKLQkJCQkgIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN0cnVjdCB3ZHNwX2NtcG50ICpjdGw7Ci0Jc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZyA9IE5VTEw7Ci0JZW51bSB3ZHNwX2V2ZW50X3R5cGUgcHJlLCBwb3N0OwotCWxvbmcgc3RhdHVzOwotCWludCByZXQ7Ci0KLQljdGwgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgV0RTUF9DTVBOVF9DT05UUk9MKTsKLQotCWlmICh0eXBlID09IFdEU1BfRUxGX0ZMQUdfUkUpIHsKLQkJcHJlID0gV0RTUF9FVkVOVF9QUkVfRExPQURfQ09ERTsKLQkJcG9zdCA9IFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9DT0RFOwotCQlzdGF0dXMgPSBXRFNQX1NUQVRVU19DT0RFX0RMT0FERUQ7Ci0JfSBlbHNlIGlmICh0eXBlID09IFdEU1BfRUxGX0ZMQUdfV1JJVEUpIHsKLQkJcHJlID0gV0RTUF9FVkVOVF9QUkVfRExPQURfREFUQTsKLQkJcG9zdCA9IFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9EQVRBOwotCQlzdGF0dXMgPSBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQ7Ci0JfSBlbHNlIHsKLQkJV0RTUF9FUlIod2RzcCwgIkludmFsaWQgdHlwZSAldSIsIHR5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSB3ZHNwX2dldF9zZWdtZW50X2xpc3QoY3RsLT5jZGV2LCB3ZHNwLT5pbWdfZm5hbWUsCi0JCQkJICAgIHR5cGUsIHdkc3AtPnNlZ19saXN0LCAmd2RzcC0+YmFzZV9hZGRyKTsKLQlpZiAocmV0IDwgMCB8fAotCSAgICBsaXN0X2VtcHR5KHdkc3AtPnNlZ19saXN0KSkgewotCQlXRFNQX0VSUih3ZHNwLCAiRXJyb3IgJWQgdG8gZ2V0IGltYWdlIHNlZ21lbnRzIGZvciB0eXBlICVkIiwKLQkJCSByZXQsIHR5cGUpOwotCQl3ZHNwX2Jyb2FkY2FzdF9ldmVudF9kb3duc2VxKHdkc3AsIFdEU1BfRVZFTlRfRExPQURfRkFJTEVELAotCQkJCQkgICAgIE5VTEwpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogTm90aWZ5IGFsbCBjb21wb25lbnRzIHRoYXQgaW1hZ2UgaXMgYWJvdXQgdG8gYmUgZG93bmxvYWRlZCAqLwotCXdkc3BfYnJvYWRjYXN0X2V2ZW50X3Vwc2VxKHdkc3AsIHByZSwgTlVMTCk7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHNlZ21lbnRzIGFuZCBkb3dubG9hZCBvbmUgYnkgb25lICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShzZWcsIHdkc3AtPnNlZ19saXN0LCBsaXN0KSB7Ci0JCXJldCA9IHdkc3BfbG9hZF9lYWNoX3NlZ21lbnQod2RzcCwgc2VnKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZGxvYWRfZXJyb3I7Ci0JfQotCi0JLyogRmx1c2ggdGhlIGxpc3QgYmVmb3JlIHNldHRpbmcgc3RhdHVzIGFuZCBub3RpZnlpbmcgY29tcG9uZW50cyAqLwotCXdkc3BfZmx1c2hfc2VnbWVudF9saXN0KHdkc3AtPnNlZ19saXN0KTsKLQotCVdEU1BfU0VUX1NUQVRVUyh3ZHNwLCBzdGF0dXMpOwotCi0JLyogTm90aWZ5IGFsbCBjb21wb25lbnRzIHRoYXQgaW1hZ2UgaXMgZG93bmxvYWRlZCAqLwotCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgcG9zdCwgTlVMTCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci0KLWRsb2FkX2Vycm9yOgotCXdkc3BfZmx1c2hfc2VnbWVudF9saXN0KHdkc3AtPnNlZ19saXN0KTsKLQl3ZHNwX2Jyb2FkY2FzdF9ldmVudF9kb3duc2VxKHdkc3AsIFdEU1BfRVZFTlRfRExPQURfRkFJTEVELCBOVUxMKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdkc3BfaW5pdF9hbmRfZGxvYWRfY29kZV9zZWN0aW9ucyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKLXsKLQlpbnQgcmV0OwotCWJvb2wgaXNfaW5pdGlhbGl6ZWQ7Ci0KLQlpc19pbml0aWFsaXplZCA9IFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19JTklUSUFMSVpFRCk7Ci0KLQlpZiAoIWlzX2luaXRpYWxpemVkKSB7Ci0JCS8qIENvbXBvbmVudHMgYXJlIG5vdCBpbml0aWFsaXplZCB5ZXQsIGluaXRpYWxpemUgdGhlbSAqLwotCQlyZXQgPSB3ZHNwX2luaXRfY29tcG9uZW50cyh3ZHNwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCVdEU1BfRVJSKHdkc3AsICJJTklUIGZhaWxlZCwgZXJyID0gJWQiLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCVdEU1BfU0VUX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19JTklUSUFMSVpFRCk7Ci0JfQotCi0JLyogRG93bmxvYWQgdGhlIHJlYWQtZXhlY3V0ZSBzZWN0aW9ucyBvZiBpbWFnZSAqLwotCXJldCA9IHdkc3BfZG93bmxvYWRfc2VnbWVudHMod2RzcCwgV0RTUF9FTEZfRkxBR19SRSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJV0RTUF9FUlIod2RzcCwgIkVycm9yICVkIHRvIGRvd25sb2FkIGNvZGUgc2VjdGlvbnMiLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3ZHNwX2xvYWRfZndfaW1hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOwotCWludCByZXQ7Ci0KLQl3ZHNwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3ZHNwX21ncl9wcml2LCBsb2FkX2Z3X3dvcmspOwotCWlmICghd2RzcCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gd2RzcF9pbml0X2FuZF9kbG9hZF9jb2RlX3NlY3Rpb25zKHdkc3ApOwotCWlmIChyZXQgPCAwKQotCQlXRFNQX0VSUih3ZHNwLCAiZGxvYWQgY29kZSBzZWN0aW9ucyBmYWlsZWQsIGVyciA9ICVkIiwgcmV0KTsKLX0KLQotc3RhdGljIGludCB3ZHNwX2VuYWJsZV9kc3Aoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCi17Ci0JaW50IHJldDsKLQotCS8qIE1ha2Ugc3VyZSB3ZHNwIGlzIGluIGdvb2Qgc3RhdGUgKi8KLQlpZiAoIVdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19DT0RFX0RMT0FERUQpKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJXRFNQIGluIGludmFsaWQgc3RhdGUgMHgleCIsIHdkc3AtPnN0YXR1cyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogQWNxdWlyZSBTU1IgbXV0ZXggbG9jayB0byBtYWtlIHN1cmUgZW5hYmxlbWVudCBvZiBEU1AKLQkgKiBkb2VzIG5vdCByYWNlIHdpdGggU1NSIGhhbmRsaW5nLgotCSAqLwotCVdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKLQkvKiBEb3dubG9hZCB0aGUgcmVhZC13cml0ZSBzZWN0aW9ucyBvZiBpbWFnZSAqLwotCXJldCA9IHdkc3BfZG93bmxvYWRfc2VnbWVudHMod2RzcCwgV0RTUF9FTEZfRkxBR19XUklURSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJV0RTUF9FUlIod2RzcCwgIkRhdGEgc2VjdGlvbiBkb3dubG9hZCBmYWlsZWQsIGVyciA9ICVkIiwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXdkc3BfYnJvYWRjYXN0X2V2ZW50X3Vwc2VxKHdkc3AsIFdEU1BfRVZFTlRfUFJFX0JPT1RVUCwgTlVMTCk7Ci0KLQlyZXQgPSB3ZHNwX3VuaWNhc3RfZXZlbnQod2RzcCwgV0RTUF9DTVBOVF9DT05UUk9MLAotCQkJCSBXRFNQX0VWRU5UX0RPX0JPT1QsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgdG8gYm9vdCBkc3AsIGVyciA9ICVkIiwgcmV0KTsKLQkJV0RTUF9DTEVBUl9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfREFUQV9ETE9BREVEKTsKLQkJZ290byBkb25lOwotCX0KLQotCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QT1NUX0JPT1RVUCwgTlVMTCk7Ci0JV0RTUF9TRVRfU1RBVFVTKHdkc3AsIFdEU1BfU1RBVFVTX0JPT1RFRCk7Ci1kb25lOgotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9kaXNhYmxlX2RzcChzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKLXsKLQlpbnQgcmV0OwotCi0JV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotCi0JLyoKLQkgKiBJZiBEaXNhYmxlIGhhcHBlbmVkIHdoaWxlIFNTUiBpcyBpbiBwcm9ncmVzcywgdGhlbiBzZXQgdGhlIFNTUgotCSAqIHJlYWR5IHN0YXR1cyBpbmRpY2F0aW5nIFdEU1AgaXMgbm93IHJlYWR5LiBJZ25vcmUgdGhlIGRpc2FibGUKLQkgKiBldmVudCBoZXJlIGFuZCBsZXQgdGhlIFNTUiBoYW5kbGVyIGdvIHRocm91Z2ggc2h1dGRvd24uCi0JICovCi0JaWYgKHdkc3AtPnNzcl90eXBlICE9IFdEU1BfU1NSX1RZUEVfTk9fU1NSKSB7Ci0JCV9fd2RzcF9zZXRfcmVhZHlfbG9ja2VkKHdkc3AsIFdEU1BfU1NSX1NUQVRVU19XRFNQX1JFQURZLCB0cnVlKTsKLQkJV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotCi0JLyogTWFrZSBzdXJlIHdkc3AgaXMgaW4gZ29vZCBzdGF0ZSAqLwotCWlmICghV0RTUF9TVEFUVVNfSVNfU0VUKHdkc3AsIFdEU1BfU1RBVFVTX0JPT1RFRCkpIHsKLQkJV0RTUF9FUlIod2RzcCwgIndkc3AgaW4gaW52YWxpZCBzdGF0ZSAweCV4Iiwgd2RzcC0+c3RhdHVzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QUkVfU0hVVERPV04sIE5VTEwpOwotCXJldCA9IHdkc3BfdW5pY2FzdF9ldmVudCh3ZHNwLCBXRFNQX0NNUE5UX0NPTlRST0wsCi0JCQkJIFdEU1BfRVZFTlRfRE9fU0hVVERPV04sIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgdG8gc2h1dGRvd24gZHNwLCBlcnIgPSAlZCIsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl3ZHNwX2Jyb2FkY2FzdF9ldmVudF9kb3duc2VxKHdkc3AsIFdEU1BfRVZFTlRfUE9TVF9TSFVURE9XTiwgTlVMTCk7Ci0JV0RTUF9DTEVBUl9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfQk9PVEVEKTsKLQotCS8qIERhdGEgc2VjdGlvbnMgYXJlIHRvIGJlIGRvd25sb2FkZWQgcGVyIGJvb3QgKi8KLQlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdkc3BfcmVnaXN0ZXJfY21wbnRfb3BzKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmNkZXYsCi0JCQkJICAgdm9pZCAqcHJpdl9kYXRhLAotCQkJCSAgIHN0cnVjdCB3ZHNwX2NtcG50X29wcyAqb3BzKQotewotCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOwotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKLQlpbnQgaSwgcmV0OwotCi0JaWYgKCF3ZHNwX2RldiB8fCAhY2RldiB8fCAhb3BzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOwotCi0JV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOwotCi0JZm9yIChpID0gMDsgaSA8IFdEU1BfQ01QTlRfVFlQRV9NQVg7IGkrKykgewotCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpKTsKLQkJaWYgKChjZGV2LT5vZl9ub2RlICYmIGNkZXYtPm9mX25vZGUgPT0gY21wbnQtPm5wKSB8fAotCQkgICAgKGNtcG50LT5jZGV2X25hbWUgJiYKLQkJICAgICAhc3RyY21wKGRldl9uYW1lKGNkZXYpLCBjbXBudC0+Y2Rldl9uYW1lKSkpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gV0RTUF9DTVBOVF9UWVBFX01BWCkgewotCQlXRFNQX0VSUih3ZHNwLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCBkZXYgJXMiLAotCQkJIGRldl9uYW1lKGNkZXYpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWNtcG50LT5jZGV2ID0gY2RldjsKLQljbXBudC0+b3BzID0gb3BzOwotCWNtcG50LT5wcml2X2RhdGEgPSBwcml2X2RhdGE7Ci1kb25lOgotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZSAqd2RzcF9nZXRfZGV2X2Zvcl9jbXBudChzdHJ1Y3QgZGV2aWNlICp3ZHNwX2RldiwKLQkJCQkJICAgICBlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlKQotewotCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOwotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKLQotCWlmICghd2RzcF9kZXYgfHwgdHlwZSA+PSBXRFNQX0NNUE5UX1RZUEVfTUFYKQotCQlyZXR1cm4gTlVMTDsKLQotCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOwotCWNtcG50ID0gV0RTUF9HRVRfQ09NUE9ORU5UKHdkc3AsIHR5cGUpOwotCi0JcmV0dXJuIGNtcG50LT5jZGV2OwotfQotCi1zdGF0aWMgaW50IHdkc3BfZ2V0X2Rldm9wc19mb3JfY21wbnQoc3RydWN0IGRldmljZSAqd2RzcF9kZXYsCi0JCQkJICAgICBlbnVtIHdkc3BfY21wbnRfdHlwZSB0eXBlLAotCQkJCSAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghd2RzcF9kZXYgfHwgdHlwZSA+PSBXRFNQX0NNUE5UX1RZUEVfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOwotCXJldCA9IHdkc3BfdW5pY2FzdF9ldmVudCh3ZHNwLCB0eXBlLAotCQkJCSBXRFNQX0VWRU5UX0dFVF9ERVZPUFMsIGRhdGEpOwotCWlmIChyZXQpCi0JCVdEU1BfRVJSKHdkc3AsICJnZXRfZGV2X29wcyBmYWlsZWQgZm9yIGNtcG50IHR5cGUgJWQiLAotCQkJIHR5cGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdkc3BfY29sbGVjdF9yYW1kdW1wcyhzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKLXsKLQlzdHJ1Y3Qgd2RzcF9pbWdfc2VjdGlvbiBpbWdfc2VjdGlvbjsKLQlzdHJ1Y3Qgd2RzcF9lcnJfc2lnbmFsX2FyZyAqZGF0YSA9ICZ3ZHNwLT5kdW1wX2RhdGEuZXJyX2RhdGE7Ci0Jc3RydWN0IHJhbWR1bXBfc2VnbWVudCByZF9zZWc7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAod2RzcC0+c3NyX3R5cGUgIT0gV0RTUF9TU1JfVFlQRV9XRFNQX0RPV04gfHwKLQkgICAgIWRhdGEtPm1lbV9kdW1wc19lbmFibGVkKSB7Ci0JCVdEU1BfREJHKHdkc3AsICJjYW5ub3QgZHVtcCBtZW1vcnksIHNzcl90eXBlICVzLCBkdW1wcyAlcyIsCi0JCQkgd2RzcF9nZXRfc3NyX3R5cGVfc3RyaW5nKHdkc3AtPnNzcl90eXBlKSwKLQkJCSAhKGRhdGEtPm1lbV9kdW1wc19lbmFibGVkKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGRhdGEtPmR1bXBfc2l6ZSA9PSAwIHx8Ci0JICAgIGRhdGEtPnJlbW90ZV9zdGFydF9hZGRyIDwgd2RzcC0+YmFzZV9hZGRyKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJJbnZhbGlkIHN0YXJ0IGFkZHIgMHgleCBvciBkdW1wX3NpemUgMHglengiLAotCQkJIGRhdGEtPnJlbW90ZV9zdGFydF9hZGRyLCBkYXRhLT5kdW1wX3NpemUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCF3ZHNwLT5kdW1wX2RhdGEucmRfZGV2KSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJSYW1kdW1wIGRldmljZSBpcyBub3Qgc2V0dXAiKTsKLQkJZ290byBkb25lOwotCX0KLQotCVdEU1BfREJHKHdkc3AsICJiYXNlX2FkZHIgMHgleCwgZHVtcF9zdGFydF9hZGRyIDB4JXgsIGR1bXBfc2l6ZSAweCV6eCIsCi0JCSB3ZHNwLT5iYXNlX2FkZHIsIGRhdGEtPnJlbW90ZV9zdGFydF9hZGRyLCBkYXRhLT5kdW1wX3NpemUpOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkdW1wcyAqLwotCXdkc3AtPmR1bXBfZGF0YS5yZF92X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQod2RzcC0+bWRldiwKLQkJCQkJCSAgICAgICBkYXRhLT5kdW1wX3NpemUsCi0JCQkJCQkgICAgICAgJndkc3AtPmR1bXBfZGF0YS5yZF9hZGRyLAotCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghd2RzcC0+ZHVtcF9kYXRhLnJkX3ZfYWRkcikKLQkJZ290byBkb25lOwotCi0JaW1nX3NlY3Rpb24uYWRkciA9IGRhdGEtPnJlbW90ZV9zdGFydF9hZGRyIC0gd2RzcC0+YmFzZV9hZGRyOwotCWltZ19zZWN0aW9uLnNpemUgPSBkYXRhLT5kdW1wX3NpemU7Ci0JaW1nX3NlY3Rpb24uZGF0YSA9IHdkc3AtPmR1bXBfZGF0YS5yZF92X2FkZHI7Ci0KLQlyZXQgPSB3ZHNwX3VuaWNhc3RfZXZlbnQod2RzcCwgV0RTUF9DTVBOVF9UUkFOU1BPUlQsCi0JCQkJIFdEU1BfRVZFTlRfUkVBRF9TRUNUSU9OLAotCQkJCSAmaW1nX3NlY3Rpb24pOwotCWlmIChyZXQgPCAwKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgdG8gcmVhZCBkdW1wcywgc2l6ZSAweCV6eCBhdCBhZGRyIDB4JXgiLAotCQkJIGltZ19zZWN0aW9uLnNpemUsIGltZ19zZWN0aW9uLmFkZHIpOwotCQlnb3RvIGVycl9yZWFkX2R1bXBzOwotCX0KLQotCS8qCi0JICogSWYgcGFuaWNfb25fZXJyb3IgZmxhZyBpcyBleHBsaWNpdGx5IHNldCB0aHJvdWdoIHRoZSBkZWJ1Z2ZzLAotCSAqIHRoZW4gY2F1c2UgYSBCVUcgaGVyZSB0byBhaWQgZGVidWdnaW5nLgotCSAqLwotCUJVR19PTih3ZHNwLT5wYW5pY19vbl9lcnJvcik7Ci0KLQlyZF9zZWcuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSB3ZHNwLT5kdW1wX2RhdGEucmRfdl9hZGRyOwotCXJkX3NlZy5zaXplID0gaW1nX3NlY3Rpb24uc2l6ZTsKLQlyZF9zZWcudl9hZGRyZXNzID0gd2RzcC0+ZHVtcF9kYXRhLnJkX3ZfYWRkcjsKLQotCXJldCA9IGRvX3JhbWR1bXAod2RzcC0+ZHVtcF9kYXRhLnJkX2RldiwgJnJkX3NlZywgMSk7Ci0JaWYgKHJldCA8IDApCi0JCVdEU1BfRVJSKHdkc3AsICJkb19yYW1kdW1wIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgcmV0KTsKLQotZXJyX3JlYWRfZHVtcHM6Ci0JZG1hX2ZyZWVfY29oZXJlbnQod2RzcC0+bWRldiwgZGF0YS0+ZHVtcF9zaXplLAotCQkJICB3ZHNwLT5kdW1wX2RhdGEucmRfdl9hZGRyLCB3ZHNwLT5kdW1wX2RhdGEucmRfYWRkcik7Ci1kb25lOgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgd2RzcF9zc3Jfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7Ci0JaW50IHJldDsKLQotCXdkc3AgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdkc3BfbWdyX3ByaXYsIHNzcl93b3JrKTsKLQlpZiAoIXdkc3ApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlX2RhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCVdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKLQotCS8qIElzc3VlIHJhbWR1bXBzIGFuZCBzaHV0ZG93biBvbmx5IGlmIERTUCBpcyBjdXJyZW50bHkgYm9vdGVkICovCi0JaWYgKFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19CT09URUQpKSB7Ci0JCXdkc3BfY29sbGVjdF9yYW1kdW1wcyh3ZHNwKTsKLQkJcmV0ID0gd2RzcF91bmljYXN0X2V2ZW50KHdkc3AsIFdEU1BfQ01QTlRfQ09OVFJPTCwKLQkJCQkJIFdEU1BfRVZFTlRfRE9fU0hVVERPV04sIE5VTEwpOwotCQlpZiAocmV0IDwgMCkKLQkJCVdEU1BfRVJSKHdkc3AsICJGYWlsZWQgV0RTUCBzaHV0ZG93biwgZXJyID0gJWQiLCByZXQpOwotCi0JCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QT1NUX1NIVVRET1dOLAotCQkJCQkgICAgIE5VTEwpOwotCQlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19CT09URUQpOwotCX0KLQotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2RzcC0+cmVhZHlfY29tcGwsCi0JCQkJCSAgV0RTUF9TU1JfUkVBRFlfV0FJVF9USU1FT1VUKTsKLQlXRFNQX01HUl9NVVRFWF9MT0NLKHdkc3AsIHdkc3AtPnNzcl9tdXRleCk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJ3YWl0X2Zvcl9yZWFkeSB0aW1lZCBvdXQsIHN0YXR1cyA9IDB4JXgiLAotCQkJIHdkc3AtPnJlYWR5X3N0YXR1cyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBEYXRhIHNlY3Rpb25zIGFyZSB0byBkb3dubG9hZGVkIHBlciBXRFNQIGJvb3QgKi8KLQlXRFNQX0NMRUFSX1NUQVRVUyh3ZHNwLCBXRFNQX1NUQVRVU19EQVRBX0RMT0FERUQpOwotCi0JLyoKLQkgKiBFdmVuIHRob3VnaCBjb2RlIHNlY3Rpb24gY291bGQgcG9zc2libGUgYmUgcmV0YWluZWQgb24gRFNQCi0JICogY3Jhc2gsIGdvIGFoZWFkIGFuZCBzdGlsbCByZS1kb3dubG9hZCBqdXN0IHRvIGF2b2lkIGFueQotCSAqIG1lbW9yeSBjb3JydXB0aW9uIGZyb20gcHJldmlvdXMgY3Jhc2guCi0JICovCi0JV0RTUF9DTEVBUl9TVEFUVVMod2RzcCwgV0RTUF9TVEFUVVNfQ09ERV9ETE9BREVEKTsKLQotCS8qIElmIGNvZGVjIHJlc3RhcnRlZCwgdGhlbiBhbGwgY29tcG9uZW50cyBtdXN0IGJlIHJlLWluaXRpYWxpemVkICovCi0JaWYgKHdkc3AtPnNzcl90eXBlID09IFdEU1BfU1NSX1RZUEVfQ0RDX1VQKSB7Ci0JCXdkc3BfZGVpbml0X2NvbXBvbmVudHMod2RzcCk7Ci0JCVdEU1BfQ0xFQVJfU1RBVFVTKHdkc3AsIFdEU1BfU1RBVFVTX0lOSVRJQUxJWkVEKTsKLQl9Ci0KLQlyZXQgPSB3ZHNwX2luaXRfYW5kX2Rsb2FkX2NvZGVfc2VjdGlvbnMod2RzcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJV0RTUF9FUlIod2RzcCwgIkZhaWxlZCB0byBkbG9hZCBjb2RlIHNlY3Rpb25zIGVyciA9ICVkIiwKLQkJCSByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU1NSIGhhbmRsaW5nIGlzIGZpbmlzaGVkLCBtYXJrIFNTUiB0eXBlIGFzIE5PX1NTUiAqLwotCXdkc3AtPnNzcl90eXBlID0gV0RTUF9TU1JfVFlQRV9OT19TU1I7Ci1kb25lOgotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IHdkc3Bfc3NyX2hhbmRsZXIoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AsIHZvaWQgKmFyZywKLQkJCSAgICBlbnVtIHdkc3Bfc3NyX3R5cGUgc3NyX3R5cGUpCi17Ci0JZW51bSB3ZHNwX3Nzcl90eXBlIGN1cnJlbnRfc3NyX3R5cGU7Ci0Jc3RydWN0IHdkc3BfZXJyX3NpZ25hbF9hcmcgKmVycl9kYXRhOwotCi0JV0RTUF9NR1JfTVVURVhfTE9DSyh3ZHNwLCB3ZHNwLT5zc3JfbXV0ZXgpOwotCi0JY3VycmVudF9zc3JfdHlwZSA9IHdkc3AtPnNzcl90eXBlOwotCVdEU1BfREJHKHdkc3AsICJDdXJyZW50IHNzcl90eXBlICVzLCBoYW5kbGluZyBzc3JfdHlwZSAlcyIsCi0JCSB3ZHNwX2dldF9zc3JfdHlwZV9zdHJpbmcoY3VycmVudF9zc3JfdHlwZSksCi0JCSB3ZHNwX2dldF9zc3JfdHlwZV9zdHJpbmcoc3NyX3R5cGUpKTsKLQl3ZHNwLT5zc3JfdHlwZSA9IHNzcl90eXBlOwotCi0JaWYgKGFyZykgewotCQllcnJfZGF0YSA9IChzdHJ1Y3Qgd2RzcF9lcnJfc2lnbmFsX2FyZyAqKSBhcmc7Ci0JCW1lbWNweSgmd2RzcC0+ZHVtcF9kYXRhLmVycl9kYXRhLCBlcnJfZGF0YSwKLQkJICAgICAgIHNpemVvZigqZXJyX2RhdGEpKTsKLQl9IGVsc2UgewotCQltZW1zZXQoJndkc3AtPmR1bXBfZGF0YS5lcnJfZGF0YSwgMCwKLQkJICAgICAgIHNpemVvZih3ZHNwLT5kdW1wX2RhdGEuZXJyX2RhdGEpKTsKLQl9Ci0KLQlzd2l0Y2ggKHNzcl90eXBlKSB7Ci0KLQljYXNlIFdEU1BfU1NSX1RZUEVfV0RTUF9ET1dOOgotCQlfX3dkc3BfY2xyX3JlYWR5X2xvY2tlZCh3ZHNwLCBXRFNQX1NTUl9TVEFUVVNfV0RTUF9SRUFEWSk7Ci0JCXdkc3BfYnJvYWRjYXN0X2V2ZW50X2Rvd25zZXEod2RzcCwgV0RTUF9FVkVOVF9QUkVfU0hVVERPV04sCi0JCQkJCSAgICAgTlVMTCk7Ci0JCXNjaGVkdWxlX3dvcmsoJndkc3AtPnNzcl93b3JrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdEU1BfU1NSX1RZUEVfQ0RDX0RPV046Ci0JCV9fd2RzcF9jbHJfcmVhZHlfbG9ja2VkKHdkc3AsIFdEU1BfU1NSX1NUQVRVU19DRENfUkVBRFkpOwotCQkvKgotCQkgKiBJZiBEU1AgaXMgYm9vdGVkIHdoZW4gQ0RDX0RPV04gaXMgcmVjZWl2ZWQsIGl0IG5lZWRzCi0JCSAqIHRvIGJlIHNodXRkb3duLgotCQkgKi8KLQkJaWYgKFdEU1BfU1RBVFVTX0lTX1NFVCh3ZHNwLCBXRFNQX1NUQVRVU19CT09URUQpKSB7Ci0JCQlfX3dkc3BfY2xyX3JlYWR5X2xvY2tlZCh3ZHNwLAotCQkJCQkJV0RTUF9TU1JfU1RBVFVTX1dEU1BfUkVBRFkpOwotCQkJd2RzcF9icm9hZGNhc3RfZXZlbnRfZG93bnNlcSh3ZHNwLAotCQkJCQkJICAgICBXRFNQX0VWRU5UX1BSRV9TSFVURE9XTiwKLQkJCQkJCSAgICAgTlVMTCk7Ci0JCX0KLQotCQlzY2hlZHVsZV93b3JrKCZ3ZHNwLT5zc3Jfd29yayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRFNQX1NTUl9UWVBFX0NEQ19VUDoKLQkJX193ZHNwX3NldF9yZWFkeV9sb2NrZWQod2RzcCwgV0RTUF9TU1JfU1RBVFVTX0NEQ19SRUFEWSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJV0RTUF9FUlIod2RzcCwgInVuZGVmaW5lZCBzc3JfdHlwZSAlZFxuIiwgc3NyX3R5cGUpOwotCQkvKiBSZXZlcnQgYmFjayB0aGUgc3NyX3R5cGUgZm9yIHVuZGVmaW5lZCBldmVudHMgKi8KLQkJd2RzcC0+c3NyX3R5cGUgPSBjdXJyZW50X3Nzcl90eXBlOwotCQlicmVhazsKLQl9Ci0KLQlXRFNQX01HUl9NVVRFWF9VTkxPQ0sod2RzcCwgd2RzcC0+c3NyX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdkc3Bfc2lnbmFsX2hhbmRsZXIoc3RydWN0IGRldmljZSAqd2RzcF9kZXYsCi0JCQkgICAgICAgZW51bSB3ZHNwX3NpZ25hbCBzaWduYWwsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcDsKLQlpbnQgcmV0OwotCi0JaWYgKCF3ZHNwX2RldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3ZHNwID0gZGV2X2dldF9kcnZkYXRhKHdkc3BfZGV2KTsKLQlXRFNQX01HUl9NVVRFWF9MT0NLKHdkc3AsIHdkc3AtPmFwaV9tdXRleCk7Ci0KLQlXRFNQX0RCRyh3ZHNwLCAiUmFpc2VkIHNpZ25hbCAlZCIsIHNpZ25hbCk7Ci0KLQlzd2l0Y2ggKHNpZ25hbCkgewotCWNhc2UgV0RTUF9JUEMxX0lOVFI6Ci0JCXJldCA9IHdkc3BfdW5pY2FzdF9ldmVudCh3ZHNwLCBXRFNQX0NNUE5UX0lQQywKLQkJCQkJIFdEU1BfRVZFTlRfSVBDMV9JTlRSLCBOVUxMKTsKLQkJYnJlYWs7Ci0JY2FzZSBXRFNQX0VSUl9JTlRSOgotCQlyZXQgPSB3ZHNwX3Nzcl9oYW5kbGVyKHdkc3AsIGFyZywgV0RTUF9TU1JfVFlQRV9XRFNQX0RPV04pOwotCQlicmVhazsKLQljYXNlIFdEU1BfQ0RDX0RPV05fU0lHTkFMOgotCQlyZXQgPSB3ZHNwX3Nzcl9oYW5kbGVyKHdkc3AsIGFyZywgV0RTUF9TU1JfVFlQRV9DRENfRE9XTik7Ci0JCWJyZWFrOwotCWNhc2UgV0RTUF9DRENfVVBfU0lHTkFMOgotCQlyZXQgPSB3ZHNwX3Nzcl9oYW5kbGVyKHdkc3AsIGFyZywgV0RTUF9TU1JfVFlQRV9DRENfVVApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJV0RTUF9FUlIod2RzcCwgImhhbmRsaW5nIHNpZ25hbCAlZCBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCi0JCQkgc2lnbmFsLCByZXQpOwotCVdEU1BfTUdSX01VVEVYX1VOTE9DSyh3ZHNwLCB3ZHNwLT5hcGlfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3ZHNwX3ZvdGVfZm9yX2RzcChzdHJ1Y3QgZGV2aWNlICp3ZHNwX2RldiwKLQkJCSAgICAgYm9vbCB2b3RlKQotewotCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF3ZHNwX2RldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3ZHNwID0gZGV2X2dldF9kcnZkYXRhKHdkc3BfZGV2KTsKLQotCVdEU1BfTUdSX01VVEVYX0xPQ0sod2RzcCwgd2RzcC0+YXBpX211dGV4KTsKLQlXRFNQX0RCRyh3ZHNwLCAicmVxdWVzdCAlcywgY3VycmVudCB1c2VycyA9ICVkIiwKLQkJIHZvdGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwgd2RzcC0+ZHNwX3VzZXJzKTsKLQotCWlmICh2b3RlKSB7Ci0JCXdkc3AtPmRzcF91c2VycysrOwotCQlpZiAod2RzcC0+ZHNwX3VzZXJzID09IDEpCi0JCQlyZXQgPSB3ZHNwX2VuYWJsZV9kc3Aod2RzcCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHdkc3AtPmRzcF91c2VycyA9PSAwKQotCQkJZ290byBkb25lOwotCi0JCXdkc3AtPmRzcF91c2Vycy0tOwotCQlpZiAod2RzcC0+ZHNwX3VzZXJzID09IDApCi0JCQlyZXQgPSB3ZHNwX2Rpc2FibGVfZHNwKHdkc3ApOwotCX0KLQotCWlmIChyZXQgPCAwKQotCQlXRFNQX0RCRyh3ZHNwLCAid2RzcCAlcyBmYWlsZWQsIGVyciA9ICVkIiwKLQkJCSB2b3RlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIsIHJldCk7Ci0KLWRvbmU6Ci0JV0RTUF9NR1JfTVVURVhfVU5MT0NLKHdkc3AsIHdkc3AtPmFwaV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3ZHNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqd2RzcF9kZXYpCi17Ci0Jc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7Ci0JaW50IHJjID0gMCwgaTsKLQotCWlmICghd2RzcF9kZXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXdkc3AgPSBkZXZfZ2V0X2RydmRhdGEod2RzcF9kZXYpOwotCi0JZm9yIChpID0gIFdEU1BfQ01QTlRfVFlQRV9NQVggLSAxOyBpID49IDA7IGktLSkgewotCQlyYyA9IHdkc3BfdW5pY2FzdF9ldmVudCh3ZHNwLCBpLCBXRFNQX0VWRU5UX1NVU1BFTkQsIE5VTEwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlXRFNQX0VSUih3ZHNwLCAiY29tcG9uZW50ICVzIGZhaWxlZCB0byBzdXNwZW5kXG4iLAotCQkJCVdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKGkpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHdkc3BfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKndkc3BfZGV2KQotewotCXN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwOwotCWludCByYyA9IDAsIGk7Ci0KLQlpZiAoIXdkc3BfZGV2KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGRldmljZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl3ZHNwID0gZGV2X2dldF9kcnZkYXRhKHdkc3BfZGV2KTsKLQotCWZvciAoaSA9ICAwOyBpIDwgV0RTUF9DTVBOVF9UWVBFX01BWDsgaSsrKSB7Ci0JCXJjID0gd2RzcF91bmljYXN0X2V2ZW50KHdkc3AsIGksIFdEU1BfRVZFTlRfUkVTVU1FLCBOVUxMKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJV0RTUF9FUlIod2RzcCwgImNvbXBvbmVudCAlcyBmYWlsZWQgdG8gcmVzdW1lXG4iLAotCQkJCVdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKGkpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IHdkc3BfbWdyX29wcyB3ZHNwX29wcyA9IHsKLQkucmVnaXN0ZXJfY21wbnRfb3BzID0gd2RzcF9yZWdpc3Rlcl9jbXBudF9vcHMsCi0JLmdldF9kZXZfZm9yX2NtcG50ID0gd2RzcF9nZXRfZGV2X2Zvcl9jbXBudCwKLQkuZ2V0X2Rldm9wc19mb3JfY21wbnQgPSB3ZHNwX2dldF9kZXZvcHNfZm9yX2NtcG50LAotCS5zaWduYWxfaGFuZGxlciA9IHdkc3Bfc2lnbmFsX2hhbmRsZXIsCi0JLnZvdGVfZm9yX2RzcCA9IHdkc3Bfdm90ZV9mb3JfZHNwLAotCS5zdXNwZW5kID0gd2RzcF9zdXNwZW5kLAotCS5yZXN1bWUgPSB3ZHNwX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgd2RzcF9tZ3JfY29tcGFyZV9vZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdkc3BfY21wbnQgKmNtcG50ID0gZGF0YTsKLQotCS8qCi0JICogRmlyc3QgdHJ5IHRvIG1hdGNoIGJhc2VkIG9uIG9mX25vZGUsIGlmIG9mX25vZGUgaXMgbm90Ci0JICogcHJlc2VudCwgdHJ5IHRvIG1hdGNoIG9uIHRoZSBkZXZfbmFtZQotCSAqLwotCXJldHVybiAoKGRldi0+b2Zfbm9kZSAmJiBkZXYtPm9mX25vZGUgPT0gY21wbnQtPm5wKSB8fAotCQkoY21wbnQtPmNkZXZfbmFtZSAmJgotCQkgIXN0cmNtcChkZXZfbmFtZShkZXYpLCBjbXBudC0+Y2Rldl9uYW1lKSkpOwotfQotCi1zdGF0aWMgdm9pZCB3ZHNwX21ncl9kZWJ1Z2ZzX2luaXQoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3ApCi17Ci0Jd2RzcC0+ZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIndkc3BfbWdyIiwgTlVMTCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHdkc3AtPmVudHJ5KSkKLQkJcmV0dXJuOwotCi0JZGVidWdmc19jcmVhdGVfYm9vbCgicGFuaWNfb25fZXJyb3IiLCAwNjQ0LAotCQkJICAgIHdkc3AtPmVudHJ5LCAmd2RzcC0+cGFuaWNfb25fZXJyb3IpOwotfQotCi1zdGF0aWMgdm9pZCB3ZHNwX21ncl9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCkKLXsKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUod2RzcC0+ZW50cnkpOwotCXdkc3AtPmVudHJ5ID0gTlVMTDsKLX0KLQotc3RhdGljIGludCB3ZHNwX21ncl9iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd2RzcF9tZ3JfcHJpdiAqd2RzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudDsKLQlpbnQgcmV0LCBpZHg7Ci0KLQl3ZHNwLT5vcHMgPSAmd2RzcF9vcHM7Ci0KLQkvKiBTZXR1cCByYW1kdW1wIGRldmljZSAqLwotCXdkc3AtPmR1bXBfZGF0YS5yZF9kZXYgPSBjcmVhdGVfcmFtZHVtcF9kZXZpY2UoIndkc3AiLCBkZXYpOwotCWlmICghd2RzcC0+ZHVtcF9kYXRhLnJkX2RldikKLQkJZGV2X2luZm8oZGV2LCAiJXM6IGNyZWF0ZV9yYW1kdW1wX2RldmljZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IGNvbXBvbmVudF9iaW5kX2FsbChkZXYsIHdkc3AtPm9wcyk7Ci0JaWYgKHJldCA8IDApCi0JCVdEU1BfRVJSKHdkc3AsICJjb21wb25lbnRfYmluZF9hbGwgZmFpbGVkICVkXG4iLCByZXQpOwotCi0JLyogTWFrZSBzdXJlIGFsbCBjb21wb25lbnRzIHJlZ2lzdGVyZWQgb3BzICovCi0JZm9yIChpZHggPSAwOyBpZHggPCBXRFNQX0NNUE5UX1RZUEVfTUFYOyBpZHgrKykgewotCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpZHgpOwotCQlpZiAoIWNtcG50LT5jZGV2IHx8ICFjbXBudC0+b3BzKSB7Ci0JCQlXRFNQX0VSUih3ZHNwLCAiJXMgZGlkIG5vdCByZWdpc3RlciBvcHNcbiIsCi0JCQkJIFdEU1BfR0VUX0NNUE5UX1RZUEVfU1RSKGlkeCkpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgd2RzcC0+b3BzKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0Jd2RzcF9tZ3JfZGVidWdmc19pbml0KHdkc3ApOwotCi0JLyogU2NoZWR1bGUgdGhlIHdvcmsgdG8gZG93bmxvYWQgaW1hZ2UgaWYgYmluZGluZyB3YXMgc3VjY2Vzc2Z1bC4gKi8KLQlpZiAoIXJldCkKLQkJc2NoZWR1bGVfd29yaygmd2RzcC0+bG9hZF9md193b3JrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdkc3BfbWdyX3VuYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgd2RzcF9jbXBudCAqY21wbnQ7Ci0JaW50IGlkeDsKLQotCWNvbXBvbmVudF91bmJpbmRfYWxsKGRldiwgd2RzcC0+b3BzKTsKLQotCXdkc3BfbWdyX2RlYnVnZnNfcmVtb3ZlKHdkc3ApOwotCi0JaWYgKHdkc3AtPmR1bXBfZGF0YS5yZF9kZXYpIHsKLQkJZGVzdHJveV9yYW1kdW1wX2RldmljZSh3ZHNwLT5kdW1wX2RhdGEucmRfZGV2KTsKLQkJd2RzcC0+ZHVtcF9kYXRhLnJkX2RldiA9IE5VTEw7Ci0JfQotCi0JLyogQ2xlYXIgYWxsIHN0YXR1cyBiaXRzICovCi0Jd2RzcC0+c3RhdHVzID0gMHgwMDsKLQotCS8qIGNsZWFuIHVwIHRoZSBjb21wb25lbnRzICovCi0JZm9yIChpZHggPSAwOyBpZHggPCBXRFNQX0NNUE5UX1RZUEVfTUFYOyBpZHgrKykgewotCQljbXBudCA9IFdEU1BfR0VUX0NPTVBPTkVOVCh3ZHNwLCBpZHgpOwotCQljbXBudC0+Y2RldiA9IE5VTEw7Ci0JCWNtcG50LT5vcHMgPSBOVUxMOwotCQljbXBudC0+cHJpdl9kYXRhID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X21hc3Rlcl9vcHMgd2RzcF9tYXN0ZXJfb3BzID0gewotCS5iaW5kID0gd2RzcF9tZ3JfYmluZCwKLQkudW5iaW5kID0gd2RzcF9tZ3JfdW5iaW5kLAotfTsKLQotc3RhdGljIHZvaWQgKndkc3BfbWdyX3BhcnNlX3BoYW5kbGUoc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AsCi0JCQkJICAgIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICptZGV2ID0gd2RzcC0+bWRldjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCB3ZHNwX2NtcG50ICpjbXBudCA9IE5VTEw7Ci0Jc3RydWN0IG9mX3BoYW5kbGVfYXJncyBwYXJnczsKLQl1MzIgdmFsdWU7Ci0JaW50IHJldDsKLQotCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9maXhlZF9hcmdzKG1kZXYtPm9mX25vZGUsCi0JCQkJCSAgICAgICJxY29tLHdkc3AtY29tcG9uZW50cyIsIDEsCi0JCQkJCSAgICAgIGluZGV4LCAmcGFyZ3MpOwotCWlmIChyZXQpIHsKLQkJV0RTUF9FUlIod2RzcCwgInBhcnNlX3BoYW5kbGUgYXQgaW5kZXggJWQgZmFpbGVkICVkIiwKLQkJCSBpbmRleCwgcmV0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbnAgPSBwYXJncy5ucDsKLQl2YWx1ZSA9IHBhcmdzLmFyZ3NbMF07Ci0KLQlpZiAodmFsdWUgPj0gV0RTUF9DTVBOVF9UWVBFX01BWCkgewotCQlXRFNQX0VSUih3ZHNwLCAiaW52YWxpZCBwaGFuZGxlX2FyZyB0byBvZl9ub2RlICVzIiwgbnAtPm5hbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY21wbnQgPSBXRFNQX0dFVF9DT01QT05FTlQod2RzcCwgdmFsdWUpOwotCWlmIChjbXBudC0+bnAgfHwgY21wbnQtPmNkZXZfbmFtZSkgewotCQlXRFNQX0VSUih3ZHNwLCAiY21wbnQgJWQgYWxyZWFkeSBhZGRlZCIsIHZhbHVlKTsKLQkJY21wbnQgPSBOVUxMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY21wbnQtPm5wID0gbnA7Ci0Jb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJxY29tLHdkc3AtY21wbnQtZGV2LW5hbWUiLAotCQkJCSZjbXBudC0+Y2Rldl9uYW1lKTsKLWRvbmU6Ci0Jb2Zfbm9kZV9wdXQobnApOwotCXJldHVybiBjbXBudDsKLX0KLQotc3RhdGljIGludCB3ZHNwX21ncl9wYXJzZV9kdF9lbnRyaWVzKHN0cnVjdCB3ZHNwX21ncl9wcml2ICp3ZHNwKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdkc3AtPm1kZXY7Ci0Jdm9pZCAqbWF0Y2hfZGF0YTsKLQlpbnQgcGhfaWR4LCByZXQ7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkZXYtPm9mX25vZGUsICJxY29tLGltZy1maWxlbmFtZSIsCi0JCQkJICAgICAgJndkc3AtPmltZ19mbmFtZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJV0RTUF9FUlIod2RzcCwgIlJlYWRpbmcgcHJvcGVydHkgJXMgZmFpbGVkLCBlcnJvciA9ICVkIiwKLQkJCSAicWNvbSxpbWctZmlsZW5hbWUiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zfbm9kZSwKLQkJCQkJICJxY29tLHdkc3AtY29tcG9uZW50cyIsCi0JCQkJCSBOVUxMKTsKLQlpZiAocmV0ID09IC1FTk9FTlQpIHsKLQkJV0RTUF9FUlIod2RzcCwgIlByb3BlcnR5ICVzIG5vdCBkZWZpbmVkIGluIERUIiwKLQkJCSAicWNvbSx3ZHNwLWNvbXBvbmVudHMiKTsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAocmV0ICE9IFdEU1BfQ01QTlRfVFlQRV9NQVggKiAyKSB7Ci0JCVdEU1BfRVJSKHdkc3AsICJJbnZhbGlkIHBoYW5kbGUgKyBhcmcgY291bnQgJWQsIGV4cGVjdGVkICVkIiwKLQkJCSByZXQsIFdEU1BfQ01QTlRfVFlQRV9NQVggKiAyKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IDA7Ci0KLQlmb3IgKHBoX2lkeCA9IDA7IHBoX2lkeCA8IFdEU1BfQ01QTlRfVFlQRV9NQVg7IHBoX2lkeCsrKSB7Ci0KLQkJbWF0Y2hfZGF0YSA9IHdkc3BfbWdyX3BhcnNlX3BoYW5kbGUod2RzcCwgcGhfaWR4KTsKLQkJaWYgKCFtYXRjaF9kYXRhKSB7Ci0JCQlXRFNQX0VSUih3ZHNwLCAiY29tcG9uZW50IG5vdCBmb3VuZCBhdCBpZHggJWQiLCBwaF9pZHgpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWNvbXBvbmVudF9tYXRjaF9hZGQoZGV2LCAmd2RzcC0+bWF0Y2gsCi0JCQkJICAgIHdkc3BfbWdyX2NvbXBhcmVfb2YsIG1hdGNoX2RhdGEpOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdkc3BfbWdyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3A7Ci0Jc3RydWN0IGRldmljZSAqbWRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IHJldDsKLQotCXdkc3AgPSBkZXZtX2t6YWxsb2MobWRldiwgc2l6ZW9mKCp3ZHNwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHNwKQotCQlyZXR1cm4gLUVOT01FTTsKLQl3ZHNwLT5tZGV2ID0gbWRldjsKLQl3ZHNwLT5zZWdfbGlzdCA9IGRldm1fa3phbGxvYyhtZGV2LCBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZHNwLT5zZWdfbGlzdCkgewotCQlkZXZtX2tmcmVlKG1kZXYsIHdkc3ApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXQgPSB3ZHNwX21ncl9wYXJzZV9kdF9lbnRyaWVzKHdkc3ApOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2R0X3BhcnNlOwotCi0JSU5JVF9XT1JLKCZ3ZHNwLT5sb2FkX2Z3X3dvcmssIHdkc3BfbG9hZF9md19pbWFnZSk7Ci0JSU5JVF9MSVNUX0hFQUQod2RzcC0+c2VnX2xpc3QpOwotCW11dGV4X2luaXQoJndkc3AtPmFwaV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmd2RzcC0+c3NyX211dGV4KTsKLQl3ZHNwLT5zc3JfdHlwZSA9IFdEU1BfU1NSX1RZUEVfTk9fU1NSOwotCXdkc3AtPnJlYWR5X3N0YXR1cyA9IFdEU1BfU1NSX1NUQVRVU19SRUFEWTsKLQlJTklUX1dPUksoJndkc3AtPnNzcl93b3JrLCB3ZHNwX3Nzcl93b3JrX2ZuKTsKLQlpbml0X2NvbXBsZXRpb24oJndkc3AtPnJlYWR5X2NvbXBsKTsKLQlhcmNoX3NldHVwX2RtYV9vcHMod2RzcC0+bWRldiwgMCwgMCwgTlVMTCwgMCk7Ci0JZGV2X3NldF9kcnZkYXRhKG1kZXYsIHdkc3ApOwotCi0JcmV0ID0gY29tcG9uZW50X21hc3Rlcl9hZGRfd2l0aF9tYXRjaChtZGV2LCAmd2RzcF9tYXN0ZXJfb3BzLAotCQkJCQkgICAgICB3ZHNwLT5tYXRjaCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJV0RTUF9FUlIod2RzcCwgIkZhaWxlZCB0byBhZGQgbWFzdGVyLCBlcnIgPSAlZCIsIHJldCk7Ci0JCWdvdG8gZXJyX21hc3Rlcl9hZGQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9tYXN0ZXJfYWRkOgotCW11dGV4X2Rlc3Ryb3koJndkc3AtPmFwaV9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmd2RzcC0+c3NyX211dGV4KTsKLWVycl9kdF9wYXJzZToKLQlkZXZtX2tmcmVlKG1kZXYsIHdkc3AtPnNlZ19saXN0KTsKLQlkZXZtX2tmcmVlKG1kZXYsIHdkc3ApOwotCWRldl9zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9tZ3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqbWRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IHdkc3BfbWdyX3ByaXYgKndkc3AgPSBkZXZfZ2V0X2RydmRhdGEobWRldik7Ci0KLQljb21wb25lbnRfbWFzdGVyX2RlbChtZGV2LCAmd2RzcF9tYXN0ZXJfb3BzKTsKLQotCW11dGV4X2Rlc3Ryb3koJndkc3AtPmFwaV9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmd2RzcC0+c3NyX211dGV4KTsKLQlkZXZtX2tmcmVlKG1kZXYsIHdkc3AtPnNlZ19saXN0KTsKLQlkZXZtX2tmcmVlKG1kZXYsIHdkc3ApOwotCWRldl9zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKLQotCXJldHVybiAwOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd2RzcF9tZ3JfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSx3Y2QtZHNwLW1nciIgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdkc3BfbWdyX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3Y2QtZHNwLW1nciIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIod2RzcF9tZ3JfZHRfbWF0Y2gpLAotCX0sCi0JLnByb2JlID0gd2RzcF9tZ3JfcHJvYmUsCi0JLnJlbW92ZSA9IHdkc3BfbWdyX3JlbW92ZSwKLX07Ci0KLWludCB3Y2RfZHNwX21ncl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd2RzcF9tZ3JfZHJpdmVyKTsKLX0KLQotdm9pZCB3Y2RfZHNwX21ncl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndkc3BfbWdyX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiV0NEIERTUCBtYW5hZ2VyIGRyaXZlciIpOwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd2RzcF9tZ3JfZHRfbWF0Y2gpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZmQ1NS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlICJ3Y2QtZHNwLXV0aWxzLmgiCi0KLXN0YXRpYyBib29sIHdkc3BfaXNfdmFsaWRfZWxmX2hkcihjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICplaGRyLAotCQkJCSAgc2l6ZV90IGZ3X3NpemUpCi17Ci0JaWYgKGZ3X3NpemUgPCBzaXplb2YoKmVoZHIpKSB7Ci0JCXByX2VycigiJXM6IEZpcm13YXJlIHRvbyBzbWFsbFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVsZl9jaGVja19mYWlsOwotCX0KLQotCWlmIChtZW1jbXAoZWhkci0+ZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKSB7Ci0JCXByX2VycigiJXM6IE5vdCBhbiBFTEYgZmlsZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVsZl9jaGVja19mYWlsOwotCX0KLQotCWlmIChlaGRyLT5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlaGRyLT5lX3R5cGUgIT0gRVRfRFlOKSB7Ci0JCXByX2VycigiJXM6IE5vdCBhbiBleGVjdXRhYmxlIGltYWdlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZWxmX2NoZWNrX2ZhaWw7Ci0JfQotCi0JaWYgKGVoZHItPmVfcGhudW0gPT0gMCkgewotCQlwcl9lcnIoIiVzOiBubyBzZWdtZW50cyB0byBsb2FkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZWxmX2NoZWNrX2ZhaWw7Ci0JfQotCi0JaWYgKHNpemVvZihzdHJ1Y3QgZWxmMzJfcGhkcikgKiBlaGRyLT5lX3BobnVtICsKLQkgICAgc2l6ZW9mKHN0cnVjdCBlbGYzMl9oZHIpID4gZndfc2l6ZSkgewotCQlwcl9lcnIoIiVzOiBUb28gc21hbGwgTURUIGZpbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlbGZfY2hlY2tfZmFpbDsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotZWxmX2NoZWNrX2ZhaWw6Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHdkc3BfYWRkX3NlZ21lbnRfdG9fbGlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmltZ19mbmFtZSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGVsZjMyX3BoZHIgKnBoZHIsCi0JCQkJICAgIGludCBwaGRyX2lkeCwKLQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqc2VnX2xpc3QpCi17Ci0Jc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgKnNlZzsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIERvIG5vdCBsb2FkIHNlZ21lbnRzIHdpdGggemVybyBzaXplICovCi0JaWYgKHBoZHItPnBfZmlsZXN6ID09IDAgfHwgcGhkci0+cF9tZW1zeiA9PSAwKQotCQlnb3RvIGRvbmU7Ci0KLQlzZWcgPSBremFsbG9jKHNpemVvZigqc2VnKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZWcpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKHNlZy0+c3BsaXRfZm5hbWUsIHNpemVvZihzZWctPnNwbGl0X2ZuYW1lKSwKLQkJICIlcy5iJTAyZCIsIGltZ19mbmFtZSwgcGhkcl9pZHgpOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnNlZy0+c3BsaXRfZncsIHNlZy0+c3BsaXRfZm5hbWUsIGRldik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogZmlybXdhcmUgJXMgbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18sIHNlZy0+c3BsaXRfZm5hbWUpOwotCQlnb3RvIGJhZF9zZWc7Ci0JfQotCi0Jc2VnLT5sb2FkX2FkZHIgPSBwaGRyLT5wX3BhZGRyOwotCXNlZy0+c2l6ZSA9IHBoZHItPnBfZmlsZXN6OwotCXNlZy0+ZGF0YSA9ICh1OCAqKSBzZWctPnNwbGl0X2Z3LT5kYXRhOwotCi0JbGlzdF9hZGRfdGFpbCgmc2VnLT5saXN0LCBzZWdfbGlzdCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci1iYWRfc2VnOgotCWtmcmVlKHNlZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdkc3BfZmx1c2hfc2VnbWVudF9saXN0OiBGbHVzaCB0aGUgbGlzdCBvZiBzZWdtZW50cwotICogQHNlZ19saXN0OiBMaXN0IG9mIHNlZ21lbnRzIHRvIGJlIGZsdXNoZWQKLSAqIFRoaXMgQVBJIHdpbGwgdHJhdmVyc2UgdGhyb3VnaCB0aGUgbGlzdCBvZiBzZWdtZW50cyBwcm92aWRlZCBpbgotICogc2VnX2xpc3QsIHJlbGVhc2UgdGhlIGZpcm13YXJlIGZvciBlYWNoIHNlZ21lbnQgYW5kIGRlbGV0ZSB0aGUKLSAqIHNlZ21lbnQgZnJvbSB0aGUgbGlzdC4KLSAqLwotdm9pZCB3ZHNwX2ZsdXNoX3NlZ21lbnRfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpzZWdfbGlzdCkKLXsKLQlzdHJ1Y3Qgd2RzcF9pbWdfc2VnbWVudCAqc2VnLCAqbmV4dDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWcsIG5leHQsIHNlZ19saXN0LCBsaXN0KSB7Ci0JCXJlbGVhc2VfZmlybXdhcmUoc2VnLT5zcGxpdF9mdyk7Ci0JCWxpc3RfZGVsKCZzZWctPmxpc3QpOwotCQlrZnJlZShzZWcpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0wod2RzcF9mbHVzaF9zZWdtZW50X2xpc3QpOwotCi0vKgotICogd2RzcF9nZXRfc2VnbWVudF9saXN0OiBHZXQgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHNlZ21lbnRzCi0gKiBAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgb2YgY2FsbGVyCi0gKiBAaW1nX2ZuYW1lOiBJbWFnZSBuYW1lIGZvciB0aGUgbWR0IGFuZCBzcGxpdCBmaXJtd2FyZSBmaWxlcwotICogQHNlZ21lbnRfdHlwZTogUmVxdWVzdGVkIHNlZ21lbnQgdHlwZSwgc2hvdWxkIGJlIGVpdGhlcgotICoJCSAgV0RTUF9FTEZfRkxBR19SRSBvciBXRFNQX0VMRl9GTEFHX1dSSVRFCi0gKiBAc2VnX2xpc3Q6IEFuIGluaXRpYWxpemVkIGhlYWQgZm9yIGxpc3Qgb2Ygc2VnbWVudGVkIHRvIGJlIHJldHVybmVkCi0gKiBAZW50cnlfcG9pbnQ6IFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgaW1hZ2UKLSAqIFRoaXMgQVBJIHdpbGwgcGFyc2UgdGhlIG1kdCBmaWxlIGZvciBpbWdfZm5hbWUgYW5kIGNyZWF0ZQotICogYW4gc3RydWN0IHdkc3BfaW1nX3NlZ21lbnQgZm9yIGVhY2ggc2VnbWVudCB0aGF0IG1hdGNoZXMgc2VnbWVudF90eXBlCi0gKiBhbmQgYWRkIHRoaXMgc3RydWN0dXJlIHRvIGxpc3QgcG9pbnRlZCBieSBzZWdfbGlzdAotICovCi1pbnQgd2RzcF9nZXRfc2VnbWVudF9saXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgY29uc3QgY2hhciAqaW1nX2ZuYW1lLAotCQkJICB1bnNpZ25lZCBpbnQgc2VnbWVudF90eXBlLAotCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpzZWdfbGlzdCwKLQkJCSAgdTMyICplbnRyeV9wb2ludCkKLXsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWNvbnN0IHN0cnVjdCBlbGYzMl9oZHIgKmVoZHI7Ci0JY29uc3Qgc3RydWN0IGVsZjMyX3BoZHIgKnBoZHI7Ci0JY29uc3QgdTggKmVsZl9wdHI7Ci0JY2hhciBtZHRfbmFtZVtXRFNQX0lNR19OQU1FX0xFTl9NQVhdOwotCWludCByZXQsIHBoZHJfaWR4OwotCWJvb2wgc2VnbWVudF9tYXRjaDsKLQotCWlmICghZGV2KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCXByX2VycigiJXM6IEludmFsaWQgZGV2aWNlIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCFpbWdfZm5hbWUgfHwgIXNlZ19saXN0IHx8ICFlbnRyeV9wb2ludCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlkZXZfZXJyKGRldiwgIiVzOiBJbnZhbGlkIGlucHV0IHBhcmFtc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChzZWdtZW50X3R5cGUgIT0gV0RTUF9FTEZfRkxBR19SRSAmJgotCSAgICBzZWdtZW50X3R5cGUgIT0gV0RTUF9FTEZfRkxBR19XUklURSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBJbnZhbGlkIHJlcXVlc3QgZm9yIHNlZ21lbnRfdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzZWdtZW50X3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc25wcmludGYobWR0X25hbWUsIHNpemVvZihtZHRfbmFtZSksICIlcy5tZHQiLCBpbWdfZm5hbWUpOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBtZHRfbmFtZSwgZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmaXJtd2FyZSAlcyBub3QgZm91bmRcbiIsCi0JCQlfX2Z1bmNfXywgbWR0X25hbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZWhkciA9IChzdHJ1Y3QgZWxmMzJfaGRyICopIGZ3LT5kYXRhOwotCSplbnRyeV9wb2ludCA9IGVoZHItPmVfZW50cnk7Ci0JaWYgKCF3ZHNwX2lzX3ZhbGlkX2VsZl9oZHIoZWhkciwgZnctPnNpemUpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZ3IG1kdCAlcyBpcyBpbnZhbGlkXG4iLAotCQkJX19mdW5jX18sIG1kdF9uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBiYWRfZWxmOwotCX0KLQotCWVsZl9wdHIgPSBmdy0+ZGF0YSArIHNpemVvZigqZWhkcik7Ci0JZm9yIChwaGRyX2lkeCA9IDA7IHBoZHJfaWR4IDwgZWhkci0+ZV9waG51bTsgcGhkcl9pZHgrKykgewotCQlwaGRyID0gKHN0cnVjdCBlbGYzMl9waGRyICopIGVsZl9wdHI7Ci0JCXNlZ21lbnRfbWF0Y2ggPSBmYWxzZTsKLQotCQlzd2l0Y2ggKHNlZ21lbnRfdHlwZSkgewotCQljYXNlIFdEU1BfRUxGX0ZMQUdfUkU6Ci0JCQkvKgotCQkJICogRmxhZyBjYW4gYmUgUkVBRCBvciBFWEVDVVRFIG9yIGJvdGggYnV0Ci0JCQkgKiBXUklURSBmbGFnIHNob3VsZCBub3QgYmUgc2V0LgotCQkJICovCi0JCQlpZiAoKHBoZHItPnBfZmxhZ3MgJiBzZWdtZW50X3R5cGUpICYmCi0JCQkgICAgIShwaGRyLT5wX2ZsYWdzICYgV0RTUF9FTEZfRkxBR19XUklURSkpCi0JCQkJc2VnbWVudF9tYXRjaCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBXRFNQX0VMRl9GTEFHX1dSSVRFOgotCQkJLyoKLQkJCSAqIElmIFdSSVRFIGZsYWcgaXMgc2V0LCBvdGhlciBmbGFncyBkbyBub3QKLQkJCSAqIG1hdHRlci4KLQkJCSAqLwotCQkJaWYgKHBoZHItPnBfZmxhZ3MgJiBzZWdtZW50X3R5cGUpCi0JCQkJc2VnbWVudF9tYXRjaCA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzZWdtZW50X21hdGNoKSB7Ci0JCQlyZXQgPSB3ZHNwX2FkZF9zZWdtZW50X3RvX2xpc3QoZGV2LCBpbWdfZm5hbWUsIHBoZHIsCi0JCQkJCQkgICAgICAgcGhkcl9pZHgsIHNlZ19saXN0KTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJd2RzcF9mbHVzaF9zZWdtZW50X2xpc3Qoc2VnX2xpc3QpOwotCQkJCWdvdG8gYmFkX2VsZjsKLQkJCX0KLQkJfQotCQllbGZfcHRyID0gZWxmX3B0ciArIHNpemVvZigqcGhkcik7Ci0JfQotCi1iYWRfZWxmOgotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh3ZHNwX2dldF9zZWdtZW50X2xpc3QpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtZHNwLXV0aWxzLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzMGExYy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1kc3AtdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fV0NEX0RTUF9VVElMU19IX18KLSNkZWZpbmUgX19XQ0RfRFNQX1VUSUxTX0hfXwotCi0jZGVmaW5lIFdEU1BfSU1HX05BTUVfTEVOX01BWCAgICA2NAotCi0jZGVmaW5lIFdEU1BfRUxGX0ZMQUdfRVhFQ1VURSAgICAoMSA8PCAwKQotI2RlZmluZSBXRFNQX0VMRl9GTEFHX1dSSVRFICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgV0RTUF9FTEZfRkxBR19SRUFEICAgICAgICgxIDw8IDIpCi0KLSNkZWZpbmUgV0RTUF9FTEZfRkxBR19SRSAoV0RTUF9FTEZfRkxBR19SRUFEIHwgV0RTUF9FTEZfRkxBR19FWEVDVVRFKQotCi1zdHJ1Y3Qgd2RzcF9pbWdfc2VnbWVudCB7Ci0KLQkvKiBGaXJtd2FyZSBmb3IgdGhlIHNsaXQgaW1hZ2UgKi8KLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnNwbGl0X2Z3OwotCi0JLyogTmFtZSBvZiB0aGUgc3BsaXQgZmlybXdhcmUgZmlsZSAqLwotCWNoYXIgc3BsaXRfZm5hbWVbV0RTUF9JTUdfTkFNRV9MRU5fTUFYXTsKLQotCS8qIEFkZHJlc3Mgd2hlcmUgdGhlIHNlZ21lbnQgaXMgdG8gYmUgbG9hZGVkICovCi0JdTMyIGxvYWRfYWRkcjsKLQotCS8qIEJ1ZmZlciB0byBob2xkIHRoZSBkYXRhIHRvIGJlIGxvYWRlZCAqLwotCXU4ICpkYXRhOwotCi0JLyogU2l6ZSBvZiB0aGUgZGF0YSB0byBiZSBsb2FkZWQgKi8KLQlzaXplX3Qgc2l6ZTsKLQotCS8qIExpc3Qgbm9kZSBwb2ludGluZyB0byBuZXh0IHNlZ21lbnQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1pbnQgd2RzcF9nZXRfc2VnbWVudF9saXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaW1nX2ZuYW1lLAotCQkJICB1bnNpZ25lZCBpbnQgc2VnbWVudF90eXBlLCBzdHJ1Y3QgbGlzdF9oZWFkICpzZWdfbGlzdCwKLQkJCSAgdTMyICplbnRyeV9wb2ludCk7Ci12b2lkIHdkc3BfZmx1c2hfc2VnbWVudF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKnNlZ19saXN0KTsKLQotI2VuZGlmIC8qIF9fV0NEX0RTUF9VVElMU19IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtYWRjLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLWFkYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRlZWM5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtYWRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlICJ3Y2QtbWJoYy1hZGMuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy12Mi5oIgotCi0jZGVmaW5lIFdDRF9NQkhDX0FEQ19IU19USFJFU0hPTERfTVYgICAgMTcwMAotI2RlZmluZSBXQ0RfTUJIQ19BRENfSFBIX1RIUkVTSE9MRF9NViAgIDc1Ci0jZGVmaW5lIFdDRF9NQkhDX0FEQ19NSUNCSUFTX01WICAgICAgICAgMTgwMAotCi1zdGF0aWMgaW50IHdjZF9tYmhjX2dldF9taWNiaWFzKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlpbnQgbWljYmlhcyA9IDA7Ci0JdTggdm91dF9jdGwgPSAwOwotCi0JLyogUmVhZCBNQkhDIE1pY2JpYXMgKE1pYyBCaWFzMikgdm9sdGFnZSAqLwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX01JQ0IyX1ZPVVQsIHZvdXRfY3RsKTsKLQotCS8qIEZvcm11bGEgZm9yIGdldHRpbmcgbWljYmlhcyBmcm9tIHZvdXQKLQkgKiBtaWNiaWFzID0gMS4wViArIFZPVVRfQ1RMICogNTBtVgotCSAqLwotCW1pY2JpYXMgPSAxMDAwICsgKHZvdXRfY3RsICogNTApOwotCXByX2RlYnVnKCIlczogdm91dF9jdGw6ICVkLCBtaWNiaWFzOiAlZFxuIiwKLQkJIF9fZnVuY19fLCB2b3V0X2N0bCwgbWljYmlhcyk7Ci0KLQlyZXR1cm4gbWljYmlhczsKLX0KLQotc3RhdGljIGludCB3Y2RfZ2V0X3ZvbHRhZ2VfZnJvbV9hZGModTggdmFsLCBpbnQgbWljYmlhcykKLXsKLQkvKiBGb3JtdWxhIGZvciBjYWxjdWxhdGluZyB2b2x0YWdlIGZyb20gQURDCi0JICogVm9sdGFnZSA9IEFEQ19SRVNVTFQqMTIuNW1WKlZfTUlDQklBUy8xLjgKLQkgKi8KLQlyZXR1cm4gKCh2YWwgKiAxMjUgKiBtaWNiaWFzKS8oV0NEX01CSENfQURDX01JQ0JJQVNfTVYgKiAxMCkpOwotfQotCi1zdGF0aWMgaW50IHdjZF9tZWFzdXJlX2FkY19jb250aW51b3VzKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQl1OCBhZGNfcmVzdWx0ID0gMDsKLQlpbnQgb3V0cHV0X212ID0gMDsKLQlpbnQgcmV0cnkgPSAzOwotCXU4IGFkY19lbiA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBQcmUtcmVxdWlzaXRlcyBmb3IgQURDIGNvbnRpbnVvdXMgbWVhc3VyZW1lbnQgKi8KLQkvKiBSZWFkIGxlZ2FjeSBlbGVjdGlyY2FsIGRldGVjdGlvbiBhbmQgZGlzYWJsZSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAweDAwKTsKLQkvKiBTZXQgQURDIHRvIGNvbnRpbnVvdXMgbWVhc3VyZW1lbnQgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX01PREUsIDEpOwotCS8qIFJlYWQgQURDIEVuYWJsZSBiaXQgdG8gcmVzdG9yZSBhZnRlciBhZGMgbWVhc3VyZW1lbnQgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfRU4sIGFkY19lbik7Ci0JLyogRGlzYWJsZSBBRENfRU5BQkxFIGJpdCAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BRENfRU4sIDApOwotCS8qIERpc2FibGUgTUJIQyBGU00gKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQkvKiBTZXQgdGhlIE1VWCBzZWxlY3Rpb24gdG8gSU4yUCAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NVVhfQ1RMLCBNVVhfQ1RMX0lOMlApOwotCS8qIEVuYWJsZSBNQkhDIEZTTSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDEpOwotCS8qIEVuYWJsZSBBRENfRU5BQkxFIGJpdCAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BRENfRU4sIDEpOwotCi0Jd2hpbGUgKHJldHJ5LS0pIHsKLQkJLyogd2FpdCBmb3IgMyBtc2VjIGJlZm9yZSByZWFkaW5nIEFEQyByZXN1bHQgKi8KLQkJdXNsZWVwX3JhbmdlKDMwMDAsIDMxMDApOwotCi0JCS8qIFJlYWQgQURDIHJlc3VsdCAqLwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfUkVTVUxULCBhZGNfcmVzdWx0KTsKLQl9Ci0KLQkvKiBSZXN0b3JlIEFEQyBFbmFibGUgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCBhZGNfZW4pOwotCS8qIEdldCB2b2x0YWdlIGZyb20gQURDIHJlc3VsdCAqLwotCW91dHB1dF9tdiA9IHdjZF9nZXRfdm9sdGFnZV9mcm9tX2FkYyhhZGNfcmVzdWx0LAotCQkJCQkgICAgIHdjZF9tYmhjX2dldF9taWNiaWFzKG1iaGMpKTsKLQlwcl9kZWJ1ZygiJXM6IGFkY19yZXN1bHQ6IDB4JXgsIG91dHB1dF9tdjogJWRcbiIsCi0JCSBfX2Z1bmNfXywgYWRjX3Jlc3VsdCwgb3V0cHV0X212KTsKLQotCXJldHVybiBvdXRwdXRfbXY7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX21lYXN1cmVfYWRjX29uY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLCBpbnQgbXV4X2N0bCkKLXsKLQl1OCBhZGNfdGltZW91dCA9IDA7Ci0JdTggYWRjX2NvbXBsZXRlID0gMDsKLQl1OCBhZGNfcmVzdWx0ID0gMDsKLQlpbnQgcmV0cnkgPSA2OwotCWludCByZXQgPSAwOwotCWludCBvdXRwdXRfbXYgPSAwOwotCXU4IGFkY19lbiA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX01PREUsIDApOwotCS8qIFJlYWQgQURDIEVuYWJsZSBiaXQgdG8gcmVzdG9yZSBhZnRlciBhZGMgbWVhc3VyZW1lbnQgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfRU4sIGFkY19lbik7Ci0JLyogVHJpZ2dlciBBREMgb25lIHRpbWUgbWVhc3VyZW1lbnQgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCAwKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQkvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIE1VWCBzZWxlY3Rpb24gKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTVVYX0NUTCwgbXV4X2N0bCk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FEQ19FTiwgMSk7Ci0KLQl3aGlsZSAocmV0cnktLSkgewotCQkvKiB3YWl0IGZvciA2MDB1c2VjIHRvIGdldCBhZGMgcmVzdWx0cyAqLwotCQl1c2xlZXBfcmFuZ2UoNjAwLCA2MTApOwotCi0JCS8qIGNoZWNrIGZvciBBREMgVGltZW91dCAqLwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfVElNRU9VVCwgYWRjX3RpbWVvdXQpOwotCQlpZiAoYWRjX3RpbWVvdXQpCi0JCQljb250aW51ZTsKLQotCQkvKiBSZWFkIEFEQyBjb21wbGV0ZSBiaXQgKi8KLQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfQURDX0NPTVBMRVRFLCBhZGNfY29tcGxldGUpOwotCQlpZiAoIWFkY19jb21wbGV0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIFJlYWQgQURDIHJlc3VsdCAqLwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfUkVTVUxULCBhZGNfcmVzdWx0KTsKLQotCQlwcl9kZWJ1ZygiJXM6IEFEQyByZXN1bHQ6IDB4JXhcbiIsIF9fZnVuY19fLCBhZGNfcmVzdWx0KTsKLQkJLyogR2V0IHZvbHRhZ2UgZnJvbSBBREMgcmVzdWx0ICovCi0JCW91dHB1dF9tdiA9IHdjZF9nZXRfdm9sdGFnZV9mcm9tX2FkYyhhZGNfcmVzdWx0LAotCQkJCQkJd2NkX21iaGNfZ2V0X21pY2JpYXMobWJoYykpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBSZXN0b3JlIEFEQyBFbmFibGUgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCBhZGNfZW4pOwotCi0JaWYgKHJldHJ5IDw9IDApIHsKLQkJcHJfZXJyKCIlczogYWRjIGNvbXBsZXRlOiAlZCwgYWRjIHRpbWVvdXQ6ICVkXG4iLAotCQkJX19mdW5jX18sIGFkY19jb21wbGV0ZSwgYWRjX3RpbWVvdXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogYWRjIGNvbXBsZXRlOiAlZCwgYWRjIHRpbWVvdXQ6ICVkIG91dHB1dF9tVjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgYWRjX2NvbXBsZXRlLCBhZGNfdGltZW91dCwgb3V0cHV0X212KTsKLQkJcmV0ID0gb3V0cHV0X212OwotCX0KLQotCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIHdjZF9tYmhjX2FkY19kZXRlY3RfYW5jX3BsdWdfdHlwZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JYm9vbCBhbmNfbWljX2ZvdW5kID0gZmFsc2U7Ci0JdTE2IGZzbV9lbiA9IDA7Ci0JdTggZGV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIHJldHJ5ID0gMDsKLQlpbnQgdmFsaWRfcGx1Z19jbnQgPSAwLCBpbnZhbGlkX3BsdWdfY250ID0gMDsKLQlpbnQgcmV0ID0gMDsKLQl1OCBlbGVjdF9jdGwgPSAwOwotCXU4IGFkY19tb2RlID0gMDsKLQl1OCB2cmVmID0gMDsKLQlpbnQgdnJlZl9tdltdID0gezE2NTAsIDE1MDAsIDE2MDAsIDE3MDB9OwotCi0JaWYgKG1iaGMtPm1iaGNfY2ZnLT5hbmNfbWljYmlhcyA8IE1JQ19CSUFTXzEgfHwKLQkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzID4gTUlDX0JJQVNfNCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogRGlzYWJsZSBEZXRlY3Rpb24gZG9uZSBmb3IgQURDIG9wZXJhdGlvbiAqLwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0RFVEVDVElPTl9ET05FLCBkZXQpOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19ERVRFQ1RJT05fRE9ORSwgMCk7Ci0KLQkvKiBNYXNrIEFEQyBDT01QTEVURSBpbnRlcnJ1cHQgKi8KLQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywgZmFsc2UpOwotCi0JV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOwotCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCQkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzLAotCQkJCQkgICAgTUlDQl9FTkFCTEUpOwotCi0JLyogUmVhZCBsZWdhY3kgZWxlY3RpcmNhbCBkZXRlY3Rpb24gYW5kIGRpc2FibGUgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCBlbGVjdF9jdGwpOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAweDAwKTsKLQotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BTkNfREVUX0VOLCAxKTsKLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19BRENfTU9ERSwgYWRjX21vZGUpOwotCi0JLyoKLQkgKiB3YWl0IGZvciBidXR0b24gZGVib3VuY2UgdGltZSAyMG1zLiBJZiA0LXBvbGUgcGx1ZyBpcyBpbnNlcnRlZAotCSAqIGludG8gNS1wb2xlIGphY2ssIHRoZW4gdGhlcmUgd2lsbCBiZSBhIGJ1dHRvbiBwcmVzcyBpbnRlcnJ1cHQKLQkgKiBkdXJpbmcgYW5jIHBsdWcgZGV0ZWN0aW9uLiBJbiB0aGF0IGNhc2UgdGhvdWdoIEhzX2NvbXBfcmVzIGlzIDAsCi0JICogaXQgc2hvdWxkIG5vdCBiZSBkZWNsYXJlZCBhcyBBTkMgcGx1ZyB0eXBlCi0JICovCi0JdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7Ci0KLQkvKgotCSAqIEFmdGVyIGVuYWJsaW5nIEZTTSwgdG8gaGFuZGxlIHNsb3cgaW5zZXJ0aW9uIHNjZW5hcmlvcywKLQkgKiBjaGVjayBJTjMgdm9sdGFnZSBpcyBiZWxvdyB0aGUgVnJlZgotCSAqLwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX1ZSRUYsIHZyZWYpOwotCi0JZG8gewotCQlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IFJldHJ5IGF0dGVtcHQgJWx1XG4iLCBfX2Z1bmNfXywgcmV0cnkgKyAxKTsKLQkJcmV0ID0gd2NkX21lYXN1cmVfYWRjX29uY2UobWJoYywgTVVYX0NUTF9JTjNQKTsKLQkJLyogVE9ETyAtIGNoZWNrIHRoZSBsb2dpYyAqLwotCQlpZiAocmV0ICYmIChyZXQgPCB2cmVmX212W3ZyZWZdKSkKLQkJCXZhbGlkX3BsdWdfY250Kys7Ci0JCWVsc2UKLQkJCWludmFsaWRfcGx1Z19jbnQrKzsKLQkJcmV0cnkrKzsKLQl9IHdoaWxlIChyZXRyeSA8IEFOQ19ERVRFQ1RfUkVUUllfQ05UKTsKLQotCXByX2RlYnVnKCIlczogdmFsaWQ6ICVkLCBpbnZhbGlkOiAlZFxuIiwgX19mdW5jX18sIHZhbGlkX3BsdWdfY250LAotCQkgaW52YWxpZF9wbHVnX2NudCk7Ci0KLQkvKiBkZWNpc2lvbiBsb2dpYyAqLwotCWlmICh2YWxpZF9wbHVnX2NudCA+IGludmFsaWRfcGx1Z19jbnQpCi0JCWFuY19taWNfZm91bmQgPSB0cnVlOwotZG9uZToKLQkvKiBSZXN0b3JlIEFEQyBtb2RlICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FEQ19NT0RFLCBhZGNfbW9kZSk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FOQ19ERVRfRU4sIDApOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOwotCS8qIFNldCB0aGUgTVVYIHNlbGVjdGlvbiB0byBBVVRPICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01VWF9DVEwsIE1VWF9DVExfQVVUTyk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgZnNtX2VuKTsKLQkvKiBSZXN0b3JlIGRldGVjdGlvbiBkb25lICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0RFVEVDVElPTl9ET05FLCBkZXQpOwotCi0JLyogUmVzdG9yZSBlbGVjdHJpY2FsIGRldGVjdGlvbiAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCBlbGVjdF9jdGwpOwotCi0JbWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wobWJoYy0+Y29kZWMsCi0JCQkJCSAgICBtYmhjLT5tYmhjX2NmZy0+YW5jX21pY2JpYXMsCi0JCQkJCSAgICBNSUNCX0RJU0FCTEUpOwotCXByX2RlYnVnKCIlczogYW5jIG1pYyAlc2ZvdW5kXG4iLCBfX2Z1bmNfXywKLQkJIGFuY19taWNfZm91bmQgPyAiIiA6ICJub3QgIik7Ci0KLQlyZXR1cm4gYW5jX21pY19mb3VuZDsKLX0KLQotLyogVG8gZGV0ZXJtaW5lIGlmIGNyb3NzIGNvbm5lY3Rpb24gb2NjdXJyZWQgKi8KLXN0YXRpYyBpbnQgd2NkX2NoZWNrX2Nyb3NzX2Nvbm4oc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWVudW0gd2NkX21iaGNfcGx1Z190eXBlIHBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX05PTkU7Ci0JaW50IGhwaGxfYWRjX3JlcyA9IDAsIGhwaHJfYWRjX3JlcyA9IDA7Ci0JdTggZnNtX2VuID0gMDsKLQlpbnQgcmV0ID0gMDsKLQl1OCBhZGNfbW9kZSA9IDA7Ci0JdTggZWxlY3RfY3RsID0gMDsKLQl1OCBhZGNfZW4gPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCS8qIENoZWNrIGZvciBidXR0b24gcHJlc3MgYW5kIHBsdWcgZGV0ZWN0aW9uICovCi0JaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgewotCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogSWYgUEEgaXMgZW5hYmxlZCwgZG9udCBjaGVjayBmb3IgY3Jvc3MtY29ubmVjdGlvbiAqLwotCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKQotCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3BhX29uX3N0YXR1cyhtYmhjLT5jb2RlYykpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFJlYWQgbGVnYWN5IGVsZWN0aXJjYWwgZGV0ZWN0aW9uIGFuZCBkaXNhYmxlICovCi0JV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywgZWxlY3RfY3RsKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywgMHgwMCk7Ci0KLQkvKiBSZWFkIGFuZCBzZXQgQURDIHRvIHNpbmdsZSBtZWFzdXJlbWVudCAqLwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0FEQ19NT0RFLCBhZGNfbW9kZSk7Ci0JLyogUmVhZCBBREMgRW5hYmxlIGJpdCB0byByZXN0b3JlIGFmdGVyIGFkYyBtZWFzdXJlbWVudCAqLwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0FEQ19FTiwgYWRjX2VuKTsKLQkvKiBSZWFkIEZTTSBzdGF0dXMgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19GU01fRU4sIGZzbV9lbik7Ci0KLQkvKiBHZXQgYWRjIHJlc3VsdCBmb3IgSFBIIEwgKi8KLQlocGhsX2FkY19yZXMgPSB3Y2RfbWVhc3VyZV9hZGNfb25jZShtYmhjLCBNVVhfQ1RMX0hQSF9MKTsKLQlpZiAoaHBobF9hZGNfcmVzIDwgMCkgewotCQlwcl9lcnIoIiVzOiBocGhsX2FkY19yZXMgYWRjIG1lYXN1cmVtZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBocGhsX2FkY19yZXM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBHZXQgYWRjIHJlc3VsdCBmb3IgSFBIIFIgaW4gbVYgKi8KLQlocGhyX2FkY19yZXMgPSB3Y2RfbWVhc3VyZV9hZGNfb25jZShtYmhjLCBNVVhfQ1RMX0hQSF9SKTsKLQlpZiAoaHBocl9hZGNfcmVzIDwgMCkgewotCQlwcl9lcnIoIiVzOiBocGhyX2FkY19yZXMgYWRjIG1lYXN1cmVtZW50IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBocGhyX2FkY19yZXM7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoaHBobF9hZGNfcmVzID4gMTAwICYmIGhwaHJfYWRjX3JlcyA+IDEwMCkgewotCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7Ci0JCXByX2RlYnVnKCIlczogQ3Jvc3MgY29ubmVjdGlvbiBpZGVudGlmaWVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBObyBDcm9zcyBjb25uZWN0aW9uIGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi1kb25lOgotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOwotCS8qIFNldCB0aGUgTVVYIHNlbGVjdGlvbiB0byBBdXRvICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01VWF9DVEwsIE1VWF9DVExfQVVUTyk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0KLQkvKiBSZXN0b3JlIEFEQyBFbmFibGUgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCBhZGNfZW4pOwotCi0JLyogUmVzdG9yZSBBREMgbW9kZSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BRENfTU9ERSwgYWRjX21vZGUpOwotCi0JLyogUmVzdG9yZSBGU00gc3RhdGUgKi8KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOwotCi0JLyogUmVzdG9yZSBlbGVjdHJpY2FsIGRldGVjdGlvbiAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCBlbGVjdF9jdGwpOwotCi0JcHJfZGVidWcoIiVzOiBsZWF2ZSwgcGx1ZyB0eXBlOiAlZFxuIiwgX19mdW5jX18sICBwbHVnX3R5cGUpOwotCi0JcmV0dXJuIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgd2NkX21iaGNfYWRjX2NoZWNrX2Zvcl9zcGxfaGVhZHNldChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJCSAgIGludCAqc3BsX2hzX2NudCkKLXsKLQlib29sIHNwbF9ocyA9IGZhbHNlOwotCWludCBvdXRwdXRfbXYgPSAwOwotCWludCBhZGNfdGhyZXNob2xkID0gMCwgYWRjX2hwaF90aHJlc2hvbGQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCWlmICghbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykKLQkJZ290byBleGl0OwotCi0JLyogQnVtcCB1cCBNQjIgdG8gMi43ViAqLwotCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCi0JCQkJbWJoYy0+bWJoY19jZmctPm1iaGNfbWljYmlhcywgdHJ1ZSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7Ci0KLQkvKgotCSAqIFVzZSBBREMgc2luZ2xlIG1vZGUgdG8gbWluaW1pemUgdGhlIGNoYW5jZSBvZiBtaXNzaW5nIG91dAotCSAqIGJ0biBwcmVzcy9yZWxlc2FlIGZvciBIRUFEU0VUIHR5cGUgZHVyaW5nIGNvcnJlY3Qgd29yay4KLQkgKi8KLQlvdXRwdXRfbXYgPSB3Y2RfbWVhc3VyZV9hZGNfb25jZShtYmhjLCBNVVhfQ1RMX0lOMlApOwotCWFkY190aHJlc2hvbGQgPSAoKFdDRF9NQkhDX0FEQ19IU19USFJFU0hPTERfTVYgKgotCQkJICB3Y2RfbWJoY19nZXRfbWljYmlhcyhtYmhjKSkvV0NEX01CSENfQURDX01JQ0JJQVNfTVYpOwotCWFkY19ocGhfdGhyZXNob2xkID0gKChXQ0RfTUJIQ19BRENfSFBIX1RIUkVTSE9MRF9NViAqCi0JCQkgICAgICB3Y2RfbWJoY19nZXRfbWljYmlhcyhtYmhjKSkvCi0JCQkgICAgICBXQ0RfTUJIQ19BRENfTUlDQklBU19NVik7Ci0KLQlpZiAob3V0cHV0X212ID4gYWRjX3RocmVzaG9sZCB8fCBvdXRwdXRfbXYgPCBhZGNfaHBoX3RocmVzaG9sZCkgewotCQlzcGxfaHMgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlzcGxfaHMgPSB0cnVlOwotCQlpZiAoc3BsX2hzX2NudCkKLQkJCSpzcGxfaHNfY250ICs9IDE7Ci0JfQotCi0JLyogTUIyIGJhY2sgdG8gMS44diBpZiB0aGUgdHlwZSBpcyBub3Qgc3BlY2lhbCBoZWFkc2V0ICovCi0JaWYgKHNwbF9oc19jbnQgJiYgKCpzcGxfaHNfY250ICE9IFdDRF9NQkhDX1NQTF9IU19DTlQpKSB7Ci0JCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCi0JCQkJbWJoYy0+bWJoY19jZmctPm1iaGNfbWljYmlhcywgZmFsc2UpOwotCQkvKiBBZGQgMTBtcyBkZWxheSBmb3IgbWljYmlhcyB0byBzZXR0bGUgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7Ci0JfQotCi0JaWYgKHNwbF9ocykKLQkJcHJfZGVidWcoIiVzOiBEZXRlY3RlZCBzcGVjaWFsIEhTICglZClcbiIsIF9fZnVuY19fLCBzcGxfaHMpOwotCi1leGl0OgotCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gc3BsX2hzOwotfQotCi1zdGF0aWMgYm9vbCB3Y2RfaXNfc3BlY2lhbF9oZWFkc2V0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlpbnQgZGVsYXkgPSAwOwotCWJvb2wgcmV0ID0gZmFsc2U7Ci0JYm9vbCBpc19zcGxfaHMgPSBmYWxzZTsKLQlpbnQgb3V0cHV0X212ID0gMDsKLQlpbnQgYWRjX3RocmVzaG9sZCA9IDA7Ci0KLQkvKgotCSAqIEluY3JlYXNlIG1pY2JpYXMgdG8gMi43ViB0byBkZXRlY3QgaGVhZHNldHMgd2l0aAotCSAqIHRocmVzaG9sZCBvbiBtaWNyb3Bob25lCi0JICovCi0JaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sICYmCi0JICAgICFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKSB7Ci0JCXByX2RlYnVnKCIlczogY2FsbGJhY2sgZm4gbWljYl9jdHJsX3Rocl9taWMgbm90IGRlZmluZWRcbiIsCi0JCQkgX19mdW5jX18pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKSB7Ci0JCXJldCA9IG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCi0JCQkJCQkJTUlDX0JJQVNfMiwgdHJ1ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IG1iaGNfbWljYl9jdHJsX3Rocl9taWMgZmFpbGVkLCByZXQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JYWRjX3RocmVzaG9sZCA9ICgoV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NViAqCi0JCQkgIHdjZF9tYmhjX2dldF9taWNiaWFzKG1iaGMpKSAvCi0JCQkgIFdDRF9NQkhDX0FEQ19NSUNCSUFTX01WKTsKLQotCXdoaWxlICghaXNfc3BsX2hzKSB7Ci0JCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVsYXkgKz0gNTA7Ci0JCS8qIFdhaXQgZm9yIDUwbXMgZm9yIEZTTSB0byB1cGRhdGUgcmVzdWx0ICovCi0JCW1zbGVlcCg1MCk7Ci0JCW91dHB1dF9tdiA9IHdjZF9tZWFzdXJlX2FkY19vbmNlKG1iaGMsIE1VWF9DVExfSU4yUCk7Ci0JCWlmIChvdXRwdXRfbXYgPD0gYWRjX3RocmVzaG9sZCkgewotCQkJcHJfZGVidWcoIiVzOiBTcGVjaWFsIGhlYWRzZXQgZGV0ZWN0ZWQgaW4gJWQgbXNlY3NcbiIsCi0JCQkJCV9fZnVuY19fLCBkZWxheSk7Ci0JCQlpc19zcGxfaHMgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGRlbGF5ID09IFNQRUNJQUxfSFNfREVURUNUX1RJTUVfTVMpIHsKLQkJCXByX2RlYnVnKCIlczogU3BsIGhlYWRzZXQgbm90IGZvdW5kIGluIDIgc2VjXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaXNfc3BsX2hzKSB7Ci0JCXByX2RlYnVnKCIlczogSGVhZHNldCB3aXRoIHRocmVzaG9sZCBmb3VuZFxuIiwgIF9fZnVuY19fKTsKLQkJbWJoYy0+bWljYmlhc19lbmFibGUgPSB0cnVlOwotCQlyZXQgPSB0cnVlOwotCX0KLQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYyAmJgotCSAgICAhbWJoYy0+bWljYmlhc19lbmFibGUpCi0JCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsCi0JCQkJCQkgICAgICBmYWxzZSk7Ci0JcHJfZGVidWcoIiVzOiBsZWF2ZSwgbWljYl9lbmFibGU6ICVkXG4iLCBfX2Z1bmNfXywKLQkJICBtYmhjLT5taWNiaWFzX2VuYWJsZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfbWJoY19hZGNfdXBkYXRlX2ZzbV9zb3VyY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCSAgICAgICBlbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCi17Ci0JYm9vbCBtaWNiaWFzMjsKLQotCW1pY2JpYXMyID0gbWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKG1iaGMsCi0JCQkJCQkJTUlDX0JJQVNfMik7Ci0Jc3dpdGNoIChwbHVnX3R5cGUpIHsKLQljYXNlIE1CSENfUExVR19UWVBFX0hFQURQSE9ORToKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMyk7Ci0JCWJyZWFrOwotCWNhc2UgTUJIQ19QTFVHX1RZUEVfSEVBRFNFVDoKLQljYXNlIE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkU6Ci0JCWlmICghbWJoYy0+aXNfaHNfcmVjb3JkaW5nICYmICFtaWNiaWFzMikKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAwKTsKLQkJYnJlYWs7Ci0KLQl9OwotfQotCi0vKiBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIGludGVycnVwdCBjb250ZXh0IHRoYXQgaG9sZCBzdXNwZW5kICovCi1zdGF0aWMgdm9pZCB3Y2Rfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQkgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXByX2RlYnVnKCIlczogc2NoZWR1bGluZyBjb3JyZWN0X3N3Y2hfcGx1Z1xuIiwgX19mdW5jX18pOwotCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOwotCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSBmYWxzZTsKLQltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIHRydWUpOwotCXNjaGVkdWxlX3dvcmsod29yayk7Ci19Ci0KLS8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCi1zdGF0aWMgdm9pZCB3Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQkJIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlwcl9kZWJ1ZygiJXM6IENhbmNlbGluZyBjb3JyZWN0X3BsdWdfc3djaFxuIiwgX19mdW5jX18pOwotCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSB0cnVlOwotCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JaWYgKGNhbmNlbF93b3JrX3N5bmMod29yaykpIHsKLQkJcHJfZGVidWcoIiVzOiBjb3JyZWN0X3BsdWdfc3djaCBpcyBjYW5jZWxlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOwotCX0KLQlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKLX0KLQotLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KLXN0YXRpYyB2b2lkIHdjZF9tYmhjX2FkY19kZXRlY3RfcGx1Z190eXBlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKLQotCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcHVsbF9kb3duX2N0cmwpCi0JCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybChjb2RlYywgZmFsc2UpOwotCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0RFVEVDVElPTl9ET05FLCAwKTsKLQotCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkgewotCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbChjb2RlYywgTUlDX0JJQVNfMiwKLQkJCQkJCSAgICBNSUNCX0VOQUJMRSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogTWljIEJpYXMgaXMgbm90IGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJlLWluaXRpYWxpemUgYnV0dG9uIHByZXNzIGNvbXBsZXRpb24gb2JqZWN0ICovCi0JcmVpbml0X2NvbXBsZXRpb24oJm1iaGMtPmJ0bl9wcmVzc19jb21wbCk7Ci0Jd2NkX3NjaGVkdWxlX2hzX2RldGVjdF9wbHVnKG1iaGMsICZtYmhjLT5jb3JyZWN0X3BsdWdfc3djaCk7Ci0JcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfbWljYmlhc19kaXNhYmxlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKLQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKLQkJCW1iaGMtPmNvZGVjLCBNSUNfQklBU18yLCBmYWxzZSk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSkKLQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAotCQkJCQltYmhjLT5jb2RlYyk7Ci0JCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgaW50IHdjZF9tYmhjX2dldF9wbHVnX2Zyb21fYWRjKGludCBhZGNfcmVzdWx0KQotCi17Ci0JZW51bSB3Y2RfbWJoY19wbHVnX3R5cGUgcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfSU5WQUxJRDsKLQotCWlmIChhZGNfcmVzdWx0IDwgV0NEX01CSENfQURDX0hQSF9USFJFU0hPTERfTVYpCi0JCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hFQURQSE9ORTsKLQllbHNlIGlmIChhZGNfcmVzdWx0ID4gV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NVikKLQkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfSElHSF9IUEg7Ci0JZWxzZQotCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOwotCXByX2RlYnVnKCIlczogcGx1ZyB0eXBlIGlzICVkIGZvdW5kXG4iLCBfX2Z1bmNfXywgcGx1Z190eXBlKTsKLQotCXJldHVybiBwbHVnX3R5cGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jb3JyZWN0X3N3Y2hfcGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9JTlZBTElEOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQlib29sIHdya19jb21wbGV0ZSA9IGZhbHNlOwotCWludCBwdF9nbmRfbWljX3N3YXBfY250ID0gMDsKLQlpbnQgbm9fZ25kX21pY19zd2FwX2NudCA9IDA7Ci0JYm9vbCBpc19wYV9vbiA9IGZhbHNlLCBzcGxfaHMgPSBmYWxzZSwgc3BsX2hzX3JlcG9ydGVkID0gZmFsc2U7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHNwbF9oc19jb3VudCA9IDA7Ci0JaW50IG91dHB1dF9tdiA9IDA7Ci0JaW50IGNyb3NzX2Nvbm47Ci0JaW50IHRyeSA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQltYmhjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgY29ycmVjdF9wbHVnX3N3Y2gpOwotCWNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKLQkvKiBNYXNrIEFEQyBDT01QTEVURSBpbnRlcnJ1cHQgKi8KLQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywgZmFsc2UpOwotCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0KLQkvKiBDaGVjayBmb3IgY3Jvc3MgY29ubmVjdGlvbiAqLwotCWRvIHsKLQkJY3Jvc3NfY29ubiA9IHdjZF9jaGVja19jcm9zc19jb25uKG1iaGMpOwotCQl0cnkrKzsKLQl9IHdoaWxlICh0cnkgPCBHTkRfTUlDX1NXQVBfVEhSRVNIT0xEKTsKLQotCWlmIChjcm9zc19jb25uID4gMCkgewotCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7Ci0JCXByX2RlYnVnKCIlczogY3Jvc3MgY29ubmVjdGlvbiBmb3VuZCwgUGx1ZyB0eXBlICVkXG4iLAotCQkJIF9fZnVuY19fLCBwbHVnX3R5cGUpOwotCQlnb3RvIGNvcnJlY3RfcGx1Z190eXBlOwotCX0KLQkvKiBGaW5kIHBsdWcgdHlwZSAqLwotCW91dHB1dF9tdiA9IHdjZF9tZWFzdXJlX2FkY19jb250aW51b3VzKG1iaGMpOwotCXBsdWdfdHlwZSA9IHdjZF9tYmhjX2dldF9wbHVnX2Zyb21fYWRjKG91dHB1dF9tdik7Ci0KLQkvKgotCSAqIFJlcG9ydCBwbHVnIHR5cGUgaWYgaXQgaXMgZWl0aGVyIGhlYWRzZXQgb3IgaGVhZHBob25lCi0JICogZWxzZSBzdGFydCB0aGUgMyBzZWMgbG9vcAotCSAqLwotCWlmICgocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURTRVQgfHwKLQkgICAgIHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpICYmCi0JICAgICghd2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSkgewotCQlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKLQkJd2NkX21iaGNfZmluZF9wbHVnX2FuZF9yZXBvcnQobWJoYywgcGx1Z190eXBlKTsKLQkJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQl9Ci0KLQkvKgotCSAqIFNldCBERVRFQ1RJT05fRE9ORSBiaXQgZm9yIEhFQURTRVQgYW5kIEFOQ19IRUFEUEhPTkUsCi0JICogc28gdGhhdCBidG4gcHJlc3MvcmVsZWFzZSBpbnRlcnJ1cHQgY2FuIGJlIGdlbmVyYXRlZC4KLQkgKi8KLQlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hFQURTRVQgfHwKLQkJbWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkUpIHsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FEQ19NT0RFLCAwKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FEQ19FTiwgMCk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19ERVRFQ1RJT05fRE9ORSwgMSk7Ci0JfQotCi1jb3JyZWN0X3BsdWdfdHlwZToKLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSFNfREVURUNUX1BMVUdfVElNRV9NUyk7Ci0Jd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOwotCQkJd2NkX21pY2JpYXNfZGlzYWJsZShtYmhjKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qIGFsbG93IHNvbWV0aW1lIGFuZCByZS1jaGVjayBzdG9wIHJlcXVlc3RlZCBhZ2FpbiAqLwotCQltc2xlZXAoMjApOwotCQlpZiAobWJoYy0+aHNfZGV0ZWN0X3dvcmtfc3RvcCkgewotCQkJcHJfZGVidWcoIiVzOiBzdG9wIHJlcXVlc3RlZDogJWRcbiIsIF9fZnVuY19fLAotCQkJCQltYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKTsKLQkJCXdjZF9taWNiaWFzX2Rpc2FibGUobWJoYyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQltc2xlZXAoMTgwKTsKLQkJLyoKLQkJICogVXNlIEFEQyBzaW5nbGUgbW9kZSB0byBtaW5pbWl6ZSB0aGUgY2hhbmNlIG9mIG1pc3Npbmcgb3V0Ci0JCSAqIGJ0biBwcmVzcy9yZWxlYXNlIGZvciBIRUFEU0VUIHR5cGUgZHVyaW5nIGNvcnJlY3Qgd29yay4KLQkJICovCi0JCW91dHB1dF9tdiA9IHdjZF9tZWFzdXJlX2FkY19vbmNlKG1iaGMsIE1VWF9DVExfSU4yUCk7Ci0KLQkJLyoKLQkJICogaW5zdGVhZCBvZiBob2dnaW5nIHN5c3RlbSBieSBjb250aW5lb3VzIHBvbGxpbmcsIHdhaXQgZm9yCi0JCSAqIHNvbWV0aW1lIGFuZCByZS1jaGVjayBzdG9wIHJlcXVlc3QgYWdhaW4uCi0JCSAqLwotCQlwbHVnX3R5cGUgPSB3Y2RfbWJoY19nZXRfcGx1Z19mcm9tX2FkYyhvdXRwdXRfbXYpOwotCi0JCWlmICgob3V0cHV0X212ID4gV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NVikgJiYKLQkJICAgIChzcGxfaHNfY291bnQgPCBXQ0RfTUJIQ19TUExfSFNfQ05UKSkgewotCQkJc3BsX2hzID0gd2NkX21iaGNfYWRjX2NoZWNrX2Zvcl9zcGxfaGVhZHNldChtYmhjLAotCQkJCQkJCQkmc3BsX2hzX2NvdW50KTsKLQotCQkJaWYgKHNwbF9oc19jb3VudCA9PSBXQ0RfTUJIQ19TUExfSFNfQ05UKSB7Ci0JCQkJb3V0cHV0X212ID0gV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NVjsKLQkJCQlzcGxfaHMgPSB0cnVlOwotCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKQotCQkJaXNfcGFfb24gPSBtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKG1iaGMtPmNvZGVjKTsKLQotCQlpZiAoKG91dHB1dF9tdiA8PSBXQ0RfTUJIQ19BRENfSFNfVEhSRVNIT0xEX01WKSAmJgotCQkgICAgKCFpc19wYV9vbikpIHsKLQkJCS8qIENoZWNrIGZvciBjcm9zcyBjb25uZWN0aW9uKi8KLQkJCXJldCA9IHdjZF9jaGVja19jcm9zc19jb25uKG1iaGMpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJY29udGludWU7Ci0JCQllbHNlIGlmIChyZXQgPiAwKSB7Ci0JCQkJcHRfZ25kX21pY19zd2FwX2NudCsrOwotCQkJCW5vX2duZF9taWNfc3dhcF9jbnQgPSAwOwotCQkJCWlmIChwdF9nbmRfbWljX3N3YXBfY250IDwKLQkJCQkJCUdORF9NSUNfU1dBUF9USFJFU0hPTEQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChwdF9nbmRfbWljX3N3YXBfY250ID4KLQkJCQkJICAgR05EX01JQ19TV0FQX1RIUkVTSE9MRCkgewotCQkJCQkvKgotCQkJCQkgKiBUaGlzIGlzIGR1ZSB0byBHTkQvTUlDIHN3aXRjaCBkaWRuJ3QKLQkJCQkJICogd29yaywgIFJlcG9ydCB1bnN1cHBvcnRlZCBwbHVnLgotCQkJCQkgKi8KLQkJCQkJcHJfZGVidWcoIiVzOiBzd2l0Y2ggZGlkIG5vdCB3b3JrXG4iLAotCQkJCQkJIF9fZnVuY19fKTsKLQkJCQkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQOwotCQkJCQlnb3RvIHJlcG9ydDsKLQkJCQl9IGVsc2UgewotCQkJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlub19nbmRfbWljX3N3YXBfY250Kys7Ci0JCQkJcHRfZ25kX21pY19zd2FwX2NudCA9IDA7Ci0JCQkJcGx1Z190eXBlID0gd2NkX21iaGNfZ2V0X3BsdWdfZnJvbV9hZGMoCi0JCQkJCQlvdXRwdXRfbXYpOwotCQkJCWlmICgobm9fZ25kX21pY19zd2FwX2NudCA8Ci0JCQkJICAgIEdORF9NSUNfU1dBUF9USFJFU0hPTEQpICYmCi0JCQkJICAgIChzcGxfaHNfY291bnQgIT0gV0NEX01CSENfU1BMX0hTX0NOVCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9fZ25kX21pY19zd2FwX2NudCA9IDA7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChwdF9nbmRfbWljX3N3YXBfY250ID09IEdORF9NSUNfU1dBUF9USFJFU0hPTEQpICYmCi0JCQkJKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApKSB7Ci0JCQkJLyoKLQkJCQkgKiBpZiBzd2l0Y2ggaXMgdG9nZ2xlZCwgY2hlY2sgYWdhaW4sCi0JCQkJICogb3RoZXJ3aXNlIHJlcG9ydCB1bnN1cHBvcnRlZCBwbHVnCi0JCQkJICovCi0JCQkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5zd2FwX2duZF9taWMgJiYKLQkJCQkJbWJoYy0+bWJoY19jZmctPnN3YXBfZ25kX21pYyhjb2RlYywKLQkJCQkJdHJ1ZSkpIHsKLQkJCQkJcHJfZGVidWcoIiVzOiBVU19FVSBncGlvIHByZXNlbnQsZmxpcCBzd2l0Y2hcbiIKLQkJCQkJCSwgX19mdW5jX18pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAob3V0cHV0X212ID4gV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NVikgewotCQkJcHJfZGVidWcoIiVzOiBjYWJsZSBpcyBleHRlbnNpb24gY2FibGVcbiIsIF9fZnVuY19fKTsKLQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOwotCQkJd3JrX2NvbXBsZXRlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogY2FibGUgbWlnaHQgYmUgaGVhZHNldDogJWRcbiIsIF9fZnVuY19fLAotCQkJCSBwbHVnX3R5cGUpOwotCQkJaWYgKHBsdWdfdHlwZSAhPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApIHsKLQkJCQlwbHVnX3R5cGUgPSB3Y2RfbWJoY19nZXRfcGx1Z19mcm9tX2FkYygKLQkJCQkJCW91dHB1dF9tdik7Ci0JCQkJaWYgKCFzcGxfaHNfcmVwb3J0ZWQgJiYKLQkJCQkgICAgc3BsX2hzX2NvdW50ID09IFdDRF9NQkhDX1NQTF9IU19DTlQpIHsKLQkJCQkJc3BsX2hzX3JlcG9ydGVkID0gdHJ1ZTsKLQkJCQkJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JCQkJCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsCi0JCQkJCQkJCSAgICBwbHVnX3R5cGUpOwotCQkJCQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKHNwbF9oc19yZXBvcnRlZCkKLQkJCQkJY29udGludWU7Ci0JCQkJLyoKLQkJCQkgKiBSZXBvcnQgaGVhZHNldCBvbmx5IGlmIG5vdCBhbHJlYWR5IHJlcG9ydGVkCi0JCQkJICogYW5kIGlmIHRoZXJlIGlzIG5vdCBidXR0b24gcHJlc3Mgd2l0aG91dAotCQkJCSAqIHJlbGVhc2UKLQkJCQkgKi8KLQkJCQlpZiAoKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPQotCQkJCSAgICAgIE1CSENfUExVR19UWVBFX0hFQURTRVQpICYmCi0JCQkJICAgICAobWJoYy0+Y3VycmVudF9wbHVnICE9Ci0JCQkJICAgICBNQkhDX1BMVUdfVFlQRV9BTkNfSEVBRFBIT05FKSAmJgotCQkJCSAgICAhd2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7Ci0JCQkJCXByX2RlYnVnKCIlczogY2FibGUgaXMgJXMgaGVhZHNldFxuIiwKLQkJCQkJCSBfX2Z1bmNfXywKLQkJCQkJCSgoc3BsX2hzX2NvdW50ID09Ci0JCQkJCQkJV0NEX01CSENfU1BMX0hTX0NOVCkgPwotCQkJCQkJCSJzcGVjaWFsICI6IiIpKTsKLQkJCQkJZ290byByZXBvcnQ7Ci0JCQkJfQotCQkJfQotCQkJd3JrX2NvbXBsZXRlID0gZmFsc2U7Ci0JCX0KLQl9Ci0JaWYgKCF3cmtfY29tcGxldGUpIHsKLQkJLyoKLQkJICogSWYgcGx1Z190eWUgaXMgaGVhZHNldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IHJlcG9ydGVkIGVpdGhlcgotCQkgKiBpbiBkZXRlY3RfcGx1Zy10eXBlIG9yIGluIGFib3ZlIHdoaWxlIGxvb3AsIG5vIG5lZWQgdG8gcmVwb3J0Ci0JCSAqIGFnYWluCi0JCSAqLwotCQlpZiAoKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSB8fAotCQkgICAgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9BTkNfSEVBRFBIT05FKSkgewotCQkJcHJfZGVidWcoIiVzOiBwbHVnX3R5cGU6MHgleCBhbHJlYWR5IHJlcG9ydGVkXG4iLAotCQkJCSBfX2Z1bmNfXywgbWJoYy0+Y3VycmVudF9wbHVnKTsKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BRENfTU9ERSwgMCk7Ci0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCAwKTsKLQkJCWdvdG8gZW5hYmxlX3N1cHBseTsKLQkJfQotCX0KLQlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hJR0hfSFBIKSB7Ci0JCWlmICh3Y2RfaXNfc3BlY2lhbF9oZWFkc2V0KG1iaGMpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFNwZWNpYWwgaGVhZHNldCBmb3VuZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHBsdWdfdHlwZSk7Ci0JCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOwotCQl9IGVsc2UgewotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX0lTUkNfRU4sIDEpOwotCQl9Ci0JfQotCi1yZXBvcnQ6Ci0JaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgewotCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCXByX2RlYnVnKCIlczogVmFsaWQgcGx1ZyBmb3VuZCwgcGx1ZyB0eXBlICVkIHdya19jbXB0ICVkIGJ0bl9pbnRyICVkXG4iLAotCQkJX19mdW5jX18sIHBsdWdfdHlwZSwgd3JrX2NvbXBsZXRlLAotCQkJbWJoYy0+YnRuX3ByZXNzX2ludHIpOwotCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0FEQ19NT0RFLCAwKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX0VOLCAwKTsKLQotCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsIHBsdWdfdHlwZSk7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLWVuYWJsZV9zdXBwbHk6Ci0JLyoKLQkgKiBTZXQgREVURUNUSU9OX0RPTkUgYml0IGZvciBIRUFEU0VUIGFuZCBBTkNfSEVBRFBIT05FLAotCSAqIHNvIHRoYXQgYnRuIHByZXNzL3JlbGVhc2UgaW50ZXJydXB0IGNhbiBiZSBnZW5lcmF0ZWQuCi0JICogRm9yIG90aGVyIHBsdWcgdHlwZSwgY2xlYXIgdGhlIGJpdC4KLQkgKi8KLQlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURTRVQgfHwKLQkgICAgcGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkUpCi0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19ERVRFQ1RJT05fRE9ORSwgMSk7Ci0JZWxzZQotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfREVURUNUSU9OX0RPTkUsIDApOwotCi0JaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQotCQl3Y2RfbWJoY19hZGNfdXBkYXRlX2ZzbV9zb3VyY2UobWJoYywgcGx1Z190eXBlKTsKLWV4aXQ6Ci0JaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sICYmCi0JICAgICFtYmhjLT5taWNiaWFzX2VuYWJsZSkKLQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2woY29kZWMsIE1JQ19CSUFTXzIsCi0JCQkJCQkgICAgTUlDQl9ESVNBQkxFKTsKLQotCS8qCi0JICogSWYgcGx1ZyB0eXBlIGlzIGNvcnJlY3RlZCBmcm9tIHNwZWNpYWwgaGVhZHNldCB0byBoZWFkcGhvbmUsCi0JICogY2xlYXIgdGhlIG1pY2JpYXMgZW5hYmxlIGZsYWcsIHNldCBtaWNiaWFzIGJhY2sgdG8gMS44ViBhbmQKLQkgKiBkaXNhYmxlIG1pY2JpYXMuCi0JICovCi0JaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUgJiYKLQkgICAgbWJoYy0+bWljYmlhc19lbmFibGUpIHsKLQkJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQotCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2woCi0JCQkJCWNvZGVjLCBNSUNfQklBU18yLAotCQkJCQlNSUNCX0RJU0FCTEUpOwotCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykKLQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMoCi0JCQkJCWNvZGVjLAotCQkJCQlNSUNfQklBU18yLCBmYWxzZSk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSkgewotCQkJbWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUoY29kZWMpOwotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01JQ0JfQ1RSTCwgMCk7Ci0JCX0KLQkJbWJoYy0+bWljYmlhc19lbmFibGUgPSBmYWxzZTsKLQl9Ci0KLQlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlICYmCi0JICAgICgocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSkgfHwKLQkgICAgIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkpICYmCi0JICAgICFtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7Ci0JCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX1JFTSwgdHJ1ZSk7Ci0JCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgQURDIENPTVBMRVRFIGludGVycnVwdCBmb3IgSEVBRFBIT05FLgotCSAqIEJ0biByZWxlYXNlIG1heSBoYXBwZW4gYWZ0ZXIgdGhlIGNvcnJlY3Qgd29yaywgQURDIENPTVBMRVRFCi0JICogaW50ZXJydXB0IG5lZWRzIHRvIGJlIGNhcHR1cmVkIHRvIGNvcnJlY3QgcGx1ZyB0eXBlLgotCSAqLwotCWlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSB7Ci0JCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywKLQkJCQkgICAgIHRydWUpOwotCQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOwotCX0KLQotCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcHVsbF9kb3duX2N0cmwpCi0JCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybChjb2RlYywgdHJ1ZSk7Ci0KLQltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIGZhbHNlKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19hZGNfaHNfcmVtX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYyA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCBhZGNfdGhyZXNob2xkLCBvdXRwdXRfbXYsIHJldHJ5ID0gMDsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsKLQkJICBtc2Vjc190b19qaWZmaWVzKFdDRF9GQUtFX1JFTU9WQUxfTUlOX1BFUklPRF9NUyk7Ci0JYWRjX3RocmVzaG9sZCA9ICgoV0NEX01CSENfQURDX0hTX1RIUkVTSE9MRF9NViAqCi0JCQkgIHdjZF9tYmhjX2dldF9taWNiaWFzKG1iaGMpKSAvCi0JCQkgIFdDRF9NQkhDX0FEQ19NSUNCSUFTX01WKTsKLQlkbyB7Ci0JCXJldHJ5Kys7Ci0JCS8qCi0JCSAqIHJlYWQgb3V0cHV0X212IGV2ZXJ5IDEwbXMgdG8gbG9vayBmb3IKLQkJICogYW55IGNoYW5nZSBpbiBJTjJfUAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7Ci0JCW91dHB1dF9tdiA9IHdjZF9tZWFzdXJlX2FkY19vbmNlKG1iaGMsIE1VWF9DVExfSU4yUCk7Ci0KLQkJcHJfZGVidWcoIiVzOiBDaGVjayBmb3IgZmFrZSByZW1vdmFsOiBvdXRwdXRfbXYgJWRcbiIsCi0JCQkgX19mdW5jX18sIG91dHB1dF9tdik7Ci0JCWlmICgob3V0cHV0X212IDw9IGFkY190aHJlc2hvbGQpICYmCi0JCSAgICByZXRyeSA+IEZBS0VfUkVNX1JFVFJZX0FUVEVNUFRTKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGhlYWRzZXQgaXMgTk9UIGFjdHVhbGx5IHJlbW92ZWRcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKLQotCWlmICh3Y2Rfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKLQkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggbGV2ZWwgaXMgbG93ICIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qCi0JICogQURDIENPTVBMRVRFIGFuZCBFTEVDX1JFTSBpbnRlcnJ1cHRzIGFyZSBib3RoIGVuYWJsZWQgZm9yIEhFQURQSE9ORSwKLQkgKiBuZWVkIHRvIHJlamVjdCB0aGUgQURDIENPTVBMRVRFIGludGVycnVwdCB3aGljaCBmb2xsb3dzIEVMRUNfUkVNIG9uZQotCSAqIHdoZW4gSEVBRFBIT05FIGlzIHJlbW92ZWQuCi0JICovCi0JaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpCi0JCW1iaGMtPmV4dG5fY2FibGVfaHBoX3JlbSA9IHRydWU7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0RFVEVDVElPTl9ET05FLCAwKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQURDX01PREUsIDApOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BRENfRU4sIDApOwotCXdjZF9tYmhjX2VsZWNfaHNfcmVwb3J0X3VucGx1ZyhtYmhjKTsKLWV4aXQ6Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfYWRjX2hzX2luc19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCi0JLyoKLQkgKiBBREMgQ09NUExFVEUgYW5kIEVMRUNfUkVNIGludGVycnVwdHMgYXJlIGJvdGggZW5hYmxlZCBmb3IgSEVBRFBIT05FLAotCSAqIG5lZWQgdG8gcmVqZWN0IHRoZSBBREMgQ09NUExFVEUgaW50ZXJydXB0IHdoaWNoIGZvbGxvd3MgRUxFQ19SRU0gb25lCi0JICogd2hlbiBIRUFEUEhPTkUgaXMgcmVtb3ZlZC4KLQkgKi8KLQlpZiAobWJoYy0+ZXh0bl9jYWJsZV9ocGhfcmVtID09IHRydWUpIHsKLQkJbWJoYy0+ZXh0bl9jYWJsZV9ocGhfcmVtID0gZmFsc2U7Ci0JCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCS8qCi0JICogSWYgY3VycmVudCBwbHVnIGlzIGhlYWRwaG9uZSB0aGVuIHRoZXJlIGlzIG5vIGNoYW5jZSB0bwotCSAqIGdldCBBREMgY29tcGxldGUgaW50ZXJydXB0LCBzbyBjb25uZWN0ZWQgY2FibGUgc2hvdWxkIGJlCi0JICogaGVhZHNldCBub3QgaGVhZHBob25lLgotCSAqLwotCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSB7Ci0JCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsIFdDRF9NQkhDX0VMRUNfSFNfSU5TLCBmYWxzZSk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19ERVRFQ1RJT05fRE9ORSwgMSk7Ci0JCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsIE1CSENfUExVR19UWVBFX0hFQURTRVQpOwotCQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKCFtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXR1cm5pbmcgYXMgRXh0ZW5zaW9uIGNhYmxlIGZlYXR1cmUgbm90IGVuYWJsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IERpc2FibGUgZWxlY3RyaWNhbCBoZWFkc2V0IGluc2VydGlvbiBpbnRlcnJ1cHRcbiIsCi0JCSBfX2Z1bmNfXyk7Ci0Jd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19JTlMsIGZhbHNlKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywgMCk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX0lTUkNfRU4sIDApOwotCW1iaGMtPmlzX2V4dG5fY2FibGUgPSB0cnVlOwotCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7Ci0Jd2NkX21iaGNfYWRjX2RldGVjdF9wbHVnX3R5cGUobWJoYyk7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IHdjZF9tYmhjX2ZuIG1iaGNfZm4gPSB7Ci0JLndjZF9tYmhjX2hzX2luc19pcnEgPSB3Y2RfbWJoY19hZGNfaHNfaW5zX2lycSwKLQkud2NkX21iaGNfaHNfcmVtX2lycSA9IHdjZF9tYmhjX2FkY19oc19yZW1faXJxLAotCS53Y2RfbWJoY19kZXRlY3RfcGx1Z190eXBlID0gd2NkX21iaGNfYWRjX2RldGVjdF9wbHVnX3R5cGUsCi0JLndjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlID0gd2NkX21iaGNfYWRjX2RldGVjdF9hbmNfcGx1Z190eXBlLAotCS53Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnID0gd2NkX2NhbmNlbF9oc19kZXRlY3RfcGx1ZywKLX07Ci0KLS8qIEZ1bmN0aW9uOiB3Y2RfbWJoY19hZGNfaW5pdAotICogQG1iaGM6IE1CSEMgZnVuY3Rpb24gcG9pbnRlcgotICogRGVzY3JpcHRpb246IEluaXRpYWxpemUgTUJIQyBBREMgcmVsYXRlZCBmdW5jdGlvbiBwb2ludGVycyB0byBNQkhDIHN0cnVjdHVyZQotICovCi12b2lkIHdjZF9tYmhjX2FkY19pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlpZiAoIW1iaGMpIHsKLQkJcHJfZXJyKCIlczogbWJoYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JbWJoYy0+bWJoY19mbiA9ICZtYmhjX2ZuOwotCUlOSVRfV09SSygmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gsIHdjZF9jb3JyZWN0X3N3Y2hfcGx1Zyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9tYmhjX2FkY19pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtYWRjLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLWFkYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTE2MTA4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtYWRjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX19XQ0RfTUJIQ19BRENfSF9fCi0jZGVmaW5lIF9fV0NEX01CSENfQURDX0hfXwotCi0jaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKLQotZW51bSB3Y2RfbWJoY19hZGNfbXV4X2N0bCB7Ci0JTVVYX0NUTF9BVVRPID0gMCwKLQlNVVhfQ1RMX0lOMlAsCi0JTVVYX0NUTF9JTjNQLAotCU1VWF9DVExfSU40UCwKLQlNVVhfQ1RMX0hQSF9MLAotCU1VWF9DVExfSFBIX1IsCi0JTVVYX0NUTF9OT05FLAotfTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TT0NfV0NEX01CSENfQURDKQotdm9pZCB3Y2RfbWJoY19hZGNfaW5pdChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCB3Y2RfbWJoY19hZGNfaW5pdChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0KLX0KLSNlbmRpZgotI2VuZGlmIC8qIF9fV0NEX01CSENfQURDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy1sZWdhY3kuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtbGVnYWN5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWUyZTguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy1sZWdhY3kuYworKysgL2Rldi9udWxsCkBAIC0xLDk3NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlICJ3Y2QtbWJoYy1sZWdhY3kuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy12Mi5oIgotCi1zdGF0aWMgaW50IGRldF9leHRuX2NhYmxlX2VuOwotbW9kdWxlX3BhcmFtKGRldF9leHRuX2NhYmxlX2VuLCBpbnQsIDA2NjQpOwotTU9EVUxFX1BBUk1fREVTQyhkZXRfZXh0bl9jYWJsZV9lbiwgImVuYWJsZS9kaXNhYmxlIGV4dG4gY2FibGUgZGV0ZWN0Iik7Ci0KLXN0YXRpYyBib29sIHdjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlib29sIGFuY19taWNfZm91bmQgPSBmYWxzZTsKLQl1MTYgdmFsLCBoc19jb21wX3JlcywgYnRuX3N0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyByZXRyeSA9IDA7Ci0JaW50IHZhbGlkX3BsdWdfY250ID0gMCwgaW52YWxpZF9wbHVnX2NudCA9IDA7Ci0JaW50IGJ0bl9zdGF0dXNfY250ID0gMDsKLQlib29sIGlzX2NoZWNrX2J0bl9wcmVzcyA9IGZhbHNlOwotCi0KLQlpZiAobWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzIDwgTUlDX0JJQVNfMSB8fAotCSAgICBtYmhjLT5tYmhjX2NmZy0+YW5jX21pY2JpYXMgPiBNSUNfQklBU180KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19GU01fRU4sIHZhbCk7Ci0KLQlpZiAodmFsKQotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQotCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCQkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzLAotCQkJCQkgICAgTUlDQl9FTkFCTEUpOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NVVhfQ1RMLCAweDIpOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BTkNfREVUX0VOLCAxKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAxKTsKLQkvKgotCSAqIHdhaXQgZm9yIGJ1dHRvbiBkZWJvdW5jZSB0aW1lIDIwbXMuIElmIDQtcG9sZSBwbHVnIGlzIGluc2VydGVkCi0JICogaW50byA1LXBvbGUgamFjaywgdGhlbiB0aGVyZSB3aWxsIGJlIGEgYnV0dG9uIHByZXNzIGludGVycnVwdAotCSAqIGR1cmluZyBhbmMgcGx1ZyBkZXRlY3Rpb24uIEluIHRoYXQgY2FzZSB0aG91Z2ggSHNfY29tcF9yZXMgaXMgMCwKLQkgKiBpdCBzaG91bGQgbm90IGJlIGRlY2xhcmVkIGFzIEFOQyBwbHVnIHR5cGUKLQkgKi8KLQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQotCS8qCi0JICogQWZ0ZXIgZW5hYmxpbmcgRlNNLCB0byBoYW5kbGUgc2xvdyBpbnNlcnRpb24gc2NlbmFyaW9zLAotCSAqIGNoZWNrIGhzX2NvbXBfcmVzdWx0IGZvciBmZXcgdGltZXMgdG8gc2VlIGlmIHRoZSBJTjMgdm9sdGFnZQotCSAqIGlzIGJlbG93IHRoZSBWcmVmCi0JICovCi0JZG8gewotCQlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3dcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IFJldHJ5IGF0dGVtcHQgJWx1XG4iLCBfX2Z1bmNfXywgcmV0cnkgKyAxKTsKLQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFNfQ09NUF9SRVNVTFQsIGhzX2NvbXBfcmVzKTsKLQotCQlpZiAoIWhzX2NvbXBfcmVzKSB7Ci0JCQl2YWxpZF9wbHVnX2NudCsrOwotCQkJaXNfY2hlY2tfYnRuX3ByZXNzID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlpbnZhbGlkX3BsdWdfY250Kys7Ci0JCS8qIFdhaXQgMW1zIGJlZm9yZSB0YWtpbmcgYW5vdGhlciByZWFkaW5nICovCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19GU01fU1RBVFVTLCBidG5fc3RhdHVzKTsKLQkJaWYgKGJ0bl9zdGF0dXMpCi0JCQlidG5fc3RhdHVzX2NudCsrOwotCi0JCXJldHJ5Kys7Ci0JfSB3aGlsZSAocmV0cnkgPCBBTkNfREVURUNUX1JFVFJZX0NOVCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHZhbGlkOiAlZCwgaW52YWxpZDogJWQsIGJ0bl9zdGF0dXNfY250OiAlZFxuIiwKLQkJIF9fZnVuY19fLCB2YWxpZF9wbHVnX2NudCwgaW52YWxpZF9wbHVnX2NudCwgYnRuX3N0YXR1c19jbnQpOwotCi0JLyogZGVjaXNpb24gbG9naWMgKi8KLQlpZiAoKHZhbGlkX3BsdWdfY250ID4gaW52YWxpZF9wbHVnX2NudCkgJiYgaXNfY2hlY2tfYnRuX3ByZXNzICYmCi0JICAgIChidG5fc3RhdHVzX2NudCA9PSAwKSkKLQkJYW5jX21pY19mb3VuZCA9IHRydWU7Ci1leGl0OgotCWlmICghdmFsKQotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19BTkNfREVUX0VOLCAwKTsKLQotCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCQkgICAgbWJoYy0+bWJoY19jZmctPmFuY19taWNiaWFzLAotCQkJCQkgICAgTUlDQl9ESVNBQkxFKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTVVYX0NUTCwgMHgwKTsKLQlwcl9kZWJ1ZygiJXM6IGFuYyBtaWMgJXNmb3VuZFxuIiwgX19mdW5jX18sCi0JCSBhbmNfbWljX2ZvdW5kID8gIiIgOiAibm90ICIpOwotCXJldHVybiBhbmNfbWljX2ZvdW5kOwotfQotCi0vKiBUbyBkZXRlcm1pbmUgaWYgY3Jvc3MgY29ubmVjdGlvbiBvY2N1cnJlZCAqLwotc3RhdGljIGludCB3Y2RfY2hlY2tfY3Jvc3NfY29ubihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JdTE2IHN3YXBfcmVzID0gMDsKLQllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9OT05FOwotCXMxNiByZWcxID0gMDsKLQlib29sIGhwaGxfc2NoX3JlcyA9IDAsIGhwaHJfc2NoX3JlcyA9IDA7Ci0KLQlpZiAod2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKG1iaGMpKSB7Ci0JCXByX2RlYnVnKCIlczogU3dpdGNoIGxldmVsIGlzIGxvd1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBJZiBQQSBpcyBlbmFibGVkLCBkb250IGNoZWNrIGZvciBjcm9zcy1jb25uZWN0aW9uICovCi0JaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wYV9vbl9zdGF0dXMpCi0JCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKG1iaGMtPmNvZGVjKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIHJlZzEpOwotCS8qCi0JICogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGNyb3NzIGNvbm5lY3Rpb24sCi0JICogTWljYmlhcyBhbmQgc2NobWl0dCB0cmlnZ2VyIChIUEhMLUhQSFIpCi0JICogbmVlZHMgdG8gYmUgZW5hYmxlZC4gRm9yIHNvbWUgY29kZWNzIGxpa2Ugd2NkOTMzNSwKLQkgKiBwdWxsLXVwIHdpbGwgYWxyZWFkeSBiZSBlbmFibGVkIHdoZW4gdGhpcyBmdW5jdGlvbgotCSAqIGlzIGNhbGxlZCBmb3IgY3Jvc3MtY29ubmVjdGlvbiBpZGVudGlmaWNhdGlvbi4gTm8KLQkgKiBuZWVkIHRvIGVuYWJsZSBtaWNiaWFzIGluIHRoYXQgY2FzZS4KLQkgKi8KLQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIDIpOwotCi0JV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRUxFQ1RfUkVTVUxULCBzd2FwX3Jlcyk7Ci0JcHJfZGVidWcoIiVzOiBzd2FwX3JlcyV4XG4iLCBfX2Z1bmNfXywgc3dhcF9yZXMpOwotCi0JLyoKLQkgKiBSZWFkIHJlZyBocGhsIGFuZCBocGhyIHNjaG1pdHQgcmVzdWx0IHdpdGggY3Jvc3MgY29ubmVjdGlvbgotCSAqIGJpdC4gVGhlc2UgYml0cyB3aWxsIGJvdGggYmUgIjAiIGluIGNhc2Ugb2YgY3Jvc3MgY29ubmVjdGlvbgotCSAqIG90aGVyd2lzZSwgdGhleSBzdGF5IGF0IDEKLQkgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2hfcmVzKTsKLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhSX1NDSE1UX1JFU1VMVCwgaHBocl9zY2hfcmVzKTsKLQlpZiAoIShocGhsX3NjaF9yZXMgfHwgaHBocl9zY2hfcmVzKSkgewotCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7Ci0JCXByX2RlYnVnKCIlczogQ3Jvc3MgY29ubmVjdGlvbiBpZGVudGlmaWVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBObyBDcm9zcyBjb25uZWN0aW9uIGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JLyogRGlzYWJsZSBzY2htaXR0IHRyaWdnZXIgYW5kIHJlc3RvcmUgbWljYmlhcyAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCByZWcxKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlLCBwbHVnIHR5cGU6ICVkXG4iLCBfX2Z1bmNfXywgIHBsdWdfdHlwZSk7Ci0KLQlyZXR1cm4gKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCB3Y2RfaXNfc3BlY2lhbF9oZWFkc2V0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlpbnQgZGVsYXkgPSAwLCByYzsKLQlib29sIHJldCA9IGZhbHNlOwotCXUxNiBoc19jb21wX3JlczsKLQlib29sIGlzX3NwbF9ocyA9IGZhbHNlOwotCi0JLyoKLQkgKiBJbmNyZWFzZSBtaWNiaWFzIHRvIDIuN1YgdG8gZGV0ZWN0IGhlYWRzZXRzIHdpdGgKLQkgKiB0aHJlc2hvbGQgb24gbWljcm9waG9uZQotCSAqLwotCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCAmJgotCSAgICAhbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykgewotCQlwcl9kZWJ1ZygiJXM6IGNhbGxiYWNrIGZuIG1pY2JfY3RybF90aHJfbWljIG5vdCBkZWZpbmVkXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYykgewotCQlyYyA9IG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMoY29kZWMsCi0JCQkJCQkJTUlDX0JJQVNfMiwgdHJ1ZSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogTWljYmlhcyBjb250cm9sIGZvciB0aHIgbWljIGZhaWxlZCwgcmM6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNwZWNpYWwgaGVhZHNldCwgc3RhcnQgcmVnaXN0ZXIgd3JpdGVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXMpOwotCXdoaWxlICghaXNfc3BsX2hzKSAgewotCQlpZiAobWJoYy0+aHNfZGV0ZWN0X3dvcmtfc3RvcCkgewotCQkJcHJfZGVidWcoIiVzOiBzdG9wIHJlcXVlc3RlZDogJWRcbiIsIF9fZnVuY19fLAotCQkJCQltYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlbGF5ID0gZGVsYXkgKyA1MDsKLQkJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybCkgewotCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAotCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1BSRUNIQVJHRSwKLQkJCQkJdHJ1ZSk7Ci0JCQltYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwoY29kZWMsCi0JCQkJCU1CSENfQ09NTU9OX01JQ0JfU0VUX1ZBTCwKLQkJCQkJdHJ1ZSk7Ci0JCX0KLQkJLyogV2FpdCBmb3IgNTBtc2VjIGZvciBNSUNCSUFTIHRvIHNldHRsZSBkb3duICovCi0JCW1zbGVlcCg1MCk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfYXV0b196ZXJvaW5nKQotCQkJbWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZyhjb2RlYywgdHJ1ZSk7Ci0JCS8qIFdhaXQgZm9yIDUwbXNlYyBmb3IgRlNNIHRvIHVwZGF0ZSByZXN1bHQgdmFsdWVzICovCi0JCW1zbGVlcCg1MCk7Ci0JCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7Ci0JCWlmICghKGhzX2NvbXBfcmVzKSkgewotCQkJcHJfZGVidWcoIiVzOiBTcGVjaWFsIGhlYWRzZXQgZGV0ZWN0ZWQgaW4gJWQgbXNlY3NcbiIsCi0JCQkJCV9fZnVuY19fLCAoZGVsYXkgKiAyKSk7Ci0JCQlpc19zcGxfaHMgPSB0cnVlOwotCQl9Ci0JCWlmIChkZWxheSA9PSBTUEVDSUFMX0hTX0RFVEVDVF9USU1FX01TKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFNwbCBoZWFkc2V0IGRpZG4ndCBnZXQgZGV0ZWN0IGluIDQgc2VjXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoaXNfc3BsX2hzKSB7Ci0JCXByX2RlYnVnKCIlczogSGVhZHNldCB3aXRoIHRocmVzaG9sZCBmb3VuZFxuIiwgIF9fZnVuY19fKTsKLQkJbWJoYy0+bWljYmlhc19lbmFibGUgPSB0cnVlOwotCQlyZXQgPSB0cnVlOwotCX0KLQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKQotCQltYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwoY29kZWMsCi0JCQkJTUJIQ19DT01NT05fTUlDQl9QUkVDSEFSR0UsCi0JCQkJZmFsc2UpOwotCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSAmJiAhbWJoYy0+bWljYmlhc19lbmFibGUpCi0JCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKGNvZGVjKTsKLQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZykKLQkJbWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZyhjb2RlYywgZmFsc2UpOwotCi0JaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMgJiYKLQkgICAgIW1iaGMtPm1pY2JpYXNfZW5hYmxlKQotCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKGNvZGVjLCBNSUNfQklBU18yLAotCQkJCQkJICAgICAgZmFsc2UpOwotCi0JcHJfZGVidWcoIiVzOiBsZWF2ZSwgbWljYl9lbmFibGU6ICVkXG4iLCBfX2Z1bmNfXywKLQkJICBtYmhjLT5taWNiaWFzX2VuYWJsZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX21iaGNfdXBkYXRlX2ZzbV9zb3VyY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCSAgICAgICBlbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCi17Ci0JYm9vbCBtaWNiaWFzMjsKLQotCW1pY2JpYXMyID0gbWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKG1iaGMsCi0JCQkJCQkJTUlDX0JJQVNfMik7Ci0Jc3dpdGNoIChwbHVnX3R5cGUpIHsKLQljYXNlIE1CSENfUExVR19UWVBFX0hFQURQSE9ORToKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMyk7Ci0JCWJyZWFrOwotCWNhc2UgTUJIQ19QTFVHX1RZUEVfSEVBRFNFVDoKLQljYXNlIE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkU6Ci0JCWlmICghbWJoYy0+aXNfaHNfcmVjb3JkaW5nICYmICFtaWNiaWFzMikKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAwKTsKLQkJYnJlYWs7Ci0KLQl9OwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfZW5hYmxlX21iaGNfc3VwcGx5KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCWVudW0gd2NkX21iaGNfcGx1Z190eXBlIHBsdWdfdHlwZSkKLXsKLQotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCi0JLyoKLQkgKiBEbyBub3QgZGlzYWJsZSBtaWNiaWFzIGlmIHJlY29yZGluZyBpcyBnb2luZyBvbiBvcgotCSAqIGhlYWRzZXQgaXMgaW5zZXJ0ZWQgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGV4dG4KLQkgKiBjYWJsZS4gSWYgaGVhZHNldCBoYXMgYmVlbiBkZXRlY3RlZCBjdXJyZW50IHNvdXJjZQotCSAqIG5lZWRzIHRvIGJlIGtlcHQgZW5hYmxlZCBmb3IgYnV0dG9uIGRldGVjdGlvbiB0byB3b3JrLgotCSAqIElmIHRoZSBhY2Nlc3NvcnkgdHlwZSBpcyBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkLCB3ZQotCSAqIGRvbnQgbmVlZCB0byBlbmFibGUgZWl0aGVyIG9mIHRoZW0uCi0JICovCi0JaWYgKGRldF9leHRuX2NhYmxlX2VuICYmIG1iaGMtPmlzX2V4dG5fY2FibGUgJiYKLQkJbWJoYy0+bWJoY19jYiAmJiBtYmhjLT5tYmhjX2NiLT5leHRuX3VzZV9tYiAmJgotCQltYmhjLT5tYmhjX2NiLT5leHRuX3VzZV9tYihjb2RlYykpIHsKLQkJaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUgfHwKLQkJICAgIHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKQotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTUIpOwotCX0gZWxzZSB7Ci0JCWlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkgewotCQkJaWYgKG1iaGMtPmlzX2hzX3JlY29yZGluZyB8fCBtYmhjLT5taWNiaWFzX2VuYWJsZSkgewotCQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKLQkJCX0gZWxzZSBpZiAoKHRlc3RfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSEwsCi0JCQkJCSAgICAgJm1iaGMtPmV2ZW50X3N0YXRlKSkgfHwKLQkJCQkgICAodGVzdF9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBIUiwKLQkJCQkJICAgICAmbWJoYy0+ZXZlbnRfc3RhdGUpKSkgewotCQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsCi0JCQkJCQlXQ0RfTUJIQ19FTl9QVUxMVVApOwotCQkJfSBlbHNlIHsKLQkJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9DUyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSkgewotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fQ1MpOwotCQl9IGVsc2UgewotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTk9ORSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBib29sIHdjZF9tYmhjX2NoZWNrX2Zvcl9zcGxfaGVhZHNldChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJCSAgIGludCAqc3BsX2hzX2NudCkKLXsKLQl1MTYgaHNfY29tcF9yZXNfMV84diA9IDAsIGhzX2NvbXBfcmVzXzJfN3YgPSAwOwotCWJvb2wgc3BsX2hzID0gZmFsc2U7Ci0KLQlpZiAoIW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMpCi0JCWdvdG8gZG9uZTsKLQotCWlmICghc3BsX2hzX2NudCkgewotCQlwcl9lcnIoIiVzOiBzcGxfaHNfY250IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQkvKiBSZWFkIGJhY2sgaHNfY29tcF9yZXMgQCAxLjh2IE1pY2JpYXMgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXNfMV84dik7Ci0JaWYgKCFoc19jb21wX3Jlc18xXzh2KSB7Ci0JCXNwbF9ocyA9IGZhbHNlOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQnVtcCB1cCBNQjIgdG8gMi43diAqLwotCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCi0JCQkJbWJoYy0+bWJoY19jZmctPm1iaGNfbWljYmlhcywgdHJ1ZSk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0JdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDEwMCk7Ci0KLQkvKiBSZWFkIGJhY2sgSFNfQ09NUF9SRVNVTFQgKi8KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXNfMl83dik7Ci0JaWYgKCFoc19jb21wX3Jlc18yXzd2ICYmIGhzX2NvbXBfcmVzXzFfOHYpCi0JCXNwbF9ocyA9IHRydWU7Ci0KLQlpZiAoc3BsX2hzKQotCQkqc3BsX2hzX2NudCArPSAxOwotCi0JLyogTUIyIGJhY2sgdG8gMS44diAqLwotCWlmICgqc3BsX2hzX2NudCAhPSBXQ0RfTUJIQ19TUExfSFNfQ05UKSB7Ci0JCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMobWJoYy0+Y29kZWMsCi0JCQkJbWJoYy0+bWJoY19jZmctPm1iaGNfbWljYmlhcywgZmFsc2UpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0JCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOwotCX0KLQotCWlmIChzcGxfaHMpCi0JCXByX2RlYnVnKCIlczogRGV0ZWN0ZWQgc3BlY2lhbCBIUyAoJWQpXG4iLCBfX2Z1bmNfXywgc3BsX2hzKTsKLQotZG9uZToKLQlyZXR1cm4gc3BsX2hzOwotfQotCi0vKiBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIGludGVycnVwdCBjb250ZXh0IHRoYXQgaG9sZCBzdXNwZW5kICovCi1zdGF0aWMgdm9pZCB3Y2Rfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQkgICAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXByX2RlYnVnKCIlczogc2NoZWR1bGluZyBjb3JyZWN0X3N3Y2hfcGx1Z1xuIiwgX19mdW5jX18pOwotCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOwotCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSBmYWxzZTsKLQltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIHRydWUpOwotCXNjaGVkdWxlX3dvcmsod29yayk7Ci19Ci0KLS8qIGNhbGxlZCB1bmRlciBjb2RlY19yZXNvdXJjZV9sb2NrIGFjcXVpc2l0aW9uICovCi1zdGF0aWMgdm9pZCB3Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQkJIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlwcl9kZWJ1ZygiJXM6IENhbmNlbGluZyBjb3JyZWN0X3BsdWdfc3djaFxuIiwgX19mdW5jX18pOwotCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3AgPSB0cnVlOwotCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JaWYgKGNhbmNlbF93b3JrX3N5bmMod29yaykpIHsKLQkJcHJfZGVidWcoIiVzOiBjb3JyZWN0X3BsdWdfc3djaCBpcyBjYW5jZWxlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOwotCX0KLQlXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKTsKLX0KLQotLyogY2FsbGVkIHVuZGVyIGNvZGVjX3Jlc291cmNlX2xvY2sgYWNxdWlzaXRpb24gKi8KLXN0YXRpYyB2b2lkIHdjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCWJvb2wgbWljYmlhczEgPSBmYWxzZTsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKLQotCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcHVsbF9kb3duX2N0cmwpCi0JCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybChjb2RlYywgZmFsc2UpOwotCi0JaWYgKG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cykKLQkJbWljYmlhczEgPSBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMobWJoYywKLQkJCQkJCQkJTUlDX0JJQVNfMSk7Ci0KLQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQotCQltYmhjLT5tYmhjX2NiLT5zZXRfY2FwX21vZGUoY29kZWMsIG1pY2JpYXMxLCB0cnVlKTsKLQotCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKLQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2woY29kZWMsIE1JQ19CSUFTXzIsCi0JCQkJCQkgICAgTUlDQl9FTkFCTEUpOwotCWVsc2UKLQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTUIpOwotCi0JLyogUmUtaW5pdGlhbGl6ZSBidXR0b24gcHJlc3MgY29tcGxldGlvbiBvYmplY3QgKi8KLQlyZWluaXRfY29tcGxldGlvbigmbWJoYy0+YnRuX3ByZXNzX2NvbXBsKTsKLQl3Y2Rfc2NoZWR1bGVfaHNfZGV0ZWN0X3BsdWcobWJoYywgJm1iaGMtPmNvcnJlY3RfcGx1Z19zd2NoKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jb3JyZWN0X3N3Y2hfcGx1ZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQllbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9JTlZBTElEOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1MTYgaHNfY29tcF9yZXMgPSAwLCBocGhsX3NjaCA9IDAsIG1pY19zY2ggPSAwLCBidG5fcmVzdWx0ID0gMDsKLQlib29sIHdya19jb21wbGV0ZSA9IGZhbHNlOwotCWludCBwdF9nbmRfbWljX3N3YXBfY250ID0gMDsKLQlpbnQgbm9fZ25kX21pY19zd2FwX2NudCA9IDA7Ci0JYm9vbCBpc19wYV9vbiA9IGZhbHNlLCBzcGxfaHMgPSBmYWxzZSwgc3BsX2hzX3JlcG9ydGVkID0gZmFsc2U7Ci0JYm9vbCBtaWNiaWFzMiA9IGZhbHNlOwotCWJvb2wgbWljYmlhczEgPSBmYWxzZTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgcmMsIHNwbF9oc19jb3VudCA9IDA7Ci0JaW50IGNyb3NzX2Nvbm47Ci0JaW50IHRyeSA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQltYmhjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgY29ycmVjdF9wbHVnX3N3Y2gpOwotCWNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQkvKgotCSAqIEVuYWJsZSBtaWNiaWFzL3B1bGx1cCBmb3IgZGV0ZWN0aW9uIGluIGNvcnJlY3Qgd29yay4KLQkgKiBUaGlzIHdvcmsgd2lsbCBnZXQgc2NoZWR1bGVkIGZyb20gZGV0ZWN0X3BsdWdfdHlwZSB3aGljaAotCSAqIHdpbGwgYWxyZWFkeSByZXF1ZXN0IGZvciBwdWxsdXAvbWljYmlhcy4gSWYgdGhlIHB1bGx1cC9taWNiaWFzCi0JICogaXMgaGFuZGxlZCB3aXRoIHJlZi1jb3VudHMgYnkgaW5kaXZpZHVhbCBjb2RlYyBkcml2ZXJzLCB0aGVyZSBpcwotCSAqIG5vIG5lZWQgdG8gZW5hYmFsZSBtaWNiaWFzL3B1bGx1cCBoZXJlCi0JICovCi0KLQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0KLQkvKiBFbmFibGUgSFcgRlNNICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0JLyoKLQkgKiBDaGVjayBmb3IgYW55IGJ1dHRvbiBwcmVzcyBpbnRlcnJ1cHRzIGJlZm9yZSBzdGFydGluZyAzLXNlYwotCSAqIGxvb3AuCi0JICovCi0JcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1iaGMtPmJ0bl9wcmVzc19jb21wbCwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoV0NEX01CSENfQlROX1BSRVNTX0NPTVBMX1RJTUVPVVRfTVMpKTsKLQotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0JUTl9SRVNVTFQsIGJ0bl9yZXN1bHQpOwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7Ci0KLQlpZiAoIXJjKSB7Ci0JCXByX2RlYnVnKCIlcyBObyBidG4gcHJlc3MgaW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICghYnRuX3Jlc3VsdCAmJiAhaHNfY29tcF9yZXMpCi0JCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOwotCQllbHNlIGlmICghYnRuX3Jlc3VsdCAmJiBoc19jb21wX3JlcykKLQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOwotCQllbHNlCi0JCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9JTlZBTElEOwotCX0gZWxzZSB7Ci0JCWlmICghYnRuX3Jlc3VsdCAmJiAhaHNfY29tcF9yZXMpCi0JCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU7Ci0JCWVsc2UKLQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0lOVkFMSUQ7Ci0JfQotCi0JZG8gewotCQljcm9zc19jb25uID0gd2NkX2NoZWNrX2Nyb3NzX2Nvbm4obWJoYyk7Ci0JCXRyeSsrOwotCX0gd2hpbGUgKHRyeSA8IEdORF9NSUNfU1dBUF9USFJFU0hPTEQpOwotCi0JLyoKLQkgKiBDaGVjayBmb3IgY3Jvc3MgY29ubmVjdGlvbiA0IHRpbWVzLgotCSAqIENvbnNpZGVyIHRoZSByZXN1bHQgb2YgdGhlIGZvdXJ0aCBpdGVyYXRpb24uCi0JICovCi0JaWYgKGNyb3NzX2Nvbm4gPiAwKSB7Ci0JCXByX2RlYnVnKCIlczogY3Jvc3MgY29uIGZvdW5kLCBzdGFydCBwb2xsaW5nXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQOwotCQlwcl9kZWJ1ZygiJXM6IFBsdWcgZm91bmQsIHBsdWcgdHlwZSBpcyAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcGx1Z190eXBlKTsKLQkJZ290byBjb3JyZWN0X3BsdWdfdHlwZTsKLQl9Ci0KLQlpZiAoKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUIHx8Ci0JICAgICBwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSAmJgotCSAgICAoIXdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkpIHsKLQkJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgPT0gIE1CSENfUExVR19UWVBFX0hJR0hfSFBIKQotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX0RFVEVDVElPTl9UWVBFLAotCQkJCQkJIDApOwotCQl3Y2RfbWJoY19maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLCBwbHVnX3R5cGUpOwotCQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOwotCX0KLQotY29ycmVjdF9wbHVnX3R5cGU6Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSFNfREVURUNUX1BMVUdfVElNRV9NUyk7Ci0Jd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOwotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKLQkJCQkJCVdDRF9NQkhDX0VOX05PTkUpOwotCQkJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlKSB7Ci0JCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKLQkJCQkJbWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsIGZhbHNlKTsKLQkJCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUpCi0JCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAotCQkJCQkJCW1iaGMtPmNvZGVjKTsKLQkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOwotCQkJfQotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmIChtYmhjLT5idG5fcHJlc3NfaW50cikgewotCQkJd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKLQkJCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7Ci0JCX0KLQkJLyogVG9nZ2xlIEZTTSAqLwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMSk7Ci0KLQkJLyogYWxsb3cgc29tZXRpbWUgYW5kIHJlLWNoZWNrIHN0b3AgcmVxdWVzdGVkIGFnYWluICovCi0JCW1zbGVlcCgyMCk7Ci0JCWlmIChtYmhjLT5oc19kZXRlY3Rfd29ya19zdG9wKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHN0b3AgcmVxdWVzdGVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApOwotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywKLQkJCQkJCVdDRF9NQkhDX0VOX05PTkUpOwotCQkJaWYgKG1iaGMtPm1pY2JpYXNfZW5hYmxlKSB7Ci0JCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKLQkJCQkJbWJoYy0+Y29kZWMsIE1JQ19CSUFTXzIsIGZhbHNlKTsKLQkJCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X21pY2JpYXNfdmFsdWUpCi0JCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAotCQkJCQkJCW1iaGMtPmNvZGVjKTsKLQkJCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOwotCQkJfQotCQkJZ290byBleGl0OwotCQl9Ci0JCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlcyk7Ci0KLQkJcHJfZGVidWcoIiVzOiBoc19jb21wX3JlczogJXhcbiIsIF9fZnVuY19fLCBoc19jb21wX3Jlcyk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKQotCQkJaXNfcGFfb24gPSBtYmhjLT5tYmhjX2NiLT5ocGhfcGFfb25fc3RhdHVzKGNvZGVjKTsKLQotCQkvKgotCQkgKiBpbnN0ZWFkIG9mIGhvZ2dpbmcgc3lzdGVtIGJ5IGNvbnRpbmVvdXMgcG9sbGluZywgd2FpdCBmb3IKLQkJICogc29tZXRpbWUgYW5kIHJlLWNoZWNrIHN0b3AgcmVxdWVzdCBhZ2Fpbi4KLQkJICovCi0JCW1zbGVlcCgxODApOwotCQlpZiAoaHNfY29tcF9yZXMgJiYgKHNwbF9oc19jb3VudCA8IFdDRF9NQkhDX1NQTF9IU19DTlQpKSB7Ci0JCQlzcGxfaHMgPSB3Y2RfbWJoY19jaGVja19mb3Jfc3BsX2hlYWRzZXQobWJoYywKLQkJCQkJCQkJJnNwbF9oc19jb3VudCk7Ci0KLQkJCWlmIChzcGxfaHNfY291bnQgPT0gV0NEX01CSENfU1BMX0hTX0NOVCkgewotCQkJCWhzX2NvbXBfcmVzID0gMDsKLQkJCQlzcGxfaHMgPSB0cnVlOwotCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICgoIWhzX2NvbXBfcmVzKSAmJiAoIWlzX3BhX29uKSkgewotCQkJLyogQ2hlY2sgZm9yIGNyb3NzIGNvbm5lY3Rpb24qLwotCQkJcmV0ID0gd2NkX2NoZWNrX2Nyb3NzX2Nvbm4obWJoYyk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0JCQkJcHRfZ25kX21pY19zd2FwX2NudCsrOwotCQkJCW5vX2duZF9taWNfc3dhcF9jbnQgPSAwOwotCQkJCWlmIChwdF9nbmRfbWljX3N3YXBfY250IDwKLQkJCQkJCUdORF9NSUNfU1dBUF9USFJFU0hPTEQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChwdF9nbmRfbWljX3N3YXBfY250ID4KLQkJCQkJCUdORF9NSUNfU1dBUF9USFJFU0hPTEQpIHsKLQkJCQkJLyoKLQkJCQkJICogVGhpcyBpcyBkdWUgdG8gR05EL01JQyBzd2l0Y2ggZGlkbid0Ci0JCQkJCSAqIHdvcmssICBSZXBvcnQgdW5zdXBwb3J0ZWQgcGx1Zy4KLQkJCQkJICovCi0JCQkJCXByX2RlYnVnKCIlczogc3dpdGNoIGRpZG4ndCB3b3JrXG4iLAotCQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUDsKLQkJCQkJZ290byByZXBvcnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGx1Z190eXBlID0gTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbm9fZ25kX21pY19zd2FwX2NudCsrOwotCQkJCXB0X2duZF9taWNfc3dhcF9jbnQgPSAwOwotCQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hFQURTRVQ7Ci0JCQkJaWYgKChub19nbmRfbWljX3N3YXBfY250IDwKLQkJCQkgICAgR05EX01JQ19TV0FQX1RIUkVTSE9MRCkgJiYKLQkJCQkgICAgKHNwbF9oc19jb3VudCAhPSBXQ0RfTUJIQ19TUExfSFNfQ05UKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlub19nbmRfbWljX3N3YXBfY250ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHB0X2duZF9taWNfc3dhcF9jbnQgPT0gR05EX01JQ19TV0FQX1RIUkVTSE9MRCkgJiYKLQkJCQkocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUCkpIHsKLQkJCQkvKgotCQkJCSAqIGlmIHN3aXRjaCBpcyB0b2dnbGVkLCBjaGVjayBhZ2FpbiwKLQkJCQkgKiBvdGhlcndpc2UgcmVwb3J0IHVuc3VwcG9ydGVkIHBsdWcKLQkJCQkgKi8KLQkJCQlpZiAobWJoYy0+bWJoY19jZmctPnN3YXBfZ25kX21pYyAmJgotCQkJCQltYmhjLT5tYmhjX2NmZy0+c3dhcF9nbmRfbWljKGNvZGVjLAotCQkJCQl0cnVlKSkgewotCQkJCQlwcl9kZWJ1ZygiJXM6IFVTX0VVIGdwaW8gcHJlc2VudCxmbGlwIHN3aXRjaFxuIgotCQkJCQkJLCBfX2Z1bmNfXyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxULCBocGhsX3NjaCk7Ci0JCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX01JQ19TQ0hNVF9SRVNVTFQsIG1pY19zY2gpOwotCQlpZiAoaHNfY29tcF9yZXMgJiYgIShocGhsX3NjaCB8fCBtaWNfc2NoKSkgewotCQkJcHJfZGVidWcoIiVzOiBjYWJsZSBpcyBleHRlbnNpb24gY2FibGVcbiIsIF9fZnVuY19fKTsKLQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOwotCQkJd3JrX2NvbXBsZXRlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogY2FibGUgbWlnaHQgYmUgaGVhZHNldDogJWRcbiIsIF9fZnVuY19fLAotCQkJCQlwbHVnX3R5cGUpOwotCQkJaWYgKCEocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUCkpIHsKLQkJCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOwotCQkJCWlmICghc3BsX2hzX3JlcG9ydGVkICYmCi0JCQkJICAgIHNwbF9oc19jb3VudCA9PSBXQ0RfTUJIQ19TUExfSFNfQ05UKSB7Ci0JCQkJCXNwbF9oc19yZXBvcnRlZCA9IHRydWU7Ci0JCQkJCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCQkJCQl3Y2RfbWJoY19maW5kX3BsdWdfYW5kX3JlcG9ydChtYmhjLAotCQkJCQkJCQkgICAgcGx1Z190eXBlKTsKLQkJCQkJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChzcGxfaHNfcmVwb3J0ZWQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCS8qCi0JCQkJICogUmVwb3J0IGhlYWRzZXQgb25seSBpZiBub3QgYWxyZWFkeSByZXBvcnRlZAotCQkJCSAqIGFuZCBpZiB0aGVyZSBpcyBub3QgYnV0dG9uIHByZXNzIHdpdGhvdXQKLQkJCQkgKiByZWxlYXNlCi0JCQkJICovCi0JCQkJaWYgKCgobWJoYy0+Y3VycmVudF9wbHVnICE9Ci0JCQkJICAgICAgTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkgJiYKLQkJCQkgICAgIChtYmhjLT5jdXJyZW50X3BsdWcgIT0KLQkJCQkgICAgICBNQkhDX1BMVUdfVFlQRV9BTkNfSEVBRFBIT05FKSkgJiYKLQkJCQkgICAgIXdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSAmJgotCQkJCSAgICAhbWJoYy0+YnRuX3ByZXNzX2ludHIpIHsKLQkJCQkJcHJfZGVidWcoIiVzOiBjYWJsZSBpcyAlc2hlYWRzZXRcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCSgoc3BsX2hzX2NvdW50ID09Ci0JCQkJCQkJV0NEX01CSENfU1BMX0hTX0NOVCkgPwotCQkJCQkJCSJzcGVjaWFsICI6IiIpKTsKLQkJCQkJZ290byByZXBvcnQ7Ci0JCQkJfQotCQkJfQotCQkJd3JrX2NvbXBsZXRlID0gZmFsc2U7Ci0JCX0KLQl9Ci0JaWYgKCF3cmtfY29tcGxldGUgJiYgbWJoYy0+YnRuX3ByZXNzX2ludHIpIHsKLQkJcHJfZGVidWcoIiVzOiBDYW4gYmUgc2xvdyBpbnNlcnRpb24gb2YgaGVhZHBob25lXG4iLCBfX2Z1bmNfXyk7Ci0JCXdjZF9jYW5jZWxfYnRuX3dvcmsobWJoYyk7Ci0JCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hFQURQSE9ORTsKLQl9Ci0JLyoKLQkgKiBJZiBwbHVnX3R5ZSBpcyBoZWFkc2V0LCB3ZSBtaWdodCBoYXZlIGFscmVhZHkgcmVwb3J0ZWQgZWl0aGVyIGluCi0JICogZGV0ZWN0X3BsdWctdHlwZSBvciBpbiBhYm92ZSB3aGlsZSBsb29wLCBubyBuZWVkIHRvIHJlcG9ydCBhZ2FpbgotCSAqLwotCWlmICghd3JrX2NvbXBsZXRlICYmICgocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURTRVQpIHx8Ci0JICAgIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfQU5DX0hFQURQSE9ORSkpKSB7Ci0JCXByX2RlYnVnKCIlczogcGx1Z190eXBlOjB4JXggYWxyZWFkeSByZXBvcnRlZFxuIiwKLQkJCSBfX2Z1bmNfXywgbWJoYy0+Y3VycmVudF9wbHVnKTsKLQkJZ290byBlbmFibGVfc3VwcGx5OwotCX0KLQotCWlmIChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSElHSF9IUEggJiYKLQkJKCFkZXRfZXh0bl9jYWJsZV9lbikpIHsKLQkJaWYgKHdjZF9pc19zcGVjaWFsX2hlYWRzZXQobWJoYykpIHsKLQkJCXByX2RlYnVnKCIlczogU3BlY2lhbCBoZWFkc2V0IGZvdW5kICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcGx1Z190eXBlKTsKLQkJCXBsdWdfdHlwZSA9IE1CSENfUExVR19UWVBFX0hFQURTRVQ7Ci0JCQlnb3RvIHJlcG9ydDsKLQkJfQotCX0KLQotcmVwb3J0OgotCWlmICh3Y2Rfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKLQkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggbGV2ZWwgaXMgbG93XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVAgJiYgbWJoYy0+YnRuX3ByZXNzX2ludHIpIHsKLQkJcHJfZGVidWcoIiVzOiBpbnNlcnRpb24gb2YgaGVhZHBob25lIHdpdGggc3dhcFxuIiwgX19mdW5jX18pOwotCQl3Y2RfY2FuY2VsX2J0bl93b3JrKG1iaGMpOwotCQlwbHVnX3R5cGUgPSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkU7Ci0JfQotCXByX2RlYnVnKCIlczogVmFsaWQgcGx1ZyBmb3VuZCwgcGx1ZyB0eXBlICVkIHdya19jbXB0ICVkIGJ0bl9pbnRyICVkXG4iLAotCQkJX19mdW5jX18sIHBsdWdfdHlwZSwgd3JrX2NvbXBsZXRlLAotCQkJbWJoYy0+YnRuX3ByZXNzX2ludHIpOwotCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsIHBsdWdfdHlwZSk7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLWVuYWJsZV9zdXBwbHk6Ci0JaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKQotCQl3Y2RfbWJoY191cGRhdGVfZnNtX3NvdXJjZShtYmhjLCBwbHVnX3R5cGUpOwotCWVsc2UKLQkJd2NkX2VuYWJsZV9tYmhjX3N1cHBseShtYmhjLCBwbHVnX3R5cGUpOwotZXhpdDoKLQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wgJiYKLQkgICAgIW1iaGMtPm1pY2JpYXNfZW5hYmxlKQotCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbChjb2RlYywgTUlDX0JJQVNfMiwKLQkJCQkJCSAgICBNSUNCX0RJU0FCTEUpOwotCi0JLyoKLQkgKiBJZiBwbHVnIHR5cGUgaXMgY29ycmVjdGVkIGZyb20gc3BlY2lhbCBoZWFkc2V0IHRvIGhlYWRwaG9uZSwKLQkgKiBjbGVhciB0aGUgbWljYmlhcyBlbmFibGUgZmxhZywgc2V0IG1pY2JpYXMgYmFjayB0byAxLjhWIGFuZAotCSAqIGRpc2FibGUgbWljYmlhcy4KLQkgKi8KLQlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSAmJgotCSAgICBtYmhjLT5taWNiaWFzX2VuYWJsZSkgewotCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wpCi0JCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCgKLQkJCQkJY29kZWMsIE1JQ19CSUFTXzIsCi0JCQkJCU1JQ0JfRElTQUJMRSk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQotCQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX2N0cmxfdGhyX21pYygKLQkJCQkJY29kZWMsCi0JCQkJCU1JQ19CSUFTXzIsIGZhbHNlKTsKLQkJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKSB7Ci0JCQltYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZShjb2RlYyk7Ci0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAwKTsKLQkJfQotCQltYmhjLT5taWNiaWFzX2VuYWJsZSA9IGZhbHNlOwotCX0KLQotCWlmIChtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMpIHsKLQkJbWljYmlhczEgPSBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMobWJoYywKLQkJCQkJCQkJTUlDX0JJQVNfMSk7Ci0JCW1pY2JpYXMyID0gbWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKG1iaGMsCi0JCQkJCQkJCU1JQ19CSUFTXzIpOwotCX0KLQotCWlmIChtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUgJiYKLQkgICAgKChwbHVnX3R5cGUgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSB8fAotCSAgICAgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSkgJiYKLQkgICAgIW1iaGMtPmhzX2RldGVjdF93b3JrX3N0b3ApIHsKLQkJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JCXdjZF9tYmhjX2hzX2VsZWNfaXJxKG1iaGMsIFdDRF9NQkhDX0VMRUNfSFNfUkVNLCB0cnVlKTsKLQkJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQl9Ci0JaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9jYXBfbW9kZSkKLQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgbWljYmlhczIpOwotCi0JaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX2Rvd25fY3RybCkKLQkJbWJoYy0+bWJoY19jYi0+aHBoX3B1bGxfZG93bl9jdHJsKGNvZGVjLCB0cnVlKTsKLQotCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOwotCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHdjZF9tYmhjX2hzX3JlbV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOwotCXU4IGhzX2NvbXBfcmVzdWx0ID0gMCwgaHBobF9zY2ggPSAwLCBtaWNfc2NoID0gMDsKLQlzdGF0aWMgdTE2IGhwaGxfdHJpZ2VycmVkOwotCXN0YXRpYyB1MTYgbWljX3RyaWdlcnJlZDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JYm9vbCByZW1vdmVkID0gdHJ1ZTsKLQlpbnQgcmV0cnkgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCi0JV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArCi0JCSAgbXNlY3NfdG9famlmZmllcyhXQ0RfRkFLRV9SRU1PVkFMX01JTl9QRVJJT0RfTVMpOwotCWRvIHsKLQkJcmV0cnkrKzsKLQkJLyoKLQkJICogcmVhZCB0aGUgcmVzdWx0IHJlZ2lzdGVyIGV2ZXJ5IDEwbXMgdG8gbG9vayBmb3IKLQkJICogYW55IGNoYW5nZSBpbiBIU19DT01QX1JFU1VMVCBiaXQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAxMDApOwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwgaHNfY29tcF9yZXN1bHQpOwotCQlwcl9kZWJ1ZygiJXM6IENoZWNrIHJlc3VsdCByZWcgZm9yIGZha2UgcmVtb3ZhbDogaHNfY29tcF9yZXMgJXhcbiIsCi0JCQkgX19mdW5jX18sIGhzX2NvbXBfcmVzdWx0KTsKLQkJaWYgKCghaHNfY29tcF9yZXN1bHQpICYmCi0JCSAgICByZXRyeSA+IEZBS0VfUkVNX1JFVFJZX0FUVEVNUFRTKSB7Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKLQotCWlmICh3Y2Rfc3djaF9sZXZlbF9yZW1vdmUobWJoYykpIHsKLQkJcHJfZGVidWcoIiVzOiBTd2l0Y2ggbGV2ZWwgaXMgbG93ICIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQlwcl9kZWJ1ZygiJXM6IGhlYWRzZXQgJXMgYWN0dWFsbHkgcmVtb3ZlZFxuIiwgX19mdW5jX18sCi0JCXJlbW92ZWQgPyAiIiA6ICJub3QgIik7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2gpOwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX01JQ19TQ0hNVF9SRVNVTFQsIG1pY19zY2gpOwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0hTX0NPTVBfUkVTVUxULCBoc19jb21wX3Jlc3VsdCk7Ci0KLQlpZiAocmVtb3ZlZCkgewotCQlpZiAoIShocGhsX3NjaCAmJiBtaWNfc2NoICYmIGhzX2NvbXBfcmVzdWx0KSkgewotCQkJLyoKLQkJCSAqIGV4dGVuc2lvbiBjYWJsZSBpcyBzdGlsbCBwbHVnZ2VkIGluCi0JCQkgKiByZXBvcnQgaXQgYXMgTElORU9VVCBkZXZpY2UKLQkJCSAqLwotCQkJZ290byByZXBvcnRfdW5wbHVnOwotCQl9IGVsc2UgewotCQkJaWYgKCFtaWNfc2NoKSB7Ci0JCQkJbWljX3RyaWdlcnJlZCsrOwotCQkJCXByX2RlYnVnKCIlczogUmVtb3ZhbCBNSUMgdHJpZ2VycmVkICVkXG4iLAotCQkJCQkgX19mdW5jX18sIG1pY190cmlnZXJyZWQpOwotCQkJfQotCQkJaWYgKCFocGhsX3NjaCkgewotCQkJCWhwaGxfdHJpZ2VycmVkKys7Ci0JCQkJcHJfZGVidWcoIiVzOiBSZW1vdmFsIEhQSEwgdHJpZ2VycmVkICVkXG4iLAotCQkJCQkgX19mdW5jX18sIGhwaGxfdHJpZ2VycmVkKTsKLQkJCX0KLQkJCWlmIChtaWNfdHJpZ2VycmVkICYmIGhwaGxfdHJpZ2VycmVkKSB7Ci0JCQkJLyoKLQkJCQkgKiBleHRlbnNpb24gY2FibGUgaXMgc3RpbGwgcGx1Z2dlZCBpbgotCQkJCSAqIHJlcG9ydCBpdCBhcyBMSU5FT1VUIGRldmljZQotCQkJCSAqLwotCQkJCWdvdG8gcmVwb3J0X3VucGx1ZzsKLQkJCX0KLQkJfQotCX0KLWV4aXQ6Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotCi1yZXBvcnRfdW5wbHVnOgotCXdjZF9tYmhjX2VsZWNfaHNfcmVwb3J0X3VucGx1ZyhtYmhjKTsKLQlocGhsX3RyaWdlcnJlZCA9IDA7Ci0JbWljX3RyaWdlcnJlZCA9IDA7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfaHNfaW5zX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYyA9IGRhdGE7Ci0JYm9vbCBkZXRlY3Rpb25fdHlwZSA9IDAsIGhwaGxfc2NoID0gMCwgbWljX3NjaCA9IDA7Ci0JdTE2IGVsZWN0X3Jlc3VsdCA9IDA7Ci0Jc3RhdGljIHUxNiBocGhsX3RyaWdlcnJlZDsKLQlzdGF0aWMgdTE2IG1pY190cmlnZXJyZWQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFtYmhjLT5tYmhjX2NmZy0+ZGV0ZWN0X2V4dG5fY2FibGUpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXR1cm5pbmcgYXMgRXh0ZW5zaW9uIGNhYmxlIGZlYXR1cmUgbm90IGVuYWJsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0JV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwgZGV0ZWN0aW9uX3R5cGUpOwotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX0VMRUNUX1JFU1VMVCwgZWxlY3RfcmVzdWx0KTsKLQotCXByX2RlYnVnKCIlczogZGV0ZWN0aW9uX3R5cGUgJWQsIGVsZWN0X3Jlc3VsdCAleFxuIiwgX19mdW5jX18sCi0JCQkJZGV0ZWN0aW9uX3R5cGUsIGVsZWN0X3Jlc3VsdCk7Ci0JaWYgKGRldGVjdGlvbl90eXBlKSB7Ci0JCS8qIGNoZWNrIGlmIGJvdGggTGVmdCBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMgYXJlIHRyaWdnZXJlZCAqLwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhMX1NDSE1UX1JFU1VMVCwgaHBobF9zY2gpOwotCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19NSUNfU0NITVRfUkVTVUxULCBtaWNfc2NoKTsKLQkJaWYgKGhwaGxfc2NoICYmIG1pY19zY2gpIHsKLQkJCS8qIEdvIGZvciBwbHVnIHR5cGUgZGV0ZXJtaW5hdGlvbiAqLwotCQkJcHJfZGVidWcoIiVzOiBHbyBmb3IgcGx1ZyB0eXBlIGRldGVybWluYXRpb25cbiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGRldGVybWluZV9wbHVnOwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAobWljX3NjaCkgewotCQkJCW1pY190cmlnZXJyZWQrKzsKLQkJCQlwcl9kZWJ1ZygiJXM6IEluc2VydGlvbiBNSUMgdHJpZ2VycmVkICVkXG4iLAotCQkJCQkgX19mdW5jX18sIG1pY190cmlnZXJyZWQpOwotCQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUygKLQkJCQkJCVdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsCi0JCQkJCQkwKTsKLQkJCQltc2xlZXAoMjApOwotCQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUygKLQkJCQkJCVdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsCi0JCQkJCQkxKTsKLQkJCX0KLQkJCWlmIChocGhsX3NjaCkgewotCQkJCWhwaGxfdHJpZ2VycmVkKys7Ci0JCQkJcHJfZGVidWcoIiVzOiBJbnNlcnRpb24gSFBITCB0cmlnZXJyZWQgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgaHBobF90cmlnZXJyZWQpOwotCQkJfQotCQkJaWYgKG1pY190cmlnZXJyZWQgJiYgaHBobF90cmlnZXJyZWQpIHsKLQkJCQkvKiBHbyBmb3IgcGx1ZyB0eXBlIGRldGVybWluYXRpb24gKi8KLQkJCQlwcl9kZWJ1ZygiJXM6IEdvIGZvciBwbHVnIHR5cGUgZGV0ZXJtaW5hdGlvblxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQlnb3RvIGRldGVybWluZV9wbHVnOwotCQkJfQotCQl9Ci0JfQotCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotZGV0ZXJtaW5lX3BsdWc6Ci0JLyoKLQkgKiBEaXNhYmxlIEhQSEwgdHJpZ2dlciBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMuCi0JICogU2V0dXAgZm9yIGluc2VydGlvbiBkZXRlY3Rpb24uCi0JICovCi0JcHJfZGVidWcoIiVzOiBEaXNhYmxlIGluc2VydGlvbiBpbnRlcnJ1cHRcbiIsIF9fZnVuY19fKTsKLQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywKLQkJCSAgICAgZmFsc2UpOwotCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMsIDApOwotCWhwaGxfdHJpZ2VycmVkID0gMDsKLQltaWNfdHJpZ2VycmVkID0gMDsKLQltYmhjLT5pc19leHRuX2NhYmxlID0gdHJ1ZTsKLQltYmhjLT5idG5fcHJlc3NfaW50ciA9IGZhbHNlOwotCXdjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUobWJoYyk7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgc3RydWN0IHdjZF9tYmhjX2ZuIG1iaGNfZm4gPSB7Ci0JLndjZF9tYmhjX2hzX2luc19pcnEgPSB3Y2RfbWJoY19oc19pbnNfaXJxLAotCS53Y2RfbWJoY19oc19yZW1faXJxID0gd2NkX21iaGNfaHNfcmVtX2lycSwKLQkud2NkX21iaGNfZGV0ZWN0X3BsdWdfdHlwZSA9IHdjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUsCi0JLndjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlID0gd2NkX21iaGNfZGV0ZWN0X2FuY19wbHVnX3R5cGUsCi0JLndjZF9jYW5jZWxfaHNfZGV0ZWN0X3BsdWcgPSB3Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnLAotfTsKLQotLyogRnVuY3Rpb246IHdjZF9tYmhjX2xlZ2FjeV9pbml0Ci0gKiBAbWJoYzogTUJIQyBmdW5jdGlvbiBwb2ludGVyCi0gKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6ZSBNQkhDIGxlZ2FjeSBiYXNlZCBmdW5jdGlvbiBwb2ludGVycyB0byBNQkhDIHN0cnVjdHVyZQotICovCi12b2lkIHdjZF9tYmhjX2xlZ2FjeV9pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlpZiAoIW1iaGMpIHsKLQkJcHJfZXJyKCIlczogbWJoYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JbWJoYy0+bWJoY19mbiA9ICZtYmhjX2ZuOwotCUlOSVRfV09SSygmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gsIHdjZF9jb3JyZWN0X3N3Y2hfcGx1Zyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9tYmhjX2xlZ2FjeV9pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtbGVnYWN5LmggYi9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLWxlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQzOTNkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtbGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1dDRF9NQkhDX0xFR0FDWV9IX18KLSNkZWZpbmUgX19XQ0RfTUJIQ19MRUdBQ1lfSF9fCi0KLSNpbmNsdWRlICJ3Y2RjYWwtaHdkZXAuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy12Mi5oIgotCi0jaWZkZWYgQ09ORklHX1NORF9TT0NfV0NEX01CSENfTEVHQUNZCi12b2lkIHdjZF9tYmhjX2xlZ2FjeV9pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHdjZF9tYmhjX2xlZ2FjeV9pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19XQ0RfTUJIQ19MRUdBQ1lfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLWFwaS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy12Mi1hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2ZTk0NS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLWFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX19XQ0RfTUJIQ19WMl9BUElfSF9fCi0jZGVmaW5lIF9fV0NEX01CSENfVjJfQVBJX0hfXwotCi0jaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TT0NfV0NEX01CSEMpCi1pbnQgd2NkX21iaGNfc3RhcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkgICAgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpOwotdm9pZCB3Y2RfbWJoY19zdG9wKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYyk7Ci1pbnQgd2NkX21iaGNfaW5pdChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJICAgICAgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiICptYmhjX2NiLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfaW50ciAqbWJoY19jZGNfaW50cl9pZHMsCi0JCSAgICAgIHN0cnVjdCB3Y2RfbWJoY19yZWdpc3RlciAqd2NkX21iaGNfcmVncywKLQkJICAgICAgYm9vbCBpbXBlZGFuY2VfZGV0X2VuKTsKLWludCB3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdWludDMyX3QgKnpsLAotCQkJICAgdWludDMyX3QgKnpyKTsKLXZvaWQgd2NkX21iaGNfZGVpbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYyk7Ci0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgd2NkX21iaGNfc3RvcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci19Ci1pbnQgd2NkX21iaGNfaW5pdChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJICAgICAgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiICptYmhjX2NiLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfaW50ciAqbWJoY19jZGNfaW50cl9pZHMsCi0JCSAgICAgIHN0cnVjdCB3Y2RfbWJoY19yZWdpc3RlciAqd2NkX21iaGNfcmVncywKLQkJICAgICAgYm9vbCBpbXBlZGFuY2VfZGV0X2VuKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSBpbnQgd2NkX21iaGNfc3RhcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCSBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHdjZF9tYmhjX2dldF9pbXBlZGFuY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQkgdWludDMyX3QgKnpsLAotCQkJCQkgdWludDMyX3QgKnpyKQotewotCSp6bCA9IDA7Ci0JKnpyID0gMDsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3Y2RfbWJoY19kZWluaXQoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX1dDRF9NQkhDX1YyX0FQSV9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtdjIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2N2RlOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1tYmhjLXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+Ci0jaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlICJ3Y2RjYWwtaHdkZXAuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy1sZWdhY3kuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy1hZGMuaCIKLSNpbmNsdWRlICJ3Y2QtbWJoYy12Mi1hcGkuaCIKLQotdm9pZCB3Y2RfbWJoY19qYWNrX3JlcG9ydChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkgIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIGludCBzdGF0dXMsIGludCBtYXNrKQotewotCXNuZF9zb2NfamFja19yZXBvcnQoamFjaywgc3RhdHVzLCBtYXNrKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX21iaGNfamFja19yZXBvcnQpOwotCi1zdGF0aWMgdm9pZCBfX2hwaG9jcF9vZmZfcmVwb3J0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdTMyIGphY2tfc3RhdHVzLAotCQkJCWludCBpcnEpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogY2xlYXIgb2NwIHN0YXR1cyAleFxuIiwKLQkJX19mdW5jX18sIGphY2tfc3RhdHVzKTsKLQotCWlmIChtYmhjLT5ocGhfc3RhdHVzICYgamFja19zdGF0dXMpIHsKLQkJbWJoYy0+aHBoX3N0YXR1cyAmPSB+amFja19zdGF0dXM7Ci0JCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJICAgICBtYmhjLT5ocGhfc3RhdHVzLCBXQ0RfTUJIQ19KQUNLX01BU0spOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfT0NQX0ZTTV9FTiwgMCk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAxKTsKLQkJLyoKLQkJICogcmVzZXQgcmV0cnkgY291bnRlciBhcyBQQSBpcyB0dXJuZWQgb2ZmIHNpZ25pZnlpbmcKLQkJICogc3RhcnQgb2YgbmV3IE9DUCBkZXRlY3Rpb24gc2Vzc2lvbgotCQkgKi8KLQkJaWYgKG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3ApCi0JCQltYmhjLT5ocGhsb2NwX2NudCA9IDA7Ci0JCWVsc2UKLQkJCW1iaGMtPmhwaHJvY3BfY250ID0gMDsKLQkJbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2woY29kZWMsIGlycSwgdHJ1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBocGhyb2NwX29mZl9yZXBvcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLCB1MzIgamFja19zdGF0dXMpCi17Ci0JX19ocGhvY3Bfb2ZmX3JlcG9ydChtYmhjLCBTTkRfSkFDS19PQ19IUEhSLAotCQkJICAgIG1iaGMtPmludHJfaWRzLT5ocGhfcmlnaHRfb2NwKTsKLX0KLQotc3RhdGljIHZvaWQgaHBobG9jcF9vZmZfcmVwb3J0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdTMyIGphY2tfc3RhdHVzKQotewotCV9faHBob2NwX29mZl9yZXBvcnQobWJoYywgU05EX0pBQ0tfT0NfSFBITCwKLQkJCSAgICBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3Byb2dyYW1faHNfdnJlZihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0Jc3RydWN0IHdjZF9tYmhjX3BsdWdfdHlwZV9jZmcgKnBsdWdfdHlwZV9jZmc7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0JdTMyIHJlZ192YWw7Ci0KLQlwbHVnX3R5cGVfY2ZnID0gV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uKTsKLQlyZWdfdmFsID0gKChwbHVnX3R5cGVfY2ZnLT52X2hzX21heCAtIEhTX1ZSRUZfTUlOX1ZBTCkgLyAxMDApOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHJlZ192YWwgID0gJXhcbiIsIF9fZnVuY19fLCByZWdfdmFsKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFNfVlJFRiwgcmVnX3ZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9wcm9ncmFtX2J0bl90aHJlc2hvbGQoY29uc3Qgc3RydWN0IHdjZF9tYmhjICptYmhjLCBib29sIG1pY2JpYXMpCi17Ci0Jc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fZGV0OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0JczE2ICpidG5fbG93LCAqYnRuX2hpZ2g7Ci0KLQlpZiAobWJoYy0+bWJoY19jZmctPmNhbGlicmF0aW9uID09IE5VTEwpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICIlczogY2FsaWJyYXRpb24gZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlidG5fZGV0ID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbik7Ci0JYnRuX2xvdyA9IGJ0bl9kZXQtPl92X2J0bl9sb3c7Ci0JYnRuX2hpZ2ggPSAoKHZvaWQgKikmYnRuX2RldC0+X3ZfYnRuX2xvdykgKwotCQkJKHNpemVvZihidG5fZGV0LT5fdl9idG5fbG93WzBdKSAqIGJ0bl9kZXQtPm51bV9idG4pOwotCi0JbWJoYy0+bWJoY19jYi0+c2V0X2J0bl90aHIoY29kZWMsIGJ0bl9sb3csIGJ0bl9oaWdoLCBidG5fZGV0LT5udW1fYnRuLAotCQkJCSAgIG1pY2JpYXMpOwotfQotCi12b2lkIHdjZF9lbmFibGVfY3Vycl9taWNiaWFzKGNvbnN0IHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQljb25zdCBlbnVtIHdjZF9tYmhjX2NzX21iX2VuX2ZsYWcgY3NfbWJfZW4pCi17Ci0KLQkvKgotCSAqIFNvbWUgY29kZWNzIGhhbmRsZSBtaWNiaWFzL3B1bGx1cCBlbmFibGVtZW50IGluIGNvZGVjCi0JICogZHJpdmVycyBpdHNlbGYgYW5kIG1pY2JpYXMgaXMgbm90IG5lZWRlZCBmb3IgcmVndWxhcgotCSAqIHBsdWcgdHlwZSBkZXRlY3Rpb24uIFNvIGlmIG1pY2JpYXNfY29udHJvbCBjYWxsYmFjayBmdW5jdGlvbgotCSAqIGlzIGRlZmluZWQsIGp1c3QgcmV0dXJuLgotCSAqLwotCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKLQkJcmV0dXJuOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlciwgY3NfbWJfZW46ICVkXG4iLCBfX2Z1bmNfXywgY3NfbWJfZW4pOwotCi0Jc3dpdGNoIChjc19tYl9lbikgewotCWNhc2UgV0NEX01CSENfRU5fQ1M6Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NSUNCX0NUUkwsIDApOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAzKTsKLQkJLyogUHJvZ3JhbSBCdXR0b24gdGhyZXNob2xkIHJlZ2lzdGVycyBhcyBwZXIgQ1MgKi8KLQkJd2NkX3Byb2dyYW1fYnRuX3RocmVzaG9sZChtYmhjLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX01CSENfRU5fTUI6Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDApOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAxKTsKLQotCQkvKiBEaXNhYmxlIFBVTExfVVBfRU4gJiBlbmFibGUgTUlDQklBUyAqLwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAyKTsKLQkJLyogUHJvZ3JhbSBCdXR0b24gdGhyZXNob2xkIHJlZ2lzdGVycyBhcyBwZXIgTUlDQklBUyAqLwotCQl3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKG1iaGMsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFdDRF9NQkhDX0VOX1BVTExVUDoKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9JU1JDX0NUTCwgMyk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDEpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAxKTsKLQkJLyogUHJvZ3JhbSBCdXR0b24gdGhyZXNob2xkIHJlZ2lzdGVycyBhcyBwZXIgTUlDQklBUyAqLwotCQl3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKG1iaGMsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFdDRF9NQkhDX0VOX05PTkU6Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDApOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAxKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX01JQ0JfQ1RSTCwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogSW52YWxpZCBwYXJhbWV0ZXIiLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLQotCXByX2RlYnVnKCIlczogZXhpdFxuIiwgX19mdW5jX18pOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp3Y2RfbWJoY19nZXRfZXZlbnRfc3RyaW5nKGludCBldmVudCkKLXsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PRkY6Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGKTsKLQljYXNlIFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY6Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRik7Ci0JY2FzZSBXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTjoKLQkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTik7Ci0JY2FzZSBXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT046Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09OKTsKLQljYXNlIFdDRF9FVkVOVF9QUkVfSFBITF9QQV9PTjoKLQkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT04pOwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkY6Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYpOwotCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09OOgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PTik7Ci0JY2FzZSBXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRjoKLQkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRik7Ci0JY2FzZSBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGOgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkYpOwotCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09GRjoKLQkJcmV0dXJuIFdDRF9NQkhDX1NUUklOR0lGWShXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT0ZGKTsKLQljYXNlIFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OOgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OKTsKLQljYXNlIFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT046Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BSRV9EQVBNX01JQ0JJQVNfMl9PTik7Ci0JY2FzZSBXQ0RfRVZFTlRfUE9TVF9EQVBNX01JQ0JJQVNfMl9PRkY6Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGKTsKLQljYXNlIFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT0ZGOgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT0ZGKTsKLQljYXNlIFdDRF9FVkVOVF9PQ1BfT0ZGOgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9PQ1BfT0ZGKTsKLQljYXNlIFdDRF9FVkVOVF9PQ1BfT046Ci0JCXJldHVybiBXQ0RfTUJIQ19TVFJJTkdJRlkoV0NEX0VWRU5UX09DUF9PTik7Ci0JY2FzZSBXQ0RfRVZFTlRfSU5WQUxJRDoKLQlkZWZhdWx0OgotCQlyZXR1cm4gV0NEX01CSENfU1RSSU5HSUZZKFdDRF9FVkVOVF9JTlZBTElEKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2V2ZW50X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjID0gKHN0cnVjdCB3Y2RfbWJoYyAqKWRhdGE7Ci0JZW51bSB3Y2Rfbm90aWZ5X2V2ZW50IGV2ZW50ID0gKGVudW0gd2NkX25vdGlmeV9ldmVudCl2YWw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0JYm9vbCBtaWNiaWFzMiA9IGZhbHNlOwotCWJvb2wgbWljYmlhczEgPSBmYWxzZTsKLQl1OCBmc21fZW4gPSAwOwotCi0JcHJfZGVidWcoIiVzOiBldmVudCAlcyAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJIHdjZF9tYmhjX2dldF9ldmVudF9zdHJpbmcoZXZlbnQpLCBldmVudCk7Ci0JaWYgKG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cykgewotCQltaWNiaWFzMiA9IG1iaGMtPm1iaGNfY2ItPm1pY2JpYXNfZW5hYmxlX3N0YXR1cyhtYmhjLAotCQkJCQkJCQlNSUNfQklBU18yKTsKLQkJbWljYmlhczEgPSBtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMobWJoYywKLQkJCQkJCQkJTUlDX0JJQVNfMSk7Ci0JfQotCXN3aXRjaCAoZXZlbnQpIHsKLQkvKiBNSUNCSUFTIHVzYWdlIGNoYW5nZSAqLwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT046Ci0JCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IHRydWU7Ci0JCXByX2RlYnVnKCIlczogaXNfY2FwdHVyZTogJWRcbiIsIF9fZnVuY19fLAotCQkJICBtYmhjLT5pc19oc19yZWNvcmRpbmcpOwotCQlicmVhazsKLQljYXNlIFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTjoKLQkJaWYgKCFtYmhjLT5taWNiaWFzX2VuYWJsZSkKLQkJCWdvdG8gb3V0X21pY2JfZW47Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwpIHsKLQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybChjb2RlYywKLQkJCQkJTUJIQ19DT01NT05fTUlDQl9QUkVDSEFSR0UsCi0JCQkJCXRydWUpOwotCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAotCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1NFVF9WQUwsCi0JCQkJCXRydWUpOwotCQkJLyoKLQkJCSAqIFNwZWNpYWwgaGVhZHNldCBuZWVkcyBNSUNCSUFTIGFzIDIuN1Ygc28gd2FpdCBmb3IKLQkJCSAqIDUwIG1zZWMgZm9yIHRoZSBNSUNCSUFTIHRvIHJlYWNoIDIuNyB2b2x0cy4KLQkJCSAqLwotCQkJbXNsZWVwKDUwKTsKLQkJfQotCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2F1dG9femVyb2luZykKLQkJCW1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcoY29kZWMsIHRydWUpOwotCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKQotCQkJbWJoYy0+bWJoY19jYi0+bWJoY19jb21tb25fbWljYl9jdHJsKGNvZGVjLAotCQkJCQlNQkhDX0NPTU1PTl9NSUNCX1BSRUNIQVJHRSwKLQkJCQkJZmFsc2UpOwotb3V0X21pY2JfZW46Ci0JCS8qIERpc2FibGUgY3VycmVudCBzb3VyY2UgaWYgbWljYmlhcyBlbmFibGVkICovCi0JCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkgewotCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOwotCQkJaWYgKGZzbV9lbikKLQkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLAotCQkJCQkJCSAwKTsKLQkJfSBlbHNlIHsKLQkJCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IHRydWU7Ci0JCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0JCX0KLQkJLyogY29uZmlndXJlIGNhcCBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIG1pY2JpYXMgaXMgZW5hYmxlZCAqLwotCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQotCQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGOgotCQkvKgotCQkgKiBCZWZvcmUgTUlDQklBU18yIGlzIHR1cm5lZCBvZmYsIGlmIEZTTSBpcyBlbmFibGVkLAotCQkgKiBtYWtlIHN1cmUgY3VycmVudCBzb3VyY2UgaXMgZW5hYmxlZCBzbyBhcyB0byBkZXRlY3QKLQkJICogYnV0dG9uIHByZXNzL3JlbGVhc2UgZXZlbnRzCi0JCSAqLwotCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wgJiYKLQkJICAgICFtYmhjLT5taWNiaWFzX2VuYWJsZSkgewotCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfRlNNX0VOLCBmc21fZW4pOwotCQkJaWYgKGZzbV9lbikKLQkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLAotCQkJCQkJCSAzKTsKLQkJfQotCQlicmVhazsKLQkvKiBNSUNCSUFTIHVzYWdlIGNoYW5nZSAqLwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGOgotCQltYmhjLT5pc19oc19yZWNvcmRpbmcgPSBmYWxzZTsKLQkJcHJfZGVidWcoIiVzOiBpc19jYXB0dXJlOiAlZFxuIiwgX19mdW5jX18sCi0JCQkgIG1iaGMtPmlzX2hzX3JlY29yZGluZyk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRjoKLQkJaWYgKCFtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKLQkJCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IGZhbHNlOwotCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKLQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9hdXRvX3plcm9pbmcpCi0JCQltYmhjLT5tYmhjX2NiLT5zZXRfYXV0b196ZXJvaW5nKGNvZGVjLCBmYWxzZSk7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSAmJiAhbWJoYy0+bWljYmlhc19lbmFibGUpCi0JCQltYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZShjb2RlYyk7Ci0JCS8qIEVuYWJsZSBQVUxMIFVQIGlmIFBBJ3MgYXJlIGVuYWJsZWQgKi8KLQkJaWYgKCh0ZXN0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhMLCAmbWJoYy0+ZXZlbnRfc3RhdGUpKSB8fAotCQkJCSh0ZXN0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhSLAotCQkJCQkgICZtYmhjLT5ldmVudF9zdGF0ZSkpKQotCQkJLyogZW5hYmxlIHB1bGx1cCBhbmQgY3MsIGRpc2FibGUgbWIgKi8KLQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX1BVTExVUCk7Ci0JCWVsc2UKLQkJCS8qIGVuYWJsZSBjdXJyZW50IHNvdXJjZSBhbmQgZGlzYWJsZSBtYiwgcHVsbHVwKi8KLQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX0NTKTsKLQotCQkvKiBjb25maWd1cmUgY2FwIHNldHRpbmdzIHByb3Blcmx5IHdoZW4gbWljYmlhcyBpcyBkaXNhYmxlZCAqLwotCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQotCQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgZmFsc2UpOwotCQlicmVhazsKLQljYXNlIFdDRF9FVkVOVF9QUkVfSFBITF9QQV9PRkY6Ci0JCW11dGV4X2xvY2soJm1iaGMtPmhwaGxfcGFfbG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkY6Ci0JCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhMX1BBX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKLQkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBTTkRfSkFDS19PQ19IUEhMKQotCQkJaHBobG9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSEwpOwotCQljbGVhcl9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBITCwgJm1iaGMtPmV2ZW50X3N0YXRlKTsKLQkJLyogY2hlY2sgaWYgbWljYmlhcyBpcyBlbmFibGVkICovCi0JCWlmIChtaWNiaWFzMikKLQkJCS8qIERpc2FibGUgY3MsIHB1bGx1cCAmIGVuYWJsZSBtaWNiaWFzICovCi0JCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0JCWVsc2UKLQkJCS8qIERpc2FibGUgbWljYmlhcywgcHVsbHVwICYgZW5hYmxlIGNzICovCi0JCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9DUyk7Ci0JCW11dGV4X3VubG9jaygmbWJoYy0+aHBobF9wYV9sb2NrKTsKLQkJY2xlYXJfYml0KFdDRF9NQkhDX0FOQzBfT0ZGX0FDSywgJm1iaGMtPmhwaF9hbmNfc3RhdGUpOwotCQlicmVhazsKLQljYXNlIFdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkY6Ci0JCW11dGV4X2xvY2soJm1iaGMtPmhwaHJfcGFfbG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0VWRU5UX1BPU1RfSFBIUl9QQV9PRkY6Ci0JCWNsZWFyX2JpdChXQ0RfTUJIQ19IUEhSX1BBX09GRl9BQ0ssICZtYmhjLT5ocGhfcGFfZGFjX3N0YXRlKTsKLQkJaWYgKG1iaGMtPmhwaF9zdGF0dXMgJiBTTkRfSkFDS19PQ19IUEhSKQotCQkJaHBocm9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSFIpOwotCQljbGVhcl9iaXQoV0NEX01CSENfRVZFTlRfUEFfSFBIUiwgJm1iaGMtPmV2ZW50X3N0YXRlKTsKLQkJLyogY2hlY2sgaWYgbWljYmlhcyBpcyBlbmFibGVkICovCi0JCWlmIChtaWNiaWFzMikKLQkJCS8qIERpc2FibGUgY3MsIHB1bGx1cCAmIGVuYWJsZSBtaWNiaWFzICovCi0JCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0JCWVsc2UKLQkJCS8qIERpc2FibGUgbWljYmlhcywgcHVsbHVwICYgZW5hYmxlIGNzICovCi0JCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9DUyk7Ci0JCW11dGV4X3VubG9jaygmbWJoYy0+aHBocl9wYV9sb2NrKTsKLQkJY2xlYXJfYml0KFdDRF9NQkhDX0FOQzFfT0ZGX0FDSywgJm1iaGMtPmhwaF9hbmNfc3RhdGUpOwotCQlicmVhazsKLQljYXNlIFdDRF9FVkVOVF9QUkVfSFBITF9QQV9PTjoKLQkJc2V0X2JpdChXQ0RfTUJIQ19FVkVOVF9QQV9IUEhMLCAmbWJoYy0+ZXZlbnRfc3RhdGUpOwotCQkvKiBjaGVjayBpZiBtaWNiaWFzIGlzIGVuYWJsZWQgKi8KLQkJaWYgKG1pY2JpYXMyKQotCQkJLyogRGlzYWJsZSBjcywgcHVsbHVwICYgZW5hYmxlIG1pY2JpYXMgKi8KLQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX01CKTsKLQkJZWxzZQotCQkJLyogRGlzYWJsZSBtaWNiaWFzLCBlbmFibGUgcHVsbHVwICYgY3MgKi8KLQkJCXdjZF9lbmFibGVfY3Vycl9taWNiaWFzKG1iaGMsIFdDRF9NQkhDX0VOX1BVTExVUCk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0VWRU5UX1BSRV9IUEhSX1BBX09OOgotCQlzZXRfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSFIsICZtYmhjLT5ldmVudF9zdGF0ZSk7Ci0JCS8qIGNoZWNrIGlmIG1pY2JpYXMgaXMgZW5hYmxlZCAqLwotCQlpZiAobWljYmlhczIpCi0JCQkvKiBEaXNhYmxlIGNzLCBwdWxsdXAgJiBlbmFibGUgbWljYmlhcyAqLwotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fTUIpOwotCQllbHNlCi0JCQkvKiBEaXNhYmxlIG1pY2JpYXMsIGVuYWJsZSBwdWxsdXAgJiBjcyAqLwotCQkJd2NkX2VuYWJsZV9jdXJyX21pY2JpYXMobWJoYywgV0NEX01CSENfRU5fUFVMTFVQKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0RfRVZFTlRfT0NQX09GRjoKLQkJbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2wobWJoYy0+Y29kZWMsCi0JCQkJCSAgIG1iaGMtPmludHJfaWRzLT5ocGhfbGVmdF9vY3AsCi0JCQkJCSAgIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0RfRVZFTlRfT0NQX09OOgotCQltYmhjLT5tYmhjX2NiLT5pcnFfY29udHJvbChtYmhjLT5jb2RlYywKLQkJCQkJICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKLQkJCQkJICAgdHJ1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHdjZF9jYW5jZWxfYnRuX3dvcmsoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWludCByOwotCi0JciA9IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWJoYy0+bWJoY19idG5fZHdvcmspOwotCS8qCi0JICogaWYgc2NoZWR1bGVkIG1iaGMubWJoY19idG5fZHdvcmsgaXMgY2FuY2VsZWQgZnJvbSBoZXJlLAotCSAqIHdlIGhhdmUgdG8gdW5sb2NrIGZyb20gaGVyZSBpbnN0ZWFkIGJ0bl93b3JrCi0JICovCi0JaWYgKHIpCi0JCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOwotCXJldHVybiByOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfY2FuY2VsX2J0bl93b3JrKTsKLQotYm9vbCB3Y2Rfc3djaF9sZXZlbF9yZW1vdmUoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXUxNiByZXN1bHQyID0gMDsKLQotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX1NXQ0hfTEVWRUxfUkVNT1ZFLCByZXN1bHQyKTsKLQlyZXR1cm4gKHJlc3VsdDIpID8gdHJ1ZSA6IGZhbHNlOwotfQotRVhQT1JUX1NZTUJPTCh3Y2Rfc3djaF9sZXZlbF9yZW1vdmUpOwotCi1zdGF0aWMgdm9pZCB3Y2RfbWJoY19jbHJfYW5kX3R1cm5vbl9ocGhfcGFkYWMoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWJvb2wgcGFfdHVybmVkX29uID0gZmFsc2U7Ci0JdTggd2dfdGltZSA9IDA7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUsIHdnX3RpbWUpOwotCXdnX3RpbWUgKz0gMTsKLQotCW11dGV4X2xvY2soJm1iaGMtPmhwaHJfcGFfbG9jayk7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXQ0RfTUJIQ19IUEhSX1BBX09GRl9BQ0ssCi0JCQkgICAgICAgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpKSB7Ci0JCXByX2RlYnVnKCIlczogSFBIUiBjbGVhciBmbGFnIGFuZCBlbmFibGUgUEFcbiIsIF9fZnVuY19fKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSFJfUEFfRU4sIDEpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBIUl9PQ1BfREVUX0VOLCAxKTsKLQkJcGFfdHVybmVkX29uID0gdHJ1ZTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtYmhjLT5ocGhyX3BhX2xvY2spOwotCW11dGV4X2xvY2soJm1iaGMtPmhwaGxfcGFfbG9jayk7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXQ0RfTUJIQ19IUEhMX1BBX09GRl9BQ0ssCi0JCQkgICAgICAgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpKSB7Ci0JCXByX2RlYnVnKCIlczogSFBITCBjbGVhciBmbGFnIGFuZCBlbmFibGUgUEFcbiIsIF9fZnVuY19fKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSExfUEFfRU4sIDEpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBITF9PQ1BfREVUX0VOLCAxKTsKLQkJcGFfdHVybmVkX29uID0gdHJ1ZTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtYmhjLT5ocGhsX3BhX2xvY2spOwotCi0JaWYgKHBhX3R1cm5lZF9vbikgewotCQlwcl9kZWJ1ZygiJXM6IFBBIHdhcyB0dXJuZWQgb24gYnkgTUJIQyBhbmQgbm90IGJ5IERBUE1cbiIsCi0JCQkgX19mdW5jX18pOwotCQl1c2xlZXBfcmFuZ2Uod2dfdGltZSAqIDEwMDAsIHdnX3RpbWUgKiAxMDAwICsgNTApOwotCX0KLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEX01CSENfQU5DMF9PRkZfQUNLLAotCQkJCSZtYmhjLT5ocGhfYW5jX3N0YXRlKSkgewotCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJcHJfZGVidWcoIiVzOiBIUEhMIEFOQyBjbGVhciBmbGFnIGFuZCBlbmFibGUgQU5DX0VOXG4iLAotCQkJX19mdW5jX18pOwotCQlpZiAobWJoYy0+bWJoY19jYi0+dXBkYXRlX2FuY19zdGF0ZSkKLQkJCW1iaGMtPm1iaGNfY2ItPnVwZGF0ZV9hbmNfc3RhdGUobWJoYy0+Y29kZWMsIHRydWUsIDApOwotCX0KLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0NEX01CSENfQU5DMV9PRkZfQUNLLAotCQkJCSZtYmhjLT5ocGhfYW5jX3N0YXRlKSkgewotCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJcHJfZGVidWcoIiVzOiBIUEhSIEFOQyBjbGVhciBmbGFnIGFuZCBlbmFibGUgQU5DX0VOXG4iLAotCQkJX19mdW5jX18pOwotCQlpZiAobWJoYy0+bWJoY19jYi0+dXBkYXRlX2FuY19zdGF0ZSkKLQkJCW1iaGMtPm1iaGNfY2ItPnVwZGF0ZV9hbmNfc3RhdGUobWJoYy0+Y29kZWMsIHRydWUsIDEpOwotCX0KLQotfQotCi1zdGF0aWMgYm9vbCB3Y2RfbWJoY19pc19ocGhfcGFfb24oc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWJvb2wgaHBoX3BhX29uID0gZmFsc2U7Ci0KLQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19IUEhfUEFfRU4sIGhwaF9wYV9vbik7Ci0KLQlyZXR1cm4gKGhwaF9wYV9vbikgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9tYmhjX3NldF9hbmRfdHVybm9mZl9ocGhfcGFkYWMoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXU4IHdnX3RpbWUgPSAwOwotCi0JV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFBIX0NOUF9XR19USU1FLCB3Z190aW1lKTsKLQl3Z190aW1lICs9IDE7Ci0KLQkvKiBJZiBoZWFkcGhvbmUgUEEgaXMgb24sIGNoZWNrIGlmIHVzZXJzcGFjZSByZWNlaXZlcwotCSAqIHJlbW92YWwgZXZlbnQgdG8gc3luYy11cCBQQSdzIHN0YXRlCi0JICovCi0JaWYgKHdjZF9tYmhjX2lzX2hwaF9wYV9vbihtYmhjKSkgewotCQlwcl9kZWJ1ZygiJXMgUEEgaXMgb24sIHNldHRpbmcgUEFfT0ZGX0FDS1xuIiwgX19mdW5jX18pOwotCQlzZXRfYml0KFdDRF9NQkhDX0hQSExfUEFfT0ZGX0FDSywgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpOwotCQlzZXRfYml0KFdDRF9NQkhDX0hQSFJfUEFfT0ZGX0FDSywgJm1iaGMtPmhwaF9wYV9kYWNfc3RhdGUpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBITF9PQ1BfREVUX0VOLCAwKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hQSFJfT0NQX0RFVF9FTiwgMCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzIFBBIGlzIG9mZlxuIiwgX19mdW5jX18pOwotCX0KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBIX1BBX0VOLCAwKTsKLQl1c2xlZXBfcmFuZ2Uod2dfdGltZSAqIDEwMDAsIHdnX3RpbWUgKiAxMDAwICsgNTApOwotCi0KLQlpZiAobWJoYy0+bWJoY19jYi0+aXNfYW5jX29uICYmIG1iaGMtPm1iaGNfY2ItPmlzX2FuY19vbihtYmhjKSkgewotCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJcHJfZGVidWcoIiVzIEFOQyBpcyBvbiwgc2V0dGluZyBBTkNfT0ZGX0FDS1xuIiwgX19mdW5jX18pOwotCQlzZXRfYml0KFdDRF9NQkhDX0FOQzBfT0ZGX0FDSywgJm1iaGMtPmhwaF9hbmNfc3RhdGUpOwotCQlzZXRfYml0KFdDRF9NQkhDX0FOQzFfT0ZGX0FDSywgJm1iaGMtPmhwaF9hbmNfc3RhdGUpOwotCQlpZiAobWJoYy0+bWJoY19jYi0+dXBkYXRlX2FuY19zdGF0ZSkgewotCQkJbWJoYy0+bWJoY19jYi0+dXBkYXRlX2FuY19zdGF0ZShtYmhjLT5jb2RlYywgZmFsc2UsIDApOwotCQkJbWJoYy0+bWJoY19jYi0+dXBkYXRlX2FuY19zdGF0ZShtYmhjLT5jb2RlYywgZmFsc2UsIDEpOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzIEFOQyBpcyBvZmZcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLX0KLQotaW50IHdjZF9tYmhjX2dldF9pbXBlZGFuY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLCB1aW50MzJfdCAqemwsCi0JCQl1aW50MzJfdCAqenIpCi17Ci0JKnpsID0gbWJoYy0+emw7Ci0JKnpyID0gbWJoYy0+enI7Ci0KLQlpZiAoKnpsICYmICp6cikKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX21iaGNfZ2V0X2ltcGVkYW5jZSk7Ci0KLXZvaWQgd2NkX21iaGNfaHNfZWxlY19pcnEoc3RydWN0IHdjZF9tYmhjICptYmhjLCBpbnQgaXJxX3R5cGUsCi0JCQkJIGJvb2wgZW5hYmxlKQotewotCWludCBpcnE7Ci0KLQlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKLQotCWlmIChpcnFfdHlwZSA9PSBXQ0RfTUJIQ19FTEVDX0hTX0lOUykKLQkJaXJxID0gbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfaW5zX2ludHI7Ci0JZWxzZSBpZiAoaXJxX3R5cGUgPT0gV0NEX01CSENfRUxFQ19IU19SRU0pCi0JCWlycSA9IG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyOwotCWVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IGlycV90eXBlOiAlZCwgZW5hYmxlOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBpcnFfdHlwZSwgZW5hYmxlKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2RlYnVnKCIlczogaXJxOiAlZCwgZW5hYmxlOiAlZCwgaW50cl9zdGF0dXM6JWx1XG4iLAotCQkgX19mdW5jX18sIGlycSwgZW5hYmxlLCBtYmhjLT5pbnRyX3N0YXR1cyk7Ci0JaWYgKCh0ZXN0X2JpdChpcnFfdHlwZSwgJm1iaGMtPmludHJfc3RhdHVzKSkgIT0gZW5hYmxlKSB7Ci0JCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLCBpcnEsIGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpCi0JCQlzZXRfYml0KGlycV90eXBlLCAmbWJoYy0+aW50cl9zdGF0dXMpOwotCQllbHNlCi0JCQljbGVhcl9iaXQoaXJxX3R5cGUsICZtYmhjLT5pbnRyX3N0YXR1cyk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19oc19lbGVjX2lycSk7Ci0KLXN0YXRpYyB2b2lkIHdjZF9tYmhjX3JlcG9ydF9wbHVnKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgaW50IGluc2VydGlvbiwKLQkJCQllbnVtIHNuZF9qYWNrX3R5cGVzIGphY2tfdHlwZSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlib29sIGlzX3BhX29uID0gZmFsc2U7Ci0JdTggZnNtX2VuID0gMDsKLQotCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlciBpbnNlcnRpb24gJWQgaHBoX3N0YXR1cyAleFxuIiwKLQkJIF9fZnVuY19fLCBpbnNlcnRpb24sIG1iaGMtPmhwaF9zdGF0dXMpOwotCWlmICghaW5zZXJ0aW9uKSB7Ci0JCS8qIFJlcG9ydCByZW1vdmFsICovCi0JCW1iaGMtPmhwaF9zdGF0dXMgJj0gfmphY2tfdHlwZTsKLQkJLyoKLQkJICogY2FuY2VsIHBvc3NpYmx5IHNjaGVkdWxlZCBidG4gd29yayBhbmQKLQkJICogcmVwb3J0IHJlbGVhc2UgaWYgd2UgcmVwb3J0ZWQgYnV0dG9uIHByZXNzCi0JCSAqLwotCQlpZiAod2NkX2NhbmNlbF9idG5fd29yayhtYmhjKSkgewotCQkJcHJfZGVidWcoIiVzOiBidXR0b24gcHJlc3MgaXMgY2FuY2VsZWRcbiIsIF9fZnVuY19fKTsKLQkJfSBlbHNlIGlmIChtYmhjLT5idXR0b25zX3ByZXNzZWQpIHsKLQkJCXByX2RlYnVnKCIlczogcmVsZWFzZSBvZiBidXR0b24gcHJlc3MlZFxuIiwKLQkJCQkgX19mdW5jX18sIGphY2tfdHlwZSk7Ci0JCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+YnV0dG9uX2phY2ssIDAsCi0JCQkJCSAgICBtYmhjLT5idXR0b25zX3ByZXNzZWQpOwotCQkJbWJoYy0+YnV0dG9uc19wcmVzc2VkICY9Ci0JCQkJfldDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0s7Ci0JCX0KLQotCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUpIHsKLQkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCkKLQkJCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JpYXNfY29udHJvbCgKLQkJCQkJCWNvZGVjLCBNSUNfQklBU18yLAotCQkJCQkJTUlDQl9ESVNBQkxFKTsKLQkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQotCQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYl9jdHJsX3Rocl9taWMoCi0JCQkJCQljb2RlYywKLQkJCQkJCU1JQ19CSUFTXzIsIGZhbHNlKTsKLQkJCWlmIChtYmhjLT5tYmhjX2NiLT5zZXRfbWljYmlhc192YWx1ZSkgewotCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKGNvZGVjKTsKLQkJCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTUlDQl9DVFJMLCAwKTsKLQkJCX0KLQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7Ci0JCX0KLQotCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOwotCQltYmhjLT56bCA9IG1iaGMtPnpyID0gMDsKLQkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgcmVtb3ZhbCAlZCgleClcbiIsIF9fZnVuY19fLAotCQkJIGphY2tfdHlwZSwgbWJoYy0+aHBoX3N0YXR1cyk7Ci0JCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJbWJoYy0+aHBoX3N0YXR1cywgV0NEX01CSENfSkFDS19NQVNLKTsKLQkJd2NkX21iaGNfc2V0X2FuZF90dXJub2ZmX2hwaF9wYWRhYyhtYmhjKTsKLQkJaHBocm9jcF9vZmZfcmVwb3J0KG1iaGMsIFNORF9KQUNLX09DX0hQSFIpOwotCQlocGhsb2NwX29mZl9yZXBvcnQobWJoYywgU05EX0pBQ0tfT0NfSFBITCk7Ci0JCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX05PTkU7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogUmVwb3J0IHJlbW92YWwgb2YgY3VycmVudCBqYWNrIHR5cGUuCi0JCSAqIEhlYWRwaG9uZSB0byBoZWFkc2V0IHNob3VsZG4ndCByZXBvcnQgaGVhZHBob25lCi0JCSAqIHJlbW92YWwuCi0JCSAqLwotCQlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlICYmCi0JCSAgICAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hJR0hfSFBIIHx8Ci0JCSAgICBqYWNrX3R5cGUgPT0gU05EX0pBQ0tfTElORU9VVCkgJiYKLQkJICAgIChtYmhjLT5ocGhfc3RhdHVzICYmIG1iaGMtPmhwaF9zdGF0dXMgIT0gamFja190eXBlKSkgewotCi0JCQlpZiAobWJoYy0+bWljYmlhc19lbmFibGUgJiYKLQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzID09IFNORF9KQUNLX0hFQURTRVQpIHsKLQkJCQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiaWFzX2NvbnRyb2wpCi0JCQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfbWljYmlhc19jb250cm9sKAotCQkJCQkJY29kZWMsIE1JQ19CSUFTXzIsCi0JCQkJCQlNSUNCX0RJU0FCTEUpOwotCQkJCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKQotCQkJCQltYmhjLT5tYmhjX2NiLT5tYmhjX21pY2JfY3RybF90aHJfbWljKAotCQkJCQkJY29kZWMsCi0JCQkJCQlNSUNfQklBU18yLCBmYWxzZSk7Ci0JCQkJaWYgKG1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKSB7Ci0JCQkJCW1iaGMtPm1iaGNfY2ItPnNldF9taWNiaWFzX3ZhbHVlKAotCQkJCQkJCWNvZGVjKTsKLQkJCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKAotCQkJCQkJCVdDRF9NQkhDX01JQ0JfQ1RSTCwgMCk7Ci0JCQkJfQotCQkJCW1iaGMtPm1pY2JpYXNfZW5hYmxlID0gZmFsc2U7Ci0JCQl9Ci0JCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOwotCQkJbWJoYy0+emwgPSBtYmhjLT56ciA9IDA7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyByZW1vdmFsICgleClcbiIsCi0JCQkJIF9fZnVuY19fLCBtYmhjLT5ocGhfc3RhdHVzKTsKLQkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJCSAgICAwLCBXQ0RfTUJIQ19KQUNLX01BU0spOwotCi0JCQlpZiAobWJoYy0+aHBoX3N0YXR1cyA9PSBTTkRfSkFDS19MSU5FT1VUKSB7Ci0KLQkJCQlwcl9kZWJ1ZygiJXM6IEVuYWJsZSBtaWNiaWFzXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJLyogRGlzYWJsZSBjdXJyZW50IHNvdXJjZSBhbmQgZW5hYmxlIG1pY2JpYXMgKi8KLQkJCQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9NQik7Ci0JCQkJcHJfZGVidWcoIiVzOiBzZXQgdXAgZWxlYyByZW1vdmFsIGRldGVjdGlvblxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJdXNsZWVwX3JhbmdlKDIwMCwgMjEwKTsKLQkJCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLAotCQkJCQkJICAgICBXQ0RfTUJIQ19FTEVDX0hTX1JFTSwKLQkJCQkJCSAgICAgdHJ1ZSk7Ci0JCQl9Ci0JCQltYmhjLT5ocGhfc3RhdHVzICY9IH4oU05EX0pBQ0tfSEVBRFNFVCB8Ci0JCQkJCQlTTkRfSkFDS19MSU5FT1VUIHwKLQkJCQkJCVNORF9KQUNLX0FOQ19IRUFEUEhPTkUgfAotCQkJCQkJU05EX0pBQ0tfVU5TVVBQT1JURUQpOwotCQl9Ci0KLQkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUICYmCi0JCQlqYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFBIT05FKQotCQkJbWJoYy0+aHBoX3N0YXR1cyAmPSB+U05EX0pBQ0tfSEVBRFNFVDsKLQotCQkvKiBSZXBvcnQgaW5zZXJ0aW9uICovCi0JCWlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFBIT05FKQotCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FOwotCQllbHNlIGlmIChqYWNrX3R5cGUgPT0gU05EX0pBQ0tfVU5TVVBQT1JURUQpCi0JCQltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVA7Ci0JCWVsc2UgaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEU0VUKSB7Ci0JCQltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUOwotCQkJbWJoYy0+amlmZmllc19hdHJlcG9ydCA9IGppZmZpZXM7Ci0JCX0gZWxzZSBpZiAoamFja190eXBlID09IFNORF9KQUNLX0xJTkVPVVQpIHsKLQkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOwotCQl9IGVsc2UgaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19BTkNfSEVBRFBIT05FKQotCQkJbWJoYy0+Y3VycmVudF9wbHVnID0gTUJIQ19QTFVHX1RZUEVfQU5DX0hFQURQSE9ORTsKLQotCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3BhX29uX3N0YXR1cykKLQkJCWlzX3BhX29uID0gbWJoYy0+bWJoY19jYi0+aHBoX3BhX29uX3N0YXR1cyhjb2RlYyk7Ci0KLQkJaWYgKG1iaGMtPmltcGVkYW5jZV9kZXRlY3QgJiYKLQkJCW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlICYmCi0JCQkobWJoYy0+bWJoY19jZmctPmxpbmVpbl90aCAhPSAwKSAmJgotCQkJKCFpc19wYV9vbikpIHsKLQkJCS8qIFNldCBNVVhfQ1RMIHRvIEFVVE8gZm9yIFotZGV0ICovCi0JCQlXQ0RfTUJIQ19SRUdfUkVBRChXQ0RfTUJIQ19GU01fRU4sIGZzbV9lbik7Ci0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAwKTsKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NVVhfQ1RMLAotCQkJCQkJIE1VWF9DVExfQVVUTyk7Ci0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRlNNX0VOLCAxKTsKLQkJCW1iaGMtPm1iaGNfY2ItPmNvbXB1dGVfaW1wZWRhbmNlKG1iaGMsCi0JCQkJCSZtYmhjLT56bCwgJm1iaGMtPnpyKTsKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sCi0JCQkJCQkgZnNtX2VuKTsKLQkJCWlmICgobWJoYy0+emwgPiBtYmhjLT5tYmhjX2NmZy0+bGluZWluX3RoICYmCi0JCQkJbWJoYy0+emwgPCBNQVhfSU1QRUQpICYmCi0JCQkJKG1iaGMtPnpyID4gbWJoYy0+bWJoY19jZmctPmxpbmVpbl90aCAmJgotCQkJCSBtYmhjLT56ciA8IE1BWF9JTVBFRCkgJiYKLQkJCQkoamFja190eXBlID09IFNORF9KQUNLX0hFQURQSE9ORSkpIHsKLQkJCQlqYWNrX3R5cGUgPSBTTkRfSkFDS19MSU5FT1VUOwotCQkJCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX0hJR0hfSFBIOwotCQkJCWlmIChtYmhjLT5ocGhfc3RhdHVzKSB7Ci0JCQkJCW1iaGMtPmhwaF9zdGF0dXMgJj0gfihTTkRfSkFDS19IRUFEU0VUIHwKLQkJCQkJCQlTTkRfSkFDS19MSU5FT1VUIHwKLQkJCQkJCQlTTkRfSkFDS19VTlNVUFBPUlRFRCk7Ci0JCQkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsCi0JCQkJCQkJJm1iaGMtPmhlYWRzZXRfamFjaywKLQkJCQkJCQltYmhjLT5ocGhfc3RhdHVzLAotCQkJCQkJCVdDRF9NQkhDX0pBQ0tfTUFTSyk7Ci0JCQkJfQotCQkJCXByX2RlYnVnKCIlczogTWFya2luZyBqYWNrIHR5cGUgYXMgU05EX0pBQ0tfTElORU9VVFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0JCX0KLQotCQltYmhjLT5ocGhfc3RhdHVzIHw9IGphY2tfdHlwZTsKLQotCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBpbnNlcnRpb24gJWQoJXgpXG4iLCBfX2Z1bmNfXywKLQkJCSBqYWNrX3R5cGUsIG1iaGMtPmhwaF9zdGF0dXMpOwotCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+aGVhZHNldF9qYWNrLAotCQkJCSAgICAobWJoYy0+aHBoX3N0YXR1cyB8IFNORF9KQUNLX01FQ0hBTklDQUwpLAotCQkJCSAgICBXQ0RfTUJIQ19KQUNLX01BU0spOwotCQl3Y2RfbWJoY19jbHJfYW5kX3R1cm5vbl9ocGhfcGFkYWMobWJoYyk7Ci0JfQotCXByX2RlYnVnKCIlczogbGVhdmUgaHBoX3N0YXR1cyAleFxuIiwgX19mdW5jX18sIG1iaGMtPmhwaF9zdGF0dXMpOwotfQotCi12b2lkIHdjZF9tYmhjX2VsZWNfaHNfcmVwb3J0X3VucGx1ZyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JLyogY2FuY2VsIHBlbmRpbmcgYnV0dG9uIHByZXNzICovCi0JaWYgKHdjZF9jYW5jZWxfYnRuX3dvcmsobWJoYykpCi0JCXByX2RlYnVnKCIlczogYnV0dG9uIHByZXNzIGlzIGNhbmNlbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JLyogY2FuY2VsIGNvcnJlY3Qgd29yayBmdW5jdGlvbiAqLwotCWlmIChtYmhjLT5tYmhjX2ZuLT53Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKQotCQltYmhjLT5tYmhjX2ZuLT53Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKG1iaGMsCi0JCQkJCQkmbWJoYy0+Y29ycmVjdF9wbHVnX3N3Y2gpOwotCWVsc2UKLQkJcHJfaW5mbygiJXM6IGhzX2RldGVjdF9wbHVnIHdvcmsgbm90IGNhbmNlbGxlZFxuIiwgX19mdW5jX18pOwotCi0JcHJfZGVidWcoIiVzOiBSZXBvcnQgZXh0ZW5zaW9uIGNhYmxlXG4iLCBfX2Z1bmNfXyk7Ci0Jd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfTElORU9VVCk7Ci0JLyoKLQkgKiBJZiBQQSBpcyBlbmFibGVkIEhQSEwgc2NobWl0dCB0cmlnZ2VyIGNhbgotCSAqIGJlIHVucmVsaWFibGUsIG1ha2Ugc3VyZSB0byBkaXNhYmxlIGl0Ci0JICovCi0JaWYgKHRlc3RfYml0KFdDRF9NQkhDX0VWRU5UX1BBX0hQSEwsCi0JCSZtYmhjLT5ldmVudF9zdGF0ZSkpCi0JCXdjZF9tYmhjX3NldF9hbmRfdHVybm9mZl9ocGhfcGFkYWMobWJoYyk7Ci0JLyoKLQkgKiBEaXNhYmxlIEhQSEwgdHJpZ2dlciBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMuCi0JICogU2V0dXAgZm9yIGluc2VydGlvbiBkZXRlY3Rpb24uCi0JICovCi0Jd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19SRU0sCi0JCQkgICAgIGZhbHNlKTsKLQl3Y2RfZW5hYmxlX2N1cnJfbWljYmlhcyhtYmhjLCBXQ0RfTUJIQ19FTl9OT05FKTsKLQkvKiBEaXNhYmxlIEhXIEZTTSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLCAzKTsKLQotCS8qIFNldCB0aGUgZGV0ZWN0aW9uIHR5cGUgYXBwcm9wcmlhdGVseSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwgMSk7Ci0Jd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19JTlMsCi0JCQkgICAgIHRydWUpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19lbGVjX2hzX3JlcG9ydF91bnBsdWcpOwotCi12b2lkIHdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQkgICBlbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpCi17Ci0JYm9vbCBhbmNfbWljX2ZvdW5kID0gZmFsc2U7Ci0JZW51bSBzbmRfamFja190eXBlcyBqYWNrX3R5cGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyIGN1cnJlbnRfcGx1ZyglZCkgbmV3X3BsdWcoJWQpXG4iLAotCQkgX19mdW5jX18sIG1iaGMtPmN1cnJlbnRfcGx1ZywgcGx1Z190eXBlKTsKLQotCVdDRF9NQkhDX1JTQ19BU1NFUlRfTE9DS0VEKG1iaGMpOwotCi0JaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBwbHVnX3R5cGUpIHsKLQkJcHJfZGVidWcoIiVzOiBjYWJsZSBhbHJlYWR5IHJlcG9ydGVkLCBleGl0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURQSE9ORSkgewotCQkvKgotCQkgKiBOb3RoaW5nIHdhcyByZXBvcnRlZCBwcmV2aW91c2x5Ci0JCSAqIHJlcG9ydCBhIGhlYWRwaG9uZSBvciB1bnN1cHBvcnRlZAotCQkgKi8KLQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfSEVBRFBIT05FKTsKLQl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9HTkRfTUlDX1NXQVApIHsKLQkJaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUpCi0JCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19IRUFEUEhPTkUpOwotCQlpZiAobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX0hFQURTRVQpCi0JCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAwLCBTTkRfSkFDS19IRUFEU0VUKTsKLQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgU05EX0pBQ0tfVU5TVVBQT1JURUQpOwotCX0gZWxzZSBpZiAocGx1Z190eXBlID09IE1CSENfUExVR19UWVBFX0hFQURTRVQpIHsKLQkJaWYgKG1iaGMtPm1iaGNfY2ZnLT5lbmFibGVfYW5jX21pY19kZXRlY3QgJiYKLQkJICAgIG1iaGMtPm1iaGNfZm4tPndjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlKQotCQkJYW5jX21pY19mb3VuZCA9Ci0JCQltYmhjLT5tYmhjX2ZuLT53Y2RfbWJoY19kZXRlY3RfYW5jX3BsdWdfdHlwZShtYmhjKTsKLQkJamFja190eXBlID0gU05EX0pBQ0tfSEVBRFNFVDsKLQkJaWYgKGFuY19taWNfZm91bmQpCi0JCQlqYWNrX3R5cGUgPSBTTkRfSkFDS19BTkNfSEVBRFBIT05FOwotCi0JCS8qCi0JCSAqIElmIEhlYWRwaG9uZSB3YXMgcmVwb3J0ZWQgcHJldmlvdXNseSwgdGhpcyB3aWxsCi0JCSAqIG9ubHkgcmVwb3J0IHRoZSBtaWMgbGluZQotCQkgKi8KLQkJd2NkX21iaGNfcmVwb3J0X3BsdWcobWJoYywgMSwgamFja190eXBlKTsKLQl9IGVsc2UgaWYgKHBsdWdfdHlwZSA9PSBNQkhDX1BMVUdfVFlQRV9ISUdIX0hQSCkgewotCQlpZiAobWJoYy0+bWJoY19jZmctPmRldGVjdF9leHRuX2NhYmxlKSB7Ci0JCQkvKiBIaWdoIGltcGVkYW5jZSBkZXZpY2UgZm91bmQuIFJlcG9ydCBhcyBMSU5FT1VUICovCi0JCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAxLCBTTkRfSkFDS19MSU5FT1VUKTsKLQkJCXByX2RlYnVnKCIlczogc2V0dXAgbWljIHRyaWdnZXIgZm9yIGZ1cnRoZXIgZGV0ZWN0aW9uXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0KLQkJCS8qIERpc2FibGUgSFcgRlNNIGFuZCBjdXJyZW50IHNvdXJjZSAqLwotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7Ci0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAwKTsKLQkJCS8qIFNldHVwIGZvciBpbnNlcnRpb24gZGV0ZWN0aW9uICovCi0JCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfREVURUNUSU9OX1RZUEUsCi0JCQkJCQkgMSk7Ci0JCQkvKgotCQkJICogRW5hYmxlIEhQSEwgdHJpZ2dlciBhbmQgTUlDIFNjaG1pdHQgdHJpZ2dlcnMKLQkJCSAqIGFuZCByZXF1ZXN0IGZvciBlbGVjIGluc2VydGlvbiBpbnRlcnJ1cHRzCi0JCQkgKi8KLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDLAotCQkJCQkJIDMpOwotCQkJd2NkX21iaGNfaHNfZWxlY19pcnEobWJoYywgV0NEX01CSENfRUxFQ19IU19JTlMsCi0JCQkJCSAgICAgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAxLCBTTkRfSkFDS19MSU5FT1VUKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVdBUk4oMSwgIlVuZXhwZWN0ZWQgY3VycmVudCBwbHVnX3R5cGUgJWQsIHBsdWdfdHlwZSAlZFxuIiwKLQkJICAgICBtYmhjLT5jdXJyZW50X3BsdWcsIHBsdWdfdHlwZSk7Ci0JfQotZXhpdDoKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KTsKLQotc3RhdGljIHZvaWQgd2NkX21iaGNfc3djaF9pcnFfaGFuZGxlcihzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JYm9vbCBkZXRlY3Rpb25fdHlwZSA9IDA7Ci0JYm9vbCBtaWNiaWFzMSA9IGZhbHNlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCWVudW0gc25kX2phY2tfdHlwZXMgamFja190eXBlOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JbWJoYy0+aW5fc3djaF9pcnFfaGFuZGxlciA9IHRydWU7Ci0KLQkvKiBjYW5jZWwgcGVuZGluZyBidXR0b24gcHJlc3MgKi8KLQlpZiAod2NkX2NhbmNlbF9idG5fd29yayhtYmhjKSkKLQkJcHJfZGVidWcoIiVzOiBidXR0b24gcHJlc3MgaXMgY2FuY2VsZWRcbiIsIF9fZnVuY19fKTsKLQotCVdDRF9NQkhDX1JFR19SRUFEKFdDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUsIGRldGVjdGlvbl90eXBlKTsKLQotCS8qIFNldCB0aGUgZGV0ZWN0aW9uIHR5cGUgYXBwcm9wcmlhdGVseSAqLwotCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19NRUNIX0RFVEVDVElPTl9UWVBFLAotCQkJCSAhZGV0ZWN0aW9uX3R5cGUpOwotCi0JcHJfZGVidWcoIiVzOiBtYmhjLT5jdXJyZW50X3BsdWc6ICVkIGRldGVjdGlvbl90eXBlOiAlZFxuIiwgX19mdW5jX18sCi0JCQltYmhjLT5jdXJyZW50X3BsdWcsIGRldGVjdGlvbl90eXBlKTsKLQlpZiAobWJoYy0+bWJoY19mbi0+d2NkX2NhbmNlbF9oc19kZXRlY3RfcGx1ZykKLQkJbWJoYy0+bWJoY19mbi0+d2NkX2NhbmNlbF9oc19kZXRlY3RfcGx1ZyhtYmhjLAotCQkJCQkJJm1iaGMtPmNvcnJlY3RfcGx1Z19zd2NoKTsKLQllbHNlCi0JCXByX2luZm8oIiVzOiBoc19kZXRlY3RfcGx1ZyB3b3JrIG5vdCBjYW5jZWxsZWRcbiIsIF9fZnVuY19fKTsKLQotCWlmIChtYmhjLT5tYmhjX2NiLT5taWNiaWFzX2VuYWJsZV9zdGF0dXMpCi0JCW1pY2JpYXMxID0gbWJoYy0+bWJoY19jYi0+bWljYmlhc19lbmFibGVfc3RhdHVzKG1iaGMsCi0JCQkJCQlNSUNfQklBU18xKTsKLQotCWlmICgobWJoYy0+Y3VycmVudF9wbHVnID09IE1CSENfUExVR19UWVBFX05PTkUpICYmCi0JICAgIGRldGVjdGlvbl90eXBlKSB7Ci0JCS8qIE1ha2Ugc3VyZSBNQVNURVJfQklBU19DVEwgaXMgZW5hYmxlZCAqLwotCQltYmhjLT5tYmhjX2NiLT5tYmhjX2JpYXMoY29kZWMsIHRydWUpOwotCi0JCWlmIChtYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwpCi0JCQltYmhjLT5tYmhjX2NiLT5tYmhjX2NvbW1vbl9taWNiX2N0cmwoY29kZWMsCi0JCQkJCU1CSENfQ09NTU9OX01JQ0JfVEFJTF9DVVJSLCB0cnVlKTsKLQotCQlpZiAoIW1iaGMtPm1iaGNfY2ZnLT5oc19leHRfbWljYmlhcyAmJgotCQkgICAgIG1iaGMtPm1iaGNfY2ItPm1pY2JfaW50ZXJuYWwpCi0JCQkvKgotCQkJICogRW5hYmxlIFR4MiBSQmlhcyBpZiB0aGUgaGVhZHNldAotCQkJICogaXMgdXNpbmcgaW50ZXJuYWwgbWljYmlhcwotCQkJICovCi0JCQltYmhjLT5tYmhjX2NiLT5taWNiX2ludGVybmFsKGNvZGVjLCAxLCB0cnVlKTsKLQotCQkvKiBSZW1vdmUgbWljYmlhcyBwdWxsZG93biAqLwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfUFVMTERPV05fQ1RSTCwgMCk7Ci0JCS8qIEFwcGx5IHRyaW0gaWYgbmVlZGVkIG9uIHRoZSBkZXZpY2UgKi8KLQkJaWYgKG1iaGMtPm1iaGNfY2ItPnRyaW1fYnRuX3JlZykKLQkJCW1iaGMtPm1iaGNfY2ItPnRyaW1fYnRuX3JlZyhjb2RlYyk7Ci0JCS8qIEVuYWJsZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSB0byBtaWNiaWFzIGlmIHByZXNlbnQgKi8KLQkJaWYgKG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UpCi0JCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKG1iaGMsIHRydWUpOwotCQltYmhjLT5idG5fcHJlc3NfaW50ciA9IGZhbHNlOwotCQltYmhjLT5pc19idG5fcHJlc3MgPSBmYWxzZTsKLQkJaWYgKG1iaGMtPm1iaGNfZm4pCi0JCQltYmhjLT5tYmhjX2ZuLT53Y2RfbWJoY19kZXRlY3RfcGx1Z190eXBlKG1iaGMpOwotCX0gZWxzZSBpZiAoKG1iaGMtPmN1cnJlbnRfcGx1ZyAhPSBNQkhDX1BMVUdfVFlQRV9OT05FKQotCQkJJiYgIWRldGVjdGlvbl90eXBlKSB7Ci0JCS8qIERpc2FibGUgZXh0ZXJuYWwgdm9sdGFnZSBzb3VyY2UgdG8gbWljYmlhcyBpZiBwcmVzZW50ICovCi0JCWlmIChtYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKQotCQkJbWJoYy0+bWJoY19jYi0+ZW5hYmxlX21iX3NvdXJjZShtYmhjLCBmYWxzZSk7Ci0JCS8qIERpc2FibGUgSFcgRlNNICovCi0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19GU01fRU4sIDApOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfQlROX0lTUkNfQ1RMLCAwKTsKLQkJaWYgKG1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybCkKLQkJCW1iaGMtPm1iaGNfY2ItPm1iaGNfY29tbW9uX21pY2JfY3RybChjb2RlYywKLQkJCQkJTUJIQ19DT01NT05fTUlDQl9UQUlMX0NVUlIsIGZhbHNlKTsKLQotCQlpZiAobWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKQotCQkJbWJoYy0+bWJoY19jYi0+c2V0X2NhcF9tb2RlKGNvZGVjLCBtaWNiaWFzMSwgZmFsc2UpOwotCi0JCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gZmFsc2U7Ci0JCW1iaGMtPmlzX2J0bl9wcmVzcyA9IGZhbHNlOwotCQlzd2l0Y2ggKG1iaGMtPmN1cnJlbnRfcGx1ZykgewotCQljYXNlIE1CSENfUExVR19UWVBFX0hFQURQSE9ORToKLQkJCWphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURQSE9ORTsKLQkJCWJyZWFrOwotCQljYXNlIE1CSENfUExVR19UWVBFX0dORF9NSUNfU1dBUDoKLQkJCWphY2tfdHlwZSA9IFNORF9KQUNLX1VOU1VQUE9SVEVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJIQ19QTFVHX1RZUEVfSEVBRFNFVDoKLQkJCS8qIG1ha2Ugc3VyZSB0byB0dXJuIG9mZiBSYmlhcyAqLwotCQkJaWYgKG1iaGMtPm1iaGNfY2ItPm1pY2JfaW50ZXJuYWwpCi0JCQkJbWJoYy0+bWJoY19jYi0+bWljYl9pbnRlcm5hbChjb2RlYywgMSwgZmFsc2UpOwotCQkJLyogUHVsbGRvd24gbWljYmlhcyAqLwotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX1BVTExET1dOX0NUUkwsIDEpOwotCQkJamFja190eXBlID0gU05EX0pBQ0tfSEVBRFNFVDsKLQkJCWJyZWFrOwotCQljYXNlIE1CSENfUExVR19UWVBFX0hJR0hfSFBIOgotCQkJbWJoYy0+aXNfZXh0bl9jYWJsZSA9IGZhbHNlOwotCQkJamFja190eXBlID0gU05EX0pBQ0tfTElORU9VVDsKLQkJCWJyZWFrOwotCQljYXNlIE1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkU6Ci0JCQlqYWNrX3R5cGUgPSBTTkRfSkFDS19BTkNfSEVBRFBIT05FOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9pbmZvKCIlczogSW52YWxpZCBjdXJyZW50IHBsdWc6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBtYmhjLT5jdXJyZW50X3BsdWcpOwotCQkJamFja190eXBlID0gU05EX0pBQ0tfVU5TVVBQT1JURUQ7Ci0JCQlicmVhazsKLQkJfQotCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX1JFTSwgZmFsc2UpOwotCQl3Y2RfbWJoY19oc19lbGVjX2lycShtYmhjLCBXQ0RfTUJIQ19FTEVDX0hTX0lOUywgZmFsc2UpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfREVURUNUSU9OX1RZUEUsIDEpOwotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywgMCk7Ci0JCW1iaGMtPmV4dG5fY2FibGVfaHBoX3JlbSA9IGZhbHNlOwotCQl3Y2RfbWJoY19yZXBvcnRfcGx1ZyhtYmhjLCAwLCBqYWNrX3R5cGUpOwotCi0JfSBlbHNlIGlmICghZGV0ZWN0aW9uX3R5cGUpIHsKLQkJLyogRGlzYWJsZSBleHRlcm5hbCB2b2x0YWdlIHNvdXJjZSB0byBtaWNiaWFzIGlmIHByZXNlbnQgKi8KLQkJaWYgKG1iaGMtPm1iaGNfY2ItPmVuYWJsZV9tYl9zb3VyY2UpCi0JCQltYmhjLT5tYmhjX2NiLT5lbmFibGVfbWJfc291cmNlKG1iaGMsIGZhbHNlKTsKLQkJLyogRGlzYWJsZSBIVyBGU00gKi8KLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0ZTTV9FTiwgMCk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsIDApOwotCQltYmhjLT5leHRuX2NhYmxlX2hwaF9yZW0gPSBmYWxzZTsKLQl9Ci0KLQltYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyID0gZmFsc2U7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19tZWNoX3BsdWdfZGV0ZWN0X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCWludCByID0gSVJRX0hBTkRMRUQ7Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjID0gZGF0YTsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQlpZiAodW5saWtlbHkoKG1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgdHJ1ZSkpID09IGZhbHNlKSkgewotCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGhvbGQgc3VzcGVuZFxuIiwgX19mdW5jX18pOwotCQlyID0gSVJRX05PTkU7Ci0JfSBlbHNlIHsKLQkJLyogQ2FsbCBoYW5kbGVyICovCi0JCXdjZF9tYmhjX3N3Y2hfaXJxX2hhbmRsZXIobWJoYyk7Ci0JCW1iaGMtPm1iaGNfY2ItPmxvY2tfc2xlZXAobWJoYywgZmFsc2UpOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGxlYXZlICVkXG4iLCBfX2Z1bmNfXywgcik7Ci0JcmV0dXJuIHI7Ci19Ci0KLWludCB3Y2RfbWJoY19nZXRfYnV0dG9uX21hc2soc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWludCBtYXNrID0gMDsKLQlpbnQgYnRuOwotCi0JYnRuID0gbWJoYy0+bWJoY19jYi0+bWFwX2J0bl9jb2RlX3RvX251bShtYmhjLT5jb2RlYyk7Ci0KLQlzd2l0Y2ggKGJ0bikgewotCWNhc2UgMDoKLQkJbWFzayA9IFNORF9KQUNLX0JUTl8wOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCW1hc2sgPSBTTkRfSkFDS19CVE5fMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQltYXNrID0gU05EX0pBQ0tfQlROXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbWFzayA9IFNORF9KQUNLX0JUTl8zOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCW1hc2sgPSBTTkRfSkFDS19CVE5fNDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQltYXNrID0gU05EX0pBQ0tfQlROXzU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBtYXNrOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19nZXRfYnV0dG9uX21hc2spOwotCi1zdGF0aWMgdm9pZCB3Y2RfYnRuX2xwcmVzc19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjOwotCXMxNiBidG5fcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCW1iaGMgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgbWJoY19idG5fZHdvcmspOwotCi0JV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfQlROX1JFU1VMVCwgYnRuX3Jlc3VsdCk7Ci0JaWYgKG1iaGMtPmN1cnJlbnRfcGx1ZyA9PSBNQkhDX1BMVUdfVFlQRV9IRUFEU0VUKSB7Ci0JCXByX2RlYnVnKCIlczogUmVwb3J0aW5nIGxvbmcgYnV0dG9uIHByZXNzIGV2ZW50LCBidG5fcmVzdWx0OiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgYnRuX3Jlc3VsdCk7Ci0JCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5idXR0b25famFjaywKLQkJCQltYmhjLT5idXR0b25zX3ByZXNzZWQsIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7Ci0JfQotCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLQltYmhjLT5tYmhjX2NiLT5sb2NrX3NsZWVwKG1iaGMsIGZhbHNlKTsKLX0KLQotc3RhdGljIGJvb2wgd2NkX21iaGNfZndfdmFsaWRhdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCi17Ci0JdTMyIGNmZ19vZmZzZXQ7Ci0Jc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fY2ZnOwotCXN0cnVjdCBmaXJtd2FyZV9jYWwgZnc7Ci0KLQlmdy5kYXRhID0gKHZvaWQgKilkYXRhOwotCWZ3LnNpemUgPSBzaXplOwotCi0JaWYgKGZ3LnNpemUgPCBXQ0RfTUJIQ19DQUxfTUlOX1NJWkUpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qCi0JICogUHJldmlvdXMgY2hlY2sgZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIGVub3VnaCBmdyBkYXRhIHVwCi0JICogdG8gbnVtX2J0bgotCSAqLwotCWJ0bl9jZmcgPSBXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoZncuZGF0YSk7Ci0JY2ZnX29mZnNldCA9ICh1MzIpICgodm9pZCAqKSBidG5fY2ZnIC0gKHZvaWQgKikgZncuZGF0YSk7Ci0JaWYgKGZ3LnNpemUgPCAoY2ZnX29mZnNldCArIFdDRF9NQkhDX0NBTF9CVE5fU1ooYnRuX2NmZykpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHdjZF9tYmhjX2J0bl9wcmVzc19oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjID0gZGF0YTsKLQlpbnQgbWFzazsKLQl1bnNpZ25lZCBsb25nIG1zZWNfdmFsOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCWNvbXBsZXRlKCZtYmhjLT5idG5fcHJlc3NfY29tcGwpOwotCVdDRF9NQkhDX1JTQ19MT0NLKG1iaGMpOwotCXdjZF9jYW5jZWxfYnRuX3dvcmsobWJoYyk7Ci0JaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgewotCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3cgIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWJoYy0+aXNfYnRuX3ByZXNzID0gdHJ1ZTsKLQltc2VjX3ZhbCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIG1iaGMtPmppZmZpZXNfYXRyZXBvcnQpOwotCXByX2RlYnVnKCIlczogbXNlY192YWwgPSAlbGRcbiIsIF9fZnVuY19fLCBtc2VjX3ZhbCk7Ci0JaWYgKG1zZWNfdmFsIDwgTUJIQ19CVVRUT05fUFJFU1NfVEhSRVNIT0xEX01JTikgewotCQlwcl9kZWJ1ZygiJXM6IFRvbyBzaG9ydCwgaWdub3JlIGJ1dHRvbiBwcmVzc1xuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogSWYgc3dpdGNoIGludGVycnVwdCBhbHJlYWR5IGtpY2tlZCBpbiwgaWdub3JlIGJ1dHRvbiBwcmVzcyAqLwotCWlmIChtYmhjLT5pbl9zd2NoX2lycV9oYW5kbGVyKSB7Ci0JCXByX2RlYnVnKCIlczogU3d0aWNoIGxldmVsIGNoYW5nZWQsIGlnbm9yZSBidXR0b24gcHJlc3NcbiIsCi0JCQkgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCW1hc2sgPSB3Y2RfbWJoY19nZXRfYnV0dG9uX21hc2sobWJoYyk7Ci0JaWYgKG1hc2sgPT0gU05EX0pBQ0tfQlROXzApCi0JCW1iaGMtPmJ0bl9wcmVzc19pbnRyID0gdHJ1ZTsKLQotCWlmIChtYmhjLT5jdXJyZW50X3BsdWcgIT0gTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCkgewotCQlwcl9kZWJ1ZygiJXM6IFBsdWcgaXNuJ3QgaGVhZHNldCwgaWdub3JlIGJ1dHRvbiBwcmVzc1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbWJoYy0+YnV0dG9uc19wcmVzc2VkIHw9IG1hc2s7Ci0JbWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCB0cnVlKTsKLQlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtYmhjLT5tYmhjX2J0bl9kd29yaywKLQkJCQltc2Vjc190b19qaWZmaWVzKDQwMCkpID09IDApIHsKLQkJV0FSTigxLCAiQnV0dG9uIHByZXNzZWQgdHdpY2Ugd2l0aG91dCByZWxlYXNlIGV2ZW50XG4iKTsKLQkJbWJoYy0+bWJoY19jYi0+bG9ja19zbGVlcChtYmhjLCBmYWxzZSk7Ci0JfQotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19yZWxlYXNlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOwotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JaWYgKHdjZF9zd2NoX2xldmVsX3JlbW92ZShtYmhjKSkgewotCQlwcl9kZWJ1ZygiJXM6IFN3aXRjaCBsZXZlbCBpcyBsb3cgIiwgX19mdW5jX18pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKG1iaGMtPmlzX2J0bl9wcmVzcykgewotCQltYmhjLT5pc19idG5fcHJlc3MgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IFRoaXMgcmVsZWFzZSBpcyBmb3IgZmFrZSBidG4gcHJlc3NcbiIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qCi0JICogSWYgY3VycmVudCBwbHVnIGlzIGhlYWRwaG9uZSB0aGVuIHRoZXJlIGlzIG5vIGNoYW5jZSB0bwotCSAqIGdldCBidG4gcmVsZWFzZSBpbnRlcnJ1cHQsIHNvIGNvbm5lY3RlZCBjYWJsZSBzaG91bGQgYmUKLQkgKiBoZWFkc2V0IG5vdCBoZWFkcGhvbmUuCi0JICogRm9yIEFEQyBNQkhDLCBBRENfQ09NUExFVEUgaW50ZXJydXB0IHdpbGwgYmUgZ2VuZXJhdGVkCi0JICogaW4gdGhpcyBjYXNlLiBTbyBza2lwIHRoZSBjaGVjayBoZXJlLgotCSAqLwotCWlmIChtYmhjLT5tYmhjX2RldGVjdGlvbl9sb2dpYyA9PSBXQ0RfREVURUNUSU9OX0xFR0FDWSAmJgotCQltYmhjLT5jdXJyZW50X3BsdWcgPT0gTUJIQ19QTFVHX1RZUEVfSEVBRFBIT05FKSB7Ci0JCXdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KG1iaGMsIE1CSENfUExVR19UWVBFX0hFQURTRVQpOwotCQlnb3RvIGV4aXQ7Ci0KLQl9Ci0JaWYgKG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCAmIFdDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0spIHsKLQkJcmV0ID0gd2NkX2NhbmNlbF9idG5fd29yayhtYmhjKTsKLQkJaWYgKHJldCA9PSAwKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBsb25nIGJ1dHRvbiByZWxlYXNlIGV2ZW50XG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQl3Y2RfbWJoY19qYWNrX3JlcG9ydChtYmhjLCAmbWJoYy0+YnV0dG9uX2phY2ssCi0JCQkJCTAsIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWJoYy0+aW5fc3djaF9pcnFfaGFuZGxlcikgewotCQkJCXByX2RlYnVnKCIlczogU3dpdGNoIGlycSBraWNrZWQgaW4sIGlnbm9yZVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IFJlcG9ydGluZyBidG4gcHJlc3NcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJd2NkX21iaGNfamFja19yZXBvcnQobWJoYywKLQkJCQkJCSAgICAgJm1iaGMtPmJ1dHRvbl9qYWNrLAotCQkJCQkJICAgICBtYmhjLT5idXR0b25zX3ByZXNzZWQsCi0JCQkJCQkgICAgIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7Ci0JCQkJcHJfZGVidWcoIiVzOiBSZXBvcnRpbmcgYnRuIHJlbGVhc2VcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJd2NkX21iaGNfamFja19yZXBvcnQobWJoYywKLQkJCQkJCSZtYmhjLT5idXR0b25famFjaywKLQkJCQkJCTAsIG1iaGMtPmJ1dHRvbnNfcHJlc3NlZCk7Ci0JCQl9Ci0JCX0KLQkJbWJoYy0+YnV0dG9uc19wcmVzc2VkICY9IH5XQ0RfTUJIQ19KQUNLX0JVVFRPTl9NQVNLOwotCX0KLWV4aXQ6Ci0JcHJfZGVidWcoIiVzOiBsZWF2ZVxuIiwgX19mdW5jX18pOwotCVdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX21iaGNfaHBobF9vY3BfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjID0gZGF0YTsKLQlpbnQgdmFsOwotCi0JcHJfZGVidWcoIiVzOiByZWNlaXZlZCBIUEhMIE9DUCBpcnFcbiIsIF9fZnVuY19fKTsKLQlpZiAobWJoYykgewotCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KSB7Ci0JCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KG1iaGMpKSB7Ci0JCQkJV0NEX01CSENfUkVHX1JFQUQoV0NEX01CSENfSFBIUl9PQ1BfU1RBVFVTLAotCQkJCQkJICB2YWwpOwotCQkJCWlmICgodmFsICE9IC1FSU5WQUwpICYmIHZhbCkKLQkJCQkJbWJoYy0+aXNfaHBoX29jcF9wZW5kaW5nID0gdHJ1ZTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobWJoYy0+aHBobG9jcF9jbnQgPCBPQ1BfQVRURU1QVCkgewotCQkJbWJoYy0+aHBobG9jcF9jbnQrKzsKLQkJCXByX2RlYnVnKCIlczogcmV0cnksIGhwaGxvY3BfY250OiAlZFxuIiwgX19mdW5jX18sCi0JCQkJIG1iaGMtPmhwaGxvY3BfY250KTsKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAwKTsKLQkJCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAxKTsKLQkJfSBlbHNlIHsKLQkJCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCQkJICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKLQkJCQkJCSAgIGZhbHNlKTsKLQkJCW1iaGMtPmhwaF9zdGF0dXMgfD0gU05EX0pBQ0tfT0NfSFBITDsKLQkJCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJCSAgICBtYmhjLT5ocGhfc3RhdHVzLAotCQkJCQkgICAgV0NEX01CSENfSkFDS19NQVNLKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IEJhZCB3Y2Q5eHh4X3NwbWkgcHJpdmF0ZSBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JfQotZG9uZToKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfbWJoY19ocGhyX29jcF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBkYXRhOwotCi0JcHJfZGVidWcoIiVzOiByZWNlaXZlZCBIUEhSIE9DUCBpcnFcbiIsIF9fZnVuY19fKTsKLQotCWlmICghbWJoYykgewotCQlwcl9lcnIoIiVzOiBCYWQgbWJoYyBwcml2YXRlIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChtYmhjLT5pc19ocGhfb2NwX3BlbmRpbmcpIHsKLQkJbWJoYy0+aXNfaHBoX29jcF9wZW5kaW5nID0gZmFsc2U7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3JlZ2lzdGVyX3JlY292ZXJ5KSB7Ci0JCWlmIChtYmhjLT5tYmhjX2NiLT5ocGhfcmVnaXN0ZXJfcmVjb3ZlcnkobWJoYykpCi0JCQkvKiByZWdpc3RlciBjb3JydXB0aW9uLCBoZW5jZSByZXNldCByZWdpc3RlcnMgKi8KLQkJCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKG1iaGMtPmhwaHJvY3BfY250IDwgT0NQX0FUVEVNUFQpIHsKLQkJbWJoYy0+aHBocm9jcF9jbnQrKzsKLQkJcHJfZGVidWcoIiVzOiByZXRyeSwgaHBocm9jcF9jbnQ6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBtYmhjLT5ocGhyb2NwX2NudCk7Ci0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19PQ1BfRlNNX0VOLCAwKTsKLQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX09DUF9GU01fRU4sIDEpOwotCX0gZWxzZSB7Ci0JCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCQkgICBtYmhjLT5pbnRyX2lkcy0+aHBoX3JpZ2h0X29jcCwKLQkJCQkJICAgZmFsc2UpOwotCQltYmhjLT5ocGhfc3RhdHVzIHw9IFNORF9KQUNLX09DX0hQSFI7Ci0JCXdjZF9tYmhjX2phY2tfcmVwb3J0KG1iaGMsICZtYmhjLT5oZWFkc2V0X2phY2ssCi0JCQkJICAgIG1iaGMtPmhwaF9zdGF0dXMsIFdDRF9NQkhDX0pBQ0tfTUFTSyk7Ci0JfQotZG9uZToKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX21iaGNfaW5pdGlhbGlzZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0KLQkvKiBlbmFibGUgSFMgZGV0ZWN0aW9uICovCi0JaWYgKG1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX3VwX2NvbnRyb2wpCi0JCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX3VwX2NvbnRyb2woY29kZWMsIElfREVGQVVMVCk7Ci0JZWxzZQotCQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DVFJMLCAzKTsKLQotCWlmIChtYmhjLT5tYmhjX2NmZy0+bW9pc3R1cmVfZW4gJiYgbWJoYy0+bWJoY19jYi0+bWJoY19tb2lzdHVyZV9jb25maWcpCi0JCW1iaGMtPm1iaGNfY2ItPm1iaGNfbW9pc3R1cmVfY29uZmlnKG1iaGMpOwotCi0JLyoKLQkgKiBGb3IgVVNCIGFuYWxvZyB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBzd2l0Y2ggY29uZmlndXJhdGlvbi4KLQkgKiBBbHNvLCBkaXNhYmxlIGhwaF9sIHB1bGwtdXAgY3VycmVudCBzb3VyY2UgYXMgSFNfREVUX0wgaXMgZHJpdmVuCi0JICogYnkgYW4gZXh0ZXJuYWwgc291cmNlCi0JICovCi0JaWYgKG1iaGMtPm1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpIHsKLQkJbWJoYy0+aHBobF9zd2ggPSAxOwotCQltYmhjLT5nbmRfc3doID0gMTsKLQotCQlpZiAobWJoYy0+bWJoY19jYi0+aHBoX3B1bGxfdXBfY29udHJvbCkKLQkJCW1iaGMtPm1iaGNfY2ItPmhwaF9wdWxsX3VwX2NvbnRyb2woY29kZWMsIElfT0ZGKTsKLQkJZWxzZQotCQkJV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hTX0xfREVUX1BVTExfVVBfQ1RSTCwKLQkJCQkJCSAwKTsKLQl9Ci0KLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfSFBITF9QTFVHX1RZUEUsIG1iaGMtPmhwaGxfc3doKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfR05EX1BMVUdfVFlQRSwgbWJoYy0+Z25kX3N3aCk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX1NXX0hQSF9MUF8xMDBLX1RPX0dORCwgMSk7Ci0JaWYgKG1iaGMtPm1iaGNfY2ZnLT5nbmRfZGV0X2VuICYmIG1iaGMtPm1iaGNfY2ItPm1iaGNfZ25kX2RldF9jdHJsKQotCQltYmhjLT5tYmhjX2NiLT5tYmhjX2duZF9kZXRfY3RybChjb2RlYywgdHJ1ZSk7Ci0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0hTX0xfREVUX1BVTExfVVBfQ09NUF9DVFJMLCAxKTsKLQlXQ0RfTUJIQ19SRUdfVVBEQVRFX0JJVFMoV0NEX01CSENfTF9ERVRfRU4sIDEpOwotCi0JaWYgKG1iaGMtPm1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpIHsKLQkJLyogSW5zZXJ0aW9uIGRlYm91bmNlIHNldCB0byA0OG1zICovCi0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19JTlNSRU1fREJOQywgNCk7Ci0JfSBlbHNlIHsKLQkJLyogSW5zZXJ0aW9uIGRlYm91bmNlIHNldCB0byA5Nm1zICovCi0JCVdDRF9NQkhDX1JFR19VUERBVEVfQklUUyhXQ0RfTUJIQ19JTlNSRU1fREJOQywgNik7Ci0JfQotCi0JLyogQnV0dG9uIERlYm91bmNlIHNldCB0byAxNm1zICovCi0JV0NEX01CSENfUkVHX1VQREFURV9CSVRTKFdDRF9NQkhDX0JUTl9EQk5DLCAyKTsKLQotCS8qIEVuYWJsZSBtaWNiaWFzIHJhbXAgKi8KLQlpZiAobWJoYy0+bWJoY19jYi0+bWJoY19taWNiX3JhbXBfY29udHJvbCkKLQkJbWJoYy0+bWJoY19jYi0+bWJoY19taWNiX3JhbXBfY29udHJvbChjb2RlYywgdHJ1ZSk7Ci0JLyogZW5hYmxlIGJpYXMgKi8KLQltYmhjLT5tYmhjX2NiLT5tYmhjX2JpYXMoY29kZWMsIHRydWUpOwotCS8qIGVuYWJsZSBNQkhDIGNsb2NrICovCi0JaWYgKG1iaGMtPm1iaGNfY2ItPmNsa19zZXR1cCkKLQkJbWJoYy0+bWJoY19jYi0+Y2xrX3NldHVwKGNvZGVjLCB0cnVlKTsKLQotCS8qIHByb2dyYW0gSFNfVlJFRiB2YWx1ZSAqLwotCXdjZF9wcm9ncmFtX2hzX3ZyZWYobWJoYyk7Ci0KLQl3Y2RfcHJvZ3JhbV9idG5fdGhyZXNob2xkKG1iaGMsIGZhbHNlKTsKLQotCi0JcmVpbml0X2NvbXBsZXRpb24oJm1iaGMtPmJ0bl9wcmVzc19jb21wbCk7Ci0KLQlXQ0RfTUJIQ19SU0NfVU5MT0NLKG1iaGMpOwotCXByX2RlYnVnKCIlczogbGVhdmVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfbWJoY19md19yZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqZndfZGF0YSA9IE5VTEw7Ci0JaW50IHJldCA9IC0xLCByZXRyeSA9IDA7Ci0JYm9vbCB1c2VfZGVmYXVsdF9jYWwgPSBmYWxzZTsKLQotCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCW1iaGMgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgbWJoY19maXJtd2FyZV9kd29yayk7Ci0JY29kZWMgPSBtYmhjLT5jb2RlYzsKLQotCXdoaWxlIChyZXRyeSA8IEZXX1JFQURfQVRURU1QVFMpIHsKLQkJcmV0cnkrKzsKLQkJcHJfZGVidWcoIiVzOkF0dGVtcHQgJWQgdG8gcmVxdWVzdCBNQkhDIGZpcm13YXJlXG4iLAotCQkJX19mdW5jX18sIHJldHJ5KTsKLQkJaWYgKG1iaGMtPm1iaGNfY2ItPmdldF9od2RlcF9md19jYWwpCi0JCQlmd19kYXRhID0gbWJoYy0+bWJoY19jYi0+Z2V0X2h3ZGVwX2Z3X2NhbChtYmhjLAotCQkJCQlXQ0Q5WFhYX01CSENfQ0FMKTsKLQkJaWYgKCFmd19kYXRhKQotCQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsICJ3Y2Q5MzIwL3djZDkzMjBfbWJoYy5iaW4iLAotCQkJCSAgICAgICBjb2RlYy0+ZGV2KTsKLQkJLyoKLQkJICogaWYgcmVxdWVzdF9maXJtd2FyZSBhbmQgaHdkZXAgY2FsIGJvdGggZmFpbCB0aGVuCi0JCSAqIHNsZWVwIGZvciA0c2VjIGZvciB0aGUgdXNlcnNwYWNlIHRvIHNlbmQgZGF0YSB0byBrZXJuZWwKLQkJICogcmV0cnkgZm9yIGZldyB0aW1lcyBiZWZvcmUgYmFpbGluZyBvdXQKLQkJICovCi0JCWlmICgocmV0ICE9IDApICYmICFmd19kYXRhKSB7Ci0JCQl1c2xlZXBfcmFuZ2UoRldfUkVBRF9USU1FT1VULCBGV19SRUFEX1RJTUVPVVQgKwotCQkJCQlXQ0RfTUJIQ19VU0xFRVBfUkFOR0VfTUFSR0lOX1VTKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogTUJIQyBGaXJtd2FyZSByZWFkIHN1Y2Nlc3NmdWxcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghZndfZGF0YSkKLQkJcHJfZGVidWcoIiVzOiB1c2luZyByZXF1ZXN0X2Zpcm13YXJlXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZQotCQlwcl9kZWJ1ZygiJXM6IHVzaW5nIGh3ZGVwIGNhbFxuIiwgX19mdW5jX18pOwotCi0JaWYgKHJldCAhPSAwICYmICFmd19kYXRhKSB7Ci0JCXByX2VycigiJXM6IENhbm5vdCBsb2FkIE1CSEMgZmlybXdhcmUgdXNlIGRlZmF1bHQgY2FsXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQl1c2VfZGVmYXVsdF9jYWwgPSB0cnVlOwotCX0KLQlpZiAoIXVzZV9kZWZhdWx0X2NhbCkgewotCQljb25zdCB2b2lkICpkYXRhOwotCQlzaXplX3Qgc2l6ZTsKLQotCQlpZiAoZndfZGF0YSkgewotCQkJZGF0YSA9IGZ3X2RhdGEtPmRhdGE7Ci0JCQlzaXplID0gZndfZGF0YS0+c2l6ZTsKLQkJfSBlbHNlIHsKLQkJCWRhdGEgPSBmdy0+ZGF0YTsKLQkJCXNpemUgPSBmdy0+c2l6ZTsKLQkJfQotCQlpZiAod2NkX21iaGNfZndfdmFsaWRhdGUoZGF0YSwgc2l6ZSkgPT0gZmFsc2UpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgTUJIQyBjYWwgZGF0YSBzaXplIHVzZSBkZWZhdWx0IGNhbFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlpZiAoIWZ3X2RhdGEpCi0JCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZndfZGF0YSkgewotCQkJCW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9Ci0JCQkJCSh2b2lkICopZndfZGF0YS0+ZGF0YTsKLQkJCQltYmhjLT5tYmhjX2NhbCA9IGZ3X2RhdGE7Ci0JCQl9IGVsc2UgewotCQkJCW1iaGMtPm1iaGNfY2ZnLT5jYWxpYnJhdGlvbiA9Ci0JCQkJCSh2b2lkICopZnctPmRhdGE7Ci0JCQkJbWJoYy0+bWJoY19mdyA9IGZ3OwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkodm9pZCkgd2NkX21iaGNfaW5pdGlhbGlzZShtYmhjKTsKLX0KLQotc3RhdGljIGludCB3Y2RfbWJoY19zZXRfa2V5Y29kZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JZW51bSBzbmRfamFja190eXBlcyB0eXBlOwotCWludCBpLCByZXQsIHJlc3VsdCA9IDA7Ci0JaW50ICpidG5fa2V5X2NvZGU7Ci0KLQlidG5fa2V5X2NvZGUgPSBtYmhjLT5tYmhjX2NmZy0+a2V5X2NvZGU7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IFdDRF9NQkhDX0tFWUNPREVfTlVNIDsgaSsrKSB7Ci0JCWlmIChidG5fa2V5X2NvZGVbaV0gIT0gMCkgewotCQkJc3dpdGNoIChpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdHlwZSA9IFNORF9KQUNLX0JUTl8wOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdHlwZSA9IFNORF9KQUNLX0JUTl8zOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXR5cGUgPSBTTkRfSkFDS19CVE5fNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNToKLQkJCQl0eXBlID0gU05EX0pBQ0tfQlROXzU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVdBUk5fT05DRSgxLCAiV3JvbmcgYnV0dG9uIG51bWJlcjolZFxuIiwgaSk7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXJldCA9IHNuZF9qYWNrX3NldF9rZXkobWJoYy0+YnV0dG9uX2phY2suamFjaywKLQkJCQkJCQl0eXBlLAotCQkJCQkJCWJ0bl9rZXlfY29kZVtpXSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBjb2RlIGZvciAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGJ0bl9rZXlfY29kZVtpXSk7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWlucHV0X3NldF9jYXBhYmlsaXR5KAotCQkJCW1iaGMtPmJ1dHRvbl9qYWNrLmphY2stPmlucHV0X2RldiwKLQkJCQlFVl9LRVksIGJ0bl9rZXlfY29kZVtpXSk7Ci0JCQlwcl9kZWJ1ZygiJXM6IHNldCBidG4lZCBrZXkgY29kZTolZFxuIiwgX19mdW5jX18sCi0JCQkJaSwgYnRuX2tleV9jb2RlW2ldKTsKLQkJfQotCX0KLQlpZiAoYnRuX2tleV9jb2RlWzBdKQotCQltYmhjLT5pc19idG5fYWxyZWFkeV9yZWdkID0gdHJ1ZTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHdjZF9tYmhjX3VzYl9jX2FuYWxvZ19zZXR1cF9ncGlvcyhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJCSAgICAgYm9vbCBhY3RpdmUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgdXNiY19hbmFfYXVkaW9fY29uZmlnICpjb25maWcgPQotCQkmbWJoYy0+bWJoY19jZmctPnVzYmNfYW5hbG9nX2NmZzsKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCBwdmFsOwotCi0JZGV2X2RiZyhtYmhjLT5jb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgR1BJT3MgYWN0aXZlID0gJWRcbiIsCi0JCV9fZnVuY19fLCBhY3RpdmUpOwotCi0JbWVtc2V0KCZwdmFsLCAwLCBzaXplb2YocHZhbCkpOwotCi0JaWYgKGFjdGl2ZSkgewotCQlwdmFsLmludHZhbCA9IFBPV0VSX1NVUFBMWV9UWVBFQ19QUl9TT1VSQ0U7Ci0JCWlmIChwb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5KG1iaGMtPnVzYl9wc3ksCi0JCQkJUE9XRVJfU1VQUExZX1BST1BfVFlQRUNfUE9XRVJfUk9MRSwgJnB2YWwpKQotCQkJZGV2X2luZm8obWJoYy0+Y29kZWMtPmRldiwgIiVzOiBmb3JjZSBQUl9TT1VSQ0UgbW9kZSB1bnN1Y2Nlc3NmdWxcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJZWxzZQotCQkJbWJoYy0+dXNiY19mb3JjZV9wcl9tb2RlID0gdHJ1ZTsKLQotCQlpZiAoY29uZmlnLT51c2JjX2VuMV9ncGlvX3ApCi0JCQlyYyA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKAotCQkJCWNvbmZpZy0+dXNiY19lbjFfZ3Bpb19wKTsKLQkJaWYgKHJjID09IDAgJiYgY29uZmlnLT51c2JjX2ZvcmNlX2dwaW9fcCkKLQkJCXJjID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCi0JCQkJY29uZmlnLT51c2JjX2ZvcmNlX2dwaW9fcCk7Ci0JCW1iaGMtPnVzYmNfbW9kZSA9IFBPV0VSX1NVUFBMWV9UWVBFQ19TSU5LX0FVRElPX0FEQVBURVI7Ci0JfSBlbHNlIHsKLQkJLyogbm8gZGVsYXkgaXMgcmVxdWlyZWQgd2hlbiBkaXNhYmxpbmcgR1BJT3MgKi8KLQkJaWYgKGNvbmZpZy0+dXNiY19lbjFfZ3Bpb19wKQotCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKLQkJCQljb25maWctPnVzYmNfZW4xX2dwaW9fcCk7Ci0JCWlmIChjb25maWctPnVzYmNfZm9yY2VfZ3Bpb19wKQotCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKLQkJCQljb25maWctPnVzYmNfZm9yY2VfZ3Bpb19wKTsKLQotCQlpZiAobWJoYy0+dXNiY19mb3JjZV9wcl9tb2RlKSB7Ci0JCQlwdmFsLmludHZhbCA9IFBPV0VSX1NVUFBMWV9UWVBFQ19QUl9EVUFMOwotCQkJaWYgKHBvd2VyX3N1cHBseV9zZXRfcHJvcGVydHkobWJoYy0+dXNiX3BzeSwKLQkJCQlQT1dFUl9TVVBQTFlfUFJPUF9UWVBFQ19QT1dFUl9ST0xFLCAmcHZhbCkpCi0JCQkJZGV2X2luZm8obWJoYy0+Y29kZWMtPmRldiwgIiVzOiBmb3JjZSBQUl9EVUFMIG1vZGUgdW5zdWNjZXNzZnVsXG4iLAotCQkJCQkgX19mdW5jX18pOwotCi0JCQltYmhjLT51c2JjX2ZvcmNlX3ByX21vZGUgPSBmYWxzZTsKLQkJfQotCi0JCW1iaGMtPnVzYmNfbW9kZSA9IFBPV0VSX1NVUFBMWV9UWVBFQ19OT05FOwotCQlpZiAobWJoYy0+bWJoY19jZmctPnN3YXBfZ25kX21pYykKLQkJCW1iaGMtPm1iaGNfY2ZnLT5zd2FwX2duZF9taWMobWJoYy0+Y29kZWMsIGZhbHNlKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIHdvcmtxdWV1ZSAqLwotc3RhdGljIHZvaWQgd2NkX21iaGNfdXNiY19hbmFsb2dfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3Y2RfbWJoYywgdXNiY19hbmFsb2dfd29yayk7Ci0KLQl3Y2RfbWJoY191c2JfY19hbmFsb2dfc2V0dXBfZ3Bpb3MobWJoYywKLQkJCW1iaGMtPnVzYmNfbW9kZSAhPSBQT1dFUl9TVVBQTFlfVFlQRUNfTk9ORSk7Ci19Ci0KLS8qIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgdXNlZCB0byBwcm9jZXNzIFBNSSBub3RpZmljYXRpb24gKi8KLXN0YXRpYyBpbnQgd2NkX21iaGNfdXNiX2NfZXZlbnRfY2hhbmdlZChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCQl1bnNpZ25lZCBsb25nIGV2dCwgdm9pZCAqcHRyKQotewotCWludCByZXQ7Ci0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgbW9kZTsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCB3Y2RfbWJoYywgcHN5X25iKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQotCWlmIChwdHIgIT0gbWJoYy0+dXNiX3BzeSB8fCBldnQgIT0gUFNZX0VWRU5UX1BST1BfQ0hBTkdFRCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KG1iaGMtPnVzYl9wc3ksCi0JCQlQT1dFUl9TVVBQTFlfUFJPUF9UWVBFQ19NT0RFLCAmbW9kZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5hYmxlIHRvIHJlYWQgVVNCIFRZUEVDX01PREU6ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFVTQiBjaGFuZ2UgZXZlbnQgcmVjZWl2ZWRcbiIsCi0JCV9fZnVuY19fKTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3VwcGx5IG1vZGUgJWQsIGV4cGVjdGVkICVkXG4iLCBfX2Z1bmNfXywKLQkJbW9kZS5pbnR2YWwsIFBPV0VSX1NVUFBMWV9UWVBFQ19TSU5LX0FVRElPX0FEQVBURVIpOwotCi0Jc3dpdGNoIChtb2RlLmludHZhbCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVDX1NJTktfQVVESU9fQURBUFRFUjoKLQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFQ19OT05FOgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNiY19tb2RlOiAlZDsgbW9kZS5pbnR2YWw6ICVkXG4iLAotCQkJX19mdW5jX18sIG1iaGMtPnVzYmNfbW9kZSwgbW9kZS5pbnR2YWwpOwotCi0JCWlmIChtYmhjLT51c2JjX21vZGUgPT0gbW9kZS5pbnR2YWwpCi0JCQlicmVhazsgLyogZmlsdGVyIG5vdGlmaWNhdGlvbnMgcmVjZWl2ZWQgYmVmb3JlICovCi0JCW1iaGMtPnVzYmNfbW9kZSA9IG1vZGUuaW50dmFsOwotCi0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBxdWV1ZWluZyB1c2JjX2FuYWxvZ193b3JrXG4iLAotCQkJX19mdW5jX18pOwotCQlzY2hlZHVsZV93b3JrKCZtYmhjLT51c2JjX2FuYWxvZ193b3JrKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFBNSSByZWdpc3RyYXRpb24gY29kZSAqLwotc3RhdGljIGludCB3Y2RfbWJoY191c2JfY19hbmFsb2dfaW5pdChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQlkZXZfZGJnKG1iaGMtPmNvZGVjLT5kZXYsICIlczogdXNiLWMgYW5hbG9nIHNldHVwIHN0YXJ0XG4iLCBfX2Z1bmNfXyk7Ci0JSU5JVF9XT1JLKCZtYmhjLT51c2JjX2FuYWxvZ193b3JrLCB3Y2RfbWJoY191c2JjX2FuYWxvZ193b3JrX2ZuKTsKLQotCW1iaGMtPnVzYl9wc3kgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoInVzYiIpOwotCWlmIChJU19FUlJfT1JfTlVMTChtYmhjLT51c2JfcHN5KSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY291bGQgbm90IGdldCBVU0IgcHN5IGluZm9cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWlmIChJU19FUlIobWJoYy0+dXNiX3BzeSkpCi0JCQlyZXQgPSBQVFJfRVJSKG1iaGMtPnVzYl9wc3kpOwotCQltYmhjLT51c2JfcHN5ID0gTlVMTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gd2NkX21iaGNfdXNiX2NfYW5hbG9nX3NldHVwX2dwaW9zKG1iaGMsIGZhbHNlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlcnJvciB3aGlsZSBzZXR0aW5nIFVTQkMgYW5hIGdwaW9zXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQltYmhjLT5wc3lfbmIubm90aWZpZXJfY2FsbCA9IHdjZF9tYmhjX3VzYl9jX2V2ZW50X2NoYW5nZWQ7Ci0JbWJoYy0+cHN5X25iLnByaW9yaXR5ID0gMDsKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnX25vdGlmaWVyKCZtYmhjLT5wc3lfbmIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHBvd2VyIHN1cHBseSByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKgotCSAqIGFzIHBhcnQgb2YgdGhlIGluaXQgc2VxdWVuY2UgY2hlY2sgaWYgdGhlcmUgaXMgYSBjb25uZWN0ZWQKLQkgKiBVU0IgQyBhbmFsb2cgYWRhcHRlcgotCSAqLwotCWRldl9kYmcobWJoYy0+Y29kZWMtPmRldiwgIiVzOiB2ZXJpZnkgaWYgVVNCIGFkYXB0ZXIgaXMgYWxyZWFkeSBpbnNlcnRlZFxuIiwKLQkJX19mdW5jX18pOwotCXJldCA9IHdjZF9tYmhjX3VzYl9jX2V2ZW50X2NoYW5nZWQoJm1iaGMtPnBzeV9uYiwKLQkJCQkJICAgUFNZX0VWRU5UX1BST1BfQ0hBTkdFRCwKLQkJCQkJICAgbWJoYy0+dXNiX3BzeSk7Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9tYmhjX3VzYl9jX2FuYWxvZ19kZWluaXQoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXdjZF9tYmhjX3VzYl9jX2FuYWxvZ19zZXR1cF9ncGlvcyhtYmhjLCBmYWxzZSk7Ci0KLQkvKiBkZXJlZ2lzdGVyIGZyb20gUE1JICovCi0JcG93ZXJfc3VwcGx5X3VucmVnX25vdGlmaWVyKCZtYmhjLT5wc3lfbmIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX21iaGNfaW5pdF9ncGlvKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCSAgICAgIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnLAotCQkJICAgICAgY29uc3QgY2hhciAqZ3Bpb19kdF9zdHIsCi0JCQkgICAgICBpbnQgKmdwaW8sIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmdwaW9fZG4pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCi0JZGV2X2RiZyhtYmhjLT5jb2RlYy0+ZGV2LCAiJXM6IGdwaW8gJXNcbiIsIF9fZnVuY19fLCBncGlvX2R0X3N0cik7Ci0KLQkqZ3Bpb19kbiA9IG9mX3BhcnNlX3BoYW5kbGUoY2FyZC0+ZGV2LT5vZl9ub2RlLCBncGlvX2R0X3N0ciwgMCk7Ci0KLQlpZiAoISgqZ3Bpb19kbikpIHsKLQkJKmdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhjYXJkLT5kZXYtPm9mX25vZGUsIGdwaW9fZHRfc3RyLCAwKTsKLQkJaWYgKCFncGlvX2lzX3ZhbGlkKCpncGlvKSkgewotCQkJZGV2X2VycihjYXJkLT5kZXYsICIlcywgcHJvcGVydHkgJXMgbm90IGluIG5vZGUgJXMiLAotCQkJCV9fZnVuY19fLCBncGlvX2R0X3N0ciwKLQkJCQljYXJkLT5kZXYtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB3Y2RfbWJoY19zdGFydChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHVzYmNfYW5hX2F1ZGlvX2NvbmZpZyAqY29uZmlnOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwotCWNvbnN0IGNoYXIgKnVzYl9jX2R0ID0gInFjb20sbXNtLW1iaGMtdXNiYy1hdWRpby1zdXBwb3J0ZWQiOwotCi0JaWYgKCFtYmhjIHx8ICFtYmhjX2NmZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb25maWcgPSAmbWJoY19jZmctPnVzYmNfYW5hbG9nX2NmZzsKLQljb2RlYyA9IG1iaGMtPmNvZGVjOwotCWNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0KLQkvKiB1cGRhdGUgdGhlIG1iaGMgY29uZmlnICovCi0JbWJoYy0+bWJoY19jZmcgPSBtYmhjX2NmZzsKLQotCWRldl9kYmcobWJoYy0+Y29kZWMtPmRldiwgIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCi0JLyogY2hlY2sgaWYgVVNCIEMgYW5hbG9nIGlzIGRlZmluZWQgb24gZGV2aWNlIHRyZWUgKi8KLQltYmhjX2NmZy0+ZW5hYmxlX3VzYmNfYW5hbG9nID0gMDsKLQlpZiAob2ZfZmluZF9wcm9wZXJ0eShjYXJkLT5kZXYtPm9mX25vZGUsIHVzYl9jX2R0LCBOVUxMKSkgewotCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNhcmQtPmRldi0+b2Zfbm9kZSwgdXNiX2NfZHQsCi0JCQkJJm1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpOwotCX0KLQlpZiAobWJoY19jZmctPmVuYWJsZV91c2JjX2FuYWxvZyA9PSAwIHx8IHJjICE9IDApIHsKLQkJZGV2X2luZm8oY2FyZC0+ZGV2LAotCQkJCSIlczogJXMgaW4gZHQgbm9kZSBpcyBtaXNzaW5nIG9yIGZhbHNlXG4iLAotCQkJCV9fZnVuY19fLCB1c2JfY19kdCk7Ci0JCWRldl9pbmZvKGNhcmQtPmRldiwKLQkJCSIlczogc2tpcHBpbmcgVVNCIGMgYW5hbG9nIGNvbmZpZ3VyYXRpb25cbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBpbml0aWFsaXplIEdQSU9zICovCi0JaWYgKG1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpIHsKLQkJZGV2X2RiZyhtYmhjLT5jb2RlYy0+ZGV2LCAiJXM6IHVzYmMgYW5hbG9nIGVuYWJsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyYyA9IHdjZF9tYmhjX2luaXRfZ3BpbyhtYmhjLCBtYmhjX2NmZywKLQkJCQkicWNvbSx1c2JjLWFuYWxvZy1lbjEtZ3BpbyIsCi0JCQkJJmNvbmZpZy0+dXNiY19lbjFfZ3BpbywKLQkJCQkmY29uZmlnLT51c2JjX2VuMV9ncGlvX3ApOwotCQlpZiAocmMpCi0JCQlnb3RvIGVycjsKLQotCQlpZiAob2ZfZmluZF9wcm9wZXJ0eShjYXJkLT5kZXYtPm9mX25vZGUsCi0JCQkJICAgICAicWNvbSx1c2JjLWFuYWxvZy1mb3JjZV9kZXRlY3RfZ3BpbyIsCi0JCQkJICAgICBOVUxMKSkgewotCQkJcmMgPSB3Y2RfbWJoY19pbml0X2dwaW8obWJoYywgbWJoY19jZmcsCi0JCQkJCSJxY29tLHVzYmMtYW5hbG9nLWZvcmNlX2RldGVjdF9ncGlvIiwKLQkJCQkJJmNvbmZpZy0+dXNiY19mb3JjZV9ncGlvLAotCQkJCQkmY29uZmlnLT51c2JjX2ZvcmNlX2dwaW9fcCk7Ci0JCQlpZiAocmMpCi0JCQkJZ290byBlcnI7Ci0JCX0KLQotCQlkZXZfZGJnKG1iaGMtPmNvZGVjLT5kZXYsICIlczogY2FsbGluZyB1c2JfY19hbmFsb2dfaW5pdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJLyogaW5pdCBQTUkgbm90aWZpZXIgKi8KLQkJcmMgPSB3Y2RfbWJoY191c2JfY19hbmFsb2dfaW5pdChtYmhjKTsKLQkJaWYgKHJjKSB7Ci0JCQlyYyA9IEVQUk9CRV9ERUZFUjsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JLyogU2V0IGJ0biBrZXkgY29kZSAqLwotCWlmICgoIW1iaGMtPmlzX2J0bl9hbHJlYWR5X3JlZ2QpICYmIHdjZF9tYmhjX3NldF9rZXljb2RlKG1iaGMpKQotCQlwcl9lcnIoIlNldCBidG4ga2V5IGNvZGUgZXJyb3IhISFcbiIpOwotCi0JaWYgKCFtYmhjLT5tYmhjX2NmZy0+cmVhZF9md19iaW4gfHwKLQkgICAgKG1iaGMtPm1iaGNfY2ZnLT5yZWFkX2Z3X2JpbiAmJiBtYmhjLT5tYmhjX2Z3KSB8fAotCSAgICAobWJoYy0+bWJoY19jZmctPnJlYWRfZndfYmluICYmIG1iaGMtPm1iaGNfY2FsKSkgewotCQlyYyA9IHdjZF9tYmhjX2luaXRpYWxpc2UobWJoYyk7Ci0JfSBlbHNlIHsKLQkJaWYgKCFtYmhjLT5tYmhjX2Z3IHx8ICFtYmhjLT5tYmhjX2NhbCkKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbWJoYy0+bWJoY19maXJtd2FyZV9kd29yaywKLQkJCQkgICAgICB1c2Vjc190b19qaWZmaWVzKEZXX1JFQURfVElNRU9VVCkpOwotCQllbHNlCi0JCQlwcl9lcnIoIiVzOiBTa2lwcGluZyB0byByZWFkIG1iaGMgZncsIDB4JXBLICVwS1xuIiwKLQkJCQkgX19mdW5jX18sIG1iaGMtPm1iaGNfZncsIG1iaGMtPm1iaGNfY2FsKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci1lcnI6Ci0JaWYgKGNvbmZpZy0+dXNiY19lbjFfZ3BpbyA+IDApIHsKLQkJZGV2X2RiZyhjYXJkLT5kZXYsICIlcyBmcmVlIHVzYiBlbjEgZ3BpbyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjb25maWctPnVzYmNfZW4xX2dwaW8pOwotCQlncGlvX2ZyZWUoY29uZmlnLT51c2JjX2VuMV9ncGlvKTsKLQkJY29uZmlnLT51c2JjX2VuMV9ncGlvID0gMDsKLQl9Ci0JaWYgKGNvbmZpZy0+dXNiY19mb3JjZV9ncGlvID4gMCkgewotCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzIGZyZWUgdXNiX2ZvcmNlIGdwaW8gJWRcbiIsCi0JCQlfX2Z1bmNfXywgY29uZmlnLT51c2JjX2ZvcmNlX2dwaW8pOwotCQlncGlvX2ZyZWUoY29uZmlnLT51c2JjX2ZvcmNlX2dwaW8pOwotCQljb25maWctPnVzYmNfZm9yY2VfZ3BpbyA9IDA7Ci0JfQotCWlmIChjb25maWctPnVzYmNfZW4xX2dwaW9fcCkKLQkJb2Zfbm9kZV9wdXQoY29uZmlnLT51c2JjX2VuMV9ncGlvX3ApOwotCWlmIChjb25maWctPnVzYmNfZm9yY2VfZ3Bpb19wKQotCQlvZl9ub2RlX3B1dChjb25maWctPnVzYmNfZm9yY2VfZ3Bpb19wKTsKLQlkZXZfZGJnKG1iaGMtPmNvZGVjLT5kZXYsICIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19zdGFydCk7Ci0KLXZvaWQgd2NkX21iaGNfc3RvcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpCi17Ci0Jc3RydWN0IHVzYmNfYW5hX2F1ZGlvX2NvbmZpZyAqY29uZmlnID0gJm1iaGMtPm1iaGNfY2ZnLT51c2JjX2FuYWxvZ19jZmc7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobWJoYy0+Y3VycmVudF9wbHVnICE9IE1CSENfUExVR19UWVBFX05PTkUpIHsKLQkJaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+c2tpcF9pbXBlZF9kZXRlY3QpCi0JCQltYmhjLT5tYmhjX2NiLT5za2lwX2ltcGVkX2RldGVjdChtYmhjLT5jb2RlYyk7Ci0JfQotCW1iaGMtPmN1cnJlbnRfcGx1ZyA9IE1CSENfUExVR19UWVBFX05PTkU7Ci0JbWJoYy0+aHBoX3N0YXR1cyA9IDA7Ci0JaWYgKG1iaGMtPm1iaGNfY2IgJiYgbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2wpIHsKLQkJbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2wobWJoYy0+Y29kZWMsCi0JCQkJbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKLQkJCQlmYWxzZSk7Ci0JCW1iaGMtPm1iaGNfY2ItPmlycV9jb250cm9sKG1iaGMtPmNvZGVjLAotCQkJCW1iaGMtPmludHJfaWRzLT5ocGhfcmlnaHRfb2NwLAotCQkJCWZhbHNlKTsKLQl9Ci0JaWYgKG1iaGMtPm1iaGNfZncgfHwgbWJoYy0+bWJoY19jYWwpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtYmhjLT5tYmhjX2Zpcm13YXJlX2R3b3JrKTsKLQkJaWYgKCFtYmhjLT5tYmhjX2NhbCkKLQkJCXJlbGVhc2VfZmlybXdhcmUobWJoYy0+bWJoY19mdyk7Ci0JCW1iaGMtPm1iaGNfZncgPSBOVUxMOwotCQltYmhjLT5tYmhjX2NhbCA9IE5VTEw7Ci0JfQotCi0JaWYgKG1iaGMtPm1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpIHsKLQkJd2NkX21iaGNfdXNiX2NfYW5hbG9nX2RlaW5pdChtYmhjKTsKLQkJLyogZnJlZSBHUElPcyAqLwotCQlpZiAoY29uZmlnLT51c2JjX2VuMV9ncGlvID4gMCkKLQkJCWdwaW9fZnJlZShjb25maWctPnVzYmNfZW4xX2dwaW8pOwotCQlpZiAoY29uZmlnLT51c2JjX2ZvcmNlX2dwaW8pCi0JCQlncGlvX2ZyZWUoY29uZmlnLT51c2JjX2ZvcmNlX2dwaW8pOwotCi0JCWlmIChjb25maWctPnVzYmNfZW4xX2dwaW9fcCkKLQkJCW9mX25vZGVfcHV0KGNvbmZpZy0+dXNiY19lbjFfZ3Bpb19wKTsKLQkJaWYgKGNvbmZpZy0+dXNiY19mb3JjZV9ncGlvX3ApCi0JCQlvZl9ub2RlX3B1dChjb25maWctPnVzYmNfZm9yY2VfZ3Bpb19wKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGxlYXZlXG4iLCBfX2Z1bmNfXyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9tYmhjX3N0b3ApOwotCi0vKgotICogd2NkX21iaGNfaW5pdCA6IGluaXRpYWxpemUgTUJIQyBpbnRlcm5hbCBzdHJ1Y3R1cmVzLgotICoKLSAqIE5PVEU6IG1iaGMtPm1iaGNfY2ZnIGlzIG5vdCBZRVQgY29uZmlndXJlIHNvIHNob3VsZG4ndCBiZSB1c2VkCi0gKi8KLWludCB3Y2RfbWJoY19pbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgKm1iaGNfY2IsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCB3Y2RfbWJoY19pbnRyICptYmhjX2NkY19pbnRyX2lkcywKLQkJICAgICAgc3RydWN0IHdjZF9tYmhjX3JlZ2lzdGVyICp3Y2RfbWJoY19yZWdzLAotCQkgICAgICBib29sIGltcGVkYW5jZV9kZXRfZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGhwaF9zd2ggPSAwOwotCWludCBnbmRfc3doID0gMDsKLQl1MzIgaHBoX21vaXN0X2NvbmZpZ1szXTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCWNvbnN0IGNoYXIgKmhwaF9zd2l0Y2ggPSAicWNvbSxtc20tbWJoYy1ocGhsLXN3aCI7Ci0JY29uc3QgY2hhciAqZ25kX3N3aXRjaCA9ICJxY29tLG1zbS1tYmhjLWduZC1zd2giOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2FyZC0+ZGV2LT5vZl9ub2RlLCBocGhfc3dpdGNoLCAmaHBoX3N3aCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgaHBoX3N3aXRjaCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNhcmQtPmRldi0+b2Zfbm9kZSwgZ25kX3N3aXRjaCwgJmduZF9zd2gpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsCi0JCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIGduZF9zd2l0Y2gpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjYXJkLT5kZXYtPm9mX25vZGUsCi0JCQkJCSAicWNvbSxtc20tbWJoYy1tb2lzdC1jZmciLAotCQkJCQkgaHBoX21vaXN0X2NvbmZpZywgMyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiBubyBxY29tLG1zbS1tYmhjLW1vaXN0LWNmZyBpbiBEVFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJbWJoYy0+bW9pc3RfdnJlZiA9IFZfNDVfTVY7Ci0JCW1iaGMtPm1vaXN0X2lyZWYgPSBJXzNQMF9VQTsKLQkJbWJoYy0+bW9pc3RfcnJlZiA9IFJfMjRfS09ITTsKLQl9IGVsc2UgewotCQltYmhjLT5tb2lzdF92cmVmID0gaHBoX21vaXN0X2NvbmZpZ1swXTsKLQkJbWJoYy0+bW9pc3RfaXJlZiA9IGhwaF9tb2lzdF9jb25maWdbMV07Ci0JCW1iaGMtPm1vaXN0X3JyZWYgPSBocGhfbW9pc3RfY29uZmlnWzJdOwotCX0KLQotCW1iaGMtPmluX3N3Y2hfaXJxX2hhbmRsZXIgPSBmYWxzZTsKLQltYmhjLT5jdXJyZW50X3BsdWcgPSBNQkhDX1BMVUdfVFlQRV9OT05FOwotCW1iaGMtPmlzX2J0bl9wcmVzcyA9IGZhbHNlOwotCW1iaGMtPmNvZGVjID0gY29kZWM7Ci0JbWJoYy0+aW50cl9pZHMgPSBtYmhjX2NkY19pbnRyX2lkczsKLQltYmhjLT5pbXBlZGFuY2VfZGV0ZWN0ID0gaW1wZWRhbmNlX2RldF9lbjsKLQltYmhjLT5ocGhsX3N3aCA9IGhwaF9zd2g7Ci0JbWJoYy0+Z25kX3N3aCA9IGduZF9zd2g7Ci0JbWJoYy0+bWljYmlhc19lbmFibGUgPSBmYWxzZTsKLQltYmhjLT5tYmhjX2NiID0gbWJoY19jYjsKLQltYmhjLT5idG5fcHJlc3NfaW50ciA9IGZhbHNlOwotCW1iaGMtPmlzX2hzX3JlY29yZGluZyA9IGZhbHNlOwotCW1iaGMtPmlzX2V4dG5fY2FibGUgPSBmYWxzZTsKLQltYmhjLT5leHRuX2NhYmxlX2hwaF9yZW0gPSBmYWxzZTsKLQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9OT05FOwotCW1iaGMtPndjZF9tYmhjX3JlZ3MgPSB3Y2RfbWJoY19yZWdzOwotCi0JaWYgKG1iaGMtPmludHJfaWRzID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogSW50ZXJydXB0IG1hcHBpbmcgbm90IHByb3ZpZGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIW1iaGMtPndjZF9tYmhjX3JlZ3MpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgcmVnaXN0ZXJzIGFyZSBub3QgZGVmaW5lZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogQ2hlY2sgaWYgSVJRIGFuZCBvdGhlciByZXF1aXJlZCBjYWxsYmFja3MgYXJlIGRlZmluZWQgb3Igbm90ICovCi0JaWYgKCFtYmhjX2NiIHx8ICFtYmhjX2NiLT5yZXF1ZXN0X2lycSB8fCAhbWJoY19jYi0+aXJxX2NvbnRyb2wgfHwKLQkgICAgIW1iaGNfY2ItPmZyZWVfaXJxIHx8ICFtYmhjX2NiLT5tYXBfYnRuX2NvZGVfdG9fbnVtIHx8Ci0JICAgICFtYmhjX2NiLT5sb2NrX3NsZWVwIHx8ICFtYmhjX2NiLT5tYmhjX2JpYXMgfHwKLQkgICAgIW1iaGNfY2ItPnNldF9idG5fdGhyKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiByZXF1aXJlZCBtYmhjIGNhbGxiYWNrcyBhcmUgbm90IGRlZmluZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIE5vIG5lZWQgdG8gY3JlYXRlIG5ldyBzb3VuZCBjYXJkIGphY2tzIGlmIGlzIGlzIGFscmVhZHkgY3JlYXRlZCAqLwotCWlmIChtYmhjLT5oZWFkc2V0X2phY2suamFjayA9PSBOVUxMKSB7Ci0JCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhjb2RlYy0+Y29tcG9uZW50LmNhcmQsCi0JCQkJCSAgICAiSGVhZHNldCBKYWNrIiwgV0NEX01CSENfSkFDS19NQVNLLAotCQkJCQkgICAgJm1iaGMtPmhlYWRzZXRfamFjaywgTlVMTCwgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgbmV3IGphY2tcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLAotCQkJCQkgICAgIkJ1dHRvbiBKYWNrIiwKLQkJCQkJICAgIFdDRF9NQkhDX0pBQ0tfQlVUVE9OX01BU0ssCi0JCQkJCSAgICAmbWJoYy0+YnV0dG9uX2phY2ssIE5VTEwsIDApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgbmV3IGphY2tcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXJldCA9IHNuZF9qYWNrX3NldF9rZXkobWJoYy0+YnV0dG9uX2phY2suamFjaywKLQkJCQkgICAgICAgU05EX0pBQ0tfQlROXzAsCi0JCQkJICAgICAgIEtFWV9NRURJQSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY29kZSBmb3IgYnRuLTBcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCUlOSVRfREVMQVlFRF9XT1JLKCZtYmhjLT5tYmhjX2Zpcm13YXJlX2R3b3JrLAotCQkJCSAgd2NkX21iaGNfZndfcmVhZCk7Ci0JCUlOSVRfREVMQVlFRF9XT1JLKCZtYmhjLT5tYmhjX2J0bl9kd29yaywgd2NkX2J0bl9scHJlc3NfZm4pOwotCX0KLQltdXRleF9pbml0KCZtYmhjLT5ocGhsX3BhX2xvY2spOwotCW11dGV4X2luaXQoJm1iaGMtPmhwaHJfcGFfbG9jayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZtYmhjLT5idG5fcHJlc3NfY29tcGwpOwotCi0JLyogUmVnaXN0ZXIgZXZlbnQgbm90aWZpZXIgKi8KLQltYmhjLT5uYmxvY2subm90aWZpZXJfY2FsbCA9IHdjZF9ldmVudF9ub3RpZnk7Ci0JaWYgKG1iaGMtPm1iaGNfY2ItPnJlZ2lzdGVyX25vdGlmaWVyKSB7Ci0JCXJldCA9IG1iaGMtPm1iaGNfY2ItPnJlZ2lzdGVyX25vdGlmaWVyKG1iaGMsICZtYmhjLT5uYmxvY2ssCi0JCQkJCQkgICAgICAgdHJ1ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byByZWdpc3RlciBub3RpZmllciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtYmhjLT53YWl0X2J0bl9wcmVzcyk7Ci0JbXV0ZXhfaW5pdCgmbWJoYy0+Y29kZWNfcmVzb3VyY2VfbG9jayk7Ci0KLQlzd2l0Y2ggKG1iaGMtPm1iaGNfZGV0ZWN0aW9uX2xvZ2ljKSB7Ci0JY2FzZSBXQ0RfREVURUNUSU9OX0xFR0FDWToKLQkJd2NkX21iaGNfbGVnYWN5X2luaXQobWJoYyk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0RFVEVDVElPTl9BREM6Ci0JCXdjZF9tYmhjX2FkY19pbml0KG1iaGMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIGRldGVjdGlvbiBsb2dpYyB0eXBlICVkXG4iLAotCQkJX19mdW5jX18sIG1iaGMtPm1iaGNfZGV0ZWN0aW9uX2xvZ2ljKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFtYmhjLT5tYmhjX2ZuIHx8Ci0JICAgICFtYmhjLT5tYmhjX2ZuLT53Y2RfbWJoY19oc19pbnNfaXJxIHx8Ci0JICAgICFtYmhjLT5tYmhjX2ZuLT53Y2RfbWJoY19oc19yZW1faXJxIHx8Ci0JICAgICFtYmhjLT5tYmhjX2ZuLT53Y2RfbWJoY19kZXRlY3RfcGx1Z190eXBlIHx8Ci0JICAgICFtYmhjLT5tYmhjX2ZuLT53Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKSB7Ci0JCXByX2VycigiJXM6IG1iaGMgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX21iaGNfc3dfaXJxOwotCX0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfc3dfaW50ciwKLQkJCQkgIHdjZF9tYmhjX21lY2hfcGx1Z19kZXRlY3RfaXJxLAotCQkJCSAgIm1iaGMgc3cgaW50ciIsIG1iaGMpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkLCByZXQgPSAlZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBtYmhjLT5pbnRyX2lkcy0+bWJoY19zd19pbnRyLCByZXQpOwotCQlnb3RvIGVycl9tYmhjX3N3X2lycTsKLQl9Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywKLQkJCQkJIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9wcmVzc19pbnRyLAotCQkJCQkgd2NkX21iaGNfYnRuX3ByZXNzX2hhbmRsZXIsCi0JCQkJCSAiQnV0dG9uIFByZXNzIGRldGVjdCIsIG1iaGMpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9wcmVzc19pbnRyKTsKLQkJZ290byBlcnJfYnRuX3ByZXNzX2lycTsKLQl9Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywKLQkJCQkJIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9yZWxlYXNlX2ludHIsCi0JCQkJCSB3Y2RfbWJoY19yZWxlYXNlX2hhbmRsZXIsCi0JCQkJCSAiQnV0dG9uIFJlbGVhc2UgZGV0ZWN0IiwgbWJoYyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQkJbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3JlbGVhc2VfaW50cik7Ci0JCWdvdG8gZXJyX2J0bl9yZWxlYXNlX2lycTsKLQl9Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywKLQkJCQkJIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyLAotCQkJCQkgbWJoYy0+bWJoY19mbi0+d2NkX21iaGNfaHNfaW5zX2lycSwKLQkJCQkJICJFbGVjdCBJbnNlcnQiLCBtYmhjKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBtYmhjLT5pbnRyX2lkcy0+bWJoY19oc19pbnNfaW50cik7Ci0JCWdvdG8gZXJyX21iaGNfaHNfaW5zX2lycTsKLQl9Ci0JbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2woY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyLAotCQkJCSAgIGZhbHNlKTsKLQljbGVhcl9iaXQoV0NEX01CSENfRUxFQ19IU19JTlMsICZtYmhjLT5pbnRyX3N0YXR1cyk7Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywKLQkJCQkJIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyLAotCQkJCQkgbWJoYy0+bWJoY19mbi0+d2NkX21iaGNfaHNfcmVtX2lycSwKLQkJCQkJICJFbGVjdCBSZW1vdmUiLCBtYmhjKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBtYmhjLT5pbnRyX2lkcy0+bWJoY19oc19yZW1faW50cik7Ci0JCWdvdG8gZXJyX21iaGNfaHNfcmVtX2lycTsKLQl9Ci0JbWJoYy0+bWJoY19jYi0+aXJxX2NvbnRyb2woY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyLAotCQkJCSAgIGZhbHNlKTsKLQljbGVhcl9iaXQoV0NEX01CSENfRUxFQ19IU19SRU0sICZtYmhjLT5pbnRyX3N0YXR1cyk7Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCwKLQkJCQkgIHdjZF9tYmhjX2hwaGxfb2NwX2lycSwgIkhQSF9MIE9DUCBkZXRlY3QiLAotCQkJCSAgbWJoYyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgbWJoYy0+aW50cl9pZHMtPmhwaF9sZWZ0X29jcCk7Ci0JCWdvdG8gZXJyX2hwaGxfb2NwX2lycTsKLQl9Ci0KLQlyZXQgPSBtYmhjLT5tYmhjX2NiLT5yZXF1ZXN0X2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3AsCi0JCQkJICB3Y2RfbWJoY19ocGhyX29jcF9pcnEsICJIUEhfUiBPQ1AgZGV0ZWN0IiwKLQkJCQkgIG1iaGMpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIG1iaGMtPmludHJfaWRzLT5ocGhfcmlnaHRfb2NwKTsKLQkJZ290byBlcnJfaHBocl9vY3BfaXJxOwotCX0KLQotCXByX2RlYnVnKCIlczogbGVhdmUgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi1lcnJfaHBocl9vY3BfaXJxOgotCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwLCBtYmhjKTsKLWVycl9ocGhsX29jcF9pcnE6Ci0JbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX3JlbV9pbnRyLCBtYmhjKTsKLWVycl9tYmhjX2hzX3JlbV9pcnE6Ci0JbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyLCBtYmhjKTsKLWVycl9tYmhjX2hzX2luc19pcnE6Ci0JbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9yZWxlYXNlX2ludHIsCi0JCQkJbWJoYyk7Ci1lcnJfYnRuX3JlbGVhc2VfaXJxOgotCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+bWJoY19idG5fcHJlc3NfaW50ciwKLQkJCQltYmhjKTsKLWVycl9idG5fcHJlc3NfaXJxOgotCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+bWJoY19zd19pbnRyLCBtYmhjKTsKLWVycl9tYmhjX3N3X2lycToKLQlpZiAobWJoYy0+bWJoY19jYi0+cmVnaXN0ZXJfbm90aWZpZXIpCi0JCW1iaGMtPm1iaGNfY2ItPnJlZ2lzdGVyX25vdGlmaWVyKG1iaGMsICZtYmhjLT5uYmxvY2ssIGZhbHNlKTsKLQltdXRleF9kZXN0cm95KCZtYmhjLT5jb2RlY19yZXNvdXJjZV9sb2NrKTsKLWVycjoKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX21iaGNfaW5pdCk7Ci0KLXZvaWQgd2NkX21iaGNfZGVpbml0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQotCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+bWJoY19zd19pbnRyLCBtYmhjKTsKLQltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfYnRuX3ByZXNzX2ludHIsCi0JCQkJbWJoYyk7Ci0JbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2J0bl9yZWxlYXNlX2ludHIsCi0JCQkJbWJoYyk7Ci0JbWJoYy0+bWJoY19jYi0+ZnJlZV9pcnEoY29kZWMsIG1iaGMtPmludHJfaWRzLT5tYmhjX2hzX2luc19pbnRyLCBtYmhjKTsKLQltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPm1iaGNfaHNfcmVtX2ludHIsIG1iaGMpOwotCW1iaGMtPm1iaGNfY2ItPmZyZWVfaXJxKGNvZGVjLCBtYmhjLT5pbnRyX2lkcy0+aHBoX2xlZnRfb2NwLCBtYmhjKTsKLQltYmhjLT5tYmhjX2NiLT5mcmVlX2lycShjb2RlYywgbWJoYy0+aW50cl9pZHMtPmhwaF9yaWdodF9vY3AsIG1iaGMpOwotCWlmIChtYmhjLT5tYmhjX2NiICYmIG1iaGMtPm1iaGNfY2ItPnJlZ2lzdGVyX25vdGlmaWVyKQotCQltYmhjLT5tYmhjX2NiLT5yZWdpc3Rlcl9ub3RpZmllcihtYmhjLCAmbWJoYy0+bmJsb2NrLCBmYWxzZSk7Ci0JaWYgKG1iaGMtPm1iaGNfZm4tPndjZF9jYW5jZWxfaHNfZGV0ZWN0X3BsdWcpIHsKLQkJV0NEX01CSENfUlNDX0xPQ0sobWJoYyk7Ci0JCW1iaGMtPm1iaGNfZm4tPndjZF9jYW5jZWxfaHNfZGV0ZWN0X3BsdWcobWJoYywKLQkJCQkJJm1iaGMtPmNvcnJlY3RfcGx1Z19zd2NoKTsKLQkJV0NEX01CSENfUlNDX1VOTE9DSyhtYmhjKTsKLQl9Ci0JbXV0ZXhfZGVzdHJveSgmbWJoYy0+Y29kZWNfcmVzb3VyY2VfbG9jayk7Ci0JbXV0ZXhfZGVzdHJveSgmbWJoYy0+aHBobF9wYV9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZtYmhjLT5ocGhyX3BhX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfbWJoY19kZWluaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIndjZCBNQkhDIHYyIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy12Mi5oIGIvc291bmQvc29jL2NvZGVjcy93Y2QtbWJoYy12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODcxNGZjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLW1iaGMtdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1dDRF9NQkhDX1YyX0hfXwotI2RlZmluZSBfX1dDRF9NQkhDX1YyX0hfXwotCi0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgIndjZGNhbC1od2RlcC5oIgotCi0jZGVmaW5lIFRPTUJBS19NQkhDX05DCTAKLSNkZWZpbmUgVE9NQkFLX01CSENfTk8JMQotI2RlZmluZSBXQ0RfTUJIQ19ERUZfQlVUVE9OUyA4Ci0jZGVmaW5lIFdDRF9NQkhDX0tFWUNPREVfTlVNIDgKLSNkZWZpbmUgV0NEX01CSENfVVNMRUVQX1JBTkdFX01BUkdJTl9VUyAxMDAKLSNkZWZpbmUgV0NEX01CSENfVEhSX0hTX01JQ0JfTVYgIDI3MDAKLS8qIHogdmFsdWUgZGVmaW5lZCBpbiBPaG1zICovCi0jZGVmaW5lIFdDRF9NT05PX0hTX01JTl9USFIJMgotI2RlZmluZSBXQ0RfTUJIQ19TVFJJTkdJRlkocykgIF9fc3RyaW5naWZ5KHMpCi0KLSNkZWZpbmUgV0NEX01CSENfUkVHSVNURVIocmlkLCBycmVnLCBybWFzaywgcnNoaWZ0LCByaW52ZXJ0KSBcCi17IC5pZCA9IHJpZCwgLnJlZyA9IHJyZWcsIC5tYXNrID0gcm1hc2ssIC5vZmZzZXQgPSByc2hpZnQsIC5pbnZlcnQgPSByaW52ZXJ0IH0KLQotI2RlZmluZSBXQ0RfTUJIQ19SU0NfTE9DSyhtYmhjKQkJCVwKLXsJCQkJCQkJXAotCXByX2RlYnVnKCIlczogQWNxdWlyaW5nIEJDTFxuIiwgX19mdW5jX18pOwlcCi0JbXV0ZXhfbG9jaygmbWJoYy0+Y29kZWNfcmVzb3VyY2VfbG9jayk7CQlcCi0JcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkNMIGRvbmVcbiIsIF9fZnVuY19fKTsJXAotfQotCi0jZGVmaW5lIFdDRF9NQkhDX1JTQ19VTkxPQ0sobWJoYykJCQlcCi17CQkJCQkJCVwKLQlwcl9kZWJ1ZygiJXM6IFJlbGVhc2UgQkNMXG4iLCBfX2Z1bmNfXyk7CVwKLQltdXRleF91bmxvY2soJm1iaGMtPmNvZGVjX3Jlc291cmNlX2xvY2spOwlcCi19Ci0KLSNkZWZpbmUgV0NEX01CSENfUlNDX0FTU0VSVF9MT0NLRUQobWJoYykJCVwKLXsJCQkJCQkJXAotCVdBUk5fT05DRSghbXV0ZXhfaXNfbG9ja2VkKCZtYmhjLT5jb2RlY19yZXNvdXJjZV9sb2NrKSwgXAotCQkgICIlczogQkNMIHNob3VsZCBoYXZlIGFjcXVpcmVkXG4iLCBfX2Z1bmNfXyk7IFwKLX0KLQotLyoKLSAqIE1hY3JvcyB0byB1cGRhdGUgYW5kIHJlYWQgbWJoYyByZWdpc3RlciBiaXRzLiBDaGVjayBmb3IKLSAqICIwIiBiZWZvcmUgdXBkYXRpbmcgb3IgcmVhZGluZyB0aGUgcmVnaXN0ZXIsIGJlY2F1c2UgaXQKLSAqIGlzIHBvc3NpYmxlIHRoYXQgb25lIGNvZGVjIHdhbnRzIHRvIHdyaXRlIHRvIHRoYXQgYml0IGFuZAotICogb3RoZXIgY29kZWMgZG9lcyBub3QuCi0gKi8KLSNkZWZpbmUgV0NEX01CSENfUkVHX1VQREFURV9CSVRTKGZ1bmN0aW9uLCB2YWwpICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKG1iaGMtPndjZF9tYmhjX3JlZ3NbZnVuY3Rpb25dLnJlZykgeyAgICAgICAgXAotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1iaGMtPmNvZGVjLAlcCi0JCW1iaGMtPndjZF9tYmhjX3JlZ3NbZnVuY3Rpb25dLnJlZywJXAotCQltYmhjLT53Y2RfbWJoY19yZWdzW2Z1bmN0aW9uXS5tYXNrLAlcCi0JCXZhbCA8PCAobWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ub2Zmc2V0KSk7IFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFdDRF9NQkhDX1JFR19SRUFEKGZ1bmN0aW9uLCB2YWwpCSAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKG1iaGMtPndjZF9tYmhjX3JlZ3NbZnVuY3Rpb25dLnJlZykgeyAgICAgICAgXAotCQl2YWwgPSAoKChzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsCVwKLQkJbWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ucmVnKSkgJglcCi0JCShtYmhjLT53Y2RfbWJoY19yZWdzW2Z1bmN0aW9uXS5tYXNrKSkgPj4gXAotCQkobWJoYy0+d2NkX21iaGNfcmVnc1tmdW5jdGlvbl0ub2Zmc2V0KSk7IFwKLQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl2YWwgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBXQ0RfTUJIQ19DQUxfU0laRShidXR0b25zLCBybG9hZCkgKCBcCi0Jc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19nZW5lcmFsX2NmZykgKyBcCi0Jc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19wbHVnX2RldGVjdF9jZmcpICsgXAotCSgoc2l6ZW9mKHMxNikgKyBzaXplb2YoczE2KSkgKiBidXR0b25zKSArIFwKLQkgICAgc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19wbHVnX3R5cGVfY2ZnKSArIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnKSArIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2ltcGVkX2RldGVjdF9jZmcpICsgXAotCQkoKHNpemVvZih1MTYpICsgc2l6ZW9mKHUxNikpICogcmxvYWQpIFwKLQkpCi0KLSNkZWZpbmUgV0NEX01CSENfQ0FMX0dFTkVSQUxfUFRSKGNhbGkpICggXAotCShzdHJ1Y3Qgd2NkX21iaGNfZ2VuZXJhbF9jZmcgKikgY2FsaSkKLSNkZWZpbmUgV0NEX01CSENfQ0FMX1BMVUdfREVUX1BUUihjYWxpKSAoIFwKLQkoc3RydWN0IHdjZF9tYmhjX3BsdWdfZGV0ZWN0X2NmZyAqKSBcCi0JJihXQ0RfTUJIQ19DQUxfR0VORVJBTF9QVFIoY2FsaSlbMV0pKQotI2RlZmluZSBXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUihjYWxpKSAoIFwKLQkoc3RydWN0IHdjZF9tYmhjX3BsdWdfdHlwZV9jZmcgKikgXAotCSYoV0NEX01CSENfQ0FMX1BMVUdfREVUX1BUUihjYWxpKVsxXSkpCi0jZGVmaW5lIFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUihjYWxpKSAoIFwKLQkgICAgKHN0cnVjdCB3Y2RfbWJoY19idG5fZGV0ZWN0X2NmZyAqKSBcCi0JJihXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUihjYWxpKVsxXSkpCi0jZGVmaW5lIFdDRF9NQkhDX0NBTF9JTVBFRF9ERVRfUFRSKGNhbGkpICggXAotCShzdHJ1Y3Qgd2NkX21iaGNfaW1wZWRfZGV0ZWN0X2NmZyAqKSBcCi0JKCgodm9pZCAqKSZXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSlbMV0pICsgXAotCShXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSktPm51bV9idG4gKiBcCi0JKHNpemVvZihXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSktPl92X2J0bl9sb3dbMF0pICsgXAotCXNpemVvZihXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIoY2FsaSktPl92X2J0bl9oaWdoWzBdKSkpKSBcCi0JKQotCi0jZGVmaW5lIFdDRF9NQkhDX0NBTF9NSU5fU0laRSAoIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2dlbmVyYWxfY2ZnKSArIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX3BsdWdfZGV0ZWN0X2NmZykgKyBcCi0Jc2l6ZW9mKHN0cnVjdCB3Y2RfbWJoY19wbHVnX3R5cGVfY2ZnKSArIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnKSArIFwKLQlzaXplb2Yoc3RydWN0IHdjZF9tYmhjX2ltcGVkX2RldGVjdF9jZmcpICsgXAotCShzaXplb2YodTE2KSoyKSAgXAotCSkKLQotI2RlZmluZSBXQ0RfTUJIQ19DQUxfQlROX1NaKGNmZ19wdHIpICggXAotCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcpICsgXAotCShjZmdfcHRyLT5udW1fYnRuICogKHNpemVvZihjZmdfcHRyLT5fdl9idG5fbG93WzBdKSArIFwKLQkJCXNpemVvZihjZmdfcHRyLT5fdl9idG5faGlnaFswXSkpKSkKLQotI2RlZmluZSBXQ0RfTUJIQ19DQUxfSU1QRURfTUlOX1NaICggXAotCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBzaXplb2YodTE2KSAqIDIpCi0KLSNkZWZpbmUgV0NEX01CSENfQ0FMX0lNUEVEX1NaKGNmZ19wdHIpICggXAotCXNpemVvZihzdHJ1Y3Qgd2NkX21iaGNfaW1wZWRfZGV0ZWN0X2NmZykgKyBcCi0JKGNmZ19wdHItPl9uX3Jsb2FkICogXAotCShzaXplb2YoY2ZnX3B0ci0+X3Jsb2FkWzBdKSArIHNpemVvZihjZmdfcHRyLT5fYWxwaGFbMF0pKSkpCi0KLSNkZWZpbmUgV0NEX01CSENfSkFDS19NQVNLIChTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfT0NfSFBITCB8IFwKLQkJCSAgIFNORF9KQUNLX09DX0hQSFIgfCBTTkRfSkFDS19MSU5FT1VUIHwgXAotCQkJICAgU05EX0pBQ0tfTUVDSEFOSUNBTCB8IFNORF9KQUNLX01JQ1JPUEhPTkUyIHwgXAotCQkJICAgU05EX0pBQ0tfVU5TVVBQT1JURUQpCi0KLSNkZWZpbmUgV0NEX01CSENfSkFDS19CVVRUT05fTUFTSyAoU05EX0pBQ0tfQlROXzAgfCBTTkRfSkFDS19CVE5fMSB8IFwKLQkJCQkgIFNORF9KQUNLX0JUTl8yIHwgU05EX0pBQ0tfQlROXzMgfCBcCi0JCQkJICBTTkRfSkFDS19CVE5fNCB8IFNORF9KQUNLX0JUTl81KQotI2RlZmluZSBPQ1BfQVRURU1QVCAyMAotI2RlZmluZSBIU19ERVRFQ1RfUExVR19USU1FX01TICgzICogMTAwMCkKLSNkZWZpbmUgU1BFQ0lBTF9IU19ERVRFQ1RfVElNRV9NUyAoMiAqIDEwMDApCi0jZGVmaW5lIE1CSENfQlVUVE9OX1BSRVNTX1RIUkVTSE9MRF9NSU4gMjUwCi0jZGVmaW5lIEdORF9NSUNfU1dBUF9USFJFU0hPTEQgNAotI2RlZmluZSBXQ0RfRkFLRV9SRU1PVkFMX01JTl9QRVJJT0RfTVMgMTAwCi0jZGVmaW5lIEhTX1ZSRUZfTUlOX1ZBTCAxNDAwCi0jZGVmaW5lIEZXX1JFQURfQVRURU1QVFMgMTUKLSNkZWZpbmUgRldfUkVBRF9USU1FT1VUIDQwMDAwMDAKLSNkZWZpbmUgRkFLRV9SRU1fUkVUUllfQVRURU1QVFMgMwotI2RlZmluZSBNQVhfSU1QRUQgNjAwMDAKLQotI2RlZmluZSBXQ0RfTUJIQ19CVE5fUFJFU1NfQ09NUExfVElNRU9VVF9NUyAgNTAKLSNkZWZpbmUgQU5DX0RFVEVDVF9SRVRSWV9DTlQgNwotI2RlZmluZSBXQ0RfTUJIQ19TUExfSFNfQ05UICAxCi0KLWVudW0gd2NkX21iaGNfZGV0ZWN0X2xvZ2ljIHsKLQlXQ0RfREVURUNUSU9OX0xFR0FDWSwKLQlXQ0RfREVURUNUSU9OX0FEQywKLX07Ci0KLWVudW0gd2NkX21iaGNfY3NfbWJfZW5fZmxhZyB7Ci0JV0NEX01CSENfRU5fQ1MgPSAwLAotCVdDRF9NQkhDX0VOX01CLAotCVdDRF9NQkhDX0VOX1BVTExVUCwKLQlXQ0RfTUJIQ19FTl9OT05FLAotfTsKLQotZW51bSB7Ci0JV0NEX01CSENfRUxFQ19IU19JTlMsCi0JV0NEX01CSENfRUxFQ19IU19SRU0sCi19OwotCi1zdHJ1Y3Qgd2NkX21iaGM7Ci1lbnVtIHdjZF9tYmhjX3JlZ2lzdGVyX2Z1bmN0aW9uIHsKLQlXQ0RfTUJIQ19MX0RFVF9FTiwKLQlXQ0RfTUJIQ19HTkRfREVUX0VOLAotCVdDRF9NQkhDX01FQ0hfREVURUNUSU9OX1RZUEUsCi0JV0NEX01CSENfTUlDX0NMQU1QX0NUTCwKLQlXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSwKLQlXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NUUkwsCi0JV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DT01QX0NUUkwsCi0JV0NEX01CSENfSFBITF9QTFVHX1RZUEUsCi0JV0NEX01CSENfR05EX1BMVUdfVFlQRSwKLQlXQ0RfTUJIQ19TV19IUEhfTFBfMTAwS19UT19HTkQsCi0JV0NEX01CSENfRUxFQ1RfU0NITVRfSVNSQywKLQlXQ0RfTUJIQ19GU01fRU4sCi0JV0NEX01CSENfSU5TUkVNX0RCTkMsCi0JV0NEX01CSENfQlROX0RCTkMsCi0JV0NEX01CSENfSFNfVlJFRiwKLQlXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCwKLQlXQ0RfTUJIQ19NSUNfU0NITVRfUkVTVUxULAotCVdDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxULAotCVdDRF9NQkhDX0hQSFJfU0NITVRfUkVTVUxULAotCVdDRF9NQkhDX09DUF9GU01fRU4sCi0JV0NEX01CSENfQlROX1JFU1VMVCwKLQlXQ0RfTUJIQ19CVE5fSVNSQ19DVEwsCi0JV0NEX01CSENfRUxFQ1RfUkVTVUxULAotCVdDRF9NQkhDX01JQ0JfQ1RSTCwgICAgLyogUHVsbC11cCBhbmQgbWljYiBjb250cm9sICovCi0JV0NEX01CSENfSFBIX0NOUF9XR19USU1FLAotCVdDRF9NQkhDX0hQSFJfUEFfRU4sCi0JV0NEX01CSENfSFBITF9QQV9FTiwKLQlXQ0RfTUJIQ19IUEhfUEFfRU4sCi0JV0NEX01CSENfU1dDSF9MRVZFTF9SRU1PVkUsCi0JV0NEX01CSENfUFVMTERPV05fQ1RSTCwKLQlXQ0RfTUJIQ19BTkNfREVUX0VOLAotCVdDRF9NQkhDX0ZTTV9TVEFUVVMsCi0JV0NEX01CSENfTVVYX0NUTCwKLQlXQ0RfTUJIQ19IUEhMX09DUF9ERVRfRU4sCi0JV0NEX01CSENfSFBIUl9PQ1BfREVUX0VOLAotCVdDRF9NQkhDX0hQSExfT0NQX1NUQVRVUywKLQlXQ0RfTUJIQ19IUEhSX09DUF9TVEFUVVMsCi0JV0NEX01CSENfQURDX0VOLAotCVdDRF9NQkhDX0FEQ19DT01QTEVURSwKLQlXQ0RfTUJIQ19BRENfVElNRU9VVCwKLQlXQ0RfTUJIQ19BRENfUkVTVUxULAotCVdDRF9NQkhDX01JQ0IyX1ZPVVQsCi0JV0NEX01CSENfQURDX01PREUsCi0JV0NEX01CSENfREVURUNUSU9OX0RPTkUsCi0JV0NEX01CSENfRUxFQ1RfSVNSQ19FTiwKLQlXQ0RfTUJIQ19SRUdfRlVOQ19NQVgsCi19OwotCi1lbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSB7Ci0JTUJIQ19QTFVHX1RZUEVfSU5WQUxJRCA9IC0xLAotCU1CSENfUExVR19UWVBFX05PTkUsCi0JTUJIQ19QTFVHX1RZUEVfSEVBRFNFVCwKLQlNQkhDX1BMVUdfVFlQRV9IRUFEUEhPTkUsCi0JTUJIQ19QTFVHX1RZUEVfSElHSF9IUEgsCi0JTUJIQ19QTFVHX1RZUEVfR05EX01JQ19TV0FQLAotCU1CSENfUExVR19UWVBFX0FOQ19IRUFEUEhPTkUsCi19OwotCi1lbnVtIHBhX2RhY19hY2tfZmxhZ3MgewotCVdDRF9NQkhDX0hQSExfUEFfT0ZGX0FDSyA9IDAsCi0JV0NEX01CSENfSFBIUl9QQV9PRkZfQUNLLAotfTsKLQotZW51bSBhbmNfYWNrX2ZsYWdzIHsKLQlXQ0RfTUJIQ19BTkMwX09GRl9BQ0sgPSAwLAotCVdDRF9NQkhDX0FOQzFfT0ZGX0FDSywKLX07Ci0KLWVudW0gd2NkX21iaGNfYnRuX2RldF9tZW0gewotCVdDRF9NQkhDX0JUTl9ERVRfVl9CVE5fTE9XLAotCVdDRF9NQkhDX0JUTl9ERVRfVl9CVE5fSElHSAotfTsKLQotZW51bSB7Ci0JTUlDX0JJQVNfMSA9IDEsCi0JTUlDX0JJQVNfMiwKLQlNSUNfQklBU18zLAotCU1JQ19CSUFTXzQKLX07Ci0KLWVudW0gewotCU1JQ0JfUFVMTFVQX0VOQUJMRSwKLQlNSUNCX1BVTExVUF9ESVNBQkxFLAotCU1JQ0JfRU5BQkxFLAotCU1JQ0JfRElTQUJMRSwKLX07Ci0KLWVudW0gewotCU1CSENfQ09NTU9OX01JQ0JfUFJFQ0hBUkdFLAotCU1CSENfQ09NTU9OX01JQ0JfU0VUX1ZBTCwKLQlNQkhDX0NPTU1PTl9NSUNCX1RBSUxfQ1VSUiwKLX07Ci0KLWVudW0gd2NkX25vdGlmeV9ldmVudCB7Ci0JV0NEX0VWRU5UX0lOVkFMSUQsCi0JLyogZXZlbnRzIGZvciBtaWNiaWFzIE9OIGFuZCBPRkYgKi8KLQlXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PRkYsCi0JV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRiwKLQlXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PTiwKLQlXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT04sCi0JV0NEX0VWRU5UX1BSRV9EQVBNX01JQ0JJQVNfMl9PRkYsCi0JV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGLAotCVdDRF9FVkVOVF9QUkVfREFQTV9NSUNCSUFTXzJfT04sCi0JV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT04sCi0JLyogZXZlbnRzIGZvciBQQSBPTiBhbmQgT0ZGICovCi0JV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09OLAotCVdDRF9FVkVOVF9QT1NUX0hQSExfUEFfT0ZGLAotCVdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PTiwKLQlXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRiwKLQlXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT0ZGLAotCVdDRF9FVkVOVF9QUkVfSFBIUl9QQV9PRkYsCi0JV0NEX0VWRU5UX09DUF9PRkYsCi0JV0NEX0VWRU5UX09DUF9PTiwKLQlXQ0RfRVZFTlRfTEFTVCwKLX07Ci0KLWVudW0gd2NkX21iaGNfZXZlbnRfc3RhdGUgewotCVdDRF9NQkhDX0VWRU5UX1BBX0hQSEwsCi0JV0NEX01CSENfRVZFTlRfUEFfSFBIUiwKLX07Ci0KLXN0cnVjdCB3Y2RfbWJoY19nZW5lcmFsX2NmZyB7Ci0JdTggdF9sZG9oOwotCXU4IHRfYmdfZmFzdF9zZXR0bGU7Ci0JdTggdF9zaHV0ZG93bl9wbHVnX3JlbTsKLQl1OCBtYmhjX25zYTsKLQl1OCBtYmhjX25hdmc7Ci0JdTggdl9taWNiaWFzX2w7Ci0JdTggdl9taWNiaWFzOwotCXU4IG1iaGNfcmVzZXJ2ZWQ7Ci0JdTE2IHNldHRsZV93YWl0OwotCXUxNiB0X21pY2JpYXNfcmFtcHVwOwotCXUxNiB0X21pY2JpYXNfcmFtcGRvd247Ci0JdTE2IHRfc3VwcGx5X2JyaW5ndXA7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgd2NkX21iaGNfcGx1Z19kZXRlY3RfY2ZnIHsKLQl1MzIgbWljX2N1cnJlbnQ7Ci0JdTMyIGhwaF9jdXJyZW50OwotCXUxNiB0X21pY19waWQ7Ci0JdTE2IHRfaW5zX2NvbXBsZXRlOwotCXUxNiB0X2luc19yZXRyeTsKLQl1MTYgdl9yZW1vdmFsX2RlbHRhOwotCXU4IG1pY2JpYXNfc2xvd19yYW1wOwotCXU4IHJlc2VydmVkMDsKLQl1OCByZXNlcnZlZDE7Ci0JdTggcmVzZXJ2ZWQyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHdjZF9tYmhjX3BsdWdfdHlwZV9jZmcgewotCXU4IGF2X2RldGVjdDsKLQl1OCBtb25vX2RldGVjdDsKLQl1OCBudW1faW5zX3RyaWVzOwotCXU4IHJlc2VydmVkMDsKLQlzMTYgdl9ub19taWM7Ci0JczE2IHZfYXZfbWluOwotCXMxNiB2X2F2X21heDsKLQlzMTYgdl9oc19taW47Ci0JczE2IHZfaHNfbWF4OwotCXUxNiByZXNlcnZlZDE7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgewotCXM4IGNbOF07Ci0JdTggbmM7Ci0JdTggbl9tZWFzOwotCXU4IG1iaGNfbnNjOwotCXU4IG5fYnRuX21lYXM7Ci0JdTggbl9idG5fY29uOwotCXU4IG51bV9idG47Ci0JdTggcmVzZXJ2ZWQwOwotCXU4IHJlc2VydmVkMTsKLQl1MTYgdF9wb2xsOwotCXUxNiB0X2JvdW5jZV93YWl0OwotCXUxNiB0X3JlbF90aW1lb3V0OwotCXMxNiB2X2J0bl9wcmVzc19kZWx0YV9zdGE7Ci0JczE2IHZfYnRuX3ByZXNzX2RlbHRhX2NpYzsKLQl1MTYgdF9idG4wX3RpbWVvdXQ7Ci0JczE2IF92X2J0bl9sb3dbMF07IC8qIHZfYnRuX2xvd1tudW1fYnRuXSAqLwotCXMxNiBfdl9idG5faGlnaFswXTsgLyogdl9idG5faGlnaFtudW1fYnRuXSAqLwotCXU4IF9uX3JlYWR5WzJdOwotCXU4IF9uX2NpY1syXTsKLQl1OCBfZ2FpblsyXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB3Y2RfbWJoY19pbXBlZF9kZXRlY3RfY2ZnIHsKLQl1OCBfaHNfaW1wZWRfZGV0ZWN0OwotCXU4IF9uX3Jsb2FkOwotCXU4IF9ocGhfa2VlcF9vbjsKLQl1OCBfcmVwZWF0X3Jsb2FkX2NhbGM7Ci0JdTE2IF90X2RhY19yYW1wX3RpbWU7Ci0JdTE2IF9yaHBoX2hpZ2g7Ci0JdTE2IF9yaHBoX2xvdzsKLQl1MTYgX3Jsb2FkWzBdOyAvKiBybG9hZFtuX3Jsb2FkXSAqLwotCXUxNiBfYWxwaGFbMF07IC8qIGFscGhhW25fcmxvYWRdICovCi0JdTE2IF9iZXRhWzNdOwotfSBfX3BhY2tlZDsKLQotZW51bSB3Y2RfbWJoY19ocGhfdHlwZSB7Ci0JV0NEX01CSENfSFBIX05PTkUgPSAwLAotCVdDRF9NQkhDX0hQSF9NT05PLAotCVdDRF9NQkhDX0hQSF9TVEVSRU8sCi19OwotCi0vKgotICogVGhlc2UgZW51bSBkZWZpbml0aW9ucyBhcmUgZGlyZWN0bHkgbWFwcGVkIHRvIHRoZSByZWdpc3RlcgotICogZGVmaW5pdGlvbnMKLSAqLwotZW51bSBtYmhjX21vaXN0dXJlX3ZyZWYgewotCVZfT0ZGLAotCVZfNDVfTVYsCi0JVl8xMDBfTVYsCi0JVl8yMjVfTVYsCi19OwotCi1lbnVtIG1iaGNfaHNfcHVsbHVwX2lyZWYgewotCUlfREVGQVVMVCA9IC0xLAotCUlfT0ZGID0gMCwKLQlJXzFQMF9VQSwKLQlJXzJQMF9VQSwKLQlJXzNQMF9VQSwKLX07Ci0KLWVudW0gbWJoY19tb2lzdHVyZV9ycmVmIHsKLQlSX09GRiwKLQlSXzI0X0tPSE0sCi0JUl84NF9LT0hNLAotCVJfMTg0X0tPSE0sCi19OwotCi1zdHJ1Y3QgdXNiY19hbmFfYXVkaW9fY29uZmlnIHsKLQlpbnQgdXNiY19lbjFfZ3BpbzsKLQlpbnQgdXNiY19lbjJfZ3BpbzsKLQlpbnQgdXNiY19mb3JjZV9ncGlvOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdXNiY19lbjFfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICp1c2JjX2VuMl9ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnVzYmNfZm9yY2VfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi19OwotCi1zdHJ1Y3Qgd2NkX21iaGNfY29uZmlnIHsKLQlib29sIHJlYWRfZndfYmluOwotCXZvaWQgKmNhbGlicmF0aW9uOwotCWJvb2wgZGV0ZWN0X2V4dG5fY2FibGU7Ci0JYm9vbCBtb25vX3N0ZXJvX2RldGVjdGlvbjsKLQlib29sICgqc3dhcF9nbmRfbWljKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgYWN0aXZlKTsKLQlib29sIGhzX2V4dF9taWNiaWFzOwotCWJvb2wgZ25kX2RldF9lbjsKLQlpbnQga2V5X2NvZGVbV0NEX01CSENfS0VZQ09ERV9OVU1dOwotCXVpbnQzMl90IGxpbmVpbl90aDsKLQlib29sIG1vaXN0dXJlX2VuOwotCWludCBtYmhjX21pY2JpYXM7Ci0JaW50IGFuY19taWNiaWFzOwotCWJvb2wgZW5hYmxlX2FuY19taWNfZGV0ZWN0OwotCXUzMiBlbmFibGVfdXNiY19hbmFsb2c7Ci0Jc3RydWN0IHVzYmNfYW5hX2F1ZGlvX2NvbmZpZyB1c2JjX2FuYWxvZ19jZmc7Ci19OwotCi1zdHJ1Y3Qgd2NkX21iaGNfaW50ciB7Ci0JaW50IG1iaGNfc3dfaW50cjsKLQlpbnQgbWJoY19idG5fcHJlc3NfaW50cjsKLQlpbnQgbWJoY19idG5fcmVsZWFzZV9pbnRyOwotCWludCBtYmhjX2hzX2luc19pbnRyOwotCWludCBtYmhjX2hzX3JlbV9pbnRyOwotCWludCBocGhfbGVmdF9vY3A7Ci0JaW50IGhwaF9yaWdodF9vY3A7Ci19OwotCi1zdHJ1Y3Qgd2NkX21iaGNfcmVnaXN0ZXIgewotCWNvbnN0IGNoYXIgKmlkOwotCXUxNiByZWc7Ci0JdTggbWFzazsKLQl1OCBvZmZzZXQ7Ci0JdTggaW52ZXJ0OwotfTsKLQotc3RydWN0IHdjZF9tYmhjX2NiIHsKLQlpbnQgKCplbmFibGVfbWJfc291cmNlKShzdHJ1Y3Qgd2NkX21iaGMgKiwgYm9vbCk7Ci0Jdm9pZCAoKnRyaW1fYnRuX3JlZykoc3RydWN0IHNuZF9zb2NfY29kZWMgKik7Ci0Jdm9pZCAoKmNvbXB1dGVfaW1wZWRhbmNlKShzdHJ1Y3Qgd2NkX21iaGMgKiwgdWludDMyX3QgKiwgdWludDMyX3QgKik7Ci0Jdm9pZCAoKnNldF9taWNiaWFzX3ZhbHVlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKLQl2b2lkICgqc2V0X2F1dG9femVyb2luZykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqICgqZ2V0X2h3ZGVwX2Z3X2NhbCkoc3RydWN0IHdjZF9tYmhjICosCi0JCQllbnVtIHdjZF9jYWxfdHlwZSk7Ci0Jdm9pZCAoKnNldF9jYXBfbW9kZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCwgYm9vbCk7Ci0JaW50ICgqcmVnaXN0ZXJfbm90aWZpZXIpKHN0cnVjdCB3Y2RfbWJoYyAqLAotCQkJCSBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaywKLQkJCQkgYm9vbCBlbmFibGUpOwotCWludCAoKnJlcXVlc3RfaXJxKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAotCQkJaW50LCBpcnFfaGFuZGxlcl90LCBjb25zdCBjaGFyICosIHZvaWQgKik7Ci0Jdm9pZCAoKmlycV9jb250cm9sKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAotCQkJaW50IGlycSwgYm9vbCBlbmFibGUpOwotCWludCAoKmZyZWVfaXJxKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLAotCQkJaW50IGlycSwgdm9pZCAqKTsKLQl2b2lkICgqY2xrX3NldHVwKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKLQlpbnQgKCptYXBfYnRuX2NvZGVfdG9fbnVtKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKLQlib29sICgqbG9ja19zbGVlcCkoc3RydWN0IHdjZF9tYmhjICosIGJvb2wpOwotCWJvb2wgKCptaWNiaWFzX2VuYWJsZV9zdGF0dXMpKHN0cnVjdCB3Y2RfbWJoYyAqLCBpbnQpOwotCXZvaWQgKCptYmhjX2JpYXMpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOwotCXZvaWQgKCptYmhjX2NvbW1vbl9taWNiX2N0cmwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosCi0JCQkJICAgICAgaW50IGV2ZW50LCBib29sKTsKLQl2b2lkICgqbWljYl9pbnRlcm5hbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKLQkJCWludCBtaWNiX251bSwgYm9vbCk7Ci0JYm9vbCAoKmhwaF9wYV9vbl9zdGF0dXMpKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOwotCXZvaWQgKCpzZXRfYnRuX3Rocikoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgczE2ICosIHMxNiAqLAotCQkJICAgIGludCBudW1fYnRuLCBib29sKTsKLQl2b2lkICgqaHBoX3B1bGxfdXBfY29udHJvbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKLQkJCQkgICAgZW51bSBtYmhjX2hzX3B1bGx1cF9pcmVmKTsKLQlpbnQgKCptYmhjX21pY2JpYXNfY29udHJvbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgaW50LCBpbnQgcmVxKTsKLQl2b2lkICgqbWJoY19taWNiX3JhbXBfY29udHJvbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Ci0Jdm9pZCAoKnNraXBfaW1wZWRfZGV0ZWN0KShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKLQlib29sICgqZXh0bl91c2VfbWIpKHN0cnVjdCBzbmRfc29jX2NvZGVjICopOwotCWludCAoKm1iaGNfbWljYl9jdHJsX3Rocl9taWMpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGludCwgYm9vbCk7Ci0Jdm9pZCAoKm1iaGNfZ25kX2RldF9jdHJsKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKLQl2b2lkICgqaHBoX3B1bGxfZG93bl9jdHJsKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKLQl2b2lkICgqbWJoY19tb2lzdHVyZV9jb25maWcpKHN0cnVjdCB3Y2RfbWJoYyAqKTsKLQlib29sICgqaHBoX3JlZ2lzdGVyX3JlY292ZXJ5KShzdHJ1Y3Qgd2NkX21iaGMgKik7Ci0Jdm9pZCAoKnVwZGF0ZV9hbmNfc3RhdGUpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgYm9vbCBlbmFibGUsIGludCBhbmNfbnVtKTsKLQlib29sICgqaXNfYW5jX29uKShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOwotfTsKLQotc3RydWN0IHdjZF9tYmhjX2ZuIHsKLQlpcnFyZXR1cm5fdCAoKndjZF9tYmhjX2hzX2luc19pcnEpKGludCBpcnEsIHZvaWQgKmRhdGEpOwotCWlycXJldHVybl90ICgqd2NkX21iaGNfaHNfcmVtX2lycSkoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci0Jdm9pZCAoKndjZF9tYmhjX2RldGVjdF9wbHVnX3R5cGUpKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYyk7Ci0JYm9vbCAoKndjZF9tYmhjX2RldGVjdF9hbmNfcGx1Z190eXBlKShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOwotCXZvaWQgKCp3Y2RfY2FuY2VsX2hzX2RldGVjdF9wbHVnKShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJCSAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLX07Ci0KLXN0cnVjdCB3Y2RfbWJoYyB7Ci0JLyogRGVsYXllZCB3b3JrIHRvIHJlcG9ydCBsb25nIGJ1dHRvbiBwcmVzcyAqLwotCXN0cnVjdCBkZWxheWVkX3dvcmsgbWJoY19idG5fZHdvcms7Ci0JaW50IGJ1dHRvbnNfcHJlc3NlZDsKLQlzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZzsKLQljb25zdCBzdHJ1Y3Qgd2NkX21iaGNfY2IgKm1iaGNfY2I7Ci0KLQl1MzIgaHBoX3N0YXR1czsgLyogdHJhY2sgaGVhZGhwb25lIHN0YXR1cyAqLwotCXU4IGhwaGxvY3BfY250OyAvKiBoZWFkcGhvbmUgbGVmdCBvY3AgcmV0cnkgKi8KLQl1OCBocGhyb2NwX2NudDsgLyogaGVhZHBob25lIHJpZ2h0IG9jcCByZXRyeSAqLwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9idG5fcHJlc3M7Ci0JYm9vbCBpc19idG5fcHJlc3M7Ci0JdTggY3VycmVudF9wbHVnOwotCWJvb2wgaW5fc3djaF9pcnFfaGFuZGxlcjsKLQlib29sIGhwaGxfc3doOyAvKnRyYWNrIEhQSEwgc3dpdGNoIE5DIC8gTk8gKi8KLQlib29sIGduZF9zd2g7IC8qdHJhY2sgR05EIHN3aXRjaCBOQyAvIE5PICovCi0JdTMyIG1vaXN0X3ZyZWY7Ci0JdTMyIG1vaXN0X2lyZWY7Ci0JdTMyIG1vaXN0X3JyZWY7Ci0JdTggbWljYmlhczFfY2FwX21vZGU7IC8qIHRyYWNrIGV4dCBjYXAgc2V0dGluZyAqLwotCXU4IG1pY2JpYXMyX2NhcF9tb2RlOyAvKiB0cmFjayBleHQgY2FwIHNldHRpbmcgKi8KLQlib29sIGhzX2RldGVjdF93b3JrX3N0b3A7Ci0JYm9vbCBtaWNiaWFzX2VuYWJsZTsKLQlib29sIGJ0bl9wcmVzc19pbnRyOwotCWJvb2wgaXNfaHNfcmVjb3JkaW5nOwotCWJvb2wgaXNfZXh0bl9jYWJsZTsKLQlib29sIHNraXBfaW1wZWRfZGV0ZWN0aW9uOwotCWJvb2wgaXNfYnRuX2FscmVhZHlfcmVnZDsKLQlib29sIGV4dG5fY2FibGVfaHBoX3JlbTsKLQotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQkvKiBXb3JrIHRvIHBlcmZvcm0gTUJIQyBGaXJtd2FyZSBSZWFkICovCi0Jc3RydWN0IGRlbGF5ZWRfd29yayBtYmhjX2Zpcm13YXJlX2R3b3JrOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqbWJoY19mdzsKLQlzdHJ1Y3QgZmlybXdhcmVfY2FsICptYmhjX2NhbDsKLQotCS8qIHRyYWNrIFBBL0RBQyBzdGF0ZSB0byBzeW5jIHdpdGggdXNlcnNwYWNlICovCi0JdW5zaWduZWQgbG9uZyBocGhfcGFfZGFjX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgaHBoX2FuY19zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGV2ZW50X3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgamlmZmllc19hdHJlcG9ydDsKLQotCS8qIGltcGVkYW5jZSBvZiBocGhsIGFuZCBocGhyICovCi0JdWludDMyX3QgemwsIHpyOwotCWJvb2wgaW1wZWRhbmNlX2RldGVjdDsKLQotCS8qIEhvbGRzIHR5cGUgb2YgSGVhZHNldCAtIE1vbm8vU3RlcmVvICovCi0JZW51bSB3Y2RfbWJoY19ocGhfdHlwZSBocGhfdHlwZTsKLQotCXN0cnVjdCBzbmRfc29jX2phY2sgaGVhZHNldF9qYWNrOwotCXN0cnVjdCBzbmRfc29jX2phY2sgYnV0dG9uX2phY2s7Ci0Jc3RydWN0IG11dGV4IGNvZGVjX3Jlc291cmNlX2xvY2s7Ci0KLQkvKiBIb2xkcyBjb2RlYyBzcGVjaWZpYyBpbnRlcnJ1cHQgbWFwcGluZyAqLwotCWNvbnN0IHN0cnVjdCB3Y2RfbWJoY19pbnRyICppbnRyX2lkczsKLQotCS8qIFdvcmsgdG8gY29ycmVjdCBhY2Nlc3NvcnkgdHlwZSAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjb3JyZWN0X3BsdWdfc3djaDsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmJsb2NrOwotCi0Jc3RydWN0IHdjZF9tYmhjX3JlZ2lzdGVyICp3Y2RfbWJoY19yZWdzOwotCi0Jc3RydWN0IGNvbXBsZXRpb24gYnRuX3ByZXNzX2NvbXBsOwotCXN0cnVjdCBtdXRleCBocGhsX3BhX2xvY2s7Ci0Jc3RydWN0IG11dGV4IGhwaHJfcGFfbG9jazsKLQotCS8qIEhvbGRzIG1iaGMgZGV0ZWN0aW9uIG1ldGhvZCAtIEFEQy9MZWdhY3kgKi8KLQl1bnNpZ25lZCBpbnQgbWJoY19kZXRlY3Rpb25fbG9naWM7Ci0KLQl1bnNpZ25lZCBsb25nIGludHJfc3RhdHVzOwotCWJvb2wgaXNfaHBoX29jcF9wZW5kaW5nOwotCi0JYm9vbCB1c2JjX2ZvcmNlX3ByX21vZGU7Ci0JaW50IHVzYmNfbW9kZTsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHN5X25iOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYl9wc3k7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHVzYmNfYW5hbG9nX3dvcms7Ci0KLQlzdHJ1Y3Qgd2NkX21iaGNfZm4gKm1iaGNfZm47Ci19OwotCi12b2lkIHdjZF9tYmhjX2ZpbmRfcGx1Z19hbmRfcmVwb3J0KHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQkgICBlbnVtIHdjZF9tYmhjX3BsdWdfdHlwZSBwbHVnX3R5cGUpOwotdm9pZCB3Y2RfbWJoY19oc19lbGVjX2lycShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIGludCBpcnFfdHlwZSwgYm9vbCBlbmFibGUpOwotdm9pZCB3Y2RfbWJoY19lbGVjX2hzX3JlcG9ydF91bnBsdWcoc3RydWN0IHdjZF9tYmhjICptYmhjKTsKLWJvb2wgd2NkX3N3Y2hfbGV2ZWxfcmVtb3ZlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYyk7Ci12b2lkIHdjZF9lbmFibGVfY3Vycl9taWNiaWFzKGNvbnN0IHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCSAgICAgY29uc3QgZW51bSB3Y2RfbWJoY19jc19tYl9lbl9mbGFnIGNzX21iX2VuKTsKLXZvaWQgd2NkX21iaGNfamFja19yZXBvcnQoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJICBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgc3RhdHVzLCBpbnQgbWFzayk7Ci1pbnQgd2NkX2NhbmNlbF9idG5fd29yayhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOwotaW50IHdjZF9tYmhjX2dldF9idXR0b25fbWFzayhzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMpOwotCi0jZW5kaWYgLyogX19XQ0RfTUJIQ19WMl9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLXNwaS1yZWdpc3RlcnMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkLXNwaS1yZWdpc3RlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1Nzk2OS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1zcGktcmVnaXN0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1dDRF9TUElfUkVHSVNURVJTX0hfXwotI2RlZmluZSBfX1dDRF9TUElfUkVHSVNURVJTX0hfXwotCi0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0KLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9TQU5JVFkgICAgICAgICAoMHgwMCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9ERVZJQ0VfSUQgICAgICAoMHgwNCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9TVEFUVVMgICAgICAgICAoMHgwOCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9DT05GSUcgICAgICAgICAoMHgwYykKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9TV19SRVNFVCAgICAgICAoMHgxMCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9JUlFfU1RBVFVTICAgICAoMHgxNCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9JUlFfRU4gICAgICAgICAoMHgxOCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9JUlFfQ0xSICAgICAgICAoMHgxYykKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9JUlFfRk9SQ0UgICAgICAoMHgyMCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9UWCAgICAgICAgICAgICAoMHgyNCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9URVNUX0JVU19EQVRBICAoMHgyYykKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9URVNUX0JVU19DVFJMICAoMHgzMCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9TV19SU1RfSVJRICAgICAoMHgzNCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9DSEFSX0NGRyAgICAgICAoMHgzOCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9DSEFSX0RBVEFfTU9TSSAoMHgzYykKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9DSEFSX0RBVEFfQ1NfTiAoMHg0MCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9DSEFSX0RBVEFfTUlTTyAoMHg0NCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9UUk5TX0JZVEVfQ05UICAoMHg0YykKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9UUk5TX0xFTiAgICAgICAoMHg1MCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9GSUZPX0xFVkVMICAgICAoMHg1NCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9HRU5FUklDUyAgICAgICAoMHg1OCkKLSNkZWZpbmUgV0NEX1NQSV9TTEFWRV9FWFRfQkFTRV9BRERSICAoMHg1YykKLSNkZWZpbmUgV0NEX1NQSV9NQVhfUkVHSVNURVIgICAgICAgICAoMHg1RikKLQotI2VuZGlmIC8qIEVuZCBfX1dDRF9TUElfUkVHSVNURVJTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Qtc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZC1zcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjYjQ2Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZC1zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+Ci0jaW5jbHVkZSA8c291bmQvd2NkLWRzcC1tZ3IuaD4KLSNpbmNsdWRlIDxzb3VuZC93Y2Qtc3BpLmg+Ci0jaW5jbHVkZSAid2NkLXNwaS1yZWdpc3RlcnMuaCIKLQotLyogQnl0ZSBtYW5pcHVsYXRpb25zICovCi0jZGVmaW5lIFNISUZUXzFfQllURVMgICAgKDgpCi0jZGVmaW5lIFNISUZUXzJfQllURVMgICAgKDE2KQotI2RlZmluZSBTSElGVF8zX0JZVEVTICAgICgyNCkKLQotLyogQ29tbWFuZCBvcGNvZGVzICovCi0jZGVmaW5lIFdDRF9TUElfQ01EX05PUCAgICAgKDB4MDApCi0jZGVmaW5lIFdDRF9TUElfQ01EX1dSRU4gICAgKDB4MDYpCi0jZGVmaW5lIFdDRF9TUElfQ01EX0NMS1JFUSAgKDB4REEpCi0jZGVmaW5lIFdDRF9TUElfQ01EX1JEU1IgICAgKDB4MDUpCi0jZGVmaW5lIFdDRF9TUElfQ01EX0lSUiAgICAgKDB4ODEpCi0jZGVmaW5lIFdDRF9TUElfQ01EX0lSVyAgICAgKDB4ODIpCi0jZGVmaW5lIFdDRF9TUElfQ01EX01JT1IgICAgKDB4ODMpCi0jZGVmaW5lIFdDRF9TUElfQ01EX0ZSRUFEICAgKDB4MEIpCi0jZGVmaW5lIFdDRF9TUElfQ01EX01JT1cgICAgKDB4MDIpCi0jZGVmaW5lIFdDRF9TUElfV1JJVEVfRlJBTUVfT1BDT0RFIFwKLQkoV0NEX1NQSV9DTURfTUlPVyA8PCBTSElGVF8zX0JZVEVTKQotI2RlZmluZSBXQ0RfU1BJX1JFQURfRlJBTUVfT1BDT0RFIFwKLQkoV0NEX1NQSV9DTURfTUlPUiA8PCBTSElGVF8zX0JZVEVTKQotI2RlZmluZSBXQ0RfU1BJX0ZSRUFEX0ZSQU1FX09QQ09ERSBcCi0JKFdDRF9TUElfQ01EX0ZSRUFEIDw8IFNISUZUXzNfQllURVMpCi0KLS8qIENvbW1hbmQgbGVuZ3RocyAqLwotI2RlZmluZSBXQ0RfU1BJX09QQ09ERV9MRU4gICAgICAgKDB4MDEpCi0jZGVmaW5lIFdDRF9TUElfQ01EX05PUF9MRU4gICAgICAoMHgwMSkKLSNkZWZpbmUgV0NEX1NQSV9DTURfV1JFTl9MRU4gICAgICgweDAxKQotI2RlZmluZSBXQ0RfU1BJX0NNRF9DTEtSRVFfTEVOICAgKDB4MDQpCi0jZGVmaW5lIFdDRF9TUElfQ01EX0lSUl9MRU4gICAgICAoMHgwNCkKLSNkZWZpbmUgV0NEX1NQSV9DTURfSVJXX0xFTiAgICAgICgweDA2KQotI2RlZmluZSBXQ0RfU1BJX1dSSVRFX1NJTkdMRV9MRU4gKDB4MDgpCi0jZGVmaW5lIFdDRF9TUElfUkVBRF9TSU5HTEVfTEVOICAoMHgxMykKLSNkZWZpbmUgV0NEX1NQSV9DTURfRlJFQURfTEVOICAgICgweDEzKQotCi0vKiBDb21tYW5kIGRlbGF5cyAqLwotI2RlZmluZSBXQ0RfU1BJX0NMS1JFUV9ERUxBWV9VU0VDUyAoNTAwKQotI2RlZmluZSBXQ0RfU1BJX0NMS19PRkZfVElNRVJfTVMgICAoNTAwKQotI2RlZmluZSBXQ0RfU1BJX1JFU1VNRV9USU1FT1VUX01TIDEwMAotCi0vKiBDb21tYW5kIG1hc2tzICovCi0jZGVmaW5lIFdDRF9DTURfQUREUl9NQVNLICAgICAgICAgICAgXAotCSgweEZGIHwgICAgICAgICAgICAgICAgICAgICAgXAotCSAoMHhGRiA8PCBTSElGVF8xX0JZVEVTKSB8ICAgXAotCSAoMHhGRiA8PCBTSElGVF8yX0JZVEVTKSkKLQotLyogQ2xvY2sgY3RybCByZXF1ZXN0IHJlbGF0ZWQgKi8KLSNkZWZpbmUgV0NEX1NQSV9DTEtfRU5BQkxFIHRydWUKLSNkZWZpbmUgV0NEX1NQSV9DTEtfRElTQUJMRSBmYWxzZQotI2RlZmluZSBXQ0RfU1BJX0NMS19GTEFHX0RFTEFZRUQgICAgKDEgPDwgMCkKLSNkZWZpbmUgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUgICgxIDw8IDEpCi0KLS8qIEludGVybmFsIGFkZHJlc3NlcyAqLwotI2RlZmluZSBXQ0RfU1BJX0FERFJfSVBDX0NUTF9IT1NUICgweDAxMjAxNCkKLQotLyogV29yZCBzaXplcyBhbmQgbWluL21heCBsZW5ndGhzICovCi0jZGVmaW5lIFdDRF9TUElfV09SRF9CWVRFX0NOVCAoNCkKLSNkZWZpbmUgV0NEX1NQSV9SV19NVUxUSV9NSU5fTEVOICgxNikKLQotLyogTWF4IHNpemUgaXMgMzIgYnl0ZXMgbGVzcyB0aGFuIDY0S2J5dGVzICovCi0jZGVmaW5lIFdDRF9TUElfUldfTVVMVElfTUFYX0xFTiAoKDY0ICogMTAyNCkgLSAzMikKLQotLyoKLSAqIE1heCBzaXplIGZvciB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGlzIHRoZSBtYXgKLSAqIHBvc3NpYmxlIHJlYWQvd3JpdGUgbGVuZ3RoICsgMzIgYnl0ZXMgZm9yIHRoZSBTUEkKLSAqIHJlYWQvd3JpdGUgY29tbWFuZCBoZWFkZXIgaXRzZWxmLgotICovCi0jZGVmaW5lIFdDRF9TUElfUldfTUFYX0JVRl9TSVpFIChXQ0RfU1BJX1JXX01VTFRJX01BWF9MRU4gKyAzMikKLQotLyogQWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotI2RlZmluZSBXQ0RfU1BJX1JXX01JTl9BTElHTiAgICBXQ0RfU1BJX1dPUkRfQllURV9DTlQKLSNkZWZpbmUgV0NEX1NQSV9SV19NVUxUSV9BTElHTiAgKDE2KQotCi0vKiBTdGF0dXMgbWFzayBiaXRzICovCi0jZGVmaW5lIFdDRF9TUElfQ0xLX1NUQVRFX0VOQUJMRUQgQklUKDApCi0jZGVmaW5lIFdDRF9TUElfSVNfU1VTUEVOREVEIEJJVCgxKQotCi0vKiBMb2NraW5nIHJlbGF0ZWQgKi8KLSNkZWZpbmUgV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgbG9jaykgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlkZXZfdmRiZygmc3BpLT5kZXYsICIlczogbXV0ZXhfbG9jayglcylcbiIsIFwKLQkJIF9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgXAotCW11dGV4X2xvY2soJmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCBsb2NrKSAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZGV2X3ZkYmcoJnNwaS0+ZGV2LCAiJXM6IG11dGV4X3VubG9jayglcylcbiIsIFwKLQkJIF9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICBcCi0JbXV0ZXhfdW5sb2NrKCZsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdHJ1Y3Qgd2NkX3NwaV9kZWJ1Z19kYXRhIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0JdTMyIGFkZHI7Ci0JdTMyIHNpemU7Ci19OwotCi1zdHJ1Y3Qgd2NkX3NwaV9wcml2IHsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOwotCXUzMiBtZW1fYmFzZV9hZGRyOwotCi0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCi0JLyogTWVzc2FnZSBmb3Igc2luZ2xlIHRyYW5zZmVyICovCi0Jc3RydWN0IHNwaV9tZXNzYWdlIG1zZzE7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyMTsKLQotCS8qIE1lc3NhZ2UgZm9yIHR3byB0cmFuc2ZlcnMgKi8KLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnMjsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIyWzJdOwotCi0JLyogUmVnaXN0ZXIgYWNjZXNzIHJlbGF0ZWQgKi8KLQl1MzIgcmVnX2J5dGVzOwotCXUzMiB2YWxfYnl0ZXM7Ci0KLQkvKiBDbG9jayByZXF1ZXN0cyByZWxhdGVkICovCi0Jc3RydWN0IG11dGV4IGNsa19tdXRleDsKLQlpbnQgY2xrX3VzZXJzOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzX21hc2s7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBjbGtfZHdvcms7Ci0KLQkvKiBUcmFuc2FjdGlvbiByZWxhdGVkICovCi0Jc3RydWN0IG11dGV4IHhmZXJfbXV0ZXg7Ci0KLQlzdHJ1Y3QgZGV2aWNlICptX2RldjsKLQlzdHJ1Y3Qgd2RzcF9tZ3Jfb3BzICptX29wczsKLQotCS8qIERlYnVnZnMgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCB3Y2Rfc3BpX2RlYnVnX2RhdGEgZGVidWdfZGF0YTsKLQotCS8qIENvbXBsZXRpb24gb2JqZWN0IHRvIGluZGljYXRlIHN5c3RlbSByZXN1bWUgY29tcGxldGlvbiAqLwotCXN0cnVjdCBjb21wbGV0aW9uIHJlc3VtZV9jb21wOwotCi0JLyogQnVmZmVycyB0byBob2xkIG1lbW9yeSB1c2VkIGZvciB0cmFuc2ZlcnMgKi8KLQl2b2lkICp0eF9idWY7Ci0Jdm9pZCAqcnhfYnVmOwotfTsKLQotZW51bSB4ZmVyX3JlcXVlc3QgewotCVdDRF9TUElfWEZFUl9XUklURSwKLQlXQ0RfU1BJX1hGRVJfUkVBRCwKLX07Ci0KLQotc3RhdGljIGNoYXIgKndjZF9zcGlfeGZlcl9yZXFfc3RyKGVudW0geGZlcl9yZXF1ZXN0IHJlcSkKLXsKLQlpZiAocmVxID09IFdDRF9TUElfWEZFUl9XUklURSkKLQkJcmV0dXJuICJ4ZmVyX3dyaXRlIjsKLQllbHNlIGlmIChyZXEgPT0gV0NEX1NQSV9YRkVSX1JFQUQpCi0JCXJldHVybiAieGZlcl9yZWFkIjsKLQllbHNlCi0JCXJldHVybiAieGZlcl9pbnZhbGlkIjsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3NwaV9yZWluaXRfeGZlcihzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQotewotCXhmZXItPnR4X2J1ZiA9IE5VTEw7Ci0JeGZlci0+cnhfYnVmID0gTlVMTDsKLQl4ZmVyLT5kZWxheV91c2VjcyA9IDA7Ci0JeGZlci0+bGVuID0gMDsKLX0KLQotc3RhdGljIGJvb2wgd2NkX3NwaV9pc19zdXNwZW5kZWQoc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSkKLXsKLQlyZXR1cm4gdGVzdF9iaXQoV0NEX1NQSV9JU19TVVNQRU5ERUQsICZ3Y2Rfc3BpLT5zdGF0dXNfbWFzayk7Ci19Ci0KLXN0YXRpYyBib29sIHdjZF9zcGlfY2FuX3N1c3BlbmQoc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSkKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gd2NkX3NwaS0+c3BpOwotCi0JaWYgKHdjZF9zcGktPmNsa191c2VycyA+IDAgfHwKLQkgICAgdGVzdF9iaXQoV0NEX1NQSV9DTEtfU1RBVEVfRU5BQkxFRCwgJndjZF9zcGktPnN0YXR1c19tYXNrKSkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjYW5ub3Qgc3VzcGVuZCwgY2xrX3VzZXJzID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2NkX3NwaS0+Y2xrX3VzZXJzKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IHdjZF9zcGlfd2FpdF9mb3JfcmVzdW1lKHN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHdjZF9zcGktPnNwaTsKLQlpbnQgcmMgPSAwOwotCi0JV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQkvKiBJZiB0aGUgc3lzdGVtIGlzIGFscmVhZHkgaW4gcmVzdW1lZCBzdGF0ZSwgcmV0dXJuIHJpZ2h0IGF3YXkgKi8KLQlpZiAoIXdjZF9zcGlfaXNfc3VzcGVuZGVkKHdjZF9zcGkpKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBJZiBzdXNwZW5kZWQgdGhlbiB3YWl0IGZvciByZXN1bWUgdG8gaGFwcGVuICovCi0JcmVpbml0X2NvbXBsZXRpb24oJndjZF9zcGktPnJlc3VtZV9jb21wKTsKLQlXQ0RfU1BJX01VVEVYX1VOTE9DSyhzcGksIHdjZF9zcGktPmNsa19tdXRleCk7Ci0JcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndjZF9zcGktPnJlc3VtZV9jb21wLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoV0NEX1NQSV9SRVNVTUVfVElNRU9VVF9NUykpOwotCVdDRF9TUElfTVVURVhfTE9DSyhzcGksIHdjZF9zcGktPmNsa19tdXRleCk7Ci0JaWYgKHJjID09IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogZmFpbGVkIHRvIHJlc3VtZSBpbiAldSBtc2VjXG4iLAotCQkJX19mdW5jX18sIFdDRF9TUElfUkVTVU1FX1RJTUVPVVRfTVMpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiByZXN1bWUgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOwotCXJjID0gMDsKLWRvbmU6Ci0JV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB3Y2Rfc3BpX3JlYWRfc2luZ2xlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkgICAgICAgdTMyIHJlbW90ZV9hZGRyLCB1MzIgKnZhbCkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdHhfeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMlswXTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpyeF94ZmVyID0gJndjZF9zcGktPnhmZXIyWzFdOwotCXU4ICp0eF9idWYgPSB3Y2Rfc3BpLT50eF9idWY7Ci0JdTMyIGZyYW1lID0gMDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogcmVtb3RlX2FkZHIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgcmVtb3RlX2FkZHIpOwotCi0JaWYgKCF0eF9idWYpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogdHhfYnVmIG5vdCBhbGxvY2F0ZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZyYW1lIHw9IFdDRF9TUElfUkVBRF9GUkFNRV9PUENPREU7Ci0JZnJhbWUgfD0gcmVtb3RlX2FkZHIgJiBXQ0RfQ01EX0FERFJfTUFTSzsKLQotCXdjZF9zcGlfcmVpbml0X3hmZXIodHhfeGZlcik7Ci0JZnJhbWUgPSBjcHVfdG9fYmUzMihmcmFtZSk7Ci0JbWVtY3B5KHR4X2J1ZiwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKTsKLQl0eF94ZmVyLT50eF9idWYgPSB0eF9idWY7Ci0JdHhfeGZlci0+bGVuID0gV0NEX1NQSV9SRUFEX1NJTkdMRV9MRU47Ci0KLQl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHJ4X3hmZXIpOwotCXJ4X3hmZXItPnJ4X2J1ZiA9IHZhbDsKLQlyeF94ZmVyLT5sZW4gPSBzaXplb2YoKnZhbCk7Ci0KLQlyZXQgPSBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9yZWFkX211bHRpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkgICAgICB1MzIgcmVtb3RlX2FkZHIsIHU4ICpkYXRhLAotCQkJICAgICAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMTsKLQl1OCAqdHhfYnVmID0gd2NkX3NwaS0+dHhfYnVmOwotCXU4ICpyeF9idWYgPSB3Y2Rfc3BpLT5yeF9idWY7Ci0JdTMyIGZyYW1lID0gMDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICAiJXM6IGFkZHIgMHgleCwgbGVuID0gJXpkXG4iLAotCQlfX2Z1bmNfXywgcmVtb3RlX2FkZHIsIGxlbik7Ci0KLQlmcmFtZSB8PSBXQ0RfU1BJX0ZSRUFEX0ZSQU1FX09QQ09ERTsKLQlmcmFtZSB8PSByZW1vdGVfYWRkciAmIFdDRF9DTURfQUREUl9NQVNLOwotCi0JaWYgKCF0eF9idWYgfHwgIXJ4X2J1ZikgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiAlcyBub3QgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXywKLQkJCSghdHhfYnVmKSA/ICJ0eF9idWYiIDogInJ4X2J1ZiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHhmZXIpOwotCWZyYW1lID0gY3B1X3RvX2JlMzIoZnJhbWUpOwotCW1lbWNweSh0eF9idWYsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSk7Ci0JeGZlci0+dHhfYnVmID0gdHhfYnVmOwotCXhmZXItPnJ4X2J1ZiA9IHJ4X2J1ZjsKLQl4ZmVyLT5sZW4gPSBXQ0RfU1BJX0NNRF9GUkVBRF9MRU4gKyBsZW47Ci0KLQlyZXQgPSBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cxKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCW1lbWNweShkYXRhLCByeF9idWYgKyBXQ0RfU1BJX0NNRF9GUkVBRF9MRU4sIGxlbik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV93cml0ZV9zaW5nbGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQl1MzIgcmVtb3RlX2FkZHIsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIgPSAmd2NkX3NwaS0+eGZlcjE7Ci0JdTggYnVmW1dDRF9TUElfV1JJVEVfU0lOR0xFX0xFTl07Ci0JdTMyIGZyYW1lID0gMDsKLQotCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IHJlbW90ZV9hZGRyID0gMHgleCwgdmFsID0gMHgleFxuIiwKLQkJX19mdW5jX18sIHJlbW90ZV9hZGRyLCB2YWwpOwotCi0JbWVtc2V0KGJ1ZiwgMCwgV0NEX1NQSV9XUklURV9TSU5HTEVfTEVOKTsKLQlmcmFtZSB8PSBXQ0RfU1BJX1dSSVRFX0ZSQU1FX09QQ09ERTsKLQlmcmFtZSB8PSAocmVtb3RlX2FkZHIgJiBXQ0RfQ01EX0FERFJfTUFTSyk7Ci0KLQlmcmFtZSA9IGNwdV90b19iZTMyKGZyYW1lKTsKLQltZW1jcHkoYnVmLCAmZnJhbWUsIHNpemVvZihmcmFtZSkpOwotCW1lbWNweShidWYgKyBzaXplb2YoZnJhbWUpLCAmdmFsLCBzaXplb2YodmFsKSk7Ci0KLQl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHhmZXIpOwotCXhmZXItPnR4X2J1ZiA9IGJ1ZjsKLQl4ZmVyLT5sZW4gPSBXQ0RfU1BJX1dSSVRFX1NJTkdMRV9MRU47Ci0KLQlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmd2NkX3NwaS0+bXNnMSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV93cml0ZV9tdWx0aShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJICAgICAgIHUzMiByZW1vdGVfYWRkciwgdTggKmRhdGEsCi0JCQkgICAgICAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMTsKLQl1MzIgZnJhbWUgPSAwOwotCXU4ICp0eF9idWYgPSB3Y2Rfc3BpLT50eF9idWY7Ci0JaW50IHhmZXJfbGVuLCByZXQ7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiBhZGRyID0gMHgleCBsZW4gPSAlemRcbiIsCi0JCV9fZnVuY19fLCByZW1vdGVfYWRkciwgbGVuKTsKLQotCWZyYW1lIHw9IFdDRF9TUElfV1JJVEVfRlJBTUVfT1BDT0RFOwotCWZyYW1lIHw9IChyZW1vdGVfYWRkciAmIFdDRF9DTURfQUREUl9NQVNLKTsKLQotCWZyYW1lID0gY3B1X3RvX2JlMzIoZnJhbWUpOwotCXhmZXJfbGVuID0gbGVuICsgc2l6ZW9mKGZyYW1lKTsKLQotCWlmICghdHhfYnVmKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IHR4X2J1ZiBub3QgYWxsb2NhdGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1jcHkodHhfYnVmLCAmZnJhbWUsIHNpemVvZihmcmFtZSkpOwotCW1lbWNweSh0eF9idWYgKyBzaXplb2YoZnJhbWUpLCBkYXRhLCBsZW4pOwotCi0Jd2NkX3NwaV9yZWluaXRfeGZlcih4ZmVyKTsKLQl4ZmVyLT50eF9idWYgPSB0eF9idWY7Ci0JeGZlci0+bGVuID0geGZlcl9sZW47Ci0KLQlyZXQgPSBzcGlfc3luYyhzcGksICZ3Y2Rfc3BpLT5tc2cxKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCwgYWRkciA9IDB4JXgsIGxlbiA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLCByZW1vdGVfYWRkciwgbGVuKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9zcGlfdHJhbnNmZXJfc3BsaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCQkgIHN0cnVjdCB3Y2Rfc3BpX21zZyAqZGF0YV9tc2csCi0JCQkJICBlbnVtIHhmZXJfcmVxdWVzdCB4ZmVyX3JlcSkKLXsKLQl1MzIgYWRkciA9IGRhdGFfbXNnLT5yZW1vdGVfYWRkcjsKLQl1OCAqZGF0YSA9IGRhdGFfbXNnLT5kYXRhOwotCWludCByZW1haW5fc2l6ZSA9IGRhdGFfbXNnLT5sZW47Ci0JaW50IHRvX3hmZXIsIGxvb3BfY250LCByZXQgPSAwOwotCi0JLyogUGVyZm9ybSBzaW5nbGUgd3JpdGVzIHVudGlsIG11bHRpIHdvcmQgYWxpZ25tZW50IGlzIG1ldCAqLwotCWxvb3BfY250ID0gMTsKLQl3aGlsZSAocmVtYWluX3NpemUgJiYKLQkgICAgICAgIUlTX0FMSUdORUQoYWRkciwgV0NEX1NQSV9SV19NVUxUSV9BTElHTikpIHsKLQkJaWYgKHhmZXJfcmVxID09IFdDRF9TUElfWEZFUl9XUklURSkKLQkJCXJldCA9IHdjZF9zcGlfd3JpdGVfc2luZ2xlKHNwaSwgYWRkciwKLQkJCQkJCSAgICgqKHUzMiAqKWRhdGEpKTsKLQkJZWxzZQotCQkJcmV0ID0gd2NkX3NwaV9yZWFkX3NpbmdsZShzcGksIGFkZHIsCi0JCQkJCQkgICh1MzIgKilkYXRhKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSIlczogJXMgZmFpbCBpdGVyKCVkKSBzdGFydC13b3JkIGFkZHIgKDB4JXgpXG4iLAotCQkJCV9fZnVuY19fLCB3Y2Rfc3BpX3hmZXJfcmVxX3N0cih4ZmVyX3JlcSksCi0JCQkJbG9vcF9jbnQsIGFkZHIpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJYWRkciArPSBXQ0RfU1BJX1dPUkRfQllURV9DTlQ7Ci0JCWRhdGEgKz0gV0NEX1NQSV9XT1JEX0JZVEVfQ05UOwotCQlyZW1haW5fc2l6ZSAtPSBXQ0RfU1BJX1dPUkRfQllURV9DTlQ7Ci0JCWxvb3BfY250Kys7Ci0JfQotCi0JLyogUGVyZm9ybSBtdWx0aSB3cml0ZXMgZm9yIG1heCBhbGxvd2VkIG11bHRpIHdyaXRlcyAqLwotCWxvb3BfY250ID0gMTsKLQl3aGlsZSAocmVtYWluX3NpemUgPj0gV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOKSB7Ci0JCWlmICh4ZmVyX3JlcSA9PSBXQ0RfU1BJX1hGRVJfV1JJVEUpCi0JCQlyZXQgPSB3Y2Rfc3BpX3dyaXRlX211bHRpKHNwaSwgYWRkciwgZGF0YSwKLQkJCQkJCSAgV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOKTsKLQkJZWxzZQotCQkJcmV0ID0gd2NkX3NwaV9yZWFkX211bHRpKHNwaSwgYWRkciwgZGF0YSwKLQkJCQkJCSBXQ0RfU1BJX1JXX01VTFRJX01BWF9MRU4pOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIiVzOiAlcyBmYWlsIGl0ZXIoJWQpIG1heC13cml0ZSBhZGRyICgweCV4KVxuIiwKLQkJCQlfX2Z1bmNfXywgd2NkX3NwaV94ZmVyX3JlcV9zdHIoeGZlcl9yZXEpLAotCQkJCWxvb3BfY250LCBhZGRyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWFkZHIgKz0gV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOOwotCQlkYXRhICs9IFdDRF9TUElfUldfTVVMVElfTUFYX0xFTjsKLQkJcmVtYWluX3NpemUgLT0gV0NEX1NQSV9SV19NVUxUSV9NQVhfTEVOOwotCQlsb29wX2NudCsrOwotCX0KLQotCS8qCi0JICogUGVyZm9ybSB3cml0ZSBmb3IgbWF4IHBvc3NpYmxlIGRhdGEgdGhhdCBpcyBtdWx0aXBsZQotCSAqIG9mIHRoZSBtaW5pbXVtIHNpemUgZm9yIG11bHRpLXdyaXRlIGNvbW1hbmRzLgotCSAqLwotCXRvX3hmZXIgPSByZW1haW5fc2l6ZSAtIChyZW1haW5fc2l6ZSAlIFdDRF9TUElfUldfTVVMVElfTUlOX0xFTik7Ci0JaWYgKHJlbWFpbl9zaXplID49IFdDRF9TUElfUldfTVVMVElfTUlOX0xFTiAmJgotCSAgICB0b194ZmVyID4gMCkgewotCQlpZiAoeGZlcl9yZXEgPT0gV0NEX1NQSV9YRkVSX1dSSVRFKQotCQkJcmV0ID0gd2NkX3NwaV93cml0ZV9tdWx0aShzcGksIGFkZHIsIGRhdGEsIHRvX3hmZXIpOwotCQllbHNlCi0JCQlyZXQgPSB3Y2Rfc3BpX3JlYWRfbXVsdGkoc3BpLCBhZGRyLCBkYXRhLCB0b194ZmVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCSIlczogJXMgZmFpbCB3cml0ZSBhZGRyICgweCV4KSwgc2l6ZSAoMHgleClcbiIsCi0JCQkJX19mdW5jX18sIHdjZF9zcGlfeGZlcl9yZXFfc3RyKHhmZXJfcmVxKSwKLQkJCQlhZGRyLCB0b194ZmVyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWFkZHIgKz0gdG9feGZlcjsKLQkJZGF0YSArPSB0b194ZmVyOwotCQlyZW1haW5fc2l6ZSAtPSB0b194ZmVyOwotCX0KLQotCS8qIFBlcmZvcm0gc2luZ2xlIHdyaXRlcyBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgKi8KLQlsb29wX2NudCA9IDE7Ci0Jd2hpbGUgKHJlbWFpbl9zaXplID4gMCkgewotCQlpZiAoeGZlcl9yZXEgPT0gV0NEX1NQSV9YRkVSX1dSSVRFKQotCQkJcmV0ID0gd2NkX3NwaV93cml0ZV9zaW5nbGUoc3BpLCBhZGRyLCAoKigodTMyICopZGF0YSkpKTsKLQkJZWxzZQotCQkJcmV0ID0gd2NkX3NwaV9yZWFkX3NpbmdsZShzcGksIGFkZHIsICAodTMyICopIGRhdGEpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIiVzOiAlcyBmYWlsIGl0ZXIoJWQpIGVuZC13cml0ZSBhZGRyICgweCV4KVxuIiwKLQkJCQlfX2Z1bmNfXywgd2NkX3NwaV94ZmVyX3JlcV9zdHIoeGZlcl9yZXEpLAotCQkJCWxvb3BfY250LCBhZGRyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWFkZHIgKz0gV0NEX1NQSV9XT1JEX0JZVEVfQ05UOwotCQlkYXRhICs9IFdDRF9TUElfV09SRF9CWVRFX0NOVDsKLQkJcmVtYWluX3NpemUgLT0gV0NEX1NQSV9XT1JEX0JZVEVfQ05UOwotCQlsb29wX2NudCsrOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9zcGlfY21kX25vcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXU4IG5vcCA9IFdDRF9TUElfQ01EX05PUDsKLQotCXJldHVybiBzcGlfd3JpdGUoc3BpLCAmbm9wLCBXQ0RfU1BJX0NNRF9OT1BfTEVOKTsKLX0KLQotc3RhdGljIGludCB3Y2Rfc3BpX2NtZF9jbGtyZXEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMTsKLQl1OCBjbWRbV0NEX1NQSV9DTURfQ0xLUkVRX0xFTl0gPSB7Ci0JCVdDRF9TUElfQ01EX0NMS1JFUSwKLQkJMHhCQSwgMHg4MCwgMHgwMH07Ci0KLQl3Y2Rfc3BpX3JlaW5pdF94ZmVyKHhmZXIpOwotCXhmZXItPnR4X2J1ZiA9IGNtZDsKLQl4ZmVyLT5sZW4gPSBXQ0RfU1BJX0NNRF9DTEtSRVFfTEVOOwotCXhmZXItPmRlbGF5X3VzZWNzID0gV0NEX1NQSV9DTEtSRVFfREVMQVlfVVNFQ1M7Ci0KLQlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmd2NkX3NwaS0+bXNnMSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9jbWRfd3JfZW4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQl1OCB3cl9lbiA9IFdDRF9TUElfQ01EX1dSRU47Ci0KLQlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgJndyX2VuLCBXQ0RfU1BJX0NNRF9XUkVOX0xFTik7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9jbWRfcmRzcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkJICAgIHUzMiAqcmRzcl9zdGF0dXMpCi17Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnR4X3hmZXIgPSAmd2NkX3NwaS0+eGZlcjJbMF07Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqcnhfeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMlsxXTsKLQl1OCByZHNyX2NtZDsKLQl1MzIgc3RhdHVzOwotCWludCByZXQ7Ci0KLQlyZHNyX2NtZCA9IFdDRF9TUElfQ01EX1JEU1I7Ci0Jd2NkX3NwaV9yZWluaXRfeGZlcih0eF94ZmVyKTsKLQl0eF94ZmVyLT50eF9idWYgPSAmcmRzcl9jbWQ7Ci0JdHhfeGZlci0+bGVuID0gc2l6ZW9mKHJkc3JfY21kKTsKLQotCi0Jd2NkX3NwaV9yZWluaXRfeGZlcihyeF94ZmVyKTsKLQlyeF94ZmVyLT5yeF9idWYgPSAmc3RhdHVzOwotCXJ4X3hmZXItPmxlbiA9IHNpemVvZihzdGF0dXMpOwotCi0JcmV0ID0gc3BpX3N5bmMoc3BpLCAmd2NkX3NwaS0+bXNnMik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogUkRTUiBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkqcmRzcl9zdGF0dXMgPSBiZTMyX3RvX2NwdShzdGF0dXMpOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogUkRTUiBzdWNjZXNzLCB2YWx1ZSA9IDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgKnJkc3Jfc3RhdHVzKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2Rfc3BpX2Nsa19lbmFibGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0JaW50IHJldDsKLQl1MzIgcmRfc3RhdHVzID0gMDsKLQotCXJldCA9IHdjZF9zcGlfY21kX25vcChzcGkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IE5PUDEgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gd2NkX3NwaV9jbWRfY2xrcmVxKHNwaSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogQ0xLX1JFUSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3Y2Rfc3BpX2NtZF9ub3Aoc3BpKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBOT1AyIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQl3Y2Rfc3BpX2NtZF9yZHNyKHNwaSwgJnJkX3N0YXR1cyk7Ci0JLyoKLQkgKiBSZWFkIHN0YXR1cyB6ZXJvIG1lYW5zIHJlYWRzIGFyZSBub3QKLQkgKiBoYXBwZW5uaW5nIG9uIHRoZSBidXMsIHBvc3NpYmx5IGJlY2F1c2UKLQkgKiBjbG9jayByZXF1ZXN0IGZhaWxlZC4KLQkgKi8KLQlpZiAocmRfc3RhdHVzKSB7Ci0JCXNldF9iaXQoV0NEX1NQSV9DTEtfU1RBVEVfRU5BQkxFRCwKLQkJCSZ3Y2Rfc3BpLT5zdGF0dXNfbWFzayk7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogUkRTUiBzdGF0dXMgaXMgemVyb1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9jbGtfZGlzYWJsZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gd2NkX3NwaV93cml0ZV9zaW5nbGUoc3BpLCBXQ0RfU1BJX0FERFJfSVBDX0NUTF9IT1NULCAweDAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogRmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCWVsc2UKLQkJY2xlYXJfYml0KFdDRF9TUElfQ0xLX1NUQVRFX0VOQUJMRUQsICZ3Y2Rfc3BpLT5zdGF0dXNfbWFzayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9zcGlfY2xrX2N0cmwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCSAgICBib29sIHJlcXVlc3QsIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0JaW50IHJldCA9IDA7Ci0JY29uc3QgY2hhciAqZGVsYXlfc3RyOwotCi0JZGVsYXlfc3RyID0gKGZsYWdzID09IFdDRF9TUElfQ0xLX0ZMQUdfREVMQVlFRCkgPwotCQkgICAgImRlbGF5ZWQiIDogImltbWVkaWF0ZSI7Ci0KLQlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCi0JLyogUmVqZWN0IGFueSB1bmJhbGFuY2VkIGRpc2FibGUgcmVxdWVzdCAqLwotCWlmICh3Y2Rfc3BpLT5jbGtfdXNlcnMgPCAwIHx8Ci0JICAgICghcmVxdWVzdCAmJiB3Y2Rfc3BpLT5jbGtfdXNlcnMgPT0gMCkpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogVW5iYWxhbmNlZCBjbGtfdXNlcnMgJWQgZm9yICVzXG4iLAotCQkJIF9fZnVuY19fLCB3Y2Rfc3BpLT5jbGtfdXNlcnMsCi0JCQlyZXF1ZXN0ID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwotCQlyZXQgPSAtRUlOVkFMOwotCi0JCS8qIFJlc2V0IHRoZSBjbGtfdXNlcnMgdG8gMCAqLwotCQl3Y2Rfc3BpLT5jbGtfdXNlcnMgPSAwOwotCi0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAocmVxdWVzdCA9PSBXQ0RfU1BJX0NMS19FTkFCTEUpIHsKLQkJLyoKLQkJICogSWYgdGhlIFNQSSBidXMgaXMgc3VzcGVuZGVkLCB0aGVuIHJldHVybiBlcnJvcgotCQkgKiBhcyB0aGUgdHJhbnNhY3Rpb24gY2Fubm90IGJlIGNvbXBsZXRlZC4KLQkJICovCi0JCWlmICh3Y2Rfc3BpX2lzX3N1c3BlbmRlZCh3Y2Rfc3BpKSkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJIiVzOiBTUEkgc3VzcGVuZGVkLCBjYW5ub3QgZW5hYmxlIGNsa1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJLyogQ2FuY2VsIHRoZSBkaXNhYmxlIGNsayB3b3JrICovCi0JCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3Y2Rfc3BpLT5jbGtfZHdvcmspOwotCQlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCi0JCXdjZF9zcGktPmNsa191c2VycysrOwotCi0JCS8qCi0JCSAqIElmIGNsayBzdGF0ZSBpcyBhbHJlYWR5IHNldCwKLQkJICogdGhlbiBjbGsgd2FzbnQgcmVhbGx5IGRpc2FibGVkCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoV0NEX1NQSV9DTEtfU1RBVEVfRU5BQkxFRCwgJndjZF9zcGktPnN0YXR1c19tYXNrKSkKLQkJCWdvdG8gZG9uZTsKLQkJZWxzZSBpZiAod2NkX3NwaS0+Y2xrX3VzZXJzID09IDEpCi0JCQlyZXQgPSB3Y2Rfc3BpX2Nsa19lbmFibGUoc3BpKTsKLQotCX0gZWxzZSB7Ci0JCXdjZF9zcGktPmNsa191c2Vycy0tOwotCi0JCS8qIENsb2NrIGlzIHN0aWxsIHZvdGVkIGZvciAqLwotCQlpZiAod2NkX3NwaS0+Y2xrX3VzZXJzID4gMCkKLQkJCWdvdG8gZG9uZTsKLQotCQkvKgotCQkgKiBJZiB3ZSBhcmUgaGVyZSwgY2xrX3VzZXJzIG11c3QgYmUgMCBhbmQgbmVlZHMKLQkJICogdG8gYmUgZGlzYWJsZWQuIENhbGwgdGhlIGRpc2FibGUgYmFzZWQgb24gdGhlCi0JCSAqIGZsYWdzLgotCQkgKi8KLQkJaWYgKGZsYWdzID09IFdDRF9TUElfQ0xLX0ZMQUdfREVMQVlFRCkgewotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3Y2Rfc3BpLT5jbGtfZHdvcmssCi0JCQkJbXNlY3NfdG9famlmZmllcyhXQ0RfU1BJX0NMS19PRkZfVElNRVJfTVMpKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IHdjZF9zcGlfY2xrX2Rpc2FibGUoc3BpKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJCQkiJXM6IEZhaWxlZCB0byBkaXNhYmxlIGNsayBlcnIgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCX0KLQl9Ci0KLWRvbmU6Ci0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogdXBkYXRlZCBjbGtfdXNlcnMgPSAlZCwgcmVxdWVzdF8lcyAlc1xuIiwKLQkJX19mdW5jX18sIHdjZF9zcGktPmNsa191c2VycywgcmVxdWVzdCA/ICJlbmFibGUiIDogImRpc2FibGUiLAotCQlyZXF1ZXN0ID8gIiIgOiBkZWxheV9zdHIpOwotCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9pbml0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCWludCByZXQ7Ci0KLQlyZXQgPSB3Y2Rfc3BpX2Nsa19jdHJsKHNwaSwgV0NEX1NQSV9DTEtfRU5BQkxFLAotCQkJICAgICAgIFdDRF9TUElfQ0xLX0ZMQUdfSU1NRURJQVRFKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JcmV0ID0gd2NkX3NwaV9jbWRfd3JfZW4oc3BpKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfd3JfZW47Ci0KLQkvKgotCSAqIEluIGNhc2Ugc3BpX2luaXQgaXMgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBkZWluaXQsCi0JICogaXQgaXMgcG9zc2libGUgaGFyZHdhcmUgcmVnaXN0ZXIgc3RhdGUgaXMgYWxzbyByZXNldC4KLQkgKiBTeW5jIHRoZSByZWdjYWNoZSBoZXJlIHNvIGhhcmR3YXJlIHN0YXRlIGlzIHVwZGF0ZWQKLQkgKiB0byByZWZsZWN0IHRoZSBjYWNoZS4KLQkgKi8KLQlyZWdjYWNoZV9zeW5jKHdjZF9zcGktPnJlZ21hcCk7Ci0KLQlyZWdtYXBfd3JpdGUod2NkX3NwaS0+cmVnbWFwLCBXQ0RfU1BJX1NMQVZFX0NPTkZJRywKLQkJICAgICAweDBGM0QwODAwKTsKLQotCS8qIFdyaXRlIHRoZSBNVFUgdG8gbWF4IGFsbG93ZWQgc2l6ZSAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Rfc3BpLT5yZWdtYXAsCi0JCQkgICBXQ0RfU1BJX1NMQVZFX1RSTlNfTEVOLAotCQkJICAgMHhGRkZGMDAwMCwgMHhGRkZGMDAwMCk7Ci1lcnJfd3JfZW46Ci0Jd2NkX3NwaV9jbGtfY3RybChzcGksIFdDRF9TUElfQ0xLX0RJU0FCTEUsCi0JCQkgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3Y2Rfc3BpX2Nsa193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpOwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci0JaW50IHJldDsKLQotCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXdjZF9zcGkgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3Y2Rfc3BpX3ByaXYsIGNsa19kd29yayk7Ci0Jc3BpID0gd2NkX3NwaS0+c3BpOwotCi0JV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQlyZXQgPSB3Y2Rfc3BpX2Nsa19kaXNhYmxlKHNwaSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBjbGssIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IF9fd2NkX3NwaV9kYXRhX3hmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCSAgICAgICBzdHJ1Y3Qgd2NkX3NwaV9tc2cgKm1zZywKLQkJCSAgICAgICBlbnVtIHhmZXJfcmVxdWVzdCB4ZmVyX3JlcSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0JaW50IHJldDsKLQotCS8qIENoZWNrIGZvciBtaW5pbXVtIGFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KLQlpZiAoIUlTX0FMSUdORUQobXNnLT5yZW1vdGVfYWRkciwgV0NEX1NQSV9SV19NSU5fQUxJR04pKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIiVzIGFkZHIgMHgleCBpcyBub3QgYWxpZ25lZCB0byAweCV4XG4iLAotCQkJX19mdW5jX18sIG1zZy0+cmVtb3RlX2FkZHIsIFdDRF9TUElfUldfTUlOX0FMSUdOKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChtc2ctPmxlbiAlIFdDRF9TUElfV09SRF9CWVRFX0NOVCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCSIlcyBsZW4gMHglenggaXMgbm90IG11bHRpcGxlIG9mICVkXG4iLAotCQkJX19mdW5jX18sIG1zZy0+bGVuLCBXQ0RfU1BJX1dPUkRfQllURV9DTlQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT54ZmVyX211dGV4KTsKLQlpZiAobXNnLT5sZW4gPT0gV0NEX1NQSV9XT1JEX0JZVEVfQ05UKSB7Ci0JCWlmICh4ZmVyX3JlcSA9PSBXQ0RfU1BJX1hGRVJfV1JJVEUpCi0JCQlyZXQgPSB3Y2Rfc3BpX3dyaXRlX3NpbmdsZShzcGksIG1zZy0+cmVtb3RlX2FkZHIsCi0JCQkJCQkgICAoKigodTMyICopbXNnLT5kYXRhKSkpOwotCQllbHNlCi0JCQlyZXQgPSB3Y2Rfc3BpX3JlYWRfc2luZ2xlKHNwaSwgbXNnLT5yZW1vdGVfYWRkciwKLQkJCQkJCSAgKHUzMiAqKSBtc2ctPmRhdGEpOwotCX0gZWxzZSB7Ci0JCXJldCA9IHdjZF9zcGlfdHJhbnNmZXJfc3BsaXQoc3BpLCBtc2csIHhmZXJfcmVxKTsKLQl9Ci0JV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT54ZmVyX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9kYXRhX3hmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKLQkJCSAgICAgc3RydWN0IHdjZF9zcGlfbXNnICptc2csCi0JCQkgICAgIGVudW0geGZlcl9yZXF1ZXN0IHJlcSkKLXsKLQlpbnQgcmV0LCByZXQxOwotCi0JaWYgKG1zZy0+bGVuIDw9IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogSW52YWxpZCBzaXplICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBtc2ctPmxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJlcXVlc3QgZm9yIGNsb2NrICovCi0JcmV0ID0gd2NkX3NwaV9jbGtfY3RybChzcGksIFdDRF9TUElfQ0xLX0VOQUJMRSwKLQkJCSAgICAgICBXQ0RfU1BJX0NMS19GTEFHX0lNTUVESUFURSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogY2xrIGVuYWJsZSBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFBlcmZvcm0gdGhlIHRyYW5zYWN0aW9uICovCi0JcmV0ID0gX193Y2Rfc3BpX2RhdGFfeGZlcihzcGksIG1zZywgcmVxKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCAlcywgYWRkciA9IDB4JXgsIHNpemUgPSAweCV6eCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgd2NkX3NwaV94ZmVyX3JlcV9zdHIocmVxKSwKLQkJCW1zZy0+cmVtb3RlX2FkZHIsIG1zZy0+bGVuLCByZXQpOwotCi0JLyogUmVsZWFzZSB0aGUgY2xvY2sgZXZlbiBpZiB4ZmVyIGZhaWxlZCAqLwotCXJldDEgPSB3Y2Rfc3BpX2Nsa19jdHJsKHNwaSwgV0NEX1NQSV9DTEtfRElTQUJMRSwKLQkJCQlXQ0RfU1BJX0NMS19GTEFHX0RFTEFZRUQpOwotCWlmIChyZXQxIDwgMCkKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogY2xrIGRpc2FibGUgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldDEpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX3NwaV9kYXRhX3dyaXRlOiBXcml0ZSBkYXRhIHRvIFdDRCBTUEkKLSAqIEBzcGk6IHNwaV9kZXZpY2Ugc3RydWN0Ci0gKiBAbXNnOiBtc2cgdGhhdCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIFdDRAotICoKLSAqIFRoaXMgQVBJIHdyaXRlcyBsZW5ndGggb2YgZGF0YSB0byBhZGRyZXNzIHNwZWNpZmllZC4gVGhlc2UgZGV0YWlscwotICogYWJvdXQgdGhlIHdyaXRlIGFyZSBlbmNhcHN1bGF0ZWQgaW4gQG1zZy4gV3JpdGUgc2l6ZSBzaG91bGQgYmUgbXVsdGlwbGUKLSAqIG9mIDQgYnl0ZXMgYW5kIHdyaXRlIGFkZHJlc3Mgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkLgotICovCi1zdGF0aWMgaW50IHdjZF9zcGlfZGF0YV93cml0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkgICAgICAgc3RydWN0IHdjZF9zcGlfbXNnICptc2cpCi17Ci0JaWYgKCFzcGkgfHwgIW1zZykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKLQkJCSghc3BpKSA/ICJzcGkgZGV2aWNlIiA6ICJtc2ciKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZ19yYXRlbGltaXRlZCgmc3BpLT5kZXYsICIlczogYWRkciA9IDB4JXgsIGxlbiA9ICV6dVxuIiwKLQkJCSAgICBfX2Z1bmNfXywgbXNnLT5yZW1vdGVfYWRkciwgbXNnLT5sZW4pOwotCXJldHVybiB3Y2Rfc3BpX2RhdGFfeGZlcihzcGksIG1zZywgV0NEX1NQSV9YRkVSX1dSSVRFKTsKLX0KLQotLyoKLSAqIHdjZF9zcGlfZGF0YV9yZWFkOiBSZWFkIGRhdGEgZnJvbSBXQ0QgU1BJCi0gKiBAc3BpOiBzcGlfZGV2aWNlIHN0cnVjdAotICogQG1zZzogbXNnIHRoYXQgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIFdDRAotICoKLSAqIFRoaXMgQVBJIHJlYWRzIGxlbmd0aCBvZiBkYXRhIGZyb20gYWRkcmVzcyBzcGVjaWZpZWQuIFRoZXNlIGRldGFpbHMKLSAqIGFib3V0IHRoZSByZWFkIGFyZSBlbmNhcHN1bGF0ZWQgaW4gQG1zZy4gUmVhZCBzaXplIHNob3VsZCBiZSBtdWx0aXBsZQotICogb2YgNCBieXRlcyBhbmQgcmVhZCBhZGRyZXNzIHNob3VsZCBiZSA0LWJ5dGUgYWxpZ25lZC4KLSAqLwotc3RhdGljIGludCB3Y2Rfc3BpX2RhdGFfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQkgICAgICBzdHJ1Y3Qgd2NkX3NwaV9tc2cgKm1zZykKLXsKLQlpZiAoIXNwaSB8fCAhbXNnKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAotCQkJKCFzcGkpID8gInNwaSBkZXZpY2UiIDogIm1zZyIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfZGJnX3JhdGVsaW1pdGVkKCZzcGktPmRldiwgIiVzOiBhZGRyID0gMHgleCxsZW4gPSAlenVcbiIsCi0JCQkgICAgX19mdW5jX18sIG1zZy0+cmVtb3RlX2FkZHIsIG1zZy0+bGVuKTsKLQlyZXR1cm4gd2NkX3NwaV9kYXRhX3hmZXIoc3BpLCBtc2csIFdDRF9TUElfWEZFUl9SRUFEKTsKLX0KLQotc3RhdGljIGludCB3ZHNwX3NwaV9kbG9hZF9zZWN0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCQkJICB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3Qgd2RzcF9pbWdfc2VjdGlvbiAqc2VjID0gZGF0YTsKLQlzdHJ1Y3Qgd2NkX3NwaV9tc2cgbXNnOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKCZzcGktPmRldiwgIiVzOiBhZGRyID0gMHgleCwgc2l6ZSA9IDB4JXp4XG4iLAotCQlfX2Z1bmNfXywgc2VjLT5hZGRyLCBzZWMtPnNpemUpOwotCi0JbXNnLnJlbW90ZV9hZGRyID0gc2VjLT5hZGRyICsgd2NkX3NwaS0+bWVtX2Jhc2VfYWRkcjsKLQltc2cuZGF0YSA9IHNlYy0+ZGF0YTsKLQltc2cubGVuID0gc2VjLT5zaXplOwotCi0JcmV0ID0gX193Y2Rfc3BpX2RhdGFfeGZlcihzcGksICZtc2csIFdDRF9TUElfWEZFUl9XUklURSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGZhaWwgYWRkciAoMHgleCkgc2l6ZSAoMHglengpXG4iLAotCQkJX19mdW5jX18sIG1zZy5yZW1vdGVfYWRkciwgbXNnLmxlbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3ZHNwX3NwaV9yZWFkX3NlY3Rpb24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHdkc3BfaW1nX3NlY3Rpb24gKnNlYyA9IGRhdGE7Ci0Jc3RydWN0IHdjZF9zcGlfbXNnIG1zZzsKLQlpbnQgcmV0OwotCi0JbXNnLnJlbW90ZV9hZGRyID0gc2VjLT5hZGRyICsgd2NkX3NwaS0+bWVtX2Jhc2VfYWRkcjsKLQltc2cuZGF0YSA9IHNlYy0+ZGF0YTsKLQltc2cubGVuID0gc2VjLT5zaXplOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogYWRkciA9IDB4JXgsIHNpemUgPSAweCV6eFxuIiwKLQkJX19mdW5jX18sIG1zZy5yZW1vdGVfYWRkciwgbXNnLmxlbik7Ci0KLQlyZXQgPSB3Y2Rfc3BpX2RhdGFfeGZlcihzcGksICZtc2csIFdDRF9TUElfWEZFUl9SRUFEKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogZmFpbCBhZGRyICgweCV4KSBzaXplICgweCV6eClcbiIsCi0JCQlfX2Z1bmNfXywgbXNnLnJlbW90ZV9hZGRyLCBtc2cubGVuKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdkc3Bfc3BpX2V2ZW50X2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEsCi0JCQkJICBlbnVtIHdkc3BfZXZlbnRfdHlwZSBldmVudCwKLQkJCQkgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHdjZF9zcGlfb3BzICpzcGlfb3BzOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZygmc3BpLT5kZXYsICIlczogZXZlbnQgdHlwZSAlZFxuIiwKLQkJX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFdEU1BfRVZFTlRfUE9TVF9TSFVURE9XTjoKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3Y2Rfc3BpLT5jbGtfZHdvcmspOwotCQlXQ0RfU1BJX01VVEVYX0xPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCQlpZiAodGVzdF9iaXQoV0NEX1NQSV9DTEtfU1RBVEVfRU5BQkxFRCwgJndjZF9zcGktPnN0YXR1c19tYXNrKSkKLQkJCXdjZF9zcGlfY2xrX2Rpc2FibGUoc3BpKTsKLQkJd2NkX3NwaS0+Y2xrX3VzZXJzID0gMDsKLQkJV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCQlicmVhazsKLQotCWNhc2UgV0RTUF9FVkVOVF9QUkVfRExPQURfQ09ERToKLQljYXNlIFdEU1BfRVZFTlRfUFJFX0RMT0FEX0RBVEE6Ci0JCXJldCA9IHdjZF9zcGlfY2xrX2N0cmwoc3BpLCBXQ0RfU1BJX0NMS19FTkFCTEUsCi0JCQkJICAgICAgIFdDRF9TUElfQ0xLX0ZMQUdfSU1NRURJQVRFKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiBjbGtfcmVxIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdEU1BfRVZFTlRfUE9TVF9ETE9BRF9DT0RFOgotCWNhc2UgV0RTUF9FVkVOVF9QT1NUX0RMT0FEX0RBVEE6Ci0JY2FzZSBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRDoKLQotCQlyZXQgPSB3Y2Rfc3BpX2Nsa19jdHJsKHNwaSwgV0NEX1NQSV9DTEtfRElTQUJMRSwKLQkJCQkgICAgICAgV0NEX1NQSV9DTEtfRkxBR19JTU1FRElBVEUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGNsayB1bnZvdGUgZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQotCWNhc2UgV0RTUF9FVkVOVF9ETE9BRF9TRUNUSU9OOgotCQlyZXQgPSB3ZHNwX3NwaV9kbG9hZF9zZWN0aW9uKHNwaSwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRFNQX0VWRU5UX1JFQURfU0VDVElPTjoKLQkJcmV0ID0gd2RzcF9zcGlfcmVhZF9zZWN0aW9uKHNwaSwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRFNQX0VWRU5UX1NVU1BFTkQ6Ci0JCVdDRF9TUElfTVVURVhfTE9DSyhzcGksIHdjZF9zcGktPmNsa19tdXRleCk7Ci0JCWlmICghd2NkX3NwaV9jYW5fc3VzcGVuZCh3Y2Rfc3BpKSkKLQkJCXJldCA9IC1FQlVTWTsKLQkJV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCQlicmVhazsKLQotCWNhc2UgV0RTUF9FVkVOVF9SRVNVTUU6Ci0JCXJldCA9IHdjZF9zcGlfd2FpdF9mb3JfcmVzdW1lKHdjZF9zcGkpOwotCQlicmVhazsKLQotCWNhc2UgV0RTUF9FVkVOVF9HRVRfREVWT1BTOgotCQlpZiAoIWRhdGEpIHsKLQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGludmFsaWQgZGF0YVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGlfb3BzID0gKHN0cnVjdCB3Y2Rfc3BpX29wcyAqKSBkYXRhOwotCQlzcGlfb3BzLT5zcGlfZGV2ID0gc3BpOwotCQlzcGlfb3BzLT5yZWFkX2RldiA9IHdjZF9zcGlfZGF0YV9yZWFkOwotCQlzcGlfb3BzLT53cml0ZV9kZXYgPSB3Y2Rfc3BpX2RhdGFfd3JpdGU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2RiZygmc3BpLT5kZXYsICIlczogVW5oYW5kbGVkIGV2ZW50ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2Rfc3BpX2J1c19nd3JpdGUodm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqcmVnLAotCQkJICAgICAgc2l6ZV90IHJlZ19sZW4sIGNvbnN0IHZvaWQgKnZhbCwKLQkJCSAgICAgIHNpemVfdCB2YWxfbGVuKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0JdTggdHhfYnVmW1dDRF9TUElfQ01EX0lSV19MRU5dOwotCi0JaWYgKCFyZWcgfHwgIXZhbCB8fCByZWdfbGVuICE9IHdjZF9zcGktPnJlZ19ieXRlcyB8fAotCSAgICB2YWxfbGVuICE9IHdjZF9zcGktPnZhbF9ieXRlcykgewotCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCSIlczogSW52YWxpZCBpbnB1dCwgcmVnX2xlbiA9ICV6ZCwgdmFsX2xlbiA9ICV6ZCIsCi0JCQlfX2Z1bmNfXywgcmVnX2xlbiwgdmFsX2xlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXR4X2J1ZlswXSA9IFdDRF9TUElfQ01EX0lSVzsKLQl0eF9idWZbMV0gPSAqKCh1OCAqKXJlZyk7Ci0JbWVtY3B5KCZ0eF9idWZbV0NEX1NQSV9PUENPREVfTEVOICsgcmVnX2xlbl0sCi0JICAgICAgIHZhbCwgdmFsX2xlbik7Ci0KLQlyZXR1cm4gc3BpX3dyaXRlKHNwaSwgdHhfYnVmLCBXQ0RfU1BJX0NNRF9JUldfTEVOKTsKLX0KLQotc3RhdGljIGludCB3Y2Rfc3BpX2J1c193cml0ZSh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpkYXRhLAotCQkJICAgICBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGV4dDsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQotCWlmIChjb3VudCA8ICh3Y2Rfc3BpLT5yZWdfYnl0ZXMgKyB3Y2Rfc3BpLT52YWxfYnl0ZXMpKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEludmFsaWQgc2l6ZSAlemRcbiIsCi0JCQlfX2Z1bmNfXywgY291bnQpOwotCQlXQVJOX09OKDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gd2NkX3NwaV9idXNfZ3dyaXRlKGNvbnRleHQsIGRhdGEsIHdjZF9zcGktPnJlZ19ieXRlcywKLQkJCQkgIGRhdGEgKyB3Y2Rfc3BpLT5yZWdfYnl0ZXMsCi0JCQkJICBjb3VudCAtIHdjZF9zcGktPnJlZ19ieXRlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9idXNfcmVhZCh2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpyZWcsCi0JCQkgICAgc2l6ZV90IHJlZ19sZW4sIHZvaWQgKnZhbCwKLQkJCSAgICBzaXplX3QgdmFsX2xlbikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnR4X3hmZXIgPSAmd2NkX3NwaS0+eGZlcjJbMF07Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqcnhfeGZlciA9ICZ3Y2Rfc3BpLT54ZmVyMlsxXTsKLQl1OCB0eF9idWZbV0NEX1NQSV9DTURfSVJSX0xFTl07Ci0KLQlpZiAoIXJlZyB8fCAhdmFsIHx8IHJlZ19sZW4gIT0gd2NkX3NwaS0+cmVnX2J5dGVzIHx8Ci0JICAgIHZhbF9sZW4gIT0gd2NkX3NwaS0+dmFsX2J5dGVzKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGlucHV0LCByZWdfbGVuID0gJXpkLCB2YWxfbGVuID0gJXpkIiwKLQkJCV9fZnVuY19fLCByZWdfbGVuLCB2YWxfbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KHR4X2J1ZiwgMCwgV0NEX1NQSV9PUENPREVfTEVOKTsKLQl0eF9idWZbMF0gPSBXQ0RfU1BJX0NNRF9JUlI7Ci0JdHhfYnVmWzFdID0gKigodTggKilyZWcpOwotCi0Jd2NkX3NwaV9yZWluaXRfeGZlcih0eF94ZmVyKTsKLQl0eF94ZmVyLT50eF9idWYgPSB0eF9idWY7Ci0JdHhfeGZlci0+cnhfYnVmID0gTlVMTDsKLQl0eF94ZmVyLT5sZW4gPSBXQ0RfU1BJX0NNRF9JUlJfTEVOOwotCi0Jd2NkX3NwaV9yZWluaXRfeGZlcihyeF94ZmVyKTsKLQlyeF94ZmVyLT50eF9idWYgPSBOVUxMOwotCXJ4X3hmZXItPnJ4X2J1ZiA9IHZhbDsKLQlyeF94ZmVyLT5sZW4gPSB2YWxfbGVuOwotCi0JcmV0dXJuIHNwaV9zeW5jKHNwaSwgJndjZF9zcGktPm1zZzIpOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9idXMgd2NkX3NwaV9yZWdtYXBfYnVzID0gewotCS53cml0ZSA9IHdjZF9zcGlfYnVzX3dyaXRlLAotCS5nYXRoZXJfd3JpdGUgPSB3Y2Rfc3BpX2J1c19nd3JpdGUsCi0JLnJlYWQgPSB3Y2Rfc3BpX2J1c19yZWFkLAotCS5yZWdfZm9ybWF0X2VuZGlhbl9kZWZhdWx0ID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCi0JLnZhbF9mb3JtYXRfZW5kaWFuX2RlZmF1bHQgPSBSRUdNQVBfRU5ESUFOX0JJRywKLX07Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9zdGF0ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqcHRyKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBmLT5wcml2YXRlOwotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQljb25zdCBjaGFyICpjbGtfc3RhdGUsICpjbGtfbXV0ZXgsICp4ZmVyX211dGV4OwotCi0JaWYgKHRlc3RfYml0KFdDRF9TUElfQ0xLX1NUQVRFX0VOQUJMRUQsICZ3Y2Rfc3BpLT5zdGF0dXNfbWFzaykpCi0JCWNsa19zdGF0ZSA9ICJlbmFibGVkIjsKLQllbHNlCi0JCWNsa19zdGF0ZSA9ICJkaXNhYmxlZCI7Ci0KLQljbGtfbXV0ZXggPSBtdXRleF9pc19sb2NrZWQoJndjZF9zcGktPmNsa19tdXRleCkgPwotCQkgICAgImxvY2tlZCIgOiAidW5sb2NrZWQiOwotCi0JeGZlcl9tdXRleCA9IG11dGV4X2lzX2xvY2tlZCgmd2NkX3NwaS0+eGZlcl9tdXRleCkgPwotCQkgICAgICJsb2NrZWQiIDogInVubG9ja2VkIjsKLQotCXNlcV9wcmludGYoZiwgImNsa19zdGF0ZSA9ICVzXG5jbGtfdXNlcnMgPSAlZFxuIgotCQkgICAiY2xrX211dGV4ID0gJXNcbnhmZXJfbXV0ZXggPSAlc1xuIiwKLQkJICAgY2xrX3N0YXRlLCB3Y2Rfc3BpLT5jbGtfdXNlcnMsIGNsa19tdXRleCwKLQkJICAgeGZlcl9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9zdGF0ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB3Y2Rfc3BpX3N0YXRlX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGF0ZV9mb3BzID0gewotCS5vcGVuID0gd2NkX3NwaV9zdGF0ZV9vcGVuLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIHNzaXplX3Qgd2NkX3NwaV9kZWJ1Z2ZzX21lbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHdjZF9zcGlfZGVidWdfZGF0YSAqZGJnX2RhdGEgPSAmd2NkX3NwaS0+ZGVidWdfZGF0YTsKLQlzdHJ1Y3Qgd2NkX3NwaV9tc2cgbXNnOwotCXNzaXplX3QgYnVmX3NpemUsIHJlYWRfY291bnQgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgcmV0OwotCi0JaWYgKCpwcG9zIDwgMCB8fCAhY291bnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRiZ19kYXRhLT5zaXplID09IDAgfHwgZGJnX2RhdGEtPmFkZHIgPT0gMCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwKLQkJCSIlczogSW52YWxpZCByZXF1ZXN0LCBzaXplID0gJXUsIGFkZHIgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGRiZ19kYXRhLT5zaXplLCBkYmdfZGF0YS0+YWRkcik7Ci0JCXJldHVybiAwOwotCX0KLQotCWJ1Zl9zaXplID0gY291bnQgPCBkYmdfZGF0YS0+c2l6ZSA/IGNvdW50IDogZGJnX2RhdGEtPnNpemU7Ci0JYnVmID0ga3phbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXNnLmRhdGEgPSBidWY7Ci0JbXNnLnJlbW90ZV9hZGRyID0gZGJnX2RhdGEtPmFkZHI7Ci0JbXNnLmxlbiA9IGJ1Zl9zaXplOwotCW1zZy5mbGFncyA9IDA7Ci0KLQlyZXQgPSB3Y2Rfc3BpX2RhdGFfcmVhZChzcGksICZtc2cpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgZnJvbSBhZGRyIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYnVmX3NpemUsIG1zZy5yZW1vdGVfYWRkcik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZWFkX2NvdW50ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgYnVmX3NpemUpOwotCi1kb25lOgotCWtmcmVlKGJ1Zik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JZWxzZQotCQlyZXR1cm4gcmVhZF9jb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtX3JlYWRfZm9wcyA9IHsKLQkub3BlbiA9IHNpbXBsZV9vcGVuLAotCS5yZWFkID0gd2NkX3NwaV9kZWJ1Z2ZzX21lbV9yZWFkLAotfTsKLQotc3RhdGljIGludCB3Y2Rfc3BpX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlzdHJ1Y3Qgd2NkX3NwaV9kZWJ1Z19kYXRhICpkYmdfZGF0YSA9ICZ3Y2Rfc3BpLT5kZWJ1Z19kYXRhOwotCWludCByYyA9IDA7Ci0KLQlkYmdfZGF0YS0+ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ3Y2Rfc3BpIiwgTlVMTCk7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGRiZ19kYXRhLT5kaXIpKSB7Ci0JCWRiZ19kYXRhLT5kaXIgPSBOVUxMOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGF0ZSIsIDA0NDQsIGRiZ19kYXRhLT5kaXIsIHNwaSwgJnN0YXRlX2ZvcHMpOwotCWRlYnVnZnNfY3JlYXRlX3UzMigiYWRkciIsIDA2NDQsIGRiZ19kYXRhLT5kaXIsCi0JCQkgICAmZGJnX2RhdGEtPmFkZHIpOwotCWRlYnVnZnNfY3JlYXRlX3UzMigic2l6ZSIsIDA2NDQsIGRiZ19kYXRhLT5kaXIsCi0JCQkgICAmZGJnX2RhdGEtPnNpemUpOwotCi0JZGVidWdmc19jcmVhdGVfZmlsZSgibWVtX3JlYWQiLCAwNDQ0LCBkYmdfZGF0YS0+ZGlyLAotCQkJICAgIHNwaSwgJm1lbV9yZWFkX2ZvcHMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCB3Y2Rfc3BpX2RlZmF1bHRzW10gPSB7Ci0Je1dDRF9TUElfU0xBVkVfU0FOSVRZLCAweERFQURCRUVGfSwKLQl7V0NEX1NQSV9TTEFWRV9ERVZJQ0VfSUQsIDB4MDA1MDAwMDB9LAotCXtXQ0RfU1BJX1NMQVZFX1NUQVRVUywgMHg4MDEwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfQ09ORklHLCAweDBGMjAwODA4fSwKLQl7V0NEX1NQSV9TTEFWRV9TV19SRVNFVCwgMHgwMDAwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfSVJRX1NUQVRVUywgMHgwMDAwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfSVJRX0VOLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9JUlFfQ0xSLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9JUlFfRk9SQ0UsIDB4MDAwMDAwMDB9LAotCXtXQ0RfU1BJX1NMQVZFX1RYLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9URVNUX0JVU19EQVRBLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9URVNUX0JVU19DVFJMLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9TV19SU1RfSVJRLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9DSEFSX0NGRywgMHgwMDAwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfQ0hBUl9EQVRBX01PU0ksIDB4MDAwMDAwMDB9LAotCXtXQ0RfU1BJX1NMQVZFX0NIQVJfREFUQV9DU19OLCAweDAwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9DSEFSX0RBVEFfTUlTTywgMHgwMDAwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfVFJOU19CWVRFX0NOVCwgMHgwMDAwMDAwMH0sCi0Je1dDRF9TUElfU0xBVkVfVFJOU19MRU4sIDB4MDAwMDAwMDB9LAotCXtXQ0RfU1BJX1NMQVZFX0ZJRk9fTEVWRUwsIDB4MDAwMDAwMDB9LAotCXtXQ0RfU1BJX1NMQVZFX0dFTkVSSUNTLCAweDgwMDAwMDAwfSwKLQl7V0NEX1NQSV9TTEFWRV9FWFRfQkFTRV9BRERSLCAweDAwMDAwMDAwfSwKLX07Ci0KLXN0YXRpYyBib29sIHdjZF9zcGlfaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgV0NEX1NQSV9TTEFWRV9TQU5JVFk6Ci0JY2FzZSBXQ0RfU1BJX1NMQVZFX1NUQVRVUzoKLQljYXNlIFdDRF9TUElfU0xBVkVfSVJRX1NUQVRVUzoKLQljYXNlIFdDRF9TUElfU0xBVkVfVFg6Ci0JY2FzZSBXQ0RfU1BJX1NMQVZFX1NXX1JTVF9JUlE6Ci0JY2FzZSBXQ0RfU1BJX1NMQVZFX1RSTlNfQllURV9DTlQ6Ci0JY2FzZSBXQ0RfU1BJX1NMQVZFX0ZJRk9fTEVWRUw6Ci0JY2FzZSBXQ0RfU1BJX1NMQVZFX0dFTkVSSUNTOgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHdjZF9zcGlfaXNfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgdW5zaWduZWQgaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgV0NEX1NQSV9TTEFWRV9TV19SRVNFVDoKLQljYXNlIFdDRF9TUElfU0xBVkVfSVJRX0NMUjoKLQljYXNlIFdDRF9TUElfU0xBVkVfSVJRX0ZPUkNFOgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3Y2Rfc3BpX3JlZ21hcF9jZmcgPSB7Ci0JLnJlZ19iaXRzID0gOCwKLQkudmFsX2JpdHMgPSAzMiwKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKLQkucmVnX2RlZmF1bHRzID0gd2NkX3NwaV9kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod2NkX3NwaV9kZWZhdWx0cyksCi0JLm1heF9yZWdpc3RlciA9IFdDRF9TUElfTUFYX1JFR0lTVEVSLAotCS52b2xhdGlsZV9yZWcgPSB3Y2Rfc3BpX2lzX3ZvbGF0aWxlX3JlZywKLQkucmVhZGFibGVfcmVnID0gd2NkX3NwaV9pc19yZWFkYWJsZV9yZWcsCi19OwotCi1zdGF0aWMgaW50IHdkc3Bfc3BpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gd2NkX3NwaV9pbml0KHNwaSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEluaXQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2RzcF9zcGlfZGVpbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHJpdl9kYXRhKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCi0JLyoKLQkgKiBEZWluaXQgbWVhbnMgdGhlIGhhcmR3YXJlIGlzIHJlc2V0LiBNYXJrIHRoZSBjYWNoZQotCSAqIGFzIGRpcnR5IGhlcmUsIHNvIGluaXQgd2lsbCBzeW5jIHRoZSBjYWNoZQotCSAqLwotCXJlZ2NhY2hlX21hcmtfZGlydHkod2NkX3NwaS0+cmVnbWFwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHdkc3BfY21wbnRfb3BzIHdkc3Bfc3BpX29wcyA9IHsKLQkuaW5pdCA9IHdkc3Bfc3BpX2luaXQsCi0JLmRlaW5pdCA9IHdkc3Bfc3BpX2RlaW5pdCwKLQkuZXZlbnRfaGFuZGxlciA9IHdkc3Bfc3BpX2V2ZW50X2hhbmRsZXIsCi19OwotCi1zdGF0aWMgaW50IHdjZF9zcGlfY29tcG9uZW50X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRldmljZSAqbWFzdGVyLAotCQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlpbnQgcmV0ID0gMDsKLQotCXdjZF9zcGktPm1fZGV2ID0gbWFzdGVyOwotCXdjZF9zcGktPm1fb3BzID0gZGF0YTsKLQotCWlmICh3Y2Rfc3BpLT5tX29wcyAmJgotCSAgICB3Y2Rfc3BpLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKQotCQlyZXQgPSB3Y2Rfc3BpLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKG1hc3RlciwgZGV2LAotCQkJCQkJCSB3Y2Rfc3BpLAotCQkJCQkJCSAmd2RzcF9zcGlfb3BzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHJlZ2lzdGVyX2NtcG50X29wcyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl3Y2Rfc3BpLT5yZWdfYnl0ZXMgPSBESVZfUk9VTkRfVVAod2NkX3NwaV9yZWdtYXBfY2ZnLnJlZ19iaXRzLCA4KTsKLQl3Y2Rfc3BpLT52YWxfYnl0ZXMgPSBESVZfUk9VTkRfVVAod2NkX3NwaV9yZWdtYXBfY2ZnLnZhbF9iaXRzLCA4KTsKLQotCXdjZF9zcGktPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXQoJnNwaS0+ZGV2LCAmd2NkX3NwaV9yZWdtYXBfYnVzLAotCQkJCQkgICAmc3BpLT5kZXYsICZ3Y2Rfc3BpX3JlZ21hcF9jZmcpOwotCWlmIChJU19FUlIod2NkX3NwaS0+cmVnbWFwKSkgewotCQlyZXQgPSBQVFJfRVJSKHdjZF9zcGktPnJlZ21hcCk7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSByZWdtYXAsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAod2NkX3NwaV9kZWJ1Z2ZzX2luaXQoc3BpKSkKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlczogRmFpbGVkIGRlYnVnZnMgaW5pdFxuIiwgX19mdW5jX18pOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmd2NkX3NwaS0+bXNnMSk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJndjZF9zcGktPnhmZXIxLCAmd2NkX3NwaS0+bXNnMSk7Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZ3Y2Rfc3BpLT5tc2cyKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmd2NkX3NwaS0+eGZlcjJbMF0sICZ3Y2Rfc3BpLT5tc2cyKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmd2NkX3NwaS0+eGZlcjJbMV0sICZ3Y2Rfc3BpLT5tc2cyKTsKLQotCS8qIFByZS1hbGxvY2F0ZSB0aGUgYnVmZmVycyAqLwotCXdjZF9zcGktPnR4X2J1ZiA9IGt6YWxsb2MoV0NEX1NQSV9SV19NQVhfQlVGX1NJWkUsCi0JCQkJICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCF3Y2Rfc3BpLT50eF9idWYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXdjZF9zcGktPnJ4X2J1ZiA9IGt6YWxsb2MoV0NEX1NQSV9SV19NQVhfQlVGX1NJWkUsCi0JCQkJICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7Ci0JaWYgKCF3Y2Rfc3BpLT5yeF9idWYpIHsKLQkJa2ZyZWUod2NkX3NwaS0+dHhfYnVmKTsKLQkJd2NkX3NwaS0+dHhfYnVmID0gTlVMTDsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3NwaV9jb21wb25lbnRfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKLQkJCQkgICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0Jc3RydWN0IHdjZF9zcGlfZGVidWdfZGF0YSAqZGJnX2RhdGEgPSAmd2NkX3NwaS0+ZGVidWdfZGF0YTsKLQotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkYmdfZGF0YS0+ZGlyKTsKLQlkYmdfZGF0YS0+ZGlyID0gTlVMTDsKLQotCXdjZF9zcGktPm1fZGV2ID0gTlVMTDsKLQl3Y2Rfc3BpLT5tX29wcyA9IE5VTEw7Ci0KLQlzcGlfdHJhbnNmZXJfZGVsKCZ3Y2Rfc3BpLT54ZmVyMSk7Ci0Jc3BpX3RyYW5zZmVyX2RlbCgmd2NkX3NwaS0+eGZlcjJbMF0pOwotCXNwaV90cmFuc2Zlcl9kZWwoJndjZF9zcGktPnhmZXIyWzFdKTsKLQotCWtmcmVlKHdjZF9zcGktPnR4X2J1Zik7Ci0Ja2ZyZWUod2NkX3NwaS0+cnhfYnVmKTsKLQl3Y2Rfc3BpLT50eF9idWYgPSBOVUxMOwotCXdjZF9zcGktPnJ4X2J1ZiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyB3Y2Rfc3BpX2NvbXBvbmVudF9vcHMgPSB7Ci0JLmJpbmQgPSB3Y2Rfc3BpX2NvbXBvbmVudF9iaW5kLAotCS51bmJpbmQgPSB3Y2Rfc3BpX2NvbXBvbmVudF91bmJpbmQsCi19OwotCi1zdGF0aWMgaW50IHdjZF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpOwotCWludCByZXQgPSAwOwotCi0Jd2NkX3NwaSA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqd2NkX3NwaSksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3Y2Rfc3BpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHNwaS0+ZGV2Lm9mX25vZGUsCi0JCQkJICAgInFjb20sbWVtLWJhc2UtYWRkciIsCi0JCQkJICAgJndjZF9zcGktPm1lbV9iYXNlX2FkZHIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IE1pc3NpbmcgJXMgRFQgZW50cnkiLAotCQkJX19mdW5jX18sICJxY29tLG1lbS1iYXNlLWFkZHIiKTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCWRldl9kYmcoJnNwaS0+ZGV2LAotCQkiJXM6IG1lbV9iYXNlX2FkZHIgMHgleFxuIiwgX19mdW5jX18sIHdjZF9zcGktPm1lbV9iYXNlX2FkZHIpOwotCi0JbXV0ZXhfaW5pdCgmd2NkX3NwaS0+Y2xrX211dGV4KTsKLQltdXRleF9pbml0KCZ3Y2Rfc3BpLT54ZmVyX211dGV4KTsKLQlJTklUX0RFTEFZRURfV09SSygmd2NkX3NwaS0+Y2xrX2R3b3JrLCB3Y2Rfc3BpX2Nsa193b3JrKTsKLQlpbml0X2NvbXBsZXRpb24oJndjZF9zcGktPnJlc3VtZV9jb21wKTsKLQotCXdjZF9zcGktPnNwaSA9IHNwaTsKLQlzcGlfc2V0X2RydmRhdGEoc3BpLCB3Y2Rfc3BpKTsKLQotCXJldCA9IGNvbXBvbmVudF9hZGQoJnNwaS0+ZGV2LCAmd2NkX3NwaV9jb21wb25lbnRfb3BzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IGNvbXBvbmVudF9hZGQgZmFpbGVkIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2NvbXBvbmVudF9hZGQ7Ci0JfQotCi0JcmV0dXJuIHJldDsKLQotZXJyX2NvbXBvbmVudF9hZGQ6Ci0JbXV0ZXhfZGVzdHJveSgmd2NkX3NwaS0+Y2xrX211dGV4KTsKLQltdXRleF9kZXN0cm95KCZ3Y2Rfc3BpLT54ZmVyX211dGV4KTsKLWVycl9yZXQ6Ci0JZGV2bV9rZnJlZSgmc3BpLT5kZXYsIHdjZF9zcGkpOwotCXNwaV9zZXRfZHJ2ZGF0YShzcGksIE5VTEwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3Qgd2NkX3NwaV9wcml2ICp3Y2Rfc3BpID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0KLQljb21wb25lbnRfZGVsKCZzcGktPmRldiwgJndjZF9zcGlfY29tcG9uZW50X29wcyk7Ci0KLQltdXRleF9kZXN0cm95KCZ3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJndjZF9zcGktPnhmZXJfbXV0ZXgpOwotCi0JZGV2bV9rZnJlZSgmc3BpLT5kZXYsIHdjZF9zcGkpOwotCXNwaV9zZXRfZHJ2ZGF0YShzcGksIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgd2NkX3NwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOwotCXN0cnVjdCB3Y2Rfc3BpX3ByaXYgKndjZF9zcGkgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQlpbnQgcmMgPSAwOwotCi0JV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQlpZiAoIXdjZF9zcGlfY2FuX3N1c3BlbmQod2NkX3NwaSkpIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBoZXJlLCBpdCBpcyBva2F5IHRvIGxldCB0aGUgc3VzcGVuZCBnbwotCSAqIHRocm91Z2ggZm9yIHRoaXMgZHJpdmVyLiBCdXQsIHN0aWxsIG5lZWQgdG8gbm90aWZ5Ci0JICogdGhlIG1hc3RlciB0byBtYWtlIHN1cmUgYWxsIG90aGVyIGNvbXBvbmVudHMgY2FuIHN1c3BlbmQKLQkgKiBhcyB3ZWxsLgotCSAqLwotCWlmICh3Y2Rfc3BpLT5tX2RldiAmJiB3Y2Rfc3BpLT5tX29wcyAmJgotCSAgd2NkX3NwaS0+bV9vcHMtPnN1c3BlbmQpIHsKLQkJV0NEX1NQSV9NVVRFWF9VTkxPQ0soc3BpLCB3Y2Rfc3BpLT5jbGtfbXV0ZXgpOwotCQlyYyA9IHdjZF9zcGktPm1fb3BzLT5zdXNwZW5kKHdjZF9zcGktPm1fZGV2KTsKLQkJV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQl9Ci0KLQlpZiAocmMgPT0gMCkKLQkJc2V0X2JpdChXQ0RfU1BJX0lTX1NVU1BFTkRFRCwgJndjZF9zcGktPnN0YXR1c19tYXNrKTsKLQllbHNlCi0JCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXM6IGNhbm5vdCBzdXNwZW5kLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci1kb25lOgotCVdDRF9TUElfTVVURVhfVU5MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3NwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHdjZF9zcGlfcHJpdiAqd2NkX3NwaSA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCi0JV0NEX1NQSV9NVVRFWF9MT0NLKHNwaSwgd2NkX3NwaS0+Y2xrX211dGV4KTsKLQljbGVhcl9iaXQoV0NEX1NQSV9JU19TVVNQRU5ERUQsICZ3Y2Rfc3BpLT5zdGF0dXNfbWFzayk7Ci0JY29tcGxldGUoJndjZF9zcGktPnJlc3VtZV9jb21wKTsKLQlXQ0RfU1BJX01VVEVYX1VOTE9DSyhzcGksIHdjZF9zcGktPmNsa19tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdjZF9zcGlfcG1fb3BzID0gewotCS5zdXNwZW5kID0gd2NkX3NwaV9zdXNwZW5kLAotCS5yZXN1bWUgPSB3Y2Rfc3BpX3Jlc3VtZSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd2NkX3NwaV9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSx3Y2Qtc3BpLXYyIiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3Y2Rfc3BpX29mX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdjZF9zcGlfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndjZC1zcGktdjIiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSB3Y2Rfc3BpX29mX21hdGNoLAotI2lmZGVmIENPTkZJR19QTQotCQkucG0gPSAmd2NkX3NwaV9wbV9vcHMsCi0jZW5kaWYKLQl9LAotCS5wcm9iZSA9IHdjZF9zcGlfcHJvYmUsCi0JLnJlbW92ZSA9IHdjZF9zcGlfcmVtb3ZlLAotfTsKLQotbW9kdWxlX3NwaV9kcml2ZXIod2NkX3NwaV9kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIldDRCBTUEkgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTMzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODkxNjI0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTMzNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQyMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTMzNS9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc3dyLXdjZC5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KLSNpbmNsdWRlICJ3Y2Q5MzM1LmgiCi0jaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKLSNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi12Mi5oIgotI2luY2x1ZGUgIndjZDl4eHgtcmVzbWdyLXYyLmgiCi0jaW5jbHVkZSAid2NkX2NwZV9jb3JlLmgiCi0jaW5jbHVkZSAid2NkY2FsLWh3ZGVwLmgiCi0jaW5jbHVkZSAid2NkLW1iaGMtdjItYXBpLmgiCi0KLSNkZWZpbmUgVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgIDE2Ci0KLSNkZWZpbmUgV0NEOTMzNV9SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfFwKLQkJCSAgICBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHxcCi0JCQkgICAgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBTTkRSVl9QQ01fUkFURV8xOTIwMDApCi0vKiBGcmFjdGlvbmFsIFJhdGVzICovCi0jZGVmaW5lIFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV80NDEwMCkKLQotI2RlZmluZSBXQ0Q5MzM1X01JWF9SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV80ODAwMCB8XAotCQkJCVNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwKQotCi0jZGVmaW5lIFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCi0JCQkJICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFwKLQkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSkKLQotI2RlZmluZSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKLQkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAotCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwgXAotCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCi0KLSNkZWZpbmUgVEFTSEFfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCi0KLS8qCi0gKiBUaW1lb3V0IGluIG1pbGxpIHNlY29uZHMgYW5kIGl0IGlzIHRoZSB3YWl0IHRpbWUgZm9yCi0gKiBzbGltIGNoYW5uZWwgcmVtb3ZhbCBpbnRlcnJ1cHQgdG8gcmVjZWl2ZS4KLSAqLwotI2RlZmluZSBUQVNIQV9TTElNX0NMT1NFX1RJTUVPVVQgMTAwMAotI2RlZmluZSBUQVNIQV9TTElNX0lSUV9PVkVSRkxPVyAoMSA8PCAwKQotI2RlZmluZSBUQVNIQV9TTElNX0lSUV9VTkRFUkZMT1cgKDEgPDwgMSkKLSNkZWZpbmUgVEFTSEFfU0xJTV9JUlFfUE9SVF9DTE9TRUQgKDEgPDwgMikKLSNkZWZpbmUgVEFTSEFfTUNMS19DTEtfMTJQMjg4TUhaIDEyMjg4MDAwCi0jZGVmaW5lIFRBU0hBX01DTEtfQ0xLXzlQNk1IWiA5NjAwMDAwCi0KLSNkZWZpbmUgVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wIChUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyAyKQotCi0jZGVmaW5lIFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTIDkKLSNkZWZpbmUgVEFTSEFfTlVNX0RFQ0lNQVRPUlMgOQotCi0jZGVmaW5lIEJZVEVfQklUX01BU0sobnIpICgxIDw8ICgobnIpICUgQklUU19QRVJfQllURSkpCi0jZGVmaW5lIFRBU0hBX01BRF9BVURJT19GSVJNV0FSRV9QQVRIICJ3Y2Q5MzM1L3djZDkzMzVfbWFkX2F1ZGlvLmJpbiIKLSNkZWZpbmUgVEFTSEFfQ1BFX1NTX0VSUl9TVEFUVVNfTUVNX0FDQ0VTUyAoMSA8PCAwKQotI2RlZmluZSBUQVNIQV9DUEVfU1NfRVJSX1NUQVRVU19XRE9HX0JJVEUgKDEgPDwgMSkKLQotI2RlZmluZSBUQVNIQV9DUEVfRkFUQUxfSVJRUyBcCi0JKFRBU0hBX0NQRV9TU19FUlJfU1RBVFVTX1dET0dfQklURSB8IFwKLQkgVEFTSEFfQ1BFX1NTX0VSUl9TVEFUVVNfTUVNX0FDQ0VTUykKLQotI2RlZmluZSBTTElNX0JXX0NMS19HRUFSXzkgNjIwMDAwMAotI2RlZmluZSBTTElNX0JXX1VOVk9URSAwCi0KLSNkZWZpbmUgQ1BFX0ZMTF9DTEtfNzVNSFogNzUwMDAwMDAKLSNkZWZpbmUgQ1BFX0ZMTF9DTEtfMTUwTUhaIDE1MDAwMDAwMAotI2RlZmluZSBXQ0Q5MzM1X1JFR19CSVRTIDgKLQotI2RlZmluZSBXQ0Q5MzM1X01BWF9WQUxJRF9BRENfTVVYICAxMwotI2RlZmluZSBXQ0Q5MzM1X0lOVkFMSURfQURDX01VWCA5Ci0KLSNkZWZpbmUgVEFTSEFfRElHX0NPUkVfUkVHX01JTiAgV0NEOTMzNV9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMCi0jZGVmaW5lIFRBU0hBX0RJR19DT1JFX1JFR19NQVggIDB4REZGCi0KLS8qIENvbnZlcnQgZnJvbSB2b3V0IGN0bCB0byBtaWNiaWFzIHZvbHRhZ2UgaW4gbVYgKi8KLSNkZWZpbmUgV0NEX1ZPVVRfQ1RMX1RPX01JQ0IodikgKDEwMDAgKyB2ICogNTApCi0KLSNkZWZpbmUgVEFTSEFfWkRFVF9OVU1fTUVBU1VSRU1FTlRTIDkwMAotI2RlZmluZSBUQVNIQV9NQkhDX0dFVF9DMShjKSAgKChjICYgMHhDMDAwKSA+PiAxNCkKLSNkZWZpbmUgVEFTSEFfTUJIQ19HRVRfWDEoeCkgICh4ICYgMHgzRkZGKQotLyogeiB2YWx1ZSBjb21wYXJlZCBpbiBtaWxsaU9obSAqLwotI2RlZmluZSBUQVNIQV9NQkhDX0lTX1NFQ09ORF9SQU1QX1JFUVVJUkVEKHopICgoeiA+IDQwMDAwMCkgfHwgKHogPCAzMjAwMCkpCi0jZGVmaW5lIFRBU0hBX01CSENfWkRFVF9DT05TVCAgKDg2ICogMTYzODQpCi0jZGVmaW5lIFRBU0hBX01CSENfTU9JU1RVUkVfVlJFRiAgVl80NV9NVgotI2RlZmluZSBUQVNIQV9NQkhDX01PSVNUVVJFX0lSRUYgIElfM1AwX1VBCi0KLSNkZWZpbmUgVEFTSEFfVkVSU0lPTl9FTlRSWV9TSVpFIDE3Ci0KLSNkZWZpbmUgV0NEOTMzNV9BTUlDX1BXUl9MRVZFTF9MUCAwCi0jZGVmaW5lIFdDRDkzMzVfQU1JQ19QV1JfTEVWRUxfREVGQVVMVCAxCi0jZGVmaW5lIFdDRDkzMzVfQU1JQ19QV1JfTEVWRUxfSFAgMgotI2RlZmluZSBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLIDB4NjAKLSNkZWZpbmUgV0NEOTMzNV9BTUlDX1BXUl9MVkxfU0hJRlQgMHg1Ci0KLSNkZWZpbmUgV0NEOTMzNV9ERUNfUFdSX0xWTF9NQVNLIDB4MDYKLSNkZWZpbmUgV0NEOTMzNV9ERUNfUFdSX0xWTF9MUCAweDAyCi0jZGVmaW5lIFdDRDkzMzVfREVDX1BXUl9MVkxfSFAgMHgwNAotI2RlZmluZSBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0RGIDB4MDAKLSNkZWZpbmUgV0NEOTMzNV9TVFJJTkdfTEVOIDEwMAotCi0jZGVmaW5lIENBTENVTEFURV9WT1VUX0QocmVxX212KSAoKChyZXFfbXYgLSA2NTApICogMTApIC8gMjUpCi0KLXN0YXRpYyBpbnQgY3BlX2RlYnVnX21vZGU7Ci0KLSNkZWZpbmUgVEFTSEFfTUFYX01JQ0JJQVMgNAotI2RlZmluZSBEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUgIk1JQyBCSUFTMSBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVMyX1NUQU5EQUxPTkUgIk1JQyBCSUFTMiBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUgIk1JQyBCSUFTMyBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUgIk1JQyBCSUFTNCBTdGFuZGFsb25lIgotCi0jZGVmaW5lIERBUE1fTERPX0hfU1RBTkRBTE9ORSAiTERPX0giCi1tb2R1bGVfcGFyYW0oY3BlX2RlYnVnX21vZGUsIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNwZV9kZWJ1Z19tb2RlLCAiYm9vdCBjcGUgaW4gZGVidWcgbW9kZSIpOwotCi0jZGVmaW5lIFRBU0hBX0RJR19DT1JFX0NPTExBUFNFX1RJTUVSX01TICAoNSAqIDEwMDApCi0KLSNkZWZpbmUgTUFYX09OX0RFTUFORF9TVVBQTFlfTkFNRV9MRU5HVEggICAgNjQKLQotc3RhdGljIGNoYXIgb25fZGVtYW5kX3N1cHBseV9uYW1lW11bTUFYX09OX0RFTUFORF9TVVBQTFlfTkFNRV9MRU5HVEhdID0gewotCSJjZGMtdmRkLW1pYy1iaWFzIiwKLX07Ci0KLWVudW0gewotCVBPV0VSX0NPTExBUFNFLAotCVBPV0VSX1JFU1VNRSwKLX07Ci0KLWVudW0gdGFzaGFfc2lkb192b2x0YWdlIHsKLQlTSURPX1ZPTFRBR0VfU1ZTX01WID0gOTUwLAotCVNJRE9fVk9MVEFHRV9OT01JTkFMX01WID0gMTEwMCwKLX07Ci0KLXN0YXRpYyBlbnVtIGNvZGVjX3ZhcmlhbnQgY29kZWNfdmVyOwotCi1zdGF0aWMgaW50IGRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSA9IDE7Ci1tb2R1bGVfcGFyYW0oZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlLCBpbnQsIDA2NjQpOwotTU9EVUxFX1BBUk1fREVTQyhkaWdfY29yZV9jb2xsYXBzZV9lbmFibGUsICJlbmFibGUvZGlzYWJsZSBwb3dlciBnYXRpbmciKTsKLQotLyogZGlnX2NvcmVfY29sbGFwc2UgdGltZXIgaW4gc2Vjb25kcyAqLwotc3RhdGljIGludCBkaWdfY29yZV9jb2xsYXBzZV90aW1lciA9IChUQVNIQV9ESUdfQ09SRV9DT0xMQVBTRV9USU1FUl9NUy8xMDAwKTsKLW1vZHVsZV9wYXJhbShkaWdfY29yZV9jb2xsYXBzZV90aW1lciwgaW50LCAwNjY0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGlnX2NvcmVfY29sbGFwc2VfdGltZXIsICJ0aW1lciBmb3IgcG93ZXIgZ2F0aW5nIik7Ci0KLS8qIFNWUyBTY2FsaW5nIGVuYWJsZS9kaXNhYmxlICovCi1zdGF0aWMgaW50IHN2c19zY2FsaW5nX2VuYWJsZWQgPSAxOwotbW9kdWxlX3BhcmFtKHN2c19zY2FsaW5nX2VuYWJsZWQsIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN2c19zY2FsaW5nX2VuYWJsZWQsICJlbmFibGUvZGlzYWJsZSBzdnMgc2NhbGluZyIpOwotCi0vKiBTVlMgYnVjayBzZXR0aW5nICovCi1zdGF0aWMgaW50IHNpZG9fYnVja19zdnNfdm9sdGFnZSA9IFNJRE9fVk9MVEFHRV9TVlNfTVY7Ci1tb2R1bGVfcGFyYW0oc2lkb19idWNrX3N2c192b2x0YWdlLCBpbnQsIDA2NjQpOwotTU9EVUxFX1BBUk1fREVTQyhzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UsCi0JCQkic2V0dGluZyBmb3IgU1ZTIHZvbHRhZ2UgZm9yIFNJRE8gQlVDSyIpOwotCi0jZGVmaW5lIFRBU0hBX1RYX1VOTVVURV9ERUxBWV9NUwk0MAotCi1zdGF0aWMgaW50IHR4X3VubXV0ZV9kZWxheSA9IFRBU0hBX1RYX1VOTVVURV9ERUxBWV9NUzsKLW1vZHVsZV9wYXJhbSh0eF91bm11dGVfZGVsYXksIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHR4X3VubXV0ZV9kZWxheSwgImRlbGF5IHRvIHVubXV0ZSB0aGUgdHggcGF0aCIpOwotCi1zdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnIHRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgPSB7Ci0JLm1pbm9yX3ZlcnNpb24gPSAxLAotCS5zbGltYnVzX2Rldl9pZCA9IEFGRV9TTElNQlVTX0RFVklDRV8xLAotCS5zbGF2ZV9kZXZfcGdkX2xhID0gMCwKLQkuc2xhdmVfZGV2X2ludGZkZXZfbGEgPSAwLAotCS5iaXRfd2lkdGggPSAxNiwKLQkuZGF0YV9mb3JtYXQgPSAwLAotCS5udW1fY2hhbm5lbHMgPSAxCi19OwotCi1zdHJ1Y3QgdGFzaGFfbWJoY196ZGV0X3BhcmFtIHsKLQl1MTYgbGRvX2N0bDsKLQl1MTYgbm9mZjsKLQl1MTYgbnNoaWZ0OwotCXUxNiBidG41OwotCXUxNiBidG42OwotCXUxNiBidG43OwotfTsKLQotc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19wYWdlX2NmZyB0YXNoYV9jZGNfcmVnX3BhZ2VfY2ZnID0gewotCS5taW5vcl92ZXJzaW9uID0gQUZFX0FQSV9WRVJTSU9OX0NEQ19SRUdfUEFHRV9DRkcsCi0JLmVuYWJsZSA9IDEsCi0JLnByb2NfaWQgPSBBRkVfQ0RDX1JFR19QQUdFX0FTU0lHTl9QUk9DX0lEXzEsCi19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZyBhdWRpb19yZWdfY2ZnW10gPSB7Ci0JewotCQkxLAotCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTMzNV9TT0NfTUFEX01BSU5fQ1RMXzEpLAotCQlIV19NQURfQVVESU9fRU5BQkxFLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfMyksCi0JCUhXX01BRF9BVURJT19TTEVFUF9USU1FLCAweEYsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNCksCi0JCUhXX01BRF9UWF9BVURJT19TV0lUQ0hfT0ZGLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9DRkcpLAotCQlNQURfQVVESU9fSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMyksCi0JCU1BRF9BVURJT19JTlRfTUFTS19SRUcsIDB4MSwgV0NEOTMzNV9SRUdfQklUUywgMAotCX0sCi0JewotCQkxLAotCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTMzNV9JTlRSX1BJTjJfU1RBVFVTMyksCi0JCU1BRF9BVURJT19JTlRfU1RBVFVTX1JFRywgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMpLAotCQlNQURfQVVESU9fSU5UX0NMRUFSX1JFRywgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfQ0ZHKSwKLQkJVkJBVF9JTlRfREVTVF9TRUxFQ1RfUkVHLCAweDIsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX01BU0szKSwKLQkJVkJBVF9JTlRfTUFTS19SRUcsIDB4MDgsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpLAotCQlWQkFUX0lOVF9TVEFUVVNfUkVHLCAweDA4LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9DTEVBUjMpLAotCQlWQkFUX0lOVF9DTEVBUl9SRUcsIDB4MDgsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9DRkcpLAotCQlWQkFUX1JFTEVBU0VfSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0lOVFJfUElOMl9NQVNLMyksCi0JCVZCQVRfUkVMRUFTRV9JTlRfTUFTS19SRUcsIDB4MTAsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX1NUQVRVUzMpLAotCQlWQkFUX1JFTEVBU0VfSU5UX1NUQVRVU19SRUcsIDB4MTAsIFdDRDkzMzVfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfSU5UUl9QSU4yX0NMRUFSMyksCi0JCVZCQVRfUkVMRUFTRV9JTlRfQ0xFQVJfUkVHLCAweDEwLCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBUQVNIQV9TQl9QR0RfUE9SVF9UWF9CQVNFKSwKLQkJU0JfUEdEX1BPUlRfVFhfV0FURVJNQVJLX04sIDB4MUUsIFdDRDkzMzVfUkVHX0JJVFMsIDB4MQotCX0sCi0JewotCQkxLAotCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVEFTSEFfU0JfUEdEX1BPUlRfVFhfQkFTRSksCi0JCVNCX1BHRF9QT1JUX1RYX0VOQUJMRV9OLCAweDEsIFdDRDkzMzVfUkVHX0JJVFMsIDB4MQotCX0sCi0JewotCQkxLAotCQkoVEFTSEFfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgVEFTSEFfU0JfUEdEX1BPUlRfUlhfQkFTRSksCi0JCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzM1X1JFR19CSVRTLCAweDEKLQl9LAotCXsKLQkJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFRBU0hBX1NCX1BHRF9QT1JUX1JYX0JBU0UpLAotCQlTQl9QR0RfUE9SVF9SWF9FTkFCTEVfTiwgMHgxLCBXQ0Q5MzM1X1JFR19CSVRTLCAweDEKLQl9LAotCXsJMSwKLQkJKFRBU0hBX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzMzVfQ0RDX0FOQzBfSUlSX0FEQVBUX0NUTCksCi0JCUFBTkNfRkZfR0FJTl9BREFQVElWRSwgMHg0LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7CTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpLAotCQlBQU5DX0ZGR0FJTl9BREFQVElWRV9FTiwgMHg4LCBXQ0Q5MzM1X1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzM1X0NEQ19BTkMwX0ZGX0FfR0FJTl9DVEwpLAotCQlBQU5DX0dBSU5fQ09OVFJPTCwgMHhGRiwgV0NEOTMzNV9SRUdfQklUUywgMAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhIHRhc2hhX2F1ZGlvX3JlZ19jZmcgPSB7Ci0JLm51bV9yZWdpc3RlcnMgPSBBUlJBWV9TSVpFKGF1ZGlvX3JlZ19jZmcpLAotCS5yZWdfZGF0YSA9IGF1ZGlvX3JlZ19jZmcsCi19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9wYXJhbV9pZF9jZGNfYWFuY192ZXJzaW9uIHRhc2hhX2NkY19hYW5jX3ZlcnNpb24gPSB7Ci0JLmNkY19hYW5jX21pbm9yX3ZlcnNpb24gPSBBRkVfQVBJX1ZFUlNJT05fQ0RDX0FBTkNfVkVSU0lPTiwKLQkuYWFuY19od192ZXJzaW9uICAgICAgICA9IEFBTkNfSFdfQkxPQ0tfVkVSU0lPTl8yLAotfTsKLQotZW51bSB7Ci0JVklfU0VOU0VfMSwKLQlWSV9TRU5TRV8yLAotCUFJRjRfU1dJVENIX1ZBTFVFLAotCUFVRElPX05PTUlOQUwsCi0JQ1BFX05PTUlOQUwsCi0JSFBIX1BBX0RFTEFZLAotCUFOQ19NSUNfQU1JQzEsCi0JQU5DX01JQ19BTUlDMiwKLQlBTkNfTUlDX0FNSUMzLAotCUFOQ19NSUNfQU1JQzQsCi0JQU5DX01JQ19BTUlDNSwKLQlBTkNfTUlDX0FNSUM2LAotCUNMQVNTSF9DT05GSUcsCi19OwotCi1lbnVtIHsKLQlBSUYxX1BCID0gMCwKLQlBSUYxX0NBUCwKLQlBSUYyX1BCLAotCUFJRjJfQ0FQLAotCUFJRjNfUEIsCi0JQUlGM19DQVAsCi0JQUlGNF9QQiwKLQlBSUZfTUlYMV9QQiwKLQlBSUY0X01BRF9UWCwKLQlBSUY0X1ZJRkVFRCwKLQlBSUY1X0NQRV9UWCwKLQlOVU1fQ09ERUNfREFJUywKLX07Ci0KLWVudW0gewotCUlOVG5fMV9NSVhfSU5QX1NFTF9aRVJPID0gMCwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfREVDMCwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfREVDMSwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfSUlSMCwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfSUlSMSwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfUlgwLAotCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDEsCi0JSU5Ubl8xX01JWF9JTlBfU0VMX1JYMiwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfUlgzLAotCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDQsCi0JSU5Ubl8xX01JWF9JTlBfU0VMX1JYNSwKLQlJTlRuXzFfTUlYX0lOUF9TRUxfUlg2LAotCUlOVG5fMV9NSVhfSU5QX1NFTF9SWDcsCi0KLX07Ci0KLSNkZWZpbmUgSVNfVkFMSURfTkFUSVZFX0ZJRk9fUE9SVChpbnApIFwKLQkoKGlucCA+PSBJTlRuXzFfTUlYX0lOUF9TRUxfUlgwKSAmJiBcCi0JIChpbnAgPD0gSU5Ubl8xX01JWF9JTlBfU0VMX1JYMykpCi0KLWVudW0gewotCUlOVG5fMl9JTlBfU0VMX1pFUk8gPSAwLAotCUlOVG5fMl9JTlBfU0VMX1JYMCwKLQlJTlRuXzJfSU5QX1NFTF9SWDEsCi0JSU5Ubl8yX0lOUF9TRUxfUlgyLAotCUlOVG5fMl9JTlBfU0VMX1JYMywKLQlJTlRuXzJfSU5QX1NFTF9SWDQsCi0JSU5Ubl8yX0lOUF9TRUxfUlg1LAotCUlOVG5fMl9JTlBfU0VMX1JYNiwKLQlJTlRuXzJfSU5QX1NFTF9SWDcsCi0JSU5Ubl8yX0lOUF9TRUxfUFJPWElNSVRZLAotfTsKLQotZW51bSB7Ci0JSU5URVJQX0VBUiA9IDAsCi0JSU5URVJQX0hQSEwsCi0JSU5URVJQX0hQSFIsCi0JSU5URVJQX0xPMSwKLQlJTlRFUlBfTE8yLAotCUlOVEVSUF9MTzMsCi0JSU5URVJQX0xPNCwKLQlJTlRFUlBfU1BLUjEsCi0JSU5URVJQX1NQS1IyLAotfTsKLQotc3RydWN0IGludGVycF9zYW1wbGVfcmF0ZSB7Ci0JaW50IHNhbXBsZV9yYXRlOwotCWludCByYXRlX3ZhbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIGludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtdID0gewotCXs4MDAwLCAweDB9LAkvKiA4SyAqLwotCXsxNjAwMCwgMHgxfSwJLyogMTZLICovCi0JezI0MDAwLCAtRUlOVkFMfSwvKiAyNEsgKi8KLQl7MzIwMDAsIDB4M30sCS8qIDMySyAqLwotCXs0ODAwMCwgMHg0fSwJLyogNDhLICovCi0Jezk2MDAwLCAweDV9LAkvKiA5NksgKi8KLQl7MTkyMDAwLCAweDZ9LAkvKiAxOTJLICovCi0JezM4NDAwMCwgMHg3fSwJLyogMzg0SyAqLwotCXs0NDEwMCwgMHg4fSwgLyogNDQuMUsgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIGludF9taXhfc2FtcGxlX3JhdGVfdmFsW10gPSB7Ci0JezQ4MDAwLCAweDR9LAkvKiA0OEsgKi8KLQl7OTYwMDAsIDB4NX0sCS8qIDk2SyAqLwotCXsxOTIwMDAsIDB4Nn0sCS8qIDE5MksgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0YXNoYV9yeF9jaHNbVEFTSEFfUlhfTUFYXSA9IHsKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSLCAwKSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMSwgMSksCi0JV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDIsIDIpLAotCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyAzLCAzKSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgNCwgNCksCi0JV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDUsIDUpLAotCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA2LCA2KSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgNywgNyksCi0JV0NEOVhYWF9DSChUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDgsIDgpLAotCVdDRDlYWFhfQ0goVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIgKyA5LCA5KSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTAsIDEwKSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTEsIDExKSwKLQlXQ0Q5WFhYX0NIKFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSICsgMTIsIDEyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkOXh4eF9jaCB0YXNoYV90eF9jaHNbVEFTSEFfVFhfTUFYXSA9IHsKLQlXQ0Q5WFhYX0NIKDAsIDApLAotCVdDRDlYWFhfQ0goMSwgMSksCi0JV0NEOVhYWF9DSCgyLCAyKSwKLQlXQ0Q5WFhYX0NIKDMsIDMpLAotCVdDRDlYWFhfQ0goNCwgNCksCi0JV0NEOVhYWF9DSCg1LCA1KSwKLQlXQ0Q5WFhYX0NIKDYsIDYpLAotCVdDRDlYWFhfQ0goNywgNyksCi0JV0NEOVhYWF9DSCg4LCA4KSwKLQlXQ0Q5WFhYX0NIKDksIDkpLAotCVdDRDlYWFhfQ0goMTAsIDEwKSwKLQlXQ0Q5WFhYX0NIKDExLCAxMSksCi0JV0NEOVhYWF9DSCgxMiwgMTIpLAotCVdDRDlYWFhfQ0goMTMsIDEzKSwKLQlXQ0Q5WFhYX0NIKDE0LCAxNCksCi0JV0NEOVhYWF9DSCgxNSwgMTUpLAotfTsKLQotc3RhdGljIGNvbnN0IHUzMiB2cG9ydF9zbGltX2NoZWNrX3RhYmxlW05VTV9DT0RFQ19EQUlTXSA9IHsKLQkvKiBOZWVkcyB0byBkZWZpbmUgaW4gdGhlIHNhbWUgb3JkZXIgb2YgREFJIGVudW0gZGVmaW5pdGlvbnMgKi8KLQkwLAotCUJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjRfTUFEX1RYKSB8IEJJVChBSUY1X0NQRV9UWCksCi0JMCwKLQlCSVQoQUlGMV9DQVApIHwgQklUKEFJRjNfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCkgfCBCSVQoQUlGNV9DUEVfVFgpLAotCTAsCi0JQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYyX0NBUCkgfCBCSVQoQUlGNF9NQURfVFgpIHwgQklUKEFJRjVfQ1BFX1RYKSwKLQkwLAotCTAsCi0JQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjVfQ1BFX1RYKSwKLQkwLAotCUJJVChBSUYxX0NBUCkgfCBCSVQoQUlGMl9DQVApIHwgQklUKEFJRjNfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCksCi19OwotCi1zdGF0aWMgY29uc3QgdTMyIHZwb3J0X2kyc19jaGVja190YWJsZVtOVU1fQ09ERUNfREFJU10gPSB7Ci0JMCwJCQkvKiBBSUYxX1BCICovCi0JQklUKEFJRjJfQ0FQKSwJCS8qIEFJRjFfQ0FQICovCi0JMCwJCQkvKiBBSUYyX1BCICovCi0JQklUKEFJRjFfQ0FQKSwJCS8qIEFJRjJfQ0FQICovCi19OwotCi0vKiBDb2RlYyBzdXBwb3J0cyAyIElJUiBmaWx0ZXJzICovCi1lbnVtIHsKLQlJSVIwID0gMCwKLQlJSVIxLAotCUlJUl9NQVgsCi19OwotCi0vKiBFYWNoIElJUiBoYXMgNSBGaWx0ZXIgU3RhZ2VzICovCi1lbnVtIHsKLQlCQU5EMSA9IDAsCi0JQkFORDIsCi0JQkFORDMsCi0JQkFORDQsCi0JQkFORDUsCi0JQkFORF9NQVgsCi19OwotCi1lbnVtIHsKLQlDT01QQU5ERVJfMSwgLyogSFBIX0wgKi8KLQlDT01QQU5ERVJfMiwgLyogSFBIX1IgKi8KLQlDT01QQU5ERVJfMywgLyogTE8xX0RJRkYgKi8KLQlDT01QQU5ERVJfNCwgLyogTE8yX0RJRkYgKi8KLQlDT01QQU5ERVJfNSwgLyogTE8zX1NFICovCi0JQ09NUEFOREVSXzYsIC8qIExPNF9TRSAqLwotCUNPTVBBTkRFUl83LCAvKiBTV1IgU1BLIENIMSAqLwotCUNPTVBBTkRFUl84LCAvKiBTV1IgU1BLIENIMiAqLwotCUNPTVBBTkRFUl9NQVgsCi19OwotCi1lbnVtIHsKLQlTUkNfSU5fSFBITCwKLQlTUkNfSU5fTE8xLAotCVNSQ19JTl9IUEhSLAotCVNSQ19JTl9MTzIsCi0JU1JDX0lOX1NQS1JMLAotCVNSQ19JTl9MTzMsCi0JU1JDX0lOX1NQS1JSLAotCVNSQ19JTl9MTzQsCi19OwotCi1lbnVtIHsKLQlTUExJTkVfU1JDMCwKLQlTUExJTkVfU1JDMSwKLQlTUExJTkVfU1JDMiwKLQlTUExJTkVfU1JDMywKLQlTUExJTkVfU1JDX01BWCwKLX07Ci0KLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX2dhaW4sIDAsIDEsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGxpbmVfZ2FpbiwgMCwgNywgMSk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYW5hbG9nX2dhaW4sIDAsIDI1LCAxKTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGFzaGFfZGFpW107Ci1zdGF0aWMgaW50IHdjZDkzMzVfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHUzMiBtaWNiX212KTsKLQotc3RhdGljIGludCB0YXNoYV9jb25maWdfY29tcGFuZGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGludCwgaW50KTsKLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIHUxNiwgYm9vbCk7Ci1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIGJvb2wgZW5hYmxlKTsKLQotLyogSG9sZCBpbnN0YW5jZSB0byBzb3VuZHdpcmUgcGxhdGZvcm0gZGV2aWNlICovCi1zdHJ1Y3QgdGFzaGFfc3dyX2N0cmxfZGF0YSB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3dyX3BkZXY7Ci0Jc3RydWN0IGlkYSBzd3JfaWRhOwotfTsKLQotc3RydWN0IHdjZF9zd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHsKLQl2b2lkICpoYW5kbGU7IC8qIGhvbGRzIGNvZGVjIHByaXZhdGUgZGF0YSAqLwotCWludCAoKnJlYWQpKHZvaWQgKmhhbmRsZSwgaW50IHJlZyk7Ci0JaW50ICgqd3JpdGUpKHZvaWQgKmhhbmRsZSwgaW50IHJlZywgaW50IHZhbCk7Ci0JaW50ICgqYnVsa193cml0ZSkodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pOwotCWludCAoKmNsaykodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSk7Ci0JaW50ICgqaGFuZGxlX2lycSkodm9pZCAqaGFuZGxlLAotCQkJICBpcnFyZXR1cm5fdCAoKnN3cm1faXJxX2hhbmRsZXIpKGludCBpcnEsCi0JCQkJCQkJICB2b2lkICpkYXRhKSwKLQkJCSAgdm9pZCAqc3dybV9oYW5kbGUsCi0JCQkgIGludCBhY3Rpb24pOwotfTsKLQotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19yZWdpc3RlcgotCXdjZF9tYmhjX3JlZ2lzdGVyc1tXQ0RfTUJIQ19SRUdfRlVOQ19NQVhdID0gewotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19MX0RFVF9FTiIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0dORF9ERVRfRU4iLAotCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4NDAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NRUNIX0RFVEVDVElPTl9UWVBFIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19NRUNILCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX0NMQU1QX0NUTCIsCi0JCQkgIFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwsIDB4MzAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9ERVRFQ1RJT05fVFlQRSIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsIDB4MDgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NUUkwiLAotCQkJICBXQ0Q5MzM1X01CSENfUExVR19ERVRFQ1RfQ1RMLCAweEMwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DT01QX0NUUkwiLAotCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MDQsIDIsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1BMVUdfVFlQRSIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfTUVDSCwgMHgxMCwgNCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0dORF9QTFVHX1RZUEUiLAotCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MDgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19TV19IUEhfTFBfMTAwS19UT19HTkQiLAotCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MDEsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9TQ0hNVF9JU1JDIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwgMHgwNiwgMSwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0ZTTV9FTiIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsIDB4ODAsIDcsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19JTlNSRU1fREJOQyIsCi0JCQkgIFdDRDkzMzVfTUJIQ19QTFVHX0RFVEVDVF9DVEwsIDB4MEYsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fREJOQyIsCi0JCQkgIFdDRDkzMzVfTUJIQ19DVExfMSwgMHgwMywgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX1ZSRUYiLAotCQkJICBXQ0Q5MzM1X01CSENfQ1RMXzIsIDB4MDMsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19DT01QX1JFU1VMVCIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzMsIDB4MDgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NSUNfU0NITVRfUkVTVUxUIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHgyMCwgNSwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfU0NITVRfUkVTVUxUIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSFJfU0NITVRfUkVTVUxUIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHg0MCwgNiwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX09DUF9GU01fRU4iLAotCQkJICBXQ0Q5MzM1X0hQSF9PQ1BfQ1RMLCAweDEwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfQlROX1JFU1VMVCIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzMsIDB4MDcsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fSVNSQ19DVEwiLAotCQkJICBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNULCAweDcwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfUkVTVUxUIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHhGRiwgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01JQ0JfQ1RSTCIsCi0JCQkgIFdDRDkzMzVfQU5BX01JQ0IyLCAweEMwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIX0NOUF9XR19USU1FIiwKLQkJCSAgV0NEOTMzNV9IUEhfQ05QX1dHX1RJTUUsIDB4RkYsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhSX1BBX0VOIiwKLQkJCSAgV0NEOTMzNV9BTkFfSFBILCAweDQwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9QQV9FTiIsCi0JCQkgIFdDRDkzMzVfQU5BX0hQSCwgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSF9QQV9FTiIsCi0JCQkgIFdDRDkzMzVfQU5BX0hQSCwgMHhDMCwgNiwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX1NXQ0hfTEVWRUxfUkVNT1ZFIiwKLQkJCSAgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMywgMHgxMCwgNCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX1BVTExET1dOX0NUUkwiLAotCQkJICAwLCAwLCAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfQU5DX0RFVF9FTiIsCi0JCQkgIFdDRDkzMzVfQU5BX01CSENfWkRFVCwgMHgwMSwgMCwgMCksCi0JLyoKLQkgKiBNQkhDIEZTTSBzdGF0dXMgcmVnaXN0ZXIgaXMgb25seSBhdmFpbGFibGUgaW4gVGFzaGEgMi4wLgotCSAqIFNvLCBpbml0IHdpdGggMCBsYXRlciBvbmNlIHRoZSB2ZXJzaW9uIGlzIGtub3duLCB0aGVuIHZhbHVlcwotCSAqIHdpbGwgYmUgdXBkYXRlZC4KLQkgKi8KLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRlNNX1NUQVRVUyIsCi0JCQkgIDAsIDAsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NVVhfQ1RMIiwKLQkJCSAgV0NEOTMzNV9NQkhDX0NUTF8yLCAweDcwLCA0LCAwKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfaW50ciBpbnRyX2lkcyA9IHsKLQkubWJoY19zd19pbnRyID0gIFdDRDkzMzVfSVJRX01CSENfU1dfREVULAotCS5tYmhjX2J0bl9wcmVzc19pbnRyID0gV0NEOTMzNV9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAotCS5tYmhjX2J0bl9yZWxlYXNlX2ludHIgPSBXQ0Q5MzM1X0lSUV9NQkhDX0JVVFRPTl9SRUxFQVNFX0RFVCwKLQkubWJoY19oc19pbnNfaW50ciA9IFdDRDkzMzVfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAotCS5tYmhjX2hzX3JlbV9pbnRyID0gV0NEOTMzNV9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0RFVCwKLQkuaHBoX2xlZnRfb2NwID0gV0NEOTMzNV9JUlFfSFBIX1BBX09DUExfRkFVTFQsCi0JLmhwaF9yaWdodF9vY3AgPSBXQ0Q5MzM1X0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKLX07Ci0KLXN0cnVjdCB3Y2RfdmJhdCB7Ci0JYm9vbCBpc19lbmFibGVkOwotCWJvb2wgYWRjX2NvbmZpZzsKLQkvKiBWYXJpYWJsZXMgdG8gY2FjaGUgVmJhdCBBREMgb3V0cHV0IHZhbHVlcyAqLwotCXUxNiBkY3AxOwotCXUxNiBkY3AyOwotfTsKLQotc3RydWN0IGhwZl93b3JrIHsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0JdTggZGVjaW1hdG9yOwotCXU4IGhwZl9jdXRfb2ZmX2ZyZXE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29yazsKLX07Ci0KLSNkZWZpbmUgV0NEOTMzNV9TUEtfQU5DX0VOX0RFTEFZX01TIDM1MAotc3RhdGljIGludCBzcGtfYW5jX2VuX2RlbGF5ID0gV0NEOTMzNV9TUEtfQU5DX0VOX0RFTEFZX01TOwotbW9kdWxlX3BhcmFtKHNwa19hbmNfZW5fZGVsYXksIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHNwa19hbmNfZW5fZGVsYXksICJkZWxheSB0byBlbmFibGUgYW5jIGluIHNwZWFrZXIgcGF0aCIpOwotCi1zdHJ1Y3Qgc3BrX2FuY193b3JrIHsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29yazsKLX07Ci0KLXN0cnVjdCB0eF9tdXRlX3dvcmsgewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQl1OCBkZWNpbWF0b3I7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkd29yazsKLX07Ci0KLXN0cnVjdCB0YXNoYV9wcml2IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0KLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTMyIGFkY19jb3VudDsKLQl1MzIgcnhfYmlhc19jb3VudDsKLQlzMzIgZG1pY18wXzFfY2xrX2NudDsKLQlzMzIgZG1pY18yXzNfY2xrX2NudDsKLQlzMzIgZG1pY180XzVfY2xrX2NudDsKLQlzMzIgbGRvX2hfdXNlcnM7Ci0JczMyIG1pY2JfcmVmW1RBU0hBX01BWF9NSUNCSUFTXTsKLQlzMzIgcHVsbHVwX3JlZltUQVNIQV9NQVhfTUlDQklBU107Ci0KLQl1MzIgYW5jX3Nsb3Q7Ci0JYm9vbCBhbmNfZnVuYzsKLQotCS8qIFZiYXQgbW9kdWxlICovCi0Jc3RydWN0IHdjZF92YmF0IHZiYXQ7Ci0KLQkvKiBjYWwgaW5mbyBmb3IgY29kZWMgKi8KLQlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YTsKLQotCS8qdHJhY2sgdGFzaGEgaW50ZXJmYWNlIHR5cGUqLwotCXU4IGludGZfdHlwZTsKLQotCS8qIG51bSBvZiBzbGltIHBvcnRzIHJlcXVpcmVkICovCi0Jc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgIGRhaVtOVU1fQ09ERUNfREFJU107Ci0KLQkvKiBTb3VuZFdpcmUgZGF0YSBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgdGFzaGFfc3dyX2N0cmxfZGF0YSAqc3dyX2N0cmxfZGF0YTsKLQlpbnQgbnI7Ci0KLQkvKmNvbXBhbmRlciovCi0JaW50IGNvbXBfZW5hYmxlZFtDT01QQU5ERVJfTUFYXTsKLQotCS8qIE1haW50YWluIHRoZSBzdGF0dXMgb2YgQVVYIFBHQSAqLwotCWludCBhdXhfcGdhX2NudDsKLQl1OCBhdXhfbF9nYWluOwotCXU4IGF1eF9yX2dhaW47Ci0KLQlib29sIHNwa3JfcGFfd2lkZ2V0X29uOwotCXN0cnVjdCByZWd1bGF0b3IgKnNwa2Rydl9yZWc7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqc3BrZHJ2Ml9yZWc7Ci0KLQlib29sIG1iaGNfc3RhcnRlZDsKLQkvKiBjbGFzcyBoIHNwZWNpZmljIGRhdGEgKi8KLQlzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgY2xzaF9kOwotCi0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgc2xpbWJ1c19zbGF2ZV9jZmc7Ci0KLQkvKgotCSAqIGxpc3QgdXNlZCB0byBzYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzIGF0IHN0YXJ0IGFuZAotCSAqIGVuZCBvZiBpbXBlZGFuY2UgbWVhc3VyZW1lbnQKLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHJlZ19zYXZlX3Jlc3RvcmU7Ci0KLQkvKiBoYW5kbGUgdG8gY3BlIGNvcmUgKi8KLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjcGVfY29yZTsKLQl1MzIgY3VycmVudF9jcGVfY2xrX2ZyZXE7Ci0JZW51bSB0YXNoYV9zaWRvX3ZvbHRhZ2Ugc2lkb192b2x0YWdlOwotCWludCBzaWRvX2NjbF9jbnQ7Ci0KLQl1MzIgYW5hX3J4X3N1cHBsaWVzOwotCS8qIE11bHRpcGxpY2F0aW9uIGZhY3RvciB1c2VkIGZvciBpbXBlZGFuY2UgZGV0ZWN0aW9uICovCi0JaW50IHpkZXRfZ2Fpbl9tdWxfZmFjdDsKLQotCS8qIHRvIHRyYWNrIHRoZSBzdGF0dXMgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXR1c19tYXNrOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0IHRhc2hhX2FkZF9jaGlsZF9kZXZpY2VzX3dvcms7Ci0Jc3RydWN0IHdjZF9zd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHN3cl9wbGF0X2RhdGE7Ci0KLQkvKiBQb3J0IHZhbHVlcyBmb3IgUnggYW5kIFR4IGNvZGVjX2RhaSAqLwotCXVuc2lnbmVkIGludCByeF9wb3J0X3ZhbHVlW1RBU0hBX1JYX01BWF07Ci0JdW5zaWduZWQgaW50IHR4X3BvcnRfdmFsdWU7Ci0KLQl1bnNpZ25lZCBpbnQgdmlfZmVlZF92YWx1ZTsKLQkvKiBUYXNoYSBJbnRlcnBvbGF0b3IgTW9kZSBTZWxlY3QgZm9yIEVBUiwgSFBIX0wgYW5kIEhQSF9SICovCi0JdTMyIGhwaF9tb2RlOwotCi0JdTE2IHByaW1faW50X3VzZXJzW1RBU0hBX05VTV9JTlRFUlBPTEFUT1JTXTsKLQlpbnQgc3BsX3NyY191c2Vyc1tTUExJTkVfU1JDX01BWF07Ci0KLQlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncjsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvd2VyX2dhdGVfd29yazsKLQlzdHJ1Y3QgbXV0ZXggcG93ZXJfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggc2lkb19sb2NrOwotCi0JLyogbWJoYyBtb2R1bGUgKi8KLQlzdHJ1Y3Qgd2NkX21iaGMgbWJoYzsKLQlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBub3RpZmllcjsKLQlzdHJ1Y3QgbXV0ZXggbWljYl9sb2NrOwotCi0Jc3RydWN0IGNsayAqd2NkX2V4dF9jbGs7Ci0Jc3RydWN0IGNsayAqd2NkX25hdGl2ZV9jbGs7Ci0Jc3RydWN0IG11dGV4IHN3cl9yZWFkX2xvY2s7Ci0Jc3RydWN0IG11dGV4IHN3cl93cml0ZV9sb2NrOwotCXN0cnVjdCBtdXRleCBzd3JfY2xrX2xvY2s7Ci0JaW50IHN3cl9jbGtfdXNlcnM7Ci0JaW50IG5hdGl2ZV9jbGtfdXNlcnM7Ci0JaW50ICgqemRldF9ncGlvX2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgaGlnaCk7Ci0KLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqdmVyc2lvbl9lbnRyeTsKLQlpbnQgcG93ZXJfYWN0aXZlX3JlZjsKLQotCXN0cnVjdCBvbl9kZW1hbmRfc3VwcGx5IG9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9TVVBQTElFU19NQVhdOwotCi0JaW50ICgqbWFjaGluZV9jb2RlY19ldmVudF9jYikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIGVudW0gd2NkOTMzNV9jb2RlY19ldmVudCk7Ci0JaW50IHNwa3JfZ2Fpbl9vZmZzZXQ7Ci0JaW50IHNwa3JfbW9kZTsKLQlpbnQgZWFyX3Nwa3JfZ2FpbjsKLQlzdHJ1Y3QgaHBmX3dvcmsgdHhfaHBmX3dvcmtbVEFTSEFfTlVNX0RFQ0lNQVRPUlNdOwotCXN0cnVjdCB0eF9tdXRlX3dvcmsgdHhfbXV0ZV9kd29ya1tUQVNIQV9OVU1fREVDSU1BVE9SU107Ci0Jc3RydWN0IHNwa19hbmNfd29yayBzcGtfYW5jX2R3b3JrOwotCXN0cnVjdCBtdXRleCBjb2RlY19tdXRleDsKLQlpbnQgaHBoX2xfZ2FpbjsKLQlpbnQgaHBoX3JfZ2FpbjsKLQlpbnQgcnhfN19jb3VudDsKLQlpbnQgcnhfOF9jb3VudDsKLQlib29sIGNsa19tb2RlOwotCWJvb2wgY2xrX2ludGVybmFsOwotCS8qIExvY2sgdG8gcHJldmVudCBtdWx0aXBsZSBmdW5jdGlvbnMgdm90aW5nIGF0IHNhbWUgdGltZSAqLwotCXN0cnVjdCBtdXRleCBzYl9jbGtfZ2Vhcl9sb2NrOwotCS8qIENvdW50IGZvciBmdW5jdGlvbnMgdm90aW5nIG9yIHVuLXZvdGluZyAqLwotCXUzMiByZWZfY291bnQ7Ci0JLyogTG9jayB0byBwcm90ZWN0IG1jbGsgZW5hYmxlbWVudCAqLwotCXN0cnVjdCBtdXRleCBtY2xrX2xvY2s7Ci19OwotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICBib29sIHZvdGUpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9zcGtyX2RlZmF1bHRbXSA9IHsKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwzLCAweDgwLCAweDgwfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDgwfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3LCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCi0Je1dDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DVEwsIDB4N0MsIDB4NTB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfc3Brcl9tb2RlMVtdID0gewotCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDMsIDB4ODAsIDB4MDB9LAotCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDMsIDB4ODAsIDB4MDB9LAotCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDB9LAotCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI4X0NUTDcsIDB4MDEsIDB4MDB9LAotCXtXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDdDLCAweDQ0fSwKLQl7V0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg0NH0sCi19OwotCi0vKioKLSAqIHRhc2hhX3NldF9zcGtyX2dhaW5fb2Zmc2V0IC0gb2Zmc2V0IHRoZSBzcGVha2VyIHBhdGgKLSAqIGdhaW4gd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLgotICoKLSAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKLSAqIEBvZmZzZXQ6IEluZGljYXRlcyBzcGVha2VyIHBhdGggZ2FpbiBvZmZzZXQgdmFsdWUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KLSAqLwotaW50IHRhc2hhX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPnNwa3JfZ2Fpbl9vZmZzZXQgPSBvZmZzZXQ7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2hhX3NldF9zcGtyX2dhaW5fb2Zmc2V0KTsKLQotLyoqCi0gKiB0YXNoYV9zZXRfc3Brcl9tb2RlIC0gQ29uZmlndXJlcyBzcGVha2VyIGNvbXBhbmRlciBhbmQgc21hcnRib29zdAotICogc2V0dGluZ3MgYmFzZWQgb24gc3BlYWtlciBtb2RlLgotICoKLSAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKLSAqIEBtb2RlOiBJbmRpY2F0ZXMgc3BlYWtlciBjb25maWd1cmF0aW9uIG1vZGUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KLSAqLwotaW50IHRhc2hhX3NldF9zcGtyX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBpOwotCWNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgKnJlZ3M7Ci0JaW50IHNpemU7Ci0KLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBTUEtSX01PREVfMToKLQkJcmVncyA9IHRhc2hhX3Nwa3JfbW9kZTE7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHRhc2hhX3Nwa3JfbW9kZTEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZWdzID0gdGFzaGFfc3Brcl9kZWZhdWx0OwotCQlzaXplID0gQVJSQVlfU0laRSh0YXNoYV9zcGtyX2RlZmF1bHQpOwotCQlicmVhazsKLQl9Ci0KLQlwcml2LT5zcGtyX21vZGUgPSBtb2RlOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZ3NbaV0ucmVnLAotCQkJCSAgICByZWdzW2ldLm1hc2ssIHJlZ3NbaV0udmFsKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodGFzaGFfc2V0X3Nwa3JfbW9kZSk7Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2VuYWJsZV9zaWRvX2J1Y2soc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfUkNPLCAweDgwLCAweDgwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CVUNLX0NUTCwgMHgwMiwgMHgwMik7Ci0JLyogMTAwdXMgc2xlZXAgbmVlZGVkIGFmdGVyIElSRUYgc2V0dGluZ3MgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0JVQ0tfQ1RMLCAweDA0LCAweDA0KTsKLQkvKiAxMDB1cyBzbGVlcCBuZWVkZWQgYWZ0ZXIgVlJFRiBzZXR0aW5ncyAqLwotCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7Ci0JdGFzaGEtPnJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9SQ09fQkc7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NkY19zaWRvX2NjbF9lbmFibGUoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLCBib29sIGNjbF9mbGFnKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhc2hhLT5jb2RlYzsKLQotCWlmICghY29kZWMpCi0JCXJldHVybjsKLQotCWlmICghVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdGFzaGEgdmVyc2lvbiA8IDJwMCwgcmV0dXJuXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzaWRvX2NjbF9jbnQ9JWQsIGNjbF9mbGFnOiVkXG4iLAotCQkJX19mdW5jX18sIHRhc2hhLT5zaWRvX2NjbF9jbnQsIGNjbF9mbGFnKTsKLQlpZiAoY2NsX2ZsYWcpIHsKLQkJaWYgKCsrdGFzaGEtPnNpZG9fY2NsX2NudCA9PSAxKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X1NJRE9fU0lET19DQ0xfMTAsIDB4RkYsIDB4NkUpOwotCX0gZWxzZSB7Ci0JCWlmICh0YXNoYS0+c2lkb19jY2xfY250ID09IDApIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzaWRvX2NjbCBhbHJlYWR5IGRpc2FibGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoLS10YXNoYS0+c2lkb19jY2xfY250ID09IDApCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfU0lET19TSURPX0NDTF8xMCwgMHhGRiwgMHgwMik7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCB0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhKQotewotCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpICYmCi0JCXN2c19zY2FsaW5nX2VuYWJsZWQpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NkY19yZXFfbWNsa19lbmFibGUoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLAotCQkJCSAgICAgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ0YXNoYS0+bWNsa19sb2NrKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCXRhc2hhX2NkY19zaWRvX2NjbF9lbmFibGUodGFzaGEsIHRydWUpOwotCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodGFzaGEtPndjZF9leHRfY2xrKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IGV4dCBjbGsgZW5hYmxlIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIHVubG9ja19tdXRleDsKLQkJfQotCQkvKiBnZXQgQkcgKi8KLQkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7Ci0JCS8qIGdldCBNQ0xLICovCi0JCXdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19ibG9jayh0YXNoYS0+cmVzbWdyLCBXQ0RfQ0xLX01DTEspOwotCX0gZWxzZSB7Ci0JCS8qIHB1dCBNQ0xLICovCi0JCXdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfYmxvY2sodGFzaGEtPnJlc21nciwgV0NEX0NMS19NQ0xLKTsKLQkJLyogcHV0IEJHICovCi0JCXdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyh0YXNoYS0+cmVzbWdyKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHRhc2hhLT53Y2RfZXh0X2Nsayk7Ci0JCXRhc2hhX2NkY19zaWRvX2NjbF9lbmFibGUodGFzaGEsIGZhbHNlKTsKLQl9Ci11bmxvY2tfbXV0ZXg6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+bWNsa19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NkY19jaGVja19zaWRvX3ZhbHVlKGVudW0gdGFzaGFfc2lkb192b2x0YWdlIHJlcV9tdikKLXsKLQlpZiAoKHJlcV9tdiAhPSBTSURPX1ZPTFRBR0VfU1ZTX01WKSAmJgotCQkocmVxX212ICE9IFNJRE9fVk9MVEFHRV9OT01JTkFMX01WKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfYXBwbHlfc2lkb192b2x0YWdlKAotCQkJCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSwKLQkJCQllbnVtIHRhc2hhX3NpZG9fdm9sdGFnZSByZXFfbXYpCi17Ci0JdTMyIHZvdXRfZF92YWw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOwotCWludCByZXQ7Ci0KLQlpZiAoIWNvZGVjKQotCQlyZXR1cm47Ci0KLQlpZiAoIXRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpCi0JCXJldHVybjsKLQotCWlmICgoc2lkb19idWNrX3N2c192b2x0YWdlICE9IFNJRE9fVk9MVEFHRV9TVlNfTVYpICYmCi0JCShzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UgIT0gU0lET19WT0xUQUdFX05PTUlOQUxfTVYpKQotCQlzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UgPSBTSURPX1ZPTFRBR0VfU1ZTX01WOwotCi0JcmV0ID0gdGFzaGFfY2RjX2NoZWNrX3NpZG9fdmFsdWUocmVxX212KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogcmVxdWVzdGVkIG12PSVkIG5vdCBpbiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCByZXFfbXYpOwotCQlyZXR1cm47Ci0JfQotCWlmIChyZXFfbXYgPT0gdGFzaGEtPnNpZG9fdm9sdGFnZSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQWxyZWFkeSBhdCByZXF1ZXN0ZWQgbXY9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVxX212KTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVxX212ID09IHNpZG9fYnVja19zdnNfdm9sdGFnZSkgewotCQlpZiAodGVzdF9iaXQoQVVESU9fTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzaykgfHwKLQkJCXRlc3RfYml0KENQRV9OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCSIlczogbm9taW5hbCBjbGllbnQgcnVubmluZywgc3RhdHVzX21hc2s9JWx1XG4iLAotCQkJCV9fZnVuY19fLCB0YXNoYS0+c3RhdHVzX21hc2spOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCS8qIGNvbXB1dGUgdGhlIHZvdXRfZCBzdGVwIHZhbHVlICovCi0Jdm91dF9kX3ZhbCA9IENBTENVTEFURV9WT1VUX0QocmVxX212KTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9CVUNLX1ZPVVRfRCwgdm91dF9kX3ZhbCAmIDB4RkYpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0JVQ0tfQ1RMLCAweDgwLCAweDgwKTsKLQotCS8qIDEgbXNlYyBzbGVlcCByZXF1aXJlZCBhZnRlciBTSURPIFZvdXRfRCB2b2x0YWdlIGNoYW5nZSAqLwotCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQl0YXNoYS0+c2lkb192b2x0YWdlID0gcmVxX212OwotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiB1cGRhdGVkIFNJRE8gYnVjayBWb3V0X0QgdG8gJWQsIHZvdXRfZCBzdGVwID0gJXVcbiIsCi0JCV9fZnVuY19fLCB0YXNoYS0+c2lkb192b2x0YWdlLCB2b3V0X2RfdmFsKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0JVQ0tfQ1RMLAotCQkJCTB4ODAsIDB4MDApOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX3VwZGF0ZV9zaWRvX3ZvbHRhZ2UoCi0JCQkJc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLAotCQkJCWVudW0gdGFzaGFfc2lkb192b2x0YWdlIHJlcV9tdikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghdGFzaGFfY2RjX2lzX3N2c19lbmFibGVkKHRhc2hhKSkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJnRhc2hhLT5zaWRvX2xvY2spOwotCS8qIGVuYWJsZSBtY2xrIGJlZm9yZSBzZXR0aW5nIFNJRE8gdm9sdGFnZSAqLwotCXJldCA9IHRhc2hhX2NkY19yZXFfbWNsa19lbmFibGUodGFzaGEsIHRydWUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IGV4dCBjbGsgZW5hYmxlIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCXRhc2hhX2NvZGVjX2FwcGx5X3NpZG9fdm9sdGFnZSh0YXNoYSwgcmVxX212KTsKLQl0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHRhc2hhLCBmYWxzZSk7Ci0KLWVycjoKLQltdXRleF91bmxvY2soJnRhc2hhLT5zaWRvX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB0YXNoYV9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgZmFsc2UpOwotCi0JaWYgKCFUQVNIQV9JU18yXzAocHJpdi0+d2NkOXh4eCkpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfQ1RMLAotCQkJCSAgICAweDFFLCAweDAyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCwKLQkJCSAgICAweDAxLCAweDAxKTsKLQkvKgotCSAqIDVtcyBzbGVlcCByZXF1aXJlZCBhZnRlciBlbmFibGluZyBlZnVzZSBjb250cm9sCi0JICogYmVmb3JlIGNoZWNraW5nIHRoZSBzdGF0dXMuCi0JICovCi0JdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOwotCWlmICghKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMpICYgMHgwMSkpCi0JCVdBUk4oMSwgIiVzOiBFZnVzZSBzZW5zZSBpcyBub3QgY29tcGxldGVcbiIsIF9fZnVuY19fKTsKLQotCWlmIChUQVNIQV9JU18yXzAocHJpdi0+d2NkOXh4eCkpIHsKLQkJaWYgKCEoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9WQUxfT1VUMCkgJiAweDQwKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1JfQVRFU1QsCi0JCQkJCSAgICAweDA0LCAweDAwKTsKLQkJdGFzaGFfZW5hYmxlX3NpZG9fYnVjayhjb2RlYyk7Ci0JfQotCi0JdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCBmYWxzZSwgZmFsc2UpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2hhX2VuYWJsZV9lZnVzZV9zZW5zaW5nKTsKLQotdm9pZCAqdGFzaGFfZ2V0X2FmZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAoY29uZmlnX3R5cGUpIHsKLQljYXNlIEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRzoKLQkJcmV0dXJuICZwcml2LT5zbGltYnVzX3NsYXZlX2NmZzsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRzoKLQkJcmV0dXJuICZ0YXNoYV9hdWRpb19yZWdfY2ZnOwotCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6Ci0JCXJldHVybiAmdGFzaGFfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZzsKLQljYXNlIEFGRV9BQU5DX1ZFUlNJT046Ci0JCXJldHVybiAmdGFzaGFfY2RjX2FhbmNfdmVyc2lvbjsKLQljYXNlIEFGRV9DTElQX0JBTktfU0VMOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUc6Ci0JCXJldHVybiAmdGFzaGFfY2RjX3JlZ19wYWdlX2NmZzsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVW5rbm93biBjb25maWdfdHlwZSAweCV4XG4iLAotCQkJX19mdW5jX18sIGNvbmZpZ190eXBlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh0YXNoYV9nZXRfYWZlX2NvbmZpZyk7Ci0KLS8qCi0gKiB0YXNoYV9ldmVudF9yZWdpc3RlcjogUmVnaXN0ZXJzIGEgbWFjaGluZSBkcml2ZXIgY2FsbGJhY2sKLSAqIGZ1bmN0aW9uIHdpdGggY29kZWMgcHJpdmF0ZSBkYXRhIGZvciBwb3N0IEFEU1Agc3ViLXN5c3RlbQotICogcmVzdGFydCAoU1NSKS4gVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gKiBjb2RlYyBkcml2ZXIgb25jZSBjb2RlYyBjb21lcyBvdXQgb2YgcmVzZXQgYWZ0ZXIgQURTUCBTU1IuCi0gKgotICogQG1hY2hpbmVfZXZlbnRfY2I6IGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gbWFjaGluZSBkcml2ZXIKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBSZXR1cm46IG5vbmUKLSAqLwotdm9pZCB0YXNoYV9ldmVudF9yZWdpc3RlcigKLQlpbnQgKCptYWNoaW5lX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJZW51bSB3Y2Q5MzM1X2NvZGVjX2V2ZW50KSwKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAodGFzaGEpCi0JCXRhc2hhLT5tYWNoaW5lX2NvZGVjX2V2ZW50X2NiID0gbWFjaGluZV9ldmVudF9jYjsKLQllbHNlCi0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHRhc2hhX3ByaXYgZGF0YVxuIiwgX19mdW5jX18pOwotfQotRVhQT1JUX1NZTUJPTCh0YXNoYV9ldmVudF9yZWdpc3Rlcik7Ci0KLXN0YXRpYyBpbnQgdGFzaGFfbWJoY19yZXF1ZXN0X2lycShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9Ci0JCQkJJndjZDl4eHgtPmNvcmVfcmVzOwotCi0JcmV0dXJuIHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIGlycSwgaGFuZGxlciwgbmFtZSwgZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX21iaGNfaXJxX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGludCBpcnEsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQotCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQlpZiAoZW5hYmxlKQotCQl3Y2Q5eHh4X2VuYWJsZV9pcnEoY29yZV9yZXMsIGlycSk7Ci0JZWxzZQotCQl3Y2Q5eHh4X2Rpc2FibGVfaXJxKGNvcmVfcmVzLCBpcnEpOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX21iaGNfZnJlZV9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9Ci0JCQkJJndjZDl4eHgtPmNvcmVfcmVzOwotCi0Jd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgaXJxLCBkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfbWJoY19jbGtfc2V0dXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSBib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X01CSENfQ1RMXzEsCi0JCQkJICAgIDB4ODAsIDB4ODApOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8xLAotCQkJCSAgICAweDgwLCAweDAwKTsKLX0KLQotc3RhdGljIGludCB0YXNoYV9tYmhjX2J0bl90b19udW0oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXJldHVybiBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfUkVTVUxUXzMpICYgMHg3OwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9tYmhjX21iaGNfYmlhc19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19FTEVDVCwKLQkJCQkgICAgMHgwMSwgMHgwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX21iaGNfcHJvZ3JhbV9idG5fdGhyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgICAgczE2ICpidG5fbG93LCBzMTYgKmJ0bl9oaWdoLAotCQkJCSAgICAgICBpbnQgbnVtX2J0biwgYm9vbCBpc19taWNiaWFzKQotewotCWludCBpOwotCWludCB2dGg7Ci0KLQlpZiAobnVtX2J0biA+IFdDRF9NQkhDX0RFRl9CVVRUT05TKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIG51bWJlciBvZiBidXR0b25zOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBudW1fYnRuKTsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIFRhc2hhIGp1c3QgbmVlZHMgb25lIHNldCBvZiB0aHJlc2hvbGRzIGZvciBidXR0b24gZGV0ZWN0aW9uCi0JICogZHVlIHRvIG1pY2JpYXMgdm9sdGFnZSByYW1wIHRvIHB1bGx1cCB1cG9uIGJ1dHRvbiBwcmVzcy4gU28KLQkgKiBidG5fbG93IGFuZCBpc19taWNiaWFzIGFyZSBpZ25vcmVkIGFuZCBhbHdheXMgcHJvZ3JhbSBidXR0b24KLQkgKiB0aHJlc2hvbGRzIHVzaW5nIGJ0bl9oaWdoLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fYnRuOyBpKyspIHsKLQkJdnRoID0gKChidG5faGlnaFtpXSAqIDIpIC8gMjUpICYgMHgzRjsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE4wICsgaSwKLQkJCQkgICAgMHhGQywgdnRoIDw8IDIpOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYnRuX2hpZ2hbJWRdOiAlZCwgdnRoOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBpLCBidG5faGlnaFtpXSwgdnRoKTsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIHRhc2hhX21iaGNfbG9ja19zbGVlcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIGJvb2wgbG9jaykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KLQkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7Ci0JaWYgKGxvY2spCi0JCXJldHVybiB3Y2Q5eHh4X2xvY2tfc2xlZXAoY29yZV9yZXMpOwotCWVsc2UgewotCQl3Y2Q5eHh4X3VubG9ja19zbGVlcChjb3JlX3Jlcyk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIGludCB0YXNoYV9tYmhjX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywKLQkJCQkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYmxvY2ssCi0JCQkJCWJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKGVuYWJsZSkKLQkJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZ0YXNoYS0+bm90aWZpZXIsCi0JCQkJCQkJbmJsb2NrKTsKLQllbHNlCi0JCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZ0YXNoYS0+bm90aWZpZXIsCi0JCQkJCQkJICBuYmxvY2spOwotfQotCi1zdGF0aWMgYm9vbCB0YXNoYV9tYmhjX21pY2JfZW5fc3RhdHVzKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgaW50IG1pY2JfbnVtKQotewotCXU4IHZhbDsKLQotCWlmIChtaWNiX251bSA9PSBNSUNfQklBU18yKSB7Ci0JCXZhbCA9IChzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDkzMzVfQU5BX01JQ0IyKSA+PiA2KTsKLQkJaWYgKHZhbCA9PSAweDAxKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgdGFzaGFfbWJoY19ocGhfcGFfb25fc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9BTkFfSFBIKSAmIDB4QzApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9tYmhjX2hwaF9sX3B1bGxfdXBfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWVudW0gbWJoY19oc19wdWxsdXBfaXJlZiBwdWxsX3VwX2N1cikKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmICghdGFzaGEpCi0JCXJldHVybjsKLQotCS8qIERlZmF1bHQgcHVsbCB1cCBjdXJyZW50IHRvIDJ1QSAqLwotCWlmIChwdWxsX3VwX2N1ciA8IElfT0ZGIHx8IHB1bGxfdXBfY3VyID4gSV8zUDBfVUEgfHwKLQkgICAgcHVsbF91cF9jdXIgPT0gSV9ERUZBVUxUKQotCQlwdWxsX3VwX2N1ciA9IElfMlAwX1VBOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEhTIHB1bGwgdXAgY3VycmVudDolZFxuIiwKLQkJX19mdW5jX18sIHB1bGxfdXBfY3VyKTsKLQotCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X01CSENfUExVR19ERVRFQ1RfQ1RMLAotCQkJICAgIDB4QzAsIHB1bGxfdXBfY3VyIDw8IDYpOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX1BMVUdfREVURUNUX0NUTCwKLQkJCSAgICAweEMwLCAweDQwKTsKLX0KLQotc3RhdGljIGludCB0YXNoYV9lbmFibGVfZXh0X21iX3NvdXJjZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCWJvb2wgdHVybl9vbikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgb25fZGVtYW5kX3N1cHBseSAqc3VwcGx5OwotCi0JaWYgKCF0YXNoYSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdXBwbHkgPSAgJnRhc2hhLT5vbl9kZW1hbmRfbGlzdFtPTl9ERU1BTkRfTUlDQklBU107Ci0JaWYgKCFzdXBwbHktPnN1cHBseSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd2FybmluZyBzdXBwbHkgbm90IHByZXNlbnQgb25kIGZvciAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgIm9uRGVtYW5kIE1pY2JpYXMiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB0dXJuX29uOiAlZCBjb3VudDogJWRcbiIsIF9fZnVuY19fLCB0dXJuX29uLAotCQlzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCk7Ci0KLQlpZiAodHVybl9vbikgewotCQlpZiAoIShzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCkpIHsKLQkJCXJldCA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAotCQkJCSJNSUNCSUFTX1JFR1VMQVRPUiIpOwotCQkJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOwotCQl9Ci0JCXN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50Kys7Ci0JfSBlbHNlIHsKLQkJaWYgKHN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50ID4gMCkKLQkJCXN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50LS07Ci0JCWlmICghKHN1cHBseS0+b25kZW1hbmRfc3VwcGx5X2NvdW50KSkgewotCQkJcmV0ID0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKAotCQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAotCQkJCSJNSUNCSUFTX1JFR1VMQVRPUiIpOwotCQlzbmRfc29jX2RhcG1fc3luYyhzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSk7Ci0JCX0KLQl9Ci0KLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAotCQkJX19mdW5jX18sIHR1cm5fb24gPyAiZW5hYmxlIiA6ICJkaXNhYmxlZCIpOwotCWVsc2UKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6ICVzIGV4dGVybmFsIG1pY2JpYXMgc291cmNlXG4iLAotCQkJX19mdW5jX18sIHR1cm5fb24gPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfbWljYmlhc19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgaW50IG1pY2JfbnVtLAotCQkJCSBpbnQgcmVxLCBib29sIGlzX2RhcG0pCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IG1pY2JfaW5kZXggPSBtaWNiX251bSAtIDE7Ci0JdTE2IG1pY2JfcmVnOwotCWludCBwcmVfb2ZmX2V2ZW50ID0gMCwgcG9zdF9vZmZfZXZlbnQgPSAwOwotCWludCBwb3N0X29uX2V2ZW50ID0gMCwgcG9zdF9kYXBtX29mZiA9IDA7Ci0JaW50IHBvc3RfZGFwbV9vbiA9IDA7Ci0KLQlpZiAoKG1pY2JfaW5kZXggPCAwKSB8fCAobWljYl9pbmRleCA+IFRBU0hBX01BWF9NSUNCSUFTIC0gMSkpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBpbmRleCwgbWljYl9pbmQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgbWljYl9pbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzd2l0Y2ggKG1pY2JfbnVtKSB7Ci0JY2FzZSBNSUNfQklBU18xOgotCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0IxOwotCQlicmVhazsKLQljYXNlIE1JQ19CSUFTXzI6Ci0JCW1pY2JfcmVnID0gV0NEOTMzNV9BTkFfTUlDQjI7Ci0JCXByZV9vZmZfZXZlbnQgPSBXQ0RfRVZFTlRfUFJFX01JQ0JJQVNfMl9PRkY7Ci0JCXBvc3Rfb2ZmX2V2ZW50ID0gV0NEX0VWRU5UX1BPU1RfTUlDQklBU18yX09GRjsKLQkJcG9zdF9vbl9ldmVudCA9IFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PTjsKLQkJcG9zdF9kYXBtX29uID0gV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT047Ci0JCXBvc3RfZGFwbV9vZmYgPSBXQ0RfRVZFTlRfUE9TVF9EQVBNX01JQ0JJQVNfMl9PRkY7Ci0JCWJyZWFrOwotCWNhc2UgTUlDX0JJQVNfMzoKLQkJbWljYl9yZWcgPSBXQ0Q5MzM1X0FOQV9NSUNCMzsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNfQklBU180OgotCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0I0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtaWNiaWFzIG51bWJlcjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgbWljYl9udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfbG9jaygmdGFzaGEtPm1pY2JfbG9jayk7Ci0KLQlzd2l0Y2ggKHJlcSkgewotCWNhc2UgTUlDQl9QVUxMVVBfRU5BQkxFOgotCQl0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSsrOwotCQlpZiAoKHRhc2hhLT5wdWxsdXBfcmVmW21pY2JfaW5kZXhdID09IDEpICYmCi0JCSAgICAodGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4ODApOwotCQlicmVhazsKLQljYXNlIE1JQ0JfUFVMTFVQX0RJU0FCTEU6Ci0JCWlmICh0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA+IDApCi0JCQl0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XS0tOwotCQlpZiAoKHRhc2hhLT5wdWxsdXBfcmVmW21pY2JfaW5kZXhdID09IDApICYmCi0JCSAgICAodGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4MDApOwotCQlicmVhazsKLQljYXNlIE1JQ0JfRU5BQkxFOgotCQl0YXNoYS0+bWljYl9yZWZbbWljYl9pbmRleF0rKzsKLQkJaWYgKHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAxKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX3JlZywgMHhDMCwgMHg0MCk7Ci0JCQlpZiAocG9zdF9vbl9ldmVudCkKLQkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCi0JCQkJCQlwb3N0X29uX2V2ZW50LCAmdGFzaGEtPm1iaGMpOwotCQl9Ci0JCWlmIChpc19kYXBtICYmIHBvc3RfZGFwbV9vbikKLQkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhc2hhLT5ub3RpZmllciwKLQkJCQkJcG9zdF9kYXBtX29uLCAmdGFzaGEtPm1iaGMpOwotCQlicmVhazsKLQljYXNlIE1JQ0JfRElTQUJMRToKLQkJaWYgKHRhc2hhLT5taWNiX3JlZlttaWNiX2luZGV4XSA+IDApCi0JCQl0YXNoYS0+bWljYl9yZWZbbWljYl9pbmRleF0tLTsKLQkJaWYgKCh0YXNoYS0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMCkgJiYKLQkJICAgICh0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA+IDApKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4ODApOwotCQllbHNlIGlmICgodGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApICYmCi0JCQkgKHRhc2hhLT5wdWxsdXBfcmVmW21pY2JfaW5kZXhdID09IDApKSB7Ci0JCQlpZiAocHJlX29mZl9ldmVudCkKLQkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCi0JCQkJCQlwcmVfb2ZmX2V2ZW50LCAmdGFzaGEtPm1iaGMpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4MDApOwotCQkJaWYgKHBvc3Rfb2ZmX2V2ZW50KQotCQkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhc2hhLT5ub3RpZmllciwKLQkJCQkJCXBvc3Rfb2ZmX2V2ZW50LCAmdGFzaGEtPm1iaGMpOwotCQl9Ci0JCWlmIChpc19kYXBtICYmIHBvc3RfZGFwbV9vZmYpCi0JCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXNoYS0+bm90aWZpZXIsCi0JCQkJCXBvc3RfZGFwbV9vZmYsICZ0YXNoYS0+bWJoYyk7Ci0JCWJyZWFrOwotCX07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWljYl9udW06JWQsIG1pY2JfcmVmOiAlZCwgcHVsbHVwX3JlZjogJWRcbiIsCi0JCV9fZnVuY19fLCBtaWNiX251bSwgdGFzaGEtPm1pY2JfcmVmW21pY2JfaW5kZXhdLAotCQl0YXNoYS0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSk7Ci0KLQltdXRleF91bmxvY2soJnRhc2hhLT5taWNiX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfbWJoY19yZXF1ZXN0X21pY2JpYXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIGludCBtaWNiX251bSwgaW50IHJlcSkKLXsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBJZiBtaWNiaWFzIGlzIHJlcXVlc3RlZCwgbWFrZSBzdXJlIHRoYXQgdGhlcmUKLQkgKiBpcyB2b3RlIHRvIGVuYWJsZSBtY2xrCi0JICovCi0JaWYgKHJlcSA9PSBNSUNCX0VOQUJMRSkKLQkJdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCB0cnVlLCBmYWxzZSk7Ci0KLQlyZXQgPSB0YXNoYV9taWNiaWFzX2NvbnRyb2woY29kZWMsIG1pY2JfbnVtLCByZXEsIGZhbHNlKTsKLQotCS8qCi0JICogUmVsZWFzZSB2b3RlIGZvciBtY2xrIHdoaWxlIHJlcXVlc3RpbmcgZm9yCi0JICogbWljYmlhcyBkaXNhYmxlCi0JICovCi0JaWYgKHJlcSA9PSBNSUNCX0RJU0FCTEUpCi0JCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgZmFsc2UsIGZhbHNlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX21iaGNfbWljYl9yYW1wX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQlib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01JQ0IyX1JBTVAsCi0JCQkJICAgIDB4MUMsIDB4MEMpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMl9SQU1QLAotCQkJCSAgICAweDgwLCAweDgwKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMl9SQU1QLAotCQkJCSAgICAweDgwLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUlDQjJfUkFNUCwKLQkJCQkgICAgMHgxQywgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGZpcm13YXJlX2NhbCAqdGFzaGFfZ2V0X2h3ZGVwX2Z3X2NhbChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJCQkgICBlbnVtIHdjZF9jYWxfdHlwZSB0eXBlKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQlzdHJ1Y3QgZmlybXdhcmVfY2FsICpod2RlcF9jYWw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gbWJoYy0+Y29kZWM7Ci0KLQlpZiAoIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IE5VTEwgY29kZWMgcG9pbnRlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0YXNoYS0+ZndfZGF0YSwgdHlwZSk7Ci0JaWYgKCFod2RlcF9jYWwpCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjYWwgbm90IHNlbnQgYnkgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdHlwZSk7Ci0KLQlyZXR1cm4gaHdkZXBfY2FsOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX21iaGNfbWljYl9hZGp1c3Rfdm9sdGFnZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgaW50IHJlcV92b2x0LAotCQkJCQkgIGludCBtaWNiX251bSkKLXsKLQlpbnQgY3VyX3ZvdXRfY3RsLCByZXFfdm91dF9jdGw7Ci0JaW50IG1pY2JfcmVnLCBtaWNiX3ZhbCwgbWljYl9lbjsKLQotCXN3aXRjaCAobWljYl9udW0pIHsKLQljYXNlIE1JQ19CSUFTXzE6Ci0JCW1pY2JfcmVnID0gV0NEOTMzNV9BTkFfTUlDQjE7Ci0JCWJyZWFrOwotCWNhc2UgTUlDX0JJQVNfMjoKLQkJbWljYl9yZWcgPSBXQ0Q5MzM1X0FOQV9NSUNCMjsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNfQklBU18zOgotCQltaWNiX3JlZyA9IFdDRDkzMzVfQU5BX01JQ0IzOwotCQlicmVhazsKLQljYXNlIE1JQ19CSUFTXzQ6Ci0JCW1pY2JfcmVnID0gV0NEOTMzNV9BTkFfTUlDQjQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogSWYgcmVxdWVzdGVkIG1pY2JpYXMgdm9sdGFnZSBpcyBzYW1lIGFzIGN1cnJlbnQgbWljYmlhcwotCSAqIHZvbHRhZ2UsIHRoZW4ganVzdCByZXR1cm4uIE90aGVyd2lzZSwgYWRqdXN0IHZvbHRhZ2UgYXMKLQkgKiBwZXIgcmVxdWVzdGVkIHZhbHVlLiBJZiBtaWNiaWFzIGlzIGFscmVhZHkgZW5hYmxlZCwgdGhlbgotCSAqIHRvIGF2b2lkIHNsb3cgbWljYmlhcyByYW1wLXVwIG9yIGRvd24gZW5hYmxlIHB1bGwtdXAKLQkgKiBtb21lbnRhcmlseSwgY2hhbmdlIHRoZSBtaWNiaWFzIHZhbHVlIGFuZCB0aGVuIHJlLWVuYWJsZQotCSAqIG1pY2JpYXMuCi0JICovCi0JbWljYl92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIG1pY2JfcmVnKTsKLQltaWNiX2VuID0gKG1pY2JfdmFsICYgMHhDMCkgPj4gNjsKLQljdXJfdm91dF9jdGwgPSBtaWNiX3ZhbCAmIDB4M0Y7Ci0KLQlyZXFfdm91dF9jdGwgPSB3Y2Q5MzM1X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChyZXFfdm9sdCk7Ci0JaWYgKHJlcV92b3V0X2N0bCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjdXJfdm91dF9jdGwgPT0gcmVxX3ZvdXRfY3RsKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtaWNiX251bTogJWQsIGN1cl9tdjogJWQsIHJlcV9tdjogJWQsIG1pY2JfZW46ICVkXG4iLAotCQkgX19mdW5jX18sIG1pY2JfbnVtLCBXQ0RfVk9VVF9DVExfVE9fTUlDQihjdXJfdm91dF9jdGwpLAotCQkgcmVxX3ZvbHQsIG1pY2JfZW4pOwotCi0JaWYgKG1pY2JfZW4gPT0gMHgxKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX3JlZywgMHhDMCwgMHg4MCk7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX3JlZywgMHgzRiwgcmVxX3ZvdXRfY3RsKTsKLQotCWlmIChtaWNiX2VuID09IDB4MSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNiX3JlZywgMHhDMCwgMHg0MCk7Ci0JCS8qCi0JCSAqIEFkZCAybXMgZGVsYXkgYXMgcGVyIEhXIHJlcXVpcmVtZW50IGFmdGVyIGVuYWJsaW5nCi0JCSAqIG1pY2JpYXMKLQkJICovCi0JCXVzbGVlcF9yYW5nZSgyMDAwLCAyMTAwKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9tYmhjX21pY2JfY3RybF90aHJlc2hvbGRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICAgICAgaW50IG1pY2JfbnVtLCBib29sIHJlcV9lbikKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50IHJjLCBtaWNiX212OwotCi0JaWYgKG1pY2JfbnVtICE9IE1JQ19CSUFTXzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyoKLQkgKiBJZiBkZXZpY2UgdHJlZSBtaWNiaWFzIGxldmVsIGlzIGFscmVhZHkgYWJvdmUgdGhlIG1pbmltdW0KLQkgKiB2b2x0YWdlIG5lZWRlZCB0byBkZXRlY3QgdGhyZXNob2xkIG1pY3JvcGhvbmUsIHRoZW4gZG8KLQkgKiBub3QgY2hhbmdlIHRoZSBtaWNiaWFzLCBqdXN0IHJldHVybi4KLQkgKi8KLQlpZiAocGRhdGEtPm1pY2JpYXMubWljYjJfbXYgPj0gV0NEX01CSENfVEhSX0hTX01JQ0JfTVYpCi0JCXJldHVybiAwOwotCi0JbWljYl9tdiA9IHJlcV9lbiA/IFdDRF9NQkhDX1RIUl9IU19NSUNCX01WIDogcGRhdGEtPm1pY2JpYXMubWljYjJfbXY7Ci0KLQltdXRleF9sb2NrKCZ0YXNoYS0+bWljYl9sb2NrKTsKLQlyYyA9IHRhc2hhX21iaGNfbWljYl9hZGp1c3Rfdm9sdGFnZShjb2RlYywgbWljYl9tdiwgTUlDX0JJQVNfMik7Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+bWljYl9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHRhc2hhX21iaGNfZ2V0X3Jlc3VsdF9wYXJhbXMoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkJCQlzMTYgKmQxX2EsIHUxNiBub2ZmLAotCQkJCQkJaW50MzJfdCAqemRldCkKLXsKLQlpbnQgaTsKLQlpbnQgdmFsLCB2YWwxOwotCXMxNiBjMTsKLQlzMzIgeDEsIGQxOwotCWludDMyX3QgZGVub207Ci0JaW50IG1pbkNvZGVfcGFyYW1bXSA9IHsKLQkJCTMyNzcsIDE2MzksIDgyMCwgNDEwLCAyMDUsIDEwMywgNTIsIDI2Ci0JfTsKLQotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzMzVfQU5BX01CSENfWkRFVCwgMHgyMCwgMHgyMCk7Ci0JZm9yIChpID0gMDsgaSA8IFRBU0hBX1pERVRfTlVNX01FQVNVUkVNRU5UUzsgaSsrKSB7Ci0JCXJlZ21hcF9yZWFkKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMiwgJnZhbCk7Ci0JCWlmICh2YWwgJiAweDgwKQotCQkJYnJlYWs7Ci0JfQotCXZhbCA9IHZhbCA8PCAweDg7Ci0JcmVnbWFwX3JlYWQod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzM1X0FOQV9NQkhDX1JFU1VMVF8xLCAmdmFsMSk7Ci0JdmFsIHw9IHZhbDE7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDIwLCAweDAwKTsKLQl4MSA9IFRBU0hBX01CSENfR0VUX1gxKHZhbCk7Ci0JYzEgPSBUQVNIQV9NQkhDX0dFVF9DMSh2YWwpOwotCS8qIElmIHJhbXAgaXMgbm90IGNvbXBsZXRlLCBnaXZlIGFkZGl0aW9uYWwgNW1zICovCi0JaWYgKChjMSA8IDIpICYmIHgxKQotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTA1MCk7Ci0KLQlpZiAoIWMxIHx8ICF4MSkgewotCQlkZXZfZGJnKHdjZDl4eHgtPmRldiwKLQkJCSIlczogSW1wZWRhbmNlIGRldGVjdCByYW1wIGVycm9yLCBjMT0lZCwgeDE9MHgleFxuIiwKLQkJCV9fZnVuY19fLCBjMSwgeDEpOwotCQlnb3RvIHJhbXBfZG93bjsKLQl9Ci0JZDEgPSBkMV9hW2MxXTsKLQlkZW5vbSA9ICh4MSAqIGQxKSAtICgxIDw8ICgxNCAtIG5vZmYpKTsKLQlpZiAoZGVub20gPiAwKQotCQkqemRldCA9IChUQVNIQV9NQkhDX1pERVRfQ09OU1QgKiAxMDAwKSAvIGRlbm9tOwotCWVsc2UgaWYgKHgxIDwgbWluQ29kZV9wYXJhbVtub2ZmXSkKLQkJKnpkZXQgPSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRTsKLQotCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IGQxPSVkLCBjMT0lZCwgeDE9MHgleCwgel92YWw9JWQobWlsbGlPaG0pXG4iLAotCQlfX2Z1bmNfXywgZDEsIGMxLCB4MSwgKnpkZXQpOwotcmFtcF9kb3duOgotCWkgPSAwOwotCXdoaWxlICh4MSkgewotCQlyZWdtYXBfYnVsa19yZWFkKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkgV0NEOTMzNV9BTkFfTUJIQ19SRVNVTFRfMSwgKHU4ICopJnZhbCwgMik7Ci0JCXgxID0gVEFTSEFfTUJIQ19HRVRfWDEodmFsKTsKLQkJaSsrOwotCQlpZiAoaSA9PSBUQVNIQV9aREVUX05VTV9NRUFTVVJFTUVOVFMpCi0JCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiB0YXNoYV9tYmhjX3pkZXRfZ3Bpb19jdHJsOiBSZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbiBmb3IKLSAqIGNvbnRyb2xsaW5nIHRoZSBzd2l0Y2ggb24gaGlmaSBhbXBzLiBEZWZhdWx0IHN3aXRjaCBzdGF0ZQotICogd2lsbCBwdXQgYSA1MW9obSBsb2FkIGluIHBhcmFsbGVsIHRvIHRoZSBocGggbG9hZC4gU28sCi0gKiBpbXBlZGFuY2UgZGV0ZWN0aW9uIGZ1bmN0aW9uIHdpbGwgcHVsbCB0aGUgZ3BpbyBoaWdoCi0gKiB0byBtYWtlIHRoZSBzd2l0Y2ggb3Blbi4KLSAqCi0gKiBAemRldF9ncGlvX2NiOiBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIG1hY2hpbmUgZHJpdmVyCi0gKiBAY29kZWM6IENvZGVjIGluc3RhbmNlCi0gKgotICogUmV0dXJuOiBub25lCi0gKi8KLXZvaWQgdGFzaGFfbWJoY196ZGV0X2dwaW9fY3RybCgKLQkJaW50ICgqemRldF9ncGlvX2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgaGlnaCksCi0JCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXRhc2hhLT56ZGV0X2dwaW9fY2IgPSB6ZGV0X2dwaW9fY2I7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2hhX21iaGNfemRldF9ncGlvX2N0cmwpOwotCi1zdGF0aWMgdm9pZCB0YXNoYV9tYmhjX3pkZXRfcmFtcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCB0YXNoYV9tYmhjX3pkZXRfcGFyYW0gKnpkZXRfcGFyYW0sCi0JCQkJIGludDMyX3QgKnpsLCBpbnQzMl90ICp6ciwgczE2ICpkMV9hKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50MzJfdCB6ZGV0ID0gMDsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX0FOQV9DVEwsIDB4NzAsCi0JCQkgICAgemRldF9wYXJhbS0+bGRvX2N0bCA8PCA0KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjUsIDB4RkMsCi0JCQkgICAgemRldF9wYXJhbS0+YnRuNSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE42LCAweEZDLAotCQkJICAgIHpkZXRfcGFyYW0tPmJ0bjYpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONywgMHhGQywKLQkJCSAgICB6ZGV0X3BhcmFtLT5idG43KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMLCAweDBGLAotCQkJICAgIHpkZXRfcGFyYW0tPm5vZmYpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX1JBTVBfQ1RMLCAweDBGLAotCQkJICAgIHpkZXRfcGFyYW0tPm5zaGlmdCk7Ci0KLQlpZiAoIXpsKQotCQlnb3RvIHpfcmlnaHQ7Ci0JLyogU3RhcnQgaW1wZWRhbmNlIG1lYXN1cmVtZW50IGZvciBIUEhfTCAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX1pERVQsIDB4ODAsIDB4ODApOwotCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IHJhbXAgZm9yIEhQSF9MLCBub2ZmID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCB6ZGV0X3BhcmFtLT5ub2ZmKTsKLQl0YXNoYV9tYmhjX2dldF9yZXN1bHRfcGFyYW1zKHdjZDl4eHgsIGQxX2EsIHpkZXRfcGFyYW0tPm5vZmYsICZ6ZGV0KTsKLQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDgwLCAweDAwKTsKLQotCSp6bCA9IHpkZXQ7Ci0KLXpfcmlnaHQ6Ci0JaWYgKCF6cikKLQkJcmV0dXJuOwotCS8qIFN0YXJ0IGltcGVkYW5jZSBtZWFzdXJlbWVudCBmb3IgSFBIX1IgKi8KLQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19aREVULCAweDQwLCAweDQwKTsKLQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiByYW1wIGZvciBIUEhfUiwgbm9mZiA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgemRldF9wYXJhbS0+bm9mZik7Ci0JdGFzaGFfbWJoY19nZXRfcmVzdWx0X3BhcmFtcyh3Y2Q5eHh4LCBkMV9hLCB6ZGV0X3BhcmFtLT5ub2ZmLCAmemRldCk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCSAgIFdDRDkzMzVfQU5BX01CSENfWkRFVCwgMHg0MCwgMHgwMCk7Ci0KLQkqenIgPSB6ZGV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGFzaGFfd2NkX21iaGNfcWZ1c2VfY2FsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJaW50MzJfdCAqel92YWwsIGludCBmbGFnX2xfcikKLXsKLQlzMTYgcTE7Ci0JaW50IHExX2NhbDsKLQotCWlmICgqel92YWwgPCAoVEFTSEFfWkRFVF9WQUxfNDAwLzEwMDApKQotCQlxMSA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCVdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDEgKyAoMiAqIGZsYWdfbF9yKSk7Ci0JZWxzZQotCQlxMSA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCVdDRDkzMzVfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDIgKyAoMiAqIGZsYWdfbF9yKSk7Ci0JaWYgKHExICYgMHg4MCkKLQkJcTFfY2FsID0gKDEwMDAwIC0gKChxMSAmIDB4N0YpICogMjUpKTsKLQllbHNlCi0JCXExX2NhbCA9ICgxMDAwMCArIChxMSAqIDI1KSk7Ci0JaWYgKHExX2NhbCA+IDApCi0JCSp6X3ZhbCA9ICgoKnpfdmFsKSAqIDEwMDAwKSAvIHExX2NhbDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfd2NkX21iaGNfY2FsY19pbXBlZGFuY2Uoc3RydWN0IHdjZF9tYmhjICptYmhjLCB1aW50MzJfdCAqemwsCi0JCQkJCSAgdWludDMyX3QgKnpyKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7Ci0JczE2IHJlZzAsIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQ7Ci0JaW50MzJfdCB6MUwsIHoxUiwgejFMczsKLQlpbnQgek1vbm8sIHpfZGlmZjEsIHpfZGlmZjI7Ci0JYm9vbCBpc19mc21fZGlzYWJsZSA9IGZhbHNlOwotCWJvb2wgaXNfY2hhbmdlID0gZmFsc2U7Ci0Jc3RydWN0IHRhc2hhX21iaGNfemRldF9wYXJhbSB6ZGV0X3BhcmFtW10gPSB7Ci0JCXs0LCAwLCA0LCAweDA4LCAweDE0LCAweDE4fSwgLyogPCAzMm9obSAqLwotCQl7MiwgMCwgMywgMHgxOCwgMHg3QywgMHg5MH0sIC8qIDMyb2htIDwgWiA8IDQwMG9obSAqLwotCQl7MSwgNCwgNSwgMHgxOCwgMHg3QywgMHg5MH0sIC8qIDQwMG9obSA8IFogPCAxMjAwb2htICovCi0JCXsxLCA2LCA3LCAweDE4LCAweDdDLCAweDkwfSwgLyogPjEyMDBvaG0gKi8KLQl9OwotCXN0cnVjdCB0YXNoYV9tYmhjX3pkZXRfcGFyYW0gKnpkZXRfcGFyYW1fcHRyID0gTlVMTDsKLQlzMTYgZDFfYVtdWzRdID0gewotCQl7MCwgMzAsIDkwLCAzMH0sCi0JCXswLCAzMCwgMzAsIDV9LAotCQl7MCwgMzAsIDMwLCA1fSwKLQkJezAsIDMwLCAzMCwgNX0sCi0JfTsKLQlzMTYgKmQxID0gTlVMTDsKLQotCWlmICghVEFTSEFfSVNfMl8wKHdjZDl4eHgpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBaLWRldCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGNvZGVjIHZlcnNpb25cbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJKnpsID0gMDsKLQkJKnpyID0gMDsKLQkJcmV0dXJuOwotCX0KLQlXQ0RfTUJIQ19SU0NfQVNTRVJUX0xPQ0tFRChtYmhjKTsKLQotCWlmICh0YXNoYS0+emRldF9ncGlvX2NiKQotCQlpc19jaGFuZ2UgPSB0YXNoYS0+emRldF9ncGlvX2NiKGNvZGVjLCB0cnVlKTsKLQotCXJlZzAgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONSk7Ci0JcmVnMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE42KTsKLQlyZWcyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjcpOwotCXJlZzMgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfTUJIQ19DVExfMSk7Ci0JcmVnNCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfQU5BX0NUTCk7Ci0KLQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0VMRUNUKSAmIDB4ODApIHsKLQkJaXNfZnNtX2Rpc2FibGUgPSB0cnVlOwotCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJCSAgIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsIDB4ODAsIDB4MDApOwotCX0KLQotCS8qIEZvciBOTy1qYWNrLCBkaXNhYmxlIExfREVUX0VOIGJlZm9yZSBaLWRldCBtZWFzdXJlbWVudHMgKi8KLQlpZiAobWJoYy0+aHBobF9zd2gpCi0JCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19NRUNILCAweDgwLCAweDAwKTsKLQotCS8qIEVuYWJsZSBBWiAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTUJIQ19DVExfMSwgMHgwQywgMHgwNCk7Ci0JLyogVHVybiBvZmYgMTAwayBwdWxsIGRvd24gb24gSFBITCAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MDEsIDB4MDApOwotCi0JLyogRmlyc3QgZ2V0IGltcGVkYW5jZSBvbiBMZWZ0ICovCi0JZDEgPSBkMV9hWzFdOwotCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMV07Ci0JdGFzaGFfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCAmejFMLCBOVUxMLCBkMSk7Ci0KLQlpZiAoIVRBU0hBX01CSENfSVNfU0VDT05EX1JBTVBfUkVRVUlSRUQoejFMKSkKLQkJZ290byBsZWZ0X2NoX2ltcGVkYW5jZTsKLQotCS8qIHNlY29uZCByYW1wIGZvciBsZWZ0IGNoICovCi0JaWYgKHoxTCA8IFRBU0hBX1pERVRfVkFMXzMyKSB7Ci0JCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMF07Ci0JCWQxID0gZDFfYVswXTsKLQl9IGVsc2UgaWYgKCh6MUwgPiBUQVNIQV9aREVUX1ZBTF80MDApICYmICh6MUwgPD0gVEFTSEFfWkRFVF9WQUxfMTIwMCkpIHsKLQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsyXTsKLQkJZDEgPSBkMV9hWzJdOwotCX0gZWxzZSBpZiAoejFMID4gVEFTSEFfWkRFVF9WQUxfMTIwMCkgewotCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzNdOwotCQlkMSA9IGQxX2FbM107Ci0JfQotCXRhc2hhX21iaGNfemRldF9yYW1wKGNvZGVjLCB6ZGV0X3BhcmFtX3B0ciwgJnoxTCwgTlVMTCwgZDEpOwotCi1sZWZ0X2NoX2ltcGVkYW5jZToKLQlpZiAoKHoxTCA9PSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKLQkJKHoxTCA+IFRBU0hBX1pERVRfVkFMXzEwMEspKSB7Ci0JCSp6bCA9IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOwotCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzFdOwotCQlkMSA9IGQxX2FbMV07Ci0JfSBlbHNlIHsKLQkJKnpsID0gejFMLzEwMDA7Ci0JCXRhc2hhX3djZF9tYmhjX3FmdXNlX2NhbChjb2RlYywgemwsIDApOwotCX0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW1wZWRhbmNlIG9uIEhQSF9MID0gJWQob2htcylcbiIsCi0JCQkJX19mdW5jX18sICp6bCk7Ci0KLQkvKiBzdGFydCBvZiByaWdodCBpbXBlZGFuY2UgcmFtcCBhbmQgY2FsY3VsYXRpb24gKi8KLQl0YXNoYV9tYmhjX3pkZXRfcmFtcChjb2RlYywgemRldF9wYXJhbV9wdHIsIE5VTEwsICZ6MVIsIGQxKTsKLQlpZiAoVEFTSEFfTUJIQ19JU19TRUNPTkRfUkFNUF9SRVFVSVJFRCh6MVIpKSB7Ci0JCWlmICgoKHoxUiA+IFRBU0hBX1pERVRfVkFMXzEyMDApICYmCi0JCQkoemRldF9wYXJhbV9wdHItPm5vZmYgPT0gMHg2KSkgfHwKLQkJCSgoKnpsKSAhPSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkpCi0JCQlnb3RvIHJpZ2h0X2NoX2ltcGVkYW5jZTsKLQkJLyogc2Vjb25kIHJhbXAgZm9yIHJpZ2h0IGNoICovCi0JCWlmICh6MVIgPCBUQVNIQV9aREVUX1ZBTF8zMikgewotCQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVswXTsKLQkJCWQxID0gZDFfYVswXTsKLQkJfSBlbHNlIGlmICgoejFSID4gVEFTSEFfWkRFVF9WQUxfNDAwKSAmJgotCQkJKHoxUiA8PSBUQVNIQV9aREVUX1ZBTF8xMjAwKSkgewotCQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsyXTsKLQkJCWQxID0gZDFfYVsyXTsKLQkJfSBlbHNlIGlmICh6MVIgPiBUQVNIQV9aREVUX1ZBTF8xMjAwKSB7Ci0JCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzNdOwotCQkJZDEgPSBkMV9hWzNdOwotCQl9Ci0JCXRhc2hhX21iaGNfemRldF9yYW1wKGNvZGVjLCB6ZGV0X3BhcmFtX3B0ciwgTlVMTCwgJnoxUiwgZDEpOwotCX0KLXJpZ2h0X2NoX2ltcGVkYW5jZToKLQlpZiAoKHoxUiA9PSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKLQkJKHoxUiA+IFRBU0hBX1pERVRfVkFMXzEwMEspKSB7Ci0JCSp6ciA9IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOwotCX0gZWxzZSB7Ci0JCSp6ciA9IHoxUi8xMDAwOwotCQl0YXNoYV93Y2RfbWJoY19xZnVzZV9jYWwoY29kZWMsIHpyLCAxKTsKLQl9Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGltcGVkYW5jZSBvbiBIUEhfUiA9ICVkKG9obXMpXG4iLAotCQkJCV9fZnVuY19fLCAqenIpOwotCi0JLyogbW9uby9zdGVyZW8gZGV0ZWN0aW9uICovCi0JaWYgKCgqemwgPT0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpICYmCi0JCSgqenIgPT0gVEFTSEFfWkRFVF9GTE9BVElOR19JTVBFREFOQ0UpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogcGx1ZyB0eXBlIGlzIGludmFsaWQgb3IgZXh0ZW5zaW9uIGNhYmxlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIHpkZXRfY29tcGxldGU7Ci0JfQotCWlmICgoKnpsID09IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSB8fAotCSAgICAoKnpyID09IFRBU0hBX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSB8fAotCSAgICAoKCp6bCA8IFdDRF9NT05PX0hTX01JTl9USFIpICYmICgqenIgPiBXQ0RfTU9OT19IU19NSU5fVEhSKSkgfHwKLQkgICAgKCgqemwgPiBXQ0RfTU9OT19IU19NSU5fVEhSKSAmJiAoKnpyIDwgV0NEX01PTk9fSFNfTUlOX1RIUikpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogTW9ubyBwbHVnIHR5cGUgd2l0aCBvbmUgY2ggZmxvYXRpbmcgb3Igc2hvcnRlZCB0byBHTkRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX01PTk87Ci0JCWdvdG8gemRldF9jb21wbGV0ZTsKLQl9Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUl9BVEVTVCwgMHgwMiwgMHgwMik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHg0MCwgMHgwMSk7Ci0JaWYgKCp6bCA8IChUQVNIQV9aREVUX1ZBTF8zMi8xMDAwKSkKLQkJdGFzaGFfbWJoY196ZGV0X3JhbXAoY29kZWMsICZ6ZGV0X3BhcmFtWzBdLCAmejFMcywgTlVMTCwgZDEpOwotCWVsc2UKLQkJdGFzaGFfbWJoY196ZGV0X3JhbXAoY29kZWMsICZ6ZGV0X3BhcmFtWzFdLCAmejFMcywgTlVMTCwgZDEpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4NDAsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1JfQVRFU1QsIDB4MDIsIDB4MDApOwotCXoxTHMgLz0gMTAwMDsKLQl0YXNoYV93Y2RfbWJoY19xZnVzZV9jYWwoY29kZWMsICZ6MUxzLCAwKTsKLQkvKiBwYXJhbGxlbCBvZiBsZWZ0IFogYW5kIDkgb2htIHB1bGwgZG93biByZXNpc3RvciAqLwotCXpNb25vID0gKCgqemwpICogOSkgLyAoKCp6bCkgKyA5KTsKLQl6X2RpZmYxID0gKHoxTHMgPiB6TW9ubykgPyAoejFMcyAtIHpNb25vKSA6ICh6TW9ubyAtIHoxTHMpOwotCXpfZGlmZjIgPSAoKCp6bCkgPiB6MUxzKSA/ICgoKnpsKSAtIHoxTHMpIDogKHoxTHMgLSAoKnpsKSk7Ci0JaWYgKCh6X2RpZmYxICogKCp6bCArIHoxTHMpKSA+ICh6X2RpZmYyICogKHoxTHMgKyB6TW9ubykpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzdGVyZW8gcGx1ZyB0eXBlIGRldGVjdGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfU1RFUkVPOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBNT05PIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCW1iaGMtPmhwaF90eXBlID0gV0NEX01CSENfSFBIX01PTk87Ci0JfQotCi16ZGV0X2NvbXBsZXRlOgotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX01CSENfQlRONSwgcmVnMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19CVE42LCByZWcxKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX0JUTjcsIHJlZzIpOwotCS8qIFR1cm4gb24gMTAwayBwdWxsIGRvd24gb24gSFBITCAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsIDB4MDEsIDB4MDEpOwotCi0JLyogRm9yIE5PLWphY2ssIHJlLWVuYWJsZSBMX0RFVF9FTiBhZnRlciBaLWRldCBtZWFzdXJlbWVudHMgKi8KLQlpZiAobWJoYy0+aHBobF9zd2gpCi0JCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJICAgV0NEOTMzNV9BTkFfTUJIQ19NRUNILCAweDgwLCAweDgwKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19aREVUX0FOQV9DVEwsIHJlZzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfTUJIQ19DVExfMSwgcmVnMyk7Ci0JaWYgKGlzX2ZzbV9kaXNhYmxlKQotCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJCSAgIFdDRDkzMzVfQU5BX01CSENfRUxFQ1QsIDB4ODAsIDB4ODApOwotCWlmICh0YXNoYS0+emRldF9ncGlvX2NiICYmIGlzX2NoYW5nZSkKLQkJdGFzaGEtPnpkZXRfZ3Bpb19jYihjb2RlYywgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9tYmhjX2duZF9kZXRfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19NRUNILAotCQkJCSAgICAweDAyLCAweDAyKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUJIQ19NRUNILAotCQkJCSAgICAweDQwLCAweDQwKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsCi0JCQkJICAgIDB4NDAsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NQkhDX01FQ0gsCi0JCQkJICAgIDB4MDIsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfbWJoY19ocGhfcHVsbF9kb3duX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKGVuYWJsZSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLAotCQkJCSAgICAweDQwLCAweDQwKTsKLQkJaWYgKFRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLAotCQkJCQkgICAgMHgxMCwgMHgxMCk7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwKLQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwKLQkJCQkJICAgIDB4MTAsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfbWJoY19tb2lzdHVyZV9jb25maWcoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCi0JaWYgKG1iaGMtPm1vaXN0X3ZyZWYgPT0gVl9PRkYpCi0JCXJldHVybjsKLQotCS8qIERvbm90IGVuYWJsZSBtb2lzdHVyZSBkZXRlY3Rpb24gaWYgamFjayB0eXBlIGlzIE5DICovCi0JaWYgKCFtYmhjLT5ocGhsX3N3aCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGlzYWJsZSBtb2lzdHVyZSBkZXRlY3Rpb24gZm9yIE5DXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9NQkhDX0NUTF8yLAotCQkJICAgIDB4MEMsIG1iaGMtPm1vaXN0X3ZyZWYgPDwgMik7Ci0JdGFzaGFfbWJoY19ocGhfbF9wdWxsX3VwX2NvbnRyb2woY29kZWMsIG1iaGMtPm1vaXN0X2lyZWYpOwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV91cGRhdGVfYW5jX3N0YXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUsCi0JCQkJICAgaW50IGFuY19udW0pCi17Ci0JaWYgKGVuYWJsZSkKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArCi0JCQkJKDIwICogYW5jX251bSksIDB4MTAsIDB4MTApOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArCi0JCQkJKDIwICogYW5jX251bSksIDB4MTAsIDB4MDApOwotfQotCi1zdGF0aWMgYm9vbCB0YXNoYV9pc19hbmNfb24oc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWJvb2wgYW5jX29uID0gZmFsc2U7Ci0JdTE2IGFuY2wsIGFuY3I7Ci0KLQlhbmNsID0KLQkoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwKSkgJiAweDEwOwotCWFuY3IgPQotCShzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzApKSAmIDB4MTA7Ci0KLQlhbmNfb24gPSAhIShhbmNsIHwgYW5jcik7Ci0KLQlyZXR1cm4gYW5jX29uOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiIG1iaGNfY2IgPSB7Ci0JLnJlcXVlc3RfaXJxID0gdGFzaGFfbWJoY19yZXF1ZXN0X2lycSwKLQkuaXJxX2NvbnRyb2wgPSB0YXNoYV9tYmhjX2lycV9jb250cm9sLAotCS5mcmVlX2lycSA9IHRhc2hhX21iaGNfZnJlZV9pcnEsCi0JLmNsa19zZXR1cCA9IHRhc2hhX21iaGNfY2xrX3NldHVwLAotCS5tYXBfYnRuX2NvZGVfdG9fbnVtID0gdGFzaGFfbWJoY19idG5fdG9fbnVtLAotCS5lbmFibGVfbWJfc291cmNlID0gdGFzaGFfZW5hYmxlX2V4dF9tYl9zb3VyY2UsCi0JLm1iaGNfYmlhcyA9IHRhc2hhX21iaGNfbWJoY19iaWFzX2NvbnRyb2wsCi0JLnNldF9idG5fdGhyID0gdGFzaGFfbWJoY19wcm9ncmFtX2J0bl90aHIsCi0JLmxvY2tfc2xlZXAgPSB0YXNoYV9tYmhjX2xvY2tfc2xlZXAsCi0JLnJlZ2lzdGVyX25vdGlmaWVyID0gdGFzaGFfbWJoY19yZWdpc3Rlcl9ub3RpZmllciwKLQkubWljYmlhc19lbmFibGVfc3RhdHVzID0gdGFzaGFfbWJoY19taWNiX2VuX3N0YXR1cywKLQkuaHBoX3BhX29uX3N0YXR1cyA9IHRhc2hhX21iaGNfaHBoX3BhX29uX3N0YXR1cywKLQkuaHBoX3B1bGxfdXBfY29udHJvbCA9IHRhc2hhX21iaGNfaHBoX2xfcHVsbF91cF9jb250cm9sLAotCS5tYmhjX21pY2JpYXNfY29udHJvbCA9IHRhc2hhX21iaGNfcmVxdWVzdF9taWNiaWFzLAotCS5tYmhjX21pY2JfcmFtcF9jb250cm9sID0gdGFzaGFfbWJoY19taWNiX3JhbXBfY29udHJvbCwKLQkuZ2V0X2h3ZGVwX2Z3X2NhbCA9IHRhc2hhX2dldF9od2RlcF9md19jYWwsCi0JLm1iaGNfbWljYl9jdHJsX3Rocl9taWMgPSB0YXNoYV9tYmhjX21pY2JfY3RybF90aHJlc2hvbGRfbWljLAotCS5jb21wdXRlX2ltcGVkYW5jZSA9IHRhc2hhX3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlLAotCS5tYmhjX2duZF9kZXRfY3RybCA9IHRhc2hhX21iaGNfZ25kX2RldF9jdHJsLAotCS5ocGhfcHVsbF9kb3duX2N0cmwgPSB0YXNoYV9tYmhjX2hwaF9wdWxsX2Rvd25fY3RybCwKLQkubWJoY19tb2lzdHVyZV9jb25maWcgPSB0YXNoYV9tYmhjX21vaXN0dXJlX2NvbmZpZywKLQkudXBkYXRlX2FuY19zdGF0ZSA9IHRhc2hhX3VwZGF0ZV9hbmNfc3RhdGUsCi0JLmlzX2FuY19vbiA9IHRhc2hhX2lzX2FuY19vbiwKLX07Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZ2V0X2FuY19zbG90KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+YW5jX3Nsb3Q7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcHV0X2FuY19zbG90KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdGFzaGEtPmFuY19zbG90ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZ2V0X2FuY19mdW5jKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAodGFzaGEtPmFuY19mdW5jID09IHRydWUgPyAxIDogMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcHV0X2FuY19mdW5jKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPmNvZGVjX211dGV4KTsKLQl0YXNoYS0+YW5jX2Z1bmMgPSAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gZmFsc2UgOiB0cnVlKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBhbmNfZnVuYyAleCIsIF9fZnVuY19fLCB0YXNoYS0+YW5jX2Z1bmMpOwotCi0JaWYgKHRhc2hhLT5hbmNfZnVuYyA9PSB0cnVlKSB7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQxIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgSFBIUiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwgUEEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhMIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgRUFSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgRUFSIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgU1BLMSBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQyIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORU9VVDIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FT1VUMSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQxIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBIUiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQSEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUEhSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBITCBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVBUiBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkVBUiIpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQyIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQyIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQxIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQxIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwgUEEiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgRUFSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBTUEsxIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMSU5FT1VUMiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTElORU9VVDIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxJTkVPVVQxIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMSU5FT1VUMSBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBIUiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBITCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBIUiBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBITCBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiRUFSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFQVIiKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2dldF9jbGttb2RlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRhc2hhLT5jbGtfbW9kZTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogY2xrX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywgdGFzaGEtPmNsa19tb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3B1dF9jbGttb2RlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdGFzaGEtPmNsa19tb2RlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogY2xrX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywgdGFzaGEtPmNsa19tb2RlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCS8qIElJUiBmaWx0ZXIgYmFuZCByZWdpc3RlcnMgYXJlIGF0IGludGVnZXIgbXVsdGlwbGVzIG9mIDE2ICovCi0JdTE2IGlpcl9yZWcgPSBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DVEwgKyAxNiAqIGlpcl9pZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IChzbmRfc29jX3JlYWQoY29kZWMsIGlpcl9yZWcpICYKLQkJCQkJICAgICgxIDw8IGJhbmRfaWR4KSkgIT0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCi0JCWlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2hwaF9pbXBlZGFuY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVpbnQzMl90IHpsLCB6cjsKLQlib29sIGhwaHI7Ci0Jc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICptYzsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JbWMgPSAoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKLQlocGhyID0gbWMtPnNoaWZ0OwotCXdjZF9tYmhjX2dldF9pbXBlZGFuY2UoJnByaXYtPm1iaGMsICZ6bCwgJnpyKTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogemw9JXUob2htcyksIHpyPSV1KG9obXMpXG4iLCBfX2Z1bmNfXywgemwsIHpyKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhwaHIgPyB6ciA6IHpsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkhQSEwgSW1wZWRhbmNlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCi0JCSAgICAgICB0YXNoYV9ocGhfaW1wZWRhbmNlX2dldCwgTlVMTCksCi0JU09DX1NJTkdMRV9FWFQoIkhQSFIgSW1wZWRhbmNlIiwgMCwgMSwgVUlOVF9NQVgsIDAsCi0JCSAgICAgICB0YXNoYV9ocGhfaW1wZWRhbmNlX2dldCwgTlVMTCksCi19OwotCi1zdGF0aWMgaW50IHRhc2hhX2dldF9ocGhfdHlwZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2RfbWJoYyAqbWJoYzsKLQotCWlmICghcHJpdikgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd2NkOTMzNSBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW1iaGMgPSAmcHJpdi0+bWJoYzsKLQlpZiAoIW1iaGMpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHUzMikgbWJoYy0+aHBoX3R5cGU7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGhwaF90eXBlID0gJXVcbiIsIF9fZnVuY19fLCBtYmhjLT5ocGhfdHlwZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhwaF90eXBlX2RldGVjdF9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJIUEggVHlwZSIsIDAsIDAsIFVJTlRfTUFYLCAwLAotCQkgICAgICAgdGFzaGFfZ2V0X2hwaF90eXBlLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBpbnQgdGFzaGFfdmlfZmVlZF9taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhc2hhX3AtPnZpX2ZlZWRfdmFsdWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV92aV9mZWVkX21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IHRhc2hhX3AtPndjZDl4eHg7Ci0Jc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICptaXhlciA9Ci0JCSgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOwotCXUzMiBkYWlfaWQgPSB3aWRnZXQtPnNoaWZ0OwotCXUzMiBwb3J0X2lkID0gbWl4ZXItPnNoaWZ0OwotCXUzMiBlbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlbmFibGU6ICVkLCBwb3J0X2lkOiVkLCBkYWlfaWQ6ICVkXG4iLAotCQlfX2Z1bmNfXywgZW5hYmxlLCBwb3J0X2lkLCBkYWlfaWQpOwotCi0JdGFzaGFfcC0+dmlfZmVlZF92YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JbXV0ZXhfbG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOwotCWlmIChlbmFibGUpIHsKLQkJaWYgKHBvcnRfaWQgPT0gVEFTSEFfVFgxNCAmJiAhdGVzdF9iaXQoVklfU0VOU0VfMSwKLQkJCQkJCSZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKLQkJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnR4X2Noc1tUQVNIQV9UWDE0XS5saXN0LAotCQkJCQkmdGFzaGFfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKLQkJCXNldF9iaXQoVklfU0VOU0VfMSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlpZiAocG9ydF9pZCA9PSBUQVNIQV9UWDE1ICYmICF0ZXN0X2JpdChWSV9TRU5TRV8yLAotCQkJCQkJJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgewotCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW1RBU0hBX1RYMTVdLmxpc3QsCi0JCQkJCSZ0YXNoYV9wLT5kYWlbZGFpX2lkXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQkJc2V0X2JpdChWSV9TRU5TRV8yLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBvcnRfaWQgPT0gVEFTSEFfVFgxNCAmJiB0ZXN0X2JpdChWSV9TRU5TRV8xLAotCQkJCQkmdGFzaGFfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZjb3JlLT50eF9jaHNbVEFTSEFfVFgxNF0ubGlzdCk7Ci0JCQljbGVhcl9iaXQoVklfU0VOU0VfMSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlpZiAocG9ydF9pZCA9PSBUQVNIQV9UWDE1ICYmIHRlc3RfYml0KFZJX1NFTlNFXzIsCi0JCQkJCSZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKLQkJCWxpc3RfZGVsX2luaXQoJmNvcmUtPnR4X2Noc1tUQVNIQV9UWDE1XS5saXN0KTsKLQkJCWNsZWFyX2JpdChWSV9TRU5TRV8yLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotCi0vKiB2aXJ0dWFsIHBvcnQgZW50cmllcyAqLwotc3RhdGljIGludCBzbGltX3R4X21peGVyX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhc2hhX3AtPnR4X3BvcnRfdmFsdWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV90eF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0Jc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICptaXhlciA9Ci0JCSgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOwotCXUzMiBkYWlfaWQgPSB3aWRnZXQtPnNoaWZ0OwotCXUzMiBwb3J0X2lkID0gbWl4ZXItPnNoaWZ0OwotCXUzMiBlbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1MzIgdnRhYmxlOwotCi0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWUgJXMgY25hbWUgJXMgdmFsdWUgJXUgc2hpZnQgJWQgaXRlbSAlbGRcbiIsCi0JCSAgX19mdW5jX18sCi0JCXdpZGdldC0+bmFtZSwgdWNvbnRyb2wtPmlkLm5hbWUsIHRhc2hhX3AtPnR4X3BvcnRfdmFsdWUsCi0JCXdpZGdldC0+c2hpZnQsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCW11dGV4X2xvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKLQotCWlmICh0YXNoYV9wLT5pbnRmX3R5cGUgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKSB7Ci0JCWlmIChkYWlfaWQgIT0gQUlGMV9DQVApIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIEFJRiBmb3IgSTJDIG1vZGVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl2dGFibGUgPSB2cG9ydF9zbGltX2NoZWNrX3RhYmxlW2RhaV9pZF07Ci0JfSBlbHNlIHsKLQkJaWYgKGRhaV9pZCA+PSBBUlJBWV9TSVpFKHZwb3J0X2kyc19jaGVja190YWJsZSkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBkYWlfaWQ6ICVkLCBvdXQgb2YgYm91bmRzXG4iLAotCQkJCV9fZnVuY19fLCBkYWlfaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJdnRhYmxlID0gdnBvcnRfaTJzX2NoZWNrX3RhYmxlW2RhaV9pZF07Ci0JfQotCXN3aXRjaCAoZGFpX2lkKSB7Ci0JY2FzZSBBSUYxX0NBUDoKLQljYXNlIEFJRjJfQ0FQOgotCWNhc2UgQUlGM19DQVA6Ci0JCS8qIG9ubHkgYWRkIHRvIHRoZSBsaXN0IGlmIHZhbHVlIG5vdCBzZXQgKi8KLQkJaWYgKGVuYWJsZSAmJiAhKHRhc2hhX3AtPnR4X3BvcnRfdmFsdWUgJiAxIDw8IHBvcnRfaWQpKSB7Ci0KLQkJCWlmICh3Y2Q5eHh4X3R4X3Zwb3J0X3ZhbGlkYXRpb24odnRhYmxlLCBwb3J0X2lkLAotCQkJCQl0YXNoYV9wLT5kYWksIE5VTV9DT0RFQ19EQUlTKSkgewotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBUWCV1IGlzIHVzZWQgYnkgb3RoZXIgdmlydHVhbCBwb3J0XG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQl0YXNoYV9wLT50eF9wb3J0X3ZhbHVlIHw9IDEgPDwgcG9ydF9pZDsKLQkJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnR4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhc2hhX3AtPmRhaVtkYWlfaWRdLndjZDl4eHhfY2hfbGlzdAotCQkJCQkgICAgICApOwotCQl9IGVsc2UgaWYgKCFlbmFibGUgJiYgKHRhc2hhX3AtPnR4X3BvcnRfdmFsdWUgJgotCQkJCQkxIDw8IHBvcnRfaWQpKSB7Ci0JCQl0YXNoYV9wLT50eF9wb3J0X3ZhbHVlICY9IH4oMSA8PCBwb3J0X2lkKTsKLQkJCWxpc3RfZGVsX2luaXQoJmNvcmUtPnR4X2Noc1twb3J0X2lkXS5saXN0KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChlbmFibGUpCi0JCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgcG9ydCBpcyB1c2VkIGJ5XG4iCi0JCQkJCSJ0aGlzIHZpcnR1YWwgcG9ydFxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJZWxzZQotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBUWCV1IHBvcnQgaXMgbm90IHVzZWQgYnlcbiIKLQkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQkvKiBhdm9pZCB1cGRhdGUgcG93ZXIgZnVuY3Rpb24gKi8KLQkJCW11dGV4X3VubG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBSUY0X01BRF9UWDoKLQljYXNlIEFJRjVfQ1BFX1RYOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIlVua25vd24gQUlGICVkXG4iLCBkYWlfaWQpOwotCQltdXRleF91bmxvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogbmFtZSAlcyBzbmFtZSAlcyB1cGRhdGVkIHZhbHVlICV1IHNoaWZ0ICVkXG4iLCBfX2Z1bmNfXywKLQkJd2lkZ2V0LT5uYW1lLCB3aWRnZXQtPnNuYW1lLCB0YXNoYV9wLT50eF9wb3J0X3ZhbHVlLAotCQl3aWRnZXQtPnNoaWZ0KTsKLQotCW11dGV4X3VubG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCB1cGRhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9tdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJCXRhc2hhX3AtPnJ4X3BvcnRfdmFsdWVbd2lkZ2V0LT5zaGlmdF07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQUlGMV9QQiIsICJBSUYyX1BCIiwgIkFJRjNfUEIiLCAiQUlGNF9QQiIsICJBSUZfTUlYMV9QQiIKLX07Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9tdXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHJ4X3BvcnRfdmFsdWU7Ci0JdTMyIHBvcnRfaWQgPSB3aWRnZXQtPnNoaWZ0OwotCi0JdGFzaGFfcC0+cnhfcG9ydF92YWx1ZVtwb3J0X2lkXSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JcnhfcG9ydF92YWx1ZSA9IHRhc2hhX3AtPnJ4X3BvcnRfdmFsdWVbcG9ydF9pZF07Ci0KLQlwcl9kZWJ1ZygiJXM6IHduYW1lICVzIGNuYW1lICVzIHZhbHVlICV1IHNoaWZ0ICVkIGl0ZW0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJd2lkZ2V0LT5uYW1lLCB1Y29udHJvbC0+aWQubmFtZSwgcnhfcG9ydF92YWx1ZSwKLQkJd2lkZ2V0LT5zaGlmdCwgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JbXV0ZXhfbG9jaygmdGFzaGFfcC0+Y29kZWNfbXV0ZXgpOwotCi0JaWYgKHRhc2hhX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKLQkJaWYgKHJ4X3BvcnRfdmFsdWUgPiAyKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBBSUYgZm9yIEkyQyBtb2RlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCS8qIHZhbHVlIG5lZWQgdG8gbWF0Y2ggdGhlIFZpcnR1YWwgcG9ydCBhbmQgQUlGIG51bWJlciAqLwotCXN3aXRjaCAocnhfcG9ydF92YWx1ZSkgewotCWNhc2UgMDoKLQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiwKLQkJCSZ0YXNoYV9wLT5kYWlbQUlGMV9QQl0ud2NkOXh4eF9jaF9saXN0KSkgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYJXUgaXMgdXNlZCBieSBjdXJyZW50IHJlcXVlc3RpbmcgQUlGX1BCIGl0c2VsZlxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQlnb3RvIHJ0bjsKLQkJfQotCQlsaXN0X2FkZF90YWlsKCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCwKLQkJCSAgICAgICZ0YXNoYV9wLT5kYWlbQUlGMV9QQl0ud2NkOXh4eF9jaF9saXN0KTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAod2NkOXh4eF9yeF92cG9ydF92YWxpZGF0aW9uKHBvcnRfaWQgKwotCQkJVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIsCi0JCQkmdGFzaGFfcC0+ZGFpW0FJRjJfUEJdLndjZDl4eHhfY2hfbGlzdCkpIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWCV1IGlzIHVzZWQgYnkgY3VycmVudCByZXF1ZXN0aW5nIEFJRl9QQiBpdHNlbGZcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJZ290byBydG47Ci0JCX0KLQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QsCi0JCQkgICAgICAmdGFzaGFfcC0+ZGFpW0FJRjJfUEJdLndjZDl4eHhfY2hfbGlzdCk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJaWYgKHdjZDl4eHhfcnhfdnBvcnRfdmFsaWRhdGlvbihwb3J0X2lkICsKLQkJCVRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAotCQkJJnRhc2hhX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhc2hhX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUiwKLQkJCSZ0YXNoYV9wLT5kYWlbQUlGNF9QQl0ud2NkOXh4eF9jaF9saXN0KSkgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFJYJXUgaXMgdXNlZCBieSBjdXJyZW50IHJlcXVlc3RpbmcgQUlGX1BCIGl0c2VsZlxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQlnb3RvIHJ0bjsKLQkJfQotCQlsaXN0X2FkZF90YWlsKCZjb3JlLT5yeF9jaHNbcG9ydF9pZF0ubGlzdCwKLQkJCSAgICAgICZ0YXNoYV9wLT5kYWlbQUlGNF9QQl0ud2NkOXh4eF9jaF9saXN0KTsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlpZiAod2NkOXh4eF9yeF92cG9ydF92YWxpZGF0aW9uKHBvcnRfaWQgKwotCQkJVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIsCi0JCQkmdGFzaGFfcC0+ZGFpW0FJRl9NSVgxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhc2hhX3AtPmRhaVtBSUZfTUlYMV9QQl0ud2NkOXh4eF9jaF9saXN0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJVbmtub3duIEFJRiAlZFxuIiwgcnhfcG9ydF92YWx1ZSk7Ci0JCWdvdG8gZXJyOwotCX0KLXJ0bjoKLQltdXRleF91bmxvY2soJnRhc2hhX3AtPmNvZGVjX211dGV4KTsKLQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAotCQkJCQlyeF9wb3J0X3ZhbHVlLCBlLCB1cGRhdGUpOwotCi0JcmV0dXJuIDA7Ci1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYV9wLT5jb2RlY19tdXRleCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2xpbV9yeF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHNsaW1fcnhfbXV4X3RleHQpLCBzbGltX3J4X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1fcnhfbXV4W1RBU0hBX1JYX01BWF0gPSB7Ci0JU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlgwIE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCi0JCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKLQlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDEgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKLQkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAotCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYMiBNdXgiLCBzbGltX3J4X211eF9lbnVtLAotCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCi0JU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlgzIE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCi0JCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKLQlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDQgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKLQkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAotCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNIFJYNSBNdXgiLCBzbGltX3J4X211eF9lbnVtLAotCQkJICBzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCksCi0JU09DX0RBUE1fRU5VTV9FWFQoIlNMSU0gUlg2IE11eCIsIHNsaW1fcnhfbXV4X2VudW0sCi0JCQkgIHNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KSwKLQlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTSBSWDcgTXV4Iiwgc2xpbV9yeF9tdXhfZW51bSwKLQkJCSAgc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfdmlfbWl4ZXJbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU1BLUl9WSV8xIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDE0LCAxLCAwLAotCQkJdGFzaGFfdmlfZmVlZF9taXhlcl9nZXQsIHRhc2hhX3ZpX2ZlZWRfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU1BLUl9WSV8yIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDE1LCAxLCAwLAotCQkJdGFzaGFfdmlfZmVlZF9taXhlcl9nZXQsIHRhc2hhX3ZpX2ZlZWRfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYxX2NhcF9taXhlcltdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgyIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDIsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDQiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg1IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDUsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg2LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDciLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg4IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDgsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg5LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDExLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYyX2NhcF9taXhlcltdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgyIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDIsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDQiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg1IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDUsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg2LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDciLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg4IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDgsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg5LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDExLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYzX2NhcF9taXhlcltdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgyIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDIsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDQiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg1IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDUsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg2LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDciLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg4IiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDgsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg5LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEwIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDExLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEzIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWY0X21hZF9taXhlcltdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTIiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTIsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxX3NwbGluZV9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJIUEhMIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQyX3NwbGluZV9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJIUEhSIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQzX3NwbGluZV9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJMTzEgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIkxPMiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV9zcGxpbmVfbWl4X3N3aXRjaFtdID0gewotCVNPQ19EQVBNX1NJTkdMRSgiTE8zIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2X3NwbGluZV9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJMTzQgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfc3BsaW5lX21peF9zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIlNQS1JMIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ4X3NwbGluZV9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJTUEtSUiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV92YmF0X21peF9zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIkxPMyBWQkFUIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2X3ZiYXRfbWl4X3N3aXRjaFtdID0gewotCVNPQ19EQVBNX1NJTkdMRSgiTE80IFZCQVQgRW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfdmJhdF9taXhfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJTUEtSTCBWQkFUIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCkKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ4X3ZiYXRfbWl4X3N3aXRjaFtdID0gewotCVNPQ19EQVBNX1NJTkdMRSgiU1BLUlIgVkJBVCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3BlX2luX21peF9zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIk1BRF9CWVBBU1MiLCBTTkRfU09DX05PUE0sIDAsIDEsIDApCi19OwotCi0KLQotc3RhdGljIGludCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlcigKLQkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0JaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlib29sIGlpcl9iYW5kX2VuX3N0YXR1czsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1MTYgaWlyX3JlZyA9IFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKLQotCS8qIE1hc2sgZmlyc3QgNSBiaXRzLCA2LTggYXJlIHJlc2VydmVkICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaWlyX3JlZywgKDEgPDwgYmFuZF9pZHgpLAotCQkJICAgICh2YWx1ZSA8PCBiYW5kX2lkeCkpOwotCi0JaWlyX2JhbmRfZW5fc3RhdHVzID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGlpcl9yZWcpICYKLQkJCSAgICAgICgxIDw8IGJhbmRfaWR4KSkgIT0gMCk7Ci0JcHJfZGVidWcoIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGVuYWJsZSAlZFxuIiwgX19mdW5jX18sCi0JCWlpcl9pZHgsIGJhbmRfaWR4LCBpaXJfYmFuZF9lbl9zdGF0dXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgZ2V0X2lpcl9iYW5kX2NvZWZmKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQlpbnQgaWlyX2lkeCwgaW50IGJhbmRfaWR4LAotCQkJCWludCBjb2VmZl9pZHgpCi17Ci0JdWludDMyX3QgdmFsdWUgPSAwOwotCi0JLyogQWRkcmVzcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBpZiByZWFkaW5nICovCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQotCQkqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7Ci0KLQl2YWx1ZSB8PSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArIDE2ICogaWlyX2lkeCkpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQotCQkqIHNpemVvZih1aW50MzJfdCkgKyAxKSAmIDB4N0YpOwotCi0JdmFsdWUgfD0gKHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCSAgICAgICAoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKwotCQkJCTE2ICogaWlyX2lkeCkpIDw8IDgpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQotCQkqIHNpemVvZih1aW50MzJfdCkgKyAyKSAmIDB4N0YpOwotCi0JdmFsdWUgfD0gKHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCSAgICAgICAoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKwotCQkJCTE2ICogaWlyX2lkeCkpIDw8IDE2KTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCArIDE2ICogaWlyX2lkeCksCi0JCSgoYmFuZF9pZHggKiBCQU5EX01BWCArIGNvZWZmX2lkeCkKLQkJKiBzaXplb2YodWludDMyX3QpICsgMykgJiAweDdGKTsKLQotCS8qIE1hc2sgYml0cyB0b3AgMiBiaXRzIHNpbmNlIHRoZXkgYXJlIHJlc2VydmVkICovCi0JdmFsdWUgfD0gKChzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsKLQkJCQkgMTYgKiBpaXJfaWR4KSkgJiAweDNGKSA8PCAyNCk7Ci0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAwKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDEpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0KLQkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMik7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAzKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSA9Ci0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDQpOwotCi0JcHJfZGVidWcoIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCi0JCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCWludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCi0JCQkJdWludDMyX3QgdmFsdWUpCi17Ci0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKHZhbHVlICYgMHhGRikpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKHZhbHVlID4+IDgpICYgMHhGRik7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0KLQkvKiBNYXNrIHRvcCAyIGJpdHMsIDctOCBhcmUgcmVzZXJ2ZWQgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gMjQpICYgMHgzRik7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2VuYWJsZV9pbnRfcG9ydChzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAotCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCWludCBwb3J0X251bSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKLQl1OCB2YWwgPSAwOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wOwotCi0JaWYgKCFkYWkgfHwgIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCWlmIChjaC0+cG9ydCA+PSBUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUikgewotCQkJcG9ydF9udW0gPSBjaC0+cG9ydCAtIFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSOwotCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfRU4wICsgKHBvcnRfbnVtIC8gOCk7Ci0JCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXNoYV9wLT53Y2Q5eHh4LAotCQkJCXJlZyk7Ci0JCQlpZiAoISh2YWwgJiBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKSkpIHsKLQkJCQl2YWwgfD0gQllURV9CSVRfTUFTSyhwb3J0X251bSk7Ci0JCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKAotCQkJCQl0YXNoYV9wLT53Y2Q5eHh4LCByZWcsIHZhbCk7Ci0JCQkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoCi0JCQkJCXRhc2hhX3AtPndjZDl4eHgsIHJlZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwb3J0X251bSA9IGNoLT5wb3J0OwotCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsgKHBvcnRfbnVtIC8gOCk7Ci0JCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXNoYV9wLT53Y2Q5eHh4LAotCQkJCXJlZyk7Ci0JCQlpZiAoISh2YWwgJiBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKSkpIHsKLQkJCQl2YWwgfD0gQllURV9CSVRfTUFTSyhwb3J0X251bSk7Ci0JCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHRhc2hhX3AtPndjZDl4eHgsCi0JCQkJCXJlZywgdmFsKTsKLQkJCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKLQkJCQkJdGFzaGFfcC0+d2NkOXh4eCwgcmVnKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaSwKLQkJCQkJICBib29sIHVwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKLQotCWlmICh1cCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJCXJldCA9IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQoY2gtPmNoX251bSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IEludmFsaWQgc2xhdmUgcG9ydCBJRDogJWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQl9IGVsc2UgewotCQkJCXNldF9iaXQocmV0LCAmZGFpLT5jaF9tYXNrKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChkYWktPmRhaV93YWl0LCAoZGFpLT5jaF9tYXNrID09IDApLAotCQkJCQkgbXNlY3NfdG9famlmZmllcygKLQkJCQkJCVRBU0hBX1NMSU1fQ0xPU0VfVElNRU9VVCkpOwotCQlpZiAoIXJldCkgewotCQkJcHJfZXJyKCIlczogU2xpbSBjbG9zZSB0eC9yeCB3YWl0IHRpbWVvdXQsIGNoX21hc2s6MHglbHhcbiIsCi0JCQkJX19mdW5jX18sIGRhaS0+Y2hfbWFzayk7Ci0JCQlyZXQgPSAtRVRJTUVET1VUOwotCQl9IGVsc2UgewotCQkJcmV0ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOwotCi0JY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50IGNhbGxlZCEgY29kZWMgbmFtZSAlcyBudW1fZGFpICVkXG4iCi0JCSJzdHJlYW0gbmFtZSAlcyBldmVudCAlZFxuIiwKLQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSwKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSwgZXZlbnQpOwotCi0JLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCi0JaWYgKHRhc2hhX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpCi0JCXJldHVybiAwOwotCi0JZGFpID0gJnRhc2hhX3AtPmRhaVt3LT5zaGlmdF07Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHctPm5hbWUgJXMgdy0+c2hpZnQgJWQgZXZlbnQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgdy0+bmFtZSwgdy0+c2hpZnQsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOwotCQl0YXNoYV9jb2RlY19lbmFibGVfaW50X3BvcnQoZGFpLCBjb2RlYyk7Ci0JCSh2b2lkKSB0YXNoYV9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCB0cnVlKTsKLQkJcmV0ID0gd2NkOXh4eF9jZmdfc2xpbV9zY2hfcngoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkgICAgICBkYWktPnJhdGUsIGRhaS0+Yml0X3dpZHRoLAotCQkJCQkgICAgICAmZGFpLT5ncnBoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKLQkJdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoY29kZWMsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJcmV0ID0gd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkgICAgICBkYWktPmdycGgpOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogRGlzY29ubmVjdCBSWCBwb3J0LCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JCWlmICghZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSkKLQkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKLQkJZWxzZQotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCSIlczogYnVzIGluIHJlY292ZXJ5IHNraXAgZW5hYmxlIHNsaW1fY2htYXNrIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IHdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfcngoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkJZGFpLT5ncnBoKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW12aV9mZWVkYmFjayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gTlVMTDsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaSA9IE5VTEw7Ci0KLQlpZiAoIXcpIHsKLQkJcHJfZXJyKCIlcyBpbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvcmUgPSB0YXNoYV9wLT53Y2Q5eHh4OwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm51bV9kYWksIHctPnNuYW1lKTsKLQotCS8qIEV4ZWN1dGUgdGhlIGNhbGxiYWNrIG9ubHkgaWYgaW50ZXJmYWNlIHR5cGUgaXMgc2xpbWJ1cyAqLwotCWlmICh0YXNoYV9wLT5pbnRmX3R5cGUgIT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIEludGVyZmFjZSBpcyBub3QgY29ycmVjdCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMoKTogdy0+bmFtZSAlcyBldmVudCAlZCB3LT5zaGlmdCAlZFxuIiwKLQkJX19mdW5jX18sIHctPm5hbWUsIGV2ZW50LCB3LT5zaGlmdCk7Ci0JaWYgKHctPnNoaWZ0ICE9IEFJRjRfVklGRUVEKSB7Ci0JCXByX2VycigiJXMgRXJyb3IgaW4gZW5hYmxpbmcgdGhlIHR4IHBhdGhcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfdmk7Ci0JfQotCWRhaSA9ICZ0YXNoYV9wLT5kYWlbdy0+c2hpZnRdOwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzEsICZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMSBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkvKiBFbmFibGUgViZJIHNlbnNpbmcgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwgMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCi0JCQkJMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsIDB4MTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKLQkJCQkweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MDApOwotCQl9Ci0JCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8yLCAmdGFzaGFfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHNwa3IyIGVuYWJsZWRcbiIsIF9fZnVuY19fKTsKLQkJCS8qIEVuYWJsZSBWJkkgc2Vuc2luZyAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDIwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLAotCQkJCTB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwKLQkJCQkweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgwMCk7Ci0JCX0KLQkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOwotCQl0YXNoYV9jb2RlY19lbmFibGVfaW50X3BvcnQoZGFpLCBjb2RlYyk7Ci0JCSh2b2lkKSB0YXNoYV9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCB0cnVlKTsKLQkJcmV0ID0gd2NkOXh4eF9jZmdfc2xpbV9zY2hfdHgoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkgICAgICBkYWktPnJhdGUsIGRhaS0+Yml0X3dpZHRoLAotCQkJCQkgICAgICAmZGFpLT5ncnBoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldCA9IHdjZDl4eHhfY2xvc2Vfc2xpbV9zY2hfdHgoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkJZGFpLT5ncnBoKTsKLQkJaWYgKHJldCkKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIGVycm9yIGluIGNsb3NlX3NsaW1fc2NoX3R4ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQlpZiAoIWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkpCi0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlyZXQgPSB3Y2Q5eHh4X2Rpc2Nvbm5lY3RfcG9ydChjb3JlLAotCQkJCSZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQlkYWktPmdycGgpOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc2Nvbm5lY3QgVFggcG9ydCwgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCX0KLQkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzEsICZ0YXNoYV9wLT5zdGF0dXNfbWFzaykpIHsKLQkJCS8qIERpc2FibGUgViZJIHNlbnNpbmcgKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMSBkaXNhYmxlZFxuIiwgX19mdW5jX18pOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLCAweDIwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKLQkJCQkweDAwKTsKLQkJfQotCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMiwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkgewotCQkJLyogRGlzYWJsZSBWJkkgc2Vuc2luZyAqLwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNwa3IyIGRpc2FibGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDIwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLW91dF92aToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogX190YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4OiBFbmFibGUgdGhlIHNsaW1idXMgc2xhdmUgcG9ydAotICoJCQkJIGZvciBUWCBwYXRoCi0gKiBAY29kZWM6IEhhbmRsZSB0byB0aGUgY29kZWMgZm9yIHdoaWNoIHRoZSBzbGF2ZSBwb3J0IGlzIHRvIGJlCi0gKgkgICBlbmFibGVkLgotICogQGRhaV9kYXRhOiBUaGUgZGFpIHNwZWNpZmljIGRhdGEgZm9yIGRhaSB3aGljaCBpcyBlbmFibGVkLgotICovCi1zdGF0aWMgaW50IF9fdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCWludCBldmVudCwgc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JLyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgb25seSBpZiBpbnRlcmZhY2UgdHlwZSBpcyBzbGltYnVzICovCi0JaWYgKHRhc2hhX3AtPmludGZfdHlwZSAhPSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpCi0JCXJldHVybiAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0JY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5ID0gZmFsc2U7Ci0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRfcG9ydChkYWksIGNvZGVjKTsKLQkJKHZvaWQpIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIHRydWUpOwotCQlyZXQgPSB3Y2Q5eHh4X2NmZ19zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCi0JCQkJCSAgICAgIGRhaS0+cmF0ZSwgZGFpLT5iaXRfd2lkdGgsCi0JCQkJCSAgICAgICZkYWktPmdycGgpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJcmV0ID0gd2NkOXh4eF9jbG9zZV9zbGltX3NjaF90eChjb3JlLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCi0JCQkJCQlkYWktPmdycGgpOwotCQlpZiAoIWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkpCi0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlyZXQgPSB3Y2Q5eHh4X2Rpc2Nvbm5lY3RfcG9ydChjb3JlLAotCQkJCQkJICAgICAgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkJICAgICAgZGFpLT5ncnBoKTsKLQkJCXByX2RlYnVnKCIlczogRGlzY29ubmVjdCBUWCBwb3J0LCByZXQgPSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHJldCk7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IHctPm5hbWUgJXMsIHctPnNoaWZ0ID0gJWQsIG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCV9fZnVuY19fLCB3LT5uYW1lLCB3LT5zaGlmdCwKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSk7Ci0KLQlkYWkgPSAmdGFzaGFfcC0+ZGFpW3ctPnNoaWZ0XTsKLQlyZXR1cm4gX190YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4KGNvZGVjLCBldmVudCwgZGFpKTsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfY3BlX3BwX3NldF9jZmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOwotCXU4IGJpdF93aWR0aCwgcmF0ZSwgYnVmX3BlcmlvZDsKLQotCWRhaSA9ICZ0YXNoYV9wLT5kYWlbQUlGNF9NQURfVFhdOwotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJc3dpdGNoIChkYWktPmJpdF93aWR0aCkgewotCQljYXNlIDMyOgotCQkJYml0X3dpZHRoID0gMHhGOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjQ6Ci0JCQliaXRfd2lkdGggPSAweEU7Ci0JCQlicmVhazsKLQkJY2FzZSAyMDoKLQkJCWJpdF93aWR0aCA9IDB4RDsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQlkZWZhdWx0OgotCQkJYml0X3dpZHRoID0gMHgwOwotCQkJYnJlYWs7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQ0ZHLCAweDBGLAotCQkJCSAgICBiaXRfd2lkdGgpOwotCi0JCXN3aXRjaCAoZGFpLT5yYXRlKSB7Ci0JCWNhc2UgMzg0MDAwOgotCQkJcmF0ZSA9IDB4MzA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOTIwMDA6Ci0JCQlyYXRlID0gMHgyMDsKLQkJCWJyZWFrOwotCQljYXNlIDQ4MDAwOgotCQkJcmF0ZSA9IDB4MTA7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjAwMDoKLQkJZGVmYXVsdDoKLQkJCXJhdGUgPSAweDAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfVFhfUFBfQ0ZHLCAweDcwLAotCQkJCSAgICByYXRlKTsKLQotCQlidWZfcGVyaW9kID0gKGRhaS0+cmF0ZSAqIChkYWktPmJpdF93aWR0aC84KSkgLyAoMTYqMTAwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9ELAotCQkJCSAgICAweEZGLCBidWZfcGVyaW9kKTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFBQIGJ1ZmZlciBwZXJpb2Q9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYnVmX3BlcmlvZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0NGRywgMHgzQyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1RYX1BQX0JVRl9JTlRfUEVSSU9ELCAweDYwKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiB0YXNoYV9jb2RlY19nZXRfbWFkX3BvcnRfaWQ6IENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gKgl0byBnZXQgdGhlIHBvcnQgSUQgZm9yIE1BRC4KLSAqIEBjb2RlYzogSGFuZGxlIHRvIHRoZSBjb2RlYwotICogQHBvcnRfaWQ6IGNwZSBwb3J0X2lkIG5lZWRzIHRvIGVuYWJsZQotICovCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2dldF9tYWRfcG9ydF9pZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIHUxNiAqcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKLQotCWlmICghcG9ydF9pZCB8fCAhY29kZWMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWlmICghdGFzaGFfcCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYWkgPSAmdGFzaGFfcC0+ZGFpW0FJRjRfTUFEX1RYXTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNoLT5wb3J0ID09IFRBU0hBX1RYMTIpCi0JCQkqcG9ydF9pZCA9IFdDRF9DUEVfQUZFX09VVF9QT1JUXzI7Ci0JCWVsc2UgaWYgKGNoLT5wb3J0ID09IFRBU0hBX1RYMTMpCi0JCQkqcG9ydF9pZCA9IFdDRF9DUEVfQUZFX09VVF9QT1JUXzQ7Ci0JCWVsc2UgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGludmFsaWQgbWFkX3BvcnQgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGNoLT5wb3J0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBwb3J0X2lkID0gJWRcbiIsIF9fZnVuY19fLCAqcG9ydF9pZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHhfbWFkOiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZAotICoJdG8gc2V0dXAgdGhlIHNsYXZlIHBvcnQgZm9yIE1BRC4KLSAqIEBjb2RlYzogSGFuZGxlIHRvIHRoZSBjb2RlYwotICogQGV2ZW50OiBJbmRpY2F0ZXMgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2xhdmUgcG9ydAotICovCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHhfbWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIHU4IGV2ZW50KQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7Ci0JaW50IGRhcG1fZXZlbnQgPSBTTkRfU09DX0RBUE1fUE9TVF9QTVU7Ci0JdTE2IHBvcnQgPSAwOwotCWludCByZXQgPSAwOwotCi0JZGFpID0gJnRhc2hhX3AtPmRhaVtBSUY0X01BRF9UWF07Ci0KLQlpZiAoZXZlbnQgPT0gMCkKLQkJZGFwbV9ldmVudCA9IFNORF9TT0NfREFQTV9QT1NUX1BNRDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiBtYWRfY2hhbm5lbCwgZXZlbnQgPSAweCV4XG4iLAotCQkgX19mdW5jX18sIGV2ZW50KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWFkX3BvcnQgPSAlZCwgZXZlbnQgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGNoLT5wb3J0LCBldmVudCk7Ci0JCWlmIChjaC0+cG9ydCA9PSBUQVNIQV9UWDEzKSB7Ci0JCQl0YXNoYV9jb2RlY19jcGVfcHBfc2V0X2NmZyhjb2RlYywgZGFwbV9ldmVudCk7Ci0JCQlwb3J0ID0gVEFTSEFfVFgxMzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0ID0gX190YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4KGNvZGVjLCBkYXBtX2V2ZW50LCBkYWkpOwotCi0JaWYgKHBvcnQgPT0gVEFTSEFfVFgxMykgewotCQlzd2l0Y2ggKGRhcG1fZXZlbnQpIHsKLQkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sCi0JCQkJMHgyMCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLAotCQkJCTB4MDMsIDB4MDIpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfQ0ZHLAotCQkJCQkgICAgMHg4MCwgMHg4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sCi0JCQkJMHgyMCwgMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLAotCQkJCTB4MDMsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfQ0ZHLAotCQkJCQkgICAgMHg4MCwgMHgwMCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGlpcl9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JLyoKLQkgKiBNYXNrIHRvcCBiaXQgaXQgaXMgcmVzZXJ2ZWQKLQkgKiBVcGRhdGVzIGFkZHIgYXV0b21hdGljYWxseSBmb3IgZWFjaCBCMiB3cml0ZQotCSAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IxX0NUTCArIDE2ICogaWlyX2lkeCksCi0JCShiYW5kX2lkeCAqIEJBTkRfTUFYICogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKLQotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10pOwotCXNldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0pOwotCi0JcHJfZGVidWcoIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDEpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDIpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9nZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzaGEtPmNvbXBfZW5hYmxlZFtjb21wXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9zZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBjb21wID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJICAgIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IENvbXBhbmRlciAlZCBlbmFibGUgY3VycmVudCAlZCwgbmV3ICVkXG4iLAotCQkgX19mdW5jX18sIGNvbXAgKyAxLCB0YXNoYS0+Y29tcF9lbmFibGVkW2NvbXBdLCB2YWx1ZSk7Ci0JdGFzaGEtPmNvbXBfZW5hYmxlZFtjb21wXSA9IHZhbHVlOwotCi0JLyogQW55IHNwZWNpZmljIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBhbmRlciAqLwotCXN3aXRjaCAoY29tcCkgewotCWNhc2UgQ09NUEFOREVSXzE6Ci0JCS8qIFNldCBHYWluIFNvdXJjZSBTZWxlY3QgYmFzZWQgb24gY29tcGFuZGVyIGVuYWJsZS9kaXNhYmxlICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sIDB4MjAsCi0JCQkJKHZhbHVlID8gMHgwMDoweDIwKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzI6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1JfRU4sIDB4MjAsCi0JCQkJKHZhbHVlID8gMHgwMDoweDIwKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzM6Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzQ6Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU0VfTE9fTE8zX0dBSU4sIDB4MjAsCi0JCQkJKHZhbHVlID8gMHgwMDoweDIwKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzY6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU0VfTE9fTE80X0dBSU4sIDB4MjAsCi0JCQkJKHZhbHVlID8gMHgwMDoweDIwKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzc6Ci0JCWJyZWFrOwotCWNhc2UgQ09NUEFOREVSXzg6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qCi0JCSAqIGlmIGNvbXBhbmRlciBpcyBub3QgZW5hYmxlZCBmb3IgYW55IGludGVycG9sYXRvciwKLQkJICogaXQgZG9lcyBub3QgY2F1c2UgYW55IGF1ZGlvIGZhaWx1cmUsIHNvIGRvIG5vdAotCQkgKiByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlLCBidXQganVzdCBwcmludCBhIGxvZwotCQkgKi8KLQkJZGV2X3dhcm4oY29kZWMtPmRldiwgIiVzOiB1bmtub3duIGNvbXBhbmRlcjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgY29tcCk7Ci0JfTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaW5pdF9mbHliYWNrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0VOLCAweEMwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0VOLCAweEMwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9CVUZGLCAweDBGLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfRkxZQl9CVUZGLCAweEYwLCAweDAwKTsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfcnhfYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQl0YXNoYS0+cnhfYmlhc19jb3VudCsrOwotCQlpZiAodGFzaGEtPnJ4X2JpYXNfY291bnQgPT0gMSkgewotCQkJaWYgKFRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpCi0JCQkJdGFzaGFfY29kZWNfaW5pdF9mbHliYWNrKGNvZGVjKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX1JYX1NVUFBMSUVTLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXRhc2hhLT5yeF9iaWFzX2NvdW50LS07Ci0JCWlmICghdGFzaGEtPnJ4X2JpYXNfY291bnQpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9SWF9TVVBQTElFUywKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQlicmVhazsKLQl9OwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDdXJyZW50IFJYIEJJQVMgdXNlciBjb3VudDogJWRcbiIsIF9fZnVuY19fLAotCQl0YXNoYS0+cnhfYmlhc19jb3VudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfcmVhbGlnbl9hbmNfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICB1MTYgcmVnMSwgdTE2IHJlZzIpCi17Ci0JdTggdmFsMSwgdmFsMiwgdG1wdmFsMSwgdG1wdmFsMjsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzEsIDB4MDApOwotCXRtcHZhbDEgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpOwotCXRtcHZhbDIgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZzIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzEsIDB4MDApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzIsIDB4RkYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzEsIDB4MDEpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzIsIDB4RkYpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMCk7Ci0JdmFsMSA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnMik7Ci0JdmFsMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgcmVnMik7Ci0KLQlpZiAodmFsMSA9PSAweDBGICYmIHZhbDIgPT0gMHhGRikgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQU5DMCBjby1lZmYgaW5kZXggcmUtYWxpZ25lZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJc25kX3NvY19yZWFkKGNvZGVjLCByZWcyKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzIsIHRtcHZhbDIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcxLCAweDAxKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMiwgdG1wdmFsMSk7Ci0JfSBlbHNlIGlmICh2YWwxID09IDB4RkYgJiYgdmFsMiA9PSAweDBGKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBBTkMxIGNvLWVmZiBpbmRleCBhbHJlYWR5IGFsaWduZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzEsIDB4MDApOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcyLCB0bXB2YWwxKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgcmVnMSwgMHgwMSk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZzIsIHRtcHZhbDIpOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBBTkMwIGNvLWVmZiBpbmRleCBub3QgYWxpZ25lZFxuIiwKLQkJCV9fZnVuY19fKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2FuYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JaW50IGk7Ci0JaW50IHJldCA9IDA7Ci0JaW50IG51bV9hbmNfc2xvdHM7Ci0Jc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlciAqYW5jX2hlYWQ7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsID0gTlVMTDsKLQl1MzIgYW5jX3dyaXRlc19zaXplID0gMDsKLQl1MzIgYW5jX2NhbF9zaXplID0gMDsKLQlpbnQgYW5jX3NpemVfcmVtYWluaW5nOwotCXUzMiAqYW5jX3B0cjsKLQl1MTYgcmVnOwotCXU4IG1hc2ssIHZhbDsKLQlzaXplX3QgY2FsX3NpemU7Ci0JY29uc3Qgdm9pZCAqZGF0YTsKLQotCWlmICghdGFzaGEtPmFuY19mdW5jKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh0YXNoYS0+ZndfZGF0YSwgV0NEOVhYWF9BTkNfQ0FMKTsKLQkJaWYgKGh3ZGVwX2NhbCkgewotCQkJZGF0YSA9IGh3ZGVwX2NhbC0+ZGF0YTsKLQkJCWNhbF9zaXplID0gaHdkZXBfY2FsLT5zaXplOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIGh3ZGVwIGNhbGlicmF0aW9uXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVuYW1lID0gIndjZDkzMzUvd2NkOTMzNV9hbmMuYmluIjsKLQkJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgY29kZWMtPmRldik7Ci0JCQlpZiAocmV0ICE9IDApIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIkZhaWxlZCB0byBhY3F1aXJlIEFOQyBkYXRhOiAlZFxuIiwgcmV0KTsKLQkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCX0KLQkJCWlmICghZncpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFuYyBmdyIpOwotCQkJCXJldHVybiAtRU5PREVWOwotCQkJfQotCQkJZGF0YSA9IGZ3LT5kYXRhOwotCQkJY2FsX3NpemUgPSBmdy0+c2l6ZTsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogdXNpbmcgcmVxdWVzdF9maXJtd2FyZSBjYWxpYnJhdGlvblxuIiwgX19mdW5jX18pOwotCQl9Ci0JCWlmIChjYWxfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTm90IGVub3VnaCBkYXRhXG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQotCQkvKiBGaXJzdCBudW1iZXIgaXMgdGhlIG51bWJlciBvZiByZWdpc3RlciB3cml0ZXMgKi8KLQkJYW5jX2hlYWQgPSAoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlciAqKShkYXRhKTsKLQkJYW5jX3B0ciA9ICh1MzIgKikoZGF0YSArCi0JCQkJICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcikpOwotCQlhbmNfc2l6ZV9yZW1haW5pbmcgPSBjYWxfc2l6ZSAtCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcik7Ci0JCW51bV9hbmNfc2xvdHMgPSBhbmNfaGVhZC0+bnVtX2FuY19zbG90czsKLQotCQlpZiAodGFzaGEtPmFuY19zbG90ID49IG51bV9hbmNfc2xvdHMpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgQU5DIHNsb3Qgc2VsZWN0ZWRcbiIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fYW5jX3Nsb3RzOyBpKyspIHsKLQkJCWlmIChhbmNfc2l6ZV9yZW1haW5pbmcgPCBUQVNIQV9QQUNLRURfUkVHX1NJWkUpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCSJJbnZhbGlkIHJlZ2lzdGVyIGZvcm1hdFxuIik7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWFuY193cml0ZXNfc2l6ZSA9ICh1MzIpKCphbmNfcHRyKTsKLQkJCWFuY19zaXplX3JlbWFpbmluZyAtPSBzaXplb2YodTMyKTsKLQkJCWFuY19wdHIgKz0gMTsKLQotCQkJaWYgKGFuY193cml0ZXNfc2l6ZSAqIFRBU0hBX1BBQ0tFRF9SRUdfU0laRQotCQkJCT4gYW5jX3NpemVfcmVtYWluaW5nKSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiSW52YWxpZCByZWdpc3RlciBmb3JtYXRcbiIpOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0KLQkJCWlmICh0YXNoYS0+YW5jX3Nsb3QgPT0gaSkKLQkJCQlicmVhazsKLQotCQkJYW5jX3NpemVfcmVtYWluaW5nIC09IChhbmNfd3JpdGVzX3NpemUgKgotCQkJCVRBU0hBX1BBQ0tFRF9SRUdfU0laRSk7Ci0JCQlhbmNfcHRyICs9IGFuY193cml0ZXNfc2l6ZTsKLQkJfQotCQlpZiAoaSA9PSBudW1fYW5jX3Nsb3RzKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJTZWxlY3RlZCBBTkMgc2xvdCBub3QgcHJlc2VudFxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlpID0gMDsKLQkJYW5jX2NhbF9zaXplID0gYW5jX3dyaXRlc19zaXplOwotCi0JCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQwIERBQyIpIHx8Ci0JCSAgICAhc3RyY21wKHctPm5hbWUsICJBTkMgU1BLMSBQQSIpKQotCQkJdGFzaGFfcmVhbGlnbl9hbmNfY29lZmYoY29kZWMsCi0JCQkJCVdDRDkzMzVfQ0RDX0FOQzBfSUlSX0NPRUZGXzFfQ1RMLAotCQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8yX0NUTCk7Ci0KLQkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDEgREFDIikgfHwKLQkJCSFzdHJjbXAody0+bmFtZSwgIlJYIElOVDMgREFDIikpIHsKLQkJCXRhc2hhX3JlYWxpZ25fYW5jX2NvZWZmKGNvZGVjLAotCQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0lJUl9DT0VGRl8xX0NUTCwKLQkJCQkJV0NEOTMzNV9DRENfQU5DMF9JSVJfQ09FRkZfMl9DVEwpOwotCQkJYW5jX3dyaXRlc19zaXplID0gYW5jX2NhbF9zaXplIC8gMjsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQlXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsIDB4MzksIDB4MzkpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDIgREFDIikgfHwKLQkJCQkhc3RyY21wKHctPm5hbWUsICJSWCBJTlQ0IERBQyIpKSB7Ci0JCQl0YXNoYV9yZWFsaWduX2FuY19jb2VmZihjb2RlYywKLQkJCQkJV0NEOTMzNV9DRENfQU5DMV9JSVJfQ09FRkZfMV9DVEwsCi0JCQkJCVdDRDkzMzVfQ0RDX0FOQzFfSUlSX0NPRUZGXzJfQ1RMKTsKLQkJCWkgPSBhbmNfY2FsX3NpemUgLyAyOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCVdDRDkzMzVfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwgMHgzOSwgMHgzOSk7Ci0JCX0KLQotCQlmb3IgKDsgaSA8IGFuY193cml0ZXNfc2l6ZTsgaSsrKSB7Ci0JCQlUQVNIQV9DT0RFQ19VTlBBQ0tfRU5UUlkoYW5jX3B0cltpXSwgcmVnLCBtYXNrLCB2YWwpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgcmVnLCAodmFsICYgbWFzaykpOwotCQl9Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQxIERBQyIpIHx8Ci0JCQkhc3RyY21wKHctPm5hbWUsICJSWCBJTlQzIERBQyIpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwgMHgwOCwgMHgwOCk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMiBEQUMiKSB8fAotCQkJCSFzdHJjbXAody0+bmFtZSwgIlJYIElOVDQgREFDIikpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfQU5DMV9DTEtfUkVTRVRfQ1RMLCAweDA4LCAweDA4KTsKLQkJfQotCi0JCWlmICghaHdkZXBfY2FsKQotCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBSZW1vdmUgQU5DIFJ4IGZyb20gcmVzZXQgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfQU5DMF9DTEtfUkVTRVRfQ1RMLAotCQkJCSAgICAweDA4LCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfQU5DMV9DTEtfUkVTRVRfQ1RMLAotCQkJCSAgICAweDA4LCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpIHx8Ci0JCSAgICAhc3RyY21wKHctPm5hbWUsICJBTkMgRUFSIFBBIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBTUEsxIFBBIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMSBQQSIpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8xX0NUTCwgMHgzMCwgMHgwMCk7Ci0JCQltc2xlZXAoNTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX01PREVfMV9DVEwsIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsIDB4MzgsIDB4MzgpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsIDB4MDcsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsIDB4MzgsIDB4MDApOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikgfHwKLQkJCSAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMiBQQSIpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8xX0NUTCwgMHgzMCwgMHgwMCk7Ci0JCQltc2xlZXAoNTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMxX01PREVfMV9DVEwsIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsIDB4MzgsIDB4MzgpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsIDB4MDcsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsIDB4MzgsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotZXJyOgotCWlmICghaHdkZXBfY2FsKQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19jbGVhcl9hbmNfdHhfaG9sZChzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCi17Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBTkNfTUlDX0FNSUMxLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkKLQkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQodGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDMSwgZmFsc2UpOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDMiwgJnRhc2hhLT5zdGF0dXNfbWFzaykpCi0JCXRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9BTkFfQU1JQzIsIGZhbHNlKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFOQ19NSUNfQU1JQzMsICZ0YXNoYS0+c3RhdHVzX21hc2spKQotCQl0YXNoYV9jb2RlY19zZXRfdHhfaG9sZCh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfQU5BX0FNSUMzLCBmYWxzZSk7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBTkNfTUlDX0FNSUM0LCAmdGFzaGEtPnN0YXR1c19tYXNrKSkKLQkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQodGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNCwgZmFsc2UpOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDNSwgJnRhc2hhLT5zdGF0dXNfbWFzaykpCi0JCXRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9BTkFfQU1JQzUsIGZhbHNlKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFOQ19NSUNfQU1JQzYsICZ0YXNoYS0+c3RhdHVzX21hc2spKQotCQl0YXNoYV9jb2RlY19zZXRfdHhfaG9sZCh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfQU5BX0FNSUM2LCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9wb3N0X3BhX2NvbmZpZyhzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCi0JCQkJCSAgIGludCBtb2RlLCBpbnQgZXZlbnQpCi17Ci0JdTggc2NhbGVfdmFsID0gMDsKLQotCWlmICghVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBDTFNfSF9ISUZJOgotCQkJc2NhbGVfdmFsID0gMHgzOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xTX0hfTE9ISUZJOgotCQkJc2NhbGVfdmFsID0gMHgxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRhc2hhLT5hbmNfZnVuYykgewotCQkJLyogQ2xlYXIgVHggRkUgSE9MRCBpZiBib3RoIFBBcyBhcmUgZW5hYmxlZCAqLwotCQkJaWYgKChzbmRfc29jX3JlYWQodGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgpICYKLQkJCSAgICAgMHhDMCkgPT0gMHhDMCkgewotCQkJCXRhc2hhX2NvZGVjX2NsZWFyX2FuY190eF9ob2xkKHRhc2hhKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlzY2FsZV92YWwgPSAweDY7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzY2FsZV92YWwpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHModGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwxLCAweDBFLAotCQkJCSAgICBzY2FsZV92YWwgPDwgMSk7Ci0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJaWYgKHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzFdIHx8Ci0JCSAgICB0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl8yXSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sCi0JCQkJCSAgICAweDIwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHModGFzaGEtPmNvZGVjLCBXQ0Q5MzM1X0hQSF9SX0VOLAotCQkJCQkgICAgMHgyMCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHRhc2hhLT5jb2RlYywgV0NEOTMzNV9IUEhfQVVUT19DSE9QLAotCQkJCQkgICAgMHgyMCwgMHgyMCk7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sIDB4MUYsCi0JCQkJICAgIHRhc2hhLT5ocGhfbF9nYWluKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX1JfRU4sIDB4MUYsCi0JCQkJICAgIHRhc2hhLT5ocGhfcl9nYWluKTsKLQl9Ci0KLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyh0YXNoYS0+Y29kZWMsIFdDRDkzMzVfSFBIX0FVVE9fQ0hPUCwgMHgyMCwKLQkJCQkgICAgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19vdmVycmlkZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIGludCBtb2RlLAotCQkJCSBpbnQgZXZlbnQpCi17Ci0JaWYgKG1vZGUgPT0gQ0xTX0FCKSB7Ci0JCXN3aXRjaCAoZXZlbnQpIHsKLQkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCQlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCVdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCkgJiAweDEwKSAmJgotCQkJCSghKHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQkJV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMKSAmIDB4MTApKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLCAweDAyLCAweDAyKTsKLQkJYnJlYWs7Ci0JCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLCAweDAyLCAweDAwKTsKLQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2hwaHJfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgaHBoX21vZGUgPSB0YXNoYS0+aHBoX21vZGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAoKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBIUiBQQSIpKSkgJiYKLQkJICAgICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfSFBILCAweEMwLCAweEMwKTsKLQkJfQotCQlzZXRfYml0KEhQSF9QQV9ERUxBWSwgJnRhc2hhLT5zdGF0dXNfbWFzayk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpKSB7Ci0JCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9BTkFfSFBIKSAmIDB4QzApCi0JCQkJCQkJIT0gMHhDMCkKLQkJCQkvKgotCQkJCSAqIElmIFBBX0VOIGlzIG5vdCBzZXQgKHBvdGVudGlhbGx5IGluIEFOQyBjYXNlKQotCQkJCSAqIHRoZW4gZG8gbm90aGluZyBmb3IgUE9TVF9QTVUgYW5kIGxldCBsZWZ0Ci0JCQkJICogY2hhbm5lbCBoYW5kbGUgZXZlcnl0aGluZy4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiA3bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCWlmICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spKSB7Ci0JCQl1c2xlZXBfcmFuZ2UoNzAwMCwgNzEwMCk7Ci0JCQljbGVhcl9iaXQoSFBIX1BBX0RFTEFZLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQkJfQotCQl0YXNoYV9jb2RlY19ocGhfcG9zdF9wYV9jb25maWcodGFzaGEsIGhwaF9tb2RlLCBldmVudCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NUTCwKLQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCS8qIFJlbW92ZSBtaXggcGF0aCBtdXRlIGlmIGl0IGlzIGVuYWJsZWQgKi8KLQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwpKSAmCi0JCQkJICAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpKSB7Ci0JCQkvKiBEbyBldmVyeXRoaW5nIG5lZWRlZCBmb3IgbGVmdCBjaGFubmVsICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJCS8qIFJlbW92ZSBtaXggcGF0aCBtdXRlIGlmIGl0IGlzIGVuYWJsZWQgKi8KLQkJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCQkgIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwpKSAmCi0JCQkJCSAgMHgxMCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJCTB4MTAsIDB4MDApOwotCQkJLyogUmVtb3ZlIEFOQyBSeCBmcm9tIHJlc2V0ICovCi0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCX0KLQkJdGFzaGFfY29kZWNfb3ZlcnJpZGUoY29kZWMsIGhwaF9tb2RlLCBldmVudCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAotCQkJCQlXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGLAotCQkJCQkmdGFzaGEtPm1iaGMpOwotCQl0YXNoYV9jb2RlY19ocGhfcG9zdF9wYV9jb25maWcodGFzaGEsIGhwaF9tb2RlLCBldmVudCk7Ci0JCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgsIDB4NDAsIDB4MDApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJLyogNW1zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGRpc2FibGVkIGFzIHBlcgotCQkgKiBIVyByZXF1aXJlbWVudAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOwotCQl0YXNoYV9jb2RlY19vdmVycmlkZShjb2RlYywgaHBoX21vZGUsIGV2ZW50KTsKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAotCQkJCQlXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRiwKLQkJCQkJJnRhc2hhLT5tYmhjKTsKLQotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpKSB7Ci0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9ocGhsX3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGhwaF9tb2RlID0gdGFzaGEtPmhwaF9tb2RlOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKCghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSEwgUEEiKSkpICYmCi0JCSAgICAodGVzdF9iaXQoSFBIX1BBX0RFTEFZLCAmdGFzaGEtPnN0YXR1c19tYXNrKSkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCwgMHhDMCwgMHhDMCk7Ci0JCX0KLQkJc2V0X2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpKSkgewotCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX0hQSCkgJiAweEMwKQotCQkJCQkJCQkhPSAweEMwKQotCQkJCS8qCi0JCQkJICogSWYgUEFfRU4gaXMgbm90IHNldCAocG90ZW50aWFsbHkgaW4gQU5DIGNhc2UpCi0JCQkJICogdGhlbiBkbyBub3RoaW5nIGZvciBQT1NUX1BNVSBhbmQgbGV0IHJpZ2h0Ci0JCQkJICogY2hhbm5lbCBoYW5kbGUgZXZlcnl0aGluZy4KLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiA3bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCWlmICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXNoYS0+c3RhdHVzX21hc2spKSB7Ci0JCQl1c2xlZXBfcmFuZ2UoNzAwMCwgNzEwMCk7Ci0JCQljbGVhcl9iaXQoSFBIX1BBX0RFTEFZLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQkJfQotCi0JCXRhc2hhX2NvZGVjX2hwaF9wb3N0X3BhX2NvbmZpZyh0YXNoYSwgaHBoX21vZGUsIGV2ZW50KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMLAotCQkJCSAgICAweDEwLCAweDAwKTsKLQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCkpICYKLQkJCQkgIDB4MTApCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJICAgIDB4MTAsIDB4MDApOwotCi0JCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSEwgUEEiKSkpIHsKLQkJCS8qIERvIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciByaWdodCBjaGFubmVsICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJCS8qIFJlbW92ZSBtaXggcGF0aCBtdXRlIGlmIGl0IGlzIGVuYWJsZWQgKi8KLQkJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCQkgIFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwpKSAmCi0JCQkJCSAgMHgxMCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJCTB4MTAsIDB4MDApOwotCi0JCQkvKiBSZW1vdmUgQU5DIFJ4IGZyb20gcmVzZXQgKi8KLQkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJfQotCQl0YXNoYV9jb2RlY19vdmVycmlkZShjb2RlYywgaHBoX21vZGUsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAotCQkJCQlXQ0RfRVZFTlRfUFJFX0hQSExfUEFfT0ZGLAotCQkJCQkmdGFzaGEtPm1iaGMpOwotCQl0YXNoYV9jb2RlY19ocGhfcG9zdF9wYV9jb25maWcodGFzaGEsIGhwaF9tb2RlLCBldmVudCk7Ci0JCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSEwgUEEiKSkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgsIDB4ODAsIDB4MDApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJLyogNW1zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGRpc2FibGVkIGFzIHBlcgotCQkgKiBIVyByZXF1aXJlbWVudAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOwotCQl0YXNoYV9jb2RlY19vdmVycmlkZShjb2RlYywgaHBoX21vZGUsIGV2ZW50KTsKLQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGFzaGEtPm5vdGlmaWVyLAotCQkJCQlXQ0RfRVZFTlRfUE9TVF9IUEhMX1BBX09GRiwKLQkJCQkJJnRhc2hhLT5tYmhjKTsKLQotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKSB7Ci0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9saW5lb3V0X3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXUxNiBsaW5lb3V0X3ZvbF9yZWcgPSAwLCBsaW5lb3V0X21peF92b2xfcmVnID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0JaWYgKHctPnJlZyA9PSBXQ0Q5MzM1X0FOQV9MT18xXzIpIHsKLQkJaWYgKHctPnNoaWZ0ID09IDcpIHsKLQkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTDsKLQkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMOwotCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IDYpIHsKLQkJCWxpbmVvdXRfdm9sX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NUTDsKLQkJCWxpbmVvdXRfbWl4X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMOwotCQl9Ci0JfSBlbHNlIGlmICh3LT5yZWcgPT0gV0NEOTMzNV9BTkFfTE9fM180KSB7Ci0JCWlmICh3LT5zaGlmdCA9PSA3KSB7Ci0JCQlsaW5lb3V0X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEw7Ci0JCQlsaW5lb3V0X21peF92b2xfcmVnID0gV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfTUlYX0NUTDsKLQkJfSBlbHNlIGlmICh3LT5zaGlmdCA9PSA2KSB7Ci0JCQlsaW5lb3V0X3ZvbF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEw7Ci0JCQlsaW5lb3V0X21peF92b2xfcmVnID0gV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciBlbmFibGluZyBsaW5lb3V0IFBBXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCS8qIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgotCQkgKiBIVyByZXF1aXJlbWVudAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBsaW5lb3V0X3ZvbF9yZWcsCi0JCQkJICAgIDB4MTAsIDB4MDApOwotCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCi0JCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBsaW5lb3V0X21peF92b2xfcmVnKSkgJiAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIGxpbmVvdXRfbWl4X3ZvbF9yZWcsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgTElORU9VVDEgUEEiKSkgfHwKLQkJICAgICEoc3RyY21wKHctPm5hbWUsICJBTkMgTElORU9VVDIgUEEiKSkpCi0JCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCXRhc2hhX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBDTFNfQUIsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBkaXNhYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQkJdGFzaGFfY29kZWNfb3ZlcnJpZGUoY29kZWMsIENMU19BQiwgZXZlbnQpOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMSBQQSIpKSB8fAotCQkJIShzdHJjbXAody0+bmFtZSwgIkFOQyBMSU5FT1VUMiBQQSIpKSkgewotCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOwotCQkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgTElORU9VVDEgUEEiKSkpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKLQkJCWVsc2UKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOwotCQl9Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9zcGtfYW5jX3VwZGF0ZV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNwa19hbmNfd29yayAqc3BrX2FuY19kd29yazsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCWRlbGF5ZWRfd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlzcGtfYW5jX2R3b3JrID0gY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IHNwa19hbmNfd29yaywgZHdvcmspOwotCXRhc2hhID0gc3BrX2FuY19kd29yay0+dGFzaGE7Ci0JY29kZWMgPSB0YXNoYS0+Y29kZWM7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3BrX2FuYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBpbnQgZXZlbnQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWQgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCwKLQkJdGFzaGEtPmFuY19mdW5jKTsKLQotCWlmICghdGFzaGEtPmFuY19mdW5jKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdGFzaGEtPnNwa19hbmNfZHdvcmsuZHdvcmssCi0JCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhzcGtfYW5jX2VuX2RlbGF5KSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRhc2hhLT5zcGtfYW5jX2R3b3JrLmR3b3JrKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMCwKLQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2Vhcl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ1RMLAotCQkJCSAgICAweDEwLCAweDAwKTsKLQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCkpICYKLQkJICAgICAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBkaXNhYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBFQVIgUEEiKSkpIHsKLQkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwgMHgxMCwgMHgwMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9tb2RlX2dhaW5fb3B0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICB1OCBnYWluKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXU4IGhwaF9sX2VuLCBocGhfcl9lbjsKLQl1OCBsX3ZhbCwgcl92YWw7Ci0JdTggaHBoX3BhX3N0YXR1czsKLQlib29sIGlzX2hwaGxfcGEsIGlzX2hwaHJfcGE7Ci0KLQlocGhfcGFfc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0FOQV9IUEgpOwotCWlzX2hwaGxfcGEgPSBocGhfcGFfc3RhdHVzID4+IDc7Ci0JaXNfaHBocl9wYSA9IChocGhfcGFfc3RhdHVzICYgMHg0MCkgPj4gNjsKLQotCWhwaF9sX2VuID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0VOKTsKLQlocGhfcl9lbiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9IUEhfUl9FTik7Ci0KLQlsX3ZhbCA9IChocGhfbF9lbiAmIDB4QzApIHwgMHgyMCB8IGdhaW47Ci0Jcl92YWwgPSAoaHBoX3JfZW4gJiAweEMwKSB8IDB4MjAgfCBnYWluOwotCi0JLyoKLQkgKiBTZXQgSFBIX0wgJiBIUEhfUiBnYWluIHNvdXJjZSBzZWxlY3Rpb24gdG8gUkVHSVNURVIKLQkgKiBmb3IgYmV0dGVyIGNsaWNrIGFuZCBwb3Agb25seSBpZiBjb3JyZXNwb25kaW5nIFBBcyBhcmUKLQkgKiBub3QgZW5hYmxlZC4gQWxzbyBjYWNoZSB0aGUgdmFsdWVzIG9mIHRoZSBIUEhML1IKLQkgKiBQQSBnYWlucyB0byBiZSBhcHBsaWVkIGFmdGVyIFBBcyBhcmUgZW5hYmxlZAotCSAqLwotCWlmICgobF92YWwgIT0gaHBoX2xfZW4pICYmICFpc19ocGhsX3BhKSB7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfSFBIX0xfRU4sIGxfdmFsKTsKLQkJdGFzaGEtPmhwaF9sX2dhaW4gPSBocGhfbF9lbiAmIDB4MUY7Ci0JfQotCi0JaWYgKChyX3ZhbCAhPSBocGhfcl9lbikgJiYgIWlzX2hwaHJfcGEpIHsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9IUEhfUl9FTiwgcl92YWwpOwotCQl0YXNoYS0+aHBoX3JfZ2FpbiA9IGhwaF9yX2VuICYgMHgxRjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9sb2hpZmlfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICBpbnQgZXZlbnQpCi17Ci0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9SWF9CSUFTX0hQSF9QQSwgMHgwRiwgMHgwNik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ0JVRkZfQ05QMiwKLQkJCQkgICAgMHhGMCwgMHg0MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsIDB4MDcsIDB4MDMpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDA4LCAweDA4KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMSwgMHgwRSwgMHgwQyk7Ci0JCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2dhaW5fb3B0KGNvZGVjLCAweDExKTsKLQl9Ci0KLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwOCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX0NOUF9XR19DVEwsIDB4MDcsIDB4MDIpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNCVUZGX0NOUDIsIDB4OEEpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1BBLCAweDBGLCAweDBBKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9scF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgIGludCBldmVudCkKLXsKLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwxLCAweDBFLCAweDBDKTsKLQkJdGFzaGFfY29kZWNfaHBoX21vZGVfZ2Fpbl9vcHQoY29kZWMsIDB4MTApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMLCAweDA3LCAweDAzKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwOCwgMHgwOCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MDQsIDB4MDQpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDIwLCAweDIwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUkRBQ19MRE9fQ1RMLCAweDA3LAotCQkJCSAgICAweDAxKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUkRBQ19MRE9fQ1RMLCAweDcwLAotCQkJCSAgICAweDEwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9SWF9CSUFTX0hQSF9SREFDX0xETywKLQkJCQkgICAgMHgwRiwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfUlhfQklBU19IUEhfUkRBQ19MRE8sCi0JCQkJICAgIDB4RjAsIDB4MTApOwotCX0KLQotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgewotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1JYX0JJQVNfSFBIX1JEQUNfTERPLCAweDg4KTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9IUEhfUkRBQ19MRE9fQ1RMLCAweDMzKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgyMCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MDQsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9QQV9DVEwyLCAweDA4LCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfQ05QX1dHX0NUTCwgMHgwNywgMHgwMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1JfRU4sIDB4QzAsIDB4ODApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0VOLCAweEMwLCAweDgwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9oaWZpX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBldmVudCkKLXsKLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMLCAweDA3LCAweDAzKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfUEFfQ1RMMiwgMHgwOCwgMHgwOCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDEsIDB4MEUsIDB4MEMpOwotCQl0YXNoYV9jb2RlY19ocGhfbW9kZV9nYWluX29wdChjb2RlYywgMHgxMSk7Ci0JfQotCi0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfSFBIX1BBX0NUTDIsIDB4MDgsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9DTlBfV0dfQ1RMLCAweDA3LCAweDAyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX2hwaF9tb2RlX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBldmVudCwgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoIVRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xTX0hfTFA6Ci0JCXRhc2hhX2NvZGVjX2hwaF9scF9jb25maWcoY29kZWMsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDTFNfSF9MT0hJRkk6Ci0JCXRhc2hhX2NvZGVjX2hwaF9sb2hpZmlfY29uZmlnKGNvZGVjLCBldmVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0xTX0hfSElGSToKLQkJdGFzaGFfY29kZWNfaHBoX2hpZmlfY29uZmlnKGNvZGVjLCBldmVudCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19ocGhyX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50IGhwaF9tb2RlID0gdGFzaGEtPmhwaF9tb2RlOwotCXU4IGRlbV9pbnA7Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB3bmFtZTogJXMgZXZlbnQ6ICVkIGhwaF9tb2RlOiAlZFxuIiwgX19mdW5jX18sCi0JCXctPm5hbWUsIGV2ZW50LCBocGhfbW9kZSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhc2hhLT5hbmNfZnVuYykgewotCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOwotCQkJLyogNDAgbXNlYyBkZWxheSBpcyBuZWVkZWQgdG8gYXZvaWQgY2xpY2sgYW5kIHBvcCAqLwotCQkJbXNsZWVwKDQwKTsKLQkJfQotCi0JCS8qIFJlYWQgREVNIElOUCBTZWxlY3QgKi8KLQkJZGVtX2lucCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCkgJgotCQkJICAweDAzOwotCQlpZiAoKChocGhfbW9kZSA9PSBDTFNfSF9ISUZJKSB8fCAoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSB8fAotCQkgICAgIChocGhfbW9kZSA9PSBDTFNfSF9MUCkpICYmIChkZW1faW5wICE9IDB4MDEpKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogREVNIElucHV0IG5vdCBzZXQgY29ycmVjdGx5LCBocGhfbW9kZTogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBocGhfbW9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhSLAotCQkJICAgICAoKGhwaF9tb2RlID09IENMU19IX0xPSElGSSkgPwotCQkJICAgICAgIENMU19IX0hJRkkgOiBocGhfbW9kZSkpOwotCi0JCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2NvbmZpZyhjb2RlYywgZXZlbnQsIGhwaF9tb2RlKTsKLQotCQlpZiAodGFzaGEtPmFuY19mdW5jKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKLQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJLyogMTAwMHVzIHJlcXVpcmVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLwotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JCWlmICgoaHBoX21vZGUgPT0gQ0xTX0hfTFApICYmCi0JCSAgIChUQVNIQV9JU18xXzEod2NkOXh4eCkpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwsCi0JCQkJCSAgICAweDAzLCAweDAzKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlpZiAoKGhwaF9tb2RlID09IENMU19IX0xQKSAmJgotCQkgICAoVEFTSEFfSVNfMV8xKHdjZDl4eHgpKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfTF9EQUNfQ1RMLAotCQkJCQkgICAgMHgwMywgMHgwMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDEwMDB1cyByZXF1aXJlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCi0JCWlmICghKHdjZF9jbHNoX2dldF9jbHNoX3N0YXRlKCZ0YXNoYS0+Y2xzaF9kKSAmCi0JCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBITCkpCi0JCQl0YXNoYV9jb2RlY19ocGhfbW9kZV9jb25maWcoY29kZWMsIGV2ZW50LCBocGhfbW9kZSk7Ci0KLQkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGFzaGEtPmNsc2hfZCwKLQkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUE9TVF9QQSwKLQkJCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBIUiwKLQkJCSAgICAgKChocGhfbW9kZSA9PSBDTFNfSF9MT0hJRkkpID8KLQkJCSAgICAgICBDTFNfSF9ISUZJIDogaHBoX21vZGUpKTsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfaHBobF9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCWludCBocGhfbW9kZSA9IHRhc2hhLT5ocGhfbW9kZTsKLQl1OCBkZW1faW5wOwotCWludCByZXQgPSAwOwotCXVpbnQzMl90IGltcGVkbCA9IDAsIGltcGVkciA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB3bmFtZTogJXMgZXZlbnQ6ICVkIGhwaF9tb2RlOiAlZFxuIiwgX19mdW5jX18sCi0JCXctPm5hbWUsIGV2ZW50LCBocGhfbW9kZSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhc2hhLT5hbmNfZnVuYykgewotCQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOwotCQkJLyogNDAgbXNlYyBkZWxheSBpcyBuZWVkZWQgdG8gYXZvaWQgY2xpY2sgYW5kIHBvcCAqLwotCQkJbXNsZWVwKDQwKTsKLQkJfQotCi0JCS8qIFJlYWQgREVNIElOUCBTZWxlY3QgKi8KLQkJZGVtX2lucCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCkgJgotCQkJICAweDAzOwotCQlpZiAoKChocGhfbW9kZSA9PSBDTFNfSF9ISUZJKSB8fCAoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSB8fAotCQkgICAgIChocGhfbW9kZSA9PSBDTFNfSF9MUCkpICYmIChkZW1faW5wICE9IDB4MDEpKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogREVNIElucHV0IG5vdCBzZXQgY29ycmVjdGx5LCBocGhfbW9kZTogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBocGhfbW9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhMLAotCQkJICAgICAoKGhwaF9tb2RlID09IENMU19IX0xPSElGSSkgPwotCQkJICAgICAgIENMU19IX0hJRkkgOiBocGhfbW9kZSkpOwotCi0JCXRhc2hhX2NvZGVjX2hwaF9tb2RlX2NvbmZpZyhjb2RlYywgZXZlbnQsIGhwaF9tb2RlKTsKLQotCQlpZiAodGFzaGEtPmFuY19mdW5jKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKLQotCQlyZXQgPSB3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKCZ0YXNoYS0+bWJoYywKLQkJCQkJJmltcGVkbCwgJmltcGVkcik7Ci0JCWlmICghcmV0KSB7Ci0JCQl3Y2RfY2xzaF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCwgZmFsc2UpOwotCQkJc2V0X2JpdChDTEFTU0hfQ09ORklHLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gZ2V0IG1iaGMgaW1wZWRhbmNlICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAwOwotCQl9Ci0KLQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJLyogMTAwMHVzIHJlcXVpcmVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLwotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JCWlmICgoaHBoX21vZGUgPT0gQ0xTX0hfTFApICYmCi0JCSAgIChUQVNIQV9JU18xXzEod2NkOXh4eCkpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0hQSF9MX0RBQ19DVEwsCi0JCQkJCSAgICAweDAzLCAweDAzKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlpZiAoKGhwaF9tb2RlID09IENMU19IX0xQKSAmJgotCQkgICAoVEFTSEFfSVNfMV8xKHdjZDl4eHgpKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9IUEhfTF9EQUNfQ1RMLAotCQkJCQkgICAgMHgwMywgMHgwMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDEwMDB1cyByZXF1aXJlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCi0JCWlmICghKHdjZF9jbHNoX2dldF9jbHNoX3N0YXRlKCZ0YXNoYS0+Y2xzaF9kKSAmCi0JCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBIUikpCi0JCQl0YXNoYV9jb2RlY19ocGhfbW9kZV9jb25maWcoY29kZWMsIGV2ZW50LCBocGhfbW9kZSk7Ci0JCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhc2hhLT5jbHNoX2QsCi0JCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BPU1RfUEEsCi0JCQkgICAgIFdDRF9DTFNIX1NUQVRFX0hQSEwsCi0JCQkgICAgICgoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSA/Ci0JCQkgICAgICAgQ0xTX0hfSElGSSA6IGhwaF9tb2RlKSk7Ci0KLQkJaWYgKHRlc3RfYml0KENMQVNTSF9DT05GSUcsICZ0YXNoYS0+c3RhdHVzX21hc2spKSB7Ci0JCQl3Y2RfY2xzaF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCwgdHJ1ZSk7Ci0JCQljbGVhcl9iaXQoQ0xBU1NIX0NPTkZJRywgJnRhc2hhLT5zdGF0dXNfbWFzayk7Ci0JCX0gZWxzZQotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgbWJoYyBpbXBlZGFuY2UgJWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCi0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2xpbmVvdXRfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhc2hhLT5hbmNfZnVuYyAmJgotCQkJKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDMgREFDIikgfHwKLQkJCQkhc3RyY21wKHctPm5hbWUsICJSWCBJTlQ0IERBQyIpKSkKLQkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9MTywKLQkJCSAgICAgQ0xTX0FCKTsKLQotCQlpZiAodGFzaGEtPmFuY19mdW5jKSB7Ci0JCQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMyBEQUMiKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOwotCQkJZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNCBEQUMiKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9MTywKLQkJCSAgICAgQ0xTX0FCKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0YXNoYV9kYXBtX2kyc193aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUlhfSTJTX0NUTCIsIFdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCwKLQkwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJUWF9JMlNfQ1RMIiwgV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMLAotCTAsIDAsIE5VTEwsIDApLAotfTsKLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lYXJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhc2hhLT5hbmNfZnVuYykKLQkJCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXNoYS0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIsCi0JCQkgICAgIENMU19IX05PUk1BTCk7Ci0JCWlmICh0YXNoYS0+YW5jX2Z1bmMpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MTApOwotCi0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGFzaGEtPmNsc2hfZCwKLQkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUE9TVF9QQSwKLQkJCSAgICAgV0NEX0NMU0hfU1RBVEVfRUFSLAotCQkJICAgICBDTFNfSF9OT1JNQUwpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19zcGtfYm9vc3RfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQl1MTYgYm9vc3RfcGF0aF9jdGwsIGJvb3N0X3BhdGhfY2ZnMTsKLQl1MTYgcmVnLCByZWdfbWl4OwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNyBDSEFJTiIpKSB7Ci0JCWJvb3N0X3BhdGhfY3RsID0gV0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX1BBVEhfQ1RMOwotCQlib29zdF9wYXRoX2NmZzEgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcxOwotCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEw7Ci0JCXJlZ19taXggPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMOwotCX0gZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UOCBDSEFJTiIpKSB7Ci0JCWJvb3N0X3BhdGhfY3RsID0gV0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX1BBVEhfQ1RMOwotCQlib29zdF9wYXRoX2NmZzEgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxOwotCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEw7Ci0JCXJlZ19taXggPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIHdpZGdldDogJXNcbiIsCi0JCQlfX2Z1bmNfXywgdy0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2N0bCwgMHgxMCwgMHgxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY2ZnMSwgMHgwMSwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMHgxMCwgMHgwMCk7Ci0JCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCByZWdfbWl4KSkgJiAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnX21peCwgMHgxMCwgMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2NmZzEsIDB4MDEsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBib29zdF9wYXRoX2N0bCwgMHgxMCwgMHgwMCk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUxNiB0YXNoYV9pbnRlcnBfZ2V0X3ByaW1hcnlfcmVnKHUxNiByZWcsIHUxNiAqaW5kKQotewotCXUxNiBwcmltX2ludF9yZWcgPSAwOwotCi0Jc3dpdGNoIChyZWcpIHsKLQljYXNlIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTDoKLQljYXNlIFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEw6Ci0JCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTDsKLQkJKmluZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMOgotCWNhc2UgV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTDoKLQkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMOwotCQkqaW5kID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEw6Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMOgotCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEw7Ci0JCSppbmQgPSAyOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTDoKLQljYXNlIFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEw6Ci0JCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTDsKLQkJKmluZCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ1RMOgotCWNhc2UgV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX0NUTDoKLQkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfQ1RMOwotCQkqaW5kID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEw6Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMOgotCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEw7Ci0JCSppbmQgPSA1OwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTDoKLQljYXNlIFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9DVEw6Ci0JCXByaW1faW50X3JlZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTDsKLQkJKmluZCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ1RMOgotCWNhc2UgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX0NUTDoKLQkJcHJpbV9pbnRfcmVnID0gV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ1RMOwotCQkqaW5kID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEw6Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMOgotCQlwcmltX2ludF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEw7Ci0JCSppbmQgPSA4OwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHByaW1faW50X3JlZzsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfaGQyX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICB1MTYgcHJpbV9pbnRfcmVnLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTE2IGhkMl9zY2FsZV9yZWc7Ci0JdTE2IGhkMl9lbmFibGVfcmVnID0gMDsKLQotCWlmICghVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaW1faW50X3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwpIHsKLQkJaGQyX3NjYWxlX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzM7Ci0JCWhkMl9lbmFibGVfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMDsKLQl9Ci0JaWYgKHByaW1faW50X3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwpIHsKLQkJaGQyX3NjYWxlX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9QQVRIX1NFQzM7Ci0JCWhkMl9lbmFibGVfcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMDsKLQl9Ci0KLQlpZiAoaGQyX2VuYWJsZV9yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDNDLCAweDEwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX3NjYWxlX3JlZywgMHgwMywgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9lbmFibGVfcmVnLCAweDA0LCAweDA0KTsKLQl9Ci0KLQlpZiAoaGQyX2VuYWJsZV9yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX2VuYWJsZV9yZWcsIDB4MDQsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDAzLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX3NjYWxlX3JlZywgMHgzQywgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9wcmltX2ludGVycG9sYXRvcigKLQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJdTE2IHJlZywgaW50IGV2ZW50KQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBwcmltX2ludF9yZWc7Ci0JdTE2IGluZCA9IDA7Ci0KLQlwcmltX2ludF9yZWcgPSB0YXNoYV9pbnRlcnBfZ2V0X3ByaW1hcnlfcmVnKHJlZywgJmluZCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJdGFzaGEtPnByaW1faW50X3VzZXJzW2luZF0rKzsKLQkJaWYgKHRhc2hhLT5wcmltX2ludF91c2Vyc1tpbmRdID09IDEpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHByaW1faW50X3JlZywKLQkJCQkJICAgIDB4MTAsIDB4MTApOwotCQkJdGFzaGFfY29kZWNfaGQyX2NvbnRyb2woY29kZWMsIHByaW1faW50X3JlZywgZXZlbnQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcHJpbV9pbnRfcmVnLAotCQkJCQkgICAgMSA8PCAweDUsIDEgPDwgMHg1KTsKLQkJfQotCQlpZiAoKHJlZyAhPSBwcmltX2ludF9yZWcpICYmCi0JCSAgICAoKHNuZF9zb2NfcmVhZChjb2RlYywgcHJpbV9pbnRfcmVnKSkgJiAweDEwKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgMHgxMCwgMHgxMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQl0YXNoYS0+cHJpbV9pbnRfdXNlcnNbaW5kXS0tOwotCQlpZiAodGFzaGEtPnByaW1faW50X3VzZXJzW2luZF0gPT0gMCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcHJpbV9pbnRfcmVnLAotCQkJCQkxIDw8IDB4NSwgMCA8PCAweDUpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcHJpbV9pbnRfcmVnLAotCQkJCQkweDQwLCAweDQwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHByaW1faW50X3JlZywKLQkJCQkJMHg0MCwgMHgwMCk7Ci0JCQl0YXNoYV9jb2RlY19oZDJfY29udHJvbChjb2RlYywgcHJpbV9pbnRfcmVnLCBldmVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBwcmltYXJ5IGludGVycG9sYXRvcjogSU5UJWQsIHVzZXJzOiAlZFxuIiwKLQkJX19mdW5jX18sIGluZCwgdGFzaGEtPnByaW1faW50X3VzZXJzW2luZF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfc3JjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIGludCBzcmNfbnVtLAotCQkJCQkgaW50IGV2ZW50KQotewotCXUxNiBzcmNfcGFpcmVkX3JlZyA9IDA7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXUxNiByeF9wYXRoX2NmZ19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwOwotCXUxNiByeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEw7Ci0JaW50ICpzcmNfdXNlcnMsIGNvdW50LCBzcGxfc3JjID0gU1BMSU5FX1NSQzA7Ci0JdTE2IHNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wOwotCi0JdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAoc3JjX251bSkgewotCWNhc2UgU1JDX0lOX0hQSEw6Ci0JCXJ4X3BhdGhfY2ZnX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzA7Ci0JCXNyY19jbGtfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wOwotCQlzcmNfcGFpcmVkX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMDsKLQkJcnhfcGF0aF9jdGxfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ1RMOwotCQlzcGxfc3JjID0gU1BMSU5FX1NSQzA7Ci0JCWJyZWFrOwotCWNhc2UgU1JDX0lOX0xPMToKLQkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMDsKLQkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzA7Ci0JCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMV9DTEtfUlNUX0NUTF8wOwotCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEw7Ci0JCXNwbF9zcmMgPSBTUExJTkVfU1JDMDsKLQkJYnJlYWs7Ci0JY2FzZSBTUkNfSU5fSFBIUjoKLQkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMDsKLQkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMxX0NMS19SU1RfQ1RMXzA7Ci0JCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMF9DTEtfUlNUX0NUTF8wOwotCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEw7Ci0JCXNwbF9zcmMgPSBTUExJTkVfU1JDMTsKLQkJYnJlYWs7Ci0JY2FzZSBTUkNfSU5fTE8yOgotCQlyeF9wYXRoX2NmZ19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DRkcwOwotCQlzcmNfY2xrX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzFfQ0xLX1JTVF9DVExfMDsKLQkJc3JjX3BhaXJlZF9yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMwX0NMS19SU1RfQ1RMXzA7Ci0JCXJ4X3BhdGhfY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NUTDsKLQkJc3BsX3NyYyA9IFNQTElORV9TUkMxOwotCQlicmVhazsKLQljYXNlIFNSQ19JTl9TUEtSTDoKLQkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMDsKLQkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzA7Ci0JCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDM19DTEtfUlNUX0NUTF8wOwotCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEw7Ci0JCXNwbF9zcmMgPSBTUExJTkVfU1JDMjsKLQkJYnJlYWs7Ci0JY2FzZSBTUkNfSU5fTE8zOgotCQlyeF9wYXRoX2NmZ19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwOwotCQlzcmNfY2xrX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzJfQ0xLX1JTVF9DVExfMDsKLQkJc3JjX3BhaXJlZF9yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzA7Ci0JCXJ4X3BhdGhfY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX0NUTDsKLQkJc3BsX3NyYyA9IFNQTElORV9TUkMyOwotCQlicmVhazsKLQljYXNlIFNSQ19JTl9TUEtSUjoKLQkJcnhfcGF0aF9jZmdfcmVnID0gV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ0ZHMDsKLQkJc3JjX2Nsa19yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMzX0NMS19SU1RfQ1RMXzA7Ci0JCXNyY19wYWlyZWRfcmVnID0gV0NEOTMzNV9TUExJTkVfU1JDMl9DTEtfUlNUX0NUTF8wOwotCQlyeF9wYXRoX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEw7Ci0JCXNwbF9zcmMgPSBTUExJTkVfU1JDMzsKLQkJYnJlYWs7Ci0JY2FzZSBTUkNfSU5fTE80OgotCQlyeF9wYXRoX2NmZ19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DRkcwOwotCQlzcmNfY2xrX3JlZyA9IFdDRDkzMzVfU1BMSU5FX1NSQzNfQ0xLX1JTVF9DVExfMDsKLQkJc3JjX3BhaXJlZF9yZWcgPSBXQ0Q5MzM1X1NQTElORV9TUkMyX0NMS19SU1RfQ1RMXzA7Ci0JCXJ4X3BhdGhfY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTDsKLQkJc3BsX3NyYyA9IFNQTElORV9TUkMzOwotCQlicmVhazsKLQl9OwotCi0Jc3JjX3VzZXJzID0gJnRhc2hhLT5zcGxfc3JjX3VzZXJzW3NwbF9zcmNdOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCWNvdW50ID0gKnNyY191c2VyczsKLQkJY291bnQrKzsKLQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBzcmNfY2xrX3JlZykgJiAweDAyKSB8fAotCQkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIHNyY19wYWlyZWRfcmVnKSAmIDB4MDIpKSB7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgc3JjX2Nsa19yZWcsIDB4MDIsCi0JCQkJCQkgICAgMHgwMCk7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgc3JjX3BhaXJlZF9yZWcsCi0JCQkJCQkgICAgMHgwMiwgMHgwMCk7Ci0JCQl9Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzcmNfY2xrX3JlZywJMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2NmZ19yZWcsIDB4ODAsCi0JCQkJCSAgICAweDgwKTsKLQkJfQotCQkqc3JjX3VzZXJzID0gY291bnQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQljb3VudCA9ICpzcmNfdXNlcnM7Ci0JCWNvdW50LS07Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByeF9wYXRoX2NmZ19yZWcsIDB4ODAsCi0JCQkJCSAgICAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHNyY19jbGtfcmVnLCAweDAzLCAweDAyKTsKLQkJCS8qIGRlZmF1bHQgc2FtcGxlIHJhdGUgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJ4X3BhdGhfY3RsX3JlZywgMHgwZiwKLQkJCQkJICAgIDB4MDQpOwotCQl9Ci0JCSpzcmNfdXNlcnMgPSBjb3VudDsKLQkJYnJlYWs7Ci0JfTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBTcGxpbmUgU1JDJWQsIHVzZXJzOiAlZFxuIiwKLQkJX19mdW5jX18sIHNwbF9zcmMsICpzcmNfdXNlcnMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfcmVzYW1wbGVyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCWludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JaW50IHJldCA9IDA7Ci0JdTggc3JjX2luOwotCi0Jc3JjX2luID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NQTElORV9TUkNfQ0ZHMCk7Ci0JaWYgKCEoc3JjX2luICYgMHhGRikpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFNwbGluZSBTUkMldSBpbnB1dCBub3Qgc2VsZWN0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgdy0+c2hpZnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKHctPnNoaWZ0KSB7Ci0JY2FzZSBTUExJTkVfU1JDMDoKLQkJcmV0ID0gdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9zcmMoY29kZWMsCi0JCQkoKHNyY19pbiAmIDB4MDMpID09IDEpID8gU1JDX0lOX0hQSEwgOiBTUkNfSU5fTE8xLAotCQkJZXZlbnQpOwotCQlicmVhazsKLQljYXNlIFNQTElORV9TUkMxOgotCQlyZXQgPSB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3NyYyhjb2RlYywKLQkJCSgoc3JjX2luICYgMHgwQykgPT0gNCkgPyBTUkNfSU5fSFBIUiA6IFNSQ19JTl9MTzIsCi0JCQlldmVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU1BMSU5FX1NSQzI6Ci0JCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfc3JjKGNvZGVjLAotCQkJKChzcmNfaW4gJiAweDMwKSA9PSAweDEwKSA/IFNSQ19JTl9MTzMgOiBTUkNfSU5fU1BLUkwsCi0JCQlldmVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU1BMSU5FX1NSQzM6Ci0JCXJldCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfc3JjKGNvZGVjLAotCQkJKChzcmNfaW4gJiAweEMwKSA9PSAweDQwKSA/IFNSQ19JTl9MTzQgOiBTUkNfSU5fU1BLUlIsCi0JCQlldmVudCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHNwbGluZSBzcmM6JXVcbiIsIF9fZnVuY19fLAotCQkJdy0+c2hpZnQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zd3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQlpbnQgaSwgY2hfY250OwotCi0JdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmICghdGFzaGEtPm5yKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDdfIiwgc2l6ZW9mKCJSWCBJTlQ3XyIpKSkgJiYKLQkJICAgICF0YXNoYS0+cnhfN19jb3VudCkKLQkJCXRhc2hhLT5yeF83X2NvdW50Kys7Ci0JCWlmICgoc3RybnN0cih3LT5uYW1lLCAiSU5UOF8iLCBzaXplb2YoIlJYIElOVDhfIikpKSAmJgotCQkgICAgIXRhc2hhLT5yeF84X2NvdW50KQotCQkJdGFzaGEtPnJ4XzhfY291bnQrKzsKLQkJY2hfY250ID0gdGFzaGEtPnJ4XzdfY291bnQgKyB0YXNoYS0+cnhfOF9jb3VudDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdGFzaGEtPm5yOyBpKyspIHsKLQkJCXN3cm1fd2NkX25vdGlmeSh0YXNoYS0+c3dyX2N0cmxfZGF0YVtpXS5zd3JfcGRldiwKLQkJCQkJU1dSX0RFVklDRV9VUCwgTlVMTCk7Ci0JCQlzd3JtX3djZF9ub3RpZnkodGFzaGEtPnN3cl9jdHJsX2RhdGFbaV0uc3dyX3BkZXYsCi0JCQkJCVNXUl9TRVRfTlVNX1JYX0NILCAmY2hfY250KTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKChzdHJuc3RyKHctPm5hbWUsICJJTlQ3XyIsIHNpemVvZigiUlggSU5UN18iKSkpICYmCi0JCSAgICB0YXNoYS0+cnhfN19jb3VudCkKLQkJCXRhc2hhLT5yeF83X2NvdW50LS07Ci0JCWlmICgoc3RybnN0cih3LT5uYW1lLCAiSU5UOF8iLCBzaXplb2YoIlJYIElOVDhfIikpKSAmJgotCQkgICAgdGFzaGEtPnJ4XzhfY291bnQpCi0JCQl0YXNoYS0+cnhfOF9jb3VudC0tOwotCQljaF9jbnQgPSB0YXNoYS0+cnhfN19jb3VudCArIHRhc2hhLT5yeF84X2NvdW50OwotCi0JCWZvciAoaSA9IDA7IGkgPCB0YXNoYS0+bnI7IGkrKykKLQkJCXN3cm1fd2NkX25vdGlmeSh0YXNoYS0+c3dyX2N0cmxfZGF0YVtpXS5zd3JfcGRldiwKLQkJCQkJU1dSX1NFVF9OVU1fUlhfQ0gsICZjaF9jbnQpOwotCi0JCWJyZWFrOwotCX0KLQlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogY3VycmVudCBzd3IgY2ggY250OiAlZFxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5yeF83X2NvdW50ICsgdGFzaGEtPnJ4XzhfY291bnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfY29uZmlnX2Vhcl9zcGtyX2dhaW4oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgaW50IGV2ZW50LCBpbnQgZ2Fpbl9yZWcpCi17Ci0JaW50IGNvbXBfZ2Fpbl9vZmZzZXQsIHZhbDsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAodGFzaGEtPnNwa3JfbW9kZSkgewotCS8qIENvbXBhbmRlciBnYWluIGluIFNQS1JfTU9ERTEgY2FzZSBpcyAxMiBkQiAqLwotCWNhc2UgU1BLUl9NT0RFXzE6Ci0JCWNvbXBfZ2Fpbl9vZmZzZXQgPSAtMTI7Ci0JCWJyZWFrOwotCS8qIERlZmF1bHQgY2FzZSBjb21wYW5kZXIgZ2FpbiBpcyAxNSBkQiAqLwotCWRlZmF1bHQ6Ci0JCWNvbXBfZ2Fpbl9vZmZzZXQgPSAtMTU7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJLyogQXBwbHkgZWFyIHNwa3IgZ2FpbiBvbmx5IGlmIGNvbXBhbmRlciBpcyBlbmFibGVkICovCi0JCWlmICh0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSAmJgotCQkgICAgKGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8Ci0JCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMKSAmJgotCQkgICAgKHRhc2hhLT5lYXJfc3Brcl9nYWluICE9IDApKSB7Ci0JCQkvKiBGb3IgZXhhbXBsZSwgdmFsIGlzIC04KC0xMis1LTEpIGZvciA0ZEIgb2YgZ2FpbiAqLwotCQkJdmFsID0gY29tcF9nYWluX29mZnNldCArIHRhc2hhLT5lYXJfc3Brcl9nYWluIC0gMTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCi0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlg3IFZvbHVtZSAlZCBkQlxuIiwKLQkJCQlfX2Z1bmNfXywgdmFsKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJLyoKLQkJICogUmVzZXQgUlg3IHZvbHVtZSB0byAwIGRCIGlmIGNvbXBhbmRlciBpcyBlbmFibGVkIGFuZAotCQkgKiBlYXJfc3Brcl9nYWluIGlzIG5vbi16ZXJvLgotCQkgKi8KLQkJaWYgKHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9DVEwgfHwKLQkJICAgICBnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwpICYmCi0JCSAgICAodGFzaGEtPmVhcl9zcGtyX2dhaW4gIT0gMCkpIHsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCAweDApOwotCi0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUmVzZXQgUlg3IFZvbHVtZSB0byAwIGRCXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBnYWluX3JlZzsKLQlpbnQgb2Zmc2V0X3ZhbCA9IDA7Ci0JaW50IHZhbCA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlZCAlc1xuIiwgX19mdW5jX18sIGV2ZW50LCB3LT5uYW1lKTsKLQotCXN3aXRjaCAody0+cmVnKSB7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMOgotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IE5vIGdhaW4gcmVnaXN0ZXIgYXZhaWwgZm9yICVzXG4iLAotCQkJX19mdW5jX18sIHctPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9OwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlpZiAoKHRhc2hhLT5zcGtyX2dhaW5fb2Zmc2V0ID09IFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAodGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKLQkJICAgICB0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKLQkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwgfHwKLQkJICAgICBnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX01JWF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKLQkJCQkJICAgIDB4MDEsIDB4MDEpOwotCQkJb2Zmc2V0X3ZhbCA9IC0yOwotCQl9Ci0JCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZ2Fpbl9yZWcpOwotCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKLQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7Ci0JCXRhc2hhX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKCh0YXNoYS0+c3Brcl9nYWluX29mZnNldCA9PSBSWF9HQUlOX09GRlNFVF9NMVA1X0RCKSAmJgotCQkgICAgKHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddIHx8Ci0JCSAgICAgdGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfOF0pICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMIHx8Ci0JCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCW9mZnNldF92YWwgPSAyOwotCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBnYWluX3JlZyk7Ci0JCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCQl9Ci0JCXRhc2hhX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXNoYV9jZGNfbmF0aXZlX2Nsa19lbmFibGUoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLAotCQkJCQkgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOwotCi0JaWYgKCF0YXNoYS0+d2NkX25hdGl2ZV9jbGspIHsKLQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IHdjZCBuYXRpdmUgY2xvY2sgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogbmF0aXZlX2Nsa19lbmFibGUgPSAldVxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0YXNoYS0+d2NkX25hdGl2ZV9jbGspOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHRhc2hhLT5kZXYsICIlczogbmF0aXZlIGNsayBlbmFibGUgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWlmICgrK3Rhc2hhLT5uYXRpdmVfY2xrX3VzZXJzID09IDEpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwsCi0JCQkJCSAgICAweDgwLCAweDgwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19HQVRFLAotCQkJCQkgICAgMHgwNCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAotCQkJCQkweDAyLCAweDAyKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICh0YXNoYS0+bmF0aXZlX2Nsa191c2VycyAmJgotCQkgICAgKC0tdGFzaGEtPm5hdGl2ZV9jbGtfdXNlcnMgPT0gMCkpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wsCi0JCQkJCTB4MDIsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX0dBVEUsCi0JCQkJCSAgICAweDA0LCAweDA0KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwsCi0JCQkJCSAgICAweDgwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0xPQ0tfVEVTVF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJfQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUodGFzaGEtPndjZF9uYXRpdmVfY2xrKTsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbmF0aXZlX2Nsa191c2VyczogJWRcbiIsIF9fZnVuY19fLAotCQl0YXNoYS0+bmF0aXZlX2Nsa191c2Vycyk7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19nZXRfbmF0aXZlX2ZpZm9fc3luY19tYXNrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJCSBpbnQgaW50ZXJwX24pCi17Ci0JaW50IG1hc2sgPSAwOwotCXUxNiByZWc7Ci0JdTggdmFsMSwgdmFsMiwgaW5wMCA9IDA7Ci0JdTggaW5wMSA9IDAsIGlucDIgPSAwOwotCi0JcmVnID0gV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAgKyAoMiAqIGludGVycF9uKSAtIDI7Ci0KLQl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOwotCXZhbDIgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyArIDEpOwotCi0JaW5wMCA9IHZhbDEgJiAweDBGOwotCWlucDEgPSAodmFsMSA+PiA0KSAmIDB4MEY7Ci0JaW5wMiA9ICh2YWwyID4+IDQpICYgMHgwRjsKLQotCWlmIChJU19WQUxJRF9OQVRJVkVfRklGT19QT1JUKGlucDApKQotCQltYXNrIHw9ICgxIDw8IChpbnAwIC0gNSkpOwotCWlmIChJU19WQUxJRF9OQVRJVkVfRklGT19QT1JUKGlucDEpKQotCQltYXNrIHw9ICgxIDw8IChpbnAxIC0gNSkpOwotCWlmIChJU19WQUxJRF9OQVRJVkVfRklGT19QT1JUKGlucDIpKQotCQltYXNrIHw9ICgxIDw8IChpbnAyIC0gNSkpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG5hdGl2ZSBmaWZvIG1hc2s6IDB4JXhcbiIsIF9fZnVuY19fLCBtYXNrKTsKLQlpZiAoIW1hc2spCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIm5hdGl2ZSBmaWZvIGVycixpbnQ6JWQsaW5wMDolZCxpbnAxOiVkLGlucDI6JWRcbiIsCi0JCQlpbnRlcnBfbiwgaW5wMCwgaW5wMSwgaW5wMik7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHkoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlpbnQgbWFzazsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTE2IGludGVycF9yZWc7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQ6ICVkLCBzaGlmdDolZFxuIiwgX19mdW5jX18sIGV2ZW50LAotCQl3LT5zaGlmdCk7Ci0KLQlpZiAody0+c2hpZnQgPCBJTlRFUlBfSFBITCB8fCB3LT5zaGlmdCA+IElOVEVSUF9MTzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW50ZXJwX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NUTCArIDIwICogKHctPnNoaWZ0IC0gMSk7Ci0KLQltYXNrID0gdGFzaGFfY29kZWNfZ2V0X25hdGl2ZV9maWZvX3N5bmNfbWFzayhjb2RlYywgdy0+c2hpZnQpOwotCWlmICghbWFzaykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJLyogQWRqdXN0IGludGVycG9sYXRvciByYXRlIHRvIDQ0UDFfTkFUSVZFICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludGVycF9yZWcsIDB4MEYsIDB4MDkpOwotCQlfX3Rhc2hhX2NkY19uYXRpdmVfY2xrX2VuYWJsZSh0YXNoYSwgdHJ1ZSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1lOQywKLQkJCQkgICAgbWFzaywgbWFzayk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfREFUQV9IVUJfTkFUSVZFX0ZJRk9fU1lOQywKLQkJCQkgICAgbWFzaywgMHgwKTsKLQkJX190YXNoYV9jZGNfbmF0aXZlX2Nsa19lbmFibGUodGFzaGEsIGZhbHNlKTsKLQkJLyogQWRqdXN0IGludGVycG9sYXRvciByYXRlIHRvIGRlZmF1bHQgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaW50ZXJwX3JlZywgMHgwRiwgMHgwNCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBnYWluX3JlZzsKLQl1MTYgcmVnOwotCWludCB2YWw7Ci0JaW50IG9mZnNldF92YWwgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWQgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7Ci0KLQlpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDAgSU5URVJQIikpKSB7Ci0JCXJlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTDsKLQkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX0NUTDsKLQl9IGVsc2UgaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQxIElOVEVSUCIpKSkgewotCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEw7Ci0JCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1ZPTF9DVEw7Ci0JfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UMiBJTlRFUlAiKSkpIHsKLQkJcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ1RMOwotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfQ1RMOwotCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDMgSU5URVJQIikpKSB7Ci0JCXJlZyA9IFdDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX0NUTDsKLQkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX0NUTDsKLQl9IGVsc2UgaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQ0IElOVEVSUCIpKSkgewotCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEw7Ci0JCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlg0X1JYX1ZPTF9DVEw7Ci0JfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNSBJTlRFUlAiKSkpIHsKLQkJcmVnID0gV0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfQ1RMOwotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYNV9SWF9WT0xfQ1RMOwotCX0gZWxzZSBpZiAoIShzdHJjbXAody0+bmFtZSwgIlJYIElOVDYgSU5URVJQIikpKSB7Ci0JCXJlZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NUTDsKLQkJZ2Fpbl9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX0NUTDsKLQl9IGVsc2UgaWYgKCEoc3RyY21wKHctPm5hbWUsICJSWCBJTlQ3IElOVEVSUCIpKSkgewotCQlyZWcgPSBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEw7Ci0JCWdhaW5fcmVnID0gV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9DVEw7Ci0JfSBlbHNlIGlmICghKHN0cmNtcCh3LT5uYW1lLCAiUlggSU5UOCBJTlRFUlAiKSkpIHsKLQkJcmVnID0gV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfQ1RMOwotCQlnYWluX3JlZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfQ1RMOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnRlcnBvbGF0b3IgcmVnIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCB0cnVlKTsKLQkJLyogUmVzZXQgaWYgbmVlZGVkICovCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9wcmltX2ludGVycG9sYXRvcihjb2RlYywgcmVnLCBldmVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQl0YXNoYV9jb25maWdfY29tcGFuZGVyKGNvZGVjLCB3LT5zaGlmdCwgZXZlbnQpOwotCQkvKiBhcHBseSBnYWluIGFmdGVyIGludCBjbGsgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHRhc2hhLT5zcGtyX2dhaW5fb2Zmc2V0ID09IFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAodGFzaGEtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKLQkJICAgICB0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKLQkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX0NUTCB8fAotCQkgICAgIGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfQ1RMKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfU0VDMSwKLQkJCQkJICAgIDB4MDEsIDB4MDEpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCW9mZnNldF92YWwgPSAtMjsKLQkJfQotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKLQkJdmFsICs9IG9mZnNldF92YWw7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCQl0YXNoYV9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXRhc2hhX2NvbmZpZ19jb21wYW5kZXIoY29kZWMsIHctPnNoaWZ0LCBldmVudCk7Ci0JCXRhc2hhX2NvZGVjX2VuYWJsZV9wcmltX2ludGVycG9sYXRvcihjb2RlYywgcmVnLCBldmVudCk7Ci0JCWlmICgodGFzaGEtPnNwa3JfZ2Fpbl9vZmZzZXQgPT0gUlhfR0FJTl9PRkZTRVRfTTFQNV9EQikgJiYKLQkJICAgICh0YXNoYS0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSB8fAotCQkgICAgIHRhc2hhLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzhdKSAmJgotCQkgICAgKGdhaW5fcmVnID09IFdDRDkzMzVfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8Ci0JCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTMzNV9DRENfUlg4X1JYX1ZPTF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJb2Zmc2V0X3ZhbCA9IDI7Ci0JCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKLQkJCXZhbCArPSBvZmZzZXRfdmFsOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7Ci0JCX0KLQkJdGFzaGFfY29kZWNfY29uZmlnX2Vhcl9zcGtyX2dhaW4oY29kZWMsIGV2ZW50LCBnYWluX3JlZyk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19zZXRfaWlyX2dhaW4oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWlmIChzdHJuc3RyKHctPm5hbWUsICJJSVIwIiwgc2l6ZW9mKCJJSVIwIikpKSB7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLAotCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCkpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IyX0NUTCwKLQkJCQlzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMl9DVEwpKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwsCi0JCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLAotCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCkpOwotCQl9IGVsc2UgewotCQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCwKLQkJCQlzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMV9DVEwpKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMl9DVEwsCi0JCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLAotCQkJCXNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQlXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IzX0NUTCkpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfb25fZGVtYW5kX3N1cHBseSgKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgb25fZGVtYW5kX3N1cHBseSAqc3VwcGx5OwotCi0JaWYgKHctPnNoaWZ0ID49IE9OX0RFTUFORF9TVVBQTElFU19NQVgpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGVycm9yIGluZGV4ID4gTUFYIERlbWFuZCBzdXBwbGllcyIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzdXBwbHk6ICVzIGV2ZW50OiAlZFxuIiwKLQkJX19mdW5jX18sIG9uX2RlbWFuZF9zdXBwbHlfbmFtZVt3LT5zaGlmdF0sIGV2ZW50KTsKLQotCXN1cHBseSA9ICZ0YXNoYS0+b25fZGVtYW5kX2xpc3Rbdy0+c2hpZnRdOwotCVdBUk5fT05DRSghc3VwcGx5LT5zdXBwbHksICIlcyBpc24ndCBkZWZpbmVkXG4iLAotCQlvbl9kZW1hbmRfc3VwcGx5X25hbWVbdy0+c2hpZnRdKTsKLQlpZiAoIXN1cHBseS0+c3VwcGx5KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlcnIgc3VwcGx5IG5vdCBwcmVzZW50IG9uZCBmb3IgJWQiLAotCQkJX19mdW5jX18sIHctPnNoaWZ0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3VwcGx5LT5zdXBwbHkpOwotCQlpZiAocmV0KQotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgJXNcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShzdXBwbHktPnN1cHBseSk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGRpc2FibGUgJXNcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW3ctPnNoaWZ0XSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIGludCBhZGNfbXV4X24pCi17Ci0JdTE2IG1hc2ssIHNoaWZ0LCBhZGNfbXV4X2luX3JlZzsKLQl1MTYgYW1pY19tdXhfc2VsX3JlZzsKLQlib29sIGlzX2FtaWM7Ci0KLQlpZiAoYWRjX211eF9uIDwgMCB8fCBhZGNfbXV4X24gPiBXQ0Q5MzM1X01BWF9WQUxJRF9BRENfTVVYIHx8Ci0JICAgIGFkY19tdXhfbiA9PSBXQ0Q5MzM1X0lOVkFMSURfQURDX01VWCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayB3aGV0aGVyIGFkYyBtdXggaW5wdXQgaXMgQU1JQyBvciBETUlDICovCi0JaWYgKGFkY19tdXhfbiA8IDQpIHsKLQkJYWRjX211eF9pbl9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEgKwotCQkJCSAyICogYWRjX211eF9uOwotCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwICsKLQkJCQkgICAyICogYWRjX211eF9uOwotCQltYXNrID0gMHgwMzsKLQkJc2hpZnQgPSAwOwotCX0gZWxzZSB7Ci0JCWFkY19tdXhfaW5fcmVnID0gV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKLQkJCQkgYWRjX211eF9uIC0gNDsKLQkJYW1pY19tdXhfc2VsX3JlZyA9IGFkY19tdXhfaW5fcmVnOwotCQltYXNrID0gMHhDMDsKLQkJc2hpZnQgPSA2OwotCX0KLQlpc19hbWljID0gKCgoc25kX3NvY19yZWFkKGNvZGVjLCBhZGNfbXV4X2luX3JlZykgJiBtYXNrKSA+PiBzaGlmdCkKLQkJICAgID09IDEpOwotCWlmICghaXNfYW1pYykKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gc25kX3NvY19yZWFkKGNvZGVjLCBhbWljX211eF9zZWxfcmVnKSAmIDB4MDc7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NvZGVjX3NldF90eF9ob2xkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgdTE2IGFtaWNfcmVnLCBib29sIHNldCkKLXsKLQl1OCBtYXNrID0gMHgyMDsKLQl1OCB2YWw7Ci0KLQlpZiAoYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzEgfHwKLQkgICAgYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzMgfHwKLQkgICAgYW1pY19yZWcgPT0gV0NEOTMzNV9BTkFfQU1JQzUpCi0JCW1hc2sgPSAweDQwOwotCi0JdmFsID0gc2V0ID8gbWFzayA6IDB4MDA7Ci0KLQlzd2l0Y2ggKGFtaWNfcmVnKSB7Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDMToKLQljYXNlIFdDRDkzMzVfQU5BX0FNSUMyOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDMiwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDMzoKLQljYXNlIFdDRDkzMzVfQU5BX0FNSUM0OgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNCwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0Q5MzM1X0FOQV9BTUlDNToKLQljYXNlIFdDRDkzMzVfQU5BX0FNSUM2OgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9BTUlDNiwgbWFzaywgdmFsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGludmFsaWQgYW1pYzogJWRcbiIsCi0JCQlfX2Z1bmNfXywgYW1pY19yZWcpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfdHhfYWRjX2NmZyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0JaW50IGFkY19tdXhfbiA9IHctPnNoaWZ0OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgYW1pY19uOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50OiAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJYW1pY19uID0gdGFzaGFfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBhZGNfbXV4X24pOwotCQlpZiAoYW1pY19uKSB7Ci0JCQkvKgotCQkJICogUHJldmVudCBBTkMgUnggcG9wIGJ5IGxlYXZpbmcgVHggRkUgaW4gSE9MRAotCQkJICogc3RhdGUgdW50aWwgUEEgaXMgdXAuIFRyYWNrIEFNSUMgYmVpbmcgdXNlZAotCQkJICogc28gd2UgY2FuIHJlbGVhc2UgdGhlIEhPTEQgbGF0ZXIuCi0JCQkgKi8KLQkJCXNldF9iaXQoQU5DX01JQ19BTUlDMSArIGFtaWNfbiAtIDEsCi0JCQkJJnRhc2hhLT5zdGF0dXNfbWFzayk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MTYgdGFzaGFfY29kZWNfZ2V0X2FtaWNfcHdsdmxfcmVnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGFtaWMpCi17Ci0JdTE2IHB3cl9sZXZlbF9yZWcgPSAwOwotCi0Jc3dpdGNoIChhbWljKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJcHdyX2xldmVsX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxOwotCQlicmVhazsKLQotCWNhc2UgMzoKLQljYXNlIDQ6Ci0JCXB3cl9sZXZlbF9yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMzsKLQkJYnJlYWs7Ci0KLQljYXNlIDU6Ci0JY2FzZSA2OgotCQlwd3JfbGV2ZWxfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIGFtaWM6ICVkXG4iLAotCQkJX19mdW5jX18sIGFtaWMpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcHdyX2xldmVsX3JlZzsKLX0KLQotI2RlZmluZSAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLCTB4NjAKLSNkZWZpbmUgIENGX01JTl8zREJfNEhaCQkJMHgwCi0jZGVmaW5lICBDRl9NSU5fM0RCXzc1SFoJCTB4MQotI2RlZmluZSAgQ0ZfTUlOXzNEQl8xNTBIWgkJMHgyCi0KLXN0YXRpYyB2b2lkIHRhc2hhX3R4X2hwZl9jb3JuZXJfZnJlcV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqaHBmX2RlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgaHBmX3dvcmsgKmhwZl93b3JrOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTE2IGRlY19jZmdfcmVnLCBhbWljX3JlZzsKLQl1OCBocGZfY3V0X29mZl9mcmVxOwotCWludCBhbWljX247Ci0KLQlocGZfZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCWhwZl93b3JrID0gY29udGFpbmVyX29mKGhwZl9kZWxheWVkX3dvcmssIHN0cnVjdCBocGZfd29yaywgZHdvcmspOwotCXRhc2hhID0gaHBmX3dvcmstPnRhc2hhOwotCWNvZGVjID0gdGFzaGEtPmNvZGVjOwotCWhwZl9jdXRfb2ZmX2ZyZXEgPSBocGZfd29yay0+aHBmX2N1dF9vZmZfZnJlcTsKLQotCWRlY19jZmdfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogaHBmX3dvcmstPmRlY2ltYXRvcjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkZWNpbWF0b3IgJXUgaHBmX2N1dF9vZl9mcmVxIDB4JXhcbiIsCi0JCV9fZnVuY19fLCBocGZfd29yay0+ZGVjaW1hdG9yLCBocGZfY3V0X29mZl9mcmVxKTsKLQotCWFtaWNfbiA9IHRhc2hhX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChjb2RlYywgaHBmX3dvcmstPmRlY2ltYXRvcik7Ci0JaWYgKGFtaWNfbikgewotCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxICsgYW1pY19uIC0gMTsKLQkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQoY29kZWMsIGFtaWNfcmVnLCBmYWxzZSk7Ci0JfQotCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCB0cnVlKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLLAotCQkJICAgIGhwZl9jdXRfb2ZmX2ZyZXEgPDwgNSk7Ci0JdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoY29kZWMsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfdHhfbXV0ZV91cGRhdGVfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0eF9tdXRlX3dvcmsgKnR4X211dGVfZHdvcms7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yazsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTE2IHR4X3ZvbF9jdGxfcmVnLCBocGZfZ2F0ZV9yZWc7Ci0KLQlkZWxheWVkX3dvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Ci0JdHhfbXV0ZV9kd29yayA9IGNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCB0eF9tdXRlX3dvcmssIGR3b3JrKTsKLQl0YXNoYSA9IHR4X211dGVfZHdvcmstPnRhc2hhOwotCWNvZGVjID0gdGFzaGEtPmNvZGVjOwotCi0JdHhfdm9sX2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKwotCQkJCQkxNiAqIHR4X211dGVfZHdvcmstPmRlY2ltYXRvcjsKLQlocGZfZ2F0ZV9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9TRUMyICsKLQkJCQkJMTYgKiB0eF9tdXRlX2R3b3JrLT5kZWNpbWF0b3I7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBmX2dhdGVfcmVnLCAweDAxLCAweDAxKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgwMCk7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2RlYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQl1bnNpZ25lZCBpbnQgZGVjaW1hdG9yOwotCWNoYXIgKmRlY19hZGNfbXV4X25hbWUgPSBOVUxMOwotCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKLQljaGFyICp3bmFtZTsKLQlpbnQgcmV0ID0gMCwgYW1pY19uOwotCXUxNiB0eF92b2xfY3RsX3JlZywgcHdyX2xldmVsX3JlZyA9IDAsIGRlY19jZmdfcmVnLCBocGZfZ2F0ZV9yZWc7Ci0JdTE2IHR4X2dhaW5fY3RsX3JlZzsKLQljaGFyICpkZWM7Ci0JdTggaHBmX2N1dF9vZmZfZnJlcTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jd2lkZ2V0X25hbWUgPSBrc3RybmR1cCh3LT5uYW1lLCAxNSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3aWRnZXRfbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl3bmFtZSA9IHdpZGdldF9uYW1lOwotCWRlY19hZGNfbXV4X25hbWUgPSBzdHJzZXAoJndpZGdldF9uYW1lLCAiICIpOwotCWlmICghZGVjX2FkY19tdXhfbmFtZSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCB3LT5uYW1lKTsKLQkJcmV0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlkZWNfYWRjX211eF9uYW1lID0gd2lkZ2V0X25hbWU7Ci0KLQlkZWMgPSBzdHJwYnJrKGRlY19hZGNfbXV4X25hbWUsICIwMTIzNDU2NzgiKTsKLQlpZiAoIWRlYykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZGVjaW1hdG9yIGluZGV4IG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGtzdHJ0b3VpbnQoZGVjLCAxMCwgJmRlY2ltYXRvcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgd25hbWUpOwotCQlyZXQgPSAgLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMoKTogd2lkZ2V0ID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAotCQkJdy0+bmFtZSwgZGVjaW1hdG9yKTsKLQotCXR4X3ZvbF9jdGxfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ1RMICsgMTYgKiBkZWNpbWF0b3I7Ci0JaHBmX2dhdGVfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDMiArIDE2ICogZGVjaW1hdG9yOwotCWRlY19jZmdfcmVnID0gV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogZGVjaW1hdG9yOwotCXR4X2dhaW5fY3RsX3JlZyA9IFdDRDkzMzVfQ0RDX1RYMF9UWF9WT0xfQ1RMICsgMTYgKiBkZWNpbWF0b3I7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJYW1pY19uID0gdGFzaGFfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBkZWNpbWF0b3IpOwotCQlpZiAoYW1pY19uKQotCQkJcHdyX2xldmVsX3JlZyA9IHRhc2hhX2NvZGVjX2dldF9hbWljX3B3bHZsX3JlZyhjb2RlYywKLQkJCQkJCQkJICAgICAgIGFtaWNfbik7Ci0KLQkJaWYgKHB3cl9sZXZlbF9yZWcpIHsKLQkJCXN3aXRjaCAoKHNuZF9zb2NfcmVhZChjb2RlYywgcHdyX2xldmVsX3JlZykgJgotCQkJCQkgICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLKSA+PgotCQkJCQkgICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVCkgewotCQkJY2FzZSBXQ0Q5MzM1X0FNSUNfUFdSX0xFVkVMX0xQOgotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCQkJICAgIFdDRDkzMzVfREVDX1BXUl9MVkxfTUFTSywKLQkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0xQKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBXQ0Q5MzM1X0FNSUNfUFdSX0xFVkVMX0hQOgotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCQkJICAgIFdDRDkzMzVfREVDX1BXUl9MVkxfTUFTSywKLQkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX0hQKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0NEOTMzNV9BTUlDX1BXUl9MRVZFTF9ERUZBVUxUOgotCQkJZGVmYXVsdDoKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKLQkJCQkJCSAgICBXQ0Q5MzM1X0RFQ19QV1JfTFZMX01BU0ssCi0JCQkJCQkgICAgV0NEOTMzNV9ERUNfUFdSX0xWTF9ERik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaHBmX2N1dF9vZmZfZnJlcSA9IChzbmRfc29jX3JlYWQoY29kZWMsIGRlY19jZmdfcmVnKSAmCi0JCQkJICAgVFhfSFBGX0NVVF9PRkZfRlJFUV9NQVNLKSA+PiA1OwotCQl0YXNoYS0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxID0KLQkJCQkJCQlocGZfY3V0X29mZl9mcmVxOwotCi0JCWlmIChocGZfY3V0X29mZl9mcmVxICE9IENGX01JTl8zREJfMTUwSFopCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKLQkJCQkJICAgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSywKLQkJCQkJICAgIENGX01JTl8zREJfMTUwSFogPDwgNSk7Ci0JCS8qIEVuYWJsZSBUWCBQR0EgTXV0ZSAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgxMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGZfZ2F0ZV9yZWcsIDB4MDEsIDB4MDApOwotCi0JCWlmIChkZWNpbWF0b3IgPT0gMCkgewotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfUkFNUF9DVEwsIDB4ODMpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfUkFNUF9DVEwsIDB4QTMpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfUkFNUF9DVEwsIDB4ODMpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9NQkhDX1pERVRfUkFNUF9DVEwsIDB4MDMpOwotCQl9Ci0JCS8qIHNjaGVkdWxlIHdvcmsgcXVldWUgdG8gUmVtb3ZlIE11dGUgKi8KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXNoYS0+dHhfbXV0ZV9kd29ya1tkZWNpbWF0b3JdLmR3b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHhfdW5tdXRlX2RlbGF5KSk7Ci0JCWlmICh0YXNoYS0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxICE9Ci0JCQkJCQkJQ0ZfTUlOXzNEQl8xNTBIWikKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygKLQkJCQkJJnRhc2hhLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmR3b3JrLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDMwMCkpOwotCQkvKiBhcHBseSBnYWluIGFmdGVyIGRlY2ltYXRvciBpcyBlbmFibGVkICovCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHR4X2dhaW5fY3RsX3JlZywKLQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgdHhfZ2Fpbl9jdGxfcmVnKSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWhwZl9jdXRfb2ZmX2ZyZXEgPQotCQkJdGFzaGEtPnR4X2hwZl93b3JrW2RlY2ltYXRvcl0uaHBmX2N1dF9vZmZfZnJlcTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfdm9sX2N0bF9yZWcsIDB4MTAsIDB4MTApOwotCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAotCQkgICAgJnRhc2hhLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmR3b3JrKSkgewotCQkJaWYgKGhwZl9jdXRfb2ZmX2ZyZXEgIT0gQ0ZfTUlOXzNEQl8xNTBIWikgewotCQkJCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGNvZGVjLCB0cnVlKTsKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKLQkJCQkJCSAgICBUWF9IUEZfQ1VUX09GRl9GUkVRX01BU0ssCi0JCQkJCQkgICAgaHBmX2N1dF9vZmZfZnJlcSA8PCA1KTsKLQkJCQl0YXNoYV9jb2RlY192b3RlX21heF9idyhjb2RlYywgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKLQkJCQkmdGFzaGEtPnR4X211dGVfZHdvcmtbZGVjaW1hdG9yXS5kd29yayk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgwMCk7Ci0JCWJyZWFrOwotCX07Ci1vdXQ6Ci0Ja2ZyZWUod25hbWUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1MzIgdGFzaGFfZ2V0X2RtaWNfc2FtcGxlX3JhdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCXVuc2lnbmVkIGludCBkbWljLCBzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEpCi17Ci0JdTggdHhfc3RyZWFtX2ZzOwotCXU4IGFkY19tdXhfaW5kZXggPSAwLCBhZGNfbXV4X3NlbCA9IDA7Ci0JYm9vbCBkZWNfZm91bmQgPSBmYWxzZTsKLQl1MTYgYWRjX211eF9jdGxfcmVnLCB0eF9mc19yZWc7Ci0JdTMyIGRtaWNfZnM7Ci0KLQl3aGlsZSAoZGVjX2ZvdW5kID09IDAgJiYgYWRjX211eF9pbmRleCA8IFdDRDkzMzVfTUFYX1ZBTElEX0FEQ19NVVgpIHsKLQkJaWYgKGFkY19tdXhfaW5kZXggPCA0KSB7Ci0JCQlhZGNfbXV4X2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgKwotCQkJCQkJKGFkY19tdXhfaW5kZXggKiAyKTsKLQkJCWFkY19tdXhfc2VsID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfY3RsX3JlZykgJgotCQkJCQkJMHg3OCkgPj4gMykgLSAxOwotCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPCA5KSB7Ci0JCQlhZGNfbXV4X2N0bF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAgKwotCQkJCQkJKChhZGNfbXV4X2luZGV4IC0gNCkgKiAxKTsKLQkJCWFkY19tdXhfc2VsID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfY3RsX3JlZykgJgotCQkJCQkJMHgzOCkgPj4gMykgLSAxOwotCQl9IGVsc2UgaWYgKGFkY19tdXhfaW5kZXggPT0gOSkgewotCQkJKythZGNfbXV4X2luZGV4OwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGFkY19tdXhfc2VsID09IGRtaWMpCi0JCQlkZWNfZm91bmQgPSB0cnVlOwotCQllbHNlCi0JCQkrK2FkY19tdXhfaW5kZXg7Ci0JfQotCi0JaWYgKGRlY19mb3VuZCA9PSB0cnVlICYmIGFkY19tdXhfaW5kZXggPD0gOCkgewotCQl0eF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKyAoMTYgKiBhZGNfbXV4X2luZGV4KTsKLQkJdHhfc3RyZWFtX2ZzID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9mc19yZWcpICYgMHgwRjsKLQkJZG1pY19mcyA9IHR4X3N0cmVhbV9mcyA8PSA0ID8gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzJQNE1IWiA6Ci0JCQkJCVdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDhNSFo7Ci0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIEVDUFAgcGF0aCBzZWxlY3Rpb24gYW5kIERFQzEgbm90IGNvbm5lY3RlZCB0bwotCQkgKiBhbnkgb3RoZXIgYXVkaW8gcGF0aCB0byBhcHBseSBFQ1BQIERNSUMgc2FtcGxlIHJhdGUKLQkJICovCi0JCWlmICgoYWRjX211eF9pbmRleCA9PSAxKSAmJgotCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1VTX0VDX01VWF9DRkcpCi0JCQkJICAgJiAweDBGKSA9PSAweDBBKSAmJgotCQkgICAgKChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCkKLQkJCQkgICAmIDB4MEMpID09IDB4MDApKSB7Ci0JCQlkbWljX2ZzID0gcGRhdGEtPmVjcHBfZG1pY19zYW1wbGVfcmF0ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRtaWNfZnMgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKLQl9Ci0KLQlyZXR1cm4gZG1pY19mczsKLX0KLQotc3RhdGljIHU4IHRhc2hhX2dldF9kbWljX2Nsa192YWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSB1MzIgbWNsa19yYXRlLCB1MzIgZG1pY19jbGtfcmF0ZSkKLXsKLQl1MzIgZGl2X2ZhY3RvcjsKLQl1OCBkbWljX2N0bF92YWw7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCSIlczogbWNsa19yYXRlID0gJWQsIGRtaWNfc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJX19mdW5jX18sIG1jbGtfcmF0ZSwgZG1pY19jbGtfcmF0ZSk7Ci0KLQkvKiBEZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yICovCi0JaWYgKG1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS185UDZNSFopCi0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzI7Ci0JZWxzZQotCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl8zOwotCi0JaWYgKGRtaWNfY2xrX3JhdGUgPT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IGRtaWNfc2FtcGxlX3JhdGUgY2Fubm90IGJlIDBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkaXZfZmFjdG9yID0gbWNsa19yYXRlIC8gZG1pY19jbGtfcmF0ZTsKLQlzd2l0Y2ggKGRpdl9mYWN0b3IpIHsKLQljYXNlIDI6Ci0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfMzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl80OwotCQlicmVhazsKLQljYXNlIDY6Ci0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzMzVfRE1JQ19DTEtfRElWXzY7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfODsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTMzNV9ETUlDX0NMS19ESVZfMTY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBkaXZfZmFjdG9yICV1LCBjbGtfcmF0ZSgldSksIGRtaWNfcmF0ZSgldSlcbiIsCi0JCQlfX2Z1bmNfXywgZGl2X2ZhY3RvciwgbWNsa19yYXRlLCBkbWljX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0JfQotCi1kb25lOgotCXJldHVybiBkbWljX2N0bF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX2FkYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQ6JWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJdGFzaGFfY29kZWNfc2V0X3R4X2hvbGQoY29kZWMsIHctPnJlZywgdHJ1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9kbWljKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JdTggIGRtaWNfY2xrX2VuID0gMHgwMTsKLQl1MTYgZG1pY19jbGtfcmVnOwotCXMzMiAqZG1pY19jbGtfY250OwotCXU4IGRtaWNfcmF0ZV92YWwsIGRtaWNfcmF0ZV9zaGlmdCA9IDE7Ci0JdW5zaWduZWQgaW50IGRtaWM7Ci0JdTMyIGRtaWNfc2FtcGxlX3JhdGU7Ci0JaW50IHJldDsKLQljaGFyICp3bmFtZTsKLQotCXduYW1lID0gc3RycGJyayh3LT5uYW1lLCAiMDEyMzQ1Iik7Ci0JaWYgKCF3bmFtZSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogd2lkZ2V0IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBrc3RydG91aW50KHduYW1lLCAxMCwgJmRtaWMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgbGluZSBvbiB0aGUgY29kZWNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZG1pYykgewotCWNhc2UgMDoKLQljYXNlIDE6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfMF8xX2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMF9DVEw7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDM6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfMl8zX2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEw7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGFzaGEtPmRtaWNfNF81X2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzM1X0NQRV9TU19ETUlDMl9DVEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgU2VsZWN0aW9uXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBldmVudCAlZCBETUlDJWQgZG1pY19jbGtfY250ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50LCAgZG1pYywgKmRtaWNfY2xrX2NudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJZG1pY19zYW1wbGVfcmF0ZSA9IHRhc2hhX2dldF9kbWljX3NhbXBsZV9yYXRlKGNvZGVjLCBkbWljLAotCQkJCQkJcGRhdGEpOwotCQlkbWljX3JhdGVfdmFsID0KLQkJCXRhc2hhX2dldF9kbWljX2Nsa192YWwoY29kZWMsCi0JCQkJCXBkYXRhLT5tY2xrX3JhdGUsCi0JCQkJCWRtaWNfc2FtcGxlX3JhdGUpOwotCi0JCSgqZG1pY19jbGtfY250KSsrOwotCQlpZiAoKmRtaWNfY2xrX2NudCA9PSAxKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCi0JCQkJMHgwNyA8PCBkbWljX3JhdGVfc2hpZnQsCi0JCQkJZG1pY19yYXRlX3ZhbCA8PCBkbWljX3JhdGVfc2hpZnQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAotCQkJCQlkbWljX2Nsa19lbiwgZG1pY19jbGtfZW4pOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCWRtaWNfcmF0ZV92YWwgPQotCQkJdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbChjb2RlYywKLQkJCQkJcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQkJcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlKTsKLQkJKCpkbWljX2Nsa19jbnQpLS07Ci0JCWlmICgqZG1pY19jbGtfY250ICA9PSAwKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCi0JCQkJCWRtaWNfY2xrX2VuLCAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKLQkJCQkweDA3IDw8IGRtaWNfcmF0ZV9zaGlmdCwKLQkJCQlkbWljX3JhdGVfdmFsIDw8IGRtaWNfcmF0ZV9zaGlmdCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCWludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JaW50IG1pY2JfbnVtOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHduYW1lOiAlcywgZXZlbnQ6ICVkXG4iLAotCQlfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0JaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTMSIsIHNpemVvZigiTUlDIEJJQVMxIikpKQotCQltaWNiX251bSA9IE1JQ19CSUFTXzE7Ci0JZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpCi0JCW1pY2JfbnVtID0gTUlDX0JJQVNfMjsKLQllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzMiLCBzaXplb2YoIk1JQyBCSUFTMyIpKSkKLQkJbWljYl9udW0gPSBNSUNfQklBU18zOwotCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTNCIsIHNpemVvZigiTUlDIEJJQVM0IikpKQotCQltaWNiX251bSA9IE1JQ19CSUFTXzQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQkvKgotCQkgKiBNSUMgQklBUyBjYW4gYWxzbyBiZSByZXF1ZXN0ZWQgYnkgTUJIQywKLQkJICogc28gdXNlIHJlZiBjb3VudCB0byBoYW5kbGUgbWljYmlhcyBwdWxsdXAKLQkJICogYW5kIGVuYWJsZSByZXF1ZXN0cwotCQkgKi8KLQkJdGFzaGFfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgTUlDQl9FTkFCTEUsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJLyogd2FpdCBmb3IgY25wIHRpbWUgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJdGFzaGFfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgTUlDQl9ESVNBQkxFLCB0cnVlKTsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2xkb19oX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpIHsKLQkJdGFzaGEtPmxkb19oX3VzZXJzKys7Ci0KLQkJaWYgKHRhc2hhLT5sZG9faF91c2VycyA9PSAxKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9MRE9IX01PREUsCi0JCQkJCSAgICAweDgwLCAweDgwKTsKLQl9Ci0KLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJdGFzaGEtPmxkb19oX3VzZXJzLS07Ci0KLQkJaWYgKHRhc2hhLT5sZG9faF91c2VycyA8IDApCi0JCQl0YXNoYS0+bGRvX2hfdXNlcnMgPSAwOwotCi0JCWlmICh0YXNoYS0+bGRvX2hfdXNlcnMgPT0gMCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfTERPSF9NT0RFLAotCQkJCQkgICAgMHg4MCwgMHgwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZm9yY2VfZW5hYmxlX2xkb19oKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7Ci0JCXRhc2hhX2NvZGVjX2xkb19oX2NvbnRyb2wodywgZXZlbnQpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJdGFzaGFfY29kZWNfbGRvX2hfY29udHJvbCh3LCBldmVudCk7Ci0JCXdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyh0YXNoYS0+cmVzbWdyKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIGludCBldmVudCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGFzaGEtPnJlc21ncik7Ci0JCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgdHJ1ZSk7Ci0JCXJldCA9IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOwotCQkvKiBXYWl0IGZvciAxbXMgZm9yIGJldHRlciBjbnAgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldCA9IF9fdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKLQkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhc2hhLT5yZXNtZ3IpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXJldHVybiBfX3Rhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzKHcsIGV2ZW50KTsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9sZG9faChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgICBib29sIGVuYWJsZSkKLXsKLQlpbnQgcmM7Ci0KLQlpZiAoZW5hYmxlKQotCQlyYyA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkJREFQTV9MRE9fSF9TVEFOREFMT05FKTsKLQllbHNlCi0JCXJjID0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKAotCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkJREFQTV9MRE9fSF9TVEFOREFMT05FKTsKLQotCWlmICghcmMpCi0JCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKLQllbHNlCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBsZG9faCBmb3JjZSAlcyBwaW4gZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIChlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIikpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICogdGFzaGFfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyAtIGVuYWJsZSBtaWNiaWFzIHN0YW5kYWxvbmUKLSAqIEBjb2RlYzogcG9pbnRlciB0byBjb2RlYyBpbnN0YW5jZQotICogQG1pY2JfbnVtOiBudW1iZXIgb2YgbWljYmlhcyB0byBiZSBlbmFibGVkCi0gKiBAZW5hYmxlOiB0cnVlIHRvIGVuYWJsZSBtaWNiaWFzIG9yIGZhbHNlIHRvIGRpc2FibGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIG1pY2JpYXMgKDEsIDIsIDMgb3IgNCkgZHVyaW5nCi0gKiBzdGFuZGFsb25lIGluZGVwZW5kZW50IG9mIHdoZXRoZXIgVFggdXNlLWNhc2UgaXMgcnVubmluZyBvciBub3QKLSAqCi0gKiBSZXR1cm46IGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIG9yIDAgZm9yIHN1Y2Nlc3MKLSAqLwotaW50IHRhc2hhX2NvZGVjX2VuYWJsZV9zdGFuZGFsb25lX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIGludCBtaWNiX251bSwKLQkJCQkJICBib29sIGVuYWJsZSkKLXsKLQljb25zdCBjaGFyICogY29uc3QgbWljYl9uYW1lc1tdID0gewotCQlEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIERBUE1fTUlDQklBUzJfU1RBTkRBTE9ORSwKLQkJREFQTV9NSUNCSUFTM19TVEFOREFMT05FLCBEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUKLQl9OwotCWludCBtaWNiX2luZGV4ID0gbWljYl9udW0gLSAxOwotCWludCByYzsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogQ29kZWMgbWVtb3J5IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKChtaWNiX2luZGV4IDwgMCkgfHwgKG1pY2JfaW5kZXggPiBUQVNIQV9NQVhfTUlDQklBUyAtIDEpKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1pY2JpYXMgaW5kZXgsIG1pY2JfaW5kOiVkXG4iLAotCQkJX19mdW5jX18sIG1pY2JfaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZW5hYmxlKQotCQlyYyA9IHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKAotCQkJCQkJIHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAotCQkJCQkJICAgbWljYl9uYW1lc1ttaWNiX2luZGV4XSk7Ci0JZWxzZQotCQlyYyA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkJICAgICAgbWljYl9uYW1lc1ttaWNiX2luZGV4XSk7Ci0KLQlpZiAoIXJjKQotCQlzbmRfc29jX2RhcG1fc3luYyhzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSk7Ci0JZWxzZQotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWljYmlhcyVkIGZvcmNlICVzIHBpbiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgbWljYl9udW0sIChlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIikpOwotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhc2hhX2FuY19mdW5jX3RleHRbXSA9IHsiT0ZGIiwgIk9OIn07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2FuY19mdW5jX2VudW0gPQotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHRhc2hhX2FuY19mdW5jX3RleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFzaGFfY2xrbW9kZV90ZXh0W10gPSB7IkVYVEVSTkFMIiwgIklOVEVSTkFMIn07Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRhc2hhX2Nsa21vZGVfZW51bSwgdGFzaGFfY2xrbW9kZV90ZXh0KTsKLQotLyogQ3V0b2ZmIGZyZXF1ZW5jeSBmb3IgaGlnaCBwYXNzIGZpbHRlciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZl90ZXh0W10gPSB7Ci0JIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9jZl90ZXh0W10gPSB7Ci0JIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIiwKLQkiQ0ZfTkVHXzNEQl8wUDQ4SFoiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzdfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2RlYzhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsIDUsIDMsIGNmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDBfMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQwXzJfZW51bSwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgMiwKLQkJICAgICByeF9jZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQxXzFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MV8yX2VudW0sIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCSAgICAgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50Ml8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDJfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAyLAotCQkgICAgIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDNfMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQzXzJfZW51bSwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgMiwKLQkJICAgICByeF9jZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQ0XzFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50NF8yX2VudW0sIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCSAgICAgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50NV8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDVfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ0ZHLCAyLAotCQkgICAgIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGNmX2ludDZfMV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMiwgMCwgNCwgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9pbnQ2XzJfZW51bSwgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgMiwKLQkJICAgICByeF9jZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBjZl9pbnQ3XzFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzIsIDAsIDQsIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50N18yX2VudW0sIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsIDIsCi0JCSAgICAgcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gY2ZfaW50OF8xX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcyLCAwLCA0LCByeF9jZl90ZXh0KTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2ludDhfMl9lbnVtLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAyLAotCQkgICAgIHJ4X2NmX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBhdWRpb19pMnNfbWFwW10gPSB7Ci0JeyJTTElNIFJYMCBNVVgiLCBOVUxMLCAiUlhfSTJTX0NUTCJ9LAotCXsiU0xJTSBSWDEgTVVYIiwgTlVMTCwgIlJYX0kyU19DVEwifSwKLQl7IlNMSU0gUlgyIE1VWCIsIE5VTEwsICJSWF9JMlNfQ1RMIn0sCi0JeyJTTElNIFJYMyBNVVgiLCBOVUxMLCAiUlhfSTJTX0NUTCJ9LAotCi0JeyJTTElNIFRYNiBNVVgiLCBOVUxMLCAiVFhfSTJTX0NUTCJ9LAotCXsiU0xJTSBUWDcgTVVYIiwgTlVMTCwgIlRYX0kyU19DVEwifSwKLQl7IlNMSU0gVFg4IE1VWCIsIE5VTEwsICJUWF9JMlNfQ1RMIn0sCi0JeyJTTElNIFRYMTEgTVVYIiwgTlVMTCwgIlRYX0kyU19DVEwifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGF1ZGlvX21hcFtdID0gewotCi0JLyogTUFEICovCi0JeyJNQURfU0VMIE1VWCIsICJTUEUiLCAiTUFEX0NQRV9JTlBVVCJ9LAotCXsiTUFEX1NFTCBNVVgiLCAiTVNNIiwgIk1BRElOUFVUIn0sCi0JeyJNQURPTk9GRiIsICJTd2l0Y2giLCAiTUFEX1NFTCBNVVgifSwKLQl7Ik1BRF9CUk9BRENBU1QiLCAiU3dpdGNoIiwgIk1BRF9TRUwgTVVYIn0sCi0JeyJUWDEzIElOUCBNVVgiLCAiQ1BFX1RYX1BQIiwgIk1BRE9OT0ZGIn0sCi0KLQkvKiBDUEUgSFcgTUFEIGJ5cGFzcyAqLwotCXsiQ1BFIElOIE1peGVyIiwgIk1BRF9CWVBBU1MiLCAiU0xJTSBUWDEgTVVYIn0sCi0KLQl7IkFJRjRfTUFEIE1peGVyIiwgIlNMSU0gVFgxIiwgIkNQRSBJTiBNaXhlciJ9LAotCXsiQUlGNF9NQUQgTWl4ZXIiLCAiU0xJTSBUWDEyIiwgIk1BRE9OT0ZGIn0sCi0JeyJBSUY0X01BRCBNaXhlciIsICJTTElNIFRYMTMiLCAiVFgxMyBJTlAgTVVYIn0sCi0JeyJBSUY0IE1BRCIsIE5VTEwsICJBSUY0X01BRCBNaXhlciJ9LAotCXsiQUlGNCBNQUQiLCBOVUxMLCAiQUlGNCJ9LAotCi0JeyJFQyBCVUYgTVVYIElOUCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJBSUY1IENQRSIsIE5VTEwsICJFQyBCVUYgTVVYIElOUCJ9LAotCi0JLyogU0xJTUJVUyBDb25uZWN0aW9ucyAqLwotCXsiQUlGMSBDQVAiLCBOVUxMLCAiQUlGMV9DQVAgTWl4ZXIifSwKLQl7IkFJRjIgQ0FQIiwgTlVMTCwgIkFJRjJfQ0FQIE1peGVyIn0sCi0JeyJBSUYzIENBUCIsIE5VTEwsICJBSUYzX0NBUCBNaXhlciJ9LAotCi0JLyogVkkgRmVlZGJhY2sgKi8KLQl7IkFJRjRfVkkgTWl4ZXIiLCAiU1BLUl9WSV8xIiwgIlZJSU5QVVQifSwKLQl7IkFJRjRfVkkgTWl4ZXIiLCAiU1BLUl9WSV8yIiwgIlZJSU5QVVQifSwKLQl7IkFJRjQgVkkiLCBOVUxMLCAiQUlGNF9WSSBNaXhlciJ9LAotCi0JLyogU0xJTV9NSVhFUigiQUlGMV9DQVAgTWl4ZXIiKSwqLwotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDAiLCAiU0xJTSBUWDAgTVVYIn0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMSIsICJTTElNIFRYMSBNVVgifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgyIiwgIlNMSU0gVFgyIE1VWCJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMgTVVYIn0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNCIsICJTTElNIFRYNCBNVVgifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg1IiwgIlNMSU0gVFg1IE1VWCJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYgTVVYIn0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNyIsICJTTElNIFRYNyBNVVgifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg4IiwgIlNMSU0gVFg4IE1VWCJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkgTVVYIn0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMTAiLCAiU0xJTSBUWDEwIE1VWCJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDExIiwgIlNMSU0gVFgxMSBNVVgifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMyIsICJUWDEzIElOUCBNVVgifSwKLQkvKiBTTElNX01JWEVSKCJBSUYyX0NBUCBNaXhlciIpLCovCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMCIsICJTTElNIFRYMCBNVVgifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIE1VWCJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDIiLCAiU0xJTSBUWDIgTVVYIn0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMyIsICJTTElNIFRYMyBNVVgifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0IE1VWCJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDUiLCAiU0xJTSBUWDUgTVVYIn0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYNiIsICJTTElNIFRYNiBNVVgifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3IE1VWCJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDgiLCAiU0xJTSBUWDggTVVYIn0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYOSIsICJTTElNIFRYOSBNVVgifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAgTVVYIn0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMTEiLCAiU0xJTSBUWDExIE1VWCJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlRYMTMgSU5QIE1VWCJ9LAotCS8qIFNMSU1fTUlYRVIoIkFJRjNfQ0FQIE1peGVyIiksKi8KLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgwIiwgIlNMSU0gVFgwIE1VWCJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEiLCAiU0xJTSBUWDEgTVVYIn0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiBNVVgifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgzIiwgIlNMSU0gVFgzIE1VWCJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDQiLCAiU0xJTSBUWDQgTVVYIn0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSBNVVgifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg2IiwgIlNMSU0gVFg2IE1VWCJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDciLCAiU0xJTSBUWDcgTVVYIn0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCBNVVgifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg5IiwgIlNMSU0gVFg5IE1VWCJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDEwIiwgIlNMSU0gVFgxMCBNVVgifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMSIsICJTTElNIFRYMTEgTVVYIn0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMTMiLCAiVFgxMyBJTlAgTVVYIn0sCi0KLQl7IlNMSU0gVFgwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJTTElNIFRYMCBNVVgiLCAiUlhfTUlYX1RYMCIsICJSWCBNSVggVFgwIE1VWCJ9LAotCXsiU0xJTSBUWDAgTVVYIiwgIkRFQzBfMTkyIiwgIkFEQyBVUyBNVVgwIn0sCi0KLQl7IlNMSU0gVFgxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJTTElNIFRYMSBNVVgiLCAiUlhfTUlYX1RYMSIsICJSWCBNSVggVFgxIE1VWCJ9LAotCXsiU0xJTSBUWDEgTVVYIiwgIkRFQzFfMTkyIiwgIkFEQyBVUyBNVVgxIn0sCi0KLQl7IlNMSU0gVFgyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJTTElNIFRYMiBNVVgiLCAiUlhfTUlYX1RYMiIsICJSWCBNSVggVFgyIE1VWCJ9LAotCXsiU0xJTSBUWDIgTVVYIiwgIkRFQzJfMTkyIiwgIkFEQyBVUyBNVVgyIn0sCi0KLQl7IlNMSU0gVFgzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJTTElNIFRYMyBNVVgiLCAiUlhfTUlYX1RYMyIsICJSWCBNSVggVFgzIE1VWCJ9LAotCXsiU0xJTSBUWDMgTVVYIiwgIkRFQzNfMTkyIiwgIkFEQyBVUyBNVVgzIn0sCi0KLQl7IlNMSU0gVFg0IE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJTTElNIFRYNCBNVVgiLCAiUlhfTUlYX1RYNCIsICJSWCBNSVggVFg0IE1VWCJ9LAotCXsiU0xJTSBUWDQgTVVYIiwgIkRFQzRfMTkyIiwgIkFEQyBVUyBNVVg0In0sCi0KLQl7IlNMSU0gVFg1IE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJTTElNIFRYNSBNVVgiLCAiUlhfTUlYX1RYNSIsICJSWCBNSVggVFg1IE1VWCJ9LAotCXsiU0xJTSBUWDUgTVVYIiwgIkRFQzVfMTkyIiwgIkFEQyBVUyBNVVg1In0sCi0KLQl7IlNMSU0gVFg2IE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJTTElNIFRYNiBNVVgiLCAiUlhfTUlYX1RYNiIsICJSWCBNSVggVFg2IE1VWCJ9LAotCXsiU0xJTSBUWDYgTVVYIiwgIkRFQzZfMTkyIiwgIkFEQyBVUyBNVVg2In0sCi0KLQl7IlNMSU0gVFg3IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJTTElNIFRYNyBNVVgiLCAiUlhfTUlYX1RYNyIsICJSWCBNSVggVFg3IE1VWCJ9LAotCXsiU0xJTSBUWDcgTVVYIiwgIkRFQzdfMTkyIiwgIkFEQyBVUyBNVVg3In0sCi0KLQl7IlNMSU0gVFg4IE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJTTElNIFRYOCBNVVgiLCAiUlhfTUlYX1RYOCIsICJSWCBNSVggVFg4IE1VWCJ9LAotCXsiU0xJTSBUWDggTVVYIiwgIkRFQzhfMTkyIiwgIkFEQyBVUyBNVVg4In0sCi0KLQl7IlNMSU0gVFg5IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJTTElNIFRYOSBNVVgiLCAiREVDN18xOTIiLCAiQURDIFVTIE1VWDcifSwKLQl7IlNMSU0gVFgxMCBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAotCXsiU0xJTSBUWDEwIE1VWCIsICJERUM2XzE5MiIsICJBREMgVVMgTVVYNiJ9LAotCi0JeyJTTElNIFRYMTEgTVVYIiwgIkRFQ18wXzUiLCAiU0xJTSBUWDExIElOUDEgTVVYIn0sCi0JeyJTTElNIFRYMTEgTVVYIiwgIkRFQ185XzEyIiwgIlNMSU0gVFgxMSBJTlAxIE1VWCJ9LAotCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IlNMSU0gVFgxMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJTTElNIFRYMTEgSU5QMSBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IlNMSU0gVFgxMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJTTElNIFRYMTEgSU5QMSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiU0xJTSBUWDExIElOUDEgTVVYIiwgIlJYX01JWF9UWDUiLCAiUlggTUlYIFRYNSBNVVgifSwKLQotCXsiVFgxMyBJTlAgTVVYIiwgIk1BRF9CUkRDU1QiLCAiTUFEX0JST0FEQ0FTVCJ9LAotCXsiVFgxMyBJTlAgTVVYIiwgIkNEQ19ERUNfNSIsICJTTElNIFRYMTMgTVVYIn0sCi0JeyJTTElNIFRYMTMgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAotCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCi0KLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKLQotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAotCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCi0KLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKLQotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMCIsICJSWCBJTlQwIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDEiLCAiUlggSU5UMSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVgyIiwgIlJYIElOVDIgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMyIsICJSWCBJTlQzIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDQiLCAiUlggSU5UNCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg1IiwgIlJYIElOVDUgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYNiIsICJSWCBJTlQ2IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDciLCAiUlggSU5UNyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg4IiwgIlJYIElOVDggU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ1IiwgIlJYIElOVDUgVkJBVCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ2IiwgIlJYIElOVDYgVkJBVCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ3IiwgIlJYIElOVDcgVkJBVCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYX1ZCQVQ4IiwgIlJYIElOVDggVkJBVCJ9LAotCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgwIiwgIlJYIElOVDAgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYMSIsICJSWCBJTlQxIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDIiLCAiUlggSU5UMiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgzIiwgIlJYIElOVDMgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNCIsICJSWCBJTlQ0IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDUiLCAiUlggSU5UNSBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVg2IiwgIlJYIElOVDYgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDUiLCAiUlggSU5UNSBWQkFUIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDYiLCAiUlggSU5UNiBWQkFUIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDciLCAiUlggSU5UNyBWQkFUIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVhfVkJBVDgiLCAiUlggSU5UOCBWQkFUIn0sCi0KLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYNSIsICJSWCBJTlQ1IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDYiLCAiUlggSU5UNiBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg3IiwgIlJYIElOVDcgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYOCIsICJSWCBJTlQ4IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNSIsICJSWCBJTlQ1IFZCQVQifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNiIsICJSWCBJTlQ2IFZCQVQifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUNyIsICJSWCBJTlQ3IFZCQVQifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWF9WQkFUOCIsICJSWCBJTlQ4IFZCQVQifSwKLQotCXsiQURDIFVTIE1VWDAiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgwIn0sCi0JeyJBREMgVVMgTVVYMSIsICJVU19Td2l0Y2giLCAiQURDIE1VWDEifSwKLQl7IkFEQyBVUyBNVVgyIiwgIlVTX1N3aXRjaCIsICJBREMgTVVYMiJ9LAotCXsiQURDIFVTIE1VWDMiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgzIn0sCi0JeyJBREMgVVMgTVVYNCIsICJVU19Td2l0Y2giLCAiQURDIE1VWDQifSwKLQl7IkFEQyBVUyBNVVg1IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYNSJ9LAotCXsiQURDIFVTIE1VWDYiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg2In0sCi0JeyJBREMgVVMgTVVYNyIsICJVU19Td2l0Y2giLCAiQURDIE1VWDcifSwKLQl7IkFEQyBVUyBNVVg4IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYOCJ9LAotCXsiQURDIE1VWDAiLCAiRE1JQyIsICJETUlDIE1VWDAifSwKLQl7IkFEQyBNVVgwIiwgIkFNSUMiLCAiQU1JQyBNVVgwIn0sCi0JeyJBREMgTVVYMSIsICJETUlDIiwgIkRNSUMgTVVYMSJ9LAotCXsiQURDIE1VWDEiLCAiQU1JQyIsICJBTUlDIE1VWDEifSwKLQl7IkFEQyBNVVgyIiwgIkRNSUMiLCAiRE1JQyBNVVgyIn0sCi0JeyJBREMgTVVYMiIsICJBTUlDIiwgIkFNSUMgTVVYMiJ9LAotCXsiQURDIE1VWDMiLCAiRE1JQyIsICJETUlDIE1VWDMifSwKLQl7IkFEQyBNVVgzIiwgIkFNSUMiLCAiQU1JQyBNVVgzIn0sCi0JeyJBREMgTVVYNCIsICJETUlDIiwgIkRNSUMgTVVYNCJ9LAotCXsiQURDIE1VWDQiLCAiQU1JQyIsICJBTUlDIE1VWDQifSwKLQl7IkFEQyBNVVg1IiwgIkRNSUMiLCAiRE1JQyBNVVg1In0sCi0JeyJBREMgTVVYNSIsICJBTUlDIiwgIkFNSUMgTVVYNSJ9LAotCXsiQURDIE1VWDYiLCAiRE1JQyIsICJETUlDIE1VWDYifSwKLQl7IkFEQyBNVVg2IiwgIkFNSUMiLCAiQU1JQyBNVVg2In0sCi0JeyJBREMgTVVYNyIsICJETUlDIiwgIkRNSUMgTVVYNyJ9LAotCXsiQURDIE1VWDciLCAiQU1JQyIsICJBTUlDIE1VWDcifSwKLQl7IkFEQyBNVVg4IiwgIkRNSUMiLCAiRE1JQyBNVVg4In0sCi0JeyJBREMgTVVYOCIsICJBTUlDIiwgIkFNSUMgTVVYOCJ9LAotCXsiQURDIE1VWDEwIiwgIkRNSUMiLCAiRE1JQyBNVVgxMCJ9LAotCXsiQURDIE1VWDEwIiwgIkFNSUMiLCAiQU1JQyBNVVgxMCJ9LAotCXsiQURDIE1VWDExIiwgIkRNSUMiLCAiRE1JQyBNVVgxMSJ9LAotCXsiQURDIE1VWDExIiwgIkFNSUMiLCAiQU1JQyBNVVgxMSJ9LAotCXsiQURDIE1VWDEyIiwgIkRNSUMiLCAiRE1JQyBNVVgxMiJ9LAotCXsiQURDIE1VWDEyIiwgIkFNSUMiLCAiQU1JQyBNVVgxMiJ9LAotCXsiQURDIE1VWDEzIiwgIkRNSUMiLCAiRE1JQyBNVVgxMyJ9LAotCXsiQURDIE1VWDEzIiwgIkFNSUMiLCAiQU1JQyBNVVgxMyJ9LAotCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0KLQl7IkRNSUMgTVVYMCIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVgwIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDAiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMCIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVgwIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDAiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMCIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYMCIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYMCIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMCIsICJBREM0IiwgIkFEQzQifSwKLQl7IkFNSUMgTVVYMCIsICJBREM1IiwgIkFEQzUifSwKLQl7IkFNSUMgTVVYMCIsICJBREM2IiwgIkFEQzYifSwKLQotCXsiRE1JQyBNVVgxIiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDEiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMSIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVgxIiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDEiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMSIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzQiLCAiQURDNCJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzUiLCAiQURDNSJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzYiLCAiQURDNiJ9LAotCi0JeyJETUlDIE1VWDIiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMiIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVgyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDIiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMiIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVgyIiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDNCIsICJBREM0In0sCi0JeyJBTUlDIE1VWDIiLCAiQURDNSIsICJBREM1In0sCi0JeyJBTUlDIE1VWDIiLCAiQURDNiIsICJBREM2In0sCi0KLQl7IkRNSUMgTVVYMyIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVgzIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDMiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMyIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVgzIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDMiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMyIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYMyIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYMyIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMyIsICJBREM0IiwgIkFEQzQifSwKLQl7IkFNSUMgTVVYMyIsICJBREM1IiwgIkFEQzUifSwKLQl7IkFNSUMgTVVYMyIsICJBREM2IiwgIkFEQzYifSwKLQotCXsiRE1JQyBNVVg0IiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDQiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYNCIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVg0IiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDQiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYNCIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzQiLCAiQURDNCJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzUiLCAiQURDNSJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzYiLCAiQURDNiJ9LAotCi0JeyJETUlDIE1VWDUiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYNSIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVg1IiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDUiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYNSIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVg1IiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDNCIsICJBREM0In0sCi0JeyJBTUlDIE1VWDUiLCAiQURDNSIsICJBREM1In0sCi0JeyJBTUlDIE1VWDUiLCAiQURDNiIsICJBREM2In0sCi0KLQl7IkRNSUMgTVVYNiIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVg2IiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDYiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYNiIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVg2IiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDYiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYNiIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYNiIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYNiIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYNiIsICJBREM0IiwgIkFEQzQifSwKLQl7IkFNSUMgTVVYNiIsICJBREM1IiwgIkFEQzUifSwKLQl7IkFNSUMgTVVYNiIsICJBREM2IiwgIkFEQzYifSwKLQotCXsiRE1JQyBNVVg3IiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDciLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYNyIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVg3IiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDciLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYNyIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzQiLCAiQURDNCJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzUiLCAiQURDNSJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzYiLCAiQURDNiJ9LAotCi0JeyJETUlDIE1VWDgiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYOCIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVg4IiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDgiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYOCIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVg4IiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDNCIsICJBREM0In0sCi0JeyJBTUlDIE1VWDgiLCAiQURDNSIsICJBREM1In0sCi0JeyJBTUlDIE1VWDgiLCAiQURDNiIsICJBREM2In0sCi0KLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTAiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDEwIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMCIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTAiLCAiQURDNCIsICJBREM0In0sCi0JeyJBTUlDIE1VWDEwIiwgIkFEQzUiLCAiQURDNSJ9LAotCXsiQU1JQyBNVVgxMCIsICJBREM2IiwgIkFEQzYifSwKLQotCXsiRE1JQyBNVVgxMSIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVgxMSIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVgxMSIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVgxMSIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVgxMSIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVgxMSIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVgxMSIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYMTEiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDExIiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVgxMSIsICJBREM0IiwgIkFEQzQifSwKLQl7IkFNSUMgTVVYMTEiLCAiQURDNSIsICJBREM1In0sCi0JeyJBTUlDIE1VWDExIiwgIkFEQzYiLCAiQURDNiJ9LAotCi0JeyJETUlDIE1VWDEyIiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDEyIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDEyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDEyIiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDEyIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDEyIiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDEyIiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVgxMiIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYMTIiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDEyIiwgIkFEQzQiLCAiQURDNCJ9LAotCXsiQU1JQyBNVVgxMiIsICJBREM1IiwgIkFEQzUifSwKLQl7IkFNSUMgTVVYMTIiLCAiQURDNiIsICJBREM2In0sCi0KLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTMiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDEzIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMyIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTMiLCAiQURDNCIsICJBREM0In0sCi0JeyJBTUlDIE1VWDEzIiwgIkFEQzUiLCAiQURDNSJ9LAotCXsiQU1JQyBNVVgxMyIsICJBREM2IiwgIkFEQzYifSwKLQkvKiBBREMgQ29ubmVjdGlvbnMgKi8KLQl7IkFEQzEiLCBOVUxMLCAiQU1JQzEifSwKLQl7IkFEQzIiLCBOVUxMLCAiQU1JQzIifSwKLQl7IkFEQzMiLCBOVUxMLCAiQU1JQzMifSwKLQl7IkFEQzQiLCBOVUxMLCAiQU1JQzQifSwKLQl7IkFEQzUiLCBOVUxMLCAiQU1JQzUifSwKLQl7IkFEQzYiLCBOVUxMLCAiQU1JQzYifSwKLQotCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UMF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UMV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMV8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UMl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UMl8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UM18xIE1JWDEiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UNF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UNV8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UNl8xIE1JWDEiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UN18xIE1JWDEiLCBOVUxMLCAiUlggSU5UN18xIE1JWDEgSU5QMiJ9LAotCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMCJ9LAotCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMSJ9LAotCXsiUlggSU5UOF8xIE1JWDEiLCBOVUxMLCAiUlggSU5UOF8xIE1JWDEgSU5QMiJ9LAotCi0JeyJSWCBJTlQwIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMF8xIE1JWDEifSwKLQl7IlJYIElOVDAgTUlYMiIsIE5VTEwsICJSWCBJTlQwIFNFQyBNSVgifSwKLQl7IlJYIElOVDAgTUlYMiIsIE5VTEwsICJSWCBJTlQwIE1JWDIgSU5QIn0sCi0JeyJSWCBJTlQwIElOVEVSUCIsIE5VTEwsICJSWCBJTlQwIE1JWDIifSwKLQl7IlJYIElOVDAgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMCBJTlRFUlAifSwKLQl7IlJYIElOVDAgREFDIiwgTlVMTCwgIlJYIElOVDAgREVNIE1VWCJ9LAotCXsiUlggSU5UMCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiRUFSIFBBIiwgTlVMTCwgIlJYIElOVDAgREFDIn0sCi0JeyJFQVIiLCBOVUxMLCAiRUFSIFBBIn0sCi0KLQl7IlNQTCBTUkMwIE1VWCIsICJTUkNfSU5fSFBITCIsICJSWCBJTlQxXzEgTUlYMSJ9LAotCXsiUlggSU5UMSBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIn0sCi0JeyJSWCBJTlQxIFNQTElORSBNSVgiLCAiSFBITCBTd2l0Y2giLCAiU1BMIFNSQzAgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQxXzEgTUlYMSJ9LAotCXsiUlggSU5UMSBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDFfMSBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQxIE5BVElWRSBTVVBQTFkifSwKLQl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxIFNQTElORSBNSVgifSwKLQl7IlJYIElOVDEgTUlYMiIsIE5VTEwsICJSWCBJTlQxIFNFQyBNSVgifSwKLQl7IlJYIElOVDEgTUlYMiIsIE5VTEwsICJSWCBJTlQxIE1JWDIgSU5QIn0sCi0JeyJSWCBJTlQxIElOVEVSUCIsIE5VTEwsICJSWCBJTlQxIE1JWDIifSwKLQl7IlJYIElOVDEgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMSBJTlRFUlAifSwKLQl7IlJYIElOVDEgREFDIiwgTlVMTCwgIlJYIElOVDEgREVNIE1VWCJ9LAotCXsiUlggSU5UMSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiSFBITCBQQSIsIE5VTEwsICJSWCBJTlQxIERBQyJ9LAotCXsiSFBITCIsIE5VTEwsICJIUEhMIFBBIn0sCi0KLQl7IlNQTCBTUkMxIE1VWCIsICJTUkNfSU5fSFBIUiIsICJSWCBJTlQyXzEgTUlYMSJ9LAotCXsiUlggSU5UMiBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIn0sCi0JeyJSWCBJTlQyIFNQTElORSBNSVgiLCAiSFBIUiBTd2l0Y2giLCAiU1BMIFNSQzEgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQyXzEgTUlYMSJ9LAotCXsiUlggSU5UMiBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDJfMSBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKLQl7IlJYIElOVDIgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQyIFNQTElORSBNSVgifSwKLQl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJSWCBJTlQyIE1JWDIgSU5QIn0sCi0JeyJSWCBJTlQyIElOVEVSUCIsIE5VTEwsICJSWCBJTlQyIE1JWDIifSwKLQl7IlJYIElOVDIgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMiBJTlRFUlAifSwKLQl7IlJYIElOVDIgREFDIiwgTlVMTCwgIlJYIElOVDIgREVNIE1VWCJ9LAotCXsiUlggSU5UMiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiSFBIUiBQQSIsIE5VTEwsICJSWCBJTlQyIERBQyJ9LAotCXsiSFBIUiIsIE5VTEwsICJIUEhSIFBBIn0sCi0KLQl7IlNQTCBTUkMwIE1VWCIsICJTUkNfSU5fTE8xIiwgIlJYIElOVDNfMSBNSVgxIn0sCi0JeyJSWCBJTlQzIFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UM18xIE1JWDEifSwKLQl7IlJYIElOVDMgU1BMSU5FIE1JWCIsICJMTzEgU3dpdGNoIiwgIlNQTCBTUkMwIE1VWCJ9LAotCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UM18xIE1JWDEifSwKLQl7IlJYIElOVDMgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQzXzEgTkFUSVZFIE1VWCJ9LAotCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMyBOQVRJVkUgU1VQUExZIn0sCi0JeyJSWCBJTlQzIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMyBTUExJTkUgTUlYIn0sCi0JeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBJTlQzIE1JWDIiLCBOVUxMLCAiUlggSU5UMyBNSVgyIElOUCJ9LAotCXsiUlggSU5UMyBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMyBNSVgyIn0sCi0JeyJSWCBJTlQzIERBQyIsIE5VTEwsICJSWCBJTlQzIElOVEVSUCJ9LAotCXsiUlggSU5UMyBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiTElORU9VVDEgUEEiLCBOVUxMLCAiUlggSU5UMyBEQUMifSwKLQl7IkxJTkVPVVQxIiwgTlVMTCwgIkxJTkVPVVQxIFBBIn0sCi0KLQl7IlNQTCBTUkMxIE1VWCIsICJTUkNfSU5fTE8yIiwgIlJYIElOVDRfMSBNSVgxIn0sCi0JeyJSWCBJTlQ0IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEifSwKLQl7IlJYIElOVDQgU1BMSU5FIE1JWCIsICJMTzIgU3dpdGNoIiwgIlNQTCBTUkMxIE1VWCJ9LAotCXsiUlggSU5UNF8xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UNF8xIE1JWDEifSwKLQl7IlJYIElOVDQgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzEgTkFUSVZFIE1VWCJ9LAotCXsiUlggSU5UNF8xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UNCBOQVRJVkUgU1VQUExZIn0sCi0JeyJSWCBJTlQ0IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UNCBTUExJTkUgTUlYIn0sCi0JeyJSWCBJTlQ0IE1JWDIiLCBOVUxMLCAiUlggSU5UNCBTRUMgTUlYIn0sCi0JeyJSWCBJTlQ0IE1JWDIiLCBOVUxMLCAiUlggSU5UNCBNSVgyIElOUCJ9LAotCXsiUlggSU5UNCBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNCBNSVgyIn0sCi0JeyJSWCBJTlQ0IERBQyIsIE5VTEwsICJSWCBJTlQ0IElOVEVSUCJ9LAotCXsiUlggSU5UNCBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiTElORU9VVDIgUEEiLCBOVUxMLCAiUlggSU5UNCBEQUMifSwKLQl7IkxJTkVPVVQyIiwgTlVMTCwgIkxJTkVPVVQyIFBBIn0sCi0KLQl7IlNQTCBTUkMyIE1VWCIsICJTUkNfSU5fTE8zIiwgIlJYIElOVDVfMSBNSVgxIn0sCi0JeyJSWCBJTlQ1IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNV8xIE1JWDEifSwKLQl7IlJYIElOVDUgU1BMSU5FIE1JWCIsICJMTzMgU3dpdGNoIiwgIlNQTCBTUkMyIE1VWCJ9LAotCXsiUlggSU5UNSBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDUgU1BMSU5FIE1JWCJ9LAotCXsiUlggSU5UNSBNSVgyIiwgTlVMTCwgIlJYIElOVDUgU0VDIE1JWCJ9LAotCXsiUlggSU5UNSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNSBNSVgyIn0sCi0KLQl7IlJYIElOVDUgVkJBVCIsICJMTzMgVkJBVCBFbmFibGUiLCAiUlggSU5UNSBJTlRFUlAifSwKLQl7IlJYIElOVDUgREFDIiwgTlVMTCwgIlJYIElOVDUgVkJBVCJ9LAotCi0JeyJSWCBJTlQ1IERBQyIsIE5VTEwsICJSWCBJTlQ1IElOVEVSUCJ9LAotCXsiUlggSU5UNSBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiTElORU9VVDMgUEEiLCBOVUxMLCAiUlggSU5UNSBEQUMifSwKLQl7IkxJTkVPVVQzIiwgTlVMTCwgIkxJTkVPVVQzIFBBIn0sCi0KLQl7IlNQTCBTUkMzIE1VWCIsICJTUkNfSU5fTE80IiwgIlJYIElOVDZfMSBNSVgxIn0sCi0JeyJSWCBJTlQ2IFNQTElORSBNSVgiLCBOVUxMLCAiUlggSU5UNl8xIE1JWDEifSwKLQl7IlJYIElOVDYgU1BMSU5FIE1JWCIsICJMTzQgU3dpdGNoIiwgIlNQTCBTUkMzIE1VWCJ9LAotCXsiUlggSU5UNiBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDYgU1BMSU5FIE1JWCJ9LAotCXsiUlggSU5UNiBNSVgyIiwgTlVMTCwgIlJYIElOVDYgU0VDIE1JWCJ9LAotCXsiUlggSU5UNiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNiBNSVgyIn0sCi0KLQl7IlJYIElOVDYgVkJBVCIsICJMTzQgVkJBVCBFbmFibGUiLCAiUlggSU5UNiBJTlRFUlAifSwKLQl7IlJYIElOVDYgREFDIiwgTlVMTCwgIlJYIElOVDYgVkJBVCJ9LAotCi0JeyJSWCBJTlQ2IERBQyIsIE5VTEwsICJSWCBJTlQ2IElOVEVSUCJ9LAotCXsiUlggSU5UNiBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiTElORU9VVDQgUEEiLCBOVUxMLCAiUlggSU5UNiBEQUMifSwKLQl7IkxJTkVPVVQ0IiwgTlVMTCwgIkxJTkVPVVQ0IFBBIn0sCi0KLQl7IlNQTCBTUkMyIE1VWCIsICJTUkNfSU5fU1BLUkwiLCAiUlggSU5UN18xIE1JWDEifSwKLQl7IlJYIElOVDcgU1BMSU5FIE1JWCIsIE5VTEwsICJSWCBJTlQ3XzEgTUlYMSJ9LAotCXsiUlggSU5UNyBTUExJTkUgTUlYIiwgIlNQS1JMIFN3aXRjaCIsICJTUEwgU1JDMiBNVVgifSwKLQl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ3IFNQTElORSBNSVgifSwKLQl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJSWCBJTlQ3IE1JWDIgSU5QIn0sCi0KLQl7IlJYIElOVDcgSU5URVJQIiwgTlVMTCwgIlJYIElOVDcgTUlYMiJ9LAotCi0JeyJSWCBJTlQ3IFZCQVQiLCAiU1BLUkwgVkJBVCBFbmFibGUiLCAiUlggSU5UNyBJTlRFUlAifSwKLQl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlggSU5UNyBWQkFUIn0sCi0KLQl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlggSU5UNyBJTlRFUlAifSwKLQl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiU1BLMSBPVVQiLCBOVUxMLCAiUlggSU5UNyBDSEFJTiJ9LAotCi0JeyJBTkMgU1BLUiBQQSBFbmFibGUiLCAiU3dpdGNoIiwgIlJYIElOVDcgQ0hBSU4ifSwKLQl7IkFOQyBTUEsxIFBBIiwgTlVMTCwgIkFOQyBTUEtSIFBBIEVuYWJsZSJ9LAotCXsiU1BLMSBPVVQiLCBOVUxMLCAiQU5DIFNQSzEgUEEifSwKLQotCXsiU1BMIFNSQzMgTVVYIiwgIlNSQ19JTl9TUEtSUiIsICJSWCBJTlQ4XzEgTUlYMSJ9LAotCXsiUlggSU5UOCBTUExJTkUgTUlYIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIn0sCi0JeyJSWCBJTlQ4IFNQTElORSBNSVgiLCAiU1BLUlIgU3dpdGNoIiwgIlNQTCBTUkMzIE1VWCJ9LAotCXsiUlggSU5UOCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDggU1BMSU5FIE1JWCJ9LAotCXsiUlggSU5UOCBJTlRFUlAiLCBOVUxMLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIElOVDggVkJBVCIsICJTUEtSUiBWQkFUIEVuYWJsZSIsICJSWCBJTlQ4IElOVEVSUCJ9LAotCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWCBJTlQ4IFZCQVQifSwKLQotCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWCBJTlQ4IElOVEVSUCJ9LAotCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWF9CSUFTIn0sCi0JeyJTUEsyIE9VVCIsIE5VTEwsICJSWCBJTlQ4IENIQUlOIn0sCi0KLQl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9FQVIiLCAiUlggSU5UMCBNSVgyIn0sCi0JeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fSFBITCIsICJSWCBJTlQxIE1JWDIifSwKLQl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9MTzEiLCAiUlggSU5UMyBNSVgyIn0sCi0JeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fRUFSX1NQS1IiLCAiUlggSU5UNyBNSVgyIn0sCi0JeyJBTkMxIEZCIE1VWCIsICJBTkNfSU5fSFBIUiIsICJSWCBJTlQyIE1JWDIifSwKLQl7IkFOQzEgRkIgTVVYIiwgIkFOQ19JTl9MTzIiLCAiUlggSU5UNCBNSVgyIn0sCi0KLQl7IkFOQyBIUEhMIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEwIn0sCi0JeyJBTkMgSFBITCBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAotCXsiUlggSU5UMSBNSVgyIiwgTlVMTCwgIkFOQyBIUEhMIEVuYWJsZSJ9LAotCi0JeyJBTkMgSFBIUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMiJ9LAotCXsiQU5DIEhQSFIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTMifSwKLQl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJBTkMgSFBIUiBFbmFibGUifSwKLQotCXsiQU5DIEVBUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMCJ9LAotCXsiQU5DIEVBUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAotCXsiUlggSU5UMCBNSVgyIiwgTlVMTCwgIkFOQyBFQVIgRW5hYmxlIn0sCi0KLQl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKLQl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTEifSwKLQl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSJ9LAotCi0JeyJBTkMgTElORU9VVDEgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKLQl7IkFOQyBMSU5FT1VUMSBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAotCXsiUlggSU5UMyBNSVgyIiwgTlVMTCwgIkFOQyBMSU5FT1VUMSBFbmFibGUifSwKLQotCXsiQU5DIExJTkVPVVQyIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEyIn0sCi0JeyJBTkMgTElORU9VVDIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTMifSwKLQl7IlJYIElOVDQgTUlYMiIsIE5VTEwsICJBTkMgTElORU9VVDIgRW5hYmxlIn0sCi0KLQl7IkFOQyBFQVIgUEEiLCBOVUxMLCAiUlggSU5UMCBEQUMifSwKLQl7IkFOQyBFQVIiLCBOVUxMLCAiQU5DIEVBUiBQQSJ9LAotCXsiQU5DIEhQSEwgUEEiLCBOVUxMLCAiUlggSU5UMSBEQUMifSwKLQl7IkFOQyBIUEhMIiwgTlVMTCwgIkFOQyBIUEhMIFBBIn0sCi0JeyJBTkMgSFBIUiBQQSIsIE5VTEwsICJSWCBJTlQyIERBQyJ9LAotCXsiQU5DIEhQSFIiLCBOVUxMLCAiQU5DIEhQSFIgUEEifSwKLQl7IkFOQyBMSU5FT1VUMSBQQSIsIE5VTEwsICJSWCBJTlQzIERBQyJ9LAotCXsiQU5DIExJTkVPVVQxIiwgTlVMTCwgIkFOQyBMSU5FT1VUMSBQQSJ9LAotCXsiQU5DIExJTkVPVVQyIFBBIiwgTlVMTCwgIlJYIElOVDQgREFDIn0sCi0JeyJBTkMgTElORU9VVDIiLCBOVUxMLCAiQU5DIExJTkVPVVQyIFBBIn0sCi0KLQkvKiBTTElNX01VWCgiQUlGMV9QQiIsICJBSUYxIFBCIiksKi8KLQl7IlNMSU0gUlgwIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlgyIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlgzIE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlg1IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlg2IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUYxX1BCIiwgIkFJRjEgUEIifSwKLQkvKiBTTElNX01VWCgiQUlGMl9QQiIsICJBSUYyIFBCIiksKi8KLQl7IlNMSU0gUlgwIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgyIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgzIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg1IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg2IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQkvKiBTTElNX01VWCgiQUlGM19QQiIsICJBSUYzIFBCIiksKi8KLQl7IlNMSU0gUlgwIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlgyIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlgzIE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlg1IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlg2IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUYzX1BCIiwgIkFJRjMgUEIifSwKLQkvKiBTTElNX01VWCgiQUlGNF9QQiIsICJBSUY0IFBCIiksKi8KLQl7IlNMSU0gUlgwIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlgyIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlgzIE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlg1IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlg2IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUY0X1BCIiwgIkFJRjQgUEIifSwKLQotCS8qIFNMSU1fTVVYKCJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiIpLCovCi0JeyJTTElNIFJYMCBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAotCXsiU0xJTSBSWDIgTVVYIiwgIkFJRl9NSVgxX1BCIiwgIkFJRiBNSVgxIFBCIn0sCi0JeyJTTElNIFJYMyBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAotCXsiU0xJTSBSWDUgTVVYIiwgIkFJRl9NSVgxX1BCIiwgIkFJRiBNSVgxIFBCIn0sCi0JeyJTTElNIFJYNiBNVVgiLCAiQUlGX01JWDFfUEIiLCAiQUlGIE1JWDEgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUZfTUlYMV9QQiIsICJBSUYgTUlYMSBQQiJ9LAotCi0JeyJTTElNIFJYMCIsIE5VTEwsICJTTElNIFJYMCBNVVgifSwKLQl7IlNMSU0gUlgxIiwgTlVMTCwgIlNMSU0gUlgxIE1VWCJ9LAotCXsiU0xJTSBSWDIiLCBOVUxMLCAiU0xJTSBSWDIgTVVYIn0sCi0JeyJTTElNIFJYMyIsIE5VTEwsICJTTElNIFJYMyBNVVgifSwKLQl7IlNMSU0gUlg0IiwgTlVMTCwgIlNMSU0gUlg0IE1VWCJ9LAotCXsiU0xJTSBSWDUiLCBOVUxMLCAiU0xJTSBSWDUgTVVYIn0sCi0JeyJTTElNIFJYNiIsIE5VTEwsICJTTElNIFJYNiBNVVgifSwKLQl7IlNMSU0gUlg3IiwgTlVMTCwgIlNMSU0gUlg3IE1VWCJ9LAotCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQwICovCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDBfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDBfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDAgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQwXzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQxICovCi0JeyJSWCBJTlQxXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMV8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDFfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQxXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMV8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDFfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQxXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMV8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxXzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQyICovCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDJfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDJfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDIgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQyXzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQzICovCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UM18yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDNfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UM18yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDNfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UM18yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDMgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQzXzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQ0ICovCi0JeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDRfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDRfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ0XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDQgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQ1ICovCi0JeyJSWCBJTlQ1XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNV8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDVfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ1XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNV8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDVfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ1XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNV8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDUgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ1XzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQ2ICovCi0JeyJSWCBJTlQ2XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNl8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDZfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ2XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNl8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDZfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ2XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNl8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDYgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ2XzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQ3ICovCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDdfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDdfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDcgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ3XzIgTVVYIn0sCi0KLQkvKiBNSVhpbmcgcGF0aCBJTlQ4ICovCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UOF8yIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDhfMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UOF8yIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDhfMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UOF8yIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDggU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ4XzIgTVVYIn0sCi0KLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCi0KLQl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDVfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQ1XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UNV8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQotCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDAiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAxIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UNl8xIE1JWDEgSU5QMiIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDZfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ2XzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCi0KLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQotCS8qIFNSQzAsIFNSQzEgaW5wdXRzIHRvIFNpZGV0b25lIFJYIE1peGVyCi0JICogb24gUlgwLCBSWDEsIFJYMiwgUlgzLCBSWDQgYW5kIFJYNyBjaGFpbnMKLQkgKi8KLQl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAwIE1VWCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJJSVIwIiwgTlVMTCwgIklJUjAgSU5QMSBNVVgifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiSUlSMCIsIE5VTEwsICJJSVIwIElOUDIgTVVYIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAzIE1VWCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0KLQl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAwIE1VWCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0JeyJJSVIxIiwgTlVMTCwgIklJUjEgSU5QMSBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlgwIiwgIlNMSU0gUlgwIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIlJYMSIsICJTTElNIFJYMSJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJSWDIiLCAiU0xJTSBSWDIifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlgzIiwgIlNMSU0gUlgzIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIlJYNCIsICJTTElNIFJYNCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJSWDUiLCAiU0xJTSBSWDUifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlg2IiwgIlNMSU0gUlg2In0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIlJYNyIsICJTTElNIFJYNyJ9LAotCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDIgTVVYIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYMCIsICJTTElNIFJYMCJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJSWDEiLCAiU0xJTSBSWDEifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiUlgyIiwgIlNMSU0gUlgyIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYMyIsICJTTElNIFJYMyJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJSWDQiLCAiU0xJTSBSWDQifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiUlg1IiwgIlNMSU0gUlg1In0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYNiIsICJTTElNIFJYNiJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJSWDciLCAiU0xJTSBSWDcifSwKLQl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAzIE1VWCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDAiLCAiU0xJTSBSWDAifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIlJYMiIsICJTTElNIFJYMiJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDMiLCAiU0xJTSBSWDMifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIlJYNSIsICJTTElNIFJYNSJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDYiLCAiU0xJTSBSWDYifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiUlg3IiwgIlNMSU0gUlg3In0sCi0KLQl7IlNSQzAiLCBOVUxMLCAiSUlSMCJ9LAotCXsiU1JDMSIsIE5VTEwsICJJSVIxIn0sCi0JeyJSWCBJTlQwIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAotCXsiUlggSU5UMCBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKLQl7IlJYIElOVDEgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCi0JeyJSWCBJTlQxIE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAotCXsiUlggSU5UMiBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKLQl7IlJYIElOVDIgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCi0JeyJSWCBJTlQzIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAotCXsiUlggSU5UMyBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKLQl7IlJYIElOVDQgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCi0JeyJSWCBJTlQ0IE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAotCXsiUlggSU5UNyBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKLQl7IlJYIElOVDcgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCi19OwotCi1zdGF0aWMgaW50IHRhc2hhX2FtaWNfcHdyX2x2bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXUxNiBhbWljX3JlZzsKLQotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18xXzIgUFdSIE1PREUiKSkKLQkJYW1pY19yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMTsKLQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfM180IFBXUiBNT0RFIikpCi0JCWFtaWNfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzM7Ci0JaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzVfNiBQV1IgTU9ERSIpKQotCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUM1OwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkoc25kX3NvY19yZWFkKGNvZGVjLCBhbWljX3JlZykgJiBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9NQVNLKSA+PgotCQkJICAgICBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2FtaWNfcHdyX2x2bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQl1MzIgbW9kZV92YWw7Ci0JdTE2IGFtaWNfcmVnOwotCi0JbW9kZV92YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVkXG4iLAotCQlfX2Z1bmNfXywgbW9kZV92YWwpOwotCi0JaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzFfMiBQV1IgTU9ERSIpKQotCQlhbWljX3JlZyA9IFdDRDkzMzVfQU5BX0FNSUMxOwotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18zXzQgUFdSIE1PREUiKSkKLQkJYW1pY19yZWcgPSBXQ0Q5MzM1X0FOQV9BTUlDMzsKLQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfNV82IFBXUiBNT0RFIikpCi0JCWFtaWNfcmVnID0gV0NEOTMzNV9BTkFfQU1JQzU7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhbWljX3JlZywgV0NEOTMzNV9BTUlDX1BXUl9MVkxfTUFTSywKLQkJCSAgICBtb2RlX3ZhbCA8PCBXQ0Q5MzM1X0FNSUNfUFdSX0xWTF9TSElGVCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9yeF9ocGhfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+aHBoX21vZGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcnhfaHBoX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MzIgbW9kZV92YWw7Ci0KLQltb2RlX3ZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJWRcbiIsCi0JCV9fZnVuY19fLCBtb2RlX3ZhbCk7Ci0KLQlpZiAobW9kZV92YWwgPT0gMCkgewotCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6SW52YWxpZCBIUEggTW9kZSwgZGVmYXVsdCB0byBDbHMtSCBIaUZpXG4iLAotCQkJX19mdW5jX18pOwotCQltb2RlX3ZhbCA9IENMU19IX0hJRkk7Ci0JfQotCXRhc2hhLT5ocGhfbW9kZSA9IG1vZGVfdmFsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFzaGFfY29ubl9tYWRfdGV4dFtdID0gewotCSJOT1RVU0VEMSIsICJBREMxIiwgIkFEQzIiLCAiQURDMyIsICJBREM0IiwgIkFEQzUiLCAiQURDNiIsCi0JIk5PVFVTRUQyIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwgIkRNSUM0IiwKLQkiRE1JQzUiLCAiTk9UVVNFRDMiLCAiTk9UVVNFRDQiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Nvbm5fbWFkX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXNoYV9jb25uX21hZF90ZXh0KSwKLQkJCSAgICB0YXNoYV9jb25uX21hZF90ZXh0KTsKLQotc3RhdGljIGludCB0YXNoYV9lbmFibGVfbGRvX2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JdTggdmFsID0gMDsKLQotCWlmIChjb2RlYykKLQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0xET0hfTU9ERSkgJiAweDgwOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhIXZhbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2VuYWJsZV9sZG9faF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlib29sIGVuYWJsZTsKLQotCWVuYWJsZSA9ICEhdmFsdWU7Ci0JaWYgKGNvZGVjKQotCQl0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9sZG9faChjb2RlYywgZW5hYmxlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX21hZF9pbnB1dF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTggdGFzaGFfbWFkX2lucHV0OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JdGFzaGFfbWFkX2lucHV0ID0gc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzMzVfU09DX01BRF9JTlBfU0VMKSAmIDB4MEY7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYV9tYWRfaW5wdXQ7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCSIlczogdGFzaGFfbWFkX2lucHV0ID0gJXNcbiIsIF9fZnVuY19fLAotCQl0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX21hZF9pbnB1dF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTggdGFzaGFfbWFkX2lucHV0OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0JY2hhciBtYWRfYW1pY19pbnB1dF93aWRnZXRbNl07Ci0JY29uc3QgY2hhciAqbWFkX2lucHV0X3dpZGdldDsKLQljb25zdCBjaGFyICpzb3VyY2Vfd2lkZ2V0ID0gTlVMTDsKLQl1MzIgYWRjLCBpLCBtaWNfYmlhc19mb3VuZCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0JY2hhciAqbWFkX2lucHV0OwotCi0JdGFzaGFfbWFkX2lucHV0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAodGFzaGFfbWFkX2lucHV0ID49IEFSUkFZX1NJWkUodGFzaGFfY29ubl9tYWRfdGV4dCkpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiB0YXNoYV9tYWRfaW5wdXQgPSAlZCBvdXQgb2YgYm91bmRzXG4iLAotCQkJX19mdW5jX18sIHRhc2hhX21hZF9pbnB1dCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghc3RyY21wKHRhc2hhX2Nvbm5fbWFkX3RleHRbdGFzaGFfbWFkX2lucHV0XSwgIk5PVFVTRUQxIikgfHwKLQkgICAgIXN0cmNtcCh0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0sICJOT1RVU0VEMiIpIHx8Ci0JICAgICFzdHJjbXAodGFzaGFfY29ubl9tYWRfdGV4dFt0YXNoYV9tYWRfaW5wdXRdLCAiTk9UVVNFRDMiKSB8fAotCSAgICAhc3RyY21wKHRhc2hhX2Nvbm5fbWFkX3RleHRbdGFzaGFfbWFkX2lucHV0XSwgIk5PVFVTRUQ0IikpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBVbnN1cHBvcnRlZCB0YXNoYV9tYWRfaW5wdXQgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCB0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RybnN0cih0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0sCi0JCSAgICAiQURDIiwgc2l6ZW9mKCJBREMiKSkpIHsKLQkJbWFkX2lucHV0ID0gc3RycGJyayh0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0sCi0JCQkJICAgICIxMjM0NTYiKTsKLQkJaWYgKCFtYWRfaW5wdXQpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIE1BRCBpbnB1dCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQl0YXNoYV9jb25uX21hZF90ZXh0W3Rhc2hhX21hZF9pbnB1dF0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcmV0ID0ga3N0cnRvdWludChtYWRfaW5wdXQsIDEwLCAmYWRjKTsKLQkJaWYgKChyZXQgPCAwKSB8fCAoYWRjID4gNikpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IEludmFsaWQgQURDID0gJXNcbiIsIF9fZnVuY19fLAotCQkJCXRhc2hhX2Nvbm5fbWFkX3RleHRbdGFzaGFfbWFkX2lucHV0XSk7Ci0JCQlyZXQgPSAgLUVJTlZBTDsKLQkJfQotCi0JCXNucHJpbnRmKG1hZF9hbWljX2lucHV0X3dpZGdldCwgNiwgIiVzJXUiLCAiQU1JQyIsIGFkYyk7Ci0KLQkJbWFkX2lucHV0X3dpZGdldCA9IG1hZF9hbWljX2lucHV0X3dpZGdldDsKLQl9IGVsc2UgewotCQkvKiBETUlDIHR5cGUgaW5wdXQgd2lkZ2V0Ki8KLQkJbWFkX2lucHV0X3dpZGdldCA9IHRhc2hhX2Nvbm5fbWFkX3RleHRbdGFzaGFfbWFkX2lucHV0XTsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCSIlczogdGFzaGEgaW5wdXQgd2lkZ2V0ID0gJXNcbiIsIF9fZnVuY19fLAotCQltYWRfaW5wdXRfd2lkZ2V0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fb2ZfZGFwbV9yb3V0ZXM7IGkrKykgewotCQlpZiAoIXN0cmNtcChjYXJkLT5vZl9kYXBtX3JvdXRlc1tpXS5zaW5rLCBtYWRfaW5wdXRfd2lkZ2V0KSkgewotCQkJc291cmNlX3dpZGdldCA9IGNhcmQtPm9mX2RhcG1fcm91dGVzW2ldLnNvdXJjZTsKLQkJCWlmICghc291cmNlX3dpZGdldCkgewotCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBpbnZhbGlkIHNvdXJjZSB3aWRnZXRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMzIiwgc2l6ZW9mKCJNSUMgQklBUzMiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIW1pY19iaWFzX2ZvdW5kKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogbWljIGJpYXMgc291cmNlIG5vdCBmb3VuZCBmb3IgaW5wdXQgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCBtYWRfaW5wdXRfd2lkZ2V0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IG1pY19iaWFzIGZvdW5kID0gJWRcbiIsIF9fZnVuY19fLAotCQltaWNfYmlhc19mb3VuZCk7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfSU5QX1NFTCwKLQkJCSAgICAweDBGLCB0YXNoYV9tYWRfaW5wdXQpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01BRF9TRVRVUCwKLQkJCSAgICAweDA3LCBtaWNfYmlhc19mb3VuZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9waW5jdGxfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JdTE2IGN0bF9yZWc7Ci0JdTggcmVnX3ZhbCwgcGluY3RsX3Bvc2l0aW9uOwotCi0JcGluY3RsX3Bvc2l0aW9uID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlzd2l0Y2ggKHBpbmN0bF9wb3NpdGlvbiA+PiAzKSB7Ci0JY2FzZSAwOgotCQljdGxfcmVnID0gV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQljdGxfcmVnID0gV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQljdGxfcmVnID0gV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQljdGxfcmVnID0gV0NEOTMzNV9URVNUX0RFQlVHX1BJTl9DVExfT0VfMzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcGluY3RsIHBvc2l0aW9uID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcGluY3RsX3Bvc2l0aW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgY3RsX3JlZyk7Ci0JcmVnX3ZhbCA9IChyZWdfdmFsID4+IChwaW5jdGxfcG9zaXRpb24gJiAweDA3KSkgJiAweDE7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSByZWdfdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcGluY3RsX21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUxNiBjdGxfcmVnLCBjZmdfcmVnOwotCXU4IGN0bF92YWwsIGNmZ192YWwsIHBpbmN0bF9wb3NpdGlvbiwgcGluY3RsX21vZGUsIG1hc2s7Ci0KLQkvKiAxLSBoaWdoIG9yIGxvdzsgMC0gaGlnaCBaICovCi0JcGluY3RsX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlwaW5jdGxfcG9zaXRpb24gPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0Jc3dpdGNoIChwaW5jdGxfcG9zaXRpb24gPj4gMykgewotCWNhc2UgMDoKLQkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzE7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJY3RsX3JlZyA9IFdDRDkzMzVfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHBpbmN0bCBwb3NpdGlvbiA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBpbmN0bF9wb3NpdGlvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN0bF92YWwgPSBwaW5jdGxfbW9kZSA8PCAocGluY3RsX3Bvc2l0aW9uICYgMHgwNyk7Ci0JbWFzayA9IDEgPDwgKHBpbmN0bF9wb3NpdGlvbiAmIDB4MDcpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGN0bF9yZWcsIG1hc2ssIGN0bF92YWwpOwotCi0JY2ZnX3JlZyA9IFdDRDkzMzVfVExNTV9CSVNUX01PREVfUElOQ0ZHICsgcGluY3RsX3Bvc2l0aW9uOwotCWlmICghcGluY3RsX21vZGUpIHsKLQkJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQotCQkJY2ZnX3ZhbCA9IDB4NDsKLQkJZWxzZQotCQkJY2ZnX3ZhbCA9IDB4QzsKLQl9IGVsc2UgewotCQljZmdfdmFsID0gMDsKLQl9Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2ZnX3JlZywgMHgwNywgY2ZnX3ZhbCk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogcmVnPTB4JXggbWFzaz0weCV4IHZhbD0lZCByZWc9MHgleCB2YWw9JWRcbiIsCi0JCQlfX2Z1bmNfXywgY3RsX3JlZywgbWFzaywgY3RsX3ZhbCwgY2ZnX3JlZywgY2ZnX3ZhbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3ZiYXRfYWRjX291dF9jb25maWdfMl8wKHN0cnVjdCB3Y2RfdmJhdCAqdmJhdCwKLQkJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXU4IHZhbDEsIHZhbDI7Ci0KLQkvKgotCSAqIE1lYXN1cmUgZGNwMSBieSB1c2luZyAiQUxUIiBicmFuY2ggb2YgYmFuZCBnYXAKLQkgKiB2b2x0YWdlKFZiZykgYW5kIHVzZSBpdCBpbiBGQVNUIG1vZGUKLQkgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0JJQVNfQ1RMLCAweDgyLCAweDgyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfUEFUSF9DVEwsIDB4MTAsIDB4MTApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9ERUJVRzEsIDB4MDEsIDB4MDEpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX1ZCQURDLCAweDgwLCAweDgwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOLCAweDIwLCAweDAwKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfRkVfQ1RSTCwgMHgyMCwgMHgyMCk7Ci0JLyogV2FpdCAxMDAgdXNlYyBhZnRlciBjYWxpYnJhdGlvbiBzZWxlY3QgYXMgVmJnICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweDQwLCAweDQwKTsKLQl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCKTsKLQl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg0MCwgMHgwMCk7Ci0KLQl2YmF0LT5kY3AxID0gKCgodmFsMSAmIDB4RkYpIDw8IDMpIHwgKHZhbDIgJiAweDA3KSk7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0JJQVNfQ1RMLCAweDQwLCAweDQwKTsKLQkvKiBXYWl0IDEwMCB1c2VjIGFmdGVyIHNlbGVjdGluZyBWYmcgYXMgMS4wNVYgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfSU8sIDB4NDAsIDB4NDApOwotCXZhbDEgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0RPVVRNU0IpOwotCXZhbDIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0RPVVRMU0IpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweDQwLCAweDAwKTsKLQotCXZiYXQtPmRjcDIgPSAoKCh2YWwxICYgMHhGRikgPDwgMykgfCAodmFsMiAmIDB4MDcpKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkY3AxOjB4JXgsIGRjcDI6MHgleFxuIiwKLQkJX19mdW5jX18sIHZiYXQtPmRjcDEsIHZiYXQtPmRjcDIpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9CSUFTX0NUTCwgMHgyOCk7Ci0JLyogV2FpdCAxMDAgdXNlYyBhZnRlciBzZWxlY3RpbmcgVmJnIGFzIDAuODVWICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfVkJBRENfRkVfQ1RSTCwgMHgyMCwgMHgwMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9WQkFEQ19TVUJCTE9DS19FTiwgMHgyMCwgMHgyMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfVkJBREMsIDB4ODAsIDB4MDApOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMLCAweDEwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfREVCVUcxLCAweDAxLCAweDAwKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3ZiYXRfYWRjX291dF9jb25maWdfMV94KHN0cnVjdCB3Y2RfdmJhdCAqdmJhdCwKLQkJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXU4IHZhbDEsIHZhbDI7Ci0KLQkvKgotCSAqIE1lYXN1cmUgZGNwMSBieSBhcHBseWluZyBiYW5kIGdhcCB2b2x0YWdlKFZiZykKLQkgKiBvZiAwLjg1VgotCSAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4MjApOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQklBU19DVEwsIDB4MjgpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQklBU19WQkdfRklORV9BREosIDB4MDUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4QTApOwotCS8qIFdhaXQgMiBzZWMgYWZ0ZXIgZW5hYmxpbmcgYmFuZCBnYXAgYmlhcyAqLwotCXVzbGVlcF9yYW5nZSgyMDAwMDAwLCAyMDAwMTAwKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0NMS19UT1AsIDB4ODIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0NMS19UT1AsIDB4ODcpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTCwgMHgxMCwgMHgxMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0NGRywgMHgwRCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSwgMHgwMSk7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0FOQV9WQkFEQywgMHg4MCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19TVUJCTE9DS19FTiwgMHhERSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19GRV9DVFJMLCAweDNDKTsKLQkvKiBXYWl0IDEgbXNlYyBhZnRlciBjYWxpYnJhdGlvbiBzZWxlY3QgYXMgVmJnICovCi0JdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19BRENfSU8sIDB4QzApOwotCXZhbDEgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0RPVVRNU0IpOwotCXZhbDIgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0RPVVRMU0IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweDgwKTsKLQotCXZiYXQtPmRjcDEgPSAoKCh2YWwxICYgMHhGRikgPDwgMykgfCAodmFsMiAmIDB4MDcpKTsKLQotCS8qCi0JICogTWVhc3VyZSBkY3AyIGJ5IGFwcGx5aW5nIGJhbmQgZ2FwIHZvbHRhZ2UoVmJnKQotCSAqIG9mIDEuMDVWCi0JICovCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQklBUywgMHg4MCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQklBUywgMHhDMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9CSUFTX0NUTCwgMHg2OCk7Ci0JLyogV2FpdCAyIG1zZWMgYWZ0ZXIgc2VsZWN0aW5nIFZiZyBhcyAxLjA1ViAqLwotCXVzbGVlcF9yYW5nZSgyMDAwLCAyMTAwKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX0JJQVMsIDB4ODApOwotCS8qIFdhaXQgMSBzZWMgYWZ0ZXIgZW5hYmxpbmcgYmFuZCBnYXAgYmlhcyAqLwotCXVzbGVlcF9yYW5nZSgxMDAwMDAwLCAxMDAwMTAwKTsKLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfVkJBRENfQURDX0lPLCAweEMwKTsKLQl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTVNCKTsKLQl2YWwyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19ET1VUTFNCKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg4MCk7Ci0KLQl2YmF0LT5kY3AyID0gKCgodmFsMSAmIDB4RkYpIDw8IDMpIHwgKHZhbDIgJiAweDA3KSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGNwMToweCV4LCBkY3AyOjB4JXhcbiIsCi0JCV9fZnVuY19fLCB2YmF0LT5kY3AxLCB2YmF0LT5kY3AyKTsKLQotCS8qIFJlc2V0IHRoZSBWYmF0IEFEQyBjb25maWd1cmF0aW9uICovCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQklBUywgMHg4MCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQklBUywgMHhDMCk7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0JJQVNfQ1RMLCAweDI4KTsKLQkvKiBXYWl0IDIgbXNlYyBhZnRlciBzZWxlY3RpbmcgVmJnIGFzIDAuODVWICovCi0JdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfQklBUywgMHhBMCk7Ci0JLyogV2FpdCAxIHNlYyBhZnRlciBlbmFibGluZyBiYW5kIGdhcCBiaWFzICovCi0JdXNsZWVwX3JhbmdlKDEwMDAwMDAsIDEwMDAxMDApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9WQkFEQ19GRV9DVFJMLCAweDFDKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX1NVQkJMT0NLX0VOLCAweEZFKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1ZCQURDX0FEQ19JTywgMHg4MCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfVkJBREMsIDB4MDApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX0RFQlVHMSwgMHgwMCk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DRENfVkJBVF9WQkFUX1BBVEhfQ1RMLCAweDAwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHLCAweDBBKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX3ZiYXRfYWRjX291dF9jb25maWcoc3RydWN0IHdjZF92YmF0ICp2YmF0LAotCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JaWYgKCF2YmF0LT5hZGNfY29uZmlnKSB7Ci0JCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSwgZmFsc2UpOwotCi0JCWlmIChUQVNIQV9JU18yXzAod2NkOXh4eCkpCi0JCQl3Y2RfdmJhdF9hZGNfb3V0X2NvbmZpZ18yXzAodmJhdCwgY29kZWMpOwotCQllbHNlCi0JCQl3Y2RfdmJhdF9hZGNfb3V0X2NvbmZpZ18xX3godmJhdCwgY29kZWMpOwotCi0JCXRhc2hhX2NkY19tY2xrX2VuYWJsZShjb2RlYywgZmFsc2UsIGZhbHNlKTsKLQkJdmJhdC0+YWRjX2NvbmZpZyA9IHRydWU7Ci0JfQotfQotCi1zdGF0aWMgaW50IHRhc2hhX3VwZGF0ZV92YmF0X3JlZ19jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBmaXJtd2FyZV9jYWwgKmh3ZGVwX2NhbCA9IE5VTEw7Ci0Jc3RydWN0IHZiYXRfbW9uaXRvcl9yZWcgKnZiYXRfcmVnX3B0ciA9IE5VTEw7Ci0JY29uc3Qgdm9pZCAqZGF0YTsKLQlzaXplX3QgY2FsX3NpemUsIHZiYXRfc2l6ZV9yZW1haW5pbmc7Ci0JaW50IHJldCA9IDAsIGk7Ci0JdTMyIHZiYXRfd3JpdGVzX3NpemUgPSAwOwotCXUxNiByZWc7Ci0JdTggbWFzaywgdmFsLCBvbGRfdmFsOwotCi0JaHdkZXBfY2FsID0gd2NkY2FsX2dldF9md19jYWwodGFzaGEtPmZ3X2RhdGEsIFdDRDlYWFhfVkJBVF9DQUwpOwotCWlmIChod2RlcF9jYWwpIHsKLQkJZGF0YSA9IGh3ZGVwX2NhbC0+ZGF0YTsKLQkJY2FsX3NpemUgPSBod2RlcF9jYWwtPnNpemU7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyBod2RlcCBjYWxpYnJhdGlvblxuIiwKLQkJCV9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogVmJhdCBjYWwgbm90IHJlY2VpdmVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9zaXplIDwgc2l6ZW9mKCp2YmF0X3JlZ19wdHIpKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW5jb3JyZWN0IHNpemUgJXpkIGZvciBWYmF0IENhbCwgZXhwZWN0ZWQgJXpkXG4iLAotCQkJX19mdW5jX18sIGNhbF9zaXplLCBzaXplb2YoKnZiYXRfcmVnX3B0cikpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdmJhdF9yZWdfcHRyID0gKHN0cnVjdCB2YmF0X21vbml0b3JfcmVnICopIChkYXRhKTsKLQotCWlmICghdmJhdF9yZWdfcHRyKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBjYWxpYnJhdGlvbiBkYXRhIGZvciBWYmF0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdmJhdF93cml0ZXNfc2l6ZSA9IHZiYXRfcmVnX3B0ci0+c2l6ZTsKLQl2YmF0X3NpemVfcmVtYWluaW5nID0gY2FsX3NpemUgLSBzaXplb2YodTMyKTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdmJhdF93cml0ZXNfc3o6ICVkLCB2YmF0X3N6X3JlbWFpbmluZzogJXpkXG4iLAotCQkJX19mdW5jX18sIHZiYXRfd3JpdGVzX3NpemUsIHZiYXRfc2l6ZV9yZW1haW5pbmcpOwotCi0JaWYgKCh2YmF0X3dyaXRlc19zaXplICogVEFTSEFfUEFDS0VEX1JFR19TSVpFKQotCQkJCQk+IHZiYXRfc2l6ZV9yZW1haW5pbmcpIHsKLQkJcHJfZXJyKCIlczogSW5jb3JyZWN0IFZiYXQgY2FsaWJyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZm9yIChpID0gMCA7IGkgPCB2YmF0X3dyaXRlc19zaXplOyBpKyspIHsKLQkJVEFTSEFfQ09ERUNfVU5QQUNLX0VOVFJZKHZiYXRfcmVnX3B0ci0+d3JpdGVzW2ldLAotCQkJCQlyZWcsIG1hc2ssIHZhbCk7Ci0JCW9sZF92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIHJlZyk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHJlZywgKG9sZF92YWwgJiB+bWFzaykgfCAodmFsICYgbWFzaykpOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3ZiYXRfYWRjX2RhdGFfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXdjZF92YmF0X2FkY19vdXRfY29uZmlnKCZ0YXNoYS0+dmJhdCwgY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+dmJhdC5kY3AxOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdGFzaGEtPnZiYXQuZGNwMjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiBWYmF0IEFEQyBvdXRwdXQgdmFsdWVzLCBEY3AxIDogJWx1LCBEY3AyOiAlbHVcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFzaGFfdmJhdF9nc21fbW9kZV90ZXh0W10gPSB7Ci0JIk9GRiIsICJPTiJ9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX3ZiYXRfZ3NtX21vZGVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVCgyLCB0YXNoYV92YmF0X2dzbV9tb2RlX3RleHQpOwotCi1zdGF0aWMgaW50IHRhc2hhX3ZiYXRfZ3NtX21vZGVfZnVuY19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCSgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzM1X0NEQ19WQkFUX1ZCQVRfQ0ZHKSAmIDB4MDQpID8KLQkJICAxIDogMCk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdmFsdWU6ICVsdVxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3ZiYXRfZ3NtX21vZGVfZnVuY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHZhbHVlOiAlbHVcbiIsIF9fZnVuY19fLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQkvKiBTZXQgVmJhdCByZWdpc3RlciBjb25maWd1cmF0aW9uIGZvciBHU00gbW9kZSBiaXQgYmFzZWQgb24gdmFsdWUgKi8KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcsCi0JCQkJCQkweDA0LCAweDA0KTsKLQllbHNlCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkcsCi0JCQkJCQkweDA0LCAweDAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX3ZiYXRfZW5hYmxlX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCWludCBldmVudCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTE2IHZiYXRfcGF0aF9jdGwsIHZiYXRfY2ZnLCB2YmF0X3BhdGhfY2ZnOwotCi0JdmJhdF9wYXRoX2N0bCA9IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9QQVRIX0NUTDsKLQl2YmF0X2NmZyA9IFdDRDkzMzVfQ0RDX1ZCQVRfVkJBVF9DRkc7Ci0JdmJhdF9wYXRoX2NmZyA9IFdDRDkzMzVfQ0RDX1JYOF9SWF9QQVRIX0NGRzE7Ci0KLQlpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UOCBWQkFUIikpCi0JCXZiYXRfcGF0aF9jZmcgPSBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxOwotCWVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDcgVkJBVCIpKQotCQl2YmF0X3BhdGhfY2ZnID0gV0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfQ0ZHMTsKLQllbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ2IFZCQVQiKSkKLQkJdmJhdF9wYXRoX2NmZyA9IFdDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX0NGRzE7Ci0JZWxzZSBpZiAoIXN0cmNtcCh3LT5uYW1lLCAiUlggSU5UNSBWQkFUIikpCi0JCXZiYXRfcGF0aF9jZmcgPSBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcxOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXJldCA9IHRhc2hhX3VwZGF0ZV92YmF0X3JlZ19jb25maWcoY29kZWMpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkJIiVzIDogVkJBVCBpc24ndCBjYWxpYnJhdGVkLCBTbyBub3QgZW5hYmxpbmcgaXRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9BTkFfVkJBREMsIDB4ODApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB2YmF0X3BhdGhfY2ZnLCAweDAyLCAweDAyKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdmJhdF9wYXRoX2N0bCwgMHgxMCwgMHgxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHZiYXRfY2ZnLCAweDAxLCAweDAxKTsKLQkJdGFzaGEtPnZiYXQuaXNfZW5hYmxlZCA9IHRydWU7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlpZiAodGFzaGEtPnZiYXQuaXNfZW5hYmxlZCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdmJhdF9jZmcsIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdmJhdF9wYXRoX2N0bCwgMHgxMCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB2YmF0X3BhdGhfY2ZnLCAweDAyLCAweDAwKTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQU5BX1ZCQURDLCAweDAwKTsKLQkJCXRhc2hhLT52YmF0LmlzX2VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9ocGhfbW9kZV9tdXhfdGV4dFtdID0gewotCSJDTFNfSF9JTlZBTElEIiwgIkNMU19IX0hJRkkiLCAiQ0xTX0hfTFAiLCAiQ0xTX0FCIiwgIkNMU19IX0xPSElGSSIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaHBoX21vZGVfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShyeF9ocGhfbW9kZV9tdXhfdGV4dCksCi0JCQkgICAgcnhfaHBoX21vZGVfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFtaWNfcHdyX2x2bF90ZXh0W10gPSB7Ci0JIkxPV19QV1IiLCAiREVGQVVMVCIsICJISUdIX1BFUkYiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFtaWNfcHdyX2x2bF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoYW1pY19wd3JfbHZsX3RleHQpLAotCQkJICAgIGFtaWNfcHdyX2x2bF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRhc2hhX3NuZF9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDAgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwgLyogLTg0ZEIgbWluIC0gNDBkQiBtYXggKi8KLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgxIERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlgxX1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMiBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYMl9SWF9WT0xfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg0IERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlg0X1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNSBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYNV9SWF9WT0xfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDYgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg3IERpZ2l0YWwgVm9sdW1lIiwgV0NEOTMzNV9DRENfUlg3X1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYOCBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1JYOF9SWF9WT0xfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMCBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDBfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMSBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMiBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMyBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDNfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNCBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDRfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNSBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDVfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNiBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDZfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNyBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDdfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYOCBNaXggRGlnaXRhbCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19SWDhfUlhfVk9MX01JWF9DVEwsCi0JCQkgIDAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksIC8qIC04NGRCIG1pbiAtIDQwZEIgbWF4ICovCi0KLQlTT0NfU0lOR0xFX1NYX1RMVigiREVDMCBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDBfVFhfVk9MX0NUTCwgMCwKLQkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUMxIFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYMV9UWF9WT0xfQ1RMLCAwLAotCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzIgVm9sdW1lIiwgV0NEOTMzNV9DRENfVFgyX1RYX1ZPTF9DVEwsIDAsCi0JCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiREVDMyBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDNfVFhfVk9MX0NUTCwgMCwKLQkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM0IFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYNF9UWF9WT0xfQ1RMLCAwLAotCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzUgVm9sdW1lIiwgV0NEOTMzNV9DRENfVFg1X1RYX1ZPTF9DVEwsIDAsCi0JCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiREVDNiBWb2x1bWUiLCBXQ0Q5MzM1X0NEQ19UWDZfVFhfVk9MX0NUTCwgMCwKLQkJCQkJICAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM3IFZvbHVtZSIsIFdDRDkzMzVfQ0RDX1RYN19UWF9WT0xfQ1RMLCAwLAotCQkJCQkgIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIkRFQzggVm9sdW1lIiwgV0NEOTMzNV9DRENfVFg4X1RYX1ZPTF9DVEwsIDAsCi0JCQkJCSAgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIwIElOUDAgVm9sdW1lIiwKLQkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CMV9DVEwsIDAsIC04NCwKLQkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjAgSU5QMSBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IyX0NUTCwgMCwgLTg0LAotCQkJICA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAyIFZvbHVtZSIsCi0JCQkgIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMLCAwLCAtODQsCi0JCQkgIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIwIElOUDMgVm9sdW1lIiwKLQkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CNF9DVEwsIDAsIC04NCwKLQkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMCBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IxX0NUTCwgMCwgLTg0LAotCQkJICA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAxIFZvbHVtZSIsCi0JCQkgIFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMLCAwLCAtODQsCi0JCQkgIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDIgVm9sdW1lIiwKLQkJCSAgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CM19DVEwsIDAsIC04NCwKLQkJCSAgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMyBWb2x1bWUiLAotCQkJICBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0I0X0NUTCwgMCwgLTg0LAotCQkJICA0MCwgZGlnaXRhbF9nYWluKSwKLQotCVNPQ19TSU5HTEVfRVhUKCJBTkMgU2xvdCIsIFNORF9TT0NfTk9QTSwgMCwgMTAwLCAwLCB0YXNoYV9nZXRfYW5jX3Nsb3QsCi0JCSAgICAgICB0YXNoYV9wdXRfYW5jX3Nsb3QpLAotCVNPQ19FTlVNX0VYVCgiQU5DIEZ1bmN0aW9uIiwgdGFzaGFfYW5jX2Z1bmNfZW51bSwgdGFzaGFfZ2V0X2FuY19mdW5jLAotCQkgICAgIHRhc2hhX3B1dF9hbmNfZnVuYyksCi0KLQlTT0NfRU5VTV9FWFQoIkNMSyBNT0RFIiwgdGFzaGFfY2xrbW9kZV9lbnVtLCB0YXNoYV9nZXRfY2xrbW9kZSwKLQkJICAgICB0YXNoYV9wdXRfY2xrbW9kZSksCi0KLQlTT0NfRU5VTSgiVFgwIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMF9lbnVtKSwKLQlTT0NfRU5VTSgiVFgxIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMV9lbnVtKSwKLQlTT0NfRU5VTSgiVFgyIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjMl9lbnVtKSwKLQlTT0NfRU5VTSgiVFgzIEhQRiBjdXQgb2ZmIiwgY2ZfZGVjM19lbnVtKSwKLQlTT0NfRU5VTSgiVFg0IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNF9lbnVtKSwKLQlTT0NfRU5VTSgiVFg1IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNV9lbnVtKSwKLQlTT0NfRU5VTSgiVFg2IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjNl9lbnVtKSwKLQlTT0NfRU5VTSgiVFg3IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjN19lbnVtKSwKLQlTT0NfRU5VTSgiVFg4IEhQRiBjdXQgb2ZmIiwgY2ZfZGVjOF9lbnVtKSwKLQotCVNPQ19FTlVNKCJSWCBJTlQwXzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQwXzFfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDBfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDBfMl9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UMV8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MV8xX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQxXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQxXzJfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDJfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDJfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UMl8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50Ml8yX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQzXzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQzXzFfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDNfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDNfMl9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UNF8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50NF8xX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQ0XzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQ0XzJfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDVfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDVfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UNV8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50NV8yX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQ2XzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQ2XzFfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDZfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDZfMl9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UN18xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50N18xX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQ3XzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQ3XzJfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDhfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDhfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UOF8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50OF8yX2VudW0pLAotCi0JU09DX1NJTkdMRV9FWFQoIklJUjAgRW5hYmxlIEJhbmQxIiwgSUlSMCwgQkFORDEsIDEsIDAsCi0JdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDIiLCBJSVIwLCBCQU5EMiwgMSwgMCwKLQl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIwIEVuYWJsZSBCYW5kMyIsIElJUjAsIEJBTkQzLCAxLCAwLAotCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjAgRW5hYmxlIEJhbmQ0IiwgSUlSMCwgQkFORDQsIDEsIDAsCi0JdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDUiLCBJSVIwLCBCQU5ENSwgMSwgMCwKLQl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kMSIsIElJUjEsIEJBTkQxLCAxLCAwLAotCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQyIiwgSUlSMSwgQkFORDIsIDEsIDAsCi0JdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDMiLCBJSVIxLCBCQU5EMywgMSwgMCwKLQl0YXNoYV9nZXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJSVIxIEVuYWJsZSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAxLCAwLAotCXRhc2hhX2dldF9paXJfZW5hYmxlX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2VuYWJsZV9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklJUjEgRW5hYmxlIEJhbmQ1IiwgSUlSMSwgQkFORDUsIDEsIDAsCi0JdGFzaGFfZ2V0X2lpcl9lbmFibGVfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfZW5hYmxlX2F1ZGlvX21peGVyKSwKLQotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQxIiwgSUlSMCwgQkFORDEsIDI1NSwgMCwgNSwKLQl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDIiLCBJSVIwLCBCQU5EMiwgMjU1LCAwLCA1LAotCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMCBCYW5kMyIsIElJUjAsIEJBTkQzLCAyNTUsIDAsIDUsCi0JdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQ0IiwgSUlSMCwgQkFORDQsIDI1NSwgMCwgNSwKLQl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjAgQmFuZDUiLCBJSVIwLCBCQU5ENSwgMjU1LCAwLCA1LAotCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kMSIsIElJUjEsIEJBTkQxLCAyNTUsIDAsIDUsCi0JdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQyIiwgSUlSMSwgQkFORDIsIDI1NSwgMCwgNSwKLQl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIklJUjEgQmFuZDMiLCBJSVIxLCBCQU5EMywgMjU1LCAwLCA1LAotCXRhc2hhX2dldF9paXJfYmFuZF9hdWRpb19taXhlciwgdGFzaGFfcHV0X2lpcl9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSUlSMSBCYW5kNCIsIElJUjEsIEJBTkQ0LCAyNTUsIDAsIDUsCi0JdGFzaGFfZ2V0X2lpcl9iYW5kX2F1ZGlvX21peGVyLCB0YXNoYV9wdXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQ1IiwgSUlSMSwgQkFORDUsIDI1NSwgMCwgNSwKLQl0YXNoYV9nZXRfaWlyX2JhbmRfYXVkaW9fbWl4ZXIsIHRhc2hhX3B1dF9paXJfYmFuZF9hdWRpb19taXhlciksCi0KLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDEgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfMSwgMSwgMCwKLQkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJDT01QMiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl8yLCAxLCAwLAotCQkgICAgICAgdGFzaGFfZ2V0X2NvbXBhbmRlciwgdGFzaGFfc2V0X2NvbXBhbmRlciksCi0JU09DX1NJTkdMRV9FWFQoIkNPTVAzIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzMsIDEsIDAsCi0JCSAgICAgICB0YXNoYV9nZXRfY29tcGFuZGVyLCB0YXNoYV9zZXRfY29tcGFuZGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDQgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfNCwgMSwgMCwKLQkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJDT01QNSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl81LCAxLCAwLAotCQkgICAgICAgdGFzaGFfZ2V0X2NvbXBhbmRlciwgdGFzaGFfc2V0X2NvbXBhbmRlciksCi0JU09DX1NJTkdMRV9FWFQoIkNPTVA2IFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzYsIDEsIDAsCi0JCSAgICAgICB0YXNoYV9nZXRfY29tcGFuZGVyLCB0YXNoYV9zZXRfY29tcGFuZGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDcgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfNywgMSwgMCwKLQkJICAgICAgIHRhc2hhX2dldF9jb21wYW5kZXIsIHRhc2hhX3NldF9jb21wYW5kZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJDT01QOCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl84LCAxLCAwLAotCQkgICAgICAgdGFzaGFfZ2V0X2NvbXBhbmRlciwgdGFzaGFfc2V0X2NvbXBhbmRlciksCi0KLQlTT0NfRU5VTV9FWFQoIlJYIEhQSCBNb2RlIiwgcnhfaHBoX21vZGVfbXV4X2VudW0sCi0JCSAgICAgICB0YXNoYV9yeF9ocGhfbW9kZV9nZXQsIHRhc2hhX3J4X2hwaF9tb2RlX3B1dCksCi0KLQlTT0NfRU5VTV9FWFQoIk1BRCBJbnB1dCIsIHRhc2hhX2Nvbm5fbWFkX2VudW0sCi0JCSAgICAgdGFzaGFfbWFkX2lucHV0X2dldCwgdGFzaGFfbWFkX2lucHV0X3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIkxET19IIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKLQkJCXRhc2hhX2VuYWJsZV9sZG9faF9nZXQsIHRhc2hhX2VuYWJsZV9sZG9faF9wdXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkRNSUMxX0NMS19QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMTcsIDEsIDAsCi0JCSAgICAgICB0YXNoYV9waW5jdGxfbW9kZV9nZXQsIHRhc2hhX3BpbmN0bF9tb2RlX3B1dCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiRE1JQzFfREFUQV9QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMTgsIDEsIDAsCi0JCSAgICAgICB0YXNoYV9waW5jdGxfbW9kZV9nZXQsIHRhc2hhX3BpbmN0bF9tb2RlX3B1dCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiRE1JQzJfQ0xLX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAxOSwgMSwgMCwKLQkJICAgICAgIHRhc2hhX3BpbmN0bF9tb2RlX2dldCwgdGFzaGFfcGluY3RsX21vZGVfcHV0KSwKLQotCVNPQ19TSU5HTEVfRVhUKCJETUlDMl9EQVRBX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAyMCwgMSwgMCwKLQkJICAgICAgIHRhc2hhX3BpbmN0bF9tb2RlX2dldCwgdGFzaGFfcGluY3RsX21vZGVfcHV0KSwKLQotCVNPQ19TSU5HTEVfRVhUKCJETUlDM19DTEtfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDIxLCAxLCAwLAotCQkgICAgICAgdGFzaGFfcGluY3RsX21vZGVfZ2V0LCB0YXNoYV9waW5jdGxfbW9kZV9wdXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkRNSUMzX0RBVEFfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDIyLCAxLCAwLAotCQkgICAgICAgdGFzaGFfcGluY3RsX21vZGVfZ2V0LCB0YXNoYV9waW5jdGxfbW9kZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiQU1JQ18xXzIgUFdSIE1PREUiLCBhbWljX3B3cl9sdmxfZW51bSwKLQkJICAgICAgIHRhc2hhX2FtaWNfcHdyX2x2bF9nZXQsIHRhc2hhX2FtaWNfcHdyX2x2bF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiQU1JQ18zXzQgUFdSIE1PREUiLCBhbWljX3B3cl9sdmxfZW51bSwKLQkJICAgICAgIHRhc2hhX2FtaWNfcHdyX2x2bF9nZXQsIHRhc2hhX2FtaWNfcHdyX2x2bF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiQU1JQ181XzYgUFdSIE1PREUiLCBhbWljX3B3cl9sdmxfZW51bSwKLQkJICAgICAgIHRhc2hhX2FtaWNfcHdyX2x2bF9nZXQsIHRhc2hhX2FtaWNfcHdyX2x2bF9wdXQpLAotCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZiYXQgQURDIGRhdGEiLCBTTkRfU09DX05PUE0sIDAsIDB4RkZGRiwgMCwgMiwKLQkJCXRhc2hhX3ZiYXRfYWRjX2RhdGFfZ2V0LCBOVUxMKSwKLQotCVNPQ19FTlVNX0VYVCgiR1NNIG1vZGUgRW5hYmxlIiwgdGFzaGFfdmJhdF9nc21fbW9kZV9lbnVtLAotCQkJdGFzaGFfdmJhdF9nc21fbW9kZV9mdW5jX2dldCwKLQkJCXRhc2hhX3ZiYXRfZ3NtX21vZGVfZnVuY19wdXQpLAotfTsKLQotc3RhdGljIGludCB0YXNoYV9wdXRfZGVjX2VudW0oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXVuc2lnbmVkIGludCB2YWw7Ci0JdTE2IG1pY19zZWxfcmVnOwotCXU4IG1pY19zZWw7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmICh2YWwgPiBlLT5pdGVtcyAtIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHduYW1lOiAlcywgdmFsOiAweCV4XG4iLCBfX2Z1bmNfXywKLQkJd2lkZ2V0LT5uYW1lLCB2YWwpOwotCi0Jc3dpdGNoIChlLT5yZWcpIHsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMToKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMToKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMToKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMToKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDNfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMDoKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMDoKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMDoKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDZfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMDoKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMDoKLQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZS0+cmVnOiAweCV4IG5vdCBleHBlY3RlZFxuIiwKLQkJCV9fZnVuY19fLCBlLT5yZWcpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBBREM6IDAsIERNSUM6IDEgKi8KLQltaWNfc2VsID0gdmFsID8gMHgwIDogMHgxOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY19zZWxfcmVnLCAxIDw8IDcsIG1pY19zZWwgPDwgNyk7Ci0KLQlyZXR1cm4gc25kX3NvY19kYXBtX3B1dF9lbnVtX2RvdWJsZShrY29udHJvbCwgdWNvbnRyb2wpOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2ludF9kZW1faW5wX211eF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBsb29rX2FoZWFkX2RseV9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DRkcwOwotCi0JdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlpZiAodmFsID49IGUtPml0ZW1zKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3bmFtZTogJXMsIHZhbDogMHgleFxuIiwgX19mdW5jX18sCi0JCXdpZGdldC0+bmFtZSwgdmFsKTsKLQotCWlmIChlLT5yZWcgPT0gV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCkKLQkJbG9va19haGVhZF9kbHlfcmVnID0gV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMDsKLQllbHNlIGlmIChlLT5yZWcgPT0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCkKLQkJbG9va19haGVhZF9kbHlfcmVnID0gV0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfQ0ZHMDsKLQllbHNlIGlmIChlLT5yZWcgPT0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCkKLQkJbG9va19haGVhZF9kbHlfcmVnID0gV0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfQ0ZHMDsKLQotCS8qIFNldCBMb29rIEFoZWFkIERlbGF5ICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbG9va19haGVhZF9kbHlfcmVnLAotCQkJICAgIDB4MDgsICh2YWwgPyAweDA4IDogMHgwMCkpOwotCS8qIFNldCBERU0gSU5QIFNlbGVjdCAqLwotCXJldHVybiBzbmRfc29jX2RhcG1fcHV0X2VudW1fZG91YmxlKGtjb250cm9sLCB1Y29udHJvbCk7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZWFyX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU4IGVhcl9wYV9nYWluOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JZWFyX3BhX2dhaW4gPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzMzVfQU5BX0VBUik7Ci0KLQllYXJfcGFfZ2FpbiA9IChlYXJfcGFfZ2FpbiAmIDB4NzApID4+IDQ7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVhcl9wYV9nYWluOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVhcl9wYV9nYWluID0gMHgleFxuIiwgX19mdW5jX18sCi0JCWVhcl9wYV9nYWluKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2Vhcl9wYV9nYWluX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1OCBlYXJfcGFfZ2FpbjsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAgPSAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JZWFyX3BhX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNDsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0VBUiwgMHg3MCwgZWFyX3BhX2dhaW4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXNoYS0+ZWFyX3Nwa3JfZ2FpbjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlYXJfc3Brcl9nYWluID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZWFyX3Nwa3JfcGFfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gID0gJWxkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JdGFzaGEtPmVhcl9zcGtyX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb25maWdfY29tcGFuZGVyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGludGVycF9uLAotCQkJCSAgaW50IGV2ZW50KQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBjb21wOwotCXUxNiBjb21wX2N0bDBfcmVnLCByeF9wYXRoX2NmZzBfcmVnOwotCi0JLyogRUFSIGRvZXMgbm90IGhhdmUgY29tcGFuZGVyICovCi0JaWYgKCFpbnRlcnBfbikKLQkJcmV0dXJuIDA7Ci0KLQljb21wID0gaW50ZXJwX24gLSAxOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBldmVudCAlZCBjb21wYW5kZXIgJWQsIGVuYWJsZWQgJWRcbiIsCi0JCV9fZnVuY19fLCBldmVudCwgY29tcCArIDEsIHRhc2hhLT5jb21wX2VuYWJsZWRbY29tcF0pOwotCi0JaWYgKCF0YXNoYS0+Y29tcF9lbmFibGVkW2NvbXBdKQotCQlyZXR1cm4gMDsKLQotCWNvbXBfY3RsMF9yZWcgPSBXQ0Q5MzM1X0NEQ19DT01QQU5ERVIxX0NUTDAgKyAoY29tcCAqIDgpOwotCXJ4X3BhdGhfY2ZnMF9yZWcgPSBXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DRkcwICsgKGNvbXAgKiAyMCk7Ci0KLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQkvKiBFbmFibGUgQ29tcGFuZGVyIENsb2NrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDEsIDB4MDEpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAyKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJ4X3BhdGhfY2ZnMF9yZWcsIDB4MDIsIDB4MDIpOwotCX0KLQotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDA0LCAweDA0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmcwX3JlZywgMHgwMiwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMSwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDQsIDB4MDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NvbmZpZ19tYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWludCByZXQgPSAwOwotCWludCBpZHg7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQlzdHJ1Y3QgZmlybXdhcmVfY2FsICpod2RlcF9jYWwgPSBOVUxMOwotCXN0cnVjdCB3Y2RfbWFkX2F1ZGlvX2NhbCAqbWFkX2NhbCA9IE5VTEw7Ci0JY29uc3Qgdm9pZCAqZGF0YTsKLQljb25zdCBjaGFyICpmaWxlbmFtZSA9IFRBU0hBX01BRF9BVURJT19GSVJNV0FSRV9QQVRIOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXNpemVfdCBjYWxfc2l6ZTsKLQotCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRhc2hhLT5md19kYXRhLCBXQ0Q5WFhYX01BRF9DQUwpOwotCWlmIChod2RlcF9jYWwpIHsKLQkJZGF0YSA9IGh3ZGVwX2NhbC0+ZGF0YTsKLQkJY2FsX3NpemUgPSBod2RlcF9jYWwtPnNpemU7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyBod2RlcCBjYWxpYnJhdGlvblxuIiwKLQkJCV9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsIGNvZGVjLT5kZXYpOwotCQlpZiAocmV0IHx8ICFmdykgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogTUFEIGZpcm13YXJlIGFjcXVpcmUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWRhdGEgPSBmdy0+ZGF0YTsKLQkJY2FsX3NpemUgPSBmdy0+c2l6ZTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIHJlcXVlc3RfZmlybXdhcmUgY2FsaWJyYXRpb25cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKGNhbF9zaXplIDwgc2l6ZW9mKCptYWRfY2FsKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEluY29ycmVjdCBzaXplICV6ZCBmb3IgTUFEIENhbCwgZXhwZWN0ZWQgJXpkXG4iLAotCQkJX19mdW5jX18sIGNhbF9zaXplLCBzaXplb2YoKm1hZF9jYWwpKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCW1hZF9jYWwgPSAoc3RydWN0IHdjZF9tYWRfYXVkaW9fY2FsICopIChkYXRhKTsKLQlpZiAoIW1hZF9jYWwpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGNhbGlicmF0aW9uIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfTUFJTl9DVExfMiwKLQkJICAgICAgbWFkX2NhbC0+bWljcm9waG9uZV9pbmZvLmN5Y2xlX3RpbWUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9NQUlOX0NUTF8xLCAweEZGIDw8IDMsCi0JCQkgICAgKCh1aW50MTZfdCltYWRfY2FsLT5taWNyb3Bob25lX2luZm8uc2V0dGxlX3RpbWUpCi0JCQkgICAgPDwgMyk7Ci0KLQkvKiBBdWRpbyAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfOCwKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfb21pdF9zYW1wbGVzKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzEsCi0JCQkgICAgMHgwNyA8PCA0LCBtYWRfY2FsLT5hdWRpb19pbmZvLnJtc19jb21wX3RpbWUgPDwgNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0NUTF8yLCAweDAzIDw8IDIsCi0JCQkgICAgbWFkX2NhbC0+YXVkaW9faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNywKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDNGKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQVVESU9fQ1RMXzUsCi0JCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19DVExfNiwKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfdGhyZXNob2xkX21zYik7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUobWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzKTsKLQkgICAgIGlkeCsrKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUiwKLQkJCQkgICAgMHgzRiwgaWR4KTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMLAotCQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczpNQUQgQXVkaW8gSUlSIENvZWZbJWRdID0gMFgleCIsCi0JCQlfX2Z1bmNfXywgaWR4LAotCQkJbWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCX0KLQotCS8qIEJlYWNvbiAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzgsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc19vbWl0X3NhbXBsZXMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzEsCi0JCQkgICAgMHgwNyA8PCA0LCBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfY29tcF90aW1lIDw8IDQpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzIsIDB4MDMgPDwgMiwKLQkJCSAgICBtYWRfY2FsLT5iZWFjb25faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzcsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc19kaWZmX3RocmVzaG9sZCAmIDB4MUYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9CRUFDT05fQ1RMXzUsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0NUTF82LAotCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfdGhyZXNob2xkX21zYik7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUobWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50cyk7Ci0JICAgICBpZHgrKykgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSLAotCQkJCSAgICAweDNGLCBpZHgpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMLAotCQkJICAgICAgbWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6TUFEIEJlYWNvbiBJSVIgQ29lZlslZF0gPSAwWCV4IiwKLQkJCV9fZnVuY19fLCBpZHgsCi0JCQltYWRfY2FsLT5iZWFjb25faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCX0KLQotCS8qIFVsdHJhc291bmQgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfMSwKLQkJCSAgICAweDA3IDw8IDQsCi0JCQkgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc19jb21wX3RpbWUgPDwgNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9TT0NfTUFEX1VMVFJfQ1RMXzIsIDB4MDMgPDwgMiwKLQkJCSAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X1NPQ19NQURfVUxUUl9DVExfNywKLQkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc19kaWZmX3RocmVzaG9sZCAmIDB4MUYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF81LAotCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfU09DX01BRF9VTFRSX0NUTF82LAotCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOwotCi1kb25lOgotCWlmICghaHdkZXBfY2FsKQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZW5hYmxlX21hZChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0JLyogUmV0dXJuIGlmIENQRSBJTlBVVCBpcyBERUMxICovCi0JaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTMzNV9DUEVfU1NfU1ZBX0NGRykgJiAweDAxKQotCQlyZXR1cm4gcmV0OwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0KLQkJLyogVHVybiBvbiBNQUQgY2xrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCi0JCS8qIFVuZG8gcmVzZXQgZm9yIE1BRCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19NQURfQ1RMLAotCQkJCSAgICAweDAyLCAweDAwKTsKLQkJcmV0ID0gdGFzaGFfY29kZWNfY29uZmlnX21hZChjb2RlYyk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gY29uZmlnIE1BRCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKiBSZXNldCB0aGUgTUFEIGJsb2NrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDIsIDB4MDIpOwotCQkvKiBUdXJuIG9mZiBNQUQgY2xrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDEsIDB4MDApOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NvbmZpZ3VyZV9jcGVfaW5wdXQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCSIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQkvKiBDb25maWd1cmUgQ1BFIGlucHV0IGFzIERFQzEgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfU1ZBX0NGRywKLQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0KLQkJLyogQ29uZmlndXJlIERFQzEgVHggb3V0IHdpdGggc2FtcGxlIHJhdGUgYXMgMTZLICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NUTCwKLQkJCQkgICAgMHgwRiwgMHgwMSk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIFJlc2V0IERFQzEgVHggb3V0IHNhbXBsZSByYXRlICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NUTCwKLQkJCQkgICAgMHgwRiwgMHgwNCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1NWQV9DRkcsCi0JCQkJICAgIDB4MDEsIDB4MDApOwotCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWlmICh0ZXN0X2JpdChBSUY0X1NXSVRDSF9WQUxVRSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKSkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCWVsc2UKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEFJRjQgc3dpdGNoIHZhbHVlID0gJWxkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2FpZjRfbWl4ZXJfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYV9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQUlGNCBzd2l0Y2ggdmFsdWUgPSAlbGRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sCi0JCQkJCQlrY29udHJvbCwgMSwgdXBkYXRlKTsKLQkJc2V0X2JpdChBSUY0X1NXSVRDSF9WQUxVRSwgJnRhc2hhX3AtPnN0YXR1c19tYXNrKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwKLQkJCQkJCWtjb250cm9sLCAwLCB1cGRhdGUpOwotCQljbGVhcl9iaXQoQUlGNF9TV0lUQ0hfVkFMVUUsICZ0YXNoYV9wLT5zdGF0dXNfbWFzayk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFzaGFfZWFyX3BhX2dhaW5fdGV4dFtdID0gewotCSJHXzZfREIiLCAiR180UDVfREIiLCAiR18zX0RCIiwgIkdfMVA1X0RCIiwKLQkiR18wX0RCIiwgIkdfTTJQNV9EQiIsICJVTkRFRklORUQiLCAiR19NMTJfREIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dFtdID0gewotCSJHX0RFRkFVTFQiLCAiR18wX0RCIiwgIkdfMV9EQiIsICJHXzJfREIiLCAiR18zX0RCIiwgIkdfNF9EQiIsCi0JIkdfNV9EQiIsICJHXzZfREIiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Vhcl9wYV9nYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXNoYV9lYXJfcGFfZ2Fpbl90ZXh0KSwKLQkJCXRhc2hhX2Vhcl9wYV9nYWluX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dCksCi0JCQkgICAgdGFzaGFfZWFyX3Nwa3JfcGFfZ2Fpbl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRhc2hhX2FuYWxvZ19nYWluX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJFQVIgUEEgR2FpbiIsIHRhc2hhX2Vhcl9wYV9nYWluX2VudW0sCi0JCXRhc2hhX2Vhcl9wYV9nYWluX2dldCwgdGFzaGFfZWFyX3BhX2dhaW5fcHV0KSwKLQotCVNPQ19FTlVNX0VYVCgiRUFSIFNQS1IgUEEgR2FpbiIsIHRhc2hhX2Vhcl9zcGtyX3BhX2dhaW5fZW51bSwKLQkJICAgICB0YXNoYV9lYXJfc3Brcl9wYV9nYWluX2dldCwgdGFzaGFfZWFyX3Nwa3JfcGFfZ2Fpbl9wdXQpLAotCi0JU09DX1NJTkdMRV9UTFYoIkhQSEwgVm9sdW1lIiwgV0NEOTMzNV9IUEhfTF9FTiwgMCwgMjAsIDEsCi0JCWxpbmVfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkhQSFIgVm9sdW1lIiwgV0NEOTMzNV9IUEhfUl9FTiwgMCwgMjAsIDEsCi0JCWxpbmVfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQxIFZvbHVtZSIsIFdDRDkzMzVfRElGRl9MT19MTzFfQ09NUEFOREVSLAotCQkJMywgMTYsIDEsIGxpbmVfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQyIFZvbHVtZSIsIFdDRDkzMzVfRElGRl9MT19MTzJfQ09NUEFOREVSLAotCQkJMywgMTYsIDEsIGxpbmVfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQzIFZvbHVtZSIsIFdDRDkzMzVfU0VfTE9fTE8zX0dBSU4sIDAsIDIwLCAxLAotCQkJbGluZV9nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiTElORU9VVDQgVm9sdW1lIiwgV0NEOTMzNV9TRV9MT19MTzRfR0FJTiwgMCwgMjAsIDEsCi0JCQlsaW5lX2dhaW4pLAotCi0JU09DX1NJTkdMRV9UTFYoIkFEQzEgVm9sdW1lIiwgV0NEOTMzNV9BTkFfQU1JQzEsIDAsIDIwLCAwLAotCQkJYW5hbG9nX2dhaW4pLAotCVNPQ19TSU5HTEVfVExWKCJBREMyIFZvbHVtZSIsIFdDRDkzMzVfQU5BX0FNSUMyLCAwLCAyMCwgMCwKLQkJCWFuYWxvZ19nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDMyBWb2x1bWUiLCBXQ0Q5MzM1X0FOQV9BTUlDMywgMCwgMjAsIDAsCi0JCQlhbmFsb2dfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkFEQzQgVm9sdW1lIiwgV0NEOTMzNV9BTkFfQU1JQzQsIDAsIDIwLCAwLAotCQkJYW5hbG9nX2dhaW4pLAotCVNPQ19TSU5HTEVfVExWKCJBREM1IFZvbHVtZSIsIFdDRDkzMzVfQU5BX0FNSUM1LCAwLCAyMCwgMCwKLQkJCWFuYWxvZ19nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDNiBWb2x1bWUiLCBXQ0Q5MzM1X0FOQV9BTUlDNiwgMCwgMjAsIDAsCi0JCQlhbmFsb2dfZ2FpbiksCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiU1JDX0lOX0hQSEwiLCAiU1JDX0lOX0xPMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMxX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiU1JDX0lOX0hQSFIiLCAiU1JDX0lOX0xPMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwbF9zcmMyX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiU1JDX0lOX0xPMyIsICJTUkNfSU5fU1BLUkwiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGxfc3JjM19tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlNSQ19JTl9MTzQiLCAiU1JDX0lOX1NQS1JSIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50MF83X21peF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwKLQkiUlg2IiwgIlJYNyIsICJQUk9YSU1JVFkiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludF9taXhfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWDAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsCi0JIlJYNiIsICJSWDciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X3ByaW1fbWl4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiSUlSMCIsICJJSVIxIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwKLQkiUlgzIiwgIlJYNCIsICJSWDUiLCAiUlg2IiwgIlJYNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcnhfc2lkZXRvbmVfbWl4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJTUkMwIiwgIlNSQzEiLCAiU1JDX1NVTSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYMCIsICJERUMwIiwgIkRFQzBfMTkyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDFfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFgxIiwgIkRFQzEiLCAiREVDMV8xOTIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4Ml9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDIiLCAiREVDMiIsICJERUMyXzE5MiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgzX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYMyIsICJERUMzIiwgIkRFQzNfMTkyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDRfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFg0IiwgIkRFQzQiLCAiREVDNF8xOTIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4NV9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDUiLCAiREVDNSIsICJERUM1XzE5MiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg2X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYNiIsICJERUM2IiwgIkRFQzZfMTkyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzYl90eDdfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFg3IiwgIkRFQzciLCAiREVDN18xOTIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4OF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDgiLCAiREVDOCIsICJERUM4XzE5MiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHg5X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDNyIsICJERUM3XzE5MiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgxMF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkRFQzYiLCAiREVDNl8xOTIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4MTFfbXV4X3RleHRbXSA9IHsKLQkiREVDXzBfNSIsICJERUNfOV8xMiIsICJNQURfQVVESU8iLCAiTUFEX0JSRENTVCIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2JfdHgxMV9pbnAxX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDMCIsICJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwKLQkiREVDNSIsICJSWF9NSVhfVFg1IiwgIkRFQzlfMTAiLCAiREVDMTFfMTIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNiX3R4MTNfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJERUM1IiwgIkRFQzVfMTkyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eDEzX2lucF9tdXhfdGV4dFtdID0gewotCSJDRENfREVDXzUiLCAiTUFEX0JSRENTVCIsICJDUEVfVFhfUFAiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpcl9pbnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJERUMwIiwgIkRFQzEiLCAiREVDMiIsICJERUMzIiwgIkRFQzQiLCAiREVDNSIsICJERUM2IiwKLQkiREVDNyIsICJERUM4IiwJIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludF9kZW1faW5wX211eF90ZXh0W10gPSB7Ci0JIk5PUk1BTF9EU01fT1VUIiwgIkNMU0hfRFNNX09VVCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDBfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMCBNSVgyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50MV9pbnRlcnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWCBJTlQxIE1JWDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQyX2ludGVycF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYIElOVDIgTUlYMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDNfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMyBNSVgyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50NF9pbnRlcnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWCBJTlQ0IE1JWDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ1X2ludGVycF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYIElOVDUgTUlYMiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDZfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UNiBNSVgyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50N19pbnRlcnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWCBJTlQ3IE1JWDIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ4X2ludGVycF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYIElOVDggU0VDIE1JWCIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWFkX3NlbF90ZXh0W10gPSB7Ci0JIlNQRSIsICJNU00iCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkY19tdXhfdGV4dFtdID0gewotCSJETUlDIiwgIkFNSUMiLCAiQU5DX0ZCX1RVTkUxIiwgIkFOQ19GQl9UVU5FMiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZG1pY19tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwgIkRNSUM0IiwgIkRNSUM1IiwKLQkiU01JQzAiLCAiU01JQzEiLCAiU01JQzIiLCAiU01JQzMiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRtaWNfbXV4X2FsdF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiRE1JQzAiLCAiRE1JQzEiLCAiRE1JQzIiLCAiRE1JQzMiLCAiRE1JQzQiLCAiRE1JQzUiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbWljX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQURDMSIsICJBREMyIiwgIkFEQzMiLCAiQURDNCIsICJBREM1IiwgIkFEQzYiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2VjaG9fbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVgwIiwgIlJYX01JWDEiLCAiUlhfTUlYMiIsICJSWF9NSVgzIiwgIlJYX01JWDQiLAotCSJSWF9NSVg1IiwgIlJYX01JWDYiLCAiUlhfTUlYNyIsICJSWF9NSVg4IiwgIlJYX01JWF9WQkFUNSIsCi0JIlJYX01JWF9WQkFUNiIsCSJSWF9NSVhfVkJBVDciLCAiUlhfTUlYX1ZCQVQ4IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMwX2ZiX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQU5DX0lOX0hQSEwiLCAiQU5DX0lOX0VBUiIsICJBTkNfSU5fRUFSX1NQS1IiLAotCSJBTkNfSU5fTE8xIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMxX2ZiX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQU5DX0lOX0hQSFIiLCAiQU5DX0lOX0xPMiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX211eF90ZXh0W10gPSB7Ci0JIk9GRiIsICJPTiIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwbF9zcmMwX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzAsIDAsIDMsCi0JCQlzcGxfc3JjMF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc3BsX3NyYzFfbXV4X2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1NQTElORV9TUkNfQ0ZHMCwgMiwgMywKLQkJCXNwbF9zcmMxX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGxfc3JjMl9tdXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX1NSQ19DRkcwLCA0LCAzLAotCQkJc3BsX3NyYzJfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNwbF9zcmMzX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9TUExJTkVfU1JDX0NGRzAsIDYsIDMsCi0JCQlzcGxfc3JjM19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF8yX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDAsIDEwLAotCQkJcnhfaW50MF83X21peF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV8yX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDAsIDksCi0JCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyXzJfbXV4X2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMSwgMCwgOSwKLQkJCXJ4X2ludF9taXhfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDNfMl9tdXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAwLCA5LAotCQkJcnhfaW50X21peF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF8yX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDAsIDksCi0JCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ1XzJfbXV4X2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMSwgMCwgOSwKLQkJCXJ4X2ludF9taXhfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDZfMl9tdXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcxLCAwLCA5LAotCQkJcnhfaW50X21peF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N18yX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDAsIDEwLAotCQkJcnhfaW50MF83X21peF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF8yX211eF9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDAsIDksCi0JCQlyeF9pbnRfbWl4X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpbnQxXzFfbmF0aXZlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUobmF0aXZlX211eF90ZXh0KSwKLQkJCW5hdGl2ZV9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaW50Ml8xX25hdGl2ZV9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoU05EX1NPQ19OT1BNLCAwLCBBUlJBWV9TSVpFKG5hdGl2ZV9tdXhfdGV4dCksCi0JCQluYXRpdmVfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGludDNfMV9uYXRpdmVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFNORF9TT0NfTk9QTSwgMCwgQVJSQVlfU0laRShuYXRpdmVfbXV4X3RleHQpLAotCQkJbmF0aXZlX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpbnQ0XzFfbmF0aXZlX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTkRfU09DX05PUE0sIDAsIEFSUkFZX1NJWkUobmF0aXZlX211eF90ZXh0KSwKLQkJCW5hdGl2ZV9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQwXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDBfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQxXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDFfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDJfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDJfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M18xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDNfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQzXzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDNfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDRfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ0XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDRfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NV8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDVfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ1XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNV9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDVfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ1X0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Nl8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDZfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ2XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNl9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDZfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ2X0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N18xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDdfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ3XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDdfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF8xX21peF9pbnAwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMCwgMCwgMTMsCi0JCQlyeF9wcmltX21peF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQ4XzFfbWl4X2lucDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcwLCA0LCAxMywKLQkJCXJ4X3ByaW1fbWl4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDhfMV9taXhfaW5wMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDQsIDEzLAotCQkJcnhfcHJpbV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDAsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDIsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDQsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M19zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDYsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDAsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N19zaWRldG9uZV9taXhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDIsIDQsCi0JCQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDBfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgMCwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgMCwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDJfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSwgMCwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDNfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgMCwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDRfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDVfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDZfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDdfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDhfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDEwX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwLCA2LCA0LAotCQkJYWRjX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hZGNfbXV4MTFfY2hhaW5fZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDYsIDQsCi0JCQlhZGNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FkY19tdXgxMl9jaGFpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgNiwgNCwKLQkJCWFkY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYWRjX211eDEzX2NoYWluX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwLCA2LCA0LAotCQkJYWRjX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCwgMywgMTEsCi0JCQlkbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCwgMywgMTEsCi0JCQlkbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMywgMTEsCi0JCQlkbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMCwgMywgMTEsCi0JCQlkbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDRfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDZfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDZfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDdfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDEwX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMF9DRkcwLCAzLCA3LAotCQkJZG1pY19tdXhfYWx0X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2RtaWNfbXV4MTFfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDMsIDcsCi0JCQlkbWljX211eF9hbHRfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfZG1pY19tdXgxMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMywgNywKLQkJCWRtaWNfbXV4X2FsdF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9kbWljX211eDEzX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxM19DRkcwLCAzLCA3LAotCQkJZG1pY19tdXhfYWx0X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAwLCA3LAotCQkJYW1pY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXgxX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxX0NGRzAsIDAsIDcsCi0JCQlhbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDJfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMCwgNywKLQkJCWFtaWNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4M19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAwLCA3LAotCQkJYW1pY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXg0X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg0X0NGRzAsIDAsIDcsCi0JCQlhbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDVfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMCwgNywKLQkJCWFtaWNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4Nl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwLCAwLCA3LAotCQkJYW1pY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXg3X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg3X0NGRzAsIDAsIDcsCi0JCQlhbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMCwgNywKLQkJCWFtaWNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MTBfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsIDAsIDcsCi0JCQlhbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0eF9hbWljX211eDExX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgxMV9DRkcwLCAwLCA3LAotCQkJYW1pY19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHhfYW1pY19tdXgxMl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMCwgNywKLQkJCWFtaWNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHR4X2FtaWNfbXV4MTNfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsIDAsIDcsCi0JCQlhbWljX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDAsIDQsCi0JCQlzYl90eDBfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MV9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgMiwgNCwKLQkJCXNiX3R4MV9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHgyX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLCA0LCA0LAotCQkJc2JfdHgyX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDNfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDYsIDQsCi0JCQlzYl90eDNfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4NF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgMCwgNCwKLQkJCXNiX3R4NF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg1X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxLCAyLCA0LAotCQkJc2JfdHg1X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDZfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsIDQsIDQsCi0JCQlzYl90eDZfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4N19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgNiwgNCwKLQkJCXNiX3R4N19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfdHg4X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAwLCA0LAotCQkJc2JfdHg4X211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDlfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDIsIDMsCi0JCQlzYl90eDlfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHNiX3R4MTBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDQsIDMsCi0JCQlzYl90eDEwX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDExX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9TQl9UWDExX0lOUF9DRkcsIDAsIDQsCi0JCQlzYl90eDExX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDExX2lucDFfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMsIDAsIDEwLAotCQkJc2JfdHgxMV9pbnAxX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzYl90eDEzX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczLCA0LCAzLAotCQkJc2JfdHgxM19tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHgxM19pbnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1NCX1RYMTNfSU5QX0NGRywgMCwgMywKLQkJCXR4MTNfaW5wX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgwX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCwgMCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgxX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMCwgNCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgyX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgMCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHgzX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMSwgNCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg0X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMiwgMCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg1X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMiwgNCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg2X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMywgMCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg3X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHMywgNCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9taXhfdHg4X211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9NSVhfQ0ZHNCwgMCwgMTQsCi0JCQlyeF9lY2hvX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIwX2lucDBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcwLCAwLCAxOCwKLQkJCWlpcl9pbnBfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjBfaW5wMV9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzEsIDAsIDE4LAotCQkJaWlyX2lucF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMF9pbnAyX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMiwgMCwgMTgsCi0JCQlpaXJfaW5wX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIwX2lucDNfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkczLCAwLCAxOCwKLQkJCWlpcl9pbnBfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wMF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzAsIDAsIDE4LAotCQkJaWlyX2lucF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaWlyMV9pbnAxX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMSwgMCwgMTgsCi0JCQlpaXJfaW5wX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpaXIxX2lucDJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcyLCAwLCAxOCwKLQkJCWlpcl9pbnBfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGlpcjFfaW5wM19tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzMsIDAsIDE4LAotCQkJaWlyX2lucF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9kZW1faW5wX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCwgMCwKLQkJCUFSUkFZX1NJWkUocnhfaW50X2RlbV9pbnBfbXV4X3RleHQpLAotCQkJcnhfaW50X2RlbV9pbnBfbXV4X3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ4X2ludDFfZGVtX2lucF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDAsCi0JCQlBUlJBWV9TSVpFKHJ4X2ludF9kZW1faW5wX211eF90ZXh0KSwKLQkJCXJ4X2ludF9kZW1faW5wX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9pbnQyX2RlbV9pbnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAwLAotCQkJQVJSQVlfU0laRShyeF9pbnRfZGVtX2lucF9tdXhfdGV4dCksCi0JCQlyeF9pbnRfZGVtX2lucF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MF9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQwX2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50MV9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQxX2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Ml9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQyX2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50M19pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQzX2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NF9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQ0X2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50NV9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQ1X2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50Nl9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQ2X2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50N19pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQ3X2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gcnhfaW50OF9pbnRlcnBfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DVEwsIDUsIDIsCi0JCQlyeF9pbnQ4X2ludGVycF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWFkX3NlbF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTMzNV9DUEVfU1NfQ0ZHLCAwLCAyLCBtYWRfc2VsX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFuYzBfZmJfbXV4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX0FOQ19DRkcwLCAwLCA1LAotCQkJYW5jMF9mYl9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gYW5jMV9mYl9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzMzVfQ0RDX1JYX0lOUF9NVVhfQU5DX0NGRzAsIDMsIDMsCi0JCQlhbmMxX2ZiX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfZGVtX2lucF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQwIERFTSBNVVggTXV4IiwgcnhfaW50MF9kZW1faW5wX211eF9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfZGVtX2lucF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQxIERFTSBNVVggTXV4IiwgcnhfaW50MV9kZW1faW5wX211eF9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfZGVtX2lucF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJSWCBJTlQyIERFTSBNVVggTXV4IiwgcnhfaW50Ml9kZW1faW5wX211eF9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9pbnRfZGVtX2lucF9tdXhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU1BMIFNSQzAgTVVYIE11eCIsIHNwbF9zcmMwX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU1BMIFNSQzEgTVVYIE11eCIsIHNwbF9zcmMxX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMyX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU1BMIFNSQzIgTVVYIE11eCIsIHNwbF9zcmMyX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwbF9zcmMzX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU1BMIFNSQzMgTVVYIE11eCIsIHNwbF9zcmMzX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDBfMiBNVVggTXV4IiwgcnhfaW50MF8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDFfMiBNVVggTXV4IiwgcnhfaW50MV8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMiBNVVggTXV4IiwgcnhfaW50Ml8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDNfMiBNVVggTXV4IiwgcnhfaW50M18yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDRfMiBNVVggTXV4IiwgcnhfaW50NF8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDVfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDVfMiBNVVggTXV4IiwgcnhfaW50NV8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDZfMiBNVVggTXV4IiwgcnhfaW50Nl8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDdfMiBNVVggTXV4IiwgcnhfaW50N18yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDhfMiBNVVggTXV4IiwgcnhfaW50OF8yX211eF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDFfMV9uYXRpdmVfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQxXzEgTkFUSVZFIE1VWCBNdXgiLCBpbnQxXzFfbmF0aXZlX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50Ml8xX25hdGl2ZV9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMSBOQVRJVkUgTVVYIE11eCIsIGludDJfMV9uYXRpdmVfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQzXzFfbmF0aXZlX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UM18xIE5BVElWRSBNVVggTXV4IiwgaW50M18xX25hdGl2ZV9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDRfMV9uYXRpdmVfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ0XzEgTkFUSVZFIE1VWCBNdXgiLCBpbnQ0XzFfbmF0aXZlX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MF8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UMF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQwXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQwXzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQwXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDBfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDBfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDBfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50MF8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MV8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UMV8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQxXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxXzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQxXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDFfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDFfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50MV8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Ml8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UMl8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQyXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQyXzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQyXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDJfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDJfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50Ml8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50M18xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UM18xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQzXzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQzXzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQzXzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDNfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDNfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50M18xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NF8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ0XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ0XzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ0XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDRfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDRfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50NF8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNV8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ1XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ1XzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ1XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDVfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDVfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDVfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50NV8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Nl8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNl8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ2XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2XzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ2XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDZfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDZfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDZfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50Nl8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50N18xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UN18xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ3XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ3XzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDdfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDdfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50N18xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50OF8xX21peF9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UOF8xIE1JWDEgSU5QMCBNdXgiLCByeF9pbnQ4XzFfbWl4X2lucDBfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ4XzFfbWl4X2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIE11eCIsIHJ4X2ludDhfMV9taXhfaW5wMV9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDhfMV9taXhfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDhfMSBNSVgxIElOUDIgTXV4IiwgcnhfaW50OF8xX21peF9pbnAyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50MF9taXgyX2lucF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDAgTUlYMiBJTlAgTXV4IiwgcnhfaW50MF9zaWRldG9uZV9taXhfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxX21peDJfaW5wX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UMSBNSVgyIElOUCBNdXgiLCByeF9pbnQxX3NpZGV0b25lX21peF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDJfbWl4Ml9pbnBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQyIE1JWDIgSU5QIE11eCIsIHJ4X2ludDJfc2lkZXRvbmVfbWl4X2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50M19taXgyX2lucF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDMgTUlYMiBJTlAgTXV4IiwgcnhfaW50M19zaWRldG9uZV9taXhfY2hhaW5fZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ0X21peDJfaW5wX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNCBNSVgyIElOUCBNdXgiLCByeF9pbnQ0X3NpZGV0b25lX21peF9jaGFpbl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfbWl4Ml9pbnBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ3IE1JWDIgSU5QIE11eCIsIHJ4X2ludDdfc2lkZXRvbmVfbWl4X2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDAgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMCBNdXgiLCB0eF9hZGNfbXV4MF9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMSBNdXgiLCB0eF9hZGNfbXV4MV9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDIgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMiBNdXgiLCB0eF9hZGNfbXV4Ml9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDMgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYMyBNdXgiLCB0eF9hZGNfbXV4M19jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDQgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNCBNdXgiLCB0eF9hZGNfbXV4NF9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDUgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNSBNdXgiLCB0eF9hZGNfbXV4NV9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDYgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNiBNdXgiLCB0eF9hZGNfbXV4Nl9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDcgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYNyBNdXgiLCB0eF9hZGNfbXV4N19jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBREMgTVVYOCBNdXgiLCB0eF9hZGNfbXV4OF9jaGFpbl9lbnVtLAotCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLAotCQkJICB0YXNoYV9wdXRfZGVjX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEwID0KLQlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTAgTXV4IiwgdHhfYWRjX211eDEwX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDExID0KLQlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTEgTXV4IiwgdHhfYWRjX211eDExX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEyID0KLQlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTIgTXV4IiwgdHhfYWRjX211eDEyX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYWRjX211eDEzID0KLQlTT0NfREFQTV9FTlVNKCJBREMgTVVYMTMgTXV4IiwgdHhfYWRjX211eDEzX2NoYWluX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgwID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDAgTXV4IiwgdHhfZG1pY19tdXgwX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDEgTXV4IiwgdHhfZG1pY19tdXgxX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgyID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDIgTXV4IiwgdHhfZG1pY19tdXgyX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgzID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDMgTXV4IiwgdHhfZG1pY19tdXgzX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg0ID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDQgTXV4IiwgdHhfZG1pY19tdXg0X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg1ID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDUgTXV4IiwgdHhfZG1pY19tdXg1X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg2ID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDYgTXV4IiwgdHhfZG1pY19tdXg2X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg3ID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDcgTXV4IiwgdHhfZG1pY19tdXg3X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXg4ID0KLQlTT0NfREFQTV9FTlVNKCJETUlDIE1VWDggTXV4IiwgdHhfZG1pY19tdXg4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMCA9Ci0JU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMCBNdXgiLCB0eF9kbWljX211eDEwX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMSA9Ci0JU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMSBNdXgiLCB0eF9kbWljX211eDExX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMiA9Ci0JU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMiBNdXgiLCB0eF9kbWljX211eDEyX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfZG1pY19tdXgxMyA9Ci0JU09DX0RBUE1fRU5VTSgiRE1JQyBNVVgxMyBNdXgiLCB0eF9kbWljX211eDEzX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgwID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDAgTXV4IiwgdHhfYW1pY19tdXgwX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDEgTXV4IiwgdHhfYW1pY19tdXgxX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgyID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDIgTXV4IiwgdHhfYW1pY19tdXgyX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgzID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDMgTXV4IiwgdHhfYW1pY19tdXgzX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg0ID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDQgTXV4IiwgdHhfYW1pY19tdXg0X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg1ID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDUgTXV4IiwgdHhfYW1pY19tdXg1X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg2ID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDYgTXV4IiwgdHhfYW1pY19tdXg2X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg3ID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDcgTXV4IiwgdHhfYW1pY19tdXg3X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXg4ID0KLQlTT0NfREFQTV9FTlVNKCJBTUlDIE1VWDggTXV4IiwgdHhfYW1pY19tdXg4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMCA9Ci0JU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMCBNdXgiLCB0eF9hbWljX211eDEwX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMSA9Ci0JU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMSBNdXgiLCB0eF9hbWljX211eDExX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMiA9Ci0JU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMiBNdXgiLCB0eF9hbWljX211eDEyX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfYW1pY19tdXgxMyA9Ci0JU09DX0RBUE1fRU5VTSgiQU1JQyBNVVgxMyBNdXgiLCB0eF9hbWljX211eDEzX2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDAgTVVYIE11eCIsIHNiX3R4MF9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJTTElNIFRYMSBNVVggTXV4Iiwgc2JfdHgxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4Ml9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFgyIE1VWCBNdXgiLCBzYl90eDJfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgzX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDMgTVVYIE11eCIsIHNiX3R4M19tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDRfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJTTElNIFRYNCBNVVggTXV4Iiwgc2JfdHg0X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4NV9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg1IE1VWCBNdXgiLCBzYl90eDVfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg2X211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDYgTVVYIE11eCIsIHNiX3R4Nl9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDdfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJTTElNIFRYNyBNVVggTXV4Iiwgc2JfdHg3X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4OF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlNMSU0gVFg4IE1VWCBNdXgiLCBzYl90eDhfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHg5X211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDkgTVVYIE11eCIsIHNiX3R4OV9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDEwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDEwIE1VWCBNdXgiLCBzYl90eDEwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNiX3R4MTFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJTTElNIFRYMTEgTVVYIE11eCIsIHNiX3R4MTFfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2JfdHgxMV9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDExIElOUDEgTVVYIE11eCIsIHNiX3R4MTFfaW5wMV9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl90eDEzX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiU0xJTSBUWDEzIE1VWCBNdXgiLCBzYl90eDEzX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4MTNfaW5wX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiVFgxMyBJTlAgTVVYIE11eCIsIHR4MTNfaW5wX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgwIE1VWCBNdXgiLCByeF9taXhfdHgwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgxIE1VWCBNdXgiLCByeF9taXhfdHgxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgyIE1VWCBNdXgiLCByeF9taXhfdHgyX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDNfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFgzIE1VWCBNdXgiLCByeF9taXhfdHgzX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDRfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg0IE1VWCBNdXgiLCByeF9taXhfdHg0X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDVfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg1IE1VWCBNdXgiLCByeF9taXhfdHg1X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDZfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg2IE1VWCBNdXgiLCByeF9taXhfdHg2X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDdfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg3IE1VWCBNdXgiLCByeF9taXhfdHg3X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X21peF90eDhfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBNSVggVFg4IE1VWCBNdXgiLCByeF9taXhfdHg4X211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjBfaW5wMF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIklJUjAgSU5QMCBNdXgiLCBpaXIwX2lucDBfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMF9pbnAxX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiSUlSMCBJTlAxIE11eCIsIGlpcjBfaW5wMV9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIwX2lucDJfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJJSVIwIElOUDIgTXV4IiwgaWlyMF9pbnAyX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjBfaW5wM19tdXggPQotCVNPQ19EQVBNX0VOVU0oIklJUjAgSU5QMyBNdXgiLCBpaXIwX2lucDNfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnAwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiSUlSMSBJTlAwIE11eCIsIGlpcjFfaW5wMF9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpaXIxX2lucDFfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJJSVIxIElOUDEgTXV4IiwgaWlyMV9pbnAxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGlpcjFfaW5wMl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIklJUjEgSU5QMiBNdXgiLCBpaXIxX2lucDJfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaWlyMV9pbnAzX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiSUlSMSBJTlAzIE11eCIsIGlpcjFfaW5wM19tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQwX2ludGVycF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDAgSU5URVJQIE11eCIsIHJ4X2ludDBfaW50ZXJwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDFfaW50ZXJwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UMSBJTlRFUlAgTXV4IiwgcnhfaW50MV9pbnRlcnBfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Ml9pbnRlcnBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQyIElOVEVSUCBNdXgiLCByeF9pbnQyX2ludGVycF9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQzX2ludGVycF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDMgSU5URVJQIE11eCIsIHJ4X2ludDNfaW50ZXJwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfaW50ZXJwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNCBJTlRFUlAgTXV4IiwgcnhfaW50NF9pbnRlcnBfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50NV9pbnRlcnBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ1IElOVEVSUCBNdXgiLCByeF9pbnQ1X2ludGVycF9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQ2X2ludGVycF9tdXggPQotCVNPQ19EQVBNX0VOVU0oIlJYIElOVDYgSU5URVJQIE11eCIsIHJ4X2ludDZfaW50ZXJwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDdfaW50ZXJwX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiUlggSU5UNyBJTlRFUlAgTXV4IiwgcnhfaW50N19pbnRlcnBfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50OF9pbnRlcnBfbXV4ID0KLQlTT0NfREFQTV9FTlVNKCJSWCBJTlQ4IElOVEVSUCBNdXgiLCByeF9pbnQ4X2ludGVycF9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYWRfc2VsX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiTUFEX1NFTCBNVVggTXV4IiwgbWFkX3NlbF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfbWFkX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBXQ0Q5MzM1X0NQRV9TU19DRkcsIDUsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWFkX2JyZGNzdF9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgV0NEOTMzNV9DUEVfU1NfQ0ZHLCA2LCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCQkJMCwgMSwgMCwgdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfZ2V0LAotCQkJdGFzaGFfY29kZWNfYWlmNF9taXhlcl9zd2l0Y2hfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuY19ocGhsX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2hwaHJfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmNfZWFyX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2Vhcl9zcGtyX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2xpbmVvdXQxX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2xpbmVvdXQyX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX3Nwa3JfcGFfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4MF9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXgxX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDJfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4M19zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg0X3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDVfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4Nl9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg3X3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDhfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmMwX2ZiX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiQU5DMCBGQiBNVVggTXV4IiwgYW5jMF9mYl9tdXhfZW51bSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmMxX2ZiX211eCA9Ci0JU09DX0RBUE1fRU5VTSgiQU5DMSBGQiBNVVggTXV4IiwgYW5jMV9mYl9tdXhfZW51bSk7Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfZWNfYnVmX211eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgPSAlZCBuYW1lID0gJXNcbiIsCi0JCV9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0VDX0JVRl9JTlRfUEVSSU9ELCAweDNCKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfQ0ZHLCAweDA4LCAweDA4KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLAotCQkJCSAgICAweDA4LCAweDA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwKLQkJCQkgICAgMHgwOCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0NGRywgMHgwOCwgMHgwMCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0VDX0JVRl9JTlRfUEVSSU9ELCAweDAwKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVjX2J1Zl9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYTUlYRUMiLCAiU0JfUlgwIiwgIlNCX1JYMSIsICJTQl9SWDIiLCAiU0JfUlgzIiwKLQkiSTJTX1JYX1NEMF9MIiwgIkkyU19SWF9TRDBfUiIsICJJMlNfUlhfU0QxX0wiLCAiSTJTX1JYX1NEMV9SIiwKLQkiREVDMSIKLX07Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChlY19idWZfbXV4X2VudW0sIFdDRDkzMzVfQ1BFX1NTX1VTX0VDX01VWF9DRkcsCi0JCQkgICAgMCwgZWNfYnVmX211eF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVjX2J1Zl9tdXggPQotCVNPQ19EQVBNX0VOVU0oIkVDIEJVRiBNdXgiLCBlY19idWZfbXV4X2VudW0pOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdGFzaGFfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiQU5DIEVBUiIpLAotCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGMSBQQiIsICJBSUYxIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAotCQkJCUFJRjFfUEIsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCi0JCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAotCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYyIFBCIiwgIkFJRjIgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sCi0JCQkJQUlGMl9QQiwgMCwgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW1yeCwKLQkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8Ci0JCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjMgUEIiLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKLQkJCQlBSUYzX1BCLCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXJ4LAotCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EIHwKLQkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9BSUZfSU5fRSgiQUlGNCBQQiIsICJBSUY0IFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLAotCQkJCUFJRjRfUEIsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCi0JCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAotCQkJCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTl9FKCJBSUYgTUlYMSBQQiIsICJBSUYgTWl4IFBsYXliYWNrIiwgMCwKLQkJCSAgICAgICBTTkRfU09DX05PUE0sIEFJRl9NSVgxX1BCLCAwLAotCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltcngsCi0JCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAotCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMCBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYMCwgMCwKLQkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlgwXSksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDEsIDAsCi0JCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYMV0pLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gUlgyIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfUlgyLCAwLAotCQkJCSZzbGltX3J4X211eFtUQVNIQV9SWDJdKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYMyBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYMywgMCwKLQkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlgzXSksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDQgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDQsIDAsCi0JCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYNF0pLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gUlg1IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfUlg1LCAwLAotCQkJCSZzbGltX3J4X211eFtUQVNIQV9SWDVdKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFJYNiBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1JYNiwgMCwKLQkJCQkmc2xpbV9yeF9tdXhbVEFTSEFfUlg2XSksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBSWDcgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9SWDcsIDAsCi0JCQkJJnNsaW1fcnhfbXV4W1RBU0hBX1JYN10pLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFJYNyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIlNQTCBTUkMwIE1VWCIsIFNORF9TT0NfTk9QTSwgU1BMSU5FX1NSQzAsIDAsCi0JCQkgJnNwbF9zcmMwX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9yZXNhbXBsZXIsCi0JCQkgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiU1BMIFNSQzEgTVVYIiwgU05EX1NPQ19OT1BNLCBTUExJTkVfU1JDMSwgMCwKLQkJCSAmc3BsX3NyYzFfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3BsaW5lX3Jlc2FtcGxlciwKLQkJCSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJTUEwgU1JDMiBNVVgiLCBTTkRfU09DX05PUE0sIFNQTElORV9TUkMyLCAwLAotCQkJICZzcGxfc3JjMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zcGxpbmVfcmVzYW1wbGVyLAotCQkJIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlNQTCBTUkMzIE1VWCIsIFNORF9TT0NfTk9QTSwgU1BMSU5FX1NSQzMsIDAsCi0JCQkgJnNwbF9zcmMzX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3NwbGluZV9yZXNhbXBsZXIsCi0JCQkgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQwXzIgTVVYIiwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCwKLQkJCTUsIDAsICZyeF9pbnQwXzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMV8yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwsCi0JCQk1LCAwLCAmcnhfaW50MV8yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDJfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ1RMLAotCQkJNSwgMCwgJnJ4X2ludDJfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzIgTVVYIiwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NUTCwKLQkJCTUsIDAsICZyeF9pbnQzXzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNF8yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEwsCi0JCQk1LCAwLCAmcnhfaW50NF8yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDVfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ1RMLAotCQkJNSwgMCwgJnJ4X2ludDVfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ2XzIgTVVYIiwgV0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NUTCwKLQkJCTUsIDAsICZyeF9pbnQ2XzJfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfbWl4X3BhdGgsCi0JCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18yIE1VWCIsIFdDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwsCi0JCQk1LCAwLCAmcnhfaW50N18yX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMiBNVVgiLCBXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ1RMLAotCQkJNSwgMCwgJnJ4X2ludDhfMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50MF8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMF8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDBfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDBfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQwXzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50MV8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMV8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDFfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDFfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQxXzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50Ml8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMl8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDJfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDJfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQyXzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50M18xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UM18xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDNfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDNfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQzXzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50NF8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNF8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDRfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDRfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ0XzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ1XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50NV8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNV8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDVfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDVfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ1XzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQ2XzEgTUlYMSBJTlAwIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50Nl8xX21peF9pbnAwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNl8xIE1JWDEgSU5QMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDZfMV9taXhfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDZfMSBNSVgxIElOUDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ2XzFfbWl4X2lucDJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDdfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ3XzFfbWl4X2lucDBfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3dyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50N18xX21peF9pbnAxX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDdfMV9taXhfaW5wMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zd3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ4XzFfbWl4X2lucDBfbXV4LCB0YXNoYV9jb2RlY19lbmFibGVfc3dyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50OF8xX21peF9pbnAxX211eCwgdGFzaGFfY29kZWNfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UOF8xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDhfMV9taXhfaW5wMl9tdXgsIHRhc2hhX2NvZGVjX2VuYWJsZV9zd3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDFfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU1BMSU5FIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCXJ4X2ludDFfc3BsaW5lX21peF9zd2l0Y2gsCi0JCQlBUlJBWV9TSVpFKHJ4X2ludDFfc3BsaW5lX21peF9zd2l0Y2gpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyXzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlyeF9pbnQyX3NwbGluZV9taXhfc3dpdGNoLAotCQkJQVJSQVlfU0laRShyeF9pbnQyX3NwbGluZV9taXhfc3dpdGNoKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UM18xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJcnhfaW50M19zcGxpbmVfbWl4X3N3aXRjaCwKLQkJCUFSUkFZX1NJWkUocnhfaW50M19zcGxpbmVfbWl4X3N3aXRjaCkpLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDRfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU1BMSU5FIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCXJ4X2ludDRfc3BsaW5lX21peF9zd2l0Y2gsCi0JCQlBUlJBWV9TSVpFKHJ4X2ludDRfc3BsaW5lX21peF9zd2l0Y2gpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1IFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlyeF9pbnQ1X3NwbGluZV9taXhfc3dpdGNoLAotCQkJQVJSQVlfU0laRShyeF9pbnQ1X3NwbGluZV9taXhfc3dpdGNoKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ1IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IFNQTElORSBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlyeF9pbnQ2X3NwbGluZV9taXhfc3dpdGNoLAotCQkJQVJSQVlfU0laRShyeF9pbnQ2X3NwbGluZV9taXhfc3dpdGNoKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJcnhfaW50N19zcGxpbmVfbWl4X3N3aXRjaCwKLQkJCUFSUkFZX1NJWkUocnhfaW50N19zcGxpbmVfbWl4X3N3aXRjaCkpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ4XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ4IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOCBTUExJTkUgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJcnhfaW50OF9zcGxpbmVfbWl4X3N3aXRjaCwKLQkJCUFSUkFZX1NJWkUocnhfaW50OF9zcGxpbmVfbWl4X3N3aXRjaCkpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQwIE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMSBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDIgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQzIE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNCBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDUgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ2IE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCU5VTEwsIDAsIHRhc2hhX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UOCBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCU5VTEwsIDAsIHRhc2hhX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWCBJTlQ1IFZCQVQiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlyeF9pbnQ1X3ZiYXRfbWl4X3N3aXRjaCwKLQkJCUFSUkFZX1NJWkUocnhfaW50NV92YmF0X21peF9zd2l0Y2gpLAotCQkJdGFzaGFfY29kZWNfdmJhdF9lbmFibGVfZXZlbnQsCi0JCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDYgVkJBVCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCXJ4X2ludDZfdmJhdF9taXhfc3dpdGNoLAotCQkJQVJSQVlfU0laRShyeF9pbnQ2X3ZiYXRfbWl4X3N3aXRjaCksCi0JCQl0YXNoYV9jb2RlY192YmF0X2VuYWJsZV9ldmVudCwKLQkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBWQkFUIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJcnhfaW50N192YmF0X21peF9zd2l0Y2gsCi0JCQlBUlJBWV9TSVpFKHJ4X2ludDdfdmJhdF9taXhfc3dpdGNoKSwKLQkJCXRhc2hhX2NvZGVjX3ZiYXRfZW5hYmxlX2V2ZW50LAotCQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJSWCBJTlQ4IFZCQVQiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlyeF9pbnQ4X3ZiYXRfbWl4X3N3aXRjaCwKLQkJCUFSUkFZX1NJWkUocnhfaW50OF92YmF0X21peF9zd2l0Y2gpLAotCQkJdGFzaGFfY29kZWNfdmJhdF9lbmFibGVfZXZlbnQsCi0JCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQwIE1JWDIgSU5QIiwgV0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMSwgNCwKLQkJCSAgIDAsICZyeF9pbnQwX21peDJfaW5wX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMSBNSVgyIElOUCIsIFdDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzEsIDQsCi0JCQkgICAwLCAmcnhfaW50MV9taXgyX2lucF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDIgTUlYMiBJTlAiLCBXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcxLCA0LAotCQkJICAgMCwgJnJ4X2ludDJfbWl4Ml9pbnBfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJSWCBJTlQzIE1JWDIgSU5QIiwgV0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMSwgNCwKLQkJCSAgIDAsICZyeF9pbnQzX21peDJfaW5wX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UNCBNSVgyIElOUCIsIFdDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzEsIDQsCi0JCQkgICAwLCAmcnhfaW50NF9taXgyX2lucF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDcgTUlYMiBJTlAiLCBXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9DRkcxLCA0LAotCQkJICAgMCwgJnJ4X2ludDdfbWl4Ml9pbnBfbXV4KSwKLQotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgwIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgwLCAwLAotCQkmc2JfdHgwX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDEsIDAsCi0JCSZzYl90eDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYMiBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMiwgMCwKLQkJJnNiX3R4Ml9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgzIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgzLCAwLAotCQkmc2JfdHgzX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDQgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDQsIDAsCi0JCSZzYl90eDRfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYNSBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYNSwgMCwKLQkJJnNiX3R4NV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFg2IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg2LCAwLAotCQkmc2JfdHg2X211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDcgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDcsIDAsCi0JCSZzYl90eDdfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYOCBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYOCwgMCwKLQkJJnNiX3R4OF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFg5IE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFg5LCAwLAotCQkmc2JfdHg5X211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiU0xJTSBUWDEwIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMCwgMCwKLQkJJnNiX3R4MTBfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNIFRYMTEgTVVYIiwgU05EX1NPQ19OT1BNLCBUQVNIQV9UWDExLCAwLAotCQkmc2JfdHgxMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgxMSBJTlAxIE1VWCIsIFNORF9TT0NfTk9QTSwgVEFTSEFfVFgxMSwgMCwKLQkJJnNiX3R4MTFfaW5wMV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlNMSU0gVFgxMyBNVVgiLCBTTkRfU09DX05PUE0sIFRBU0hBX1RYMTMsIDAsCi0JCSZzYl90eDEzX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiVFgxMyBJTlAgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICZ0eDEzX2lucF9tdXgpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMCIsIFdDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX0NUTCwgNSwgMCwKLQkJCSAgICZ0eF9hZGNfbXV4MCwgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEiLCBXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCQkgICAmdHhfYWRjX211eDEsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgyIiwgV0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkJICAgJnR4X2FkY19tdXgyLCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMyIsIFdDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX0NUTCwgNSwgMCwKLQkJCSAgICZ0eF9hZGNfbXV4MywgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDQiLCBXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCQkgICAmdHhfYWRjX211eDQsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg1IiwgV0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkJICAgJnR4X2FkY19tdXg1LCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNiIsIFdDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX0NUTCwgNSwgMCwKLQkJCSAgICZ0eF9hZGNfbXV4NiwgdGFzaGFfY29kZWNfZW5hYmxlX2RlYywKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDciLCBXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCQkgICAmdHhfYWRjX211eDcsIHRhc2hhX2NvZGVjX2VuYWJsZV9kZWMsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg4IiwgV0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkJICAgJnR4X2FkY19tdXg4LCB0YXNoYV9jb2RlY19lbmFibGVfZGVjLAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDEwLCAwLAotCQkJICZ0eF9hZGNfbXV4MTAsIHRhc2hhX2NvZGVjX3R4X2FkY19jZmcsCi0JCQkgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAxMSwgMCwKLQkJCSAmdHhfYWRjX211eDExLCB0YXNoYV9jb2RlY190eF9hZGNfY2ZnLAotCQkJIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMTIsIDAsCi0JCQkgJnR4X2FkY19tdXgxMiwgdGFzaGFfY29kZWNfdHhfYWRjX2NmZywKLQkJCSBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDEzLCAwLAotCQkJICZ0eF9hZGNfbXV4MTMsIHRhc2hhX2NvZGVjX3R4X2FkY19jZmcsCi0JCQkgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2RtaWNfbXV4MCksCi0JU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfZG1pY19tdXgxKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9kbWljX211eDIpLAotCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2RtaWNfbXV4MyksCi0JU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfZG1pY19tdXg0KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9kbWljX211eDUpLAotCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2RtaWNfbXV4NiksCi0JU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfZG1pY19tdXg3KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9kbWljX211eDgpLAotCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9kbWljX211eDEwKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJETUlDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfZG1pY19tdXgxMSksCi0JU05EX1NPQ19EQVBNX01VWCgiRE1JQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2RtaWNfbXV4MTIpLAotCVNORF9TT0NfREFQTV9NVVgoIkRNSUMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9kbWljX211eDEzKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2FtaWNfbXV4MCksCi0JU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfYW1pY19tdXgxKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9hbWljX211eDIpLAotCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2FtaWNfbXV4MyksCi0JU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfYW1pY19tdXg0KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9hbWljX211eDUpLAotCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2FtaWNfbXV4NiksCi0JU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfYW1pY19tdXg3KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9hbWljX211eDgpLAotCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9hbWljX211eDEwKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBTUlDIE1VWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmdHhfYW1pY19tdXgxMSksCi0JU05EX1NPQ19EQVBNX01VWCgiQU1JQyBNVVgxMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnR4X2FtaWNfbXV4MTIpLAotCVNORF9TT0NfREFQTV9NVVgoIkFNSUMgTVVYMTMiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZ0eF9hbWljX211eDEzKSwKLQotCVNORF9TT0NfREFQTV9BRENfRSgiQURDMSIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMxLCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDMiIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMyLCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDMyIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUMzLCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDNCIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM0LCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDNSIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM1LCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDNiIsIE5VTEwsIFdDRDkzMzVfQU5BX0FNSUM2LCA3LCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUlggSU5UMSBOQVRJVkUgU1VQUExZIiwgU05EX1NPQ19OT1BNLAotCQkJICAgIElOVEVSUF9IUEhMLCAwLCB0YXNoYV9lbmFibGVfbmF0aXZlX3N1cHBseSwKLQkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQotCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDIgTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKLQkJCSAgICBJTlRFUlBfSFBIUiwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQzIE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCi0JCQkgICAgSU5URVJQX0xPMSwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ0IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCi0JCQkgICAgSU5URVJQX0xPMiwgMCwgdGFzaGFfZW5hYmxlX25hdGl2ZV9zdXBwbHksCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMxIiksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzLAotCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICB0YXNoYV9jb2RlY19lbmFibGVfbWljYmlhcywKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzMiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgICAgdGFzaGFfY29kZWNfZW5hYmxlX21pY2JpYXMsCi0JCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVM0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9taWNiaWFzLAotCQkJICAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMyX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKLQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWShEQVBNX0xET19IX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICB0YXNoYV9jb2RlY19mb3JjZV9lbmFibGVfbGRvX2gsCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWCgiQU5DMCBGQiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhbmMwX2ZiX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiQU5DMSBGQiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZhbmMxX2ZiX211eCksCi0KLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMyIiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDMyIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzQiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUM1IiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDNiIpLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMSBDQVAiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAotCQlBSUYxX0NBUCwgMCwgdGFzaGFfY29kZWNfZW5hYmxlX3NsaW10eCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjIgQ0FQIiwgIkFJRjIgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGMl9DQVAsIDAsIHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHgsCi0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUYzIENBUCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCi0JCUFJRjNfQ0FQLCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXR4LAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGNCBWSSIsICJWSWZlZWQiLCAwLCBTTkRfU09DX05PUE0sCi0JCUFJRjRfVklGRUVELCAwLCB0YXNoYV9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrLAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9WSSBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9WSUZFRUQsIDAsCi0JCWFpZjRfdmlfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmNF92aV9taXhlcikpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJBSUYxX0NBUCBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGMV9DQVAsIDAsCi0JCWFpZjFfY2FwX21peGVyLCBBUlJBWV9TSVpFKGFpZjFfY2FwX21peGVyKSksCi0KLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFJRjJfQ0FQIE1peGVyIiwgU05EX1NPQ19OT1BNLCBBSUYyX0NBUCwgMCwKLQkJYWlmMl9jYXBfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmMl9jYXBfbWl4ZXIpKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGM19DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjNfQ0FQLCAwLAotCQlhaWYzX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYzX2NhcF9taXhlcikpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJBSUY0X01BRCBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9NQURfVFgsIDAsCi0JCWFpZjRfbWFkX21peGVyLCBBUlJBWV9TSVpFKGFpZjRfbWFkX21peGVyKSksCi0KLQlTTkRfU09DX0RBUE1fSU5QVVQoIlZJSU5QVVQiKSwKLQotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUY1IENQRSIsICJBSUY1IENQRSBUWCIsIDAsIFNORF9TT0NfTk9QTSwKLQkJCSAgICAgQUlGNV9DUEVfVFgsIDApLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJFQyBCVUYgTVVYIElOUCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmVjX2J1Zl9tdXgsCi0JCXRhc2hhX2NvZGVjX2VjX2J1Zl9tdXhfZW5hYmxlLAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JLyogRGlnaXRhbCBNaWMgSW5wdXRzICovCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGFzaGFfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzEiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMyIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXNoYV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMyIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGFzaGFfY29kZWNfZW5hYmxlX2RtaWMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzQiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9kbWljLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUM1IiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXNoYV9jb2RlY19lbmFibGVfZG1pYywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWCgiSUlSMCBJTlAwIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjBfaW5wMF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIklJUjAgSU5QMSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIwX2lucDFfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJJSVIwIElOUDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMF9pbnAyX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiSUlSMCBJTlAzIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjBfaW5wM19tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIklJUjEgSU5QMCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIxX2lucDBfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJJSVIxIElOUDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmaWlyMV9pbnAxX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiSUlSMSBJTlAyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmlpcjFfaW5wMl9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIklJUjEgSU5QMyBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZpaXIxX2lucDNfbXV4KSwKLQotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIwIiwgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwsCi0JCQkgICAgIDQsIDAsIE5VTEwsIDAsIHRhc2hhX2NvZGVjX3NldF9paXJfZ2FpbiwKLQkJCSAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIxIiwgV0NEOTMzNV9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsCi0JCQkgICAgIDQsIDAsIE5VTEwsIDAsIHRhc2hhX2NvZGVjX3NldF9paXJfZ2FpbiwKLQkJCSAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU1JDMCIsIFdDRDkzMzVfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMLAotCQkJICAgICA0LCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNSQzEiLCBXQ0Q5MzM1X0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwKLQkJCSAgICAgNCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIkNQRSBJTiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQljcGVfaW5fbWl4X3N3aXRjaCwKLQkJCQlBUlJBWV9TSVpFKGNwZV9pbl9taXhfc3dpdGNoKSwKLQkJCQl0YXNoYV9jb2RlY19jb25maWd1cmVfY3BlX2lucHV0LAotCQkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDFfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmaW50MV8xX25hdGl2ZV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDJfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmaW50Ml8xX25hdGl2ZV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDNfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmaW50M18xX25hdGl2ZV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIElOVDRfMSBOQVRJVkUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmaW50NF8xX25hdGl2ZV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDAgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4MF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDEgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4MV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4Ml9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4M19tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDQgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4NF9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4NV9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDYgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4Nl9tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDcgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4N19tdXgpLAotCVNORF9TT0NfREFQTV9NVVgoIlJYIE1JWCBUWDggTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfbWl4X3R4OF9tdXgpLAotCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMCBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50MF9kZW1faW5wX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMSBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50MV9kZW1faW5wX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiUlggSU5UMiBERU0gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50Ml9kZW1faW5wX211eCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDAgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfRUFSLCAwLCAmcnhfaW50MF9pbnRlcnBfbXV4LAotCQl0YXNoYV9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQxIElOVEVSUCIsIFNORF9TT0NfTk9QTSwKLQkJSU5URVJQX0hQSEwsIDAsICZyeF9pbnQxX2ludGVycF9tdXgsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDIgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfSFBIUiwgMCwgJnJ4X2ludDJfaW50ZXJwX211eCwKLQkJdGFzaGFfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMyBJTlRFUlAiLCBTTkRfU09DX05PUE0sCi0JCUlOVEVSUF9MTzEsIDAsICZyeF9pbnQzX2ludGVycF9tdXgsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDQgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfTE8yLCAwLCAmcnhfaW50NF9pbnRlcnBfbXV4LAotCQl0YXNoYV9jb2RlY19lbmFibGVfaW50ZXJwb2xhdG9yLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ1IElOVEVSUCIsIFNORF9TT0NfTk9QTSwKLQkJSU5URVJQX0xPMywgMCwgJnJ4X2ludDVfaW50ZXJwX211eCwKLQkJdGFzaGFfY29kZWNfZW5hYmxlX2ludGVycG9sYXRvciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNiBJTlRFUlAiLCBTTkRfU09DX05PUE0sCi0JCUlOVEVSUF9MTzQsIDAsICZyeF9pbnQ2X2ludGVycF9tdXgsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDcgSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfU1BLUjEsIDAsICZyeF9pbnQ3X2ludGVycF9tdXgsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDggSU5URVJQIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfU1BLUjIsIDAsICZyeF9pbnQ4X2ludGVycF9tdXgsCi0JCXRhc2hhX2NvZGVjX2VuYWJsZV9pbnRlcnBvbGF0b3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMCBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCi0JCTAsIDAsIHRhc2hhX2NvZGVjX2Vhcl9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMSBEQUMiLCBOVUxMLCBXQ0Q5MzM1X0FOQV9IUEgsCi0JCTUsIDAsIHRhc2hhX2NvZGVjX2hwaGxfZGFjX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDIgREFDIiwgTlVMTCwgV0NEOTMzNV9BTkFfSFBILAotCQk0LCAwLCB0YXNoYV9jb2RlY19ocGhyX2RhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQzIERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKLQkJMCwgMCwgdGFzaGFfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDQgREFDIiwgTlVMTCwgU05EX1NPQ19OT1BNLAotCQkwLCAwLCB0YXNoYV9jb2RlY19saW5lb3V0X2RhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UNSBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCi0JCTAsIDAsIHRhc2hhX2NvZGVjX2xpbmVvdXRfZGFjX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQ2IERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKLQkJMCwgMCwgdGFzaGFfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSEwgUEEiLCBXQ0Q5MzM1X0FOQV9IUEgsIDcsIDAsIE5VTEwsIDAsCi0JCQkgICB0YXNoYV9jb2RlY19lbmFibGVfaHBobF9wYSwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkhQSFIgUEEiLCBXQ0Q5MzM1X0FOQV9IUEgsIDYsIDAsIE5VTEwsIDAsCi0JCQkgICB0YXNoYV9jb2RlY19lbmFibGVfaHBocl9wYSwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkVBUiBQQSIsIFdDRDkzMzVfQU5BX0VBUiwgNywgMCwgTlVMTCwgMCwKLQkJCSAgIHRhc2hhX2NvZGVjX2VuYWJsZV9lYXJfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQxIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLCA3LCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQyIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLCA2LCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQzIFBBIiwgV0NEOTMzNV9BTkFfTE9fM180LCA3LCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkxJTkVPVVQ0IFBBIiwgV0NEOTMzNV9BTkFfTE9fM180LCA2LCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBFQVIgUEEiLCBXQ0Q5MzM1X0FOQV9FQVIsIDcsIDAsIE5VTEwsIDAsCi0JCQkgICB0YXNoYV9jb2RlY19lbmFibGVfZWFyX3BhLAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBIUEhMIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX2hwaGxfcGEsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJBTkMgSFBIUiBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKLQkJCSAgIHRhc2hhX2NvZGVjX2VuYWJsZV9ocGhyX3BhLAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9QR0FfRSgiQU5DIExJTkVPVVQxIFBBIiwgV0NEOTMzNV9BTkFfTE9fMV8yLAotCQkJCTcsIDAsIE5VTEwsIDAsCi0JCQkJdGFzaGFfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJBTkMgTElORU9VVDIgUEEiLCBXQ0Q5MzM1X0FOQV9MT18xXzIsCi0JCQkJNiwgMCwgTlVMTCwgMCwKLQkJCQl0YXNoYV9jb2RlY19lbmFibGVfbGluZW91dF9wYSwKLQkJCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBTUEsxIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAotCQkJICAgdGFzaGFfY29kZWNfZW5hYmxlX3Nwa19hbmMsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEhMIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiSFBIUiIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBIUEhMIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiQU5DIEhQSFIiKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9CSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXNoYV9jb2RlY19lbmFibGVfcnhfYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQSzEgT1VUIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMiBPVVQiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMSIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQyIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiTElORU9VVDMiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUNCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBMSU5FT1VUMSIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBMSU5FT1VUMiIpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVNfUkVHVUxBVE9SIiwgU05EX1NPQ19OT1BNLAotCQlPTl9ERU1BTkRfTUlDQklBUywgMCwKLQkJdGFzaGFfY29kZWNfZW5hYmxlX29uX2RlbWFuZF9zdXBwbHksCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgwIiwgV0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJCSAgICAwLCAmYWRjX3VzX211eDBfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYMSIsIFdDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCQkgICAgMCwgJmFkY191c19tdXgxX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDIiLCBXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkJICAgIDAsICZhZGNfdXNfbXV4Ml9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgzIiwgV0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJCSAgICAwLCAmYWRjX3VzX211eDNfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNCIsIFdDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCQkgICAgMCwgJmFkY191c19tdXg0X3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDUiLCBXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkJICAgIDAsICZhZGNfdXNfbXV4NV9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVg2IiwgV0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJCSAgICAwLCAmYWRjX3VzX211eDZfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNyIsIFdDRDkzMzVfQ0RDX1RYN19UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCQkgICAgMCwgJmFkY191c19tdXg3X3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDgiLCBXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkJICAgIDAsICZhZGNfdXNfbXV4OF9zd2l0Y2gpLAotCS8qIE1BRCByZWxhdGVkIHdpZGdldHMgKi8KLQlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUY0IE1BRCIsICJBSUY0IE1BRCBUWCIsIDAsCi0JCQkgICAgICAgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgICAgIHRhc2hhX2NvZGVjX2VuYWJsZV9tYWQsCi0JCQkgICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWCgiTUFEX1NFTCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgJm1hZF9zZWxfbXV4KSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIk1BRF9DUEVfSU5QVVQiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIk1BRElOUFVUIiksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiTUFET05PRkYiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgJmFpZjRfbWFkX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiTUFEX0JST0FEQ0FTVCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAmbWFkX2JyZGNzdF9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFJRjQiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgJmFpZjRfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgSFBITCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkmYW5jX2hwaGxfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgSFBIUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkmYW5jX2hwaHJfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgRUFSIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSZhbmNfZWFyX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQU5DIE9VVCBFQVIgU1BLUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgJmFuY19lYXJfc3Brcl9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFOQyBMSU5FT1VUMSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkmYW5jX2xpbmVvdXQxX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQU5DIExJTkVPVVQyIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSZhbmNfbGluZW91dDJfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgU1BLUiBQQSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgJmFuY19zcGtyX3BhX3N3aXRjaCksCi19OwotCi1zdGF0aWMgaW50IHRhc2hhX2dldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgdW5zaWduZWQgaW50ICp0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKLQkJCQkgdW5zaWduZWQgaW50ICpyeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGFfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7Ci0JdTMyIGkgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKLQotCXN3aXRjaCAoZGFpLT5pZCkgewotCWNhc2UgQUlGMV9QQjoKLQljYXNlIEFJRjJfUEI6Ci0JY2FzZSBBSUYzX1BCOgotCWNhc2UgQUlGNF9QQjoKLQljYXNlIEFJRl9NSVgxX1BCOgotCQlpZiAoIXJ4X3Nsb3QgfHwgIXJ4X251bSkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCByeF9zbG90ICVwSyBvciByeF9udW0gJXBLXG4iLAotCQkJCSBfX2Z1bmNfXywgcnhfc2xvdCwgcnhfbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXNoYV9wLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LAotCQkJCSAgICBsaXN0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHNsb3RfbnVtICV1IGNoLT5jaF9udW0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBpLCBjaC0+Y2hfbnVtKTsKLQkJCXJ4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiByeF9udW0gJWRcbiIsIF9fZnVuY19fLCBpKTsKLQkJKnJ4X251bSA9IGk7Ci0JCWJyZWFrOwotCWNhc2UgQUlGMV9DQVA6Ci0JY2FzZSBBSUYyX0NBUDoKLQljYXNlIEFJRjNfQ0FQOgotCWNhc2UgQUlGNF9NQURfVFg6Ci0JY2FzZSBBSUY0X1ZJRkVFRDoKLQkJaWYgKCF0eF9zbG90IHx8ICF0eF9udW0pIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgdHhfc2xvdCAlcEsgb3IgdHhfbnVtICVwS1xuIiwKLQkJCQkgX19mdW5jX18sIHR4X3Nsb3QsIHR4X251bSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGFzaGFfcC0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwKLQkJCQkgICAgbGlzdCkgewotCQkJcHJfZGVidWcoIiVzOiBzbG90X251bSAldSBjaC0+Y2hfbnVtICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgaSwgIGNoLT5jaF9udW0pOwotCQkJdHhfc2xvdFtpKytdID0gY2gtPmNoX251bTsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IHR4X251bSAlZFxuIiwgX19mdW5jX18sIGkpOwotCQkqdHhfbnVtID0gaTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIERBSSBJRCAleFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJIHVuc2lnbmVkIGludCB0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKLQkJCQkgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCi0JaWYgKCFkYWkpIHsKLQkJcHJfZXJyKCIlczogZGFpIGlzIGVtcHR5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7Ci0JY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlpZiAoIXR4X3Nsb3QgfHwgIXJ4X3Nsb3QpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCB0eF9zbG90PSVwSywgcnhfc2xvdD0lcEtcbiIsCi0JCQlfX2Z1bmNfXywgdHhfc2xvdCwgcnhfc2xvdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXMoKTogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggdHhfY2ggJWQgcnhfY2ggJWRcbiIKLQkJICJ0YXNoYS0+aW50Zl90eXBlICVkXG4iLAotCQkgX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCwgdHhfbnVtLCByeF9udW0sCi0JCSB0YXNoYS0+aW50Zl90eXBlKTsKLQotCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgewotCQl3Y2Q5eHh4X2luaXRfc2xpbXNsYXZlKGNvcmUsIGNvcmUtPnNsaW0tPmxhZGRyLAotCQkJCQkgICB0eF9udW0sIHR4X3Nsb3QsIHJ4X251bSwgcnhfc2xvdCk7Ci0JCS8qIFJlc2VydmUgVFgxMi9UWDEzIGZvciBNQUQgZGF0YSBjaGFubmVsICovCi0JCWRhaV9kYXRhID0gJnRhc2hhLT5kYWlbQUlGNF9NQURfVFhdOwotCQlpZiAoZGFpX2RhdGEpIHsKLQkJCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQotCQkJCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnR4X2Noc1tUQVNIQV9UWDEzXS5saXN0LAotCQkJCQkgICAgICAmZGFpX2RhdGEtPndjZDl4eHhfY2hfbGlzdCk7Ci0JCQllbHNlCi0JCQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW1RBU0hBX1RYMTJdLmxpc3QsCi0JCQkJCSAgICAgICZkYWlfZGF0YS0+d2NkOXh4eF9jaF9saXN0KTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOwotCi0JcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQotCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQotCQlyZXR1cm47Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoZGFpLT5jb2RlYywgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3NldF9kZWNpbWF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgICAgdTggdHhfZnNfcmF0ZV9yZWdfdmFsLCB1MzIgc2FtcGxlX3JhdGUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTMyIHR4X3BvcnQgPSAwOwotCXU4IHNoaWZ0ID0gMCwgc2hpZnRfdmFsID0gMCwgdHhfbXV4X3NlbCA9IDA7Ci0JaW50IGRlY2ltYXRvciA9IC0xOwotCXUxNiB0eF9wb3J0X3JlZyA9IDAsIHR4X2ZzX3JlZyA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGFzaGEtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJdHhfcG9ydCA9IGNoLT5wb3J0OwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGFpLT5pZCA9ICVkLCB0eF9wb3J0ID0gJWQiLAotCQkJX19mdW5jX18sIGRhaS0+aWQsIHR4X3BvcnQpOwotCi0JCWlmICgodHhfcG9ydCA8IDApIHx8ICh0eF9wb3J0ID09IDEyKSB8fCAodHhfcG9ydCA+PSAxNCkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIFNMSU0gVFgldSBwb3J0LiBEQUkgSUQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCB0eF9wb3J0LCBkYWktPmlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCS8qIEZpbmQgdGhlIFNCIFRYIE1VWCBpbnB1dCAtIHdoaWNoIGRlY2ltYXRvciBpcyBjb25uZWN0ZWQgKi8KLQkJaWYgKHR4X3BvcnQgPCA0KSB7Ci0JCQl0eF9wb3J0X3JlZyA9IFdDRDkzMzVfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMDsKLQkJCXNoaWZ0ID0gKHR4X3BvcnQgPDwgMSk7Ci0JCQlzaGlmdF92YWwgPSAweDAzOwotCQl9IGVsc2UgaWYgKCh0eF9wb3J0ID49IDQpICYmICh0eF9wb3J0IDwgOCkpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxOwotCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA0KSA8PCAxKTsKLQkJCXNoaWZ0X3ZhbCA9IDB4MDM7Ci0JCX0gZWxzZSBpZiAoKHR4X3BvcnQgPj0gOCkgJiYgKHR4X3BvcnQgPCAxMSkpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyOwotCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA4KSA8PCAxKTsKLQkJCXNoaWZ0X3ZhbCA9IDB4MDM7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgewotCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzM1X0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzM7Ci0JCQlzaGlmdCA9IDA7Ci0JCQlzaGlmdF92YWwgPSAweDBGOwotCQl9IGVsc2UgaWYgKHR4X3BvcnQgPT0gMTMpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTMzNV9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczOwotCQkJc2hpZnQgPSA0OwotCQkJc2hpZnRfdmFsID0gMHgwMzsKLQkJfQotCQl0eF9tdXhfc2VsID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9wb3J0X3JlZykgJgotCQkJCQkgIChzaGlmdF92YWwgPDwgc2hpZnQpOwotCQl0eF9tdXhfc2VsID0gdHhfbXV4X3NlbCA+PiBzaGlmdDsKLQotCQlpZiAodHhfcG9ydCA8PSA4KSB7Ci0JCQlpZiAoKHR4X211eF9zZWwgPT0gMHgyKSB8fCAodHhfbXV4X3NlbCA9PSAweDMpKQotCQkJCWRlY2ltYXRvciA9IHR4X3BvcnQ7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA8PSAxMCkgewotCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKLQkJCQlkZWNpbWF0b3IgPSAoKHR4X3BvcnQgPT0gOSkgPyA3IDogNik7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgewotCQkJaWYgKCh0eF9tdXhfc2VsID49IDEpICYmICh0eF9tdXhfc2VsIDwgNykpCi0JCQkJZGVjaW1hdG9yID0gdHhfbXV4X3NlbCAtIDE7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMykgewotCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKLQkJCQlkZWNpbWF0b3IgPSA1OwotCQl9Ci0KLQkJaWYgKGRlY2ltYXRvciA+PSAwKSB7Ci0JCQl0eF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19UWDBfVFhfUEFUSF9DVEwgKwotCQkJCSAgICAxNiAqIGRlY2ltYXRvcjsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXQgREVDJXUgKC0+IFNMSU1fVFgldSkgcmF0ZSB0byAldVxuIiwKLQkJCQlfX2Z1bmNfXywgZGVjaW1hdG9yLCB0eF9wb3J0LCBzYW1wbGVfcmF0ZSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9mc19yZWcsIDB4MEYsCi0JCQkJCSAgICB0eF9mc19yYXRlX3JlZ192YWwpOwotCQl9IGVsc2UgaWYgKCh0eF9wb3J0IDw9IDgpICYmICh0eF9tdXhfc2VsID09IDB4MDEpKSB7Ci0JCQkvKiBDaGVjayBpZiB0aGUgVFggTXV4IGlucHV0IGlzIFJYIE1JWCBUWG4gKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWF9NSVhfVFgldSBnb2luZyB0byBTTElNIFRYJXVcbiIsCi0JCQkJCV9fZnVuY19fLCB0eF9wb3J0LCB0eF9wb3J0KTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFUlJPUjogSW52YWxpZCBkZWNpbWF0b3I6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBkZWNpbWF0b3IpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfc2V0X21peF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkJICAgdTggaW50X21peF9mc19yYXRlX3JlZ192YWwsCi0JCQkJCSAgIHUzMiBzYW1wbGVfcmF0ZSkKLXsKLQl1OCBpbnRfMl9pbnA7Ci0JdTMyIGo7Ci0JdTE2IGludF9tdXhfY2ZnMSwgaW50X2ZzX3JlZzsKLQl1OCBpbnRfbXV4X2NmZzFfdmFsOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRhc2hhLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCWludF8yX2lucCA9IGNoLT5wb3J0ICsgSU5Ubl8yX0lOUF9TRUxfUlgwIC0KLQkJCQkgIFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSOwotCQlpZiAoKGludF8yX2lucCA8IElOVG5fMl9JTlBfU0VMX1JYMCkgfHwKLQkJICAgKGludF8yX2lucCA+IElOVG5fMl9JTlBfU0VMX1JYNykpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgUlgldSBwb3J0LCBEYWkgSUQgaXMgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJKGNoLT5wb3J0IC0gVEFTSEFfUlhfUE9SVF9TVEFSVF9OVU1CRVIpLAotCQkJCWRhaS0+aWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpbnRfbXV4X2NmZzEgPSBXQ0Q5MzM1X0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMTsKLQkJZm9yIChqID0gMDsgaiA8IFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTOyBqKyspIHsKLQkJCWludF9tdXhfY2ZnMV92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMSkgJgotCQkJCQkJMHgwRjsKLQkJCWlmIChpbnRfbXV4X2NmZzFfdmFsID09IGludF8yX2lucCkgewotCQkJCWludF9mc19yZWcgPSBXQ0Q5MzM1X0NEQ19SWDBfUlhfUEFUSF9NSVhfQ1RMICsKLQkJCQkJCTIwICogajsKLQkJCQlwcl9kZWJ1ZygiJXM6IEFJRl9NSVhfUEIgREFJKCVkKSBjb25uZWN0ZWQgdG8gSU5UJXVfMlxuIiwKLQkJCQkJICBfX2Z1bmNfXywgZGFpLT5pZCwgaik7Ci0JCQkJcHJfZGVidWcoIiVzOiBzZXQgSU5UJXVfMiBzYW1wbGUgcmF0ZSB0byAldVxuIiwKLQkJCQkJX19mdW5jX18sIGosIHNhbXBsZV9yYXRlKTsKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBpbnRfZnNfcmVnLAotCQkJCQkJMHgwRiwgaW50X21peF9mc19yYXRlX3JlZ192YWwpOwotCQkJfQotCQkJaW50X211eF9jZmcxICs9IDI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfc2V0X3ByaW1faW50ZXJwb2xhdG9yX3JhdGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJCSAgICB1OCBpbnRfcHJpbV9mc19yYXRlX3JlZ192YWwsCi0JCQkJCSAgICB1MzIgc2FtcGxlX3JhdGUpCi17Ci0JdTggaW50XzFfbWl4MV9pbnA7Ci0JdTMyIGo7Ci0JdTE2IGludF9tdXhfY2ZnMCwgaW50X211eF9jZmcxOwotCXUxNiBpbnRfZnNfcmVnOwotCXU4IGludF9tdXhfY2ZnMF92YWwsIGludF9tdXhfY2ZnMV92YWw7Ci0JdTggaW5wMF9zZWwsIGlucDFfc2VsLCBpbnAyX3NlbDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOwotCXN0cnVjdCB3Y2Q5eHh4X2NoICpjaDsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXNoYS0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgewotCQlpbnRfMV9taXgxX2lucCA9IGNoLT5wb3J0ICsgSU5Ubl8xX01JWF9JTlBfU0VMX1JYMCAtCi0JCQkJICBUQVNIQV9SWF9QT1JUX1NUQVJUX05VTUJFUjsKLQkJaWYgKChpbnRfMV9taXgxX2lucCA8IElOVG5fMV9NSVhfSU5QX1NFTF9SWDApIHx8Ci0JCSAgIChpbnRfMV9taXgxX2lucCA+IElOVG5fMV9NSVhfSU5QX1NFTF9SWDcpKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIFJYJXUgcG9ydCwgRGFpIElEIGlzICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCShjaC0+cG9ydCAtIFRBU0hBX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSwKLQkJCQlkYWktPmlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaW50X211eF9jZmcwID0gV0NEOTMzNV9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzA7Ci0KLQkJLyoKLQkJICogTG9vcCB0aHJvdWdoIGFsbCBpbnRlcnBvbGF0b3IgTVVYIGlucHV0cyBhbmQgZmluZCBvdXQKLQkJICogdG8gd2hpY2ggaW50ZXJwb2xhdG9yIGlucHV0LCB0aGUgc2xpbSByeCBwb3J0Ci0JCSAqIGlzIGNvbm5lY3RlZAotCQkgKi8KLQkJZm9yIChqID0gMDsgaiA8IFRBU0hBX05VTV9JTlRFUlBPTEFUT1JTOyBqKyspIHsKLQkJCWludF9tdXhfY2ZnMSA9IGludF9tdXhfY2ZnMCArIDE7Ci0KLQkJCWludF9tdXhfY2ZnMF92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMCk7Ci0JCQlpbnRfbXV4X2NmZzFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBpbnRfbXV4X2NmZzEpOwotCQkJaW5wMF9zZWwgPSBpbnRfbXV4X2NmZzBfdmFsICYgMHgwRjsKLQkJCWlucDFfc2VsID0gKGludF9tdXhfY2ZnMF92YWwgPj4gNCkgJiAweDBGOwotCQkJaW5wMl9zZWwgPSAoaW50X211eF9jZmcxX3ZhbCA+PiA0KSAmIDB4MEY7Ci0JCQlpZiAoKGlucDBfc2VsID09IGludF8xX21peDFfaW5wKSB8fAotCQkJICAgIChpbnAxX3NlbCA9PSBpbnRfMV9taXgxX2lucCkgfHwKLQkJCSAgICAoaW5wMl9zZWwgPT0gaW50XzFfbWl4MV9pbnApKSB7Ci0JCQkJaW50X2ZzX3JlZyA9IFdDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX0NUTCArCi0JCQkJCSAgICAgMjAgKiBqOwotCQkJCXByX2RlYnVnKCIlczogQUlGX1BCIERBSSglZCkgY29ubmVjdGVkIHRvIElOVCV1XzFcbiIsCi0JCQkJCSAgX19mdW5jX18sIGRhaS0+aWQsIGopOwotCQkJCXByX2RlYnVnKCIlczogc2V0IElOVCV1XzEgc2FtcGxlIHJhdGUgdG8gJXVcbiIsCi0JCQkJCV9fZnVuY19fLCBqLCBzYW1wbGVfcmF0ZSk7Ci0JCQkJLyogc2FtcGxlX3JhdGUgaXMgaW4gSHogKi8KLQkJCQlpZiAoKGogPT0gMCkgJiYgKHNhbXBsZV9yYXRlID09IDQ0MTAwKSkgewotCQkJCQlwcl9pbmZvKCIlczogQ2Fubm90IHNldCA0NC4xS0h6IG9uIElOVDBcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludF9mc19yZWcsCi0JCQkJCQkweDBGLCBpbnRfcHJpbV9mc19yYXRlX3JlZ192YWwpOwotCQkJfQotCQkJaW50X211eF9jZmcwICs9IDI7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHRhc2hhX3NldF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgICAgICAgdTMyIHNhbXBsZV9yYXRlKQotewotCWludCByYXRlX3ZhbCA9IDA7Ci0JaW50IGksIHJldDsKLQotCS8qIHNldCBtaXhpbmcgcGF0aCByYXRlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50X21peF9zYW1wbGVfcmF0ZV92YWwpOyBpKyspIHsKLQkJaWYgKHNhbXBsZV9yYXRlID09Ci0JCQkJaW50X21peF9zYW1wbGVfcmF0ZV92YWxbaV0uc2FtcGxlX3JhdGUpIHsKLQkJCXJhdGVfdmFsID0KLQkJCQlpbnRfbWl4X3NhbXBsZV9yYXRlX3ZhbFtpXS5yYXRlX3ZhbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgoaSA9PSBBUlJBWV9TSVpFKGludF9taXhfc2FtcGxlX3JhdGVfdmFsKSkgfHwKLQkJCShyYXRlX3ZhbCA8IDApKQotCQlnb3RvIHByaW1fcmF0ZTsKLQlyZXQgPSB0YXNoYV9zZXRfbWl4X2ludGVycG9sYXRvcl9yYXRlKGRhaSwKLQkJCSh1OCkgcmF0ZV92YWwsIHNhbXBsZV9yYXRlKTsKLXByaW1fcmF0ZToKLQkvKiBzZXQgcHJpbWFyeSBwYXRoIHNhbXBsZSByYXRlICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50X3ByaW1fc2FtcGxlX3JhdGVfdmFsKTsgaSsrKSB7Ci0JCWlmIChzYW1wbGVfcmF0ZSA9PQotCQkJCWludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtpXS5zYW1wbGVfcmF0ZSkgewotCQkJcmF0ZV92YWwgPQotCQkJCWludF9wcmltX3NhbXBsZV9yYXRlX3ZhbFtpXS5yYXRlX3ZhbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgoaSA9PSBBUlJBWV9TSVpFKGludF9wcmltX3NhbXBsZV9yYXRlX3ZhbCkpIHx8Ci0JCQkocmF0ZV92YWwgPCAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0ID0gdGFzaGFfc2V0X3ByaW1faW50ZXJwb2xhdG9yX3JhdGUoZGFpLAotCQkJKHU4KSByYXRlX3ZhbCwgc2FtcGxlX3JhdGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KGRhaS0+Y29kZWMsIGZhbHNlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7Ci0JaW50IHJldDsKLQlpbnQgdHhfZnNfcmF0ZSA9IC1FSU5WQUw7Ci0JaW50IHJ4X2ZzX3JhdGUgPSAtRUlOVkFMOwotCWludCBpMnNfYml0X21vZGU7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQotCXByX2RlYnVnKCIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWRcbiIsIF9fZnVuY19fLAotCQkgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAotCQkgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOwotCi0Jc3dpdGNoIChzdWJzdHJlYW0tPnN0cmVhbSkgewotCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKLQkJcmV0ID0gdGFzaGFfc2V0X2ludGVycG9sYXRvcl9yYXRlKGRhaSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGNhbm5vdCBzZXQgc2FtcGxlIHJhdGU6ICV1XG4iLAotCQkJCV9fZnVuY19fLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgewotCQljYXNlIDE2OgotCQkJdGFzaGEtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAxNjsKLQkJCWkyc19iaXRfbW9kZSA9IDB4MDE7Ci0JCQlicmVhazsKLQkJY2FzZSAyNDoKLQkJCXRhc2hhLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMjQ7Ci0JCQlpMnNfYml0X21vZGUgPSAweDAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCQlpZiAodGFzaGEtPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX0kyQykgewotCQkJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7Ci0JCQljYXNlIDgwMDA6Ci0JCQkJcnhfZnNfcmF0ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE2MDAwOgotCQkJCXJ4X2ZzX3JhdGUgPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzMjAwMDoKLQkJCQlyeF9mc19yYXRlID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDgwMDA6Ci0JCQkJcnhfZnNfcmF0ZSA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDk2MDAwOgotCQkJCXJ4X2ZzX3JhdGUgPSA0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOTIwMDA6Ci0JCQkJcnhfZnNfcmF0ZSA9IDU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWRldl9lcnIodGFzaGEtPmRldiwKLQkJCQkiJXM6IEludmFsaWQgUlggc2FtcGxlIHJhdGU6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX07Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYX0kyU19DVEwsCi0JCQkJCTB4MjAsIGkyc19iaXRfbW9kZSA8PCA1KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlhfSTJTX0NUTCwKLQkJCQkJMHgxYywgKHJ4X2ZzX3JhdGUgPDwgMikpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOgotCQlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKLQkJY2FzZSA4MDAwOgotCQkJdHhfZnNfcmF0ZSA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxNjAwMDoKLQkJCXR4X2ZzX3JhdGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzIwMDA6Ci0JCQl0eF9mc19yYXRlID0gMzsKLQkJCWJyZWFrOwotCQljYXNlIDQ4MDAwOgotCQkJdHhfZnNfcmF0ZSA9IDQ7Ci0JCQlicmVhazsKLQkJY2FzZSA5NjAwMDoKLQkJCXR4X2ZzX3JhdGUgPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTkyMDAwOgotCQkJdHhfZnNfcmF0ZSA9IDY7Ci0JCQlicmVhazsKLQkJY2FzZSAzODQwMDA6Ci0JCQl0eF9mc19yYXRlID0gNzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IEludmFsaWQgVFggc2FtcGxlIHJhdGU6ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCX07Ci0JCWlmIChkYWktPmlkICE9IEFJRjRfVklGRUVEICYmCi0JCSAgICBkYWktPmlkICE9IEFJRjRfTUFEX1RYKSB7Ci0JCQlyZXQgPSB0YXNoYV9zZXRfZGVjaW1hdG9yX3JhdGUoZGFpLCB0eF9mc19yYXRlLAotCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IGNhbm5vdCBzZXQgVFggRGVjaW1hdG9yIHJhdGU6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgdHhfZnNfcmF0ZSk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7Ci0JCWNhc2UgMTY6Ci0JCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDE2OwotCQkJaTJzX2JpdF9tb2RlID0gMHgwMTsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQkJdGFzaGEtPmRhaVtkYWktPmlkXS5iaXRfd2lkdGggPSAyNDsKLQkJCWkyc19iaXRfbW9kZSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJCXRhc2hhLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMzI7Ci0JCQlpMnNfYml0X21vZGUgPSAweDAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKHRhc2hhLT5kZXYsICIlczogSW52YWxpZCBmb3JtYXQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcGFyYW1zX3dpZHRoKHBhcmFtcykpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX07Ci0JCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX0NUTCwKLQkJCQkweDIwLCBpMnNfYml0X21vZGUgPDwgNSk7Ci0JCQlpZiAodHhfZnNfcmF0ZSA+IDEpCi0JCQkJdHhfZnNfcmF0ZS0tOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19DVEwsCi0JCQkJMHgxYywgdHhfZnNfcmF0ZSA8PCAyKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QwX0xfQ0ZHLAotCQkJCTB4MDUsIDB4MDUpOwotCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX1NEMF9SX0NGRywKLQkJCQkweDA1LCAweDA1KTsKLQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfTF9DRkcsCi0JCQkJMHgwNSwgMHgwNSk7Ci0KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfU0QxX1JfQ0ZHLAotCQkJCTB4MDUsIDB4MDUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsIF9fZnVuY19fLAotCQkJc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCWlmIChkYWktPmlkID09IEFJRjRfVklGRUVEKQotCQl0YXNoYS0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDMyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKLQotCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKLQljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6Ci0JCS8qIENQVSBpcyBtYXN0ZXIgKi8KLQkJaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKLQkJCWlmIChkYWktPmlkID09IEFJRjFfQ0FQKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKLQkJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9UWF9JMlNfQ1RMLAotCQkJCQkweDIsIDApOwotCQkJZWxzZSBpZiAoZGFpLT5pZCA9PSBBSUYxX1BCKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKLQkJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWF9JMlNfQ1RMLAotCQkJCQkweDIsIDApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKLQkJLyogQ1BVIGlzIHNsYXZlICovCi0JCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7Ci0JCQlpZiAoZGFpLT5pZCA9PSBBSUYxX0NBUCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRhaS0+Y29kZWMsCi0JCQkJCVdDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfVFhfSTJTX0NUTCwKLQkJCQkJMHgyLCAweDIpOwotCQkJZWxzZSBpZiAoZGFpLT5pZCA9PSBBSUYxX1BCKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoZGFpLT5jb2RlYywKLQkJCQkJV0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWF9JMlNfQ1RMLAotCQkJCQkweDIsIDB4Mik7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKLXsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgdGFzaGFfZGFpX29wcyA9IHsKLQkuc3RhcnR1cCA9IHRhc2hhX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gdGFzaGFfc2h1dGRvd24sCi0JLmh3X3BhcmFtcyA9IHRhc2hhX2h3X3BhcmFtcywKLQkucHJlcGFyZSA9IHRhc2hhX3ByZXBhcmUsCi0JLnNldF9zeXNjbGsgPSB0YXNoYV9zZXRfZGFpX3N5c2NsaywKLQkuc2V0X2ZtdCA9IHRhc2hhX3NldF9kYWlfZm10LAotCS5zZXRfY2hhbm5lbF9tYXAgPSB0YXNoYV9zZXRfY2hhbm5lbF9tYXAsCi0JLmdldF9jaGFubmVsX21hcCA9IHRhc2hhX2dldF9jaGFubmVsX21hcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHRhc2hhX2RhaVtdID0gewotCXsKLQkJLm5hbWUgPSAidGFzaGFfcngxIiwKLQkJLmlkID0gQUlGMV9QQiwKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAotCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLIHwgV0NEOTMzNV9GUkFDX1JBVEVTX01BU0ssCi0JCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQl9LAotCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2hhX3R4MSIsCi0JCS5pZCA9IEFJRjFfQ0FQLAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIENhcHR1cmUiLAotCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJfSwKLQkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXNoYV9yeDIiLAotCQkuaWQgPSBBSUYyX1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMiBQbGF5YmFjayIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0sgfCBXQ0Q5MzM1X0ZSQUNfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCX0sCi0JCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGFzaGFfdHgyIiwKLQkJLmlkID0gQUlGMl9DQVAsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0ssCi0JCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQl9LAotCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2hhX3J4MyIsCi0JCS5pZCA9IEFJRjNfUEIsCi0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIFBsYXliYWNrIiwKLQkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSyB8IFdDRDkzMzVfRlJBQ19SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJfSwKLQkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXNoYV90eDMiLAotCQkuaWQgPSBBSUYzX0NBUCwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMyBDYXB0dXJlIiwKLQkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJfSwKLQkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXNoYV9yeDQiLAotCQkuaWQgPSBBSUY0X1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGNCBQbGF5YmFjayIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0sgfCBXQ0Q5MzM1X0ZSQUNfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCX0sCi0JCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGFzaGFfbWl4X3J4MSIsCi0JCS5pZCA9IEFJRl9NSVgxX1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGIE1peCBQbGF5YmFjayIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0sgfCBXQ0Q5MzM1X0ZSQUNfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCX0sCi0JCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGFzaGFfbWFkMSIsCi0JCS5pZCA9IEFJRjRfTUFEX1RYLAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUY0IE1BRCBUWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLnJhdGVfbWluID0gMTYwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQl9LAotCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2hhX3ZpZmVlZGJhY2siLAotCQkuaWQgPSBBSUY0X1ZJRkVFRCwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVklmZWVkIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCSB9LAotCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2hhX2NwZSIsCi0JCS5pZCA9IEFJRjVfQ1BFX1RYLAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUY1IENQRSBUWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLnJhdGVfbWluID0gMTYwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDEsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHRhc2hhX2kyc19kYWlbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInRhc2hhX2kyc19yeDEiLAotCQkuaWQgPSBBSUYxX1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBQbGF5YmFjayIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzM1X1JBVEVTX01BU0ssCi0JCQkuZm9ybWF0cyA9IFRBU0hBX0ZPUk1BVFNfUzE2X1MyNF9MRSwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQl9LAotCQkub3BzID0gJnRhc2hhX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhc2hhX2kyc190eDEiLAotCQkuaWQgPSBBSUYxX0NBUCwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKLQkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCX0sCi0JCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGFzaGFfaTJzX3J4MiIsCi0JCS5pZCA9IEFJRjJfUEIsCi0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIFBsYXliYWNrIiwKLQkJCS5yYXRlcyA9IFdDRDkzMzVfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gVEFTSEFfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCX0sCi0JCS5vcHMgPSAmdGFzaGFfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGFzaGFfaTJzX3R4MiIsCi0JCS5pZCA9IEFJRjJfQ0FQLAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYyIENhcHR1cmUiLAotCQkJLnJhdGVzID0gV0NEOTMzNV9SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBUQVNIQV9GT1JNQVRTX1MxNl9TMjRfTEUsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJfSwKLQkJLm9wcyA9ICZ0YXNoYV9kYWlfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19wb3dlcl9nYXRlX2RpZ2l0YWxfY29yZShzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOwotCi0JaWYgKCFjb2RlYykKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPnBvd2VyX2xvY2spOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBFbnRlcmluZyBwb3dlciBnYXRpbmcgZnVuY3Rpb24sICVkXG4iLAotCQlfX2Z1bmNfXywgdGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYpOwotCi0JaWYgKHRhc2hhLT5wb3dlcl9hY3RpdmVfcmVmID4gMCkKLQkJZ290byBleGl0OwotCi0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGFzaGEtPndjZDl4eHgsCi0JCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX0JFR0lOLAotCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJMHgwNCwgMHgwNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJMHgwMSwgMHgwMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLAotCQkJMHgwMiwgMHgwMCk7Ci0JY2xlYXJfYml0KEFVRElPX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOwotCXRhc2hhX2NvZGVjX3VwZGF0ZV9zaWRvX3ZvbHRhZ2UodGFzaGEsIHNpZG9fYnVja19zdnNfdm9sdGFnZSk7Ci0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGFzaGEtPndjZDl4eHgsIFdDRF9SRUdJT05fUE9XRVJfRE9XTiwKLQkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKLWV4aXQ6Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEV4aXRpbmcgcG93ZXIgZ2F0aW5nIGZ1bmN0aW9uLCAlZFxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5wb3dlcl9hY3RpdmVfcmVmKTsKLQltdXRleF91bmxvY2soJnRhc2hhLT5wb3dlcl9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY29kZWNfcG93ZXJfZ2F0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCi0JZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7Ci0JdGFzaGEgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB0YXNoYV9wcml2LCBwb3dlcl9nYXRlX3dvcmspOwotCWNvZGVjID0gdGFzaGEtPmNvZGVjOwotCi0JaWYgKCFjb2RlYykKLQkJcmV0dXJuOwotCi0JdGFzaGFfY29kZWNfcG93ZXJfZ2F0ZV9kaWdpdGFsX2NvcmUodGFzaGEpOwotfQotCi0vKiBjYWxsZWQgdW5kZXIgcG93ZXJfbG9jayBhY3F1aXNpdGlvbiAqLwotc3RhdGljIGludCB0YXNoYV9kaWdfY29yZV9yZW1vdmVfcG93ZXJfY29sbGFwc2Uoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdGFzaGFfY29kZWNfdm90ZV9tYXhfYncoY29kZWMsIHRydWUpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHg1KTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4Nyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDIsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX1JTVF9DVEwsIDB4MDIsIDB4MDIpOwotCi0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGFzaGEtPndjZDl4eHgsCi0JCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOwotCXJlZ2NhY2hlX21hcmtfZGlydHkoY29kZWMtPmNvbXBvbmVudC5yZWdtYXApOwotCXJlZ2NhY2hlX3N5bmNfcmVnaW9uKGNvZGVjLT5jb21wb25lbnQucmVnbWFwLAotCQkJICAgICBUQVNIQV9ESUdfQ09SRV9SRUdfTUlOLCBUQVNIQV9ESUdfQ09SRV9SRUdfTUFYKTsKLQl0YXNoYV9jb2RlY192b3RlX21heF9idyhjb2RlYywgZmFsc2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2Uoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLAotCQkJCQkgaW50IHJlcV9zdGF0ZSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JaW50IGN1cl9zdGF0ZTsKLQotCS8qIEV4aXQgaWYgZmVhdHVyZSBpcyBkaXNhYmxlZCAqLwotCWlmICghZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlKQotCQlyZXR1cm4gMDsKLQotCW11dGV4X2xvY2soJnRhc2hhLT5wb3dlcl9sb2NrKTsKLQlpZiAocmVxX3N0YXRlID09IFBPV0VSX0NPTExBUFNFKQotCQl0YXNoYS0+cG93ZXJfYWN0aXZlX3JlZi0tOwotCWVsc2UgaWYgKHJlcV9zdGF0ZSA9PSBQT1dFUl9SRVNVTUUpCi0JCXRhc2hhLT5wb3dlcl9hY3RpdmVfcmVmKys7Ci0JZWxzZQotCQlnb3RvIHVubG9ja19tdXRleDsKLQotCWlmICh0YXNoYS0+cG93ZXJfYWN0aXZlX3JlZiA8IDApIHsKLQkJZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IHBvd2VyX2FjdGl2ZV9yZWYgaXMgbmVnYXRpdmVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gdW5sb2NrX211dGV4OwotCX0KLQotCWNvZGVjID0gdGFzaGEtPmNvZGVjOwotCWlmICghY29kZWMpCi0JCWdvdG8gdW5sb2NrX211dGV4OwotCi0JaWYgKHJlcV9zdGF0ZSA9PSBQT1dFUl9DT0xMQVBTRSkgewotCQlpZiAodGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYgPT0gMCkgewotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXNoYS0+cG93ZXJfZ2F0ZV93b3JrLAotCQkJbXNlY3NfdG9famlmZmllcyhkaWdfY29yZV9jb2xsYXBzZV90aW1lciAqIDEwMDApKTsKLQkJfQotCX0gZWxzZSBpZiAocmVxX3N0YXRlID09IFBPV0VSX1JFU1VNRSkgewotCQlpZiAodGFzaGEtPnBvd2VyX2FjdGl2ZV9yZWYgPT0gMSkgewotCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQsIHRoZXJlIGNhbiBiZSB0d28gY2FzZXM6Ci0JCQkgKiAxLiBDb3JlIGFscmVhZHkgaW4gcG93ZXIgY29sbGFwc2Ugc3RhdGUKLQkJCSAqIDIuIFRpbWVyIGtpY2tlZCBpbiBhbmQgc3RpbGwgZGlkIG5vdCBleHBpcmUgb3IKLQkJCSAqIHdhaXRpbmcgZm9yIHRoZSBwb3dlcl9sb2NrCi0JCQkgKi8KLQkJCWN1cl9zdGF0ZSA9IHdjZDl4eHhfZ2V0X2N1cnJlbnRfcG93ZXJfc3RhdGUoCi0JCQkJCQl0YXNoYS0+d2NkOXh4eCwKLQkJCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOwotCQkJaWYgKGN1cl9zdGF0ZSA9PSBXQ0RfUkVHSU9OX1BPV0VSX0RPV04pCi0JCQkJdGFzaGFfZGlnX2NvcmVfcmVtb3ZlX3Bvd2VyX2NvbGxhcHNlKGNvZGVjKTsKLQkJCWVsc2UgewotCQkJCW11dGV4X3VubG9jaygmdGFzaGEtPnBvd2VyX2xvY2spOwotCQkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKLQkJCQkJCSZ0YXNoYS0+cG93ZXJfZ2F0ZV93b3JrKTsKLQkJCQltdXRleF9sb2NrKCZ0YXNoYS0+cG93ZXJfbG9jayk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLXVubG9ja19tdXRleDoKLQltdXRleF91bmxvY2soJnRhc2hhLT5wb3dlcl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fdGFzaGFfY2RjX21jbGtfZW5hYmxlX2xvY2tlZChzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCi0JCQkJCSAgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIXRhc2hhLT53Y2RfZXh0X2NsaykgewotCQlkZXZfZXJyKHRhc2hhLT5kZXYsICIlczogd2NkIGV4dCBjbG9jayBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcodGFzaGEtPmRldiwgIiVzOiBtY2xrX2VuYWJsZSA9ICV1XG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKLQotCWlmIChlbmFibGUpIHsKLQkJdGFzaGFfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2UodGFzaGEsIFBPV0VSX1JFU1VNRSk7Ci0JCXJldCA9IHRhc2hhX2NkY19yZXFfbWNsa19lbmFibGUodGFzaGEsIHRydWUpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0KLQkJc2V0X2JpdChBVURJT19OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQkJdGFzaGFfY29kZWNfYXBwbHlfc2lkb192b2x0YWdlKHRhc2hhLAotCQkJCVNJRE9fVk9MVEFHRV9OT01JTkFMX01WKTsKLQl9IGVsc2UgewotCQlpZiAoIWRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSkgewotCQkJY2xlYXJfYml0KEFVRElPX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOwotCQkJdGFzaGFfY29kZWNfdXBkYXRlX3NpZG9fdm9sdGFnZSh0YXNoYSwKLQkJCQkJCXNpZG9fYnVja19zdnNfdm9sdGFnZSk7Ci0JCX0KLQkJdGFzaGFfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXNoYSwgZmFsc2UpOwotCQl0YXNoYV9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXNoYSwgUE9XRVJfQ09MTEFQU0UpOwotCX0KLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXNoYV9jZGNfbWNsa19lbmFibGUoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhLAotCQkJCSAgIGJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0KLQlXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHRhc2hhLT5yZXNtZ3IpOwotCXJldCA9IF9fdGFzaGFfY2RjX21jbGtfZW5hYmxlX2xvY2tlZCh0YXNoYSwgZW5hYmxlKTsKLQlXQ0Q5WFhYX1YyX0JHX0NMS19VTkxPQ0sodGFzaGEtPnJlc21ncik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdGFzaGFfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JcmV0dXJuIF9fdGFzaGFfY2RjX21jbGtfZW5hYmxlKHRhc2hhLCBlbmFibGUpOwotfQotRVhQT1JUX1NZTUJPTCh0YXNoYV9jZGNfbWNsa19lbmFibGUpOwotCi1pbnQgdGFzaGFfY2RjX21jbGtfdHhfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IGNsa19tb2RlOiAlZCwgZW5hYmxlOiAlZCwgY2xrX2ludGVybmFsOiAlZFxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5jbGtfbW9kZSwgZW5hYmxlLCB0YXNoYS0+Y2xrX2ludGVybmFsKTsKLQlpZiAodGFzaGEtPmNsa19tb2RlIHx8IHRhc2hhLT5jbGtfaW50ZXJuYWwpIHsKLQkJaWYgKGVuYWJsZSkgewotCQkJdGFzaGFfY2RjX3NpZG9fY2NsX2VuYWJsZSh0YXNoYSwgdHJ1ZSk7Ci0JCQl3Y2RfcmVzbWdyX2VuYWJsZV9tYXN0ZXJfYmlhcyh0YXNoYS0+cmVzbWdyKTsKLQkJCXRhc2hhX2RpZ19jb3JlX3Bvd2VyX2NvbGxhcHNlKHRhc2hhLCBQT1dFUl9SRVNVTUUpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAotCQkJCQkweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzMzVfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wsCi0JCQkJCTB4MDEsIDB4MDEpOwotCQkJc2V0X2JpdChDUEVfTk9NSU5BTCwgJnRhc2hhLT5zdGF0dXNfbWFzayk7Ci0JCQl0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKHRhc2hhLAotCQkJCQkJU0lET19WT0xUQUdFX05PTUlOQUxfTVYpOwotCQkJdGFzaGEtPmNsa19pbnRlcm5hbCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQl0YXNoYS0+Y2xrX2ludGVybmFsID0gZmFsc2U7Ci0JCQljbGVhcl9iaXQoQ1BFX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOwotCQkJdGFzaGFfY29kZWNfdXBkYXRlX3NpZG9fdm9sdGFnZSh0YXNoYSwKLQkJCQkJCXNpZG9fYnVja19zdnNfdm9sdGFnZSk7Ci0JCQl0YXNoYV9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXNoYSwgUE9XRVJfQ09MTEFQU0UpOwotCQkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhc2hhLT5yZXNtZ3IpOwotCQkJdGFzaGFfY2RjX3NpZG9fY2NsX2VuYWJsZSh0YXNoYSwgZmFsc2UpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGVuYWJsZSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2hhX2NkY19tY2xrX3R4X2VuYWJsZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IHRhc2hhX2NvZGVjX3ZlcnNpb25fcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAotCQkJICAgICAgIHZvaWQgKmZpbGVfcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCWNoYXIgYnVmZmVyW1RBU0hBX1ZFUlNJT05fRU5UUllfU0laRV07Ci0JaW50IGxlbiA9IDA7Ci0KLQl0YXNoYSA9IChzdHJ1Y3QgdGFzaGFfcHJpdiAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwotCWlmICghdGFzaGEpIHsKLQkJcHJfZXJyKCIlczogdGFzaGEgcHJpdiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXdjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQotCWlmICh3Y2Q5eHh4LT5jb2RlY190eXBlLT5pZF9tYWpvciA9PSBUQVNIQV9NQUpPUikgewotCQlpZiAoVEFTSEFfSVNfMV8wKHdjZDl4eHgpKQotCQkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIldDRDkzMzVfMV8wXG4iKTsKLQkJZWxzZSBpZiAoVEFTSEFfSVNfMV8xKHdjZDl4eHgpKQotCQkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIldDRDkzMzVfMV8xXG4iKTsKLQkJZWxzZQotCQkJc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlZFUl9VTkRFRklORURcbiIpOwotCX0gZWxzZSBpZiAod2NkOXh4eC0+Y29kZWNfdHlwZS0+aWRfbWFqb3IgPT0gVEFTSEEyUDBfTUFKT1IpIHsKLQkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIldDRDkzMzVfMl8wXG4iKTsKLQl9IGVsc2UKLQkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlZFUl9VTkRFRklORURcbiIpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgdGFzaGFfY29kZWNfaW5mb19vcHMgPSB7Ci0JLnJlYWQgPSB0YXNoYV9jb2RlY192ZXJzaW9uX3JlYWQsCi19OwotCi0vKgotICogdGFzaGFfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIHdjZDkzMzUgbW9kdWxlCi0gKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBDcmVhdGVzIHdjZDkzMzUgbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgotICogcGFyZW50IGRpcmVjdG9yeS4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludCB0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3QsCi0JCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnZlcnNpb25fZW50cnk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7Ci0KLQlpZiAoIWNvZGVjX3Jvb3QgfHwgIWNvZGVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQl0YXNoYS0+ZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNvZGVjX3Jvb3QtPm1vZHVsZSwKLQkJCQkJICAgICAgInRhc2hhIiwgY29kZWNfcm9vdCk7Ci0JaWYgKCF0YXNoYS0+ZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTMzNSBlbnRyeVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdmVyc2lvbl9lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQtPnNuZF9jYXJkLAotCQkJCQkJICAgInZlcnNpb24iLAotCQkJCQkJICAgdGFzaGEtPmVudHJ5KTsKLQlpZiAoIXZlcnNpb25fZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTMzNSB2ZXJzaW9uIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB0YXNoYTsKLQl2ZXJzaW9uX2VudHJ5LT5zaXplID0gVEFTSEFfVkVSU0lPTl9FTlRSWV9TSVpFOwotCXZlcnNpb25fZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKLQl2ZXJzaW9uX2VudHJ5LT5jLm9wcyA9ICZ0YXNoYV9jb2RlY19pbmZvX29wczsKLQotCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKLQkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXRhc2hhLT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSk7Ci0KLXN0YXRpYyBpbnQgX190YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCgKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JaWYgKGVuYWJsZSkgewotCQl0YXNoYV9jZGNfc2lkb19jY2xfZW5hYmxlKHRhc2hhLCB0cnVlKTsKLQkJaWYgKHdjZF9yZXNtZ3JfZ2V0X2Nsa190eXBlKHRhc2hhLT5yZXNtZ3IpID09Ci0JCSAgICBXQ0RfQ0xLX1JDTykgewotCQkJcmV0ID0gd2NkX3Jlc21ncl9lbmFibGVfY2xrX2Jsb2NrKHRhc2hhLT5yZXNtZ3IsCi0JCQkJCQkJICBXQ0RfQ0xLX1JDTyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSB0YXNoYV9jZGNfcmVxX21jbGtfZW5hYmxlKHRhc2hhLCB0cnVlKTsKLQkJCXJldCB8PSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGFzaGEtPnJlc21nciwKLQkJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7Ci0JCQlyZXQgfD0gdGFzaGFfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXNoYSwgZmFsc2UpOwotCQl9Ci0KLQl9IGVsc2UgewotCQlyZXQgPSB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhc2hhLT5yZXNtZ3IsCi0JCQkJCQkgICBXQ0RfQ0xLX1JDTyk7Ci0JCXRhc2hhX2NkY19zaWRvX2NjbF9lbmFibGUodGFzaGEsIGZhbHNlKTsKLQl9Ci0KLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBFcnJvciBpbiAlcyBSQ09cbiIsCi0JCQlfX2Z1bmNfXywgKGVuYWJsZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIikpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB0YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCgpCi0gKiBNYWtlIHN1cmUgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IGFjcXVpcmUKLSAqIEJHX0NMS19MT0NLLgotICovCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXNoYS0+cmVzbWdyKTsKLQlyZXQgPSBfX3Rhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBlbmFibGUpOwotCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXNoYS0+cmVzbWdyKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogdGFzaGFfbWJoY19oc19kZXRlY3Q6IHN0YXJ0cyBtYmhjIGluc2VydGlvbi9yZW1vdmFsIGZ1bmN0aW9uYWxpdHkKLSAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgotICogQG1iaGNfY2ZnOiBoYW5kbGUgdG8gbWJoYyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQotICogcmV0dXJuIDAgaWYgbWJoY19zdGFydCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB0YXNoYV9tYmhjX2hzX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXR1cm4gd2NkX21iaGNfc3RhcnQoJnRhc2hhLT5tYmhjLCBtYmhjX2NmZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhc2hhX21iaGNfaHNfZGV0ZWN0KTsKLQotLyoKLSAqIHRhc2hhX21iaGNfaHNfZGV0ZWN0X2V4aXQ6IHN0b3AgbWJoYyBpbnNlcnRpb24vcmVtb3ZhbCBmdW5jdGlvbmFsaXR5Ci0gKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKLSAqLwotdm9pZCB0YXNoYV9tYmhjX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXdjZF9tYmhjX3N0b3AoJnRhc2hhLT5tYmhjKTsKLX0KLUVYUE9SVF9TWU1CT0wodGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdCk7Ci0KLXN0YXRpYyBpbnQgd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwodTMyIG1pY2JfbXYpCi17Ci0JLyogbWluIG1pY2JpYXMgdm9sdGFnZSBpcyAxViBhbmQgbWF4aW11bSBpcyAyLjg1ViAqLwotCWlmIChtaWNiX212IDwgMTAwMCB8fCBtaWNiX212ID4gMjg1MCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBtaWNiaWFzIHZvbHRhZ2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIChtaWNiX212IC0gMTAwMCkgLyA1MDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xW10gPSB7Ci0Je1dDRDkzMzVfUkNPX0NUUkxfMiwgMHhGRiwgMHg0N30sCi0Je1dDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzQsIDB4RkYsIDB4NjB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtdID0gewotCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF8xLCAweEZGLCAweDY1fSwKLQl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfREFDX0NUUkxfMiwgMHhGRiwgMHg1Mn0sCi0Je1dDRDkzMzVfRkxZQkFDS19WTkVHX0RBQ19DVFJMXzMsIDB4RkYsIDB4QUZ9LAotCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19EQUNfQ1RSTF80LCAweEZGLCAweDYwfSwKLQl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8zLCAweEZGLCAweEY0fSwKLQl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF85LCAweEZGLCAweDQwfSwKLQl7V0NEOTMzNV9GTFlCQUNLX1ZORUdfQ1RSTF8yLCAweEZGLCAweDRGfSwKLQl7V0NEOTMzNV9GTFlCQUNLX0VOLCAweEZGLCAweDZFfSwKLQl7V0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCi0Je1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDB4RjgsIDB4Rjh9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMFtdID0gewotCXtXQ0Q5MzM1X0ZMWUJBQ0tfVk5FR19DVFJMXzMsIDB4RkYsIDB4NTR9LAotCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9TRUMwLCAweEZDLCAweEZDfSwKLQl7V0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGQ30sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMl8wW10gPSB7Ci0Je1dDRDkzMzVfUkNPX0NUUkxfMiwgMHgwRiwgMHgwOH0sCi0Je1dDRDkzMzVfUlhfQklBU19GTFlCX01JRF9SU1QsIDB4RjAsIDB4MTB9LAotCXtXQ0Q5MzM1X0ZMWUJBQ0tfQ1RSTF8xLCAweDIwLCAweDIwfSwKLQl7V0NEOTMzNV9IUEhfT0NQX0NUTCwgMHhGRiwgMHg3QX0sCi0Je1dDRDkzMzVfSFBIX0xfVEVTVCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX0JPT1NUMF9CT09TVF9DRkcxLCAweDNGLCAweDEyfSwKLQl7V0NEOTMzNV9DRENfQk9PU1QwX0JPT1NUX0NGRzIsIDB4MUMsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MUUsIDB4MTh9LAotCXtXQ0Q5MzM1X0NEQ19CT09TVDFfQk9PU1RfQ0ZHMSwgMHgzRiwgMHgxMn0sCi0Je1dDRDkzMzVfQ0RDX0JPT1NUMV9CT09TVF9DRkcyLCAweDFDLCAweDA4fSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAweDFFLCAweDE4fSwKLQl7V0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfU0VDNywgMHhGRiwgMHg0NX0sCi0Je1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4RjR9LAotCXtXQ0Q5MzM1X0hQSF9SRUZCVUZGX0xQX0NUTCwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDAyfSwKLQl7V0NEOTMzNV9ESUZGX0xPX0NPUkVfT1VUX1BST0csIDB4RkMsIDB4QTB9LAotCXtXQ0Q5MzM1X1NFX0xPX0NPTTEsIDB4RkYsIDB4QzB9LAotCXtXQ0Q5MzM1X0NEQ19SWDNfUlhfUEFUSF9TRUMwLCAweEZDLCAweEY0fSwKLQl7V0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGNH0sCi0Je1dDRDkzMzVfQ0RDX1JYNV9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4Rjh9LAotCXtXQ0Q5MzM1X0NEQ19SWDZfUlhfUEFUSF9TRUMwLCAweEZDLCAweEY4fSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFzaGFfcmVnX21hc2tfdmFsIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tdID0gewotCXtXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwgMHgwMywgMHgwMH0sCi0Je1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwMywgMHgwMX0sCi0Je1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwNCwgMHgwNH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaTJjX2RlZmF1bHRzW10gPSB7Ci0Je1dDRDkzMzVfQU5BX0NMS19UT1AsIDB4MjAsIDB4MjB9LAotCXtXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfR0FURSwgMHgwMywgMHgwMX0sCi0Je1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwMywgMHgwMH0sCi0Je1dDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywgMHgwNSwgMHgwNX0sCi0Je1dDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgwX0lOUF9DRkcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1JYMV9JTlBfQ0ZHLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9EQVRBX0hVQl9EQVRBX0hVQl9SWDJfSU5QX0NGRywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfREFUQV9IVUJfREFUQV9IVUJfUlgzX0lOUF9DRkcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfTF9DRkcsIDB4MDUsIDB4MDV9LAotCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDBfUl9DRkcsIDB4MDUsIDB4MDV9LAotCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfTF9DRkcsIDB4MDUsIDB4MDV9LAotCXtXQ0Q5MzM1X0RBVEFfSFVCX0RBVEFfSFVCX1RYX0kyU19TRDFfUl9DRkcsIDB4MDUsIDB4MDV9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtdID0gewotCS8qIFJidWNrZmx5L1JfRUFSKDMyKSAqLwotCXtXQ0Q5MzM1X0NEQ19DTFNIX0syX01TQiwgMHgwRiwgMHgwMH0sCi0Je1dDRDkzMzVfQ0RDX0NMU0hfSzJfTFNCLCAweEZGLCAweDYwfSwKLQl7V0NEOTMzNV9DUEVfU1NfRE1JQ19DRkcsIDB4ODAsIDB4MDB9LAotCXtXQ0Q5MzM1X0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDcwLCAweDUwfSwKLQl7V0NEOTMzNV9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3MCwgMHg1MH0sCi0Je1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9BTkFfTE9fMV8yLCAweDNDLCAwWDNDfSwKLQl7V0NEOTMzNV9ESUZGX0xPX0NPTV9TV0NBUF9SRUZCVUZfRlJFUSwgMHg3MCwgMHgwMH0sCi0Je1dDRDkzMzVfU09DX01BRF9BVURJT19DVExfMiwgMHgwMywgMHgwM30sCi0Je1dDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSwgMHgwMiwgMHgwMn0sCi0Je1dDRDkzMzVfQ0RDX1RPUF9UT1BfQ0ZHMSwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfRUFSX0NNQlVGRiwgMHgwOCwgMHgwMH0sCi0Je1dDRDkzMzVfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEwzLCAweDgwLCAweDgwfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEwzLCAweDgwLCAweDgwfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSN19DVEw3LCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfQ09NUEFOREVSOF9DVEw3LCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfQ0ZHMCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9DRkcwLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlgzX1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfTUlYX0NGRywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfQ0ZHLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9WQkFEQ19JQklBU19GRSwgMHgwQywgMHgwOH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB0YXNoYV9jb2RlY19yZWdfaW5pdF8xX3hfdmFsW10gPSB7Ci0JLyogRW5hYmxlIFRYIEhQRiBGaWx0ZXIgJiBMaW5lYXIgUGhhc2UgKi8KLQl7V0NEOTMzNV9DRENfVFgwX1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCi0Je1dDRDkzMzVfQ0RDX1RYMV9UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAotCXtXQ0Q5MzM1X0NEQ19UWDJfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKLQl7V0NEOTMzNV9DRENfVFgzX1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCi0Je1dDRDkzMzVfQ0RDX1RYNF9UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAotCXtXQ0Q5MzM1X0NEQ19UWDVfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKLQl7V0NEOTMzNV9DRENfVFg2X1RYX1BBVEhfQ0ZHMCwgMHgxMSwgMHgxMX0sCi0Je1dDRDkzMzVfQ0RDX1RYN19UWF9QQVRIX0NGRzAsIDB4MTEsIDB4MTF9LAotCXtXQ0Q5MzM1X0NEQ19UWDhfVFhfUEFUSF9DRkcwLCAweDExLCAweDExfSwKLQl7V0NEOTMzNV9DRENfUlgwX1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCi0Je1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDFfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzEsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDdfUlhfUEFUSF9TRUMxLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlg4X1JYX1BBVEhfU0VDMSwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1JYMF9SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlgxX1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDJfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlg0X1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX01JWF9TRUMwLCAweDA4LCAweDA4fSwKLQl7V0NEOTMzNV9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwgMHgwOCwgMHgwOH0sCi0Je1dDRDkzMzVfQ0RDX1RYMF9UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19UWDFfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFgyX1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1RYM19UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19UWDRfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFg1X1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1RYNl9UWF9QQVRIX1NFQzIsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzM1X0NEQ19UWDdfVFhfUEFUSF9TRUMyLCAweDAxLCAweDAxfSwKLQl7V0NEOTMzNV9DRENfVFg4X1RYX1BBVEhfU0VDMiwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzMzVfQ0RDX1JYM19SWF9QQVRIX1NFQzAsIDB4RjgsIDB4RjB9LAotCXtXQ0Q5MzM1X0NEQ19SWDRfUlhfUEFUSF9TRUMwLCAweEY4LCAweEYwfSwKLQl7V0NEOTMzNV9DRENfUlg1X1JYX1BBVEhfU0VDMCwgMHhGOCwgMHhGOH0sCi0Je1dDRDkzMzVfQ0RDX1JYNl9SWF9QQVRIX1NFQzAsIDB4RjgsIDB4Rjh9LAotCXtXQ0Q5MzM1X1JYX09DUF9DT1VOVCwgMHhGRiwgMHhGRn0sCi0Je1dDRDkzMzVfSFBIX09DUF9DVEwsIDB4RjAsIDB4NzB9LAotCXtXQ0Q5MzM1X0NQRV9TU19DUEFSX0NGRywgMHhGRiwgMHgwMH0sCi0Je1dDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfMSwgMHhGRiwgMHg2M30sCi0Je1dDRDkzMzVfRkxZQkFDS19WTkVHX0NUUkxfNCwgMHhGRiwgMHg3Rn0sCi0Je1dDRDkzMzVfQ0xBU1NIX0NUUkxfVkNMXzEsIDB4RkYsIDB4NjB9LAotCXtXQ0Q5MzM1X0NMQVNTSF9DVFJMX0NDTF81LCAweEZGLCAweDQwfSwKLQl7V0NEOTMzNV9SWF9USU1FUl9ESVYsIDB4RkYsIDB4MzJ9LAotCXtXQ0Q5MzM1X1NFX0xPX0NPTTIsIDB4RkYsIDB4MDF9LAotCXtXQ0Q5MzM1X01CSENfWkRFVF9BTkFfQ1RMLCAweDBGLCAweDA3fSwKLQl7V0NEOTMzNV9SWF9CSUFTX0hQSF9QQSwgMHhGMCwgMHg2MH0sCi0Je1dDRDkzMzVfSFBIX1JEQUNfTERPX0NUTCwgMHg4OCwgMHg4OH0sCi0Je1dDRDkzMzVfSFBIX0xfRU4sIDB4MjAsIDB4MjB9LAotCXtXQ0Q5MzM1X0hQSF9SX0VOLCAweDIwLCAweDIwfSwKLQl7V0NEOTMzNV9ESUZGX0xPX0NPUkVfT1VUX1BST0csIDB4RkMsIDB4RDh9LAotCXtXQ0Q5MzM1X0NEQ19SWDVfUlhfUEFUSF9TRUMzLCAweEJELCAweEJEfSwKLQl7V0NEOTMzNV9DRENfUlg2X1JYX1BBVEhfU0VDMywgMHhCRCwgMHhCRH0sCi0Je1dDRDkzMzVfRElGRl9MT19DT01fUEFfRlJFUSwgMHg3MCwgMHg0MH0sCi19OwotCi1zdGF0aWMgdm9pZCB0YXNoYV91cGRhdGVfcmVnX3Jlc2V0X3ZhbHVlcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IHdjZDl4eHggKnRhc2hhX2NvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWlmIChUQVNIQV9JU18xXzEodGFzaGFfY29yZSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xKTsKLQkJICAgICBpKyspCi0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCSAgICAgIHRhc2hhX3JlZ191cGRhdGVfcmVzZXRfdmFsXzFfMVtpXS5yZWcsCi0JCQkJICAgICAgdGFzaGFfcmVnX3VwZGF0ZV9yZXNldF92YWxfMV8xW2ldLnZhbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9jb2RlY19pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19pbml0X2NvbW1vbl92YWwpOyBpKyspCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5yZWcsCi0JCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5tYXNrLAotCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X2NvbW1vbl92YWxbaV0udmFsKTsKLQotCWlmIChUQVNIQV9JU18xXzEod2NkOXh4eCkgfHwKLQkgICAgVEFTSEFfSVNfMV8wKHdjZDl4eHgpKQotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaW5pdF8xX3hfdmFsKTsgaSsrKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfMV94X3ZhbFtpXS5yZWcsCi0JCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0XzFfeF92YWxbaV0ubWFzaywKLQkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfMV94X3ZhbFtpXS52YWwpOwotCi0JaWYgKFRBU0hBX0lTXzFfMSh3Y2Q5eHh4KSkgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8xKTsgaSsrKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtpXS5yZWcsCi0JCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8xXzFbaV0ubWFzaywKLQkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMVtpXS52YWwpOwotCX0gZWxzZSBpZiAoVEFTSEFfSVNfMV8wKHdjZDl4eHgpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8xXzApOyBpKyspCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8wW2ldLnJlZywKLQkJCQkJdGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzFfMFtpXS5tYXNrLAotCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMV8wW2ldLnZhbCk7Ci0JfSBlbHNlIGlmIChUQVNIQV9JU18yXzAod2NkOXh4eCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFzaGFfY29kZWNfcmVnX2luaXRfdmFsXzJfMCk7IGkrKykKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8yXzBbaV0ucmVnLAotCQkJCQl0YXNoYV9jb2RlY19yZWdfaW5pdF92YWxfMl8wW2ldLm1hc2ssCi0JCQkJCXRhc2hhX2NvZGVjX3JlZ19pbml0X3ZhbF8yXzBbaV0udmFsKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX3VwZGF0ZV9yZWdfZGVmYXVsdHMoc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhKQotewotCXUzMiBpOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCi0Jd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0cyk7IGkrKykKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkgICB0YXNoYV9jb2RlY19yZWdfZGVmYXVsdHNbaV0ucmVnLAotCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tpXS5tYXNrLAotCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19kZWZhdWx0c1tpXS52YWwpOwotCi0JdGFzaGEtPmludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOwotCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKQotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXNoYV9jb2RlY19yZWdfaTJjX2RlZmF1bHRzKTsgaSsrKQotCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkJICAgdGFzaGFfY29kZWNfcmVnX2kyY19kZWZhdWx0c1tpXS5yZWcsCi0JCQkJCSAgIHRhc2hhX2NvZGVjX3JlZ19pMmNfZGVmYXVsdHNbaV0ubWFzaywKLQkJCQkJICAgdGFzaGFfY29kZWNfcmVnX2kyY19kZWZhdWx0c1tpXS52YWwpOwotCi19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX3NsaW1faW50ZXJmYWNlX2luaXRfcmVnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZm9yIChpID0gMDsgaSA8IFdDRDlYWFhfU0xJTV9OVU1fUE9SVF9SRUc7IGkrKykKLQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCi0JCQkJCSAgICBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9FTjAgKyBpLAotCQkJCQkgICAgMHhGRik7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB0YXNoYV9zbGltYnVzX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICpwcml2ID0gZGF0YTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IDA7Ci0JaW50IGksIGosIHBvcnRfaWQsIGs7Ci0JdTMyIGJpdDsKLQl1OCB2YWwsIGludF92YWwgPSAwOwotCWJvb2wgdHgsIGNsZWFyZWQ7Ci0JdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKLQotCWZvciAoaSA9IFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19SWF8wLCBqID0gMDsKLQkgICAgIGkgPD0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1RYXzE7IGkrKywgaisrKSB7Ci0JCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHByaXYtPndjZDl4eHgsIGkpOwotCQlzdGF0dXMgfD0gKCh1MzIpdmFsIDw8ICg4ICogaikpOwotCX0KLQotCWZvcl9lYWNoX3NldF9iaXQoaiwgJnN0YXR1cywgMzIpIHsKLQkJdHggPSAoaiA+PSAxNiA/IHRydWUgOiBmYWxzZSk7Ci0JCXBvcnRfaWQgPSAodHggPyBqIC0gMTYgOiBqKTsKLQkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQocHJpdi0+d2NkOXh4eCwKLQkJCQlUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9SWF9TT1VSQ0UwICsgaik7Ci0JCWlmICh2YWwpIHsKLQkJCWlmICghdHgpCi0JCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfRU4wICsKLQkJCQkJKHBvcnRfaWQgLyA4KTsKLQkJCWVsc2UKLQkJCQlyZWcgPSBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKwotCQkJCQkocG9ydF9pZCAvIDgpOwotCQkJaW50X3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAotCQkJCXByaXYtPndjZDl4eHgsIHJlZyk7Ci0JCQkvKgotCQkJICogSWdub3JlIGludGVycnVwdHMgZm9yIHBvcnRzIGZvciB3aGljaCB0aGUKLQkJCSAqIGludGVycnVwdHMgYXJlIG5vdCBzcGVjaWZpY2FsbHkgZW5hYmxlZC4KLQkJCSAqLwotCQkJaWYgKCEoaW50X3ZhbCAmICgxIDw8IChwb3J0X2lkICUgOCkpKSkKLQkJCQljb250aW51ZTsKLQkJfQotCQlpZiAodmFsICYgVEFTSEFfU0xJTV9JUlFfT1ZFUkZMT1cpCi0JCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoCi0JCQkgICAiJXM6IG92ZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAotCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKLQkJaWYgKHZhbCAmIFRBU0hBX1NMSU1fSVJRX1VOREVSRkxPVykKLQkJCXByX2Vycl9yYXRlbGltaXRlZCgKLQkJCSAgICIlczogdW5kZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAotCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKLQkJaWYgKCh2YWwgJiBUQVNIQV9TTElNX0lSUV9PVkVSRkxPVykgfHwKLQkJCSh2YWwgJiBUQVNIQV9TTElNX0lSUV9VTkRFUkZMT1cpKSB7Ci0JCQlpZiAoIXR4KQotCQkJCXJlZyA9IFRBU0hBX1NMSU1fUEdEX1BPUlRfSU5UX0VOMCArCi0JCQkJCShwb3J0X2lkIC8gOCk7Ci0JCQllbHNlCi0JCQkJcmVnID0gVEFTSEFfU0xJTV9QR0RfUE9SVF9JTlRfVFhfRU4wICsKLQkJCQkJKHBvcnRfaWQgLyA4KTsKLQkJCWludF92YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCgKLQkJCQlwcml2LT53Y2Q5eHh4LCByZWcpOwotCQkJaWYgKGludF92YWwgJiAoMSA8PCAocG9ydF9pZCAlIDgpKSkgewotCQkJCWludF92YWwgPSBpbnRfdmFsIF4gKDEgPDwgKHBvcnRfaWQgJSA4KSk7Ci0JCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCi0JCQkJCXJlZywgaW50X3ZhbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhbCAmIFRBU0hBX1NMSU1fSVJRX1BPUlRfQ0xPU0VEKSB7Ci0JCQkvKgotCQkJICogSU5UIFNPVVJDRSByZWdpc3RlciBzdGFydHMgZnJvbSBSWCB0byBUWAotCQkJICogYnV0IHBvcnQgbnVtYmVyIGluIHRoZSBjaF9tYXNrIGlzIGluIG9wcG9zaXRlIHdheQotCQkJICovCi0JCQliaXQgPSAodHggPyBqIC0gMTYgOiBqICsgMTYpOwotCQkJcHJfZGVidWcoIiVzOiAlcyBwb3J0ICVkIGNsb3NlZCB2YWx1ZSAleCwgYml0ICV1XG4iLAotCQkJCSBfX2Z1bmNfXywgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkLCB2YWwsCi0JCQkJIGJpdCk7Ci0JCQlmb3IgKGsgPSAwLCBjbGVhcmVkID0gZmFsc2U7IGsgPCBOVU1fQ09ERUNfREFJUzsgaysrKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBwcml2LT5kYWlbJWRdLmNoX21hc2sgPSAweCVseFxuIiwKLQkJCQkJIF9fZnVuY19fLCBrLCBwcml2LT5kYWlba10uY2hfbWFzayk7Ci0JCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChiaXQsCi0JCQkJCQkgICAgICAgJnByaXYtPmRhaVtrXS5jaF9tYXNrKSkgewotCQkJCQljbGVhcmVkID0gdHJ1ZTsKLQkJCQkJaWYgKCFwcml2LT5kYWlba10uY2hfbWFzaykKLQkJCQkJCXdha2VfdXAoJnByaXYtPmRhaVtrXS5kYWlfd2FpdCk7Ci0JCQkJCS8qCi0JCQkJCSAqIFRoZXJlIGFyZSBjYXNlcyB3aGVuIG11bHRpcGxlIERBSXMKLQkJCQkJICogbWlnaHQgYmUgdXNpbmcgdGhlIHNhbWUgc2xpbWJ1cwotCQkJCQkgKiBjaGFubmVsLiBIZW5jZSBkb24ndCBicmVhayBoZXJlLgotCQkJCQkgKi8KLQkJCQl9Ci0JCQl9Ci0JCQlXQVJOKCFjbGVhcmVkLAotCQkJICAgICAiQ291bGRuJ3QgZmluZCBzbGltYnVzICVzIHBvcnQgJWQgZm9yIGNsb3NpbmdcbiIsCi0JCQkgICAgICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCk7Ci0JCX0KLQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHByaXYtPndjZDl4eHgsCi0JCQkJCSAgICBUQVNIQV9TTElNX1BHRF9QT1JUX0lOVF9DTFJfUlhfMCArCi0JCQkJCSAgICAoaiAvIDgpLAotCQkJCQkgICAgMSA8PCAoaiAlIDgpKTsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfc2V0dXBfaXJxcyhzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQotCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQotCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIFdDRDlYWFhfSVJRX1NMSU1CVVMsCi0JCQkJICB0YXNoYV9zbGltYnVzX2lycSwgIlNMSU1CVVMgU2xhdmUiLCB0YXNoYSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIFdDRDlYWFhfSVJRX1NMSU1CVVMpOwotCWVsc2UKLQkJdGFzaGFfc2xpbV9pbnRlcmZhY2VfaW5pdF9yZWcoY29kZWMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfaW5pdF9zbGltX3NsYXZlX2NmZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19zbGltYnVzX3NsYXZlX2NmZyAqY2ZnOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gcHJpdi0+d2NkOXh4eDsKLQl1aW50NjRfdCBlYWRkciA9IDA7Ci0KLQljZmcgPSAmcHJpdi0+c2xpbWJ1c19zbGF2ZV9jZmc7Ci0JY2ZnLT5taW5vcl92ZXJzaW9uID0gMTsKLQljZmctPnR4X3NsYXZlX3BvcnRfb2Zmc2V0ID0gMDsKLQljZmctPnJ4X3NsYXZlX3BvcnRfb2Zmc2V0ID0gMTY7Ci0KLQltZW1jcHkoJmVhZGRyLCAmd2NkOXh4eC0+c2xpbS0+ZV9hZGRyLCBzaXplb2Yod2NkOXh4eC0+c2xpbS0+ZV9hZGRyKSk7Ci0JV0FSTl9PTihzaXplb2Yod2NkOXh4eC0+c2xpbS0+ZV9hZGRyKSAhPSA2KTsKLQljZmctPmRldmljZV9lbnVtX2FkZHJfbHN3ID0gZWFkZHIgJiAweEZGRkZGRkZGOwotCWNmZy0+ZGV2aWNlX2VudW1fYWRkcl9tc3cgPSBlYWRkciA+PiAzMjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzbGltYnVzIGxvZ2ljYWwgYWRkcmVzcyAweCVsbHhcbiIsCi0JCV9fZnVuY19fLCBlYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhc2hhX2NsZWFudXBfaXJxcyhzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9Ci0JCQkJJndjZDl4eHgtPmNvcmVfcmVzOwotCi0Jd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgV0NEOVhYWF9JUlFfU0xJTUJVUywgdGFzaGEpOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2hhbmRsZV9wZGF0YShzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEsCi0JCQkgICAgICBzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGFzaGEtPmNvZGVjOwotCXU4IGRtaWNfY3RsX3ZhbCwgbWFkX2RtaWNfY3RsX3ZhbDsKLQl1OCBhbmNfY3RsX3ZhbHVlOwotCXUzMiBkZWZfZG1pY19yYXRlLCBkbWljX2Nsa19kcnY7Ci0JaW50IHZvdXRfY3RsXzEsIHZvdXRfY3RsXzIsIHZvdXRfY3RsXzMsIHZvdXRfY3RsXzQ7Ci0JaW50IHJjID0gMDsKLQotCWlmICghcGRhdGEpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IE5VTEwgcGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogc2V0IG1pY2JpYXMgdm9sdGFnZSAqLwotCXZvdXRfY3RsXzEgPSB3Y2Q5MzM1X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiMV9tdik7Ci0Jdm91dF9jdGxfMiA9IHdjZDkzMzVfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHBkYXRhLT5taWNiaWFzLm1pY2IyX212KTsKLQl2b3V0X2N0bF8zID0gd2NkOTMzNV9nZXRfbWljYl92b3V0X2N0bF92YWwocGRhdGEtPm1pY2JpYXMubWljYjNfbXYpOwotCXZvdXRfY3RsXzQgPSB3Y2Q5MzM1X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiNF9tdik7Ci0JaWYgKHZvdXRfY3RsXzEgPCAwIHx8IHZvdXRfY3RsXzIgPCAwIHx8Ci0JICAgIHZvdXRfY3RsXzMgPCAwIHx8IHZvdXRfY3RsXzQgPCAwKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCMSwgMHgzRiwgdm91dF9jdGxfMSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfTUlDQjIsIDB4M0YsIHZvdXRfY3RsXzIpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX01JQ0IzLCAweDNGLCB2b3V0X2N0bF8zKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0FOQV9NSUNCNCwgMHgzRiwgdm91dF9jdGxfNCk7Ci0KLQkvKiBTZXQgdGhlIERNSUMgc2FtcGxlIHJhdGUgKi8KLQlzd2l0Y2ggKHBkYXRhLT5tY2xrX3JhdGUpIHsKLQljYXNlIFRBU0hBX01DTEtfQ0xLXzlQNk1IWjoKLQkJZGVmX2RtaWNfcmF0ZSA9IFdDRDlYWFhfRE1JQ19TQU1QTEVfUkFURV80UDhNSFo7Ci0JCWJyZWFrOwotCWNhc2UgVEFTSEFfTUNMS19DTEtfMTJQMjg4TUhaOgotCQlkZWZfZG1pY19yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQMDk2TUhaOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1jbGtfcmF0ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwZGF0YS0+bWNsa19yYXRlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfTsKLQotCWlmIChwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9PQotCSAgICBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEKSB7Ci0JCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogZG1pY19yYXRlIGludmFsaWQgZGVmYXVsdCA9ICVkXG4iLAotCQkJX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOwotCQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9IGRlZl9kbWljX3JhdGU7Ci0JfQotCWlmIChwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPT0KLQkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgewotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IG1hZF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGVmX2RtaWNfcmF0ZSk7Ci0JCS8qCi0JCSAqIHVzZSBkbWljX3NhbXBsZV9yYXRlIGFzIHRoZSBkZWZhdWx0IGZvciBNQUQKLQkJICogaWYgbWFkIGRtaWMgc2FtcGxlIHJhdGUgaXMgdW5kZWZpbmVkCi0JCSAqLwotCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKLQl9Ci0JaWYgKHBkYXRhLT5lY3BwX2RtaWNfc2FtcGxlX3JhdGUgPT0KLQkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgewotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAotCQkJICIlczogZWNwcF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOwotCQkvKgotCQkgKiB1c2UgZG1pY19zYW1wbGVfcmF0ZSBhcyB0aGUgZGVmYXVsdCBmb3IgRUNQUCBETUlDCi0JCSAqIGlmIGVjcHAgZG1pYyBzYW1wbGUgcmF0ZSBpcyB1bmRlZmluZWQKLQkJICovCi0JCXBkYXRhLT5lY3BwX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKLQl9Ci0KLQlpZiAocGRhdGEtPmRtaWNfY2xrX2RydiA9PQotCSAgICBXQ0Q5WFhYX0RNSUNfQ0xLX0RSSVZFX1VOREVGSU5FRCkgewotCQlwZGF0YS0+ZG1pY19jbGtfZHJ2ID0gV0NEOTMzNV9ETUlDX0NMS19EUklWRV9ERUZBVUxUOwotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LAotCQkJICIlczogZG1pY19jbGtfc3RyZW5ndGggaW52YWxpZCwgZGVmYXVsdCA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBwZGF0YS0+ZG1pY19jbGtfZHJ2KTsKLQl9Ci0KLQlzd2l0Y2ggKHBkYXRhLT5kbWljX2Nsa19kcnYpIHsKLQljYXNlIDI6Ci0JCWRtaWNfY2xrX2RydiA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJZG1pY19jbGtfZHJ2ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlkbWljX2Nsa19kcnYgPSAyOwotCQlicmVhazsKLQljYXNlIDE2OgotCQlkbWljX2Nsa19kcnYgPSAzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IGludmFsaWQgZG1pY19jbGtfZHJ2ICVkLCB1c2luZyBkZWZhdWx0XG4iLAotCQkJX19mdW5jX18sIHBkYXRhLT5kbWljX2Nsa19kcnYpOwotCQlkbWljX2Nsa19kcnYgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X1RFU1RfREVCVUdfUEFEX0RSVkNUTCwKLQkJCSAgICAweDBDLCBkbWljX2Nsa19kcnYgPDwgMik7Ci0KLQkvKgotCSAqIERlZmF1bHQgdGhlIERNSUMgY2xrIHJhdGVzIHRvIG1hZF9kbWljX3NhbXBsZV9yYXRlLAotCSAqIHdoZXJlYXMsIHRoZSBhbmMvdHhmZSBkbWljIHJhdGVzIHRvIGRtaWNfc2FtcGxlX3JhdGUKLQkgKiBzaW5jZSB0aGUgYW5jL3R4ZmUgYXJlIGluZGVwZW5kZW50IG9mIG1hZCBibG9jay4KLQkgKi8KLQltYWRfZG1pY19jdGxfdmFsID0gdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbCh0YXNoYS0+Y29kZWMsCi0JCQkJcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX0RNSUMwX0NUTCwKLQkJMHgwRSwgbWFkX2RtaWNfY3RsX3ZhbCA8PCAxKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9TU19ETUlDMV9DVEwsCi0JCTB4MEUsIG1hZF9kbWljX2N0bF92YWwgPDwgMSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfU1NfRE1JQzJfQ1RMLAotCQkweDBFLCBtYWRfZG1pY19jdGxfdmFsIDw8IDEpOwotCi0JZG1pY19jdGxfdmFsID0gdGFzaGFfZ2V0X2RtaWNfY2xrX3ZhbCh0YXNoYS0+Y29kZWMsCi0JCQkJcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSk7Ci0KLQlpZiAoZG1pY19jdGxfdmFsID09IFdDRDkzMzVfRE1JQ19DTEtfRElWXzIpCi0JCWFuY19jdGxfdmFsdWUgPSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0ZVTExfUkFURTsKLQllbHNlCi0JCWFuY19jdGxfdmFsdWUgPSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0hBTEZfUkFURTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8yX0NUTCwKLQkJCSAgICAweDQwLCBhbmNfY3RsX3ZhbHVlIDw8IDYpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzBfTU9ERV8yX0NUTCwKLQkJCSAgICAweDIwLCBhbmNfY3RsX3ZhbHVlIDw8IDUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCwKLQkJCSAgICAweDQwLCBhbmNfY3RsX3ZhbHVlIDw8IDYpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ0RDX0FOQzFfTU9ERV8yX0NUTCwKLQkJCSAgICAweDIwLCBhbmNfY3RsX3ZhbHVlIDw8IDUpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2NkX2NwZV9jb3JlICp0YXNoYV9jb2RlY19nZXRfY3BlX2NvcmUoCi0JCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JcmV0dXJuIHByaXYtPmNwZV9jb3JlOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NwZV9mbGxfdXBkYXRlX2RpdmlkZXIoCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1MzIgY3BlX2ZsbF9yYXRlKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1MzIgZGl2X3ZhbCA9IDAsIGxfdmFsID0gMDsKLQl1MzIgY29tcHV0ZWRfY3BlX2ZsbDsKLQotCWlmIChjcGVfZmxsX3JhdGUgIT0gQ1BFX0ZMTF9DTEtfNzVNSFogJiYKLQkgICAgY3BlX2ZsbF9yYXRlICE9IENQRV9GTExfQ0xLXzE1ME1IWikgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgQ1BFIGZsbCByYXRlIHJlcXVlc3QgJXVcbiIsCi0JCQlfX2Z1bmNfXywgY3BlX2ZsbF9yYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHdjZDl4eHgtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS18xMlAyODhNSFopIHsKLQkJLyogdXBkYXRlIGRpdmlkZXIgdG8gMTAgYW5kIGVuYWJsZSA1eCBkaXZpZGVyICovCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9VU0VSX0NUTF8xLAotCQkJICAgICAgMHg1NSk7Ci0JCWRpdl92YWwgPSAxMDsKLQl9IGVsc2UgaWYgKHdjZDl4eHgtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS185UDZNSFopIHsKLQkJLyogdXBkYXRlIGRpdmlkZXIgdG8gOCBhbmQgZW5hYmxlIDJ4IGRpdmlkZXIgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAsCi0JCQkJICAgIDB4N0MsIDB4NzApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMSwKLQkJCQkgICAgMHhFMCwgMHgyMCk7Ci0JCWRpdl92YWwgPSA4OwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBNQ0xLIHJhdGUgJXVcbiIsCi0JCQlfX2Z1bmNfXywgd2NkOXh4eC0+bWNsa19yYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbF92YWwgPSAoKGNwZV9mbGxfcmF0ZSAvIDEwMDApICogZGl2X3ZhbCkgLwotCQkgKHdjZDl4eHgtPm1jbGtfcmF0ZSAvIDEwMDApOwotCi0JLyogSWYgbF92YWwgd2FzIGludGVnZXIgdHJ1bmNhdGVkLCBpbmNyZW1lbnQgbF92YWwgb25jZSAqLwotCWNvbXB1dGVkX2NwZV9mbGwgPSAod2NkOXh4eC0+bWNsa19yYXRlIC8gZGl2X3ZhbCkgKiBsX3ZhbDsKLQlpZiAoY29tcHV0ZWRfY3BlX2ZsbCA8IGNwZV9mbGxfcmF0ZSkKLQkJbF92YWwrKzsKLQotCi0JLyogdXBkYXRlIEwgdmFsdWUgTFNCIGFuZCBNU0IgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzAsCi0JCSAgICAgIChsX3ZhbCAmIDB4RkYpKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfTF9WQUxfQ1RMXzEsCi0JCSAgICAgICgobF92YWwgPj4gOCkgJiAweEZGKSk7Ci0KLQl0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEgPSBjcGVfZmxsX3JhdGU7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IHVwZGF0ZWQgbF92YWwgdG8gJXUgZm9yIGNwZV9jbGsgJXUgYW5kIG1jbGsgJXVcbiIsCi0JCV9fZnVuY19fLCBsX3ZhbCwgY3BlX2ZsbF9yYXRlLCB3Y2Q5eHh4LT5tY2xrX3JhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXNoYV9jZGNfY2hhbmdlX2NwZV9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQl1MzIgY2xrX2ZyZXEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoIXRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJIiVzOiBTVlMgbm90IGVuYWJsZWQgb3IgdGFzaGEgaXMgbm90IDJwMCwgcmV0dXJuXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNsa19mcmVxID0gJXVcbiIsIF9fZnVuY19fLCBjbGtfZnJlcSk7Ci0KLQlpZiAoY2xrX2ZyZXEgPT0gQ1BFX0ZMTF9DTEtfNzVNSFopIHsKLQkJLyogQ2hhbmdlIHRvIFNWUyAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCi0JCQkJICAgIDB4MDgsIDB4MDgpOwotCQlpZiAodGFzaGFfY29kZWNfY3BlX2ZsbF91cGRhdGVfZGl2aWRlcihjb2RlYywgY2xrX2ZyZXEpKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAotCQkJCSAgICAweDEwLCAweDEwKTsKLQotCQljbGVhcl9iaXQoQ1BFX05PTUlOQUwsICZ0YXNoYS0+c3RhdHVzX21hc2spOwotCQl0YXNoYV9jb2RlY191cGRhdGVfc2lkb192b2x0YWdlKHRhc2hhLCBzaWRvX2J1Y2tfc3ZzX3ZvbHRhZ2UpOwotCi0JfSBlbHNlIGlmIChjbGtfZnJlcSA9PSBDUEVfRkxMX0NMS18xNTBNSFopIHsKLQkJLyogY2hhbmdlIHRvIG5vbWluYWwgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAotCQkJCSAgICAweDA4LCAweDA4KTsKLQotCQlzZXRfYml0KENQRV9OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQkJdGFzaGFfY29kZWNfdXBkYXRlX3NpZG9fdm9sdGFnZSh0YXNoYSwgU0lET19WT0xUQUdFX05PTUlOQUxfTVYpOwotCi0JCWlmICh0YXNoYV9jb2RlY19jcGVfZmxsX3VwZGF0ZV9kaXZpZGVyKGNvZGVjLCBjbGtfZnJlcSkpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX0ZMTF9NT0RFLAotCQkJCSAgICAweDEwLCAweDEwKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgY2xrX2ZyZXEgcmVxdWVzdCAlZCBmb3IgQ1BFIEZMTFxuIiwKLQkJCV9fZnVuY19fLCBjbGtfZnJlcSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi1kb25lOgotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwKLQkJCSAgICAweDEwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCi0JCQkgICAgMHgwOCwgMHgwMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX2NwZV9mbGxfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXU4IGNsa19zZWxfcmVnX3ZhbCA9IDB4MDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgZW5hYmxlID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCWlmICh0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQodGFzaGEpKSB7Ci0JCQkvKiBGTEwgZW5hYmxlIGlzIGFsd2F5cyBhdCBTVlMgKi8KLQkJCWlmIChfX3Rhc2hhX2NkY19jaGFuZ2VfY3BlX2Nsayhjb2RlYywKLQkJCQkJQ1BFX0ZMTF9DTEtfNzVNSFopKSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiJXM6IGNsayBjaGFuZ2UgdG8gJWQgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgQ1BFX0ZMTF9DTEtfNzVNSFopOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRhc2hhX2NvZGVjX2NwZV9mbGxfdXBkYXRlX2RpdmlkZXIoY29kZWMsCi0JCQkJCQkJQ1BFX0ZMTF9DTEtfNzVNSFopKSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiJXM6IGNsayBjaGFuZ2UgdG8gJWQgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgQ1BFX0ZMTF9DTEtfNzVNSFopOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9Ci0KLQkJaWYgKFRBU0hBX0lTXzFfMCh3Y2Q5eHh4KSkgewotCQkJdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCB0cnVlLCBmYWxzZSk7Ci0JCQljbGtfc2VsX3JlZ192YWwgPSAweDAyOwotCQl9Ci0KLQkJLyogU2V0dXAgQ1BFIHJlZmVyZW5jZSBjbGsgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKLQkJCQkgICAgMHgwMiwgY2xrX3NlbF9yZWdfdmFsKTsKLQotCQkvKiBlbmFibGUgQ1BFIEZMTCByZWZlcmVuY2UgY2xrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQU5BX0NMS19UT1AsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCi0JCS8qIHByb2dyYW0gdGhlIFBMTCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVVNFUl9DVExfMCwKLQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0KLQkJLyogVEVTVCBjbGsgc2V0dGluZyAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMCwKLQkJCQkgICAgMHg4MCwgMHg4MCk7Ci0JCS8qIHNldCBGTEwgbW9kZSB0byBIVyBjb250cm9sbGVkICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwKLQkJCQkgICAgMHg2MCwgMHgwMCk7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX0ZMTF9GTExfTU9ERSwgMHg4MCk7Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBDUEUgRkxMIHJlZmVyZW5jZSBjbGsgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKLQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCS8qIHVuZG8gVEVTVCBjbGsgc2V0dGluZyAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfVEVTVF9DVExfMCwKLQkJCQkgICAgMHg4MCwgMHgwMCk7Ci0JCS8qIHVuZG8gRkxMIG1vZGUgdG8gSFcgY29udHJvbCAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NQRV9GTExfRkxMX01PREUsCi0JCQkJICAgIDB4NjAsIDB4MjApOwotCQkvKiB1bmRvIHRoZSBQTEwgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DUEVfRkxMX1VTRVJfQ1RMXzAsCi0JCQkJICAgIDB4MDEsIDB4MDApOwotCi0JCWlmIChUQVNIQV9JU18xXzAod2NkOXh4eCkpCi0JCQl0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJLyoKLQkJICogRkxMIGNvdWxkIGdldCBkaXNhYmxlZCB3aGlsZSBhdCBub21pbmFsLAotCQkgKiBzY2FsZSBpdCBiYWNrIHRvIFNWUwotCQkgKi8KLQkJaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpCi0JCQlfX3Rhc2hhX2NkY19jaGFuZ2VfY3BlX2Nsayhjb2RlYywKLQkJCQkJCUNQRV9GTExfQ0xLXzc1TUhaKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCB0YXNoYV9jZGNfcXVlcnlfY3BlX2Nsa19wbGFuKHZvaWQgKmRhdGEsCi0JCXN0cnVjdCBjcGVfc3ZjX2NmZ19jbGtfcGxhbiAqY2xrX2ZyZXEpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGF0YTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0JdTMyIGNwZV9jbGtfa2h6OwotCi0JaWYgKCFjb2RlYykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvZGVjIGhhbmRsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY3BlX2Nsa19raHogPSB0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEgLyAxMDAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IGN1cnJlbnRfY2xrX2ZyZXEgPSAldVxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5jdXJyZW50X2NwZV9jbGtfZnJlcSk7Ci0KLQljbGtfZnJlcS0+Y3VycmVudF9jbGtfZmVxID0gY3BlX2Nsa19raHo7Ci0JY2xrX2ZyZXEtPm51bV9jbGtfZnJlcXMgPSAyOwotCi0JaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKLQkJY2xrX2ZyZXEtPmNsa19mcmVxc1swXSA9IENQRV9GTExfQ0xLXzc1TUhaIC8gMTAwMDsKLQkJY2xrX2ZyZXEtPmNsa19mcmVxc1sxXSA9IENQRV9GTExfQ0xLXzE1ME1IWiAvIDEwMDA7Ci0JfSBlbHNlIHsKLQkJY2xrX2ZyZXEtPmNsa19mcmVxc1swXSA9IENQRV9GTExfQ0xLXzc1TUhaOwotCQljbGtfZnJlcS0+Y2xrX2ZyZXFzWzFdID0gQ1BFX0ZMTF9DTEtfMTUwTUhaOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfY2RjX2NoYW5nZV9jcGVfY2xrKHZvaWQgKmRhdGEsCi0JCXUzMiBjbGtfZnJlcSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYXRhOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQl1MzIgY3BlX2Nsa19raHosIHJlcV9mcmVxID0gMDsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb2RlYyBoYW5kbGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNwZV9jbGtfa2h6ID0gdGFzaGEtPmN1cnJlbnRfY3BlX2Nsa19mcmVxIC8gMTAwMDsKLQotCWlmICh0YXNoYV9jZGNfaXNfc3ZzX2VuYWJsZWQodGFzaGEpKSB7Ci0JCWlmICgoY2xrX2ZyZXEgKiAxMDAwKSA8PSBDUEVfRkxMX0NMS183NU1IWikKLQkJCXJlcV9mcmVxID0gQ1BFX0ZMTF9DTEtfNzVNSFo7Ci0JCWVsc2UKLQkJCXJlcV9mcmVxID0gQ1BFX0ZMTF9DTEtfMTUwTUhaOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiByZXF1ZXN0ZWQgY2xrX2ZyZXEgPSAldSwgY3VycmVudCBjbGtfZnJlcSA9ICV1XG4iLAotCQlfX2Z1bmNfXywgY2xrX2ZyZXEgKiAxMDAwLAotCQl0YXNoYS0+Y3VycmVudF9jcGVfY2xrX2ZyZXEpOwotCi0JaWYgKHRhc2hhX2NkY19pc19zdnNfZW5hYmxlZCh0YXNoYSkpIHsKLQkJaWYgKF9fdGFzaGFfY2RjX2NoYW5nZV9jcGVfY2xrKGNvZGVjLCByZXFfZnJlcSkpCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBjbG9jay92b2x0YWdlIHNjYWxpbmcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfc2xpbV9yZXNlcnZlX2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJdTMyIGJ3X29wcywgYm9vbCBjb21taXQpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0KLQlpZiAoIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvZGVjXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlpZiAoIXdjZDl4eHgpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcGFyZW50IGRydl9kYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gd2NkOXh4eF9zbGltX3Jlc2VydmVfYncod2NkOXh4eCwgYndfb3BzLCBjb21taXQpOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX2NvZGVjX3ZvdGVfbWF4X2J3KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCWJvb2wgdm90ZSkKLXsKLQl1MzIgYndfb3BzOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPnNiX2Nsa19nZWFyX2xvY2spOwotCWlmICh2b3RlKSB7Ci0JCXRhc2hhLT5yZWZfY291bnQrKzsKLQkJaWYgKHRhc2hhLT5yZWZfY291bnQgPT0gMSkgewotCQkJYndfb3BzID0gU0xJTV9CV19DTEtfR0VBUl85OwotCQkJdGFzaGFfY29kZWNfc2xpbV9yZXNlcnZlX2J3KGNvZGVjLAotCQkJCWJ3X29wcywgdHJ1ZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKCF2b3RlICYmIHRhc2hhLT5yZWZfY291bnQgPiAwKSB7Ci0JCXRhc2hhLT5yZWZfY291bnQtLTsKLQkJaWYgKHRhc2hhLT5yZWZfY291bnQgPT0gMCkgewotCQkJYndfb3BzID0gU0xJTV9CV19VTlZPVEU7Ci0JCQl0YXNoYV9jb2RlY19zbGltX3Jlc2VydmVfYncoY29kZWMsCi0JCQkJYndfb3BzLCB0cnVlKTsKLQkJfQotCX07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyBWYWx1ZSBvZiBjb3VudGVyIGFmdGVyIHZvdGUgb3IgdW4tdm90ZSBpcyAlZFxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5yZWZfY291bnQpOwotCi0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+c2JfY2xrX2dlYXJfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jcGVfZXJyX2lycV9jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQllbnVtIGNwZV9lcnJfaXJxX2NudGxfdHlwZSBjbnRsX3R5cGUsIHU4ICpzdGF0dXMpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTggaXJxX2JpdHM7Ci0KLQlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKLQkJaXJxX2JpdHMgPSAweEZGOwotCWVsc2UKLQkJaXJxX2JpdHMgPSAweDNGOwotCi0JaWYgKHN0YXR1cykKLQkJaXJxX2JpdHMgPSAoKnN0YXR1cykgJiBpcnFfYml0czsKLQotCXN3aXRjaCAoY250bF90eXBlKSB7Ci0JY2FzZSBDUEVfRVJSX0lSUV9NQVNLOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCSAgICBXQ0Q5MzM1X0NQRV9TU19TU19FUlJPUl9JTlRfTUFTSywKLQkJCQkgICAgaXJxX2JpdHMsIGlycV9iaXRzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUEVfRVJSX0lSUV9VTk1BU0s6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJICAgIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLLAotCQkJCSAgICBpcnFfYml0cywgMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BFX0VSUl9JUlFfQ0xFQVI6Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUiwKLQkJCSAgICAgIGlycV9iaXRzKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUEVfRVJSX0lSUV9TVEFUVVM6Ci0JCWlmICghc3RhdHVzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCSpzdGF0dXMgPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJICAgICAgIFdDRDkzMzVfQ1BFX1NTX1NTX0VSUk9SX0lOVF9TVEFUVVMpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfY3BlX2NkY19jYiBjcGVfY2IgPSB7Ci0JLmNkY19jbGtfZW4gPSB0YXNoYV9jb2RlY19pbnRlcm5hbF9yY29fY3RybCwKLQkuY3BlX2Nsa19lbiA9IHRhc2hhX2NvZGVjX2NwZV9mbGxfZW5hYmxlLAotCS5nZXRfYWZlX291dF9wb3J0X2lkID0gdGFzaGFfY29kZWNfZ2V0X21hZF9wb3J0X2lkLAotCS5sYWJfY2RjX2NoX2N0bCA9IHRhc2hhX2NvZGVjX2VuYWJsZV9zbGltdHhfbWFkLAotCS5jZGNfZXh0X2NsayA9IHRhc2hhX2NkY19tY2xrX2VuYWJsZSwKLQkuYnVzX3ZvdGVfYncgPSB0YXNoYV9jb2RlY192b3RlX21heF9idywKLQkuY3BlX2Vycl9pcnFfY29udHJvbCA9IHRhc2hhX2NwZV9lcnJfaXJxX2NvbnRyb2wsCi19OwotCi1zdGF0aWMgc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSBjcGVfc3ZjX3BhcmFtcyA9IHsKLQkudmVyc2lvbiA9IENQRV9TVkNfSU5JVF9QQVJBTV9WMSwKLQkucXVlcnlfZnJlcV9wbGFuc19jYiA9IHRhc2hhX2NkY19xdWVyeV9jcGVfY2xrX3BsYW4sCi0JLmNoYW5nZV9mcmVxX3BsYW5fY2IgPSB0YXNoYV9jZGNfY2hhbmdlX2NwZV9jbGssCi19OwotCi1zdGF0aWMgaW50IHRhc2hhX2NwZV9pbml0aWFsaXplKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkX2NwZV9wYXJhbXMgY3BlX3BhcmFtczsKLQotCW1lbXNldCgmY3BlX3BhcmFtcywgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3Y2RfY3BlX3BhcmFtcykpOwotCWNwZV9wYXJhbXMuY29kZWMgPSBjb2RlYzsKLQljcGVfcGFyYW1zLmdldF9jcGVfY29yZSA9IHRhc2hhX2NvZGVjX2dldF9jcGVfY29yZTsKLQljcGVfcGFyYW1zLmNkY19jYiA9ICZjcGVfY2I7Ci0JY3BlX3BhcmFtcy5kYmdfbW9kZSA9IGNwZV9kZWJ1Z19tb2RlOwotCWNwZV9wYXJhbXMuY2RjX21ham9yX3ZlciA9IENQRV9TVkNfQ09ERUNfV0NEOTMzNTsKLQljcGVfcGFyYW1zLmNkY19taW5vcl92ZXIgPSBDUEVfU1ZDX0NPREVDX1YxUDA7Ci0JY3BlX3BhcmFtcy5jZGNfaWQgPSBDUEVfU1ZDX0NPREVDX1dDRDkzMzU7Ci0KLQljcGVfcGFyYW1zLmNkY19pcnFfaW5mby5jcGVfZW5naW5lX2lycSA9Ci0JCQlXQ0Q5MzM1X0lSUV9TVkFfT1VUQk9YMTsKLQljcGVfcGFyYW1zLmNkY19pcnFfaW5mby5jcGVfZXJyX2lycSA9Ci0JCQlXQ0Q5MzM1X0lSUV9TVkFfRVJST1I7Ci0JY3BlX3BhcmFtcy5jZGNfaXJxX2luZm8uY3BlX2ZhdGFsX2lycXMgPQotCQkJVEFTSEFfQ1BFX0ZBVEFMX0lSUVM7Ci0KLQljcGVfc3ZjX3BhcmFtcy5jb250ZXh0ID0gY29kZWM7Ci0JY3BlX3BhcmFtcy5jcGVfc3ZjX3BhcmFtcyA9ICZjcGVfc3ZjX3BhcmFtczsKLQotCXRhc2hhLT5jcGVfY29yZSA9IHdjZF9jcGVfaW5pdCgiY3BlXzkzMzUiLCBjb2RlYywKLQkJCQkJJmNwZV9wYXJhbXMpOwotCWlmIChJU19FUlJfT1JfTlVMTCh0YXNoYS0+Y3BlX2NvcmUpKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGVuYWJsZSBDUEVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9yZXNtZ3JfY2IgdGFzaGFfcmVzbWdyX2NiID0gewotCS5jZGNfcmNvX2N0cmwgPSBfX3Rhc2hhX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsLAotfTsKLQotc3RhdGljIGludCB0YXNoYV9kZXZpY2VfZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnByaXY7Ci0JaW50IGNvdW50OwotCWludCBpID0gMDsKLQotCWNvZGVjID0gKHN0cnVjdCBzbmRfc29jX2NvZGVjICopKHdjZDl4eHgtPnNzcl9wcml2KTsKLQlwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jd2NkX2NwZV9zc3JfZXZlbnQocHJpdi0+Y3BlX2NvcmUsIFdDRF9DUEVfQlVTX0RPV05fRVZFTlQpOwotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5ucjsgaSsrKQotCQlzd3JtX3djZF9ub3RpZnkocHJpdi0+c3dyX2N0cmxfZGF0YVtpXS5zd3JfcGRldiwKLQkJCQlTV1JfREVWSUNFX0RPV04sIE5VTEwpOwotCXNuZF9zb2NfY2FyZF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvZGVjLT5jb21wb25lbnQuY2FyZCwgMCk7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTlVNX0NPREVDX0RBSVM7IGNvdW50KyspCi0JCXByaXYtPmRhaVtjb3VudF0uYnVzX2Rvd25faW5fcmVjb3ZlcnkgPSB0cnVlOwotCi0JcHJpdi0+cmVzbWdyLT5zaWRvX2lucHV0X3NyYyA9IFNJRE9fU09VUkNFX0lOVEVSTkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcG9zdF9yZXNldF9jYihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKLQotCWNvZGVjID0gKHN0cnVjdCBzbmRfc29jX2NvZGVjICopKHdjZDl4eHgtPnNzcl9wcml2KTsKLQl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCXdjZDl4eHhfc2V0X3Bvd2VyX3N0YXRlKHRhc2hhLT53Y2Q5eHh4LAotCQkJCVdDRF9SRUdJT05fUE9XRVJfQ09MTEFQU0VfUkVNT1ZFLAotCQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPmNvZGVjX211dGV4KTsKLQotCXRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X2ludGZkZXZfbGEgPQotCQljb250cm9sLT5zbGltX3NsYXZlLT5sYWRkcjsKLQl0YXNoYV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9wZ2RfbGEgPQotCQljb250cm9sLT5zbGltLT5sYWRkcjsKLQl0YXNoYV9pbml0X3NsaW1fc2xhdmVfY2ZnKGNvZGVjKTsKLQlpZiAodGFzaGEtPm1hY2hpbmVfY29kZWNfZXZlbnRfY2IpCi0JCXRhc2hhLT5tYWNoaW5lX2NvZGVjX2V2ZW50X2NiKGNvZGVjLAotCQkJCVdDRDkzMzVfQ09ERUNfRVZFTlRfQ09ERUNfVVApOwotCXNuZF9zb2NfY2FyZF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvZGVjLT5jb21wb25lbnQuY2FyZCwgMSk7Ci0KLQkvKiBDbGFzcy1IIEluaXQqLwotCXdjZF9jbHNoX2luaXQoJnRhc2hhLT5jbHNoX2QpOwotCi0JZm9yIChpID0gMDsgaSA8IFRBU0hBX01BWF9NSUNCSUFTOyBpKyspCi0JCXRhc2hhLT5taWNiX3JlZltpXSA9IDA7Ci0KLQl0YXNoYV91cGRhdGVfcmVnX2RlZmF1bHRzKHRhc2hhKTsKLQotCXRhc2hhLT5jb2RlYyA9IGNvZGVjOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1DTEsgUmF0ZSA9ICV4XG4iLAotCQlfX2Z1bmNfXywgY29udHJvbC0+bWNsa19yYXRlKTsKLQotCWlmIChjb250cm9sLT5tY2xrX3JhdGUgPT0gVEFTSEFfTUNMS19DTEtfMTJQMjg4TUhaKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCi0JCQkJICAgIDB4MDMsIDB4MDApOwotCWVsc2UgaWYgKGNvbnRyb2wtPm1jbGtfcmF0ZSA9PSBUQVNIQV9NQ0xLX0NMS185UDZNSFopCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzMzVfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKLQkJCQkgICAgMHgwMywgMHgwMSk7Ci0JdGFzaGFfY29kZWNfaW5pdF9yZWcoY29kZWMpOwotCi0Jd2NkX3Jlc21ncl9wb3N0X3Nzcl92Mih0YXNoYS0+cmVzbWdyKTsKLQotCXRhc2hhX2VuYWJsZV9lZnVzZV9zZW5zaW5nKGNvZGVjKTsKLQotCXJlZ2NhY2hlX21hcmtfZGlydHkoY29kZWMtPmNvbXBvbmVudC5yZWdtYXApOwotCXJlZ2NhY2hlX3N5bmMoY29kZWMtPmNvbXBvbmVudC5yZWdtYXApOwotCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JcmV0ID0gdGFzaGFfaGFuZGxlX3BkYXRhKHRhc2hhLCBwZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIHBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBSZXNldCByZWZlcmVuY2UgY291bnRlciBmb3Igdm90aW5nIGZvciBtYXggYncgKi8KLQl0YXNoYS0+cmVmX2NvdW50ID0gMDsKLQkvKiBNQkhDIEluaXQgKi8KLQl3Y2RfbWJoY19kZWluaXQoJnRhc2hhLT5tYmhjKTsKLQl0YXNoYS0+bWJoY19zdGFydGVkID0gZmFsc2U7Ci0KLQkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCi0JcmV0ID0gd2NkX21iaGNfaW5pdCgmdGFzaGEtPm1iaGMsIGNvZGVjLCAmbWJoY19jYiwgJmludHJfaWRzLAotCQkgICAgICB3Y2RfbWJoY19yZWdpc3RlcnMsIFRBU0hBX1pERVRfU1VQUE9SVEVEKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JZWxzZQotCQl0YXNoYV9tYmhjX2hzX2RldGVjdChjb2RlYywgdGFzaGEtPm1iaGMubWJoY19jZmcpOwotCi0JdGFzaGFfY2xlYW51cF9pcnFzKHRhc2hhKTsKLQlyZXQgPSB0YXNoYV9zZXR1cF9pcnFzKHRhc2hhKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB0YXNoYSBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXRhc2hhX3NldF9zcGtyX21vZGUoY29kZWMsIHRhc2hhLT5zcGtyX21vZGUpOwotCXdjZF9jcGVfc3NyX2V2ZW50KHRhc2hhLT5jcGVfY29yZSwgV0NEX0NQRV9CVVNfVVBfRVZFTlQpOwotCi1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICp0YXNoYV9jb2RlY19maW5kX29uZGVtYW5kX3JlZ3VsYXRvcigKLQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICpuYW1lKQotewotCWludCBpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JZm9yIChpID0gMDsgaSA8IHdjZDl4eHgtPm51bV9vZl9zdXBwbGllczsgKytpKSB7Ci0JCWlmIChwZGF0YS0+cmVndWxhdG9yW2ldLm9uZGVtYW5kICYmCi0JCQl3Y2Q5eHh4LT5zdXBwbGllc1tpXS5zdXBwbHkgJiYKLQkJCSFzdHJjbXAod2NkOXh4eC0+c3VwcGxpZXNbaV0uc3VwcGx5LCBuYW1lKSkKLQkJCXJldHVybiB3Y2Q5eHh4LT5zdXBwbGllc1tpXS5jb25zdW1lcjsKLQl9Ci0KLQlkZXZfZGJnKHRhc2hhLT5kZXYsICJXYXJuaW5nOiByZWd1bGF0b3Igbm90IGZvdW5kOiVzXG4iLAotCQluYW1lKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9jb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZDl4eHggKmNvbnRyb2w7Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQlpbnQgaSwgcmV0OwotCXZvaWQgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5OwotCi0JY29udHJvbCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JZGV2X2luZm8oY29kZWMtPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQl0YXNoYSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXRhc2hhLT5pbnRmX3R5cGUgPSB3Y2Q5eHh4X2dldF9pbnRmX3R5cGUoKTsKLQotCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykgewotCQljb250cm9sLT5kZXZfZG93biA9IHRhc2hhX2RldmljZV9kb3duOwotCQljb250cm9sLT5wb3N0X3Jlc2V0ID0gdGFzaGFfcG9zdF9yZXNldF9jYjsKLQkJY29udHJvbC0+c3NyX3ByaXYgPSAodm9pZCAqKWNvZGVjOwotCX0KLQotCS8qIFJlc291cmNlIE1hbmFnZXIgcG9zdCBJbml0ICovCi0JcmV0ID0gd2NkX3Jlc21ncl9wb3N0X2luaXQodGFzaGEtPnJlc21nciwgJnRhc2hhX3Jlc21ncl9jYiwgY29kZWMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdjZCByZXNtZ3IgcG9zdCBpbml0IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCS8qIENsYXNzLUggSW5pdCovCi0Jd2NkX2Nsc2hfaW5pdCgmdGFzaGEtPmNsc2hfZCk7Ci0JLyogRGVmYXVsdCBIUEggTW9kZSB0byBDbGFzcy1IIEhpRmkgKi8KLQl0YXNoYS0+aHBoX21vZGUgPSBDTFNfSF9ISUZJOwotCi0JdGFzaGEtPmNvZGVjID0gY29kZWM7Ci0JZm9yIChpID0gMDsgaSA8IENPTVBBTkRFUl9NQVg7IGkrKykKLQkJdGFzaGEtPmNvbXBfZW5hYmxlZFtpXSA9IDA7Ci0KLQl0YXNoYS0+c3Brcl9nYWluX29mZnNldCA9IFJYX0dBSU5fT0ZGU0VUXzBfREI7Ci0JdGFzaGEtPmludGZfdHlwZSA9IHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpOwotCXRhc2hhX3VwZGF0ZV9yZWdfcmVzZXRfdmFsdWVzKGNvZGVjKTsKLQlwcl9kZWJ1ZygiJXM6IE1DTEsgUmF0ZSA9ICV4XG4iLCBfX2Z1bmNfXywgY29udHJvbC0+bWNsa19yYXRlKTsKLQlpZiAoY29udHJvbC0+bWNsa19yYXRlID09IFRBU0hBX01DTEtfQ0xLXzEyUDI4OE1IWikKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTMzNV9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAotCQkJCSAgICAweDAzLCAweDAwKTsKLQllbHNlIGlmIChjb250cm9sLT5tY2xrX3JhdGUgPT0gVEFTSEFfTUNMS19DTEtfOVA2TUhaKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzM1X0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCi0JCQkJICAgIDB4MDMsIDB4MDEpOwotCXRhc2hhX2NvZGVjX2luaXRfcmVnKGNvZGVjKTsKLQotCXRhc2hhX2VuYWJsZV9lZnVzZV9zZW5zaW5nKGNvZGVjKTsKLQotCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXJldCA9IHRhc2hhX2hhbmRsZV9wZGF0YSh0YXNoYSwgcGRhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGJhZCBwZGF0YVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzdXBwbHkgPSB0YXNoYV9jb2RlY19maW5kX29uZGVtYW5kX3JlZ3VsYXRvcihjb2RlYywKLQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW09OX0RFTUFORF9NSUNCSUFTXSk7Ci0JaWYgKHN1cHBseSkgewotCQl0YXNoYS0+b25fZGVtYW5kX2xpc3RbT05fREVNQU5EX01JQ0JJQVNdLnN1cHBseSA9IHN1cHBseTsKLQkJdGFzaGEtPm9uX2RlbWFuZF9saXN0W09OX0RFTUFORF9NSUNCSUFTXS5vbmRlbWFuZF9zdXBwbHlfY291bnQgPQotCQkJCTA7Ci0JfQotCi0JdGFzaGEtPmZ3X2RhdGEgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwKLQkJCQkgICAgICBzaXplb2YoKih0YXNoYS0+ZndfZGF0YSkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRhc2hhLT5md19kYXRhKQotCQlnb3RvIGVycjsKLQlzZXRfYml0KFdDRDlYWFhfQU5DX0NBTCwgdGFzaGEtPmZ3X2RhdGEtPmNhbF9iaXQpOwotCXNldF9iaXQoV0NEOVhYWF9NQkhDX0NBTCwgdGFzaGEtPmZ3X2RhdGEtPmNhbF9iaXQpOwotCXNldF9iaXQoV0NEOVhYWF9NQURfQ0FMLCB0YXNoYS0+ZndfZGF0YS0+Y2FsX2JpdCk7Ci0Jc2V0X2JpdChXQ0Q5WFhYX1ZCQVRfQ0FMLCB0YXNoYS0+ZndfZGF0YS0+Y2FsX2JpdCk7Ci0KLQlyZXQgPSB3Y2RfY2FsX2NyZWF0ZV9od2RlcCh0YXNoYS0+ZndfZGF0YSwKLQkJCQkgICBXQ0Q5WFhYX0NPREVDX0hXREVQX05PREUsIGNvZGVjKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyBod2RlcCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9od2RlcDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCi0JaWYgKFRBU0hBX0lTXzJfMCh0YXNoYS0+d2NkOXh4eCkpIHsKLQkJd2NkX21iaGNfcmVnaXN0ZXJzW1dDRF9NQkhDX0ZTTV9TVEFUVVNdLnJlZyA9Ci0JCQlXQ0Q5MzM1X01CSENfRlNNX1NUQVRVUzsKLQkJd2NkX21iaGNfcmVnaXN0ZXJzW1dDRF9NQkhDX0ZTTV9TVEFUVVNdLm1hc2sgPSAweDAxOwotCX0KLQlyZXQgPSB3Y2RfbWJoY19pbml0KCZ0YXNoYS0+bWJoYywgY29kZWMsICZtYmhjX2NiLCAmaW50cl9pZHMsCi0JCSAgICAgIHdjZF9tYmhjX3JlZ2lzdGVycywgVEFTSEFfWkRFVF9TVVBQT1JURUQpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfaHdkZXA7Ci0JfQotCi0JcHRyID0gZGV2bV9remFsbG9jKGNvZGVjLT5kZXYsIChzaXplb2YodGFzaGFfcnhfY2hzKSArCi0JCQkgICBzaXplb2YodGFzaGFfdHhfY2hzKSksIEdGUF9LRVJORUwpOwotCWlmICghcHRyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2h3ZGVwOwotCX0KLQotCWlmICh0YXNoYS0+aW50Zl90eXBlID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7Ci0JCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdGFzaGFfZGFwbV9pMnNfd2lkZ2V0cywKLQkJCUFSUkFZX1NJWkUodGFzaGFfZGFwbV9pMnNfd2lkZ2V0cykpOwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhdWRpb19pMnNfbWFwLAotCQkJQVJSQVlfU0laRShhdWRpb19pMnNfbWFwKSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhc2hhX2kyc19kYWkpOyBpKyspIHsKLQkJCUlOSVRfTElTVF9IRUFEKCZ0YXNoYS0+ZGFpW2ldLndjZDl4eHhfY2hfbGlzdCk7Ci0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0YXNoYS0+ZGFpW2ldLmRhaV93YWl0KTsKLQkJfQotCX0gZWxzZSBpZiAodGFzaGEtPmludGZfdHlwZSA9PSBXQ0Q5WFhYX0lOVEVSRkFDRV9UWVBFX1NMSU1CVVMpIHsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFQ19EQUlTOyBpKyspIHsKLQkJCUlOSVRfTElTVF9IRUFEKCZ0YXNoYS0+ZGFpW2ldLndjZDl4eHhfY2hfbGlzdCk7Ci0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0YXNoYS0+ZGFpW2ldLmRhaV93YWl0KTsKLQkJfQotCQl0YXNoYV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX2Rldl9pbnRmZGV2X2xhID0KLQkJCQkJY29udHJvbC0+c2xpbV9zbGF2ZS0+bGFkZHI7Ci0JCXRhc2hhX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X3BnZF9sYSA9Ci0JCQkJCWNvbnRyb2wtPnNsaW0tPmxhZGRyOwotCQl0YXNoYV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnLnNsYXZlX3BvcnRfbWFwcGluZ1swXSA9Ci0JCQkJCVRBU0hBX1RYMTM7Ci0JCXRhc2hhX2luaXRfc2xpbV9zbGF2ZV9jZmcoY29kZWMpOwotCX0KLQotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzLAotCQkJCSAgIEFSUkFZX1NJWkUoaW1wZWRhbmNlX2RldGVjdF9jb250cm9scykpOwotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBocGhfdHlwZV9kZXRlY3RfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRShocGhfdHlwZV9kZXRlY3RfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLAotCQkJdGFzaGFfYW5hbG9nX2dhaW5fY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKHRhc2hhX2FuYWxvZ19nYWluX2NvbnRyb2xzKSk7Ci0JY29udHJvbC0+bnVtX3J4X3BvcnQgPSBUQVNIQV9SWF9NQVg7Ci0JY29udHJvbC0+cnhfY2hzID0gcHRyOwotCW1lbWNweShjb250cm9sLT5yeF9jaHMsIHRhc2hhX3J4X2Nocywgc2l6ZW9mKHRhc2hhX3J4X2NocykpOwotCWNvbnRyb2wtPm51bV90eF9wb3J0ID0gVEFTSEFfVFhfTUFYOwotCWNvbnRyb2wtPnR4X2NocyA9IHB0ciArIHNpemVvZih0YXNoYV9yeF9jaHMpOwotCW1lbWNweShjb250cm9sLT50eF9jaHMsIHRhc2hhX3R4X2Nocywgc2l6ZW9mKHRhc2hhX3R4X2NocykpOwotCi0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxIFBsYXliYWNrIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxIENhcHR1cmUiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjIgUGxheWJhY2siKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjIgQ2FwdHVyZSIpOwotCi0JaWYgKHRhc2hhLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKSB7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMyBQbGF5YmFjayIpOwotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjMgQ2FwdHVyZSIpOwotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjQgUGxheWJhY2siKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYgTWl4IFBsYXliYWNrIik7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBNQUQgVFgiKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJWSWZlZWQiKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUY1IENQRSBUWCIpOwotCX0KLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JcmV0ID0gdGFzaGFfc2V0dXBfaXJxcyh0YXNoYSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB0YXNoYSBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfcGRhdGE7Ci0JfQotCi0JcmV0ID0gdGFzaGFfY3BlX2luaXRpYWxpemUoY29kZWMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBjcGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQkvKiBEbyBub3QgZmFpbCBwcm9iZSBpZiBDUEUgZmFpbGVkICovCi0JCXJldCA9IDA7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFRBU0hBX05VTV9ERUNJTUFUT1JTOyBpKyspIHsKLQkJdGFzaGEtPnR4X2hwZl93b3JrW2ldLnRhc2hhID0gdGFzaGE7Ci0JCXRhc2hhLT50eF9ocGZfd29ya1tpXS5kZWNpbWF0b3IgPSBpOwotCQlJTklUX0RFTEFZRURfV09SSygmdGFzaGEtPnR4X2hwZl93b3JrW2ldLmR3b3JrLAotCQkJdGFzaGFfdHhfaHBmX2Nvcm5lcl9mcmVxX2NhbGxiYWNrKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVEFTSEFfTlVNX0RFQ0lNQVRPUlM7IGkrKykgewotCQl0YXNoYS0+dHhfbXV0ZV9kd29ya1tpXS50YXNoYSA9IHRhc2hhOwotCQl0YXNoYS0+dHhfbXV0ZV9kd29ya1tpXS5kZWNpbWF0b3IgPSBpOwotCQlJTklUX0RFTEFZRURfV09SSygmdGFzaGEtPnR4X211dGVfZHdvcmtbaV0uZHdvcmssCi0JCQkgIHRhc2hhX3R4X211dGVfdXBkYXRlX2NhbGxiYWNrKTsKLQl9Ci0KLQl0YXNoYS0+c3BrX2FuY19kd29yay50YXNoYSA9IHRhc2hhOwotCUlOSVRfREVMQVlFRF9XT1JLKCZ0YXNoYS0+c3BrX2FuY19kd29yay5kd29yaywKLQkJCSAgdGFzaGFfc3BrX2FuY191cGRhdGVfY2FsbGJhY2spOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPmNvZGVjX211dGV4KTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIExJTkVPVVQyIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgTElORU9VVDEgUEEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBMSU5FT1VUMiBQQSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCBQQSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIgUEEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIgUEEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBTUEsxIFBBIik7Ci0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JcmV0dXJuIHJldDsKLQotZXJyX3BkYXRhOgotCWRldm1fa2ZyZWUoY29kZWMtPmRldiwgcHRyKTsKLQljb250cm9sLT5yeF9jaHMgPSBOVUxMOwotCWNvbnRyb2wtPnR4X2NocyA9IE5VTEw7Ci1lcnJfaHdkZXA6Ci0JZGV2bV9rZnJlZShjb2RlYy0+ZGV2LCB0YXNoYS0+ZndfZGF0YSk7Ci0JdGFzaGEtPmZ3X2RhdGEgPSBOVUxMOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfY29kZWNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKLQotCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQljb250cm9sLT5yeF9jaHMgPSBOVUxMOwotCWNvbnRyb2wtPnR4X2NocyA9IE5VTEw7Ci0KLQl0YXNoYV9jbGVhbnVwX2lycXModGFzaGEpOwotCS8qIENsZWFudXAgTUJIQyAqLwotCS8qIENsZWFudXAgcmVzbWdyICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByZWdtYXAgKnRhc2hhX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQotCXJldHVybiBjb250cm9sLT5yZWdtYXA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl90YXNoYSA9IHsKLQkucHJvYmUgPSB0YXNoYV9jb2RlY19wcm9iZSwKLQkucmVtb3ZlID0gdGFzaGFfY29kZWNfcmVtb3ZlLAotCS5nZXRfcmVnbWFwID0gdGFzaGFfZ2V0X3JlZ21hcCwKLQkuY29tcG9uZW50X2RyaXZlciA9IHsKLQkJLmNvbnRyb2xzID0gdGFzaGFfc25kX2NvbnRyb2xzLAotCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0YXNoYV9zbmRfY29udHJvbHMpLAotCQkuZGFwbV93aWRnZXRzID0gdGFzaGFfZGFwbV93aWRnZXRzLAotCQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGFzaGFfZGFwbV93aWRnZXRzKSwKLQkJLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAotCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAotCX0sCi19OwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHRhc2hhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGFzaGEtPnBvd2VyX2dhdGVfd29yaykpCi0JCXRhc2hhX2NvZGVjX3Bvd2VyX2dhdGVfZGlnaXRhbF9jb3JlKHRhc2hhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKCF0YXNoYSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiB0YXNoYSBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGV2X2RiZyhkZXYsICIlczogc3lzdGVtIHJlc3VtZVxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdGFzaGFfcG1fb3BzID0gewotCS5zdXNwZW5kID0gdGFzaGFfc3VzcGVuZCwKLQkucmVzdW1lID0gdGFzaGFfcmVzdW1lLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IHRhc2hhX3N3cm1fcmVhZCh2b2lkICpoYW5kbGUsIGludCByZWcpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCXVuc2lnbmVkIHNob3J0IHN3cl9yZF9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc3dyX3JkX2RhdGFfYmFzZTsKLQlpbnQgdmFsLCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKiloYW5kbGU7Ci0Jd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OwotCi0JZGV2X2RiZyh0YXNoYS0+ZGV2LCAiJXM6IFJlYWRpbmcgc291bmR3aXJlIHJlZ2lzdGVyLCAweCV4XG4iLAotCQlfX2Z1bmNfXywgcmVnKTsKLQlzd3JfcmRfYWRkcl9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9SRF9BRERSXzA7Ci0Jc3dyX3JkX2RhdGFfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfUkRfREFUQV8wOwotCS8qIHJlYWRfbG9jayAqLwotCW11dGV4X2xvY2soJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKLQlyZXQgPSByZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9hZGRyX2Jhc2UsCi0JCQkJKHU4ICopJnJlZywgNCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogUkQgQWRkciBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQkvKiBDaGVjayBmb3IgUkQgc3RhdHVzICovCi0JcmV0ID0gcmVnbWFwX2J1bGtfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9kYXRhX2Jhc2UsCi0JCQkgICAgICAgKHU4ICopJnZhbCwgNCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogUkQgRGF0YSBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSB2YWw7Ci1lcnI6Ci0JLyogcmVhZF91bmxvY2sgKi8KLQltdXRleF91bmxvY2soJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3N3cm1faTJzX2J1bGtfd3JpdGUoc3RydWN0IHdjZDl4eHggKndjZDl4eHgsCi0JCQkJc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWcsCi0JCQkJc2l6ZV90IGxlbikKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfYWRkcl9iYXNlOwotCXVuc2lnbmVkIHNob3J0IHN3cl93cl9kYXRhX2Jhc2U7Ci0KLQlzd3Jfd3JfYWRkcl9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9BRERSXzA7Ci0Jc3dyX3dyX2RhdGFfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfREFUQV8wOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4gKiAyKTsgaSArPSAyKSB7Ci0JCS8qIEZpcnN0IFdyaXRlIHRoZSBEYXRhIHRvIHJlZ2lzdGVyICovCi0JCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwKLQkJCXN3cl93cl9kYXRhX2Jhc2UsIGJ1bGtfcmVnW2ldLmJ1ZiwgNCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBXUiBEYXRhIEZhaWx1cmVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogTmV4dCBXcml0ZSBBZGRyZXNzICovCi0JCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwKLQkJCXN3cl93cl9hZGRyX2Jhc2UsIGJ1bGtfcmVnW2krMV0uYnVmLCA0KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IFdSIEFkZHIgRmFpbHVyZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3N3cm1fYnVsa193cml0ZSh2b2lkICpoYW5kbGUsIHUzMiAqcmVnLCB1MzIgKnZhbCwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCAqYnVsa19yZWc7Ci0JdW5zaWduZWQgc2hvcnQgc3dyX3dyX2FkZHJfYmFzZTsKLQl1bnNpZ25lZCBzaG9ydCBzd3Jfd3JfZGF0YV9iYXNlOwotCWludCBpLCBqLCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGxlbiA8PSAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2l6ZTogJXp1XG4iLCBfX2Z1bmNfXywgbGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRhc2hhID0gKHN0cnVjdCB0YXNoYV9wcml2ICopaGFuZGxlOwotCXdjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQotCXN3cl93cl9hZGRyX2Jhc2UgPSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0FERFJfMDsKLQlzd3Jfd3JfZGF0YV9iYXNlID0gV0NEOTMzNV9TV1JfQUhCX0JSSURHRV9XUl9EQVRBXzA7Ci0KLQlidWxrX3JlZyA9IGt6YWxsb2MoKDIgKiBsZW4gKiBzaXplb2Yoc3RydWN0IHdjZDl4eHhfcmVnX3ZhbCkpLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWxrX3JlZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IChsZW4gKiAyKTsgaSArPSAyLCBqKyspIHsKLQkJYnVsa19yZWdbaV0ucmVnID0gc3dyX3dyX2RhdGFfYmFzZTsKLQkJYnVsa19yZWdbaV0uYnVmID0gKHU4ICopKCZ2YWxbal0pOwotCQlidWxrX3JlZ1tpXS5ieXRlcyA9IDQ7Ci0JCWJ1bGtfcmVnW2krMV0ucmVnID0gc3dyX3dyX2FkZHJfYmFzZTsKLQkJYnVsa19yZWdbaSsxXS5idWYgPSAodTggKikoJnJlZ1tqXSk7Ci0JCWJ1bGtfcmVnW2krMV0uYnl0ZXMgPSA0OwotCX0KLQltdXRleF9sb2NrKCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOwotCi0JaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfSTJDKSB7Ci0JCXJldCA9IHRhc2hhX3N3cm1faTJzX2J1bGtfd3JpdGUod2NkOXh4eCwgYnVsa19yZWcsIGxlbik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBpMnMgYnVsayB3cml0ZSBmYWlsZWQsIHJldDogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywKLQkJCQkgKGxlbiAqIDIpLCBmYWxzZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBzd3JtIGJ1bGsgd3JpdGUgZmFpbGVkLCByZXQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOwotCWtmcmVlKGJ1bGtfcmVnKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGFzaGFfc3dybV93cml0ZSh2b2lkICpoYW5kbGUsIGludCByZWcsIGludCB2YWwpCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCXVuc2lnbmVkIHNob3J0IHN3cl93cl9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc3dyX3dyX2RhdGFfYmFzZTsKLQlzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsIGJ1bGtfcmVnWzJdOwotCWludCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKiloYW5kbGU7Ci0Jd2NkOXh4eCA9IHRhc2hhLT53Y2Q5eHh4OwotCi0Jc3dyX3dyX2FkZHJfYmFzZSA9IFdDRDkzMzVfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wOwotCXN3cl93cl9kYXRhX2Jhc2UgPSBXQ0Q5MzM1X1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMDsKLQotCS8qIEZpcnN0IFdyaXRlIHRoZSBEYXRhIHRvIHJlZ2lzdGVyICovCi0JYnVsa19yZWdbMF0ucmVnID0gc3dyX3dyX2RhdGFfYmFzZTsKLQlidWxrX3JlZ1swXS5idWYgPSAodTggKikoJnZhbCk7Ci0JYnVsa19yZWdbMF0uYnl0ZXMgPSA0OwotCWJ1bGtfcmVnWzFdLnJlZyA9IHN3cl93cl9hZGRyX2Jhc2U7Ci0JYnVsa19yZWdbMV0uYnVmID0gKHU4ICopKCZyZWcpOwotCWJ1bGtfcmVnWzFdLmJ5dGVzID0gNDsKLQotCW11dGV4X2xvY2soJnRhc2hhLT5zd3Jfd3JpdGVfbG9jayk7Ci0KLQlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKLQkJcmV0ID0gdGFzaGFfc3dybV9pMnNfYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywgMSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIodGFzaGEtPmRldiwgIiVzOiBpMnMgc3dybSB3cml0ZSBmYWlsZWQsIHJldDogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSB3Y2Q5eHh4X3NsaW1fYnVsa193cml0ZSh3Y2Q5eHh4LCBidWxrX3JlZywgMiwgZmFsc2UpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IFdSIERhdGEgRmFpbHVyZVxuIiwgX19mdW5jX18pOwotCX0KLQotCW11dGV4X3VubG9jaygmdGFzaGEtPnN3cl93cml0ZV9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3N3cm1fY2xvY2sodm9pZCAqaGFuZGxlLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGEgPSAoc3RydWN0IHRhc2hhX3ByaXYgKikgaGFuZGxlOwotCi0JbXV0ZXhfbG9jaygmdGFzaGEtPnN3cl9jbGtfbG9jayk7Ci0KLQlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogc3dybSBjbG9jayAlc1xuIiwKLQkJX19mdW5jX18sIChlbmFibGU/ImVuYWJsZSIgOiAiZGlzYWJsZSIpKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCXRhc2hhLT5zd3JfY2xrX3VzZXJzKys7Ci0JCWlmICh0YXNoYS0+c3dyX2Nsa191c2VycyA9PSAxKSB7Ci0JCQlpZiAoVEFTSEFfSVNfMl8wKHRhc2hhLT53Y2Q5eHh4KSkKLQkJCQlyZWdtYXBfdXBkYXRlX2JpdHMoCi0JCQkJCXRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJCVdDRDkzMzVfVEVTVF9ERUJVR19OUExfRExZX1RFU1RfMSwKLQkJCQkJMHgxMCwgMHgwMCk7Ci0JCQlfX3Rhc2hhX2NkY19tY2xrX2VuYWJsZSh0YXNoYSwgdHJ1ZSk7Ci0JCQlyZWdtYXBfdXBkYXRlX2JpdHModGFzaGEtPndjZDl4eHgtPnJlZ21hcCwKLQkJCQlXQ0Q5MzM1X0NEQ19DTEtfUlNUX0NUUkxfU1dSX0NPTlRST0wsCi0JCQkJMHgwMSwgMHgwMSk7Ci0JCX0KLQl9IGVsc2UgewotCQl0YXNoYS0+c3dyX2Nsa191c2Vycy0tOwotCQlpZiAodGFzaGEtPnN3cl9jbGtfdXNlcnMgPT0gMCkgewotCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJV0NEOTMzNV9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MLAotCQkJCTB4MDEsIDB4MDApOwotCQkJX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGZhbHNlKTsKLQkJCWlmIChUQVNIQV9JU18yXzAodGFzaGEtPndjZDl4eHgpKQotCQkJCXJlZ21hcF91cGRhdGVfYml0cygKLQkJCQkJdGFzaGEtPndjZDl4eHgtPnJlZ21hcCwKLQkJCQkJV0NEOTMzNV9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xLAotCQkJCQkweDEwLCAweDEwKTsKLQkJfQotCX0KLQlkZXZfZGJnKHRhc2hhLT5kZXYsICIlczogc3dybSBjbG9jayB1c2VycyAlZFxuIiwKLQkJX19mdW5jX18sIHRhc2hhLT5zd3JfY2xrX3VzZXJzKTsKLQltdXRleF91bmxvY2soJnRhc2hhLT5zd3JfY2xrX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhc2hhX3N3cm1faGFuZGxlX2lycSh2b2lkICpoYW5kbGUsCi0JCQkJICAgaXJxcmV0dXJuX3QgKCpzd3JtX2lycV9oYW5kbGVyKShpbnQgaXJxLAotCQkJCQkJCQkgICB2b2lkICpkYXRhKSwKLQkJCQkgICAgdm9pZCAqc3dybV9oYW5kbGUsCi0JCQkJICAgIGludCBhY3Rpb24pCi17Ci0Jc3RydWN0IHRhc2hhX3ByaXYgKnRhc2hhOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogbnVsbCBoYW5kbGUgcmVjZWl2ZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRhc2hhID0gKHN0cnVjdCB0YXNoYV9wcml2ICopIGhhbmRsZTsKLQl3Y2Q5eHh4ID0gdGFzaGEtPndjZDl4eHg7Ci0KLQlpZiAoYWN0aW9uKSB7Ci0JCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoJndjZDl4eHgtPmNvcmVfcmVzLAotCQkJCQkgIFdDRDkzMzVfSVJRX1NPVU5EV0lSRSwKLQkJCQkJICBzd3JtX2lycV9oYW5kbGVyLAotCQkJCQkgICJUYXNoYSBTV1IgTWFzdGVyIiwgc3dybV9oYW5kbGUpOwotCQlpZiAocmV0KQotCQkJZGV2X2Vycih0YXNoYS0+ZGV2LCAiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGlycSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgV0NEOTMzNV9JUlFfU09VTkRXSVJFKTsKLQl9IGVsc2UKLQkJd2NkOXh4eF9mcmVlX2lycSgmd2NkOXh4eC0+Y29yZV9yZXMsIFdDRDkzMzVfSVJRX1NPVU5EV0lSRSwKLQkJCQkgc3dybV9oYW5kbGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdGFzaGFfYWRkX2NoaWxkX2RldmljZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYTsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQlzdHJ1Y3QgdGFzaGFfc3dyX2N0cmxfZGF0YSAqc3dyX2N0cmxfZGF0YSA9IE5VTEwsICp0ZW1wOwotCWludCByZXQsIGN0cmxfbnVtID0gMDsKLQlzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhOwotCWNoYXIgcGxhdF9kZXZfbmFtZVtXQ0Q5MzM1X1NUUklOR19MRU5dOwotCi0JdGFzaGEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhc2hhX3ByaXYsCi0JCQkgICAgIHRhc2hhX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCWlmICghdGFzaGEpIHsKLQkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5MzM1IGRvZXMgbm90IGV4aXN0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCXdjZDl4eHggPSB0YXNoYS0+d2NkOXh4eDsKLQlpZiAoIXdjZDl4eHgpIHsKLQkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5WFhYIGRvZXMgbm90IGV4aXN0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCWlmICghd2NkOXh4eC0+ZGV2LT5vZl9ub2RlKSB7Ci0JCXByX2VycigiJXM6IERUIG5vZGUgZm9yIHdjZDl4eHggZG9lcyBub3QgZXhpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwbGF0ZGF0YSA9ICZ0YXNoYS0+c3dyX3BsYXRfZGF0YTsKLQotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUod2NkOXh4eC0+ZGV2LT5vZl9ub2RlLCBub2RlKSB7Ci0JCWlmICghc3RyY21wKG5vZGUtPm5hbWUsICJzd3JfbWFzdGVyIikpCi0JCQlzdHJsY3B5KHBsYXRfZGV2X25hbWUsICJ0YXNoYV9zd3JfY3RybCIsCi0JCQkJKFdDRDkzMzVfU1RSSU5HX0xFTiAtIDEpKTsKLQkJZWxzZSBpZiAoc3RybnN0cihub2RlLT5uYW1lLCAibXNtX2NkY19waW5jdHJsIiwKLQkJCQkgc3RybGVuKCJtc21fY2RjX3BpbmN0cmwiKSkgIT0gTlVMTCkKLQkJCXN0cmxjcHkocGxhdF9kZXZfbmFtZSwgbm9kZS0+bmFtZSwKLQkJCQkoV0NEOTMzNV9TVFJJTkdfTEVOIC0gMSkpOwotCQllbHNlCi0JCQljb250aW51ZTsKLQotCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHBsYXRfZGV2X25hbWUsIC0xKTsKLQkJaWYgKCFwZGV2KSB7Ci0JCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIiVzOiBwZGV2IG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXBkZXYtPmRldi5wYXJlbnQgPSB0YXNoYS0+ZGV2OwotCQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5vZGU7Ci0KLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSkgewotCQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsIHBsYXRkYXRhLAotCQkJCQkJICAgICAgIHNpemVvZigqcGxhdGRhdGEpKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJCSIlczogY2Fubm90IGFkZCBwbGF0IGRhdGEgY3RybDolZFxuIiwKLQkJCQkJX19mdW5jX18sIGN0cmxfbnVtKTsKLQkJCQlnb3RvIGZhaWxfcGRldl9hZGQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBDYW5ub3QgYWRkIHBsYXRmb3JtIGRldmljZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfcGRldl9hZGQ7Ci0JCX0KLQotCQlpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpKSB7Ci0JCQl0ZW1wID0ga3JlYWxsb2Moc3dyX2N0cmxfZGF0YSwKLQkJCQkJKGN0cmxfbnVtICsgMSkgKiBzaXplb2YoCi0JCQkJCXN0cnVjdCB0YXNoYV9zd3JfY3RybF9kYXRhKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXRlbXApIHsKLQkJCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwotCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQlzd3JfY3RybF9kYXRhID0gdGVtcDsKLQkJCXN3cl9jdHJsX2RhdGFbY3RybF9udW1dLnN3cl9wZGV2ID0gcGRldjsKLQkJCWN0cmxfbnVtKys7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBBZGRlZCBzb3VuZHdpcmUgY3RybCBkZXZpY2UocylcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJdGFzaGEtPm5yID0gY3RybF9udW07Ci0JCQl0YXNoYS0+c3dyX2N0cmxfZGF0YSA9IHN3cl9jdHJsX2RhdGE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci1mYWlsX3BkZXZfYWRkOgotCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7Ci1lcnI6Ci0JcmV0dXJuOwotfQotCi0vKgotICogdGFzaGFfY29kZWNfdmVyOiB0byBnZXQgdGFzaGEgY29kZWMgdmVyc2lvbgotICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCi0gKiByZXR1cm4gZW51bSBjb2RlY192YXJpYW50IC0gdmVyc2lvbgotICovCi1lbnVtIGNvZGVjX3ZhcmlhbnQgdGFzaGFfY29kZWNfdmVyKHZvaWQpCi17Ci0JcmV0dXJuIGNvZGVjX3ZlcjsKLX0KLUVYUE9SVF9TWU1CT0wodGFzaGFfY29kZWNfdmVyKTsKLQotc3RhdGljIGludCBfX3Rhc2hhX2VuYWJsZV9lZnVzZV9zZW5zaW5nKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKLXsKLQlpbnQgdmFsLCByYzsKLQotCV9fdGFzaGFfY2RjX21jbGtfZW5hYmxlKHRhc2hhLCB0cnVlKTsKLQotCXJlZ21hcF91cGRhdGVfYml0cyh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsIDB4MUUsIDB4MjApOwotCXJlZ21hcF91cGRhdGVfYml0cyh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9DVEwsIDB4MDEsIDB4MDEpOwotCi0JLyoKLQkgKiA1bXMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZW5hYmxpbmcgZWZ1c2UgY29udHJvbAotCSAqIGJlZm9yZSBjaGVja2luZyB0aGUgc3RhdHVzLgotCSAqLwotCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQlyYyA9IHJlZ21hcF9yZWFkKHRhc2hhLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgV0NEOTMzNV9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMsICZ2YWwpOwotCi0JaWYgKHJjIHx8ICghKHZhbCAmIDB4MDEpKSkKLQkJV0FSTigxLCAiJXM6IEVmdXNlIHNlbnNlIGlzIG5vdCBjb21wbGV0ZVxuIiwgX19mdW5jX18pOwotCi0JX190YXNoYV9jZGNfbWNsa19lbmFibGUodGFzaGEsIGZhbHNlKTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCB0YXNoYV9nZXRfY29kZWNfdmVyKHN0cnVjdCB0YXNoYV9wcml2ICp0YXNoYSkKLXsKLQlpbnQgaTsKLQlpbnQgdmFsOwotCXN0cnVjdCB0YXNoYV9yZWdfbWFza192YWwgY29kZWNfcmVnW10gPSB7Ci0JCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMCwgMHhGRiwgMHhGRn0sCi0JCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMSwgMHhGRiwgMHg4M30sCi0JCXtXQ0Q5MzM1X0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxMiwgMHhGRiwgMHgwQX0sCi0JfTsKLQotCV9fdGFzaGFfZW5hYmxlX2VmdXNlX3NlbnNpbmcodGFzaGEpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVjX3JlZyk7IGkrKykgewotCQlyZWdtYXBfcmVhZCh0YXNoYS0+d2NkOXh4eC0+cmVnbWFwLCBjb2RlY19yZWdbaV0ucmVnLCAmdmFsKTsKLQkJaWYgKCEodmFsICYmIGNvZGVjX3JlZ1tpXS52YWwpKSB7Ci0JCQljb2RlY192ZXIgPSBXQ0Q5MzM1OwotCQkJZ290byByZXQ7Ci0JCX0KLQl9Ci0JY29kZWNfdmVyID0gV0NEOTMyNjsKLXJldDoKLQlwcl9kZWJ1ZygiJXM6IGNvZGVjIGlzICVkXG4iLCBfX2Z1bmNfXywgY29kZWNfdmVyKTsKLX0KLUVYUE9SVF9TWU1CT0wodGFzaGFfZ2V0X2NvZGVjX3Zlcik7Ci0KLXN0YXRpYyBpbnQgdGFzaGFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0Jc3RydWN0IGNsayAqd2NkX2V4dF9jbGssICp3Y2RfbmF0aXZlX2NsazsKLQlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncjsKLQlzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24gKmNkY19wd3I7Ci0KLQlpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpIHsKLQkJaWYgKGFwcl9nZXRfc3Vic3lzX3N0YXRlKCkgPT0gQVBSX1NVQlNZU19ET1dOKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZHNwIGRvd25cbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRVBST0JFX0RFRkVSOwotCQl9Ci0JfQotCi0JdGFzaGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB0YXNoYV9wcml2KSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXRhc2hhKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0YXNoYSk7Ci0KLQl0YXNoYS0+d2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQl0YXNoYS0+ZGV2ID0gJnBkZXYtPmRldjsKLQlJTklUX0RFTEFZRURfV09SSygmdGFzaGEtPnBvd2VyX2dhdGVfd29yaywgdGFzaGFfY29kZWNfcG93ZXJfZ2F0ZV93b3JrKTsKLQltdXRleF9pbml0KCZ0YXNoYS0+cG93ZXJfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmdGFzaGEtPnNpZG9fbG9jayk7Ci0JSU5JVF9XT1JLKCZ0YXNoYS0+dGFzaGFfYWRkX2NoaWxkX2RldmljZXNfd29yaywKLQkJICB0YXNoYV9hZGRfY2hpbGRfZGV2aWNlcyk7Ci0JQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZ0YXNoYS0+bm90aWZpZXIpOwotCW11dGV4X2luaXQoJnRhc2hhLT5taWNiX2xvY2spOwotCW11dGV4X2luaXQoJnRhc2hhLT5zd3JfcmVhZF9sb2NrKTsKLQltdXRleF9pbml0KCZ0YXNoYS0+c3dyX3dyaXRlX2xvY2spOwotCW11dGV4X2luaXQoJnRhc2hhLT5zd3JfY2xrX2xvY2spOwotCW11dGV4X2luaXQoJnRhc2hhLT5zYl9jbGtfZ2Vhcl9sb2NrKTsKLQltdXRleF9pbml0KCZ0YXNoYS0+bWNsa19sb2NrKTsKLQotCWNkY19wd3IgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X3Bvd2VyX3JlZ2lvbiksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZGNfcHdyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2NkY19wd3I7Ci0JfQotCXRhc2hhLT53Y2Q5eHh4LT53Y2Q5eHh4X3B3cltXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xXSA9IGNkY19wd3I7Ci0JY2RjX3B3ci0+cHdyX2NvbGxhcHNlX3JlZ19taW4gPSBUQVNIQV9ESUdfQ09SRV9SRUdfTUlOOwotCWNkY19wd3ItPnB3cl9jb2xsYXBzZV9yZWdfbWF4ID0gVEFTSEFfRElHX0NPUkVfUkVHX01BWDsKLQl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXNoYS0+d2NkOXh4eCwKLQkJCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKLQotCW11dGV4X2luaXQoJnRhc2hhLT5jb2RlY19tdXRleCk7Ci0JLyoKLQkgKiBJbml0IHJlc291cmNlIG1hbmFnZXIgc28gdGhhdCBpZiBjaGlsZCBub2RlcyBzdWNoIGFzIFNvdW5kV2lyZQotCSAqIHJlcXVlc3RzIGZvciBjbG9jaywgcmVzb3VyY2UgbWFuYWdlciBjYW4gaG9ub3IgdGhlIHJlcXVlc3QKLQkgKi8KLQlyZXNtZ3IgPSB3Y2RfcmVzbWdyX2luaXQoJnRhc2hhLT53Y2Q5eHh4LT5jb3JlX3JlcywgTlVMTCk7Ci0JaWYgKElTX0VSUihyZXNtZ3IpKSB7Ci0JCXJldCA9IFBUUl9FUlIocmVzbWdyKTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIHdjZCByZXNtZ3JcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3Jlc21ncjsKLQl9Ci0JdGFzaGEtPnJlc21nciA9IHJlc21ncjsKLQl0YXNoYS0+c3dyX3BsYXRfZGF0YS5oYW5kbGUgPSAodm9pZCAqKSB0YXNoYTsKLQl0YXNoYS0+c3dyX3BsYXRfZGF0YS5yZWFkID0gdGFzaGFfc3dybV9yZWFkOwotCXRhc2hhLT5zd3JfcGxhdF9kYXRhLndyaXRlID0gdGFzaGFfc3dybV93cml0ZTsKLQl0YXNoYS0+c3dyX3BsYXRfZGF0YS5idWxrX3dyaXRlID0gdGFzaGFfc3dybV9idWxrX3dyaXRlOwotCXRhc2hhLT5zd3JfcGxhdF9kYXRhLmNsayA9IHRhc2hhX3N3cm1fY2xvY2s7Ci0JdGFzaGEtPnN3cl9wbGF0X2RhdGEuaGFuZGxlX2lycSA9IHRhc2hhX3N3cm1faGFuZGxlX2lycTsKLQotCS8qIFJlZ2lzdGVyIGZvciBDbG9jayAqLwotCXdjZF9leHRfY2xrID0gY2xrX2dldCh0YXNoYS0+d2NkOXh4eC0+ZGV2LCAid2NkX2NsayIpOwotCWlmIChJU19FUlIod2NkX2V4dF9jbGspKSB7Ci0JCWRldl9lcnIodGFzaGEtPndjZDl4eHgtPmRldiwgIiVzOiBjbGsgZ2V0ICVzIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCAid2NkX2V4dF9jbGsiKTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQl0YXNoYS0+d2NkX2V4dF9jbGsgPSB3Y2RfZXh0X2NsazsKLQl0YXNoYS0+c2lkb192b2x0YWdlID0gU0lET19WT0xUQUdFX05PTUlOQUxfTVY7Ci0Jc2V0X2JpdChBVURJT19OT01JTkFMLCAmdGFzaGEtPnN0YXR1c19tYXNrKTsKLQl0YXNoYS0+c2lkb19jY2xfY250ID0gMDsKLQotCS8qIFJlZ2lzdGVyIG5hdGl2ZSBjbGsgZm9yIDQ0LjEgcGxheWJhY2sgKi8KLQl3Y2RfbmF0aXZlX2NsayA9IGNsa19nZXQodGFzaGEtPndjZDl4eHgtPmRldiwgIndjZF9uYXRpdmVfY2xrIik7Ci0JaWYgKElTX0VSUih3Y2RfbmF0aXZlX2NsaykpCi0JCWRldl9kYmcodGFzaGEtPndjZDl4eHgtPmRldiwgIiVzOiBjbGsgZ2V0ICVzIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCAid2NkX25hdGl2ZV9jbGsiKTsKLQllbHNlCi0JCXRhc2hhLT53Y2RfbmF0aXZlX2NsayA9IHdjZF9uYXRpdmVfY2xrOwotCi0JaWYgKHdjZDl4eHhfZ2V0X2ludGZfdHlwZSgpID09IFdDRDlYWFhfSU5URVJGQUNFX1RZUEVfU0xJTUJVUykKLQkJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl90YXNoYSwKLQkJCQkJICAgICB0YXNoYV9kYWksIEFSUkFZX1NJWkUodGFzaGFfZGFpKSk7Ci0JZWxzZSBpZiAod2NkOXh4eF9nZXRfaW50Zl90eXBlKCkgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9JMkMpCi0JCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldiwgJnNvY19jb2RlY19kZXZfdGFzaGEsCi0JCQkJCSAgICAgdGFzaGFfaTJzX2RhaSwKLQkJCQkJICAgICBBUlJBWV9TSVpFKHRhc2hhX2kyc19kYWkpKTsKLQllbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ29kZWMgcmVnaXN0cmF0aW9uIGZhaWxlZCwgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfY2RjX3JlZzsKLQl9Ci0JLyogVXBkYXRlIGNvZGVjIHJlZ2lzdGVyIGRlZmF1bHQgdmFsdWVzICovCi0JdGFzaGFfdXBkYXRlX3JlZ19kZWZhdWx0cyh0YXNoYSk7Ci0Jc2NoZWR1bGVfd29yaygmdGFzaGEtPnRhc2hhX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCXRhc2hhX2dldF9jb2RlY192ZXIodGFzaGEpOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBUYXNoYSBkcml2ZXIgcHJvYmUgZG9uZVxuIiwgX19mdW5jX18pOwotCXJldHVybiByZXQ7Ci0KLWVycl9jZGNfcmVnOgotCWNsa19wdXQodGFzaGEtPndjZF9leHRfY2xrKTsKLQlpZiAodGFzaGEtPndjZF9uYXRpdmVfY2xrKQotCQljbGtfcHV0KHRhc2hhLT53Y2RfbmF0aXZlX2Nsayk7Ci1lcnJfY2xrOgotCXdjZF9yZXNtZ3JfcmVtb3ZlKHRhc2hhLT5yZXNtZ3IpOwotZXJyX3Jlc21ncjoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGNkY19wd3IpOwotZXJyX2NkY19wd3I6Ci0JbXV0ZXhfZGVzdHJveSgmdGFzaGEtPm1jbGtfbG9jayk7Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCB0YXNoYSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXNoYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGFzaGFfcHJpdiAqdGFzaGE7Ci0KLQl0YXNoYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JbXV0ZXhfZGVzdHJveSgmdGFzaGEtPmNvZGVjX211dGV4KTsKLQljbGtfcHV0KHRhc2hhLT53Y2RfZXh0X2Nsayk7Ci0JaWYgKHRhc2hhLT53Y2RfbmF0aXZlX2NsaykKLQkJY2xrX3B1dCh0YXNoYS0+d2NkX25hdGl2ZV9jbGspOwotCW11dGV4X2Rlc3Ryb3koJnRhc2hhLT5tY2xrX2xvY2spOwotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgdGFzaGEpOwotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKLQltdXRleF9kZXN0cm95KCZ0YXNoYS0+c2JfY2xrX2dlYXJfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRhc2hhX2NvZGVjX2RyaXZlciA9IHsKLQkucHJvYmUgPSB0YXNoYV9wcm9iZSwKLQkucmVtb3ZlID0gdGFzaGFfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0jaWZkZWYgQ09ORklHX1BNCi0JCS5wbSA9ICZ0YXNoYV9wbV9vcHMsCi0jZW5kaWYKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0YXNoYV9jb2RlY19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlRhc2hhIENvZGVjIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzM1LmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2NDYxZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzMzUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgV0NEOTMzNV9ICi0jZGVmaW5lIFdDRDkzMzVfSAotCi0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvamFjay5oPgotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtc2xpbXNsYXZlLmg+Ci0jaW5jbHVkZSAid2NkLW1iaGMtdjIuaCIKLQotI2RlZmluZSBUQVNIQV9SRUdfVkFMKHJlZywgdmFsKSAgICAgIHtyZWcsIDAsIHZhbH0KLQotI2RlZmluZSBUQVNIQV9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgIDB4ODAwCi0jZGVmaW5lIFRBU0hBX1NCX1BHRF9QT1JUX1JYX0JBU0UgICAweDQwCi0jZGVmaW5lIFRBU0hBX1NCX1BHRF9QT1JUX1RYX0JBU0UgICAweDUwCi0KLSNkZWZpbmUgVEFTSEFfWkRFVF9TVVBQT1JURUQgdHJ1ZQotLyogeiB2YWx1ZSBkZWZpbmVkIGluIG1pbGxpb2htICovCi0jZGVmaW5lIFRBU0hBX1pERVRfVkFMXzMyCTMyMDAwCi0jZGVmaW5lIFRBU0hBX1pERVRfVkFMXzQwMAk0MDAwMDAKLSNkZWZpbmUgVEFTSEFfWkRFVF9WQUxfMTIwMAkxMjAwMDAwCi0jZGVmaW5lIFRBU0hBX1pERVRfVkFMXzEwMEsJMTAwMDAwMDAwCi0vKiB6IGZsb2F0aW5nIGRlZmluZWQgaW4gb2htcyAqLwotI2RlZmluZSBUQVNIQV9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSAweDBGRkZGRkZFCi0KLSNkZWZpbmUgV0NEOTMzNV9ETUlDX0NMS19ESVZfMiAgMHgwCi0jZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRElWXzMgIDB4MQotI2RlZmluZSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl80ICAweDIKLSNkZWZpbmUgV0NEOTMzNV9ETUlDX0NMS19ESVZfNiAgMHgzCi0jZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRElWXzggIDB4NAotI2RlZmluZSBXQ0Q5MzM1X0RNSUNfQ0xLX0RJVl8xNiAgMHg1Ci0jZGVmaW5lIFdDRDkzMzVfRE1JQ19DTEtfRFJJVkVfREVGQVVMVCAweDAyCi0KLSNkZWZpbmUgV0NEOTMzNV9BTkNfRE1JQ19YMl9GVUxMX1JBVEUgMQotI2RlZmluZSBXQ0Q5MzM1X0FOQ19ETUlDX1gyX0hBTEZfUkFURSAwCi0KLS8qIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IFNsaW1idXMgcG9ydCAqLwotZW51bSB7Ci0JVEFTSEFfUlgwID0gMCwKLQlUQVNIQV9SWDEsCi0JVEFTSEFfUlgyLAotCVRBU0hBX1JYMywKLQlUQVNIQV9SWDQsCi0JVEFTSEFfUlg1LAotCVRBU0hBX1JYNiwKLQlUQVNIQV9SWDcsCi0JVEFTSEFfUlg4LAotCVRBU0hBX1JYOSwKLQlUQVNIQV9SWDEwLAotCVRBU0hBX1JYMTEsCi0JVEFTSEFfUlgxMiwKLQlUQVNIQV9SWF9NQVgsCi19OwotCi1lbnVtIHsKLQlUQVNIQV9UWDAgPSAwLAotCVRBU0hBX1RYMSwKLQlUQVNIQV9UWDIsCi0JVEFTSEFfVFgzLAotCVRBU0hBX1RYNCwKLQlUQVNIQV9UWDUsCi0JVEFTSEFfVFg2LAotCVRBU0hBX1RYNywKLQlUQVNIQV9UWDgsCi0JVEFTSEFfVFg5LAotCVRBU0hBX1RYMTAsCi0JVEFTSEFfVFgxMSwKLQlUQVNIQV9UWDEyLAotCVRBU0hBX1RYMTMsCi0JVEFTSEFfVFgxNCwKLQlUQVNIQV9UWDE1LAotCVRBU0hBX1RYX01BWCwKLX07Ci0KLWVudW0gd2NkOTMzNV9jb2RlY19ldmVudCB7Ci0JV0NEOTMzNV9DT0RFQ19FVkVOVF9DT0RFQ19VUCA9IDAsCi19OwotCi1lbnVtIHRhc2hhX29uX2RlbWFuZF9zdXBwbHkgewotCU9OX0RFTUFORF9NSUNCSUFTID0gMCwKLQlPTl9ERU1BTkRfU1VQUExJRVNfTUFYLAotfTsKLQotLyogc3RydWN0dXJlIHVzZWQgdG8gcHV0IHRoZSBkZWZpbmVkCi0gKiBvbmRlbWFuZCBzdXBwbHkgZm9yIGNvZGVjCi0gKiBhbmQgY291bnQgYmVpbmcgdXNlZC4KLSAqLwotc3RydWN0IG9uX2RlbWFuZF9zdXBwbHkgewotCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsKLQlpbnQgb25kZW1hbmRfc3VwcGx5X2NvdW50OwotfTsKLQotLyogRGFpIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZQotICogZGFpIHNwZWNpZmljIGluZm8gbGlrZSByYXRlLAotICogY2hhbm5lbCBudW1iZXIgZXRjLgotICovCi1zdHJ1Y3QgdGFzaGFfY29kZWNfZGFpX2RhdGEgewotCXUzMiByYXRlOwotCXUzMiAqY2hfbnVtOwotCXUzMiBjaF9hY3Q7Ci0JdTMyIGNoX3RvdDsKLX07Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIHVwZGF0ZSBjb2RlYwotICogcmVnaXN0ZXIgZGVmYXVsdHMgYWZ0ZXIgcmVzZXQKLSAqLwotc3RydWN0IHRhc2hhX3JlZ19tYXNrX3ZhbCB7Ci0JdTE2IHJlZzsKLQl1OCBtYXNrOwotCXU4IHZhbDsKLX07Ci0KLS8qIFNlbGVjdHMgY29tcGFuZGVyIGFuZCBzbWFydCBib29zdCBzZXR0aW5ncwotICogZm9yIGEgZ2l2ZW4gc3BlYWtlciBtb2RlCi0gKi8KLWVudW0gewotCVNQS1JfTU9ERV9ERUZBVUxULAotCVNQS1JfTU9ERV8xLCAgICAgICAgICAvKiBDT01QIEdhaW4gPSAxMmRCLCBTbWFydGJvb3N0IE1heCA9IDUuNVYgKi8KLX07Ci0KLS8qCi0gKiBSeCBwYXRoIGdhaW4gb2Zmc2V0cwotICovCi1lbnVtIHsKLQlSWF9HQUlOX09GRlNFVF9NMVA1X0RCLAotCVJYX0dBSU5fT0ZGU0VUXzBfREIsCi19OwotCi1leHRlcm4gdm9pZCAqdGFzaGFfZ2V0X2FmZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOwotZXh0ZXJuIGludCB0YXNoYV9jZGNfbWNsa19lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLAotCQkJCSBib29sIGRhcG0pOwotZXh0ZXJuIGludCB0YXNoYV9jZGNfbWNsa190eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLAotCQkJCSAgICBib29sIGRhcG0pOwotZXh0ZXJuIGludCB0YXNoYV9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIGludCB0YXNoYV9tYmhjX2hzX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqbWJoY19jZmcpOwotZXh0ZXJuIHZvaWQgdGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIHZvaWQgdGFzaGFfbWJoY196ZGV0X2dwaW9fY3RybCgKLQkJaW50ICgqemRldF9ncGlvX2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgaGlnaCksCi0JCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci1leHRlcm4gaW50IHRhc2hhX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KAotCQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3QsCi0JCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci1leHRlcm4gdm9pZCB0YXNoYV9ldmVudF9yZWdpc3RlcigKLQlpbnQgKCptYWNoaW5lX2V2ZW50X2NiKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJZW51bSB3Y2Q5MzM1X2NvZGVjX2V2ZW50KSwKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIGludCB0YXNoYV9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJCSBpbnQgbWljYl9udW0sCi0JCQkJCQkgYm9vbCBlbmFibGUpOwotZXh0ZXJuIGludCB0YXNoYV9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpOwotZXh0ZXJuIGludCB0YXNoYV9zZXRfc3Brcl9nYWluX29mZnNldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBvZmZzZXQpOwotZXh0ZXJuIGVudW0gY29kZWNfdmFyaWFudCB0YXNoYV9jb2RlY192ZXIodm9pZCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3ODFmNi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHdjZDkzNHggY29kZWMgZHJpdmVyLgotIwotc25kLXNvYy13Y2Q5MzR4LW9ianMgOj0gd2NkOTM0eC5vIHdjZDkzNHgtZHNwLWNudGwubyBcCi0JCQl3Y2Q5MzR4LW1iaGMubyB3Y2Q5MzR4LWRzZC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19XQ0Q5MzRYKSArPSBzbmQtc29jLXdjZDkzNHgubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNkLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyM2UzNy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc2QuYworKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxzb3VuZC90bHYuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSAid2NkOTM0eC1kc2QuaCIKLQotI2RlZmluZSBEU0RfVk9MVU1FX01BWF8wZEIgICAgICAwCi0jZGVmaW5lIERTRF9WT0xVTUVfTUlOX00xMTBkQiAgIC0xMTAKLQotI2RlZmluZSBEU0RfVk9MVU1FX1JBTkdFX0NIRUNLKHgpICAgKCh4ID49IERTRF9WT0xVTUVfTUlOX00xMTBkQikgJiZcCi0JCQkJICAgICAoeCA8PSBEU0RfVk9MVU1FX01BWF8wZEIpKQotI2RlZmluZSBEU0RfVk9MVU1FX1NURVBTICAgICAgICAgICAgMwotI2RlZmluZSBEU0RfVk9MVU1FX1VQREFURV9ERUxBWV9NUyAgMzAKLSNkZWZpbmUgRFNEX1ZPTFVNRV9VU0xFRVBfTUFSR0lOX1VTIDEwMAotI2RlZmluZSBEU0RfVk9MVU1FX1NURVBfREVMQVlfVVMgICAgKCgxMDAwICogRFNEX1ZPTFVNRV9VUERBVEVfREVMQVlfTVMpIC8gXAotCQkJCSAgICAgKDIgKiBEU0RfVk9MVU1FX1NURVBTKSkKLQotI2RlZmluZSBUQVZJTF9WRVJTSU9OXzFfMCAgMAotI2RlZmluZSBUQVZJTF9WRVJTSU9OXzFfMSAgMQotCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTUlOTUFYKHRhdmlsX2RzZF9kYl9zY2FsZSwgRFNEX1ZPTFVNRV9NSU5fTTExMGRCLAotCQkJCSAgIERTRF9WT0xVTUVfTUFYXzBkQik7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkc2RfaWZfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwgIlJYNiIsICJSWDciLAotCSJEU0RfREFUQV9QQUQiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzZF9maWx0MF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkRTRF9MIElGIE1VWCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzZF9maWx0MV9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkRTRF9SIElGIE1VWCIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGRzZF9maWx0MF9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwsIDAsCi0JCQlBUlJBWV9TSVpFKGRzZF9maWx0MF9tdXhfdGV4dCksIGRzZF9maWx0MF9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gZHNkX2ZpbHQxX211eF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEUoV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwgMCwKLQkJCUFSUkFZX1NJWkUoZHNkX2ZpbHQxX211eF90ZXh0KSwgZHNkX2ZpbHQxX211eF90ZXh0KTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGRzZF9sX2lmX2VudW0sIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMCwKLQkJCSAgICAyLCBkc2RfaWZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woZHNkX3JfaWZfZW51bSwgV0NEOTM0WF9DRENfRFNEMV9DRkcwLAotCQkJICAgIDIsIGRzZF9pZl90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9maWx0MF9tdXggPQotCQlTT0NfREFQTV9FTlVNKCJEU0QgRmlsdDAgTXV4IiwgZHNkX2ZpbHQwX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9maWx0MV9tdXggPQotCQlTT0NfREFQTV9FTlVNKCJEU0QgRmlsdDEgTXV4IiwgZHNkX2ZpbHQxX211eF9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9sX2lmX211eCA9Ci0JCVNPQ19EQVBNX0VOVU0oIkRTRCBMZWZ0IElmIE11eCIsIGRzZF9sX2lmX2VudW0pOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRzZF9yX2lmX211eCA9Ci0JCVNPQ19EQVBNX0VOVU0oIkRTRCBSaWdodCBJZiBNdXgiLCBkc2Rfcl9pZl9lbnVtKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgdGF2aWxfZHNkX2F1ZGlvX21hcFtdID0gewotCXsiRFNEX0wgSUYgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiRFNEX0wgSUYgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCi0JeyJEU0RfRklMVEVSXzAiLCBOVUxMLCAiRFNEX0wgSUYgTVVYIn0sCi0JeyJEU0RfRklMVEVSXzAiLCBOVUxMLCAiUlggSU5UMSBOQVRJVkUgU1VQUExZIn0sCi0JeyJSWCBJTlQxIE1JWDMiLCAiRFNEIEhQSEwgU3dpdGNoIiwgIkRTRF9GSUxURVJfMCJ9LAotCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJEU0RfUiBJRiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0KLQl7IkRTRF9GSUxURVJfMSIsIE5VTEwsICJEU0RfUiBJRiBNVVgifSwKLQl7IkRTRF9GSUxURVJfMSIsIE5VTEwsICJSWCBJTlQyIE5BVElWRSBTVVBQTFkifSwKLQl7IlJYIElOVDIgTUlYMyIsICJEU0QgSFBIUiBTd2l0Y2giLCAiRFNEX0ZJTFRFUl8xIn0sCi0KLQl7IkRTRF9GSUxURVJfMCIsIE5VTEwsICJSWCBJTlQzIE5BVElWRSBTVVBQTFkifSwKLQl7IlJYIElOVDMgTUlYMyIsICJEU0QgTE8xIFN3aXRjaCIsICJEU0RfRklMVEVSXzAifSwKLQl7IkRTRF9GSUxURVJfMSIsIE5VTEwsICJSWCBJTlQ0IE5BVElWRSBTVVBQTFkifSwKLQl7IlJYIElOVDQgTUlYMyIsICJEU0QgTE8yIFN3aXRjaCIsICJEU0RfRklMVEVSXzEifSwKLX07Ci0KLXN0YXRpYyBib29sIGlzX3ZhbGlkX2RzZF9pbnRlcnBvbGF0b3IoaW50IGludGVycF9udW0pCi17Ci0JaWYgKChpbnRlcnBfbnVtID09IElOVEVSUF9IUEhMKSB8fCAoaW50ZXJwX251bSA9PSBJTlRFUlBfSFBIUikgfHwKLQkgICAgKGludGVycF9udW0gPT0gSU5URVJQX0xPMSkgfHwgKGludGVycF9udW0gPT0gSU5URVJQX0xPMikpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIHRhdmlsX2RzZF9zZXRfbWl4ZXJfdmFsdWUgLSBTZXQgRFNEIEhQSC9MTyBtaXhlciB2YWx1ZQotICoKLSAqIEBkc2RfY29uZjogcG9pbnRlciB0byBkc2QgY29uZmlnCi0gKiBAaW50ZXJwX251bTogSW50ZXJwb2xhdG9yIG51bWJlciAoSFBITC9SLCBMTzEvMikKLSAqIEBzd192YWx1ZTogTWl4ZXIgc3dpdGNoIHZhbHVlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBmYWlsdXJlCi0gKi8KLWludCB0YXZpbF9kc2Rfc2V0X21peGVyX3ZhbHVlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKLQkJCSAgICAgIGludCBpbnRlcnBfbnVtLCBpbnQgc3dfdmFsdWUpCi17Ci0JaWYgKCFkc2RfY29uZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWlzX3ZhbGlkX2RzZF9pbnRlcnBvbGF0b3IoaW50ZXJwX251bSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZHNkX2NvbmYtPmRzZF9pbnRlcnBfbWl4ZXJbaW50ZXJwX251bV0gPSAhIXN3X3ZhbHVlOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2RzZF9zZXRfbWl4ZXJfdmFsdWUpOwotCi0vKioKLSAqIHRhdmlsX2RzZF9nZXRfY3VycmVudF9taXhlcl92YWx1ZSAtIEdldCBEU0QgSFBIL0xPIG1peGVyIHZhbHVlCi0gKgotICogQGRzZF9jb25mOiBwb2ludGVyIHRvIGRzZCBjb25maWcKLSAqIEBpbnRlcnBfbnVtOiBJbnRlcnBvbGF0b3IgbnVtYmVyIChIUEhML1IsIExPMS8yKQotICoKLSAqIFJldHVybnMgY3VycmVudCBtaXhlciB2YWwgZm9yIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBmb3IgZmFpbHVyZQotICovCi1pbnQgdGF2aWxfZHNkX2dldF9jdXJyZW50X21peGVyX3ZhbHVlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKLQkJCQkgICAgICBpbnQgaW50ZXJwX251bSkKLXsKLQlpZiAoIWRzZF9jb25mKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghaXNfdmFsaWRfZHNkX2ludGVycG9sYXRvcihpbnRlcnBfbnVtKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZHNkX2NvbmYtPmRzZF9pbnRlcnBfbWl4ZXJbaW50ZXJwX251bV07Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2RzZF9nZXRfY3VycmVudF9taXhlcl92YWx1ZSk7Ci0KLS8qKgotICogdGF2aWxfZHNkX3NldF9vdXRfc2VsZWN0IC0gRFNEMC8xIG91dCBzZWxlY3QgdG8gSFBIIG9yIExPCi0gKgotICogQGRzZF9jb25mOiBwb2ludGVyIHRvIGRzZCBjb25maWcKLSAqIEBpbnRlcnBfbnVtOiBJbnRlcnBvbGF0b3IgbnVtYmVyIChIUEhML1IsIExPMS8yKQotICoKLSAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciAtRUlOVkFMIGZvciBmYWlsdXJlCi0gKi8KLWludCB0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3Qoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAotCQkJICAgICBpbnQgaW50ZXJwX251bSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnLCB2YWw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCi0JaWYgKCFkc2RfY29uZiB8fCAhZHNkX2NvbmYtPmNvZGVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNvZGVjID0gZHNkX2NvbmYtPmNvZGVjOwotCi0JaWYgKCFpc192YWxpZF9kc2RfaW50ZXJwb2xhdG9yKGludGVycF9udW0pKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEludGVycG9sYXRvcjogJWQgZm9yIERTRFxuIiwKLQkJCV9fZnVuY19fLCBpbnRlcnBfbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChpbnRlcnBfbnVtKSB7Ci0JY2FzZSBJTlRFUlBfSFBITDoKLQkJcmVnID0gV0NEOTM0WF9DRENfRFNEMF9DRkcwOwotCQl2YWwgPSAweDAwOwotCQlicmVhazsKLQljYXNlIElOVEVSUF9IUEhSOgotCQlyZWcgPSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzA7Ci0JCXZhbCA9IDB4MDA7Ci0JCWJyZWFrOwotCWNhc2UgSU5URVJQX0xPMToKLQkJcmVnID0gV0NEOTM0WF9DRENfRFNEMF9DRkcwOwotCQl2YWwgPSAweDAyOwotCQlicmVhazsKLQljYXNlIElOVEVSUF9MTzI6Ci0JCXJlZyA9IFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMDsKLQkJdmFsID0gMHgwMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDAyLCB2YWwpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2RzZF9zZXRfb3V0X3NlbGVjdCk7Ci0KLS8qKgotICogdGF2aWxfZHNkX3Jlc2V0IC0gUmVzZXQgRFNEIGJsb2NrCi0gKgotICogQGRzZF9jb25mOiBwb2ludGVyIHRvIGRzZCBjb25maWcKLSAqCi0gKi8KLXZvaWQgdGF2aWxfZHNkX3Jlc2V0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZikKLXsKLQlpZiAoIWRzZF9jb25mIHx8ICFkc2RfY29uZi0+Y29kZWMpCi0JCXJldHVybjsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoZHNkX2NvbmYtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMLAotCQkJICAgIDB4MDIsIDB4MDIpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoZHNkX2NvbmYtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMLAotCQkJICAgIDB4MDEsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoZHNkX2NvbmYtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMLAotCQkJICAgIDB4MDIsIDB4MDIpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoZHNkX2NvbmYtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMLAotCQkJICAgIDB4MDEsIDB4MDApOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2RfcmVzZXQpOwotCi0vKioKLSAqIHRhdmlsX2RzZF9zZXRfaW50ZXJwX3JhdGUgLSBTZXQgaW50ZXJwb2xhdG9yIHJhdGUgZm9yIERTRAotICoKLSAqIEBkc2RfY29uZjogcG9pbnRlciB0byBkc2QgY29uZmlnCi0gKiBAcnhfcG9ydDogUlggcG9ydCBudW1iZXIKLSAqIEBzYW1wbGVfcmF0ZTogU2FtcGxlIHJhdGUgb2YgdGhlIFJYIGludGVycG9sYXRvcgotICogQHNhbXBsZV9yYXRlX3ZhbDogSW50ZXJwb2xhdG9yIHJhdGUgdmFsdWUKLSAqLwotdm9pZCB0YXZpbF9kc2Rfc2V0X2ludGVycF9yYXRlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwgdTE2IHJ4X3BvcnQsCi0JCQkgICAgICAgdTMyIHNhbXBsZV9yYXRlLCB1OCBzYW1wbGVfcmF0ZV92YWwpCi17Ci0JdTggZHNkX2lucF9zZWw7Ci0JdTggZHNkMF9pbnAsIGRzZDFfaW5wOwotCXU4IHZhbDAsIHZhbDE7Ci0JdTggZHNkMF9vdXRfc2VsLCBkc2QxX291dF9zZWw7Ci0JdTE2IGludF9mc19yZWcsIGludGVycF9udW0gPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCWlmICghZHNkX2NvbmYgfHwgIWRzZF9jb25mLT5jb2RlYykKLQkJcmV0dXJuOwotCi0JY29kZWMgPSBkc2RfY29uZi0+Y29kZWM7Ci0KLQlkc2RfaW5wX3NlbCA9IERTRF9JTlBfU0VMX1JYMCArIHJ4X3BvcnQgLSBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSOwotCi0JdmFsMCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcwKTsKLQl2YWwxID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzApOwotCWRzZDBfaW5wID0gKHZhbDAgJiAweDNDKSA+PiAyOwotCWRzZDFfaW5wID0gKHZhbDEgJiAweDNDKSA+PiAyOwotCWRzZDBfb3V0X3NlbCA9ICh2YWwwICYgMHgwMikgPj4gMTsKLQlkc2QxX291dF9zZWwgPSAodmFsMSAmIDB4MDIpID4+IDE7Ci0KLQkvKiBTZXQgSFBITCBvciBMTzEgaW50ZXJwIHJhdGUgYmFzZWQgb24gb3V0IHNlbGVjdCAqLwotCWlmIChkc2RfaW5wX3NlbCA9PSBkc2QwX2lucCkgewotCQlpbnRlcnBfbnVtID0gZHNkMF9vdXRfc2VsID8gSU5URVJQX0xPMSA6IElOVEVSUF9IUEhMOwotCQlkc2RfY29uZi0+YmFzZV9zYW1wbGVfcmF0ZVtEU0QwXSA9IHNhbXBsZV9yYXRlOwotCX0KLQotCS8qIFNldCBIUEhSIG9yIExPMiBpbnRlcnAgcmF0ZSBiYXNlZCBvbiBvdXQgc2VsZWN0ICovCi0JaWYgKGRzZF9pbnBfc2VsID09IGRzZDFfaW5wKSB7Ci0JCWludGVycF9udW0gPSBkc2QxX291dF9zZWwgPyBJTlRFUlBfTE8yIDogSU5URVJQX0hQSFI7Ci0JCWRzZF9jb25mLT5iYXNlX3NhbXBsZV9yYXRlW0RTRDFdID0gc2FtcGxlX3JhdGU7Ci0JfQotCi0JaWYgKGludGVycF9udW0pIHsKLQkJaW50X2ZzX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCArIDIwICogaW50ZXJwX251bTsKLQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIGludF9mc19yZWcpICYgMHgwZikgPCAweDA5KSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogU2V0IEludGVycCAlZCB0byBzYW1wbGVfcmF0ZSB2YWwgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgaW50ZXJwX251bSwgc2FtcGxlX3JhdGVfdmFsKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludF9mc19yZWcsIDB4MEYsCi0JCQkJCSAgICBzYW1wbGVfcmF0ZV92YWwpOwotCQl9Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2Rfc2V0X2ludGVycF9yYXRlKTsKLQotc3RhdGljIGludCB0YXZpbF9zZXRfZHNkX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZHNkX251bSwKLQkJCSAgICAgIHU4ICpwY21fcmF0ZV92YWwpCi17Ci0JdW5zaWduZWQgaW50IGRzZF9vdXRfc2VsX3JlZzsKLQl1OCBkc2RfbW9kZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0Jc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWxfZ2V0X2RzZF9jb25maWcoY29kZWMpOwotCi0JaWYgKCFkc2RfY29uZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKGRzZF9udW0gPCAwKSB8fCAoZHNkX251bSA+IDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNhbXBsZV9yYXRlID0gZHNkX2NvbmYtPmJhc2Vfc2FtcGxlX3JhdGVbZHNkX251bV07Ci0JZHNkX291dF9zZWxfcmVnID0gV0NEOTM0WF9DRENfRFNEMF9DRkcwICsgZHNkX251bSAqIDE2OwotCi0Jc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotCWNhc2UgMTc2NDAwOgotCQlkc2RfbW9kZSA9IDA7IC8qIERTRF82NCAqLwotCQkqcGNtX3JhdGVfdmFsID0gMHhiOwotCQlicmVhazsKLQljYXNlIDM1MjgwMDoKLQkJZHNkX21vZGUgPSAxOyAvKiBEU0RfMTI4ICovCi0JCSpwY21fcmF0ZV92YWwgPSAweGM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERTRCByYXRlOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBzYW1wbGVfcmF0ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRzZF9vdXRfc2VsX3JlZywgMHgwMSwgZHNkX21vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX2RzZF9kYXRhX3B1bGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZHNkX251bSwKLQkJCQl1OCBwY21fcmF0ZV92YWwsIGJvb2wgZW5hYmxlKQotewotCXU4IGNsa19lbiwgbXV0ZV9lbjsKLQl1OCBkc2RfaW5wX3NlbDsKLQotCWlmIChlbmFibGUpIHsKLQkJY2xrX2VuID0gMHgyMDsKLQkJbXV0ZV9lbiA9IDB4MTA7Ci0JfSBlbHNlIHsKLQkJY2xrX2VuID0gMHgwMDsKLQkJbXV0ZV9lbiA9IDB4MDA7Ci0JfQotCi0JaWYgKGRzZF9udW0gJiAweDAxKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwsCi0JCQkJICAgIDB4MjAsIGNsa19lbik7Ci0JCWRzZF9pbnBfc2VsID0gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcwKSAmCi0JCQkJMHgzQykgPj4gMjsKLQkJZHNkX2lucF9zZWwgPSAoZW5hYmxlKSA/IGRzZF9pbnBfc2VsIDogMDsKLQkJaWYgKGRzZF9pbnBfc2VsIDwgOSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsCi0JCQkJCTB4MEYsIGRzZF9pbnBfc2VsKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEwsCi0JCQkJCTB4MEYsIHBjbV9yYXRlX3ZhbCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9NSVhfQ1RMLAotCQkJCQkweDEwLCBtdXRlX2VuKTsKLQkJfQotCX0KLQlpZiAoZHNkX251bSAmIDB4MDIpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkgICAgMHgyMCwgY2xrX2VuKTsKLQkJZHNkX2lucF9zZWwgPSAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzApICYKLQkJCQkweDNDKSA+PiAyOwotCQlkc2RfaW5wX3NlbCA9IChlbmFibGUpID8gZHNkX2lucF9zZWwgOiAwOwotCQlpZiAoZHNkX2lucF9zZWwgPCA5KSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDhfQ0ZHMSwKLQkJCQkJMHgwRiwgZHNkX2lucF9zZWwpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJMHgwRiwgcGNtX3JhdGVfdmFsKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEwsCi0JCQkJCTB4MTAsIG11dGVfZW4pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9kc2RfdXBkYXRlX3ZvbHVtZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYpCi17Ci0Jc25kX3NvY191cGRhdGVfYml0cyhkc2RfY29uZi0+Y29kZWMsIFdDRDkzNFhfQ0RDX1RPUF9UT1BfQ0ZHMCwKLQkJCSAgICAweDAxLCAweDAxKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGRzZF9jb25mLT5jb2RlYywgV0NEOTM0WF9DRENfVE9QX1RPUF9DRkcwLAotCQkJICAgIDB4MDEsIDB4MDApOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2VuYWJsZV9kc2Qoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWxfZ2V0X2RzZF9jb25maWcoY29kZWMpOwotCWludCByYywgY2xrX3VzZXJzOwotCWludCBpbnRlcnBfaWR4OwotCXU4IHBjbV9yYXRlX3ZhbDsKLQotCWlmICghZHNkX2NvbmYpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG51bGwgZHNkX2NvbmZpZyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBEU0QlZCwgZXZlbnQ6ICVkXG4iLCBfX2Z1bmNfXywKLQkJdy0+c2hpZnQsIGV2ZW50KTsKLQotCWlmICh3LT5zaGlmdCA9PSBEU0QwKSB7Ci0JCS8qIFJlYWQgb3V0IHNlbGVjdCAqLwotCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzApICYgMHgwMikKLQkJCWludGVycF9pZHggPSBJTlRFUlBfTE8xOwotCQllbHNlCi0JCQlpbnRlcnBfaWR4ID0gSU5URVJQX0hQSEw7Ci0JfSBlbHNlIGlmICh3LT5zaGlmdCA9PSBEU0QxKSB7Ci0JCS8qIFJlYWQgb3V0IHNlbGVjdCAqLwotCQlpZiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzApICYgMHgwMikKLQkJCWludGVycF9pZHggPSBJTlRFUlBfTE8yOwotCQllbHNlCi0JCQlpbnRlcnBfaWR4ID0gSU5URVJQX0hQSFI7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFVuc3VwcG9ydGVkIERTRDolZFxuIiwKLQkJCV9fZnVuY19fLCB3LT5zaGlmdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQljbGtfdXNlcnMgPSB0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2Nsayhjb2RlYywgZXZlbnQsCi0JCQkJCQkJICBpbnRlcnBfaWR4KTsKLQotCQlyYyA9IHRhdmlsX3NldF9kc2RfbW9kZShjb2RlYywgdy0+c2hpZnQsICZwY21fcmF0ZV92YWwpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0KLQkJdGF2aWxfZHNkX2RhdGFfcHVsbChjb2RlYywgKDEgPDwgdy0+c2hpZnQpLCBwY21fcmF0ZV92YWwsCi0JCQkJICAgIHRydWUpOwotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJICAgIFdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9EU0RfQ09OVFJPTCwgMHgwMSwKLQkJCQkgICAgMHgwMSk7Ci0JCWlmICh3LT5zaGlmdCA9PSBEU0QwKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMLAotCQkJCQkgICAgMHgwMiwgMHgwMik7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMLAotCQkJCQkgICAgMHgwMiwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQkvKiBBcHBseSBHYWluICovCi0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEsCi0JCQkJICAgICAgZHNkX2NvbmYtPnZvbHVtZVtEU0QwXSk7Ci0JCQlpZiAoZHNkX2NvbmYtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzEpCi0JCQkJdGF2aWxfZHNkX3VwZGF0ZV92b2x1bWUoZHNkX2NvbmYpOwotCi0JCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gRFNEMSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKLQkJCQkJICAgIDB4MDIsIDB4MDIpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKLQkJCQkJICAgIDB4MDIsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKLQkJCQkJICAgIDB4MDEsIDB4MDEpOwotCQkJLyogQXBwbHkgR2FpbiAqLwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcxLAotCQkJCSAgICAgIGRzZF9jb25mLT52b2x1bWVbRFNEMV0pOwotCQkJaWYgKGRzZF9jb25mLT52ZXJzaW9uID09IFRBVklMX1ZFUlNJT05fMV8xKQotCQkJCXRhdmlsX2RzZF91cGRhdGVfdm9sdW1lKGRzZF9jb25mKTsKLQkJfQotCQkvKiAxMG1zZWMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgRFNEIGNsb2NrIGlzIHNldCAqLwotCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEwMTAwKTsKLQotCQlpZiAoY2xrX3VzZXJzID4gMSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMsCi0JCQkJCSAgICAweDAyLCAweDAyKTsKLQkJCWlmICh3LT5zaGlmdCA9PSBEU0QwKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCQkgICAgV0NEOTM0WF9DRENfRFNEMF9DRkcyLAotCQkJCQkJICAgIDB4MDQsIDB4MDApOwotCQkJaWYgKHctPnNoaWZ0ID09IERTRDEpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJCSAgICBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIsCi0JCQkJCQkgICAgMHgwNCwgMHgwMCk7Ci0KLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKHctPnNoaWZ0ID09IERTRDApIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwKLQkJCQkJICAgIDB4MDQsIDB4MDQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQl9IGVsc2UgaWYgKHctPnNoaWZ0ID09IERTRDEpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwKLQkJCQkJICAgIDB4MDQsIDB4MDQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9QQVRIX0NUTCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQl9Ci0KLQkJdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LCBpbnRlcnBfaWR4KTsKLQotCQlpZiAoIShzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEwpICYgMHgwMSkgJiYKLQkJICAgICEoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKSAmIDB4MDEpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRFNEX0NPTlRST0wsCi0JCQkJCTB4MDEsIDB4MDApOwotCQkJdGF2aWxfZHNkX2RhdGFfcHVsbChjb2RlYywgMHgwMywgMHgwNCwgZmFsc2UpOwotCQkJdGF2aWxfZHNkX3Jlc2V0KGRzZF9jb25mKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9kc2Rfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCXVpbmZvLT5jb3VudCA9IDI7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gRFNEX1ZPTFVNRV9NSU5fTTExMGRCOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IERTRF9WT0xVTUVfTUFYXzBkQjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2RzZF92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9nZXRfZHNkX2NvbmZpZyhjb2RlYyk7Ci0JaW50IG52W0RTRF9NQVhdLCBjdltEU0RfTUFYXTsKLQlpbnQgc3RlcF9zaXplLCBudjE7Ci0JaW50IGksIGRzZF9pZHg7Ci0KLQlpZiAoIWRzZF9jb25mKQotCQlyZXR1cm4gMDsKLQotCW11dGV4X2xvY2soJmRzZF9jb25mLT52b2xfbXV0ZXgpOwotCi0JZm9yIChkc2RfaWR4ID0gRFNEMDsgZHNkX2lkeCA8IERTRF9NQVg7IGRzZF9pZHgrKykgewotCQljdltkc2RfaWR4XSA9IGRzZF9jb25mLT52b2x1bWVbZHNkX2lkeF07Ci0JCW52W2RzZF9pZHhdID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbZHNkX2lkeF07Ci0JfQotCi0JaWYgKCghRFNEX1ZPTFVNRV9SQU5HRV9DSEVDSyhudltEU0QwXSkpIHx8Ci0JICAgICghRFNEX1ZPTFVNRV9SQU5HRV9DSEVDSyhudltEU0QxXSkpKQotCQlnb3RvIGRvbmU7Ci0KLQlmb3IgKGRzZF9pZHggPSBEU0QwOyBkc2RfaWR4IDwgRFNEX01BWDsgZHNkX2lkeCsrKSB7Ci0JCWlmIChjdltkc2RfaWR4XSA9PSBudltkc2RfaWR4XSkKLQkJCWNvbnRpbnVlOwotCi0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBEU0QlZCBjdXIudm9sOiAlZCwgbmV3IHZvbDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgZHNkX2lkeCwgY3ZbZHNkX2lkeF0sIG52W2RzZF9pZHhdKTsKLQotCQlzdGVwX3NpemUgPSAgKG52W2RzZF9pZHhdIC0gY3ZbZHNkX2lkeF0pIC8KLQkJCSAgICAgIERTRF9WT0xVTUVfU1RFUFM7Ci0KLQkJbnYxID0gY3ZbZHNkX2lkeF07Ci0KLQkJZm9yIChpID0gMDsgaSA8IERTRF9WT0xVTUVfU1RFUFM7IGkrKykgewotCQkJbnYxICs9IHN0ZXBfc2l6ZTsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsCi0JCQkJICAgICAgV0NEOTM0WF9DRENfRFNEMF9DRkcxICsgMTYgKiBkc2RfaWR4LAotCQkJCSAgICAgIG52MSk7Ci0JCQlpZiAoZHNkX2NvbmYtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzEpCi0JCQkJdGF2aWxfZHNkX3VwZGF0ZV92b2x1bWUoZHNkX2NvbmYpOwotCi0JCQkvKiBzbGVlcCByZXF1aXJlZCBhZnRlciBlYWNoIHZvbHVtZSBzdGVwICovCi0JCQl1c2xlZXBfcmFuZ2UoRFNEX1ZPTFVNRV9TVEVQX0RFTEFZX1VTLAotCQkJCSAgICAgKERTRF9WT0xVTUVfU1RFUF9ERUxBWV9VUyArCi0JCQkJICAgICAgRFNEX1ZPTFVNRV9VU0xFRVBfTUFSR0lOX1VTKSk7Ci0JCX0KLQkJaWYgKG52MSAhPSBudltkc2RfaWR4XSkgewotCQkJc25kX3NvY193cml0ZShjb2RlYywKLQkJCQkgICAgICBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzEgKyAxNiAqIGRzZF9pZHgsCi0JCQkJICAgICAgbnZbZHNkX2lkeF0pOwotCi0JCQlpZiAoZHNkX2NvbmYtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzEpCi0JCQkJdGF2aWxfZHNkX3VwZGF0ZV92b2x1bWUoZHNkX2NvbmYpOwotCQl9Ci0KLQkJZHNkX2NvbmYtPnZvbHVtZVtkc2RfaWR4XSA9IG52W2RzZF9pZHhdOwotCX0KLQotZG9uZToKLQltdXRleF91bmxvY2soJmRzZF9jb25mLT52b2xfbXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfZHNkX3ZvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsX2dldF9kc2RfY29uZmlnKGNvZGVjKTsKLQotCWlmIChkc2RfY29uZikgewotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRzZF9jb25mLT52b2x1bWVbRFNEMF07Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZHNkX2NvbmYtPnZvbHVtZVtEU0QxXTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRhdmlsX2RzZF92b2xfY29udHJvbHNbXSA9IHsKLQl7Ci0JICAgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JICAgLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJICAgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKLQkgICAubmFtZSA9ICJEU0QgVm9sdW1lIiwKLQkgICAuaW5mbyA9IHRhdmlsX2RzZF92b2xfaW5mbywKLQkgICAuZ2V0ID0gdGF2aWxfZHNkX3ZvbF9nZXQsCi0JICAgLnB1dCA9IHRhdmlsX2RzZF92b2xfcHV0LAotCSAgIC50bHYgPSB7IC5wID0gdGF2aWxfZHNkX2RiX3NjYWxlIH0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0YXZpbF9kc2Rfd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9NVVgoIkRTRF9MIElGIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmRzZF9sX2lmX211eCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJEU0RfRklMVEVSXzAiLCBTTkRfU09DX05PUE0sIDAsIDAsICZkc2RfZmlsdDBfbXV4LAotCQkJICAgdGF2aWxfZW5hYmxlX2RzZCwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVgoIkRTRF9SIElGIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJmRzZF9yX2lmX211eCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJEU0RfRklMVEVSXzEiLCBTTkRfU09DX05PUE0sIDEsIDAsICZkc2RfZmlsdDFfbXV4LAotCQkJICAgdGF2aWxfZW5hYmxlX2RzZCwKLQkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLX07Ci0KLS8qKgotICogdGF2aWxfZHNkX3Bvc3Rfc3NyX2luaXQgLSBEU0QgaW50aWFsaXphdGlvbiBhZnRlciBzdWJzeXN0ZW0gcmVzdGFydAotICoKLSAqIEBjb2RlYzogcG9pbnRlciB0byBzbmRfc29jX2NvZGVjCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3Igb24gZmFpbHVyZQotICovCi1pbnQgdGF2aWxfZHNkX3Bvc3Rfc3NyX2luaXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCWlmICghZHNkX2NvbmYgfHwgIWRzZF9jb25mLT5jb2RlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb2RlYyA9IGRzZF9jb25mLT5jb2RlYzsKLQkvKiBEaXNhYmxlIERTRCBJbnRlcnJ1cHRzICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfTUFTSywgMHgwOCwgMHgwOCk7Ci0KLQkvKiBEU0QgcmVnaXN0ZXJzIGluaXQgKi8KLQlpZiAoZHNkX2NvbmYtPnZlcnNpb24gPT0gVEFWSUxfVkVSU0lPTl8xXzApIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcyLCAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcyLCAweDAyLCAweDAwKTsKLQl9Ci0JLyogRFNEMDogTXV0ZSBFTiAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwgMHgwNCwgMHgwNCk7Ci0JLyogRFNEMTogTXV0ZSBFTiAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwgMHgwNCwgMHgwNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkczLCAweDEwLAotCQkJICAgIDB4MTApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMywgMHgxMCwKLQkJCSAgICAweDEwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzAsIDB4MEUsCi0JCQkgICAgMHgwQSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkcwLCAweDBFLAotCQkJICAgIDB4MEEpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMSwgMHgwNywKLQkJCSAgICAweDA0KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzEsIDB4MDcsCi0JCQkgICAgMHgwNCk7Ci0KLQkvKiBFbmFibGUgRFNEIEludGVycnVwdHMgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19NQVNLLCAweDA4LCAweDAwKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2RfcG9zdF9zc3JfaW5pdCk7Ci0KLS8qKgotICogdGF2aWxfZHNkX2luaXQgLSBEU0QgaW50aWFsaXphdGlvbgotICoKLSAqIEBjb2RlYzogcG9pbnRlciB0byBzbmRfc29jX2NvZGVjCi0gKgotICogUmV0dXJucyBwb2ludGVyIHRvIHRhdmlsX2RzZF9jb25maWcgZm9yIHN1Y2Nlc3Mgb3IgTlVMTCBmb3IgZmFpbHVyZQotICovCi1zdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqdGF2aWxfZHNkX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmY7Ci0JdTggdmFsOwotCi0JaWYgKCFjb2RlYykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7Ci0KLQkvKiBSZWFkIGVmdXNlIHJlZ2lzdGVyIHRvIGNoZWNrIGlmIERTRCBpcyBzdXBwb3J0ZWQgKi8KLQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0KTsKLQlpZiAodmFsICYgMHg4MCkgewotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IERTRCB1bnN1cHBvcnRlZCBmb3IgdGhpcyBjb2RlYyB2ZXJzaW9uXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZHNkX2NvbmYgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgc2l6ZW9mKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWRzZF9jb25mKQotCQlyZXR1cm4gTlVMTDsKLQotCWRzZF9jb25mLT5jb2RlYyA9IGNvZGVjOwotCi0JLyogUmVhZCB2ZXJzaW9uICovCi0JZHNkX2NvbmYtPnZlcnNpb24gPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCSBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0NISVBfSURfQllURTApOwotCS8qIERTRCByZWdpc3RlcnMgaW5pdCAqLwotCWlmIChkc2RfY29uZi0+dmVyc2lvbiA9PSBUQVZJTF9WRVJTSU9OXzFfMCkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzIsIDB4MDIsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIsIDB4MDIsIDB4MDApOwotCX0KLQkvKiBEU0QwOiBNdXRlIEVOICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcyLCAweDA0LCAweDA0KTsKLQkvKiBEU0QxOiBNdXRlIEVOICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcyLCAweDA0LCAweDA0KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QwX0RFQlVHX0NGRzMsIDB4MTAsCi0JCQkgICAgMHgxMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMV9ERUJVR19DRkczLCAweDEwLAotCQkJICAgIDB4MTApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDBfREVCVUdfQ0ZHMCwgMHgwRSwKLQkJCSAgICAweDBBKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19ERUJVR19EU0QxX0RFQlVHX0NGRzAsIDB4MEUsCi0JCQkgICAgMHgwQSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfREVCVUdfRFNEMF9ERUJVR19DRkcxLCAweDA3LAotCQkJICAgIDB4MDQpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RFQlVHX0RTRDFfREVCVUdfQ0ZHMSwgMHgwNywKLQkJCSAgICAweDA0KTsKLQotCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwgdGF2aWxfZHNkX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKHRhdmlsX2RzZF93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB0YXZpbF9kc2RfYXVkaW9fbWFwLAotCQkJCUFSUkFZX1NJWkUodGF2aWxfZHNkX2F1ZGlvX21hcCkpOwotCi0JbXV0ZXhfaW5pdCgmZHNkX2NvbmYtPnZvbF9tdXRleCk7Ci0JZHNkX2NvbmYtPnZvbHVtZVtEU0QwXSA9IERTRF9WT0xVTUVfTUFYXzBkQjsKLQlkc2RfY29uZi0+dm9sdW1lW0RTRDFdID0gRFNEX1ZPTFVNRV9NQVhfMGRCOwotCi0Jc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHRhdmlsX2RzZF92b2xfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRSh0YXZpbF9kc2Rfdm9sX2NvbnRyb2xzKSk7Ci0KLQkvKiBFbmFibGUgRFNEIEludGVycnVwdHMgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19NQVNLLCAweDA4LCAweDAwKTsKLQotCXJldHVybiBkc2RfY29uZjsKLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfZHNkX2luaXQpOwotCi0vKioKLSAqIHRhdmlsX2RzZF9kZWluaXQgLSBEU0QgZGUtaW50aWFsaXphdGlvbgotICoKLSAqIEBkc2RfY29uZjogcG9pbnRlciB0byB0YXZpbF9kc2RfY29uZmlnCi0gKi8KLXZvaWQgdGF2aWxfZHNkX2RlaW5pdChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCi0JaWYgKCFkc2RfY29uZikKLQkJcmV0dXJuOwotCi0JY29kZWMgPSBkc2RfY29uZi0+Y29kZWM7Ci0KLQltdXRleF9kZXN0cm95KCZkc2RfY29uZi0+dm9sX211dGV4KTsKLQotCS8qIERpc2FibGUgRFNEIEludGVycnVwdHMgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0lOVFJfQ09ERUNfTUlTQ19NQVNLLCAweDA4LCAweDA4KTsKLQotCWRldm1fa2ZyZWUoY29kZWMtPmRldiwgZHNkX2NvbmYpOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9kc2RfZGVpbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzZC5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGI5NmMuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fV0NEOTM0WF9EU0RfSF9fCi0jZGVmaW5lIF9fV0NEOTM0WF9EU0RfSF9fCi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlICJ3Y2Q5MzR4LmgiCi0KLWVudW0gewotCURTRDAsCi0JRFNEMSwKLQlEU0RfTUFYLAotfTsKLQotZW51bSB7Ci0JRFNEX0lOUF9TRUxfWkVSTyA9IDAsCi0JRFNEX0lOUF9TRUxfUlgwLAotCURTRF9JTlBfU0VMX1JYMSwKLQlEU0RfSU5QX1NFTF9SWDIsCi0JRFNEX0lOUF9TRUxfUlgzLAotCURTRF9JTlBfU0VMX1JYNCwKLQlEU0RfSU5QX1NFTF9SWDUsCi0JRFNEX0lOUF9TRUxfUlg2LAotCURTRF9JTlBfU0VMX1JYNywKLX07Ci0KLXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdW5zaWduZWQgaW50IGRzZF9pbnRlcnBfbWl4ZXJbSU5URVJQX01BWF07Ci0JdTMyIGJhc2Vfc2FtcGxlX3JhdGVbRFNEX01BWF07Ci0JaW50IHZvbHVtZVtEU0RfTUFYXTsKLQlzdHJ1Y3QgbXV0ZXggdm9sX211dGV4OwotCWludCB2ZXJzaW9uOwotfTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TT0NfV0NEOTM0WF9EU0QpCi1pbnQgdGF2aWxfZHNkX3NldF9taXhlcl92YWx1ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCi0JCQkgICAgICBpbnQgaW50ZXJwX251bSwgaW50IHN3X3ZhbHVlKTsKLWludCB0YXZpbF9kc2RfZ2V0X2N1cnJlbnRfbWl4ZXJfdmFsdWUoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAotCQkJCSAgICAgIGludCBpbnRlcnBfbnVtKTsKLWludCB0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3Qoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mLAotCQkJICAgICBpbnQgaW50ZXJwX251bSk7Ci12b2lkIHRhdmlsX2RzZF9yZXNldChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYpOwotdm9pZCB0YXZpbF9kc2Rfc2V0X2ludGVycF9yYXRlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwgdTE2IHJ4X3BvcnQsCi0JCQkgICAgICAgdTMyIHNhbXBsZV9yYXRlLCB1OCBzYW1wbGVfcmF0ZV92YWwpOwotc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKnRhdmlsX2RzZF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci12b2lkIHRhdmlsX2RzZF9kZWluaXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25maWcpOwotaW50IHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0KHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZmlnKTsKLSNlbHNlCi1pbnQgdGF2aWxfZHNkX3NldF9taXhlcl92YWx1ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCi0JCQkgICAgICBpbnQgaW50ZXJwX251bSwgaW50IHN3X3ZhbHVlKQotewotCXJldHVybiAwOwotfQotCi1pbnQgdGF2aWxfZHNkX2dldF9jdXJyZW50X21peGVyX3ZhbHVlKHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiwKLQkJCQkgICAgICBpbnQgaW50ZXJwX251bSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHRhdmlsX2RzZF9zZXRfb3V0X3NlbGVjdChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsCi0JCQkgICAgIGludCBpbnRlcnBfbnVtKQotewotCXJldHVybiAwOwotfQotCi12b2lkIHRhdmlsX2RzZF9yZXNldChzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYpCi17ICB9Ci0KLXZvaWQgdGF2aWxfZHNkX3NldF9pbnRlcnBfcmF0ZShzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYsIHUxNiByeF9wb3J0LAotCQkJICAgICAgIHUzMiBzYW1wbGVfcmF0ZSwgdTggc2FtcGxlX3JhdGVfdmFsKQoteyAgfQotCi1zdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqdGF2aWxfZHNkX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHRhdmlsX2RzZF9kZWluaXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25maWcpCi17ICB9Ci1pbnQgdGF2aWxfZHNkX3Bvc3Rfc3NyX2luaXQoc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25maWcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNwLWNudGwuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LWRzcC1jbnRsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmYyNmMuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNwLWNudGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wb25lbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvd2NkLWRzcC1tZ3IuaD4KLSNpbmNsdWRlICJ3Y2Q5MzR4LmgiCi0jaW5jbHVkZSAid2NkOTM0eC1kc3AtY250bC5oIgotCi0jZGVmaW5lIFdDRF9DTlRMX0RJUl9OQU1FX0xFTl9NQVggMzIKLSNkZWZpbmUgV0NEX0NQRV9GTExfTUFYX1JFVFJJRVMgNQotI2RlZmluZSBXQ0RfTUVNX0VOQUJMRV9NQVhfUkVUUklFUyAyMAotI2RlZmluZSBXQ0RfRFNQX0JPT1RfVElNRU9VVF9NUyAzMDAwCi0jZGVmaW5lIFdDRF9TWVNGU19FTlRSWV9NQVhfTEVOIDgKLSNkZWZpbmUgV0NEX1BST0NGU19FTlRSWV9NQVhfTEVOIDE2Ci0jZGVmaW5lIFdDRF85MzRYX1JBTURVTVBfU1RBUlRfQUREUiAweDIwMTAwMDAwCi0jZGVmaW5lIFdDRF85MzRYX1JBTURVTVBfU0laRSAoKDEwMjQgKiAxMDI0KSAtIDEyOCkKLQotI2RlZmluZSBXQ0RfQ05UTF9NVVRFWF9MT0NLKGNvZGVjLCBsb2NrKSAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbXV0ZXhfbG9jayglcylcbiIsICBcCi0JCV9fZnVuY19fLCBfX3N0cmluZ2lmeV8xKGxvY2spKTsgICAgICBcCi0JbXV0ZXhfbG9jaygmbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFdDRF9DTlRMX01VVEVYX1VOTE9DSyhjb2RlYywgbG9jaykgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG11dGV4X3VubG9jayglcylcbiIsIFwKLQkJX19mdW5jX18sIF9fc3RyaW5naWZ5XzEobG9jaykpOyAgICAgICBcCi0JbXV0ZXhfdW5sb2NrKCZsb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotZW51bSB3Y2RfbWVtX3R5cGUgewotCVdDRF9NRU1fVFlQRV9BTFdBWVNfT04sCi0JV0NEX01FTV9UWVBFX1NXSVRDSEFCTEUsCi19OwotCi1zdHJ1Y3Qgd2NkX2NudGxfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsIGNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsLCBjb25zdCBjaGFyICpidWYsCi0JCQkgc3NpemVfdCBjb3VudCk7Ci19OwotCi0jZGVmaW5lIFdDRF9DTlRMX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCi1zdGF0aWMgc3RydWN0IHdjZF9jbnRsX2F0dHJpYnV0ZSBjbnRsX2F0dHJfIyNfbmFtZSA9IHsJXAotCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAubW9kZSA9IF9tb2RlfSwJXAotCS5zaG93ID0gX3Nob3csCVwKLQkuc3RvcmUgPSBfc3RvcmUsCVwKLX0KLQotI2RlZmluZSB0b193Y2RfY250bF9hdHRyKGEpIFwKLQljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3Qgd2NkX2NudGxfYXR0cmlidXRlLCBhdHRyKQotCi0jZGVmaW5lIHRvX3djZF9jbnRsKGtvYmopIFwKLQljb250YWluZXJfb2YoKGtvYmopLCBzdHJ1Y3Qgd2NkX2RzcF9jbnRsLCB3Y2Rfa29iaikKLQotc3RhdGljIHU4IG1lbV9lbmFibGVfdmFsdWVzW10gPSB7Ci0JMHhGRSwgMHhGQywgMHhGOCwgMHhGMCwKLQkweEUwLCAweEMwLCAweDgwLCAweDAwLAotfTsKLQotc3RhdGljIHNzaXplX3Qgd2RzcF9ib290X3Nob3coc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFdDRF9TWVNGU19FTlRSWV9NQVhfTEVOLAotCQkJIiV1IiwgY250bC0+Ym9vdF9yZXFzKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgd2RzcF9ib290X3N0b3JlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwsCi0JCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQotewotCXUzMiB2YWw7Ci0JYm9vbCB2b3RlOwotCWludCByZXQ7Ci0KLQlyZXQgPSBrc3RydG91MzIoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgZW50cnksIHJldCA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHZhbCA+IDApIHsKLQkJY250bC0+Ym9vdF9yZXFzKys7Ci0JCXZvdGUgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCWNudGwtPmJvb3RfcmVxcy0tOwotCQl2b3RlID0gZmFsc2U7Ci0JfQotCi0JaWYgKGNudGwtPm1fZGV2ICYmIGNudGwtPm1fb3BzICYmCi0JICAgIGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3ApCi0JCXJldCA9IGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3AoY250bC0+bV9kZXYsIHZvdGUpOwotCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKLQotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byAlcyBkc3BcbiIsIF9fZnVuY19fLAotCQkJdm90ZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLVdDRF9DTlRMX0FUVFIoYm9vdCwgMDY2MCwgd2RzcF9ib290X3Nob3csIHdkc3BfYm9vdF9zdG9yZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IHdjZF9jbnRsX3N5c2ZzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCB3Y2RfY250bF9hdHRyaWJ1dGUgKndjZF9hdHRyID0gdG9fd2NkX2NudGxfYXR0cihhdHRyKTsKLQlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsID0gdG9fd2NkX2NudGwoa29iaik7Ci0Jc3NpemVfdCByZXQgPSAtRUlOVkFMOwotCi0JaWYgKGNudGwgJiYgd2NkX2F0dHItPnNob3cpCi0JCXJldCA9IHdjZF9hdHRyLT5zaG93KGNudGwsIGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB3Y2RfY250bF9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHdjZF9jbnRsX2F0dHJpYnV0ZSAqd2NkX2F0dHIgPSB0b193Y2RfY250bF9hdHRyKGF0dHIpOwotCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwgPSB0b193Y2RfY250bChrb2JqKTsKLQlzc2l6ZV90IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoY250bCAmJiB3Y2RfYXR0ci0+c3RvcmUpCi0JCXJldCA9IHdjZF9hdHRyLT5zdG9yZShjbnRsLCBidWYsIGNvdW50KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHdjZF9jbnRsX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IHdjZF9jbnRsX3N5c2ZzX3Nob3csCi0JLnN0b3JlID0gd2NkX2NudGxfc3lzZnNfc3RvcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSB3Y2RfY250bF9rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJndjZF9jbnRsX3N5c2ZzX29wcywKLX07Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbnRsX2NoYW5nZV9vbmxpbmVfc3RhdGUoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKLQkJCQkJIHU4IG9ubGluZSkKLXsKLQlzdHJ1Y3Qgd2RzcF9zc3JfZW50cnkgKnNzcl9lbnRyeSA9ICZjbnRsLT5zc3JfZW50cnk7Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0KLQlXQ0RfQ05UTF9NVVRFWF9MT0NLKGNudGwtPmNvZGVjLCBjbnRsLT5zc3JfbXV0ZXgpOwotCXNzcl9lbnRyeS0+b2ZmbGluZSA9ICFvbmxpbmU7Ci0JLyogTWFrZSBzdXJlIHRoZSB3cml0ZSBpcyBjb21wbGV0ZSAqLwotCXdtYigpOwotCXJldCA9IHhjaGcoJnNzcl9lbnRyeS0+b2ZmbGluZV9jaGFuZ2UsIDEpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3NyX2VudHJ5LT5vZmZsaW5lX3BvbGxfd2FpdCk7Ci0JZGV2X2RiZyhjbnRsLT5jb2RlYy0+ZGV2LAotCQkiJXM6IHJlcXVlc3RlZCAldSwgb2ZmbGluZSAldSBvZmZsaW5lX2NoYW5nZSAldSwgcmV0ID0gJWxkbiIsCi0JCV9fZnVuY19fLCBvbmxpbmUsIHNzcl9lbnRyeS0+b2ZmbGluZSwKLQkJc3NyX2VudHJ5LT5vZmZsaW5lX2NoYW5nZSwgcmV0KTsKLQlXQ0RfQ05UTF9NVVRFWF9VTkxPQ0soY250bC0+Y29kZWMsIGNudGwtPnNzcl9tdXRleCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdkc3Bfc3NyX2VudHJ5X3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKLQkJCQkgICB2b2lkICpmaWxlX3ByaXZfZGF0YSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQotewotCWludCBsZW4gPSAwOwotCWNoYXIgYnVmZmVyW1dDRF9QUk9DRlNfRU5UUllfTUFYX0xFTl07Ci0Jc3RydWN0IHdjZF9kc3BfY250bCAqY250bDsKLQlzdHJ1Y3Qgd2RzcF9zc3JfZW50cnkgKnNzcl9lbnRyeTsKLQlzc2l6ZV90IHJldDsKLQl1OCBvZmZsaW5lOwotCi0JY250bCA9IChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICopIGVudHJ5LT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFjbnRsKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhIGZvciBTU1IgcHJvY2ZzIGVudHJ5XG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzc3JfZW50cnkgPSAmY250bC0+c3NyX2VudHJ5OwotCi0JV0NEX0NOVExfTVVURVhfTE9DSyhjbnRsLT5jb2RlYywgY250bC0+c3NyX211dGV4KTsKLQlvZmZsaW5lID0gc3NyX2VudHJ5LT5vZmZsaW5lOwotCS8qIE1ha2Ugc3VyZSB0aGUgcmVhZCBpcyBjb21wbGV0ZSAqLwotCXJtYigpOwotCWRldl9kYmcoY250bC0+Y29kZWMtPmRldiwgIiVzOiBvZmZsaW5lID0gJXNcbiIsIF9fZnVuY19fLAotCQlvZmZsaW5lID8gInRydWUiIDogImZhbHNlIik7Ci0JbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzXG4iLAotCQkgICAgICAgb2ZmbGluZSA/ICJPRkZMSU5FIiA6ICJPTkxJTkUiKTsKLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBidWZmZXIsIGxlbik7Ci0JV0NEX0NOVExfTVVURVhfVU5MT0NLKGNudGwtPmNvZGVjLCBjbnRsLT5zc3JfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB3ZHNwX3Nzcl9lbnRyeV9wb2xsKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCi0JCQkJCXZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCXBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IHdjZF9kc3BfY250bCAqY250bDsKLQlzdHJ1Y3Qgd2RzcF9zc3JfZW50cnkgKnNzcl9lbnRyeTsKLQl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLQotCWlmICghZW50cnkgfHwgIWVudHJ5LT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogJXMgaXMgTlVMTFxuIiwgX19mdW5jX18sCi0JCSAgICAgICAoIWVudHJ5KSA/ICJlbnRyeSIgOiAicHJpdmF0ZV9kYXRhIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNudGwgPSAoc3RydWN0IHdjZF9kc3BfY250bCAqKSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwotCXNzcl9lbnRyeSA9ICZjbnRsLT5zc3JfZW50cnk7Ci0KLQlkZXZfZGJnKGNudGwtPmNvZGVjLT5kZXYsICIlczogUG9sbCB3YWl0LCBvZmZsaW5lID0gJXVcbiIsCi0JCV9fZnVuY19fLCBzc3JfZW50cnktPm9mZmxpbmUpOwotCXBvbGxfd2FpdChmaWxlLCAmc3NyX2VudHJ5LT5vZmZsaW5lX3BvbGxfd2FpdCwgd2FpdCk7Ci0JZGV2X2RiZyhjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IFdva2VuIHVwIFBvbGwgd2FpdCwgb2ZmbGluZSA9ICV1XG4iLAotCQlfX2Z1bmNfXywgc3NyX2VudHJ5LT5vZmZsaW5lKTsKLQotCVdDRF9DTlRMX01VVEVYX0xPQ0soY250bC0+Y29kZWMsIGNudGwtPnNzcl9tdXRleCk7Ci0JaWYgKHhjaGcoJnNzcl9lbnRyeS0+b2ZmbGluZV9jaGFuZ2UsIDApKQotCQlyZXQgPSBQT0xMSU4gfCBQT0xMUFJJIHwgUE9MTFJETk9STTsKLQlkZXZfZGJnKGNudGwtPmNvZGVjLT5kZXYsICIlczogcmV0ICglZCkgZnJvbSBwb2xsX3dhaXRcbiIsCi0JCV9fZnVuY19fLCByZXQpOwotCVdDRF9DTlRMX01VVEVYX1VOTE9DSyhjbnRsLT5jb2RlYywgY250bC0+c3NyX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnlfb3BzIHdkc3Bfc3NyX2VudHJ5X29wcyA9IHsKLQkucmVhZCA9IHdkc3Bfc3NyX2VudHJ5X3JlYWQsCi0JLnBvbGwgPSB3ZHNwX3Nzcl9lbnRyeV9wb2xsLAotfTsKLQotc3RhdGljIGludCB3Y2RfY250bF9jcGVfZmxsX2NhbGlicmF0ZShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOwotCWludCByZXQgPSAwLCByZXRyeSA9IDA7Ci0JdTggY2FsX2xzYiwgY2FsX21zYjsKLQl1OCBsb2NrX2RldDsKLQotCS8qIE1ha2Ugc3VyZSBjbG9ja3MgYXJlIGdhdGVkICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BFX0NUTCwKLQkJCSAgICAweDA1LCAweDAwKTsKLQotCS8qIEVuYWJsZSBDUEUgRkxMIHJlZmVyZW5jZSBjbG9jayAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxLAotCQkJICAgIDB4ODAsIDB4ODApOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfRkxMX1VTRVJfQ1RMXzUsCi0JCQkgICAgMHhGMywgMHgxMyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfRkxMX0xfVkFMX0NUTF8wLCAweDUwKTsKLQotCS8qIERpc2FibGUgQ1BBUiByZXNldCBhbmQgRW5hYmxlIENQQVIgY2xrICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsCi0JCQkgICAgMHgwMiwgMHgwMik7Ci0KLQkvKiBXcml0ZSBjYWxpYnJhdGlvbiBsLXZhbHVlIGJhc2VkIG9uIGNkYyBjbGsgcmF0ZSAqLwotCWlmIChjbnRsLT5jbGtfcmF0ZSA9PSA5NjAwMDAwKSB7Ci0JCWNhbF9sc2IgPSAweDZkOwotCQljYWxfbXNiID0gMHgwMDsKLQl9IGVsc2UgewotCQljYWxfbHNiID0gMHg1NjsKLQkJY2FsX21zYiA9IDB4MDA7Ci0JfQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9VU0VSX0NUTF82LCBjYWxfbHNiKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfVVNFUl9DVExfNywgY2FsX21zYik7Ci0KLQkvKiBGTEwgbW9kZSB0byBmb2xsb3cgcG93ZXIgdXAgc2VxdWVuY2UgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUsCi0JCQkgICAgMHg2MCwgMHgwMCk7Ci0KLQkvKiBIVyBjb250cm9sbGVkIENQRSBGTEwgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfRkxMX01PREUsCi0JCQkgICAgMHg4MCwgMHg4MCk7Ci0KLQkvKiBGb3JjZSBvbiBDUEUgRkxMICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DRkcsCi0JCQkgICAgMHgwNCwgMHgwNCk7Ci0KLQlkbyB7Ci0JCS8qIFRpbWUgZm9yIEZMTCBjYWxpYnJhdGlvbiB0byBjb21wbGV0ZSAqLwotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JCWxvY2tfZGV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NQRV9GTExfU1RBVFVTXzMpOwotCQlyZXRyeSsrOwotCX0gd2hpbGUgKCEobG9ja19kZXQgJiAweDAxKSAmJgotCQkgcmV0cnkgPD0gV0NEX0NQRV9GTExfTUFYX1JFVFJJRVMpOwotCi0JaWYgKCEobG9ja19kZXQgJiAweDAxKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbG9jayBkZXRlY3Qgbm90IHNldCwgMHglMDJ4XG4iLAotCQkJX19mdW5jX18sIGxvY2tfZGV0KTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJfbG9ja19kZXQ7Ci0JfQotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfRkxMX0ZMTF9NT0RFLAotCQkJICAgIDB4NjAsIDB4MjApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLAotCQkJICAgIDB4MDQsIDB4MDApOwotCXJldHVybiByZXQ7Ci0KLWVycl9sb2NrX2RldDoKLQkvKiBVbmRvIHRoZSByZWdpc3RlciBzZXR0aW5ncyAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLAotCQkJICAgIDB4MDQsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9GTExfTU9ERSwKLQkJCSAgICAweDgwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEFSX0NUTCwKLQkJCSAgICAweDAyLCAweDAwKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY250bF9jb25maWdfY3BhcihzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOwotCXU4IG5vbV9sbywgbm9tX2hpLCBzdnMyX2xvLCBzdnMyX2hpOwotCi0JLyogQ29uZmlndXJlIENQQVIgKi8KLQlub21faGkgPSBzdnMyX2hpID0gMDsKLQlpZiAoY250bC0+Y2xrX3JhdGUgPT0gOTYwMDAwMCkgewotCQlub21fbG8gPSAweDkwOwotCQlzdnMyX2xvID0gMHg1MDsKLQl9IGVsc2UgewotCQlub21fbG8gPSAweDcwOwotCQlzdnMyX2xvID0gMHgzZTsKLQl9Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1RFU1RfREVCVUdfTFZBTF9OT01fTE9XLCBub21fbG8pOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX05PTV9ISUdILCBub21faGkpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19MVkFMX1NWU19TVlMyX0xPVywgc3ZzMl9sbyk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9URVNUX0RFQlVHX0xWQUxfU1ZTX1NWUzJfSElHSCwgc3ZzMl9oaSk7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFRkxMX0NUTCwKLQkJCSAgICAweDAzLCAweDAzKTsKLX0KLQotc3RhdGljIGludCB3Y2RfY250bF9jcGVfZmxsX2N0cmwoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKLQkJCQkgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXJldCA9IHdjZF9jbnRsX2NwZV9mbGxfY2FsaWJyYXRlKGNudGwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogY3BlX2ZsbF9jYWwgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXdjZF9jbnRsX2NvbmZpZ19jcGFyKGNudGwpOwotCi0JCS8qIEVuYWJsZSBBSEIgQ0xLIGFuZCBDUEUgQ0xLKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BFX0NUTCwKLQkJCQkgICAgMHgwNSwgMHgwNSk7Ci0JfSBlbHNlIHsKLQkJLyogRGlzYWJsZSBBSEIgQ0xLIGFuZCBDUEUgQ0xLICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwsCi0JCQkJICAgIDB4MDUsIDB4MDApOwotCQkvKiBSZXNldCB0aGUgQ1BBUiBtb2RlIGZvciBDUEUgRkxMICovCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX0ZMTF9GTExfTU9ERSwgMHgyMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ0ZHLAotCQkJCSAgICAweDA0LCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsCi0JCQkJICAgIDB4MDIsIDB4MDApOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY250bF9jbG9ja3NfZW5hYmxlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0JaW50IHJldDsKLQotCVdDRF9DTlRMX01VVEVYX0xPQ0soY29kZWMsIGNudGwtPmNsa19tdXRleCk7Ci0JLyogRW5hYmxlIGNvZGVjIGNsb2NrICovCi0JaWYgKGNudGwtPmNkY19jYiAmJiBjbnRsLT5jZGNfY2ItPmNkY19jbGtfZW4pCi0JCXJldCA9IGNudGwtPmNkY19jYi0+Y2RjX2Nsa19lbihjb2RlYywgdHJ1ZSk7Ci0JZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNkYyBjbGssIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogUHVsbCBDUEFSIG91dCBvZiByZXNldCAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMLCAweDA0LCAweDAwKTsKLQotCS8qIENvbmZpZ3VyZSBhbmQgRW5hYmxlIENQRSBGTEwgY2xvY2sgKi8KLQlyZXQgPSB3Y2RfY250bF9jcGVfZmxsX2N0cmwoY250bCwgdHJ1ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNwZSBjbGssIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2NwZV9jbGs7Ci0JfQotCWNudGwtPmlzX2Nsa19lbmFibGVkID0gdHJ1ZTsKLQotCS8qIFVuZ2F0ZSB0aGUgQ1BSIGNsb2NrICAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAweDEwLCAweDAwKTsKLWRvbmU6Ci0JV0NEX0NOVExfTVVURVhfVU5MT0NLKGNvZGVjLCBjbnRsLT5jbGtfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLWVycl9jcGVfY2xrOgotCWlmIChjbnRsLT5jZGNfY2IgJiYgY250bC0+Y2RjX2NiLT5jZGNfY2xrX2VuKQotCQljbnRsLT5jZGNfY2ItPmNkY19jbGtfZW4oY29kZWMsIGZhbHNlKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMLCAweDA0LCAweDA0KTsKLQlXQ0RfQ05UTF9NVVRFWF9VTkxPQ0soY29kZWMsIGNudGwtPmNsa19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY250bF9jbG9ja3NfZGlzYWJsZShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOwotCWludCByZXQgPSAwOwotCi0JV0NEX0NOVExfTVVURVhfTE9DSyhjb2RlYywgY250bC0+Y2xrX211dGV4KTsKLQlpZiAoIWNudGwtPmlzX2Nsa19lbmFibGVkKSB7Ci0JCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogY2xvY2tzIGFscmVhZHkgZGlzYWJsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBHYXRlIHRoZSBDUFIgY2xvY2sgICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUsIDB4MTAsIDB4MTApOwotCi0JLyogRGlzYWJsZSBDUEUgRkxMIGNsb2NrICovCi0JcmV0ID0gd2NkX2NudGxfY3BlX2ZsbF9jdHJsKGNudGwsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBjcGUgY2xrLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JLyoKLQkgKiBFdmVuIGlmIENQRSBGTEwgZGlzYWJsZSBmYWlsZWQsIGdvIGFoZWFkIGFuZCBkaXNhYmxlCi0JICogdGhlIGNvZGVjIGNsb2NrCi0JICovCi0JaWYgKGNudGwtPmNkY19jYiAmJiBjbnRsLT5jZGNfY2ItPmNkY19jbGtfZW4pCi0JCXJldCA9IGNudGwtPmNkY19jYi0+Y2RjX2Nsa19lbihjb2RlYywgZmFsc2UpOwotCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKLQotCWNudGwtPmlzX2Nsa19lbmFibGVkID0gZmFsc2U7Ci0KLQkvKiBQdXQgQ1BBUiBpbiByZXNldCAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQQVJfQ1RMLCAweDA0LCAweDA0KTsKLWRvbmU6Ci0JV0NEX0NOVExfTVVURVhfVU5MT0NLKGNvZGVjLCBjbnRsLT5jbGtfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbnRsX2NwYXJfY3RybChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsLAotCQkJICAgICAgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOwotCi0JaWYgKGVuYWJsZSkKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsIDB4MDMsIDB4MDMpOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfQ1BBUl9DVEwsIDB4MDMsIDB4MDApOwotfQotCi1zdGF0aWMgaW50IHdjZF9jbnRsX2VuYWJsZV9tZW1vcnkoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKLQkJCQkgIGVudW0gd2NkX21lbV90eXBlIG1lbV90eXBlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNudGwtPmNvZGVjOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50IGxvb3BfY250ID0gMDsKLQl1OCBzdGF0dXM7Ci0JaW50IHJldCA9IDA7Ci0KLQotCXN3aXRjaCAobWVtX3R5cGUpIHsKLQotCWNhc2UgV0NEX01FTV9UWVBFX0FMV0FZU19PTjoKLQotCQkvKiA1MTJLQiBvZiBhbHdheXMgb24gcmVnaW9uICovCi0JCXdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQod2NkOXh4eCwKLQkJCQlXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLAotCQkJCUFSUkFZX1NJWkUobWVtX2VuYWJsZV92YWx1ZXMpLAotCQkJCW1lbV9lbmFibGVfdmFsdWVzKTsKLQkJd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdCh3Y2Q5eHh4LAotCQkJCVdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzEsCi0JCQkJQVJSQVlfU0laRShtZW1fZW5hYmxlX3ZhbHVlcyksCi0JCQkJbWVtX2VuYWJsZV92YWx1ZXMpOwotCQlicmVhazsKLQotCWNhc2UgV0NEX01FTV9UWVBFX1NXSVRDSEFCTEU6Ci0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwKLQkJCQkgICAgMHgwNCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19NRU1fQ1RSTCwKLQkJCQkgICAgMHg4MCwgMHg4MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NPQ19TV19DT0xMQVBTRV9DVEwsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCQlkbyB7Ci0JCQlsb29wX2NudCsrOwotCQkJLyogVGltZSB0byBlbmFibGUgdGhlIHBvd2VyIGRvbWFpbiBmb3IgbWVtb3J5ICovCi0JCQl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOwotCQkJc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NQRV9TU19TT0NfU1dfQ09MTEFQU0VfQ1RMKTsKLQkJfSB3aGlsZSAoKHN0YXR1cyAmIDB4MDIpICE9IDB4MDIgJiYKLQkJCSAgbG9vcF9jbnQgIT0gV0NEX01FTV9FTkFCTEVfTUFYX1JFVFJJRVMpOwotCi0JCWlmICgoc3RhdHVzICYgMHgwMikgIT0gMHgwMikgewotCQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAotCQkJCSIlczogcG93ZXIgZG9tYWluIG5vdCBlbmFibGVkLCBzdGF0dXMgPSAweCUwMnhcbiIsCi0JCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJLyogUmVzdCBvZiB0aGUgbWVtb3J5ICovCi0JCXdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQod2NkOXh4eCwKLQkJCQlXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8yLAotCQkJCUFSUkFZX1NJWkUobWVtX2VuYWJsZV92YWx1ZXMpLAotCQkJCW1lbV9lbmFibGVfdmFsdWVzKTsKLQkJd2NkOXh4eF9zbGltX3dyaXRlX3JlcGVhdCh3Y2Q5eHh4LAotCQkJCVdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzMsCi0JCQkJQVJSQVlfU0laRShtZW1fZW5hYmxlX3ZhbHVlcyksCi0JCQkJbWVtX2VuYWJsZV92YWx1ZXMpOwotCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfRFJBTTFfU0hVVERPV04sCi0JCQkgICAgICAweDA1KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtZW1fdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBtZW1fdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JLyogTWFrZSBzdXJlIERlZXAgc2xlZXAgb2YgbWVtb3JpZXMgaXMgZW5hYmxlZCBmb3IgYWxsIGJhbmtzICovCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8wLCAweEZGKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9ERUVQU0xQXzEsIDB4MEYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2NudGxfZGlzYWJsZV9tZW1vcnkoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwKLQkJCQkgICAgZW51bSB3Y2RfbWVtX3R5cGUgbWVtX3R5cGUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0JdTggdmFsOwotCi0Jc3dpdGNoIChtZW1fdHlwZSkgewotCWNhc2UgV0NEX01FTV9UWVBFX0FMV0FZU19PTjoKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMSwKLQkJCSAgICAgIDB4RkYpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX1NZU01FTV9TSFVURE9XTl8wLAotCQkJICAgICAgMHhGRik7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX01FTV9UWVBFX1NXSVRDSEFCTEU6Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX1NIVVRET1dOXzMsCi0JCQkgICAgICAweEZGKTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fU0hVVERPV05fMiwKLQkJCSAgICAgIDB4RkYpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19QV1JfQ1BFX0RSQU0xX1NIVVRET1dOLAotCQkJICAgICAgMHgwNyk7Ci0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCwKLQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DUEVfU1NfU09DX1NXX0NPTExBUFNFX0NUTCk7Ci0JCWlmICh2YWwgJiAweDAyKQotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogRGlzYWJsZSBzd2l0Y2hhYmxlIGZhaWxlZCwgdmFsID0gMHglMDJ4IiwKLQkJCQlfX2Z1bmNfXywgdmFsKTsKLQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1RFU1RfREVCVUdfTUVNX0NUUkwsCi0JCQkJICAgIDB4ODAsIDB4MDApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtZW1fdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBtZW1fdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1BXUl9DUEVfU1lTTUVNX0RFRVBTTFBfMCwgMHhGRik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfUFdSX0NQRV9TWVNNRU1fREVFUFNMUF8xLCAweDBGKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2NudGxfZG9fc2h1dGRvd24oc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKLQotCS8qIERpc2FibGUgV0RPRyAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1dET0dfQ0ZHLAotCQkJICAgIDB4M0YsIDB4MDEpOwotCi0JLyogUHV0IFdEU1AgaW4gcmVzZXQgc3RhdGUgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19DUEVfQ1RMLAotCQkJICAgIDB4MDIsIDB4MDApOwotCi0JLyogSWYgRFNQIHRyYW5zaXRpb25zIGZyb20gYm9vdCB0byBzaHV0ZG93biwgdGhlbiB2b3RlIGZvciBTVlMgKi8KLQlpZiAoY250bC0+aXNfd2RzcF9ib290ZWQpCi0JCWNudGwtPmNkY19jYi0+Y2RjX3ZvdGVfc3ZzKGNvZGVjLCB0cnVlKTsKLQljbnRsLT5pc193ZHNwX2Jvb3RlZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHdjZF9jbnRsX2RvX2Jvb3Qoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogRGVidWcgbW9kZSBpcyBzZXQgZnJvbSBkZWJ1Z2ZzIGZpbGUgbm9kZS4gSWYgZGVidWdfbW9kZQotCSAqIGlzIHNldCwgdGhlbiBkbyBub3QgY29uZmlndXJlIHRoZSB3YXRjaGRvZyB0aW1lci4gVGhpcwotCSAqIHdpbGwgYmUgcmVxdWlyZWQgZm9yIGRlYnVnZ2luZyB0aGUgRFNQIGZpcm13YXJlLgotCSAqLwotCWlmIChjbnRsLT5kZWJ1Z19tb2RlKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1dET0dfQ0ZHLAotCQkJCSAgICAweDNGLCAweDAxKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRywKLQkJCQkgICAgMHgzRiwgMHgyMSk7Ci0JfQotCi0JLyogTWFrZSBzdXJlIGFsbCB0aGUgZXJyb3IgaW50ZXJydXB0cyBhcmUgY2xlYXJlZCAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9DTEVBUl8wQSwgMHhGRik7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX0NMRUFSXzBCLCAweEZGKTsKLQotCXJlaW5pdF9jb21wbGV0aW9uKCZjbnRsLT5ib290X2NvbXBsZXRlKTsKLQotCS8qIFJlbW92ZSBXRFNQIG91dCBvZiByZXNldCAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0NQRV9DVEwsCi0JCQkgICAgMHgwMiwgMHgwMik7Ci0KLQkvKgotCSAqIEluIGRlYnVnIG1vZGUsIERTUCBtYXkgbm90IGJvb3QgdXAgbm9ybWFsbHksCi0JICogd2FpdCBpbmRlZmluaXRlbHkgZm9yIERTUCB0byBib290LgotCSAqLwotCWlmIChjbnRsLT5kZWJ1Z19tb2RlKSB7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNudGwtPmJvb3RfY29tcGxldGUpOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogV0RTUCBib290ZWQgaW4gZGJnIG1vZGVcbiIsIF9fZnVuY19fKTsKLQkJY250bC0+aXNfd2RzcF9ib290ZWQgPSB0cnVlOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQm9vdCBpbiBub3JtYWwgbW9kZSAqLwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY250bC0+Ym9vdF9jb21wbGV0ZSwKLQkJCQltc2Vjc190b19qaWZmaWVzKFdDRF9EU1BfQk9PVF9USU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFdEU1AgYm9vdCB0aW1lZCBvdXRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZXJyX2Jvb3Q7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogUmUtaW5pdGlhbGl6ZSB0aGUgcmV0dXJuIGNvZGUgdG8gMCwgYXMgaW4gc3VjY2VzcyBjYXNlLAotCQkgKiBpdCB3aWxsIGhvbGQgdGhlIHJlbWFpbmluZyB0aW1lIGZvciBjb21wbGV0aW9uIHRpbWVvdXQKLQkJICovCi0JCXJldCA9IDA7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFdEU1AgYm9vdGVkIGluIG5vcm1hbCBtb2RlXG4iLCBfX2Z1bmNfXyk7Ci0JY250bC0+aXNfd2RzcF9ib290ZWQgPSB0cnVlOwotCi0JLyogRW5hYmxlIFdET0cgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19XRE9HX0NGRywKLQkJCSAgICAweDEwLCAweDEwKTsKLWRvbmU6Ci0JLyogSWYgZHNwIGJvb3RlZCB1cCwgdGhlbiByZW1vdmUgdm90ZSBvbiBTVlMgKi8KLQlpZiAoY250bC0+aXNfd2RzcF9ib290ZWQpCi0JCWNudGwtPmNkY19jYi0+Y2RjX3ZvdGVfc3ZzKGNvZGVjLCBmYWxzZSk7Ci0KLQlyZXR1cm4gcmV0OwotZXJyX2Jvb3Q6Ci0JLyogY2FsbCBzaHV0ZG93biB0byBwZXJmb3JtIGNsZWFudXAgKi8KLQl3Y2RfY250bF9kb19zaHV0ZG93bihjbnRsKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2NkX2NudGxfaXBjX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwgPSBkYXRhOwotCWludCByZXQ7Ci0KLQljb21wbGV0ZSgmY250bC0+Ym9vdF9jb21wbGV0ZSk7Ci0KLQlpZiAoY250bC0+bV9kZXYgJiYgY250bC0+bV9vcHMgJiYKLQkgICAgY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKQotCQlyZXQgPSBjbnRsLT5tX29wcy0+c2lnbmFsX2hhbmRsZXIoY250bC0+bV9kZXYsIFdEU1BfSVBDMV9JTlRSLAotCQkJCQkJICBOVUxMKTsKLQllbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gaGFuZGxlIGlycSAlZFxuIiwgX19mdW5jX18sIGlycSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB3Y2RfY250bF9lcnJfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IGRhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0Jc3RydWN0IHdkc3BfZXJyX3NpZ25hbF9hcmcgYXJnOwotCXUxNiBzdGF0dXMgPSAwOwotCXU4IHJlZ192YWw7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfU1RBVFVTXzBBKTsKLQlzdGF0dXMgPSBzdGF0dXMgfCByZWdfdmFsOwotCi0JcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX1NUQVRVU18wQik7Ci0Jc3RhdHVzID0gc3RhdHVzIHwgKHJlZ192YWwgPDwgOCk7Ci0KLQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IGVycm9yIGludGVycnVwdCBzdGF0dXMgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQotCWlmICgoc3RhdHVzICYgY250bC0+aXJxcy5mYXRhbF9pcnFzKSAmJgotCSAgICAoY250bC0+bV9kZXYgJiYgY250bC0+bV9vcHMgJiYgY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKSkgewotCQlhcmcubWVtX2R1bXBzX2VuYWJsZWQgPSBjbnRsLT5yYW1kdW1wX2VuYWJsZTsKLQkJYXJnLnJlbW90ZV9zdGFydF9hZGRyID0gV0NEXzkzNFhfUkFNRFVNUF9TVEFSVF9BRERSOwotCQlhcmcuZHVtcF9zaXplID0gV0NEXzkzNFhfUkFNRFVNUF9TSVpFOwotCQlyZXQgPSBjbnRsLT5tX29wcy0+c2lnbmFsX2hhbmRsZXIoY250bC0+bV9kZXYsIFdEU1BfRVJSX0lOVFIsCi0JCQkJCQkgICZhcmcpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBoYW5kbGUgZmF0YWwgaXJxIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHN0YXR1cyAmIGNudGwtPmlycXMuZmF0YWxfaXJxcyk7Ci0JCXdjZF9jbnRsX2NoYW5nZV9vbmxpbmVfc3RhdGUoY250bCwgMCk7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgc2lnbmFsX2hhbmRsZXJcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHdjZF9jb250cm9sX2hhbmRsZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEsCi0JCQkgICAgICAgZW51bSB3ZHNwX2V2ZW50X3R5cGUgZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHByaXZfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFdEU1BfRVZFTlRfUE9TVF9JTklUOgotCWNhc2UgV0RTUF9FVkVOVF9QT1NUX0RMT0FEX0NPREU6Ci0JY2FzZSBXRFNQX0VWRU5UX0RMT0FEX0ZBSUxFRDoKLQljYXNlIFdEU1BfRVZFTlRfUE9TVF9TSFVURE9XTjoKLQotCQkvKiBEaXNhYmxlIENQQVIgKi8KLQkJd2NkX2NudGxfY3Bhcl9jdHJsKGNudGwsIGZhbHNlKTsKLQkJLyogRGlzYWJsZSBhbGwgdGhlIGNsb2NrcyAqLwotCQlyZXQgPSB3Y2RfY250bF9jbG9ja3NfZGlzYWJsZShjbnRsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBjbG9ja3MsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCi0JCWlmIChldmVudCA9PSBXRFNQX0VWRU5UX1BPU1RfRExPQURfQ09ERSkKLQkJCS8qIE1hcmsgRFNQIG9ubGluZSBzaW5jZSBjb2RlIGRvd25sb2FkIGlzIGNvbXBsZXRlICovCi0JCQl3Y2RfY250bF9jaGFuZ2Vfb25saW5lX3N0YXRlKGNudGwsIDEpOwotCQlicmVhazsKLQotCWNhc2UgV0RTUF9FVkVOVF9QUkVfRExPQURfREFUQToKLQljYXNlIFdEU1BfRVZFTlRfUFJFX0RMT0FEX0NPREU6Ci0KLQkJLyogRW5hYmxlIGFsbCB0aGUgY2xvY2tzICovCi0JCXJldCA9IHdjZF9jbnRsX2Nsb2Nrc19lbmFibGUoY250bCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNsb2NrcywgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkvKiBFbmFibGUgQ1BBUiAqLwotCQl3Y2RfY250bF9jcGFyX2N0cmwoY250bCwgdHJ1ZSk7Ci0KLQkJaWYgKGV2ZW50ID09IFdEU1BfRVZFTlRfUFJFX0RMT0FEX0NPREUpCi0JCQl3Y2RfY250bF9lbmFibGVfbWVtb3J5KGNudGwsIFdDRF9NRU1fVFlQRV9BTFdBWVNfT04pOwotCQllbHNlIGlmIChldmVudCA9PSBXRFNQX0VWRU5UX1BSRV9ETE9BRF9EQVRBKQotCQkJd2NkX2NudGxfZW5hYmxlX21lbW9yeShjbnRsLCBXQ0RfTUVNX1RZUEVfU1dJVENIQUJMRSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBXRFNQX0VWRU5UX0RPX0JPT1Q6Ci0KLQkJcmV0ID0gd2NkX2NudGxfZG9fYm9vdChjbnRsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBXRFNQIGJvb3QgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdEU1BfRVZFTlRfRE9fU0hVVERPV046Ci0KLQkJd2NkX2NudGxfZG9fc2h1dGRvd24oY250bCk7Ci0JCXdjZF9jbnRsX2Rpc2FibGVfbWVtb3J5KGNudGwsIFdDRF9NRU1fVFlQRV9TV0lUQ0hBQkxFKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdW5oYW5kbGVkIGV2ZW50ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50KTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY250bF9zeXNmc19pbml0KGNoYXIgKmRpciwgc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjbnRsLT53Y2Rfa29iaiwgJndjZF9jbnRsX2t0eXBlLAotCQkJCSAgIGtlcm5lbF9rb2JqLCBkaXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGFkZCBrb2JqZWN0ICVzLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkaXIsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmY250bC0+d2NkX2tvYmosICZjbnRsX2F0dHJfYm9vdC5hdHRyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBhZGQgd2RzcF9ib290IHN5c2ZzIGVudHJ5IHRvICVzXG4iLAotCQkJX19mdW5jX18sIGRpcik7Ci0JCWdvdG8gZmFpbF9jcmVhdGVfZmlsZTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi1mYWlsX2NyZWF0ZV9maWxlOgotCWtvYmplY3RfcHV0KCZjbnRsLT53Y2Rfa29iaik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbnRsX3N5c2ZzX3JlbW92ZShzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsKQotewotCXN5c2ZzX3JlbW92ZV9maWxlKCZjbnRsLT53Y2Rfa29iaiwgJmNudGxfYXR0cl9ib290LmF0dHIpOwotCWtvYmplY3RfcHV0KCZjbnRsLT53Y2Rfa29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbnRsX2RlYnVnZnNfaW5pdChjaGFyICpkaXIsIHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0KLQljbnRsLT5lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXIsIE5VTEwpOwotCWlmIChJU19FUlJfT1JfTlVMTChkaXIpKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzIGRlYnVnZnNfY3JlYXRlX2RpciBmYWlsZWQgZm9yICVzXG4iLAotCQkJX19mdW5jX18sIGRpcik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoImRlYnVnX21vZGUiLCAwNjQ0LAotCQkJICAgY250bC0+ZW50cnksICZjbnRsLT5kZWJ1Z19tb2RlKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJyYW1kdW1wX2VuYWJsZSIsIDA2NDQsCi0JCQkgICAgY250bC0+ZW50cnksICZjbnRsLT5yYW1kdW1wX2VuYWJsZSk7Ci1kb25lOgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2NudGxfZGVidWdmc19yZW1vdmUoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKLXsKLQlpZiAoY250bCkKLQkJZGVidWdmc19yZW1vdmUoY250bC0+ZW50cnkpOwotfQotCi1zdGF0aWMgaW50IHdjZF9taXNjZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQotewotCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwgPSBjb250YWluZXJfb2YoZmlsZXAtPnByaXZhdGVfZGF0YSwKLQkJCQkJCSBzdHJ1Y3Qgd2NkX2RzcF9jbnRsLCBtaXNjZGV2KTsKLQlpZiAoIWNudGwtPm1fZGV2IHx8ICFjbnRsLT5tX29wcyB8fAotCSAgICAhY250bC0+bV9vcHMtPnZvdGVfZm9yX2RzcCkgewotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsCi0JCQkiJXM6IERTUCBub3QgcmVhZHkgdG8gYm9vdFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIERTUCB1c2VycyBnb2VzIHRvIHplcm8gdXBvbiBjbG9zaW5nIGRldiBub2RlICovCi0Jd2hpbGUgKGNudGwtPmJvb3RfcmVxcyA+IDApIHsKLQkJY250bC0+bV9vcHMtPnZvdGVfZm9yX2RzcChjbnRsLT5tX2RldiwgZmFsc2UpOwotCQljbnRsLT5ib290X3JlcXMtLTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3Qgd2NkX21pc2NkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGVwLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsID0gY29udGFpbmVyX29mKGZpbGVwLT5wcml2YXRlX2RhdGEsCi0JCQkJCQkgc3RydWN0IHdjZF9kc3BfY250bCwgbWlzY2Rldik7Ci0JY2hhciB2YWxbY291bnRdOwotCWJvb2wgdm90ZTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjb3VudCA9PSAwIHx8IGNvdW50ID4gMikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvdW50ID0gJXpkXG4iLCBfX2Z1bmNfXywgY291bnQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gY29weV9mcm9tX3VzZXIodmFsLCB1YnVmLCBjb3VudCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAotCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodmFsWzBdID09ICcxJykgewotCQljbnRsLT5ib290X3JlcXMrKzsKLQkJdm90ZSA9IHRydWU7Ci0JfSBlbHNlIGlmICh2YWxbMF0gPT0gJzAnKSB7Ci0JCWlmIChjbnRsLT5ib290X3JlcXMgPT0gMCkgewotCQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LAotCQkJCSIlczogV0RTUCBhbHJlYWR5IGRpc2FibGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWNudGwtPmJvb3RfcmVxcy0tOwotCQl2b3RlID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihjbnRsLT5jb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgdmFsdWUgJXNcbiIsCi0JCQlfX2Z1bmNfXywgdmFsKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWRldl9kYmcoY250bC0+Y29kZWMtPmRldiwKLQkJIiVzOiBib290ZWQgPSAlcywgcmVmX2NudCA9ICVkLCB2b3RlID0gJXNcbiIsCi0JCV9fZnVuY19fLCBjbnRsLT5pc193ZHNwX2Jvb3RlZCA/ICJ0cnVlIiA6ICJmYWxzZSIsCi0JCWNudGwtPmJvb3RfcmVxcywgdm90ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JaWYgKGNudGwtPm1fZGV2ICYmIGNudGwtPm1fb3BzICYmCi0JICAgIGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3ApCi0JCXJldCA9IGNudGwtPm1fb3BzLT52b3RlX2Zvcl9kc3AoY250bC0+bV9kZXYsIHZvdGUpOwotCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKLWRvbmU6Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQllbHNlCi0JCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2NkX21pc2NkZXZfZm9wcyA9IHsKLQkud3JpdGUgPSB3Y2RfbWlzY2Rldl93cml0ZSwKLQkucmVsZWFzZSA9IHdjZF9taXNjZGV2X3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHdjZF9jbnRsX21pc2NkZXZfY3JlYXRlKHN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwpCi17Ci0Jc25wcmludGYoY250bC0+bWlzY2Rldl9uYW1lLCBBUlJBWV9TSVpFKGNudGwtPm1pc2NkZXZfbmFtZSksCi0JCSJ3Y2RfZHNwJXVfY29udHJvbCIsIGNudGwtPmRzcF9pbnN0YW5jZSk7Ci0JY250bC0+bWlzY2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKLQljbnRsLT5taXNjZGV2Lm5hbWUgPSBjbnRsLT5taXNjZGV2X25hbWU7Ci0JY250bC0+bWlzY2Rldi5mb3BzID0gJndjZF9taXNjZGV2X2ZvcHM7Ci0JY250bC0+bWlzY2Rldi5wYXJlbnQgPSBjbnRsLT5jb2RlYy0+ZGV2OwotCi0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmNudGwtPm1pc2NkZXYpOwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY250bF9taXNjZGV2X2Rlc3Ryb3koc3RydWN0IHdjZF9kc3BfY250bCAqY250bCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmNudGwtPm1pc2NkZXYpOwotfQotCi1zdGF0aWMgaW50IHdjZF9jb250cm9sX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwcml2X2RhdGEpCi17Ci0Jc3RydWN0IHdjZF9kc3BfY250bCAqY250bCA9IHByaXZfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjbnRsLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0gJndjZDl4eHgtPmNvcmVfcmVzOwotCWludCByZXQ7Ci0JYm9vbCBlcnJfaXJxX3JlcXVlc3RlZCA9IGZhbHNlOwotCi0JcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywKLQkJCQkgIGNudGwtPmlycXMuY3BlX2lwYzFfaXJxLAotCQkJCSAgd2NkX2NudGxfaXBjX2lycSwgIkNQRSBJUEMxIiwKLQkJCQkgIGNudGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIHJlcXVlc3QgY3BlIGlwYyBpcnEsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBVbm1hc2sgdGhlIGZhdGFsIGlycXMgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TU19FUlJPUl9JTlRfTUFTS18wQSwKLQkJICAgICAgfihjbnRsLT5pcnFzLmZhdGFsX2lycXMgJiAweEZGKSk7Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEIsCi0JCSAgICAgIH4oKGNudGwtPmlycXMuZmF0YWxfaXJxcyA+PiA4KSAmIDB4RkYpKTsKLQotCS8qCi0JICogQ1BFIEVSUiBpcnEgaXMgdXNlZCBvbmx5IGZvciBlcnJvciByZXBvcnRpbmcgZnJvbSBXQ0QgRFNQLAotCSAqIGV2ZW4gaWYgdGhpcyByZXF1ZXN0IGZhaWxzLCBEU1AgY2FuIGJlIGZ1bmN0aW9uIG5vcm1hbGx5LgotCSAqIENvbnRpbnVpbmcgd2l0aCBpbml0IGV2ZW4gaWYgdGhlIENQRSBFUlIgaXJxIHJlcXVlc3QgZmFpbHMuCi0JICovCi0JaWYgKHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsIGNudGwtPmlycXMuY3BlX2Vycl9pcnEsCi0JCQkJd2NkX2NudGxfZXJyX2lycSwgIkNQRSBFUlIiLCBjbnRsKSkKLQkJZGV2X2luZm8oY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgcmVxdWVzdF9pcnEoY3BlX2Vycl9pcnEpIiwKLQkJCV9fZnVuY19fKTsKLQllbHNlCi0JCWVycl9pcnFfcmVxdWVzdGVkID0gdHJ1ZTsKLQotCi0JLyogRW5hYmxlIGFsbCB0aGUgY2xvY2tzICovCi0JcmV0ID0gd2NkX2NudGxfY2xvY2tzX2VuYWJsZShjbnRsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRmFpbGVkIHRvIGVuYWJsZSBjbG9ja3MsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2Nsa19lbmFibGU7Ci0JfQotCXdjZF9jbnRsX2NwYXJfY3RybChjbnRsLCB0cnVlKTsKLQotCXJldHVybiAwOwotCi1lcnJfY2xrX2VuYWJsZToKLQkvKiBNYXNrIGFsbCBlcnJvciBpbnRlcnJ1cHRzICovCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEsIDB4RkYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCLCAweEZGKTsKLQotCS8qIEZyZWUgdGhlIGlycSdzIHJlcXVlc3RlZCAqLwotCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIGNudGwtPmlycXMuY3BlX2lwYzFfaXJxLCBjbnRsKTsKLQotCWlmIChlcnJfaXJxX3JlcXVlc3RlZCkKLQkJd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywgY250bC0+aXJxcy5jcGVfZXJyX2lycSwgY250bCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NvbnRyb2xfZGVpbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHJpdl9kYXRhKQotewotCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGwgPSBwcml2X2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY250bC0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9ICZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQotCXdjZF9jbnRsX2Nsb2Nrc19kaXNhYmxlKGNudGwpOwotCXdjZF9jbnRsX2NwYXJfY3RybChjbnRsLCBmYWxzZSk7Ci0KLQkvKiBNYXNrIGFsbCBlcnJvciBpbnRlcnJ1cHRzICovCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1NfRVJST1JfSU5UX01BU0tfMEEsIDB4RkYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NTX0VSUk9SX0lOVF9NQVNLXzBCLCAweEZGKTsKLQotCS8qIEZyZWUgdGhlIGlycSdzIHJlcXVlc3RlZCAqLwotCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIGNudGwtPmlycXMuY3BlX2Vycl9pcnEsIGNudGwpOwotCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIGNudGwtPmlycXMuY3BlX2lwYzFfaXJxLCBjbnRsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHdkc3BfY21wbnRfb3BzIGNvbnRyb2xfb3BzID0gewotCS5pbml0ID0gd2NkX2NvbnRyb2xfaW5pdCwKLQkuZGVpbml0ID0gd2NkX2NvbnRyb2xfZGVpbml0LAotCS5ldmVudF9oYW5kbGVyID0gd2NkX2NvbnRyb2xfaGFuZGxlciwKLX07Ci0KLXN0YXRpYyBpbnQgd2NkX2N0cmxfY29tcG9uZW50X2JpbmQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKLQkJCQkgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3Y2RfZHNwX2NudGwgKmNudGw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwotCWNoYXIgcHJvY19uYW1lW1dDRF9QUk9DRlNfRU5UUllfTUFYX0xFTl07Ci0JY2hhciB3Y2RfY250bF9kaXJfbmFtZVtXQ0RfQ05UTF9ESVJfTkFNRV9MRU5fTUFYXTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghZGV2IHx8ICFtYXN0ZXIgfHwgIWRhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbWV0ZXJzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNudGwgPSB0YXZpbF9nZXRfd2NkX2RzcF9jbnRsKGRldik7Ci0JaWYgKCFjbnRsKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgY250bCByZWZlcmVuY2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNudGwtPm1fZGV2ID0gbWFzdGVyOwotCWNudGwtPm1fb3BzID0gZGF0YTsKLQotCWlmICghY250bC0+bV9vcHMtPnJlZ2lzdGVyX2NtcG50X29wcykgewotCQlkZXZfZXJyKGRldiwgIiVzOiBpbnZhbGlkIG1hc3RlciBjYWxsYmFjayByZWdpc3Rlcl9jbXBudF9vcHNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjbnRsLT5tX29wcy0+cmVnaXN0ZXJfY21wbnRfb3BzKG1hc3RlciwgZGV2LCBjbnRsLCAmY29udHJvbF9vcHMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICIlczogcmVnaXN0ZXJfY21wbnRfb3BzIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHdjZF9jbnRsX21pc2NkZXZfY3JlYXRlKGNudGwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IG1pc2MgZGV2IHJlZ2lzdGVyIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKHdjZF9jbnRsX2Rpcl9uYW1lLCBXQ0RfQ05UTF9ESVJfTkFNRV9MRU5fTUFYLAotCQkgIiVzJWQiLCAid2RzcCIsIGNudGwtPmRzcF9pbnN0YW5jZSk7Ci0JcmV0ID0gd2NkX2NudGxfc3lzZnNfaW5pdCh3Y2RfY250bF9kaXJfbmFtZSwgY250bCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogc3lzZnNfaW5pdCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3N5c2ZzX2luaXQ7Ci0JfQotCi0Jd2NkX2NudGxfZGVidWdmc19pbml0KHdjZF9jbnRsX2Rpcl9uYW1lLCBjbnRsKTsKLQotCWNvZGVjID0gY250bC0+Y29kZWM7Ci0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZC0+c25kX2NhcmQ7Ci0Jc25wcmludGYocHJvY19uYW1lLCBXQ0RfUFJPQ0ZTX0VOVFJZX01BWF9MRU4sICIlcyVkJXMiLCAiY3BlIiwKLQkJIGNudGwtPmRzcF9pbnN0YW5jZSwgIl9zdGF0ZSIpOwotCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgcHJvY19uYW1lLCBjYXJkLT5wcm9jX3Jvb3QpOwotCWlmICghZW50cnkpIHsKLQkJLyogRG8gbm90IHRyZWF0IHRoaXMgYXMgRmF0YWwgZXJyb3IgKi8KLQkJZGV2X2VycihkZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBwcm9jZnMgZW50cnkgJXNcbiIsCi0JCQlfX2Z1bmNfXywgcHJvY19uYW1lKTsKLQkJZ290byBlcnJfc3lzZnNfaW5pdDsKLQl9Ci0KLQljbnRsLT5zc3JfZW50cnkuZW50cnkgPSBlbnRyeTsKLQljbnRsLT5zc3JfZW50cnkub2ZmbGluZSA9IDE7Ci0JZW50cnktPnNpemUgPSBXQ0RfUFJPQ0ZTX0VOVFJZX01BWF9MRU47Ci0JZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKLQllbnRyeS0+Yy5vcHMgPSAmd2RzcF9zc3JfZW50cnlfb3BzOwotCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjbnRsOwotCXJldCA9IHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgZW50cnkgJXMsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHByb2NfbmFtZSwgcmV0KTsKLQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7Ci0JCS8qIExldCBiaW5kIHN0aWxsIGhhcHBlbiBldmVuIGlmIGNyZWF0aW5nIHRoZSBlbnRyeSBmYWlsZWQgKi8KLQkJcmV0ID0gMDsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci0KLWVycl9zeXNmc19pbml0OgotCXdjZF9jbnRsX21pc2NkZXZfZGVzdHJveShjbnRsKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY3RybF9jb21wb25lbnRfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCi0JCQkJICAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsOwotCi0JaWYgKCFkZXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWNudGwgPSB0YXZpbF9nZXRfd2NkX2RzcF9jbnRsKGRldik7Ci0JaWYgKCFjbnRsKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgY250bCByZWZlcmVuY2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljbnRsLT5tX2RldiA9IE5VTEw7Ci0JY250bC0+bV9vcHMgPSBOVUxMOwotCi0JLyogUmVtb3ZlIHRoZSBzeXNmcyBlbnRyaWVzICovCi0Jd2NkX2NudGxfc3lzZnNfcmVtb3ZlKGNudGwpOwotCi0JLyogUmVtb3ZlIHRoZSBkZWJ1Z2ZzIGVudHJpZXMgKi8KLQl3Y2RfY250bF9kZWJ1Z2ZzX3JlbW92ZShjbnRsKTsKLQotCS8qIFJlbW92ZSB0aGUgbWlzYyBkZXZpY2UgKi8KLQl3Y2RfY250bF9taXNjZGV2X2Rlc3Ryb3koY250bCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tcG9uZW50X29wcyB3Y2RfY3RybF9jb21wb25lbnRfb3BzID0gewotCS5iaW5kID0gd2NkX2N0cmxfY29tcG9uZW50X2JpbmQsCi0JLnVuYmluZCA9IHdjZF9jdHJsX2NvbXBvbmVudF91bmJpbmQsCi19OwotCi0vKgotICogd2NkX2RzcF9zc3JfZXZlbnQ6IGhhbmRsZSB0aGUgU1NSIGV2ZW50IHJhaXNlZCBieSBjYWxsZXIuCi0gKiBAY250bDogSGFuZGxlIHRvIHRoZSB3Y2RfZHNwX2NudGwgc3RydWN0dXJlCi0gKiBAZXZlbnQ6IFRoZSBTU1IgZXZlbnQgdG8gYmUgaGFuZGxlZAotICoKLSAqIE5vdGlmaWVzIHRoZSBtYW5hZ2VyIGRyaXZlciBhYm91dCB0aGUgU1NSIGV2ZW50LgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IuCi0gKi8KLWludCB3Y2RfZHNwX3Nzcl9ldmVudChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjbnRsLCBlbnVtIGNkY19zc3JfZXZlbnQgZXZlbnQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNudGwpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gY29udHJvbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWNudGwtPm1fZGV2IHx8ICFjbnRsLT5tX29wcyB8fCAhY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKSB7Ci0JCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBzaWduYWxfaGFuZGxlciBjYWxsYmFja1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBXQ0RfQ0RDX0RPV05fRVZFTlQ6Ci0JCXJldCA9IGNudGwtPm1fb3BzLT5zaWduYWxfaGFuZGxlcihjbnRsLT5tX2RldiwKLQkJCQkJCSAgV0RTUF9DRENfRE9XTl9TSUdOQUwsCi0JCQkJCQkgIE5VTEwpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKLQkJCQkiJXM6IFdEU1BfQ0RDX0RPV05fU0lHTkFMIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCXdjZF9jbnRsX2NoYW5nZV9vbmxpbmVfc3RhdGUoY250bCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0NEQ19VUF9FVkVOVDoKLQkJcmV0ID0gY250bC0+bV9vcHMtPnNpZ25hbF9oYW5kbGVyKGNudGwtPm1fZGV2LAotCQkJCQkJICBXRFNQX0NEQ19VUF9TSUdOQUwsCi0JCQkJCQkgIE5VTEwpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoY250bC0+Y29kZWMtPmRldiwKLQkJCQkiJXM6IFdEU1BfQ0RDX1VQX1NJR05BTCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNudGwtPmNvZGVjLT5kZXYsICIlczogSW52YWxpZCBldmVudCAlZFxuIiwKLQkJCV9fZnVuY19fLCBldmVudCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9kc3Bfc3NyX2V2ZW50KTsKLQotLyoKLSAqIHdjZF9kc3BfY250bF9pbml0OiBJbml0aWFsaXplIHRoZSB3Y2QtZHNwIGNvbnRyb2wKLSAqIEBjb2RlYzogcG9pbnRlciB0byB0aGUgY29kZWMgaGFuZGxlCi0gKiBAcGFyYW1zOiBQYXJhbWV0ZXJzIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgd2NkLWRzcCBjb250cm9sCi0gKgotICogVGhpcyBBUEkgaXMgZXhwZWN0ZWQgdG8gYmUgaW52b2tlZCBieSB0aGUgY29kZWMgZHJpdmVyIGFuZAotICogcHJvdmlkZSBpbmZvcm1hdGlvbiBlc3NlbnRpYWwgZm9yIHRoZSB3Y2QgZHNwIGNvbnRyb2wgdG8KLSAqIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZHNwCi0gKi8KLXZvaWQgd2NkX2RzcF9jbnRsX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkgICAgICAgc3RydWN0IHdjZF9kc3BfcGFyYW1zICpwYXJhbXMsCi0JCSAgICAgICBzdHJ1Y3Qgd2NkX2RzcF9jbnRsICoqY250bCkKLXsKLQlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjb250cm9sOwotCWludCByZXQ7Ci0KLQlpZiAoIWNvZGVjIHx8ICFwYXJhbXMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gJXNcbiIsIF9fZnVuY19fLAotCQkgICAgICAgKCFjb2RlYykgPyAiY29kZWMiIDogInBhcmFtcyIpOwotCQkqY250bCA9IE5VTEw7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKmNudGwpIHsKLQkJcHJfZXJyKCIlczogY250bCBpcyBub24gTlVMTCwgbWF5YmUgYWxyZWFkeSBpbml0aWFsaXplZCA/XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwYXJhbXMtPmNiIHx8ICFwYXJhbXMtPmNiLT5jZGNfY2xrX2VuIHx8Ci0JICAgICFwYXJhbXMtPmNiLT5jZGNfdm90ZV9zdnMpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBjbGtfZW4gYW5kIHZvdGVfc3ZzIGNhbGxiYWNrcyBtdXN0IGJlIHByb3ZpZGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JY29udHJvbCA9IGt6YWxsb2Moc2l6ZW9mKCpjb250cm9sKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoY29udHJvbCkpCi0JCXJldHVybjsKLQotCWNvbnRyb2wtPmNvZGVjID0gY29kZWM7Ci0JY29udHJvbC0+Y2xrX3JhdGUgPSBwYXJhbXMtPmNsa19yYXRlOwotCWNvbnRyb2wtPmNkY19jYiA9IHBhcmFtcy0+Y2I7Ci0JY29udHJvbC0+ZHNwX2luc3RhbmNlID0gcGFyYW1zLT5kc3BfaW5zdGFuY2U7Ci0JbWVtY3B5KCZjb250cm9sLT5pcnFzLCAmcGFyYW1zLT5pcnFzLCBzaXplb2YoY29udHJvbC0+aXJxcykpOwotCWluaXRfY29tcGxldGlvbigmY29udHJvbC0+Ym9vdF9jb21wbGV0ZSk7Ci0JbXV0ZXhfaW5pdCgmY29udHJvbC0+Y2xrX211dGV4KTsKLQltdXRleF9pbml0KCZjb250cm9sLT5zc3JfbXV0ZXgpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbnRyb2wtPnNzcl9lbnRyeS5vZmZsaW5lX3BvbGxfd2FpdCk7Ci0KLQkvKgotCSAqIFRoZSBkZWZhdWx0IHN0YXRlIG9mIFdEU1AgaXMgaW4gU1ZTIG1vZGUuCi0JICogVm90ZSBmb3IgU1ZTIG5vdywgdGhlIHZvdGUgd2lsbCBiZSByZW1vdmVkIG9ubHkKLQkgKiBhZnRlciBEU1AgaXMgYm9vdGVkIHVwLgotCSAqLwotCWNvbnRyb2wtPmNkY19jYi0+Y2RjX3ZvdGVfc3ZzKGNvZGVjLCB0cnVlKTsKLQotCS8qCi0JICogSWYgdGhpcyBpcyB0aGUgbGFzdCBjb21wb25lbnQgbmVlZGVkIGJ5IG1hc3RlciB0byBiZSByZWFkeSwKLQkgKiB0aGVuIGNvbXBvbmVudF9iaW5kIHdpbGwgYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29tcG9uZW50X2FkZC4KLQkgKiBIZW5jZSwgdGhlIGRhdGEgcG9pbnRlciBzaG91bGQgYmUgYXNzaWduZWQgYmVmb3JlIGNvbXBvbmVudF9hZGQsCi0JICogc28gdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGR1cmluZyB0aGlzIGNvbXBvbmVudCdzIGJpbmQgY2FsbC4KLQkgKi8KLQkqY250bCA9IGNvbnRyb2w7Ci0JcmV0ID0gY29tcG9uZW50X2FkZChjb2RlYy0+ZGV2LCAmd2NkX2N0cmxfY29tcG9uZW50X29wcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29tcG9uZW50X2FkZCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWtmcmVlKCpjbnRsKTsKLQkJKmNudGwgPSBOVUxMOwotCX0KLX0KLUVYUE9SVF9TWU1CT0wod2NkX2RzcF9jbnRsX2luaXQpOwotCi0vKgotICogd2NkX2RzcF9jbnRsX2RlaW5pdDogRGUtaW5pdGlhbGl6ZSB0aGUgd2NkLWRzcCBjb250cm9sCi0gKiBAY250bDogVGhlIHN0cnVjdCB3Y2RfZHNwX2NudGwgdG8gZGUtaW5pdGlhbGl6ZQotICoKLSAqIFRoaXMgQVBJIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIGNvZGVjIGRyaXZlcgotICogdG8gZGUtaW5pdGlhbGl6ZSB0aGUgd2NkIGRzcCBjb250cm9sCi0gKi8KLXZvaWQgd2NkX2RzcF9jbnRsX2RlaW5pdChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICoqY250bCkKLXsKLQlzdHJ1Y3Qgd2NkX2RzcF9jbnRsICpjb250cm9sID0gKmNudGw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCi0JLyogSWYgY29udHJvbCBpcyBOVUxMLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRlLWluaXRpYWxpemUgKi8KLQlpZiAoIWNvbnRyb2wpCi0JCXJldHVybjsKLQljb2RlYyA9IGNvbnRyb2wtPmNvZGVjOwotCi0JLyoKLQkgKiBDYWxsaW5nIHNodXRkb3duIHdpbGwgY2xlYW51cCBhbGwgcmVnaXN0ZXIgc3RhdGVzLAotCSAqIGlycmVzcGVjdGl2ZSBvZiBEU1Agd2FzIGJvb3RlZCB1cCBvciBub3QuCi0JICovCi0Jd2NkX2NudGxfZG9fc2h1dGRvd24oY29udHJvbCk7Ci0Jd2NkX2NudGxfZGlzYWJsZV9tZW1vcnkoY29udHJvbCwgV0NEX01FTV9UWVBFX1NXSVRDSEFCTEUpOwotCXdjZF9jbnRsX2Rpc2FibGVfbWVtb3J5KGNvbnRyb2wsIFdDRF9NRU1fVFlQRV9BTFdBWVNfT04pOwotCi0JY29tcG9uZW50X2RlbChjb2RlYy0+ZGV2LCAmd2NkX2N0cmxfY29tcG9uZW50X29wcyk7Ci0KLQltdXRleF9kZXN0cm95KCZjb250cm9sLT5jbGtfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJmNvbnRyb2wtPnNzcl9tdXRleCk7Ci0Ja2ZyZWUoKmNudGwpOwotCSpjbnRsID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX2RzcF9jbnRsX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc3AtY250bC5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtZHNwLWNudGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzNDYzOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1kc3AtY250bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1dDRDkzNFhfRFNQX0NOVExfSF9fCi0jZGVmaW5lIF9fV0NEOTM0WF9EU1BfQ05UTF9IX18KLQotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3djZC1kc3AtbWdyLmg+Ci0KLWVudW0gY2RjX3Nzcl9ldmVudCB7Ci0JV0NEX0NEQ19ET1dOX0VWRU5ULAotCVdDRF9DRENfVVBfRVZFTlQsCi19OwotCi1zdHJ1Y3Qgd2NkX2RzcF9jZGNfY2IgewotCS8qIENhbGxiYWNrIHRvIGVuYWJsZSBjb2RlYyBjbG9jayAqLwotCWludCAoKmNkY19jbGtfZW4pKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOwotCS8qIENhbGxiYWNrIHRvIHZvdGUgYW5kIHVudm90ZSBmb3IgU1ZTMiBtb2RlICovCi0Jdm9pZCAoKmNkY192b3RlX3N2cykoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwgYm9vbCk7Ci19OwotCi1zdHJ1Y3Qgd2NkX2RzcF9pcnFfaW5mbyB7Ci0JLyogSVBDIGludGVycnVwdCAqLwotCWludCBjcGVfaXBjMV9pcnE7Ci0KLQkvKiBDUEUgZXJyb3Igc3VtbWFyeSBpbnRlcnJ1cHQgKi8KLQlpbnQgY3BlX2Vycl9pcnE7Ci0KLQkvKgotCSAqIEJpdCBtYXNrIHRvIGluZGljYXRlIHdoaWNoIG9mIHRoZQotCSAqIGVycm9yIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQKLQkgKiBhcyBmYXRhbC4KLQkgKi8KLQl1MTYgZmF0YWxfaXJxczsKLX07Ci0KLXN0cnVjdCB3Y2RfZHNwX3BhcmFtcyB7Ci0Jc3RydWN0IHdjZF9kc3BfY2RjX2NiICpjYjsKLQlzdHJ1Y3Qgd2NkX2RzcF9pcnFfaW5mbyBpcnFzOwotCi0JLyogUmF0ZSBhdCB3aGljaCB0aGUgY29kZWMgY2xvY2sgb3BlcmF0ZXMgKi8KLQl1MzIgY2xrX3JhdGU7Ci0KLQkvKgotCSAqIFJlcHJlc2VudHMgdGhlIGRzcCBpbnN0YW5jZSwgd2lsbCBiZSB1c2VkCi0JICogdG8gY3JlYXRlIHN5c2ZzIGFuZCBkZWJ1Z2ZzIGVudHJpZXMgd2l0aAotCSAqIGRpcmVjdG9yeSB3ZHNwPGRzcC1pbnN0YW5jZT4KLQkgKi8KLQl1MzIgZHNwX2luc3RhbmNlOwotfTsKLQotc3RydWN0IHdkc3Bfc3NyX2VudHJ5IHsKLQl1OCBvZmZsaW5lOwotCXU4IG9mZmxpbmVfY2hhbmdlOwotCXdhaXRfcXVldWVfaGVhZF90IG9mZmxpbmVfcG9sbF93YWl0OwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Ci19OwotCi1zdHJ1Y3Qgd2NkX2RzcF9jbnRsIHsKLQkvKiBIYW5kbGUgdG8gY29kZWMgKi8KLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0KLQkvKiBDbGsgcmF0ZSBvZiB0aGUgY29kZWMgY2xvY2sgKi8KLQl1MzIgY2xrX3JhdGU7Ci0KLQkvKiBDYWxsYmFja3MgdG8gY29kZWMgZHJpdmVyICovCi0JY29uc3Qgc3RydWN0IHdjZF9kc3BfY2RjX2NiICpjZGNfY2I7Ci0KLQkvKiBDb21wbGV0aW9uIHRvIGluZGljYXRlIFdEU1AgYm9vdCBkb25lICovCi0Jc3RydWN0IGNvbXBsZXRpb24gYm9vdF9jb21wbGV0ZTsKLQotCXN0cnVjdCB3Y2RfZHNwX2lycV9pbmZvIGlycXM7Ci0JdTMyIGRzcF9pbnN0YW5jZTsKLQotCS8qIFN5c2ZzIGVudHJpZXMgcmVsYXRlZCAqLwotCWludCBib290X3JlcXM7Ci0Jc3RydWN0IGtvYmplY3Qgd2NkX2tvYmo7Ci0KLQkvKiBEZWJ1Z2ZzIHJlbGF0ZWQgKi8KLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKLQl1MzIgZGVidWdfbW9kZTsKLQlib29sIHJhbWR1bXBfZW5hYmxlOwotCi0JLyogV0RTUCBtYW5hZ2VyIGRyaXZlcnMgZGF0YSAqLwotCXN0cnVjdCBkZXZpY2UgKm1fZGV2OwotCXN0cnVjdCB3ZHNwX21ncl9vcHMgKm1fb3BzOwotCi0JLyogY2xrIHJlbGF0ZWQgKi8KLQlzdHJ1Y3QgbXV0ZXggY2xrX211dGV4OwotCWJvb2wgaXNfY2xrX2VuYWJsZWQ7Ci0KLQkvKiBLZWVwIHRyYWNrIG9mIFdEU1AgYm9vdCBzdGF0dXMgKi8KLQlib29sIGlzX3dkc3BfYm9vdGVkOwotCi0JLyogU1NSIHJlbGF0ZWQgKi8KLQlzdHJ1Y3Qgd2RzcF9zc3JfZW50cnkgc3NyX2VudHJ5OwotCXN0cnVjdCBtdXRleCBzc3JfbXV0ZXg7Ci0KLQkvKiBNaXNjIGRldmljZSByZWxhdGVkICovCi0JY2hhciBtaXNjZGV2X25hbWVbMjU2XTsKLQlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2OwotfTsKLQotdm9pZCB3Y2RfZHNwX2NudGxfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCSAgICAgICBzdHJ1Y3Qgd2NkX2RzcF9wYXJhbXMgKnBhcmFtcywKLQkJICAgICAgIHN0cnVjdCB3Y2RfZHNwX2NudGwgKipjbnRsKTsKLXZvaWQgd2NkX2RzcF9jbnRsX2RlaW5pdChzdHJ1Y3Qgd2NkX2RzcF9jbnRsICoqY250bCk7Ci1pbnQgd2NkX2RzcF9zc3JfZXZlbnQoc3RydWN0IHdjZF9kc3BfY250bCAqY250bCwgZW51bSBjZGNfc3NyX2V2ZW50IGV2ZW50KTsKLSNlbmRpZiAvKiBlbmQgX19XQ0RfRFNQX0NPTlRST0xfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNmU3YTEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtbWJoYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+Ci0jaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgIndjZDkzNHguaCIKLSNpbmNsdWRlICJ3Y2Q5MzR4LW1iaGMuaCIKLSNpbmNsdWRlICIuLi93Y2RjYWwtaHdkZXAuaCIKLSNpbmNsdWRlICIuLi93Y2QtbWJoYy12Mi1hcGkuaCIKLQotI2RlZmluZSBUQVZJTF9aREVUX1NVUFBPUlRFRCAgICAgICAgICB0cnVlCi0vKiBaIHZhbHVlIGRlZmluZWQgaW4gbWlsbGlvaG0gKi8KLSNkZWZpbmUgVEFWSUxfWkRFVF9WQUxfMzIgICAgICAgICAgICAgMzIwMDAKLSNkZWZpbmUgVEFWSUxfWkRFVF9WQUxfNDAwICAgICAgICAgICAgNDAwMDAwCi0jZGVmaW5lIFRBVklMX1pERVRfVkFMXzEyMDAgICAgICAgICAgIDEyMDAwMDAKLSNkZWZpbmUgVEFWSUxfWkRFVF9WQUxfMTAwSyAgICAgICAgICAgMTAwMDAwMDAwCi0vKiBaIGZsb2F0aW5nIGRlZmluZWQgaW4gb2htcyAqLwotI2RlZmluZSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSAweDBGRkZGRkZFCi0KLSNkZWZpbmUgVEFWSUxfWkRFVF9OVU1fTUVBU1VSRU1FTlRTICAgOTAwCi0jZGVmaW5lIFRBVklMX01CSENfR0VUX0MxKGMpICAgICAgICAgICgoYyAmIDB4QzAwMCkgPj4gMTQpCi0jZGVmaW5lIFRBVklMX01CSENfR0VUX1gxKHgpICAgICAgICAgICh4ICYgMHgzRkZGKQotLyogWiB2YWx1ZSBjb21wYXJlZCBpbiBtaWxsaU9obSAqLwotI2RlZmluZSBUQVZJTF9NQkhDX0lTX1NFQ09ORF9SQU1QX1JFUVVJUkVEKHopICgoeiA+IDQwMDAwMCkgfHwgKHogPCAzMjAwMCkpCi0jZGVmaW5lIFRBVklMX01CSENfWkRFVF9DT05TVCAgICAgICAgICg4NiAqIDE2Mzg0KQotI2RlZmluZSBUQVZJTF9NQkhDX01PSVNUVVJFX1JSRUYgICAgICBSXzI0X0tPSE0KLQotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19yZWdpc3RlcgotCXdjZF9tYmhjX3JlZ2lzdGVyc1tXQ0RfTUJIQ19SRUdfRlVOQ19NQVhdID0gewotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19MX0RFVF9FTiIsCi0JCQkgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0dORF9ERVRfRU4iLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4NDAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NRUNIX0RFVEVDVElPTl9UWVBFIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDX0NMQU1QX0NUTCIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfUExVR19ERVRFQ1RfQ1RMLCAweDMwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRUxFQ1RfREVURUNUSU9OX1RZUEUiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAweDA4LCAzLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFNfTF9ERVRfUFVMTF9VUF9DVFJMIiwKLQkJCSAgV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwsIDB4QzAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19MX0RFVF9QVUxMX1VQX0NPTVBfQ1RSTCIsCi0JCQkgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHgwNCwgMiwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSExfUExVR19UWVBFIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19NRUNILCAweDEwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfR05EX1BMVUdfVFlQRSIsCi0JCQkgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHgwOCwgMywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX1NXX0hQSF9MUF8xMDBLX1RPX0dORCIsCi0JCQkgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHgwMSwgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0VMRUNUX1NDSE1UX0lTUkMiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAweDA2LCAxLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfRlNNX0VOIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0lOU1JFTV9EQk5DIiwKLQkJCSAgV0NEOTM0WF9NQkhDX05FV19QTFVHX0RFVEVDVF9DVEwsIDB4MEYsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fREJOQyIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsIDB4MDMsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IU19WUkVGIiwKLQkJCSAgV0NEOTM0WF9NQkhDX05FV19DVExfMiwgMHgwMywgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hTX0NPTVBfUkVTVUxUIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMywgMHgwOCwgMywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX01JQ19TQ0hNVF9SRVNVTFQiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDIwLCA1LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBITF9TQ0hNVF9SRVNVTFQiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDgwLCA3LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9TQ0hNVF9SRVNVTFQiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDQwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfT0NQX0ZTTV9FTiIsCi0JCQkgIFdDRDkzNFhfSFBIX09DUF9DVEwsIDB4MTAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19CVE5fUkVTVUxUIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMywgMHgwNywgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0JUTl9JU1JDX0NUTCIsCi0JCQkgIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsIDB4NzAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9SRVNVTFQiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweEZGLCAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTUlDQl9DVFJMIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUlDQjIsIDB4QzAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhfQ05QX1dHX1RJTUUiLAotCQkJICBXQ0Q5MzRYX0hQSF9DTlBfV0dfVElNRSwgMHhGRiwgMCwgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0hQSFJfUEFfRU4iLAotCQkJICBXQ0Q5MzRYX0FOQV9IUEgsIDB4NDAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX1BBX0VOIiwKLQkJCSAgV0NEOTM0WF9BTkFfSFBILCAweDgwLCA3LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIX1BBX0VOIiwKLQkJCSAgV0NEOTM0WF9BTkFfSFBILCAweEMwLCA2LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfU1dDSF9MRVZFTF9SRU1PVkUiLAotCQkJICBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zLCAweDEwLCA0LCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfUFVMTERPV05fQ1RSTCIsCi0JCQkgIDAsIDAsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BTkNfREVUX0VOIiwKLQkJCSAgV0NEOTM0WF9NQkhDX0NUTF9CQ1MsIDB4MDIsIDEsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19GU01fU1RBVFVTIiwKLQkJCSAgV0NEOTM0WF9NQkhDX1NUQVRVU19TUEFSRV8xLCAweDAxLCAwLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfTVVYX0NUTCIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsIDB4NzAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX09DUF9ERVRfRU4iLAotCQkJICBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhSX09DUF9ERVRfRU4iLAotCQkJICBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19IUEhMX09DUF9TVEFUVVMiLAotCQkJICBXQ0Q5MzRYX0lOVFJfUElOMV9TVEFUVVMwLCAweDA0LCAyLCAwKSwKLQlXQ0RfTUJIQ19SRUdJU1RFUigiV0NEX01CSENfSFBIUl9PQ1BfU1RBVFVTIiwKLQkJCSAgV0NEOTM0WF9JTlRSX1BJTjFfU1RBVFVTMCwgMHgwOCwgMywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0FEQ19FTiIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsIDB4MDgsIDMsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BRENfQ09NUExFVEUiLCBXQ0Q5MzRYX01CSENfTkVXX0ZTTV9TVEFUVVMsCi0JCQkgIDB4NDAsIDYsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BRENfVElNRU9VVCIsIFdDRDkzNFhfTUJIQ19ORVdfRlNNX1NUQVRVUywKLQkJCSAgMHg4MCwgNywgMCksCi0JV0NEX01CSENfUkVHSVNURVIoIldDRF9NQkhDX0FEQ19SRVNVTFQiLCBXQ0Q5MzRYX01CSENfTkVXX0FEQ19SRVNVTFQsCi0JCQkgIDB4RkYsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19NSUNCMl9WT1VUIiwgV0NEOTM0WF9BTkFfTUlDQjIsIDB4M0YsIDAsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19BRENfTU9ERSIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsIDB4MTAsIDQsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19ERVRFQ1RJT05fRE9ORSIsCi0JCQkgIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsIDB4MDQsIDIsIDApLAotCVdDRF9NQkhDX1JFR0lTVEVSKCJXQ0RfTUJIQ19FTEVDVF9JU1JDX0VOIiwKLQkJCSAgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAweDAyLCAxLCAwKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX21iaGNfaW50ciBpbnRyX2lkcyA9IHsKLQkubWJoY19zd19pbnRyID0gIFdDRDkzNFhfSVJRX01CSENfU1dfREVULAotCS5tYmhjX2J0bl9wcmVzc19pbnRyID0gV0NEOTM0WF9JUlFfTUJIQ19CVVRUT05fUFJFU1NfREVULAotCS5tYmhjX2J0bl9yZWxlYXNlX2ludHIgPSBXQ0Q5MzRYX0lSUV9NQkhDX0JVVFRPTl9SRUxFQVNFX0RFVCwKLQkubWJoY19oc19pbnNfaW50ciA9IFdDRDkzNFhfSVJRX01CSENfRUxFQ1RfSU5TX1JFTV9MRUdfREVULAotCS5tYmhjX2hzX3JlbV9pbnRyID0gV0NEOTM0WF9JUlFfTUJIQ19FTEVDVF9JTlNfUkVNX0RFVCwKLQkuaHBoX2xlZnRfb2NwID0gV0NEOTM0WF9JUlFfSFBIX1BBX09DUExfRkFVTFQsCi0JLmhwaF9yaWdodF9vY3AgPSBXQ0Q5MzRYX0lSUV9IUEhfUEFfT0NQUl9GQVVMVCwKLX07Ci0KLQotc3RhdGljIGNoYXIgb25fZGVtYW5kX3N1cHBseV9uYW1lW11bTUFYX09OX0RFTUFORF9TVVBQTFlfTkFNRV9MRU5HVEhdID0gewotCSJjZGMtdmRkLW1pYy1iaWFzIiwKLX07Ci0KLXN0cnVjdCB0YXZpbF9tYmhjX3pkZXRfcGFyYW0gewotCXUxNiBsZG9fY3RsOwotCXUxNiBub2ZmOwotCXUxNiBuc2hpZnQ7Ci0JdTE2IGJ0bjU7Ci0JdTE2IGJ0bjY7Ci0JdTE2IGJ0bjc7Ci19OwotCi1zdGF0aWMgaW50IHRhdmlsX21iaGNfcmVxdWVzdF9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJCSAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KLQkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7Ci0KLQlyZXR1cm4gd2NkOXh4eF9yZXF1ZXN0X2lycShjb3JlX3JlcywgaXJxLCBoYW5kbGVyLCBuYW1lLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfbWJoY19pcnFfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgaW50IGlycSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9Ci0JCQkJJndjZDl4eHgtPmNvcmVfcmVzOwotCWlmIChlbmFibGUpCi0JCXdjZDl4eHhfZW5hYmxlX2lycShjb3JlX3JlcywgaXJxKTsKLQllbHNlCi0JCXdjZDl4eHhfZGlzYWJsZV9pcnEoY29yZV9yZXMsIGlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfbWJoY19mcmVlX2lycShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICAgICAgaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KLQkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7Ci0KLQl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBpcnEsIGRhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9tYmhjX2Nsa19zZXR1cChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzEsCi0JCQkJICAgIDB4ODAsIDB4ODApOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19DVExfMSwKLQkJCQkgICAgMHg4MCwgMHgwMCk7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfbWJoY19idG5fdG9fbnVtKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX1JFU1VMVF8zKSAmIDB4NzsKLX0KLQotc3RhdGljIGludCB0YXZpbF9lbmFibGVfZXh0X21iX3NvdXJjZShzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsCi0JCQkJICAgICAgYm9vbCB0dXJuX29uKQotewotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYzsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOTM0eF9vbl9kZW1hbmRfc3VwcGx5ICpzdXBwbHk7Ci0JaW50IHJldCA9IDA7Ci0KLQl3Y2Q5MzR4X21iaGMgPSBjb250YWluZXJfb2YobWJoYywgc3RydWN0IHdjZDkzNHhfbWJoYywgd2NkX21iaGMpOwotCi0Jc3VwcGx5ID0gICZ3Y2Q5MzR4X21iaGMtPm9uX2RlbWFuZF9saXN0W1dDRDkzNFhfT05fREVNQU5EX01JQ0JJQVNdOwotCWlmICghc3VwcGx5LT5zdXBwbHkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHdhcm5pbmcgc3VwcGx5IG5vdCBwcmVzZW50IG9uZCBmb3IgJXNcbiIsCi0JCQkJX19mdW5jX18sICJvbkRlbWFuZCBNaWNiaWFzIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgdHVybl9vbjogJWQgY291bnQ6ICVkXG4iLCBfX2Z1bmNfXywgdHVybl9vbiwKLQkJc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQpOwotCi0JaWYgKHR1cm5fb24pIHsKLQkJaWYgKCEoc3VwcGx5LT5vbmRlbWFuZF9zdXBwbHlfY291bnQpKSB7Ci0JCQlyZXQgPSBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigKLQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKLQkJCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKLQkJfQotCQlzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCsrOwotCX0gZWxzZSB7Ci0JCWlmIChzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCA+IDApCi0JCQlzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudC0tOwotCQlpZiAoIShzdXBwbHktPm9uZGVtYW5kX3N1cHBseV9jb3VudCkpIHsKLQkJCXJldCA9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigKLQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkiTUlDQklBU19SRUdVTEFUT1IiKTsKLQkJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOwotCQl9Ci0JfQotCi0JaWYgKHJldCkKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byAlcyBleHRlcm5hbCBtaWNiaWFzIHNvdXJjZVxuIiwKLQkJCV9fZnVuY19fLCB0dXJuX29uID8gImVuYWJsZSIgOiAiZGlzYWJsZWQiKTsKLQllbHNlCi0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyBleHRlcm5hbCBtaWNiaWFzIHNvdXJjZVxuIiwKLQkJCV9fZnVuY19fLCB0dXJuX29uID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9tYmhjX21iaGNfYmlhc19jb250cm9sKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfRUxFQ1QsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCwKLQkJCQkgICAgMHgwMSwgMHgwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX21iaGNfcHJvZ3JhbV9idG5fdGhyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgICAgczE2ICpidG5fbG93LCBzMTYgKmJ0bl9oaWdoLAotCQkJCSAgICAgICBpbnQgbnVtX2J0biwgYm9vbCBpc19taWNiaWFzKQotewotCWludCBpOwotCWludCB2dGg7Ci0KLQlpZiAobnVtX2J0biA+IFdDRF9NQkhDX0RFRl9CVVRUT05TKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIG51bWJlciBvZiBidXR0b25zOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBudW1fYnRuKTsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIFRhdmlsIGp1c3QgbmVlZHMgb25lIHNldCBvZiB0aHJlc2hvbGRzIGZvciBidXR0b24gZGV0ZWN0aW9uCi0JICogZHVlIHRvIG1pY2JpYXMgdm9sdGFnZSByYW1wIHRvIHB1bGx1cCB1cG9uIGJ1dHRvbiBwcmVzcy4gU28KLQkgKiBidG5fbG93IGFuZCBpc19taWNiaWFzIGFyZSBpZ25vcmVkIGFuZCBhbHdheXMgcHJvZ3JhbSBidXR0b24KLQkgKiB0aHJlc2hvbGRzIHVzaW5nIGJ0bl9oaWdoLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fYnRuOyBpKyspIHsKLQkJdnRoID0gKChidG5faGlnaFtpXSAqIDIpIC8gMjUpICYgMHgzRjsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE4wICsgaSwKLQkJCQkgICAgMHhGQywgdnRoIDw8IDIpOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYnRuX2hpZ2hbJWRdOiAlZCwgdnRoOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBpLCBidG5faGlnaFtpXSwgdnRoKTsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIHRhdmlsX21iaGNfbG9ja19zbGVlcChzdHJ1Y3Qgd2NkX21iaGMgKm1iaGMsIGJvb2wgbG9jaykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KLQkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7Ci0JYm9vbCByZXQgPSAwOwotCi0JaWYgKGxvY2spCi0JCXJldCA9IHdjZDl4eHhfbG9ja19zbGVlcChjb3JlX3Jlcyk7Ci0JZWxzZQotCQl3Y2Q5eHh4X3VubG9ja19zbGVlcChjb3JlX3Jlcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX21iaGNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5ibG9jaywKLQkJCQkJYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHdjZDkzNHhfbWJoYyAqd2NkOTM0eF9tYmhjOwotCi0Jd2NkOTM0eF9tYmhjID0gY29udGFpbmVyX29mKG1iaGMsIHN0cnVjdCB3Y2Q5MzR4X21iaGMsIHdjZF9tYmhjKTsKLQotCWlmIChlbmFibGUpCi0JCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3Rlcigmd2NkOTM0eF9tYmhjLT5ub3RpZmllciwKLQkJCQkJCQluYmxvY2spOwotCWVsc2UKLQkJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoCi0JCQkJJndjZDkzNHhfbWJoYy0+bm90aWZpZXIsIG5ibG9jayk7Ci19Ci0KLXN0YXRpYyBib29sIHRhdmlsX21iaGNfbWljYl9lbl9zdGF0dXMoc3RydWN0IHdjZF9tYmhjICptYmhjLCBpbnQgbWljYl9udW0pCi17Ci0JdTggdmFsOwotCi0JaWYgKG1pY2JfbnVtID09IE1JQ19CSUFTXzIpIHsKLQkJdmFsID0gKHNuZF9zb2NfcmVhZChtYmhjLT5jb2RlYywgV0NEOTM0WF9BTkFfTUlDQjIpID4+IDYpOwotCQlpZiAodmFsID09IDB4MDEpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCB0YXZpbF9tYmhjX2hwaF9wYV9vbl9zdGF0dXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXJldHVybiAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0FOQV9IUEgpICYgMHhDMCkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX21iaGNfaHBoX2xfcHVsbF91cF9jb250cm9sKAotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCWVudW0gbWJoY19oc19wdWxsdXBfaXJlZiBwdWxsX3VwX2N1cikKLXsKLQkvKiBEZWZhdWx0IHB1bGwgdXAgY3VycmVudCB0byAydUEgKi8KLQlpZiAocHVsbF91cF9jdXIgPCBJX09GRiB8fCBwdWxsX3VwX2N1ciA+IElfM1AwX1VBIHx8Ci0JICAgIHB1bGxfdXBfY3VyID09IElfREVGQVVMVCkKLQkJcHVsbF91cF9jdXIgPSBJXzJQMF9VQTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBIUyBwdWxsIHVwIGN1cnJlbnQ6JWRcbiIsCi0JCV9fZnVuY19fLCBwdWxsX3VwX2N1cik7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX1BMVUdfREVURUNUX0NUTCwKLQkJCSAgICAweEMwLCBwdWxsX3VwX2N1ciA8PCA2KTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9tYmhjX3JlcXVlc3RfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgaW50IG1pY2JfbnVtLCBpbnQgcmVxKQotewotCWludCByZXQ7Ci0KLQkvKgotCSAqIElmIG1pY2JpYXMgaXMgcmVxdWVzdGVkLCBtYWtlIHN1cmUgdGhhdCB0aGVyZQotCSAqIGlzIHZvdGUgdG8gZW5hYmxlIG1jbGsKLQkgKi8KLQlpZiAocmVxID09IE1JQ0JfRU5BQkxFKQotCQl0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIHRydWUpOwotCi0JcmV0ID0gdGF2aWxfbWljYmlhc19jb250cm9sKGNvZGVjLCBtaWNiX251bSwgcmVxLCBmYWxzZSk7Ci0KLQkvKgotCSAqIFJlbGVhc2Ugdm90ZSBmb3IgbWNsayB3aGlsZSByZXF1ZXN0aW5nIGZvcgotCSAqIG1pY2JpYXMgZGlzYWJsZQotCSAqLwotCWlmIChyZXEgPT0gTUlDQl9ESVNBQkxFKQotCQl0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX21iaGNfbWljYl9yYW1wX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NSUNCMl9SQU1QLAotCQkJCSAgICAweDFDLCAweDBDKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUlDQjJfUkFNUCwKLQkJCQkgICAgMHg4MCwgMHg4MCk7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUlDQjJfUkFNUCwKLQkJCQkgICAgMHg4MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0IyX1JBTVAsCi0JCQkJICAgIDB4MUMsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBmaXJtd2FyZV9jYWwgKnRhdmlsX2dldF9od2RlcF9md19jYWwoc3RydWN0IHdjZF9tYmhjICptYmhjLAotCQkJCQkJICAgZW51bSB3Y2RfY2FsX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGM7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCi0Jd2NkOTM0eF9tYmhjID0gY29udGFpbmVyX29mKG1iaGMsIHN0cnVjdCB3Y2Q5MzR4X21iaGMsIHdjZF9tYmhjKTsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBjb2RlYyBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlod2RlcF9jYWwgPSB3Y2RjYWxfZ2V0X2Z3X2NhbCh3Y2Q5MzR4X21iaGMtPmZ3X2RhdGEsIHR5cGUpOwotCWlmICghaHdkZXBfY2FsKQotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY2FsIG5vdCBzZW50IGJ5ICVkXG4iLAotCQkJX19mdW5jX18sIHR5cGUpOwotCi0JcmV0dXJuIGh3ZGVwX2NhbDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9tYmhjX21pY2JfY3RybF90aHJlc2hvbGRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICAgICAgaW50IG1pY2JfbnVtLCBib29sIHJlcV9lbikKLXsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50IHJjLCBtaWNiX212OwotCi0JaWYgKG1pY2JfbnVtICE9IE1JQ19CSUFTXzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyoKLQkgKiBJZiBkZXZpY2UgdHJlZSBtaWNiaWFzIGxldmVsIGlzIGFscmVhZHkgYWJvdmUgdGhlIG1pbmltdW0KLQkgKiB2b2x0YWdlIG5lZWRlZCB0byBkZXRlY3QgdGhyZXNob2xkIG1pY3JvcGhvbmUsIHRoZW4gZG8KLQkgKiBub3QgY2hhbmdlIHRoZSBtaWNiaWFzLCBqdXN0IHJldHVybi4KLQkgKi8KLQlpZiAocGRhdGEtPm1pY2JpYXMubWljYjJfbXYgPj0gV0NEX01CSENfVEhSX0hTX01JQ0JfTVYpCi0JCXJldHVybiAwOwotCi0JbWljYl9tdiA9IHJlcV9lbiA/IFdDRF9NQkhDX1RIUl9IU19NSUNCX01WIDogcGRhdGEtPm1pY2JpYXMubWljYjJfbXY7Ci0KLQlyYyA9IHRhdmlsX21iaGNfbWljYl9hZGp1c3Rfdm9sdGFnZShjb2RlYywgbWljYl9tdiwgTUlDX0JJQVNfMik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0YXZpbF9tYmhjX2dldF9yZXN1bHRfcGFyYW1zKHN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4LAotCQkJCQkJczE2ICpkMV9hLCB1MTYgbm9mZiwKLQkJCQkJCWludDMyX3QgKnpkZXQpCi17Ci0JaW50IGk7Ci0JaW50IHZhbCwgdmFsMTsKLQlzMTYgYzE7Ci0JczMyIHgxLCBkMTsKLQlpbnQzMl90IGRlbm9tOwotCWludCBtaW5Db2RlX3BhcmFtW10gPSB7Ci0JCQkzMjc3LCAxNjM5LCA4MjAsIDQxMCwgMjA1LCAxMDMsIDUyLCAyNgotCX07Ci0KLQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLCBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQsIDB4MjAsIDB4MjApOwotCWZvciAoaSA9IDA7IGkgPCBUQVZJTF9aREVUX05VTV9NRUFTVVJFTUVOVFM7IGkrKykgewotCQlyZWdtYXBfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzIsICZ2YWwpOwotCQlpZiAodmFsICYgMHg4MCkKLQkJCWJyZWFrOwotCX0KLQl2YWwgPSB2YWwgPDwgMHg4OwotCXJlZ21hcF9yZWFkKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTM0WF9BTkFfTUJIQ19SRVNVTFRfMSwgJnZhbDEpOwotCXZhbCB8PSB2YWwxOwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQU5BX01CSENfWkRFVCwgMHgyMCwgMHgwMCk7Ci0JeDEgPSBUQVZJTF9NQkhDX0dFVF9YMSh2YWwpOwotCWMxID0gVEFWSUxfTUJIQ19HRVRfQzEodmFsKTsKLQkvKiBJZiByYW1wIGlzIG5vdCBjb21wbGV0ZSwgZ2l2ZSBhZGRpdGlvbmFsIDVtcyAqLwotCWlmICgoYzEgPCAyKSAmJiB4MSkKLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDUwNTApOwotCi0JaWYgKCFjMSB8fCAheDEpIHsKLQkJZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsCi0JCQkiJXM6IEltcGVkYW5jZSBkZXRlY3QgcmFtcCBlcnJvciwgYzE9JWQsIHgxPTB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYzEsIHgxKTsKLQkJZ290byByYW1wX2Rvd247Ci0JfQotCWQxID0gZDFfYVtjMV07Ci0JZGVub20gPSAoeDEgKiBkMSkgLSAoMSA8PCAoMTQgLSBub2ZmKSk7Ci0JaWYgKGRlbm9tID4gMCkKLQkJKnpkZXQgPSAoVEFWSUxfTUJIQ19aREVUX0NPTlNUICogMTAwMCkgLyBkZW5vbTsKLQllbHNlIGlmICh4MSA8IG1pbkNvZGVfcGFyYW1bbm9mZl0pCi0JCSp6ZGV0ID0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0U7Ci0KLQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiBkMT0lZCwgYzE9JWQsIHgxPTB4JXgsIHpfdmFsPSVkKG1pbGxpT2htKVxuIiwKLQkJX19mdW5jX18sIGQxLCBjMSwgeDEsICp6ZGV0KTsKLXJhbXBfZG93bjoKLQlpID0gMDsKLQl3aGlsZSAoeDEpIHsKLQkJcmVnbWFwX2J1bGtfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJIFdDRDkzNFhfQU5BX01CSENfUkVTVUxUXzEsICh1OCAqKSZ2YWwsIDIpOwotCQl4MSA9IFRBVklMX01CSENfR0VUX1gxKHZhbCk7Ci0JCWkrKzsKLQkJaWYgKGkgPT0gVEFWSUxfWkRFVF9OVU1fTUVBU1VSRU1FTlRTKQotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9tYmhjX3pkZXRfcmFtcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCB0YXZpbF9tYmhjX3pkZXRfcGFyYW0gKnpkZXRfcGFyYW0sCi0JCQkJIGludDMyX3QgKnpsLCBpbnQzMl90ICp6ciwgczE2ICpkMV9hKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JaW50MzJfdCB6ZGV0ID0gMDsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfWkRFVF9BTkFfQ1RMLCAweDcwLAotCQkJICAgIHpkZXRfcGFyYW0tPmxkb19jdGwgPDwgNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE41LCAweEZDLAotCQkJICAgIHpkZXRfcGFyYW0tPmJ0bjUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONiwgMHhGQywKLQkJCSAgICB6ZGV0X3BhcmFtLT5idG42KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjcsIDB4RkMsCi0JCQkgICAgemRldF9wYXJhbS0+YnRuNyk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwsIDB4MEYsCi0JCQkgICAgemRldF9wYXJhbS0+bm9mZik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19aREVUX1JBTVBfQ1RMLCAweDBGLAotCQkJICAgIHpkZXRfcGFyYW0tPm5zaGlmdCk7Ci0KLQlpZiAoIXpsKQotCQlnb3RvIHpfcmlnaHQ7Ci0JLyogU3RhcnQgaW1wZWRhbmNlIG1lYXN1cmVtZW50IGZvciBIUEhfTCAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX1pERVQsIDB4ODAsIDB4ODApOwotCWRldl9kYmcod2NkOXh4eC0+ZGV2LCAiJXM6IHJhbXAgZm9yIEhQSF9MLCBub2ZmID0gJWRcbiIsCi0JCV9fZnVuY19fLCB6ZGV0X3BhcmFtLT5ub2ZmKTsKLQl0YXZpbF9tYmhjX2dldF9yZXN1bHRfcGFyYW1zKHdjZDl4eHgsIGQxX2EsIHpkZXRfcGFyYW0tPm5vZmYsICZ6ZGV0KTsKLQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAweDgwLCAweDAwKTsKLQotCSp6bCA9IHpkZXQ7Ci0KLXpfcmlnaHQ6Ci0JaWYgKCF6cikKLQkJcmV0dXJuOwotCS8qIFN0YXJ0IGltcGVkYW5jZSBtZWFzdXJlbWVudCBmb3IgSFBIX1IgKi8KLQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19aREVULCAweDQwLCAweDQwKTsKLQlkZXZfZGJnKHdjZDl4eHgtPmRldiwgIiVzOiByYW1wIGZvciBIUEhfUiwgbm9mZiA9ICVkXG4iLAotCQlfX2Z1bmNfXywgemRldF9wYXJhbS0+bm9mZik7Ci0JdGF2aWxfbWJoY19nZXRfcmVzdWx0X3BhcmFtcyh3Y2Q5eHh4LCBkMV9hLCB6ZGV0X3BhcmFtLT5ub2ZmLCAmemRldCk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCSAgIFdDRDkzNFhfQU5BX01CSENfWkRFVCwgMHg0MCwgMHgwMCk7Ci0KLQkqenIgPSB6ZGV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGF2aWxfd2NkX21iaGNfcWZ1c2VfY2FsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICAgIGludDMyX3QgKnpfdmFsLCBpbnQgZmxhZ19sX3IpCi17Ci0JczE2IHExOwotCWludCBxMV9jYWw7Ci0KLQlpZiAoKnpfdmFsIDwgKFRBVklMX1pERVRfVkFMXzQwMC8xMDAwKSkKLQkJcTEgPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQlXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxICsgKDIgKiBmbGFnX2xfcikpOwotCWVsc2UKLQkJcTEgPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQlXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQyICsgKDIgKiBmbGFnX2xfcikpOwotCWlmIChxMSAmIDB4ODApCi0JCXExX2NhbCA9ICgxMDAwMCAtICgocTEgJiAweDdGKSAqIDI1KSk7Ci0JZWxzZQotCQlxMV9jYWwgPSAoMTAwMDAgKyAocTEgKiAyNSkpOwotCWlmIChxMV9jYWwgPiAwKQotCQkqel92YWwgPSAoKCp6X3ZhbCkgKiAxMDAwMCkgLyBxMV9jYWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYywgdWludDMyX3QgKnpsLAotCQkJCQkgIHVpbnQzMl90ICp6cikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXMxNiByZWcwLCByZWcxLCByZWcyLCByZWczLCByZWc0OwotCWludDMyX3QgejFMLCB6MVIsIHoxTHM7Ci0JaW50IHpNb25vLCB6X2RpZmYxLCB6X2RpZmYyOwotCWJvb2wgaXNfZnNtX2Rpc2FibGUgPSBmYWxzZTsKLQlzdHJ1Y3QgdGF2aWxfbWJoY196ZGV0X3BhcmFtIHpkZXRfcGFyYW1bXSA9IHsKLQkJezQsIDAsIDQsIDB4MDgsIDB4MTQsIDB4MTh9LCAvKiA8IDMyb2htICovCi0JCXsyLCAwLCAzLCAweDE4LCAweDdDLCAweDkwfSwgLyogMzJvaG0gPCBaIDwgNDAwb2htICovCi0JCXsxLCA0LCA1LCAweDE4LCAweDdDLCAweDkwfSwgLyogNDAwb2htIDwgWiA8IDEyMDBvaG0gKi8KLQkJezEsIDYsIDcsIDB4MTgsIDB4N0MsIDB4OTB9LCAvKiA+MTIwMG9obSAqLwotCX07Ci0Jc3RydWN0IHRhdmlsX21iaGNfemRldF9wYXJhbSAqemRldF9wYXJhbV9wdHIgPSBOVUxMOwotCXMxNiBkMV9hW11bNF0gPSB7Ci0JCXswLCAzMCwgOTAsIDMwfSwKLQkJezAsIDMwLCAzMCwgNX0sCi0JCXswLCAzMCwgMzAsIDV9LAotCQl7MCwgMzAsIDMwLCA1fSwKLQl9OwotCXMxNiAqZDEgPSBOVUxMOwotCi0JV0NEX01CSENfUlNDX0FTU0VSVF9MT0NLRUQobWJoYyk7Ci0KLQlyZWcwID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjUpOwotCXJlZzEgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONik7Ci0JcmVnMiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE43KTsKLQlyZWczID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX01CSENfQ1RMX0NMSyk7Ci0JcmVnNCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwpOwotCi0JaWYgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCkgJiAweDgwKSB7Ci0JCWlzX2ZzbV9kaXNhYmxlID0gdHJ1ZTsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX0VMRUNULCAweDgwLCAweDAwKTsKLQl9Ci0KLQkvKiBGb3IgTk8tamFjaywgZGlzYWJsZSBMX0RFVF9FTiBiZWZvcmUgWi1kZXQgbWVhc3VyZW1lbnRzICovCi0JaWYgKG1iaGMtPmhwaGxfc3doKQotCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJCSAgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHg4MCwgMHgwMCk7Ci0KLQkvKiBUdXJuIG9mZiAxMDBrIHB1bGwgZG93biBvbiBIUEhMICovCi0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCSAgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHgwMSwgMHgwMCk7Ci0KLQkvKiBGaXJzdCBnZXQgaW1wZWRhbmNlIG9uIExlZnQgKi8KLQlkMSA9IGQxX2FbMV07Ci0JemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsxXTsKLQl0YXZpbF9tYmhjX3pkZXRfcmFtcChjb2RlYywgemRldF9wYXJhbV9wdHIsICZ6MUwsIE5VTEwsIGQxKTsKLQotCWlmICghVEFWSUxfTUJIQ19JU19TRUNPTkRfUkFNUF9SRVFVSVJFRCh6MUwpKQotCQlnb3RvIGxlZnRfY2hfaW1wZWRhbmNlOwotCi0JLyogU2Vjb25kIHJhbXAgZm9yIGxlZnQgY2ggKi8KLQlpZiAoejFMIDwgVEFWSUxfWkRFVF9WQUxfMzIpIHsKLQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVswXTsKLQkJZDEgPSBkMV9hWzBdOwotCX0gZWxzZSBpZiAoKHoxTCA+IFRBVklMX1pERVRfVkFMXzQwMCkgJiYgKHoxTCA8PSBUQVZJTF9aREVUX1ZBTF8xMjAwKSkgewotCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzJdOwotCQlkMSA9IGQxX2FbMl07Ci0JfSBlbHNlIGlmICh6MUwgPiBUQVZJTF9aREVUX1ZBTF8xMjAwKSB7Ci0JCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bM107Ci0JCWQxID0gZDFfYVszXTsKLQl9Ci0JdGF2aWxfbWJoY196ZGV0X3JhbXAoY29kZWMsIHpkZXRfcGFyYW1fcHRyLCAmejFMLCBOVUxMLCBkMSk7Ci0KLWxlZnRfY2hfaW1wZWRhbmNlOgotCWlmICgoejFMID09IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSB8fAotCQkoejFMID4gVEFWSUxfWkRFVF9WQUxfMTAwSykpIHsKLQkJKnpsID0gVEFWSUxfWkRFVF9GTE9BVElOR19JTVBFREFOQ0U7Ci0JCXpkZXRfcGFyYW1fcHRyID0gJnpkZXRfcGFyYW1bMV07Ci0JCWQxID0gZDFfYVsxXTsKLQl9IGVsc2UgewotCQkqemwgPSB6MUwvMTAwMDsKLQkJdGF2aWxfd2NkX21iaGNfcWZ1c2VfY2FsKGNvZGVjLCB6bCwgMCk7Ci0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpbXBlZGFuY2Ugb24gSFBIX0wgPSAlZChvaG1zKVxuIiwKLQkJX19mdW5jX18sICp6bCk7Ci0KLQkvKiBTdGFydCBvZiByaWdodCBpbXBlZGFuY2UgcmFtcCBhbmQgY2FsY3VsYXRpb24gKi8KLQl0YXZpbF9tYmhjX3pkZXRfcmFtcChjb2RlYywgemRldF9wYXJhbV9wdHIsIE5VTEwsICZ6MVIsIGQxKTsKLQlpZiAoVEFWSUxfTUJIQ19JU19TRUNPTkRfUkFNUF9SRVFVSVJFRCh6MVIpKSB7Ci0JCWlmICgoKHoxUiA+IFRBVklMX1pERVRfVkFMXzEyMDApICYmCi0JCQkoemRldF9wYXJhbV9wdHItPm5vZmYgPT0gMHg2KSkgfHwKLQkJCSgoKnpsKSAhPSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkpCi0JCQlnb3RvIHJpZ2h0X2NoX2ltcGVkYW5jZTsKLQkJLyogU2Vjb25kIHJhbXAgZm9yIHJpZ2h0IGNoICovCi0JCWlmICh6MVIgPCBUQVZJTF9aREVUX1ZBTF8zMikgewotCQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVswXTsKLQkJCWQxID0gZDFfYVswXTsKLQkJfSBlbHNlIGlmICgoejFSID4gVEFWSUxfWkRFVF9WQUxfNDAwKSAmJgotCQkJKHoxUiA8PSBUQVZJTF9aREVUX1ZBTF8xMjAwKSkgewotCQkJemRldF9wYXJhbV9wdHIgPSAmemRldF9wYXJhbVsyXTsKLQkJCWQxID0gZDFfYVsyXTsKLQkJfSBlbHNlIGlmICh6MVIgPiBUQVZJTF9aREVUX1ZBTF8xMjAwKSB7Ci0JCQl6ZGV0X3BhcmFtX3B0ciA9ICZ6ZGV0X3BhcmFtWzNdOwotCQkJZDEgPSBkMV9hWzNdOwotCQl9Ci0JCXRhdmlsX21iaGNfemRldF9yYW1wKGNvZGVjLCB6ZGV0X3BhcmFtX3B0ciwgTlVMTCwgJnoxUiwgZDEpOwotCX0KLXJpZ2h0X2NoX2ltcGVkYW5jZToKLQlpZiAoKHoxUiA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKLQkJKHoxUiA+IFRBVklMX1pERVRfVkFMXzEwMEspKSB7Ci0JCSp6ciA9IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFOwotCX0gZWxzZSB7Ci0JCSp6ciA9IHoxUi8xMDAwOwotCQl0YXZpbF93Y2RfbWJoY19xZnVzZV9jYWwoY29kZWMsIHpyLCAxKTsKLQl9Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGltcGVkYW5jZSBvbiBIUEhfUiA9ICVkKG9obXMpXG4iLAotCQlfX2Z1bmNfXywgKnpyKTsKLQotCS8qIE1vbm8vc3RlcmVvIGRldGVjdGlvbiAqLwotCWlmICgoKnpsID09IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSAmJgotCQkoKnpyID09IFRBVklMX1pERVRfRkxPQVRJTkdfSU1QRURBTkNFKSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IHBsdWcgdHlwZSBpcyBpbnZhbGlkIG9yIGV4dGVuc2lvbiBjYWJsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byB6ZGV0X2NvbXBsZXRlOwotCX0KLQlpZiAoKCp6bCA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKLQkgICAgKCp6ciA9PSBUQVZJTF9aREVUX0ZMT0FUSU5HX0lNUEVEQU5DRSkgfHwKLQkgICAgKCgqemwgPCBXQ0RfTU9OT19IU19NSU5fVEhSKSAmJiAoKnpyID4gV0NEX01PTk9fSFNfTUlOX1RIUikpIHx8Ci0JICAgICgoKnpsID4gV0NEX01PTk9fSFNfTUlOX1RIUikgJiYgKCp6ciA8IFdDRF9NT05PX0hTX01JTl9USFIpKSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkiJXM6IE1vbm8gcGx1ZyB0eXBlIHdpdGggb25lIGNoIGZsb2F0aW5nIG9yIHNob3J0ZWQgdG8gR05EXG4iLAotCQkJX19mdW5jX18pOwotCQltYmhjLT5ocGhfdHlwZSA9IFdDRF9NQkhDX0hQSF9NT05POwotCQlnb3RvIHpkZXRfY29tcGxldGU7Ci0JfQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JfQVRFU1QsIDB4MDIsIDB4MDIpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1BBX0NUTDIsIDB4NDAsIDB4MDEpOwotCWlmICgqemwgPCAoVEFWSUxfWkRFVF9WQUxfMzIvMTAwMCkpCi0JCXRhdmlsX21iaGNfemRldF9yYW1wKGNvZGVjLCAmemRldF9wYXJhbVswXSwgJnoxTHMsIE5VTEwsIGQxKTsKLQllbHNlCi0JCXRhdmlsX21iaGNfemRldF9yYW1wKGNvZGVjLCAmemRldF9wYXJhbVsxXSwgJnoxTHMsIE5VTEwsIGQxKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9QQV9DVEwyLCAweDQwLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SX0FURVNULCAweDAyLCAweDAwKTsKLQl6MUxzIC89IDEwMDA7Ci0JdGF2aWxfd2NkX21iaGNfcWZ1c2VfY2FsKGNvZGVjLCAmejFMcywgMCk7Ci0JLyogUGFyYWxsZWwgb2YgbGVmdCBaIGFuZCA5IG9obSBwdWxsIGRvd24gcmVzaXN0b3IgKi8KLQl6TW9ubyA9ICgoKnpsKSAqIDkpIC8gKCgqemwpICsgOSk7Ci0Jel9kaWZmMSA9ICh6MUxzID4gek1vbm8pID8gKHoxTHMgLSB6TW9ubykgOiAoek1vbm8gLSB6MUxzKTsKLQl6X2RpZmYyID0gKCgqemwpID4gejFMcykgPyAoKCp6bCkgLSB6MUxzKSA6ICh6MUxzIC0gKCp6bCkpOwotCWlmICgoel9kaWZmMSAqICgqemwgKyB6MUxzKSkgPiAoel9kaWZmMiAqICh6MUxzICsgek1vbm8pKSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3RlcmVvIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfU1RFUkVPOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBNT05PIHBsdWcgdHlwZSBkZXRlY3RlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJbWJoYy0+aHBoX3R5cGUgPSBXQ0RfTUJIQ19IUEhfTU9OTzsKLQl9Ci0KLXpkZXRfY29tcGxldGU6Ci0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9BTkFfTUJIQ19CVE41LCByZWcwKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX0JUTjYsIHJlZzEpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfQlRONywgcmVnMik7Ci0JLyogVHVybiBvbiAxMDBrIHB1bGwgZG93biBvbiBIUEhMICovCi0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCSAgIFdDRDkzNFhfQU5BX01CSENfTUVDSCwgMHgwMSwgMHgwMSk7Ci0KLQkvKiBGb3IgTk8tamFjaywgcmUtZW5hYmxlIExfREVUX0VOIGFmdGVyIFotZGV0IG1lYXN1cmVtZW50cyAqLwotCWlmIChtYmhjLT5ocGhsX3N3aCkKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkgICBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsIDB4ODAsIDB4ODApOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9NQkhDX05FV19aREVUX0FOQV9DVEwsIHJlZzQpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfTUJIQ19DVExfQ0xLLCByZWczKTsKLQlpZiAoaXNfZnNtX2Rpc2FibGUpCi0JCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJICAgV0NEOTM0WF9BTkFfTUJIQ19FTEVDVCwgMHg4MCwgMHg4MCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX21iaGNfZ25kX2RldF9jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsCi0JCQkJICAgIDB4MDIsIDB4MDIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQkhDX01FQ0gsCi0JCQkJICAgIDB4NDAsIDB4NDApOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfTUVDSCwKLQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01CSENfTUVDSCwKLQkJCQkgICAgMHgwMiwgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9tYmhjX2hwaF9wdWxsX2Rvd25fY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9QQV9DVEwyLAotCQkJCSAgICAweDQwLCAweDQwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUEFfQ1RMMiwKLQkJCQkgICAgMHgxMCwgMHgxMCk7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUEFfQ1RMMiwKLQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1BBX0NUTDIsCi0JCQkJICAgIDB4MTAsIDB4MDApOwotCX0KLX0KLXN0YXRpYyB2b2lkIHRhdmlsX21iaGNfbW9pc3R1cmVfY29uZmlnKHN0cnVjdCB3Y2RfbWJoYyAqbWJoYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBtYmhjLT5jb2RlYzsKLQotCWlmICgobWJoYy0+bW9pc3RfcnJlZiA9PSBSX09GRikgfHwKLQkgICAgKG1iaGMtPm1iaGNfY2ZnLT5lbmFibGVfdXNiY19hbmFsb2cpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsCi0JCQkJICAgIDB4MEMsIFJfT0ZGIDw8IDIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRG9ub3QgZW5hYmxlIG1vaXN0dXJlIGRldGVjdGlvbiBpZiBqYWNrIHR5cGUgaXMgTkMgKi8KLQlpZiAoIW1iaGMtPmhwaGxfc3doKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkaXNhYmxlIG1vaXN0dXJlIGRldGVjdGlvbiBmb3IgTkNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19ORVdfQ1RMXzIsCi0JCQkJICAgIDB4MEMsIFJfT0ZGIDw8IDIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19DVExfMiwKLQkJCSAgICAweDBDLCBtYmhjLT5tb2lzdF9ycmVmIDw8IDIpOwotfQotCi1zdGF0aWMgYm9vbCB0YXZpbF9ocGhfcmVnaXN0ZXJfcmVjb3Zlcnkoc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1iaGMtPmNvZGVjOwotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7Ci0KLQlpZiAoIXdjZDkzNHhfbWJoYykKLQkJcmV0dXJuIGZhbHNlOwotCi0Jd2NkOTM0eF9tYmhjLT5pc19ocGhfcmVjb3ZlciA9IGZhbHNlOwotCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAotCQkJCSAgICAgICJSRVNFVF9IUEhfUkVHSVNURVJTIik7Ci0Jc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOwotCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpLAotCQkJCSAiUkVTRVRfSFBIX1JFR0lTVEVSUyIpOwotCXNuZF9zb2NfZGFwbV9zeW5jKHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpKTsKLQotCXJldHVybiB3Y2Q5MzR4X21iaGMtPmlzX2hwaF9yZWNvdmVyOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF91cGRhdGVfYW5jX3N0YXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUsCi0JCQkJICAgaW50IGFuY19udW0pCi17Ci0JaWYgKGVuYWJsZSkKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArCi0JCQkJKDIwICogYW5jX251bSksIDB4MTAsIDB4MTApOwotCWVsc2UKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfQ0ZHMCArCi0JCQkJKDIwICogYW5jX251bSksIDB4MTAsIDB4MDApOwotfQotCi1zdGF0aWMgYm9vbCB0YXZpbF9pc19hbmNfb24oc3RydWN0IHdjZF9tYmhjICptYmhjKQotewotCWJvb2wgYW5jX29uID0gZmFsc2U7Ci0JdTE2IGFuY2wsIGFuY3I7Ci0KLQlhbmNsID0KLQkoc25kX3NvY19yZWFkKG1iaGMtPmNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwKSkgJiAweDEwOwotCWFuY3IgPQotCShzbmRfc29jX3JlYWQobWJoYy0+Y29kZWMsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzApKSAmIDB4MTA7Ci0KLQlhbmNfb24gPSAhIShhbmNsIHwgYW5jcik7Ci0KLQlyZXR1cm4gYW5jX29uOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9tYmhjX2NiIG1iaGNfY2IgPSB7Ci0JLnJlcXVlc3RfaXJxID0gdGF2aWxfbWJoY19yZXF1ZXN0X2lycSwKLQkuaXJxX2NvbnRyb2wgPSB0YXZpbF9tYmhjX2lycV9jb250cm9sLAotCS5mcmVlX2lycSA9IHRhdmlsX21iaGNfZnJlZV9pcnEsCi0JLmNsa19zZXR1cCA9IHRhdmlsX21iaGNfY2xrX3NldHVwLAotCS5tYXBfYnRuX2NvZGVfdG9fbnVtID0gdGF2aWxfbWJoY19idG5fdG9fbnVtLAotCS5lbmFibGVfbWJfc291cmNlID0gdGF2aWxfZW5hYmxlX2V4dF9tYl9zb3VyY2UsCi0JLm1iaGNfYmlhcyA9IHRhdmlsX21iaGNfbWJoY19iaWFzX2NvbnRyb2wsCi0JLnNldF9idG5fdGhyID0gdGF2aWxfbWJoY19wcm9ncmFtX2J0bl90aHIsCi0JLmxvY2tfc2xlZXAgPSB0YXZpbF9tYmhjX2xvY2tfc2xlZXAsCi0JLnJlZ2lzdGVyX25vdGlmaWVyID0gdGF2aWxfbWJoY19yZWdpc3Rlcl9ub3RpZmllciwKLQkubWljYmlhc19lbmFibGVfc3RhdHVzID0gdGF2aWxfbWJoY19taWNiX2VuX3N0YXR1cywKLQkuaHBoX3BhX29uX3N0YXR1cyA9IHRhdmlsX21iaGNfaHBoX3BhX29uX3N0YXR1cywKLQkuaHBoX3B1bGxfdXBfY29udHJvbCA9IHRhdmlsX21iaGNfaHBoX2xfcHVsbF91cF9jb250cm9sLAotCS5tYmhjX21pY2JpYXNfY29udHJvbCA9IHRhdmlsX21iaGNfcmVxdWVzdF9taWNiaWFzLAotCS5tYmhjX21pY2JfcmFtcF9jb250cm9sID0gdGF2aWxfbWJoY19taWNiX3JhbXBfY29udHJvbCwKLQkuZ2V0X2h3ZGVwX2Z3X2NhbCA9IHRhdmlsX2dldF9od2RlcF9md19jYWwsCi0JLm1iaGNfbWljYl9jdHJsX3Rocl9taWMgPSB0YXZpbF9tYmhjX21pY2JfY3RybF90aHJlc2hvbGRfbWljLAotCS5jb21wdXRlX2ltcGVkYW5jZSA9IHRhdmlsX3djZF9tYmhjX2NhbGNfaW1wZWRhbmNlLAotCS5tYmhjX2duZF9kZXRfY3RybCA9IHRhdmlsX21iaGNfZ25kX2RldF9jdHJsLAotCS5ocGhfcHVsbF9kb3duX2N0cmwgPSB0YXZpbF9tYmhjX2hwaF9wdWxsX2Rvd25fY3RybCwKLQkubWJoY19tb2lzdHVyZV9jb25maWcgPSB0YXZpbF9tYmhjX21vaXN0dXJlX2NvbmZpZywKLQkuaHBoX3JlZ2lzdGVyX3JlY292ZXJ5ID0gdGF2aWxfaHBoX3JlZ2lzdGVyX3JlY292ZXJ5LAotCS51cGRhdGVfYW5jX3N0YXRlID0gdGF2aWxfdXBkYXRlX2FuY19zdGF0ZSwKLQkuaXNfYW5jX29uID0gdGF2aWxfaXNfYW5jX29uLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKnRhdmlsX2NvZGVjX2ZpbmRfb25kZW1hbmRfcmVndWxhdG9yKAotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgd2NkOXh4eC0+bnVtX29mX3N1cHBsaWVzOyArK2kpIHsKLQkJaWYgKHBkYXRhLT5yZWd1bGF0b3JbaV0ub25kZW1hbmQgJiYKLQkJICAgIHdjZDl4eHgtPnN1cHBsaWVzW2ldLnN1cHBseSAmJgotCQkgICAgIXN0cmNtcCh3Y2Q5eHh4LT5zdXBwbGllc1tpXS5zdXBwbHksIG5hbWUpKQotCQkJcmV0dXJuIHdjZDl4eHgtPnN1cHBsaWVzW2ldLmNvbnN1bWVyOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIldhcm5pbmc6IHJlZ3VsYXRvciBub3QgZm91bmQ6JXNcbiIsCi0JCW5hbWUpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2dldF9ocGhfdHlwZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7Ci0Jc3RydWN0IHdjZF9tYmhjICptYmhjOwotCi0JaWYgKCF3Y2Q5MzR4X21iaGMpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1iaGMgbm90IGluaXRpYWxpemVkIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltYmhjID0gJndjZDkzNHhfbWJoYy0+d2NkX21iaGM7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICh1MzIpIG1iaGMtPmhwaF90eXBlOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBocGhfdHlwZSA9ICV1XG4iLCBfX2Z1bmNfXywgbWJoYy0+aHBoX3R5cGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaHBoX2ltcGVkYW5jZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWludDMyX3QgemwsIHpyOwotCWJvb2wgaHBocjsKLQlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1jOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7Ci0KLQlpZiAoIXdjZDkzNHhfbWJoYykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1jID0gKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKShrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7Ci0JaHBociA9IG1jLT5zaGlmdDsKLQl3Y2RfbWJoY19nZXRfaW1wZWRhbmNlKCZ3Y2Q5MzR4X21iaGMtPndjZF9tYmhjLCAmemwsICZ6cik7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHpsPSV1KG9obXMpLCB6cj0ldShvaG1zKVxuIiwgX19mdW5jX18sIHpsLCB6cik7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBocGhyID8genIgOiB6bDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHBoX3R5cGVfZGV0ZWN0X2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkhQSCBUeXBlIiwgMCwgMCwgVUlOVF9NQVgsIDAsCi0JCSAgICAgICB0YXZpbF9nZXRfaHBoX3R5cGUsIE5VTEwpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGltcGVkYW5jZV9kZXRlY3RfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiSFBITCBJbXBlZGFuY2UiLCAwLCAwLCBVSU5UX01BWCwgMCwKLQkJICAgICAgIHRhdmlsX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKLQlTT0NfU0lOR0xFX0VYVCgiSFBIUiBJbXBlZGFuY2UiLCAwLCAxLCBVSU5UX01BWCwgMCwKLQkJICAgICAgIHRhdmlsX2hwaF9pbXBlZGFuY2VfZ2V0LCBOVUxMKSwKLX07Ci0KLS8qCi0gKiB0YXZpbF9tYmhjX2dldF9pbXBlZGFuY2U6IGdldCBpbXBlZGFuY2Ugb2YgaGVhZHBob25lIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCi0gKiBAd2NkOTM0eF9tYmhjOiBoYW5kbGUgdG8gc3RydWN0IHdjZDkzNHhfbWJoYyAqCi0gKiBAemw6IGhhbmRsZSB0byBsZWZ0LWNoIGltcGVkYW5jZQotICogQHpyOiBoYW5kbGUgdG8gcmlnaHQtY2ggaW1wZWRhbmNlCi0gKiByZXR1cm4gMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgdGF2aWxfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYywKLQkJCSAgICAgdWludDMyX3QgKnpsLCB1aW50MzJfdCAqenIpCi17Ci0JaWYgKCF3Y2Q5MzR4X21iaGMpIHsKLQkJcHJfZXJyKCIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXpsIHx8ICF6cikgewotCQlwcl9lcnIoIiVzOiB6bCBvciB6ciBudWxsIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gd2NkX21iaGNfZ2V0X2ltcGVkYW5jZSgmd2NkOTM0eF9tYmhjLT53Y2RfbWJoYywgemwsIHpyKTsKLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19nZXRfaW1wZWRhbmNlKTsKLQotLyoKLSAqIHRhdmlsX21iaGNfaHNfZGV0ZWN0OiBzdGFydHMgbWJoYyBpbnNlcnRpb24vcmVtb3ZhbCBmdW5jdGlvbmFsaXR5Ci0gKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKLSAqIEBtYmhjX2NmZzogaGFuZGxlIHRvIG1iaGMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLSAqIHJldHVybiAwIGlmIG1iaGNfc3RhcnQgaXMgc3VjY2VzcyBvciBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgdGF2aWxfbWJoY19oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnKQotewotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYyA9IHRhdmlsX3NvY19nZXRfbWJoYyhjb2RlYyk7Ci0KLQlpZiAoIXdjZDkzNHhfbWJoYykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBub3QgaW5pdGlhbGl6ZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiB3Y2RfbWJoY19zdGFydCgmd2NkOTM0eF9tYmhjLT53Y2RfbWJoYywgbWJoY19jZmcpOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX2hzX2RldGVjdCk7Ci0KLS8qCi0gKiB0YXZpbF9tYmhjX2hzX2RldGVjdF9leGl0OiBzdG9wIG1iaGMgaW5zZXJ0aW9uL3JlbW92YWwgZnVuY3Rpb25hbGl0eQotICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCi0gKi8KLXZvaWQgdGF2aWxfbWJoY19oc19kZXRlY3RfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZDkzNHhfbWJoYyAqd2NkOTM0eF9tYmhjID0gdGF2aWxfc29jX2dldF9tYmhjKGNvZGVjKTsKLQotCWlmICghd2NkOTM0eF9tYmhjKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtYmhjIG5vdCBpbml0aWFsaXplZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQl3Y2RfbWJoY19zdG9wKCZ3Y2Q5MzR4X21iaGMtPndjZF9tYmhjKTsKLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19oc19kZXRlY3RfZXhpdCk7Ci0KLS8qCi0gKiB0YXZpbF9tYmhjX3Bvc3Rfc3NyX2luaXQ6IGluaXRpYWxpemUgbWJoYyBmb3IgdGF2aWwgcG9zdCBzdWJzeXN0ZW0gcmVzdGFydAotICogQG1iaGM6IHBvbml0ZXIgdG8gd2NkOTM0eF9tYmhjIHN0cnVjdHVyZQotICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCi0gKgotICogcmV0dXJuIDAgaWYgbWJoY19pbml0IGlzIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IHRhdmlsX21iaGNfcG9zdF9zc3JfaW5pdChzdHJ1Y3Qgd2NkOTM0eF9tYmhjICptYmhjLAotCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgd2NkX21iaGMgKndjZF9tYmhjOwotCi0JaWYgKCFtYmhjIHx8ICFjb2RlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3Y2RfbWJoYyA9ICZtYmhjLT53Y2RfbWJoYzsKLQlpZiAod2NkX21iaGMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB3Y2RfbWJoYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXdjZF9tYmhjX2RlaW5pdCh3Y2RfbWJoYyk7Ci0JcmV0ID0gd2NkX21iaGNfaW5pdCh3Y2RfbWJoYywgY29kZWMsICZtYmhjX2NiLCAmaW50cl9pZHMsCi0JCQkgICAgd2NkX21iaGNfcmVnaXN0ZXJzLCBUQVZJTF9aREVUX1NVUFBPUlRFRCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHdjZF9tYmhjLT5tYmhjX2RldGVjdGlvbl9sb2dpYyA9PSBXQ0RfREVURUNUSU9OX0xFR0FDWSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX01CSENfTkVXX0NUTF8xLCAweDA0LCAweDA0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX0NUTF9CQ1MsIDB4MDEsIDB4MDEpOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX3Bvc3Rfc3NyX2luaXQpOwotCi0vKgotICogdGF2aWxfbWJoY19pbml0OiBpbml0aWFsaXplIG1iaGMgZm9yIHRhdmlsCi0gKiBAbWJoYzogcG9uaXRlciB0byB3Y2Q5MzR4X21iaGMgc3RydWN0IHBvaW50ZXIgdG8gc3RvcmUgdGhlIGNvbmZpZ3MKLSAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgotICogQGZ3X2RhdGE6IGhhbmRsZSB0byBmaXJtd2FyZSBkYXRhCi0gKgotICogcmV0dXJuIDAgaWYgbWJoY19pbml0IGlzIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IHRhdmlsX21iaGNfaW5pdChzdHJ1Y3Qgd2NkOTM0eF9tYmhjICoqbWJoYywgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkgICAgc3RydWN0IGZ3X2luZm8gKmZ3X2RhdGEpCi17Ci0Jc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5OwotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYzsKLQlzdHJ1Y3Qgd2NkX21iaGMgKndjZF9tYmhjOwotCWludCByZXQ7Ci0KLQl3Y2Q5MzR4X21iaGMgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgc2l6ZW9mKHN0cnVjdCB3Y2Q5MzR4X21iaGMpLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXdjZDkzNHhfbWJoYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl3Y2Q5MzR4X21iaGMtPndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQl3Y2Q5MzR4X21iaGMtPmZ3X2RhdGEgPSBmd19kYXRhOwotCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmd2NkOTM0eF9tYmhjLT5ub3RpZmllcik7Ci0Jd2NkX21iaGMgPSAmd2NkOTM0eF9tYmhjLT53Y2RfbWJoYzsKLQlpZiAod2NkX21iaGMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB3Y2RfbWJoYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCi0JLyogU2V0dGluZyBkZWZhdWx0IG1iaGMgZGV0ZWN0aW9uIGxvZ2ljIHRvIEFEQyBmb3IgVGF2aWwgKi8KLQl3Y2RfbWJoYy0+bWJoY19kZXRlY3Rpb25fbG9naWMgPSBXQ0RfREVURUNUSU9OX0FEQzsKLQotCXJldCA9IHdjZF9tYmhjX2luaXQod2NkX21iaGMsIGNvZGVjLCAmbWJoY19jYiwKLQkJCQkmaW50cl9pZHMsIHdjZF9tYmhjX3JlZ2lzdGVycywKLQkJCQlUQVZJTF9aREVUX1NVUFBPUlRFRCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN1cHBseSA9IHRhdmlsX2NvZGVjX2ZpbmRfb25kZW1hbmRfcmVndWxhdG9yKGNvZGVjLAotCQkJb25fZGVtYW5kX3N1cHBseV9uYW1lW1dDRDkzNFhfT05fREVNQU5EX01JQ0JJQVNdKTsKLQlpZiAoc3VwcGx5KSB7Ci0JCXdjZDkzNHhfbWJoYy0+b25fZGVtYW5kX2xpc3RbCi0JCQlXQ0Q5MzRYX09OX0RFTUFORF9NSUNCSUFTXS5zdXBwbHkgPQotCQkJCXN1cHBseTsKLQkJd2NkOTM0eF9tYmhjLT5vbl9kZW1hbmRfbGlzdFsKLQkJCVdDRDkzNFhfT05fREVNQU5EX01JQ0JJQVNdLm9uZGVtYW5kX3N1cHBseV9jb3VudCA9Ci0JCQkJMDsKLQl9Ci0KLQkoKm1iaGMpID0gd2NkOTM0eF9tYmhjOwotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBpbXBlZGFuY2VfZGV0ZWN0X2NvbnRyb2xzLAotCQkJCSAgIEFSUkFZX1NJWkUoaW1wZWRhbmNlX2RldGVjdF9jb250cm9scykpOwotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBocGhfdHlwZV9kZXRlY3RfY29udHJvbHMsCi0JCQkJICAgQVJSQVlfU0laRShocGhfdHlwZV9kZXRlY3RfY29udHJvbHMpKTsKLQotCWlmICh3Y2RfbWJoYy0+bWJoY19kZXRlY3Rpb25fbG9naWMgPT0gV0NEX0RFVEVDVElPTl9MRUdBQ1kpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9NQkhDX05FV19DVExfMSwgMHgwNCwgMHgwNCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfTUJIQ19DVExfQkNTLCAweDAxLCAweDAxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHdjZDkzNHhfbWJoYyk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfbWJoY19pbml0KTsKLQotLyoKLSAqIHRhdmlsX21iaGNfZGVpbml0OiBkZWluaXRpYWxpemUgbWJoYyBmb3IgdGF2aWwKLSAqIEBjb2RlYzogaGFuZGxlIHRvIHNuZF9zb2NfY29kZWMgKgotICovCi12b2lkIHRhdmlsX21iaGNfZGVpbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGMgPSB0YXZpbF9zb2NfZ2V0X21iaGMoY29kZWMpOwotCi0JaWYgKHdjZDkzNHhfbWJoYykgewotCQl3Y2RfbWJoY19kZWluaXQoJndjZDkzNHhfbWJoYy0+d2NkX21iaGMpOwotCQlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHdjZDkzNHhfbWJoYyk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX2RlaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC1tYmhjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzg4NmQuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtbWJoYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIF9fV0NEOTM0WF9NQkhDX0hfXwotI2RlZmluZSBfX1dDRDkzNFhfTUJIQ19IX18KLSNpbmNsdWRlICIuLi93Y2QtbWJoYy12Mi5oIgotCi1lbnVtIHdjZDkzNHhfb25fZGVtYW5kX3N1cHBseV9uYW1lIHsKLQlXQ0Q5MzRYX09OX0RFTUFORF9NSUNCSUFTID0gMCwKLQlXQ0Q5MzRYX09OX0RFTUFORF9TVVBQTElFU19NQVgsCi19OwotCi1zdHJ1Y3Qgd2NkOTM0eF9vbl9kZW1hbmRfc3VwcGx5IHsKLQlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHk7Ci0JaW50IG9uZGVtYW5kX3N1cHBseV9jb3VudDsKLX07Ci0KLXN0cnVjdCB3Y2Q5MzR4X21iaGMgewotCXN0cnVjdCB3Y2RfbWJoYyB3Y2RfbWJoYzsKLQlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBub3RpZmllcjsKLQlzdHJ1Y3Qgd2NkOTM0eF9vbl9kZW1hbmRfc3VwcGx5IG9uX2RlbWFuZF9saXN0WwotCQkJV0NEOTM0WF9PTl9ERU1BTkRfU1VQUExJRVNfTUFYXTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YTsKLQlib29sIG1iaGNfc3RhcnRlZDsKLQlib29sIGlzX2hwaF9yZWNvdmVyOwotfTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TT0NfV0NEOTM0WF9NQkhDKQotZXh0ZXJuIGludCB0YXZpbF9tYmhjX2luaXQoc3RydWN0IHdjZDkzNHhfbWJoYyAqKm1iaGMsCi0JCQkgICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICBzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YSk7Ci1leHRlcm4gdm9pZCB0YXZpbF9tYmhjX2hzX2RldGVjdF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Ci1leHRlcm4gaW50IHRhdmlsX21iaGNfaHNfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQlzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZyk7Ci1leHRlcm4gdm9pZCB0YXZpbF9tYmhjX2RlaW5pdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIGludCB0YXZpbF9tYmhjX3Bvc3Rfc3NyX2luaXQoc3RydWN0IHdjZDkzNHhfbWJoYyAqbWJoYywKLQkJCQkgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLWV4dGVybiBpbnQgdGF2aWxfbWJoY19nZXRfaW1wZWRhbmNlKHN0cnVjdCB3Y2Q5MzR4X21iaGMgKndjZDkzNHhfbWJoYywKLQkJCQkgICAgdWludDMyX3QgKnpsLCB1aW50MzJfdCAqenIpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IHRhdmlsX21iaGNfaW5pdChzdHJ1Y3Qgd2NkOTM0eF9tYmhjICoqbWJoYywKLQkJCQkgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIHN0cnVjdCBmd19pbmZvICpmd19kYXRhKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIHRhdmlsX21iaGNfaHNfZGV0ZWN0X2V4aXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotfQotc3RhdGljIGlubGluZSBpbnQgdGF2aWxfbWJoY19oc19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKLXsKLQkJcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGF2aWxfbWJoY19kZWluaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotfQotc3RhdGljIGlubGluZSBpbnQgdGF2aWxfbWJoY19wb3N0X3Nzcl9pbml0KHN0cnVjdCB3Y2Q5MzR4X21iaGMgKm1iaGMsCi0JCQkJCSAgIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHRhdmlsX21iaGNfZ2V0X2ltcGVkYW5jZShzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp3Y2Q5MzR4X21iaGMsCi0JCQkJCSAgIHVpbnQzMl90ICp6bCwgdWludDMyX3QgKnpyKQotewotCWlmICh6bCkKLQkJKnpsID0gMDsKLQlpZiAoenIpCi0JCSp6ciA9IDA7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fV0NEOTM0WF9NQkhDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtcm91dGluZy5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHgtcm91dGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ExYWQzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LXJvdXRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIFdDRDkzNFhfUk9VVElOR19ICi0jZGVmaW5lIFdDRDkzNFhfUk9VVElOR19ICi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotCi1jb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHRhdmlsX3NsaW1fYXVkaW9fbWFwW10gPSB7Ci0KLQkvKiBWaXJ0dWFsIGlucHV0IHdpZGdldHMgKi8KLQl7IkFJRjEgQ0FQIiwgTlVMTCwgIkFJRjFfQ0FQIE1peGVyIn0sCi0JeyJBSUYyIENBUCIsIE5VTEwsICJBSUYyX0NBUCBNaXhlciJ9LAotCXsiQUlGMyBDQVAiLCBOVUxMLCAiQUlGM19DQVAgTWl4ZXIifSwKLQl7IkFJRjQgTUFEIiwgTlVMTCwgIkFJRjRfTUFEIE1peGVyIn0sCi0KLQkvKiBWaXJ0dWFsIGlucHV0IHdpZGdldCBNaXhlciAqLwotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDAiLCAiU0xJTSBUWDAifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIn0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0In0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3In0sCi0JeyJBSUYxX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCJ9LAotCXsiQUlGMV9DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMSIsICJTTElNIFRYMTEifSwKLQl7IkFJRjFfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMyIsICJTTElNIFRYMTMifSwKLQotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDAiLCAiU0xJTSBUWDAifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIn0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0In0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3In0sCi0JeyJBSUYyX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCJ9LAotCXsiQUlGMl9DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMSIsICJTTElNIFRYMTEifSwKLQl7IkFJRjJfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMyIsICJTTElNIFRYMTMifSwKLQotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDAiLCAiU0xJTSBUWDAifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxIiwgIlNMSU0gVFgxIn0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYMiIsICJTTElNIFRYMiJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDMiLCAiU0xJTSBUWDMifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg0IiwgIlNMSU0gVFg0In0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYNSIsICJTTElNIFRYNSJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDYiLCAiU0xJTSBUWDYifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFg3IiwgIlNMSU0gVFg3In0sCi0JeyJBSUYzX0NBUCBNaXhlciIsICJTTElNIFRYOCIsICJTTElNIFRYOCJ9LAotCXsiQUlGM19DQVAgTWl4ZXIiLCAiU0xJTSBUWDkiLCAiU0xJTSBUWDkifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMCIsICJTTElNIFRYMTAifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMSIsICJTTElNIFRYMTEifSwKLQl7IkFJRjNfQ0FQIE1peGVyIiwgIlNMSU0gVFgxMyIsICJTTElNIFRYMTMifSwKLQotCXsiQUlGNF9NQUQgTWl4ZXIiLCAiU0xJTSBUWDEzIiwgIlNMSU0gVFgxMyJ9LAotCi0JeyJTTElNIFJYMCBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYMSBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYMiBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYMyBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYNCBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYNSBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYNiBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0JeyJTTElNIFJYNyBNVVgiLCAiQUlGMV9QQiIsICJBSUYxIFBCIn0sCi0KLQl7IlNMSU0gUlgwIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgxIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgyIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlgzIE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg0IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg1IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg2IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQl7IlNMSU0gUlg3IE1VWCIsICJBSUYyX1BCIiwgIkFJRjIgUEIifSwKLQotCXsiU0xJTSBSWDAgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDEgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDIgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDMgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDQgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDUgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDYgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCXsiU0xJTSBSWDcgTVVYIiwgIkFJRjNfUEIiLCAiQUlGMyBQQiJ9LAotCi0JeyJTTElNIFJYMCBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYMSBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYMiBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYMyBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYNCBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYNSBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYNiBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0JeyJTTElNIFJYNyBNVVgiLCAiQUlGNF9QQiIsICJBSUY0IFBCIn0sCi0KLQl7IlNMSU0gUlgwIiwgTlVMTCwgIlNMSU0gUlgwIE1VWCJ9LAotCXsiU0xJTSBSWDEiLCBOVUxMLCAiU0xJTSBSWDEgTVVYIn0sCi0JeyJTTElNIFJYMiIsIE5VTEwsICJTTElNIFJYMiBNVVgifSwKLQl7IlNMSU0gUlgzIiwgTlVMTCwgIlNMSU0gUlgzIE1VWCJ9LAotCXsiU0xJTSBSWDQiLCBOVUxMLCAiU0xJTSBSWDQgTVVYIn0sCi0JeyJTTElNIFJYNSIsIE5VTEwsICJTTElNIFJYNSBNVVgifSwKLQl7IlNMSU0gUlg2IiwgTlVMTCwgIlNMSU0gUlg2IE1VWCJ9LAotCXsiU0xJTSBSWDciLCBOVUxMLCAiU0xJTSBSWDcgTVVYIn0sCi0KLX07Ci0KLWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgdGF2aWxfYXVkaW9fbWFwW10gPSB7Ci0KLQkvKiBXRE1BMyAqLwotCXsiV0RNQTMgUE9SVDAgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IldETUEzIFBPUlQwIE1VWCIsICJSWF9NSVhfVFgwIiwgIlJYIE1JWCBUWDAgTVVYIn0sCi0JeyJXRE1BMyBQT1JUMSBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiV0RNQTMgUE9SVDEgTVVYIiwgIlJYX01JWF9UWDEiLCAiUlggTUlYIFRYMSBNVVgifSwKLQl7IldETUEzIFBPUlQyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJXRE1BMyBQT1JUMiBNVVgiLCAiUlhfTUlYX1RYMiIsICJSWCBNSVggVFgyIE1VWCJ9LAotCXsiV0RNQTMgUE9SVDMgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IldETUEzIFBPUlQzIE1VWCIsICJSWF9NSVhfVFgzIiwgIlJYIE1JWCBUWDMgTVVYIn0sCi0JeyJXRE1BMyBQT1JUNCBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiV0RNQTMgUE9SVDQgTVVYIiwgIlJYX01JWF9UWDQiLCAiUlggTUlYIFRYNCBNVVgifSwKLQl7IldETUEzIFBPUlQ1IE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJXRE1BMyBQT1JUNSBNVVgiLCAiUlhfTUlYX1RYNSIsICJSWCBNSVggVFg1IE1VWCJ9LAotCXsiV0RNQTMgUE9SVDYgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IldETUEzIFBPUlQ2IE1VWCIsICJSWF9NSVhfVFg2IiwgIlJYIE1JWCBUWDYgTVVYIn0sCi0KLQl7IldETUEzIENIMCBNVVgiLCAiUE9SVF8wIiwgIldETUEzIFBPUlQwIE1VWCJ9LAotCXsiV0RNQTMgQ0gwIE1VWCIsICJQT1JUXzEiLCAiV0RNQTMgUE9SVDEgTVVYIn0sCi0JeyJXRE1BMyBDSDAgTVVYIiwgIlBPUlRfMiIsICJXRE1BMyBQT1JUMiBNVVgifSwKLQl7IldETUEzIENIMCBNVVgiLCAiUE9SVF8zIiwgIldETUEzIFBPUlQzIE1VWCJ9LAotCXsiV0RNQTMgQ0gwIE1VWCIsICJQT1JUXzQiLCAiV0RNQTMgUE9SVDQgTVVYIn0sCi0JeyJXRE1BMyBDSDAgTVVYIiwgIlBPUlRfNSIsICJXRE1BMyBQT1JUNSBNVVgifSwKLQl7IldETUEzIENIMCBNVVgiLCAiUE9SVF82IiwgIldETUEzIFBPUlQ2IE1VWCJ9LAotCXsiV0RNQTMgQ0gwIE1VWCIsICJQT1JUXzciLCAiQURDIE1VWDcifSwKLQl7IldETUEzIENIMCBNVVgiLCAiUE9SVF84IiwgIkFEQyBNVVg4In0sCi0KLQl7IldETUEzIENIMSBNVVgiLCAiUE9SVF8wIiwgIldETUEzIFBPUlQwIE1VWCJ9LAotCXsiV0RNQTMgQ0gxIE1VWCIsICJQT1JUXzEiLCAiV0RNQTMgUE9SVDEgTVVYIn0sCi0JeyJXRE1BMyBDSDEgTVVYIiwgIlBPUlRfMiIsICJXRE1BMyBQT1JUMiBNVVgifSwKLQl7IldETUEzIENIMSBNVVgiLCAiUE9SVF8zIiwgIldETUEzIFBPUlQzIE1VWCJ9LAotCXsiV0RNQTMgQ0gxIE1VWCIsICJQT1JUXzQiLCAiV0RNQTMgUE9SVDQgTVVYIn0sCi0JeyJXRE1BMyBDSDEgTVVYIiwgIlBPUlRfNSIsICJXRE1BMyBQT1JUNSBNVVgifSwKLQl7IldETUEzIENIMSBNVVgiLCAiUE9SVF82IiwgIldETUEzIFBPUlQ2IE1VWCJ9LAotCXsiV0RNQTMgQ0gxIE1VWCIsICJQT1JUXzciLCAiQURDIE1VWDcifSwKLQl7IldETUEzIENIMSBNVVgiLCAiUE9SVF84IiwgIkFEQyBNVVg4In0sCi0KLQl7IldETUEzIENIMiBNVVgiLCAiUE9SVF8wIiwgIldETUEzIFBPUlQwIE1VWCJ9LAotCXsiV0RNQTMgQ0gyIE1VWCIsICJQT1JUXzEiLCAiV0RNQTMgUE9SVDEgTVVYIn0sCi0JeyJXRE1BMyBDSDIgTVVYIiwgIlBPUlRfMiIsICJXRE1BMyBQT1JUMiBNVVgifSwKLQl7IldETUEzIENIMiBNVVgiLCAiUE9SVF8zIiwgIldETUEzIFBPUlQzIE1VWCJ9LAotCXsiV0RNQTMgQ0gyIE1VWCIsICJQT1JUXzQiLCAiV0RNQTMgUE9SVDQgTVVYIn0sCi0JeyJXRE1BMyBDSDIgTVVYIiwgIlBPUlRfNSIsICJXRE1BMyBQT1JUNSBNVVgifSwKLQl7IldETUEzIENIMiBNVVgiLCAiUE9SVF82IiwgIldETUEzIFBPUlQ2IE1VWCJ9LAotCXsiV0RNQTMgQ0gyIE1VWCIsICJQT1JUXzciLCAiQURDIE1VWDcifSwKLQl7IldETUEzIENIMiBNVVgiLCAiUE9SVF84IiwgIkFEQyBNVVg4In0sCi0KLQl7IldETUEzIENIMyBNVVgiLCAiUE9SVF8wIiwgIldETUEzIFBPUlQwIE1VWCJ9LAotCXsiV0RNQTMgQ0gzIE1VWCIsICJQT1JUXzEiLCAiV0RNQTMgUE9SVDEgTVVYIn0sCi0JeyJXRE1BMyBDSDMgTVVYIiwgIlBPUlRfMiIsICJXRE1BMyBQT1JUMiBNVVgifSwKLQl7IldETUEzIENIMyBNVVgiLCAiUE9SVF8zIiwgIldETUEzIFBPUlQzIE1VWCJ9LAotCXsiV0RNQTMgQ0gzIE1VWCIsICJQT1JUXzQiLCAiV0RNQTMgUE9SVDQgTVVYIn0sCi0JeyJXRE1BMyBDSDMgTVVYIiwgIlBPUlRfNSIsICJXRE1BMyBQT1JUNSBNVVgifSwKLQl7IldETUEzIENIMyBNVVgiLCAiUE9SVF82IiwgIldETUEzIFBPUlQ2IE1VWCJ9LAotCXsiV0RNQTMgQ0gzIE1VWCIsICJQT1JUXzciLCAiQURDIE1VWDcifSwKLQl7IldETUEzIENIMyBNVVgiLCAiUE9SVF84IiwgIkFEQyBNVVg4In0sCi0KLQl7IldETUEzX0NIX01JWEVSIiwgTlVMTCwgIldETUEzIENIMCBNVVgifSwKLQl7IldETUEzX0NIX01JWEVSIiwgTlVMTCwgIldETUEzIENIMSBNVVgifSwKLQl7IldETUEzX0NIX01JWEVSIiwgTlVMTCwgIldETUEzIENIMiBNVVgifSwKLQl7IldETUEzX0NIX01JWEVSIiwgTlVMTCwgIldETUEzIENIMyBNVVgifSwKLQotCXsiV0RNQTNfT05fT0ZGIiwgIlN3aXRjaCIsICJXRE1BM19DSF9NSVhFUiJ9LAotCXsiV0RNQTNfT1VUIiwgTlVMTCwgIldETUEzX09OX09GRiJ9LAotCi0JLyogTUFEICovCi0JeyJNQURfU0VMIE1VWCIsICJTUEUiLCAiTUFEX0NQRV9JTlBVVCJ9LAotCXsiTUFEX1NFTCBNVVgiLCAiTVNNIiwgIk1BRElOUFVUIn0sCi0KLQl7Ik1BRF9JTlAgTVVYIiwgIk1BRCIsICJNQURfU0VMIE1VWCJ9LAotCXsiTUFEX0lOUCBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCi0JeyJNQURfQlJPQURDQVNUIiwgIlN3aXRjaCIsICJNQURfSU5QIE1VWCJ9LAotCXsiTUFEX0NQRTEiLCAiU3dpdGNoIiwgIk1BRF9JTlAgTVVYIn0sCi0JeyJNQURfQ1BFMiIsICJTd2l0Y2giLCAiTUFEX0lOUCBNVVgifSwKLQotCXsiTUFEX0NQRV9PVVQxIiwgTlVMTCwgIk1BRF9DUEUxIn0sCi0JeyJNQURfQ1BFX09VVDIiLCBOVUxMLCAiTUFEX0NQRTIifSwKLQotCS8qIFZJIEZlZWRiYWNrICovCi0JeyJBSUY0X1ZJIE1peGVyIiwgIlNQS1JfVklfMSIsICJWSUlOUFVUIn0sCi0JeyJBSUY0X1ZJIE1peGVyIiwgIlNQS1JfVklfMiIsICJWSUlOUFVUIn0sCi0JeyJBSUY0IFZJIiwgTlVMTCwgIkFJRjRfVkkgTWl4ZXIifSwKLQotCS8qIENEQyBUeCBpbnRlcmZhY2Ugd2l0aCBTTElNQlVTICovCi0JeyJTTElNIFRYMCIsIE5VTEwsICJDRENfSUYgVFgwIE1VWCJ9LAotCXsiU0xJTSBUWDEiLCBOVUxMLCAiQ0RDX0lGIFRYMSBNVVgifSwKLQl7IlNMSU0gVFgyIiwgTlVMTCwgIkNEQ19JRiBUWDIgTVVYIn0sCi0JeyJTTElNIFRYMyIsIE5VTEwsICJDRENfSUYgVFgzIE1VWCJ9LAotCXsiU0xJTSBUWDQiLCBOVUxMLCAiQ0RDX0lGIFRYNCBNVVgifSwKLQl7IlNMSU0gVFg1IiwgTlVMTCwgIkNEQ19JRiBUWDUgTVVYIn0sCi0JeyJTTElNIFRYNiIsIE5VTEwsICJDRENfSUYgVFg2IE1VWCJ9LAotCXsiU0xJTSBUWDciLCBOVUxMLCAiQ0RDX0lGIFRYNyBNVVgifSwKLQl7IlNMSU0gVFg4IiwgTlVMTCwgIkNEQ19JRiBUWDggTVVYIn0sCi0JeyJTTElNIFRYOSIsIE5VTEwsICJDRENfSUYgVFg5IE1VWCJ9LAotCXsiU0xJTSBUWDEwIiwgTlVMTCwgIkNEQ19JRiBUWDEwIE1VWCJ9LAotCXsiU0xJTSBUWDExIiwgTlVMTCwgIkNEQ19JRiBUWDExIE1VWCJ9LAotCXsiU0xJTSBUWDEzIiwgTlVMTCwgIkNEQ19JRiBUWDEzIE1VWCJ9LAotCi0JeyJDRENfSUYgVFgwIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJDRENfSUYgVFgwIE1VWCIsICJSWF9NSVhfVFgwIiwgIlJYIE1JWCBUWDAgTVVYIn0sCi0JeyJDRENfSUYgVFgwIE1VWCIsICJERUMwXzE5MiIsICJBREMgVVMgTVVYMCJ9LAotCi0JeyJDRENfSUYgVFgxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJDRENfSUYgVFgxIE1VWCIsICJSWF9NSVhfVFgxIiwgIlJYIE1JWCBUWDEgTVVYIn0sCi0JeyJDRENfSUYgVFgxIE1VWCIsICJERUMxXzE5MiIsICJBREMgVVMgTVVYMSJ9LAotCi0JeyJDRENfSUYgVFgyIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJDRENfSUYgVFgyIE1VWCIsICJSWF9NSVhfVFgyIiwgIlJYIE1JWCBUWDIgTVVYIn0sCi0JeyJDRENfSUYgVFgyIE1VWCIsICJERUMyXzE5MiIsICJBREMgVVMgTVVYMiJ9LAotCi0JeyJDRENfSUYgVFgzIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJDRENfSUYgVFgzIE1VWCIsICJSWF9NSVhfVFgzIiwgIlJYIE1JWCBUWDMgTVVYIn0sCi0JeyJDRENfSUYgVFgzIE1VWCIsICJERUMzXzE5MiIsICJBREMgVVMgTVVYMyJ9LAotCi0JeyJDRENfSUYgVFg0IE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJDRENfSUYgVFg0IE1VWCIsICJSWF9NSVhfVFg0IiwgIlJYIE1JWCBUWDQgTVVYIn0sCi0JeyJDRENfSUYgVFg0IE1VWCIsICJERUM0XzE5MiIsICJBREMgVVMgTVVYNCJ9LAotCi0JeyJDRENfSUYgVFg1IE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJDRENfSUYgVFg1IE1VWCIsICJSWF9NSVhfVFg1IiwgIlJYIE1JWCBUWDUgTVVYIn0sCi0JeyJDRENfSUYgVFg1IE1VWCIsICJERUM1XzE5MiIsICJBREMgVVMgTVVYNSJ9LAotCi0JeyJDRENfSUYgVFg2IE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJDRENfSUYgVFg2IE1VWCIsICJSWF9NSVhfVFg2IiwgIlJYIE1JWCBUWDYgTVVYIn0sCi0JeyJDRENfSUYgVFg2IE1VWCIsICJERUM2XzE5MiIsICJBREMgVVMgTVVYNiJ9LAotCi0JeyJDRENfSUYgVFg3IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJDRENfSUYgVFg3IE1VWCIsICJSWF9NSVhfVFg3IiwgIlJYIE1JWCBUWDcgTVVYIn0sCi0JeyJDRENfSUYgVFg3IE1VWCIsICJERUM3XzE5MiIsICJBREMgVVMgTVVYNyJ9LAotCi0JeyJDRENfSUYgVFg4IE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJDRENfSUYgVFg4IE1VWCIsICJSWF9NSVhfVFg4IiwgIlJYIE1JWCBUWDggTVVYIn0sCi0JeyJDRENfSUYgVFg4IE1VWCIsICJERUM4XzE5MiIsICJBREMgVVMgTVVYOCJ9LAotCi0JeyJDRENfSUYgVFg5IE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJDRENfSUYgVFg5IE1VWCIsICJERUM3XzE5MiIsICJBREMgVVMgTVVYNyJ9LAotCXsiQ0RDX0lGIFRYMTAgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IkNEQ19JRiBUWDEwIE1VWCIsICJERUM2XzE5MiIsICJBREMgVVMgTVVYNiJ9LAotCi0JeyJDRENfSUYgVFgxMSBNVVgiLCAiREVDXzBfNSIsICJDRENfSUYgVFgxMSBJTlAxIE1VWCJ9LAotCXsiQ0RDX0lGIFRYMTEgTVVYIiwgIkRFQ185XzEyIiwgIkNEQ19JRiBUWDExIElOUDEgTVVYIn0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJDRENfSUYgVFgxMSBJTlAxIE1VWCIsICJSWF9NSVhfVFg1IiwgIlJYIE1JWCBUWDUgTVVYIn0sCi0KLQl7IkNEQ19JRiBUWDEzIE1VWCIsICJNQURfQlJEQ1NUIiwgIk1BRF9CUk9BRENBU1QifSwKLQl7IkNEQ19JRiBUWDEzIE1VWCIsICJDRENfREVDXzUiLCAiQ0RDX0lGIFRYMTMgSU5QMSBNVVgifSwKLQl7IkNEQ19JRiBUWDEzIElOUDEgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQl7IkNEQ19JRiBUWDEzIElOUDEgTVVYIiwgIkRFQzVfMTkyIiwgIkFEQyBVUyBNVVg1In0sCi0KLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgwIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMCBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDAgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgxIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMSBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDEgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgyIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMiBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDIgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFgzIE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYMyBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDMgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg0IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNCBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDQgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg1IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNSBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDUgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg2IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNiBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDYgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg3IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYNyBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDcgTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDAiLCAiUlggSU5UMCBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVgxIiwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYMiIsICJSWCBJTlQyIFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDMiLCAiUlggSU5UMyBTRUMgTUlYIn0sCi0JeyJSWCBNSVggVFg4IE1VWCIsICJSWF9NSVg0IiwgIlJYIElOVDQgU0VDIE1JWCJ9LAotCXsiUlggTUlYIFRYOCBNVVgiLCAiUlhfTUlYNyIsICJSWCBJTlQ3IFNFQyBNSVgifSwKLQl7IlJYIE1JWCBUWDggTVVYIiwgIlJYX01JWDgiLCAiUlggSU5UOCBTRUMgTUlYIn0sCi0KLQl7IkFEQyBVUyBNVVgwIiwgIlVTX1N3aXRjaCIsICJBREMgTVVYMCJ9LAotCXsiQURDIFVTIE1VWDEiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVgxIn0sCi0JeyJBREMgVVMgTVVYMiIsICJVU19Td2l0Y2giLCAiQURDIE1VWDIifSwKLQl7IkFEQyBVUyBNVVgzIiwgIlVTX1N3aXRjaCIsICJBREMgTVVYMyJ9LAotCXsiQURDIFVTIE1VWDQiLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg0In0sCi0JeyJBREMgVVMgTVVYNSIsICJVU19Td2l0Y2giLCAiQURDIE1VWDUifSwKLQl7IkFEQyBVUyBNVVg2IiwgIlVTX1N3aXRjaCIsICJBREMgTVVYNiJ9LAotCXsiQURDIFVTIE1VWDciLCAiVVNfU3dpdGNoIiwgIkFEQyBNVVg3In0sCi0JeyJBREMgVVMgTVVYOCIsICJVU19Td2l0Y2giLCAiQURDIE1VWDgifSwKLQotCXsiQURDIE1VWDAiLCAiRE1JQyIsICJETUlDIE1VWDAifSwKLQl7IkFEQyBNVVgwIiwgIkFNSUMiLCAiQU1JQyBNVVgwIn0sCi0JeyJBREMgTVVYMSIsICJETUlDIiwgIkRNSUMgTVVYMSJ9LAotCXsiQURDIE1VWDEiLCAiQU1JQyIsICJBTUlDIE1VWDEifSwKLQl7IkFEQyBNVVgyIiwgIkRNSUMiLCAiRE1JQyBNVVgyIn0sCi0JeyJBREMgTVVYMiIsICJBTUlDIiwgIkFNSUMgTVVYMiJ9LAotCXsiQURDIE1VWDMiLCAiRE1JQyIsICJETUlDIE1VWDMifSwKLQl7IkFEQyBNVVgzIiwgIkFNSUMiLCAiQU1JQyBNVVgzIn0sCi0JeyJBREMgTVVYNCIsICJETUlDIiwgIkRNSUMgTVVYNCJ9LAotCXsiQURDIE1VWDQiLCAiQU1JQyIsICJBTUlDIE1VWDQifSwKLQl7IkFEQyBNVVg1IiwgIkRNSUMiLCAiRE1JQyBNVVg1In0sCi0JeyJBREMgTVVYNSIsICJBTUlDIiwgIkFNSUMgTVVYNSJ9LAotCXsiQURDIE1VWDYiLCAiRE1JQyIsICJETUlDIE1VWDYifSwKLQl7IkFEQyBNVVg2IiwgIkFNSUMiLCAiQU1JQyBNVVg2In0sCi0JeyJBREMgTVVYNyIsICJETUlDIiwgIkRNSUMgTVVYNyJ9LAotCXsiQURDIE1VWDciLCAiQU1JQyIsICJBTUlDIE1VWDcifSwKLQl7IkFEQyBNVVg4IiwgIkRNSUMiLCAiRE1JQyBNVVg4In0sCi0JeyJBREMgTVVYOCIsICJBTUlDIiwgIkFNSUMgTVVYOCJ9LAotCXsiQURDIE1VWDEwIiwgIkRNSUMiLCAiRE1JQyBNVVgxMCJ9LAotCXsiQURDIE1VWDEwIiwgIkFNSUMiLCAiQU1JQyBNVVgxMCJ9LAotCXsiQURDIE1VWDExIiwgIkRNSUMiLCAiRE1JQyBNVVgxMSJ9LAotCXsiQURDIE1VWDExIiwgIkFNSUMiLCAiQU1JQyBNVVgxMSJ9LAotCXsiQURDIE1VWDEyIiwgIkRNSUMiLCAiRE1JQyBNVVgxMiJ9LAotCXsiQURDIE1VWDEyIiwgIkFNSUMiLCAiQU1JQyBNVVgxMiJ9LAotCXsiQURDIE1VWDEzIiwgIkRNSUMiLCAiRE1JQyBNVVgxMyJ9LAotCXsiQURDIE1VWDEzIiwgIkFNSUMiLCAiQU1JQyBNVVgxMyJ9LAotCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYMyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNSIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNiIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYNyIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDEwIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTEiLCAiQURDIE1VWDExIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEyIn0sCi0JeyJBREMgTVVYOCIsICJBTkNfRkJfVFVORTIiLCAiQURDIE1VWDEzIn0sCi0KLQl7IkRNSUMgTVVYMCIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVgwIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDAiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMCIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVgwIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDAiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMCIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYMCIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYMCIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMCIsICJBREM0IiwgIkFEQzQifSwKLQotCXsiRE1JQyBNVVgxIiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDEiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMSIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVgxIiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDEiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMSIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVgxIiwgIkFEQzQiLCAiQURDNCJ9LAotCi0JeyJETUlDIE1VWDIiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMiIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVgyIiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDIiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMiIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVgyIiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDIiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYMyIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVgzIiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDMiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMyIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVgzIiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDMiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMyIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYMyIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYMyIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMyIsICJBREM0IiwgIkFEQzQifSwKLQotCXsiRE1JQyBNVVg0IiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDQiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYNCIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVg0IiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDQiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYNCIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVg0IiwgIkFEQzQiLCAiQURDNCJ9LAotCi0JeyJETUlDIE1VWDUiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYNSIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVg1IiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDUiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYNSIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVg1IiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDUiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYNiIsICJETUlDMCIsICJETUlDMCJ9LAotCXsiRE1JQyBNVVg2IiwgIkRNSUMxIiwgIkRNSUMxIn0sCi0JeyJETUlDIE1VWDYiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYNiIsICJETUlDMyIsICJETUlDMyJ9LAotCXsiRE1JQyBNVVg2IiwgIkRNSUM0IiwgIkRNSUM0In0sCi0JeyJETUlDIE1VWDYiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYNiIsICJBREMxIiwgIkFEQzEifSwKLQl7IkFNSUMgTVVYNiIsICJBREMyIiwgIkFEQzIifSwKLQl7IkFNSUMgTVVYNiIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYNiIsICJBREM0IiwgIkFEQzQifSwKLQotCXsiRE1JQyBNVVg3IiwgIkRNSUMwIiwgIkRNSUMwIn0sCi0JeyJETUlDIE1VWDciLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYNyIsICJETUlDMiIsICJETUlDMiJ9LAotCXsiRE1JQyBNVVg3IiwgIkRNSUMzIiwgIkRNSUMzIn0sCi0JeyJETUlDIE1VWDciLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYNyIsICJETUlDNSIsICJETUlDNSJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzEiLCAiQURDMSJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzMiLCAiQURDMyJ9LAotCXsiQU1JQyBNVVg3IiwgIkFEQzQiLCAiQURDNCJ9LAotCi0JeyJETUlDIE1VWDgiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYOCIsICJETUlDMSIsICJETUlDMSJ9LAotCXsiRE1JQyBNVVg4IiwgIkRNSUMyIiwgIkRNSUMyIn0sCi0JeyJETUlDIE1VWDgiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYOCIsICJETUlDNCIsICJETUlDNCJ9LAotCXsiRE1JQyBNVVg4IiwgIkRNSUM1IiwgIkRNSUM1In0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMiIsICJBREMyIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDMyIsICJBREMzIn0sCi0JeyJBTUlDIE1VWDgiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTAiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTAiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDEwIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMCIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTAiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTEiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTEiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDExIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMSIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTEiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTIiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTIiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDEyIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMiIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTIiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzAiLCAiRE1JQzAifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzEiLCAiRE1JQzEifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzIiLCAiRE1JQzIifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzMiLCAiRE1JQzMifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzQiLCAiRE1JQzQifSwKLQl7IkRNSUMgTVVYMTMiLCAiRE1JQzUiLCAiRE1JQzUifSwKLQl7IkFNSUMgTVVYMTMiLCAiQURDMSIsICJBREMxIn0sCi0JeyJBTUlDIE1VWDEzIiwgIkFEQzIiLCAiQURDMiJ9LAotCXsiQU1JQyBNVVgxMyIsICJBREMzIiwgIkFEQzMifSwKLQl7IkFNSUMgTVVYMTMiLCAiQURDNCIsICJBREM0In0sCi0KLQl7IkFNSUM0XzUgU0VMIiwgIkFNSUM0IiwgIkFNSUM0In0sCi0JeyJBTUlDNF81IFNFTCIsICJBTUlDNSIsICJBTUlDNSJ9LAotCi0JeyJBREMxIiwgTlVMTCwgIkFNSUMxIn0sCi0JeyJBREMyIiwgTlVMTCwgIkFNSUMyIn0sCi0JeyJBREMzIiwgTlVMTCwgIkFNSUMzIn0sCi0JeyJBREM0IiwgTlVMTCwgIkFNSUM0XzUgU0VMIn0sCi0KLQkvKiBDREMgUnggaW50ZXJmYWNlIHdpdGggU0xJTUJVUyAqLwotCXsiQ0RDX0lGIFJYMCBNVVgiLCAiU0xJTSBSWDAiLCAiU0xJTSBSWDAifSwKLQl7IkNEQ19JRiBSWDEgTVVYIiwgIlNMSU0gUlgxIiwgIlNMSU0gUlgxIn0sCi0JeyJDRENfSUYgUlgyIE1VWCIsICJTTElNIFJYMiIsICJTTElNIFJYMiJ9LAotCXsiQ0RDX0lGIFJYMyBNVVgiLCAiU0xJTSBSWDMiLCAiU0xJTSBSWDMifSwKLQl7IkNEQ19JRiBSWDQgTVVYIiwgIlNMSU0gUlg0IiwgIlNMSU0gUlg0In0sCi0JeyJDRENfSUYgUlg1IE1VWCIsICJTTElNIFJYNSIsICJTTElNIFJYNSJ9LAotCXsiQ0RDX0lGIFJYNiBNVVgiLCAiU0xJTSBSWDYiLCAiU0xJTSBSWDYifSwKLQl7IkNEQ19JRiBSWDcgTVVYIiwgIlNMSU0gUlg3IiwgIlNMSU0gUlg3In0sCi0KLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMSIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDBfMSBNSVgxIElOUDIiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQwXzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMF8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDAiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAxIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UMV8xIE1JWDEgSU5QMiIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDFfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQxXzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDAiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAxIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UMl8xIE1JWDEgSU5QMiIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDJfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQyXzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDEiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQzXzEgTUlYMSBJTlAyIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UM18xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDNfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCi0KLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMCIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDAiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMSIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDEiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAxIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDRfMSBNSVgxIElOUDIiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTUlYMSBJTlAyIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UNF8xIE1JWDEgSU5QMiIsICJJSVIxIiwgIklJUjEifSwKLQotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDAiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAwIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMCIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMSIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDEiLCAiSUlSMSIsICJJSVIxIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UN18xIE1JWDEgSU5QMiIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDdfMSBNSVgxIElOUDIiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ3XzEgTUlYMSBJTlAyIiwgIklJUjEiLCAiSUlSMSJ9LAotCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDAiLCAiSUlSMCIsICJJSVIwIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAwIiwgIklJUjEiLCAiSUlSMSJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDEiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgIklJUjAiLCAiSUlSMCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMSIsICJJSVIxIiwgIklJUjEifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQ4XzEgTUlYMSBJTlAyIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UOF8xIE1JWDEgSU5QMiIsICJJSVIwIiwgIklJUjAifSwKLQl7IlJYIElOVDhfMSBNSVgxIElOUDIiLCAiSUlSMSIsICJJSVIxIn0sCi0KLQl7IlJYIElOVDBfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDBfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDBfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDBfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDBfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDBfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDFfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDFfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDFfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDJfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDJfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDJfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDNfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDNfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDNfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDNfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDNfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDNfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDRfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDRfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDRfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDRfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDRfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDRfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDdfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDdfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDdfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDdfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDdfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDdfMSBNSVgxIElOUDIifSwKLQl7IlJYIElOVDhfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIElOUDAifSwKLQl7IlJYIElOVDhfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIElOUDEifSwKLQl7IlJYIElOVDhfMSBNSVgxIiwgTlVMTCwgIlJYIElOVDhfMSBNSVgxIElOUDIifSwKLQotCS8qIE1peGluZyBwYXRoIElOVDAgKi8KLQl7IlJYIElOVDBfMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UMF8yIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDBfMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UMF8yIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDBfMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQwXzIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UMF8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQwXzIgTVVYIn0sCi0JeyJSWCBJTlQwIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMF8yIElOVEVSUCJ9LAotCi0JLyogTWl4aW5nIHBhdGggSU5UMSAqLwotCXsiUlggSU5UMV8yIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDFfMiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQxXzIgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UMV8yIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDFfMiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQxXzIgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UMV8yIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDFfMiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQxXzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDFfMiBNVVgifSwKLQl7IlJYIElOVDEgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQxXzIgSU5URVJQIn0sCi0KLQkvKiBNaXhpbmcgcGF0aCBJTlQyICovCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDJfMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDJfMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQyXzIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UMl8yIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDJfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMl8yIE1VWCJ9LAotCXsiUlggSU5UMiBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDJfMiBJTlRFUlAifSwKLQotCS8qIE1peGluZyBwYXRoIElOVDMgKi8KLQl7IlJYIElOVDNfMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UM18yIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDNfMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UM18yIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDNfMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQzXzIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UM18yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQzXzIgTVVYIn0sCi0JeyJSWCBJTlQzIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UM18yIElOVEVSUCJ9LAotCi0JLyogTWl4aW5nIHBhdGggSU5UNCAqLwotCXsiUlggSU5UNF8yIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IlJYIElOVDRfMiBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJSWCBJTlQ0XzIgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiUlggSU5UNF8yIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IlJYIElOVDRfMiBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJSWCBJTlQ0XzIgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiUlggSU5UNF8yIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IlJYIElOVDRfMiBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJSWCBJTlQ0XzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDRfMiBNVVgifSwKLQl7IlJYIElOVDQgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzIgSU5URVJQIn0sCi0KLQkvKiBNaXhpbmcgcGF0aCBJTlQ3ICovCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IlJYIElOVDdfMiBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IlJYIElOVDdfMiBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJSWCBJTlQ3XzIgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiUlggSU5UN18yIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IlJYIElOVDdfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UN18yIE1VWCJ9LAotCXsiUlggSU5UNyBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDdfMiBJTlRFUlAifSwKLQotCS8qIE1peGluZyBwYXRoIElOVDggKi8KLQl7IlJYIElOVDhfMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiUlggSU5UOF8yIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IlJYIElOVDhfMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiUlggSU5UOF8yIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IlJYIElOVDhfMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJSWCBJTlQ4XzIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiUlggSU5UOF8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ4XzIgTVVYIn0sCi0JeyJSWCBJTlQ4IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UOF8yIElOVEVSUCJ9LAotCi0JeyJSWCBJTlQwXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDBfMSBNSVgxIn0sCi0JeyJSWCBJTlQwIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMF8xIElOVEVSUCJ9LAotCXsiUlggSU5UMCBNSVgyIiwgTlVMTCwgIlJYIElOVDAgU0VDIE1JWCJ9LAotCXsiUlggSU5UMCBNSVgyIiwgTlVMTCwgIlJYIElOVDAgTUlYMiBJTlAifSwKLQl7IlJYIElOVDAgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMCBNSVgyIn0sCi0JeyJSWCBJTlQwIERBQyIsIE5VTEwsICJSWCBJTlQwIERFTSBNVVgifSwKLQl7IlJYIElOVDAgREFDIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IkVBUiBQQSIsIE5VTEwsICJSWCBJTlQwIERBQyJ9LAotCXsiRUFSIiwgTlVMTCwgIkVBUiBQQSJ9LAotCi0JeyJSWCBJTlQxXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDFfMSBNSVgxIn0sCi0JeyJSWCBJTlQxIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMV8xIElOVEVSUCJ9LAotCXsiUlggSU5UMSBNSVgyIiwgTlVMTCwgIlJYIElOVDEgU0VDIE1JWCJ9LAotCXsiUlggSU5UMSBNSVgyIiwgTlVMTCwgIlJYIElOVDEgTUlYMiBJTlAifSwKLQl7IlJYIElOVDEgTUlYMyIsIE5VTEwsICJSWCBJTlQxIE1JWDIifSwKLQl7IlJYIElOVDEgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMSBNSVgzIn0sCi0JeyJSWCBJTlQxIERBQyIsIE5VTEwsICJSWCBJTlQxIERFTSBNVVgifSwKLQl7IlJYIElOVDEgREFDIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IkhQSEwgUEEiLCBOVUxMLCAiUlggSU5UMSBEQUMifSwKLQl7IkhQSEwiLCBOVUxMLCAiSFBITCBQQSJ9LAotCi0JeyJSWCBJTlQyXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDJfMSBNSVgxIn0sCi0JeyJSWCBJTlQyIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UMl8xIElOVEVSUCJ9LAotCXsiUlggSU5UMiBNSVgyIiwgTlVMTCwgIlJYIElOVDIgU0VDIE1JWCJ9LAotCXsiUlggSU5UMiBNSVgyIiwgTlVMTCwgIlJYIElOVDIgTUlYMiBJTlAifSwKLQl7IlJYIElOVDIgTUlYMyIsIE5VTEwsICJSWCBJTlQyIE1JWDIifSwKLQl7IlJYIElOVDIgREVNIE1VWCIsICJDTFNIX0RTTV9PVVQiLCAiUlggSU5UMiBNSVgzIn0sCi0JeyJSWCBJTlQyIERBQyIsIE5VTEwsICJSWCBJTlQyIERFTSBNVVgifSwKLQl7IlJYIElOVDIgREFDIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IkhQSFIgUEEiLCBOVUxMLCAiUlggSU5UMiBEQUMifSwKLQl7IkhQSFIiLCBOVUxMLCAiSFBIUiBQQSJ9LAotCi0JeyJSWCBJTlQzXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDNfMSBNSVgxIn0sCi0JeyJSWCBJTlQzIFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UM18xIElOVEVSUCJ9LAotCXsiUlggSU5UMyBNSVgyIiwgTlVMTCwgIlJYIElOVDMgU0VDIE1JWCJ9LAotCXsiUlggSU5UMyBNSVgyIiwgTlVMTCwgIlJYIElOVDMgTUlYMiBJTlAifSwKLQl7IlJYIElOVDMgTUlYMyIsIE5VTEwsICJSWCBJTlQzIE1JWDIifSwKLQl7IlJYIElOVDMgREFDIiwgTlVMTCwgIlJYIElOVDMgTUlYMyJ9LAotCXsiUlggSU5UMyBEQUMiLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiTElORU9VVDEgUEEiLCBOVUxMLCAiUlggSU5UMyBEQUMifSwKLQl7IkxJTkVPVVQxIiwgTlVMTCwgIkxJTkVPVVQxIFBBIn0sCi0KLQl7IlJYIElOVDRfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEifSwKLQl7IlJYIElOVDQgU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ0XzEgSU5URVJQIn0sCi0JeyJSWCBJTlQ0IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UNF8xIE1JWDEifSwKLQl7IlJYIElOVDQgTUlYMiIsIE5VTEwsICJSWCBJTlQ0IFNFQyBNSVgifSwKLQl7IlJYIElOVDQgTUlYMiIsIE5VTEwsICJSWCBJTlQ0IE1JWDIgSU5QIn0sCi0JeyJSWCBJTlQ0IE1JWDMiLCBOVUxMLCAiUlggSU5UNCBNSVgyIn0sCi0JeyJSWCBJTlQ0IERBQyIsIE5VTEwsICJSWCBJTlQ0IE1JWDMifSwKLQl7IlJYIElOVDQgREFDIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IkxJTkVPVVQyIFBBIiwgTlVMTCwgIlJYIElOVDQgREFDIn0sCi0JeyJMSU5FT1VUMiIsIE5VTEwsICJMSU5FT1VUMiBQQSJ9LAotCi0JeyJSWCBJTlQ3XzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDdfMSBNSVgxIn0sCi0JeyJSWCBJTlQ3IFNFQyBNSVgiLCBOVUxMLCAiUlggSU5UN18xIElOVEVSUCJ9LAotCXsiUlggSU5UNyBNSVgyIiwgTlVMTCwgIlJYIElOVDcgU0VDIE1JWCJ9LAotCXsiUlggSU5UNyBNSVgyIiwgTlVMTCwgIlJYIElOVDcgTUlYMiBJTlAifSwKLQl7IlJYIElOVDcgQ0hBSU4iLCBOVUxMLCAiUlggSU5UNyBNSVgyIn0sCi0JeyJSWCBJTlQ3IENIQUlOIiwgTlVMTCwgIlJYX0JJQVMifSwKLQl7IlNQSzEgT1VUIiwgTlVMTCwgIlJYIElOVDcgQ0hBSU4ifSwKLQotCXsiUlggSU5UOF8xIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ4XzEgTUlYMSJ9LAotCXsiUlggSU5UOCBTRUMgTUlYIiwgTlVMTCwgIlJYIElOVDhfMSBJTlRFUlAifSwKLQl7IlJYIElOVDggU0VDIE1JWCIsIE5VTEwsICJSWCBJTlQ4XzEgTUlYMSJ9LAotCXsiUlggSU5UOCBDSEFJTiIsIE5VTEwsICJSWCBJTlQ4IFNFQyBNSVgifSwKLQl7IlJYIElOVDggQ0hBSU4iLCBOVUxMLCAiUlhfQklBUyJ9LAotCXsiU1BLMiBPVVQiLCBOVUxMLCAiUlggSU5UOCBDSEFJTiJ9LAotCi0JLyogQU5DIFJvdXRpbmcgKi8KLQl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9FQVIiLCAiUlggSU5UMCBNSVgyIn0sCi0JeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fSFBITCIsICJSWCBJTlQxIE1JWDIifSwKLQl7IkFOQzAgRkIgTVVYIiwgIkFOQ19JTl9MTzEiLCAiUlggSU5UMyBNSVgyIn0sCi0JeyJBTkMwIEZCIE1VWCIsICJBTkNfSU5fRUFSX1NQS1IiLCAiUlggSU5UNyBNSVgyIn0sCi0JeyJBTkMxIEZCIE1VWCIsICJBTkNfSU5fSFBIUiIsICJSWCBJTlQyIE1JWDIifSwKLQl7IkFOQzEgRkIgTVVYIiwgIkFOQ19JTl9MTzIiLCAiUlggSU5UNCBNSVgyIn0sCi0KLQl7IkFOQyBPVVQgRUFSIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEwIn0sCi0JeyJBTkMgT1VUIEVBUiBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAotCXsiUlggSU5UMCBNSVgyIiwgTlVMTCwgIkFOQyBPVVQgRUFSIEVuYWJsZSJ9LAotCi0JeyJBTkMgT1VUIEhQSEwgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKLQl7IkFOQyBPVVQgSFBITCBFbmFibGUiLCAiU3dpdGNoIiwgIkFEQyBNVVgxMSJ9LAotCXsiUlggSU5UMSBNSVgyIiwgTlVMTCwgIkFOQyBPVVQgSFBITCBFbmFibGUifSwKLQotCXsiQU5DIE9VVCBIUEhSIEVuYWJsZSIsICJTd2l0Y2giLCAiQURDIE1VWDEyIn0sCi0JeyJBTkMgT1VUIEhQSFIgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTMifSwKLQl7IlJYIElOVDIgTUlYMiIsIE5VTEwsICJBTkMgT1VUIEhQSFIgRW5hYmxlIn0sCi0KLQl7IkFOQyBFQVIgUEEiLCBOVUxMLCAiUlggSU5UMCBEQUMifSwKLQl7IkFOQyBFQVIiLCBOVUxMLCAiQU5DIEVBUiBQQSJ9LAotCi0JeyJBTkMgSFBITCBQQSIsIE5VTEwsICJSWCBJTlQxIERBQyJ9LAotCXsiQU5DIEhQSEwiLCBOVUxMLCAiQU5DIEhQSEwgUEEifSwKLQotCXsiQU5DIEhQSFIgUEEiLCBOVUxMLCAiUlggSU5UMiBEQUMifSwKLQl7IkFOQyBIUEhSIiwgTlVMTCwgIkFOQyBIUEhSIFBBIn0sCi0KLQl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTAifSwKLQl7IkFOQyBPVVQgRUFSIFNQS1IgRW5hYmxlIiwgIlN3aXRjaCIsICJBREMgTVVYMTEifSwKLQl7IlJYIElOVDcgTUlYMiIsIE5VTEwsICJBTkMgT1VUIEVBUiBTUEtSIEVuYWJsZSJ9LAotCi0JeyJBTkMgU1BLUiBQQSBFbmFibGUiLCAiU3dpdGNoIiwgIlJYIElOVDcgQ0hBSU4ifSwKLQl7IkFOQyBTUEsxIFBBIiwgTlVMTCwgIkFOQyBTUEtSIFBBIEVuYWJsZSJ9LAotCXsiU1BLMSBPVVQiLCBOVUxMLCAiQU5DIFNQSzEgUEEifSwKLQotCS8qCi0JICogU1JDMCwgU1JDMSBpbnB1dHMgdG8gU2lkZXRvbmUgUlggTWl4ZXIKLQkgKiBvbiBSWDAsIFJYMSwgUlgyLCBSWDMsIFJYNCBhbmQgUlg3IGNoYWlucwotCSAqLwotCXsiSUlSMCIsIE5VTEwsICJJSVIwIElOUDAgTVVYIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IklJUjAgSU5QMCBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJJSVIwIElOUDAgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiSUlSMCBJTlAwIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IklJUjAiLCBOVUxMLCAiSUlSMCBJTlAxIE1VWCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJJSVIwIElOUDEgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiSUlSMCBJTlAxIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IklJUjAgSU5QMSBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJJSVIwIiwgTlVMTCwgIklJUjAgSU5QMiBNVVgifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiSUlSMCBJTlAyIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IklJUjAgSU5QMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJJSVIwIElOUDIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiSUlSMCIsIE5VTEwsICJJSVIwIElOUDMgTVVYIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IklJUjAgSU5QMyBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJJSVIwIElOUDMgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiSUlSMCBJTlAzIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQotCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDAgTVVYIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IklJUjEgSU5QMCBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJJSVIxIElOUDAgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiSUlSMSBJTlAwIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQl7IklJUjEiLCBOVUxMLCAiSUlSMSBJTlAxIE1VWCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUMwIiwgIkFEQyBNVVgwIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzEiLCAiQURDIE1VWDEifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDMiIsICJBREMgTVVYMiJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUMzIiwgIkFEQyBNVVgzIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzQiLCAiQURDIE1VWDQifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDNSIsICJBREMgTVVYNSJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJERUM2IiwgIkFEQyBNVVg2In0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIkRFQzciLCAiQURDIE1VWDcifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiREVDOCIsICJBREMgTVVYOCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJSWDAiLCAiQ0RDX0lGIFJYMCBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlgxIiwgIkNEQ19JRiBSWDEgTVVYIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIlJYMiIsICJDRENfSUYgUlgyIE1VWCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJSWDMiLCAiQ0RDX0lGIFJYMyBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlg0IiwgIkNEQ19JRiBSWDQgTVVYIn0sCi0JeyJJSVIxIElOUDEgTVVYIiwgIlJYNSIsICJDRENfSUYgUlg1IE1VWCJ9LAotCXsiSUlSMSBJTlAxIE1VWCIsICJSWDYiLCAiQ0RDX0lGIFJYNiBNVVgifSwKLQl7IklJUjEgSU5QMSBNVVgiLCAiUlg3IiwgIkNEQ19JRiBSWDcgTVVYIn0sCi0JeyJJSVIxIiwgTlVMTCwgIklJUjEgSU5QMiBNVVgifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDMCIsICJBREMgTVVYMCJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUMxIiwgIkFEQyBNVVgxIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzIiLCAiQURDIE1VWDIifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDMyIsICJBREMgTVVYMyJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUM0IiwgIkFEQyBNVVg0In0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzUiLCAiQURDIE1VWDUifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiREVDNiIsICJBREMgTVVYNiJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJERUM3IiwgIkFEQyBNVVg3In0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIkRFQzgiLCAiQURDIE1VWDgifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiUlgwIiwgIkNEQ19JRiBSWDAgTVVYIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYMSIsICJDRENfSUYgUlgxIE1VWCJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJSWDIiLCAiQ0RDX0lGIFJYMiBNVVgifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiUlgzIiwgIkNEQ19JRiBSWDMgTVVYIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYNCIsICJDRENfSUYgUlg0IE1VWCJ9LAotCXsiSUlSMSBJTlAyIE1VWCIsICJSWDUiLCAiQ0RDX0lGIFJYNSBNVVgifSwKLQl7IklJUjEgSU5QMiBNVVgiLCAiUlg2IiwgIkNEQ19JRiBSWDYgTVVYIn0sCi0JeyJJSVIxIElOUDIgTVVYIiwgIlJYNyIsICJDRENfSUYgUlg3IE1VWCJ9LAotCXsiSUlSMSIsIE5VTEwsICJJSVIxIElOUDMgTVVYIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzAiLCAiQURDIE1VWDAifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDMSIsICJBREMgTVVYMSJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUMyIiwgIkFEQyBNVVgyIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzMiLCAiQURDIE1VWDMifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDNCIsICJBREMgTVVYNCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUM1IiwgIkFEQyBNVVg1In0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIkRFQzYiLCAiQURDIE1VWDYifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiREVDNyIsICJBREMgTVVYNyJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJERUM4IiwgIkFEQyBNVVg4In0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIlJYMCIsICJDRENfSUYgUlgwIE1VWCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDEiLCAiQ0RDX0lGIFJYMSBNVVgifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiUlgyIiwgIkNEQ19JRiBSWDIgTVVYIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIlJYMyIsICJDRENfSUYgUlgzIE1VWCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDQiLCAiQ0RDX0lGIFJYNCBNVVgifSwKLQl7IklJUjEgSU5QMyBNVVgiLCAiUlg1IiwgIkNEQ19JRiBSWDUgTVVYIn0sCi0JeyJJSVIxIElOUDMgTVVYIiwgIlJYNiIsICJDRENfSUYgUlg2IE1VWCJ9LAotCXsiSUlSMSBJTlAzIE1VWCIsICJSWDciLCAiQ0RDX0lGIFJYNyBNVVgifSwKLQotCXsiU1JDMCIsIE5VTEwsICJJSVIwIn0sCi0JeyJTUkMxIiwgTlVMTCwgIklJUjEifSwKLQl7IlJYIElOVDAgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCi0JeyJSWCBJTlQwIE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAotCXsiUlggSU5UMSBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKLQl7IlJYIElOVDEgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCi0JeyJSWCBJTlQyIE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAotCXsiUlggSU5UMiBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKLQl7IlJYIElOVDMgTUlYMiBJTlAiLCAiU1JDMCIsICJTUkMwIn0sCi0JeyJSWCBJTlQzIE1JWDIgSU5QIiwgIlNSQzEiLCAiU1JDMSJ9LAotCXsiUlggSU5UNCBNSVgyIElOUCIsICJTUkMwIiwgIlNSQzAifSwKLQl7IlJYIElOVDQgTUlYMiBJTlAiLCAiU1JDMSIsICJTUkMxIn0sCi0JeyJSWCBJTlQ3IE1JWDIgSU5QIiwgIlNSQzAiLCAiU1JDMCJ9LAotCXsiUlggSU5UNyBNSVgyIElOUCIsICJTUkMxIiwgIlNSQzEifSwKLQotCS8qIE5hdGl2ZSBjbGsgbWFpbiBwYXRoIHJvdXRpbmcgKi8KLQl7IlJYIElOVDFfMSBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDFfMSBNSVgxIn0sCi0JeyJSWCBJTlQxXzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDFfMSBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQxXzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQxIE5BVElWRSBTVVBQTFkifSwKLQotCXsiUlggSU5UMl8xIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UMl8xIE1JWDEifSwKLQl7IlJYIElOVDJfMSBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMl8xIE5BVElWRSBNVVgifSwKLQl7IlJYIElOVDJfMSBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDIgTkFUSVZFIFNVUFBMWSJ9LAotCi0JeyJSWCBJTlQzXzEgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQzXzEgTUlYMSJ9LAotCXsiUlggSU5UM18xIElOVEVSUCIsIE5VTEwsICJSWCBJTlQzXzEgTkFUSVZFIE1VWCJ9LAotCXsiUlggSU5UM18xIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMyBOQVRJVkUgU1VQUExZIn0sCi0KLQl7IlJYIElOVDRfMSBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDRfMSBNSVgxIn0sCi0JeyJSWCBJTlQ0XzEgSU5URVJQIiwgTlVMTCwgIlJYIElOVDRfMSBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQ0XzEgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQ0IE5BVElWRSBTVVBQTFkifSwKLQotCS8qIE5hdGl2ZSBjbGsgbWl4IHBhdGggcm91dGluZyAqLwotCXsiUlggSU5UMV8yIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UMV8yIE1VWCJ9LAotCXsiUlggSU5UMV8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQxXzIgTkFUSVZFIE1VWCJ9LAotCXsiUlggSU5UMV8yIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UMSBOQVRJVkUgU1VQUExZIn0sCi0KLQl7IlJYIElOVDJfMiBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDJfMiBNVVgifSwKLQl7IlJYIElOVDJfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UMl8yIE5BVElWRSBNVVgifSwKLQl7IlJYIElOVDJfMiBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDIgTkFUSVZFIFNVUFBMWSJ9LAotCi0JeyJSWCBJTlQzXzIgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQzXzIgTVVYIn0sCi0JeyJSWCBJTlQzXzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDNfMiBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQzXzIgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQzIE5BVElWRSBTVVBQTFkifSwKLQotCXsiUlggSU5UNF8yIE5BVElWRSBNVVgiLCAiT04iLCAiUlggSU5UNF8yIE1VWCJ9LAotCXsiUlggSU5UNF8yIElOVEVSUCIsIE5VTEwsICJSWCBJTlQ0XzIgTkFUSVZFIE1VWCJ9LAotCXsiUlggSU5UNF8yIE5BVElWRSBNVVgiLCBOVUxMLCAiUlggSU5UNCBOQVRJVkUgU1VQUExZIn0sCi0KLQl7IlJYIElOVDdfMiBOQVRJVkUgTVVYIiwgIk9OIiwgIlJYIElOVDdfMiBNVVgifSwKLQl7IlJYIElOVDdfMiBJTlRFUlAiLCBOVUxMLCAiUlggSU5UN18yIE5BVElWRSBNVVgifSwKLQl7IlJYIElOVDdfMiBOQVRJVkUgTVVYIiwgTlVMTCwgIlJYIElOVDcgTkFUSVZFIFNVUFBMWSJ9LAotCi0JeyJSWCBJTlQ4XzIgTkFUSVZFIE1VWCIsICJPTiIsICJSWCBJTlQ4XzIgTVVYIn0sCi0JeyJSWCBJTlQ4XzIgSU5URVJQIiwgTlVMTCwgIlJYIElOVDhfMiBOQVRJVkUgTVVYIn0sCi0JeyJSWCBJTlQ4XzIgTkFUSVZFIE1VWCIsIE5VTEwsICJSWCBJTlQ4IE5BVElWRSBTVVBQTFkifSwKLQotCS8qIEFTUkMgUm91dGluZyAqLwotCXsiQVNSQzAgTVVYIiwgIkFTUkNfSU5fSFBITCIsICJSWCBJTlQxXzIgSU5URVJQIn0sCi0JeyJSWCBJTlQxIFNFQyBNSVgiLCAiSFBITCBTd2l0Y2giLCAiQVNSQzAgTVVYIn0sCi0KLQl7IkFTUkMxIE1VWCIsICJBU1JDX0lOX0hQSFIiLCAiUlggSU5UMl8yIElOVEVSUCJ9LAotCXsiUlggSU5UMiBTRUMgTUlYIiwgIkhQSFIgU3dpdGNoIiwgIkFTUkMxIE1VWCJ9LAotCi0JeyJBU1JDMCBNVVgiLCAiQVNSQ19JTl9MTzEiLCAiUlggSU5UM18yIElOVEVSUCJ9LAotCXsiUlggSU5UMyBTRUMgTUlYIiwgIkxPMSBTd2l0Y2giLCAiQVNSQzAgTVVYIn0sCi0KLQl7IkFTUkMxIE1VWCIsICJBU1JDX0lOX0xPMiIsICJSWCBJTlQ0XzIgSU5URVJQIn0sCi0JeyJSWCBJTlQ0IFNFQyBNSVgiLCAiTE8yIFN3aXRjaCIsICJBU1JDMSBNVVgifSwKLQotCXsiQVNSQzIgTVVYIiwgIkFTUkNfSU5fU1BLUjEiLCAiUlggSU5UN18yIElOVEVSUCJ9LAotCXsiUlggSU5UNyBTRUMgTUlYIiwgTlVMTCwgIkFTUkMyIE1VWCJ9LAotCi0JeyJBU1JDMyBNVVgiLCAiQVNSQ19JTl9TUEtSMiIsICJSWCBJTlQ4XzIgSU5URVJQIn0sCi0JeyJSWCBJTlQ4IFNFQyBNSVgiLCBOVUxMLCAiQVNSQzMgTVVYIn0sCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMyNmRjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLSNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHgtaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOTM0eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9wZGF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kd2lyZS9zd3Itd2NkLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvaW5mby5oPgotI2luY2x1ZGUgIndjZDkzNHguaCIKLSNpbmNsdWRlICJ3Y2Q5MzR4LW1iaGMuaCIKLSNpbmNsdWRlICJ3Y2Q5MzR4LXJvdXRpbmcuaCIKLSNpbmNsdWRlICJ3Y2Q5MzR4LWRzcC1jbnRsLmgiCi0jaW5jbHVkZSAiLi4vd2NkOXh4eC1jb21tb24tdjIuaCIKLSNpbmNsdWRlICIuLi93Y2Q5eHh4LXJlc21nci12Mi5oIgotI2luY2x1ZGUgIi4uL3djZGNhbC1od2RlcC5oIgotI2luY2x1ZGUgIndjZDkzNHgtZHNkLmgiCi0KLSNkZWZpbmUgV0NEOTM0WF9SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfFwKLQkJCSAgICBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHxcCi0JCQkgICAgU05EUlZfUENNX1JBVEVfOTYwMDAgfCBTTkRSVl9QQ01fUkFURV8xOTIwMDAgfFwKLQkJCSAgICBTTkRSVl9QQ01fUkFURV8zODQwMDApCi0vKiBGcmFjdGlvbmFsIFJhdGVzICovCi0jZGVmaW5lIFdDRDkzNFhfRlJBQ19SQVRFU19NQVNLIChTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHxcCi0JCQkJIFNORFJWX1BDTV9SQVRFXzE3NjQwMCkKLQotI2RlZmluZSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCi0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQotCi0jZGVmaW5lIFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X1MzMl9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCi0JCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAotCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKLQotI2RlZmluZSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X0xFIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSkKLQotLyogTWFjcm9zIGZvciBwYWNraW5nIHJlZ2lzdGVyIHdyaXRlcyBpbnRvIGEgVTMyICovCi0jZGVmaW5lIFdDRDkzNFhfUEFDS0VEX1JFR19TSVpFIHNpemVvZih1MzIpCi0jZGVmaW5lIFdDRDkzNFhfQ09ERUNfVU5QQUNLX0VOVFJZKHBhY2tlZCwgcmVnLCBtYXNrLCB2YWwpIFwKLQlkbyB7IFwKLQkJKChyZWcpID0gKChwYWNrZWQgPj4gMTYpICYgKDB4ZmZmZikpKTsgXAotCQkoKG1hc2spID0gKChwYWNrZWQgPj4gOCkgJiAoMHhmZikpKTsgXAotCQkoKHZhbCkgPSAoKHBhY2tlZCkgJiAoMHhmZikpKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU1RSSU5HKG5hbWUpICNuYW1lCi0jZGVmaW5lIFdDRF9EQVBNX0VOVU0obmFtZSwgcmVnLCBvZmZzZXQsIHRleHQpIFwKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChuYW1lIyNfZW51bSwgcmVnLCBvZmZzZXQsIHRleHQpOyBcCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmFtZSMjX211eCA9IFwKLQkJU09DX0RBUE1fRU5VTShTVFJJTkcobmFtZSksIG5hbWUjI19lbnVtKQotCi0jZGVmaW5lIFdDRF9EQVBNX0VOVU1fRVhUKG5hbWUsIHJlZywgb2Zmc2V0LCB0ZXh0LCBnZXRuYW1lLCBwdXRuYW1lKSBcCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobmFtZSMjX2VudW0sIHJlZywgb2Zmc2V0LCB0ZXh0KTsgXAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hbWUjI19tdXggPSBcCi0JCVNPQ19EQVBNX0VOVU1fRVhUKFNUUklORyhuYW1lKSwgbmFtZSMjX2VudW0sIGdldG5hbWUsIHB1dG5hbWUpCi0KLSNkZWZpbmUgV0NEX0RBUE1fTVVYKG5hbWUsIHNoaWZ0LCBrY3RsKSBcCi0JCVNORF9TT0NfREFQTV9NVVgobmFtZSwgU05EX1NPQ19OT1BNLCBzaGlmdCwgMCwgJmtjdGwjI19tdXgpCi0KLS8qCi0gKiBUaW1lb3V0IGluIG1pbGxpIHNlY29uZHMgYW5kIGl0IGlzIHRoZSB3YWl0IHRpbWUgZm9yCi0gKiBzbGltIGNoYW5uZWwgcmVtb3ZhbCBpbnRlcnJ1cHQgdG8gcmVjZWl2ZS4KLSAqLwotI2RlZmluZSBXQ0Q5MzRYX1NMSU1fQ0xPU0VfVElNRU9VVCAxMDAwCi0jZGVmaW5lIFdDRDkzNFhfU0xJTV9JUlFfT1ZFUkZMT1cgKDEgPDwgMCkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX0lSUV9VTkRFUkZMT1cgKDEgPDwgMSkKLSNkZWZpbmUgV0NEOTM0WF9TTElNX0lSUV9QT1JUX0NMT1NFRCAoMSA8PCAyKQotI2RlZmluZSBXQ0Q5MzRYX01DTEtfQ0xLXzEyUDI4OE1IWiAxMjI4ODAwMAotI2RlZmluZSBXQ0Q5MzRYX01DTEtfQ0xLXzlQNk1IWiA5NjAwMDAwCi0KLSNkZWZpbmUgV0NEOTM0WF9JTlRFUlBfTVVYX05VTV9JTlBVVFMgMwotI2RlZmluZSBXQ0Q5MzRYX05VTV9JTlRFUlBPTEFUT1JTIDkKLSNkZWZpbmUgV0NEOTM0WF9OVU1fREVDSU1BVE9SUyA5Ci0jZGVmaW5lIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUIDIwCi0KLSNkZWZpbmUgQllURV9CSVRfTUFTSyhucikgKDEgPDwgKChucikgJSBCSVRTX1BFUl9CWVRFKSkKLQotI2RlZmluZSBXQ0Q5MzRYX1JFR19CSVRTIDgKLSNkZWZpbmUgV0NEOTM0WF9NQVhfVkFMSURfQURDX01VWCAgMTMKLSNkZWZpbmUgV0NEOTM0WF9JTlZBTElEX0FEQ19NVVggOQotCi0jZGVmaW5lIFdDRDkzNFhfQU1JQ19QV1JfTEVWRUxfTFAgMAotI2RlZmluZSBXQ0Q5MzRYX0FNSUNfUFdSX0xFVkVMX0RFRkFVTFQgMQotI2RlZmluZSBXQ0Q5MzRYX0FNSUNfUFdSX0xFVkVMX0hQIDIKLSNkZWZpbmUgV0NEOTM0WF9BTUlDX1BXUl9MVkxfTUFTSyAweDYwCi0jZGVmaW5lIFdDRDkzNFhfQU1JQ19QV1JfTFZMX1NISUZUIDB4NQotCi0jZGVmaW5lIFdDRDkzNFhfREVDX1BXUl9MVkxfTUFTSyAweDA2Ci0jZGVmaW5lIFdDRDkzNFhfREVDX1BXUl9MVkxfTFAgMHgwMgotI2RlZmluZSBXQ0Q5MzRYX0RFQ19QV1JfTFZMX0hQIDB4MDQKLSNkZWZpbmUgV0NEOTM0WF9ERUNfUFdSX0xWTF9ERiAweDAwCi0jZGVmaW5lIFdDRDkzNFhfU1RSSU5HX0xFTiAxMDAKLQotI2RlZmluZSBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfQ09FRkZfTUFYIDUKLSNkZWZpbmUgV0NEOTM0WF9ESUdfQ09SRV9SRUdfTUlOICBXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwKLSNkZWZpbmUgV0NEOTM0WF9ESUdfQ09SRV9SRUdfTUFYICAweEZGRgotCi0jZGVmaW5lIFdDRDkzNFhfQ0hJTERfREVWSUNFU19NQVgJNgotCi0jZGVmaW5lIFdDRDkzNFhfTUFYX01JQ0JJQVMgNAotI2RlZmluZSBEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUgIk1JQyBCSUFTMSBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVMyX1NUQU5EQUxPTkUgIk1JQyBCSUFTMiBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUgIk1JQyBCSUFTMyBTdGFuZGFsb25lIgotI2RlZmluZSBEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUgIk1JQyBCSUFTNCBTdGFuZGFsb25lIgotCi0jZGVmaW5lICBUWF9IUEZfQ1VUX09GRl9GUkVRX01BU0sJMHg2MAotI2RlZmluZSAgQ0ZfTUlOXzNEQl80SFoJCQkweDAKLSNkZWZpbmUgIENGX01JTl8zREJfNzVIWgkJMHgxCi0jZGVmaW5lICBDRl9NSU5fM0RCXzE1MEhaCQkweDIKLQotI2RlZmluZSBDUEVfRVJSX1dET0dfQklURSBCSVQoMCkKLSNkZWZpbmUgQ1BFX0ZBVEFMX0lSUVMgQ1BFX0VSUl9XRE9HX0JJVEUKLQotI2RlZmluZSBXQ0Q5MzRYX01BRF9BVURJT19GSVJNV0FSRV9QQVRIICJ3Y2Q5MzR4L3djZDkzNHhfbWFkX2F1ZGlvLmJpbiIKLQotI2RlZmluZSBUQVZJTF9WRVJTSU9OX0VOVFJZX1NJWkUgMTcKLQotI2RlZmluZSBXQ0Q5MzRYX0RJR19DT1JFX0NPTExBUFNFX1RJTUVSX01TICAoNSAqIDEwMDApCi0KLWVudW0gewotCVBPV0VSX0NPTExBUFNFLAotCVBPV0VSX1JFU1VNRSwKLX07Ci0KLXN0YXRpYyBpbnQgZGlnX2NvcmVfY29sbGFwc2VfZW5hYmxlID0gMTsKLW1vZHVsZV9wYXJhbShkaWdfY29yZV9jb2xsYXBzZV9lbmFibGUsIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSwgImVuYWJsZS9kaXNhYmxlIHBvd2VyIGdhdGluZyIpOwotCi0vKiBkaWdfY29yZV9jb2xsYXBzZSB0aW1lciBpbiBzZWNvbmRzICovCi1zdGF0aWMgaW50IGRpZ19jb3JlX2NvbGxhcHNlX3RpbWVyID0gKFdDRDkzNFhfRElHX0NPUkVfQ09MTEFQU0VfVElNRVJfTVMvMTAwMCk7Ci1tb2R1bGVfcGFyYW0oZGlnX2NvcmVfY29sbGFwc2VfdGltZXIsIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpZ19jb3JlX2NvbGxhcHNlX3RpbWVyLCAidGltZXIgZm9yIHBvd2VyIGdhdGluZyIpOwotCi0jZGVmaW5lIFRBVklMX0hQSF9SRUdfUkFOR0VfMSAgKFdDRDkzNFhfSFBIX1JfREFDX0NUTCAtIFdDRDkzNFhfSFBIX0NOUF9FTiArIDEpCi0jZGVmaW5lIFRBVklMX0hQSF9SRUdfUkFOR0VfMiAgKFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMyAtXAotCQkJCVdDRDkzNFhfSFBIX05FV19BTkFfSFBIMiArIDEpCi0jZGVmaW5lIFRBVklMX0hQSF9SRUdfUkFOR0VfMyAgKFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDMyAtXAotCQkJCVdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCArIDEpCi0jZGVmaW5lIFRBVklMX0hQSF9UT1RBTF9SRUcgICAgKFRBVklMX0hQSF9SRUdfUkFOR0VfMSArIFRBVklMX0hQSF9SRUdfUkFOR0VfMiArXAotCQkJCVRBVklMX0hQSF9SRUdfUkFOR0VfMykKLQotZW51bSB7Ci0JVklfU0VOU0VfMSwKLQlWSV9TRU5TRV8yLAotCUFVRElPX05PTUlOQUwsCi0JSFBIX1BBX0RFTEFZLAotCUNMU0hfWl9DT05GSUcsCi0JQU5DX01JQ19BTUlDMSwKLQlBTkNfTUlDX0FNSUMyLAotCUFOQ19NSUNfQU1JQzMsCi0JQU5DX01JQ19BTUlDNCwKLQlDTEtfSU5URVJOQUwsCi0JQ0xLX01PREUsCi19OwotCi1lbnVtIHsKLQlBSUYxX1BCID0gMCwKLQlBSUYxX0NBUCwKLQlBSUYyX1BCLAotCUFJRjJfQ0FQLAotCUFJRjNfUEIsCi0JQUlGM19DQVAsCi0JQUlGNF9QQiwKLQlBSUY0X1ZJRkVFRCwKLQlBSUY0X01BRF9UWCwKLQlOVU1fQ09ERUNfREFJUywKLX07Ci0KLWVudW0gewotCUlOVG5fMV9JTlBfU0VMX1pFUk8gPSAwLAotCUlOVG5fMV9JTlBfU0VMX0RFQzAsCi0JSU5Ubl8xX0lOUF9TRUxfREVDMSwKLQlJTlRuXzFfSU5QX1NFTF9JSVIwLAotCUlOVG5fMV9JTlBfU0VMX0lJUjEsCi0JSU5Ubl8xX0lOUF9TRUxfUlgwLAotCUlOVG5fMV9JTlBfU0VMX1JYMSwKLQlJTlRuXzFfSU5QX1NFTF9SWDIsCi0JSU5Ubl8xX0lOUF9TRUxfUlgzLAotCUlOVG5fMV9JTlBfU0VMX1JYNCwKLQlJTlRuXzFfSU5QX1NFTF9SWDUsCi0JSU5Ubl8xX0lOUF9TRUxfUlg2LAotCUlOVG5fMV9JTlBfU0VMX1JYNywKLX07Ci0KLWVudW0gewotCUlOVG5fMl9JTlBfU0VMX1pFUk8gPSAwLAotCUlOVG5fMl9JTlBfU0VMX1JYMCwKLQlJTlRuXzJfSU5QX1NFTF9SWDEsCi0JSU5Ubl8yX0lOUF9TRUxfUlgyLAotCUlOVG5fMl9JTlBfU0VMX1JYMywKLQlJTlRuXzJfSU5QX1NFTF9SWDQsCi0JSU5Ubl8yX0lOUF9TRUxfUlg1LAotCUlOVG5fMl9JTlBfU0VMX1JYNiwKLQlJTlRuXzJfSU5QX1NFTF9SWDcsCi0JSU5Ubl8yX0lOUF9TRUxfUFJPWElNSVRZLAotfTsKLQotZW51bSB7Ci0JSU5URVJQX01BSU5fUEFUSCwKLQlJTlRFUlBfTUlYX1BBVEgsCi19OwotCi1zdHJ1Y3QgdGF2aWxfaWRsZV9kZXRlY3RfY29uZmlnIHsKLQl1OCBocGhfaWRsZV90aHI7Ci0JdTggaHBoX2lkbGVfZGV0ZWN0X2VuOwotfTsKLQotc3RydWN0IHRhdmlsX2Nwcl9yZWdfZGVmYXVsdHMgewotCWludCB3cl9kYXRhOwotCWludCB3cl9hZGRyOwotfTsKLQotc3RydWN0IGludGVycF9zYW1wbGVfcmF0ZSB7Ci0JaW50IHNhbXBsZV9yYXRlOwotCWludCByYXRlX3ZhbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJwX3NhbXBsZV9yYXRlIHNyX3ZhbF90YmxbXSA9IHsKLQl7ODAwMCwgMHgwfSwgezE2MDAwLCAweDF9LCB7MzIwMDAsIDB4M30sIHs0ODAwMCwgMHg0fSwgezk2MDAwLCAweDV9LAotCXsxOTIwMDAsIDB4Nn0sIHszODQwMDAsIDB4N30sIHs0NDEwMCwgMHg5fSwgezg4MjAwLCAweEF9LAotCXsxNzY0MDAsIDB4Qn0sIHszNTI4MDAsIDB4Q30sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZDl4eHhfY2ggdGF2aWxfcnhfY2hzW1dDRDkzNFhfUlhfTUFYXSA9IHsKLQlXQ0Q5WFhYX0NIKFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIsIDApLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDEsIDEpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDIsIDIpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDMsIDMpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDQsIDQpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDUsIDUpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDYsIDYpLAotCVdDRDlYWFhfQ0goV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiArIDcsIDcpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2Q5eHh4X2NoIHRhdmlsX3R4X2Noc1tXQ0Q5MzRYX1RYX01BWF0gPSB7Ci0JV0NEOVhYWF9DSCgwLCAwKSwKLQlXQ0Q5WFhYX0NIKDEsIDEpLAotCVdDRDlYWFhfQ0goMiwgMiksCi0JV0NEOVhYWF9DSCgzLCAzKSwKLQlXQ0Q5WFhYX0NIKDQsIDQpLAotCVdDRDlYWFhfQ0goNSwgNSksCi0JV0NEOVhYWF9DSCg2LCA2KSwKLQlXQ0Q5WFhYX0NIKDcsIDcpLAotCVdDRDlYWFhfQ0goOCwgOCksCi0JV0NEOVhYWF9DSCg5LCA5KSwKLQlXQ0Q5WFhYX0NIKDEwLCAxMCksCi0JV0NEOVhYWF9DSCgxMSwgMTEpLAotCVdDRDlYWFhfQ0goMTIsIDEyKSwKLQlXQ0Q5WFhYX0NIKDEzLCAxMyksCi0JV0NEOVhYWF9DSCgxNCwgMTQpLAotCVdDRDlYWFhfQ0goMTUsIDE1KSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdnBvcnRfc2xpbV9jaGVja190YWJsZVtOVU1fQ09ERUNfREFJU10gPSB7Ci0JMCwJCQkJCQkJLyogQUlGMV9QQiAqLwotCUJJVChBSUYyX0NBUCkgfCBCSVQoQUlGM19DQVApIHwgQklUKEFJRjRfTUFEX1RYKSwJLyogQUlGMV9DQVAgKi8KLQkwLAkJCQkJCQkvKiBBSUYyX1BCICovCi0JQklUKEFJRjFfQ0FQKSB8IEJJVChBSUYzX0NBUCkgfCBCSVQoQUlGNF9NQURfVFgpLAkvKiBBSUYyX0NBUCAqLwotCTAsCQkJCQkJCS8qIEFJRjNfUEIgKi8KLQlCSVQoQUlGMV9DQVApIHwgQklUKEFJRjJfQ0FQKSB8IEJJVChBSUY0X01BRF9UWCksCS8qIEFJRjNfQ0FQICovCi0JMCwJCQkJCQkJLyogQUlGNF9QQiAqLwotfTsKLQotLyogQ29kZWMgc3VwcG9ydHMgMiBJSVIgZmlsdGVycyAqLwotZW51bSB7Ci0JSUlSMCA9IDAsCi0JSUlSMSwKLQlJSVJfTUFYLAotfTsKLQotLyogRWFjaCBJSVIgaGFzIDUgRmlsdGVyIFN0YWdlcyAqLwotZW51bSB7Ci0JQkFORDEgPSAwLAotCUJBTkQyLAotCUJBTkQzLAotCUJBTkQ0LAotCUJBTkQ1LAotCUJBTkRfTUFYLAotfTsKLQotZW51bSB7Ci0JQ09NUEFOREVSXzEsIC8qIEhQSF9MICovCi0JQ09NUEFOREVSXzIsIC8qIEhQSF9SICovCi0JQ09NUEFOREVSXzMsIC8qIExPMV9ESUZGICovCi0JQ09NUEFOREVSXzQsIC8qIExPMl9ESUZGICovCi0JQ09NUEFOREVSXzUsIC8qIExPM19TRSAtIG5vdCB1c2VkIGluIFRhdmlsICovCi0JQ09NUEFOREVSXzYsIC8qIExPNF9TRSAtIG5vdCB1c2VkIGluIFRhdmlsICovCi0JQ09NUEFOREVSXzcsIC8qIFNXUiBTUEsgQ0gxICovCi0JQ09NUEFOREVSXzgsIC8qIFNXUiBTUEsgQ0gyICovCi0JQ09NUEFOREVSX01BWCwKLX07Ci0KLWVudW0gewotCUFTUkNfSU5fSFBITCwKLQlBU1JDX0lOX0xPMSwKLQlBU1JDX0lOX0hQSFIsCi0JQVNSQ19JTl9MTzIsCi0JQVNSQ19JTl9TUEtSMSwKLQlBU1JDX0lOX1NQS1IyLAotCUFTUkNfSU5WQUxJRCwKLX07Ci0KLWVudW0gewotCUFTUkMwLAotCUFTUkMxLAotCUFTUkMyLAotCUFTUkMzLAotCUFTUkNfTUFYLAotfTsKLQotZW51bSB7Ci0JQ09OVl84OFAyS19UT18zODRLLAotCUNPTlZfOTZLX1RPXzM1MlA4SywKLQlDT05WXzM1MlA4S19UT18zODRLLAotCUNPTlZfMzg0S19UT18zNTJQOEssCi0JQ09OVl8zODRLX1RPXzM4NEssCi0JQ09OVl85NktfVE9fMzg0SywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZyA9IHsKLQkubWlub3JfdmVyc2lvbiA9IDEsCi0JLnNsaW1idXNfZGV2X2lkID0gQUZFX1NMSU1CVVNfREVWSUNFXzEsCi0JLnNsYXZlX2Rldl9wZ2RfbGEgPSAwLAotCS5zbGF2ZV9kZXZfaW50ZmRldl9sYSA9IDAsCi0JLmJpdF93aWR0aCA9IDE2LAotCS5kYXRhX2Zvcm1hdCA9IDAsCi0JLm51bV9jaGFubmVscyA9IDEKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgdGF2aWxfY2RjX3JlZ19wYWdlX2NmZyA9IHsKLQkubWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9DRENfUkVHX1BBR0VfQ0ZHLAotCS5lbmFibGUgPSAxLAotCS5wcm9jX2lkID0gQUZFX0NEQ19SRUdfUEFHRV9BU1NJR05fUFJPQ19JRF8xLAotfTsKLQotc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1fY2RjX3JlZ19jZmcgYXVkaW9fcmVnX2NmZ1tdID0gewotCXsKLQkJMSwKLQkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TT0NfTUFEX01BSU5fQ1RMXzEpLAotCQlIV19NQURfQVVESU9fRU5BQkxFLCAweDEsIFdDRDkzNFhfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8zKSwKLQkJSFdfTUFEX0FVRElPX1NMRUVQX1RJTUUsIDB4RiwgV0NEOTM0WF9SRUdfQklUUywgMAotCX0sCi0JewotCQkxLAotCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzQpLAotCQlIV19NQURfVFhfQVVESU9fU1dJVENIX09GRiwgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9DRkcpLAotCQlNQURfQVVESU9fSU5UX0RFU1RfU0VMRUNUX1JFRywgMHgyLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9QSU4yX01BU0szKSwKLQkJTUFEX0FVRElPX0lOVF9NQVNLX1JFRywgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfSU5UUl9QSU4yX1NUQVRVUzMpLAotCQlNQURfQVVESU9fSU5UX1NUQVRVU19SRUcsIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMAotCX0sCi0JewotCQkxLAotCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKyBXQ0Q5MzRYX0lOVFJfUElOMl9DTEVBUjMpLAotCQlNQURfQVVESU9fSU5UX0NMRUFSX1JFRywgMHgxLCBXQ0Q5MzRYX1JFR19CSVRTLCAwCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfU0JfUEdEX1BPUlRfVFhfQkFTRSksCi0JCVNCX1BHRF9QT1JUX1RYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzRYX1JFR19CSVRTLCAweDEKLQl9LAotCXsKLQkJMSwKLQkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TQl9QR0RfUE9SVF9UWF9CQVNFKSwKLQkJU0JfUEdEX1BPUlRfVFhfRU5BQkxFX04sIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMHgxCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArIFdDRDkzNFhfU0JfUEdEX1BPUlRfUlhfQkFTRSksCi0JCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLCAweDFFLCBXQ0Q5MzRYX1JFR19CSVRTLCAweDEKLQl9LAotCXsKLQkJMSwKLQkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsgV0NEOTM0WF9TQl9QR0RfUE9SVF9SWF9CQVNFKSwKLQkJU0JfUEdEX1BPUlRfUlhfRU5BQkxFX04sIDB4MSwgV0NEOTM0WF9SRUdfQklUUywgMHgxCi0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCi0JCSBXQ0Q5MzRYX0NEQ19BTkMwX0lJUl9BREFQVF9DVEwpLAotCQlBQU5DX0ZGX0dBSU5fQURBUFRJVkUsIDB4NCwgV0NEOTM0WF9SRUdfQklUUywgMAotCX0sCi0JewotCQkxLAotCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKwotCQkgV0NEOTM0WF9DRENfQU5DMF9JSVJfQURBUFRfQ1RMKSwKLQkJQUFOQ19GRkdBSU5fQURBUFRJVkVfRU4sIDB4OCwgV0NEOTM0WF9SRUdfQklUUywgMAotCX0sCi0JewotCQkxLAotCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKwotCQkgV0NEOTM0WF9DRENfQU5DMF9GRl9BX0dBSU5fQ1RMKSwKLQkJQUFOQ19HQUlOX0NPTlRST0wsIDB4RkYsIFdDRDkzNFhfUkVHX0JJVFMsIDAKLQl9LAotCXsKLQkJMSwKLQkJKFdDRDkzNFhfUkVHSVNURVJfU1RBUlRfT0ZGU0VUICsKLQkJIFNCX1BHRF9UWF9QT1JUX01VTFRJX0NIQU5ORUxfMCgwKSksCi0JCVNCX1BHRF9UWF9QT1JUbl9NVUxUSV9DSE5MXzAsIDB4RkYsIFdDRDkzNFhfUkVHX0JJVFMsIDB4NAotCX0sCi0JewotCQkxLAotCQkoV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgKwotCQkgU0JfUEdEX1RYX1BPUlRfTVVMVElfQ0hBTk5FTF8xKDApKSwKLQkJU0JfUEdEX1RYX1BPUlRuX01VTFRJX0NITkxfMSwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0Ci0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCi0JCSBTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoMHgxODAsIDApKSwKLQkJU0JfUEdEX1JYX1BPUlRuX01VTFRJX0NITkxfMCwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0Ci0JfSwKLQl7Ci0JCTEsCi0JCShXQ0Q5MzRYX1JFR0lTVEVSX1NUQVJUX09GRlNFVCArCi0JCSBTQl9QR0RfUlhfUE9SVF9NVUxUSV9DSEFOTkVMXzAoMHgxODEsIDApKSwKLQkJU0JfUEdEX1JYX1BPUlRuX01VTFRJX0NITkxfMSwgMHhGRiwgV0NEOTM0WF9SRUdfQklUUywgMHg0Ci0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX2RhdGEgdGF2aWxfYXVkaW9fcmVnX2NmZyA9IHsKLQkubnVtX3JlZ2lzdGVycyA9IEFSUkFZX1NJWkUoYXVkaW9fcmVnX2NmZyksCi0JLnJlZ19kYXRhID0gYXVkaW9fcmVnX2NmZywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NkY19hYW5jX3ZlcnNpb24gdGF2aWxfY2RjX2FhbmNfdmVyc2lvbiA9IHsKLQkuY2RjX2FhbmNfbWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9DRENfQUFOQ19WRVJTSU9OLAotCS5hYW5jX2h3X3ZlcnNpb24gICAgICAgID0gQUFOQ19IV19CTE9DS19WRVJTSU9OXzIsCi19OwotCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF9nYWluLCAwLCAxLCAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW5lX2dhaW4sIDAsIDcsIDEpOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFuYWxvZ19nYWluLCAwLCAyNSwgMSk7Ci0KLSNkZWZpbmUgV0NEOTM0WF9UWF9VTk1VVEVfREVMQVlfTVMgNDAKLQotc3RhdGljIGludCB0eF91bm11dGVfZGVsYXkgPSBXQ0Q5MzRYX1RYX1VOTVVURV9ERUxBWV9NUzsKLW1vZHVsZV9wYXJhbSh0eF91bm11dGVfZGVsYXksIGludCwgMDY2NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHR4X3VubXV0ZV9kZWxheSwgImRlbGF5IHRvIHVubXV0ZSB0aGUgdHggcGF0aCIpOwotCi1zdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19zZXRfdHhfaG9sZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCB1MTYsIGJvb2wpOwotCi0vKiBIb2xkIGluc3RhbmNlIHRvIHNvdW5kd2lyZSBwbGF0Zm9ybSBkZXZpY2UgKi8KLXN0cnVjdCB0YXZpbF9zd3JfY3RybF9kYXRhIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzd3JfcGRldjsKLX07Ci0KLXN0cnVjdCB3Y2Rfc3dyX2N0cmxfcGxhdGZvcm1fZGF0YSB7Ci0Jdm9pZCAqaGFuZGxlOyAvKiBob2xkcyBjb2RlYyBwcml2YXRlIGRhdGEgKi8KLQlpbnQgKCpyZWFkKSh2b2lkICpoYW5kbGUsIGludCByZWcpOwotCWludCAoKndyaXRlKSh2b2lkICpoYW5kbGUsIGludCByZWcsIGludCB2YWwpOwotCWludCAoKmJ1bGtfd3JpdGUpKHZvaWQgKmhhbmRsZSwgdTMyICpyZWcsIHUzMiAqdmFsLCBzaXplX3QgbGVuKTsKLQlpbnQgKCpjbGspKHZvaWQgKmhhbmRsZSwgYm9vbCBlbmFibGUpOwotCWludCAoKmhhbmRsZV9pcnEpKHZvaWQgKmhhbmRsZSwKLQkJCSAgaXJxcmV0dXJuX3QgKCpzd3JtX2lycV9oYW5kbGVyKShpbnQgaXJxLCB2b2lkICpkYXRhKSwKLQkJCSAgdm9pZCAqc3dybV9oYW5kbGUsIGludCBhY3Rpb24pOwotfTsKLQotLyogSG9sZHMgYWxsIFNvdW5kd2lyZSBhbmQgc3BlYWtlciByZWxhdGVkIGluZm9ybWF0aW9uICovCi1zdHJ1Y3Qgd2NkOTM0eF9zd3IgewotCXN0cnVjdCB0YXZpbF9zd3JfY3RybF9kYXRhICpjdHJsX2RhdGE7Ci0Jc3RydWN0IHdjZF9zd3JfY3RybF9wbGF0Zm9ybV9kYXRhIHBsYXRfZGF0YTsKLQlzdHJ1Y3QgbXV0ZXggcmVhZF9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggd3JpdGVfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IGNsa19tdXRleDsKLQlpbnQgc3Brcl9nYWluX29mZnNldDsKLQlpbnQgc3Brcl9tb2RlOwotCWludCBjbGtfdXNlcnM7Ci0JaW50IHJ4XzdfY291bnQ7Ci0JaW50IHJ4XzhfY291bnQ7Ci19OwotCi1zdHJ1Y3QgdHhfbXV0ZV93b3JrIHsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0JdTggZGVjaW1hdG9yOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcms7Ci19OwotCi0jZGVmaW5lIFdDRDkzNFhfU1BLX0FOQ19FTl9ERUxBWV9NUyAzNTAKLXN0YXRpYyBpbnQgc3BrX2FuY19lbl9kZWxheSA9IFdDRDkzNFhfU1BLX0FOQ19FTl9ERUxBWV9NUzsKLW1vZHVsZV9wYXJhbShzcGtfYW5jX2VuX2RlbGF5LCBpbnQsIDA2NjQpOwotTU9EVUxFX1BBUk1fREVTQyhzcGtfYW5jX2VuX2RlbGF5LCAiZGVsYXkgdG8gZW5hYmxlIGFuYyBpbiBzcGVha2VyIHBhdGgiKTsKLQotc3RydWN0IHNwa19hbmNfd29yayB7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZHdvcms7Ci19OwotCi1zdHJ1Y3QgaHBmX3dvcmsgewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQl1OCBkZWNpbWF0b3I7Ci0JdTggaHBmX2N1dF9vZmZfZnJlcTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3b3JrOwotfTsKLQotc3RydWN0IHRhdmlsX3ByaXYgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTMyIHJ4X2JpYXNfY291bnQ7Ci0JczMyIGRtaWNfMF8xX2Nsa19jbnQ7Ci0JczMyIGRtaWNfMl8zX2Nsa19jbnQ7Ci0JczMyIGRtaWNfNF81X2Nsa19jbnQ7Ci0JczMyIG1pY2JfcmVmW1RBVklMX01BWF9NSUNCSUFTXTsKLQlzMzIgcHVsbHVwX3JlZltUQVZJTF9NQVhfTUlDQklBU107Ci0KLQkvKiBBTkMgcmVsYXRlZCAqLwotCXUzMiBhbmNfc2xvdDsKLQlib29sIGFuY19mdW5jOwotCi0JLyogY29tcGFuZGVyICovCi0JaW50IGNvbXBfZW5hYmxlZFtDT01QQU5ERVJfTUFYXTsKLQlpbnQgZWFyX3Nwa3JfZ2FpbjsKLQotCS8qIGNsYXNzIGggc3BlY2lmaWMgZGF0YSAqLwotCXN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSBjbHNoX2Q7Ci0JLyogVGF2aWwgSW50ZXJwb2xhdG9yIE1vZGUgU2VsZWN0IGZvciBFQVIsIEhQSF9MIGFuZCBIUEhfUiAqLwotCXUzMiBocGhfbW9kZTsKLQotCS8qIE1hZCBzd2l0Y2ggcmVmZXJlbmNlIGNvdW50ICovCi0JaW50IG1hZF9zd2l0Y2hfY250OwotCi0JLyogdHJhY2sgdGF2aWwgaW50ZXJmYWNlIHR5cGUgKi8KLQl1OCBpbnRmX3R5cGU7Ci0KLQkvKiB0byB0cmFjayB0aGUgc3RhdHVzICovCi0JdW5zaWduZWQgbG9uZyBzdGF0dXNfbWFzazsKLQotCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnIHNsaW1idXNfc2xhdmVfY2ZnOwotCi0JLyogbnVtIG9mIHNsaW0gcG9ydHMgcmVxdWlyZWQgKi8KLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAgZGFpW05VTV9DT0RFQ19EQUlTXTsKLQkvKiBQb3J0IHZhbHVlcyBmb3IgUnggYW5kIFR4IGNvZGVjX2RhaSAqLwotCXVuc2lnbmVkIGludCByeF9wb3J0X3ZhbHVlW1dDRDkzNFhfUlhfTUFYXTsKLQl1bnNpZ25lZCBpbnQgdHhfcG9ydF92YWx1ZTsKLQotCXN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyOwotCXN0cnVjdCB3Y2Q5MzR4X3N3ciBzd3I7Ci0Jc3RydWN0IG11dGV4IG1pY2JfbG9jazsKLQotCXN0cnVjdCBkZWxheWVkX3dvcmsgcG93ZXJfZ2F0ZV93b3JrOwotCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOwotCi0Jc3RydWN0IGNsayAqd2NkX2V4dF9jbGs7Ci0KLQkvKiBtYmhjIG1vZHVsZSAqLwotCXN0cnVjdCB3Y2Q5MzR4X21iaGMgKm1iaGM7Ci0KLQlzdHJ1Y3QgbXV0ZXggY29kZWNfbXV0ZXg7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzX3dvcms7Ci0Jc3RydWN0IGhwZl93b3JrIHR4X2hwZl93b3JrW1dDRDkzNFhfTlVNX0RFQ0lNQVRPUlNdOwotCXN0cnVjdCB0eF9tdXRlX3dvcmsgdHhfbXV0ZV9kd29ya1tXQ0Q5MzRYX05VTV9ERUNJTUFUT1JTXTsKLQlzdHJ1Y3Qgc3BrX2FuY193b3JrIHNwa19hbmNfZHdvcms7Ci0KLQl1bnNpZ25lZCBpbnQgdmlfZmVlZF92YWx1ZTsKLQotCS8qIERTUCBjb250cm9sICovCi0Jc3RydWN0IHdjZF9kc3BfY250bCAqd2RzcF9jbnRsOwotCi0JLyogY2FsIGluZm8gZm9yIGNvZGVjICovCi0Jc3RydWN0IGZ3X2luZm8gKmZ3X2RhdGE7Ci0KLQkvKiBFbnRyeSBmb3IgdmVyc2lvbiBpbmZvICovCi0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnZlcnNpb25fZW50cnk7Ci0KLQkvKiBTVlMgdm90aW5nIHJlbGF0ZWQgKi8KLQlzdHJ1Y3QgbXV0ZXggc3ZzX211dGV4OwotCWludCBzdnNfcmVmX2NudDsKLQotCWludCBuYXRpdmVfY2xrX3VzZXJzOwotCS8qIEFTUkMgdXNlcnMgY291bnQgKi8KLQlpbnQgYXNyY191c2Vyc1tBU1JDX01BWF07Ci0JaW50IGFzcmNfb3V0cHV0X21vZGVbQVNSQ19NQVhdOwotCS8qIE1haW4gcGF0aCBjbG9jayB1c2VycyBjb3VudCAqLwotCWludCBtYWluX2Nsa191c2Vyc1tXQ0Q5MzRYX05VTV9JTlRFUlBPTEFUT1JTXTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmZpZzsKLQlzdHJ1Y3QgdGF2aWxfaWRsZV9kZXRlY3RfY29uZmlnIGlkbGVfZGV0X2NmZzsKLQotCWludCBwb3dlcl9hY3RpdmVfcmVmOwotCWludCBzaWRldG9uZV9jb2VmZl9hcnJheVtJSVJfTUFYXVtCQU5EX01BWF0KLQkJW1dDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9DT0VGRl9NQVhdOwotCi0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2X2NoaWxkX2RldmljZXMKLQkJW1dDRDkzNFhfQ0hJTERfREVWSUNFU19NQVhdOwotCWludCBjaGlsZF9jb3VudDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX3Nwa3JfZGVmYXVsdFtdID0gewotCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDMsIDB4ODAsIDB4ODB9LAotCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDMsIDB4ODAsIDB4ODB9LAotCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI3X0NUTDcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19DT01QQU5ERVI4X0NUTDcsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDdDLCAweDUwfSwKLQl7V0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3QywgMHg1MH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9zcGtyX21vZGUxW10gPSB7Ci0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMywgMHg4MCwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgMHgwMSwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX0JPT1NUMF9CT09TVF9DVEwsIDB4N0MsIDB4NDR9LAotCXtXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfQ1RMLCAweDdDLCAweDQ0fSwKLX07Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9lbmFibGVfZWZ1c2Vfc2Vuc2luZyhzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpOwotCi0vKioKLSAqIHRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0IC0gb2Zmc2V0IHRoZSBzcGVha2VyIHBhdGgKLSAqIGdhaW4gd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLgotICoKLSAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKLSAqIEBvZmZzZXQ6IEluZGljYXRlcyBzcGVha2VyIHBhdGggZ2FpbiBvZmZzZXQgdmFsdWUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBlcnJvci4KLSAqLwotaW50IHRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaXYtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID0gb2Zmc2V0OwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldCk7Ci0KLS8qKgotICogdGF2aWxfc2V0X3Nwa3JfbW9kZSAtIENvbmZpZ3VyZXMgc3BlYWtlciBjb21wYW5kZXIgYW5kIHNtYXJ0Ym9vc3QKLSAqIHNldHRpbmdzIGJhc2VkIG9uIHNwZWFrZXIgbW9kZS4KLSAqCi0gKiBAY29kZWM6IGNvZGVjIGluc3RhbmNlCi0gKiBAbW9kZTogSW5kaWNhdGVzIHNwZWFrZXIgY29uZmlndXJhdGlvbiBtb2RlLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCi0gKi8KLWludCB0YXZpbF9zZXRfc3Brcl9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgaTsKLQljb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsICpyZWdzOwotCWludCBzaXplOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgV0NEOTM0WF9TUEtSX01PREVfMToKLQkJcmVncyA9IHRhdmlsX3Nwa3JfbW9kZTE7Ci0JCXNpemUgPSBBUlJBWV9TSVpFKHRhdmlsX3Nwa3JfbW9kZTEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZWdzID0gdGF2aWxfc3Brcl9kZWZhdWx0OwotCQlzaXplID0gQVJSQVlfU0laRSh0YXZpbF9zcGtyX2RlZmF1bHQpOwotCQlicmVhazsKLQl9Ci0KLQlwcml2LT5zd3Iuc3Brcl9tb2RlID0gbW9kZTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdzW2ldLnJlZywKLQkJCQkgICAgcmVnc1tpXS5tYXNrLCByZWdzW2ldLnZhbCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX3NldF9zcGtyX21vZGUpOwotCi0vKioKLSAqIHRhdmlsX2dldF9hZmVfY29uZmlnIC0gcmV0dXJucyBzcGVjaWZpYyBjb2RlYyBjb25maWd1cmF0aW9uIHRvIGFmZSB0byB3cml0ZQotICoKLSAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKLSAqIEBjb25maWdfdHlwZTogSW5kaWNhdGVzIHR5cGUgb2YgY29uZmlndXJhdGlvbiB0byB3cml0ZS4KLSAqLwotdm9pZCAqdGF2aWxfZ2V0X2FmZV9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAoY29uZmlnX3R5cGUpIHsKLQljYXNlIEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRzoKLQkJcmV0dXJuICZwcml2LT5zbGltYnVzX3NsYXZlX2NmZzsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRzoKLQkJcmV0dXJuICZ0YXZpbF9hdWRpb19yZWdfY2ZnOwotCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6Ci0JCXJldHVybiAmdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZzsKLQljYXNlIEFGRV9BQU5DX1ZFUlNJT046Ci0JCXJldHVybiAmdGF2aWxfY2RjX2FhbmNfdmVyc2lvbjsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUc6Ci0JCXJldHVybiAmdGF2aWxfY2RjX3JlZ19wYWdlX2NmZzsKLQlkZWZhdWx0OgotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IFVua25vd24gY29uZmlnX3R5cGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBjb25maWdfdHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfZ2V0X2FmZV9jb25maWcpOwotCi1zdGF0aWMgYm9vbCBpc190YXZpbF9wbGF5YmFja19kYWkoaW50IGRhaV9pZCkKLXsKLQlpZiAoKGRhaV9pZCA9PSBBSUYxX1BCKSB8fCAoZGFpX2lkID09IEFJRjJfUEIpIHx8Ci0JICAgIChkYWlfaWQgPT0gQUlGM19QQikgfHwgKGRhaV9pZCA9PSBBSUY0X1BCKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfZmluZF9wbGF5YmFja19kYWlfaWRfZm9yX3BvcnQoaW50IHBvcnRfaWQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7Ci0JaW50IGksIHNsdl9wb3J0X2lkOwotCi0JZm9yIChpID0gQUlGMV9QQjsgaSA8IE5VTV9DT0RFQ19EQUlTOyBpKyspIHsKLQkJaWYgKCFpc190YXZpbF9wbGF5YmFja19kYWkoaSkpCi0JCQljb250aW51ZTsKLQotCQlkYWkgPSAmdGF2aWwtPmRhaVtpXTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCQlzbHZfcG9ydF9pZCA9IHdjZDl4eHhfZ2V0X3NsYXZlX3BvcnQoY2gtPmNoX251bSk7Ci0JCQlpZiAoKHNsdl9wb3J0X2lkID4gMCkgJiYgKHNsdl9wb3J0X2lkID09IHBvcnRfaWQpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX3ZvdGVfc3ZzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwgYm9vbCB2b3RlKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCi0Jd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OwotCi0JbXV0ZXhfbG9jaygmdGF2aWwtPnN2c19tdXRleCk7Ci0JaWYgKHZvdGUpIHsKLQkJdGF2aWwtPnN2c19yZWZfY250Kys7Ci0JCWlmICh0YXZpbC0+c3ZzX3JlZl9jbnQgPT0gMSkKLQkJCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJCSAgIFdDRDkzNFhfQ1BFX1NTX1BXUl9TWVNfUFNUQVRFX0NUTF8wLAotCQkJCQkgICAweDAxLCAweDAxKTsKLQl9IGVsc2UgewotCQkvKiBEbyBub3QgZGVjcmVtZW50IHJlZiBjb3VudCBpZiBpdCBpcyBhbHJlYWR5IDAgKi8KLQkJaWYgKHRhdmlsLT5zdnNfcmVmX2NudCA9PSAwKQotCQkJZ290byBkb25lOwotCi0JCXRhdmlsLT5zdnNfcmVmX2NudC0tOwotCQlpZiAodGF2aWwtPnN2c19yZWZfY250ID09IDApCi0JCQlyZWdtYXBfdXBkYXRlX2JpdHMod2NkOXh4eC0+cmVnbWFwLAotCQkJCQkgICBXQ0Q5MzRYX0NQRV9TU19QV1JfU1lTX1BTVEFURV9DVExfMCwKLQkJCQkJICAgMHgwMSwgMHgwMCk7Ci0JfQotZG9uZToKLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogdm90ZSA9ICVzLCB1cGRhdGVkIHJlZiBjbnQgPSAldVxuIiwgX19mdW5jX18sCi0JCXZvdGUgPyAidm90ZSIgOiAiVW52b3RlIiwgdGF2aWwtPnN2c19yZWZfY250KTsKLQltdXRleF91bmxvY2soJnRhdmlsLT5zdnNfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2dldF9hbmNfc2xvdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+YW5jX3Nsb3Q7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfcHV0X2FuY19zbG90KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl0YXZpbC0+YW5jX3Nsb3QgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9nZXRfYW5jX2Z1bmMoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHRhdmlsLT5hbmNfZnVuYyA9PSB0cnVlID8gMSA6IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3B1dF9hbmNfZnVuYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCi0JbXV0ZXhfbG9jaygmdGF2aWwtPmNvZGVjX211dGV4KTsKLQl0YXZpbC0+YW5jX2Z1bmMgPSAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gZmFsc2UgOiB0cnVlKTsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogYW5jX2Z1bmMgJXgiLCBfX2Z1bmNfXywgdGF2aWwtPmFuY19mdW5jKTsKLQotCWlmICh0YXZpbC0+YW5jX2Z1bmMgPT0gdHJ1ZSkgewotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhMIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJBTkMgSFBIUiBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRUFSIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiRUFSIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBITCBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkhQSFIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIUEhMIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSFBIUiIpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBFQVIiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgU1BLMSBQQSIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhMIFBBIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFQVIgUEEiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkVBUiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBITCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBIUiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBITCBQQSIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSFBIUiBQQSIpOwotCX0KLQltdXRleF91bmxvY2soJnRhdmlsLT5jb2RlY19tdXRleCk7Ci0KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQlpbnQgaTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgbnVtX2FuY19zbG90czsKLQlzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyICphbmNfaGVhZDsKLQlzdHJ1Y3QgZmlybXdhcmVfY2FsICpod2RlcF9jYWwgPSBOVUxMOwotCXUzMiBhbmNfd3JpdGVzX3NpemUgPSAwOwotCXUzMiBhbmNfY2FsX3NpemUgPSAwOwotCWludCBhbmNfc2l6ZV9yZW1haW5pbmc7Ci0JdTMyICphbmNfcHRyOwotCXUxNiByZWc7Ci0JdTggbWFzaywgdmFsOwotCXNpemVfdCBjYWxfc2l6ZTsKLQljb25zdCB2b2lkICpkYXRhOwotCi0JaWYgKCF0YXZpbC0+YW5jX2Z1bmMpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRhdmlsLT5md19kYXRhLCBXQ0Q5WFhYX0FOQ19DQUwpOwotCQlpZiAoaHdkZXBfY2FsKSB7Ci0JCQlkYXRhID0gaHdkZXBfY2FsLT5kYXRhOwotCQkJY2FsX3NpemUgPSBod2RlcF9jYWwtPnNpemU7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdXNpbmcgaHdkZXAgY2FsaWJyYXRpb24sIGNhbF9zaXplICV6ZCIsCi0JCQkJX19mdW5jX18sIGNhbF9zaXplKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVuYW1lID0gIldDRDkzNFgvV0NEOTM0WF9hbmMuYmluIjsKLQkJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgY29kZWMtPmRldik7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gYWNxdWlyZSBBTkMgZGF0YTogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQlpZiAoIWZ3KSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgYW5jIGZ3XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9Ci0JCQlkYXRhID0gZnctPmRhdGE7Ci0JCQljYWxfc2l6ZSA9IGZ3LT5zaXplOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIHJlcXVlc3RfZmlybXdhcmUgY2FsaWJyYXRpb25cbiIsCi0JCQkJX19mdW5jX18pOwotCQl9Ci0JCWlmIChjYWxfc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9hbmNfaGVhZGVyKSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgY2FsX3NpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLCBjYWxfc2l6ZSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJLyogRmlyc3QgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIgd3JpdGVzICovCi0JCWFuY19oZWFkID0gKHN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIgKikoZGF0YSk7Ci0JCWFuY19wdHIgPSAodTMyICopKGRhdGEgKyBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcikpOwotCQlhbmNfc2l6ZV9yZW1haW5pbmcgPSBjYWxfc2l6ZSAtCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHdjZDl4eHhfYW5jX2hlYWRlcik7Ci0JCW51bV9hbmNfc2xvdHMgPSBhbmNfaGVhZC0+bnVtX2FuY19zbG90czsKLQotCQlpZiAodGF2aWwtPmFuY19zbG90ID49IG51bV9hbmNfc2xvdHMpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEFOQyBzbG90IHNlbGVjdGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FuY19zbG90czsgaSsrKSB7Ci0JCQlpZiAoYW5jX3NpemVfcmVtYWluaW5nIDwgV0NEOTM0WF9QQUNLRURfUkVHX1NJWkUpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCByZWdpc3RlciBmb3JtYXRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJYW5jX3dyaXRlc19zaXplID0gKHUzMikoKmFuY19wdHIpOwotCQkJYW5jX3NpemVfcmVtYWluaW5nIC09IHNpemVvZih1MzIpOwotCQkJYW5jX3B0ciArPSAxOwotCi0JCQlpZiAoKGFuY193cml0ZXNfc2l6ZSAqIFdDRDkzNFhfUEFDS0VEX1JFR19TSVpFKSA+Ci0JCQkgICAgYW5jX3NpemVfcmVtYWluaW5nKSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgcmVnaXN0ZXIgZm9ybWF0XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQotCQkJaWYgKHRhdmlsLT5hbmNfc2xvdCA9PSBpKQotCQkJCWJyZWFrOwotCi0JCQlhbmNfc2l6ZV9yZW1haW5pbmcgLT0gKGFuY193cml0ZXNfc2l6ZSAqCi0JCQkJV0NEOTM0WF9QQUNLRURfUkVHX1NJWkUpOwotCQkJYW5jX3B0ciArPSBhbmNfd3JpdGVzX3NpemU7Ci0JCX0KLQkJaWYgKGkgPT0gbnVtX2FuY19zbG90cykgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IFNlbGVjdGVkIEFOQyBzbG90IG5vdCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWFuY19jYWxfc2l6ZSA9IGFuY193cml0ZXNfc2l6ZTsKLQkJZm9yIChpID0gMDsgaSA8IGFuY193cml0ZXNfc2l6ZTsgaSsrKSB7Ci0JCQlXQ0Q5MzRYX0NPREVDX1VOUEFDS19FTlRSWShhbmNfcHRyW2ldLCByZWcsIG1hc2ssIHZhbCk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCByZWcsICh2YWwgJiBtYXNrKSk7Ci0JCX0KLQotCQkvKiBSYXRlIGNvbnZlcnRlciBjbGsgZW5hYmxlIGFuZCBzZXQgYnlwYXNzIG1vZGUgKi8KLQkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDAgREFDIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIlJYIElOVDEgREFDIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBTUEsxIFBBIikpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19BTkMwX1JDX0NPTU1PTl9DVEwsCi0JCQkJCSAgICAweDA1LCAweDA1KTsKLQkJCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQxIERBQyIpKSB7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfQU5DMF9GSUZPX0NPTU1PTl9DVEwsCi0JCQkJCTB4NjYsIDB4NjYpOwotCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDIgREFDIikpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19BTkMxX1JDX0NPTU1PTl9DVEwsCi0JCQkJCSAgICAweDA1LCAweDA1KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19BTkMxX0ZJRk9fQ09NTU9OX0NUTCwKLQkJCQkJICAgIDB4NjYsIDB4NjYpOwotCQl9Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQxIERBQyIpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsIDB4MDgsIDB4MDgpOwotCQllbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQyIERBQyIpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsIDB4MDgsIDB4MDgpOwotCi0JCWlmICghaHdkZXBfY2FsKQotCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJBTkMgSFBITCBQQSIpIHx8Ci0JCSAgICAhc3RyY21wKHctPm5hbWUsICJBTkMgSFBIUiBQQSIpKSB7Ci0JCQkvKiBSZW1vdmUgQU5DIFJ4IGZyb20gcmVzZXQgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19BTkMwX0NMS19SRVNFVF9DVEwsCi0JCQkJCSAgICAweDA4LCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19BTkMxX0NMS19SRVNFVF9DVEwsCi0JCQkJCSAgICAweDA4LCAweDAwKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfUkNfQ09NTU9OX0NUTCwKLQkJCQkgICAgMHgwNSwgMHgwMCk7Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJBTkMgRUFSIFBBIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBTUEsxIFBBIikgfHwKLQkJICAgICFzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8xX0NUTCwKLQkJCQkJICAgIDB4MzAsIDB4MDApOwotCQkJbXNsZWVwKDUwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzBfTU9ERV8xX0NUTCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MzgsIDB4MzgpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MDcsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzBfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MzgsIDB4MDApOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzFfTU9ERV8xX0NUTCwKLQkJCQkJICAgIDB4MzAsIDB4MDApOwotCQkJbXNsZWVwKDUwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0FOQzFfTU9ERV8xX0NUTCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MzgsIDB4MzgpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MDcsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX0FOQzFfQ0xLX1JFU0VUX0NUTCwKLQkJCQkJICAgIDB4MzgsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotZXJyOgotCWlmICghaHdkZXBfY2FsKQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2dldF9jbGttb2RlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHRlc3RfYml0KENMS19NT0RFLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spKQotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gMTsKLQllbHNlCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGlzX2xvd19wb3dlcl9jbG9jazogJXNcbiIsIF9fZnVuY19fLAotCQl0ZXN0X2JpdChDTEtfTU9ERSwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfcHV0X2Nsa21vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKLQkJc2V0X2JpdChDTEtfTU9ERSwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQllbHNlCi0JCWNsZWFyX2JpdChDTEtfTU9ERSwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBpc19sb3dfcG93ZXJfY2xvY2s6ICVzXG4iLCBfX2Z1bmNfXywKLQkJdGVzdF9iaXQoQ0xLX01PREUsICZ0YXZpbF9wLT5zdGF0dXNfbWFzaykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3ZpX2ZlZWRfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbF9wLT52aV9mZWVkX3ZhbHVlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfdmlfZmVlZF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KLQkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7Ci0JdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7Ci0JdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7Ci0JdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGVuYWJsZTogJWQsIHBvcnRfaWQ6JWQsIGRhaV9pZDogJWRcbiIsCi0JCV9fZnVuY19fLCBlbmFibGUsIHBvcnRfaWQsIGRhaV9pZCk7Ci0KLQl0YXZpbF9wLT52aV9mZWVkX3ZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQltdXRleF9sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7Ci0JaWYgKGVuYWJsZSkgewotCQlpZiAocG9ydF9pZCA9PSBXQ0Q5MzRYX1RYMTQgJiYgIXRlc3RfYml0KFZJX1NFTlNFXzEsCi0JCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE0XS5saXN0LAotCQkJCQkmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKLQkJCXNldF9iaXQoVklfU0VOU0VfMSwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlpZiAocG9ydF9pZCA9PSBXQ0Q5MzRYX1RYMTUgJiYgIXRlc3RfYml0KFZJX1NFTlNFXzIsCi0JCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE1XS5saXN0LAotCQkJCQkmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKLQkJCXNldF9iaXQoVklfU0VOU0VfMiwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwb3J0X2lkID09IFdDRDkzNFhfVFgxNCAmJiB0ZXN0X2JpdChWSV9TRU5TRV8xLAotCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE0XS5saXN0KTsKLQkJCWNsZWFyX2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOwotCQl9Ci0JCWlmIChwb3J0X2lkID09IFdDRDkzNFhfVFgxNSAmJiB0ZXN0X2JpdChWSV9TRU5TRV8yLAotCQkJCQkmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZjb3JlLT50eF9jaHNbV0NEOTM0WF9UWDE1XS5saXN0KTsKLQkJCWNsZWFyX2JpdChWSV9TRU5TRV8yLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fdHhfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHdpZGdldC0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGF2aWxfcC0+dHhfcG9ydF92YWx1ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHdjZDl4eHggKmNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKLQlzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKm1peGVyID0KLQkJKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7Ci0JdTMyIGRhaV9pZCA9IHdpZGdldC0+c2hpZnQ7Ci0JdTMyIHBvcnRfaWQgPSBtaXhlci0+c2hpZnQ7Ci0JdTMyIGVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXUzMiB2dGFibGU7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWUgJXMgY25hbWUgJXMgdmFsdWUgJXUgc2hpZnQgJWQgaXRlbSAlbGRcbiIsCi0JCSAgX19mdW5jX18sCi0JCXdpZGdldC0+bmFtZSwgdWNvbnRyb2wtPmlkLm5hbWUsIHRhdmlsX3AtPnR4X3BvcnRfdmFsdWUsCi0JCXdpZGdldC0+c2hpZnQsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCW11dGV4X2xvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKLQlpZiAoZGFpX2lkID49IEFSUkFZX1NJWkUodnBvcnRfc2xpbV9jaGVja190YWJsZSkpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGRhaV9pZDogJWQsIG91dCBvZiBib3VuZHNcbiIsCi0JCQlfX2Z1bmNfXywgZGFpX2lkKTsKLQkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2dGFibGUgPSB2cG9ydF9zbGltX2NoZWNrX3RhYmxlW2RhaV9pZF07Ci0KLQlzd2l0Y2ggKGRhaV9pZCkgewotCWNhc2UgQUlGMV9DQVA6Ci0JY2FzZSBBSUYyX0NBUDoKLQljYXNlIEFJRjNfQ0FQOgotCQkvKiBvbmx5IGFkZCB0byB0aGUgbGlzdCBpZiB2YWx1ZSBub3Qgc2V0ICovCi0JCWlmIChlbmFibGUgJiYgISh0YXZpbF9wLT50eF9wb3J0X3ZhbHVlICYgMSA8PCBwb3J0X2lkKSkgewotCQkJaWYgKHdjZDl4eHhfdHhfdnBvcnRfdmFsaWRhdGlvbih2dGFibGUsIHBvcnRfaWQsCi0JCQkgICAgdGF2aWxfcC0+ZGFpLCBOVU1fQ09ERUNfREFJUykpIHsKLQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBpcyB1c2VkIGJ5IG90aGVyIHZpcnR1YWwgcG9ydFxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJdGF2aWxfcC0+dHhfcG9ydF92YWx1ZSB8PSAxIDw8IHBvcnRfaWQ7Ci0JCQlsaXN0X2FkZF90YWlsKCZjb3JlLT50eF9jaHNbcG9ydF9pZF0ubGlzdCwKLQkJCQkgICAgICAmdGF2aWxfcC0+ZGFpW2RhaV9pZF0ud2NkOXh4eF9jaF9saXN0KTsKLQkJfSBlbHNlIGlmICghZW5hYmxlICYmICh0YXZpbF9wLT50eF9wb3J0X3ZhbHVlICYKLQkJCSAgIDEgPDwgcG9ydF9pZCkpIHsKLQkJCXRhdmlsX3AtPnR4X3BvcnRfdmFsdWUgJj0gfigxIDw8IHBvcnRfaWQpOwotCQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+dHhfY2hzW3BvcnRfaWRdLmxpc3QpOwotCQl9IGVsc2UgewotCQkJaWYgKGVuYWJsZSkKLQkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogVFgldSBwb3J0IGlzIHVzZWQgYnlcbiIKLQkJCQkJInRoaXMgdmlydHVhbCBwb3J0XG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQllbHNlCi0JCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IFRYJXUgcG9ydCBpcyBub3QgdXNlZCBieVxuIgotCQkJCQkidGhpcyB2aXJ0dWFsIHBvcnRcbiIsCi0JCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCS8qIGF2b2lkIHVwZGF0ZSBwb3dlciBmdW5jdGlvbiAqLwotCQkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFJRjRfTUFEX1RYOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEFJRiAlZFxuIiwgZGFpX2lkKTsKLQkJbXV0ZXhfdW5sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbmFtZSAlcyBzbmFtZSAlcyB1cGRhdGVkIHZhbHVlICV1IHNoaWZ0ICVkXG4iLAotCQlfX2Z1bmNfXywgd2lkZ2V0LT5uYW1lLCB3aWRnZXQtPnNuYW1lLCB0YXZpbF9wLT50eF9wb3J0X3ZhbHVlLAotCQl3aWRnZXQtPnNoaWZ0KTsKLQotCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgZW5hYmxlLCB1cGRhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9tdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJCQl0YXZpbF9wLT5yeF9wb3J0X3ZhbHVlW3dpZGdldC0+c2hpZnRdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fcnhfbXV4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCXVuc2lnbmVkIGludCByeF9wb3J0X3ZhbHVlOwotCXUzMiBwb3J0X2lkID0gd2lkZ2V0LT5zaGlmdDsKLQotCXRhdmlsX3AtPnJ4X3BvcnRfdmFsdWVbcG9ydF9pZF0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCXJ4X3BvcnRfdmFsdWUgPSB0YXZpbF9wLT5yeF9wb3J0X3ZhbHVlW3BvcnRfaWRdOwotCi0JbXV0ZXhfbG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB3bmFtZSAlcyBjbmFtZSAlcyB2YWx1ZSAldSBzaGlmdCAlZCBpdGVtICVsZFxuIiwKLQkJX19mdW5jX18sIHdpZGdldC0+bmFtZSwgdWNvbnRyb2wtPmlkLm5hbWUsCi0JCXJ4X3BvcnRfdmFsdWUsIHdpZGdldC0+c2hpZnQsCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCS8qIHZhbHVlIG5lZWQgdG8gbWF0Y2ggdGhlIFZpcnR1YWwgcG9ydCBhbmQgQUlGIG51bWJlciAqLwotCXN3aXRjaCAocnhfcG9ydF92YWx1ZSkgewotCWNhc2UgMDoKLQkJbGlzdF9kZWxfaW5pdCgmY29yZS0+cnhfY2hzW3BvcnRfaWRdLmxpc3QpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAotCQkJJnRhdmlsX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYxX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAotCQkJJnRhdmlsX3AtPmRhaVtBSUYyX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYyX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAotCQkJJnRhdmlsX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUYzX1BCXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmICh3Y2Q5eHh4X3J4X3Zwb3J0X3ZhbGlkYXRpb24ocG9ydF9pZCArCi0JCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSLAotCQkJJnRhdmlsX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogUlgldSBpcyB1c2VkIGJ5IGN1cnJlbnQgcmVxdWVzdGluZyBBSUZfUEIgaXRzZWxmXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNvcmUtPnJ4X2Noc1twb3J0X2lkXS5saXN0LAotCQkJICAgICAgJnRhdmlsX3AtPmRhaVtBSUY0X1BCXS53Y2Q5eHh4X2NoX2xpc3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIEFJRiAlZFxuIiwgcnhfcG9ydF92YWx1ZSk7Ci0JCWdvdG8gZXJyOwotCX0KLXJ0bjoKLQltdXRleF91bmxvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKLQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAotCQkJCSAgICAgIHJ4X3BvcnRfdmFsdWUsIGUsIHVwZGF0ZSk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQltdXRleF91bmxvY2soJnRhdmlsX3AtPmNvZGVjX211dGV4KTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKAotCQkJCQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAotCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCWludCBwb3J0X251bSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKLQl1OCB2YWwgPSAwOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wOwotCi0JaWYgKCFkYWkgfHwgIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCWlmIChjaC0+cG9ydCA+PSBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSKSB7Ci0JCQlwb3J0X251bSA9IGNoLT5wb3J0IC0gV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUjsKLQkJCXJlZyA9IFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfUlhfRU4wICsgKHBvcnRfbnVtIC8gOCk7Ci0JCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXZpbF9wLT53Y2Q5eHh4LAotCQkJCXJlZyk7Ci0JCQlpZiAoISh2YWwgJiBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKSkpIHsKLQkJCQl2YWwgfD0gQllURV9CSVRfTUFTSyhwb3J0X251bSk7Ci0JCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKAotCQkJCQl0YXZpbF9wLT53Y2Q5eHh4LCByZWcsIHZhbCk7Ci0JCQkJdmFsID0gd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3JlYWQoCi0JCQkJCXRhdmlsX3AtPndjZDl4eHgsIHJlZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwb3J0X251bSA9IGNoLT5wb3J0OwotCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKyAocG9ydF9udW0gLyA4KTsKLQkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKHRhdmlsX3AtPndjZDl4eHgsCi0JCQkJcmVnKTsKLQkJCWlmICghKHZhbCAmIEJZVEVfQklUX01BU0socG9ydF9udW0pKSkgewotCQkJCXZhbCB8PSBCWVRFX0JJVF9NQVNLKHBvcnRfbnVtKTsKLQkJCQl3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfd3JpdGUodGF2aWxfcC0+d2NkOXh4eCwKLQkJCQkJcmVnLCB2YWwpOwotCQkJCXZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAotCQkJCQl0YXZpbF9wLT53Y2Q5eHh4LCByZWcpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpLAotCQkJCQkgIGJvb2wgdXApCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCi0JaWYgKHVwKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZkYWktPndjZDl4eHhfY2hfbGlzdCwgbGlzdCkgewotCQkJcmV0ID0gd2NkOXh4eF9nZXRfc2xhdmVfcG9ydChjaC0+Y2hfbnVtKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogSW52YWxpZCBzbGF2ZSBwb3J0IElEOiAlZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0X2JpdChyZXQsICZkYWktPmNoX21hc2spOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGRhaS0+ZGFpX3dhaXQsIChkYWktPmNoX21hc2sgPT0gMCksCi0JCQkJCSBtc2Vjc190b19qaWZmaWVzKAotCQkJCQkJV0NEOTM0WF9TTElNX0NMT1NFX1RJTUVPVVQpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IFNsaW0gY2xvc2UgdHgvcnggd2FpdCB0aW1lb3V0LCBjaF9tYXNrOjB4JWx4XG4iLAotCQkJCV9fZnVuY19fLCBkYWktPmNoX21hc2spOwotCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfbXV0ZV9kc2Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpjaF9saXN0KQotewotCXU4IGRzZDBfaW47Ci0JdTggZHNkMV9pbjsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7Ci0KLQkvKiBSZWFkIERTRCBJbnB1dCBQb3J0cyAqLwotCWRzZDBfaW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzApICYgMHgzQykgPj4gMjsKLQlkc2QxX2luID0gKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcwKSAmIDB4M0MpID4+IDI7Ci0KLQlpZiAoKGRzZDBfaW4gPT0gMCkgJiYgKGRzZDFfaW4gPT0gMCkpCi0JCXJldHVybjsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHBvcnRzIGdldHRpbmcgZGlzYWJsZWQgYXJlIGNvbm5lY3RlZCB0byBEU0QgaW5wdXRzLgotCSAqIElmIGNvbm5lY3RlZCwgZW5hYmxlIERTRCBtdXRlIHRvIGF2b2lkIERDIGVudGVyaW5nIGludG8gRFNEIEZpbHRlcgotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsIGNoX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGNoLT5wb3J0ID09IChkc2QwX2luICsgV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiAtIDEpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9DRkcyLAotCQkJCQkgICAgMHgwNCwgMHgwNCk7Ci0JCWlmIChjaC0+cG9ydCA9PSAoZHNkMV9pbiArIFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIgLSAxKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfQ0ZHMiwKLQkJCQkJICAgIDB4MDQsIDB4MDQpOwotCX0KLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXJ4KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHdjZDl4eHggKmNvcmU7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY29kZWNfZGFpX2RhdGEgKmRhaTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOwotCi0JY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50IGNhbGxlZCEgY29kZWMgbmFtZSAlcyBudW1fZGFpICVkXG4iCi0JCSJzdHJlYW0gbmFtZSAlcyBldmVudCAlZFxuIiwKLQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSwKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSwgZXZlbnQpOwotCi0JZGFpID0gJnRhdmlsX3AtPmRhaVt3LT5zaGlmdF07Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHctPm5hbWUgJXMgdy0+c2hpZnQgJWQgZXZlbnQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgdy0+bmFtZSwgdy0+c2hpZnQsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSA9IGZhbHNlOwotCQl0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9wb3J0X2ludHIoZGFpLCBjb2RlYyk7Ci0JCSh2b2lkKSB0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCB0cnVlKTsKLQkJcmV0ID0gd2NkOXh4eF9jZmdfc2xpbV9zY2hfcngoY29yZSwgJmRhaS0+d2NkOXh4eF9jaF9saXN0LAotCQkJCQkgICAgICBkYWktPnJhdGUsIGRhaS0+Yml0X3dpZHRoLAotCQkJCQkgICAgICAmZGFpLT5ncnBoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCWlmIChkc2RfY29uZikKLQkJCXRhdmlsX2NvZGVjX211dGVfZHNkKGNvZGVjLCAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QpOwotCi0JCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJICAgICAgZGFpLT5ncnBoKTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc2Nvbm5lY3QgUlggcG9ydCwgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCQlpZiAoIWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkpCi0JCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfc2xpbV9jaG1hc2soZGFpLCBmYWxzZSk7Ci0JCWVsc2UKLQkJCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCQkiJXM6IGJ1cyBpbiByZWNvdmVyeSBza2lwIGVuYWJsZSBzbGltX2NobWFzayIsCi0JCQkJX19mdW5jX18pOwotCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3J4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJCWRhaS0+Z3JwaCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdHgoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpOwotCXN0cnVjdCB3Y2Q5eHh4ICpjb3JlOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IHctPm5hbWUgJXMsIHctPnNoaWZ0ID0gJWQsIG51bV9kYWkgJWQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCV9fZnVuY19fLCB3LT5uYW1lLCB3LT5zaGlmdCwKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFpLCB3LT5zbmFtZSk7Ci0KLQlkYWkgPSAmdGF2aWxfcC0+ZGFpW3ctPnNoaWZ0XTsKLQljb3JlID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkgPSBmYWxzZTsKLQkJdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKGRhaSwgY29kZWMpOwotCQkodm9pZCkgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgdHJ1ZSk7Ci0JCXJldCA9IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJICAgICAgZGFpLT5yYXRlLCBkYWktPmJpdF93aWR0aCwKLQkJCQkJICAgICAgJmRhaS0+Z3JwaCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJCWRhaS0+Z3JwaCk7Ci0JCWlmICghZGFpLT5idXNfZG93bl9pbl9yZWNvdmVyeSkKLQkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltX2NobWFzayhkYWksIGZhbHNlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXJldCA9IHdjZDl4eHhfZGlzY29ubmVjdF9wb3J0KGNvcmUsCi0JCQkJCQkgICAgICAmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCi0JCQkJCQkgICAgICBkYWktPmdycGgpOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IERpc2Nvbm5lY3QgUlggcG9ydCwgcmV0ID0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCByZXQpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdmlfZmVlZGJhY2soc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHdjZDl4eHggKmNvcmUgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsX3AgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB3Y2Q5eHh4X2NvZGVjX2RhaV9kYXRhICpkYWkgPSBOVUxMOwotCi0JY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JdGF2aWxfcCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiBudW1fZGFpICVkIHN0cmVhbSBuYW1lICVzIHctPm5hbWUgJXMgZXZlbnQgJWQgc2hpZnQgJWRcbiIsCi0JCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm51bV9kYWksIHctPnNuYW1lLAotCQl3LT5uYW1lLCBldmVudCwgdy0+c2hpZnQpOwotCi0JaWYgKHctPnNoaWZ0ICE9IEFJRjRfVklGRUVEKSB7Ci0JCXByX2VycigiJXMgRXJyb3IgaW4gZW5hYmxpbmcgdGhlIHR4IHBhdGhcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlkYWkgPSAmdGF2aWxfcC0+ZGFpW3ctPnNoaWZ0XTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjEgZW5hYmxlZFxuIiwgX19mdW5jX18pOwotCQkJLyogRW5hYmxlIFYmSSBzZW5zaW5nICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDIwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDBGLAotCQkJCTB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLCAweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYOV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDAwKTsKLQkJfQotCQlpZiAodGVzdF9iaXQoVklfU0VOU0VfMiwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKSkgewotCQkJcHJfZGVidWcoIiVzOiBzcGtyMiBlbmFibGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkvKiBFbmFibGUgViZJIHNlbnNpbmcgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgwRiwKLQkJCQkweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MEYsCi0JCQkJMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKLQkJCQkweDEwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMV9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTJfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MDApOwotCQl9Ci0JCWRhaS0+YnVzX2Rvd25faW5fcmVjb3ZlcnkgPSBmYWxzZTsKLQkJdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fcG9ydF9pbnRyKGRhaSwgY29kZWMpOwotCQkodm9pZCkgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgdHJ1ZSk7Ci0JCXJldCA9IHdjZDl4eHhfY2ZnX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJICAgICAgZGFpLT5yYXRlLCBkYWktPmJpdF93aWR0aCwKLQkJCQkJICAgICAgJmRhaS0+Z3JwaCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlyZXQgPSB3Y2Q5eHh4X2Nsb3NlX3NsaW1fc2NoX3R4KGNvcmUsICZkYWktPndjZDl4eHhfY2hfbGlzdCwKLQkJCQkJCWRhaS0+Z3JwaCk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyBlcnJvciBpbiBjbG9zZV9zbGltX3NjaF90eCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJaWYgKCFkYWktPmJ1c19kb3duX2luX3JlY292ZXJ5KQotCQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1fY2htYXNrKGRhaSwgZmFsc2UpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcmV0ID0gd2NkOXh4eF9kaXNjb25uZWN0X3BvcnQoY29yZSwKLQkJCQkmZGFpLT53Y2Q5eHh4X2NoX2xpc3QsCi0JCQkJZGFpLT5ncnBoKTsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBEaXNjb25uZWN0IFRYIHBvcnQsIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQl9Ci0JCWlmICh0ZXN0X2JpdChWSV9TRU5TRV8xLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spKSB7Ci0JCQkvKiBEaXNhYmxlIFYmSSBzZW5zaW5nICovCi0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc3BrcjEgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwgMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTBfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDIwLAotCQkJCTB4MjApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDlfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMF9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MTAsCi0JCQkJMHgwMCk7Ci0JCX0KLQkJaWYgKHRlc3RfYml0KFZJX1NFTlNFXzIsICZ0YXZpbF9wLT5zdGF0dXNfbWFzaykpIHsKLQkJCS8qIERpc2FibGUgViZJIHNlbnNpbmcgKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzcGtyMiBkaXNhYmxlZFxuIiwgX19mdW5jX18pOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgyMCwKLQkJCQkweDIwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJV0NEOTM0WF9DRENfVFgxMl9TUEtSX1BST1RfUEFUSF9DVEwsIDB4MjAsCi0JCQkJMHgyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1RYMTFfU1BLUl9QUk9UX1BBVEhfQ1RMLCAweDEwLAotCQkJCTB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NUTCwgMHgxMCwKLQkJCQkweDAwKTsKLQkJfQotCQlicmVhazsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX3J4X2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQl0YXZpbC0+cnhfYmlhc19jb3VudCsrOwotCQlpZiAodGF2aWwtPnJ4X2JpYXNfY291bnQgPT0gMSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJdGF2aWwtPnJ4X2JpYXNfY291bnQtLTsKLQkJaWYgKCF0YXZpbC0+cnhfYmlhc19jb3VudCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCWJyZWFrOwotCX07Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEN1cnJlbnQgUlggQklBUyB1c2VyIGNvdW50OiAlZFxuIiwgX19mdW5jX18sCi0JCXRhdmlsLT5yeF9iaWFzX2NvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9zcGtfYW5jX3VwZGF0ZV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHNwa19hbmNfd29yayAqc3BrX2FuY19kd29yazsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCWRlbGF5ZWRfd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlzcGtfYW5jX2R3b3JrID0gY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IHNwa19hbmNfd29yaywgZHdvcmspOwotCXRhdmlsID0gc3BrX2FuY19kd29yay0+dGF2aWw7Ci0JY29kZWMgPSB0YXZpbC0+Y29kZWM7Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcwLCAweDEwLCAweDEwKTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfc3Brcl9hbmMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIGludCBldmVudCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoIXRhdmlsLT5hbmNfZnVuYykKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdzogJXMgZXZlbnQ6ICVkIGFuYzogJWRcbiIsIF9fZnVuY19fLAotCQl3LT5uYW1lLCBldmVudCwgdGF2aWwtPmFuY19mdW5jKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdGF2aWwtPnNwa19hbmNfZHdvcmsuZHdvcmssCi0JCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhzcGtfYW5jX2VuX2RlbGF5KSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnRhdmlsLT5zcGtfYW5jX2R3b3JrLmR3b3JrKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ0ZHMCwKLQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2Vhcl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgaW50IGV2ZW50KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKgotCQkgKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgaXMgZW5hYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ1RMLAotCQkJCSAgICAweDEwLCAweDAwKTsKLQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCkpICYKLQkJICAgICAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qCi0JCSAqIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBkaXNhYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBFQVIgUEEiKSkpIHsKLQkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJfQotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfb3ZlcnJpZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgbW9kZSwKLQkJCQkgaW50IGV2ZW50KQotewotCWlmIChtb2RlID09IENMU19BQiB8fCBtb2RlID09IENMU19BQl9ISUZJKSB7Ci0JCXN3aXRjaCAoZXZlbnQpIHsKLQkJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsIDB4MDIsIDB4MDIpOwotCQlicmVhazsKLQkJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsIDB4MDIsIDB4MDApOwotCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfY2xlYXJfYW5jX3R4X2hvbGQoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKQotewotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDMSwgJnRhdmlsLT5zdGF0dXNfbWFzaykpCi0JCXRhdmlsX2NvZGVjX3NldF90eF9ob2xkKHRhdmlsLT5jb2RlYywgV0NEOTM0WF9BTkFfQU1JQzEsIGZhbHNlKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFOQ19NSUNfQU1JQzIsICZ0YXZpbC0+c3RhdHVzX21hc2spKQotCQl0YXZpbF9jb2RlY19zZXRfdHhfaG9sZCh0YXZpbC0+Y29kZWMsIFdDRDkzNFhfQU5BX0FNSUMyLCBmYWxzZSk7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBTkNfTUlDX0FNSUMzLCAmdGF2aWwtPnN0YXR1c19tYXNrKSkKLQkJdGF2aWxfY29kZWNfc2V0X3R4X2hvbGQodGF2aWwtPmNvZGVjLCBXQ0Q5MzRYX0FOQV9BTUlDMywgZmFsc2UpOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQU5DX01JQ19BTUlDNCwgJnRhdmlsLT5zdGF0dXNfbWFzaykpCi0JCXRhdmlsX2NvZGVjX3NldF90eF9ob2xkKHRhdmlsLT5jb2RlYywgV0NEOTM0WF9BTkFfQU1JQzQsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfaHBocl9wYShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsLT5kc2RfY29uZmlnOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKFRBVklMX0lTXzFfMCh0YXZpbC0+d2NkOXh4eCkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCwKLQkJCQkJICAgIDB4MDYsICgweDAzIDw8IDEpKTsKLQotCQlpZiAoKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBIUiBQQSIpKSkgJiYKLQkJICAgICh0ZXN0X2JpdChIUEhfUEFfREVMQVksICZ0YXZpbC0+c3RhdHVzX21hc2spKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0hQSCwgMHhDMCwgMHhDMCk7Ci0KLQkJc2V0X2JpdChIUEhfUEFfREVMQVksICZ0YXZpbC0+c3RhdHVzX21hc2spOwotCQlpZiAoZHNkX2NvbmYgJiYKLQkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwpICYgMHgwMSkpIHsKLQkJCS8qIFNldCByZWd1bGF0b3IgbW9kZSB0byBBQiBpZiBEU0QgaXMgZW5hYmxlZCAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfUlhfU1VQUExJRVMsCi0JCQkJCSAgICAweDAyLCAweDAyKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKCghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpKSB7Ci0JCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfSFBIKSAmIDB4QzApCi0JCQkJCSE9IDB4QzApCi0JCQkJLyoKLQkJCQkgKiBJZiBQQV9FTiBpcyBub3Qgc2V0IChwb3RlbnRpYWxseSBpbiBBTkMgY2FzZSkKLQkJCQkgKiB0aGVuIGRvIG5vdGhpbmcgZm9yIFBPU1RfUE1VIGFuZCBsZXQgbGVmdAotCQkJCSAqIGNoYW5uZWwgaGFuZGxlIGV2ZXJ5dGhpbmcuCi0JCQkJICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyoKLQkJICogN21zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGVuYWJsZWQgYXMgcGVyCi0JCSAqIEhXIHJlcXVpcmVtZW50LiBJZiBjb21wYW5kZXIgaXMgZGlzYWJsZWQsIHRoZW4KLQkJICogMjBtcyBkZWxheSBpcyBuZWVkZWQuCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKSkgewotCQkJaWYgKCF0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl8yXSkKLQkJCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJCWVsc2UKLQkJCQl1c2xlZXBfcmFuZ2UoNzAwMCwgNzEwMCk7Ci0JCQljbGVhcl9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlpZiAodGF2aWwtPmFuY19mdW5jKSB7Ci0JCQkvKiBDbGVhciBUeCBGRSBIT0xEIGlmIGJvdGggUEFzIGFyZSBlbmFibGVkICovCi0JCQlpZiAoKHNuZF9zb2NfcmVhZCh0YXZpbC0+Y29kZWMsIFdDRDkzNFhfQU5BX0hQSCkgJgotCQkJCQkweEMwKSA9PSAweEMwKQotCQkJCXRhdmlsX2NvZGVjX2NsZWFyX2FuY190eF9ob2xkKHRhdmlsKTsKLQkJfQotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMSk7Ci0KLQkJLyogUmVtb3ZlIG11dGUgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMLAotCQkJCSAgICAweDEwLCAweDAwKTsKLQkJLyogRW5hYmxlIEdNMyBib29zdCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMLAotCQkJCSAgICAweDgwLCAweDgwKTsKLQkJLyogRW5hYmxlIEF1dG9DaG9wIHRpbWVyIGF0IHRoZSBlbmQgb2YgcG93ZXIgdXAgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLAotCQkJCSAgICAweDAyLCAweDAyKTsKLQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCkpICYKLQkJCQkgIDB4MTApCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJICAgIDB4MTAsIDB4MDApOwotCQlpZiAoZHNkX2NvbmYgJiYKLQkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwpICYgMHgwMSkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzIsCi0JCQkJCSAgICAweDA0LCAweDAwKTsKLQkJaWYgKCEoc3RyY21wKHctPm5hbWUsICJBTkMgSFBIUiBQQSIpKSkgewotCQkJcHJfZGVidWcoIiVzOkRvIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBsZWZ0IGNoYW5uZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJLyogRG8gZXZlcnl0aGluZyBuZWVkZWQgZm9yIGxlZnQgY2hhbm5lbCAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTF9URVNULAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0KLQkJCS8qIFJlbW92ZSBtdXRlICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQotCQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCVdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwpKSAmCi0JCQkJCTB4MTApCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfTUlYX0NUTCwKLQkJCQkJMHgxMCwgMHgwMCk7Ci0KLQkJCWlmIChkc2RfY29uZiAmJiAoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCQkJV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCkgJgotCQkJCQkJMHgwMSkpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJCSAgICBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzIsCi0JCQkJCQkgICAgMHgwNCwgMHgwMCk7Ci0JCQkvKiBSZW1vdmUgQU5DIFJ4IGZyb20gcmVzZXQgKi8KLQkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJfQotCQl0YXZpbF9jb2RlY19vdmVycmlkZShjb2RlYywgdGF2aWwtPmhwaF9tb2RlLCBldmVudCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkJICAgICBXQ0RfRVZFTlRfUFJFX0hQSFJfUEFfT0ZGLAotCQkJCQkgICAgICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOwotCQkvKiBFbmFibGUgRFNEIE11dGUgYmVmb3JlIFBBIGRpc2FibGUgKi8KLQkJaWYgKGRzZF9jb25mICYmCi0JCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKSAmIDB4MDEpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfRFNEMV9DRkcyLAotCQkJCQkgICAgMHgwNCwgMHgwNCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX1JfVEVTVCwgMHgwMSwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCwKLQkJCQkgICAgMHgxMCwgMHgxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsCi0JCQkJICAgIDB4MTAsIDB4MTApOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhSIFBBIikpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfSFBILCAweDQwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qCi0JCSAqIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBkaXNhYmxlLiBJZiBjb21wYW5kZXIgaXMKLQkJICogZGlzYWJsZWQsIHRoZW4gMjBtcyBkZWxheSBpcyBuZWVkZWQgYWZ0ZXIgUEEgZGlzYWJsZS4KLQkJICovCi0JCWlmICghdGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfMl0pCi0JCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJZWxzZQotCQkJdXNsZWVwX3JhbmdlKDUwMDAsIDUxMDApOwotCQl0YXZpbF9jb2RlY19vdmVycmlkZShjb2RlYywgdGF2aWwtPmhwaF9tb2RlLCBldmVudCk7Ci0JCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkJICAgICBXQ0RfRVZFTlRfUE9TVF9IUEhSX1BBX09GRiwKLQkJCQkJICAgICAmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKLQkJaWYgKFRBVklMX0lTXzFfMCh0YXZpbC0+d2NkOXh4eCkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCwKLQkJCQkJICAgIDB4MDYsIDB4MCk7Ci0JCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSFIgUEEiKSkpIHsKLQkJCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hbmModywga2NvbnRyb2wsIGV2ZW50KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2hwaGxfcGEoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbC0+ZHNkX2NvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVzICVkXG4iLCBfX2Z1bmNfXywgdy0+bmFtZSwgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwsCi0JCQkJCSAgICAweDA2LCAoMHgwMyA8PCAxKSk7Ci0JCWlmICgoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKSAmJgotCQkgICAgKHRlc3RfYml0KEhQSF9QQV9ERUxBWSwgJnRhdmlsLT5zdGF0dXNfbWFzaykpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfSFBILAotCQkJCQkgICAgMHhDMCwgMHhDMCk7Ci0JCXNldF9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKLQkJaWYgKGRzZF9jb25mICYmCi0JCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMKSAmIDB4MDEpKSB7Ci0JCQkvKiBTZXQgcmVndWxhdG9yIG1vZGUgdG8gQUIgaWYgRFNEIGlzIGVuYWJsZWQgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX1JYX1NVUFBMSUVTLAotCQkJCQkgICAgMHgwMiwgMHgwMik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWlmICghKHN0cmNtcCh3LT5uYW1lLCAiQU5DIEhQSEwgUEEiKSkpIHsKLQkJCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0FOQV9IUEgpICYgMHhDMCkKLQkJCQkJCQkJIT0gMHhDMCkKLQkJCQkvKgotCQkJCSAqIElmIFBBX0VOIGlzIG5vdCBzZXQgKHBvdGVudGlhbGx5IGluIEFOQwotCQkJCSAqIGNhc2UpIHRoZW4gZG8gbm90aGluZyBmb3IgUE9TVF9QTVUgYW5kCi0JCQkJICogbGV0IHJpZ2h0IGNoYW5uZWwgaGFuZGxlIGV2ZXJ5dGhpbmcuCi0JCQkJICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyoKLQkJICogN21zIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIFBBIGlzIGVuYWJsZWQgYXMgcGVyCi0JCSAqIEhXIHJlcXVpcmVtZW50LiBJZiBjb21wYW5kZXIgaXMgZGlzYWJsZWQsIHRoZW4KLQkJICogMjBtcyBkZWxheSBpcyBuZWVkZWQuCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKSkgewotCQkJaWYgKCF0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl8xXSkKLQkJCQl1c2xlZXBfcmFuZ2UoMjAwMDAsIDIwMTAwKTsKLQkJCWVsc2UKLQkJCQl1c2xlZXBfcmFuZ2UoNzAwMCwgNzEwMCk7Ci0JCQljbGVhcl9iaXQoSFBIX1BBX0RFTEFZLCAmdGF2aWwtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlpZiAodGF2aWwtPmFuY19mdW5jKSB7Ci0JCQkvKiBDbGVhciBUeCBGRSBIT0xEIGlmIGJvdGggUEFzIGFyZSBlbmFibGVkICovCi0JCQlpZiAoKHNuZF9zb2NfcmVhZCh0YXZpbC0+Y29kZWMsIFdDRDkzNFhfQU5BX0hQSCkgJgotCQkJCQkweEMwKSA9PSAweEMwKQotCQkJCXRhdmlsX2NvZGVjX2NsZWFyX2FuY190eF9ob2xkKHRhdmlsKTsKLQkJfQotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX0xfVEVTVCwgMHgwMSwgMHgwMSk7Ci0JCS8qIFJlbW92ZSBNdXRlIG9uIHByaW1hcnkgcGF0aCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsCi0JCQkJICAgIDB4MTAsIDB4MDApOwotCQkvKiBFbmFibGUgR00zIGJvb3N0ICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsCi0JCQkJICAgIDB4ODAsIDB4ODApOwotCQkvKiBFbmFibGUgQXV0b0Nob3AgdGltZXIgYXQgdGhlIGVuZCBvZiBwb3dlciB1cCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEsCi0JCQkJICAgIDB4MDIsIDB4MDIpOwotCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCi0JCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMKSkgJgotCQkJCSAgMHgxMCkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9NSVhfQ1RMLAotCQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCWlmIChkc2RfY29uZiAmJgotCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCkgJiAweDAxKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwKLQkJCQkJICAgIDB4MDQsIDB4MDApOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6RG8gZXZlcnl0aGluZyBuZWVkZWQgZm9yIHJpZ2h0IGNoYW5uZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCi0JCQkvKiBEbyBldmVyeXRoaW5nIG5lZWRlZCBmb3IgcmlnaHQgY2hhbm5lbCAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUl9URVNULAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0KLQkJCS8qIFJlbW92ZSBtdXRlICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsCi0JCQkJCQkweDEwLCAweDAwKTsKLQotCQkJLyogUmVtb3ZlIG1peCBwYXRoIG11dGUgaWYgaXQgaXMgZW5hYmxlZCAqLwotCQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCVdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwpKSAmCi0JCQkJCTB4MTApCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJCVdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DVEwsCi0JCQkJCQkweDEwLCAweDAwKTsKLQkJCWlmIChkc2RfY29uZiAmJiAoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NEQ19EU0QxX1BBVEhfQ1RMKSAmIDB4MDEpKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCQkgICAgV0NEOTM0WF9DRENfRFNEMV9DRkcyLAotCQkJCQkJICAgIDB4MDQsIDB4MDApOwotCQkJLyogUmVtb3ZlIEFOQyBSeCBmcm9tIHJlc2V0ICovCi0JCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCX0KLQkJdGF2aWxfY29kZWNfb3ZlcnJpZGUoY29kZWMsIHRhdmlsLT5ocGhfbW9kZSwgZXZlbnQpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXZpbC0+bWJoYy0+bm90aWZpZXIsCi0JCQkJCSAgICAgV0NEX0VWRU5UX1BSRV9IUEhMX1BBX09GRiwKLQkJCQkJICAgICAmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKLQkJLyogRW5hYmxlIERTRCBNdXRlIGJlZm9yZSBQQSBkaXNhYmxlICovCi0JCWlmIChkc2RfY29uZiAmJgotCQkgICAgKHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfRFNEMF9QQVRIX0NUTCkgJiAweDAxKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDBfQ0ZHMiwKLQkJCQkJICAgIDB4MDQsIDB4MDQpOwotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfSFBIX0xfVEVTVCwgMHgwMSwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwKLQkJCQkgICAgMHgxMCwgMHgxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DVEwsCi0JCQkJICAgIDB4MTAsIDB4MTApOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfSFBILAotCQkJCQkgICAgMHg4MCwgMHgwMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKgotCQkgKiA1bXMgc2xlZXAgaXMgcmVxdWlyZWQgYWZ0ZXIgUEEgZGlzYWJsZS4gSWYgY29tcGFuZGVyIGlzCi0JCSAqIGRpc2FibGVkLCB0aGVuIDIwbXMgZGVsYXkgaXMgbmVlZGVkIGFmdGVyIFBBIGRpc2FibGUuCi0JCSAqLwotCQlpZiAoIXRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzFdKQotCQkJdXNsZWVwX3JhbmdlKDIwMDAwLCAyMDEwMCk7Ci0JCWVsc2UKLQkJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAwKTsKLQkJdGF2aWxfY29kZWNfb3ZlcnJpZGUoY29kZWMsIHRhdmlsLT5ocGhfbW9kZSwgZXZlbnQpOwotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ0YXZpbC0+bWJoYy0+bm90aWZpZXIsCi0JCQkJCSAgICAgV0NEX0VWRU5UX1BPU1RfSFBITF9QQV9PRkYsCi0JCQkJCSAgICAgJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7Ci0JCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwsCi0JCQkJCSAgICAweDA2LCAweDApOwotCQlpZiAoIShzdHJjbXAody0+bmFtZSwgIkFOQyBIUEhMIFBBIikpKSB7Ci0JCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsIDB4MTAsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9saW5lb3V0X3BhKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXUxNiBsaW5lb3V0X3ZvbF9yZWcgPSAwLCBsaW5lb3V0X21peF92b2xfcmVnID0gMDsKLQl1MTYgZHNkX211dGVfcmVnID0gMCwgZHNkX2Nsa19yZWcgPSAwOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsLT5kc2RfY29uZmlnOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlpZiAody0+cmVnID09IFdDRDkzNFhfQU5BX0xPXzFfMikgewotCQlpZiAody0+c2hpZnQgPT0gNykgewotCQkJbGluZW91dF92b2xfcmVnID0gV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ1RMOwotCQkJbGluZW91dF9taXhfdm9sX3JlZyA9IFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9DVEw7Ci0JCQlkc2RfbXV0ZV9yZWcgPSBXQ0Q5MzRYX0NEQ19EU0QwX0NGRzI7Ci0JCQlkc2RfY2xrX3JlZyA9IFdDRDkzNFhfQ0RDX0RTRDBfUEFUSF9DVEw7Ci0JCX0gZWxzZSBpZiAody0+c2hpZnQgPT0gNikgewotCQkJbGluZW91dF92b2xfcmVnID0gV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMOwotCQkJbGluZW91dF9taXhfdm9sX3JlZyA9IFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9DVEw7Ci0JCQlkc2RfbXV0ZV9yZWcgPSBXQ0Q5MzRYX0NEQ19EU0QxX0NGRzI7Ci0JCQlkc2RfY2xrX3JlZyA9IFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEw7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IgZW5hYmxpbmcgbGluZW91dCBQQVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXRhdmlsX2NvZGVjX292ZXJyaWRlKGNvZGVjLCBDTFNfQUIsIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCS8qCi0JCSAqIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBlbmFibGVkIGFzIHBlcgotCQkgKiBIVyByZXF1aXJlbWVudAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDU1MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBsaW5lb3V0X3ZvbF9yZWcsCi0JCQkJICAgIDB4MTAsIDB4MDApOwotCQkvKiBSZW1vdmUgbWl4IHBhdGggbXV0ZSBpZiBpdCBpcyBlbmFibGVkICovCi0JCWlmICgoc25kX3NvY19yZWFkKGNvZGVjLCBsaW5lb3V0X21peF92b2xfcmVnKSkgJiAweDEwKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIGxpbmVvdXRfbWl4X3ZvbF9yZWcsCi0JCQkJCSAgICAweDEwLCAweDAwKTsKLQkJaWYgKGRzZF9jb25mICYmIChzbmRfc29jX3JlYWQoY29kZWMsIGRzZF9jbGtfcmVnKSAmIDB4MDEpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZHNkX211dGVfcmVnLCAweDA0LCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKLQkJaWYgKGRzZF9jb25mICYmIChzbmRfc29jX3JlYWQoY29kZWMsIGRzZF9jbGtfcmVnKSAmIDB4MDEpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZHNkX211dGVfcmVnLCAweDA0LCAweDA0KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qCi0JCSAqIDVtcyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBQQSBpcyBkaXNhYmxlZCBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQkJdGF2aWxfY29kZWNfb3ZlcnJpZGUoY29kZWMsIENMU19BQiwgZXZlbnQpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lYXJfZGFjX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBpbnQgZXZlbnQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJLyogRGlzYWJsZSBBdXRvQ2hvcCB0aW1lciBkdXJpbmcgcG93ZXIgdXAgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLAotCQkJCSAgICAweDAyLCAweDAwKTsKLQotCQlpZiAodGF2aWwtPmFuY19mdW5jKQotCQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOwotCi0JCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhdmlsLT5jbHNoX2QsCi0JCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCi0JCQkgICAgIFdDRF9DTFNIX1NUQVRFX0VBUiwKLQkJCSAgICAgQ0xTX0hfTk9STUFMKTsKLQkJaWYgKHRhdmlsLT5hbmNfZnVuYykKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCi0JCQkJCSAgICAweDEwLCAweDEwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhdmlsLT5jbHNoX2QsCi0JCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BPU1RfUEEsCi0JCQkgICAgIFdDRF9DTFNIX1NUQVRFX0VBUiwKLQkJCSAgICAgQ0xTX0hfTk9STUFMKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfaHBocl9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgaHBoX21vZGUgPSB0YXZpbC0+aHBoX21vZGU7Ci0JdTggZGVtX2lucDsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbC0+ZHNkX2NvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHduYW1lOiAlcyBldmVudDogJWQgaHBoX21vZGU6ICVkXG4iLCBfX2Z1bmNfXywKLQkJdy0+bmFtZSwgZXZlbnQsIGhwaF9tb2RlKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAodGF2aWwtPmFuY19mdW5jKSB7Ci0JCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYW5jKHcsIGtjb250cm9sLCBldmVudCk7Ci0JCQkvKiA0MCBtc2VjIGRlbGF5IGlzIG5lZWRlZCB0byBhdm9pZCBjbGljayBhbmQgcG9wICovCi0JCQltc2xlZXAoNDApOwotCQl9Ci0JCS8qIFJlYWQgREVNIElOUCBTZWxlY3QgKi8KLQkJZGVtX2lucCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMCkgJgotCQkJICAweDAzOwotCQlpZiAoKChocGhfbW9kZSA9PSBDTFNfSF9ISUZJKSB8fCAoaHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSB8fAotCQkgICAgIChocGhfbW9kZSA9PSBDTFNfSF9MUCkpICYmIChkZW1faW5wICE9IDB4MDEpKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogREVNIElucHV0IG5vdCBzZXQgY29ycmVjdGx5LCBocGhfbW9kZTogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBocGhfbW9kZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoKGhwaF9tb2RlICE9IENMU19IX0xQKSAmJiAoaHBoX21vZGUgIT0gQ0xTX0hfVUxQKSkKLQkJCS8qIFJpcHBsZSBmcmVxIGNvbnRyb2wgZW5hYmxlICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgIFdDRDkzNFhfU0lET19ORVdfVk9VVF9EX0ZSRVEyLAotCQkJCQkgICAgIDB4MDEsIDB4MDEpOwotCQkvKiBEaXNhYmxlIEF1dG9DaG9wIHRpbWVyIGR1cmluZyBwb3dlciB1cCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEsCi0JCQkJICAgIDB4MDIsIDB4MDApOwotCQkvKiBTZXQgUkRBQyBnYWluICovCi0JCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwKLQkJCQkJICAgIDB4RjAsIDB4NDApOwotCQlpZiAoZHNkX2NvbmYgJiYKLQkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX0RTRDFfUEFUSF9DVEwpICYgMHgwMSkpCi0JCQlocGhfbW9kZSA9IENMU19IX0hJRkk7Ci0KLQkJd2NkX2Nsc2hfZnNtKGNvZGVjLCAmdGF2aWwtPmNsc2hfZCwKLQkJCSAgICAgV0NEX0NMU0hfRVZFTlRfUFJFX0RBQywKLQkJCSAgICAgV0NEX0NMU0hfU1RBVEVfSFBIUiwKLQkJCSAgICAgaHBoX21vZGUpOwotCQlpZiAodGF2aWwtPmFuY19mdW5jKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCi0JCQkJCSAgICAweDEwLCAweDEwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDEwMDB1cyByZXF1aXJlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhSLAotCQkJICAgICBocGhfbW9kZSk7Ci0JCWlmICgoaHBoX21vZGUgIT0gQ0xTX0hfTFApICYmIChocGhfbW9kZSAhPSBDTFNfSF9VTFApKQotCQkJLyogUmlwcGxlIGZyZXEgY29udHJvbCBkaXNhYmxlICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIsCi0JCQkJCSAgICAweDAxLCAweDApOwotCQkvKiBSZS1zZXQgUkRBQyBnYWluICovCi0JCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwKLQkJCQkJICAgIDB4RjAsIDB4MCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19ocGhsX2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBocGhfbW9kZSA9IHRhdmlsLT5ocGhfbW9kZTsKLQl1OCBkZW1faW5wOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICpkc2RfY29uZiA9IHRhdmlsLT5kc2RfY29uZmlnOwotCXVpbnQzMl90IGltcGVkbCA9IDAsIGltcGVkciA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB3bmFtZTogJXMgZXZlbnQ6ICVkIGhwaF9tb2RlOiAlZFxuIiwgX19mdW5jX18sCi0JCXctPm5hbWUsIGV2ZW50LCBocGhfbW9kZSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhdmlsLT5hbmNfZnVuYykgewotCQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX2FuYyh3LCBrY29udHJvbCwgZXZlbnQpOwotCQkJLyogNDAgbXNlYyBkZWxheSBpcyBuZWVkZWQgdG8gYXZvaWQgY2xpY2sgYW5kIHBvcCAqLwotCQkJbXNsZWVwKDQwKTsKLQkJfQotCQkvKiBSZWFkIERFTSBJTlAgU2VsZWN0ICovCi0JCWRlbV9pbnAgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzApICYKLQkJCSAgMHgwMzsKLQkJaWYgKCgoaHBoX21vZGUgPT0gQ0xTX0hfSElGSSkgfHwgKGhwaF9tb2RlID09IENMU19IX0xPSElGSSkgfHwKLQkJICAgICAoaHBoX21vZGUgPT0gQ0xTX0hfTFApKSAmJiAoZGVtX2lucCAhPSAweDAxKSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IERFTSBJbnB1dCBub3Qgc2V0IGNvcnJlY3RseSwgaHBoX21vZGU6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgaHBoX21vZGUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKChocGhfbW9kZSAhPSBDTFNfSF9MUCkgJiYgKGhwaF9tb2RlICE9IENMU19IX1VMUCkpCi0JCQkvKiBSaXBwbGUgZnJlcSBjb250cm9sIGVuYWJsZSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgICBXQ0Q5MzRYX1NJRE9fTkVXX1ZPVVRfRF9GUkVRMiwKLQkJCQkJICAgICAweDAxLCAweDAxKTsKLQkJLyogRGlzYWJsZSBBdXRvQ2hvcCB0aW1lciBkdXJpbmcgcG93ZXIgdXAgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLAotCQkJCSAgICAweDAyLCAweDAwKTsKLQkJLyogU2V0IFJEQUMgZ2FpbiAqLwotCQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsCi0JCQkJCSAgICAweEYwLCAweDQwKTsKLQkJaWYgKGRzZF9jb25mICYmCi0JCSAgICAoc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5MzRYX0NEQ19EU0QwX1BBVEhfQ1RMKSAmIDB4MDEpKQotCQkJaHBoX21vZGUgPSBDTFNfSF9ISUZJOwotCi0JCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhdmlsLT5jbHNoX2QsCi0JCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMsCi0JCQkgICAgIFdDRF9DTFNIX1NUQVRFX0hQSEwsCi0JCQkgICAgIGhwaF9tb2RlKTsKLQotCQlpZiAodGF2aWwtPmFuY19mdW5jKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCi0JCQkJCSAgICAweDEwLCAweDEwKTsKLQotCQlyZXQgPSB0YXZpbF9tYmhjX2dldF9pbXBlZGFuY2UodGF2aWwtPm1iaGMsCi0JCQkJCSAgICAgICAmaW1wZWRsLCAmaW1wZWRyKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXdjZF9jbHNoX2ltcGVkX2NvbmZpZyhjb2RlYywgaW1wZWRsLCBmYWxzZSk7Ci0JCQlzZXRfYml0KENMU0hfWl9DT05GSUcsICZ0YXZpbC0+c3RhdHVzX21hc2spOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgbWJoYyBpbXBlZGFuY2UgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAwOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCS8qIDEwMDB1cyByZXF1aXJlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9IUEhMLAotCQkJICAgICBocGhfbW9kZSk7Ci0JCWlmICgoaHBoX21vZGUgIT0gQ0xTX0hfTFApICYmIChocGhfbW9kZSAhPSBDTFNfSF9VTFApKQotCQkJLyogUmlwcGxlIGZyZXEgY29udHJvbCBkaXNhYmxlICovCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9TSURPX05FV19WT1VUX0RfRlJFUTIsCi0JCQkJCSAgICAweDAxLCAweDApOwotCQkvKiBSZS1zZXQgUkRBQyBnYWluICovCi0JCWlmIChUQVZJTF9JU18xXzAodGF2aWwtPndjZDl4eHgpKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwKLQkJCQkJICAgIDB4RjAsIDB4MCk7Ci0KLQkJaWYgKHRlc3RfYml0KENMU0hfWl9DT05GSUcsICZ0YXZpbC0+c3RhdHVzX21hc2spKSB7Ci0JCQl3Y2RfY2xzaF9pbXBlZF9jb25maWcoY29kZWMsIGltcGVkbCwgdHJ1ZSk7Ci0JCQljbGVhcl9iaXQoQ0xTSF9aX0NPTkZJRywgJnRhdmlsLT5zdGF0dXNfbWFzayk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfbGluZW91dF9kYWNfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQl3Y2RfY2xzaF9mc20oY29kZWMsICZ0YXZpbC0+Y2xzaF9kLAotCQkJICAgICBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDLAotCQkJICAgICBXQ0RfQ0xTSF9TVEFURV9MTywKLQkJCSAgICAgQ0xTX0FCKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXdjZF9jbHNoX2ZzbShjb2RlYywgJnRhdmlsLT5jbHNoX2QsCi0JCQkgICAgIFdDRF9DTFNIX0VWRU5UX1BPU1RfUEEsCi0JCQkgICAgIFdDRF9DTFNIX1NUQVRFX0xPLAotCQkJICAgICBDTFNfQUIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19zcGtfYm9vc3RfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXUxNiBib29zdF9wYXRoX2N0bCwgYm9vc3RfcGF0aF9jZmcxOwotCXUxNiByZWcsIHJlZ19taXg7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKLQotCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ3IENIQUlOIikpIHsKLQkJYm9vc3RfcGF0aF9jdGwgPSBXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfUEFUSF9DVEw7Ci0JCWJvb3N0X3BhdGhfY2ZnMSA9IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzE7Ci0JCXJlZyA9IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NUTDsKLQkJcmVnX21peCA9IFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DVEw7Ci0JfSBlbHNlIGlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ4IENIQUlOIikpIHsKLQkJYm9vc3RfcGF0aF9jdGwgPSBXQ0Q5MzRYX0NEQ19CT09TVDFfQk9PU1RfUEFUSF9DVEw7Ci0JCWJvb3N0X3BhdGhfY2ZnMSA9IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzE7Ci0JCXJlZyA9IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NUTDsKLQkJcmVnX21peCA9IFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DVEw7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gd2lkZ2V0OiAlc1xuIiwKLQkJCV9fZnVuY19fLCB3LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY2ZnMSwgMHgwMSwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDEwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCAweDEwLCAweDAwKTsKLQkJaWYgKChzbmRfc29jX3JlYWQoY29kZWMsIHJlZ19taXgpKSAmIDB4MTApCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWdfbWl4LCAweDEwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGJvb3N0X3BhdGhfY3RsLCAweDEwLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYm9vc3RfcGF0aF9jZmcxLCAweDAxLCAweDAwKTsKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fdGF2aWxfY29kZWNfZW5hYmxlX3N3cihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0JaW50IGNoX2NudCA9IDA7Ci0KLQl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCWlmICgoKHN0cm5zdHIody0+bmFtZSwgIklOVDdfIiwgc2l6ZW9mKCJSWCBJTlQ3XyIpKSkgfHwKLQkJCShzdHJuc3RyKHctPm5hbWUsICJJTlQ3IE1JWDIiLAotCQkJCQkJc2l6ZW9mKCJSWCBJTlQ3IE1JWDIiKSkpKSkKLQkJCXRhdmlsLT5zd3IucnhfN19jb3VudCsrOwotCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDhfIiwgc2l6ZW9mKCJSWCBJTlQ4XyIpKSkgJiYKLQkJICAgICF0YXZpbC0+c3dyLnJ4XzhfY291bnQpCi0JCQl0YXZpbC0+c3dyLnJ4XzhfY291bnQrKzsKLQkJY2hfY250ID0gISEodGF2aWwtPnN3ci5yeF83X2NvdW50KSArIHRhdmlsLT5zd3IucnhfOF9jb3VudDsKLQotCQlzd3JtX3djZF9ub3RpZnkodGF2aWwtPnN3ci5jdHJsX2RhdGFbMF0uc3dyX3BkZXYsCi0JCQkJU1dSX0RFVklDRV9VUCwgTlVMTCk7Ci0JCXN3cm1fd2NkX25vdGlmeSh0YXZpbC0+c3dyLmN0cmxfZGF0YVswXS5zd3JfcGRldiwKLQkJCQlTV1JfU0VUX05VTV9SWF9DSCwgJmNoX2NudCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDdfIiwgc2l6ZW9mKCJSWCBJTlQ3XyIpKSkgIHx8Ci0JCQkoc3RybnN0cih3LT5uYW1lLCAiSU5UNyBNSVgyIiwKLQkJCXNpemVvZigiUlggSU5UNyBNSVgyIikpKSkKLQkJCXRhdmlsLT5zd3IucnhfN19jb3VudC0tOwotCQlpZiAoKHN0cm5zdHIody0+bmFtZSwgIklOVDhfIiwgc2l6ZW9mKCJSWCBJTlQ4XyIpKSkgJiYKLQkJICAgIHRhdmlsLT5zd3IucnhfOF9jb3VudCkKLQkJCXRhdmlsLT5zd3IucnhfOF9jb3VudC0tOwotCQljaF9jbnQgPSAhISh0YXZpbC0+c3dyLnJ4XzdfY291bnQpICsgdGF2aWwtPnN3ci5yeF84X2NvdW50OwotCi0JCXN3cm1fd2NkX25vdGlmeSh0YXZpbC0+c3dyLmN0cmxfZGF0YVswXS5zd3JfcGRldiwKLQkJCQlTV1JfU0VUX05VTV9SWF9DSCwgJmNoX2NudCk7Ci0KLQkJYnJlYWs7Ci0JfQotCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiAlczogY3VycmVudCBzd3IgY2ggY250OiAlZFxuIiwKLQkJX19mdW5jX18sIHctPm5hbWUsIGNoX2NudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfc3dyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlyZXR1cm4gX190YXZpbF9jb2RlY19lbmFibGVfc3dyKHcsIGV2ZW50KTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19jb25maWdfbWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaWR4OwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqaHdkZXBfY2FsID0gTlVMTDsKLQlzdHJ1Y3Qgd2NkX21hZF9hdWRpb19jYWwgKm1hZF9jYWwgPSBOVUxMOwotCWNvbnN0IHZvaWQgKmRhdGE7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWUgPSBXQ0Q5MzRYX01BRF9BVURJT19GSVJNV0FSRV9QQVRIOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXNpemVfdCBjYWxfc2l6ZTsKLQotCWh3ZGVwX2NhbCA9IHdjZGNhbF9nZXRfZndfY2FsKHRhdmlsLT5md19kYXRhLCBXQ0Q5WFhYX01BRF9DQUwpOwotCWlmIChod2RlcF9jYWwpIHsKLQkJZGF0YSA9IGh3ZGVwX2NhbC0+ZGF0YTsKLQkJY2FsX3NpemUgPSBod2RlcF9jYWwtPnNpemU7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1c2luZyBod2RlcCBjYWxpYnJhdGlvblxuIiwKLQkJCV9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsIGNvZGVjLT5kZXYpOwotCQlpZiAocmV0IHx8ICFmdykgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogTUFEIGZpcm13YXJlIGFjcXVpcmUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWRhdGEgPSBmdy0+ZGF0YTsKLQkJY2FsX3NpemUgPSBmdy0+c2l6ZTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVzaW5nIHJlcXVlc3RfZmlybXdhcmUgY2FsaWJyYXRpb25cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKGNhbF9zaXplIDwgc2l6ZW9mKCptYWRfY2FsKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEluY29ycmVjdCBzaXplICV6ZCBmb3IgTUFEIENhbCwgZXhwZWN0ZWQgJXpkXG4iLAotCQkJX19mdW5jX18sIGNhbF9zaXplLCBzaXplb2YoKm1hZF9jYWwpKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCW1hZF9jYWwgPSAoc3RydWN0IHdjZF9tYWRfYXVkaW9fY2FsICopIChkYXRhKTsKLQlpZiAoIW1hZF9jYWwpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGNhbGlicmF0aW9uIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfTUFJTl9DVExfMiwKLQkJICAgICAgbWFkX2NhbC0+bWljcm9waG9uZV9pbmZvLmN5Y2xlX3RpbWUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9NQUlOX0NUTF8xLCAweEZGIDw8IDMsCi0JCQkgICAgKCh1aW50MTZfdCltYWRfY2FsLT5taWNyb3Bob25lX2luZm8uc2V0dGxlX3RpbWUpCi0JCQkgICAgPDwgMyk7Ci0KLQkvKiBBdWRpbyAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfOCwKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfb21pdF9zYW1wbGVzKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzEsCi0JCQkgICAgMHgwNyA8PCA0LCBtYWRfY2FsLT5hdWRpb19pbmZvLnJtc19jb21wX3RpbWUgPDwgNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0NUTF8yLCAweDAzIDw8IDIsCi0JCQkgICAgbWFkX2NhbC0+YXVkaW9faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNywKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfZGlmZl90aHJlc2hvbGQgJiAweDNGKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzUsCi0JCSAgICAgIG1hZF9jYWwtPmF1ZGlvX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfNiwKLQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5ybXNfdGhyZXNob2xkX21zYik7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUobWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzKTsKLQkgICAgIGlkeCsrKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19JSVJfQ1RMX1BUUiwKLQkJCQkgICAgMHgzRiwgaWR4KTsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0FVRElPX0lJUl9DVExfVkFMLAotCQkJICAgICAgbWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczpNQUQgQXVkaW8gSUlSIENvZWZbJWRdID0gMFgleCIsCi0JCQlfX2Z1bmNfXywgaWR4LAotCQkJbWFkX2NhbC0+YXVkaW9faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCX0KLQotCS8qIEJlYWNvbiAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzgsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc19vbWl0X3NhbXBsZXMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzEsCi0JCQkgICAgMHgwNyA8PCA0LCBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfY29tcF90aW1lIDw8IDQpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzIsIDB4MDMgPDwgMiwKLQkJCSAgICBtYWRfY2FsLT5iZWFjb25faW5mby5kZXRlY3Rpb25fbWVjaGFuaXNtIDw8IDIpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzcsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc19kaWZmX3RocmVzaG9sZCAmIDB4MUYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9CRUFDT05fQ1RMXzUsCi0JCSAgICAgIG1hZF9jYWwtPmJlYWNvbl9pbmZvLnJtc190aHJlc2hvbGRfbHNiKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0NUTF82LAotCQkgICAgICBtYWRfY2FsLT5iZWFjb25faW5mby5ybXNfdGhyZXNob2xkX21zYik7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUobWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50cyk7Ci0JICAgICBpZHgrKykgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0lJUl9DVExfUFRSLAotCQkJCSAgICAweDNGLCBpZHgpOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQkVBQ09OX0lJUl9DVExfVkFMLAotCQkJICAgICAgbWFkX2NhbC0+YmVhY29uX2luZm8uaWlyX2NvZWZmaWNpZW50c1tpZHhdKTsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6TUFEIEJlYWNvbiBJSVIgQ29lZlslZF0gPSAwWCV4IiwKLQkJCV9fZnVuY19fLCBpZHgsCi0JCQltYWRfY2FsLT5iZWFjb25faW5mby5paXJfY29lZmZpY2llbnRzW2lkeF0pOwotCX0KLQotCS8qIFVsdHJhc291bmQgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfMSwKLQkJCSAgICAweDA3IDw8IDQsCi0JCQkgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc19jb21wX3RpbWUgPDwgNCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9TT0NfTUFEX1VMVFJfQ1RMXzIsIDB4MDMgPDwgMiwKLQkJCSAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8uZGV0ZWN0aW9uX21lY2hhbmlzbSA8PCAyKTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfVUxUUl9DVExfNywKLQkJICAgICAgbWFkX2NhbC0+dWx0cmFzb3VuZF9pbmZvLnJtc19kaWZmX3RocmVzaG9sZCAmIDB4MUYpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF81LAotCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX3RocmVzaG9sZF9sc2IpOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdDRDkzNFhfU09DX01BRF9VTFRSX0NUTF82LAotCQkgICAgICBtYWRfY2FsLT51bHRyYXNvdW5kX2luZm8ucm1zX3RocmVzaG9sZF9tc2IpOwotCi1kb25lOgotCWlmICghaHdkZXBfY2FsKQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9jb2RlY19lbmFibGVfbWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJjID0gMDsKLQotCS8qIFJldHVybiBpZiBDUEUgSU5QVVQgaXMgREVDMSAqLwotCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcpICYgMHgwNCkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTUFEIGlzIGJ5cGFzc2VkLCBza2lwIG1hZCAlc1xuIiwKLQkJCV9fZnVuY19fLCBlbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlID0gJXNcbiIsIF9fZnVuY19fLAotCQllbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMiwKLQkJCQkgICAgMHgwMywgMHgwMyk7Ci0JCXJjID0gdGF2aWxfY29kZWNfY29uZmlnX21hZChjb2RlYyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9BVURJT19DVExfMiwKLQkJCQkJICAgIDB4MDMsIDB4MDApOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJLyogVHVybiBvbiBNQUQgY2xrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCi0JCS8qIFVuZG8gcmVzZXQgZm9yIE1BRCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19NQURfQ1RMLAotCQkJCSAgICAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAotCQkJCQkweDA0LCAweDA0KTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX1NPQ19NQURfQVVESU9fQ1RMXzIsCi0JCQkJICAgIDB4MDMsIDB4MDApOwotCQkvKiBSZXNldCB0aGUgTUFEIGJsb2NrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDIsIDB4MDIpOwotCQkvKiBUdXJuIG9mZiBNQUQgY2xrICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX01BRF9DVEwsCi0JCQkJICAgIDB4MDEsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCi0JCQkJCTB4MDQsIDB4MDApOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2FwZV9lbmFibGVfbWFkKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAweDQwLCAweDQwKTsKLQkJcmMgPSBfX3RhdmlsX2NvZGVjX2VuYWJsZV9tYWQoY29kZWMsIHRydWUpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAweDQwLCAweDAwKTsKLQkJX190YXZpbF9jb2RlY19lbmFibGVfbWFkKGNvZGVjLCBmYWxzZSk7Ci0JCWJyZWFrOwotCX0KLQotCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19jcGVfbWFkX2N0bChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXRhdmlsLT5tYWRfc3dpdGNoX2NudCsrOwotCQlpZiAodGF2aWwtPm1hZF9zd2l0Y2hfY250ICE9IDEpCi0JCQlnb3RvIGRvbmU7Ci0KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfU1ZBX0NGRywgMHgyMCwgMHgyMCk7Ci0JCXJjID0gX190YXZpbF9jb2RlY19lbmFibGVfbWFkKGNvZGVjLCB0cnVlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJdGF2aWwtPm1hZF9zd2l0Y2hfY250LS07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQl0YXZpbC0+bWFkX3N3aXRjaF9jbnQtLTsKLQkJaWYgKHRhdmlsLT5tYWRfc3dpdGNoX2NudCAhPSAwKQotCQkJZ290byBkb25lOwotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX1NWQV9DRkcsIDB4MjAsIDB4MDApOwotCQlfX3RhdmlsX2NvZGVjX2VuYWJsZV9tYWQoY29kZWMsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JfQotZG9uZToKLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogZXZlbnQgPSAlZCwgbWFkX3N3aXRjaF9jbnQgPSAlZFxuIiwKLQkJX19mdW5jX18sIGV2ZW50LCB0YXZpbC0+bWFkX3N3aXRjaF9jbnQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB0YXZpbF9nZXRfYXNyY19tb2RlKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwgaW50IGFzcmMsCi0JCQkgICAgICAgdTggbWFpbl9zciwgdTggbWl4X3NyKQotewotCXU4IGFzcmNfb3V0cHV0X21vZGU7Ci0JaW50IGFzcmNfbW9kZSA9IENPTlZfODhQMktfVE9fMzg0SzsKLQotCWlmICgoYXNyYyA8IDApIHx8IChhc3JjID49IEFTUkNfTUFYKSkKLQkJcmV0dXJuIDA7Ci0KLQlhc3JjX291dHB1dF9tb2RlID0gdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbYXNyY107Ci0KLQlpZiAoYXNyY19vdXRwdXRfbW9kZSkgewotCQkvKgotCQkgKiBJZiBNaXggc2FtcGxlIHJhdGUgaXMgPCA5NktIeiwgdXNlIDk2SyB0byAzNTIuOEsKLQkJICogY29udmVyc2lvbiwgb3IgZWxzZSB1c2UgMzg0SyB0byAzNTIuOEsgY29udmVyc2lvbgotCQkgKi8KLQkJaWYgKG1peF9zciA8IDUpCi0JCQlhc3JjX21vZGUgPSBDT05WXzk2S19UT18zNTJQOEs7Ci0JCWVsc2UKLQkJCWFzcmNfbW9kZSA9IENPTlZfMzg0S19UT18zNTJQOEs7Ci0JfSBlbHNlIHsKLQkJLyogSW50ZWdlciBtYWluIGFuZCBGcmFjdGlvbmFsIG1peCBwYXRoICovCi0JCWlmIChtYWluX3NyIDwgOCAmJiBtaXhfc3IgPiA5KSB7Ci0JCQlhc3JjX21vZGUgPSBDT05WXzM1MlA4S19UT18zODRLOwotCQl9IGVsc2UgaWYgKG1haW5fc3IgPiA4ICYmIG1peF9zciA8IDgpIHsKLQkJCS8qIEZyYWN0aW9uYWwgbWFpbiBhbmQgSW50ZWdlciBtaXggcGF0aCAqLwotCQkJaWYgKG1peF9zciA8IDUpCi0JCQkJYXNyY19tb2RlID0gQ09OVl85NktfVE9fMzUyUDhLOwotCQkJZWxzZQotCQkJCWFzcmNfbW9kZSA9IENPTlZfMzg0S19UT18zNTJQOEs7Ci0JCX0gZWxzZSBpZiAobWFpbl9zciA8IDggJiYgbWl4X3NyIDwgOCkgewotCQkJLyogSW50ZWdlciBtYWluIGFuZCBJbnRlZ2VyIG1peCBwYXRoICovCi0JCQlhc3JjX21vZGUgPSBDT05WXzk2S19UT18zODRLOwotCQl9Ci0JfQotCi0JcmV0dXJuIGFzcmNfbW9kZTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY193ZG1hM19jdGwoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJLyogRml4IHRvIDE2S0h6ICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzMsCi0JCQkJICAgIDB4RjAsIDB4MTApOwotCQkvKiBTZWxlY3QgbWNsa18xICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzMsCi0JCQkJICAgIDB4MDIsIDB4MDApOwotCQkvKiBFbmFibGUgRE1BICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfRE1BX1dETUFfQ1RMXzMsCi0JCQkJICAgIDB4MDEsIDB4MDEpOwotCQlicmVhazsKLQotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKiBEaXNhYmxlIERNQSAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0RNQV9XRE1BX0NUTF8zLAotCQkJCSAgICAweDAxLCAweDAwKTsKLQkJYnJlYWs7Ci0KLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2FzcmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGludCBhc3JjX2luLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTE2IGNmZ19yZWcsIGN0bF9yZWcsIGNsa19yZWcsIGFzcmNfY3RsLCBtaXhfY3RsX3JlZzsKLQlpbnQgYXNyYywgcmV0ID0gMDsKLQl1OCBtYWluX3NyLCBtaXhfc3IsIGFzcmNfbW9kZSA9IDA7Ci0KLQlzd2l0Y2ggKGFzcmNfaW4pIHsKLQljYXNlIEFTUkNfSU5fSFBITDoKLQkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzA7Ci0JCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEw7Ci0JCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DTEtfUlNUX0NUTDsKLQkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDMF9DVEwxOwotCQlhc3JjID0gQVNSQzA7Ci0JCWJyZWFrOwotCWNhc2UgQVNSQ19JTl9MTzE6Ci0JCWNmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19SWDNfUlhfUEFUSF9DRkcwOwotCQljdGxfcmVnID0gV0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfQ1RMOwotCQljbGtfcmVnID0gV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ0xLX1JTVF9DVEw7Ci0JCWFzcmNfY3RsID0gV0NEOTM0WF9NSVhJTkdfQVNSQzBfQ1RMMTsKLQkJYXNyYyA9IEFTUkMwOwotCQlicmVhazsKLQljYXNlIEFTUkNfSU5fSFBIUjoKLQkJY2ZnX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzA7Ci0JCWN0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEw7Ci0JCWNsa19yZWcgPSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DTEtfUlNUX0NUTDsKLQkJYXNyY19jdGwgPSBXQ0Q5MzRYX01JWElOR19BU1JDMV9DVEwxOwotCQlhc3JjID0gQVNSQzE7Ci0JCWJyZWFrOwotCWNhc2UgQVNSQ19JTl9MTzI6Ci0JCWNmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19SWDRfUlhfUEFUSF9DRkcwOwotCQljdGxfcmVnID0gV0NEOTM0WF9DRENfUlg0X1JYX1BBVEhfQ1RMOwotCQljbGtfcmVnID0gV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ0xLX1JTVF9DVEw7Ci0JCWFzcmNfY3RsID0gV0NEOTM0WF9NSVhJTkdfQVNSQzFfQ1RMMTsKLQkJYXNyYyA9IEFTUkMxOwotCQlicmVhazsKLQljYXNlIEFTUkNfSU5fU1BLUjE6Ci0JCWNmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9DRkcwOwotCQljdGxfcmVnID0gV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfQ1RMOwotCQljbGtfcmVnID0gV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ0xLX1JTVF9DVEw7Ci0JCWFzcmNfY3RsID0gV0NEOTM0WF9NSVhJTkdfQVNSQzJfQ1RMMTsKLQkJYXNyYyA9IEFTUkMyOwotCQlicmVhazsKLQljYXNlIEFTUkNfSU5fU1BLUjI6Ci0JCWNmZ19yZWcgPSBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcwOwotCQljdGxfcmVnID0gV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfQ1RMOwotCQljbGtfcmVnID0gV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ0xLX1JTVF9DVEw7Ci0JCWFzcmNfY3RsID0gV0NEOTM0WF9NSVhJTkdfQVNSQzNfQ1RMMTsKLQkJYXNyYyA9IEFTUkMzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBhc3JjIGlucHV0IDolZFxuIiwgX19mdW5jX18sCi0JCQlhc3JjX2luKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX07Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKHRhdmlsLT5hc3JjX3VzZXJzW2FzcmNdID09IDApIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNmZ19yZWcsIDB4ODAsIDB4ODApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2xrX3JlZywgMHgwMSwgMHgwMSk7Ci0JCQltYWluX3NyID0gc25kX3NvY19yZWFkKGNvZGVjLCBjdGxfcmVnKSAmIDB4MEY7Ci0JCQltaXhfY3RsX3JlZyA9IGN0bF9yZWcgKyA1OwotCQkJbWl4X3NyID0gc25kX3NvY19yZWFkKGNvZGVjLCBtaXhfY3RsX3JlZykgJiAweDBGOwotCQkJYXNyY19tb2RlID0gdGF2aWxfZ2V0X2FzcmNfbW9kZSh0YXZpbCwgYXNyYywKLQkJCQkJCQltYWluX3NyLCBtaXhfc3IpOwotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1haW5fc3I6JWQgbWl4X3NyOiVkIGFzcmNfbW9kZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgbWFpbl9zciwgbWl4X3NyLCBhc3JjX21vZGUpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYXNyY19jdGwsIDB4MDcsIGFzcmNfbW9kZSk7Ci0JCX0KLQkJdGF2aWwtPmFzcmNfdXNlcnNbYXNyY10rKzsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXRhdmlsLT5hc3JjX3VzZXJzW2FzcmNdLS07Ci0JCWlmICh0YXZpbC0+YXNyY191c2Vyc1thc3JjXSA8PSAwKSB7Ci0JCQl0YXZpbC0+YXNyY191c2Vyc1thc3JjXSA9IDA7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBhc3JjX2N0bCwgMHgwNywgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjZmdfcmVnLCAweDgwLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNsa19yZWcsIDB4MDEsIDB4MDApOwotCQl9Ci0JCWJyZWFrOwotCX07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQVNSQyVkLCB1c2VyczogJWRcbiIsCi0JCV9fZnVuY19fLCBhc3JjLCB0YXZpbC0+YXNyY191c2Vyc1thc3JjXSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfYXNyY19yZXNhbXBsZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlpbnQgcmV0ID0gMDsKLQl1OCBjZmcsIGFzcmNfaW47Ci0KLQljZmcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCk7Ci0JaWYgKCEoY2ZnICYgMHhGRikpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEFTUkMldSBpbnB1dCBub3Qgc2VsZWN0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgdy0+c2hpZnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKHctPnNoaWZ0KSB7Ci0JY2FzZSBBU1JDMDoKLQkJYXNyY19pbiA9ICgoY2ZnICYgMHgwMykgPT0gMSkgPyBBU1JDX0lOX0hQSEwgOiBBU1JDX0lOX0xPMTsKLQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX2FzcmMoY29kZWMsIGFzcmNfaW4sIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBBU1JDMToKLQkJYXNyY19pbiA9ICgoY2ZnICYgMHgwQykgPT0gNCkgPyBBU1JDX0lOX0hQSFIgOiBBU1JDX0lOX0xPMjsKLQkJcmV0ID0gdGF2aWxfY29kZWNfZW5hYmxlX2FzcmMoY29kZWMsIGFzcmNfaW4sIGV2ZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBBU1JDMjoKLQkJYXNyY19pbiA9ICgoY2ZnICYgMHgzMCkgPT0gMHgyMCkgPyBBU1JDX0lOX1NQS1IxIDogQVNSQ19JTlZBTElEOwotCQlyZXQgPSB0YXZpbF9jb2RlY19lbmFibGVfYXNyYyhjb2RlYywgYXNyY19pbiwgZXZlbnQpOwotCQlicmVhazsKLQljYXNlIEFTUkMzOgotCQlhc3JjX2luID0gKChjZmcgJiAweEMwKSA9PSAweDgwKSA/IEFTUkNfSU5fU1BLUjIgOiBBU1JDX0lOVkFMSUQ7Ci0JCXJldCA9IHRhdmlsX2NvZGVjX2VuYWJsZV9hc3JjKGNvZGVjLCBhc3JjX2luLCBldmVudCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIGFzcmM6JXVcbiIsIF9fZnVuY19fLAotCQkJdy0+c2hpZnQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9lbmFibGVfbmF0aXZlX3N1cHBseShzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlpZiAoKyt0YXZpbC0+bmF0aXZlX2Nsa191c2VycyA9PSAxKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfUExMX0VOQUJMRVMsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXVzbGVlcF9yYW5nZSgxMDAsIDEyMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfTUNMSzJfUFJHMSwKLQkJCQkJICAgIDB4MDYsIDB4MDIpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLAotCQkJCQkgICAgMHgwNCwgMHgwMCk7Ci0JCQl1c2xlZXBfcmFuZ2UoMzAsIDUwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wsCi0JCQkJCTB4MDIsIDB4MDIpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAotCQkJCQkweDEwLCAweDEwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlpZiAodGF2aWwtPm5hdGl2ZV9jbGtfdXNlcnMgJiYKLQkJICAgICgtLXRhdmlsLT5uYXRpdmVfY2xrX3VzZXJzID09IDApKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5MzRYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wsCi0JCQkJCTB4MTAsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKLQkJCQkJMHgwMiwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfR0FURSwKLQkJCQkJICAgIDB4MDQsIDB4MDQpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0xLX1NZU19NQ0xLMl9QUkcxLAotCQkJCQkgICAgMHgwNiwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NMS19TWVNfUExMX0VOQUJMRVMsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbmF0aXZlX2Nsa191c2VyczogJWQsIGV2ZW50OiAlZFxuIiwKLQkJX19mdW5jX18sIHRhdmlsLT5uYXRpdmVfY2xrX3VzZXJzLCBldmVudCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfaHBoZGVsYXlfbHV0YnlwYXNzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgdTE2IGludGVycF9pZHgsIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1OCBocGhfZGx5X21hc2s7Ci0JdTE2IGhwaF9sdXRfYnlwYXNzX3JlZyA9IDA7Ci0JdTE2IGhwaF9jb21wX2N0cmw3ID0gMDsKLQotCi0Jc3dpdGNoIChpbnRlcnBfaWR4KSB7Ci0JY2FzZSBJTlRFUlBfSFBITDoKLQkJaHBoX2RseV9tYXNrID0gMTsKLQkJaHBoX2x1dF9ieXBhc3NfcmVnID0gV0NEOTM0WF9DRENfVE9QX0hQSExfQ09NUF9MVVQ7Ci0JCWhwaF9jb21wX2N0cmw3ID0gV0NEOTM0WF9DRENfQ09NUEFOREVSMV9DVEw3OwotCQlicmVhazsKLQljYXNlIElOVEVSUF9IUEhSOgotCQlocGhfZGx5X21hc2sgPSAyOwotCQlocGhfbHV0X2J5cGFzc19yZWcgPSBXQ0Q5MzRYX0NEQ19UT1BfSFBIUl9DT01QX0xVVDsKLQkJaHBoX2NvbXBfY3RybDcgPSBXQ0Q5MzRYX0NEQ19DT01QQU5ERVIyX0NUTDc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChocGhfbHV0X2J5cGFzc19yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19DTFNIX1RFU1QwLAotCQkJCSAgICBocGhfZGx5X21hc2ssIDB4MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwaF9sdXRfYnlwYXNzX3JlZywgMHg4MCwgMHg4MCk7Ci0JCWlmICh0YXZpbC0+aHBoX21vZGUgPT0gQ0xTX0hfVUxQKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBoX2NvbXBfY3RybDcsIDB4MjAsIDB4MjApOwotCX0KLQotCWlmIChocGhfbHV0X2J5cGFzc19yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09GRihldmVudCkpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQ0xTSF9URVNUMCwKLQkJCQkgICAgaHBoX2RseV9tYXNrLCBocGhfZGx5X21hc2spOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGhfbHV0X2J5cGFzc19yZWcsIDB4ODAsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGhfY29tcF9jdHJsNywgMHgyMCwgMHgwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX2NvZGVjX2hkMl9jb250cm9sKHN0cnVjdCB0YXZpbF9wcml2ICpwcml2LAotCQkJCSAgICB1MTYgaW50ZXJwX2lkeCwgaW50IGV2ZW50KQotewotCXUxNiBoZDJfc2NhbGVfcmVnOwotCXUxNiBoZDJfZW5hYmxlX3JlZyA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcHJpdi0+Y29kZWM7Ci0KLQlpZiAoVEFWSUxfSVNfMV8xKHByaXYtPndjZDl4eHgpKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGludGVycF9pZHgpIHsKLQljYXNlIElOVEVSUF9IUEhMOgotCQloZDJfc2NhbGVfcmVnID0gV0NEOTM0WF9DRENfUlgxX1JYX1BBVEhfU0VDMzsKLQkJaGQyX2VuYWJsZV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwOwotCQlicmVhazsKLQljYXNlIElOVEVSUF9IUEhSOgotCQloZDJfc2NhbGVfcmVnID0gV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfU0VDMzsKLQkJaGQyX2VuYWJsZV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoaGQyX2VuYWJsZV9yZWcgJiYgU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfc2NhbGVfcmVnLCAweDNDLCAweDE0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaGQyX2VuYWJsZV9yZWcsIDB4MDQsIDB4MDQpOwotCX0KLQotCWlmIChoZDJfZW5hYmxlX3JlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBoZDJfZW5hYmxlX3JlZywgMHgwNCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhkMl9zY2FsZV9yZWcsIDB4M0MsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2FpbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICBpbnQgZXZlbnQsIGludCBnYWluX3JlZykKLXsKLQlpbnQgY29tcF9nYWluX29mZnNldCwgdmFsOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0Jc3dpdGNoICh0YXZpbC0+c3dyLnNwa3JfbW9kZSkgewotCS8qIENvbXBhbmRlciBnYWluIGluIFNQS1JfTU9ERTEgY2FzZSBpcyAxMiBkQiAqLwotCWNhc2UgV0NEOTM0WF9TUEtSX01PREVfMToKLQkJY29tcF9nYWluX29mZnNldCA9IC0xMjsKLQkJYnJlYWs7Ci0JLyogRGVmYXVsdCBjYXNlIGNvbXBhbmRlciBnYWluIGlzIDE1IGRCICovCi0JZGVmYXVsdDoKLQkJY29tcF9nYWluX29mZnNldCA9IC0xNTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBBcHBseSBlYXIgc3BrciBnYWluIG9ubHkgaWYgY29tcGFuZGVyIGlzIGVuYWJsZWQgKi8KLQkJaWYgKHRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9DVEwgfHwKLQkJICAgICBnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX01JWF9DVEwpICYmCi0JCSAgICAodGF2aWwtPmVhcl9zcGtyX2dhaW4gIT0gMCkpIHsKLQkJCS8qIEZvciBleGFtcGxlLCB2YWwgaXMgLTgoLTEyKzUtMSkgZm9yIDRkQiBvZiBnYWluICovCi0JCQl2YWwgPSBjb21wX2dhaW5fb2Zmc2V0ICsgdGF2aWwtPmVhcl9zcGtyX2dhaW4gLSAxOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7Ci0KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWDcgVm9sdW1lICVkIGRCXG4iLAotCQkJCV9fZnVuY19fLCB2YWwpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQkvKgotCQkgKiBSZXNldCBSWDcgdm9sdW1lIHRvIDAgZEIgaWYgY29tcGFuZGVyIGlzIGVuYWJsZWQgYW5kCi0JCSAqIGVhcl9zcGtyX2dhaW4gaXMgbm9uLXplcm8uCi0JCSAqLwotCQlpZiAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gJiYKLQkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCB8fAotCQkgICAgIGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCkgJiYKLQkJICAgICh0YXZpbC0+ZWFyX3Nwa3JfZ2FpbiAhPSAwKSkgewotCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIDB4MCk7Ci0KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSZXNldCBSWDcgVm9sdW1lIHRvIDAgZEJcbiIsCi0JCQkJX19mdW5jX18pOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvbmZpZ19jb21wYW5kZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgaW50ZXJwX24sCi0JCQkJICBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGNvbXA7Ci0JdTE2IGNvbXBfY3RsMF9yZWcsIHJ4X3BhdGhfY2ZnMF9yZWc7Ci0KLQkvKiBFQVIgZG9lcyBub3QgaGF2ZSBjb21wYW5kZXIgKi8KLQlpZiAoIWludGVycF9uKQotCQlyZXR1cm4gMDsKLQotCWNvbXAgPSBpbnRlcnBfbiAtIDE7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ICVkIGNvbXBhbmRlciAlZCwgZW5hYmxlZCAlZFxuIiwKLQkJX19mdW5jX18sIGV2ZW50LCBjb21wICsgMSwgdGF2aWwtPmNvbXBfZW5hYmxlZFtjb21wXSk7Ci0KLQlpZiAoIXRhdmlsLT5jb21wX2VuYWJsZWRbY29tcF0pCi0JCXJldHVybiAwOwotCi0JY29tcF9jdGwwX3JlZyA9IFdDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMMCArIChjb21wICogOCk7Ci0JcnhfcGF0aF9jZmcwX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzAgKyAoY29tcCAqIDIwKTsKLQotCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7Ci0JCS8qIEVuYWJsZSBDb21wYW5kZXIgQ2xvY2sgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMSwgMHgwMSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAyLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcnhfcGF0aF9jZmcwX3JlZywgMHgwMiwgMHgwMik7Ci0JfQotCi0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJ4X3BhdGhfY2ZnMF9yZWcsIDB4MDIsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDA0LCAweDA0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwMiwgMHgwMik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGNvbXBfY3RsMF9yZWcsIDB4MDIsIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBjb21wX2N0bDBfcmVnLCAweDAxLCAweDAwKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY29tcF9jdGwwX3JlZywgMHgwNCwgMHgwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX2NvZGVjX2lkbGVfZGV0ZWN0X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgaW50IGludGVycCwgaW50IGV2ZW50KQotewotCWludCByZWcgPSAwLCBtYXNrLCB2YWw7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAoIXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfZGV0ZWN0X2VuKQotCQlyZXR1cm47Ci0KLQlpZiAoaW50ZXJwID09IElOVEVSUF9IUEhMKSB7Ci0JCXJlZyA9IFdDRDkzNFhfQ0RDX1JYX0lETEVfREVUX1BBVEhfQ1RMOwotCQltYXNrID0gMHgwMTsKLQkJdmFsID0gMHgwMTsKLQl9Ci0JaWYgKGludGVycCA9PSBJTlRFUlBfSFBIUikgewotCQlyZWcgPSBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9QQVRIX0NUTDsKLQkJbWFzayA9IDB4MDI7Ci0JCXZhbCA9IDB4MDI7Ci0JfQotCi0JaWYgKHJlZyAmJiBTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCByZWcsIG1hc2ssIHZhbCk7Ci0KLQlpZiAocmVnICYmIFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgbWFzaywgMHgwMCk7Ci0JCXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyID0gMDsKLQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOTM0WF9DRENfUlhfSURMRV9ERVRfQ0ZHMywgMHgwKTsKLQl9Ci19Ci0KLS8qKgotICogdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsgLSBFbmFibGUgbWFpbiBwYXRoIEludGVycG9sYXRvcgotICogY2xvY2suCi0gKgotICogQGNvZGVjOiAgICBDb2RlYyBpbnN0YW5jZQotICogQGV2ZW50OiAgICBJbmRpY2F0ZXMgc3BlYWtlciBwYXRoIGdhaW4gb2Zmc2V0IHZhbHVlCi0gKiBAaW50cF9pZHg6IEludGVycG9sYXRvciBpbmRleAotICogUmV0dXJucyBudW1iZXIgb2YgbWFpbiBjbG9jayB1c2VycwotICovCi1pbnQgdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgaW50IGV2ZW50LCBpbnQgaW50ZXJwX2lkeCkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0JdTE2IG1haW5fcmVnOwotCi0JaWYgKCFjb2RlYykgewotCQlwcl9lcnIoIiVzOiBjb2RlYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRhdmlsICA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCW1haW5fcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfQ1RMICsgKGludGVycF9pZHggKiAyMCk7Ci0KLQlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQlpZiAodGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdID09IDApIHsKLQkJCS8qIE1haW4gcGF0aCBQR0EgbXV0ZSBlbmFibGUgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1haW5fcmVnLCAweDEwLCAweDEwKTsKLQkJCS8qIENsayBlbmFibGUgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1haW5fcmVnLCAweDIwLCAweDIwKTsKLQkJCXRhdmlsX2NvZGVjX2lkbGVfZGV0ZWN0X2NvbnRyb2woY29kZWMsIGludGVycF9pZHgsCi0JCQkJCQkJZXZlbnQpOwotCQkJdGF2aWxfY29kZWNfaGQyX2NvbnRyb2wodGF2aWwsIGludGVycF9pZHgsIGV2ZW50KTsKLQkJCXRhdmlsX2NvZGVjX2hwaGRlbGF5X2x1dGJ5cGFzcyhjb2RlYywgaW50ZXJwX2lkeCwKLQkJCQkJCSAgICAgICBldmVudCk7Ci0JCQl0YXZpbF9jb25maWdfY29tcGFuZGVyKGNvZGVjLCBpbnRlcnBfaWR4LCBldmVudCk7Ci0JCX0KLQkJdGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdKys7Ci0JfQotCi0JaWYgKFNORF9TT0NfREFQTV9FVkVOVF9PRkYoZXZlbnQpKSB7Ci0JCXRhdmlsLT5tYWluX2Nsa191c2Vyc1tpbnRlcnBfaWR4XS0tOwotCQlpZiAodGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdIDw9IDApIHsKLQkJCXRhdmlsLT5tYWluX2Nsa191c2Vyc1tpbnRlcnBfaWR4XSA9IDA7Ci0JCQl0YXZpbF9jb25maWdfY29tcGFuZGVyKGNvZGVjLCBpbnRlcnBfaWR4LCBldmVudCk7Ci0JCQl0YXZpbF9jb2RlY19ocGhkZWxheV9sdXRieXBhc3MoY29kZWMsIGludGVycF9pZHgsCi0JCQkJCQkgICAgICAgZXZlbnQpOwotCQkJdGF2aWxfY29kZWNfaGQyX2NvbnRyb2wodGF2aWwsIGludGVycF9pZHgsIGV2ZW50KTsKLQkJCXRhdmlsX2NvZGVjX2lkbGVfZGV0ZWN0X2NvbnRyb2woY29kZWMsIGludGVycF9pZHgsCi0JCQkJCQkJZXZlbnQpOwotCQkJLyogQ2xrIERpc2FibGUgKi8KLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1haW5fcmVnLCAweDIwLCAweDAwKTsKLQkJCS8qIFJlc2V0IGVuYWJsZSBhbmQgZGlzYWJsZSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4NDAsIDB4NDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4NDAsIDB4MDApOwotCQkJLyogUmVzZXQgcmF0ZSB0byA0OEsqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWFpbl9yZWcsIDB4MEYsIDB4MDQpOwotCQl9Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgZXZlbnQgJWQgbWFpbl9jbGtfdXNlcnMgJWRcbiIsCi0JCV9fZnVuY19fLCAgZXZlbnQsIHRhdmlsLT5tYWluX2Nsa191c2Vyc1tpbnRlcnBfaWR4XSk7Ci0KLQlyZXR1cm4gdGF2aWwtPm1haW5fY2xrX3VzZXJzW2ludGVycF9pZHhdOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2Nsayk7Ci0KLXN0YXRpYyBpbnQgdGF2aWxfYW5jX291dF9zd2l0Y2hfY2Ioc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQl0YXZpbF9jb2RlY19lbmFibGVfaW50ZXJwX2Nsayhjb2RlYywgZXZlbnQsIHctPnNoaWZ0KTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCB0YXZpbF9jb2RlY19zZXRfaWRsZV9kZXRlY3RfdGhyKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICAgaW50IGludGVycCwgaW50IHBhdGhfdHlwZSkKLXsKLQlpbnQgcG9ydF9pZFs0XSA9IHsgMCwgMCwgMCwgMCB9OwotCWludCAqcG9ydF9wdHIsIG51bV9wb3J0czsKLQlpbnQgYml0X3dpZHRoID0gMCwgaTsKLQlpbnQgbXV4X3JlZywgbXV4X3JlZ192YWw7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRhaV9pZCwgaWRsZV90aHI7Ci0KLQlpZiAoKGludGVycCAhPSBJTlRFUlBfSFBITCkgJiYgKGludGVycCAhPSBJTlRFUlBfSFBIUikpCi0JCXJldHVybiAwOwotCi0JaWYgKCF0YXZpbC0+aWRsZV9kZXRfY2ZnLmhwaF9pZGxlX2RldGVjdF9lbikKLQkJcmV0dXJuIDA7Ci0KLQlwb3J0X3B0ciA9ICZwb3J0X2lkWzBdOwotCW51bV9wb3J0cyA9IDA7Ci0KLQkvKgotCSAqIFJlYWQgaW50ZXJwb2xhdG9yIE1VWCBpbnB1dCByZWdpc3RlcnMgYW5kIGZpbmQKLQkgKiB3aGljaCBzbGltYnVzIHBvcnQgaXMgY29ubmVjdGVkIGFuZCBzdG9yZSB0aGUgcG9ydAotCSAqIG51bWJlcnMgaW4gcG9ydF9pZCBhcnJheS4KLQkgKi8KLQlpZiAocGF0aF90eXBlID09IElOVEVSUF9NSVhfUEFUSCkgewotCQltdXhfcmVnID0gV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEgKwotCQkJICAyICogKGludGVycCAtIDEpOwotCQltdXhfcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgbXV4X3JlZykgJiAweDBmOwotCi0JCWlmICgobXV4X3JlZ192YWwgPj0gSU5Ubl8yX0lOUF9TRUxfUlgwKSAmJgotCQkgICAobXV4X3JlZ192YWwgPCBJTlRuXzJfSU5QX1NFTF9QUk9YSU1JVFkpKSB7Ci0JCQkqcG9ydF9wdHIrKyA9IG11eF9yZWdfdmFsICsKLQkJCQkgICAgICBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSIC0gMTsKLQkJCW51bV9wb3J0cysrOwotCQl9Ci0JfQotCi0JaWYgKHBhdGhfdHlwZSA9PSBJTlRFUlBfTUFJTl9QQVRIKSB7Ci0JCW11eF9yZWcgPSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDFfQ0ZHMCArCi0JCQkgIDIgKiAoaW50ZXJwIC0gMSk7Ci0JCW11eF9yZWdfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBtdXhfcmVnKSAmIDB4MGY7Ci0JCWkgPSBXQ0Q5MzRYX0lOVEVSUF9NVVhfTlVNX0lOUFVUUzsKLQotCQl3aGlsZSAoaSkgewotCQkJaWYgKChtdXhfcmVnX3ZhbCA+PSBJTlRuXzFfSU5QX1NFTF9SWDApICYmCi0JCQkgICAgKG11eF9yZWdfdmFsIDw9IElOVG5fMV9JTlBfU0VMX1JYNykpIHsKLQkJCQkqcG9ydF9wdHIrKyA9IG11eF9yZWdfdmFsICsKLQkJCQkJV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiAtCi0JCQkJCUlOVG5fMV9JTlBfU0VMX1JYMDsKLQkJCQludW1fcG9ydHMrKzsKLQkJCX0KLQkJCW11eF9yZWdfdmFsID0gKHNuZF9zb2NfcmVhZChjb2RlYywgbXV4X3JlZykgJgotCQkJCQkJICAgIDB4ZjApID4+IDQ7Ci0JCQltdXhfcmVnICs9IDE7Ci0JCQlpLS07Ci0JCX0KLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbnVtX3BvcnRzOiAlZCwgcG9ydHNbJWQgJWQgJWQgJWRdXG4iLAotCQlfX2Z1bmNfXywgbnVtX3BvcnRzLCBwb3J0X2lkWzBdLCBwb3J0X2lkWzFdLAotCQlwb3J0X2lkWzJdLCBwb3J0X2lkWzNdKTsKLQotCWkgPSAwOwotCXdoaWxlIChudW1fcG9ydHMpIHsKLQkJZGFpX2lkID0gdGF2aWxfZmluZF9wbGF5YmFja19kYWlfaWRfZm9yX3BvcnQocG9ydF9pZFtpKytdLAotCQkJCQkJCSAgICAgdGF2aWwpOwotCi0JCWlmICgoZGFpX2lkID49IDApICYmIChkYWlfaWQgPCBOVU1fQ09ERUNfREFJUykpIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBkYWlfaWQ6ICVkIGJpdF93aWR0aDogJWRcbiIsCi0JCQkJX19mdW5jX18sIGRhaV9pZCwKLQkJCQl0YXZpbC0+ZGFpW2RhaV9pZF0uYml0X3dpZHRoKTsKLQotCQkJaWYgKHRhdmlsLT5kYWlbZGFpX2lkXS5iaXRfd2lkdGggPiBiaXRfd2lkdGgpCi0JCQkJYml0X3dpZHRoID0gdGF2aWwtPmRhaVtkYWlfaWRdLmJpdF93aWR0aDsKLQkJfQotCi0JCW51bV9wb3J0cy0tOwotCX0KLQotCXN3aXRjaCAoYml0X3dpZHRoKSB7Ci0JY2FzZSAxNjoKLQkJaWRsZV90aHIgPSAweGZmOyAvKiBGMTYgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQljYXNlIDMyOgotCQlpZGxlX3RociA9IDB4MDM7IC8qIEYyMiAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZGxlX3RociA9IDB4MDA7Ci0JCWJyZWFrOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAobmV3KSBpZGxlX3RocjogJWQsIChjdXIpIGlkbGVfdGhyOiAlZFxuIiwKLQkJX19mdW5jX18sIGlkbGVfdGhyLCB0YXZpbC0+aWRsZV9kZXRfY2ZnLmhwaF9pZGxlX3Rocik7Ci0KLQlpZiAoKHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyID09IDApIHx8Ci0JICAgIChpZGxlX3RociA8IHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyKSkgewotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWF9JRExFX0RFVF9DRkczLCBpZGxlX3Rocik7Ci0JCXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfdGhyID0gaWRsZV90aHI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgZ2Fpbl9yZWcsIG1peF9yZWc7Ci0JaW50IG9mZnNldF92YWwgPSAwOwotCWludCB2YWwgPSAwOwotCi0JaWYgKHctPnNoaWZ0ID49IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlMgfHwKLQkgICAgdy0+c2hpZnQgPT0gSU5URVJQX0xPM19OQSB8fCB3LT5zaGlmdCA9PSBJTlRFUlBfTE80X05BKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEludGVycG9sYXRvciB2YWx1ZSAlZCBmb3IgbmFtZSAlc1xuIiwKLQkJCV9fZnVuY19fLCB3LT5zaGlmdCwgdy0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX07Ci0KLQlnYWluX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCArCi0JCQkJCSh3LT5zaGlmdCAqIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKLQltaXhfcmVnID0gV0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfTUlYX0NUTCArCi0JCQkJCSh3LT5zaGlmdCAqIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKLQotCWlmICh3LT5zaGlmdCA9PSBJTlRFUlBfU1BLUjEgfHwgIHctPnNoaWZ0ID09IElOVEVSUF9TUEtSMikKLQkJX190YXZpbF9jb2RlY19lbmFibGVfc3dyKHcsIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQl0YXZpbF9jb2RlY19zZXRfaWRsZV9kZXRlY3RfdGhyKGNvZGVjLCB3LT5zaGlmdCwKLQkJCQkJCUlOVEVSUF9NSVhfUEFUSCk7Ci0JCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOwotCQkvKiBDbGsgZW5hYmxlICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1peF9yZWcsIDB4MjAsIDB4MjApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKCh0YXZpbC0+c3dyLnNwa3JfZ2Fpbl9vZmZzZXQgPT0KLQkJICAgICBXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKLQkJICAgICB0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKLQkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX01JWF9DVEwgfHwKLQkJICAgICBnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX01JWF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKLQkJCQkJICAgIDB4MDEsIDB4MDEpOwotCQkJb2Zmc2V0X3ZhbCA9IC0yOwotCQl9Ci0JCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZ2Fpbl9yZWcpOwotCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKLQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7Ci0JCXRhdmlsX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJLyogQ2xrIERpc2FibGUgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWl4X3JlZywgMHgyMCwgMHgwMCk7Ci0JCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOwotCQkvKiBSZXNldCBlbmFibGUgYW5kIGRpc2FibGUgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWl4X3JlZywgMHg0MCwgMHg0MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1peF9yZWcsIDB4NDAsIDB4MDApOwotCi0JCWlmICgodGF2aWwtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID09Ci0JCSAgICAgV0NEOTM0WF9SWF9HQUlOX09GRlNFVF9NMVA1X0RCKSAmJgotCQkgICAgKHRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzddIHx8Ci0JCSAgICAgdGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfOF0pICYmCi0JCSAgICAoZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg3X1JYX1ZPTF9NSVhfQ1RMIHx8Ci0JCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9NSVhfQ1RMKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCW9mZnNldF92YWwgPSAyOwotCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBnYWluX3JlZyk7Ci0JCQl2YWwgKz0gb2Zmc2V0X3ZhbDsKLQkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCQl9Ci0JCXRhdmlsX2NvZGVjX2NvbmZpZ19lYXJfc3Brcl9nYWluKGNvZGVjLCBldmVudCwgZ2Fpbl9yZWcpOwotCQlicmVhazsKLQl9OwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGV2ZW50ICVkIG5hbWUgJXNcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+bmFtZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0YXZpbF9nZXRfZHNkX2NvbmZpZyAtIEdldCBwb2ludGVyIHRvIGRzZCBjb25maWcgc3RydWN0dXJlCi0gKgotICogQGNvZGVjOiBwb2ludGVyIHRvIHNuZF9zb2NfY29kZWMgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBwb2ludGVyIHRvIHRhdmlsX2RzZF9jb25maWcgc3RydWN0dXJlCi0gKi8KLXN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICp0YXZpbF9nZXRfZHNkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCi0JaWYgKCFjb2RlYykKLQkJcmV0dXJuIE5VTEw7Ci0KLQl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKCF0YXZpbCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gdGF2aWwtPmRzZF9jb25maWc7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2dldF9kc2RfY29uZmlnKTsKLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1MTYgZ2Fpbl9yZWc7Ci0JdTE2IHJlZzsKLQlpbnQgdmFsOwotCWludCBvZmZzZXRfdmFsID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkICVzXG4iLCBfX2Z1bmNfXywgZXZlbnQsIHctPm5hbWUpOwotCi0JaWYgKHctPnNoaWZ0ID49IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlMgfHwKLQkgICAgdy0+c2hpZnQgPT0gSU5URVJQX0xPM19OQSB8fCB3LT5zaGlmdCA9PSBJTlRFUlBfTE80X05BKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEludGVycG9sYXRvciB2YWx1ZSAlZCBmb3IgbmFtZSAlc1xuIiwKLQkJCV9fZnVuY19fLCB3LT5zaGlmdCwgdy0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX07Ci0KLQlyZWcgPSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DVEwgKyAody0+c2hpZnQgKgotCQkJCQkgICAgIFdDRDkzNFhfUlhfUEFUSF9DVExfT0ZGU0VUKTsKLQlnYWluX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfQ1RMICsgKHctPnNoaWZ0ICoKLQkJCQkJCSBXQ0Q5MzRYX1JYX1BBVEhfQ1RMX09GRlNFVCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJdGF2aWxfY29kZWNfc2V0X2lkbGVfZGV0ZWN0X3Rocihjb2RlYywgdy0+c2hpZnQsCi0JCQkJCQlJTlRFUlBfTUFJTl9QQVRIKTsKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LCB3LT5zaGlmdCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiBhcHBseSBnYWluIGFmdGVyIGludCBjbGsgaXMgZW5hYmxlZCAqLwotCQlpZiAoKHRhdmlsLT5zd3Iuc3Brcl9nYWluX29mZnNldCA9PQotCQkJCQlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpICYmCi0JCSAgICAodGF2aWwtPmNvbXBfZW5hYmxlZFtDT01QQU5ERVJfN10gfHwKLQkJICAgICB0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl84XSkgJiYKLQkJICAgIChnYWluX3JlZyA9PSBXQ0Q5MzRYX0NEQ19SWDdfUlhfVk9MX0NUTCB8fAotCQkgICAgIGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfQ1RMKSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfU0VDMSwKLQkJCQkJICAgIDB4MDEsIDB4MDEpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9TRUMwLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAxKTsKLQkJCW9mZnNldF92YWwgPSAtMjsKLQkJfQotCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKLQkJdmFsICs9IG9mZnNldF92YWw7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIGdhaW5fcmVnLCB2YWwpOwotCQl0YXZpbF9jb2RlY19jb25maWdfZWFyX3Nwa3JfZ2Fpbihjb2RlYywgZXZlbnQsIGdhaW5fcmVnKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOwotCi0JCWlmICgodGF2aWwtPnN3ci5zcGtyX2dhaW5fb2Zmc2V0ID09Ci0JCQkJCVdDRDkzNFhfUlhfR0FJTl9PRkZTRVRfTTFQNV9EQikgJiYKLQkJICAgICh0YXZpbC0+Y29tcF9lbmFibGVkW0NPTVBBTkRFUl83XSB8fAotCQkgICAgIHRhdmlsLT5jb21wX2VuYWJsZWRbQ09NUEFOREVSXzhdKSAmJgotCQkgICAgKGdhaW5fcmVnID09IFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMIHx8Ci0JCSAgICAgZ2Fpbl9yZWcgPT0gV0NEOTM0WF9DRENfUlg4X1JYX1ZPTF9DVEwpKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9TRUMxLAotCQkJCQkgICAgMHgwMSwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOTM0WF9DRENfUlg3X1JYX1BBVEhfTUlYX1NFQzAsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX1NFQzEsCi0JCQkJCSAgICAweDAxLCAweDAwKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9NSVhfU0VDMCwKLQkJCQkJICAgIDB4MDEsIDB4MDApOwotCQkJb2Zmc2V0X3ZhbCA9IDI7Ci0JCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGdhaW5fcmVnKTsKLQkJCXZhbCArPSBvZmZzZXRfdmFsOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgZ2Fpbl9yZWcsIHZhbCk7Ci0JCX0KLQkJdGF2aWxfY29kZWNfY29uZmlnX2Vhcl9zcGtyX2dhaW4oY29kZWMsIGV2ZW50LCBnYWluX3JlZyk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19zZXRfaWlyX2dhaW4oc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWlmIChzdHJuc3RyKHctPm5hbWUsICJJSVIwIiwgc2l6ZW9mKCJJSVIwIikpKSB7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjFfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjNfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjRfQ1RMKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjJfQ1RMKSk7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMLAotCQkJc25kX3NvY19yZWFkKGNvZGVjLAotCQkJCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjNfQ1RMKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2ZpbmRfYW1pY19pbnB1dChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgIGludCBhZGNfbXV4X24pCi17Ci0JdTE2IG1hc2ssIHNoaWZ0LCBhZGNfbXV4X2luX3JlZzsKLQl1MTYgYW1pY19tdXhfc2VsX3JlZzsKLQlib29sIGlzX2FtaWM7Ci0KLQlpZiAoYWRjX211eF9uIDwgMCB8fCBhZGNfbXV4X24gPiBXQ0Q5MzRYX01BWF9WQUxJRF9BRENfTVVYIHx8Ci0JICAgIGFkY19tdXhfbiA9PSBXQ0Q5MzRYX0lOVkFMSURfQURDX01VWCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYWRjX211eF9uIDwgMykgewotCQlhZGNfbXV4X2luX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSArCi0JCQkJIGFkY19tdXhfbjsKLQkJbWFzayA9IDB4MDM7Ci0JCXNoaWZ0ID0gMDsKLQkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMCArCi0JCQkJICAgMiAqIGFkY19tdXhfbjsKLQl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDQpIHsKLQkJYWRjX211eF9pbl9yZWcgPSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzE7Ci0JCW1hc2sgPSAweDAzOwotCQlzaGlmdCA9IDA7Ci0JCWFtaWNfbXV4X3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgKwotCQkJCSAgIDIgKiBhZGNfbXV4X247Ci0JfSBlbHNlIGlmIChhZGNfbXV4X24gPCA3KSB7Ci0JCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxICsKLQkJCQkgKGFkY19tdXhfbiAtIDQpOwotCQltYXNrID0gMHgwQzsKLQkJc2hpZnQgPSAyOwotCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKLQkJCQkgICBhZGNfbXV4X24gLSA0OwotCX0gZWxzZSBpZiAoYWRjX211eF9uIDwgOCkgewotCQlhZGNfbXV4X2luX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMTsKLQkJbWFzayA9IDB4MEM7Ci0JCXNoaWZ0ID0gMjsKLQkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCArCi0JCQkJICAgYWRjX211eF9uIC0gNDsKLQl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDEyKSB7Ci0JCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxICsKLQkJCQkgKChhZGNfbXV4X24gPT0gOCkgPyAoYWRjX211eF9uIC0gOCkgOgotCQkJCSAgKGFkY19tdXhfbiAtIDkpKTsKLQkJbWFzayA9IDB4MzA7Ci0JCXNoaWZ0ID0gNDsKLQkJYW1pY19tdXhfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCArCi0JCQkJICAgYWRjX211eF9uIC0gNDsKLQl9IGVsc2UgaWYgKGFkY19tdXhfbiA8IDEzKSB7Ci0JCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcxOwotCQltYXNrID0gMHgzMDsKLQkJc2hpZnQgPSA0OwotCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKLQkJCQkgICBhZGNfbXV4X24gLSA0OwotCX0gZWxzZSB7Ci0JCWFkY19tdXhfaW5fcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxOwotCQltYXNrID0gMHhDMDsKLQkJc2hpZnQgPSA2OwotCQlhbWljX211eF9zZWxfcmVnID0gV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwICsKLQkJCQkgICBhZGNfbXV4X24gLSA0OwotCX0KLQotCWlzX2FtaWMgPSAoKChzbmRfc29jX3JlYWQoY29kZWMsIGFkY19tdXhfaW5fcmVnKSAmIG1hc2spID4+IHNoaWZ0KQotCQkgICAgPT0gMSk7Ci0JaWYgKCFpc19hbWljKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBzbmRfc29jX3JlYWQoY29kZWMsIGFtaWNfbXV4X3NlbF9yZWcpICYgMHgwNzsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfc2V0X3R4X2hvbGQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICB1MTYgYW1pY19yZWcsIGJvb2wgc2V0KQotewotCXU4IG1hc2sgPSAweDIwOwotCXU4IHZhbDsKLQotCWlmIChhbWljX3JlZyA9PSBXQ0Q5MzRYX0FOQV9BTUlDMSB8fAotCSAgICBhbWljX3JlZyA9PSBXQ0Q5MzRYX0FOQV9BTUlDMykKLQkJbWFzayA9IDB4NDA7Ci0KLQl2YWwgPSBzZXQgPyBtYXNrIDogMHgwMDsKLQotCXN3aXRjaCAoYW1pY19yZWcpIHsKLQljYXNlIFdDRDkzNFhfQU5BX0FNSUMxOgotCWNhc2UgV0NEOTM0WF9BTkFfQU1JQzI6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0FNSUMyLCBtYXNrLCB2YWwpOwotCQlicmVhazsKLQljYXNlIFdDRDkzNFhfQU5BX0FNSUMzOgotCWNhc2UgV0NEOTM0WF9BTkFfQU1JQzQ6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0FNSUM0LCBtYXNrLCB2YWwpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBhbWljOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBhbWljX3JlZyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY190eF9hZGNfY2ZnKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlpbnQgYWRjX211eF9uID0gdy0+c2hpZnQ7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBhbWljX247Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQ6ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlhbWljX24gPSB0YXZpbF9jb2RlY19maW5kX2FtaWNfaW5wdXQoY29kZWMsIGFkY19tdXhfbik7Ci0JCWlmIChhbWljX24pIHsKLQkJCS8qCi0JCQkgKiBQcmV2ZW50IEFOQyBSeCBwb3AgYnkgbGVhdmluZyBUeCBGRSBpbiBIT0xECi0JCQkgKiBzdGF0ZSB1bnRpbCBQQSBpcyB1cC4gVHJhY2sgQU1JQyBiZWluZyB1c2VkCi0JCQkgKiBzbyB3ZSBjYW4gcmVsZWFzZSB0aGUgSE9MRCBsYXRlci4KLQkJCSAqLwotCQkJc2V0X2JpdChBTkNfTUlDX0FNSUMxICsgYW1pY19uIC0gMSwKLQkJCQkmdGF2aWwtPnN0YXR1c19tYXNrKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHUxNiB0YXZpbF9jb2RlY19nZXRfYW1pY19wd2x2bF9yZWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgYW1pYykKLXsKLQl1MTYgcHdyX2xldmVsX3JlZyA9IDA7Ci0KLQlzd2l0Y2ggKGFtaWMpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQlwd3JfbGV2ZWxfcmVnID0gV0NEOTM0WF9BTkFfQU1JQzE7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCWNhc2UgNDoKLQkJcHdyX2xldmVsX3JlZyA9IFdDRDkzNFhfQU5BX0FNSUMzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaW52YWxpZCBhbWljOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBhbWljKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHB3cl9sZXZlbF9yZWc7Ci19Ci0KLSNkZWZpbmUgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSyAweDYwCi0jZGVmaW5lICBDRl9NSU5fM0RCXzRIWiAgICAgMHgwCi0jZGVmaW5lICBDRl9NSU5fM0RCXzc1SFogICAgMHgxCi0jZGVmaW5lICBDRl9NSU5fM0RCXzE1MEhaICAgMHgyCi0KLXN0YXRpYyB2b2lkIHRhdmlsX3R4X2hwZl9jb3JuZXJfZnJlcV9jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqaHBmX2RlbGF5ZWRfd29yazsKLQlzdHJ1Y3QgaHBmX3dvcmsgKmhwZl93b3JrOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0JdTE2IGRlY19jZmdfcmVnLCBhbWljX3JlZywgZ29fYml0X3JlZzsKLQl1OCBocGZfY3V0X29mZl9mcmVxOwotCWludCBhbWljX247Ci0KLQlocGZfZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCWhwZl93b3JrID0gY29udGFpbmVyX29mKGhwZl9kZWxheWVkX3dvcmssIHN0cnVjdCBocGZfd29yaywgZHdvcmspOwotCXRhdmlsID0gaHBmX3dvcmstPnRhdmlsOwotCWNvZGVjID0gdGF2aWwtPmNvZGVjOwotCWhwZl9jdXRfb2ZmX2ZyZXEgPSBocGZfd29yay0+aHBmX2N1dF9vZmZfZnJlcTsKLQotCWRlY19jZmdfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogaHBmX3dvcmstPmRlY2ltYXRvcjsKLQlnb19iaXRfcmVnID0gZGVjX2NmZ19yZWcgKyA3OwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGRlY2ltYXRvciAldSBocGZfY3V0X29mX2ZyZXEgMHgleFxuIiwKLQkJX19mdW5jX18sIGhwZl93b3JrLT5kZWNpbWF0b3IsIGhwZl9jdXRfb2ZmX2ZyZXEpOwotCi0JYW1pY19uID0gdGF2aWxfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBocGZfd29yay0+ZGVjaW1hdG9yKTsKLQlpZiAoYW1pY19uKSB7Ci0JCWFtaWNfcmVnID0gV0NEOTM0WF9BTkFfQU1JQzEgKyBhbWljX24gLSAxOwotCQl0YXZpbF9jb2RlY19zZXRfdHhfaG9sZChjb2RlYywgYW1pY19yZWcsIGZhbHNlKTsKLQl9Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZGVjX2NmZ19yZWcsIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSywKLQkJCSAgICBocGZfY3V0X29mZl9mcmVxIDw8IDUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGdvX2JpdF9yZWcsIDB4MDIsIDB4MDIpOwotCS8qIE1pbmltdW0gMSBjbGsgY3ljbGUgZGVsYXkgaXMgcmVxdWlyZWQgYXMgcGVyIEhXIHNwZWMgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAxMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZ29fYml0X3JlZywgMHgwMiwgMHgwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX3R4X211dGVfdXBkYXRlX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHhfbXV0ZV93b3JrICp0eF9tdXRlX2R3b3JrOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkZWxheWVkX3dvcms7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXUxNiB0eF92b2xfY3RsX3JlZywgaHBmX2dhdGVfcmVnOwotCi0JZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXR4X211dGVfZHdvcmsgPSBjb250YWluZXJfb2YoZGVsYXllZF93b3JrLCBzdHJ1Y3QgdHhfbXV0ZV93b3JrLCBkd29yayk7Ci0JdGF2aWwgPSB0eF9tdXRlX2R3b3JrLT50YXZpbDsKLQljb2RlYyA9IHRhdmlsLT5jb2RlYzsKLQotCXR4X3ZvbF9jdGxfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMICsKLQkJCSAxNiAqIHR4X211dGVfZHdvcmstPmRlY2ltYXRvcjsKLQlocGZfZ2F0ZV9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9TRUMyICsKLQkJICAgICAgIDE2ICogdHhfbXV0ZV9kd29yay0+ZGVjaW1hdG9yOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDEwLCAweDAwKTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfcnhfcGF0aF9jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQl1MTYgc2lkZXRvbmVfcmVnOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgJWQgJWRcbiIsIF9fZnVuY19fLCBldmVudCwgdy0+c2hpZnQpOwotCXNpZGV0b25lX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzEgKyAweDE0Kih3LT5zaGlmdCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJaWYgKCFzdHJjbXAody0+bmFtZSwgIlJYIElOVDcgTUlYMiBJTlAiKSkKLQkJCV9fdGF2aWxfY29kZWNfZW5hYmxlX3N3cih3LCBldmVudCk7Ci0JCXRhdmlsX2NvZGVjX2VuYWJsZV9pbnRlcnBfY2xrKGNvZGVjLCBldmVudCwgdy0+c2hpZnQpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBzaWRldG9uZV9yZWcsIDB4MTAsIDB4MTApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgc2lkZXRvbmVfcmVnLCAweDEwLCAweDAwKTsKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoY29kZWMsIGV2ZW50LCB3LT5zaGlmdCk7Ci0JCWlmICghc3RyY21wKHctPm5hbWUsICJSWCBJTlQ3IE1JWDIgSU5QIikpCi0JCQlfX3RhdmlsX2NvZGVjX2VuYWJsZV9zd3IodywgZXZlbnQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1bnNpZ25lZCBpbnQgZGVjaW1hdG9yOwotCWNoYXIgKmRlY19hZGNfbXV4X25hbWUgPSBOVUxMOwotCWNoYXIgKndpZGdldF9uYW1lID0gTlVMTDsKLQljaGFyICp3bmFtZTsKLQlpbnQgcmV0ID0gMCwgYW1pY19uOwotCXUxNiB0eF92b2xfY3RsX3JlZywgcHdyX2xldmVsX3JlZyA9IDAsIGRlY19jZmdfcmVnLCBocGZfZ2F0ZV9yZWc7Ci0JdTE2IHR4X2dhaW5fY3RsX3JlZzsKLQljaGFyICpkZWM7Ci0JdTggaHBmX2N1dF9vZmZfZnJlcTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jd2lkZ2V0X25hbWUgPSBrc3RybmR1cCh3LT5uYW1lLCAxNSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3aWRnZXRfbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl3bmFtZSA9IHdpZGdldF9uYW1lOwotCWRlY19hZGNfbXV4X25hbWUgPSBzdHJzZXAoJndpZGdldF9uYW1lLCAiICIpOwotCWlmICghZGVjX2FkY19tdXhfbmFtZSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBkZWNpbWF0b3IgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCB3LT5uYW1lKTsKLQkJcmV0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlkZWNfYWRjX211eF9uYW1lID0gd2lkZ2V0X25hbWU7Ci0KLQlkZWMgPSBzdHJwYnJrKGRlY19hZGNfbXV4X25hbWUsICIwMTIzNDU2NzgiKTsKLQlpZiAoIWRlYykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogZGVjaW1hdG9yIGluZGV4IG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJldCA9IGtzdHJ0b3VpbnQoZGVjLCAxMCwgJmRlY2ltYXRvcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgZGVjaW1hdG9yID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgd25hbWUpOwotCQlyZXQgPSAgLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMoKTogd2lkZ2V0ID0gJXMgZGVjaW1hdG9yID0gJXVcbiIsIF9fZnVuY19fLAotCQkJdy0+bmFtZSwgZGVjaW1hdG9yKTsKLQotCXR4X3ZvbF9jdGxfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMICsgMTYgKiBkZWNpbWF0b3I7Ci0JaHBmX2dhdGVfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfU0VDMiArIDE2ICogZGVjaW1hdG9yOwotCWRlY19jZmdfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMCArIDE2ICogZGVjaW1hdG9yOwotCXR4X2dhaW5fY3RsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYMF9UWF9WT0xfQ1RMICsgMTYgKiBkZWNpbWF0b3I7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJYW1pY19uID0gdGF2aWxfY29kZWNfZmluZF9hbWljX2lucHV0KGNvZGVjLCBkZWNpbWF0b3IpOwotCQlpZiAoYW1pY19uKQotCQkJcHdyX2xldmVsX3JlZyA9IHRhdmlsX2NvZGVjX2dldF9hbWljX3B3bHZsX3JlZyhjb2RlYywKLQkJCQkJCQkJICAgICAgIGFtaWNfbik7Ci0KLQkJaWYgKHB3cl9sZXZlbF9yZWcpIHsKLQkJCXN3aXRjaCAoKHNuZF9zb2NfcmVhZChjb2RlYywgcHdyX2xldmVsX3JlZykgJgotCQkJCQkgICAgICBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9NQVNLKSA+PgotCQkJCQkgICAgICBXQ0Q5MzRYX0FNSUNfUFdSX0xWTF9TSElGVCkgewotCQkJY2FzZSBXQ0Q5MzRYX0FNSUNfUFdSX0xFVkVMX0xQOgotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfTUFTSywKLQkJCQkJCSAgICBXQ0Q5MzRYX0RFQ19QV1JfTFZMX0xQKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBXQ0Q5MzRYX0FNSUNfUFdSX0xFVkVMX0hQOgotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfTUFTSywKLQkJCQkJCSAgICBXQ0Q5MzRYX0RFQ19QV1JfTFZMX0hQKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0NEOTM0WF9BTUlDX1BXUl9MRVZFTF9ERUZBVUxUOgotCQkJZGVmYXVsdDoKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKLQkJCQkJCSAgICBXQ0Q5MzRYX0RFQ19QV1JfTFZMX01BU0ssCi0JCQkJCQkgICAgV0NEOTM0WF9ERUNfUFdSX0xWTF9ERik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogRW5hYmxlIFRYIFBHQSBNdXRlICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHR4X3ZvbF9jdGxfcmVnLCAweDEwLCAweDEwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCWhwZl9jdXRfb2ZmX2ZyZXEgPSAoc25kX3NvY19yZWFkKGNvZGVjLCBkZWNfY2ZnX3JlZykgJgotCQkJCSAgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSykgPj4gNTsKLQotCQl0YXZpbC0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxID0KLQkJCQkJCQlocGZfY3V0X29mZl9mcmVxOwotCQlpZiAoaHBmX2N1dF9vZmZfZnJlcSAhPSBDRl9NSU5fM0RCXzE1MEhaKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkZWNfY2ZnX3JlZywKLQkJCQkJICAgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSywKLQkJCQkJICAgIENGX01JTl8zREJfMTUwSFogPDwgNSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGZfZ2F0ZV9yZWcsIDB4MDIsIDB4MDIpOwotCQkJLyoKLQkJCSAqIE1pbmltdW0gMSBjbGsgY3ljbGUgZGVsYXkgaXMgcmVxdWlyZWQgYXMgcGVyCi0JCQkgKiBIVyBzcGVjLgotCQkJICovCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAxMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBocGZfZ2F0ZV9yZWcsIDB4MDIsIDB4MDApOwotCQl9Ci0JCS8qIHNjaGVkdWxlIHdvcmsgcXVldWUgdG8gUmVtb3ZlIE11dGUgKi8KLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0YXZpbC0+dHhfbXV0ZV9kd29ya1tkZWNpbWF0b3JdLmR3b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXModHhfdW5tdXRlX2RlbGF5KSk7Ci0JCWlmICh0YXZpbC0+dHhfaHBmX3dvcmtbZGVjaW1hdG9yXS5ocGZfY3V0X29mZl9mcmVxICE9Ci0JCQkJCQkJQ0ZfTUlOXzNEQl8xNTBIWikKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygKLQkJCQkJJnRhdmlsLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmR3b3JrLAotCQkJCQltc2Vjc190b19qaWZmaWVzKDMwMCkpOwotCQkvKiBhcHBseSBnYWluIGFmdGVyIGRlY2ltYXRvciBpcyBlbmFibGVkICovCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIHR4X2dhaW5fY3RsX3JlZywKLQkJCSAgICAgIHNuZF9zb2NfcmVhZChjb2RlYywgdHhfZ2Fpbl9jdGxfcmVnKSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCWhwZl9jdXRfb2ZmX2ZyZXEgPQotCQkJdGF2aWwtPnR4X2hwZl93b3JrW2RlY2ltYXRvcl0uaHBmX2N1dF9vZmZfZnJlcTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgdHhfdm9sX2N0bF9yZWcsIDB4MTAsIDB4MTApOwotCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKAotCQkgICAgJnRhdmlsLT50eF9ocGZfd29ya1tkZWNpbWF0b3JdLmR3b3JrKSkgewotCQkJaWYgKGhwZl9jdXRfb2ZmX2ZyZXEgIT0gQ0ZfTUlOXzNEQl8xNTBIWikgewotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCQkJICAgIFRYX0hQRl9DVVRfT0ZGX0ZSRVFfTUFTSywKLQkJCQkJCSAgICBocGZfY3V0X29mZl9mcmVxIDw8IDUpOwotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGhwZl9nYXRlX3JlZywKLQkJCQkJCSAgICAweDAyLCAweDAyKTsKLQkJCQkvKgotCQkJCSAqIE1pbmltdW0gMSBjbGsgY3ljbGUgZGVsYXkgaXMgcmVxdWlyZWQgYXMgcGVyCi0JCQkJICogSFcgc3BlYy4KLQkJCQkgKi8KLQkJCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAxMCk7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaHBmX2dhdGVfcmVnLAotCQkJCQkJICAgIDB4MDIsIDB4MDApOwotCQkJfQotCQl9Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKLQkJCQkmdGF2aWwtPnR4X211dGVfZHdvcmtbZGVjaW1hdG9yXS5kd29yayk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF92b2xfY3RsX3JlZywgMHgxMCwgMHgwMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRlY19jZmdfcmVnLAotCQkJCSAgICBXQ0Q5MzRYX0RFQ19QV1JfTFZMX01BU0ssCi0JCQkJICAgIFdDRDkzNFhfREVDX1BXUl9MVkxfREYpOwotCQlicmVhazsKLQl9Owotb3V0OgotCWtmcmVlKHduYW1lKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdTMyIHRhdmlsX2dldF9kbWljX3NhbXBsZV9yYXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZG1pYywKLQkJCQkgICAgICBzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEpCi17Ci0JdTggdHhfc3RyZWFtX2ZzOwotCXU4IGFkY19tdXhfaW5kZXggPSAwLCBhZGNfbXV4X3NlbCA9IDA7Ci0JYm9vbCBkZWNfZm91bmQgPSBmYWxzZTsKLQl1MTYgYWRjX211eF9jdGxfcmVnLCB0eF9mc19yZWc7Ci0JdTMyIGRtaWNfZnM7Ci0KLQl3aGlsZSAoZGVjX2ZvdW5kID09IDAgJiYgYWRjX211eF9pbmRleCA8IFdDRDkzNFhfTUFYX1ZBTElEX0FEQ19NVVgpIHsKLQkJaWYgKGFkY19tdXhfaW5kZXggPCA0KSB7Ci0JCQlhZGNfbXV4X2N0bF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAgKwotCQkJCQkJKGFkY19tdXhfaW5kZXggKiAyKTsKLQkJfSBlbHNlIGlmIChhZGNfbXV4X2luZGV4IDwgV0NEOTM0WF9JTlZBTElEX0FEQ19NVVgpIHsKLQkJCWFkY19tdXhfY3RsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCArCi0JCQkJCQlhZGNfbXV4X2luZGV4IC0gNDsKLQkJfSBlbHNlIGlmIChhZGNfbXV4X2luZGV4ID09IFdDRDkzNFhfSU5WQUxJRF9BRENfTVVYKSB7Ci0JCQkrK2FkY19tdXhfaW5kZXg7Ci0JCQljb250aW51ZTsKLQkJfQotCQlhZGNfbXV4X3NlbCA9ICgoc25kX3NvY19yZWFkKGNvZGVjLCBhZGNfbXV4X2N0bF9yZWcpICYKLQkJCQkJMHhGOCkgPj4gMykgLSAxOwotCi0JCWlmIChhZGNfbXV4X3NlbCA9PSBkbWljKSB7Ci0JCQlkZWNfZm91bmQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkrK2FkY19tdXhfaW5kZXg7Ci0JfQotCi0JaWYgKGRlY19mb3VuZCAmJiBhZGNfbXV4X2luZGV4IDw9IDgpIHsKLQkJdHhfZnNfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ1RMICsgKDE2ICogYWRjX211eF9pbmRleCk7Ci0JCXR4X3N0cmVhbV9mcyA9IHNuZF9zb2NfcmVhZChjb2RlYywgdHhfZnNfcmVnKSAmIDB4MEY7Ci0JCWlmICh0eF9zdHJlYW1fZnMgPD0gNCkgIHsKLQkJCWlmIChwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA8PQotCQkJCQlXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfMlA0TUhaKQotCQkJCWRtaWNfZnMgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKLQkJCWVsc2UKLQkJCQlkbWljX2ZzID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzJQNE1IWjsKLQkJfSBlbHNlCi0JCQlkbWljX2ZzID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQOE1IWjsKLQl9IGVsc2UgewotCQlkbWljX2ZzID0gcGRhdGEtPmRtaWNfc2FtcGxlX3JhdGU7Ci0JfQotCi0JcmV0dXJuIGRtaWNfZnM7Ci19Ci0KLXN0YXRpYyB1OCB0YXZpbF9nZXRfZG1pY19jbGtfdmFsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgdTMyIG1jbGtfcmF0ZSwgdTMyIGRtaWNfY2xrX3JhdGUpCi17Ci0JdTMyIGRpdl9mYWN0b3I7Ci0JdTggZG1pY19jdGxfdmFsOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkiJXM6IG1jbGtfcmF0ZSA9ICVkLCBkbWljX3NhbXBsZV9yYXRlID0gJWRcbiIsCi0JCV9fZnVuY19fLCBtY2xrX3JhdGUsIGRtaWNfY2xrX3JhdGUpOwotCi0JLyogRGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaW4gY2FzZSBvZiBlcnJvciAqLwotCWlmIChtY2xrX3JhdGUgPT0gV0NEOTM0WF9NQ0xLX0NMS185UDZNSFopCi0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzNFhfRE1JQ19DTEtfRElWXzI7Ci0JZWxzZQotCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8zOwotCi0JaWYgKGRtaWNfY2xrX3JhdGUgPT0gMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IGRtaWNfc2FtcGxlX3JhdGUgY2Fubm90IGJlIDBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkaXZfZmFjdG9yID0gbWNsa19yYXRlIC8gZG1pY19jbGtfcmF0ZTsKLQlzd2l0Y2ggKGRpdl9mYWN0b3IpIHsKLQljYXNlIDI6Ci0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzNFhfRE1JQ19DTEtfRElWXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfMzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlkbWljX2N0bF92YWwgPSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl80OwotCQlicmVhazsKLQljYXNlIDY6Ci0JCWRtaWNfY3RsX3ZhbCA9IFdDRDkzNFhfRE1JQ19DTEtfRElWXzY7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfODsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJZG1pY19jdGxfdmFsID0gV0NEOTM0WF9ETUlDX0NMS19ESVZfMTY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogSW52YWxpZCBkaXZfZmFjdG9yICV1LCBjbGtfcmF0ZSgldSksIGRtaWNfcmF0ZSgldSlcbiIsCi0JCQlfX2Z1bmNfXywgZGl2X2ZhY3RvciwgbWNsa19yYXRlLCBkbWljX2Nsa19yYXRlKTsKLQkJYnJlYWs7Ci0JfQotCi1kb25lOgotCXJldHVybiBkbWljX2N0bF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2FkYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGV2ZW50OiVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXRhdmlsX2NvZGVjX3NldF90eF9ob2xkKGNvZGVjLCB3LT5yZWcsIHRydWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19lbmFibGVfZG1pYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JdTggIGRtaWNfY2xrX2VuID0gMHgwMTsKLQl1MTYgZG1pY19jbGtfcmVnOwotCXMzMiAqZG1pY19jbGtfY250OwotCXU4IGRtaWNfcmF0ZV92YWwsIGRtaWNfcmF0ZV9zaGlmdCA9IDE7Ci0JdW5zaWduZWQgaW50IGRtaWM7Ci0JdTMyIGRtaWNfc2FtcGxlX3JhdGU7Ci0JaW50IHJldDsKLQljaGFyICp3bmFtZTsKLQotCXduYW1lID0gc3RycGJyayh3LT5uYW1lLCAiMDEyMzQ1Iik7Ci0JaWYgKCF3bmFtZSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogd2lkZ2V0IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBrc3RydG91aW50KHduYW1lLCAxMCwgJmRtaWMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgbGluZSBvbiB0aGUgY29kZWNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZG1pYykgewotCWNhc2UgMDoKLQljYXNlIDE6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGF2aWwtPmRtaWNfMF8xX2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzRYX0NQRV9TU19ETUlDMF9DVEw7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQljYXNlIDM6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGF2aWwtPmRtaWNfMl8zX2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzRYX0NQRV9TU19ETUlDMV9DVEw7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCWRtaWNfY2xrX2NudCA9ICYodGF2aWwtPmRtaWNfNF81X2Nsa19jbnQpOwotCQlkbWljX2Nsa19yZWcgPSBXQ0Q5MzRYX0NQRV9TU19ETUlDMl9DVEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIERNSUMgU2VsZWN0aW9uXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBldmVudCAlZCBETUlDJWQgZG1pY19jbGtfY250ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50LCAgZG1pYywgKmRtaWNfY2xrX2NudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJZG1pY19zYW1wbGVfcmF0ZSA9IHRhdmlsX2dldF9kbWljX3NhbXBsZV9yYXRlKGNvZGVjLCBkbWljLAotCQkJCQkJCSAgICAgIHBkYXRhKTsKLQkJZG1pY19yYXRlX3ZhbCA9Ci0JCQl0YXZpbF9nZXRfZG1pY19jbGtfdmFsKGNvZGVjLAotCQkJCQkgICAgICAgcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQkJICAgICAgIGRtaWNfc2FtcGxlX3JhdGUpOwotCi0JCSgqZG1pY19jbGtfY250KSsrOwotCQlpZiAoKmRtaWNfY2xrX2NudCA9PSAxKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBkbWljX2Nsa19yZWcsCi0JCQkJCSAgICAweDA3IDw8IGRtaWNfcmF0ZV9zaGlmdCwKLQkJCQkJICAgIGRtaWNfcmF0ZV92YWwgPDwgZG1pY19yYXRlX3NoaWZ0KTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGRtaWNfY2xrX3JlZywKLQkJCQkJICAgIGRtaWNfY2xrX2VuLCBkbWljX2Nsa19lbik7Ci0JCX0KLQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJZG1pY19yYXRlX3ZhbCA9Ci0JCQl0YXZpbF9nZXRfZG1pY19jbGtfdmFsKGNvZGVjLAotCQkJCQkgICAgICAgcGRhdGEtPm1jbGtfcmF0ZSwKLQkJCQkJICAgICAgIHBkYXRhLT5tYWRfZG1pY19zYW1wbGVfcmF0ZSk7Ci0JCSgqZG1pY19jbGtfY250KS0tOwotCQlpZiAoKmRtaWNfY2xrX2NudCAgPT0gMCkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAotCQkJCQkgICAgZG1pY19jbGtfZW4sIDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZG1pY19jbGtfcmVnLAotCQkJCQkgICAgMHgwNyA8PCBkbWljX3JhdGVfc2hpZnQsCi0JCQkJCSAgICBkbWljX3JhdGVfdmFsIDw8IGRtaWNfcmF0ZV9zaGlmdCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogdGF2aWxfbWJoY19taWNiX2FkanVzdF92b2x0YWdlOiBhZGp1c3Qgc3BlY2lmaWMgbWljYmlhcyB2b2x0YWdlCi0gKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKLSAqIEByZXFfdm9sdDogbWljYmlhcyB2b2x0YWdlIHRvIGJlIHNldAotICogQG1pY2JfbnVtOiBtaWNiaWFzIHRvIGJlIHNldCwgZS5nLiBtaWNiaWFzMSBvciBtaWNiaWFzMgotICoKLSAqIHJldHVybiAwIGlmIGFkanVzdG1lbnQgaXMgc3VjY2VzcyBvciBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgdGF2aWxfbWJoY19taWNiX2FkanVzdF92b2x0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgICBpbnQgcmVxX3ZvbHQsIGludCBtaWNiX251bSkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgY3VyX3ZvdXRfY3RsLCByZXFfdm91dF9jdGw7Ci0JaW50IG1pY2JfcmVnLCBtaWNiX3ZhbCwgbWljYl9lbjsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAobWljYl9udW0pIHsKLQljYXNlIE1JQ19CSUFTXzE6Ci0JCW1pY2JfcmVnID0gV0NEOTM0WF9BTkFfTUlDQjE7Ci0JCWJyZWFrOwotCWNhc2UgTUlDX0JJQVNfMjoKLQkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCMjsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNfQklBU18zOgotCQltaWNiX3JlZyA9IFdDRDkzNFhfQU5BX01JQ0IzOwotCQlicmVhazsKLQljYXNlIE1JQ19CSUFTXzQ6Ci0JCW1pY2JfcmVnID0gV0NEOTM0WF9BTkFfTUlDQjQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdXRleF9sb2NrKCZ0YXZpbC0+bWljYl9sb2NrKTsKLQotCS8qCi0JICogSWYgcmVxdWVzdGVkIG1pY2JpYXMgdm9sdGFnZSBpcyBzYW1lIGFzIGN1cnJlbnQgbWljYmlhcwotCSAqIHZvbHRhZ2UsIHRoZW4ganVzdCByZXR1cm4uIE90aGVyd2lzZSwgYWRqdXN0IHZvbHRhZ2UgYXMKLQkgKiBwZXIgcmVxdWVzdGVkIHZhbHVlLiBJZiBtaWNiaWFzIGlzIGFscmVhZHkgZW5hYmxlZCwgdGhlbgotCSAqIHRvIGF2b2lkIHNsb3cgbWljYmlhcyByYW1wLXVwIG9yIGRvd24gZW5hYmxlIHB1bGwtdXAKLQkgKiBtb21lbnRhcmlseSwgY2hhbmdlIHRoZSBtaWNiaWFzIHZhbHVlIGFuZCB0aGVuIHJlLWVuYWJsZQotCSAqIG1pY2JpYXMuCi0JICovCi0JbWljYl92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIG1pY2JfcmVnKTsKLQltaWNiX2VuID0gKG1pY2JfdmFsICYgMHhDMCkgPj4gNjsKLQljdXJfdm91dF9jdGwgPSBtaWNiX3ZhbCAmIDB4M0Y7Ci0KLQlyZXFfdm91dF9jdGwgPSB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChyZXFfdm9sdCk7Ci0JaWYgKHJlcV92b3V0X2N0bCA8IDApIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQlpZiAoY3VyX3ZvdXRfY3RsID09IHJlcV92b3V0X2N0bCkgewotCQlyZXQgPSAwOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1pY2JfbnVtOiAlZCwgY3VyX212OiAlZCwgcmVxX212OiAlZCwgbWljYl9lbjogJWRcbiIsCi0JCSBfX2Z1bmNfXywgbWljYl9udW0sIFdDRF9WT1VUX0NUTF9UT19NSUNCKGN1cl92b3V0X2N0bCksCi0JCSByZXFfdm9sdCwgbWljYl9lbik7Ci0KLQlpZiAobWljYl9lbiA9PSAweDEpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweDNGLCByZXFfdm91dF9jdGwpOwotCi0JaWYgKG1pY2JfZW4gPT0gMHgxKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDQwKTsKLQkJLyoKLQkJICogQWRkIDJtcyBkZWxheSBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgYWZ0ZXIgZW5hYmxpbmcKLQkJICogbWljYmlhcwotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDIwMDAsIDIxMDApOwotCX0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+bWljYl9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9tYmhjX21pY2JfYWRqdXN0X3ZvbHRhZ2UpOwotCi0vKgotICogdGF2aWxfbWljYmlhc19jb250cm9sOiBlbmFibGUvZGlzYWJsZSBtaWNiaWFzCi0gKiBAY29kZWM6IGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKLSAqIEBtaWNiX251bTogbWljYmlhcyB0byBiZSBlbmFibGVkL2Rpc2FibGVkLCBlLmcuIG1pY2JpYXMxIG9yIG1pY2JpYXMyCi0gKiBAcmVxOiBjb250cm9sIHJlcXVlc3RlZCwgZW5hYmxlL2Rpc2FibGUgb3IgcHVsbHVwIGVuYWJsZS9kaXNhYmxlCi0gKiBAaXNfZGFwbTogdHJpZ2dlcmVkIGJ5IGRhcG0gb3Igbm90Ci0gKgotICogcmV0dXJuIDAgaWYgY29udHJvbCBpcyBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCB0YXZpbF9taWNiaWFzX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICBpbnQgbWljYl9udW0sIGludCByZXEsIGJvb2wgaXNfZGFwbSkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgbWljYl9pbmRleCA9IG1pY2JfbnVtIC0gMTsKLQl1MTYgbWljYl9yZWc7Ci0JaW50IHByZV9vZmZfZXZlbnQgPSAwLCBwb3N0X29mZl9ldmVudCA9IDA7Ci0JaW50IHBvc3Rfb25fZXZlbnQgPSAwLCBwb3N0X2RhcG1fb2ZmID0gMDsKLQlpbnQgcG9zdF9kYXBtX29uID0gMDsKLQotCWlmICgobWljYl9pbmRleCA8IDApIHx8IChtaWNiX2luZGV4ID4gVEFWSUxfTUFYX01JQ0JJQVMgLSAxKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogSW52YWxpZCBtaWNiaWFzIGluZGV4LCBtaWNiX2luZDolZFxuIiwKLQkJCV9fZnVuY19fLCBtaWNiX2luZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChtaWNiX251bSkgewotCWNhc2UgTUlDX0JJQVNfMToKLQkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCMTsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNfQklBU18yOgotCQltaWNiX3JlZyA9IFdDRDkzNFhfQU5BX01JQ0IyOwotCQlwcmVfb2ZmX2V2ZW50ID0gV0NEX0VWRU5UX1BSRV9NSUNCSUFTXzJfT0ZGOwotCQlwb3N0X29mZl9ldmVudCA9IFdDRF9FVkVOVF9QT1NUX01JQ0JJQVNfMl9PRkY7Ci0JCXBvc3Rfb25fZXZlbnQgPSBXQ0RfRVZFTlRfUE9TVF9NSUNCSUFTXzJfT047Ci0JCXBvc3RfZGFwbV9vbiA9IFdDRF9FVkVOVF9QT1NUX0RBUE1fTUlDQklBU18yX09OOwotCQlwb3N0X2RhcG1fb2ZmID0gV0NEX0VWRU5UX1BPU1RfREFQTV9NSUNCSUFTXzJfT0ZGOwotCQlicmVhazsKLQljYXNlIE1JQ19CSUFTXzM6Ci0JCW1pY2JfcmVnID0gV0NEOTM0WF9BTkFfTUlDQjM7Ci0JCWJyZWFrOwotCWNhc2UgTUlDX0JJQVNfNDoKLQkJbWljYl9yZWcgPSBXQ0Q5MzRYX0FOQV9NSUNCNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBudW1iZXI6ICVkXG4iLAotCQkJX19mdW5jX18sIG1pY2JfbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW11dGV4X2xvY2soJnRhdmlsLT5taWNiX2xvY2spOwotCi0Jc3dpdGNoIChyZXEpIHsKLQljYXNlIE1JQ0JfUFVMTFVQX0VOQUJMRToKLQkJdGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0rKzsKLQkJaWYgKCh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAxKSAmJgotCQkgICAgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDgwKTsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNCX1BVTExVUF9ESVNBQkxFOgotCQlpZiAodGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0gPiAwKQotCQkJdGF2aWwtPnB1bGx1cF9yZWZbbWljYl9pbmRleF0tLTsKLQkJaWYgKCh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA9PSAwKSAmJgotCQkgICAgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA9PSAwKSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNCX0VOQUJMRToKLQkJdGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdKys7Ci0JCWlmICh0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMSkgewotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4NDApOwotCQkJaWYgKHBvc3Rfb25fZXZlbnQgJiYgdGF2aWwtPm1iaGMpCi0JCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigKLQkJCQkJCSZ0YXZpbC0+bWJoYy0+bm90aWZpZXIsCi0JCQkJCQlwb3N0X29uX2V2ZW50LAotCQkJCQkJJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7Ci0JCX0KLQkJaWYgKGlzX2RhcG0gJiYgcG9zdF9kYXBtX29uICYmIHRhdmlsLT5tYmhjKQotCQkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdGF2aWwtPm1iaGMtPm5vdGlmaWVyLAotCQkJCQlwb3N0X2RhcG1fb24sICZ0YXZpbC0+bWJoYy0+d2NkX21iaGMpOwotCQlicmVhazsKLQljYXNlIE1JQ0JfRElTQUJMRToKLQkJaWYgKHRhdmlsLT5taWNiX3JlZlttaWNiX2luZGV4XSA+IDApCi0JCQl0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0tLTsKLQkJaWYgKCh0YXZpbC0+bWljYl9yZWZbbWljYl9pbmRleF0gPT0gMCkgJiYKLQkJICAgICh0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSA+IDApKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgbWljYl9yZWcsIDB4QzAsIDB4ODApOwotCQllbHNlIGlmICgodGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdID09IDApICYmCi0JCQkgKHRhdmlsLT5wdWxsdXBfcmVmW21pY2JfaW5kZXhdID09IDApKSB7Ci0JCQlpZiAocHJlX29mZl9ldmVudCAmJiB0YXZpbC0+bWJoYykKLQkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAotCQkJCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkJCXByZV9vZmZfZXZlbnQsCi0JCQkJCQkmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIG1pY2JfcmVnLCAweEMwLCAweDAwKTsKLQkJCWlmIChwb3N0X29mZl9ldmVudCAmJiB0YXZpbC0+bWJoYykKLQkJCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAotCQkJCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkJCXBvc3Rfb2ZmX2V2ZW50LAotCQkJCQkJJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7Ci0JCX0KLQkJaWYgKGlzX2RhcG0gJiYgcG9zdF9kYXBtX29mZiAmJiB0YXZpbC0+bWJoYykKLQkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkJcG9zdF9kYXBtX29mZiwgJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7Ci0JCWJyZWFrOwotCX07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWljYl9udW06JWQsIG1pY2JfcmVmOiAlZCwgcHVsbHVwX3JlZjogJWRcbiIsCi0JCV9fZnVuY19fLCBtaWNiX251bSwgdGF2aWwtPm1pY2JfcmVmW21pY2JfaW5kZXhdLAotCQl0YXZpbC0+cHVsbHVwX3JlZlttaWNiX2luZGV4XSk7Ci0KLQltdXRleF91bmxvY2soJnRhdmlsLT5taWNiX2xvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX21pY2JpYXNfY29udHJvbCk7Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkJaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlpbnQgbWljYl9udW07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogd25hbWU6ICVzLCBldmVudDogJWRcbiIsCi0JCV9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0KLQlpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpCi0JCW1pY2JfbnVtID0gTUlDX0JJQVNfMTsKLQllbHNlIGlmIChzdHJuc3RyKHctPm5hbWUsICJNSUMgQklBUzIiLCBzaXplb2YoIk1JQyBCSUFTMiIpKSkKLQkJbWljYl9udW0gPSBNSUNfQklBU18yOwotCWVsc2UgaWYgKHN0cm5zdHIody0+bmFtZSwgIk1JQyBCSUFTMyIsIHNpemVvZigiTUlDIEJJQVMzIikpKQotCQltaWNiX251bSA9IE1JQ19CSUFTXzM7Ci0JZWxzZSBpZiAoc3RybnN0cih3LT5uYW1lLCAiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpCi0JCW1pY2JfbnVtID0gTUlDX0JJQVNfNDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCS8qCi0JCSAqIE1JQyBCSUFTIGNhbiBhbHNvIGJlIHJlcXVlc3RlZCBieSBNQkhDLAotCQkgKiBzbyB1c2UgcmVmIGNvdW50IHRvIGhhbmRsZSBtaWNiaWFzIHB1bGx1cAotCQkgKiBhbmQgZW5hYmxlIHJlcXVlc3RzCi0JCSAqLwotCQl0YXZpbF9taWNiaWFzX2NvbnRyb2woY29kZWMsIG1pY2JfbnVtLCBNSUNCX0VOQUJMRSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQkvKiB3YWl0IGZvciBjbnAgdGltZSAqLwotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQl0YXZpbF9taWNiaWFzX2NvbnRyb2woY29kZWMsIG1pY2JfbnVtLCBNSUNCX0RJU0FCTEUsIHRydWUpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB0YXZpbF9jb2RlY19lbmFibGVfc3RhbmRhbG9uZV9taWNiaWFzIC0gZW5hYmxlIG1pY2JpYXMgc3RhbmRhbG9uZQotICogQGNvZGVjOiBwb2ludGVyIHRvIGNvZGVjIGluc3RhbmNlCi0gKiBAbWljYl9udW06IG51bWJlciBvZiBtaWNiaWFzIHRvIGJlIGVuYWJsZWQKLSAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlIG1pY2JpYXMgb3IgZmFsc2UgdG8gZGlzYWJsZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgbWljYmlhcyAoMSwgMiwgMyBvciA0KSBkdXJpbmcKLSAqIHN0YW5kYWxvbmUgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciBUWCB1c2UtY2FzZSBpcyBydW5uaW5nIG9yIG5vdAotICoKLSAqIFJldHVybjogZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgb3IgMCBmb3Igc3VjY2VzcwotICovCi1pbnQgdGF2aWxfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgaW50IG1pY2JfbnVtLAotCQkJCQkgIGJvb2wgZW5hYmxlKQotewotCWNvbnN0IGNoYXIgKiBjb25zdCBtaWNiX25hbWVzW10gPSB7Ci0JCURBUE1fTUlDQklBUzFfU1RBTkRBTE9ORSwgREFQTV9NSUNCSUFTMl9TVEFOREFMT05FLAotCQlEQVBNX01JQ0JJQVMzX1NUQU5EQUxPTkUsIERBUE1fTUlDQklBUzRfU1RBTkRBTE9ORQotCX07Ci0JaW50IG1pY2JfaW5kZXggPSBtaWNiX251bSAtIDE7Ci0JaW50IHJjOwotCi0JaWYgKCFjb2RlYykgewotCQlwcl9lcnIoIiVzOiBDb2RlYyBtZW1vcnkgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKG1pY2JfaW5kZXggPCAwKSB8fCAobWljYl9pbmRleCA+IFRBVklMX01BWF9NSUNCSUFTIC0gMSkpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgbWljYmlhcyBpbmRleCwgbWljYl9pbmQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgbWljYl9pbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChlbmFibGUpCi0JCXJjID0gc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oCi0JCQkJCQlzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKSwKLQkJCQkJCW1pY2JfbmFtZXNbbWljYl9pbmRleF0pOwotCWVsc2UKLQkJcmMgPSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyksCi0JCQkJCSAgICAgIG1pY2JfbmFtZXNbbWljYl9pbmRleF0pOwotCi0JaWYgKCFyYykKLQkJc25kX3NvY19kYXBtX3N5bmMoc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYykpOwotCWVsc2UKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1pY2JpYXMlZCBmb3JjZSAlcyBwaW4gZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIG1pY2JfbnVtLCAoZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpKTsKLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wodGF2aWxfY29kZWNfZW5hYmxlX3N0YW5kYWxvbmVfbWljYmlhcyk7Ci0KLXN0YXRpYyBpbnQgdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIGludCBldmVudCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGF2aWwtPnJlc21ncik7Ci0JCXRhdmlsX2NkY19tY2xrX2VuYWJsZShjb2RlYywgdHJ1ZSk7Ci0JCXJldCA9IF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BSRV9QTVUpOwotCQkvKiBXYWl0IGZvciAxbXMgZm9yIGJldHRlciBjbnAgKi8KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOwotCQl0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldCA9IF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgU05EX1NPQ19EQVBNX1BPU1RfUE1EKTsKLQkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhdmlsLT5yZXNtZ3IpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2VuYWJsZV9taWNiaWFzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSAgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0JcmV0dXJuIF9fdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXModywgZXZlbnQpOwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHRhdmlsX2hwaF9yZXNldF90YmxbXSA9IHsKLQl7IFdDRDkzNFhfSFBIX0NOUF9FTiwgMHg4MCB9LAotCXsgV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCwgMHg5QSB9LAotCXsgV0NEOTM0WF9IUEhfQ05QX1dHX1RJTUUsIDB4MTQgfSwKLQl7IFdDRDkzNFhfSFBIX09DUF9DVEwsIDB4MjggfSwKLQl7IFdDRDkzNFhfSFBIX0FVVE9fQ0hPUCwgMHgxNiB9LAotCXsgV0NEOTM0WF9IUEhfQ0hPUF9DVEwsIDB4ODMgfSwKLQl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4NDYgfSwKLQl7IFdDRDkzNFhfSFBIX1BBX0NUTDIsIDB4NTAgfSwKLQl7IFdDRDkzNFhfSFBIX0xfRU4sIDB4ODAgfSwKLQl7IFdDRDkzNFhfSFBIX0xfVEVTVCwgMHhFMCB9LAotCXsgV0NEOTM0WF9IUEhfTF9BVEVTVCwgMHg1MCB9LAotCXsgV0NEOTM0WF9IUEhfUl9FTiwgMHg4MCB9LAotCXsgV0NEOTM0WF9IUEhfUl9URVNULCAweEUwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9SX0FURVNULCAweDU0IH0sCi0JeyBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwxLCAweDk5IH0sCi0JeyBXQ0Q5MzRYX0hQSF9SREFDX0NMS19DVEwyLCAweDlCIH0sCi0JeyBXQ0Q5MzRYX0hQSF9SREFDX0xET19DVEwsIDB4MzMgfSwKLQl7IFdDRDkzNFhfSFBIX1JEQUNfQ0hPUF9DTEtfTFBfQ1RMLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9SRUZCVUZGX1VIUUFfQ1RMLCAweEE4IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB0YXZpbF9ocGhfcmVzZXRfdGJsXzFfMFtdID0gewotCXsgV0NEOTM0WF9IUEhfUkVGQlVGRl9MUF9DVEwsIDB4MEEgfSwKLQl7IFdDRDkzNFhfSFBIX0xfREFDX0NUTCwgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfUl9EQUNfQ1RMLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDIsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19BTkFfSFBIMywgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTCwgMHhBMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX1ZSRUZfQ1RMLCAweDEwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfT1ZFUlJJREVfQ1RMLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfTUlTQzEsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzEsIDB4MjIgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfTUlTQzIsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjEsIDB4RkUgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMiwgMHgyIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjMsIDB4NGV9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVI0LCAweDU0IH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzIsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUEFfUkRBQ19NSVNDMywgMHgwMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2UgdGF2aWxfaHBoX3Jlc2V0X3RibF8xXzFbXSA9IHsKLQl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDBFIH0sCi0JeyBXQ0Q5MzRYX0hQSF9MX0RBQ19DVEwsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX1JfREFDX0NUTCwgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfQU5BX0hQSDMsIDB4MDAgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCwgMHg0MCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVEwsIDB4ODEgfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19WUkVGX0NUTCwgMHgxMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX09WRVJSSURFX0NUTCwgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX01JU0MxLCAweDgxIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MxLCAweDIyIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQywgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLCAweEZFIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX0hQSF9USU1FUjIsIDB4MiB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIzLCAweDRlfSwKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSNCwgMHg1NCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9SREFDX01JU0MyLCAweDAwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX1JEQUNfTUlTQzMsIDB4MDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX3BhX2Rpc2FibGVbXSA9IHsKLQl7IFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgMHgzMCwgMHgxMCB9LCAvKiBSWDEgbXV0ZSBlbmFibGUgKi8KLQl7IFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NUTCwgMHgzMCwgMHgxMCB9LCAvKiBSWDIgbXV0ZSBlbmFibGUgKi8KLQl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwgLyogR00zIGJvb3N0IGRpc2FibGUgKi8KLQl7IFdDRDkzNFhfQU5BX0hQSCwgMHg4MCwgMHgwMCB9LCAvKiBIUEhMIFBBIGRpc2FibGUgKi8KLQl7IFdDRDkzNFhfQU5BX0hQSCwgMHg0MCwgMHgwMCB9LCAvKiBIUEhSIFBBIGRpc2FibGUgKi8KLQl7IFdDRDkzNFhfQU5BX0hQSCwgMHgyMCwgMHgwMCB9LCAvKiBIUEhMIFJFRiBkc2FibGUgKi8KLQl7IFdDRDkzNFhfQU5BX0hQSCwgMHgxMCwgMHgwMCB9LCAvKiBIUEhSIFJFRiBkaXNhYmxlICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9vY3BfZW5fc2VxW10gPSB7Ci0JeyBXQ0Q5MzRYX1JYX09DUF9DVEwsIDB4MEYsIDB4MDIgfSwgLyogT0NQIG51bWJlciBvZiBhdHRlbXB0cyBpcyAyICovCi0JeyBXQ0Q5MzRYX0hQSF9PQ1BfQ1RMLCAweEZBLCAweDNBIH0sIC8qIE9DUCBjdXJyZW50IGxpbWl0ICovCi0JeyBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSEwgT0NQICovCi0JeyBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSFIgT0NQICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9vY3BfZW5fc2VxXzFbXSA9IHsKLQl7IFdDRDkzNFhfUlhfT0NQX0NUTCwgMHgwRiwgMHgwMiB9LCAvKiBPQ1AgbnVtYmVyIG9mIGF0dGVtcHRzIGlzIDIgKi8KLQl7IFdDRDkzNFhfSFBIX09DUF9DVEwsIDB4RkEsIDB4M0EgfSwgLyogT0NQIGN1cnJlbnQgbGltaXQgKi8KLX07Ci0KLS8qIExPLUhJRkkgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbXSA9IHsKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgMHgwMiwgMHgwMCB9LAotCXsgV0NEOTM0WF9GTFlCQUNLX1ZORUdfQ1RSTF80LCAweGYwLCAweDgwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1BBX01JU0MyLCAweDIwLCAweDIwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsIDB4ZjAsIDB4NDAgfSwKLQl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsIDB4ZjAsIDB4YzAgfSwKLQl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4MGUsIDB4MDIgfSwKLQl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDA2IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9wcmVfcGFfZW5bXSA9IHsKLQl7IFdDRDkzNFhfSFBIX05FV19JTlRfSFBIX1RJTUVSMSwgMHgwMiwgMHgwMCB9LAotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9QQV9NSVNDMiwgMHgyMCwgMHgwIH0sCi0JeyBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwsIDB4ZjAsIDB4NDAgfSwKLQl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4MDAgfSwKLQl7IFdDRDkzNFhfUlhfQklBU19IUEhfTE9XUE9XRVIsIDB4ZjAsIDB4ODAgfSwKLQl7IFdDRDkzNFhfSFBIX1BBX0NUTDEsIDB4MGUsIDB4MDYgfSwKLQl7IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMLCAweDA2LCAweDA2IH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9wb3N0X3BhX2VuW10gPSB7Ci0JeyBXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSEwgT0NQICovCi0JeyBXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDB4MDEgfSwgLyogRW5hYmxlIEhQSFIgT0NQICovCi0JeyBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsIDB4MzAsIDB4MjAgfSwgLyogUlgxIG11dGUgZGlzYWJsZSAqLwotCXsgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMLCAweDMwLCAweDIwIH0sIC8qIFJYMiBtdXRlIGRpc2FibGUgKi8KLQl7IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwsIDB4ODAsIDB4ODAgfSwgLyogR00zIGJvb3N0IGVuYWJsZSAqLwotCXsgV0NEOTM0WF9IUEhfTkVXX0lOVF9IUEhfVElNRVIxLCAweDAyLCAweDAyIH0sCi19OwotCi1zdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19ocGhfcmVnX3JhbmdlX3JlYWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1OCAqYnVmKQotewotCXJlZ21hcF9idWxrX3JlYWQobWFwLCBXQ0Q5MzRYX0hQSF9DTlBfRU4sIGJ1ZiwgVEFWSUxfSFBIX1JFR19SQU5HRV8xKTsKLQlyZWdtYXBfYnVsa19yZWFkKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0FOQV9IUEgyLAotCQkJIGJ1ZiArIFRBVklMX0hQSF9SRUdfUkFOR0VfMSwgVEFWSUxfSFBIX1JFR19SQU5HRV8yKTsKLQlyZWdtYXBfYnVsa19yZWFkKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0dBSU5fQ1RMLAotCQkJIGJ1ZiArIFRBVklMX0hQSF9SRUdfUkFOR0VfMSArIFRBVklMX0hQSF9SRUdfUkFOR0VfMiwKLQkJCSBUQVZJTF9IUEhfUkVHX1JBTkdFXzMpOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19ocGhfcmVnX3JlY292ZXIoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAotCQkJCQlzdHJ1Y3QgcmVnbWFwICptYXAsIGludCBwYV9zdGF0dXMpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQotCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCQkgICAgIFdDRF9FVkVOVF9PQ1BfT0ZGLAotCQkJCSAgICAgJnRhdmlsLT5tYmhjLT53Y2RfbWJoYyk7Ci0KLQlpZiAocGFfc3RhdHVzICYgMHhDMCkKLQkJZ290byBwYV9lbl9yZXN0b3JlOwotCi0JZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IEhQSCBQQSBpbiBkaXNhYmxlIHN0YXRlICgweCV4KVxuIiwKLQkJX19mdW5jX18sIHBhX3N0YXR1cyk7Ci0KLQlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NUTCwgMHgxMCwgMHgxMCk7Ci0JcmVnbWFwX3dyaXRlX2JpdHMobWFwLCBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DVEwsIDB4MTAsIDB4MTApOwotCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9BTkFfSFBILCAweEMwLCAweDAwKTsKLQlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQU5BX0hQSCwgMHgzMCwgMHgwMCk7Ci0JcmVnbWFwX3dyaXRlX2JpdHMobWFwLCBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DVEwsIDB4MTAsIDB4MDApOwotCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9DRENfUlgyX1JYX1BBVEhfQ1RMLCAweDEwLCAweDAwKTsKLQotCS8qIFJlc3RvcmUgdG8gSFcgZGVmYXVsdHMgKi8KLQlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKG1hcCwgdGF2aWxfaHBoX3Jlc2V0X3RibCwKLQkJCSAgICAgICBBUlJBWV9TSVpFKHRhdmlsX2hwaF9yZXNldF90YmwpKTsKLQlpZiAoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8xLAotCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzEpKTsKLQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8wLAotCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzApKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX29jcF9lbl9zZXEpOyBpKyspCi0JCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgdGF2aWxfb2NwX2VuX3NlcVtpXS5yZWcsCi0JCQkJICB0YXZpbF9vY3BfZW5fc2VxW2ldLm1hc2ssCi0JCQkJICB0YXZpbF9vY3BfZW5fc2VxW2ldLnZhbCk7Ci0JZ290byBlbmQ7Ci0KLQotcGFfZW5fcmVzdG9yZToKLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogSFBIIFBBIGluIGVuYWJsZSBzdGF0ZSAoMHgleClcbiIsCi0JCV9fZnVuY19fLCBwYV9zdGF0dXMpOwotCi0JLyogRGlzYWJsZSBQQSBhbmQgb3RoZXIgcmVnaXN0ZXJzIGJlZm9yZSByZXN0b3JpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9wYV9kaXNhYmxlKTsgaSsrKSB7Ci0JCWlmIChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpICYmCi0JCSAgICAodGF2aWxfcGFfZGlzYWJsZVtpXS5yZWcgPT0gV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCkpCi0JCQljb250aW51ZTsKLQkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9wYV9kaXNhYmxlW2ldLnJlZywKLQkJCQkgIHRhdmlsX3BhX2Rpc2FibGVbaV0ubWFzaywKLQkJCQkgIHRhdmlsX3BhX2Rpc2FibGVbaV0udmFsKTsKLQl9Ci0KLQlyZWdtYXBfbXVsdGlfcmVnX3dyaXRlKG1hcCwgdGF2aWxfaHBoX3Jlc2V0X3RibCwKLQkJCSAgICAgICBBUlJBWV9TSVpFKHRhdmlsX2hwaF9yZXNldF90YmwpKTsKLQlpZiAoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8xLAotCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzEpKTsKLQlpZiAoVEFWSUxfSVNfMV8wKHRhdmlsLT53Y2Q5eHh4KSkKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZShtYXAsIHRhdmlsX2hwaF9yZXNldF90YmxfMV8wLAotCQkJCUFSUkFZX1NJWkUodGF2aWxfaHBoX3Jlc2V0X3RibF8xXzApKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX29jcF9lbl9zZXFfMSk7IGkrKykKLQkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9vY3BfZW5fc2VxXzFbaV0ucmVnLAotCQkJCSAgdGF2aWxfb2NwX2VuX3NlcV8xW2ldLm1hc2ssCi0JCQkJICB0YXZpbF9vY3BfZW5fc2VxXzFbaV0udmFsKTsKLQotCWlmICh0YXZpbC0+aHBoX21vZGUgPT0gQ0xTX0hfTE9ISUZJKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3ByZV9wYV9lbl9sb2hpZmkpOyBpKyspIHsKLQkJCXJlZyA9IHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbaV0ucmVnOwotCQkJaWYgKChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpKSAmJgotCQkJICAgICgocmVnID09IFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19HQUlOX0NUTCkgfHwKLQkJCSAgICAgKHJlZyA9PSBXQ0Q5MzRYX0hQSF9DTlBfV0dfQ1RMKSB8fAotCQkJICAgICAocmVnID09IFdDRDkzNFhfSFBIX1JFRkJVRkZfTFBfQ1RMKSkpCi0JCQkJY29udGludWU7Ci0JCQlyZWdtYXBfd3JpdGVfYml0cyhtYXAsCi0JCQkJCSAgdGF2aWxfcHJlX3BhX2VuX2xvaGlmaVtpXS5yZWcsCi0JCQkJCSAgdGF2aWxfcHJlX3BhX2VuX2xvaGlmaVtpXS5tYXNrLAotCQkJCQkgIHRhdmlsX3ByZV9wYV9lbl9sb2hpZmlbaV0udmFsKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3ByZV9wYV9lbik7IGkrKykgewotCQkJcmVnID0gdGF2aWxfcHJlX3BhX2VuW2ldLnJlZzsKLQkJCWlmICgoVEFWSUxfSVNfMV8xKHRhdmlsLT53Y2Q5eHh4KSkgJiYKLQkJCSAgICAoKHJlZyA9PSBXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfR0FJTl9DVEwpIHx8Ci0JCQkgICAgIChyZWcgPT0gV0NEOTM0WF9IUEhfQ05QX1dHX0NUTCkgfHwKLQkJCSAgICAgKHJlZyA9PSBXQ0Q5MzRYX0hQSF9SRUZCVUZGX0xQX0NUTCkpKQotCQkJCWNvbnRpbnVlOwotCQkJcmVnbWFwX3dyaXRlX2JpdHMobWFwLCB0YXZpbF9wcmVfcGFfZW5baV0ucmVnLAotCQkJCQkgIHRhdmlsX3ByZV9wYV9lbltpXS5tYXNrLAotCQkJCQkgIHRhdmlsX3ByZV9wYV9lbltpXS52YWwpOwotCQl9Ci0JfQotCi0JaWYgKFRBVklMX0lTXzFfMSh0YXZpbC0+d2NkOXh4eCkpIHsKLQkJcmVnbWFwX3dyaXRlKG1hcCwgV0NEOTM0WF9IUEhfTkVXX0lOVF9SREFDX0hEMl9DVExfTCwgMHg4NCk7Ci0JCXJlZ21hcF93cml0ZShtYXAsIFdDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMX1IsIDB4ODQpOwotCX0KLQotCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgV0NEOTM0WF9BTkFfSFBILCAweDBDLCBwYV9zdGF0dXMgJiAweDBDKTsKLQlyZWdtYXBfd3JpdGVfYml0cyhtYXAsIFdDRDkzNFhfQU5BX0hQSCwgMHgzMCwgMHgzMCk7Ci0JLyogd2FpdCBmb3IgMTAwdXNlYyBhZnRlciBIUEggREFDIGlzIGVuYWJsZWQgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCXJlZ21hcF93cml0ZShtYXAsIFdDRDkzNFhfQU5BX0hQSCwgcGFfc3RhdHVzKTsKLQkvKiBTbGVlcCBmb3IgN21zZWMgYWZ0ZXIgUEEgaXMgZW5hYmxlZCAqLwotCXVzbGVlcF9yYW5nZSg3MDAwLCA3MTAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX3Bvc3RfcGFfZW4pOyBpKyspIHsKLQkJaWYgKChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpKSAmJgotCQkgICAgKHRhdmlsX3Bvc3RfcGFfZW5baV0ucmVnID09IFdDRDkzNFhfSFBIX0NOUF9XR19DVEwpKQotCQkJY29udGludWU7Ci0JCXJlZ21hcF93cml0ZV9iaXRzKG1hcCwgdGF2aWxfcG9zdF9wYV9lbltpXS5yZWcsCi0JCQkJICB0YXZpbF9wb3N0X3BhX2VuW2ldLm1hc2ssCi0JCQkJICB0YXZpbF9wb3N0X3BhX2VuW2ldLnZhbCk7Ci0JfQotCi1lbmQ6Ci0JdGF2aWwtPm1iaGMtPmlzX2hwaF9yZWNvdmVyID0gdHJ1ZTsKLQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKAotCQkJJnRhdmlsLT5tYmhjLT5ub3RpZmllciwKLQkJCVdDRF9FVkVOVF9PQ1BfT04sCi0JCQkmdGF2aWwtPm1iaGMtPndjZF9tYmhjKTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9jb2RlY19yZXNldF9ocGhfcmVnaXN0ZXJzKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXU4IGNhY2hlX3ZhbFtUQVZJTF9IUEhfVE9UQUxfUkVHXTsKLQl1OCBod192YWxbVEFWSUxfSFBIX1RPVEFMX1JFR107Ci0JaW50IHBhX3N0YXR1czsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyh3Y2Q5eHh4LT5kZXYsICIlczogZXZlbnQ6ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCW1lbXNldChjYWNoZV92YWwsIDAsIFRBVklMX0hQSF9UT1RBTF9SRUcpOwotCQltZW1zZXQoaHdfdmFsLCAwLCBUQVZJTF9IUEhfVE9UQUxfUkVHKTsKLQotCQlyZWdtYXBfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQU5BX0hQSCwgJnBhX3N0YXR1cyk7Ci0KLQkJdGF2aWxfY29kZWNfaHBoX3JlZ19yYW5nZV9yZWFkKHdjZDl4eHgtPnJlZ21hcCwgY2FjaGVfdmFsKTsKLQotCQkvKiBSZWFkIHJlZ2lzdGVyIHZhbHVlcyBmcm9tIEhXIGRpcmVjdGx5ICovCi0JCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyh3Y2Q5eHh4LT5yZWdtYXAsIHRydWUpOwotCQl0YXZpbF9jb2RlY19ocGhfcmVnX3JhbmdlX3JlYWQod2NkOXh4eC0+cmVnbWFwLCBod192YWwpOwotCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3Mod2NkOXh4eC0+cmVnbWFwLCBmYWxzZSk7Ci0KLQkJLyogY29tcGFyZSBib3RoIHRoZSByZWdpc3RlcnMgdG8ga25vdyBpZiB0aGVyZSBpcyBjb3JydXB0aW9uICovCi0JCXJldCA9IG1lbWNtcChjYWNoZV92YWwsIGh3X3ZhbCwgVEFWSUxfSFBIX1RPVEFMX1JFRyk7Ci0KLQkJLyogSWYgYm90aCB0aGUgdmFsdWVzIGFyZSBzYW1lLCBpdCBtZWFucyBubyBjb3JydXB0aW9uICovCi0JCWlmIChyZXQpIHsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjYWNoZSBhbmQgaHcgcmVnIGFyZSBub3Qgc2FtZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQl0YXZpbF9jb2RlY19ocGhfcmVnX3JlY292ZXIodGF2aWwsIHdjZDl4eHgtPnJlZ21hcCwKLQkJCQkJCSAgICBwYV9zdGF0dXMpOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGNhY2hlIGFuZCBodyByZWcgYXJlIHNhbWVcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJdGF2aWwtPm1iaGMtPmlzX2hwaF9yZWNvdmVyID0gZmFsc2U7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOwotCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JLyogSUlSIGZpbHRlciBiYW5kIHJlZ2lzdGVycyBhcmUgYXQgaW50ZWdlciBtdWx0aXBsZXMgb2YgMTYgKi8KLQl1MTYgaWlyX3JlZyA9IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKHNuZF9zb2NfcmVhZChjb2RlYywgaWlyX3JlZykgJgotCQkJCQkgICAgKDEgPDwgYmFuZF9pZHgpKSAhPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKLQkJaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0JaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlib29sIGlpcl9iYW5kX2VuX3N0YXR1czsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1MTYgaWlyX3JlZyA9IFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NUTCArIDE2ICogaWlyX2lkeDsKLQotCS8qIE1hc2sgZmlyc3QgNSBiaXRzLCA2LTggYXJlIHJlc2VydmVkICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgaWlyX3JlZywgKDEgPDwgYmFuZF9pZHgpLAotCQkJICAgICh2YWx1ZSA8PCBiYW5kX2lkeCkpOwotCi0JaWlyX2JhbmRfZW5fc3RhdHVzID0gKChzbmRfc29jX3JlYWQoY29kZWMsIGlpcl9yZWcpICYKLQkJCSAgICAgICgxIDw8IGJhbmRfaWR4KSkgIT0gMCk7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IElJUiAjJWQgYmFuZCAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKLQkJaWlyX2lkeCwgYmFuZF9pZHgsIGlpcl9iYW5kX2VuX3N0YXR1cyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBnZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCi0JCQkJICAgaW50IGNvZWZmX2lkeCkKLXsKLQl1aW50MzJfdCB2YWx1ZSA9IDA7Ci0KLQkvKiBBZGRyZXNzIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlIGlmIHJlYWRpbmcgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCi0JCSogc2l6ZW9mKHVpbnQzMl90KSkgJiAweDdGKTsKLQotCXZhbHVlIHw9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSk7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCi0JCSogc2l6ZW9mKHVpbnQzMl90KSArIDEpICYgMHg3Rik7Ci0KLQl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJICAgICAgIChXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCi0JCQkJMTYgKiBpaXJfaWR4KSkgPDwgOCk7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkoKGJhbmRfaWR4ICogQkFORF9NQVggKyBjb2VmZl9pZHgpCi0JCSogc2l6ZW9mKHVpbnQzMl90KSArIDIpICYgMHg3Rik7Ci0KLQl2YWx1ZSB8PSAoc25kX3NvY19yZWFkKGNvZGVjLAotCQkJICAgICAgIChXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9DT0VGX0IyX0NUTCArCi0JCQkJMTYgKiBpaXJfaWR4KSkgPDwgMTYpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjFfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKChiYW5kX2lkeCAqIEJBTkRfTUFYICsgY29lZmZfaWR4KQotCQkqIHNpemVvZih1aW50MzJfdCkgKyAzKSAmIDB4N0YpOwotCi0JLyogTWFzayBiaXRzIHRvcCAyIGJpdHMgc2luY2UgdGhleSBhcmUgcmVzZXJ2ZWQgKi8KLQl2YWx1ZSB8PSAoKHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKwotCQkJCSAxNiAqIGlpcl9pZHgpKSAmIDB4M0YpIDw8IDI0KTsKLQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCWludCBpaXJfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0JaW50IGJhbmRfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMCk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCAxKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9Ci0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDIpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0KLQkJZ2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwgMyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0gPQotCQlnZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LCA0KTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCi0JCV9fZnVuY19fLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJKHVpbnQzMl90KXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCSh1aW50MzJfdCl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSwKLQkJX19mdW5jX18sIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkodWludDMyX3QpdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfaWlyX2JhbmRfY29lZmYoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBpaXJfaWR4LCBpbnQgYmFuZF9pZHgsCi0JCQkgICAgICAgdWludDMyX3QgdmFsdWUpCi17Ci0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKHZhbHVlICYgMHhGRikpOwotCi0Jc25kX3NvY193cml0ZShjb2RlYywKLQkJKFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0NPRUZfQjJfQ1RMICsgMTYgKiBpaXJfaWR4KSwKLQkJKHZhbHVlID4+IDgpICYgMHhGRik7Ci0KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0KLQkvKiBNYXNrIHRvcCAyIGJpdHMsIDctOCBhcmUgcmVzZXJ2ZWQgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMl9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkodmFsdWUgPj4gMjQpICYgMHgzRik7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgaWlyX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOwotCWludCBiYW5kX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JaW50IGNvZWZmX2lkeDsKLQotCS8qCi0JICogTWFzayB0b3AgYml0IGl0IGlzIHJlc2VydmVkCi0JICogVXBkYXRlcyBhZGRyIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggQjIgd3JpdGUKLQkgKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkoYmFuZF9pZHggKiBCQU5EX01BWCAqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7Ci0KLQkvKiBTdG9yZSB0aGUgY29lZmZpY2llbnRzIGluIHNpZGV0b25lIGNvZWZmIGFycmF5ICovCi0JZm9yIChjb2VmZl9pZHggPSAwOyBjb2VmZl9pZHggPCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfQ09FRkZfTUFYOwotCQljb2VmZl9pZHgrKykgewotCQl0YXZpbC0+c2lkZXRvbmVfY29lZmZfYXJyYXlbaWlyX2lkeF1bYmFuZF9pZHhdW2NvZWZmX2lkeF0gPQotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbY29lZmZfaWR4XTsKLQkJc2V0X2lpcl9iYW5kX2NvZWZmKGNvZGVjLCBpaXJfaWR4LCBiYW5kX2lkeCwKLQkJCXRhdmlsLT5zaWRldG9uZV9jb2VmZl9hcnJheVtpaXJfaWR4XVtiYW5kX2lkeF0KLQkJCQkJCQlbY29lZmZfaWR4XSk7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGIwID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYjEgPSAweCV4XG4iCi0JCSIlczogSUlSICMlZCBiYW5kICMlZCBiMiA9IDB4JXhcbiIKLQkJIiVzOiBJSVIgIyVkIGJhbmQgIyVkIGExID0gMHgleFxuIgotCQkiJXM6IElJUiAjJWQgYmFuZCAjJWQgYTIgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDApLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDEpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDIpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDMpLAotCQlfX2Z1bmNfXywgaWlyX2lkeCwgYmFuZF9pZHgsCi0JCWdldF9paXJfYmFuZF9jb2VmZihjb2RlYywgaWlyX2lkeCwgYmFuZF9pZHgsIDQpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfcmVzdG9yZV9paXJfY29lZmYoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLCBpbnQgaWlyX2lkeCkKLXsKLQlpbnQgYmFuZF9pZHggPSAwLCBjb2VmZl9pZHggPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhdmlsLT5jb2RlYzsKLQotCS8qCi0JICogc25kX3NvY193cml0ZSBjYWxsIGNyYXNoZXMgYXQgcm1tb2QgaWYgdGhlcmUgaXMgbm8gbWFjaGluZQotCSAqIGRyaXZlciBhbmQgaGVuY2Ugbm8gY29kZWMgcG9pbnRlciBhdmFpbGFibGUKLQkgKi8KLQlpZiAoIWNvZGVjKQotCQlyZXR1cm47Ci0KLQlmb3IgKGJhbmRfaWR4ID0gMDsgYmFuZF9pZHggPCBCQU5EX01BWDsgYmFuZF9pZHgrKykgewotCQlzbmRfc29jX3dyaXRlKGNvZGVjLAotCQkoV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfQ09FRl9CMV9DVEwgKyAxNiAqIGlpcl9pZHgpLAotCQkoYmFuZF9pZHggKiBCQU5EX01BWCAqIHNpemVvZih1aW50MzJfdCkpICYgMHg3Rik7Ci0KLQkJZm9yIChjb2VmZl9pZHggPSAwOwotCQkJY29lZmZfaWR4IDwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0NPRUZGX01BWDsKLQkJCWNvZWZmX2lkeCsrKSB7Ci0JCQlzZXRfaWlyX2JhbmRfY29lZmYoY29kZWMsIGlpcl9pZHgsIGJhbmRfaWR4LAotCQkJCXRhdmlsLT5zaWRldG9uZV9jb2VmZl9hcnJheVtpaXJfaWR4XVtiYW5kX2lkeF0KLQkJCQkJCQkJW2NvZWZmX2lkeF0pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvbXBhbmRlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0KLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlpbnQgY29tcCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCSAgICBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+Y29tcF9lbmFibGVkW2NvbXBdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NvbXBhbmRlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGNvbXAgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkgICAga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDb21wYW5kZXIgJWQgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKLQkJIF9fZnVuY19fLCBjb21wICsgMSwgdGF2aWwtPmNvbXBfZW5hYmxlZFtjb21wXSwgdmFsdWUpOwotCXRhdmlsLT5jb21wX2VuYWJsZWRbY29tcF0gPSB2YWx1ZTsKLQotCS8qIEFueSBzcGVjaWZpYyByZWdpc3RlciBjb25maWd1cmF0aW9uIGZvciBjb21wYW5kZXIgKi8KLQlzd2l0Y2ggKGNvbXApIHsKLQljYXNlIENPTVBBTkRFUl8xOgotCQkvKiBTZXQgR2FpbiBTb3VyY2UgU2VsZWN0IGJhc2VkIG9uIGNvbXBhbmRlciBlbmFibGUvZGlzYWJsZSAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9MX0VOLCAweDIwLAotCQkJCSh2YWx1ZSA/IDB4MDA6MHgyMCkpOwotCQlicmVhazsKLQljYXNlIENPTVBBTkRFUl8yOgotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0hQSF9SX0VOLCAweDIwLAotCQkJCSh2YWx1ZSA/IDB4MDA6MHgyMCkpOwotCQlicmVhazsKLQljYXNlIENPTVBBTkRFUl8zOgotCWNhc2UgQ09NUEFOREVSXzQ6Ci0JY2FzZSBDT01QQU5ERVJfNzoKLQljYXNlIENPTVBBTkRFUl84OgotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKgotCQkgKiBpZiBjb21wYW5kZXIgaXMgbm90IGVuYWJsZWQgZm9yIGFueSBpbnRlcnBvbGF0b3IsCi0JCSAqIGl0IGRvZXMgbm90IGNhdXNlIGFueSBhdWRpbyBmYWlsdXJlLCBzbyBkbyBub3QKLQkJICogcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSwgYnV0IGp1c3QgcHJpbnQgYSBsb2cKLQkJICovCi0JCWRldl93YXJuKGNvZGVjLT5kZXYsICIlczogdW5rbm93biBjb21wYW5kZXI6ICVkXG4iLAotCQkJX19mdW5jX18sIGNvbXApOwotCX07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaHBoX2FzcmNfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGluZGV4ID0gLUVJTlZBTDsKLQotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQVNSQzAgT3V0cHV0IE1vZGUiKSkKLQkJaW5kZXggPSBBU1JDMDsKLQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFTUkMxIE91dHB1dCBNb2RlIikpCi0JCWluZGV4ID0gQVNSQzE7Ci0KLQlpZiAodGF2aWwgJiYgKGluZGV4ID49IDApICYmIChpbmRleCA8IEFTUkNfTUFYKSkKLQkJdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbaW5kZXhdID0KLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaHBoX2FzcmNfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHZhbCA9IDA7Ci0JaW50IGluZGV4ID0gLUVJTlZBTDsKLQotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQVNSQzAgT3V0cHV0IE1vZGUiKSkKLQkJaW5kZXggPSBBU1JDMDsKLQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFTUkMxIE91dHB1dCBNb2RlIikpCi0JCWluZGV4ID0gQVNSQzE7Ci0KLQlpZiAodGF2aWwgJiYgKGluZGV4ID49IDApICYmIChpbmRleCA8IEFTUkNfTUFYKSkKLQkJdmFsID0gdGF2aWwtPmFzcmNfb3V0cHV0X21vZGVbaW5kZXhdOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9ocGhfaWRsZV9kZXRlY3RfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHZhbCA9IDA7Ci0KLQlpZiAodGF2aWwpCi0JCXZhbCA9IHRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfZGV0ZWN0X2VuOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9ocGhfaWRsZV9kZXRlY3RfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlpZiAodGF2aWwpCi0JCXRhdmlsLT5pZGxlX2RldF9jZmcuaHBoX2lkbGVfZGV0ZWN0X2VuID0KLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfZG1pY19waW5fbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JdTE2IGRtaWNfcGluOwotCXU4IHJlZ192YWwsIHBpbmN0bF9wb3NpdGlvbjsKLQotCXBpbmN0bF9wb3NpdGlvbiA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0KLQlkbWljX3BpbiA9IHBpbmN0bF9wb3NpdGlvbiAmIDB4MDc7Ci0JcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywKLQkJCVdDRDkzNFhfVExNTV9ETUlDMV9DTEtfUElOQ0ZHICsgZG1pY19waW4gLSAxKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gISFyZWdfdmFsOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTE2IGN0bF9yZWcsIGNmZ19yZWcsIGRtaWNfcGluOwotCXU4IGN0bF92YWwsIGNmZ192YWwsIHBpbmN0bF9wb3NpdGlvbiwgcGluY3RsX21vZGUsIG1hc2s7Ci0KLQkvKiAwLSBoaWdoIG9yIGxvdzsgMS0gaGlnaCBaICovCi0JcGluY3RsX21vZGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlwaW5jdGxfcG9zaXRpb24gPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0Jc3dpdGNoIChwaW5jdGxfcG9zaXRpb24gPj4gMykgewotCWNhc2UgMDoKLQkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzE7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJY3RsX3JlZyA9IFdDRDkzNFhfVEVTVF9ERUJVR19QSU5fQ1RMX09FXzM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIHBpbmN0bCBwb3NpdGlvbiA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBpbmN0bF9wb3NpdGlvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN0bF92YWwgPSB+KHBpbmN0bF9tb2RlIDw8IChwaW5jdGxfcG9zaXRpb24gJiAweDA3KSk7Ci0JbWFzayA9IDEgPDwgKHBpbmN0bF9wb3NpdGlvbiAmIDB4MDcpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGN0bF9yZWcsIG1hc2ssIGN0bF92YWwpOwotCi0JZG1pY19waW4gPSBwaW5jdGxfcG9zaXRpb24gJiAweDA3OwotCWNmZ19yZWcgPSBXQ0Q5MzRYX1RMTU1fRE1JQzFfQ0xLX1BJTkNGRyArIGRtaWNfcGluIC0gMTsKLQlpZiAocGluY3RsX21vZGUpIHsKLQkJaWYgKHRhdmlsLT5pbnRmX3R5cGUgPT0gV0NEOVhYWF9JTlRFUkZBQ0VfVFlQRV9TTElNQlVTKQotCQkJY2ZnX3ZhbCA9IDB4NjsKLQkJZWxzZQotCQkJY2ZnX3ZhbCA9IDB4RDsKLQl9IGVsc2UKLQkJY2ZnX3ZhbCA9IDA7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgY2ZnX3JlZywgMHgxRiwgY2ZnX3ZhbCk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogcmVnPTB4JXggbWFzaz0weCV4IHZhbD0lZCByZWc9MHgleCB2YWw9JWRcbiIsCi0JCQlfX2Z1bmNfXywgY3RsX3JlZywgbWFzaywgY3RsX3ZhbCwgY2ZnX3JlZywgY2ZnX3ZhbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9hbWljX3B3cl9sdmxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0JdTE2IGFtaWNfcmVnID0gMDsKLQotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18xXzIgUFdSIE1PREUiKSkKLQkJYW1pY19yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMTsKLQlpZiAoIXN0cmNtcChrY29udHJvbC0+aWQubmFtZSwgIkFNSUNfM180IFBXUiBNT0RFIikpCi0JCWFtaWNfcmVnID0gV0NEOTM0WF9BTkFfQU1JQzM7Ci0KLQlpZiAoYW1pY19yZWcpCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJCShzbmRfc29jX3JlYWQoY29kZWMsIGFtaWNfcmVnKSAmCi0JCQkgV0NEOTM0WF9BTUlDX1BXUl9MVkxfTUFTSykgPj4KLQkJCSAgV0NEOTM0WF9BTUlDX1BXUl9MVkxfU0hJRlQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfYW1pY19wd3JfbHZsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXUzMiBtb2RlX3ZhbDsKLQl1MTYgYW1pY19yZWcgPSAwOwotCi0JbW9kZV92YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVkXG4iLCBfX2Z1bmNfXywgbW9kZV92YWwpOwotCi0JaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUsICJBTUlDXzFfMiBQV1IgTU9ERSIpKQotCQlhbWljX3JlZyA9IFdDRDkzNFhfQU5BX0FNSUMxOwotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lLCAiQU1JQ18zXzQgUFdSIE1PREUiKSkKLQkJYW1pY19yZWcgPSBXQ0Q5MzRYX0FOQV9BTUlDMzsKLQotCWlmIChhbWljX3JlZykKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgYW1pY19yZWcsIFdDRDkzNFhfQU1JQ19QV1JfTFZMX01BU0ssCi0JCQkJICAgIG1vZGVfdmFsIDw8IFdDRDkzNFhfQU1JQ19QV1JfTFZMX1NISUZUKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhdmlsX2Nvbm5fbWFkX3RleHRbXSA9IHsKLQkiTk9UVVNFRDEiLCAiQURDMSIsICJBREMyIiwgIkFEQzMiLCAiQURDNCIsICJOT1RVU0VENSIsCi0JIk5PVFVTRUQ2IiwgIk5PVFVTRUQyIiwgIkRNSUMwIiwgIkRNSUMxIiwgIkRNSUMyIiwgIkRNSUMzIiwKLQkiRE1JQzQiLCAiRE1JQzUiLCAiTk9UVVNFRDMiLCAiTk9UVVNFRDQiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHRhdmlsX2Nvbm5fbWFkX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRSh0YXZpbF9jb25uX21hZF90ZXh0KSwKLQkJCSAgICB0YXZpbF9jb25uX21hZF90ZXh0KTsKLQotc3RhdGljIGludCB0YXZpbF9tYWRfaW5wdXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXU4IHRhdmlsX21hZF9pbnB1dDsKLQotCXRhdmlsX21hZF9pbnB1dCA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9TT0NfTUFEX0lOUF9TRUwpICYgMHgwRjsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhdmlsX21hZF9pbnB1dDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB0YXZpbF9tYWRfaW5wdXQgPSAlc1xuIiwgX19mdW5jX18sCi0JCXRhdmlsX2Nvbm5fbWFkX3RleHRbdGF2aWxfbWFkX2lucHV0XSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9tYWRfaW5wdXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0JdTggdGF2aWxfbWFkX2lucHV0OwotCWNoYXIgbWFkX2FtaWNfaW5wdXRfd2lkZ2V0WzZdOwotCWNvbnN0IGNoYXIgKm1hZF9pbnB1dF93aWRnZXQ7Ci0JY29uc3QgY2hhciAqc291cmNlX3dpZGdldCA9IE5VTEw7Ci0JdTMyIGFkYywgaSwgbWljX2JpYXNfZm91bmQgPSAwOwotCWludCByZXQgPSAwOwotCWNoYXIgKm1hZF9pbnB1dDsKLQlib29sIGlzX2FkY19pbnB1dCA9IGZhbHNlOwotCi0JdGF2aWxfbWFkX2lucHV0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAodGF2aWxfbWFkX2lucHV0ID49IHNpemVvZih0YXZpbF9jb25uX21hZF90ZXh0KS8KLQkgICAgc2l6ZW9mKHRhdmlsX2Nvbm5fbWFkX3RleHRbMF0pKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogdGF2aWxfbWFkX2lucHV0ID0gJWQgb3V0IG9mIGJvdW5kc1xuIiwKLQkJCV9fZnVuY19fLCB0YXZpbF9tYWRfaW5wdXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RybnN0cih0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF0sICJOT1RVU0VEIiwKLQkJCQlzaXplb2YoIk5PVFVTRUQiKSkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJIiVzOiBVbnN1cHBvcnRlZCB0YXZpbF9tYWRfaW5wdXQgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCB0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF0pOwotCQkvKiBNYWtlIHN1cmUgdGhlIE1BRCByZWdpc3RlciBpcyB1cGRhdGVkICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01BRF9TRVRVUCwKLQkJCQkgICAgMHg4OCwgMHgwMCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJuc3RyKHRhdmlsX2Nvbm5fbWFkX3RleHRbdGF2aWxfbWFkX2lucHV0XSwKLQkJICAgICJBREMiLCBzaXplb2YoIkFEQyIpKSkgewotCQltYWRfaW5wdXQgPSBzdHJwYnJrKHRhdmlsX2Nvbm5fbWFkX3RleHRbdGF2aWxfbWFkX2lucHV0XSwKLQkJCQkgICAgIjEyMzQiKTsKLQkJaWYgKCFtYWRfaW5wdXQpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIE1BRCBpbnB1dCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgdGF2aWxfY29ubl9tYWRfdGV4dFt0YXZpbF9tYWRfaW5wdXRdKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmV0ID0ga3N0cnRvdWludChtYWRfaW5wdXQsIDEwLCAmYWRjKTsKLQkJaWYgKChyZXQgPCAwKSB8fCAoYWRjID4gNCkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIEFEQyA9ICVzXG4iLCBfX2Z1bmNfXywKLQkJCQl0YXZpbF9jb25uX21hZF90ZXh0W3RhdmlsX21hZF9pbnB1dF0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKkFNSUM0IGFuZCBBTUlDNSBzaGFyZSBBREM0Ki8KLQkJaWYgKChhZGMgPT0gNCkgJiYKLQkJICAgIChzbmRfc29jX3JlYWQoY29kZWMsIFdDRDkzNFhfVFhfTkVXX0FNSUNfNF81X1NFTCkgJiAweDEwKSkKLQkJCWFkYyA9IDU7Ci0KLQkJc25wcmludGYobWFkX2FtaWNfaW5wdXRfd2lkZ2V0LCA2LCAiJXMldSIsICJBTUlDIiwgYWRjKTsKLQotCQltYWRfaW5wdXRfd2lkZ2V0ID0gbWFkX2FtaWNfaW5wdXRfd2lkZ2V0OwotCQlpc19hZGNfaW5wdXQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCS8qIERNSUMgdHlwZSBpbnB1dCB3aWRnZXQqLwotCQltYWRfaW5wdXRfd2lkZ2V0ID0gdGF2aWxfY29ubl9tYWRfdGV4dFt0YXZpbF9tYWRfaW5wdXRdOwotCX0KLQotCWRldl9kYmcoY29kZWMtPmRldiwKLQkJIiVzOiB0YXZpbCBpbnB1dCB3aWRnZXQgPSAlcywgYWRjX2lucHV0ID0gJXNcbiIsIF9fZnVuY19fLAotCQltYWRfaW5wdXRfd2lkZ2V0LCBpc19hZGNfaW5wdXQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fb2ZfZGFwbV9yb3V0ZXM7IGkrKykgewotCQlpZiAoIXN0cmNtcChjYXJkLT5vZl9kYXBtX3JvdXRlc1tpXS5zaW5rLCBtYWRfaW5wdXRfd2lkZ2V0KSkgewotCQkJc291cmNlX3dpZGdldCA9IGNhcmQtPm9mX2RhcG1fcm91dGVzW2ldLnNvdXJjZTsKLQkJCWlmICghc291cmNlX3dpZGdldCkgewotCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBpbnZhbGlkIHNvdXJjZSB3aWRnZXRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMxIiwgc2l6ZW9mKCJNSUMgQklBUzEiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMyIiwgc2l6ZW9mKCJNSUMgQklBUzIiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVMzIiwgc2l6ZW9mKCJNSUMgQklBUzMiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHN0cm5zdHIoc291cmNlX3dpZGdldCwKLQkJCQkiTUlDIEJJQVM0Iiwgc2l6ZW9mKCJNSUMgQklBUzQiKSkpIHsKLQkJCQltaWNfYmlhc19mb3VuZCA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIW1pY19iaWFzX2ZvdW5kKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBtaWMgYmlhcyBub3QgZm91bmQgZm9yIGlucHV0ICVzXG4iLAotCQkJX19mdW5jX18sIG1hZF9pbnB1dF93aWRnZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbWljX2JpYXMgZm91bmQgPSAlZFxuIiwgX19mdW5jX18sCi0JCW1pY19iaWFzX2ZvdW5kKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfU09DX01BRF9JTlBfU0VMLAotCQkJICAgIDB4MEYsIHRhdmlsX21hZF9pbnB1dCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUFEX1NFVFVQLAotCQkJICAgIDB4MDcsIG1pY19iaWFzX2ZvdW5kKTsKLQkvKiBmb3IgYWxsIGFkYyBpbnB1dHMsIG1hZCBzaG91bGQgYmUgaW4gbWljYmlhcyBtb2RlIHdpdGggQkcgZW5hYmxlZCAqLwotCWlmIChpc19hZGNfaW5wdXQpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01BRF9TRVRVUCwKLQkJCQkgICAgMHg4OCwgMHg4OCk7Ci0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NQURfU0VUVVAsCi0JCQkJICAgIDB4ODgsIDB4MDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2Vhcl9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTggZWFyX3BhX2dhaW47Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0KLQllYXJfcGFfZ2FpbiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOTM0WF9BTkFfRUFSKTsKLQotCWVhcl9wYV9nYWluID0gKGVhcl9wYV9nYWluICYgMHg3MCkgPj4gNDsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZWFyX3BhX2dhaW47Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZWFyX3BhX2dhaW4gPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJZWFyX3BhX2dhaW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfZWFyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1OCBlYXJfcGFfZ2FpbjsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAgPSAlbGRcbiIsCi0JCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JZWFyX3BhX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNDsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX0VBUiwgMHg3MCwgZWFyX3BhX2dhaW4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0YXZpbC0+ZWFyX3Nwa3JfZ2FpbjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICVsZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdGF2aWwtPmVhcl9zcGtyX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZ2FpbiA9ICVkXG4iLCBfX2Z1bmNfXywgdGF2aWwtPmVhcl9zcGtyX2dhaW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfcnhfaHBoX21vZGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGF2aWwtPmhwaF9tb2RlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3J4X2hwaF9tb2RlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdTMyIG1vZGVfdmFsOwotCi0JbW9kZV92YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVkXG4iLCBfX2Z1bmNfXywgbW9kZV92YWwpOwotCi0JaWYgKG1vZGVfdmFsID09IDApIHsKLQkJZGV2X3dhcm4oY29kZWMtPmRldiwgIiVzOkludmFsaWQgSFBIIE1vZGUsIGRlZmF1bHQgdG8gQ2xzLUggTE9IaUZpXG4iLAotCQkJX19mdW5jX18pOwotCQltb2RlX3ZhbCA9IENMU19IX0xPSElGSTsKLQl9Ci0JdGF2aWwtPmhwaF9tb2RlID0gbW9kZV92YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaHBoX21vZGVfbXV4X3RleHRbXSA9IHsKLQkiQ0xTX0hfSU5WQUxJRCIsICJDTFNfSF9ISUZJIiwgIkNMU19IX0xQIiwgIkNMU19BQiIsICJDTFNfSF9MT0hJRkkiLAotCSJDTFNfSF9VTFAiLCAiQ0xTX0FCX0hJRkkiLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSByeF9ocGhfbW9kZV9tdXhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHJ4X2hwaF9tb2RlX211eF90ZXh0KSwKLQkJCSAgICByeF9ocGhfbW9kZV9tdXhfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YXZpbF9hbmNfZnVuY190ZXh0W10gPSB7Ik9GRiIsICJPTiJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0YXZpbF9hbmNfZnVuY19lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIHRhdmlsX2FuY19mdW5jX3RleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGF2aWxfY2xrbW9kZV90ZXh0W10gPSB7IkVYVEVSTkFMIiwgIklOVEVSTkFMIn07Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRhdmlsX2Nsa21vZGVfZW51bSwgdGF2aWxfY2xrbW9kZV90ZXh0KTsKLQotLyogQ3V0b2ZmIGZyZXF1ZW5jeSBmb3IgaGlnaCBwYXNzIGZpbHRlciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZl90ZXh0W10gPSB7Ci0JIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9jZl90ZXh0W10gPSB7Ci0JIkNGX05FR18zREJfNEhaIiwgIkNGX05FR18zREJfNzVIWiIsICJDRl9ORUdfM0RCXzE1MEhaIiwKLQkiQ0ZfTkVHXzNEQl8wUDQ4SFoiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFtaWNfcHdyX2x2bF90ZXh0W10gPSB7Ci0JIkxPV19QV1IiLCAiREVGQVVMVCIsICJISUdIX1BFUkYiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhwaF9pZGxlX2RldGVjdF90ZXh0W10gPSB7Ci0JIk9GRiIsICJPTiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNyY19tb2RlX3RleHRbXSA9IHsKLQkiSU5UIiwgIkZSQUMiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhdmlsX2Vhcl9wYV9nYWluX3RleHRbXSA9IHsKLQkiR182X0RCIiwgIkdfNFA1X0RCIiwgIkdfM19EQiIsICJHXzFQNV9EQiIsCi0JIkdfMF9EQiIsICJHX00yUDVfREIiLCAiVU5ERUZJTkVEIiwgIkdfTTEyX0RCIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0YXZpbF9lYXJfc3Brcl9wYV9nYWluX3RleHRbXSA9IHsKLQkiR19ERUZBVUxUIiwgIkdfMF9EQiIsICJHXzFfREIiLCAiR18yX0RCIiwgIkdfM19EQiIsCi0JIkdfNF9EQiIsICJHXzVfREIiLCAiR182X0RCIgotfTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0YXZpbF9lYXJfcGFfZ2Fpbl9lbnVtLCB0YXZpbF9lYXJfcGFfZ2Fpbl90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGF2aWxfZWFyX3Nwa3JfcGFfZ2Fpbl9lbnVtLAotCQkJCXRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGFtaWNfcHdyX2x2bF9lbnVtLCBhbWljX3B3cl9sdmxfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGhwaF9pZGxlX2RldGVjdF9lbnVtLCBocGhfaWRsZV9kZXRlY3RfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGFzcmNfbW9kZV9lbnVtLCBhc3JjX21vZGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjMF9lbnVtLCBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DRkcwLCA1LAotCQkJCQkJCWNmX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzFfZW51bSwgV0NEOTM0WF9DRENfVFgxX1RYX1BBVEhfQ0ZHMCwgNSwKLQkJCQkJCQljZl90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWMyX2VudW0sIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIX0NGRzAsIDUsCi0JCQkJCQkJY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjM19lbnVtLCBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwLCA1LAotCQkJCQkJCWNmX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzRfZW51bSwgV0NEOTM0WF9DRENfVFg0X1RYX1BBVEhfQ0ZHMCwgNSwKLQkJCQkJCQljZl90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWM1X2VudW0sIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzAsIDUsCi0JCQkJCQkJY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfZGVjNl9lbnVtLCBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DRkcwLCA1LAotCQkJCQkJCWNmX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKGNmX2RlYzdfZW51bSwgV0NEOTM0WF9DRENfVFg3X1RYX1BBVEhfQ0ZHMCwgNSwKLQkJCQkJCQljZl90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChjZl9kZWM4X2VudW0sIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzAsIDUsCi0JCQkJCQkJY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MF8xX2VudW0sIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MF8yX2VudW0sIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MV8xX2VudW0sIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50MV8yX2VudW0sIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50Ml8xX2VudW0sIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50Ml8yX2VudW0sIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50M18xX2VudW0sIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50M18yX2VudW0sIFdDRDkzNFhfQ0RDX1JYM19SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50NF8xX2VudW0sIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50NF8yX2VudW0sIFdDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50N18xX2VudW0sIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50N18yX2VudW0sIFdDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50OF8xX2VudW0sIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX0NGRzIsIDAsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woY2ZfaW50OF8yX2VudW0sIFdDRDkzNFhfQ0RDX1JYOF9SWF9QQVRIX01JWF9DRkcsIDIsCi0JCQkJCQkJcnhfY2ZfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0YXZpbF9zbmRfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIkVBUiBQQSBHYWluIiwgdGF2aWxfZWFyX3BhX2dhaW5fZW51bSwKLQkJdGF2aWxfZWFyX3BhX2dhaW5fZ2V0LCB0YXZpbF9lYXJfcGFfZ2Fpbl9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRUFSIFNQS1IgUEEgR2FpbiIsIHRhdmlsX2Vhcl9zcGtyX3BhX2dhaW5fZW51bSwKLQkJICAgICB0YXZpbF9lYXJfc3Brcl9wYV9nYWluX2dldCwgdGF2aWxfZWFyX3Nwa3JfcGFfZ2Fpbl9wdXQpLAotCVNPQ19TSU5HTEVfVExWKCJIUEhMIFZvbHVtZSIsIFdDRDkzNFhfSFBIX0xfRU4sIDAsIDIwLCAxLCBsaW5lX2dhaW4pLAotCVNPQ19TSU5HTEVfVExWKCJIUEhSIFZvbHVtZSIsIFdDRDkzNFhfSFBIX1JfRU4sIDAsIDIwLCAxLCBsaW5lX2dhaW4pLAotCVNPQ19TSU5HTEVfVExWKCJMSU5FT1VUMSBWb2x1bWUiLCBXQ0Q5MzRYX0RJRkZfTE9fTE8xX0NPTVBBTkRFUiwKLQkJMywgMTYsIDEsIGxpbmVfZ2FpbiksCi0JU09DX1NJTkdMRV9UTFYoIkxJTkVPVVQyIFZvbHVtZSIsIFdDRDkzNFhfRElGRl9MT19MTzJfQ09NUEFOREVSLAotCQkzLCAxNiwgMSwgbGluZV9nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDMSBWb2x1bWUiLCBXQ0Q5MzRYX0FOQV9BTUlDMSwgMCwgMjAsIDAsIGFuYWxvZ19nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDMiBWb2x1bWUiLCBXQ0Q5MzRYX0FOQV9BTUlDMiwgMCwgMjAsIDAsIGFuYWxvZ19nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDMyBWb2x1bWUiLCBXQ0Q5MzRYX0FOQV9BTUlDMywgMCwgMjAsIDAsIGFuYWxvZ19nYWluKSwKLQlTT0NfU0lOR0xFX1RMVigiQURDNCBWb2x1bWUiLCBXQ0Q5MzRYX0FOQV9BTUlDNCwgMCwgMjAsIDAsIGFuYWxvZ19nYWluKSwKLQotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDAgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzRYX0NEQ19SWDBfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwgLyogLTg0ZEIgbWluIC0gNDBkQiBtYXggKi8KLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgxIERpZ2l0YWwgVm9sdW1lIiwgV0NEOTM0WF9DRENfUlgxX1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYMiBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1JYMl9SWF9WT0xfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDMgRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzRYX0NEQ19SWDNfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg0IERpZ2l0YWwgVm9sdW1lIiwgV0NEOTM0WF9DRENfUlg0X1JYX1ZPTF9DVEwsCi0JCTAsIC04NCwgNDAsIGRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIlJYNyBEaWdpdGFsIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfQ1RMLAotCQkwLCAtODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJSWDggRGlnaXRhbCBWb2x1bWUiLCBXQ0Q5MzRYX0NEQ19SWDhfUlhfVk9MX0NUTCwKLQkJMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgwIE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYMF9SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgxIE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYMV9SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgyIE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlgzIE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYM19SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg0IE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYNF9SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg3IE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYN19SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiUlg4IE1peCBEaWdpdGFsIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1JYOF9SWF9WT0xfTUlYX0NUTCwgMCwgLTg0LCA0MCwgZGlnaXRhbF9nYWluKSwKLQotCVNPQ19TSU5HTEVfU1hfVExWKCJERUMwIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYMF9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUMxIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYMV9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUMyIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYMl9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUMzIFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYM19UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM0IFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYNF9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM1IFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYNV9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM2IFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYNl9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM3IFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYN19UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJERUM4IFZvbHVtZSIsIFdDRDkzNFhfQ0RDX1RYOF9UWF9WT0xfQ1RMLCAwLAotCQktODQsIDQwLCBkaWdpdGFsX2dhaW4pLAotCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjAgSU5QMCBWb2x1bWUiLAotCQlXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0IxX0NUTCwgMCwgLTg0LCA0MCwKLQkJZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMCBJTlAxIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjBfSUlSX0dBSU5fQjJfQ1RMLCAwLCAtODQsIDQwLAotCQlkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIwIElOUDIgVm9sdW1lIiwKLQkJV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfR0FJTl9CM19DVEwsIDAsIC04NCwgNDAsCi0JCWRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjAgSU5QMyBWb2x1bWUiLAotCQlXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIwX0lJUl9HQUlOX0I0X0NUTCwgMCwgLTg0LCA0MCwKLQkJZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAwIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjFfQ1RMLCAwLCAtODQsIDQwLAotCQlkaWdpdGFsX2dhaW4pLAotCVNPQ19TSU5HTEVfU1hfVExWKCJJSVIxIElOUDEgVm9sdW1lIiwKLQkJV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfR0FJTl9CMl9DVEwsIDAsIC04NCwgNDAsCi0JCWRpZ2l0YWxfZ2FpbiksCi0JU09DX1NJTkdMRV9TWF9UTFYoIklJUjEgSU5QMiBWb2x1bWUiLAotCQlXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVIxX0lJUl9HQUlOX0IzX0NUTCwgMCwgLTg0LCA0MCwKLQkJZGlnaXRhbF9nYWluKSwKLQlTT0NfU0lOR0xFX1NYX1RMVigiSUlSMSBJTlAzIFZvbHVtZSIsCi0JCVdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUjFfSUlSX0dBSU5fQjRfQ1RMLCAwLCAtODQsIDQwLAotCQlkaWdpdGFsX2dhaW4pLAotCi0JU09DX1NJTkdMRV9FWFQoIkFOQyBTbG90IiwgU05EX1NPQ19OT1BNLCAwLCAxMDAsIDAsIHRhdmlsX2dldF9hbmNfc2xvdCwKLQkJdGF2aWxfcHV0X2FuY19zbG90KSwKLQlTT0NfRU5VTV9FWFQoIkFOQyBGdW5jdGlvbiIsIHRhdmlsX2FuY19mdW5jX2VudW0sIHRhdmlsX2dldF9hbmNfZnVuYywKLQkJdGF2aWxfcHV0X2FuY19mdW5jKSwKLQotCVNPQ19FTlVNX0VYVCgiQ0xLIE1PREUiLCB0YXZpbF9jbGttb2RlX2VudW0sIHRhdmlsX2dldF9jbGttb2RlLAotCQkgICAgIHRhdmlsX3B1dF9jbGttb2RlKSwKLQotCVNPQ19FTlVNKCJUWDAgSFBGIGN1dCBvZmYiLCBjZl9kZWMwX2VudW0pLAotCVNPQ19FTlVNKCJUWDEgSFBGIGN1dCBvZmYiLCBjZl9kZWMxX2VudW0pLAotCVNPQ19FTlVNKCJUWDIgSFBGIGN1dCBvZmYiLCBjZl9kZWMyX2VudW0pLAotCVNPQ19FTlVNKCJUWDMgSFBGIGN1dCBvZmYiLCBjZl9kZWMzX2VudW0pLAotCVNPQ19FTlVNKCJUWDQgSFBGIGN1dCBvZmYiLCBjZl9kZWM0X2VudW0pLAotCVNPQ19FTlVNKCJUWDUgSFBGIGN1dCBvZmYiLCBjZl9kZWM1X2VudW0pLAotCVNPQ19FTlVNKCJUWDYgSFBGIGN1dCBvZmYiLCBjZl9kZWM2X2VudW0pLAotCVNPQ19FTlVNKCJUWDcgSFBGIGN1dCBvZmYiLCBjZl9kZWM3X2VudW0pLAotCVNPQ19FTlVNKCJUWDggSFBGIGN1dCBvZmYiLCBjZl9kZWM4X2VudW0pLAotCi0JU09DX0VOVU0oIlJYIElOVDBfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDBfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UMF8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50MF8yX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQxXzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQxXzFfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDFfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDFfMl9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UMl8xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50Ml8xX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQyXzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQyXzJfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDNfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDNfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UM18yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50M18yX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQ0XzEgSFBGIGN1dCBvZmYiLCBjZl9pbnQ0XzFfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDRfMiBIUEYgY3V0IG9mZiIsIGNmX2ludDRfMl9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UN18xIEhQRiBjdXQgb2ZmIiwgY2ZfaW50N18xX2VudW0pLAotCVNPQ19FTlVNKCJSWCBJTlQ3XzIgSFBGIGN1dCBvZmYiLCBjZl9pbnQ3XzJfZW51bSksCi0JU09DX0VOVU0oIlJYIElOVDhfMSBIUEYgY3V0IG9mZiIsIGNmX2ludDhfMV9lbnVtKSwKLQlTT0NfRU5VTSgiUlggSU5UOF8yIEhQRiBjdXQgb2ZmIiwgY2ZfaW50OF8yX2VudW0pLAotCi0JU09DX0VOVU1fRVhUKCJSWCBIUEggTW9kZSIsIHJ4X2hwaF9tb2RlX211eF9lbnVtLAotCQl0YXZpbF9yeF9ocGhfbW9kZV9nZXQsIHRhdmlsX3J4X2hwaF9tb2RlX3B1dCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDEiLCBJSVIwLCBCQU5EMSwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDIiLCBJSVIwLCBCQU5EMiwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDMiLCBJSVIwLCBCQU5EMywgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDQiLCBJSVIwLCBCQU5ENCwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMCBFbmFibGUgQmFuZDUiLCBJSVIwLCBCQU5ENSwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDEiLCBJSVIxLCBCQU5EMSwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDIiLCBJSVIxLCBCQU5EMiwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDMiLCBJSVIxLCBCQU5EMywgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDQiLCBJSVIxLCBCQU5ENCwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiSUlSMSBFbmFibGUgQmFuZDUiLCBJSVIxLCBCQU5ENSwgMSwgMCwKLQkJdGF2aWxfaWlyX2VuYWJsZV9hdWRpb19taXhlcl9nZXQsCi0JCXRhdmlsX2lpcl9lbmFibGVfYXVkaW9fbWl4ZXJfcHV0KSwKLQotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQxIiwgSUlSMCwgQkFORDEsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQyIiwgSUlSMCwgQkFORDIsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQzIiwgSUlSMCwgQkFORDMsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQ0IiwgSUlSMCwgQkFORDQsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIwIEJhbmQ1IiwgSUlSMCwgQkFORDUsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQxIiwgSUlSMSwgQkFORDEsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQyIiwgSUlSMSwgQkFORDIsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQzIiwgSUlSMSwgQkFORDMsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQ0IiwgSUlSMSwgQkFORDQsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJJSVIxIEJhbmQ1IiwgSUlSMSwgQkFORDUsIDI1NSwgMCwgNSwKLQkJdGF2aWxfaWlyX2JhbmRfYXVkaW9fbWl4ZXJfZ2V0LCB0YXZpbF9paXJfYmFuZF9hdWRpb19taXhlcl9wdXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkNPTVAxIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzEsIDEsIDAsCi0JCXRhdmlsX2NvbXBhbmRlcl9nZXQsIHRhdmlsX2NvbXBhbmRlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJDT01QMiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl8yLCAxLCAwLAotCQl0YXZpbF9jb21wYW5kZXJfZ2V0LCB0YXZpbF9jb21wYW5kZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDMgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfMywgMSwgMCwKLQkJdGF2aWxfY29tcGFuZGVyX2dldCwgdGF2aWxfY29tcGFuZGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIkNPTVA0IFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgQ09NUEFOREVSXzQsIDEsIDAsCi0JCXRhdmlsX2NvbXBhbmRlcl9nZXQsIHRhdmlsX2NvbXBhbmRlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJDT01QNyBTd2l0Y2giLCBTTkRfU09DX05PUE0sIENPTVBBTkRFUl83LCAxLCAwLAotCQl0YXZpbF9jb21wYW5kZXJfZ2V0LCB0YXZpbF9jb21wYW5kZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUDggU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBDT01QQU5ERVJfOCwgMSwgMCwKLQkJdGF2aWxfY29tcGFuZGVyX2dldCwgdGF2aWxfY29tcGFuZGVyX3B1dCksCi0KLQlTT0NfRU5VTV9FWFQoIkFTUkMwIE91dHB1dCBNb2RlIiwgYXNyY19tb2RlX2VudW0sCi0JCXRhdmlsX2hwaF9hc3JjX21vZGVfZ2V0LCB0YXZpbF9ocGhfYXNyY19tb2RlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJBU1JDMSBPdXRwdXQgTW9kZSIsIGFzcmNfbW9kZV9lbnVtLAotCQl0YXZpbF9ocGhfYXNyY19tb2RlX2dldCwgdGF2aWxfaHBoX2FzcmNfbW9kZV9wdXQpLAotCi0JU09DX0VOVU1fRVhUKCJIUEggSWRsZSBEZXRlY3QiLCBocGhfaWRsZV9kZXRlY3RfZW51bSwKLQkJdGF2aWxfaHBoX2lkbGVfZGV0ZWN0X2dldCwgdGF2aWxfaHBoX2lkbGVfZGV0ZWN0X3B1dCksCi0KLQlTT0NfRU5VTV9FWFQoIk1BRCBJbnB1dCIsIHRhdmlsX2Nvbm5fbWFkX2VudW0sCi0JCSAgICAgdGF2aWxfbWFkX2lucHV0X2dldCwgdGF2aWxfbWFkX2lucHV0X3B1dCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiRE1JQzFfQ0xLX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAxNywgMSwgMCwKLQkJdGF2aWxfZG1pY19waW5fbW9kZV9nZXQsIHRhdmlsX2RtaWNfcGluX21vZGVfcHV0KSwKLQotCVNPQ19TSU5HTEVfRVhUKCJETUlDMV9EQVRBX1BJTl9NT0RFIiwgU05EX1NPQ19OT1BNLCAxOCwgMSwgMCwKLQkJdGF2aWxfZG1pY19waW5fbW9kZV9nZXQsIHRhdmlsX2RtaWNfcGluX21vZGVfcHV0KSwKLQotCVNPQ19TSU5HTEVfRVhUKCJETUlDMl9DTEtfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDE5LCAxLCAwLAotCQl0YXZpbF9kbWljX3Bpbl9tb2RlX2dldCwgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkRNSUMyX0RBVEFfUElOX01PREUiLCBTTkRfU09DX05PUE0sIDIwLCAxLCAwLAotCQl0YXZpbF9kbWljX3Bpbl9tb2RlX2dldCwgdGF2aWxfZG1pY19waW5fbW9kZV9wdXQpLAotCi0JU09DX1NJTkdMRV9FWFQoIkRNSUMzX0NMS19QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMjEsIDEsIDAsCi0JCXRhdmlsX2RtaWNfcGluX21vZGVfZ2V0LCB0YXZpbF9kbWljX3Bpbl9tb2RlX3B1dCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiRE1JQzNfREFUQV9QSU5fTU9ERSIsIFNORF9TT0NfTk9QTSwgMjIsIDEsIDAsCi0JCXRhdmlsX2RtaWNfcGluX21vZGVfZ2V0LCB0YXZpbF9kbWljX3Bpbl9tb2RlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJBTUlDXzFfMiBQV1IgTU9ERSIsIGFtaWNfcHdyX2x2bF9lbnVtLAotCQl0YXZpbF9hbWljX3B3cl9sdmxfZ2V0LCB0YXZpbF9hbWljX3B3cl9sdmxfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkFNSUNfM180IFBXUiBNT0RFIiwgYW1pY19wd3JfbHZsX2VudW0sCi0JCXRhdmlsX2FtaWNfcHdyX2x2bF9nZXQsIHRhdmlsX2FtaWNfcHdyX2x2bF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiQU1JQ181XzYgUFdSIE1PREUiLCBhbWljX3B3cl9sdmxfZW51bSwKLQkJdGF2aWxfYW1pY19wd3JfbHZsX2dldCwgdGF2aWxfYW1pY19wd3JfbHZsX3B1dCksCi19OwotCi1zdGF0aWMgaW50IHRhdmlsX2RlY19lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMod2lkZ2V0LT5kYXBtKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1MTYgbWljX3NlbF9yZWcgPSAwOwotCXU4IG1pY19zZWw7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmICh2YWwgPiBlLT5pdGVtcyAtIDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHduYW1lOiAlcywgdmFsOiAweCV4XG4iLCBfX2Z1bmNfXywKLQkJd2lkZ2V0LT5uYW1lLCB2YWwpOwotCi0Jc3dpdGNoIChlLT5yZWcpIHsKLQljYXNlIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMToKLQkJaWYgKGUtPnNoaWZ0X2wgPT0gMCkKLQkJCW1pY19zZWxfcmVnID0gV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMDsKLQkJZWxzZSBpZiAoZS0+c2hpZnRfbCA9PSAyKQotCQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF9DRkcwOwotCQllbHNlIGlmIChlLT5zaGlmdF9sID09IDQpCi0JCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIX0NGRzA7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxOgotCQlpZiAoZS0+c2hpZnRfbCA9PSAwKQotCQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF9DRkcwOwotCQllbHNlIGlmIChlLT5zaGlmdF9sID09IDIpCi0JCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIX0NGRzA7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxOgotCQlpZiAoZS0+c2hpZnRfbCA9PSAwKQotCQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcwOwotCQllbHNlIGlmIChlLT5zaGlmdF9sID09IDIpCi0JCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYNl9UWF9QQVRIX0NGRzA7Ci0JCWJyZWFrOwotCWNhc2UgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcxOgotCQlpZiAoZS0+c2hpZnRfbCA9PSAwKQotCQkJbWljX3NlbF9yZWcgPSBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DRkcwOwotCQllbHNlIGlmIChlLT5zaGlmdF9sID09IDIpCi0JCQltaWNfc2VsX3JlZyA9IFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBlLT5yZWc6IDB4JXggbm90IGV4cGVjdGVkXG4iLAotCQkJX19mdW5jX18sIGUtPnJlZyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEFEQzogMCwgRE1JQzogMSAqLwotCW1pY19zZWwgPSB2YWwgPyAweDAgOiAweDE7Ci0JaWYgKG1pY19zZWxfcmVnKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBtaWNfc2VsX3JlZywgMSA8PCA3LCBtaWNfc2VsIDw8IDcpOwotCi0JcmV0dXJuIHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUoa2NvbnRyb2wsIHVjb250cm9sKTsKLX0KLQotc3RhdGljIGludCB0YXZpbF9pbnRfZGVtX2lucF9tdXhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3aWRnZXQtPmRhcG0pOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCXVuc2lnbmVkIHNob3J0IGxvb2tfYWhlYWRfZGx5X3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NGRzA7Ci0KLQl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmICh2YWwgPj0gZS0+aXRlbXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHduYW1lOiAlcywgdmFsOiAweCV4XG4iLCBfX2Z1bmNfXywKLQkJd2lkZ2V0LT5uYW1lLCB2YWwpOwotCi0JaWYgKGUtPnJlZyA9PSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9TRUMwKQotCQlsb29rX2FoZWFkX2RseV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDBfUlhfUEFUSF9DRkcwOwotCWVsc2UgaWYgKGUtPnJlZyA9PSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9TRUMwKQotCQlsb29rX2FoZWFkX2RseV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDFfUlhfUEFUSF9DRkcwOwotCWVsc2UgaWYgKGUtPnJlZyA9PSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9TRUMwKQotCQlsb29rX2FoZWFkX2RseV9yZWcgPSBXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9DRkcwOwotCi0JLyogU2V0IExvb2sgQWhlYWQgRGVsYXkgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBsb29rX2FoZWFkX2RseV9yZWcsCi0JCQkgICAgMHgwOCwgKHZhbCA/IDB4MDggOiAweDAwKSk7Ci0JLyogU2V0IERFTSBJTlAgU2VsZWN0ICovCi0JcmV0dXJuIHNuZF9zb2NfZGFwbV9wdXRfZW51bV9kb3VibGUoa2NvbnRyb2wsIHVjb250cm9sKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQwXzdfbWl4X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlgwIiwgIlJYMSIsICJSWDIiLCAiUlgzIiwgIlJYNCIsICJSWDUiLAotCSJSWDYiLCAiUlg3IiwgIlBST1hJTUlUWSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50X21peF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYMCIsICJSWDEiLCAiUlgyIiwgIlJYMyIsICJSWDQiLCAiUlg1IiwKLQkiUlg2IiwgIlJYNyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfcHJpbV9taXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkRFQzAiLCAiREVDMSIsICJJSVIwIiwgIklJUjEiLCAiUlgwIiwgIlJYMSIsICJSWDIiLAotCSJSWDMiLCAiUlg0IiwgIlJYNSIsICJSWDYiLCAiUlg3IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9zaWRldG9uZV9taXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlNSQzAiLCAiU1JDMSIsICJTUkNfU1VNIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHgwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYMCIsICJERUMwIiwgIkRFQzBfMTkyIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4MV9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDEiLCAiREVDMSIsICJERUMxXzE5MiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDJfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFgyIiwgIkRFQzIiLCAiREVDMl8xOTIiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHgzX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYMyIsICJERUMzIiwgIkRFQzNfMTkyIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4NF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDQiLCAiREVDNCIsICJERUM0XzE5MiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDVfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFg1IiwgIkRFQzUiLCAiREVDNV8xOTIiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHg2X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlhfTUlYX1RYNiIsICJERUM2IiwgIkRFQzZfMTkyIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2RjX2lmX3R4N19tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWF9UWDciLCAiREVDNyIsICJERUM3XzE5MiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDhfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWF9NSVhfVFg4IiwgIkRFQzgiLCAiREVDOF8xOTIiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHg5X211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDNyIsICJERUM3XzE5MiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDEwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDNiIsICJERUM2XzE5MiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDExX211eF90ZXh0W10gPSB7Ci0JIkRFQ18wXzUiLCAiREVDXzlfMTIiLCAiTUFEX0FVRElPIiwgIk1BRF9CUkRDU1QiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHgxMV9pbnAxX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDMCIsICJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwKLQkiREVDNSIsICJSWF9NSVhfVFg1IiwgIkRFQzlfMTAiLCAiREVDMTFfMTIiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGNfaWZfdHgxM19tdXhfdGV4dFtdID0gewotCSJDRENfREVDXzUiLCAiTUFEX0JSRENTVCIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNkY19pZl90eDEzX2lucDFfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJERUM1IiwgIkRFQzVfMTkyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaXJfaW5wX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiREVDMCIsICJERUMxIiwgIkRFQzIiLCAiREVDMyIsICJERUM0IiwgIkRFQzUiLCAiREVDNiIsCi0JIkRFQzciLCAiREVDOCIsICJSWDAiLCAiUlgxIiwgIlJYMiIsICJSWDMiLCAiUlg0IiwgIlJYNSIsICJSWDYiLCAiUlg3IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnRfZGVtX2lucF9tdXhfdGV4dFtdID0gewotCSJOT1JNQUxfRFNNX09VVCIsICJDTFNIX0RTTV9PVVQiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQwXzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMF8xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQxXzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMV8xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQyXzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMl8xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQzXzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UM18xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ0XzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UNF8xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ3XzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UN18xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ4XzFfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UOF8xIE1JWDEiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQwXzJfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UMF8yIE1VWCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDFfMl9pbnRlcnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWCBJTlQxXzIgTVVYIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50Ml8yX2ludGVycF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYIElOVDJfMiBNVVgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQzXzJfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UM18yIE1VWCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ4X2ludDRfMl9pbnRlcnBfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJSWCBJTlQ0XzIgTVVYIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfaW50N18yX2ludGVycF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYIElOVDdfMiBNVVgiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByeF9pbnQ4XzJfaW50ZXJwX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiUlggSU5UOF8yIE1VWCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1hZF9zZWxfdHh0W10gPSB7Ci0JIlNQRSIsICJNU00iCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1hZF9pbnBfbXV4X3R4dFtdID0gewotCSJNQUQiLCAiREVDMSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWRjX211eF90ZXh0W10gPSB7Ci0JIkRNSUMiLCAiQU1JQyIsICJBTkNfRkJfVFVORTEiLCAiQU5DX0ZCX1RVTkUyIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkbWljX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiRE1JQzAiLCAiRE1JQzEiLCAiRE1JQzIiLCAiRE1JQzMiLCAiRE1JQzQiLCAiRE1JQzUiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFtaWNfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJBREMxIiwgIkFEQzIiLCAiQURDMyIsICJBREM0IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbWljNF81X3NlbF90ZXh0W10gPSB7Ci0JIkFNSUM0IiwgIkFNSUM1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMwX2ZiX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQU5DX0lOX0hQSEwiLCAiQU5DX0lOX0VBUiIsICJBTkNfSU5fRUFSX1NQS1IiLAotCSJBTkNfSU5fTE8xIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbmMxX2ZiX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQU5DX0lOX0hQSFIiLCAiQU5DX0lOX0xPMiIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnhfZWNob19tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlJYX01JWDAiLCAiUlhfTUlYMSIsICJSWF9NSVgyIiwgIlJYX01JWDMiLCAiUlhfTUlYNCIsCi0JIlJYX01JWDUiLCAiUlhfTUlYNiIsICJSWF9NSVg3IiwgIlJYX01JWDgiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xpbV9yeF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkFJRjFfUEIiLCAiQUlGMl9QQiIsICJBSUYzX1BCIiwgIkFJRjRfUEIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4MF9tdXhfdGV4dFtdID0gewotCSJTTElNIFJYMCIsICJJMlNfMCBSWDAiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNkY19pZl9yeDFfbXV4X3RleHRbXSA9IHsKLQkiU0xJTSBSWDEiLCAiSTJTXzAgUlgxIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjZGNfaWZfcngyX211eF90ZXh0W10gPSB7Ci0JIlNMSU0gUlgyIiwgIkkyU18wIFJYMiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4M19tdXhfdGV4dFtdID0gewotCSJTTElNIFJYMyIsICJJMlNfMCBSWDMiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNkY19pZl9yeDRfbXV4X3RleHRbXSA9IHsKLQkiU0xJTSBSWDQiLCAiSTJTXzAgUlg0IgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjZGNfaWZfcng1X211eF90ZXh0W10gPSB7Ci0JIlNMSU0gUlg1IiwgIkkyU18wIFJYNSIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2RjX2lmX3J4Nl9tdXhfdGV4dFtdID0gewotCSJTTElNIFJYNiIsICJJMlNfMCBSWDYiCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNkY19pZl9yeDdfbXV4X3RleHRbXSA9IHsKLQkiU0xJTSBSWDciLCAiSTJTXzAgUlg3IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3JjMF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIkFTUkNfSU5fSFBITCIsICJBU1JDX0lOX0xPMSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzcmMxX211eF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiQVNSQ19JTl9IUEhSIiwgIkFTUkNfSU5fTE8yIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNyYzJfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJBU1JDX0lOX1NQS1IxIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNyYzNfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJBU1JDX0lOX1NQS1IyIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF0aXZlX211eF90ZXh0W10gPSB7Ci0JIk9GRiIsICJPTiIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDBfdGV4dFtdID0gewotCSJSWF9NSVhfVFgwIiwgIkRFQzAiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDFfdGV4dFtdID0gewotCSJSWF9NSVhfVFgxIiwgIkRFQzEiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDJfdGV4dFtdID0gewotCSJSWF9NSVhfVFgyIiwgIkRFQzIiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDNfdGV4dFtdID0gewotCSJSWF9NSVhfVFgzIiwgIkRFQzMiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDRfdGV4dFtdID0gewotCSJSWF9NSVhfVFg0IiwgIkRFQzQiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDVfdGV4dFtdID0gewotCSJSWF9NSVhfVFg1IiwgIkRFQzUiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfcG9ydDZfdGV4dFtdID0gewotCSJSWF9NSVhfVFg2IiwgIkRFQzYiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgd2RtYTNfY2hfdGV4dFtdID0gewotCSJQT1JUXzAiLCAiUE9SVF8xIiwgIlBPUlRfMiIsICJQT1JUXzMiLCAiUE9SVF80IiwKLQkiUE9SVF81IiwgIlBPUlRfNiIsICJQT1JUXzciLCAiUE9SVF84IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWY0X3ZpX21peGVyW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNQS1JfVklfMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDE0LCAxLCAwLAotCQkJdGF2aWxfdmlfZmVlZF9taXhlcl9nZXQsIHRhdmlsX3ZpX2ZlZWRfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU1BLUl9WSV8yIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTUsIDEsIDAsCi0JCQl0YXZpbF92aV9mZWVkX21peGVyX2dldCwgdGF2aWxfdmlfZmVlZF9taXhlcl9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjFfY2FwX21peGVyW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgwIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgyIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMiwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgzIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg0IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg1IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg2IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNiwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg3IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYNywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg4IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYOCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFg5IiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYOSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTEsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTMiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMywgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWlmMl9jYXBfbWl4ZXJbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDAiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgwLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDIiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgyLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDMiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDQiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg0LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDUiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg1LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDYiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg2LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDciLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg3LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDgiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg4LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDkiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFg5LCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEwIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTAsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTEiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMSwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWYzX2NhcF9taXhlcltdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDAsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMiIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDIsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDMsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDQsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDUsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDYsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDcsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOCIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDgsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDksIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIFdDRDkzNFhfVFgxMCwgMSwgMCwKLQkJCXNsaW1fdHhfbWl4ZXJfZ2V0LCBzbGltX3R4X21peGVyX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMSIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDExLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTSBUWDEzIiwgU05EX1NPQ19OT1BNLCBXQ0Q5MzRYX1RYMTMsIDEsIDAsCi0JCQlzbGltX3R4X21peGVyX2dldCwgc2xpbV90eF9taXhlcl9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpZjRfbWFkX21peGVyW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgV0NEOTM0WF9UWDEzLCAxLCAwLAotCQkJc2xpbV90eF9taXhlcl9nZXQsIHNsaW1fdHhfbWl4ZXJfcHV0KSwKLX07Ci0KLVdDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcngwLCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCi0Jc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDEsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKLQlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVChzbGltX3J4MiwgU05EX1NPQ19OT1BNLCAwLCBzbGltX3J4X211eF90ZXh0LAotCXNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KTsKLVdDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcngzLCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCi0Jc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDQsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKLQlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVChzbGltX3J4NSwgU05EX1NPQ19OT1BNLCAwLCBzbGltX3J4X211eF90ZXh0LAotCXNsaW1fcnhfbXV4X2dldCwgc2xpbV9yeF9tdXhfcHV0KTsKLVdDRF9EQVBNX0VOVU1fRVhUKHNsaW1fcng2LCBTTkRfU09DX05PUE0sIDAsIHNsaW1fcnhfbXV4X3RleHQsCi0Jc2xpbV9yeF9tdXhfZ2V0LCBzbGltX3J4X211eF9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQoc2xpbV9yeDcsIFNORF9TT0NfTk9QTSwgMCwgc2xpbV9yeF9tdXhfdGV4dCwKLQlzbGltX3J4X211eF9nZXQsIHNsaW1fcnhfbXV4X3B1dCk7Ci0KLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MCwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MSwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngxX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MiwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngyX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4MywgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcngzX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NCwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng0X211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NSwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng1X211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NiwgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng2X211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3J4NywgU05EX1NPQ19OT1BNLCAwLCBjZGNfaWZfcng3X211eF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShyeF9pbnQwXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcxLCAwLAotCXJ4X2ludDBfN19taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQxXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMV9DRkcxLCAwLAotCXJ4X2ludF9taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQyXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMl9DRkcxLCAwLAotCXJ4X2ludF9taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQzXzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UM19DRkcxLCAwLAotCXJ4X2ludF9taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQ0XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UNF9DRkcxLCAwLAotCXJ4X2ludF9taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQ3XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UN19DRkcxLCAwLAotCXJ4X2ludDBfN19taXhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQ4XzIsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UOF9DRkcxLCAwLAotCXJ4X2ludF9taXhfbXV4X3RleHQpOwotCi1XQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQwX0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQxX0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQyX0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQzX0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ0X0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ3X0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsIDAsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMSwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzAsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9taXhfaW5wMiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9SWF9JTlQ4X0NGRzEsIDQsCi0JcnhfcHJpbV9taXhfdGV4dCk7Ci0KLVdDRF9EQVBNX0VOVU0ocnhfaW50MF9taXgyX2lucCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMCwgMCwKLQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDFfbWl4Ml9pbnAsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzAsIDIsCi0Jcnhfc2lkZXRvbmVfbWl4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQyX21peDJfaW5wLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcwLCA0LAotCXJ4X3NpZGV0b25lX21peF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50M19taXgyX2lucCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TSURFVE9ORV9TUkNfQ0ZHMCwgNiwKLQlyeF9zaWRldG9uZV9taXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDRfbWl4Ml9pbnAsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU0lERVRPTkVfU1JDX0NGRzEsIDAsCi0Jcnhfc2lkZXRvbmVfbWl4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9pbnQ3X21peDJfaW5wLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NJREVUT05FX1NSQ19DRkcxLCAyLAotCXJ4X3NpZGV0b25lX21peF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTAsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgNCwKLQlhZGNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMSwgNCwKLQlhZGNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgNCwKLQlhZGNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hZGNfbXV4MTMsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgNiwKLQlhZGNfbXV4X3RleHQpOwotCi0KLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgwLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzAsIDMsCi0JZG1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4MSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcwLCAzLAotCWRtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDJfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgzLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzAsIDMsCi0JZG1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4NCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNF9DRkcwLCAzLAotCWRtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDUsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDVfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXg2LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg2X0NGRzAsIDMsCi0JZG1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2RtaWNfbXV4NywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYN19DRkcwLCAzLAotCWRtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9kbWljX211eDgsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDhfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTBfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTFfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTJfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfZG1pY19tdXgxMywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMTNfQ0ZHMCwgMywKLQlkbWljX211eF90ZXh0KTsKLQotCi1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcwLCAwLAotCWFtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMCwgMCwKLQlhbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfYW1pY19tdXgyLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MywgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYM19DRkcwLCAwLAotCWFtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDQsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDRfQ0ZHMCwgMCwKLQlhbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfYW1pY19tdXg1LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg1X0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4NiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYNl9DRkcwLCAwLAotCWFtaWNfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTSh0eF9hbWljX211eDcsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDdfQ0ZHMCwgMCwKLQlhbWljX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0odHhfYW1pY19tdXg4LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVg4X0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTAsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEwX0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDExX0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTIsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEyX0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHR4X2FtaWNfbXV4MTMsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDEzX0NGRzAsIDAsCi0JYW1pY19tdXhfdGV4dCk7Ci0KLVdDRF9EQVBNX0VOVU0odHhfYW1pYzRfNSwgV0NEOTM0WF9UWF9ORVdfQU1JQ180XzVfU0VMLCA3LCBhbWljNF81X3NlbF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgwLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDAsCi0JY2RjX2lmX3R4MF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDEsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMCwgMiwKLQljZGNfaWZfdHgxX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3R4MiwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcwLCA0LAotCWNkY19pZl90eDJfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgzLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzAsIDYsCi0JY2RjX2lmX3R4M19tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDQsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgMCwKLQljZGNfaWZfdHg0X211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3R4NSwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxLCAyLAotCWNkY19pZl90eDVfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShjZGNfaWZfdHg2LCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzEsIDQsCi0JY2RjX2lmX3R4Nl9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDcsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMSwgNiwKLQljZGNfaWZfdHg3X211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3R4OCwgV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyLCAwLAotCWNkY19pZl90eDhfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShjZGNfaWZfdHg5LCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDIsCi0JY2RjX2lmX3R4OV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDEwLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzIsIDQsCi0JY2RjX2lmX3R4MTBfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShjZGNfaWZfdHgxMV9pbnAxLCBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzMsIDAsCi0JY2RjX2lmX3R4MTFfaW5wMV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDExLCBXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgMCwKLQljZGNfaWZfdHgxMV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGNkY19pZl90eDEzX2lucDEsIFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMywgNCwKLQljZGNfaWZfdHgxM19pbnAxX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oY2RjX2lmX3R4MTMsIFdDRDkzNFhfREFUQV9IVUJfU0JfVFgxM19JTlBfQ0ZHLCAwLAotCWNkY19pZl90eDEzX211eF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShyeF9taXhfdHgwLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCAwLAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHgxLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcwLCA0LAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHgyLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxLCAwLAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHgzLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcxLCA0LAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHg0LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyLCAwLAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHg1LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkcyLCA0LAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHg2LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCAwLAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHg3LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkczLCA0LAotCXJ4X2VjaG9fbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShyeF9taXhfdHg4LCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX01JWF9DRkc0LCAwLAotCXJ4X2VjaG9fbXV4X3RleHQpOwotCi1XQ0RfREFQTV9FTlVNKGlpcjBfaW5wMCwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMCwgMCwKLQlpaXJfaW5wX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oaWlyMF9pbnAxLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIwX01JWF9DRkcxLCAwLAotCWlpcl9pbnBfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShpaXIwX2lucDIsIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjBfTUlYX0NGRzIsIDAsCi0JaWlyX2lucF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGlpcjBfaW5wMywgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMF9NSVhfQ0ZHMywgMCwKLQlpaXJfaW5wX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oaWlyMV9pbnAwLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkcwLCAwLAotCWlpcl9pbnBfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShpaXIxX2lucDEsIFdDRDkzNFhfQ0RDX1NJREVUT05FX0lJUl9JTlBfTVVYX0lJUjFfTUlYX0NGRzEsIDAsCi0JaWlyX2lucF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGlpcjFfaW5wMiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSX0lOUF9NVVhfSUlSMV9NSVhfQ0ZHMiwgMCwKLQlpaXJfaW5wX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oaWlyMV9pbnAzLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9JSVJfSU5QX01VWF9JSVIxX01JWF9DRkczLCAwLAotCWlpcl9pbnBfbXV4X3RleHQpOwotCi1XQ0RfREFQTV9FTlVNKHJ4X2ludDBfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50MF8xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDFfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50MV8xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDJfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50Ml8xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDNfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50M18xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDRfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50NF8xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDdfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50N18xX2ludGVycF9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHJ4X2ludDhfMV9pbnRlcnAsIFNORF9TT0NfTk9QTSwgMCwgcnhfaW50OF8xX2ludGVycF9tdXhfdGV4dCk7Ci0KLVdDRF9EQVBNX0VOVU0ocnhfaW50MF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQwXzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50MV8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQxXzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50Ml8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQyXzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50M18yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQzXzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50NF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ0XzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50N18yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ3XzJfaW50ZXJwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0ocnhfaW50OF8yX2ludGVycCwgU05EX1NPQ19OT1BNLCAwLCByeF9pbnQ4XzJfaW50ZXJwX211eF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShtYWRfc2VsLCBXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAwLAotCW1hZF9zZWxfdHh0KTsKLQotV0NEX0RBUE1fRU5VTShtYWRfaW5wX211eCwgV0NEOTM0WF9DUEVfU1NfU1ZBX0NGRywgMiwKLQltYWRfaW5wX211eF90eHQpOwotCi1XQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQwX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsIDAsCi0JcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCi0JdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQxX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzAsIDAsCi0JcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCi0JdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVChyeF9pbnQyX2RlbV9pbnAsIFdDRDkzNFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzAsIDAsCi0JcnhfaW50X2RlbV9pbnBfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsCi0JdGF2aWxfaW50X2RlbV9pbnBfbXV4X3B1dCk7Ci0KLVdDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXgwLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgwX0NGRzEsIDAsCi0JYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDEsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDFfQ0ZHMSwgMCwKLQlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4MiwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMl9DRkcxLCAwLAotCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKLVdDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXgzLCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgzX0NGRzEsIDAsCi0JYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDQsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDBfQ0ZHMSwgMiwKLQlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4NSwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMV9DRkcxLCAyLAotCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKLVdDRF9EQVBNX0VOVU1fRVhUKHR4X2FkY19tdXg2LCBXQ0Q5MzRYX0NEQ19UWF9JTlBfTVVYX0FEQ19NVVgyX0NGRzEsIDIsCi0JYWRjX211eF90ZXh0LCBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0YXZpbF9kZWNfZW51bV9wdXQpOwotV0NEX0RBUE1fRU5VTV9FWFQodHhfYWRjX211eDcsIFdDRDkzNFhfQ0RDX1RYX0lOUF9NVVhfQURDX01VWDNfQ0ZHMSwgMiwKLQlhZGNfbXV4X3RleHQsIHNuZF9zb2NfZGFwbV9nZXRfZW51bV9kb3VibGUsIHRhdmlsX2RlY19lbnVtX3B1dCk7Ci1XQ0RfREFQTV9FTlVNX0VYVCh0eF9hZGNfbXV4OCwgV0NEOTM0WF9DRENfVFhfSU5QX01VWF9BRENfTVVYMF9DRkcxLCA0LAotCWFkY19tdXhfdGV4dCwgc25kX3NvY19kYXBtX2dldF9lbnVtX2RvdWJsZSwgdGF2aWxfZGVjX2VudW1fcHV0KTsKLQotV0NEX0RBUE1fRU5VTShhc3JjMCwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwLCAwLAotCWFzcmMwX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oYXNyYzEsIFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfU1BMSU5FX0FTUkNfQ0ZHMCwgMiwKLQlhc3JjMV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGFzcmMyLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1NQTElORV9BU1JDX0NGRzAsIDQsCi0JYXNyYzJfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShhc3JjMywgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9TUExJTkVfQVNSQ19DRkcwLCA2LAotCWFzcmMzX211eF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShpbnQxXzFfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGludDJfMV9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oaW50M18xX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShpbnQ0XzFfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7Ci0KLVdDRF9EQVBNX0VOVU0oaW50MV8yX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShpbnQyXzJfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGludDNfMl9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oaW50NF8yX25hdGl2ZSwgU05EX1NPQ19OT1BNLCAwLCBuYXRpdmVfbXV4X3RleHQpOwotV0NEX0RBUE1fRU5VTShpbnQ3XzJfbmF0aXZlLCBTTkRfU09DX05PUE0sIDAsIG5hdGl2ZV9tdXhfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKGludDhfMl9uYXRpdmUsIFNORF9TT0NfTk9QTSwgMCwgbmF0aXZlX211eF90ZXh0KTsKLQotV0NEX0RBUE1fRU5VTShhbmMwX2ZiLCBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX0FOQ19DRkcwLCAwLCBhbmMwX2ZiX211eF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0oYW5jMV9mYiwgV0NEOTM0WF9DRENfUlhfSU5QX01VWF9BTkNfQ0ZHMCwgMywgYW5jMV9mYl9tdXhfdGV4dCk7Ci0KLQotV0NEX0RBUE1fRU5VTSh3ZG1hM19wb3J0MCwgV0NEOTM0WF9ETUFfV0RNQTNfUFJUX0NGRywgMCwgd2RtYTNfcG9ydDBfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHdkbWEzX3BvcnQxLCBXQ0Q5MzRYX0RNQV9XRE1BM19QUlRfQ0ZHLCAxLCB3ZG1hM19wb3J0MV90ZXh0KTsKLVdDRF9EQVBNX0VOVU0od2RtYTNfcG9ydDIsIFdDRDkzNFhfRE1BX1dETUEzX1BSVF9DRkcsIDIsIHdkbWEzX3BvcnQyX3RleHQpOwotV0NEX0RBUE1fRU5VTSh3ZG1hM19wb3J0MywgV0NEOTM0WF9ETUFfV0RNQTNfUFJUX0NGRywgMywgd2RtYTNfcG9ydDNfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHdkbWEzX3BvcnQ0LCBXQ0Q5MzRYX0RNQV9XRE1BM19QUlRfQ0ZHLCA0LCB3ZG1hM19wb3J0NF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0od2RtYTNfcG9ydDUsIFdDRDkzNFhfRE1BX1dETUEzX1BSVF9DRkcsIDUsIHdkbWEzX3BvcnQ1X3RleHQpOwotV0NEX0RBUE1fRU5VTSh3ZG1hM19wb3J0NiwgV0NEOTM0WF9ETUFfV0RNQTNfUFJUX0NGRywgNiwgd2RtYTNfcG9ydDZfdGV4dCk7Ci0KLVdDRF9EQVBNX0VOVU0od2RtYTNfY2gwLCBXQ0Q5MzRYX0RNQV9DSF8wXzFfQ0ZHX1dETUFfMywgMCwgd2RtYTNfY2hfdGV4dCk7Ci1XQ0RfREFQTV9FTlVNKHdkbWEzX2NoMSwgV0NEOTM0WF9ETUFfQ0hfMF8xX0NGR19XRE1BXzMsIDQsIHdkbWEzX2NoX3RleHQpOwotV0NEX0RBUE1fRU5VTSh3ZG1hM19jaDIsIFdDRDkzNFhfRE1BX0NIXzJfM19DRkdfV0RNQV8zLCAwLCB3ZG1hM19jaF90ZXh0KTsKLVdDRF9EQVBNX0VOVU0od2RtYTNfY2gzLCBXQ0Q5MzRYX0RNQV9DSF8yXzNfQ0ZHX1dETUFfMywgNCwgd2RtYTNfY2hfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmNfZWFyX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX2Vhcl9zcGtyX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYW5jX3Nwa3JfcGFfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbmNfaHBobF9wYV9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFuY19ocGhyX3BhX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWFkX2NwZTFfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYWRfY3BlMl9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1hZF9icmRjc3Rfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4MF9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXgxX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDJfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4M19zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg0X3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDVfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZGNfdXNfbXV4Nl9zd2l0Y2ggPQotCVNPQ19EQVBNX1NJTkdMRSgiVVNfU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFkY191c19tdXg3X3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJVU19Td2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWRjX3VzX211eDhfc3dpdGNoID0KLQlTT0NfREFQTV9TSU5HTEUoIlVTX1N3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyByeF9pbnQxX2FzcmNfc3dpdGNoW10gPSB7Ci0JU09DX0RBUE1fU0lOR0xFKCJIUEhMIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnhfaW50Ml9hc3JjX3N3aXRjaFtdID0gewotCVNPQ19EQVBNX1NJTkdMRSgiSFBIUiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDNfYXNyY19zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIkxPMSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ4X2ludDRfYXNyY19zd2l0Y2hbXSA9IHsKLQlTT0NfREFQTV9TSU5HTEUoIkxPMiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdkbWEzX29ub2ZmX3N3aXRjaCA9Ci0JU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDApOwotCi1zdGF0aWMgaW50IHRhdmlsX2RzZF9taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkJCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOwotCWludCB2YWw7Ci0KLQl2YWwgPSB0YXZpbF9kc2RfZ2V0X2N1cnJlbnRfbWl4ZXJfdmFsdWUoZHNkX2NvbmYsIG1jLT5zaGlmdCk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICgodmFsIDwgMCkgPyAwIDogdmFsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2RzZF9taXhlcl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdW5zaWduZWQgaW50IHd2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlzdHJ1Y3QgdGF2aWxfZHNkX2NvbmZpZyAqZHNkX2NvbmYgPSB0YXZpbF9wLT5kc2RfY29uZmlnOwotCi0JaWYgKCFkc2RfY29uZikKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZ0YXZpbF9wLT5jb2RlY19tdXRleCk7Ci0KLQl0YXZpbF9kc2Rfc2V0X291dF9zZWxlY3QoZHNkX2NvbmYsIG1jLT5zaGlmdCk7Ci0JdGF2aWxfZHNkX3NldF9taXhlcl92YWx1ZShkc2RfY29uZiwgbWMtPnNoaWZ0LCB3dmFsKTsKLQotCW11dGV4X3VubG9jaygmdGF2aWxfcC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIoZGFwbSwga2NvbnRyb2wsIHd2YWwsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGhsX21peGVyW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkRTRCBIUEhMIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsIDEsIDAsCi0JCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBocGhyX21peGVyW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkRTRCBIUEhSIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSFIsIDEsIDAsCi0JCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsbzFfbWl4ZXJbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiRFNEIExPMSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzEsIDEsIDAsCi0JCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsbzJfbWl4ZXJbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiRFNEIExPMiBTd2l0Y2giLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzIsIDEsIDAsCi0JCQl0YXZpbF9kc2RfbWl4ZXJfZ2V0LCB0YXZpbF9kc2RfbWl4ZXJfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0YXZpbF9kYXBtX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjEgUEIiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGMV9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjIgUEIiLCAiQUlGMiBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGMl9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjMgUEIiLCAiQUlGMyBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGM19QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRjQgUEIiLCAiQUlGNCBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGNF9QQiwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW1yeCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVdDRF9EQVBNX01VWCgiU0xJTSBSWDAgTVVYIiwgV0NEOTM0WF9SWDAsIHNsaW1fcngwKSwKLQlXQ0RfREFQTV9NVVgoIlNMSU0gUlgxIE1VWCIsIFdDRDkzNFhfUlgxLCBzbGltX3J4MSksCi0JV0NEX0RBUE1fTVVYKCJTTElNIFJYMiBNVVgiLCBXQ0Q5MzRYX1JYMiwgc2xpbV9yeDIpLAotCVdDRF9EQVBNX01VWCgiU0xJTSBSWDMgTVVYIiwgV0NEOTM0WF9SWDMsIHNsaW1fcngzKSwKLQlXQ0RfREFQTV9NVVgoIlNMSU0gUlg0IE1VWCIsIFdDRDkzNFhfUlg0LCBzbGltX3J4NCksCi0JV0NEX0RBUE1fTVVYKCJTTElNIFJYNSBNVVgiLCBXQ0Q5MzRYX1JYNSwgc2xpbV9yeDUpLAotCVdDRF9EQVBNX01VWCgiU0xJTSBSWDYgTVVYIiwgV0NEOTM0WF9SWDYsIHNsaW1fcng2KSwKLQlXQ0RfREFQTV9NVVgoIlNMSU0gUlg3IE1VWCIsIFdDRDkzNFhfUlg3LCBzbGltX3J4NyksCi0KLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgwIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlgzIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg0IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg1IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg2IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gUlg3IiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYMCBNVVgiLCBXQ0Q5MzRYX1JYMCwgY2RjX2lmX3J4MCksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgUlgxIE1VWCIsIFdDRDkzNFhfUlgxLCBjZGNfaWZfcngxKSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBSWDIgTVVYIiwgV0NEOTM0WF9SWDIsIGNkY19pZl9yeDIpLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYMyBNVVgiLCBXQ0Q5MzRYX1JYMywgY2RjX2lmX3J4MyksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgUlg0IE1VWCIsIFdDRDkzNFhfUlg0LCBjZGNfaWZfcng0KSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBSWDUgTVVYIiwgV0NEOTM0WF9SWDUsIGNkY19pZl9yeDUpLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFJYNiBNVVgiLCBXQ0Q5MzRYX1JYNiwgY2RjX2lmX3J4NiksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgUlg3IE1VWCIsIFdDRDkzNFhfUlg3LCBjZGNfaWZfcng3KSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMF8yIE1VWCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0VBUiwgMCwKLQkJJnJ4X2ludDBfMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMV8yIE1VWCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsIDAsCi0JCSZyeF9pbnQxXzJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWl4X3BhdGgsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDJfMiBNVVgiLCBTTkRfU09DX05PUE0sIElOVEVSUF9IUEhSLCAwLAotCQkmcnhfaW50Ml8yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8xLCAwLAotCQkmcnhfaW50M18yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ0XzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8yLCAwLAotCQkmcnhfaW50NF8yX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21peF9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzIgTVVYIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfU1BLUjEsIDAsCi0JCSZyeF9pbnQ3XzJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWl4X3BhdGgsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMiBNVVgiLCBTTkRfU09DX05PUE0sIElOVEVSUF9TUEtSMiwgMCwKLQkJJnJ4X2ludDhfMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9taXhfcGF0aCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQwXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50MF8xX21peF9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDBfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQwXzFfbWl4X2lucDEpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UMF8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDBfMV9taXhfaW5wMiksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQxXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50MV8xX21peF9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQxXzFfbWl4X2lucDEpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UMV8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDFfMV9taXhfaW5wMiksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50Ml8xX21peF9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDJfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQyXzFfbWl4X2lucDEpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UMl8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDJfMV9taXhfaW5wMiksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQzXzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50M18xX21peF9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDNfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQzXzFfbWl4X2lucDEpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UM18xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDNfMV9taXhfaW5wMiksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQ0XzEgTUlYMSBJTlAwIiwgMCwgcnhfaW50NF8xX21peF9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMSBNSVgxIElOUDEiLCAwLCByeF9pbnQ0XzFfbWl4X2lucDEpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UNF8xIE1JWDEgSU5QMiIsIDAsIHJ4X2ludDRfMV9taXhfaW5wMiksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDdfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ3XzFfbWl4X2lucDBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfc3dyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ3XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50N18xX21peF9pbnAxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDdfMV9taXhfaW5wMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9zd3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBNSVgxIElOUDAiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZyeF9pbnQ4XzFfbWl4X2lucDBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfc3dyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ4XzEgTUlYMSBJTlAxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmcnhfaW50OF8xX21peF9pbnAxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3N3ciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UOF8xIE1JWDEgSU5QMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJnJ4X2ludDhfMV9taXhfaW5wMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9zd3IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDFfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJcnhfaW50MV9hc3JjX3N3aXRjaCwgQVJSQVlfU0laRShyeF9pbnQxX2FzcmNfc3dpdGNoKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyXzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXJ4X2ludDJfYXNyY19zd2l0Y2gsIEFSUkFZX1NJWkUocnhfaW50Ml9hc3JjX3N3aXRjaCkpLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UM18xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMyBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQlyeF9pbnQzX2FzcmNfc3dpdGNoLCBBUlJBWV9TSVpFKHJ4X2ludDNfYXNyY19zd2l0Y2gpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDRfMSBNSVgxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDQgU0VDIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJcnhfaW50NF9hc3JjX3N3aXRjaCwgQVJSQVlfU0laRShyeF9pbnQ0X2FzcmNfc3dpdGNoKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3XzEgTUlYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ3IFNFQyBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOF8xIE1JWDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UOCBTRUMgTUlYIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UMCBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDEgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQxIE1JWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIGhwaGxfbWl4ZXIsCi0JCQkgICBBUlJBWV9TSVpFKGhwaGxfbWl4ZXIpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDIgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQyIE1JWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIGhwaHJfbWl4ZXIsCi0JCQkgICBBUlJBWV9TSVpFKGhwaHJfbWl4ZXIpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlJYIElOVDMgTUlYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQzIE1JWDMiLCBTTkRfU09DX05PUE0sIDAsIDAsIGxvMV9taXhlciwKLQkJCSAgIEFSUkFZX1NJWkUobG8xX21peGVyKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJSWCBJTlQ0IE1JWDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNCBNSVgzIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBsbzJfbWl4ZXIsCi0JCQkgICBBUlJBWV9TSVpFKGxvMl9taXhlcikpLAotCVNORF9TT0NfREFQTV9NSVhFUigiUlggSU5UNyBNSVgyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVJfRSgiUlggSU5UNyBDSEFJTiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJTlVMTCwgMCwgdGF2aWxfY29kZWNfc3BrX2Jvb3N0X2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JWEVSX0UoIlJYIElOVDggQ0hBSU4iLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCU5VTEwsIDAsIHRhdmlsX2NvZGVjX3Nwa19ib29zdF9ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQwIE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfRUFSLAotCQkwLCAmcnhfaW50MF9taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMSBNSVgyIElOUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0hQSEwsCi0JCTAsICZyeF9pbnQxX21peDJfaW5wX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3J4X3BhdGhfY2xrLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQyIE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBIUiwKLQkJMCwgJnJ4X2ludDJfbWl4Ml9pbnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfcnhfcGF0aF9jbGssCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDMgTUlYMiBJTlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzEsCi0JCTAsICZyeF9pbnQzX21peDJfaW5wX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX3J4X3BhdGhfY2xrLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQ0IE1JWDIgSU5QIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8yLAotCQkwLCAmcnhfaW50NF9taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UNyBNSVgyIElOUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX1NQS1IxLAotCQkwLCAmcnhfaW50N19taXgyX2lucF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9yeF9wYXRoX2NsaywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgwIE1VWCIsIFdDRDkzNFhfVFgwLCBjZGNfaWZfdHgwKSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEgTVVYIiwgV0NEOTM0WF9UWDEsIGNkY19pZl90eDEpLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYMiBNVVgiLCBXQ0Q5MzRYX1RYMiwgY2RjX2lmX3R4MiksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgzIE1VWCIsIFdDRDkzNFhfVFgzLCBjZGNfaWZfdHgzKSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDQgTVVYIiwgV0NEOTM0WF9UWDQsIGNkY19pZl90eDQpLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYNSBNVVgiLCBXQ0Q5MzRYX1RYNSwgY2RjX2lmX3R4NSksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFg2IE1VWCIsIFdDRDkzNFhfVFg2LCBjZGNfaWZfdHg2KSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDcgTVVYIiwgV0NEOTM0WF9UWDcsIGNkY19pZl90eDcpLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYOCBNVVgiLCBXQ0Q5MzRYX1RYOCwgY2RjX2lmX3R4OCksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFg5IE1VWCIsIFdDRDkzNFhfVFg5LCBjZGNfaWZfdHg5KSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEwIE1VWCIsIFdDRDkzNFhfVFgxMCwgY2RjX2lmX3R4MTApLAotCVdDRF9EQVBNX01VWCgiQ0RDX0lGIFRYMTEgTVVYIiwgV0NEOTM0WF9UWDExLCBjZGNfaWZfdHgxMSksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgxMSBJTlAxIE1VWCIsIFdDRDkzNFhfVFgxMSwgY2RjX2lmX3R4MTFfaW5wMSksCi0JV0NEX0RBUE1fTVVYKCJDRENfSUYgVFgxMyBNVVgiLCBXQ0Q5MzRYX1RYMTMsIGNkY19pZl90eDEzKSwKLQlXQ0RfREFQTV9NVVgoIkNEQ19JRiBUWDEzIElOUDEgTVVYIiwgV0NEOTM0WF9UWDEzLCBjZGNfaWZfdHgxM19pbnAxKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDAiLCBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCSZ0eF9hZGNfbXV4MF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMSIsIFdDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NUTCwgNSwgMCwKLQkJJnR4X2FkY19tdXgxX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgyIiwgV0NEOTM0WF9DRENfVFgyX1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkmdHhfYWRjX211eDJfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDMiLCBXQ0Q5MzRYX0NEQ19UWDNfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCSZ0eF9hZGNfbXV4M19tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNCIsIFdDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NUTCwgNSwgMCwKLQkJJnR4X2FkY19tdXg0X211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg1IiwgV0NEOTM0WF9DRENfVFg1X1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkmdHhfYWRjX211eDVfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDYiLCBXQ0Q5MzRYX0NEQ19UWDZfVFhfUEFUSF9DVEwsIDUsIDAsCi0JCSZ0eF9hZGNfbXV4Nl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9kZWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYNyIsIFdDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NUTCwgNSwgMCwKLQkJJnR4X2FkY19tdXg3X211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2RlYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVg4IiwgV0NEOTM0WF9DRENfVFg4X1RYX1BBVEhfQ1RMLCA1LCAwLAotCQkmdHhfYWRjX211eDhfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfZGVjLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEwIiwgU05EX1NPQ19OT1BNLCAxMCwgMCwgJnR4X2FkY19tdXgxMF9tdXgsCi0JCXRhdmlsX2NvZGVjX3R4X2FkY19jZmcsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFEQyBNVVgxMSIsIFNORF9TT0NfTk9QTSwgMTEsIDAsICZ0eF9hZGNfbXV4MTFfbXV4LAotCQl0YXZpbF9jb2RlY190eF9hZGNfY2ZnLCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAotCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBREMgTVVYMTIiLCBTTkRfU09DX05PUE0sIDEyLCAwLCAmdHhfYWRjX211eDEyX211eCwKLQkJdGF2aWxfY29kZWNfdHhfYWRjX2NmZywgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQURDIE1VWDEzIiwgU05EX1NPQ19OT1BNLCAxMywgMCwgJnR4X2FkY19tdXgxM19tdXgsCi0JCXRhdmlsX2NvZGVjX3R4X2FkY19jZmcsIFNORF9TT0NfREFQTV9QT1NUX1BNVSksCi0KLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMCIsIDAsIHR4X2RtaWNfbXV4MCksCi0JV0NEX0RBUE1fTVVYKCJETUlDIE1VWDEiLCAwLCB0eF9kbWljX211eDEpLAotCVdDRF9EQVBNX01VWCgiRE1JQyBNVVgyIiwgMCwgdHhfZG1pY19tdXgyKSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMyIsIDAsIHR4X2RtaWNfbXV4MyksCi0JV0NEX0RBUE1fTVVYKCJETUlDIE1VWDQiLCAwLCB0eF9kbWljX211eDQpLAotCVdDRF9EQVBNX01VWCgiRE1JQyBNVVg1IiwgMCwgdHhfZG1pY19tdXg1KSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYNiIsIDAsIHR4X2RtaWNfbXV4NiksCi0JV0NEX0RBUE1fTVVYKCJETUlDIE1VWDciLCAwLCB0eF9kbWljX211eDcpLAotCVdDRF9EQVBNX01VWCgiRE1JQyBNVVg4IiwgMCwgdHhfZG1pY19tdXg4KSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTAiLCAwLCB0eF9kbWljX211eDEwKSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTEiLCAwLCB0eF9kbWljX211eDExKSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTIiLCAwLCB0eF9kbWljX211eDEyKSwKLQlXQ0RfREFQTV9NVVgoIkRNSUMgTVVYMTMiLCAwLCB0eF9kbWljX211eDEzKSwKLQotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgwIiwgMCwgdHhfYW1pY19tdXgwKSwKLQlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYMSIsIDAsIHR4X2FtaWNfbXV4MSksCi0JV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDIiLCAwLCB0eF9hbWljX211eDIpLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgzIiwgMCwgdHhfYW1pY19tdXgzKSwKLQlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYNCIsIDAsIHR4X2FtaWNfbXV4NCksCi0JV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDUiLCAwLCB0eF9hbWljX211eDUpLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVg2IiwgMCwgdHhfYW1pY19tdXg2KSwKLQlXQ0RfREFQTV9NVVgoIkFNSUMgTVVYNyIsIDAsIHR4X2FtaWNfbXV4NyksCi0JV0NEX0RBUE1fTVVYKCJBTUlDIE1VWDgiLCAwLCB0eF9hbWljX211eDgpLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMCIsIDAsIHR4X2FtaWNfbXV4MTApLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMSIsIDAsIHR4X2FtaWNfbXV4MTEpLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMiIsIDAsIHR4X2FtaWNfbXV4MTIpLAotCVdDRF9EQVBNX01VWCgiQU1JQyBNVVgxMyIsIDAsIHR4X2FtaWNfbXV4MTMpLAotCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJBREMxIiwgTlVMTCwgV0NEOTM0WF9BTkFfQU1JQzEsIDcsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9hZGMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKLQlTTkRfU09DX0RBUE1fQURDX0UoIkFEQzIiLCBOVUxMLCBXQ0Q5MzRYX0FOQV9BTUlDMiwgNywgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2FkYywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAotCVNORF9TT0NfREFQTV9BRENfRSgiQURDMyIsIE5VTEwsIFdDRDkzNFhfQU5BX0FNSUMzLCA3LCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfYWRjLCBTTkRfU09DX0RBUE1fUFJFX1BNVSksCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJBREM0IiwgTlVMTCwgV0NEOTM0WF9BTkFfQU1JQzQsIDcsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9hZGMsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKLQotCVdDRF9EQVBNX01VWCgiQU1JQzRfNSBTRUwiLCAwLCB0eF9hbWljNF81KSwKLQotCVdDRF9EQVBNX01VWCgiQU5DMCBGQiBNVVgiLCAwLCBhbmMwX2ZiKSwKLQlXQ0RfREFQTV9NVVgoIkFOQzEgRkIgTVVYIiwgMCwgYW5jMV9mYiksCi0KLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUMxIiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDMiIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiQU1JQzMiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIkFNSUM0IiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJBTUlDNSIpLAotCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVMxIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoIk1JQyBCSUFTMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX21pY2JpYXMsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKCJNSUMgQklBUzMiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9taWNiaWFzLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRSgiTUlDIEJJQVM0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfbWljYmlhcywgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JLyoKLQkgKiBOb3Qgc3VwcGx5IHdpZGdldCwgdGhpcyBpcyB1c2VkIHRvIHJlY292ZXIgSFBIIHJlZ2lzdGVycy4KLQkgKiBJdCBpcyBub3QgY29ubmVjdGVkIHRvIGFueSBvdGhlciB3aWRnZXRzCi0JICovCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUkVTRVRfSFBIX1JFR0lTVEVSUyIsIFNORF9TT0NfTk9QTSwKLQkJMCwgMCwgdGF2aWxfY29kZWNfcmVzZXRfaHBoX3JlZ2lzdGVycywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVMxX1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDQklBU19FKERBUE1fTUlDQklBUzJfU1RBTkRBTE9ORSwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19mb3JjZV9lbmFibGVfbWljYmlhcywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSUNCSUFTX0UoREFQTV9NSUNCSUFTM19TVEFOREFMT05FLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhdmlsX2NvZGVjX2ZvcmNlX2VuYWJsZV9taWNiaWFzLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01JQ0JJQVNfRShEQVBNX01JQ0JJQVM0X1NUQU5EQUxPTkUsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGF2aWxfY29kZWNfZm9yY2VfZW5hYmxlX21pY2JpYXMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9BSUZfT1VUX0UoIkFJRjEgQ0FQIiwgIkFJRjEgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwKLQkJQUlGMV9DQVAsIDAsIHRhdmlsX2NvZGVjX2VuYWJsZV9zbGltdHgsCi0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGMiBDQVAiLCAiQUlGMiBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLAotCQlBSUYyX0NBUCwgMCwgdGF2aWxfY29kZWNfZW5hYmxlX3NsaW10eCwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUYzIENBUCIsICJBSUYzIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sCi0JCUFJRjNfQ0FQLCAwLCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXR4LAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGMV9DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjFfQ0FQLCAwLAotCQlhaWYxX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYxX2NhcF9taXhlcikpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGMl9DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjJfQ0FQLCAwLAotCQlhaWYyX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYyX2NhcF9taXhlcikpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGM19DQVAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjNfQ0FQLCAwLAotCQlhaWYzX2NhcF9taXhlciwgQVJSQVlfU0laRShhaWYzX2NhcF9taXhlcikpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9NQUQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIEFJRjRfTUFEX1RYLCAwLAotCQlhaWY0X21hZF9taXhlciwgQVJSQVlfU0laRShhaWY0X21hZF9taXhlcikpLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVRfRSgiQUlGNCBWSSIsICJWSWZlZWQiLCAwLCBTTkRfU09DX05PUE0sCi0JCUFJRjRfVklGRUVELCAwLCB0YXZpbF9jb2RlY19lbmFibGVfc2xpbXZpX2ZlZWRiYWNrLAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjQgTUFEIiwgIkFJRjQgTUFEIFRYIiwgMCwKLQkJU05EX1NPQ19OT1BNLCAwLCAwKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUigiQUlGNF9WSSBNaXhlciIsIFNORF9TT0NfTk9QTSwgQUlGNF9WSUZFRUQsIDAsCi0JCWFpZjRfdmlfbWl4ZXIsIEFSUkFZX1NJWkUoYWlmNF92aV9taXhlcikpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiVklJTlBVVCIpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYNyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYOCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYOSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNIFRYMTAiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTSBUWDExIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU0gVFgxMyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0KLQkvKiBEaWdpdGFsIE1pYyBJbnB1dHMgKi8KLQlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMwIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfZG1pYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzEiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9kbWljLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDMiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2RtaWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fQURDX0UoIkRNSUMzIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfZG1pYywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9BRENfRSgiRE1JQzQiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9kbWljLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJETUlDNSIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2RtaWMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVdDRF9EQVBNX01VWCgiSUlSMCBJTlAwIE1VWCIsIDAsIGlpcjBfaW5wMCksCi0JV0NEX0RBUE1fTVVYKCJJSVIwIElOUDEgTVVYIiwgMCwgaWlyMF9pbnAxKSwKLQlXQ0RfREFQTV9NVVgoIklJUjAgSU5QMiBNVVgiLCAwLCBpaXIwX2lucDIpLAotCVdDRF9EQVBNX01VWCgiSUlSMCBJTlAzIE1VWCIsIDAsIGlpcjBfaW5wMyksCi0JV0NEX0RBUE1fTVVYKCJJSVIxIElOUDAgTVVYIiwgMCwgaWlyMV9pbnAwKSwKLQlXQ0RfREFQTV9NVVgoIklJUjEgSU5QMSBNVVgiLCAwLCBpaXIxX2lucDEpLAotCVdDRF9EQVBNX01VWCgiSUlSMSBJTlAyIE1VWCIsIDAsIGlpcjFfaW5wMiksCi0JV0NEX0RBUE1fTVVYKCJJSVIxIElOUDMgTVVYIiwgMCwgaWlyMV9pbnAzKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIwIiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMF9JSVJfUEFUSF9DVEwsCi0JCTQsIDAsIE5VTEwsIDAsIHRhdmlsX2NvZGVjX3NldF9paXJfZ2FpbiwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJJSVIxIiwgV0NEOTM0WF9DRENfU0lERVRPTkVfSUlSMV9JSVJfUEFUSF9DVEwsCi0JCTQsIDAsIE5VTEwsIDAsIHRhdmlsX2NvZGVjX3NldF9paXJfZ2FpbiwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU1JDMCIsIFdDRDkzNFhfQ0RDX1NJREVUT05FX1NSQzBfU1RfU1JDX1BBVEhfQ1RMLAotCQk0LCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNSQzEiLCBXQ0Q5MzRYX0NEQ19TSURFVE9ORV9TUkMxX1NUX1NSQ19QQVRIX0NUTCwKLQkJNCwgMCwgTlVMTCwgMCksCi0KLQlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDAgTVVYIiwgMCwgcnhfbWl4X3R4MCksCi0JV0NEX0RBUE1fTVVYKCJSWCBNSVggVFgxIE1VWCIsIDAsIHJ4X21peF90eDEpLAotCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYMiBNVVgiLCAwLCByeF9taXhfdHgyKSwKLQlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDMgTVVYIiwgMCwgcnhfbWl4X3R4MyksCi0JV0NEX0RBUE1fTVVYKCJSWCBNSVggVFg0IE1VWCIsIDAsIHJ4X21peF90eDQpLAotCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYNSBNVVgiLCAwLCByeF9taXhfdHg1KSwKLQlXQ0RfREFQTV9NVVgoIlJYIE1JWCBUWDYgTVVYIiwgMCwgcnhfbWl4X3R4NiksCi0JV0NEX0RBUE1fTVVYKCJSWCBNSVggVFg3IE1VWCIsIDAsIHJ4X21peF90eDcpLAotCVdDRF9EQVBNX01VWCgiUlggTUlYIFRYOCBNVVgiLCAwLCByeF9taXhfdHg4KSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDAgREVNIE1VWCIsIDAsIHJ4X2ludDBfZGVtX2lucCksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQxIERFTSBNVVgiLCAwLCByeF9pbnQxX2RlbV9pbnApLAotCVdDRF9EQVBNX01VWCgiUlggSU5UMiBERU0gTVVYIiwgMCwgcnhfaW50Ml9kZW1faW5wKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UMF8xIElOVEVSUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX0VBUiwgMCwKLQkJJnJ4X2ludDBfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQxXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBITCwgMCwKLQkJJnJ4X2ludDFfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQyXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBIUiwgMCwKLQkJJnJ4X2ludDJfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJSWCBJTlQzXzEgSU5URVJQIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfTE8xLCAwLAotCQkmcnhfaW50M18xX2ludGVycF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9tYWluX3BhdGgsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDRfMSBJTlRFUlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9MTzIsIDAsCi0JCSZyeF9pbnQ0XzFfaW50ZXJwX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX21haW5fcGF0aCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiUlggSU5UN18xIElOVEVSUCIsIFNORF9TT0NfTk9QTSwgSU5URVJQX1NQS1IxLCAwLAotCQkmcnhfaW50N18xX2ludGVycF9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9tYWluX3BhdGgsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIlJYIElOVDhfMSBJTlRFUlAiLCBTTkRfU09DX05PUE0sIElOVEVSUF9TUEtSMiwgMCwKLQkJJnJ4X2ludDhfMV9pbnRlcnBfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfbWFpbl9wYXRoLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlXQ0RfREFQTV9NVVgoIlJYIElOVDBfMiBJTlRFUlAiLCAwLCByeF9pbnQwXzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMiBJTlRFUlAiLCAwLCByeF9pbnQxXzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDJfMiBJTlRFUlAiLCAwLCByeF9pbnQyXzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDNfMiBJTlRFUlAiLCAwLCByeF9pbnQzXzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMiBJTlRFUlAiLCAwLCByeF9pbnQ0XzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDdfMiBJTlRFUlAiLCAwLCByeF9pbnQ3XzJfaW50ZXJwKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDhfMiBJTlRFUlAiLCAwLCByeF9pbnQ4XzJfaW50ZXJwKSwKLQotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgwIiwgV0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJMCwgJmFkY191c19tdXgwX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDEiLCBXQ0Q5MzRYX0NEQ19UWDFfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkwLCAmYWRjX3VzX211eDFfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYMiIsIFdDRDkzNFhfQ0RDX1RYMl9UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCTAsICZhZGNfdXNfbXV4Ml9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVgzIiwgV0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJMCwgJmFkY191c19tdXgzX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDQiLCBXQ0Q5MzRYX0NEQ19UWDRfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkwLCAmYWRjX3VzX211eDRfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYNSIsIFdDRDkzNFhfQ0RDX1RYNV9UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCTAsICZhZGNfdXNfbXV4NV9zd2l0Y2gpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkFEQyBVUyBNVVg2IiwgV0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfMTkyX0NUTCwgMCwKLQkJMCwgJmFkY191c19tdXg2X3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQURDIFVTIE1VWDciLCBXQ0Q5MzRYX0NEQ19UWDdfVFhfUEFUSF8xOTJfQ1RMLCAwLAotCQkwLCAmYWRjX3VzX211eDdfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBREMgVVMgTVVYOCIsIFdDRDkzNFhfQ0RDX1RYOF9UWF9QQVRIXzE5Ml9DVEwsIDAsCi0JCTAsICZhZGNfdXNfbXV4OF9zd2l0Y2gpLAotCi0JLyogTUFEIHJlbGF0ZWQgd2lkZ2V0cyAqLwotCVNORF9TT0NfREFQTV9JTlBVVCgiTUFEX0NQRV9JTlBVVCIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiTUFESU5QVVQiKSwKLQotCVdDRF9EQVBNX01VWCgiTUFEX1NFTCBNVVgiLCAwLCBtYWRfc2VsKSwKLQlXQ0RfREFQTV9NVVgoIk1BRF9JTlAgTVVYIiwgMCwgbWFkX2lucF9tdXgpLAotCi0JU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQlJPQURDQVNUIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgICAgJm1hZF9icmRjc3Rfc3dpdGNoLCB0YXZpbF9jb2RlY19hcGVfZW5hYmxlX21hZCwKLQkJCSAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQ1BFMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICZtYWRfY3BlMV9zd2l0Y2gsIHRhdmlsX2NvZGVjX2NwZV9tYWRfY3RsLAotCQkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJNQURfQ1BFMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICZtYWRfY3BlMl9zd2l0Y2gsIHRhdmlsX2NvZGVjX2NwZV9tYWRfY3RsLAotCQkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJNQURfQ1BFX09VVDEiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJNQURfQ1BFX09VVDIiKSwKLQotCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMCBEQUMiLCBOVUxMLCBTTkRfU09DX05PUE0sCi0JCTAsIDAsIHRhdmlsX2NvZGVjX2Vhcl9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9EQUNfRSgiUlggSU5UMSBEQUMiLCBOVUxMLCBXQ0Q5MzRYX0FOQV9IUEgsCi0JCTUsIDAsIHRhdmlsX2NvZGVjX2hwaGxfZGFjX2V2ZW50LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDIgREFDIiwgTlVMTCwgV0NEOTM0WF9BTkFfSFBILAotCQk0LCAwLCB0YXZpbF9jb2RlY19ocGhyX2RhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJSWCBJTlQzIERBQyIsIE5VTEwsIFNORF9TT0NfTk9QTSwKLQkJMCwgMCwgdGF2aWxfY29kZWNfbGluZW91dF9kYWNfZXZlbnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fREFDX0UoIlJYIElOVDQgREFDIiwgTlVMTCwgU05EX1NPQ19OT1BNLAotCQkwLCAwLCB0YXZpbF9jb2RlY19saW5lb3V0X2RhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJFQVIgUEEiLCBXQ0Q5MzRYX0FOQV9FQVIsIDcsIDAsIE5VTEwsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9lYXJfcGEsCi0JCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhMIFBBIiwgV0NEOTM0WF9BTkFfSFBILCA3LCAwLCBOVUxMLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfaHBobF9wYSwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJIUEhSIFBBIiwgV0NEOTM0WF9BTkFfSFBILCA2LCAwLCBOVUxMLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfaHBocl9wYSwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJMSU5FT1VUMSBQQSIsIFdDRDkzNFhfQU5BX0xPXzFfMiwgNywgMCwgTlVMTCwgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2xpbmVvdXRfcGEsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9QR0FfRSgiTElORU9VVDIgUEEiLCBXQ0Q5MzRYX0FOQV9MT18xXzIsIDYsIDAsIE5VTEwsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9saW5lb3V0X3BhLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBFQVIgUEEiLCBXQ0Q5MzRYX0FOQV9FQVIsIDcsIDAsIE5VTEwsIDAsCi0JCXRhdmlsX2NvZGVjX2VuYWJsZV9lYXJfcGEsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBTUEsxIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfc3Brcl9hbmMsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fUEdBX0UoIkFOQyBIUEhMIFBBIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfaHBobF9wYSwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJBTkMgSFBIUiBQQSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCwKLQkJdGF2aWxfY29kZWNfZW5hYmxlX2hwaHJfcGEsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiRUFSIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiSFBITCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQSFIiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJMSU5FT1VUMSIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkxJTkVPVVQyIiksCi0JU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLMSBPVVQiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEsyIE9VVCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBFQVIiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJBTkMgSFBITCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkFOQyBIUEhSIiksCi0KLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgT1VUIEVBUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZhbmNfZWFyX3N3aXRjaCksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiQU5DIE9VVCBFQVIgU1BLUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZhbmNfZWFyX3Nwa3Jfc3dpdGNoKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJBTkMgU1BLUiBQQSBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZhbmNfc3Brcl9wYV9zd2l0Y2gpLAotCi0JU05EX1NPQ19EQVBNX1NXSVRDSF9FKCJBTkMgT1VUIEhQSEwgRW5hYmxlIiwgU05EX1NPQ19OT1BNLCBJTlRFUlBfSFBITCwKLQkJMCwgJmFuY19ocGhsX3BhX3N3aXRjaCwgdGF2aWxfYW5jX291dF9zd2l0Y2hfY2IsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCSBTTkRfU09DX0RBUE1fU1dJVENIX0UoIkFOQyBPVVQgSFBIUiBFbmFibGUiLCBTTkRfU09DX05PUE0sIElOVEVSUF9IUEhSLAotCQkwLCAmYW5jX2hwaHJfcGFfc3dpdGNoLCB0YXZpbF9hbmNfb3V0X3N3aXRjaF9jYiwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWF9CSUFTIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQl0YXZpbF9jb2RlY19lbmFibGVfcnhfYmlhcywKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUlggSU5UMSBOQVRJVkUgU1VQUExZIiwgU05EX1NPQ19OT1BNLAotCQlJTlRFUlBfSFBITCwgMCwgdGF2aWxfZW5hYmxlX25hdGl2ZV9zdXBwbHksCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDIgTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKLQkJSU5URVJQX0hQSFIsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQzIE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCi0JCUlOVEVSUF9MTzEsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ0IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCi0JCUlOVEVSUF9MTzIsIDAsIHRhdmlsX2VuYWJsZV9uYXRpdmVfc3VwcGx5LAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZKCJSWCBJTlQ3IE5BVElWRSBTVVBQTFkiLCBTTkRfU09DX05PUE0sCi0JCUlOVEVSUF9TUEtSMSwgMCwgdGF2aWxfZW5hYmxlX25hdGl2ZV9zdXBwbHksCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIlJYIElOVDggTkFUSVZFIFNVUFBMWSIsIFNORF9TT0NfTk9QTSwKLQkJSU5URVJQX1NQS1IyLCAwLCB0YXZpbF9lbmFibGVfbmF0aXZlX3N1cHBseSwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCksCi0KLQlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMSBOQVRJVkUgTVVYIiwgMCwgaW50MV8xX25hdGl2ZSksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzEgTkFUSVZFIE1VWCIsIDAsIGludDJfMV9uYXRpdmUpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UM18xIE5BVElWRSBNVVgiLCAwLCBpbnQzXzFfbmF0aXZlKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMSBOQVRJVkUgTVVYIiwgMCwgaW50NF8xX25hdGl2ZSksCi0KLQlXQ0RfREFQTV9NVVgoIlJYIElOVDFfMiBOQVRJVkUgTVVYIiwgMCwgaW50MV8yX25hdGl2ZSksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQyXzIgTkFUSVZFIE1VWCIsIDAsIGludDJfMl9uYXRpdmUpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UM18yIE5BVElWRSBNVVgiLCAwLCBpbnQzXzJfbmF0aXZlKSwKLQlXQ0RfREFQTV9NVVgoIlJYIElOVDRfMiBOQVRJVkUgTVVYIiwgMCwgaW50NF8yX25hdGl2ZSksCi0JV0NEX0RBUE1fTVVYKCJSWCBJTlQ3XzIgTkFUSVZFIE1VWCIsIDAsIGludDdfMl9uYXRpdmUpLAotCVdDRF9EQVBNX01VWCgiUlggSU5UOF8yIE5BVElWRSBNVVgiLCAwLCBpbnQ4XzJfbmF0aXZlKSwKLQotCVNORF9TT0NfREFQTV9NVVhfRSgiQVNSQzAgTVVYIiwgU05EX1NPQ19OT1BNLCBBU1JDMCwgMCwKLQkJJmFzcmMwX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2FzcmNfcmVzYW1wbGVyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0JU05EX1NPQ19EQVBNX01VWF9FKCJBU1JDMSBNVVgiLCBTTkRfU09DX05PUE0sIEFTUkMxLCAwLAotCQkmYXNyYzFfbXV4LCB0YXZpbF9jb2RlY19lbmFibGVfYXNyY19yZXNhbXBsZXIsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTVVYX0UoIkFTUkMyIE1VWCIsIFNORF9TT0NfTk9QTSwgQVNSQzIsIDAsCi0JCSZhc3JjMl9tdXgsIHRhdmlsX2NvZGVjX2VuYWJsZV9hc3JjX3Jlc2FtcGxlciwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCVNORF9TT0NfREFQTV9NVVhfRSgiQVNSQzMgTVVYIiwgU05EX1NPQ19OT1BNLCBBU1JDMywgMCwKLQkJJmFzcmMzX211eCwgdGF2aWxfY29kZWNfZW5hYmxlX2FzcmNfcmVzYW1wbGVyLAotCQlTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQkvKiBXRE1BMyB3aWRnZXRzICovCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUMCBNVVgiLCAwLCB3ZG1hM19wb3J0MCksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUMSBNVVgiLCAxLCB3ZG1hM19wb3J0MSksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUMiBNVVgiLCAyLCB3ZG1hM19wb3J0MiksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUMyBNVVgiLCAzLCB3ZG1hM19wb3J0MyksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUNCBNVVgiLCA0LCB3ZG1hM19wb3J0NCksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUNSBNVVgiLCA1LCB3ZG1hM19wb3J0NSksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBQT1JUNiBNVVgiLCA2LCB3ZG1hM19wb3J0NiksCi0KLQlXQ0RfREFQTV9NVVgoIldETUEzIENIMCBNVVgiLCAwLCB3ZG1hM19jaDApLAotCVdDRF9EQVBNX01VWCgiV0RNQTMgQ0gxIE1VWCIsIDQsIHdkbWEzX2NoMSksCi0JV0NEX0RBUE1fTVVYKCJXRE1BMyBDSDIgTVVYIiwgMCwgd2RtYTNfY2gyKSwKLQlXQ0RfREFQTV9NVVgoIldETUEzIENIMyBNVVgiLCA0LCB3ZG1hM19jaDMpLAotCi0JU05EX1NPQ19EQVBNX01JWEVSKCJXRE1BM19DSF9NSVhFUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCi0KLQlTTkRfU09DX0RBUE1fU1dJVENIX0UoIldETUEzX09OX09GRiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgICZ3ZG1hM19vbm9mZl9zd2l0Y2gsIHRhdmlsX2NvZGVjX3dkbWEzX2N0bCwKLQkJCSAgICAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9PVVRQVVQoIldETUEzX09VVCIpLAotfTsKLQotc3RhdGljIGludCB0YXZpbF9nZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJIHVuc2lnbmVkIGludCAqdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCi0JCQkJIHVuc2lnbmVkIGludCAqcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShkYWktPmNvZGVjKTsKLQl1MzIgaSA9IDA7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChkYWktPmlkKSB7Ci0JY2FzZSBBSUYxX1BCOgotCWNhc2UgQUlGMl9QQjoKLQljYXNlIEFJRjNfUEI6Ci0JY2FzZSBBSUY0X1BCOgotCQlpZiAoIXJ4X3Nsb3QgfHwgIXJ4X251bSkgewotCQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IEludmFsaWQgcnhfc2xvdCAweCVwSyBvciByeF9udW0gMHglcEtcbiIsCi0JCQkJIF9fZnVuY19fLCByeF9zbG90LCByeF9udW0pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2gsICZ0YXZpbC0+ZGFpW2RhaS0+aWRdLndjZDl4eHhfY2hfbGlzdCwKLQkJCQkgICAgbGlzdCkgewotCQkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IHNsb3RfbnVtICV1IGNoLT5jaF9udW0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBpLCBjaC0+Y2hfbnVtKTsKLQkJCXJ4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07Ci0JCX0KLQkJKnJ4X251bSA9IGk7Ci0JCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBkYWlfbmFtZSA9ICVzIGRhaV9pZCA9ICV4ICByeF9udW0gPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQsIGkpOwotCQlpZiAoKnJ4X251bSA9PSAwKSB7Ci0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogQ2hhbm5lbCBsaXN0IGVtcHR5IGZvciBkYWlfbmFtZSA9ICVzIGRhaV9pZCA9ICV4XG4iLAotCQkJCV9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQljYXNlIEFJRjFfQ0FQOgotCWNhc2UgQUlGMl9DQVA6Ci0JY2FzZSBBSUYzX0NBUDoKLQljYXNlIEFJRjRfTUFEX1RYOgotCWNhc2UgQUlGNF9WSUZFRUQ6Ci0JCWlmICghdHhfc2xvdCB8fCAhdHhfbnVtKSB7Ci0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogSW52YWxpZCB0eF9zbG90IDB4JXBLIG9yIHR4X251bSAweCVwS1xuIiwKLQkJCQkgX19mdW5jX18sIHR4X3Nsb3QsIHR4X251bSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRhdmlsLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LAotCQkJCSAgICBsaXN0KSB7Ci0JCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogc2xvdF9udW0gJXUgY2gtPmNoX251bSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIGksICBjaC0+Y2hfbnVtKTsKLQkJCXR4X3Nsb3RbaSsrXSA9IGNoLT5jaF9udW07Ci0JCX0KLQkJKnR4X251bSA9IGk7Ci0JCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBkYWlfbmFtZSA9ICVzIGRhaV9pZCA9ICV4ICB0eF9udW0gPSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCBpKTsKLQkJaWYgKCp0eF9udW0gPT0gMCkgewotCQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IENoYW5uZWwgbGlzdCBlbXB0eSBmb3IgZGFpX25hbWUgPSAlcyBkYWlfaWQgPSAleFxuIiwKLQkJCQkgX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIERBSSBJRCAleFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJIHVuc2lnbmVkIGludCB0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKLQkJCQkgdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29yZTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb2RlY19kYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCi0JdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOwotCWNvcmUgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JaWYgKCF0eF9zbG90IHx8ICFyeF9zbG90KSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIHR4X3Nsb3QgMHglcEssIHJ4X3Nsb3QgMHglcEtcbiIsCi0JCQlfX2Z1bmNfXywgdHhfc2xvdCwgcnhfc2xvdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlcygpOiBkYWlfbmFtZSA9ICVzIERBSS1JRCAleCB0eF9jaCAlZCByeF9jaCAlZFxuIiwKLQkJIF9fZnVuY19fLCBkYWktPm5hbWUsIGRhaS0+aWQsIHR4X251bSwgcnhfbnVtKTsKLQotCXdjZDl4eHhfaW5pdF9zbGltc2xhdmUoY29yZSwgY29yZS0+c2xpbS0+bGFkZHIsCi0JCQkJdHhfbnVtLCB0eF9zbG90LCByeF9udW0sIHJ4X3Nsb3QpOwotCS8qIFJlc2VydmUgVFgxMyBmb3IgTUFEIGRhdGEgY2hhbm5lbCAqLwotCWRhaV9kYXRhID0gJnRhdmlsLT5kYWlbQUlGNF9NQURfVFhdOwotCWlmIChkYWlfZGF0YSkKLQkJbGlzdF9hZGRfdGFpbCgmY29yZS0+dHhfY2hzW1dDRDkzNFhfVFgxM10ubGlzdCwKLQkJCSAgICAgICZkYWlfZGF0YS0+d2NkOXh4eF9jaF9saXN0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3NldF9kZWNpbWF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgICAgdTMyIHNhbXBsZV9yYXRlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXUzMiB0eF9wb3J0ID0gMCwgdHhfZnNfcmF0ZSA9IDA7Ci0JdTggc2hpZnQgPSAwLCBzaGlmdF92YWwgPSAwLCB0eF9tdXhfc2VsID0gMDsKLQlpbnQgZGVjaW1hdG9yID0gLTE7Ci0JdTE2IHR4X3BvcnRfcmVnID0gMCwgdHhfZnNfcmVnID0gMDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIDgwMDA6Ci0JCXR4X2ZzX3JhdGUgPSAwOwotCQlicmVhazsKLQljYXNlIDE2MDAwOgotCQl0eF9mc19yYXRlID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjAwMDoKLQkJdHhfZnNfcmF0ZSA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgNDgwMDA6Ci0JCXR4X2ZzX3JhdGUgPSA0OwotCQlicmVhazsKLQljYXNlIDk2MDAwOgotCQl0eF9mc19yYXRlID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSAxOTIwMDA6Ci0JCXR4X2ZzX3JhdGUgPSA2OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogSW52YWxpZCBUWCBzYW1wbGUgcmF0ZTogJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCX07Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGF2aWwtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJdHhfcG9ydCA9IGNoLT5wb3J0OwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZGFpLT5pZCA9ICVkLCB0eF9wb3J0ID0gJWQiLAotCQkJX19mdW5jX18sIGRhaS0+aWQsIHR4X3BvcnQpOwotCi0JCWlmICgodHhfcG9ydCA8IDApIHx8ICh0eF9wb3J0ID09IDEyKSB8fCAodHhfcG9ydCA+PSAxNCkpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIFNMSU0gVFgldSBwb3J0LiBEQUkgSUQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCB0eF9wb3J0LCBkYWktPmlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCS8qIEZpbmQgdGhlIFNCIFRYIE1VWCBpbnB1dCAtIHdoaWNoIGRlY2ltYXRvciBpcyBjb25uZWN0ZWQgKi8KLQkJaWYgKHR4X3BvcnQgPCA0KSB7Ci0JCQl0eF9wb3J0X3JlZyA9IFdDRDkzNFhfQ0RDX0lGX1JPVVRFUl9UWF9NVVhfQ0ZHMDsKLQkJCXNoaWZ0ID0gKHR4X3BvcnQgPDwgMSk7Ci0JCQlzaGlmdF92YWwgPSAweDAzOwotCQl9IGVsc2UgaWYgKCh0eF9wb3J0ID49IDQpICYmICh0eF9wb3J0IDwgOCkpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcxOwotCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA0KSA8PCAxKTsKLQkJCXNoaWZ0X3ZhbCA9IDB4MDM7Ci0JCX0gZWxzZSBpZiAoKHR4X3BvcnQgPj0gOCkgJiYgKHR4X3BvcnQgPCAxMSkpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkcyOwotCQkJc2hpZnQgPSAoKHR4X3BvcnQgLSA4KSA8PCAxKTsKLQkJCXNoaWZ0X3ZhbCA9IDB4MDM7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgewotCQkJdHhfcG9ydF9yZWcgPSBXQ0Q5MzRYX0NEQ19JRl9ST1VURVJfVFhfTVVYX0NGRzM7Ci0JCQlzaGlmdCA9IDA7Ci0JCQlzaGlmdF92YWwgPSAweDBGOwotCQl9IGVsc2UgaWYgKHR4X3BvcnQgPT0gMTMpIHsKLQkJCXR4X3BvcnRfcmVnID0gV0NEOTM0WF9DRENfSUZfUk9VVEVSX1RYX01VWF9DRkczOwotCQkJc2hpZnQgPSA0OwotCQkJc2hpZnRfdmFsID0gMHgwMzsKLQkJfQotCQl0eF9tdXhfc2VsID0gc25kX3NvY19yZWFkKGNvZGVjLCB0eF9wb3J0X3JlZykgJgotCQkJCQkgIChzaGlmdF92YWwgPDwgc2hpZnQpOwotCQl0eF9tdXhfc2VsID0gdHhfbXV4X3NlbCA+PiBzaGlmdDsKLQotCQlpZiAodHhfcG9ydCA8PSA4KSB7Ci0JCQlpZiAoKHR4X211eF9zZWwgPT0gMHgyKSB8fCAodHhfbXV4X3NlbCA9PSAweDMpKQotCQkJCWRlY2ltYXRvciA9IHR4X3BvcnQ7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA8PSAxMCkgewotCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKLQkJCQlkZWNpbWF0b3IgPSAoKHR4X3BvcnQgPT0gOSkgPyA3IDogNik7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMSkgewotCQkJaWYgKCh0eF9tdXhfc2VsID49IDEpICYmICh0eF9tdXhfc2VsIDwgNykpCi0JCQkJZGVjaW1hdG9yID0gdHhfbXV4X3NlbCAtIDE7Ci0JCX0gZWxzZSBpZiAodHhfcG9ydCA9PSAxMykgewotCQkJaWYgKCh0eF9tdXhfc2VsID09IDB4MSkgfHwgKHR4X211eF9zZWwgPT0gMHgyKSkKLQkJCQlkZWNpbWF0b3IgPSA1OwotCQl9Ci0KLQkJaWYgKGRlY2ltYXRvciA+PSAwKSB7Ci0JCQl0eF9mc19yZWcgPSBXQ0Q5MzRYX0NEQ19UWDBfVFhfUEFUSF9DVEwgKwotCQkJCSAgICAxNiAqIGRlY2ltYXRvcjsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXQgREVDJXUgKC0+IFNMSU1fVFgldSkgcmF0ZSB0byAldVxuIiwKLQkJCQlfX2Z1bmNfXywgZGVjaW1hdG9yLCB0eF9wb3J0LCBzYW1wbGVfcmF0ZSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCB0eF9mc19yZWcsIDB4MEYsIHR4X2ZzX3JhdGUpOwotCQl9IGVsc2UgaWYgKCh0eF9wb3J0IDw9IDgpICYmICh0eF9tdXhfc2VsID09IDB4MDEpKSB7Ci0JCQkvKiBDaGVjayBpZiB0aGUgVFggTXV4IGlucHV0IGlzIFJYIE1JWCBUWG4gKi8KLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBSWF9NSVhfVFgldSBnb2luZyB0byBDRENfSUYgVFgldVxuIiwKLQkJCQkJX19mdW5jX18sIHR4X3BvcnQsIHR4X3BvcnQpOwotCQl9IGVsc2UgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEVSUk9SOiBJbnZhbGlkIGRlY2ltYXRvcjogJWRcbiIsCi0JCQkJX19mdW5jX18sIGRlY2ltYXRvcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9zZXRfbWl4X2ludGVycG9sYXRvcl9yYXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCQkgICB1OCByYXRlX3JlZ192YWwsCi0JCQkJCSAgIHUzMiBzYW1wbGVfcmF0ZSkKLXsKLQl1OCBpbnRfMl9pbnA7Ci0JdTMyIGo7Ci0JdTE2IGludF9tdXhfY2ZnMSwgaW50X2ZzX3JlZzsKLQl1OCBpbnRfbXV4X2NmZzFfdmFsOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHhfY2ggKmNoOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJnRhdmlsLT5kYWlbZGFpLT5pZF0ud2NkOXh4eF9jaF9saXN0LCBsaXN0KSB7Ci0JCWludF8yX2lucCA9IElOVG5fMl9JTlBfU0VMX1JYMCArIGNoLT5wb3J0IC0KLQkJCQkJCVdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVI7Ci0JCWlmICgoaW50XzJfaW5wIDwgSU5Ubl8yX0lOUF9TRUxfUlgwKSB8fAotCQkgICAgKGludF8yX2lucCA+IElOVG5fMl9JTlBfU0VMX1JYNykpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIFJYJXUgcG9ydCwgRGFpIElEIGlzICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCShjaC0+cG9ydCAtIFdDRDkzNFhfUlhfUE9SVF9TVEFSVF9OVU1CRVIpLAotCQkJCWRhaS0+aWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpbnRfbXV4X2NmZzEgPSBXQ0Q5MzRYX0NEQ19SWF9JTlBfTVVYX1JYX0lOVDBfQ0ZHMTsKLQkJZm9yIChqID0gMDsgaiA8IFdDRDkzNFhfTlVNX0lOVEVSUE9MQVRPUlM7IGorKykgewotCQkJLyogSW50ZXJwb2xhdG9ycyA1IGFuZCA2IGFyZSBub3QgYXZpbGlhYmxlIGluIFRhdmlsICovCi0JCQlpZiAoaiA9PSBJTlRFUlBfTE8zX05BIHx8IGogPT0gSU5URVJQX0xPNF9OQSkgewotCQkJCWludF9tdXhfY2ZnMSArPSAyOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW50X211eF9jZmcxX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgaW50X211eF9jZmcxKSAmCi0JCQkJCQkJCQkweDBGOwotCQkJaWYgKGludF9tdXhfY2ZnMV92YWwgPT0gaW50XzJfaW5wKSB7Ci0JCQkJLyoKLQkJCQkgKiBFYXIgbWl4IHBhdGggc3VwcG9ydHMgb25seSA0OCwgOTYsIDE5MiwKLQkJCQkgKiAzODRLSHogb25seQotCQkJCSAqLwotCQkJCWlmICgoaiA9PSBJTlRFUlBfRUFSKSAmJgotCQkJCSAgICAocmF0ZV9yZWdfdmFsIDwgMHg0IHx8Ci0JCQkJICAgICByYXRlX3JlZ192YWwgPiAweDcpKSB7Ci0JCQkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBJbnZhbGlkIHJhdGUgZm9yIEFJRl9QQiBEQUkoJWQpXG4iLAotCQkJCQkgIF9fZnVuY19fLCBkYWktPmlkKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJaW50X2ZzX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX01JWF9DVEwgKwotCQkJCQkJCQkJMjAgKiBqOwotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBBSUZfUEIgREFJKCVkKSBjb25uZWN0ZWQgdG8gSU5UJXVfMlxuIiwKLQkJCQkJICBfX2Z1bmNfXywgZGFpLT5pZCwgaik7Ci0JCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldCBJTlQldV8yIHNhbXBsZSByYXRlIHRvICV1XG4iLAotCQkJCQlfX2Z1bmNfXywgaiwgc2FtcGxlX3JhdGUpOwotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludF9mc19yZWcsIDB4MEYsCi0JCQkJCQkgICAgcmF0ZV9yZWdfdmFsKTsKLQkJCX0KLQkJCWludF9tdXhfY2ZnMSArPSAyOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3NldF9wcmltX2ludGVycG9sYXRvcl9yYXRlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCQkgICAgdTggcmF0ZV9yZWdfdmFsLAotCQkJCQkgICAgdTMyIHNhbXBsZV9yYXRlKQotewotCXU4IGludF8xX21peDFfaW5wOwotCXUzMiBqOwotCXUxNiBpbnRfbXV4X2NmZzAsIGludF9tdXhfY2ZnMTsKLQl1MTYgaW50X2ZzX3JlZzsKLQl1OCBpbnRfbXV4X2NmZzBfdmFsLCBpbnRfbXV4X2NmZzFfdmFsOwotCXU4IGlucDBfc2VsLCBpbnAxX3NlbCwgaW5wMl9zZWw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eF9jaCAqY2g7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHRhdmlsX2RzZF9jb25maWcgKmRzZF9jb25mID0gdGF2aWwtPmRzZF9jb25maWc7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoLCAmdGF2aWwtPmRhaVtkYWktPmlkXS53Y2Q5eHh4X2NoX2xpc3QsIGxpc3QpIHsKLQkJaW50XzFfbWl4MV9pbnAgPSBJTlRuXzFfSU5QX1NFTF9SWDAgKyBjaC0+cG9ydCAtCi0JCQkJCQlXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSOwotCQlpZiAoKGludF8xX21peDFfaW5wIDwgSU5Ubl8xX0lOUF9TRUxfUlgwKSB8fAotCQkgICAgKGludF8xX21peDFfaW5wID4gSU5Ubl8xX0lOUF9TRUxfUlg3KSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEludmFsaWQgUlgldSBwb3J0LCBEYWkgSUQgaXMgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJKGNoLT5wb3J0IC0gV0NEOTM0WF9SWF9QT1JUX1NUQVJUX05VTUJFUiksCi0JCQkJZGFpLT5pZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWludF9tdXhfY2ZnMCA9IFdDRDkzNFhfQ0RDX1JYX0lOUF9NVVhfUlhfSU5UMF9DRkcwOwotCi0JCS8qCi0JCSAqIExvb3AgdGhyb3VnaCBhbGwgaW50ZXJwb2xhdG9yIE1VWCBpbnB1dHMgYW5kIGZpbmQgb3V0Ci0JCSAqIHRvIHdoaWNoIGludGVycG9sYXRvciBpbnB1dCwgdGhlIHNsaW0gcnggcG9ydAotCQkgKiBpcyBjb25uZWN0ZWQKLQkJICovCi0JCWZvciAoaiA9IDA7IGogPCBXQ0Q5MzRYX05VTV9JTlRFUlBPTEFUT1JTOyBqKyspIHsKLQkJCS8qIEludGVycG9sYXRvcnMgNSBhbmQgNiBhcmUgbm90IGF2aWxpYWJsZSBpbiBUYXZpbCAqLwotCQkJaWYgKGogPT0gSU5URVJQX0xPM19OQSB8fCBqID09IElOVEVSUF9MTzRfTkEpIHsKLQkJCQlpbnRfbXV4X2NmZzAgKz0gMjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWludF9tdXhfY2ZnMSA9IGludF9tdXhfY2ZnMCArIDE7Ci0KLQkJCWludF9tdXhfY2ZnMF92YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIGludF9tdXhfY2ZnMCk7Ci0JCQlpbnRfbXV4X2NmZzFfdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBpbnRfbXV4X2NmZzEpOwotCQkJaW5wMF9zZWwgPSBpbnRfbXV4X2NmZzBfdmFsICYgMHgwRjsKLQkJCWlucDFfc2VsID0gKGludF9tdXhfY2ZnMF92YWwgPj4gNCkgJiAweDBGOwotCQkJaW5wMl9zZWwgPSAoaW50X211eF9jZmcxX3ZhbCA+PiA0KSAmIDB4MEY7Ci0JCQlpZiAoKGlucDBfc2VsID09IGludF8xX21peDFfaW5wKSB8fAotCQkJICAgIChpbnAxX3NlbCA9PSBpbnRfMV9taXgxX2lucCkgfHwKLQkJCSAgICAoaW5wMl9zZWwgPT0gaW50XzFfbWl4MV9pbnApKSB7Ci0JCQkJLyoKLQkJCQkgKiBFYXIgYW5kIHNwZWFrZXIgcHJpbWFyeSBwYXRoIGRvZXMgbm90IHN1cHBvcnQKLQkJCQkgKiBuYXRpdmUgc2FtcGxlIHJhdGVzCi0JCQkJICovCi0JCQkJaWYgKChqID09IElOVEVSUF9FQVIgfHwgaiA9PSBJTlRFUlBfU1BLUjEgfHwKLQkJCQkJaiA9PSBJTlRFUlBfU1BLUjIpICYmCi0JCQkJCShyYXRlX3JlZ192YWwgPiAweDcpKSB7Ci0JCQkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBJbnZhbGlkIHJhdGUgZm9yIEFJRl9QQiBEQUkoJWQpXG4iLAotCQkJCQkgIF9fZnVuY19fLCBkYWktPmlkKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJaW50X2ZzX3JlZyA9IFdDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX0NUTCArCi0JCQkJCQkJCQkyMCAqIGo7Ci0JCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCSIlczogQUlGX1BCIERBSSglZCkgY29ubmVjdGVkIHRvIElOVCV1XzFcbiIsCi0JCQkJICBfX2Z1bmNfXywgZGFpLT5pZCwgaik7Ci0JCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LAotCQkJCQkiJXM6IHNldCBJTlQldV8xIHNhbXBsZSByYXRlIHRvICV1XG4iLAotCQkJCQlfX2Z1bmNfXywgaiwgc2FtcGxlX3JhdGUpOwotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIGludF9mc19yZWcsIDB4MEYsCi0JCQkJCQkgICAgcmF0ZV9yZWdfdmFsKTsKLQkJCX0KLQkJCWludF9tdXhfY2ZnMCArPSAyOwotCQl9Ci0JCWlmIChkc2RfY29uZikKLQkJCXRhdmlsX2RzZF9zZXRfaW50ZXJwX3JhdGUoZHNkX2NvbmYsIGNoLT5wb3J0LAotCQkJCQkJICBzYW1wbGVfcmF0ZSwgcmF0ZV9yZWdfdmFsKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHRhdmlsX3NldF9pbnRlcnBvbGF0b3JfcmF0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQkgICAgICAgdTMyIHNhbXBsZV9yYXRlKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0JaW50IHJhdGVfdmFsID0gMDsKLQlpbnQgaSwgcmV0OwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3JfdmFsX3RibCk7IGkrKykgewotCQlpZiAoc2FtcGxlX3JhdGUgPT0gc3JfdmFsX3RibFtpXS5zYW1wbGVfcmF0ZSkgewotCQkJcmF0ZV92YWwgPSBzcl92YWxfdGJsW2ldLnJhdGVfdmFsOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKChpID09IEFSUkFZX1NJWkUoc3JfdmFsX3RibCkpIHx8IChyYXRlX3ZhbCA8IDApKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZTogJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSB0YXZpbF9zZXRfcHJpbV9pbnRlcnBvbGF0b3JfcmF0ZShkYWksICh1OClyYXRlX3ZhbCwgc2FtcGxlX3JhdGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gdGF2aWxfc2V0X21peF9pbnRlcnBvbGF0b3JfcmF0ZShkYWksICh1OClyYXRlX3ZhbCwgc2FtcGxlX3JhdGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF92aV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoZGFpLT5jb2RlYyk7Ci0KLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogZGFpX25hbWUgPSAlcyBEQUktSUQgJXggcmF0ZSAlZCBudW1fY2ggJWRcbiIsCi0JCSBfX2Z1bmNfXywgZGFpLT5uYW1lLCBkYWktPmlkLCBwYXJhbXNfcmF0ZShwYXJhbXMpLAotCQkgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOwotCi0JdGF2aWwtPmRhaVtkYWktPmlkXS5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQl0YXZpbC0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDMyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGRhaS0+Y29kZWMpOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IGRhaV9uYW1lID0gJXMgREFJLUlEICV4IHJhdGUgJWQgbnVtX2NoICVkXG4iLAotCQkgX19mdW5jX18sIGRhaS0+bmFtZSwgZGFpLT5pZCwgcGFyYW1zX3JhdGUocGFyYW1zKSwKLQkJIHBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsKLQotCXN3aXRjaCAoc3Vic3RyZWFtLT5zdHJlYW0pIHsKLQljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6Ci0JCXJldCA9IHRhdmlsX3NldF9pbnRlcnBvbGF0b3JfcmF0ZShkYWksIHBhcmFtc19yYXRlKHBhcmFtcykpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogY2Fubm90IHNldCBzYW1wbGUgcmF0ZTogJXVcbiIsCi0JCQkJX19mdW5jX18sIHBhcmFtc19yYXRlKHBhcmFtcykpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7Ci0JCWNhc2UgMTY6Ci0JCQl0YXZpbC0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDE2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjQ6Ci0JCQl0YXZpbC0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDI0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMzI6Ci0JCQl0YXZpbC0+ZGFpW2RhaS0+aWRdLmJpdF93aWR0aCA9IDMyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQl0YXZpbC0+ZGFpW2RhaS0+aWRdLnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRToKLQkJaWYgKGRhaS0+aWQgIT0gQUlGNF9NQURfVFgpCi0JCQlyZXQgPSB0YXZpbF9zZXRfZGVjaW1hdG9yX3JhdGUoZGFpLAotCQkJCQkJICAgICAgIHBhcmFtc19yYXRlKHBhcmFtcykpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogY2Fubm90IHNldCBUWCBEZWNpbWF0b3IgcmF0ZTogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKLQkJY2FzZSAxNjoKLQkJCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSAyNDoKLQkJCXRhdmlsLT5kYWlbZGFpLT5pZF0uYml0X3dpZHRoID0gMjQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIGZvcm1hdCAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBwYXJhbXNfd2lkdGgocGFyYW1zKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfTsKLQkJdGF2aWwtPmRhaVtkYWktPmlkXS5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IEludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsIF9fZnVuY19fLAotCQkJc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHRhdmlsX2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSB0YXZpbF9zdGFydHVwLAotCS5zaHV0ZG93biA9IHRhdmlsX3NodXRkb3duLAotCS5od19wYXJhbXMgPSB0YXZpbF9od19wYXJhbXMsCi0JLnByZXBhcmUgPSB0YXZpbF9wcmVwYXJlLAotCS5zZXRfY2hhbm5lbF9tYXAgPSB0YXZpbF9zZXRfY2hhbm5lbF9tYXAsCi0JLmdldF9jaGFubmVsX21hcCA9IHRhdmlsX2dldF9jaGFubmVsX21hcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHRhdmlsX3ZpX2RhaV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IHRhdmlsX3ZpX2h3X3BhcmFtcywKLQkuc2V0X2NoYW5uZWxfbWFwID0gdGF2aWxfc2V0X2NoYW5uZWxfbWFwLAotCS5nZXRfY2hhbm5lbF9tYXAgPSB0YXZpbF9nZXRfY2hhbm5lbF9tYXAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciB0YXZpbF9kYWlbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5pZCA9IEFJRjFfUEIsCi0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIFBsYXliYWNrIiwKLQkJCS5yYXRlcyA9IFdDRDkzNFhfUkFURVNfTUFTSyB8IFdDRDkzNFhfRlJBQ19SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJfSwKLQkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXZpbF90eDEiLAotCQkuaWQgPSBBSUYxX0NBUCwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBDYXB0dXJlIiwKLQkJCS5yYXRlcyA9IFdDRDkzNFhfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfTEUsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJfSwKLQkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXZpbF9yeDIiLAotCQkuaWQgPSBBSUYyX1BCLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGMiBQbGF5YmFjayIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzRYX1JBVEVTX01BU0sgfCBXQ0Q5MzRYX0ZSQUNfUkFURVNfTUFTSywKLQkJCS5mb3JtYXRzID0gV0NEOTM0WF9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCX0sCi0JCS5vcHMgPSAmdGF2aWxfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGF2aWxfdHgyIiwKLQkJLmlkID0gQUlGMl9DQVAsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjIgQ2FwdHVyZSIsCi0JCQkucmF0ZXMgPSBXQ0Q5MzRYX1JBVEVTX01BU0ssCi0JCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X0xFLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCX0sCi0JCS5vcHMgPSAmdGF2aWxfZGFpX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAidGF2aWxfcngzIiwKLQkJLmlkID0gQUlGM19QQiwKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFJRjMgUGxheWJhY2siLAotCQkJLnJhdGVzID0gV0NEOTM0WF9SQVRFU19NQVNLIHwgV0NEOTM0WF9GUkFDX1JBVEVTX01BU0ssCi0JCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQl9LAotCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhdmlsX3R4MyIsCi0JCS5pZCA9IEFJRjNfQ0FQLAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUYzIENhcHR1cmUiLAotCQkJLnJhdGVzID0gV0NEOTM0WF9SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9MRSwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQl9LAotCQkub3BzID0gJnRhdmlsX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhdmlsX3J4NCIsCi0JCS5pZCA9IEFJRjRfUEIsCi0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBSUY0IFBsYXliYWNrIiwKLQkJCS5yYXRlcyA9IFdDRDkzNFhfUkFURVNfTUFTSyB8IFdDRDkzNFhfRlJBQ19SQVRFU19NQVNLLAotCQkJLmZvcm1hdHMgPSBXQ0Q5MzRYX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJfSwKLQkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAotCX0sCi0JewotCQkubmFtZSA9ICJ0YXZpbF92aWZlZWRiYWNrIiwKLQkJLmlkID0gQUlGNF9WSUZFRUQsCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZJZmVlZCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCSB9LAotCQkub3BzID0gJnRhdmlsX3ZpX2RhaV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gInRhdmlsX21hZDEiLAotCQkuaWQgPSBBSUY0X01BRF9UWCwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUlGNCBNQUQgVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFdDRDkzNFhfRk9STUFUU19TMTZfTEUsCi0JCQkucmF0ZV9taW4gPSAxNjAwMCwKLQkJCS5yYXRlX21heCA9IDE2MDAwLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMSwKLQkJfSwKLQkJLm9wcyA9ICZ0YXZpbF9kYWlfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19wb3dlcl9nYXRlX2RpZ2l0YWxfY29yZShzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCi17Ci0JbXV0ZXhfbG9jaygmdGF2aWwtPnBvd2VyX2xvY2spOwotCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBFbnRlcmluZyBwb3dlciBnYXRpbmcgZnVuY3Rpb24sICVkXG4iLAotCQlfX2Z1bmNfXywgdGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYpOwotCi0JaWYgKHRhdmlsLT5wb3dlcl9hY3RpdmVfcmVmID4gMCkKLQkJZ290byBleGl0OwotCi0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGF2aWwtPndjZDl4eHgsCi0JCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX0JFR0lOLAotCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4MDQsIDB4MDQpOwotCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDAxLCAweDAwKTsKLQlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJCSAgIFdDRDkzNFhfQ09ERUNfUlBNX1BXUl9DRENfRElHX0hNX0NUTCwgMHgwMiwgMHgwMCk7Ci0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGF2aWwtPndjZDl4eHgsIFdDRF9SRUdJT05fUE9XRVJfRE9XTiwKLQkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKLWV4aXQ6Ci0JZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IEV4aXRpbmcgcG93ZXIgZ2F0aW5nIGZ1bmN0aW9uLCAlZFxuIiwKLQkJX19mdW5jX18sIHRhdmlsLT5wb3dlcl9hY3RpdmVfcmVmKTsKLQltdXRleF91bmxvY2soJnRhdmlsLT5wb3dlcl9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfcG93ZXJfZ2F0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0KLQlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQl0YXZpbCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRhdmlsX3ByaXYsIHBvd2VyX2dhdGVfd29yayk7Ci0KLQl0YXZpbF9jb2RlY19wb3dlcl9nYXRlX2RpZ2l0YWxfY29yZSh0YXZpbCk7Ci19Ci0KLS8qIGNhbGxlZCB1bmRlciBwb3dlcl9sb2NrIGFjcXVpc2l0aW9uICovCi1zdGF0aWMgaW50IHRhdmlsX2RpZ19jb3JlX3JlbW92ZV9wb3dlcl9jb2xsYXBzZShzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCi17Ci0JcmVnbWFwX3dyaXRlKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCSAgICAgV0NEOTM0WF9DT0RFQ19SUE1fUFdSX0NEQ19ESUdfSE1fQ1RMLCAweDA1KTsKLQlyZWdtYXBfd3JpdGUodGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJICAgICBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4MDcpOwotCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTM0WF9DT0RFQ19SUE1fUlNUX0NUTCwgMHgwMiwgMHgwMCk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgICBXQ0Q5MzRYX0NPREVDX1JQTV9SU1RfQ1RMLCAweDAyLCAweDAyKTsKLQlyZWdtYXBfd3JpdGUodGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJICAgICBXQ0Q5MzRYX0NPREVDX1JQTV9QV1JfQ0RDX0RJR19ITV9DVEwsIDB4MDMpOwotCi0Jd2NkOXh4eF9zZXRfcG93ZXJfc3RhdGUodGF2aWwtPndjZDl4eHgsCi0JCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQkJCVdDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzEpOwotCXJlZ2NhY2hlX21hcmtfZGlydHkodGF2aWwtPndjZDl4eHgtPnJlZ21hcCk7Ci0JcmVnY2FjaGVfc3luY19yZWdpb24odGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJCSAgICAgV0NEOTM0WF9ESUdfQ09SRV9SRUdfTUlOLAotCQkJICAgICBXQ0Q5MzRYX0RJR19DT1JFX1JFR19NQVgpOwotCi0JdGF2aWxfcmVzdG9yZV9paXJfY29lZmYodGF2aWwsIElJUjApOwotCXRhdmlsX3Jlc3RvcmVfaWlyX2NvZWZmKHRhdmlsLCBJSVIxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZShzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwsCi0JCQkJCSBpbnQgcmVxX3N0YXRlKQotewotCWludCBjdXJfc3RhdGU7Ci0KLQkvKiBFeGl0IGlmIGZlYXR1cmUgaXMgZGlzYWJsZWQgKi8KLQlpZiAoIWRpZ19jb3JlX2NvbGxhcHNlX2VuYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQltdXRleF9sb2NrKCZ0YXZpbC0+cG93ZXJfbG9jayk7Ci0JaWYgKHJlcV9zdGF0ZSA9PSBQT1dFUl9DT0xMQVBTRSkKLQkJdGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYtLTsKLQllbHNlIGlmIChyZXFfc3RhdGUgPT0gUE9XRVJfUkVTVU1FKQotCQl0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZisrOwotCWVsc2UKLQkJZ290byB1bmxvY2tfbXV0ZXg7Ci0KLQlpZiAodGF2aWwtPnBvd2VyX2FjdGl2ZV9yZWYgPCAwKSB7Ci0JCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBwb3dlcl9hY3RpdmVfcmVmIGlzIG5lZ2F0aXZlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIHVubG9ja19tdXRleDsKLQl9Ci0KLQlpZiAocmVxX3N0YXRlID09IFBPV0VSX0NPTExBUFNFKSB7Ci0JCWlmICh0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZiA9PSAwKSB7Ci0JCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnRhdmlsLT5wb3dlcl9nYXRlX3dvcmssCi0JCQltc2Vjc190b19qaWZmaWVzKGRpZ19jb3JlX2NvbGxhcHNlX3RpbWVyICogMTAwMCkpOwotCQl9Ci0JfSBlbHNlIGlmIChyZXFfc3RhdGUgPT0gUE9XRVJfUkVTVU1FKSB7Ci0JCWlmICh0YXZpbC0+cG93ZXJfYWN0aXZlX3JlZiA9PSAxKSB7Ci0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCwgdGhlcmUgY2FuIGJlIHR3byBjYXNlczoKLQkJCSAqIDEuIENvcmUgYWxyZWFkeSBpbiBwb3dlciBjb2xsYXBzZSBzdGF0ZQotCQkJICogMi4gVGltZXIga2lja2VkIGluIGFuZCBzdGlsbCBkaWQgbm90IGV4cGlyZSBvcgotCQkJICogd2FpdGluZyBmb3IgdGhlIHBvd2VyX2xvY2sKLQkJCSAqLwotCQkJY3VyX3N0YXRlID0gd2NkOXh4eF9nZXRfY3VycmVudF9wb3dlcl9zdGF0ZSgKLQkJCQkJCXRhdmlsLT53Y2Q5eHh4LAotCQkJCQkJV0NEOVhYWF9ESUdfQ09SRV9SRUdJT05fMSk7Ci0JCQlpZiAoY3VyX3N0YXRlID09IFdDRF9SRUdJT05fUE9XRVJfRE9XTikgewotCQkJCXRhdmlsX2RpZ19jb3JlX3JlbW92ZV9wb3dlcl9jb2xsYXBzZSh0YXZpbCk7Ci0JCQl9IGVsc2UgewotCQkJCW11dGV4X3VubG9jaygmdGF2aWwtPnBvd2VyX2xvY2spOwotCQkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygKLQkJCQkJCSZ0YXZpbC0+cG93ZXJfZ2F0ZV93b3JrKTsKLQkJCQltdXRleF9sb2NrKCZ0YXZpbC0+cG93ZXJfbG9jayk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLXVubG9ja19tdXRleDoKLQltdXRleF91bmxvY2soJnRhdmlsLT5wb3dlcl9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX2NkY19yZXFfbWNsa19lbmFibGUoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAotCQkJCSAgICAgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0YXZpbC0+d2NkX2V4dF9jbGspOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogZXh0IGNsayBlbmFibGUgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQkvKiBnZXQgQkcgKi8KLQkJd2NkX3Jlc21ncl9lbmFibGVfbWFzdGVyX2JpYXModGF2aWwtPnJlc21ncik7Ci0JCS8qIGdldCBNQ0xLICovCi0JCXdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19ibG9jayh0YXZpbC0+cmVzbWdyLCBXQ0RfQ0xLX01DTEspOwotCX0gZWxzZSB7Ci0JCS8qIHB1dCBNQ0xLICovCi0JCXdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwgV0NEX0NMS19NQ0xLKTsKLQkJLyogcHV0IEJHICovCi0JCXdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyh0YXZpbC0+cmVzbWdyKTsKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHRhdmlsLT53Y2RfZXh0X2Nsayk7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9jZGNfbWNsa19lbmFibGVfbG9ja2VkKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCwKLQkJCQkJICBib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghdGF2aWwtPndjZF9leHRfY2xrKSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiB3Y2QgZXh0IGNsb2NrIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IG1jbGtfZW5hYmxlID0gJXVcbiIsIF9fZnVuY19fLCBlbmFibGUpOwotCi0JaWYgKGVuYWJsZSkgewotCQl0YXZpbF9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXZpbCwgUE9XRVJfUkVTVU1FKTsKLQkJdGF2aWxfdm90ZV9zdnModGF2aWwsIHRydWUpOwotCQlyZXQgPSB0YXZpbF9jZGNfcmVxX21jbGtfZW5hYmxlKHRhdmlsLCB0cnVlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZG9uZTsKLQl9IGVsc2UgewotCQl0YXZpbF9jZGNfcmVxX21jbGtfZW5hYmxlKHRhdmlsLCBmYWxzZSk7Ci0JCXRhdmlsX3ZvdGVfc3ZzKHRhdmlsLCBmYWxzZSk7Ci0JCXRhdmlsX2RpZ19jb3JlX3Bvd2VyX2NvbGxhcHNlKHRhdmlsLCBQT1dFUl9DT0xMQVBTRSk7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9jZGNfbWNsa19lbmFibGUoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAotCQkJCSAgIGJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0KLQlXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHRhdmlsLT5yZXNtZ3IpOwotCXJldCA9IF9fdGF2aWxfY2RjX21jbGtfZW5hYmxlX2xvY2tlZCh0YXZpbCwgZW5hYmxlKTsKLQlpZiAoZW5hYmxlKQotCQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyh0YXZpbC0+cmVzbWdyLAotCQkJCQkJICAgICBTSURPX1NPVVJDRV9SQ09fQkcpOwotCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXZpbC0+cmVzbWdyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRhdmlsX2NvZGVjX3ZlcnNpb25fcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAotCQkJCQl2b2lkICpmaWxlX3ByaXZhdGVfZGF0YSwKLQkJCQkJc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJbG9mZl90IHBvcykKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0JY2hhciBidWZmZXJbVEFWSUxfVkVSU0lPTl9FTlRSWV9TSVpFXTsKLQlpbnQgbGVuID0gMDsKLQotCXRhdmlsID0gKHN0cnVjdCB0YXZpbF9wcml2ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7Ci0JaWYgKCF0YXZpbCkgewotCQlwcl9lcnIoIiVzOiB0YXZpbCBwcml2IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OwotCi0Jc3dpdGNoICh3Y2Q5eHh4LT52ZXJzaW9uKSB7Ci0JY2FzZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDBfMV8wOgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTM0MF8xXzBcbiIpOwotCQlicmVhazsKLQljYXNlIFRBVklMX1ZFUlNJT05fV0NEOTM0MV8xXzA6Ci0JCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJXQ0Q5MzQxXzFfMFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMToKLQkJbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIldDRDkzNDBfMV8xXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBUQVZJTF9WRVJTSU9OX1dDRDkzNDFfMV8xOgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiV0NEOTM0MV8xXzFcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiVkVSX1VOREVGSU5FRFxuIik7Ci0JfQotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgdGF2aWxfY29kZWNfaW5mb19vcHMgPSB7Ci0JLnJlYWQgPSB0YXZpbF9jb2RlY192ZXJzaW9uX3JlYWQsCi19OwotCi0vKgotICogdGF2aWxfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIHdjZDkzNHggbW9kdWxlCi0gKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBDcmVhdGVzIHdjZDkzNHggbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgotICogcGFyZW50IGRpcmVjdG9yeS4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludCB0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3QsCi0JCQkJCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnZlcnNpb25fZW50cnk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQ7Ci0KLQlpZiAoIWNvZGVjX3Jvb3QgfHwgIWNvZGVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQl0YXZpbC0+ZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNvZGVjX3Jvb3QtPm1vZHVsZSwKLQkJCQkJICAgICAgInRhdmlsIiwgY29kZWNfcm9vdCk7Ci0JaWYgKCF0YXZpbC0+ZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTM0eCBlbnRyeVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdmVyc2lvbl9lbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQtPnNuZF9jYXJkLAotCQkJCQkJICAgInZlcnNpb24iLAotCQkJCQkJICAgdGF2aWwtPmVudHJ5KTsKLQlpZiAoIXZlcnNpb25fZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd2NkOTM0eCB2ZXJzaW9uIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB0YXZpbDsKLQl2ZXJzaW9uX2VudHJ5LT5zaXplID0gVEFWSUxfVkVSU0lPTl9FTlRSWV9TSVpFOwotCXZlcnNpb25fZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQTsKLQl2ZXJzaW9uX2VudHJ5LT5jLm9wcyA9ICZ0YXZpbF9jb2RlY19pbmZvX29wczsKLQotCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKLQkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXRhdmlsLT52ZXJzaW9uX2VudHJ5ID0gdmVyc2lvbl9lbnRyeTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSk7Ci0KLS8qKgotICogdGF2aWxfY2RjX21jbGtfZW5hYmxlIC0gRW5hYmxlL2Rpc2FibGUgY29kZWMgbWNsawotICoKLSAqIEBjb2RlYzogY29kZWMgaW5zdGFuY2UKLSAqIEBlbmFibGU6IEluZGljYXRlcyBjbGsgZW5hYmxlIG9yIGRpc2FibGUKLSAqCi0gKiBSZXR1cm5zIDAgb24gU3VjY2VzcyBhbmQgZXJyb3Igb24gZmFpbHVyZQotICovCi1pbnQgdGF2aWxfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXR1cm4gX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGVuYWJsZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2NkY19tY2xrX2VuYWJsZSk7Ci0KLXN0YXRpYyBpbnQgX190YXZpbF9jb2RlY19pbnRlcm5hbF9yY29fY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JaWYgKGVuYWJsZSkgewotCQlpZiAod2NkX3Jlc21ncl9nZXRfY2xrX3R5cGUodGF2aWwtPnJlc21ncikgPT0KLQkJICAgIFdDRF9DTEtfUkNPKSB7Ci0JCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwKLQkJCQkJCQkgIFdDRF9DTEtfUkNPKTsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IHRhdmlsX2NkY19yZXFfbWNsa19lbmFibGUodGF2aWwsIHRydWUpOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJIiVzOiBtY2xrX2VuYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyh0YXZpbC0+cmVzbWdyLAotCQkJCQkJCVNJRE9fU09VUkNFX1JDT19CRyk7Ci0JCQlyZXQgPSB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2sodGF2aWwtPnJlc21nciwKLQkJCQkJCQkgICBXQ0RfQ0xLX1JDTyk7Ci0JCQlyZXQgfD0gdGF2aWxfY2RjX3JlcV9tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOwotCQl9Ci0KLQl9IGVsc2UgewotCQlyZXQgPSB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX2Jsb2NrKHRhdmlsLT5yZXNtZ3IsCi0JCQkJCQkgICBXQ0RfQ0xLX1JDTyk7Ci0JfQotCi0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogRXJyb3IgaW4gJXMgUkNPXG4iLAotCQkJX19mdW5jX18sIChlbmFibGUgPyAiZW5hYmxpbmciIDogImRpc2FibGluZyIpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHRhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsOiBFbmFibGUvRGlzYWJsZSBjb2RlYydzIFJDTyBjbG9jawotICogQGNvZGVjOiBIYW5kbGUgdG8gdGhlIGNvZGVjCi0gKiBAZW5hYmxlOiBJbmRpY2F0ZXMgd2hldGhlciBjbG9jayBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAotICovCi1zdGF0aWMgaW50IHRhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCByZXQgPSAwOwotCi0JV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXZpbC0+cmVzbWdyKTsKLQlyZXQgPSBfX3RhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBlbmFibGUpOwotCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyh0YXZpbC0+cmVzbWdyKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogdGF2aWxfY2RjX21jbGtfdHhfZW5hYmxlOiBFbmFibGUvRGlzYWJsZSBjb2RlYydzIGNsb2NrIGZvciBUWCBwYXRoCi0gKiBAY29kZWM6IEhhbmRsZSB0byBjb2RlYwotICogQGVuYWJsZTogSW5kaWNhdGVzIHdoZXRoZXIgY2xvY2sgc2hvdWxkIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKLSAqLwotaW50IHRhdmlsX2NkY19tY2xrX3R4X2VuYWJsZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbF9wOwotCWludCByZXQgPSAwOwotCWJvb2wgY2xrX21vZGU7Ci0JYm9vbCBjbGtfaW50ZXJuYWw7Ci0KLQlpZiAoIWNvZGVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRhdmlsX3AgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljbGtfbW9kZSA9IHRlc3RfYml0KENMS19NT0RFLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOwotCWNsa19pbnRlcm5hbCA9IHRlc3RfYml0KENMS19JTlRFUk5BTCwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbGttb2RlOiAlZCwgZW5hYmxlOiAlZCwgY2xrX2ludGVybmFsOiAlZFxuIiwKLQkJX19mdW5jX18sIGNsa19tb2RlLCBlbmFibGUsIGNsa19pbnRlcm5hbCk7Ci0KLQlpZiAoY2xrX21vZGUgfHwgY2xrX2ludGVybmFsKSB7Ci0JCWlmIChlbmFibGUpIHsKLQkJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHRhdmlsX3AtPnJlc21ncik7Ci0JCQl0YXZpbF9kaWdfY29yZV9wb3dlcl9jb2xsYXBzZSh0YXZpbF9wLCBQT1dFUl9SRVNVTUUpOwotCQkJdGF2aWxfdm90ZV9zdnModGF2aWxfcCwgdHJ1ZSk7Ci0JCQlyZXQgPSB0YXZpbF9jb2RlY19pbnRlcm5hbF9yY29fY3RybChjb2RlYywgZW5hYmxlKTsKLQkJCXNldF9iaXQoQ0xLX0lOVEVSTkFMLCAmdGF2aWxfcC0+c3RhdHVzX21hc2spOwotCQl9IGVsc2UgewotCQkJY2xlYXJfYml0KENMS19JTlRFUk5BTCwgJnRhdmlsX3AtPnN0YXR1c19tYXNrKTsKLQkJCXRhdmlsX2NvZGVjX2ludGVybmFsX3Jjb19jdHJsKGNvZGVjLCBlbmFibGUpOwotCQkJdGF2aWxfdm90ZV9zdnModGF2aWxfcCwgZmFsc2UpOwotCQkJdGF2aWxfZGlnX2NvcmVfcG93ZXJfY29sbGFwc2UodGF2aWxfcCwgUE9XRVJfQ09MTEFQU0UpOwotCQkJd2NkX3Jlc21ncl9kaXNhYmxlX21hc3Rlcl9iaWFzKHRhdmlsX3AtPnJlc21ncik7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSBfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbF9wLCBlbmFibGUpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX2NkY19tY2xrX3R4X2VuYWJsZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX3Jlc21ncl9jYiB0YXZpbF9yZXNtZ3JfY2IgPSB7Ci0JLmNkY19yY29fY3RybCA9IF9fdGF2aWxfY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9jb2RlY19tY2xrMl8xXzFfZGVmYXVsdHNbXSA9IHsKLQl7V0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEsIDB4NjAsIDB4MjB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfY29kZWNfbWNsazJfMV8wX2RlZmF1bHRzW10gPSB7Ci0JLyoKLQkgKiBQTEwgU2V0dGluZ3M6Ci0JICogQ2xvY2sgUm9vdDogTUNMSzIsCi0JICogQ2xvY2sgU291cmNlOiBFWFRfQ0xLLAotCSAqIENsb2NrIERlc3RpbmF0aW9uOiBNQ0xLMgotCSAqIENsb2NrIEZyZXEgSW46IDE5LjJNSHosCi0JICogQ2xvY2sgRnJlcSBPdXQ6IDExLjI4OTZNSHoKLQkgKi8KLQl7V0NEOTM0WF9DTEtfU1lTX01DTEsyX1BSRzEsIDB4NjAsIDB4MjB9LAotCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzAsIDB4RkYsIDB4NUV9LAotCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1BPU1RfRElWX1JFRzEsIDB4MUYsIDB4MUZ9LAotCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1JFRl9ESVZfUkVHMCwgMHhGRiwgMHg1NH0sCi0Je1dDRDkzNFhfQ0xLX1NZU19JTlRfUkVGX0RJVl9SRUcxLCAweEZGLCAweDAxfSwKLQl7V0NEOTM0WF9DTEtfU1lTX0lOVF9GSUxURVJfUkVHMSwgMHgwNywgMHgwNH0sCi0Je1dDRDkzNFhfQ0xLX1NZU19JTlRfUExMX0xfVkFMLCAweEZGLCAweDkzfSwKLQl7V0NEOTM0WF9DTEtfU1lTX0lOVF9QTExfTl9WQUwsIDB4RkYsIDB4RkF9LAotCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX1RFU1RfUkVHMCwgMHhGRiwgMHg5MH0sCi0Je1dDRDkzNFhfQ0xLX1NZU19JTlRfUEZEX0NQX0RTTV9QUk9HLCAweEZGLCAweDdFfSwKLQl7V0NEOTM0WF9DTEtfU1lTX0lOVF9WQ09fUFJPRywgMHhGRiwgMHhGOH0sCi0Je1dDRDkzNFhfQ0xLX1NZU19JTlRfVEVTVF9SRUcxLCAweEZGLCAweDY4fSwKLQl7V0NEOTM0WF9DTEtfU1lTX0lOVF9MRE9fTE9DS19DRkcsIDB4RkYsIDB4NDB9LAotCXtXQ0Q5MzRYX0NMS19TWVNfSU5UX0RJR19MT0NLX0RFVF9DRkcsIDB4RkYsIDB4MzJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfY29kZWNfcmVnX2RlZmF1bHRzW10gPSB7Ci0Je1dDRDkzNFhfQklBU19WQkdfRklORV9BREosIDB4RkYsIDB4NzV9LAotCXtXQ0Q5MzRYX0NPREVDX0NQUl9TVlNfQ1hfVkRELCAweEZGLCAweDdDfSwgLyogdmFsdWUgaW4gc3ZzIG1vZGUgKi8KLQl7V0NEOTM0WF9DT0RFQ19DUFJfU1ZTMl9DWF9WREQsIDB4RkYsIDB4NTh9LCAvKiB2YWx1ZSBpbiBzdnMyIG1vZGUgKi8KLQl7V0NEOTM0WF9DRENfUlgwX1JYX1BBVEhfRFNNREVNX0NUTCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX1JYMV9SWF9QQVRIX0RTTURFTV9DVEwsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19SWDJfUlhfUEFUSF9EU01ERU1fQ1RMLCAweDAxLCAweDAxfSwKLQl7V0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfRFNNREVNX0NUTCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX0RTTURFTV9DVEwsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19SWDdfUlhfUEFUSF9EU01ERU1fQ1RMLCAweDAxLCAweDAxfSwKLQl7V0NEOTM0WF9DRENfUlg4X1JYX1BBVEhfRFNNREVNX0NUTCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgMHgxRSwgMHgxOH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgMHgxRSwgMHgxOH0sCi0Je1dDRDkzNFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsIDB4MDgsIDB4MH0sCi0Je1dDRDkzNFhfQ0RDX0NMU0hfREVDQVlfQ1RSTCwgMHgwMywgMHgwfSwKLQl7V0NEOTM0WF9NSUNCMV9URVNUX0NUTF8yLCAweDA3LCAweDAxfSwKLQl7V0NEOTM0WF9DRENfQk9PU1QwX0JPT1NUX0NGRzEsIDB4M0YsIDB4MTJ9LAotCXtXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ0ZHMiwgMHgxQywgMHgwOH0sCi0Je1dDRDkzNFhfQ0RDX0JPT1NUMV9CT09TVF9DRkcxLCAweDNGLCAweDEyfSwKLQl7V0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NGRzIsIDB4MUMsIDB4MDh9LAotCXtXQ0Q5MzRYX0NQRV9TU19DUEFSTUFEX0JVRlJEWV9JTlRfUEVSSU9ELCAweDFGLCAweDA5fSwKLQl7V0NEOTM0WF9DRENfVFgwX1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX1RYMV9UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAotCXtXQ0Q5MzRYX0NEQ19UWDJfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKLQl7V0NEOTM0WF9DRENfVFgzX1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX1RYNF9UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAotCXtXQ0Q5MzRYX0NEQ19UWDVfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKLQl7V0NEOTM0WF9DRENfVFg2X1RYX1BBVEhfQ0ZHMSwgMHgwMSwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX1RYN19UWF9QQVRIX0NGRzEsIDB4MDEsIDB4MDB9LAotCXtXQ0Q5MzRYX0NEQ19UWDhfVFhfUEFUSF9DRkcxLCAweDAxLCAweDAwfSwKLQl7V0NEOTM0WF9SWF9PQ1BfQ1RMLCAweDBGLCAweDAyfSwgLyogT0NQIG51bWJlciBvZiBhdHRlbXB0cyBpcyAyICovCi0Je1dDRDkzNFhfSFBIX09DUF9DVEwsIDB4RkYsIDB4M0F9LCAvKiBPQ1AgY3VycmVudCBsaW1pdCAqLwotCXtXQ0Q5MzRYX0hQSF9MX1RFU1QsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0hQSF9SX1RFU1QsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NQRV9GTExfQ09ORklHX0NUTF8yLCAweEZGLCAweDIwfSwKLQl7V0NEOTM0WF9NQkhDX05FV19DVExfMiwgMHgwQywgMHgwMH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhdmlsX3JlZ19tYXNrX3ZhbCB0YXZpbF9jb2RlY19yZWdfaW5pdF8xXzFfdmFsW10gPSB7Ci0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjFfQ1RMNywgMHgxRSwgMHgwNn0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjJfQ1RMNywgMHgxRSwgMHgwNn0sCi0Je1dDRDkzNFhfSFBIX05FV19JTlRfUkRBQ19IRDJfQ1RMX0wsIDB4RkYsIDB4ODR9LAotCXtXQ0Q5MzRYX0hQSF9ORVdfSU5UX1JEQUNfSEQyX0NUTF9SLCAweEZGLCAweDg0fSwKLQl7V0NEOTM0WF9DRENfUlgzX1JYX1BBVEhfU0VDMCwgMHhGQywgMHhGNH0sCi0Je1dDRDkzNFhfQ0RDX1JYNF9SWF9QQVRIX1NFQzAsIDB4RkMsIDB4RjR9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9jcHJfcmVnX2RlZmF1bHRzIGNwcl9kZWZhdWx0c1tdID0gewotCXsgMHgwMDAwMDgyMCwgMHgwMDAwMDA5NCB9LAotCXsgMHgwMDAwMGZDMCwgMHgwMDAwMDA0OCB9LAotCXsgMHgwMDAwZjAwMCwgMHgwMDAwMDA0NCB9LAotCXsgMHgwMDAwYmI4MCwgMHhDMDAwMDE3OCB9LAotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDE2MCB9LAotCXsgMHgxMDg1NDUyMiwgMHgwMDAwMDA2MCB9LAotCXsgMHgxMDg1NDUwOSwgMHgwMDAwMDA2NCB9LAotCXsgMHgxMDg1NDRkZCwgMHgwMDAwMDA2OCB9LAotCXsgMHgxMDg1NDRhZCwgMHgwMDAwMDA2QyB9LAotCXsgMHgwMDAwMDc3RSwgMHgwMDAwMDA3MCB9LAotCXsgMHgwMDAwMDdkYSwgMHgwMDAwMDA3NCB9LAotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3OCB9LAotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDA3QyB9LAotCXsgMHgwMDA0MjAyOSwgMHgwMDAwMDA4MCB9LAotCXsgMHg0MDAyMDAyQSwgMHgwMDAwMDA5MCB9LAotCXsgMHg0MDAyMDAyQiwgMHgwMDAwMDA5MCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0YXZpbF9yZWdfbWFza192YWwgdGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtdID0gewotCXtXQ0Q5MzRYX0NEQ19DTFNIX0syX01TQiwgMHgwRiwgMHgwMH0sCi0Je1dDRDkzNFhfQ0RDX0NMU0hfSzJfTFNCLCAweEZGLCAweDYwfSwKLQl7V0NEOTM0WF9DUEVfU1NfRE1JQ19DRkcsIDB4ODAsIDB4MDB9LAotCXtXQ0Q5MzRYX0NEQ19CT09TVDBfQk9PU1RfQ1RMLCAweDcwLCAweDUwfSwKLQl7V0NEOTM0WF9DRENfQk9PU1QxX0JPT1NUX0NUTCwgMHg3MCwgMHg1MH0sCi0Je1dDRDkzNFhfQ0RDX1JYN19SWF9QQVRIX0NGRzEsIDB4MDgsIDB4MDh9LAotCXtXQ0Q5MzRYX0NEQ19SWDhfUlhfUEFUSF9DRkcxLCAweDA4LCAweDA4fSwKLQl7V0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxLCAweDAyLCAweDAyfSwKLQl7V0NEOTM0WF9DRENfVE9QX1RPUF9DRkcxLCAweDAxLCAweDAxfSwKLQl7V0NEOTM0WF9DRENfVFg5X1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19UWDEwX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19UWDExX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0NEQ19UWDEyX1NQS1JfUFJPVF9QQVRIX0NGRzAsIDB4MDEsIDB4MDF9LAotCXtXQ0Q5MzRYX0RBVEFfSFVCX1NCX1RYMTFfSU5QX0NGRywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9GU19DTlRfQ09OVFJPTCwgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMMywgMHg4MCwgMHg4MH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMMywgMHg4MCwgMHg4MH0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjdfQ1RMNywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ0RDX0NPTVBBTkRFUjhfQ1RMNywgMHgwMSwgMHgwMX0sCi0Je1dDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAweDA4LCAweDAwfSwKLQl7V0NEOTM0WF9UTE1NX0RNSUMzX0NMS19QSU5DRkcsIDB4RkYsIDB4MGF9LAotCXtXQ0Q5MzRYX1RMTU1fRE1JQzNfREFUQV9QSU5DRkcsIDB4RkYsIDB4MGF9LAotCXtXQ0Q5MzRYX0NQRV9TU19TVkFfQ0ZHLCAweDYwLCAweDAwfSwKLQl7V0NEOTM0WF9DUEVfU1NfQ1BBUl9DRkcsIDB4MTAsIDB4MTB9LAotfTsKLQotc3RhdGljIHZvaWQgdGF2aWxfY29kZWNfaW5pdF9yZWcoc3RydWN0IHRhdmlsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcHJpdi0+Y29kZWM7Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9jb2RlY19yZWdfaW5pdF9jb21tb25fdmFsKTsgaSsrKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCSAgICB0YXZpbF9jb2RlY19yZWdfaW5pdF9jb21tb25fdmFsW2ldLnJlZywKLQkJCQkgICAgdGF2aWxfY29kZWNfcmVnX2luaXRfY29tbW9uX3ZhbFtpXS5tYXNrLAotCQkJCSAgICB0YXZpbF9jb2RlY19yZWdfaW5pdF9jb21tb25fdmFsW2ldLnZhbCk7Ci0KLQlpZiAoVEFWSUxfSVNfMV8xKHByaXYtPndjZDl4eHgpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhdmlsX2NvZGVjX3JlZ19pbml0XzFfMV92YWwpOyBpKyspCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQl0YXZpbF9jb2RlY19yZWdfaW5pdF8xXzFfdmFsW2ldLnJlZywKLQkJCQkJdGF2aWxfY29kZWNfcmVnX2luaXRfMV8xX3ZhbFtpXS5tYXNrLAotCQkJCQl0YXZpbF9jb2RlY19yZWdfaW5pdF8xXzFfdmFsW2ldLnZhbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF91cGRhdGVfcmVnX2RlZmF1bHRzKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKLXsKLQl1MzIgaTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQotCXdjZDl4eHggPSB0YXZpbC0+d2NkOXh4eDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9jb2RlY19yZWdfZGVmYXVsdHMpOyBpKyspCi0JCXJlZ21hcF91cGRhdGVfYml0cyh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJICAgdGF2aWxfY29kZWNfcmVnX2RlZmF1bHRzW2ldLnJlZywKLQkJCQkgICB0YXZpbF9jb2RlY19yZWdfZGVmYXVsdHNbaV0ubWFzaywKLQkJCQkgICB0YXZpbF9jb2RlY19yZWdfZGVmYXVsdHNbaV0udmFsKTsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfdXBkYXRlX2Nwcl9kZWZhdWx0cyhzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0KLQl3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7Ci0JaWYgKCFUQVZJTF9JU18xXzEod2NkOXh4eCkpCi0JCXJldHVybjsKLQotCV9fdGF2aWxfY2RjX21jbGtfZW5hYmxlKHRhdmlsLCB0cnVlKTsKLQotCXJlZ21hcF93cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfQ09ERUNfQ1BSX1NWUzJfTUlOX0NYX1ZERCwgMHgyQyk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHdjZDl4eHgtPnJlZ21hcCwgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX0dBVEUsCi0JCQkgICAweDEwLCAweDAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwcl9kZWZhdWx0cyk7IGkrKykgewotCQlyZWdtYXBfYnVsa193cml0ZSh3Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJV0NEOTM0WF9DT0RFQ19DUFJfV1JfREFUQV8wLAotCQkJCSh1OCAqKSZjcHJfZGVmYXVsdHNbaV0ud3JfZGF0YSwgNCk7Ci0JCXJlZ21hcF9idWxrX3dyaXRlKHdjZDl4eHgtPnJlZ21hcCwKLQkJCQlXQ0Q5MzRYX0NPREVDX0NQUl9XUl9BRERSXzAsCi0JCQkJKHU4ICopJmNwcl9kZWZhdWx0c1tpXS53cl9hZGRyLCA0KTsKLQl9Ci0KLQlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9zbGltX2ludGVyZmFjZV9pbml0X3JlZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWZvciAoaSA9IDA7IGkgPCBXQ0Q5WFhYX1NMSU1fTlVNX1BPUlRfUkVHOyBpKyspCi0JCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZShwcml2LT53Y2Q5eHh4LAotCQkJCSAgICBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1JYX0VOMCArIGksCi0JCQkJICAgIDB4RkYpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdGF2aWxfbWlzY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBkYXRhOwotCWludCBtaXNjX3ZhbDsKLQotCS8qIEZpbmQgc291cmNlIG9mIGludGVycnVwdCAqLwotCXJlZ21hcF9yZWFkKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsIFdDRDkzNFhfSU5UUl9DT0RFQ19NSVNDX1NUQVRVUywKLQkJICAgICZtaXNjX3ZhbCk7Ci0KLQlpZiAobWlzY192YWwgJiAweDA4KSB7Ci0JCWRldl9pbmZvKHRhdmlsLT5kZXYsICIlczogaXJxOiAlZCwgRFNEIERDIGRldGVjdGVkIVxuIiwKLQkJCSBfX2Z1bmNfXywgaXJxKTsKLQkJLyogRFNEIERDIGludGVycnVwdCwgcmVzZXQgRFNEIHBhdGggKi8KLQkJdGF2aWxfZHNkX3Jlc2V0KHRhdmlsLT5kc2RfY29uZmlnKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogQ29kZWMgbWlzYyBpcnE6ICVkLCB2YWw6IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgaXJxLCBtaXNjX3ZhbCk7Ci0JfQotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAotCQkJICAgV0NEOTM0WF9JTlRSX0NPREVDX01JU0NfQ0xFQVIsIG1pc2NfdmFsLCAweDAwKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHRhdmlsX3NsaW1idXNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gZGF0YTsKLQl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IDA7Ci0JaW50IGksIGosIHBvcnRfaWQsIGs7Ci0JdTMyIGJpdDsKLQl1OCB2YWwsIGludF92YWwgPSAwOwotCWJvb2wgdHgsIGNsZWFyZWQ7Ci0JdW5zaWduZWQgc2hvcnQgcmVnID0gMDsKLQotCWZvciAoaSA9IFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfU1RBVFVTX1JYXzAsIGogPSAwOwotCSAgICAgaSA8PSBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1NUQVRVU19UWF8xOyBpKyssIGorKykgewotCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXZpbC0+d2NkOXh4eCwgaSk7Ci0JCXN0YXR1cyB8PSAoKHUzMil2YWwgPDwgKDggKiBqKSk7Ci0JfQotCi0JZm9yX2VhY2hfc2V0X2JpdChqLCAmc3RhdHVzLCAzMikgewotCQl0eCA9IChqID49IDE2ID8gdHJ1ZSA6IGZhbHNlKTsKLQkJcG9ydF9pZCA9ICh0eCA/IGogLSAxNiA6IGopOwotCQl2YWwgPSB3Y2Q5eHh4X2ludGVyZmFjZV9yZWdfcmVhZCh0YXZpbC0+d2NkOXh4eCwKLQkJCQlXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1JYX1NPVVJDRTAgKyBqKTsKLQkJaWYgKHZhbCkgewotCQkJaWYgKCF0eCkKLQkJCQlyZWcgPSBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1JYX0VOMCArCi0JCQkJCShwb3J0X2lkIC8gOCk7Ci0JCQllbHNlCi0JCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKwotCQkJCQkocG9ydF9pZCAvIDgpOwotCQkJaW50X3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAotCQkJCXRhdmlsLT53Y2Q5eHh4LCByZWcpOwotCQkJLyoKLQkJCSAqIElnbm9yZSBpbnRlcnJ1cHRzIGZvciBwb3J0cyBmb3Igd2hpY2ggdGhlCi0JCQkgKiBpbnRlcnJ1cHRzIGFyZSBub3Qgc3BlY2lmaWNhbGx5IGVuYWJsZWQuCi0JCQkgKi8KLQkJCWlmICghKGludF92YWwgJiAoMSA8PCAocG9ydF9pZCAlIDgpKSkpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHZhbCAmIFdDRDkzNFhfU0xJTV9JUlFfT1ZFUkZMT1cpCi0JCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHRhdmlsLT5kZXYsICIlczogb3ZlcmZsb3cgZXJyb3Igb24gJXMgcG9ydCAlZCwgdmFsdWUgJXhcbiIsCi0JCQkgICBfX2Z1bmNfXywgKHR4ID8gIlRYIiA6ICJSWCIpLCBwb3J0X2lkLCB2YWwpOwotCQlpZiAodmFsICYgV0NEOTM0WF9TTElNX0lSUV9VTkRFUkZMT1cpCi0JCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHRhdmlsLT5kZXYsICIlczogdW5kZXJmbG93IGVycm9yIG9uICVzIHBvcnQgJWQsIHZhbHVlICV4XG4iLAotCQkJICAgX19mdW5jX18sICh0eCA/ICJUWCIgOiAiUlgiKSwgcG9ydF9pZCwgdmFsKTsKLQkJaWYgKCh2YWwgJiBXQ0Q5MzRYX1NMSU1fSVJRX09WRVJGTE9XKSB8fAotCQkJKHZhbCAmIFdDRDkzNFhfU0xJTV9JUlFfVU5ERVJGTE9XKSkgewotCQkJaWYgKCF0eCkKLQkJCQlyZWcgPSBXQ0Q5MzRYX1NMSU1fUEdEX1BPUlRfSU5UX1JYX0VOMCArCi0JCQkJCShwb3J0X2lkIC8gOCk7Ci0JCQllbHNlCi0JCQkJcmVnID0gV0NEOTM0WF9TTElNX1BHRF9QT1JUX0lOVF9UWF9FTjAgKwotCQkJCQkocG9ydF9pZCAvIDgpOwotCQkJaW50X3ZhbCA9IHdjZDl4eHhfaW50ZXJmYWNlX3JlZ19yZWFkKAotCQkJCXRhdmlsLT53Y2Q5eHh4LCByZWcpOwotCQkJaWYgKGludF92YWwgJiAoMSA8PCAocG9ydF9pZCAlIDgpKSkgewotCQkJCWludF92YWwgPSBpbnRfdmFsIF4gKDEgPDwgKHBvcnRfaWQgJSA4KSk7Ci0JCQkJd2NkOXh4eF9pbnRlcmZhY2VfcmVnX3dyaXRlKHRhdmlsLT53Y2Q5eHh4LAotCQkJCQlyZWcsIGludF92YWwpOwotCQkJfQotCQl9Ci0JCWlmICh2YWwgJiBXQ0Q5MzRYX1NMSU1fSVJRX1BPUlRfQ0xPU0VEKSB7Ci0JCQkvKgotCQkJICogSU5UIFNPVVJDRSByZWdpc3RlciBzdGFydHMgZnJvbSBSWCB0byBUWAotCQkJICogYnV0IHBvcnQgbnVtYmVyIGluIHRoZSBjaF9tYXNrIGlzIGluIG9wcG9zaXRlIHdheQotCQkJICovCi0JCQliaXQgPSAodHggPyBqIC0gMTYgOiBqICsgMTYpOwotCQkJZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6ICVzIHBvcnQgJWQgY2xvc2VkIHZhbHVlICV4LCBiaXQgJXVcbiIsCi0JCQkJIF9fZnVuY19fLCAodHggPyAiVFgiIDogIlJYIiksIHBvcnRfaWQsIHZhbCwKLQkJCQkgYml0KTsKLQkJCWZvciAoayA9IDAsIGNsZWFyZWQgPSBmYWxzZTsgayA8IE5VTV9DT0RFQ19EQUlTOyBrKyspIHsKLQkJCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogdGF2aWwtPmRhaVslZF0uY2hfbWFzayA9IDB4JWx4XG4iLAotCQkJCQkgX19mdW5jX18sIGssIHRhdmlsLT5kYWlba10uY2hfbWFzayk7Ci0JCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChiaXQsCi0JCQkJCQkmdGF2aWwtPmRhaVtrXS5jaF9tYXNrKSkgewotCQkJCQljbGVhcmVkID0gdHJ1ZTsKLQkJCQkJaWYgKCF0YXZpbC0+ZGFpW2tdLmNoX21hc2spCi0JCQkJCQl3YWtlX3VwKAotCQkJCQkJICAgICAgJnRhdmlsLT5kYWlba10uZGFpX3dhaXQpOwotCQkJCQkvKgotCQkJCQkgKiBUaGVyZSBhcmUgY2FzZXMgd2hlbiBtdWx0aXBsZSBEQUlzCi0JCQkJCSAqIG1pZ2h0IGJlIHVzaW5nIHRoZSBzYW1lIHNsaW1idXMKLQkJCQkJICogY2hhbm5lbC4gSGVuY2UgZG9uJ3QgYnJlYWsgaGVyZS4KLQkJCQkJICovCi0JCQkJfQotCQkJfQotCQkJV0FSTighY2xlYXJlZCwKLQkJCSAgICAgIkNvdWxkbid0IGZpbmQgc2xpbWJ1cyAlcyBwb3J0ICVkIGZvciBjbG9zaW5nXG4iLAotCQkJICAgICAodHggPyAiVFgiIDogIlJYIiksIHBvcnRfaWQpOwotCQl9Ci0JCXdjZDl4eHhfaW50ZXJmYWNlX3JlZ193cml0ZSh0YXZpbC0+d2NkOXh4eCwKLQkJCQkJICAgIFdDRDkzNFhfU0xJTV9QR0RfUE9SVF9JTlRfQ0xSX1JYXzAgKwotCQkJCQkgICAgKGogLyA4KSwKLQkJCQkJICAgIDEgPDwgKGogJSA4KSk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3NldHVwX2lycXMoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhdmlsLT5jb2RlYzsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OwotCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzID0KLQkJCQkmd2NkOXh4eC0+Y29yZV9yZXM7Ci0KLQlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBXQ0Q5WFhYX0lSUV9TTElNQlVTLAotCQkJCSAgdGF2aWxfc2xpbWJ1c19pcnEsICJTTElNQlVTIFNsYXZlIiwgdGF2aWwpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgV0NEOVhYWF9JUlFfU0xJTUJVUyk7Ci0JZWxzZQotCQl0YXZpbF9zbGltX2ludGVyZmFjZV9pbml0X3JlZyhjb2RlYyk7Ci0KLQkvKiBSZWdpc3RlciBmb3IgbWlzYyBpbnRlcnJ1cHRzIGFzIHdlbGwgKi8KLQlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLCBXQ0Q5MzRYX0lSUV9NSVNDLAotCQkJCSAgdGF2aWxfbWlzY19pcnEsICJDREMgTUlTQyBJcnEiLCB0YXZpbCk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNkYyBtaXNjIGlycVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX2luaXRfc2xpbV9zbGF2ZV9jZmcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcgKmNmZzsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IHByaXYtPndjZDl4eHg7Ci0JdWludDY0X3QgZWFkZHIgPSAwOwotCi0JY2ZnID0gJnByaXYtPnNsaW1idXNfc2xhdmVfY2ZnOwotCWNmZy0+bWlub3JfdmVyc2lvbiA9IDE7Ci0JY2ZnLT50eF9zbGF2ZV9wb3J0X29mZnNldCA9IDA7Ci0JY2ZnLT5yeF9zbGF2ZV9wb3J0X29mZnNldCA9IDE2OwotCi0JbWVtY3B5KCZlYWRkciwgJndjZDl4eHgtPnNsaW0tPmVfYWRkciwgc2l6ZW9mKHdjZDl4eHgtPnNsaW0tPmVfYWRkcikpOwotCVdBUk5fT04oc2l6ZW9mKHdjZDl4eHgtPnNsaW0tPmVfYWRkcikgIT0gNik7Ci0JY2ZnLT5kZXZpY2VfZW51bV9hZGRyX2xzdyA9IGVhZGRyICYgMHhGRkZGRkZGRjsKLQljZmctPmRldmljZV9lbnVtX2FkZHJfbXN3ID0gZWFkZHIgPj4gMzI7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2xpbWJ1cyBsb2dpY2FsIGFkZHJlc3MgMHglbGx4XG4iLAotCQlfX2Z1bmNfXywgZWFkZHIpOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9jbGVhbnVwX2lycXMoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gdGF2aWwtPndjZDl4eHg7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXMgPQotCQkJCSZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQotCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsIFdDRDlYWFhfSVJRX1NMSU1CVVMsIHRhdmlsKTsKLQl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLCBXQ0Q5MzRYX0lSUV9NSVNDLCB0YXZpbCk7Ci19Ci0KLS8qCi0gKiB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbDogY29udmVydHMgbWljYmlhcyBmcm9tIHZvbHRzIHRvIHJlZ2lzdGVyIHZhbHVlCi0gKiBAbWljYl9tdjogbWljYmlhcyBpbiBtdgotICoKLSAqIHJldHVybiByZWdpc3RlciB2YWx1ZSBjb252ZXJ0ZWQKLSAqLwotaW50IHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHUzMiBtaWNiX212KQotewotCS8qIG1pbiBtaWNiaWFzIHZvbHRhZ2UgaXMgMVYgYW5kIG1heGltdW0gaXMgMi44NVYgKi8KLQlpZiAobWljYl9tdiA8IDEwMDAgfHwgbWljYl9tdiA+IDI4NTApIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgbWljYmlhcyB2b2x0YWdlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAobWljYl9tdiAtIDEwMDApIC8gNTA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKTsKLQotc3RhdGljIGludCB0YXZpbF9oYW5kbGVfcGRhdGEoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsLAotCQkJICAgICAgc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHRhdmlsLT5jb2RlYzsKLQl1OCBtYWRfZG1pY19jdGxfdmFsOwotCXU4IGFuY19jdGxfdmFsdWU7Ci0JdTMyIGRlZl9kbWljX3JhdGUsIGRtaWNfY2xrX2RydjsKLQlpbnQgdm91dF9jdGxfMSwgdm91dF9jdGxfMiwgdm91dF9jdGxfMywgdm91dF9jdGxfNDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTlVMTCBwZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBzZXQgbWljYmlhcyB2b2x0YWdlICovCi0Jdm91dF9jdGxfMSA9IHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHBkYXRhLT5taWNiaWFzLm1pY2IxX212KTsKLQl2b3V0X2N0bF8yID0gd2NkOTM0eF9nZXRfbWljYl92b3V0X2N0bF92YWwocGRhdGEtPm1pY2JpYXMubWljYjJfbXYpOwotCXZvdXRfY3RsXzMgPSB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbChwZGF0YS0+bWljYmlhcy5taWNiM19tdik7Ci0Jdm91dF9jdGxfNCA9IHdjZDkzNHhfZ2V0X21pY2Jfdm91dF9jdGxfdmFsKHBkYXRhLT5taWNiaWFzLm1pY2I0X212KTsKLQlpZiAodm91dF9jdGxfMSA8IDAgfHwgdm91dF9jdGxfMiA8IDAgfHwKLQkgICAgdm91dF9jdGxfMyA8IDAgfHwgdm91dF9jdGxfNCA8IDApIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0IxLCAweDNGLCB2b3V0X2N0bF8xKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0FOQV9NSUNCMiwgMHgzRiwgdm91dF9jdGxfMik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9BTkFfTUlDQjMsIDB4M0YsIHZvdXRfY3RsXzMpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQU5BX01JQ0I0LCAweDNGLCB2b3V0X2N0bF80KTsKLQotCS8qIFNldCB0aGUgRE1JQyBzYW1wbGUgcmF0ZSAqLwotCXN3aXRjaCAocGRhdGEtPm1jbGtfcmF0ZSkgewotCWNhc2UgV0NEOTM0WF9NQ0xLX0NMS185UDZNSFo6Ci0JCWRlZl9kbWljX3JhdGUgPSBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfNFA4TUhaOwotCQlicmVhazsKLQljYXNlIFdDRDkzNFhfTUNMS19DTEtfMTJQMjg4TUhaOgotCQlkZWZfZG1pY19yYXRlID0gV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFXzRQMDk2TUhaOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBJbnZhbGlkIG1jbGtfcmF0ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwZGF0YS0+bWNsa19yYXRlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfTsKLQotCWlmIChwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9PQotCSAgICBXQ0Q5WFhYX0RNSUNfU0FNUExFX1JBVEVfVU5ERUZJTkVEKSB7Ci0JCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlczogZG1pY19yYXRlIGludmFsaWQgZGVmYXVsdCA9ICVkXG4iLAotCQkJX19mdW5jX18sIGRlZl9kbWljX3JhdGUpOwotCQlwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZSA9IGRlZl9kbWljX3JhdGU7Ci0JfQotCWlmIChwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPT0KLQkgICAgV0NEOVhYWF9ETUlDX1NBTVBMRV9SQVRFX1VOREVGSU5FRCkgewotCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiJXM6IG1hZF9kbWljX3JhdGUgaW52YWxpZCBkZWZhdWx0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGVmX2RtaWNfcmF0ZSk7Ci0JCS8qCi0JCSAqIHVzZSBkbWljX3NhbXBsZV9yYXRlIGFzIHRoZSBkZWZhdWx0IGZvciBNQUQKLQkJICogaWYgbWFkIGRtaWMgc2FtcGxlIHJhdGUgaXMgdW5kZWZpbmVkCi0JCSAqLwotCQlwZGF0YS0+bWFkX2RtaWNfc2FtcGxlX3JhdGUgPSBwZGF0YS0+ZG1pY19zYW1wbGVfcmF0ZTsKLQl9Ci0KLQlpZiAocGRhdGEtPmRtaWNfY2xrX2RydiA9PQotCSAgICBXQ0Q5WFhYX0RNSUNfQ0xLX0RSSVZFX1VOREVGSU5FRCkgewotCQlwZGF0YS0+ZG1pY19jbGtfZHJ2ID0gV0NEOTM0WF9ETUlDX0NMS19EUklWRV9ERUZBVUxUOwotCQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCQkgIiVzOiBkbWljX2Nsa19zdHJlbmd0aCBpbnZhbGlkLCBkZWZhdWx0ID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIHBkYXRhLT5kbWljX2Nsa19kcnYpOwotCX0KLQotCXN3aXRjaCAocGRhdGEtPmRtaWNfY2xrX2RydikgewotCWNhc2UgMjoKLQkJZG1pY19jbGtfZHJ2ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlkbWljX2Nsa19kcnYgPSAxOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCWRtaWNfY2xrX2RydiA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgMTY6Ci0JCWRtaWNfY2xrX2RydiA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogaW52YWxpZCBkbWljX2Nsa19kcnYgJWQsIHVzaW5nIGRlZmF1bHRcbiIsCi0JCQlfX2Z1bmNfXywgcGRhdGEtPmRtaWNfY2xrX2Rydik7Ci0JCWRtaWNfY2xrX2RydiA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfVEVTVF9ERUJVR19QQURfRFJWQ1RMXzAsCi0JCQkgICAgMHgwQywgZG1pY19jbGtfZHJ2IDw8IDIpOwotCi0JLyoKLQkgKiBEZWZhdWx0IHRoZSBETUlDIGNsayByYXRlcyB0byBtYWRfZG1pY19zYW1wbGVfcmF0ZSwKLQkgKiB3aGVyZWFzLCB0aGUgYW5jL3R4ZmUgZG1pYyByYXRlcyB0byBkbWljX3NhbXBsZV9yYXRlCi0JICogc2luY2UgdGhlIGFuYy90eGZlIGFyZSBpbmRlcGVuZGVudCBvZiBtYWQgYmxvY2suCi0JICovCi0JbWFkX2RtaWNfY3RsX3ZhbCA9IHRhdmlsX2dldF9kbWljX2Nsa192YWwodGF2aWwtPmNvZGVjLAotCQkJCXBkYXRhLT5tY2xrX3JhdGUsCi0JCQkJcGRhdGEtPm1hZF9kbWljX3NhbXBsZV9yYXRlKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NQRV9TU19ETUlDMF9DVEwsCi0JCTB4MEUsIG1hZF9kbWljX2N0bF92YWwgPDwgMSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DUEVfU1NfRE1JQzFfQ1RMLAotCQkweDBFLCBtYWRfZG1pY19jdGxfdmFsIDw8IDEpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ1BFX1NTX0RNSUMyX0NUTCwKLQkJMHgwRSwgbWFkX2RtaWNfY3RsX3ZhbCA8PCAxKTsKLQotCWlmIChkbWljX2Nsa19kcnYgPT0gV0NEOTM0WF9ETUlDX0NMS19ESVZfMikKLQkJYW5jX2N0bF92YWx1ZSA9IFdDRDkzNFhfQU5DX0RNSUNfWDJfRlVMTF9SQVRFOwotCWVsc2UKLQkJYW5jX2N0bF92YWx1ZSA9IFdDRDkzNFhfQU5DX0RNSUNfWDJfSEFMRl9SQVRFOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQU5DMF9NT0RFXzJfQ1RMLAotCQkJICAgIDB4NDAsIGFuY19jdGxfdmFsdWUgPDwgNik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQU5DMF9NT0RFXzJfQ1RMLAotCQkJICAgIDB4MjAsIGFuY19jdGxfdmFsdWUgPDwgNSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMLAotCQkJICAgIDB4NDAsIGFuY19jdGxfdmFsdWUgPDwgNik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOTM0WF9DRENfQU5DMV9NT0RFXzJfQ1RMLAotCQkJICAgIDB4MjAsIGFuY19jdGxfdmFsdWUgPDwgNSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9jZGNfdm90ZV9zdnMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIHZvdGUpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlyZXR1cm4gdGF2aWxfdm90ZV9zdnModGF2aWwsIHZvdGUpOwotfQotCi1zdHJ1Y3Qgd2NkX2RzcF9jZGNfY2IgY2RjX2NiID0gewotCS5jZGNfY2xrX2VuID0gdGF2aWxfY29kZWNfaW50ZXJuYWxfcmNvX2N0cmwsCi0JLmNkY192b3RlX3N2cyA9IHRhdmlsX2NkY192b3RlX3N2cywKLX07Ci0KLXN0YXRpYyBpbnQgdGF2aWxfd2RzcF9pbml0aWFsaXplKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0Jc3RydWN0IHdjZF9kc3BfcGFyYW1zIHBhcmFtczsKLQlpbnQgcmV0ID0gMDsKLQotCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JcGFyYW1zLmNiID0gJmNkY19jYjsKLQlwYXJhbXMuaXJxcy5jcGVfaXBjMV9pcnEgPSBXQ0Q5MzRYX0lSUV9DUEUxX0lOVFI7Ci0JcGFyYW1zLmlycXMuY3BlX2Vycl9pcnEgPSBXQ0Q5MzRYX0lSUV9DUEVfRVJST1I7Ci0JcGFyYW1zLmlycXMuZmF0YWxfaXJxcyA9IENQRV9GQVRBTF9JUlFTOwotCXBhcmFtcy5jbGtfcmF0ZSA9IGNvbnRyb2wtPm1jbGtfcmF0ZTsKLQlwYXJhbXMuZHNwX2luc3RhbmNlID0gMDsKLQotCXdjZF9kc3BfY250bF9pbml0KGNvZGVjLCAmcGFyYW1zLCAmdGF2aWwtPndkc3BfY250bCk7Ci0JaWYgKCF0YXZpbC0+d2RzcF9jbnRsKSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiB3Y2QtZHNwLWNvbnRyb2wgaW5pdCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHRhdmlsX3NvY19nZXRfbWJoYzogZ2V0IHdjZDkzNHhfbWJoYyBoYW5kbGUgb2YgY29ycmVzcG9uZGluZyBjb2RlYwotICogQGNvZGVjOiBoYW5kbGUgdG8gc25kX3NvY19jb2RlYyAqCi0gKgotICogcmV0dXJuIHdjZDkzNHhfbWJoYyBoYW5kbGUgb3IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotc3RydWN0IHdjZDkzNHhfbWJoYyAqdGF2aWxfc29jX2dldF9tYmhjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0KLQlpZiAoIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zLCBOVUxMIGNvZGVjXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKCF0YXZpbCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcywgTlVMTCB0YXZpbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gdGF2aWwtPm1iaGM7Ci19Ci1FWFBPUlRfU1lNQk9MKHRhdmlsX3NvY19nZXRfbWJoYyk7Ci0KLXN0YXRpYyB2b2lkIHRhdmlsX21jbGsyX3JlZ19kZWZhdWx0cyhzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gdGF2aWwtPmNvZGVjOwotCi0JaWYgKFRBVklMX0lTXzFfMCh0YXZpbC0+d2NkOXh4eCkpIHsKLQkJLyogTUNMSzIgY29uZmlndXJhdGlvbiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXZpbF9jb2RlY19tY2xrMl8xXzBfZGVmYXVsdHMpOyBpKyspCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQl0YXZpbF9jb2RlY19tY2xrMl8xXzBfZGVmYXVsdHNbaV0ucmVnLAotCQkJCQl0YXZpbF9jb2RlY19tY2xrMl8xXzBfZGVmYXVsdHNbaV0ubWFzaywKLQkJCQkJdGF2aWxfY29kZWNfbWNsazJfMV8wX2RlZmF1bHRzW2ldLnZhbCk7Ci0JfQotCWlmIChUQVZJTF9JU18xXzEodGF2aWwtPndjZDl4eHgpKSB7Ci0JCS8qIE1DTEsyIGNvbmZpZ3VyYXRpb24gKi8KLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGF2aWxfY29kZWNfbWNsazJfMV8xX2RlZmF1bHRzKTsgaSsrKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJdGF2aWxfY29kZWNfbWNsazJfMV8xX2RlZmF1bHRzW2ldLnJlZywKLQkJCQkJdGF2aWxfY29kZWNfbWNsazJfMV8xX2RlZmF1bHRzW2ldLm1hc2ssCi0JCQkJCXRhdmlsX2NvZGVjX21jbGsyXzFfMV9kZWZhdWx0c1tpXS52YWwpOwotCX0KLX0KLQotc3RhdGljIGludCB0YXZpbF9kZXZpY2VfZG93bihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnByaXY7Ci0JaW50IGNvdW50OwotCi0JY29kZWMgPSAoc3RydWN0IHNuZF9zb2NfY29kZWMgKikod2NkOXh4eC0+c3NyX3ByaXYpOwotCXByaXYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpZiAocHJpdi0+c3dyLmN0cmxfZGF0YSkKLQkJc3dybV93Y2Rfbm90aWZ5KHByaXYtPnN3ci5jdHJsX2RhdGFbMF0uc3dyX3BkZXYsCi0JCQkJU1dSX0RFVklDRV9ET1dOLCBOVUxMKTsKLQl0YXZpbF9kc2RfcmVzZXQocHJpdi0+ZHNkX2NvbmZpZyk7Ci0Jc25kX3NvY19jYXJkX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29kZWMtPmNvbXBvbmVudC5jYXJkLCAwKTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOVU1fQ09ERUNfREFJUzsgY291bnQrKykKLQkJcHJpdi0+ZGFpW2NvdW50XS5idXNfZG93bl9pbl9yZWNvdmVyeSA9IHRydWU7Ci0Jd2NkX2RzcF9zc3JfZXZlbnQocHJpdi0+d2RzcF9jbnRsLCBXQ0RfQ0RDX0RPV05fRVZFTlQpOwotCXdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjX2xvY2tlZChwcml2LT5yZXNtZ3IsCi0JCQkJCSAgICAgU0lET19TT1VSQ0VfSU5URVJOQUwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfcG9zdF9yZXNldF9jYihzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCXN0cnVjdCB3Y2Q5eHh4X3BkYXRhICpwZGF0YTsKLQlzdHJ1Y3Qgd2NkX21iaGMgKm1iaGM7Ci0KLQljb2RlYyA9IChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKSh3Y2Q5eHh4LT5zc3JfcHJpdik7Ci0JdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQljb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXZpbC0+d2NkOXh4eCwKLQkJCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKLQotCW11dGV4X2xvY2soJnRhdmlsLT5jb2RlY19tdXRleCk7Ci0KLQl0YXZpbF92b3RlX3N2cyh0YXZpbCwgdHJ1ZSk7Ci0JdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9kZXZfaW50ZmRldl9sYSA9Ci0JCQkJY29udHJvbC0+c2xpbV9zbGF2ZS0+bGFkZHI7Ci0JdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9kZXZfcGdkX2xhID0KLQkJCQkJY29udHJvbC0+c2xpbS0+bGFkZHI7Ci0JdGF2aWxfaW5pdF9zbGltX3NsYXZlX2NmZyhjb2RlYyk7Ci0Jc25kX3NvY19jYXJkX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29kZWMtPmNvbXBvbmVudC5jYXJkLCAxKTsKLQotCWZvciAoaSA9IDA7IGkgPCBUQVZJTF9NQVhfTUlDQklBUzsgaSsrKQotCQl0YXZpbC0+bWljYl9yZWZbaV0gPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1DTEsgUmF0ZSA9ICV4XG4iLAotCQlfX2Z1bmNfXywgY29udHJvbC0+bWNsa19yYXRlKTsKLQotCWlmIChjb250cm9sLT5tY2xrX3JhdGUgPT0gV0NEOTM0WF9NQ0xLX0NMS18xMlAyODhNSFopCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDkzNFhfQ09ERUNfUlBNX0NMS19NQ0xLX0NGRywKLQkJCQkgICAgMHgwMywgMHgwMCk7Ci0JZWxzZSBpZiAoY29udHJvbC0+bWNsa19yYXRlID09IFdDRDkzNFhfTUNMS19DTEtfOVA2TUhaKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCi0JCQkJICAgIDB4MDMsIDB4MDEpOwotCXdjZF9yZXNtZ3JfcG9zdF9zc3JfdjIodGF2aWwtPnJlc21ncik7Ci0JdGF2aWxfdXBkYXRlX3JlZ19kZWZhdWx0cyh0YXZpbCk7Ci0JdGF2aWxfY29kZWNfaW5pdF9yZWcodGF2aWwpOwotCV9fdGF2aWxfZW5hYmxlX2VmdXNlX3NlbnNpbmcodGF2aWwpOwotCXRhdmlsX21jbGsyX3JlZ19kZWZhdWx0cyh0YXZpbCk7Ci0KLQlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgdHJ1ZSk7Ci0JcmVnY2FjaGVfbWFya19kaXJ0eShjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCk7Ci0JcmVnY2FjaGVfc3luYyhjb2RlYy0+Y29tcG9uZW50LnJlZ21hcCk7Ci0JX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIGZhbHNlKTsKLQotCXRhdmlsX3VwZGF0ZV9jcHJfZGVmYXVsdHModGF2aWwpOwotCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JcmV0ID0gdGF2aWxfaGFuZGxlX3BkYXRhKHRhdmlsLCBwZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBpbnZhbGlkIHBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCi0JbWJoYyA9ICZ0YXZpbC0+bWJoYy0+d2NkX21iaGM7Ci0JcmV0ID0gdGF2aWxfbWJoY19wb3N0X3Nzcl9pbml0KHRhdmlsLT5tYmhjLCBjb2RlYyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogbWJoYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgewotCQl0YXZpbF9tYmhjX2hzX2RldGVjdChjb2RlYywgbWJoYy0+bWJoY19jZmcpOwotCX0KLQotCS8qIERTRCBpbml0aWFsaXphdGlvbiAqLwotCXJldCA9IHRhdmlsX2RzZF9wb3N0X3Nzcl9pbml0KHRhdmlsLT5kc2RfY29uZmlnKTsKLQlpZiAocmV0KQotCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogRFNEIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQl0YXZpbF9jbGVhbnVwX2lycXModGF2aWwpOwotCXJldCA9IHRhdmlsX3NldHVwX2lycXModGF2aWwpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHRhdmlsIGlycSBzZXR1cCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXRhdmlsX3NldF9zcGtyX21vZGUoY29kZWMsIHRhdmlsLT5zd3Iuc3Brcl9tb2RlKTsKLQkvKgotCSAqIE9uY2UgdGhlIGNvZGVjIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlZCwgdGhlIHN2cyB2b3RlCi0JICogY2FuIGJlIHJlbGVhc2VkIGFsbG93aW5nIHRoZSBjb2RlYyB0byBnbyB0byBTVlMyLgotCSAqLwotCXRhdmlsX3ZvdGVfc3ZzKHRhdmlsLCBmYWxzZSk7Ci0Jd2NkX2RzcF9zc3JfZXZlbnQodGF2aWwtPndkc3BfY250bCwgV0NEX0NEQ19VUF9FVkVOVCk7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfc29jX2NvZGVjX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqY29udHJvbDsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0Jc3RydWN0IHdjZDl4eHhfcGRhdGEgKnBkYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCWludCBpLCByZXQ7Ci0Jdm9pZCAqcHRyID0gTlVMTDsKLQotCWNvbnRyb2wgPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWRldl9pbmZvKGNvZGVjLT5kZXYsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JdGF2aWwgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl0YXZpbC0+aW50Zl90eXBlID0gd2NkOXh4eF9nZXRfaW50Zl90eXBlKCk7Ci0KLQljb250cm9sLT5kZXZfZG93biA9IHRhdmlsX2RldmljZV9kb3duOwotCWNvbnRyb2wtPnBvc3RfcmVzZXQgPSB0YXZpbF9wb3N0X3Jlc2V0X2NiOwotCWNvbnRyb2wtPnNzcl9wcml2ID0gKHZvaWQgKiljb2RlYzsKLQotCS8qIFJlc291cmNlIE1hbmFnZXIgcG9zdCBJbml0ICovCi0JcmV0ID0gd2NkX3Jlc21ncl9wb3N0X2luaXQodGF2aWwtPnJlc21nciwgJnRhdmlsX3Jlc21ncl9jYiwgY29kZWMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdjZCByZXNtZ3IgcG9zdCBpbml0IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCS8qIENsYXNzLUggSW5pdCAqLwotCXdjZF9jbHNoX2luaXQoJnRhdmlsLT5jbHNoX2QpOwotCS8qIERlZmF1bHQgSFBIIE1vZGUgdG8gQ2xhc3MtSCBMb3cgSGlGaSAqLwotCXRhdmlsLT5ocGhfbW9kZSA9IENMU19IX0xPSElGSTsKLQotCXRhdmlsLT5md19kYXRhID0gZGV2bV9remFsbG9jKGNvZGVjLT5kZXYsIHNpemVvZigqKHRhdmlsLT5md19kYXRhKSksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0YXZpbC0+ZndfZGF0YSkKLQkJZ290byBlcnI7Ci0KLQlzZXRfYml0KFdDRDlYWFhfQU5DX0NBTCwgdGF2aWwtPmZ3X2RhdGEtPmNhbF9iaXQpOwotCXNldF9iaXQoV0NEOVhYWF9NQkhDX0NBTCwgdGF2aWwtPmZ3X2RhdGEtPmNhbF9iaXQpOwotCXNldF9iaXQoV0NEOVhYWF9NQURfQ0FMLCB0YXZpbC0+ZndfZGF0YS0+Y2FsX2JpdCk7Ci0Jc2V0X2JpdChXQ0Q5WFhYX1ZCQVRfQ0FMLCB0YXZpbC0+ZndfZGF0YS0+Y2FsX2JpdCk7Ci0KLQlyZXQgPSB3Y2RfY2FsX2NyZWF0ZV9od2RlcCh0YXZpbC0+ZndfZGF0YSwKLQkJCQkgICBXQ0Q5WFhYX0NPREVDX0hXREVQX05PREUsIGNvZGVjKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlcyBod2RlcCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9od2RlcDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIE1CSEMgbW9kdWxlICovCi0JcmV0ID0gdGF2aWxfbWJoY19pbml0KCZ0YXZpbC0+bWJoYywgY29kZWMsIHRhdmlsLT5md19kYXRhKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IG1iaGMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2h3ZGVwOwotCX0KLQotCXRhdmlsLT5jb2RlYyA9IGNvZGVjOwotCWZvciAoaSA9IDA7IGkgPCBDT01QQU5ERVJfTUFYOyBpKyspCi0JCXRhdmlsLT5jb21wX2VuYWJsZWRbaV0gPSAwOwotCi0JdGF2aWxfY29kZWNfaW5pdF9yZWcodGF2aWwpOwotCi0JcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0JcmV0ID0gdGF2aWxfaGFuZGxlX3BkYXRhKHRhdmlsLCBwZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGJhZCBwZGF0YVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9od2RlcDsKLQl9Ci0KLQlwdHIgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgKHNpemVvZih0YXZpbF9yeF9jaHMpICsKLQkJCSAgIHNpemVvZih0YXZpbF90eF9jaHMpKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfaHdkZXA7Ci0JfQotCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgdGF2aWxfc2xpbV9hdWRpb19tYXAsCi0JCQlBUlJBWV9TSVpFKHRhdmlsX3NsaW1fYXVkaW9fbWFwKSk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFQ19EQUlTOyBpKyspIHsKLQkJSU5JVF9MSVNUX0hFQUQoJnRhdmlsLT5kYWlbaV0ud2NkOXh4eF9jaF9saXN0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdGF2aWwtPmRhaVtpXS5kYWlfd2FpdCk7Ci0JfQotCXRhdmlsX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X2ludGZkZXZfbGEgPQotCQkJCWNvbnRyb2wtPnNsaW1fc2xhdmUtPmxhZGRyOwotCXRhdmlsX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcuc2xhdmVfZGV2X3BnZF9sYSA9Ci0JCQkJY29udHJvbC0+c2xpbS0+bGFkZHI7Ci0JdGF2aWxfc2xpbWJ1c19zbGF2ZV9wb3J0X2NmZy5zbGF2ZV9wb3J0X21hcHBpbmdbMF0gPQotCQkJCVdDRDkzNFhfVFgxMzsKLQl0YXZpbF9pbml0X3NsaW1fc2xhdmVfY2ZnKGNvZGVjKTsKLQotCWNvbnRyb2wtPm51bV9yeF9wb3J0ID0gV0NEOTM0WF9SWF9NQVg7Ci0JY29udHJvbC0+cnhfY2hzID0gcHRyOwotCW1lbWNweShjb250cm9sLT5yeF9jaHMsIHRhdmlsX3J4X2Nocywgc2l6ZW9mKHRhdmlsX3J4X2NocykpOwotCWNvbnRyb2wtPm51bV90eF9wb3J0ID0gV0NEOTM0WF9UWF9NQVg7Ci0JY29udHJvbC0+dHhfY2hzID0gcHRyICsgc2l6ZW9mKHRhdmlsX3J4X2Nocyk7Ci0JbWVtY3B5KGNvbnRyb2wtPnR4X2NocywgdGF2aWxfdHhfY2hzLCBzaXplb2YodGF2aWxfdHhfY2hzKSk7Ci0KLQlyZXQgPSB0YXZpbF9zZXR1cF9pcnFzKHRhdmlsKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiB0YXZpbCBpcnEgc2V0dXAgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3BkYXRhOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBXQ0Q5MzRYX05VTV9ERUNJTUFUT1JTOyBpKyspIHsKLQkJdGF2aWwtPnR4X2hwZl93b3JrW2ldLnRhdmlsID0gdGF2aWw7Ci0JCXRhdmlsLT50eF9ocGZfd29ya1tpXS5kZWNpbWF0b3IgPSBpOwotCQlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnR4X2hwZl93b3JrW2ldLmR3b3JrLAotCQkJCSAgdGF2aWxfdHhfaHBmX2Nvcm5lcl9mcmVxX2NhbGxiYWNrKTsKLQotCQl0YXZpbC0+dHhfbXV0ZV9kd29ya1tpXS50YXZpbCA9IHRhdmlsOwotCQl0YXZpbC0+dHhfbXV0ZV9kd29ya1tpXS5kZWNpbWF0b3IgPSBpOwotCQlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnR4X211dGVfZHdvcmtbaV0uZHdvcmssCi0JCQkJICB0YXZpbF90eF9tdXRlX3VwZGF0ZV9jYWxsYmFjayk7Ci0JfQotCi0JdGF2aWwtPnNwa19hbmNfZHdvcmsudGF2aWwgPSB0YXZpbDsKLQlJTklUX0RFTEFZRURfV09SSygmdGF2aWwtPnNwa19hbmNfZHdvcmsuZHdvcmssCi0JCQkgIHRhdmlsX3Nwa19hbmNfdXBkYXRlX2NhbGxiYWNrKTsKLQotCXRhdmlsX21jbGsyX3JlZ19kZWZhdWx0cyh0YXZpbCk7Ci0KLQkvKiBEU0QgaW5pdGlhbGl6YXRpb24gKi8KLQl0YXZpbC0+ZHNkX2NvbmZpZyA9IHRhdmlsX2RzZF9pbml0KGNvZGVjKTsKLQlpZiAoSVNfRVJSX09SX05VTEwodGF2aWwtPmRzZF9jb25maWcpKQotCQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogRFNEIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiBQQSIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEVBUiIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSEwgUEEiKTsKLQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkFOQyBIUEhSIFBBIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJBTkMgSFBITCIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQU5DIEhQSFIiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiQU5DIFNQSzEgUEEiKTsKLQltdXRleF91bmxvY2soJnRhdmlsLT5jb2RlY19tdXRleCk7Ci0KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjEgUGxheWJhY2siKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjEgQ2FwdHVyZSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMiBQbGF5YmFjayIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGMiBDYXB0dXJlIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYzIFBsYXliYWNrIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYzIENhcHR1cmUiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjQgUGxheWJhY2siKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFJRjQgTUFEIFRYIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJWSWZlZWQiKTsKLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JdGF2aWxfd2RzcF9pbml0aWFsaXplKGNvZGVjKTsKLQotCS8qCi0JICogT25jZSB0aGUgY29kZWMgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVkLCB0aGUgc3ZzIHZvdGUKLQkgKiBjYW4gYmUgcmVsZWFzZWQgYWxsb3dpbmcgdGhlIGNvZGVjIHRvIGdvIHRvIFNWUzIuCi0JICovCi0JdGF2aWxfdm90ZV9zdnModGF2aWwsIGZhbHNlKTsKLQotCXJldHVybiByZXQ7Ci0KLWVycl9wZGF0YToKLQlkZXZtX2tmcmVlKGNvZGVjLT5kZXYsIHB0cik7Ci0JY29udHJvbC0+cnhfY2hzID0gTlVMTDsKLQljb250cm9sLT50eF9jaHMgPSBOVUxMOwotZXJyX2h3ZGVwOgotCWRldm1fa2ZyZWUoY29kZWMtPmRldiwgdGF2aWwtPmZ3X2RhdGEpOwotCXRhdmlsLT5md19kYXRhID0gTlVMTDsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3NvY19jb2RlY19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JY29udHJvbCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCWRldm1fa2ZyZWUoY29kZWMtPmRldiwgY29udHJvbC0+cnhfY2hzKTsKLQkvKiBzbGltc2xhdmUgZGVpbml0IGluIHdjZCBjb3JlIGxvb2tzIGZvciB0aGlzIHZhbHVlICovCi0JY29udHJvbC0+bnVtX3J4X3BvcnQgPSAwOwotCWNvbnRyb2wtPm51bV90eF9wb3J0ID0gMDsKLQljb250cm9sLT5yeF9jaHMgPSBOVUxMOwotCWNvbnRyb2wtPnR4X2NocyA9IE5VTEw7Ci0JdGF2aWxfY2xlYW51cF9pcnFzKHRhdmlsKTsKLQotCWlmICh0YXZpbC0+d2RzcF9jbnRsKQotCQl3Y2RfZHNwX2NudGxfZGVpbml0KCZ0YXZpbC0+d2RzcF9jbnRsKTsKLQotCS8qIERlaW5pdGlhbGl6ZSBNQkhDIG1vZHVsZSAqLwotCXRhdmlsX21iaGNfZGVpbml0KGNvZGVjKTsKLQl0YXZpbC0+bWJoYyA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCByZWdtYXAgKnRhdmlsX2dldF9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB3Y2Q5eHh4ICpjb250cm9sID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQotCXJldHVybiBjb250cm9sLT5yZWdtYXA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl90YXZpbCA9IHsKLQkucHJvYmUgPSB0YXZpbF9zb2NfY29kZWNfcHJvYmUsCi0JLnJlbW92ZSA9IHRhdmlsX3NvY19jb2RlY19yZW1vdmUsCi0JLmdldF9yZWdtYXAgPSB0YXZpbF9nZXRfcmVnbWFwLAotCS5jb21wb25lbnRfZHJpdmVyID0gewotCQkuY29udHJvbHMgPSB0YXZpbF9zbmRfY29udHJvbHMsCi0JCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRhdmlsX3NuZF9jb250cm9scyksCi0JCS5kYXBtX3dpZGdldHMgPSB0YXZpbF9kYXBtX3dpZGdldHMsCi0JCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0YXZpbF9kYXBtX3dpZGdldHMpLAotCQkuZGFwbV9yb3V0ZXMgPSB0YXZpbF9hdWRpb19tYXAsCi0JCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRhdmlsX2F1ZGlvX21hcCksCi0JfSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgdGF2aWxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKCF0YXZpbCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiB0YXZpbCBwcml2YXRlIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGV2X2RiZyhkZXYsICIlczogc3lzdGVtIHN1c3BlbmRcbiIsIF9fZnVuY19fKTsKLQlpZiAoZGVsYXllZF93b3JrX3BlbmRpbmcoJnRhdmlsLT5wb3dlcl9nYXRlX3dvcmspICYmCi0JICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGF2aWwtPnBvd2VyX2dhdGVfd29yaykpCi0JCXRhdmlsX2NvZGVjX3Bvd2VyX2dhdGVfZGlnaXRhbF9jb3JlKHRhdmlsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmICghdGF2aWwpIHsKLQkJZGV2X2VycihkZXYsICIlczogdGF2aWwgcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSByZXN1bWVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRhdmlsX3BtX29wcyA9IHsKLQkuc3VzcGVuZCA9IHRhdmlsX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHRhdmlsX3Jlc3VtZSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCB0YXZpbF9zd3JtX3JlYWQodm9pZCAqaGFuZGxlLCBpbnQgcmVnKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQl1bnNpZ25lZCBzaG9ydCBzd3JfcmRfYWRkcl9iYXNlOwotCXVuc2lnbmVkIHNob3J0IHN3cl9yZF9kYXRhX2Jhc2U7Ci0JaW50IHZhbCwgcmV0OwotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRhdmlsID0gKHN0cnVjdCB0YXZpbF9wcml2ICopaGFuZGxlOwotCXdjZDl4eHggPSB0YXZpbC0+d2NkOXh4eDsKLQotCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBSZWFkaW5nIHNvdW5kd2lyZSByZWdpc3RlciwgMHgleFxuIiwKLQkJX19mdW5jX18sIHJlZyk7Ci0Jc3dyX3JkX2FkZHJfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfUkRfQUREUl8wOwotCXN3cl9yZF9kYXRhX2Jhc2UgPSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1JEX0RBVEFfMDsKLQotCW11dGV4X2xvY2soJnRhdmlsLT5zd3IucmVhZF9tdXRleCk7Ci0JcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUod2NkOXh4eC0+cmVnbWFwLCBzd3JfcmRfYWRkcl9iYXNlLAotCQkJCSAodTggKikmcmVnLCA0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogUkQgQWRkciBGYWlsdXJlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gcmVnbWFwX2J1bGtfcmVhZCh3Y2Q5eHh4LT5yZWdtYXAsIHN3cl9yZF9kYXRhX2Jhc2UsCi0JCQkJKHU4ICopJnZhbCwgNCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IFJEIERhdGEgRmFpbHVyZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IHZhbDsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZ0YXZpbC0+c3dyLnJlYWRfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9zd3JtX2J1bGtfd3JpdGUodm9pZCAqaGFuZGxlLCB1MzIgKnJlZywgdTMyICp2YWwsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCXN0cnVjdCB3Y2Q5eHh4X3JlZ192YWwgKmJ1bGtfcmVnOwotCXVuc2lnbmVkIHNob3J0IHN3cl93cl9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc3dyX3dyX2RhdGFfYmFzZTsKLQlpbnQgaSwgaiwgcmV0OwotCi0JaWYgKCFoYW5kbGUgfHwgIXJlZyB8fCAhdmFsKSB7Ci0JCXByX2VycigiJXM6IE5VTEwgcGFyYW1ldGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAobGVuIDw9IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzaXplOiAlenVcbiIsIF9fZnVuY19fLCBsZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKiloYW5kbGU7Ci0Jd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OwotCi0Jc3dyX3dyX2FkZHJfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wOwotCXN3cl93cl9kYXRhX2Jhc2UgPSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMDsKLQotCWJ1bGtfcmVnID0ga3phbGxvYygoMiAqIGxlbiAqIHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsKSksCi0JCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1bGtfcmVnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgKGxlbiAqIDIpOyBpICs9IDIsIGorKykgewotCQlidWxrX3JlZ1tpXS5yZWcgPSBzd3Jfd3JfZGF0YV9iYXNlOwotCQlidWxrX3JlZ1tpXS5idWYgPSAodTggKikoJnZhbFtqXSk7Ci0JCWJ1bGtfcmVnW2ldLmJ5dGVzID0gNDsKLQkJYnVsa19yZWdbaSsxXS5yZWcgPSBzd3Jfd3JfYWRkcl9iYXNlOwotCQlidWxrX3JlZ1tpKzFdLmJ1ZiA9ICh1OCAqKSgmcmVnW2pdKTsKLQkJYnVsa19yZWdbaSsxXS5ieXRlcyA9IDQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7Ci0JcmV0ID0gd2NkOXh4eF9zbGltX2J1bGtfd3JpdGUod2NkOXh4eCwgYnVsa19yZWcsCi0JCQkgKGxlbiAqIDIpLCBmYWxzZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogc3dybSBidWxrIHdyaXRlIGZhaWxlZCwgcmV0OiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQltdXRleF91bmxvY2soJnRhdmlsLT5zd3Iud3JpdGVfbXV0ZXgpOwotCi0Ja2ZyZWUoYnVsa19yZWcpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGF2aWxfc3dybV93cml0ZSh2b2lkICpoYW5kbGUsIGludCByZWcsIGludCB2YWwpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4OwotCXVuc2lnbmVkIHNob3J0IHN3cl93cl9hZGRyX2Jhc2U7Ci0JdW5zaWduZWQgc2hvcnQgc3dyX3dyX2RhdGFfYmFzZTsKLQlzdHJ1Y3Qgd2NkOXh4eF9yZWdfdmFsIGJ1bGtfcmVnWzJdOwotCWludCByZXQ7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKiloYW5kbGU7Ci0Jd2NkOXh4eCA9IHRhdmlsLT53Y2Q5eHh4OwotCi0Jc3dyX3dyX2FkZHJfYmFzZSA9IFdDRDkzNFhfU1dSX0FIQl9CUklER0VfV1JfQUREUl8wOwotCXN3cl93cl9kYXRhX2Jhc2UgPSBXQ0Q5MzRYX1NXUl9BSEJfQlJJREdFX1dSX0RBVEFfMDsKLQotCS8qIEZpcnN0IFdyaXRlIHRoZSBEYXRhIHRvIHJlZ2lzdGVyICovCi0JYnVsa19yZWdbMF0ucmVnID0gc3dyX3dyX2RhdGFfYmFzZTsKLQlidWxrX3JlZ1swXS5idWYgPSAodTggKikoJnZhbCk7Ci0JYnVsa19yZWdbMF0uYnl0ZXMgPSA0OwotCWJ1bGtfcmVnWzFdLnJlZyA9IHN3cl93cl9hZGRyX2Jhc2U7Ci0JYnVsa19yZWdbMV0uYnVmID0gKHU4ICopKCZyZWcpOwotCWJ1bGtfcmVnWzFdLmJ5dGVzID0gNDsKLQotCW11dGV4X2xvY2soJnRhdmlsLT5zd3Iud3JpdGVfbXV0ZXgpOwotCXJldCA9IHdjZDl4eHhfc2xpbV9idWxrX3dyaXRlKHdjZDl4eHgsIGJ1bGtfcmVnLCAyLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBXUiBEYXRhIEZhaWx1cmVcbiIsIF9fZnVuY19fKTsKLQltdXRleF91bmxvY2soJnRhdmlsLT5zd3Iud3JpdGVfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9zd3JtX2Nsb2NrKHZvaWQgKmhhbmRsZSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsOwotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogTlVMTCBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRhdmlsID0gKHN0cnVjdCB0YXZpbF9wcml2ICopaGFuZGxlOwotCi0JbXV0ZXhfbG9jaygmdGF2aWwtPnN3ci5jbGtfbXV0ZXgpOwotCWRldl9kYmcodGF2aWwtPmRldiwgIiVzOiBzd3JtIGNsb2NrICVzXG4iLAotCQlfX2Z1bmNfXywgKGVuYWJsZT8iZW5hYmxlIiA6ICJkaXNhYmxlIikpOwotCWlmIChlbmFibGUpIHsKLQkJdGF2aWwtPnN3ci5jbGtfdXNlcnMrKzsKLQkJaWYgKHRhdmlsLT5zd3IuY2xrX3VzZXJzID09IDEpIHsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAotCQkJCQlXQ0Q5MzRYX1RFU1RfREVCVUdfTlBMX0RMWV9URVNUXzEsCi0JCQkJCTB4MTAsIDB4MDApOwotCQkJX190YXZpbF9jZGNfbWNsa19lbmFibGUodGF2aWwsIHRydWUpOwotCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJV0NEOTM0WF9DRENfQ0xLX1JTVF9DVFJMX1NXUl9DT05UUk9MLAotCQkJCTB4MDEsIDB4MDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdGF2aWwtPnN3ci5jbGtfdXNlcnMtLTsKLQkJaWYgKHRhdmlsLT5zd3IuY2xrX3VzZXJzID09IDApIHsKLQkJCXJlZ21hcF91cGRhdGVfYml0cyh0YXZpbC0+d2NkOXh4eC0+cmVnbWFwLAotCQkJCVdDRDkzNFhfQ0RDX0NMS19SU1RfQ1RSTF9TV1JfQ09OVFJPTCwKLQkJCQkweDAxLCAweDAwKTsKLQkJCV9fdGF2aWxfY2RjX21jbGtfZW5hYmxlKHRhdmlsLCBmYWxzZSk7Ci0JCQlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJCQkJV0NEOTM0WF9URVNUX0RFQlVHX05QTF9ETFlfVEVTVF8xLAotCQkJCQkweDEwLCAweDEwKTsKLQkJfQotCX0KLQlkZXZfZGJnKHRhdmlsLT5kZXYsICIlczogc3dybSBjbG9jayB1c2VycyAlZFxuIiwKLQkJX19mdW5jX18sIHRhdmlsLT5zd3IuY2xrX3VzZXJzKTsKLQltdXRleF91bmxvY2soJnRhdmlsLT5zd3IuY2xrX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRhdmlsX3N3cm1faGFuZGxlX2lycSh2b2lkICpoYW5kbGUsCi0JCQkJIGlycXJldHVybl90ICgqc3dybV9pcnFfaGFuZGxlcikoaW50IGlycSwKLQkJCQkJCQkJIHZvaWQgKmRhdGEpLAotCQkJCSB2b2lkICpzd3JtX2hhbmRsZSwKLQkJCQkgaW50IGFjdGlvbikKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0KLQlpZiAoIWhhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBOVUxMIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGF2aWwgPSAoc3RydWN0IHRhdmlsX3ByaXYgKikgaGFuZGxlOwotCXdjZDl4eHggPSB0YXZpbC0+d2NkOXh4eDsKLQotCWlmIChhY3Rpb24pIHsKLQkJcmV0ID0gd2NkOXh4eF9yZXF1ZXN0X2lycSgmd2NkOXh4eC0+Y29yZV9yZXMsCi0JCQkJCSAgV0NEOTM0WF9JUlFfU09VTkRXSVJFLAotCQkJCQkgIHN3cm1faXJxX2hhbmRsZXIsCi0JCQkJCSAgIlRhdmlsIFNXUiBNYXN0ZXIiLCBzd3JtX2hhbmRsZSk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLAotCQkJCV9fZnVuY19fLCBXQ0Q5MzRYX0lSUV9TT1VORFdJUkUpOwotCX0gZWxzZQotCQl3Y2Q5eHh4X2ZyZWVfaXJxKCZ3Y2Q5eHh4LT5jb3JlX3JlcywgV0NEOTM0WF9JUlFfU09VTkRXSVJFLAotCQkJCSBzd3JtX2hhbmRsZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB0YXZpbF9jb2RlY19hZGRfc3BpX2RldmljZShzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWwsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7Ci0JdTMyIHByb3BfdmFsdWU7Ci0JaW50IHJjOwotCi0JLyogUmVhZCB0aGUgbWFzdGVyIGJ1cyBudW0gZnJvbSBEVCBub2RlICovCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxtYXN0ZXItYnVzLW51bSIsCi0JCQkJICAmcHJvcF92YWx1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogcHJvcCAlcyBub3QgZm91bmQgaW4gbm9kZSAlcyIsCi0JCQlfX2Z1bmNfXywgInFjb20sbWFzdGVyLWJ1cy1udW0iLCBub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogR2V0IHRoZSByZWZlcmVuY2UgdG8gU1BJIG1hc3RlciAqLwotCW1hc3RlciA9IHNwaV9idXNudW1fdG9fbWFzdGVyKHByb3BfdmFsdWUpOwotCWlmICghbWFzdGVyKSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBJbnZhbGlkIHNwaV9tYXN0ZXIgZm9yIGJ1c19udW0gJXVcbiIsCi0JCQlfX2Z1bmNfXywgcHJvcF92YWx1ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgc3BpIGRldmljZSAqLwotCXNwaSA9IHNwaV9hbGxvY19kZXZpY2UobWFzdGVyKTsKLQlpZiAoIXNwaSkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogc3BpX2FsbG9jX2RldmljZSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3NwaV9hbGxvY19kZXY7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBkZXZpY2UgcHJvcGVydGllcyAqLwotCWlmIChvZl9tb2RhbGlhc19ub2RlKG5vZGUsIHNwaS0+bW9kYWxpYXMsCi0JCQkgICAgIHNpemVvZihzcGktPm1vZGFsaWFzKSkgPCAwKSB7Ci0JCWRldl9lcnIodGF2aWwtPmRldiwgIiVzOiBjYW5ub3QgZmluZCBtb2RhbGlhcyBmb3IgJXNcbiIsCi0JCQlfX2Z1bmNfXywgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZ290byBlcnJfZHRfcGFyc2U7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicWNvbSxjaGlwLXNlbGVjdCIsCi0JCQkJICAmcHJvcF92YWx1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogcHJvcCAlcyBub3QgZm91bmQgaW4gbm9kZSAlcyIsCi0JCQlfX2Z1bmNfXywgInFjb20sY2hpcC1zZWxlY3QiLCBub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIGVycl9kdF9wYXJzZTsKLQl9Ci0Jc3BpLT5jaGlwX3NlbGVjdCA9IHByb3BfdmFsdWU7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJxY29tLG1heC1mcmVxdWVuY3kiLAotCQkJCSAgJnByb3BfdmFsdWUpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2Vycih0YXZpbC0+ZGV2LCAiJXM6IHByb3AgJXMgbm90IGZvdW5kIGluIG5vZGUgJXMiLAotCQkJX19mdW5jX18sICJxY29tLG1heC1mcmVxdWVuY3kiLCBub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIGVycl9kdF9wYXJzZTsKLQl9Ci0Jc3BpLT5tYXhfc3BlZWRfaHogPSBwcm9wX3ZhbHVlOwotCi0Jc3BpLT5kZXYub2Zfbm9kZSA9IG5vZGU7Ci0KLQlyYyA9IHNwaV9hZGRfZGV2aWNlKHNwaSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKHRhdmlsLT5kZXYsICIlczogc3BpX2FkZF9kZXZpY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2R0X3BhcnNlOwotCX0KLQotCXRhdmlsLT5zcGkgPSBzcGk7Ci0JLyogUHV0IHRoZSByZWZlcmVuY2UgdG8gU1BJIG1hc3RlciAqLwotCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKLQotCXJldHVybjsKLQotZXJyX2R0X3BhcnNlOgotCXNwaV9kZXZfcHV0KHNwaSk7Ci0KLWVycl9zcGlfYWxsb2NfZGV2OgotCS8qIFB1dCB0aGUgcmVmZXJlbmNlIHRvIFNQSSBtYXN0ZXIgKi8KLQlwdXRfZGV2aWNlKCZtYXN0ZXItPmRldik7Ci1kb25lOgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgdGF2aWxfYWRkX2NoaWxkX2RldmljZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eDsKLQlzdHJ1Y3QgdGF2aWxfc3dyX2N0cmxfZGF0YSAqc3dyX2N0cmxfZGF0YSA9IE5VTEwsICp0ZW1wOwotCWludCByZXQsIGN0cmxfbnVtID0gMDsKLQlzdHJ1Y3Qgd2NkX3N3cl9jdHJsX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhOwotCWNoYXIgcGxhdF9kZXZfbmFtZVtXQ0Q5MzRYX1NUUklOR19MRU5dOwotCi0JdGF2aWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhdmlsX3ByaXYsCi0JCQkgICAgIHRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmspOwotCWlmICghdGF2aWwpIHsKLQkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5MzRYIGRvZXMgbm90IGV4aXN0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCXdjZDl4eHggPSB0YXZpbC0+d2NkOXh4eDsKLQlpZiAoIXdjZDl4eHgpIHsKLQkJcHJfZXJyKCIlczogTWVtb3J5IGZvciBXQ0Q5WFhYIGRvZXMgbm90IGV4aXN0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCWlmICghd2NkOXh4eC0+ZGV2LT5vZl9ub2RlKSB7Ci0JCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IERUIG5vZGUgZm9yIHdjZDl4eHggZG9lcyBub3QgZXhpc3RcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwbGF0ZGF0YSA9ICZ0YXZpbC0+c3dyLnBsYXRfZGF0YTsKLQl0YXZpbC0+Y2hpbGRfY291bnQgPSAwOwotCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZSh3Y2Q5eHh4LT5kZXYtPm9mX25vZGUsIG5vZGUpIHsKLQotCQkvKiBQYXJzZSBhbmQgYWRkIHRoZSBTUEkgZGV2aWNlIG5vZGUgKi8KLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgIndjZF9zcGkiKSkgewotCQkJdGF2aWxfY29kZWNfYWRkX3NwaV9kZXZpY2UodGF2aWwsIG5vZGUpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBQYXJzZSBvdGhlciBjaGlsZCBkZXZpY2Ugbm9kZXMgYW5kIGFkZCBwbGF0Zm9ybSBkZXZpY2UgKi8KLQkJaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSkKLQkJCXN0cmxjcHkocGxhdF9kZXZfbmFtZSwgInRhdmlsX3N3cl9jdHJsIiwKLQkJCQkoV0NEOTM0WF9TVFJJTkdfTEVOIC0gMSkpOwotCQllbHNlIGlmIChzdHJuc3RyKG5vZGUtPm5hbWUsICJtc21fY2RjX3BpbmN0cmwiLAotCQkJCSBzdHJsZW4oIm1zbV9jZGNfcGluY3RybCIpKSAhPSBOVUxMKQotCQkJc3RybGNweShwbGF0X2Rldl9uYW1lLCBub2RlLT5uYW1lLAotCQkJCShXQ0Q5MzRYX1NUUklOR19MRU4gLSAxKSk7Ci0JCWVsc2UKLQkJCWNvbnRpbnVlOwotCi0JCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MocGxhdF9kZXZfbmFtZSwgLTEpOwotCQlpZiAoIXBkZXYpIHsKLQkJCWRldl9lcnIod2NkOXh4eC0+ZGV2LCAiJXM6IHBkZXYgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfbWVtOwotCQl9Ci0JCXBkZXYtPmRldi5wYXJlbnQgPSB0YXZpbC0+ZGV2OwotCQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5vZGU7Ci0KLQkJaWYgKHN0cmNtcChub2RlLT5uYW1lLCAic3dyX21hc3RlciIpID09IDApIHsKLQkJCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwbGF0ZGF0YSwKLQkJCQkJCSAgICAgICBzaXplb2YoKnBsYXRkYXRhKSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCQkiJXM6IGNhbm5vdCBhZGQgcGxhdCBkYXRhIGN0cmw6JWRcbiIsCi0JCQkJCV9fZnVuY19fLCBjdHJsX251bSk7Ci0JCQkJZ290byBlcnJfcGRldl9hZGQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBDYW5ub3QgYWRkIHBsYXRmb3JtIGRldmljZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycl9wZGV2X2FkZDsKLQkJfQotCi0JCWlmIChzdHJjbXAobm9kZS0+bmFtZSwgInN3cl9tYXN0ZXIiKSA9PSAwKSB7Ci0JCQl0ZW1wID0ga3JlYWxsb2Moc3dyX2N0cmxfZGF0YSwKLQkJCQkJKGN0cmxfbnVtICsgMSkgKiBzaXplb2YoCi0JCQkJCXN0cnVjdCB0YXZpbF9zd3JfY3RybF9kYXRhKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXRlbXApIHsKLQkJCQlkZXZfZXJyKHdjZDl4eHgtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOwotCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJZ290byBlcnJfcGRldl9hZGQ7Ci0JCQl9Ci0JCQlzd3JfY3RybF9kYXRhID0gdGVtcDsKLQkJCXN3cl9jdHJsX2RhdGFbY3RybF9udW1dLnN3cl9wZGV2ID0gcGRldjsKLQkJCWN0cmxfbnVtKys7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBBZGRlZCBzb3VuZHdpcmUgY3RybCBkZXZpY2UocylcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJdGF2aWwtPnN3ci5jdHJsX2RhdGEgPSBzd3JfY3RybF9kYXRhOwotCQl9Ci0JCWlmICh0YXZpbC0+Y2hpbGRfY291bnQgPCBXQ0Q5MzRYX0NISUxEX0RFVklDRVNfTUFYKQotCQkJdGF2aWwtPnBkZXZfY2hpbGRfZGV2aWNlc1t0YXZpbC0+Y2hpbGRfY291bnQrK10gPSBwZGV2OwotCQllbHNlCi0JCQlnb3RvIGVycl9tZW07Ci0JfQotCi0JcmV0dXJuOwotCi1lcnJfcGRldl9hZGQ6Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKLWVycl9tZW06Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IF9fdGF2aWxfZW5hYmxlX2VmdXNlX3NlbnNpbmcoc3RydWN0IHRhdmlsX3ByaXYgKnRhdmlsKQotewotCWludCB2YWwsIHJjOwotCi0JV0NEOVhYWF9WMl9CR19DTEtfTE9DSyh0YXZpbC0+cmVzbWdyKTsKLQlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZV9sb2NrZWQodGF2aWwsIHRydWUpOwotCi0JcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQlXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCwgMHgxRSwgMHgxMCk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQlXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX0NUTCwgMHgwMSwgMHgwMSk7Ci0JLyoKLQkgKiA1bXMgc2xlZXAgcmVxdWlyZWQgYWZ0ZXIgZW5hYmxpbmcgZWZ1c2UgY29udHJvbAotCSAqIGJlZm9yZSBjaGVja2luZyB0aGUgc3RhdHVzLgotCSAqLwotCXVzbGVlcF9yYW5nZSg1MDAwLCA1NTAwKTsKLQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyh0YXZpbC0+cmVzbWdyLAotCQkJCQkgICAgIFNJRE9fU09VUkNFX1JDT19CRyk7Ci0KLQlXQ0Q5WFhYX1YyX0JHX0NMS19VTkxPQ0sodGF2aWwtPnJlc21ncik7Ci0KLQlyYyA9IHJlZ21hcF9yZWFkKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkgV0NEOTM0WF9DSElQX1RJRVJfQ1RSTF9FRlVTRV9TVEFUVVMsICZ2YWwpOwotCWlmIChyYyB8fCAoISh2YWwgJiAweDAxKSkpCi0JCVdBUk4oMSwgIiVzOiBFZnVzZSBzZW5zZSBpcyBub3QgY29tcGxldGUgdmFsPSV4LCByZXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgdmFsLCByYyk7Ci0KLQlfX3RhdmlsX2NkY19tY2xrX2VuYWJsZSh0YXZpbCwgZmFsc2UpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBfX190YXZpbF9nZXRfY29kZWNfZmluZV92ZXJzaW9uKHN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbCkKLXsKLQlpbnQgdmFsMSwgdmFsMiwgdmVyc2lvbjsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Ci0JdTE2IGlkX21pbm9yOwotCXUzMiB2ZXJzaW9uX21hc2sgPSAwOwotCi0JcmVnbWFwID0gdGF2aWwtPndjZDl4eHgtPnJlZ21hcDsKLQl2ZXJzaW9uID0gdGF2aWwtPndjZDl4eHgtPnZlcnNpb247Ci0JaWRfbWlub3IgPSB0YXZpbC0+d2NkOXh4eC0+Y29kZWNfdHlwZS0+aWRfbWlub3I7Ci0KLQlyZWdtYXBfcmVhZChyZWdtYXAsIFdDRDkzNFhfQ0hJUF9USUVSX0NUUkxfRUZVU0VfVkFMX09VVDE0LCAmdmFsMSk7Ci0JcmVnbWFwX3JlYWQocmVnbWFwLCBXQ0Q5MzRYX0NISVBfVElFUl9DVFJMX0VGVVNFX1ZBTF9PVVQxNSwgJnZhbDIpOwotCi0JZGV2X2RiZyh0YXZpbC0+ZGV2LCAiJXM6IGNoaXAgdmVyc2lvbiA6MHgleCAweDoleFxuIiwKLQkJX19mdW5jX18sIHZhbDEsIHZhbDIpOwotCi0JdmVyc2lvbl9tYXNrIHw9ICghISgodTgpdmFsMSAmIDB4ODApKSA8PCBEU0RfRElTQUJMRURfTUFTSzsKLQl2ZXJzaW9uX21hc2sgfD0gKCEhKCh1OCl2YWwyICYgMHgwMSkpIDw8IFNMTlFfRElTQUJMRURfTUFTSzsKLQotCXN3aXRjaCAodmVyc2lvbl9tYXNrKSB7Ci0JY2FzZSBEU0RfRElTQUJMRUQgfCBTTE5RX0RJU0FCTEVEOgotCQlpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMCkpCi0JCQl2ZXJzaW9uID0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMDsKLQkJZWxzZSBpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMHgwMSkpCi0JCQl2ZXJzaW9uID0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQwXzFfMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTE5RX0RJU0FCTEVEOgotCQlpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMCkpCi0JCQl2ZXJzaW9uID0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMDsKLQkJZWxzZSBpZiAoaWRfbWlub3IgPT0gY3B1X3RvX2xlMTYoMHgwMSkpCi0JCQl2ZXJzaW9uID0gVEFWSUxfVkVSU0lPTl9XQ0Q5MzQxXzFfMTsKLQkJYnJlYWs7Ci0JfQotCi0JdGF2aWwtPndjZDl4eHgtPnZlcnNpb24gPSB2ZXJzaW9uOwotCXRhdmlsLT53Y2Q5eHh4LT5jb2RlY190eXBlLT52ZXJzaW9uID0gdmVyc2lvbjsKLX0KLQotLyoKLSAqIHRhdmlsX2dldF93Y2RfZHNwX2NudGw6IEdldCB0aGUgcmVmZXJlbmNlIHRvIHdjZF9kc3BfY250bAotICogQGRldjogRGV2aWNlIHBvaW50ZXIgZm9yIGNvZGVjIGRldmljZQotICoKLSAqIFRoaXMgQVBJIGdldHMgdGhlIHJlZmVyZW5jZSB0byBjb2RlYydzIHN0cnVjdCB3Y2RfZHNwX2NudGwKLSAqLwotc3RydWN0IHdjZF9kc3BfY250bCAqdGF2aWxfZ2V0X3djZF9kc3BfY250bChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0KLQlpZiAoIWRldikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRldmljZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0JdGF2aWwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXJldHVybiB0YXZpbC0+d2RzcF9jbnRsOwotfQotRVhQT1JUX1NZTUJPTCh0YXZpbF9nZXRfd2NkX2RzcF9jbnRsKTsKLQotc3RhdGljIGludCB0YXZpbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB0YXZpbF9wcml2ICp0YXZpbDsKLQlzdHJ1Y3QgY2xrICp3Y2RfZXh0X2NsazsKLQlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncjsKLQlzdHJ1Y3Qgd2NkOXh4eF9wb3dlcl9yZWdpb24gKmNkY19wd3I7Ci0KLQl0YXZpbCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHRhdmlsX3ByaXYpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghdGF2aWwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdGF2aWwpOwotCi0JdGF2aWwtPndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JdGF2aWwtPmRldiA9ICZwZGV2LT5kZXY7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnRhdmlsLT5wb3dlcl9nYXRlX3dvcmssIHRhdmlsX2NvZGVjX3Bvd2VyX2dhdGVfd29yayk7Ci0JbXV0ZXhfaW5pdCgmdGF2aWwtPnBvd2VyX2xvY2spOwotCUlOSVRfV09SSygmdGF2aWwtPnRhdmlsX2FkZF9jaGlsZF9kZXZpY2VzX3dvcmssCi0JCSAgdGF2aWxfYWRkX2NoaWxkX2RldmljZXMpOwotCW11dGV4X2luaXQoJnRhdmlsLT5taWNiX2xvY2spOwotCW11dGV4X2luaXQoJnRhdmlsLT5zd3IucmVhZF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGF2aWwtPnN3ci5jbGtfbXV0ZXgpOwotCW11dGV4X2luaXQoJnRhdmlsLT5jb2RlY19tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmdGF2aWwtPnN2c19tdXRleCk7Ci0KLQkvKgotCSAqIENvZGVjIGhhcmR3YXJlIGJ5IGRlZmF1bHQgY29tZXMgdXAgaW4gU1ZTIG1vZGUuCi0JICogSW5pdGlhbGl6ZSB0aGUgc3ZzX3JlZl9jbnQgdG8gMSB0byByZWZsZWN0IHRoZSBoYXJkd2FyZQotCSAqIHN0YXRlIGluIHRoZSBkcml2ZXIuCi0JICovCi0JdGF2aWwtPnN2c19yZWZfY250ID0gMTsKLQotCWNkY19wd3IgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3Y2Q5eHh4X3Bvd2VyX3JlZ2lvbiksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZGNfcHdyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3Jlc21ncjsKLQl9Ci0JdGF2aWwtPndjZDl4eHgtPndjZDl4eHhfcHdyW1dDRDlYWFhfRElHX0NPUkVfUkVHSU9OXzFdID0gY2RjX3B3cjsKLQljZGNfcHdyLT5wd3JfY29sbGFwc2VfcmVnX21pbiA9IFdDRDkzNFhfRElHX0NPUkVfUkVHX01JTjsKLQljZGNfcHdyLT5wd3JfY29sbGFwc2VfcmVnX21heCA9IFdDRDkzNFhfRElHX0NPUkVfUkVHX01BWDsKLQl3Y2Q5eHh4X3NldF9wb3dlcl9zdGF0ZSh0YXZpbC0+d2NkOXh4eCwKLQkJCQlXQ0RfUkVHSU9OX1BPV0VSX0NPTExBUFNFX1JFTU9WRSwKLQkJCQlXQ0Q5WFhYX0RJR19DT1JFX1JFR0lPTl8xKTsKLQkvKgotCSAqIEluaXQgcmVzb3VyY2UgbWFuYWdlciBzbyB0aGF0IGlmIGNoaWxkIG5vZGVzIHN1Y2ggYXMgU291bmRXaXJlCi0JICogcmVxdWVzdHMgZm9yIGNsb2NrLCByZXNvdXJjZSBtYW5hZ2VyIGNhbiBob25vciB0aGUgcmVxdWVzdAotCSAqLwotCXJlc21nciA9IHdjZF9yZXNtZ3JfaW5pdCgmdGF2aWwtPndjZDl4eHgtPmNvcmVfcmVzLCBOVUxMKTsKLQlpZiAoSVNfRVJSKHJlc21ncikpIHsKLQkJcmV0ID0gUFRSX0VSUihyZXNtZ3IpOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgd2NkIHJlc21nclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBlcnJfcmVzbWdyOwotCX0KLQl0YXZpbC0+cmVzbWdyID0gcmVzbWdyOwotCXRhdmlsLT5zd3IucGxhdF9kYXRhLmhhbmRsZSA9ICh2b2lkICopIHRhdmlsOwotCXRhdmlsLT5zd3IucGxhdF9kYXRhLnJlYWQgPSB0YXZpbF9zd3JtX3JlYWQ7Ci0JdGF2aWwtPnN3ci5wbGF0X2RhdGEud3JpdGUgPSB0YXZpbF9zd3JtX3dyaXRlOwotCXRhdmlsLT5zd3IucGxhdF9kYXRhLmJ1bGtfd3JpdGUgPSB0YXZpbF9zd3JtX2J1bGtfd3JpdGU7Ci0JdGF2aWwtPnN3ci5wbGF0X2RhdGEuY2xrID0gdGF2aWxfc3dybV9jbG9jazsKLQl0YXZpbC0+c3dyLnBsYXRfZGF0YS5oYW5kbGVfaXJxID0gdGF2aWxfc3dybV9oYW5kbGVfaXJxOwotCXRhdmlsLT5zd3Iuc3Brcl9nYWluX29mZnNldCA9IFdDRDkzNFhfUlhfR0FJTl9PRkZTRVRfMF9EQjsKLQotCS8qIFJlZ2lzdGVyIGZvciBDbG9jayAqLwotCXdjZF9leHRfY2xrID0gY2xrX2dldCh0YXZpbC0+d2NkOXh4eC0+ZGV2LCAid2NkX2NsayIpOwotCWlmIChJU19FUlIod2NkX2V4dF9jbGspKSB7Ci0JCWRldl9lcnIodGF2aWwtPndjZDl4eHgtPmRldiwgIiVzOiBjbGsgZ2V0ICVzIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCAid2NkX2V4dF9jbGsiKTsKLQkJZ290byBlcnJfY2xrOwotCX0KLQl0YXZpbC0+d2NkX2V4dF9jbGsgPSB3Y2RfZXh0X2NsazsKLQlzZXRfYml0KEFVRElPX05PTUlOQUwsICZ0YXZpbC0+c3RhdHVzX21hc2spOwotCS8qIFVwZGF0ZSBjb2RlYyByZWdpc3RlciBkZWZhdWx0IHZhbHVlcyAqLwotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBNQ0xLIFJhdGUgPSAleFxuIiwgX19mdW5jX18sCi0JCXRhdmlsLT53Y2Q5eHh4LT5tY2xrX3JhdGUpOwotCWlmICh0YXZpbC0+d2NkOXh4eC0+bWNsa19yYXRlID09IFdDRDkzNFhfTUNMS19DTEtfMTJQMjg4TUhaKQotCQlyZWdtYXBfdXBkYXRlX2JpdHModGF2aWwtPndjZDl4eHgtPnJlZ21hcCwKLQkJCQkgICBXQ0Q5MzRYX0NPREVDX1JQTV9DTEtfTUNMS19DRkcsCi0JCQkJICAgMHgwMywgMHgwMCk7Ci0JZWxzZSBpZiAodGF2aWwtPndjZDl4eHgtPm1jbGtfcmF0ZSA9PSBXQ0Q5MzRYX01DTEtfQ0xLXzlQNk1IWikKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHRhdmlsLT53Y2Q5eHh4LT5yZWdtYXAsCi0JCQkJICAgV0NEOTM0WF9DT0RFQ19SUE1fQ0xLX01DTEtfQ0ZHLAotCQkJCSAgIDB4MDMsIDB4MDEpOwotCXRhdmlsX3VwZGF0ZV9yZWdfZGVmYXVsdHModGF2aWwpOwotCV9fdGF2aWxfZW5hYmxlX2VmdXNlX3NlbnNpbmcodGF2aWwpOwotCV9fX3RhdmlsX2dldF9jb2RlY19maW5lX3ZlcnNpb24odGF2aWwpOwotCXRhdmlsX3VwZGF0ZV9jcHJfZGVmYXVsdHModGF2aWwpOwotCi0JLyogUmVnaXN0ZXIgd2l0aCBzb2MgZnJhbWV3b3JrICovCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl90YXZpbCwKLQkJCQkgIHRhdmlsX2RhaSwgQVJSQVlfU0laRSh0YXZpbF9kYWkpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBDb2RlYyByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAotCQkgX19mdW5jX18pOwotCQlnb3RvIGVycl9jZGNfcmVnOwotCX0KLQlzY2hlZHVsZV93b3JrKCZ0YXZpbC0+dGF2aWxfYWRkX2NoaWxkX2RldmljZXNfd29yayk7Ci0KLQlyZXR1cm4gcmV0OwotCi1lcnJfY2RjX3JlZzoKLQljbGtfcHV0KHRhdmlsLT53Y2RfZXh0X2Nsayk7Ci1lcnJfY2xrOgotCXdjZF9yZXNtZ3JfcmVtb3ZlKHRhdmlsLT5yZXNtZ3IpOwotZXJyX3Jlc21ncjoKLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+bWljYl9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+c3ZzX211dGV4KTsKLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5zd3IucmVhZF9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN3ci5jbGtfbXV0ZXgpOwotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgdGF2aWwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0YXZpbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGF2aWxfcHJpdiAqdGF2aWw7Ci0JaW50IGNvdW50ID0gMDsKLQotCXRhdmlsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaWYgKCF0YXZpbCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBkbyBkc2QgZGVpbml0IGJlZm9yZSBjb2RlYy0+Y29tcG9uZW50LT5yZWdtYXAgYmVjb21lcyBmcmVlZCAqLwotCWlmICh0YXZpbC0+ZHNkX2NvbmZpZykgewotCQl0YXZpbF9kc2RfZGVpbml0KHRhdmlsLT5kc2RfY29uZmlnKTsKLQkJdGF2aWwtPmRzZF9jb25maWcgPSBOVUxMOwotCX0KLQotCWlmICh0YXZpbC0+c3BpKQotCQlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UodGF2aWwtPnNwaSk7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdGF2aWwtPmNoaWxkX2NvdW50ICYmCi0JCQkJY291bnQgPCBXQ0Q5MzRYX0NISUxEX0RFVklDRVNfTUFYOyBjb3VudCsrKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0YXZpbC0+cGRldl9jaGlsZF9kZXZpY2VzW2NvdW50XSk7Ci0KLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+bWljYl9sb2NrKTsKLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+c3ZzX211dGV4KTsKLQltdXRleF9kZXN0cm95KCZ0YXZpbC0+Y29kZWNfbXV0ZXgpOwotCW11dGV4X2Rlc3Ryb3koJnRhdmlsLT5zd3IucmVhZF9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN3ci53cml0ZV9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmdGF2aWwtPnN3ci5jbGtfbXV0ZXgpOwotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOwotCWNsa19wdXQodGF2aWwtPndjZF9leHRfY2xrKTsKLQl3Y2RfcmVzbWdyX3JlbW92ZSh0YXZpbC0+cmVzbWdyKTsKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHRhdmlsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGF2aWxfY29kZWNfZHJpdmVyID0gewotCS5wcm9iZSA9IHRhdmlsX3Byb2JlLAotCS5yZW1vdmUgPSB0YXZpbF9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAidGF2aWxfY29kZWMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KLQkJLnBtID0gJnRhdmlsX3BtX29wcywKLSNlbmRpZgotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRhdmlsX2NvZGVjX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVGF2aWwgQ29kZWMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMjFmMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDkzNHgvd2NkOTM0eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBXQ0Q5MzRYX0gKLSNkZWZpbmUgV0NEOTM0WF9ICi0KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LXNsaW1zbGF2ZS5oPgotI2luY2x1ZGUgIndjZDkzNHgtZHNwLWNudGwuaCIKLSNpbmNsdWRlICIuLi93Y2Q5eHh4LWNvbW1vbi12Mi5oIgotI2luY2x1ZGUgIi4uL3djZC1tYmhjLXYyLmgiCi0KLSNkZWZpbmUgV0NEOTM0WF9SRUdJU1RFUl9TVEFSVF9PRkZTRVQgIDB4ODAwCi0jZGVmaW5lIFdDRDkzNFhfU0JfUEdEX1BPUlRfUlhfQkFTRSAgIDB4NDAKLSNkZWZpbmUgV0NEOTM0WF9TQl9QR0RfUE9SVF9UWF9CQVNFICAgMHg1MAotI2RlZmluZSBXQ0Q5MzRYX1JYX1BPUlRfU1RBUlRfTlVNQkVSICAxNgotCi0jZGVmaW5lIFdDRDkzNFhfRE1JQ19DTEtfRElWXzIgIDB4MAotI2RlZmluZSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl8zICAweDEKLSNkZWZpbmUgV0NEOTM0WF9ETUlDX0NMS19ESVZfNCAgMHgyCi0jZGVmaW5lIFdDRDkzNFhfRE1JQ19DTEtfRElWXzYgIDB4MwotI2RlZmluZSBXQ0Q5MzRYX0RNSUNfQ0xLX0RJVl84ICAweDQKLSNkZWZpbmUgV0NEOTM0WF9ETUlDX0NMS19ESVZfMTYgIDB4NQotI2RlZmluZSBXQ0Q5MzRYX0RNSUNfQ0xLX0RSSVZFX0RFRkFVTFQgMHgwMgotCi0jZGVmaW5lIFdDRDkzNFhfQU5DX0RNSUNfWDJfRlVMTF9SQVRFIDEKLSNkZWZpbmUgV0NEOTM0WF9BTkNfRE1JQ19YMl9IQUxGX1JBVEUgMAotCi0jZGVmaW5lIFRBVklMX01BWF9NSUNCSUFTIDQKLSNkZWZpbmUgVEFWSUxfTlVNX0lOVEVSUE9MQVRPUlMgOQotI2RlZmluZSBNQVhfT05fREVNQU5EX1NVUFBMWV9OQU1FX0xFTkdUSCAgICA2NAotCi0vKiBDb252ZXJ0IGZyb20gdm91dCBjdGwgdG8gbWljYmlhcyB2b2x0YWdlIGluIG1WICovCi0jZGVmaW5lICBXQ0RfVk9VVF9DVExfVE9fTUlDQih2KSAgKDEwMDAgKyB2ICogNTApCi0KLS8qIEZlYXR1cmUgbWFza3MgdG8gZGlzdGluZ3Vpc2ggY29kZWMgdmVyc2lvbiAqLwotI2RlZmluZSBEU0RfRElTQUJMRURfTUFTSyAgIDAKLSNkZWZpbmUgU0xOUV9ESVNBQkxFRF9NQVNLICAxCi0KLSNkZWZpbmUgRFNEX0RJU0FCTEVEICAgKDEgPDwgRFNEX0RJU0FCTEVEX01BU0spCi0jZGVmaW5lIFNMTlFfRElTQUJMRUQgICgxIDw8IFNMTlFfRElTQUJMRURfTUFTSykKLQotLyogTnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgU2xpbWJ1cyBwb3J0ICovCi1lbnVtIHsKLQlXQ0Q5MzRYX1JYMCA9IDAsCi0JV0NEOTM0WF9SWDEsCi0JV0NEOTM0WF9SWDIsCi0JV0NEOTM0WF9SWDMsCi0JV0NEOTM0WF9SWDQsCi0JV0NEOTM0WF9SWDUsCi0JV0NEOTM0WF9SWDYsCi0JV0NEOTM0WF9SWDcsCi0JV0NEOTM0WF9SWF9NQVgsCi19OwotCi1lbnVtIHsKLQlXQ0Q5MzRYX1RYMCA9IDAsCi0JV0NEOTM0WF9UWDEsCi0JV0NEOTM0WF9UWDIsCi0JV0NEOTM0WF9UWDMsCi0JV0NEOTM0WF9UWDQsCi0JV0NEOTM0WF9UWDUsCi0JV0NEOTM0WF9UWDYsCi0JV0NEOTM0WF9UWDcsCi0JV0NEOTM0WF9UWDgsCi0JV0NEOTM0WF9UWDksCi0JV0NEOTM0WF9UWDEwLAotCVdDRDkzNFhfVFgxMSwKLQlXQ0Q5MzRYX1RYMTIsCi0JV0NEOTM0WF9UWDEzLAotCVdDRDkzNFhfVFgxNCwKLQlXQ0Q5MzRYX1RYMTUsCi0JV0NEOTM0WF9UWF9NQVgsCi19OwotCi1lbnVtIHsKLQlJTlRFUlBfRUFSID0gMCwKLQlJTlRFUlBfSFBITCwKLQlJTlRFUlBfSFBIUiwKLQlJTlRFUlBfTE8xLAotCUlOVEVSUF9MTzIsCi0JSU5URVJQX0xPM19OQSwgLyogTE8zIG5vdCBhdmFsaWJsZSBpbiBUYXZpbCovCi0JSU5URVJQX0xPNF9OQSwKLQlJTlRFUlBfU1BLUjEsCi0JSU5URVJQX1NQS1IyLAotCUlOVEVSUF9NQVgsCi19OwotCi0vKgotICogU2VsZWN0cyBjb21wYW5kZXIgYW5kIHNtYXJ0IGJvb3N0IHNldHRpbmdzCi0gKiBmb3IgYSBnaXZlbiBzcGVha2VyIG1vZGUKLSAqLwotZW51bSB7Ci0JV0NEOTM0WF9TUEtSX01PREVfREVGQVVMVCwKLQlXQ0Q5MzRYX1NQS1JfTU9ERV8xLCAvKiBDT01QIEdhaW4gPSAxMmRCLCBTbWFydGJvb3N0IE1heCA9IDUuNVYgKi8KLX07Ci0KLS8qCi0gKiBSeCBwYXRoIGdhaW4gb2Zmc2V0cwotICovCi1lbnVtIHsKLQlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIsCi0JV0NEOTM0WF9SWF9HQUlOX09GRlNFVF8wX0RCLAotfTsKLQotLyoKLSAqIERhaSBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUKLSAqIGRhaSBzcGVjaWZpYyBpbmZvIGxpa2UgcmF0ZSwKLSAqIGNoYW5uZWwgbnVtYmVyIGV0Yy4KLSAqLwotc3RydWN0IHRhdmlsX2NvZGVjX2RhaV9kYXRhIHsKLQl1MzIgcmF0ZTsKLQl1MzIgKmNoX251bTsKLQl1MzIgY2hfYWN0OwotCXUzMiBjaF90b3Q7Ci19OwotCi0vKgotICogU3RydWN0dXJlIHVzZWQgdG8gdXBkYXRlIGNvZGVjCi0gKiByZWdpc3RlciBkZWZhdWx0cyBhZnRlciByZXNldAotICovCi1zdHJ1Y3QgdGF2aWxfcmVnX21hc2tfdmFsIHsKLQl1MTYgcmVnOwotCXU4IG1hc2s7Ci0JdTggdmFsOwotfTsKLQotZXh0ZXJuIHZvaWQgKnRhdmlsX2dldF9hZmVfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKLWV4dGVybiBpbnQgdGF2aWxfY2RjX21jbGtfZW5hYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgYm9vbCBlbmFibGUpOwotZXh0ZXJuIGludCB0YXZpbF9jZGNfbWNsa190eF9lbmFibGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSk7Ci1leHRlcm4gaW50IHRhdmlsX3NldF9zcGtyX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgbW9kZSk7Ci1leHRlcm4gaW50IHRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG9mZnNldCk7Ci1leHRlcm4gc3RydWN0IHdjZF9kc3BfY250bCAqdGF2aWxfZ2V0X3djZF9kc3BfY250bChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCB3Y2Q5MzR4X2dldF9taWNiX3ZvdXRfY3RsX3ZhbCh1MzIgbWljYl9tdik7Ci1leHRlcm4gaW50IHRhdmlsX21pY2JpYXNfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIGludCBtaWNiX251bSwKLQkJCQkgaW50IHJlcSwgYm9vbCBpc19kYXBtKTsKLWV4dGVybiBpbnQgdGF2aWxfbWJoY19taWNiX2FkanVzdF92b2x0YWdlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICBpbnQgcmVxX3ZvbHQsCi0JCQkJCSAgaW50IG1pY2JfbnVtKTsKLWV4dGVybiBzdHJ1Y3Qgd2NkOTM0eF9tYmhjICp0YXZpbF9zb2NfZ2V0X21iaGMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLWV4dGVybiBpbnQgdGF2aWxfY29kZWNfZW5hYmxlX2ludGVycF9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgaW50IGV2ZW50LCBpbnQgaW50cF9pZHgpOwotZXh0ZXJuIHN0cnVjdCB0YXZpbF9kc2RfY29uZmlnICp0YXZpbF9nZXRfZHNkX2NvbmZpZygKLQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotZXh0ZXJuIGludCB0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSgKLQkJCQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3QsCi0JCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi12Mi5jIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LWNvbW1vbi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE2NjU3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24tdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvd2NkOXh4eF9yZWdpc3RlcnMuaD4KLSNpbmNsdWRlICJ3Y2Q5eHh4LWNvbW1vbi12Mi5oIgotCi0jZGVmaW5lIFdDRF9VU0xFRVBfUkFOR0UgNTAKLSNkZWZpbmUgTUFYX0lNUEVEX1BBUkFNUyA2Ci0KLWVudW0gewotCURBQ19HQUlOXzBEQiA9IDAsCi0JREFDX0dBSU5fMFAyREIsCi0JREFDX0dBSU5fMFA0REIsCi0JREFDX0dBSU5fMFA2REIsCi0JREFDX0dBSU5fMFA4REIsCi0JREFDX0dBSU5fTTBQMkRCLAotCURBQ19HQUlOX00wUDREQiwKLQlEQUNfR0FJTl9NMFA2REIsCi19OwotCi1lbnVtIHsKLQlWUkVGX0ZJTFRfUl8wT0hNID0gMCwKLQlWUkVGX0ZJTFRfUl8yNUtPSE0sCi0JVlJFRl9GSUxUX1JfNTBLT0hNLAotCVZSRUZfRklMVF9SXzEwMEtPSE0sCi19OwotCi1lbnVtIHsKLQlERUxUQV9JXzBNQSwKLQlERUxUQV9JXzEwTUEsCi0JREVMVEFfSV8yME1BLAotCURFTFRBX0lfMzBNQSwKLQlERUxUQV9JXzQwTUEsCi0JREVMVEFfSV81ME1BLAotfTsKLQotc3RydWN0IHdjZF9pbXBlZF92YWwgewotCXUzMiBpbXBlZF92YWw7Ci0JdTggaW5kZXg7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9yZWdfbWFza192YWwgaW1wZWRfdGFibGVbXVtNQVhfSU1QRURfUEFSQU1TXSA9IHsKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjV9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjV9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmOX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjl9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9WT0xfQ1RMLCAweGZmLCAweGY5fSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9WT0xfTUlYX0NUTCwgMHhmZiwgMHhmOX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfUEFUSF9TRUMxLCAweDAxLCAweDB9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmF9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZhfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZhfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmJ9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZifSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmJ9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZifSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmN9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZjfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmN9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZjfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZkfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZkfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmV9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZlfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmV9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZlfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDF9LAotCX0sCi0JewotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmZ9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZmfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMV9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDB9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9DVEwsIDB4ZmYsIDB4ZmZ9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1ZPTF9NSVhfQ1RMLCAweGZmLCAweGZmfSwKLQkJe1dDRDlYWFhfQ0RDX1JYMl9SWF9QQVRIX1NFQzEsIDB4MDEsIDB4MDB9LAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdjZF9yZWdfbWFza192YWwgaW1wZWRfdGFibGVfdGF2aWxbXVtNQVhfSU1QRURfUEFSQU1TXSA9IHsKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmMn0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjJ9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmMn0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjJ9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjR9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmNH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZjR9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmN30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjd9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmOX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjl9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmOX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4Zjl9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmYX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmF9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmYX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmF9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmYn0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmJ9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmYn0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmJ9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmY30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmN9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmY30sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmN9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmZH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmZH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMH0sCi0JfSwKLQl7Ci0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX0NUTCwgMHhmZiwgMHhmZH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDFfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgxX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX0NUTCwgMHhmZiwgMHhmZH0sCi0JCXtXQ0Q5WFhYX0NEQ19SWDJfUlhfVk9MX01JWF9DVEwsIDB4ZmYsIDB4ZmR9LAotCQl7V0NEOVhYWF9DRENfUlgyX1JYX1BBVEhfU0VDMSwgMHgwMSwgMHgwMX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2NkX2ltcGVkX3ZhbCBpbXBlZF9pbmRleFtdID0gewotCXs0LCAwfSwKLQl7NSwgMX0sCi0JezYsIDJ9LAotCXs3LCAzfSwKLQl7OCwgNH0sCi0JezksIDV9LAotCXsxMCwgNn0sCi0JezExLCA3fSwKLQl7MTIsIDh9LAotCXsxMywgOX0sCi19OwotCi1zdGF0aWMgdm9pZCAoKmNsc2hfc3RhdGVfZnBbTlVNX0NMU0hfU1RBVEVTX1YyXSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKiwKLQkJCQkJICAgICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICosCi0JCQkJCSAgICAgIHU4IHJlcV9zdGF0ZSwgYm9vbCBlbiwgaW50IG1vZGUpOwotCi1zdGF0aWMgaW50IGdldF9pbXBlZGFuY2VfaW5kZXgoaW50IGltcGVkKQotewotCWludCBpID0gMDsKLQotCWlmIChpbXBlZCA8IGltcGVkX2luZGV4W2ldLmltcGVkX3ZhbCkgewotCQlwcl9kZWJ1ZygiJXMsIGRldGVjdGVkIGltcGVkYW5jZSBpcyBsZXNzIHRoYW4gNCBPaG1cbiIsCi0JCQkJX19mdW5jX18pOwotCQlpID0gMDsKLQkJZ290byByZXQ7Ci0JfQotCWlmIChpbXBlZCA+PSBpbXBlZF9pbmRleFtBUlJBWV9TSVpFKGltcGVkX2luZGV4KSAtIDFdLmltcGVkX3ZhbCkgewotCQlwcl9kZWJ1ZygiJXMsIGRldGVjdGVkIGltcGVkYW5jZSBpcyBncmVhdGVyIHRoYW4gMTIgT2htXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJaSA9IEFSUkFZX1NJWkUoaW1wZWRfaW5kZXgpIC0gMTsKLQkJZ290byByZXQ7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGltcGVkX2luZGV4KSAtIDE7IGkrKykgewotCQlpZiAoaW1wZWQgPj0gaW1wZWRfaW5kZXhbaV0uaW1wZWRfdmFsICYmCi0JCQlpbXBlZCA8IGltcGVkX2luZGV4W2kgKyAxXS5pbXBlZF92YWwpCi0JCQlicmVhazsKLQl9Ci1yZXQ6Ci0JcHJfZGVidWcoIiVzOiBzZWxlY3RlZCBpbXBlZGFuY2UgaW5kZXggPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBpbXBlZF9pbmRleFtpXS5pbmRleCk7Ci0JcmV0dXJuIGltcGVkX2luZGV4W2ldLmluZGV4OwotfQotCi0vKgotICogRnVuY3Rpb246IHdjZF9jbHNoX2ltcGVkX2NvbmZpZwotICogUGFyYW1zOiBjb2RlYywgaW1wZWQsIHJlc2V0Ci0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBIUEhMIGFuZCBIUEhSIGdhaW4gc2V0dGluZ3MKLSAqIGFjY29yZGluZyB0byB0aGUgaW1wZWRhbmNlIHZhbHVlLgotICovCi12b2lkIHdjZF9jbHNoX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBpbXBlZCwgYm9vbCByZXNldCkKLXsKLQlpbnQgaTsKLQlpbnQgaW5kZXggPSAwOwotCWludCB0YWJsZV9zaXplOwotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCB3Y2RfcmVnX21hc2tfdmFsCi0JCQkJKCppbXBlZF90YWJsZV9wdHIpW01BWF9JTVBFRF9QQVJBTVNdOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlpZiAoSVNfQ09ERUNfVFlQRSh3Y2Q5eHh4LCBXQ0Q5MzRYKSkgewotCQl0YWJsZV9zaXplID0gQVJSQVlfU0laRShpbXBlZF90YWJsZV90YXZpbCk7Ci0JCWltcGVkX3RhYmxlX3B0ciA9IGltcGVkX3RhYmxlX3RhdmlsOwotCX0gZWxzZSB7Ci0JCXRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGltcGVkX3RhYmxlKTsKLQkJaW1wZWRfdGFibGVfcHRyID0gaW1wZWRfdGFibGU7Ci0JfQotCi0JLyogcmVzZXQgPSAxLCB3aGljaCBtZWFucyByZXF1ZXN0IGlzIHRvIHJlc2V0IHRoZSByZWdpc3RlciB2YWx1ZXMgKi8KLQlpZiAocmVzZXQpIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9JTVBFRF9QQVJBTVM7IGkrKykKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJaW1wZWRfdGFibGVfcHRyW2luZGV4XVtpXS5yZWcsCi0JCQkJaW1wZWRfdGFibGVfcHRyW2luZGV4XVtpXS5tYXNrLCAwKTsKLQkJcmV0dXJuOwotCX0KLQlpbmRleCA9IGdldF9pbXBlZGFuY2VfaW5kZXgoaW1wZWQpOwotCWlmIChpbmRleCA+PSAoQVJSQVlfU0laRShpbXBlZF9pbmRleCkgLSAxKSkgewotCQlwcl9kZWJ1ZygiJXMsIGltcGVkYW5jZSBub3QgaW4gcmFuZ2UgPSAlZFxuIiwgX19mdW5jX18sIGltcGVkKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoaW5kZXggPj0gdGFibGVfc2l6ZSkgewotCQlwcl9kZWJ1ZygiJXMsIGltcGVkYW5jZSBpbmRleCBub3QgaW4gcmFuZ2UgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlpbmRleCk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9JTVBFRF9QQVJBTVM7IGkrKykKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQlpbXBlZF90YWJsZV9wdHJbaW5kZXhdW2ldLnJlZywKLQkJCQlpbXBlZF90YWJsZV9wdHJbaW5kZXhdW2ldLm1hc2ssCi0JCQkJaW1wZWRfdGFibGVfcHRyW2luZGV4XVtpXS52YWwpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfY2xzaF9pbXBlZF9jb25maWcpOwotCi1zdGF0aWMgYm9vbCBpc19uYXRpdmVfNDRfMV9hY3RpdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWJvb2wgbmF0aXZlX2FjdGl2ZSA9IGZhbHNlOwotCXU4IG5hdGl2ZV9jbGssIHJ4MV9yYXRlLCByeDJfcmF0ZTsKLQotCW5hdGl2ZV9jbGsgPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJIFdDRDlYWFhfQ0RDX0NMS19SU1RfQ1RSTF9NQ0xLX0NPTlRST0wpOwotCXJ4MV9yYXRlID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0NEQ19SWDFfUlhfUEFUSF9DVEwpOwotCXJ4Ml9yYXRlID0gc25kX3NvY19yZWFkKGNvZGVjLCBXQ0Q5WFhYX0NEQ19SWDJfUlhfUEFUSF9DVEwpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG5hdGl2ZV9jbGsgJXggcngxX3JhdGU9ICV4IHJ4Ml9yYXRlPSAleCIsCi0JCV9fZnVuY19fLCBuYXRpdmVfY2xrLCByeDFfcmF0ZSwgcngyX3JhdGUpOwotCi0JaWYgKChuYXRpdmVfY2xrICYgMHgyKSAmJgotCSAgICAoKHJ4MV9yYXRlICYgMHgwRikgPT0gMHg5IHx8IChyeDJfcmF0ZSAmIDB4MEYpID09IDB4OSkpCi0JCW5hdGl2ZV9hY3RpdmUgPSB0cnVlOwotCi0JcmV0dXJuIG5hdGl2ZV9hY3RpdmU7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICptb2RlX3RvX3N0cihpbnQgbW9kZSkKLXsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMU19IX05PUk1BTDoKLQkJcmV0dXJuICJDTFNfSF9OT1JNQUwiOwotCWNhc2UgQ0xTX0hfSElGSToKLQkJcmV0dXJuICJDTFNfSF9ISUZJIjsKLQljYXNlIENMU19IX0xPSElGSToKLQkJcmV0dXJuICJDTFNfSF9MT0hJRkkiOwotCWNhc2UgQ0xTX0hfTFA6Ci0JCXJldHVybiAiQ0xTX0hfTFAiOwotCWNhc2UgQ0xTX0hfVUxQOgotCQlyZXR1cm4gIkNMU19IX1VMUCI7Ci0JY2FzZSBDTFNfQUI6Ci0JCXJldHVybiAiQ0xTX0FCIjsKLQljYXNlIENMU19BQl9ISUZJOgotCQlyZXR1cm4gIkNMU19BQl9ISUZJIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIkNMU19IX0lOVkFMSUQiOwotCX07Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzdGF0ZV90b19zdHIodTggc3RhdGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKLXsKLQlpbnQgaTsKLQlpbnQgY250ID0gMDsKLQkvKgotCSAqIFRoaXMgYXJyYXkgb2Ygc3RyaW5ncyBzaG91bGQgbWF0Y2ggd2l0aCBlbnVtIHdjZF9jbHNoX3N0YXRlX2JpdC4KLQkgKi8KLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3RhdGVzW10gPSB7Ci0JCSJTVEFURV9FQVIiLAotCQkiU1RBVEVfSFBIX0wiLAotCQkiU1RBVEVfSFBIX1IiLAotCQkiU1RBVEVfTE8iLAotCX07Ci0KLQlpZiAoc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSURMRSkgewotCQlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIltTVEFURV9JRExFXSIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYnVmWzBdID0gJ1wwJzsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0ZXMpOyBpKyspIHsKLQkJaWYgKCEoc3RhdGUgJiAoMSA8PCBpKSkpCi0JCQljb250aW51ZTsKLQkJY250ID0gc25wcmludGYoYnVmLCBidWZsZW4gLSBjbnQgLSAxLCAiJXMlcyVzIiwgYnVmLAotCQkJICAgICAgIGJ1ZlswXSA9PSAnXDAnID8gIlsiIDogInwiLAotCQkJICAgICAgIHN0YXRlc1tpXSk7Ci0JfQotCWlmIChjbnQgPiAwKQotCQlzdHJsY2F0KGJ1ZiArIGNudCwgIl0iLCBidWZsZW4pOwotCi1kb25lOgotCWlmIChidWZbMF0gPT0gJ1wwJykKLQkJc25wcmludGYoYnVmLCBidWZsZW4sICJbU1RBVEVfVU5LTk9XTl0iKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXdjZF9lbmFibGVfY2xzaF9ibG9jayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCSAgICAgIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLCBib29sIGVuYWJsZSkKLXsKLQlpZiAoKGVuYWJsZSAmJiArK2Nsc2hfZC0+Y2xzaF91c2VycyA9PSAxKSB8fAotCSAgICAoIWVuYWJsZSAmJiAtLWNsc2hfZC0+Y2xzaF91c2VycyA9PSAwKSkKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0NSQywgMHgwMSwKLQkJCQkgICAgKHU4KSBlbmFibGUpOwotCWlmIChjbHNoX2QtPmNsc2hfdXNlcnMgPCAwKQotCQljbHNoX2QtPmNsc2hfdXNlcnMgPSAwOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbHNoX3VzZXJzICVkLCBlbmFibGUgJWQiLCBfX2Z1bmNfXywKLQkJY2xzaF9kLT5jbHNoX3VzZXJzLCBlbmFibGUpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgd2NkX2Nsc2hfZW5hYmxlX3N0YXR1cyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JcmV0dXJuIHNuZF9zb2NfcmVhZChjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0NSQykgJiAweDAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB3Y2RfY2xzaF9nZXRfaW50X21vZGUoc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCi0JCQkJCWludCBjbHNoX3N0YXRlKQotewotCWludCBtb2RlOwotCi0JaWYgKChjbHNoX3N0YXRlICE9IFdDRF9DTFNIX1NUQVRFX0VBUikgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfSFBITCkgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfSFBIUikgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfTE8pKQotCQltb2RlID0gQ0xTX05PTkU7Ci0JZWxzZQotCQltb2RlID0gY2xzaF9kLT5pbnRlcnBvbGF0b3JfbW9kZXNbZmZzKGNsc2hfc3RhdGUpXTsKLQotCXJldHVybiBtb2RlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd2NkX2Nsc2hfc2V0X2ludF9tb2RlKHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAotCQkJCQlpbnQgY2xzaF9zdGF0ZSwgaW50IG1vZGUpCi17Ci0JaWYgKChjbHNoX3N0YXRlICE9IFdDRF9DTFNIX1NUQVRFX0VBUikgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfSFBITCkgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfSFBIUikgJiYKLQkgICAgKGNsc2hfc3RhdGUgIT0gV0NEX0NMU0hfU1RBVEVfTE8pKQotCQlyZXR1cm47Ci0KLQljbHNoX2QtPmludGVycG9sYXRvcl9tb2Rlc1tmZnMoY2xzaF9zdGF0ZSldID0gbW9kZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdjZF9jbHNoX3NldF9idWNrX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIGludCBtb2RlKQotewotCWlmIChtb2RlID09IENMU19IX0hJRkkgfHwgbW9kZSA9PSBDTFNfSF9MT0hJRkkgfHwKLQkgICAgbW9kZSA9PSBDTFNfQUJfSElGSSB8fCBtb2RlID09IENMU19BQikKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUywKLQkJCQkgICAgMHgwOCwgMHgwOCk7IC8qIHNldCB0byBISUZJICovCi0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLAotCQkJCSAgICAweDA4LCAweDAwKTsgLyogc2V0IHRvIGRlZmF1bHQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICAgIGludCBtb2RlKQotewotCWlmIChtb2RlID09IENMU19IX0hJRkkgfHwgbW9kZSA9PSBDTFNfSF9MT0hJRkkgfHwKLQkgICAgbW9kZSA9PSBDTFNfQUJfSElGSSB8fCBtb2RlID09IENMU19BQikKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUywKLQkJCQkgICAgMHgwNCwgMHgwNCk7IC8qIHNldCB0byBISUZJICovCi0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLAotCQkJCSAgICAweDA0LCAweDAwKTsgLyogc2V0IHRvIERlZmF1bHQgKi8KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdjZF9jbHNoX2dtM19ib29zdF9kaXNhYmxlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJICAgICAgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWlmICghSVNfQ09ERUNfVFlQRSh3Y2Q5eHh4LCBXQ0Q5MzRYKSkKLQkJcmV0dXJuOwotCi0JaWYgKG1vZGUgPT0gQ0xTX0hfSElGSSB8fCBtb2RlID09IENMU19IX0xPSElGSSB8fAotCSAgICBtb2RlID09IENMU19BQl9ISUZJIHx8IG1vZGUgPT0gQ0xTX0FCKSB7Ci0JCWlmIChUQVZJTF9JU18xXzAod2NkOXh4eCkpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9DTlBfV0dfQ1RMLAotCQkJCQkgICAgMHg4MCwgMHgwKTsgLyogZGlzYWJsZSBHTTMgQm9vc3QgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX1ZORUdfQ1RSTF80LAotCQkJCSAgICAweEYwLCAweDgwKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9DTlBfV0dfQ1RMLAotCQkJCSAgICAweDgwLCAweDgwKTsgLyogc2V0IHRvIERlZmF1bHQgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX1ZORUdfQ1RSTF80LAotCQkJCSAgICAweEYwLCAweDcwKTsKLQl9Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIHdjZF9jbHNoX2ZvcmNlX2lxX2N0bChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0JaWYgKCFJU19DT0RFQ19UWVBFKHdjZDl4eHgsIFdDRDkzNFgpKQotCQlyZXR1cm47Ci0KLQlpZiAobW9kZSA9PSBDTFNfSF9MT0hJRkkgfHwgbW9kZSA9PSBDTFNfQUIpIHsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9IUEhfTkVXX0lOVF9QQV9NSVNDMiwKLQkJCQkgICAgMHgyMCwgMHgyMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfUlhfQklBU19IUEhfTE9XUE9XRVIsCi0JCQkJICAgIDB4RjAsIDB4QzApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9QQV9DVEwxLAotCQkJCSAgICAweDBFLCAweDAyKTsKLQl9IGVsc2UgewotCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfSFBIX05FV19JTlRfUEFfTUlTQzIsCi0JCQkJICAgIDB4MjAsIDB4MCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfUlhfQklBU19IUEhfTE9XUE9XRVIsCi0JCQkJICAgIDB4RjAsIDB4ODApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9QQV9DVEwxLAotCQkJCSAgICAweDBFLCAweDA2KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbHNoX2J1Y2tfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkgICAgICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCi0JCQkgICAgICAgaW50IG1vZGUsCi0JCQkgICAgICAgYm9vbCBlbmFibGUpCi17Ci0JLyogZW5hYmxlL2Rpc2FibGUgYnVjayAqLwotCWlmICgoZW5hYmxlICYmICgrK2Nsc2hfZC0+YnVja191c2VycyA9PSAxKSkgfHwKLQkgICAoIWVuYWJsZSAmJiAoLS1jbHNoX2QtPmJ1Y2tfdXNlcnMgPT0gMCkpKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTLAotCQkJCSAgICAoMSA8PCA3KSwgKGVuYWJsZSA8PCA3KSk7Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGJ1Y2tfdXNlcnMgJWQsIGVuYWJsZSAlZCwgbW9kZTogJXMiLAotCQlfX2Z1bmNfXywgY2xzaF9kLT5idWNrX3VzZXJzLCBlbmFibGUsIG1vZGVfdG9fc3RyKG1vZGUpKTsKLQkvKgotCSAqIDUwMHVzIHNsZWVwIGlzIHJlcXVpcmVkIGFmdGVyIGJ1Y2sgZW5hYmxlL2Rpc2FibGUKLQkgKiBhcyBwZXIgSFcgcmVxdWlyZW1lbnQKLQkgKi8KLQl1c2xlZXBfcmFuZ2UoNTAwLCA1MDAgKyBXQ0RfVVNMRUVQX1JBTkdFKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2Nsc2hfZmx5YmFja19jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAotCQkJCSAgaW50IG1vZGUsCi0JCQkJICBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXN0cnVjdCB3Y2Q5eHh4X3JlZ192YWwgYnVsa19yZWdbMl07Ci0JdTggdm5lZ1tdID0gezB4MDAsIDB4NDB9OwotCi0JLyogZW5hYmxlL2Rpc2FibGUgZmx5YmFjayAqLwotCWlmICgoZW5hYmxlICYmICgrK2Nsc2hfZC0+Zmx5YmFja191c2VycyA9PSAxKSkgfHwKLQkgICAoIWVuYWJsZSAmJiAoLS1jbHNoX2QtPmZseWJhY2tfdXNlcnMgPT0gMCkpKSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVMsCi0JCQkJICAgICgxIDw8IDYpLCAoZW5hYmxlIDw8IDYpKTsKLQkJLyogMTAwdXNlYyBkZWxheSBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCi0JCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7Ci0JCWlmIChlbmFibGUgJiYgKFRBU0hBX0lTXzFfMSh3Y2Q5eHh4KSkpIHsKLQkJCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIENMU19IX0hJRkkpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX0VOLAotCQkJCQkgICAgMHg2MCwgMHg0MCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfRU4sCi0JCQkJCSAgICAweDEwLCAweDEwKTsKLQkJCXZuZWdbMF0gPSBzbmRfc29jX3JlYWQoY29kZWMsCi0JCQkJCSAgICAgICBXQ0Q5WFhYX0FfQU5BX1JYX1NVUFBMSUVTKTsKLQkJCXZuZWdbMF0gJj0gfigweDQwKTsKLQkJCXZuZWdbMV0gPSB2bmVnWzBdIHwgMHg0MDsKLQkJCWJ1bGtfcmVnWzBdLnJlZyA9IFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVM7Ci0JCQlidWxrX3JlZ1swXS5idWYgPSAmdm5lZ1swXTsKLQkJCWJ1bGtfcmVnWzBdLmJ5dGVzID0gMTsKLQkJCWJ1bGtfcmVnWzFdLnJlZyA9IFdDRDlYWFhfQV9BTkFfUlhfU1VQUExJRVM7Ci0JCQlidWxrX3JlZ1sxXS5idWYgPSAmdm5lZ1sxXTsKLQkJCWJ1bGtfcmVnWzFdLmJ5dGVzID0gMTsKLQkJCS8qIDUwMHVzZWMgZGVsYXkgaXMgbmVlZGVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLwotCQkJdXNsZWVwX3JhbmdlKDUwMCwgNTEwKTsKLQkJCXdjZDl4eHhfc2xpbV9idWxrX3dyaXRlKHdjZDl4eHgsIGJ1bGtfcmVnLCAyLAotCQkJCQkJZmFsc2UpOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX0VOLAotCQkJCQkgICAgMHgxMCwgMHgwMCk7Ci0JCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKLQkJfQotCi0JfQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBmbHliYWNrX3VzZXJzICVkLCBlbmFibGUgJWQsIG1vZGU6ICVzIiwKLQkJX19mdW5jX18sIGNsc2hfZC0+Zmx5YmFja191c2VycywgZW5hYmxlLCBtb2RlX3RvX3N0cihtb2RlKSk7Ci0JLyoKLQkgKiA1MDB1cyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBmbHliYWNrIGVuYWJsZS9kaXNhYmxlCi0JICogYXMgcGVyIEhXIHJlcXVpcmVtZW50Ci0JICovCi0JdXNsZWVwX3JhbmdlKDUwMCwgNTAwICsgV0NEX1VTTEVFUF9SQU5HRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbHNoX3NldF9nYWluX3BhdGgoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGludCBtb2RlKQotewotCXU4IHZhbCA9IDA7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWlmICghVEFTSEFfSVNfMl8wKHdjZDl4eHgpKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMU19IX05PUk1BTDoKLQljYXNlIENMU19BQjoKLQkJdmFsID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBDTFNfSF9ISUZJOgotCQl2YWwgPSAweDAyOwotCQlicmVhazsKLQljYXNlIENMU19IX0xQOgotCQl2YWwgPSAweDAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9MX0VOLCAweEMwLCAodmFsIDw8IDYpKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0hQSF9SX0VOLCAweEMwLCAodmFsIDw8IDYpKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkgIGludCBtb2RlKQotewotCXU4IHZhbCA9IDA7Ci0JdTggZ2FpbiA9IDA7Ci0JdTggcmVzX3ZhbCA9IFZSRUZfRklMVF9SXzBPSE07Ci0JdTggaXBlYWsgPSBERUxUQV9JXzUwTUE7Ci0KLQlzdHJ1Y3Qgd2NkOXh4eCAqd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBDTFNfSF9OT1JNQUw6Ci0JCXJlc192YWwgPSBWUkVGX0ZJTFRfUl81MEtPSE07Ci0JCXZhbCA9IDB4MDA7Ci0JCWdhaW4gPSBEQUNfR0FJTl8wREI7Ci0JCWlwZWFrID0gREVMVEFfSV81ME1BOwotCQlicmVhazsKLQljYXNlIENMU19BQjoKLQkJdmFsID0gMHgwMDsKLQkJZ2FpbiA9IERBQ19HQUlOXzBEQjsKLQkJaXBlYWsgPSBERUxUQV9JXzUwTUE7Ci0JCWJyZWFrOwotCWNhc2UgQ0xTX0FCX0hJRkk6Ci0JCXZhbCA9IDB4MDg7Ci0JCWJyZWFrOwotCWNhc2UgQ0xTX0hfSElGSToKLQkJdmFsID0gMHgwODsKLQkJZ2FpbiA9IERBQ19HQUlOX00wUDJEQjsKLQkJaXBlYWsgPSBERUxUQV9JXzUwTUE7Ci0JCWJyZWFrOwotCWNhc2UgQ0xTX0hfTE9ISUZJOgotCQl2YWwgPSAweDAwOwotCQlpZiAoKElTX0NPREVDX1RZUEUod2NkOXh4eCwgV0NEOTMzNSkpIHx8Ci0JCSAgICAoSVNfQ09ERUNfVFlQRSh3Y2Q5eHh4LCBXQ0Q5MzI2KSkpIHsKLQkJCXZhbCA9IDB4MDg7Ci0JCQlnYWluID0gREFDX0dBSU5fTTBQMkRCOwotCQkJaXBlYWsgPSBERUxUQV9JXzUwTUE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDTFNfSF9VTFA6Ci0JCXZhbCA9IDB4MEM7Ci0JCWJyZWFrOwotCWNhc2UgQ0xTX0hfTFA6Ci0JCXZhbCA9IDB4MDQ7Ci0JCWlwZWFrID0gREVMVEFfSV8zME1BOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfTsKLQotCS8qCi0JICogRm9yIHRhdmlsIHNldCBtb2RlIHRvIExvd2VyX3Bvd2VyIGZvcgotCSAqIENMU19IX0xPSElGSSBhbmQgQ0xTX0FCCi0JICovCi0JaWYgKChJU19DT0RFQ19UWVBFKHdjZDl4eHgsIFdDRDkzNFgpKSAmJgotCSAgICAobW9kZSA9PSBDTFNfSF9MT0hJRkkgfHwgbW9kZSA9PSBDTFNfQUIpKQotCQl2YWwgPSAweDA0OwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9IUEgsIDB4MEMsIHZhbCk7Ci0JaWYgKFRBU0hBX0lTXzJfMCh3Y2Q5eHh4KSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0NMQVNTSF9DVFJMX1ZDTF8yLAotCQkJCSAgICAweDMwLCAocmVzX3ZhbCA8PCA0KSk7Ci0JCWlmIChtb2RlICE9IENMU19IX0xQKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9IUEhfUkVGQlVGRl9VSFFBX0NUTCwKLQkJCQkJICAgIDB4MDcsIGdhaW4pOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0NMQVNTSF9DVFJMX0NDTF8xLAotCQkJCSAgICAweEYwLCAoaXBlYWsgPDwgNCkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2NkX2Nsc2hfc2V0X2ZseWJhY2tfdm5lZ19jdGwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYtPnBhcmVudCk7Ci0KLQlpZiAoIVRBU0hBX0lTXzJfMCh3Y2Q5eHh4KSkKLQkJcmV0dXJuOwotCi0JaWYgKGVuYWJsZSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsIDB4RTAsCi0JCQkJICAgIDB4MDApOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR0RBQ19DVFJMXzIsCi0JCQkJICAgIDB4RTAsICgweDA3IDw8IDUpKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX0ZMWUJBQ0tfVk5FR19DVFJMXzEsIDB4RTAsCi0JCQkJICAgICgweDA3IDw8IDUpKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9GTFlCQUNLX1ZORUdEQUNfQ1RSTF8yLAotCQkJCSAgICAweEUwLCAoMHgwMiA8PCA1KSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQotCWlmICghVEFTSEFfSVNfMl8wKHdjZDl4eHgpKQotCQlyZXR1cm47Ci0KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX1JYX0JJQVNfRkxZQl9CVUZGLCAweDBGLCAweDBBKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXQ0Q5WFhYX1JYX0JJQVNfRkxZQl9CVUZGLCAweEYwLCAweEEwKTsKLQkvKiBTbGVlcCBuZWVkZWQgdG8gYXZvaWQgY2xpY2sgYW5kIHBvcCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgICAgaW50IG1vZGUpCi17Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0FOQV9SWF9TVVBQTElFUywKLQkJCSAgICAweDAyLCAweDAwKTsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2Nsc2hfc3RhdGVfbG8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJICAgICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCi0JCQkgICAgICB1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKLXsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCi0JCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKLQotCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBMTyBjYW5ub3QgYmUgaW4gdGhpcyBtb2RlOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBtb2RlKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpc19lbmFibGUpIHsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIG1vZGUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja192bmVnX2N0bChjb2RlYywgdHJ1ZSk7Ci0JCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIG1vZGUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCX0gZWxzZSB7Ci0JCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JCXdjZF9jbHNoX3NldF9mbHliYWNrX3ZuZWdfY3RsKGNvZGVjLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2NkX2Nsc2hfc3RhdGVfaHBoX2VhcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCi0JCQkJICAgdTggcmVxX3N0YXRlLCBib29sIGlzX2VuYWJsZSwgaW50IG1vZGUpCi17Ci0JaW50IGhwaF9tb2RlID0gMDsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKLQkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwotCi0JaWYgKGlzX2VuYWJsZSkgewotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0VBUikgewotCQkJLyogSWYgSFBIIGlzIHJ1bm5pbmcgaW4gQ0xTLUFCIHdoZW4KLQkJCSAqIEVBUiBjb21lcywgbGV0IGl0IGNvbnRpbnVlIHRvIHJ1bgotCQkJICogaW4gQ2xhc3MtQUIsIG5vIG5lZWQgdG8gZW5hYmxlIENsYXNzLUgKLQkJCSAqIGZvciBFQVIuCi0JCQkgKi8KLQkJCWlmIChjbHNoX2QtPnN0YXRlICYgV0NEX0NMU0hfU1RBVEVfSFBITCkKLQkJCQlocGhfbW9kZSA9IHdjZF9jbHNoX2dldF9pbnRfbW9kZShjbHNoX2QsCi0JCQkJCQlXQ0RfQ0xTSF9TVEFURV9IUEhMKTsKLQkJCWVsc2UgaWYgKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhSKQotCQkJCWhwaF9tb2RlID0gd2NkX2Nsc2hfZ2V0X2ludF9tb2RlKGNsc2hfZCwKLQkJCQkJCVdDRF9DTFNIX1NUQVRFX0hQSFIpOwotCQkJZWxzZQotCQkJCXJldHVybjsKLQkJCWlmIChocGhfbW9kZSAhPSBDTFNfQUIgJiYgaHBoX21vZGUgIT0gQ0xTX0FCX0hJRkkKLQkJCSAgICAmJiAhaXNfbmF0aXZlXzQ0XzFfYWN0aXZlKGNvZGVjKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAotCQkJCQkJMHg0MCwgMHg0MCk7Ci0JCX0KLQotCQlpZiAoaXNfbmF0aXZlXzQ0XzFfYWN0aXZlKGNvZGVjKSkgewotCQkJc25kX3NvY193cml0ZShjb2RlYywgV0NEOVhYWF9DRENfQ0xTSF9IUEhfVl9QQSwgMHgzOSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0NEQ19SWDBfUlhfUEFUSF9TRUMwLAotCQkJCQkweDAzLCAweDAwKTsKLQkJCWlmICgocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpIHx8Ci0JCQkgICAgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhSKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAotCQkJCQkJMHg0MCwgMHgwMCk7Ci0JCX0KLQotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHg0MCk7Ci0JCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCSAgICBXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCi0JCQkJCSAgICAweDQwLCAweDQwKTsKLQkJaWYgKChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBITCkgfHwKLQkJICAgIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikpIHsKLQkJCXdjZF9jbHNoX3NldF9nYWluX3BhdGgoY29kZWMsIG1vZGUpOwotCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBtb2RlKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfRUFSKSB7Ci0JCQkvKgotCQkJICogSWYgRUFSIGdvZXMgYXdheSwgZGlzYWJsZSBFQVIgQ2hhbm5lbCBFbmFibGUKLQkJCSAqIGlmIEhQSCBydW5uaW5nIGluIENsYXNzLUggb3RoZXJ3aXNlCi0JCQkgKiBhbmQgaWYgSFBIIHJlcXVlc3RlZCBtb2RlIGlzIENMU19BQiB0aGVuCi0JCQkgKiBubyBuZWVkIHRvIGRpc2FibGUgRUFSIGNoYW5uZWwgZW5hYmxlIGJpdC4KLQkJCSAqLwotCQkJaWYgKHdjZF9jbHNoX2VuYWJsZV9zdGF0dXMoY29kZWMpKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCi0JCQkJCQkweDQwLCAweDAwKTsKLQkJfQotCi0JCWlmIChpc19uYXRpdmVfNDRfMV9hY3RpdmUoY29kZWMpKSB7Ci0JCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXQ0Q5WFhYX0NEQ19DTFNIX0hQSF9WX1BBLCAweDFDKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDlYWFhfQ0RDX1JYMF9SWF9QQVRIX1NFQzAsCi0JCQkJCTB4MDMsIDB4MDEpOwotCQkJaWYgKCgoY2xzaF9kLT5zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkKLQkJCQkgICE9IFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkgJiYKLQkJCSAgICAoKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKSB8fAotCQkJICAgICAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpKSkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDBfUlhfUEFUSF9DRkcwLAotCQkJCQkJMHg0MCwgMHg0MCk7Ci0JCX0KLQotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCi0JCQkJCTB4NDAsIDB4MDApOwotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCi0JCQkJCTB4NDAsIDB4MDApOwotCQlpZiAoKHJlcV9zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSF9TVCkgJiYKLQkJICAgICF3Y2RfY2xzaF9lbmFibGVfc3RhdHVzKGNvZGVjKSkgewotCQkJLyogSWYgQ2xhc3MtSCBpcyBub3QgZW5hYmxlZCB3aGVuIEhQSCBpcyB0dXJuZWQKLQkJCSAqIG9mZiwgZW5hYmxlIGl0IGFzIEVBUiBpcyBpbiBwcm9ncmVzcwotCQkJICovCi0JCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCi0JCQkJCTB4NDAsIDB4NDApOwotCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2Vhcl9sbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICBzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKLQkJCQkgIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQotewotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKLQkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwotCi0JaWYgKGlzX2VuYWJsZSkgewotCQkvKiBMTyBwb3dlcnVwIGlzIHRha2VuIGNhcmUgaW4gUEEgc2VxdWVuY2UuCi0JCSAqIE5vIG5lZWQgdG8gY2hhbmdlIHRvIGNsYXNzIEFCIGhlcmUuCi0JCSAqLwotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0VBUikgewotCQkJLyogRUFSIHBvd2VydXAuKi8KLQkJCWlmICghd2NkX2Nsc2hfZW5hYmxlX3N0YXR1cyhjb2RlYykpIHsKLQkJCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7Ci0JCQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCQl9Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMF9SWF9QQVRIX0NGRzAsCi0JCQkJCTB4NDAsIDB4NDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9FQVIpIHsKLQkJCS8qIEVBUiBwb3dlcmRvd24uKi8KLQkJCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7Ci0JCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDlYWFhfQV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJMHg0MCwgMHgwMCk7Ci0JCX0KLQkJLyogTE8gcG93ZXJkb3duIGlzIHRha2VuIGNhcmUgaW4gUEEgc2VxdWVuY2UuCi0JCSAqIE5vIG5lZWQgdG8gY2hhbmdlIHRvIGNsYXNzIEggaGVyZS4KLQkJICovCi0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zdGF0ZV9ocGhfbG8oc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoX2QsCi0JCQkJICB1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKLXsKLQlpbnQgaHBoX21vZGUgPSAwOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVzLCAlc1xuIiwgX19mdW5jX18sIG1vZGVfdG9fc3RyKG1vZGUpLAotCQlpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLQlpZiAoaXNfZW5hYmxlKSB7Ci0JCS8qCi0JCSAqIElmIHJlcXVlc3RlZCBzdGF0ZSBpcyBMTywgcHV0IHJlZ3VsYXRvcgotCQkgKiBpbiBjbGFzcy1BQiBvciBpZiByZXF1ZXN0ZWQgc3RhdGUgaXMgSFBILAotCQkgKiB3aGljaCBtZWFucyBMTyBpcyBhbHJlYWR5IGVuYWJsZWQsIGtlZXAKLQkJICogdGhlIHJlZ3VsYXRvciBjb25maWcgdGhlIHNhbWUgYXQgY2xhc3MtQUIKLQkJICogYW5kIGp1c3Qgc2V0IHRoZSBwb3dlciBtb2RlcyBmb3IgZmx5YmFjawotCQkgKiBhbmQgYnVjay4KLQkJICovCi0JCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfTE8pCi0JCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywgQ0xTX0FCKTsKLQkJZWxzZSB7Ci0JCQlpZiAoIXdjZF9jbHNoX2VuYWJsZV9zdGF0dXMoY29kZWMpKSB7Ci0JCQkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIHRydWUpOwotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCQlXQ0Q5WFhYX0FfQ0RDX0NMU0hfSzFfTVNCLAotCQkJCQkJMHgwRiwgMHgwMCk7Ci0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJCVdDRDlYWFhfQV9DRENfQ0xTSF9LMV9MU0IsCi0JCQkJCQkweEZGLCAweEMwKTsKLQkJCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKLQkJCQl3Y2RfY2xzaF9zZXRfZmx5YmFja192bmVnX2N0bChjb2RlYywgZmFsc2UpOwotCQkJCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIG1vZGUpOwotCQkJCXdjZF9jbHNoX3NldF9ocGhfbW9kZShjb2RlYywgbW9kZSk7Ci0JCQkJd2NkX2Nsc2hfc2V0X2dhaW5fcGF0aChjb2RlYywgbW9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOmNsc2ggaXMgYWxyZWFkeSBlbmFibGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0JCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSEwpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAotCQkJCQkweDQwLCAweDQwKTsKLQkJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMl9SWF9QQVRIX0NGRzAsCi0JCQkJCTB4NDAsIDB4NDApOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBITCkgfHwKLQkJICAgIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBIUikpIHsKLQkJCWlmIChyZXFfc3RhdGUgPT0gV0NEX0NMU0hfU1RBVEVfSFBITCkKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpCi0JCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDlYWFhfQV9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJICAgIDB4NDAsIDB4MDApOwotCQkJLyoKLQkJCSAqIElmIEhQSCBpcyBwb3dlcmluZyBkb3duIGZpcnN0LCB0aGVuIGRpc2FibGUgY2xzaCwKLQkJCSAqIHNldCB0aGUgYnVjay9mbHliYWNrIG1vZGUgdG8gZGVmYXVsdCBhbmQga2VlcCB0aGUKLQkJCSAqIHJlZ3VsYXRvciBhdCBDbGFzcy1BQgotCQkJICovCi0JCQlpZiAoKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhfU1QpCi0JCQkJIT0gV0NEX0NMU0hfU1RBVEVfSFBIX1NUKSB7Ci0JCQkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIGZhbHNlKTsKLQkJCQl3Y2RfY2xzaF9zZXRfZmx5YmFja192bmVnX2N0bChjb2RlYywgdHJ1ZSk7Ci0JCQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJCQl3Y2RfY2xzaF9zZXRfYnVja19tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTE8gcG93ZXJkb3duLgotCQkJICogSWYgSFBIIG1vZGUgYWxzbyBpcyBDTFMtQUIsIG5vIG5lZWQKLQkJCSAqIHRvIHR1cm4tb24gY2xhc3MtSCwgb3RoZXJ3aXNlIGVuYWJsZQotCQkJICogQ2xhc3MtSCBjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlpZiAoY2xzaF9kLT5zdGF0ZSAmIFdDRF9DTFNIX1NUQVRFX0hQSEwpCi0JCQkJaHBoX21vZGUgPSB3Y2RfY2xzaF9nZXRfaW50X21vZGUoY2xzaF9kLAotCQkJCQkJV0NEX0NMU0hfU1RBVEVfSFBITCk7Ci0JCQllbHNlIGlmIChjbHNoX2QtPnN0YXRlICYgV0NEX0NMU0hfU1RBVEVfSFBIUikKLQkJCQlocGhfbW9kZSA9IHdjZF9jbHNoX2dldF9pbnRfbW9kZShjbHNoX2QsCi0JCQkJCQlXQ0RfQ0xTSF9TVEFURV9IUEhSKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm47Ci0JCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogaHBoX21vZGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCQkJaHBoX21vZGUpOwotCi0JCQlpZiAoKGhwaF9tb2RlID09IENMU19BQikgfHwKLQkJCSAgIChocGhfbW9kZSA9PSBDTFNfQUJfSElGSSkgfHwKLQkJCSAgIChocGhfbW9kZSA9PSBDTFNfTk9ORSkpCi0JCQkJZ290byBlbmQ7Ci0KLQkJCS8qCi0JCQkgKiBJZiBDbGFzcy1IIGlzIGFscmVhZHkgZW5hYmxlZCAoSFBIIE9OIGFuZCB0aGVuCi0JCQkgKiBMTyBPTiksIG5vIG5lZWQgdG8gdHVybiBvbiBhZ2FpbiwganVzdCBzZXQgdGhlCi0JCQkgKiByZWd1bGF0b3IgbW9kZS4KLQkJCSAqLwotCQkJaWYgKHdjZF9jbHNoX2VuYWJsZV9zdGF0dXMoY29kZWMpKSB7Ci0JCQkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsCi0JCQkJCQkJCSBocGhfbW9kZSk7Ci0JCQkJZ290byBlbmQ7Ci0JCQl9IGVsc2UgewotCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBjbHNoIGlzIG5vdCBlbmFibGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQl9Ci0KLQkJCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCB0cnVlKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCVdDRDlYWFhfQV9DRENfQ0xTSF9LMV9NU0IsCi0JCQkJCTB4MEYsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJV0NEOVhYWF9BX0NEQ19DTFNIX0sxX0xTQiwKLQkJCQkJMHhGRiwgMHhDMCk7Ci0JCQl3Y2RfY2xzaF9zZXRfYnVja19yZWd1bGF0b3JfbW9kZShjb2RlYywKLQkJCQkJCQkgaHBoX21vZGUpOwotCQkJaWYgKGNsc2hfZC0+c3RhdGUgJiBXQ0RfQ0xTSF9TVEFURV9IUEhMKQotCQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJCQlXQ0Q5WFhYX0FfQ0RDX1JYMV9SWF9QQVRIX0NGRzAsCi0JCQkJCQkweDQwLCAweDQwKTsKLQkJCWlmIChjbHNoX2QtPnN0YXRlICYgV0NEX0NMU0hfU1RBVEVfSFBIUikKLQkJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkJV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAotCQkJCQkJMHg0MCwgMHg0MCk7Ci0JCQl3Y2RfY2xzaF9zZXRfaHBoX21vZGUoY29kZWMsIGhwaF9tb2RlKTsKLQkJfQotCX0KLWVuZDoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHdjZF9jbHNoX3N0YXRlX2hwaF9zdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICBzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKLQkJCQkgIHU4IHJlcV9zdGF0ZSwgYm9vbCBpc19lbmFibGUsIGludCBtb2RlKQotewotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBtb2RlOiAlcywgJXNcbiIsIF9fZnVuY19fLCBtb2RlX3RvX3N0cihtb2RlKSwKLQkJaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwotCi0JaWYgKG1vZGUgPT0gQ0xTX0FCIHx8IG1vZGUgPT0gQ0xTX0FCX0hJRkkpCi0JCXJldHVybjsKLQotCWlmIChpc19lbmFibGUpIHsKLQkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDlYWFhfQV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJICAgIDB4NDAsIDB4NDApOwotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHg0MCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHJlcV9zdGF0ZSA9PSBXQ0RfQ0xTSF9TVEFURV9IUEhMKQotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDlYWFhfQV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJICAgIDB4NDAsIDB4MDApOwotCQlpZiAocmVxX3N0YXRlID09IFdDRF9DTFNIX1NUQVRFX0hQSFIpCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zdGF0ZV9ocGhfcihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAotCQkJCSB1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKLXsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCi0JCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKLQotCWlmIChtb2RlID09IENMU19IX05PUk1BTCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm9ybWFsIG1vZGUgbm90IGFwcGxpY2FibGUgZm9yIGhwaF9yXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2VuYWJsZSkgewotCQlpZiAobW9kZSAhPSBDTFNfQUIgJiYgbW9kZSAhPSBDTFNfQUJfSElGSSkgewotCQkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIHRydWUpOwotCQkJLyoKLQkJCSAqIFRoZXNlIEsxIHZhbHVlcyBkZXBlbmQgb24gdGhlIEhlYWRwaG9uZSBJbXBlZGFuY2UKLQkJCSAqIEZvciBub3cgaXQgaXMgYXNzdW1lZCB0byBiZSAxNiBvaG0KLQkJCSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0sxX01TQiwKLQkJCQkJICAgIDB4MEYsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0sxX0xTQiwKLQkJCQkJICAgIDB4RkYsIDB4QzApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDlYWFhfQV9DRENfUlgyX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJICAgIDB4NDAsIDB4NDApOwotCQl9Ci0JCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCXdjZF9jbHNoX2dtM19ib29zdF9kaXNhYmxlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZm9yY2VfaXFfY3RsKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCB0cnVlKTsKLQkJd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2dhaW5fcGF0aChjb2RlYywgbW9kZSk7Ci0JfSBlbHNlIHsKLQkJd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCi0JCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDJfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgZmFsc2UpOwotCQl9Ci0JCS8qIGJ1Y2sgYW5kIGZseWJhY2sgc2V0IHRvIGRlZmF1bHQgbW9kZSBhbmQgZGlzYWJsZSAqLwotCQl3Y2RfY2xzaF9idWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgQ0xTX0hfTk9STUFMLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBDTFNfSF9OT1JNQUwsIGZhbHNlKTsKLQkJd2NkX2Nsc2hfZm9yY2VfaXFfY3RsKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCQl3Y2RfY2xzaF9nbTNfYm9vc3RfZGlzYWJsZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zdGF0ZV9ocGhfbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJIHN0cnVjdCB3Y2RfY2xzaF9jZGNfZGF0YSAqY2xzaF9kLAotCQkJCSB1OCByZXFfc3RhdGUsIGJvb2wgaXNfZW5hYmxlLCBpbnQgbW9kZSkKLXsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbW9kZTogJXMsICVzXG4iLCBfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSksCi0JCWlzX2VuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKLQotCWlmIChtb2RlID09IENMU19IX05PUk1BTCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogTm9ybWFsIG1vZGUgbm90IGFwcGxpY2FibGUgZm9yIGhwaF9sXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2VuYWJsZSkgewotCQlpZiAobW9kZSAhPSBDTFNfQUIgJiYgbW9kZSAhPSBDTFNfQUJfSElGSSkgewotCQkJd2NkX2VuYWJsZV9jbHNoX2Jsb2NrKGNvZGVjLCBjbHNoX2QsIHRydWUpOwotCQkJLyoKLQkJCSAqIFRoZXNlIEsxIHZhbHVlcyBkZXBlbmQgb24gdGhlIEhlYWRwaG9uZSBJbXBlZGFuY2UKLQkJCSAqIEZvciBub3cgaXQgaXMgYXNzdW1lZCB0byBiZSAxNiBvaG0KLQkJCSAqLwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0sxX01TQiwKLQkJCQkJICAgIDB4MEYsIDB4MDApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV0NEOVhYWF9BX0NEQ19DTFNIX0sxX0xTQiwKLQkJCQkJICAgIDB4RkYsIDB4QzApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywKLQkJCQkJICAgIFdDRDlYWFhfQV9DRENfUlgxX1JYX1BBVEhfQ0ZHMCwKLQkJCQkJICAgIDB4NDAsIDB4NDApOwotCQl9Ci0JCXdjZF9jbHNoX3NldF9idWNrX3JlZ3VsYXRvcl9tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCXdjZF9jbHNoX2dtM19ib29zdF9kaXNhYmxlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZm9yY2VfaXFfY3RsKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgbW9kZSk7Ci0JCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCB0cnVlKTsKLQkJd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfc2V0X2dhaW5fcGF0aChjb2RlYywgbW9kZSk7Ci0JfSBlbHNlIHsKLQkJd2NkX2Nsc2hfc2V0X2hwaF9tb2RlKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCi0JCWlmIChtb2RlICE9IENMU19BQiAmJiBtb2RlICE9IENMU19BQl9ISUZJKSB7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLAotCQkJCQkgICAgV0NEOVhYWF9BX0NEQ19SWDFfUlhfUEFUSF9DRkcwLAotCQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgZmFsc2UpOwotCQl9Ci0JCS8qIHNldCBidWNrIGFuZCBmbHliYWNrIHRvIERlZmF1bHQgTW9kZSAqLwotCQl3Y2RfY2xzaF9idWNrX2N0cmwoY29kZWMsIGNsc2hfZCwgQ0xTX0hfTk9STUFMLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBDTFNfSF9OT1JNQUwsIGZhbHNlKTsKLQkJd2NkX2Nsc2hfZm9yY2VfaXFfY3RsKGNvZGVjLCBDTFNfSF9OT1JNQUwpOwotCQl3Y2RfY2xzaF9nbTNfYm9vc3RfZGlzYWJsZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2ZseWJhY2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfbW9kZShjb2RlYywgQ0xTX0hfTk9STUFMKTsKLQkJd2NkX2Nsc2hfc2V0X2J1Y2tfcmVndWxhdG9yX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zdGF0ZV9lYXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQlzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKLQkJdTggcmVxX3N0YXRlLCBib29sIGlzX2VuYWJsZSwgaW50IG1vZGUpCi17Ci0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVzLCAlc1xuIiwgX19mdW5jX18sIG1vZGVfdG9fc3RyKG1vZGUpLAotCQlpc19lbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7Ci0KLQlpZiAobW9kZSAhPSBDTFNfSF9OT1JNQUwpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG1vZGU6ICVzIGNhbm5vdCBiZSB1c2VkIGZvciBFQVJcbiIsCi0JCQlfX2Z1bmNfXywgbW9kZV90b19zdHIobW9kZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlzX2VuYWJsZSkgewotCQl3Y2RfZW5hYmxlX2Nsc2hfYmxvY2soY29kZWMsIGNsc2hfZCwgdHJ1ZSk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJICAgIFdDRDlYWFhfQV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwKLQkJCQkgICAgMHg0MCwgMHg0MCk7Ci0JCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIG1vZGUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19tb2RlKGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfZmx5YmFja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCQl3Y2RfY2xzaF9zZXRfZmx5YmFja19jdXJyZW50KGNvZGVjLCBtb2RlKTsKLQkJd2NkX2Nsc2hfYnVja19jdHJsKGNvZGVjLCBjbHNoX2QsIG1vZGUsIHRydWUpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsCi0JCQkJICAgIFdDRDlYWFhfQV9DRENfUlgwX1JYX1BBVEhfQ0ZHMCwKLQkJCQkgICAgMHg0MCwgMHgwMCk7Ci0JCXdjZF9lbmFibGVfY2xzaF9ibG9jayhjb2RlYywgY2xzaF9kLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX2J1Y2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX2ZseWJhY2tfY3RybChjb2RlYywgY2xzaF9kLCBtb2RlLCBmYWxzZSk7Ci0JCXdjZF9jbHNoX3NldF9mbHliYWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JCXdjZF9jbHNoX3NldF9idWNrX21vZGUoY29kZWMsIENMU19IX05PUk1BTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY2xzaF9zdGF0ZV9lcnIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQlzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2hfZCwKLQkJdTggcmVxX3N0YXRlLCBib29sIGlzX2VuYWJsZSwgaW50IG1vZGUpCi17Ci0JY2hhciBtc2dbMTI4XTsKLQotCWRldl9lcnIoY29kZWMtPmRldiwKLQkJIiVzIFdyb25nIHJlcXVlc3QgZm9yIGNsYXNzIEggc3RhdGUgbWFjaGluZSByZXF1ZXN0ZWQgdG8gJXMgJXMiLAotCQlfX2Z1bmNfXywgaXNfZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIsCi0JCXN0YXRlX3RvX3N0cihyZXFfc3RhdGUsIG1zZywgc2l6ZW9mKG1zZykpKTsKLQlXQVJOX09OKDEpOwotfQotCi0vKgotICogRnVuY3Rpb246IHdjZF9jbHNoX2lzX3N0YXRlX3ZhbGlkCi0gKiBQYXJhbXM6IHN0YXRlCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIHZhbGlkIHN0YXRlcyBvZiBDbGFzcyBIIGNvbmZpZ3VyYXRpb24KLSAqLwotc3RhdGljIGJvb2wgd2NkX2Nsc2hfaXNfc3RhdGVfdmFsaWQodTggc3RhdGUpCi17Ci0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgV0NEX0NMU0hfU1RBVEVfSURMRToKLQljYXNlIFdDRF9DTFNIX1NUQVRFX0VBUjoKLQljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSEw6Ci0JY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhSOgotCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBIX1NUOgotCWNhc2UgV0NEX0NMU0hfU1RBVEVfTE86Ci0JY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhMX0VBUjoKLQljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSFJfRUFSOgotCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBIX1NUX0VBUjoKLQljYXNlIFdDRF9DTFNIX1NUQVRFX0hQSExfTE86Ci0JY2FzZSBXQ0RfQ0xTSF9TVEFURV9IUEhSX0xPOgotCWNhc2UgV0NEX0NMU0hfU1RBVEVfSFBIX1NUX0xPOgotCWNhc2UgV0NEX0NMU0hfU1RBVEVfRUFSX0xPOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiB3Y2RfY2xzaF9mc20KLSAqIFBhcmFtczogY29kZWMsIGNkY19jbHNoX2QsIHJlcV9zdGF0ZSwgcmVxX3R5cGUsIGNsc2hfZXZlbnQKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFBSRSBEQUMgYW5kIFBPU1QgREFDIGNvbmRpdGlvbnMgb2YgZGlmZmVyZW50IGRldmljZXMKLSAqIGFuZCB1cGRhdGVzIGNsYXNzIEggY29uZmlndXJhdGlvbiBvZiBkaWZmZXJlbnQgY29tYmluYXRpb24gb2YgZGV2aWNlcwotICogYmFzZWQgb24gdmFsaWRpdHkgb2YgdGhlaXIgc3RhdGVzLiBjZGNfY2xzaF9kIHdpbGwgY29udGFpbiBjdXJyZW50Ci0gKiBjbGFzcyBoIHN0YXRlIGluZm9ybWF0aW9uCi0gKi8KLXZvaWQgd2NkX2Nsc2hfZnNtKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjZGNfY2xzaF9kLAotCQl1OCBjbHNoX2V2ZW50LCB1OCByZXFfc3RhdGUsCi0JCWludCBpbnRfbW9kZSkKLXsKLQl1OCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKLQljaGFyIG1zZzBbMTI4XSwgbXNnMVsxMjhdOwotCi0Jc3dpdGNoIChjbHNoX2V2ZW50KSB7Ci0JY2FzZSBXQ0RfQ0xTSF9FVkVOVF9QUkVfREFDOgotCQlvbGRfc3RhdGUgPSBjZGNfY2xzaF9kLT5zdGF0ZTsKLQkJbmV3X3N0YXRlID0gb2xkX3N0YXRlIHwgcmVxX3N0YXRlOwotCi0JCWlmICghd2NkX2Nsc2hfaXNfc3RhdGVfdmFsaWQobmV3X3N0YXRlKSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogQ2xhc3MtSCBub3QgYSB2YWxpZCBuZXcgc3RhdGU6ICVzXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCXN0YXRlX3RvX3N0cihuZXdfc3RhdGUsIG1zZzAsIHNpemVvZihtc2cwKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChuZXdfc3RhdGUgPT0gb2xkX3N0YXRlKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBDbGFzcy1IIGFscmVhZHkgaW4gcmVxdWVzdGVkIHN0YXRlOiAlc1xuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlzdGF0ZV90b19zdHIobmV3X3N0YXRlLCBtc2cwLCBzaXplb2YobXNnMCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQljZGNfY2xzaF9kLT5zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJd2NkX2Nsc2hfc2V0X2ludF9tb2RlKGNkY19jbHNoX2QsIHJlcV9zdGF0ZSwgaW50X21vZGUpOwotCQkoKmNsc2hfc3RhdGVfZnBbbmV3X3N0YXRlXSkgKGNvZGVjLCBjZGNfY2xzaF9kLCByZXFfc3RhdGUsCi0JCQkJCSAgICAgQ0xTSF9SRVFfRU5BQkxFLCBpbnRfbW9kZSk7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwKLQkJCSIlczogQ2xhc3NIIHN0YXRlIHRyYW5zaXRpb24gZnJvbSAlcyB0byAlc1xuIiwKLQkJCV9fZnVuY19fLCBzdGF0ZV90b19zdHIob2xkX3N0YXRlLCBtc2cwLCBzaXplb2YobXNnMCkpLAotCQkJc3RhdGVfdG9fc3RyKGNkY19jbHNoX2QtPnN0YXRlLCBtc2cxLCBzaXplb2YobXNnMSkpKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBOgotCQlvbGRfc3RhdGUgPSBjZGNfY2xzaF9kLT5zdGF0ZTsKLQkJbmV3X3N0YXRlID0gb2xkX3N0YXRlICYgKH5yZXFfc3RhdGUpOwotCQlpZiAobmV3X3N0YXRlIDwgTlVNX0NMU0hfU1RBVEVTX1YyKSB7Ci0JCQlpZiAoIXdjZF9jbHNoX2lzX3N0YXRlX3ZhbGlkKG9sZF9zdGF0ZSkpIHsKLQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCSIlczpJbnZhbGlkIG9sZCBzdGF0ZTolc1xuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCXN0YXRlX3RvX3N0cihvbGRfc3RhdGUsIG1zZzAsCi0JCQkJCQkgICAgIHNpemVvZihtc2cwKSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChuZXdfc3RhdGUgPT0gb2xkX3N0YXRlKSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiJXM6IENsYXNzLUggYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGU6ICVzXG4iLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJc3RhdGVfdG9fc3RyKG5ld19zdGF0ZSwgbXNnMCwKLQkJCQkJCSAgICAgc2l6ZW9mKG1zZzApKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJKCpjbHNoX3N0YXRlX2ZwW29sZF9zdGF0ZV0pIChjb2RlYywgY2RjX2Nsc2hfZCwKLQkJCQkJcmVxX3N0YXRlLCBDTFNIX1JFUV9ESVNBQkxFLAotCQkJCQlpbnRfbW9kZSk7Ci0JCQljZGNfY2xzaF9kLT5zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJCXdjZF9jbHNoX3NldF9pbnRfbW9kZShjZGNfY2xzaF9kLCByZXFfc3RhdGUsIENMU19OT05FKTsKLQkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDbGFzc0ggc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAotCQkJCV9fZnVuY19fLCBzdGF0ZV90b19zdHIob2xkX3N0YXRlLCBtc2cwLAotCQkJCQkJICAgICAgIHNpemVvZihtc2cwKSksCi0JCQkJc3RhdGVfdG9fc3RyKGNkY19jbHNoX2QtPnN0YXRlLCBtc2cxLAotCQkJCQkgICAgIHNpemVvZihtc2cxKSkpOwotCQl9Ci0JCWJyZWFrOwotCX07Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9jbHNoX2ZzbSk7Ci0KLWludCB3Y2RfY2xzaF9nZXRfY2xzaF9zdGF0ZShzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2gpCi17Ci0JcmV0dXJuIGNsc2gtPnN0YXRlOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfY2xzaF9nZXRfY2xzaF9zdGF0ZSk7Ci0KLXZvaWQgd2NkX2Nsc2hfaW5pdChzdHJ1Y3Qgd2NkX2Nsc2hfY2RjX2RhdGEgKmNsc2gpCi17Ci0JaW50IGk7Ci0KLQljbHNoLT5zdGF0ZSA9IFdDRF9DTFNIX1NUQVRFX0lETEU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NMU0hfU1RBVEVTX1YyOyBpKyspCi0JCWNsc2hfc3RhdGVfZnBbaV0gPSB3Y2RfY2xzaF9zdGF0ZV9lcnI7Ci0KLQljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0VBUl0gPSB3Y2RfY2xzaF9zdGF0ZV9lYXI7Ci0JY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhMXSA9Ci0JCQkJCQl3Y2RfY2xzaF9zdGF0ZV9ocGhfbDsKLQljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSFJdID0KLQkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9yOwotCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBIX1NUXSA9Ci0JCQkJCQl3Y2RfY2xzaF9zdGF0ZV9ocGhfc3Q7Ci0JY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9MT10gPSB3Y2RfY2xzaF9zdGF0ZV9sbzsKLQljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSExfRUFSXSA9Ci0JCQkJCQl3Y2RfY2xzaF9zdGF0ZV9ocGhfZWFyOwotCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBIUl9FQVJdID0KLQkJCQkJCXdjZF9jbHNoX3N0YXRlX2hwaF9lYXI7Ci0JY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhfU1RfRUFSXSA9Ci0JCQkJCQl3Y2RfY2xzaF9zdGF0ZV9ocGhfZWFyOwotCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfSFBITF9MT10gPSB3Y2RfY2xzaF9zdGF0ZV9ocGhfbG87Ci0JY2xzaF9zdGF0ZV9mcFtXQ0RfQ0xTSF9TVEFURV9IUEhSX0xPXSA9IHdjZF9jbHNoX3N0YXRlX2hwaF9sbzsKLQljbHNoX3N0YXRlX2ZwW1dDRF9DTFNIX1NUQVRFX0hQSF9TVF9MT10gPQotCQkJCQkJd2NkX2Nsc2hfc3RhdGVfaHBoX2xvOwotCWNsc2hfc3RhdGVfZnBbV0NEX0NMU0hfU1RBVEVfRUFSX0xPXSA9IHdjZF9jbHNoX3N0YXRlX2Vhcl9sbzsKLQkvKiBTZXQgaW50ZXJwb2xhb3RyIG1vZGVzIHRvIE5PTkUgKi8KLQl3Y2RfY2xzaF9zZXRfaW50X21vZGUoY2xzaCwgV0NEX0NMU0hfU1RBVEVfRUFSLCBDTFNfTk9ORSk7Ci0Jd2NkX2Nsc2hfc2V0X2ludF9tb2RlKGNsc2gsIFdDRF9DTFNIX1NUQVRFX0hQSEwsIENMU19OT05FKTsKLQl3Y2RfY2xzaF9zZXRfaW50X21vZGUoY2xzaCwgV0NEX0NMU0hfU1RBVEVfSFBIUiwgQ0xTX05PTkUpOwotCXdjZF9jbHNoX3NldF9pbnRfbW9kZShjbHNoLCBXQ0RfQ0xTSF9TVEFURV9MTywgQ0xTX05PTkUpOwotCWNsc2gtPmZseWJhY2tfdXNlcnMgPSAwOwotCWNsc2gtPmJ1Y2tfdXNlcnMgPSAwOwotCWNsc2gtPmNsc2hfdXNlcnMgPSAwOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfY2xzaF9pbml0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJXQ0Q5WFhYIENvbW1vbiBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24tdjIuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1jb21tb24tdjIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjOWE4NC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtY29tbW9uLXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX1dDRDlYWFhfQ09NTU9OX1YyCi0KLSNkZWZpbmUgX1dDRDlYWFhfQ09NTU9OX1YyCi0KLSNkZWZpbmUgQ0xTSF9SRVFfRU5BQkxFIHRydWUKLSNkZWZpbmUgQ0xTSF9SRVFfRElTQUJMRSBmYWxzZQotCi0jZGVmaW5lIFdDRF9DTFNIX0VWRU5UX1BSRV9EQUMgMHgwMQotI2RlZmluZSBXQ0RfQ0xTSF9FVkVOVF9QT1NUX1BBIDB4MDIKLSNkZWZpbmUgTUFYX1ZCQVRfTU9OSVRPUl9XUklURVMgMTcKLS8qCi0gKiBCYXNpYyBzdGF0ZXMgZm9yIENsYXNzIEggc3RhdGUgbWFjaGluZS4KLSAqIHJlcHJlc2VudGVkIGFzIGEgYml0IG1hc2sgd2l0aGluIGEgdTggZGF0YSB0eXBlCi0gKiBiaXQgMDogRUFSIG1vZGUKLSAqIGJpdCAxOiBIUEggTGVmdCBtb2RlCi0gKiBiaXQgMjogSFBIIFJpZ2h0IG1vZGUKLSAqIGJpdCAzOiBMaW5lb3V0IG1vZGUKLSAqLwotI2RlZmluZQlXQ0RfQ0xTSF9TVEFURV9JRExFIDB4MDAKLSNkZWZpbmUJV0NEX0NMU0hfU1RBVEVfRUFSICgweDAxIDw8IDApCi0jZGVmaW5lCVdDRF9DTFNIX1NUQVRFX0hQSEwgKDB4MDEgPDwgMSkKLSNkZWZpbmUJV0NEX0NMU0hfU1RBVEVfSFBIUiAoMHgwMSA8PCAyKQotI2RlZmluZQlXQ0RfQ0xTSF9TVEFURV9MTyAoMHgwMSA8PCAzKQotCi0vKgotICogVGhvdWdoIG51bWJlciBvZiBDTFNIIHN0YXRlcyBhcmUgNCwgbWF4IHN0YXRlIHNob3VsYmUgYmUgNQotICogYmVjYXVzZSBzdGF0ZSBhcnJheSBpbmRleCBzdGFydHMgZnJvbSAxLgotICovCi0jZGVmaW5lIFdDRF9DTFNIX1NUQVRFX01BWCA1Ci0jZGVmaW5lIE5VTV9DTFNIX1NUQVRFU19WMiAoMHgwMSA8PCBXQ0RfQ0xTSF9TVEFURV9NQVgpCi0KLQotLyogRGVyaXZlZCBTdGF0ZTogQml0cyAxIGFuZCAyIHNob3VsZCBiZSBzZXQgZm9yIEhlYWRwaG9uZSBzdGVyZW8gKi8KLSNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfSFBIX1NUIChXQ0RfQ0xTSF9TVEFURV9IUEhMIHwgXAotCQkJICAgICAgIFdDRF9DTFNIX1NUQVRFX0hQSFIpCi0KLSNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfSFBITF9MTyAoV0NEX0NMU0hfU1RBVEVfSFBITCB8IFwKLQkJCQkgICAgV0NEX0NMU0hfU1RBVEVfTE8pCi0jZGVmaW5lIFdDRF9DTFNIX1NUQVRFX0hQSFJfTE8gKFdDRF9DTFNIX1NUQVRFX0hQSFIgfCBcCi0JCQkJICAgIFdDRF9DTFNIX1NUQVRFX0xPKQotI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9IUEhfU1RfTE8gKFdDRF9DTFNIX1NUQVRFX0hQSF9TVCB8IFwKLQkJCQkgICAgICBXQ0RfQ0xTSF9TVEFURV9MTykKLSNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfRUFSX0xPIChXQ0RfQ0xTSF9TVEFURV9FQVIgfCBcCi0JCQkJICAgV0NEX0NMU0hfU1RBVEVfTE8pCi0jZGVmaW5lIFdDRF9DTFNIX1NUQVRFX0hQSExfRUFSIChXQ0RfQ0xTSF9TVEFURV9IUEhMIHwgXAotCQkJCSAgICAgV0NEX0NMU0hfU1RBVEVfRUFSKQotI2RlZmluZSBXQ0RfQ0xTSF9TVEFURV9IUEhSX0VBUiAoV0NEX0NMU0hfU1RBVEVfSFBIUiB8IFwKLQkJCQkgICAgIFdDRF9DTFNIX1NUQVRFX0VBUikKLSNkZWZpbmUgV0NEX0NMU0hfU1RBVEVfSFBIX1NUX0VBUiAoV0NEX0NMU0hfU1RBVEVfSFBIX1NUIHwgXAotCQkJCSAgICAgICBXQ0RfQ0xTSF9TVEFURV9FQVIpCi0KLWVudW0gewotCUNMU19IX05PUk1BTCA9IDAsIC8qIENsYXNzLUggRGVmYXVsdCAqLwotCUNMU19IX0hJRkksIC8qIENsYXNzLUggSGlGaSAqLwotCUNMU19IX0xQLCAvKiBDbGFzcy1IIExvdyBQb3dlciAqLwotCUNMU19BQiwgLyogQ2xhc3MtQUIgTG93IEhJRkkqLwotCUNMU19IX0xPSElGSSwgLyogTG9ISUZJICovCi0JQ0xTX0hfVUxQLCAvKiBVbHRyYSBMb3cgcG93ZXIgKi8KLQlDTFNfQUJfSElGSSwgLyogQ2xhc3MtQUIgKi8KLQlDTFNfTk9ORSwgLyogTm9uZSBvZiB0aGUgYWJvdmUgbW9kZXMgKi8KLX07Ci0KLS8qIENsYXNzIEggZGF0YSB0aGF0IHRoZSBjb2RlYyBkcml2ZXIgd2lsbCBtYWludGFpbiAqLwotc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhIHsKLQl1OCBzdGF0ZTsKLQlpbnQgZmx5YmFja191c2VyczsKLQlpbnQgYnVja191c2VyczsKLQlpbnQgY2xzaF91c2VyczsKLQlpbnQgaW50ZXJwb2xhdG9yX21vZGVzW1dDRF9DTFNIX1NUQVRFX01BWF07Ci19OwotCi1zdHJ1Y3Qgd2NkX21hZF9hdWRpb19oZWFkZXIgewotCXUzMiByZXNlcnZlZFszXTsKLQl1MzIgbnVtX3JlZ19jZmc7Ci19OwotCi1zdHJ1Y3Qgd2NkX21hZF9taWNyb3Bob25lX2luZm8gewotCXVpbnQ4X3QgaW5wdXRfbWljcm9waG9uZTsKLQl1aW50OF90IGN5Y2xlX3RpbWU7Ci0JdWludDhfdCBzZXR0bGVfdGltZTsKLQl1aW50OF90IHBhZGRpbmc7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgd2NkX21hZF9taWNiaWFzX2luZm8gewotCXVpbnQ4X3QgbWljYmlhczsKLQl1aW50OF90IGtfZmFjdG9yOwotCXVpbnQ4X3QgZXh0ZXJuYWxfYnlwYXNzX2NhcGFjaXRvcjsKLQl1aW50OF90IGludGVybmFsX2JpYXNpbmc7Ci0JdWludDhfdCBjZmlsdGVyOwotCXVpbnQ4X3QgcGFkZGluZ1szXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB3Y2RfbWFkX3Jtc19hdWRpb19iZWFjb25faW5mbyB7Ci0JdWludDhfdCBybXNfb21pdF9zYW1wbGVzOwotCXVpbnQ4X3Qgcm1zX2NvbXBfdGltZTsKLQl1aW50OF90IGRldGVjdGlvbl9tZWNoYW5pc207Ci0JdWludDhfdCBybXNfZGlmZl90aHJlc2hvbGQ7Ci0JdWludDhfdCBybXNfdGhyZXNob2xkX2xzYjsKLQl1aW50OF90IHJtc190aHJlc2hvbGRfbXNiOwotCXVpbnQ4X3QgcGFkZGluZ1syXTsKLQl1aW50OF90IGlpcl9jb2VmZmljaWVudHNbMzZdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHdjZF9tYWRfcm1zX3VsdHJhc291bmRfaW5mbyB7Ci0JdWludDhfdCBybXNfY29tcF90aW1lOwotCXVpbnQ4X3QgZGV0ZWN0aW9uX21lY2hhbmlzbTsKLQl1aW50OF90IHJtc19kaWZmX3RocmVzaG9sZDsKLQl1aW50OF90IHJtc190aHJlc2hvbGRfbHNiOwotCXVpbnQ4X3Qgcm1zX3RocmVzaG9sZF9tc2I7Ci0JdWludDhfdCBwYWRkaW5nWzNdOwotCXVpbnQ4X3QgaWlyX2NvZWZmaWNpZW50c1szNl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgd2NkX21hZF9hdWRpb19jYWwgewotCXVpbnQzMl90IHZlcnNpb247Ci0Jc3RydWN0IHdjZF9tYWRfbWljcm9waG9uZV9pbmZvIG1pY3JvcGhvbmVfaW5mbzsKLQlzdHJ1Y3Qgd2NkX21hZF9taWNiaWFzX2luZm8gbWljYmlhc19pbmZvOwotCXN0cnVjdCB3Y2RfbWFkX3Jtc19hdWRpb19iZWFjb25faW5mbyBhdWRpb19pbmZvOwotCXN0cnVjdCB3Y2RfbWFkX3Jtc19hdWRpb19iZWFjb25faW5mbyBiZWFjb25faW5mbzsKLQlzdHJ1Y3Qgd2NkX21hZF9ybXNfdWx0cmFzb3VuZF9pbmZvIHVsdHJhc291bmRfaW5mbzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB3Y2Q5eHh4X2FuY19oZWFkZXIgewotCXUzMiByZXNlcnZlZFszXTsKLQl1MzIgbnVtX2FuY19zbG90czsKLX07Ci0KLXN0cnVjdCB2YmF0X21vbml0b3JfcmVnIHsKLQl1MzIgc2l6ZTsKLQl1MzIgd3JpdGVzW01BWF9WQkFUX01PTklUT1JfV1JJVEVTXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB3Y2RfcmVnX21hc2tfdmFsIHsKLQl1MTYJcmVnOwotCXU4CW1hc2s7Ci0JdTgJdmFsOwotfTsKLQotZXh0ZXJuIHZvaWQgd2NkX2Nsc2hfZnNtKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjZGNfY2xzaF9kLAotCQl1OCBjbHNoX2V2ZW50LCB1OCByZXFfc3RhdGUsCi0JCWludCBpbnRfbW9kZSk7Ci0KLWV4dGVybiB2b2lkIHdjZF9jbHNoX2luaXQoc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoKTsKLWV4dGVybiBpbnQgd2NkX2Nsc2hfZ2V0X2Nsc2hfc3RhdGUoc3RydWN0IHdjZF9jbHNoX2NkY19kYXRhICpjbHNoKTsKLWV4dGVybiB2b2lkIHdjZF9jbHNoX2ltcGVkX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBpbXBlZCwKLQkJYm9vbCByZXNldCk7Ci0KLWVudW0gewotCVJFU0VSVkVEID0gMCwKLQlBQU5DX0xQRl9GRl9GQiA9IDEsCi0JQUFOQ19MUEZfQ09FRkZfTVNCLAotCUFBTkNfTFBGX0NPRUZGX0xTQiwKLQlIV19NQURfQVVESU9fRU5BQkxFLAotCUhXX01BRF9VTFRSX0VOQUJMRSwKLQlIV19NQURfQkVBQ09OX0VOQUJMRSwKLQlIV19NQURfQVVESU9fU0xFRVBfVElNRSwKLQlIV19NQURfVUxUUl9TTEVFUF9USU1FLAotCUhXX01BRF9CRUFDT05fU0xFRVBfVElNRSwKLQlIV19NQURfVFhfQVVESU9fU1dJVENIX09GRiwKLQlIV19NQURfVFhfVUxUUl9TV0lUQ0hfT0ZGLAotCUhXX01BRF9UWF9CRUFDT05fU1dJVENIX09GRiwKLQlNQURfQVVESU9fSU5UX0RFU1RfU0VMRUNUX1JFRywKLQlNQURfVUxUX0lOVF9ERVNUX1NFTEVDVF9SRUcsCi0JTUFEX0JFQUNPTl9JTlRfREVTVF9TRUxFQ1RfUkVHLAotCU1BRF9DTElQX0lOVF9ERVNUX1NFTEVDVF9SRUcsCi0JVkJBVF9JTlRfREVTVF9TRUxFQ1RfUkVHLAotCU1BRF9BVURJT19JTlRfTUFTS19SRUcsCi0JTUFEX1VMVF9JTlRfTUFTS19SRUcsCi0JTUFEX0JFQUNPTl9JTlRfTUFTS19SRUcsCi0JTUFEX0NMSVBfSU5UX01BU0tfUkVHLAotCVZCQVRfSU5UX01BU0tfUkVHLAotCU1BRF9BVURJT19JTlRfU1RBVFVTX1JFRywKLQlNQURfVUxUX0lOVF9TVEFUVVNfUkVHLAotCU1BRF9CRUFDT05fSU5UX1NUQVRVU19SRUcsCi0JTUFEX0NMSVBfSU5UX1NUQVRVU19SRUcsCi0JVkJBVF9JTlRfU1RBVFVTX1JFRywKLQlNQURfQVVESU9fSU5UX0NMRUFSX1JFRywKLQlNQURfVUxUX0lOVF9DTEVBUl9SRUcsCi0JTUFEX0JFQUNPTl9JTlRfQ0xFQVJfUkVHLAotCU1BRF9DTElQX0lOVF9DTEVBUl9SRUcsCi0JVkJBVF9JTlRfQ0xFQVJfUkVHLAotCVNCX1BHRF9QT1JUX1RYX1dBVEVSTUFSS19OLAotCVNCX1BHRF9QT1JUX1RYX0VOQUJMRV9OLAotCVNCX1BHRF9QT1JUX1JYX1dBVEVSTUFSS19OLAotCVNCX1BHRF9QT1JUX1JYX0VOQUJMRV9OLAotCVNCX1BHRF9UWF9QT1JUbl9NVUxUSV9DSE5MXzAsCi0JU0JfUEdEX1RYX1BPUlRuX01VTFRJX0NITkxfMSwKLQlTQl9QR0RfUlhfUE9SVG5fTVVMVElfQ0hOTF8wLAotCVNCX1BHRF9SWF9QT1JUbl9NVUxUSV9DSE5MXzEsCi0JQUFOQ19GRl9HQUlOX0FEQVBUSVZFLAotCUFBTkNfRkZHQUlOX0FEQVBUSVZFX0VOLAotCUFBTkNfR0FJTl9DT05UUk9MLAotCVNQS1JfQ0xJUF9QSVBFX0JBTktfU0VMLAotCVNQS1JfQ0xJUERFVF9WQUwwLAotCVNQS1JfQ0xJUERFVF9WQUwxLAotCVNQS1JfQ0xJUERFVF9WQUwyLAotCVNQS1JfQ0xJUERFVF9WQUwzLAotCVNQS1JfQ0xJUERFVF9WQUw0LAotCVNQS1JfQ0xJUERFVF9WQUw1LAotCVNQS1JfQ0xJUERFVF9WQUw2LAotCVNQS1JfQ0xJUERFVF9WQUw3LAotCVZCQVRfUkVMRUFTRV9JTlRfREVTVF9TRUxFQ1RfUkVHLAotCVZCQVRfUkVMRUFTRV9JTlRfTUFTS19SRUcsCi0JVkJBVF9SRUxFQVNFX0lOVF9TVEFUVVNfUkVHLAotCVZCQVRfUkVMRUFTRV9JTlRfQ0xFQVJfUkVHLAotCU1BRDJfQ0xJUF9JTlRfREVTVF9TRUxFQ1RfUkVHLAotCU1BRDJfQ0xJUF9JTlRfTUFTS19SRUcsCi0JTUFEMl9DTElQX0lOVF9TVEFUVVNfUkVHLAotCU1BRDJfQ0xJUF9JTlRfQ0xFQVJfUkVHLAotCVNQS1IyX0NMSVBfUElQRV9CQU5LX1NFTCwKLQlTUEtSMl9DTElQREVUX1ZBTDAsCi0JU1BLUjJfQ0xJUERFVF9WQUwxLAotCVNQS1IyX0NMSVBERVRfVkFMMiwKLQlTUEtSMl9DTElQREVUX1ZBTDMsCi0JU1BLUjJfQ0xJUERFVF9WQUw0LAotCVNQS1IyX0NMSVBERVRfVkFMNSwKLQlTUEtSMl9DTElQREVUX1ZBTDYsCi0JU1BLUjJfQ0xJUERFVF9WQUw3LAotCU1BWF9DRkdfUkVHSVNURVJTLAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLXYyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtcmVzbWdyLXYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWYwYTQuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzMzUvcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDkzNHgvcmVnaXN0ZXJzLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAid2NkOXh4eC1yZXNtZ3ItdjIuaCIKLQotI2RlZmluZSBXQ0Q5WFhYX1JDT19DQUxJQlJBVElPTl9ERUxBWV9JTkNfVVMgNTAwMAotI2RlZmluZSBXQ0Q5M1hYX0FOQV9CSUFTIDB4MDYwMQotI2RlZmluZSBXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MIDB4MGQ0MQotI2RlZmluZSBXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wgMHgwZDQyCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKndjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKGVudW0gd2NkX2Nsb2NrX3R5cGUgY2xrX3R5cGUpCi17Ci0JaWYgKGNsa190eXBlID09IFdDRF9DTEtfT0ZGKQotCQlyZXR1cm4gIldDRF9DTEtfT0ZGIjsKLQllbHNlIGlmIChjbGtfdHlwZSA9PSBXQ0RfQ0xLX1JDTykKLQkJcmV0dXJuICJXQ0RfQ0xLX1JDTyI7Ci0JZWxzZSBpZiAoY2xrX3R5cGUgPT0gV0NEX0NMS19NQ0xLKQotCQlyZXR1cm4gIldDRF9DTEtfTUNMSyI7Ci0JZWxzZQotCQlyZXR1cm4gIldDRF9DTEtfVU5ERUZJTkVEIjsKLX0KLQotc3RhdGljIGludCB3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKLQkJCQkJICAgIHUxNiByZWcsIHU4IG1hc2ssIHU4IHZhbCkKLXsKLQlib29sIGNoYW5nZTsKLQlpbnQgcmV0OwotCi0JaWYgKHJlc21nci0+Y29kZWNfdHlwZSA9PSBXQ0Q5MzRYKSB7Ci0JCS8qIFRhdmlsIGRvZXMgbm90IHN1cHBvcnQgQU5BX0NMS19UT1AgcmVnaXN0ZXIgKi8KLQkJaWYgKHJlZyA9PSBXQ0Q5MzM1X0FOQV9DTEtfVE9QKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJLyogVGFzaGEgZG9lcyBub3Qgc3VwcG9ydCBDTEtfU1lTX01DTEtfUFJHIHJlZ2lzdGVyICovCi0JCWlmIChyZWcgPT0gV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHKQotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChyZXNtZ3ItPmNvZGVjKSB7Ci0JCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMocmVzbWdyLT5jb2RlYywgcmVnLCBtYXNrLCB2YWwpOwotCX0gZWxzZSBpZiAocmVzbWdyLT5jb3JlX3Jlcy0+d2NkX2NvcmVfcmVnbWFwKSB7Ci0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0c19jaGVjaygKLQkJCQlyZXNtZ3ItPmNvcmVfcmVzLT53Y2RfY29yZV9yZWdtYXAsCi0JCQkJcmVnLCBtYXNrLCB2YWwsICZjaGFuZ2UpOwotCQlpZiAoIXJldCkKLQkJCXJldCA9IGNoYW5nZTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBjb2RlYy9yZWdtYXAgbm90IGRlZmluZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9yZXNtZ3JfY29kZWNfcmVnX3JlYWQoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnKQotewotCWludCB2YWwsIHJldDsKLQotCWlmIChyZXNtZ3ItPmNvZGVjX3R5cGUgPT0gV0NEOTM0WCkgewotCQlpZiAocmVnID09IFdDRDkzMzVfQU5BX0NMS19UT1ApCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlpZiAocmVnID09IFdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRykKLQkJCXJldHVybiAwOwotCX0KLQlpZiAocmVzbWdyLT5jb2RlYykgewotCQl2YWwgPSBzbmRfc29jX3JlYWQocmVzbWdyLT5jb2RlYywgcmVnKTsKLQl9IGVsc2UgaWYgKHJlc21nci0+Y29yZV9yZXMtPndjZF9jb3JlX3JlZ21hcCkgewotCQlyZXQgPSByZWdtYXBfcmVhZChyZXNtZ3ItPmNvcmVfcmVzLT53Y2RfY29yZV9yZWdtYXAsCi0JCQkJICByZWcsICZ2YWwpOwotCQlpZiAocmV0KQotCQkJdmFsID0gcmV0OwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IHdjZCByZWdtYXAgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gdmFsOwotfQotCi0vKgotICogd2NkX3Jlc21ncl9nZXRfY2xrX3R5cGUoKQotICogUmV0dXJucyBjbGsgdHlwZSB0aGF0IGlzIGN1cnJlbnRseSBlbmFibGVkCi0gKi8KLWludCB3Y2RfcmVzbWdyX2dldF9jbGtfdHlwZShzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncikKLXsKLQlpZiAoIXJlc21ncikgewotCQlwcl9lcnIoIiVzOiByZXNtZ3Igbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmVzbWdyLT5jbGtfdHlwZTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9nZXRfY2xrX3R5cGUpOwotCi1zdGF0aWMgdm9pZCB3Y2RfcmVzbWdyX2NkY19zcGVjaWZpY19nZXRfY2xrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAotCQkJCQkJaW50IGNsa191c2VycykKLXsKLQkvKiBDYWxsZXIgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBhY3F1aXJlZCBCR19DTEsgbG9jayAqLwotCWlmIChjbGtfdXNlcnMpIHsKLQkJaWYgKHJlc21nci0+cmVzbWdyX2NiICYmCi0JCSAgICByZXNtZ3ItPnJlc21ncl9jYi0+Y2RjX3Jjb19jdHJsKSB7Ci0JCQl3aGlsZSAoY2xrX3VzZXJzLS0pCi0JCQkJcmVzbWdyLT5yZXNtZ3JfY2ItPmNkY19yY29fY3RybChyZXNtZ3ItPmNvZGVjLAotCQkJCQkJCQl0cnVlKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIHdjZF9yZXNtZ3JfcG9zdF9zc3JfdjIKLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIKLSAqLwotdm9pZCB3Y2RfcmVzbWdyX3Bvc3Rfc3NyX3YyKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCWludCBvbGRfYmdfYXVkaW9fdXNlcnM7Ci0JaW50IG9sZF9jbGtfcmNvX3VzZXJzLCBvbGRfY2xrX21jbGtfdXNlcnM7Ci0KLQlXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHJlc21ncik7Ci0KLQlvbGRfYmdfYXVkaW9fdXNlcnMgPSByZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzOwotCW9sZF9jbGtfbWNsa191c2VycyA9IHJlc21nci0+Y2xrX21jbGtfdXNlcnM7Ci0Jb2xkX2Nsa19yY29fdXNlcnMgPSByZXNtZ3ItPmNsa19yY29fdXNlcnM7Ci0JcmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycyA9IDA7Ci0JcmVzbWdyLT5jbGtfbWNsa191c2VycyA9IDA7Ci0JcmVzbWdyLT5jbGtfcmNvX3VzZXJzID0gMDsKLQlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19PRkY7Ci0KLQlwcl9kZWJ1ZygiJXM6IG9sZF9iZ19hdWRpb191c2Vycz0lZCBvbGRfY2xrX21jbGtfdXNlcnM9JWQgb2xkX2Nsa19yY29fdXNlcnM9JWRcbiIsCi0JCSBfX2Z1bmNfXywgb2xkX2JnX2F1ZGlvX3VzZXJzLAotCQkgb2xkX2Nsa19tY2xrX3VzZXJzLCBvbGRfY2xrX3Jjb191c2Vycyk7Ci0KLQlpZiAob2xkX2JnX2F1ZGlvX3VzZXJzKSB7Ci0JCXdoaWxlIChvbGRfYmdfYXVkaW9fdXNlcnMtLSkKLQkJCXdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHJlc21ncik7Ci0JfQotCi0JaWYgKG9sZF9jbGtfbWNsa191c2VycykgewotCQl3aGlsZSAob2xkX2Nsa19tY2xrX3VzZXJzLS0pCi0JCQl3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2socmVzbWdyLCBXQ0RfQ0xLX01DTEspOwotCX0KLQotCWlmIChvbGRfY2xrX3Jjb191c2VycykKLQkJd2NkX3Jlc21ncl9jZGNfc3BlY2lmaWNfZ2V0X2NsayhyZXNtZ3IsIG9sZF9jbGtfcmNvX3VzZXJzKTsKLQotCVdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyhyZXNtZ3IpOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfcmVzbWdyX3Bvc3Rfc3NyX3YyKTsKLQotLyoKLSAqIHdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzOiBlbmFibGUgY29kZWMgbWFzdGVyIGJpYXMKLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIKLSAqLwotaW50IHdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCW11dGV4X2xvY2soJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7Ci0KLQlyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzKys7Ci0JaWYgKHJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMgPT0gMSkgewotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzWFhfQU5BX0JJQVMsCi0JCQkJCQkgMHg4MCwgMHg4MCk7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTNYWF9BTkFfQklBUywKLQkJCQkJCSAweDQwLCAweDQwKTsKLQkJLyoKLQkJICogMW1zIGRlbGF5IGlzIHJlcXVpcmVkIGFmdGVyIHByZS1jaGFyZ2UgaXMgZW5hYmxlZAotCQkgKiBhcyBwZXIgSFcgcmVxdWlyZW1lbnQKLQkJICovCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5M1hYX0FOQV9CSUFTLAotCQkJCQkJIDB4NDAsIDB4MDApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCQlXQ0Q5M1hYX0FOQV9CSUFTLCAweDIwLCAweDAwKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGN1cnJlbnQgbWFzdGVyIGJpYXMgdXNlcnM6ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMpOwotCi0JbXV0ZXhfdW5sb2NrKCZyZXNtZ3ItPm1hc3Rlcl9iaWFzX2xvY2spOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh3Y2RfcmVzbWdyX2VuYWJsZV9tYXN0ZXJfYmlhcyk7Ci0KLS8qCi0gKiB3Y2RfcmVzbWdyX2Rpc2FibGVfbWFzdGVyX2JpYXM6IGRpc2FibGUgY29kZWMgbWFzdGVyIGJpYXMKLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIKLSAqLwotaW50IHdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncikKLXsKLQltdXRleF9sb2NrKCZyZXNtZ3ItPm1hc3Rlcl9iaWFzX2xvY2spOwotCWlmIChyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzIDw9IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZyZXNtZ3ItPm1hc3Rlcl9iaWFzX2xvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzLS07Ci0JaWYgKHJlc21nci0+bWFzdGVyX2JpYXNfdXNlcnMgPT0gMCkgewotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzWFhfQU5BX0JJQVMsCi0JCQkJCQkgMHg4MCwgMHgwMCk7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJCVdDRDkzWFhfQU5BX0JJQVMsIDB4MjAsIDB4MDApOwotCX0KLQltdXRleF91bmxvY2soJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9yZXNtZ3JfZGlzYWJsZV9tYXN0ZXJfYmlhcyk7Ci0KLXN0YXRpYyBpbnQgd2NkX3Jlc21ncl9lbmFibGVfY2xrX21jbGsoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpCi17Ci0JLyogRW5hYmxlIG1jbGsgcmVxdWlyZXMgbWFzdGVyIGJpYXMgdG8gYmUgZW5hYmxlZCBmaXJzdCAqLwotCWlmIChyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzIDw9IDApIHsKLQkJcHJfZXJyKCIlczogQ2Fubm90IHR1cm4gb24gTUNMSywgQkcgaXMgbm90IGVuYWJsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICgoKHJlc21nci0+Y2xrX21jbGtfdXNlcnMgPT0gMCkgJiYKLQkgICAgIChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfTUNMSykpIHx8Ci0JICAgICgocmVzbWdyLT5jbGtfbWNsa191c2VycyA+IDApICYmCi0JICAgIChyZXNtZ3ItPmNsa190eXBlICE9IFdDRF9DTEtfTUNMSykpKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGVuYWJsaW5nIE1DTEssIGNsa190eXBlOiAlc1xuIiwKLQkJCV9fZnVuY19fLAotCQkJd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIocmVzbWdyLT5jbGtfdHlwZSkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKytyZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDEpIHsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCVdDRDkzMzVfQU5BX0NMS19UT1AsIDB4ODAsIDB4ODApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJV0NEOTMzNV9BTkFfQ0xLX1RPUCwgMHgwOCwgMHgwMCk7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQlXQ0Q5MzM1X0FOQV9DTEtfVE9QLCAweDA0LCAweDA0KTsKLQkJaWYgKHJlc21nci0+Y29kZWNfdHlwZSA9PSBXQ0Q5MzRYKSB7Ci0JCQkvKgotCQkJICogSW4gdGF2aWwgY2xvY2sgY29udHJsIHJlZ2lzdGVyIGlzIGNoYW5nZWQKLQkJCSAqIHRvIENMS19TWVNfTUNMS19QUkcKLQkJCSAqLwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4ODAsIDB4ODApOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4MzAsIDB4MTApOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4MDIsIDB4MDApOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4MDEsIDB4MDEpOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4MDIsIDB4MDApOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfRlNfQ05UX0NPTlRST0wsCi0JCQkJCTB4MDEsIDB4MDEpOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5M1hYX0NEQ19DTEtfUlNUX0NUUkxfTUNMS19DT05UUk9MLAotCQkJCQkweDAxLCAweDAxKTsKLQkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJV0NEOTNYWF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKLQkJCQkJMHgwMSwgMHgwMSk7Ci0JCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCVdDRDkzNFhfQ09ERUNfUlBNX0NMS19HQVRFLCAweDAzLCAweDAwKTsKLQkJfSBlbHNlIHsKLQkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJV0NEOTNYWF9DRENfQ0xLX1JTVF9DVFJMX0ZTX0NOVF9DT05UUk9MLAotCQkJCQkweDAxLCAweDAxKTsKLQkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJV0NEOTNYWF9DRENfQ0xLX1JTVF9DVFJMX01DTEtfQ09OVFJPTCwKLQkJCQkJMHgwMSwgMHgwMSk7Ci0JCX0KLQkJLyoKLQkJICogMTB1cyBzbGVlcCBpcyByZXF1aXJlZCBhZnRlciBjbG9jayBpcyBlbmFibGVkCi0JCSAqIGFzIHBlciBIVyByZXF1aXJlbWVudAotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDEwLCAxNSk7Ci0JfQotCi0JcmVzbWdyLT5jbGtfdHlwZSA9IFdDRF9DTEtfTUNMSzsKLQotCXByX2RlYnVnKCIlczogbWNsa191c2VyczogJWQsIGNsa190eXBlOiAlc1xuIiwgX19mdW5jX18sCi0JCSByZXNtZ3ItPmNsa19tY2xrX3VzZXJzLAotCQkgd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIocmVzbWdyLT5jbGtfdHlwZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX3Jlc21ncl9kaXNhYmxlX2Nsa19tY2xrKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCWlmIChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzIDw9IDApIHsKLQkJcHJfZXJyKCIlczogTm8gbWNsayB1c2VycywgY2Fubm90IGRpc2FibGUgbWNsa1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoLS1yZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDApIHsKLQkJaWYgKHJlc21nci0+Y2xrX3Jjb191c2VycyA+IDApIHsKLQkJCS8qIE1DTEsgdG8gUkNPIHN3aXRjaCAqLwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzM1X0FOQV9DTEtfVE9QLAotCQkJCQkweDA4LCAweDA4KTsKLQkJCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHLCAweDAyLCAweDAyKTsKLQkJCS8qIERpc2FibGUgY2xvY2sgYnVmZmVyICovCi0JCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCVdDRDkzNFhfQ0xLX1NZU19NQ0xLX1BSRywgMHg4MCwgMHgwMCk7Ci0JCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19SQ087Ci0JCX0gZWxzZSB7Ci0JCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCVdDRDkzMzVfQU5BX0NMS19UT1AsCi0JCQkJCTB4MDQsIDB4MDApOwotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQlXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsIDB4ODEsIDB4MDApOwotCQkJcmVzbWdyLT5jbGtfdHlwZSA9IFdDRF9DTEtfT0ZGOwotCQl9Ci0KLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9DTEtfVE9QLAotCQkJCQkJIDB4ODAsIDB4MDApOwotCX0KLQotCWlmICgocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpICYmCi0JICAgIChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfT0ZGKSkKLQkJd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmMocmVzbWdyLCBTSURPX1NPVVJDRV9JTlRFUk5BTCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1jbGtfdXNlcnM6ICVkLCBjbGtfdHlwZTogJXNcbiIsIF9fZnVuY19fLAotCQkgcmVzbWdyLT5jbGtfbWNsa191c2VycywKLQkJIHdjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKHJlc21nci0+Y2xrX3R5cGUpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3Y2RfcmVzbWdyX3NldF9idWNrX2FjY3VyYWN5KHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTM0WF9BTkFfQlVDS19DVEwsCi0JCQkJCSAweDAyLCAweDAyKTsKLQkvKiAxMDB1cyBzbGVlcCBuZWVkZWQgYWZ0ZXIgSElHSF9BQ0NVUkFDWV9QUkVfRU4xICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAotCQkJCQkgMHgwMSwgMHgwMSk7Ci0JLyogMTAwdXMgc2xlZXAgbmVlZGVkIGFmdGVyIEhJR0hfQUNDVVJBQ1lfUFJFX0VOMiAqLwotCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7Ci0Jd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKLQkJCQkJIDB4MDQsIDB4MDQpOwotCS8qIDEwMHVzIHNsZWVwIG5lZWRlZCBhZnRlciBISUdIX0FDQ1VSQUNZX0VOICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLX0KLQotc3RhdGljIGludCB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfcmNvKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCWJvb2wgcmNvX2NhbF9kb25lID0gdHJ1ZTsKLQotCXJlc21nci0+Y2xrX3Jjb191c2VycysrOwotCWlmICgocmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDEpICYmCi0JICAgICgocmVzbWdyLT5jbGtfdHlwZSA9PSBXQ0RfQ0xLX09GRikgfHwKLQkgICAgIChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzID09IDApKSkgewotCQlwcl93YXJuKCIlczogUkNPIGVuYWJsZSByZXF1aXJlcyBNQ0xLIHRvIGJlIE9OIGZpcnN0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXNtZ3ItPmNsa19yY29fdXNlcnMtLTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmICgocmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDEpICYmCi0JCSAgIChyZXNtZ3ItPmNsa19tY2xrX3VzZXJzKSkgewotCQkvKiBSQ08gRW5hYmxlICovCi0JCWlmIChyZXNtZ3ItPnNpZG9faW5wdXRfc3JjID09IFNJRE9fU09VUkNFX0lOVEVSTkFMKSB7Ci0JCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCQkJIFdDRDkzMzVfQU5BX1JDTywKLQkJCQkJCQkgMHg4MCwgMHg4MCk7Ci0JCQlpZiAocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpCi0JCQkJd2NkX3Jlc21ncl9zZXRfYnVja19hY2N1cmFjeShyZXNtZ3IpOwotCQl9Ci0KLQkJLyoKLQkJICogMjB1cyByZXF1aXJlZCBhZnRlciBSQ08gQkcgaXMgZW5hYmxlZCBhcyBwZXIgSFcKLQkJICogcmVxdWlyZW1lbnRzCi0JCSAqLwotCQl1c2xlZXBfcmFuZ2UoMjAsIDI1KTsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9SQ08sCi0JCQkJCQkgMHg0MCwgMHg0MCk7Ci0JCS8qCi0JCSAqIDIwdXMgcmVxdWlyZWQgYWZ0ZXIgUkNPIGlzIGVuYWJsZWQgYXMgcGVyIEhXCi0JCSAqIHJlcXVpcmVtZW50cwotCQkgKi8KLQkJdXNsZWVwX3JhbmdlKDIwLCAyNSk7Ci0JCS8qIFJDTyBDYWxpYnJhdGlvbiAqLwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX1JDTywKLQkJCQkJCSAweDA0LCAweDA0KTsKLQkJaWYgKHJlc21nci0+Y29kZWNfdHlwZSA9PSBXQ0Q5MzRYKQotCQkJLyoKLQkJCSAqIEZvciB3Y2Q5MzR4IGNvZGVjLCAyMHVzIHNsZWVwIGlzIG5lZWRlZAotCQkJICogYWZ0ZXIgZW5hYmxpbmcgUkNPIGNhbGlicmF0aW9uCi0JCQkgKi8KLQkJCXVzbGVlcF9yYW5nZSgyMCwgMjUpOwotCi0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTMzNV9BTkFfUkNPLAotCQkJCQkJIDB4MDQsIDB4MDApOwotCQlpZiAocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpCi0JCQkvKgotCQkJICogRm9yIHdjZDkzNHggY29kZWMsIDIwdXMgc2xlZXAgaXMgbmVlZGVkCi0JCQkgKiBhZnRlciBkaXNhYmxpbmcgUkNPIGNhbGlicmF0aW9uCi0JCQkgKi8KLQkJCXVzbGVlcF9yYW5nZSgyMCwgMjUpOwotCi0JCS8qIFJDTyBjYWxpYnJhdGlvbiB0YWtlcyBhcHAuIDVtcyB0byBjb21wbGV0ZSAqLwotCQl1c2xlZXBfcmFuZ2UoV0NEOVhYWF9SQ09fQ0FMSUJSQVRJT05fREVMQVlfSU5DX1VTLAotCQkgICAgICAgV0NEOVhYWF9SQ09fQ0FMSUJSQVRJT05fREVMQVlfSU5DX1VTICsgMTAwKTsKLQkJaWYgKHdjZF9yZXNtZ3JfY29kZWNfcmVnX3JlYWQocmVzbWdyLCBXQ0Q5MzM1X0FOQV9SQ08pICYgMHgwMikKLQkJCXJjb19jYWxfZG9uZSA9IGZhbHNlOwotCi0JCVdBUk4oKCFyY29fY2FsX2RvbmUpLCAiUkNPIENhbGlicmF0aW9uIGZhaWxlZFxuIik7Ci0KLQkJLyogU3dpdGNoIE1VWCB0byBSQ08gKi8KLQkJaWYgKHJlc21nci0+Y2xrX21jbGtfdXNlcnMgPT0gMSkgewotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQkJCVdDRDkzMzVfQU5BX0NMS19UT1AsCi0JCQkJCQkJMHgwOCwgMHgwOCk7Ci0JCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCQkgV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHLAotCQkJCQkJIDB4MDIsIDB4MDIpOwotCQkJcmVzbWdyLT5jbGtfdHlwZSA9IFdDRF9DTEtfUkNPOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogcmNvIGNsayB1c2VyczogJWQsIGNsa190eXBlOiAlc1xuIiwgX19mdW5jX18sCi0JCSByZXNtZ3ItPmNsa19yY29fdXNlcnMsCi0JCSB3Y2RfcmVzbWdyX2Nsa190eXBlX3RvX3N0cihyZXNtZ3ItPmNsa190eXBlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3Y2RfcmVzbWdyX2Rpc2FibGVfY2xrX3JjbyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncikKLXsKLQlpZiAoKHJlc21nci0+Y2xrX3Jjb191c2VycyA8PSAwKSB8fAotCSAgICAocmVzbWdyLT5jbGtfdHlwZSA9PSBXQ0RfQ0xLX09GRikpIHsKLQkJcHJfZXJyKCIlczogcmNvX2Nsa191c2VycyA9ICVkLCBjbGtfdHlwZSA9ICVkLCBjYW5ub3QgZGlzYWJsZVxuIiwKLQkJCV9fZnVuY19fLCByZXNtZ3ItPmNsa19yY29fdXNlcnMsIHJlc21nci0+Y2xrX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXNtZ3ItPmNsa19yY29fdXNlcnMtLTsKLQotCWlmICgocmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDApICYmCi0JICAgIChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfUkNPKSkgewotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzMzVfQU5BX0NMS19UT1AsCi0JCQkJCQkgMHgwOCwgMHgwMCk7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwKLQkJCQkJCSBXQ0Q5MzRYX0NMS19TWVNfTUNMS19QUkcsCi0JCQkJCQkgMHgwMiwgMHgwMCk7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTMzNV9BTkFfQ0xLX1RPUCwKLQkJCQkJCSAweDA0LCAweDAwKTsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9SQ08sCi0JCQkJCQkgMHg0MCwgMHgwMCk7Ci0JCWlmIChyZXNtZ3ItPnNpZG9faW5wdXRfc3JjID09IFNJRE9fU09VUkNFX0lOVEVSTkFMKQotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQkJCSBXQ0Q5MzM1X0FOQV9SQ08sCi0JCQkJCQkJIDB4ODAsIDB4MDApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsCi0JCQkJCQkgV0NEOTM0WF9DTEtfU1lTX01DTEtfUFJHLAotCQkJCQkJIDB4MDEsIDB4MDApOwotCQlyZXNtZ3ItPmNsa190eXBlID0gV0NEX0NMS19PRkY7Ci0JfSBlbHNlIGlmICgocmVzbWdyLT5jbGtfcmNvX3VzZXJzID09IDApICYmCi0JICAgICAgKHJlc21nci0+Y2xrX21jbGtfdXNlcnMpKSB7Ci0JCS8qIERpc2FibGUgUkNPIHdoaWxlIE1DTEsgaXMgT04gKi8KLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzM1X0FOQV9SQ08sCi0JCQkJCQkgMHg0MCwgMHgwMCk7Ci0JCWlmIChyZXNtZ3ItPnNpZG9faW5wdXRfc3JjID09IFNJRE9fU09VUkNFX0lOVEVSTkFMKQotCQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLAotCQkJCQkJCSBXQ0Q5MzM1X0FOQV9SQ08sCi0JCQkJCQkJIDB4ODAsIDB4MDApOwotCX0KLQotCWlmICgocmVzbWdyLT5jb2RlY190eXBlID09IFdDRDkzNFgpICYmCi0JICAgIChyZXNtZ3ItPmNsa190eXBlID09IFdDRF9DTEtfT0ZGKSkKLQkJd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmMocmVzbWdyLCBTSURPX1NPVVJDRV9JTlRFUk5BTCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJjbyBjbGsgdXNlcnM6ICVkLCBjbGtfdHlwZTogJXNcbiIsIF9fZnVuY19fLAotCQkgcmVzbWdyLT5jbGtfcmNvX3VzZXJzLAotCQkgd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIocmVzbWdyLT5jbGtfdHlwZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2s6IGVuYWJsZSBNQ0xLIG9yIFJDTwotICogQHJlc21ncjogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MgotICogQHR5cGU6IENsb2NrIHR5cGUgdG8gZW5hYmxlCi0gKi8KLWludCB3Y2RfcmVzbWdyX2VuYWJsZV9jbGtfYmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJZW51bSB3Y2RfY2xvY2tfdHlwZSB0eXBlKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdDRF9DTEtfTUNMSzoKLQkJcmV0ID0gd2NkX3Jlc21ncl9lbmFibGVfY2xrX21jbGsocmVzbWdyKTsKLQkJYnJlYWs7Ci0JY2FzZSBXQ0RfQ0xLX1JDTzoKLQkJcmV0ID0gd2NkX3Jlc21ncl9lbmFibGVfY2xrX3JjbyhyZXNtZ3IpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmtub3duIENsb2NrIHR5cGU6ICVzXG4iLCBfX2Z1bmNfXywKLQkJCXdjZF9yZXNtZ3JfY2xrX3R5cGVfdG9fc3RyKHR5cGUpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfTsKLQotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEVuYWJsZSBjbG9jayAlcyBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIodHlwZSkpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9lbmFibGVfY2xrX2Jsb2NrKTsKLQotdm9pZCB3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKLQkJCQkJICBpbnQgc2lkb19zcmMpCi17Ci0JaWYgKCFyZXNtZ3IpCi0JCXJldHVybjsKLQotCWlmIChzaWRvX3NyYyA9PSByZXNtZ3ItPnNpZG9faW5wdXRfc3JjKQotCQlyZXR1cm47Ci0KLQlpZiAoc2lkb19zcmMgPT0gU0lET19TT1VSQ0VfSU5URVJOQUwpIHsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKLQkJCQkJCSAweDA0LCAweDAwKTsKLQkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9CVUNLX0NUTCwKLQkJCQkJCSAweDAzLCAweDAwKTsKLQkJdXNsZWVwX3JhbmdlKDEwMCwgMTEwKTsKLQkJd2NkX3Jlc21ncl9jb2RlY19yZWdfdXBkYXRlX2JpdHMocmVzbWdyLCBXQ0Q5MzRYX0FOQV9SQ08sCi0JCQkJCQkgMHg4MCwgMHgwMCk7Ci0JCXVzbGVlcF9yYW5nZSgxMDAsIDExMCk7Ci0JCXJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9JTlRFUk5BTDsKLQkJcHJfZGVidWcoIiVzOiBzaWRvIGlucHV0IHNyYyB0byBpbnRlcm5hbFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSBpZiAoc2lkb19zcmMgPT0gU0lET19TT1VSQ0VfUkNPX0JHKSB7Ci0JCXdjZF9yZXNtZ3JfY29kZWNfcmVnX3VwZGF0ZV9iaXRzKHJlc21nciwgV0NEOTM0WF9BTkFfUkNPLAotCQkJCQkJIDB4ODAsIDB4ODApOwotCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAotCQkJCQkJIDB4MDIsIDB4MDIpOwotCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAotCQkJCQkJIDB4MDEsIDB4MDEpOwotCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCQl3Y2RfcmVzbWdyX2NvZGVjX3JlZ191cGRhdGVfYml0cyhyZXNtZ3IsIFdDRDkzNFhfQU5BX0JVQ0tfQ1RMLAotCQkJCQkJIDB4MDQsIDB4MDQpOwotCQl1c2xlZXBfcmFuZ2UoMTAwLCAxMTApOwotCQlyZXNtZ3ItPnNpZG9faW5wdXRfc3JjID0gU0lET19TT1VSQ0VfUkNPX0JHOwotCQlwcl9kZWJ1ZygiJXM6IHNpZG8gaW5wdXQgc3JjIHRvIGV4dGVybmFsXG4iLCBfX2Z1bmNfXyk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyk7Ci0KLS8qCi0gKiB3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyY19sb2NrZWQ6Ci0gKiAgIFNldCBTSURPIGlucHV0IGluIEJHX0NMSyBsb2NrZWQgY29udGV4dAotICoKLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIKLSAqIEBzaWRvX3NyYzogU2VsZWN0IHRoZSBTSURPIGlucHV0IHNvdXJjZQotICovCi12b2lkIHdjZF9yZXNtZ3Jfc2V0X3NpZG9faW5wdXRfc3JjX2xvY2tlZChzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKLQkJCQkJICBpbnQgc2lkb19zcmMpCi17Ci0JaWYgKCFyZXNtZ3IpCi0JCXJldHVybjsKLQotCVdDRDlYWFhfVjJfQkdfQ0xLX0xPQ0socmVzbWdyKTsKLQl3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyYyhyZXNtZ3IsIHNpZG9fc3JjKTsKLQlXQ0Q5WFhYX1YyX0JHX0NMS19VTkxPQ0socmVzbWdyKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmNfbG9ja2VkKTsKLQotLyoKLSAqIHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfYmxvY2s6IGRpc2FibGUgTUNMSyBvciBSQ08KLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIKLSAqIEB0eXBlOiBDbG9jayB0eXBlIHRvIGRpc2FibGUKLSAqLwotaW50IHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfYmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJZW51bSB3Y2RfY2xvY2tfdHlwZSB0eXBlKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFdDRF9DTEtfTUNMSzoKLQkJcmV0ID0gd2NkX3Jlc21ncl9kaXNhYmxlX2Nsa19tY2xrKHJlc21ncik7Ci0JCWJyZWFrOwotCWNhc2UgV0NEX0NMS19SQ086Ci0JCXJldCA9IHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfcmNvKHJlc21ncik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVua25vd24gQ2xvY2sgdHlwZTogJXNcbiIsIF9fZnVuY19fLAotCQkJd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIodHlwZSkpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9OwotCi0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogRGlzYWJsZSBjbG9jayAlcyBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJd2NkX3Jlc21ncl9jbGtfdHlwZV90b19zdHIodHlwZSkpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9kaXNhYmxlX2Nsa19ibG9jayk7Ci0KLS8qCi0gKiB3Y2RfcmVzbWdyX2luaXQ6IGluaXRpYWxpemUgd2NkIHJlc291cmNlIG1hbmFnZXIKLSAqIEBjb3JlX3JlczogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UKLSAqCi0gKiBFYXJseSBpbml0IGNhbGwgd2l0aG91dCBhIGhhbmRsZSB0byBzbmRfc29jX2NvZGVjICoKLSAqLwotc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICp3Y2RfcmVzbWdyX2luaXQoCi0JCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzLAotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3I7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHg7Ci0KLQlyZXNtZ3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlc21ncikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQl3Y2Q5eHh4ID0gY29udGFpbmVyX29mKGNvcmVfcmVzLCBzdHJ1Y3Qgd2NkOXh4eCwgY29yZV9yZXMpOwotCWlmICghd2NkOXh4eCkgewotCQlrZnJlZShyZXNtZ3IpOwotCQlwcl9lcnIoIiVzOiBDYW5ub3QgZ2V0IHdjZDl4eCBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCW11dGV4X2luaXQoJnJlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOwotCW11dGV4X2luaXQoJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7Ci0JcmVzbWdyLT5tYXN0ZXJfYmlhc191c2VycyA9IDA7Ci0JcmVzbWdyLT5jbGtfbWNsa191c2VycyA9IDA7Ci0JcmVzbWdyLT5jbGtfcmNvX3VzZXJzID0gMDsKLQlyZXNtZ3ItPm1hc3Rlcl9iaWFzX3VzZXJzID0gMDsKLQlyZXNtZ3ItPmNvZGVjID0gY29kZWM7Ci0JcmVzbWdyLT5jb3JlX3JlcyA9IGNvcmVfcmVzOwotCXJlc21nci0+c2lkb19pbnB1dF9zcmMgPSBTSURPX1NPVVJDRV9JTlRFUk5BTDsKLQlyZXNtZ3ItPmNvZGVjX3R5cGUgPSB3Y2Q5eHh4LT50eXBlOwotCi0JcmV0dXJuIHJlc21ncjsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9pbml0KTsKLQotLyoKLSAqIHdjZF9yZXNtZ3JfcmVtb3ZlOiBDbGVhbi11cCB3Y2QgcmVzb3VyY2UgbWFuYWdlcgotICogQHJlc21ncjogaGFuZGxlIHRvIHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MgotICovCi12b2lkIHdjZF9yZXNtZ3JfcmVtb3ZlKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKQotewotCW11dGV4X2Rlc3Ryb3koJnJlc21nci0+bWFzdGVyX2JpYXNfbG9jayk7Ci0Ja2ZyZWUocmVzbWdyKTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9yZW1vdmUpOwotCi0vKgotICogd2NkX3Jlc21ncl9wb3N0X2luaXQ6IHBvc3QgaW5pdCBjYWxsIHRvIGFzc2lnbiBjb2RlYyBoYW5kbGUKLSAqIEByZXNtZ3I6IGhhbmRsZSB0byBzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgY3JlYXRlZCBkdXJpbmcgZWFybHkgaW5pdAotICogQHJlc21ncl9jYjogY29kZWMgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHJlc21ncgotICogQGNvZGVjOiBoYW5kbGUgdG8gc3RydWN0IHNuZF9zb2NfY29kZWMKLSAqLwotaW50IHdjZF9yZXNtZ3JfcG9zdF9pbml0KHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyLAotCQkJIGNvbnN0IHN0cnVjdCB3Y2RfcmVzbWdyX2NiICpyZXNtZ3JfY2IsCi0JCQkgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWlmICghcmVzbWdyKSB7Ci0JCXByX2VycigiJXM6IHJlc21nciBub3QgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogQ29kZWMgbWVtb3J5IGlzIE5VTEwsIG5vdGhpbmcgdG8gcG9zdCBpbml0XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXNtZ3ItPmNvZGVjID0gY29kZWM7Ci0JcmVzbWdyLT5yZXNtZ3JfY2IgPSByZXNtZ3JfY2I7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX3Jlc21ncl9wb3N0X2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIndjZDl4eHggcmVzbWdyIHYyIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5oIGIvc291bmQvc29jL2NvZGVjcy93Y2Q5eHh4LXJlc21nci12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODMxYmE2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1yZXNtZ3ItdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1dDRDlYWFhfQ09NTU9OX1YyX0hfXwotI2RlZmluZSBfX1dDRDlYWFhfQ09NTU9OX1YyX0hfXwotCi0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L3djZDl4eHhfcmVnaXN0ZXJzLmg+Ci0KLWVudW0gd2NkX2Nsb2NrX3R5cGUgewotCVdDRF9DTEtfT0ZGLAotCVdDRF9DTEtfUkNPLAotCVdDRF9DTEtfTUNMSywKLX07Ci0KLWVudW0gewotCVNJRE9fU09VUkNFX0lOVEVSTkFMLAotCVNJRE9fU09VUkNFX1JDT19CRywKLX07Ci0KLXN0cnVjdCB3Y2RfcmVzbWdyX2NiIHsKLQlpbnQgKCpjZGNfcmNvX2N0cmwpKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOwotfTsKLQotc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHdjZDl4eHhfY29yZV9yZXNvdXJjZSAqY29yZV9yZXM7Ci0KLQlpbnQgbWFzdGVyX2JpYXNfdXNlcnM7Ci0JaW50IGNsa19tY2xrX3VzZXJzOwotCWludCBjbGtfcmNvX3VzZXJzOwotCi0Jc3RydWN0IG11dGV4IGNvZGVjX2JnX2Nsa19sb2NrOwotCXN0cnVjdCBtdXRleCBtYXN0ZXJfYmlhc19sb2NrOwotCi0JZW51bSBjb2RlY192YXJpYW50IGNvZGVjX3R5cGU7Ci0JZW51bSB3Y2RfY2xvY2tfdHlwZSBjbGtfdHlwZTsKLQotCWNvbnN0IHN0cnVjdCB3Y2RfcmVzbWdyX2NiICpyZXNtZ3JfY2I7Ci0JaW50IHNpZG9faW5wdXRfc3JjOwotfTsKLQotI2RlZmluZSBXQ0Q5WFhYX1YyX0JHX0NMS19MT0NLKHJlc21ncikJCQlcCi17CQkJCQkJCVwKLQlzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKl9fcmVzbWdyID0gcmVzbWdyOwlcCi0JcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkdfQ0xLXG4iLCBfX2Z1bmNfXyk7CVwKLQltdXRleF9sb2NrKCZfX3Jlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOwlcCi0JcHJfZGVidWcoIiVzOiBBY3F1aXJpbmcgQkdfQ0xLIGRvbmVcbiIsIF9fZnVuY19fKTsJXAotfQotCi0jZGVmaW5lIFdDRDlYWFhfVjJfQkdfQ0xLX1VOTE9DSyhyZXNtZ3IpCQkJXAotewkJCQkJCQlcCi0Jc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpfX3Jlc21nciA9IHJlc21ncjsJXAotCXByX2RlYnVnKCIlczogUmVsZWFzaW5nIEJHX0NMS1xuIiwgX19mdW5jX18pOwlcCi0JbXV0ZXhfdW5sb2NrKCZfX3Jlc21nci0+Y29kZWNfYmdfY2xrX2xvY2spOwlcCi19Ci0KLSNkZWZpbmUgV0NEOVhYWF9WMl9CR19DTEtfQVNTRVJUX0xPQ0tFRChyZXNtZ3IpCQlcCi17CQkJCQkJCVwKLQlXQVJOX09OQ0UoIW11dGV4X2lzX2xvY2tlZCgmcmVzbWdyLT5jb2RlY19iZ19jbGtfbG9jayksIFwKLQkJICAiJXM6IEJHX0NMSyBsb2NrIHNob3VsZCBoYXZlIGFjcXVpcmVkXG4iLCBfX2Z1bmNfXyk7IFwKLX0KLQotaW50IHdjZF9yZXNtZ3JfZW5hYmxlX21hc3Rlcl9iaWFzKHN0cnVjdCB3Y2Q5eHh4X3Jlc21ncl92MiAqcmVzbWdyKTsKLWludCB3Y2RfcmVzbWdyX2Rpc2FibGVfbWFzdGVyX2JpYXMoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpOwotc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICp3Y2RfcmVzbWdyX2luaXQoCi0JCXN0cnVjdCB3Y2Q5eHh4X2NvcmVfcmVzb3VyY2UgKmNvcmVfcmVzLAotCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotdm9pZCB3Y2RfcmVzbWdyX3JlbW92ZShzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncik7Ci1pbnQgd2NkX3Jlc21ncl9wb3N0X2luaXQoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkgY29uc3Qgc3RydWN0IHdjZF9yZXNtZ3JfY2IgKnJlc21ncl9jYiwKLQkJCSBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotaW50IHdjZF9yZXNtZ3JfZW5hYmxlX2Nsa19ibG9jayhzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21nciwKLQkJCQllbnVtIHdjZF9jbG9ja190eXBlIHR5cGUpOwotaW50IHdjZF9yZXNtZ3JfZGlzYWJsZV9jbGtfYmxvY2soc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJZW51bSB3Y2RfY2xvY2tfdHlwZSB0eXBlKTsKLWludCB3Y2RfcmVzbWdyX2dldF9jbGtfdHlwZShzdHJ1Y3Qgd2NkOXh4eF9yZXNtZ3JfdjIgKnJlc21ncik7Ci12b2lkIHdjZF9yZXNtZ3JfcG9zdF9zc3JfdjIoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IpOwotdm9pZCB3Y2RfcmVzbWdyX3NldF9zaWRvX2lucHV0X3NyY19sb2NrZWQoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJCSAgaW50IHNpZG9fc3JjKTsKLXZvaWQgd2NkX3Jlc21ncl9zZXRfc2lkb19pbnB1dF9zcmMoc3RydWN0IHdjZDl4eHhfcmVzbWdyX3YyICpyZXNtZ3IsCi0JCQkJCSAgaW50IHNpZG9fc3JjKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZDl4eHgtc29jLWluaXQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1zb2MtaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThhYmI3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkOXh4eC1zb2MtaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxzb3VuZC93Y2QtZHNwLW1nci5oPgotI2luY2x1ZGUgImF1ZGlvLWV4dC1jbGstdXAuaCIKLQotc3RhdGljIGludCBfX2luaXQgd2NkOXh4eF9zb2NfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0JcmV0ID0gd2NkX2RzcF9tZ3JfaW5pdCgpOwotCWlmICghcmV0KSB7Ci0JCXJldCA9IGF1ZGlvX3JlZl9jbGtfcGxhdGZvcm1faW5pdCgpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBpbml0IGV4dGNsayBmYWlsOiAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCQl3Y2RfZHNwX21ncl9leGl0KCk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBpbml0IGRzcCBtZ3IgZmFpbDogJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfaW5pdCh3Y2Q5eHh4X3NvY19pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHdjZDl4eHhfc29jX2V4aXQodm9pZCkKLXsKLQlhdWRpb19yZWZfY2xrX3BsYXRmb3JtX2V4aXQoKTsKLQl3Y2RfZHNwX21ncl9leGl0KCk7Ci19Ci1tb2R1bGVfZXhpdCh3Y2Q5eHh4X3NvY19leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJXQ0Q5WFhYIENPREVDIHNvYyBpbml0IGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RfY21pX2FwaS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY21pX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJlNjQxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NtaV9hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fQ01JX0FQSV9fCi0jZGVmaW5lIF9fQ01JX0FQSV9fCi0KLWVudW0gY21pX2FwaV9yZXN1bHQgewotCUNNSV9BUElfRkFJTEVEID0gMSwKLQlDTUlfQVBJX0JVU1ksCi0JQ01JX0FQSV9OT19NRU1PUlksCi0JQ01JX0FQSV9OT1RfUkVBRFksCi19OwotCi1lbnVtIGNtaV9hcGlfZXZlbnQgewotCUNNSV9BUElfTVNHID0gMSwKLQlDTUlfQVBJX09GRkxJTkUsCi0JQ01JX0FQSV9PTkxJTkUsCi0JQ01JX0FQSV9ERUlOSVRJQUxJWkVELAotfTsKLQotc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uIHsKLQllbnVtIGNtaV9hcGlfZXZlbnQgZXZlbnQ7Ci0JZW51bSBjbWlfYXBpX3Jlc3VsdCByZXN1bHQ7Ci0Jdm9pZCAqbWVzc2FnZTsKLX07Ci0KLXZvaWQgKmNtaV9yZWdpc3RlcigKLQl2b2lkIG5vdGlmaWNhdGlvbl9jYWxsYmFjawotCQkoY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpLAotCXUzMiBzZXJ2aWNlKTsKLWVudW0gY21pX2FwaV9yZXN1bHQgY21pX2RlcmVnaXN0ZXIodm9pZCAqcmVnX2hhbmRsZSk7Ci1lbnVtIGNtaV9hcGlfcmVzdWx0IGNtaV9zZW5kX21zZyh2b2lkICptZXNzYWdlKTsKLQotI2VuZGlmIC8qX19DTUlfQVBJX18qLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NwZV9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTIwZDUxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkX2NwZV9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTc5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lbGYuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+Ci0jaW5jbHVkZSA8c291bmQvbHNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL2NwZV9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvY3BlX2NtaS5oPgotI2luY2x1ZGUgPHNvdW5kL2NwZV9lcnIuaD4KLSNpbmNsdWRlIDxzb2MvcWNvbS9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5eHh4L2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC93Y2Q5eHh4LWlycS5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgotI2luY2x1ZGUgIndjZF9jcGVfY29yZS5oIgotI2luY2x1ZGUgIndjZF9jcGVfc2VydmljZXMuaCIKLSNpbmNsdWRlICJ3Y2RfY21pX2FwaS5oIgotCi0jZGVmaW5lIENNSV9DTURfVElNRU9VVCAoMTAgKiBIWikKLSNkZWZpbmUgV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TIDIKLSNkZWZpbmUgV0NEX0NQRV9BRkVfTUFYX1BPUlRTIDQKLSNkZWZpbmUgQUZFX1NWQ19FWFBMSUNJVF9QT1JUX1NUQVJUIDEKLSNkZWZpbmUgV0NEX0NQRV9FQ19QUF9CVUZfU0laRQk0ODAgLyogNSBtc2VjIGJ1ZmZlciAqLwotCi0jZGVmaW5lIEVMRl9GTEFHX0VYRUNVVEUgKDEgPDwgMCkKLSNkZWZpbmUgRUxGX0ZMQUdfV1JJVEUgKDEgPDwgMSkKLSNkZWZpbmUgRUxGX0ZMQUdfUkVBRCAoMSA8PCAyKQotCi0jZGVmaW5lIEVMRl9GTEFHX1JXIChFTEZfRkxBR19SRUFEIHwgRUxGX0ZMQUdfV1JJVEUpCi0KLSNkZWZpbmUgV0NEX0NQRV9HUkFCX0xPQ0sobG9jaywgbmFtZSkJCVwKLXsJCQkJCQlcCi0JcHJfZGVidWcoIiVzOiAlcyBsb2NrIGFjcXVpcmVcbiIsCVwKLQkJIF9fZnVuY19fLCBuYW1lKTsJCVwKLQltdXRleF9sb2NrKGxvY2spOwkJCVwKLX0KLQotI2RlZmluZSBXQ0RfQ1BFX1JFTF9MT0NLKGxvY2ssIG5hbWUpCQlcCi17CQkJCQkJXAotCXByX2RlYnVnKCIlczogJXMgbG9jayByZWxlYXNlXG4iLAlcCi0JCSBfX2Z1bmNfXywgbmFtZSk7CQlcCi0JbXV0ZXhfdW5sb2NrKGxvY2spOwkJCVwKLX0KLQotI2RlZmluZSBXQ0RfQ1BFX1NUQVRFX01BWF9MRU4gMTEKLSNkZWZpbmUgQ1BFX09GRkxJTkVfV0FJVF9USU1FT1VUICgyICogSFopCi0jZGVmaW5lIENQRV9SRUFEWV9XQUlUX1RJTUVPVVQgKDMgKiBIWikKLSNkZWZpbmUgV0NEX0NQRV9TWVNGU19ESVJfTUFYX0xFTkdUSCAzMgotCi0jZGVmaW5lIENQRV9FUlJfSVJRX0NCKGNvcmUpIFwKLQkoY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCkKLQotLyoKLSAqIEFGRSBvdXRwdXQgYnVmZmVyIHNpemUgaXMgYWx3YXlzCi0gKiAoc2FtcGxlX3JhdGUgKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZS8yKjEwMDApCi0gKi8KLSNkZWZpbmUgQUZFX09VVF9CVUZfU0laRShiaXRfd2lkdGgsIHNhbXBsZV9yYXRlKSBcCi0JKCgoc2FtcGxlX3JhdGUpICogKGJpdF93aWR0aCAvIEJJVFNfUEVSX0JZVEUpKS8oMioxMDAwKSkKLQotZW51bSBhZmVfcG9ydF9zdGF0ZSB7Ci0JQUZFX1BPUlRfU1RBVEVfREVJTklUID0gMCwKLQlBRkVfUE9SVF9TVEFURV9JTklULAotCUFGRV9QT1JUX1NUQVRFX0NPTkZJRywKLQlBRkVfUE9SVF9TVEFURV9TVEFSVEVELAotCUFGRV9QT1JUX1NUQVRFX1NVU1BFTkRFRCwKLX07Ci0KLXN0cnVjdCB3Y2RfY21pX2FmZV9wb3J0X2RhdGEgewotCXU4IHBvcnRfaWQ7Ci0Jc3RydWN0IG11dGV4IGFmZV9sb2NrOwotCXN0cnVjdCBjb21wbGV0aW9uIGFmZV9jbWRfY29tcGxldGU7Ci0JZW51bSBhZmVfcG9ydF9zdGF0ZSBwb3J0X3N0YXRlOwotCXU4IGNtZF9yZXN1bHQ7Ci0JdTMyIG1lbV9oYW5kbGU7Ci19OwotCi1zdHJ1Y3QgY3BlX2xzbV9pZHMgewotCXUzMiBtb2R1bGVfaWQ7Ci0JdTMyIHBhcmFtX2lkOwotfTsKLQotc3RhdGljIHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmVfZDsKLXN0YXRpYyBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uCi0JCSpsc21fc2Vzc2lvbnNbV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TICsgMV07Ci1zdHJ1Y3Qgd2NkX2NwZV9jb3JlICogKCp3Y2RfZ2V0X2NwZV9jb3JlKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKLXN0YXRpYyBzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhIGFmZV9wb3J0c1tXQ0RfQ1BFX0FGRV9NQVhfUE9SVFMgKyAxXTsKLXN0YXRpYyB2b2lkIHdjZF9jcGVfc3ZjX2V2ZW50X2NiKGNvbnN0IHN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiAqcGFyYW0pOwotc3RhdGljIGludCB3Y2RfY3BlX3NldHVwX2lycXMoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSk7Ci1zdGF0aWMgdm9pZCB3Y2RfY3BlX2NsZWFudXBfaXJxcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKTsKLXN0YXRpYyBzc2l6ZV90IGNwZV9mdG1fdGVzdF90cmlnZ2VyKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotc3RhdGljIHUzMiByYW1kdW1wX2VuYWJsZTsKLXN0YXRpYyB1MzIgY3BlX2Z0bV90ZXN0X3N0YXR1czsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNwZV9mdG1fdGVzdF90cmlnZ2VyX2ZvcHMgPSB7Ci0JLm9wZW4gPSBzaW1wbGVfb3BlbiwKLQkud3JpdGUgPSBjcGVfZnRtX3Rlc3RfdHJpZ2dlciwKLX07Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc3ZjX2NtZF9tb2RlKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCSAgICB1OCBtb2RlKTsKLXN0cnVjdCB3Y2RfY3BlX2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLCBjaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgY29uc3QgY2hhciAqYnVmLAotCQkJIHNzaXplX3QgY291bnQpOwotfTsKLQotI2RlZmluZSBXQ0RfQ1BFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCi1zdGF0aWMgc3RydWN0IHdjZF9jcGVfYXR0cmlidXRlIGNwZV9hdHRyXyMjX25hbWUgPSB7IFwKLQkuYXR0ciA9IHsubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwgLm1vZGUgPSBfbW9kZX0sIFwKLQkuc2hvdyA9IF9zaG93LCBcCi0JLnN0b3JlID0gX3N0b3JlLCBcCi19Ci0KLSNkZWZpbmUgdG9fd2NkX2NwZV9hdHRyKGEpIFwKLQljb250YWluZXJfb2YoKGEpLCBzdHJ1Y3Qgd2NkX2NwZV9hdHRyaWJ1dGUsIGF0dHIpCi0KLSNkZWZpbmUga29ial90b19jcGVfY29yZShrb2JqKSBcCi0JY29udGFpbmVyX29mKChrb2JqKSwgc3RydWN0IHdjZF9jcGVfY29yZSwgY3BlX2tvYmopCi0KLS8qIHdjZF9jcGVfbHNtX3Nlc3Npb25fYWN0aXZlOiBjaGVjayBpZiBhbnkgc2Vzc2lvbiBpcyBhY3RpdmUKLSAqIHJldHVybiB0cnVlIGlmIGFueSBzZXNzaW9uIGlzIGFjdGl2ZS4KLSAqLwotc3RhdGljIGJvb2wgd2NkX2NwZV9sc21fc2Vzc2lvbl9hY3RpdmUodm9pZCkKLXsKLQlpbnQgaW5kZXggPSAxOwotCWJvb2wgbHNtX2FjdGl2ZSA9IGZhbHNlOwotCi0JLyogc2Vzc2lvbiBzdGFydHMgZnJvbSBpbmRleCAxICovCi0JZm9yICg7IGluZGV4IDw9IFdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUzsgaW5kZXgrKykgewotCQlpZiAobHNtX3Nlc3Npb25zW2luZGV4XSAhPSBOVUxMKSB7Ci0JCQlsc21fYWN0aXZlID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJbHNtX2FjdGl2ZSA9IGZhbHNlOwotCQl9Ci0JfQotCXJldHVybiBsc21fYWN0aXZlOwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfZ2V0X3Nmcl9kdW1wKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCi17Ci0Jc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgZHVtcF9zZWc7Ci0JaW50IHJjOwotCXU4ICpzZnJfZHVtcDsKLQotCXNmcl9kdW1wID0ga3phbGxvYyhjb3JlLT5zZnJfYnVmX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghc2ZyX2R1bXApCi0JCWdvdG8gZG9uZTsKLQotCWR1bXBfc2VnLnR5cGUgPSBDUEVfU1ZDX0RBVEFfTUVNOwotCWR1bXBfc2VnLmNwZV9hZGRyID0gY29yZS0+c2ZyX2J1Zl9hZGRyOwotCWR1bXBfc2VnLnNpemUgPSBjb3JlLT5zZnJfYnVmX3NpemU7Ci0JZHVtcF9zZWcuZGF0YSA9IHNmcl9kdW1wOwotCWRldl9kYmcoY29yZS0+ZGV2LAotCQkiJXM6IHJlYWRpbmcgU0ZSIGZyb20gQ1BFLCBzaXplID0gJXp1XG4iLAotCQlfX2Z1bmNfXywgY29yZS0+c2ZyX2J1Zl9zaXplKTsKLQotCXJjID0gY3BlX3N2Y19yYW1kdW1wKGNvcmUtPmNwZV9oYW5kbGUsICZkdW1wX3NlZyk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIHJlYWQgY3BlIHNmcl9kdW1wLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZnJlZV9zZnJfZHVtcDsKLQl9Ci0KLQlkZXZfaW5mbyhjb3JlLT5kZXYsCi0JCSAiJXM6IGNwZV9zZnIgPSAlc1xuIiwgX19mdW5jX18sIHNmcl9kdW1wKTsKLQotZnJlZV9zZnJfZHVtcDoKLQlrZnJlZShzZnJfZHVtcCk7Ci1kb25lOgotCS8qIEV2ZW4gaWYgU0ZSIGR1bXAgZmFpbGVkLCBkbyBub3QgcmV0dXJuIGVycm9yICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9jb2xsZWN0X3JhbWR1bXAoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSkKLXsKLQlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCBkdW1wX3NlZzsKLQlpbnQgcmM7Ci0KLQlpZiAoIWNvcmUtPmNwZV9yYW1kdW1wX2RldiB8fCAhY29yZS0+Y3BlX2R1bXBfdl9hZGRyIHx8Ci0JICAgIGNvcmUtPmh3X2luZm8uZHJhbV9zaXplID09IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IFJhbWR1bXAgZGV2aWNlcyBub3Qgc2V0IHVwLCBzaXplID0gJXp1XG4iLAotCQkJX19mdW5jX18sIGNvcmUtPmh3X2luZm8uZHJhbV9zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZHVtcF9zZWcudHlwZSA9IENQRV9TVkNfREFUQV9NRU07Ci0JZHVtcF9zZWcuY3BlX2FkZHIgPSBjb3JlLT5od19pbmZvLmRyYW1fb2Zmc2V0OwotCWR1bXBfc2VnLnNpemUgPSBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZTsKLQlkdW1wX3NlZy5kYXRhID0gY29yZS0+Y3BlX2R1bXBfdl9hZGRyOwotCi0JZGV2X2RiZyhjb3JlLT5kZXYsCi0JCSIlczogUmVhZGluZyByYW1kdW1wIGZyb20gQ1BFXG4iLAotCQlfX2Z1bmNfXyk7Ci0KLQlyYyA9IGNwZV9zdmNfcmFtZHVtcChjb3JlLT5jcGVfaGFuZGxlLCAmZHVtcF9zZWcpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byByZWFkIENQRSByYW1kdW1wLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJIiVzOiBjb21wbGV0ZWQgcmVhZGluZyByYW1kdW1wIGZyb20gQ1BFXG4iLAotCQlfX2Z1bmNfXyk7Ci0KLQljb3JlLT5jcGVfcmFtZHVtcF9zZWcuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjb3JlLT5jcGVfZHVtcF9hZGRyOwotCWNvcmUtPmNwZV9yYW1kdW1wX3NlZy5zaXplID0gY29yZS0+aHdfaW5mby5kcmFtX3NpemU7Ci0JY29yZS0+Y3BlX3JhbWR1bXBfc2VnLnZfYWRkcmVzcyA9IGNvcmUtPmNwZV9kdW1wX3ZfYWRkcjsKLQotCXJjID0gZG9fcmFtZHVtcChjb3JlLT5jcGVfcmFtZHVtcF9kZXYsCi0JCQkmY29yZS0+Y3BlX3JhbWR1bXBfc2VnLCAxKTsKLQlpZiAocmMpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBmYWlsIHRvIGR1bXAgY3BlIHJhbSB0byBkZXZpY2UsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIHdjZF9jcGVfaXNfdmFsaWRfZWxmX2hkcjogY2hlY2sgaWYgdGhlIEVMRiBoZWFkZXIgaXMgdmFsaWQKLSAqIEBjb3JlOiBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCi0gKiBAZndfc2l6ZTogc2l6ZSBvZiBmaXJtd2FyZSBmcm9tIHJlcXVlc3RfZmlybXdhcmUKLSAqIEBlaGRyOiB0aGUgZWxmIGhlYWRlciB0byBiZSBjaGVja2VkIGZvcgotICogcmV0dXJuIHRydWUgaWYgYWxsIGNoZWNrcyBwYXNzLCB0cnVlIGlmIGFueSBlbGYgY2hlY2sgZmFpbHMKLSAqLwotc3RhdGljIGJvb2wgd2NkX2NwZV9pc192YWxpZF9lbGZfaGRyKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsIHNpemVfdCBmd19zaXplLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGVsZjMyX2hkciAqZWhkcikKLXsKLQlpZiAoZndfc2l6ZSA8IHNpemVvZigqZWhkcikpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczpGaXJtd2FyZSB0b28gc21hbGxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlbGZfY2hlY2tfZmFpbDsKLQl9Ci0KLQlpZiAobWVtY21wKGVoZHItPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBOb3QgYW4gRUxGIGZpbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlbGZfY2hlY2tfZmFpbDsKLQl9Ci0KLQlpZiAoZWhkci0+ZV90eXBlICE9IEVUX0VYRUMgJiYgZWhkci0+ZV90eXBlICE9IEVUX0RZTikgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBOb3QgYSBleGVjdXRhYmxlIGltYWdlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZWxmX2NoZWNrX2ZhaWw7Ci0JfQotCi0JaWYgKGVoZHItPmVfcGhudW0gPT0gMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBubyBzZWdtZW50cyB0byBsb2FkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZWxmX2NoZWNrX2ZhaWw7Ci0JfQotCi0JaWYgKHNpemVvZihzdHJ1Y3QgZWxmMzJfcGhkcikgKiBlaGRyLT5lX3BobnVtICsKLQkgICAgc2l6ZW9mKHN0cnVjdCBlbGYzMl9oZHIpID4gZndfc2l6ZSkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBUb28gc21hbGwgTURUIGZpbGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlbGZfY2hlY2tfZmFpbDsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotZWxmX2NoZWNrX2ZhaWw6Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogd2NkX2NwZV9sb2FkX2VhY2hfc2VnbWVudDogZG93bmxvYWQgc2VnbWVudCB0byBDUEUKLSAqIEBjb3JlOiBoYW5kbGUgdG8gc3RydWN0IHdjZF9jcGVfY29yZQotICogQGZpbGVfaWR4OiBpbmRleCBvZiBzcGxpdCBmaXJtd2FyZSBpbWFnZSBmaWxlIG5hbWUKLSAqIEBwaGRyOiBwcm9ncmFtIGhlYWRlciBmcm9tIG1ldGFkYXRhCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9sb2FkX2VhY2hfc2VnbWVudChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQkJICBpbnQgZmlsZV9pZHgsIGNvbnN0IHN0cnVjdCBlbGYzMl9waGRyICpwaGRyKQotewotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqc3BsaXRfZnc7Ci0JY2hhciBzcGxpdF9mbmFtZVszMl07Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKnNlZ21lbnQ7Ci0KLQlpZiAoIWNvcmUgfHwgIXBoZHIpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogZmlsZSBzaXplIGNhbiBiZSAwIGZvciBic3Mgc2VnbWVudHMgKi8KLQlpZiAocGhkci0+cF9maWxlc3ogPT0gMCB8fCBwaGRyLT5wX21lbXN6ID09IDApCi0JCXJldHVybiAwOwotCi0Jc2VnbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZWdtZW50KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNucHJpbnRmKHNwbGl0X2ZuYW1lLCBzaXplb2Yoc3BsaXRfZm5hbWUpLCAiJXMuYiUwMmQiLAotCQkgY29yZS0+Zm5hbWUsIGZpbGVfaWR4KTsKLQotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnNwbGl0X2Z3LCBzcGxpdF9mbmFtZSwgY29yZS0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LCAiZmlybXdhcmUgJXMgbm90IGZvdW5kXG4iLAotCQkJc3BsaXRfZm5hbWUpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGZ3X3JlcV9mYWlsOwotCX0KLQotCWlmIChwaGRyLT5wX2ZsYWdzICYgRUxGX0ZMQUdfRVhFQ1VURSkKLQkJc2VnbWVudC0+dHlwZSA9IENQRV9TVkNfSU5TVFJVQ1RJT05fTUVNOwotCWVsc2UgaWYgKHBoZHItPnBfZmxhZ3MgJiBFTEZfRkxBR19SVykKLQkJc2VnbWVudC0+dHlwZSA9IENQRV9TVkNfREFUQV9NRU07Ci0JZWxzZSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LCAiJXMgaW52YWxpZCBmbGFncyAweCV4XG4iLAotCQkJX19mdW5jX18sIHBoZHItPnBfZmxhZ3MpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc2VnbWVudC0+Y3BlX2FkZHIgPSBwaGRyLT5wX3BhZGRyOwotCXNlZ21lbnQtPnNpemUgPSBwaGRyLT5wX2ZpbGVzejsKLQlzZWdtZW50LT5kYXRhID0gKHU4ICopIHNwbGl0X2Z3LT5kYXRhOwotCi0JZGV2X2RiZyhjb3JlLT5kZXYsCi0JCSIlczogY3BlIHNlZ21lbnQgdHlwZSAlcyByZWFkIGZyb20gZmlybXdhcmVcbiIsIF9fZnVuY19fLAotCQkoc2VnbWVudC0+dHlwZSA9PSBDUEVfU1ZDX0lOU1RSVUNUSU9OX01FTSkgPwotCQkJIklOU1RSVUNUSU9OIiA6ICJEQVRBIik7Ci0KLQlyZXQgPSBjcGVfc3ZjX2Rvd25sb2FkX3NlZ21lbnQoY29yZS0+Y3BlX2hhbmRsZSwgc2VnbWVudCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGRvd25sb2FkICVzLCBlcnJvciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHNwbGl0X2ZuYW1lLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJlbGVhc2VfZmlybXdhcmUoc3BsaXRfZncpOwotCi1md19yZXFfZmFpbDoKLQlrZnJlZShzZWdtZW50KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9lbmFibGVfY3BlX2Nsa3M6IGVuYWJsZSB0aGUgY2xvY2tzIGZvciBDUEUKLSAqIEBjb3JlOiBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCi0gKiBAZW5hYmxlOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBlbmFibGUvZGlzYWJsZSBjcGUgY2xvY2tzCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9lbmFibGVfY3BlX2Nsa3Moc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCwgcmV0MTsKLQotCWlmICghY29yZSB8fCAhY29yZS0+Y3BlX2NkY19jYiB8fAotCSAgICAhY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Nsa19lbikgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGhhbmRsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2Nsa19lbihjb3JlLT5jb2RlYywgZW5hYmxlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgUkNPXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghZW5hYmxlICYmIGNvcmUtPmNwZV9jbGtfcmVmID4gMCkKLQkJY29yZS0+Y3BlX2Nsa19yZWYtLTsKLQotCS8qCi0JICogQ1BFIGNsayB3aWxsIGJlIGVuYWJsZWQgYXQgdGhlIGZpcnN0IHRpbWUKLQkgKiBhbmQgYmUgZGlzYWJsZWQgYXQgdGhlIGxhc3QgdGltZS4KLQkgKi8KLQlpZiAoY29yZS0+Y3BlX2Nsa19yZWYgPT0gMCkgewotCQlyZXQgPSBjb3JlLT5jcGVfY2RjX2NiLT5jcGVfY2xrX2VuKGNvcmUtPmNvZGVjLCBlbmFibGUpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IGNwZV9jbGtfZW4oKSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBjcGVfY2xrX2ZhaWw7Ci0JCX0KLQl9Ci0KLQlpZiAoZW5hYmxlKQotCQljb3JlLT5jcGVfY2xrX3JlZisrOwotCi0JcmV0dXJuIDA7Ci0KLWNwZV9jbGtfZmFpbDoKLQkvKiBSZWxlYXNlIHRoZSBjb2RlYyBjbGsgaWYgQ1BFIGNsayBlbmFibGUgZmFpbGVkICovCi0JaWYgKGVuYWJsZSkgewotCQlyZXQxID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2Nsa19lbihjb3JlLT5jb2RlYywgIWVuYWJsZSk7Ci0JCWlmIChyZXQxKQotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiBGYWlsIHRvIHJlbGVhc2UgY29kZWMgY2xrLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0MSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfYnVzX3ZvdGVfbWF4X2J3OiBGdW5jdGlvbiB0byB2b3RlIGZvciBtYXggYmFuZHdpZHRoIG9uIGNvZGVjIGJ1cwotICogQGNvcmU6IGhhbmRsZSB0byBjb3JlIGZvciBjcGUKLSAqIEB2b3RlOiBmbGFnIHRvIGluZGljYXRlIGVuYWJsZS9kaXNhYmxlIG9mIHZvdGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHVzZSB0aGUgY29kZWMgcHJvdmlkZWQgY2FsbGJhY2sgdG8KLSAqIHZvdGUvdW52b3RlIGZvciB0aGUgbWF4IGJhbmR3aWR0aCBvZiB0aGUgYnVzIHRoYXQgaXMgdXNlZCBieQotICogdGhlIGNvZGVjIGZvciByZWdpc3RlciByZWFkcy93cml0ZXMuCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQkJYm9vbCB2b3RlKQotewotCWlmICghY29yZSB8fCAhY29yZS0+Y3BlX2NkY19jYikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byAlc1xuIiwKLQkJCV9fZnVuY19fLAotCQkJKCFjb3JlKSA/ICJjb3JlIiA6ICJjb2RlYyBjYWxsYmFja3MiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcmUtPmNwZV9jZGNfY2ItPmJ1c192b3RlX2J3KSB7Ci0JCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6ICVzIGNkYyBidXMgbWF4IGJhbmR3aWR0aFxuIiwKLQkJCSBfX2Z1bmNfXywgdm90ZSA/ICJWb3RlIiA6ICJVbnZvdGUiKTsKLQkJY29yZS0+Y3BlX2NkY19jYi0+YnVzX3ZvdGVfYncoY29yZS0+Y29kZWMsIHZvdGUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogd2NkX2NwZV9sb2FkX2Z3OiBGdW5jdGlvbiB0byBsb2FkIHRoZSBmdyBpbWFnZQotICogQGNvcmU6IGNwZSBjb3JlIHBvaW50ZXIKLSAqIEBsb2FkX3R5cGU6IGluZGljYXRlcyB3aGV0aGVyIHRvIGxvYWQgdG8gZGF0YSBzZWN0aW9uCi0gKgkgICAgICAgb3IgdGhlIGluc3RydWN0aW9uIHNlY3Rpb24KLSAqCi0gKiBQYXJzZSB0aGUgbWR0IGZpbGUgdG8gbG9vayBmb3IgcHJvZ3JhbSBoZWFkZXJzLCBsb2FkIGVhY2gKLSAqIHNwbGl0IGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfbG9hZF9mdyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCXVuc2lnbmVkIGludCBsb2FkX3R5cGUpCi17Ci0KLQlpbnQgcmV0LCBwaGRyX2lkeDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBOVUxMOwotCXN0cnVjdCB3Y2Q5eHh4ICp3Y2Q5eHh4ID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICplaGRyOwotCWNvbnN0IHN0cnVjdCBlbGYzMl9waGRyICpwaGRyOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JY29uc3QgdTggKmVsZl9wdHI7Ci0JY2hhciBtZHRfbmFtZVs2NF07Ci0JYm9vbCBpbWdfZGxvYWRfZmFpbCA9IGZhbHNlOwotCWJvb2wgbG9hZF9zZWdtZW50OwotCi0JaWYgKCFjb3JlIHx8ICFjb3JlLT5jcGVfaGFuZGxlKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIENQRSBjb3JlICVwS1xuIiwgX19mdW5jX18sCi0JCSAgICAgICBjb3JlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvZGVjID0gY29yZS0+Y29kZWM7Ci0Jd2NkOXh4eCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2LT5wYXJlbnQpOwotCXNucHJpbnRmKG1kdF9uYW1lLCBzaXplb2YobWR0X25hbWUpLCAiJXMubWR0IiwgY29yZS0+Zm5hbWUpOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBtZHRfbmFtZSwgY29yZS0+ZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgImZpcm13YXJlICVzIG5vdCBmb3VuZFxuIiwgbWR0X25hbWUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWVoZHIgPSAoc3RydWN0IGVsZjMyX2hkciAqKSBmdy0+ZGF0YTsKLQlpZiAoIXdjZF9jcGVfaXNfdmFsaWRfZWxmX2hkcihjb3JlLCBmdy0+c2l6ZSwgZWhkcikpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogZncgbWR0ICVzIGlzIGludmFsaWRcbiIsCi0JCQlfX2Z1bmNfXywgbWR0X25hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZWxmX3B0ciA9IGZ3LT5kYXRhICsgc2l6ZW9mKCplaGRyKTsKLQotCWlmIChsb2FkX3R5cGUgPT0gRUxGX0ZMQUdfRVhFQ1VURSkgewotCQkvKiBSZXNldCBDUEUgZmlyc3QgKi8KLQkJcmV0ID0gY3BlX3N2Y19yZXNldChjb3JlLT5jcGVfaGFuZGxlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHJlc2V0IENQRSB3aXRoIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogc3RhcnQgaW1hZ2UgZGxvYWQsIG5hbWUgPSAlcywgbG9hZF90eXBlID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGNvcmUtPmZuYW1lLCBsb2FkX3R5cGUpOwotCi0Jd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoY29yZSwgdHJ1ZSk7Ci0KLQkvKiBwYXJzZSBldmVyeSBwcm9ncmFtIGhlYWRlciBhbmQgcmVxdWVzdCBjb3JyZXNwb25kaW5nIGZpcm13YXJlICovCi0JZm9yIChwaGRyX2lkeCA9IDA7IHBoZHJfaWR4IDwgZWhkci0+ZV9waG51bTsgcGhkcl9pZHgrKykgewotCQlwaGRyID0gKHN0cnVjdCBlbGYzMl9waGRyICopZWxmX3B0cjsKLQkJbG9hZF9zZWdtZW50ID0gZmFsc2U7Ci0KLQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkiaW5kZXggPSAlZCwgdmFkZHIgPSAweCV4LCBwYWRkciA9IDB4JXgsIGZpbGVzeiA9IDB4JXgsIG1lbXN6ID0gMHgleCwgZmxhZ3MgPSAweCV4XG4iCi0JCQksIHBoZHJfaWR4LCBwaGRyLT5wX3ZhZGRyLCBwaGRyLT5wX3BhZGRyLAotCQkJcGhkci0+cF9maWxlc3osIHBoZHItPnBfbWVtc3osIHBoZHItPnBfZmxhZ3MpOwotCi0JCXN3aXRjaCAobG9hZF90eXBlKSB7Ci0JCWNhc2UgRUxGX0ZMQUdfRVhFQ1VURToKLQkJCWlmIChwaGRyLT5wX2ZsYWdzICYgbG9hZF90eXBlKQotCQkJCWxvYWRfc2VnbWVudCA9IHRydWU7Ci0JCQlicmVhazsKLQkJY2FzZSBFTEZfRkxBR19SVzoKLQkJCWlmICghKHBoZHItPnBfZmxhZ3MgJiBFTEZfRkxBR19FWEVDVVRFKSAmJgotCQkJICAgIChwaGRyLT5wX2ZsYWdzICYgbG9hZF90eXBlKSkKLQkJCQlsb2FkX3NlZ21lbnQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGxvYWRfdHlwZSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBsb2FkX3R5cGUpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gcmVsX2J1c192b3RlOwotCQl9Ci0KLQkJaWYgKGxvYWRfc2VnbWVudCkgewotCQkJcmV0ID0gd2NkX2NwZV9sb2FkX2VhY2hfc2VnbWVudChjb3JlLAotCQkJCQkJcGhkcl9pZHgsIHBoZHIpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkJIkZhaWxlZCB0byBsb2FkIHNlZ21lbnQgJWQsIGFib3J0aW5nIGltZyBkbG9hZFxuIiwKLQkJCQkJcGhkcl9pZHgpOwotCQkJCWltZ19kbG9hZF9mYWlsID0gdHJ1ZTsKLQkJCQlnb3RvIHJlbF9idXNfdm90ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoY29yZS0+ZGV2LAotCQkJCSIlczogc2tpcHBlZCBzZWdtZW50IHdpdGggaW5kZXggJWRcbiIsCi0JCQkJX19mdW5jX18sIHBoZHJfaWR4KTsKLQkJfQotCi0JCWVsZl9wdHIgPSBlbGZfcHRyICsgc2l6ZW9mKCpwaGRyKTsKLQl9Ci0JaWYgKGxvYWRfdHlwZSA9PSBFTEZfRkxBR19FWEVDVVRFKQotCQljb3JlLT5zc3JfdHlwZSA9IFdDRF9DUEVfSU1FTV9ET1dOTE9BREVEOwotCi1yZWxfYnVzX3ZvdGU6Ci0Jd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoY29yZSwgZmFsc2UpOwotCi1kb25lOgotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2NoYW5nZV9vbmxpbmVfc3RhdGUgLSBtYXJrIGNwZSBvbmxpbmUvb2ZmbGluZSBzdGF0ZQotICogQGNvcmU6IGNvcmUgc2Vzc2lvbiB0byBtYXJrCi0gKiBAb25saW5lOiB3aGV0aGVyIG9ubGluZSBvZiBvZmZsaW5lCi0gKgotICovCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX2NoYW5nZV9vbmxpbmVfc3RhdGUoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQkJCWludCBvbmxpbmUpCi17Ci0Jc3RydWN0IHdjZF9jcGVfc3NyX2VudHJ5ICpzc3JfZW50cnkgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcmV0OwotCi0JaWYgKCFjb3JlKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29yZSBoYW5kbGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlzc3JfZW50cnkgPSAmY29yZS0+c3NyX2VudHJ5OwotCVdDRF9DUEVfR1JBQl9MT0NLKCZjb3JlLT5zc3JfbG9jaywgIlNTUiIpOwotCXNzcl9lbnRyeS0+b2ZmbGluZSA9ICFvbmxpbmU7Ci0KLQkvKiBNYWtlIHN1cmUgd3JpdGUgdG8gb2ZmbGluZSBzdGF0ZSBpcyBjb21wbGV0ZWQuICovCi0Jd21iKCk7Ci0JcmV0ID0geGNoZygmc3NyX2VudHJ5LT5vZmZsaW5lX2NoYW5nZSwgMSk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzc3JfZW50cnktPm9mZmxpbmVfcG9sbF93YWl0KTsKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZjb3JlLT5zc3JfbG9jaywgIlNTUiIpOwotCXByX2RlYnVnKCIlczogY2hhbmdlIHN0YXRlIDB4JXggb2ZmbGluZV9jaGFuZ2UgMHgleFxuIgotCQkgIiBjb3JlLT5vZmZsaW5lIDB4JXgsIHJldCA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCBvbmxpbmUsCi0JCSBzc3JfZW50cnktPm9mZmxpbmVfY2hhbmdlLAotCQkgY29yZS0+c3NyX2VudHJ5Lm9mZmxpbmUsIHJldCk7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2xvYWRfZndfaW1hZ2U6IHdvcmsgZnVuY3Rpb24gdG8gbG9hZCB0aGUgZncgaW1hZ2UKLSAqIEB3b3JrOiB3b3JrIHRoYXQgaXMgc2NoZWR1bGVkIHRvIHBlcmZvcm0gdGhlIGltYWdlIGxvYWRpbmcKLSAqCi0gKiBQYXJzZSB0aGUgbWR0IGZpbGUgdG8gbG9vayBmb3IgcHJvZ3JhbSBoZWFkZXJzLCBsb2FkIGVhY2gKLSAqIHNwbGl0IGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvZ3JhbSBoZWFkZXJzLgotICovCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX2xvYWRfZndfaW1hZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmU7Ci0JaW50IHJldCA9IDA7Ci0KLQljb3JlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3Y2RfY3BlX2NvcmUsIGxvYWRfZndfd29yayk7Ci0JcmV0ID0gd2NkX2NwZV9sb2FkX2Z3KGNvcmUsIEVMRl9GTEFHX0VYRUNVVEUpOwotCWlmICghcmV0KQotCQl3Y2RfY3BlX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29yZSwgMSk7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gbG9hZCBpbnN0cnVjdGlvbiBzZWN0aW9uLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotfQotCi0vKgotICogd2NkX2NwZV9nZXRfY29yZV9oYW5kbGU6IGdldCB0aGUgaGFuZGxlIHRvIHdjZF9jcGVfY29yZQotICogQGNvZGVjOiBjb2RlYyBmcm9tIHdoaWNoIHRoaXMgaGFuZGxlIGlzIHRvIGJlIG9idGFpbmVkCi0gKiBDb2RlYyBkcml2ZXIgc2hvdWxkIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBvYnRhaW4KLSAqIGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIHdjZF9jcGVfY29yZQotICovCi12b2lkICp3Y2RfY3BlX2dldF9jb3JlX2hhbmRsZSgKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IE5VTEw7Ci0KLQlpZiAoIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29kZWMgaGFuZGxlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCF3Y2RfZ2V0X2NwZV9jb3JlKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogY29kZWMgY2FsbGJhY2sgbm90IGF2YWlsYWJsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWNvcmUgPSB3Y2RfZ2V0X2NwZV9jb3JlKGNvZGVjKTsKLQotCWlmICghY29yZSkKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBoYW5kbGUgdG8gY29yZSBub3QgYXZhaWxhYmxlXG4iLAotCQkJX19mdW5jX18pOwotZG9uZToKLQlyZXR1cm4gY29yZTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX2NwZV9nZXRfY29yZV9oYW5kbGUpOwotCi0vKgotICogc3Zhc3NfZW5naW5lX2lycTogdGhyZWFkZWQgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHN2YXNzIGVuZ2luZSBpcnEKLSAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKLSAqIEBkYXRhOiBkYXRhIHBvaW50ZXIgcGFzc2VkIGR1cmluZyBpcnEgcmVnaXN0cmF0aW9uCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBzdmFzc19lbmdpbmVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGRhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNvcmUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBkYXRhIGZvciBpbnRlcnJ1cHQgaGFuZGxlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNwZV9zdmNfcHJvY2Vzc19pcnEoY29yZS0+Y3BlX2hhbmRsZSwgQ1BFX0lSUV9PVVRCT1hfSVJRKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEVycm9yIHByb2Nlc3NpbmcgaXJxIGZyb20gY3BlX1NlcnZpY2VzXG4iLAotCQkJX19mdW5jX18pOwotZG9uZToKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3N0YXRlX3JlYWQgLSB1cGRhdGUgcmVhZCBzdGF0dXMgaW4gcHJvY2ZzCi0gKiBAZW50cnk6IHNuZF9pbmZvX2VudHJ5Ci0gKiBAYnVmOiBidWZmZXIgd2hlcmUgdGhlIHJlYWQgc3RhdHVzIGlzIHVwZGF0ZWQuCi0gKgotICovCi1zdGF0aWMgc3NpemVfdCB3Y2RfY3BlX3N0YXRlX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKLQkJCSAgICAgICB2b2lkICpmaWxlX3ByaXZhdGVfZGF0YSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQotewotCWludCBsZW4gPSAwOwotCWNoYXIgYnVmZmVyW1dDRF9DUEVfU1RBVEVfTUFYX0xFTl07Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfc3NyX2VudHJ5ICpzc3JfZW50cnkgPSBOVUxMOwotCi0JY29yZSA9IChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICopIGVudHJ5LT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFjb3JlKSB7Ci0JCXByX2VycigiJXM6IENQRSBjb3JlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXNzcl9lbnRyeSA9ICZjb3JlLT5zc3JfZW50cnk7Ci0KLQkvKiBNYWtlIHN1cmUgcmVhZCBmcm9tIHNzcl9lbnRyeSBpcyBjb21wbGV0ZWQuICovCi0Jcm1iKCk7Ci0JZGV2X2RiZyhjb3JlLT5kZXYsCi0JCSIlczogT2ZmbGluZSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJIHNzcl9lbnRyeS0+b2ZmbGluZSk7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKLQlsZW4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXNcbiIsCi0JCSAgICAgICBzc3JfZW50cnktPm9mZmxpbmUgPyAiT0ZGTElORSIgOiAiT05MSU5FIik7Ci0JV0NEX0NQRV9SRUxfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmcG9zLCBidWZmZXIsIGxlbik7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3N0YXRlX3BvbGwgLSBwb2xscyBmb3IgY2hhbmdlIHN0YXRlCi0gKiBAZW50cnk6IHNuZF9pbmZvX2VudHJ5Ci0gKiBAd2FpdDogd2FpdCBmb3IgZHVyYXRpb24gZm9yIHBvbGwgd2FpdAotICoKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCB3Y2RfY3BlX3N0YXRlX3BvbGwoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKLQkJCQkJdm9pZCAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gTlVMTDsKLQlzdHJ1Y3Qgd2NkX2NwZV9zc3JfZW50cnkgKnNzcl9lbnRyeSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KLQljb3JlID0gKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKikgZW50cnktPnByaXZhdGVfZGF0YTsKLQlpZiAoIWNvcmUpIHsKLQkJcHJfZXJyKCIlczogQ1BFIGNvcmUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzc3JfZW50cnkgPSAmY29yZS0+c3NyX2VudHJ5OwotCi0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogQ1BFIFBvbGwgd2FpdFxuIiwKLQkgICAgICAgX19mdW5jX18pOwotCXBvbGxfd2FpdChmaWxlLCAmc3NyX2VudHJ5LT5vZmZsaW5lX3BvbGxfd2FpdCwgd2FpdCk7Ci0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogV2FrZS11cCBQb2xsIHdhaXRcbiIsCi0JICAgICAgIF9fZnVuY19fKTsKLQlXQ0RfQ1BFX0dSQUJfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKLQotCWlmICh4Y2hnKCZzc3JfZW50cnktPm9mZmxpbmVfY2hhbmdlLCAwKSkKLQkJcmV0ID0gUE9MTElOIHwgUE9MTFBSSSB8IFBPTExSRE5PUk07Ci0KLQlXQ0RfQ1BFX1JFTF9MT0NLKCZjb3JlLT5zc3JfbG9jaywgIlNTUiIpOwotCi0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogcmV0ICglZCkgZnJvbSBwb2xsX3dhaXRcbiIsCi0JCV9fZnVuY19fLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2lzX29ubGluZV9zdGF0ZSAtIHJldHVybiB0cnVlIGlmIGNhcmQgaXMgb25saW5lIHN0YXRlCi0gKiBAY29yZTogY29yZSBvZmZsaW5lIHRvIHF1ZXJ5Ci0gKi8KLXN0YXRpYyBib29sIHdjZF9jcGVfaXNfb25saW5lX3N0YXRlKHZvaWQgKmNvcmVfaGFuZGxlKQotewotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQotCWlmIChjb3JlX2hhbmRsZSkgewotCQlyZXR1cm4gIWNvcmUtPnNzcl9lbnRyeS5vZmZsaW5lOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IENvcmUgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJLyogc3RpbGwgcmV0dXJuIDEtIG9mZmxpbmUgaWYgY29yZSBwdHIgbnVsbCAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5X29wcyB3Y2RfY3BlX3N0YXRlX3Byb2Nfb3BzID0gewotCS5yZWFkID0gd2NkX2NwZV9zdGF0ZV9yZWFkLAotCS5wb2xsID0gd2NkX2NwZV9zdGF0ZV9wb2xsLAotfTsKLQotc3RhdGljIGludCB3Y2RfY3BlX2NoZWNrX25ld19pbWFnZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKQotewotCWludCByYyA9IDA7Ci0JY2hhciB0ZW1wX2ltZ19uYW1lW1dDRF9DUEVfSU1BR0VfRk5BTUVfTUFYXTsKLQotCWlmICghc3RyY21wKGNvcmUtPmZuYW1lLCBjb3JlLT5keW5fZm5hbWUpICYmCi0JICAgIGNvcmUtPnNzcl90eXBlICE9IFdDRF9DUEVfSU5JVElBTElaRUQpIHsKLQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkiJXM6IEZpcm13YXJlIHVuY2hhbmdlZCwgZm5hbWUgPSAlcywgc3NyX3R5cGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBjb3JlLT5mbmFtZSwgY29yZS0+c3NyX3R5cGUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoKLQkgKiBEaWZmZXJlbnQgZmlybXdhcmUgbmFtZSByZXF1ZXN0ZWQsCi0JICogUmUtbG9hZCB0aGUgaW5zdHJ1Y3Rpb24gc2VjdGlvbgotCSAqLwotCXN0cmxjcHkodGVtcF9pbWdfbmFtZSwgY29yZS0+Zm5hbWUsCi0JCVdDRF9DUEVfSU1BR0VfRk5BTUVfTUFYKTsKLQlzdHJsY3B5KGNvcmUtPmZuYW1lLCBjb3JlLT5keW5fZm5hbWUsCi0JCVdDRF9DUEVfSU1BR0VfRk5BTUVfTUFYKTsKLQotCXJjID0gd2NkX2NwZV9sb2FkX2Z3KGNvcmUsIEVMRl9GTEFHX0VYRUNVVEUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGRsb2FkIG5ldyBpbWFnZSAlcywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgY29yZS0+Zm5hbWUsIHJjKTsKLQkJLyogSWYgbmV3IGltYWdlIGRvd25sb2FkIGZhaWxlZCwgcmV2ZXJ0IGJhY2sgdG8gb2xkIGltYWdlICovCi0JCXN0cmxjcHkoY29yZS0+Zm5hbWUsIHRlbXBfaW1nX25hbWUsCi0JCQlXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCk7Ci0JCXJjID0gd2NkX2NwZV9sb2FkX2Z3KGNvcmUsIEVMRl9GTEFHX0VYRUNVVEUpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byByZS1kbG9hZCBpbWFnZSAlcywgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGNvcmUtPmZuYW1lLCByYyk7Ci0JfSBlbHNlIHsKLQkJZGV2X2luZm8oY29yZS0+ZGV2LCAiJXM6IGZ3IGNoYW5nZWQgdG8gJXNcbiIsCi0JCQkgX19mdW5jX18sIGNvcmUtPmZuYW1lKTsKLQl9Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX2VuYWJsZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChlbmFibGUpIHsKLQkJLyogUmVzZXQgQ1BFIGZpcnN0ICovCi0JCXJldCA9IGNwZV9zdmNfcmVzZXQoY29yZS0+Y3BlX2hhbmRsZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IENQRSBSZXNldCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlyZXQgPSB3Y2RfY3BlX3NldHVwX2lycXMoY29yZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogQ1BFIElSUXMgc2V0dXAgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXJldCA9IHdjZF9jcGVfY2hlY2tfbmV3X2ltYWdlKGNvcmUpOwotCQlpZiAocmV0KQotCQkJZ290byBmYWlsX2Jvb3Q7Ci0KLQkJLyogRGxvYWQgZGF0YSBzZWN0aW9uICovCi0JCXJldCA9IHdjZF9jcGVfbG9hZF9mdyhjb3JlLCBFTEZfRkxBR19SVyk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIGRsb2FkIGRhdGEgc2VjdGlvbiwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGZhaWxfYm9vdDsKLQkJfQotCi0JCXJldCA9IHdjZF9jcGVfZW5hYmxlX2NwZV9jbGtzKGNvcmUsIHRydWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiBDUEUgY2xrIGVuYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBmYWlsX2Jvb3Q7Ci0JCX0KLQotCQlyZXQgPSBjcGVfc3ZjX2Jvb3QoY29yZS0+Y3BlX2hhbmRsZSwKLQkJCQkgICBjb3JlLT5jcGVfZGVidWdfbW9kZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBib290IENQRVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWxfYm9vdDsKLQkJfQotCi0JCS8qIHdhaXQgZm9yIENQRSB0byBiZSBvbmxpbmUgKi8KLQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkiJXM6IHdhaXRpbmcgZm9yIENQRSBib290dXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmY29yZS0+b25saW5lX2NvbXBsKTsKLQotCQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJCSIlczogQ1BFIGJvb3R1cCBkb25lXG4iLAotCQkJX19mdW5jX18pOwotCi0JCWNvcmUtPnNzcl90eXBlID0gV0NEX0NQRV9FTkFCTEVEOwotCX0gZWxzZSB7Ci0JCWlmIChjb3JlLT5zc3JfdHlwZSA9PSBXQ0RfQ1BFX0JVU19ET1dOX0VWRU5UIHx8Ci0JCSAgICBjb3JlLT5zc3JfdHlwZSA9PSBXQ0RfQ1BFX1NTUl9FVkVOVCkgewotCQkJLyoKLQkJCSAqIElmIHRoaXMgZGlzYWJsZSB2b3RlIGlzIHdoZW4KLQkJCSAqIFNTUiBpcyBpbiBwcm9ncmVzcywgZG8gbm90IGRpc2FibGUgQ1BFIGhlcmUsCi0JCQkgKiBpbnN0ZWFkIFNTUiBoYW5kbGVyIHdpbGwgY29udHJvbCBDUEUuCi0JCQkgKi8KLQkJCXdjZF9jcGVfZW5hYmxlX2NwZV9jbGtzKGNvcmUsIGZhbHNlKTsKLQkJCXdjZF9jcGVfY2xlYW51cF9pcnFzKGNvcmUpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcmV0ID0gY3BlX3N2Y19zaHV0ZG93bihjb3JlLT5jcGVfaGFuZGxlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogQ1BFIHNodXRkb3duIGZhaWxlZCwgZXJyb3IgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQl3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCBmYWxzZSk7Ci0JCXdjZF9jcGVfY2xlYW51cF9pcnFzKGNvcmUpOwotCQljb3JlLT5zc3JfdHlwZSA9IFdDRF9DUEVfSU1FTV9ET1dOTE9BREVEOwotCX0KLQotCXJldHVybiByZXQ7Ci0KLWZhaWxfYm9vdDoKLQl3Y2RfY3BlX2NsZWFudXBfaXJxcyhjb3JlKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9ib290X3NzcjogTG9hZCB0aGUgaW1hZ2VzIHRvIENQRSBhZnRlciBzc3IgYW5kIGJvb3R1cCBjcGUKLSAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2Jvb3Rfc3NyKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghY29yZSB8fCAhY29yZS0+Y3BlX2hhbmRsZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogTG9hZCB0aGUgaW5zdHJ1Y3Rpb24gc2VjdGlvbiBhbmQgbWFyayBDUEUgYXMgb25saW5lICovCi0JcmMgPSB3Y2RfY3BlX2xvYWRfZncoY29yZSwgRUxGX0ZMQUdfRVhFQ1VURSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gbG9hZCBpbnN0cnVjdGlvbiwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJd2NkX2NwZV9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvcmUsIDEpOwotCX0KLQotZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2Nscl9yZWFkeV9zdGF0dXM6Ci0gKglDbGVhciB0aGUgdmFsdWUgZnJvbSB0aGUgcmVhZHkgc3RhdHVzIGZvciBDUEUKLSAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKLSAqIEB2YWx1ZTogZmxhZy9iaXRtYXNrIHRoYXQgaXMgdG8gYmUgY2xlYXJlZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBpbnZva2VkIHdpdGggc3NyX2xvY2sgYWNxdWlyZWQKLSAqLwotc3RhdGljIHZvaWQgd2NkX2NwZV9jbHJfcmVhZHlfc3RhdHVzKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCQkgICAgICAgdTggdmFsdWUpCi17Ci0JV0NEX0NQRV9HUkFCX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7Ci0JY29yZS0+cmVhZHlfc3RhdHVzICY9IH4odmFsdWUpOwotCWRldl9kYmcoY29yZS0+ZGV2LAotCQkiJXM6IHJlYWR5X3N0YXR1cyA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCBjb3JlLT5yZWFkeV9zdGF0dXMpOwotCVdDRF9DUEVfUkVMX0xPQ0soJmNvcmUtPnNzcl9sb2NrLCAiU1NSIik7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3NldF9hbmRfY29tcGxldGU6Ci0gKglTZXQgdGhlIHJlYWR5IHN0YXR1cyB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQKLSAqCWZsYWcgdGhlIGNvbXBsZXRpb24gb2JqZWN0IGlmIHJlYWR5IHN0YXR1cyBtb3ZlcwotICoJdG8gcmVhZHkgdG8gZG93bmxvYWQKLSAqIEBjb3JlOiBoYW5kbGUgdG8gdGhlIGNvcmUKLSAqIEB2YWx1ZTogZmxhZy9iaXRtYXNrIHRoYXQgaXMgdG8gYmUgc2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHdjZF9jcGVfc2V0X2FuZF9jb21wbGV0ZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQkJCXU4IHZhbHVlKQotewotCVdDRF9DUEVfR1JBQl9MT0NLKCZjb3JlLT5zc3JfbG9jaywgIlNTUiIpOwotCWNvcmUtPnJlYWR5X3N0YXR1cyB8PSB2YWx1ZTsKLQlpZiAoKGNvcmUtPnJlYWR5X3N0YXR1cyAmIFdDRF9DUEVfUkVBRFlfVE9fRExPQUQpID09Ci0JICAgIFdDRF9DUEVfUkVBRFlfVE9fRExPQUQpIHsKLQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkiJXM6IG1hcmtpbmcgcmVhZHksIHN0YXR1cyA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgY29yZS0+cmVhZHlfc3RhdHVzKTsKLQkJY29tcGxldGUoJmNvcmUtPnJlYWR5X2NvbXBsKTsKLQl9Ci0JV0NEX0NQRV9SRUxfTE9DSygmY29yZS0+c3NyX2xvY2ssICJTU1IiKTsKLX0KLQotCi0vKgotICogd2NkX2NwZV9zc3Jfd29yazogd29yayBmdW5jdGlvbiB0byBoYW5kbGUgQ1BFIFNTUgotICogQHdvcms6IHdvcmsgdGhhdCBpcyBzY2hlZHVsZWQgdG8gcGVyZm9ybSBDUEUgc2h1dGRvd24KLSAqCWFuZCByZXN0YXJ0Ci0gKi8KLXN0YXRpYyB2b2lkIHdjZF9jcGVfc3NyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCi0JaW50IHJjID0gMDsKLQl1MzIgaXJxID0gMDsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gTlVMTDsKLQl1OCBzdGF0dXMgPSAwOwotCi0JY29yZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2NkX2NwZV9jb3JlLCBzc3Jfd29yayk7Ci0JaWYgKCFjb3JlKSB7Ci0JCXByX2VycigiJXM6IENvcmUgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE9idGFpbiBwbSByZXF1ZXN0IHVwIGluIGNhc2Ugb2Ygc3VzcGVuZCBtb2RlICovCi0JcG1fcW9zX2FkZF9yZXF1ZXN0KCZjb3JlLT5wbV9xb3NfcmVxLAotCQkJICAgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKLQkJCSAgIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmNvcmUtPnBtX3Fvc19yZXEsCi0JCQltc21fY3B1aWRsZV9nZXRfZGVlcF9pZGxlX2xhdGVuY3koKSk7Ci0KLQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJIiVzOiBDUEUgU1NSIHdpdGggZXZlbnQgJWRcbiIsCi0JCV9fZnVuY19fLCBjb3JlLT5zc3JfdHlwZSk7Ci0KLQlpZiAoY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9TU1JfRVZFTlQpIHsKLQkJaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQotCQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKLQkJCQkJY29yZS0+Y29kZWMsCi0JCQkJCUNQRV9FUlJfSVJRX1NUQVRVUywKLQkJCQkJJnN0YXR1cyk7Ci0JCWlmIChzdGF0dXMgJiBjb3JlLT5pcnFfaW5mby5jcGVfZmF0YWxfaXJxcykKLQkJCWlycSA9IENQRV9JUlFfV0RPR19CSVRFOwotCX0gZWxzZSB7Ci0JCS8qIElmIGJ1cyBpcyBkb3duLCBjZGMgcmVnIGNhbm5vdCBiZSByZWFkICovCi0JCWlycSA9IENQRV9JUlFfV0RPR19CSVRFOwotCX0KLQotCWlmIChjb3JlLT5jcGVfdXNlcnMgPiAwKSB7Ci0JCXJjID0gY3BlX3N2Y19wcm9jZXNzX2lycShjb3JlLT5jcGVfaGFuZGxlLCBpcnEpOwotCQlpZiAocmMgPCAwKQotCQkJLyoKLQkJCSAqIEV2ZW4gaWYgcHJvY2Vzc19pcnEgZmFpbHMsCi0JCQkgKiB3YWl0IGZvciBjcGUgdG8gbW92ZSB0byBvZmZsaW5lIHN0YXRlCi0JCQkgKi8KLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogaXJxIHByb2Nlc3NpbmcgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0KLQkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvcmUtPm9mZmxpbmVfY29tcGwsCi0JCQkJCQkgQ1BFX09GRkxJTkVfV0FJVF9USU1FT1VUKTsKLQkJaWYgKCFyYykgewotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiB3YWl0IGZvciBjcGUgb2ZmbGluZSB0aW1lZCBvdXRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBlcnJfcmV0OwotCQl9Ci0JCWlmIChjb3JlLT5zc3JfdHlwZSAhPSBXQ0RfQ1BFX0JVU19ET1dOX0VWRU5UKSB7Ci0JCQl3Y2RfY3BlX2dldF9zZnJfZHVtcChjb3JlKTsKLQotCQkJLyoKLQkJCSAqIFJhbWR1bXAgaGFzIHRvIGJlIGV4cGxpY2l0bHkgZW5hYmxlZAotCQkJICogdGhyb3VnaCBkZWJ1Z2ZzIGFuZCBjYW5ub3QgYmUgY29sbGVjdGVkCi0JCQkgKiB3aGVuIGJ1cyBpcyBkb3duLgotCQkJICovCi0JCQlpZiAocmFtZHVtcF9lbmFibGUpCi0JCQkJd2NkX2NwZV9jb2xsZWN0X3JhbWR1bXAoY29yZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBubyBjcGUgdXNlcnMsIG1hcmsgYXMgb2ZmbGluZVxuIiwgX19mdW5jX18pOwotCQl3Y2RfY3BlX2NoYW5nZV9vbmxpbmVfc3RhdGUoY29yZSwgMCk7Ci0JCXdjZF9jcGVfc2V0X2FuZF9jb21wbGV0ZShjb3JlLAotCQkJCQkgV0NEX0NQRV9CTEtfUkVBRFkpOwotCX0KLQotCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb3JlLT5yZWFkeV9jb21wbCwKLQkJCQkJIENQRV9SRUFEWV9XQUlUX1RJTUVPVVQpOwotCWlmICghcmMpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IHJlYWR5IHRvIG9ubGluZSB0aW1lZCBvdXQsIHN0YXR1cyA9ICV1XG4iLAotCQkJX19mdW5jX18sIGNvcmUtPnJlYWR5X3N0YXR1cyk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlyYyA9IHdjZF9jcGVfYm9vdF9zc3IoY29yZSk7Ci0KLQkvKiBPbmNlIGltYWdlIGFyZSBkb3dubG9hZGVkIG1ha2Ugc3VyZSBhbGwKLQkgKiBlcnJvciBpbnRlcnJ1cHRzIGFyZSBjbGVhcmVkCi0JICovCi0JaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQotCQljb3JlLT5jcGVfY2RjX2NiLT5jcGVfZXJyX2lycV9jb250cm9sKGNvcmUtPmNvZGVjLAotCQkJCQlDUEVfRVJSX0lSUV9DTEVBUiwgTlVMTCk7Ci0KLWVycl9yZXQ6Ci0JLyogcmVtb3ZlIGFmdGVyIGRlZmF1bHQgcG0gcW9zICovCi0JcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZjb3JlLT5wbV9xb3NfcmVxLAotCQkJICAgICAgUE1fUU9TX0RFRkFVTFRfVkFMVUUpOwotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmY29yZS0+cG1fcW9zX3JlcSk7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3Nzcl9oYW5kbGU6IGhhbmRsZSBTU1IgZXZlbnRzIGhlcmUuCi0gKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgY3BlIGNvcmUKLSAqIEBldmVudDogaW5kaWNhdGVzIEFEU1Agb3IgQ0RTUCBTU1IuCi0gKi8KLWludCB3Y2RfY3BlX3Nzcl9ldmVudCh2b2lkICpjb3JlX2hhbmRsZSwKLQkJICAgICAgZW51bSB3Y2RfY3BlX3Nzcl9zdGF0ZV9ldmVudCBldmVudCkKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0KLQlpZiAoIWNvcmUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gY29yZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBJZiBDUEUgaXMgbm90IGV2ZW4gZW5hYmxlZCwgdGhlIFNTUiBldmVudCBmb3IKLQkgKiBDUEUgbmVlZHMgdG8gYmUgaWdub3JlZAotCSAqLwotCWlmIChjb3JlLT5zc3JfdHlwZSA9PSBXQ0RfQ1BFX0lOSVRJQUxJWkVEKSB7Ci0JCWRldl9pbmZvKGNvcmUtPmRldiwKLQkJCSIlczogQ1BFIGluaXRpYWxpemVkIGJ1dCBub3QgZW5hYmxlZCwgc2tpcCBDUEUgc3NyXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZGV2X2RiZyhjb3JlLT5kZXYsCi0JCSIlczogU2NoZWR1bGUgc3NyIHdvcmssIGV2ZW50ID0gJWRcbiIsCi0JCV9fZnVuY19fLCBjb3JlLT5zc3JfdHlwZSk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBXQ0RfQ1BFX0JVU19ET1dOX0VWRU5UOgotCQkvKgotCQkgKiBJZiBidXMgZG93biwgdGhlbiBDUEUgYmxvY2sgaXMgYWxzbwotCQkgKiB0cmVhdGVkIHRvIGJlIGRvd24KLQkJICovCi0JCXdjZF9jcGVfY2xyX3JlYWR5X3N0YXR1cyhjb3JlLCBXQ0RfQ1BFX1JFQURZX1RPX0RMT0FEKTsKLQkJY29yZS0+c3NyX3R5cGUgPSBldmVudDsKLQkJc2NoZWR1bGVfd29yaygmY29yZS0+c3NyX3dvcmspOwotCQlicmVhazsKLQotCWNhc2UgV0NEX0NQRV9TU1JfRVZFTlQ6Ci0JCXdjZF9jcGVfY2xyX3JlYWR5X3N0YXR1cyhjb3JlLCBXQ0RfQ1BFX0JMS19SRUFEWSk7Ci0JCWNvcmUtPnNzcl90eXBlID0gZXZlbnQ7Ci0JCXNjaGVkdWxlX3dvcmsoJmNvcmUtPnNzcl93b3JrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdDRF9DUEVfQlVTX1VQX0VWRU5UOgotCQl3Y2RfY3BlX3NldF9hbmRfY29tcGxldGUoY29yZSwgV0NEX0NQRV9CVVNfUkVBRFkpOwotCQkvKgotCQkgKiBJbiBjYXNlIG9mIGJ1cyB1cCBldmVudCBzc3JfdHlwZSB3aWxsIGJlIGNoYW5nZWQKLQkJICogdG8gV0NEX0NQRV9BQ1RJVkUgb25jZSBDUEUgaXMgb25saW5lCi0JCSAqLwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiB1bmhhbmRsZWQgU1NSIGV2ZW50ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9jcGVfc3NyX2V2ZW50KTsKLQotLyoKLSAqIHN2YXNzX2V4Y2VwdGlvbl9pcnE6IHRocmVhZGVkIGlycSBoYW5kbGVyIGZvciBzdmEgZXJyb3IgaW50ZXJydXB0cwotICogQGlycTogaW50ZXJydXB0IG51bWJlcgotICogQGRhdGE6IGRhdGEgcG9pbnRlciBwYXNzZWQgZHVyaW5nIGlycSByZWdpc3RyYXRpb24KLSAqCi0gKiBPbmNlIGEgZXJyb3IgaW50ZXJydXB0IGlzIHJlY2VpdmVkLCBpdCBpcyBub3QgY2xlYXJlZCwgc2luY2UKLSAqIGNsZWFyaW5nIHRoaXMgaW50ZXJydXB0IHdpbGwgcmFpc2Ugc3B1cmlvdXMgaW50ZXJydXB0cyB1bmxlc3MKLSAqIENQRSBpcyByZXNldC4KLSAqLwotc3RhdGljIGlycXJldHVybl90IHN2YXNzX2V4Y2VwdGlvbl9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gZGF0YTsKLQl1OCBzdGF0dXMgPSAwOwotCi0JaWYgKCFjb3JlIHx8ICFDUEVfRVJSX0lSUV9DQihjb3JlKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICAoIWNvcmUpID8gImNvcmUiIDogImNkYyBjb250cm9sIik7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQljb3JlLT5jcGVfY2RjX2NiLT5jcGVfZXJyX2lycV9jb250cm9sKGNvcmUtPmNvZGVjLAotCQkJQ1BFX0VSUl9JUlFfU1RBVFVTLCAmc3RhdHVzKTsKLQotCXdoaWxlIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzICYgY29yZS0+aXJxX2luZm8uY3BlX2ZhdGFsX2lycXMpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogQ1BFIFNTUiBldmVudCxlcnJfc3RhdHVzID0gMHglMDJ4XG4iLAotCQkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQkJd2NkX2NwZV9zc3JfZXZlbnQoY29yZSwgV0NEX0NQRV9TU1JfRVZFTlQpOwotCQkJLyoKLQkJCSAqIElmIGZhdGFsIGludGVycnVwdCBpcyByZWNlaXZlZCwKLQkJCSAqIHRyaWdnZXIgU1NSIGFuZCBzdG9wIHByb2Nlc3NpbmcKLQkJCSAqIGZ1cnRoZXIgaW50ZXJydXB0cwotCQkJICovCi0JCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiBNYXNrIHRoZSBpbnRlcnJ1cHQgdGhhdCB3YXMgcmFpc2VkIHRvCi0JCSAqIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMKLQkJICovCi0JCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woY29yZS0+Y29kZWMsCi0JCQkJCUNQRV9FUlJfSVJRX01BU0ssICZzdGF0dXMpOwotCi0JCS8qIENsZWFyIG9ubHkgdGhlIGludGVycnVwdCB0aGF0IHdhcyByYWlzZWQgKi8KLQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbChjb3JlLT5jb2RlYywKLQkJCQkJQ1BFX0VSUl9JUlFfQ0xFQVIsICZzdGF0dXMpOwotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogZXJyX2ludGVycnVwdCBzdGF0dXMgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0KLQkJLyogUmVhZCBzdGF0dXMgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAqLwotCQljb3JlLT5jcGVfY2RjX2NiLT5jcGVfZXJyX2lycV9jb250cm9sKGNvcmUtPmNvZGVjLAotCQkJCQlDUEVfRVJSX0lSUV9TVEFUVVMsICZzdGF0dXMpOwotCX0KLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfY21pX2FmZV9jYjogY2FsbGJhY2sgY2FsbGVkIG9uIHJlc3BvbnNlIHRvIGFmZSBjb21tYW5kcwotICogQHBhcmFtOiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgcmVzcG9uc2UgY29kZSwgZXRjCi0gKgotICogUHJvY2VzcyB0aGUgcmVxdWVzdCB0byB0aGUgY29tbWFuZCBzZW50IHRvIENQRSBhbmQgd2FrZXVwIHRoZQotICogY29tbWFuZCBzZW5kIHdhaXQuCi0gKi8KLXN0YXRpYyB2b2lkIHdjZF9jcGVfY21pX2FmZV9jYihjb25zdCBzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gKnBhcmFtKQotewotCXN0cnVjdCBjbWlfaGRyICpoZHI7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQl1OCBwb3J0X2lkOwotCi0JaWYgKCFwYXJhbSkgewotCQlwcl9lcnIoIiVzOiBwYXJhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGFyYW0tPmV2ZW50ICE9IENNSV9BUElfTVNHKSB7Ci0JCXByX2VycigiJXM6IHVuaGFuZGxlZCBldmVudCAweCV4XG4iLAotCQkJX19mdW5jX18sIHBhcmFtLT5ldmVudCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHBhcmFtLT5yZXN1bHQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBwYXJhbS0+cmVzdWx0KTsKLQotCWhkciA9IChzdHJ1Y3QgY21pX2hkciAqKSBwYXJhbS0+bWVzc2FnZTsKLQotCS8qCi0JICogZm9yIEFGRSBjbWQgcmVzcG9uc2UsIHBvcnQgaWQgaXMKLQkgKiBzdG9yZWQgYXQgc2Vzc2lvbiBpZCBmaWVsZCBvZiBoZWFkZXIKLQkgKi8KLQlwb3J0X2lkID0gQ01JX0hEUl9HRVRfU0VTU0lPTl9JRChoZHIpOwotCWlmIChwb3J0X2lkID4gV0NEX0NQRV9BRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcG9ydF9pZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuOwotCX0KLQotCWFmZV9wb3J0X2QgPSAmKGFmZV9wb3J0c1twb3J0X2lkXSk7Ci0KLQlpZiAoaGRyLT5vcGNvZGUgPT0gQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFKSB7Ci0KLQkJdTggKnBheWxvYWQgPSAoKHU4ICopcGFyYW0tPm1lc3NhZ2UpICsgKHNpemVvZihzdHJ1Y3QgY21pX2hkcikpOwotCQl1OCByZXN1bHQgPSBwYXlsb2FkWzBdOwotCi0JCWFmZV9wb3J0X2QtPmNtZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCWNvbXBsZXRlKCZhZmVfcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlKTsKLQotCX0gZWxzZSBpZiAoaGRyLT5vcGNvZGUgPT0gQ1BFX0FGRV9QT1JUX0NNRFJTUF9TSEFSRURfTUVNX0FMTE9DKSB7Ci0KLQkJc3RydWN0IGNwZV9jbWRyc3Bfc2htZW1fYWxsb2MgKmNtZHJzcF9zaG1lbV9hbGxvYyA9Ci0JCQkoc3RydWN0IGNwZV9jbWRyc3Bfc2htZW1fYWxsb2MgKikgcGFyYW0tPm1lc3NhZ2U7Ci0KLQkJaWYgKGNtZHJzcF9zaG1lbV9hbGxvYy0+YWRkciA9PSAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgQUZFIHNoYXJlZCBtZW0gYWxsb2NcbiIsIF9fZnVuY19fKTsKLQkJCWFmZV9wb3J0X2QtPmNtZF9yZXN1bHQgPSBDTUlfU0hNRU1fQUxMT0NfRkFJTEVEOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzIEFGRSBzaGFyZWQgbWVtIGFkZHIgPSAweCV4XG4iLAotCQkJCSBfX2Z1bmNfXywgY21kcnNwX3NobWVtX2FsbG9jLT5hZGRyKTsKLQkJCWFmZV9wb3J0X2QtPm1lbV9oYW5kbGUgPSBjbWRyc3Bfc2htZW1fYWxsb2MtPmFkZHI7Ci0JCQlhZmVfcG9ydF9kLT5jbWRfcmVzdWx0ID0gMDsKLQkJfQotCQljb21wbGV0ZSgmYWZlX3BvcnRfZC0+YWZlX2NtZF9jb21wbGV0ZSk7Ci0JfQotfQotCi0vKgotICogd2NkX2NwZV9pbml0aWFsaXplX2FmZV9wb3J0X2RhdGE6IEluaXRpYWxpemUgYWxsIEFGRSBwb3J0cwotICoKLSAqIEluaXRpYWxpemUgdGhlIGRhdGEgZm9yIGFsbCB0aGUgYWZlIHBvcnRzLiBBc3NpZ24gdGhlCi0gKiBhZmUgcG9ydCBzdGF0ZSB0byBJTklUIHN0YXRlLgotICovCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX2luaXRpYWxpemVfYWZlX3BvcnRfZGF0YSh2b2lkKQotewotCXN0cnVjdCB3Y2RfY21pX2FmZV9wb3J0X2RhdGEgKmFmZV9wb3J0X2Q7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IFdDRF9DUEVfQUZFX01BWF9QT1JUUzsgaSsrKSB7Ci0JCWFmZV9wb3J0X2QgPSAmYWZlX3BvcnRzW2ldOwotCQlhZmVfcG9ydF9kLT5wb3J0X2lkID0gaTsKLQkJaW5pdF9jb21wbGV0aW9uKCZhZmVfcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlKTsKLQkJYWZlX3BvcnRfZC0+cG9ydF9zdGF0ZSA9IEFGRV9QT1JUX1NUQVRFX0lOSVQ7Ci0JCW11dGV4X2luaXQoJmFmZV9wb3J0X2QtPmFmZV9sb2NrKTsKLQl9Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2RlaW5pdGlhbGl6ZV9hZmVfcG9ydF9kYXRhOiBEZS1pbml0aWFsaXplIGFsbCBBRkUgcG9ydHMKLSAqCi0gKiBEZS1Jbml0aWFsaXplIHRoZSBkYXRhIGZvciBhbGwgdGhlIGFmZSBwb3J0cy4gQXNzaWduIHRoZQotICogYWZlIHBvcnQgc3RhdGUgdG8gREVJTklUIHN0YXRlLgotICovCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX2RlaW5pdGlhbGl6ZV9hZmVfcG9ydF9kYXRhKHZvaWQpCi17Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gV0NEX0NQRV9BRkVfTUFYX1BPUlRTOyBpKyspIHsKLQkJYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbaV07Ci0JCWFmZV9wb3J0X2QtPnBvcnRfc3RhdGUgPSBBRkVfUE9SVF9TVEFURV9ERUlOSVQ7Ci0JCW11dGV4X2Rlc3Ryb3koJmFmZV9wb3J0X2QtPmFmZV9sb2NrKTsKLQl9Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3N2Y19ldmVudF9jYjogY2FsbGJhY2sgZnJvbSBjcGUgc2VydmljZXMsIGluZGljYXRpbmcKLSAqIENQRSBpcyBvbmxpbmUgb3Igb2ZmbGluZS4KLSAqIEBwYXJhbTogcGFyYW1ldGVyIC8gcGF5bG9hZCBmb3IgZXZlbnQgdG8gYmUgbm90aWZpZWQKLSAqLwotc3RhdGljIHZvaWQgd2NkX2NwZV9zdmNfZXZlbnRfY2IoY29uc3Qgc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXJhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZTsKLQlzdHJ1Y3QgY3BlX3N2Y19ib290X2V2ZW50ICpib290X2RhdGE7Ci0JYm9vbCBhY3RpdmVfc2Vzc2lvbnM7Ci0KLQlpZiAoIXBhcmFtKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgZXZlbnRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWNvZGVjID0gcGFyYW0tPnByaXZhdGVfZGF0YTsKLQlpZiAoIWNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvIGNvZGVjXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JY29yZSA9IHdjZF9jcGVfZ2V0X2NvcmVfaGFuZGxlKGNvZGVjKTsKLQlpZiAoIWNvcmUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBoYW5kbGUgdG8gY29yZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWRldl9kYmcoY29yZS0+ZGV2LAotCQkiJXM6IGV2ZW50ID0gMHgleCwgc3NyX3R5cGUgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgcGFyYW0tPmV2ZW50LCBjb3JlLT5zc3JfdHlwZSk7Ci0KLQlzd2l0Y2ggKHBhcmFtLT5ldmVudCkgewotCWNhc2UgQ1BFX1NWQ19CT09UOgotCQlib290X2RhdGEgPSAoc3RydWN0IGNwZV9zdmNfYm9vdF9ldmVudCAqKQotCQkJCXBhcmFtLT5wYXlsb2FkOwotCQljb3JlLT5zZnJfYnVmX2FkZHIgPSBib290X2RhdGEtPmRlYnVnX2FkZHJlc3M7Ci0JCWNvcmUtPnNmcl9idWZfc2l6ZSA9IGJvb3RfZGF0YS0+ZGVidWdfYnVmZmVyX3NpemU7Ci0JCWRldl9kYmcoY29yZS0+ZGV2LAotCQkJIiVzOiBDUEUgYm9vdGVkLCBzZnJfYWRkciA9ICVkLCBzZnJfc2l6ZSA9ICV6dVxuIiwKLQkJCV9fZnVuY19fLCBjb3JlLT5zZnJfYnVmX2FkZHIsCi0JCQljb3JlLT5zZnJfYnVmX3NpemUpOwotCQlicmVhazsKLQljYXNlIENQRV9TVkNfT05MSU5FOgotCQljb3JlLT5zc3JfdHlwZSA9IFdDRF9DUEVfQUNUSVZFOwotCQlkZXZfZGJnKGNvcmUtPmRldiwgIiVzIENQRSBpcyBub3cgb25saW5lXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJY29tcGxldGUoJmNvcmUtPm9ubGluZV9jb21wbCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BFX1NWQ19PRkZMSU5FOgotCQkvKgotCQkgKiBvZmZsaW5lIGNhbiBoYXBwZW4gZHVyaW5nIG5vcm1hbCBzaHV0ZG93biwKLQkJICogYnV0IHdlIGFyZSBpbnRlcmVzdGVkIGluIG9mZmxpbmUgb25seSBkdXJpbmcKLQkJICogU1NSLgotCQkgKi8KLQkJaWYgKGNvcmUtPnNzcl90eXBlICE9IFdDRF9DUEVfU1NSX0VWRU5UICYmCi0JCSAgICBjb3JlLT5zc3JfdHlwZSAhPSBXQ0RfQ1BFX0JVU19ET1dOX0VWRU5UKQotCQkJYnJlYWs7Ci0KLQkJYWN0aXZlX3Nlc3Npb25zID0gd2NkX2NwZV9sc21fc2Vzc2lvbl9hY3RpdmUoKTsKLQkJd2NkX2NwZV9jaGFuZ2Vfb25saW5lX3N0YXRlKGNvcmUsIDApOwotCQljb21wbGV0ZSgmY29yZS0+b2ZmbGluZV9jb21wbCk7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IENQRSBpcyBub3cgb2ZmbGluZVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BFX1NWQ19DTUlfQ0xJRU5UU19ERVJFRzoKLQotCQkvKgotCQkgKiBPbmx5IHdoZW4gZWl0aGVyIENQRSBTU1IgaXMgaW4gcHJvZ3Jlc3MsCi0JCSAqIG9yIHRoZSBidXMgaXMgZG93biwgd2UgbmVlZCB0byBtYXJrIHRoZSBDUEUKLQkJICogYXMgcmVhZHkuIEluIGFsbCBvdGhlciBjYXNlcywgdGhpcyBldmVudCBpcwotCQkgKiBpZ25vcmVkCi0JCSAqLwotCQlpZiAoY29yZS0+c3NyX3R5cGUgPT0gV0NEX0NQRV9TU1JfRVZFTlQgfHwKLQkJICAgIGNvcmUtPnNzcl90eXBlID09IFdDRF9DUEVfQlVTX0RPV05fRVZFTlQpCi0JCQl3Y2RfY3BlX3NldF9hbmRfY29tcGxldGUoY29yZSwKLQkJCQkJCSBXQ0RfQ1BFX0JMS19SRUFEWSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiB1bmhhbmRsZWQgbm90aWZpY2F0aW9uXG4iLAotCQkJX19mdW5jX18pOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2NsZWFudXBfaXJxczogZnJlZSB0aGUgaXJxIHJlc291cmNlcyByZXF1aXJlZCBieSBjcGUKLSAqIEBjb3JlOiBoYW5kbGUgdGhlIGNwZSBjb3JlCi0gKgotICogVGhpcyBBUEkgd2lsbCBmcmVlIHRoZSBJUlFzIGZvciBDUEUgYnV0IGRvZXMgbm90IG1hc2sgdGhlCi0gKiBDUEUgaW50ZXJydXB0cy4gSWYgbWFza2luZyBpcyBuZWVkZWQsIGl0IGhhcyB0byBiZSBkb25lCi0gKiBleHBsaWNpdHkgYnkgY2FsbGVyLgotICovCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX2NsZWFudXBfaXJxcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKQotewotCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29yZS0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9ICZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQotCXdjZDl4eHhfZnJlZV9pcnEoY29yZV9yZXMsCi0JCQkgY29yZS0+aXJxX2luZm8uY3BlX2VuZ2luZV9pcnEsCi0JCQkgY29yZSk7Ci0Jd2NkOXh4eF9mcmVlX2lycShjb3JlX3JlcywKLQkJCSBjb3JlLT5pcnFfaW5mby5jcGVfZXJyX2lycSwKLQkJCSBjb3JlKTsKLQotfQotCi0vKgotICogd2NkX2NwZV9zZXR1cF9zdmFfZXJyX2ludHI6IHNldHVwIHRoZSBpcnFzIGZvciBDUEUKLSAqIEBjb3JlOiBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCi0gKiBBbGwgaW50ZXJydXB0cyBuZWVkZWQgZm9yIENQRSBhcmUgYWNxdWlyZWQuIElmIGFueQotICogcmVxdWVzdF9pcnEgZmFpbHMsIHRoZW4gYWxsIGlycXMgYXJlIGZyZWUnZAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfc2V0dXBfaXJxcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29yZS0+Y29kZWM7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlzdHJ1Y3Qgd2NkOXh4eF9jb3JlX3Jlc291cmNlICpjb3JlX3JlcyA9ICZ3Y2Q5eHh4LT5jb3JlX3JlczsKLQotCXJldCA9IHdjZDl4eHhfcmVxdWVzdF9pcnEoY29yZV9yZXMsCi0JCQkJICBjb3JlLT5pcnFfaW5mby5jcGVfZW5naW5lX2lycSwKLQkJCQkgIHN2YXNzX2VuZ2luZV9pcnEsICJTVkFTU19FbmdpbmUiLCBjb3JlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBzdmFzcyBlbmdpbmUgaXJxXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGZhaWxfZW5naW5lX2lycTsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgYWxsIGVycm9yIGludGVycnVwdHMgYXJlIGNsZWFyZWQgKi8KLQlpZiAoQ1BFX0VSUl9JUlFfQ0IoY29yZSkpCi0JCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woCi0JCQkJCWNvcmUtPmNvZGVjLAotCQkJCQlDUEVfRVJSX0lSUV9DTEVBUiwKLQkJCQkJTlVMTCk7Ci0KLQkvKiBFbmFibGUgcmVxdWlyZWQgZXJyb3IgaW50ZXJydXB0cyAqLwotCWlmIChDUEVfRVJSX0lSUV9DQihjb3JlKSkKLQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKLQkJCQkJY29yZS0+Y29kZWMsCi0JCQkJCUNQRV9FUlJfSVJRX1VOTUFTSywKLQkJCQkJTlVMTCk7Ci0KLQlyZXQgPSB3Y2Q5eHh4X3JlcXVlc3RfaXJxKGNvcmVfcmVzLAotCQkJCSAgY29yZS0+aXJxX2luZm8uY3BlX2Vycl9pcnEsCi0JCQkJICBzdmFzc19leGNlcHRpb25faXJxLCAiU1ZBU1NfRXhjZXB0aW9uIiwgY29yZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIHJlcXVlc3Qgc3Zhc3MgZXJyIGlycVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBmYWlsX2V4Y2VwdGlvbl9pcnE7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfZXhjZXB0aW9uX2lycToKLQl3Y2Q5eHh4X2ZyZWVfaXJxKGNvcmVfcmVzLAotCQkJIGNvcmUtPmlycV9pbmZvLmNwZV9lbmdpbmVfaXJxLCBjb3JlKTsKLQotZmFpbF9lbmdpbmVfaXJxOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9nZXRfY2FsX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCi17Ci0JaW50IGNhbF9pbmRleCA9IC1FSU5WQUw7Ci0KLQlpZiAoY2FsX3R5cGUgPT0gVUxQX0FGRV9DQUxfVFlQRSkKLQkJY2FsX2luZGV4ID0gV0NEX0NQRV9MU01fQ0FMX0FGRTsKLQllbHNlIGlmIChjYWxfdHlwZSA9PSBVTFBfTFNNX0NBTF9UWVBFKQotCQljYWxfaW5kZXggPSBXQ0RfQ1BFX0xTTV9DQUxfTFNNOwotCWVsc2UgaWYgKGNhbF90eXBlID09IFVMUF9MU01fVE9QT0xPR1lfSURfQ0FMX1RZUEUpCi0JCWNhbF9pbmRleCA9IFdDRF9DUEVfTFNNX0NBTF9UT1BPTE9HWV9JRDsKLQllbHNlCi0JCXByX2VycigiJXM6IGludmFsaWQgY2FsX3R5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUpOwotCi0JcmV0dXJuIGNhbF9pbmRleDsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX2FsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQljYWxfaW5kZXggPSB3Y2RfY3BlX2dldF9jYWxfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgY2FsdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19hbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAotCQkJCSAgY29yZV9kLT5jYWxfZGF0YVtjYWxfaW5kZXhdLAotCQkJCSAgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCSAgIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCWNhbF9pbmRleCA9IHdjZF9jcGVfZ2V0X2NhbF9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBjYWx0eXBlICVkXG4iLAotCQkJX19mdW5jX18sIGNhbF90eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gY2FsX3V0aWxzX2RlYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJCQkgICAgY29yZV9kLT5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JY2FsX2luZGV4ID0gd2NkX2NwZV9nZXRfY2FsX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbHR5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCQkJY29yZV9kLT5jYWxfZGF0YVtjYWxfaW5kZXhdLAotCQkJCTAsIE5VTEwpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfc2V0X2NhbCBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfY2FsX2luaXQoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN0cnVjdCBjYWxfdHlwZV9pbmZvIGNhbF90eXBlX2luZm9bXSA9IHsKLQkJe3tVTFBfQUZFX0NBTF9UWVBFLAotCQkge3djZF9jcGVfYWxsb2NfY2FsLCB3Y2RfY3BlX2RlYWxsb2NfY2FsLCBOVUxMLAotCQkgIHdjZF9jcGVfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7VUxQX0xTTV9DQUxfVFlQRSwKLQkJIHt3Y2RfY3BlX2FsbG9jX2NhbCwgd2NkX2NwZV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJICB3Y2RfY3BlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCSB7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tVTFBfTFNNX1RPUE9MT0dZX0lEX0NBTF9UWVBFLAotCQkge3djZF9jcGVfYWxsb2NfY2FsLCB3Y2RfY3BlX2RlYWxsb2NfY2FsLCBOVUxMLAotCQkgIHdjZF9jcGVfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJIHtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQl9OwotCi0JcmV0ID0gY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoV0NEX0NQRV9MU01fQ0FMX01BWCwKLQkJCQkJIGNvcmUtPmNhbF9kYXRhLAotCQkJCQkgY2FsX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBjcmVhdGUgY2FsIHR5cGUhXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2VuYWJsZTogc2V0dXAgdGhlIGNwZSBpbnRlcnJ1cHRzIGFuZCBzY2hlZHVsZQotICoJdGhlIHdvcmsgdG8gZG93bmxvYWQgaW1hZ2UgYW5kIGJvb3R1cCB0aGUgQ1BFLgotICogY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfdm90ZShzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY29yZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byBjb3JlXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGV2X2RiZyhjb3JlLT5kZXYsCi0JCSIlczogZW50ZXIsIGVuYWJsZSA9ICVzLCBjcGVfdXNlcnMgPSAldVxuIiwKLQkJX19mdW5jX18sIChlbmFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiKSwKLQkJY29yZS0+Y3BlX3VzZXJzKTsKLQotCWlmIChlbmFibGUpIHsKLQkJY29yZS0+Y3BlX3VzZXJzKys7Ci0JCWlmIChjb3JlLT5jcGVfdXNlcnMgPT0gMSkgewotCQkJcmV0ID0gd2NkX2NwZV9lbmFibGUoY29yZSwgZW5hYmxlKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkJIiVzOiBDUEUgZW5hYmxlIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoY29yZS0+ZGV2LAotCQkJCSIlczogY3BlIGFscmVhZHkgZW5hYmxlZCwgdXNlcnMgPSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgY29yZS0+Y3BlX3VzZXJzKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWNvcmUtPmNwZV91c2Vycy0tOwotCQlpZiAoY29yZS0+Y3BlX3VzZXJzID09IDApIHsKLQkJCXJldCA9IHdjZF9jcGVfZW5hYmxlKGNvcmUsIGVuYWJsZSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJCSIlczogQ1BFIGRpc2FibGUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkJIiVzOiAldSB2YWxpZCB1c2VycyBvbiBjcGVcbiIsCi0JCQkJX19mdW5jX18sIGNvcmUtPmNwZV91c2Vycyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJIiVzOiBsZWF2ZSwgZW5hYmxlID0gJXMsIGNwZV91c2VycyA9ICV1XG4iLAotCQlfX2Z1bmNfXywgKGVuYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLAotCQljb3JlLT5jcGVfdXNlcnMpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9kZWJ1Z2ZzX2luaXQoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3RydWN0IGRlbnRyeSAqZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ3Y2RfY3BlIiwgTlVMTCk7Ci0KLQlpZiAoSVNfRVJSX09SX05VTEwoZGlyKSkgewotCQlkaXIgPSBOVUxMOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2NyZWF0ZV9kaXI7Ci0JfQotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJhbWR1bXBfZW5hYmxlIiwgMDY0NCwKLQkJCQlkaXIsICZyYW1kdW1wX2VuYWJsZSkpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIG5vZGUgJXNcbiIsCi0JCQlfX2Z1bmNfXywgInJhbWR1bXBfZW5hYmxlIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJfY3JlYXRlX2VudHJ5OwotCX0KLQotCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiY3BlX2Z0bV90ZXN0X3RyaWdnZXIiLCAwMjAwLAotCQkJCWRpciwgY29yZSwgJmNwZV9mdG1fdGVzdF90cmlnZ2VyX2ZvcHMpKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LCAiJXM6IEZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBub2RlICVzXG4iLAotCQkJX19mdW5jX18sICJjcGVfZnRtX3Rlc3RfdHJpZ2dlciIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2NyZWF0ZV9lbnRyeTsKLQl9Ci0KLQlpZiAoIWRlYnVnZnNfY3JlYXRlX3UzMigiY3BlX2Z0bV90ZXN0X3N0YXR1cyIsIDA0NDQsCi0JCQkJZGlyLCAmY3BlX2Z0bV90ZXN0X3N0YXR1cykpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIG5vZGUgJXNcbiIsCi0JCQlfX2Z1bmNfXywgImNwZV9mdG1fdGVzdF9zdGF0dXMiKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGVycl9jcmVhdGVfZW50cnk7Ci0JfQotCi1lcnJfY3JlYXRlX2VudHJ5OgotCWRlYnVnZnNfcmVtb3ZlKGRpcik7Ci0KLWVycl9jcmVhdGVfZGlyOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgZndfbmFtZV9zaG93KHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCwgIiVzIiwKLQkJCWNvcmUtPmR5bl9mbmFtZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZ3X25hbWVfc3RvcmUoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQkJY29uc3QgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQotewotCWludCBjb3B5X2NvdW50ID0gY291bnQ7Ci0JY29uc3QgY2hhciAqcG9zOwotCi0JcG9zID0gbWVtY2hyKGJ1ZiwgJ1xuJywgY291bnQpOwotCWlmIChwb3MpCi0JCWNvcHlfY291bnQgPSBwb3MgLSBidWY7Ci0KLQlpZiAoY29weV9jb3VudCA+IChXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWCAtIDEpKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGxlbmd0aCAlZCwgbWF4IGFsbG93ZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY29weV9jb3VudCwgV0NEX0NQRV9JTUFHRV9GTkFNRV9NQVggLSAxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RybGNweShjb3JlLT5keW5fZm5hbWUsIGJ1ZiwgY29weV9jb3VudCArIDEpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1XQ0RfQ1BFX0FUVFIoZndfbmFtZSwgMDY2MCwgZndfbmFtZV9zaG93LCBmd19uYW1lX3N0b3JlKTsKLQotc3RhdGljIHNzaXplX3Qgd2NkX2NwZV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHdjZF9jcGVfYXR0cmlidXRlICpjcGVfYXR0ciA9IHRvX3djZF9jcGVfYXR0cihhdHRyKTsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0ga29ial90b19jcGVfY29yZShrb2JqKTsKLQlzc2l6ZV90IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoY29yZSAmJiBjcGVfYXR0ci0+c2hvdykKLQkJcmV0ID0gY3BlX2F0dHItPnNob3coY29yZSwgYnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdjZF9jcGVfc3lzZnNfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCB3Y2RfY3BlX2F0dHJpYnV0ZSAqY3BlX2F0dHIgPSB0b193Y2RfY3BlX2F0dHIoYXR0cik7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGtvYmpfdG9fY3BlX2NvcmUoa29iaik7Ci0Jc3NpemVfdCByZXQgPSAtRUlOVkFMOwotCi0JaWYgKGNvcmUgJiYgY3BlX2F0dHItPnN0b3JlKQotCQlyZXQgPSBjcGVfYXR0ci0+c3RvcmUoY29yZSwgYnVmLCBjb3VudCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyB3Y2RfY3BlX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IHdjZF9jcGVfc3lzZnNfc2hvdywKLQkuc3RvcmUgPSB3Y2RfY3BlX3N5c2ZzX3N0b3JlLAotfTsKLQotc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgd2NkX2NwZV9rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJndjZF9jcGVfc3lzZnNfb3BzLAotfTsKLQotc3RhdGljIGludCB3Y2RfY3BlX3N5c2ZzX2luaXQoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwgaW50IGlkKQotewotCWNoYXIgc3lzZnNfZGlyX25hbWVbV0NEX0NQRV9TWVNGU19ESVJfTUFYX0xFTkdUSF07Ci0JaW50IHJjID0gMDsKLQotCXNucHJpbnRmKHN5c2ZzX2Rpcl9uYW1lLCBXQ0RfQ1BFX1NZU0ZTX0RJUl9NQVhfTEVOR1RILAotCQkgIiVzJWQiLCAid2NkX2NwZSIsIGlkKTsKLQotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmNvcmUtPmNwZV9rb2JqLCAmd2NkX2NwZV9rdHlwZSwKLQkJCQkgIGtlcm5lbF9rb2JqLAotCQkJCSAgc3lzZnNfZGlyX25hbWUpOwotCWlmICh1bmxpa2VseShyYykpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBhZGQga29iamVjdCAlcywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3lzZnNfZGlyX25hbWUsIHJjKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmNvcmUtPmNwZV9rb2JqLCAmY3BlX2F0dHJfZndfbmFtZS5hdHRyKTsKLQlpZiAocmMpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBmd19uYW1lIHN5c2ZzIGVudHJ5IHRvICVzXG4iLAotCQkJX19mdW5jX18sIHN5c2ZzX2Rpcl9uYW1lKTsKLQkJZ290byBmYWlsX2NyZWF0ZV9maWxlOwotCX0KLQotCXJldHVybiAwOwotCi1mYWlsX2NyZWF0ZV9maWxlOgotCWtvYmplY3RfcHV0KCZjb3JlLT5jcGVfa29iaik7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgY3BlX2Z0bV90ZXN0X3RyaWdnZXIoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAwOwotCi0JLyogRW5hYmxlIHRoZSBjbGtzIGZvciBjcGUgKi8KLQlyZXQgPSB3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCB0cnVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogQ1BFIGNsayBlbmFibGUgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogR2V0IHRoZSBDUEVfU1RBVFVTICovCi0JcmV0ID0gY3BlX3N2Y19mdG1fdGVzdChjb3JlLT5jcGVfaGFuZGxlLCAmY3BlX2Z0bV90ZXN0X3N0YXR1cyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IENQRSBGVE0gdGVzdCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWlmIChyZXQgPT0gQ1BFX1NWQ19CVVNZKSB7Ci0JCQljcGVfZnRtX3Rlc3Rfc3RhdHVzID0gMTsKLQkJCXJldCA9IDA7Ci0JCX0KLQl9Ci0KLQkvKiBEaXNhYmxlIHRoZSBjbGtzIGZvciBjcGUgKi8KLQlyZXQgPSB3Y2RfY3BlX2VuYWJsZV9jcGVfY2xrcyhjb3JlLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IENQRSBjbGsgZGlzYWJsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JfQotCi1kb25lOgotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCWVsc2UKLQkJcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfdmFsaWRhdGVfcGFyYW1zKAotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQlzdHJ1Y3Qgd2NkX2NwZV9wYXJhbXMgKnBhcmFtcykKLXsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb2RlY1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXBhcmFtcykgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IE5vIHBhcmFtcyBzdXBwbGllZCBmb3IgY29kZWMgJXNcbiIsCi0JCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFwYXJhbXMtPmNvZGVjIHx8ICFwYXJhbXMtPmdldF9jcGVfY29yZSB8fAotCSAgICAhcGFyYW1zLT5jZGNfY2IpIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtcyBmb3IgY29kZWMgJXNcbiIsCi0JCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2luaXQ6IEluaXRpYWxpemUgQ1BFIHJlbGF0ZWQgc3RydWN0dXJlcwotICogQGltZ19mbmFtZTogZmlsZW5hbWUgZm9yIGZpcm13YXJlIGltYWdlCi0gKiBAY29kZWM6IGhhbmRsZSB0byBjb2RlYyByZXF1ZXN0aW5nIGZvciBpbWFnZSBkb3dubG9hZAotICogQHBhcmFtczogcGFyYW1ldGVyIHN0cnVjdHVyZSBwYXNzZWQgZnJvbSBjYWxsZXIKLSAqCi0gKiBUaGlzIEFQSSB3aWxsIGluaXRpYWxpemUgdGhlIGNwZSBjb3JlIGJ1dCB3aWxsIG5vdAotICogZG93bmxvYWQgdGhlIGltYWdlIG9yIGJvb3QgdGhlIGNwZSBjb3JlLgotICovCi1zdHJ1Y3Qgd2NkX2NwZV9jb3JlICp3Y2RfY3BlX2luaXQoY29uc3QgY2hhciAqaW1nX2ZuYW1lLAotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQlzdHJ1Y3Qgd2NkX2NwZV9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlOwotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0JY2hhciBwcm9jX25hbWVbV0NEX0NQRV9TVEFURV9NQVhfTEVOXTsKLQljb25zdCBjaGFyICpjcGVfbmFtZSA9ICJjcGUiOwotCWNvbnN0IGNoYXIgKnN0YXRlX25hbWUgPSAiX3N0YXRlIjsKLQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmh3X2luZm87Ci0JaW50IGlkID0gMDsKLQotCWlmICh3Y2RfY3BlX3ZhbGlkYXRlX3BhcmFtcyhjb2RlYywgcGFyYW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQljb3JlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdjZF9jcGVfY29yZSksIEdGUF9LRVJORUwpOwotCWlmICghY29yZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzbnByaW50Zihjb3JlLT5mbmFtZSwgc2l6ZW9mKGNvcmUtPmZuYW1lKSwgIiVzIiwgaW1nX2ZuYW1lKTsKLQlzdHJsY3B5KGNvcmUtPmR5bl9mbmFtZSwgY29yZS0+Zm5hbWUsIFdDRF9DUEVfSU1BR0VfRk5BTUVfTUFYKTsKLQotCXdjZF9nZXRfY3BlX2NvcmUgPSBwYXJhbXMtPmdldF9jcGVfY29yZTsKLQotCWNvcmUtPmNvZGVjID0gcGFyYW1zLT5jb2RlYzsKLQljb3JlLT5kZXYgPSBwYXJhbXMtPmNvZGVjLT5kZXY7Ci0JY29yZS0+Y3BlX2RlYnVnX21vZGUgPSBwYXJhbXMtPmRiZ19tb2RlOwotCi0JY29yZS0+Y2RjX2luZm8ubWFqb3JfdmVyc2lvbiA9IHBhcmFtcy0+Y2RjX21ham9yX3ZlcjsKLQljb3JlLT5jZGNfaW5mby5taW5vcl92ZXJzaW9uID0gcGFyYW1zLT5jZGNfbWlub3JfdmVyOwotCWNvcmUtPmNkY19pbmZvLmlkID0gcGFyYW1zLT5jZGNfaWQ7Ci0KLQljb3JlLT5jcGVfY2RjX2NiID0gcGFyYW1zLT5jZGNfY2I7Ci0KLQltZW1jcHkoJmNvcmUtPmlycV9pbmZvLCAmcGFyYW1zLT5jZGNfaXJxX2luZm8sCi0JICAgICAgIHNpemVvZihjb3JlLT5pcnFfaW5mbykpOwotCi0JSU5JVF9XT1JLKCZjb3JlLT5sb2FkX2Z3X3dvcmssIHdjZF9jcGVfbG9hZF9md19pbWFnZSk7Ci0JSU5JVF9XT1JLKCZjb3JlLT5zc3Jfd29yaywgd2NkX2NwZV9zc3Jfd29yayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZjb3JlLT5vZmZsaW5lX2NvbXBsKTsKLQlpbml0X2NvbXBsZXRpb24oJmNvcmUtPnJlYWR5X2NvbXBsKTsKLQlpbml0X2NvbXBsZXRpb24oJmNvcmUtPm9ubGluZV9jb21wbCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY29yZS0+c3NyX2VudHJ5Lm9mZmxpbmVfcG9sbF93YWl0KTsKLQltdXRleF9pbml0KCZjb3JlLT5zc3JfbG9jayk7Ci0JY29yZS0+Y3BlX3VzZXJzID0gMDsKLQljb3JlLT5jcGVfY2xrX3JlZiA9IDA7Ci0KLQkvKgotCSAqIEJ5IGRlZmF1bHQsIGR1cmluZyBwcm9iZSwgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogYm90aCBDUEUgaGFyZHdhcmUgYmxvY2sgYW5kIHVuZGVybHlpbmcgYnVzIHRvIGNvZGVjCi0JICogYXJlIHJlYWR5Ci0JICovCi0JY29yZS0+cmVhZHlfc3RhdHVzID0gV0NEX0NQRV9SRUFEWV9UT19ETE9BRDsKLQotCWNvcmUtPmNwZV9oYW5kbGUgPSBjcGVfc3ZjX2luaXRpYWxpemUoTlVMTCwgJmNvcmUtPmNkY19pbmZvLAotCQkJCQkgICAgICBwYXJhbXMtPmNwZV9zdmNfcGFyYW1zKTsKLQlpZiAoIWNvcmUtPmNwZV9oYW5kbGUpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIGNwZSBzZXJ2aWNlc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBmYWlsX2NwZV9pbml0aWFsaXplOwotCX0KLQotCWNvcmUtPmNwZV9yZWdfaGFuZGxlID0gY3BlX3N2Y19yZWdpc3Rlcihjb3JlLT5jcGVfaGFuZGxlLAotCQkJCQl3Y2RfY3BlX3N2Y19ldmVudF9jYiwKLQkJCQkJQ1BFX1NWQ19PTkxJTkUgfCBDUEVfU1ZDX09GRkxJTkUgfAotCQkJCQlDUEVfU1ZDX0JPT1QgfAotCQkJCQlDUEVfU1ZDX0NNSV9DTElFTlRTX0RFUkVHLAotCQkJCQkiY29kZWMgY3BlIGhhbmRsZXIiKTsKLQlpZiAoIWNvcmUtPmNwZV9yZWdfaGFuZGxlKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY3BlIHNlcnZpY2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9jcGVfcmVnaXN0ZXI7Ci0JfQotCi0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZC0+c25kX2NhcmQ7Ci0Jc25wcmludGYocHJvY19uYW1lLCAoc2l6ZW9mKCJjcGUiKSArIHNpemVvZigiX3N0YXRlIikgKwotCQkgc2l6ZW9mKGlkKSAtIDIpLCAiJXMlZCVzIiwgY3BlX25hbWUsIGlkLCBzdGF0ZV9uYW1lKTsKLQllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsIHByb2NfbmFtZSwKLQkJCQkJICAgY2FyZC0+cHJvY19yb290KTsKLQlpZiAoZW50cnkpIHsKLQkJY29yZS0+c3NyX2VudHJ5LmVudHJ5ID0gZW50cnk7Ci0JCWNvcmUtPnNzcl9lbnRyeS5vZmZsaW5lID0gMTsKLQkJZW50cnktPnNpemUgPSBXQ0RfQ1BFX1NUQVRFX01BWF9MRU47Ci0JCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7Ci0JCWVudHJ5LT5jLm9wcyA9ICZ3Y2RfY3BlX3N0YXRlX3Byb2Nfb3BzOwotCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY29yZTsKLQkJcmV0ID0gc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiBzbmRfaW5mb19yZWdpc3RlciBmYWlsZWQgKCVkKVxuIiwKLQkJCQkgX19mdW5jX18sIHJldCk7Ci0JCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKLQkJCWVudHJ5ID0gTlVMTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gY3JlYXRlIENQRSBTU1Igc3RhdHVzIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQkvKgotCQkgKiBFdmVuIGlmIFNTUiBlbnRyeSBjcmVhdGlvbiBmYWlscywgY29udGludWUKLQkJICogd2l0aCBpbWFnZSBkb3dubG9hZAotCQkgKi8KLQl9Ci0KLQljb3JlX2QgPSBjb3JlOwotCXJldCA9IHdjZF9jcGVfY2FsX2luaXQoY29yZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IENQRSBjYWxpYnJhdGlvbiBpbml0IGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBmYWlsX2NwZV9yZXNldDsKLQl9Ci0KLQl3Y2RfY3BlX2RlYnVnZnNfaW5pdChjb3JlKTsKLQotCXdjZF9jcGVfc3lzZnNfaW5pdChjb3JlLCBpZCk7Ci0KLQlod19pbmZvID0gY3BlX3N2Y19nZXRfaHdfY2ZnKGNvcmUtPmNwZV9oYW5kbGUpOwotCWlmICghaHdfaW5mbykgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogaHcgaW5mbyBub3QgYXZhaWxhYmxlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIHNjaGVkdWxlX2Rsb2FkX3dvcms7Ci0JfSBlbHNlIHsKLQkJY29yZS0+aHdfaW5mby5kcmFtX29mZnNldCA9IGh3X2luZm8tPkRSQU1fb2Zmc2V0OwotCQljb3JlLT5od19pbmZvLmRyYW1fc2l6ZSA9IGh3X2luZm8tPkRSQU1fc2l6ZTsKLQkJY29yZS0+aHdfaW5mby5pcmFtX29mZnNldCA9IGh3X2luZm8tPklSQU1fb2Zmc2V0OwotCQljb3JlLT5od19pbmZvLmlyYW1fc2l6ZSA9IGh3X2luZm8tPklSQU1fc2l6ZTsKLQl9Ci0KLQkvKiBTZXR1cCB0aGUgcmFtZHVtcCBkZXZpY2UgYW5kIGJ1ZmZlciAqLwotCWNvcmUtPmNwZV9yYW1kdW1wX2RldiA9IGNyZWF0ZV9yYW1kdW1wX2RldmljZSgiY3BlIiwKLQkJCQkJCSAgICAgIGNvcmUtPmRldik7Ci0JaWYgKCFjb3JlLT5jcGVfcmFtZHVtcF9kZXYpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBjcmVhdGUgcmFtZHVtcCBkZXZpY2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gc2NoZWR1bGVfZGxvYWRfd29yazsKLQl9Ci0KLQlhcmNoX3NldHVwX2RtYV9vcHMoY29yZS0+ZGV2LCAwLCAwLCBOVUxMLCAwKTsKLQljb3JlLT5jcGVfZHVtcF92X2FkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoY29yZS0+ZGV2LAotCQkJCQkJICAgY29yZS0+aHdfaW5mby5kcmFtX3NpemUsCi0JCQkJCQkgICAmY29yZS0+Y3BlX2R1bXBfYWRkciwKLQkJCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghY29yZS0+Y3BlX2R1bXBfdl9hZGRyKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gYWxsb2MgbWVtb3J5IGZvciBjcGUgZHVtcCwgc2l6ZSA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZSk7Ci0JCWdvdG8gc2NoZWR1bGVfZGxvYWRfd29yazsKLQl9IGVsc2UgewotCQltZW1zZXQoY29yZS0+Y3BlX2R1bXBfdl9hZGRyLCAwLCBjb3JlLT5od19pbmZvLmRyYW1fc2l6ZSk7Ci0JfQotCi1zY2hlZHVsZV9kbG9hZF93b3JrOgotCWNvcmUtPnNzcl90eXBlID0gV0NEX0NQRV9JTklUSUFMSVpFRDsKLQlzY2hlZHVsZV93b3JrKCZjb3JlLT5sb2FkX2Z3X3dvcmspOwotCXJldHVybiBjb3JlOwotCi1mYWlsX2NwZV9yZXNldDoKLQljcGVfc3ZjX2RlcmVnaXN0ZXIoY29yZS0+Y3BlX2hhbmRsZSwgY29yZS0+Y3BlX3JlZ19oYW5kbGUpOwotCi1mYWlsX2NwZV9yZWdpc3RlcjoKLQljcGVfc3ZjX2RlaW5pdGlhbGl6ZShjb3JlLT5jcGVfaGFuZGxlKTsKLQotZmFpbF9jcGVfaW5pdGlhbGl6ZToKLQlrZnJlZShjb3JlKTsKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX2NwZV9pbml0KTsKLQotLyoKLSAqIHdjZF9jcGVfY21pX2xzbV9jYWxsYmFjazogY2FsbGJhY2sgY2FsbGVkIGZyb20gY3BlIHNlcnZpY2VzCi0gKgkJCSAgICAgdG8gbm90aWZ5IGNvbW1hbmQgcmVzcG9uc2UgZm9yIGxzbQotICoJCQkgICAgIHNlcnZpY2UKLSAqIEBwYXJhbTogcGFyYW0gY29udGFpbmluZyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgc3RhdHVzCi0gKgotICogVGhpcyBjYWxsYmFjayBpcyByZWdpc3RlcmVkIHdpdGggY3BlIHNlcnZpY2VzIHdoaWxlIHJlZ2lzdGVyaW5nCi0gKiB0aGUgTFNNIHNlcnZpY2UKLSAqLwotc3RhdGljIHZvaWQgd2NkX2NwZV9jbWlfbHNtX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiAqcGFyYW0pCi17Ci0Jc3RydWN0IGNtaV9oZHIgKmhkcjsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpsc21fc2Vzc2lvbjsKLQl1OCBzZXNzaW9uX2lkOwotCi0JaWYgKCFwYXJhbSkgewotCQlwcl9lcnIoIiVzOiBwYXJhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGFyYW0tPmV2ZW50ICE9IENNSV9BUElfTVNHKSB7Ci0JCXByX2VycigiJXM6IHVuaGFuZGxlZCBldmVudCAweCV4XG4iLCBfX2Z1bmNfXywgcGFyYW0tPmV2ZW50KTsKLQkJcmV0dXJuOwotCX0KLQotCWhkciA9IChzdHJ1Y3QgY21pX2hkciAqKSBwYXJhbS0+bWVzc2FnZTsKLQlzZXNzaW9uX2lkID0gQ01JX0hEUl9HRVRfU0VTU0lPTl9JRChoZHIpOwotCi0JaWYgKHNlc3Npb25faWQgPiBXQ0RfQ1BFX0xTTV9NQVhfU0VTU0lPTlMpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBsc20gc2Vzc2lvbiBpZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHNlc3Npb25faWQpOwotCQlyZXR1cm47Ci0JfQotCi0JbHNtX3Nlc3Npb24gPSBsc21fc2Vzc2lvbnNbc2Vzc2lvbl9pZF07Ci0KLQlpZiAoaGRyLT5vcGNvZGUgPT0gQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFKSB7Ci0KLQkJdTggKnBheWxvYWQgPSAoKHU4ICopcGFyYW0tPm1lc3NhZ2UpICsgKHNpemVvZihzdHJ1Y3QgY21pX2hkcikpOwotCQl1OCByZXN1bHQgPSBwYXlsb2FkWzBdOwotCi0JCWxzbV9zZXNzaW9uLT5jbWRfZXJyX2NvZGUgPSByZXN1bHQ7Ci0JCWNvbXBsZXRlKCZsc21fc2Vzc2lvbi0+Y21kX2NvbXApOwotCi0JfSBlbHNlIGlmIChoZHItPm9wY29kZSA9PSBDUEVfTFNNX1NFU1NJT05fQ01EUlNQX1NIQVJFRF9NRU1fQUxMT0MpIHsKLQotCQlzdHJ1Y3QgY3BlX2NtZHJzcF9zaG1lbV9hbGxvYyAqY21kcnNwX3NobWVtX2FsbG9jID0KLQkJCShzdHJ1Y3QgY3BlX2NtZHJzcF9zaG1lbV9hbGxvYyAqKSBwYXJhbS0+bWVzc2FnZTsKLQotCQlpZiAoY21kcnNwX3NobWVtX2FsbG9jLT5hZGRyID09IDApIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCBMU00gc2hhcmVkIG1lbSBhbGxvY1xuIiwgX19mdW5jX18pOwotCQkJbHNtX3Nlc3Npb24tPmNtZF9lcnJfY29kZSA9IENNSV9TSE1FTV9BTExPQ19GQUlMRUQ7Ci0KLQkJfSBlbHNlIHsKLQotCQkJcHJfZGVidWcoIiVzIExTTSBzaGFyZWQgbWVtIGFkZHIgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBjbWRyc3Bfc2htZW1fYWxsb2MtPmFkZHIpOwotCQkJbHNtX3Nlc3Npb24tPmxzbV9tZW1faGFuZGxlID0gY21kcnNwX3NobWVtX2FsbG9jLT5hZGRyOwotCQkJbHNtX3Nlc3Npb24tPmNtZF9lcnJfY29kZSA9IDA7Ci0JCX0KLQotCQljb21wbGV0ZSgmbHNtX3Nlc3Npb24tPmNtZF9jb21wKTsKLQotCX0gZWxzZSBpZiAoaGRyLT5vcGNvZGUgPT0gQ1BFX0xTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjIpIHsKLQotCQlzdHJ1Y3QgY3BlX2xzbV9ldmVudF9kZXRlY3RfdjIgKmV2ZW50X2RldGVjdF92MiA9Ci0JCQkoc3RydWN0IGNwZV9sc21fZXZlbnRfZGV0ZWN0X3YyICopIHBhcmFtLT5tZXNzYWdlOwotCi0JCWlmICghbHNtX3Nlc3Npb24tPnByaXZfZCkgewotCQkJcHJfZXJyKCIlczogcHJpdmF0ZSBkYXRhIGlzIG5vdCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByX2RlYnVnKCIlczogZXZlbnQgcGF5bG9hZCwgc3RhdHVzID0gJXUsIHNpemUgPSAldVxuIiwKLQkJCV9fZnVuY19fLCBldmVudF9kZXRlY3RfdjItPmRldGVjdGlvbl9zdGF0dXMsCi0JCQlldmVudF9kZXRlY3RfdjItPnNpemUpOwotCi0JCWlmIChsc21fc2Vzc2lvbi0+ZXZlbnRfY2IpCi0JCQlsc21fc2Vzc2lvbi0+ZXZlbnRfY2IoCi0JCQkJbHNtX3Nlc3Npb24tPnByaXZfZCwKLQkJCQlldmVudF9kZXRlY3RfdjItPmRldGVjdGlvbl9zdGF0dXMsCi0JCQkJZXZlbnRfZGV0ZWN0X3YyLT5zaXplLAotCQkJCWV2ZW50X2RldGVjdF92Mi0+cGF5bG9hZCk7Ci0JfQotfQotCi0vKgotICogd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnOiBzZW5kIGEgbWVzc2FnZSB0byBsc20gc2VydmljZQotICogQGNvcmU6IGhhbmRsZSB0byBjcGUgY29yZQotICogQHNlc3Npb246IHNlc3Npb24gb24gd2hpY2ggdG8gc2VuZCB0aGUgbWVzc2FnZQotICogQG1lc3NhZ2U6IGFjdHVhbCBtZXNzYWdlIGNvbnRhaW5pbmcgaGVhZGVyIGFuZCBwYXlsb2FkCi0gKgotICogU2VuZHMgbWVzc2FnZSB0byBsc20gc2VydmljZSBmb3Igc3BlY2lmaWVkIHNlc3Npb24gYW5kIHdhaXQKLSAqIGZvciByZXNwb25zZSBiYWNrIG9uIHRoZSBtZXNzYWdlLgotICogc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhY3F1aXJpbmcgc2Vzc2lvbiBzcGVjaWZpYyBtdXRleAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZygKLQkJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQkJdm9pZCAqbWVzc2FnZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyID0gbWVzc2FnZTsKLQotCXByX2RlYnVnKCIlczogc2VuZGluZyBtZXNzYWdlIHdpdGggb3Bjb2RlIDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgaGRyLT5vcGNvZGUpOwotCi0JaWYgKHVubGlrZWx5KCF3Y2RfY3BlX2lzX29ubGluZV9zdGF0ZShjb3JlKSkpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IE1TRyBub3Qgc2VudCwgQ1BFIG9mZmxpbmVcbiIsCi0JCQkgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKENNSV9IRFJfR0VUX09CTV9GTEFHKGhkcikpCi0JCXdjZF9jcGVfYnVzX3ZvdGVfbWF4X2J3KGNvcmUsIHRydWUpOwotCi0JcmVpbml0X2NvbXBsZXRpb24oJnNlc3Npb24tPmNtZF9jb21wKTsKLQlyZXQgPSBjbWlfc2VuZF9tc2cobWVzc2FnZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBtc2cgb3Bjb2RlICgweCV4KSBzZW5kIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIGhkci0+b3Bjb2RlLCByZXQpOwotCQlnb3RvIHJlbF9idXNfdm90ZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNlc3Npb24tPmNtZF9jb21wLAotCQkJCQkgIENNSV9DTURfVElNRU9VVCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJcHJfZGVidWcoIiVzOiBjb21tYW5kIDB4JXgsIHJlY2VpdmVkIHJlc3BvbnNlIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUsIHNlc3Npb24tPmNtZF9lcnJfY29kZSk7Ci0JCWlmIChzZXNzaW9uLT5jbWRfZXJyX2NvZGUgPT0gQ01JX1NITUVNX0FMTE9DX0ZBSUxFRCkKLQkJCXNlc3Npb24tPmNtZF9lcnJfY29kZSA9IENQRV9FTk9NRU1PUlk7Ci0JCWlmIChzZXNzaW9uLT5jbWRfZXJyX2NvZGUgPiAwKQotCQkJcHJfZXJyKCIlczogQ1BFIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgY3BlX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlzZXNzaW9uLT5jbWRfZXJyX2NvZGUpKTsKLQkJcmV0ID0gY3BlX2Vycl9nZXRfbG54X2Vycl9jb2RlKHNlc3Npb24tPmNtZF9lcnJfY29kZSk7Ci0JCWdvdG8gcmVsX2J1c192b3RlOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGNvbW1hbmQgKDB4JXgpIHNlbmQgdGltZWQgb3V0XG4iLAotCQkJX19mdW5jX18sIGhkci0+b3Bjb2RlKTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byByZWxfYnVzX3ZvdGU7Ci0JfQotCi0KLXJlbF9idXNfdm90ZToKLQotCWlmIChDTUlfSERSX0dFVF9PQk1fRkxBRyhoZHIpKQotCQl3Y2RfY3BlX2J1c192b3RlX21heF9idyhjb3JlLCBmYWxzZSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0vKgotICogZmlsbF9jbWlfaGVhZGVyOiBmaWxsIHRoZSBjbWkgaGVhZGVyIHdpdGggc3BlY2lmaWVkIHZhbHVlcwotICoKLSAqIEBoZHI6IGhlYWRlciB0byBiZSB1cGRhdGVkIHdpdGggdmFsdWVzCi0gKiBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpZCBvZiB0aGUgaGVhZGVyLAotICoJCWluIGNhc2Ugb2YgQUZFIHNlcnZpY2UgaXQgaXMgcG9ydF9pZAotICogQHNlcnZpY2VfaWQ6IGFmZS9sc20sIGV0YwotICogQHZlcnNpb246IHVwZGF0ZSB0aGUgdmVyc2lvbiBmaWVsZCBpbiBoZWFkZXIKLSAqIEBwYXlsb2FkX3NpemU6IHNpemUgb2YgdGhlIHBheWxvYWQgZm9sbG93aW5nIGFmdGVyIGhlYWRlcgotICogQG9wY29kZTogb3Bjb2RlIG9mIHRoZSBtZXNzYWdlCi0gKiBAb2JtX2ZsYWc6IGluZGljYXRlcyBpZiB0aGlzIGhlYWRlciBpcyBmb3Igb2JtIG1lc3NhZ2UKLSAqCi0gKi8KLXN0YXRpYyBpbnQgZmlsbF9jbWlfaGVhZGVyKHN0cnVjdCBjbWlfaGRyICpoZHIsCi0JCQkgICB1OCBzZXNzaW9uX2lkLCB1OCBzZXJ2aWNlX2lkLAotCQkJICAgYm9vbCB2ZXJzaW9uLCB1OCBwYXlsb2FkX3NpemUsCi0JCQkgICB1MTYgb3Bjb2RlLCBib29sIG9ibV9mbGFnKQotewotCS8qIHNhbml0aXplIHRoZSBkYXRhICovCi0JaWYgKCFJU19WQUxJRF9TRVNTSU9OX0lEKHNlc3Npb25faWQpIHx8Ci0JICAgICFJU19WQUxJRF9TRVJWSUNFX0lEKHNlcnZpY2VfaWQpIHx8Ci0JICAgICFJU19WQUxJRF9QTERfU0laRShwYXlsb2FkX3NpemUpKSB7Ci0JCXByX2VycigiSW52YWxpZCBoZWFkZXIgY3JlYXRpb24gcmVxdWVzdFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCUNNSV9IRFJfU0VUX1NFU1NJT04oaGRyLCBzZXNzaW9uX2lkKTsKLQlDTUlfSERSX1NFVF9TRVJWSUNFKGhkciwgc2VydmljZV9pZCk7Ci0JaWYgKHZlcnNpb24pCi0JCUNNSV9IRFJfU0VUX1ZFUlNJT04oaGRyLCAxKTsKLQllbHNlCi0JCUNNSV9IRFJfU0VUX1ZFUlNJT04oaGRyLCAwKTsKLQotCUNNSV9IRFJfU0VUX1BBWUxPQURfU0laRShoZHIsIHBheWxvYWRfc2l6ZSk7Ci0KLQloZHItPm9wY29kZSA9IG9wY29kZTsKLQotCWlmIChvYm1fZmxhZykKLQkJQ01JX0hEUl9TRVRfT0JNKGhkciwgQ01JX09CTV9GTEFHX09VVF9CQU5EKTsKLQllbHNlCi0JCUNNSV9IRFJfU0VUX09CTShoZHIsIENNSV9PQk1fRkxBR19JTl9CQU5EKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQ6Ci0gKglHaXZlbiB0aGUgaGVhZGVyLCBmaWxsIHRoZSBoZWFkZXIgd2l0aCBpbmZvcm1hdGlvbgotICoJZm9yIGxzbSBzZXJ2aWNlLCB2ZXJzaW9uIDAgYW5kIGluYmFuZCBtZXNzYWdlCi0gKiBAaGRyOiB0aGUgY21pIGhlYWRlciB0byBiZSBmaWxsZWQuCi0gKiBAc2Vzc2lvbl9pZDogSUQgZm9yIHRoZSBsc20gc2Vzc2lvbgotICogQHBheWxvYWRfc2l6ZTogc2l6ZSBmb3IgY21pIG1lc3NhZ2UgcGF5bG9hZAotICogQG9wY29kZTogb3Bjb2RlIGZvciBjbWkgbWVzc2FnZQotICovCi1zdGF0aWMgaW50IGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKHN0cnVjdCBjbWlfaGRyICpoZHIsCi0JCXU4IHNlc3Npb25faWQsIHU4IHBheWxvYWRfc2l6ZSwgdTE2IG9wY29kZSkKLXsKLQlyZXR1cm4gZmlsbF9jbWlfaGVhZGVyKGhkciwgc2Vzc2lvbl9pZCwKLQkJCSAgICAgICBDTUlfQ1BFX0xTTV9TRVJWSUNFX0lELCBmYWxzZSwKLQkJCSAgICAgICBwYXlsb2FkX3NpemUsIG9wY29kZSwgZmFsc2UpOwotfQotCi0vKgotICogd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbjoKLSAqCUNoZWNrIHNlc3Npb24gcGFyYW1ldGVycyB0byBpZGVudGlmeSB2YWxpZGl0eSBmb3IgdGhlIHNlc2lvbgotICogQGNvcmU6IGhhbmRsZSB0byBjcGUgY29yZQotICogQHNlc3Npb246IGhhbmRsZSB0byB0aGUgbHNtIHNlc3Npb24KLSAqIEBmdW5jOiBpbnZva2luZyBmdW5jdGlvbiB0byBiZSBwcmludGVkIGluIGVycm9yIGxvZ3MKLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCi0JCWNvbnN0IGNoYXIgKmZ1bmMpCi17Ci0JaWYgKHVubGlrZWx5KElTX0VSUl9PUl9OVUxMKGNvcmUpKSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGhhbmRsZSB0byBjb3JlXG4iLAotCQkJZnVuYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1bmxpa2VseShJU19FUlJfT1JfTlVMTChzZXNzaW9uKSkpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogaW52YWxpZCBzZXNzaW9uXG4iLAotCQkJZnVuYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzZXNzaW9uLT5pZCA+IFdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUykgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBpbnZhbGlkIHNlc3Npb24gaWQgKCV1KVxuIiwKLQkJCWZ1bmMsIHNlc3Npb24tPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogc2Vzc2lvbl9pZCA9ICV1XG4iLAotCQlmdW5jLCBzZXNzaW9uLT5pZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9jbWRfbHNtX29wZW5fdHhfdjIoCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQotewotCXN0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4X3YyIGNtZF9vcGVuX3R4X3YyOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqdG9wX2NhbCA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbV90b3AgKmxzbV90b3A7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sCi0JCQkJCSAgIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9UT1BPTE9HWV9JRF0gPT0gTlVMTCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogTFNNX1RPUE9MT0dZIGNhbCBub3QgYWxsb2NhdGVkIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX1RPUE9MT0dZX0lEXS0+bG9jayk7Ci0JdG9wX2NhbCA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCi0JCQljb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfVE9QT0xPR1lfSURdKTsKLQlpZiAoIXRvcF9jYWwpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBnZXQgTFNNIFRPUE9MT0dZIGNhbCBibG9ja1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2tfY2FsX211dGV4OwotCX0KLQotCWxzbV90b3AgPSAoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2xzbV90b3AgKikKLQkJCXRvcF9jYWwtPmNhbF9pbmZvOwotCi0JaWYgKCFsc21fdG9wKSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBjYWxfaW5mbyBmb3IgTFNNX1RPUE9MT0dZIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2tfY2FsX211dGV4OwotCX0KLQotCWRldl9kYmcoY29yZS0+ZGV2LAotCQkiJXM6IHRvcG9sb2d5X2lkID0gMHgleCwgYWNkYl9pZCA9IDB4JXgsIGFwcF90eXBlID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGxzbV90b3AtPnRvcG9sb2d5LCBsc21fdG9wLT5hY2RiX2lkLAotCQlsc21fdG9wLT5hcHBfdHlwZSk7Ci0KLQlpZiAobHNtX3RvcC0+dG9wb2xvZ3kgPT0gMCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogdG9wb2xvZ3kgaWQgbm90IHNlbnQgZm9yIGFwcF90eXBlIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgbHNtX3RvcC0+YXBwX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7Ci0JfQotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0KLQltZW1zZXQoJmNtZF9vcGVuX3R4X3YyLCAwLCBzaXplb2Yoc3RydWN0IGNwZV9sc21fY21kX29wZW5fdHhfdjIpKTsKLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9vcGVuX3R4X3YyLmhkciwKLQkJCQlzZXNzaW9uLT5pZCwgT1BFTl9WMl9DTURfUEFZTE9BRF9TSVpFLAotCQkJCUNQRV9MU01fU0VTU0lPTl9DTURfT1BFTl9UWF9WMikpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmRfcmV0OwotCX0KLQotCWNtZF9vcGVuX3R4X3YyLnRvcG9sb2d5X2lkID0gbHNtX3RvcC0+dG9wb2xvZ3k7Ci0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfb3Blbl90eF92Mik7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBzZW5kIG9wZW5fdHhfdjIgY21kLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCWVsc2UKLQkJc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCA9IHRydWU7Ci1lbmRfcmV0OgotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0KLXVubG9ja19jYWxfbXV0ZXg6Ci0JbXV0ZXhfdW5sb2NrKCZjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfVE9QT0xPR1lfSURdLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9jbWRfbHNtX29wZW5fdHg6IGNvbXBvc2UgYW5kIHNlbmQgbHNtIG9wZW4gY29tbWFuZAotICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gY3BlIGNvcmUKLSAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCB0aGUgY29tbWFuZCBuZWVkcyB0byBiZSBzZW50Ci0gKiBAYXBwX2lkOiBhcHBsaWNhdGlvbiBpZCBwYXJ0IG9mIHRoZSBjb21tYW5kCi0gKiBAc2FtcGxlX3JhdGU6IHNhbXBsZSByYXRlIGZvciB0aGlzIHNlc3Npb24KLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2NtZF9sc21fb3Blbl90eCh2b2lkICpjb3JlX2hhbmRsZSwKLQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJdTE2IGFwcF9pZCwgdTE2IHNhbXBsZV9yYXRlKQotewotCXN0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4IGNtZF9vcGVuX3R4OwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKLQkJCQkJICAgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBUcnkgdG8gb3BlbiB3aXRoIHRvcG9sb2d5IGZpcnN0ICovCi0JcmV0ID0gd2NkX2NwZV9jbWRfbHNtX29wZW5fdHhfdjIoY29yZSwgc2Vzc2lvbik7Ci0JaWYgKCFyZXQpCi0JCWdvdG8gZG9uZTsKLQotCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IFRyeSBvcGVuX3R4IHdpdGhvdXQgdG9wb2xvZ3lcbiIsCi0JCV9fZnVuY19fKTsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCi0JbWVtc2V0KCZjbWRfb3Blbl90eCwgMCwgc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2NtZF9vcGVuX3R4KSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfb3Blbl90eC5oZHIsCi0JCQkJc2Vzc2lvbi0+aWQsIE9QRU5fQ01EX1BBWUxPQURfU0laRSwKLQkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX09QRU5fVFgpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQljbWRfb3Blbl90eC5hcHBfaWQgPSBhcHBfaWQ7Ci0JY21kX29wZW5fdHguc2FtcGxpbmdfcmF0ZSA9IHNhbXBsZV9yYXRlOwotCi0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfb3Blbl90eCk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBzZW5kIG9wZW5fdHggY21kLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZW5kX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9jbWRfY2xvc2VfdHg6IGNvbXBvc2UgYW5kIHNlbmQgbHNtIGNsb3NlIGNvbW1hbmQKLSAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggdGhlIGNvbW1hbmQgbmVlZHMgdG8gYmUgc2VudAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfY21kX2xzbV9jbG9zZV90eCh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IGNtaV9oZHIgY21kX2Nsb3NlX3R4OwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKLQkJCQkJICAgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCW1lbXNldCgmY21kX2Nsb3NlX3R4LCAwLCBzaXplb2YoY21kX2Nsb3NlX3R4KSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfY2xvc2VfdHgsIHNlc3Npb24tPmlkLAotCQkJICAgIDAsIENQRV9MU01fU0VTU0lPTl9DTURfQ0xPU0VfVFgpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9jbG9zZV90eCk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGxzbSBjbG9zZV90eCBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCWVsc2UKLQkJc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCA9IGZhbHNlOwotZW5kX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2NtZF9zaG1lbV9hbGxvYzogY29tcG9zZSBhbmQgc2VuZCBsc20gc2hhcmVkCi0gKgkJCSAgICBtZW1vcnkgYWxsb2NhdGlvbiBjb21tYW5kCi0gKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byBjcGUgY29yZQotICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHRoZSBjb21tYW5kIG5lZWRzIHRvIGJlIHNlbnQKLSAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQKLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2NtZF9sc21fc2htZW1fYWxsb2Modm9pZCAqY29yZV9oYW5kbGUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQkJdTMyIHNpemUpCi17Ci0Jc3RydWN0IGNwZV9jbWRfc2htZW1fYWxsb2MgY21kX3NobWVtX2FsbG9jOwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKLQkJCQkJICAgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCW1lbXNldCgmY21kX3NobWVtX2FsbG9jLCAwLCBzaXplb2YoY21kX3NobWVtX2FsbG9jKSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfc2htZW1fYWxsb2MuaGRyLCBzZXNzaW9uLT5pZCwKLQkJCSAgICBTSE1FTV9BTExPQ19DTURfUExEX1NJWkUsCi0JCQkgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX0FMTE9DKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZF9yZXQ7Ci0JfQotCi0JY21kX3NobWVtX2FsbG9jLnNpemUgPSBzaXplOwotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY21kX3NobWVtX2FsbG9jKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogbHNtX3NobWVtX2FsbG9jIGNtZCBzZW5kIGZhaWwsICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci1lbmRfcmV0OgotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfY21kX2xzbV9zaG1lbV9kZWFsbG9jOiBkZWFsbG9jYXRlIHRoZSBzaGFyZWQgbWVtb3J5Ci0gKgkJCQkgIGZvciB0aGUgc3BlY2lmaWVkIHNlc3Npb24KLSAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggbWVtb3J5IG5lZWRzIHRvIGJlIGRlYWxsb2NhdGVkLgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9kZWFsbG9jKHZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQotewotCXN0cnVjdCBjcGVfY21kX3NobWVtX2RlYWxsb2MgY21kX2RlYWxsb2M7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gd2NkX2NwZV9pc192YWxpZF9sc21fc2Vzc2lvbihjb3JlLCBzZXNzaW9uLAotCQkJCQkgICBfX2Z1bmNfXyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCi0JbWVtc2V0KCZjbWRfZGVhbGxvYywgMCwgc2l6ZW9mKGNtZF9kZWFsbG9jKSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfZGVhbGxvYy5oZHIsIHNlc3Npb24tPmlkLAotCQkJICAgIFNITUVNX0RFQUxMT0NfQ01EX1BMRF9TSVpFLAotCQkJICAgIENQRV9MU01fU0VTU0lPTl9DTURfU0hBUkVEX01FTV9ERUFMTE9DKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZF9yZXQ7Ci0JfQotCi0JY21kX2RlYWxsb2MuYWRkciA9IHNlc3Npb24tPmxzbV9tZW1faGFuZGxlOwotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY21kX2RlYWxsb2MpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGxzbV9zaG1lbV9kZWFsbG9jIGNtZCBmYWlsZWQsIHJjICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQltZW1zZXQoJnNlc3Npb24tPmxzbV9tZW1faGFuZGxlLCAwLAotCSAgICAgICBzaXplb2Yoc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGUpKTsKLQotZW5kX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX3NlbmRfbHNtX2NhbDogc2VuZCB0aGUgY2FsaWJyYXRpb24gZm9yIGxzbSBzZXJ2aWNlCi0gKgkJCSAgICAgIGZyb20gYWNkYiB0byB0aGUgY3BlCi0gKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggdGhlIGNhbGlicmF0aW9uIG5lZWRzIHRvIGJlIHNldC4KLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfbHNtX2NhbCgKLQkJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQotewotCi0JdTggKm1zZ19wbGQ7Ci0Jc3RydWN0IGNtaV9oZHIgKmhkcjsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmxzbV9jYWwgPSBOVUxMOwotCXZvaWQgKmluYl9tc2c7Ci0JaW50IHJjID0gMDsKLQotCWlmIChjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfTFNNXSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IExTTSBjYWwgbm90IGFsbG9jYXRlZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX0xTTV0tPmxvY2spOwotCWxzbV9jYWwgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAotCQkJY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX0xTTV0pOwotCWlmICghbHNtX2NhbCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGxzbSBjYWwgYmxvY2tcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7Ci0JfQotCi0JaWYgKGxzbV9jYWwtPmNhbF9kYXRhLnNpemUgPT0gMCkgewotCQlkZXZfZGJnKGNvcmUtPmRldiwgIiVzOiBObyBMU00gY2FsIHRvIHNlbmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJjID0gMDsKLQkJZ290byB1bmxvY2tfY2FsX211dGV4OwotCX0KLQotCWluYl9tc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21pX2hkcikgKyBsc21fY2FsLT5jYWxfZGF0YS5zaXplLAotCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIWluYl9tc2cpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHVubG9ja19jYWxfbXV0ZXg7Ci0JfQotCi0JaGRyID0gKHN0cnVjdCBjbWlfaGRyICopIGluYl9tc2c7Ci0KLQlyYyA9IGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKGhkciwgc2Vzc2lvbi0+aWQsCi0JCQlsc21fY2FsLT5jYWxfZGF0YS5zaXplLAotCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbXMgZm9yIGhlYWRlciwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZyZWVfbXNnOwotCX0KLQotCW1zZ19wbGQgPSAoKHU4ICopIGluYl9tc2cpICsgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKTsKLQltZW1jcHkobXNnX3BsZCwgbHNtX2NhbC0+Y2FsX2RhdGEua3ZhZGRyLAotCSAgICAgICBsc21fY2FsLT5jYWxfZGF0YS5zaXplKTsKLQotCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sIGluYl9tc2cpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogYWNkYiBsc21fcGFyYW1zIHNlbmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLWZyZWVfbXNnOgotCWtmcmVlKGluYl9tc2cpOwotCi11bmxvY2tfY2FsX211dGV4OgotCW11dGV4X3VubG9jaygmY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX0xTTV0tPmxvY2spOwotCXJldHVybiByYzsKLQotfQotCi1zdGF0aWMgdm9pZCB3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCwKLQkJc3RydWN0IGNwZV9sc21faWRzICppZHMsIHUzMiBwX3NpemUsCi0JCXUzMiBzZXRfcGFyYW1fY21kKQotewotCXBhcmFtX2QtPm1vZHVsZV9pZCA9IGlkcy0+bW9kdWxlX2lkOwotCXBhcmFtX2QtPnBhcmFtX2lkID0gaWRzLT5wYXJhbV9pZDsKLQotCXN3aXRjaCAoc2V0X3BhcmFtX2NtZCkgewotCWNhc2UgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOgotCQlwYXJhbV9kLT5wX3NpemUucGFyYW1fc2l6ZSA9IHBfc2l6ZTsKLQkJYnJlYWs7Ci0JY2FzZSBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVM6Ci0JZGVmYXVsdDoKLQkJcGFyYW1fZC0+cF9zaXplLnNyLnBhcmFtX3NpemUgPQotCQkJKHUxNikgcF9zaXplOwotCQlwYXJhbV9kLT5wX3NpemUuc3IucmVzZXJ2ZWQgPSAwOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX3BhcmFtX2VwZF90aHJlcyhzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQl2b2lkICpkYXRhLCBzdHJ1Y3QgY3BlX2xzbV9pZHMgKmlkcykKLXsKLQlzdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgKmVwX2RldF9kYXRhOwotCXN0cnVjdCBjcGVfbHNtX3BhcmFtX2VwZF90aHJlcyBlcGRfY21kOwotCXN0cnVjdCBjbWlfaGRyICptc2dfaGRyID0gJmVwZF9jbWQuaGRyOwotCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9Ci0JCQkJJmVwZF9jbWQucGFyYW07Ci0JaW50IHJjOwotCi0JbWVtc2V0KCZlcGRfY21kLCAwLCBzaXplb2YoZXBkX2NtZCkpOwotCWVwX2RldF9kYXRhID0gKHN0cnVjdCBzbmRfbHNtX2VwX2RldF90aHJlcyAqKSBkYXRhOwotCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZChtc2dfaGRyLAotCQkJCXNlc3Npb24tPmlkLAotCQkJCUNQRV9DTURfRVBEX1RIUkVTX1BMRF9TSVpFLAotCQkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0Jd2NkX2NwZV9zZXRfcGFyYW1fZGF0YShwYXJhbV9kLCBpZHMsCi0JCQkgICAgICAgQ1BFX0VQRF9USFJFU19QQVJBTV9TSVpFLAotCQkJICAgICAgIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0KLQllcGRfY21kLm1pbm9yX3ZlcnNpb24gPSAxOwotCWVwZF9jbWQuZXBkX2JlZ2luID0gZXBfZGV0X2RhdGEtPmVwZF9iZWdpbjsKLQllcGRfY21kLmVwZF9lbmQgPSBlcF9kZXRfZGF0YS0+ZXBkX2VuZDsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZlcGRfY21kKTsKLQlpZiAodW5saWtlbHkocmMpKQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogc2V0X3BhcmFtKEVQRCBUaHJlc2hvbGQpIGZhaWxlZCwgcmMgJWRuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLWVycl9yZXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfc2VuZF9wYXJhbV9vcG1vZGUoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJdm9pZCAqZGF0YSwgc3RydWN0IGNwZV9sc21faWRzICppZHMpCi17Ci0Jc3RydWN0IHNuZF9sc21fZGV0ZWN0X21vZGUgKm9wbW9kZV9kOwotCXN0cnVjdCBjcGVfbHNtX3BhcmFtX29wbW9kZSBvcG1vZGVfY21kOwotCXN0cnVjdCBjbWlfaGRyICptc2dfaGRyID0gJm9wbW9kZV9jbWQuaGRyOwotCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZCA9Ci0JCQkJJm9wbW9kZV9jbWQucGFyYW07Ci0JaW50IHJjOwotCi0JbWVtc2V0KCZvcG1vZGVfY21kLCAwLCBzaXplb2Yob3Btb2RlX2NtZCkpOwotCW9wbW9kZV9kID0gKHN0cnVjdCBzbmRfbHNtX2RldGVjdF9tb2RlICopIGRhdGE7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKG1zZ19oZHIsCi0JCQkJc2Vzc2lvbi0+aWQsCi0JCQkJQ1BFX0NNRF9PUE1PREVfUExEX1NJWkUsCi0JCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsIGlkcywKLQkJCSAgICAgICBDUEVfT1BNT0RFX1BBUkFNX1NJWkUsCi0JCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKLQotCW9wbW9kZV9jbWQubWlub3JfdmVyc2lvbiA9IDE7Ci0JaWYgKG9wbW9kZV9kLT5tb2RlID09IExTTV9NT0RFX0tFWVdPUkRfT05MWV9ERVRFQ1RJT04pCi0JCW9wbW9kZV9jbWQubW9kZSA9IDE7Ci0JZWxzZQotCQlvcG1vZGVfY21kLm1vZGUgPSAzOwotCi0JaWYgKG9wbW9kZV9kLT5kZXRlY3RfZmFpbHVyZSkKLQkJb3Btb2RlX2NtZC5tb2RlIHw9IDB4MDQ7Ci0KLQlvcG1vZGVfY21kLnJlc2VydmVkID0gMDsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZvcG1vZGVfY21kKTsKLQlpZiAodW5saWtlbHkocmMpKQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogc2V0X3BhcmFtKG9wZXJhdGlvbl9tb2RlKSBmYWlsZWQsIHJjICVkbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci1lcnJfcmV0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fZ2FpbihzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQl2b2lkICpkYXRhLCBzdHJ1Y3QgY3BlX2xzbV9pZHMgKmlkcykKLXsKLQlzdHJ1Y3Qgc25kX2xzbV9nYWluICpnYWluX2Q7Ci0Jc3RydWN0IGNwZV9sc21fcGFyYW1fZ2FpbiBnYWluX2NtZDsKLQlzdHJ1Y3QgY21pX2hkciAqbXNnX2hkciA9ICZnYWluX2NtZC5oZHI7Ci0Jc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kID0KLQkJCQkmZ2Fpbl9jbWQucGFyYW07Ci0JaW50IHJjOwotCi0JbWVtc2V0KCZnYWluX2NtZCwgMCwgc2l6ZW9mKGdhaW5fY21kKSk7Ci0JZ2Fpbl9kID0gKHN0cnVjdCBzbmRfbHNtX2dhaW4gKikgZGF0YTsKLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQobXNnX2hkciwKLQkJCQlzZXNzaW9uLT5pZCwKLQkJCQlDUEVfQ01EX0dBSU5fUExEX1NJWkUsCi0JCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsIGlkcywKLQkJCSAgICAgICBDUEVfR0FJTl9QQVJBTV9TSVpFLAotCQkJICAgICAgIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0KLQlnYWluX2NtZC5taW5vcl92ZXJzaW9uID0gMTsKLQlnYWluX2NtZC5nYWluID0gZ2Fpbl9kLT5nYWluOwotCWdhaW5fY21kLnJlc2VydmVkID0gMDsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZnYWluX2NtZCk7Ci0JaWYgKHVubGlrZWx5KHJjKSkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IHNldF9wYXJhbShsc21fZ2FpbikgZmFpbGVkLCByYyAlZG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotZXJyX3JldDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX3BhcmFtX2Nvbm5lY3Rwb3J0KHN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCi0JCXZvaWQgKmRhdGEsIHN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzLCB1MTYgcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgY3BlX2xzbV9wYXJhbV9jb25uZWN0cG9ydCBjb25fcG9ydF9jbWQ7Ci0Jc3RydWN0IGNtaV9oZHIgKm1zZ19oZHIgPSAmY29uX3BvcnRfY21kLmhkcjsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPQotCQkJCSZjb25fcG9ydF9jbWQucGFyYW07Ci0JaW50IHJjOwotCi0JbWVtc2V0KCZjb25fcG9ydF9jbWQsIDAsIHNpemVvZihjb25fcG9ydF9jbWQpKTsKLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQobXNnX2hkciwKLQkJCQlzZXNzaW9uLT5pZCwKLQkJCQlDUEVfQ01EX0NPTk5FQ1RQT1JUX1BMRF9TSVpFLAotCQkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0Jd2NkX2NwZV9zZXRfcGFyYW1fZGF0YShwYXJhbV9kLCBpZHMsCi0JCQkgICAgICAgQ1BFX0NPTk5FQ1RQT1JUX1BBUkFNX1NJWkUsCi0JCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKLQotCWNvbl9wb3J0X2NtZC5taW5vcl92ZXJzaW9uID0gMTsKLQljb25fcG9ydF9jbWQuYWZlX3BvcnRfaWQgPSBwb3J0X2lkOwotCWNvbl9wb3J0X2NtZC5yZXNlcnZlZCA9IDA7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQlyYyA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY29uX3BvcnRfY21kKTsKLQlpZiAodW5saWtlbHkocmMpKQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogc2V0X3BhcmFtKGNvbm5lY3RfcG9ydCkgZmFpbGVkLCByYyAlZG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotZXJyX3JldDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX3BhcmFtX2NvbmZfbGV2ZWxzKAotCQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQlzdHJ1Y3QgY3BlX2xzbV9pZHMgKmlkcykKLXsKLQlzdHJ1Y3QgY3BlX2xzbV9jb25mX2xldmVsIGNvbmZfbGV2ZWxfZGF0YTsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyID0gJihjb25mX2xldmVsX2RhdGEuaGRyKTsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPSAmKGNvbmZfbGV2ZWxfZGF0YS5wYXJhbSk7Ci0JdTggcGxkX3NpemUgPSAwOwotCXU4IHBhZF9ieXRlcyA9IDA7Ci0Jdm9pZCAqbWVzc2FnZTsKLQlpbnQgcmV0ID0gMDsKLQotCW1lbXNldCgmY29uZl9sZXZlbF9kYXRhLCAwLCBzaXplb2YoY29uZl9sZXZlbF9kYXRhKSk7Ci0KLQlwbGRfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGNwZV9sc21fY29uZl9sZXZlbCkgLSBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKTsKLQlwbGRfc2l6ZSArPSBzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JcGFkX2J5dGVzID0gKCg0IC0gKHBsZF9zaXplICUgNCkpICUgNCk7Ci0JcGxkX3NpemUgKz0gcGFkX2J5dGVzOwotCi0JZmlsbF9jbWlfaGVhZGVyKGhkciwgc2Vzc2lvbi0+aWQsIENNSV9DUEVfTFNNX1NFUlZJQ0VfSUQsCi0JCQlmYWxzZSwgcGxkX3NpemUsCi0JCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIsIGZhbHNlKTsKLQotCXdjZF9jcGVfc2V0X3BhcmFtX2RhdGEocGFyYW1fZCwgaWRzLAotCQkJICAgICAgIHBsZF9zaXplIC0gc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSksCi0JCQkgICAgICAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKLQotCWNvbmZfbGV2ZWxfZGF0YS5udW1fYWN0aXZlX21vZGVscyA9IHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVsczsKLQotCW1lc3NhZ2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9jb25mX2xldmVsKSArCi0JCQkgICBjb25mX2xldmVsX2RhdGEubnVtX2FjdGl2ZV9tb2RlbHMgKyBwYWRfYnl0ZXMsCi0JCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1lc3NhZ2UpIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtb3J5IGZvciBjb25mX2xldmVsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbWNweShtZXNzYWdlLCAmY29uZl9sZXZlbF9kYXRhLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNwZV9sc21fY29uZl9sZXZlbCkpOwotCW1lbWNweSgoKHU4ICopIG1lc3NhZ2UpICsgc2l6ZW9mKHN0cnVjdCBjcGVfbHNtX2NvbmZfbGV2ZWwpLAotCQlzZXNzaW9uLT5jb25mX2xldmVscywgY29uZl9sZXZlbF9kYXRhLm51bV9hY3RpdmVfbW9kZWxzKTsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCBtZXNzYWdlKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBsc21fc2V0X2NvbmZfbGV2ZWxzIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQlrZnJlZShtZXNzYWdlKTsKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX3BhcmFtX3NuZF9tb2RlbChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjbWlfb2JtX21zZyBvYm1fbXNnOwotCXN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqcGFyYW1fZDsKLQotCi0JcmV0ID0gZmlsbF9jbWlfaGVhZGVyKCZvYm1fbXNnLmhkciwgc2Vzc2lvbi0+aWQsCi0JCQlDTUlfQ1BFX0xTTV9TRVJWSUNFX0lELCAwLCAyMCwKLQkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMiwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogSW52YWxpZCBwYXJhbWV0ZXJzLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlvYm1fbXNnLnBsZC52ZXJzaW9uID0gMDsKLQlvYm1fbXNnLnBsZC5zaXplID0gc2Vzc2lvbi0+c25kX21vZGVsX3NpemU7Ci0Jb2JtX21zZy5wbGQuZGF0YV9wdHIua3ZhZGRyID0gc2Vzc2lvbi0+c25kX21vZGVsX2RhdGE7Ci0Jb2JtX21zZy5wbGQubWVtX2hhbmRsZSA9IHNlc3Npb24tPmxzbV9tZW1faGFuZGxlOwotCi0JcGFyYW1fZCA9IChzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKikgc2Vzc2lvbi0+c25kX21vZGVsX2RhdGE7Ci0Jd2NkX2NwZV9zZXRfcGFyYW1fZGF0YShwYXJhbV9kLCBpZHMsCi0JCQkoc2Vzc2lvbi0+c25kX21vZGVsX3NpemUgLSBzaXplb2YoKnBhcmFtX2QpKSwKLQkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm9ibV9tc2cpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBzbmRfbW9kZWxfcmVnaXN0ZXIgZmFpbGVkLCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0KLWVycl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX3NlbmRfcGFyYW1fZGVyZWdfbW9kZWwoCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCXN0cnVjdCBjcGVfbHNtX2lkcyAqaWRzKQotewotCXN0cnVjdCBjbWlfaGRyICpoZHI7Ci0Jc3RydWN0IGNwZV9wYXJhbV9kYXRhICpwYXJhbV9kOwotCXU4ICptZXNzYWdlOwotCXUzMiBwbGRfc2l6ZTsKLQlpbnQgcmMgPSAwOwotCi0JcGxkX3NpemUgPSBzaXplb2YoKmhkcikgKyBzaXplb2YoKnBhcmFtX2QpOwotCi0JbWVzc2FnZSA9IGt6YWxsb2MocGxkX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghbWVzc2FnZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgbWVzc2FnZTsKLQlwYXJhbV9kID0gKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSAqKQotCQkJKCgodTggKikgbWVzc2FnZSkgKyBzaXplb2YoKmhkcikpOwotCi0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKGhkciwKLQkJCQlzZXNzaW9uLT5pZCwKLQkJCQlzaXplb2YoKnBhcmFtX2QpLAotCQkJCUNQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCXdjZF9jcGVfc2V0X3BhcmFtX2RhdGEocGFyYW1fZCwgaWRzLCAwLAotCQkJICAgICAgIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0JV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JcmMgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgbWVzc2FnZSk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogc25kX21vZGVsX2RlcmVnaXN0ZXIgZmFpbGVkLCAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLWVycl9yZXQ6Ci0Ja2ZyZWUobWVzc2FnZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfc2VuZF9jdXN0b21fcGFyYW0oCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCXZvaWQgKmRhdGEsIHUzMiBtc2dfc2l6ZSkKLXsKLQl1OCAqbXNnOwotCXN0cnVjdCBjbWlfaGRyICpoZHI7Ci0JdTggKm1zZ19wbGQ7Ci0JaW50IHJjOwotCi0JaWYgKG1zZ19zaXplID4gQ01JX0lOQkFORF9NRVNTQUdFX1NJWkUpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IG91dCBvZiBiYW5kIGN1c3RvbSBwYXJhbXMgbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXNnID0ga3phbGxvYyhzaXplb2YoKmhkcikgKyBtc2dfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaGRyID0gKHN0cnVjdCBjbWlfaGRyICopIG1zZzsKLQltc2dfcGxkID0gbXNnICsgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKTsKLQotCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZChoZHIsCi0JCQkJc2Vzc2lvbi0+aWQsCi0JCQkJbXNnX3NpemUsCi0JCQkJQ1BFX0xTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQltZW1jcHkobXNnX3BsZCwgZGF0YSwgbXNnX3NpemUpOwotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJjID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sIG1zZyk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogY3VzdG9tIHBhcmFtcyBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotZXJyX3JldDoKLQlrZnJlZShtc2cpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX3NldF9vbmVfcGFyYW0odm9pZCAqY29yZV9oYW5kbGUsCi0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvLAotCXZvaWQgKmRhdGEsIHVpbnQzMl90IHBhcmFtX3R5cGUpCi17Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGNwZV9sc21faWRzIGlkczsKLQotCW1lbXNldCgmaWRzLCAwLCBzaXplb2YoaWRzKSk7Ci0JaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOwotCWlkcy5wYXJhbV9pZCA9IHBfaW5mby0+cGFyYW1faWQ7Ci0KLQlzd2l0Y2ggKHBhcmFtX3R5cGUpIHsKLQljYXNlIExTTV9FTkRQT0lOVF9ERVRFQ1RfVEhSRVNIT0xEOgotCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9lcGRfdGhyZXMoY29yZSwgc2Vzc2lvbiwKLQkJCQkJCWRhdGEsICZpZHMpOwotCQlicmVhazsKLQljYXNlIExTTV9PUEVSQVRJT05fTU9ERToKLQkJcmMgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fb3Btb2RlKGNvcmUsIHNlc3Npb24sIGRhdGEsICZpZHMpOwotCQlicmVhazsKLQljYXNlIExTTV9HQUlOOgotCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9nYWluKGNvcmUsIHNlc3Npb24sIGRhdGEsICZpZHMpOwotCQlicmVhazsKLQljYXNlIExTTV9NSU5fQ09ORklERU5DRV9MRVZFTFM6Ci0JCXJjID0gd2NkX2NwZV9zZW5kX3BhcmFtX2NvbmZfbGV2ZWxzKGNvcmUsIHNlc3Npb24sICZpZHMpOwotCQlicmVhazsKLQljYXNlIExTTV9SRUdfU05EX01PREVMOgotCQlyYyA9IHdjZF9jcGVfc2VuZF9wYXJhbV9zbmRfbW9kZWwoY29yZSwgc2Vzc2lvbiwgJmlkcyk7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX0RFUkVHX1NORF9NT0RFTDoKLQkJcmMgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fZGVyZWdfbW9kZWwoY29yZSwgc2Vzc2lvbiwgJmlkcyk7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX0NVU1RPTV9QQVJBTVM6Ci0JCXJjID0gd2NkX2NwZV9zZW5kX2N1c3RvbV9wYXJhbShjb3JlLCBzZXNzaW9uLAotCQkJCQkgICAgICAgZGF0YSwgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogd3JvbmcgcGFyYW1fdHlwZSAweCV4XG4iLAotCQkJX19mdW5jX18sIHBhcmFtX3R5cGUpOwotCX0KLQotCWlmIChyYykKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IHNlbmRfcGFyYW0oJWQpIGZhaWxlZCwgZXJyICVkXG4iLAotCQkJIF9fZnVuY19fLCBwYXJhbV90eXBlLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogd2NkX2NwZV9sc21fc2V0X3BhcmFtczogc2V0IHRoZSBwYXJhbWV0ZXJzIGZvciBsc20gc2VydmljZQotICogQGNvcmU6IGhhbmRsZSB0byBjcGUgY29yZQotICogQHNlc3Npb246IHNlc3Npb24gZm9yIHdoaWNoIHRoZSBwYXJhbWV0ZXJzIGFyZSB0byBiZSBzZXQKLSAqIEBkZXRlY3RfbW9kZTogbW9kZSBmb3IgZGV0ZWN0aW9uCi0gKiBAZGV0ZWN0X2ZhaWx1cmU6IGZsYWcgaW5kaWNhdGluZyBmYWlsdXJlIGRldGVjdGlvbiBlbmFibGVkL2Rpc2FibGVkCi0gKgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfbHNtX3NldF9wYXJhbXMoc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCWVudW0gbHNtX2RldGVjdGlvbl9tb2RlIGRldGVjdF9tb2RlLCBib29sIGRldGVjdF9mYWlsdXJlKQotewotCXN0cnVjdCBjcGVfbHNtX2lkcyBpZHM7Ci0Jc3RydWN0IHNuZF9sc21fZGV0ZWN0X21vZGUgZGV0X21vZGU7Ci0KLQlpbnQgcmV0ID0gMDsKLQotCS8qIFNlbmQgbHNtIGNhbGlicmF0aW9uICovCi0JcmV0ID0gd2NkX2NwZV9zZW5kX2xzbV9jYWwoY29yZSwgc2Vzc2lvbik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHNlbnQgYWNkYiBjYWwsIGVyciA9ICVkIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0JLyogU2VuZCBvcGVyYXRpb24gbW9kZSAqLwotCWlkcy5tb2R1bGVfaWQgPSBDUEVfTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVA7Ci0JaWRzLnBhcmFtX2lkID0gQ1BFX0xTTV9QQVJBTV9JRF9PUEVSQVRJT05fTU9ERTsKLQlkZXRfbW9kZS5tb2RlID0gZGV0ZWN0X21vZGU7Ci0JZGV0X21vZGUuZGV0ZWN0X2ZhaWx1cmUgPSBkZXRlY3RfZmFpbHVyZTsKLQlyZXQgPSB3Y2RfY3BlX3NlbmRfcGFyYW1fb3Btb2RlKGNvcmUsIHNlc3Npb24sCi0JCQkJCSZkZXRfbW9kZSwgJmlkcyk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzZXQgb3Btb2RlLCBlcnI9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotZXJyX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfbHNtX3NldF9kYXRhKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkJZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGUsCi0JCQkJYm9vbCBkZXRlY3RfZmFpbHVyZSkKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IGNwZV9sc21faWRzIGlkczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPiAwKSB7Ci0JCXJldCA9IHdjZF9jcGVfbHNtX3NldF9wYXJhbXMoY29yZSwgc2Vzc2lvbiwgZGV0ZWN0X21vZGUsCi0JCQkJICAgICAgIGRldGVjdF9mYWlsdXJlKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiBsc20gc2V0IHBhcmFtcyBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycl9yZXQ7Ci0JCX0KLQotCQlpZHMubW9kdWxlX2lkID0gQ1BFX0xTTV9NT0RVTEVfSURfVk9JQ0VfV0FLRVVQOwotCQlpZHMucGFyYW1faWQgPSBDUEVfTFNNX1BBUkFNX0lEX01JTl9DT05GSURFTkNFX0xFVkVMUzsKLQkJcmV0ID0gd2NkX2NwZV9zZW5kX3BhcmFtX2NvbmZfbGV2ZWxzKGNvcmUsIHNlc3Npb24sICZpZHMpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IGxzbSBjb25maWRlbmNlIGxldmVscyBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycl9yZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJCSIlczogbm8gY29uZiBsZXZlbHMgdG8gc2V0XG4iLAotCQkJX19mdW5jX18pOwotCX0KLQotZXJyX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9sc21fcmVnX3NuZF9tb2RlbDogcmVnaXN0ZXIgdGhlIHNvdW5kIG1vZGVsIGZvciBsaXN0ZW4KLSAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCB0byByZWdpc3RlciB0aGUgc291bmQgbW9kZWwKLSAqIEBkZXRlY3RfbW9kZTogZGV0ZWN0aW9uIG1vZGUsIHVzZXIgZGVwZW5kZW50L2luZGVwZW5kZW50Ci0gKiBAZGV0ZWN0X2ZhaWx1cmU6IGZsYWcgdG8gaW5kaWNhdGUgaWYgZmFpbHVyZSBkZXRlY3Rpb24gaXMgZW5hYmxlZAotICoKLSAqIFRoZSBtZW1vcnkgcmVxdWlyZWQgZm9yIHNvdW5kIG1vZGVsIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkIG9uIENQRQotICogYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZC4KLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2xzbV9yZWdfc25kX21vZGVsKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCSBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSBlbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBkZXRlY3RfbW9kZSwKLQkJCQkgYm9vbCBkZXRlY3RfZmFpbHVyZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY21pX29ibV9tc2cgb2JtX21zZzsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0KLQlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sCi0JCQkJCSAgIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2NkX2NwZV9sc21fc2V0X2RhdGEoY29yZV9oYW5kbGUsIHNlc3Npb24sCi0JCQkJICAgZGV0ZWN0X21vZGUsIGRldGVjdF9mYWlsdXJlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBmYWlsIHRvIHNldCBsc20gZGF0YSwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCXJldCA9IGZpbGxfY21pX2hlYWRlcigmb2JtX21zZy5oZHIsIHNlc3Npb24tPmlkLAotCQkJQ01JX0NQRV9MU01fU0VSVklDRV9JRCwgMCwgMjAsCi0JCQlDUEVfTFNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX1NPVU5EX01PREVMLCB0cnVlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtZXRlcnMsIHJjID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCW9ibV9tc2cucGxkLnZlcnNpb24gPSAwOwotCW9ibV9tc2cucGxkLnNpemUgPSBzZXNzaW9uLT5zbmRfbW9kZWxfc2l6ZTsKLQlvYm1fbXNnLnBsZC5kYXRhX3B0ci5rdmFkZHIgPSBzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YTsKLQlvYm1fbXNnLnBsZC5tZW1faGFuZGxlID0gc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGU7Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm9ibV9tc2cpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBzbmRfbW9kZWxfcmVnaXN0ZXIgZmFpbGVkLCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZXJyX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2xzbV9kZXJlZ19zbmRfbW9kZWw6IGRlcmVnaXN0ZXIgdGhlIHNvdW5kIG1vZGVsIGZvciBsaXN0ZW4KLSAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggdG8gZGVyZWdpc3RlciB0aGUgc291bmQgbW9kZWwKLSAqCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9sc21fZGVyZWdfc25kX21vZGVsKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IGNtaV9oZHIgY21kX2RlcmVnX3NuZF9tb2RlbDsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sCi0JCQkJCSAgIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0KLQltZW1zZXQoJmNtZF9kZXJlZ19zbmRfbW9kZWwsIDAsIHNpemVvZihjbWRfZGVyZWdfc25kX21vZGVsKSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfZGVyZWdfc25kX21vZGVsLCBzZXNzaW9uLT5pZCwKLQkJCSAgICAwLCBDUEVfTFNNX1NFU1NJT05fQ01EX0RFUkVHSVNURVJfU09VTkRfTU9ERUwpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNtZF9kZXJlZ19zbmRfbW9kZWwpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBmYWlsZWQgdG8gc2VuZCBkZXJlZ19zbmRfbW9kZWwgY21kXG4iLAotCQkJX19mdW5jX18pOwotZW5kX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2xzbV9nZXRfYWZlX291dF9wb3J0X2lkOiBnZXQgYWZlIG91dHB1dCBwb3J0IGlkCi0gKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgQ1BFIGNvcmUKLSAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCBwb3J0IGlkIG5lZWRzIHRvIGdldAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQodm9pZCAqY29yZV9oYW5kbGUsCi0JCQkJCSAgIHN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFjb3JlIHx8ICFjb3JlLT5jb2RlYykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZSB0byAlc1xuIiwKLQkJCV9fZnVuY19fLAotCQkJKCFjb3JlKSA/ICJjb3JlIiA6ICJjb2RlYyIpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIXNlc3Npb24pIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogSW52YWxpZCBzZXNzaW9uXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWNvcmUtPmNwZV9jZGNfY2IgfHwKLQkJIWNvcmUtPmNwZV9jZGNfY2ItPmdldF9hZmVfb3V0X3BvcnRfaWQpIHsKLQkJc2Vzc2lvbi0+YWZlX291dF9wb3J0X2lkID0gV0NEX0NQRV9BRkVfT1VUX1BPUlRfMjsKLQkJZGV2X2RiZyhjb3JlLT5kZXYsCi0JCQkiJXM6IGNhbGxiYWNrIG5vdCBkZWZpbmVkLCBkZWZhdWx0IHBvcnRfaWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzZXNzaW9uLT5hZmVfb3V0X3BvcnRfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY29kZWMgPSBjb3JlLT5jb2RlYzsKLQlyYyA9IGNvcmUtPmNwZV9jZGNfY2ItPmdldF9hZmVfb3V0X3BvcnRfaWQoY29kZWMsCi0JCQkJCQkgICAmc2Vzc2lvbi0+YWZlX291dF9wb3J0X2lkKTsKLQlpZiAocmMpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBnZXQgcG9ydCBpZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IHBvcnRfaWQ6ICVkXG4iLCBfX2Z1bmNfXywKLQkJc2Vzc2lvbi0+YWZlX291dF9wb3J0X2lkKTsKLQotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2NtZF9sc21fc3RhcnQ6IHNlbmQgdGhlIHN0YXJ0IGNvbW1hbmQgdG8gbHNtCi0gKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgQ1BFIGNvcmUKLSAqIEBzZXNzaW9uOiBzZXNzaW9uIGZvciB3aGljaCBzdGFydCBjb21tYW5kIHRvIGJlIHNlbnQKLSAqCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9jbWRfbHNtX3N0YXJ0KHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlzdHJ1Y3QgY21pX2hkciBjbWRfbHNtX3N0YXJ0OwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKLQkJCQkJICAgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCW1lbXNldCgmY21kX2xzbV9zdGFydCwgMCwgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZjbWRfbHNtX3N0YXJ0LCBzZXNzaW9uLT5pZCwgMCwKLQkJCQkJICBDUEVfTFNNX1NFU1NJT05fQ01EX1NUQVJUKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZF9yZXQ7Ci0JfQotCi0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfbHNtX3N0YXJ0KTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvcmUtPmRldiwgImZhaWxlZCB0byBzZW5kIGxzbV9zdGFydCBjbWRcbiIpOwotZW5kX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2NtZF9sc21fc3RvcDogc2VuZCB0aGUgc3RvcCBjb21tYW5kIGZvciBMU00gc2VydmljZQotICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCi0gKiBAc2Vzc2lvbjogc2Vzc2lvbiBmb3Igd2hpY2ggc3RvcCBjb21tYW5kIHRvIGJlIHNlbnQKLSAqCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9jbWRfbHNtX3N0b3Aodm9pZCAqY29yZV9oYW5kbGUsCi0JCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IGNtaV9oZHIgY21kX2xzbV9zdG9wOwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwKLQkJCQkJICAgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCW1lbXNldCgmY21kX2xzbV9zdG9wLCAwLCBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKTsKLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNtZF9sc21fc3RvcCwgc2Vzc2lvbi0+aWQsIDAsCi0JCQkJCSAgQ1BFX0xTTV9TRVNTSU9OX0NNRF9TVE9QKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZF9yZXQ7Ci0JfQotCi0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZjbWRfbHNtX3N0b3ApOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBmYWlsZWQgdG8gc2VuZCBsc21fc3RvcCBjbWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci1lbmRfcmV0OgotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JcmV0dXJuIHJldDsKLQotfQotCi0vKgotICogd2NkX2NwZV9hbGxvY19sc21fc2Vzc2lvbjogYWxsb2NhdGUgYSBsc20gc2Vzc2lvbgotICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKLSAqIEBsc21fcHJpdl9kOiBsc20gcHJpdmF0ZSBkYXRhCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICp3Y2RfY3BlX2FsbG9jX2xzbV9zZXNzaW9uKAotCXZvaWQgKmNvcmVfaGFuZGxlLCB2b2lkICpjbGllbnRfZGF0YSwKLQl2b2lkICgqZXZlbnRfY2IpKHZvaWQgKiwgdTgsIHU4LCB1OCAqKSkKLXsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uOwotCWludCBpLCBzZXNzaW9uX2lkID0gLTE7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCWJvb2wgYWZlX3JlZ2lzdGVyX3NlcnZpY2UgPSBmYWxzZTsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogRXZlbiBpZiBtdWx0aXBsZSBsaXN0ZW4gc2Vzc2lvbnMgY2FuIGJlCi0JICogYWxsb2NhdGVkLCB0aGUgQUZFIHNlcnZpY2UgcmVnaXN0cmF0aW9uCi0JICogc2hvdWxkIGJlIGRvbmUgb25seSBvbmNlIGFzIENQRSBjYW4gb25seQotCSAqIGhhdmUgb25lIGluc3RhbmNlIG9mIEFGRSBzZXJ2aWNlLgotCSAqCi0JICogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2Vzc2lvbiB0byBiZSBhbGxvY2F0ZWQsCi0JICogb25seSB0aGVuIHJlZ2lzdGVyIHRoZSBhZmUgc2VydmljZS4KLQkgKi8KLQlpZiAoIXdjZF9jcGVfbHNtX3Nlc3Npb25fYWN0aXZlKCkpCi0JCWFmZV9yZWdpc3Rlcl9zZXJ2aWNlID0gdHJ1ZTsKLQotCWZvciAoaSA9IDE7IGkgPD0gV0NEX0NQRV9MU01fTUFYX1NFU1NJT05TOyBpKyspIHsKLQkJaWYgKCFsc21fc2Vzc2lvbnNbaV0pIHsKLQkJCXNlc3Npb25faWQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoc2Vzc2lvbl9pZCA8IDApIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IG1heCBhbGxvd2VkIHNlc3Npb25zIGFscmVhZHkgYWxsb2NhdGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXQgPSB3Y2RfY3BlX3ZvdGUoY29yZSwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGVuYWJsZSBjcGUsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNlc3Npb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXNzaW9uKQotCQlnb3RvIGVycl9zZXNzaW9uX2FsbG9jOwotCi0Jc2Vzc2lvbi0+aWQgPSBzZXNzaW9uX2lkOwotCXNlc3Npb24tPmV2ZW50X2NiID0gZXZlbnRfY2I7Ci0Jc2Vzc2lvbi0+Y21pX3JlZ19oYW5kbGUgPSBjbWlfcmVnaXN0ZXIod2NkX2NwZV9jbWlfbHNtX2NhbGxiYWNrLAotCQkJCQkJQ01JX0NQRV9MU01fU0VSVklDRV9JRCk7Ci0JaWYgKCFzZXNzaW9uLT5jbWlfcmVnX2hhbmRsZSkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIExTTSBzZXJ2aWNlIHdpdGggQ01JXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCXNlc3Npb24tPnByaXZfZCA9IGNsaWVudF9kYXRhOwotCW11dGV4X2luaXQoJnNlc3Npb24tPmxzbV9sb2NrKTsKLQlpZiAoYWZlX3JlZ2lzdGVyX3NlcnZpY2UpIHsKLQkJLyogUmVnaXN0ZXIgZm9yIEFGRSBTZXJ2aWNlICovCi0JCWNvcmUtPmNtaV9hZmVfaGFuZGxlID0gY21pX3JlZ2lzdGVyKHdjZF9jcGVfY21pX2FmZV9jYiwKLQkJCQkJCUNNSV9DUEVfQUZFX1NFUlZJQ0VfSUQpOwotCQl3Y2RfY3BlX2luaXRpYWxpemVfYWZlX3BvcnRfZGF0YSgpOwotCQlpZiAoIWNvcmUtPmNtaV9hZmVfaGFuZGxlKSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byByZWdpc3RlciBBRkUgc2VydmljZSB3aXRoIENNSVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycl9hZmVfc3ZjX3JlZzsKLQkJfQotCi0JCS8qIE9uY2UgQUZFIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCwgc2VuZCB0aGUgbW9kZSBjb21tYW5kICovCi0JCXJldCA9IHdjZF9jcGVfYWZlX3N2Y19jbWRfbW9kZShjb3JlLAotCQkJCUFGRV9TVkNfRVhQTElDSVRfUE9SVF9TVEFSVCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycl9hZmVfbW9kZV9jbWQ7Ci0JfQotCi0Jc2Vzc2lvbi0+bHNtX21lbV9oYW5kbGUgPSAwOwotCWluaXRfY29tcGxldGlvbigmc2Vzc2lvbi0+Y21kX2NvbXApOwotCi0JbHNtX3Nlc3Npb25zW3Nlc3Npb25faWRdID0gc2Vzc2lvbjsKLQlyZXR1cm4gc2Vzc2lvbjsKLQotZXJyX2FmZV9tb2RlX2NtZDoKLQljbWlfZGVyZWdpc3Rlcihjb3JlLT5jbWlfYWZlX2hhbmRsZSk7Ci0KLWVycl9hZmVfc3ZjX3JlZzoKLQljbWlfZGVyZWdpc3RlcihzZXNzaW9uLT5jbWlfcmVnX2hhbmRsZSk7Ci0JbXV0ZXhfZGVzdHJveSgmc2Vzc2lvbi0+bHNtX2xvY2spOwotCi1lcnJfcmV0OgotCWtmcmVlKHNlc3Npb24pOwotCi1lcnJfc2Vzc2lvbl9hbGxvYzoKLQl3Y2RfY3BlX3ZvdGUoY29yZSwgZmFsc2UpOwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogd2NkX2NwZV9sc21fY29uZmlnX2xhYl9sYXRlbmN5OiBzZW5kIGxhYiBsYXRlbmN5IHZhbHVlCi0gKiBAY29yZTogaGFuZGxlIHRvIHdjZF9jcGVfY29yZQotICogQHNlc3Npb246IGxzbSBzZXNzaW9uCi0gKiBAbGF0ZW5jeTogdGhlIHZhbHVlIG9mIGxhdGVuY3kgZm9yIGxhYiBzZXR1cCBpbiBtc2VjCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9sc21fY29uZmlnX2xhYl9sYXRlbmN5KAotCQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQl1MzIgbGF0ZW5jeSkKLXsKLQlpbnQgcmV0ID0gMCwgcGxkX3NpemUgPSBDUEVfUEFSQU1fTFNNX0xBQl9MQVRFTkNZX1NJWkU7Ci0Jc3RydWN0IGNwZV9sc21fbGFiX2xhdGVuY3lfY29uZmlnIGNwZV9sYWJfbGF0ZW5jeTsKLQlzdHJ1Y3QgY3BlX2xzbV9sYWJfY29uZmlnICpsYWJfbGF0ID0gJmNwZV9sYWJfbGF0ZW5jeS5sYXRlbmN5X2NmZzsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPSAmbGFiX2xhdC0+cGFyYW07Ci0Jc3RydWN0IGNwZV9sc21faWRzIGlkczsKLQotCWlmIChmaWxsX2xzbV9jbWRfaGVhZGVyX3YwX2luYmFuZCgmY3BlX2xhYl9sYXRlbmN5Lmhkciwgc2Vzc2lvbi0+aWQsCi0JCSh1OCkgcGxkX3NpemUsIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBoZWFkZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChsYXRlbmN5ID09IDB4MDAgfHwgbGF0ZW5jeSA+IFdDRF9DUEVfTEFCX01BWF9MQVRFTkNZKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgbGF0ZW5jeSAldVxuIiwKLQkJCV9fZnVuY19fLCBsYXRlbmN5KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbGFiX2xhdC0+bGF0ZW5jeSA9IGxhdGVuY3k7Ci0JbGFiX2xhdC0+bWlub3JfdmVyID0gMTsKLQlpZHMubW9kdWxlX2lkID0gQ1BFX0xTTV9NT0RVTEVfSURfTEFCOwotCWlkcy5wYXJhbV9pZCA9IENQRV9MU01fUEFSQU1fSURfTEFCX0NPTkZJRzsKLQl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsICZpZHMsCi0JCQkgICAgICAgUEFSQU1fU0laRV9MU01fTEFURU5DWV9TSVpFLAotCQkJICAgICAgIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0KLQlwcl9kZWJ1ZygiJXM6IE1vZHVsZSAweCV4IFBhcmFtIDB4JXggc2l6ZSAlenUgcGxkX3NpemUgMHgleFxuIiwKLQkJICBfX2Z1bmNfXywgbGFiX2xhdC0+cGFyYW0ubW9kdWxlX2lkLAotCQkgbGFiX2xhdC0+cGFyYW0ucGFyYW1faWQsIFBBUkFNX1NJWkVfTFNNX0xBVEVOQ1lfU0laRSwKLQkJIHBsZF9zaXplKTsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfbHNtX21zZyhjb3JlLCBzZXNzaW9uLCAmY3BlX2xhYl9sYXRlbmN5KTsKLQlpZiAocmV0ICE9IDApCi0JCXByX2VycigiJXM6IGxzbV9zZXRfcGFyYW1zIGZhaWxlZCwgZXJyb3IgPSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfbHNtX2xhYl9jb250cm9sOiBlbmFibGUvZGlzYWJsZSBsYWIKLSAqIEBjb3JlOiBoYW5kbGUgdG8gd2NkX2NwZV9jb3JlCi0gKiBAc2Vzc2lvbjogbHNtIHNlc3Npb24KLSAqIEBlbmFibGU6IEluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSAvIGRpc2FibGUgbGFiCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9sc21fbGFiX2NvbnRyb2woCi0JCXZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQlib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0JaW50IHJldCA9IDAsIHBsZF9zaXplID0gQ1BFX1BBUkFNX1NJWkVfTFNNX0xBQl9DT05UUk9MOwotCXN0cnVjdCBjcGVfbHNtX2NvbnRyb2xfbGFiIGNwZV9sYWJfZW5hYmxlOwotCXN0cnVjdCBjcGVfbHNtX2xhYl9lbmFibGUgKmxhYl9lbmFibGUgPSAmY3BlX2xhYl9lbmFibGUubGFiX2VuYWJsZTsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPSAmbGFiX2VuYWJsZS0+cGFyYW07Ci0Jc3RydWN0IGNwZV9sc21faWRzIGlkczsKLQotCXByX2RlYnVnKCIlczogZW50ZXIgcGF5bG9hZF9zaXplID0gJWQgRW5hYmxlICVkXG4iLAotCQkgX19mdW5jX18sIHBsZF9zaXplLCBlbmFibGUpOwotCi0JbWVtc2V0KCZjcGVfbGFiX2VuYWJsZSwgMCwgc2l6ZW9mKGNwZV9sYWJfZW5hYmxlKSk7Ci0KLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmNwZV9sYWJfZW5hYmxlLmhkciwgc2Vzc2lvbi0+aWQsCi0JCSh1OCkgcGxkX3NpemUsIENQRV9MU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMikpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChlbmFibGUgPT0gdHJ1ZSkKLQkJbGFiX2VuYWJsZS0+ZW5hYmxlID0gMTsKLQllbHNlCi0JCWxhYl9lbmFibGUtPmVuYWJsZSA9IDA7Ci0KLQlpZHMubW9kdWxlX2lkID0gQ1BFX0xTTV9NT0RVTEVfSURfTEFCOwotCWlkcy5wYXJhbV9pZCA9IENQRV9MU01fUEFSQU1fSURfTEFCX0VOQUJMRTsKLQl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsICZpZHMsCi0JCQlQQVJBTV9TSVpFX0xTTV9DT05UUk9MX1NJWkUsCi0JCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOwotCi0JcHJfZGVidWcoIiVzOiBNb2R1bGUgMHgleCwgUGFyYW0gMHgleCBzaXplICV6dSBwbGRfc2l6ZSAweCV4XG4iLAotCQkgX19mdW5jX18sIGxhYl9lbmFibGUtPnBhcmFtLm1vZHVsZV9pZCwKLQkJIGxhYl9lbmFibGUtPnBhcmFtLnBhcmFtX2lkLCBQQVJBTV9TSVpFX0xTTV9DT05UUk9MX1NJWkUsCi0JCSBwbGRfc2l6ZSk7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJmNwZV9sYWJfZW5hYmxlKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogbHNtX3NldF9wYXJhbXMgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQotCWlmIChsYWJfZW5hYmxlLT5lbmFibGUpCi0JCXJldCA9IHdjZF9jcGVfbHNtX2NvbmZpZ19sYWJfbGF0ZW5jeShjb3JlLCBzZXNzaW9uLAotCQkJCQkgICAgICAgV0NEX0NQRV9MQUJfTUFYX0xBVEVOQ1kpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9sc21fZW9iOiBzdG9wIGxhYgotICogQGNvcmU6IGhhbmRsZSB0byB3Y2RfY3BlX2NvcmUKLSAqIEBzZXNzaW9uOiBsc20gc2Vzc2lvbiB0byBiZSBkZWFsbG9jYXRlZAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfbHNtX2VvYigKLQkJCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUsCi0JCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjbWlfaGRyIGxhYl9lb2I7Ci0KLQlpZiAoZmlsbF9sc21fY21kX2hlYWRlcl92MF9pbmJhbmQoJmxhYl9lb2IsIHNlc3Npb24tPmlkLAotCQkwLCBDUEVfTFNNX1NFU1NJT05fQ01EX0VPQikpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9sc21fbXNnKGNvcmUsIHNlc3Npb24sICZsYWJfZW9iKTsKLQlpZiAocmV0ICE9IDApCi0JCXByX2VycigiJXM6IGxzbV9zZXRfcGFyYW1zIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCVdDRF9DUEVfUkVMX0xPQ0soJnNlc3Npb24tPmxzbV9sb2NrLCAibHNtIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uOiBkZWFsbG9jYXRlIGxzbSBzZXNzaW9uCi0gKiBAY29yZTogaGFuZGxlIHRvIHdjZF9jcGVfY29yZQotICogQHNlc3Npb246IGxzbSBzZXNzaW9uIHRvIGJlIGRlYWxsb2NhdGVkCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIXNlc3Npb24pIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgbHNtIHNlc3Npb25cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZyhjb3JlLT5kZXYsICIlczogc2Vzc2lvbiAlZCBiZWluZyBkZWFsbG9jYXRlZFxuIiwKLQkJX19mdW5jX18sIHNlc3Npb24tPmlkKTsKLQlpZiAoc2Vzc2lvbi0+aWQgPiBXQ0RfQ1BFX0xTTV9NQVhfU0VTU0lPTlMpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IFdyb25nIHNlc3Npb24gaWQgJWQgbWF4IGFsbG93ZWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzZXNzaW9uLT5pZCwKLQkJCVdDRF9DUEVfTFNNX01BWF9TRVNTSU9OUyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNtaV9kZXJlZ2lzdGVyKHNlc3Npb24tPmNtaV9yZWdfaGFuZGxlKTsKLQltdXRleF9kZXN0cm95KCZzZXNzaW9uLT5sc21fbG9jayk7Ci0JbHNtX3Nlc3Npb25zW3Nlc3Npb24tPmlkXSA9IE5VTEw7Ci0Ja2ZyZWUoc2Vzc2lvbik7Ci0KLQlpZiAoIXdjZF9jcGVfbHNtX3Nlc3Npb25fYWN0aXZlKCkpIHsKLQkJY21pX2RlcmVnaXN0ZXIoY29yZS0+Y21pX2FmZV9oYW5kbGUpOwotCQljb3JlLT5jbWlfYWZlX2hhbmRsZSA9IE5VTEw7Ci0JCXdjZF9jcGVfZGVpbml0aWFsaXplX2FmZV9wb3J0X2RhdGEoKTsKLQl9Ci0KLQlyZXQgPSB3Y2RfY3BlX3ZvdGUoY29yZSwgZmFsc2UpOwotCWlmIChyZXQpCi0JCWRldl9kYmcoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gdW4tdm90ZSBjcGUsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfbGFiX2NoX3NldHVwKHZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQllbnVtIHdjZF9jcGVfZXZlbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlpbnQgcmMgPSAwOwotCXU4IGNwZV9pbnRyX2JpdHM7Ci0KLQlpZiAoIWNvcmUgfHwgIWNvcmUtPmNvZGVjKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIHRvICVzXG4iLAotCQkJX19mdW5jX18sCi0JCQkoIWNvcmUpID8gImNvcmUiIDogImNvZGVjIik7Ci0JCXJjID0gRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCFjb3JlLT5jcGVfY2RjX2NiIHx8Ci0JICAgICFjb3JlLT5jcGVfY2RjX2NiLT5jZGNfZXh0X2NsayB8fAotCSAgICAhY29yZS0+Y3BlX2NkY19jYi0+bGFiX2NkY19jaF9jdGwpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgY29kZWMgY2FsbGJhY2tzXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljb2RlYyA9IGNvcmUtPmNvZGVjOwotCWRldl9kYmcoY29yZS0+ZGV2LAotCQkiJXM6IGV2ZW50ID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFdDRF9DUEVfUFJFX0VOQUJMRToKLQkJcmMgPSBjb3JlLT5jcGVfY2RjX2NiLT5jZGNfZXh0X2Nsayhjb2RlYywgdHJ1ZSwgZmFsc2UpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSBjZGMgY2xrLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcmMgPSBjb3JlLT5jcGVfY2RjX2NiLT5sYWJfY2RjX2NoX2N0bChjb2RlYywKLQkJCQkJCSAgICAgIHRydWUpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSBjZGMgcG9ydCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJjID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2V4dF9jbGsoY29kZWMsIGZhbHNlLCBmYWxzZSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgV0NEX0NQRV9QT1NUX0VOQUJMRToKLQkJcmMgPSBjcGVfc3ZjX3RvZ2dsZV9sYWIoY29yZS0+Y3BlX2hhbmRsZSwgdHJ1ZSk7Ci0JCWlmIChyYykKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGxhYlxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQotCWNhc2UgV0NEX0NQRV9QUkVfRElTQUJMRToKLQkJLyoKLQkJICogTWFzayB0aGUgbm9uLWZhdGFsIGludGVycnVwdHMgaW4gQ1BFIGFzIHRoZXkgd2lsbAotCQkgKiBiZSBnZW5lcmF0ZWQgZHVyaW5nIGxhYiB0ZWFyZG93biBhbmQgbWF5IGZsb29kLgotCQkgKi8KLQkJY3BlX2ludHJfYml0cyA9IH4oY29yZS0+aXJxX2luZm8uY3BlX2ZhdGFsX2lycXMgJiAweEZGKTsKLQkJaWYgKENQRV9FUlJfSVJRX0NCKGNvcmUpKQotCQkJY29yZS0+Y3BlX2NkY19jYi0+Y3BlX2Vycl9pcnFfY29udHJvbCgKLQkJCQkJCWNvcmUtPmNvZGVjLAotCQkJCQkJQ1BFX0VSUl9JUlFfTUFTSywKLQkJCQkJCSZjcGVfaW50cl9iaXRzKTsKLQotCQlyYyA9IGNvcmUtPmNwZV9jZGNfY2ItPmxhYl9jZGNfY2hfY3RsKGNvZGVjLAotCQkJCQkJICAgICAgZmFsc2UpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IGZhaWxlZCB0byBkaXNhYmxlIGNkYyBwb3J0LCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQotCWNhc2UgV0NEX0NQRV9QT1NUX0RJU0FCTEU6Ci0JCXJjID0gd2NkX2NwZV9sc21fZW9iKGNvcmUsIHNlc3Npb24pOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IGVvYiBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQotCQkvKiBDb250aW51ZSB0ZWFyZG93biBldmVuIGlmIGVvYiBmYWlsZWQgKi8KLQkJcmMgPSBjcGVfc3ZjX3RvZ2dsZV9sYWIoY29yZS0+Y3BlX2hhbmRsZSwgZmFsc2UpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIGRpc2FibGUgbGFiXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJLyogQ29udGludWUgd2l0aCBkaXNhYmxpbmcgZXZlbiBpZiB0b2dnbGUgbGFiIGZhaWxzICovCi0JCXJjID0gY29yZS0+Y3BlX2NkY19jYi0+Y2RjX2V4dF9jbGsoY29kZWMsIGZhbHNlLCBmYWxzZSk7Ci0JCWlmIChyYykKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGRpc2FibGUgY2RjIGNsaywgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQotCQkvKiBVbm1hc2sgbm9uLWZhdGFsIENQRSBpbnRlcnJ1cHRzICovCi0JCWNwZV9pbnRyX2JpdHMgPSB+KGNvcmUtPmlycV9pbmZvLmNwZV9mYXRhbF9pcnFzICYgMHhGRik7Ci0JCWlmIChDUEVfRVJSX0lSUV9DQihjb3JlKSkKLQkJCWNvcmUtPmNwZV9jZGNfY2ItPmNwZV9lcnJfaXJxX2NvbnRyb2woCi0JCQkJCQljb3JlLT5jb2RlYywKLQkJCQkJCUNQRV9FUlJfSVJRX1VOTUFTSywKLQkJCQkJCSZjcGVfaW50cl9iaXRzKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogSW52YWxpZCBldmVudCAweCV4XG4iLAotCQkJX19mdW5jX18sIGV2ZW50KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHdjZF9jcGVfbHNtX3NldF9mbXRfY2ZnKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBjcGVfbHNtX291dHB1dF9mb3JtYXRfY2ZnIG91dF9mbXRfY2ZnOwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfbHNtX3Nlc3Npb24oY29yZSwgc2Vzc2lvbiwgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCWdvdG8gZG9uZTsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZzZXNzaW9uLT5sc21fbG9jaywgImxzbSIpOwotCi0JbWVtc2V0KCZvdXRfZm10X2NmZywgMCwgc2l6ZW9mKG91dF9mbXRfY2ZnKSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKCZvdXRfZm10X2NmZy5oZHIsCi0JCQlzZXNzaW9uLT5pZCwgT1VUX0ZNVF9DRkdfQ01EX1BBWUxPQURfU0laRSwKLQkJCUNQRV9MU01fU0VTU0lPTl9DTURfVFhfQlVGRl9PVVRQVVRfQ09ORklHKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0Jb3V0X2ZtdF9jZmcuZm9ybWF0ID0gc2Vzc2lvbi0+b3V0X2ZtdF9jZmcuZm9ybWF0OwotCW91dF9mbXRfY2ZnLnBhY2tpbmcgPSBzZXNzaW9uLT5vdXRfZm10X2NmZy5wYWNrX21vZGU7Ci0Jb3V0X2ZtdF9jZmcuZGF0YV9wYXRoX2V2ZW50cyA9IHNlc3Npb24tPm91dF9mbXRfY2ZnLmRhdGFfcGF0aF9ldmVudHM7Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm91dF9mbXRfY2ZnKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogbHNtX3NldF9vdXRwdXRfZm9ybWF0X2NmZyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLWVycl9yZXQ6Ci0JV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2NkX2NwZV9zbmRfbW9kZWxfb2Zmc2V0KHZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLCBzaXplX3QgKm9mZnNldCkKLXsKLQkqb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBjcGVfcGFyYW1fZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9sc21fc2V0X21lZGlhX2ZtdF9wYXJhbXModm9pZCAqY29yZV9oYW5kbGUsCi0JCQkJCSAgc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkJICBzdHJ1Y3QgbHNtX2h3X3BhcmFtcyAqcGFyYW0pCi17Ci0Jc3RydWN0IGNwZV9sc21fbWVkaWFfZm10X3BhcmFtIG1lZGlhX2ZtdDsKLQlzdHJ1Y3QgY21pX2hkciAqbXNnX2hkciA9ICZtZWRpYV9mbXQuaGRyOwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlzdHJ1Y3QgY3BlX3BhcmFtX2RhdGEgKnBhcmFtX2QgPSAmbWVkaWFfZm10LnBhcmFtOwotCXN0cnVjdCBjcGVfbHNtX2lkcyBpZHM7Ci0JaW50IHJldDsKLQotCW1lbXNldCgmbWVkaWFfZm10LCAwLCBzaXplb2YobWVkaWFfZm10KSk7Ci0JaWYgKGZpbGxfbHNtX2NtZF9oZWFkZXJfdjBfaW5iYW5kKG1zZ19oZHIsCi0JCQkJc2Vzc2lvbi0+aWQsCi0JCQkJQ1BFX01FRElBX0ZNVF9QTERfU0laRSwKLQkJCQlDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltZW1zZXQoJmlkcywgMCwgc2l6ZW9mKGlkcykpOwotCWlkcy5tb2R1bGVfaWQgPSBDUEVfTFNNX01PRFVMRV9GUkFNRVdPUks7Ci0JaWRzLnBhcmFtX2lkID0gQ1BFX0xTTV9QQVJBTV9JRF9NRURJQV9GTVQ7Ci0KLQl3Y2RfY3BlX3NldF9wYXJhbV9kYXRhKHBhcmFtX2QsICZpZHMsIENQRV9NRURJQV9GTVRfUEFSQU1fU0laRSwKLQkJCSAgICAgICBDUEVfTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOwotCi0JbWVkaWFfZm10Lm1pbm9yX3ZlcnNpb24gPSAxOwotCW1lZGlhX2ZtdC5zYW1wbGVfcmF0ZSA9IHBhcmFtLT5zYW1wbGVfcmF0ZTsKLQltZWRpYV9mbXQubnVtX2NoYW5uZWxzID0gcGFyYW0tPm51bV9jaHM7Ci0JbWVkaWFfZm10LmJpdF93aWR0aCA9IHBhcmFtLT5iaXRfd2lkdGg7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2xzbV9tc2coY29yZSwgc2Vzc2lvbiwgJm1lZGlhX2ZtdCk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IFNldF9wYXJhbShtZWRpYV9mb3JtYXQpIGZhaWxlZCwgZXJyPSVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JV0NEX0NQRV9SRUxfTE9DSygmc2Vzc2lvbi0+bHNtX2xvY2ssICJsc20iKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3Y2RfY3BlX2xzbV9zZXRfcG9ydCh2b2lkICpjb3JlX2hhbmRsZSwKLQkJCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLCB2b2lkICpkYXRhKQotewotCXUzMiBwb3J0X2lkOwotCWludCByZXQ7Ci0Jc3RydWN0IGNwZV9sc21faWRzIGlkczsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0KLQlyZXQgPSB3Y2RfY3BlX2lzX3ZhbGlkX2xzbV9zZXNzaW9uKGNvcmUsIHNlc3Npb24sIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlnb3RvIGRvbmU7Ci0KLQlpZiAoIWRhdGEpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsICIlczogZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcG9ydF9pZCA9ICoodTMyICopZGF0YTsKLQlkZXZfZGJnKGNvcmUtPmRldiwgIiVzOiBwb3J0X2lkOiAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCi0JbWVtc2V0KCZpZHMsIDAsIHNpemVvZihpZHMpKTsKLQlpZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9GUkFNRVdPUks7Ci0JaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0NPTk5FQ1RfVE9fUE9SVDsKLQotCXJldCA9IHdjZF9jcGVfc2VuZF9wYXJhbV9jb25uZWN0cG9ydChjb3JlLCBzZXNzaW9uLCBOVUxMLAotCQkJCQkgICAgICZpZHMsIHBvcnRfaWQpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBzZW5kX3BhcmFtX2Nvbm5lY3Rwb3J0IGZhaWxlZCwgZXJyICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2dldF9sc21fb3BzOiByZWdpc3RlciBsc20gZHJpdmVyIHRvIGNvZGVjCi0gKiBAbHNtX29wczogc3RydWN0dXJlIHdpdGggbHNtIGNhbGxiYWNrcwotICogQGNvZGVjOiBjb2RlYyB0byB3aGljaCB0aGlzIGxzbSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB0bwotICovCi1pbnQgd2NkX2NwZV9nZXRfbHNtX29wcyhzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzKQotewotCWxzbV9vcHMtPmxzbV9hbGxvY19zZXNzaW9uID0gd2NkX2NwZV9hbGxvY19sc21fc2Vzc2lvbjsKLQlsc21fb3BzLT5sc21fZGVhbGxvY19zZXNzaW9uID0gd2NkX2NwZV9kZWFsbG9jX2xzbV9zZXNzaW9uOwotCWxzbV9vcHMtPmxzbV9vcGVuX3R4ID0gd2NkX2NwZV9jbWRfbHNtX29wZW5fdHg7Ci0JbHNtX29wcy0+bHNtX2Nsb3NlX3R4ID0gd2NkX2NwZV9jbWRfbHNtX2Nsb3NlX3R4OwotCWxzbV9vcHMtPmxzbV9zaG1lbV9hbGxvYyA9IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9hbGxvYzsKLQlsc21fb3BzLT5sc21fc2htZW1fZGVhbGxvYyA9IHdjZF9jcGVfY21kX2xzbV9zaG1lbV9kZWFsbG9jOwotCWxzbV9vcHMtPmxzbV9yZWdpc3Rlcl9zbmRfbW9kZWwgPSB3Y2RfY3BlX2xzbV9yZWdfc25kX21vZGVsOwotCWxzbV9vcHMtPmxzbV9kZXJlZ2lzdGVyX3NuZF9tb2RlbCA9IHdjZF9jcGVfbHNtX2RlcmVnX3NuZF9tb2RlbDsKLQlsc21fb3BzLT5sc21fZ2V0X2FmZV9vdXRfcG9ydF9pZCA9IHdjZF9jcGVfbHNtX2dldF9hZmVfb3V0X3BvcnRfaWQ7Ci0JbHNtX29wcy0+bHNtX3N0YXJ0ID0gd2NkX2NwZV9jbWRfbHNtX3N0YXJ0OwotCWxzbV9vcHMtPmxzbV9zdG9wID0gd2NkX2NwZV9jbWRfbHNtX3N0b3A7Ci0JbHNtX29wcy0+bHNtX2xhYl9jb250cm9sID0gd2NkX2NwZV9sc21fbGFiX2NvbnRyb2w7Ci0JbHNtX29wcy0+bGFiX2NoX3NldHVwID0gd2NkX2NwZV9sYWJfY2hfc2V0dXA7Ci0JbHNtX29wcy0+bHNtX3NldF9kYXRhID0gd2NkX2NwZV9sc21fc2V0X2RhdGE7Ci0JbHNtX29wcy0+bHNtX3NldF9mbXRfY2ZnID0gd2NkX2NwZV9sc21fc2V0X2ZtdF9jZmc7Ci0JbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0gPSB3Y2RfY3BlX3NldF9vbmVfcGFyYW07Ci0JbHNtX29wcy0+bHNtX2dldF9zbmRfbW9kZWxfb2Zmc2V0ID0gd2NkX2NwZV9zbmRfbW9kZWxfb2Zmc2V0OwotCWxzbV9vcHMtPmxzbV9zZXRfbWVkaWFfZm10X3BhcmFtcyA9IHdjZF9jcGVfbHNtX3NldF9tZWRpYV9mbXRfcGFyYW1zOwotCWxzbV9vcHMtPmxzbV9zZXRfcG9ydCA9IHdjZF9jcGVfbHNtX3NldF9wb3J0OwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZF9jcGVfZ2V0X2xzbV9vcHMpOwotCi1zdGF0aWMgaW50IGZpbGxfYWZlX2NtZF9oZWFkZXIoc3RydWN0IGNtaV9oZHIgKmhkciwgdTggcG9ydF9pZCwKLQkJCQl1MTYgb3Bjb2RlLCB1OCBwbGRfc2l6ZSwKLQkJCQlib29sIG9ibV9mbGFnKQotewotCUNNSV9IRFJfU0VUX1NFU1NJT04oaGRyLCBwb3J0X2lkKTsKLQlDTUlfSERSX1NFVF9TRVJWSUNFKGhkciwgQ01JX0NQRV9BRkVfU0VSVklDRV9JRCk7Ci0KLQlDTUlfSERSX1NFVF9QQVlMT0FEX1NJWkUoaGRyLCBwbGRfc2l6ZSk7Ci0KLQloZHItPm9wY29kZSA9IG9wY29kZTsKLQotCWlmIChvYm1fZmxhZykKLQkJQ01JX0hEUl9TRVRfT0JNKGhkciwgQ01JX09CTV9GTEFHX09VVF9CQU5EKTsKLQllbHNlCi0JCUNNSV9IRFJfU0VUX09CTShoZHIsIENNSV9PQk1fRkxBR19JTl9CQU5EKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnOiBzZW5kIG1lc3NhZ2UgdG8gQUZFIHNlcnZpY2UKLSAqIEBjb3JlOiB3Y2QgY3BlIGNvcmUgaGFuZGxlCi0gKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0Ci0gKgkgICAgICBmb3Igd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHRvIGJlIHNlbnQKLSAqIEBtZXNzYWdlOiBhY3R1YWwgbWVzc2FnZSB3aXRoIGhlYWRlciBhbmQgcGF5bG9hZAotICoKLSAqIFBvcnQgc3BlY2lmaWMgbG9jayBuZWVkcyB0byBiZSBhY3F1aXJlZCBiZWZvcmUgdGhpcwotICogZnVuY3Rpb24gY2FuIGJlIGludm9rZWQKLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QsCi0Jdm9pZCAqbWVzc2FnZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyID0gbWVzc2FnZTsKLQotCXByX2RlYnVnKCIlczogc2VuZGluZyBtZXNzYWdlIHdpdGggb3Bjb2RlIDB4JXhcbiIsCi0JCV9fZnVuY19fLCBoZHItPm9wY29kZSk7Ci0KLQlpZiAodW5saWtlbHkoIXdjZF9jcGVfaXNfb25saW5lX3N0YXRlKGNvcmUpKSkgewotCQlkZXZfZXJyKGNvcmUtPmRldiwgIiVzOiBDUEUgb2ZmbGluZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoQ01JX0hEUl9HRVRfT0JNX0ZMQUcoaGRyKSkKLQkJd2NkX2NwZV9idXNfdm90ZV9tYXhfYncoY29yZSwgdHJ1ZSk7Ci0KLQlyZXQgPSBjbWlfc2VuZF9tc2cobWVzc2FnZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBjbWQgMHgleCBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUsIHJldCk7Ci0JCWdvdG8gcmVsX2J1c192b3RlOwotCX0KLQotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlLAotCQkJCQkgIENNSV9DTURfVElNRU9VVCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJcHJfZGVidWcoIiVzOiBjb21tYW5kIDB4JXgsIHJlY2VpdmVkIHJlc3BvbnNlIDB4JXhcbiIsCi0JCQkgX19mdW5jX18sIGhkci0+b3Bjb2RlLCBwb3J0X2QtPmNtZF9yZXN1bHQpOwotCQlpZiAocG9ydF9kLT5jbWRfcmVzdWx0ID09IENNSV9TSE1FTV9BTExPQ19GQUlMRUQpCi0JCQlwb3J0X2QtPmNtZF9yZXN1bHQgPSBDUEVfRU5PTUVNT1JZOwotCQlpZiAocG9ydF9kLT5jbWRfcmVzdWx0ID4gMCkKLQkJCXByX2VycigiJXM6IENQRSByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGNwZV9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJcG9ydF9kLT5jbWRfcmVzdWx0KSk7Ci0JCXJldCA9IGNwZV9lcnJfZ2V0X2xueF9lcnJfY29kZShwb3J0X2QtPmNtZF9yZXN1bHQpOwotCQlnb3RvIHJlbF9idXNfdm90ZTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBjb21tYW5kIDB4JXggc2VuZCB0aW1lZCBvdXRcbiIsCi0JCQlfX2Z1bmNfXywgaGRyLT5vcGNvZGUpOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIHJlbF9idXNfdm90ZTsKLQl9Ci0KLXJlbF9idXNfdm90ZToKLQlyZWluaXRfY29tcGxldGlvbigmcG9ydF9kLT5hZmVfY21kX2NvbXBsZXRlKTsKLQotCWlmIChDTUlfSERSX0dFVF9PQk1fRkxBRyhoZHIpKQotCQl3Y2RfY3BlX2J1c192b3RlX21heF9idyhjb3JlLCBmYWxzZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQotLyoKLSAqIHdjZF9jcGVfYWZlX3NobWVtX2FsbG9jOiBhbGxvY2F0ZSB0aGUgY3BlIG1lbW9yeSBmb3IgYWZlIHNlcnZpY2UKLSAqIEBjb3JlOiBoYW5kbGUgdG8gY3BlIGNvcmUKLSAqIEBwb3J0X2NmZzogY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgcG9ydCB3aGljaCBuZWVkcwotICoJICAgICAgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBvbiBDUEUKLSAqIEBzaXplOiBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc2htZW1fYWxsb2MoCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QsCi0JdTMyIHNpemUpCi17Ci0Jc3RydWN0IGNwZV9jbWRfc2htZW1fYWxsb2MgY21kX3NobWVtX2FsbG9jOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlcjogc2l6ZSA9ICVkXG4iLCBfX2Z1bmNfXywgc2l6ZSk7Ci0KLQltZW1zZXQoJmNtZF9zaG1lbV9hbGxvYywgMCwgc2l6ZW9mKGNtZF9zaG1lbV9hbGxvYykpOwotCWlmIChmaWxsX2FmZV9jbWRfaGVhZGVyKCZjbWRfc2htZW1fYWxsb2MuaGRyLCBwb3J0X2QtPnBvcnRfaWQsCi0JCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9TSEFSRURfTUVNX0FMTE9DLAotCQkJICAgIFNITUVNX0FMTE9DX0NNRF9QTERfU0laRSwgZmFsc2UpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQljbWRfc2htZW1fYWxsb2Muc2l6ZSA9IHNpemU7Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgcG9ydF9kLCAmY21kX3NobWVtX2FsbG9jKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGFmZV9zaG1lbV9hbGxvYyBmYWlsLHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZW5kX3JldDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvbXBsZXRlZCAlcywgbWVtX2hhbmRsZSA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCAiQ1BFX0FGRV9DTURfU0hBUkVEX01FTV9BTExPQyIsCi0JCXBvcnRfZC0+bWVtX2hhbmRsZSk7Ci0KLWVuZF9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2M6IGRlYWxsb2NhdGUgdGhlIGNwZSBtZW1vcnkgZm9yCi0gKgkJCSAgICAgIGFmZSBzZXJ2aWNlCi0gKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAcG9ydF9kOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IHdoaWNoIG5lZWRzCi0gKgkgICAgICBtZW1vcnkgdG8gYmUgZGVhbGxvY2F0ZWQgb24gQ1BFCi0gKiBUaGUgbWVtb3J5IGhhbmRsZSB0byBiZSBkZS1hbGxvY2F0ZWQgaXMgc2F2ZWQgaW4gdGhlCi0gKiBwb3J0IGNvbmZpZ3VyYXRpb24gZGF0YQotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2MoCi0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSwKLQlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICpwb3J0X2QpCi17Ci0Jc3RydWN0IGNwZV9jbWRfc2htZW1fZGVhbGxvYyBjbWRfZGVhbGxvYzsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogZW50ZXIsIHBvcnRfaWQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBwb3J0X2QtPnBvcnRfaWQpOwotCi0JbWVtc2V0KCZjbWRfZGVhbGxvYywgMCwgc2l6ZW9mKGNtZF9kZWFsbG9jKSk7Ci0JaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmNtZF9kZWFsbG9jLmhkciwgcG9ydF9kLT5wb3J0X2lkLAotCQkJCUNQRV9BRkVfUE9SVF9DTURfU0hBUkVEX01FTV9ERUFMTE9DLAotCQkJCVNITUVNX0RFQUxMT0NfQ01EX1BMRF9TSVpFLCBmYWxzZSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmRfcmV0OwotCX0KLQotCWNtZF9kZWFsbG9jLmFkZHIgPSBwb3J0X2QtPm1lbV9oYW5kbGU7Ci0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnKGNvcmUsIHBvcnRfZCwgJmNtZF9kZWFsbG9jKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIHNlbmQgc2htZW1fZGVhbGxvYyBjbWRcbiIpOwotCQlnb3RvIGVuZF9yZXQ7Ci0JfQotCW1lbXNldCgmcG9ydF9kLT5tZW1faGFuZGxlLCAwLAotCSAgICAgICBzaXplb2YocG9ydF9kLT5tZW1faGFuZGxlKSk7Ci0KLWVuZF9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfc2VuZF9hZmVfY2FsOiBzZW5kIHRoZSBhY2RiIGNhbGlicmF0aW9uIHRvIEFGRSBwb3J0Ci0gKiBAY29yZTogaGFuZGxlIHRvIGNwZSBjb3JlCi0gKiBAcG9ydF9kOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IGZvciB3aGljaCB0aGUKLSAqCSAgICAgIGNhbGlicmF0aW9uIG5lZWRzIHRvIGJlIGFwcHBsaWVkCi0gKi8KLXN0YXRpYyBpbnQgd2NkX2NwZV9zZW5kX2FmZV9jYWwodm9pZCAqY29yZV9oYW5kbGUsCi0JCXN0cnVjdCB3Y2RfY21pX2FmZV9wb3J0X2RhdGEgKnBvcnRfZCkKLXsKLQotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWZlX2NhbCA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqY29yZSA9IGNvcmVfaGFuZGxlOwotCXN0cnVjdCBjbWlfb2JtX21zZyBvYm1fbXNnOwotCXZvaWQgKmluYl9tc2cgPSBOVUxMOwotCXZvaWQgKm1zZzsKLQlpbnQgcmMgPSAwOwotCWJvb2wgaXNfb2JtX21zZzsKLQotCWlmIChjb3JlLT5jYWxfZGF0YVtXQ0RfQ1BFX0xTTV9DQUxfQUZFXSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IExTTSBjYWwgbm90IGFsbG9jYXRlZCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byByZWxfY2FsX211dGV4OwotCX0KLQotCW11dGV4X2xvY2soJmNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9BRkVdLT5sb2NrKTsKLQlhZmVfY2FsID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJCWNvcmUtPmNhbF9kYXRhW1dDRF9DUEVfTFNNX0NBTF9BRkVdKTsKLQlpZiAoIWFmZV9jYWwpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBhZmUgY2FsIGJsb2NrXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gcmVsX2NhbF9tdXRleDsKLQl9Ci0KLQlpZiAoYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7Ci0JCWRldl9kYmcoY29yZS0+ZGV2LCAiJXM6IE5vIEFGRSBjYWwgdG8gc2VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAwOwotCQlnb3RvIHJlbF9jYWxfbXV0ZXg7Ci0JfQotCi0JaXNfb2JtX21zZyA9IChhZmVfY2FsLT5jYWxfZGF0YS5zaXplID4KLQkJICAgICAgQ01JX0lOQkFORF9NRVNTQUdFX1NJWkUpID8gdHJ1ZSA6IGZhbHNlOwotCi0JaWYgKGlzX29ibV9tc2cpIHsKLQkJc3RydWN0IGNtaV9oZHIgKmhkciA9ICYob2JtX21zZy5oZHIpOwotCQlzdHJ1Y3QgY21pX29ibSAqcGxkID0gJihvYm1fbXNnLnBsZCk7Ci0KLQkJcmMgPSB3Y2RfY3BlX2FmZV9zaG1lbV9hbGxvYyhjb3JlLCBwb3J0X2QsCi0JCQkJCWFmZV9jYWwtPmNhbF9kYXRhLnNpemUpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogQUZFIHNobWVtIGFsbG9jIGZhaWwgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gcmVsX2NhbF9tdXRleDsKLQkJfQotCi0JCXJjID0gZmlsbF9hZmVfY21kX2hlYWRlcihoZHIsIHBvcnRfZC0+cG9ydF9pZCwKLQkJCQkJIENQRV9BRkVfQ01EX1NFVF9QQVJBTSwKLQkJCQkJIENQRV9BRkVfUEFSQU1fUEFZTE9BRF9TSVpFLAotCQkJCQkgdHJ1ZSk7Ci0JCWlmIChyYykgewotCQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkJIiVzOiBpbnZhbGlkIHBhcmFtcyBmb3IgaGVhZGVyLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJd2NkX2NwZV9hZmVfc2htZW1fZGVhbGxvYyhjb3JlLCBwb3J0X2QpOwotCQkJZ290byByZWxfY2FsX211dGV4OwotCQl9Ci0KLQkJcGxkLT52ZXJzaW9uID0gMDsKLQkJcGxkLT5zaXplID0gYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZTsKLQkJcGxkLT5kYXRhX3B0ci5rdmFkZHIgPSBhZmVfY2FsLT5jYWxfZGF0YS5rdmFkZHI7Ci0JCXBsZC0+bWVtX2hhbmRsZSA9IHBvcnRfZC0+bWVtX2hhbmRsZTsKLQkJbXNnID0gJm9ibV9tc2c7Ci0KLQl9IGVsc2UgewotCQl1OCAqbXNnX3BsZDsKLQkJc3RydWN0IGNtaV9oZHIgKmhkcjsKLQotCQlpbmJfbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtaV9oZHIpICsKLQkJCQkJYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSwKLQkJCQkgIEdGUF9LRVJORUwpOwotCQlpZiAoIWluYl9tc2cpIHsKLQkJCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJCSIlczogbm8gbWVtb3J5IGZvciBhZmUgY2FsIGluYmFuZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIHJlbF9jYWxfbXV0ZXg7Ci0JCX0KLQotCQloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgaW5iX21zZzsKLQotCQlyYyA9IGZpbGxfYWZlX2NtZF9oZWFkZXIoaGRyLCBwb3J0X2QtPnBvcnRfaWQsCi0JCQkJCSBDUEVfQUZFX0NNRF9TRVRfUEFSQU0sCi0JCQkJCSBDUEVfQUZFX1BBUkFNX1BBWUxPQURfU0laRSwKLQkJCQkJIGZhbHNlKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCQkiJXM6IGludmFsaWQgcGFyYW1zIGZvciBoZWFkZXIsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlrZnJlZShpbmJfbXNnKTsKLQkJCWluYl9tc2cgPSBOVUxMOwotCQkJZ290byByZWxfY2FsX211dGV4OwotCQl9Ci0KLQkJbXNnX3BsZCA9ICgodTggKikgaW5iX21zZykgKyBzaXplb2Yoc3RydWN0IGNtaV9oZHIpOwotCQltZW1jcHkobXNnX3BsZCwgYWZlX2NhbC0+Y2FsX2RhdGEua3ZhZGRyLAotCQkgICAgICAgYWZlX2NhbC0+Y2FsX2RhdGEuc2l6ZSk7Ci0KLQkJbXNnID0gaW5iX21zZzsKLQl9Ci0KLQlyYyA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBwb3J0X2QsIG1zZyk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBhZmUgY2FsIGZvciBsaXN0ZW4gZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQotCWlmIChpc19vYm1fbXNnKSB7Ci0JCXdjZF9jcGVfYWZlX3NobWVtX2RlYWxsb2MoY29yZSwgcG9ydF9kKTsKLQkJcG9ydF9kLT5tZW1faGFuZGxlID0gMDsKLQl9IGVsc2UgewotCQlrZnJlZShpbmJfbXNnKTsKLQkJaW5iX21zZyA9IE5VTEw7Ci0JfQotCi1yZWxfY2FsX211dGV4OgotCW11dGV4X3VubG9jaygmY29yZS0+Y2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX0FGRV0tPmxvY2spOwotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIHdjZF9jcGVfaXNfdmFsaWRfcG9ydDogY2hlY2sgdmFsaWRpdHkgb2YgYWZlIHBvcnQgaWQKLSAqIEBjb3JlOiBoYW5kbGUgdG8gY29yZSB0byBjaGVjayBmb3IgdmFsaWRpdHkKLSAqIEBhZmVfY2ZnOiBjbGllbnQgcHJvdmlkZWQgYWZlIGNvbmZpZ3VyYXRpb24KLSAqIEBmdW5jOiBmdW5jdGlvbiBuYW1lIGludm9raW5nIHRoaXMgdmFsaWRpdHkgY2hlY2ssCi0gKgkgIHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZSBvbmx5LgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlLAotCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcsCi0JCWNvbnN0IGNoYXIgKmZ1bmMpCi17Ci0JaWYgKHVubGlrZWx5KElTX0VSUl9PUl9OVUxMKGNvcmUpKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcmUgaGFuZGxlXG4iLCBmdW5jKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGFmZV9jZmctPnBvcnRfaWQgPiBXQ0RfQ1BFX0FGRV9NQVhfUE9SVFMpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGludmFsaWQgYWZlIHBvcnQgKCV1KVxuIiwKLQkJCWZ1bmMsIGFmZV9jZmctPnBvcnRfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfZGJnKGNvcmUtPmRldiwKLQkJIiVzOiBwb3J0X2lkID0gJXVcbiIsCi0JCWZ1bmMsIGFmZV9jZmctPnBvcnRfaWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9hZmVfc3ZjX2NtZF9tb2RlKHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJCSAgICB1OCBtb2RlKQotewotCXN0cnVjdCBjcGVfYWZlX3N2Y19jbWRfbW9kZSBhZmVfbW9kZTsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0OwotCi0JYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbMF07Ci0JLyoKLQkgKiBBRkUgU1ZDIG1vZGUgY29tbWFuZCBpcyBmb3IgdGhlIHNlcnZpY2UgYW5kIG5vdCBwb3J0Ci0JICogc3BlY2lmaWMsIGhlbmNlIHVzZSBBRkUgcG9ydCBhcyAwIHNvIHRoZSBjb21tYW5kIHdpbGwKLQkgKiBiZSBhcHBsaWVkIHRvIGFsbCBBRkUgcG9ydHMgb24gQ1BFLgotCSAqLwotCWFmZV9wb3J0X2QtPnBvcnRfaWQgPSAwOwotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0JbWVtc2V0KCZhZmVfbW9kZSwgMCwgc2l6ZW9mKGFmZV9tb2RlKSk7Ci0JaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmFmZV9tb2RlLmhkciwgYWZlX3BvcnRfZC0+cG9ydF9pZCwKLQkJCQlDUEVfQUZFX1NWQ19DTURfTEFCX01PREUsCi0JCQkJQ1BFX0FGRV9DTURfTU9ERV9QQVlMT0FEX1NJWkUsCi0JCQkJZmFsc2UpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlhZmVfbW9kZS5tb2RlID0gbW9kZTsKLQotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmYWZlX21vZGUpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBhZmVfc3ZjX21vZGUgY21kIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotZXJyX3JldDoKLQlXQ0RfQ1BFX1JFTF9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2NkX2NwZV9hZmVfY21kX3BvcnRfY2ZnKHZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcpCi17Ci0Jc3RydWN0IGNwZV9hZmVfY21kX3BvcnRfY2ZnIHBvcnRfY2ZnX2NtZDsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIGFmZV9jZmcsIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlnb3RvIGRvbmU7Ci0KLQlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1thZmVfY2ZnLT5wb3J0X2lkXTsKLQlhZmVfcG9ydF9kLT5wb3J0X2lkID0gYWZlX2NmZy0+cG9ydF9pZDsKLQotCVdDRF9DUEVfR1JBQl9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOwotCW1lbXNldCgmcG9ydF9jZmdfY21kLCAwLCBzaXplb2YocG9ydF9jZmdfY21kKSk7Ci0JaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJnBvcnRfY2ZnX2NtZC5oZHIsCi0JCQlhZmVfY2ZnLT5wb3J0X2lkLAotCQkJQ1BFX0FGRV9QT1JUX0NNRF9HRU5FUklDX0NPTkZJRywKLQkJCUNQRV9BRkVfQ01EX1BPUlRfQ0ZHX1BBWUxPQURfU0laRSwKLQkJCWZhbHNlKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0JcG9ydF9jZmdfY21kLmJpdF93aWR0aCA9IGFmZV9jZmctPmJpdF93aWR0aDsKLQlwb3J0X2NmZ19jbWQubnVtX2NoYW5uZWxzID0gYWZlX2NmZy0+bnVtX2NoYW5uZWxzOwotCXBvcnRfY2ZnX2NtZC5zYW1wbGVfcmF0ZSA9IGFmZV9jZmctPnNhbXBsZV9yYXRlOwotCi0JaWYgKGFmZV9wb3J0X2QtPnBvcnRfaWQgPT0gQ1BFX0FGRV9QT1JUXzNfVFgpCi0JCXBvcnRfY2ZnX2NtZC5idWZmZXJfc2l6ZSA9IFdDRF9DUEVfRUNfUFBfQlVGX1NJWkU7Ci0JZWxzZQotCQlwb3J0X2NmZ19jbWQuYnVmZmVyX3NpemUgPSBBRkVfT1VUX0JVRl9TSVpFKGFmZV9jZmctPmJpdF93aWR0aCwKLQkJCQkJCQlhZmVfY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0KLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJnBvcnRfY2ZnX2NtZCk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGFmZV9wb3J0X2NvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLWVycl9yZXQ6Ci0JV0NEX0NQRV9SRUxfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfYWZlX3NldF9wYXJhbXM6IHNldCB0aGUgcGFyYW1ldGVycyBmb3IgYWZlIHBvcnQKLSAqIEBhZmVfY2ZnOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwb3J0IGZvciB3aGljaCB0aGUKLSAqCSAgICAgIHBhcmFtZXRlcnMgYXJlIHRvIGJlIHNldAotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfYWZlX3NldF9wYXJhbXModm9pZCAqY29yZV9oYW5kbGUsCi0JCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqYWZlX2NmZywgYm9vbCBhZmVfbWFkX2N0bCkKLXsKLQlzdHJ1Y3QgY3BlX2FmZV9wYXJhbXMgYWZlX3BhcmFtczsKLQlzdHJ1Y3QgY3BlX2FmZV9od19tYWRfY3RybCAqaHdfbWFkX2N0cmwgPSAmYWZlX3BhcmFtcy5od19tYWRfY3RybDsKLQlzdHJ1Y3QgY3BlX2FmZV9wb3J0X2NmZyAqcG9ydF9jZmcgPSAmYWZlX3BhcmFtcy5wb3J0X2NmZzsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0ID0gMCwgcGxkX3NpemUgPSAwOwotCi0JcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIGFmZV9jZmcsIF9fZnVuY19fKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JYWZlX3BvcnRfZCA9ICZhZmVfcG9ydHNbYWZlX2NmZy0+cG9ydF9pZF07Ci0JYWZlX3BvcnRfZC0+cG9ydF9pZCA9IGFmZV9jZmctPnBvcnRfaWQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKLQotCXJldCA9IHdjZF9jcGVfc2VuZF9hZmVfY2FsKGNvcmUsIGFmZV9wb3J0X2QpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGFmZSBhY2RiIGNhbCBzZW5kIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCXBsZF9zaXplID0gQ1BFX0FGRV9QQVJBTV9QQVlMT0FEX1NJWkU7Ci0JbWVtc2V0KCZhZmVfcGFyYW1zLCAwLCBzaXplb2YoYWZlX3BhcmFtcykpOwotCi0JaWYgKGZpbGxfYWZlX2NtZF9oZWFkZXIoJmFmZV9wYXJhbXMuaGRyLAotCQkJCWFmZV9jZmctPnBvcnRfaWQsCi0JCQkJQ1BFX0FGRV9DTURfU0VUX1BBUkFNLAotCQkJCSh1OCkgcGxkX3NpemUsIGZhbHNlKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0JaHdfbWFkX2N0cmwtPnBhcmFtLm1vZHVsZV9pZCA9IENQRV9BRkVfTU9EVUxFX0hXX01BRDsKLQlod19tYWRfY3RybC0+cGFyYW0ucGFyYW1faWQgPSBDUEVfQUZFX1BBUkFNX0lEX0hXX01BRF9DVEw7Ci0JaHdfbWFkX2N0cmwtPnBhcmFtLnBfc2l6ZS5zci5wYXJhbV9zaXplID0gUEFSQU1fU0laRV9BRkVfSFdfTUFEX0NUUkw7Ci0JaHdfbWFkX2N0cmwtPnBhcmFtLnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7Ci0JaHdfbWFkX2N0cmwtPm1pbm9yX3ZlcnNpb24gPSAxOwotCWh3X21hZF9jdHJsLT5tYWRfdHlwZSA9IE1BRF9UWVBFX0FVRElPOwotCWh3X21hZF9jdHJsLT5tYWRfZW5hYmxlID0gYWZlX21hZF9jdGw7Ci0KLQlwb3J0X2NmZy0+cGFyYW0ubW9kdWxlX2lkID0gQ1BFX0FGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKLQlwb3J0X2NmZy0+cGFyYW0ucGFyYW1faWQgPSBDUEVfQUZFX1BBUkFNX0lEX0dFTkVSSUNfUE9SVF9DT05GSUc7Ci0JcG9ydF9jZmctPnBhcmFtLnBfc2l6ZS5zci5wYXJhbV9zaXplID0gUEFSQU1fU0laRV9BRkVfUE9SVF9DRkc7Ci0JcG9ydF9jZmctPnBhcmFtLnBfc2l6ZS5zci5yZXNlcnZlZCA9IDA7Ci0JcG9ydF9jZmctPm1pbm9yX3ZlcnNpb24gPSAxOwotCXBvcnRfY2ZnLT5iaXRfd2lkdGggPSBhZmVfY2ZnLT5iaXRfd2lkdGg7Ci0JcG9ydF9jZmctPm51bV9jaGFubmVscyA9IGFmZV9jZmctPm51bV9jaGFubmVsczsKLQlwb3J0X2NmZy0+c2FtcGxlX3JhdGUgPSBhZmVfY2ZnLT5zYW1wbGVfcmF0ZTsKLQotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmYWZlX3BhcmFtcyk7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGFmZV9wb3J0X2NvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci1lcnJfcmV0OgotCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfYWZlX3BvcnRfc3RhcnQ6IHNlbmQgdGhlIHN0YXJ0IGNvbW1hbmQgdG8gYWZlIHNlcnZpY2UKLSAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIHRoZSBjcGUgY29yZQotICogQHBvcnRfY2ZnOiBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBhZmUgcG9ydCB3aGljaCBuZWVkcwotICoJICAgICAgdG8gYmUgc3RhcnRlZC4KLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2FmZV9wb3J0X3N0YXJ0KHZvaWQgKmNvcmVfaGFuZGxlLAotCQkJc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnICpwb3J0X2NmZykKLXsKLQotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07Ci0JYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOwotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0KLQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSk7Ci0JZmlsbF9hZmVfY21kX2hlYWRlcigmaGRyLCBwb3J0X2NmZy0+cG9ydF9pZCwKLQkJCSAgICBDUEVfQUZFX1BPUlRfQ01EX1NUQVJULAotCQkJICAgIDAsIGZhbHNlKTsKLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJmhkcik7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGFmZV9wb3J0X3N0YXJ0IGNtZCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JV0NEX0NQRV9SRUxfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogd2NkX2NwZV9hZmVfcG9ydF9zdG9wOiBzZW5kIHN0b3AgY29tbWFuZCB0byBhZmUgc2VydmljZQotICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCi0gKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0IHdoaWNoIG5lZWRzCi0gKgkgICAgICB0byBiZSBzdG9wcGVkLgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfYWZlX3BvcnRfc3RvcCh2b2lkICpjb3JlX2hhbmRsZSwKLQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKnBvcnRfY2ZnKQotewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07Ci0JYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOwotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0KLQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwotCWZpbGxfYWZlX2NtZF9oZWFkZXIoJmhkciwgcG9ydF9jZmctPnBvcnRfaWQsCi0JCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9TVE9QLAotCQkJICAgIDAsIGZhbHNlKTsKLQlyZXQgPSB3Y2RfY3BlX2NtaV9zZW5kX2FmZV9tc2coY29yZSwgYWZlX3BvcnRfZCwgJmhkcik7Ci0JaWYgKHJldCkKLQkJZGV2X2Vycihjb3JlLT5kZXYsCi0JCQkiJXM6IGFmZV9zdG9wIGNtZCBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlXQ0RfQ1BFX1JFTF9MT0NLKCZhZmVfcG9ydF9kLT5hZmVfbG9jaywgImFmZSIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiB3Y2RfY3BlX2FmZV9wb3J0X3N1c3BlbmQ6IHNlbmQgc3VzcGVuZCBjb21tYW5kIHRvIGFmZSBzZXJ2aWNlCi0gKiBAY29yZV9oYW5kbGU6IGhhbmRsZSB0byB0aGUgY3BlIGNvcmUKLSAqIEBwb3J0X2NmZzogY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgYWZlIHBvcnQgd2hpY2ggbmVlZHMKLSAqCSAgICAgIHRvIGJlIHN1c3BlbmRlZC4KLSAqLwotc3RhdGljIGludCB3Y2RfY3BlX2FmZV9wb3J0X3N1c3BlbmQodm9pZCAqY29yZV9oYW5kbGUsCi0JCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqcG9ydF9jZmcpCi17Ci0Jc3RydWN0IGNtaV9oZHIgaGRyOwotCXN0cnVjdCB3Y2RfY3BlX2NvcmUgKmNvcmUgPSBjb3JlX2hhbmRsZTsKLQlzdHJ1Y3Qgd2NkX2NtaV9hZmVfcG9ydF9kYXRhICphZmVfcG9ydF9kOwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gd2NkX2NwZV9pc192YWxpZF9wb3J0KGNvcmUsIHBvcnRfY2ZnLCBfX2Z1bmNfXyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWFmZV9wb3J0X2QgPSAmYWZlX3BvcnRzW3BvcnRfY2ZnLT5wb3J0X2lkXTsKLQlhZmVfcG9ydF9kLT5wb3J0X2lkID0gcG9ydF9jZmctPnBvcnRfaWQ7Ci0KLQlXQ0RfQ1BFX0dSQUJfTE9DSygmYWZlX3BvcnRfZC0+YWZlX2xvY2ssICJhZmUiKTsKLQotCW1lbXNldCgmaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNtaV9oZHIpKTsKLQlmaWxsX2FmZV9jbWRfaGVhZGVyKCZoZHIsIHBvcnRfY2ZnLT5wb3J0X2lkLAotCQkJICAgIENQRV9BRkVfUE9SVF9DTURfU1VTUEVORCwKLQkJCSAgICAwLCBmYWxzZSk7Ci0JcmV0ID0gd2NkX2NwZV9jbWlfc2VuZF9hZmVfbXNnKGNvcmUsIGFmZV9wb3J0X2QsICZoZHIpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoY29yZS0+ZGV2LAotCQkJIiVzOiBhZmVfc3VzcGVuZCBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lOiBzZW5kIHRoZSByZXN1bWUgY29tbWFuZCB0byBhZmUgc2VydmljZQotICogQGNvcmVfaGFuZGxlOiBoYW5kbGUgdG8gdGhlIGNwZSBjb3JlCi0gKiBAcG9ydF9jZmc6IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIGFmZSBwb3J0IHdoaWNoIG5lZWRzCi0gKgkgICAgICB0byBiZSByZXN1bWVkLgotICovCi1zdGF0aWMgaW50IHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lKHZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKnBvcnRfY2ZnKQotewotCXN0cnVjdCBjbWlfaGRyIGhkcjsKLQlzdHJ1Y3Qgd2NkX2NwZV9jb3JlICpjb3JlID0gY29yZV9oYW5kbGU7Ci0Jc3RydWN0IHdjZF9jbWlfYWZlX3BvcnRfZGF0YSAqYWZlX3BvcnRfZDsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZF9jcGVfaXNfdmFsaWRfcG9ydChjb3JlLCBwb3J0X2NmZywgX19mdW5jX18pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlhZmVfcG9ydF9kID0gJmFmZV9wb3J0c1twb3J0X2NmZy0+cG9ydF9pZF07Ci0JYWZlX3BvcnRfZC0+cG9ydF9pZCA9IHBvcnRfY2ZnLT5wb3J0X2lkOwotCi0JV0NEX0NQRV9HUkFCX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0KLQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwotCWZpbGxfYWZlX2NtZF9oZWFkZXIoJmhkciwgcG9ydF9jZmctPnBvcnRfaWQsCi0JCQkgICAgQ1BFX0FGRV9QT1JUX0NNRF9SRVNVTUUsCi0JCQkgICAgMCwgZmFsc2UpOwotCXJldCA9IHdjZF9jcGVfY21pX3NlbmRfYWZlX21zZyhjb3JlLCBhZmVfcG9ydF9kLCAmaGRyKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGNvcmUtPmRldiwKLQkJCSIlczogYWZlX3Jlc3VtZSBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCVdDRF9DUEVfUkVMX0xPQ0soJmFmZV9wb3J0X2QtPmFmZV9sb2NrLCAiYWZlIik7Ci0JcmV0dXJuIHJldDsKLQotfQotCi0vKgotICogd2NkX2NwZV9yZWdpc3Rlcl9hZmVfZHJpdmVyOiByZWdpc3RlciBsc20gZHJpdmVyIHRvIGNvZGVjCi0gKiBAY3BlX29wczogc3RydWN0dXJlIHdpdGggbHNtIGNhbGxiYWNrcwotICogQGNvZGVjOiBjb2RlYyB0byB3aGljaCB0aGlzIGxzbSBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB0bwotICovCi1pbnQgd2NkX2NwZV9nZXRfYWZlX29wcyhzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzKQotewotCWFmZV9vcHMtPmFmZV9zZXRfcGFyYW1zID0gd2NkX2NwZV9hZmVfc2V0X3BhcmFtczsKLQlhZmVfb3BzLT5hZmVfcG9ydF9zdGFydCA9IHdjZF9jcGVfYWZlX3BvcnRfc3RhcnQ7Ci0JYWZlX29wcy0+YWZlX3BvcnRfc3RvcCA9IHdjZF9jcGVfYWZlX3BvcnRfc3RvcDsKLQlhZmVfb3BzLT5hZmVfcG9ydF9zdXNwZW5kID0gd2NkX2NwZV9hZmVfcG9ydF9zdXNwZW5kOwotCWFmZV9vcHMtPmFmZV9wb3J0X3Jlc3VtZSA9IHdjZF9jcGVfYWZlX3BvcnRfcmVzdW1lOwotCWFmZV9vcHMtPmFmZV9wb3J0X2NtZF9jZmcgPSB3Y2RfY3BlX2FmZV9jbWRfcG9ydF9jZmc7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX2NwZV9nZXRfYWZlX29wcyk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiV0NEIENQRSBDb3JlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfY29yZS5oIGIvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX2NvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2NzJiOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgV0NEX0NQRV9DT1JFX0gKLSNkZWZpbmUgV0NEX0NQRV9DT1JFX0gKLQotI2luY2x1ZGUgPHNvYy9xY29tL3JhbWR1bXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgIndjZF9jcGVfc2VydmljZXMuaCIKLQotI2RlZmluZSBXQ0RfQ1BFX0xBQl9NQVhfTEFURU5DWSAyNTAKLSNkZWZpbmUgV0NEX0NQRV9NQURfU0xJTV9DSEFOTkVMIDE0MAotCi0vKiBJbmRpY2F0ZXMgQ1BFIGJsb2NrIGlzIHJlYWR5IGZvciBpbWFnZSByZS1kb3dubG9hZCAqLwotI2RlZmluZSBXQ0RfQ1BFX0JMS19SRUFEWSAgKDEgPDwgMCkKLS8qIEluZGljYXRlcyB0aGUgdW5kZXJseWluZyBidXMgaXMgcmVhZHkgKi8KLSNkZWZpbmUgV0NEX0NQRV9CVVNfUkVBRFkgKDEgPDwgMSkKLQotLyoKLSAqIG9ubHkgd2hlbiB0aGUgdW5kZXJseWluZyBidXMgYW5kIENQRSBibG9jayBib3RoIGFyZSByZWFkeSwKLSAqIHRoZSBzdGF0ZSB3aWxsIGJlIHJlYWR5IHRvIGRvd25sb2FkCi0gKi8KLSNkZWZpbmUgV0NEX0NQRV9SRUFEWV9UT19ETE9BRAlcCi0JKFdDRF9DUEVfQkxLX1JFQURZIHwgV0NEX0NQRV9CVVNfUkVBRFkpCi0KLSNkZWZpbmUgV0NEX0NQRV9MT0FEX0lNRU0gKDEgPDwgMCkKLSNkZWZpbmUgV0NEX0NQRV9MT0FEX0RBVEEgKDEgPDwgMSkKLSNkZWZpbmUgV0NEX0NQRV9MT0FEX0FMTCBcCi0JKFdDRF9DUEVfTE9BRF9JTUVNIHwgV0NEX0NQRV9MT0FEX0RBVEEpCi0KLSNkZWZpbmUgV0NEX0NQRV9JTUFHRV9GTkFNRV9NQVggNjQKLQotI2RlZmluZSBXQ0RfQ1BFX0FGRV9PVVRfUE9SVF8yIDIKLSNkZWZpbmUgV0NEX0NQRV9BRkVfT1VUX1BPUlRfNCA0Ci0KLWVudW0gewotCVdDRF9DUEVfTFNNX0NBTF9BRkUgPSAwLAotCVdDRF9DUEVfTFNNX0NBTF9MU00sCi0JV0NEX0NQRV9MU01fQ0FMX1RPUE9MT0dZX0lELAotCVdDRF9DUEVfTFNNX0NBTF9NQVgsCi19OwotCi1lbnVtIGNwZV9lcnJfaXJxX2NudGxfdHlwZSB7Ci0JQ1BFX0VSUl9JUlFfTUFTSyA9IDAsCi0JQ1BFX0VSUl9JUlFfVU5NQVNLLAotCUNQRV9FUlJfSVJRX0NMRUFSLAotCUNQRV9FUlJfSVJRX1NUQVRVUywKLX07Ci0KLXN0cnVjdCB3Y2RfY3BlX2NkY19jYiB7Ci0JLyogY29kZWMgcHJvdmlkZWQgY2FsbGJhY2sgdG8gZW5hYmxlIFJDTyAqLwotCWludCAoKmNkY19jbGtfZW4pKHN0cnVjdCBzbmRfc29jX2NvZGVjICosIGJvb2wpOwotCi0JLyogY2FsbGJhY2sgZm9yIEZMTCBzZXR1cCBmb3IgY29kZWMgKi8KLQlpbnQgKCpjcGVfY2xrX2VuKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqLCBib29sKTsKLQlpbnQgKCpjZGNfZXh0X2Nsaykoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgZW5hYmxlLCBib29sIGRhcG0pOwotCWludCAoKmxhYl9jZGNfY2hfY3RsKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHU4IGV2ZW50KTsKLQlpbnQgKCpnZXRfYWZlX291dF9wb3J0X2lkKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHUxNiAqcG9ydF9pZCk7Ci0JaW50ICgqYnVzX3ZvdGVfYncpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCSAgIGJvb2wgdm90ZSk7Ci0KLQkvKiBDYWxsYmFjayB0byBjb250cm9sIHRoZSBjcGUgZXJyb3IgaW50ZXJydXB0IG1hc2svc3RhdHVzL2NsZWFyICovCi0JaW50ICgqY3BlX2Vycl9pcnFfY29udHJvbCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICBlbnVtIGNwZV9lcnJfaXJxX2NudGxfdHlwZSBjbnRsX3R5cGUsCi0JCQkJICAgIHU4ICpzdGF0dXMpOwotfTsKLQotZW51bSB3Y2RfY3BlX3Nzcl9zdGF0ZV9ldmVudCB7Ci0JLyogSW5kaWNhdGVzIENQRSBpcyBpbml0aWFsaXplZCAqLwotCVdDRF9DUEVfSU5JVElBTElaRUQgPSAwLAotCS8qIEluZGljYXRlcyB0aGF0IElNRU0gaXMgZG93bmxvYWRlZCB0byBDUEUgKi8KLQlXQ0RfQ1BFX0lNRU1fRE9XTkxPQURFRCwKLQkvKiBJbmRpY2F0ZXMgQ1BFIGlzIGVuYWJsZWQgKi8KLQlXQ0RfQ1BFX0VOQUJMRUQsCi0JLyogSW5kaWNhdGVzIHRoYXQgQ1BFIGlzIGN1cnJlbnRseSBhY3RpdmUgKi8KLQlXQ0RfQ1BFX0FDVElWRSwKLQkvKiBFdmVudCBmcm9tIHVuZGVybHlpbmcgYnVzIG5vdGlmeWluZyBidXMgaXMgZG93biAqLwotCVdDRF9DUEVfQlVTX0RPV05fRVZFTlQsCi0JLyogRXZlbnQgZnJvbSBDUEUgYmxvY2ssIG5vdGlmeWluZyBDUEUgaXMgZG93biAqLwotCVdDRF9DUEVfU1NSX0VWRU5ULAotCS8qIEV2ZW50IGZyb20gdW5kZXJseWluZyBidXMgbm90aWZ5aW5nIGJ1cyBpcyB1cCAqLwotCVdDRF9DUEVfQlVTX1VQX0VWRU5ULAotfTsKLQotc3RydWN0IHdjZF9jcGVfc3NyX2VudHJ5IHsKLQlpbnQgb2ZmbGluZTsKLQl1MzIgb2ZmbGluZV9jaGFuZ2U7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb2ZmbGluZV9wb2xsX3dhaXQ7Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKLX07Ci0KLXN0cnVjdCB3Y2RfY3BlX2lycV9pbmZvIHsKLQlpbnQgY3BlX2VuZ2luZV9pcnE7Ci0JaW50IGNwZV9lcnJfaXJxOwotCXU4IGNwZV9mYXRhbF9pcnFzOwotfTsKLQotc3RydWN0IHdjZF9jcGVfaHdfaW5mbyB7Ci0JdTMyIGRyYW1fb2Zmc2V0OwotCXNpemVfdCBkcmFtX3NpemU7Ci0JdTMyIGlyYW1fb2Zmc2V0OwotCXNpemVfdCBpcmFtX3NpemU7Ci19OwotCi1zdHJ1Y3Qgd2NkX2NwZV9jb3JlIHsKLQkvKiBoYW5kbGUgdG8gY3BlIHNlcnZpY2VzICovCi0Jdm9pZCAqY3BlX2hhbmRsZTsKLQotCS8qIHJlZ2lzdHJhdGlvbiBoYW5kbGUgdG8gY3BlIHNlcnZpY2VzICovCi0Jdm9pZCAqY3BlX3JlZ19oYW5kbGU7Ci0KLQkvKiBjbWkgcmVnaXN0cmF0aW9uIGhhbmRsZSBmb3IgYWZlIHNlcnZpY2UgKi8KLQl2b2lkICpjbWlfYWZlX2hhbmRsZTsKLQotCS8qIGhhbmRsZSB0byBjb2RlYyAqLwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQotCS8qIGNvZGVjIGRldmljZSAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCS8qIGZpcm13YXJlIGltYWdlIGZpbGUgbmFtZSAqLwotCWNoYXIgZm5hbWVbV0NEX0NQRV9JTUFHRV9GTkFNRV9NQVhdOwotCi0JLyogZmlybXdhcmUgaW1hZ2UgZmlsZSBuYW1lIGZyb20gc3lzZnMgKi8KLQljaGFyIGR5bl9mbmFtZVtXQ0RfQ1BFX0lNQUdFX0ZOQU1FX01BWF07Ci0KLQkvKiBjb2RlYyBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgY3BlIHNlcnZpY2VzICovCi0Jc3RydWN0IGNwZV9zdmNfY29kZWNfaW5mb192MSBjZGNfaW5mbzsKLQotCS8qIHdvcmsgdG8gcGVyZm9ybSBpbWFnZSBkb3dubG9hZCAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBsb2FkX2Z3X3dvcms7Ci0KLQkvKiBmbGFnIHRvIGluZGljYXRlIG1vZGUgaW4gd2hpY2ggY3BlIG5lZWRzIHRvIGJlIGJvb3RlZCAqLwotCWludCBjcGVfZGVidWdfbW9kZTsKLQotCS8qIGNhbGxiYWNrcyBmb3IgY29kZWMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gKi8KLQljb25zdCBzdHJ1Y3Qgd2NkX2NwZV9jZGNfY2IgKmNwZV9jZGNfY2I7Ci0KLQkvKiB3b3JrIHRvIGhhbmRsZSBDUEUgU1NSKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3NyX3dvcms7Ci0KLQkvKiBQTSBoYW5kbGUgZm9yIHN1c3BlbmQgbW9kZSBkdXJpbmcgU1NSICovCi0Jc3RydWN0IHBtX3Fvc19yZXF1ZXN0IHBtX3Fvc19yZXE7Ci0KLQkvKiBjb21wbGV0aW9uIGV2ZW50IGluZGljYXRpbmcgQ1BFIE9GRkxJTkUgKi8KLQlzdHJ1Y3QgY29tcGxldGlvbiBvZmZsaW5lX2NvbXBsOwotCi0JLyogZW50cnkgaW50byBzbmQgY2FyZCBwcm9jZnMgaW5kaWNhdGluZyBjcGUgc3RhdHVzICovCi0Jc3RydWN0IHdjZF9jcGVfc3NyX2VudHJ5IHNzcl9lbnRyeTsKLQotCS8qCi0JICogY29tcGxldGlvbiBldmVudCB0byBzaWduYWwgQ1BFIGlzCi0JICogcmVhZHkgZm9yIGltYWdlIHJlLWRvd25sb2FkCi0JICovCi0Jc3RydWN0IGNvbXBsZXRpb24gcmVhZHlfY29tcGw7Ci0KLQkvKiBtYWludGFpbnMgdGhlIHN0YXR1cyBmb3IgY3BlIHNzciAqLwotCXU4IHJlYWR5X3N0YXR1czsKLQotCS8qIEluZGljYXRlIFNTUiB0eXBlICovCi0JZW51bSB3Y2RfY3BlX3Nzcl9zdGF0ZV9ldmVudCBzc3JfdHlwZTsKLQotCS8qIG11dGV4IHRvIHByb3RlY3QgY3BlIHNzciBzdGF0dXMgdmFyaWFibGVzICovCi0Jc3RydWN0IG11dGV4IHNzcl9sb2NrOwotCi0JLyogU3RvcmUgdGhlIGNhbGlicmF0aW9uIGRhdGEgbmVlZGVkIGZvciBjcGUgKi8KLQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbV0NEX0NQRV9MU01fQ0FMX01BWF07Ci0KLQkvKiBjb21wbGV0aW9uIGV2ZW50IHRvIHNpZ25hbCBDUEUgaXMgb25saW5lICovCi0Jc3RydWN0IGNvbXBsZXRpb24gb25saW5lX2NvbXBsOwotCi0JLyogcmVmZXJlbmNlIGNvdW50ZXIgZm9yIGNwZSB1c2FnZSAqLwotCXU4IGNwZV91c2VyczsKLQotCS8qIFJhbWR1bXAgc3VwcG9ydCAqLwotCXZvaWQgKmNwZV9yYW1kdW1wX2RldjsKLQlzdHJ1Y3QgcmFtZHVtcF9zZWdtZW50IGNwZV9yYW1kdW1wX3NlZzsKLQlkbWFfYWRkcl90IGNwZV9kdW1wX2FkZHI7Ci0Jdm9pZCAqY3BlX2R1bXBfdl9hZGRyOwotCi0JLyogU0ZSIHN1cHBvcnQgKi8KLQl1MzIgc2ZyX2J1Zl9hZGRyOwotCXNpemVfdCBzZnJfYnVmX3NpemU7Ci0KLQkvKiBJUlEgaW5mb3JtYXRpb24gZm9yIENQRSBpbnRlcnJ1cHRzICovCi0Jc3RydWN0IHdjZF9jcGVfaXJxX2luZm8gaXJxX2luZm87Ci0KLQkvKiBLb2JqZWN0IGZvciBzeXNmcyBlbnRyeSAqLwotCXN0cnVjdCBrb2JqZWN0IGNwZV9rb2JqOwotCi0JLyogUmVmZXJlbmNlIGNvdW50IGZvciBjcGUgY2xrKi8KLQlpbnQgY3BlX2Nsa19yZWY7Ci0KLQkvKiBjb2RlYyBiYXNlZCBoYXJkd2FyZSBpbmZvICovCi0Jc3RydWN0IHdjZF9jcGVfaHdfaW5mbyBod19pbmZvOwotfTsKLQotc3RydWN0IHdjZF9jcGVfcGFyYW1zIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHdjZF9jcGVfY29yZSAqICgqZ2V0X2NwZV9jb3JlKSgKLQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKLQljb25zdCBzdHJ1Y3Qgd2NkX2NwZV9jZGNfY2IgKmNkY19jYjsKLQlpbnQgZGJnX21vZGU7Ci0JdTE2IGNkY19tYWpvcl92ZXI7Ci0JdTE2IGNkY19taW5vcl92ZXI7Ci0JdTMyIGNkY19pZDsKLQotCXN0cnVjdCB3Y2RfY3BlX2lycV9pbmZvIGNkY19pcnFfaW5mbzsKLQotCXN0cnVjdCBjcGVfc3ZjX2luaXRfcGFyYW0gKmNwZV9zdmNfcGFyYW1zOwotfTsKLQotaW50IHdjZF9jcGVfc3NyX2V2ZW50KHZvaWQgKmNvcmVfaGFuZGxlLAotCQkgICAgICBlbnVtIHdjZF9jcGVfc3NyX3N0YXRlX2V2ZW50IGV2ZW50KTsKLXN0cnVjdCB3Y2RfY3BlX2NvcmUgKndjZF9jcGVfaW5pdChjb25zdCBjaGFyICppbWdfZm5hbWUsCi1zdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCB3Y2RfY3BlX3BhcmFtcyAqcGFyYW1zKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX3NlcnZpY2VzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4OTYyYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvd2NkOXh4eC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvY3BlX2NtaS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC93Y2Q5MzM1L3JlZ2lzdGVycy5oPgotI2luY2x1ZGUgIndjZF9jcGVfc2VydmljZXMuaCIKLSNpbmNsdWRlICJ3Y2RfY21pX2FwaS5oIgotCi0jZGVmaW5lIENQRV9NU0dfQlVGRkVSX1NJWkUgMTMyCi0jZGVmaW5lIENQRV9OT19TRVJWSUNFIDAKLQotI2RlZmluZSBDTUlfRFJJVkVSX1NVUFBPUlRFRF9WRVJTSU9OIDAKLSNkZWZpbmUgQ01JX0FQSV9TVUNDRVNTIDAKLSNkZWZpbmUgQ01JX01TR19UUkFOU1BPUlQgKDB4MDAwMikKLSNkZWZpbmUgQ1BFX1NWQ19JTkFDVElWRV9TVEFURV9SRVRSSUVTX01BWCAxMAotCi0jZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX09GRlNFVAkJCQkweDUwMDAwCi0jZGVmaW5lIFRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX1NJWkUJCQkJMHgzMDAwMAotI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSVJBTV9PRkZTRVQJCQkJMHg4MDAwMAotI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSVJBTV9TSVpFCQkJCTB4QzAwMAotI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfU0laRQkJCQkxMgotI2RlZmluZSBUT01UT01fQV9TVkFTU19TUEVfT1VUQk9YX1NJWkUJCQkJMTIKLQotI2RlZmluZSBNRU1fQUNDRVNTX05PTkVfVkFMCQkJMHgwCi0jZGVmaW5lIE1FTV9BQ0NFU1NfSVJBTV9WQUwJCQkweDEKLSNkZWZpbmUgTUVNX0FDQ0VTU19EUkFNX1ZBTAkJCTB4MgotI2RlZmluZSBMSVNURU5fQ1RMX1NQRV9WQUwJCQkweDAKLSNkZWZpbmUgTElTVEVOX0NUTF9NU01fVkFMCQkJMHgxCi0KLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX0RSQU1fT0ZGU0VUCQkweDQ4MDAwCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9EUkFNX1NJWkUJCTB4MzQwMDAKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX0lSQU1fT0ZGU0VUCQkweDgwMDAwCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9JUkFNX1NJWkUJCTB4MjAwMDAKLQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1hfU0laRQkJMTYKLSNkZWZpbmUgV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWF9TSVpFCQkxNgotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfTUVNX0JBTktfU0laCQkxNgotCi0jZGVmaW5lIFdDRDkzMzVfQ1BFX1NTX1NQRV9JTkJPWDEoTikJKFdDRDkzMzVfQ1BFX1NTX0lOQk9YMV8wICsgKE4pKQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19TUEVfT1VUQk9YMShOKQkoV0NEOTMzNV9DUEVfU1NfT1VUQk9YMV8wICsgKE4pKQotI2RlZmluZSBXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOSyhOKQkoV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCArIChOKSkKLQotI2RlZmluZSBDSFVOS19TSVpFIDE2Ci0KLSNkZWZpbmUgQ1BFX1NWQ19HUkFCX0xPQ0sobG9jaywgbmFtZSkJCVwKLXsJCQkJCQlcCi0JcHJfZGVidWcoIiVzOiAlcyBsb2NrIGFjcXVpcmVcbiIsCVwKLQkJIF9fZnVuY19fLCBuYW1lKTsJCVwKLQltdXRleF9sb2NrKGxvY2spOwkJCVwKLX0KLQotI2RlZmluZSBDUEVfU1ZDX1JFTF9MT0NLKGxvY2ssIG5hbWUpCQlcCi17CQkJCQkJXAotCXByX2RlYnVnKCIlczogJXMgbG9jayByZWxlYXNlXG4iLAlcCi0JCSBfX2Z1bmNfXywgbmFtZSk7CQlcCi0JbXV0ZXhfdW5sb2NrKGxvY2spOwkJCVwKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjcGVfc3ZjX2h3X2NmZyBjcGVfc3ZjX3RvbXRvbV9pbmZvID0gewotCVRPTVRPTV9BX1NWQVNTX1NQRV9EUkFNX1NJWkUsCi0JVE9NVE9NX0FfU1ZBU1NfU1BFX0RSQU1fT0ZGU0VULAotCVRPTVRPTV9BX1NWQVNTX1NQRV9JUkFNX1NJWkUsCi0JVE9NVE9NX0FfU1ZBU1NfU1BFX0lSQU1fT0ZGU0VULAotCVRPTVRPTV9BX1NWQVNTX1NQRV9JTkJPWF9TSVpFLAotCVRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfU0laRQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjcGVfc3ZjX2h3X2NmZyBjcGVfc3ZjX3djZDkzMzVfaW5mbyA9IHsKLQlXQ0Q5MzM1X0NQRV9TU19TUEVfRFJBTV9TSVpFLAotCVdDRDkzMzVfQ1BFX1NTX1NQRV9EUkFNX09GRlNFVCwKLQlXQ0Q5MzM1X0NQRV9TU19TUEVfSVJBTV9TSVpFLAotCVdDRDkzMzVfQ1BFX1NTX1NQRV9JUkFNX09GRlNFVCwKLQlXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1hfU0laRSwKLQlXQ0Q5MzM1X0NQRV9TU19TUEVfT1VUQk9YX1NJWkUKLX07Ci0KLWVudW0gY3BlX3N0YXRlIHsKLQlDUEVfU1RBVEVfVU5JTklUSUFMSVpFRCA9IDAsCi0JQ1BFX1NUQVRFX0lOSVRJQUxJWkVELAotCUNQRV9TVEFURV9JRExFLAotCUNQRV9TVEFURV9ET1dOTE9BRElORywKLQlDUEVfU1RBVEVfQk9PVElORywKLQlDUEVfU1RBVEVfU0VORElOR19NU0csCi0JQ1BFX1NUQVRFX09GRkxJTkUsCi0JQ1BFX1NUQVRFX0JVRkZFUklORywKLQlDUEVfU1RBVEVfQlVGRkVSSU5HX0NBTkNFTExFRAotfTsKLQotZW51bSBjcGVfc3Vic3RhdGUgewotCUNQRV9TU19JRExFID0gMCwKLQlDUEVfU1NfTVNHX1JFUVVFU1RfQUNDRVNTLAotCUNQRV9TU19NU0dfU0VORF9JTkJPWCwKLQlDUEVfU1NfTVNHX1NFTlQsCi0JQ1BFX1NTX0RMX0RPV05MT0FESU5HLAotCUNQRV9TU19ETF9DT01QTEVURUQsCi0JQ1BFX1NTX0JPT1QsCi0JQ1BFX1NTX0JPT1RfSU5JVCwKLQlDUEVfU1NfT05MSU5FCi19OwotCi1lbnVtIGNwZV9jb21tYW5kIHsKLQlDUEVfQ01EX0tJTExfVEhSRUFEID0gMCwKLQlDUEVfQ01EX0JPT1QsCi0JQ1BFX0NNRF9CT09UX0lOSVRJQUxJWkUsCi0JQ1BFX0NNRF9CT09UX0NPTVBMRVRFLAotCUNQRV9DTURfU0VORF9NU0csCi0JQ1BFX0NNRF9TRU5EX1RSQU5TX01TRywKLQlDUEVfQ01EX1NFTkRfTVNHX0NPTVBMRVRFLAotCUNQRV9DTURfUFJPQ0VTU19JUlEsCi0JQ1BFX0NNRF9SQU1EVU1QLAotCUNQRV9DTURfRExfU0VHTUVOVCwKLQlDUEVfQ01EX1NIVVRET1dOLAotCUNQRV9DTURfUkVTRVQsCi0JQ1BFX0NNRF9ERUlOSVRJQUxJWkUsCi0JQ1BFX0NNRF9SRUFELAotCUNQRV9DTURfRU5BQkxFX0xBQiwKLQlDUEVfQ01EX0RJU0FCTEVfTEFCLAotCUNQRV9DTURfU1dBUF9CVUZGRVIsCi0JQ1BFX0xBQl9DRkdfU0IsCi0JQ1BFX0NNRF9DQU5DRUxfTUVNQUNDRVNTLAotCUNQRV9DTURfUFJPQ19JTkNPTUlOR19NU0csCi0JQ1BFX0NNRF9GVE1fVEVTVCwKLX07Ci0KLWVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IHsKLQlDUEVfUFJPQ19TVUNDRVNTID0gMCwKLQlDUEVfUFJPQ19GQUlMRUQsCi0JQ1BFX1BST0NfS0lMTEVELAotCUNQRV9QUk9DX1FVRVVFRCwKLX07Ci0KLXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlIHsKLQllbnVtIGNwZV9jb21tYW5kIGNvbW1hbmQ7Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByZXN1bHQ7Ci0Jdm9pZCAqZGF0YTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgY3BlX2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQgbWFpbl9xdWV1ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfY29tcGxldGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24gdGhyZWFkX2NvbXA7Ci0Jdm9pZCAqdGhyZWFkX2hhbmRsZXI7Ci0JYm9vbCBzdG9wX3RocmVhZDsKLQlzdHJ1Y3QgbXV0ZXggbXNnX2xvY2s7Ci0JZW51bSBjcGVfc3RhdGUgc3RhdGU7Ci0JZW51bSBjcGVfc3Vic3RhdGUgc3Vic3RhdGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjbGllbnRfbGlzdDsKLQllbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCAoKmNwZV9wcm9jZXNzX2NvbW1hbmQpCi0JCQkoc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKmNvbW1hbmRfbm9kZSk7Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKmNwZV9jbWRfdmFsaWRhdGUpCi0JCQkJKGNvbnN0IHN0cnVjdCBjcGVfaW5mbyAqaSwKLQkJCQkgZW51bSBjcGVfY29tbWFuZCBjb21tYW5kKTsKLQllbnVtIGNwZV9zdmNfcmVzdWx0ICgqY3BlX3N0YXJ0X25vdGlmaWNhdGlvbikKLQkJCSAgICAgKHN0cnVjdCBjcGVfaW5mbyAqaSk7Ci0JdTMyIGluaXRpYWxpemVkOwotCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqdGd0OwotCXZvaWQgKnBlbmRpbmc7Ci0Jdm9pZCAqZGF0YTsKLQl2b2lkICpjbGllbnRfY29udGV4dDsKLQl1MzIgY29kZWNfaWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNsa19wbGFuX3dvcms7Ci0Jc3RydWN0IGNvbXBsZXRpb24gY29yZV9zdmNfY21kX2NvbXBsOwotfTsKLQotc3RydWN0IGNwZV90Z3Rfd2FpdGlfaW5mbyB7Ci0JdTggdGd0X3dhaXRpX3NpemU7Ci0JdTggKnRndF93YWl0aV9kYXRhOwotfTsKLQotc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uIHsKLQllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X2Jvb3QpKGludCBkZWJ1Z19tb2RlKTsKLQotCXUzMiAoKnRndF9jcGFyX2luaXRfZG9uZSkodm9pZCk7Ci0KLQl1MzIgKCp0Z3RfaXNfYWN0aXZlKSh2b2lkKTsKLQotCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3RfcmVzZXQpKHZvaWQpOwotCi0JZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF9zdG9wKSh2b2lkKTsKLQotCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3RfcmVhZF9tYWlsYm94KQotCQkJCSh1OCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0KLQllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3dyaXRlX21haWxib3gpCi0JCQkJKHU4ICpidWZmZXIsIHNpemVfdCBzaXplKTsKLQotCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3RfcmVhZF9yYW0pCi0JCQkJKHN0cnVjdCBjcGVfaW5mbyAqYywKLQkJCQkgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKmRhdGEpOwotCi0JZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF93cml0ZV9yYW0pCi0JCQkJKHN0cnVjdCBjcGVfaW5mbyAqYywKLQkJCQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqZGF0YSk7Ci0KLQllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3JvdXRlX25vdGlmaWNhdGlvbikKLQkJCQkoZW51bSBjcGVfc3ZjX21vZHVsZSBtb2R1bGUsCi0JCQkJIGVudW0gY3BlX3N2Y19yb3V0ZV9kZXN0IGRlc3QpOwotCi0JZW51bSBjcGVfc3ZjX3Jlc3VsdCAoKnRndF9zZXRfZGVidWdfbW9kZSkodTMyIGVuYWJsZSk7Ci0JY29uc3Qgc3RydWN0IGNwZV9zdmNfaHdfY2ZnICooKnRndF9nZXRfY3BlX2luZm8pKHZvaWQpOwotCWVudW0gY3BlX3N2Y19yZXN1bHQgKCp0Z3RfZGVpbml0KQotCQkJCShzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24gKnBhcmFtKTsKLQllbnVtIGNwZV9zdmNfcmVzdWx0ICgqdGd0X3ZvaWNlX3R4X2xhYikKLQkJCQkoYm9vbCk7Ci0JdTggKmluYm94OwotCXU4ICpvdXRib3g7Ci0Jc3RydWN0IGNwZV90Z3Rfd2FpdGlfaW5mbyAqdGd0X3dhaXRpX2luZm87Ci19OwotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9pbml0KAotCXN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKmNvZGVjX2luZm8sCi0Jc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSk7Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9pbml0KAotCXN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKmNvZGVjX2luZm8sCi0Jc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSk7Ci0KLXN0cnVjdCBjcGVfc2VuZF9tc2cgewotCXU4ICpwYXlsb2FkOwotCXUzMiBpc29ibTsKLQl1MzIgYWRkcmVzczsKLQlzaXplX3Qgc2l6ZTsKLX07Ci0KLXN0cnVjdCBjcGVfcmVhZF9oYW5kbGUgewotCXZvaWQgKnJlZ2lzdHJhdGlvbjsKLQlzdHJ1Y3QgY3BlX2luZm8gdF9pbmZvOwotCXN0cnVjdCBsaXN0X2hlYWQgYnVmZmVyczsKLQl2b2lkICpjb25maWc7Ci19OwotCi1zdHJ1Y3QgZ2VuZXJpY19ub3RpZmljYXRpb24gewotCXZvaWQgKCpub3RpZmljYXRpb24pCi0JCShjb25zdCBzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gKnBhcmFtZXRlcik7Ci0Jdm9pZCAoKmNtaV9ub3RpZmljYXRpb24pCi0JCShjb25zdCBzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gKnBhcmFtZXRlcik7Ci19OwotCi1zdHJ1Y3QgY3BlX25vdGlmX25vZGUgewotCXN0cnVjdCBnZW5lcmljX25vdGlmaWNhdGlvbiBub3RpZjsKLQl1MzIgbWFzazsKLQl1MzIgc2VydmljZTsKLQljb25zdCBzdHJ1Y3QgY3BlX2luZm8gKmNvbnRleHQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1MzIgZGlzYWJsZWQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotc3RydWN0IGNwZV9wcml2IHsKLQlzdHJ1Y3QgY3BlX2luZm8gKmNwZV9kZWZhdWx0X2hhbmRsZTsKLQl2b2lkICgqY3BlX2lycV9jb250cm9sX2NhbGxiYWNrKSh1MzIgZW5hYmxlKTsKLQl2b2lkICgqY3BlX3F1ZXJ5X2ZyZXFfcGxhbnNfY2IpCi0JCSh2b2lkICpjZGNfcHJpdiwKLQkJIHN0cnVjdCBjcGVfc3ZjX2NmZ19jbGtfcGxhbiAqY2xrX2ZyZXEpOwotCXZvaWQgKCpjcGVfY2hhbmdlX2ZyZXFfcGxhbl9jYikodm9pZCAqY2RjX3ByaXYsCi0JCQl1MzIgY2xrX2ZyZXEpOwotCXUzMiBjcGVfbXNnX2J1ZmZlcjsKLQl2b2lkICpjcGVfY21pX2hhbmRsZTsKLQlzdHJ1Y3QgbXV0ZXggY3BlX2FwaV9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggY3BlX3N2Y19sb2NrOwotCXN0cnVjdCBjcGVfc3ZjX2Jvb3RfZXZlbnQgY3BlX2RlYnVnX3ZlY3RvcjsKLQl2b2lkICpjZGNfcHJpdjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3BlX3ByaXYgY3BlX2Q7Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IF9fY3BlX3N2Y19zaHV0ZG93bih2b2lkICpjcGVfaGFuZGxlKTsKLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX2lzX2NvbW1hbmRfdmFsaWQoCi0JCWNvbnN0IHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCQllbnVtIGNwZV9jb21tYW5kIGNvbW1hbmQpOwotCi1zdGF0aWMgaW50IGNwZV9yZWdpc3Rlcl9yZWFkKHUzMiByZWcsIHU4ICp2YWwpCi17Ci0JKih2YWwpID0gc25kX3NvY19yZWFkKGNwZV9kLmNkY19wcml2LCByZWcpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdXBkYXRlX2JpdHModTMyIHJlZywKLQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHNuZF9zb2NfdXBkYXRlX2JpdHMoY3BlX2QuY2RjX3ByaXYsIHJlZywKLQkJCQkgIG1hc2ssIHZhbHVlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOwotCi0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBjcGVfcmVnaXN0ZXJfd3JpdGUodTMyIHJlZywgdTMyIHZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChyZWcgIT0gV0NEOTMzNV9DUEVfU1NfTUVNX0JBTktfMCkKLQkJcHJfZGVidWcoIiVzOiByZWcgPSAweCV4LCB2YWx1ZSA9IDB4JXhcbiIsCi0JCQkgIF9fZnVuY19fLCByZWcsIHZhbCk7Ci0KLQlyZXQgPSBzbmRfc29jX3dyaXRlKGNwZV9kLmNkY19wcml2LCByZWcsIHZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKLQotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgY3BlX3JlZ2lzdGVyX3dyaXRlX3JlcGVhdCh1MzIgcmVnLCB1OCAqcHRyLCB1MzIgdG9fd3JpdGUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY3BlX2QuY2RjX3ByaXY7Ci0Jc3RydWN0IHdjZDl4eHggKndjZDl4eHggPSBkZXZfZ2V0X2RydmRhdGEoY29kZWMtPmRldi0+cGFyZW50KTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHdjZDl4eHhfc2xpbV93cml0ZV9yZXBlYXQod2NkOXh4eCwgcmVnLCB0b193cml0ZSwgcHRyKTsKLQlpZiAocmV0ICE9IDApCi0JCXByX2VycigiJXM6IHNsaW1fd3JpdGVfcmVwZWF0IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKLQotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBib29sIGNwZV9yZWdpc3Rlcl9yZWFkX2F1dG9pbmNfc3VwcG9ydGVkKHZvaWQpCi17Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ2FsbGVkIHVuZGVyIG1zZ3EgbG9ja2VkIGNvbnRleHQgKi8KLXN0YXRpYyB2b2lkIGNwZV9jbWRfcmVjZWl2ZWQoc3RydWN0IGNwZV9pbmZvICp0X2luZm8pCi17Ci0Jc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKm5vZGUgPSBOVUxMOwotCWVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IHByb2NfcmMgPSBDUEVfUFJPQ19TVUNDRVNTOwotCi0JaWYgKCF0X2luZm8pIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCB0aHJlYWQgaW5mb1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmdF9pbmZvLT5tYWluX3F1ZXVlKSkgewotCQlpZiAocHJvY19yYyAhPSBDUEVfUFJPQ19TVUNDRVNTKQotCQkJYnJlYWs7Ci0JCW5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0X2luZm8tPm1haW5fcXVldWUsCi0JCQkJCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlLCBsaXN0KTsKLQkJaWYgKCFub2RlKQotCQkJYnJlYWs7Ci0JCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKLQkJcHJvY19yYyA9IHRfaW5mby0+Y3BlX3Byb2Nlc3NfY29tbWFuZChub2RlKTsKLQkJcHJfZGVidWcoIiVzOiBwcm9jZXNzIGNvbW1hbmQgcmV0dXJuICVkXG4iLAotCQkJIF9fZnVuY19fLCBwcm9jX3JjKTsKLQotCQlzd2l0Y2ggKHByb2NfcmMpIHsKLQkJY2FzZSBDUEVfUFJPQ19TVUNDRVNTOgotCQkJa2ZyZWUobm9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDUEVfUFJPQ19GQUlMRUQ6Ci0JCQlrZnJlZShub2RlKTsKLQkJCXByX2VycigiJXM6IGNtZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQljYXNlIENQRV9QUk9DX0tJTExFRDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbGlzdF9hZGQoJm5vZGUtPmxpc3QsICYodF9pbmZvLT5tYWluX3F1ZXVlKSk7Ci0KLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBjcGVfd29ya2VyX3RocmVhZCh2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNvbnRleHQ7Ci0KLQkvKgotCSAqIFRocmVhZCB3aWxsIHJ1biB1bnRpbCByZXF1ZXN0ZWQgdG8gc3RvcCBleHBsaWNpdGx5Ci0JICogYnkgc2V0dGluZyB0aGUgdF9pbmZvLT5zdG9wX3RocmVhZCBmbGFnCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJLyogV2FpdCBmb3IgY29tbWFuZCB0byBiZSBwcm9jZXNzZWQgKi8KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmdF9pbmZvLT5jbWRfY29tcGxldGUpOwotCi0JCUNQRV9TVkNfR1JBQl9MT0NLKCZ0X2luZm8tPm1zZ19sb2NrLCAibXNnX2xvY2siKTsKLQkJY3BlX2NtZF9yZWNlaXZlZCh0X2luZm8pOwotCQlyZWluaXRfY29tcGxldGlvbigmdF9pbmZvLT5jbWRfY29tcGxldGUpOwotCQkvKiBDaGVjayBpZiB0aHJlYWQgbmVlZHMgdG8gYmUgc3RvcHBlZCAqLwotCQlpZiAodF9pbmZvLT5zdG9wX3RocmVhZCkKLQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZ0X2luZm8tPm1zZ19sb2NrLCAibXNnX2xvY2siKTsKLQl9OwotCi11bmxvY2tfYW5kX2V4aXQ6Ci0JcHJfZGVidWcoIiVzOiB0aHJlYWQgc3RvcHBlZFxuIiwgX19mdW5jX18pOwotCUNQRV9TVkNfUkVMX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOwotCWNvbXBsZXRlX2FuZF9leGl0KCZ0X2luZm8tPnRocmVhZF9jb21wLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgY3BlX2NyZWF0ZV93b3JrZXJfdGhyZWFkKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvKQotewotCUlOSVRfTElTVF9IRUFEKCZ0X2luZm8tPm1haW5fcXVldWUpOwotCWluaXRfY29tcGxldGlvbigmdF9pbmZvLT5jbWRfY29tcGxldGUpOwotCWluaXRfY29tcGxldGlvbigmdF9pbmZvLT50aHJlYWRfY29tcCk7Ci0JdF9pbmZvLT5zdG9wX3RocmVhZCA9IGZhbHNlOwotCXRfaW5mby0+dGhyZWFkX2hhbmRsZXIgPSBrdGhyZWFkX3J1bihjcGVfd29ya2VyX3RocmVhZCwKLQkJKHZvaWQgKil0X2luZm8sICJjcGUtd29ya2VyLXRocmVhZCIpOwotCXByX2RlYnVnKCIlczogQ3JlYXRlZCBuZXcgd29ya2VyIHRocmVhZFxuIiwKLQkJIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgY3BlX2NsZWFudXBfd29ya2VyX3RocmVhZChzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKLXsKLQlpZiAoIXRfaW5mby0+dGhyZWFkX2hhbmRsZXIpIHsKLQkJcHJfZXJyKCIlczogdGhyZWFkIG5vdCBjcmVhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFdha2UgdXAgdGhlIGNvbW1hbmQgaGFuZGxlciBpbiBjYXNlCi0JICogaXQgaXMgd2FpdGluZyBmb3IgYW4gY29tbWFuZCB0byBiZSBwcm9jZXNzZWQuCi0JICovCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOwotCXRfaW5mby0+c3RvcF90aHJlYWQgPSB0cnVlOwotCWNvbXBsZXRlKCZ0X2luZm8tPmNtZF9jb21wbGV0ZSk7Ci0JQ1BFX1NWQ19SRUxfTE9DSygmdF9pbmZvLT5tc2dfbG9jaywgIm1zZ19sb2NrIik7Ci0KLQkvKiBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGV4aXQgKi8KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0X2luZm8tPnRocmVhZF9jb21wKTsKLQl0X2luZm8tPnRocmVhZF9oYW5kbGVyID0gTlVMTDsKLQotCXByX2RlYnVnKCIlczogVGhyZWFkIGNsZWFuZWQgdXAgc3VjY2Vzc2Z1bGx5XG4iLAotCQkgX19mdW5jX18pOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdAotY3BlX3NlbmRfY21kX3RvX3RocmVhZChzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKLQllbnVtIGNwZV9jb21tYW5kIGNvbW1hbmQsIHZvaWQgKmRhdGEsCi0JYm9vbCBoaWdoX3ByaW8pCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSAqY21kID0gTlVMTDsKLQotCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBjb21tYW5kKTsKLQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29tbWFuZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBjb21tYW5kKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfY29tbWFuZF9ub2RlKSwKLQkJICAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKLQotCWNtZC0+Y29tbWFuZCA9IGNvbW1hbmQ7Ci0JY21kLT5kYXRhID0gZGF0YTsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZ0X2luZm8tPm1zZ19sb2NrLCAibXNnX2xvY2siKTsKLQlpZiAoaGlnaF9wcmlvKQotCQlsaXN0X2FkZCgmKGNtZC0+bGlzdCksCi0JCQkgJih0X2luZm8tPm1haW5fcXVldWUpKTsKLQllbHNlCi0JCWxpc3RfYWRkX3RhaWwoJihjbWQtPmxpc3QpLAotCQkJICAgICAgJih0X2luZm8tPm1haW5fcXVldWUpKTsKLQljb21wbGV0ZSgmdF9pbmZvLT5jbWRfY29tcGxldGUpOwotCUNQRV9TVkNfUkVMX0xPQ0soJnRfaW5mby0+bXNnX2xvY2ssICJtc2dfbG9jayIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfY2hhbmdlX3N0YXRlKAotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCWVudW0gY3BlX3N0YXRlIHN0YXRlLCBlbnVtIGNwZV9zdWJzdGF0ZSBzcykKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCi0JaWYgKCF0X2luZm8pCi0JCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCXRfaW5mby0+c3RhdGUgPSBzdGF0ZTsKLQl0X2luZm8tPnN1YnN0YXRlID0gc3M7Ci0KLQlwcl9kZWJ1ZygiJXM6IGN1cnJlbnQgc3RhdGU6ICVkLCVkLCBuZXdfc3RhdGU6ICVkLCVkXG4iLAotCQkgX19mdW5jX18sIHRfaW5mby0+c3RhdGUsIHRfaW5mby0+c3Vic3RhdGUsCi0JCSBzdGF0ZSwgc3MpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdAotY3BlX2lzX2NvbW1hbmRfdmFsaWQoY29uc3Qgc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCi0JCWVudW0gY3BlX2NvbW1hbmQgY29tbWFuZCkKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQotCWlmICh0X2luZm8gJiYgdF9pbmZvLT5jcGVfY21kX3ZhbGlkYXRlKQotCQlyYyA9IHRfaW5mby0+Y3BlX2NtZF92YWxpZGF0ZSh0X2luZm8sIGNvbW1hbmQpOwotCWVsc2UKLQkJcHJfZXJyKCIlczogaW52YWxpZCBoYW5kbGUgb3IgY2FsbGJhY2tcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBjcGVfbm90aWZ5X2NsaWVudChzdHJ1Y3QgY3BlX25vdGlmX25vZGUgKmNsaWVudCwKLQkJc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXlsb2FkKQotewotCWlmICghY2xpZW50IHx8ICFwYXlsb2FkKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgY2xpZW50IG9yIHBheWxvYWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIShjbGllbnQtPm1hc2sgJiBwYXlsb2FkLT5ldmVudCkpIHsKLQkJcHJfZGVidWcoIiVzOiBjbGllbnQgbWFzayAweCV4IG5vdCByZWdpc3RlcmVkIGZvciBldmVudCAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBjbGllbnQtPm1hc2ssIHBheWxvYWQtPmV2ZW50KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjbGllbnQtPm5vdGlmLm5vdGlmaWNhdGlvbiAmJiAhY2xpZW50LT5kaXNhYmxlZCkKLQkJY2xpZW50LT5ub3RpZi5ub3RpZmljYXRpb24ocGF5bG9hZCk7Ci0KLQlpZiAoKGNsaWVudC0+bWFzayAmIENQRV9TVkNfQ01JX01TRykgJiYKLQkgICAgIGNsaWVudC0+bm90aWYuY21pX25vdGlmaWNhdGlvbikKLQkJY2xpZW50LT5ub3RpZi5jbWlfbm90aWZpY2F0aW9uKAotCQkJKGNvbnN0IHN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiAqKXBheWxvYWQpOwotfQotCi1zdGF0aWMgdm9pZCBjcGVfYnJvYWRjYXN0X25vdGlmaWNhdGlvbihjb25zdCBzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKLQkJc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXlsb2FkKQotewotCXN0cnVjdCBjcGVfbm90aWZfbm9kZSAqbiA9IE5VTEw7Ci0KLQlpZiAoIXRfaW5mbyB8fCAhcGF5bG9hZCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBub3RpZnkgY2xpZW50cywgZXZlbnQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBwYXlsb2FkLT5ldmVudCk7Ci0JcGF5bG9hZC0+cHJpdmF0ZV9kYXRhID0gY3BlX2QuY2RjX3ByaXY7Ci0KLQlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobiwgJnRfaW5mby0+Y2xpZW50X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCEobi0+bWFzayAmIENQRV9TVkNfQ01JX01TRykpCi0JCQljcGVfbm90aWZ5X2NsaWVudChuLCBwYXlsb2FkKTsKLQl9Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOwotfQotCi1zdGF0aWMgdm9pZCAqY3BlX3JlZ2lzdGVyX2dlbmVyaWMoc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCi0JCXZvaWQgbm90aWZpY2F0aW9uX2NhbGxiYWNrKAotCQkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpLAotCQl2b2lkIGNtaV9jYWxsYmFjaygKLQkJCWNvbnN0IHN0cnVjdCBjbWlfYXBpX25vdGlmaWNhdGlvbiAqcGFyYW1ldGVyKSwKLQkJdTMyIG1hc2ssIHUzMiBzZXJ2aWNlLCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBjcGVfbm90aWZfbm9kZSAqbiA9IE5VTEw7Ci0KLQluID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9ub3RpZl9ub2RlKSwKLQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghbikKLQkJcmV0dXJuIE5VTEw7Ci0Jbi0+bWFzayA9IG1hc2s7Ci0Jbi0+c2VydmljZSA9IHNlcnZpY2U7Ci0Jbi0+bm90aWYubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uX2NhbGxiYWNrOwotCW4tPm5vdGlmLmNtaV9ub3RpZmljYXRpb24gPSBjbWlfY2FsbGJhY2s7Ci0Jbi0+Y29udGV4dCA9IHRfaW5mbzsKLQluLT5kaXNhYmxlZCA9IGZhbHNlOwotCW4tPm5hbWUgPSBuYW1lOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9zdmNfbG9jaywgImNwZV9zdmMiKTsKLQkvKiBNYWtlIHN1cmUgQ1BFIGNvcmUgc2VydmljZSBpcyBmaXJzdCAqLwotCWlmIChzZXJ2aWNlID09IENNSV9DUEVfQ09SRV9TRVJWSUNFX0lEKQotCQlsaXN0X2FkZCgmbi0+bGlzdCwgJnRfaW5mby0+Y2xpZW50X2xpc3QpOwotCWVsc2UKLQkJbGlzdF9hZGRfdGFpbCgmbi0+bGlzdCwgJnRfaW5mby0+Y2xpZW50X2xpc3QpOwotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9zdmNfbG9jaywgImNwZV9zdmMiKTsKLQotCXJldHVybiBuOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfZGVyZWdpc3Rlcl9nZW5lcmljKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCQl2b2lkICpyZWdfaGFuZGxlKQotewotCXN0cnVjdCBjcGVfbm90aWZfbm9kZSAqbiA9IChzdHJ1Y3QgY3BlX25vdGlmX25vZGUgKilyZWdfaGFuZGxlOwotCi0JaWYgKCF0X2luZm8gfHwgIXJlZ19oYW5kbGUpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7Ci0JfQotCi0JbGlzdF9kZWwoJihuLT5saXN0KSk7Ci0Ja2ZyZWUocmVnX2hhbmRsZSk7Ci0KLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3RndF9pbml0KHN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKmksCi0JCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqYWJzKQotewotCWlmICghaSB8fCAhYWJzKSB7Ci0JCXByX2VycigiJXM6IEluY29ycmVjdCBpbmZvcm1hdGlvbiBwcm92aWRlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOwotCX0KLQotCXN3aXRjaCAoaS0+aWQpIHsKLQljYXNlIENQRV9TVkNfQ09ERUNfVE9NVE9NOgotCQlyZXR1cm4gY3BlX3RndF90b210b21faW5pdChpLCBhYnMpOwotCWNhc2UgQ1BFX1NWQ19DT0RFQ19XQ0Q5MzM1OgotCQlyZXR1cm4gY3BlX3RndF93Y2Q5MzM1X2luaXQoaSwgYWJzKTsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBDb2RlYyB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgaS0+aWQpOwotCQlyZXR1cm4gQ1BFX1NWQ19GQUlMRUQ7Ci0JfQotCi0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgY3BlX25vdGlmeV9jbWlfY2xpZW50KHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLCB1OCAqcGF5bG9hZCwKLQkJZW51bSBjcGVfc3ZjX3Jlc3VsdCByZXN1bHQpCi17Ci0Jc3RydWN0IGNwZV9ub3RpZl9ub2RlICpuID0gTlVMTDsKLQlzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gbm90aWY7Ci0Jc3RydWN0IGNtaV9oZHIgKmhkcjsKLQl1OCBzZXJ2aWNlID0gMDsKLQotCWlmICghdF9pbmZvIHx8ICFwYXlsb2FkKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcGF5bG9hZC9oYW5kbGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQloZHIgPSBDTUlfR0VUX0hFQURFUihwYXlsb2FkKTsKLQlzZXJ2aWNlID0gQ01JX0hEUl9HRVRfU0VSVklDRShoZHIpOwotCi0Jbm90aWYuZXZlbnQgPSBDUEVfU1ZDX0NNSV9NU0c7Ci0Jbm90aWYucmVzdWx0ID0gcmVzdWx0OwotCW5vdGlmLm1lc3NhZ2UgPSBwYXlsb2FkOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9zdmNfbG9jaywgImNwZV9zdmMiKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG4sICZ0X2luZm8tPmNsaWVudF9saXN0LCBsaXN0KSB7Ci0KLQkJaWYgKChuLT5tYXNrICYgQ1BFX1NWQ19DTUlfTVNHKSAmJgotCQkgICAgbi0+c2VydmljZSA9PSBzZXJ2aWNlICYmCi0JCSAgICBuLT5ub3RpZi5jbWlfbm90aWZpY2F0aW9uKSB7Ci0JCQluLT5ub3RpZi5jbWlfbm90aWZpY2F0aW9uKCZub3RpZik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfc3ZjX2xvY2ssICJjcGVfc3ZjIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNwZV90b2dnbGVfaXJxX25vdGlmaWNhdGlvbihzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywgdTMyIHZhbHVlKQotewotCWlmIChjcGVfZC5jcGVfaXJxX2NvbnRyb2xfY2FsbGJhY2spCi0JCWNwZV9kLmNwZV9pcnFfY29udHJvbF9jYWxsYmFjayh2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNwZV9jb21tYW5kX2NsZWFudXAoc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKmNvbW1hbmRfbm9kZSkKLXsKLQlzd2l0Y2ggKGNvbW1hbmRfbm9kZS0+Y29tbWFuZCkgewotCWNhc2UgQ1BFX0NNRF9TRU5EX01TRzoKLQljYXNlIENQRV9DTURfU0VORF9UUkFOU19NU0c6Ci0JY2FzZSBDUEVfQ01EX1NFTkRfTVNHX0NPTVBMRVRFOgotCWNhc2UgQ1BFX0NNRF9TSFVURE9XTjoKLQljYXNlIENQRV9DTURfUkVBRDoKLQkJa2ZyZWUoY29tbWFuZF9ub2RlLT5kYXRhKTsKLQkJY29tbWFuZF9ub2RlLT5kYXRhID0gTlVMTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogdW5oYW5kbGVkIGNvbW1hbmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3NlbmRfbXNnX3RvX2luYm94KAotCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywgdTMyIG9wY29kZSwKLQkJc3RydWN0IGNwZV9zZW5kX21zZyAqbXNnKQotewotCXNpemVfdCBieXRlcyA9IDA7Ci0Jc2l6ZV90IGluYm94X3NpemUgPQotCQl0X2luZm8tPnRndC0+dGd0X2dldF9jcGVfaW5mbygpLT5pbmJveF9zaXplOwotCXN0cnVjdCBjbWlfaGRyICpoZHI7Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQotCW1lbXNldCh0X2luZm8tPnRndC0+aW5ib3gsIDAsIGluYm94X3NpemUpOwotCWhkciA9IENNSV9HRVRfSEVBREVSKHRfaW5mby0+dGd0LT5pbmJveCk7Ci0JQ01JX0hEUl9TRVRfU0VTU0lPTihoZHIsIDEpOwotCUNNSV9IRFJfU0VUX1NFUlZJQ0UoaGRyLCBDTUlfQ1BFX0NPUkVfU0VSVklDRV9JRCk7Ci0JQ01JX0hEUl9TRVRfVkVSU0lPTihoZHIsIENNSV9EUklWRVJfU1VQUE9SVEVEX1ZFUlNJT04pOwotCUNNSV9IRFJfU0VUX09CTShoZHIsIENNSV9PQk1fRkxBR19JTl9CQU5EKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBDUEVfQ09SRV9TVkNfQ01EX1NIQVJFRF9NRU1fQUxMT0M6IHsKLQkJc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRfc2hhcmVkX21lbV9hbGxvYyAqbTsKLQotCQlDTUlfSERSX1NFVF9PUENPREUoaGRyLAotCQkJQ1BFX0NPUkVfU1ZDX0NNRF9TSEFSRURfTUVNX0FMTE9DKTsKLQkJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwKLQkJCXNpemVvZihzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9zaGFyZWRfbWVtX2FsbG9jKSk7Ci0JCW0gPSAoc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRfc2hhcmVkX21lbV9hbGxvYyAqKQotCQkJQ01JX0dFVF9QQVlMT0FEKHRfaW5mby0+dGd0LT5pbmJveCk7Ci0JCW0tPnNpemUgPSBDUEVfTVNHX0JVRkZFUl9TSVpFOwotCQlwcl9kZWJ1Zygic2VuZCBzaGFyZWQgbWVtIGFsbG9jIG1zZyB0byBjcGUgaW5ib3hcbiIpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BFX0NPUkVfU1ZDX0NNRF9EUkFNX0FDQ0VTU19SRVE6Ci0JCUNNSV9IRFJfU0VUX09QQ09ERShoZHIsCi0JCQlDUEVfQ09SRV9TVkNfQ01EX0RSQU1fQUNDRVNTX1JFUSk7Ci0JCUNNSV9IRFJfU0VUX1BBWUxPQURfU0laRShoZHIsIDApOwotCQlwcl9kZWJ1ZygiJXM6IENyZWF0aW5nIERSQU0gYWNjZXMgcmVxdWVzdCBtc2dcbiIsCi0JCQkgX19mdW5jX18pOwotCQlicmVhazsKLQotCWNhc2UgQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFOiB7Ci0JCXN0cnVjdCBjbWlfYmFzaWNfcnNwX3Jlc3VsdCAqcnNwOwotCi0JCUNNSV9IRFJfU0VUX09QQ09ERShoZHIsCi0JCQkgICAgICAgQ1BFX0NNSV9CQVNJQ19SU1BfT1BDT0RFKTsKLQkJQ01JX0hEUl9TRVRfUEFZTE9BRF9TSVpFKGhkciwKLQkJCXNpemVvZihzdHJ1Y3QgY21pX2Jhc2ljX3JzcF9yZXN1bHQpKTsKLQkJcnNwID0gKHN0cnVjdCBjbWlfYmFzaWNfcnNwX3Jlc3VsdCAqKQotCQkJCUNNSV9HRVRfUEFZTE9BRCh0X2luZm8tPnRndC0+aW5ib3gpOwotCQlyc3AtPnN0YXR1cyA9IDA7Ci0JCXByX2RlYnVnKCIlczogc2VuZCBiYXNpYyByZXNwb25zZVxuIiwgX19mdW5jX18pOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaWYgKG1zZy0+YWRkcmVzcyAhPSAwKSB7Ci0JCQlzdHJ1Y3QgY21pX21zZ190cmFuc3BvcnQgKm0gPSBOVUxMOwotCQkJc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgbWVtX3NlZzsKLQotCQkJbWVtX3NlZy50eXBlID0gQ1BFX1NWQ19EQVRBX01FTTsKLQkJCWlmIChtc2ctPmlzb2JtKSB7Ci0JCQkJc3RydWN0IGNtaV9vYm0gKm9ibSA9IChzdHJ1Y3QgY21pX29ibSAqKQotCi0JCQkJQ01JX0dFVF9QQVlMT0FEKG1zZy0+cGF5bG9hZCk7Ci0JCQkJbWVtX3NlZy5jcGVfYWRkciA9IG9ibS0+bWVtX2hhbmRsZTsKLQkJCQltZW1fc2VnLmRhdGEgPSAodTggKilvYm0tPmRhdGFfcHRyLmt2YWRkcjsKLQkJCQltZW1fc2VnLnNpemUgPSBvYm0tPnNpemU7Ci0JCQkJdF9pbmZvLT50Z3QtPnRndF93cml0ZV9yYW0odF9pbmZvLCAmbWVtX3NlZyk7Ci0JCQl9Ci0KLQkJCW1lbV9zZWcuY3BlX2FkZHIgPSBtc2ctPmFkZHJlc3M7Ci0JCQltZW1fc2VnLmRhdGEgPSBtc2ctPnBheWxvYWQ7Ci0JCQltZW1fc2VnLnNpemUgPSBtc2ctPnNpemU7Ci0JCQl0X2luZm8tPnRndC0+dGd0X3dyaXRlX3JhbSh0X2luZm8sICZtZW1fc2VnKTsKLQotCQkJaGRyID0gQ01JX0dFVF9IRUFERVIodF9pbmZvLT50Z3QtPmluYm94KTsKLQkJCUNNSV9IRFJfU0VUX09QQ09ERShoZHIsIENNSV9NU0dfVFJBTlNQT1JUKTsKLQkJCW0gPSAoc3RydWN0IGNtaV9tc2dfdHJhbnNwb3J0ICopCi0JCQkJQ01JX0dFVF9QQVlMT0FEKHRfaW5mby0+dGd0LT5pbmJveCk7Ci0JCQltLT5hZGRyID0gbXNnLT5hZGRyZXNzOwotCQkJbS0+c2l6ZSA9IG1zZy0+c2l6ZTsKLQkJCUNNSV9IRFJfU0VUX1BBWUxPQURfU0laRShoZHIsCi0JCQkJc2l6ZW9mKHN0cnVjdCBjbWlfbXNnX3RyYW5zcG9ydCkpOwotCQl9IGVsc2UgewotCQkJbWVtY3B5KHRfaW5mby0+dGd0LT5pbmJveCwgbXNnLT5wYXlsb2FkLAotCQkJICAgICAgIG1zZy0+c2l6ZSk7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgbWVzc2FnZSB0byBjcGUgaW5ib3hcbiIsCi0JCSAgX19mdW5jX18pOwotCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKTsKLQloZHIgPSBDTUlfR0VUX0hFQURFUih0X2luZm8tPnRndC0+aW5ib3gpOwotCWJ5dGVzICs9IENNSV9IRFJfR0VUX1BBWUxPQURfU0laRShoZHIpOwotCXJjID0gdF9pbmZvLT50Z3QtPnRndF93cml0ZV9tYWlsYm94KHRfaW5mby0+dGd0LT5pbmJveCwgYnl0ZXMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgYm9vbCBjcGVfaXNfY21kX2Nsa19yZXEodm9pZCAqY21kKQotewotCXN0cnVjdCBjbWlfaGRyICpoZHI7Ci0KLQloZHIgPSBDTUlfR0VUX0hFQURFUihjbWQpOwotCi0JaWYgKChDTUlfSERSX0dFVF9TRVJWSUNFKGhkcikgPT0KLQkgICAgQ01JX0NQRV9DT1JFX1NFUlZJQ0VfSUQpKSB7Ci0JCWlmIChDTUlfR0VUX09QQ09ERShjbWQpID09Ci0JCSAgICBDUEVfQ09SRV9TVkNfQ01EX0NMS19GUkVRX1JFUVVFU1QpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9wcm9jZXNzX2Nsa19jaGFuZ2VfcmVxKAotCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKLXsKLQlzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZF9jbGtfZnJlcV9yZXF1ZXN0ICpyZXE7Ci0KLQlyZXEgPSAoc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRfY2xrX2ZyZXFfcmVxdWVzdCAqKQotCQkJQ01JX0dFVF9QQVlMT0FEKHRfaW5mby0+dGd0LT5vdXRib3gpOwotCi0JaWYgKCFjcGVfZC5jcGVfY2hhbmdlX2ZyZXFfcGxhbl9jYikgewotCQlwcl9lcnIoIiVzOiBObyBzdXBwb3J0IGZvciBjbGsgZnJlcSBjaGFuZ2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBDUEVfU1ZDX0ZBSUxFRDsKLQl9Ci0KLQljcGVfZC5jcGVfY2hhbmdlX2ZyZXFfcGxhbl9jYihjcGVfZC5jZGNfcHJpdiwKLQkJCQkgICAgICByZXEtPmNsa19mcmVxKTsKLQotCS8qc2VuZCBhIGJhc2ljIHJlc3BvbnNlKi8KLQljcGVfc2VuZF9tc2dfdG9faW5ib3godF9pbmZvLAotCQlDUEVfQ01JX0JBU0lDX1JTUF9PUENPREUsIE5VTEwpOwotCi0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgY3BlX3Byb2Nlc3NfaXJxX2ludCh1MzIgaXJxLAotCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKLXsKLQlzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSB0ZW1wX25vZGU7Ci0Jc3RydWN0IGNwZV9zZW5kX21zZyAqbTsKLQl1OCBzaXplID0gMDsKLQlib29sIGVycl9pcnEgPSBmYWxzZTsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyOwotCi0JcHJfZGVidWcoIiVzOiBpcnEgPSAldVxuIiwgX19mdW5jX18sIGlycSk7Ci0KLQlpZiAoIXRfaW5mbykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCXN3aXRjaCAoaXJxKSB7Ci0JY2FzZSBDUEVfSVJRX09VVEJPWF9JUlE6Ci0JCXNpemUgPSB0X2luZm8tPnRndC0+dGd0X2dldF9jcGVfaW5mbygpLT5vdXRib3hfc2l6ZTsKLQkJdF9pbmZvLT50Z3QtPnRndF9yZWFkX21haWxib3godF9pbmZvLT50Z3QtPm91dGJveCwgc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfSVJRX01FTV9BQ0NFU1NfRVJST1I6Ci0JCWVycl9pcnEgPSB0cnVlOwotCQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX09GRkxJTkUsIENQRV9TU19JRExFKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9JUlFfV0RPR19CSVRFOgotCWNhc2UgQ1BFX0lSUV9SQ09fV0RPR19JTlQ6Ci0JCWVycl9pcnEgPSB0cnVlOwotCQlfX2NwZV9zdmNfc2h1dGRvd24odF9pbmZvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9JUlFfRkxMX0xPQ0tfTE9TVDoKLQlkZWZhdWx0OgotCQllcnJfaXJxID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVycl9pcnEpIHsKLQkJcHJfZXJyKCIlczogQ1BFIGVycm9yIElSUSAldSBvY2N1cnJlZFxuIiwKLQkJCV9fZnVuY19fLCBpcnEpOwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoICh0X2luZm8tPnN0YXRlKSB7Ci0JY2FzZSBDUEVfU1RBVEVfQk9PVElORzoKLQotCQlzd2l0Y2ggKHRfaW5mby0+c3Vic3RhdGUpIHsKLQkJY2FzZSBDUEVfU1NfQk9PVDoKLQkJCXRlbXBfbm9kZS5jb21tYW5kID0gQ1BFX0NNRF9CT09UX0lOSVRJQUxJWkU7Ci0JCQl0ZW1wX25vZGUucmVzdWx0ID0gQ1BFX1NWQ19TVUNDRVNTOwotCQkJdF9pbmZvLT5zdWJzdGF0ZSA9IENQRV9TU19CT09UX0lOSVQ7Ci0JCQl0X2luZm8tPmNwZV9wcm9jZXNzX2NvbW1hbmQoJnRlbXBfbm9kZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENQRV9TU19CT09UX0lOSVQ6Ci0JCQl0ZW1wX25vZGUuY29tbWFuZCA9IENQRV9DTURfQk9PVF9DT01QTEVURTsKLQkJCXRlbXBfbm9kZS5yZXN1bHQgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0JCQl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX09OTElORTsKLQkJCXRfaW5mby0+Y3BlX3Byb2Nlc3NfY29tbWFuZCgmdGVtcF9ub2RlKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IHVuaGFuZGxlZCBzdWJzdGF0ZSAlZCBmb3Igc3RhdGUgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCB0X2luZm8tPnN0YXRlLCB0X2luZm8tPnN1YnN0YXRlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfU1RBVEVfU0VORElOR19NU0c6Ci0JCWhkciA9IENNSV9HRVRfSEVBREVSKHRfaW5mby0+dGd0LT5vdXRib3gpOwotCQlpZiAoQ01JX0dFVF9PUENPREUodF9pbmZvLT50Z3QtPm91dGJveCkgPT0KLQkJICAgIENQRV9MU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTX1YyKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25faWQ6ICV1LCBzdGF0ZTogJWQsJWQsIGV2ZW50IHJlY2VpdmVkXG4iLAotCQkJCSBfX2Z1bmNfXywgQ01JX0hEUl9HRVRfU0VTU0lPTl9JRChoZHIpLAotCQkJCXRfaW5mby0+c3RhdGUsIHRfaW5mby0+c3Vic3RhdGUpOwotCQkJdGVtcF9ub2RlLmNvbW1hbmQgPSBDUEVfQ01EX1BST0NfSU5DT01JTkdfTVNHOwotCQkJdGVtcF9ub2RlLmRhdGEgPSBOVUxMOwotCQkJdF9pbmZvLT5jcGVfcHJvY2Vzc19jb21tYW5kKCZ0ZW1wX25vZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltID0gKHN0cnVjdCBjcGVfc2VuZF9tc2cgKil0X2luZm8tPnBlbmRpbmc7Ci0KLQkJc3dpdGNoICh0X2luZm8tPnN1YnN0YXRlKSB7Ci0JCWNhc2UgQ1BFX1NTX01TR19SRVFVRVNUX0FDQ0VTUzoKLQkJCWNwZV9zZW5kX2NtZF90b190aHJlYWQodF9pbmZvLAotCQkJCUNQRV9DTURfU0VORF9UUkFOU19NU0csIG0sIHRydWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDUEVfU1NfTVNHX1NFTkRfSU5CT1g6Ci0JCQlpZiAoY3BlX2lzX2NtZF9jbGtfcmVxKHRfaW5mby0+dGd0LT5vdXRib3gpKQotCQkJCWNwZV9wcm9jZXNzX2Nsa19jaGFuZ2VfcmVxKHRfaW5mbyk7Ci0JCQllbHNlCi0JCQkJY3BlX3NlbmRfY21kX3RvX3RocmVhZCh0X2luZm8sCi0JCQkJCUNQRV9DTURfU0VORF9NU0dfQ09NUExFVEUsIG0sIHRydWUpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIHN1YnN0YXRlICVkIGZvciBzdGF0ZSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHRfaW5mby0+c3RhdGUsIHRfaW5mby0+c3Vic3RhdGUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9TVEFURV9JRExFOgotCQlwcl9kZWJ1ZygiJXM6IE1lc3NhZ2UgcmVjZWl2ZWQsIG5vdGlmeWluZyBjbGllbnRcbiIsCi0JCQkgX19mdW5jX18pOwotCQl0ZW1wX25vZGUuY29tbWFuZCA9IENQRV9DTURfUFJPQ19JTkNPTUlOR19NU0c7Ci0JCXRlbXBfbm9kZS5kYXRhID0gTlVMTDsKLQkJdF9pbmZvLT5jcGVfcHJvY2Vzc19jb21tYW5kKCZ0ZW1wX25vZGUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIHN0YXRlICVkXG4iLAotCQkJIF9fZnVuY19fLCB0X2luZm8tPnN0YXRlKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBicm9hY2FzdF9ib290X2ZhaWxlZCh2b2lkKQotewotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCXN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiBwYXlsb2FkOwotCi0JcGF5bG9hZC5ldmVudCA9IENQRV9TVkNfQk9PVF9GQUlMRUQ7Ci0JcGF5bG9hZC5yZXN1bHQgPSBDUEVfU1ZDX0ZBSUxFRDsKLQlwYXlsb2FkLnBheWxvYWQgPSBOVUxMOwotCWlmICh0X2luZm8pCi0JCXBheWxvYWQucHJpdmF0ZV9kYXRhID0KLQkJCXRfaW5mby0+Y2xpZW50X2NvbnRleHQ7Ci0JY3BlX2Jyb2FkY2FzdF9ub3RpZmljYXRpb24odF9pbmZvLCAmcGF5bG9hZCk7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGJyb2FkY2FzdF9ib290X2V2ZW50KAotCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKLXsKLQlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gcGF5bG9hZDsKLQotCXBheWxvYWQuZXZlbnQgPSBDUEVfU1ZDX09OTElORTsKLQlwYXlsb2FkLnJlc3VsdCA9IENQRV9TVkNfU1VDQ0VTUzsKLQlwYXlsb2FkLnBheWxvYWQgPSBOVUxMOwotCWlmICh0X2luZm8pCi0JCXBheWxvYWQucHJpdmF0ZV9kYXRhID0KLQkJCXRfaW5mby0+Y2xpZW50X2NvbnRleHQ7Ci0JY3BlX2Jyb2FkY2FzdF9ub3RpZmljYXRpb24odF9pbmZvLCAmcGF5bG9hZCk7Ci0KLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgY3BlX2Jvb3RfaW5pdGlhbGl6ZShzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKLQllbnVtIGNwZV9zdmNfcmVzdWx0ICpjcGVfcmMpCi17Ci0JZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgcmMgPSBDUEVfU1ZDX0ZBSUxFRDsKLQlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gcGF5bG9hZDsKLQlzdHJ1Y3QgY21pX2NvcmVfc3ZjX2V2ZW50X3N5c3RlbV9ib290ICpwID0gTlVMTDsKLQotCWlmIChDTUlfR0VUX09QQ09ERSh0X2luZm8tPnRndC0+b3V0Ym94KSAhPQotCQlDUEVfQ09SRV9TVkNfRVZFTlRfU1lTVEVNX0JPT1QpIHsKLQkJYnJvYWNhc3RfYm9vdF9mYWlsZWQoKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXAgPSAoc3RydWN0IGNtaV9jb3JlX3N2Y19ldmVudF9zeXN0ZW1fYm9vdCAqKQotCQlDTUlfR0VUX1BBWUxPQUQodF9pbmZvLT50Z3QtPm91dGJveCk7Ci0JaWYgKHAtPnN0YXR1cyAhPSBDUEVfQk9PVF9TVUNDRVNTKSB7Ci0JCXByX2VycigiJXM6IGNwZSBib290IGZhaWxlZCwgc3RhdHVzID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcC0+c3RhdHVzKTsKLQkJYnJvYWNhc3RfYm9vdF9mYWlsZWQoKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIGJvb3Qgd2FzIHN1Y2Nlc3NmdWwgKi8KLQlpZiAocC0+dmVyc2lvbiA9PQotCSAgICBDUEVfQ09SRV9WRVJTSU9OX1NZU1RFTV9CT09UX0VWRU5UKSB7Ci0JCWNwZV9kLmNwZV9kZWJ1Z192ZWN0b3IuZGVidWdfYWRkcmVzcyA9Ci0JCQkJcC0+c2ZyX2J1ZmZfYWRkcmVzczsKLQkJY3BlX2QuY3BlX2RlYnVnX3ZlY3Rvci5kZWJ1Z19idWZmZXJfc2l6ZSA9Ci0JCQkJcC0+c2ZyX2J1ZmZfc2l6ZTsKLQkJY3BlX2QuY3BlX2RlYnVnX3ZlY3Rvci5zdGF0dXMgPSBwLT5zdGF0dXM7Ci0JCXBheWxvYWQuZXZlbnQgPSBDUEVfU1ZDX0JPT1Q7Ci0JCXBheWxvYWQucmVzdWx0ID0gQ1BFX1NWQ19TVUNDRVNTOwotCQlwYXlsb2FkLnBheWxvYWQgPSAodm9pZCAqKSZjcGVfZC5jcGVfZGVidWdfdmVjdG9yOwotCQlwYXlsb2FkLnByaXZhdGVfZGF0YSA9IHRfaW5mby0+Y2xpZW50X2NvbnRleHQ7Ci0JCWNwZV9icm9hZGNhc3Rfbm90aWZpY2F0aW9uKHRfaW5mbywgJnBheWxvYWQpOwotCX0KLQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX0JPT1RJTkcsCi0JCQkgQ1BFX1NTX0JPT1RfSU5JVCk7Ci0JKCpjcGVfcmMpID0gY3BlX3NlbmRfbXNnX3RvX2luYm94KHRfaW5mbywKLQkJCUNQRV9DT1JFX1NWQ19DTURfU0hBUkVEX01FTV9BTExPQywgTlVMTCk7Ci0JcmMgPSBDUEVfUFJPQ19TVUNDRVNTOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgY3BlX3N2Y19jb3JlX2NtaV9oYW5kbGVyKAotCQljb25zdCBzdHJ1Y3QgY21pX2FwaV9ub3RpZmljYXRpb24gKnBhcmFtZXRlcikKLXsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyOwotCi0JaWYgKCFwYXJhbWV0ZXIpCi0JCXJldHVybjsKLQotCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBwYXJhbWV0ZXItPmV2ZW50KTsKLQotCWlmIChwYXJhbWV0ZXItPmV2ZW50ICE9IENNSV9BUElfTVNHKQotCQlyZXR1cm47Ci0KLQloZHIgPSAoc3RydWN0IGNtaV9oZHIgKikgcGFyYW1ldGVyLT5tZXNzYWdlOwotCi0JaWYgKGhkci0+b3Bjb2RlID09IENQRV9DTUlfQkFTSUNfUlNQX09QQ09ERSkgewotCQlzdHJ1Y3QgY21pX2Jhc2ljX3JzcF9yZXN1bHQgKnJlc3VsdDsKLQotCQlyZXN1bHQgPSAoc3RydWN0IGNtaV9iYXNpY19yc3BfcmVzdWx0ICopCi0JCQkoKHU4ICopcGFyYW1ldGVyLT5tZXNzYWdlKSArIChzaXplb2YoKmhkcikpOwotCQlpZiAocmVzdWx0LT5zdGF0dXMpCi0JCQlwcl9lcnIoIiVzOiBlcnJvciByZXNwb25zZSwgZXJyb3IgY29kZSA9ICV1XG4iLAotCQkJCV9fZnVuY19fLCByZXN1bHQtPnN0YXR1cyk7Ci0JCWNvbXBsZXRlKCZjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUtPmNvcmVfc3ZjX2NtZF9jb21wbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjcGVfY2xrX3BsYW5fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSBOVUxMOwotCXNpemVfdCBzaXplID0gMDsKLQlzdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4gcGxhbjsKLQl1OCAqY21pX21zZzsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyOwotCWludCByYzsKLQotCXRfaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3BlX2luZm8sIGNsa19wbGFuX3dvcmspOwotCWlmICghdF9pbmZvKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaGFuZGxlIGZvciBjcGVfaW5mb1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBjb3JlIHNlcnZpY2UgKi8KLQljcGVfZC5jcGVfY21pX2hhbmRsZSA9IGNtaV9yZWdpc3RlcigKLQkJCQkJY3BlX3N2Y19jb3JlX2NtaV9oYW5kbGVyLAotCQkJCQlDTUlfQ1BFX0NPUkVfU0VSVklDRV9JRCk7Ci0KLQkvKiBzZW5kIHRoZSBjbGsgcGxhbiBjb21tYW5kICovCi0JaWYgKCFjcGVfZC5jcGVfcXVlcnlfZnJlcV9wbGFuc19jYikgewotCQlwcl9lcnIoIiVzOiBObyBzdXBwb3J0IGZvciBxdWVyeWluZyBjbGsgcGxhbnNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQljcGVfZC5jcGVfcXVlcnlfZnJlcV9wbGFuc19jYihjcGVfZC5jZGNfcHJpdiwgJnBsYW4pOwotCXNpemUgPSBzaXplb2YocGxhbi5jdXJyZW50X2Nsa19mZXEpICsKLQkJc2l6ZW9mKHBsYW4ubnVtX2Nsa19mcmVxcyk7Ci0Jc2l6ZSArPSBwbGFuLm51bV9jbGtfZnJlcXMgKgotCQkgIHNpemVvZihwbGFuLmNsa19mcmVxc1swXSk7Ci0JY21pX21zZyA9IGt6YWxsb2Moc2l6ZSArIHNpemVvZihzdHJ1Y3QgY21pX2hkciksCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghY21pX21zZykKLQkJcmV0dXJuOwotCi0JaGRyID0gKHN0cnVjdCBjbWlfaGRyICopIGNtaV9tc2c7Ci0JQ01JX0hEUl9TRVRfT1BDT0RFKGhkciwKLQkJCSAgIENQRV9DT1JFX1NWQ19DTURfQ0ZHX0NMS19QTEFOKTsKLQlDTUlfSERSX1NFVF9TRVJWSUNFKGhkciwgQ01JX0NQRV9DT1JFX1NFUlZJQ0VfSUQpOwotCQlDTUlfSERSX1NFVF9TRVNTSU9OKGhkciwgMSk7Ci0JQ01JX0hEUl9TRVRfVkVSU0lPTihoZHIsIENNSV9EUklWRVJfU1VQUE9SVEVEX1ZFUlNJT04pOwotCUNNSV9IRFJfU0VUX1BBWUxPQURfU0laRShoZHIsIHNpemUpOwotCW1lbWNweShDTUlfR0VUX1BBWUxPQUQoY21pX21zZyksICZwbGFuLAotCSAgICAgICBzaXplKTsKLQljbWlfc2VuZF9tc2coY21pX21zZyk7Ci0KLQkvKiBXYWl0IGZvciBjbGsgcGxhbiBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0JcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnRfaW5mby0+Y29yZV9zdmNfY21kX2NvbXBsLAotCQkJCQkgKDEwICogSFopKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IGNsayBwbGFuIGNtZCB0aW1lZCBvdXRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gY21kX2ZhaWw7Ci0JfQotCi0JLyogY2xrIHBsYW4gY21kIGlzIHN1Y2Nlc3NmdWwsIHNlbmQgc3RhcnQgbm90aWZpY2F0aW9uICovCi0JaWYgKHRfaW5mby0+Y3BlX3N0YXJ0X25vdGlmaWNhdGlvbikKLQkJdF9pbmZvLT5jcGVfc3RhcnRfbm90aWZpY2F0aW9uKHRfaW5mbyk7Ci0JZWxzZQotCQlwcl9lcnIoIiVzOiBubyBzdGFydCBub3RpZmljYXRpb25cbiIsCi0JCQkgX19mdW5jX18pOwotCi1jbWRfZmFpbDoKLQlrZnJlZShjbWlfbXNnKTsKLQljbWlfZGVyZWdpc3RlcihjcGVfZC5jcGVfY21pX2hhbmRsZSk7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCBjcGVfYm9vdF9jb21wbGV0ZSgKLQkJc3RydWN0IGNwZV9pbmZvICp0X2luZm8pCi17Ci0Jc3RydWN0IGNtaV9jb3JlX3N2Y19jbWRyc3Bfc2hhcmVkX21lbV9hbGxvYyAqcCA9IE5VTEw7Ci0KLQlpZiAoQ01JX0dFVF9PUENPREUodF9pbmZvLT50Z3QtPm91dGJveCkgIT0KLQkJQ1BFX0NPUkVfU1ZDX0NNRFJTUF9TSEFSRURfTUVNX0FMTE9DKSB7Ci0JCWJyb2FjYXN0X2Jvb3RfZmFpbGVkKCk7Ci0JCXJldHVybiBDUEVfUFJPQ19GQUlMRUQ7Ci0JfQotCi0JcCA9IChzdHJ1Y3QgY21pX2NvcmVfc3ZjX2NtZHJzcF9zaGFyZWRfbWVtX2FsbG9jICopCi0JCUNNSV9HRVRfUEFZTE9BRCh0X2luZm8tPnRndC0+b3V0Ym94KTsKLQljcGVfZC5jcGVfbXNnX2J1ZmZlciA9IHAtPmFkZHI7Ci0KLQlpZiAoY3BlX2QuY3BlX21zZ19idWZmZXIgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNwZSBidWZmZXIgZm9yIG1lc3NhZ2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWJyb2FjYXN0X2Jvb3RfZmFpbGVkKCk7Ci0JCXJldHVybiBDUEVfUFJPQ19GQUlMRUQ7Ci0JfQotCi0JY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9JRExFLCBDUEVfU1NfSURMRSk7Ci0JY3BlX2NyZWF0ZV93b3JrZXJfdGhyZWFkKHRfaW5mbyk7Ci0KLQlpZiAodF9pbmZvLT5jb2RlY19pZCAhPSBDUEVfU1ZDX0NPREVDX1RPTVRPTSkgewotCQlzY2hlZHVsZV93b3JrKCZ0X2luZm8tPmNsa19wbGFuX3dvcmspOwotCX0gZWxzZSB7Ci0JCWlmICh0X2luZm8tPmNwZV9zdGFydF9ub3RpZmljYXRpb24pCi0JCQl0X2luZm8tPmNwZV9zdGFydF9ub3RpZmljYXRpb24odF9pbmZvKTsKLQkJZWxzZQotCQkJcHJfZXJyKCIlczogbm8gc3RhcnQgbm90aWZpY2F0aW9uXG4iLAotCQkJCV9fZnVuY19fKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGJvb3QgY29tcGxldGVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgY3BlX3Byb2Nlc3Nfc2VuZF9tc2coCi0Jc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCi0JZW51bSBjcGVfc3ZjX3Jlc3VsdCAqY3BlX3JjLAotCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlICpjb21tYW5kX25vZGUpCi17Ci0JZW51bSBjcGVfcHJvY2Vzc19yZXN1bHQgcmMgPSBDUEVfUFJPQ19TVUNDRVNTOwotCXN0cnVjdCBjcGVfc2VuZF9tc2cgKm0gPQotCQkoc3RydWN0IGNwZV9zZW5kX21zZyAqKWNvbW1hbmRfbm9kZS0+ZGF0YTsKLQl1MzIgc2l6ZSA9IG0tPnNpemU7Ci0KLQlpZiAodF9pbmZvLT5wZW5kaW5nKSB7Ci0JCXByX2RlYnVnKCIlczogbWVzc2FnZSBxdWV1ZWRcbiIsIF9fZnVuY19fKTsKLQkJKmNwZV9yYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQkJcmV0dXJuIENQRV9QUk9DX1FVRVVFRDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmQgQ01JIG1lc3NhZ2UsIHNpemUgPSAldVxuIiwKLQkJIF9fZnVuY19fLCBzaXplKTsKLQotCWlmIChzaXplIDw9IHRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCktPmluYm94X3NpemUpIHsKLQkJcHJfZGVidWcoIiVzOiBNc2cgZml0cyBtYWlsYm94LCBzaXplICV1XG4iLAotCQkJIF9fZnVuY19fLCBzaXplKTsKLQkJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9TRU5ESU5HX01TRywKLQkJCUNQRV9TU19NU0dfU0VORF9JTkJPWCk7Ci0JCXRfaW5mby0+cGVuZGluZyA9IG07Ci0JCSpjcGVfcmMgPSBjcGVfc2VuZF9tc2dfdG9faW5ib3godF9pbmZvLCAwLCBtKTsKLQl9IGVsc2UgaWYgKHNpemUgPCBDUEVfTVNHX0JVRkZFUl9TSVpFKSB7Ci0JCW0tPmFkZHJlc3MgPSBjcGVfZC5jcGVfbXNnX2J1ZmZlcjsKLQkJcHJfZGVidWcoIiVzOiBNZXNzYWdlIHJlcSBDTUkgbWVtIGFjY2Vzc1xuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXRfaW5mby0+cGVuZGluZyA9IG07Ci0JCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfU0VORElOR19NU0csCi0JCQlDUEVfU1NfTVNHX1JFUVVFU1RfQUNDRVNTKTsKLQkJKmNwZV9yYyA9IGNwZV9zZW5kX21zZ190b19pbmJveCh0X2luZm8sCi0JCQlDUEVfQ09SRV9TVkNfQ01EX0RSQU1fQUNDRVNTX1JFUSwgbSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIG1zZyBzaXplICV1XG4iLAotCQkJIF9fZnVuY19fLCBzaXplKTsKLQkJY3BlX2NvbW1hbmRfY2xlYW51cChjb21tYW5kX25vZGUpOwotCQlyYyA9IENQRV9QUk9DX0ZBSUxFRDsKLQkJY3BlX2NoYW5nZV9zdGF0ZSh0X2luZm8sIENQRV9TVEFURV9JRExFLAotCQkJQ1BFX1NTX0lETEUpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IGNwZV9wcm9jZXNzX2luY29taW5nKAotCQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbykKLXsKLQllbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCByYyA9IENQRV9QUk9DX0ZBSUxFRDsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyOwotCi0JaGRyID0gQ01JX0dFVF9IRUFERVIodF9pbmZvLT50Z3QtPm91dGJveCk7Ci0KLQlpZiAoQ01JX0hEUl9HRVRfU0VSVklDRShoZHIpID09Ci0JICAgIENNSV9DUEVfQ09SRV9TRVJWSUNFX0lEKSB7Ci0JCXByX2RlYnVnKCIlczogY29yZSBzZXJ2aWNlIG1lc3NhZ2UgcmVjZWl2ZWRcbiIsCi0JCQkgX19mdW5jX18pOwotCi0JCXN3aXRjaCAoQ01JX0dFVF9PUENPREUodF9pbmZvLT50Z3QtPm91dGJveCkpIHsKLQkJY2FzZSBDUEVfQ09SRV9TVkNfQ01EX0NMS19GUkVRX1JFUVVFU1Q6Ci0JCQljcGVfcHJvY2Vzc19jbGtfY2hhbmdlX3JlcSh0X2luZm8pOwotCQkJcmMgPSBDUEVfUFJPQ19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01JX01TR19UUkFOU1BPUlQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IHRyYW5zcG9ydCBtc2cgcmVjZWl2ZWRcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCXJjID0gQ1BFX1BST0NfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQljYXNlIENQRV9DTUlfQkFTSUNfUlNQX09QQ09ERToKLQkJCXByX2RlYnVnKCIlczogcmVjZWl2ZWQgYmFzaWMgcnNwXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlyYyA9IENQRV9QUk9DX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogdW5rbm93biBtZXNzYWdlIHJlY2VpdmVkXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIGlmIHNlcnZpY2UgaWQgaWYgZm9yIGEgQ01JIGNsaWVudCwgbm90aWZ5IGNsaWVudCAqLwotCQlwcl9kZWJ1ZygiJXM6IE1lc3NhZ2UgcmVjZWl2ZWQsIG5vdGlmeWluZyBjbGllbnRcbiIsCi0JCQkgX19mdW5jX18pOwotCQljcGVfbm90aWZ5X2NtaV9jbGllbnQodF9pbmZvLAotCQkJdF9pbmZvLT50Z3QtPm91dGJveCwgQ1BFX1NWQ19TVUNDRVNTKTsKLQkJcmMgPSBDUEVfUFJPQ19TVUNDRVNTOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IGNwZV9wcm9jZXNzX2tpbGxfdGhyZWFkKAotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlICpjb21tYW5kX25vZGUpCi17Ci0Jc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uIHBheWxvYWQ7Ci0KLQljcGVfZC5jcGVfbXNnX2J1ZmZlciA9IDA7Ci0JcGF5bG9hZC5yZXN1bHQgPSBDUEVfU1ZDX1NIVVRUSU5HX0RPV047Ci0JcGF5bG9hZC5ldmVudCA9IENQRV9TVkNfT0ZGTElORTsKLQlwYXlsb2FkLnBheWxvYWQgPSBOVUxMOwotCXBheWxvYWQucHJpdmF0ZV9kYXRhID0gdF9pbmZvLT5jbGllbnRfY29udGV4dDsKLQkvKgotCSAqIE1ha2Ugc3RhdGUgYXMgb2ZmbGluZSBiZWZvcmUgYnJvYWRjYXN0aW5nCi0JICogdGhlIG1lc3NhZ2UgdG8gY2xpZW50cy4KLQkgKi8KLQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywgQ1BFX1NUQVRFX09GRkxJTkUsCi0JCQkgQ1BFX1NTX0lETEUpOwotCWNwZV9icm9hZGNhc3Rfbm90aWZpY2F0aW9uKHRfaW5mbywgJnBheWxvYWQpOwotCi0JcmV0dXJuIENQRV9QUk9DX0tJTExFRDsKLX0KLQotc3RhdGljIGVudW0gY3BlX3Byb2Nlc3NfcmVzdWx0IGNwZV9tdF9wcm9jZXNzX2NtZCgKLQkJc3RydWN0IGNwZV9jb21tYW5kX25vZGUgKmNvbW1hbmRfbm9kZSkKLXsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9yYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQllbnVtIGNwZV9wcm9jZXNzX3Jlc3VsdCByYyA9IENQRV9QUk9DX1NVQ0NFU1M7Ci0Jc3RydWN0IGNwZV9zZW5kX21zZyAqbTsKLQlzdHJ1Y3QgY21pX2hkciAqaGRyOwotCXU4IHNlcnZpY2UgPSAwOwotCXU4IHJldHJpZXMgPSAwOwotCi0JaWYgKCF0X2luZm8gfHwgIWNvbW1hbmRfbm9kZSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGhhbmRsZS9jb21tYW5kIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBDUEVfUFJPQ19GQUlMRUQ7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjbWQgPSAldVxuIiwgX19mdW5jX18sIGNvbW1hbmRfbm9kZS0+Y29tbWFuZCk7Ci0KLQljcGVfcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIGNvbW1hbmRfbm9kZS0+Y29tbWFuZCk7Ci0KLQlpZiAoY3BlX3JjICE9IENQRV9TVkNfU1VDQ0VTUykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgJWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIGNvbW1hbmRfbm9kZS0+Y29tbWFuZCwgY3BlX3JjKTsKLQkJcmV0dXJuIENQRV9QUk9DX0ZBSUxFRDsKLQl9Ci0KLQlzd2l0Y2ggKGNvbW1hbmRfbm9kZS0+Y29tbWFuZCkgewotCi0JY2FzZSBDUEVfQ01EX0JPT1RfSU5JVElBTElaRToKLQkJcmMgPSBjcGVfYm9vdF9pbml0aWFsaXplKHRfaW5mbywgJmNwZV9yYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfQ01EX0JPT1RfQ09NUExFVEU6Ci0JCXJjID0gY3BlX2Jvb3RfY29tcGxldGUodF9pbmZvKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9DTURfU0VORF9NU0c6Ci0JCXJjID0gY3BlX3Byb2Nlc3Nfc2VuZF9tc2codF9pbmZvLCAmY3BlX3JjLAotCQkJCQkgIGNvbW1hbmRfbm9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfQ01EX1NFTkRfVFJBTlNfTVNHOgotCQltID0gKHN0cnVjdCBjcGVfc2VuZF9tc2cgKiljb21tYW5kX25vZGUtPmRhdGE7Ci0KLQkJd2hpbGUgKHJldHJpZXMgPCBDUEVfU1ZDX0lOQUNUSVZFX1NUQVRFX1JFVFJJRVNfTUFYKSB7Ci0JCQlpZiAodF9pbmZvLT50Z3QtPnRndF9pc19hY3RpdmUoKSkgewotCQkJCSsrcmV0cmllczsKLQkJCQkvKiBXYWl0IGZvciBDUEUgdG8gYmUgaW5hY3RpdmUgKi8KLQkJCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTEwMCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiBjcGUgaW5hY3RpdmUgYWZ0ZXIgJWQgYXR0ZW1wdHNcbiIsCi0JCQkgX19mdW5jX18sIHJldHJpZXMpOwotCi0JCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfU0VORElOR19NU0csCi0JCQkJQ1BFX1NTX01TR19TRU5EX0lOQk9YKTsKLQkJcmMgPSBjcGVfc2VuZF9tc2dfdG9faW5ib3godF9pbmZvLCAwLCBtKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9DTURfU0VORF9NU0dfQ09NUExFVEU6Ci0JCWhkciA9IENNSV9HRVRfSEVBREVSKHRfaW5mby0+dGd0LT5vdXRib3gpOwotCQlzZXJ2aWNlID0gQ01JX0hEUl9HRVRfU0VSVklDRShoZHIpOwotCQlwcl9kZWJ1ZygiJXM6IG1zZyBzZW5kIHN1Y2Nlc3MsIG5vdGlmeWluZyBjbGllbnRzXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJY3BlX2NvbW1hbmRfY2xlYW51cChjb21tYW5kX25vZGUpOwotCQl0X2luZm8tPnBlbmRpbmcgPSBOVUxMOwotCQljcGVfY2hhbmdlX3N0YXRlKHRfaW5mbywKLQkJCQkgQ1BFX1NUQVRFX0lETEUsIENQRV9TU19JRExFKTsKLQkJY3BlX25vdGlmeV9jbWlfY2xpZW50KHRfaW5mbywKLQkJCXRfaW5mby0+dGd0LT5vdXRib3gsIENQRV9TVkNfU1VDQ0VTUyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfQ01EX1BST0NfSU5DT01JTkdfTVNHOgotCQlyYyA9IGNwZV9wcm9jZXNzX2luY29taW5nKHRfaW5mbyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDUEVfQ01EX0tJTExfVEhSRUFEOgotCQlyYyA9IGNwZV9wcm9jZXNzX2tpbGxfdGhyZWFkKHRfaW5mbywgY29tbWFuZF9ub2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiB1bmhhbmRsZWQgY3BlIGNtZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIGNvbW1hbmRfbm9kZS0+Y29tbWFuZCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChjcGVfcmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBleGVjdXRlIGNvbW1hbmRcbiIsIF9fZnVuY19fKTsKLQkJaWYgKHRfaW5mby0+cGVuZGluZykgewotCQkJbSA9IChzdHJ1Y3QgY3BlX3NlbmRfbXNnICopdF9pbmZvLT5wZW5kaW5nOwotCQkJY3BlX25vdGlmeV9jbWlfY2xpZW50KHRfaW5mbywgbS0+cGF5bG9hZCwKLQkJCQkJICAgICAgQ1BFX1NWQ19GQUlMRUQpOwotCQkJdF9pbmZvLT5wZW5kaW5nID0gTlVMTDsKLQkJfQotCi0JCWNwZV9jb21tYW5kX2NsZWFudXAoY29tbWFuZF9ub2RlKTsKLQkJcmMgPSBDUEVfUFJPQ19GQUlMRUQ7Ci0JCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfSURMRSwKLQkJCUNQRV9TU19JRExFKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9tdF92YWxpZGF0ZV9jbWQoCi0JCWNvbnN0IHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCQllbnVtIGNwZV9jb21tYW5kIGNvbW1hbmQpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQotCWlmICgodF9pbmZvID09IE5VTEwpIHx8IHRfaW5mby0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpIHsKLQkJcHJfZXJyKCIlczogY3BlIHNlcnZpY2UgaXMgbm90IHJlYWR5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gQ1BFX1NWQ19OT1RfUkVBRFk7Ci0JfQotCi0Jc3dpdGNoICh0X2luZm8tPnN0YXRlKSB7Ci0JY2FzZSBDUEVfU1RBVEVfVU5JTklUSUFMSVpFRDoKLQljYXNlIENQRV9TVEFURV9JTklUSUFMSVpFRDoKLQkJc3dpdGNoIChjb21tYW5kKSB7Ci0JCWNhc2UgQ1BFX0NNRF9SRVNFVDoKLQkJY2FzZSBDUEVfQ01EX0RMX1NFR01FTlQ6Ci0JCWNhc2UgQ1BFX0NNRF9SQU1EVU1QOgotCQljYXNlIENQRV9DTURfUFJPQ0VTU19JUlE6Ci0JCWNhc2UgQ1BFX0NNRF9LSUxMX1RIUkVBRDoKLQkJY2FzZSBDUEVfQ01EX0RFSU5JVElBTElaRToKLQkJY2FzZSBDUEVfQ01EX0ZUTV9URVNUOgotCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ1BFX1NUQVRFX0RPV05MT0FESU5HOgotCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJY2FzZSBDUEVfQ01EX1JFU0VUOgotCQljYXNlIENQRV9DTURfRExfU0VHTUVOVDoKLQkJY2FzZSBDUEVfQ01EX0JPT1Q6Ci0JCWNhc2UgQ1BFX0NNRF9GVE1fVEVTVDoKLQkJCXJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYyA9IENQRV9TVkNfTk9UX1JFQURZOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9TVEFURV9CT09USU5HOgotCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJY2FzZSBDUEVfQ01EX1BST0NFU1NfSVJROgotCQljYXNlIENQRV9DTURfQk9PVF9JTklUSUFMSVpFOgotCQljYXNlIENQRV9DTURfQk9PVF9DT01QTEVURToKLQkJY2FzZSBDUEVfQ01EX1NIVVRET1dOOgotCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBDUEVfQ01EX0ZUTV9URVNUOgotCQkJcmMgPSBDUEVfU1ZDX0JVU1k7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ1BFX1NUQVRFX0lETEU6Ci0JCXN3aXRjaCAoY29tbWFuZCkgewotCQljYXNlIENQRV9DTURfU0VORF9NU0c6Ci0JCWNhc2UgQ1BFX0NNRF9TRU5EX1RSQU5TX01TRzoKLQkJY2FzZSBDUEVfQ01EX1NFTkRfTVNHX0NPTVBMRVRFOgotCQljYXNlIENQRV9DTURfUFJPQ0VTU19JUlE6Ci0JCWNhc2UgQ1BFX0NNRF9SRVNFVDoKLQkJY2FzZSBDUEVfQ01EX1NIVVRET1dOOgotCQljYXNlIENQRV9DTURfS0lMTF9USFJFQUQ6Ci0JCWNhc2UgQ1BFX0NNRF9QUk9DX0lOQ09NSU5HX01TRzoKLQkJCXJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BFX0NNRF9GVE1fVEVTVDoKLQkJCXJjID0gQ1BFX1NWQ19CVVNZOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYyA9IENQRV9TVkNfRkFJTEVEOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9TVEFURV9TRU5ESU5HX01TRzoKLQkJc3dpdGNoIChjb21tYW5kKSB7Ci0JCWNhc2UgQ1BFX0NNRF9TRU5EX01TRzoKLQkJY2FzZSBDUEVfQ01EX1NFTkRfVFJBTlNfTVNHOgotCQljYXNlIENQRV9DTURfU0VORF9NU0dfQ09NUExFVEU6Ci0JCWNhc2UgQ1BFX0NNRF9QUk9DRVNTX0lSUToKLQkJY2FzZSBDUEVfQ01EX1NIVVRET1dOOgotCQljYXNlIENQRV9DTURfS0lMTF9USFJFQUQ6Ci0JCWNhc2UgQ1BFX0NNRF9QUk9DX0lOQ09NSU5HX01TRzoKLQkJCXJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BFX0NNRF9GVE1fVEVTVDoKLQkJCXJjID0gQ1BFX1NWQ19CVVNZOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYyA9IENQRV9TVkNfRkFJTEVEOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENQRV9TVEFURV9PRkZMSU5FOgotCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJY2FzZSBDUEVfQ01EX1JFU0VUOgotCQljYXNlIENQRV9DTURfUkFNRFVNUDoKLQkJY2FzZSBDUEVfQ01EX0tJTExfVEhSRUFEOgotCQkJcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIHN0YXRlICVkXG4iLAotCQkJIF9fZnVuY19fLCB0X2luZm8tPnN0YXRlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykKLQkJcHJfZXJyKCIlczogaW52YWxpZCBjb21tYW5kICVkLCBzdGF0ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGNvbW1hbmQsIHRfaW5mby0+c3RhdGUpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCAqY3BlX3N2Y19pbml0aWFsaXplKAotCQl2b2lkIGlycV9jb250cm9sX2NhbGxiYWNrKHUzMiBlbmFibGUpLAotCQljb25zdCB2b2lkICpjb2RlY19pbmZvLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNhcCA9IE5VTEw7Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX3N2Y19pbml0X3BhcmFtICppbml0X2NvbnRleHQgPQotCQkoc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSAqKSBjb250ZXh0OwotCXZvaWQgKmNsaWVudF9jb250ZXh0ID0gTlVMTDsKLQotCWlmIChjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUgJiYKLQkgICAgY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLT5pbml0aWFsaXplZCA9PSB0cnVlKQotCQlyZXR1cm4gKHZvaWQgKiljcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0JY3BlX2QuY3BlX3F1ZXJ5X2ZyZXFfcGxhbnNfY2IgPSBOVUxMOwotCWNwZV9kLmNwZV9jaGFuZ2VfZnJlcV9wbGFuX2NiID0gTlVMTDsKLQotCWlmIChjb250ZXh0KSB7Ci0JCWNsaWVudF9jb250ZXh0ID0gaW5pdF9jb250ZXh0LT5jb250ZXh0OwotCQlzd2l0Y2ggKGluaXRfY29udGV4dC0+dmVyc2lvbikgewotCQljYXNlIENQRV9TVkNfSU5JVF9QQVJBTV9WMToKLQkJCWNwZV9kLmNwZV9xdWVyeV9mcmVxX3BsYW5zX2NiID0KLQkJCQlpbml0X2NvbnRleHQtPnF1ZXJ5X2ZyZXFfcGxhbnNfY2I7Ci0JCQljcGVfZC5jcGVfY2hhbmdlX2ZyZXFfcGxhbl9jYiA9Ci0JCQkJaW5pdF9jb250ZXh0LT5jaGFuZ2VfZnJlcV9wbGFuX2NiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlKSB7Ci0JCWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfaW5mbyksCi0JCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlKQotCQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0KLQkJbWVtc2V0KGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BlX2luZm8pKTsKLQl9Ci0KLQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0JdF9pbmZvLT5jbGllbnRfY29udGV4dCA9IGNsaWVudF9jb250ZXh0OwotCi0JSU5JVF9MSVNUX0hFQUQoJnRfaW5mby0+Y2xpZW50X2xpc3QpOwotCWNwZV9kLmNkY19wcml2ID0gY2xpZW50X2NvbnRleHQ7Ci0JSU5JVF9XT1JLKCZ0X2luZm8tPmNsa19wbGFuX3dvcmssIGNwZV9jbGtfcGxhbl93b3JrKTsKLQlpbml0X2NvbXBsZXRpb24oJnRfaW5mby0+Y29yZV9zdmNfY21kX2NvbXBsKTsKLQotCXRfaW5mby0+dGd0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uKSwKLQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdF9pbmZvLT50Z3QpCi0JCWdvdG8gZXJyX3RndF9hbGxvYzsKLQl0X2luZm8tPmNvZGVjX2lkID0KLQkJKChzdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxICopIGNvZGVjX2luZm8pLT5pZDsKLQotCXJjID0gY3BlX3N2Y190Z3RfaW5pdCgoc3RydWN0IGNwZV9zdmNfY29kZWNfaW5mb192MSAqKWNvZGVjX2luZm8sCi0JCQl0X2luZm8tPnRndCk7Ci0KLQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKQotCQlnb3RvIGVycl90Z3RfaW5pdDsKLQotCWNhcCA9IHRfaW5mby0+dGd0LT50Z3RfZ2V0X2NwZV9pbmZvKCk7Ci0KLQltZW1zZXQodF9pbmZvLT50Z3QtPm91dGJveCwgMCwgY2FwLT5vdXRib3hfc2l6ZSk7Ci0JbWVtc2V0KHRfaW5mby0+dGd0LT5pbmJveCwgMCwgY2FwLT5pbmJveF9zaXplKTsKLQltdXRleF9pbml0KCZ0X2luZm8tPm1zZ19sb2NrKTsKLQljcGVfZC5jcGVfaXJxX2NvbnRyb2xfY2FsbGJhY2sgPSBpcnFfY29udHJvbF9jYWxsYmFjazsKLQl0X2luZm8tPmNwZV9wcm9jZXNzX2NvbW1hbmQgPSBjcGVfbXRfcHJvY2Vzc19jbWQ7Ci0JdF9pbmZvLT5jcGVfY21kX3ZhbGlkYXRlID0gY3BlX210X3ZhbGlkYXRlX2NtZDsKLQl0X2luZm8tPmNwZV9zdGFydF9ub3RpZmljYXRpb24gPSBicm9hZGNhc3RfYm9vdF9ldmVudDsKLQltdXRleF9pbml0KCZjcGVfZC5jcGVfYXBpX211dGV4KTsKLQltdXRleF9pbml0KCZjcGVfZC5jcGVfc3ZjX2xvY2spOwotCXByX2RlYnVnKCIlczogY3BlIHNlcnZpY2VzIGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JdF9pbmZvLT5zdGF0ZSA9IENQRV9TVEFURV9JTklUSUFMSVpFRDsKLQl0X2luZm8tPmluaXRpYWxpemVkID0gdHJ1ZTsKLQotCXJldHVybiB0X2luZm87Ci0KLWVycl90Z3RfaW5pdDoKLQlrZnJlZSh0X2luZm8tPnRndCk7Ci0KLWVycl90Z3RfYWxsb2M6Ci0Ja2ZyZWUoY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlKTsKLQljcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUgPSBOVUxMOwotCi1lcnJfcmVnaXN0ZXI6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19kZWluaXRpYWxpemUodm9pZCAqY3BlX2hhbmRsZSkKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7Ci0KLQlpZiAoIXRfaW5mbykKLQkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCi0JcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIENQRV9DTURfREVJTklUSUFMSVpFKTsKLQotCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kICVkXG4iLAotCQkJX19mdW5jX18sIENQRV9DTURfREVJTklUSUFMSVpFKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUgPT0gdF9pbmZvKQotCQljcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUgPSBOVUxMOwotCi0JdF9pbmZvLT50Z3QtPnRndF9kZWluaXQodF9pbmZvLT50Z3QpOwotCWNwZV9jaGFuZ2Vfc3RhdGUodF9pbmZvLCBDUEVfU1RBVEVfVU5JTklUSUFMSVpFRCwKLQkJCSBDUEVfU1NfSURMRSk7Ci0JbXV0ZXhfZGVzdHJveSgmdF9pbmZvLT5tc2dfbG9jayk7Ci0Ja2ZyZWUodF9pbmZvLT50Z3QpOwotCWtmcmVlKHRfaW5mbyk7Ci0JbXV0ZXhfZGVzdHJveSgmY3BlX2QuY3BlX2FwaV9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmY3BlX2QuY3BlX3N2Y19sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotdm9pZCAqY3BlX3N2Y19yZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLAotCQl2b2lkICgqbm90aWZpY2F0aW9uX2NhbGxiYWNrKQotCQkJKGNvbnN0IHN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiAqcGFyYW1ldGVyKSwKLQkJdTMyIG1hc2ssIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jdm9pZCAqcmVnX2hhbmRsZTsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCWlmICghY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlKSB7Ci0JCWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfaW5mbyksCi0JCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlKSB7Ci0JCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQltZW1zZXQoY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBjcGVfaW5mbykpOwotCX0KLQotCWlmICghY3BlX2hhbmRsZSkKLQkJY3BlX2hhbmRsZSA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCXJlZ19oYW5kbGUgPSBjcGVfcmVnaXN0ZXJfZ2VuZXJpYygoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZSwKLQkJCQkJICAgbm90aWZpY2F0aW9uX2NhbGxiYWNrLAotCQkJCQkgICBOVUxMLAotCQkJCQkgICBtYXNrLCBDUEVfTk9fU0VSVklDRSwgbmFtZSk7Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQotCXJldHVybiByZWdfaGFuZGxlOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfZGVyZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLCB2b2lkICpyZWdfaGFuZGxlKQotewotCWVudW0gY3BlX3N2Y19yZXN1bHQgcmM7Ci0KLQlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQlpZiAoIWNwZV9oYW5kbGUpCi0JCWNwZV9oYW5kbGUgPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0KLQlyYyA9IGNwZV9kZXJlZ2lzdGVyX2dlbmVyaWMoKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGUsCi0JCQkJICAgIHJlZ19oYW5kbGUpOwotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19kb3dubG9hZF9zZWdtZW50KHZvaWQgKmNwZV9oYW5kbGUsCi0JY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKnNlZ21lbnQpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JaWYgKCF0X2luZm8pCi0JCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBDUEVfQ01EX0RMX1NFR01FTlQpOwotCi0JaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgewotCQlwcl9lcnIoIiVzOiBjbWQgdmFsaWRhdGlvbiBmYWlsLCBjbWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBDUEVfQ01EX0RMX1NFR01FTlQpOwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JY3BlX3RvZ2dsZV9pcnFfbm90aWZpY2F0aW9uKHRfaW5mbywgZmFsc2UpOwotCXRfaW5mby0+c3RhdGUgPSBDUEVfU1RBVEVfRE9XTkxPQURJTkc7Ci0JdF9pbmZvLT5zdWJzdGF0ZSA9IENQRV9TU19ETF9ET1dOTE9BRElORzsKLQlyYyA9IHRfaW5mby0+dGd0LT50Z3Rfd3JpdGVfcmFtKHRfaW5mbywgc2VnbWVudCk7Ci0JY3BlX3RvZ2dsZV9pcnFfbm90aWZpY2F0aW9uKHRfaW5mbywgdHJ1ZSk7Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQotCXJldHVybiByYzsKLX0KLQotZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2Jvb3Qodm9pZCAqY3BlX2hhbmRsZSwgaW50IGRlYnVnX21vZGUpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JaWYgKCF0X2luZm8pCi0JCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBDUEVfQ01EX0JPT1QpOwotCi0JaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgewotCQlwcl9lcnIoIiVzOiBjbWQgdmFsaWRhdGlvbiBmYWlsLCBjbWQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBDUEVfQ01EX0JPT1QpOwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKHJjID09IENQRV9TVkNfU1VDQ0VTUykgewotCQl0X2luZm8tPnRndC0+dGd0X2Jvb3QoZGVidWdfbW9kZSk7Ci0JCXRfaW5mby0+c3RhdGUgPSBDUEVfU1RBVEVfQk9PVElORzsKLQkJdF9pbmZvLT5zdWJzdGF0ZSA9IENQRV9TU19CT09UOwotCQlwcl9kZWJ1ZygiJXM6IGNwZSBzZXJ2aWNlIGJvb3RpbmdcbiIsCi0JCQkgX19mdW5jX18pOwotCX0KLQotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JcmV0dXJuIHJjOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfcHJvY2Vzc19pcnEodm9pZCAqY3BlX2hhbmRsZSwgdTMyIGNwZV9pcnEpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCi0JaWYgKCF0X2luZm8pCi0JCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCWNwZV90b2dnbGVfaXJxX25vdGlmaWNhdGlvbih0X2luZm8sIGZhbHNlKTsKLQljcGVfcHJvY2Vzc19pcnFfaW50KGNwZV9pcnEsIHRfaW5mbyk7Ci0JY3BlX3RvZ2dsZV9pcnFfbm90aWZpY2F0aW9uKHRfaW5mbywgdHJ1ZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19yb3V0ZV9ub3RpZmljYXRpb24odm9pZCAqY3BlX2hhbmRsZSwKLQkJZW51bSBjcGVfc3ZjX21vZHVsZSBtb2R1bGUsIGVudW0gY3BlX3N2Y19yb3V0ZV9kZXN0IGRlc3QpCi17Ci0Jc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZTsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19OT1RfUkVBRFk7Ci0KLQlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQlpZiAoIXRfaW5mbykKLQkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCi0JaWYgKHRfaW5mby0+dGd0KQotCQlyYyA9IHRfaW5mby0+dGd0LT50Z3Rfcm91dGVfbm90aWZpY2F0aW9uKG1vZHVsZSwgZGVzdCk7Ci0KLQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgX19jcGVfc3ZjX3NodXRkb3duKHZvaWQgKmNwZV9oYW5kbGUpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCXN0cnVjdCBjcGVfY29tbWFuZF9ub2RlICpuID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSBraWxsX2NtZDsKLQotCWlmICghdF9pbmZvKQotCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0KLQlyYyA9IGNwZV9pc19jb21tYW5kX3ZhbGlkKHRfaW5mbywgQ1BFX0NNRF9TSFVURE9XTik7Ci0KLQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCXByX2VycigiJXM6IGNtZCB2YWxpZGF0aW9uIGZhaWwsIGNtZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIENQRV9DTURfU0hVVERPV04pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZ0X2luZm8tPm1haW5fcXVldWUpKSB7Ci0JCW4gPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0X2luZm8tPm1haW5fcXVldWUsCi0JCQkJICAgICBzdHJ1Y3QgY3BlX2NvbW1hbmRfbm9kZSwgbGlzdCk7Ci0KLQkJaWYgKG4tPmNvbW1hbmQgPT0gQ1BFX0NNRF9TRU5EX01TRykgewotCQkJY3BlX25vdGlmeV9jbWlfY2xpZW50KHRfaW5mbywgKHU4ICopbi0+ZGF0YSwKLQkJCQlDUEVfU1ZDX1NIVVRUSU5HX0RPV04pOwotCQl9Ci0JCS8qCi0JCSAqIFNpbmNlIGNvbW1hbmQgY2Fubm90IGJlIHByb2Nlc3NlZCwKLQkJICogZGVsZXRlIGl0IGZyb20gdGhlIGxpc3QgYW5kIHBlcmZvcm0gY2xlYW51cAotCQkgKi8KLQkJbGlzdF9kZWwoJm4tPmxpc3QpOwotCQljcGVfY29tbWFuZF9jbGVhbnVwKG4pOwotCQlrZnJlZShuKTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNwZSBzZXJ2aWNlIE9GRkxJTkUgc3RhdGVcbiIsIF9fZnVuY19fKTsKLQotCXRfaW5mby0+c3RhdGUgPSBDUEVfU1RBVEVfT0ZGTElORTsKLQl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX0lETEU7Ci0KLQltZW1zZXQoJmtpbGxfY21kLCAwLCBzaXplb2Yoa2lsbF9jbWQpKTsKLQlraWxsX2NtZC5jb21tYW5kID0gQ1BFX0NNRF9LSUxMX1RIUkVBRDsKLQotCWlmICh0X2luZm8tPnBlbmRpbmcpIHsKLQkJc3RydWN0IGNwZV9zZW5kX21zZyAqbSA9Ci0JCQkoc3RydWN0IGNwZV9zZW5kX21zZyAqKXRfaW5mby0+cGVuZGluZzsKLQkJY3BlX25vdGlmeV9jbWlfY2xpZW50KHRfaW5mbywgbS0+cGF5bG9hZCwKLQkJCUNQRV9TVkNfU0hVVFRJTkdfRE9XTik7Ci0JCWtmcmVlKHRfaW5mby0+cGVuZGluZyk7Ci0JCXRfaW5mby0+cGVuZGluZyA9IE5VTEw7Ci0JfQotCi0JY3BlX2NsZWFudXBfd29ya2VyX3RocmVhZCh0X2luZm8pOwotCXRfaW5mby0+Y3BlX3Byb2Nlc3NfY29tbWFuZCgma2lsbF9jbWQpOwotCi0JcmV0dXJuIHJjOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfc2h1dGRvd24odm9pZCAqY3BlX2hhbmRsZSkKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JcmMgPSBfX2NwZV9zdmNfc2h1dGRvd24oY3BlX2hhbmRsZSk7Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19yZXNldCh2b2lkICpjcGVfaGFuZGxlKQotewotCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0Jc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZTsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCWlmICghdF9pbmZvKQotCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0KLQlyYyA9IGNwZV9pc19jb21tYW5kX3ZhbGlkKHRfaW5mbywgQ1BFX0NNRF9SRVNFVCk7Ci0KLQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCXByX2VycigiJXM6IGNtZCB2YWxpZGF0aW9uIGZhaWwsIGNtZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIENQRV9DTURfUkVTRVQpOwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JaWYgKHRfaW5mbyAmJiB0X2luZm8tPnRndCkgewotCQlyYyA9IHRfaW5mby0+dGd0LT50Z3RfcmVzZXQoKTsKLQkJcHJfZGVidWcoIiVzOiBjcGUgc2VydmljZXMgaW4gSU5JVElBTElaRUQgc3RhdGVcbiIsCi0JCQkgX19mdW5jX18pOwotCQl0X2luZm8tPnN0YXRlID0gQ1BFX1NUQVRFX0lOSVRJQUxJWkVEOwotCQl0X2luZm8tPnN1YnN0YXRlID0gQ1BFX1NTX0lETEU7Ci0JfQotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19yYW1kdW1wKHZvaWQgKmNwZV9oYW5kbGUsCi0JCXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICpidWZmZXIpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCi0JQ1BFX1NWQ19HUkFCX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JaWYgKCF0X2luZm8pCi0JCXRfaW5mbyA9IGNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZTsKLQotCXJjID0gY3BlX2lzX2NvbW1hbmRfdmFsaWQodF9pbmZvLCBDUEVfQ01EX1JBTURVTVApOwotCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJcHJfZXJyKCIlczogY21kIHZhbGlkYXRpb24gZmFpbCwgY21kID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgQ1BFX0NNRF9SQU1EVU1QKTsKLQkJQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmICh0X2luZm8tPnRndCkgewotCQlyYyA9IHRfaW5mby0+dGd0LT50Z3RfcmVhZF9yYW0odF9pbmZvLCBidWZmZXIpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGNwZSBzZXJ2aWNlIG5vdCByZWFkeVxuIiwgX19mdW5jX18pOwotCQlyYyA9IENQRV9TVkNfTk9UX1JFQURZOwotCX0KLQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfc2V0X2RlYnVnX21vZGUodm9pZCAqY3BlX2hhbmRsZSwgdTMyIG1vZGUpCi17Ci0Jc3RydWN0IGNwZV9pbmZvICp0X2luZm8gPSAoc3RydWN0IGNwZV9pbmZvICopY3BlX2hhbmRsZTsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCWlmICghdF9pbmZvKQotCQl0X2luZm8gPSBjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGU7Ci0KLQlpZiAodF9pbmZvLT50Z3QpCi0JCXJjID0gdF9pbmZvLT50Z3QtPnRndF9zZXRfZGVidWdfbW9kZShtb2RlKTsKLQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1jb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNwZV9zdmNfZ2V0X2h3X2NmZyh2b2lkICpjcGVfaGFuZGxlKQotewotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7Ci0KLQlpZiAoIXRfaW5mbykKLQkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCi0JaWYgKHRfaW5mby0+dGd0KQotCQlyZXR1cm4gdF9pbmZvLT50Z3QtPnRndF9nZXRfY3BlX2luZm8oKTsKLQotCXJldHVybiBOVUxMOwotfQotCi12b2lkICpjbWlfcmVnaXN0ZXIoCi0JCXZvaWQgbm90aWZpY2F0aW9uX2NhbGxiYWNrKAotCQkJY29uc3Qgc3RydWN0IGNtaV9hcGlfbm90aWZpY2F0aW9uICpwYXJhbWV0ZXIpLAotCQl1MzIgc2VydmljZSkKLXsKLQl2b2lkICpyZWdfaGFuZGxlID0gTlVMTDsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCXJlZ19oYW5kbGUgPSBjcGVfcmVnaXN0ZXJfZ2VuZXJpYyhjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUsCi0JCQlOVUxMLAotCQkJbm90aWZpY2F0aW9uX2NhbGxiYWNrLAotCQkJKENQRV9TVkNfQ01JX01TRyB8IENQRV9TVkNfT0ZGTElORSB8Ci0JCQkgQ1BFX1NWQ19PTkxJTkUpLAotCQkJc2VydmljZSwKLQkJCSJDTUlfQ0xJRU5UIik7Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQotCXJldHVybiByZWdfaGFuZGxlOwotfQotCi1lbnVtIGNtaV9hcGlfcmVzdWx0IGNtaV9kZXJlZ2lzdGVyKHZvaWQgKnJlZ19oYW5kbGUpCi17Ci0JdTMyIGNsaWVudHMgPSAwOwotCXN0cnVjdCBjcGVfbm90aWZfbm9kZSAqbiA9IE5VTEw7Ci0JZW51bSBjbWlfYXBpX3Jlc3VsdCByYyA9IENNSV9BUElfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX3N2Y19ub3RpZmljYXRpb24gcGF5bG9hZDsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCXJjID0gKGVudW0gY21pX2FwaV9yZXN1bHQpIGNwZV9kZXJlZ2lzdGVyX2dlbmVyaWMoCi0JCWNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZSwgcmVnX2hhbmRsZSk7Ci0KLQlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX3N2Y19sb2NrLCAiY3BlX3N2YyIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobiwgJmNwZV9kLmNwZV9kZWZhdWx0X2hhbmRsZS0+Y2xpZW50X2xpc3QsIGxpc3QpIHsKLQkJaWYgKG4tPm1hc2sgJiBDUEVfU1ZDX0NNSV9NU0cpCi0JCQljbGllbnRzKys7Ci0JfQotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9zdmNfbG9jaywgImNwZV9zdmMiKTsKLQotCWlmIChjbGllbnRzID09IDApIHsKLQkJcGF5bG9hZC5ldmVudCA9IENQRV9TVkNfQ01JX0NMSUVOVFNfREVSRUc7Ci0JCXBheWxvYWQucGF5bG9hZCA9IE5VTEw7Ci0JCXBheWxvYWQucmVzdWx0ID0gQ1BFX1NWQ19TVUNDRVNTOwotCQljcGVfYnJvYWRjYXN0X25vdGlmaWNhdGlvbihjcGVfZC5jcGVfZGVmYXVsdF9oYW5kbGUsICZwYXlsb2FkKTsKLQl9Ci0KLQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCXJldHVybiByYzsKLX0KLQotZW51bSBjbWlfYXBpX3Jlc3VsdCBjbWlfc2VuZF9tc2codm9pZCAqbWVzc2FnZSkKLXsKLQllbnVtIGNtaV9hcGlfcmVzdWx0IHJjID0gQ01JX0FQSV9TVUNDRVNTOwotCXN0cnVjdCBjcGVfc2VuZF9tc2cgKm1zZyA9IE5VTEw7Ci0Jc3RydWN0IGNtaV9oZHIgKmhkcjsKLQotCUNQRV9TVkNfR1JBQl9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCWhkciA9IENNSV9HRVRfSEVBREVSKG1lc3NhZ2UpOwotCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjcGVfc2VuZF9tc2cpLAotCQkgICAgICBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykgewotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm4gQ1BFX1NWQ19OT19NRU1PUlk7Ci0JfQotCi0JaWYgKENNSV9IRFJfR0VUX09CTV9GTEFHKGhkcikgPT0gQ01JX09CTV9GTEFHX09VVF9CQU5EKQotCQltc2ctPmlzb2JtID0gMTsKLQllbHNlCi0JCW1zZy0+aXNvYm0gPSAwOwotCi0JbXNnLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBjbWlfaGRyKSArCi0JCQlDTUlfSERSX0dFVF9QQVlMT0FEX1NJWkUoaGRyKTsKLQotCW1zZy0+cGF5bG9hZCA9IGt6YWxsb2MobXNnLT5zaXplLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZy0+cGF5bG9hZCkgewotCQlrZnJlZShtc2cpOwotCQlDUEVfU1ZDX1JFTF9MT0NLKCZjcGVfZC5jcGVfYXBpX211dGV4LCAiY3BlX2FwaSIpOwotCQlyZXR1cm4gQ1BFX1NWQ19OT19NRU1PUlk7Ci0JfQotCi0JbXNnLT5hZGRyZXNzID0gMDsKLQltZW1jcHkoKHZvaWQgKiltc2ctPnBheWxvYWQsIG1lc3NhZ2UsIG1zZy0+c2l6ZSk7Ci0KLQlyYyA9IChlbnVtIGNtaV9hcGlfcmVzdWx0KSBjcGVfc2VuZF9jbWRfdG9fdGhyZWFkKAotCQkJY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlLAotCQkJQ1BFX0NNRF9TRU5EX01TRywKLQkJCSh2b2lkICopbXNnLCBmYWxzZSk7Ci0KLQlpZiAocmMgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gcXVldWUgbWVzc2FnZVxuIiwgX19mdW5jX18pOwotCQlrZnJlZShtc2ctPnBheWxvYWQpOwotCQlrZnJlZShtc2cpOwotCX0KLQotCUNQRV9TVkNfUkVMX0xPQ0soJmNwZV9kLmNwZV9hcGlfbXV0ZXgsICJjcGVfYXBpIik7Ci0JcmV0dXJuIHJjOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfZnRtX3Rlc3Qodm9pZCAqY3BlX2hhbmRsZSwgdTMyICpzdGF0dXMpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQlzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbyA9IChzdHJ1Y3QgY3BlX2luZm8gKiljcGVfaGFuZGxlOwotCXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50IGJhY2t1cF9zZWc7Ci0Jc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgd2FpdGlfc2VnOwotCXU4ICpiYWNrdXBfZGF0YSA9IE5VTEw7Ci0KLQlDUEVfU1ZDX0dSQUJfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQlpZiAoIXRfaW5mbykKLQkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCi0JcmMgPSBjcGVfaXNfY29tbWFuZF92YWxpZCh0X2luZm8sIENQRV9DTURfRlRNX1RFU1QpOwotCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJcHJfZXJyKCIlczogY21kIHZhbGlkYXRpb24gZmFpbCwgY21kID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgQ1BFX0NNRF9GVE1fVEVTVCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaWYgKHRfaW5mbyAmJiB0X2luZm8tPnRndCkgewotCQliYWNrdXBfZGF0YSA9IGt6YWxsb2MoCi0JCQkJdF9pbmZvLT50Z3QtPnRndF93YWl0aV9pbmZvLT50Z3Rfd2FpdGlfc2l6ZSwKLQkJCQlHRlBfS0VSTkVMKTsKLQotCQkvKiBDUEUgcmVzZXQgKi8KLQkJcmMgPSB0X2luZm8tPnRndC0+dGd0X3Jlc2V0KCk7Ci0JCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJCXByX2VycigiJXM6IENQRSByZXNldCBmYWlsISBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byBlcnJfcmV0dXJuOwotCQl9Ci0KLQkJLyogQmFjayB1cCB0aGUgNCBieXRlIElSQU0gZGF0YSBmaXJzdCAqLwotCQliYWNrdXBfc2VnLnR5cGUgPSBDUEVfU1ZDX0lOU1RSVUNUSU9OX01FTTsKLQkJYmFja3VwX3NlZy5jcGVfYWRkciA9Ci0JCQl0X2luZm8tPnRndC0+dGd0X2dldF9jcGVfaW5mbygpLT5JUkFNX29mZnNldDsKLQkJYmFja3VwX3NlZy5zaXplID0gdF9pbmZvLT50Z3QtPnRndF93YWl0aV9pbmZvLT50Z3Rfd2FpdGlfc2l6ZTsKLQkJYmFja3VwX3NlZy5kYXRhID0gYmFja3VwX2RhdGE7Ci0KLQkJcHJfZGVidWcoIiVzOiBCYWNraW5nIHVwIElSQU0gZGF0YSBmcm9tIENQRVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlyYyA9IHRfaW5mby0+dGd0LT50Z3RfcmVhZF9yYW0odF9pbmZvLCAmYmFja3VwX3NlZyk7Ci0JCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJCXByX2VycigiJXM6IEZhaWwgdG8gYmFja3VwIENQRSBJUkFNIGRhdGEsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGVycl9yZXR1cm47Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6IENvbXBsZXRlIGJhY2tpbmcgdXAgSVJBTSBkYXRhIGZyb20gQ1BFXG4iLAotCQkJX19mdW5jX18pOwotCi0JCS8qIFdyaXRlIHRoZSBXQUlUSSBpbnN0cnVjdGlvbiBkYXRhICovCi0JCXdhaXRpX3NlZy50eXBlID0gQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU07Ci0JCXdhaXRpX3NlZy5jcGVfYWRkciA9Ci0JCQl0X2luZm8tPnRndC0+dGd0X2dldF9jcGVfaW5mbygpLT5JUkFNX29mZnNldDsKLQkJd2FpdGlfc2VnLnNpemUgPSB0X2luZm8tPnRndC0+dGd0X3dhaXRpX2luZm8tPnRndF93YWl0aV9zaXplOwotCQl3YWl0aV9zZWcuZGF0YSA9IHRfaW5mby0+dGd0LT50Z3Rfd2FpdGlfaW5mby0+dGd0X3dhaXRpX2RhdGE7Ci0KLQkJcmMgPSB0X2luZm8tPnRndC0+dGd0X3dyaXRlX3JhbSh0X2luZm8sICZ3YWl0aV9zZWcpOwotCQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsIHRvIHdyaXRlIHRoZSBXQUlUSSBkYXRhLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byByZXN0b3JlX2lyYW07Ci0JCX0KLQotCQkvKiBCb290IHVwIGNwZSB0byBleGVjdXRlIHRoZSBXQUlUSSBpbnN0cnVjdGlvbnMgKi8KLQkJcmMgPSB0X2luZm8tPnRndC0+dGd0X2Jvb3QoMSk7Ci0JCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJCXByX2VycigiJXM6IEZhaWwgdG8gYm9vdCBDUEUsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIHJlc2V0OwotCQl9Ci0KLQkJLyoKLQkJICogMW1zIGRlbGF5IGlzIHN1Z2dlc3RlZCBieSB0aGUgaHcgdGVhbSB0bwotCQkgKiB3YWl0IGZvciBjcGUgdG8gYm9vdCB1cC4KLQkJICovCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQotCQkvKiBDaGVjayBpZiB0aGUgY3BlIGluaXQgaXMgZG9uZSBhZnRlciBleGVjdXRpbmcgdGhlIFdBSVRJICovCi0JCSpzdGF0dXMgPSB0X2luZm8tPnRndC0+dGd0X2NwYXJfaW5pdF9kb25lKCk7Ci0KLXJlc2V0OgotCQkvKiBTZXQgdGhlIGNwZSBiYWNrIHRvIHJlc2V0IHN0YXRlICovCi0JCXJjID0gdF9pbmZvLT50Z3QtPnRndF9yZXNldCgpOwotCQlpZiAocmMgIT0gQ1BFX1NWQ19TVUNDRVNTKSB7Ci0JCQlwcl9lcnIoIiVzOiBDUEUgcmVzZXQgZmFpbCEgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gcmVzdG9yZV9pcmFtOwotCQl9Ci0KLXJlc3RvcmVfaXJhbToKLQkJLyogUmVzdG9yZSB0aGUgSVJBTSA0IGJ5dGVzIGRhdGEgKi8KLQkJcmMgPSB0X2luZm8tPnRndC0+dGd0X3dyaXRlX3JhbSh0X2luZm8sICZiYWNrdXBfc2VnKTsKLQkJaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgewotCQkJcHJfZXJyKCIlczogRmFpbCB0byByZXN0b3JlIHRoZSBJUkFNIGRhdGEsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGVycl9yZXR1cm47Ci0JCX0KLQl9Ci0KLWVycl9yZXR1cm46Ci0Ja2ZyZWUoYmFja3VwX2RhdGEpOwotZmFpbF9jbWQ6Ci0JQ1BFX1NWQ19SRUxfTE9DSygmY3BlX2QuY3BlX2FwaV9tdXRleCwgImNwZV9hcGkiKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX2Jvb3QoaW50IGRlYnVnX21vZGUpCi17Ci0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHUzMiBjcGVfdGd0X3RvbXRvbV9pc19jcGFyX2luaXRfZG9uZSh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGNwZV90Z3RfdG9tdG9tX2lzX2FjdGl2ZSh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9yZXNldCh2b2lkKQotewotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fdm9pY2V0eChib29sIGVuYWJsZSkKLXsKLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfdG9nZ2xlX2xhYih2b2lkICpjcGVfaGFuZGxlLCBib29sIGVuYWJsZSkKLXsKLQotCXN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvID0gKHN0cnVjdCBjcGVfaW5mbyAqKWNwZV9oYW5kbGU7Ci0KLQlpZiAoIXRfaW5mbykKLQkJdF9pbmZvID0gY3BlX2QuY3BlX2RlZmF1bHRfaGFuZGxlOwotCi0JaWYgKHRfaW5mby0+dGd0KQotCQlyZXR1cm4gdF9pbmZvLT50Z3QtPnRndF92b2ljZV90eF9sYWIoZW5hYmxlKTsKLQllbHNlCi0JCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9yZWFkX21haWxib3godTggKmJ1ZmZlciwKLQlzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV93cml0ZV9tYWlsYm94KHU4ICpidWZmZXIsCi0Jc2l6ZV90IHNpemUpCi17Ci0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fcmVhZF9SQU0oc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCi0JCXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICptZW1fc2VnKQotewotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX3dyaXRlX1JBTShzdHJ1Y3QgY3BlX2luZm8gKnRfaW5mbywKLQkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKm1lbV9zZWcpCi17Ci0JcmV0dXJuIENQRV9TVkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fcm91dGVfbm90aWZpY2F0aW9uKAotCQllbnVtIGNwZV9zdmNfbW9kdWxlIG1vZHVsZSwKLQkJZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgZGVzdCkKLXsKLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3RvbXRvbV9zZXRfZGVidWdfbW9kZSh1MzIgZW5hYmxlKQotewotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNwZV90Z3RfdG9tdG9tX2dldF9jcGVfaW5mbyh2b2lkKQotewotCXJldHVybiAmY3BlX3N2Y190b210b21faW5mbzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF90b210b21fZGVpbml0KAotCQlzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24gKnBhcmFtKQotewotCWtmcmVlKHBhcmFtLT5pbmJveCk7Ci0JcGFyYW0tPmluYm94ID0gTlVMTDsKLQlrZnJlZShwYXJhbS0+b3V0Ym94KTsKLQlwYXJhbS0+b3V0Ym94ID0gTlVMTDsKLQltZW1zZXQocGFyYW0sIDAsIHNpemVvZihzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24pKTsKLQlyZXR1cm4gQ1BFX1NWQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgdTggY3BlX3RndF90b210b21fd2FpdGlfZGF0YVtdID0gezB4MDAsIDB4NzAsIDB4MDAsIDB4MDB9OwotCi1zdGF0aWMgc3RydWN0IGNwZV90Z3Rfd2FpdGlfaW5mbyBjcGVfdGd0X3RvbXRvbV93YWl0aV9pbmZvID0gewotCS50Z3Rfd2FpdGlfc2l6ZSA9IEFSUkFZX1NJWkUoY3BlX3RndF90b210b21fd2FpdGlfZGF0YSksCi0JLnRndF93YWl0aV9kYXRhID0gY3BlX3RndF90b210b21fd2FpdGlfZGF0YSwKLX07Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3RfdG9tdG9tX2luaXQoCi0JCXN0cnVjdCBjcGVfc3ZjX2NvZGVjX2luZm9fdjEgKmNvZGVjX2luZm8sCi0JCXN0cnVjdCBjcGVfc3ZjX3RndF9hYnN0cmFjdGlvbiAqcGFyYW0pCi17Ci0JaWYgKCFjb2RlY19pbmZvKQotCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQlpZiAoIXBhcmFtKQotCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQotCWlmIChjb2RlY19pbmZvLT5pZCA9PSBDUEVfU1ZDX0NPREVDX1RPTVRPTSkgewotCQlwYXJhbS0+dGd0X2Jvb3QgICAgICA9IGNwZV90Z3RfdG9tdG9tX2Jvb3Q7Ci0JCXBhcmFtLT50Z3RfY3Bhcl9pbml0X2RvbmUgPSBjcGVfdGd0X3RvbXRvbV9pc19jcGFyX2luaXRfZG9uZTsKLQkJcGFyYW0tPnRndF9pc19hY3RpdmUgPSBjcGVfdGd0X3RvbXRvbV9pc19hY3RpdmU7Ci0JCXBhcmFtLT50Z3RfcmVzZXQgPSBjcGVfdGd0X3RvbXRvbV9yZXNldDsKLQkJcGFyYW0tPnRndF9yZWFkX21haWxib3ggPSBjcGVfdGd0X3RvbXRvbV9yZWFkX21haWxib3g7Ci0JCXBhcmFtLT50Z3Rfd3JpdGVfbWFpbGJveCA9IGNwZV90Z3RfdG9tdG9tX3dyaXRlX21haWxib3g7Ci0JCXBhcmFtLT50Z3RfcmVhZF9yYW0gPSBjcGVfdGd0X3RvbXRvbV9yZWFkX1JBTTsKLQkJcGFyYW0tPnRndF93cml0ZV9yYW0gPSBjcGVfdGd0X3RvbXRvbV93cml0ZV9SQU07Ci0JCXBhcmFtLT50Z3Rfcm91dGVfbm90aWZpY2F0aW9uID0KLQkJCWNwZV90Z3RfdG9tdG9tX3JvdXRlX25vdGlmaWNhdGlvbjsKLQkJcGFyYW0tPnRndF9zZXRfZGVidWdfbW9kZSA9IGNwZV90Z3RfdG9tdG9tX3NldF9kZWJ1Z19tb2RlOwotCQlwYXJhbS0+dGd0X2dldF9jcGVfaW5mbyA9IGNwZV90Z3RfdG9tdG9tX2dldF9jcGVfaW5mbzsKLQkJcGFyYW0tPnRndF9kZWluaXQgPSBjcGVfdGd0X3RvbXRvbV9kZWluaXQ7Ci0JCXBhcmFtLT50Z3Rfdm9pY2VfdHhfbGFiID0gY3BlX3RndF90b210b21fdm9pY2V0eDsKLQkJcGFyYW0tPnRndF93YWl0aV9pbmZvID0gJmNwZV90Z3RfdG9tdG9tX3dhaXRpX2luZm87Ci0KLQkJcGFyYW0tPmluYm94ID0ga3phbGxvYyhUT01UT01fQV9TVkFTU19TUEVfSU5CT1hfU0laRSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW0tPmluYm94KQotCQkJcmV0dXJuIENQRV9TVkNfTk9fTUVNT1JZOwotCi0JCXBhcmFtLT5vdXRib3ggPSBremFsbG9jKFRPTVRPTV9BX1NWQVNTX1NQRV9PVVRCT1hfU0laRSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW0tPm91dGJveCkgewotCQkJa2ZyZWUocGFyYW0tPmluYm94KTsKLQkJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKLQkJfQotCX0KLQotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9ib290KGludCBkZWJ1Z19tb2RlKQotewotCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0KLQlpZiAoIWRlYnVnX21vZGUpCi0JCXJjIHw9IGNwZV91cGRhdGVfYml0cygKLQkJCQlXQ0Q5MzM1X0NQRV9TU19XRE9HX0NGRywKLQkJCQkweDNmLCAweDMxKTsKLQllbHNlCi0JCXByX2luZm8oIiVzOiBDUEUgaW4gZGVidWcgbW9kZSwgV0RPRyBkaXNhYmxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19DUEFSTUFEX0JVRlJEWV9JTlRfUEVSSU9ELCAxOSk7Ci0JcmMgfD0gY3BlX3VwZGF0ZV9iaXRzKFdDRDkzMzVfQ1BFX1NTX0NQQVJfQ1RMLCAweDA0LCAweDAwKTsKLQlyYyB8PSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DVEwsIDB4MDIsIDB4MDIpOwotCXJjIHw9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DUEFSX0NUTCwgMHgwMSwgMHgwMSk7Ci0KLQlpZiAodW5saWtlbHkocmMpKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBib290LCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJjID0gQ1BFX1NWQ19GQUlMRUQ7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdTMyIGNwZV90Z3Rfd2NkOTMzNV9pc19jcGFyX2luaXRfZG9uZSh2b2lkKQotewotCXU4IHRlbXAgPSAwOwotCi0JY3BlX3JlZ2lzdGVyX3JlYWQoV0NEOTMzNV9DUEVfU1NfU1RBVFVTLCAmdGVtcCk7Ci0JcmV0dXJuIHRlbXAgJiAweDE7Ci19Ci0KLXN0YXRpYyB1MzIgY3BlX3RndF93Y2Q5MzM1X2lzX2FjdGl2ZSh2b2lkKQotewotCXU4IHRlbXAgPSAwOwotCi0JY3BlX3JlZ2lzdGVyX3JlYWQoV0NEOTMzNV9DUEVfU1NfU1RBVFVTLCAmdGVtcCk7Ci0JcmV0dXJuIHRlbXAgJiAweDQ7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9yZXNldCh2b2lkKQotewotCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0KLQlyYyB8PSBjcGVfdXBkYXRlX2JpdHMoV0NEOTMzNV9DUEVfU1NfQ1BBUl9DRkcsIDB4MDEsIDB4MDApOwotCi0JcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKAotCQlXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0lSQU1fU0hVVERPV04sIDB4MDApOwotCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZSgKLQkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMV9TSFVURE9XTiwgMHgwMCk7Ci0JcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKAotCQlXQ0Q5MzM1X0NPREVDX1JQTV9QV1JfQ1BFX0RSQU0wX1NIVVRET1dOXzEsIDB4MDApOwotCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZSgKLQkJV0NEOTMzNV9DT0RFQ19SUE1fUFdSX0NQRV9EUkFNMF9TSFVURE9XTl8yLCAweDAwKTsKLQotCXJjIHw9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DUEFSX0NUTCwgMHgwNCwgMHgwNCk7Ci0KLQlpZiAodW5saWtlbHkocmMpKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZXNldCBjcGUsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmMgPSBDUEVfU1ZDX0ZBSUxFRDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9yZWFkX21haWxib3godTggKmJ1ZmZlciwKLQlzaXplX3Qgc2l6ZSkKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCXUzMiBjbnQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzaXplPSV6ZFxuIiwgX19mdW5jX18sIHNpemUpOwotCi0JaWYgKHNpemUgPiBXQ0Q5MzM1X0NQRV9TU19TUEVfT1VUQk9YX1NJWkUpCi0JCXNpemUgPSBXQ0Q5MzM1X0NQRV9TU19TUEVfT1VUQk9YX1NJWkU7Ci0KLQlmb3IgKGNudCA9IDA7IChjbnQgPCBzaXplKSAmJiAocmMgPT0gQ1BFX1NWQ19TVUNDRVNTKTsgY250KyspCi0JCXJjID0gY3BlX3JlZ2lzdGVyX3JlYWQoV0NEOTMzNV9DUEVfU1NfU1BFX09VVEJPWDEoY250KSwKLQkJCQkgICAgICAgJmJ1ZmZlcltjbnRdKTsKLQotCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX09VVEJPWDFfQUNLLCAweDAxKTsKLQotCWlmICh1bmxpa2VseShyYykpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIEFDSyBvdXRib3gsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmMgPSBDUEVfU1ZDX0ZBSUxFRDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV93cml0ZV9tYWlsYm94KHU4ICpidWZmZXIsCi0Jc2l6ZV90IHNpemUpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQl1MzIgY250ID0gMDsKLQotCXByX2RlYnVnKCIlczogc2l6ZSA9ICV6ZFxuIiwgX19mdW5jX18sIHNpemUpOwotCWlmIChzaXplID4gV0NEOTMzNV9DUEVfU1NfU1BFX0lOQk9YX1NJWkUpCi0JCXNpemUgPSBXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1hfU0laRTsKLQlmb3IgKGNudCA9IDA7IChjbnQgPCBzaXplKSAmJiAocmMgPT0gQ1BFX1NWQ19TVUNDRVNTKTsgY250KyspIHsKLQkJcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX1NQRV9JTkJPWDEoY250KSwKLQkJCWJ1ZmZlcltjbnRdKTsKLQl9Ci0KLQlpZiAodW5saWtlbHkocmMpKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHdyaXRpbmcgbWFpbGJveCByZWdpc3RlcnNcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfSU5CT1gxX1RSRywgMSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfd2NkOTMzNV9nZXRfbWVtX2FkZHIoc3RydWN0IGNwZV9pbmZvICp0X2luZm8sCi0JCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICptZW1fc2VnLAotCQl1MzIgKmFkZHIsIHU4ICptZW0pCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQl1MzIgb2Zmc2V0LCBtZW1fc3osIGFkZHJlc3M7Ci0JdTggbWVtX3R5cGU7Ci0KLQlzd2l0Y2ggKG1lbV9zZWctPnR5cGUpIHsKLQljYXNlIENQRV9TVkNfREFUQV9NRU06Ci0JCW1lbV90eXBlID0gTUVNX0FDQ0VTU19EUkFNX1ZBTDsKLQkJb2Zmc2V0ID0gV0NEOTMzNV9DUEVfU1NfU1BFX0RSQU1fT0ZGU0VUOwotCQltZW1fc3ogPSBXQ0Q5MzM1X0NQRV9TU19TUEVfRFJBTV9TSVpFOwotCQlicmVhazsKLQotCWNhc2UgQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU06Ci0JCW1lbV90eXBlID0gTUVNX0FDQ0VTU19JUkFNX1ZBTDsKLQkJb2Zmc2V0ID0gV0NEOTMzNV9DUEVfU1NfU1BFX0lSQU1fT0ZGU0VUOwotCQltZW1fc3ogPSBXQ0Q5MzM1X0NQRV9TU19TUEVfSVJBTV9TSVpFOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgbWVtIHR5cGUgPSAldVxuIiwKLQkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKLQkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7Ci0JfQotCi0JaWYgKG1lbV9zZWctPmNwZV9hZGRyIDwgb2Zmc2V0KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgYWRkciAleCBmb3IgbWVtIHR5cGUgJXVcbiIsCi0JCQlfX2Z1bmNfXywgbWVtX3NlZy0+Y3BlX2FkZHIsIG1lbV90eXBlKTsKLQkJcmV0dXJuIENQRV9TVkNfSU5WQUxJRF9IQU5ETEU7Ci0JfQotCi0JYWRkcmVzcyA9IG1lbV9zZWctPmNwZV9hZGRyIC0gb2Zmc2V0OwotCWlmIChhZGRyZXNzICsgbWVtX3NlZy0+c2l6ZSA+IG1lbV9zeikgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBzaXplICV6dSwgc3RhcnQgYWRkcmVzcyAleCwgbWVtX3R5cGUgJXVcbiIsCi0JCQlfX2Z1bmNfXywgbWVtX3NlZy0+c2l6ZSwgYWRkcmVzcywgbWVtX3R5cGUpOwotCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQl9Ci0KLQkoKmFkZHIpID0gYWRkcmVzczsKLQkoKm1lbSkgPSBtZW1fdHlwZTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3RndF93Y2Q5MzM1X3JlYWRfUkFNKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCQlzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqbWVtX3NlZykKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCXU4IHRlbXAgPSAwOwotCXUzMiBjbnQgPSAwOwotCXU4IG1lbSA9IDB4MDsKLQl1MzIgYWRkciA9IDA7Ci0JdTMyIGxhc3RhZGRyID0gMDsKLQl1MzIgcHRyX3VwZGF0ZSA9IHRydWU7Ci0JYm9vbCBhdXRvaW5jOwotCi0JaWYgKCFtZW1fc2VnKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOwotCX0KLQotCXJjID0gY3BlX3djZDkzMzVfZ2V0X21lbV9hZGRyKHRfaW5mbywgbWVtX3NlZywgJmFkZHIsICZtZW0pOwotCi0JaWYgKHJjICE9IENQRV9TVkNfU1VDQ0VTUykgewotCQlwcl9lcnIoIiVzOiBDYW5ub3Qgb2J0YWluIGFkZHJlc3MsIG1lbV90eXBlICV1XG4iLAotCQkJX19mdW5jX18sIG1lbV9zZWctPnR5cGUpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX01FTV9DVFJMLCAwKTsKLQlhdXRvaW5jID0gY3BlX3JlZ2lzdGVyX3JlYWRfYXV0b2luY19zdXBwb3J0ZWQoKTsKLQotCWlmIChhdXRvaW5jKQotCQl0ZW1wID0gMHgxODsKLQllbHNlCi0JCXRlbXAgPSAweDEwOwotCi0JdGVtcCB8PSBtZW07Ci0KLQlsYXN0YWRkciA9IH5hZGRyOwotCWRvIHsKLQkJaWYgKCFhdXRvaW5jIHx8IChwdHJfdXBkYXRlKSkgewotCQkJLyogd3JpdGUgTFNCIG9ubHkgaWYgbW9kaWZpZWQgKi8KLQkJCWlmICgobGFzdGFkZHIgJiAweEZGKSAhPSAoYWRkciAmIDB4RkYpKQotCQkJCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZSgKLQkJCQkJCVdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMCwKLQkJCQkJCShhZGRyICYgMHhGRikpOwotCQkJLyogd3JpdGUgbWlkZGxlIGJ5dGUgb25seSBpZiBtb2RpZmllZCAqLwotCQkJaWYgKCgobGFzdGFkZHIgPj4gOCkgJiAweEZGKSAhPSAoKGFkZHIgPj4gOCkgJiAweEZGKSkKLQkJCQlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoCi0JCQkJCQlXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzEsCi0JCQkJCQkoKGFkZHI+PjgpICYgMHhGRikpOwotCQkJLyogd3JpdGUgTVNCIG9ubHkgaWYgbW9kaWZpZWQgKi8KLQkJCWlmICgoKGxhc3RhZGRyID4+IDE2KSAmIDB4RkYpICE9ICgoYWRkciA+PiAxNikgJiAweEZGKSkKLQkJCQlyYyB8PSBjcGVfcmVnaXN0ZXJfd3JpdGUoCi0JCQkJCQlXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzIsCi0JCQkJCQkoKGFkZHI+PjE2KSAmIDB4RkYpKTsKLQotCQkJcmMgfD0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX01FTV9DVFJMLCB0ZW1wKTsKLQkJCWxhc3RhZGRyID0gYWRkcjsKLQkJCWFkZHIrKzsKLQkJCXB0cl91cGRhdGUgPSBmYWxzZTsKLQkJfQotCi0JCXJjIHw9IGNwZV9yZWdpc3Rlcl9yZWFkKFdDRDkzMzVfQ1BFX1NTX01FTV9CQU5LXzAsCi0JCQkJICAgICAgICZtZW1fc2VnLT5kYXRhW2NudF0pOwotCi0JCWlmICghYXV0b2luYykKLQkJCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwgMCk7Ci0JfSB3aGlsZSAoKCsrY250IDwgbWVtX3NlZy0+c2l6ZSkgfHwKLQkJIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpKTsKLQotCXJjIHw9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwgMCk7Ci0KLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCB0byByZWFkIHJlZ2lzdGVycywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfd3JpdGVfUkFNKHN0cnVjdCBjcGVfaW5mbyAqdF9pbmZvLAotCQljb25zdCBzdHJ1Y3QgY3BlX3N2Y19tZW1fc2VnbWVudCAqbWVtX3NlZykKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCXU4IG1lbV9yZWdfdmFsID0gMDsKLQl1OCBtZW0gPSBNRU1fQUNDRVNTX05PTkVfVkFMOwotCXUzMiBhZGRyID0gMDsKLQl1OCAqdGVtcF9wdHIgPSBOVUxMOwotCXUzMiB0ZW1wX3NpemUgPSAwOwotCWJvb2wgYXV0b2luYzsKLQotCWlmICghbWVtX3NlZykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG1lbSBzZWdtZW50XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gQ1BFX1NWQ19JTlZBTElEX0hBTkRMRTsKLQl9Ci0KLQlyYyA9IGNwZV93Y2Q5MzM1X2dldF9tZW1fYWRkcih0X2luZm8sIG1lbV9zZWcsICZhZGRyLCAmbWVtKTsKLQotCWlmIChyYyAhPSBDUEVfU1ZDX1NVQ0NFU1MpIHsKLQkJcHJfZXJyKCIlczogQ2Fubm90IG9idGFpbiBhZGRyZXNzLCBtZW1fdHlwZSAldVxuIiwKLQkJCV9fZnVuY19fLCBtZW1fc2VnLT50eXBlKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWF1dG9pbmMgPSBjcGVfcmVnaXN0ZXJfcmVhZF9hdXRvaW5jX3N1cHBvcnRlZCgpOwotCWlmIChhdXRvaW5jKQotCQltZW1fcmVnX3ZhbCA9IDB4MTg7Ci0JZWxzZQotCQltZW1fcmVnX3ZhbCA9IDB4MTA7Ci0KLQltZW1fcmVnX3ZhbCB8PSBtZW07Ci0KLQlyYyA9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19NRU1fQ1RSTCwKLQkJCSAgICAgMHgwRiwgbWVtX3JlZ192YWwpOwotCi0JcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfTUVNX1BUUl8wLAotCQkJCShhZGRyICYgMHhGRikpOwotCXJjID0gY3BlX3JlZ2lzdGVyX3dyaXRlKFdDRDkzMzVfQ1BFX1NTX01FTV9QVFJfMSwKLQkJCQkoKGFkZHIgPj4gOCkgJiAweEZGKSk7Ci0KLQlyYyA9IGNwZV9yZWdpc3Rlcl93cml0ZShXQ0Q5MzM1X0NQRV9TU19NRU1fUFRSXzIsCi0JCQkJKChhZGRyID4+IDE2KSAmIDB4RkYpKTsKLQotCXRlbXBfc2l6ZSA9IDA7Ci0JdGVtcF9wdHIgPSBtZW1fc2VnLT5kYXRhOwotCi0Jd2hpbGUgKHRlbXBfc2l6ZSA8PSBtZW1fc2VnLT5zaXplKSB7Ci0JCXUzMiB0b193cml0ZSA9IChtZW1fc2VnLT5zaXplID49IHRlbXBfc2l6ZStDSFVOS19TSVpFKQotCQkJPyBDSFVOS19TSVpFIDogKG1lbV9zZWctPnNpemUgLSB0ZW1wX3NpemUpOwotCi0JCWlmICh0X2luZm8tPnN0YXRlID09IENQRV9TVEFURV9PRkZMSU5FKSB7Ci0JCQlwcl9lcnIoIiVzOiBDUEUgaXMgb2ZmbGluZVxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOwotCQl9Ci0KLQkJY3BlX3JlZ2lzdGVyX3dyaXRlX3JlcGVhdChXQ0Q5MzM1X0NQRV9TU19NRU1fQkFOS18wLAotCQkJdGVtcF9wdHIsIHRvX3dyaXRlKTsKLQkJdGVtcF9zaXplICs9IENIVU5LX1NJWkU7Ci0JCXRlbXBfcHRyICs9IENIVU5LX1NJWkU7Ci0JfQotCi0JcmMgPSBjcGVfcmVnaXN0ZXJfd3JpdGUoV0NEOTMzNV9DUEVfU1NfTUVNX0NUUkwsIDApOwotCi0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXJzLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfcm91dGVfbm90aWZpY2F0aW9uKAotCQllbnVtIGNwZV9zdmNfbW9kdWxlIG1vZHVsZSwKLQkJZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgZGVzdCkKLXsKLQllbnVtIGNwZV9zdmNfcmVzdWx0IHJjID0gQ1BFX1NWQ19TVUNDRVNTOwotCi0JcHJfZGVidWcoIiVzOiBNb2R1bGUgPSAlZCwgRGVzdGluYXRpb24gPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBtb2R1bGUsIGRlc3QpOwotCi0Jc3dpdGNoIChtb2R1bGUpIHsKLQljYXNlIENQRV9TVkNfTElTVEVOX1BST0M6Ci0JCXN3aXRjaCAoZGVzdCkgewotCQljYXNlIENQRV9TVkNfRVhURVJOQUw6Ci0JCQlyYyA9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DRkcsIDB4MDEsIDB4MDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BFX1NWQ19JTlRFUk5BTDoKLQkJCXJjID0gY3BlX3VwZGF0ZV9iaXRzKFdDRDkzMzVfQ1BFX1NTX0NGRywgMHgwMSwgMHgwMCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEludmFsaWQgZGVzdGluYXRpb24gJWRcbiIsCi0JCQkJX19mdW5jX18sIGRlc3QpOwotCQkJcmV0dXJuIENQRV9TVkNfRkFJTEVEOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgbW9kdWxlICVkXG4iLAotCQkJX19mdW5jX18sIG1vZHVsZSk7Ci0JCXJjID0gQ1BFX1NWQ19GQUlMRUQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV90Z3Rfd2NkOTMzNV9zZXRfZGVidWdfbW9kZSh1MzIgZW5hYmxlKQotewotCWVudW0gY3BlX3N2Y19yZXN1bHQgcmMgPSBDUEVfU1ZDX1NVQ0NFU1M7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVuYWJsZSA9ICVzXG4iLCBfX2Z1bmNfXywKLQkJIChlbmFibGUpID8gInRydWUiIDogImZhbHNlIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNwZV90Z3Rfd2NkOTMzNV9nZXRfY3BlX2luZm8odm9pZCkKLXsKLQlyZXR1cm4gJmNwZV9zdmNfd2NkOTMzNV9pbmZvOwotfQotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdAotY3BlX3RndF93Y2Q5MzM1X2RlaW5pdChzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24gKnBhcmFtKQotewotCWtmcmVlKHBhcmFtLT5pbmJveCk7Ci0JcGFyYW0tPmluYm94ID0gTlVMTDsKLQlrZnJlZShwYXJhbS0+b3V0Ym94KTsKLQlwYXJhbS0+b3V0Ym94ID0gTlVMTDsKLQltZW1zZXQocGFyYW0sIDAsIHNpemVvZihzdHJ1Y3QgY3BlX3N2Y190Z3RfYWJzdHJhY3Rpb24pKTsKLQotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBlbnVtIGNwZV9zdmNfcmVzdWx0Ci0JY3BlX3RndF93Y2Q5MzM1X3ZvaWNldHgoYm9vbCBlbmFibGUpCi17Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByYyA9IENQRV9TVkNfU1VDQ0VTUzsKLQl1OCB2YWwgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBlbmFibGUgPSAldVxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0JaWYgKGVuYWJsZSkKLQkJdmFsID0gMHgwMjsKLQllbHNlCi0JCXZhbCA9IDB4MDA7Ci0KLQlyYyA9IGNwZV91cGRhdGVfYml0cyhXQ0Q5MzM1X0NQRV9TU19DRkcsIDB4MDIsIHZhbCk7Ci0JdmFsID0gMDsKLQljcGVfcmVnaXN0ZXJfcmVhZChXQ0Q5MzM1X0NQRV9TU19DRkcsICZ2YWwpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdTggY3BlX3RndF93Y2Q5MzM1X3dhaXRpX2RhdGFbXSA9IHsweDAwLCAweDcwLCAweDAwLCAweDAwfTsKLQotc3RhdGljIHN0cnVjdCBjcGVfdGd0X3dhaXRpX2luZm8gY3BlX3RndF93Y2Q5MzM1X3dhaXRpX2luZm8gPSB7Ci0JLnRndF93YWl0aV9zaXplID0gQVJSQVlfU0laRShjcGVfdGd0X3djZDkzMzVfd2FpdGlfZGF0YSksCi0JLnRndF93YWl0aV9kYXRhID0gY3BlX3RndF93Y2Q5MzM1X3dhaXRpX2RhdGEsCi19OwotCi1zdGF0aWMgZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfdGd0X3djZDkzMzVfaW5pdCgKLQkJc3RydWN0IGNwZV9zdmNfY29kZWNfaW5mb192MSAqY29kZWNfaW5mbywKLQkJc3RydWN0IGNwZV9zdmNfdGd0X2Fic3RyYWN0aW9uICpwYXJhbSkKLXsKLQlpZiAoIWNvZGVjX2luZm8pCi0JCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOwotCWlmICghcGFyYW0pCi0JCXJldHVybiBDUEVfU1ZDX0lOVkFMSURfSEFORExFOwotCi0JaWYgKGNvZGVjX2luZm8tPmlkID09IENQRV9TVkNfQ09ERUNfV0NEOTMzNSkgewotCQlwYXJhbS0+dGd0X2Jvb3QgPSBjcGVfdGd0X3djZDkzMzVfYm9vdDsKLQkJcGFyYW0tPnRndF9jcGFyX2luaXRfZG9uZSA9IGNwZV90Z3Rfd2NkOTMzNV9pc19jcGFyX2luaXRfZG9uZTsKLQkJcGFyYW0tPnRndF9pc19hY3RpdmUgPSBjcGVfdGd0X3djZDkzMzVfaXNfYWN0aXZlOwotCQlwYXJhbS0+dGd0X3Jlc2V0ID0gY3BlX3RndF93Y2Q5MzM1X3Jlc2V0OwotCQlwYXJhbS0+dGd0X3JlYWRfbWFpbGJveCA9IGNwZV90Z3Rfd2NkOTMzNV9yZWFkX21haWxib3g7Ci0JCXBhcmFtLT50Z3Rfd3JpdGVfbWFpbGJveCA9IGNwZV90Z3Rfd2NkOTMzNV93cml0ZV9tYWlsYm94OwotCQlwYXJhbS0+dGd0X3JlYWRfcmFtID0gY3BlX3RndF93Y2Q5MzM1X3JlYWRfUkFNOwotCQlwYXJhbS0+dGd0X3dyaXRlX3JhbSA9IGNwZV90Z3Rfd2NkOTMzNV93cml0ZV9SQU07Ci0JCXBhcmFtLT50Z3Rfcm91dGVfbm90aWZpY2F0aW9uID0KLQkJCWNwZV90Z3Rfd2NkOTMzNV9yb3V0ZV9ub3RpZmljYXRpb247Ci0JCXBhcmFtLT50Z3Rfc2V0X2RlYnVnX21vZGUgPSBjcGVfdGd0X3djZDkzMzVfc2V0X2RlYnVnX21vZGU7Ci0JCXBhcmFtLT50Z3RfZ2V0X2NwZV9pbmZvID0gY3BlX3RndF93Y2Q5MzM1X2dldF9jcGVfaW5mbzsKLQkJcGFyYW0tPnRndF9kZWluaXQgPSBjcGVfdGd0X3djZDkzMzVfZGVpbml0OwotCQlwYXJhbS0+dGd0X3ZvaWNlX3R4X2xhYiA9IGNwZV90Z3Rfd2NkOTMzNV92b2ljZXR4OwotCQlwYXJhbS0+dGd0X3dhaXRpX2luZm8gPSAmY3BlX3RndF93Y2Q5MzM1X3dhaXRpX2luZm87Ci0KLQkJcGFyYW0tPmluYm94ID0ga3phbGxvYyhXQ0Q5MzM1X0NQRV9TU19TUEVfSU5CT1hfU0laRSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW0tPmluYm94KQotCQkJcmV0dXJuIENQRV9TVkNfTk9fTUVNT1JZOwotCi0JCXBhcmFtLT5vdXRib3ggPSBremFsbG9jKFdDRDkzMzVfQ1BFX1NTX1NQRV9PVVRCT1hfU0laRSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW0tPm91dGJveCkgewotCQkJa2ZyZWUocGFyYW0tPmluYm94KTsKLQkJCXJldHVybiBDUEVfU1ZDX05PX01FTU9SWTsKLQkJfQotCX0KLQotCXJldHVybiBDUEVfU1ZDX1NVQ0NFU1M7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiV0NEIENQRSBTZXJ2aWNlcyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RfY3BlX3NlcnZpY2VzLmggYi9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlYjYxOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3djZF9jcGVfc2VydmljZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fQ1BFX1NFUlZJQ0VTX18KLSNkZWZpbmUgX19DUEVfU0VSVklDRVNfXwotCi0jZGVmaW5lIENQRV9JUlFfT1VUQk9YX0lSUQkJMHgwMQotI2RlZmluZSBDUEVfSVJRX01FTV9BQ0NFU1NfRVJST1IJMHgwMgotI2RlZmluZSBDUEVfSVJRX1dET0dfQklURQkJMHgwNAotI2RlZmluZSBDUEVfSVJRX0JVRkZFUl9PVkVSRkxPVwkJMHgwOAotI2RlZmluZSBDUEVfSVJRX0xBQl9PVkZVTkYJCTB4MTAKLSNkZWZpbmUgQ1BFX0lSUV9GTExfTE9DS19MT1NUCQkweDIwCi0jZGVmaW5lIENQRV9JUlFfUkNPX1dET0dfSU5UCQkweDQwCi0KLSNkZWZpbmUgRUZBSUxFRCAoTUFYX0VSUk5PIC0gMSkKLSNkZWZpbmUgRU5PVFJFQURZIChNQVhfRVJSTk8gLSAyKQotCi0jZGVmaW5lIE1BWF9TVVBQT1JURURfQ0xLRlJFUSA4Ci0jZGVmaW5lIENQRV9TVkNfSU5JVF9QQVJBTV9WMSAxCi0KLWVudW0gY3BlX3N2Y19yZXN1bHQgewotCUNQRV9TVkNfU1VDQ0VTUwkJCT0gMCwKLQlDUEVfU1ZDX0ZBSUxFRAkJCT0gLUVGQUlMRUQsCi0JQ1BFX1NWQ19OT19NRU1PUlkJCT0gLUVOT01FTSwKLQlDUEVfU1ZDX0lOVkFMSURfSEFORExFCQk9IC1FSU5WQUwsCi0JQ1BFX1NWQ19OT1RfUkVBRFkJCT0gLUVOT1RSRUFEWSwKLQlDUEVfU1ZDX1NIVVRUSU5HX0RPV04JCT0gLUVTSFVURE9XTiwKLQlDUEVfU1ZDX0JVU1kJCQk9IC1FQlVTWSwKLX07Ci0KLWVudW0gY3BlX3N2Y19ldmVudCB7Ci0JQ1BFX1NWQ19DTUlfTVNHCQkJPSAweDAxLAotCUNQRV9TVkNfT0ZGTElORQkJCT0gMHgwMiwKLQlDUEVfU1ZDX09OTElORQkJCT0gMHgwNCwKLQlDUEVfU1ZDX0JPT1RfRkFJTEVECQk9IDB4MDgsCi0JQ1BFX1NWQ19SRUFEX0NPTVBMRVRFCQk9IDB4MTAsCi0JQ1BFX1NWQ19SRUFEX0VSUk9SCQk9IDB4MjAsCi0JQ1BFX1NWQ19CT09UCQkJPSAweDQwLAotCUNQRV9TVkNfQ01JX0NMSUVOVFNfREVSRUcJPSAweDEwMCwKLQlDUEVfU1ZDX0VWRU5UX0FOQ0hPUgkJPSAweDdGRkYKLX07Ci0KLWVudW0gY3BlX3N2Y19tb2R1bGUgewotCUNQRV9TVkNfTElTVEVOX1BST0MJCT0gMSwKLQlDUEVfU1ZDX01PRFVMRV9BTkNIT1IJCT0gMHg3RgotfTsKLQotZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgewotCUNQRV9TVkNfRVhURVJOQUwJCT0gMSwKLQlDUEVfU1ZDX0lOVEVSTkFMCQk9IDIsCi0JQ1BFX1NWQ19ST1VURV9BTkNIT1IJCT0gMHg3RgotfTsKLQotZW51bSBjcGVfc3ZjX21lbV90eXBlIHsKLQlDUEVfU1ZDX0RBVEFfTUVNCQk9IDEsCi0JQ1BFX1NWQ19JTlNUUlVDVElPTl9NRU0JCT0gMiwKLQlDUEVfU1ZDX0lQQ19NRU0JCQk9IDMsCi0JQ1BFX1NWQ19NRU1fVFlQRV9BTkNIT1IJCT0gMHg3RgotfTsKLQotZW51bSBjcGVfc3ZjX2NvZGVjX2lkIHsKLQlDUEVfU1ZDX0NPREVDX1RPTVRPTQkJPSA1LAotCUNQRV9TVkNfQ09ERUNfV0NEOTMzNQkJPSA3LAotCUNQRV9TVkNfQ09ERUNfV0NEOTMyNgkJPSA4LAotCUNQRV9TVkNfQ09ERUNfSURfQU5DSE9SCQk9IDB4N2ZmZmZmZgotfTsKLQotZW51bSBjcGVfc3ZjX2NvZGVjX3ZlcnNpb24gewotCUNQRV9TVkNfQ09ERUNfVjFQMAkJPSAxLAotCUNQRV9TVkNfQ09ERUNfVkVSU0lPTl9BTkNIT1IJPSAweDdmZmZmZmZmCi19OwotCi1zdHJ1Y3QgY3BlX3N2Y19jb2RlY19pbmZvX3YxIHsKLQl1MTYJCQltYWpvcl92ZXJzaW9uOy8qbXVzdCBiZSAxKi8KLQl1MTYJCQltaW5vcl92ZXJzaW9uOy8qbXVzdCBiZSAwKi8KLQl1MzIJCQlpZDsKLQl1MzIJCQl2ZXJzaW9uOwotCS8qQWRkIDEuMSB2ZXJzaW9uIGZpZWxkcyBhZnRlciB0aGlzIGxpbmUqLwotfTsKLQotc3RydWN0IGNwZV9zdmNfbm90aWZpY2F0aW9uIHsKLQllbnVtIGNwZV9zdmNfZXZlbnQgZXZlbnQ7Ci0JZW51bSBjcGVfc3ZjX3Jlc3VsdCByZXN1bHQ7Ci0Jdm9pZCAqcGF5bG9hZDsKLQl2b2lkICpwcml2YXRlX2RhdGE7Ci19OwotCi1zdHJ1Y3QgY3BlX3N2Y19tc2dfcGF5bG9hZCB7Ci0JdTggICAgKmNtaV9tc2c7Ci19OwotCi1zdHJ1Y3QgY3BlX3N2Y19yZWFkX2NvbXBsZXRlIHsKLQl1OCAgICAqYnVmZmVyOwotCXNpemVfdCAgIHNpemU7Ci19OwotCi1zdHJ1Y3QgY3BlX3N2Y19ib290X2V2ZW50IHsKLQl1MzIgZGVidWdfYWRkcmVzczsKLQlzaXplX3QgZGVidWdfYnVmZmVyX3NpemU7Ci0JdTMyIHN0YXR1czsKLX07Ci0KLXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50IHsKLQllbnVtIGNwZV9zdmNfbWVtX3R5cGUgdHlwZTsKLQl1MzIgY3BlX2FkZHI7Ci0Jc2l6ZV90IHNpemU7Ci0JdTggKmRhdGE7Ci19OwotCi1zdHJ1Y3QgY3BlX3N2Y19od19jZmcgewotCXNpemVfdCBEUkFNX3NpemU7Ci0JdTMyIERSQU1fb2Zmc2V0OwotCXNpemVfdCBJUkFNX3NpemU7Ci0JdTMyIElSQU1fb2Zmc2V0OwotCXU4IGluYm94X3NpemU7Ci0JdTggb3V0Ym94X3NpemU7Ci19OwotCi1zdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4gewotCXUzMiBjdXJyZW50X2Nsa19mZXE7Ci0JdTMyIG51bV9jbGtfZnJlcXM7Ci0JdTMyIGNsa19mcmVxc1tNQVhfU1VQUE9SVEVEX0NMS0ZSRVFdOwotfTsKLQotc3RydWN0IGNwZV9zdmNfaW5pdF9wYXJhbSB7Ci0Jdm9pZCAqY29udGV4dDsKLQl1MzIgdmVyc2lvbjsKLQl2b2lkICgqcXVlcnlfZnJlcV9wbGFuc19jYikodm9pZCAqY2RjX3ByaXYsCi0JCQlzdHJ1Y3QgY3BlX3N2Y19jZmdfY2xrX3BsYW4gKmNsa19mcmVxKTsKLQl2b2lkICgqY2hhbmdlX2ZyZXFfcGxhbl9jYikodm9pZCAqY2RjX3ByaXYsCi0JCQl1MzIgY2xrX2ZyZXEpOwotfTsKLQotCi12b2lkICpjcGVfc3ZjX2luaXRpYWxpemUoCi0JCXZvaWQgaXJxX2NvbnRyb2xfY2FsbGJhY2sodTMyIGVuYWJsZSksCi0JCWNvbnN0IHZvaWQgKmNvZGVjX2luZm8sIHZvaWQgKmNvbnRleHQpOwotZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2RlaW5pdGlhbGl6ZSh2b2lkICpjcGVfaGFuZGxlKTsKLQotdm9pZCAqY3BlX3N2Y19yZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLAotCQl2b2lkICgqbm90aWZpY2F0aW9uX2NhbGxiYWNrKSgKLQkJCWNvbnN0IHN0cnVjdCBjcGVfc3ZjX25vdGlmaWNhdGlvbiAqcGFyYW1ldGVyKSwKLQkJdTMyIG1hc2ssIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfZGVyZWdpc3Rlcih2b2lkICpjcGVfaGFuZGxlLCB2b2lkICpyZWdfaGFuZGxlKTsKLQotZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX2Rvd25sb2FkX3NlZ21lbnQodm9pZCAqY3BlX2hhbmRsZSwKLQkJY29uc3Qgc3RydWN0IGNwZV9zdmNfbWVtX3NlZ21lbnQgKnNlZ21lbnQpOwotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfYm9vdCh2b2lkICpjcGVfaGFuZGxlLCBpbnQgZGVidWdfbW9kZSk7Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19zaHV0ZG93bih2b2lkICpjcGVfaGFuZGxlKTsKLQotZW51bSBjcGVfc3ZjX3Jlc3VsdCBjcGVfc3ZjX3Jlc2V0KHZvaWQgKmNwZV9oYW5kbGUpOwotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfcHJvY2Vzc19pcnEodm9pZCAqY3BlX2hhbmRsZSwgdTMyIGNwZV9pcnEpOwotCi1lbnVtIGNwZV9zdmNfcmVzdWx0Ci1jcGVfc3ZjX3JvdXRlX25vdGlmaWNhdGlvbih2b2lkICpjcGVfaGFuZGxlLCBlbnVtIGNwZV9zdmNfbW9kdWxlIG1vZHVsZSwKLQkJZW51bSBjcGVfc3ZjX3JvdXRlX2Rlc3QgZGVzdCk7Ci0KLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19yYW1kdW1wKHZvaWQgKmNwZV9oYW5kbGUsCi0JCXN0cnVjdCBjcGVfc3ZjX21lbV9zZWdtZW50ICpidWZmZXIpOwotCi1lbnVtIGNwZV9zdmNfcmVzdWx0IGNwZV9zdmNfc2V0X2RlYnVnX21vZGUodm9pZCAqY3BlX2hhbmRsZSwgdTMyIG1vZGUpOwotCi1jb25zdCBzdHJ1Y3QgY3BlX3N2Y19od19jZmcgKmNwZV9zdmNfZ2V0X2h3X2NmZyh2b2lkICpjcGVfaGFuZGxlKTsKLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y190b2dnbGVfbGFiKHZvaWQgKmNwZV9oYW5kbGUsIGJvb2wgZW5hYmxlKTsKLWVudW0gY3BlX3N2Y19yZXN1bHQgY3BlX3N2Y19mdG1fdGVzdCh2b2lkICpjcGVfaGFuZGxlLCB1MzIgKnN0YXR1cyk7Ci0jZW5kaWYgLypfX0NQRV9TRVJWSUNFU19fKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkY2FsLWh3ZGVwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3djZGNhbC1od2RlcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVhZTY5Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd2NkY2FsLWh3ZGVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+Ci0jaW5jbHVkZSA8c291bmQvbXNtY2FsLWh3ZGVwLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAid2NkY2FsLWh3ZGVwLmgiCi0KLWNvbnN0IGludCBjYWxfc2l6ZV9pbmZvW1dDRDlYWFhfTUFYX0NBTF0gPSB7Ci0JW1dDRDlYWFhfQU5DX0NBTF0gPSAxNjM4NCwKLQlbV0NEOVhYWF9NQkhDX0NBTF0gPSA0MDk2LAotCVtXQ0Q5WFhYX01BRF9DQUxdID0gNDA5NiwKLQlbV0NEOVhYWF9WQkFUX0NBTF0gPSA3MiwKLX07Ci0KLWNvbnN0IGNoYXIgKmNhbF9uYW1lX2luZm9bV0NEOVhYWF9NQVhfQ0FMXSA9IHsKLQlbV0NEOVhYWF9BTkNfQ0FMXSA9ICJhbmMiLAotCVtXQ0Q5WFhYX01CSENfQ0FMXSA9ICJtYmhjIiwKLQlbV0NEOVhYWF9NQURfQ0FMXSA9ICJtYWQiLAotCVtXQ0Q5WFhYX1ZCQVRfQ0FMXSA9ICJ2YmF0IiwKLX07Ci0KLXN0cnVjdCBmaXJtd2FyZV9jYWwgKndjZGNhbF9nZXRfZndfY2FsKHN0cnVjdCBmd19pbmZvICpmd19kYXRhLAotCQkJCQllbnVtIHdjZF9jYWxfdHlwZSB0eXBlKQotewotCWlmICghZndfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBmd19kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh0eXBlID49IFdDRDlYWFhfTUFYX0NBTCB8fAotCQl0eXBlIDwgV0NEOVhYWF9NSU5fQ0FMKSB7Ci0JCXByX2VycigiJXM6IHdyb25nIGNhbCB0eXBlIHNlbnQgJWRcbiIsIF9fZnVuY19fLCB0eXBlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW11dGV4X2xvY2soJmZ3X2RhdGEtPmxvY2spOwotCWlmICghdGVzdF9iaXQoV0NEQ0FMX1JFQ0lFVkVELAotCQkmZndfZGF0YS0+d2NkY2FsX3N0YXRlW3R5cGVdKSkgewotCQlwcl9lcnIoIiVzOiBjYWwgbm90IHNlbnQgYnkgdXNlcnNwYWNlICVkXG4iLAotCQkJX19mdW5jX18sIHR5cGUpOwotCQltdXRleF91bmxvY2soJmZ3X2RhdGEtPmxvY2spOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZmd19kYXRhLT5sb2NrKTsKLQlyZXR1cm4gZndfZGF0YS0+ZndbdHlwZV07Ci19Ci1FWFBPUlRfU1lNQk9MKHdjZGNhbF9nZXRfZndfY2FsKTsKLQotc3RhdGljIGludCB3Y2RjYWxfaHdkZXBfaW9jdGxfc2hhcmVkKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAotCQkJc3RydWN0IHdjZGNhbF9pb2N0bF9idWZmZXIgZndfdXNlcikKLXsKLQlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YSA9IGh3LT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqKmZ3ID0gZndfZGF0YS0+Znc7Ci0Jdm9pZCAqZGF0YTsKLQotCWlmICghdGVzdF9iaXQoZndfdXNlci5jYWxfdHlwZSwgZndfZGF0YS0+Y2FsX2JpdCkpIHsKLQkJcHJfZXJyKCIlczogY29kZWMgZGlkbid0IHNldCB0aGlzICVkISFcbiIsCi0JCQkJX19mdW5jX18sIGZ3X3VzZXIuY2FsX3R5cGUpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKGZ3X3VzZXIuY2FsX3R5cGUgPj0gV0NEOVhYWF9NQVhfQ0FMIHx8Ci0JCWZ3X3VzZXIuY2FsX3R5cGUgPCBXQ0Q5WFhYX01JTl9DQUwpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgY2FsIHR5cGUgc2VudCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZndfdXNlci5jYWxfdHlwZSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAoZndfdXNlci5zaXplID4gY2FsX3NpemVfaW5mb1tmd191c2VyLmNhbF90eXBlXSB8fAotCQlmd191c2VyLnNpemUgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBpbmNvcnJlY3QgZmlybXdhcmUgc2l6ZSAlZCBmb3IgJXNcbiIsCi0JCQlfX2Z1bmNfXywgZndfdXNlci5zaXplLAotCQkJY2FsX25hbWVfaW5mb1tmd191c2VyLmNhbF90eXBlXSk7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQlkYXRhID0gZndbZndfdXNlci5jYWxfdHlwZV0tPmRhdGE7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGZ3X3VzZXIuYnVmZmVyLCBmd191c2VyLnNpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlmd1tmd191c2VyLmNhbF90eXBlXS0+c2l6ZSA9IGZ3X3VzZXIuc2l6ZTsKLQltdXRleF9sb2NrKCZmd19kYXRhLT5sb2NrKTsKLQlzZXRfYml0KFdDRENBTF9SRUNJRVZFRCwgJmZ3X2RhdGEtPndjZGNhbF9zdGF0ZVtmd191c2VyLmNhbF90eXBlXSk7Ci0JbXV0ZXhfdW5sb2NrKCZmd19kYXRhLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyMzIgewotCXUzMiBzaXplOwotCWNvbXBhdF91cHRyX3QgYnVmZmVyOwotCWVudW0gd2NkX2NhbF90eXBlIGNhbF90eXBlOwotfTsKLQotZW51bSB7Ci0JU05EUlZfQ1RMX0lPQ1RMX0hXREVQX0NBTF9UWVBFMzIgPQotCQlfSU9XKCdVJywgMHgxLCBzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlcjMyKSwKLX07Ci0KLXN0YXRpYyBpbnQgd2NkY2FsX2h3ZGVwX2lvY3RsX2NvbXBhdChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlcjMyIGZ3X3VzZXIzMjsKLQlzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlciBmd191c2VyX2NvbXBhdDsKLQotCWlmIChjbWQgIT0gU05EUlZfQ1RMX0lPQ1RMX0hXREVQX0NBTF9UWVBFMzIpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW9jdGwgY29tbWFuZCBzZW50ICV1IVxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcigmZndfdXNlcjMyLCBhcmdwLCBzaXplb2YoZndfdXNlcjMyKSkpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGNvcHlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCWZ3X3VzZXJfY29tcGF0LnNpemUgPSBmd191c2VyMzIuc2l6ZTsKLQlmd191c2VyX2NvbXBhdC5idWZmZXIgPSBjb21wYXRfcHRyKGZ3X3VzZXIzMi5idWZmZXIpOwotCWZ3X3VzZXJfY29tcGF0LmNhbF90eXBlID0gZndfdXNlcjMyLmNhbF90eXBlOwotCXJldHVybiB3Y2RjYWxfaHdkZXBfaW9jdGxfc2hhcmVkKGh3LCBmd191c2VyX2NvbXBhdCk7Ci19Ci0jZWxzZQotI2RlZmluZSB3Y2RjYWxfaHdkZXBfaW9jdGxfY29tcGF0IE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IHdjZGNhbF9od2RlcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB3Y2RjYWxfaW9jdGxfYnVmZmVyIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3Qgd2NkY2FsX2lvY3RsX2J1ZmZlciBmd191c2VyOwotCi0JaWYgKGNtZCAhPSBTTkRSVl9DVExfSU9DVExfSFdERVBfQ0FMX1RZUEUpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgaW9jdGwgY29tbWFuZCBzZW50ICVkIVxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcigmZndfdXNlciwgYXJncCwgc2l6ZW9mKGZ3X3VzZXIpKSkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY29weVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JcmV0dXJuIHdjZGNhbF9od2RlcF9pb2N0bF9zaGFyZWQoaHcsIGZ3X3VzZXIpOwotfQotCi1zdGF0aWMgaW50IHdjZGNhbF9od2RlcF9yZWxlYXNlKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZndfaW5mbyAqZndfZGF0YSA9IGh3LT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZmd19kYXRhLT5sb2NrKTsKLQkvKiBjbGVhciBhbGwgdGhlIGNhbGlicmF0aW9ucyAqLwotCW1lbXNldChmd19kYXRhLT53Y2RjYWxfc3RhdGUsIDAsCi0JCXNpemVvZihmd19kYXRhLT53Y2RjYWxfc3RhdGUpKTsKLQltdXRleF91bmxvY2soJmZ3X2RhdGEtPmxvY2spOwotCXJldHVybiAwOwotfQotCi1pbnQgd2NkX2NhbF9jcmVhdGVfaHdkZXAodm9pZCAqZGF0YSwgaW50IG5vZGUsIHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQljaGFyIGh3bmFtZVs0MF07Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXA7Ci0Jc3RydWN0IGZpcm13YXJlX2NhbCAqKmZ3OwotCXN0cnVjdCBmd19pbmZvICpmd19kYXRhID0gZGF0YTsKLQlpbnQgZXJyLCBjYWxfYml0OwotCi0JaWYgKCFmd19kYXRhIHx8ICFjb2RlYykgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBhcmd1bWVudHMgcGFzc2VkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZ3ID0gZndfZGF0YS0+Znc7Ci0Jc25wcmludGYoaHduYW1lLCBzdHJsZW4oIkNvZGVjICVzIiksICJDb2RlYyAlcyIsCi0JCSBjb2RlYy0+Y29tcG9uZW50Lm5hbWUpOwotCWVyciA9IHNuZF9od2RlcF9uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLT5zbmRfY2FyZCwKLQkJCSAgICBod25hbWUsIG5vZGUsICZod2RlcCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IG5ldyBod2RlcCBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCXNucHJpbnRmKGh3ZGVwLT5uYW1lLCBzdHJsZW4oIkNvZGVjICVzIiksICJDb2RlYyAlcyIsCi0JCSBjb2RlYy0+Y29tcG9uZW50Lm5hbWUpOwotCWh3ZGVwLT5pZmFjZSA9IFNORFJWX0hXREVQX0lGQUNFX0FVRElPX0NPREVDOwotCWh3ZGVwLT5wcml2YXRlX2RhdGEgPSBmd19kYXRhOwotCWh3ZGVwLT5vcHMuaW9jdGxfY29tcGF0ID0gd2NkY2FsX2h3ZGVwX2lvY3RsX2NvbXBhdDsKLQlod2RlcC0+b3BzLmlvY3RsID0gd2NkY2FsX2h3ZGVwX2lvY3RsOwotCWh3ZGVwLT5vcHMucmVsZWFzZSA9IHdjZGNhbF9od2RlcF9yZWxlYXNlOwotCW11dGV4X2luaXQoJmZ3X2RhdGEtPmxvY2spOwotCi0JZm9yX2VhY2hfc2V0X2JpdChjYWxfYml0LCBmd19kYXRhLT5jYWxfYml0LCBXQ0Q5WFhYX01BWF9DQUwpIHsKLQkJc2V0X2JpdChXQ0RDQUxfVU5JTklUSUFMSVNFRCwKLQkJCQkmZndfZGF0YS0+d2NkY2FsX3N0YXRlW2NhbF9iaXRdKTsKLQkJZndbY2FsX2JpdF0gPSBremFsbG9jKHNpemVvZiAqKGZ3W2NhbF9iaXRdKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZndbY2FsX2JpdF0pIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBubyBtZW1vcnkgZm9yICVzIGNhbFxuIiwKLQkJCQlfX2Z1bmNfXywgY2FsX25hbWVfaW5mb1tjYWxfYml0XSk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLQlmb3JfZWFjaF9zZXRfYml0KGNhbF9iaXQsIGZ3X2RhdGEtPmNhbF9iaXQsIFdDRDlYWFhfTUFYX0NBTCkgewotCQlmd1tjYWxfYml0XS0+ZGF0YSA9IGt6YWxsb2MoY2FsX3NpemVfaW5mb1tjYWxfYml0XSwKLQkJCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIWZ3W2NhbF9iaXRdLT5kYXRhKQotCQkJZ290byBleGl0OwotCQlzZXRfYml0KFdDRENBTF9JTklUSUFMSVNFRCwKLQkJCSZmd19kYXRhLT53Y2RjYWxfc3RhdGVbY2FsX2JpdF0pOwotCX0KLQlyZXR1cm4gMDsKLWV4aXQ6Ci0JZm9yX2VhY2hfc2V0X2JpdChjYWxfYml0LCBmd19kYXRhLT5jYWxfYml0LCBXQ0Q5WFhYX01BWF9DQUwpIHsKLQkJa2ZyZWUoZndbY2FsX2JpdF0tPmRhdGEpOwotCQlmd1tjYWxfYml0XS0+ZGF0YSA9IE5VTEw7Ci0JfQotZW5kOgotCWZvcl9lYWNoX3NldF9iaXQoY2FsX2JpdCwgZndfZGF0YS0+Y2FsX2JpdCwgV0NEOVhYWF9NQVhfQ0FMKSB7Ci0JCWtmcmVlKGZ3W2NhbF9iaXRdKTsKLQkJZndbY2FsX2JpdF0gPSBOVUxMOwotCX0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLUVYUE9SVF9TWU1CT0wod2NkX2NhbF9jcmVhdGVfaHdkZXApOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93Y2RjYWwtaHdkZXAuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd2NkY2FsLWh3ZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmUyZjEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93Y2RjYWwtaHdkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX19XQ0Q5WFhYX0hXREVQX0hfXwotI2RlZmluZSBfX1dDRDlYWFhfSFdERVBfSF9fCi0jaW5jbHVkZSA8c291bmQvbXNtY2FsLWh3ZGVwLmg+Ci0KLWVudW0gd2NkX2NhbF9zdGF0ZXMgewotCVdDRENBTF9VTklOSVRJQUxJU0VELAotCVdDRENBTF9JTklUSUFMSVNFRCwKLQlXQ0RDQUxfUkVDSUVWRUQKLX07Ci0KLXN0cnVjdCBmd19pbmZvIHsKLQlzdHJ1Y3QgZmlybXdhcmVfY2FsICpmd1tXQ0Q5WFhYX01BWF9DQUxdOwotCURFQ0xBUkVfQklUTUFQKGNhbF9iaXQsIFdDRDlYWFhfTUFYX0NBTCk7Ci0JLyogZm9yIGNhbGlicmF0aW9uIHRyYWNraW5nICovCi0JdW5zaWduZWQgbG9uZyB3Y2RjYWxfc3RhdGVbV0NEOVhYWF9NQVhfQ0FMXTsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLX07Ci0KLXN0cnVjdCBmaXJtd2FyZV9jYWwgewotCXU4ICpkYXRhOwotCXNpemVfdCBzaXplOwotfTsKLQotc3RydWN0IHNuZF9zb2NfY29kZWM7Ci1pbnQgd2NkX2NhbF9jcmVhdGVfaHdkZXAodm9pZCAqZncsIGludCBub2RlLCBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotc3RydWN0IGZpcm13YXJlX2NhbCAqd2NkY2FsX2dldF9md19jYWwoc3RydWN0IGZ3X2luZm8gKmZ3X2RhdGEsCi0JCQkJCWVudW0gd2NkX2NhbF90eXBlIHR5cGUpOwotI2VuZGlmIC8qIF9fV0NEOVhYWF9IV0RFUF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdpc3RlcnMuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC1yZWdpc3RlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1YTVmMC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnaXN0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIFdTQTg4MVhfUkVHSVNURVJTX0gKLSNkZWZpbmUgV1NBODgxWF9SRUdJU1RFUlNfSAotCi0jZGVmaW5lIFdTQTg4MVhfRElHSVRBTF9CQVNFCQkweDMwMDAKLSNkZWZpbmUgV1NBODgxWF9BTkFMT0dfQkFTRQkJMHgzMTAwCi0KLS8qIERpZ2l0YWwgcmVnaXN0ZXIgYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZSBXU0E4ODFYX0NISVBfSUQwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwMCkKLSNkZWZpbmUgV1NBODgxWF9DSElQX0lEMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDEpCi0jZGVmaW5lIFdTQTg4MVhfQ0hJUF9JRDIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDAyKQotI2RlZmluZSBXU0E4ODFYX0NISVBfSUQzCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwMykKLSNkZWZpbmUgV1NBODgxWF9CVVNfSUQJCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwNCkKLSNkZWZpbmUgV1NBODgxWF9DRENfUlNUX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDUpCi0jZGVmaW5lIFdTQTg4MVhfQ0RDX1RPUF9DTEtfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwNikKLSNkZWZpbmUgV1NBODgxWF9DRENfQU5BX0NMS19DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDA3KQotI2RlZmluZSBXU0E4ODFYX0NEQ19ESUdfQ0xLX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMDgpCi0jZGVmaW5lIFdTQTg4MVhfQ0xPQ0tfQ09ORklHCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwOSkKLSNkZWZpbmUgV1NBODgxWF9BTkFfQ1RMCQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMEEpCi0jZGVmaW5lIFdTQTg4MVhfU1dSX1JFU0VUX0VOCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwQikKLSNkZWZpbmUgV1NBODgxWF9SRVNFVF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDBDKQotI2RlZmluZSBXU0E4ODFYX1RBRENfVkFMVUVfQ1RMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAwRikKLSNkZWZpbmUgV1NBODgxWF9URU1QX0RFVEVDVF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDEwKQotI2RlZmluZSBXU0E4ODFYX1RFTVBfTVNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxMSkKLSNkZWZpbmUgV1NBODgxWF9URU1QX0xTQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTIpCi0jZGVmaW5lIFdTQTg4MVhfVEVNUF9DT05GSUcwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxMykKLSNkZWZpbmUgV1NBODgxWF9URU1QX0NPTkZJRzEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE0KQotI2RlZmluZSBXU0E4ODFYX0NEQ19DTElQX0NUTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTUpCi0jZGVmaW5lIFdTQTg4MVhfU0RNX1BETTlfTFNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxNikKLSNkZWZpbmUgV1NBODgxWF9TRE1fUERNOV9NU0IJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE3KQotI2RlZmluZSBXU0E4ODFYX0NEQ19SWF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDE4KQotI2RlZmluZSBXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTAJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMTkpCi0jZGVmaW5lIFdTQTg4MVhfREVNX0JZUEFTU19EQVRBMQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxQSkKLSNkZWZpbmUgV1NBODgxWF9ERU1fQllQQVNTX0RBVEEyCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFCKQotI2RlZmluZSBXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTMJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMUMpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX0NUUkwwCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAxRCkKLSNkZWZpbmUgV1NBODgxWF9PVFBfQ1RSTDEJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFFKQotI2RlZmluZSBXU0E4ODFYX0hEUklWRV9DVExfR1JPVVAxCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDFGKQotI2RlZmluZSBXU0E4ODFYX0lOVFJfTU9ERQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjApCi0jZGVmaW5lIFdTQTg4MVhfSU5UUl9NQVNLCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAyMSkKLSNkZWZpbmUgV1NBODgxWF9JTlRSX1NUQVRVUwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjIpCi0jZGVmaW5lIFdTQTg4MVhfSU5UUl9DTEVBUgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjMpCi0jZGVmaW5lIFdTQTg4MVhfSU5UUl9MRVZFTAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjQpCi0jZGVmaW5lIFdTQTg4MVhfSU5UUl9TRVQJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDI1KQotI2RlZmluZSBXU0E4ODFYX0lOVFJfVEVTVAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMjYpCi0jZGVmaW5lIFdTQTg4MVhfUERNX1RFU1RfTU9ERQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzApCi0jZGVmaW5lIFdTQTg4MVhfQVRFX1RFU1RfTU9ERQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwMzEpCi0jZGVmaW5lIFdTQTg4MVhfUElOX0NUTF9NT0RFCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzMikKLSNkZWZpbmUgV1NBODgxWF9QSU5fQ1RMX09FCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzMykKLSNkZWZpbmUgV1NBODgxWF9QSU5fV0RBVEFfSU9QQUQJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDM0KQotI2RlZmluZSBXU0E4ODFYX1BJTl9TVEFUVVMJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDM1KQotI2RlZmluZSBXU0E4ODFYX0RJR19ERUJVR19NT0RFCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzNykKLSNkZWZpbmUgV1NBODgxWF9ESUdfREVCVUdfU0VMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzOCkKLSNkZWZpbmUgV1NBODgxWF9ESUdfREVCVUdfRU4JCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDM5KQotI2RlZmluZSBXU0E4ODFYX1NXUl9ITV9URVNUMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwM0IpCi0jZGVmaW5lIFdTQTg4MVhfU1dSX0hNX1RFU1QyCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzQykKLSNkZWZpbmUgV1NBODgxWF9URU1QX0RFVEVDVF9EQkdfQ1RMCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDNEKQotI2RlZmluZSBXU0E4ODFYX1RFTVBfREVCVUdfTVNCCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDAzRSkKLSNkZWZpbmUgV1NBODgxWF9URU1QX0RFQlVHX0xTQgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwM0YpCi0jZGVmaW5lIFdTQTg4MVhfU0FNUExFX0VER0VfU0VMCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA0NCkKLSNkZWZpbmUgV1NBODgxWF9JT1BBRF9DVEwJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDQ1KQotI2RlZmluZSBXU0E4ODFYX1NQQVJFXzAJCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA1MCkKLSNkZWZpbmUgV1NBODgxWF9TUEFSRV8xCQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwNTEpCi0jZGVmaW5lIFdTQTg4MVhfU1BBUkVfMgkJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDUyKQotI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODApCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xCQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4MSkKLSNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzIJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDgyKQotI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfMwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODMpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR180CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4NCkKLSNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzUJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg1KQotI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfNgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODYpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR183CQkJKFdTQTg4MVhfRElHSVRBTF9CQVNFKzB4MDA4NykKLSNkZWZpbmUgV1NBODgxWF9PVFBfUkVHXzgJCQkoV1NBODgxWF9ESUdJVEFMX0JBU0UrMHgwMDg4KQotI2RlZmluZSBXU0E4ODFYX09UUF9SRUdfOQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwODkpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEEpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEIpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xMgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEMpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xMwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEQpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xNAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEUpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xNQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOEYpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xNgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTApCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xNwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTEpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xOAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTIpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18xOQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTMpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTQpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTUpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yMgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTYpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yMwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTcpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yNAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTgpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yNQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOTkpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yNgkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUEpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yNwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUIpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yOAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUMpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18yOQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUQpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18zMAkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUUpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR18zMQkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwOUYpCi0jZGVmaW5lIFdTQTg4MVhfT1RQX1JFR182MwkJCShXU0E4ODFYX0RJR0lUQUxfQkFTRSsweDAwQkYpCi0KLS8qIEFuYWxvZyBSZWdpc3RlciBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIFdTQTg4MVhfQklBU19SRUZfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwMCkKLSNkZWZpbmUgV1NBODgxWF9CSUFTX1RFU1QJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDEpCi0jZGVmaW5lIFdTQTg4MVhfQklBU19CSUFTCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDAyKQotI2RlZmluZSBXU0E4ODFYX1RFTVBfT1AJCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDAzKQotI2RlZmluZSBXU0E4ODFYX1RFTVBfSVJFRl9DVFJMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDA0KQotI2RlZmluZSBXU0E4ODFYX1RFTVBfSVNFTlNfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNSkKLSNkZWZpbmUgV1NBODgxWF9URU1QX0NMS19DVFJMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDA2KQotI2RlZmluZSBXU0E4ODFYX1RFTVBfVEVTVAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwNykKLSNkZWZpbmUgV1NBODgxWF9URU1QX0JJQVMJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMDgpCi0jZGVmaW5lIFdTQTg4MVhfVEVNUF9BRENfQ1RSTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAwOSkKLSNkZWZpbmUgV1NBODgxWF9URU1QX0RPVVRfTVNCCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDBBKQotI2RlZmluZSBXU0E4ODFYX1RFTVBfRE9VVF9MU0IJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMEIpCi0jZGVmaW5lIFdTQTg4MVhfQURDX0VOX01PRFVfVgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxMCkKLSNkZWZpbmUgV1NBODgxWF9BRENfRU5fTU9EVV9JCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDExKQotI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9WCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMTIpCi0jZGVmaW5lIFdTQTg4MVhfQURDX0VOX0RFVF9URVNUX0kJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxMykKLSNkZWZpbmUgV1NBODgxWF9BRENfU0VMX0lCSUFTCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDE0KQotI2RlZmluZSBXU0E4ODFYX0FEQ19FTl9TRUxfSUJBSVMJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxNSkKLSNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9FTgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxQSkKLSNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9HQUlOCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDFCKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfREFDX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxQykKLSNkZWZpbmUgV1NBODgxWF9TUEtSX0RSVl9EQkcJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMUQpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9QV1JTVEdfREJHCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDFFKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfT0NQX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAxRikKLSNkZWZpbmUgV1NBODgxWF9TUEtSX0NMSVBfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDIwKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfQkJNX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMSkKLSNkZWZpbmUgV1NBODgxWF9TUEtSX01JU0NfQ1RMMQkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMikKLSNkZWZpbmUgV1NBODgxWF9TUEtSX01JU0NfQ1RMMgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyMykKLSNkZWZpbmUgV1NBODgxWF9TUEtSX0JJQVNfSU5UCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI0KQotI2RlZmluZSBXU0E4ODFYX1NQS1JfUEFfSU5UCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI1KQotI2RlZmluZSBXU0E4ODFYX1NQS1JfQklBU19DQUwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjYpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9CSUFTX1BTUlIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMjcpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9TVEFUVVMxCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDI4KQotI2RlZmluZSBXU0E4ODFYX1NQS1JfU1RBVFVTMgkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyOSkKLSNkZWZpbmUgV1NBODgxWF9CT09TVF9FTl9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMkEpCi0jZGVmaW5lIFdTQTg4MVhfQk9PU1RfQ1VSUkVOVF9MSU1JVAkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJCKQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX1BTX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAyQykKLSNkZWZpbmUgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJEKQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMkUpCi0jZGVmaW5lIFdTQTg4MVhfQk9PU1RfRk9SQ0VfT1VUCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDJGKQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX0xET19QUk9HCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDMwKQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzMSkKLSNkZWZpbmUgV1NBODgxWF9CT09TVF9ST05fQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDMyKQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX0xPT1BfU1RBQklMSVRZCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzMpCi0jZGVmaW5lIFdTQTg4MVhfQk9PU1RfWlhfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM0KQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzNSkKLSNkZWZpbmUgV1NBODgxWF9CT09TVF9NSVNDMV9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzYpCi0jZGVmaW5lIFdTQTg4MVhfQk9PU1RfTUlTQzJfQ1RMCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDM3KQotI2RlZmluZSBXU0E4ODFYX0JPT1NUX01JU0MzX0NUTAkJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzOCkKLSNkZWZpbmUgV1NBODgxWF9CT09TVF9BVEVTVF9DVEwJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwMzkpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4JCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzQSkKLSNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfQ01fTERPX1NFVAkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDNCKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9GRV9JU0VOU0VfQklBU19TRVQxCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzQykKLSNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMgkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwM0QpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9QUk9UX0FURVNUMQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDNFKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIJCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDAzRikKLSNkZWZpbmUgV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQwKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfQklBU19TRVQxCShXU0E4ODFYX0FOQUxPR19CQVNFKzB4MDA0MSkKLSNkZWZpbmUgV1NBODgxWF9CT05HT19SRVNSVl9SRUcxCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwNDIpCi0jZGVmaW5lIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMgkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQzKQotI2RlZmluZSBXU0E4ODFYX1NQS1JfUFJPVF9TQVIJCQkoV1NBODgxWF9BTkFMT0dfQkFTRSsweDAwNDQpCi0jZGVmaW5lIFdTQTg4MVhfU1BLUl9TVEFUVVMzCQkJKFdTQTg4MVhfQU5BTE9HX0JBU0UrMHgwMDQ1KQotCi0jZGVmaW5lIFdTQTg4MVhfTlVNX1JFR0lTVEVSUwkJCShXU0E4ODFYX1NQS1JfU1RBVFVTMysxKQotI2RlZmluZSBXU0E4ODFYX01BWF9SRUdJU1RFUgkJCShXU0E4ODFYX05VTV9SRUdJU1RFUlMtMSkKLSNkZWZpbmUgV1NBODgxWF9DQUNIRV9TSVpFCQkJV1NBODgxWF9OVU1fUkVHSVNURVJTCi0KLSNlbmRpZiAvKiBXU0E4ODFYX1JFR0lTVEVSU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnbWFwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtcmVnbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYmJiZmEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXJlZ21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSAid3NhODgxeC1yZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJ3c2E4ODF4LmgiCi0KLS8qCi0gKiBEZWZhdWx0IHJlZ2lzdGVyIHJlc2V0IHZhbHVlcyB0aGF0IGFyZSBjb21tb24gYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucwotICogYXJlIGRlZmluZWQgaGVyZS4gSWYgYSByZWdpc3RlciByZXNldCB2YWx1ZSBpcyBjaGFuZ2VkIGJhc2VkIG9uIHZlcnNpb24KLSAqIHRoZW4gcmVtb3ZlIGl0IGZyb20gdGhpcyBzdHJ1Y3R1cmUgYW5kIGFkZCBpdCBpbiB2ZXJzaW9uIHNwZWNpZmljCi0gKiBzdHJ1Y3R1cmVzLgotICovCi1zdGF0aWMgc3RydWN0IHJlZ19kZWZhdWx0IHdzYTg4MXhfZGVmYXVsdHNbXSA9IHsKLQl7V1NBODgxWF9DSElQX0lEMCwgMHgwMH0sCi0Je1dTQTg4MVhfQ0hJUF9JRDEsIDB4MDB9LAotCXtXU0E4ODFYX0NISVBfSUQyLCAweDAwfSwKLQl7V1NBODgxWF9DSElQX0lEMywgMHgwMn0sCi0Je1dTQTg4MVhfQlVTX0lELCAweDAwfSwKLQl7V1NBODgxWF9DRENfUlNUX0NUTCwgMHgwMH0sCi0Je1dTQTg4MVhfQ0RDX1RPUF9DTEtfQ1RMLCAweDAzfSwKLQl7V1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDB9LAotCXtXU0E4ODFYX0NEQ19ESUdfQ0xLX0NUTCwgMHgwMH0sCi0Je1dTQTg4MVhfQ0xPQ0tfQ09ORklHLCAweDAwfSwKLQl7V1NBODgxWF9BTkFfQ1RMLCAweDA4fSwKLQl7V1NBODgxWF9TV1JfUkVTRVRfRU4sIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfREVURUNUX0NUTCwgMHgwMX0sCi0Je1dTQTg4MVhfVEVNUF9NU0IsIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfTFNCLCAweDAwfSwKLQl7V1NBODgxWF9URU1QX0NPTkZJRzAsIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfQ09ORklHMSwgMHgwMH0sCi0Je1dTQTg4MVhfQ0RDX0NMSVBfQ1RMLCAweDAzfSwKLQl7V1NBODgxWF9TRE1fUERNOV9MU0IsIDB4MDB9LAotCXtXU0E4ODFYX1NETV9QRE05X01TQiwgMHgwMH0sCi0Je1dTQTg4MVhfQ0RDX1JYX0NUTCwgMHg3RX0sCi0Je1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMCwgMHgwMH0sCi0Je1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMSwgMHgwMH0sCi0Je1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMiwgMHgwMH0sCi0Je1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMywgMHgwMH0sCi0Je1dTQTg4MVhfT1RQX0NUUkwwLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfQ1RSTDEsIDB4MDB9LAotCXtXU0E4ODFYX0hEUklWRV9DVExfR1JPVVAxLCAweDAwfSwKLQl7V1NBODgxWF9JTlRSX01PREUsIDB4MDB9LAotCXtXU0E4ODFYX0lOVFJfU1RBVFVTLCAweDAwfSwKLQl7V1NBODgxWF9JTlRSX0NMRUFSLCAweDAwfSwKLQl7V1NBODgxWF9JTlRSX0xFVkVMLCAweDAwfSwKLQl7V1NBODgxWF9JTlRSX1NFVCwgMHgwMH0sCi0Je1dTQTg4MVhfSU5UUl9URVNULCAweDAwfSwKLQl7V1NBODgxWF9QRE1fVEVTVF9NT0RFLCAweDAwfSwKLQl7V1NBODgxWF9BVEVfVEVTVF9NT0RFLCAweDAwfSwKLQl7V1NBODgxWF9QSU5fQ1RMX01PREUsIDB4MDB9LAotCXtXU0E4ODFYX1BJTl9DVExfT0UsIDB4MDB9LAotCXtXU0E4ODFYX1BJTl9XREFUQV9JT1BBRCwgMHgwMH0sCi0Je1dTQTg4MVhfUElOX1NUQVRVUywgMHgwMH0sCi0Je1dTQTg4MVhfRElHX0RFQlVHX01PREUsIDB4MDB9LAotCXtXU0E4ODFYX0RJR19ERUJVR19TRUwsIDB4MDB9LAotCXtXU0E4ODFYX0RJR19ERUJVR19FTiwgMHgwMH0sCi0Je1dTQTg4MVhfU1dSX0hNX1RFU1QxLCAweDA4fSwKLQl7V1NBODgxWF9TV1JfSE1fVEVTVDIsIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfREVURUNUX0RCR19DVEwsIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfREVCVUdfTVNCLCAweDAwfSwKLQl7V1NBODgxWF9URU1QX0RFQlVHX0xTQiwgMHgwMH0sCi0Je1dTQTg4MVhfU0FNUExFX0VER0VfU0VMLCAweDBDfSwKLQl7V1NBODgxWF9TUEFSRV8wLCAweDAwfSwKLQl7V1NBODgxWF9TUEFSRV8xLCAweDAwfSwKLQl7V1NBODgxWF9TUEFSRV8yLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzAsIDB4MDF9LAotCXtXU0E4ODFYX09UUF9SRUdfMSwgMHhGRn0sCi0Je1dTQTg4MVhfT1RQX1JFR18yLCAweEMwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzMsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfNCwgMHhDMH0sCi0Je1dTQTg4MVhfT1RQX1JFR181LCAweEZGfSwKLQl7V1NBODgxWF9PVFBfUkVHXzYsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfNywgMHhGRn0sCi0Je1dTQTg4MVhfT1RQX1JFR184LCAweEZGfSwKLQl7V1NBODgxWF9PVFBfUkVHXzksIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTAsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTEsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTIsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTMsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTQsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTUsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTYsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTcsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTgsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMTksIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMjAsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMjEsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMjIsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMjMsIDB4RkZ9LAotCXtXU0E4ODFYX09UUF9SRUdfMjQsIDB4MDN9LAotCXtXU0E4ODFYX09UUF9SRUdfMjUsIDB4MDF9LAotCXtXU0E4ODFYX09UUF9SRUdfMjYsIDB4MDN9LAotCXtXU0E4ODFYX09UUF9SRUdfMjcsIDB4MTF9LAotCXtXU0E4ODFYX09UUF9SRUdfNjMsIDB4NDB9LAotCS8qIFdTQTg4MXggQW5hbG9nIHJlZ2lzdGVycyAqLwotCXtXU0E4ODFYX0JJQVNfUkVGX0NUUkwsIDB4NkN9LAotCXtXU0E4ODFYX0JJQVNfVEVTVCwgMHgxNn0sCi0Je1dTQTg4MVhfQklBU19CSUFTLCAweEYwfSwKLQl7V1NBODgxWF9URU1QX09QLCAweDAwfSwKLQl7V1NBODgxWF9URU1QX0lSRUZfQ1RSTCwgMHg1Nn0sCi0Je1dTQTg4MVhfVEVNUF9JU0VOU19DVFJMLCAweDQ3fSwKLQl7V1NBODgxWF9URU1QX0NMS19DVFJMLCAweDg3fSwKLQl7V1NBODgxWF9URU1QX1RFU1QsIDB4MDB9LAotCXtXU0E4ODFYX1RFTVBfQklBUywgMHg1MX0sCi0Je1dTQTg4MVhfVEVNUF9ET1VUX01TQiwgMHgwMH0sCi0Je1dTQTg4MVhfVEVNUF9ET1VUX0xTQiwgMHgwMH0sCi0Je1dTQTg4MVhfQURDX0VOX01PRFVfViwgMHgwMH0sCi0Je1dTQTg4MVhfQURDX0VOX01PRFVfSSwgMHgwMH0sCi0Je1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX1YsIDB4MDB9LAotCXtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JLCAweDAwfSwKLQl7V1NBODgxWF9BRENfRU5fU0VMX0lCQUlTLCAweDEwfSwKLQl7V1NBODgxWF9TUEtSX0RSVl9FTiwgMHg3NH0sCi0Je1dTQTg4MVhfU1BLUl9EUlZfREJHLCAweDE1fSwKLQl7V1NBODgxWF9TUEtSX1BXUlNUR19EQkcsIDB4MDB9LAotCXtXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhENH0sCi0Je1dTQTg4MVhfU1BLUl9DTElQX0NUTCwgMHg5MH0sCi0Je1dTQTg4MVhfU1BLUl9QQV9JTlQsIDB4NTR9LAotCXtXU0E4ODFYX1NQS1JfQklBU19DQUwsIDB4QUN9LAotCXtXU0E4ODFYX1NQS1JfU1RBVFVTMSwgMHgwMH0sCi0Je1dTQTg4MVhfU1BLUl9TVEFUVVMyLCAweDAwfSwKLQl7V1NBODgxWF9CT09TVF9FTl9DVEwsIDB4MTh9LAotCXtXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVQsIDB4N0F9LAotCXtXU0E4ODFYX0JPT1NUX1BSRVNFVF9PVVQyLCAweDcwfSwKLQl7V1NBODgxWF9CT09TVF9GT1JDRV9PVVQsIDB4MEV9LAotCXtXU0E4ODFYX0JPT1NUX0xET19QUk9HLCAweDE2fSwKLQl7V1NBODgxWF9CT09TVF9TTE9QRV9DT01QX0lTRU5TRV9GQiwgMHg3MX0sCi0Je1dTQTg4MVhfQk9PU1RfUk9OX0NUTCwgMHgwRn0sCi0Je1dTQTg4MVhfQk9PU1RfWlhfQ1RMLCAweDM0fSwKLQl7V1NBODgxWF9CT09TVF9TVEFSVF9DVEwsIDB4MjN9LAotCXtXU0E4ODFYX0JPT1NUX01JU0MxX0NUTCwgMHg4MH0sCi0Je1dTQTg4MVhfQk9PU1RfTUlTQzJfQ1RMLCAweDAwfSwKLQl7V1NBODgxWF9CT09TVF9NSVNDM19DVEwsIDB4MDB9LAotCXtXU0E4ODFYX0JPT1NUX0FURVNUX0NUTCwgMHgwMH0sCi0Je1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sIDB4NDZ9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9DTV9MRE9fU0VULCAweDNCfSwKLQl7V1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMSwgMHg4RH0sCi0Je1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0lTRU5TRV9CSUFTX1NFVDIsIDB4OER9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDEsIDB4MDF9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLCAweDhEfSwKLQl7V1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX0JJQVNfU0VUMSwgMHg0RH0sCi0Je1dTQTg4MVhfU1BLUl9QUk9UX1NBUiwgMHgwMH0sCi0Je1dTQTg4MVhfU1BLUl9TVEFUVVMzLCAweDAwfSwKLX07Ci0KLS8qIERlZmF1bHQgcmVnaXN0ZXIgcmVzZXQgdmFsdWVzIGZvciBXU0E4ODF4IHJldiAyLjAgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdzYTg4MXhfcmV2XzJfMFtdID0gewotCXtXU0E4ODFYX1JFU0VUX0NUTCwgMHgwMCwgMHgwMH0sCi0Je1dTQTg4MVhfVEFEQ19WQUxVRV9DVEwsIDB4MDEsIDB4MDB9LAotCXtXU0E4ODFYX0lOVFJfTUFTSywgMHgxQiwgMHgwMH0sCi0Je1dTQTg4MVhfSU9QQURfQ1RMLCAweDAwLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzI4LCAweDNGLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzI5LCAweDNGLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzMwLCAweDAxLCAweDAwfSwKLQl7V1NBODgxWF9PVFBfUkVHXzMxLCAweDAxLCAweDAwfSwKLQl7V1NBODgxWF9URU1QX0FEQ19DVFJMLCAweDAzLCAweDAwfSwKLQl7V1NBODgxWF9BRENfU0VMX0lCSUFTLCAweDQ1LCAweDAwfSwKLQl7V1NBODgxWF9TUEtSX0RSVl9HQUlOLCAweEMxLCAweDAwfSwKLQl7V1NBODgxWF9TUEtSX0RBQ19DVEwsIDB4NDIsIDB4MDB9LAotCXtXU0E4ODFYX1NQS1JfQkJNX0NUTCwgMHgwMiwgMHgwMH0sCi0Je1dTQTg4MVhfU1BLUl9NSVNDX0NUTDEsIDB4NDAsIDB4MDB9LAotCXtXU0E4ODFYX1NQS1JfTUlTQ19DVEwyLCAweDA3LCAweDAwfSwKLQl7V1NBODgxWF9TUEtSX0JJQVNfSU5ULCAweDVGLCAweDAwfSwKLQl7V1NBODgxWF9TUEtSX0JJQVNfUFNSUiwgMHg0NCwgMHgwMH0sCi0Je1dTQTg4MVhfQk9PU1RfUFNfQ1RMLCAweEEwLCAweDAwfSwKLQl7V1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSwgMHhCNywgMHgwMH0sCi0Je1dTQTg4MVhfQk9PU1RfTE9PUF9TVEFCSUxJVFksIDB4OEQsIDB4MDB9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIsIDB4MDIsIDB4MDB9LAotCXtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzEsIDB4NUUsIDB4MDB9LAotCXtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzIsIDB4MDcsIDB4MDB9LAotfTsKLQotLyoKLSAqIHdzYTg4MXhfcmVnbWFwX2RlZmF1bHRzIC0gdXBkYXRlIHJlZ21hcCBkZWZhdWx0IHJlZ2lzdGVyIHZhbHVlcwotICogQHJlZ21hcDogcG9pbnRlciB0byByZWdtYXAgc3RydWN0dXJlCi0gKiBAdmVyc2lvbjogd3NhODgxeCB2ZXJzaW9uIGlkCi0gKgotICogVXBkYXRlIHJlZ21hcCBkZWZhdWx0IHJlZ2lzdGVyIHZhbHVlcyBiYXNlZCBvbiB2ZXJzaW9uIGlkCi0gKgotICovCi12b2lkIHdzYTg4MXhfcmVnbWFwX2RlZmF1bHRzKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgdTggdmVyc2lvbikKLXsKLQl1MTYgcmV0ID0gMDsKLQotCWlmICghcmVnbWFwKSB7Ci0JCXByX2RlYnVnKCIlczogcmVnbWFwIHN0cnVjdHVyZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZWdjYWNoZV9jYWNoZV9vbmx5KHJlZ21hcCwgdHJ1ZSk7Ci0JcmV0ID0gcmVnbWFwX211bHRpX3JlZ193cml0ZShyZWdtYXAsIHdzYTg4MXhfcmV2XzJfMCwKLQkJCQkgICAgIEFSUkFZX1NJWkUod3NhODgxeF9yZXZfMl8wKSk7Ci0JcmVnY2FjaGVfY2FjaGVfb25seShyZWdtYXAsIGZhbHNlKTsKLQotCWlmIChyZXQpCi0JCXByX2RlYnVnKCIlczogRmFpbGVkIHRvIHVwZGF0ZSByZWdtYXAgZGVmYXVsdHMgcmV0PSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcmV0KTsKLX0KLUVYUE9SVF9TWU1CT0wod3NhODgxeF9yZWdtYXBfZGVmYXVsdHMpOwotCi1zdGF0aWMgYm9vbCB3c2E4ODF4X3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKLXsKLQlyZXR1cm4gd3NhODgxeF9yZWdfcmVhZGFibGVbcmVnXTsKLX0KLQotc3RhdGljIGJvb2wgd3NhODgxeF92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCi17Ci0Jc3dpdGNoIChyZWcpIHsKLQljYXNlIFdTQTg4MVhfQ0hJUF9JRDA6Ci0JY2FzZSBXU0E4ODFYX0NISVBfSUQxOgotCWNhc2UgV1NBODgxWF9DSElQX0lEMjoKLQljYXNlIFdTQTg4MVhfQ0hJUF9JRDM6Ci0JY2FzZSBXU0E4ODFYX0JVU19JRDoKLQljYXNlIFdTQTg4MVhfVEVNUF9NU0I6Ci0JY2FzZSBXU0E4ODFYX1RFTVBfTFNCOgotCWNhc2UgV1NBODgxWF9TRE1fUERNOV9MU0I6Ci0JY2FzZSBXU0E4ODFYX1NETV9QRE05X01TQjoKLQljYXNlIFdTQTg4MVhfT1RQX0NUUkwxOgotCWNhc2UgV1NBODgxWF9JTlRSX1NUQVRVUzoKLQljYXNlIFdTQTg4MVhfQVRFX1RFU1RfTU9ERToKLQljYXNlIFdTQTg4MVhfUElOX1NUQVRVUzoKLQljYXNlIFdTQTg4MVhfU1dSX0hNX1RFU1QyOgotCWNhc2UgV1NBODgxWF9TUEtSX1NUQVRVUzE6Ci0JY2FzZSBXU0E4ODFYX1NQS1JfU1RBVFVTMjoKLQljYXNlIFdTQTg4MVhfU1BLUl9TVEFUVVMzOgotCWNhc2UgV1NBODgxWF9PVFBfUkVHXzA6Ci0JY2FzZSBXU0E4ODFYX09UUF9SRUdfMToKLQljYXNlIFdTQTg4MVhfT1RQX1JFR18yOgotCWNhc2UgV1NBODgxWF9PVFBfUkVHXzM6Ci0JY2FzZSBXU0E4ODFYX09UUF9SRUdfNDoKLQljYXNlIFdTQTg4MVhfT1RQX1JFR181OgotCWNhc2UgV1NBODgxWF9PVFBfUkVHXzMxOgotCWNhc2UgV1NBODgxWF9URU1QX0RPVVRfTVNCOgotCWNhc2UgV1NBODgxWF9URU1QX0RPVVRfTFNCOgotCWNhc2UgV1NBODgxWF9URU1QX09QOgotCWNhc2UgV1NBODgxWF9TUEtSX1BST1RfU0FSOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3c2E4ODF4X3JlZ21hcF9jb25maWcgPSB7Ci0JLnJlZ19iaXRzID0gMTYsCi0JLnZhbF9iaXRzID0gOCwKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKLQkucmVnX2RlZmF1bHRzID0gd3NhODgxeF9kZWZhdWx0cywKLQkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod3NhODgxeF9kZWZhdWx0cyksCi0JLm1heF9yZWdpc3RlciA9IFdTQTg4MVhfTUFYX1JFR0lTVEVSLAotCS52b2xhdGlsZV9yZWcgPSB3c2E4ODF4X3ZvbGF0aWxlX3JlZ2lzdGVyLAotCS5yZWFkYWJsZV9yZWcgPSB3c2E4ODF4X3JlYWRhYmxlX3JlZ2lzdGVyLAotCS5yZWdfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAotCS52YWxfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAotCS5jYW5fbXVsdGlfd3JpdGUgPSB0cnVlLAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10YWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxMjEyYi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dzYTg4MXgtdGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSAid3NhODgxeC1yZWdpc3RlcnMuaCIKLQotY29uc3QgdTggd3NhODgxeF9yZWdfcmVhZGFibGVbV1NBODgxWF9DQUNIRV9TSVpFXSA9IHsKLQlbV1NBODgxWF9DSElQX0lEMF0gPSAxLAotCVtXU0E4ODFYX0NISVBfSUQxXSA9IDEsCi0JW1dTQTg4MVhfQ0hJUF9JRDJdID0gMSwKLQlbV1NBODgxWF9DSElQX0lEM10gPSAxLAotCVtXU0E4ODFYX0JVU19JRF0gPSAxLAotCVtXU0E4ODFYX0NEQ19SU1RfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQ0RDX1RPUF9DTEtfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQ0RDX0FOQV9DTEtfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQ0RDX0RJR19DTEtfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQ0xPQ0tfQ09ORklHXSA9IDEsCi0JW1dTQTg4MVhfQU5BX0NUTF0gPSAxLAotCVtXU0E4ODFYX1NXUl9SRVNFVF9FTl0gPSAxLAotCVtXU0E4ODFYX1JFU0VUX0NUTF0gPSAxLAotCVtXU0E4ODFYX1RBRENfVkFMVUVfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9ERVRFQ1RfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9NU0JdID0gMSwKLQlbV1NBODgxWF9URU1QX0xTQl0gPSAxLAotCVtXU0E4ODFYX1RFTVBfQ09ORklHMF0gPSAxLAotCVtXU0E4ODFYX1RFTVBfQ09ORklHMV0gPSAxLAotCVtXU0E4ODFYX0NEQ19DTElQX0NUTF0gPSAxLAotCVtXU0E4ODFYX1NETV9QRE05X0xTQl0gPSAxLAotCVtXU0E4ODFYX1NETV9QRE05X01TQl0gPSAxLAotCVtXU0E4ODFYX0NEQ19SWF9DVExdID0gMSwKLQlbV1NBODgxWF9ERU1fQllQQVNTX0RBVEEwXSA9IDEsCi0JW1dTQTg4MVhfREVNX0JZUEFTU19EQVRBMV0gPSAxLAotCVtXU0E4ODFYX0RFTV9CWVBBU1NfREFUQTJdID0gMSwKLQlbV1NBODgxWF9ERU1fQllQQVNTX0RBVEEzXSA9IDEsCi0JW1dTQTg4MVhfT1RQX0NUUkwwXSA9IDEsCi0JW1dTQTg4MVhfT1RQX0NUUkwxXSA9IDEsCi0JW1dTQTg4MVhfSERSSVZFX0NUTF9HUk9VUDFdID0gMSwKLQlbV1NBODgxWF9JTlRSX01PREVdID0gMSwKLQlbV1NBODgxWF9JTlRSX01BU0tdID0gMSwKLQlbV1NBODgxWF9JTlRSX1NUQVRVU10gPSAxLAotCVtXU0E4ODFYX0lOVFJfQ0xFQVJdID0gMSwKLQlbV1NBODgxWF9JTlRSX0xFVkVMXSA9IDEsCi0JW1dTQTg4MVhfSU5UUl9TRVRdID0gMSwKLQlbV1NBODgxWF9JTlRSX1RFU1RdID0gMSwKLQlbV1NBODgxWF9QRE1fVEVTVF9NT0RFXSA9IDEsCi0JW1dTQTg4MVhfQVRFX1RFU1RfTU9ERV0gPSAxLAotCVtXU0E4ODFYX1BJTl9DVExfTU9ERV0gPSAxLAotCVtXU0E4ODFYX1BJTl9DVExfT0VdID0gMSwKLQlbV1NBODgxWF9QSU5fV0RBVEFfSU9QQURdID0gMSwKLQlbV1NBODgxWF9QSU5fU1RBVFVTXSA9IDEsCi0JW1dTQTg4MVhfRElHX0RFQlVHX01PREVdID0gMSwKLQlbV1NBODgxWF9ESUdfREVCVUdfU0VMXSA9IDEsCi0JW1dTQTg4MVhfRElHX0RFQlVHX0VOXSA9IDEsCi0JW1dTQTg4MVhfU1dSX0hNX1RFU1QxXSA9IDEsCi0JW1dTQTg4MVhfU1dSX0hNX1RFU1QyXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9ERVRFQ1RfREJHX0NUTF0gPSAxLAotCVtXU0E4ODFYX1RFTVBfREVCVUdfTVNCXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9ERUJVR19MU0JdID0gMSwKLQlbV1NBODgxWF9TQU1QTEVfRURHRV9TRUxdID0gMSwKLQlbV1NBODgxWF9JT1BBRF9DVExdID0gMSwKLQlbV1NBODgxWF9TUEFSRV8wXSA9IDEsCi0JW1dTQTg4MVhfU1BBUkVfMV0gPSAxLAotCVtXU0E4ODFYX1NQQVJFXzJdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzBdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzFdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzJdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzNdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzRdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzVdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzZdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzddID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzhdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzldID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzEwXSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18xMV0gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMTJdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzEzXSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18xNF0gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMTVdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzE2XSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18xN10gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMThdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzE5XSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18yMF0gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMjFdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzIyXSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18yM10gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMjRdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzI1XSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18yNl0gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMjddID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzI4XSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR18yOV0gPSAxLAotCVtXU0E4ODFYX09UUF9SRUdfMzBdID0gMSwKLQlbV1NBODgxWF9PVFBfUkVHXzMxXSA9IDEsCi0JW1dTQTg4MVhfT1RQX1JFR182M10gPSAxLAotCS8qIEFuYWxvZyBSZWdpc3RlcnMgKi8KLQlbV1NBODgxWF9CSUFTX1JFRl9DVFJMXSA9IDEsCi0JW1dTQTg4MVhfQklBU19URVNUXSA9IDEsCi0JW1dTQTg4MVhfQklBU19CSUFTXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9PUF0gPSAxLAotCVtXU0E4ODFYX1RFTVBfSVJFRl9DVFJMXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9JU0VOU19DVFJMXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9DTEtfQ1RSTF0gPSAxLAotCVtXU0E4ODFYX1RFTVBfVEVTVF0gPSAxLAotCVtXU0E4ODFYX1RFTVBfQklBU10gPSAxLAotCVtXU0E4ODFYX1RFTVBfQURDX0NUUkxdID0gMSwKLQlbV1NBODgxWF9URU1QX0RPVVRfTVNCXSA9IDEsCi0JW1dTQTg4MVhfVEVNUF9ET1VUX0xTQl0gPSAxLAotCVtXU0E4ODFYX0FEQ19FTl9NT0RVX1ZdID0gMSwKLQlbV1NBODgxWF9BRENfRU5fTU9EVV9JXSA9IDEsCi0JW1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX1ZdID0gMSwKLQlbV1NBODgxWF9BRENfRU5fREVUX1RFU1RfSV0gPSAxLAotCVtXU0E4ODFYX0FEQ19TRUxfSUJJQVNdID0gMSwKLQlbV1NBODgxWF9BRENfRU5fU0VMX0lCQUlTXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9EUlZfRU5dID0gMSwKLQlbV1NBODgxWF9TUEtSX0RSVl9HQUlOXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9EQUNfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9EUlZfREJHXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9PQ1BfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9DTElQX0NUTF0gPSAxLAotCVtXU0E4ODFYX1NQS1JfQkJNX0NUTF0gPSAxLAotCVtXU0E4ODFYX1NQS1JfTUlTQ19DVEwxXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9NSVNDX0NUTDJdID0gMSwKLQlbV1NBODgxWF9TUEtSX0JJQVNfSU5UXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9QQV9JTlRdID0gMSwKLQlbV1NBODgxWF9TUEtSX0JJQVNfQ0FMXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9CSUFTX1BTUlJdID0gMSwKLQlbV1NBODgxWF9TUEtSX1NUQVRVUzFdID0gMSwKLQlbV1NBODgxWF9TUEtSX1NUQVRVUzJdID0gMSwKLQlbV1NBODgxWF9CT09TVF9FTl9DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9DVVJSRU5UX0xJTUlUXSA9IDEsCi0JW1dTQTg4MVhfQk9PU1RfUFNfQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQk9PU1RfUFJFU0VUX09VVDFdID0gMSwKLQlbV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMl0gPSAxLAotCVtXU0E4ODFYX0JPT1NUX0ZPUkNFX09VVF0gPSAxLAotCVtXU0E4ODFYX0JPT1NUX0xET19QUk9HXSA9IDEsCi0JW1dTQTg4MVhfQk9PU1RfU0xPUEVfQ09NUF9JU0VOU0VfRkJdID0gMSwKLQlbV1NBODgxWF9CT09TVF9ST05fQ1RMXSA9IDEsCi0JW1dTQTg4MVhfQk9PU1RfTE9PUF9TVEFCSUxJVFldID0gMSwKLQlbV1NBODgxWF9CT09TVF9aWF9DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9TVEFSVF9DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9NSVNDMV9DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9NSVNDMl9DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9NSVNDM19DVExdID0gMSwKLQlbV1NBODgxWF9CT09TVF9BVEVTVF9DVExdID0gMSwKLQlbV1NBODgxWF9TUEtSX1BST1RfRkVfR0FJTl0gPSAxLAotCVtXU0E4ODFYX1NQS1JfUFJPVF9GRV9DTV9MRE9fU0VUXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0lTRU5TRV9CSUFTX1NFVDFdID0gMSwKLQlbV1NBODgxWF9TUEtSX1BST1RfRkVfSVNFTlNFX0JJQVNfU0VUMl0gPSAxLAotCVtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDFdID0gMSwKLQlbV1NBODgxWF9TUEtSX1BST1RfQVRFU1QyXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ01dID0gMSwKLQlbV1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX0JJQVNfU0VUMV0gPSAxLAotCVtXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzFdID0gMSwKLQlbV1NBODgxWF9CT05HT19SRVNSVl9SRUcyXSA9IDEsCi0JW1dTQTg4MVhfU1BLUl9QUk9UX1NBUl0gPSAxLAotCVtXU0E4ODFYX1NQS1JfU1RBVFVTM10gPSAxLAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10ZW1wLXNlbnNvci5jIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjBlY2YuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAid3NhODgxeC10ZW1wLXNlbnNvci5oIgotCi0jZGVmaW5lIFQxX1RFTVAgLTEwCi0jZGVmaW5lIFQyX1RFTVAgMTUwCi0jZGVmaW5lIExPV19URU1QX1RIUkVTSE9MRCA1Ci0jZGVmaW5lIEhJR0hfVEVNUF9USFJFU0hPTEQgNDUKLSNkZWZpbmUgVEVNUF9JTlZBTElECTB4RkZGRgotI2RlZmluZSBXU0E4ODFYX1RFTVBfUkVUUlkgMwotLyoKLSAqIHdzYTg4MXhfZ2V0X3RlbXAgLSBnZXQgd3NhIHRlbXBlcmF0dXJlCi0gKiBAdGhlcm1hbDogdGhlcm1hbCB6b25lIGRldmljZQotICogQHRlbXA6IHRlbXBlcmF0dXJlIHZhbHVlCi0gKgotICogR2V0IHRoZSB0ZW1wZXJhdHVyZSBvZiB3c2E4ODF4LgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotaW50IHdzYTg4MXhfZ2V0X3RlbXAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWwsCi0JCSAgICAgaW50ICp0ZW1wKQotewotCXN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgKnBkYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgd3NhX3RlbXBfcmVnaXN0ZXIgcmVnOwotCWludCBkbWVhcywgZDEsIGQyOwotCWludCByZXQgPSAwOwotCWludCB0ZW1wX3ZhbDsKLQlpbnQgdDEgPSBUMV9URU1QOwotCWludCB0MiA9IFQyX1RFTVA7Ci0JdTggcmV0cnkgPSBXU0E4ODFYX1RFTVBfUkVUUlk7Ci0KLQlpZiAoIXRoZXJtYWwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHRoZXJtYWwtPmRldmRhdGEpIHsKLQkJcGRhdGEgPSB0aGVybWFsLT5kZXZkYXRhOwotCQlpZiAocGRhdGEtPmNvZGVjKSB7Ci0JCQljb2RlYyA9IHBkYXRhLT5jb2RlYzsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogcGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci10ZW1wX3JldHJ5OgotCWlmIChwZGF0YS0+d3NhX3RlbXBfcmVnX3JlYWQpIHsKLQkJcmV0ID0gcGRhdGEtPndzYV90ZW1wX3JlZ19yZWFkKGNvZGVjLCAmcmVnKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogdGVtcGVyYXR1cmUgcmVnaXN0ZXIgcmVhZCBmYWlsZWQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IHdzYV90ZW1wX3JlZ19yZWFkIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qCi0JICogVGVtcGVyYXR1cmUgcmVnaXN0ZXIgdmFsdWVzIGFyZSBleHBlY3RlZCB0byBiZSBpbiB0aGUKLQkgKiBmb2xsb3dpbmcgcmFuZ2UuCi0JICogZDFfbXNiICA9IDY4IC0gOTIgYW5kIGQxX2xzYiAgPSAwLCA2NCwgMTI4LCAxOTIKLQkgKiBkMl9tc2IgID0gMTg1IC0yMTggYW5kICBkMl9sc2IgID0gMCwgNjQsIDEyOCwgMTkyCi0JICovCi0JaWYgKChyZWcuZDFfbXNiIDwgNjggfHwgcmVnLmQxX21zYiA+IDkyKSB8fAotCSAgICAoIShyZWcuZDFfbHNiID09IDAgfHwgcmVnLmQxX2xzYiA9PSA2NCB8fCByZWcuZDFfbHNiID09IDEyOCB8fAotCQlyZWcuZDFfbHNiID09IDE5MikpIHx8Ci0JICAgIChyZWcuZDJfbXNiIDwgMTg1IHx8IHJlZy5kMl9tc2IgPiAyMTgpIHx8Ci0JICAgICghKHJlZy5kMl9sc2IgPT0gMCB8fCByZWcuZDJfbHNiID09IDY0IHx8IHJlZy5kMl9sc2IgPT0gMTI4IHx8Ci0JCXJlZy5kMl9sc2IgPT0gMTkyKSkpIHsKLQkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogVGVtcGVyYXR1cmUgcmVnaXN0ZXJzWyVkICVkICVkICVkXSBhcmUgb3V0IG9mIHJhbmdlXG4iLAotCQkJCSAgIF9fZnVuY19fLCByZWcuZDFfbXNiLCByZWcuZDFfbHNiLCByZWcuZDJfbXNiLAotCQkJCSAgIHJlZy5kMl9sc2IpOwotCX0KLQlkbWVhcyA9ICgocmVnLmRtZWFzX21zYiA8PCAweDgpIHwgcmVnLmRtZWFzX2xzYikgPj4gMHg2OwotCWQxID0gKChyZWcuZDFfbXNiIDw8IDB4OCkgfCByZWcuZDFfbHNiKSA+PiAweDY7Ci0JZDIgPSAoKHJlZy5kMl9tc2IgPDwgMHg4KSB8IHJlZy5kMl9sc2IpID4+IDB4NjsKLQotCWlmIChkMSA9PSBkMikKLQkJdGVtcF92YWwgPSBURU1QX0lOVkFMSUQ7Ci0JZWxzZQotCQl0ZW1wX3ZhbCA9IHQxICsgKCgoZG1lYXMgLSBkMSkgKiAodDIgLSB0MSkpLyhkMiAtIGQxKSk7Ci0KLQlpZiAodGVtcF92YWwgPD0gTE9XX1RFTVBfVEhSRVNIT0xEIHx8Ci0JCXRlbXBfdmFsID49IEhJR0hfVEVNUF9USFJFU0hPTEQpIHsKLQkJcHJpbnRrX3JhdGVsaW1pdGVkKCIlczogVDA6ICVkIGlzIG91dCBvZiByYW5nZVslZCwgJWRdXG4iLAotCQkJCSAgIF9fZnVuY19fLCB0ZW1wX3ZhbCwgTE9XX1RFTVBfVEhSRVNIT0xELAotCQkJCSAgIEhJR0hfVEVNUF9USFJFU0hPTEQpOwotCQlpZiAocmV0cnktLSkgewotCQkJbXNsZWVwKDIwKTsKLQkJCWdvdG8gdGVtcF9yZXRyeTsKLQkJfQotCX0KLQlpZiAodGVtcCkKLQkJKnRlbXAgPSB0ZW1wX3ZhbDsKLQlwcl9kZWJ1ZygiJXM6IHQwIG1lYXN1cmVkOiAlZCBkbWVhcyA9ICVkLCBkMSA9ICVkLCBkMiA9ICVkXG4iLAotCQkgIF9fZnVuY19fLCB0ZW1wX3ZhbCwgZG1lYXMsIGQxLCBkMik7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wod3NhODgxeF9nZXRfdGVtcCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgd3NhODgxeF90aGVybWFsX29wcyA9IHsKLQkuZ2V0X3RlbXAgPSB3c2E4ODF4X2dldF90ZW1wLAotfTsKLQotaW50IHdzYTg4MXhfaW5pdF90aGVybWFsKHN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgKnR6X3BkYXRhKQotewotCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0el9kZXY7Ci0KLQlpZiAodHpfcGRhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB0aGVybWFsIHBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIFJlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgem9uZSAqLwotCXR6X2RldiA9IHRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIodHpfcGRhdGEtPm5hbWUsCi0JCQkJMCwgMCwgdHpfcGRhdGEsCi0JCQkJJndzYTg4MXhfdGhlcm1hbF9vcHMsIE5VTEwsIDAsIDApOwotCWlmIChJU19FUlIodHpfZGV2KSkgewotCQlwcl9lcnIoIiVzOiB0aGVybWFsIGRldmljZSByZWdpc3RlciBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl0el9wZGF0YS0+dHpfZGV2ID0gdHpfZGV2OwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh3c2E4ODF4X2luaXRfdGhlcm1hbCk7Ci0KLXZvaWQgd3NhODgxeF9kZWluaXRfdGhlcm1hbChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHpfZGV2KQotewotCWlmICh0el9kZXYpCi0JCXRoZXJtYWxfem9uZV9kZXZpY2VfdW5yZWdpc3Rlcih0el9kZXYpOwotfQotRVhQT1JUX1NZTUJPTCh3c2E4ODF4X2RlaW5pdF90aGVybWFsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC10ZW1wLXNlbnNvci5oIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzFlYjcuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LXRlbXAtc2Vuc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgV1NBODgxWF9URU1QX1NFTlNPUl9ICi0jZGVmaW5lIFdTQTg4MVhfVEVNUF9TRU5TT1JfSAotCi0jaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotCi1zdHJ1Y3Qgd3NhX3RlbXBfcmVnaXN0ZXIgewotCXU4IGQxX21zYjsKLQl1OCBkMV9sc2I7Ci0JdTggZDJfbXNiOwotCXU4IGQyX2xzYjsKLQl1OCBkbWVhc19tc2I7Ci0JdTggZG1lYXNfbHNiOwotfTsKLXR5cGVkZWYgaW50MzJfdCAoKndzYV90ZW1wX3JlZ2lzdGVyX3JlYWQpKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJc3RydWN0IHdzYV90ZW1wX3JlZ2lzdGVyICp3c2FfdGVtcF9yZWcpOwotc3RydWN0IHdzYTg4MXhfdHpfcHJpdiB7Ci0Jc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6X2RldjsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHdzYV90ZW1wX3JlZ2lzdGVyICp3c2FfdGVtcF9yZWc7Ci0JY2hhciBuYW1lWzgwXTsKLQl3c2FfdGVtcF9yZWdpc3Rlcl9yZWFkIHdzYV90ZW1wX3JlZ19yZWFkOwotfTsKLQotaW50IHdzYTg4MXhfZ2V0X3RlbXAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6X2RldiwgaW50ICp0ZW1wKTsKLWludCB3c2E4ODF4X2luaXRfdGhlcm1hbChzdHJ1Y3Qgd3NhODgxeF90el9wcml2ICp0el9wZGF0YSk7Ci12b2lkIHdzYTg4MXhfZGVpbml0X3RoZXJtYWwoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6X2Rldik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC5jIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWVhMTAuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZHdpcmUvc291bmR3aXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21zbS1jZGMtcGluY3RybC5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgIndzYTg4MXguaCIKLSNpbmNsdWRlICJ3c2E4ODF4LXRlbXAtc2Vuc29yLmgiCi0KLSNkZWZpbmUgV1NBODgxWF9OVU1fUkVUUlkJNQotCi1lbnVtIHsKLQlHXzE4REIgPSAwLAotCUdfMTZQNURCLAotCUdfMTVEQiwKLQlHXzEzUDVEQiwKLQlHXzEyREIsCi0JR18xMFA1REIsCi0JR185REIsCi0JR183UDVEQiwKLQlHXzZEQiwKLQlHXzRQNURCLAotCUdfM0RCLAotCUdfMVA1REIsCi0JR18wREIsCi19OwotCi1lbnVtIHsKLQlESVNBQkxFID0gMCwKLQlFTkFCTEUsCi19OwotCi1lbnVtIHsKLQlTV1JfREFDX1BPUlQsCi0JU1dSX0NPTVBfUE9SVCwKLQlTV1JfQk9PU1RfUE9SVCwKLQlTV1JfVklTRU5TRV9QT1JULAotfTsKLQotc3RydWN0IHN3cl9wb3J0IHsKLQl1OCBwb3J0X2lkOwotCXU4IGNoX21hc2s7Ci0JdTMyIGNoX3JhdGU7Ci0JdTggbnVtX2NoOwotfTsKLQotZW51bSB7Ci0JV1NBODgxWF9ERVZfRE9XTiwKLQlXU0E4ODFYX0RFVl9VUCwKLX07Ci0KLS8qCi0gKiBQcml2YXRlIGRhdGEgU3RydWN0dXJlIGZvciB3c2E4ODF4LiBBbGwgcGFyYW1ldGVycyByZWxhdGVkIHRvCi0gKiBXU0E4ODFYIGNvZGVjIG5lZWRzIHRvIGJlIGRlZmluZWQgaGVyZS4KLSAqLwotc3RydWN0IHdzYTg4MXhfcHJpdiB7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3dyX2RldmljZSAqc3dyX3NsYXZlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlib29sIGNvbXBfZW5hYmxlOwotCWJvb2wgYm9vc3RfZW5hYmxlOwotCWJvb2wgdmlzZW5zZV9lbmFibGU7Ci0JdTggcGFfZ2FpbjsKLQlzdHJ1Y3Qgc3dyX3BvcnQgcG9ydFtXU0E4ODFYX01BWF9TV1JfUE9SVFNdOwotCWludCBwZF9ncGlvOwotCXN0cnVjdCB3c2E4ODF4X3R6X3ByaXYgdHpfcGRhdGE7Ci0JaW50IGJnX2NudDsKLQlpbnQgY2xrX2NudDsKLQlpbnQgdmVyc2lvbjsKLQlzdHJ1Y3QgbXV0ZXggYmdfbG9jazsKLQlzdHJ1Y3QgbXV0ZXggcmVzX2xvY2s7Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnZlcnNpb25fZW50cnk7Ci0JaW50IHN0YXRlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgb2NwX2N0bF93b3JrOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqd3NhX3JzdF9ucDsKLQlpbnQgcGFfbXV0ZTsKLX07Ci0KLSNkZWZpbmUgU1dSX1NMVl9NQVhfUkVHX0FERFIJMHgzOTAKLSNkZWZpbmUgU1dSX1NMVl9TVEFSVF9SRUdfQUREUgkweDQwCi0jZGVmaW5lIFNXUl9TTFZfTUFYX0JVRl9MRU4JMjAKLSNkZWZpbmUgQllURVNfUEVSX0xJTkUJCTEyCi0jZGVmaW5lIFNXUl9TTFZfUkRfQlVGX0xFTgk4Ci0jZGVmaW5lIFNXUl9TTFZfV1JfQlVGX0xFTgkzMgotI2RlZmluZSBTV1JfU0xWX01BWF9ERVZJQ0VTCTIKLQotI2RlZmluZSBXU0E4ODFYX1ZFUlNJT05fRU5UUllfU0laRSAyNwotI2RlZmluZSBXU0E4ODFYX09DUF9DVExfVElNRVJfU0VDIDIKLSNkZWZpbmUgV1NBODgxWF9PQ1BfQ1RMX1RFTVBfQ0VMU0lVUyAyNQotI2RlZmluZSBXU0E4ODFYX09DUF9DVExfUE9MTF9USU1FUl9TRUMgNjAKLQotc3RhdGljIGludCB3c2E4ODF4X29jcF9wb2xsX3RpbWVyX3NlYyA9IFdTQTg4MVhfT0NQX0NUTF9QT0xMX1RJTUVSX1NFQzsKLW1vZHVsZV9wYXJhbSh3c2E4ODF4X29jcF9wb2xsX3RpbWVyX3NlYywgaW50LCAwNjY0KTsKLU1PRFVMRV9QQVJNX0RFU0Mod3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMsICJ0aW1lciBmb3Igb2NwIGN0bCBwb2xsaW5nIik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgd3NhODgxeF9wcml2ICpkYmd3c2E4ODF4Owotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfd3NhODgxeF9kZW50Owotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGVlazsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX3Bva2U7Ci1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19yZWdfZHVtcDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9kYXRhOwotc3RhdGljIHVuc2lnbmVkIGludCBkZXZudW07Ci0KLXN0YXRpYyBpbnQzMl90IHdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCQlib29sIGVuYWJsZSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgd3NhX3BhX2dhaW5fdGV4dFtdID0gewotCSJHXzE4X0RCIiwgIkdfMTZQNV9EQiIsICJHXzE1X0RCIiwgIkdfMTNQNV9EQiIsICJHXzEyX0RCIiwgIkdfMTBQNV9EQiIsCi0JIkdfOV9EQiIsICJHXzdQNV9EQiIsICJHXzZfREIiLCAiR180UDVfREIiLCAiR18zX0RCIiwgIkdfMVA1X0RCIiwKLQkiR18wX0RCIgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB3c2FfcGFfZ2Fpbl9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUod3NhX3BhX2dhaW5fdGV4dCksIHdzYV9wYV9nYWluX3RleHQpOwotCi1zdGF0aWMgaW50IHdzYV9wYV9nYWluX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd3NhODgxeC0+cGFfZ2FpbjsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBQQSBnYWluID0gMHgleFxuIiwgX19mdW5jX18sIHdzYTg4MXgtPnBhX2dhaW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhX3BhX2dhaW5fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICA9ICVsZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXdzYTg4MXgtPnBhX2dhaW4gPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X2dldF9tdXRlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3c2E4ODF4LT5wYV9tdXRlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zZXRfbXV0ZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogbXV0ZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCi0JCV9fZnVuY19fLCB3c2E4ODF4LT5wYV9tdXRlLCB2YWx1ZSk7Ci0KLQlpZiAodmFsdWUpCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfRU4sIDB4ODAsIDB4MDApOwotCXdzYTg4MXgtPnBhX211dGUgPSB2YWx1ZTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3c2Ffc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJXU0EgUEEgR2FpbiIsIHdzYV9wYV9nYWluX2VudW0sCi0JCSAgICAgd3NhX3BhX2dhaW5fZ2V0LCB3c2FfcGFfZ2Fpbl9wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJXU0EgUEEgTXV0ZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKLQkJd3NhODgxeF9nZXRfbXV0ZSwgd3NhODgxeF9zZXRfbXV0ZSksCi19OwotCi1zdGF0aWMgaW50IGNvZGVjX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfcGFyYW1ldGVycyhjaGFyICpidWYsIHUzMiAqcGFyYW0xLCBpbnQgbnVtX29mX3BhcikKLXsKLQljaGFyICp0b2tlbjsKLQlpbnQgYmFzZSwgY250OwotCi0JdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IG51bV9vZl9wYXI7IGNudCsrKSB7Ci0JCWlmICh0b2tlbikgewotCQkJaWYgKCh0b2tlblsxXSA9PSAneCcpIHx8ICh0b2tlblsxXSA9PSAnWCcpKQotCQkJCWJhc2UgPSAxNjsKLQkJCWVsc2UKLQkJCQliYXNlID0gMTA7Ci0KLQkJCWlmIChrc3RydG91MzIodG9rZW4sIGJhc2UsICZwYXJhbTFbY250XSkgIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdzYTg4MXhfY29kZWNfdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCi0JCQkgICAgICAgdm9pZCAqZmlsZV9wcml2YXRlX2RhdGEsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4OwotCWNoYXIgYnVmZmVyW1dTQTg4MVhfVkVSU0lPTl9FTlRSWV9TSVpFXTsKLQlpbnQgbGVuOwotCi0Jd3NhODgxeCA9IChzdHJ1Y3Qgd3NhODgxeF9wcml2ICopIGVudHJ5LT5wcml2YXRlX2RhdGE7Ci0JaWYgKCF3c2E4ODF4KSB7Ci0JCXByX2VycigiJXM6IHdzYTg4MXggcHJpdiBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJXU0E4ODFYLVNPVU5EV0lSRV8yXzBcbiIpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZwb3MsIGJ1ZmZlciwgbGVuKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeV9vcHMgd3NhODgxeF9jb2RlY19pbmZvX29wcyA9IHsKLQkucmVhZCA9IHdzYTg4MXhfY29kZWNfdmVyc2lvbl9yZWFkLAotfTsKLQotLyoKLSAqIHdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkgLSBjcmVhdGVzIHdzYTg4MXggbW9kdWxlCi0gKiBAY29kZWNfcm9vdDogVGhlIHBhcmVudCBkaXJlY3RvcnkKLSAqIEBjb2RlYzogQ29kZWMgaW5zdGFuY2UKLSAqCi0gKiBDcmVhdGVzIHdzYTg4MXggbW9kdWxlIGFuZCB2ZXJzaW9uIGVudHJ5IHVuZGVyIHRoZSBnaXZlbgotICogcGFyZW50IGRpcmVjdG9yeS4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludCB3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJICBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICp2ZXJzaW9uX2VudHJ5OwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQljaGFyIG5hbWVbODBdOwotCi0JaWYgKCFjb2RlY19yb290IHx8ICFjb2RlYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy4leCIsICJ3c2E4ODF4IiwKLQkJICh1MzIpd3NhODgxeC0+c3dyX3NsYXZlLT5hZGRyKTsKLQotCXdzYTg4MXgtPmVudHJ5ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjb2RlY19yb290LT5tb2R1bGUsCi0JCQkJCQkoY29uc3QgY2hhciAqKW5hbWUsCi0JCQkJCQljb2RlY19yb290KTsKLQlpZiAoIXdzYTg4MXgtPmVudHJ5KSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHdzYTg4MXggZW50cnlcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXZlcnNpb25fZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLT5zbmRfY2FyZCwKLQkJCQkJCSAgICJ2ZXJzaW9uIiwKLQkJCQkJCSAgIHdzYTg4MXgtPmVudHJ5KTsKLQlpZiAoIXZlcnNpb25fZW50cnkpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgd3NhODgxeCB2ZXJzaW9uIGVudHJ5XG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2ZXJzaW9uX2VudHJ5LT5wcml2YXRlX2RhdGEgPSB3c2E4ODF4OwotCXZlcnNpb25fZW50cnktPnNpemUgPSBXU0E4ODFYX1ZFUlNJT05fRU5UUllfU0laRTsKLQl2ZXJzaW9uX2VudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7Ci0JdmVyc2lvbl9lbnRyeS0+Yy5vcHMgPSAmd3NhODgxeF9jb2RlY19pbmZvX29wczsKLQotCWlmIChzbmRfaW5mb19yZWdpc3Rlcih2ZXJzaW9uX2VudHJ5KSA8IDApIHsKLQkJc25kX2luZm9fZnJlZV9lbnRyeSh2ZXJzaW9uX2VudHJ5KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXdzYTg4MXgtPnZlcnNpb25fZW50cnkgPSB2ZXJzaW9uX2VudHJ5OwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkpOwotCi1zdGF0aWMgYm9vbCBpc19zd3Jfc2x2X3JlZ19yZWFkYWJsZShpbnQgcmVnKQotewotCWJvb2wgcmV0ID0gdHJ1ZTsKLQotCWlmICgoKHJlZyA+IDB4NDYpICYmIChyZWcgPCAweDRBKSkgfHwKLQkgICAgKChyZWcgPiAweDRBKSAmJiAocmVnIDwgMHg1MCkpIHx8Ci0JICAgICgocmVnID4gMHg1NSkgJiYgKHJlZyA8IDB4RTApKSB8fAotCSAgICAoKHJlZyA+IDB4RTApICYmIChyZWcgPCAweEYwKSkgfHwKLQkgICAgKChyZWcgPiAweEYwKSAmJiAocmVnIDwgMHgxMDApKSB8fAotCSAgICAoKHJlZyA+IDB4MTA1KSAmJiAocmVnIDwgMHgxMjApKSB8fAotCSAgICAoKHJlZyA+IDB4MTI4KSAmJiAocmVnIDwgMHgxMzApKSB8fAotCSAgICAoKHJlZyA+IDB4MTM4KSAmJiAocmVnIDwgMHgyMDApKSB8fAotCSAgICAoKHJlZyA+IDB4MjA1KSAmJiAocmVnIDwgMHgyMjApKSB8fAotCSAgICAoKHJlZyA+IDB4MjI4KSAmJiAocmVnIDwgMHgyMzApKSB8fAotCSAgICAoKHJlZyA+IDB4MjM4KSAmJiAocmVnIDwgMHgzMDApKSB8fAotCSAgICAoKHJlZyA+IDB4MzA1KSAmJiAocmVnIDwgMHgzMjApKSB8fAotCSAgICAoKHJlZyA+IDB4MzI4KSAmJiAocmVnIDwgMHgzMzApKSB8fAotCSAgICAoKHJlZyA+IDB4MzM4KSAmJiAocmVnIDwgMHg0MDApKSB8fAotCSAgICAoKHJlZyA+IDB4NDA1KSAmJiAocmVnIDwgMHg0MjApKSkKLQkJcmV0ID0gZmFsc2U7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCB3c2E4ODF4X3N3cnNsYXZlX3JlZ19zaG93KGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY291bnQsCi0JCQkJCSAgbG9mZl90ICpwcG9zKQotewotCWludCBpLCByZWdfdmFsLCBsZW47Ci0Jc3NpemVfdCB0b3RhbCA9IDA7Ci0JY2hhciB0bXBfYnVmW1NXUl9TTFZfTUFYX0JVRl9MRU5dOwotCi0JaWYgKCF1YnVmIHx8ICFwcG9zIHx8IChkZXZudW0gPT0gMCkpCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gKCgoaW50KSAqcHBvcyAvIEJZVEVTX1BFUl9MSU5FKSArIFNXUl9TTFZfU1RBUlRfUkVHX0FERFIpOwotCQlpIDw9IFNXUl9TTFZfTUFYX1JFR19BRERSOyBpKyspIHsKLQkJaWYgKCFpc19zd3Jfc2x2X3JlZ19yZWFkYWJsZShpKSkKLQkJCWNvbnRpbnVlOwotCQlzd3JfcmVhZChkYmd3c2E4ODF4LT5zd3Jfc2xhdmUsIGRldm51bSwKLQkJCWksICZyZWdfdmFsLCAxKTsKLQkJbGVuID0gc25wcmludGYodG1wX2J1ZiwgMjUsICIweCUuM3g6IDB4JS4yeFxuIiwgaSwKLQkJCSAgICAgICAocmVnX3ZhbCAmIDB4RkYpKTsKLQkJaWYgKCh0b3RhbCArIGxlbikgPj0gY291bnQgLSAxKQotCQkJYnJlYWs7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVidWYgKyB0b3RhbCksIHRtcF9idWYsIGxlbikpIHsKLQkJCXByX2VycigiJXM6IGZhaWwgdG8gY29weSByZWcgZHVtcFxuIiwgX19mdW5jX18pOwotCQkJdG90YWwgPSAtRUZBVUxUOwotCQkJZ290byBjb3B5X2VycjsKLQkJfQotCQkqcHBvcyArPSBsZW47Ci0JCXRvdGFsICs9IGxlbjsKLQl9Ci0KLWNvcHlfZXJyOgotCXJldHVybiB0b3RhbDsKLX0KLQotc3RhdGljIHNzaXplX3QgY29kZWNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBsYnVmW1NXUl9TTFZfUkRfQlVGX0xFTl07Ci0JY2hhciAqYWNjZXNzX3N0cjsKLQlzc2l6ZV90IHJldF9jbnQ7Ci0KLQlpZiAoIWNvdW50IHx8ICFmaWxlIHx8ICFwcG9zIHx8ICF1YnVmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFjY2Vzc19zdHIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCpwcG9zIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcGVlayIpKSB7Ci0JCXNucHJpbnRmKGxidWYsIHNpemVvZihsYnVmKSwgIjB4JXhcbiIsIChyZWFkX2RhdGEgJiAweEZGKSk7Ci0JCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgbGJ1ZiwKLQkJCQkJICAgICAgIHN0cm5sZW4obGJ1ZiwgNykpOwotCX0gZWxzZSBpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcmVnX2R1bXAiKSkgewotCQlyZXRfY250ID0gd3NhODgxeF9zd3JzbGF2ZV9yZWdfc2hvdyh1YnVmLCBjb3VudCwgcHBvcyk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogJXMgbm90IHBlcm1pdHRlZCB0byByZWFkXG4iLCBfX2Z1bmNfXywgYWNjZXNzX3N0cik7Ci0JCXJldF9jbnQgPSAtRVBFUk07Ci0JfQotCXJldHVybiByZXRfY250OwotfQotCi1zdGF0aWMgc3NpemVfdCBjb2RlY19kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKLQljb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgbGJ1ZltTV1JfU0xWX1dSX0JVRl9MRU5dOwotCWludCByYzsKLQl1MzIgcGFyYW1bNV07Ci0JY2hhciAqYWNjZXNzX3N0cjsKLQotCWlmICghZmlscCB8fCAhcHBvcyB8fCAhdWJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhY2Nlc3Nfc3RyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWlmIChjbnQgPiBzaXplb2YobGJ1ZikgLSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJjID0gY29weV9mcm9tX3VzZXIobGJ1ZiwgdWJ1ZiwgY250KTsKLQlpZiAocmMpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JbGJ1ZltjbnRdID0gJ1wwJzsKLQlpZiAoIXN0cmNtcChhY2Nlc3Nfc3RyLCAic3dyc2xhdmVfcG9rZSIpKSB7Ci0JCS8qIHdyaXRlICovCi0JCXJjID0gZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDMpOwotCQlpZiAoKHBhcmFtWzBdIDw9IFNXUl9TTFZfTUFYX1JFR19BRERSKSAmJiAocGFyYW1bMV0gPD0gMHhGRikgJiYKLQkJCShyYyA9PSAwKSkKLQkJCXN3cl93cml0ZShkYmd3c2E4ODF4LT5zd3Jfc2xhdmUsIHBhcmFtWzJdLAotCQkJCXBhcmFtWzBdLCAmcGFyYW1bMV0pOwotCQllbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfSBlbHNlIGlmICghc3RyY21wKGFjY2Vzc19zdHIsICJzd3JzbGF2ZV9wZWVrIikpIHsKLQkJLyogcmVhZCAqLwotCQlyYyA9IGdldF9wYXJhbWV0ZXJzKGxidWYsIHBhcmFtLCAyKTsKLQkJaWYgKChwYXJhbVswXSA8PSBTV1JfU0xWX01BWF9SRUdfQUREUikgJiYgKHJjID09IDApKQotCQkJc3dyX3JlYWQoZGJnd3NhODgxeC0+c3dyX3NsYXZlLCBwYXJhbVsxXSwKLQkJCQlwYXJhbVswXSwgJnJlYWRfZGF0YSwgMSk7Ci0JCWVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNjZXNzX3N0ciwgInN3cnNsYXZlX3JlZ19kdW1wIikpIHsKLQkJLyogcmVnIGR1bXAgKi8KLQkJcmMgPSBnZXRfcGFyYW1ldGVycyhsYnVmLCBwYXJhbSwgMSk7Ci0JCWlmICgocmMgPT0gMCkgJiYgKHBhcmFtWzBdID4gMCkgJiYKLQkJICAgIChwYXJhbVswXSA8PSBTV1JfU0xWX01BWF9ERVZJQ0VTKSkKLQkJCWRldm51bSA9IHBhcmFtWzBdOwotCQllbHNlCi0JCQlyYyA9IC1FSU5WQUw7Ci0JfQotCWlmIChyYyA9PSAwKQotCQlyYyA9IGNudDsKLQllbHNlCi0JCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGVjX2RlYnVnX29wcyA9IHsKLQkub3BlbiA9IGNvZGVjX2RlYnVnX29wZW4sCi0JLndyaXRlID0gY29kZWNfZGVidWdfd3JpdGUsCi0JLnJlYWQgPSBjb2RlY19kZWJ1Z19yZWFkLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd3NhODgxeF9wcmVfcG11X3BhW10gPSB7Ci0Je1dTQTg4MVhfU1BLUl9EUlZfR0FJTiwgMHg0MSwgMH0sCi0Je1dTQTg4MVhfU1BLUl9NSVNDX0NUTDEsIDB4MDEsIDB9LAotCXtXU0E4ODFYX0FEQ19FTl9ERVRfVEVTVF9JLCAweDAxLCAwfSwKLQl7V1NBODgxWF9BRENfRU5fTU9EVV9WLCAweDAyLCAwfSwKLQl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViwgMHgxMCwgMH0sCi0Je1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHLCAweEEwLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdzYTg4MXhfcHJlX3BtdV9wYV8yXzBbXSA9IHsKLQl7V1NBODgxWF9TUEtSX0RSVl9HQUlOLCAweDQxLCAwfSwKLQl7V1NBODgxWF9TUEtSX01JU0NfQ1RMMSwgMHg4NywgMH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSB3c2E4ODF4X3Bvc3RfcG11X3BhW10gPSB7Ci0Je1dTQTg4MVhfU1BLUl9QV1JTVEdfREJHLCAweDAwLCAwfSwKLQl7V1NBODgxWF9BRENfRU5fREVUX1RFU1RfViwgMHgwMCwgMH0sCi0Je1dTQTg4MVhfQURDX0VOX01PRFVfViwgMHgwMCwgMH0sCi0Je1dTQTg4MVhfQURDX0VOX0RFVF9URVNUX0ksIDB4MDAsIDB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfc2VxdWVuY2Ugd3NhODgxeF92aV90eGZlX2VuW10gPSB7Ci0Je1dTQTg4MVhfU1BLUl9QUk9UX0ZFX1ZTRU5TRV9WQ00sIDB4ODUsIDB9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9BVEVTVDIsIDB4MEEsIDB9LAotCXtXU0E4ODFYX1NQS1JfUFJPVF9GRV9HQUlOLCAweENGLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHdzYTg4MXhfdmlfdHhmZV9lbl8yXzBbXSA9IHsKLQl7V1NBODgxWF9TUEtSX1BST1RfRkVfVlNFTlNFX1ZDTSwgMHg4NSwgMH0sCi0Je1dTQTg4MVhfU1BLUl9QUk9UX0FURVNUMiwgMHgwQSwgMH0sCi0Je1dTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sIDB4NDcsIDB9LAotfTsKLQotc3RhdGljIGludCB3c2E4ODF4X2Jvb3N0X2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKLXsKLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKLQlpZiAoZW5hYmxlKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHg4MCwgMHg4MCk7Ci0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0VOX0NUTCwgMHg4MCwgMHgwMCk7Ci0JLyoKLQkgKiAxLjVtcyBzbGVlcCBpcyBuZWVkZWQgYWZ0ZXIgYm9vc3QgZW5hYmxlL2Rpc2FibGUgYXMgcGVyCi0JICogSFcgcmVxdWlyZW1lbnQKLQkgKi8KLQl1c2xlZXBfcmFuZ2UoMTUwMCwgMTUxMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF92aXNlbnNlX3R4ZmVfY3RybChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgZW5hYmxlLAotCQkJCSAgICAgdTggaXNlbnNlMV9nYWluLCB1OCBpc2Vuc2UyX2dhaW4sCi0JCQkJICAgICB1OCB2c2Vuc2VfZ2FpbikKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsCi0JCSIlczogZW5hYmxlOiVkLCBpc2Vuc2UxIGdhaW46ICVkLCBpc2Vuc2UyIGdhaW46ICVkLCB2c2Vuc2VfZ2FpbiAlZFxuIiwKLQkJX19mdW5jX18sIGVuYWJsZSwgaXNlbnNlMV9nYWluLCBpc2Vuc2UyX2dhaW4sIHZzZW5zZV9nYWluKTsKLQotCWlmIChlbmFibGUpIHsKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZSh3c2E4ODF4LT5yZWdtYXAsCi0JCQkJd3NhODgxeF92aV90eGZlX2VuXzJfMCwKLQkJCQlBUlJBWV9TSVpFKHdzYTg4MXhfdmlfdHhmZV9lbl8yXzApKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfUFJPVF9GRV9WU0VOU0VfVkNNLAotCQkJCSAgICAweDA4LCAweDA4KTsKLQkJLyoKLQkJICogMjAwdXMgc2xlZXAgaXMgbmVlZGVkIGFmdGVyIHZpc2Vuc2UgdHhmZSBkaXNhYmxlIGFzIHBlcgotCQkgKiBIVyByZXF1aXJlbWVudC4KLQkJICovCi0JCXVzbGVlcF9yYW5nZSgyMDAsIDIxMCk7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QUk9UX0ZFX0dBSU4sCi0JCQkJICAgIDB4MDEsIDB4MDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3Zpc2Vuc2VfYWRjX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKLXsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBlbmFibGU6JWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX01PRFVfViwgKDB4MDEgPDwgNyksCi0JCQkgICAgKGVuYWJsZSA8PCA3KSk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9BRENfRU5fTU9EVV9JLCAoMHgwMSA8PCA3KSwKLQkJCSAgICAoZW5hYmxlIDw8IDcpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd3NhODgxeF9iYW5kZ2FwX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkLCBiZ19jb3VudDolZFxuIiwgX19mdW5jX18sCi0JCWVuYWJsZSwgd3NhODgxeC0+YmdfY250KTsKLQltdXRleF9sb2NrKCZ3c2E4ODF4LT5iZ19sb2NrKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCSsrd3NhODgxeC0+YmdfY250OwotCQlpZiAod3NhODgxeC0+YmdfY250ID09IDEpIHsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwKLQkJCQkJICAgIDB4MDgsIDB4MDgpOwotCQkJLyogNDAwdXNlYyBzbGVlcCBpcyBuZWVkZWQgYXMgcGVyIEhXIHJlcXVpcmVtZW50ICovCi0JCQl1c2xlZXBfcmFuZ2UoNDAwLCA0MTApOwotCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9URU1QX09QLAotCQkJCQkgICAgMHgwNCwgMHgwNCk7Ci0JCX0KLQl9IGVsc2UgewotCQktLXdzYTg4MXgtPmJnX2NudDsKLQkJaWYgKHdzYTg4MXgtPmJnX2NudCA8PSAwKSB7Ci0JCQlXQVJOX09OKHdzYTg4MXgtPmJnX2NudCA8IDApOwotCQkJd3NhODgxeC0+YmdfY250ID0gMDsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEVNUF9PUCwgMHgwNCwgMHgwMCk7Ci0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1RFTVBfT1AsIDB4MDgsIDB4MDApOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmd3NhODgxeC0+YmdfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdzYTg4MXhfY2xrX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW5hYmxlOiVkLCBjbGtfY291bnQ6JWRcbiIsIF9fZnVuY19fLAotCQllbmFibGUsIHdzYTg4MXgtPmNsa19jbnQpOwotCW11dGV4X2xvY2soJndzYTg4MXgtPnJlc19sb2NrKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCSsrd3NhODgxeC0+Y2xrX2NudDsKLQkJaWYgKHdzYTg4MXgtPmNsa19jbnQgPT0gMSkgewotCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDEpOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLS13c2E4ODF4LT5jbGtfY250OwotCQlpZiAod3NhODgxeC0+Y2xrX2NudCA8PSAwKSB7Ci0JCQlXQVJOX09OKHdzYTg4MXgtPmNsa19jbnQgPCAwKTsKLQkJCXdzYTg4MXgtPmNsa19jbnQgPSAwOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfRElHX0NMS19DVEwsIDB4MDApOwotCQkJc25kX3NvY193cml0ZShjb2RlYywgV1NBODgxWF9DRENfQU5BX0NMS19DVEwsIDB4MDApOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmd3NhODgxeC0+cmVzX2xvY2spOwotfQotCi1zdGF0aWMgaW50IHdzYTg4MXhfZ2V0X2NvbXBhbmRlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd3NhODgxeC0+Y29tcF9lbmFibGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zZXRfY29tcGFuZGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBDb21wYW5kZXIgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKLQkJIF9fZnVuY19fLCB3c2E4ODF4LT5jb21wX2VuYWJsZSwgdmFsdWUpOwotCXdzYTg4MXgtPmNvbXBfZW5hYmxlID0gdmFsdWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9nZXRfYm9vc3Qoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0KLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdzYTg4MXgtPmJvb3N0X2VuYWJsZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3NldF9ib29zdChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogQm9vc3QgZW5hYmxlIGN1cnJlbnQgJWQsIG5ldyAlZFxuIiwKLQkJIF9fZnVuY19fLCB3c2E4ODF4LT5ib29zdF9lbmFibGUsIHZhbHVlKTsKLQl3c2E4ODF4LT5ib29zdF9lbmFibGUgPSB2YWx1ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X2dldF92aXNlbnNlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3c2E4ODF4LT52aXNlbnNlX2VuYWJsZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3NldF92aXNlbnNlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBWSXNlbnNlIGVuYWJsZSBjdXJyZW50ICVkLCBuZXcgJWRcbiIsCi0JCSBfX2Z1bmNfXywgd3NhODgxeC0+dmlzZW5zZV9lbmFibGUsIHZhbHVlKTsKLQl3c2E4ODF4LT52aXNlbnNlX2VuYWJsZSA9IHZhbHVlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd3NhODgxeF9zbmRfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ09NUCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCi0JCXdzYTg4MXhfZ2V0X2NvbXBhbmRlciwgd3NhODgxeF9zZXRfY29tcGFuZGVyKSwKLQotCVNPQ19TSU5HTEVfRVhUKCJCT09TVCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCi0JCXdzYTg4MXhfZ2V0X2Jvb3N0LCB3c2E4ODF4X3NldF9ib29zdCksCi0KLQlTT0NfU0lOR0xFX0VYVCgiVklTRU5TRSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCi0JCXdzYTg4MXhfZ2V0X3Zpc2Vuc2UsIHdzYTg4MXhfc2V0X3Zpc2Vuc2UpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN3cl9kYWNfcG9ydFtdID0gewotCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwKQotfTsKLQotc3RhdGljIGludCB3c2E4ODF4X3NldF9wb3J0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IHBvcnRfaWR4LAotCQkJdTggKnBvcnRfaWQsIHU4ICpudW1fY2gsIHU4ICpjaF9tYXNrLCB1MzIgKmNoX3JhdGUpCi17Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JKnBvcnRfaWQgPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5wb3J0X2lkOwotCSpudW1fY2ggPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5udW1fY2g7Ci0JKmNoX21hc2sgPSB3c2E4ODF4LT5wb3J0W3BvcnRfaWR4XS5jaF9tYXNrOwotCSpjaF9yYXRlID0gd3NhODgxeC0+cG9ydFtwb3J0X2lkeF0uY2hfcmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X2VuYWJsZV9zd3JfZGFjX3BvcnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXU4IHBvcnRfaWRbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKLQl1OCBudW1fY2hbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKLQl1OCBjaF9tYXNrW1dTQTg4MVhfTUFYX1NXUl9QT1JUU107Ci0JdTMyIGNoX3JhdGVbV1NBODgxWF9NQVhfU1dSX1BPUlRTXTsKLQl1OCBudW1fcG9ydCA9IDA7Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZXZlbnQgJWQgbmFtZSAlc1xuIiwgX19mdW5jX18sCi0JCWV2ZW50LCB3LT5uYW1lKTsKLQlpZiAod3NhODgxeCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQl3c2E4ODF4X3NldF9wb3J0KGNvZGVjLCBTV1JfREFDX1BPUlQsCi0JCQkJJnBvcnRfaWRbbnVtX3BvcnRdLCAmbnVtX2NoW251bV9wb3J0XSwKLQkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7Ci0JCSsrbnVtX3BvcnQ7Ci0KLQkJaWYgKHdzYTg4MXgtPmNvbXBfZW5hYmxlKSB7Ci0JCQl3c2E4ODF4X3NldF9wb3J0KGNvZGVjLCBTV1JfQ09NUF9QT1JULAotCQkJCQkmcG9ydF9pZFtudW1fcG9ydF0sICZudW1fY2hbbnVtX3BvcnRdLAotCQkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7Ci0JCQkrK251bV9wb3J0OwotCQl9Ci0JCWlmICh3c2E4ODF4LT5ib29zdF9lbmFibGUpIHsKLQkJCXdzYTg4MXhfc2V0X3BvcnQoY29kZWMsIFNXUl9CT09TVF9QT1JULAotCQkJCQkmcG9ydF9pZFtudW1fcG9ydF0sICZudW1fY2hbbnVtX3BvcnRdLAotCQkJCQkmY2hfbWFza1tudW1fcG9ydF0sICZjaF9yYXRlW251bV9wb3J0XSk7Ci0JCQkrK251bV9wb3J0OwotCQl9Ci0JCWlmICh3c2E4ODF4LT52aXNlbnNlX2VuYWJsZSkgewotCQkJd3NhODgxeF9zZXRfcG9ydChjb2RlYywgU1dSX1ZJU0VOU0VfUE9SVCwKLQkJCQkJJnBvcnRfaWRbbnVtX3BvcnRdLCAmbnVtX2NoW251bV9wb3J0XSwKLQkJCQkJJmNoX21hc2tbbnVtX3BvcnRdLCAmY2hfcmF0ZVtudW1fcG9ydF0pOwotCQkJKytudW1fcG9ydDsKLQkJfQotCQlzd3JfY29ubmVjdF9wb3J0KHdzYTg4MXgtPnN3cl9zbGF2ZSwgJnBvcnRfaWRbMF0sIG51bV9wb3J0LAotCQkJCSZjaF9tYXNrWzBdLCAmY2hfcmF0ZVswXSwgJm51bV9jaFswXSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJcG9ydF9pZFtudW1fcG9ydF0gPSB3c2E4ODF4LT5wb3J0W1NXUl9EQUNfUE9SVF0ucG9ydF9pZDsKLQkJKytudW1fcG9ydDsKLQkJaWYgKHdzYTg4MXgtPmNvbXBfZW5hYmxlKSB7Ci0JCQlwb3J0X2lkW251bV9wb3J0XSA9Ci0JCQkJd3NhODgxeC0+cG9ydFtTV1JfQ09NUF9QT1JUXS5wb3J0X2lkOwotCQkJKytudW1fcG9ydDsKLQkJfQotCQlpZiAod3NhODgxeC0+Ym9vc3RfZW5hYmxlKSB7Ci0JCQlwb3J0X2lkW251bV9wb3J0XSA9Ci0JCQkJd3NhODgxeC0+cG9ydFtTV1JfQk9PU1RfUE9SVF0ucG9ydF9pZDsKLQkJCSsrbnVtX3BvcnQ7Ci0JCX0KLQkJaWYgKHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlKSB7Ci0JCQlwb3J0X2lkW251bV9wb3J0XSA9Ci0JCQkJd3NhODgxeC0+cG9ydFtTV1JfVklTRU5TRV9QT1JUXS5wb3J0X2lkOwotCQkJKytudW1fcG9ydDsKLQkJfQotCQlzd3JfZGlzY29ubmVjdF9wb3J0KHdzYTg4MXgtPnN3cl9zbGF2ZSwgJnBvcnRfaWRbMF0sIG51bV9wb3J0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdzYTg4MXhfcmRhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQotCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiAlcyAlZCBib29zdCAlZCB2aXNlbnNlICVkXG4iLCBfX2Z1bmNfXywKLQkJdy0+bmFtZSwgZXZlbnQsCXdzYTg4MXgtPmJvb3N0X2VuYWJsZSwKLQkJd3NhODgxeC0+dmlzZW5zZV9lbmFibGUpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShjb2RlYywgRU5BQkxFKTsKLQkJd3NhODgxeF9ib29zdF9jdHJsKGNvZGVjLCBFTkFCTEUpOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJc3dyX3NsdmRldl9kYXRhcGF0aF9jb250cm9sKHdzYTg4MXgtPnN3cl9zbGF2ZSwKLQkJCQkJICAgIHdzYTg4MXgtPnN3cl9zbGF2ZS0+ZGV2X251bSwKLQkJCQkJICAgIGZhbHNlKTsKLQkJd3NhODgxeF9ib29zdF9jdHJsKGNvZGVjLCBESVNBQkxFKTsKLQkJd3NhODgxeF9yZXNvdXJjZV9hY3F1aXJlKGNvZGVjLCBESVNBQkxFKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdzYTg4MXhfcmFtcF9wYV9nYWluKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQlpbnQgbWluX2dhaW4sIGludCBtYXhfZ2FpbiwgaW50IHVkZWxheSkKLXsKLQlpbnQgdmFsOwotCi0JZm9yICh2YWwgPSBtaW5fZ2FpbjsgbWF4X2dhaW4gPD0gdmFsOyB2YWwtLSkgewotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0dBSU4sCi0JCQkJICAgIDB4RjAsIHZhbCA8PCA0KTsKLQkJLyoKLQkJICogMW1zIGRlbGF5IGlzIG5lZWRlZCBmb3IgZXZlcnkgc3RlcCBjaGFuZ2UgaW4gZ2FpbiBhcyBwZXIKLQkJICogSFcgcmVxdWlyZW1lbnQuCi0JCSAqLwotCQl1c2xlZXBfcmFuZ2UodWRlbGF5LCB1ZGVsYXkrMTApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd3NhODgxeF9vY3BfY3RsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCWludCB0ZW1wX3ZhbDsKLQotCWR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOwotCXdzYTg4MXggPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB3c2E4ODF4X3ByaXYsIG9jcF9jdGxfd29yayk7Ci0KLQljb2RlYyA9IHdzYTg4MXgtPmNvZGVjOwotCXdzYTg4MXhfZ2V0X3RlbXAod3NhODgxeC0+dHpfcGRhdGEudHpfZGV2LCAmdGVtcF92YWwpOwotCWRldl9kYmcoY29kZWMtPmRldiwgIiB0ZW1wID0gJWRcbiIsIHRlbXBfdmFsKTsKLQotCWlmICh0ZW1wX3ZhbCA8PSBXU0E4ODFYX09DUF9DVExfVEVNUF9DRUxTSVVTKQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhDMCwgMHgwMCk7Ci0JZWxzZQotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfT0NQX0NUTCwgMHhDMCwgMHhDMCk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndzYTg4MXgtPm9jcF9jdGxfd29yaywKLQkJCW1zZWNzX3RvX2ppZmZpZXMod3NhODgxeF9vY3BfcG9sbF90aW1lcl9zZWMgKiAxMDAwKSk7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zcGtyX3BhX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBtaW5fZ2FpbiwgbWF4X2dhaW47Ci0KLQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogJXMgJWRcbiIsIF9fZnVuY19fLCB3LT5uYW1lLCBldmVudCk7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweEMwLCAweDgwKTsKLQkJcmVnbWFwX211bHRpX3JlZ193cml0ZSh3c2E4ODF4LT5yZWdtYXAsCi0JCQkJd3NhODgxeF9wcmVfcG11X3BhXzJfMCwKLQkJCQlBUlJBWV9TSVpFKHdzYTg4MXhfcHJlX3BtdV9wYV8yXzApKTsKLQkJc3dyX3NsdmRldl9kYXRhcGF0aF9jb250cm9sKHdzYTg4MXgtPnN3cl9zbGF2ZSwKLQkJCQkJICAgIHdzYTg4MXgtPnN3cl9zbGF2ZS0+ZGV2X251bSwKLQkJCQkJICAgIHRydWUpOwotCQkvKiBTZXQgcmVnaXN0ZXIgbW9kZSBpZiBjb21wYW5kZXIgaXMgbm90IGVuYWJsZWQgKi8KLQkJaWYgKCF3c2E4ODF4LT5jb21wX2VuYWJsZSkKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9EUlZfR0FJTiwKLQkJCQkJICAgIDB4MDgsIDB4MDgpOwotCQllbHNlCi0JCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0dBSU4sCi0JCQkJCSAgICAweDA4LCAweDAwKTsKLQotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKLQkJaWYgKCF3c2E4ODF4LT5jb21wX2VuYWJsZSkgewotCQkJbWF4X2dhaW4gPSB3c2E4ODF4LT5wYV9nYWluOwotCQkJLyoKLQkJCSAqIEdhaW4gaGFzIHRvIHNldCBpbmNyZW1lbnRhbGx5IGluIDQgc3RlcHMKLQkJCSAqIGFzIHBlciBIVyBzZXF1ZW5jZQotCQkJICovCi0JCQlpZiAobWF4X2dhaW4gPiBHXzRQNURCKQotCQkJCW1pbl9nYWluID0gR18wREI7Ci0JCQllbHNlCi0JCQkJbWluX2dhaW4gPSBtYXhfZ2FpbiArIDM7Ci0JCQkvKgotCQkJICogMW1zIGRlbGF5IGlzIG5lZWRlZCBiZWZvcmUgY2hhbmdlIGluIGdhaW4KLQkJCSAqIGFzIHBlciBIVyByZXF1aXJlbWVudC4KLQkJCSAqLwotCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMTApOwotCQkJd3NhODgxeF9yYW1wX3BhX2dhaW4oY29kZWMsIG1pbl9nYWluLCBtYXhfZ2FpbiwgMTAwMCk7Ci0JCX0KLQkJaWYgKHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlKSB7Ci0JCQl3c2E4ODF4X3Zpc2Vuc2VfdHhmZV9jdHJsKGNvZGVjLCBFTkFCTEUsCi0JCQkJCQkweDAwLCAweDAzLCAweDAxKTsKLQkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQURDX0VOX1NFTF9JQkFJUywKLQkJCQkJICAgIDB4MDcsIDB4MDEpOwotCQkJd3NhODgxeF92aXNlbnNlX2FkY19jdHJsKGNvZGVjLCBFTkFCTEUpOwotCQl9Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd3NhODgxeC0+b2NwX2N0bF93b3JrLAotCQkJbXNlY3NfdG9famlmZmllcyhXU0E4ODFYX09DUF9DVExfVElNRVJfU0VDICogMTAwMCkpOwotCQkvKiBGb3JjZSByZW1vdmUgZ3JvdXAgKi8KLQkJc3dyX3JlbW92ZV9mcm9tX2dyb3VwKHdzYTg4MXgtPnN3cl9zbGF2ZSwKLQkJCQkgICAgICB3c2E4ODF4LT5zd3Jfc2xhdmUtPmRldl9udW0pOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJaWYgKHdzYTg4MXgtPnZpc2Vuc2VfZW5hYmxlKSB7Ci0JCQl3c2E4ODF4X3Zpc2Vuc2VfYWRjX2N0cmwoY29kZWMsIERJU0FCTEUpOwotCQkJd3NhODgxeF92aXNlbnNlX3R4ZmVfY3RybChjb2RlYywgRElTQUJMRSwKLQkJCQkJCTB4MDAsIDB4MDEsIDB4MDEpOwotCQl9Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd3NhODgxeC0+b2NwX2N0bF93b3JrKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4QzAsIDB4QzApOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3c2E4ODF4X2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9JTlBVVCgiSU4iKSwKLQotCVNORF9TT0NfREFQTV9NSVhFUl9FKCJTV1IgREFDX1BvcnQiLCBTTkRfU09DX05PUE0sIDAsIDAsIHN3cl9kYWNfcG9ydCwKLQkJQVJSQVlfU0laRShzd3JfZGFjX3BvcnQpLCB3c2E4ODF4X2VuYWJsZV9zd3JfZGFjX3BvcnQsCi0JCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX0RBQ19FKCJSREFDIiwgTlVMTCwgV1NBODgxWF9TUEtSX0RBQ19DVEwsIDcsIDAsCi0JCXdzYTg4MXhfcmRhY19ldmVudCwKLQkJU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1BHQV9FKCJTUEtSIFBHQSIsIFdTQTg4MVhfU1BLUl9EUlZfRU4sIDcsIDAsIE5VTEwsIDAsCi0JCQl3c2E4ODF4X3Nwa3JfcGFfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKLQkJCVNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtSIiksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3c2E4ODF4X2F1ZGlvX21hcFtdID0gewotCXsiU1dSIERBQ19Qb3J0IiwgIlN3aXRjaCIsICJJTiJ9LAotCXsiUkRBQyIsIE5VTEwsICJTV1IgREFDX1BvcnQifSwKLQl7IlNQS1IgUEdBIiwgTlVMTCwgIlJEQUMifSwKLQl7IlNQS1IiLCBOVUxMLCAiU1BLUiBQR0EifSwKLX07Ci0KLWludCB3c2E4ODF4X3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHU4ICpwb3J0LCB1OCBudW1fcG9ydCwKLQkJCQl1bnNpZ25lZCBpbnQgKmNoX21hc2ssIHVuc2lnbmVkIGludCAqY2hfcmF0ZSkKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGk7Ci0KLQlpZiAoIXBvcnQgfHwgIWNoX21hc2sgfHwgIWNoX3JhdGUgfHwKLQkJKG51bV9wb3J0ID4gV1NBODgxWF9NQVhfU1dSX1BPUlRTKSkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcG9ydD0lcEssIGNoX21hc2s9JXBLLCBjaF9yYXRlPSVwS1xuIiwKLQkJCV9fZnVuY19fLCBwb3J0LCBjaF9tYXNrLCBjaF9yYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydDsgaSsrKSB7Ci0JCXdzYTg4MXgtPnBvcnRbaV0ucG9ydF9pZCA9IHBvcnRbaV07Ci0JCXdzYTg4MXgtPnBvcnRbaV0uY2hfbWFzayA9IGNoX21hc2tbaV07Ci0JCXdzYTg4MXgtPnBvcnRbaV0uY2hfcmF0ZSA9IGNoX3JhdGVbaV07Ci0JCXdzYTg4MXgtPnBvcnRbaV0ubnVtX2NoID0gX19zd19od2VpZ2h0OChjaF9tYXNrW2ldKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKTsKLQotc3RhdGljIHZvaWQgd3NhODgxeF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0KLQl3c2E4ODF4LT52ZXJzaW9uID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX0NISVBfSUQxKTsKLQl3c2E4ODF4X3JlZ21hcF9kZWZhdWx0cyh3c2E4ODF4LT5yZWdtYXAsIHdzYTg4MXgtPnZlcnNpb24pOwotCS8qIEJyaW5nIG91dCBvZiBhbmFsb2cgcmVzZXQgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0NEQ19SU1RfQ1RMLCAweDAyLCAweDAyKTsKLQkvKiBCcmluZyBvdXQgb2YgZGlnaXRhbCByZXNldCAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQ0RDX1JTVF9DVEwsIDB4MDEsIDB4MDEpOwotCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9DTE9DS19DT05GSUcsIDB4MTAsIDB4MTApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweDAyLCAweDAyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfTUlTQ19DVEwxLCAweEMwLCAweDgwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfTUlTQ19DVEwxLCAweDA2LCAweDA2KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfQklBU19JTlQsIDB4RkYsIDB4MDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QQV9JTlQsIDB4RjAsIDB4NDApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9QQV9JTlQsIDB4MEUsIDB4MEUpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfTE9PUF9TVEFCSUxJVFksCi0JCQkgICAgMHgwMywgMHgwMyk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9NSVNDMl9DVEwsIDB4RkYsIDB4MTQpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9PU1RfU1RBUlRfQ1RMLCAweDgwLCAweDgwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1NUQVJUX0NUTCwgMHgwMywgMHgwMCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9TTE9QRV9DT01QX0lTRU5TRV9GQiwKLQkJCSAgICAweDBDLCAweDA0KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX1NMT1BFX0NPTVBfSVNFTlNFX0ZCLAotCQkJICAgIDB4MDMsIDB4MDApOwotCWlmIChzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfT1RQX1JFR18wKSkKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMSwKLQkJCQkgICAgMHhGMCwgMHg3MCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9CT09TVF9QUkVTRVRfT1VUMiwKLQkJCSAgICAweEYwLCAweDMwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX1NQS1JfRFJWX0VOLCAweDA4LCAweDA4KTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPT1NUX0NVUlJFTlRfTElNSVQsCi0JCQkgICAgMHgwRiwgMHgwOCk7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9TUEtSX09DUF9DVEwsIDB4MzAsIDB4MzApOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfU1BLUl9PQ1BfQ1RMLCAweDBDLCAweDAwKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfMjgsIDB4M0YsIDB4M0EpOwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfQk9OR09fUkVTUlZfUkVHMSwKLQkJCSAgICAweEZGLCAweEIyKTsKLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXU0E4ODFYX0JPTkdPX1JFU1JWX1JFRzIsCi0JCQkgICAgMHhGRiwgMHgwNSk7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCQlib29sIGVuYWJsZSkKLXsKLQl3c2E4ODF4X2Nsa19jdHJsKGNvZGVjLCBlbmFibGUpOwotCXdzYTg4MXhfYmFuZGdhcF9jdHJsKGNvZGVjLCBlbmFibGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCB3c2E4ODF4X3RlbXBfcmVnX3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgICAgc3RydWN0IHdzYV90ZW1wX3JlZ2lzdGVyICp3c2FfdGVtcF9yZWcpCi17Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBzd3JfZGV2aWNlICpkZXY7Ci0JdTggcmV0cnkgPSBXU0E4ODFYX05VTV9SRVRSWTsKLQl1OCBkZXZudW0gPSAwOwotCi0JaWYgKCF3c2E4ODF4KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3c2E4ODF4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldiA9IHdzYTg4MXgtPnN3cl9zbGF2ZTsKLQlpZiAoZGV2ICYmICh3c2E4ODF4LT5zdGF0ZSA9PSBXU0E4ODFYX0RFVl9ET1dOKSkgewotCQl3aGlsZSAoc3dyX2dldF9sb2dpY2FsX2Rldl9udW0oZGV2LCBkZXYtPmFkZHIsICZkZXZudW0pICYmCi0JCSAgICAgICByZXRyeS0tKSB7Ci0JCQkvKiBSZXRyeSBhZnRlciAxIG1zZWMgZGVsYXkgKi8KLQkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQkJfQotCQlpZiAocmV0cnkgPT0gMCkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlcyBnZXQgZGV2bnVtICVkIGZvciBkZXYgYWRkciAlbHggZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCBkZXZudW0sIGRldi0+YWRkcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQltdXRleF9sb2NrKCZ3c2E4ODF4LT5yZXNfbG9jayk7Ci0JaWYgKCF3c2E4ODF4LT5jbGtfY250KSB7Ci0JCXJlZ2NhY2hlX21hcmtfZGlydHkod3NhODgxeC0+cmVnbWFwKTsKLQkJcmVnY2FjaGVfc3luYyh3c2E4ODF4LT5yZWdtYXApOwotCX0KLQltdXRleF91bmxvY2soJndzYTg4MXgtPnJlc19sb2NrKTsKLQotCXdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShjb2RlYywgRU5BQkxFKTsKLQotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdTQTg4MVhfVEFEQ19WQUxVRV9DVEwsIDB4MDEsIDB4MDApOwotCXdzYV90ZW1wX3JlZy0+ZG1lYXNfbXNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX1RFTVBfTVNCKTsKLQl3c2FfdGVtcF9yZWctPmRtZWFzX2xzYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9URU1QX0xTQik7Ci0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV1NBODgxWF9UQURDX1ZBTFVFX0NUTCwgMHgwMSwgMHgwMSk7Ci0Jd3NhX3RlbXBfcmVnLT5kMV9tc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfT1RQX1JFR18xKTsKLQl3c2FfdGVtcF9yZWctPmQxX2xzYiA9IHNuZF9zb2NfcmVhZChjb2RlYywgV1NBODgxWF9PVFBfUkVHXzIpOwotCXdzYV90ZW1wX3JlZy0+ZDJfbXNiID0gc25kX3NvY19yZWFkKGNvZGVjLCBXU0E4ODFYX09UUF9SRUdfMyk7Ci0Jd3NhX3RlbXBfcmVnLT5kMl9sc2IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdTQTg4MVhfT1RQX1JFR180KTsKLQotCXdzYTg4MXhfcmVzb3VyY2VfYWNxdWlyZShjb2RlYywgRElTQUJMRSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3RydWN0IHN3cl9kZXZpY2UgKmRldjsKLQotCWlmICghd3NhODgxeCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYgPSB3c2E4ODF4LT5zd3Jfc2xhdmU7Ci0Jd3NhODgxeC0+Y29kZWMgPSBjb2RlYzsKLQltdXRleF9pbml0KCZ3c2E4ODF4LT5iZ19sb2NrKTsKLQltdXRleF9pbml0KCZ3c2E4ODF4LT5yZXNfbG9jayk7Ci0Jd3NhODgxeF9pbml0KGNvZGVjKTsKLQlzbnByaW50Zih3c2E4ODF4LT50el9wZGF0YS5uYW1lLCBzaXplb2Yod3NhODgxeC0+dHpfcGRhdGEubmFtZSksCi0JCSIlcy4leCIsICJ3c2F0eiIsICh1OClkZXYtPmFkZHIpOwotCXdzYTg4MXgtPmJnX2NudCA9IDA7Ci0Jd3NhODgxeC0+Y2xrX2NudCA9IDA7Ci0Jd3NhODgxeC0+dHpfcGRhdGEuY29kZWMgPSBjb2RlYzsKLQl3c2E4ODF4LT50el9wZGF0YS53c2FfdGVtcF9yZWdfcmVhZCA9IHdzYTg4MXhfdGVtcF9yZWdfcmVhZDsKLQl3c2E4ODF4X2luaXRfdGhlcm1hbCgmd3NhODgxeC0+dHpfcGRhdGEpOwotCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCB3c2Ffc25kX2NvbnRyb2xzLAotCQkJCSAgIEFSUkFZX1NJWkUod3NhX3NuZF9jb250cm9scykpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmssIHdzYTg4MXhfb2NwX2N0bF93b3JrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JaWYgKHdzYTg4MXgtPnR6X3BkYXRhLnR6X2RldikKLQkJd3NhODgxeF9kZWluaXRfdGhlcm1hbCh3c2E4ODF4LT50el9wZGF0YS50el9kZXYpOwotCW11dGV4X2Rlc3Ryb3koJndzYTg4MXgtPmJnX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJndzYTg4MXgtPnJlc19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHJlZ21hcCAqd3NhODgxeF9nZXRfcmVnbWFwKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICpjb250cm9sID0gc3dyX2dldF9kZXZfZGF0YSh0b19zd3JfZGV2aWNlKGRldikpOwotCi0JaWYgKCFjb250cm9sKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBjb250cm9sLT5yZWdtYXA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93c2E4ODF4ID0gewotCS5wcm9iZSA9IHdzYTg4MXhfcHJvYmUsCi0JLnJlbW92ZSA9IHdzYTg4MXhfcmVtb3ZlLAotCS5nZXRfcmVnbWFwID0gd3NhODgxeF9nZXRfcmVnbWFwLAotCS5jb21wb25lbnRfZHJpdmVyID0gewotCQkuY29udHJvbHMgPSB3c2E4ODF4X3NuZF9jb250cm9scywKLQkJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod3NhODgxeF9zbmRfY29udHJvbHMpLAotCQkuZGFwbV93aWRnZXRzID0gd3NhODgxeF9kYXBtX3dpZGdldHMsCi0JCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3c2E4ODF4X2RhcG1fd2lkZ2V0cyksCi0JCS5kYXBtX3JvdXRlcyA9IHdzYTg4MXhfYXVkaW9fbWFwLAotCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3c2E4ODF4X2F1ZGlvX21hcCksCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9ncGlvX2N0cmwoc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeCwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAod3NhODgxeC0+cGRfZ3BpbyA8IDApIHsKLQkJZGV2X2Vycih3c2E4ODF4LT5kZXYsICIlczogZ3BpbyBpcyBub3QgdmFsaWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd3NhODgxeC0+cGRfZ3Bpbyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh3c2E4ODF4LT53c2FfcnN0X25wKSB7Ci0JCWlmIChlbmFibGUpCi0JCQlyZXQgPSBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZSgKLQkJCQkJCQl3c2E4ODF4LT53c2FfcnN0X25wKTsKLQkJZWxzZQotCQkJcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKLQkJCQkJCQl3c2E4ODF4LT53c2FfcnN0X25wKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJZGV2X2Vycih3c2E4ODF4LT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gdHVybiBzdGF0ZSAlZDsgcmV0PSVkXG4iLAotCQkJCV9fZnVuY19fLCBlbmFibGUsIHJldCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGdwaW9faXNfdmFsaWQod3NhODgxeC0+cGRfZ3BpbykpCi0JCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQod3NhODgxeC0+cGRfZ3BpbywgZW5hYmxlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdzYTg4MXhfZ3Bpb19pbml0KHN0cnVjdCBzd3JfZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0KLQl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKLQlpZiAoIXdzYTg4MXgpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGdwaW8gJWQgcmVxdWVzdCB3aXRoIG5hbWUgJXNcbiIsCi0JCV9fZnVuY19fLCB3c2E4ODF4LT5wZF9ncGlvLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0JcmV0ID0gZ3Bpb19yZXF1ZXN0KHdzYTg4MXgtPnBkX2dwaW8sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlpZiAocmV0KSB7Ci0JCWlmIChyZXQgPT0gLUVCVVNZKSB7Ci0JCQkvKiBHUElPIHdhcyBhbHJlYWR5IHJlcXVlc3RlZCAqLwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJCSAiJXM6IGdwaW8gJWQgaXMgYWxyZWFkeSBzZXQgdG8gaGlnaFxuIiwKLQkJCQkgX19mdW5jX18sIHdzYTg4MXgtPnBkX2dwaW8pOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gcmVxdWVzdCBncGlvICVkLCBlcnI6ICVkXG4iLAotCQkJCV9fZnVuY19fLCB3c2E4ODF4LT5wZF9ncGlvLCByZXQpOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zd3JfcHJvYmUoc3RydWN0IHN3cl9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdzYTg4MXhfcHJpdiAqd3NhODgxeDsKLQl1OCBkZXZudW0gPSAwOwotCWJvb2wgcGluX3N0YXRlX2N1cnJlbnQgPSBmYWxzZTsKLQotCXdzYTg4MXggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3c2E4ODF4X3ByaXYpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghd3NhODgxeCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jd3NhODgxeC0+d3NhX3JzdF9ucCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSAgICAgInFjb20sc3Brci1zZC1uLW5vZGUiLCAwKTsKLQlpZiAoIXdzYTg4MXgtPndzYV9yc3RfbnApIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IE5vdCB1c2luZyBwaW5jdHJsLCBmYWxsYmFjayB0byBncGlvXG4iLAotCQkJX19mdW5jX18pOwotCQl3c2E4ODF4LT5wZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkgICAgICJxY29tLHNwa3Itc2Qtbi1ncGlvIiwgMCk7Ci0JCWlmICh3c2E4ODF4LT5wZF9ncGlvIDwgMCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6ICVzIHByb3BlcnR5IGlzIG5vdCBmb3VuZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgInFjb20sc3Brci1zZC1uLWdwaW8iLAotCQkJCXdzYTg4MXgtPnBkX2dwaW8pOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IHJlc2V0IGdwaW8gJWRcbiIsIF9fZnVuY19fLAotCQkJd3NhODgxeC0+cGRfZ3Bpbyk7Ci0JfQotCXN3cl9zZXRfZGV2X2RhdGEocGRldiwgd3NhODgxeCk7Ci0KLQl3c2E4ODF4LT5zd3Jfc2xhdmUgPSBwZGV2OwotCi0JaWYgKCF3c2E4ODF4LT53c2FfcnN0X25wKSB7Ci0JCXJldCA9IHdzYTg4MXhfZ3Bpb19pbml0KHBkZXYpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0JfQotCWlmICh3c2E4ODF4LT53c2FfcnN0X25wKQotCQlwaW5fc3RhdGVfY3VycmVudCA9IG1zbV9jZGNfcGluY3RybF9nZXRfc3RhdGUoCi0JCQkJCQl3c2E4ODF4LT53c2FfcnN0X25wKTsKLQl3c2E4ODF4X2dwaW9fY3RybCh3c2E4ODF4LCB0cnVlKTsKLQl3c2E4ODF4LT5zdGF0ZSA9IFdTQTg4MVhfREVWX1VQOwotCi0JaWYgKCFkZWJ1Z2ZzX3dzYTg4MXhfZGVudCkgewotCQlkYmd3c2E4ODF4ID0gd3NhODgxeDsKLQkJZGVidWdmc193c2E4ODF4X2RlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoCi0JCQkJCQkid3NhODgxeF9zd3Jfc2xhdmUiLCAwKTsKLQkJaWYgKCFJU19FUlIoZGVidWdmc193c2E4ODF4X2RlbnQpKSB7Ci0JCQlkZWJ1Z2ZzX3BlZWsgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzd3JzbGF2ZV9wZWVrIiwKLQkJCQkJU19JRlJFRyB8IDA0NDQsIGRlYnVnZnNfd3NhODgxeF9kZW50LAotCQkJCQkodm9pZCAqKSAic3dyc2xhdmVfcGVlayIsCi0JCQkJCSZjb2RlY19kZWJ1Z19vcHMpOwotCi0JCQlkZWJ1Z2ZzX3Bva2UgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzd3JzbGF2ZV9wb2tlIiwKLQkJCQkJU19JRlJFRyB8IDA0NDQsIGRlYnVnZnNfd3NhODgxeF9kZW50LAotCQkJCQkodm9pZCAqKSAic3dyc2xhdmVfcG9rZSIsCi0JCQkJCSZjb2RlY19kZWJ1Z19vcHMpOwotCi0JCQlkZWJ1Z2ZzX3JlZ19kdW1wID0gZGVidWdmc19jcmVhdGVfZmlsZSgKLQkJCQkJCSJzd3JzbGF2ZV9yZWdfZHVtcCIsCi0JCQkJCQlTX0lGUkVHIHwgMDQ0NCwKLQkJCQkJCWRlYnVnZnNfd3NhODgxeF9kZW50LAotCQkJCQkJKHZvaWQgKikgInN3cnNsYXZlX3JlZ19kdW1wIiwKLQkJCQkJCSZjb2RlY19kZWJ1Z19vcHMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBBZGQgNW1zZWMgZGVsYXkgdG8gcHJvdmlkZSBzdWZmaWNpZW50IHRpbWUgZm9yCi0JICogc291bmR3aXJlIGF1dG8gZW51bWVyYXRpb24gb2Ygc2xhdmUgZGV2aWNlcyBhcwotCSAqIGFzIHBlciBIVyByZXF1aXJlbWVudC4KLQkgKi8KLQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTAxMCk7Ci0JcmV0ID0gc3dyX2dldF9sb2dpY2FsX2Rldl9udW0ocGRldiwgcGRldi0+YWRkciwgJmRldm51bSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXMgZ2V0IGRldm51bSAlZCBmb3IgZGV2IGFkZHIgJWx4IGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBkZXZudW0sIHBkZXYtPmFkZHIpOwotCQlnb3RvIGRldl9lcnI7Ci0JfQotCXBkZXYtPmRldl9udW0gPSBkZXZudW07Ci0KLQl3c2E4ODF4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3N3cihwZGV2LAotCQkJCQkgICAgICAgJndzYTg4MXhfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUih3c2E4ODF4LT5yZWdtYXApKSB7Ci0JCXJldCA9IFBUUl9FUlIod3NhODgxeC0+cmVnbWFwKTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHJlZ21hcF9pbml0IGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRldl9lcnI7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl93c2E4ODF4LAotCQkJCSAgICAgTlVMTCwgMCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ29kZWMgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkZXZfZXJyOwotCX0KLQotCXJldHVybiAwOwotCi1kZXZfZXJyOgotCWlmIChwaW5fc3RhdGVfY3VycmVudCA9PSBmYWxzZSkKLQkJd3NhODgxeF9ncGlvX2N0cmwod3NhODgxeCwgZmFsc2UpOwotCXN3cl9yZW1vdmVfZGV2aWNlKHBkZXYpOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zd3JfcmVtb3ZlKHN0cnVjdCBzd3JfZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0KLQl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKLQlpZiAoIXdzYTg4MXgpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRlYnVnZnNfd3NhODgxeF9kZW50KTsKLQlkZWJ1Z2ZzX3dzYTg4MXhfZGVudCA9IE5VTEw7Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYpOwotCWlmICh3c2E4ODF4LT5wZF9ncGlvKQotCQlncGlvX2ZyZWUod3NhODgxeC0+cGRfZ3Bpbyk7Ci0Jc3dyX3NldF9kZXZfZGF0YShwZGV2LCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3c2E4ODF4X3N3cl91cChzdHJ1Y3Qgc3dyX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0KLQl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKLQlpZiAoIXdzYTg4MXgpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gd3NhODgxeF9ncGlvX2N0cmwod3NhODgxeCwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEZhaWxlZCB0byBlbmFibGUgZ3Bpb1xuIiwgX19mdW5jX18pOwotCWVsc2UKLQkJd3NhODgxeC0+c3RhdGUgPSBXU0E4ODFYX0RFVl9VUDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zd3JfZG93bihzdHJ1Y3Qgc3dyX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4OwotCWludCByZXQ7Ci0KLQl3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YShwZGV2KTsKLQlpZiAoIXdzYTg4MXgpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdzYTg4MXggaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGRlbGF5ZWRfd29ya19wZW5kaW5nKCZ3c2E4ODF4LT5vY3BfY3RsX3dvcmspKQotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndzYTg4MXgtPm9jcF9jdGxfd29yayk7Ci0JcmV0ID0gd3NhODgxeF9ncGlvX2N0cmwod3NhODgxeCwgZmFsc2UpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBncGlvXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZQotCQl3c2E4ODF4LT5zdGF0ZSA9IFdTQTg4MVhfREVWX0RPV047Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdzYTg4MXhfc3dyX3Jlc2V0KHN0cnVjdCBzd3JfZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB3c2E4ODF4X3ByaXYgKndzYTg4MXg7Ci0JdTggcmV0cnkgPSBXU0E4ODFYX05VTV9SRVRSWTsKLQl1OCBkZXZudW0gPSAwOwotCi0Jd3NhODgxeCA9IHN3cl9nZXRfZGV2X2RhdGEocGRldik7Ci0JaWYgKCF3c2E4ODF4KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB3c2E4ODF4IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXdzYTg4MXgtPmJnX2NudCA9IDA7Ci0Jd3NhODgxeC0+Y2xrX2NudCA9IDA7Ci0Jd2hpbGUgKHN3cl9nZXRfbG9naWNhbF9kZXZfbnVtKHBkZXYsIHBkZXYtPmFkZHIsICZkZXZudW0pICYmIHJldHJ5LS0pIHsKLQkJLyogUmV0cnkgYWZ0ZXIgMSBtc2VjIGRlbGF5ICovCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAxMTAwKTsKLQl9Ci0JcGRldi0+ZGV2X251bSA9IGRldm51bTsKLQlyZWdjYWNoZV9tYXJrX2RpcnR5KHdzYTg4MXgtPnJlZ21hcCk7Ci0JcmVnY2FjaGVfc3luYyh3c2E4ODF4LT5yZWdtYXApOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IHdzYTg4MXhfc3dyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSBzdXNwZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd3NhODgxeF9zd3JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd3NhODgxeF9wcml2ICp3c2E4ODF4ID0gc3dyX2dldF9kZXZfZGF0YSh0b19zd3JfZGV2aWNlKGRldikpOwotCi0JaWYgKCF3c2E4ODF4KSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHdzYTg4MXggcHJpdmF0ZSBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldl9kYmcoZGV2LCAiJXM6IHN5c3RlbSByZXN1bWVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdzYTg4MXhfc3dyX3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh3c2E4ODF4X3N3cl9zdXNwZW5kLCB3c2E4ODF4X3N3cl9yZXN1bWUpCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN3cl9kZXZpY2VfaWQgd3NhODgxeF9zd3JfaWRbXSA9IHsKLQl7IndzYTg4MXgiLCAwfSwKLQl7fQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd3NhODgxeF9zd3JfZHRfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInFjb20sd3NhODgxeCIsCi0JfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBzd3JfZHJpdmVyIHdzYTg4MXhfY29kZWNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIndzYTg4MXgiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLnBtID0gJndzYTg4MXhfc3dyX3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlID0gd3NhODgxeF9zd3JfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSB3c2E4ODF4X3N3cl9wcm9iZSwKLQkucmVtb3ZlID0gd3NhODgxeF9zd3JfcmVtb3ZlLAotCS5pZF90YWJsZSA9IHdzYTg4MXhfc3dyX2lkLAotCS5kZXZpY2VfdXAgPSB3c2E4ODF4X3N3cl91cCwKLQkuZGV2aWNlX2Rvd24gPSB3c2E4ODF4X3N3cl9kb3duLAotCS5yZXNldF9kZXZpY2UgPSB3c2E4ODF4X3N3cl9yZXNldCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdzYTg4MXhfY29kZWNfaW5pdCh2b2lkKQotewotCXJldHVybiBzd3JfZHJpdmVyX3JlZ2lzdGVyKCZ3c2E4ODF4X2NvZGVjX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB3c2E4ODF4X2NvZGVjX2V4aXQodm9pZCkKLXsKLQlzd3JfZHJpdmVyX3VucmVnaXN0ZXIoJndzYTg4MXhfY29kZWNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQod3NhODgxeF9jb2RlY19pbml0KTsKLW1vZHVsZV9leGl0KHdzYTg4MXhfY29kZWNfZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiV1NBODgxeCBDb2RlYyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd3NhODgxeC5oIGIvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzYwZDguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2NvZGVjcy93c2E4ODF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfV1NBODgxWF9ICi0jZGVmaW5lIF9XU0E4ODFYX0gKLQotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KLSNpbmNsdWRlICJ3c2E4ODF4LXJlZ2lzdGVycy5oIgotCi0jZGVmaW5lIFdTQTg4MVhfTUFYX1NXUl9QT1JUUyAgIDQKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9TT0NfV1NBODgxWCkKLWV4dGVybiBpbnQgd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1OCAqcG9ydCwKLQkJCQkgICB1OCBudW1fcG9ydCwgdW5zaWduZWQgaW50ICpjaF9tYXNrLAotCQkJCSAgIHVuc2lnbmVkIGludCAqY2hfcmF0ZSk7Ci0KLWV4dGVybiBjb25zdCB1OCB3c2E4ODF4X3JlZ19yZWFkYWJsZVtXU0E4ODFYX0NBQ0hFX1NJWkVdOwotZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIHdzYTg4MXhfcmVnbWFwX2NvbmZpZzsKLWV4dGVybiBpbnQgd3NhODgxeF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeSgKLQkJCQkJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpjb2RlY19yb290LAotCQkJCQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwotdm9pZCB3c2E4ODF4X3JlZ21hcF9kZWZhdWx0cyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIHU4IHZlcnNpb24pOwotCi0jZWxzZQotZXh0ZXJuIGludCB3c2E4ODF4X3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHU4ICpwb3J0LAotCQkJCSAgIHU4IG51bV9wb3J0LCB1bnNpZ25lZCBpbnQgKmNoX21hc2ssCi0JCQkJICAgdW5zaWduZWQgaW50ICpjaF9yYXRlKQotewotCXJldHVybiAwOwotfQotCi1leHRlcm4gaW50IHdzYTg4MXhfY29kZWNfaW5mb19jcmVhdGVfY29kZWNfZW50cnkoCi0JCQkJCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdCwKLQkJCQkJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXJldHVybiAwOwotfQotCi12b2lkIHdzYTg4MXhfcmVnbWFwX2RlZmF1bHRzKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgdTggdmVyc2lvbikKLXsKLX0KLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfV1NBODgxWF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCmluZGV4IDUwMzQ5NDMuLmZkZTA4NjYwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYwpAQCAtMjI0LDYgKzIyNCwxMiBAQAogICogQGRiZ19zdGF0czogRGVidWdnaW5nIHN0YXRpc3RpY3MKICAqCiAgKiBAc29jOiBTb0Mgc3BlY2lmaWMgZGF0YQorICoKKyAqIEBmaWZvX3dhdGVybWFyazogdGhlIEZJRk8gd2F0ZXJtYXJrIHNldHRpbmcuICBOb3RpZmllcyBETUEgd2hlbgorICogICAgICAgICAgICAgdGhlcmUgYXJlIEBmaWZvX3dhdGVybWFyayBvciBmZXdlciB3b3JkcyBpbiBUWCBmaWZvIG9yCisgKiAgICAgICAgICAgICBAZmlmb193YXRlcm1hcmsgb3IgbW9yZSBlbXB0eSB3b3JkcyBpbiBSWCBmaWZvLgorICogQGRtYV9tYXhidXJzdDogbWF4IG51bWJlciBvZiB3b3JkcyB0byB0cmFuc2ZlciBpbiBvbmUgZ28uICBTbyBmYXIsCisgKiAgICAgICAgICAgICB0aGlzIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyBmaWZvX3dhdGVybWFyay4KICAqLwogc3RydWN0IGZzbF9zc2lfcHJpdmF0ZSB7CiAJc3RydWN0IHJlZ21hcCAqcmVnczsKQEAgLTI2Myw2ICsyNjksOSBAQAogCiAJY29uc3Qgc3RydWN0IGZzbF9zc2lfc29jX2RhdGEgKnNvYzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwl1MzIgZmlmb193YXRlcm1hcms7CisJdTMyIGRtYV9tYXhidXJzdDsKIH07CiAKIC8qCkBAIC0xMDUxLDIxICsxMDYwLDcgQEAKIAlyZWdtYXBfd3JpdGUocmVncywgQ0NTUl9TU0lfU1JDUiwgc3Jjcik7CiAJcmVnbWFwX3dyaXRlKHJlZ3MsIENDU1JfU1NJX1NDUiwgc2NyKTsKIAotCS8qCi0JICogU2V0IHRoZSB3YXRlcm1hcmsgZm9yIHRyYW5zbWl0IEZJRkkgMCBhbmQgcmVjZWl2ZSBGSUZPIDAuIFdlIGRvbid0Ci0JICogdXNlIEZJRk8gMS4gV2UgcHJvZ3JhbSB0aGUgdHJhbnNtaXQgd2F0ZXIgdG8gc2lnbmFsIGEgRE1BIHRyYW5zZmVyCi0JICogaWYgdGhlcmUgYXJlIG9ubHkgdHdvIChvciBmZXdlcikgZWxlbWVudHMgbGVmdCBpbiB0aGUgRklGTy4gVHdvCi0JICogZWxlbWVudHMgZXF1YWxzIG9uZSBmcmFtZSAobGVmdCBjaGFubmVsLCByaWdodCBjaGFubmVsKS4gVGhpcyB2YWx1ZSwKLQkgKiBob3dldmVyLCBkZXBlbmRzIG9uIHRoZSBkZXB0aCBvZiB0aGUgdHJhbnNtaXQgYnVmZmVyLgotCSAqCi0JICogV2Ugc2V0IHRoZSB3YXRlcm1hcmsgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIERNQSBidXJzdHNpemUuICBGb3IKLQkgKiBmaXEgaXQgaXMgcHJvYmFibHkgYmV0dGVyIHRvIHVzZSB0aGUgYmlnZ2VzdCBwb3NzaWJsZSB3YXRlcm1hcmsKLQkgKiBzaXplLgotCSAqLwotCWlmIChzc2lfcHJpdmF0ZS0+dXNlX2RtYSkKLQkJd20gPSBzc2lfcHJpdmF0ZS0+Zmlmb19kZXB0aCAtIDI7Ci0JZWxzZQotCQl3bSA9IHNzaV9wcml2YXRlLT5maWZvX2RlcHRoOworCXdtID0gc3NpX3ByaXZhdGUtPmZpZm9fd2F0ZXJtYXJrOwogCiAJcmVnbWFwX3dyaXRlKHJlZ3MsIENDU1JfU1NJX1NGQ1NSLAogCQkJQ0NTUl9TU0lfU0ZDU1JfVEZXTTAod20pIHwgQ0NTUl9TU0lfU0ZDU1JfUkZXTTAod20pIHwKQEAgLTEzNzMsMTIgKzEzNjgsOCBAQAogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGJhdWQgY2xvY2s6ICVsZFxuIiwKIAkJCSBQVFJfRVJSKHNzaV9wcml2YXRlLT5iYXVkY2xrKSk7CiAKLQkvKgotCSAqIFdlIGhhdmUgYnVyc3RzaXplIGJlICJmaWZvX2RlcHRoIC0gMiIgdG8gbWF0Y2ggdGhlIFNTSQotCSAqIHdhdGVybWFyayBzZXR0aW5nIGluIGZzbF9zc2lfc3RhcnR1cCgpLgotCSAqLwotCXNzaV9wcml2YXRlLT5kbWFfcGFyYW1zX3R4Lm1heGJ1cnN0ID0gc3NpX3ByaXZhdGUtPmZpZm9fZGVwdGggLSAyOwotCXNzaV9wcml2YXRlLT5kbWFfcGFyYW1zX3J4Lm1heGJ1cnN0ID0gc3NpX3ByaXZhdGUtPmZpZm9fZGVwdGggLSAyOworCXNzaV9wcml2YXRlLT5kbWFfcGFyYW1zX3R4Lm1heGJ1cnN0ID0gc3NpX3ByaXZhdGUtPmRtYV9tYXhidXJzdDsKKwlzc2lfcHJpdmF0ZS0+ZG1hX3BhcmFtc19yeC5tYXhidXJzdCA9IHNzaV9wcml2YXRlLT5kbWFfbWF4YnVyc3Q7CiAJc3NpX3ByaXZhdGUtPmRtYV9wYXJhbXNfdHguYWRkciA9IHNzaV9wcml2YXRlLT5zc2lfcGh5cyArIENDU1JfU1NJX1NUWDA7CiAJc3NpX3ByaXZhdGUtPmRtYV9wYXJhbXNfcnguYWRkciA9IHNzaV9wcml2YXRlLT5zc2lfcGh5cyArIENDU1JfU1NJX1NSWDA7CiAKQEAgLTE1NDMsNiArMTUzNCw0NyBAQAogICAgICAgICAgICAgICAgIC8qIE9sZGVyIDg2MTAgRFRzIGRpZG4ndCBoYXZlIHRoZSBmaWZvLWRlcHRoIHByb3BlcnR5ICovCiAJCXNzaV9wcml2YXRlLT5maWZvX2RlcHRoID0gODsKIAorCS8qCisJICogU2V0IHRoZSB3YXRlcm1hcmsgZm9yIHRyYW5zbWl0IEZJRk8gMCBhbmQgcmVjZWl2ZSBGSUZPIDAuIFdlIGRvbid0CisJICogdXNlIEZJRk8gMSBidXQgc2V0IHRoZSB3YXRlcm1hcmsgYXBwcm9wcmlhdGVseSBub250aGVsZXNzLgorCSAqIFdlIHByb2dyYW0gdGhlIHRyYW5zbWl0IHdhdGVyIHRvIHNpZ25hbCBhIERNQSB0cmFuc2ZlcgorCSAqIGlmIHRoZXJlIGFyZSBOIGVsZW1lbnRzIGxlZnQgaW4gdGhlIEZJRk8uIEZvciBjaGlwcyB3aXRoIDE1LWRlZXAKKwkgKiBGSUZPcywgc2V0IHdhdGVybWFyayB0byA4LiAgVGhpcyBhbGxvd3MgdGhlIFNTSSB0byBvcGVyYXRlIGF0IGEKKwkgKiBoaWdoIGRhdGEgcmF0ZSB3aXRob3V0IGNoYW5uZWwgc2xpcHBpbmcuIEJlaGF2aW9yIGlzIHVuY2hhbmdlZAorCSAqIGZvciB0aGUgb2xkZXIgY2hpcHMgd2l0aCBhIGZpZm8gZGVwdGggb2Ygb25seSA4LiAgQSB2YWx1ZSBvZiA0CisJICogbWlnaHQgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBvbGRlciBjaGlwcywgYnV0IGlzIGxlZnQgYXQKKwkgKiBmaWZvX2RlcHRoLTIgdW50aWwgc29tYm9keSBoYXMgYSBjaGFuY2UgdG8gdGVzdC4KKwkgKgorCSAqIFdlIHNldCB0aGUgd2F0ZXJtYXJrIG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBETUEgYnVyc3RzaXplLiAgRm9yCisJICogZmlxIGl0IGlzIHByb2JhYmx5IGJldHRlciB0byB1c2UgdGhlIGJpZ2dlc3QgcG9zc2libGUgd2F0ZXJtYXJrCisJICogc2l6ZS4KKwkgKi8KKwlzd2l0Y2ggKHNzaV9wcml2YXRlLT5maWZvX2RlcHRoKSB7CisJY2FzZSAxNToKKwkJLyoKKwkJICogMiBzYW1wbGVzIGlzIG5vdCBlbm91Z2ggd2hlbiBydW5uaW5nIGF0IGhpZ2ggZGF0YQorCQkgKiByYXRlcyAobGlrZSA0OGtIeiBAIDE2IGJpdHMvY2hhbm5lbCwgMTYgY2hhbm5lbHMpCisJCSAqIDggc2VlbXMgdG8gc3BsaXQgdGhpbmdzIGV2ZW5seSBhbmQgbGVhdmUgZW5vdWdoIHRpbWUKKwkJICogZm9yIHRoZSBETUEgdG8gZmlsbCB0aGUgRklGTyBiZWZvcmUgaXQncyBvdmVyL3VuZGVyCisJCSAqIHJ1bi4KKwkJICovCisJCXNzaV9wcml2YXRlLT5maWZvX3dhdGVybWFyayA9IDg7CisJCXNzaV9wcml2YXRlLT5kbWFfbWF4YnVyc3QgPSA4OworCQlicmVhazsKKwljYXNlIDg6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogbWFpbnRhaW4gb2xkIGJlaGF2aW9yIGZvciBvbGRlciBjaGlwcy4KKwkJICogS2VlcGluZyBpdCB0aGUgc2FtZSBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhbiBvbGRlcgorCQkgKiBib2FyZCB0byB0ZXN0IHdpdGguCisJCSAqIEkgc3VzcGVjdCB0aGlzIGNvdWxkIGJlIGNoYW5nZWQgdG8gYmUgc29tZXRoaW5nIHRvCisJCSAqIGxlYXZlIHNvbWUgbW9yZSBzcGFjZSBpbiB0aGUgZmlmby4KKwkJICovCisJCXNzaV9wcml2YXRlLT5maWZvX3dhdGVybWFyayA9IHNzaV9wcml2YXRlLT5maWZvX2RlcHRoIC0gMjsKKwkJc3NpX3ByaXZhdGUtPmRtYV9tYXhidXJzdCA9IHNzaV9wcml2YXRlLT5maWZvX2RlcHRoIC0gMjsKKwkJYnJlYWs7CisJfQorCiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHNzaV9wcml2YXRlKTsKIAogCWlmIChzc2lfcHJpdmF0ZS0+c29jLT5pbXgpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jCmluZGV4IGQ1ODczZWUuLmJkMTlmYWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCSAqIGZvciBKYWNrIGRldGVjdGlvbiBhbmQgYnV0dG9uIHByZXNzCiAJCSAqLwogCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQwX1NDTEtfU19SQ0NMSywKLQkJCQkJICAgICAwLAorCQkJCQkgICAgIDQ4MDAwICogNTEyLAogCQkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOwogCQlpZiAoIXJldCkgewogCQkJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSAmJiBwcml2LT5tY2xrKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jCmluZGV4IDhmYzMxNzguLmIzMGJkMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LmMKQEAgLTUxNSw2ICs1MTUsOSBAQAogCiB2b2lkIHNrbF9zc3RfZHNwX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KQogeworCisJaWYgKGN0eC0+ZHNwLT5mdykKKwkJcmVsZWFzZV9maXJtd2FyZShjdHgtPmRzcC0+ZncpOwogCXNrbF9jbGVhcl9tb2R1bGVfdGFibGUoY3R4LT5kc3ApOwogCXNrbF9mcmVldXBfdXVpZF9saXN0KGN0eCk7CiAJc2tsX2lwY19mcmVlKCZjdHgtPmlwYyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL0tjb25maWcgYi9zb3VuZC9zb2MvbXNtL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NzMzMGMuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLW1lbnUgIk1TTSBTb0MgQXVkaW8gc3VwcG9ydCIKLQotY29uZmlnIFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQotCXRyaXN0YXRlCi0KLWNvbmZpZyBTTkRfU09DX01TTV9RRFNQNlYyX0lOVEYKLQlib29sICJTb0MgUTYgYXVkaW8gZHJpdmVyIGZvciBNU00vQVBRIgotCWRlcGVuZHMgb24gTVNNX1FEU1A2X0FQUlYyX0dMSU5LCi0JaGVscAotCSBUbyBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIE1TTS9BUFEuCi0JIFRoaXMgd2lsbCBlbmFibGUgYWxsIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYwotCSBpbnRlcmFjdGlvbnMgdG93YXJkcyBEU1AuIEl0IGluY2x1ZGVzIGFzbSwKLQkgYWRtIGFuZCBhZmUgaW50ZXJmYWNlcyBvbiB0aGUgRFNQLgotCi1jb25maWcgU05EX1NPQ19RRFNQNlYyCi0JdHJpc3RhdGUgIlNvQyBBTFNBIGF1ZGlvIGRyaXZlciBmb3IgUURTUDZWMiIKLQlzZWxlY3QgU05EX1NPQ19NU01fUURTUDZWMl9JTlRGCi0Jc2VsZWN0IFNORF9TT0NfQ09NUFJFU1MKLQloZWxwCi0JIFRvIGFkZCBzdXBwb3J0IGZvciBNU00gUURTUDZWMiBTb2MgQXVkaW8uCi0JIFRoaXMgd2lsbCBlbmFibGUgc291bmQgc29jIHBsYXRmb3JtIHNwZWNpZmljCi0JIGF1ZGlvIGRyaXZlcnMuIFRoaXMgaW5jbHVkZXMgcTZhc20sIHE2YWRtLAotCSBxNmFmZSBpbnRlcmZhY2VzIHRvIERTUCB1c2luZyBhcHIuCi0KLWNvbmZpZyBTTkRfU09DX1FEU1BfREVCVUcKLQlib29sICJRRFNQIEF1ZGlvIERyaXZlciBEZWJ1ZyBGZWF0dXJlIgotCWhlbHAKLQkgQ29uZmlndXJhdGlvbiB0byBlbmFibGUgZGVidWdnaW5nIHV0aWxpdGllcyBmb3IKLQkgUURTUDYgYmFzZWQgYXVkaW8gZHJpdmVycy4gT25lIGRlYnVnZ2luZyB1dGlsaXR5Ci0JIGlzIGluZHVjaW5nIGtlcm5lbCBwYW5pYyB1cG9uIGVuY291bnRlcmluZyBjcml0aWNhbAotCSBlcnJvcnMgZnJvbSBEU1AgYXVkaW8gbW9kdWxlcwotCi1jb25maWcgRE9MQllfRFMyCi0JYm9vbCAiRW5hYmxlIERvbGJ5IERTMiIKLQlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgotCWhlbHAKLQkgVG8gYWRkIHN1cHBvcnQgZm9yIGRvbGJ5IERBUCBwb3N0IHByb2Nlc3NpbmcuCi0JIFRoaXMgc3VwcG9ydCBpcyB0byBjb25maWd1cmUgdGhlIHBvc3QgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzCi0JIHRvIERTUC4gVGhlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc2VuZGluZyB0aGUgZW5kIHBvaW50Ci0JIGRldmljZSwgZW5kIHBvaW50IGRlcGVuZGVudCBwb3N0IHByb2Nlc3NpbmcgcGFyYW1ldGVycyBhbmQKLQkgdGhlIHZhcmlvdXMgcG9zcnQgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzCi0KLWNvbmZpZyBET0xCWV9MSUNFTlNFCi0JYm9vbCAiRW5hYmxlIERvbGJ5IExJQ0VOU0UiCi0JZGVwZW5kcyBvbiBTTkRfU09DX01TTV9RRFNQNlYyX0lOVEYKLQloZWxwCi0JIFRvIGFkZCBzdXBwb3J0IGZvciBkb2xieSBEQVAgcG9zdCBwcm9jZXNzaW5nLAotCSBhbmQgcmV0YWluIERBUCBzZXQgbGljZW5zZSBmdW5jdGlvbmFsaXR5IG9ubHkuCi0JIFRoaXMgaXMgcmVxdWlyZWQgYnkgRG9sYnkgR0VGIGltcGxlbWVudGF0aW9uIHdoaWNoIG5lZWRzCi0JIG5vdGhpbmcgYnV0IGRvbGJ5IGxpY2Vuc2UgdmFsaWRhdGlvbiBmdW5jdGlvbmFsaXR5IGluIGRyaXZlci4KLQotY29uZmlnIERUU19FQUdMRQotCWJvb2wgIkVuYWJsZSBEVFMgRWFnbGUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgotCXNlbGVjdCBTTkRfSFdERVAKLQloZWxwCi0JIFRvIGFkZCBEVFMgRWFnbGUgc3VwcG9ydCBvbiBRRFNQNiB0YXJnZXRzLgotCSBFYWdsZSBpcyBhIERUUyBwcmUvcG9zdCBwcm9jZXNzaW5nCi0JIHBhY2thZ2UgdGhhdCBpbmNsdWRlcyBIZWFkcGhvbmVYLiBUaGUgY29uZmlndXJhdGlvbgotCSBpbmNsdWRlcyBzZW5kaW5nIHR1bmluZyBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgbW9kdWxlcy4KLQotY29uZmlnIERUU19TUlNfVE0KLQlib29sICJFbmFibGUgRFRTIFNSUyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgotCWhlbHAKLQkgVG8gYWRkIHN1cHBvcnQgZm9yIERUUyBTUlMgcG9zdCBwcm9jZXNzaW5nLgotCSBUaGlzIHN1cHBvcnQgaXMgdG8gY29uZmlndXJlIHRoZSBwb3N0IHByb2Nlc3NpbmcKLQkgcGFyYW1ldGVycyB0byBEU1AuIFRoZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNlbmRpbmcKLQkgdHVuaW5nIHBhcmFtZXRlcnMgb2YgdmFyaW91cyBtb2R1bGVzLgotCi1jb25maWcgUVRJX1BQCi0JYm9vbCAiRW5hYmxlIFFUSSBQUCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfTVNNX1FEU1A2VjJfSU5URgotCWhlbHAKLQkgVG8gYWRkIHN1cHBvcnQgZm9yIGRlZmF1bHQgUVRJIHBvc3QgcHJvY2Vzc2luZy4KLQkgVGhpcyBzdXBwb3J0IGlzIHRvIGNvbmZpZ3VyZSB0aGUgcG9zdCBwcm9jZXNzaW5nCi0JIHBhcmFtZXRlcnMgdG8gRFNQLiBUaGUgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZW5kaW5nCi0JIHR1bmluZyBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgbW9kdWxlcyBzdWNoIGFzIGVxdWFsaXplciwKLQkgY3VzdG9taXplZCBtaXhpbmcuCi0KLWNvbmZpZyBRVElfUFBfQVVESU9TUEhFUkUKLQlib29sICJFbmFibGUgUVRJIEFVRElPU1BIRVJFIFBQIgotCWRlcGVuZHMgb24gU05EX1NPQ19NU01fUURTUDZWMl9JTlRGCi0JaGVscAotCSBUbyBhZGQgc3VwcG9ydCBmb3IgUVRJIGF1ZGlvIHNwaGVyZSBwb3N0IHByb2Nlc3NpbmcuCi0JIFRoaXMgc3VwcG9ydCBpcyB0byBjb25maWd1cmUgdGhlIHBvc3QgcHJvY2Vzc2luZwotCSBwYXJhbWV0ZXJzIHRvIERTUC4gVGhlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZXMgc2VuZGluZwotCSB0dW5pbmcgcGFyYW1ldGVycyBvZiBhdWRpbyBzcGhlcmUgbW9kdWxlLgotCi1jb25maWcgU05EX1NPQ19DUEUKLQl0cmlzdGF0ZSAiQ1BFIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1dDRF9DUEUKLQloZWxwCi0JIFRvIGFkZCBzdXBwb3J0IGZvciBDb2RlYyBQcm9jZXNzaW5nIEVuZ2luZS4gVGhpcyBzdXBwb3J0Ci0JIGlzIHRvIGVuYWJsZSBDUEUgYmxvY2sgb24gdGhlIGNvZGVjIGFuZCB0aGlzIGNvbmZpZyBuZWVkcwotCSB0byBiZSBhZGRlZCB0byBjb2RlY3MgdGhhdCBjb250YWluIHRoZSBDUEUgaGFyZHdhcmUgYmxvY2suCi0JIFRoZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHRoZSBjcGUgbHNtIGRyaXZlciB0byBlbmFibGUKLQkgbGlzdGVuIG9uIGNvZGVjLgotCi1jb25maWcgU05EX1NPQ19JTlRfQ09ERUMKLQl0cmlzdGF0ZSAiU29DIE1hY2hpbmUgZHJpdmVyIGZvciBTRE02NjBfSU5UIgotCWRlcGVuZHMgb24gQVJDSF9RQ09NCi0Jc2VsZWN0IFNORF9TT0NfUURTUDZWMgotCXNlbGVjdCBTTkRfU09DX01TTV9TVFVCCi0Jc2VsZWN0IFNORF9TT0NfTVNNX0hPU1RMRVNTX1BDTQotCXNlbGVjdCBTTkRfRFlOQU1JQ19NSU5PUlMKLQlzZWxlY3QgTVNNX1FEU1A2X0FQUlYyX0dMSU5LCi0Jc2VsZWN0IE1TTV9RRFNQNl9TU1IKLQlzZWxlY3QgTVNNX1FEU1A2X1BEUgotCXNlbGVjdCBNU01fUURTUDZfTk9USUZJRVIKLQlzZWxlY3QgTVNNX1FEU1A2VjJfQ09ERUNTCi0Jc2VsZWN0IE1TTV9DRENfUElOQ1RSTAotCXNlbGVjdCBTTkRfU09DX01TTV9TRFcKLQlzZWxlY3QgU05EX1NPQ19TRE02NjBfQ0RDCi0Jc2VsZWN0IFFUSV9QUAotCXNlbGVjdCBEVFNfU1JTX1RNCi0Jc2VsZWN0IERPTEJZX0xJQ0VOU0UKLQlzZWxlY3QgU05EX0hXREVQCi0Jc2VsZWN0IE1TTV9VTFRSQVNPVU5ECi0Jc2VsZWN0IERUU19FQUdMRQotCXNlbGVjdCBTTkRfU09DX0NPTVBSRVNTCi0Jc2VsZWN0IFBJTkNUUkxfTFBJCi0JaGVscAotCVRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTVNNX0lOVC4KLQlUaGlzIHdpbGwgZW5hYmxlIHNvdW5kIHNvYyBkcml2ZXJzIHdoaWNoCi0JaW50ZXJmYWNlcyB3aXRoIERTUCwgYWxzbyBpdCB3aWxsIGVuYWJsZQotCXRoZSBtYWNoaW5lIGRyaXZlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKLQlEQUktbGlua3MKLQotY29uZmlnIFNORF9TT0NfRVhUX0NPREVDCi0JdHJpc3RhdGUgIlNvQyBNYWNoaW5lIGRyaXZlciBmb3IgU0RNNjYwX0VYVCIKLQlkZXBlbmRzIG9uIEFSQ0hfUUNPTQotCXNlbGVjdCBTTkRfU09DX1FEU1A2VjIKLQlzZWxlY3QgU05EX1NPQ19NU01fU1RVQgotCXNlbGVjdCBTTkRfU09DX01TTV9IT1NUTEVTU19QQ00KLQlzZWxlY3QgU05EX0RZTkFNSUNfTUlOT1JTCi0Jc2VsZWN0IE1TTV9RRFNQNl9BUFJWMl9HTElOSwotCXNlbGVjdCBNU01fUURTUDZfU1NSCi0Jc2VsZWN0IE1TTV9RRFNQNl9QRFIKLQlzZWxlY3QgTVNNX1FEU1A2X05PVElGSUVSCi0Jc2VsZWN0IE1TTV9RRFNQNlYyX0NPREVDUwotCXNlbGVjdCBTTkRfU09DX1dDRDkzMzUKLQlzZWxlY3QgU05EX1NPQ19XQ0Q5MzRYCi0Jc2VsZWN0IFNORF9TT0NfV1NBODgxWAotCXNlbGVjdCBNRkRfQ09SRQotCXNlbGVjdCBRVElfUFAKLQlzZWxlY3QgRFRTX1NSU19UTQotCXNlbGVjdCBET0xCWV9MSUNFTlNFCi0Jc2VsZWN0IFNORF9TT0NfQ1BFCi0Jc2VsZWN0IFNORF9TT0NfV0NEX0NQRQotCXNlbGVjdCBTTkRfSFdERVAKLQlzZWxlY3QgTVNNX1VMVFJBU09VTkQKLQlzZWxlY3QgRFRTX0VBR0xFCi0Jc2VsZWN0IFNORF9TT0NfQ09NUFJFU1MKLQlzZWxlY3QgUElOQ1RSTF9MUEkKLQloZWxwCi0JVG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBNU01fRVhULgotCVRoaXMgd2lsbCBlbmFibGUgc291bmQgc29jIGRyaXZlcnMgd2hpY2gKLQlpbnRlcmZhY2VzIHdpdGggRFNQLCBhbHNvIGl0IHdpbGwgZW5hYmxlCi0JdGhlIG1hY2hpbmUgZHJpdmVyIGFuZCB0aGUgY29ycmVzcG9uZGluZwotCURBSS1saW5rcwotCi1jb25maWcgU05EX1NPQ19NQUNISU5FX01TTTg5OTgKLQl0cmlzdGF0ZSAiU29DIE1hY2hpbmUgZHJpdmVyIGZvciBNU004OTk4IGJvYXJkcyIKLQlzZWxlY3QgU05EX1NPQ19XU0E4ODFYCi0Jc2VsZWN0IFNORF9TT0NfV0NEOTMzNQotCXNlbGVjdCBTTkRfU09DX1dDRDkzNFgKLQlzZWxlY3QgU05EX1NPQ19DUEUKLQotCWhlbHAKLQlUbyBlbmFibGUgdGhlIG1hY2hpbmUgZHJpdmVyIGFuZCB0aGUKLQljb3JyZXNwb25kaW5nIERBSS1saW5rcyBvbiBNU004OTk4LgotCUFsbCBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBtb2R1bGVzIGFyZQotCWVuYWJsZWQgaGVyZS4KLQotY29uZmlnIFNORF9TT0NfTVNNODk5OAotCXRyaXN0YXRlICJTb3VuZCBTb0MgZHJpdmVycyB0byBpbnRlcmZhY2Ugd2l0aCBEU1AiCi0JZGVwZW5kcyBvbiBBUkNIX1FDT00KLQlzZWxlY3QgU05EX1NPQ19DT01QUkVTUwotCXNlbGVjdCBTTkRfU09DX1FEU1A2VjIKLQlzZWxlY3QgU05EX1NPQ19NU01fU1RVQgotCXNlbGVjdCBTTkRfU09DX01TTV9IT1NUTEVTU19QQ00KLQlzZWxlY3QgU05EX0RZTkFNSUNfTUlOT1JTCi0Jc2VsZWN0IE1TTV9RRFNQNl9BUFJWMl9HTElOSwotCXNlbGVjdCBNU01fUURTUDZfU1NSCi0Jc2VsZWN0IE1TTV9RRFNQNl9QRFIKLQlzZWxlY3QgTVNNX1FEU1A2X05PVElGSUVSCi0Jc2VsZWN0IE1TTV9RRFNQNlYyX0NPREVDUwotCXNlbGVjdCBTTkRfU09DX01TTV9IRE1JX0NPREVDX1JYCi0Jc2VsZWN0IERUU19TUlNfVE0KLQlzZWxlY3QgUVRJX1BQCi0Jc2VsZWN0IE1TTV9VTFRSQVNPVU5ECi0Jc2VsZWN0IERPTEJZX0xJQ0VOU0UKLQlzZWxlY3QgU05EX0hXREVQCi0gICAgICAgIHNlbGVjdCBEVFNfRUFHTEUKLQloZWxwCi0JIFRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gTVNNODk5OC4KLQkgVGhpcyB3aWxsIGVuYWJsZSBzb3VuZCBzb2MgZHJpdmVycyB3aGljaAotCSBpbnRlcmZhY2VzIHdpdGggRFNQLCBhbHNvIGl0IHdpbGwgZW5hYmxlCi0JIHRoZSBtYWNoaW5lIGRyaXZlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKLQkgREFJLWxpbmtzCi0KLWNvbmZpZyBTTkRfU09DXzY2MAotCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIFNETTY2MC82NzAgYm9hcmRzIgotCWRlcGVuZHMgb24gQVJDSF9RQ09NCi0Jc2VsZWN0IFNORF9TT0NfSU5UX0NPREVDCi0Jc2VsZWN0IFNORF9TT0NfRVhUX0NPREVDCi0JaGVscAotCSBUbyBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFNETTY2MC82NzAuCi0JIFRoaXMgd2lsbCBlbmFibGUgc291bmQgc29jIGRyaXZlcnMgd2hpY2gKLQkgaW50ZXJmYWNlcyB3aXRoIERTUCwgYWxzbyBpdCB3aWxsIGVuYWJsZQotCSB0aGUgbWFjaGluZSBkcml2ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi0JIERBSS1saW5rcwotCi1jb25maWcgU05EX1NPQ19NQUNISU5FX1NETTg0NQotCXRyaXN0YXRlICJTb0MgTWFjaGluZSBkcml2ZXIgZm9yIFNETTg0NSBib2FyZHMiCi0Jc2VsZWN0IFNORF9TT0NfV1NBODgxWAotCXNlbGVjdCBTTkRfU09DX1dDRDkzNFgKLQotCWhlbHAKLQlUbyBlbmFibGUgdGhlIG1hY2hpbmUgZHJpdmVyIGFuZCB0aGUKLQljb3JyZXNwb25kaW5nIERBSS1saW5rcyBvbiBTRE04NDUuCi0JQWxsIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIG1vZHVsZXMgYXJlCi0JZW5hYmxlZCBoZXJlLgotCi1jb25maWcgU05EX1NPQ19TRE04NDUKLQl0cmlzdGF0ZSAiU29DIE1hY2hpbmUgZHJpdmVyIGZvciBTRE04NDUgYm9hcmRzIgotCWRlcGVuZHMgb24gQVJDSF9RQ09NCi0Jc2VsZWN0IFNORF9TT0NfQ09NUFJFU1MKLQlzZWxlY3QgU05EX1NPQ19RRFNQNlYyCi0Jc2VsZWN0IFNORF9TT0NfTVNNX1NUVUIKLQlzZWxlY3QgU05EX1NPQ19NU01fSE9TVExFU1NfUENNCi0Jc2VsZWN0IFNORF9EWU5BTUlDX01JTk9SUwotCXNlbGVjdCBNU01fUURTUDZfQVBSVjJfR0xJTksKLQlzZWxlY3QgTVNNX1FEU1A2X1NTUgotCXNlbGVjdCBNU01fUURTUDZfUERSCi0Jc2VsZWN0IE1TTV9RRFNQNl9OT1RJRklFUgotCXNlbGVjdCBNU01fUURTUDZWMl9DT0RFQ1MKLQlzZWxlY3QgU05EX1NPQ19NU01fSERNSV9DT0RFQ19SWAotCXNlbGVjdCBEVFNfU1JTX1RNCi0Jc2VsZWN0IFFUSV9QUAotCXNlbGVjdCBNU01fVUxUUkFTT1VORAotCXNlbGVjdCBET0xCWV9EUzIKLQlzZWxlY3QgU05EX0hXREVQCi0gICAgICAgIHNlbGVjdCBEVFNfRUFHTEUKLQloZWxwCi0JIFRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gU0RNODQ1LgotCSBUaGlzIGVuYWJsZXMgc291bmQgc29jIGRyaXZlcnMgdGhhdCBpbnRlcmZhY2VzCi0JIHdpdGggRFNQLiBUaGlzIGFsc28gZW5hYmxlcyB0aGUgbWFjaGluZSBkcml2ZXIKLQkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIERBSS1saW5rcy4KLQotZW5kbWVudQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9NYWtlZmlsZSBiL3NvdW5kL3NvYy9tc20vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmRkYjUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTVNNIE1hY2hpbmUgU3VwcG9ydAotCi1zbmQtc29jLWhvc3RsZXNzLXBjbS1vYmpzIDo9IG1zbS1wY20taG9zdGxlc3Mubwotb2JqLSQoQ09ORklHX1NORF9TT0NfTVNNX0hPU1RMRVNTX1BDTSkgKz0gc25kLXNvYy1ob3N0bGVzcy1wY20ubwotCi1vYmotJChDT05GSUdfU05EX1NPQ19NU01fUURTUDZWMl9JTlRGKSArPSBxZHNwNnYyLwotCi1zbmQtc29jLXFkc3A2djItb2JqcyA6PSBtc20tZGFpLWZlLm8KLW9iai0kKENPTkZJR19TTkRfU09DX1FEU1A2VjIpICs9IHNuZC1zb2MtcWRzcDZ2Mi5vCi0KLSNmb3IgQ1BFIGRyaXZlcnMKLXNuZC1zb2MtY3BlLW9ianMgOj0gbXNtLWNwZS1sc20ubwotb2JqLSQoQ09ORklHX1NORF9TT0NfQ1BFKSArPSBzbmQtc29jLWNwZS5vCi0KLSMgZm9yIE1TTTg5OTggc291bmQgY2FyZCBkcml2ZXIKLXNuZC1zb2MtbXNtODk5OC1vYmpzIDo9IG1zbTg5OTgubwotb2JqLSQoQ09ORklHX1NORF9TT0NfTUFDSElORV9NU004OTk4KSArPSBzbmQtc29jLW1zbTg5OTgubwotCi0jIGZvciBTRE02NjAgc291bmQgY2FyZCBkcml2ZXIKLXNuZC1zb2Mtc2RtNjYwLWNvbW1vbi1vYmpzIDo9IHNkbTY2MC1jb21tb24ubwotb2JqLSQoQ09ORklHX1NORF9TT0NfNjYwKSArPSBzbmQtc29jLXNkbTY2MC1jb21tb24ubwotCi0jIGZvciBTRE02NjAgc291bmQgY2FyZCBkcml2ZXIKLXNuZC1zb2MtaW50LWNvZGVjLW9ianMgOj0gc2RtNjYwLWludGVybmFsLm8KLW9iai0kKENPTkZJR19TTkRfU09DX0lOVF9DT0RFQykgKz0gc25kLXNvYy1zZG02NjAtY29tbW9uLm8KLW9iai0kKENPTkZJR19TTkRfU09DX0lOVF9DT0RFQykgKz0gc25kLXNvYy1pbnQtY29kZWMubwotCi0jIGZvciBTRE02NjAgc291bmQgY2FyZCBkcml2ZXIKLXNuZC1zb2MtZXh0LWNvZGVjLW9ianMgOj0gc2RtNjYwLWV4dGVybmFsLm8gc2RtNjYwLWV4dC1kYWktbGlua3Mubwotb2JqLSQoQ09ORklHX1NORF9TT0NfRVhUX0NPREVDKSArPSBzbmQtc29jLXNkbTY2MC1jb21tb24ubwotb2JqLSQoQ09ORklHX1NORF9TT0NfRVhUX0NPREVDKSArPSBzbmQtc29jLWV4dC1jb2RlYy5vCi0KLSMgZm9yIFNETTg0NSBzb3VuZCBjYXJkIGRyaXZlcgotc25kLXNvYy1zZG04NDUtb2JqcyA6PSBzZG04NDUubwotb2JqLSQoQ09ORklHX1NORF9TT0NfTUFDSElORV9TRE04NDUpICs9IHNuZC1zb2Mtc2RtODQ1Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vZGV2aWNlX2V2ZW50LmggYi9zb3VuZC9zb2MvbXNtL2RldmljZV9ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhkMTE0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vZGV2aWNlX2V2ZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0RFVklDRV9FVkVOVF9ICi0jZGVmaW5lIF9fREVWSUNFX0VWRU5UX0gKLQotI2RlZmluZSBRQ19BVURJT19FWFRFUk5BTF9TUEtfMV9FVkVOVCAicWNfZXh0X3Nwa18xIgotI2RlZmluZSBRQ19BVURJT19FWFRFUk5BTF9TUEtfMl9FVkVOVCAicWNfZXh0X3Nwa18yIgotI2RlZmluZSBRQ19BVURJT19FWFRFUk5BTF9NSUNfRVZFTlQgInFjX2V4dF9taWMiCi0KLSNlbmRpZiAvKiBfX0RFVklDRV9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL21zbS1jcGUtbHNtLmMgYi9zb3VuZC9zb2MvbXNtL21zbS1jcGUtbHNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjVkZGEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9tc20tY3BlLWxzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvY3BlX2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9sc21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL21zbS1zbGltLWRtYS5oPgotCi0jZGVmaW5lIFNBTVBMRV9SQVRFXzQ4S0haIDQ4MDAwCi0jZGVmaW5lIFNBTVBMRV9SQVRFXzE2S0haIDE2MDAwCi0jZGVmaW5lIExTTV9WT0lDRV9XQUtFVVBfQVBQX1YyIDIKLSNkZWZpbmUgQUZFX1BPUlRfSURfMSAxCi0jZGVmaW5lIEFGRV9QT1JUX0lEXzMgMwotI2RlZmluZSBBRkVfT1VUX1BPUlRfMiAyCi0jZGVmaW5lIExJU1RFTl9NSU5fTlVNX1BFUklPRFMgICAgIDIKLSNkZWZpbmUgTElTVEVOX01BWF9OVU1fUEVSSU9EUyAgICAgMTIKLSNkZWZpbmUgTElTVEVOX01BWF9QRVJJT0RfU0laRSAgICAgNjE0NDAKLSNkZWZpbmUgTElTVEVOX01JTl9QRVJJT0RfU0laRSAgICAgMzIwCi0jZGVmaW5lIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSAyNTYKLSNkZWZpbmUgTVNNX0NQRV9NQVhfQ1VTVE9NX1BBUkFNX1NJWkUgMjA0OAotCi0jZGVmaW5lIE1TTV9DUEVfTEFCX1RIUkVBRF9USU1FT1VUICgzICogKEhaLzEwKSkKLQotI2RlZmluZSBNU01fQ1BFX0xTTV9HUkFCX0xPQ0sobG9jaywgbmFtZSkJCVwKLXsJCQkJCQlcCi0JcHJfZGVidWcoIiVzOiAlcyBsb2NrIGFjcXVpcmVcbiIsCVwKLQkJIF9fZnVuY19fLCBuYW1lKTsJCVwKLQltdXRleF9sb2NrKGxvY2spOwkJCVwKLX0KLQotI2RlZmluZSBNU01fQ1BFX0xTTV9SRUxfTE9DSyhsb2NrLCBuYW1lKQkJXAotewkJCQkJCVwKLQlwcl9kZWJ1ZygiJXM6ICVzIGxvY2sgcmVsZWFzZVxuIiwJXAotCQkgX19mdW5jX18sIG5hbWUpOwkJXAotCW11dGV4X3VubG9jayhsb2NrKTsJCQlcCi19Ci0KLS8qIENvbnZlbnRpb25hbCBhbmQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKLQk4MDAwLCAxNjAwMCwgNDgwMDAsIDE5MjAwMCwgMzg0MDAwCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKLQkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAotCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKLQkubWFzayA9IDAsCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX2xpc3RlbiA9IHsKLQkuaW5mbyA9CShTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCi0JLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJICBTTkRSVl9QQ01fUkFURV8xOTIwMDAgfCBTTkRSVl9QQ01fUkFURV8zODQwMDApLAotCS5yYXRlX21pbiA9IDE2MDAwLAotCS5yYXRlX21heCA9IDM4NDAwMCwKLQkuY2hhbm5lbHNfbWluID0JMSwKLQkuY2hhbm5lbHNfbWF4ID0JMSwKLQkuYnVmZmVyX2J5dGVzX21heCA9IExJU1RFTl9NQVhfTlVNX1BFUklPRFMgKgotCQkJICAgIExJU1RFTl9NQVhfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZF9ieXRlc19taW4gPSBMSVNURU5fTUlOX1BFUklPRF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gTElTVEVOX01BWF9QRVJJT0RfU0laRSwKLQkucGVyaW9kc19taW4gPSBMSVNURU5fTUlOX05VTV9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9IExJU1RFTl9NQVhfTlVNX1BFUklPRFMsCi0JLmZpZm9fc2l6ZSA9IDAsCi19OwotCi1lbnVtIHsKLQlBRkVfQ01EX0lOVkFMSUQgPSAwLAotCUFGRV9DTURfUE9SVF9TVEFSVCwKLQlBRkVfQ01EX1BPUlRfU1VTUEVORCwKLQlBRkVfQ01EX1BPUlRfUkVTVU1FLAotCUFGRV9DTURfUE9SVF9TVE9QLAotfTsKLQotZW51bSBjcGVfbGFiX3RocmVhZF9zdGF0dXMgewotCU1TTV9MU01fTEFCX1RIUkVBRF9TVE9QLAotCU1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HLAotCU1TTV9MU01fTEFCX1RIUkVBRF9FUlJPUiwKLX07Ci0KLXN0cnVjdCBjcGVfaHdfcGFyYW1zIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTE2IHNhbXBsZV9zaXplOwotCXUzMiBidWZfc3o7Ci0JdTMyIHBlcmlvZF9jb3VudDsKLQl1MTYgY2hhbm5lbHM7Ci19OwotCi1zdHJ1Y3QgY3BlX2RhdGFfcGNtX2J1ZiB7Ci0JdTggKm1lbTsKLQlwaHlzX2FkZHJfdCBwaHlzOwotfTsKLQotc3RydWN0IGNwZV9sc21fbGFiIHsKLQlhdG9taWNfdCBpbl9jb3VudDsKLQlhdG9taWNfdCBhYm9ydF9yZWFkOwotCXUzMiBkbWFfd3JpdGU7Ci0JdTMyIGJ1Zl9pZHg7Ci0JdTMyIHBjbV9zaXplOwotCWVudW0gY3BlX2xhYl90aHJlYWRfc3RhdHVzIHRocmVhZF9zdGF0dXM7Ci0Jc3RydWN0IGNwZV9kYXRhX3BjbV9idWYgKnBjbV9idWY7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcGVyaW9kX3dhaXQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gY29tcDsKLQlzdHJ1Y3QgY29tcGxldGlvbiB0aHJlYWRfY29tcGxldGU7Ci19OwotCi1zdHJ1Y3QgY3BlX3ByaXYgewotCXZvaWQgKmNvcmVfaGFuZGxlOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzIGxzbV9vcHM7Ci0Jc3RydWN0IHdjZF9jcGVfYWZlX29wcyBhZmVfb3BzOwotCWJvb2wgYWZlX21hZF9jdGw7Ci0JdTMyIGlucHV0X3BvcnRfaWQ7Ci19OwotCi1zdHJ1Y3QgY3BlX2xzbV9kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqbHNtX3Nlc3Npb247Ci0Jc3RydWN0IG11dGV4IGxzbV9hcGlfbG9jazsKLQlzdHJ1Y3QgY3BlX2xzbV9sYWIgbGFiOwotCXN0cnVjdCBjcGVfaHdfcGFyYW1zIGh3X3BhcmFtczsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQotCXdhaXRfcXVldWVfaGVhZF90IGV2ZW50X3dhaXQ7Ci0JYXRvbWljX3QgZXZlbnRfYXZhaWw7Ci0JYXRvbWljX3QgZXZlbnRfc3RvcDsKLQotCXU4IGV2X2RldF9zdGF0dXM7Ci0JdTggZXZfZGV0X3BsZF9zaXplOwotCXU4ICpldl9kZXRfcGF5bG9hZDsKLQotCWJvb2wgY3BlX3ByZXBhcmVkOwotfTsKLQotc3RhdGljIGludCBtc21fY3BlX2FmZV9tYWRfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjcGUtPmFmZV9tYWRfY3RsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfYWZlX21hZF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQljcGUtPmFmZV9tYWRfY3RsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY3BlX2tjb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDUEUgQUZFIE1BRCBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCi0JCQltc21fY3BlX2FmZV9tYWRfY3RsX2dldCwgbXNtX2NwZV9hZmVfbWFkX2N0bF9wdXQpLAotfTsKLQotLyoKLSAqIGNwZV9nZXRfcHJpdmF0ZV9kYXRhOiBvYnRhaW4gQVNvQyBwbGF0Zm9ybSBkcml2ZXIgcHJpdmF0ZSBkYXRhCi0gKiBAc3Vic3RyZWFtOiBBU29DIHN1YnN0cmVhbSBmb3Igd2hpY2ggcHJpdmF0ZSBkYXRhIHRvIGJlIG9idGFpbmVkCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY3BlX3ByaXYgKmNwZV9nZXRfcHJpdmF0ZV9kYXRhKAotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0KLQlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogJXMgaXMgaW52YWxpZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWlmICghcnRkIHx8ICFydGQtPnBsYXRmb3JtKSB7Ci0JCXByX2VycigiJXM6ICVzIGlzIGludmFsaWRcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkoIXJ0ZCkgPyAicnVudGltZSIgOiAicGxhdGZvcm0iKTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCXJldHVybiBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCi1lcnJfcmV0OgotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogY3BlX2dldF9sc21fZGF0YTogb2J0YWluIHRoZSBsc20gc2Vzc2lvbiBkYXRhIGdpdmVuIHRoZSBzdWJzdHJlYW0KLSAqIEBzdWJzdHJlYW06IEFTb0Mgc3Vic3RyZWFtIGZvciB3aGljaCBsc20gc2Vzc2lvbiBkYXRhIHRvIGJlIG9idGFpbmVkCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgY3BlX2xzbV9kYXRhICpjcGVfZ2V0X2xzbV9kYXRhKAotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0KLQlyZXR1cm4gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotfQotCi1zdGF0aWMgdm9pZCBtc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzKHZvaWQgKmRhdGEsCi0JCXU4IGRldGVjdF9zdGF0dXMsIHU4IHNpemUsIHU4ICpwYXlsb2FkKQotewotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gZGF0YTsKLQotCWxzbV9kLT5ldl9kZXRfc3RhdHVzID0gZGV0ZWN0X3N0YXR1czsKLQlsc21fZC0+ZXZfZGV0X3BsZF9zaXplID0gc2l6ZTsKLQotCWxzbV9kLT5ldl9kZXRfcGF5bG9hZCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsc21fZC0+ZXZfZGV0X3BheWxvYWQpCi0JCXJldHVybjsKLQotCW1lbWNweShsc21fZC0+ZXZfZGV0X3BheWxvYWQsIHBheWxvYWQsIHNpemUpOwotCi0JYXRvbWljX3NldCgmbHNtX2QtPmV2ZW50X2F2YWlsLCAxKTsKLQl3YWtlX3VwKCZsc21fZC0+ZXZlbnRfd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9jcGVfcHJvY2Vzc19ldmVudF9zdGF0dXNfZG9uZShzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZGF0YSkKLXsKLQlrZnJlZShsc21fZGF0YS0+ZXZfZGV0X3BheWxvYWQpOwotCWxzbV9kYXRhLT5ldl9kZXRfcGF5bG9hZCA9IE5VTEw7Ci0KLQlsc21fZGF0YS0+ZXZfZGV0X3N0YXR1cyA9IDA7Ci0JbHNtX2RhdGEtPmV2X2RldF9wbGRfc2l6ZSA9IDA7Ci19Ci0KLS8qCi0gKiBtc21fY3BlX2FmZV9wb3J0X2NudGw6IFBlcmZvcm0gdGhlIGFmZSBwb3J0IGNvbnRyb2wKLSAqIEBzdWJzdHJlYW06IHN1YnN0cmVhbSBmb3Igd2hpY2ggYWZlIHBvcnQgY29tbWFuZCB0byBiZSBwZXJmb3JtZWQKLSAqIEBjb3JlX2hhbmRsZTogaGFuZGxlIHRvIGNvcmUKLSAqIEBhZmVfb3BzOiBoYW5kbGUgdG8gdGhlIGFmZSBvcGVyYXRpb25zCi0gKiBAYWZlX2NmZzogYWZlIHBvcnQgY29uZmlndXJhdGlvbiBkYXRhCi0gKiBAY21kOiBjb21tYW5kIHRvIGJlIHNlbnQgdG8gQUZFCi0gKgotICovCi1zdGF0aWMgaW50IG1zbV9jcGVfYWZlX3BvcnRfY250bCgKLQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXZvaWQgKmNvcmVfaGFuZGxlLAotCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzLAotCQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmcsCi0JCWludCBjbWQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWFmZV9jZmctPnBvcnRfaWQpIHsKLQkJLyoKLQkJICogSXQgaXMgcG9zc2libGUgZHJpdmVyIGNhbiBnZXQgY2xvc2VkIHdpdGhvdXQgcHJlcGFyZSwKLQkJICogaW4gd2hpY2ggY2FzZSBhZmUgcG9ydHMgd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQuCi0JCSAqLwotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGFmZSBwb3J0IGlkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQUZFX0NNRF9QT1JUX1NUQVJUOgotCQlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X3N0YXJ0KGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKLQkJaWYgKHJjICE9IDApCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogQUZFIHBvcnQgc3RhcnQgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfQ01EX1BPUlRfU1VTUEVORDoKLQkJcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9zdXNwZW5kKGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKLQkJaWYgKHJjICE9IDApCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogYWZlX3N1c3BlbmQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQljYXNlIEFGRV9DTURfUE9SVF9SRVNVTUU6Ci0JCXJjID0gYWZlX29wcy0+YWZlX3BvcnRfcmVzdW1lKGNvcmVfaGFuZGxlLCBhZmVfY2ZnKTsKLQkJaWYgKHJjICE9IDApCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogYWZlX3Jlc3VtZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0NNRF9QT1JUX1NUT1A6Ci0JCXJjID0gYWZlX29wcy0+YWZlX3BvcnRfc3RvcChjb3JlX2hhbmRsZSwgYWZlX2NmZyk7Ci0JCWlmIChyYyAhPSAwKQotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGFmZV9zdG9wZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fbGFiX3N0b3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOwotCXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHM7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgY3BlX2xzbV9sYWIgKmxhYl9kID0gJmxzbV9kLT5sYWI7Ci0Jc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7Ci0JaW50IHJjOwotCi0JLyoKLQkgKiB0aGUgY2FsbGVyIGlzIG5vdCBhd2FyZSBvZiBMQUIgc3RhdHVzIGFuZCB3aWxsCi0JICogdHJ5IHRvIHN0b3AgbGFiIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzdG9wcGVkLgotCSAqIHJldHVybiBzdWNjZXNzIHJpZ2h0IGF3YXkgaXMgTEFCIGlzIGFscmVhZHkgc3RvcHBlZAotCSAqLwotCWlmIChsYWJfZC0+dGhyZWFkX3N0YXR1cyA9PSBNU01fTFNNX0xBQl9USFJFQURfU1RPUCkgewotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBsYWIgYWxyZWFkeSBzdG9wcGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZC0+bHNtX3Nlc3Npb24pIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOwotCWFmZV9vcHMgPSAmY3BlLT5hZmVfb3BzOwotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JaWYgKHJ0ZC0+Y3B1X2RhaSkKLQkJZG1hX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEocnRkLT5jcHVfZGFpLAotCQkJCQlzdWJzdHJlYW0pOwotCWlmICghZG1hX2RhdGEgfHwgIWRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogZG1hX2RhdGEgaXMgbm90IHNldFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGxhYl9kLT50aHJlYWRfc3RhdHVzID09IE1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HKSB7Ci0JCWRldl9kYmcocnRkLT5kZXYsICIlczogc3RvcHBpbmcgbGFiIHRocmVhZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSBrdGhyZWFkX3N0b3Aoc2Vzc2lvbi0+bHNtX2xhYl90aHJlYWQpOwotCi0JCS8qCi0JCSAqIGt0aHJlYWRfc3RvcCByZXR1cm5zIEVJTlRSIGlmIHRoZSB0aHJlYWRfZm4KLQkJICogd2FzIG5vdCBzY2hlZHVsZWQgYmVmb3JlIGNhbGxpbmcga3RocmVhZF9zdG9wLgotCQkgKiBJbiB0aGlzIGNhc2UsIHdlIGRvbnQgbmVlZCB0byB3YWl0IGZvciBsYWIKLQkJICogdGhyZWFkIHRvIGNvbXBsZXRlIGFzIGxhYiB0aHJlYWQgd2lsbCBub3QgYmUKLQkJICogc2NoZWR1bGVkIGF0IGFsbC4KLQkJICovCi0JCWlmIChyYyA9PSAtRUlOVFIpCi0JCQlnb3RvIGRvbmU7Ci0KLQkJLyogV2FpdCBmb3IgdGhlIGxhYiB0aHJlYWQgdG8gZXhpdCAqLwotCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKLQkJCQkmbGFiX2QtPnRocmVhZF9jb21wbGV0ZSwKLQkJCQlNU01fQ1BFX0xBQl9USFJFQURfVElNRU9VVCk7Ci0JCWlmICghcmMpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBXYWl0IGZvciBsYWIgdGhyZWFkIHRpbWVkb3V0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JfQotCi0JcmMgPSBsc21fb3BzLT5sYWJfY2hfc2V0dXAoY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkgICBzZXNzaW9uLAotCQkJCSAgIFdDRF9DUEVfUFJFX0RJU0FCTEUpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogUFJFIGNoIHRlYXJkb3duIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCS8qIGNvbnRpbnVlIHdpdGggdGVhcmRvd24gZXZlbiBpZiBhbnkgaW50ZXJtZWRpYXRlIHN0ZXAgZmFpbHMgKi8KLQlyYyA9IGRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwoZG1hX2RhdGEsIHJ0ZC0+Y3B1X2RhaSwgZmFsc2UpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogb3BlbiBkYXRhIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlkbWFfZGF0YS0+cGggPSAwOwotCi0JLyoKLQkgKiBFdmVuIHRob3VnaCBMQUIgc3RvcCBmYWlsZWQsCi0JICogb3V0cHV0IEFGRSBwb3J0IG5lZWRzIHRvIGJlIHN0b3BwZWQKLQkgKi8KLQlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X3N0b3AoY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkgICAgJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmcpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogQUZFIG91dCBwb3J0IHN0b3AgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQlyYyA9IGxzbV9vcHMtPmxhYl9jaF9zZXR1cChjcGUtPmNvcmVfaGFuZGxlLAotCQkJCSAgIHNlc3Npb24sCi0JCQkJICAgV0NEX0NQRV9QT1NUX0RJU0FCTEUpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogUE9TVCBjaCB0ZWFyZG93biBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQotZG9uZToKLQlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9TVE9QOwotCWxhYl9kLT5idWZfaWR4ID0gMDsKLQlhdG9taWNfc2V0KCZsYWJfZC0+aW5fY291bnQsIDApOwotCWxhYl9kLT5kbWFfd3JpdGUgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sYWJfYnVmX2FsbG9jKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uLAotCQlzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgKmRtYV9kYXRhKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgY3BlX2xzbV9sYWIgKmxhYl9kID0gJmxzbV9kLT5sYWI7Ci0Jc3RydWN0IGNwZV9od19wYXJhbXMgKmh3X3BhcmFtcyA9ICZsc21fZC0+aHdfcGFyYW1zOwotCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpwY21fYnVmID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBkbWFfYWxsb2MgPSAwOwotCXUzMiBjb3VudCA9IDA7Ci0JdTMyIGJ1ZnN6LCBidWZjbnQ7Ci0KLQlpZiAobGFiX2QtPnBjbV9idWYgJiYKLQkgICAgbGFiX2QtPnBjbV9idWYtPm1lbSkgewotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBMQUIgYnVmIGFscmVhZHkgYWxsb2NhdGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JYnVmc3ogPSBod19wYXJhbXMtPmJ1Zl9zejsKLQlidWZjbnQgPSBod19wYXJhbXMtPnBlcmlvZF9jb3VudDsKLQotCWRldl9kYmcocnRkLT5kZXYsCi0JCSIlczpCdWYgU2l6ZSAlZCBCdWYgY291bnQgJWRcbiIsCi0JCSBfX2Z1bmNfXywKLQkJYnVmc3osIGJ1ZmNudCk7Ci0KLQlwY21fYnVmID0ga3phbGxvYygoKHNpemVvZihzdHJ1Y3QgY3BlX2RhdGFfcGNtX2J1ZikpICogYnVmY250KSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY21fYnVmKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCWxhYl9kLT5wY21fYnVmID0gcGNtX2J1ZjsKLQlkbWFfYWxsb2MgPSBidWZzeiAqIGJ1ZmNudDsKLQlwY21fYnVmLT5tZW0gPSBOVUxMOwotCXBjbV9idWYtPm1lbSA9IGRtYV9hbGxvY19jb2hlcmVudChkbWFfZGF0YS0+c2Rldi0+ZGV2LnBhcmVudCwKLQkJCQkJICBkbWFfYWxsb2MsCi0JCQkJCSAgJihwY21fYnVmLT5waHlzKSwKLQkJCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjbV9idWYtPm1lbSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOkRNQSBhbGxvYyBmYWlsZWQgc2l6ZSA9ICV4XG4iLAotCQkJX19mdW5jX18sIGRtYV9hbGxvYyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQotCWNvdW50ID0gMDsKLQl3aGlsZSAoY291bnQgPCBidWZjbnQpIHsKLQkJcGNtX2J1Zltjb3VudF0ubWVtID0gcGNtX2J1ZlswXS5tZW0gKyAoY291bnQgKiBidWZzeik7Ci0JCXBjbV9idWZbY291bnRdLnBoeXMgPSBwY21fYnVmWzBdLnBoeXMgKyAoY291bnQgKiBidWZzeik7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IHBjbV9idWZbJWRdLm1lbSAlcEsgcGNtX2J1ZlslZF0ucGh5cyAlcEtcbiIsCi0JCQkgX19mdW5jX18sIGNvdW50LAotCQkJKHZvaWQgKilwY21fYnVmW2NvdW50XS5tZW0sCi0JCQljb3VudCwgJihwY21fYnVmW2NvdW50XS5waHlzKSk7Ci0JCWNvdW50Kys7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsOgotCWlmIChwY21fYnVmKSB7Ci0JCWlmIChwY21fYnVmLT5tZW0pCi0JCQlkbWFfZnJlZV9jb2hlcmVudChkbWFfZGF0YS0+c2Rldi0+ZGV2LnBhcmVudCwgZG1hX2FsbG9jLAotCQkJCQkgIHBjbV9idWYtPm1lbSwgcGNtX2J1Zi0+cGh5cyk7Ci0JCWtmcmVlKHBjbV9idWYpOwotCQlsYWJfZC0+cGNtX2J1ZiA9IE5VTEw7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sYWJfYnVmX2RlYWxsb2Moc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCXN0cnVjdCBjcGVfaHdfcGFyYW1zICpod19wYXJhbXMgPSAmbHNtX2QtPmh3X3BhcmFtczsKLQlpbnQgcmMgPSAwOwotCWludCBkbWFfYWxsb2MgPSAwOwotCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpwY21fYnVmID0gTlVMTDsKLQlpbnQgYnVmc3osIGJ1ZmNudDsKLQotCWJ1ZnN6ID0gaHdfcGFyYW1zLT5idWZfc3o7Ci0JYnVmY250ID0gaHdfcGFyYW1zLT5wZXJpb2RfY291bnQ7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkiJXM6QnVmIFNpemUgJWQgQnVmIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywKLQkJYnVmc3osIGJ1ZmNudCk7Ci0KLQlpZiAoYnVmY250IDw9IDAgfHwgYnVmc3ogPD0gMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtcywgYnVmc3ogPSAldSwgYnVmY250ID0gJXVcbiIsCi0JCQlfX2Z1bmNfXywgYnVmc3osIGJ1ZmNudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBjbV9idWYgPSBsYWJfZC0+cGNtX2J1ZjsKLQlkbWFfYWxsb2MgPSBidWZzeiAqIGJ1ZmNudDsKLQlpZiAoZG1hX2RhdGEgJiYgcGNtX2J1ZikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoZG1hX2RhdGEtPnNkZXYtPmRldi5wYXJlbnQsIGRtYV9hbGxvYywKLQkJCQkgIHBjbV9idWYtPm1lbSwgcGNtX2J1Zi0+cGh5cyk7Ci0Ja2ZyZWUocGNtX2J1Zik7Ci0JbGFiX2QtPnBjbV9idWYgPSBOVUxMOwotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIG1zbV9jcGVfbGFiX3RocmVhZDogSW5pdGlhdGVkIG9uIEtXIGRldGVjdGlvbgotICogQGRhdGE6IGxhYiBkYXRhCi0gKgotICogU3RhcnQgbGFiIHRocmVhZCBhbmQgY2FsbCBDUEUgY29yZSBBUEkgZm9yIFNMSU0KLSAqIHJlYWQgb3BlcmF0aW9ucy4KLSAqLwotc3RhdGljIGludCBtc21fY3BlX2xhYl90aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGRhdGE7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGxzbV9kLT5zdWJzdHJlYW07Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCXN0cnVjdCBjcGVfaHdfcGFyYW1zICpod19wYXJhbXMgPSAmbHNtX2QtPmh3X3BhcmFtczsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzOwotCXN0cnVjdCBjcGVfZGF0YV9wY21fYnVmICpjdXJfYnVmLCAqbmV4dF9idWY7Ci0Jc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IE5VTEw7Ci0JYm9vbCB3YWl0X3RpbWVkb3V0ID0gZmFsc2U7Ci0JaW50IHJjID0gMDsKLQl1MzIgZG9uZV9sZW4gPSAwOwotCXUzMiBidWZfY291bnQgPSAwOwotCXUzMiBwcmRfY250OwotCi0JYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IExhYiB0aHJlYWQgc3RhcnRcbiIsIF9fZnVuY19fKTsKLQlpbml0X2NvbXBsZXRpb24oJmxhYl9kLT5jb21wKTsKLQotCWlmIChQQ01fUlVOVElNRV9DSEVDSyhzdWJzdHJlYW0pKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7Ci0JCXByX2VycigiJXM6IEhhbmRsZSB0byAlcyBpcyBpbnZhbGlkXG4iLAotCQkJX19mdW5jX18sCi0JCQkoIWNwZSkgPyAiY3BlIiA6ICJjb3JlIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWlmIChydGQtPmNwdV9kYWkpCi0JCWRtYV9kYXRhID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwKLQkJCQkJc3Vic3RyZWFtKTsKLQlpZiAoIWRtYV9kYXRhIHx8ICFkbWFfZGF0YS0+ZGFpX2NoYW5uZWxfY3RsKSB7Ci0JCXByX2VycigiJXM6IGRtYV9kYXRhIGlzIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0JYWZlX29wcyA9ICZjcGUtPmFmZV9vcHM7Ci0KLQlyYyA9IGxzbV9vcHMtPmxhYl9jaF9zZXR1cChjcGUtPmNvcmVfaGFuZGxlLAotCQkJCSAgIHNlc3Npb24sCi0JCQkJICAgV0NEX0NQRV9QUkVfRU5BQkxFKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogUFJFIGNoIHNldHVwIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBkbWFfZGF0YS0+ZGFpX2NoYW5uZWxfY3RsKGRtYV9kYXRhLCBydGQtPmNwdV9kYWksIHRydWUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBvcGVuIGRhdGEgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGV2X2RiZyhydGQtPmRldiwgIiVzOiBFc3RhYmxpc2hlZCBkYXRhIGNoYW5uZWxcbiIsCi0JCV9fZnVuY19fKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxhYl9kLT5wZXJpb2Rfd2FpdCk7Ci0JbWVtc2V0KGxhYl9kLT5wY21fYnVmWzBdLm1lbSwgMCwgbGFiX2QtPnBjbV9zaXplKTsKLQotCXJjID0gc2xpbV9wb3J0X3hmZXIoZG1hX2RhdGEtPnNkZXYsIGRtYV9kYXRhLT5waCwKLQkJCSAgICBsYWJfZC0+cGNtX2J1ZlswXS5waHlzLAotCQkJICAgIGh3X3BhcmFtcy0+YnVmX3N6LCAmbGFiX2QtPmNvbXApOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBidWZbMF0gc2xpbV9wb3J0X3hmZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IHNsaW1fcG9ydF94ZmVyKGRtYV9kYXRhLT5zZGV2LCBkbWFfZGF0YS0+cGgsCi0JCQkgICAgbGFiX2QtPnBjbV9idWZbMV0ucGh5cywKLQkJCSAgICBod19wYXJhbXMtPmJ1Zl9zeiwgJmxhYl9kLT5jb21wKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogYnVmWzBdIHNsaW1fcG9ydF94ZmVyIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3VyX2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlswXTsKLQluZXh0X2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlsyXTsKLQlwcmRfY250ID0gaHdfcGFyYW1zLT5wZXJpb2RfY291bnQ7Ci0JcmMgPSBsc21fb3BzLT5sYWJfY2hfc2V0dXAoY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkgICBzZXNzaW9uLAotCQkJCSAgIFdDRF9DUEVfUE9TVF9FTkFCTEUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBQT1NUIGNoIHNldHVwIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9zdGFydChjcGUtPmNvcmVfaGFuZGxlLAotCQkJJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmcpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBBRkUgb3V0IHBvcnQgc3RhcnQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJgotCSAgICAgICBsYWJfZC0+dGhyZWFkX3N0YXR1cyAhPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1IpIHsKLQotCQlyYyA9IHNsaW1fcG9ydF94ZmVyKGRtYV9kYXRhLT5zZGV2LCBkbWFfZGF0YS0+cGgsCi0JCQkJICAgIG5leHRfYnVmLT5waHlzLAotCQkJCSAgICBod19wYXJhbXMtPmJ1Zl9zeiwgJmxhYl9kLT5jb21wKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogc2xpbV9wb3J0X3hmZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJbGFiX2QtPnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1I7Ci0JCX0KLQotCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGFiX2QtPmNvbXAsICgyICogSFovMTApKTsKLQkJaWYgKCFyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IHdhaXQgdGltZWRvdXQgZm9yIHNsaW0gYnVmZmVyXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXdhaXRfdGltZWRvdXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJd2FpdF90aW1lZG91dCA9IGZhbHNlOwotCQl9Ci0KLQkJcmMgPSBzbGltX3BvcnRfZ2V0X3hmZXJfc3RhdHVzKGRtYV9kYXRhLT5zZGV2LAotCQkJCQkgICAgICAgZG1hX2RhdGEtPnBoLAotCQkJCQkgICAgICAgJmN1cl9idWYtPnBoeXMsICZkb25lX2xlbik7Ci0JCWlmIChyYyB8fAotCQkgICAgKCFyYyAmJiB3YWl0X3RpbWVkb3V0KSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IHhmZXJfc3RhdHVzIGZhaWx1cmUsIHJjID0gJWQsIHdhaXRfdGltZWRvdXQgPSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgcmMsCi0JCQkJKHdhaXRfdGltZWRvdXQgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0JCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9FUlJPUjsKLQkJfQotCi0JCWlmIChkb25lX2xlbiB8fAotCQkgICAgKCghZG9uZV9sZW4pICYmCi0JCSAgICAgbGFiX2QtPnRocmVhZF9zdGF0dXMgPT0gTVNNX0xTTV9MQUJfVEhSRUFEX0VSUk9SKSkgewotCQkJYXRvbWljX2luYygmbGFiX2QtPmluX2NvdW50KTsKLQkJCWxhYl9kLT5kbWFfd3JpdGUgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0JCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0JCQl3YWtlX3VwKCZsYWJfZC0+cGVyaW9kX3dhaXQpOwotCQkJYnVmX2NvdW50Kys7Ci0KLQkJCWN1cl9idWYgPSAmbGFiX2QtPnBjbV9idWZbYnVmX2NvdW50ICUgcHJkX2NudF07Ci0JCQluZXh0X2J1ZiA9ICZsYWJfZC0+cGNtX2J1ZlsoYnVmX2NvdW50ICsgMikgJSBwcmRfY250XTsKLQkJCWRldl9kYmcocnRkLT5kZXYsCi0JCQkJIiVzOiBDdXIgYnVmLm1lbSA9ICVwSyBOZXh0IEJ1Zi5tZW0gPSAlcEtcbiIKLQkJCQkiIGJ1ZiBjb3VudCA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCWN1cl9idWYtPm1lbSwgbmV4dF9idWYtPm1lbSwgYnVmX2NvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBTQiBnZXQgc3RhdHVzLCBpbnZhbGlkIGxlbiA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGRvbmVfbGVuKTsKLQkJfQotCQlkb25lX2xlbiA9IDA7Ci0JfQotCi1kb25lOgotCWlmIChyYykKLQkJbGFiX2QtPnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfRVJST1I7Ci0JcHJfZGVidWcoIiVzOiBFeGl0IGxhYl90aHJlYWQsIGV4aXRfc3RhdHVzPSVkLCB0aHJlYWRfc3RhdHVzPSVkXG4iLAotCQkgX19mdW5jX18sIHJjLCBsYWJfZC0+dGhyZWFkX3N0YXR1cyk7Ci0JY29tcGxldGUoJmxhYl9kLT50aHJlYWRfY29tcGxldGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBtc21fY3BlX2xzbV9vcGVuOiBBU29DIGNhbGwgdG8gb3BlbiB0aGUgc3RyZWFtCi0gKiBAc3Vic3RyZWFtOiBzdWJzdHJlYW0gdGhhdCBpcyB0byBiZSBvcGVuZWQKLSAqCi0gKiBDcmVhdGUgc2Vzc2lvbiBkYXRhIGZvciBsc20gc2Vzc2lvbiBhbmQgb3BlbiB0aGUgbHNtIHNlc3Npb24KLSAqIG9uIENQRS4KLSAqLwotc3RhdGljIGludCBtc21fY3BlX2xzbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb2RlYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlX2xpc3RlbjsKLQotCXJjID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2Vycigic25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgZmFpbGVkIHJjICVkXG4iLCByYyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEVuc3VyZSB0aGF0IGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgcGVyaW9kIHNpemUgKi8KLQlyYyA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IFVuYWJsZSB0byBzZXQgcGNtX3BhcmFtX3BlcmlvZHMsIHJjICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmMgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCi0JCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCUxJU1RFTl9NSU5fTlVNX1BFUklPRFMgKiBMSVNURU5fTUlOX1BFUklPRF9TSVpFLAotCQlMSVNURU5fTUFYX05VTV9QRVJJT0RTICogTElTVEVOX01BWF9QRVJJT0RfU0laRSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gc2V0IHBjbSBjb25zdHJhaW50cywgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljcGUtPmNvcmVfaGFuZGxlID0gd2NkX2NwZV9nZXRfY29yZV9oYW5kbGUoY3BlLT5jb2RlYyk7Ci0KLQlpZiAoIWNwZS0+Y29yZV9oYW5kbGUpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBoYW5kbGUgdG8gY29kZWMgY29yZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0JbHNtX2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsc21fZCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBFTk9NRU0gZm9yIGxzbSBzZXNzaW9uLCBzaXplID0gJXpkXG4iLAotCQkJX19mdW5jX18sIHNpemVvZihzdHJ1Y3QgY3BlX2xzbV9kYXRhKSk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBmYWlsX3JldHVybjsKLQl9Ci0JbXV0ZXhfaW5pdCgmbHNtX2QtPmxzbV9hcGlfbG9jayk7Ci0KLQlsc21fZC0+bHNtX3Nlc3Npb24gPSBsc21fb3BzLT5sc21fYWxsb2Nfc2Vzc2lvbihjcGUtPmNvcmVfaGFuZGxlLAotCQkJCQlsc21fZCwgbXNtX2NwZV9wcm9jZXNzX2V2ZW50X3N0YXR1cyk7Ci0JaWYgKCFsc21fZC0+bHNtX3Nlc3Npb24pIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogc2Vzc2lvbiBhbGxvY2F0aW9uIGZhaWxlZCIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX3Nlc3Npb25fYWxsb2M7Ci0JfQotCS8qIEV4cGxpY2l0bHkgQXNzaWduIHRoZSBMQUIgdGhyZWFkIHRvIFNUT1Agc3RhdGUgKi8KLQlsc21fZC0+bGFiLnRocmVhZF9zdGF0dXMgPSBNU01fTFNNX0xBQl9USFJFQURfU1RPUDsKLQlsc21fZC0+bHNtX3Nlc3Npb24tPnN0YXJ0ZWQgPSBmYWxzZTsKLQlsc21fZC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxzbV9kLT5sYWIucGVyaW9kX3dhaXQpOwotCWxzbV9kLT5jcGVfcHJlcGFyZWQgPSBmYWxzZTsKLQotCWRldl9kYmcocnRkLT5kZXYsICIlczogYWxsb2NhdGVkIHNlc3Npb24gd2l0aCBpZCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgbHNtX2QtPmxzbV9zZXNzaW9uLT5pZCk7Ci0KLQotCXJjID0gbHNtX29wcy0+bHNtX29wZW5fdHgoY3BlLT5jb3JlX2hhbmRsZSwgbHNtX2QtPmxzbV9zZXNzaW9uLAotCQkJCSAgIExTTV9WT0lDRV9XQUtFVVBfQVBQX1YyLCAxNjAwMCk7Ci0JaWYgKHJjICA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogT1BFTl9UWCBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9vcGVuX3R4OwotCX0KLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxzbV9kLT5ldmVudF93YWl0KTsKLQlhdG9taWNfc2V0KCZsc21fZC0+ZXZlbnRfYXZhaWwsIDApOwotCWF0b21pY19zZXQoJmxzbV9kLT5ldmVudF9zdG9wLCAwKTsKLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBsc21fZDsKLQotCXJldHVybiAwOwotCi1mYWlsX29wZW5fdHg6Ci0JbHNtX29wcy0+bHNtX2RlYWxsb2Nfc2Vzc2lvbihjcGUtPmNvcmVfaGFuZGxlLCBsc21fZC0+bHNtX3Nlc3Npb24pOwotCi1mYWlsX3Nlc3Npb25fYWxsb2M6Ci0JbXV0ZXhfZGVzdHJveSgmbHNtX2QtPmxzbV9hcGlfbG9jayk7Ci0Ja2ZyZWUobHNtX2QpOwotZmFpbF9yZXR1cm46Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogbXNtX2NwZV9sc21fY2xvc2U6IEFTb0MgY2FsbCB0byBjbG9zZS9jbGVhbnVwIHRoZSBzdHJlYW0KLSAqIEBzdWJzdHJlYW06IHN1YnN0cmVhbSB0aGF0IGlzIHRvIGJlIGNsb3NlZAotICoKLSAqIERlYWxsb2NhdGUgdGhlIHNlc3Npb24gYW5kIHJlbGVhc2UgdGhlIEFGRSBwb3J0LiBJdCBpcyBub3QKLSAqIHJlcXVpcmVkIHRvIGRlcmVnaXN0ZXIgdGhlIHNvdW5kIG1vZGVsIGFzIGxvbmcgYXMgd2UgY2xvc2UKLSAqIHRoZSBsc20gc2Vzc2lvbiBvbiBDUEUuCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzOwotCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqYWZlX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFjcGUgfHwgIWNwZS0+Y29yZV9oYW5kbGUpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBwcml2YXRlIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghbHNtX2QgfHwgIWxzbV9kLT5sc21fc2Vzc2lvbikgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHNlc3Npb24gZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKLQlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7Ci0KLQkvKgotCSAqIElmIGRyaXZlciBpcyBjbG9zZWQgd2l0aG91dCBzdG9wcGluZyBMQUIsCi0JICogZXhwbGljaXRseSBzdG9wIExBQiBiZWZvcmUgY2xlYW5pbmcgdXAgdGhlCi0JICogZHJpdmVyIHJlc291cmNlcy4KLQkgKi8KLQlyYyA9IG1zbV9jcGVfbHNtX2xhYl9zdG9wKHN1YnN0cmVhbSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzdG9wIGxhYiwgZXJyb3IgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IG1zbV9jcGVfYWZlX3BvcnRfY250bChzdWJzdHJlYW0sCi0JCQkJICAgY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkgICBhZmVfb3BzLCBhZmVfY2ZnLAotCQkJCSAgIEFGRV9DTURfUE9SVF9TVE9QKTsKLQotCWxzbV9kLT5jcGVfcHJlcGFyZWQgPSBmYWxzZTsKLQotCXJjID0gbHNtX29wcy0+bHNtX2Nsb3NlX3R4KGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOwotCWlmIChyYyAhPSAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGxzbV9jbG9zZSBmYWlsLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlsc21fb3BzLT5sc21fZGVhbGxvY19zZXNzaW9uKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JbXV0ZXhfZGVzdHJveSgmbHNtX2QtPmxzbV9hcGlfbG9jayk7Ci0Ja2ZyZWUobHNtX2QpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX2dldF9jb25mX2xldmVscygKLQkJc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJdTggKmNvbmZfbGV2ZWxzX3B0cikKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyA8PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogY29uZl9sZXZlbHMgKCV1KSwgc2tpcCBzZXQgcGFyYW1zXG4iLAotCQkJIF9fZnVuY19fLAotCQkJc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKTsKLQkJZ290byBkb25lOwotCX0KLQotCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0ga3phbGxvYyhzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghc2Vzc2lvbi0+Y29uZl9sZXZlbHMpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHNlc3Npb24tPmNvbmZfbGV2ZWxzLAotCQkJICAgY29uZl9sZXZlbHNfcHRyLAotCQkJICAgc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKSkgewotCQlwcl9lcnIoIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQgZm9yIGNvbmZpZGVuY2UgbGV2ZWxzICV1XG4iLAotCQkJX19mdW5jX18sIHNlc3Npb24tPm51bV9jb25maWRlbmNlX2xldmVscyk7Ci0JCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKLQkJc2Vzc2lvbi0+Y29uZl9sZXZlbHMgPSBOVUxMOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX3ZhbGlkYXRlX291dF9mb3JtYXQoCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9sc21fb3V0cHV0X2Zvcm1hdF9jZmcgKmNmZykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWlmICghY2ZnKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgbHNtIG91dCBjZmdcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNmZy0+Zm9ybWF0ICE9IExTTV9PVVRfRk9STUFUX1BDTSAmJgotCSAgICBjZmctPmZvcm1hdCAhPSBMU01fT1VUX0ZPUk1BVF9BRFBDTSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGZvcm1hdCAldVxuIiwKLQkJCV9fZnVuY19fLCBjZmctPmZvcm1hdCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjZmctPnBhY2tpbmcgIT0gTFNNX09VVF9EQVRBX1JBVyAmJgotCSAgICBjZmctPnBhY2tpbmcgIT0gTFNNX09VVF9EQVRBX1BBQ0tFRCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhY2tpbmcgbWV0aG9kICV1XG4iLAotCQkJX19mdW5jX18sIGNmZy0+cGFja2luZyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjZmctPmV2ZW50cyAhPSBMU01fT1VUX0RBVEFfRVZFTlRTX0RJU0FCTEVEICYmCi0JICAgIGNmZy0+ZXZlbnRzICE9IExTTV9PVVRfREFUQV9FVkVOVFNfRU5BQkxFRCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGV2ZW50cyBwcm92aWRlZCAldVxuIiwKLQkJCV9fZnVuY19fLCBjZmctPmV2ZW50cyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjZmctPm1vZGUgIT0gTFNNX09VVF9UUkFOU0ZFUl9NT0RFX1JUICYmCi0JICAgIGNmZy0+bW9kZSAhPSBMU01fT1VUX1RSQU5TRkVSX01PREVfRlRSVCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHRyYW5zZmVyIG1vZGUgJXVcbiIsCi0JCQlfX2Z1bmNfXywgY2ZnLT5tb2RlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZDogU2hhcmVkIElPQ1RMIGZvciB0aGlzIHBsYXRmb3JtIGRyaXZlcgotICogQHN1YnN0cmVhbTogQVNvQyBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgaW52b2tlZAotICogQGNtZDogY29tbWFuZCBmb3IgdGhlIGlvY3RsCi0gKiBAYXJnOiBhcmd1bWVudCBmb3IgdGhlIGlvY3RsCi0gKgotICogUGVyZm9ybSBkZWRpY2F0ZWQgbGlzdGVuIGZ1bmN0aW9ucyBsaWtlIHJlZ2lzdGVyIHNvdW5kIG1vZGVsLAotICogZGVyZWdpc3RlciBzb3VuZCBtb2RlbCwgZXRjCi0gKiBDYWxsZWQgd2l0aCBsc21fYXBpX2xvY2sgYWNxdWlyZWQuCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiBzbmRfbW9kZWw7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0Jc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyBkZXRfcGFyYW1zOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOwotCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX0xTTV9TVE9QX0xBQjoKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogJXMsIGxhYl9lbmFibGUgPSAlZCwgbGFiX3RocmVhZF9zdHN0dXMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NUT1BfTEFCIiwKLQkJCXNlc3Npb24tPmxhYl9lbmFibGUsCi0JCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyk7Ci0KLQkJaWYgKHNlc3Npb24tPmxhYl9lbmFibGUgJiYKLQkJICAgIGxhYl9kLT50aHJlYWRfc3RhdHVzICE9IE1TTV9MU01fTEFCX1RIUkVBRF9TVE9QKSB7Ci0JCQlhdG9taWNfaW5jKCZsYWJfZC0+YWJvcnRfcmVhZCk7Ci0JCQl3YWtlX3VwKCZsYWJfZC0+cGVyaW9kX3dhaXQpOwotCQkJcmMgPSBtc21fY3BlX2xzbV9sYWJfc3RvcChzdWJzdHJlYW0pOwotCQkJaWYgKHJjKSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBzdG9wIExBQiBmYWlsZWQsIGVycm9yID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9IGVsc2UgaWYgKCFzZXNzaW9uLT5sYWJfZW5hYmxlKSB7Ci0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCSIlczogTEFCIGFscmVhZHkgc3RvcHBlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX0xBQl9DT05UUk9MOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNlc3Npb24tPmxhYl9lbmFibGUsICh2b2lkICopYXJnLAotCQkJCSAgIHNpemVvZih1MzIpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sIHNpemVvZih1MzIpKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogJXMsIGxhYl9lbmFibGUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0xBQl9DT05UUk9MIiwKLQkJCXNlc3Npb24tPmxhYl9lbmFibGUpOwotCQlpZiAocnRkLT5jcHVfZGFpKQotCQkJZG1hX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEocnRkLT5jcHVfZGFpLAotCQkJCQkJc3Vic3RyZWFtKTsKLQkJaWYgKCFkbWFfZGF0YSB8fCAhZG1hX2RhdGEtPmRhaV9jaGFubmVsX2N0bCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGRtYV9kYXRhIGlzIG5vdCBzZXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHNlc3Npb24tPmxhYl9lbmFibGUpIHsKLQkJCXJjID0gbXNtX2NwZV9sYWJfYnVmX2FsbG9jKHN1YnN0cmVhbSwKLQkJCQkJCSAgIHNlc3Npb24sIGRtYV9kYXRhKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IGxhYiBidWZmZXIgYWxsb2MgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0KLQkJCWRtYV9idWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOwotCQkJZG1hX2J1Zi0+ZGV2LmRldiA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXY7Ci0JCQlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCQkJZG1hX2J1Zi0+YXJlYSA9IGxhYl9kLT5wY21fYnVmWzBdLm1lbTsKLQkJCWRtYV9idWYtPmFkZHIgPSAgbGFiX2QtPnBjbV9idWZbMF0ucGh5czsKLQkJCWRtYV9idWYtPmJ5dGVzID0gKGxzbV9kLT5od19wYXJhbXMuYnVmX3N6ICoKLQkJCQkJbHNtX2QtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQpOwotCQkJaW5pdF9jb21wbGV0aW9uKCZsYWJfZC0+dGhyZWFkX2NvbXBsZXRlKTsKLQkJCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwKLQkJCQkJCSAgICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwotCQkJcmMgPSBsc21fb3BzLT5sc21fbGFiX2NvbnRyb2woY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkJc2Vzc2lvbiwgdHJ1ZSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBMYWIgRW5hYmxlIEZhaWxlZCByYyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQlyZXR1cm4gcmM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogSXQgaXMgcG9zc2libGUgdGhhdCBsYWIgaXMgc3RpbGwgZW5hYmxlZAotCQkJICogd2hlbiB0cnlpbmcgdG8gZGUtYWxsb2NhdGUgdGhlIGxhYiBidWZmZXIuCi0JCQkgKiBNYWtlIHN1cmUgdG8gZGlzYWJsZSBsYWIgYmVmb3JlIGRlLWFsbG9jYXRpbmcKLQkJCSAqIHRoZSBsYWIgYnVmZmVyLgotCQkJICovCi0JCQlyYyA9IG1zbV9jcGVfbHNtX2xhYl9zdG9wKHN1YnN0cmVhbSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBMQUIgc3RvcCBmYWlsZWQsIGVycm9yID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQkJLyoKLQkJCSAqIEJ1ZmZlciBoYXMgdG8gYmUgZGUtYWxsb2NhdGVkIGV2ZW4gaWYKLQkJCSAqIGxhYl9jb250cm9sIGZhaWxlZC4KLQkJCSAqLwotCQkJcmMgPSBtc21fY3BlX2xhYl9idWZfZGVhbGxvYyhzdWJzdHJlYW0sCi0JCQkJCQkgICAgIHNlc3Npb24sIGRtYV9kYXRhKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IGxhYiBidWZmZXIgZnJlZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQkJfQotCWJyZWFrOwotCWNhc2UgU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjI6Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6ICVzXG4iLAotCQkJX19mdW5jX18sICJTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMiIpOwotCi0JCW1lbWNweSgmc25kX21vZGVsLCBhcmcsCi0JCQlzaXplb2Yoc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIpKTsKLQotCQlzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQotCQkJCXNuZF9tb2RlbC5udW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JCXJjID0gbXNtX2NwZV9sc21fZ2V0X2NvbmZfbGV2ZWxzKHNlc3Npb24sCi0JCQkJc25kX21vZGVsLmNvbmZpZGVuY2VfbGV2ZWwpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlcyBnZXRfY29uZl9sZXZlbHMgZmFpbCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sICJTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMiIsCi0JCQkJcmMpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSA9IGt6YWxsb2Moc25kX21vZGVsLmRhdGFfc2l6ZSwKLQkJCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEpIHsKLQkJCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKLQkJCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0gTlVMTDsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXNlc3Npb24tPnNuZF9tb2RlbF9zaXplID0gc25kX21vZGVsLmRhdGFfc2l6ZTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEsCi0JCQkJICAgc25kX21vZGVsLmRhdGEsIHNuZF9tb2RlbC5kYXRhX3NpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkIGZvciBzbmRfbW9kZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJa2ZyZWUoc2Vzc2lvbi0+Y29uZl9sZXZlbHMpOwotCQkJa2ZyZWUoc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEpOwotCQkJc2Vzc2lvbi0+Y29uZl9sZXZlbHMgPSBOVUxMOwotCQkJc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSBOVUxMOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlyYyA9IGxzbV9vcHMtPmxzbV9zaG1lbV9hbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uLAotCQkJCQkgICAgICAgc2Vzc2lvbi0+c25kX21vZGVsX3NpemUpOwotCQlpZiAocmMgIT0gMCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCQlrZnJlZShzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSk7Ci0JCQlrZnJlZShzZXNzaW9uLT5jb25mX2xldmVscyk7Ci0JCQlzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSA9IE5VTEw7Ci0JCQlzZXNzaW9uLT5jb25mX2xldmVscyA9IE5VTEw7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlyYyA9IGxzbV9vcHMtPmxzbV9yZWdpc3Rlcl9zbmRfbW9kZWwoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbiwKLQkJCQkJCXNuZF9tb2RlbC5kZXRlY3Rpb25fbW9kZSwKLQkJCQkJCXNuZF9tb2RlbC5kZXRlY3RfZmFpbHVyZSk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogc25kX21vZGVsX3JlZyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCQlsc21fb3BzLT5sc21fc2htZW1fZGVhbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uKTsKLQkJCWtmcmVlKHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKTsKLQkJCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKLQkJCXNlc3Npb24tPnNuZF9tb2RlbF9kYXRhID0gTlVMTDsKLQkJCXNlc3Npb24tPmNvbmZfbGV2ZWxzID0gTlVMTDsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fREVSRUdfU05EX01PREVMOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiAlc1xuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0RFUkVHX1NORF9NT0RFTCIpOwotCi0JCWlmIChzZXNzaW9uLT5sYWJfZW5hYmxlKSB7Ci0JCQkvKgotCQkJICogSXQgaXMgcG9zc2libGUgdGhhdCBsYWIgaXMgc3RpbGwgZW5hYmxlZAotCQkJICogd2hlbiB0cnlpbmcgdG8gZGVyZWdpc3RlciBzb3VuZCBtb2RlbC4KLQkJCSAqIE1ha2Ugc3VyZSB0byBkaXNhYmxlIGxhYiBiZWZvcmUgZGUtYWxsb2NhdGluZwotCQkJICogdGhlIGxhYiBidWZmZXIuCi0JCQkgKi8KLQkJCXJjID0gbXNtX2NwZV9sc21fbGFiX3N0b3Aoc3Vic3RyZWFtKTsKLQkJCWlmIChyYykgewotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogTEFCIHN0b3AgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJCXJldHVybiByYzsKLQkJCX0KLQotCQkJcmMgPSBsc21fb3BzLT5sc21fbGFiX2NvbnRyb2woY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkJc2Vzc2lvbiwgZmFsc2UpOwotCQkJaWYgKHJjKQotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogTGFiIERpc2FibGUgRmFpbGVkIHJjICVkXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCi0JCQlkbWFfZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kbWFfZGF0YShydGQtPmNwdV9kYWksCi0JCQkJCQkJc3Vic3RyZWFtKTsKLQkJCWlmICghZG1hX2RhdGEgfHwgIWRtYV9kYXRhLT5kYWlfY2hhbm5lbF9jdGwpCi0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBkbWFfZGF0YSBpcyBub3Qgc2V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCS8qCi0JCQkgKiBCdWZmZXIgaGFzIHRvIGJlIGRlLWFsbG9jYXRlZCBldmVuIGlmCi0JCQkgKiBsYWJfY29udHJvbCBmYWlsZWQgYW5kL29yIGRtYSBkYXRhIGlzIGludmFsaWQuCi0JCQkgKi8KLQkJCXJjID0gbXNtX2NwZV9sYWJfYnVmX2RlYWxsb2Moc3Vic3RyZWFtLAotCQkJCQkJc2Vzc2lvbiwgZG1hX2RhdGEpOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IGxhYiBidWZmZXIgZnJlZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQl9Ci0KLQkJcmMgPSBsc21fb3BzLT5sc21fZGVyZWdpc3Rlcl9zbmRfbW9kZWwoCi0JCQkJY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbik7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogc25kX21vZGVsIGRlLXJlZyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlrZnJlZShzZXNzaW9uLT5zbmRfbW9kZWxfZGF0YSk7Ci0JCWtmcmVlKHNlc3Npb24tPmNvbmZfbGV2ZWxzKTsKLQkJc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSBOVUxMOwotCQlzZXNzaW9uLT5jb25mX2xldmVscyA9IE5VTEw7Ci0KLQkJcmMgPSBsc21fb3BzLT5sc21fc2htZW1fZGVhbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uKTsKLQkJaWYgKHJjICE9IDApIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBMU00gc2hhcmVkIG1lbW9yeSBkZWFsbG9jIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOgotCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVU19WMzogewotCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKnVzZXI7Ci0JCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MyAqdXNlcl92MzsKLQotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiAlc1xuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0VWRU5UX1NUQVRVUyhfVjMpIik7Ci0JCWlmICghYXJnKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogSW52YWxpZCBhcmd1bWVudCB0byBpb2N0bCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQkiU05EUlZfTFNNX0VWRU5UX1NUQVRVUyhfVjMpIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCS8qCi0JCSAqIFJlbGVhc2UgdGhlIGFwaSBsb2NrIGJlZm9yZSB3YWl0IHRvIGFsbG93Ci0JCSAqIG90aGVyIElPQ1RMcyB0byBiZSBpbnZva2VkIHdoaWxlIHdhaXRpbmcKLQkJICogZm9yIGV2ZW50Ci0JCSAqLwotCQlNU01fQ1BFX0xTTV9SRUxfTE9DSygmbHNtX2QtPmxzbV9hcGlfbG9jaywKLQkJCQkgICAgICJsc21fYXBpX2xvY2siKTsKLQotCQlyYyA9IHdhaXRfZXZlbnRfZnJlZXphYmxlKGxzbV9kLT5ldmVudF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmbHNtX2QtPmV2ZW50X2F2YWlsKSA9PSAxKSB8fAotCQkJCShhdG9taWNfcmVhZCgmbHNtX2QtPmV2ZW50X3N0b3ApID09IDEpKTsKLQotCQlNU01fQ1BFX0xTTV9HUkFCX0xPQ0soJmxzbV9kLT5sc21fYXBpX2xvY2ssCi0JCQkJICAgICAgImxzbV9hcGlfbG9jayIpOwotCi0JCWlmICghcmMpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmbHNtX2QtPmV2ZW50X2F2YWlsKSA9PSAxKSB7Ci0JCQkJcmMgPSAwOwotCQkJCWF0b21pY19zZXQoJmxzbV9kLT5ldmVudF9hdmFpbCwgMCk7Ci0KLQkJCQlpZiAoY21kID09IFNORFJWX0xTTV9FVkVOVF9TVEFUVVMpIHsKLQkJCQkJdXNlciA9IGFyZzsKLQkJCQkJaWYgKGxzbV9kLT5ldl9kZXRfcGxkX3NpemUgPgotCQkJCQkJdXNlci0+cGF5bG9hZF9zaXplKSB7Ci0JCQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkJCSIlczogYXZhaWwgcGxkX2J5dGVzID0gJXUsIG5lZWRlZCA9ICV1XG4iLAotCQkJCQkJCV9fZnVuY19fLAotCQkJCQkJCXVzZXItPnBheWxvYWRfc2l6ZSwKLQkJCQkJCQlsc21fZC0+ZXZfZGV0X3BsZF9zaXplKTsKLQkJCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCQl9Ci0KLQkJCQkJdXNlci0+c3RhdHVzID0gbHNtX2QtPmV2X2RldF9zdGF0dXM7Ci0JCQkJCXVzZXItPnBheWxvYWRfc2l6ZSA9Ci0JCQkJCQkJbHNtX2QtPmV2X2RldF9wbGRfc2l6ZTsKLQkJCQkJbWVtY3B5KHVzZXItPnBheWxvYWQsCi0JCQkJCSAgICAgICBsc21fZC0+ZXZfZGV0X3BheWxvYWQsCi0JCQkJCSAgICAgICBsc21fZC0+ZXZfZGV0X3BsZF9zaXplKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2VyX3YzID0gYXJnOwotCQkJCQlpZiAobHNtX2QtPmV2X2RldF9wbGRfc2l6ZSA+Ci0JCQkJCQl1c2VyX3YzLT5wYXlsb2FkX3NpemUpIHsKLQkJCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCQkJIiVzOiBhdmFpbCBwbGRfYnl0ZXMgPSAldSwgbmVlZGVkID0gJXVcbiIsCi0JCQkJCQkJX19mdW5jX18sCi0JCQkJCQkJdXNlcl92My0+cGF5bG9hZF9zaXplLAotCQkJCQkJCWxzbV9kLT5ldl9kZXRfcGxkX3NpemUpOwotCQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJCX0KLQkJCQkJLyogZXZlbnQgc3RhdHVzIHRpbWVzdGFtcCBub3Qgc3VwcG9ydGVkCi0JCQkJCSAqIG9uIENQRSBtb2RlLiBTZXQgbXN3IGFuZCBsc3cgdG8gMC4KLQkJCQkJICovCi0JCQkJCXVzZXJfdjMtPnRpbWVzdGFtcF9sc3cgPSAwOwotCQkJCQl1c2VyX3YzLT50aW1lc3RhbXBfbXN3ID0gMDsKLQkJCQkJdXNlcl92My0+c3RhdHVzID0gbHNtX2QtPmV2X2RldF9zdGF0dXM7Ci0JCQkJCXVzZXJfdjMtPnBheWxvYWRfc2l6ZSA9Ci0JCQkJCQkJbHNtX2QtPmV2X2RldF9wbGRfc2l6ZTsKLQkJCQkJbWVtY3B5KHVzZXJfdjMtPnBheWxvYWQsCi0JCQkJCSAgICAgICBsc21fZC0+ZXZfZGV0X3BheWxvYWQsCi0JCQkJCSAgICAgICBsc21fZC0+ZXZfZGV0X3BsZF9zaXplKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZsc21fZC0+ZXZlbnRfc3RvcCkgPT0gMSkgewotCQkJCWRldl9kYmcocnRkLT5kZXYsCi0JCQkJCSIlczogd2FpdF9hYm9ydGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJaWYgKGNtZCA9PSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTKSB7Ci0JCQkJCXVzZXIgPSBhcmc7Ci0JCQkJCXVzZXItPnBheWxvYWRfc2l6ZSA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNlcl92MyA9IGFyZzsKLQkJCQkJdXNlcl92My0+cGF5bG9hZF9zaXplID0gMDsKLQkJCQl9Ci0JCQkJcmMgPSAwOwotCQkJfQotCQl9Ci0JfQotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX0FCT1JUX0VWRU5UOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiAlc1xuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0FCT1JUX0VWRU5UIik7Ci0JCWF0b21pY19zZXQoJmxzbV9kLT5ldmVudF9zdG9wLCAxKTsKLQkJd2FrZV91cCgmbHNtX2QtPmV2ZW50X3dhaXQpOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX1NUQVJUOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiAlc1xuIiwKLQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NUQVJUIik7Ci0JCXJjID0gbHNtX29wcy0+bHNtX3N0YXJ0KGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOwotCQlpZiAocmMgIT0gMCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGxzbV9zdGFydCBmYWlsLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXNlc3Npb24tPnN0YXJ0ZWQgPSB0cnVlOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX1NUT1A6Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6ICVzLCBsYWJfZW5hYmxlID0gJWQsIGxhYl90aHJlYWRfc3RhdHVzID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TVE9QIiwKLQkJCXNlc3Npb24tPmxhYl9lbmFibGUsCi0JCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyk7Ci0JCWlmICgoc2Vzc2lvbi0+bGFiX2VuYWJsZSAmJgotCQkgICAgIGxhYl9kLT50aHJlYWRfc3RhdHVzID09Ci0JCSAgICAgTVNNX0xTTV9MQUJfVEhSRUFEX1JVTk5JTkcpKSB7Ci0JCQkvKiBFeHBsaWNpdGx5IHN0b3AgTEFCICovCi0JCQlyYyA9IG1zbV9jcGVfbHNtX2xhYl9zdG9wKHN1YnN0cmVhbSk7Ci0JCQlpZiAocmMpIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IGxhYl9zdG9wIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0KLQkJcmMgPSBsc21fb3BzLT5sc21fc3RvcChjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uKTsKLQkJaWYgKHJjICE9IDApIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBsc21fc3RvcCBmYWlsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0KLQkJCXJldHVybiByYzsKLQkJfQotCQlzZXNzaW9uLT5zdGFydGVkID0gZmFsc2U7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNUzoKLQkJbWVtY3B5KCZkZXRfcGFyYW1zLCBhcmcsCi0JCQlzaXplb2YoZGV0X3BhcmFtcykpOwotCQlpZiAoZGV0X3BhcmFtcy5udW1fY29uZmlkZW5jZV9sZXZlbHMgPD0gMCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBJbnZhbGlkIGNvbmZpZGVuY2UgbGV2ZWxzICV1XG4iLAotCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiLAotCQkJCWRldF9wYXJhbXMubnVtX2NvbmZpZGVuY2VfbGV2ZWxzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJc2Vzc2lvbi0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzID0KLQkJCQlkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVsczsKLQkJcmMgPSBtc21fY3BlX2xzbV9nZXRfY29uZl9sZXZlbHMoc2Vzc2lvbiwKLQkJCQkJCWRldF9wYXJhbXMuY29uZl9sZXZlbCk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzIGdldF9jb25mX2xldmVscyBmYWlsLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TRVRfUEFSQU1TIiwKLQkJCQlyYyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJjID0gbHNtX29wcy0+bHNtX3NldF9kYXRhKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24sCi0JCQkJCSAgIGRldF9wYXJhbXMuZGV0ZWN0X21vZGUsCi0JCQkJCSAgIGRldF9wYXJhbXMuZGV0ZWN0X2ZhaWx1cmUpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBsc21fc2V0X2RhdGEgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJa2ZyZWUoc2Vzc2lvbi0+Y29uZl9sZXZlbHMpOwotCQlzZXNzaW9uLT5jb25mX2xldmVscyA9IE5VTEw7Ci0KLQkJYnJlYWs7Ci0KLQkJY2FzZSBTTkRSVl9MU01fT1VUX0ZPUk1BVF9DRkc6IHsKLQkJCXN0cnVjdCBzbmRfbHNtX291dHB1dF9mb3JtYXRfY2ZnIHVfZm10X2NmZzsKLQotCQkJaWYgKCFhcmcpIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IEludmFsaWQgYXJndW1lbnQgdG8gaW9jdGwgJXNcbiIsCi0JCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX09VVF9GT1JNQVRfQ0ZHIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdV9mbXRfY2ZnLCBhcmcsCi0JCQkJCSAgIHNpemVvZih1X2ZtdF9jZmcpKSkgewotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkIGZvciBvdXRfZm10X2NmZ1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCi0JCQlpZiAobXNtX2NwZV9sc21fdmFsaWRhdGVfb3V0X2Zvcm1hdChzdWJzdHJlYW0sCi0JCQkJCQkJICAgICZ1X2ZtdF9jZmcpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzZXNzaW9uLT5vdXRfZm10X2NmZy5mb3JtYXQgPSB1X2ZtdF9jZmcuZm9ybWF0OwotCQkJc2Vzc2lvbi0+b3V0X2ZtdF9jZmcucGFja19tb2RlID0gdV9mbXRfY2ZnLnBhY2tpbmc7Ci0JCQlzZXNzaW9uLT5vdXRfZm10X2NmZy5kYXRhX3BhdGhfZXZlbnRzID0KLQkJCQkJCXVfZm10X2NmZy5ldmVudHM7Ci0JCQlzZXNzaW9uLT5vdXRfZm10X2NmZy50cmFuc2Zlcl9tb2RlID0gdV9mbXRfY2ZnLm1vZGU7Ci0KLQkJCXJjID0gbHNtX29wcy0+bHNtX3NldF9mbXRfY2ZnKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJCQkgICAgICBzZXNzaW9uKTsKLQkJCWlmIChyYykgewotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogbHNtX3NldF9mbXRfY2ZnIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fU0VUX1BPUlQ6IHsKLQkJdTMyIHBvcnRfaWQgPSBjcGUtPmlucHV0X3BvcnRfaWQ7Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiAlc1xuIiwgX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BPUlQiKTsKLQkJcmMgPSBsc21fb3BzLT5sc21fc2V0X3BvcnQoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbiwgJnBvcnRfaWQpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBsc21fc2V0X3BvcnQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogRGVmYXVsdCBzbmRfbGliX2lvY3RsIGNtZCAweCV4XG4iLAotCQkJX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gc25kX3BjbV9saWJfaW9jdGwoc3Vic3RyZWFtLCBjbWQsIGFyZyk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX2xhYl9zdGFydChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJdTE2IGV2ZW50X2RldF9zdGF0dXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX2xhYiAqbGFiX2QgPSBOVUxMOwotCXN0cnVjdCBjcGVfaHdfcGFyYW1zICpod19wYXJhbXM7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfb3BzICphZmVfb3BzOwotCXN0cnVjdCB3Y2RfY3BlX2FmZV9wb3J0X2NmZyAqb3V0X3BvcnQ7Ci0JaW50IHJjOwotCi0JaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc3Vic3RyZWFtICglcEspXG4iLAotCQkJX19mdW5jX18sIHN1YnN0cmVhbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOwotCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOwotCWxhYl9kID0gJmxzbV9kLT5sYWI7Ci0JYWZlX29wcyA9ICZjcGUtPmFmZV9vcHM7Ci0JaHdfcGFyYW1zID0gJmxzbV9kLT5od19wYXJhbXM7Ci0KLQlpZiAoIXNlc3Npb24tPnN0YXJ0ZWQpIHsKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogU2Vzc2lvbiBpcyBzdG9wcGVkLCBjYW5ub3Qgc3RhcnQgTEFCXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZWluaXRfY29tcGxldGlvbigmbGFiX2QtPnRocmVhZF9jb21wbGV0ZSk7Ci0KLQlpZiAoc2Vzc2lvbi0+bGFiX2VuYWJsZSAmJgotCSAgICBldmVudF9kZXRfc3RhdHVzID09Ci0JICAgIExTTV9WT0lDRV9XQUtFVVBfU1RBVFVTX0RFVEVDVEVEKSB7Ci0JCW91dF9wb3J0ID0gJnNlc3Npb24tPmFmZV9vdXRfcG9ydF9jZmc7Ci0JCW91dF9wb3J0LT5wb3J0X2lkID0gc2Vzc2lvbi0+YWZlX291dF9wb3J0X2lkOwotCQlvdXRfcG9ydC0+Yml0X3dpZHRoID0gaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZTsKLQkJb3V0X3BvcnQtPm51bV9jaGFubmVscyA9IGh3X3BhcmFtcy0+Y2hhbm5lbHM7Ci0JCW91dF9wb3J0LT5zYW1wbGVfcmF0ZSA9IGh3X3BhcmFtcy0+c2FtcGxlX3JhdGU7Ci0JCWRldl9kYmcocnRkLT5kZXYsICIlczogcG9ydF9pZD0gJXUsIGJpdF93aWR0aD0gJXUsIHJhdGU9ICV1XG4iLAotCQkJIF9fZnVuY19fLCBvdXRfcG9ydC0+cG9ydF9pZCwgb3V0X3BvcnQtPmJpdF93aWR0aCwKLQkJCW91dF9wb3J0LT5zYW1wbGVfcmF0ZSk7Ci0KLQkJcmMgPSBhZmVfb3BzLT5hZmVfcG9ydF9jbWRfY2ZnKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJCSAgICAgICBvdXRfcG9ydCk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCBhZmUgZ2VuZXJpYyBjb25maWcgdjIsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlhdG9taWNfc2V0KCZsYWJfZC0+YWJvcnRfcmVhZCwgMCk7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IEtXIGRldGVjdGVkLCBzY2hlZHVsaW5nIExBQiB0aHJlYWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJLyoKLQkJICogRXZlbiB0aG91Z2ggdGhyZWFkIG1pZ2h0IGJlIG9ubHkgc2NoZWR1bGVkIGFuZAotCQkgKiBub3QgY3VycmVudGx5IHJ1bm5pbmcsIG1hcmsgdGhlIGludGVybmFsIGRyaXZlcgotCQkgKiBzdGF0dXMgdG8gcnVubmluZyBzbyBkcml2ZXIgY2FuIGNhbmNlbCB0aGlzIHRocmVhZAotCQkgKiBpZiBpdCBuZWVkcyB0byBiZWZvcmUgdGhlIHRocmVhZCBnZXRzIGNoYW5jZSB0byBydW4uCi0JCSAqLwotCQlsYWJfZC0+dGhyZWFkX3N0YXR1cyA9IE1TTV9MU01fTEFCX1RIUkVBRF9SVU5OSU5HOwotCQlzZXNzaW9uLT5sc21fbGFiX3RocmVhZCA9IGt0aHJlYWRfcnVuKAotCQkJCW1zbV9jcGVfbGFiX3RocmVhZCwKLQkJCQlsc21fZCwKLQkJCQkibGFiX3RocmVhZCIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBtc21fY3BlX2xzbV9pc192YWxpZF9zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCWNvbnN0IGNoYXIgKmZ1bmMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0KLQlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzdWJzdHJlYW0gKCVwSylcbiIsCi0JCQlmdW5jLCBzdWJzdHJlYW0pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7Ci0JY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQotCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLAotCQkJZnVuYyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoIWxzbV9kIHx8ICFsc21fZC0+bHNtX3Nlc3Npb24pIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCi0JCQlmdW5jKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0KLQlpZiAoIWxzbV9vcHMpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBsc21fb3BzXG4iLCBmdW5jKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX3NldF9lcGQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlzdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgZXBkX3RocmVzOwotCWludCByYzsKLQotCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGVwZF90aHJlcykpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZXBkX3RocmVzLCBwX2luZm8tPnBhcmFtX2RhdGEsCi0JCQkgICBwX2luZm8tPnBhcmFtX3NpemUpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0oY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQlzZXNzaW9uLCBwX2luZm8sICZlcGRfdGhyZXMsCi0JCQkJTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQpOwotCWlmICh1bmxpa2VseShyYykpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IHNldF9vbmVfcGFyYW0oZXBkX3RocmVzaG9sZCkgZmFpbGVkLCByYyAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY3BlX2xzbV9zZXRfbW9kZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0Jc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBOVUxMOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOwotCXN0cnVjdCBzbmRfbHNtX2RldGVjdF9tb2RlIGRldF9tb2RlOwotCWludCByYzsKLQotCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGRldF9tb2RlKSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtX3NpemUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfbW9kZSwgcF9pbmZvLT5wYXJhbV9kYXRhLAotCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJc2Vzc2lvbiwgcF9pbmZvLCAmZGV0X21vZGUsCi0JCQkJTFNNX09QRVJBVElPTl9NT0RFKTsKLQlpZiAodW5saWtlbHkocmMpKQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBzZXRfb25lX3BhcmFtKGVwZF90aHJlc2hvbGQpIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2dhaW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlzdHJ1Y3Qgc25kX2xzbV9nYWluIGdhaW47Ci0JaW50IHJjOwotCi0JaWYgKCFtc21fY3BlX2xzbV9pc192YWxpZF9zdHJlYW0oc3Vic3RyZWFtLCBfX2Z1bmNfXykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7Ci0JY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOwotCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOwotCi0JaWYgKHBfaW5mby0+cGFyYW1fc2l6ZSAhPSBzaXplb2YoZ2FpbikpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZ2FpbiwgcF9pbmZvLT5wYXJhbV9kYXRhLAotCQkJICAgcF9pbmZvLT5wYXJhbV9zaXplKSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJc2Vzc2lvbiwgcF9pbmZvLCAmZ2FpbiwKLQkJCQlMU01fR0FJTik7Ci0JaWYgKHVubGlrZWx5KHJjKSkKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogc2V0X29uZV9wYXJhbShlcGRfdGhyZXNob2xkKSBmYWlsZWQsIHJjICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2NvbmYoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlpbnQgcmM7Ci0KLQlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKLQljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOwotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0KLQlzZXNzaW9uLT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQotCQkJcF9pbmZvLT5wYXJhbV9zaXplOwotCXJjID0gbXNtX2NwZV9sc21fZ2V0X2NvbmZfbGV2ZWxzKHNlc3Npb24sCi0JCQlwX2luZm8tPnBhcmFtX2RhdGEpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBnZXRfY29uZl9sZXZlbHMgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJc2Vzc2lvbiwgcF9pbmZvLCBOVUxMLAotCQkJCUxTTV9NSU5fQ09ORklERU5DRV9MRVZFTFMpOwotCWlmICh1bmxpa2VseShyYykpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IHNldF9vbmVfcGFyYW0oY29uZl9sZXZlbHMpIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fcmVnX21vZGVsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0JaW50IHJjOwotCXNpemVfdCBvZmZzZXQ7Ci0JdTggKnNuZF9tb2RlbF9wdHI7Ci0KLQlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKLQljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOwotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0KLQlsc21fb3BzLT5sc21fZ2V0X3NuZF9tb2RlbF9vZmZzZXQoY3BlLT5jb3JlX2hhbmRsZSwKLQkJCXNlc3Npb24sICZvZmZzZXQpOwotCS8qIENoZWNrIGlmICdwX2luZm8tPnBhcmFtX3NpemUgKyBvZmZzZXQnIGNyb3NzZXMgVTMyX01BWC4gKi8KLQlpZiAocF9pbmZvLT5wYXJhbV9zaXplID4gVTMyX01BWCAtIG9mZnNldCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtX3NpemUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXNlc3Npb24tPnNuZF9tb2RlbF9zaXplID0gcF9pbmZvLT5wYXJhbV9zaXplICsgb2Zmc2V0OwotCi0Jc2Vzc2lvbi0+c25kX21vZGVsX2RhdGEgPSB2emFsbG9jKHNlc3Npb24tPnNuZF9tb2RlbF9zaXplKTsKLQlpZiAoIXNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNuZF9tb2RlbF9wdHIgPSAoKHU4ICopIHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKSArIG9mZnNldDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihzbmRfbW9kZWxfcHRyLAotCQkJICAgcF9pbmZvLT5wYXJhbV9kYXRhLCBwX2luZm8tPnBhcmFtX3NpemUpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZvciBzbmRfbW9kZWwgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gZnJlZV9zbmRfbW9kZWxfZGF0YTsKLQl9Ci0KLQlyYyA9IGxzbV9vcHMtPmxzbV9zaG1lbV9hbGxvYyhjcGUtPmNvcmVfaGFuZGxlLCBzZXNzaW9uLAotCQkJCSAgICAgIHNlc3Npb24tPnNuZF9tb2RlbF9zaXplKTsKLQlpZiAocmMgIT0gMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX3NuZF9tb2RlbF9kYXRhOwotCX0KLQotCXJjID0gbHNtX29wcy0+bHNtX3NldF9vbmVfcGFyYW0oY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQlzZXNzaW9uLCBwX2luZm8sIE5VTEwsCi0JCQkJTFNNX1JFR19TTkRfTU9ERUwpOwotCWlmICh1bmxpa2VseShyYykpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogc2V0X29uZV9wYXJhbShzbmRfbW9kZWwpIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRlYWxsb2Nfc2htZW07Ci0JfQotCXJldHVybiAwOwotCi1kZWFsbG9jX3NobWVtOgotCWxzbV9vcHMtPmxzbV9zaG1lbV9kZWFsbG9jKGNwZS0+Y29yZV9oYW5kbGUsIHNlc3Npb24pOwotCi1mcmVlX3NuZF9tb2RlbF9kYXRhOgotCXZmcmVlKHNlc3Npb24tPnNuZF9tb2RlbF9kYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fZGVyZWdfbW9kZWwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7Ci0Jc3RydWN0IHdjZF9jcGVfbHNtX29wcyAqbHNtX29wczsKLQlpbnQgcmM7Ci0KLQlpZiAoIW1zbV9jcGVfbHNtX2lzX3ZhbGlkX3N0cmVhbShzdWJzdHJlYW0sIF9fZnVuY19fKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKLQljcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOwotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0KLQlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfb25lX3BhcmFtKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJc2Vzc2lvbiwgcF9pbmZvLCBOVUxMLAotCQkJCUxTTV9ERVJFR19TTkRfTU9ERUwpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogZGVyZWdfc25kX21vZGVsIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQlyZXR1cm4gbHNtX29wcy0+bHNtX3NobWVtX2RlYWxsb2MoY3BlLT5jb3JlX2hhbmRsZSwgc2Vzc2lvbik7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fc2V0X2N1c3RvbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0Jc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBOVUxMOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOwotCXU4ICpkYXRhOwotCWludCByYzsKLQotCWlmICghbXNtX2NwZV9sc21faXNfdmFsaWRfc3RyZWFtKHN1YnN0cmVhbSwgX19mdW5jX18pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgPiBNU01fQ1BFX01BWF9DVVNUT01fUEFSQU1fU0laRSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBpbnZhbGlkIHNpemUgJWQsIG1heCBhbGxvd2VkICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSwKLQkJCU1TTV9DUEVfTUFYX0NVU1RPTV9QQVJBTV9TSVpFKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGF0YSA9IGt6YWxsb2MocF9pbmZvLT5wYXJhbV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHBfaW5mby0+cGFyYW1fZGF0YSwKLQkJCSAgIHBfaW5mby0+cGFyYW1fc2l6ZSkpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkIGZvciBjdXN0b20gcGFyYW1zLCBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCi0JcmMgPSBsc21fb3BzLT5sc21fc2V0X29uZV9wYXJhbShjcGUtPmNvcmVfaGFuZGxlLAotCQkJCXNlc3Npb24sIHBfaW5mbywgZGF0YSwKLQkJCQlMU01fQ1VTVE9NX1BBUkFNUyk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBjdXN0b21fcGFyYW1zIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotZXJyX3JldDoKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fcHJvY2Vzc19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgKnBfZGF0YSwKLQkJdm9pZCAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm87Ci0JaW50IGk7Ci0JaW50IHJjID0gMDsKLQotCXBfaW5mbyA9IChzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICopIHBhcmFtczsKLQotCWZvciAoaSA9IDA7IGkgPCBwX2RhdGEtPm51bV9wYXJhbXM7IGkrKykgewotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBwYXJhbSAoJWQpLCBtb2R1bGVfaWQgPSAweCV4LCBwYXJhbV9pZCA9IDB4JXgsIHBhcmFtX3NpemUgPSAweCV4LCBwYXJhbV90eXBlID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBpLCBwX2luZm8tPm1vZHVsZV9pZCwKLQkJCXBfaW5mby0+cGFyYW1faWQsIHBfaW5mby0+cGFyYW1fc2l6ZSwKLQkJCXBfaW5mby0+cGFyYW1fdHlwZSk7Ci0KLQkJc3dpdGNoIChwX2luZm8tPnBhcmFtX3R5cGUpIHsKLQkJY2FzZSBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRDoKLQkJCXJjID0gbXNtX2NwZV9sc21fc2V0X2VwZChzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fT1BFUkFUSU9OX01PREU6Ci0JCQlyYyA9IG1zbV9jcGVfbHNtX3NldF9tb2RlKHN1YnN0cmVhbSwgcF9pbmZvKTsKLQkJCWJyZWFrOwotCQljYXNlIExTTV9HQUlOOgotCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfZ2FpbihzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fTUlOX0NPTkZJREVOQ0VfTEVWRUxTOgotCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfY29uZihzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fUkVHX1NORF9NT0RFTDoKLQkJCXJjID0gbXNtX2NwZV9sc21fcmVnX21vZGVsKHN1YnN0cmVhbSwgcF9pbmZvKTsKLQkJCWJyZWFrOwotCQljYXNlIExTTV9ERVJFR19TTkRfTU9ERUw6Ci0JCQlyYyA9IG1zbV9jcGVfbHNtX2RlcmVnX21vZGVsKHN1YnN0cmVhbSwgcF9pbmZvKTsKLQkJCWJyZWFrOwotCQljYXNlIExTTV9DVVNUT01fUEFSQU1TOgotCQkJcmMgPSBtc21fY3BlX2xzbV9zZXRfY3VzdG9tKHN1YnN0cmVhbSwgcF9pbmZvKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEludmFsaWQgcGFyYW1fdHlwZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV90eXBlKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogc2V0X3BhcmFtIGZhaWwgZm9yIHBhcmFtX3R5cGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fdHlwZSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlwX2luZm8rKzsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3Qgd2NkX2NwZV9sc21fb3BzICpsc21fb3BzOwotCi0JaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc3Vic3RyZWFtICglcEspXG4iLAotCQkJX19mdW5jX18sIHN1YnN0cmVhbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCWNwZSA9IGNwZV9nZXRfcHJpdmF0ZV9kYXRhKHN1YnN0cmVhbSk7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlNU01fQ1BFX0xTTV9HUkFCX0xPQ0soJmxzbV9kLT5sc21fYXBpX2xvY2ssCi0JCQkgICAgICAibHNtX2FwaV9sb2NrIik7Ci0KLQlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOwotCWxzbV9vcHMgPSAmY3BlLT5sc21fb3BzOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyIHNuZF9tb2RlbDsKLQotCQlpZiAoc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAotCQkJCV9fZnVuY19fLCAiTFNNX1JFR19TTkRfTU9ERUxfVjIiKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNuZF9tb2RlbCwgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwKLQkJCQkJICAgICAgICZzbmRfbW9kZWwpOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyB1X2V2ZW50X3N0YXR1czsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICpldmVudF9zdGF0dXMgPSBOVUxMOwotCQlpbnQgdV9wbGRfc2l6ZSA9IDA7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1X2V2ZW50X3N0YXR1cywgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZXZlbnQgc3RhdHVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmICh1X2V2ZW50X3N0YXR1cy5wYXlsb2FkX3NpemUgPgotCQkgICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogcGF5bG9hZF9zaXplICVkIGlzIGludmFsaWQsIG1heCBhbGxvd2VkID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHVfZXZlbnRfc3RhdHVzLnBheWxvYWRfc2l6ZSwKLQkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXVfcGxkX3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKSArCi0JCQkJdV9ldmVudF9zdGF0dXMucGF5bG9hZF9zaXplOwotCi0JCWV2ZW50X3N0YXR1cyA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZXZlbnRfc3RhdHVzKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UgewotCQkJZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUgPQotCQkJCXVfZXZlbnRfc3RhdHVzLnBheWxvYWRfc2l6ZTsKLQkJCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sCi0JCQkJCQkgICAgICAgY21kLCBldmVudF9zdGF0dXMpOwotCQl9Ci0KLQkJaWYgKCFlcnIgICYmIGNvcHlfdG9fdXNlcihhcmcsIGV2ZW50X3N0YXR1cywgdV9wbGRfc2l6ZSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBjb3B5IHRvIHVzZXIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWtmcmVlKGV2ZW50X3N0YXR1cyk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJbXNtX2NwZV9sc21fbGFiX3N0YXJ0KHN1YnN0cmVhbSwgZXZlbnRfc3RhdHVzLT5zdGF0dXMpOwotCQltc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzX2RvbmUobHNtX2QpOwotCQlrZnJlZShldmVudF9zdGF0dXMpOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTX1YzOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MyB1X2V2ZW50X3N0YXR1czsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICpldmVudF9zdGF0dXMgPSBOVUxMOwotCQlpbnQgdV9wbGRfc2l6ZSA9IDA7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1X2V2ZW50X3N0YXR1cywgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MykpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZXZlbnQgc3RhdHVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MykpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmICh1X2V2ZW50X3N0YXR1cy5wYXlsb2FkX3NpemUgPgotCQkgICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogcGF5bG9hZF9zaXplICVkIGlzIGludmFsaWQsIG1heCBhbGxvd2VkID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHVfZXZlbnRfc3RhdHVzLnBheWxvYWRfc2l6ZSwKLQkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXVfcGxkX3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzKSArCi0JCQkJdV9ldmVudF9zdGF0dXMucGF5bG9hZF9zaXplOwotCi0JCWV2ZW50X3N0YXR1cyA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZXZlbnRfc3RhdHVzKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UgewotCQkJZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUgPQotCQkJCXVfZXZlbnRfc3RhdHVzLnBheWxvYWRfc2l6ZTsKLQkJCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sCi0JCQkJCQkgICAgICAgY21kLCBldmVudF9zdGF0dXMpOwotCQl9Ci0KLQkJaWYgKCFlcnIgICYmIGNvcHlfdG9fdXNlcihhcmcsIGV2ZW50X3N0YXR1cywgdV9wbGRfc2l6ZSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBjb3B5IHRvIHVzZXIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWtmcmVlKGV2ZW50X3N0YXR1cyk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJbXNtX2NwZV9sc21fbGFiX3N0YXJ0KHN1YnN0cmVhbSwgZXZlbnRfc3RhdHVzLT5zdGF0dXMpOwotCQltc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzX2RvbmUobHNtX2QpOwotCQlrZnJlZShldmVudF9zdGF0dXMpOwotCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNUzogewotCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zIGRldF9wYXJhbXM7Ci0KLQkJaWYgKHNlc3Npb24tPmlzX3RvcG9sb2d5X3VzZWQpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogbm90IHN1cHBvcnRlZCBpZiB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TRVRfUEFSQU1TIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfcGFyYW1zLCAodm9pZCAqKSBhcmcsCi0JCQkJICAgc2l6ZW9mKGRldF9wYXJhbXMpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlemRcbiIsCi0JCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BBUkFNUyIsCi0JCQkJc2l6ZW9mKGRldF9wYXJhbXMpKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCi0JCQkJCSAgICAgICAmZGV0X3BhcmFtcyk7Ci0JfQotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgcF9kYXRhOwotCQlzaXplX3QgcF9zaXplOwotCQl1OCAqcGFyYW1zOwotCi0JCWlmICghc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKCFhcmcpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogTm8gUGFyYW0gZGF0YSB0byBzZXRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmcF9kYXRhLCBhcmcsCi0JCQkJICAgc2l6ZW9mKHBfZGF0YSkpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgInBfZGF0YSIsIHNpemVvZihwX2RhdGEpKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAocF9kYXRhLm51bV9wYXJhbXMgPiBMU01fUEFSQU1TX01BWCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBJbnZhbGlkIG51bV9wYXJhbXMgJWRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsCi0JCQkJcF9kYXRhLm51bV9wYXJhbXMpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXBfc2l6ZSA9IHBfZGF0YS5udW1fcGFyYW1zICoKLQkJCSBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbXNfaW5mbyk7Ci0KLQkJaWYgKHBfZGF0YS5kYXRhX3NpemUgIT0gcF9zaXplKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IEludmFsaWQgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsIHBfc2l6ZSk7Ci0KLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlwYXJhbXMgPSBremFsbG9jKHBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW1zKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtcywgcF9kYXRhLnBhcmFtcywKLQkJCQkgICBwX2RhdGEuZGF0YV9zaXplKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgInBhcmFtcyIsIHBfZGF0YS5kYXRhX3NpemUpOwotCQkJa2ZyZWUocGFyYW1zKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQllcnIgPSBtc21fY3BlX2xzbV9wcm9jZXNzX3BhcmFtcyhzdWJzdHJlYW0sICZwX2RhdGEsIHBhcmFtcyk7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IEZhaWxlZCB0byBzZXQgcGFyYW1zLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIiwgZXJyKTsKLQkJa2ZyZWUocGFyYW1zKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCi1kb25lOgotCU1TTV9DUEVfTFNNX1JFTF9MT0NLKCZsc21fZC0+bHNtX2FwaV9sb2NrLAotCQkJICAgICAibHNtX2FwaV9sb2NrIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyXzMyIHsKLQljb21wYXRfdXB0cl90IGRhdGE7Ci0JY29tcGF0X3VwdHJfdCBjb25maWRlbmNlX2xldmVsOwotCXUzMiBkYXRhX3NpemU7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0aW9uX21vZGU7Ci0JdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Ci19OwotCi1zdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyIHsKLQljb21wYXRfdXB0cl90IGNvbmZfbGV2ZWw7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGU7Ci0JdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Ci19OwotCi1zdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyIHsKLQl1MzIgbW9kdWxlX2lkOwotCXUzMiBwYXJhbV9pZDsKLQl1MzIgcGFyYW1fc2l6ZTsKLQljb21wYXRfdXB0cl90IHBhcmFtX2RhdGE7Ci0JdWludDMyX3QgcGFyYW1fdHlwZTsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXNfMzIgewotCWNvbXBhdF91cHRyX3QgcGFyYW1zOwotCXUzMiBudW1fcGFyYW1zOwotCXUzMiBkYXRhX3NpemU7Ci19OwotCi1lbnVtIHsKLQlTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMiA9Ci0JCV9JT1coJ1UnLCAweDA3LCBzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiksCi0JU05EUlZfTFNNX1NFVF9QQVJBTVMzMiA9Ci0JCV9JT1coJ1UnLCAweDBBLCBzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyKSwKLQlTTkRSVl9MU01fU0VUX01PRFVMRV9QQVJBTVNfMzIgPQotCQlfSU9XKCdVJywgMHgwQiwgc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtc18zMiksCi19OwotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX2lvY3RsX2NvbXBhdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZSA9IE5VTEw7Ci0Jc3RydWN0IGNwZV9sc21fZGF0YSAqbHNtX2QgPSBOVUxMOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0KLQlpZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzdWJzdHJlYW0gKCVwSylcbiIsCi0JCQlfX2Z1bmNfXywgc3Vic3RyZWFtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JbHNtX2QgPSBjcGVfZ2V0X2xzbV9kYXRhKHN1YnN0cmVhbSk7Ci0JY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQotCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcHJpdmF0ZSBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWxzbV9kIHx8ICFsc21fZC0+bHNtX3Nlc3Npb24pIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBzZXNzaW9uIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCU1TTV9DUEVfTFNNX0dSQUJfTE9DSygmbHNtX2QtPmxzbV9hcGlfbG9jaywKLQkJCSAgICAgICJsc21fYXBpX2xvY2siKTsKLQotCXNlc3Npb24gPSBsc21fZC0+bHNtX3Nlc3Npb247Ci0JbHNtX29wcyA9ICZjcGUtPmxzbV9vcHM7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzI6IHsKLQkJc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIgc25kX21vZGVsOwotCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiBzbmRfbW9kZWwzMjsKLQotCQlpZiAoc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAotCQkJCV9fZnVuY19fLCAiTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIiKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBpb2N0bCAlc1xuIiwgX19mdW5jX18sCi0JCQkiU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIiKTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNuZF9tb2RlbDMyLCAodm9pZCAqKWFyZywKLQkJCQkgICBzaXplb2Yoc25kX21vZGVsMzIpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJc2l6ZW9mKHNuZF9tb2RlbDMyKSk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJc25kX21vZGVsLmRhdGEgPSBjb21wYXRfcHRyKHNuZF9tb2RlbDMyLmRhdGEpOwotCQlzbmRfbW9kZWwuY29uZmlkZW5jZV9sZXZlbCA9Ci0JCQljb21wYXRfcHRyKHNuZF9tb2RlbDMyLmNvbmZpZGVuY2VfbGV2ZWwpOwotCQlzbmRfbW9kZWwuZGF0YV9zaXplID0gc25kX21vZGVsMzIuZGF0YV9zaXplOwotCQlzbmRfbW9kZWwuZGV0ZWN0X2ZhaWx1cmUgPSBzbmRfbW9kZWwzMi5kZXRlY3RfZmFpbHVyZTsKLQkJc25kX21vZGVsLm51bV9jb25maWRlbmNlX2xldmVscyA9Ci0JCQlzbmRfbW9kZWwzMi5udW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JCXNuZF9tb2RlbC5kZXRlY3Rpb25fbW9kZSA9IHNuZF9tb2RlbDMyLmRldGVjdGlvbl9tb2RlOwotCi0JCWNtZCA9IFNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyOwotCQllcnIgPSBtc21fY3BlX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsICZzbmRfbW9kZWwpOwotCQlpZiAoZXJyKQotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzIGZhaWxlZCwgZXJyb3IgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQkiU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIiLAotCQkJCWVycik7Ci0JfQotCQlicmVhazsKLQljYXNlIFNORFJWX0xTTV9FVkVOVF9TVEFUVVM6IHsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICpldmVudF9zdGF0dXMgPSBOVUxMOwotCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgdV9ldmVudF9zdGF0dXMzMjsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICp1ZGF0YV8zMiA9IE5VTEw7Ci0JCWludCB1X3BsZF9zaXplID0gMDsKLQotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBpb2N0bCAlc1xuIiwgX19mdW5jX18sCi0JCQkiU05EUlZfTFNNX0VWRU5UX1NUQVRVUzMyIik7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1X2V2ZW50X3N0YXR1czMyLCAodm9pZCAqKWFyZywKLQkJCQkgICBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBldmVudCBzdGF0dXMgY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzKSk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKHVfZXZlbnRfc3RhdHVzMzIucGF5bG9hZF9zaXplID4KLQkJICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogcGF5bG9hZF9zaXplICVkIGlzIGludmFsaWQsIG1heCBhbGxvd2VkID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHVfZXZlbnRfc3RhdHVzMzIucGF5bG9hZF9zaXplLAotCQkJCUxJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJdV9wbGRfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMpICsKLQkJCQl1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZTsKLQkJZXZlbnRfc3RhdHVzID0ga3phbGxvYyh1X3BsZF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFldmVudF9zdGF0dXMpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBObyBtZW1vcnkgZm9yIGV2ZW50IHN0YXR1c1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UgewotCQkJZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUgPQotCQkJCXVfZXZlbnRfc3RhdHVzMzIucGF5bG9hZF9zaXplOwotCQkJZXJyID0gbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwKLQkJCQkJCSAgICAgICBjbWQsIGV2ZW50X3N0YXR1cyk7Ci0JCQlpZiAoZXJyKQotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogJXMgZmFpbGVkLCBlcnJvciA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJIlNORFJWX0xTTV9FVkVOVF9TVEFUVVMzMiIsCi0JCQkJCWVycik7Ci0JCX0KLQotCQlpZiAoIWVycikgewotCQkJdWRhdGFfMzIgPSBremFsbG9jKHVfcGxkX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1ZGF0YV8zMikgewotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogbm9tZW0gZm9yIHVkYXRhXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCX0gZWxzZSB7Ci0JCQkJdWRhdGFfMzItPnN0YXR1cyA9IGV2ZW50X3N0YXR1cy0+c3RhdHVzOwotCQkJCXVkYXRhXzMyLT5wYXlsb2FkX3NpemUgPQotCQkJCQlldmVudF9zdGF0dXMtPnBheWxvYWRfc2l6ZTsKLQkJCQltZW1jcHkodWRhdGFfMzItPnBheWxvYWQsCi0JCQkJICAgICAgIGV2ZW50X3N0YXR1cy0+cGF5bG9hZCwKLQkJCQkgICAgICAgdV9wbGRfc2l6ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVyciAgJiYgY29weV90b191c2VyKGFyZywgdWRhdGFfMzIsCi0JCQkJCSAgdV9wbGRfc2l6ZSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBjb3B5IHRvIHVzZXIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWtmcmVlKGV2ZW50X3N0YXR1cyk7Ci0JCQlrZnJlZSh1ZGF0YV8zMik7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJbXNtX2NwZV9sc21fbGFiX3N0YXJ0KHN1YnN0cmVhbSwgZXZlbnRfc3RhdHVzLT5zdGF0dXMpOwotCQltc21fY3BlX3Byb2Nlc3NfZXZlbnRfc3RhdHVzX2RvbmUobHNtX2QpOwotCQlrZnJlZShldmVudF9zdGF0dXMpOwotCQlrZnJlZSh1ZGF0YV8zMik7Ci0JfQotCQlicmVhazsKLQljYXNlIFNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjM6IHsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICpldmVudF9zdGF0dXMgPSBOVUxMOwotCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjMgdV9ldmVudF9zdGF0dXMzMjsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICp1ZGF0YV8zMiA9IE5VTEw7Ci0JCWludCB1X3BsZF9zaXplID0gMDsKLQotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBpb2N0bCAlc1xuIiwgX19mdW5jX18sCi0JCQkiU05EUlZfTFNNX0VWRU5UX1NUQVRVU19WM18zMiIpOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdV9ldmVudF9zdGF0dXMzMiwgKHZvaWQgKilhcmcsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MykpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZXZlbnQgc3RhdHVzIGNvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MykpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmICh1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZSA+Ci0JCSAgIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IHBheWxvYWRfc2l6ZSAlZCBpcyBpbnZhbGlkLCBtYXggYWxsb3dlZCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZSwKLQkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXVfcGxkX3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzKSArCi0JCQkJdV9ldmVudF9zdGF0dXMzMi5wYXlsb2FkX3NpemU7Ci0JCWV2ZW50X3N0YXR1cyA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZXZlbnRfc3RhdHVzKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogTm8gbWVtb3J5IGZvciBldmVudCBzdGF0dXNcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfSBlbHNlIHsKLQkJCWV2ZW50X3N0YXR1cy0+cGF5bG9hZF9zaXplID0KLQkJCQl1X2V2ZW50X3N0YXR1czMyLnBheWxvYWRfc2l6ZTsKLQkJCWVyciA9IG1zbV9jcGVfbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sCi0JCQkJCQkgICAgICAgY21kLCBldmVudF9zdGF0dXMpOwotCQkJaWYgKGVycikKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6ICVzIGZhaWxlZCwgZXJyb3IgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCSJTTkRSVl9MU01fRVZFTlRfU1RBVFVTX1YzXzMyIiwKLQkJCQkJZXJyKTsKLQkJfQotCi0JCWlmICghZXJyKSB7Ci0JCQl1ZGF0YV8zMiA9IGt6YWxsb2ModV9wbGRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXVkYXRhXzMyKSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBub21lbSBmb3IgdWRhdGFcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQllcnIgPSAtRUZBVUxUOwotCQkJfSBlbHNlIHsKLQkJCQl1ZGF0YV8zMi0+dGltZXN0YW1wX2xzdyA9Ci0JCQkJCWV2ZW50X3N0YXR1cy0+dGltZXN0YW1wX2xzdzsKLQkJCQl1ZGF0YV8zMi0+dGltZXN0YW1wX21zdyA9Ci0JCQkJCWV2ZW50X3N0YXR1cy0+dGltZXN0YW1wX21zdzsKLQkJCQl1ZGF0YV8zMi0+c3RhdHVzID0gZXZlbnRfc3RhdHVzLT5zdGF0dXM7Ci0JCQkJdWRhdGFfMzItPnBheWxvYWRfc2l6ZSA9Ci0JCQkJCWV2ZW50X3N0YXR1cy0+cGF5bG9hZF9zaXplOwotCQkJCW1lbWNweSh1ZGF0YV8zMi0+cGF5bG9hZCwKLQkJCQkgICAgICAgZXZlbnRfc3RhdHVzLT5wYXlsb2FkLAotCQkJCSAgICAgICB1X3BsZF9zaXplKTsKLQkJCX0KLQkJfQotCi0JCWlmICghZXJyICAmJiBjb3B5X3RvX3VzZXIoYXJnLCB1ZGF0YV8zMiwKLQkJCQkJICB1X3BsZF9zaXplKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGNvcHkgdG8gdXNlciBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJa2ZyZWUoZXZlbnRfc3RhdHVzKTsKLQkJCWtmcmVlKHVkYXRhXzMyKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQltc21fY3BlX2xzbV9sYWJfc3RhcnQoc3Vic3RyZWFtLCBldmVudF9zdGF0dXMtPnN0YXR1cyk7Ci0JCW1zbV9jcGVfcHJvY2Vzc19ldmVudF9zdGF0dXNfZG9uZShsc21fZCk7Ci0JCWtmcmVlKGV2ZW50X3N0YXR1cyk7Ci0JCWtmcmVlKHVkYXRhXzMyKTsKLQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfTFNNX1NFVF9QQVJBTVMzMjogewotCQlzdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyIGRldF9wYXJhbXMzMjsKLQkJc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyBkZXRfcGFyYW1zOwotCi0JCWlmIChzZXNzaW9uLT5pc190b3BvbG9neV91c2VkKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgdXNpbmcgdG9wb2xvZ3lcbiIsCi0JCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX1BBUkFNUzMyIik7Ci0KLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRldF9wYXJhbXMzMiwgYXJnLAotCQkJCSAgIHNpemVvZihkZXRfcGFyYW1zMzIpKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVNfMzIiLAotCQkJCXNpemVvZihkZXRfcGFyYW1zMzIpKTsKLQkJfSBlbHNlIHsKLQkJCWRldF9wYXJhbXMuY29uZl9sZXZlbCA9Ci0JCQkJY29tcGF0X3B0cihkZXRfcGFyYW1zMzIuY29uZl9sZXZlbCk7Ci0JCQlkZXRfcGFyYW1zLmRldGVjdF9tb2RlID0KLQkJCQlkZXRfcGFyYW1zMzIuZGV0ZWN0X21vZGU7Ci0JCQlkZXRfcGFyYW1zLm51bV9jb25maWRlbmNlX2xldmVscyA9Ci0JCQkJZGV0X3BhcmFtczMyLm51bV9jb25maWRlbmNlX2xldmVsczsKLQkJCWRldF9wYXJhbXMuZGV0ZWN0X2ZhaWx1cmUgPQotCQkJCWRldF9wYXJhbXMzMi5kZXRlY3RfZmFpbHVyZTsKLQkJCWNtZCA9IFNORFJWX0xTTV9TRVRfUEFSQU1TOwotCQkJZXJyID0gbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLAotCQkJCQkJICAmZGV0X3BhcmFtcyk7Ci0JCQlpZiAoZXJyKQotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogaW9jdGwgJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJIlNORFJWX0xTTV9TRVRfUEFSQU1TIik7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNU18zMjogewotCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zXzMyIHBfZGF0YV8zMjsKLQkJc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtcyBwX2RhdGE7Ci0JCXU4ICpwYXJhbXMsICpwYXJhbXMzMjsKLQkJc2l6ZV90IHBfc2l6ZTsKLQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mb18zMiAqcF9pbmZvXzMyOwotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm87Ci0JCWludCBpOwotCi0JCWlmICghc2Vzc2lvbi0+aXNfdG9wb2xvZ3lfdXNlZCkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TXzMyIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwX2RhdGFfMzIsIGFyZywKLQkJCQkgICBzaXplb2YocF9kYXRhXzMyKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAotCQkJCXNpemVvZihwX2RhdGFfMzIpKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlwX2RhdGEucGFyYW1zID0gY29tcGF0X3B0cihwX2RhdGFfMzIucGFyYW1zKTsKLQkJcF9kYXRhLm51bV9wYXJhbXMgPSBwX2RhdGFfMzIubnVtX3BhcmFtczsKLQkJcF9kYXRhLmRhdGFfc2l6ZSA9IHBfZGF0YV8zMi5kYXRhX3NpemU7Ci0KLQkJaWYgKHBfZGF0YS5udW1fcGFyYW1zID4gTFNNX1BBUkFNU19NQVgpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogSW52YWxpZCBudW1fcGFyYW1zICVkXG4iLAotCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAotCQkJCXBfZGF0YS5udW1fcGFyYW1zKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAocF9kYXRhLmRhdGFfc2l6ZSAhPQotCQkgICAgKHBfZGF0YS5udW1fcGFyYW1zICogc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBJbnZhbGlkIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNU18zMiIsCi0JCQkJcF9kYXRhLmRhdGFfc2l6ZSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIpICoKLQkJCSBwX2RhdGEubnVtX3BhcmFtczsKLQotCQlwYXJhbXMzMiA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYXJhbXMzMikgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvKSAqIHBfZGF0YS5udW1fcGFyYW1zOwotCQlwYXJhbXMgPSBremFsbG9jKHBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW1zKSB7Ci0JCQlrZnJlZShwYXJhbXMzMik7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtczMyLCBwX2RhdGEucGFyYW1zLAotCQkJCSAgIHBfZGF0YS5kYXRhX3NpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCAicGFyYW1zMzIiLCBwX2RhdGEuZGF0YV9zaXplKTsKLQkJCWtmcmVlKHBhcmFtczMyKTsKLQkJCWtmcmVlKHBhcmFtcyk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcF9pbmZvXzMyID0gKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIgKikgcGFyYW1zMzI7Ci0JCXBfaW5mbyA9IChzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICopIHBhcmFtczsKLQkJZm9yIChpID0gMDsgaSA8IHBfZGF0YS5udW1fcGFyYW1zOyBpKyspIHsKLQkJCXBfaW5mby0+bW9kdWxlX2lkID0gcF9pbmZvXzMyLT5tb2R1bGVfaWQ7Ci0JCQlwX2luZm8tPnBhcmFtX2lkID0gcF9pbmZvXzMyLT5wYXJhbV9pZDsKLQkJCXBfaW5mby0+cGFyYW1fc2l6ZSA9IHBfaW5mb18zMi0+cGFyYW1fc2l6ZTsKLQkJCXBfaW5mby0+cGFyYW1fZGF0YSA9IGNvbXBhdF9wdHIocF9pbmZvXzMyLT5wYXJhbV9kYXRhKTsKLQkJCXBfaW5mby0+cGFyYW1fdHlwZSA9IHBfaW5mb18zMi0+cGFyYW1fdHlwZTsKLQotCQkJcF9pbmZvXzMyKys7Ci0JCQlwX2luZm8rKzsKLQkJfQotCi0JCWVyciA9IG1zbV9jcGVfbHNtX3Byb2Nlc3NfcGFyYW1zKHN1YnN0cmVhbSwKLQkJCQkJICAgICAmcF9kYXRhLCBwYXJhbXMpOwotCQlpZiAoZXJyKQotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBwcm9jZXNzIHBhcmFtcywgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGVycik7Ci0JCWtmcmVlKHBhcmFtcyk7Ci0JCWtmcmVlKHBhcmFtczMyKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjI6Ci0JY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNUzoKLQljYXNlIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNUzoKLQkJLyoKLQkJICogSW4gaWRlYWwgY2FzZXMsIHRoZSBjb21wYXRfaW9jdGwgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZAotCQkgKiB3aXRoIHRoZSBhYm92ZSB1bmxvY2tlZCBpb2N0bCBjb21tYW5kcy4gUHJpbnQgZXJyb3IKLQkJICogYW5kIHJldHVybiBlcnJvciBpZiBpdCBkb2VzLgotCQkgKi8KLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBjbWQgZm9yIGNvbXBhdF9pb2N0bFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gbXNtX2NwZV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOwotCQlicmVhazsKLQl9Ci1kb25lOgotCU1TTV9DUEVfTFNNX1JFTF9MT0NLKCZsc21fZC0+bHNtX2FwaV9sb2NrLAotCQkJICAgICAibHNtX2FwaV9sb2NrIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgbXNtX2NwZV9sc21faW9jdGxfY29tcGF0IE5VTEwKLSNlbmRpZgotCi0vKgotICogbXNtX2NwZV9sc21fcHJlcGFyZTogcHJlcGFyZSBjYWxsIGZyb20gQVNvQyBjb3JlIGZvciB0aGlzIHBsYXRmb3JtCi0gKiBAc3Vic3RyZWFtOiBBU29DIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyBpbnZva2VkCi0gKgotICogc3RhcnQgdGhlIEFGRSBwb3J0IG9uIENQRSBhc3NvY2lhdGVkIGZvciB0aGlzIGxpc3RlbiBzZXNzaW9uCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgY3BlX2xzbV9kYXRhICpsc21fZCA9IGNwZV9nZXRfbHNtX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdjZF9jcGVfYWZlX29wcyAqYWZlX29wczsKLQlzdHJ1Y3Qgd2NkX2NwZV9hZmVfcG9ydF9jZmcgKmFmZV9jZmc7Ci0Jc3RydWN0IGNwZV9sc21fc2Vzc2lvbiAqbHNtX3Nlc3Npb247Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGxzbV9od19wYXJhbXMgbHNtX3BhcmFtOwotCXN0cnVjdCB3Y2RfY3BlX2xzbV9vcHMgKmxzbV9vcHM7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX1hSVU4gfHwKLQkgICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQpIHsKLQkJcHJfZXJyKCIlczogWFJVTiBpZ25vcmUgZm9yIG5vd1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlsc21fc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlsYWJfZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCWRldl9kYmcocnRkLT5kZXYsCi0JCSIlczogcGNtX3NpemUgMHgleCIsIF9fZnVuY19fLCBsYWJfZC0+cGNtX3NpemUpOwotCi0JaWYgKGxzbV9kLT5jcGVfcHJlcGFyZWQpIHsKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBDUEUgaXMgYWxyZWR5IHByZXBhcmVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlsc21fb3BzID0gJmNwZS0+bHNtX29wczsKLQlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKLQlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7Ci0KLQlzd2l0Y2ggKGNwZS0+aW5wdXRfcG9ydF9pZCkgewotCWNhc2UgQUZFX1BPUlRfSURfMzoKLQkJYWZlX2NmZy0+cG9ydF9pZCA9IEFGRV9QT1JUX0lEXzM7Ci0JCWFmZV9jZmctPmJpdF93aWR0aCA9IDE2OwotCQlhZmVfY2ZnLT5udW1fY2hhbm5lbHMgPSAxOwotCQlhZmVfY2ZnLT5zYW1wbGVfcmF0ZSA9IFNBTVBMRV9SQVRFXzQ4S0haOwotCQlyYyA9IGFmZV9vcHMtPmFmZV9wb3J0X2NtZF9jZmcoY3BlLT5jb3JlX2hhbmRsZSwgYWZlX2NmZyk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfMToKLQlkZWZhdWx0OgotCQlhZmVfY2ZnLT5wb3J0X2lkID0gQUZFX1BPUlRfSURfMTsKLQkJYWZlX2NmZy0+Yml0X3dpZHRoID0gMTY7Ci0JCWFmZV9jZmctPm51bV9jaGFubmVscyA9IDE7Ci0JCWFmZV9jZmctPnNhbXBsZV9yYXRlID0gU0FNUExFX1JBVEVfMTZLSFo7Ci0JCXJjID0gYWZlX29wcy0+YWZlX3NldF9wYXJhbXMoY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkJICAgICBhZmVfY2ZnLCBjcGUtPmFmZV9tYWRfY3RsKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJjICE9IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogY3BlIGFmZSBwYXJhbXMgZmFpbGVkIGZvciBwb3J0ID0gJWQsIGVyciA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBhZmVfY2ZnLT5wb3J0X2lkLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JbHNtX3BhcmFtLnNhbXBsZV9yYXRlID0gYWZlX2NmZy0+c2FtcGxlX3JhdGU7Ci0JbHNtX3BhcmFtLm51bV9jaHMgPSBhZmVfY2ZnLT5udW1fY2hhbm5lbHM7Ci0JbHNtX3BhcmFtLmJpdF93aWR0aCA9IGFmZV9jZmctPmJpdF93aWR0aDsKLQlyYyA9IGxzbV9vcHMtPmxzbV9zZXRfbWVkaWFfZm10X3BhcmFtcyhjcGUtPmNvcmVfaGFuZGxlLCBsc21fc2Vzc2lvbiwKLQkJCQkJICAgICAgICZsc21fcGFyYW0pOwotCWlmIChyYykKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogZmFpbGVkIHRvIHNldCBsc20gbWVkaWEgZm10IHBhcmFtcywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCi0JLyogU2VuZCBjb25uZWN0IHRvIHBvcnQgKGlucHV0KSAqLwotCXJjID0gbHNtX29wcy0+bHNtX3NldF9wb3J0KGNwZS0+Y29yZV9oYW5kbGUsIGxzbV9zZXNzaW9uLAotCQkJCSAgICZjcGUtPmlucHV0X3BvcnRfaWQpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNvbm5lY3QgaW5wdXQgcG9ydCwgZXJyPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmIChjcGUtPmlucHV0X3BvcnRfaWQgIT0gMykgewotCQlyYyA9IGxzbV9vcHMtPmxzbV9nZXRfYWZlX291dF9wb3J0X2lkKGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJCQkgICAgICBsc21fc2Vzc2lvbik7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGdldCBwb3J0IGlkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCS8qIFNlbmQgY29ubmVjdCB0byBwb3J0IChvdXRwdXQpICovCi0JCXJjID0gbHNtX29wcy0+bHNtX3NldF9wb3J0KGNwZS0+Y29yZV9oYW5kbGUsIGxzbV9zZXNzaW9uLAotCQkJCQkgICAmbHNtX3Nlc3Npb24tPmFmZV9vdXRfcG9ydF9pZCk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBzZXQgY29ubmVjdCBvdXRwdXQgcG9ydCwgZXJyPSVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmMgPSBtc21fY3BlX2FmZV9wb3J0X2NudGwoc3Vic3RyZWFtLAotCQkJCSAgIGNwZS0+Y29yZV9oYW5kbGUsCi0JCQkJICAgYWZlX29wcywgYWZlX2NmZywKLQkJCQkgICBBRkVfQ01EX1BPUlRfU1RBUlQpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogY3BlX2FmZV9wb3J0IHN0YXJ0IGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCWVsc2UKLQkJbHNtX2QtPmNwZV9wcmVwYXJlZCA9IHRydWU7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBtc21fY3BlX2xzbV90cmlnZ2VyOiB0cmlnZ2VyIGNhbGwgZnJvbSBBU29DIGNvcmUgZm9yIHRoaXMgcGxhdGZvcm0KLSAqIEBzdWJzdHJlYW06IEFTb0Mgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGludm9rZWQKLSAqIEBjbWQ6IHRoZSB0cmlnZ2VyIGNvbW1hbmQgZnJvbSBmcmFtZXdvcmsKLSAqCi0gKiBzdXNwZW5kL3Jlc3VtZSB0aGUgQUZFIHBvcnQgb24gQ1BFIGFzc29jaWF0ZWQgd2l0aCBsaXN0ZW4gc2Vzc2lvbgotICovCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICAgaW50IGNtZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNwZV9wcml2ICpjcGUgPSBjcGVfZ2V0X3ByaXZhdGVfZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCB3Y2RfY3BlX2FmZV9vcHMgKmFmZV9vcHM7Ci0Jc3RydWN0IHdjZF9jcGVfYWZlX3BvcnRfY2ZnICphZmVfY2ZnOwotCWludCBhZmVfY21kID0gQUZFX0NNRF9JTlZBTElEOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIWNwZSB8fCAhY3BlLT5jb3JlX2hhbmRsZSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHByaXZhdGUgZGF0YVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgc2Vzc2lvbiBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhZmVfb3BzID0gJmNwZS0+YWZlX29wczsKLQlhZmVfY2ZnID0gJihsc21fZC0+bHNtX3Nlc3Npb24tPmFmZV9wb3J0X2NmZyk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCWFmZV9jbWQgPSBBRkVfQ01EX1BPUlRfU1VTUEVORDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCWFmZV9jbWQgPSBBRkVfQ01EX1BPUlRfUkVTVU1FOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWFmZV9jbWQgPSBBRkVfQ01EX0lOVkFMSUQ7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IHVuaGFuZGxlZCB0cmlnZ2VyIGNtZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBjbWQpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoYWZlX2NtZCAhPSBBRkVfQ01EX0lOVkFMSUQpCi0JCXJjID0gbXNtX2NwZV9hZmVfcG9ydF9jbnRsKHN1YnN0cmVhbSwKLQkJCQkJICAgY3BlLT5jb3JlX2hhbmRsZSwKLQkJCQkJICAgYWZlX29wcywgYWZlX2NmZywKLQkJCQkJICAgYWZlX2NtZCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NwZV9sc21faHdwYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCi0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBjcGVfcHJpdiAqY3BlID0gY3BlX2dldF9wcml2YXRlX2RhdGEoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgY3BlX2xzbV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKLQlzdHJ1Y3QgY3BlX2h3X3BhcmFtcyAqaHdfcGFyYW1zID0gTlVMTDsKLQotCWlmICghY3BlIHx8ICFjcGUtPmNvcmVfaGFuZGxlKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgJXNcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSghY3BlKSA/ICJjcGUiIDogImNvcmUiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFsc21fZCB8fCAhbHNtX2QtPmxzbV9zZXNzaW9uKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgJXNcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSghbHNtX2QpID8gInByaXZfZGF0YSIgOiAic2Vzc2lvbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZXNzaW9uID0gbHNtX2QtPmxzbV9zZXNzaW9uOwotCWh3X3BhcmFtcyA9ICZsc21fZC0+aHdfcGFyYW1zOwotCWh3X3BhcmFtcy0+YnVmX3N6ID0gKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKQotCQkJCS8gcGFyYW1zX3BlcmlvZHMocGFyYW1zKSk7Ci0JaHdfcGFyYW1zLT5wZXJpb2RfY291bnQgPSBwYXJhbXNfcGVyaW9kcyhwYXJhbXMpOwotCWh3X3BhcmFtcy0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlod19wYXJhbXMtPnNhbXBsZV9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotCWlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpCi0JCWh3X3BhcmFtcy0+c2FtcGxlX3NpemUgPSAxNjsKLQllbHNlIGlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0KLQkJIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQotCQlod19wYXJhbXMtPnNhbXBsZV9zaXplID0gMjQ7Ci0JZWxzZSBpZiAocGFyYW1zX2Zvcm1hdChwYXJhbXMpID09Ci0JCSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSkKLQkJaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZSA9IDMyOwotCWVsc2UgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIEZvcm1hdCAweCV4XG4iLAotCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcocnRkLT5kZXYsCi0JCSIlczogRm9ybWF0ICVkIGJ1ZmZlciBzaXplKGJ5dGVzKSAlZCBwZXJpb2QgY291bnQgJWRcbiIKLQkJIiBDaGFubmVsICVkIHBlcmlvZCBpbiBieXRlcyAweCV4IFBlcmlvZCBTaXplIDB4JXggcmF0ZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyksCi0JCXBhcmFtc19wZXJpb2RzKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLAotCQlwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyksIHBhcmFtc19wZXJpb2Rfc2l6ZShwYXJhbXMpLAotCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX2NwZV9sc21fcG9pbnRlcigKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCi0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQlpZiAobGFiX2QtPmRtYV93cml0ZSAgPj0gbGFiX2QtPnBjbV9zaXplKQotCQlsYWJfZC0+ZG1hX3dyaXRlID0gMDsKLQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkiJXM6cGNtX2RtYV9wb3MgPSAlZFxuIiwKLQkJX19mdW5jX18sIGxhYl9kLT5kbWFfd3JpdGUpOwotCi0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAobGFiX2QtPmRtYV93cml0ZSkpOwotfQotCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAotCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCXN0cnVjdCBjcGVfbHNtX2RhdGEgKmxzbV9kID0gY3BlX2dldF9sc21fZGF0YShzdWJzdHJlYW0pOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBjcGVfbHNtX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGNwZV9sc21fbGFiICpsYWJfZCA9ICZsc21fZC0+bGFiOwotCWNoYXIgKnBjbV9idWY7Ci0JaW50IGZieXRlcyA9IDA7Ci0JaW50IHJjID0gMDsKLQotCWZieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOwotCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9YUlVOIHx8Ci0JICAgcnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQpIHsKLQkJcHJfZXJyKCIlczogWFJVTiBpZ25vcmUgZm9yIG5vd1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2Vzc2lvbiA9IGxzbV9kLT5sc21fc2Vzc2lvbjsKLQotCS8qIENoZWNrIGlmIGJ1ZmZlciByZWFkaW5nIGlzIGFscmVhZHkgaW4gZXJyb3Igc3RhdGUgKi8KLQlpZiAobGFiX2QtPnRocmVhZF9zdGF0dXMgPT0gTVNNX0xTTV9MQUJfVEhSRUFEX0VSUk9SKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEJ1ZmZlcnJpbmcgaXMgaW4gZXJyb3Igc3RhdGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCS8qCi0JCSAqIEFkdmFuY2UgdGhlIHBlcmlvZCBzbyB0aGVyZSBpcyBubyB3YWl0IGluIGNhc2UKLQkJICogcmVhZCBpcyBpbnZva2VkIGV2ZW4gYWZ0ZXIgZXJyb3IgaXMgcHJvcG9nYXRlZAotCQkgKi8KLQkJYXRvbWljX2luYygmbGFiX2QtPmluX2NvdW50KTsKLQkJbGFiX2QtPmRtYV93cml0ZSArPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9IGVsc2UgaWYgKGxhYl9kLT50aHJlYWRfc3RhdHVzID09IE1TTV9MU01fTEFCX1RIUkVBRF9TVE9QKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEJ1ZmVycmluZyBpcyBpbiBzdG9wcGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChsYWJfZC0+cGVyaW9kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmxhYl9kLT5pbl9jb3VudCkgfHwKLQkJCWF0b21pY19yZWFkKCZsYWJfZC0+YWJvcnRfcmVhZCkpLAotCQkJKDIgKiBIWikpOwotCWlmIChhdG9taWNfcmVhZCgmbGFiX2QtPmFib3J0X3JlYWQpKSB7Ci0JCXByX2RlYnVnKCIlczogTFNNIExBQiBBYm9ydCByZWFkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAobGFiX2QtPnRocmVhZF9zdGF0dXMgIT0gTVNNX0xTTV9MQUJfVEhSRUFEX1JVTk5JTkcpIHsKLQkJcHJfZXJyKCIlczogTGFiIHN0b3BwZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczpMQUIgZXJyIHdhaXRfZXZlbnRfdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FQUdBSU47Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKGxhYl9kLT5idWZfaWR4ID49IChsc21fZC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudCkpCi0JCWxhYl9kLT5idWZfaWR4ID0gMDsKLQlwY21fYnVmID0gKGxhYl9kLT5wY21fYnVmW2xhYl9kLT5idWZfaWR4XS5tZW0pOwotCXByX2RlYnVnKCIlczogQnVmIElEWCA9IDB4JXggcGNtX2J1ZiAlcEtcbiIsCi0JCSBfX2Z1bmNfXywgIGxhYl9kLT5idWZfaWR4LCBwY21fYnVmKTsKLQlpZiAocGNtX2J1ZikgewotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgcGNtX2J1ZiwgZmJ5dGVzKSkgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gY29weSBidWYgdG8gdXNlclxuIik7Ci0JCQlyYyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0JbGFiX2QtPmJ1Zl9pZHgrKzsKLQlhdG9taWNfZGVjKCZsYWJfZC0+aW5fY291bnQpOwotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBtc21fYXNvY19jcGVfbHNtX3Byb2JlOiBBU29DIGZyYW1ld29yayBmb3IgbHNtIHBsYXRmb3JtIGRyaXZlcgotICogQHBsYXRmb3JtOiBwbGF0Zm9ybSByZWdpc3RlcmVkIHdpdGggQVNvQyBjb3JlCi0gKgotICogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBmb3IgdGhpcyBwbGF0Zm9ybSBhbmQgb2J0YWluIHRoZSBvcHMgZm9yCi0gKiBsc20gYW5kIGFmZSBtb2R1bGVzIGZyb20gdW5kZXJseWluZyBkcml2ZXIuIEFsc28gZmluZCB0aGUgY29kZWMKLSAqIGZvciB0aGlzIHBsYXRmb3JtIGFzIHNwZWNpZmllZCBieSBtYWNoaW5lIGRyaXZlciBmb3IgQVNvQyBmcmFtZXdvcmsuCi0gKi8KLXN0YXRpYyBpbnQgbXNtX2Fzb2NfY3BlX2xzbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKLQlzdHJ1Y3QgY3BlX3ByaXYgKmNwZV9wcml2OwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbDsKLQlib29sIGZvdW5kX3J1bnRpbWUgPSBmYWxzZTsKLQljb25zdCBjaGFyICpjcGVfZGV2X2lkID0gInFjb20sbXNtLWNwZS1sc20taWQiOwotCXUzMiBwb3J0X2lkID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghcGxhdGZvcm0gfHwgIXBsYXRmb3JtLT5jb21wb25lbnQuY2FyZCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBsYXRmb3JtIG9yIGNhcmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNhcmQgPSBwbGF0Zm9ybS0+Y29tcG9uZW50LmNhcmQ7Ci0KLQkvKiBNYXRjaCBwbGF0Zm9ybSB0byBjb2RlYyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocnRkLCAmY2FyZC0+cnRkX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFydGQtPnBsYXRmb3JtKQotCQkJY29udGludWU7Ci0JCWlmICghc3RyY21wKHJ0ZC0+cGxhdGZvcm0tPmNvbXBvbmVudC5uYW1lLAotCQkJICAgIHBsYXRmb3JtLT5jb21wb25lbnQubmFtZSkpIHsKLQkJCWZvdW5kX3J1bnRpbWUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZvdW5kX3J1bnRpbWUpIHsKLQkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gZmluZCBydW50aW1lIGZvciBwbGF0Zm9ybVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGxhdGZvcm0tPmRldi0+b2Zfbm9kZSwgY3BlX2Rldl9pZCwKLQkJCQkgICZwb3J0X2lkKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcocGxhdGZvcm0tPmRldiwKLQkJCSIlczogbWlzc2luZyAweCV4IGluIGR0IG5vZGVcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcG9ydF9pZCA9IDE7Ci0JfQotCi0JY29kZWMgPSBydGQtPmNvZGVjOwotCi0JY3BlX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3BlX3ByaXYpLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjcGVfcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljcGVfcHJpdi0+Y29kZWMgPSBjb2RlYzsKLQljcGVfcHJpdi0+aW5wdXRfcG9ydF9pZCA9IHBvcnRfaWQ7Ci0Jd2NkX2NwZV9nZXRfbHNtX29wcygmY3BlX3ByaXYtPmxzbV9vcHMpOwotCXdjZF9jcGVfZ2V0X2FmZV9vcHMoJmNwZV9wcml2LT5hZmVfb3BzKTsKLQotCXNuZF9zb2NfcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdGZvcm0sIGNwZV9wcml2KTsKLQlrY29udHJvbCA9ICZtc21fY3BlX2tjb250cm9sc1swXTsKLQlzbmRfY3RsX2FkZChjYXJkLT5zbmRfY2FyZCwgc25kX2N0bF9uZXcxKGtjb250cm9sLCBjcGVfcHJpdikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9jcGVfbHNtX29wcyA9IHsKLQkub3BlbiA9IG1zbV9jcGVfbHNtX29wZW4sCi0JLmNsb3NlID0gbXNtX2NwZV9sc21fY2xvc2UsCi0JLmlvY3RsID0gbXNtX2NwZV9sc21faW9jdGwsCi0JLnByZXBhcmUgPSBtc21fY3BlX2xzbV9wcmVwYXJlLAotCS50cmlnZ2VyID0gbXNtX2NwZV9sc21fdHJpZ2dlciwKLQkucG9pbnRlciA9IG1zbV9jcGVfbHNtX3BvaW50ZXIsCi0JLmNvcHkgPSBtc21fY3BlX2xzbV9jb3B5LAotCS5od19wYXJhbXMgPSBtc21fY3BlX2xzbV9od3BhcmFtcywKLQkuY29tcGF0X2lvY3RsID0gbXNtX2NwZV9sc21faW9jdGxfY29tcGF0LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX2NwZV9wbGF0Zm9ybSA9IHsKLQkub3BzID0gJm1zbV9jcGVfbHNtX29wcywKLQkucHJvYmUgPSBtc21fYXNvY19jcGVfbHNtX3Byb2JlLAotfTsKLQotLyoKLSAqIG1zbV9jcGVfbHNtX3Byb2JlOiBwbGF0Zm9ybSBkcml2ZXIgcHJvYmUKLSAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKLSAqCi0gKiBSZWdpc3RlciB0aGUgQVNvQyBwbGF0Zm9ybSBkcml2ZXIgd2l0aCBBU29DIGNvcmUKLSAqLwotc3RhdGljIGludCBtc21fY3BlX2xzbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKLQkJCQkJICZtc21fc29jX2NwZV9wbGF0Zm9ybSk7Ci19Ci0KLS8qCi0gKiBtc21fY3BlX2xzbV9yZW1vdmU6IHBsYXRmb3JtIGRyaXZlciByZW1vdmUKLSAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UKLSAqCi0gKiBEZXJlZ2lzdGVyIHRoZSBBU29DIHBsYXRmb3JtIGRyaXZlcgotICovCi1zdGF0aWMgaW50IG1zbV9jcGVfbHNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2NwZV9sc21fZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tY3BlLWxzbSIgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9jcGVfbHNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tY3BlLWxzbSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXNtX2NwZV9sc21fZHRfbWF0Y2gpLAotCX0sCi0JLnByb2JlID0gbXNtX2NwZV9sc21fcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9jcGVfbHNtX3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1zbV9jcGVfbHNtX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQ1BFIExTTSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9jcGVfbHNtX2R0X21hdGNoKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vbXNtLWRhaS1mZS5jIGIvc291bmQvc29jL21zbS9tc20tZGFpLWZlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTljYzIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9tc20tZGFpLWZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzE1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9mZV9kYWlfb3BzID0ge307Ci0KLS8qIENvbnZlbnRpb25hbCBhbmQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKLQk4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsCi0JODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMzUyODAwLCAzODQwMDAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCi0JLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAotCS5tYXNrID0gMCwKLX07Ci0KLXN0YXRpYyBpbnQgbXVsdGltZWRpYV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCSZjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZlX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQotCWlmICghZGFpIHx8ICFkYWktPmRyaXZlcikgewotCQlwcl9lcnIoIiVzIGludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkYXBtID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RhcG0oZGFpLT5jb21wb25lbnQpOwotCW1lbXNldCgmaW50ZXJjb24sIDAsIHNpemVvZihpbnRlcmNvbikpOwotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKLQkJZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlcyBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKLQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lOwotCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lOwotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQkgICBfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sIGludGVyY29uLnNvdXJjZSk7Ci0JfQotCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgotCSAgIGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlcyBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOwotCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWU7Ci0JCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOwotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQkgICBfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sIGludGVyY29uLnNpbmspOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcyA9IHsKLQkuc3RhcnR1cAk9IG11bHRpbWVkaWFfc3RhcnR1cCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9mZV9kYWlfY29tcG9uZW50ID0gewotCS5uYW1lCQk9ICJtc20tZGFpLWZlIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9mZV9kYWlzW10gPSB7Ci0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMMSIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUwxIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0JNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiTU1fREwyIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0JMzg0MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9VTDIiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPQk0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhMiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkNTLVZPSUNFIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJDUy1WT0lDRV9ETDEiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkNTLVZPSUNFIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIkNTLVZPSUNFX1VMMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiQ1MtVk9JQ0UiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb0lQIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJWT0lQX0RMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TUEVDSUFMLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVm9JUCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJWT0lQX1VMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TUEVDSUFMLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVm9JUCIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDMiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNiwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIk1NX1VMMyIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5uYW1lID0gIk11bHRpTWVkaWEzIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTQgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMNCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCi0JCS5uYW1lID0gIk11bHRpTWVkaWE0IiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTUgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMNSIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTUgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUw1IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPQk0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhNSIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE2IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDYiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE2IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIk1NX1VMNiIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0JNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTYiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiTU1fREw3IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPQk4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTciLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhOCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiTU1fREw4IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPQk4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhOCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9VTDgiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5uYW1lID0gIk11bHRpTWVkaWE4IiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JLyogRkUgREFJcyBjcmVhdGVkIGZvciBob3N0bGVzcyBvcGVyYXRpb24gcHVycG9zZSAqLwotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNMF9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzBfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTTBfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF85NjAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTTElNQlVTMF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVMxX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNMV9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVMxX0hPU1RMRVNTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU0xX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTM19IT1NUTEVTUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTTNfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTM19IT1NUTEVTUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNM19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNMSU00X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTTRfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTTElNQlVTNF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM2X0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNNl9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0xJTUJVUzZfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTN19IT1NUTEVTUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTTdfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM3X0hPU1RMRVNTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU03X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTTElNQlVTN19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNOF9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTThfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UX0ZNX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJJTlRGTV9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UX0ZNX0hPU1RMRVNTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIklOVEZNX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJJTlRfRk1fSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJJTlRfSEZQX0JUIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJJTlRIRlBfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxNjAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UX0hGUF9CVCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJJTlRIRlBfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxNjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiSU5UX0hGUF9CVF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlVTQkFVRElPX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJVU0JBVURJT19ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVVNCQVVESU9fSE9TVExFU1MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVVNCQVVESU9fVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlVTQkFVRElPX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQQ01fUlgiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV80ODAwMCksCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUENNX1RYIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfNDgwMDApLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiQUZFLVBST1hZIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSERNSV9IT1NUTEVTUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSERNSV9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJIRE1JX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQVVYUENNX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJBVVhQQ01fRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDEsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxNjAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQVVYUENNX0hPU1RMRVNTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIkFVWFBDTV9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgMTYwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIkFVWFBDTV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZPSUNFX1NUVUIgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFX1NUVUJfREwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWT0lDRV9TVFVCIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFX1NUVUJfVUwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJWT0lDRV9TVFVCIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVm9MVEUgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZvTFRFX0RMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb0xURSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJWb0xURV9VTCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVm9MVEUiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNSTJTX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTUkyU19UWF9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJNSTJTX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIk1JMlNfVFhfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTRUNfSTJTX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19JMlNfUlhfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfTUkyU19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJQUklfTUkyU19UWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX01JMlNfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgIDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX01JMlNfUlhfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19NSTJTX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19NSTJTX1RYX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19NSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19NSTJTX1JYX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfTUkyU19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX01JMlNfVFhfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX01JMlNfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9ICAgIDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9NSTJTX1JYX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlNfVFggSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9NSTJTX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfTUkyU19UWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9NSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfTUkyU19SWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDAgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSU5UMF9NSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAxOTIwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIklOVDBfTUkyU19SWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDQgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSU5UNF9NSTJTX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAxOTIwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIklOVDRfTUkyU19SWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UMyBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIklOVDNfTUkyU19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJJTlQzX01JMlNfVFhfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQkvKiBURE0gSG9zdGxlc3MgKi8KLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzBfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9UWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzBfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9SWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF8xX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fVFhfMV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF8xX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fUlhfMV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfMl9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJQUklfVERNX1RYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfMl9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJQUklfVERNX1JYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMyBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzNfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9UWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzNfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9SWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF80X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fVFhfNF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF80X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fUlhfNF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE01IEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfNV9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJQUklfVERNX1RYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfNV9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJQUklfVERNX1JYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNiBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzZfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9UWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzZfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUFJJX1RETV9SWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9UWF83X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fVFhfN19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF83X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlBSSV9URE1fUlhfN19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF8wX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19URE1fVFhfMF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzBfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9SWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMSBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzFfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9UWF8xX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTEgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMV9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTRUNfVERNX1JYXzFfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfMl9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTRUNfVERNX1RYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF8yX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19URE1fUlhfMl9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF8zX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19URE1fVFhfM19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzNfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9SWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzRfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9UWF80X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTQgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNF9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTRUNfVERNX1JYXzRfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE01IEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfNV9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTRUNfVERNX1RYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF81X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19URE1fUlhfNV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF82X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlNFQ19URE1fVFhfNl9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1JYXzZfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9SWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNyBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzdfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiU0VDX1RETV9UWF83X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTcgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfN19ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJTRUNfVERNX1JYXzdfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfMF9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9UWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMF9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9SWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0xIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzFfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fVFhfMV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTEgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzFfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fUlhfMV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF8yX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlRFUlRfVERNX1RYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0yIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF8yX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlRFUlRfVERNX1JYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfM19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9UWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfM19ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9SWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE00IEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzRfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fVFhfNF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTQgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzRfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fUlhfNF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9UWF81X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlRFUlRfVERNX1RYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE01IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF81X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlRFUlRfVERNX1JYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfNl9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9UWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfNl9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJURVJUX1RETV9SWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE03IEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzdfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fVFhfN19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTcgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzdfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVEVSVF9URE1fUlhfN19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzBfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUVVBVF9URE1fVFhfMF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMF9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9SWF8wX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMV9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9UWF8xX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0xIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF8xX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfVERNX1JYXzFfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF8yX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfVERNX1RYXzJfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzJfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUVVBVF9URE1fUlhfMl9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzNfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUVVBVF9URE1fVFhfM19IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfM19ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9SWF8zX0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNF9VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9UWF80X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE00IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF80X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfVERNX1JYXzRfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF81X1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfVERNX1RYXzVfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1JYXzVfRExfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUVVBVF9URE1fUlhfNV9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzZfVUxfSEwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiUVVBVF9URE1fVFhfNl9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNl9ETF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9SWF82X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfN19VTF9ITCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJRVUFUX1RETV9UWF83X0hPU1RMRVNTIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE03IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF83X0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFVQVRfVERNX1JYXzdfSE9TVExFU1MiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9ETCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9VTCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVm9pY2UyIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHNldWRvIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDkiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAgfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQc2V1ZG8gQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUw5IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPQk0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkubmFtZSA9ICJQc2V1ZG8iLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJEVE1GX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJEVE1GX0RMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiRFRNRl9SWF9IT1NUTEVTUyIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQ1BFIExpc3RlbiBBdWRpbyBjYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJDUEVfTFNNX1VMX0hMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDEsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIkNQRV9MU01fTk9IT1NUIiwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZPTFRFX1NUVUIgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZPTFRFX1NUVUJfREwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWT0xURV9TVFVCIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlZPTFRFX1NUVUJfVUwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJWT0xURV9TVFVCIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVk9JQ0UyX1NUVUIgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFMl9TVFVCX0RMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVk9JQ0UyX1NUVUIgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVk9JQ0UyX1NUVUJfVUwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJWT0lDRTJfU1RVQiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE5IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDkiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAotCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTM4NDAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUw5IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAotCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0JNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTkiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRQ0hBVCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUUNIQVRfREwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRQ0hBVCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRQ0hBVF9VTCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlFDSEFUIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIkxTTTFfVUxfSEwiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJCS5yYXRlX21pbiA9IDE2MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIkxTTTEiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTFNNMl9VTF9ITCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCSAgU05EUlZfUENNX1JBVEVfNDgwMDApLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQkJLnJhdGVfbWluID0gMTYwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiTFNNMiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJMU00zX1VMX0hMIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJICBTTkRSVl9QQ01fUkFURV80ODAwMCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCQkucmF0ZV9taW4gPSAxNjAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJMU00zIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIkxTTTRfVUxfSEwiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJCS5yYXRlX21pbiA9IDE2MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIkxTTTQiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTFNNNV9VTF9ITCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCSAgU05EUlZfUENNX1JBVEVfNDgwMDApLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQkJLnJhdGVfbWluID0gMTYwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiTFNNNSIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJMU002X1VMX0hMIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJICBTTkRSVl9QQ01fUkFURV80ODAwMCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCQkucmF0ZV9taW4gPSAxNjAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJMU002IiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIkxTTTdfVUxfSEwiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJCS5yYXRlX21pbiA9IDE2MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIkxTTTciLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTFNNOF9VTF9ITCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCSAgU05EUlZfUENNX1JBVEVfNDgwMDApLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQkJLnJhdGVfbWluID0gMTYwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiTFNNOCIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZvV0xBTiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVm9XTEFOX0RMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVm9XTEFOIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlZvV0xBTl9VTCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX2RhaV9vcHMsCi0JCS5uYW1lID0gIlZvV0xBTiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCS8qIEZFIERBSXMgY3JlYXRlZCBmb3IgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIG9mZmxvYWQgcGxheWJhY2sgKi8KLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTAgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMMTAiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPQk4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTAgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUwxMCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCB8Ci0JCQkJICBTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhMTAiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTEgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMMTEiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPQk4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTExIiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEyIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDEyIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8Ci0JCQkJICBTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCi0JCS5uYW1lID0gIk11bHRpTWVkaWExMiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExMyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiTU1fREwxMyIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAotCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhMTMiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTQgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMMTQiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwIHwKLQkJCQkgIFNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPQk4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5jb21wcmVzc19uZXcgPSBzbmRfc29jX25ld19jb21wcmVzcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTE0IiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTE1IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9ETDE1IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCB8Ci0JCQkJICBTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0JODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCi0JCS5uYW1lID0gIk11bHRpTWVkaWExNSIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExNiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiTU1fREwxNiIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAgfAotCQkJCSAgU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9CTgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExNiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9VTDE2IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLm5hbWUgPSAiTXVsdGlNZWRpYTE2IiwKLQkJLnByb2JlID0gZmVfZGFpX3Byb2JlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVm9pY2VNTW9kZTEgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFTU1PREUxX0RMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCSB9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJWT0lDRU1NT0RFMV9VTCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfZGFpX29wcywKLQkJLm5hbWUgPSAiVm9pY2VNTW9kZTEiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVk9JQ0VNTU9ERTJfREwiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUyIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlZPSUNFTU1PREUyX1VMIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9kYWlfb3BzLAotCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTE3IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIk1NX1VMMTciLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhMTciLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExOCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJNTV9VTDE4IiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZmVfTXVsdGltZWRpYV9kYWlfb3BzLAotCQkuY29tcHJlc3NfbmV3ID0gc25kX3NvY19uZXdfY29tcHJlc3MsCi0JCS5uYW1lID0gIk11bHRpTWVkaWExOCIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTE5IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIk1NX1VMMTkiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDB8Ci0JCQkJCVNORFJWX1BDTV9SQVRFX0tOT1QpLAotCQkJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2ZlX011bHRpbWVkaWFfZGFpX29wcywKLQkJLmNvbXByZXNzX25ldyA9IHNuZF9zb2NfbmV3X2NvbXByZXNzLAotCQkubmFtZSA9ICJNdWx0aU1lZGlhMTkiLAotCQkucHJvYmUgPSBmZV9kYWlfcHJvYmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMjAgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIk1NX0RMMjAiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwfAotCQkJCQlTTkRSVl9QQ01fUkFURV9LTk9UKSwKLQkJCS5mb3JtYXRzID0gKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSksCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMzg0MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMjAgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiTU1fVUwyMCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMHwKLQkJCQkJU05EUlZfUENNX1JBVEVfS05PVCksCi0JCQkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9mZV9NdWx0aW1lZGlhX2RhaV9vcHMsCi0JCS5uYW1lID0gIk11bHRpTWVkaWEyMCIsCi0JCS5wcm9iZSA9IGZlX2RhaV9wcm9iZSwKLQl9LAotfTsKLQotc3RhdGljIGludCBtc21fZmVfZGFpX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiBuYW1lICVzXG4iLCBfX2Z1bmNfXywKLQkJZGV2X25hbWUoJnBkZXYtPmRldikpOwotCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmbXNtX2ZlX2RhaV9jb21wb25lbnQsCi0JCW1zbV9mZV9kYWlzLCBBUlJBWV9TSVpFKG1zbV9mZV9kYWlzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2ZlX2RhaV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9mZV9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktZmUifSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2ZlX2RhaV9kcml2ZXIgPSB7Ci0JLnByb2JlICA9IG1zbV9mZV9kYWlfZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBtc21fZmVfZGFpX2Rldl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLWRhaS1mZSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX2ZlX2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZmVfZGFpX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZmVfZGFpX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fZmVfZGFpX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2ZlX2RhaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9mZV9kYWlfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9mZV9kYWlfZXhpdCk7Ci0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gRnJvbnRlbmQgREFJIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc20tcGNtLWhvc3RsZXNzLmMgYi9zb3VuZC9zb2MvbXNtL21zbS1wY20taG9zdGxlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NjZiNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL21zbS1wY20taG9zdGxlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0KLQotc3RhdGljIGludCBtc21fcGNtX2hvc3RsZXNzX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaWYgKCFzdWJzdHJlYW0pIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmc3Vic3RyZWFtLT5sYXRlbmN5X3BtX3Fvc19yZXEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21faG9zdGxlc3Nfb3BzID0gewotCS5wcmVwYXJlID0gbXNtX3BjbV9ob3N0bGVzc19wcmVwYXJlCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfaG9zdGxlc3NfcGxhdGZvcm0gPSB7Ci0JLm9wcwkJPSAmbXNtX3BjbV9ob3N0bGVzc19vcHMsCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21faG9zdGxlc3NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQotCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKLQkJCQkgICAmbXNtX3NvY19ob3N0bGVzc19wbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9ob3N0bGVzc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9wY21faG9zdGxlc3NfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLWhvc3RsZXNzIn0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9wY21faG9zdGxlc3NfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3BjbV9ob3N0bGVzc19kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9wY21faG9zdGxlc3NfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9wY21faG9zdGxlc3NfcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3BjbV9ob3N0bGVzc19kcml2ZXIpOwotfQotbW9kdWxlX2luaXQobXNtX3NvY19wbGF0Zm9ybV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9zb2NfcGxhdGZvcm1fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fcGNtX2hvc3RsZXNzX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkhvc3RsZXNzIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9tc204OTk4LmMgYi9zb3VuZC9zb2MvbXNtL21zbTg5OTguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViN2QzMC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL21zbTg5OTguYworKysgL2Rldi9udWxsCkBAIC0xLDc0ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dpdGNoLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvamFjay5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KLSNpbmNsdWRlIDxkZXZpY2VfZXZlbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2F1ZGlvX25vdGlmaWVyLmg+Ci0jaW5jbHVkZSAicWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTMzNS5oIgotI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LW1iaGMuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd3NhODgxeC5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJtc204OTk4LWFzb2Mtc25kIgotCi0jZGVmaW5lIF9fQ0hJUFNFVF9fICJNU004OTk4ICIKLSNkZWZpbmUgTVNNX0RBSUxJTktfTkFNRShuYW1lKSAoX19DSElQU0VUX18jbmFtZSkKLQotI2RlZmluZSBTQU1QTElOR19SQVRFXzhLSFogICAgICA4MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haIDExMDI1Ci0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTZLSFogICAgIDE2MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFogIDIyMDUwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzJLSFogICAgIDMyMDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfNDRQMUtIWiAgIDQ0MTAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfNDhLSFogICAgIDQ4MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfODhQMktIWiAgIDg4MjAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfOTZLSFogICAgIDk2MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFogIDE3NjQwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzE5MktIWiAgICAxOTIwMDAKLSNkZWZpbmUgU0FNUExJTkdfUkFURV8zNTJQOEtIWiAgMzUyODAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzg0S0haICAgIDM4NDAwMAotCi0jZGVmaW5lIFdDRDlYWFhfTUJIQ19ERUZfQlVUVE9OUyAgICA4Ci0jZGVmaW5lIFdDRDlYWFhfTUJIQ19ERUZfUkxPQURTICAgICA1Ci0jZGVmaW5lIENPREVDX0VYVF9DTEtfUkFURSAgICAgICAgICA5NjAwMDAwCi0jZGVmaW5lIEFEU1BfU1RBVEVfUkVBRFlfVElNRU9VVF9NUyAzMDAwCi0jZGVmaW5lIERFVl9OQU1FX1NUUl9MRU4gICAgICAgICAgICAzMgotCi0jZGVmaW5lIFdTQTg4MTBfTkFNRV8xICJ3c2E4ODF4LjIwMTcwMjExIgotI2RlZmluZSBXU0E4ODEwX05BTUVfMiAid3NhODgxeC4yMDE3MDIxMiIKLQotI2RlZmluZSBXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYIDIKLSNkZWZpbmUgV0NOX0NEQ19TTElNX1RYX0NIX01BWCAzCi0KLSNkZWZpbmUgVERNX0NIQU5ORUxfTUFYIDgKLSNkZWZpbmUgVERNX1NMT1RfT0ZGU0VUX01BWCA4Ci0KLSNkZWZpbmUgTVNNX0hJRklfT04gMQotCi1lbnVtIHsKLQlTTElNX1JYXzAgPSAwLAotCVNMSU1fUlhfMSwKLQlTTElNX1JYXzIsCi0JU0xJTV9SWF8zLAotCVNMSU1fUlhfNCwKLQlTTElNX1JYXzUsCi0JU0xJTV9SWF82LAotCVNMSU1fUlhfNywKLQlTTElNX1JYX01BWCwKLX07Ci0KLWVudW0gewotCVNMSU1fVFhfMCA9IDAsCi0JU0xJTV9UWF8xLAotCVNMSU1fVFhfMiwKLQlTTElNX1RYXzMsCi0JU0xJTV9UWF80LAotCVNMSU1fVFhfNSwKLQlTTElNX1RYXzYsCi0JU0xJTV9UWF83LAotCVNMSU1fVFhfOCwKLQlTTElNX1RYX01BWCwKLX07Ci0KLWVudW0gewotCVBSSU1fTUkyUyA9IDAsCi0JU0VDX01JMlMsCi0JVEVSVF9NSTJTLAotCVFVQVRfTUkyUywKLQlNSTJTX01BWCwKLX07Ci0KLWVudW0gewotCVBSSU1fQVVYX1BDTSA9IDAsCi0JU0VDX0FVWF9QQ00sCi0JVEVSVF9BVVhfUENNLAotCVFVQVRfQVVYX1BDTSwKLQlBVVhfUENNX01BWCwKLX07Ci0KLWVudW0gewotCVBDTV9JMlNfU0VMX1BSSU0gPSAwLAotCVBDTV9JMlNfU0VMX1NFQywKLQlQQ01fSTJTX1NFTF9URVJULAotCVBDTV9JMlNfU0VMX1FVQVQsCi0JUENNX0kyU19TRUxfTUFYLAotfTsKLQotc3RydWN0IG1pMnNfYXV4X3BjbV9jb21tb25fY29uZiB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0Jdm9pZCAqcGNtX2kyc19zZWxfdnRfYWRkcjsKLX07Ci0KLXN0cnVjdCBtaTJzX2NvbmYgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXUzMiByZWZfY250OwotCXUzMiBtc21faXNfbWkyc19tYXN0ZXI7Ci19OwotCi1zdHJ1Y3QgYXV4cGNtX2NvbmYgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXUzMiByZWZfY250OwotfTsKLQotc3RydWN0IGRldl9jb25maWcgewotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MzIgYml0X2Zvcm1hdDsKLQl1MzIgY2hhbm5lbHM7Ci19OwotCi1lbnVtIHsKLQlIRE1JX1JYX0lEWCA9IDAsCi0JRFBfUlhfSURYLAotCUVYVF9ESVNQX1JYX0lEWF9NQVgsCi19OwotCi1zdHJ1Y3QgbXNtX3dzYTg4MXhfZGV2X2luZm8gewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKLQl1MzIgaW5kZXg7Ci19OwotCi1lbnVtIHBpbmN0cmxfcGluX3N0YXRlIHsKLQlTVEFURV9ESVNBQkxFID0gMCwgLyogQWxsIHBpbnMgYXJlIGluIHNsZWVwIHN0YXRlICovCi0JU1RBVEVfTUkyU19BQ1RJVkUsICAvKiBJUzIgPSBhY3RpdmUsIFRETSA9IHNsZWVwICovCi0JU1RBVEVfVERNX0FDVElWRSwgIC8qIElTMiA9IHNsZWVwLCBURE0gPSBhY3RpdmUgKi8KLX07Ci0KLXN0cnVjdCBtc21fcGluY3RybF9pbmZvIHsKLQlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKLQlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqbWkyc19kaXNhYmxlOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICp0ZG1fZGlzYWJsZTsKLQlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqbWkyc19hY3RpdmU7Ci0Jc3RydWN0IHBpbmN0cmxfc3RhdGUgKnRkbV9hY3RpdmU7Ci0JZW51bSBwaW5jdHJsX3Bpbl9zdGF0ZSBjdXJyX3N0YXRlOwotfTsKLQotc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSB7Ci0JdTMyIG1jbGtfZnJlcTsKLQlpbnQgdXNfZXVyb19ncGlvOyAvKiB1c2VkIGJ5IGdwaW8gZHJpdmVyIEFQSSAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdXNfZXVyb19ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhwaF9lbjFfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICpocGhfZW4wX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKLQlzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyBwaW5jdHJsX2luZm87Ci19OwotCi1zdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyB7Ci0Jdm9pZCogKCpnZXRfYWZlX2NvbmZpZ19mbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKLQl2b2lkICgqbWJoY19oc19kZXRlY3RfZXhpdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwaW5fc3RhdGVzW10gPSB7InNsZWVwIiwgImkycy1hY3RpdmUiLAotCQkJCQkgInRkbS1hY3RpdmUifTsKLQotZW51bSB7Ci0JVERNXzAgPSAwLAotCVRETV8xLAotCVRETV8yLAotCVRETV8zLAotCVRETV80LAotCVRETV81LAotCVRETV82LAotCVRETV83LAotCVRETV9QT1JUX01BWCwKLX07Ci0KLWVudW0gewotCVRETV9QUkkgPSAwLAotCVRETV9TRUMsCi0JVERNX1RFUlQsCi0JVERNX1FVQVQsCi0JVERNX0lOVEVSRkFDRV9NQVgsCi19OwotCi1zdHJ1Y3QgdGRtX3BvcnQgewotCXUzMiBtb2RlOwotCXUzMiBjaGFubmVsOwotfTsKLQotLyogVERNIGRlZmF1bHQgY29uZmlnICovCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgdGRtX3J4X2NmZ1tURE1fSU5URVJGQUNFX01BWF1bVERNX1BPUlRfTUFYXSA9IHsKLQl7IC8qIFBSSSBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCi0JfSwKLQl7IC8qIFNFQyBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCi0JfSwKLQl7IC8qIFRFUlQgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLwotCX0sCi0JeyAvKiBRVUFUIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KLQl9Ci19OwotCi0vKiBURE0gZGVmYXVsdCBjb25maWcgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB0ZG1fdHhfY2ZnW1RETV9JTlRFUkZBQ0VfTUFYXVtURE1fUE9SVF9NQVhdID0gewotCXsgLyogUFJJIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KLQl9LAotCXsgLyogU0VDIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KLQl9LAotCXsgLyogVEVSVCBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCi0JfSwKLQl7IC8qIFFVQVQgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLwotCX0KLX07Ci0KLS8qVERNIGRlZmF1bHQgb2Zmc2V0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRkbV9zbG90X29mZnNldFtURE1fUE9SVF9NQVhdW1RETV9TTE9UX09GRlNFVF9NQVhdID0gewotCXswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjh9LC8qIFRYXzAgfCBSWF8wICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzEgfCBSWF8xICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzIgfCBSWF8yICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzMgfCBSWF8zICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzQgfCBSWF80ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzUgfCBSWF81ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzYgfCBSWF82ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzcgfCBSWF83ICovCi19OwotCi0vKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2Ygc2xpbWJ1cyBjaGFubmVscyAqLwotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fcnhfY2ZnW10gPSB7Ci0JW1NMSU1fUlhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fdHhfY2ZnW10gPSB7Ci0JW1NMSU1fVFhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGV4dGVybmFsIGRpc3BsYXkgQkUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBleHRfZGlzcF9yeF9jZmdbXSA9IHsKLQlbSERNSV9SWF9JRFhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLQlbRFBfUlhfSURYXSA9ICAge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfcnhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHVzYl90eF9jZmcgPSB7Ci0JLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWiwKLQkuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLAotCS5jaGFubmVscyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgcHJveHlfcnhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAyLAotfTsKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3J4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3R4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBhdXhfcGNtX3J4X2NmZ1tdID0gewotCVtQUklNX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTRUNfQVVYX1BDTV0gID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtURVJUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fdHhfY2ZnW10gPSB7Ci0JW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoID0gMjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fdHhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAotCQkJCQkJIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwKLQkJCQkJCSJFaWdodCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZpX2ZlZWRfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCi0JCQkJCSAgIlMzMl9MRSJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqc2xpbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCi0JCQkJCSJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKLQkJCQkJIktIWl84OFAyIiwgIktIWl85NiIsICJLSFpfMTc2UDQiLAotCQkJCQkiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmJ0X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwgIktIWl80OCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVzYl9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCi0JCQkJCSAgICJFaWdodCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmNoX3RleHRbXSA9IHsiVHdvIiwgIlRocmVlIiwgIkZvdXIiLCAiRml2ZSIsCi0JCQkJCSJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKLQkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAotCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJCSJLSFpfODhQMiIsICJLSFpfOTYiLCAiS0haXzE3NlA0IiwKLQkJCQkJIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICpleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAotCQkJCQkiS0haXzE5MiIsICJLSFpfMzIiLCAiS0haXzQ0UDEiLAotCQkJCQkiS0haXzg4UDIiLCAiS0haXzE3NlA0In07Ci1zdGF0aWMgY2hhciBjb25zdCAqdGRtX2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwKLQkJCQkgICAgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwgIkVpZ2h0In07Ci1zdGF0aWMgY2hhciBjb25zdCAqdGRtX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIiwgIlMzMl9MRSJ9Owotc3RhdGljIGNoYXIgY29uc3QgKnRkbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsICJLSFpfMzIiLAotCQkJCQkgICAgICJLSFpfNDRQMSIsICJLSFpfNDgiLCAiS0haXzk2IiwKLQkJCQkJICAgICAiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGF1eHBjbV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2In07Ci1zdGF0aWMgY2hhciBjb25zdCAqbWkyc19yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKLQkJCQkgICAgICAiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJICAgICAgIktIWl85NiIsICJLSFpfMTkyIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWkyc19jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCi0JCQkJCSAgICJFaWdodCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhpZmlfdGV4dFtdID0geyJPZmYiLCAiT24ifTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfY2hzLCBzbGltX3J4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzJfcnhfY2hzLCBzbGltX3J4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfY2hzLCBzbGltX3R4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzFfdHhfY2hzLCBzbGltX3R4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfY2hzLCBzbGltX3J4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzZfcnhfY2hzLCBzbGltX3J4X2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfcnhfY2hzLCB1c2JfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9jaHMsIHVzYl9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodmlfZmVlZF90eF9jaHMsIHZpX2ZlZWRfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGV4dF9kaXNwX3J4X2NocywgY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByb3h5X3J4X2NocywgY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF90eF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGV4dF9kaXNwX3J4X2Zvcm1hdCwgZXh0X2Rpc3BfYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzJfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF90eF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV81X3J4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzZfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGJ0X3NhbXBsZV9yYXRlLCBidF9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X3NhbXBsZV9yYXRlLCB1c2Jfc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9zYW1wbGVfcmF0ZSwgdXNiX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZSwKLQkJCQlleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X2NocywgdGRtX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfZm9ybWF0LCB0ZG1fYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X3NhbXBsZV9yYXRlLCB0ZG1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9jaHMsIHRkbV9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X2Zvcm1hdCwgdGRtX2JpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9zYW1wbGVfcmF0ZSwgdGRtX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRlcnRfbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc190eF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKG1pMnNfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChtaTJzX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaGlmaV9mdW5jdGlvbiwgaGlmaV90ZXh0KTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNwZGV2Owotc3RhdGljIGludCBtc21faGlmaV9jb250cm9sOwotCi1zdGF0aWMgYm9vbCBpc19pbml0aWFsX2Jvb3Q7Ci1zdGF0aWMgYm9vbCBjb2RlY19yZWdfZG9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2ICptc21fYXV4X2RldjsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICptc21fY29kZWNfY29uZjsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyBtc21fY29kZWNfZm47Ci0KLXN0YXRpYyB2b2lkICpkZWZfdGFzaGFfbWJoY19jYWwodm9pZCk7Ci1zdGF0aWMgdm9pZCAqZGVmX3RhdmlsX21iaGNfY2FsKHZvaWQpOwotc3RhdGljIGludCBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQkJCQkJaW50IGVuYWJsZSwgYm9vbCBkYXBtKTsKLXN0YXRpYyBpbnQgbXNtX3dzYTg4MXhfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCk7Ci0KLS8qCi0gKiBOZWVkIHRvIHJlcG9ydCBMSU5FSU4KLSAqIGlmIFIvTCBjaGFubmVsIGltcGVkYW5jZSBpcyBsYXJnZXIgdGhhbiA1SyBvaG0KLSAqLwotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgd2NkX21iaGNfY2ZnID0gewotCS5yZWFkX2Z3X2JpbiA9IGZhbHNlLAotCS5jYWxpYnJhdGlvbiA9IE5VTEwsCi0JLmRldGVjdF9leHRuX2NhYmxlID0gdHJ1ZSwKLQkubW9ub19zdGVyb19kZXRlY3Rpb24gPSBmYWxzZSwKLQkuc3dhcF9nbmRfbWljID0gTlVMTCwKLQkuaHNfZXh0X21pY2JpYXMgPSB0cnVlLAotCS5rZXlfY29kZVswXSA9IEtFWV9NRURJQSwKLQkua2V5X2NvZGVbMV0gPSBLRVlfVk9JQ0VDT01NQU5ELAotCS5rZXlfY29kZVsyXSA9IEtFWV9WT0xVTUVVUCwKLQkua2V5X2NvZGVbM10gPSBLRVlfVk9MVU1FRE9XTiwKLQkua2V5X2NvZGVbNF0gPSAwLAotCS5rZXlfY29kZVs1XSA9IDAsCi0JLmtleV9jb2RlWzZdID0gMCwKLQkua2V5X2NvZGVbN10gPSAwLAotCS5saW5laW5fdGggPSA1MDAwLAotCS5tb2lzdHVyZV9lbiA9IHRydWUsCi0JLm1iaGNfbWljYmlhcyA9IE1JQ19CSUFTXzIsCi0JLmFuY19taWNiaWFzID0gTUlDX0JJQVNfMiwKLQkuZW5hYmxlX2FuY19taWNfZGV0ZWN0ID0gZmFsc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3Y2RfYXVkaW9fcGF0aHNfdGFzaGFbXSA9IHsKLQl7Ik1JQyBCSUFTMSIsIE5VTEwsICJNQ0xLIFRYIn0sCi0JeyJNSUMgQklBUzIiLCBOVUxMLCAiTUNMSyBUWCJ9LAotCXsiTUlDIEJJQVMzIiwgTlVMTCwgIk1DTEsgVFgifSwKLQl7Ik1JQyBCSUFTNCIsIE5VTEwsICJNQ0xLIFRYIn0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSB3Y2RfYXVkaW9fcGF0aHNbXSA9IHsKLQl7Ik1JQyBCSUFTMSIsIE5VTEwsICJNQ0xLIn0sCi0JeyJNSUMgQklBUzIiLCBOVUxMLCAiTUNMSyJ9LAotCXsiTUlDIEJJQVMzIiwgTlVMTCwgIk1DTEsifSwKLQl7Ik1JQyBCSUFTNCIsIE5VTEwsICJNQ0xLIn0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9jbGtfc2V0IG1pMnNfY2xrW01JMlNfTUFYXSA9IHsKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfUFJJX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfVEVSX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9NSTJTX0lCSVQsCi0JCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWkyc19hdXhfcGNtX2NvbW1vbl9jb25mIG1pMnNfYXV4cGNtX2NvbmZbUENNX0kyU19TRUxfTUFYXTsKLXN0YXRpYyBzdHJ1Y3QgbWkyc19jb25mIG1pMnNfaW50Zl9jb25mW01JMlNfTUFYXTsKLXN0YXRpYyBzdHJ1Y3QgYXV4cGNtX2NvbmYgYXV4cGNtX2ludGZfY29uZltBVVhfUENNX01BWF07Ci0KLXN0YXRpYyBpbnQgc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV84OFAyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA1OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA5OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQotewotCWludCBzYW1wbGVfcmF0ZSA9IDA7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfODhQMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE3NlA0S0haOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgOToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOwotCQlicmVhazsKLQljYXNlIDEwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoaW50IGJpdF9mb3JtYXQpCi17Ci0JaW50IHZhbCA9IDA7Ci0KLQlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl2YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQl2YWwgPSAwOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCBzbGltX2dldF9iaXRfZm9ybWF0KGludCB2YWwpCi17Ci0JaW50IGJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQotCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSAwOgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gYml0X2ZtdDsKLX0KLQotc3RhdGljIGludCBzbGltX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlpbnQgcG9ydF9pZCA9IDA7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMF9SWCIsIHNpemVvZigiU0xJTV8wX1JYIikpKQotCQlwb3J0X2lkID0gU0xJTV9SWF8wOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzJfUlgiLCBzaXplb2YoIlNMSU1fMl9SWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fUlhfMjsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV81X1JYIiwgc2l6ZW9mKCJTTElNXzVfUlgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1JYXzU7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fNl9SWCIsIHNpemVvZigiU0xJTV82X1JYIikpKQotCQlwb3J0X2lkID0gU0xJTV9SWF82OwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzBfVFgiLCBzaXplb2YoIlNMSU1fMF9UWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fVFhfMDsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8xX1RYIiwgc2l6ZW9mKCJTTElNXzFfVFgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1RYXzE7Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWw6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBwb3J0X2lkOwotfQotCi1zdGF0aWMgaW50IHNsaW1fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQlzbGltX2dldF9zYW1wbGVfcmF0ZV92YWwoc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fcnhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUgPQotCQlzbGltX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV90eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCXNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHNhbXBsZV9yYXRlID0gMDsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlzYW1wbGVfcmF0ZSA9IHNsaW1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCWlmIChzYW1wbGVfcmF0ZSA9PSBTQU1QTElOR19SQVRFXzQ0UDFLSFopIHsKLQkJcHJfZXJyKCIlczogVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQ6IGZvciBUeCBwYXRoXG4iLAotCQkJX19mdW5jX18sIHNhbXBsZV9yYXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgdmFsdWUgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fcnhfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJCXNsaW1fZ2V0X2JpdF9mb3JtYXRfdmFsKHNsaW1fcnhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3J4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fcnhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCA9Ci0JCXNsaW1fZ2V0X2JpdF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNsaW1bJWRdX3J4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV90eF9iaXRfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQkJc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoc2xpbV90eF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fdHhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0Jc2xpbV90eF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0ID0KLQkJc2xpbV9nZXRfYml0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fdHhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2xpbV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2xpbV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fc2xpbV90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gc2xpbV90eF9jZmdbY2hfbnVtXS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fc2xpbV90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fc2xpbV9bJWRdX3R4X2NoID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fdmlfZmVlZF90eF9jaCAtIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVsZFxuIiwgX19mdW5jX18sCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQltc21fdmlfZmVlZF90eF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKLQotCXByX2RlYnVnKCIlczogbXNtX3ZpX2ZlZWRfdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sIG1zbV92aV9mZWVkX3R4X2NoKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fYnRfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JLyoKLQkgKiBTbGltYnVzXzdfUngvVHggc2FtcGxlIHJhdGUgdmFsdWVzIHNob3VsZCBhbHdheXMgYmUgaW4gc3luYyAoc2FtZSkKLQkgKiB3aGVuIHVzZWQgZm9yIEJUX1NDTyB1c2UgY2FzZS4gUmV0dXJuIGVpdGhlciBSeCBvciBUeCBzYW1wbGUgcmF0ZQotCSAqIHZhbHVlLgotCSAqLwotCXN3aXRjaCAoc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZSA9ICVkIiwgX19mdW5jX18sCi0JCSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAxOgotCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGVzOiBzbGltN19yeCA9ICVkLCBzbGltN190eCA9ICVkLCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sCi0JCSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlLAotCQkgc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSB1c2JfcnhfY2ZnLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHVzYl9yeF9jZmcuY2hhbm5lbHMgLSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdXNiX3J4X2NmZy5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKLQotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2NoID0gJWRcbiIsIF9fZnVuY19fLCB1c2JfcnhfY2ZnLmNoYW5uZWxzKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsOwotCi0Jc3dpdGNoICh1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM4NEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zNTJQOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDEwOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzg4UDJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzIyUDA1S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xMVAwMjVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOwotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMTI6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84OFAyS0haOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCi0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yeF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodXNiX3J4X2NmZy5iaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdXNiX3J4X2NmZy5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAzOgotCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCB1c2JfcnhfY2ZnLmJpdF9mb3JtYXQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSB1c2JfdHhfY2ZnLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHVzYl90eF9jZmcuY2hhbm5lbHMgLSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdXNiX3R4X2NmZy5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMTsKLQotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2NoID0gJWRcbiIsIF9fZnVuY19fLCB1c2JfdHhfY2ZnLmNoYW5uZWxzKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsOwotCi0Jc3dpdGNoICh1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM4NEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zNTJQOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDEwOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzg4UDJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzIyUDA1S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xMVAwMjVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNhbXBsZV9yYXRlX3ZhbDsKLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHVzYl90eF9jZmcuc2FtcGxlX3JhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDEyOgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMTE6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOwotCQlicmVhazsKLQljYXNlIDEwOgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgOToKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfODhQMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVzYl90eF9jZmcuYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVzYl90eF9jZmcuYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMzoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdXNiX3R4X2NmZy5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJIRE1JX1JYIiwgc2l6ZW9mKCJIRE1JX1JYIikpKQotCQlpZHggPSBIRE1JX1JYX0lEWDsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiRGlzcGxheSBQb3J0IFJYIiwKLQkJCSBzaXplb2YoIkRpc3BsYXkgUG9ydCBSWCIpKSkKLQkJaWR4ID0gRFBfUlhfSURYOwotCWVsc2UgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBCRTogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJaWR4ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0Jc3dpdGNoIChleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMToKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyAtIDI7Ci0KLQlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5jaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0KLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKLQotCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmNoID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsOwotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlzd2l0Y2ggKGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE3NlA0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQotCWNhc2UgU0FNUExJTkdfUkFURV84OFAyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA1OwotCQlicmVhazsKLQotCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMzsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAyOwotCQlicmVhazsKLQotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7Ci0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDY6Ci0JCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfODhQMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQotCXByX2RlYnVnKCIlczogY29udHJvbCB2YWx1ZSA9ICVsZCwgZXh0X2Rpc3BfcnhbJWRdLnNhbXBsZV9yYXRlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIGlkeCwKLQkJIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcm94eV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiBwcm94eV9yeCBjaGFubmVscyA9ICVkXG4iLAotCQkgX19mdW5jX18sIHByb3h5X3J4X2NmZy5jaGFubmVscyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcm94eV9yeF9jZmcuY2hhbm5lbHMgLSAyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJveHlfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByb3h5X3J4X2NmZy5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKLQlwcl9kZWJ1ZygiJXM6IHByb3h5X3J4IGNoYW5uZWxzID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcHJveHlfcnhfY2ZnLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQotewotCWludCBzYW1wbGVfcmF0ZSA9IDA7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlOwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGU7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZTsKLX0KLQotc3RhdGljIGludCB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0KLQlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAyOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zNTJQOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM4NEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsOwotCi0Jc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICBzdHJ1Y3QgdGRtX3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQpIHsKLQkJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUkkiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPm1vZGUgPSBURE1fUFJJOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUMiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPm1vZGUgPSBURE1fU0VDOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5tb2RlID0gVERNX1RFUlQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVQiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPm1vZGUgPSBURE1fUVVBVDsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIG1vZGUgaW46ICVzIiwKLQkJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzAiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJICAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF8wIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzA7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzEiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF8xIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzE7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzIiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF8yIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzI7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzMiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF8zIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzM7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzQiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF80IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzUiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF81IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzU7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzYiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF82IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzY7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlJYXzciLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkgfHwKLQkJCSAgIHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJUWF83IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5jaGFubmVsID0gVERNXzc7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjaGFubmVsIGluOiAlcyIsCi0JCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9zYW1wbGVfcmF0ZV92YWwoCi0JCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUgPQotCQkJdGRtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV90eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9zYW1wbGVfcmF0ZV92YWwoCi0JCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUgPQotCQkJdGRtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfZm9ybWF0KGludCB2YWx1ZSkKLXsKLQlpbnQgZm9ybWF0ID0gMDsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDA6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBmb3JtYXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX2dldF9mb3JtYXRfdmFsKGludCBmb3JtYXQpCi17Ci0JaW50IHZhbHVlID0gMDsKLQotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJdmFsdWUgPSAwOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl2YWx1ZSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXZhbHVlID0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmFsdWUgPSAwOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X2Zvcm1hdF92YWwoCi0JCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCA9Ci0JCQl0ZG1fZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9mb3JtYXRfdmFsKAotCQkJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQpOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV90eF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQgPQotCQkJdGRtX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0KLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDE7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDEsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzID0KLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDEpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzIC0gMSwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgPQotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscywKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCi17Ci0JaW50IGlkeDsKLQotCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9BVVhfUENNIiwKLQkJICAgIHNpemVvZigiUFJJTV9BVVhfUENNIikpKQotCQlpZHggPSBQUklNX0FVWF9QQ007Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19BVVhfUENNIiwKLQkJCSBzaXplb2YoIlNFQ19BVVhfUENNIikpKQotCQlpZHggPSBTRUNfQVVYX1BDTTsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9BVVhfUENNIiwKLQkJCSBzaXplb2YoIlRFUlRfQVVYX1BDTSIpKSkKLQkJaWR4ID0gVEVSVF9BVVhfUENNOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX0FVWF9QQ00iLAotCQkJIHNpemVvZigiUVVBVF9BVVhfUENNIikpKQotCQlpZHggPSBRVUFUX0FVWF9QQ007Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIHBvcnQ6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCWlkeCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JICAgICBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9Ci0JCWF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCSAgICAgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1pMnNfZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBpZHg7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fTUkyU19SWCIsCi0JICAgIHNpemVvZigiUFJJTV9NSTJTX1JYIikpKQotCQlpZHggPSBQUklNX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19NSTJTX1JYIiwKLQkJIHNpemVvZigiU0VDX01JMlNfUlgiKSkpCi0JCWlkeCA9IFNFQ19NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX01JMlNfUlgiLAotCQkgc2l6ZW9mKCJURVJUX01JMlNfUlgiKSkpCi0JCWlkeCA9IFRFUlRfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9NSTJTX1JYIiwKLQkJIHNpemVvZigiUVVBVF9NSTJTX1JYIikpKQotCQlpZHggPSBRVUFUX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fTUkyU19UWCIsCi0JCSBzaXplb2YoIlBSSU1fTUkyU19UWCIpKSkKLQkJaWR4ID0gUFJJTV9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfTUkyU19UWCIsCi0JCSBzaXplb2YoIlNFQ19NSTJTX1RYIikpKQotCQlpZHggPSBTRUNfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9NSTJTX1RYIiwKLQkJIHNpemVvZigiVEVSVF9NSTJTX1RYIikpKQotCQlpZHggPSBURVJUX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfTUkyU19UWCIsCi0JCSBzaXplb2YoIlFVQVRfTUkyU19UWCIpKSkKLQkJaWR4ID0gUVVBVF9NSTJTOwotCWVsc2UgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjaGFubmVsOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQlpZHggPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsOwotCi0Jc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAwOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA1OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKLX0KLQotc3RhdGljIGludCBtaTJzX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCi17Ci0JaW50IHNhbXBsZV9yYXRlOwotCi0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZTsKLX0KLQotc3RhdGljIGludCBtaTJzX2dldF9mb3JtYXQoaW50IHZhbHVlKQotewotCWludCBmb3JtYXQ7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGZvcm1hdDsKLX0KLQotc3RhdGljIGludCBtaTJzX2dldF9mb3JtYXRfdmFsdWUoaW50IGZvcm1hdCkKLXsKLQlpbnQgdmFsdWU7Ci0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdmFsdWUgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdmFsdWUgPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl2YWx1ZSA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBtaTJzX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQltaTJzX2dldF9mb3JtYXRfdmFsdWUobWkyc19yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21pMnNfcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPQotCQltaTJzX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSAgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQltaTJzX2dldF9mb3JtYXRfdmFsdWUobWkyc190eF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21pMnNfdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPQotCQltaTJzX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSAgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21faGlmaV9jdHJsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KLQkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9oaWZpX2NvbnRyb2wgPSAlZCIsIF9fZnVuY19fLAotCQkgbXNtX2hpZmlfY29udHJvbCk7Ci0KLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aHBoX2VuMV9ncGlvX3ApIHsKLQkJcHJfZXJyKCIlczogaHBoX2VuMV9ncGlvIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChtc21faGlmaV9jb250cm9sID09IE1TTV9ISUZJX09OKSB7Ci0JCW1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHBkYXRhLT5ocGhfZW4xX2dwaW9fcCk7Ci0JCS8qIDVtc2VjIGRlbGF5IG5lZWRlZCBhcyBwZXIgSFcgcmVxdWlyZW1lbnQgKi8KLQkJdXNsZWVwX3JhbmdlKDUwMDAsIDUwMTApOwotCX0gZWxzZSB7Ci0JCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUocGRhdGEtPmhwaF9lbjFfZ3Bpb19wKTsKLQl9Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21faGlmaV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9oaWZpX2NvbnRyb2wgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBtc21faGlmaV9jb250cm9sKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9oaWZpX2NvbnRyb2w7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21faGlmaV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKLQotCXByX2RlYnVnKCIlcygpIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCW1zbV9oaWZpX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQltc21faGlmaV9jdHJsKGNvZGVjKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3NuZF9jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIENoYW5uZWxzIiwgc2xpbV8wX3J4X2NocywKLQkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBDaGFubmVscyIsIHNsaW1fMl9yeF9jaHMsCi0JCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfVFggQ2hhbm5lbHMiLCBzbGltXzBfdHhfY2hzLAotCQkJbXNtX3NsaW1fdHhfY2hfZ2V0LCBtc21fc2xpbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8xX1RYIENoYW5uZWxzIiwgc2xpbV8xX3R4X2NocywKLQkJCW1zbV9zbGltX3R4X2NoX2dldCwgbXNtX3NsaW1fdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBDaGFubmVscyIsIHNsaW1fNV9yeF9jaHMsCi0JCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzZfUlggQ2hhbm5lbHMiLCBzbGltXzZfcnhfY2hzLAotCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVklfRkVFRF9UWCBDaGFubmVscyIsIHZpX2ZlZWRfdHhfY2hzLAotCQkJbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0LCBtc21fdmlfZmVlZF90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIENoYW5uZWxzIiwgdXNiX3J4X2NocywKLQkJCXVzYl9hdWRpb19yeF9jaF9nZXQsIHVzYl9hdWRpb19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIENoYW5uZWxzIiwgdXNiX3R4X2NocywKLQkJCXVzYl9hdWRpb190eF9jaF9nZXQsIHVzYl9hdWRpb190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiSERNSV9SWCBDaGFubmVscyIsIGV4dF9kaXNwX3J4X2NocywKLQkJCWV4dF9kaXNwX3J4X2NoX2dldCwgZXh0X2Rpc3BfcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkRpc3BsYXkgUG9ydCBSWCBDaGFubmVscyIsIGV4dF9kaXNwX3J4X2NocywKLQkJCWV4dF9kaXNwX3J4X2NoX2dldCwgZXh0X2Rpc3BfcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBST1hZX1JYIENoYW5uZWxzIiwgcHJveHlfcnhfY2hzLAotCQkJcHJveHlfcnhfY2hfZ2V0LCBwcm94eV9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIEZvcm1hdCIsIHNsaW1fMF9yeF9mb3JtYXQsCi0JCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBGb3JtYXQiLCBzbGltXzVfcnhfZm9ybWF0LAotCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzZfUlggRm9ybWF0Iiwgc2xpbV82X3J4X2Zvcm1hdCwKLQkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1RYIEZvcm1hdCIsIHNsaW1fMF90eF9mb3JtYXQsCi0JCQlzbGltX3R4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3R4X2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19SWCBGb3JtYXQiLCB1c2JfcnhfZm9ybWF0LAotCQkJdXNiX2F1ZGlvX3J4X2Zvcm1hdF9nZXQsIHVzYl9hdWRpb19yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19UWCBGb3JtYXQiLCB1c2JfdHhfZm9ybWF0LAotCQkJdXNiX2F1ZGlvX3R4X2Zvcm1hdF9nZXQsIHVzYl9hdWRpb190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkhETUlfUlggQml0IEZvcm1hdCIsIGV4dF9kaXNwX3J4X2Zvcm1hdCwKLQkJCWV4dF9kaXNwX3J4X2Zvcm1hdF9nZXQsIGV4dF9kaXNwX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIEJpdCBGb3JtYXQiLCBleHRfZGlzcF9yeF9mb3JtYXQsCi0JCQlleHRfZGlzcF9yeF9mb3JtYXRfZ2V0LCBleHRfZGlzcF9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBTYW1wbGVSYXRlIiwgc2xpbV8yX3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3R4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV90eF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBTYW1wbGVSYXRlIiwgc2xpbV81X3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBTYW1wbGVSYXRlIiwgc2xpbV82X3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkJUIFNhbXBsZVJhdGUiLCBidF9zYW1wbGVfcmF0ZSwKLQkJCW1zbV9idF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltc21fYnRfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19SWCBTYW1wbGVSYXRlIiwgdXNiX3J4X3NhbXBsZV9yYXRlLAotCQkJdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIFNhbXBsZVJhdGUiLCB1c2JfdHhfc2FtcGxlX3JhdGUsCi0JCQl1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJIRE1JX1JYIFNhbXBsZVJhdGUiLCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZSwKLQkJCWV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggU2FtcGxlUmF0ZSIsIGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlLAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCi0JCQl0ZG1fdHhfZm9ybWF0X2dldCwKLQkJCXRkbV90eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAotCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCi0JCQl0ZG1fdHhfY2hfZ2V0LAotCQkJdGRtX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCi0JCQl0ZG1fcnhfZm9ybWF0X2dldCwKLQkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKLQkJCXRkbV90eF9jaF9nZXQsCi0JCQl0ZG1fdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAotCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBwcmltX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBzZWNfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCB0ZXJ0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgcXVhdF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHByaW1fYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHNlY19hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHRlcnRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBxdWF0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19SWCBTYW1wbGVSYXRlIiwgcHJpbV9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfTUkyU19SWCBTYW1wbGVSYXRlIiwgc2VjX21pMnNfcnhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19SWCBTYW1wbGVSYXRlIiwgdGVydF9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfUlggU2FtcGxlUmF0ZSIsIHF1YXRfbWkyc19yeF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1RYIFNhbXBsZVJhdGUiLCBwcmltX21pMnNfdHhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1RYIFNhbXBsZVJhdGUiLCBzZWNfbWkyc190eF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1RYIFNhbXBsZVJhdGUiLCB0ZXJ0X21pMnNfdHhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19UWCBTYW1wbGVSYXRlIiwgcXVhdF9taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfUlggQ2hhbm5lbHMiLCBwcmltX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1RYIENoYW5uZWxzIiwgcHJpbV9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIENoYW5uZWxzIiwgc2VjX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfVFggQ2hhbm5lbHMiLCBzZWNfbWkyc190eF9jaHMsCi0JCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfUlggQ2hhbm5lbHMiLCB0ZXJ0X21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1RYIENoYW5uZWxzIiwgdGVydF9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBDaGFubmVscyIsIHF1YXRfbWkyc19yeF9jaHMsCi0JCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggQ2hhbm5lbHMiLCBxdWF0X21pMnNfdHhfY2hzLAotCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggRm9ybWF0IiwgbWkyc190eF9mb3JtYXQsCi0JCQltc21fbWkyc190eF9mb3JtYXRfZ2V0LCBtc21fbWkyc190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBGb3JtYXQiLCBtaTJzX3R4X2Zvcm1hdCwKLQkJCW1zbV9taTJzX3R4X2Zvcm1hdF9nZXQsIG1zbV9taTJzX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggRm9ybWF0IiwgbWkyc190eF9mb3JtYXQsCi0JCQltc21fbWkyc190eF9mb3JtYXRfZ2V0LCBtc21fbWkyc190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBGb3JtYXQiLCBtaTJzX3J4X2Zvcm1hdCwKLQkJCW1zbV9taTJzX3J4X2Zvcm1hdF9nZXQsIG1zbV9taTJzX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1RYIEZvcm1hdCIsIG1pMnNfdHhfZm9ybWF0LAotCQkJbXNtX21pMnNfdHhfZm9ybWF0X2dldCwgbXNtX21pMnNfdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJIaUZpIEZ1bmN0aW9uIiwgaGlmaV9mdW5jdGlvbiwgbXNtX2hpZmlfZ2V0LAotCQkJbXNtX2hpZmlfcHV0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGFzaGFfY29kZWMiKSkKLQkJcmV0ID0gdGFzaGFfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCBlbmFibGUsIGRhcG0pOwotCWVsc2UgaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXZpbF9jb2RlYyIpKQotCQlyZXQgPSB0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSk7Ci0JZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB1bmtub3duIGNvZGVjIHRvIGVuYWJsZSBleHQgY2xrXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQkgICBpbnQgZW5hYmxlLCBib29sIGRhcG0pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlYy0+ZGV2KSwgInRhc2hhX2NvZGVjIikpCi0JCXJldCA9IHRhc2hhX2NkY19tY2xrX3R4X2VuYWJsZShjb2RlYywgZW5hYmxlLCBkYXBtKTsKLQllbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21jbGtfdHhfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfdHhfY2xrKGNvZGVjLCAxLCB0cnVlKTsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDAsIHRydWUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWNsa19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF9jbGsoY29kZWMsIDEsIHRydWUpOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2Nsayhjb2RlYywgMCwgdHJ1ZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9oaWZpX2N0cmxfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkgICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KLQkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9oaWZpX2NvbnRyb2wgPSAlZCIsIF9fZnVuY19fLCBtc21faGlmaV9jb250cm9sKTsKLQotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5ocGhfZW4wX2dwaW9fcCkgewotCQlwcl9lcnIoIiVzOiBocGhfZW4wX2dwaW8gaXMgaW52YWxpZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAobXNtX2hpZmlfY29udHJvbCAhPSBNU01fSElGSV9PTikgewotCQlwcl9kZWJ1ZygiJXM6IEhpRmkgbWl4ZXIgY29udHJvbCBpcyBub3Qgc2V0XG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgotCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X2FjdGl2ZV9zdGF0ZShwZGF0YS0+aHBoX2VuMF9ncGlvX3ApOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgotCQltc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKHBkYXRhLT5ocGhfZW4wX2dwaW9fcCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX2RhcG1fd2lkZ2V0c1tdID0gewotCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiTUNMSyIsICBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICAgbXNtX21jbGtfZXZlbnQsCi0JCQkgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiTUNMSyBUWCIsICBTTkRfU09DX05PUE0sIDAsIDAsCi0JbXNtX21jbGtfdHhfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMSBhbXAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzMgYW1wIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8yIGFtcCIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfNCBhbXAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJoaWZpIGFtcCIsIG1zbV9oaWZpX2N0cmxfZXZlbnQpLAotCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJBTkNSaWdodCBIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFOQ0xlZnQgSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJBbmFsb2cgTWljNSIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM2IiwgTlVMTCksCi0KLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzEiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzIiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzQiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzUiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBhcmFtX2lzX21hc2soaW50IHApCi17Ci0JcmV0dXJuIChwID49IFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLKSAmJgotCQkJKHAgPD0gU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9tYXNrICpwYXJhbV90b19tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwKLQkJCQkJICAgICBpbnQgbikKLXsKLQlyZXR1cm4gJihwLT5tYXNrc1tuIC0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdKTsKLX0KLQotc3RhdGljIHZvaWQgcGFyYW1fc2V0X21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBpbnQgbiwgdW5zaWduZWQgaW50IGJpdCkKLXsKLQlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQotCQlyZXR1cm47Ci0JaWYgKHBhcmFtX2lzX21hc2sobikpIHsKLQkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKLQotCQltLT5iaXRzWzBdID0gMDsKLQkJbS0+Yml0c1sxXSA9IDA7Ci0JCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGludDMyX3QgYmVfaWQpCi17Ci0JaW50IGNoX2lkID0gMDsKLQotCXN3aXRjaCAoYmVfaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8wOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8xOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8yOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8zOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF80OwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF82OwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFg6Ci0JCWNoX2lkID0gU0xJTV9UWF8wOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6Ci0JCWNoX2lkID0gU0xJTV9UWF8zOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljaF9pZCA9IFNMSU1fUlhfMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNoX2lkOwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfZGlzcF9nZXRfaWR4X2Zyb21fYmVpZChpbnQzMl90IGJlX2lkKQotewotCWludCBpZHg7Ci0KLQlzd2l0Y2ggKGJlX2lkKSB7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSERNSV9SWDoKLQkJaWR4ID0gSERNSV9SWF9JRFg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWDoKLQkJaWR4ID0gRFBfUlhfSURYOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZXh0X2Rpc3AgQkUgaWQgJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7Ci0JCWlkeCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0JaW50IHJjID0gMDsKLQlpbnQgaWR4OwotCXZvaWQgKmNvbmZpZyA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gTlVMTDsKLQotCXByX2RlYnVnKCIlczogZm9ybWF0ID0gJWQsIHJhdGUgPSAlZFxuIiwKLQkJICBfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQotCXN3aXRjaCAoZGFpX2xpbmstPmlkKSB7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlg6Ci0JCWlkeCA9IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV9yeF9jZmdbaWR4XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYOgotCQlpZHggPSBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGRhaV9saW5rLT5pZCk7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlzbGltX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fdHhfY2ZnW2lkeF0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJc2xpbV90eF9jZmdbMV0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnWzFdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fdHhfY2ZnWzFdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFKTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV84S0haOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IG1zbV92aV9mZWVkX3R4X2NoOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fcnhfY2ZnWzVdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3J4X2NmZ1s1XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3J4X2NmZ1s1XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFg6Ci0JCWNvZGVjID0gcnRkLT5jb2RlYzsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAxOwotCi0JCWNvbmZpZyA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQkJQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcpOwotCQlpZiAoY29uZmlnKSB7Ci0JCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHLAotCQkJCQkgICAgY29uZmlnLCBTTElNQlVTXzVfVFgpOwotCQkJaWYgKHJjKQotCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBwb3J0IGNvbmZpZyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbU0xJTV9UWF84XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJc2xpbV90eF9jZmdbU0xJTV9UWF84XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHVzYl9yeF9jZmcuY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVVNCX1RYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSB1c2JfdHhfY2ZnLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYOgotCQlpZHggPSBtc21fZXh0X2Rpc3BfZ2V0X2lkeF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKLQkJaWYgKGlkeCA8IDApIHsKLQkJCXByX2VycigiJXM6IEluY29ycmVjdCBleHQgZGlzcCBpZHggJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlkeCk7Ci0JCQlyYyA9IGlkeDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWDoKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBwcm94eV9yeF9jZmcuY2hhbm5lbHM7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fUFJJXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fUFJJXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fU0VDXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMDoKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1RFUlRdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fdHhfY2ZnW1RETV9URVJUXVtURE1fMF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMDoKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV90eF9jZmdbVERNX1FVQVRdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1BSSU1fQVVYX1BDTV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1BSSU1fQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUFJJTV9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUFJJTV9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbU0VDX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tTRUNfQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc19yeF9jZmdbU0VDX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfcnhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbU0VDX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tRVUFUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUVVBVF9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgYm9vbCBtc21fc3dhcF9nbmRfbWljKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KLQkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0JaW50IHZhbHVlID0gMDsKLQotCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvX3ApIHsKLQkJdmFsdWUgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHBkYXRhLT51c19ldXJvX2dwaW9fcCk7Ci0JCWlmICh2YWx1ZSkKLQkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCi0JCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKLQkJZWxzZQotCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCi0JCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKLQl9IGVsc2UgaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgewotCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8pOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+dXNfZXVyb19ncGlvLCAhdmFsdWUpOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHN3YXAgc2VsZWN0IHN3aXRjaCAlZCB0byAlZFxuIiwgX19mdW5jX18sIHZhbHVlLCAhdmFsdWUpOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IG1zbV9hZmVfc2V0X2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqY29uZmlnX2RhdGEgPSBOVUxMOwotCi0JaWYgKCFtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4pIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGNvZGVjIGdldCBhZmUgY29uZmlnIG5vdCBpbml0J2VkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCUFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7Ci0JaWYgKGNvbmZpZ19kYXRhKSB7Ci0JCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRywgY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHJlZ2lzdGVycyBjb25maWcgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCi0JCQlBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRywgY29uZmlnX2RhdGEsCi0JCQkJICAgIDApOwotCQlpZiAocmV0KQotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHNldCBjZGMgcmVnaXN0ZXIgcGFnZSBjb25maWdcbiIsCi0JCQkJX19mdW5jX18pOwotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHLCBjb25maWdfZGF0YSwgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBjb25maWcgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hZmVfY2xlYXJfY29uZmlnKHZvaWQpCi17Ci0JYWZlX2NsZWFyX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpOwotCWFmZV9jbGVhcl9jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKTsKLX0KLQotc3RhdGljIGludCBtc21fYWRzcF9wb3dlcl91cF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQlpbnQgYWRzcF9yZWFkeSA9IDA7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArCi0JCW1zZWNzX3RvX2ppZmZpZXMoQURTUF9TVEFURV9SRUFEWV9USU1FT1VUX01TKTsKLQotCWRvIHsKLQkJaWYgKHE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKLQkJCXByX2RlYnVnKCIlczogQURTUCBBdWRpbyBpcyByZWFkeVxuIiwgX19mdW5jX18pOwotCQkJYWRzcF9yZWFkeSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiBBRFNQIHdpbGwgYmUgY29taW5nIHVwIGFmdGVyIHN1YnN5c3RlbSByZXN0YXJ0IGFuZAotCQkgKiBpdCBtaWdodCBub3QgYmUgZnVsbHkgdXAgd2hlbiB0aGUgY29udHJvbCByZWFjaGVzCi0JCSAqIGhlcmUuIFNvLCB3YWl0IGZvciA1MG1zZWMgYmVmb3JlIGNoZWNraW5nIEFEU1Agc3RhdGUKLQkJICovCi0JCW1zbGVlcCg1MCk7Ci0JfSB3aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7Ci0KLQlpZiAoIWFkc3BfcmVhZHkpIHsKLQkJcHJfZXJyKCIlczogdGltZWQgb3V0IHdhaXRpbmcgZm9yIEFEU1AgQXVkaW9cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBlcnJfZmFpbDsKLQl9Ci0KLQlyZXQgPSBtc21fYWZlX3NldF9jb25maWcoY29kZWMpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGNvbmZpZy4gZXJyICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc204OTk4X25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCQkgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKnB0cikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmJlX2RsX25hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlg7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlcnZpY2Ugb3Bjb2RlIDB4JWx4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046Ci0JCS8qCi0JCSAqIFVzZSBmbGFnIHRvIGlnbm9yZSBpbml0aWFsIGJvb3Qgbm90aWZpY2F0aW9ucwotCQkgKiBPbiBpbml0aWFsIGJvb3QgbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGlzCi0JCSAqIGNhbGxlZCBvbiBpbml0LiBUaGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyCi0JCSAqIGFuZCBzZXQgdGhlIGNvbmZpZyBhZ2FpbiBvbiBpbml0aWFsIGJvb3QuCi0JCSAqLwotCQlpZiAoaXNfaW5pdGlhbF9ib290KQotCQkJYnJlYWs7Ci0JCW1zbV9hZmVfY2xlYXJfY29uZmlnKCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKLQkJaWYgKGlzX2luaXRpYWxfYm9vdCkgewotCQkJaXNfaW5pdGlhbF9ib290ID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIXNwZGV2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwZGV2KTsKLQkJcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7Ci0JCWlmICghcnRkKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAotCQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJY29kZWMgPSBydGQtPmNvZGVjOwotCi0JCXJldCA9IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyBmYWlsZWQgcmV0ID0gJWQhXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXJ2aWNlX25iID0gewotCS5ub3RpZmllcl9jYWxsICA9IG1zbTg5OThfbm90aWZpZXJfc2VydmljZV9jYiwKLQkucHJpb3JpdHkgPSAtSU5UX01BWCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZHJ4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICpjb25maWdfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqYXV4X2NvbXA7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQotCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCi0JLyogQ29kZWMgU0xJTUJVUyBjb25maWd1cmF0aW9uCi0JICogUlgxLCBSWDIsIFJYMywgUlg0LCBSWDUsIFJYNiwgUlg3LCBSWDgsIFJYOSwgUlgxMCwgUlgxMSwgUlgxMiwgUlgxMwotCSAqIFRYMSwgVFgyLCBUWDMsIFRYNCwgVFg1LCBUWDYsIFRYNywgVFg4LCBUWDksIFRYMTAsIFRYMTEsIFRYMTIsIFRYMTMKLQkgKiBUWDE0LCBUWDE1LCBUWDE2Ci0JICovCi0JdW5zaWduZWQgaW50IHJ4X2NoW1RBU0hBX1JYX01BWF0gPSB7MTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLAotCQkJCQkgICAgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1Nn07Ci0JdW5zaWduZWQgaW50IHR4X2NoW1RBU0hBX1RYX01BWF0gPSB7MTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywKLQkJCQkJICAgIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCi0JCQkJCSAgICAxNDAsIDE0MSwgMTQyLCAxNDN9OwotCi0JLyogVGF2aWwgQ29kZWMgU0xJTUJVUyBjb25maWd1cmF0aW9uCi0JICogUlgxLCBSWDIsIFJYMywgUlg0LCBSWDUsIFJYNiwgUlg3LCBSWDgKLQkgKiBUWDEsIFRYMiwgVFgzLCBUWDQsIFRYNSwgVFg2LCBUWDcsIFRYOCwgVFg5LCBUWDEwLCBUWDExLCBUWDEyLCBUWDEzCi0JICogVFgxNCwgVFgxNSwgVFgxNgotCSAqLwotCXVuc2lnbmVkIGludCByeF9jaF90YXZpbFtXQ0Q5MzRYX1JYX01BWF0gPSB7MTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsCi0JCQkJCQkgICAgMTQ5LCAxNTAsIDE1MX07Ci0JdW5zaWduZWQgaW50IHR4X2NoX3RhdmlsW1dDRDkzNFhfVFhfTUFYXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwKLQkJCQkJCSAgICAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywKLQkJCQkJCSAgICAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwKLQkJCQkJCSAgICAxNDN9OwotCi0JcHJfaW5mbygiJXM6IGRldl9uYW1lJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZShjcHVfZGFpLT5kZXYpKTsKLQotCXJ0ZC0+cG1kb3duX3RpbWUgPSAwOwotCi0JcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIG1zbV9zbmRfY29udHJvbHMsCi0JCQkJCSBBUlJBWV9TSVpFKG1zbV9zbmRfY29udHJvbHMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZGRfY29kZWNfY29udHJvbHMgZmFpbGVkLCBlcnIgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1zbV9kYXBtX3dpZGdldHMsCi0JCQkJQVJSQVlfU0laRShtc21fZGFwbV93aWRnZXRzKSk7Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2RfYXVkaW9fcGF0aHNfdGFzaGEsCi0JCQkJCUFSUkFZX1NJWkUod2NkX2F1ZGlvX3BhdGhzX3Rhc2hhKSk7Ci0JZWxzZQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2RfYXVkaW9fcGF0aHMsCi0JCQkJCUFSUkFZX1NJWkUod2NkX2F1ZGlvX3BhdGhzKSk7Ci0KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhhbmRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DUmlnaHQgSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQ0xlZnQgSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMxIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWM0Iik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzUiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM1Iik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBbmFsb2cgTWljNiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFESU5QVVQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfSU5QVVQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfT1VUMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFEX0NQRV9PVVQyIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJFQVIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQxIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEVBUiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMSBPVVQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzIgT1VUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhMIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhSIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUY0IFZJIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJWSUlOUFVUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgSFBITCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSFIiKTsKLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjX2RhaS0+ZGV2KSwgInRhc2hhX2NvZGVjIikpIHsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMyIpOwotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkxJTkVPVVQ0Iik7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIExJTkVPVVQxIik7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIExJTkVPVVQyIik7Ci0JfQotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXZpbF9jb2RlYyIpKSB7Ci0JCXNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjb2RlY19kYWksIEFSUkFZX1NJWkUodHhfY2hfdGF2aWwpLAotCQkJCQl0eF9jaF90YXZpbCwgQVJSQVlfU0laRShyeF9jaF90YXZpbCksCi0JCQkJCXJ4X2NoX3RhdmlsKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoKSwKLQkJCQkJdHhfY2gsIEFSUkFZX1NJWkUocnhfY2gpLAotCQkJCQlyeF9jaCk7Ci0JfQotCi0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXZpbF9nZXRfYWZlX2NvbmZpZzsKLQl9IGVsc2UgewotCQltc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4gPSB0YXNoYV9nZXRfYWZlX2NvbmZpZzsKLQkJbXNtX2NvZGVjX2ZuLm1iaGNfaHNfZGV0ZWN0X2V4aXQgPSB0YXNoYV9tYmhjX2hzX2RldGVjdF9leGl0OwotCX0KLQotCXJldCA9IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhjb2RlYyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9hZmVfY2ZnOwotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJCQkJICAgICBBRkVfQUFOQ19WRVJTSU9OKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0FBTkNfVkVSU0lPTiwgY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGFhbmMgdmVyc2lvbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2FmZV9jZmc7Ci0JCX0KLQl9Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKSB7Ci0JCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJCQkJQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUcpOwotCQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHLAotCQkJCQkJIGNvbmZpZ19kYXRhLCAwKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNsaXAgcmVnaXN0ZXJzICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGVycl9hZmVfY2ZnOwotCQkJfQotCQl9Ci0JCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJCUFGRV9DTElQX0JBTktfU0VMKTsKLQkJaWYgKGNvbmZpZ19kYXRhKSB7Ci0JCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0xJUF9CQU5LX1NFTCwgY29uZmlnX2RhdGEsIDApOwotCQkJaWYgKHJldCkgewotCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGJhbmsgc2VsZWN0aW9uICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGVycl9hZmVfY2ZnOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZW5kIHNwZWFrZXIgY29uZmlndXJhdGlvbiBvbmx5IGZvciBXU0E4ODEwLgotCSAqIERlZmFsdXQgY29uZmlndXJhdGlvbiBpcyBmb3IgV1NBODgxNS4KLQkgKi8KLQlwcl9kZWJ1ZygiJXM6IE51bWJlciBvZiBhdXggZGV2aWNlczogJWRcbiIsCi0JCV9fZnVuY19fLCBydGQtPmNhcmQtPm51bV9hdXhfZGV2cyk7Ci0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQlpZiAocnRkLT5jYXJkLT5udW1fYXV4X2RldnMgJiYKLQkJICAgICFsaXN0X2VtcHR5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QpKSB7Ci0JCQlhdXhfY29tcCA9IGxpc3RfZmlyc3RfZW50cnkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCwKLQkJCQkJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50LCBsaXN0X2F1eCk7Ci0JCQlpZiAoIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8Ci0JCQkgICAgIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzIpKSB7Ci0JCQkJdGF2aWxfc2V0X3Nwa3JfbW9kZShydGQtPmNvZGVjLAotCQkJCQkJICAgIFdDRDkzNFhfU1BLUl9NT0RFXzEpOwotCQkJCXRhdmlsX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHJ0ZC0+Y29kZWMsCi0JCQkJCQlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpOwotCQkJfQotCQl9Ci0JCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCQllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY2FyZC0+bW9kdWxlLCAiY29kZWNzIiwKLQkJCQkJCSBjYXJkLT5wcm9jX3Jvb3QpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IENhbm5vdCBjcmVhdGUgY29kZWNzIG1vZHVsZSBlbnRyeVxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJcGRhdGEtPmNvZGVjX3Jvb3QgPSBOVUxMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXBkYXRhLT5jb2RlY19yb290ID0gZW50cnk7Ci0JCXRhdmlsX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LCBjb2RlYyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHJ0ZC0+Y2FyZC0+bnVtX2F1eF9kZXZzICYmCi0JCSAgICAhbGlzdF9lbXB0eSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0KSkgewotCQkJYXV4X2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QsCi0JCQkJCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCwgbGlzdF9hdXgpOwotCQkJaWYgKCFzdHJjbXAoYXV4X2NvbXAtPm5hbWUsIFdTQTg4MTBfTkFNRV8xKSB8fAotCQkJICAgICFzdHJjbXAoYXV4X2NvbXAtPm5hbWUsIFdTQTg4MTBfTkFNRV8yKSkgewotCQkJCXRhc2hhX3NldF9zcGtyX21vZGUocnRkLT5jb2RlYywgU1BLUl9NT0RFXzEpOwotCQkJCXRhc2hhX3NldF9zcGtyX2dhaW5fb2Zmc2V0KHJ0ZC0+Y29kZWMsCi0JCQkJCQkJUlhfR0FJTl9PRkZTRVRfTTFQNV9EQik7Ci0JCQl9Ci0JCX0KLQkJY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0JCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjYXJkLT5tb2R1bGUsICJjb2RlY3MiLAotCQkJCQkJIGNhcmQtPnByb2Nfcm9vdCk7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByX2RlYnVnKCIlczogQ2Fubm90IGNyZWF0ZSBjb2RlY3MgbW9kdWxlIGVudHJ5XG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAwOwotCQkJZ290byBlcnJfc25kX21vZHVsZTsKLQkJfQotCQlwZGF0YS0+Y29kZWNfcm9vdCA9IGVudHJ5OwotCQl0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShwZGF0YS0+Y29kZWNfcm9vdCwgY29kZWMpOwotCX0KLWRvbmU6Ci0JY29kZWNfcmVnX2RvbmUgPSB0cnVlOwotCXJldHVybiAwOwotCi1lcnJfc25kX21vZHVsZToKLWVycl9hZmVfY2ZnOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3djbl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JdW5zaWduZWQgaW50IHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdID0gezE1NywgMTU4fTsKLQl1bnNpZ25lZCBpbnQgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF0gID0gezE1OSwgMTYwLCAxNjF9OwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0KLQlyZXR1cm4gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCi0JCQkJCSAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOwotfQotCi1zdGF0aWMgdm9pZCAqZGVmX3Rhc2hhX21iaGNfY2FsKHZvaWQpCi17Ci0Jdm9pZCAqdGFzaGFfd2NkX2NhbDsKLQlzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7Ci0JdTE2ICpidG5faGlnaDsKLQotCXRhc2hhX3djZF9jYWwgPSBremFsbG9jKFdDRF9NQkhDX0NBTF9TSVpFKFdDRF9NQkhDX0RFRl9CVVRUT05TLAotCQkJCVdDRDlYWFhfTUJIQ19ERUZfUkxPQURTKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0YXNoYV93Y2RfY2FsKQotCQlyZXR1cm4gTlVMTDsKLQotI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIodGFzaGFfd2NkX2NhbCktPlgpID0gKFkpKQotCVModl9oc19tYXgsIDE2MDApOwotI3VuZGVmIFMKLSNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXNoYV93Y2RfY2FsKS0+WCkgPSAoWSkpCi0JUyhudW1fYnRuLCBXQ0RfTUJIQ19ERUZfQlVUVE9OUyk7Ci0jdW5kZWYgUwotCi0JYnRuX2NmZyA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXNoYV93Y2RfY2FsKTsKLQlidG5faGlnaCA9ICgodm9pZCAqKSZidG5fY2ZnLT5fdl9idG5fbG93KSArCi0JCShzaXplb2YoYnRuX2NmZy0+X3ZfYnRuX2xvd1swXSkgKiBidG5fY2ZnLT5udW1fYnRuKTsKLQotCWJ0bl9oaWdoWzBdID0gNzU7Ci0JYnRuX2hpZ2hbMV0gPSAxNTA7Ci0JYnRuX2hpZ2hbMl0gPSAyMzc7Ci0JYnRuX2hpZ2hbM10gPSA1MDA7Ci0JYnRuX2hpZ2hbNF0gPSA1MDA7Ci0JYnRuX2hpZ2hbNV0gPSA1MDA7Ci0JYnRuX2hpZ2hbNl0gPSA1MDA7Ci0JYnRuX2hpZ2hbN10gPSA1MDA7Ci0KLQlyZXR1cm4gdGFzaGFfd2NkX2NhbDsKLX0KLQotc3RhdGljIHZvaWQgKmRlZl90YXZpbF9tYmhjX2NhbCh2b2lkKQotewotCXZvaWQgKnRhdmlsX3djZF9jYWw7Ci0Jc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fY2ZnOwotCXUxNiAqYnRuX2hpZ2g7Ci0KLQl0YXZpbF93Y2RfY2FsID0ga3phbGxvYyhXQ0RfTUJIQ19DQUxfU0laRShXQ0RfTUJIQ19ERUZfQlVUVE9OUywKLQkJCQlXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyksIEdGUF9LRVJORUwpOwotCWlmICghdGF2aWxfd2NkX2NhbCkKLQkJcmV0dXJuIE5VTEw7Ci0KLSNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKHRhdmlsX3djZF9jYWwpLT5YKSA9IChZKSkKLQlTKHZfaHNfbWF4LCAxNjAwKTsKLSN1bmRlZiBTCi0jZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIodGF2aWxfd2NkX2NhbCktPlgpID0gKFkpKQotCVMobnVtX2J0biwgV0NEX01CSENfREVGX0JVVFRPTlMpOwotI3VuZGVmIFMKLQotCWJ0bl9jZmcgPSBXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIodGF2aWxfd2NkX2NhbCk7Ci0JYnRuX2hpZ2ggPSAoKHZvaWQgKikmYnRuX2NmZy0+X3ZfYnRuX2xvdykgKwotCQkoc2l6ZW9mKGJ0bl9jZmctPl92X2J0bl9sb3dbMF0pICogYnRuX2NmZy0+bnVtX2J0bik7Ci0KLQlidG5faGlnaFswXSA9IDc1OwotCWJ0bl9oaWdoWzFdID0gMTUwOwotCWJ0bl9oaWdoWzJdID0gMjM3OwotCWJ0bl9oaWdoWzNdID0gNTAwOwotCWJ0bl9oaWdoWzRdID0gNTAwOwotCWJ0bl9oaWdoWzVdID0gNTAwOwotCWJ0bl9oaWdoWzZdID0gNTAwOwotCWJ0bl9oaWdoWzddID0gNTAwOwotCi0JcmV0dXJuIHRhdmlsX3djZF9jYWw7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCi0JaW50IHJldCA9IDA7Ci0JdTMyIHJ4X2NoW1NMSU1fTUFYX1JYX1BPUlRTXSwgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOwotCXUzMiByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOwotCXUzMiB1c2VyX3NldF90eF9jaCA9IDA7Ci0JdTMyIHJ4X2NoX2NvdW50OwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgpIHsKLQkJCXByX2RlYnVnKCIlczogcnhfNV9jaD0lZFxuIiwgX19mdW5jX18sCi0JCQkJICBzbGltX3J4X2NmZ1s1XS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOwotCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzJfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSBzbGltX3J4X2NmZ1syXS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzJdLmNoYW5uZWxzOwotCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzZfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHMpOwotCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s2XS5jaGFubmVsczsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogcnhfMF9jaD0lZFxuIiwgX19mdW5jX18sCi0JCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzBdLmNoYW5uZWxzOwotCQl9Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCQkJICByeF9jaF9jb3VudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCX0gZWxzZSB7Ci0KLQkJcHJfZGVidWcoIiVzOiAlc190eF9kYWlfaWRfJWRfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJIGNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgdXNlcl9zZXRfdHhfY2gpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCQkgJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXBcbiwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnJfY2hfbWFwOwotCQl9Ci0JCS8qIEZvciA8Y29kZWM+X3R4MSBjYXNlICovCi0JCWlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCkKLQkJCXVzZXJfc2V0X3R4X2NoID0gc2xpbV90eF9jZmdbMF0uY2hhbm5lbHM7Ci0JCS8qIEZvciA8Y29kZWM+X3R4MyBjYXNlICovCi0JCWVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYKQotCQkJdXNlcl9zZXRfdHhfY2ggPSBzbGltX3R4X2NmZ1sxXS5jaGFubmVsczsKLQkJZWxzZSBpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgpCi0JCQl1c2VyX3NldF90eF9jaCA9IG1zbV92aV9mZWVkX3R4X2NoOwotCQllbHNlCi0JCQl1c2VyX3NldF90eF9jaCA9IHR4X2NoX2NudDsKLQotCQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltXzBfdHhfY2goJWQpIHVzZXJfc2V0X3R4X2NoKCVkKSB0eF9jaF9jbnQoJWQpLCBCRSBpZCAoJWQpXG4iLAotCQkJIF9fZnVuY19fLCAgc2xpbV90eF9jZmdbMF0uY2hhbm5lbHMsIHVzZXJfc2V0X3R4X2NoLAotCQkJIHR4X2NoX2NudCwgZGFpX2xpbmstPmlkKTsKLQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKLQkJCQkJCSAgdXNlcl9zZXRfdHhfY2gsIHR4X2NoLCAwLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotZXJyX2NoX21hcDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zbmRfY3BlX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7Ci0KLQlpbnQgcmV0ID0gMDsKLQl1MzIgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOwotCXUzMiB0eF9jaF9jbnQgPSAwOwotCXUzMiB1c2VyX3NldF90eF9jaCA9IDA7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gIT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9zdHJlYW1fdHlwZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6ICVzX3R4X2RhaV9pZF8lZFxuIiwgX19mdW5jX18sCi0JCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQpOwotCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCi0JCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9jaF9tYXA7Ci0JfQotCi0JdXNlcl9zZXRfdHhfY2ggPSB0eF9jaF9jbnQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IHR4X2NoX2NudCglZCkgQkUgaWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJCSAgdXNlcl9zZXRfdHhfY2gsIHR4X2NoLCAwLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZXJyX2NoX21hcDoKLWVycl9zdHJlYW1fdHlwZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltYnVzXzJfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQl1bnNpZ25lZCBpbnQgcnhfY2hbU0xJTV9NQVhfUlhfUE9SVFNdLCB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107Ci0JdW5zaWduZWQgaW50IHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7Ci0JdW5zaWduZWQgaW50IG51bV90eF9jaCA9IDA7Ci0JdW5zaWduZWQgaW50IG51bV9yeF9jaCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQludW1fcnhfY2ggPSAgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0JCXByX2RlYnVnKCIlczogJXMgcnhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3J4X2NoKTsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnJfY2hfbWFwOwotCQl9Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCW51bV9yeF9jaCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCX0gZWxzZSB7Ci0JCW51bV90eF9jaCA9ICBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQkJcHJfZGVidWcoIiVzOiAlcyAgdHhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3R4X2NoKTsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnJfY2hfbWFwOwotCQl9Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAotCQkJCW51bV90eF9jaCwgdHhfY2gsIDAsIDApOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCX0KLQotZXJyX2NoX21hcDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV93Y25faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKLQl1MzIgcnhfY2hbV0NOX0NEQ19TTElNX1JYX0NIX01BWF0sIHR4X2NoW1dDTl9DRENfU0xJTV9UWF9DSF9NQVhdOwotCXUzMiByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6ICVzX3R4X2RhaV9pZF8lZFxuIiwgX19mdW5jX18sCi0JCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQpOwotCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCi0JCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBmYWlsZWQgdG8gZ2V0IEJURk0gY29kZWMgY2hhbiBtYXBcbiwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHR4X2NoX2NudCglZCkgQkUgaWQgJWRcbiIsCi0JCV9fZnVuY19fLCB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7Ci0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKLQkJCQkJICB0eF9jaF9jbnQsIHR4X2NoLCByeF9jaF9jbnQsIHJ4X2NoKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0JaW50IGluZGV4ID0gY3B1X2RhaS0+aWQgLSAxOwotCi0JZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKLQkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCi0JCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7Ci0KLQlpZiAoaW5kZXggPCBQUklNX0FVWF9QQ00gfHwgaW5kZXggPiBRVUFUX0FVWF9QQ00pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLQlpZiAoKythdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDEpIHsKLQkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgewotCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCQlpb3dyaXRlMzIoMSwKLQkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKLQkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlcyBscGFpZl90ZXJ0X211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQl9Ci0JfQotCWlmIChyZXQgPCAwKQotCQlhdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250LS07Ci0KLQltdXRleF91bmxvY2soJmF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9hdXhfcGNtX3NuZF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JaW50IGluZGV4ID0gcnRkLT5jcHVfZGFpLT5pZCAtIDE7Ci0KLQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZCwgZGFpIG5hbWUgJXMsIGRhaSBJRCAlZFxuIiwKLQkJX19mdW5jX18sCi0JCXN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0sCi0JCXJ0ZC0+Y3B1X2RhaS0+bmFtZSwgcnRkLT5jcHVfZGFpLT5pZCk7Ci0KLQlpZiAoaW5kZXggPCBQUklNX0FVWF9QQ00gfHwgaW5kZXggPiBRVUFUX0FVWF9QQ00pIHsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCBydGQtPmNwdV9kYWktPmlkKTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJmF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCWlmICgtLWF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQgPT0gMCkgewotCQlpZiAobWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkciAhPSBOVUxMKSB7Ci0JCQltdXRleF9sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKLQkJCWlvd3JpdGUzMigwLAotCQkJCW1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOwotCQkJbXV0ZXhfdW5sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCi0JCQkJIiVzIGxwYWlmX3RlcnRfbXV4c2VsX3ZpcnRfYWRkciBpcyBOVUxMXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotfQotCi1zdGF0aWMgaW50IG1zbV9nZXRfcG9ydF9pZChpbnQgYmVfaWQpCi17Ci0JaW50IGFmZV9wb3J0X2lkOwotCi0Jc3dpdGNoIChiZV9pZCkgewotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWDoKLQkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWDoKLQkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEJFIGlkOiAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKLQkJYWZlX3BvcnRfaWQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiBhZmVfcG9ydF9pZDsKLX0KLQotc3RhdGljIHUzMiBnZXRfbWkyc19iaXRzX3Blcl9zYW1wbGUodTMyIGJpdF9mb3JtYXQpCi17Ci0JdTMyIGJpdF9wZXJfc2FtcGxlOwotCi0Jc3dpdGNoIChiaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQliaXRfcGVyX3NhbXBsZSA9IDMyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCWJpdF9wZXJfc2FtcGxlID0gMTY7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBiaXRfcGVyX3NhbXBsZTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX21pMnNfY2xrX3ZhbChpbnQgZGFpX2lkLCBpbnQgc3RyZWFtKQotewotCXUzMiBiaXRfcGVyX3NhbXBsZTsKLQotCWlmIChzdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQliaXRfcGVyX3NhbXBsZSA9Ci0JCSAgICBnZXRfbWkyc19iaXRzX3Blcl9zYW1wbGUobWkyc19yeF9jZmdbZGFpX2lkXS5iaXRfZm9ybWF0KTsKLQkJbWkyc19jbGtbZGFpX2lkXS5jbGtfZnJlcV9pbl9oeiA9Ci0JCSAgICBtaTJzX3J4X2NmZ1tkYWlfaWRdLnNhbXBsZV9yYXRlICogMiAqIGJpdF9wZXJfc2FtcGxlOwotCX0gZWxzZSB7Ci0JCWJpdF9wZXJfc2FtcGxlID0KLQkJICAgIGdldF9taTJzX2JpdHNfcGVyX3NhbXBsZShtaTJzX3R4X2NmZ1tkYWlfaWRdLmJpdF9mb3JtYXQpOwotCQltaTJzX2Nsa1tkYWlfaWRdLmNsa19mcmVxX2luX2h6ID0KLQkJICAgIG1pMnNfdHhfY2ZnW2RhaV9pZF0uc2FtcGxlX3JhdGUgKiAyICogYml0X3Blcl9zYW1wbGU7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9taTJzX3NldF9zY2xrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCWludCBwb3J0X2lkID0gMDsKLQlpbnQgaW5kZXggPSBjcHVfZGFpLT5pZDsKLQotCXBvcnRfaWQgPSBtc21fZ2V0X3BvcnRfaWQocnRkLT5kYWlfbGluay0+aWQpOwotCWlmIChwb3J0X2lkIDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IEludmFsaWQgcG9ydF9pZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBwb3J0X2lkOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGVuYWJsZSkgewotCQl1cGRhdGVfbWkyc19jbGtfdmFsKGluZGV4LCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0JCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsICIlczogY2xvY2sgcmF0ZSAldWxcbiIsIF9fZnVuY19fLAotCQkJbWkyc19jbGtbaW5kZXhdLmNsa19mcmVxX2luX2h6KTsKLQl9Ci0KLQltaTJzX2Nsa1tpbmRleF0uZW5hYmxlID0gZW5hYmxlOwotCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIocG9ydF9pZCwKLQkJCQkgICAgICZtaTJzX2Nsa1tpbmRleF0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCi0JCQkiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQgZm9yIHBvcnQgMHgleCAsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NldF9waW5jdHJsKHN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8sCi0JCQkJZW51bSBwaW5jdHJsX3Bpbl9zdGF0ZSBuZXdfc3RhdGUpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGN1cnJfc3RhdGUgPSAwOwotCi0JaWYgKHBpbmN0cmxfaW5mbyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHBpbmN0cmxfaW5mbyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChwaW5jdHJsX2luZm8tPnBpbmN0cmwgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBwaW5jdHJsX2luZm8tPnBpbmN0cmwgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQljdXJyX3N0YXRlID0gcGluY3RybF9pbmZvLT5jdXJyX3N0YXRlOwotCXBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZSA9IG5ld19zdGF0ZTsKLQlwcl9kZWJ1ZygiJXM6IGN1cnJfc3RhdGUgPSAlcyBuZXdfc3RhdGUgPSAlc1xuIiwgX19mdW5jX18sCi0JCSBwaW5fc3RhdGVzW2N1cnJfc3RhdGVdLCBwaW5fc3RhdGVzW3BpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZV0pOwotCi0JaWYgKGN1cnJfc3RhdGUgPT0gcGluY3RybF9pbmZvLT5jdXJyX3N0YXRlKSB7Ci0JCXByX2RlYnVnKCIlczogQWxyZWFkeSBpbiBzYW1lIHN0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChjdXJyX3N0YXRlICE9IFNUQVRFX0RJU0FCTEUgJiYKLQkJcGluY3RybF9pbmZvLT5jdXJyX3N0YXRlICE9IFNUQVRFX0RJU0FCTEUpIHsKLQkJcHJfZGVidWcoIiVzOiBzdGF0ZSBhbHJlYWR5IGFjdGl2ZSBjYW5ub3Qgc3dpdGNoXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN3aXRjaCAocGluY3RybF9pbmZvLT5jdXJyX3N0YXRlKSB7Ci0JY2FzZSBTVEFURV9NSTJTX0FDVElWRToKLQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocGluY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQlwaW5jdHJsX2luZm8tPm1pMnNfYWN0aXZlKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogTUkyUyBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9URE1fQUNUSVZFOgotCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwaW5jdHJsX2luZm8tPnBpbmN0cmwsCi0JCQkJCXBpbmN0cmxfaW5mby0+dGRtX2FjdGl2ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IFRETSBzdGF0ZSBzZWxlY3QgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9ESVNBQkxFOgotCQlpZiAoY3Vycl9zdGF0ZSA9PSBTVEFURV9NSTJTX0FDVElWRSkgewotCQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocGluY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQlwaW5jdHJsX2luZm8tPm1pMnNfZGlzYWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwaW5jdHJsX2luZm8tPnBpbmN0cmwsCi0JCQkJCXBpbmN0cmxfaW5mby0+dGRtX2Rpc2FibGUpOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6ICBzdGF0ZSBkaXNhYmxlIGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFRMTU0gcGluIHN0YXRlIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX3JlbGVhc2VfcGluY3RybChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQlzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyAqcGluY3RybF9pbmZvID0gJnBkYXRhLT5waW5jdHJsX2luZm87Ci0KLQlpZiAocGluY3RybF9pbmZvLT5waW5jdHJsKSB7Ci0JCWRldm1fcGluY3RybF9wdXQocGluY3RybF9pbmZvLT5waW5jdHJsKTsKLQkJcGluY3RybF9pbmZvLT5waW5jdHJsID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dldF9waW5jdHJsKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8gPSBOVUxMOwotCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOwotCWludCByZXQ7Ci0KLQlwaW5jdHJsX2luZm8gPSAmcGRhdGEtPnBpbmN0cmxfaW5mbzsKLQotCWlmIChwaW5jdHJsX2luZm8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBwaW5jdHJsX2luZm8gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwaW5jdHJsID0gZGV2bV9waW5jdHJsX2dldCgmcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSX09SX05VTEwocGluY3RybCkpIHsKLQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCBwaW5jdHJsIGhhbmRsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcGluY3RybF9pbmZvLT5waW5jdHJsID0gcGluY3RybDsKLQotCS8qIGdldCBhbGwgdGhlIHN0YXRlcyBoYW5kbGVzIGZyb20gRGV2aWNlIFRyZWUgKi8KLQlwaW5jdHJsX2luZm8tPm1pMnNfZGlzYWJsZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKHBpbmN0cmwsCi0JCQkJCQkicXVhdC1taTJzLXNsZWVwIik7Ci0JaWYgKElTX0VSUihwaW5jdHJsX2luZm8tPm1pMnNfZGlzYWJsZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBtaTJzX2Rpc2FibGUgcGluc3RhdGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCXBpbmN0cmxfaW5mby0+bWkyc19hY3RpdmUgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShwaW5jdHJsLAotCQkJCQkJInF1YXQtbWkycy1hY3RpdmUiKTsKLQlpZiAoSVNfRVJSKHBpbmN0cmxfaW5mby0+bWkyc19hY3RpdmUpKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgbWkyc19hY3RpdmUgcGluc3RhdGVcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCXBpbmN0cmxfaW5mby0+dGRtX2Rpc2FibGUgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShwaW5jdHJsLAotCQkJCQkJInF1YXQtdGRtLXNsZWVwIik7Ci0JaWYgKElTX0VSUihwaW5jdHJsX2luZm8tPnRkbV9kaXNhYmxlKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHRkbV9kaXNhYmxlIHBpbnN0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQlwaW5jdHJsX2luZm8tPnRkbV9hY3RpdmUgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShwaW5jdHJsLAotCQkJCQkJInF1YXQtdGRtLWFjdGl2ZSIpOwotCWlmIChJU19FUlIocGluY3RybF9pbmZvLT50ZG1fYWN0aXZlKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IHRkbV9hY3RpdmUgcGluc3RhdGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQkvKiBSZXNldCB0aGUgVExNTSBwaW5zIHRvIGEgZGVmYXVsdCBzdGF0ZSAqLwotCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBpbmN0cmxfaW5mby0+cGluY3RybCwKLQkJCQkJcGluY3RybF9pbmZvLT5taTJzX2Rpc2FibGUpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBEaXNhYmxlIFRMTU0gcGlucyBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycjsKLQl9Ci0JcGluY3RybF9pbmZvLT5jdXJyX3N0YXRlID0gU1RBVEVfRElTQUJMRTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JZGV2bV9waW5jdHJsX3B1dChwaW5jdHJsKTsKLQlwaW5jdHJsX2luZm8tPnBpbmN0cmwgPSBOVUxMOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1zbV90ZG1fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCWlmIChjcHVfZGFpLT5pZCA9PSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCkgewotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJCXRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQl9IGVsc2UgaWYgKGNwdV9kYWktPmlkID09IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlgpIHsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fU0VDXVtURE1fMF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLnNhbXBsZV9yYXRlOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGRhaSBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhaSBpZCA9IDB4JXggY2hhbm5lbHMgPSAlZCByYXRlID0gJWQgZm9ybWF0ID0gMHgleFxuIiwKLQkJX19mdW5jX18sIGNwdV9kYWktPmlkLCBjaGFubmVscy0+bWF4LCByYXRlLT5tYXgsCi0JCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc204OTk4X3RkbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2hhbm5lbHMsIHNsb3Rfd2lkdGgsIHNsb3RzOwotCXVuc2lnbmVkIGludCBzbG90X21hc2s7Ci0JdW5zaWduZWQgaW50IHNsb3Rfb2Zmc2V0WzhdID0gezAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOH07Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhaSBpZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0KLQlzbG90cyA9IHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKLQkvKjIgc2xvdCBjb25maWcgLSBiaXRzIDAgYW5kIDEgc2V0IGZvciB0aGUgZmlyc3QgdHdvIHNsb3RzICovCi0Jc2xvdF9tYXNrID0gMHgwMDAwRkZGRiA+PiAoMTYtc2xvdHMpOwotCXNsb3Rfd2lkdGggPSAzMjsKLQljaGFubmVscyA9IHNsb3RzOwotCi0JcHJfZGVidWcoIiVzOiBzbG90X3dpZHRoICVkIHNsb3RzICVkXG4iLCBfX2Z1bmNfXywgc2xvdF93aWR0aCwgc2xvdHMpOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXByX2RlYnVnKCIlczogc2xvdF93aWR0aCAlZFxuIiwgX19mdW5jX18sIHNsb3Rfd2lkdGgpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMCwgc2xvdF9tYXNrLAotCQkJc2xvdHMsIHNsb3Rfd2lkdGgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKLQkJCTAsIE5VTEwsIGNoYW5uZWxzLCBzbG90X29mZnNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgdXNlIGNhc2UsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotZW5kOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtODk5OF90ZG1fc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc3RydWN0IG1zbV9waW5jdHJsX2luZm8gKnBpbmN0cmxfaW5mbyA9ICZwZGF0YS0+cGluY3RybF9pbmZvOwotCi0JcmV0ID0gbXNtX3NldF9waW5jdHJsKHBpbmN0cmxfaW5mbywgU1RBVEVfVERNX0FDVElWRSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogTUkyUyBUTE1NIHBpbmN0cmwgc2V0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtc204OTk4X3RkbV9zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc3RydWN0IG1zbV9waW5jdHJsX2luZm8gKnBpbmN0cmxfaW5mbyA9ICZwZGF0YS0+cGluY3RybF9pbmZvOwotCi0JcmV0ID0gbXNtX3NldF9waW5jdHJsKHBpbmN0cmxfaW5mbywgU1RBVEVfRElTQUJMRSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogTUkyUyBUTE1NIHBpbmN0cmwgc2V0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc204OTk4X3RkbV9iZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbTg5OThfdGRtX3NuZF9od19wYXJhbXMsCi0JLnN0YXJ0dXAgPSBtc204OTk4X3RkbV9zbmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBtc204OTk4X3RkbV9zbmRfc2h1dGRvd24KLX07Ci0KLXN0YXRpYyBpbnQgbXNtX21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgaW5kZXggPSBjcHVfZGFpLT5pZDsKLQl1bnNpZ25lZCBpbnQgZm10ID0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8gPSAmcGRhdGEtPnBpbmN0cmxfaW5mbzsKLQlpbnQgcmV0X3BpbmN0cmwgPSAwOwotCi0JZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKLQkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCi0JCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7Ci0KLQlpZiAoaW5kZXggPCBQUklNX01JMlMgfHwgaW5kZXggPiBRVUFUX01JMlMpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGluZGV4ID09IFFVQVRfTUkyUykgewotCQlyZXRfcGluY3RybCA9IG1zbV9zZXRfcGluY3RybChwaW5jdHJsX2luZm8sIFNUQVRFX01JMlNfQUNUSVZFKTsKLQkJaWYgKHJldF9waW5jdHJsKSB7Ci0JCQlwcl9lcnIoIiVzOiBNSTJTIFRMTU0gcGluY3RybCBzZXQgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldF9waW5jdHJsKTsKLQkJfQotCX0KLQotCS8qCi0JICogTXV4dGV4IHByb3RlY3Rpb24gaW4gY2FzZSB0aGUgc2FtZSBNSTJTCi0JICogaW50ZXJmYWNlIHVzaW5nIGZvciBib3RoIFRYIGFuZCBSWCAgc28KLQkgKiB0aGF0IHRoZSBzYW1lIGNsb2NrIHdvbid0IGJlIGVuYWJsZSB0d2ljZS4KLQkgKi8KLQltdXRleF9sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7Ci0JaWYgKCsrbWkyc19pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQgPT0gMSkgewotCQlyZXQgPSBtc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIHRydWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCQkiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQgdG8gZW5hYmxlIE1JMlMgY2xvY2ssIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gY2xlYW5fdXA7Ci0JCX0KLQkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgewotCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCQlpb3dyaXRlMzIoMCwKLQkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKLQkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlcyBscGFpZl9tdXhzZWxfdmlydF9hZGRyIGlzIE5VTEwgZm9yIGRhaSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gY2xrX29mZjsKLQkJfQotCQkvKiBDaGVjayBpZiBtc20gbmVlZHMgdG8gcHJvdmlkZSB0aGUgY2xvY2sgdG8gdGhlIGludGVyZmFjZSAqLwotCQlpZiAoIW1pMnNfaW50Zl9jb25mW2luZGV4XS5tc21faXNfbWkyc19tYXN0ZXIpCi0JCQlmbXQgPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOwotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIGZtdCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXQgZm10IGNwdSBkYWkgZmFpbGVkIGZvciBNSTJTICglZCksIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7Ci0JCQlnb3RvIGNsa19vZmY7Ci0JCX0KLQl9Ci1jbGtfb2ZmOgotCWlmIChyZXQgPCAwKQotCQltc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKLWNsZWFuX3VwOgotCWlmIChyZXQgPCAwKQotCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudC0tOwotCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtc21fbWkyc19zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JaW50IGluZGV4ID0gcnRkLT5jcHVfZGFpLT5pZDsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8gPSAmcGRhdGEtPnBpbmN0cmxfaW5mbzsKLQlpbnQgcmV0X3BpbmN0cmwgPSAwOwotCi0JcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQlpZiAoaW5kZXggPCBQUklNX01JMlMgfHwgaW5kZXggPiBRVUFUX01JMlMpIHsKLQkJcHJfZXJyKCIlczppbnZhbGlkIE1JMlMgREFJKCVkKVxuIiwgX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJm1pMnNfaW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLQlpZiAoLS1taTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAwKSB7Ci0JCXJldCA9IG1zbV9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgZmFsc2UpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6Y2xvY2sgZGlzYWJsZSBmYWlsZWQgZm9yIE1JMlMgKCVkKTsgcmV0PSVkXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCwgcmV0KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7Ci0KLQlpZiAoaW5kZXggPT0gUVVBVF9NSTJTKSB7Ci0JCXJldF9waW5jdHJsID0gbXNtX3NldF9waW5jdHJsKHBpbmN0cmxfaW5mbywgU1RBVEVfRElTQUJMRSk7Ci0JCWlmIChyZXRfcGluY3RybCkKLQkJCXByX2VycigiJXM6IE1JMlMgVExNTSBwaW5jdHJsIHNldCBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0X3BpbmN0cmwpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fbWkyc19iZV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBtc21fbWkyc19zbmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBtc21fbWkyc19zbmRfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9hdXhfcGNtX2JlX29wcyA9IHsKLQkuc3RhcnR1cCA9IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9hdXhfcGNtX3NuZF9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGRtX3BhcmFtX3NldF9zbG90X21hc2sodTE2IHBvcnRfaWQsIGludCBzbG90X3dpZHRoLAotCQkJCQkgICAgaW50IHNsb3RzKQotewotCXVuc2lnbmVkIGludCBzbG90X21hc2sgPSAwOwotCWludCBpLCBqOwotCXVuc2lnbmVkIGludCAqc2xvdF9vZmZzZXQ7Ci0KLQlmb3IgKGkgPSBURE1fMDsgaSA8IFRETV9QT1JUX01BWDsgaSsrKSB7Ci0JCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W2ldOwotCi0JCWZvciAoaiA9IDA7IGogPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBqKyspIHsKLQkJCWlmIChzbG90X29mZnNldFtqXSAhPSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEKQotCQkJCXNsb3RfbWFzayB8PQotCQkJCSgxIDw8ICgoc2xvdF9vZmZzZXRbal0gKiA4KSAvIHNsb3Rfd2lkdGgpKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBzbG90X21hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RkbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2hhbm5lbHMsIHNsb3Rfd2lkdGgsIHNsb3RzOwotCXVuc2lnbmVkIGludCBzbG90X21hc2s7Ci0JdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKLQlpbnQgb2Zmc2V0X2NoYW5uZWxzID0gMDsKLQlpbnQgaTsKLQotCXByX2RlYnVnKCIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGNwdV9kYWktPmlkKTsKLQotCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0Jc3dpdGNoIChjaGFubmVscykgewotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNDoKLQljYXNlIDU6Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQljYXNlIDg6Ci0JCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCS8qCi0JCSAqIHVwIHRvIDggY2hhbm5lbHMgSFcgY29uZmlnIHNob3VsZAotCQkgKiB1c2UgMzIgYml0IHNsb3Qgd2lkdGggZm9yIG1heCBzdXBwb3J0IG9mCi0JCSAqIHN0cmVhbSBiaXQgd2lkdGguIChzbG90X3dpZHRoID4gYml0X3dpZHRoKQotCQkgKi8KLQkJCXNsb3Rfd2lkdGggPSAzMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBmb3JtYXQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNsb3RzID0gODsKLQkJc2xvdF9tYXNrID0gdGRtX3BhcmFtX3NldF9zbG90X21hc2soY3B1X2RhaS0+aWQsCi0JCQkJCQkgICAgc2xvdF93aWR0aCwKLQkJCQkJCSAgICBzbG90cyk7Ci0JCWlmICghc2xvdF9tYXNrKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNsb3RfbWFzayAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBzbG90X21hc2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBjaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIFRETV9SWF8wIGFuZCBURE1fVFhfMCAqLwotCXN3aXRjaCAoY3B1X2RhaS0+aWQpIHsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W1RETV8wXTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZGFpIGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBpKyspIHsKLQkJaWYgKHNsb3Rfb2Zmc2V0W2ldICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCi0JCQlvZmZzZXRfY2hhbm5lbHMrKzsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG9mZnNldF9jaGFubmVscyA9PSAwKSB7Ci0JCXByX2VycigiJXM6IHNsb3Qgb2Zmc2V0IG5vdCBzdXBwb3J0ZWQsIG9mZnNldF9jaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBvZmZzZXRfY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY2hhbm5lbHMgPiBvZmZzZXRfY2hhbm5lbHMpIHsKLQkJcHJfZXJyKCIlczogY2hhbm5lbHMgJWQgZXhjZWVkIG9mZnNldF9jaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGFubmVscywgb2Zmc2V0X2NoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIDAsIHNsb3RfbWFzaywKLQkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIE5VTEwsCi0JCQkJCQkgIGNoYW5uZWxzLCBzbG90X29mZnNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjcHVfZGFpLCBzbG90X21hc2ssIDAsCi0JCQkJCSAgICAgICBzbG90cywgc2xvdF93aWR0aCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IHRkbSBzbG90LCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCi0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCBjaGFubmVscywKLQkJCQkJCSAgc2xvdF9vZmZzZXQsIDAsIE5VTEwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjaGFubmVsIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fc25kX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2NwZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV9zbmRfY3BlX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3NsaW1idXNfMl9iZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV9zbGltYnVzXzJfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fd2NuX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gbXNtX3djbl9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV90ZG1fYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fdGRtX3NuZF9od19wYXJhbXMKLX07Ci0KLS8qIERpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0tPiBDUFUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX2RhaV9saW5rc1tdID0gewotCS8qIEZyb250RW5kIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLAotCX0sCi0JewotCQkubmFtZSA9ICJWb2ljZU1Nb2RlMSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1TTSBWb0lQIiwKLQkJLnN0cmVhbV9uYW1lID0gIlZvSVAiLAotCQkuY3B1X2RhaV9uYW1lID0gIlZvSVAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tdm9pcC1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JUCwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTCksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4yIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywKLQl9LAotCS8qIEhvc3RsZXNzIFBDTSBwdXJwb3NlICovCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18wIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTMF9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9ICJNU00gQUZFLVBDTSBSWCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgUlgiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MSIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWFmZSIsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTVNNIEFGRS1QQ00gVFgiLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFLVBST1hZIFRYIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yNDAiLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tYWZlIiwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczEpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MxIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJBVVhQQ00gSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIkFVWFBDTV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzEgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMxX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzMgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzQgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVM0X0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShMb3dMYXRlbmN5KSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE1IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiAxIEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTEsCi0JfSwKLQkvKiBNdWx0aXBsZSBUdW5uZWwgaW5zdGFuY2VzICovCi0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MyKSwKLQkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMiIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTciLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE11bHRpTWVkaWExMCksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMTAiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExMCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLjEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTExfTk9JUlEpLAotCQkuc3RyZWFtX25hbWUgPSAiTU1fTk9JUlEiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwKLQl9LAotCS8qIEhETUkgSG9zdGxlc3MgKi8KLQl7Ci0JCS5uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAotCQkuc3RyZWFtX25hbWUgPSAiSERNSV9SWF9IT1NUTEVTUyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiSERNSV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwKLQl9LAotCS8qIExTTSBGRSAqLwotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU00yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU00zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMywKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU000IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNCwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNSBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU001IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNiBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU002IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU003IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNywKLQl9LAotCXsKLQkJLm5hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gOCBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU004IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHsgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNOCwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhOSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhOSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNCksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczQiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNSksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczUiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNiksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczYiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzNyksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczciLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzOCksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczgiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExNSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jb21wcmVzcy1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwKLQl9LAotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTF9OT0lSUV8yKSwKLQkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRXzIiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExNiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LAotCX0sCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3Rhc2hhX2ZlX2RhaV9saW5rc1tdID0gewotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV92aWZlZWRiYWNrIiwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIFVsdHJhc291bmQgUlggREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4MiIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX3NsaW1idXNfMl9iZV9vcHMsCi0JfSwKLQkvKiBVbHRyYXNvdW5kIFRYIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgyIiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLm9wcyA9ICZtc21fc2xpbWJ1c18yX2JlX29wcywKLQl9LAotCS8qIENQRSBMU00gZGlyZWN0IGRhaS1saW5rICovCi0JewotCQkubmFtZSA9ICJDUEUgTGlzdGVuIHNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiQ1BFIExpc3RlbiBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXNsaW0iLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY3BlLWxzbSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWFkMSIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLm9wcyA9ICZtc21fY3BlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU182IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNiBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzZfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JLyogQ1BFIExTTSBFQyBQUCBkaXJlY3QgZGFpLWxpbmsgKi8KLQl7Ci0JCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSBFQ1BQIiwKLQkJLnN0cmVhbV9uYW1lID0gIkNQRSBMaXN0ZW4gQXVkaW8gU2VydmljZSBFQ1BQIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJDUEVfTFNNX05PSE9TVCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtLjMiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX2NwZSIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9mZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdmlmZWVkYmFjayIsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBVbHRyYXNvdW5kIFJYIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDIiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkub3BzID0gJm1zbV9zbGltYnVzXzJfYmVfb3BzLAotCX0sCi0JLyogVWx0cmFzb3VuZCBUWCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MiIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX3NsaW1idXNfMl9iZV9vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX21pc2NfZmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQVNNIExvb3BiYWNrKSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE2IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tbG9vcGJhY2siLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmJlX2lkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiVVNCIEF1ZGlvIEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVVNCQVVESU9fSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShUcmFuc2NvZGUgTG9vcGJhY2sgUGxheWJhY2spLAotCQkuc3RyZWFtX25hbWUgPSAiVHJhbnNjb2RlIExvb3BiYWNrIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tdHJhbnNjb2RlLWxvb3BiYWNrIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShUcmFuc2NvZGUgTG9vcGJhY2sgQ2FwdHVyZSksCi0JCS5zdHJlYW1fbmFtZSA9ICJUcmFuc2NvZGUgTG9vcGJhY2sgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTE4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXRyYW5zY29kZS1sb29wYmFjayIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX2JlX2RhaV9saW5rc1tdID0gewotCS8qIEJhY2tlbmQgQUZFIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIFJlY29yZCBVcGxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIFVwbGluayBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIEluY2FsbCBSZWNvcmQgRG93bmxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIERvd25saW5rIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIDIgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIEZhcmVuZCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yODY3MiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9QUklfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9UWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4OTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3RkbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtODk5OF90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY5MTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGFzaGFfYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JCS5pbml0ID0gJm1zbV9hdWRyeF9pbml0LAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV90eDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18xX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czEgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg2IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgzIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU181X1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk0IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfcngzIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBNQUQgQkUgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU181X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9tYWQxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNl9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM2IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4NCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogU2xpbWJ1cyBWSSBSZWNvcmRpbmcgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU19UWF9WSSwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkzIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdmlmZWVkYmFjayIsCi0JCS5iZV9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGF2aWxfYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcngxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQkJLmluaXQgPSAmbXNtX2F1ZHJ4X2luaXQsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzJfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMiBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDIiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDMiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIE1BRCBCRSAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX21hZDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU182X1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czYgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk2IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcng0IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBTbGltYnVzIFZJIFJlY29yZGluZyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTX1RYX1ZJLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF92aWZlZWRiYWNrIiwKLQkJLmJlX2lkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCi0JCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKLQkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KLQkJICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fd2NuX29wcywKLQkJLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU183X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czcgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJidGZtc2xpbV9zbGF2ZSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19zbGltX3R4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fd2NuX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzhfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzOCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjQwMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fZm1fc2xpbV90eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pbml0ID0gJm1zbV93Y25faW5pdCwKLQkJLm9wcyA9ICZtc21fd2NuX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV4dF9kaXNwX2JlX2RhaV9saW5rW10gPSB7Ci0JLyogSERNSSBCQUNLIEVORCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9IRE1JLAotCQkuc3RyZWFtX25hbWUgPSAiSERNSSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1oZG1pLjgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX2hkbWlfYXVkaW9fY29kZWNfcnhfZGFpIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIERJU1AgUE9SVCBCQUNLIEVORCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9ESVNQTEFZX1BPUlQsCi0JCS5zdHJlYW1fbmFtZSA9ICJEaXNwbGF5IFBvcnQgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZHAuMjQ2MDgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tZXh0LWRpc3AtYXVkaW8tY29kZWMtcngiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtX2RwX2F1ZGlvX2NvZGVjX3J4X2RhaSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9taTJzX2JlX2RhaV9saW5rc1tdID0gewotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9QUklfTUkyU19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2F1eHBjbV9iZV9kYWlfbGlua3NbXSA9IHsKLQkvKiBQcmltYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBTZWNvbmRhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCS8qIFRlcnRpYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9BVVhQQ01fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBRdWF0ZXJuYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfQVVYUENNX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fdGFzaGFfZGFpX2xpbmtzWwotCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV90YXNoYV9mZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV9jb21tb25fbWlzY19mZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV9jb21tb25fYmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fdGFzaGFfYmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUoZXh0X2Rpc3BfYmVfZGFpX2xpbmspICsKLQkJCSBBUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX2F1eHBjbV9iZV9kYWlfbGlua3MpXTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9kYWlfbGlua3NbCi0JCQkgQVJSQVlfU0laRShtc21fY29tbW9uX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX3RhdmlsX2ZlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV90YXZpbF9iZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluaykgKwotCQkJIEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyldOwotCi1zdGF0aWMgaW50IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0JY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCWludCByZXQgPSAwOwotCXZvaWQgKm1iaGNfY2FsaWJyYXRpb247Ci0KLQlydGQgPSBzbmRfc29jX2dldF9wY21fcnVudGltZShjYXJkLCBiZV9kbF9uYW1lKTsKLQlpZiAoIXJ0ZCkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCSIlczogc25kX3NvY19nZXRfcGNtX3J1bnRpbWUgZm9yICVzIGZhaWxlZCFcbiIsCi0JCQlfX2Z1bmNfXywgYmVfZGxfbmFtZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3BjbV9ydW50aW1lOwotCX0KLQotCW1iaGNfY2FsaWJyYXRpb24gPSBkZWZfdGFzaGFfbWJoY19jYWwoKTsKLQlpZiAoIW1iaGNfY2FsaWJyYXRpb24pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfbWJoY19jYWw7Ci0JfQotCXdjZF9tYmhjX2NmZy5jYWxpYnJhdGlvbiA9IG1iaGNfY2FsaWJyYXRpb247Ci0JcmV0ID0gdGFzaGFfbWJoY19oc19kZXRlY3QocnRkLT5jb2RlYywgJndjZF9tYmhjX2NmZyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwgIiVzOiBtYmhjIGhzIGRldGVjdCBmYWlsZWQsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVycl9oc19kZXRlY3Q7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfaHNfZGV0ZWN0OgotCWtmcmVlKG1iaGNfY2FsaWJyYXRpb24pOwotZXJyX21iaGNfY2FsOgotZXJyX3BjbV9ydW50aW1lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9jYXJkX3RhdmlsX2xhdGVfcHJvYmUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQljb25zdCBjaGFyICpiZV9kbF9uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqbWJoY19jYWxpYnJhdGlvbjsKLQotCXJ0ZCA9IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKGNhcmQsIGJlX2RsX25hbWUpOwotCWlmICghcnRkKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJIiVzOiBzbmRfc29jX2dldF9wY21fcnVudGltZSBmb3IgJXMgZmFpbGVkIVxuIiwKLQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcGNtX3J1bnRpbWU7Ci0JfQotCi0JbWJoY19jYWxpYnJhdGlvbiA9IGRlZl90YXZpbF9tYmhjX2NhbCgpOwotCWlmICghbWJoY19jYWxpYnJhdGlvbikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9tYmhjX2NhbDsKLQl9Ci0Jd2NkX21iaGNfY2ZnLmNhbGlicmF0aW9uID0gbWJoY19jYWxpYnJhdGlvbjsKLQlyZXQgPSB0YXZpbF9tYmhjX2hzX2RldGVjdChydGQtPmNvZGVjLCAmd2NkX21iaGNfY2ZnKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXM6IG1iaGMgaHMgZGV0ZWN0IGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2hzX2RldGVjdDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWVycl9oc19kZXRlY3Q6Ci0Ja2ZyZWUobWJoY19jYWxpYnJhdGlvbik7Ci1lcnJfbWJoY19jYWw6Ci1lcnJfcGNtX3J1bnRpbWU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGFzaGFfbXNtID0gewotCS5uYW1lCQk9ICJtc204OTk4LXRhc2hhLXNuZC1jYXJkIiwKLQkubGF0ZV9wcm9iZQk9IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlLAotfTsKLQotc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfdGF2aWxfbXNtID0gewotCS5uYW1lCQk9ICJtc204OTk4LXRhdmlsLXNuZC1jYXJkIiwKLQkubGF0ZV9wcm9iZQk9IG1zbV9zbmRfY2FyZF90YXZpbF9sYXRlX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBtc21fcG9wdWxhdGVfZGFpX2xpbmtfY29tcG9uZW50X29mX25vZGUoCi0JCQkJCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0JaW50IGksIGluZGV4LCByZXQgPSAwOwotCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjYXJkLT5kZXY7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCWlmICghY2RldikgewotCQlwcl9lcnIoIiVzOiBTb3VuZCBjYXJkIGRldmljZSBtZW1vcnkgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2xpbmtzOyBpKyspIHsKLQkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX29mX25vZGUgJiYgZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpCi0JCQljb250aW51ZTsKLQotCQkvKiBwb3B1bGF0ZSBwbGF0Zm9ybV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KLQkJaWYgKGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUgJiYKLQkJICAgICFkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlKSB7Ci0JCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAotCQkJCQkJImFzb2MtcGxhdGZvcm0tbmFtZXMiLAotCQkJCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7Ci0JCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogTm8gbWF0Y2ggZm91bmQgZm9yIHBsYXRmb3JtIG5hbWU6ICVzXG4iLAotCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSk7Ci0JCQkJcmV0ID0gaW5kZXg7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtcGxhdGZvcm0iLAotCQkJCQkgICAgICBpbmRleCk7Ci0JCQlpZiAoIW5wKSB7Ci0JCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBwbGF0Zm9ybSAlcywgaW5kZXggJWQgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSwKLQkJCQkJaW5kZXgpOwotCQkJCXJldCA9IC1FTk9ERVY7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlID0gbnA7Ci0JCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lID0gTlVMTDsKLQkJfQotCi0JCS8qIHBvcHVsYXRlIGNwdV9vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KLQkJaWYgKGRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSAmJiAhZGFpX2xpbmtbaV0uY3B1X29mX25vZGUpIHsKLQkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCi0JCQkJCQkgImFzb2MtY3B1LW5hbWVzIiwKLQkJCQkJCSBkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOwotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY3B1IiwKLQkJCQkJCWluZGV4KTsKLQkJCQlpZiAoIW5wKSB7Ci0JCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgY3B1IGRhaSAlcyBmYWlsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSk7Ci0JCQkJCXJldCA9IC1FTk9ERVY7Ci0JCQkJCWdvdG8gZXJyOwotCQkJCX0KLQkJCQlkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSA9IG5wOwotCQkJCWRhaV9saW5rW2ldLmNwdV9kYWlfbmFtZSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQotCQkvKiBwb3B1bGF0ZSBjb2RlY19vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KLQkJaWYgKGRhaV9saW5rW2ldLmNvZGVjX25hbWUgJiYgIWRhaV9saW5rW2ldLmNvZGVjX29mX25vZGUpIHsKLQkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCi0JCQkJCQkgImFzb2MtY29kZWMtbmFtZXMiLAotCQkJCQkJIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOwotCQkJaWYgKGluZGV4IDwgMCkKLQkJCQljb250aW51ZTsKLQkJCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLCAiYXNvYy1jb2RlYyIsCi0JCQkJCSAgICAgIGluZGV4KTsKLQkJCWlmICghbnApIHsKLQkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNvZGVjICVzIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLmNvZGVjX25hbWUpOwotCQkJCXJldCA9IC1FTk9ERVY7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQlkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlID0gbnA7Ci0JCQlkYWlfbGlua1tpXS5jb2RlY19uYW1lID0gTlVMTDsKLQkJfQotCX0KLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ByZXBhcmVfdXNfZXVybyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KLQkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocGRhdGEtPnVzX2V1cm9fZ3BpbyA+PSAwKSB7Ci0JCWRldl9kYmcoY2FyZC0+ZGV2LCAiJXM6IHVzX2V1cm8gZ3BpbyByZXF1ZXN0ICVkIiwgX19mdW5jX18sCi0JCQlwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT51c19ldXJvX2dwaW8sICJUQVNIQV9DT0RFQ19VU19FVVJPIik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHJlcXVlc3QgY29kZWMgVVMvRVVSTyBncGlvICVkIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCBwZGF0YS0+dXNfZXVyb19ncGlvLCByZXQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXVkcnhfc3R1Yl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQotCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBtc21fc25kX2NvbnRyb2xzLAotCQkJCQkgQVJSQVlfU0laRShtc21fc25kX2NvbnRyb2xzKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IGFkZF9jb2RlY19jb250cm9scyBmYWlsZWQsIGVyciVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtc21fZGFwbV93aWRnZXRzLAotCQkJCUFSUkFZX1NJWkUobXNtX2RhcG1fd2lkZ2V0cykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9zdHViX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGludCByeF9jaFtdID0gezE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwKLQkJCQkxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2fTsKLQl1bnNpZ25lZCBpbnQgdHhfY2hbXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAotCQkJCTEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCi0JCQkJMTQwLCAxNDEsIDE0MiwgMTQzfTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscywKLQkJCQkJCSAgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IFJYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0gZWxzZSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAotCQkJCQkJICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywKLQkJCQkJCSAgdHhfY2gsIDAsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IFRYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3N0dWJfYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fc25kX3N0dWJfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2ZlX2RhaV9saW5rc1tdID0gewotCi0JLyogRnJvbnRFbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9ICJNU01TVFVCIE1lZGlhMSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2JlX2RhaV9saW5rc1tdID0gewotCi0JLyogQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQkJLmluaXQgPSAmbXNtX2F1ZHJ4X3N0dWJfaW5pdCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9zdHViX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX3N0dWJfYmVfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3N0dWJfZGFpX2xpbmtzWwotCQkJIEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fc3R1Yl9iZV9kYWlfbGlua3MpXTsKLQotc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfc3R1Yl9tc20gPSB7Ci0JLm5hbWUJCT0gIm1zbTg5OTgtc3R1Yi1zbmQtY2FyZCIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc204OTk4X2Fzb2NfbWFjaGluZV9vZl9tYXRjaFtdICA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtODk5OC1hc29jLXNuZC10YXNoYSIsCi0JICAuZGF0YSA9ICJ0YXNoYV9jb2RlYyJ9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc204OTk4LWFzb2Mtc25kLXRhdmlsIiwKLQkgIC5kYXRhID0gInRhdmlsX2NvZGVjIn0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbTg5OTgtYXNvYy1zbmQtc3R1YiIsCi0JICAuZGF0YSA9ICJzdHViX2NvZGVjIn0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCAqcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3Moc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlsaW5rOwotCWludCBsZW5fMSwgbGVuXzIsIGxlbl8zLCBsZW5fNDsKLQlpbnQgdG90YWxfbGlua3M7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUobXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsIGRldi0+b2Zfbm9kZSk7Ci0JaWYgKCFtYXRjaCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBObyBEVCBtYXRjaCBmb3VuZCBmb3Igc291bmQgY2FyZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJ0YXNoYV9jb2RlYyIpKSB7Ci0JCWNhcmQgPSAmc25kX3NvY19jYXJkX3Rhc2hhX21zbTsKLQkJbGVuXzEgPSBBUlJBWV9TSVpFKG1zbV9jb21tb25fZGFpX2xpbmtzKTsKLQkJbGVuXzIgPSBsZW5fMSArIEFSUkFZX1NJWkUobXNtX3Rhc2hhX2ZlX2RhaV9saW5rcyk7Ci0JCWxlbl8zID0gbGVuXzIgKyBBUlJBWV9TSVpFKG1zbV9jb21tb25fbWlzY19mZV9kYWlfbGlua3MpOwotCQlsZW5fNCA9IGxlbl8zICsgQVJSQVlfU0laRShtc21fY29tbW9uX2JlX2RhaV9saW5rcyk7Ci0JCXRvdGFsX2xpbmtzID0gbGVuXzQgKyBBUlJBWV9TSVpFKG1zbV90YXNoYV9iZV9kYWlfbGlua3MpOwotCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcywKLQkJICAgICAgIG1zbV9jb21tb25fZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV9jb21tb25fZGFpX2xpbmtzKSk7Ci0JCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgbGVuXzEsCi0JCSAgICAgICBtc21fdGFzaGFfZmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV90YXNoYV9mZV9kYWlfbGlua3MpKTsKLQkJbWVtY3B5KG1zbV90YXNoYV9kYWlfbGlua3MgKyBsZW5fMiwKLQkJICAgICAgIG1zbV9jb21tb25fbWlzY19mZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcyArIGxlbl8zLAotCQkgICAgICAgbXNtX2NvbW1vbl9iZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX2NvbW1vbl9iZV9kYWlfbGlua3MpKTsKLQkJbWVtY3B5KG1zbV90YXNoYV9kYWlfbGlua3MgKyBsZW5fNCwKLQkJICAgICAgIG1zbV90YXNoYV9iZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3Rhc2hhX2JlX2RhaV9saW5rcykpOwotCi0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSx3Y24tYnRmbSIpKSB7Ci0JCQlkZXZfZGJnKGRldiwgIiVzKCk6IFdDTiBCVEZNIHN1cHBvcnQgcHJlc2VudFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcyArIHRvdGFsX2xpbmtzLAotCQkJICAgICAgIG1zbV93Y25fYmVfZGFpX2xpbmtzLAotCQkJICAgICAgIHNpemVvZihtc21fd2NuX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxleHQtZGlzcC1hdWRpby1yeCIpKSB7Ci0JCQlkZXZfZGJnKGRldiwgIiVzKCk6IEV4dGVybmFsIGRpc3BsYXkgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQlleHRfZGlzcF9iZV9kYWlfbGluaywKLQkJCXNpemVvZihleHRfZGlzcF9iZV9kYWlfbGluaykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluayk7Ci0JCX0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCi0JCQkJCSAgInFjb20sbWkycy1hdWRpby1pbnRmIikpIHsKLQkJCW1lbWNweShtc21fdGFzaGFfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQkgICAgICAgbXNtX21pMnNfYmVfZGFpX2xpbmtzLAotCQkJICAgICAgIHNpemVvZihtc21fbWkyc19iZV9kYWlfbGlua3MpKTsKLQkJCXRvdGFsX2xpbmtzICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7Ci0JCQltZW1jcHkobXNtX3Rhc2hhX2RhaV9saW5rcyArIHRvdGFsX2xpbmtzLAotCQkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAotCQkJICAgICAgIHNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQkJZGFpbGluayA9IG1zbV90YXNoYV9kYWlfbGlua3M7Ci0JfSAgZWxzZSBpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhdmlsX2NvZGVjIikpIHsKLQkJY2FyZCA9ICZzbmRfc29jX2NhcmRfdGF2aWxfbXNtOwotCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpOwotCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc21fdGF2aWxfZmVfZGFpX2xpbmtzKTsKLQkJbGVuXzMgPSBsZW5fMiArIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcyk7Ci0JCWxlbl80ID0gbGVuXzMgKyBBUlJBWV9TSVpFKG1zbV9jb21tb25fYmVfZGFpX2xpbmtzKTsKLQkJdG90YWxfbGlua3MgPSBsZW5fNCArIEFSUkFZX1NJWkUobXNtX3RhdmlsX2JlX2RhaV9saW5rcyk7Ci0JCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzLAotCQkgICAgICAgbXNtX2NvbW1vbl9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX2NvbW1vbl9kYWlfbGlua3MpKTsKLQkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyBsZW5fMSwKLQkJICAgICAgIG1zbV90YXZpbF9mZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3RhdmlsX2ZlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3RhdmlsX2RhaV9saW5rcyArIGxlbl8yLAotCQkgICAgICAgbXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fY29tbW9uX21pc2NfZmVfZGFpX2xpbmtzKSk7Ci0JCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgbGVuXzMsCi0JCSAgICAgICBtc21fY29tbW9uX2JlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2JlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3RhdmlsX2RhaV9saW5rcyArIGxlbl80LAotCQkgICAgICAgbXNtX3RhdmlsX2JlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fdGF2aWxfYmVfZGFpX2xpbmtzKSk7Ci0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLHdjbi1idGZtIikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCi0JCQkgICAgICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7Ci0JCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKLQkJfQotCi0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4IikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogZXh0IGRpc3AgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQkgICAgICAgZXh0X2Rpc3BfYmVfZGFpX2xpbmssCi0JCQkgICAgICAgc2l6ZW9mKGV4dF9kaXNwX2JlX2RhaV9saW5rKSk7Ci0JCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxtaTJzLWF1ZGlvLWludGYiKSkgewotCQkJbWVtY3B5KG1zbV90YXZpbF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKLQkJCSAgICAgICBtc21fbWkyc19iZV9kYWlfbGlua3MsCi0JCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpOwotCQl9Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLGF1eHBjbS1hdWRpby1pbnRmIikpIHsKLQkJCW1lbWNweShtc21fdGF2aWxfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQltc21fYXV4cGNtX2JlX2RhaV9saW5rcywKLQkJCXNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQkJZGFpbGluayA9IG1zbV90YXZpbF9kYWlfbGlua3M7Ci0JfSBlbHNlIGlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAic3R1Yl9jb2RlYyIpKSB7Ci0JCWNhcmQgPSAmc25kX3NvY19jYXJkX3N0dWJfbXNtOwotCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKTsKLQkJbGVuXzIgPSBsZW5fMSArIEFSUkFZX1NJWkUobXNtX3N0dWJfYmVfZGFpX2xpbmtzKTsKLQotCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzLAotCQkgICAgICAgbXNtX3N0dWJfZmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV9zdHViX2ZlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzICsgbGVuXzEsCi0JCSAgICAgICBtc21fc3R1Yl9iZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3N0dWJfYmVfZGFpX2xpbmtzKSk7Ci0KLQkJZGFpbGluayA9IG1zbV9zdHViX2RhaV9saW5rczsKLQkJdG90YWxfbGlua3MgPSBsZW5fMjsKLQl9Ci0KLQlpZiAoY2FyZCkgewotCQljYXJkLT5kYWlfbGluayA9IGRhaWxpbms7Ci0JCWNhcmQtPm51bV9saW5rcyA9IHRvdGFsX2xpbmtzOwotCX0KLQotCXJldHVybiBjYXJkOwotfQotCi1zdGF0aWMgaW50IG1zbV93c2E4ODF4X2luaXQoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCi17Ci0JdTggc3BrbGVmdF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMCwgMTAxLCAxMDIsIDEwNn07Ci0JdTggc3BrcmlnaHRfcG9ydHNbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsxMDMsIDEwNCwgMTA1LCAxMDd9OwotCXVuc2lnbmVkIGludCBjaF9yYXRlW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MjQwMCwgNjAwLCAzMDAsIDEyMDB9OwotCXVuc2lnbmVkIGludCBjaF9tYXNrW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MHgxLCAweEYsIDB4MywgMHgzfTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYyhjb21wb25lbnQpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlcyBjb2RlYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQotCWlmICghc3RyY21wKGNvbXBvbmVudC0+bmFtZV9wcmVmaXgsICJTcGtyTGVmdCIpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIGxlZnQgY2ggbWFwIHRvIGNvZGVjICVzXG4iLAotCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7Ci0JCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrbGVmdF9wb3J0c1swXSwKLQkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAotCQkJCSZjaF9yYXRlWzBdKTsKLQkJaWYgKGRhcG0tPmNvbXBvbmVudCkgewotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBJTiIpOwotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBTUEtSIik7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JSaWdodCIpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIHJpZ2h0IGNoIG1hcCB0byBjb2RlYyAlc1xuIiwKLQkJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm5hbWUpOwotCQl3c2E4ODF4X3NldF9jaGFubmVsX21hcChjb2RlYywgJnNwa3JpZ2h0X3BvcnRzWzBdLAotCQkJCVdTQTg4MVhfTUFYX1NXUl9QT1JUUywgJmNoX21hc2tbMF0sCi0JCQkJJmNoX3JhdGVbMF0pOwotCQlpZiAoZGFwbS0+Y29tcG9uZW50KSB7Ci0JCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JSaWdodCBJTiIpOwotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyUmlnaHQgU1BLUiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdyb25nIGNvZGVjIG5hbWUgJXNcbiIsIF9fZnVuY19fLAotCQkJY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfY29kZWM7Ci0JfQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvbXBvbmVudC0+Y2FyZCk7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19yb290KQotCQl3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LAotCQkJCQkJICAgICAgY29kZWMpOwotCi1lcnJfY29kZWM6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21faW5pdF93c2FfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKndzYV9vZl9ub2RlOwotCXUzMiB3c2FfbWF4X2RldnM7Ci0JdTMyIHdzYV9kZXZfY250OwotCWludCBpOwotCXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKLQljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOwotCWNoYXIgKmRldl9uYW1lX3N0ciA9IE5VTEw7Ci0JaW50IGZvdW5kID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkgICAicWNvbSx3c2EtbWF4LWRldnMiLCAmd3NhX21heF9kZXZzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSAiJXM6IHdzYS1tYXgtZGV2cyBwcm9wZXJ0eSBtaXNzaW5nIGluIERUICVzLCByZXQgPSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSwgcmV0KTsKLQkJZ290byBlcnJfZHQ7Ci0JfQotCWlmICh3c2FfbWF4X2RldnMgPT0gMCkgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LAotCQkJICIlczogTWF4IFdTQSBkZXZpY2VzIGlzIDAgZm9yIHRoaXMgdGFyZ2V0P1xuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2R0OwotCX0KLQotCS8qIEdldCBjb3VudCBvZiBXU0EgZGV2aWNlIHBoYW5kbGVzIGZvciB0aGlzIHBsYXRmb3JtICovCi0Jd3NhX2Rldl9jbnQgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCSAicWNvbSx3c2EtZGV2cyIsIE5VTEwpOwotCWlmICh3c2FfZGV2X2NudCA9PSAtRU5PRU5UKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICIlczogTm8gd3NhIGRldmljZSBkZWZpbmVkIGluIERULlxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2R0OwotCX0gZWxzZSBpZiAod3NhX2Rldl9jbnQgPD0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IEVycm9yIHJlYWRpbmcgd3NhIGRldmljZSBmcm9tIERULiB3c2FfZGV2X2NudCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHdzYV9kZXZfY250KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfZHQ7Ci0JfQotCi0JLyoKLQkgKiBFeHBlY3QgdG90YWwgcGhhbmRsZXMgY291bnQgdG8gYmUgTk9UIGxlc3MgdGhhbiBtYXhpbXVtIHBvc3NpYmxlCi0JICogV1NBIGNvdW50LiBIb3dldmVyLCBpZiBpdCBpcyBsZXNzLCB0aGVuIGFzc2lnbiBzYW1lIHZhbHVlIHRvCi0JICogbWF4IGNvdW50IGFzIHdlbGwuCi0JICovCi0JaWYgKHdzYV9kZXZfY250IDwgd3NhX21heF9kZXZzKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogd3NhX21heF9kZXZzID0gJWQgY2Fubm90IGV4Y2VlZCB3c2FfZGV2X2NudCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHdzYV9tYXhfZGV2cywgd3NhX2Rldl9jbnQpOwotCQl3c2FfbWF4X2RldnMgPSB3c2FfZGV2X2NudDsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgcHJlZml4IHN0cmluZyBwYXNzZWQgZm9yIGVhY2ggV1NBIGRldmljZSAqLwotCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSJxY29tLHdzYS1hdXgtZGV2LXByZWZpeCIpOwotCWlmIChyZXQgIT0gd3NhX2Rldl9jbnQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBleHBlY3RpbmcgJWQgd3NhIHByZWZpeC4gRGVmaW5lZCBvbmx5ICVkIGluIERUXG4iLAotCQkJX19mdW5jX18sIHdzYV9kZXZfY250LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9kdDsKLQl9Ci0KLQkvKgotCSAqIEFsbG9jIG1lbSB0byBzdG9yZSBwaGFuZGxlIGFuZCBpbmRleCBpbmZvIG9mIFdTQSBkZXZpY2UsIGlmIGFscmVhZHkKLQkgKiByZWdpc3RlcmVkIHdpdGggQUxTQSBjb3JlCi0JICovCi0Jd3NhODgxeF9kZXZfaW5mbyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB3c2FfbWF4X2RldnMsCi0JCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3dzYTg4MXhfZGV2X2luZm8pLAotCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXdzYTg4MXhfZGV2X2luZm8pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfbWVtOwotCX0KLQotCS8qCi0JICogc2VhcmNoIGFuZCBjaGVjayB3aGV0aGVyIGFsbCBXU0EgZGV2aWNlcyBhcmUgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgb3Igbm90LiBJZiBmb3VuZCBhIG5vZGUsIHN0b3JlCi0JICogdGhlIG5vZGUgYW5kIHRoZSBpbmRleCBpbiBhIGxvY2FsIGFycmF5IG9mIHN0cnVjdCBmb3IgbGF0ZXIKLQkgKiB1c2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHdzYV9kZXZfY250OyBpKyspIHsKLQkJd3NhX29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkgICAgInFjb20sd3NhLWRldnMiLCBpKTsKLQkJaWYgKHVubGlrZWx5KCF3c2Ffb2Zfbm9kZSkpIHsKLQkJCS8qIHdlIHNob3VsZCBub3QgYmUgaGVyZSAqLwotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSIlczogd3NhIGRldiBub2RlIGlzIG5vdCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9kZXZfbm9kZTsKLQkJfQotCQlpZiAoc29jX2ZpbmRfY29tcG9uZW50KHdzYV9vZl9ub2RlLCBOVUxMKSkgewotCQkJLyogV1NBIGRldmljZSByZWdpc3RlcmVkIHdpdGggQUxTQSBjb3JlICovCi0JCQl3c2E4ODF4X2Rldl9pbmZvW2ZvdW5kXS5vZl9ub2RlID0gd3NhX29mX25vZGU7Ci0JCQl3c2E4ODF4X2Rldl9pbmZvW2ZvdW5kXS5pbmRleCA9IGk7Ci0JCQlmb3VuZCsrOwotCQkJaWYgKGZvdW5kID09IHdzYV9tYXhfZGV2cykKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChmb3VuZCA8IHdzYV9tYXhfZGV2cykgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBmaW5kICVkIGNvbXBvbmVudHMuIEZvdW5kIG9ubHkgJWRcbiIsCi0JCQlfX2Z1bmNfXywgd3NhX21heF9kZXZzLCBmb3VuZCk7Ci0JCXJldHVybiAtRVBST0JFX0RFRkVSOwotCX0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LAotCQkiJXM6IGZvdW5kICVkIHdzYTg4MXggZGV2aWNlcyByZWdpc3RlcmVkIHdpdGggQUxTQSBjb3JlXG4iLAotCQlfX2Z1bmNfXywgZm91bmQpOwotCi0JY2FyZC0+bnVtX2F1eF9kZXZzID0gd3NhX21heF9kZXZzOwotCWNhcmQtPm51bV9jb25maWdzID0gd3NhX21heF9kZXZzOwotCi0JLyogQWxsb2MgYXJyYXkgb2YgQVVYIGRldnMgc3RydWN0ICovCi0JbXNtX2F1eF9kZXYgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgY2FyZC0+bnVtX2F1eF9kZXZzLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfYXV4X2RldiksCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghbXNtX2F1eF9kZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYXV4ZGV2X21lbTsKLQl9Ci0KLQkvKiBBbGxvYyBhcnJheSBvZiBjb2RlYyBjb25mIHN0cnVjdCAqLwotCW1zbV9jb2RlY19jb25mID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNhcmQtPm51bV9hdXhfZGV2cywKLQkJCQkJICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiksCi0JCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21fY29kZWNfY29uZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9jb2RlY19jb25mOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fYXV4X2RldnM7IGkrKykgewotCQlkZXZfbmFtZV9zdHIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgREVWX05BTUVfU1RSX0xFTiwKLQkJCQkJICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWRldl9uYW1lX3N0cikgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2Rldl9zdHI7Ci0JCX0KLQotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCSAgICAicWNvbSx3c2EtYXV4LWRldi1wcmVmaXgiLAotCQkJCQkJICAgIHdzYTg4MXhfZGV2X2luZm9baV0uaW5kZXgsCi0JCQkJCQkgICAgd3NhX2F1eGRldl9uYW1lX3ByZWZpeCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiJXM6IGZhaWxlZCB0byByZWFkIHdzYSBhdXggZGV2IHByZWZpeCwgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfZHRfcHJvcDsKLQkJfQotCi0JCXNucHJpbnRmKGRldl9uYW1lX3N0ciwgc3RybGVuKCJ3c2E4ODF4LiVkIiksICJ3c2E4ODF4LiVkIiwgaSk7Ci0JCW1zbV9hdXhfZGV2W2ldLm5hbWUgPSBkZXZfbmFtZV9zdHI7Ci0JCW1zbV9hdXhfZGV2W2ldLmNvZGVjX25hbWUgPSBOVUxMOwotCQltc21fYXV4X2RldltpXS5jb2RlY19vZl9ub2RlID0KLQkJCQkJd3NhODgxeF9kZXZfaW5mb1tpXS5vZl9ub2RlOwotCQltc21fYXV4X2RldltpXS5pbml0ID0gbXNtX3dzYTg4MXhfaW5pdDsKLQkJbXNtX2NvZGVjX2NvbmZbaV0uZGV2X25hbWUgPSBOVUxMOwotCQltc21fY29kZWNfY29uZltpXS5uYW1lX3ByZWZpeCA9IHdzYV9hdXhkZXZfbmFtZV9wcmVmaXhbMF07Ci0JCW1zbV9jb2RlY19jb25mW2ldLm9mX25vZGUgPQotCQkJCXdzYTg4MXhfZGV2X2luZm9baV0ub2Zfbm9kZTsKLQl9Ci0JY2FyZC0+Y29kZWNfY29uZiA9IG1zbV9jb2RlY19jb25mOwotCWNhcmQtPmF1eF9kZXYgPSBtc21fYXV4X2RldjsKLQotCXJldHVybiAwOwotCi1lcnJfZHRfcHJvcDoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGRldl9uYW1lX3N0cik7Ci1lcnJfZGV2X3N0cjoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG1zbV9jb2RlY19jb25mKTsKLWVycl9jb2RlY19jb25mOgotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbXNtX2F1eF9kZXYpOwotZXJyX2F1eGRldl9tZW06Ci1lcnJfZGV2X25vZGU6Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCB3c2E4ODF4X2Rldl9pbmZvKTsKLWVycl9tZW06Ci1lcnJfZHQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaTJzX2F1eHBjbV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICptdXhzZWw7Ci0JaW50IGNvdW50OwotCXUzMiBtaTJzX21hc3Rlcl9zbGF2ZVtNSTJTX01BWF07Ci0JaW50IHJldDsKLQljaGFyICpzdHJbUENNX0kyU19TRUxfTUFYXSA9IHsKLQkJImxwYWlmX3ByaV9tb2RlX211eHNlbCIsCi0JCSJscGFpZl9zZWNfbW9kZV9tdXhzZWwiLAotCQkibHBhaWZfdGVydF9tb2RlX211eHNlbCIsCi0JCSJscGFpZl9xdWF0X21vZGVfbXV4c2VsIgotCX07Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgewotCQltdXRleF9pbml0KCZtaTJzX2ludGZfY29uZltjb3VudF0ubG9jayk7Ci0JCW1pMnNfaW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKLQl9Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBVVhfUENNX01BWDsgY291bnQrKykgewotCQltdXRleF9pbml0KCZhdXhwY21faW50Zl9jb25mW2NvdW50XS5sb2NrKTsKLQkJYXV4cGNtX2ludGZfY29uZltjb3VudF0ucmVmX2NudCA9IDA7Ci0JfQotCi0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgUENNX0kyU19TRUxfTUFYOyBjb3VudCsrKSB7Ci0JCW11dGV4X2luaXQoJm1pMnNfYXV4cGNtX2NvbmZbY291bnRdLmxvY2spOwotCQltaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyID0gTlVMTDsKLQl9Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspIHsKLQkJbXV4c2VsID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKLQkJCQkJCSAgICAgIHN0cltjb3VudF0pOwotCQlpZiAobXV4c2VsKSB7Ci0JCQltaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyCi0JCQkJPSBpb3JlbWFwKG11eHNlbC0+c3RhcnQsIHJlc291cmNlX3NpemUobXV4c2VsKSk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1taTJzLW1hc3RlciIsCi0JCQltaTJzX21hc3Rlcl9zbGF2ZSwgTUkyU19NQVgpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IG5vIHFjb20sbXNtLW1pMnMtbWFzdGVyIGluIERUIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUkyU19NQVg7IGNvdW50KyspIHsKLQkJCW1pMnNfaW50Zl9jb25mW2NvdW50XS5tc21faXNfbWkyc19tYXN0ZXIgPQotCQkJCW1pMnNfbWFzdGVyX3NsYXZlW2NvdW50XTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgaTJzX2F1eHBjbV9kZWluaXQodm9pZCkKLXsKLQlpbnQgY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspCi0JCWlmIChtaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyICE9Ci0JCQlOVUxMKQotCQkJaW91bm1hcCgKLQkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX21hY2hpbmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCWNvbnN0IGNoYXIgKm1iaGNfYXVkaW9famFja190eXBlID0gTlVMTDsKLQljaGFyICptY2xrX2ZyZXFfcHJvcF9uYW1lOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCWludCByZXQ7Ci0KLQlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIHN1cHBsaWVkIGZyb20gZGV2aWNlIHRyZWVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNhcmQgPSBwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcygmcGRldi0+ZGV2KTsKLQlpZiAoIWNhcmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENhcmQgdW5pbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0JY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgcGRhdGEpOwotCi0JcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoY2FyZCwgInFjb20sbW9kZWwiKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNlIGNhcmQgbmFtZSBmYWlsZWQsIGVycjolZFxuIiwKLQkJCXJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZyhjYXJkLCAicWNvbSxhdWRpby1yb3V0aW5nIik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwYXJzZSBhdWRpbyByb3V0aW5nIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG1zbTg5OThfYXNvY19tYWNoaW5lX29mX21hdGNoLAotCQkJcGRldi0+ZGV2Lm9mX25vZGUpOwotCWlmICghbWF0Y2gpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG5vIG1hdGNoZWQgY29kZWMgaXMgZm91bmQuXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhc2hhX2NvZGVjIikpCi0JCW1jbGtfZnJlcV9wcm9wX25hbWUgPSAicWNvbSx0YXNoYS1tY2xrLWNsay1mcmVxIjsKLQllbHNlCi0JCW1jbGtfZnJlcV9wcm9wX25hbWUgPSAicWNvbSx0YXZpbC1tY2xrLWNsay1mcmVxIjsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJbWNsa19mcmVxX3Byb3BfbmFtZSwgJnBkYXRhLT5tY2xrX2ZyZXEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQsIGVyciVkXG4iLAotCQkJbWNsa19mcmVxX3Byb3BfbmFtZSwKLQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChwZGF0YS0+bWNsa19mcmVxICE9IENPREVDX0VYVF9DTEtfUkFURSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBtY2xrIGZyZXEgJXVcbiIsCi0JCQlwZGF0YS0+bWNsa19mcmVxKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gbXNtX3BvcHVsYXRlX2RhaV9saW5rX2NvbXBvbmVudF9vZl9ub2RlKGNhcmQpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKLQkJZ290byBlcnI7Ci0JfQotCXJldCA9IG1zbV9pbml0X3dzYV9kZXYocGRldiwgY2FyZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKLQlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKLQkJaWYgKGNvZGVjX3JlZ19kb25lKQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfSBlbHNlIGlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTb3VuZCBjYXJkICVzIHJlZ2lzdGVyZWRcbiIsIGNhcmQtPm5hbWUpOwotCXNwZGV2ID0gcGRldjsKLQotCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIGNoaWxkIG5vZGVzLCByZXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQl9IGVsc2UgewotCQlwZGF0YS0+aHBoX2VuMV9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsIDApOwotCQlpZiAoIXBkYXRhLT5ocGhfZW4xX2dwaW9fcCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsCi0JCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCX0KLQotCQlwZGF0YS0+aHBoX2VuMF9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsIDApOwotCQlpZiAoIXBkYXRhLT5ocGhfZW4wX2dwaW9fcCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsCi0JCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJInFjb20sbWJoYy1hdWRpby1qYWNrLXR5cGUiLCAmbWJoY19hdWRpb19qYWNrX3R5cGUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCi0JCQkicWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSIsCi0JCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSmFjayB0eXBlIHByb3BlcnRpZXMgc2V0IHRvIGRlZmF1bHQiKTsKLQl9IGVsc2UgewotCQlpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjQtcG9sZS1qYWNrIikpIHsKLQkJCXdjZF9tYmhjX2NmZy5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZTsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlRoaXMgaGFyZHdhcmUgaGFzIDQgcG9sZSBqYWNrIik7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjUtcG9sZS1qYWNrIikpIHsKLQkJCXdjZF9tYmhjX2NmZy5lbmFibGVfYW5jX21pY19kZXRlY3QgPSB0cnVlOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVGhpcyBoYXJkd2FyZSBoYXMgNSBwb2xlIGphY2siKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKG1iaGNfYXVkaW9famFja190eXBlLCAiNi1wb2xlLWphY2siKSkgewotCQkJd2NkX21iaGNfY2ZnLmVuYWJsZV9hbmNfbWljX2RldGVjdCA9IHRydWU7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJUaGlzIGhhcmR3YXJlIGhhcyA2IHBvbGUgamFjayIpOwotCQl9IGVsc2UgewotCQkJd2NkX21iaGNfY2ZnLmVuYWJsZV9hbmNfbWljX2RldGVjdCA9IGZhbHNlOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVW5rbm93biB2YWx1ZSwgc2V0IHRvIGRlZmF1bHQiKTsKLQkJfQotCX0KLQkvKgotCSAqIFBhcnNlIFVTLUV1cm8gZ3BpbyBpbmZvIGZyb20gRFQuIFJlcG9ydCBubyBlcnJvciBpZiB1cy1ldXJvCi0JICogZW50cnkgaXMgbm90IGZvdW5kIGluIERUIGZpbGUgYXMgc29tZSB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0Ci0JICogVVMtRXVybyBkZXRlY3Rpb24KLQkgKi8KLQlwZGF0YS0+dXNfZXVyb19ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSkKLQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSAmJiAoIXBkYXRhLT51c19ldXJvX2dwaW9fcCkpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGRldGVjdGVkIiwKLQkJCSJxY29tLHVzLWV1cm8tZ3Bpb3MiKTsKLQkJd2NkX21iaGNfY2ZnLnN3YXBfZ25kX21pYyA9IG1zbV9zd2FwX2duZF9taWM7Ci0JfQotCi0JcmV0ID0gbXNtX3ByZXBhcmVfdXNfZXVybyhjYXJkKTsKLQlpZiAocmV0KQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtc21fcHJlcGFyZV91c19ldXJvIGZhaWxlZCAoJWQpXG4iLAotCQkJcmV0KTsKLQotCS8qIFBhcnNlIHBpbmN0cmwgaW5mbyBmcm9tIGRldmljZXRyZWUgKi8KLQlyZXQgPSBtc21fZ2V0X3BpbmN0cmwocGRldik7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZGVidWcoIiVzOiBwaW5jdHJsIHBhcnNpbmcgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogUGFyc2luZyBwaW5jdHJsIGZhaWxlZCB3aXRoICVkLiBDYW5ub3QgdXNlIFBvcnRzXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IDA7Ci0JfQotCi0JaTJzX2F1eHBjbV9pbml0KHBkZXYpOwotCi0JaXNfaW5pdGlhbF9ib290ID0gdHJ1ZTsKLQlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3RlcigibXNtODk5OCIsIEFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOLAotCQkJCSAgICAgICZzZXJ2aWNlX25iKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogQXVkaW8gbm90aWZpZXIgcmVnaXN0ZXIgZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlpZiAocGRhdGEtPnVzX2V1cm9fZ3BpbyA+IDApIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZnJlZSB1c19ldXJvIGdwaW8gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7Ci0JCWdwaW9fZnJlZShwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQkJcGRhdGEtPnVzX2V1cm9fZ3BpbyA9IDA7Ci0JfQotCW1zbV9yZWxlYXNlX3BpbmN0cmwocGRldik7Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwZGF0YSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXNvY19tYWNoaW5lX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9Ci0JCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCi0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnVzX2V1cm9fZ3BpbykpCi0JCWdwaW9fZnJlZShwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQlpMnNfYXV4cGNtX2RlaW5pdCgpOwotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7Ci0JYXVkaW9fbm90aWZpZXJfZGVyZWdpc3RlcigibXNtODk5OCIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc204OTk4X2Fzb2NfbWFjaGluZV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBEUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5wbSA9ICZzbmRfc29jX3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fYXNvY19tYWNoaW5lX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fYXNvY19tYWNoaW5lX3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1zbTg5OThfYXNvY19tYWNoaW5lX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgbXNtIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtODk5OF9hc29jX21hY2hpbmVfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL01ha2VmaWxlIGIvc291bmQvc29jL21zbS9xZHNwNnYyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI2YjUwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXNuZC1zb2MtcWRzcDZ2Mi1vYmpzICs9IG1zbS1kYWktcTYtdjIubyBtc20tcGNtLXE2LXYyLm8gXAotCQkJbXNtLXBjbS1yb3V0aW5nLXYyLm8gbXNtLWNvbXByZXNzLXE2LXYyLm8gXAotCQkJbXNtLXBjbS1hZmUtdjIubyBtc20tcGNtLXZvaXAtdjIubyBcCi0JCQltc20tcGNtLXZvaWNlLXYyLm8gbXNtLWRhaS1xNi1oZG1pLXYyLm8gXAotCQkJbXNtLWxzbS1jbGllbnQubyBtc20tcGNtLWhvc3Qtdm9pY2UtdjIubyBcCi0JCQltc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5vIG1zbS1wY20tbG9vcGJhY2stdjIubyBcCi0JCQltc20tZGFpLXNsaW0ubyBtc20tdHJhbnNjb2RlLWxvb3BiYWNrLXE2LXYyLm8gXAotCQkJYWRzcF9lcnIubwotb2JqLSQoQ09ORklHX1NORF9TT0NfUURTUDZWMikgKz0gc25kLXNvYy1xZHNwNnYyLm8gbXNtLXBjbS1kdG1mLXYyLm8gXAotCQkJCSBtc20tZGFpLXN0dWItdjIubwotb2JqLSQoQ09ORklHX1NORF9IV0RFUCkgKz0gbXNtLXBjbS1yb3V0aW5nLWRldmRlcC5vCi1vYmotJChDT05GSUdfRE9MQllfREFQKSArPSBtc20tZG9sYnktZGFwLWNvbmZpZy5vCi1vYmotJChDT05GSUdfRE9MQllfRFMyKSArPSBtc20tZHMyLWRhcC1jb25maWcubwotb2JqLSQoQ09ORklHX0RPTEJZX0xJQ0VOU0UpICs9IG1zbS1kczItZGFwLWNvbmZpZy5vCi1vYmotJChDT05GSUdfRFRTX1NSU19UTSkgKz0gbXNtLWR0cy1zcnMtdG0tY29uZmlnLm8KLW9iai0kKENPTkZJR19RVElfUFApICs9IG1zbS1xdGktcHAtY29uZmlnLm8KLW9iai15ICs9IGF1ZGlvX2NhbGlicmF0aW9uLm8gYXVkaW9fY2FsX3V0aWxzLm8gcTZhZG0ubyBxNmFmZS5vIHE2YXNtLm8gXAotCXE2YXVkaW8tdjIubyBxNnZvaWNlLm8gcTZjb3JlLm8gcnRhYy5vIHE2bHNtLm8gYXVkaW9fc2xpbXNsYXZlLm8gXAotCW1zbS1wY20tcTYtbm9pcnEubwotb2NtZW0tYXVkaW8tb2JqcyArPSBhdWRpb19vY21lbS5vCi1vYmotJChDT05GSUdfQVVESU9fT0NNRU0pICs9IG9jbWVtLWF1ZGlvLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hZHNwX2Vyci5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL2Fkc3BfZXJyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2JkNmEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL2Fkc3BfZXJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0KLQotLyogRVJST1IgU1RSSU5HICovCi0vKiBTdWNjZXNzLiBUaGUgb3BlcmF0aW9uIGNvbXBsZXRlZCB3aXRoIG5vIGVycm9ycy4gKi8KLSNkZWZpbmUgQURTUF9FT0tfU1RSICAgICAgICAgICJBRFNQX0VPSyIKLS8qIEdlbmVyYWwgZmFpbHVyZS4gKi8KLSNkZWZpbmUgQURTUF9FRkFJTEVEX1NUUiAgICAgICJBRFNQX0VGQUlMRUQiCi0vKiBCYWQgb3BlcmF0aW9uIHBhcmFtZXRlci4gKi8KLSNkZWZpbmUgQURTUF9FQkFEUEFSQU1fU1RSICAgICJBRFNQX0VCQURQQVJBTSIKLS8qIFVuc3VwcG9ydGVkIHJvdXRpbmUgb3Igb3BlcmF0aW9uLiAqLwotI2RlZmluZSBBRFNQX0VVTlNVUFBPUlRFRF9TVFIgIkFEU1BfRVVOU1VQUE9SVEVEIgotLyogVW5zdXBwb3J0ZWQgdmVyc2lvbi4gKi8KLSNkZWZpbmUgQURTUF9FVkVSU0lPTl9TVFIgICAgICJBRFNQX0VWRVJTSU9OIgotLyogVW5leHBlY3RlZCBwcm9ibGVtIGVuY291bnRlcmVkLiAqLwotI2RlZmluZSBBRFNQX0VVTkVYUEVDVEVEX1NUUiAgIkFEU1BfRVVORVhQRUNURUQiCi0vKiBVbmhhbmRsZWQgcHJvYmxlbSBvY2N1cnJlZC4gKi8KLSNkZWZpbmUgQURTUF9FUEFOSUNfU1RSICAgICAgICJBRFNQX0VQQU5JQyIKLS8qIFVuYWJsZSB0byBhbGxvY2F0ZSByZXNvdXJjZS4gKi8KLSNkZWZpbmUgQURTUF9FTk9SRVNPVVJDRV9TVFIgICJBRFNQX0VOT1JFU09VUkNFIgotLyogSW52YWxpZCBoYW5kbGUuICovCi0jZGVmaW5lIEFEU1BfRUhBTkRMRV9TVFIgICAgICAiQURTUF9FSEFORExFIgotLyogT3BlcmF0aW9uIGlzIGFscmVhZHkgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBBRFNQX0VBTFJFQURZX1NUUiAgICAgIkFEU1BfRUFMUkVBRFkiCi0vKiBPcGVyYXRpb24gaXMgbm90IHJlYWR5IHRvIGJlIHByb2Nlc3NlZC4gKi8KLSNkZWZpbmUgQURTUF9FTk9UUkVBRFlfU1RSICAgICJBRFNQX0VOT1RSRUFEWSIKLS8qIE9wZXJhdGlvbiBpcyBwZW5kaW5nIGNvbXBsZXRpb24uICovCi0jZGVmaW5lIEFEU1BfRVBFTkRJTkdfU1RSICAgICAiQURTUF9FUEVORElORyIKLS8qIE9wZXJhdGlvbiBjb3VsZCBub3QgYmUgYWNjZXB0ZWQgb3IgcHJvY2Vzc2VkLiAqLwotI2RlZmluZSBBRFNQX0VCVVNZX1NUUiAgICAgICAgIkFEU1BfRUJVU1kiCi0vKiBPcGVyYXRpb24gYWJvcnRlZCBkdWUgdG8gYW4gZXJyb3IuICovCi0jZGVmaW5lIEFEU1BfRUFCT1JURURfU1RSICAgICAiQURTUF9FQUJPUlRFRCIKLS8qIE9wZXJhdGlvbiBwcmVlbXB0ZWQgYnkgYSBoaWdoZXIgcHJpb3JpdHkuICovCi0jZGVmaW5lIEFEU1BfRVBSRUVNUFRFRF9TVFIgICAiQURTUF9FUFJFRU1QVEVEIgotLyogT3BlcmF0aW9uIHJlcXVlc3RzIGludGVydmVudGlvbiB0byBjb21wbGV0ZS4gKi8KLSNkZWZpbmUgQURTUF9FQ09OVElOVUVfU1RSICAgICJBRFNQX0VDT05USU5VRSIKLS8qIE9wZXJhdGlvbiByZXF1ZXN0cyBpbW1lZGlhdGUgaW50ZXJ2ZW50aW9uIHRvIGNvbXBsZXRlLiAqLwotI2RlZmluZSBBRFNQX0VJTU1FRElBVEVfU1RSICAgIkFEU1BfRUlNTUVESUFURSIKLS8qIE9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQuICovCi0jZGVmaW5lIEFEU1BfRU5PVElNUExfU1RSICAgICAiQURTUF9FTk9USU1QTCIKLS8qIE9wZXJhdGlvbiBuZWVkcyBtb3JlIGRhdGEgb3IgcmVzb3VyY2VzLiAqLwotI2RlZmluZSBBRFNQX0VORUVETU9SRV9TVFIgICAgIkFEU1BfRU5FRURNT1JFIgotLyogT3BlcmF0aW9uIGRvZXMgbm90IGhhdmUgbWVtb3J5LiAqLwotI2RlZmluZSBBRFNQX0VOT01FTU9SWV9TVFIgICAgIkFEU1BfRU5PTUVNT1JZIgotLyogSXRlbSBkb2VzIG5vdCBleGlzdC4gKi8KLSNkZWZpbmUgQURTUF9FTk9URVhJU1RfU1RSICAgICJBRFNQX0VOT1RFWElTVCIKLS8qIFVuZXhwZWN0ZWQgZXJyb3IgY29kZS4gKi8KLSNkZWZpbmUgQURTUF9FUlJfTUFYX1NUUiAgICAgICJBRFNQX0VSUl9NQVgiCi0KLSNpZmRlZiBDT05GSUdfU05EX1NPQ19RRFNQX0RFQlVHCi1zdGF0aWMgYm9vbCBhZHNwX2Vycl9wYW5pYzsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYWRzcF9lcnI7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkc3BfZXJyX2RlYnVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLAotCWNvbnN0IGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciBjbWQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdWJ1ZiwgMSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGNtZCA9PSAnMCcpCi0JCWFkc3BfZXJyX3BhbmljID0gZmFsc2U7Ci0JZWxzZQotCQlhZHNwX2Vycl9wYW5pYyA9IHRydWU7Ci0KLQlyZXR1cm4gY250OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHNwX2Vycl9kZWJ1Z19vcHMgPSB7Ci0JLndyaXRlID0gYWRzcF9lcnJfZGVidWdfd3JpdGUsCi19OwotI2VuZGlmCi0jZW5kaWYKLQotc3RydWN0IGFkc3BfZXJyX2NvZGUgewotCWludAkJbG54X2Vycl9jb2RlOwotCWNoYXIJKmFkc3BfZXJyX3N0cjsKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBhZHNwX2Vycl9jb2RlIGFkc3BfZXJyX2NvZGVfaW5mb1tBRFNQX0VSUl9NQVgrMV0gPSB7Ci0JeyAwLCBBRFNQX0VPS19TVFJ9LAotCXsgLUVOT1RSRUNPVkVSQUJMRSwgQURTUF9FRkFJTEVEX1NUUn0sCi0JeyAtRUlOVkFMLCBBRFNQX0VCQURQQVJBTV9TVFJ9LAotCXsgLUVPUE5PVFNVUFAsIEFEU1BfRVVOU1VQUE9SVEVEX1NUUn0sCi0JeyAtRU5PUFJPVE9PUFQsIEFEU1BfRVZFUlNJT05fU1RSfSwKLQl7IC1FTk9UUkVDT1ZFUkFCTEUsIEFEU1BfRVVORVhQRUNURURfU1RSfSwKLQl7IC1FTk9UUkVDT1ZFUkFCTEUsIEFEU1BfRVBBTklDX1NUUn0sCi0JeyAtRU5PU1BDLCBBRFNQX0VOT1JFU09VUkNFX1NUUn0sCi0JeyAtRUJBRFIsIEFEU1BfRUhBTkRMRV9TVFJ9LAotCXsgLUVBTFJFQURZLCBBRFNQX0VBTFJFQURZX1NUUn0sCi0JeyAtRVBFUk0sIEFEU1BfRU5PVFJFQURZX1NUUn0sCi0JeyAtRUlOUFJPR1JFU1MsIEFEU1BfRVBFTkRJTkdfU1RSfSwKLQl7IC1FQlVTWSwgQURTUF9FQlVTWV9TVFJ9LAotCXsgLUVDQU5DRUxFRCwgQURTUF9FQUJPUlRFRF9TVFJ9LAotCXsgLUVBR0FJTiwgQURTUF9FUFJFRU1QVEVEX1NUUn0sCi0JeyAtRUFHQUlOLCBBRFNQX0VDT05USU5VRV9TVFJ9LAotCXsgLUVBR0FJTiwgQURTUF9FSU1NRURJQVRFX1NUUn0sCi0JeyAtRUFHQUlOLCBBRFNQX0VOT1RJTVBMX1NUUn0sCi0JeyAtRU5PREFUQSwgQURTUF9FTkVFRE1PUkVfU1RSfSwKLQl7IC1FQURWLCBBRFNQX0VSUl9NQVhfU1RSfSwKLQl7IC1FTk9NRU0sIEFEU1BfRU5PTUVNT1JZX1NUUn0sCi0JeyAtRU5PREVWLCBBRFNQX0VOT1RFWElTVF9TVFJ9LAotCXsgLUVBRFYsIEFEU1BfRVJSX01BWF9TVFJ9LAotfTsKLQotI2lmZGVmIENPTkZJR19TTkRfU09DX1FEU1BfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZCBhZHNwX2Vycl9jaGVja19wYW5pYyh1MzIgYWRzcF9lcnJvcikKLXsKLQlpZiAoYWRzcF9lcnJfcGFuaWMgJiYgYWRzcF9lcnJvciAhPSBBRFNQX0VBTFJFQURZKQotCQlwYW5pYygiJXM6IGVuY291bnRlciBhZHNwX2Vycj0weCV4XG4iLCBfX2Z1bmNfXywgYWRzcF9lcnJvcik7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGFkc3BfZXJyX2NoZWNrX3BhbmljKHUzMiBhZHNwX2Vycm9yKSB7fQotI2VuZGlmCi0KLWludCBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKHUzMiBhZHNwX2Vycm9yKQotewotCWFkc3BfZXJyX2NoZWNrX3BhbmljKGFkc3BfZXJyb3IpOwotCi0JaWYgKGFkc3BfZXJyb3IgPiBBRFNQX0VSUl9NQVgpCi0JCXJldHVybiBhZHNwX2Vycl9jb2RlX2luZm9bQURTUF9FUlJfTUFYXS5sbnhfZXJyX2NvZGU7Ci0JZWxzZQotCQlyZXR1cm4gYWRzcF9lcnJfY29kZV9pbmZvW2Fkc3BfZXJyb3JdLmxueF9lcnJfY29kZTsKLX0KLQotY2hhciAqYWRzcF9lcnJfZ2V0X2Vycl9zdHIodTMyIGFkc3BfZXJyb3IpCi17Ci0JaWYgKGFkc3BfZXJyb3IgPiBBRFNQX0VSUl9NQVgpCi0JCXJldHVybiBhZHNwX2Vycl9jb2RlX2luZm9bQURTUF9FUlJfTUFYXS5hZHNwX2Vycl9zdHI7Ci0JZWxzZQotCQlyZXR1cm4gYWRzcF9lcnJfY29kZV9pbmZvW2Fkc3BfZXJyb3JdLmFkc3BfZXJyX3N0cjsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfUURTUF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCi1zdGF0aWMgaW50IF9faW5pdCBhZHNwX2Vycl9pbml0KHZvaWQpCi17Ci0KLQotCWRlYnVnZnNfYWRzcF9lcnIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtc21fYWRzcF9hdWRpb19kZWJ1ZyIsCi0JCQkJCSAgICAgICBTX0lGUkVHIHwgMDQ0NCwgTlVMTCwgTlVMTCwKLQkJCQkJICAgICAgICZhZHNwX2Vycl9kZWJ1Z19vcHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhZHNwX2Vycl9pbml0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbF91dGlscy5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbF91dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY5YTdmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19jYWxfdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgotCi1zdGF0aWMgaW50IHVubWFwX21lbW9yeShzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUsCi0JCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayk7Ci0KLXNpemVfdCBnZXRfY2FsX2luZm9fc2l6ZShpbnQzMl90IGNhbF90eXBlKQotewotCXNpemVfdCBzaXplID0gMDsKLQotCXN3aXRjaCAoY2FsX3R5cGUpIHsKLQljYXNlIENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY190b3ApOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY190b3ApOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jcHJvYyk7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZQX1ZPQ1BST0NfRFlOQU1JQ19DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jdm9sKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NERVZfQ0ZHX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NkZXZfY2ZnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVlBfVk9DUFJPQ19TVEFUSUNfQ09MX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVlBfVk9DUFJPQ19EWU5BTUlDX0NPTF9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX2NvbCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZTX1ZPQ1NUUk1fU1RBVElDX0NPTF9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jX2NvbCk7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRE1fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKLQljYXNlIENPUkVfQ1VTVE9NX1RPUE9MT0dJRVNfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIEFETV9BVURQUk9DX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRE1fQVVEVk9MX0NBTF9UWVBFOgotCWNhc2UgQURNX1JUQUNfQVVEVk9MX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWR2b2wpOwotCQlicmVhazsKLQljYXNlIEFTTV9UT1BPTE9HWV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXNtX3RvcCk7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIEFTTV9BVURTVFJNX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRzdHJtKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZV90b3ApOwotCQlicmVhazsKLQljYXNlIEFGRV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfQ09NTU9OX1JYX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hZmUpOwotCQlicmVhazsKLQljYXNlIEFGRV9DT01NT05fVFhfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BrX3Byb3RfY2ZnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF9UWVBFOgotCQkvKgotCQkgKiBTaW5jZSBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlcyBhcmUgZGlmZmVyZW50IGluIHNpemUKLQkJICogdXNlIHRoZSBtYXhpbXVtIHNpemUgb2YgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyIHN0cnVjdHVyZQotCQkgKi8KLQkJc2l6ZSA9IG1heChzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX2Z0bV9jZmcpLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19zcF90aF92aV9wYXJhbSkpOwotCQlicmVhazsKLQljYXNlIEFGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMX1RZUEU6Ci0JCS8qCi0JCSAqIFNpbmNlIGdldCBhbmQgc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGFyZSBkaWZmZXJlbnQgaW4gc2l6ZQotCQkgKiB1c2UgdGhlIG1heGltdW0gc2l6ZSBvZiBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlCi0JCSAqLwotCQlzaXplID0gbWF4KHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfZXhfdmlfZnRtX2NmZyksCi0JCQkgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX2V4X3ZpX3BhcmFtKSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0FOQ19DQUxfVFlQRToKLQkJc2l6ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0FBTkNfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FhbmMpOwotCQlicmVhazsKLQljYXNlIEFGRV9IV19ERUxBWV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9faHdfZGVsYXkpOwotCQlicmVhazsKLQljYXNlIEFGRV9TSURFVE9ORV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmUpOwotCQlicmVhazsKLQljYXNlIEFGRV9TSURFVE9ORV9JSVJfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lX2lpcik7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIExTTV9UT1BPTE9HWV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCk7Ci0JCWJyZWFrOwotCWNhc2UgVUxQX0xTTV9UT1BPTE9HWV9JRF9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCk7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19sc20pOwotCQlicmVhazsKLQljYXNlIEFETV9SVEFDX0lORk9fQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1JUQUNfSU5GT19DQUxfVFlQRToKLQkJc2l6ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1JUQUNfQVBSX0NBTF9UWVBFOgotCQlzaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fUlRBQ19BUFJfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1JUQUNfQVBSX0NBTF9UWVBFOgotCQlzaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBNQURfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIFVMUF9BRkVfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZSk7Ci0JCWJyZWFrOwotCWNhc2UgVUxQX0xTTV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19DT1JFX01FVEFJTkZPX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfaW5mb19tZXRhaW5mbyk7Ci0JCWJyZWFrOwotCWNhc2UgU1JTX1RSVU1FRElBX0NBTF9UWVBFOgotCQlzaXplID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczpJbnZhbGlkIGNhbCB0eXBlICVkISIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUpOwotCX0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotc2l6ZV90IGdldF91c2VyX2NhbF90eXBlX3NpemUoaW50MzJfdCBjYWxfdHlwZSkKLXsKLQlzaXplX3Qgc2l6ZSA9IDA7Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NfdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV92b2NfdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVlBfVk9DUFJPQ19TVEFUSUNfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY3Byb2MpOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NQUk9DX0RZTkFNSUNfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY3ZvbCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZTX1ZPQ1NUUk1fU1RBVElDX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZQX1ZPQ0RFVl9DRkdfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY2Rldl9jZmcpOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DT0xfQ0FMX1RZUEU6Ci0JY2FzZSBDVlBfVk9DUFJPQ19EWU5BTUlDX0NPTF9DQUxfVFlQRToKLQljYXNlIENWU19WT0NTVFJNX1NUQVRJQ19DT0xfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3ZvY19jb2wpOwotCQlicmVhazsKLQljYXNlIEFETV9UT1BPTE9HWV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWRtX3RvcCk7Ci0JCWJyZWFrOwotCWNhc2UgQURNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JY2FzZSBDT1JFX0NVU1RPTV9UT1BPTE9HSUVTX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7Ci0JCWJyZWFrOwotCWNhc2UgQURNX0FVRFBST0NfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHByb2MpOwotCQlicmVhazsKLQljYXNlIEFETV9BVURWT0xfQ0FMX1RZUEU6Ci0JY2FzZSBBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2F1ZHZvbCk7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hc21fdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMpOwotCQlicmVhazsKLQljYXNlIEFTTV9BVURTVFJNX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hdWRzdHJtKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2FmZV90b3ApOwotCQlicmVhazsKLQljYXNlIEFGRV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0NPTU1PTl9SWF9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfQ09NTU9OX1RYX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hZmUpOwotCQlicmVhazsKLQljYXNlIEFGRV9GQl9TUEtSX1BST1RfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2ZiX3Nwa19wcm90X2NmZyk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxfVFlQRToKLQkJLyoKLQkJICogU2luY2UgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyIHN0cnVjdHVyZXMgYXJlIGRpZmZlcmVudCBpbiBzaXplCi0JCSAqIHVzZSB0aGUgbWF4aW11bSBzaXplIG9mIGdldCBhbmQgc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmUKLQkJICovCi0JCXNpemUgPSBtYXgoc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF90aF92aV9mdG1fY2ZnKSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfdGhfdmlfcGFyYW0pKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF9UWVBFOgotCQkvKgotCQkgKiBTaW5jZSBnZXQgYW5kIHNldCBwYXJhbWV0ZXIgc3RydWN0dXJlcyBhcmUgZGlmZmVyZW50IGluIHNpemUKLQkJICogdXNlIHRoZSBtYXhpbXVtIHNpemUgb2YgZ2V0IGFuZCBzZXQgcGFyYW1ldGVyIHN0cnVjdHVyZQotCQkgKi8KLQkJc2l6ZSA9IG1heChzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX2Z0bV9jZmcpLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9zcF9leF92aV9wYXJhbSkpOwotCQlicmVhazsKLQljYXNlIEFGRV9BTkNfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIEFGRV9BQU5DX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hYW5jKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfSFdfREVMQVlfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2h3X2RlbGF5KTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfU0lERVRPTkVfQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NpZGV0b25lKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfU0lERVRPTkVfSUlSX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9zaWRldG9uZV9paXIpOwotCQlicmVhazsKLQljYXNlIExTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyk7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc21fdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBVTFBfTFNNX1RPUE9MT0dZX0lEX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc21fdG9wKTsKLQkJYnJlYWs7Ci0JY2FzZSBMU01fQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2xzbSk7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1JUQUNfSU5GT19DQUxfVFlQRToKLQkJc2l6ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFOgotCQlzaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBBRE1fUlRBQ19BUFJfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIEFTTV9SVEFDX0FQUl9DQUxfVFlQRToKLQkJc2l6ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVk9JQ0VfUlRBQ19BUFJfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQljYXNlIE1BRF9DQUxfVFlQRToKLQkJc2l6ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVUxQX0FGRV9DQUxfVFlQRToKLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWZlKTsKLQkJYnJlYWs7Ci0JY2FzZSBVTFBfTFNNX0NBTF9UWVBFOgotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9sc20pOwotCQlicmVhazsKLQljYXNlIEFVRElPX0NPUkVfTUVUQUlORk9fQ0FMX1RZUEU6Ci0JCXNpemUgPSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX21ldGFpbmZvKTsKLQkJYnJlYWs7Ci0JY2FzZSBTUlNfVFJVTUVESUFfQ0FMX1RZUEU6Ci0JCXNpemUgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOkludmFsaWQgY2FsIHR5cGUgJWQhIiwKLQkJCV9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JfQotCXJldHVybiBzaXplOwotfQotCi1pbnQzMl90IGNhbF91dGlsc19nZXRfY2FsX3R5cGVfdmVyc2lvbih2b2lkICpjYWxfdHlwZV9kYXRhKQotewotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyAqZGF0YSA9IE5VTEw7Ci0KLQlkYXRhID0gKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYyAqKWNhbF90eXBlX2RhdGE7Ci0KLQlyZXR1cm4gZGF0YS0+Y2FsX2hkci52ZXJzaW9uOwotfQotCi1zdGF0aWMgc3RydWN0IGNhbF90eXBlX2RhdGEgKmNyZWF0ZV9jYWxfdHlwZV9kYXRhKAotCQkJCXN0cnVjdCBjYWxfdHlwZV9pbmZvICppbmZvKQotewotCXN0cnVjdCBjYWxfdHlwZV9kYXRhCSpjYWxfdHlwZSA9IE5VTEw7Ci0KLQlpZiAoKGluZm8tPnJlZy5jYWxfdHlwZSA8IDApIHx8Ci0JCShpbmZvLT5yZWcuY2FsX3R5cGUgPj0gTUFYX0NBTF9UWVBFUykpIHsKLQkJcHJfZXJyKCIlczogY2FsIHR5cGUgJWQgaXMgSW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgaW5mby0+cmVnLmNhbF90eXBlKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChpbmZvLT5jYWxfdXRpbF9jYWxsYmFja3MubWF0Y2hfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWwgdHlwZSAlZCBubyBtZXRob2QgdG8gbWF0Y2ggYmxvY2tzIVxuIiwKLQkJCV9fZnVuY19fLCBpbmZvLT5yZWcuY2FsX3R5cGUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY2FsX3R5cGUgPSBrbWFsbG9jKHNpemVvZigqY2FsX3R5cGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2FsX3R5cGUgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCi0JSU5JVF9MSVNUX0hFQUQoJmNhbF90eXBlLT5jYWxfYmxvY2tzKTsKLQltdXRleF9pbml0KCZjYWxfdHlwZS0+bG9jayk7Ci0JbWVtY3B5KCZjYWxfdHlwZS0+aW5mbywgaW5mbywKLQkJc2l6ZW9mKGNhbF90eXBlLT5pbmZvKSk7Ci1kb25lOgotCXJldHVybiBjYWxfdHlwZTsKLX0KLQotLyoqCi0gKiBjYWxfdXRpbHNfY3JlYXRlX2NhbF90eXBlcwotICoKLSAqIEBudW1fY2FsX3R5cGVzOiBudW1iZXIgb2YgdHlwZXMKLSAqIEBjYWxfdHlwZTogcG9pbnRlciB0byB0aGUgY2FsIHR5cGVzIHBvaW50ZXIKLSAqIEBpbmZvOiBwb2ludGVyIHRvIGluZm8KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgRUlOVkFMIG90aGVyd2lzZQotICovCi1pbnQgY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoaW50IG51bV9jYWxfdHlwZXMsCi0JCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlLAotCQkJc3RydWN0IGNhbF90eXBlX2luZm8gKmluZm8pCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGk7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKGluZm8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBpbmZvIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKChudW1fY2FsX3R5cGVzIDw9IDApIHx8Ci0JCShudW1fY2FsX3R5cGVzID4gTUFYX0NBTF9UWVBFUykpIHsKLQkJcHJfZXJyKCIlczogbnVtX2NhbF90eXBlcyBvZiAlZCBpcyBJbnZhbGlkIVxuIiwKLQkJCV9fZnVuY19fLCBudW1fY2FsX3R5cGVzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY2FsX3R5cGVzOyBpKyspIHsKLQkJaWYgKChpbmZvW2ldLnJlZy5jYWxfdHlwZSA8IDApIHx8Ci0JCQkoaW5mb1tpXS5yZWcuY2FsX3R5cGUgPj0gTUFYX0NBTF9UWVBFUykpIHsKLQkJCXByX2VycigiJXM6IGNhbCB0eXBlICVkIGF0IGluZGV4ICVkIGlzIEludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCBpbmZvW2ldLnJlZy5jYWxfdHlwZSwgaSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJY2FsX3R5cGVbaV0gPSBjcmVhdGVfY2FsX3R5cGVfZGF0YSgmaW5mb1tpXSk7Ci0JCWlmIChjYWxfdHlwZVtpXSA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgY2FsX3R5cGUgb2YgaW5kZXggJWQhXG4iLAotCQkJCV9fZnVuY19fLCBpKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlyZXQgPSBhdWRpb19jYWxfcmVnaXN0ZXIoMSwgJmluZm9baV0ucmVnKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGF1ZGlvX2NhbF9yZWdpc3RlciBmYWlsZWQsIHJldCA9ICVkIVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBjYWwgdHlwZSAlZCBhdCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgaW5mb1tpXS5yZWcuY2FsX3R5cGUsIGkpOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMpOwotCi1zdGF0aWMgdm9pZCBkZWxldGVfY2FsX2Jsb2NrKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQlsaXN0X2RlbCgmY2FsX2Jsb2NrLT5saXN0KTsKLQlrZnJlZShjYWxfYmxvY2stPmNsaWVudF9pbmZvKTsKLQljYWxfYmxvY2stPmNsaWVudF9pbmZvID0gTlVMTDsKLQlrZnJlZShjYWxfYmxvY2stPmNhbF9pbmZvKTsKLQljYWxfYmxvY2stPmNhbF9pbmZvID0gTlVMTDsKLQlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50ICAhPSBOVUxMKSB7Ci0JCW1zbV9hdWRpb19pb25fZnJlZShjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQsCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9oYW5kbGUpOwotCQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPSBOVUxMOwotCQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9oYW5kbGUgPSBOVUxMOwotCX0KLQlrZnJlZShjYWxfYmxvY2spOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfYWxsX2NhbF9ibG9ja3Moc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2s7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmY2FsX3R5cGUtPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0KLQkJcmV0ID0gdW5tYXBfbWVtb3J5KGNhbF90eXBlLCBjYWxfYmxvY2spOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogdW5tYXBfbWVtb3J5IGZhaWxlZCwgY2FsIHR5cGUgJWQsIHJldCA9ICVkIVxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCSAgICAgICBjYWxfdHlwZS0+aW5mby5yZWcuY2FsX3R5cGUsCi0JCQkJcmV0KTsKLQkJfQotCQlkZWxldGVfY2FsX2Jsb2NrKGNhbF9ibG9jayk7Ci0JCWNhbF9ibG9jayA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2NhbF90eXBlX2RhdGEoc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlKQotewotCWlmIChjYWxfdHlwZSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQlkZXN0cm95X2FsbF9jYWxfYmxvY2tzKGNhbF90eXBlKTsKLQlsaXN0X2RlbCgmY2FsX3R5cGUtPmNhbF9ibG9ja3MpOwotCWtmcmVlKGNhbF90eXBlKTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi12b2lkIGNhbF91dGlsc19kZXN0cm95X2NhbF90eXBlcyhpbnQgbnVtX2NhbF90eXBlcywKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICoqY2FsX3R5cGUpCi17Ci0JaW50IGk7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKChudW1fY2FsX3R5cGVzIDw9IDApIHx8Ci0JCShudW1fY2FsX3R5cGVzID4gTUFYX0NBTF9UWVBFUykpIHsKLQkJcHJfZXJyKCIlczogbnVtX2NhbF90eXBlcyBvZiAlZCBpcyBJbnZhbGlkIVxuIiwKLQkJCV9fZnVuY19fLCBudW1fY2FsX3R5cGVzKTsKLQkJZ290byBkb25lOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY2FsX3R5cGVzOyBpKyspIHsKLQkJYXVkaW9fY2FsX2RlcmVnaXN0ZXIoMSwgJmNhbF90eXBlW2ldLT5pbmZvLnJlZyk7Ci0JCWRlc3Ryb3lfY2FsX3R5cGVfZGF0YShjYWxfdHlwZVtpXSk7Ci0JCWNhbF90eXBlW2ldID0gTlVMTDsKLQl9Ci1kb25lOgotCXJldHVybjsKLX0KLQotLyoqCi0gKiBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrCi0gKgotICogQGNhbF90eXBlOiBwb2ludGVyIHRvIHRoZSBjYWwgdHlwZQotICoKLSAqIFJldHVybnMgY2FsX2Jsb2NrIHN0cnVjdHVyZQotICovCi1zdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCi0JCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKLQotCWlmIChjYWxfdHlwZSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmY2FsX3R5cGUtPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JcmV0dXJuIGNhbF9ibG9jazsKLX0KLUVYUE9SVF9TWU1CT0woY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jayk7Ci0KLS8qKgotICogY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jawotICoKLSAqIEBjYWxfYmxvY2s6IHBvaW50ZXIgdG8gY2FsIGJsb2NrIHN0cnVjdAotICogQHVzZXJfZGF0YTogcG9pbnRlciB0byB1c2VyIGRhdGEKLSAqCi0gKiBSZXR1cm5zIHRydWUgb24gbWF0Y2gKLSAqLwotYm9vbCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywKLQkJCQkJdm9pZCAqdXNlcl9kYXRhKQotewotCWJvb2wgcmV0ID0gZmFsc2U7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljCSpkYXRhID0gdXNlcl9kYXRhOwotCi0JaWYgKGNhbF9ibG9jay0+YnVmZmVyX251bWJlciA9PSBkYXRhLT5jYWxfaGRyLmJ1ZmZlcl9udW1iZXIpCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjYWxfdXRpbHNfbWF0Y2hfYnVmX251bSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmdldF9tYXRjaGluZ19jYWxfYmxvY2soCi0JCQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKLQkJCQkJdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQkqcHRyLCAqbmV4dDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJJmNhbF90eXBlLT5jYWxfYmxvY2tzKSB7Ci0KLQkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCi0JCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOwotCi0JCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MuCi0JCQltYXRjaF9ibG9jayhjYWxfYmxvY2ssIGRhdGEpKQotCQkJcmV0dXJuIGNhbF9ibG9jazsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBjYWxfYmxvY2tfaW9uX2FsbG9jKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludAlyZXQgPSAwOwotCi0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gbXNtX2F1ZGlvX2lvbl9pbXBvcnQoImF1ZGlvX2NhbF9jbGllbnQiLAotCQkmY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50LAotCQkmY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlLAotCQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9tYXBfaGFuZGxlLAotCQlOVUxMLCAwLAotCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsCi0JCSZjYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBJT04gaW1wb3J0IGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICpjcmVhdGVfY2FsX2Jsb2NrKHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKLQkJCQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMgKmJhc2ljX2NhbCwKLQkJCQlzaXplX3QgY2xpZW50X2luZm9fc2l6ZSwgdm9pZCAqY2xpZW50X2luZm8pCi17Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhCSpjYWxfYmxvY2sgPSBOVUxMOwotCi0JaWYgKGNhbF90eXBlID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsX3R5cGUgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoYmFzaWNfY2FsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYmFzaWNfY2FsIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljYWxfYmxvY2sgPSBremFsbG9jKHNpemVvZigqY2FsX2Jsb2NrKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2FsX2Jsb2NrLT5saXN0KTsKLQotCWNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX21hcF9oYW5kbGUgPSBiYXNpY19jYWwtPmNhbF9kYXRhLm1lbV9oYW5kbGU7Ci0JaWYgKGJhc2ljX2NhbC0+Y2FsX2RhdGEubWVtX2hhbmRsZSA+IDApIHsKLQkJaWYgKGNhbF9ibG9ja19pb25fYWxsb2MoY2FsX2Jsb2NrKSkgewotCQkJcHJfZXJyKCIlczogY2FsX2Jsb2NrX2lvbl9hbGxvYyBmYWlsZWQhXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCWlmIChjbGllbnRfaW5mb19zaXplID4gMCkgewotCQljYWxfYmxvY2stPmNsaWVudF9pbmZvX3NpemUgPSBjbGllbnRfaW5mb19zaXplOwotCQljYWxfYmxvY2stPmNsaWVudF9pbmZvID0ga21hbGxvYyhjbGllbnRfaW5mb19zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGNhbF9ibG9jay0+Y2xpZW50X2luZm8gPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogY291bGQgbm90IGFsbG9jYXRzIGNsaWVudF9pbmZvIVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlpZiAoY2xpZW50X2luZm8gIT0gTlVMTCkKLQkJCW1lbWNweShjYWxfYmxvY2stPmNsaWVudF9pbmZvLCBjbGllbnRfaW5mbywKLQkJCQljbGllbnRfaW5mb19zaXplKTsKLQl9Ci0KLQljYWxfYmxvY2stPmNhbF9pbmZvID0ga3phbGxvYygKLQkJZ2V0X2NhbF9pbmZvX3NpemUoY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhbF9ibG9jay0+Y2FsX2luZm8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdHMgY2FsX2luZm8hXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0JY2FsX2Jsb2NrLT5idWZmZXJfbnVtYmVyID0gYmFzaWNfY2FsLT5jYWxfaGRyLmJ1ZmZlcl9udW1iZXI7Ci0JbGlzdF9hZGRfdGFpbCgmY2FsX2Jsb2NrLT5saXN0LCAmY2FsX3R5cGUtPmNhbF9ibG9ja3MpOwotCXByX2RlYnVnKCIlczogY3JlYXRlZCBibG9jayBmb3IgY2FsIHR5cGUgJWQsIGJ1ZiBudW0gJWQsIG1hcCBoYW5kbGUgJWQsIG1hcCBzaXplICV6ZCBwYWRkciAweCVwSyFcbiIsCi0JCV9fZnVuY19fLCBjYWxfdHlwZS0+aW5mby5yZWcuY2FsX3R5cGUsCi0JCWNhbF9ibG9jay0+YnVmZmVyX251bWJlciwKLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fbWFwX2hhbmRsZSwKLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwKLQkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotZG9uZToKLQlyZXR1cm4gY2FsX2Jsb2NrOwotZXJyOgotCWtmcmVlKGNhbF9ibG9jay0+Y2FsX2luZm8pOwotCWNhbF9ibG9jay0+Y2FsX2luZm8gPSBOVUxMOwotCWtmcmVlKGNhbF9ibG9jay0+Y2xpZW50X2luZm8pOwotCWNhbF9ibG9jay0+Y2xpZW50X2luZm8gPSBOVUxMOwotCWtmcmVlKGNhbF9ibG9jayk7Ci0JY2FsX2Jsb2NrID0gTlVMTDsKLQlyZXR1cm4gY2FsX2Jsb2NrOwotfQotCi12b2lkIGNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKGludCBudW1fY2FsX3R5cGVzLAotCQkJCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqKmNhbF90eXBlKQotewotCWludCBpID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmICgobnVtX2NhbF90eXBlcyA8PSAwKSB8fAotCQkobnVtX2NhbF90eXBlcyA+IE1BWF9DQUxfVFlQRVMpKSB7Ci0JCXByX2VycigiJXM6IG51bV9jYWxfdHlwZXMgb2YgJWQgaXMgSW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgbnVtX2NhbF90eXBlcyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmb3IgKDsgaSA8IG51bV9jYWxfdHlwZXM7IGkrKykgewotCQlpZiAoY2FsX3R5cGVbaV0gPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCi0JCW11dGV4X2xvY2soJmNhbF90eXBlW2ldLT5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSZjYWxfdHlwZVtpXS0+Y2FsX2Jsb2NrcykgewotCi0JCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOwotCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZjYWxfdHlwZVtpXS0+bG9jayk7Ci0JfQotZG9uZToKLQlyZXR1cm47Ci19Ci0KLQotCi1zdGF0aWMgaW50IHJlYWxsb2NfbWVtb3J5KHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXQgPSAwOwotCi0JbXNtX2F1ZGlvX2lvbl9mcmVlKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCwKLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25faGFuZGxlKTsKLQljYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPSBOVUxMOwotCWNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7Ci0JY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID0gMDsKLQotCXJldCA9IGNhbF9ibG9ja19pb25fYWxsb2MoY2FsX2Jsb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogcmVhbGxvY19tZW1vcnkgZmFpbGVkIVxuIiwKLQkJCV9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1hcF9tZW1vcnkoc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlLAotCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCi17Ci0JaW50IHJldCA9IDA7Ci0KLQotCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MubWFwX2NhbCAhPSBOVUxMKSB7Ci0JCWlmICgoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fbWFwX2hhbmRsZSA8IDApIHx8Ci0JCQkoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA8PSAwKSB8fAotCQkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlICE9IDApKSB7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6IGNhbCB0eXBlICVkIGNhbGwgbWFwXG4iLAotCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSk7Ci0JCXJldCA9IGNhbF90eXBlLT5pbmZvLmNhbF91dGlsX2NhbGxiYWNrcy4KLQkJCW1hcF9jYWwoY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlLCBjYWxfYmxvY2spOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogbWFwX2NhbCBmYWlsZWQsIGNhbCB0eXBlICVkLCByZXQgPSAlZCFcbiIsCi0JCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwKLQkJCQlyZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHVubWFwX21lbW9yeShzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUsCi0JCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjYWxfdHlwZS0+aW5mby5jYWxfdXRpbF9jYWxsYmFja3MudW5tYXBfY2FsICE9IE5VTEwpIHsKLQkJaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9tYXBfaGFuZGxlIDwgMCkgfHwKLQkJCShjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplIDw9IDApIHx8Ci0JCQkoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkpIHsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IGNhbCB0eXBlICVkIGNhbGwgdW5tYXBcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKTsKLQkJcmV0ID0gY2FsX3R5cGUtPmluZm8uY2FsX3V0aWxfY2FsbGJhY2tzLgotCQkJdW5tYXBfY2FsKGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwgY2FsX2Jsb2NrKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHVubWFwX2NhbCBmYWlsZWQsIGNhbCB0eXBlICVkLCByZXQgPSAlZCFcbiIsCi0JCQkJX19mdW5jX18sIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSwKLQkJCQlyZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGNhbF91dGlsc19hbGxvY19jYWwKLSAqCi0gKiBAZGF0YV9zaXplOiBzaXplIG9mIGRhdGEgdG8gYWxsb2NhdGUKLSAqIEBkYXRhOiBkYXRhIHBvaW50ZXIKLSAqIEBjYWxfdHlwZTogcG9pbnRlciB0byB0aGUgY2FsIHR5cGUKLSAqIEBjbGllbnRfaW5mb19zaXplOiBjbGllbnQgaW5mbyBzaXplCi0gKiBAY2xpZW50X2luZm86IHBvaW50ZXIgdG8gY2xpZW50IGluZm8KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqLwotaW50IGNhbF91dGlsc19hbGxvY19jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKLQkJCXNpemVfdCBjbGllbnRfaW5mb19zaXplLCB2b2lkICpjbGllbnRfaW5mbykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jazsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWxsb2MgKmFsbG9jX2RhdGEgPSBkYXRhOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoZGF0YV9zaXplIDwgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9hbGxvYykpIHsKLQkJcHJfZXJyKCIlczogZGF0YV9zaXplIG9mICV6ZCBkb2VzIG5vdCBlcXVhbCBhbGxvYyBzdHJ1Y3Qgc2l6ZSBvZiAlemQhXG4iLAotCQkJX19mdW5jX18sIGRhdGFfc2l6ZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYWxsb2MpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoKGNsaWVudF9pbmZvX3NpemUgPiAwKSAmJiAoY2xpZW50X2luZm8gPT0gTlVMTCkpIHsKLQkJcHJfZXJyKCIlczogVXNlciBpbmZvIHBvaW50ZXIgaXMgTlVMTCBidXQgc2l6ZSBpcyAlemQhXG4iLAotCQkJX19mdW5jX18sIGNsaWVudF9pbmZvX3NpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGFsbG9jX2RhdGEtPmNhbF9kYXRhLm1lbV9oYW5kbGUgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1lbV9oYW5kbGUgJWQgaW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgYWxsb2NfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZjYWxfdHlwZS0+bG9jayk7Ci0KLQljYWxfYmxvY2sgPSBnZXRfbWF0Y2hpbmdfY2FsX2Jsb2NrKGNhbF90eXBlLAotCQlkYXRhKTsKLQlpZiAoY2FsX2Jsb2NrICE9IE5VTEwpIHsKLQkJcmV0ID0gdW5tYXBfbWVtb3J5KGNhbF90eXBlLCBjYWxfYmxvY2spOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCQlyZXQgPSByZWFsbG9jX21lbW9yeShjYWxfYmxvY2spOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCX0gZWxzZSB7Ci0JCWNhbF9ibG9jayA9IGNyZWF0ZV9jYWxfYmxvY2soY2FsX3R5cGUsCi0JCQkoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljICopYWxsb2NfZGF0YSwKLQkJCWNsaWVudF9pbmZvX3NpemUsIGNsaWVudF9pbmZvKTsKLQkJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBjcmVhdGVfY2FsX2Jsb2NrIGZhaWxlZCBmb3IgJWQhXG4iLAotCQkJCV9fZnVuY19fLCBhbGxvY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXJldCA9IG1hcF9tZW1vcnkoY2FsX3R5cGUsIGNhbF9ibG9jayk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotZXJyOgotCW11dGV4X3VubG9jaygmY2FsX3R5cGUtPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjYWxfdXRpbHNfYWxsb2NfY2FsKTsKLQotLyoqCi0gKiBjYWxfdXRpbHNfZGVhbGxvY19jYWwKLSAqCi0gKiBAZGF0YV9zaXplOiBzaXplIG9mIGRhdGEgdG8gYWxsb2NhdGUKLSAqIEBkYXRhOiBkYXRhIHBvaW50ZXIKLSAqIEBjYWxfdHlwZTogcG9pbnRlciB0byB0aGUgY2FsIHR5cGUKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqLwotaW50IGNhbF91dGlsc19kZWFsbG9jX2NhbChzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhLAotCQkJc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF90eXBlKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9kZWFsbG9jICpkZWFsbG9jX2RhdGEgPSBkYXRhOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQotCWlmIChjYWxfdHlwZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF90eXBlIGlzIE5VTEwhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGRhdGFfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZGVhbGxvYykpIHsKLQkJcHJfZXJyKCIlczogZGF0YV9zaXplIG9mICV6ZCBkb2VzIG5vdCBlcXVhbCBzdHJ1Y3Qgc2l6ZSBvZiAlemQhXG4iLAotCQkJX19mdW5jX18sIGRhdGFfc2l6ZSwKLQkJCXNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZGVhbGxvYykpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChkZWFsbG9jX2RhdGEtPmNhbF9kYXRhLm1lbV9oYW5kbGUgPT0gLTEpICYmCi0JCShkZWFsbG9jX2RhdGEtPmNhbF9oZHIuYnVmZmVyX251bWJlciA9PSBBTExfQ0FMX0JMT0NLUykpIHsKLQkJZGVzdHJveV9hbGxfY2FsX2Jsb2NrcyhjYWxfdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoZGVhbGxvY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtZW1faGFuZGxlICVkIGludmFsaWQhXG4iLAotCQkJX19mdW5jX18sIGRlYWxsb2NfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZjYWxfdHlwZS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gZ2V0X21hdGNoaW5nX2NhbF9ibG9jaygKLQkJY2FsX3R5cGUsCi0JCWRhdGEpOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhbGxvY2F0aW9uIGRvZXMgbm90IGV4aXN0IGZvciAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgZGVhbGxvY19kYXRhLT5jYWxfZGF0YS5tZW1faGFuZGxlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gdW5tYXBfbWVtb3J5KGNhbF90eXBlLCBjYWxfYmxvY2spOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQotCWRlbGV0ZV9jYWxfYmxvY2soY2FsX2Jsb2NrKTsKLWVycjoKLQltdXRleF91bmxvY2soJmNhbF90eXBlLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY2FsX3V0aWxzX2RlYWxsb2NfY2FsKTsKLQotLyoqCi0gKiBjYWxfdXRpbHNfc2V0X2NhbAotICoKLSAqIEBkYXRhX3NpemU6IHNpemUgb2YgZGF0YSB0byBhbGxvY2F0ZQotICogQGRhdGE6IGRhdGEgcG9pbnRlcgotICogQGNhbF90eXBlOiBwb2ludGVyIHRvIHRoZSBjYWwgdHlwZQotICogQGNsaWVudF9pbmZvX3NpemU6IGNsaWVudCBpbmZvIHNpemUKLSAqIEBjbGllbnRfaW5mbzogcG9pbnRlciB0byBjbGllbnQgaW5mbwotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZQotICovCi1pbnQgY2FsX3V0aWxzX3NldF9jYWwoc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSwKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwKLQkJCXNpemVfdCBjbGllbnRfaW5mb19zaXplLCB2b2lkICpjbGllbnRfaW5mbykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jazsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfYmFzaWMgKmJhc2ljX2RhdGEgPSBkYXRhOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX3R5cGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSBpcyBOVUxMIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgoY2xpZW50X2luZm9fc2l6ZSA+IDApICYmIChjbGllbnRfaW5mbyA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBVc2VyIGluZm8gcG9pbnRlciBpcyBOVUxMIGJ1dCBzaXplIGlzICV6ZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2xpZW50X2luZm9fc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoKGRhdGFfc2l6ZSA+IGdldF91c2VyX2NhbF90eXBlX3NpemUoCi0JCWNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSkpIHx8IChkYXRhX3NpemUgPCAwKSkgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCwgZGF0YV9zaXplIG9mICV6ZCBpcyBpbnZhbGlkLCBleHBlY3RpbmcgJXpkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfdHlwZS0+aW5mby5yZWcuY2FsX3R5cGUsIGRhdGFfc2l6ZSwKLQkJCWdldF91c2VyX2NhbF90eXBlX3NpemUoY2FsX3R5cGUtPmluZm8ucmVnLmNhbF90eXBlKSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZjYWxfdHlwZS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gZ2V0X21hdGNoaW5nX2NhbF9ibG9jaygKLQkJY2FsX3R5cGUsCi0JCWRhdGEpOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlpZiAoYmFzaWNfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSA+IDApIHsKLQkJCXByX2VycigiJXM6IGFsbG9jYXRpb24gZG9lcyBub3QgZXhpc3QgZm9yICVkIVxuIiwKLQkJCQlfX2Z1bmNfXywgYmFzaWNfZGF0YS0+Y2FsX2RhdGEubWVtX2hhbmRsZSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0gZWxzZSB7Ci0JCQljYWxfYmxvY2sgPSBjcmVhdGVfY2FsX2Jsb2NrKAotCQkJCWNhbF90eXBlLAotCQkJCWJhc2ljX2RhdGEsCi0JCQkJY2xpZW50X2luZm9fc2l6ZSwgY2xpZW50X2luZm8pOwotCQkJaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCIlczogY3JlYXRlX2NhbF9ibG9jayBmYWlsZWQgZm9yIGNhbCB0eXBlICVkIVxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJICAgICAgIGNhbF90eXBlLT5pbmZvLnJlZy5jYWxfdHlwZSk7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCX0KLQotCXJldCA9IG1hcF9tZW1vcnkoY2FsX3R5cGUsIGNhbF9ibG9jayk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCi0JY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID0gYmFzaWNfZGF0YS0+Y2FsX2RhdGEuY2FsX3NpemU7Ci0KLQlpZiAoY2xpZW50X2luZm9fc2l6ZSA+IDApIHsKLQkJbWVtY3B5KGNhbF9ibG9jay0+Y2xpZW50X2luZm8sCi0JCQljbGllbnRfaW5mbywKLQkJCWNsaWVudF9pbmZvX3NpemUpOwotCX0KLQotCW1lbWNweShjYWxfYmxvY2stPmNhbF9pbmZvLAotCQkoKHVpbnQ4X3QgKilkYXRhICsgc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYykpLAotCQlkYXRhX3NpemUgLSBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF90eXBlX2Jhc2ljKSk7Ci0KLWVycjoKLQltdXRleF91bmxvY2soJmNhbF90eXBlLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY2FsX3V0aWxzX3NldF9jYWwpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL2F1ZGlvX2NhbGlicmF0aW9uLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fY2FsaWJyYXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwOWIwOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fY2FsaWJyYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYzNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbGlicmF0aW9uLmg+Ci0jaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+Ci0KLXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gewotCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MJKmNhbGxiYWNrczsKLX07Ci0KLXN0cnVjdCBhdWRpb19jYWxfaW5mbyB7Ci0Jc3RydWN0IG11dGV4CQkJY29tbW9uX2xvY2s7Ci0Jc3RydWN0IG11dGV4CQkJY2FsX211dGV4W01BWF9DQUxfVFlQRVNdOwotCXN0cnVjdCBsaXN0X2hlYWQJCWNsaWVudF9pbmZvW01BWF9DQUxfVFlQRVNdOwotCWludAkJCQlyZWZfY291bnQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2NhbF9pbmZvCWF1ZGlvX2NhbDsKLQotCi1zdGF0aWMgYm9vbCBjYWxsYmFja3NfYXJlX2VxdWFsKHN0cnVjdCBhdWRpb19jYWxfY2FsbGJhY2tzICpjYWxsYmFjazEsCi0JCQkJc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MgKmNhbGxiYWNrMikKLXsKLQlib29sIHJldCA9IHRydWU7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jYWxsYmFja3MgKmNhbGwxID0gY2FsbGJhY2sxOwotCXN0cnVjdCBhdWRpb19jYWxfY2FsbGJhY2tzICpjYWxsMiA9IGNhbGxiYWNrMjsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKChjYWxsMSA9PSBOVUxMKSAmJiAoY2FsbDIgPT0gTlVMTCkpCi0JCXJldCA9IHRydWU7Ci0JZWxzZSBpZiAoKGNhbGwxID09IE5VTEwpIHx8IChjYWxsMiA9PSBOVUxMKSkKLQkJcmV0ID0gZmFsc2U7Ci0JZWxzZSBpZiAoKGNhbGwxLT5hbGxvYyAhPSBjYWxsMi0+YWxsb2MpIHx8Ci0JCShjYWxsMS0+ZGVhbGxvYyAhPSBjYWxsMi0+ZGVhbGxvYykgfHwKLQkJKGNhbGwxLT5wcmVfY2FsICE9IGNhbGwyLT5wcmVfY2FsKSB8fAotCQkoY2FsbDEtPnNldF9jYWwgIT0gY2FsbDItPnNldF9jYWwpIHx8Ci0JCShjYWxsMS0+Z2V0X2NhbCAhPSBjYWxsMi0+Z2V0X2NhbCkgfHwKLQkJKGNhbGwxLT5wb3N0X2NhbCAhPSBjYWxsMi0+cG9zdF9jYWwpKQotCQlyZXQgPSBmYWxzZTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYXVkaW9fY2FsX2RlcmVnaXN0ZXIoaW50IG51bV9jYWxfdHlwZXMsCi0JCQkgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBpID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvX25vZGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAocmVnX2RhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiByZWdfZGF0YSBpcyBOVUxMIVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmICgobnVtX2NhbF90eXBlcyA8PSAwKSB8fAotCQkobnVtX2NhbF90eXBlcyA+IE1BWF9DQUxfVFlQRVMpKSB7Ci0JCXByX2VycigiJXM6IG51bV9jYWxfdHlwZXMgb2YgJWQgaXMgSW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgbnVtX2NhbF90eXBlcyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmb3IgKDsgaSA8IG51bV9jYWxfdHlwZXM7IGkrKykgewotCQlpZiAoKHJlZ19kYXRhW2ldLmNhbF90eXBlIDwgMCkgfHwKLQkJCShyZWdfZGF0YVtpXS5jYWxfdHlwZSA+PSBNQVhfQ0FMX1RZUEVTKSkgewotCQkJcHJfZXJyKCIlczogY2FsIHR5cGUgJWQgYXQgaW5kZXggJWQgaXMgSW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIHJlZ19kYXRhW2ldLmNhbF90eXBlLCBpKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCW11dGV4X2xvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbcmVnX2RhdGFbaV0uY2FsX3R5cGVdKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bcmVnX2RhdGFbaV0uY2FsX3R5cGVdKSB7Ci0KLQkJCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKLQkJCWlmIChjYWxsYmFja3NfYXJlX2VxdWFsKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcywKLQkJCQkmcmVnX2RhdGFbaV0uY2FsbGJhY2tzKSkgewotCQkJCWxpc3RfZGVsKCZjbGllbnRfaW5mb19ub2RlLT5saXN0KTsKLQkJCQlrZnJlZShjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MpOwotCQkJCWNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcyA9IE5VTEw7Ci0JCQkJa2ZyZWUoY2xpZW50X2luZm9fbm9kZSk7Ci0JCQkJY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19jYWwuY2FsX211dGV4W3JlZ19kYXRhW2ldLmNhbF90eXBlXSk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0KLWludCBhdWRpb19jYWxfcmVnaXN0ZXIoaW50IG51bV9jYWxfdHlwZXMsCi0JCQkgc3RydWN0IGF1ZGlvX2NhbF9yZWcgKnJlZ19kYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBpID0gMDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NhbGxiYWNrcyAqY2FsbGJhY2tfbm9kZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChyZWdfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbGxiYWNrcyBhcmUgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoKG51bV9jYWxfdHlwZXMgPD0gMCkgfHwKLQkJKG51bV9jYWxfdHlwZXMgPiBNQVhfQ0FMX1RZUEVTKSkgewotCQlwcl9lcnIoIiVzOiBudW1fY2FsX3R5cGVzIG9mICVkIGlzIEludmFsaWQhXG4iLAotCQkJX19mdW5jX18sIG51bV9jYWxfdHlwZXMpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZm9yICg7IGkgPCBudW1fY2FsX3R5cGVzOyBpKyspIHsKLQkJaWYgKChyZWdfZGF0YVtpXS5jYWxfdHlwZSA8IDApIHx8Ci0JCQkocmVnX2RhdGFbaV0uY2FsX3R5cGUgPj0gTUFYX0NBTF9UWVBFUykpIHsKLQkJCXByX2VycigiJXM6IGNhbCB0eXBlICVkIGF0IGluZGV4ICVkIGlzIEludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCByZWdfZGF0YVtpXS5jYWxfdHlwZSwgaSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQljbGllbnRfaW5mb19ub2RlID0ga21hbGxvYyhzaXplb2YoKmNsaWVudF9pbmZvX25vZGUpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmIChjbGllbnRfaW5mb19ub2RlID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlJTklUX0xJU1RfSEVBRCgmY2xpZW50X2luZm9fbm9kZS0+bGlzdCk7Ci0KLQkJY2FsbGJhY2tfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCpjYWxsYmFja19ub2RlKSwKLQkJCUdGUF9LRVJORUwpOwotCQlpZiAoY2FsbGJhY2tfbm9kZSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQltZW1jcHkoY2FsbGJhY2tfbm9kZSwgJnJlZ19kYXRhW2ldLmNhbGxiYWNrcywKLQkJCXNpemVvZigqY2FsbGJhY2tfbm9kZSkpOwotCQljbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MgPSBjYWxsYmFja19ub2RlOwotCi0JCW11dGV4X2xvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbcmVnX2RhdGFbaV0uY2FsX3R5cGVdKTsKLQkJbGlzdF9hZGRfdGFpbCgmY2xpZW50X2luZm9fbm9kZS0+bGlzdCwKLQkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bcmVnX2RhdGFbaV0uY2FsX3R5cGVdKTsKLQkJbXV0ZXhfdW5sb2NrKCZhdWRpb19jYWwuY2FsX211dGV4W3JlZ19kYXRhW2ldLmNhbF90eXBlXSk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotZXJyOgotCWF1ZGlvX2NhbF9kZXJlZ2lzdGVyKG51bV9jYWxfdHlwZXMsIHJlZ19kYXRhKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhbGxfYWxsb2NzKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc2l6ZV90IGNhbF90eXBlX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHJldDIgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCi0JCQkmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2NhbF90eXBlXSkgewotCi0JCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8sIGxpc3QpOwotCi0JCWlmIChjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPmFsbG9jID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQlyZXQyID0gY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT4KLQkJCWFsbG9jKGNhbF90eXBlLCBjYWxfdHlwZV9zaXplLCBkYXRhKTsKLQkJaWYgKHJldDIgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBhbGxvYyBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSByZXQyOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsbF9kZWFsbG9jcyhpbnQzMl90IGNhbF90eXBlLAotCQkJCXNpemVfdCBjYWxfdHlwZV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCByZXQyID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvX25vZGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzIGNhbCB0eXBlICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bY2FsX3R5cGVdKSB7Ci0KLQkJY2xpZW50X2luZm9fbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbywgbGlzdCk7Ci0KLQkJaWYgKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+ZGVhbGxvYyA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJcmV0MiA9IGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+Ci0JCQlkZWFsbG9jKGNhbF90eXBlLCBjYWxfdHlwZV9zaXplLCBkYXRhKTsKLQkJaWYgKHJldDIgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBkZWFsbG9jIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IHJldDI7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWxsX3ByZV9jYWxzKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc2l6ZV90IGNhbF90eXBlX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHJldDIgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXMgY2FsIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tjYWxfdHlwZV0pIHsKLQotCQljbGllbnRfaW5mb19ub2RlID0gbGlzdF9lbnRyeShwdHIsCi0JCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKLQotCQlpZiAoY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT5wcmVfY2FsID09IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQlyZXQyID0gY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT4KLQkJCXByZV9jYWwoY2FsX3R5cGUsIGNhbF90eXBlX3NpemUsIGRhdGEpOwotCQlpZiAocmV0MiA8IDApIHsKLQkJCXByX2VycigiJXM6IHByZV9jYWwgZmFpbGVkIVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gcmV0MjsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhbGxfcG9zdF9jYWxzKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc2l6ZV90IGNhbF90eXBlX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHJldDIgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbyAqY2xpZW50X2luZm9fbm9kZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXMgY2FsIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkJJmF1ZGlvX2NhbC5jbGllbnRfaW5mb1tjYWxfdHlwZV0pIHsKLQotCQljbGllbnRfaW5mb19ub2RlID0gbGlzdF9lbnRyeShwdHIsCi0JCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKLQotCQlpZiAoY2xpZW50X2luZm9fbm9kZS0+Y2FsbGJhY2tzLT5wb3N0X2NhbCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJcmV0MiA9IGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+Ci0JCQlwb3N0X2NhbChjYWxfdHlwZSwgY2FsX3R5cGVfc2l6ZSwgZGF0YSk7Ci0JCWlmIChyZXQyIDwgMCkgewotCQkJcHJfZXJyKCIlczogcG9zdF9jYWwgZmFpbGVkIVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gcmV0MjsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhbGxfc2V0X2NhbHMoaW50MzJfdCBjYWxfdHlwZSwKLQkJCQlzaXplX3QgY2FsX3R5cGVfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgcmV0MiA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlID0gTlVMTDsKLQotCXByX2RlYnVnKCIlcyBjYWwgdHlwZSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCi0JCQkmYXVkaW9fY2FsLmNsaWVudF9pbmZvW2NhbF90eXBlXSkgewotCi0JCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8sIGxpc3QpOwotCi0JCWlmIChjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPnNldF9jYWwgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCi0JCXJldDIgPSBjbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MtPgotCQkJc2V0X2NhbChjYWxfdHlwZSwgY2FsX3R5cGVfc2l6ZSwgZGF0YSk7Ci0JCWlmIChyZXQyIDwgMCkgewotCQkJcHJfZXJyKCIlczogc2V0X2NhbCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSByZXQyOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsbF9nZXRfY2FscyhpbnQzMl90IGNhbF90eXBlLAotCQkJCXNpemVfdCBjYWxfdHlwZV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCByZXQyID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19jYWxfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvX25vZGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzIGNhbCB0eXBlICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9bY2FsX3R5cGVdKSB7Ci0KLQkJY2xpZW50X2luZm9fbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJc3RydWN0IGF1ZGlvX2NhbF9jbGllbnRfaW5mbywgbGlzdCk7Ci0KLQkJaWYgKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+Z2V0X2NhbCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJcmV0MiA9IGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcy0+Ci0JCQlnZXRfY2FsKGNhbF90eXBlLCBjYWxfdHlwZV9zaXplLCBkYXRhKTsKLQkJaWYgKHJldDIgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBnZXRfY2FsIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IHJldDI7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdWRpb19jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fY2FsLmNvbW1vbl9sb2NrKTsKLQlhdWRpb19jYWwucmVmX2NvdW50Kys7Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19jYWwuY29tbW9uX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZGVhbGxvY19hbGxfY2xpZW50cyh2b2lkKQotewotCWludCBpID0gMDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZGVhbGxvYyBkZWFsbG9jX2RhdGE7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWRlYWxsb2NfZGF0YS5jYWxfaGRyLnZlcnNpb24gPSBWRVJTSU9OXzBfMDsKLQlkZWFsbG9jX2RhdGEuY2FsX2hkci5idWZmZXJfbnVtYmVyID0gQUxMX0NBTF9CTE9DS1M7Ci0JZGVhbGxvY19kYXRhLmNhbF9kYXRhLm1lbV9oYW5kbGUgPSAtMTsKLQotCWZvciAoOyBpIDwgTUFYX0NBTF9UWVBFUzsgaSsrKQotCQljYWxsX2RlYWxsb2NzKGksIHNpemVvZihkZWFsbG9jX2RhdGEpLCAmZGVhbGxvY19kYXRhKTsKLX0KLQotc3RhdGljIGludCBhdWRpb19jYWxfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmYXVkaW9fY2FsLmNvbW1vbl9sb2NrKTsKLQlhdWRpb19jYWwucmVmX2NvdW50LS07Ci0JaWYgKGF1ZGlvX2NhbC5yZWZfY291bnQgPD0gMCkgewotCQlhdWRpb19jYWwucmVmX2NvdW50ID0gMDsKLQkJZGVhbGxvY19hbGxfY2xpZW50cygpOwotCX0KLQltdXRleF91bmxvY2soJmF1ZGlvX2NhbC5jb21tb25fbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19jYWxfc2hhcmVkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJCXZvaWQgX191c2VyICphcmcpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50MzJfdCBzaXplOwotCXN0cnVjdCBhdWRpb19jYWxfYmFzaWMgKmRhdGEgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT046Ci0JY2FzZSBBVURJT19ERUFMTE9DQVRFX0NBTElCUkFUSU9OOgotCWNhc2UgQVVESU9fUFJFUEFSRV9DQUxJQlJBVElPTjoKLQljYXNlIEFVRElPX1NFVF9DQUxJQlJBVElPTjoKLQljYXNlIEFVRElPX0dFVF9DQUxJQlJBVElPTjoKLQljYXNlIEFVRElPX1BPU1RfQ0FMSUJSQVRJT046Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGlvY3RsIG5vdCBmb3VuZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2l6ZSwgKHZvaWQgKilhcmcsIHNpemVvZihzaXplKSkpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgc2l6ZSB2YWx1ZSBmcm9tIHVzZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoKHNpemUgPCBzaXplb2Yoc3RydWN0IGF1ZGlvX2NhbF9iYXNpYykpCi0JCXx8IChzaXplID4gTUFYX0lPQ1RMX0NNRF9TSVpFKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNpemUgc2VudCB0byBkcml2ZXI6ICVkLCBtYXggc2l6ZSBpcyAlZCwgbWluIHNpemUgaXMgJXpkXG4iLAotCQkJX19mdW5jX18sIHNpemUsIE1BWF9JT0NUTF9DTURfU0laRSwKLQkJCXNpemVvZihzdHJ1Y3QgYXVkaW9fY2FsX2Jhc2ljKSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlkYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsICh2b2lkICopYXJnLCBzaXplKSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBkYXRhIGZyb20gdXNlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoKGRhdGEtPmhkci5jYWxfdHlwZSA8IDApIHx8Ci0JCShkYXRhLT5oZHIuY2FsX3R5cGUgPj0gTUFYX0NBTF9UWVBFUykpIHsKLQkJcHJfZXJyKCIlczogY2FsIHR5cGUgJWQgaXMgSW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgZGF0YS0+aGRyLmNhbF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoKGRhdGEtPmhkci5jYWxfdHlwZV9zaXplIDwKLQkJc2l6ZW9mKHN0cnVjdCBhdWRpb19jYWxfdHlwZV9iYXNpYykpIHx8Ci0JCShkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSA+Ci0JCWdldF91c2VyX2NhbF90eXBlX3NpemUoZGF0YS0+aGRyLmNhbF90eXBlKSkpIHsKLQkJcHJfZXJyKCIlczogY2FsIHR5cGUgc2l6ZSAlZCBpcyBJbnZhbGlkISBNYXggaXMgJXpkIVxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSwKLQkJCWdldF91c2VyX2NhbF90eXBlX3NpemUoZGF0YS0+aGRyLmNhbF90eXBlKSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKGRhdGEtPmNhbF90eXBlLmNhbF9oZHIuYnVmZmVyX251bWJlciA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsIHR5cGUgJWQgSW52YWxpZCBidWZmZXIgbnVtYmVyICVkIVxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5oZHIuY2FsX3R5cGUsCi0JCQlkYXRhLT5jYWxfdHlwZS5jYWxfaGRyLmJ1ZmZlcl9udW1iZXIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmICgoZGF0YS0+aGRyLmNhbF90eXBlX3NpemUgKyBzaXplb2YoZGF0YS0+aGRyKSkgPiBzaXplKSB7Ci0JCXByX2VycigiJXM6IGNhbCB0eXBlIGhkciBzaXplICV6ZCArIGNhbCB0eXBlIHNpemUgJWQgaXMgZ3JlYXRlciB0aGFuIHVzZXIgYnVmZmVyIHNpemUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2l6ZW9mKGRhdGEtPmhkciksIGRhdGEtPmhkci5jYWxfdHlwZV9zaXplLAotCQkJc2l6ZSk7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCW11dGV4X2xvY2soJmF1ZGlvX2NhbC5jYWxfbXV0ZXhbZGF0YS0+aGRyLmNhbF90eXBlXSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT046Ci0JCXJldCA9IGNhbGxfYWxsb2NzKGRhdGEtPmhkci5jYWxfdHlwZSwKLQkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOwotCQlicmVhazsKLQljYXNlIEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT046Ci0JCXJldCA9IGNhbGxfZGVhbGxvY3MoZGF0YS0+aGRyLmNhbF90eXBlLAotCQkJZGF0YS0+aGRyLmNhbF90eXBlX3NpemUsICZkYXRhLT5jYWxfdHlwZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fUFJFUEFSRV9DQUxJQlJBVElPTjoKLQkJcmV0ID0gY2FsbF9wcmVfY2FscyhkYXRhLT5oZHIuY2FsX3R5cGUsCi0JCQlkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSwgJmRhdGEtPmNhbF90eXBlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfQ0FMSUJSQVRJT046Ci0JCXJldCA9IGNhbGxfc2V0X2NhbHMoZGF0YS0+aGRyLmNhbF90eXBlLAotCQkJZGF0YS0+aGRyLmNhbF90eXBlX3NpemUsICZkYXRhLT5jYWxfdHlwZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX0NBTElCUkFUSU9OOgotCQlyZXQgPSBjYWxsX2dldF9jYWxzKGRhdGEtPmhkci5jYWxfdHlwZSwKLQkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1BPU1RfQ0FMSUJSQVRJT046Ci0JCXJldCA9IGNhbGxfcG9zdF9jYWxzKGRhdGEtPmhkci5jYWxfdHlwZSwKLQkJCWRhdGEtPmhkci5jYWxfdHlwZV9zaXplLCAmZGF0YS0+Y2FsX3R5cGUpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoY21kID09IEFVRElPX0dFVF9DQUxJQlJBVElPTikgewotCQlpZiAoZGF0YS0+aGRyLmNhbF90eXBlX3NpemUgPT0gMCkKLQkJCWdvdG8gdW5sb2NrOwotCQlpZiAoZGF0YSA9PSBOVUxMKQotCQkJZ290byB1bmxvY2s7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCBkYXRhLAotCQkJc2l6ZW9mKGRhdGEtPmhkcikgKyBkYXRhLT5oZHIuY2FsX3R5cGVfc2l6ZSkpIHsKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IGNhbCB0eXBlIHRvIHVzZXJcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gdW5sb2NrOwotCQl9Ci0JfQotCi11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZhdWRpb19jYWwuY2FsX211dGV4W2RhdGEtPmhkci5jYWxfdHlwZV0pOwotZG9uZToKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgbG9uZyBhdWRpb19jYWxfaW9jdGwoc3RydWN0IGZpbGUgKmYsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiBhdWRpb19jYWxfc2hhcmVkX2lvY3RsKGYsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotI2RlZmluZSBBVURJT19BTExPQ0FURV9DQUxJQlJBVElPTjMyCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwMCwgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fREVBTExPQ0FURV9DQUxJQlJBVElPTjMyCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwMSwgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fUFJFUEFSRV9DQUxJQlJBVElPTjMyCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwMiwgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fU0VUX0NBTElCUkFUSU9OMzIJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwMywgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fR0VUX0NBTElCUkFUSU9OMzIJCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwNCwgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fUE9TVF9DQUxJQlJBVElPTjMyCV9JT1dSKENBTF9JT0NUTF9NQUdJQywgXAotCQkJCQkJCTIwNSwgY29tcGF0X3VwdHJfdCkKLQotc3RhdGljIGxvbmcgYXVkaW9fY2FsX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgaW50IGNtZDY0OwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0FMTE9DQVRFX0NBTElCUkFUSU9OMzI6Ci0JCWNtZDY0ID0gQVVESU9fQUxMT0NBVEVfQ0FMSUJSQVRJT047Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fREVBTExPQ0FURV9DQUxJQlJBVElPTjMyOgotCQljbWQ2NCA9IEFVRElPX0RFQUxMT0NBVEVfQ0FMSUJSQVRJT047Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fUFJFUEFSRV9DQUxJQlJBVElPTjMyOgotCQljbWQ2NCA9IEFVRElPX1BSRVBBUkVfQ0FMSUJSQVRJT047Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX0NBTElCUkFUSU9OMzI6Ci0JCWNtZDY0ID0gQVVESU9fU0VUX0NBTElCUkFUSU9OOwotCQlicmVhazsKLQljYXNlIEFVRElPX0dFVF9DQUxJQlJBVElPTjMyOgotCQljbWQ2NCA9IEFVRElPX0dFVF9DQUxJQlJBVElPTjsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19QT1NUX0NBTElCUkFUSU9OMzI6Ci0JCWNtZDY0ID0gQVVESU9fUE9TVF9DQUxJQlJBVElPTjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW9jdGwgbm90IGZvdW5kIVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gYXVkaW9fY2FsX3NoYXJlZF9pb2N0bChmLCBjbWQ2NCwgY29tcGF0X3B0cihhcmcpKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19jYWxfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGF1ZGlvX2NhbF9vcGVuLAotCS5yZWxlYXNlID0gYXVkaW9fY2FsX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gYXVkaW9fY2FsX2lvY3RsLAotI2lmZGVmIENPTkZJR19DT01QQVQKLQkuY29tcGF0X2lvY3RsID0gICBhdWRpb19jYWxfY29tcGF0X2lvY3RsLAotI2VuZGlmCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19jYWxfbWlzYyA9IHsKLQkubWlub3IJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0JLm5hbWUJPSAibXNtX2F1ZGlvX2NhbCIsCi0JLmZvcHMJPSAmYXVkaW9fY2FsX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19jYWxfaW5pdCh2b2lkKQotewotCWludCBpID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbWVtc2V0KCZhdWRpb19jYWwsIDAsIHNpemVvZihhdWRpb19jYWwpKTsKLQltdXRleF9pbml0KCZhdWRpb19jYWwuY29tbW9uX2xvY2spOwotCWZvciAoOyBpIDwgTUFYX0NBTF9UWVBFUzsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZhdWRpb19jYWwuY2xpZW50X2luZm9baV0pOwotCQltdXRleF9pbml0KCZhdWRpb19jYWwuY2FsX211dGV4W2ldKTsKLQl9Ci0KLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmYXVkaW9fY2FsX21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXVkaW9fY2FsX2V4aXQodm9pZCkKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvICpjbGllbnRfaW5mb19ub2RlOwotCi0JZm9yICg7IGkgPCBNQVhfQ0FMX1RZUEVTOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCSZhdWRpb19jYWwuY2xpZW50X2luZm9baV0pIHsKLQkJCWNsaWVudF9pbmZvX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCQlzdHJ1Y3QgYXVkaW9fY2FsX2NsaWVudF9pbmZvLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZjbGllbnRfaW5mb19ub2RlLT5saXN0KTsKLQkJCWtmcmVlKGNsaWVudF9pbmZvX25vZGUtPmNhbGxiYWNrcyk7Ci0JCQljbGllbnRfaW5mb19ub2RlLT5jYWxsYmFja3MgPSBOVUxMOwotCQkJa2ZyZWUoY2xpZW50X2luZm9fbm9kZSk7Ci0JCQljbGllbnRfaW5mb19ub2RlID0gTlVMTDsKLQkJfQotCX0KLX0KLQotc3Vic3lzX2luaXRjYWxsKGF1ZGlvX2NhbF9pbml0KTsKLW1vZHVsZV9leGl0KGF1ZGlvX2NhbF9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTb0MgUURTUDZ2MiBBdWRpbyBDYWxpYnJhdGlvbiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19zbGltc2xhdmUuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9hdWRpb19zbGltc2xhdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllY2ZkNS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvYXVkaW9fc2xpbXNsYXZlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX3NsaW1zbGF2ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsaW1idXMvc2xpbWJ1cy5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLQotc3RhdGljIHN0cnVjdCBzbGltX2RldmljZSAqc2xpbTsKLXN0YXRpYyBpbnQgdm90ZV9jb3VudDsKLXN0cnVjdCBtdXRleCBzdXNwZW5kX2xvY2s7Ci1ib29sIHN1c3BlbmQ7Ci0KLXN0YXRpYyBpbnQgYXVkaW9fc2xpbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWlmICh2b3RlX2NvdW50KSB7Ci0JCXByX2RlYnVnKCIlczogdW52b3RlOiB2b3RlX2NvdW50PSVkXG4iLCBfX2Z1bmNfXywgdm90ZV9jb3VudCk7Ci0JCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc2xpbS0+ZGV2LnBhcmVudCk7Ci0JCXBtX3J1bnRpbWVfcHV0KHNsaW0tPmRldi5wYXJlbnQpOwotCQl2b3RlX2NvdW50LS07Ci0JfQotCXJldHVybiAwOwotfTsKLQotc3RhdGljIGludCBhdWRpb19zbGltX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHZvdGVfY291bnQpIHsKLQkJcHJfZGVidWcoIiVzOiB1bnZvdGU6IHZvdGVfY291bnQ9JWRcbiIsIF9fZnVuY19fLCB2b3RlX2NvdW50KTsKLQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzbGltLT5kZXYucGFyZW50KTsKLQkJcG1fcnVudGltZV9wdXQoc2xpbS0+ZGV2LnBhcmVudCk7Ci0JCXZvdGVfY291bnQtLTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IHZvdGU6IHZvdGVfY291bnQ9JWRcbiIsIF9fZnVuY19fLCB2b3RlX2NvdW50KTsKLQkJcG1fcnVudGltZV9nZXRfc3luYyhzbGltLT5kZXYucGFyZW50KTsKLQkJdm90ZV9jb3VudCsrOwotCX0KLQlyZXR1cm4gMDsKLX07Ci0KLXN0YXRpYyBsb25nIGF1ZGlvX3NsaW1faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgdV9hcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX1NMSU1TTEFWRV9WT1RFOgotCQltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOwotCQlpZiAoIXZvdGVfY291bnQgJiYgIXN1c3BlbmQpIHsKLQkJCXByX2RlYnVnKCIlczpBVURJT19TTElNU0xBVkVfVk9URVxuIiwgX19mdW5jX18pOwotCQkJcG1fcnVudGltZV9nZXRfc3luYyhzbGltLT5kZXYucGFyZW50KTsKLQkJCXZvdGVfY291bnQrKzsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6SW52YWxpZCB2b3RlOiB2b3RlX2NvdW50PSVkIHN1c3BlbmQ9JWRcbiIsCi0JCQkJIF9fZnVuY19fLCB2b3RlX2NvdW50LCBzdXNwZW5kKTsKLQkJfQotCQltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0xJTVNMQVZFX1VOVk9URToKLQkJbXV0ZXhfbG9jaygmc3VzcGVuZF9sb2NrKTsKLQkJaWYgKHZvdGVfY291bnQgJiYgIXN1c3BlbmQpIHsKLQkJCXByX2RlYnVnKCIlczpBVURJT19TTElNU0xBVkVfVU5WT1RFXG4iLCBfX2Z1bmNfXyk7Ci0JCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHNsaW0tPmRldi5wYXJlbnQpOwotCQkJcG1fcnVudGltZV9wdXQoc2xpbS0+ZGV2LnBhcmVudCk7Ci0JCQl2b3RlX2NvdW50LS07Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOkludmFsaWQgdW52b3RlOiB2b3RlX2NvdW50PSVkIHN1c3BlbmQ9JWRcbiIsCi0JCQkJIF9fZnVuY19fLCB2b3RlX2NvdW50LCBzdXNwZW5kKTsKLQkJfQotCQltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogSW52YWxpZCBpb2N0bCBjbWQ6ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19zbGltc2xhdmVfZm9wcyA9IHsKLQkub3BlbiA9ICAgICAgICAgICAgICAgICBhdWRpb19zbGltX29wZW4sCi0JLnVubG9ja2VkX2lvY3RsID0gICAgICAgYXVkaW9fc2xpbV9pb2N0bCwKLQkucmVsZWFzZSA9ICAgICAgICAgICAgICBhdWRpb19zbGltX3JlbGVhc2UsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBhdWRpb19zbGltc2xhdmVfbWlzYyA9IHsKLQkubWlub3IgID0gICAgICAgTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lICAgPSAgICAgICBBVURJT19TTElNU0xBVkVfSU9DVExfTkFNRSwKLQkuZm9wcyAgID0gICAgICAgJmF1ZGlvX3NsaW1zbGF2ZV9mb3BzLAotfTsKLQotc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcHJvYmUoc3RydWN0IHNsaW1fZGV2aWNlICphdWRpb19zbGltKQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2luaXQoJnN1c3BlbmRfbG9jayk7Ci0Jc3VzcGVuZCA9IGZhbHNlOwotCXNsaW0gPSBhdWRpb19zbGltOwotCW1pc2NfcmVnaXN0ZXIoJmF1ZGlvX3NsaW1zbGF2ZV9taXNjKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcmVtb3ZlKHN0cnVjdCBzbGltX2RldmljZSAqYXVkaW9fc2xpbSkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltaXNjX2RlcmVnaXN0ZXIoJmF1ZGlvX3NsaW1zbGF2ZV9taXNjKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdWRpb19zbGltc2xhdmVfcmVzdW1lKHN0cnVjdCBzbGltX2RldmljZSAqYXVkaW9fc2xpbSkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOwotCXN1c3BlbmQgPSBmYWxzZTsKLQltdXRleF91bmxvY2soJnN1c3BlbmRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fc2xpbXNsYXZlX3N1c3BlbmQoc3RydWN0IHNsaW1fZGV2aWNlICphdWRpb19zbGltLAotCQkJCSAgIHBtX21lc3NhZ2VfdCBwbWVzZykKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZzdXNwZW5kX2xvY2spOwotCXN1c3BlbmQgPSB0cnVlOwotCW11dGV4X3VubG9jaygmc3VzcGVuZF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbGltX2RldmljZV9pZCBhdWRpb19zbGltc2xhdmVfZHRfbWF0Y2hbXSA9IHsKLQl7ImF1ZGlvLXNsaW1zbGF2ZSIsIDB9LAotCXt9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNsaW1fZHJpdmVyIGF1ZGlvX3NsaW1zbGF2ZV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYXVkaW8tc2xpbXNsYXZlIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUgPSBhdWRpb19zbGltc2xhdmVfcHJvYmUsCi0JLnJlbW92ZSA9IGF1ZGlvX3NsaW1zbGF2ZV9yZW1vdmUsCi0JLmlkX3RhYmxlID0gYXVkaW9fc2xpbXNsYXZlX2R0X21hdGNoLAotCS5yZXN1bWUgPSBhdWRpb19zbGltc2xhdmVfcmVzdW1lLAotCS5zdXNwZW5kID0gYXVkaW9fc2xpbXNsYXZlX3N1c3BlbmQsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhdWRpb19zbGltc2xhdmVfaW5pdCh2b2lkKQotewotCXJldHVybiBzbGltX2RyaXZlcl9yZWdpc3RlcigmYXVkaW9fc2xpbXNsYXZlX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChhdWRpb19zbGltc2xhdmVfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRpb19zbGltc2xhdmVfZXhpdCh2b2lkKQotewotCi19Ci1tb2R1bGVfZXhpdChhdWRpb19zbGltc2xhdmVfZXhpdCk7Ci0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBdWRpbyBzaWRlIFNsaW1idXMgc2xhdmUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg0NWVlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tYXVkaW8tZWZmZWN0cy1xNi12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvbXNtLWF1ZGlvLWVmZmVjdHMtcTYtdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9kZXZkZXBfcGFyYW1zLmg+Ci0KLSNkZWZpbmUgTUFYX0VOQUJMRV9DTURfU0laRSAzMgotCi0jZGVmaW5lIEdFVF9ORVhUKHB0ciwgdXBwZXJfbGltaXQsIHJjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKCgocHRyKSArIDEpID4gKHVwcGVyX2xpbWl0KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJcHJfZXJyKCIlczogcGFyYW0gbGlzdCBvdXQgb2YgYm91bmRhcnlcbiIsIF9fZnVuY19fKTsgICBcCi0JCShyYykgPSAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChyYykgPT0gMCkgPyAqKHB0cikrKyA6ICAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0KLSNkZWZpbmUgQ0hFQ0tfUEFSQU1fTEVOKGxlbiwgbWF4X2xlbiwgdGFnLCByYykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoKGxlbikgPiAobWF4X2xlbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlwcl9lcnIoIiVzOiBwYXJhbXMgbGVuZ3RoIG92ZXJmbG93c1xuIiwgKHRhZykpOyAgICAgICAgIFwKLQkJKHJjKSA9IC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLQotYm9vbCBtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoaW50IGVmZmVjdF9tb2R1bGUsCi0JCQkJCQlpbnQgdG9wb2xvZ3kpCi17Ci0Jc3dpdGNoIChlZmZlY3RfbW9kdWxlKSB7Ci0JY2FzZSBWSVJUVUFMSVpFUl9NT0RVTEU6Ci0JY2FzZSBSRVZFUkJfTU9EVUxFOgotCWNhc2UgQkFTU19CT09TVF9NT0RVTEU6Ci0JY2FzZSBQQkVfTU9EVUxFOgotCWNhc2UgRVFfTU9EVUxFOgotCQlzd2l0Y2ggKHRvcG9sb2d5KSB7Ci0JCWNhc2UgQVNNX1NUUkVBTV9QT1NUUFJPQ19UT1BPX0lEX1NBX1BMVVM6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLWludCBtc21fYXVkaW9fZWZmZWN0c19lbmFibGVfZXh0bihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlzdHJ1Y3QgbXNtX250X2VmZl9hbGxfY29uZmlnICplZmZlY3RzLAotCQkJCWJvb2wgZmxhZykKLXsKLQl1aW50MzJfdCB1cGR0X3BhcmFtc1tNQVhfRU5BQkxFX0NNRF9TSVpFXSA9IHswfTsKLQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcGFyYW1zX2xlbmd0aCA9IDA7Ci0JdXBkdF9wYXJhbXNbMF0gPSBBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUjsKLQl1cGR0X3BhcmFtc1sxXSA9IEFVRFBST0NfUEFSQU1fSURfRU5BQkxFOwotCXVwZHRfcGFyYW1zWzJdID0gVklSVFVBTElaRVJfRU5BQkxFX1BBUkFNX1NaOwotCXVwZHRfcGFyYW1zWzNdID0gZmxhZzsKLQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArIFZJUlRVQUxJWkVSX0VOQUJMRV9QQVJBTV9TWjsKLQlpZiAoZWZmZWN0cy0+dmlydHVhbGl6ZXIuZW5hYmxlX2ZsYWcpCi0JCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIChjaGFyICopJnVwZHRfcGFyYW1zWzBdLAotCQkJCQlwYXJhbXNfbGVuZ3RoKTsKLQltZW1zZXQodXBkdF9wYXJhbXMsIDAsIE1BWF9FTkFCTEVfQ01EX1NJWkUpOwotCXBhcmFtc19sZW5ndGggPSAwOwotCXVwZHRfcGFyYW1zWzBdID0gQVVEUFJPQ19NT0RVTEVfSURfQkFTU19CT09TVDsKLQl1cGR0X3BhcmFtc1sxXSA9IEFVRFBST0NfUEFSQU1fSURfRU5BQkxFOwotCXVwZHRfcGFyYW1zWzJdID0gQkFTU19CT09TVF9FTkFCTEVfUEFSQU1fU1o7Ci0JdXBkdF9wYXJhbXNbM10gPSBmbGFnOwotCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsgQkFTU19CT09TVF9FTkFCTEVfUEFSQU1fU1o7Ci0JaWYgKGVmZmVjdHMtPmJhc3NfYm9vc3QuZW5hYmxlX2ZsYWcpCi0JCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIChjaGFyICopJnVwZHRfcGFyYW1zWzBdLAotCQkJCQlwYXJhbXNfbGVuZ3RoKTsKLQltZW1zZXQodXBkdF9wYXJhbXMsIDAsIE1BWF9FTkFCTEVfQ01EX1NJWkUpOwotCXBhcmFtc19sZW5ndGggPSAwOwotCXVwZHRfcGFyYW1zWzBdID0gQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVI7Ci0JdXBkdF9wYXJhbXNbMV0gPSBBVURQUk9DX1BBUkFNX0lEX0VOQUJMRTsKLQl1cGR0X3BhcmFtc1syXSA9IEVRX0VOQUJMRV9QQVJBTV9TWjsKLQl1cGR0X3BhcmFtc1szXSA9IGZsYWc7Ci0JcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKyBFUV9FTkFCTEVfUEFSQU1fU1o7Ci0JaWYgKGVmZmVjdHMtPmVxdWFsaXplci5lbmFibGVfZmxhZykKLQkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgKGNoYXIgKikmdXBkdF9wYXJhbXNbMF0sCi0JCQkJCXBhcmFtc19sZW5ndGgpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZpcnR1YWxpemVyX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IHZpcnR1YWxpemVyX3BhcmFtcyAqdmlydHVhbGl6ZXIsCi0JCQkJbG9uZyAqdmFsdWVzKQotewotCWxvbmcgKnBhcmFtX21heF9vZmZzZXQgPSB2YWx1ZXMgKyBNQVhfUFBfUEFSQU1TX1NaIC0gMTsKLQljaGFyICpwYXJhbXMgPSBOVUxMOwotCWludCByYyA9IDA7Ci0JaW50IGRldmljZXMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQlpbnQgbnVtX2NvbW1hbmRzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JaW50ICp1cGR0X3BhcmFtcywgaSwgcHJldl9lbmFibGVfZmxhZzsKLQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKE1BWF9JTkJBTkRfUEFSQU1fU1opOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFhYyB8fCAoZGV2aWNlcyA9PSAtRUlOVkFMKSB8fCAobnVtX2NvbW1hbmRzID09IC1FSU5WQUwpKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcGFyYW1zID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldmljZTogJWRcbiIsIF9fZnVuY19fLCBkZXZpY2VzKTsKLQl1cGR0X3BhcmFtcyA9IChpbnQgKilwYXJhbXM7Ci0JcGFyYW1zX2xlbmd0aCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9jb21tYW5kczsgaSsrKSB7Ci0JCXVpbnQzMl90IGNvbW1hbmRfaWQgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGNvbW1hbmRfY29uZmlnX3N0YXRlID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBpbmRleF9vZmZzZXQgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGxlbmd0aCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJc3dpdGNoIChjb21tYW5kX2lkKSB7Ci0JCWNhc2UgVklSVFVBTElaRVJfRU5BQkxFOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJWSVJUIEVOQUJMRTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlwcmV2X2VuYWJsZV9mbGFnID0gdmlydHVhbGl6ZXItPmVuYWJsZV9mbGFnOwotCQkJdmlydHVhbGl6ZXItPmVuYWJsZV9mbGFnID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczpWSVJUIEVOQUJMRSBwcmV2OiVkLCBuZXc6JWRcbiIsIF9fZnVuY19fLAotCQkJCXByZXZfZW5hYmxlX2ZsYWcsIHZpcnR1YWxpemVyLT5lbmFibGVfZmxhZyk7Ci0JCQlpZiAocHJldl9lbmFibGVfZmxhZyAhPSB2aXJ0dWFsaXplci0+ZW5hYmxlX2ZsYWcpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVZJUlRVQUxJWkVSX0VOQUJMRV9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiVklSVCBFTkFCTEUiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCUFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQlBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX0VOQUJMRTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJVklSVFVBTElaRVJfRU5BQkxFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQl2aXJ0dWFsaXplci0+ZW5hYmxlX2ZsYWc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWSVJUVUFMSVpFUl9TVFJFTkdUSDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiVklSVCBTVFJFTkdUSDppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQl2aXJ0dWFsaXplci0+c3RyZW5ndGggPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBWSVJUIFNUUkVOR1RIIHZhbDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCB2aXJ0dWFsaXplci0+c3RyZW5ndGgpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVZJUlRVQUxJWkVSX1NUUkVOR1RIX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJWSVJUIFNUUkVOR1RIIiwgcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19NT0RVTEVfSURfVklSVFVBTElaRVI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1ZJUlRVQUxJWkVSX1NUUkVOR1RIOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJVklSVFVBTElaRVJfU1RSRU5HVEhfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQl2aXJ0dWFsaXplci0+c3RyZW5ndGg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWSVJUVUFMSVpFUl9PVVRfVFlQRToKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiVklSVCBPVVRfVFlQRTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQl2aXJ0dWFsaXplci0+b3V0X3R5cGUgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBWSVJUIE9VVF9UWVBFIHZhbDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgdmlydHVhbGl6ZXItPm91dF90eXBlKTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlWSVJUVUFMSVpFUl9PVVRfVFlQRV9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiVklSVCBPVVRfVFlQRSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1ZJUlRVQUxJWkVSOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9PVVRfVFlQRTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCVZJUlRVQUxJWkVSX09VVF9UWVBFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJdmlydHVhbGl6ZXItPm91dF90eXBlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgVklSVFVBTElaRVJfR0FJTl9BREpVU1Q6Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIlZJUlQgR0FJTl9BREpVU1Q6IGludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCXZpcnR1YWxpemVyLT5nYWluX2FkanVzdCA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IFZJUlQgR0FJTl9BREpVU1QgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCB2aXJ0dWFsaXplci0+Z2Fpbl9hZGp1c3QpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVZJUlRVQUxJWkVSX0dBSU5fQURKVVNUX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJWSVJUIEdBSU5fQURKVVNUIiwgcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQlBVURQUk9DX01PRFVMRV9JRF9WSVJUVUFMSVpFUjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJQVVEUFJPQ19QQVJBTV9JRF9WSVJUVUFMSVpFUl9HQUlOX0FESlVTVDsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJVklSVFVBTElaRVJfR0FJTl9BREpVU1RfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCXZpcnR1YWxpemVyLT5nYWluX2FkanVzdDsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kIHRvIHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChwYXJhbXNfbGVuZ3RoICYmIChyYyA9PSAwKSkKLQkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgcGFyYW1zLAotCQkJCQkJcGFyYW1zX2xlbmd0aCk7Ci0JZWxzZQotCQlwcl9kZWJ1ZygiJXM6IGRpZCBub3Qgc2VuZCBwcCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLWludmFsaWRfY29uZmlnOgotCWtmcmVlKHBhcmFtcyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2F1ZGlvX2VmZmVjdHNfcmV2ZXJiX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJICAgICBzdHJ1Y3QgcmV2ZXJiX3BhcmFtcyAqcmV2ZXJiLAotCQkJCSAgICAgbG9uZyAqdmFsdWVzKQotewotCWxvbmcgKnBhcmFtX21heF9vZmZzZXQgPSB2YWx1ZXMgKyBNQVhfUFBfUEFSQU1TX1NaIC0gMTsKLQljaGFyICpwYXJhbXMgPSBOVUxMOwotCWludCByYyA9IDA7Ci0JaW50IGRldmljZXMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQlpbnQgbnVtX2NvbW1hbmRzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JaW50ICp1cGR0X3BhcmFtcywgaSwgcHJldl9lbmFibGVfZmxhZzsKLQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gKE1BWF9JTkJBTkRfUEFSQU1fU1opOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFhYyB8fCAoZGV2aWNlcyA9PSAtRUlOVkFMKSB8fCAobnVtX2NvbW1hbmRzID09IC1FSU5WQUwpKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcGFyYW1zID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldmljZTogJWRcbiIsIF9fZnVuY19fLCBkZXZpY2VzKTsKLQl1cGR0X3BhcmFtcyA9IChpbnQgKilwYXJhbXM7Ci0JcGFyYW1zX2xlbmd0aCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9jb21tYW5kczsgaSsrKSB7Ci0JCXVpbnQzMl90IGNvbW1hbmRfaWQgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGNvbW1hbmRfY29uZmlnX3N0YXRlID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBpbmRleF9vZmZzZXQgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGxlbmd0aCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJc3dpdGNoIChjb21tYW5kX2lkKSB7Ci0JCWNhc2UgUkVWRVJCX0VOQUJMRToKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0VOQUJMRTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlwcmV2X2VuYWJsZV9mbGFnID0gcmV2ZXJiLT5lbmFibGVfZmxhZzsKLQkJCXJldmVyYi0+ZW5hYmxlX2ZsYWcgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOlJFVkVSQl9FTkFCTEUgcHJldjolZCxuZXc6JWRcbiIsIF9fZnVuY19fLAotCQkJCQlwcmV2X2VuYWJsZV9mbGFnLCByZXZlcmItPmVuYWJsZV9mbGFnKTsKLQkJCWlmIChwcmV2X2VuYWJsZV9mbGFnICE9IHJldmVyYi0+ZW5hYmxlX2ZsYWcpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9FTkFCTEVfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9FTkFCTEUiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9FTkFCTEU7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfRU5BQkxFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5lbmFibGVfZmxhZzsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9NT0RFOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJSRVZFUkJfTU9ERTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlyZXZlcmItPm1vZGUgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfTU9ERSB2YWw6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldmVyYi0+bW9kZSk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJUkVWRVJCX01PREVfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9NT0RFIiwgcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfTU9ERTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCVJFVkVSQl9NT0RFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5tb2RlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUkVWRVJCX1BSRVNFVDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX1BSRVNFVDppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlyZXZlcmItPnByZXNldCA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9QUkVTRVQgdmFsOiVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5wcmVzZXQpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9QUkVTRVRfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9QUkVTRVQiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9QUkVTRVQ7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfUFJFU0VUX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5wcmVzZXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSRVZFUkJfV0VUX01JWDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX1dFVF9NSVg6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT53ZXRfbWl4ID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogUkVWRVJCX1dFVF9NSVggdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPndldF9taXgpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9XRVRfTUlYX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfV0VUX01JWCIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1dFVF9NSVg7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfV0VUX01JWF9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+d2V0X21peDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9HQUlOX0FESlVTVDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0dBSU5fQURKVVNUOmludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCXJldmVyYi0+Z2Fpbl9hZGp1c3QgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfR0FJTl9BREpVU1QgdmFsOiVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5nYWluX2FkanVzdCk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJUkVWRVJCX0dBSU5fQURKVVNUX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfR0FJTl9BREpVU1QiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9HQUlOX0FESlVTVDsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCVJFVkVSQl9HQUlOX0FESlVTVF9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+Z2Fpbl9hZGp1c3Q7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSRVZFUkJfUk9PTV9MRVZFTDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX1JPT01fTEVWRUw6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT5yb29tX2xldmVsID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogUkVWRVJCX1JPT01fTEVWRUwgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPnJvb21fbGV2ZWwpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9ST09NX0xFVkVMX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfUk9PTV9MRVZFTCIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX1JPT01fTEVWRUw7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfUk9PTV9MRVZFTF9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+cm9vbV9sZXZlbDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9ST09NX0hGX0xFVkVMOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJSRVZFUkJfUk9PTV9IRl9MRVZFTDppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlyZXZlcmItPnJvb21faGZfbGV2ZWwgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfUk9PTV9IRl9MRVZFTCB2YWwlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5yb29tX2hmX2xldmVsKTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlSRVZFUkJfUk9PTV9IRl9MRVZFTF9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiUkVWRVJCX1JPT01fSEZfTEVWRUwiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ST09NX0hGX0xFVkVMOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJUkVWRVJCX1JPT01fSEZfTEVWRUxfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlyZXZlcmItPnJvb21faGZfbGV2ZWw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSRVZFUkJfREVDQVlfVElNRToKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0RFQ0FZX1RJTUU6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT5kZWNheV90aW1lID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogUkVWRVJCX0RFQ0FZX1RJTUUgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPmRlY2F5X3RpbWUpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9ERUNBWV9USU1FX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfREVDQVlfVElNRSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFQ0FZX1RJTUU7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfREVDQVlfVElNRV9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+ZGVjYXlfdGltZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9ERUNBWV9IRl9SQVRJTzoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0RFQ0FZX0hGX1JBVElPaW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT5kZWNheV9oZl9yYXRpbyA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IFJFVkVSQl9ERUNBWV9IRl9SQVRJTyB2YWwlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5kZWNheV9oZl9yYXRpbyk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJUkVWRVJCX0RFQ0FZX0hGX1JBVElPX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfREVDQVlfSEZfUkFUSU8iLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ERUNBWV9IRl9SQVRJTzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCVJFVkVSQl9ERUNBWV9IRl9SQVRJT19QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+ZGVjYXlfaGZfcmF0aW87Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSRVZFUkJfUkVGTEVDVElPTlNfTEVWRUw6Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIlJFVkVSQl9SRUZMRUNUSU9OX0xWTGludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCXJldmVyYi0+cmVmbGVjdGlvbnNfbGV2ZWwgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfUkVGTEVDVElPTlNfTEVWRUwgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPnJlZmxlY3Rpb25zX2xldmVsKTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlSRVZFUkJfUkVGTEVDVElPTlNfTEVWRUxfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9SRUZMRUNUSU9OU19MRVZFTCIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJQVVEUFJPQ19NT0RVTEVfSURfUkVWRVJCOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9SRUZMRUNUSU9OU19MRVZFTDsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJUkVWRVJCX1JFRkxFQ1RJT05TX0xFVkVMX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQlyZXZlcmItPnJlZmxlY3Rpb25zX2xldmVsOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJSRVZFUkJfUkVGTEVDVElPTl9ETFlpbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlyZXZlcmItPnJlZmxlY3Rpb25zX2RlbGF5ID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZIHZhbDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5yZWZsZWN0aW9uc19kZWxheSk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJUkVWRVJCX1JFRkxFQ1RJT05TX0RFTEFZX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfUkVGTEVDVElPTlNfREVMQVkiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJQVVEUFJPQ19QQVJBTV9JRF9SRVZFUkJfUkVGTEVDVElPTlNfREVMQVk7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCVJFVkVSQl9SRUZMRUNUSU9OU19ERUxBWV9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJcmV2ZXJiLT5yZWZsZWN0aW9uc19kZWxheTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9MRVZFTDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0xFVkVMOmludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCXJldmVyYi0+bGV2ZWwgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfTEVWRUwgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPmxldmVsKTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlSRVZFUkJfTEVWRUxfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9MRVZFTCIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0xFVkVMOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJUkVWRVJCX0xFVkVMX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5sZXZlbDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9ERUxBWToKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0RFTEFZOmludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCXJldmVyYi0+ZGVsYXkgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOlJFVkVSQl9ERUxBWSB2YWw6JWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXZlcmItPmRlbGF5KTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlSRVZFUkJfREVMQVlfUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9ERUxBWSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFTEFZOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJUkVWRVJCX0RFTEFZX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5kZWxheTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJFVkVSQl9ESUZGVVNJT046Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIlJFVkVSQl9ESUZGVVNJT046aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT5kaWZmdXNpb24gPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBSRVZFUkJfRElGRlVTSU9OIHZhbDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV2ZXJiLT5kaWZmdXNpb24pOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9ESUZGVVNJT05fUEFSQU1fU1o7Ci0JCQkJQ0hFQ0tfUEFSQU1fTEVOKHBhcmFtc19sZW5ndGgsCi0JCQkJCQlNQVhfSU5CQU5EX1BBUkFNX1NaLAotCQkJCQkJIlJFVkVSQl9ESUZGVVNJT04iLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9SRVZFUkI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1JFVkVSQl9ESUZGVVNJT047Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfRElGRlVTSU9OX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJcmV2ZXJiLT5kaWZmdXNpb247Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBSRVZFUkJfREVOU0lUWToKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiUkVWRVJCX0RFTlNJVFk6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcmV2ZXJiLT5kZW5zaXR5ID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogUkVWRVJCX0RFTlNJVFkgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXZlcmItPmRlbnNpdHkpOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVJFVkVSQl9ERU5TSVRZX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJSRVZFUkJfREVOU0lUWSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1JFVkVSQjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUkVWRVJCX0RFTlNJVFk7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlSRVZFUkJfREVOU0lUWV9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXJldmVyYi0+ZGVuc2l0eTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb21tYW5kIHRvIHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChwYXJhbXNfbGVuZ3RoICYmIChyYyA9PSAwKSkKLQkJcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhhYywgcGFyYW1zLAotCQkJCQkJcGFyYW1zX2xlbmd0aCk7Ci0JZWxzZQotCQlwcl9kZWJ1ZygiJXM6IGRpZCBub3Qgc2VuZCBwcCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLWludmFsaWRfY29uZmlnOgotCWtmcmVlKHBhcmFtcyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2F1ZGlvX2VmZmVjdHNfYmFzc19ib29zdF9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQlzdHJ1Y3QgYmFzc19ib29zdF9wYXJhbXMgKmJhc3NfYm9vc3QsCi0JCQkJCWxvbmcgKnZhbHVlcykKLXsKLQlsb25nICpwYXJhbV9tYXhfb2Zmc2V0ID0gdmFsdWVzICsgTUFYX1BQX1BBUkFNU19TWiAtIDE7Ci0JY2hhciAqcGFyYW1zID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBkZXZpY2VzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JaW50IG51bV9jb21tYW5kcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCWludCAqdXBkdF9wYXJhbXMsIGksIHByZXZfZW5hYmxlX2ZsYWc7Ci0JdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IChNQVhfSU5CQU5EX1BBUkFNX1NaKTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmICghYWMgfHwgKGRldmljZXMgPT0gLUVJTlZBTCkgfHwgKG51bV9jb21tYW5kcyA9PSAtRUlOVkFMKSkgewotCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJfZGVidWcoIiVzOiBkZXZpY2U6ICVkXG4iLCBfX2Z1bmNfXywgZGV2aWNlcyk7Ci0JdXBkdF9wYXJhbXMgPSAoaW50ICopcGFyYW1zOwotCXBhcmFtc19sZW5ndGggPSAwOwotCWZvciAoaSA9IDA7IGkgPCBudW1fY29tbWFuZHM7IGkrKykgewotCQl1aW50MzJfdCBjb21tYW5kX2lkID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBjb21tYW5kX2NvbmZpZ19zdGF0ZSA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgaW5kZXhfb2Zmc2V0ID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBsZW5ndGggPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXN3aXRjaCAoY29tbWFuZF9pZCkgewotCQljYXNlIEJBU1NfQk9PU1RfRU5BQkxFOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJCQVNTX0JPT1NUX0VOQUJMRTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlwcmV2X2VuYWJsZV9mbGFnID0gYmFzc19ib29zdC0+ZW5hYmxlX2ZsYWc7Ci0JCQliYXNzX2Jvb3N0LT5lbmFibGVfZmxhZyA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IEJBU1NfQk9PU1RfRU5BQkxFIHByZXY6JWQgbmV3OiVkXG4iLAotCQkJCV9fZnVuY19fLCBwcmV2X2VuYWJsZV9mbGFnLAotCQkJCWJhc3NfYm9vc3QtPmVuYWJsZV9mbGFnKTsKLQkJCWlmIChwcmV2X2VuYWJsZV9mbGFnICE9IGJhc3NfYm9vc3QtPmVuYWJsZV9mbGFnKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlCQVNTX0JPT1NUX0VOQUJMRV9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiQkFTU19CT09TVF9FTkFCTEUiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NUOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX0VOQUJMRTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUJBU1NfQk9PU1RfRU5BQkxFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJYmFzc19ib29zdC0+ZW5hYmxlX2ZsYWc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBCQVNTX0JPT1NUX01PREU6Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIkJBU1NfQk9PU1RfTU9ERTppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQliYXNzX2Jvb3N0LT5tb2RlID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXByX2RlYnVnKCIlczogQkFTU19CT09TVF9NT0RFIHZhbDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgYmFzc19ib29zdC0+bW9kZSk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJQkFTU19CT09TVF9NT0RFX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJCQVNTX0JPT1NUX01PREUiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9CQVNTX0JPT1NUOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19QQVJBTV9JRF9CQVNTX0JPT1NUX01PREU7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlCQVNTX0JPT1NUX01PREVfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQliYXNzX2Jvb3N0LT5tb2RlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQkFTU19CT09TVF9TVFJFTkdUSDoKLQkJCWlmIChsZW5ndGggIT0gMSB8fCBpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2VycigiQkFTU19CT09TVF9TVFJFTkdUSDppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQliYXNzX2Jvb3N0LT5zdHJlbmd0aCA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IEJBU1NfQk9PU1RfU1RSRU5HVEggdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCBiYXNzX2Jvb3N0LT5zdHJlbmd0aCk7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJQkFTU19CT09TVF9TVFJFTkdUSF9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiQkFTU19CT09TVF9TVFJFTkdUSCIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX0JBU1NfQk9PU1Q7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX0JBU1NfQk9PU1RfU1RSRU5HVEg7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlCQVNTX0JPT1NUX1NUUkVOR1RIX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJYmFzc19ib29zdC0+c3RyZW5ndGg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEludmFsaWQgY29tbWFuZCB0byBzZXQgY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocGFyYW1zX2xlbmd0aCAmJiAocmMgPT0gMCkpCi0JCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIHBhcmFtcywKLQkJCQkJCXBhcmFtc19sZW5ndGgpOwotCWVsc2UKLQkJcHJfZGVidWcoIiVzOiBkaWQgbm90IHNlbmQgcHAgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci1pbnZhbGlkX2NvbmZpZzoKLQlrZnJlZShwYXJhbXMpOwotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3BiZV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQlzdHJ1Y3QgcGJlX3BhcmFtcyAqcGJlLAotCQkJCQlsb25nICp2YWx1ZXMpCi17Ci0JbG9uZyAqcGFyYW1fbWF4X29mZnNldCA9IHZhbHVlcyArIE1BWF9QUF9QQVJBTVNfU1ogLSAxOwotCWNoYXIgKnBhcmFtcyA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQlpbnQgZGV2aWNlcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCWludCBudW1fY29tbWFuZHMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQlpbnQgKnVwZHRfcGFyYW1zLCBpLCBqLCBwcmV2X2VuYWJsZV9mbGFnOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoTUFYX0lOQkFORF9QQVJBTV9TWik7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIWFjIHx8IChkZXZpY2VzID09IC1FSU5WQUwpIHx8IChudW1fY29tbWFuZHMgPT0gLUVJTlZBTCkpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBhdWRpbyBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwYXJhbXMgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghcGFyYW1zKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByX2RlYnVnKCIlczogZGV2aWNlOiAlZFxuIiwgX19mdW5jX18sIGRldmljZXMpOwotCXVwZHRfcGFyYW1zID0gKGludCAqKXBhcmFtczsKLQlwYXJhbXNfbGVuZ3RoID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyspIHsKLQkJdWludDMyX3QgY29tbWFuZF9pZCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgY29tbWFuZF9jb25maWdfc3RhdGUgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGluZGV4X29mZnNldCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgbGVuZ3RoID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQlzd2l0Y2ggKGNvbW1hbmRfaWQpIHsKLQkJY2FzZSBQQkVfRU5BQkxFOgotCQkJcHJfZGVidWcoIiVzOiBQQkVfRU5BQkxFXG4iLCBfX2Z1bmNfXyk7Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIm5vIHZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlwcmV2X2VuYWJsZV9mbGFnID0gcGJlLT5lbmFibGVfZmxhZzsKLQkJCXBiZS0+ZW5hYmxlX2ZsYWcgPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJaWYgKHByZXZfZW5hYmxlX2ZsYWcgIT0gcGJlLT5lbmFibGVfZmxhZykgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJUEJFX0VOQUJMRV9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiUEJFX0VOQUJMRSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1BCRTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfUEJFX0VOQUJMRTsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCVBCRV9FTkFCTEVfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlwYmUtPmVuYWJsZV9mbGFnOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJFX0NPTkZJRzoKLQkJCXByX2RlYnVnKCIlczogUEJFX1BBUkFNIGxlbmd0aCAldVxuIiwgX19mdW5jX18sIGxlbmd0aCk7Ci0JCQlpZiAobGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBwYmVfY29uZmlnX3QpIHx8Ci0JCQkJbGVuZ3RoIDwgUEJFX0NPTkZJR19QQVJBTV9MRU4gfHwKLQkJCQlpbmRleF9vZmZzZXQgIT0gMCkgewotCQkJCXByX2Vycigibm8gdmFsaWQgcGFyYW1zLCBsZW4gJWRcbiIsIGxlbmd0aCk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsgbGVuZ3RoOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJQQkVfUEFSQU0iLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9QQkU7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX1BCRV9QQVJBTV9DT05GSUc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlsZW5ndGg7Ci0JCQkJZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgKSB7Ci0JCQkJCWogKz0gc2l6ZW9mKCp1cGR0X3BhcmFtcyk7Ci0JCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJCUdFVF9ORVhUKAotCQkJCQkJdmFsdWVzLAotCQkJCQkJcGFyYW1fbWF4X29mZnNldCwKLQkJCQkJCXJjKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEludmFsaWQgY29tbWFuZCB0byBzZXQgY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocGFyYW1zX2xlbmd0aCAmJiAocmMgPT0gMCkpCi0JCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIHBhcmFtcywKLQkJCQkJCXBhcmFtc19sZW5ndGgpOwotaW52YWxpZF9jb25maWc6Ci0Ja2ZyZWUocGFyYW1zKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBtc21fYXVkaW9fZWZmZWN0c19wb3BsZXNzX2VxX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSBzdHJ1Y3QgZXFfcGFyYW1zICplcSwKLQkJCQkJIGxvbmcgKnZhbHVlcykKLXsKLQlsb25nICpwYXJhbV9tYXhfb2Zmc2V0ID0gdmFsdWVzICsgTUFYX1BQX1BBUkFNU19TWiAtIDE7Ci0JY2hhciAqcGFyYW1zID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBkZXZpY2VzID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JaW50IG51bV9jb21tYW5kcyA9IEdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCWludCAqdXBkdF9wYXJhbXMsIGksIHByZXZfZW5hYmxlX2ZsYWc7Ci0JdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IChNQVhfSU5CQU5EX1BBUkFNX1NaKTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmICghYWMgfHwgKGRldmljZXMgPT0gLUVJTlZBTCkgfHwgKG51bV9jb21tYW5kcyA9PSAtRUlOVkFMKSkgewotCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBhcmFtcyA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJfZGVidWcoIiVzOiBkZXZpY2U6ICVkXG4iLCBfX2Z1bmNfXywgZGV2aWNlcyk7Ci0JdXBkdF9wYXJhbXMgPSAoaW50ICopcGFyYW1zOwotCXBhcmFtc19sZW5ndGggPSAwOwotCWZvciAoaSA9IDA7IGkgPCBudW1fY29tbWFuZHM7IGkrKykgewotCQl1aW50MzJfdCBjb21tYW5kX2lkID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBjb21tYW5kX2NvbmZpZ19zdGF0ZSA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgaW5kZXhfb2Zmc2V0ID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQl1aW50MzJfdCBsZW5ndGggPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGlkeDsKLQkJaW50IGo7Ci0KLQkJc3dpdGNoIChjb21tYW5kX2lkKSB7Ci0JCWNhc2UgRVFfRU5BQkxFOgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJFUV9FTkFCTEU6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJcHJldl9lbmFibGVfZmxhZyA9IGVxLT5lbmFibGVfZmxhZzsKLQkJCWVxLT5lbmFibGVfZmxhZyA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IEVRX0VOQUJMRSBwcmV2OiVkIG5ldzolZFxuIiwgX19mdW5jX18sCi0JCQkJcHJldl9lbmFibGVfZmxhZywgZXEtPmVuYWJsZV9mbGFnKTsKLQkJCWlmIChwcmV2X2VuYWJsZV9mbGFnICE9IGVxLT5lbmFibGVfZmxhZykgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJRVFfRU5BQkxFX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJFUV9FTkFCTEUiLCByYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX01PRFVMRV9JRF9QT1BMRVNTX0VRVUFMSVpFUjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfUEFSQU1fSURfRVFfRU5BQkxFOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJRVFfRU5BQkxFX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJZXEtPmVuYWJsZV9mbGFnOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRVFfQ09ORklHOgotCQkJaWYgKGxlbmd0aCA8IEVRX0NPTkZJR19QQVJBTV9MRU4gfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIkVRX0NPTkZJRzppbnZhbGlkIHBhcmFtc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlwcl9kZWJ1ZygiJXM6IEVRX0NPTkZJRyBiYW5kczolZCwgcGdhaW46JWQsIHBzZXQ6JWRcbiIsCi0JCQkJIF9fZnVuY19fLCBlcS0+Y29uZmlnLm51bV9iYW5kcywKLQkJCQllcS0+Y29uZmlnLmVxX3ByZWdhaW4sIGVxLT5jb25maWcucHJlc2V0X2lkKTsKLQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0VRX0JBTkRTOyBpZHgrKykKLQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uYmFuZF9pZHggPSAtMTsKLQkJCWVxLT5jb25maWcuZXFfcHJlZ2FpbiA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQllcS0+Y29uZmlnLnByZXNldF9pZCA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQllcS0+Y29uZmlnLm51bV9iYW5kcyA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlpZiAoZXEtPmNvbmZpZy5udW1fYmFuZHMgPiBNQVhfRVFfQkFORFMpIHsKLQkJCQlwcl9lcnIoIkVRX0NPTkZJRzppbnZhbGlkIG51bSBvZiBiYW5kc1xuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQlpZiAoZXEtPmNvbmZpZy5udW1fYmFuZHMgJiYKLQkJCSAgICAoKChsZW5ndGggLSBFUV9DT05GSUdfUEFSQU1fTEVOKS8KLQkJCQlFUV9DT05GSUdfUEVSX0JBTkRfUEFSQU1fTEVOKQotCQkJCSE9IGVxLT5jb25maWcubnVtX2JhbmRzKSkgewotCQkJCXByX2VycigiRVFfQ09ORklHOmludmFsaWQgbGVuZ3RoIHBlciBiYW5kXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCWZvciAoaiA9IDA7IGogPCBlcS0+Y29uZmlnLm51bV9iYW5kczsgaisrKSB7Ci0JCQkJaWR4ID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQkJaWYgKGlkeCA+PSBNQVhfRVFfQkFORFMpIHsKLQkJCQkJcHJfZXJyKCJFUV9DT05GSUc6aW52YWxpZCBiYW5kIGluZGV4XG4iKTsKLQkJCQkJcmMgPSAtRUlOVkFMOwotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCX0KLQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uYmFuZF9pZHggPSBpZHg7Ci0JCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmZpbHRlcl90eXBlID0KLQkJCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmZyZXFfbWlsbGloZXJ0eiA9Ci0JCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5nYWluX21pbGxpYmVscyA9Ci0JCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5xdWFsaXR5X2ZhY3RvciA9Ci0JCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJfQotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlpbnQgY29uZmlnX3BhcmFtX2xlbmd0aCA9IEVRX0NPTkZJR19QQVJBTV9TWiArCi0JCQkJCShFUV9DT05GSUdfUEVSX0JBTkRfUEFSQU1fU1oqCi0JCQkJCSBlcS0+Y29uZmlnLm51bV9iYW5kcyk7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQkJY29uZmlnX3BhcmFtX2xlbmd0aDsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiRVFfQ09ORklHIiwgcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX0VRX0NPTkZJRzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCWNvbmZpZ19wYXJhbV9sZW5ndGg7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQllcS0+Y29uZmlnLmVxX3ByZWdhaW47Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQllcS0+Y29uZmlnLnByZXNldF9pZDsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCWVxLT5jb25maWcubnVtX2JhbmRzOwotCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0VRX0JBTkRTOyBpZHgrKykgewotCQkJCQlpZiAoZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmJhbmRfaWR4IDwgMCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5maWx0ZXJfdHlwZTsKLQkJCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0uZnJlcV9taWxsaWhlcnR6OwotCQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCWVxLT5wZXJfYmFuZF9jZmdbaWR4XS5nYWluX21pbGxpYmVsczsKLQkJCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQllcS0+cGVyX2JhbmRfY2ZnW2lkeF0ucXVhbGl0eV9mYWN0b3I7Ci0JCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJZXEtPnBlcl9iYW5kX2NmZ1tpZHhdLmJhbmRfaWR4OwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEVRX0JBTkRfSU5ERVg6Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIkVRX0JBTkRfSU5ERVg6aW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJaWR4ID0gR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQlpZiAoaWR4ID4gTUFYX0VRX0JBTkRTKSB7Ci0JCQkJcHJfZXJyKCJFUV9CQU5EX0lOREVYOmludmFsaWQgYmFuZCBpbmRleFxuIik7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQl9Ci0JCQllcS0+YmFuZF9pbmRleCA9IGlkeDsKLQkJCXByX2RlYnVnKCIlczogRVFfQkFORF9JTkRFWCB2YWw6JWRcbiIsCi0JCQkJX19mdW5jX18sIGVxLT5iYW5kX2luZGV4KTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlFUV9CQU5EX0lOREVYX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJFUV9CQU5EX0lOREVYIiwgcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19NT0RVTEVfSURfUE9QTEVTU19FUVVBTElaRVI7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBVURQUk9DX1BBUkFNX0lEX0VRX0JBTkRfSU5ERVg7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlFUV9CQU5EX0lOREVYX1BBUkFNX1NaOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJZXEtPmJhbmRfaW5kZXg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFUV9TSU5HTEVfQkFORF9GUkVROgotCQkJaWYgKGxlbmd0aCAhPSAxIHx8IGluZGV4X29mZnNldCAhPSAwKSB7Ci0JCQkJcHJfZXJyKCJFUV9TSU5HTEVfQkFORF9GUkVROmludmFsaWQgcGFyYW1zXG4iKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCX0KLQkJCWlmIChlcS0+YmFuZF9pbmRleCA+IE1BWF9FUV9CQU5EUykgewotCQkJCXByX2VycigiRVFfU0lOR0xFX0JBTkRfRlJFUTppbnZhbGlkIGluZGV4XG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVxLT5mcmVxX21pbGxpaGVydHogPQotCQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQkJcHJfZGVidWcoIiVzOiBFUV9TSU5HTEVfQkFORF9GUkVRIGlkeDolZCwgdmFsOiVkXG4iLAotCQkJCV9fZnVuY19fLCBlcS0+YmFuZF9pbmRleCwgZXEtPmZyZXFfbWlsbGloZXJ0eik7Ci0JCQlpZiAoY29tbWFuZF9jb25maWdfc3RhdGUgPT0gQ09ORklHX1NFVCkgewotCQkJCXBhcmFtc19sZW5ndGggKz0gQ09NTUFORF9QQVlMT0FEX1NaICsKLQkJCQkJRVFfU0lOR0xFX0JBTkRfRlJFUV9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiRVFfU0lOR0xFX0JBTkRfRlJFUSIsIHJjKTsKLQkJCQlpZiAocmMgIT0gMCkKLQkJCQkJZ290byBpbnZhbGlkX2NvbmZpZzsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFVRFBST0NfTU9EVUxFX0lEX1BPUExFU1NfRVFVQUxJWkVSOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVVEUFJPQ19QQVJBTV9JRF9FUV9TSU5HTEVfQkFORF9GUkVROwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJRVFfU0lOR0xFX0JBTkRfRlJFUV9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCWVxLT5mcmVxX21pbGxpaGVydHo7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IEludmFsaWQgY29tbWFuZCB0byBzZXQgY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAocGFyYW1zX2xlbmd0aCAmJiAocmMgPT0gMCkpCi0JCXE2YXNtX3NlbmRfYXVkaW9fZWZmZWN0c19wYXJhbXMoYWMsIHBhcmFtcywKLQkJCQkJCXBhcmFtc19sZW5ndGgpOwotCWVsc2UKLQkJcHJfZGVidWcoIiVzOiBkaWQgbm90IHNlbmQgcHAgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci1pbnZhbGlkX2NvbmZpZzoKLQlrZnJlZShwYXJhbXMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX21zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkgICAgICBzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zICp2b2wsCi0JCQkJCSAgICAgIGxvbmcgKnZhbHVlcywKLQkJCQkJICAgICAgaW50IGluc3RhbmNlKQotewotCWludCBkZXZpY2VzOwotCWludCBudW1fY29tbWFuZHM7Ci0JY2hhciAqcGFyYW1zID0gTlVMTDsKLQlpbnQgKnVwZHRfcGFyYW1zLCBpOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoTUFYX0lOQkFORF9QQVJBTV9TWik7Ci0JbG9uZyAqcGFyYW1fbWF4X29mZnNldDsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBpbnN0YW5jZTogJWRcbiIsIF9fZnVuY19fLCBpbnN0YW5jZSk7Ci0JaWYgKCF2YWx1ZXMpIHsKLQkJcHJfZXJyKCIlczogc2V0IGF1ZGlvIGVmZmVjdHMgZmFpbGVkLCBubyB2YWxpZCBkYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcGFyYW1fbWF4X29mZnNldCA9IHZhbHVlcyArIE1BWF9QUF9QQVJBTVNfU1ogLSAxOwotCWRldmljZXMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQludW1fY29tbWFuZHMgPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQlpZiAoIWFjIHx8IChkZXZpY2VzID09IC1FSU5WQUwpIHx8IChudW1fY29tbWFuZHMgPT0gLUVJTlZBTCkpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBhdWRpbyBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwYXJhbXMgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghcGFyYW1zKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXVwZHRfcGFyYW1zID0gKGludCAqKXBhcmFtczsKLQlwYXJhbXNfbGVuZ3RoID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyspIHsKLQkJdWludDMyX3QgY29tbWFuZF9pZCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgY29tbWFuZF9jb25maWdfc3RhdGUgPQotCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCXVpbnQzMl90IGluZGV4X29mZnNldCA9Ci0JCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJdWludDMyX3QgbGVuZ3RoID0KLQkJCUdFVF9ORVhUKHZhbHVlcywgcGFyYW1fbWF4X29mZnNldCwgcmMpOwotCQlzd2l0Y2ggKGNvbW1hbmRfaWQpIHsKLQkJY2FzZSBTT0ZUX1ZPTFVNRV9HQUlOXzJDSDoKLQkJY2FzZSBTT0ZUX1ZPTFVNRTJfR0FJTl8yQ0g6Ci0JCQlpZiAobGVuZ3RoICE9IDIgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIlZPTFVNRV9HQUlOXzJDSDogaW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJdm9sLT5sZWZ0X2dhaW4gPSBHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCXZvbC0+cmlnaHRfZ2FpbiA9Ci0JCQkJR0VUX05FWFQodmFsdWVzLCBwYXJhbV9tYXhfb2Zmc2V0LCByYyk7Ci0JCQl2b2wtPm1hc3Rlcl9nYWluID0gMHgyMDAwOwotCQkJaWYgKGNvbW1hbmRfY29uZmlnX3N0YXRlID09IENPTkZJR19TRVQpIHsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9TWjsKLQkJCQlwYXJhbXNfbGVuZ3RoICs9IENPTU1BTkRfUEFZTE9BRF9TWiArCi0JCQkJCVNPRlRfVk9MVU1FX0dBSU5fTUFTVEVSX1BBUkFNX1NaOwotCQkJCUNIRUNLX1BBUkFNX0xFTihwYXJhbXNfbGVuZ3RoLAotCQkJCQkJTUFYX0lOQkFORF9QQVJBTV9TWiwKLQkJCQkJCSJWT0xVTUUvVk9MVU1FMl9HQUlOXzJDSCIsCi0JCQkJCQlyYyk7Ci0JCQkJaWYgKHJjICE9IDApCi0JCQkJCWdvdG8gaW52YWxpZF9jb25maWc7Ci0JCQkJaWYgKGluc3RhbmNlID09IFNPRlRfVk9MVU1FX0lOU1RBTkNFXzIpCi0JCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkwyOwotCQkJCWVsc2UKLQkJCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQkJQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCUFTTV9QQVJBTV9JRF9WT0xfQ1RSTF9MUl9DSEFOTkVMX0dBSU47Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOXzJDSF9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCSh2b2wtPmxlZnRfZ2FpbiA8PCAxNikgfAotCQkJCQkJdm9sLT5yaWdodF9nYWluOwotCQkJCWlmIChpbnN0YW5jZSA9PSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yKQotCQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCQlBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKLQkJCQllbHNlCi0JCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkw7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBU01fUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU47Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9TWjsKLQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCXZvbC0+bWFzdGVyX2dhaW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUjoKLQkJY2FzZSBTT0ZUX1ZPTFVNRTJfR0FJTl9NQVNURVI6Ci0JCQlpZiAobGVuZ3RoICE9IDEgfHwgaW5kZXhfb2Zmc2V0ICE9IDApIHsKLQkJCQlwcl9lcnIoIlZPTFVNRV9HQUlOX01BU1RFUjogaW52YWxpZCBwYXJhbXNcbiIpOwotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJfQotCQkJdm9sLT5sZWZ0X2dhaW4gPSAweDIwMDA7Ci0JCQl2b2wtPnJpZ2h0X2dhaW4gPSAweDIwMDA7Ci0JCQl2b2wtPm1hc3Rlcl9nYWluID0KLQkJCQlHRVRfTkVYVCh2YWx1ZXMsIHBhcmFtX21heF9vZmZzZXQsIHJjKTsKLQkJCWlmIChjb21tYW5kX2NvbmZpZ19zdGF0ZSA9PSBDT05GSUdfU0VUKSB7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQkJU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fU1o7Ci0JCQkJcGFyYW1zX2xlbmd0aCArPSBDT01NQU5EX1BBWUxPQURfU1ogKwotCQkJCQlTT0ZUX1ZPTFVNRV9HQUlOX01BU1RFUl9QQVJBTV9TWjsKLQkJCQlDSEVDS19QQVJBTV9MRU4ocGFyYW1zX2xlbmd0aCwKLQkJCQkJCU1BWF9JTkJBTkRfUEFSQU1fU1osCi0JCQkJCQkiVk9MVU1FL1ZPTFVNRTJfR0FJTl9NQVNURVIiLAotCQkJCQkJcmMpOwotCQkJCWlmIChyYyAhPSAwKQotCQkJCQlnb3RvIGludmFsaWRfY29uZmlnOwotCQkJCWlmIChpbnN0YW5jZSA9PSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yKQotCQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCQlBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKLQkJCQllbHNlCi0JCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJCUFTTV9NT0RVTEVfSURfVk9MX0NUUkw7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQlBU01fUEFSQU1fSURfVk9MX0NUUkxfTFJfQ0hBTk5FTF9HQUlOOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJU09GVF9WT0xVTUVfR0FJTl8yQ0hfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQkodm9sLT5sZWZ0X2dhaW4gPDwgMTYpIHwKLQkJCQkJCXZvbC0+cmlnaHRfZ2FpbjsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gU09GVF9WT0xVTUVfSU5TVEFOQ0VfMikKLQkJCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQkJQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDI7Ci0JCQkJZWxzZQotCQkJCQkqdXBkdF9wYXJhbXMrKyA9Ci0JCQkJCQlBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOOwotCQkJCSp1cGR0X3BhcmFtcysrID0KLQkJCQkJU09GVF9WT0xVTUVfR0FJTl9NQVNURVJfUEFSQU1fU1o7Ci0JCQkJKnVwZHRfcGFyYW1zKysgPQotCQkJCQl2b2wtPm1hc3Rlcl9nYWluOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvbW1hbmQgaWQ6ICVkIHRvIHNldCBjb25maWdcbiIsCi0JCQkJX19mdW5jX18sIGNvbW1hbmRfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKHBhcmFtc19sZW5ndGggJiYgKHJjID09IDApKQotCQlxNmFzbV9zZW5kX2F1ZGlvX2VmZmVjdHNfcGFyYW1zKGFjLCBwYXJhbXMsCi0JCQkJCQlwYXJhbXNfbGVuZ3RoKTsKLWludmFsaWRfY29uZmlnOgotCWtmcmVlKHBhcmFtcyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbXNtX2F1ZGlvX2VmZmVjdHNfdm9sdW1lX2hhbmRsZXIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJICAgICBzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zICp2b2wsCi0JCQkJICAgICBsb25nICp2YWx1ZXMpCi17Ci0JcmV0dXJuIF9fbXNtX2F1ZGlvX2VmZmVjdHNfdm9sdW1lX2hhbmRsZXIoYWMsIHZvbCwgdmFsdWVzLAotCQkJCQkJICBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xKTsKLX0KLQotaW50IG1zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyX3YyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQlzdHJ1Y3Qgc29mdF92b2x1bWVfcGFyYW1zICp2b2wsCi0JCQkJCWxvbmcgKnZhbHVlcywgaW50IGluc3RhbmNlKQotewotCXJldHVybiBfX21zbV9hdWRpb19lZmZlY3RzX3ZvbHVtZV9oYW5kbGVyKGFjLCB2b2wsIHZhbHVlcywgaW5zdGFuY2UpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wcmVzcy1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1jb21wcmVzcy1xNi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNhZjU4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tY29tcHJlc3MtcTYtdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NjEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9hdWRpb19lZmZlY3RzLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8c291bmQvdGltZXIuaD4KLSNpbmNsdWRlIDxzb3VuZC90bHYuaD4KLQotI2luY2x1ZGUgPHNvdW5kL2Fwcl9hdWRpby12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3Nfb2ZmbG9hZC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgotI2luY2x1ZGUgPHNvdW5kL21zbS1hdWRpby1lZmZlY3RzLXE2LXYyLmg+Ci0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSAibXNtLXF0aS1wcC1jb25maWcuaCIKLQotI2RlZmluZSBEU1BfUFBfQlVGRkVSSU5HX0lOX01TRUMJMjUKLSNkZWZpbmUgUEFSVElBTF9EUkFJTl9BQ0tfRUFSTFlfQllfTVNFQwkxNTAKLSNkZWZpbmUgTVAzX09VVFBVVF9GUkFNRV9TWgkJMTE1MgotI2RlZmluZSBBQUNfT1VUUFVUX0ZSQU1FX1NaCQkxMDI0Ci0jZGVmaW5lIEFDM19PVVRQVVRfRlJBTUVfU1oJCTE1MzYKLSNkZWZpbmUgRUFDM19PVVRQVVRfRlJBTUVfU1oJCTE1MzYKLSNkZWZpbmUgRFNQX05VTV9PVVRQVVRfRlJBTUVfQlVGRkVSRUQJMgotI2RlZmluZSBGTEFDX0JMS19TSVpFX0xJTUlUCQk2NTUzNQotCi0vKiBUaW1lc3RhbXAgbW9kZSBwYXlsb2FkIG9mZnNldHMgKi8KLSNkZWZpbmUgQ0FQVFVSRV9NRVRBX0RBVEFfVFNfT0ZGU0VUX0xTVwk2Ci0jZGVmaW5lIENBUFRVUkVfTUVUQV9EQVRBX1RTX09GRlNFVF9NU1cJNwotCi0vKiBkZWNvZGVyIHBhcmFtZXRlciBsZW5ndGggKi8KLSNkZWZpbmUgRERQX0RFQ19NQVhfTlVNX1BBUkFNCQkxOAotCi0vKiBEZWZhdWx0IHZhbHVlcyB1c2VkIGlmIHVzZXIgc3BhY2UgZG9lcyBub3Qgc2V0ICovCi0jZGVmaW5lIENPTVBSX1BMQVlCQUNLX01JTl9GUkFHTUVOVF9TSVpFICg4ICogMTAyNCkKLSNkZWZpbmUgQ09NUFJfUExBWUJBQ0tfTUFYX0ZSQUdNRU5UX1NJWkUgKDEyOCAqIDEwMjQpCi0jZGVmaW5lIENPTVBSX1BMQVlCQUNLX01JTl9OVU1fRlJBR01FTlRTICg0KQotI2RlZmluZSBDT01QUl9QTEFZQkFDS19NQVhfTlVNX0ZSQUdNRU5UUyAoMTYgKiA0KQotCi0jZGVmaW5lIENPTVBSRVNTRURfTFJfVk9MX01BWF9TVEVQUwkweDIwMDAKLWNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihtc21fY29tcHJfdm9sX2dhaW4sIDAsCi0JCQkJQ09NUFJFU1NFRF9MUl9WT0xfTUFYX1NURVBTKTsKLQotLyogU3RyZWFtIGlkIHN3aXRjaGVzIGJldHdlZW4gMSBhbmQgMiAqLwotI2RlZmluZSBORVhUX1NUUkVBTV9JRChzdHJlYW1faWQpICgoc3RyZWFtX2lkICYgMSkgKyAxKQotCi0jZGVmaW5lIFNUUkVBTV9BUlJBWV9JTkRFWChzdHJlYW1faWQpIChzdHJlYW1faWQgLSAxKQotCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfU1RSRUFNUyAyCi0KLXN0cnVjdCBtc21fY29tcHJfZ2FwbGVzc19zdGF0ZSB7Ci0JYm9vbCBzZXRfbmV4dF9zdHJlYW1faWQ7Ci0JaW50MzJfdCBzdHJlYW1fb3BlbmVkW01BWF9OVU1CRVJfT0ZfU1RSRUFNU107Ci0JdWludDMyX3QgaW5pdGlhbF9zYW1wbGVzX2Ryb3A7Ci0JdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlc19kcm9wOwotCXVpbnQzMl90IGdhcGxlc3NfdHJhbnNpdGlvbjsKLQlib29sIHVzZV9kc3BfZ2FwbGVzc19tb2RlOwotCXVuaW9uIHNuZF9jb2RlY19vcHRpb25zIGNvZGVjX29wdGlvbnM7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHsKLQk4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDY0MDAwLAotCTg4MjAwLCA5NjAwMCwgMTI4MDAwLCAxNDQwMDAsIDE3NjQwMCwgMTkyMDAwLCAzNTI4MDAsIDM4NDAwMCwgMjgyMjQwMCwKLQk1NjQ0ODAwCi19OwotCi1zdHJ1Y3QgbXNtX2NvbXByX3BkYXRhIHsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbVtNU01fRlJPTlRFTkRfREFJX01BWF07Ci0JdWludDMyX3Qgdm9sdW1lW01TTV9GUk9OVEVORF9EQUlfTUFYXVsyXTsgLyogRm9yIGJvdGggTCAmIFIgKi8KLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHNbTVNNX0ZST05URU5EX0RBSV9NQVhdOwotCWJvb2wgdXNlX2RzcF9nYXBsZXNzX21vZGU7Ci0JYm9vbCB1c2VfbGVnYWN5X2FwaTsgLyogaW5kaWNhdGVzIHVzZSBvbGRlciBhc20gYXBpcyovCi0Jc3RydWN0IG1zbV9jb21wcl9kZWNfcGFyYW1zICpkZWNfcGFyYW1zW01TTV9GUk9OVEVORF9EQUlfTUFYXTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2NoX21hcCAqY2hfbWFwW01TTV9GUk9OVEVORF9EQUlfTUFYXTsKLX07Ci0KLXN0cnVjdCBtc21fY29tcHJfYXVkaW8gewotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtOwotCXN0cnVjdCBzbmRfY29tcHJfY2FwcyBjb21wcl9jYXA7Ci0Jc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzIGNvZGVjX2NhcHM7Ci0Jc3RydWN0IHNuZF9jb21wcl9wYXJhbXMgY29kZWNfcGFyYW07Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYXVkaW9fY2xpZW50OwotCi0JdWludDMyX3QgY29kZWM7Ci0JdWludDMyX3QgY29tcHJfcGFzc3RocjsKLQl2b2lkICAgICpidWZmZXI7IC8qIHZpcnR1YWwgYWRkcmVzcyAqLwotCXBoeXNfYWRkcl90IGJ1ZmZlcl9wYWRkcjsgLyogcGh5c2ljYWwgYWRkcmVzcyAqLwotCXVpbnQzMl90IGFwcF9wb2ludGVyOwotCXVpbnQzMl90IGJ1ZmZlcl9zaXplOwotCXVpbnQzMl90IGJ5dGVfb2Zmc2V0OwotCXVpbnQ2NF90IGNvcGllZF90b3RhbDsgLyogYnl0ZXMgY29uc3VtZWQgYnkgRFNQICovCi0JdWludDY0X3QgYnl0ZXNfcmVjZWl2ZWQ7IC8qIGZyb20gdXNlcnNwYWNlICovCi0JdWludDY0X3QgYnl0ZXNfc2VudDsgLyogdG8gRFNQICovCi0KLQl1aW50NjRfdCByZWNlaXZlZF90b3RhbDsgLyogYnl0ZXMgcmVjZWl2ZWQgZnJvbSBEU1AgKi8KLQl1aW50NjRfdCBieXRlc19jb3BpZWQ7IC8qIHRvIHVzZXJzcGFjZSAqLwotCXVpbnQ2NF90IGJ5dGVzX3JlYWQ7IC8qIGZyb20gRFNQICovCi0JdWludDMyX3QgYnl0ZXNfcmVhZF9vZmZzZXQ7IC8qIGJ5dGVzIHJlYWQgb2Zmc2V0ICovCi0KLQl1aW50MzJfdCB0c19oZWFkZXJfb2Zmc2V0OyAvKiBob2xkcyB0aGUgdGltZXN0YW1wIGhlYWRlciBvZmZzZXQgKi8KLQotCWludDMyX3QgZmlyc3RfYnVmZmVyOwotCWludDMyX3QgbGFzdF9idWZmZXI7Ci0JaW50MzJfdCBwYXJ0aWFsX2RyYWluX2RlbGF5OwotCi0JdWludDE2X3Qgc2Vzc2lvbl9pZDsKLQotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotCXVpbnQzMl90IG51bV9jaGFubmVsczsKLQotCS8qCi0JICogY29udmVudGlvbiAtIGNvbW1hbmRzIGNvbWluZyBmcm9tIHRoZSBzYW1lIHRocmVhZAotCSAqIGNhbiB1c2UgdGhlIGNvbW1vbiBjbWRfYWNrIHZhci4gT3RoZXJzIChlLmcgZHJhaW4vRU9TKQotCSAqIG11c3QgdXNlIHNlcGFyYXRlIHZhcnMgdG8gdHJhY2sgY29tbWFuZCBzdGF0dXMuCi0JICovCi0JdWludDMyX3QgY21kX2FjazsKLQl1aW50MzJfdCBjbWRfaW50ZXJydXB0OwotCXVpbnQzMl90IGRyYWluX3JlYWR5OwotCXVpbnQzMl90IGVvc19hY2s7Ci0KLQl1aW50MzJfdCBzdHJlYW1fYXZhaWxhYmxlOwotCXVpbnQzMl90IG5leHRfc3RyZWFtOwotCi0JdWludDMyX3QgcnVuX21vZGU7Ci0JdWludDMyX3Qgc3RhcnRfZGVsYXlfbHN3OwotCXVpbnQzMl90IHN0YXJ0X2RlbGF5X21zdzsKLQotCXVpbnQ2NF90IG1hcmtlcl90aW1lc3RhbXA7Ci0KLQlzdHJ1Y3QgbXNtX2NvbXByX2dhcGxlc3Nfc3RhdGUgZ2FwbGVzc19zdGF0ZTsKLQotCWF0b21pY190IHN0YXJ0OwotCWF0b21pY190IGVvczsKLQlhdG9taWNfdCBkcmFpbjsKLQlhdG9taWNfdCB4cnVuOwotCWF0b21pY190IGNsb3NlOwotCWF0b21pY190IHdhaXRfb25fY2xvc2U7Ci0JYXRvbWljX3QgZXJyb3I7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBlb3Nfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBkcmFpbl93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGNsb3NlX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9mb3Jfc3RyZWFtX2F2YWlsOwotCi0Jc3BpbmxvY2tfdCBsb2NrOwotfTsKLQotY29uc3QgdTMyIGNvbXByX2NvZGVjc1tdID0gewotCVNORF9BVURJT0NPREVDX0FDMywgU05EX0FVRElPQ09ERUNfRUFDMywgU05EX0FVRElPQ09ERUNfRFRTLAotCVNORF9BVURJT0NPREVDX0RTRCwgU05EX0FVRElPQ09ERUNfVFJVRUhELCBTTkRfQVVESU9DT0RFQ19JRUM2MTkzN307Ci0KLXN0cnVjdCBxdWVyeV9hdWRpb19lZmZlY3QgewotCXVpbnQzMl90IG1vZF9pZDsKLQl1aW50MzJfdCBwYXJtX2lkOwotCXVpbnQzMl90IHNpemU7Ci0JdWludDMyX3Qgb2Zmc2V0OwotCXVpbnQzMl90IGRldmljZTsKLX07Ci0KLXN0cnVjdCBtc21fY29tcHJfYXVkaW9fZWZmZWN0cyB7Ci0Jc3RydWN0IGJhc3NfYm9vc3RfcGFyYW1zIGJhc3NfYm9vc3Q7Ci0Jc3RydWN0IHBiZV9wYXJhbXMgcGJlOwotCXN0cnVjdCB2aXJ0dWFsaXplcl9wYXJhbXMgdmlydHVhbGl6ZXI7Ci0Jc3RydWN0IHJldmVyYl9wYXJhbXMgcmV2ZXJiOwotCXN0cnVjdCBlcV9wYXJhbXMgZXF1YWxpemVyOwotCXN0cnVjdCBzb2Z0X3ZvbHVtZV9wYXJhbXMgdm9sdW1lOwotCXN0cnVjdCBxdWVyeV9hdWRpb19lZmZlY3QgcXVlcnk7Ci19OwotCi1zdHJ1Y3QgbXNtX2NvbXByX2RlY19wYXJhbXMgewotCXN0cnVjdCBzbmRfZGVjX2RkcCBkZHBfcGFyYW1zOwotfTsKLQotc3RydWN0IG1zbV9jb21wcl9jaF9tYXAgewotCWJvb2wgc2V0X2NoX21hcDsKLQljaGFyIGNoYW5uZWxfbWFwW1BDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMXTsKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3NlbmRfZGVjX3BhcmFtcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQkgICAgIHN0cnVjdCBtc21fY29tcHJfZGVjX3BhcmFtcyAqZGVjX3BhcmFtcywKLQkJCQkgICAgIGludCBzdHJlYW1faWQpOwotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9zZXRfcmVuZGVyX21vZGUoc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCwKLQkJCQkgICAgIHVpbnQzMl90IHJlbmRlcl9tb2RlKSB7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0KLQlwcl9kZWJ1ZygiJXMsIGdvdCByZW5kZXIgbW9kZSAldVxuIiwgX19mdW5jX18sIHJlbmRlcl9tb2RlKTsKLQotCWlmIChyZW5kZXJfbW9kZSA9PSBTTkRSVl9DT01QUkVTU19SRU5ERVJfTU9ERV9BVURJT19NQVNURVIpIHsKLQkJcmVuZGVyX21vZGUgPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9ERUZBVUxUOwotCX0gZWxzZSBpZiAocmVuZGVyX21vZGUgPT0gU05EUlZfQ09NUFJFU1NfUkVOREVSX01PREVfU1RDX01BU1RFUikgewotCQlyZW5kZXJfbW9kZSA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX0xPQ0FMX1NUQzsKLQkJcHJ0ZC0+cnVuX21vZGUgPSBBU01fU0VTU0lPTl9DTURfUlVOX1NUQVJUSU1FX1JVTl9XSVRIX0RFTEFZOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMsIEludmFsaWQgcmVuZGVyIG1vZGUgJXVcbiIsIF9fZnVuY19fLAotCQkJcmVuZGVyX21vZGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gcTZhc21fc2VuZF9tdG14X3N0cnRyX3JlbmRlcl9tb2RlKGFjLCByZW5kZXJfbW9kZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzLCBSZW5kZXIgbW9kZSBjYW4ndCBiZSBzZXQgZXJyb3IgJWRcbiIsIF9fZnVuY19fLAotCQkJcmV0KTsKLQl9Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3NldF9jbGtfcmVjX21vZGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJICAgICB1aW50MzJfdCBjbGtfcmVjX21vZGUpIHsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCXByX2RlYnVnKCIlcywgZ290IGNsayByZWMgbW9kZSAldVxuIiwgX19mdW5jX18sIGNsa19yZWNfbW9kZSk7Ci0KLQlpZiAoY2xrX3JlY19tb2RlID09IFNORFJWX0NPTVBSRVNTX0NMS19SRUNfTU9ERV9OT05FKSB7Ci0JCWNsa19yZWNfbW9kZSA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19OT05FOwotCX0gZWxzZSBpZiAoY2xrX3JlY19tb2RlID09IFNORFJWX0NPTVBSRVNTX0NMS19SRUNfTU9ERV9BVVRPKSB7Ci0JCWNsa19yZWNfbW9kZSA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19BVVRPOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMsIEludmFsaWQgY2xrIHJlY19tb2RlIG1vZGUgJXVcbiIsIF9fZnVuY19fLAotCQkJY2xrX3JlY19tb2RlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl9jbGtfcmVjX21vZGUoYWMsIGNsa19yZWNfbW9kZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzLCBjbGsgcmVjIG1vZGUgY2FuJ3QgYmUgc2V0LCBlcnJvciAlZFxuIiwgX19mdW5jX18sCi0JCQlyZXQpOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9zZXRfcmVuZGVyX3dpbmRvdyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3Qgd3NfbHN3LCB1aW50MzJfdCB3c19tc3csCi0JCXVpbnQzMl90IHdlX2xzdywgdWludDMyX3Qgd2VfbXN3KQotewotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90IGFzbV9tdG14X3N0cnRyX3dpbmRvdzsKLQl1aW50MzJfdCBwYXJhbV9pZDsKLQotCXByX2RlYnVnKCIlcywgd3NfbHN3IDB4JXggd3NfbXN3IDB4JXggd2VfbHN3IDB4JXggd2VfbXMgMHgleFxuIiwKLQkJIF9fZnVuY19fLCB3c19sc3csIHdzX21zdywgd2VfbHN3LCB3ZV9tc3cpOwotCi0JbWVtc2V0KCZhc21fbXRteF9zdHJ0cl93aW5kb3csIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV93aW5kb3dfdjJfdCkpOwotCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbHN3ID0gd3NfbHN3OwotCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbXN3ID0gd3NfbXN3OwotCXBhcmFtX2lkID0gQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX1NUQVJUX1YyOwotCXJldCA9IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl93aW5kb3coYWMsICZhc21fbXRteF9zdHJ0cl93aW5kb3csCi0JCQkJCSAgIHBhcmFtX2lkKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXMsIHN0YXJ0IHdpbmRvdyBjYW4ndCBiZSBzZXQgZXJyb3IgJWRcbiIsIF9fZnVuY19fLAotCQkJcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbHN3ID0gd2VfbHN3OwotCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbXN3ID0gd2VfbXN3OwotCXBhcmFtX2lkID0gQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfV0lORE9XX0VORF9WMjsKLQlyZXQgPSBxNmFzbV9zZW5kX210bXhfc3RydHJfd2luZG93KGFjLCAmYXNtX210bXhfc3RydHJfd2luZG93LAotCQkJCQkgICBwYXJhbV9pZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzLCBlbmQgd2luZG93IGNhbid0IGJlIHNldCBlcnJvciAlZFxuIiwgX19mdW5jX18sCi0JCQlyZXQpOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9lbmFibGVfYWRqdXN0X3Nlc3Npb25fY2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCWJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXMsIGVuYWJsZSBhZGp1c3Rfc2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0KLQlyZXQgPSBxNmFzbV9zZW5kX210bXhfc3RydHJfZW5hYmxlX2FkanVzdF9zZXNzaW9uX2Nsb2NrKGFjLCBlbmFibGUpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXMsIGFkanVzdCBzZXNzaW9uIGNsb2NrIGNhbid0IGJlIHNldCBlcnJvciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYWRqdXN0X3Nlc3Npb25fY2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IGFkanVzdF9zZXNzaW9uX2xzdywgdWludDMyX3QgYWRqdXN0X3Nlc3Npb25fbXN3KQotewotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXMsIGFkanVzdF9zZXNzaW9uX3RpbWVfbXN3IDB4JXggYWRqdXN0X3Nlc3Npb25fdGltZV9sc3cgMHgleFxuIiwKLQkJIF9fZnVuY19fLCBhZGp1c3Rfc2Vzc2lvbl9tc3csIGFkanVzdF9zZXNzaW9uX2xzdyk7Ci0KLQlyZXQgPSBxNmFzbV9hZGp1c3Rfc2Vzc2lvbl9jbG9jayhhYywKLQkJCWFkanVzdF9zZXNzaW9uX2xzdywKLQkJCWFkanVzdF9zZXNzaW9uX21zdyk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlcywgYWRqdXN0IHNlc3Npb24gY2xvY2sgY2FuJ3QgYmUgc2V0IGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9zZXRfdm9sdW1lKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCXVpbnQzMl90IHZvbHVtZV9sLCB1aW50MzJfdCB2b2x1bWVfcikKLXsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOwotCWludCByYyA9IDA7Ci0JdWludDMyX3QgYXZnX3ZvbCwgZ2Fpbl9saXN0W1ZPTFVNRV9DT05UUk9MX01BWF9DSEFOTkVMU107Ci0JdWludDMyX3QgbnVtX2NoYW5uZWxzOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGE7Ci0JYm9vbCB1c2VfZGVmYXVsdCA9IHRydWU7Ci0JdTggKmNobWFwID0gTlVMTDsKLQotCXByX2RlYnVnKCIlczogdm9sdW1lX2wgJWQgdm9sdW1lX3IgJWRcbiIsCi0JCV9fZnVuY19fLCB2b2x1bWVfbCwgdm9sdW1lX3IpOwotCWlmICghY3N0cmVhbSB8fCAhY3N0cmVhbS0+cnVudGltZSkgewotCQlwcl9lcnIoIiVzOiBzZXNzaW9uIG5vdCBhY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXBydGQgPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIXJ0ZCB8fCAhcnRkLT5wbGF0Zm9ybSB8fCAhcHJ0ZCB8fCAhcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcnRkLCBwcnRkIG9yIGF1ZGlvIGNsaWVudCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0KLQlpZiAocHJ0ZC0+Y29tcHJfcGFzc3RociAhPSBMRUdBQ1lfUENNKSB7Ci0JCXByX2RlYnVnKCIlczogTm8gdm9sdW1lIGNvbmZpZyBmb3IgcGFzc3Rocm91Z2ggJWRcbiIsCi0JCQkgX19mdW5jX18sIHBydGQtPmNvbXByX3Bhc3N0aHIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JdXNlX2RlZmF1bHQgPSAhKHBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdLT5zZXRfY2hfbWFwKTsKLQljaG1hcCA9IHBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdLT5jaGFubmVsX21hcDsKLQludW1fY2hhbm5lbHMgPSBwcnRkLT5udW1fY2hhbm5lbHM7Ci0KLQlpZiAocHJ0ZC0+bnVtX2NoYW5uZWxzID4gMikgewotCQkvKgotCQkgKiBDdXJyZW50bHkgdGhlIGxlZnQgYW5kIHJpZ2h0IGdhaW5zIGFyZSBhdmVyYWdlZCBhbiBhcHBsaWVkCi0JCSAqIHRvIGFsbCBjaGFubmVscy4gVGhpcyBtaWdodCBub3QgYmUgZGVzaXJhYmxlLiBCdXQgY3VycmVudGx5LAotCQkgKiB0aGVyZSBleGlzdHMgbm8gQVBJIGluIHVzZXJzcGFjZSB0byBzZW5kIGEgbGlzdCBvZiBnYWlucyBmb3IKLQkJICogZWFjaCBjaGFubmVsIGVpdGhlci4gSWYgc3VjaCBhbiBBUEkgZG9lcyBiZWNvbWUgYXZhaWxhYmxlLAotCQkgKiB0aGUgbWl4ZXIgY29udHJvbCBtdXN0IGJlIHVwZGF0ZWQgdG8gYWNjZXB0IG1vcmUgdGhhbiAyCi0JCSAqIGNoYW5uZWwgZ2FpbnMuCi0JCSAqCi0JCSAqLwotCQlhdmdfdm9sID0gKHZvbHVtZV9sICsgdm9sdW1lX3IpIC8gMjsKLQkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgYXZnX3ZvbCk7Ci0JfSBlbHNlIHsKLQkJZ2Fpbl9saXN0WzBdID0gdm9sdW1lX2w7Ci0JCWdhaW5fbGlzdFsxXSA9IHZvbHVtZV9yOwotCQkvKiBmb3JjZSBzZW5kaW5nIEZSL0ZML0ZDIHZvbHVtZSBmb3IgbW9ubyAqLwotCQlpZiAocHJ0ZC0+bnVtX2NoYW5uZWxzID09IDEpIHsKLQkJCWdhaW5fbGlzdFsyXSA9IHZvbHVtZV9sOwotCQkJbnVtX2NoYW5uZWxzID0gMzsKLQkJCXVzZV9kZWZhdWx0ID0gdHJ1ZTsKLQkJfQotCQlyYyA9IHE2YXNtX3NldF9tdWx0aWNoX2dhaW4ocHJ0ZC0+YXVkaW9fY2xpZW50LCBudW1fY2hhbm5lbHMsCi0JCQkJCWdhaW5fbGlzdCwgY2htYXAsIHVzZV9kZWZhdWx0KTsKLQl9Ci0KLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoIiVzOiBTZW5kIHZvbCBnYWluIGNvbW1hbmQgZmFpbGVkIHJjPSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfc2VuZF9kZHBfY2ZnKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCSAgc3RydWN0IHNuZF9kZWNfZGRwICpkZHAsCi0JCQkJICBpbnQgc3RyZWFtX2lkKQotewotCWludCBpLCByYzsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWZvciAoaSA9IDA7IGkgPCBkZHAtPnBhcmFtc19sZW5ndGg7IGkrKykgewotCQlyYyA9IHE2YXNtX2RzMV9zZXRfc3RyZWFtX2VuZHBfcGFyYW1zKGFjLCBkZHAtPnBhcmFtc19pZFtpXSwKLQkJCQkJCSAgICAgIGRkcC0+cGFyYW1zX3ZhbHVlW2ldLAotCQkJCQkJICAgICAgc3RyZWFtX2lkKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoInNlbmRpbmcgcGFyYW1zX2lkOiAlZCBmYWlsZWRcbiIsCi0JCQkJZGRwLT5wYXJhbXNfaWRbaV0pOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9zZW5kX2J1ZmZlcihzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkKQotewotCWludCBidWZmZXJfbGVuZ3RoOwotCXVpbnQ2NF90IGJ5dGVzX2F2YWlsYWJsZTsKLQlzdHJ1Y3QgYXVkaW9fYWlvX3dyaXRlX3BhcmFtIHBhcmFtOwotCXN0cnVjdCBzbmRfY29kZWNfbWV0YWRhdGEgKmJ1ZmZfYWRkcjsKLQotCWlmICghYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgewotCQlwcl9lcnIoIiVzOiBzdHJlYW0gaXMgbm90IGluIHN0YXJ0ZWQgc3RhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0KLQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnhydW4pKSB7Ci0JCVdBUk4oMSwgIiVzIGNhbGxlZCB3aGlsZSB4cnVuIGlzIHRydWUiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBieXRlc19yZWNlaXZlZCA9ICVsbHUgY29waWVkX3RvdGFsID0gJWxsdVxuIiwKLQkJX19mdW5jX18sIHBydGQtPmJ5dGVzX3JlY2VpdmVkLCBwcnRkLT5jb3BpZWRfdG90YWwpOwotCWlmIChwcnRkLT5maXJzdF9idWZmZXIgJiYgIHBydGQtPmdhcGxlc3Nfc3RhdGUudXNlX2RzcF9nYXBsZXNzX21vZGUgJiYKLQkJcHJ0ZC0+Y29tcHJfcGFzc3RociA9PSBMRUdBQ1lfUENNKQotCQlxNmFzbV9zdHJlYW1fc2VuZF9tZXRhX2RhdGEocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+c3RyZWFtX2lkLAotCQkJCXBydGQtPmdhcGxlc3Nfc3RhdGUuaW5pdGlhbF9zYW1wbGVzX2Ryb3AsCi0JCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS50cmFpbGluZ19zYW1wbGVzX2Ryb3ApOwotCi0JYnVmZmVyX2xlbmd0aCA9IHBydGQtPmNvZGVjX3BhcmFtLmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCWJ5dGVzX2F2YWlsYWJsZSA9IHBydGQtPmJ5dGVzX3JlY2VpdmVkIC0gcHJ0ZC0+Y29waWVkX3RvdGFsOwotCWlmIChieXRlc19hdmFpbGFibGUgPCBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJYnVmZmVyX2xlbmd0aCA9IGJ5dGVzX2F2YWlsYWJsZTsKLQotCWlmIChwcnRkLT5ieXRlX29mZnNldCArIGJ1ZmZlcl9sZW5ndGggPiBwcnRkLT5idWZmZXJfc2l6ZSkgewotCQlidWZmZXJfbGVuZ3RoID0gKHBydGQtPmJ1ZmZlcl9zaXplIC0gcHJ0ZC0+Ynl0ZV9vZmZzZXQpOwotCQlwcl9kZWJ1ZygiJXM6IHdyYXAgYXJvdW5kIHNpdHVhdGlvbiwgc2VuZCBwYXJ0aWFsIGRhdGEgJWQgbm93IiwKLQkJCSBfX2Z1bmNfXywgYnVmZmVyX2xlbmd0aCk7Ci0JfQotCi0JaWYgKGJ1ZmZlcl9sZW5ndGgpIHsKLQkJcGFyYW0ucGFkZHIgPSBwcnRkLT5idWZmZXJfcGFkZHIgKyBwcnRkLT5ieXRlX29mZnNldDsKLQkJV0FSTihwcnRkLT5ieXRlX29mZnNldCAlIDMyICE9IDAsICJvZmZzZXQgJXggbm90IG11bHRpcGxlIG9mIDMyXG4iLAotCQlwcnRkLT5ieXRlX29mZnNldCk7Ci0JfSBlbHNlIHsKLQkJcGFyYW0ucGFkZHIgPSBwcnRkLT5idWZmZXJfcGFkZHI7Ci0JfQotCXBhcmFtLmxlbgk9IGJ1ZmZlcl9sZW5ndGg7Ci0JaWYgKHBydGQtPnRzX2hlYWRlcl9vZmZzZXQpIHsKLQkJYnVmZl9hZGRyID0gKHN0cnVjdCBzbmRfY29kZWNfbWV0YWRhdGEgKikKLQkJCQkJKHBydGQtPmJ1ZmZlciArIHBydGQtPmJ5dGVfb2Zmc2V0KTsKLQkJcGFyYW0ubGVuID0gYnVmZl9hZGRyLT5sZW5ndGg7Ci0JCXBhcmFtLm1zd190cyA9ICh1aW50MzJfdCkKLQkJCSgoYnVmZl9hZGRyLT50aW1lc3RhbXAgJiAweEZGRkZGRkZGMDAwMDAwMDBMTCkgPj4gMzIpOwotCQlwYXJhbS5sc3dfdHMgPSAodWludDMyX3QpIChidWZmX2FkZHItPnRpbWVzdGFtcCAmIDB4RkZGRkZGRkZMTCk7Ci0JCXBhcmFtLnBhZGRyICs9IHBydGQtPnRzX2hlYWRlcl9vZmZzZXQ7Ci0JCXBhcmFtLmZsYWdzID0gU0VUX1RJTUVTVEFNUDsKLQkJcGFyYW0ubWV0YWRhdGFfbGVuID0gcHJ0ZC0+dHNfaGVhZGVyX29mZnNldDsKLQl9IGVsc2UgewotCQlwYXJhbS5tc3dfdHMgPSAwOwotCQlwYXJhbS5sc3dfdHMgPSAwOwotCQlwYXJhbS5mbGFncyA9IE5PX1RJTUVTVEFNUDsKLQkJcGFyYW0ubWV0YWRhdGFfbGVuID0gMDsKLQl9Ci0JcGFyYW0udWlkCT0gYnVmZmVyX2xlbmd0aDsKLQlwYXJhbS5sYXN0X2J1ZmZlciA9IHBydGQtPmxhc3RfYnVmZmVyOwotCi0JcHJfZGVidWcoIiVzOiBzZW5kaW5nICVkIGJ5dGVzIHRvIERTUCBieXRlX29mZnNldCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgcGFyYW0ubGVuLCBwcnRkLT5ieXRlX29mZnNldCk7Ci0JaWYgKHE2YXNtX2FzeW5jX3dyaXRlKHBydGQtPmF1ZGlvX2NsaWVudCwgJnBhcmFtKSA8IDApIHsKLQkJcHJfZXJyKCIlczpxNmFzbV9hc3luY193cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlwcnRkLT5ieXRlc19zZW50ICs9IGJ1ZmZlcl9sZW5ndGg7Ci0JCWlmIChwcnRkLT5maXJzdF9idWZmZXIpCi0JCQlwcnRkLT5maXJzdF9idWZmZXIgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9yZWFkX2J1ZmZlcihzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkKQotewotCWludCBidWZmZXJfbGVuZ3RoOwotCXVpbnQ2NF90IGJ5dGVzX2F2YWlsYWJsZTsKLQl1aW50NjRfdCBidWZmZXJfc2VudDsKLQlzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gcGFyYW07Ci0JaW50IHJldDsKLQotCWlmICghYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgewotCQlwcl9lcnIoIiVzOiBzdHJlYW0gaXMgbm90IGluIHN0YXJ0ZWQgc3RhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYnVmZmVyX2xlbmd0aCA9IHBydGQtPmNvZGVjX3BhcmFtLmJ1ZmZlci5mcmFnbWVudF9zaXplIC0KLQkJCQkJCSBwcnRkLT50c19oZWFkZXJfb2Zmc2V0OwotCWJ5dGVzX2F2YWlsYWJsZSA9IHBydGQtPnJlY2VpdmVkX3RvdGFsIC0gcHJ0ZC0+Ynl0ZXNfY29waWVkOwotCWJ1ZmZlcl9zZW50ID0gcHJ0ZC0+Ynl0ZXNfcmVhZCAtIHBydGQtPmJ5dGVzX2NvcGllZDsKLQlpZiAoYnVmZmVyX3NlbnQgKyBidWZmZXJfbGVuZ3RoICsgcHJ0ZC0+dHNfaGVhZGVyX29mZnNldAotCQkJCQkJPiBwcnRkLT5idWZmZXJfc2l6ZSkgewotCQlwcl9kZWJ1ZygiICVzIDogQnVmZmVyIGlzIEZ1bGwgYnl0ZXNfYXZhaWxhYmxlOiAlbGx1XG4iLAotCQkJCV9fZnVuY19fLCBieXRlc19hdmFpbGFibGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltZW1zZXQoJnBhcmFtLCAweDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0pKTsKLQlwYXJhbS5wYWRkciA9IHBydGQtPmJ1ZmZlcl9wYWRkciArIHBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ICsKLQkJCQkJCXBydGQtPnRzX2hlYWRlcl9vZmZzZXQ7Ci0JcGFyYW0ubGVuID0gYnVmZmVyX2xlbmd0aDsKLQlwYXJhbS51aWQgPSBidWZmZXJfbGVuZ3RoOwotCXBhcmFtLmZsYWdzID0gcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBEU1AgYnl0ZV9vZmZzZXQgPSAlbGx1XG4iLAotCQkJX19mdW5jX18sIGJ1ZmZlcl9sZW5ndGgsIHBydGQtPmJ5dGVzX3JlYWQpOwotCXJldCA9IHE2YXNtX2FzeW5jX3JlYWQocHJ0ZC0+YXVkaW9fY2xpZW50LCAmcGFyYW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHE2YXNtX2FzeW5jX3JlYWQgZmFpbGVkIC0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJ0ZC0+Ynl0ZXNfcmVhZCArPSBidWZmZXJfbGVuZ3RoOwotCXBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ICs9IGJ1ZmZlcl9sZW5ndGg7Ci0JaWYgKHBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ID49IHBydGQtPmJ1ZmZlcl9zaXplKQotCQlwcnRkLT5ieXRlc19yZWFkX29mZnNldCAtPSBwcnRkLT5idWZmZXJfc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjb21wcl9ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwKLQkJdWludDMyX3QgdG9rZW4sIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQgPSBwcml2OwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCXVpbnQzMl90IGNoYW5fbW9kZSA9IDA7Ci0JdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwotCXVpbnQ2NF90IGJ5dGVzX2F2YWlsYWJsZTsKLQlpbnQgc3RyZWFtX2lkOwotCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQ2NF90IHJlYWRfc2l6ZTsKLQl1aW50MzJfdCAqYnVmZl9hZGRyOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlczogcHJ0ZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JY3N0cmVhbSA9IHBydGQtPmNzdHJlYW07Ci0JaWYgKCFjc3RyZWFtKSB7Ci0JCXByX2VycigiJXM6IGNzdHJlYW0gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0KLQkvKgotCSAqIFRva2VuIGZvciByZXN0IG9mIHRoZSBjb21wcmVzc2VkIGNvbW1hbmRzIHVzZSB0byBzZXQKLQkgKiBzZXNzaW9uIGlkLCBzdHJlYW0gaWQsIGRpciBldGMuCi0JICovCi0Jc3RyZWFtX2lkID0gcTZhc21fZ2V0X3N0cmVhbV9pZF9mcm9tX3Rva2VuKHRva2VuKTsKLQotCXByX2RlYnVnKCIlcyBvcGNvZGUgPSUwOHhcbiIsIF9fZnVuY19fLCBvcGNvZGUpOwotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChwYXlsb2FkWzNdKSB7Ci0JCQlwcl9lcnIoIiVzOiBXUklURSBGQUlMRUQgdy8gZXJyIDB4JXggISwgcGFkZHIgMHgleCwgYnl0ZV9vZmZzZXQ9JWQsY29waWVkX3RvdGFsPSVsbHUsdG9rZW49JWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJcGF5bG9hZFszXSwKLQkJCQlwYXlsb2FkWzBdLAotCQkJCXBydGQtPmJ5dGVfb2Zmc2V0LAotCQkJCXBydGQtPmNvcGllZF90b3RhbCwgdG9rZW4pOwotCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJnBydGQtPmRyYWluLCAxLCAwKSAmJgotCQkJICAgIHBydGQtPmxhc3RfYnVmZmVyKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiB3YWtlIHVwIG9uIGRyYWluXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcHJ0ZC0+ZHJhaW5fcmVhZHkgPSAxOwotCQkJCXdha2VfdXAoJnBydGQtPmRyYWluX3dhaXQpOwotCQkJCXBydGQtPmxhc3RfYnVmZmVyID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIkFTTV9EQVRBX0VWRU5UX1dSSVRFX0RPTkVfVjIgb2Zmc2V0ICVkLCBsZW5ndGggJWRcbiIsCi0JCQkJIHBydGQtPmJ5dGVfb2Zmc2V0LCB0b2tlbik7Ci0JCX0KLQotCQkvKgotCQkgKiBUb2tlbiBmb3IgV1JJVEUgY29tbWFuZCByZXByZXNlbnRzIHRoZSBhbW91bnQgb2YgZGF0YQotCQkgKiB3cml0dGVuIHRvIEFEU1AgaW4gdGhlIGxhc3Qgd3JpdGUsIHVwZGF0ZSBvZmZzZXQgYW5kCi0JCSAqIHRvdGFsIGNvcGllZCBkYXRhIGFjY29yZGluZ2x5LgotCQkgKi8KLQkJaWYgKHBydGQtPnRzX2hlYWRlcl9vZmZzZXQpIHsKLQkJCS8qIEFsd2F5cyBhc3N1bWUgdGhhdCB0aGUgZGF0YSB3aWxsIGJlIHNlbnQgdG8gRFNQIG9uCi0JCQkgKiBmcmFtZSBib3VuZGFyeS4KLQkJCSAqIGkuZSwgb25lIGZyYW1lIG9mIHVzZXJzcGFjZSB3cml0ZSB3aWxsIHJlc3VsdCBpbgotCQkJICogb25lIGtlcm5lbCB3cml0ZSB0byBEU1AuIFRoaXMgaXMgbmVlZGVkIGFzCi0JCQkgKiB0aW1lc3RhbXAgd2lsbCBiZSBzZW50IHBlciBmcmFtZS4KLQkJCSAqLwotCQkJcHJ0ZC0+Ynl0ZV9vZmZzZXQgKz0KLQkJCQkJcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCQlwcnRkLT5jb3BpZWRfdG90YWwgKz0KLQkJCQkJcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCX0gZWxzZSB7Ci0JCQlwcnRkLT5ieXRlX29mZnNldCArPSB0b2tlbjsKLQkJCXBydGQtPmNvcGllZF90b3RhbCArPSB0b2tlbjsKLQkJfQotCQlpZiAocHJ0ZC0+Ynl0ZV9vZmZzZXQgPj0gcHJ0ZC0+YnVmZmVyX3NpemUpCi0JCQlwcnRkLT5ieXRlX29mZnNldCAtPSBwcnRkLT5idWZmZXJfc2l6ZTsKLQotCQlzbmRfY29tcHJfZnJhZ21lbnRfZWxhcHNlZChjc3RyZWFtKTsKLQotCQlpZiAoIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKLQkJCS8qIFdyaXRlcyBtdXN0IGJlIHJlc3RhcnRlZCBmcm9tIF9jb3B5KCkgKi8KLQkJCXByX2RlYnVnKCJ3cml0ZV9kb25lIHJlY2VpdmVkIHdoaWxlIG5vdCBzdGFydGVkLCB0cmVhdCBhcyB4cnVuIik7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT54cnVuLCAxKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYnl0ZXNfYXZhaWxhYmxlID0gcHJ0ZC0+Ynl0ZXNfcmVjZWl2ZWQgLSBwcnRkLT5jb3BpZWRfdG90YWw7Ci0JCWlmIChieXRlc19hdmFpbGFibGUgPCBjc3RyZWFtLT5ydW50aW1lLT5mcmFnbWVudF9zaXplKSB7Ci0JCQlwcl9kZWJ1ZygiV1JJVEVfRE9ORSBJbnN1ZmZpY2llbnQgZGF0YSB0byBzZW5kLiBicmVhayBvdXRcbiIpOwotCQkJYXRvbWljX3NldCgmcHJ0ZC0+eHJ1biwgMSk7Ci0KLQkJCWlmIChwcnRkLT5sYXN0X2J1ZmZlcikKLQkJCQlwcnRkLT5sYXN0X2J1ZmZlciA9IDA7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmRyYWluKSkgewotCQkJCXByX2RlYnVnKCJ3YWtlIHVwIG9uIGRyYWluXG4iKTsKLQkJCQlwcnRkLT5kcmFpbl9yZWFkeSA9IDE7Ci0JCQkJd2FrZV91cCgmcHJ0ZC0+ZHJhaW5fd2FpdCk7Ci0JCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKChieXRlc19hdmFpbGFibGUgPT0gY3N0cmVhbS0+cnVudGltZS0+ZnJhZ21lbnRfc2l6ZSkKLQkJCSAgICYmIGF0b21pY19yZWFkKCZwcnRkLT5kcmFpbikpIHsKLQkJCXBydGQtPmxhc3RfYnVmZmVyID0gMTsKLQkJCW1zbV9jb21wcl9zZW5kX2J1ZmZlcihwcnRkKTsKLQkJCXBydGQtPmxhc3RfYnVmZmVyID0gMDsKLQkJfSBlbHNlCi0JCQltc21fY29tcHJfc2VuZF9idWZmZXIocHJ0ZCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOgotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjIgb2Zmc2V0ICVkLCBsZW5ndGggJWRcbiIsCi0JCQkJIHBydGQtPmJ5dGVfb2Zmc2V0LCBwYXlsb2FkWzRdKTsKLQotCQlpZiAocHJ0ZC0+dHNfaGVhZGVyX29mZnNldCkgewotCQkJLyogVXBkYXRlIHRoZSBoZWFkZXIgZm9yIHJlY2VpdmVkIGJ1ZmZlciAqLwotCQkJYnVmZl9hZGRyID0gcHJ0ZC0+YnVmZmVyICsgcHJ0ZC0+Ynl0ZV9vZmZzZXQ7Ci0JCQkvKiBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKi8KLQkJCSpidWZmX2FkZHIgPSBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRfc2l6ZQotCQkJCQkJIC0gcHJ0ZC0+dHNfaGVhZGVyX29mZnNldDsKLQkJCWJ1ZmZfYWRkcisrOwotCQkJLyogV3JpdGUgdGhlIG9mZnNldCAqLwotCQkJKmJ1ZmZfYWRkciA9IHBydGQtPnRzX2hlYWRlcl9vZmZzZXQ7Ci0JCQlidWZmX2FkZHIrKzsKLQkJCS8qIFdyaXRlIHRoZSBUUyBMU1cgKi8KLQkJCSpidWZmX2FkZHIgPSBwYXlsb2FkW0NBUFRVUkVfTUVUQV9EQVRBX1RTX09GRlNFVF9MU1ddOwotCQkJYnVmZl9hZGRyKys7Ci0JCQkvKiBXcml0ZSB0aGUgVFMgTVNXICovCi0JCQkqYnVmZl9hZGRyID0gcGF5bG9hZFtDQVBUVVJFX01FVEFfREFUQV9UU19PRkZTRVRfTVNXXTsKLQkJfQotCQkvKiBBbHdheXMgYXNzdW1lIHJlYWRfc2l6ZSBpcyBzYW1lIGFzIGZyYWdtZW50X3NpemUgKi8KLQkJcmVhZF9zaXplID0gcHJ0ZC0+Y29kZWNfcGFyYW0uYnVmZmVyLmZyYWdtZW50X3NpemU7Ci0JCXBydGQtPmJ5dGVfb2Zmc2V0ICs9IHJlYWRfc2l6ZTsKLQkJcHJ0ZC0+cmVjZWl2ZWRfdG90YWwgKz0gcmVhZF9zaXplOwotCQlpZiAocHJ0ZC0+Ynl0ZV9vZmZzZXQgPj0gcHJ0ZC0+YnVmZmVyX3NpemUpCi0JCQlwcnRkLT5ieXRlX29mZnNldCAtPSBwcnRkLT5idWZmZXJfc2l6ZTsKLQotCQlzbmRfY29tcHJfZnJhZ21lbnRfZWxhcHNlZChjc3RyZWFtKTsKLQotCQlpZiAoIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKLQkJCXByX2RlYnVnKCJyZWFkX2RvbmUgcmVjZWl2ZWQgd2hpbGUgbm90IHN0YXJ0ZWQsIHRyZWF0IGFzIHhydW4iKTsKLQkJCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXNtX2NvbXByX3JlYWRfYnVmZmVyKHBydGQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFTTV9EQVRBX0VWRU5UX1JFTkRFUkVEX0VPUzoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJcHJfZGVidWcoIiVzOiBBU01fREFUQV9DTURSU1BfRU9TIHRva2VuIDB4JXgsc3RyZWFtIGlkICVkXG4iLAotCQkJICBfX2Z1bmNfXywgdG9rZW4sIHN0cmVhbV9pZCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZW9zKSAmJgotCQkgICAgIXBydGQtPmdhcGxlc3Nfc3RhdGUuc2V0X25leHRfc3RyZWFtX2lkKSB7Ci0JCQlwcl9kZWJ1ZygiQVNNX0RBVEFfQ01EUlNQX0VPUyB3YWtlIHVwXG4iKTsKLQkJCXBydGQtPmVvc19hY2sgPSAxOwotCQkJd2FrZV91cCgmcHJ0ZC0+ZW9zX3dhaXQpOwotCQl9Ci0JCWF0b21pY19zZXQoJnBydGQtPmVvcywgMCk7Ci0JCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChzdHJlYW1faWQpOwotCQlpZiAoc3RyZWFtX2luZGV4ID49IE1BWF9OVU1CRVJfT0ZfU1RSRUFNUyB8fAotCQkgICAgc3RyZWFtX2luZGV4IDwgMCkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBzdHJlYW0gaW5kZXggJWQiLCBfX2Z1bmNfXywKLQkJCQlzdHJlYW1faW5kZXgpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zZXRfbmV4dF9zdHJlYW1faWQgJiYKLQkJCXBydGQtPmdhcGxlc3Nfc3RhdGUuc3RyZWFtX29wZW5lZFtzdHJlYW1faW5kZXhdKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IENNRF9DTE9TRSBzdHJlYW1faWQgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgc3RyZWFtX2lkKTsKLQkJCXE2YXNtX3N0cmVhbV9jbWRfbm93YWl0KGFjLCBDTURfQ0xPU0UsIHN0cmVhbV9pZCk7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT5jbG9zZSwgMSk7Ci0JCQlwcnRkLT5nYXBsZXNzX3N0YXRlLnN0cmVhbV9vcGVuZWRbc3RyZWFtX2luZGV4XSA9IDA7Ci0JCQlwcnRkLT5nYXBsZXNzX3N0YXRlLnNldF9uZXh0X3N0cmVhbV9pZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbikKLQkJCXBydGQtPmdhcGxlc3Nfc3RhdGUuZ2FwbGVzc190cmFuc2l0aW9uID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlicmVhazsKLQljYXNlIEFTTV9TVFJFQU1fUFBfRVZFTlQ6Ci0JY2FzZSBBU01fU1RSRUFNX0NNRF9FTkNERUNfRVZFTlRTOgotCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fRVZFTlQoMHgleClcbiIsIF9fZnVuY19fLCBvcGNvZGUpOwotCQlydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCWlmICghcnRkKSB7Ci0JCQlwcl9lcnIoIiVzOiBydGQgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmV0ID0gbXNtX2Fkc3BfaW5mb3JtX21peGVyX2N0bChydGQsIHBheWxvYWQpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gaW5mb3JtIG1peGVyIGN0cmwuIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWToKLQljYXNlIEFTTV9EQVRBX0VWRU5UX0VOQ19TUl9DTV9DSEFOR0VfTk9USUZZOiB7Ci0JCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZXG4iKTsKLQkJY2hhbl9tb2RlID0gcGF5bG9hZFsxXSA+PiAxNjsKLQkJc2FtcGxlX3JhdGUgPSBwYXlsb2FkWzJdID4+IDE2OwotCQlpZiAocHJ0ZCAmJiAoY2hhbl9tb2RlICE9IHBydGQtPm51bV9jaGFubmVscyB8fAotCQkJCXNhbXBsZV9yYXRlICE9IHBydGQtPnNhbXBsZV9yYXRlKSkgewotCQkJcHJ0ZC0+bnVtX2NoYW5uZWxzID0gY2hhbl9tb2RlOwotCQkJcHJ0ZC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKLQkJfQotCX0KLQkJLyogRmFsbHRocm91Z2ggaGVyZSAqLwotCWNhc2UgQVBSX0JBU0lDX1JTUF9SRVNVTFQ6IHsKLQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7Ci0JCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JVTl9WMjoKLQkJCS8qIGNoZWNrIGlmIHRoZSBmaXJzdCBidWZmZXIgbmVlZCB0byBiZSBzZW50IHRvIERTUCAqLwotCQkJcHJfZGVidWcoIkFTTV9TRVNTSU9OX0NNRF9SVU5fVjJcbiIpOwotCi0JCQkvKiBGSVhNRTogQSBzdGF0ZSBpcyBhIGJldHRlciB3YXksIGRlYWxpbmcgd2l0aCB0aGlzICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKSB7Ci0JCQkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDEpOwotCQkJCW1zbV9jb21wcl9yZWFkX2J1ZmZlcihwcnRkKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICghcHJ0ZC0+Ynl0ZXNfc2VudCkgewotCQkJCWJ5dGVzX2F2YWlsYWJsZSA9IHBydGQtPmJ5dGVzX3JlY2VpdmVkIC0KLQkJCQkJCSAgcHJ0ZC0+Y29waWVkX3RvdGFsOwotCQkJCWlmIChieXRlc19hdmFpbGFibGUgPAotCQkJCSAgICBjc3RyZWFtLT5ydW50aW1lLT5mcmFnbWVudF9zaXplKSB7Ci0JCQkJCXByX2RlYnVnKCJDTURfUlVOX1YyIEluc3VmZmljaWVudCBkYXRhIHRvIHNlbmQuIGJyZWFrIG91dFxuIik7Ci0JCQkJCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1zbV9jb21wcl9zZW5kX2J1ZmZlcihwcnRkKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBUaGUgY29uZGl0aW9uIGJlbG93IGVuc3VyZXMgcGxheWJhY2sgZmluaXNoZXMgaW4gdGhlCi0JCQkgKiBmb2xsb3cgY29ybmVyY2FzZQotCQkJICogV1JJVEUobGFzdCBidWZmZXIpCi0JCQkgKiBXQUlUX0ZPUl9EUkFJTgotCQkJICogUEFVU0UKLQkJCSAqIFdSSVRFX0RPTkUoWCkKLQkJCSAqIFJFU1VNRQotCQkJICovCi0JCQlpZiAoKHBydGQtPmNvcGllZF90b3RhbCA9PSBwcnRkLT5ieXRlc19zZW50KSAmJgotCQkJICAgIGF0b21pY19yZWFkKCZwcnRkLT5kcmFpbikpIHsKLQkJCQlwcl9kZWJ1ZygiUlVOIGFjaywgd2FrZSB1cCAmIGNvbnRpbnVlIHBlbmRpbmcgZHJhaW5cbiIpOwotCi0JCQkJaWYgKHBydGQtPmxhc3RfYnVmZmVyKQotCQkJCQlwcnRkLT5sYXN0X2J1ZmZlciA9IDA7Ci0KLQkJCQlwcnRkLT5kcmFpbl9yZWFkeSA9IDE7Ci0JCQkJd2FrZV91cCgmcHJ0ZC0+ZHJhaW5fd2FpdCk7Ci0JCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDApOwotCQkJfQotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9GTFVTSDoKLQkJCXByX2RlYnVnKCIlczogQVNNX1NUUkVBTV9DTURfRkxVU0g6IiwgX19mdW5jX18pOwotCQkJcHJfZGVidWcoInRva2VuIDB4JXgsIHN0cmVhbSBpZCAlZFxuIiwgdG9rZW4sCi0JCQkJICBzdHJlYW1faWQpOwotCQkJcHJ0ZC0+Y21kX2FjayA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBBU01fREFUQV9DTURfUkVNT1ZFX0lOSVRJQUxfU0lMRU5DRToKLQkJCXByX2RlYnVnKCIlczogQVNNX0RBVEFfQ01EX1JFTU9WRV9JTklUSUFMX1NJTEVOQ0U6IiwKLQkJCQkgICBfX2Z1bmNfXyk7Ci0JCQlwcl9kZWJ1ZygidG9rZW4gMHgleCwgc3RyZWFtIGlkID0gJWRcbiIsIHRva2VuLAotCQkJCSAgc3RyZWFtX2lkKTsKLQkJCWJyZWFrOwotCQljYXNlIEFTTV9EQVRBX0NNRF9SRU1PVkVfVFJBSUxJTkdfU0lMRU5DRToKLQkJCXByX2RlYnVnKCIlczogQVNNX0RBVEFfQ01EX1JFTU9WRV9UUkFJTElOR19TSUxFTkNFOiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCQlwcl9kZWJ1ZygidG9rZW4gPSAweCV4LAlzdHJlYW0gaWQgPSAlZFxuIiwgdG9rZW4sCi0JCQkJICBzdHJlYW1faWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfQ0xPU0U6Ci0JCQlwcl9kZWJ1ZygiJXM6IEFTTV9EQVRBX0NNRF9DTE9TRToiLCBfX2Z1bmNfXyk7Ci0JCQlwcl9kZWJ1ZygidG9rZW4gMHgleCwgc3RyZWFtIGlkICVkXG4iLCB0b2tlbiwKLQkJCQkgIHN0cmVhbV9pZCk7Ci0JCQkvKgotCQkJICogd2FrZXVwIHdhaXQgZm9yIHN0cmVhbSBhdmFpbCBvbiBzdHJlYW0gMwotCQkJICogYWZ0ZXIgc3RyZWFtIDEgZW5kcy4KLQkJCSAqLwotCQkJaWYgKHBydGQtPm5leHRfc3RyZWFtKSB7Ci0JCQkJcHJfZGVidWcoIiVzOkNMT1NFOndha2V1cCB3YWl0IGZvciBzdHJlYW1cbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCQkJCXBydGQtPnN0cmVhbV9hdmFpbGFibGUgPSAxOwotCQkJCXdha2VfdXAoJnBydGQtPndhaXRfZm9yX3N0cmVhbV9hdmFpbCk7Ci0JCQkJcHJ0ZC0+bmV4dF9zdHJlYW0gPSAwOwotCQkJfQotCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5jbG9zZSkgJiYKLQkJCSAgICBhdG9taWNfcmVhZCgmcHJ0ZC0+d2FpdF9vbl9jbG9zZSkpIHsKLQkJCQlwcnRkLT5jbWRfYWNrID0gMTsKLQkJCQl3YWtlX3VwKCZwcnRkLT5jbG9zZV93YWl0KTsKLQkJCX0KLQkJCWF0b21pY19zZXQoJnBydGQtPmNsb3NlLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIEFTTV9TVFJFQU1fQ01EX1JFR0lTVEVSX1BQX0VWRU5UUzoKLQkJCXByX2RlYnVnKCIlczogQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfUFBfRVZFTlRTOiIsCi0JCQkJX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1NFU1NJT05USU1FX1YzOgotCQlwcl9kZWJ1ZygiJXM6IEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTlRJTUVfVjNcbiIsCi0JCQkgIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBSRVNFVF9FVkVOVFM6Ci0JCXByX2VycigiJXM6IFJlY2VpdmVkIHJlc2V0IGV2ZW50cyBDQiwgbW92ZSB0byBlcnJvciBzdGF0ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCS8qCi0JCSAqIFNpbmNlIEFEU1AgaXMgZG93biwgbGV0IHRoaXMgZHJpdmVyIHByZXRlbmQgdGhhdCBpdCBjb3BpZWQKLQkJICogYWxsIHRoZSBieXRlcyByZWNlaXZlZCwgc28gdGhhdCBuZXh0IHdyaXRlIHdpbGwgYmUgdHJpZ2dlcmVkCi0JCSAqLwotCQlwcnRkLT5jb3BpZWRfdG90YWwgPSBwcnRkLT5ieXRlc19yZWNlaXZlZDsKLQkJc25kX2NvbXByX2ZyYWdtZW50X2VsYXBzZWQoY3N0cmVhbSk7Ci0JCWF0b21pY19zZXQoJnBydGQtPmVycm9yLCAxKTsKLQkJd2FrZV91cCgmcHJ0ZC0+ZHJhaW5fd2FpdCk7Ci0JCWlmIChhdG9taWNfY21weGNoZygmcHJ0ZC0+ZW9zLCAxLCAwKSkgewotCQkJcHJfZGVidWcoIiVzOnVuYmxvY2sgZW9zIHdhaXQgcXVldWVzIiwgX19mdW5jX18pOwotCQkJd2FrZV91cCgmcHJ0ZC0+ZW9zX3dhaXQpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBOb3QgU3VwcG9ydGVkIEV2ZW50IG9wY29kZVsweCV4XVxuIiwKLQkJCSAgX19mdW5jX18sIG9wY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfZ2V0X3BhcnRpYWxfZHJhaW5fZGVsYXkoaW50IGZyYW1lX3N6LCBpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IGRlbGF5X3RpbWVfbXMgPSAwOwotCi0JZGVsYXlfdGltZV9tcyA9ICgoRFNQX05VTV9PVVRQVVRfRlJBTUVfQlVGRkVSRUQgKiBmcmFtZV9zeiAqIDEwMDApIC8KLQkJCXNhbXBsZV9yYXRlKSArIERTUF9QUF9CVUZGRVJJTkdfSU5fTVNFQzsKLQlkZWxheV90aW1lX21zID0gZGVsYXlfdGltZV9tcyA+IFBBUlRJQUxfRFJBSU5fQUNLX0VBUkxZX0JZX01TRUMgPwotCQkJZGVsYXlfdGltZV9tcyAtIFBBUlRJQUxfRFJBSU5fQUNLX0VBUkxZX0JZX01TRUMgOiAwOwotCi0JcHJfZGVidWcoIiVzOiBmcmFtZV9zeiAlZCwgc2FtcGxlX3JhdGUgJWQsIHBhcnRpYWwgZHJhaW4gZGVsYXkgJWRcbiIsCi0JCV9fZnVuY19fLCBmcmFtZV9zeiwgc2FtcGxlX3JhdGUsIGRlbGF5X3RpbWVfbXMpOwotCXJldHVybiBkZWxheV90aW1lX21zOwotfQotCi1zdGF0aWMgdm9pZCBwb3B1bGF0ZV9jb2RlY19saXN0KHN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQpCi17Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmRpcmVjdGlvbiA9IFNORF9DT01QUkVTU19QTEFZQkFDSzsKLQlwcnRkLT5jb21wcl9jYXAubWluX2ZyYWdtZW50X3NpemUgPQotCQkJQ09NUFJfUExBWUJBQ0tfTUlOX0ZSQUdNRU5UX1NJWkU7Ci0JcHJ0ZC0+Y29tcHJfY2FwLm1heF9mcmFnbWVudF9zaXplID0KLQkJCUNPTVBSX1BMQVlCQUNLX01BWF9GUkFHTUVOVF9TSVpFOwotCXBydGQtPmNvbXByX2NhcC5taW5fZnJhZ21lbnRzID0KLQkJCUNPTVBSX1BMQVlCQUNLX01JTl9OVU1fRlJBR01FTlRTOwotCXBydGQtPmNvbXByX2NhcC5tYXhfZnJhZ21lbnRzID0KLQkJCUNPTVBSX1BMQVlCQUNLX01BWF9OVU1fRlJBR01FTlRTOwotCXBydGQtPmNvbXByX2NhcC5udW1fY29kZWNzID0gMTc7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1swXSA9IFNORF9BVURJT0NPREVDX01QMzsKLQlwcnRkLT5jb21wcl9jYXAuY29kZWNzWzFdID0gU05EX0FVRElPQ09ERUNfQUFDOwotCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMl0gPSBTTkRfQVVESU9DT0RFQ19BQzM7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1szXSA9IFNORF9BVURJT0NPREVDX0VBQzM7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1s0XSA9IFNORF9BVURJT0NPREVDX01QMjsKLQlwcnRkLT5jb21wcl9jYXAuY29kZWNzWzVdID0gU05EX0FVRElPQ09ERUNfUENNOwotCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbNl0gPSBTTkRfQVVESU9DT0RFQ19XTUE7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1s3XSA9IFNORF9BVURJT0NPREVDX1dNQV9QUk87Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1s4XSA9IFNORF9BVURJT0NPREVDX0ZMQUM7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1s5XSA9IFNORF9BVURJT0NPREVDX1ZPUkJJUzsKLQlwcnRkLT5jb21wcl9jYXAuY29kZWNzWzEwXSA9IFNORF9BVURJT0NPREVDX0FMQUM7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1sxMV0gPSBTTkRfQVVESU9DT0RFQ19BUEU7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1sxMl0gPSBTTkRfQVVESU9DT0RFQ19EVFM7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1sxM10gPSBTTkRfQVVESU9DT0RFQ19EU0Q7Ci0JcHJ0ZC0+Y29tcHJfY2FwLmNvZGVjc1sxNF0gPSBTTkRfQVVESU9DT0RFQ19BUFRYOwotCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMTVdID0gU05EX0FVRElPQ09ERUNfVFJVRUhEOwotCXBydGQtPmNvbXByX2NhcC5jb2RlY3NbMTZdID0gU05EX0FVRElPQ09ERUNfSUVDNjE5Mzc7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3NlbmRfbWVkaWFfZm9ybWF0X2Jsb2NrKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQkgICAgIGludCBzdHJlYW1faWQsCi0JCQkJCSAgICAgYm9vbCB1c2VfZ2FwbGVzc19jb2RlY19vcHRpb25zKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhID0KLQkJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0Jc3RydWN0IGFzbV9hYWNfY2ZnIGFhY19jZmc7Ci0Jc3RydWN0IGFzbV93bWFfY2ZnIHdtYV9jZmc7Ci0Jc3RydWN0IGFzbV93bWFwcm9fY2ZnIHdtYV9wcm9fY2ZnOwotCXN0cnVjdCBhc21fZmxhY19jZmcgZmxhY19jZmc7Ci0Jc3RydWN0IGFzbV92b3JiaXNfY2ZnIHZvcmJpc19jZmc7Ci0Jc3RydWN0IGFzbV9hbGFjX2NmZyBhbGFjX2NmZzsKLQlzdHJ1Y3QgYXNtX2FwZV9jZmcgYXBlX2NmZzsKLQlzdHJ1Y3QgYXNtX2RzZF9jZmcgZHNkX2NmZzsKLQlzdHJ1Y3QgYXB0eF9kZWNfYnRfYWRkcl9jZmcgYXB0eF9jZmc7Ci0JdW5pb24gc25kX2NvZGVjX29wdGlvbnMgKmNvZGVjX29wdGlvbnM7Ci0KLQlpbnQgcmV0ID0gMDsKLQl1aW50MTZfdCBiaXRfd2lkdGg7Ci0JYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCA9IHRydWU7Ci0JY2hhciAqY2htYXAgPSBOVUxMOwotCXVpbnQxNl90IHNhbXBsZV93b3JkX3NpemU7Ci0KLQlwcl9kZWJ1ZygiJXM6IHVzZV9nYXBsZXNzX2NvZGVjX29wdGlvbnMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdXNlX2dhcGxlc3NfY29kZWNfb3B0aW9ucyk7Ci0KLQlpZiAodXNlX2dhcGxlc3NfY29kZWNfb3B0aW9ucykKLQkJY29kZWNfb3B0aW9ucyA9ICYocHJ0ZC0+Z2FwbGVzc19zdGF0ZS5jb2RlY19vcHRpb25zKTsKLQllbHNlCi0JCWNvZGVjX29wdGlvbnMgPSAmKHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLm9wdGlvbnMpOwotCi0JaWYgKCFjb2RlY19vcHRpb25zKSB7Ci0JCXByX2VycigiJXM6IGNvZGVjX29wdGlvbnMgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKHBydGQtPmNvZGVjKSB7Ci0JY2FzZSBGT1JNQVRfTElORUFSX1BDTToKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX1BDTVxuIik7Ci0JCWlmIChwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmlkXSkgewotCQkJdXNlX2RlZmF1bHRfY2htYXAgPQotCQkJICAgICEocGRhdGEtPmNoX21hcFtydGQtPmRhaV9saW5rLT5pZF0tPnNldF9jaF9tYXApOwotCQkJY2htYXAgPQotCQkJICAgIHBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdLT5jaGFubmVsX21hcDsKLQkJfQotCi0JCXN3aXRjaCAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0KSB7Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCQliaXRfd2lkdGggPSAzMjsKLQkJCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKLQkJCWJyZWFrOwotCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQkJYml0X3dpZHRoID0gMjQ7Ci0JCQlzYW1wbGVfd29yZF9zaXplID0gMzI7Ci0JCQlicmVhazsKLQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCQliaXRfd2lkdGggPSAyNDsKLQkJCXNhbXBsZV93b3JkX3NpemUgPSAyNDsKLQkJCWJyZWFrOwotCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQlkZWZhdWx0OgotCQkJYml0X3dpZHRoID0gMTY7Ci0JCQlzYW1wbGVfd29yZF9zaXplID0gMTY7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0KAotCQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCQlwcnRkLT5zYW1wbGVfcmF0ZSwKLQkJCQkJCQlwcnRkLT5udW1fY2hhbm5lbHMsCi0JCQkJCQkJYml0X3dpZHRoLCBzdHJlYW1faWQsCi0JCQkJCQkJdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCQkJY2htYXAsCi0JCQkJCQkJc2FtcGxlX3dvcmRfc2l6ZSwKLQkJCQkJCQlBU01fTElUVExFX0VORElBTiwKLQkJCQkJCQlERUZBVUxUX1FGKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0JCWJyZWFrOwotCWNhc2UgRk9STUFUX01QMzoKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX01QM1xuIik7Ci0JCS8qIG5vIG1lZGlhIGZvcm1hdCBibG9jayBuZWVkZWQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfQUFDXG4iKTsKLQkJbWVtc2V0KCZhYWNfY2ZnLCAweDAsIHNpemVvZihzdHJ1Y3QgYXNtX2FhY19jZmcpKTsKLQkJYWFjX2NmZy5hb3QgPSBBQUNfRU5DX01PREVfRUFBQ19QOwotCQlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09Ci0JCQkJCVNORF9BVURJT1NUUkVBTUZPUk1BVF9NUDRBRFRTKQotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDA7Ci0JCWVsc2UgaWYgKHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmZvcm1hdCA9PQotCQkJCQlTTkRfQVVESU9TVFJFQU1GT1JNQVRfTVA0TEFUTSkKLQkJCWFhY19jZmcuZm9ybWF0ID0gMHgwNDsKLQkJZWxzZQotCQkJYWFjX2NmZy5mb3JtYXQgPSAweDAzOwotCQlhYWNfY2ZnLmNoX2NmZyA9IHBydGQtPm51bV9jaGFubmVsczsKLQkJYWFjX2NmZy5zYW1wbGVfcmF0ZSA9IHBydGQtPnNhbXBsZV9yYXRlOwotCQlyZXQgPSBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX2FhYyhwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkJICAmYWFjX2NmZywgc3RyZWFtX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BQzM6Ci0JCXByX2RlYnVnKCJTTkRfQVVESU9DT0RFQ19BQzNcbiIpOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FQUMzOgotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfRUFDM1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1dNQV9WOToKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX1dNQVxuIik7Ci0JCW1lbXNldCgmd21hX2NmZywgMHgwLCBzaXplb2Yoc3RydWN0IGFzbV93bWFfY2ZnKSk7Ci0JCXdtYV9jZmcuZm9ybWF0X3RhZyA9IHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmZvcm1hdDsKLQkJd21hX2NmZy5jaF9jZmcgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jaF9pbjsKLQkJd21hX2NmZy5zYW1wbGVfcmF0ZSA9IHBydGQtPnNhbXBsZV9yYXRlOwotCQl3bWFfY2ZnLmF2Z19ieXRlc19wZXJfc2VjID0gY29kZWNfb3B0aW9ucy0+d21hLmF2Z19iaXRfcmF0ZS84OwotCQl3bWFfY2ZnLmJsb2NrX2FsaWduID0gY29kZWNfb3B0aW9ucy0+d21hLnN1cGVyX2Jsb2NrX2FsaWduOwotCQl3bWFfY2ZnLnZhbGlkX2JpdHNfcGVyX3NhbXBsZSA9Ci0JCQljb2RlY19vcHRpb25zLT53bWEuYml0c19wZXJfc2FtcGxlOwotCQl3bWFfY2ZnLmNoX21hc2sgPSBjb2RlY19vcHRpb25zLT53bWEuY2hhbm5lbG1hc2s7Ci0JCXdtYV9jZmcuZW5jb2RlX29wdCA9IGNvZGVjX29wdGlvbnMtPndtYS5lbmNvZGVvcHQ7Ci0JCXJldCA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWEocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQkmd21hX2NmZywgc3RyZWFtX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9XTUFfVjEwUFJPOgotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfV01BX1BST1xuIik7Ci0JCW1lbXNldCgmd21hX3Byb19jZmcsIDB4MCwgc2l6ZW9mKHN0cnVjdCBhc21fd21hcHJvX2NmZykpOwotCQl3bWFfcHJvX2NmZy5mb3JtYXRfdGFnID0gcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0OwotCQl3bWFfcHJvX2NmZy5jaF9jZmcgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jaF9pbjsKLQkJd21hX3Byb19jZmcuc2FtcGxlX3JhdGUgPSBwcnRkLT5zYW1wbGVfcmF0ZTsKLQkJd21hX2NmZy5hdmdfYnl0ZXNfcGVyX3NlYyA9IGNvZGVjX29wdGlvbnMtPndtYS5hdmdfYml0X3JhdGUvODsKLQkJd21hX3Byb19jZmcuYmxvY2tfYWxpZ24gPSBjb2RlY19vcHRpb25zLT53bWEuc3VwZXJfYmxvY2tfYWxpZ247Ci0JCXdtYV9wcm9fY2ZnLnZhbGlkX2JpdHNfcGVyX3NhbXBsZSA9Ci0JCQljb2RlY19vcHRpb25zLT53bWEuYml0c19wZXJfc2FtcGxlOwotCQl3bWFfcHJvX2NmZy5jaF9tYXNrID0gY29kZWNfb3B0aW9ucy0+d21hLmNoYW5uZWxtYXNrOwotCQl3bWFfcHJvX2NmZy5lbmNvZGVfb3B0ID0gY29kZWNfb3B0aW9ucy0+d21hLmVuY29kZW9wdDsKLQkJd21hX3Byb19jZmcuYWR2X2VuY29kZV9vcHQgPSBjb2RlY19vcHRpb25zLT53bWEuZW5jb2Rlb3B0MTsKLQkJd21hX3Byb19jZmcuYWR2X2VuY29kZV9vcHQyID0gY29kZWNfb3B0aW9ucy0+d21hLmVuY29kZW9wdDI7Ci0JCXJldCA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWFwcm8ocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCSZ3bWFfcHJvX2NmZywgc3RyZWFtX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9NUDI6Ci0JCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfTVAyXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0ZMQUM6Ci0JCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfRkxBQ1xuIiwgX19mdW5jX18pOwotCQltZW1zZXQoJmZsYWNfY2ZnLCAweDAsIHNpemVvZihzdHJ1Y3QgYXNtX2ZsYWNfY2ZnKSk7Ci0JCWZsYWNfY2ZnLmNoX2NmZyA9IHBydGQtPm51bV9jaGFubmVsczsKLQkJZmxhY19jZmcuc2FtcGxlX3JhdGUgPSBwcnRkLT5zYW1wbGVfcmF0ZTsKLQkJZmxhY19jZmcuc3RyZWFtX2luZm9fcHJlc2VudCA9IDE7Ci0JCWZsYWNfY2ZnLnNhbXBsZV9zaXplID0gY29kZWNfb3B0aW9ucy0+ZmxhY19kZWMuc2FtcGxlX3NpemU7Ci0JCWZsYWNfY2ZnLm1pbl9ibGtfc2l6ZSA9IGNvZGVjX29wdGlvbnMtPmZsYWNfZGVjLm1pbl9ibGtfc2l6ZTsKLQkJZmxhY19jZmcubWF4X2Jsa19zaXplID0gY29kZWNfb3B0aW9ucy0+ZmxhY19kZWMubWF4X2Jsa19zaXplOwotCQlmbGFjX2NmZy5tYXhfZnJhbWVfc2l6ZSA9Ci0JCQljb2RlY19vcHRpb25zLT5mbGFjX2RlYy5tYXhfZnJhbWVfc2l6ZTsKLQkJZmxhY19jZmcubWluX2ZyYW1lX3NpemUgPQotCQkJY29kZWNfb3B0aW9ucy0+ZmxhY19kZWMubWluX2ZyYW1lX3NpemU7Ci0KLQkJcmV0ID0gcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19mbGFjKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCQkmZmxhY19jZmcsIHN0cmVhbV9pZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogQ01EIEZvcm1hdCBibG9jayBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCi0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1ZPUkJJUzoKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19WT1JCSVNcbiIsIF9fZnVuY19fKTsKLQkJbWVtc2V0KCZ2b3JiaXNfY2ZnLCAweDAsIHNpemVvZihzdHJ1Y3QgYXNtX3ZvcmJpc19jZmcpKTsKLQkJdm9yYmlzX2NmZy5iaXRfc3RyZWFtX2ZtdCA9Ci0JCQljb2RlY19vcHRpb25zLT52b3JiaXNfZGVjLmJpdF9zdHJlYW1fZm10OwotCi0JCXJldCA9IHE2YXNtX3N0cmVhbV9tZWRpYV9mb3JtYXRfYmxvY2tfdm9yYmlzKAotCQkJCQlwcnRkLT5hdWRpb19jbGllbnQsICZ2b3JiaXNfY2ZnLAotCQkJCQlzdHJlYW1faWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IENNRCBGb3JtYXQgYmxvY2sgZmFpbGVkIHJldCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfQUxBQzoKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19BTEFDXG4iLCBfX2Z1bmNfXyk7Ci0JCW1lbXNldCgmYWxhY19jZmcsIDB4MCwgc2l6ZW9mKHN0cnVjdCBhc21fYWxhY19jZmcpKTsKLQkJYWxhY19jZmcubnVtX2NoYW5uZWxzID0gcHJ0ZC0+bnVtX2NoYW5uZWxzOwotCQlhbGFjX2NmZy5zYW1wbGVfcmF0ZSA9IHBydGQtPnNhbXBsZV9yYXRlOwotCQlhbGFjX2NmZy5mcmFtZV9sZW5ndGggPSBjb2RlY19vcHRpb25zLT5hbGFjLmZyYW1lX2xlbmd0aDsKLQkJYWxhY19jZmcuY29tcGF0aWJsZV92ZXJzaW9uID0KLQkJCWNvZGVjX29wdGlvbnMtPmFsYWMuY29tcGF0aWJsZV92ZXJzaW9uOwotCQlhbGFjX2NmZy5iaXRfZGVwdGggPSBjb2RlY19vcHRpb25zLT5hbGFjLmJpdF9kZXB0aDsKLQkJYWxhY19jZmcucGIgPSBjb2RlY19vcHRpb25zLT5hbGFjLnBiOwotCQlhbGFjX2NmZy5tYiA9IGNvZGVjX29wdGlvbnMtPmFsYWMubWI7Ci0JCWFsYWNfY2ZnLmtiID0gY29kZWNfb3B0aW9ucy0+YWxhYy5rYjsKLQkJYWxhY19jZmcubWF4X3J1biA9IGNvZGVjX29wdGlvbnMtPmFsYWMubWF4X3J1bjsKLQkJYWxhY19jZmcubWF4X2ZyYW1lX2J5dGVzID0gY29kZWNfb3B0aW9ucy0+YWxhYy5tYXhfZnJhbWVfYnl0ZXM7Ci0JCWFsYWNfY2ZnLmF2Z19iaXRfcmF0ZSA9IGNvZGVjX29wdGlvbnMtPmFsYWMuYXZnX2JpdF9yYXRlOwotCQlhbGFjX2NmZy5jaGFubmVsX2xheW91dF90YWcgPQotCQkJY29kZWNfb3B0aW9ucy0+YWxhYy5jaGFubmVsX2xheW91dF90YWc7Ci0KLQkJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FsYWMocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQkJCSZhbGFjX2NmZywgc3RyZWFtX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZCByZXQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BUEU6Ci0JCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfQVBFXG4iLCBfX2Z1bmNfXyk7Ci0JCW1lbXNldCgmYXBlX2NmZywgMHgwLCBzaXplb2Yoc3RydWN0IGFzbV9hcGVfY2ZnKSk7Ci0JCWFwZV9jZmcubnVtX2NoYW5uZWxzID0gcHJ0ZC0+bnVtX2NoYW5uZWxzOwotCQlhcGVfY2ZnLnNhbXBsZV9yYXRlID0gcHJ0ZC0+c2FtcGxlX3JhdGU7Ci0JCWFwZV9jZmcuY29tcGF0aWJsZV92ZXJzaW9uID0KLQkJCWNvZGVjX29wdGlvbnMtPmFwZS5jb21wYXRpYmxlX3ZlcnNpb247Ci0JCWFwZV9jZmcuY29tcHJlc3Npb25fbGV2ZWwgPQotCQkJY29kZWNfb3B0aW9ucy0+YXBlLmNvbXByZXNzaW9uX2xldmVsOwotCQlhcGVfY2ZnLmZvcm1hdF9mbGFncyA9IGNvZGVjX29wdGlvbnMtPmFwZS5mb3JtYXRfZmxhZ3M7Ci0JCWFwZV9jZmcuYmxvY2tzX3Blcl9mcmFtZSA9IGNvZGVjX29wdGlvbnMtPmFwZS5ibG9ja3NfcGVyX2ZyYW1lOwotCQlhcGVfY2ZnLmZpbmFsX2ZyYW1lX2Jsb2NrcyA9Ci0JCQljb2RlY19vcHRpb25zLT5hcGUuZmluYWxfZnJhbWVfYmxvY2tzOwotCQlhcGVfY2ZnLnRvdGFsX2ZyYW1lcyA9IGNvZGVjX29wdGlvbnMtPmFwZS50b3RhbF9mcmFtZXM7Ci0JCWFwZV9jZmcuYml0c19wZXJfc2FtcGxlID0gY29kZWNfb3B0aW9ucy0+YXBlLmJpdHNfcGVyX3NhbXBsZTsKLQkJYXBlX2NmZy5zZWVrX3RhYmxlX3ByZXNlbnQgPQotCQkJY29kZWNfb3B0aW9ucy0+YXBlLnNlZWtfdGFibGVfcHJlc2VudDsKLQotCQlyZXQgPSBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYXBlKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCQkmYXBlX2NmZywgc3RyZWFtX2lkKTsKLQotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IENNRCBGb3JtYXQgYmxvY2sgZmFpbGVkIHJldCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0RUUzoKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX0RUU1xuIik7Ci0JCS8qIG5vIG1lZGlhIGZvcm1hdCBibG9jayBuZWVkZWQgKi8KLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfRFNEOgotCQlwcl9kZWJ1ZygiJXM6IFNORF9BVURJT0NPREVDX0RTRFxuIiwgX19mdW5jX18pOwotCQltZW1zZXQoJmRzZF9jZmcsIDB4MCwgc2l6ZW9mKHN0cnVjdCBhc21fZHNkX2NmZykpOwotCQlkc2RfY2ZnLm51bV9jaGFubmVscyA9IHBydGQtPm51bV9jaGFubmVsczsKLQkJZHNkX2NmZy5kc2RfZGF0YV9yYXRlID0gcHJ0ZC0+c2FtcGxlX3JhdGU7Ci0JCWRzZF9jZmcubnVtX3ZlcnNpb24gPSAwOwotCQlkc2RfY2ZnLmlzX2JpdHdpc2VfYmlnX2VuZGlhbiA9IDE7Ci0JCWRzZF9jZmcuZHNkX2NoYW5uZWxfYmxvY2tfc2l6ZSA9IDE7Ci0JCXJldCA9IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19kc2QocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQkJICAgJmRzZF9jZmcsIHN0cmVhbV9pZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogQ01EIERTRCBGb3JtYXQgYmxvY2sgZmFpbGVkIHJldCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfVFJVRUhEOgotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfVFJVRUhEXG4iKTsKLQkJLyogbm8gbWVkaWEgZm9ybWF0IGJsb2NrIG5lZWRlZCAqLwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9JRUM2MTkzNzoKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX0lFQzYxOTM3XG4iKTsKLQkJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2llYyhwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkgICBwcnRkLT5zYW1wbGVfcmF0ZSwKLQkJCQkJCSAgIHBydGQtPm51bV9jaGFubmVscyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogQ01EIElFQzYxOTM3IEZvcm1hdCBibG9jayBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BUFRYOgotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfQVBUWFxuIik7Ci0JCW1lbXNldCgmYXB0eF9jZmcsIDB4MCwgc2l6ZW9mKHN0cnVjdCBhcHR4X2RlY19idF9hZGRyX2NmZykpOwotCQlyZXQgPSBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwdHhfZGVjKAotCQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCQlwcnRkLT5zYW1wbGVfcmF0ZSwKLQkJCQkJCQlzdHJlYW1faWQpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCWFwdHhfY2ZnLm5hcCA9IGNvZGVjX29wdGlvbnMtPmFwdHhfZGVjLm5hcDsKLQkJCWFwdHhfY2ZnLnVhcCA9IGNvZGVjX29wdGlvbnMtPmFwdHhfZGVjLnVhcDsKLQkJCWFwdHhfY2ZnLmxhcCA9IGNvZGVjX29wdGlvbnMtPmFwdHhfZGVjLmxhcDsKLQkJCXE2YXNtX3NldF9hcHR4X2RlY19idF9hZGRyKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCQkmYXB0eF9jZmcpOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogQ01EIEZvcm1hdCBibG9jayBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCQkgX19mdW5jX18sIHJldCk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzLCB1bnN1cHBvcnRlZCBmb3JtYXQsIHNraXAiLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9pbml0X3BwX3BhcmFtcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQkgICAgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyBzb2Z0dm9sID0gewotCQkucGVyaW9kID0gU09GVF9WT0xVTUVfUEVSSU9ELAotCQkuc3RlcCA9IFNPRlRfVk9MVU1FX1NURVAsCi0JCS5yYW1waW5nY3VydmUgPSBTT0ZUX1ZPTFVNRV9DVVJWRV9MSU5FQVIsCi0JfTsKLQotCXN3aXRjaCAoYWMtPnRvcG9sb2d5KSB7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gcTZhc21fc2V0X3NvZnR2b2x1bWVfdjIoYWMsICZzb2Z0dm9sLAotCQkJCQkgICAgICBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jb25maWd1cmVfZHNwX2Zvcl9wbGF5YmFjawotCQkJKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JaW50IGRpciA9IElOLCByZXQgPSAwOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gcHJ0ZC0+YXVkaW9fY2xpZW50OwotCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKLQlzdHJ1Y3QgYXNtX3NvZnRwYXVzZV9wYXJhbXMgc29mdHBhdXNlID0gewotCQkuZW5hYmxlID0gU09GVF9QQVVTRV9FTkFCTEUsCi0JCS5wZXJpb2QgPSBTT0ZUX1BBVVNFX1BFUklPRCwKLQkJLnN0ZXAgPSBTT0ZUX1BBVVNFX1NURVAsCi0JCS5yYW1waW5nY3VydmUgPSBTT0ZUX1BBVVNFX0NVUlZFX0xJTkVBUiwKLQl9OwotCXN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgc29mdHZvbCA9IHsKLQkJLnBlcmlvZCA9IFNPRlRfVk9MVU1FX1BFUklPRCwKLQkJLnN0ZXAgPSBTT0ZUX1ZPTFVNRV9TVEVQLAotCQkucmFtcGluZ2N1cnZlID0gU09GVF9WT0xVTUVfQ1VSVkVfTElORUFSLAotCX07Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlIGtjdGxfZWxlbV92YWx1ZTsKLQl1aW50MTZfdCB0YXJnZXRfYXNtX2JpdF93aWR0aCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHN0cmVhbV9pZCAlZFxuIiwgX19mdW5jX18sIGFjLT5zdHJlYW1faWQpOwotCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChhYy0+c3RyZWFtX2lkKTsKLQlpZiAoc3RyZWFtX2luZGV4ID49IE1BWF9OVU1CRVJfT0ZfU1RSRUFNUyB8fCBzdHJlYW1faW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIGluZGV4OiVkIiwgX19mdW5jX18sIHN0cmVhbV9pbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWtjdGwgPSBzbmRfc29jX2NhcmRfZ2V0X2tjb250cm9sKHNvY19wcnRkLT5jYXJkLAotCQlEU1BfQklUX1dJRFRIX01JWEVSX0NUTCk7Ci0JaWYgKGtjdGwpIHsKLQkJa2N0bC0+Z2V0KGtjdGwsICZrY3RsX2VsZW1fdmFsdWUpOwotCQl0YXJnZXRfYXNtX2JpdF93aWR0aCA9IGtjdGxfZWxlbV92YWx1ZS52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQlpZiAodGFyZ2V0X2FzbV9iaXRfd2lkdGggPiAwKSB7Ci0JCQlwcl9kZWJ1ZygiJXMgZW5mb3JjZSBBU00gYml0d2lkdGggdG8gJWQgZnJvbSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQl0YXJnZXRfYXNtX2JpdF93aWR0aCwKLQkJCQliaXRzX3Blcl9zYW1wbGUpOwotCQkJYml0c19wZXJfc2FtcGxlID0gdGFyZ2V0X2FzbV9iaXRfd2lkdGg7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9pbmZvKCIlczogZmFpbGVkIHRvIGdldCBtaXhlciBjdGwgZm9yICVzLlxuIiwKLQkJCV9fZnVuY19fLCBEU1BfQklUX1dJRFRIX01JWEVSX0NUTCk7Ci0JfQotCi0JaWYgKChwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpIHx8Ci0JCShwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFKSkKLQkJYml0c19wZXJfc2FtcGxlID0gMjQ7Ci0JZWxzZSBpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFKQotCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKLQotCWlmIChwcnRkLT5jb21wcl9wYXNzdGhyICE9IExFR0FDWV9QQ00pIHsKLQkJcmV0ID0gcTZhc21fb3Blbl93cml0ZV9jb21wcmVzc2VkKGFjLCBwcnRkLT5jb2RlYywKLQkJCQkJCSAgcHJ0ZC0+Y29tcHJfcGFzc3Rocik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOkFTTSBvcGVuIHdyaXRlIGVyclslZF0gZm9yIGNvbXByX3R5cGVbJWRdXG4iLAotCQkJCV9fZnVuY19fLCByZXQsIHBydGQtPmNvbXByX3Bhc3N0aHIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlwcnRkLT5nYXBsZXNzX3N0YXRlLnN0cmVhbV9vcGVuZWRbc3RyZWFtX2luZGV4XSA9IDE7Ci0KLQkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfY29tcHJfc3RyZWFtKAotCQkJCXNvY19wcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJYWMtPnBlcmZfbW9kZSwKLQkJCQlwcnRkLT5zZXNzaW9uX2lkLAotCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQkJcHJ0ZC0+Y29tcHJfcGFzc3Rocik7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGNvbXByIHN0cmVhbSByZWcgZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogc3RyZWFtX2lkICVkIGJpdHNfcGVyX3NhbXBsZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYWMtPnN0cmVhbV9pZCwgYml0c19wZXJfc2FtcGxlKTsKLQkJcmV0ID0gcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQoYWMsCi0JCQkJcHJ0ZC0+Y29kZWMsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQlhYy0+c3RyZWFtX2lkLAotCQkJCXBydGQtPmdhcGxlc3Nfc3RhdGUudXNlX2RzcF9nYXBsZXNzX21vZGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczpBU00gb3BlbiB3cml0ZSBlcnJbJWRdIGZvciBjb21wciB0eXBlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0LCBwcnRkLT5jb21wcl9wYXNzdGhyKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXBydGQtPmdhcGxlc3Nfc3RhdGUuc3RyZWFtX29wZW5lZFtzdHJlYW1faW5kZXhdID0gMTsKLQotCQlwcl9kZWJ1ZygiJXM6IEJFIGlkICVkXG4iLCBfX2Z1bmNfXywgc29jX3BydGQtPmRhaV9saW5rLT5pZCk7Ci0JCXJldCA9IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkLAotCQkJCWFjLT5wZXJmX21vZGUsCi0JCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwKLQkJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogc3RyZWFtIHJlZyBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldCA9IG1zbV9jb21wcl9zZXRfdm9sdW1lKGNzdHJlYW0sIDAsIDApOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzIDogU2V0IFZvbHVtZSBmYWlsZWQgOiAlZCIsIF9fZnVuY19fLCByZXQpOwotCi0JaWYgKHBydGQtPmNvbXByX3Bhc3N0aHIgIT0gTEVHQUNZX1BDTSkgewotCQlwcl9kZWJ1ZygiJXMgOiBEb24ndCBzZW5kIGNhbCBhbmQgUFAgcGFyYW1zIGZvciBjb21wcmVzcyBwYXRoIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcTZhc21fc2VuZF9jYWwoYWMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2RlYnVnKCIlcyA6IFNlbmQgY2FsIGZhaWxlZCA6ICVkIiwgX19mdW5jX18sIHJldCk7Ci0KLQkJcmV0ID0gcTZhc21fc2V0X3NvZnRwYXVzZShhYywgJnNvZnRwYXVzZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogU2VuZCBTb2Z0UGF1c2UgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0KLQkJcmV0ID0gcTZhc21fc2V0X3NvZnR2b2x1bWUoYWMsICZzb2Z0dm9sKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBTZW5kIFNvZnRWb2x1bWUgUGFyYW0gZmFpbGVkIHJldD0lZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JfQotCXJldCA9IHE2YXNtX3NldF9pb19tb2RlKGFjLCAoQ09NUFJFU1NFRF9TVFJFQU1fSU8gfCBBU1lOQ19JT19NT0RFKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IElPIG1vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ1bnRpbWUtPmZyYWdtZW50cyA9IHBydGQtPmNvZGVjX3BhcmFtLmJ1ZmZlci5mcmFnbWVudHM7Ci0JcnVudGltZS0+ZnJhZ21lbnRfc2l6ZSA9IHBydGQtPmNvZGVjX3BhcmFtLmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCXByX2RlYnVnKCJhbGxvY2F0ZSAlZCBidWZmZXJzIGVhY2ggb2Ygc2l6ZSAlZFxuIiwKLQkJCXJ1bnRpbWUtPmZyYWdtZW50cywKLQkJCXJ1bnRpbWUtPmZyYWdtZW50X3NpemUpOwotCXJldCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhkaXIsIGFjLAotCQkJCQlydW50aW1lLT5mcmFnbWVudF9zaXplLAotCQkJCQlydW50aW1lLT5mcmFnbWVudHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiQXVkaW8gU3RhcnQ6IEJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcnRkLT5ieXRlX29mZnNldCAgPSAwOwotCXBydGQtPmNvcGllZF90b3RhbCA9IDA7Ci0JcHJ0ZC0+YXBwX3BvaW50ZXIgID0gMDsKLQlwcnRkLT5ieXRlc19yZWNlaXZlZCA9IDA7Ci0JcHJ0ZC0+Ynl0ZXNfc2VudCA9IDA7Ci0JcHJ0ZC0+YnVmZmVyICAgICAgID0gYWMtPnBvcnRbZGlyXS5idWZbMF0uZGF0YTsKLQlwcnRkLT5idWZmZXJfcGFkZHIgPSBhYy0+cG9ydFtkaXJdLmJ1ZlswXS5waHlzOwotCXBydGQtPmJ1ZmZlcl9zaXplICA9IHJ1bnRpbWUtPmZyYWdtZW50cyAqIHJ1bnRpbWUtPmZyYWdtZW50X3NpemU7Ci0KLQkvKiBCaXQtMCBvZiBmbGFncyByZXByZXNlbnQgdGltZXN0YW1wIG1vZGUgKi8KLQlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZmxhZ3MgJiBDT01QUkVTU0VEX1RJTUVTVEFNUF9GTEFHKQotCQlwcnRkLT50c19oZWFkZXJfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzbmRfY29kZWNfbWV0YWRhdGEpOwotCWVsc2UKLQkJcHJ0ZC0+dHNfaGVhZGVyX29mZnNldCA9IDA7Ci0KLQlyZXQgPSBtc21fY29tcHJfc2VuZF9tZWRpYV9mb3JtYXRfYmxvY2soY3N0cmVhbSwgYWMtPnN0cmVhbV9pZCwgZmFsc2UpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzLCBmYWlsZWQgdG8gc2VuZCBtZWRpYSBmb3JtYXQgYmxvY2tcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2NvbmZpZ3VyZV9kc3BfZm9yX2NhcHR1cmUoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7Ci0JdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZTsKLQlpbnQgZGlyID0gT1VULCByZXQgPSAwOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gcHJ0ZC0+YXVkaW9fY2xpZW50OwotCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKLQotCXN3aXRjaCAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJYml0c19wZXJfc2FtcGxlID0gMjQ7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCWJpdHNfcGVyX3NhbXBsZSA9IDI0OwotCQlzYW1wbGVfd29yZF9zaXplID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWJpdHNfcGVyX3NhbXBsZSA9IDMyOwotCQlzYW1wbGVfd29yZF9zaXplID0gMzI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAxNjsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzdHJlYW1faWQgJWQgYml0c19wZXJfc2FtcGxlICVkXG4iLAotCQkJX19mdW5jX18sIGFjLT5zdHJlYW1faWQsIGJpdHNfcGVyX3NhbXBsZSk7Ci0KLQlpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZmxhZ3MgJiBDT01QUkVTU0VEX1RJTUVTVEFNUF9GTEFHKSB7Ci0JCXJldCA9IHE2YXNtX29wZW5fcmVhZF92NChwcnRkLT5hdWRpb19jbGllbnQsIEZPUk1BVF9MSU5FQVJfUENNLAotCQkJYml0c19wZXJfc2FtcGxlLCB0cnVlKTsKLQl9IGVsc2UgewotCQlyZXQgPSBxNmFzbV9vcGVuX3JlYWRfdjQocHJ0ZC0+YXVkaW9fY2xpZW50LCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCWJpdHNfcGVyX3NhbXBsZSwgZmFsc2UpOwotCX0KLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBxNmFzbV9vcGVuX3JlYWQgZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCWFjLT5wZXJmX21vZGUsCi0JCQlwcnRkLT5zZXNzaW9uX2lkLAotCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSByZWcgZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBxNmFzbV9zZXRfaW9fbW9kZShhYywgKENPTVBSRVNTRURfU1RSRUFNX0lPIHwgQVNZTkNfSU9fTU9ERSkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IFNldCBJTyBtb2RlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdHJlYW1faW5kZXggPSBTVFJFQU1fQVJSQVlfSU5ERVgoYWMtPnN0cmVhbV9pZCk7Ci0JaWYgKHN0cmVhbV9pbmRleCA+PSBNQVhfTlVNQkVSX09GX1NUUkVBTVMgfHwgc3RyZWFtX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSBpbmRleDolZCIsIF9fZnVuY19fLCBzdHJlYW1faW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlydW50aW1lLT5mcmFnbWVudHMgPSBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRzOwotCXJ1bnRpbWUtPmZyYWdtZW50X3NpemUgPSBwcnRkLT5jb2RlY19wYXJhbS5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQlwcl9kZWJ1ZygiJXM6IGFsbG9jYXRlICVkIGJ1ZmZlcnMgZWFjaCBvZiBzaXplICVkXG4iLAotCQkJX19mdW5jX18sIHJ1bnRpbWUtPmZyYWdtZW50cywKLQkJCXJ1bnRpbWUtPmZyYWdtZW50X3NpemUpOwotCXJldCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhkaXIsIGFjLAotCQkJCQlydW50aW1lLT5mcmFnbWVudF9zaXplLAotCQkJCQlydW50aW1lLT5mcmFnbWVudHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiQXVkaW8gU3RhcnQ6IEJ1ZmZlciBBbGxvY2F0aW9uIGZhaWxlZCByYyA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcnRkLT5ieXRlX29mZnNldCAgICA9IDA7Ci0JcHJ0ZC0+cmVjZWl2ZWRfdG90YWwgPSAwOwotCXBydGQtPmFwcF9wb2ludGVyICAgID0gMDsKLQlwcnRkLT5ieXRlc19jb3BpZWQgICA9IDA7Ci0JcHJ0ZC0+Ynl0ZXNfcmVhZCAgICAgPSAwOwotCXBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ID0gMDsKLQlwcnRkLT5idWZmZXIgICAgICAgICA9IGFjLT5wb3J0W2Rpcl0uYnVmWzBdLmRhdGE7Ci0JcHJ0ZC0+YnVmZmVyX3BhZGRyICAgPSBhYy0+cG9ydFtkaXJdLmJ1ZlswXS5waHlzOwotCXBydGQtPmJ1ZmZlcl9zaXplICAgID0gcnVudGltZS0+ZnJhZ21lbnRzICogcnVudGltZS0+ZnJhZ21lbnRfc2l6ZTsKLQotCS8qIEJpdC0wIG9mIGZsYWdzIHJlcHJlc2VudCB0aW1lc3RhbXAgbW9kZSAqLwotCWlmIChwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5mbGFncyAmIENPTVBSRVNTRURfVElNRVNUQU1QX0ZMQUcpCi0JCXBydGQtPnRzX2hlYWRlcl9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNuZF9jb2RlY19tZXRhZGF0YSk7Ci0JZWxzZQotCQlwcnRkLT50c19oZWFkZXJfb2Zmc2V0ID0gMDsKLQotCXByX2RlYnVnKCIlczogc2FtcGxlX3JhdGUgPSAlZCBjaGFubmVscyA9ICVkIGJwcyA9ICVkIHNhbXBsZV93b3JkX3NpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwcnRkLT5zYW1wbGVfcmF0ZSwgcHJ0ZC0+bnVtX2NoYW5uZWxzLAotCQkJCQkgYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKLQlyZXQgPSBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjMocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQlwcnRkLT5zYW1wbGVfcmF0ZSwgcHJ0ZC0+bnVtX2NoYW5uZWxzLAotCQkJCQliaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZDsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9Ci0JCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY29tcHJfYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJ0ZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbXNtX2NvbXByX2F1ZGlvXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlwcnRkLT5jc3RyZWFtID0gY3N0cmVhbTsKLQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5pZF0gPSBjc3RyZWFtOwotCXBkYXRhLT5hdWRpb19lZmZlY3RzW3J0ZC0+ZGFpX2xpbmstPmlkXSA9Ci0JCSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhLT5hdWRpb19lZmZlY3RzW3J0ZC0+ZGFpX2xpbmstPmlkXSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7Ci0JCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7Ci0JCWtmcmVlKHBydGQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcGRhdGEtPmRlY19wYXJhbXNbcnRkLT5kYWlfbGluay0+aWRdID0KLQkJIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY29tcHJfZGVjX3BhcmFtcyksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEtPmRlY19wYXJhbXNbcnRkLT5kYWlfbGluay0+aWRdKSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlYyBwYXJhbXNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWtmcmVlKHBkYXRhLT5hdWRpb19lZmZlY3RzW3J0ZC0+ZGFpX2xpbmstPmlkXSk7Ci0JCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7Ci0JCWtmcmVlKHBydGQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfTVAzOwotCXBydGQtPmJ5dGVzX3JlY2VpdmVkID0gMDsKLQlwcnRkLT5ieXRlc19zZW50ID0gMDsKLQlwcnRkLT5jb3BpZWRfdG90YWwgPSAwOwotCXBydGQtPmJ5dGVfb2Zmc2V0ID0gMDsKLQlwcnRkLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCXBydGQtPm51bV9jaGFubmVscyA9IDI7Ci0JcHJ0ZC0+ZHJhaW5fcmVhZHkgPSAwOwotCXBydGQtPmxhc3RfYnVmZmVyID0gMDsKLQlwcnRkLT5maXJzdF9idWZmZXIgPSAxOwotCXBydGQtPnBhcnRpYWxfZHJhaW5fZGVsYXkgPSAwOwotCXBydGQtPm5leHRfc3RyZWFtID0gMDsKLQltZW1zZXQoJnBydGQtPmdhcGxlc3Nfc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2NvbXByX2dhcGxlc3Nfc3RhdGUpKTsKLQkvKgotCSAqIFVwZGF0ZSB0aGUgdXNlX2RzcF9nYXBsZXNzX21vZGUgZnJvbSBnYXBsZXNzIHN0cnV0dXJlIHdpdGggdGhlIHZhbHVlCi0JICogcGFydCBvZiBwbGF0Zm9ybSBkYXRhLgotCSAqLwotCXBydGQtPmdhcGxlc3Nfc3RhdGUudXNlX2RzcF9nYXBsZXNzX21vZGUgPSBwZGF0YS0+dXNlX2RzcF9nYXBsZXNzX21vZGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IGdhcGxlc3MgbW9kZSAlZCIsIF9fZnVuY19fLCBwZGF0YS0+dXNlX2RzcF9nYXBsZXNzX21vZGUpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnBydGQtPmxvY2spOwotCi0JYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDApOwotCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDApOwotCWF0b21pY19zZXQoJnBydGQtPmNsb3NlLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT53YWl0X29uX2Nsb3NlLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT5lcnJvciwgMCk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcnRkLT5lb3Nfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+ZHJhaW5fd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+Y2xvc2Vfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJ0ZC0+d2FpdF9mb3Jfc3RyZWFtX2F2YWlsKTsKLQotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci0JcG9wdWxhdGVfY29kZWNfbGlzdChwcnRkKTsKLQlwcnRkLT5hdWRpb19jbGllbnQgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCi0JCQkJKGFwcF9jYiljb21wcl9ldmVudF9oYW5kbGVyLCBwcnRkKTsKLQlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjbGllbnRcbiIsIF9fZnVuY19fKTsKLQkJa2ZyZWUocGRhdGEtPmF1ZGlvX2VmZmVjdHNbcnRkLT5kYWlfbGluay0+aWRdKTsKLQkJa2ZyZWUocGRhdGEtPmRlY19wYXJhbXNbcnRkLT5kYWlfbGluay0+aWRdKTsKLQkJcGRhdGEtPmNzdHJlYW1bcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKLQkJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQkJa2ZyZWUocHJ0ZCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gSUQgJWRcbiIsIF9fZnVuY19fLCBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24pOwotCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gZmFsc2U7Ci0JcHJ0ZC0+c2Vzc2lvbl9pZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbjsKLQltc21fYWRzcF9pbml0X21peGVyX2N0bF9wcF9ldmVudF9xdWV1ZShydGQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2NhcHR1cmVfb3BlbihzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBjc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZDsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9Ci0JCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY29tcHJfYXVkaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJ0ZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbXNtX2NvbXByX2F1ZGlvXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlwcnRkLT5jc3RyZWFtID0gY3N0cmVhbTsKLQlwZGF0YS0+Y3N0cmVhbVtydGQtPmRhaV9saW5rLT5pZF0gPSBjc3RyZWFtOwotCi0JcHJ0ZC0+YXVkaW9fY2xpZW50ID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKAotCQkJCShhcHBfY2IpY29tcHJfZXZlbnRfaGFuZGxlciwgcHJ0ZCk7Ci0JaWYgKCFwcnRkLT5hdWRpb19jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY2xpZW50XG4iLCBfX2Z1bmNfXyk7Ci0JCXBkYXRhLT5jc3RyZWFtW3J0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7Ci0JCWtmcmVlKHBydGQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uIElEICVkXG4iLCBfX2Z1bmNfXywgcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uKTsKLQlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSA9IGZhbHNlOwotCXBydGQtPnNlc3Npb25faWQgPSBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb247Ci0JcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfTElORUFSX1BDTTsKLQlwcnRkLT5ieXRlc19jb3BpZWQgPSAwOwotCXBydGQtPmJ5dGVzX3JlYWQgPSAwOwotCXBydGQtPmJ5dGVzX3JlYWRfb2Zmc2V0ID0gMDsKLQlwcnRkLT5yZWNlaXZlZF90b3RhbCA9IDA7Ci0JcHJ0ZC0+Ynl0ZV9vZmZzZXQgPSAwOwotCXBydGQtPnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0JcHJ0ZC0+bnVtX2NoYW5uZWxzID0gMjsKLQlwcnRkLT5maXJzdF9idWZmZXIgPSAwOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnBydGQtPmxvY2spOwotCi0JYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDApOwotCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDApOwotCWF0b21pY19zZXQoJnBydGQtPmNsb3NlLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT53YWl0X29uX2Nsb3NlLCAwKTsKLQlhdG9taWNfc2V0KCZwcnRkLT5lcnJvciwgMCk7Ci0KLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBwcnRkOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX29wZW4oc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKLQkJcmV0ID0gbXNtX2NvbXByX3BsYXliYWNrX29wZW4oY3N0cmVhbSk7Ci0JZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKQotCQlyZXQgPSBtc21fY29tcHJfY2FwdHVyZV9vcGVuKGNzdHJlYW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3BsYXliYWNrX2ZyZWUoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQ7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkOwotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCWludCBkaXIgPSBJTiwgcmV0ID0gMCwgc3RyZWFtX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdWludDMyX3Qgc3RyZWFtX2luZGV4OwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWNzdHJlYW0pIHsKLQkJcHJfZXJyKCIlcyBjc3RyZWFtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXNvY19wcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcnVudGltZSB8fCAhc29jX3BydGQgfHwgIShzb2NfcHJ0ZC0+cGxhdGZvcm0pKSB7Ci0JCXByX2VycigiJXMgcnVudGltZSBvciBzb2NfcHJ0ZCBvciBwbGF0Zm9ybSBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlcyBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAxOwotCXdha2VfdXAoJnBydGQtPmRyYWluX3dhaXQpOwotCXBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcHJ0ZC0+cGxhdGZvcm0pOwotCWFjID0gcHJ0ZC0+YXVkaW9fY2xpZW50OwotCWlmICghcGRhdGEgfHwgIWFjKSB7Ci0JCXByX2VycigiJXMgcGRhdGEgb3IgYWMgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lb3MpKSB7Ci0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcnRkLT5lb3Nfd2FpdCwKLQkJCQkJIHBydGQtPmVvc19hY2ssIDUgKiBIWik7Ci0JCWlmICghcmV0KQotCQkJcHJfZXJyKCIlczogQ01EX0VPUyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZwcnRkLT5jbG9zZSkpIHsKLQkJcHJ0ZC0+Y21kX2FjayA9IDA7Ci0JCWF0b21pY19zZXQoJnBydGQtPndhaXRfb25fY2xvc2UsIDEpOwotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJ0ZC0+Y2xvc2Vfd2FpdCwKLQkJCQkJcHJ0ZC0+Y21kX2FjaywgNSAqIEhaKTsKLQkJaWYgKCFyZXQpCi0JCQlwcl9lcnIoIiVzOiBDTURfQ0xPU0UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQlzdHJlYW1faWQgPSBhYy0+c3RyZWFtX2lkOwotCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChORVhUX1NUUkVBTV9JRChzdHJlYW1faWQpKTsKLQotCWlmICgoc3RyZWFtX2luZGV4IDwgTUFYX05VTUJFUl9PRl9TVFJFQU1TICYmIHN0cmVhbV9pbmRleCA+PSAwKSAmJgotCSAgICAocHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zdHJlYW1fb3BlbmVkW3N0cmVhbV9pbmRleF0pKSB7Ci0JCXBydGQtPmdhcGxlc3Nfc3RhdGUuc3RyZWFtX29wZW5lZFtzdHJlYW1faW5kZXhdID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlwcl9kZWJ1ZygiIGNsb3NlIHN0cmVhbSAlZCIsIE5FWFRfU1RSRUFNX0lEKHN0cmVhbV9pZCkpOwotCQlxNmFzbV9zdHJlYW1fY21kKGFjLCBDTURfQ0xPU0UsIE5FWFRfU1RSRUFNX0lEKHN0cmVhbV9pZCkpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXN0cmVhbV9pbmRleCA9IFNUUkVBTV9BUlJBWV9JTkRFWChzdHJlYW1faWQpOwotCWlmICgoc3RyZWFtX2luZGV4IDwgTUFYX05VTUJFUl9PRl9TVFJFQU1TICYmIHN0cmVhbV9pbmRleCA+PSAwKSAmJgotCSAgICAocHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zdHJlYW1fb3BlbmVkW3N0cmVhbV9pbmRleF0pKSB7Ci0JCXBydGQtPmdhcGxlc3Nfc3RhdGUuc3RyZWFtX29wZW5lZFtzdHJlYW1faW5kZXhdID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlwcl9kZWJ1ZygiY2xvc2Ugc3RyZWFtICVkIiwgc3RyZWFtX2lkKTsKLQkJcTZhc21fc3RyZWFtX2NtZChhYywgQ01EX0NMT1NFLCBzdHJlYW1faWQpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0KLQlwZGF0YS0+Y3N0cmVhbVtzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7Ci0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spIHsKLQkJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwotCX0KLQotCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwgYWMpOwotCi0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwotCW1zbV9hZHNwX2NsZWFuX21peGVyX2N0bF9wcF9ldmVudF9xdWV1ZShzb2NfcHJ0ZCk7Ci0Ja2ZyZWUocGRhdGEtPmF1ZGlvX2VmZmVjdHNbc29jX3BydGQtPmRhaV9saW5rLT5pZF0pOwotCXBkYXRhLT5hdWRpb19lZmZlY3RzW3NvY19wcnRkLT5kYWlfbGluay0+aWRdID0gTlVMTDsKLQlrZnJlZShwZGF0YS0+ZGVjX3BhcmFtc1tzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkXSk7Ci0JcGRhdGEtPmRlY19wYXJhbXNbc29jX3BydGQtPmRhaV9saW5rLT5pZF0gPSBOVUxMOwotCWtmcmVlKHBydGQpOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfY2FwdHVyZV9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZDsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlpbnQgZGlyID0gT1VULCBzdHJlYW1faWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBzdHJlYW1faW5kZXg7Ci0KLQlpZiAoIWNzdHJlYW0pIHsKLQkJcHJfZXJyKCIlcyBjc3RyZWFtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXNvY19wcnRkID0gY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcnVudGltZSB8fCAhc29jX3BydGQgfHwgIShzb2NfcHJ0ZC0+cGxhdGZvcm0pKSB7Ci0JCXByX2VycigiJXMgcnVudGltZSBvciBzb2NfcHJ0ZCBvciBwbGF0Zm9ybSBpcyBudWxsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlcyBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcHJ0ZC0+cGxhdGZvcm0pOwotCWFjID0gcHJ0ZC0+YXVkaW9fY2xpZW50OwotCWlmICghcGRhdGEgfHwgIWFjKSB7Ci0JCXByX2VycigiJXMgcGRhdGEgb3IgYWMgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCXN0cmVhbV9pZCA9IGFjLT5zdHJlYW1faWQ7Ci0KLQlzdHJlYW1faW5kZXggPSBTVFJFQU1fQVJSQVlfSU5ERVgoc3RyZWFtX2lkKTsKLQlpZiAoKHN0cmVhbV9pbmRleCA8IE1BWF9OVU1CRVJfT0ZfU1RSRUFNUyAmJiBzdHJlYW1faW5kZXggPj0gMCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlwcl9kZWJ1ZygiY2xvc2Ugc3RyZWFtICVkIiwgc3RyZWFtX2lkKTsKLQkJcTZhc21fc3RyZWFtX2NtZChhYywgQ01EX0NMT1NFLCBzdHJlYW1faWQpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0KLQlwZGF0YS0+Y3N0cmVhbVtzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkXSA9IE5VTEw7Ci0JbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKLQotCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwgYWMpOwotCi0JcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoYWMpOwotCi0Ja2ZyZWUocHJ0ZCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCi0JCXJldCA9IG1zbV9jb21wcl9wbGF5YmFja19mcmVlKGNzdHJlYW0pOwotCWVsc2UgaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkKLQkJcmV0ID0gbXNtX2NvbXByX2NhcHR1cmVfZnJlZShjc3RyZWFtKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgYm9vbCBtc21fY29tcHJfdmFsaWRhdGVfY29kZWNfY29tcHIoX191MzIgY29kZWNfaWQpCi17Ci0JaW50MzJfdCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tcHJfY29kZWNzKTsgaSsrKSB7Ci0JCWlmIChjb21wcl9jb2RlY3NbaV0gPT0gY29kZWNfaWQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiBjb21wcmVzcyBzdHJlYW0gb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBtc21fY29tcHJfc2V0X3BhcmFtcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMCwgZnJhbWVfc3ogPSAwOwotCWludCBpLCBudW1fcmF0ZXM7Ci0JYm9vbCBpc19mb3JtYXRfZ2FwbGVzcyA9IGZhbHNlOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQludW1fcmF0ZXMgPSBzaXplb2Yoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcykvc2l6ZW9mKHVuc2lnbmVkIGludCk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9yYXRlczsgaSsrKQotCQlpZiAocGFyYW1zLT5jb2RlYy5zYW1wbGVfcmF0ZSA9PSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW2ldKQotCQkJYnJlYWs7Ci0JaWYgKGkgPT0gbnVtX3JhdGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweSgmcHJ0ZC0+Y29kZWNfcGFyYW0sIHBhcmFtcywgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfcGFyYW1zKSk7Ci0JLyogVG9EbzogcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLQlwcnRkLT5udW1fY2hhbm5lbHMgPSBwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5jaF9pbjsKLQlwcnRkLT5zYW1wbGVfcmF0ZSA9IHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLnNhbXBsZV9yYXRlOwotCXByX2RlYnVnKCIlczogc2FtcGxlX3JhdGUgJWRcbiIsIF9fZnVuY19fLCBwcnRkLT5zYW1wbGVfcmF0ZSk7Ci0KLQlpZiAoKHBydGQtPmNvZGVjX3BhcmFtLmNvZGVjLmNvbXByX3Bhc3N0aHIgPj0gTEVHQUNZX1BDTSAmJgotCSAgICBwcnRkLT5jb2RlY19wYXJhbS4KLQkgICAgY29kZWMuY29tcHJfcGFzc3RociA8PSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RTRCkgfHwKLQkgICAgKHBydGQtPmNvZGVjX3BhcmFtLgotCSAgICBjb2RlYy5jb21wcl9wYXNzdGhyID09IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfSUVDNjE5MzcpKQotCQlwcnRkLT5jb21wcl9wYXNzdGhyID0gcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuY29tcHJfcGFzc3RocjsKLQllbHNlCi0JCXBydGQtPmNvbXByX3Bhc3N0aHIgPSBMRUdBQ1lfUENNOwotCXByX2RlYnVnKCIlczogY29tcHJfcGFzc3RociA9ICVkIiwgX19mdW5jX18sIHBydGQtPmNvbXByX3Bhc3N0aHIpOwotCWlmIChwcnRkLT5jb21wcl9wYXNzdGhyICE9IExFR0FDWV9QQ00pIHsKLQkJcHJfZGVidWcoIiVzOiBSZXNldCBnYXBsZXNzIG1vZGUgcGxheWJhY2sgZm9yIGNvbXByX3R5cGVbJWRdXG4iLAotCQkJX19mdW5jX18sIHBydGQtPmNvbXByX3Bhc3N0aHIpOwotCQlwcnRkLT5nYXBsZXNzX3N0YXRlLnVzZV9kc3BfZ2FwbGVzc19tb2RlID0gMDsKLQkJaWYgKCFtc21fY29tcHJfdmFsaWRhdGVfY29kZWNfY29tcHIocGFyYW1zLT5jb2RlYy5pZCkpIHsKLQkJCXByX2VycigiJXMgY29kZWMgbm90IHN1cHBvcnRlZCBpbiBwYXNzdGhyb3VnaCxpZCA9JWRcbiIsCi0JCQkJIF9fZnVuY19fLCBwYXJhbXMtPmNvZGVjLmlkKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChwYXJhbXMtPmNvZGVjLmlkKSB7Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19QQ006IHsKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX1BDTVxuIik7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0xJTkVBUl9QQ007Ci0JCWlzX2Zvcm1hdF9nYXBsZXNzID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRfQVVESU9DT0RFQ19NUDM6IHsKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX01QM1xuIik7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX01QMzsKLQkJZnJhbWVfc3ogPSBNUDNfT1VUUFVUX0ZSQU1FX1NaOwotCQlpc19mb3JtYXRfZ2FwbGVzcyA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOiB7Ci0JCXByX2RlYnVnKCJTTkRfQVVESU9DT0RFQ19BQUNcbiIpOwotCQlwcnRkLT5jb2RlYyA9IEZPUk1BVF9NUEVHNF9BQUM7Ci0JCWZyYW1lX3N6ID0gQUFDX09VVFBVVF9GUkFNRV9TWjsKLQkJaXNfZm9ybWF0X2dhcGxlc3MgPSB0cnVlOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX0FDMzogewotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfQUMzXG4iKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfQUMzOwotCQlmcmFtZV9zeiA9IEFDM19PVVRQVVRfRlJBTUVfU1o7Ci0JCWlzX2Zvcm1hdF9nYXBsZXNzID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRfQVVESU9DT0RFQ19FQUMzOiB7Ci0JCXByX2RlYnVnKCJTTkRfQVVESU9DT0RFQ19FQUMzXG4iKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfRUFDMzsKLQkJZnJhbWVfc3ogPSBFQUMzX09VVFBVVF9GUkFNRV9TWjsKLQkJaXNfZm9ybWF0X2dhcGxlc3MgPSB0cnVlOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX01QMjogewotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfTVAyXG4iKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfTVAyOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX1dNQTogewotCQlwcl9kZWJ1ZygiU05EX0FVRElPQ09ERUNfV01BXG4iKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfV01BX1Y5OwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX1dNQV9QUk86IHsKLQkJcHJfZGVidWcoIlNORF9BVURJT0NPREVDX1dNQV9QUk9cbiIpOwotCQlwcnRkLT5jb2RlYyA9IEZPUk1BVF9XTUFfVjEwUFJPOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX0ZMQUM6IHsKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19GTEFDXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0ZMQUM7Ci0JCS8qCi0JCSAqIERTUCBidWZmZXJyaW5nIGlzIGJhc2VkIG9uIGJsayBzaXplLAotCQkgKiBjb25zaWRlciBtaW5pbnVtIGJ1ZmZlcmluZyB0byBydWxlIG91dCBhbnkgZmFsc2Ugd2FpdAotCQkgKi8KLQkJZnJhbWVfc3ogPQotCQkJcHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMub3B0aW9ucy5mbGFjX2RlYy5taW5fYmxrX3NpemU7Ci0JCWlzX2Zvcm1hdF9nYXBsZXNzID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRfQVVESU9DT0RFQ19WT1JCSVM6IHsKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19WT1JCSVNcbiIsIF9fZnVuY19fKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfVk9SQklTOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX0FMQUM6IHsKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19BTEFDXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0FMQUM7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EX0FVRElPQ09ERUNfQVBFOiB7Ci0JCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfQVBFXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0FQRTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRfQVVESU9DT0RFQ19EVFM6IHsKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19EVFNcbiIsIF9fZnVuY19fKTsKLQkJcHJ0ZC0+Y29kZWMgPSBGT1JNQVRfRFRTOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX0RTRDogewotCQlwcl9kZWJ1ZygiJXM6IFNORF9BVURJT0NPREVDX0RTRFxuIiwgX19mdW5jX18pOwotCQlwcnRkLT5jb2RlYyA9IEZPUk1BVF9EU0Q7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EX0FVRElPQ09ERUNfVFJVRUhEOiB7Ci0JCXByX2RlYnVnKCIlczogU05EX0FVRElPQ09ERUNfVFJVRUhEXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX1RSVUVIRDsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRfQVVESU9DT0RFQ19JRUM2MTkzNzogewotCQlwcl9kZWJ1ZygiJXM6IFNORF9BVURJT0NPREVDX0lFQzYxOTM3XG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0lFQzYxOTM3OwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORF9BVURJT0NPREVDX0FQVFg6IHsKLQkJcHJfZGVidWcoIiVzOiBTTkRfQVVESU9DT0RFQ19BUFRYXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNvZGVjID0gRk9STUFUX0FQVFg7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiY29kZWMgbm90IHN1cHBvcnRlZCwgaWQgPSVkXG4iLCBwYXJhbXMtPmNvZGVjLmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFpc19mb3JtYXRfZ2FwbGVzcykKLQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS51c2VfZHNwX2dhcGxlc3NfbW9kZSA9IGZhbHNlOwotCi0JcHJ0ZC0+cGFydGlhbF9kcmFpbl9kZWxheSA9Ci0JCW1zbV9jb21wcl9nZXRfcGFydGlhbF9kcmFpbl9kZWxheShmcmFtZV9zeiwgcHJ0ZC0+c2FtcGxlX3JhdGUpOwotCi0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCi0JCXJldCA9IG1zbV9jb21wcl9jb25maWd1cmVfZHNwX2Zvcl9wbGF5YmFjayhjc3RyZWFtKTsKLQllbHNlIGlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9jb21wcl9jb25maWd1cmVfZHNwX2Zvcl9jYXB0dXJlKGNzdHJlYW0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfZHJhaW5fYnVmZmVyKHN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQsCi0JCQkJICB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlpbnQgcmMgPSAwOwotCi0JYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDEpOwotCXBydGQtPmRyYWluX3JlYWR5ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCAqZmxhZ3MpOwotCXByX2RlYnVnKCIlczogd2FpdCBmb3IgYnVmZmVyIHRvIGJlIGRyYWluZWRcbiIsICBfX2Z1bmNfXyk7Ci0JcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocHJ0ZC0+ZHJhaW5fd2FpdCwKLQkJCQkJcHJ0ZC0+ZHJhaW5fcmVhZHkgfHwKLQkJCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCB8fAotCQkJCQlhdG9taWNfcmVhZCgmcHJ0ZC0+eHJ1bikgfHwKLQkJCQkJYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSk7Ci0JcHJfZGVidWcoIiVzOiBvdXQgb2YgYnVmZmVyIGRyYWluIHdhaXQgd2l0aCByZXQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssICpmbGFncyk7Ci0JaWYgKHBydGQtPmNtZF9pbnRlcnJ1cHQpIHsKLQkJcHJfZGVidWcoIiVzOiBidWZmZXIgZHJhaW4gaW50ZXJydXB0ZWQgYnkgZmx1c2gpXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlRSOwotCQlwcnRkLT5jbWRfaW50ZXJydXB0ID0gMDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lcnJvcikpIHsKLQkJcHJfZXJyKCIlczogR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24sIHJldHVyblxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRU5FVFJFU0VUOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3dhaXRfZm9yX3N0cmVhbV9hdmFpbChzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncykKLXsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIm5leHQgc2Vzc2lvbiBpcyBhbHJlYWR5IGluIG9wZW5lZCBzdGF0ZVxuIik7Ci0JcHJ0ZC0+bmV4dF9zdHJlYW0gPSAxOwotCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssICpmbGFncyk7Ci0JLyoKLQkgKiBXYWl0IGZvciBzdHJlYW0gdG8gYmUgYXZhaWxhYmxlLCBvciB0aGUgd2FpdCB0byBiZSBpbnRlcnJ1cHRlZCBieQotCSAqIGNvbW1hbmRzIGxpa2UgZmx1c2ggb3IgdGlsbCBhIHRpbWVvdXQgb2Ygb25lIHNlY29uZC4KLQkgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChwcnRkLT53YWl0X2Zvcl9zdHJlYW1fYXZhaWwsCi0JCXBydGQtPnN0cmVhbV9hdmFpbGFibGUgfHwgcHJ0ZC0+Y21kX2ludGVycnVwdCwgMSAqIEhaKTsKLQlwcl9lcnIoIiVzOnBydGQtPnN0cmVhbV9hdmFpbGFibGUgJWQsIHBydGQtPmNtZF9pbnRlcnJ1cHQgJWQgcmMgJWRcbiIsCi0JCSAgIF9fZnVuY19fLCBwcnRkLT5zdHJlYW1fYXZhaWxhYmxlLCBwcnRkLT5jbWRfaW50ZXJydXB0LCByYyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgKmZsYWdzKTsKLQlpZiAocmMgPT0gMCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2Zvcl9zdHJlYW1fYXZhaWwgdGltZWQgb3V0XG4iLAotCQkJCQkJX19mdW5jX18pOwotCQlyYyA9ICAtRVRJTUVET1VUOwotCX0gZWxzZSBpZiAocHJ0ZC0+Y21kX2ludGVycnVwdCA9PSAxKSB7Ci0JCS8qCi0JCSAqIFRoaXMgc2NlbmFyaW8gbWlnaHQgbm90IGhhcHBlbiBhcyB3ZSBkbyBub3QgYWxsb3cKLQkJICogZmx1c2ggaW4gdHJhbnNpdGlvbiBzdGF0ZS4KLQkJICovCi0JCXByX2RlYnVnKCIlczogd2FpdF9mb3Jfc3RyZWFtX2F2YWlsIGludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAwOwotCQlwcnRkLT5zdHJlYW1fYXZhaWxhYmxlID0gMDsKLQkJcmMgPSAtRUlOVFI7Ci0JfSBlbHNlIHsKLQkJcHJ0ZC0+c3RyZWFtX2F2YWlsYWJsZSA9IDA7Ci0JCXJjID0gMDsKLQl9Ci0JcHJfZGVidWcoIiVzIDogcmMgPSAlZCIsICBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfdHJpZ2dlcihzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9Ci0JCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCXVpbnQzMl90ICp2b2x1bWUgPSBwZGF0YS0+dm9sdW1lW3J0ZC0+ZGFpX2xpbmstPmlkXTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JaW50IHJjID0gMDsKLQlpbnQgYnl0ZXNfdG9fd3JpdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc3RyZWFtX2lkOwotCXVpbnQzMl90IHN0cmVhbV9pbmRleDsKLQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGF0b21pY19yZWFkKCZwcnRkLT5lcnJvcikpIHsKLQkJcHJfZXJyKCIlcyBHb3QgUkVTRVQgRVZFTlRTIG5vdGlmaWNhdGlvbiwgcmV0dXJuIGltbWVkaWF0ZWx5IiwKLQkJCV9fZnVuY19fKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwcl9kZWJ1ZygiJXM6IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUXG4iLCBfX2Z1bmNfXyk7Ci0JCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAxKTsKLQotCQkvKgotCQkgKiBjb21wcl9zZXRfdm9sdW1lIGFuZCBjb21wcl9pbml0X3BwX3BhcmFtcwotCQkgKiBhcmUgdXNlZCB0byBjb25maWd1cmUgQVNNIHZvbHVtZSBoZW5jZSBub3QKLQkJICogbmVlZGVkIGZvciBjb21wcmVzcyBwYXNzdGhyb3VnaCBwbGF5YmFjay4KLQkJICoKLQkJICogY29tcHJlc3MgcGFzc3Rocm91Z2ggdm9sdW1lIGlzIGNvbnRyb2xsZWQgaW4KLQkJICogQURNIGJ5IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUoKQotCQkgKi8KLQkJaWYgKHBydGQtPmNvbXByX3Bhc3N0aHIgPT0gTEVHQUNZX1BDTSAmJgotCQkJY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQkJLyogc2V0IHZvbHVtZSBmb3IgdGhlIHN0cmVhbSBiZWZvcmUgUlVOICovCi0JCQlyYyA9IG1zbV9jb21wcl9zZXRfdm9sdW1lKGNzdHJlYW0sCi0JCQkJdm9sdW1lWzBdLCB2b2x1bWVbMV0pOwotCQkJaWYgKHJjKQotCQkJCXByX2VycigiJXMgOiBTZXQgVm9sdW1lIGZhaWxlZCA6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCi0JCQlyYyA9IG1zbV9jb21wcl9pbml0X3BwX3BhcmFtcyhjc3RyZWFtLCBhYyk7Ci0JCQlpZiAocmMpCi0JCQkJcHJfZXJyKCIlcyA6IGluaXQgUFAgcGFyYW1zIGZhaWxlZCA6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQl9IGVsc2UgewotCQkJbXNtX2NvbXByX3JlYWRfYnVmZmVyKHBydGQpOwotCQl9Ci0JCS8qIGlzc3VlIFJVTiBjb21tYW5kIGZvciB0aGUgc3RyZWFtICovCi0JCXE2YXNtX3J1bl9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBwcnRkLT5ydW5fbW9kZSwKLQkJCQkgcHJ0ZC0+c3RhcnRfZGVsYXlfbXN3LCBwcnRkLT5zdGFydF9kZWxheV9sc3cpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCXByX2RlYnVnKCIlczogU05EUlZfUENNX1RSSUdHRVJfU1RPUCB0cmFuc2l0aW9uICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24pOwotCQlzdHJlYW1faWQgPSBhYy0+c3RyZWFtX2lkOwotCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpIHsKLQkJCXE2YXNtX2NtZF9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOwotCQkJYXRvbWljX3NldCgmcHJ0ZC0+eHJ1biwgMCk7Ci0JCQlwcnRkLT5yZWNlaXZlZF90b3RhbCA9IDA7Ci0JCQlwcnRkLT5ieXRlc19jb3BpZWQgPSAwOwotCQkJcHJ0ZC0+Ynl0ZXNfcmVhZCA9IDA7Ci0JCQlwcnRkLT5ieXRlc19yZWFkX29mZnNldCA9IDA7Ci0JCQlwcnRkLT5ieXRlX29mZnNldCAgPSAwOwotCQkJcHJ0ZC0+YXBwX3BvaW50ZXIgID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChwcnRkLT5uZXh0X3N0cmVhbSkgewotCQkJcHJfZGVidWcoIiVzOiBpbnRlcnJ1cHQgbmV4dCB0cmFjayB3YWl0IHF1ZXVlc1xuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDE7Ci0JCQl3YWtlX3VwKCZwcnRkLT53YWl0X2Zvcl9zdHJlYW1fYXZhaWwpOwotCQkJcHJ0ZC0+bmV4dF9zdHJlYW0gPSAwOwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZW9zKSkgewotCQkJcHJfZGVidWcoIiVzOiBpbnRlcnJ1cHQgZW9zIHdhaXQgcXVldWVzIiwgX19mdW5jX18pOwotCQkJLyoKLQkJCSAqIEdhcGxlc3MgcGxheWJhY2sgZG9lcyBub3Qgd2FpdCBmb3IgZW9zLCBkbyBub3Qgc2V0Ci0JCQkgKiBjbWRfaW50IGFuZCBkbyBub3Qgd2FrZSB1cCBlb3Nfd2FpdCBkdXJpbmcgZ2FwbGVzcwotCQkJICogdHJhbnNpdGlvbgotCQkJICovCi0JCQlpZiAoIXBydGQtPmdhcGxlc3Nfc3RhdGUuZ2FwbGVzc190cmFuc2l0aW9uKSB7Ci0JCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDE7Ci0JCQkJd2FrZV91cCgmcHJ0ZC0+ZW9zX3dhaXQpOwotCQkJfQotCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAwKTsKLQkJfQotCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmRyYWluKSkgewotCQkJcHJfZGVidWcoIiVzOiBpbnRlcnJ1cHQgZHJhaW4gd2FpdCBxdWV1ZXMiLCBfX2Z1bmNfXyk7Ci0JCQlwcnRkLT5jbWRfaW50ZXJydXB0ID0gMTsKLQkJCXBydGQtPmRyYWluX3JlYWR5ID0gMTsKLQkJCXdha2VfdXAoJnBydGQtPmRyYWluX3dhaXQpOwotCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZHJhaW4sIDApOwotCQl9Ci0JCXBydGQtPmxhc3RfYnVmZmVyID0gMDsKLQkJcHJ0ZC0+Y21kX2FjayA9IDA7Ci0JCWlmICghcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24pIHsKLQkJCXByX2RlYnVnKCJpc3N1ZSBDTURfRkxVU0ggc3RyZWFtX2lkICVkXG4iLCBzdHJlYW1faWQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJcTZhc21fc3RyZWFtX2NtZCgKLQkJCQlwcnRkLT5hdWRpb19jbGllbnQsIENNRF9GTFVTSCwgc3RyZWFtX2lkKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcnRkLT5maXJzdF9idWZmZXIgPSAwOwotCQl9Ci0JCS8qIEZJWE1FLiBvbmx5IHJlc2V0IGlmIGZsdXNoIHdhcyBzdWNjZXNzZnVsICovCi0JCXBydGQtPmJ5dGVfb2Zmc2V0ICA9IDA7Ci0JCXBydGQtPmNvcGllZF90b3RhbCA9IDA7Ci0JCXBydGQtPmFwcF9wb2ludGVyICA9IDA7Ci0JCXBydGQtPmJ5dGVzX3JlY2VpdmVkID0gMDsKLQkJcHJ0ZC0+Ynl0ZXNfc2VudCA9IDA7Ci0JCXBydGQtPm1hcmtlcl90aW1lc3RhbXAgPSAwOwotCi0JCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJcHJfZGVidWcoIlNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggdHJhbnNpdGlvbiAlZFxuIiwKLQkJCQlwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbik7Ci0JCWlmICghcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24pIHsKLQkJCXByX2RlYnVnKCJpc3N1ZSBDTURfUEFVU0Ugc3RyZWFtX2lkICVkXG4iLAotCQkJCSAgYWMtPnN0cmVhbV9pZCk7Ci0JCQlxNmFzbV9zdHJlYW1fY21kX25vd2FpdChhYywgQ01EX1BBVVNFLCBhYy0+c3RyZWFtX2lkKTsKLQkJCWF0b21pY19zZXQoJnBydGQtPnN0YXJ0LCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCXByX2RlYnVnKCJTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFIHRyYW5zaXRpb24gJWRcbiIsCi0JCQkJICAgcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24pOwotCQlpZiAoIXBydGQtPmdhcGxlc3Nfc3RhdGUuZ2FwbGVzc190cmFuc2l0aW9uKSB7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7Ci0JCQlxNmFzbV9ydW5fbm93YWl0KHBydGQtPmF1ZGlvX2NsaWVudCwgcHJ0ZC0+cnVuX21vZGUsCi0JCQkJCSAwLCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORF9DT01QUl9UUklHR0VSX1BBUlRJQUxfRFJBSU46Ci0JCXByX2RlYnVnKCIlczogU05EX0NPTVBSX1RSSUdHRVJfUEFSVElBTF9EUkFJTlxuIiwgX19mdW5jX18pOwotCQlpZiAoIXBydGQtPmdhcGxlc3Nfc3RhdGUudXNlX2RzcF9nYXBsZXNzX21vZGUpIHsKLQkJCXByX2RlYnVnKCIlczogc2V0IHBhcnRpYWwgZHJhaW4gYXMgZHJhaW5cbiIsIF9fZnVuY19fKTsKLQkJCWNtZCA9IFNORF9DT01QUl9UUklHR0VSX0RSQUlOOwotCQl9Ci0JY2FzZSBTTkRfQ09NUFJfVFJJR0dFUl9EUkFJTjoKLQkJcHJfZGVidWcoIiVzOiBTTkRSVl9DT01QUkVTU19EUkFJTlxuIiwgX19mdW5jX18pOwotCQkvKiBNYWtlIHN1cmUgYWxsIHRoZSBkYXRhIGlzIHNlbnQgdG8gRFNQIGJlZm9yZSBzZW5kaW5nIEVPUyAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICghYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgewotCQkJcHJfZXJyKCIlczogc3RyZWFtIGlzIG5vdCBpbiBzdGFydGVkIHN0YXRlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJjID0gLUVQRVJNOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHBydGQtPmJ5dGVzX3JlY2VpdmVkID4gcHJ0ZC0+Y29waWVkX3RvdGFsKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHdhaXQgdGlsbCBhbGwgdGhlIGRhdGEgaXMgc2VudCB0byBkc3BcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmMgPSBtc21fY29tcHJfZHJhaW5fYnVmZmVyKHBydGQsICZmbGFncyk7Ci0JCQlpZiAocmMgfHwgIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKLQkJCQlpZiAocmMgIT0gLUVORVRSRVNFVCkKLQkJCQkJcmMgPSAtRUlOVFI7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyoKLQkJCSAqIEZJWE1FOiBCdWcuCi0JCQkgKiBXcml0ZSgzMjc2NykKLQkJCSAqIFN0YXJ0Ci0JCQkgKiBEcmFpbiA8LSBJbmRlZmluaXRlIHdhaXQKLQkJCSAqIHNvbDEgOiBpZiAocHJ0ZC0+Y29waWVkX3RvdGFsKSB0aGVuIHdhaXQ/Ci0JCQkgKiBzb2wyIDogKHBydGQtPmNtZF9pbnRlcnJ1cHQgfHwgcHJ0ZC0+ZHJhaW5fcmVhZHkgfHwKLQkJCSAqCSAgIGF0b21pY19yZWFkKHhydW4pCi0JCQkgKi8KLQkJCWJ5dGVzX3RvX3dyaXRlID0gcHJ0ZC0+Ynl0ZXNfcmVjZWl2ZWQKLQkJCQkJCS0gcHJ0ZC0+Y29waWVkX3RvdGFsOwotCQkJV0FSTihieXRlc190b193cml0ZSA+IHJ1bnRpbWUtPmZyYWdtZW50X3NpemUsCi0JCQkgICAgICJsYXN0IHdyaXRlICVkIGNhbm5vdCBiZSA+IHRoYW4gZnJhZ21lbnRfc2l6ZSIsCi0JCQkgICAgIGJ5dGVzX3RvX3dyaXRlKTsKLQotCQkJaWYgKGJ5dGVzX3RvX3dyaXRlID4gMCkgewotCQkJCXByX2RlYnVnKCIlczogc2VuZCAlZCBwYXJ0aWFsIGJ5dGVzIGF0IHRoZSBlbmQiLAotCQkJCSAgICAgICBfX2Z1bmNfXywgYnl0ZXNfdG9fd3JpdGUpOwotCQkJCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDApOwotCQkJCXBydGQtPmxhc3RfYnVmZmVyID0gMTsKLQkJCQltc21fY29tcHJfc2VuZF9idWZmZXIocHJ0ZCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGNtZCA9PSBTTkRfQ09NUFJfVFJJR0dFUl9QQVJUSUFMX0RSQUlOKSAmJgotCQkgICAgKHBydGQtPmdhcGxlc3Nfc3RhdGUuc2V0X25leHRfc3RyZWFtX2lkKSkgewotCQkJLyogd2FpdCBmb3IgdGhlIGxhc3QgYnVmZmVyIHRvIGJlIHJldHVybmVkICovCi0KLQkJCWlmIChwcnRkLT5sYXN0X2J1ZmZlcikgewotCQkJCXByX2RlYnVnKCIlczogbGFzdCBidWZmZXIgZHJhaW5cbiIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IG1zbV9jb21wcl9kcmFpbl9idWZmZXIocHJ0ZCwgJmZsYWdzKTsKLQkJCQlpZiAocmMgfHwgIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywKLQkJCQkJCQkJCWZsYWdzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLyogc2VuZCBFT1MgKi8KLQkJCXBydGQtPmVvc19hY2sgPSAwOwotCQkJYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAxKTsKLQkJCXByX2RlYnVnKCJpc3N1ZSBDTURfRU9TIHN0cmVhbV9pZCAlZFxuIiwgYWMtPnN0cmVhbV9pZCk7Ci0JCQlxNmFzbV9zdHJlYW1fY21kX25vd2FpdChhYywgQ01EX0VPUywgYWMtPnN0cmVhbV9pZCk7Ci0JCQlwcl9pbmZvKCJQQVJUSUFMIERSQUlOLCBkbyBub3Qgd2FpdCBmb3IgRU9TIGFja1xuIik7Ci0KLQkJCS8qIHNlbmQgYSB6ZXJvIGxlbmd0aCBidWZmZXIgKi8KLQkJCWF0b21pY19zZXQoJnBydGQtPnhydW4sIDApOwotCQkJbXNtX2NvbXByX3NlbmRfYnVmZmVyKHBydGQpOwotCi0JCQkvKiB3YWl0IGZvciB0aGUgemVybyBsZW5ndGggYnVmZmVyIHRvIGJlIHJldHVybmVkICovCi0JCQlwcl9kZWJ1ZygiJXM6IHplcm8gbGVuZ3RoIGJ1ZmZlciBkcmFpblxuIiwgX19mdW5jX18pOwotCQkJcmMgPSBtc21fY29tcHJfZHJhaW5fYnVmZmVyKHBydGQsICZmbGFncyk7Ci0JCQlpZiAocmMgfHwgIWF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIHNsZWVwIGZvciBhZGRpdGlvbmFsIGR1cmF0aW9uIHBhcnRpYWwgZHJhaW4gKi8KLQkJCWF0b21pY19zZXQoJnBydGQtPmRyYWluLCAxKTsKLQkJCXBydGQtPmRyYWluX3JlYWR5ID0gMDsKLQkJCXByX2RlYnVnKCIlcywgYWRkaXRpb25hbCBzbGVlcDogJWRcbiIsIF9fZnVuY19fLAotCQkJCSBwcnRkLT5wYXJ0aWFsX2RyYWluX2RlbGF5KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHBydGQtPmRyYWluX3dhaXQsCi0JCQkJcHJ0ZC0+ZHJhaW5fcmVhZHkgfHwgcHJ0ZC0+Y21kX2ludGVycnVwdCwKLQkJCQltc2Vjc190b19qaWZmaWVzKHBydGQtPnBhcnRpYWxfZHJhaW5fZGVsYXkpKTsKLQkJCXByX2RlYnVnKCIlczogb3V0IG9mIGFkZGl0aW9uYWwgd2FpdCBmb3IgbG93IHNhbXBsZSByYXRlXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKHBydGQtPmNtZF9pbnRlcnJ1cHQpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGFkZGl0aW9uYWwgd2FpdCBpbnRlcnJ1cHRlZCBieSBmbHVzaClcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRUlOVFI7Ci0JCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDA7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBtb3ZlIHRvIG5leHQgc3RyZWFtIGFuZCByZXNldCB2YXJzICovCi0JCQlwcl9kZWJ1ZygiJXM6IE1vdmluZyB0byBuZXh0IHN0cmVhbSBpbiBnYXBsZXNzXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlhYy0+c3RyZWFtX2lkID0gTkVYVF9TVFJFQU1fSUQoYWMtPnN0cmVhbV9pZCk7Ci0JCQlwcnRkLT5ieXRlX29mZnNldCA9IDA7Ci0JCQlwcnRkLT5hcHBfcG9pbnRlciAgPSAwOwotCQkJcHJ0ZC0+Zmlyc3RfYnVmZmVyID0gMTsKLQkJCXBydGQtPmxhc3RfYnVmZmVyID0gMDsKLQkJCS8qCi0JCQkgKiBTZXQgZ2FwbGVzcyB0cmFuc2l0aW9uIGZsYWcgb25seSBpZiBFT1MgaGFzbid0IGJlZW4KLQkJCSAqIGFja25vd2xlZGdlZCBhbHJlYWR5LgotCQkJICovCi0JCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVvcykpCi0JCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24gPSAxOwotCQkJcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCA9IDA7Ci0KLQkJCS8qCi0JCQkgKiBEb24ndCByZXNldCB0aGVzZSBhcyB0aGVzZSB2YXJzIG1hcCB0bwotCQkJICogdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWQgYW5kIHRvdGFsX2J5dGVzX2F2YWlsYWJsZQotCQkJICogZGlyZWN0bHksIG9ubHkgdG90YWxfYnl0ZXNfdHJhbnNmZXJyZWQgd2lsbCBiZQotCQkJICogdXBkYXRlZCBpbiB0aGUgbmV4dCBhdmFpbCgpIGlvY3RsCi0JCQkgKglwcnRkLT5jb3BpZWRfdG90YWwgPSAwOwotCQkJICoJcHJ0ZC0+Ynl0ZXNfcmVjZWl2ZWQgPSAwOwotCQkJICovCi0JCQlhdG9taWNfc2V0KCZwcnRkLT5kcmFpbiwgMCk7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT54cnVuLCAxKTsKLQkJCXByX2RlYnVnKCIlczogaXNzdWUgQ01EX1JVTiIsIF9fZnVuY19fKTsKLQkJCXE2YXNtX3J1bl9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCAwLCAwLCAwKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qCi0JCSAqIG1vdmluZyB0byBuZXh0IHN0cmVhbSBmYWlsZWQsIHNvIHJlc2V0IHRoZSBnYXBsZXNzIHN0YXRlCi0JCSAqIHNldCBuZXh0IHN0cmVhbSBpZCBmb3IgdGhlIHNhbWUgc2Vzc2lvbiBzbyB0aGF0IHRoZSBzYW1lCi0JCSAqIHN0cmVhbSBjYW4gYmUgdXNlZCBmb3IgZ2FwbGVzcyBwbGF5YmFjawotCQkgKi8KLQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zZXRfbmV4dF9zdHJlYW1faWQgPSBmYWxzZTsKLQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb24gPSAwOwotCQlwcl9kZWJ1ZygiJXM6Q01EX0VPUyBzdHJlYW1faWQgJWRcbiIsIF9fZnVuY19fLCBhYy0+c3RyZWFtX2lkKTsKLQotCQlwcnRkLT5lb3NfYWNrID0gMDsKLQkJYXRvbWljX3NldCgmcHJ0ZC0+ZW9zLCAxKTsKLQkJcTZhc21fc3RyZWFtX2NtZF9ub3dhaXQoYWMsIENNRF9FT1MsIGFjLT5zdHJlYW1faWQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQotCi0JCS8qIFdhaXQgaW5kZWZpbml0ZWx5IGZvciAgRFJBSU4uIEZsdXNoIGNhbiBhbHNvIHNpZ25hbCB0aGlzKi8KLQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocHJ0ZC0+ZW9zX3dhaXQsCi0JCQkJCQkocHJ0ZC0+ZW9zX2FjayB8fAotCQkJCQkJcHJ0ZC0+Y21kX2ludGVycnVwdCB8fAotCQkJCQkJYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSkpOwotCi0JCWlmIChyYyA8IDApCi0JCQlwcl9lcnIoIiVzOiBFT1Mgd2FpdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCQlwcl9kZWJ1ZygiJXM6IFNORFJWX0NPTVBSRVNTX0RSQUlOICBvdXQgb2Ygd2FpdCBmb3IgRU9TXG4iLAotCQkJICBfX2Z1bmNfXyk7Ci0KLQkJaWYgKHBydGQtPmNtZF9pbnRlcnJ1cHQpCi0JCQlyYyA9IC1FSU5UUjsKLQotCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSkgewotCQkJcHJfZXJyKCIlczogR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24sIHJldHVyblxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyYyA9IC1FTkVUUkVTRVQ7Ci0JCX0KLQotCQkvKkZJWE1FIDogd2hhdCBpZiBhIGZsdXNoIGNvbWVzIHdoaWxlIFBDIGlzIGhlcmUgKi8KLQkJaWYgKHJjID09IDApIHsKLQkJCS8qCi0JCQkgKiBGYWlsZWQgdG8gb3BlbiBzZWNvbmQgc3RyZWFtIGluIERTUCBmb3IgZ2FwbGVzcwotCQkJICogc28gcHJlcGFyZSB0aGUgY3VycmVudCBzdHJlYW0gaW4gc2Vzc2lvbgotCQkJICogZm9yIGdhcGxlc3MgcGxheWJhY2sKLQkJCSAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCXByX2RlYnVnKCIlczppc3N1ZSBDTURfUEFVU0Ugc3RyZWFtX2lkICVkIiwKLQkJCQkJICBfX2Z1bmNfXywgYWMtPnN0cmVhbV9pZCk7Ci0JCQlxNmFzbV9zdHJlYW1fY21kX25vd2FpdChhYywgQ01EX1BBVVNFLCBhYy0+c3RyZWFtX2lkKTsKLQkJCXBydGQtPmNtZF9hY2sgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JCQkvKgotCQkJICogQ2FjaGUgdGhpcyB0aW1lIGFzIGxhc3Qga25vd24gdGltZQotCQkJICovCi0JCQlpZiAocGRhdGEtPnVzZV9sZWdhY3lfYXBpKQotCQkJCXE2YXNtX2dldF9zZXNzaW9uX3RpbWVfbGVnYWN5KAotCQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCSAgICAgICAmcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCk7Ci0JCQllbHNlCi0JCQkJcTZhc21fZ2V0X3Nlc3Npb25fdGltZShwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkgICAgICAgJnBydGQtPm1hcmtlcl90aW1lc3RhbXApOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJLyoKLQkJCSAqIERvbid0IHJlc2V0IHRoZXNlIGFzIHRoZXNlIHZhcnMgbWFwIHRvCi0JCQkgKiB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZCBhbmQgdG90YWxfYnl0ZXNfYXZhaWxhYmxlLgotCQkJICogSnVzdCB0b3RhbF9ieXRlc190cmFuc2ZlcnJlZCB3aWxsIGJlIHVwZGF0ZWQKLQkJCSAqIGluIHRoZSBuZXh0IGF2YWlsKCkgaW9jdGwuCi0JCQkgKiBwcnRkLT5jb3BpZWRfdG90YWwgPSAwOwotCQkJICogcHJ0ZC0+Ynl0ZXNfcmVjZWl2ZWQgPSAwOwotCQkJICogZG8gbm90IHJlc2V0IHBydGQtPmJ5dGVzX3NlbnQgYXMgd2VsbCBhcyB0aGUgc2FtZQotCQkJICogc2Vzc2lvbiBpcyB1c2VkIGZvciBnYXBsZXNzIHBsYXliYWNrCi0JCQkgKi8KLQkJCXBydGQtPmJ5dGVfb2Zmc2V0ID0gMDsKLQotCQkJcHJ0ZC0+YXBwX3BvaW50ZXIgID0gMDsKLQkJCXBydGQtPmZpcnN0X2J1ZmZlciA9IDE7Ci0JCQlwcnRkLT5sYXN0X2J1ZmZlciA9IDA7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT5kcmFpbiwgMCk7Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT54cnVuLCAxKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQotCQkJcHJfZGVidWcoIiVzOmlzc3VlIENNRF9GTFVTSCBhYy0+c3RyZWFtX2lkICVkIiwKLQkJCQkJICAgICAgX19mdW5jX18sIGFjLT5zdHJlYW1faWQpOwotCQkJcTZhc21fc3RyZWFtX2NtZChhYywgQ01EX0ZMVVNILCBhYy0+c3RyZWFtX2lkKTsKLQotCQkJcTZhc21fcnVuX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOwotCQl9Ci0JCXBydGQtPmNtZF9pbnRlcnJ1cHQgPSAwOwotCQlicmVhazsKLQljYXNlIFNORF9DT01QUl9UUklHR0VSX05FWFRfVFJBQ0s6Ci0JCWlmICghcHJ0ZC0+Z2FwbGVzc19zdGF0ZS51c2VfZHNwX2dhcGxlc3NfbW9kZSkgewotCQkJcHJfZGVidWcoIiVzOiBpZ25vcmUgdHJpZ2dlciBuZXh0IHRyYWNrXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IFNORF9DT01QUl9UUklHR0VSX05FWFRfVFJBQ0tcbiIsIF9fZnVuY19fKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJcmMgPSAwOwotCQkvKiBuZXh0IHN0cmVhbSBpbiBnYXBsZXNzICovCi0JCXN0cmVhbV9pZCA9IE5FWFRfU1RSRUFNX0lEKGFjLT5zdHJlYW1faWQpOwotCQkvKgotCQkgKiBXYWl0IGlmIHN0cmVhbSAxIGhhcyBub3QgY29tcGxldGVkIGJlZm9yZSBob25vcmluZyBuZXh0Ci0JCSAqIHRyYWNrIGZvciBzdHJlYW0gMy4gU2NlbmFyaW8gaGFwcGVucyBpZiBzZWNvbmQgY2xpcCBpcwotCQkgKiBzbWFsbCBhbmQgZmlsbHMgaW4gb25lIGJ1ZmZlciBzbyBuZXh0IHRyYWNrIHdpbGwgYmUKLQkJICogY2FsbGVkIGltbWVkaWF0ZWx5LgotCQkgKi8KLQkJc3RyZWFtX2luZGV4ID0gU1RSRUFNX0FSUkFZX0lOREVYKHN0cmVhbV9pZCk7Ci0JCWlmIChzdHJlYW1faW5kZXggPj0gTUFYX05VTUJFUl9PRl9TVFJFQU1TIHx8Ci0JCSAgICBzdHJlYW1faW5kZXggPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSBpbmRleDogJWQiLCBfX2Z1bmNfXywKLQkJCQlzdHJlYW1faW5kZXgpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAocHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zdHJlYW1fb3BlbmVkW3N0cmVhbV9pbmRleF0pIHsKLQkJCWlmIChwcnRkLT5nYXBsZXNzX3N0YXRlLmdhcGxlc3NfdHJhbnNpdGlvbikgewotCQkJCXJjID0gbXNtX2NvbXByX3dhaXRfZm9yX3N0cmVhbV9hdmFpbChwcnRkLAotCQkJCQkJCQkgICAgJmZsYWdzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiBzZXNzaW9uIGlzIGFscmVhZHkgb3BlbmVkIGJyZWFrIG91dCBpZgotCQkJCSAqIHRoZSBzdGF0ZSBpcyBub3QgZ2FwbGVzcyB0cmFuc2l0aW9uLiBUaGlzCi0JCQkJICogaXMgd2hlbiBzZWVrIGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3QgYnVmZmVyCi0JCQkJICogaXMgc2VudCB0byB0aGUgZHJpdmVyLiBOZXh0IHRyYWNrIHdvdWxkIGJlCi0JCQkJICogY2FsbGVkIGFnYWluIGFmdGVyIGxhc3QgYnVmZmVyIGlzIHNlbnQuCi0JCQkJICovCi0JCQkJcHJfZGVidWcoIm5leHQgc2Vzc2lvbiBpcyBpbiBvcGVuZWQgc3RhdGVcbiIpOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCS8qCi0JCQkgKiBpZiByZXR1cm4gdHlwZSBFSU5UUiAgdGhlbiByZXNldCB0byB6ZXJvLiBUaW55Ci0JCQkgKiBjb21wcmVzcyB0cmVhdHMgRUlOVFIgYXMgZXJyb3IgYW5kIHByZXZlbnRzIFBBUlRJQUwKLQkJCSAqIERSQUlOLiBFSU5UUiBpcyBub3QgYW4gZXJyb3IuIHdhaXQgZm9yIHN0cmVhbSBhdmFpbAotCQkJICogaXMgaW50ZXJydXB0ZWQgYnkgc29tZSBvdGhlciBjb21tYW5kIGxpa2UgRkxVU0guCi0JCQkgKi8KLQkJCWlmIChyYyA9PSAtRUlOVFIpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IEVJTlRSIHJlc2V0IHJjIHRvIDBcbiIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwcnRkLT5jb2RlY19wYXJhbS5jb2RlYy5mb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCi0JCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKLQkJZWxzZSBpZiAocHJ0ZC0+Y29kZWNfcGFyYW0uY29kZWMuZm9ybWF0ID09Ci0JCQkgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpCi0JCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKLQotCQlwcl9kZWJ1ZygiJXM6IG9wZW5fd3JpdGUgc3RyZWFtX2lkICVkIGJpdHNfcGVyX3NhbXBsZSAlZCIsCi0JCQkJX19mdW5jX18sIHN0cmVhbV9pZCwgYml0c19wZXJfc2FtcGxlKTsKLQkJcmMgPSBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92NChwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJcHJ0ZC0+Y29kZWMsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQlzdHJlYW1faWQsCi0JCQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS51c2VfZHNwX2dhcGxlc3NfbW9kZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IFNlc3Npb24gb3V0IG9wZW4gZmFpbGVkIGZvciBnYXBsZXNzXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCXBydGQtPmdhcGxlc3Nfc3RhdGUuc3RyZWFtX29wZW5lZFtzdHJlYW1faW5kZXhdID0gMTsKLQkJcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5zZXRfbmV4dF9zdHJlYW1faWQgPSB0cnVlOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0KLQkJcmMgPSBtc21fY29tcHJfc2VuZF9tZWRpYV9mb3JtYXRfYmxvY2soY3N0cmVhbSwKLQkJCQkJCXN0cmVhbV9pZCwgZmFsc2UpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzLCBmYWlsZWQgdG8gc2VuZCBtZWRpYSBmb3JtYXQgYmxvY2tcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXNtX2NvbXByX3NlbmRfZGVjX3BhcmFtcyhjc3RyZWFtLCBwZGF0YS0+ZGVjX3BhcmFtc1tmZV9pZF0sCi0JCQkJCSAgc3RyZWFtX2lkKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9wb2ludGVyKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQlzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcCAqYXJnKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcCB0c3RhbXA7Ci0JdWludDY0X3QgdGltZXN0YW1wID0gMDsKLQlpbnQgcmMgPSAwLCBmaXJzdF9idWZmZXI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBnYXBsZXNzX3RyYW5zaXRpb247Ci0KLQlwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbWVtc2V0KCZ0c3RhbXAsIDB4MCwgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfdHN0YW1wKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCXRzdGFtcC5zYW1wbGluZ19yYXRlID0gcHJ0ZC0+c2FtcGxlX3JhdGU7Ci0JdHN0YW1wLmJ5dGVfb2Zmc2V0ID0gcHJ0ZC0+Ynl0ZV9vZmZzZXQ7Ci0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCi0JCXRzdGFtcC5jb3BpZWRfdG90YWwgPSBwcnRkLT5jb3BpZWRfdG90YWw7Ci0JZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKQotCQl0c3RhbXAuY29waWVkX3RvdGFsID0gcHJ0ZC0+cmVjZWl2ZWRfdG90YWw7Ci0JZmlyc3RfYnVmZmVyID0gcHJ0ZC0+Zmlyc3RfYnVmZmVyOwotCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZXJyb3IpKSB7Ci0JCXByX2VycigiJXMgR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24sIHJldHVybiBlcnJvclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCi0JCQlydW50aW1lLT50b3RhbF9ieXRlc190cmFuc2ZlcnJlZCA9IHRzdGFtcC5jb3BpZWRfdG90YWw7Ci0JCWVsc2UKLQkJCXJ1bnRpbWUtPnRvdGFsX2J5dGVzX2F2YWlsYWJsZSA9IHRzdGFtcC5jb3BpZWRfdG90YWw7Ci0JCXRzdGFtcC5wY21faW9fZnJhbWVzID0gMDsKLQkJbWVtY3B5KGFyZywgJnRzdGFtcCwgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfdHN0YW1wKSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0JfQotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0KLQkJZ2FwbGVzc190cmFuc2l0aW9uID0gcHJ0ZC0+Z2FwbGVzc19zdGF0ZS5nYXBsZXNzX3RyYW5zaXRpb247Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGdhcGxlc3NfdHJhbnNpdGlvbikKLQkJCXByX2RlYnVnKCIlcyBzZXNzaW9uIHRpbWUgaW4gZ2FwbGVzcyB0cmFuc2l0aW9uIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCS8qCi0JCSAqLSBEbyBub3QgcXVlcnkgaWYgbm8gYnVmZmVyIGhhcyBiZWVuIGdpdmVuLgotCQkgKi0gRG8gbm90IHF1ZXJ5IG9uIGEgZ2FwbGVzcyB0cmFuc2l0aW9uLgotCQkgKiAgUGxheWJhY2sgZm9yIHRoZSAybmQgc3RyZWFtIGNhbiBzdGFydCAodGh1cyByZXR1cm5pbmcgdGltZQotCQkgKiAgc3RhcnRpbmcgZnJvbSAwKSBiZWZvcmUgdGhlIGRyaXZlciBrbm93cyBhYm91dCBFT1Mgb2YgZmlyc3QKLQkJICogIHN0cmVhbS4KLQkJICovCi0JCWlmICghZmlyc3RfYnVmZmVyIHx8IGdhcGxlc3NfdHJhbnNpdGlvbikgewotCi0JCQlpZiAocGRhdGEtPnVzZV9sZWdhY3lfYXBpKQotCQkJCXJjID0gcTZhc21fZ2V0X3Nlc3Npb25fdGltZV9sZWdhY3koCi0JCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LCAmcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcCk7Ci0JCQllbHNlCi0JCQkJcmMgPSBxNmFzbV9nZXRfc2Vzc2lvbl90aW1lKAotCQkJCXBydGQtPmF1ZGlvX2NsaWVudCwgJnBydGQtPm1hcmtlcl90aW1lc3RhbXApOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6IEdldCBTZXNzaW9uIFRpbWUgcmV0dXJuID0lbGxkXG4iLAotCQkJCQlfX2Z1bmNfXywgdGltZXN0YW1wKTsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSkKLQkJCQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gLUVBR0FJTjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0JdGltZXN0YW1wID0gcHJ0ZC0+bWFya2VyX3RpbWVzdGFtcDsKLQotCS8qIERTUCByZXR1cm5zIHRpbWVzdGFtcCBpbiB1c2VjICovCi0JcHJfZGVidWcoIiVzOiB0aW1lc3RhbXAgPSAlbGxkIHVzZWNcbiIsIF9fZnVuY19fLCB0aW1lc3RhbXApOwotCXRpbWVzdGFtcCAqPSBwcnRkLT5zYW1wbGVfcmF0ZTsKLQl0c3RhbXAucGNtX2lvX2ZyYW1lcyA9IChzbmRfcGNtX3VmcmFtZXNfdClkaXY2NF91NjQodGltZXN0YW1wLCAxMDAwMDAwKTsKLQltZW1jcHkoYXJnLCAmdHN0YW1wLCBzaXplb2Yoc3RydWN0IHNuZF9jb21wcl90c3RhbXApKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hY2soc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQlzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXZvaWQgKnNyYywgKmRzdG47Ci0Jc2l6ZV90IGNvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVdBUk4oMSwgIlRoaXMgcGF0aCBpcyB1bnRlc3RlZCIpOwotCXJldHVybiAtRUlOVkFMOwotCi0JcHJfZGVidWcoIiVzOiBjb3VudCA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50KTsKLQlpZiAoIXBydGQtPmJ1ZmZlcikgewotCQlwcl9lcnIoIiVzOiBCdWZmZXIgaXMgbm90IGFsbG9jYXRlZCB5ZXQgPz9cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXNyYyA9IHJ1bnRpbWUtPmJ1ZmZlciArIHBydGQtPmFwcF9wb2ludGVyOwotCWRzdG4gPSBwcnRkLT5idWZmZXIgKyBwcnRkLT5hcHBfcG9pbnRlcjsKLQlpZiAoY291bnQgPCBwcnRkLT5idWZmZXJfc2l6ZSAtIHBydGQtPmFwcF9wb2ludGVyKSB7Ci0JCW1lbWNweShkc3RuLCBzcmMsIGNvdW50KTsKLQkJcHJ0ZC0+YXBwX3BvaW50ZXIgKz0gY291bnQ7Ci0JfSBlbHNlIHsKLQkJY29weSA9IHBydGQtPmJ1ZmZlcl9zaXplIC0gcHJ0ZC0+YXBwX3BvaW50ZXI7Ci0JCW1lbWNweShkc3RuLCBzcmMsIGNvcHkpOwotCQltZW1jcHkocHJ0ZC0+YnVmZmVyLCBydW50aW1lLT5idWZmZXIsIGNvdW50IC0gY29weSk7Ci0JCXBydGQtPmFwcF9wb2ludGVyID0gY291bnQgLSBjb3B5OwotCX0KLQotCS8qCi0JICogSWYgdGhlIHN0cmVhbSBpcyBzdGFydGVkIGFuZCBhbGwgdGhlIGJ5dGVzIHJlY2VpdmVkIHdlcmUKLQkgKiBjb3BpZWQgdG8gRFNQLCB0aGUgbmV3bHkgcmVjZWl2ZWQgYnl0ZXMgc2hvdWxkIGJlCi0JICogc2VudCByaWdodCBhd2F5Ci0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpICYmCi0JCXBydGQtPmJ5dGVzX3JlY2VpdmVkID09IHBydGQtPmNvcGllZF90b3RhbCkgewotCQlwcnRkLT5ieXRlc19yZWNlaXZlZCArPSBjb3VudDsKLQkJbXNtX2NvbXByX3NlbmRfYnVmZmVyKHBydGQpOwotCX0gZWxzZQotCQlwcnRkLT5ieXRlc19yZWNlaXZlZCArPSBjb3VudDsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9wbGF5YmFja19jb3B5KHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCSAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQl2b2lkICpkc3RuOwotCXNpemVfdCBjb3B5OwotCXVpbnQ2NF90IGJ5dGVzX2F2YWlsYWJsZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczogY291bnQgPSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7Ci0JaWYgKCFwcnRkLT5idWZmZXIpIHsKLQkJcHJfZXJyKCIlczogQnVmZmVyIGlzIG5vdCBhbGxvY2F0ZWQgeWV0ID8/IiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+ZXJyb3IpKSB7Ci0JCXByX2VycigiJXMgR290IFJFU0VUIEVWRU5UUyBub3RpZmljYXRpb24iLCBfX2Z1bmNfXyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQotCWRzdG4gPSBwcnRkLT5idWZmZXIgKyBwcnRkLT5hcHBfcG9pbnRlcjsKLQlpZiAoY291bnQgPCBwcnRkLT5idWZmZXJfc2l6ZSAtIHBydGQtPmFwcF9wb2ludGVyKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihkc3RuLCBidWYsIGNvdW50KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwcnRkLT5hcHBfcG9pbnRlciArPSBjb3VudDsKLQl9IGVsc2UgewotCQljb3B5ID0gcHJ0ZC0+YnVmZmVyX3NpemUgLSBwcnRkLT5hcHBfcG9pbnRlcjsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGRzdG4sIGJ1ZiwgY29weSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBydGQtPmJ1ZmZlciwgYnVmICsgY29weSwgY291bnQgLSBjb3B5KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwcnRkLT5hcHBfcG9pbnRlciA9IGNvdW50IC0gY29weTsKLQl9Ci0KLQkvKgotCSAqIElmIHN0cmVhbSBpcyBzdGFydGVkIGFuZCB0aGVyZSBoYXMgYmVlbiBhbiB4cnVuLAotCSAqIHNpbmNlIHRoZSBhdmFpbGFibGUgYnl0ZXMgZml0cyBmcmFnbWVudF9zaXplLCBjb3B5IHRoZSBkYXRhCi0JICogcmlnaHQgYXdheS4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCXBydGQtPmJ5dGVzX3JlY2VpdmVkICs9IGNvdW50OwotCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKSB7Ci0JCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+eHJ1bikpIHsKLQkJCXByX2RlYnVnKCIlczogaW4geHJ1biwgY291bnQgPSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7Ci0JCQlieXRlc19hdmFpbGFibGUgPSBwcnRkLT5ieXRlc19yZWNlaXZlZCAtCi0JCQkJCSAgcHJ0ZC0+Y29waWVkX3RvdGFsOwotCQkJaWYgKGJ5dGVzX2F2YWlsYWJsZSA+PSBydW50aW1lLT5mcmFnbWVudF9zaXplKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiBoYW5kbGUgeHJ1biwgYnl0ZXNfdG9fd3JpdGUgPSAlbGx1XG4iLAotCQkJCQkgX19mdW5jX18sIGJ5dGVzX2F2YWlsYWJsZSk7Ci0JCQkJYXRvbWljX3NldCgmcHJ0ZC0+eHJ1biwgMCk7Ci0JCQkJbXNtX2NvbXByX3NlbmRfYnVmZmVyKHBydGQpOwotCQkJfSAvKiBlbHNlIG5vdCBzdWZmaWNpZW50IGRhdGEgKi8KLQkJfSAvKiB3cml0ZXMgd2lsbCBjb250aW51ZSBvbiB0aGUgbmV4dCB3cml0ZV9kb25lICovCi0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2NvcHkoc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWUgPSBjc3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jdm9pZCAqc291cmNlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvdW50ID0gJXpkXG4iLCBfX2Z1bmNfXywgY291bnQpOwotCWlmICghcHJ0ZC0+YnVmZmVyKSB7Ci0JCXByX2VycigiJXM6IEJ1ZmZlciBpcyBub3QgYWxsb2NhdGVkIHlldCA/PyIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmVycm9yKSkgewotCQlwcl9lcnIoIiVzIEdvdCBSRVNFVCBFVkVOVFMgbm90aWZpY2F0aW9uIiwgX19mdW5jX18pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5FVFJFU0VUOwotCX0KLQotCXNvdXJjZSA9IHBydGQtPmJ1ZmZlciArIHBydGQtPmFwcF9wb2ludGVyOwotCS8qIGNoZWNrIGlmIHdlIGhhdmUgcmVxdWVzdGVkIGFtb3VudCBvZiBkYXRhIHRvIGNvcHkgdG8gdXNlciovCi0JaWYgKGNvdW50IDw9IHBydGQtPnJlY2VpdmVkX3RvdGFsIC0gcHJ0ZC0+Ynl0ZXNfY29waWVkKQl7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHNvdXJjZSwgY291bnQpKSB7Ci0JCQlwcl9lcnIoImNvcHlfdG9fdXNlciBmYWlsZWQiKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JCXBydGQtPmFwcF9wb2ludGVyICs9IGNvdW50OwotCQlpZiAocHJ0ZC0+YXBwX3BvaW50ZXIgPj0gcHJ0ZC0+YnVmZmVyX3NpemUpCi0JCQlwcnRkLT5hcHBfcG9pbnRlciAtPSBwcnRkLT5idWZmZXJfc2l6ZTsKLQkJcHJ0ZC0+Ynl0ZXNfY29waWVkICs9IGNvdW50OwotCX0KLQltc21fY29tcHJfcmVhZF9idWZmZXIocHJ0ZCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jb3B5KHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIgSW4gJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKLQkJcmV0ID0gbXNtX2NvbXByX3BsYXliYWNrX2NvcHkoY3N0cmVhbSwgYnVmLCBjb3VudCk7Ci0JZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKQotCQlyZXQgPSBtc21fY29tcHJfY2FwdHVyZV9jb3B5KGNzdHJlYW0sIGJ1ZiwgY291bnQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2dldF9jYXBzKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfY29tcHJfY2FwcyAqYXJnKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmICgoYXJnICE9IE5VTEwpICYmIChwcnRkICE9IE5VTEwpKSB7Ci0JCW1lbWNweShhcmcsICZwcnRkLT5jb21wcl9jYXAsIHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKLQl9IGVsc2UgewotCQlyZXQgPSAtRUlOVkFMOwotCQlwcl9lcnIoIiVzOiBhcmcgKDB4JXBLKSwgcHJ0ZCAoMHglcEspXG4iLCBfX2Z1bmNfXywgYXJnLCBwcnRkKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9nZXRfY29kZWNfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgKmNvZGVjKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0Jc3dpdGNoIChjb2RlYy0+Y29kZWMpIHsKLQljYXNlIFNORF9BVURJT0NPREVDX01QMzoKLQkJY29kZWMtPm51bV9kZXNjcmlwdG9ycyA9IDI7Ci0JCWNvZGVjLT5kZXNjcmlwdG9yWzBdLm1heF9jaCA9IDI7Ci0JCW1lbWNweShjb2RlYy0+ZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXMsCi0JCSAgICAgICBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAotCQkgICAgICAgc2l6ZW9mKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpKTsKLQkJY29kZWMtPmRlc2NyaXB0b3JbMF0ubnVtX3NhbXBsZV9yYXRlcyA9Ci0JCQlzaXplb2Yoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcykvc2l6ZW9mKHVuc2lnbmVkIGludCk7Ci0JCWNvZGVjLT5kZXNjcmlwdG9yWzBdLmJpdF9yYXRlWzBdID0gMzIwOyAvKiAzMjBrYnBzICovCi0JCWNvZGVjLT5kZXNjcmlwdG9yWzBdLmJpdF9yYXRlWzFdID0gMTI4OwotCQljb2RlYy0+ZGVzY3JpcHRvclswXS5udW1fYml0cmF0ZXMgPSAyOwotCQljb2RlYy0+ZGVzY3JpcHRvclswXS5wcm9maWxlcyA9IDA7Ci0JCWNvZGVjLT5kZXNjcmlwdG9yWzBdLm1vZGVzID0gU05EX0FVRElPQ0hBTk1PREVfTVAzX1NURVJFTzsKLQkJY29kZWMtPmRlc2NyaXB0b3JbMF0uZm9ybWF0cyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU05EX0FVRElPQ09ERUNfQUFDOgotCQljb2RlYy0+bnVtX2Rlc2NyaXB0b3JzID0gMjsKLQkJY29kZWMtPmRlc2NyaXB0b3JbMV0ubWF4X2NoID0gMjsKLQkJbWVtY3B5KGNvZGVjLT5kZXNjcmlwdG9yWzFdLnNhbXBsZV9yYXRlcywKLQkJICAgICAgIHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMsCi0JCSAgICAgICBzaXplb2Yoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcykpOwotCQljb2RlYy0+ZGVzY3JpcHRvclsxXS5udW1fc2FtcGxlX3JhdGVzID0KLQkJCXNpemVvZihzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzKS9zaXplb2YodW5zaWduZWQgaW50KTsKLQkJY29kZWMtPmRlc2NyaXB0b3JbMV0uYml0X3JhdGVbMF0gPSAzMjA7IC8qIDMyMGticHMgKi8KLQkJY29kZWMtPmRlc2NyaXB0b3JbMV0uYml0X3JhdGVbMV0gPSAxMjg7Ci0JCWNvZGVjLT5kZXNjcmlwdG9yWzFdLm51bV9iaXRyYXRlcyA9IDI7Ci0JCWNvZGVjLT5kZXNjcmlwdG9yWzFdLnByb2ZpbGVzID0gMDsKLQkJY29kZWMtPmRlc2NyaXB0b3JbMV0ubW9kZXMgPSAwOwotCQljb2RlYy0+ZGVzY3JpcHRvclsxXS5mb3JtYXRzID0KLQkJCShTTkRfQVVESU9TVFJFQU1GT1JNQVRfTVA0QURUUyB8Ci0JCQkJU05EX0FVRElPU1RSRUFNRk9STUFUX1JBVyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX0FVRElPQ09ERUNfQUMzOgotCWNhc2UgU05EX0FVRElPQ09ERUNfRUFDMzoKLQljYXNlIFNORF9BVURJT0NPREVDX0ZMQUM6Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19WT1JCSVM6Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19BTEFDOgotCWNhc2UgU05EX0FVRElPQ09ERUNfQVBFOgotCWNhc2UgU05EX0FVRElPQ09ERUNfRFRTOgotCWNhc2UgU05EX0FVRElPQ09ERUNfRFNEOgotCWNhc2UgU05EX0FVRElPQ09ERUNfVFJVRUhEOgotCWNhc2UgU05EX0FVRElPQ09ERUNfSUVDNjE5Mzc6Ci0JY2FzZSBTTkRfQVVESU9DT0RFQ19BUFRYOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnRlZCBhdWRpbyBjb2RlYyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjb2RlYy0+Y29kZWMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfc2V0X21ldGFkYXRhKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfY29tcHJfbWV0YWRhdGEgKm1ldGFkYXRhKQotewotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQ7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIW1ldGFkYXRhIHx8ICFjc3RyZWFtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBydGQgPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFwcnRkIHx8ICFwcnRkLT5hdWRpb19jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogcHJ0ZCBvciBhdWRpbyBjbGllbnQgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKChtZXRhZGF0YS0+a2V5ID09IFNORFJWX0NPTVBSRVNTX0VOQ09ERVJfUEFERElORykgfHwKLQkgICAgIChtZXRhZGF0YS0+a2V5ID09IFNORFJWX0NPTVBSRVNTX0VOQ09ERVJfREVMQVkpKSAmJgotCSAgICAgKHBydGQtPmNvbXByX3Bhc3N0aHIgIT0gTEVHQUNZX1BDTSkpIHsKLQkJcHJfZGVidWcoIiVzOiBObyB0cmFpbGluZyBzaWxlbmNlIGZvciBjb21wcmVzc190eXBlWyVkXVxuIiwKLQkJCV9fZnVuY19fLCBwcnRkLT5jb21wcl9wYXNzdGhyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0JaWYgKG1ldGFkYXRhLT5rZXkgPT0gU05EUlZfQ09NUFJFU1NfRU5DT0RFUl9QQURESU5HKSB7Ci0JCXByX2RlYnVnKCIlcywgZ290IGVuY29kZXIgcGFkZGluZyAldSIsCi0JCQkgX19mdW5jX18sIG1ldGFkYXRhLT52YWx1ZVswXSk7Ci0JCXBydGQtPmdhcGxlc3Nfc3RhdGUudHJhaWxpbmdfc2FtcGxlc19kcm9wID0gbWV0YWRhdGEtPnZhbHVlWzBdOwotCX0gZWxzZSBpZiAobWV0YWRhdGEtPmtleSA9PSBTTkRSVl9DT01QUkVTU19FTkNPREVSX0RFTEFZKSB7Ci0JCXByX2RlYnVnKCIlcywgZ290IGVuY29kZXIgZGVsYXkgJXUiLAotCQkJIF9fZnVuY19fLCBtZXRhZGF0YS0+dmFsdWVbMF0pOwotCQlwcnRkLT5nYXBsZXNzX3N0YXRlLmluaXRpYWxfc2FtcGxlc19kcm9wID0gbWV0YWRhdGEtPnZhbHVlWzBdOwotCX0gZWxzZSBpZiAobWV0YWRhdGEtPmtleSA9PSBTTkRSVl9DT01QUkVTU19SRU5ERVJfTU9ERSkgewotCQlyZXR1cm4gbXNtX2NvbXByX3NldF9yZW5kZXJfbW9kZShwcnRkLCBtZXRhZGF0YS0+dmFsdWVbMF0pOwotCX0gZWxzZSBpZiAobWV0YWRhdGEtPmtleSA9PSBTTkRSVl9DT01QUkVTU19DTEtfUkVDX01PREUpIHsKLQkJcmV0dXJuIG1zbV9jb21wcl9zZXRfY2xrX3JlY19tb2RlKGFjLCBtZXRhZGF0YS0+dmFsdWVbMF0pOwotCX0gZWxzZSBpZiAobWV0YWRhdGEtPmtleSA9PSBTTkRSVl9DT01QUkVTU19SRU5ERVJfV0lORE9XKSB7Ci0JCXJldHVybiBtc21fY29tcHJfc2V0X3JlbmRlcl93aW5kb3coCi0JCQkJYWMsCi0JCQkJbWV0YWRhdGEtPnZhbHVlWzBdLAotCQkJCW1ldGFkYXRhLT52YWx1ZVsxXSwKLQkJCQltZXRhZGF0YS0+dmFsdWVbMl0sCi0JCQkJbWV0YWRhdGEtPnZhbHVlWzNdKTsKLQl9IGVsc2UgaWYgKG1ldGFkYXRhLT5rZXkgPT0gU05EUlZfQ09NUFJFU1NfU1RBUlRfREVMQVkpIHsKLQkJcHJ0ZC0+c3RhcnRfZGVsYXlfbHN3ID0gbWV0YWRhdGEtPnZhbHVlWzBdOwotCQlwcnRkLT5zdGFydF9kZWxheV9tc3cgPSBtZXRhZGF0YS0+dmFsdWVbMV07Ci0JfSBlbHNlIGlmIChtZXRhZGF0YS0+a2V5ID09Ci0JCQkJU05EUlZfQ09NUFJFU1NfRU5BQkxFX0FESlVTVF9TRVNTSU9OX0NMT0NLKSB7Ci0JCXJldHVybiBtc21fY29tcHJfZW5hYmxlX2FkanVzdF9zZXNzaW9uX2Nsb2NrKGFjLAotCQkJCW1ldGFkYXRhLT52YWx1ZVswXSk7Ci0JfSBlbHNlIGlmIChtZXRhZGF0YS0+a2V5ID09IFNORFJWX0NPTVBSRVNTX0FESlVTVF9TRVNTSU9OX0NMT0NLKSB7Ci0JCXJldHVybiBtc21fY29tcHJfYWRqdXN0X3Nlc3Npb25fY2xvY2soYWMsCi0JCQkJbWV0YWRhdGEtPnZhbHVlWzBdLAotCQkJCW1ldGFkYXRhLT52YWx1ZVsxXSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2dldF9tZXRhZGF0YShzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIW1ldGFkYXRhIHx8ICFjc3RyZWFtIHx8ICFjc3RyZWFtLT5ydW50aW1lKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKG1ldGFkYXRhLT5rZXkgIT0gU05EUlZfQ09NUFJFU1NfUEFUSF9ERUxBWSkgewotCQlwcl9lcnIoIiVzLCB1bnN1cHBvcnRlZCBrZXkgJWRcbiIsIF9fZnVuY19fLCBtZXRhZGF0YS0+a2V5KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCB8fCAhcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IHBydGQgb3IgYXVkaW8gY2xpZW50IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlhYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKLQlyZXQgPSBxNmFzbV9nZXRfcGF0aF9kZWxheShwcnRkLT5hdWRpb19jbGllbnQpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogZ2V0X3BhdGhfZGVsYXkgZmFpbGVkLCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByX2RlYnVnKCIlcywgcGF0aCBkZWxheShpbiB1cykgJXVcbiIsIF9fZnVuY19fLCBhYy0+cGF0aF9kZWxheSk7Ci0KLQltZXRhZGF0YS0+dmFsdWVbMF0gPSBhYy0+cGF0aF9kZWxheTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBtc21fY29tcHJfc2V0X25leHRfdHJhY2tfcGFyYW0oc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0sCi0JCQkJdW5pb24gc25kX2NvZGVjX29wdGlvbnMgKmNvZGVjX29wdGlvbnMpCi17Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZDsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY29kZWNfb3B0aW9ucyB8fCAhY3N0cmVhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCB8fCAhcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IHBydGQgb3IgYXVkaW8gY2xpZW50IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IGdvdCBjb2RlYyBvcHRpb25zIGZvciBjb2RlYyB0eXBlICV1IiwKLQkJX19mdW5jX18sIHBydGQtPmNvZGVjKTsKLQlzd2l0Y2ggKHBydGQtPmNvZGVjKSB7Ci0JY2FzZSBGT1JNQVRfV01BX1Y5OgotCWNhc2UgRk9STUFUX1dNQV9WMTBQUk86Ci0JY2FzZSBGT1JNQVRfRkxBQzoKLQljYXNlIEZPUk1BVF9WT1JCSVM6Ci0JY2FzZSBGT1JNQVRfQUxBQzoKLQljYXNlIEZPUk1BVF9BUEU6Ci0JCW1lbWNweSgmKHBydGQtPmdhcGxlc3Nfc3RhdGUuY29kZWNfb3B0aW9ucyksCi0JCQljb2RlY19vcHRpb25zLAotCQkJc2l6ZW9mKHVuaW9uIHNuZF9jb2RlY19vcHRpb25zKSk7Ci0JCXJldCA9IG1zbV9jb21wcl9zZW5kX21lZGlhX2Zvcm1hdF9ibG9jayhjc3RyZWFtLAotCQkJCQkJYWMtPnN0cmVhbV9pZCwgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2VuZCBtZWRpYSBmb3JtYXQgYmxvY2tcbiIsCi0JCQkJX19mdW5jX18pOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBJZ25vcmUgc2VuZGluZyBDTUQgRm9ybWF0IGJsb2NrXG4iLAotCQkJX19mdW5jX18pOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQotCQkJc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcCk7Ci0Jc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0gPSBOVUxMOwotCXVpbnQzMl90ICp2b2x1bWUgPSBOVUxMOwotCi0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXMgUmVjZWl2ZWQgb3V0IG9mIGJvdW5kcyBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljc3RyZWFtID0gcGRhdGEtPmNzdHJlYW1bZmVfaWRdOwotCXZvbHVtZSA9IHBkYXRhLT52b2x1bWVbZmVfaWRdOwotCi0Jdm9sdW1lWzBdID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0Jdm9sdW1lWzFdID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JcHJfZGVidWcoIiVzOiBmZV9pZCAlbHUgbGVmdF92b2wgJWQgcmlnaHRfdm9sICVkXG4iLAotCQkgX19mdW5jX18sIGZlX2lkLCB2b2x1bWVbMF0sIHZvbHVtZVsxXSk7Ci0JaWYgKGNzdHJlYW0pCi0JCW1zbV9jb21wcl9zZXRfdm9sdW1lKGNzdHJlYW0sIHZvbHVtZVswXSwgdm9sdW1lWzFdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgbG9uZyBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCi0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPQotCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQl1aW50MzJfdCAqdm9sdW1lID0gTlVMTDsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZCBmZV9pZCAlbHVcbiIsIF9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXZvbHVtZSA9IHBkYXRhLT52b2x1bWVbZmVfaWRdOwotCXByX2RlYnVnKCIlczogZmVfaWQgJWx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdm9sdW1lWzBdOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdm9sdW1lWzFdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHNfY29uZmlnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHMgPSBOVUxMOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gTlVMTDsKLQlsb25nICp2YWx1ZXMgPSAmKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlpbnQgZWZmZWN0c19tb2R1bGU7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlcyBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGZlX2lkICVsdVxuIiwKLQkJCV9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljc3RyZWFtID0gcGRhdGEtPmNzdHJlYW1bZmVfaWRdOwotCWF1ZGlvX2VmZmVjdHMgPSBwZGF0YS0+YXVkaW9fZWZmZWN0c1tmZV9pZF07Ci0JaWYgKCFjc3RyZWFtIHx8ICFhdWRpb19lZmZlY3RzKSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSBvciBlZmZlY3RzIGluYWN0aXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBjYW5ub3Qgc2V0IGF1ZGlvIGVmZmVjdHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChwcnRkLT5jb21wcl9wYXNzdGhyICE9IExFR0FDWV9QQ00pIHsKLQkJcHJfZGVidWcoIiVzOiBObyBlZmZlY3RzIGZvciBjb21wcl90eXBlWyVkXVxuIiwKLQkJCV9fZnVuY19fLCBwcnRkLT5jb21wcl9wYXNzdGhyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXByX2RlYnVnKCIlczogRWZmZWN0cyBzdXBwb3J0ZWQgZm9yIGNvbXByX3R5cGVbJWRdXG4iLAotCQkgX19mdW5jX18sIHBydGQtPmNvbXByX3Bhc3N0aHIpOwotCi0JZWZmZWN0c19tb2R1bGUgPSAqdmFsdWVzKys7Ci0Jc3dpdGNoIChlZmZlY3RzX21vZHVsZSkgewotCWNhc2UgVklSVFVBTElaRVJfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IFZJUlRVQUxJWkVSX01PRFVMRVxuIiwgX19mdW5jX18pOwotCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKGVmZmVjdHNfbW9kdWxlLAotCQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT50b3BvbG9neSkpCi0JCQltc21fYXVkaW9fZWZmZWN0c192aXJ0dWFsaXplcl9oYW5kbGVyKAotCQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQkJJihhdWRpb19lZmZlY3RzLT52aXJ0dWFsaXplciksCi0JCQkJCQl2YWx1ZXMpOwotCQlicmVhazsKLQljYXNlIFJFVkVSQl9NT0RVTEU6Ci0JCXByX2RlYnVnKCIlczogUkVWRVJCX01PRFVMRVxuIiwgX19mdW5jX18pOwotCQlpZiAobXNtX2F1ZGlvX2VmZmVjdHNfaXNfZWZmbW9kdWxlX3N1cHBfaW5fdG9wKGVmZmVjdHNfbW9kdWxlLAotCQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT50b3BvbG9neSkpCi0JCQltc21fYXVkaW9fZWZmZWN0c19yZXZlcmJfaGFuZGxlcihwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkgJihhdWRpb19lZmZlY3RzLT5yZXZlcmIpLAotCQkJCQkJIHZhbHVlcyk7Ci0JCWJyZWFrOwotCWNhc2UgQkFTU19CT09TVF9NT0RVTEU6Ci0JCXByX2RlYnVnKCIlczogQkFTU19CT09TVF9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKG1zbV9hdWRpb19lZmZlY3RzX2lzX2VmZm1vZHVsZV9zdXBwX2luX3RvcChlZmZlY3RzX21vZHVsZSwKLQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+dG9wb2xvZ3kpKQotCQkJbXNtX2F1ZGlvX2VmZmVjdHNfYmFzc19ib29zdF9oYW5kbGVyKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCSAgICYoYXVkaW9fZWZmZWN0cy0+YmFzc19ib29zdCksCi0JCQkJCQkgICAgIHZhbHVlcyk7Ci0JCWJyZWFrOwotCWNhc2UgUEJFX01PRFVMRToKLQkJcHJfZGVidWcoIiVzOiBQQkVfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoZWZmZWN0c19tb2R1bGUsCi0JCQkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnRvcG9sb2d5KSkKLQkJCW1zbV9hdWRpb19lZmZlY3RzX3BiZV9oYW5kbGVyKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJCSAgICYoYXVkaW9fZWZmZWN0cy0+cGJlKSwKLQkJCQkJCSAgICAgdmFsdWVzKTsKLQkJYnJlYWs7Ci0JY2FzZSBFUV9NT0RVTEU6Ci0JCXByX2RlYnVnKCIlczogRVFfTU9EVUxFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChtc21fYXVkaW9fZWZmZWN0c19pc19lZmZtb2R1bGVfc3VwcF9pbl90b3AoZWZmZWN0c19tb2R1bGUsCi0JCQkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnRvcG9sb2d5KSkKLQkJCW1zbV9hdWRpb19lZmZlY3RzX3BvcGxlc3NfZXFfaGFuZGxlcihwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkgICAgJihhdWRpb19lZmZlY3RzLT5lcXVhbGl6ZXIpLAotCQkJCQkJICAgICB2YWx1ZXMpOwotCQlicmVhazsKLQljYXNlIFNPRlRfVk9MVU1FX01PRFVMRToKLQkJcHJfZGVidWcoIiVzOiBTT0ZUX1ZPTFVNRV9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT0ZUX1ZPTFVNRTJfTU9EVUxFOgotCQlwcl9kZWJ1ZygiJXM6IFNPRlRfVk9MVU1FMl9NT0RVTEVcbiIsIF9fZnVuY19fKTsKLQkJaWYgKG1zbV9hdWRpb19lZmZlY3RzX2lzX2VmZm1vZHVsZV9zdXBwX2luX3RvcChlZmZlY3RzX21vZHVsZSwKLQkJCQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+dG9wb2xvZ3kpKQotCQkJbXNtX2F1ZGlvX2VmZmVjdHNfdm9sdW1lX2hhbmRsZXJfdjIocHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCQkJJihhdWRpb19lZmZlY3RzLT52b2x1bWUpLAotCQkJCQkJdmFsdWVzLCBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBJbnZhbGlkIGVmZmVjdHMgY29uZmlnIG1vZHVsZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHNfY29uZmlnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHMgPSBOVUxMOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWx1XG4iLAotCQkJX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNzdHJlYW0gPSBwZGF0YS0+Y3N0cmVhbVtmZV9pZF07Ci0JYXVkaW9fZWZmZWN0cyA9IHBkYXRhLT5hdWRpb19lZmZlY3RzW2ZlX2lkXTsKLQlpZiAoIWNzdHJlYW0gfHwgIWF1ZGlvX2VmZmVjdHMpIHsKLQkJcHJfZXJyKCIlczogc3RyZWFtIG9yIGVmZmVjdHMgaW5hY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBydGQgPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFwcnRkKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfcXVlcnlfYXVkaW9fZWZmZWN0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHMgPSBOVUxMOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gTlVMTDsKLQlsb25nICp2YWx1ZXMgPSAmKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWx1XG4iLAotCQkJX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNzdHJlYW0gPSBwZGF0YS0+Y3N0cmVhbVtmZV9pZF07Ci0JYXVkaW9fZWZmZWN0cyA9IHBkYXRhLT5hdWRpb19lZmZlY3RzW2ZlX2lkXTsKLQlpZiAoIWNzdHJlYW0gfHwgIWF1ZGlvX2VmZmVjdHMpIHsKLQkJcHJfZXJyKCIlczogc3RyZWFtIG9yIGVmZmVjdHMgaW5hY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBydGQgPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFwcnRkKSB7Ci0JCXByX2VycigiJXM6IGNhbm5vdCBzZXQgYXVkaW8gZWZmZWN0c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHBydGQtPmNvbXByX3Bhc3N0aHIgIT0gTEVHQUNZX1BDTSkgewotCQlwcl9lcnIoIiVzOiBObyBlZmZlY3RzIGZvciBjb21wcl90eXBlWyVkXVxuIiwKLQkJCV9fZnVuY19fLCBwcnRkLT5jb21wcl9wYXNzdGhyKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0JYXVkaW9fZWZmZWN0cy0+cXVlcnkubW9kX2lkID0gKHUzMikqdmFsdWVzKys7Ci0JYXVkaW9fZWZmZWN0cy0+cXVlcnkucGFybV9pZCA9ICh1MzIpKnZhbHVlcysrOwotCWF1ZGlvX2VmZmVjdHMtPnF1ZXJ5LnNpemUgPSAodTMyKSp2YWx1ZXMrKzsKLQlhdWRpb19lZmZlY3RzLT5xdWVyeS5vZmZzZXQgPSAodTMyKSp2YWx1ZXMrKzsKLQlhdWRpb19lZmZlY3RzLT5xdWVyeS5kZXZpY2UgPSAodTMyKSp2YWx1ZXMrKzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfcXVlcnlfYXVkaW9fZWZmZWN0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHMgKmF1ZGlvX2VmZmVjdHMgPSBOVUxMOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkID0gTlVMTDsKLQlsb25nICp2YWx1ZXMgPSAmKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWx1XG4iLAotCQkJX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNzdHJlYW0gPSBwZGF0YS0+Y3N0cmVhbVtmZV9pZF07Ci0JYXVkaW9fZWZmZWN0cyA9IHBkYXRhLT5hdWRpb19lZmZlY3RzW2ZlX2lkXTsKLQlpZiAoIWNzdHJlYW0gfHwgIWF1ZGlvX2VmZmVjdHMpIHsKLQkJcHJfZGVidWcoIiVzOiBzdHJlYW0gb3IgZWZmZWN0cyBpbmFjdGl2ZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJ0ZCA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBhdWRpbyBlZmZlY3RzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl2YWx1ZXNbMF0gPSAobG9uZylhdWRpb19lZmZlY3RzLT5xdWVyeS5tb2RfaWQ7Ci0JdmFsdWVzWzFdID0gKGxvbmcpYXVkaW9fZWZmZWN0cy0+cXVlcnkucGFybV9pZDsKLQl2YWx1ZXNbMl0gPSAobG9uZylhdWRpb19lZmZlY3RzLT5xdWVyeS5zaXplOwotCXZhbHVlc1szXSA9IChsb25nKWF1ZGlvX2VmZmVjdHMtPnF1ZXJ5Lm9mZnNldDsKLQl2YWx1ZXNbNF0gPSAobG9uZylhdWRpb19lZmZlY3RzLT5xdWVyeS5kZXZpY2U7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3NlbmRfZGVjX3BhcmFtcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQkgICAgIHN0cnVjdCBtc21fY29tcHJfZGVjX3BhcmFtcyAqZGVjX3BhcmFtcywKLQkJCQkgICAgIGludCBzdHJlYW1faWQpCi17Ci0KLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtc21fY29tcHJfYXVkaW8gKnBydGQgPSBOVUxMOwotCXN0cnVjdCBzbmRfZGVjX2RkcCAqZGRwID0gJmRlY19wYXJhbXMtPmRkcF9wYXJhbXM7Ci0KLQlpZiAoIWNzdHJlYW0gfHwgIWRlY19wYXJhbXMpIHsKLQkJcHJfZXJyKCIlczogc3RyZWFtIG9yIGRlY19wYXJhbXMgaW5hY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0JcHJ0ZCA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBkZWNfcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCXN3aXRjaCAocHJ0ZC0+Y29kZWMpIHsKLQljYXNlIEZPUk1BVF9NUDM6Ci0JY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgotCWNhc2UgRk9STUFUX1RSVUVIRDoKLQljYXNlIEZPUk1BVF9JRUM2MTkzNzoKLQljYXNlIEZPUk1BVF9BUFRYOgotCQlwcl9kZWJ1ZygiJXM6IG5vIHJ1bnRpbWUgcGFyYW1ldGVycyBmb3IgY29kZWM6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBwcnRkLT5jb2RlYyk7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FDMzoKLQljYXNlIEZPUk1BVF9FQUMzOgotCQlpZiAocHJ0ZC0+Y29tcHJfcGFzc3RociAhPSBMRUdBQ1lfUENNKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IE5vIEREUCBwYXJhbSBmb3IgY29tcHJfdHlwZVslZF1cbiIsCi0JCQkJIF9fZnVuY19fLCBwcnRkLT5jb21wcl9wYXNzdGhyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXJjID0gbXNtX2NvbXByX3NlbmRfZGRwX2NmZyhwcnRkLT5hdWRpb19jbGllbnQsIGRkcCwgc3RyZWFtX2lkKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IEREUCBDTUQgQ0ZHIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotZW5kOgotCXJldHVybiByYzsKLQotfQotc3RhdGljIGludCBtc21fY29tcHJfZGVjX3BhcmFtc19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQotCQkJc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcCk7Ci0Jc3RydWN0IG1zbV9jb21wcl9kZWNfcGFyYW1zICpkZWNfcGFyYW1zID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZCA9IE5VTEw7Ci0JbG9uZyAqdmFsdWVzID0gJih1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWx1XG4iLAotCQkJX19mdW5jX18sIGZlX2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQljc3RyZWFtID0gcGRhdGEtPmNzdHJlYW1bZmVfaWRdOwotCWRlY19wYXJhbXMgPSBwZGF0YS0+ZGVjX3BhcmFtc1tmZV9pZF07Ci0KLQlpZiAoIWNzdHJlYW0gfHwgIWRlY19wYXJhbXMpIHsKLQkJcHJfZXJyKCIlczogc3RyZWFtIG9yIGRlY19wYXJhbXMgaW5hY3RpdmVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0JcHJ0ZCA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlczogY2Fubm90IHNldCBkZWNfcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0Jc3dpdGNoIChwcnRkLT5jb2RlYykgewotCWNhc2UgRk9STUFUX01QMzoKLQljYXNlIEZPUk1BVF9NUEVHNF9BQUM6Ci0JY2FzZSBGT1JNQVRfRkxBQzoKLQljYXNlIEZPUk1BVF9WT1JCSVM6Ci0JY2FzZSBGT1JNQVRfQUxBQzoKLQljYXNlIEZPUk1BVF9BUEU6Ci0JY2FzZSBGT1JNQVRfRFRTOgotCWNhc2UgRk9STUFUX0RTRDoKLQljYXNlIEZPUk1BVF9UUlVFSEQ6Ci0JY2FzZSBGT1JNQVRfSUVDNjE5Mzc6Ci0JY2FzZSBGT1JNQVRfQVBUWDoKLQkJcHJfZGVidWcoIiVzOiBubyBydW50aW1lIHBhcmFtZXRlcnMgZm9yIGNvZGVjOiAlZFxuIiwgX19mdW5jX18sCi0JCQkgcHJ0ZC0+Y29kZWMpOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BQzM6Ci0JY2FzZSBGT1JNQVRfRUFDMzogewotCQlzdHJ1Y3Qgc25kX2RlY19kZHAgKmRkcCA9ICZkZWNfcGFyYW1zLT5kZHBfcGFyYW1zOwotCQlpbnQgY250OwotCi0JCWlmIChwcnRkLT5jb21wcl9wYXNzdGhyICE9IExFR0FDWV9QQ00pIHsKLQkJCXByX2RlYnVnKCIlczogTm8gRERQIHBhcmFtIGZvciBjb21wcl90eXBlWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgcHJ0ZC0+Y29tcHJfcGFzc3Rocik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWRkcC0+cGFyYW1zX2xlbmd0aCA9ICgqdmFsdWVzKyspOwotCQlpZiAoZGRwLT5wYXJhbXNfbGVuZ3RoID4gRERQX0RFQ19NQVhfTlVNX1BBUkFNKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG51bSBvZiBwYXJhbXM6OiAlZFxuIiwgX19mdW5jX18sCi0JCQkJZGRwLT5wYXJhbXNfbGVuZ3RoKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCWZvciAoY250ID0gMDsgY250IDwgZGRwLT5wYXJhbXNfbGVuZ3RoOyBjbnQrKykgewotCQkJZGRwLT5wYXJhbXNfaWRbY250XSA9ICp2YWx1ZXMrKzsKLQkJCWRkcC0+cGFyYW1zX3ZhbHVlW2NudF0gPSAqdmFsdWVzKys7Ci0JCX0KLQkJcHJ0ZCA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQkJaWYgKHBydGQgJiYgcHJ0ZC0+YXVkaW9fY2xpZW50KQotCQkJcmMgPSBtc21fY29tcHJfc2VuZF9kZWNfcGFyYW1zKGNzdHJlYW0sIGRlY19wYXJhbXMsCi0JCQkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnN0cmVhbV9pZCk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci1lbmQ6Ci0JcHJfZGVidWcoIiVzOiByZXQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9kZWNfcGFyYW1zX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JLyogZHVtbXkgZnVuY3Rpb24gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1JYOwotCWludCBiZV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MCwgMCwgNDgwMDB9OwotCWludCByZXQgPSAwOwotCi0JY2ZnX2RhdGEuYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQljZmdfZGF0YS5hY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQotCQljZmdfZGF0YS5zYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOwotCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHUgc2Vzc2lvbl90eXBlLSAlZCBiZV9pZC0gJWQgYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICBiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1JYOwotCWludCBiZV9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswfTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgc2Vzc2lvbl90eXBlLAotCQkJCQkJICAgICAgJmJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2ZnX2RhdGEuYXBwX3R5cGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjZmdfZGF0YS5hY2RiX2Rldl9pZDsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IGNmZ19kYXRhLnNhbXBsZV9yYXRlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gYmVfaWQ7Ci0JcHJfZGVidWcoIiVzOiBmZWRhaV9pZCAlbGx1LCBzZXNzaW9uX3R5cGUgJWQsIGJlX2lkICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAotCQlfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgYmVfaWQsCi0JCWNmZ19kYXRhLmFwcF90eXBlLCBjZmdfZGF0YS5hY2RiX2Rldl9pZCwgY2ZnX2RhdGEuc2FtcGxlX3JhdGUpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2FwcF90eXBlX2NmZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7Ci0JaW50IGJlX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM107Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswLCAwLCA0ODAwMH07Ci0JaW50IHJldCA9IDA7Ci0KLQljZmdfZGF0YS5hcHBfdHlwZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWNmZ19kYXRhLmFjZGJfZGV2X2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdICE9IDApCi0JCWNmZ19kYXRhLnNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0JcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdSBzZXNzaW9uX3R5cGUtICVkIGJlX2lkLSAlZCBhcHBfdHlwZS0gJWQgYWNkYl9kZXZfaWQtICVkIHNhbXBsZV9yYXRlLSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgIGJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jYXB0dXJlX2FwcF90eXBlX2NmZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7Ci0JaW50IGJlX2lkID0gMDsKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIGNmZ19kYXRhID0gezB9OwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICAmYmVfaWQsICZjZmdfZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjZmdfZGF0YS5hcHBfdHlwZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNmZ19kYXRhLmFjZGJfZGV2X2lkOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0gY2ZnX2RhdGEuc2FtcGxlX3JhdGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPSBiZV9pZDsKLQlwcl9kZWJ1ZygiJXM6IGZlZGFpX2lkICVsbHUsIHNlc3Npb25fdHlwZSAlZCwgYmVfaWQgJWQsIGFwcF90eXBlICVkLCBhY2RiX2Rldl9pZCAlZCwgc2FtcGxlX3JhdGUgJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2NoYW5uZWxfbWFwX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlpbnQgcmMgPSAwLCBpOwotCi0JcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdVxuIiwgX19mdW5jX18sIGZlX2lkKTsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWxsdVxuIiwKLQkJCV9fZnVuY19fLCBmZV9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKHBkYXRhLT5jaF9tYXBbZmVfaWRdKSB7Ci0JCXBkYXRhLT5jaF9tYXBbZmVfaWRdLT5zZXRfY2hfbWFwID0gdHJ1ZTsKLQkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCi0JCQlwZGF0YS0+Y2hfbWFwW2ZlX2lkXS0+Y2hhbm5lbF9tYXBbaV0gPQotCQkJCShjaGFyKSh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBubyBtZW1vcnkgZm9yIGNoX21hcCwgZGVmYXVsdCB3aWxsIGJlIHNldFxuIiwKLQkJCV9fZnVuY19fKTsKLQl9Ci1lbmQ6Ci0JcHJfZGVidWcoIiVzOiByZXQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9jaGFubmVsX21hcF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQotCQkJc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcCk7Ci0JaW50IHJjID0gMCwgaTsKLQotCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHVcbiIsIF9fZnVuY19fLCBmZV9pZCk7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXM6IFJlY2VpdmVkIG91dCBvZiBib3VuZHMgZmVfaWQgJWxsdVxuIiwKLQkJCV9fZnVuY19fLCBmZV9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCWlmIChwZGF0YS0+Y2hfbWFwW2ZlX2lkXSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUw7IGkrKykKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0KLQkJCQlwZGF0YS0+Y2hfbWFwW2ZlX2lkXS0+Y2hhbm5lbF9tYXBbaV07Ci0JfQotZW5kOgotCXByX2RlYnVnKCIlczogcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYWRzcF9zdHJlYW1fY21kX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgbG9uZyBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhID0gKHN0cnVjdCBtc21fY29tcHJfcGRhdGEgKikKLQkJCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9jb21wcl9hdWRpbyAqcHJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqZXZlbnRfZGF0YSA9IE5VTEw7Ci0KLQlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlcyBSZWNlaXZlZCBpbnZhbGlkIGZlX2lkICVsdVxuIiwKLQkJCV9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljc3RyZWFtID0gcGRhdGEtPmNzdHJlYW1bZmVfaWRdOwotCWlmIChjc3RyZWFtID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBjc3RyZWFtIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXBydGQgPSBjc3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFwcnRkKSB7Ci0JCXByX2VycigiJXM6IHBydGQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHBydGQtPmF1ZGlvX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2NsaWVudCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlldmVudF9kYXRhID0gKHN0cnVjdCBtc21fYWRzcF9ldmVudF9kYXRhICopdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGE7Ci0JaWYgKChldmVudF9kYXRhLT5ldmVudF90eXBlIDwgQURTUF9TVFJFQU1fUFBfRVZFTlQpIHx8Ci0JICAgIChldmVudF9kYXRhLT5ldmVudF90eXBlID49IEFEU1BfU1RSRUFNX0VWRU5UX01BWCkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBldmVudF90eXBlPSVkIiwKLQkJCV9fZnVuY19fLCBldmVudF9kYXRhLT5ldmVudF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgoc2l6ZW9mKHN0cnVjdCBtc21fYWRzcF9ldmVudF9kYXRhKSArIGV2ZW50X2RhdGEtPnBheWxvYWRfbGVuKSA+PQotCQkJCQlzaXplb2YodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEpKSB7Ci0JCXByX2VycigiJXMgcGFyYW0gbGVuZ3RoPSVkICBleGNlZWRzIGxpbWl0IiwKLQkJCV9fZnVuY19fLCBldmVudF9kYXRhLT5wYXlsb2FkX2xlbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBxNmFzbV9zZW5kX3N0cmVhbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBldmVudF9kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNlbmQgc3RyZWFtIGV2ZW50IGNtZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfaW9uX2ZkX21hcF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQotCQkJCXNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXApOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOwotCWludCBmZDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgaW52YWxpZCBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3N0cmVhbSA9IHBkYXRhLT5jc3RyZWFtW2ZlX2lkXTsKLQlpZiAoY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgY3N0cmVhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChwcnRkLT5hdWRpb19jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19jbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KCZmZCwgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsIHNpemVvZihmZCkpOwotCXJldCA9IHE2YXNtX3NlbmRfaW9uX2ZkKHBydGQtPmF1ZGlvX2NsaWVudCwgZmQpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaW9uIGZkXG4iLCBfX2Z1bmNfXyk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3J0aWNfZXZlbnRfYWNrX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQkJCXNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXApOwotCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3QgbXNtX2NvbXByX2F1ZGlvICpwcnRkOwotCWludCByZXQgPSAwOwotCWludCBwYXJhbV9sZW5ndGggPSAwOwotCi0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXMgUmVjZWl2ZWQgaW52YWxpZCBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3N0cmVhbSA9IHBkYXRhLT5jc3RyZWFtW2ZlX2lkXTsKLQlpZiAoY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgY3N0cmVhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChwcnRkLT5hdWRpb19jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19jbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KCZwYXJhbV9sZW5ndGgsIHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAotCQlzaXplb2YocGFyYW1fbGVuZ3RoKSk7Ci0JaWYgKChwYXJhbV9sZW5ndGggKyBzaXplb2YocGFyYW1fbGVuZ3RoKSkKLQkJPj0gc2l6ZW9mKHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhKSkgewotCQlwcl9lcnIoIiVzIHBhcmFtIGxlbmd0aD0lZCAgZXhjZWVkcyBsaW1pdCIsCi0JCQlfX2Z1bmNfXywgcGFyYW1fbGVuZ3RoKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHE2YXNtX3NlbmRfcnRpY19ldmVudF9hY2socHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBzaXplb2YocGFyYW1fbGVuZ3RoKSwKLQkJCXBhcmFtX2xlbmd0aCk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBzZW5kIHJ0aWMgZXZlbnQgYWNrLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9nYXBsZXNzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqcGRhdGEgPSAoc3RydWN0IG1zbV9jb21wcl9wZGF0YSAqKQotCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlwZGF0YS0+dXNlX2RzcF9nYXBsZXNzX21vZGUgPSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcHJfZGVidWcoIiVzOiB2YWx1ZTogJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2dhcGxlc3NfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNvbXApOwotCXByX2RlYnVnKCIlczpnYXBsZXNzIG1vZGUgJWRcbiIsIF9fZnVuY19fLCBwZGF0YS0+dXNlX2RzcF9nYXBsZXNzX21vZGUpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcGRhdGEtPnVzZV9kc3BfZ2FwbGVzc19tb2RlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY29tcHJfZ2FwbGVzc19jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDb21wcmVzcyBHYXBsZXNzIFBsYXliYWNrIiwKLQkJCTAsIDAsIDEsIDAsCi0JCQltc21fY29tcHJfZ2FwbGVzc19nZXQsCi0JCQltc21fY29tcHJfZ2FwbGVzc19wdXQpLAotfTsKLQotc3RhdGljIGludCBtc21fY29tcHJfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhOwotCWludCBpOwotCWludCByYzsKLQljb25zdCBjaGFyICpxZHNwX3ZlcnNpb247Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlwZGF0YSA9IChzdHJ1Y3QgbXNtX2NvbXByX3BkYXRhICopCi0JCQlremFsbG9jKHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNuZF9zb2NfcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdGZvcm0sIHBkYXRhKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNU01fRlJPTlRFTkRfREFJX01BWDsgaSsrKSB7Ci0JCXBkYXRhLT52b2x1bWVbaV1bMF0gPSBDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFM7Ci0JCXBkYXRhLT52b2x1bWVbaV1bMV0gPSBDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFM7Ci0JCXBkYXRhLT5hdWRpb19lZmZlY3RzW2ldID0gTlVMTDsKLQkJcGRhdGEtPmRlY19wYXJhbXNbaV0gPSBOVUxMOwotCQlwZGF0YS0+Y3N0cmVhbVtpXSA9IE5VTEw7Ci0JCXBkYXRhLT5jaF9tYXBbaV0gPSBOVUxMOwotCX0KLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fY29tcHJfZ2FwbGVzc19jb250cm9scywKLQkJCQkgICAgICBBUlJBWV9TSVpFKG1zbV9jb21wcl9nYXBsZXNzX2NvbnRyb2xzKSk7Ci0KLQlyYyA9ICBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwbGF0Zm9ybS0+ZGV2LT5vZl9ub2RlLAotCQkicWNvbSxhZHNwLXZlcnNpb24iLCAmcWRzcF92ZXJzaW9uKTsKLQlpZiAoIXJjKSB7Ci0JCWlmICghc3RyY21wKHFkc3BfdmVyc2lvbiwgIk1EU1AgMS4yIikpCi0JCQlwZGF0YS0+dXNlX2xlZ2FjeV9hcGkgPSB0cnVlOwotCQllbHNlCi0JCQlwZGF0YS0+dXNlX2xlZ2FjeV9hcGkgPSBmYWxzZTsKLQl9IGVsc2UKLQkJcGRhdGEtPnVzZV9sZWdhY3lfYXBpID0gZmFsc2U7Ci0KLQlwcl9kZWJ1ZygiJXM6IHVzZSBsZWdhY3kgYXBpICVkXG4iLCBfX2Z1bmNfXywgcGRhdGEtPnVzZV9sZWdhY3lfYXBpKTsKLQkvKgotCSAqIHVzZV9kc3BfZ2FwbGVzc19tb2RlIHBhcnQgb2YgcGxhdGZvcm0gZGF0YShwZGF0YSkgaXMgdXBkYXRlZCBmcm9tIEhBTAotCSAqIHRocm91Z2ggYSBtaXhlciBjb250cm9sIGJlZm9yZSBjb21wcmVzcyBkcml2ZXIgaXMgb3BlbmVkLiBUaGUgbWl4ZXIKLQkgKiBjb250cm9sIGlzIHVzZWQgdG8gZGVjaWRlIGlmIGRzcCBnYXBsZXNzIG1vZGUgbmVlZHMgdG8gYmUgZW5hYmxlZC4KLQkgKiBHYXBsZXNzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCi0JICovCi0JcGRhdGEtPnVzZV9kc3BfZ2FwbGVzc19tb2RlID0gZmFsc2U7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCXVpbmZvLT5jb3VudCA9IDI7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBDT01QUkVTU0VEX0xSX1ZPTF9NQVhfU1RFUFM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHNfY29uZmlnX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCXVpbmZvLT5jb3VudCA9IE1BWF9QUF9QQVJBTVNfU1o7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweEZGRkZGRkZGOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9xdWVyeV9hdWRpb19lZmZlY3RfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOwotCXVpbmZvLT5jb3VudCA9IDEyODsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4RkZGRkZGRkY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2RlY19wYXJhbXNfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gMTI4OwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHhGRkZGRkZGRjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYXBwX3R5cGVfY2ZnX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gNTsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDB4RkZGRkZGRkY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2NoYW5uZWxfbWFwX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKLQl1aW5mby0+Y291bnQgPSA4OwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHhGRkZGRkZGRjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYWRkX3ZvbHVtZV9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSAiQ29tcHJlc3MgUGxheWJhY2siOwotCWNvbnN0IGNoYXIgKmRldmljZU5vICAgICAgID0gIk5OIjsKLQljb25zdCBjaGFyICpzdWZmaXggICAgICAgICA9ICJWb2x1bWUiOwotCWNoYXIgKm1peGVyX3N0ciA9IE5VTEw7Ci0JaW50IGN0bF9sZW47Ci0Jc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZmVfdm9sdW1lX2NvbnRyb2xbMV0gPSB7Ci0JCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIj8iLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEIHwKLQkJCSAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBtc21fY29tcHJfdm9sdW1lX2luZm8sCi0JCS50bHYucCA9IG1zbV9jb21wcl92b2xfZ2FpbiwKLQkJLmdldCA9IG1zbV9jb21wcl92b2x1bWVfZ2V0LAotCQkucHV0ID0gbXNtX2NvbXByX3ZvbHVtZV9wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzIE5VTEwgcnRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGFkZGVkIG5ldyBjb21wciBGRSB3aXRoIG5hbWUgJXMsIGlkICVkLCBjcHUgZGFpICVzLCBkZXZpY2Ugbm8gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcnRkLT5kYWlfbGluay0+bmFtZSwgcnRkLT5kYWlfbGluay0+aWQsCi0JCSBydGQtPmRhaV9saW5rLT5jcHVfZGFpX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxICsKLQkJICBzdHJsZW4oc3VmZml4KSArIDE7Ci0JbWl4ZXJfc3RyID0ga3phbGxvYyhjdGxfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1peGVyX3N0cikgewotCQlwcl9lcnIoImZhaWxlZCB0byBhbGxvY2F0ZSBtaXhlciBjdHJsIHN0ciBvZiBsZW4gJWQiLCBjdGxfbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkICVzIiwgbWl4ZXJfY3RsX25hbWUsCi0JCSBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOwotCWZlX3ZvbHVtZV9jb250cm9sWzBdLm5hbWUgPSBtaXhlcl9zdHI7Ci0JZmVfdm9sdW1lX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCJSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzIiwgbWl4ZXJfc3RyKTsKLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLCBmZV92b2x1bWVfY29udHJvbCwKLQkJCQkgICAgICBBUlJBWV9TSVpFKGZlX3ZvbHVtZV9jb250cm9sKSk7Ci0Ja2ZyZWUobWl4ZXJfc3RyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYWRkX2F1ZGlvX2VmZmVjdHNfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gIkF1ZGlvIEVmZmVjdHMgQ29uZmlnIjsKLQljb25zdCBjaGFyICpkZXZpY2VObyAgICAgICA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbjsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9hdWRpb19lZmZlY3RzX2NvbmZpZ19jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHNfY29uZmlnX2luZm8sCi0JCS5nZXQgPSBtc21fY29tcHJfYXVkaW9fZWZmZWN0c19jb25maWdfZ2V0LAotCQkucHV0ID0gbXNtX2NvbXByX2F1ZGlvX2VmZmVjdHNfY29uZmlnX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCi0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHJ0ZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGFkZGVkIG5ldyBjb21wciBGRSB3aXRoIG5hbWUgJXMsIGlkICVkLCBjcHUgZGFpICVzLCBkZXZpY2Ugbm8gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcnRkLT5kYWlfbGluay0+bmFtZSwgcnRkLT5kYWlfbGluay0+aWQsCi0JCSBydGQtPmRhaV9saW5rLT5jcHVfZGFpX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCi0JY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDE7Ci0JbWl4ZXJfc3RyID0ga3phbGxvYyhjdGxfbGVuLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbWl4ZXJfc3RyKQotCQlyZXR1cm4gMDsKLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCi0JZmVfYXVkaW9fZWZmZWN0c19jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2F1ZGlvX2VmZmVjdHNfY29uZmlnX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCJSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBtaXhlcl9zdHIpOwotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQkJZmVfYXVkaW9fZWZmZWN0c19jb25maWdfY29udHJvbCwKLQkJCQlBUlJBWV9TSVpFKGZlX2F1ZGlvX2VmZmVjdHNfY29uZmlnX2NvbnRyb2wpKTsKLQlrZnJlZShtaXhlcl9zdHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hZGRfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2woCi0JCQkJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSAiUXVlcnkgQXVkaW8gRWZmZWN0IFBhcmFtIjsKLQljb25zdCBjaGFyICpkZXZpY2VObyAgICAgICA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbjsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9xdWVyeV9hdWRpb19lZmZlY3RfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9jb21wcl9xdWVyeV9hdWRpb19lZmZlY3RfaW5mbywKLQkJLmdldCA9IG1zbV9jb21wcl9xdWVyeV9hdWRpb19lZmZlY3RfZ2V0LAotCQkucHV0ID0gbXNtX2NvbXByX3F1ZXJ5X2F1ZGlvX2VmZmVjdF9wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHJ0ZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBhZGRlZCBuZXcgY29tcHIgRkUgd2l0aCBuYW1lICVzLCBpZCAlZCwgY3B1IGRhaSAlcywgZGV2aWNlIG5vICVkXG4iLAotCQkgX19mdW5jX18sIHJ0ZC0+ZGFpX2xpbmstPm5hbWUsIHJ0ZC0+ZGFpX2xpbmstPmlkLAotCQkgcnRkLT5kYWlfbGluay0+Y3B1X2RhaV9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlKTsKLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghbWl4ZXJfc3RyKSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIG1peGVyIGN0cmwgc3RyIG9mIGxlbiAlZCIsIGN0bF9sZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQiLCBtaXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7Ci0JZmVfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9xdWVyeV9hdWRpb19lZmZlY3RfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiByZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCWZlX3F1ZXJ5X2F1ZGlvX2VmZmVjdF9jb250cm9sLAotCQkJCUFSUkFZX1NJWkUoZmVfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2wpKTsKLQlrZnJlZShtaXhlcl9zdHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hZGRfYXVkaW9fYWRzcF9zdHJlYW1fY21kX2NvbnRyb2woCi0JCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gRFNQX1NUUkVBTV9DTUQ7Ci0JY29uc3QgY2hhciAqZGV2aWNlTm8gPSAiTk4iOwotCWNoYXIgKm1peGVyX3N0ciA9IE5VTEw7Ci0JaW50IGN0bF9sZW4gPSAwLCByZXQgPSAwOwotCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGZlX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NtZF9jb25maWdfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9hZHNwX3N0cmVhbV9jbWRfaW5mbywKLQkJLnB1dCA9IG1zbV9jb21wcl9hZHNwX3N0cmVhbV9jbWRfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IDAsCi0JCX0KLQl9OwotCi0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHJ0ZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDE7Ci0JbWl4ZXJfc3RyID0ga3phbGxvYyhjdGxfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1peGVyX3N0cikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQiLCBtaXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7Ci0JZmVfYXVkaW9fYWRzcF9zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sWzBdLm5hbWUgPSBtaXhlcl9zdHI7Ci0JZmVfYXVkaW9fYWRzcF9zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPQotCQkJCXJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCIlczogUmVnaXN0ZXJpbmcgbmV3IG1peGVyIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0JcmV0ID0gc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKLQkJZmVfYXVkaW9fYWRzcF9zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sLAotCQlBUlJBWV9TSVpFKGZlX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NtZF9jb25maWdfY29udHJvbCkpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlcy4gZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgbWl4ZXJfc3RyLCByZXQpOwotCi0Ja2ZyZWUobWl4ZXJfc3RyKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fY29tcHJfYWRkX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2NvbnRyb2woCi0JCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gRFNQX1NUUkVBTV9DQUxMQkFDSzsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQotCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGZlX2F1ZGlvX2Fkc3BfY2FsbGJhY2tfY29uZmlnX2NvbnRyb2xbMV0gPSB7Ci0JCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIj8iLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBtc21fYWRzcF9zdHJlYW1fY2FsbGJhY2tfaW5mbywKLQkJLmdldCA9IG1zbV9hZHNwX3N0cmVhbV9jYWxsYmFja19nZXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzOiBydGQgaXMgIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2F1ZGlvX2Fkc3BfY2FsbGJhY2tfY29uZmlnX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPQotCQkJCQlydGQtPmRhaV9saW5rLT5pZDsKLQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXNcbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwotCXJldCA9IHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQlmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sLAotCQkJQVJSQVlfU0laRShmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBjdGwgJXMuIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIG1peGVyX3N0ciwgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX21peGVyX3N0cjsKLQl9Ci0KLQlrY3RsID0gc25kX3NvY19jYXJkX2dldF9rY29udHJvbChydGQtPmNhcmQsIG1peGVyX3N0cik7Ci0JaWYgKCFrY3RsKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQga2N0bCAlcy5cbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfbWl4ZXJfc3RyOwotCX0KLQotCWtjdGwtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLWZyZWVfbWl4ZXJfc3RyOgotCWtmcmVlKG1peGVyX3N0cik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2FkZF9kZWNfcnVudGltZV9wYXJhbXNfY29udHJvbCgKLQkJCQkJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUJPSAiQXVkaW8gU3RyZWFtIjsKLQljb25zdCBjaGFyICpkZXZpY2VObwkJPSAiTk4iOwotCWNvbnN0IGNoYXIgKnN1ZmZpeAkJPSAiRGVjIFBhcmFtcyI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbjsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9kZWNfcGFyYW1zX2NvbnRyb2xbMV0gPSB7Ci0JCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIj8iLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBtc21fY29tcHJfZGVjX3BhcmFtc19pbmZvLAotCQkuZ2V0ID0gbXNtX2NvbXByX2RlY19wYXJhbXNfZ2V0LAotCQkucHV0ID0gbXNtX2NvbXByX2RlY19wYXJhbXNfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IDAsCi0JCX0KLQl9OwotCi0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlcyBOVUxMIHJ0ZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGFkZGVkIG5ldyBjb21wciBGRSB3aXRoIG5hbWUgJXMsIGlkICVkLCBjcHUgZGFpICVzLCBkZXZpY2Ugbm8gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcnRkLT5kYWlfbGluay0+bmFtZSwgcnRkLT5kYWlfbGluay0+aWQsCi0JCSBydGQtPmRhaV9saW5rLT5jcHVfZGFpX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCi0JY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDEgKwotCQkgIHN0cmxlbihzdWZmaXgpICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwotCi0JaWYgKCFtaXhlcl9zdHIpCi0JCXJldHVybiAwOwotCi0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQgJXMiLCBtaXhlcl9jdGxfbmFtZSwKLQkJIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7Ci0KLQlmZV9kZWNfcGFyYW1zX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9kZWNfcGFyYW1zX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCJSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzIiwgbWl4ZXJfc3RyKTsKLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCSAgICAgIGZlX2RlY19wYXJhbXNfY29udHJvbCwKLQkJCQkgICAgICBBUlJBWV9TSVpFKGZlX2RlY19wYXJhbXNfY29udHJvbCkpOwotCWtmcmVlKG1peGVyX3N0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2FkZF9hcHBfdHlwZV9jZmdfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKnBsYXliYWNrX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSI7Ci0JY29uc3QgY2hhciAqY2FwdHVyZV9taXhlcl9jdGxfbmFtZQk9ICJBdWRpbyBTdHJlYW0gQ2FwdHVyZSI7Ci0JY29uc3QgY2hhciAqZGV2aWNlTm8JCT0gIk5OIjsKLQljb25zdCBjaGFyICpzdWZmaXgJCT0gIkFwcCBUeXBlIENmZyI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbjsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9hcHBfdHlwZV9jZmdfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9jb21wcl9hcHBfdHlwZV9jZmdfaW5mbywKLQkJLnB1dCA9IG1zbV9jb21wcl9wbGF5YmFja19hcHBfdHlwZV9jZmdfcHV0LAotCQkuZ2V0ID0gbXNtX2NvbXByX3BsYXliYWNrX2FwcF90eXBlX2NmZ19nZXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzIE5VTEwgcnRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIGN0bCB3aXRoIG5hbWUgJXMsIGlkICVkLCBjcHUgZGFpICVzLCBkZXZpY2Ugbm8gJWRcbiIsCi0JCV9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKLQkJCXJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7Ci0JaWYgKHJ0ZC0+Y29tcHItPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfUExBWUJBQ0spCi0JCWN0bF9sZW4gPSBzdHJsZW4ocGxheWJhY2tfbWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykKLQkJCSArIDEgKyBzdHJsZW4oc3VmZml4KSArIDE7Ci0JZWxzZQotCQljdGxfbGVuID0gc3RybGVuKGNhcHR1cmVfbWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykKLQkJCSsgMSArIHN0cmxlbihzdWZmaXgpICsgMTsKLQotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1peGVyX3N0cikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocnRkLT5jb21wci0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKLQkJc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQgJXMiLAotCQkJIHBsYXliYWNrX21peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOwotCWVsc2UKLQkJc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQgJXMiLAotCQkJIGNhcHR1cmVfbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7Ci0KLQlmZV9hcHBfdHlwZV9jZmdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2FwcF90eXBlX2NmZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPSBydGQtPmRhaV9saW5rLT5pZDsKLQotCWlmIChydGQtPmNvbXByLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX1BMQVlCQUNLKSB7Ci0JCWZlX2FwcF90eXBlX2NmZ19jb250cm9sWzBdLnB1dCA9Ci0JCQkJCSBtc21fY29tcHJfcGxheWJhY2tfYXBwX3R5cGVfY2ZnX3B1dDsKLQkJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2xbMF0uZ2V0ID0KLQkJCQkJIG1zbV9jb21wcl9wbGF5YmFja19hcHBfdHlwZV9jZmdfZ2V0OwotCX0gZWxzZSB7Ci0JCWZlX2FwcF90eXBlX2NmZ19jb250cm9sWzBdLnB1dCA9Ci0JCQkJCSBtc21fY29tcHJfY2FwdHVyZV9hcHBfdHlwZV9jZmdfcHV0OwotCQlmZV9hcHBfdHlwZV9jZmdfY29udHJvbFswXS5nZXQgPQotCQkJCQkgbXNtX2NvbXByX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2dldDsKLQl9Ci0JcHJfZGVidWcoIlJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXMiLCBtaXhlcl9zdHIpOwotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQkJZmVfYXBwX3R5cGVfY2ZnX2NvbnRyb2wsCi0JCQkJQVJSQVlfU0laRShmZV9hcHBfdHlwZV9jZmdfY29udHJvbCkpOwotCWtmcmVlKG1peGVyX3N0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2FkZF9jaGFubmVsX21hcF9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSAiUGxheWJhY2sgQ2hhbm5lbCBNYXAiOwotCWNvbnN0IGNoYXIgKmRldmljZU5vICAgICAgID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCXN0cnVjdCBtc21fY29tcHJfcGRhdGEgKnBkYXRhID0gTlVMTDsKLQlpbnQgY3RsX2xlbjsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9jaGFubmVsX21hcF9jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2NvbXByX2NoYW5uZWxfbWFwX2luZm8sCi0JCS5nZXQgPSBtc21fY29tcHJfY2hhbm5lbF9tYXBfZ2V0LAotCQkucHV0ID0gbXNtX2NvbXByX2NoYW5uZWxfbWFwX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXM6IE5VTEwgcnRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IGNvbXByIEZFIHdpdGggbmFtZSAlcywgaWQgJWQsIGNwdSBkYWkgJXMsIGRldmljZSBubyAlZFxuIiwKLQkJIF9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5uYW1lLCBydGQtPmRhaV9saW5rLT5pZCwKLQkJIHJ0ZC0+ZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgcnRkLT5wY20tPmRldmljZSk7Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1peGVyX3N0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzbnByaW50ZihtaXhlcl9zdHIsIGN0bF9sZW4sICIlcyVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCi0JZmVfY2hhbm5lbF9tYXBfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2NoYW5uZWxfbWFwX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCIlczogUmVnaXN0ZXJpbmcgbmV3IG1peGVyIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKLQkJCQlmZV9jaGFubmVsX21hcF9jb250cm9sLAotCQkJCUFSUkFZX1NJWkUoZmVfY2hhbm5lbF9tYXBfY29udHJvbCkpOwotCi0JcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCXBkYXRhLT5jaF9tYXBbcnRkLT5kYWlfbGluay0+aWRdID0KLQkJIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fY29tcHJfY2hfbWFwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YS0+Y2hfbWFwW3J0ZC0+ZGFpX2xpbmstPmlkXSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjaGFubmVsIG1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJa2ZyZWUobWl4ZXJfc3RyKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWtmcmVlKG1peGVyX3N0cik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2FkZF9pb19mZF9jbWRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gIlBsYXliYWNrIElPTiBGRCI7Ci0JY29uc3QgY2hhciAqZGV2aWNlTm8gPSAiTk4iOwotCWNoYXIgKm1peGVyX3N0ciA9IE5VTEw7Ci0JaW50IGN0bF9sZW4gPSAwLCByZXQgPSAwOwotCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGZlX2lvbl9mZF9jb25maWdfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9hZHNwX3N0cmVhbV9jbWRfaW5mbywKLQkJLnB1dCA9IG1zbV9jb21wcl9pb25fZmRfbWFwX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2lvbl9mZF9jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2lvbl9mZF9jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlyZXQgPSBzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCWZlX2lvbl9mZF9jb25maWdfY29udHJvbCwKLQkJCQlBUlJBWV9TSVpFKGZlX2lvbl9mZF9jb25maWdfY29udHJvbCkpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0KLQlrZnJlZShtaXhlcl9zdHIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9hZGRfZXZlbnRfYWNrX2NtZF9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSAiUGxheWJhY2sgRXZlbnQgQWNrIjsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZmVfZXZlbnRfYWNrX2NvbmZpZ19jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2Fkc3Bfc3RyZWFtX2NtZF9pbmZvLAotCQkucHV0ID0gbXNtX2NvbXByX3J0aWNfZXZlbnRfYWNrX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlyZXQgPSBzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbCwKLQkJCQlBUlJBWV9TSVpFKGZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbCkpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0KLQlrZnJlZShtaXhlcl9zdHIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9jb21wcl9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IG1zbV9jb21wcl9hZGRfdm9sdW1lX2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgVm9sdW1lIENvbnRyb2xcbiIsIF9fZnVuY19fKTsKLQotCXJjID0gbXNtX2NvbXByX2FkZF9hdWRpb19lZmZlY3RzX2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgQXVkaW8gRWZmZWN0cyBDb250cm9sXG4iLAotCQkJX19mdW5jX18pOwotCi0JcmMgPSBtc21fY29tcHJfYWRkX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NtZF9jb250cm9sKHJ0ZCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIENvbXByIEFEU1AgU3RyZWFtIENtZCBDb250cm9sXG4iLAotCQkJX19mdW5jX18pOwotCi0JcmMgPSBtc21fY29tcHJfYWRkX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgQURTUCBTdHJlYW0gQ2FsbGJhY2sgQ29udHJvbFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJjID0gbXNtX2NvbXByX2FkZF9pb19mZF9jbWRfY29udHJvbChydGQpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFkZCBDb21wciBpb24gZmQgQ29udHJvbFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJjID0gbXNtX2NvbXByX2FkZF9ldmVudF9hY2tfY21kX2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgZXZlbnQgYWNrIENvbnRyb2xcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQlyYyA9IG1zbV9jb21wcl9hZGRfcXVlcnlfYXVkaW9fZWZmZWN0X2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgUXVlcnkgQXVkaW8gRWZmZWN0IENvbnRyb2xcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQlyYyA9IG1zbV9jb21wcl9hZGRfZGVjX3J1bnRpbWVfcGFyYW1zX2NvbnRyb2wocnRkKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgQ29tcHIgRGVjIHJ1bnRpbWUgcGFyYW1zIENvbnRyb2xcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JcmMgPSBtc21fY29tcHJfYWRkX2FwcF90eXBlX2NmZ19jb250cm9sKHJ0ZCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIENvbXByIEFwcCBUeXBlIENmZyBDb250cm9sXG4iLAotCQkJX19mdW5jX18pOwotCXJjID0gbXNtX2NvbXByX2FkZF9jaGFubmVsX21hcF9jb250cm9sKHJ0ZCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIENvbXByIENoYW5uZWwgTWFwIENvbnRyb2xcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX29wcyBtc21fY29tcHJfb3BzID0gewotCS5vcGVuCQkJPSBtc21fY29tcHJfb3BlbiwKLQkuZnJlZQkJCT0gbXNtX2NvbXByX2ZyZWUsCi0JLnRyaWdnZXIJCT0gbXNtX2NvbXByX3RyaWdnZXIsCi0JLnBvaW50ZXIJCT0gbXNtX2NvbXByX3BvaW50ZXIsCi0JLnNldF9wYXJhbXMJCT0gbXNtX2NvbXByX3NldF9wYXJhbXMsCi0JLnNldF9tZXRhZGF0YQkJPSBtc21fY29tcHJfc2V0X21ldGFkYXRhLAotCS5nZXRfbWV0YWRhdGEJCT0gbXNtX2NvbXByX2dldF9tZXRhZGF0YSwKLQkuc2V0X25leHRfdHJhY2tfcGFyYW0JPSBtc21fY29tcHJfc2V0X25leHRfdHJhY2tfcGFyYW0sCi0JLmFjawkJCT0gbXNtX2NvbXByX2FjaywKLQkuY29weQkJCT0gbXNtX2NvbXByX2NvcHksCi0JLmdldF9jYXBzCQk9IG1zbV9jb21wcl9nZXRfY2FwcywKLQkuZ2V0X2NvZGVjX2NhcHMJCT0gbXNtX2NvbXByX2dldF9jb2RlY19jYXBzLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0gewotCS5wcm9iZQkJPSBtc21fY29tcHJfcHJvYmUsCi0JLmNvbXByX29wcwk9ICZtc21fY29tcHJfb3BzLAotCS5wY21fbmV3CT0gbXNtX2NvbXByX25ldywKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCQkmbXNtX3NvY19wbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbXByX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2NvbXByX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLWNvbXByZXNzLWRzcCJ9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2NvbXByX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2NvbXByX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9jb21wcl9kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9jb21wcl9kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9jb21wcl9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fY29tcHJfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2NvbXByX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtc21fc29jX3BsYXRmb3JtX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkNvbXByZXNzIE9mZmxvYWQgcGxhdGZvcm0gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi1oZG1pLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi1oZG1pLXYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjE3OTguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kYWktcTYtaGRtaS12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL21zbS1kYWktcTYtdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0KLSNkZWZpbmUgSERNSV9SWF9DQV9NQVggMHgzMgotCi1lbnVtIHsKLQlTVEFUVVNfUE9SVF9TVEFSVEVELCAvKiB0cmFjayBpZiBBRkUgcG9ydCBoYXMgc3RhcnRlZCAqLwotCVNUQVRVU19NQVgKLX07Ci0KLXN0cnVjdCBtc21fZXh0X2Rpc3BfY2EgewotCWJvb2wgc2V0X2NhOwotCXUzMiBjYTsKLX07Ci0KLXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgewotCURFQ0xBUkVfQklUTUFQKHN0YXR1c19tYXNrLCBTVEFUVVNfTUFYKTsKLQl1MzIgcmF0ZTsKLQl1MzIgY2hhbm5lbHM7Ci0Jc3RydWN0IG1zbV9leHRfZGlzcF9jYSBjYTsKLQl1bmlvbiBhZmVfcG9ydF9jb25maWcgcG9ydF9jb25maWc7Ci19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZXh0X2Rpc3BfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guZGF0YXR5cGUgPSB2YWx1ZTsKLQlwcl9kZWJ1ZygiJXM6IHZhbHVlID0gJWRcbiIsIF9fZnVuY19fLCB2YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2V4dF9kaXNwX2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfaGRtaV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFkYWlfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBkYWlfZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guZGF0YXR5cGU7Ci0JcHJfZGVidWcoIiVzOiB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2V4dF9kaXNwX2NhX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGFpX2RhdGEtPmNhLmNhID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JZGFpX2RhdGEtPmNhLnNldF9jYSA9IHRydWU7Ci0JcHJfZGVidWcoIiVzOiBjYSA9ICVkXG4iLCBfX2Z1bmNfXywgZGFpX2RhdGEtPmNhLmNhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2V4dF9kaXNwX2NhX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBkYWlfZGF0YS0+Y2EuY2E7Ci0JcHJfZGVidWcoIiVzOiBjYSA9ICVkXG4iLCBfX2Z1bmNfXywgZGFpX2RhdGEtPmNhLmNhKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogSERNSSBmb3JtYXQgZmllbGQgZm9yIEFGRV9QT1JUX01VTFRJX0NIQU5fSERNSV9BVURJT19JRl9DT05GSUcgY29tbWFuZAotICogIDA6IGxpbmVhciBQQ00KLSAqICAxOiBub24tbGluZWFyIFBDTQotICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhkbWlfZm9ybWF0W10gPSB7Ci0JIkxQQ00iLAotCSJDb21wciIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaGRtaV9jb25maWdfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgaGRtaV9mb3JtYXQpLAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X2V4dF9kaXNwX2RyaWZ0X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTOwotCXVpbmZvLT5jb3VudCA9IHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9leHRfZGlzcF9kcmlmdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfZGV2X3RpbWluZ19zdGF0cyB0aW1pbmdfc3RhdHM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgewotCQlwcl9lcnIoIiVzOiAgYWZlIHBvcnQgbm90IHN0YXJ0ZWQuIHN0YXR1c19tYXNrID0gJWxkXG4iLAotCQkJX19mdW5jX18sICpkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtc2V0KCZ0aW1pbmdfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMpKTsKLQlyZXQgPSBhZmVfZ2V0X2F2X2Rldl9kcmlmdCgmdGltaW5nX3N0YXRzLCBkYWktPmlkKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgQUZFIERyaWZ0IGZvciBwb3J0ICVkLCBlcnI9JWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5pZCwgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAodm9pZCAqKSZ0aW1pbmdfc3RhdHMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMpKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhkbWlfY29uZmlnX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJIRE1JIFJYIEZvcm1hdCIsIGhkbWlfY29uZmlnX2VudW1bMF0sCi0JCQkJIG1zbV9kYWlfcTZfZXh0X2Rpc3BfZm9ybWF0X2dldCwKLQkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9mb3JtYXRfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSERNSSBSWCBDQSIsIFNORF9TT0NfTk9QTSwgMCwKLQkJCQkgSERNSV9SWF9DQV9NQVgsIDAsIDEsCi0JCQkJIG1zbV9kYWlfcTZfZXh0X2Rpc3BfY2FfZ2V0LAotCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2NhX3B1dCksCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkJLm5hbWUJPSAiSERNSSBEUklGVCIsCi0JCS5pbmZvCT0gbXNtX2RhaV9xNl9leHRfZGlzcF9kcmlmdF9pbmZvLAotCQkuZ2V0CT0gbXNtX2RhaV9xNl9leHRfZGlzcF9kcmlmdF9nZXQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkaXNwbGF5X3BvcnRfY29uZmlnX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggRm9ybWF0IiwgaGRtaV9jb25maWdfZW51bVswXSwKLQkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9mb3JtYXRfZ2V0LAotCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2Zvcm1hdF9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEaXNwbGF5IFBvcnQgUlggQ0EiLCBTTkRfU09DX05PUE0sIDAsCi0JCQkJIEhETUlfUlhfQ0FfTUFYLCAwLCAxLAotCQkJCSBtc21fZGFpX3E2X2V4dF9kaXNwX2NhX2dldCwKLQkJCQkgbXNtX2RhaV9xNl9leHRfZGlzcF9jYV9wdXQpLAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lCT0gIkRJU1BMQVlfUE9SVCBEUklGVCIsCi0JCS5pbmZvCT0gbXNtX2RhaV9xNl9leHRfZGlzcF9kcmlmdF9pbmZvLAotCQkuZ2V0CT0gbXNtX2RhaV9xNl9leHRfZGlzcF9kcmlmdF9nZXQsCi0JfSwKLX07Ci0KLS8qIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBod19wYXJhbSBpcyBjYWxsZWQgb25jZQotICogVGhpcyBtYXkgbm90IGJlIHRoZSBjYXNlIGJ1dCB3aGF0IHRvIGRvIHdoZW4gQURNIGFuZCBBRkUKLSAqIHBvcnQgYXJlIGFscmVhZHkgb3BlbmVkIGFuZCBwYXJhbWV0ZXIgY2hhbmdlcwotICovCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfaGRtaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfaGRtaV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCi0JZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0JZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLnJlc2VydmVkID0gMDsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5oZG1pX2NmZ19taW5vcl92ZXJzaW9uID0gMTsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOwotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guYml0X3dpZHRoID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmJpdF93aWR0aCA9IDI0OwotCQlicmVhazsKLQl9Ci0KLQkvKnJlZmVyIHRvIEhETUkgc3BlYyBDRUEtODYxLUU6IFRhYmxlIDI4IEF1ZGlvIEluZm9GcmFtZSBEYXRhIEJ5dGUgNCovCi0Jc3dpdGNoIChkYWlfZGF0YS0+Y2hhbm5lbHMpIHsKLQljYXNlIDI6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmNoYW5uZWxfYWxsb2NhdGlvbiA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0gMHgwMjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24gPSAweDA2OwotCQlicmVhazsKLQljYXNlIDU6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmNoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MEE7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0gMHgwQjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5jaGFubmVsX2FsbG9jYXRpb24gPSAweDEyOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmNoYW5uZWxfYWxsb2NhdGlvbiA9IDB4MTM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5kZXYsICJpbnZhbGlkIENoYW5uZWxzID0gJXVcbiIsCi0JCQkJZGFpX2RhdGEtPmNoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRldl9kYmcoZGFpLT5kZXYsICIlcygpIG1pbm9yIHZlcnNpb246ICV1IHNhbXBsZXJhdGU6ICV1IGJpdHdpZHRoOiAldVxuIgotCQkibnVtX2NoID0gJXUgY2hhbm5lbF9hbGxvY2F0aW9uID0gJXUgZGF0YXR5cGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLmhkbWlfY2ZnX21pbm9yX3ZlcnNpb24sCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5oZG1pX211bHRpX2NoLnNhbXBsZV9yYXRlLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5iaXRfd2lkdGgsCi0JCWRhaV9kYXRhLT5jaGFubmVscywKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaGRtaV9tdWx0aV9jaC5kYXRhdHlwZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBtc21fZGFpX3E2X2hkbWlfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfaGRtaV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcHJfaW5mbygiJXM6ICBhZmUgcG9ydCBub3Qgc3RhcnRlZC4gZGFpX2RhdGEtPnN0YXR1c19tYXNrID0gJWxkXG4iLAotCQkgX19mdW5jX18sICpkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCQlyZXR1cm47Ci0JfQotCi0JcmMgPSBhZmVfY2xvc2UoZGFpLT5pZCk7IC8qIGNhbiBibG9jayAqLwotCWlmIChyYyA8IDApCi0JCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFGRSBwb3J0XG4iKTsKLQotCXByX2RlYnVnKCIlczogZGFpX2RhdGEtPnN0YXR1c19tYXNrID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJCSpkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCi0JY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci19Ci0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfaGRtaV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCWludCByYyA9IDA7Ci0KLQlpZiAoZGFpX2RhdGEtPmNhLnNldF9jYSkKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmhkbWlfbXVsdGlfY2guY2hhbm5lbF9hbGxvY2F0aW9uID0KLQkJCQkJCQkgICAgICBkYWlfZGF0YS0+Y2EuY2E7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcmMgPSBhZmVfcG9ydF9zdGFydChkYWktPmlkLCAmZGFpX2RhdGEtPnBvcnRfY29uZmlnLAotCQkJCSAgICBkYWlfZGF0YS0+cmF0ZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBvcGVuIEFGRSBwb3J0ICV4XG4iLAotCQkJCWRhaS0+aWQpOwotCQllbHNlCi0JCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc21fZGFpX3E2X2hkbWlfc2V0X2RhaV9pZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlpZiAoIWRhaS0+ZHJpdmVyLT5pZCkgewotCQlkZXZfd2FybihkYWktPmRldiwgIkRBSSBkcml2ZXIgaWQgaXMgbm90IHNldFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZGFpLT5pZCA9IGRhaS0+ZHJpdmVyLT5pZDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEgKmRhaV9kYXRhOwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY29udHJvbDsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgaW50ZXJjb247Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOwotCi0JaWYgKCFkYWkgfHwgIWRhaS0+ZHJpdmVyKSB7Ci0JCXByX2VycigiJXM6IGRhaSBvciBkYWktPmRyaXZlciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkYWlfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc21fZGFpX3E2X2hkbWlfZGFpX2RhdGEpLAotCQlHRlBfS0VSTkVMKTsKLQotCWlmICghZGFpX2RhdGEpIHsKLQkJZGV2X2VycihkYWktPmRldiwgIkRBSS0lZDogZmFpbCB0byBhbGxvY2F0ZSBkYWkgZGF0YVxuIiwKLQkJZGFpLT5pZCk7Ci0JCXJjID0gLUVOT01FTTsKLQl9IGVsc2UKLQkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBkYWlfZGF0YSk7Ci0KLQltc21fZGFpX3E2X2hkbWlfc2V0X2RhaV9pZChkYWkpOwotCi0JaWYgKGRhaS0+ZHJpdmVyLT5pZCA9PSBIRE1JX1JYKSB7Ci0JCWtjb250cm9sID0gJmhkbWlfY29uZmlnX2NvbnRyb2xzWzBdOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOwotCi0JCWtjb250cm9sID0gJmhkbWlfY29uZmlnX2NvbnRyb2xzWzFdOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOwotCi0JCWtjb250cm9sID0gJmhkbWlfY29uZmlnX2NvbnRyb2xzWzJdOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWkpKTsKLQl9IGVsc2UgaWYgKGRhaS0+ZHJpdmVyLT5pZCA9PSBESVNQTEFZX1BPUlRfUlgpIHsKLQkJa2NvbnRyb2wgPSAmZGlzcGxheV9wb3J0X2NvbmZpZ19jb250cm9sc1swXTsKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJIHNuZF9jdGxfbmV3MShrY29udHJvbCwgZGFpX2RhdGEpKTsKLQotCQlrY29udHJvbCA9ICZkaXNwbGF5X3BvcnRfY29uZmlnX2NvbnRyb2xzWzFdOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOwotCi0JCWtjb250cm9sID0gJmRpc3BsYXlfcG9ydF9jb25maWdfY29udHJvbHNbMl07Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCXNuZF9jdGxfbmV3MShrY29udHJvbCwgZGFpKSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBJbnZhbGlkIGlkOiVkXG4iLAotCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5pZCk7Ci0JCWtmcmVlKGRhaV9kYXRhKTsKLQkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBOVUxMKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGFwbSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kYXBtKGRhaS0+Y29tcG9uZW50KTsKLQltZW1zZXQoJmludGVyY29uLCAwLCBzaXplb2YoaW50ZXJjb24pKTsKLQlpZiAoIXJjKSB7Ci0JCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKLQkJCWRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZSkgewotCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKLQkJCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKLQkJCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZTsKLQkJCWludGVyY29uLnNpbmsgPSBkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWU7Ci0JCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQkJICAgX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7Ci0JCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOwotCQl9Ci0JCWlmIChkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSAmJgotCQkgICBkYWktPmRyaXZlci0+Y2FwdHVyZS5haWZfbmFtZSkgewotCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzIGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKLQkJCQkgICBfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOwotCQkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOwotCQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWU7Ci0JCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQkJICAgX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7Ci0JCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9oZG1pX2RhaV9kYXRhICpkYWlfZGF0YTsKLQlpbnQgcmM7Ci0KLQlkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgewotCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCi0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7Ci0KLQkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci0JfQotCWtmcmVlKGRhaV9kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3E2X2hkbWlfb3BzID0gewotCS5wcmVwYXJlCT0gbXNtX2RhaV9xNl9oZG1pX3ByZXBhcmUsCi0JLmh3X3BhcmFtcwk9IG1zbV9kYWlfcTZfaGRtaV9od19wYXJhbXMsCi0JLnNodXRkb3duCT0gbXNtX2RhaV9xNl9oZG1pX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9oZG1pX2hkbWlfcnhfZGFpID0gewotCS5wbGF5YmFjayA9IHsKLQkJLnN0cmVhbV9uYW1lID0gIkhETUkgUGxheWJhY2siLAotCQkuYWlmX25hbWUgPSAiSERNSSIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfAotCQkJIFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCS5jaGFubmVsc19tYXggPSA4LAotCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCS5yYXRlX21pbiA9IDQ4MDAwLAotCX0sCi0JLm9wcyA9ICZtc21fZGFpX3E2X2hkbWlfb3BzLAotCS5pZCA9IEhETUlfUlgsCi0JLnByb2JlID0gbXNtX2RhaV9xNl9oZG1pX2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9oZG1pX2RhaV9yZW1vdmUsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2Rpc3BsYXlfcG9ydF9yeF9kYWlbXSA9IHsKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJEaXNwbGF5IFBvcnQgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIkRJU1BMQVlfUE9SVCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzk2MDAwIHwgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJCS5yYXRlX21pbiA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X2hkbWlfb3BzLAotCQkuaWQgPSBESVNQTEFZX1BPUlRfUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfaGRtaV9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2hkbWlfZGFpX3JlbW92ZSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2RhaV9oZG1pX3E2X2NvbXBvbmVudCA9IHsKLQkubmFtZQkJPSAibXNtLWRhaS1xNi1oZG1pIiwKLX07Ci0KLS8qIFRvIGRvOiBjaGFuZ2UgdG8gcmVnaXN0ZXIgREFJcyBhcyBiYXRjaCAqLwotc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjLCBpZDsKLQljb25zdCBjaGFyICpxNl9kZXZfaWQgPSAicWNvbSxtc20tZGFpLXE2LWRldi1pZCI7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBxNl9kZXZfaWQsICZpZCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgcTZfZGV2X2lkKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXBkZXYtPmlkID0gaWQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzLCBpZDolZFxuIiwgX19mdW5jX18sCi0JCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGRldi0+aWQpOwotCi0Jc3dpdGNoIChwZGV2LT5pZCkgewotCWNhc2UgSERNSV9SWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfaGRtaV9xNl9jb21wb25lbnQsCi0JCQkmbXNtX2RhaV9xNl9oZG1pX2hkbWlfcnhfZGFpLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBESVNQTEFZX1BPUlRfUlg6Ci0JCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCSZtc21fZGFpX2hkbWlfcTZfY29tcG9uZW50LAotCQkJJm1zbV9kYWlfcTZfZGlzcGxheV9wb3J0X3J4X2RhaVswXSwKLQkJCUFSUkFZX1NJWkUobXNtX2RhaV9xNl9kaXNwbGF5X3BvcnRfcnhfZGFpKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgZGV2aWNlIElEICVkXG4iLCBwZGV2LT5pZCk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2hkbWlfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfcTZfaGRtaV9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtaGRtaSJ9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl9oZG1pX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9xNl9oZG1pX2RyaXZlciA9IHsKLQkucHJvYmUgID0gbXNtX2RhaV9xNl9oZG1pX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9oZG1pX2Rldl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLWRhaS1xNi1oZG1pIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfcTZfaGRtaV9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2RhaV9xNl9oZG1pX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2X2hkbWlfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9kYWlfcTZfaGRtaV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9kYWlfcTZfaGRtaV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfcTZfaGRtaV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX2RhaV9xNl9oZG1pX2V4aXQpOwotCi0vKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KLU1PRFVMRV9ERVNDUklQVElPTigiTVNNIERTUCBIRE1JIERBSSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXE2LXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1xNi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNiYzMxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXE2LXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9tc20tZGFpLXE2LXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotCi0jZGVmaW5lIE1TTV9EQUlfUFJJX0FVWFBDTV9EVF9ERVZfSUQgMQotI2RlZmluZSBNU01fREFJX1NFQ19BVVhQQ01fRFRfREVWX0lEIDIKLSNkZWZpbmUgTVNNX0RBSV9URVJUX0FVWFBDTV9EVF9ERVZfSUQgMwotI2RlZmluZSBNU01fREFJX1FVQVRfQVVYUENNX0RUX0RFVl9JRCA0Ci0KLQotI2RlZmluZSBzcGRpZl9jbG9ja192YWx1ZShyYXRlKSAoMipyYXRlKjMyKjIpCi0jZGVmaW5lIENIQU5ORUxfU1RBVFVTX1NJWkUgMjQKLSNkZWZpbmUgQ0hBTk5FTF9TVEFUVVNfTUFTS19JTklUIDB4MAotI2RlZmluZSBDSEFOTkVMX1NUQVRVU19NQVNLIDB4NAotI2RlZmluZSBBRkVfQVBJX1ZFUlNJT05fQ0xPQ0tfU0VUIDEKLQotI2RlZmluZSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBcCi0JCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXAotCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKLQotZW51bSB7Ci0JRU5DX0ZNVF9OT05FLAotCUVOQ19GTVRfU0JDID0gQVNNX01FRElBX0ZNVF9TQkMsCi0JRU5DX0ZNVF9BQUNfVjIgPSBBU01fTUVESUFfRk1UX0FBQ19WMiwKLQlFTkNfRk1UX0FQVFggPSBBU01fTUVESUFfRk1UX0FQVFgsCi0JRU5DX0ZNVF9BUFRYX0hEID0gQVNNX01FRElBX0ZNVF9BUFRYX0hELAotfTsKLQotZW51bSB7Ci0JU1BLUl8xLAotCVNQS1JfMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWZlX2Nsa19zZXQgbHBhc3NfY2xrX3NldF9kZWZhdWx0ID0gewotCUFGRV9BUElfVkVSU0lPTl9DTE9DS19TRVQsCi0JUTZBRkVfTFBBU1NfQ0xLX0lEX1BSSV9QQ01fSUJJVCwKLQlRNkFGRV9MUEFTU19PU1JfQ0xLXzJfUDA0OF9NSFosCi0JUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkwLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhZmVfY2xrX2NmZyBscGFzc19jbGtfY2ZnX2RlZmF1bHQgPSB7Ci0JQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JUTZBRkVfTFBBU1NfT1NSX0NMS18yX1AwNDhfTUhaLAotCTAsCi0JUTZBRkVfTFBBU1NfQ0xLX1NSQ19JTlRFUk5BTCwKLQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCVE2QUZFX0xQQVNTX01PREVfQ0xLMV9WQUxJRCwKLQkwLAotfTsKLWVudW0gewotCVNUQVRVU19QT1JUX1NUQVJURUQsIC8qIHRyYWNrIGlmIEFGRSBwb3J0IGhhcyBzdGFydGVkICovCi0JLyogdHJhY2sgQUZFIFR4IHBvcnQgc3RhdHVzIGZvciBiaS1kaXJlY3Rpb25hbCB0cmFuc2ZlcnMgKi8KLQlTVEFUVVNfVFhfUE9SVCwKLQkvKiB0cmFjayBBRkUgUnggcG9ydCBzdGF0dXMgZm9yIGJpLWRpcmVjdGlvbmFsIHRyYW5zZmVycyAqLwotCVNUQVRVU19SWF9QT1JULAotCVNUQVRVU19NQVgKLX07Ci0KLWVudW0gewotCVJBVEVfOEtIWiwKLQlSQVRFXzE2S0haLAotCVJBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTLAotfTsKLQotZW51bSB7Ci0JSURYX1BSSU1BUllfVERNX1JYXzAsCi0JSURYX1BSSU1BUllfVERNX1JYXzEsCi0JSURYX1BSSU1BUllfVERNX1JYXzIsCi0JSURYX1BSSU1BUllfVERNX1JYXzMsCi0JSURYX1BSSU1BUllfVERNX1JYXzQsCi0JSURYX1BSSU1BUllfVERNX1JYXzUsCi0JSURYX1BSSU1BUllfVERNX1JYXzYsCi0JSURYX1BSSU1BUllfVERNX1JYXzcsCi0JSURYX1BSSU1BUllfVERNX1RYXzAsCi0JSURYX1BSSU1BUllfVERNX1RYXzEsCi0JSURYX1BSSU1BUllfVERNX1RYXzIsCi0JSURYX1BSSU1BUllfVERNX1RYXzMsCi0JSURYX1BSSU1BUllfVERNX1RYXzQsCi0JSURYX1BSSU1BUllfVERNX1RYXzUsCi0JSURYX1BSSU1BUllfVERNX1RYXzYsCi0JSURYX1BSSU1BUllfVERNX1RYXzcsCi0JSURYX1NFQ09OREFSWV9URE1fUlhfMCwKLQlJRFhfU0VDT05EQVJZX1RETV9SWF8xLAotCUlEWF9TRUNPTkRBUllfVERNX1JYXzIsCi0JSURYX1NFQ09OREFSWV9URE1fUlhfMywKLQlJRFhfU0VDT05EQVJZX1RETV9SWF80LAotCUlEWF9TRUNPTkRBUllfVERNX1JYXzUsCi0JSURYX1NFQ09OREFSWV9URE1fUlhfNiwKLQlJRFhfU0VDT05EQVJZX1RETV9SWF83LAotCUlEWF9TRUNPTkRBUllfVERNX1RYXzAsCi0JSURYX1NFQ09OREFSWV9URE1fVFhfMSwKLQlJRFhfU0VDT05EQVJZX1RETV9UWF8yLAotCUlEWF9TRUNPTkRBUllfVERNX1RYXzMsCi0JSURYX1NFQ09OREFSWV9URE1fVFhfNCwKLQlJRFhfU0VDT05EQVJZX1RETV9UWF81LAotCUlEWF9TRUNPTkRBUllfVERNX1RYXzYsCi0JSURYX1NFQ09OREFSWV9URE1fVFhfNywKLQlJRFhfVEVSVElBUllfVERNX1JYXzAsCi0JSURYX1RFUlRJQVJZX1RETV9SWF8xLAotCUlEWF9URVJUSUFSWV9URE1fUlhfMiwKLQlJRFhfVEVSVElBUllfVERNX1JYXzMsCi0JSURYX1RFUlRJQVJZX1RETV9SWF80LAotCUlEWF9URVJUSUFSWV9URE1fUlhfNSwKLQlJRFhfVEVSVElBUllfVERNX1JYXzYsCi0JSURYX1RFUlRJQVJZX1RETV9SWF83LAotCUlEWF9URVJUSUFSWV9URE1fVFhfMCwKLQlJRFhfVEVSVElBUllfVERNX1RYXzEsCi0JSURYX1RFUlRJQVJZX1RETV9UWF8yLAotCUlEWF9URVJUSUFSWV9URE1fVFhfMywKLQlJRFhfVEVSVElBUllfVERNX1RYXzQsCi0JSURYX1RFUlRJQVJZX1RETV9UWF81LAotCUlEWF9URVJUSUFSWV9URE1fVFhfNiwKLQlJRFhfVEVSVElBUllfVERNX1RYXzcsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzAsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzEsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzIsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzMsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzQsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzUsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzYsCi0JSURYX1FVQVRFUk5BUllfVERNX1JYXzcsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzAsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzEsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzIsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzMsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzQsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzUsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzYsCi0JSURYX1FVQVRFUk5BUllfVERNX1RYXzcsCi0JSURYX1RETV9NQVgsCi19OwotCi1lbnVtIHsKLQlJRFhfR1JPVVBfUFJJTUFSWV9URE1fUlgsCi0JSURYX0dST1VQX1BSSU1BUllfVERNX1RYLAotCUlEWF9HUk9VUF9TRUNPTkRBUllfVERNX1JYLAotCUlEWF9HUk9VUF9TRUNPTkRBUllfVERNX1RYLAotCUlEWF9HUk9VUF9URVJUSUFSWV9URE1fUlgsCi0JSURYX0dST1VQX1RFUlRJQVJZX1RETV9UWCwKLQlJRFhfR1JPVVBfUVVBVEVSTkFSWV9URE1fUlgsCi0JSURYX0dST1VQX1FVQVRFUk5BUllfVERNX1RYLAotCUlEWF9HUk9VUF9URE1fTUFYLAotfTsKLQotc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgewotCURFQ0xBUkVfQklUTUFQKHN0YXR1c19tYXNrLCBTVEFUVVNfTUFYKTsKLQlERUNMQVJFX0JJVE1BUChod2ZyZWVfc3RhdHVzLCBTVEFUVVNfTUFYKTsKLQl1MzIgcmF0ZTsKLQl1MzIgY2hhbm5lbHM7Ci0JdTMyIGJpdHdpZHRoOwotCXUzMiBjYWxfbW9kZTsKLQl1MzIgYWZlX2luX2NoYW5uZWxzOwotCXUxNiBhZmVfaW5fYml0Zm9ybWF0OwotCXN0cnVjdCBhZmVfZW5jX2NvbmZpZyBlbmNfY29uZmlnOwotCXVuaW9uIGFmZV9wb3J0X2NvbmZpZyBwb3J0X2NvbmZpZzsKLQl1MTYgdmlfZmVlZF9tb25vOwotfTsKLQotc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEgewotCURFQ0xBUkVfQklUTUFQKHN0YXR1c19tYXNrLCBTVEFUVVNfTUFYKTsKLQl1MzIgcmF0ZTsKLQl1MzIgY2hhbm5lbHM7Ci0JdTMyIGJpdHdpZHRoOwotCXN0cnVjdCBhZmVfc3BkaWZfcG9ydF9jb25maWcgc3BkaWZfcG9ydDsKLX07Ci0KLXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2NvbmZpZyB7Ci0JdTE2IHBkYXRhX21pMnNfbGluZXM7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgbWkyc19kYWlfZGF0YTsKLX07Ci0KLXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2RhdGEgewotCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2NvbmZpZyB0eF9kYWk7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfY29uZmlnIHJ4X2RhaTsKLX07Ci0KLXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSB7Ci0JLyogQklUTUFQIHRvIHRyYWNrIFJ4IGFuZCBUeCBwb3J0IHVzYWdlIGNvdW50ICovCi0JREVDTEFSRV9CSVRNQVAoYXV4cGNtX3BvcnRfc3RhdHVzLCBTVEFUVVNfTUFYKTsKLQlzdHJ1Y3QgbXV0ZXggcmxvY2s7IC8qIGF1eHBjbSBkZXYgcmVzb3VyY2UgbG9jayAqLwotCXUxNiByeF9waWQ7IC8qIEFVWFBDTSBSWCBBRkUgcG9ydCBJRCAqLwotCXUxNiB0eF9waWQ7IC8qIEFVWFBDTSBUWCBBRkUgcG9ydCBJRCAqLwotCXUxNiBhZmVfY2xrX3ZlcjsKLQlzdHJ1Y3QgYWZlX2Nsa19jZmcgY2xrX2NmZzsgLyogaG9sZCBMUEFTUyBjbG9jayBjb25maWd1cmF0aW9uICovCi0Jc3RydWN0IGFmZV9jbGtfc2V0IGNsa19zZXQ7IC8qIGhvbGQgTFBBU1MgY2xvY2sgY29uZmlndXJhdGlvbiAqLwotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhIGJkYWlfZGF0YTsgLyogaW5jb3BvcmF0ZSBiYXNlIERBSSBkYXRhICovCi19OwotCi1zdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgewotCURFQ0xBUkVfQklUTUFQKHN0YXR1c19tYXNrLCBTVEFUVVNfTUFYKTsKLQl1MzIgcmF0ZTsKLQl1MzIgY2hhbm5lbHM7Ci0JdTMyIGJpdHdpZHRoOwotCXUzMiBudW1fZ3JvdXBfcG9ydHM7Ci0Jc3RydWN0IGFmZV9jbGtfc2V0IGNsa19zZXQ7IC8qIGhvbGQgTFBBU1MgY2xvY2sgY29uZmlnLiAqLwotCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyBncm91cF9jZmc7IC8qIGhvbGQgdGRtIGdyb3VwIGNvbmZpZyAqLwotCXN0cnVjdCBhZmVfdGRtX3BvcnRfY29uZmlnIHBvcnRfY2ZnOyAvKiBob2xkIHRkbSBjb25maWcgKi8KLX07Ci0KLS8qIE1JMlMgZm9ybWF0IGZpZWxkIGZvciBBRkVfUE9SVF9DTURfSTJTX0NPTkZJRyBjb21tYW5kCi0gKiAgMDogbGluZWFyIFBDTQotICogIDE6IG5vbi1saW5lYXIgUENNCi0gKiAgMjogUENNIGRhdGEgaW4gSUVDIDYwOTY4IGNvbnRhaW5lcgotICogIDM6IGNvbXByZXNzZWQgZGF0YSBpbiBJRUMgNjA5NTggY29udGFpbmVyCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtaTJzX2Zvcm1hdFtdID0gewotCSJMUENNIiwKLQkiQ29tcHIiLAotCSJMUENNLTYwOTU4IiwKLQkiQ29tcHItNjA5NTgiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWkyc192aV9mZWVkX21vbm9bXSA9IHsKLQkiTGVmdCIsCi0JIlJpZ2h0IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWkyc19jb25maWdfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRV9FWFQoNCwgbWkyc19mb3JtYXQpLAotCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgbWkyc192aV9mZWVkX21vbm8pLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNiX2Zvcm1hdFtdID0gewotCSJVTlBBQ0tFRCIsCi0JIlBBQ0tFRF8xNkIiLAotCSJEU0RfRE9QIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2JfY29uZmlnX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKDMsIHNiX2Zvcm1hdCksCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGRtX2RhdGFfZm9ybWF0W10gPSB7Ci0JIkxQQ00iLAotCSJDb21wciIsCi0JIkdlbiBDb21wciIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0ZG1faGVhZGVyX3R5cGVbXSA9IHsKLQkiSW52YWxpZCIsCi0JIkRlZmF1bHQiLAotCSJFbnRlcnRhaW5tZW50IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdGRtX2NvbmZpZ19lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHRkbV9kYXRhX2Zvcm1hdCksIHRkbV9kYXRhX2Zvcm1hdCksCi0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKHRkbV9oZWFkZXJfdHlwZSksIHRkbV9oZWFkZXJfdHlwZSksCi19OwotCi1zdGF0aWMgREVGSU5FX01VVEVYKHRkbV9tdXRleCk7Ci0KLXN0YXRpYyBhdG9taWNfdCB0ZG1fZ3JvdXBfcmVmW0lEWF9HUk9VUF9URE1fTUFYXTsKLQotLyogY2FjaGUgb2YgZ3JvdXAgY2ZnIHBlciBwYXJlbnQgbm9kZSAqLwotc3RhdGljIHN0cnVjdCBhZmVfcGFyYW1faWRfZ3JvdXBfZGV2aWNlX3RkbV9jZmcgdGRtX2dyb3VwX2NmZyA9IHsKLQlBRkVfQVBJX1ZFUlNJT05fR1JPVVBfREVWSUNFX1RETV9DT05GSUcsCi0JQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9SWCwKLQkwLAotCXtBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCwKLQlBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xLAotCUFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzIsCi0JQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMywKLQlBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80LAotCUFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzUsCi0JQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNiwKLQlBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83fSwKLQk4LAotCTQ4MDAwLAotCTMyLAotCTgsCi0JMzIsCi0JMHhGRiwKLX07Ci0KLXN0YXRpYyB1MzIgbnVtX3RkbV9ncm91cF9wb3J0czsKLQotc3RhdGljIHN0cnVjdCBhZmVfY2xrX3NldCB0ZG1fY2xrX3NldCA9IHsKLQlBRkVfQVBJX1ZFUlNJT05fQ0xPQ0tfU0VULAotCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1RETV9FQklULAotCVE2QUZFX0xQQVNTX0lCSVRfQ0xLX0RJU0FCTEUsCi0JUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9JTlZFUlRfQ09VUExFX05PLAotCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JMCwKLX07Ci0KLWludCBtc21fZGFpX3E2X2dldF9ncm91cF9pZHgodTE2IGlkKQotewotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUFJJTUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfR1JPVVBfUFJJTUFSWV9URE1fUlg7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgotCQlyZXR1cm4gSURYX0dST1VQX1BSSU1BUllfVERNX1RYOwotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIElEWF9HUk9VUF9TRUNPTkRBUllfVERNX1JYOwotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9TRUNPTkRBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIElEWF9HUk9VUF9TRUNPTkRBUllfVERNX1RYOwotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIElEWF9HUk9VUF9URVJUSUFSWV9URE1fUlg7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1RFUlRJQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgotCQlyZXR1cm4gSURYX0dST1VQX1RFUlRJQVJZX1RETV9UWDsKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfUVVBVEVSTkFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfR1JPVVBfUVVBVEVSTkFSWV9URE1fUlg7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgotCQlyZXR1cm4gSURYX0dST1VQX1FVQVRFUk5BUllfVERNX1RYOwotCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotaW50IG1zbV9kYWlfcTZfZ2V0X3BvcnRfaWR4KHUxNiBpZCkKLXsKLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9QUklNQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfUFJJTUFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1RYXzA7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgotCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1RYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgotCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1JYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9TRUNPTkRBUllfVERNX1RYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfU0VDT05EQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgotCQlyZXR1cm4gSURYX1NFQ09OREFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fUlhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOgotCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfVEVSVElBUllfVERNX1RYXzE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgotCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfVEVSVElBUllfVERNX1JYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OgotCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfVEVSVElBUllfVERNX1RYXzQ7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgotCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfVEVSVElBUllfVERNX1JYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9URVJUSUFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OgotCQlyZXR1cm4gSURYX1RFUlRJQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfVEVSVElBUllfVERNX1RYXzc7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9RVUFURVJOQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfUVVBVEVSTkFSWV9URE1fVFhfNzsKLQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYgbXNtX2RhaV9xNl9tYXhfbnVtX3Nsb3QoaW50IGZyYW1lX3JhdGUpCi17Ci0JLyogTWF4IG51bSBvZiBzbG90cyBpcyBiaXRzIHBlciBmcmFtZSBkaXZpZGVkCi0JICogYnkgYml0cyBwZXIgc2FtcGxlIHdoaWNoIGlzIDE2Ci0JICovCi0Jc3dpdGNoIChmcmFtZV9yYXRlKSB7Ci0JY2FzZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfODoKLQkJcmV0dXJuIDA7Ci0JY2FzZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMTY6Ci0JCXJldHVybiAxOwotCWNhc2UgQUZFX1BPUlRfUENNX0JJVFNfUEVSX0ZSQU1FXzMyOgotCQlyZXR1cm4gMjsKLQljYXNlIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV82NDoKLQkJcmV0dXJuIDQ7Ci0JY2FzZSBBRkVfUE9SVF9QQ01fQklUU19QRVJfRlJBTUVfMTI4OgotCQlyZXR1cm4gODsKLQljYXNlIEFGRV9QT1JUX1BDTV9CSVRTX1BFUl9GUkFNRV8yNTY6Ci0JCXJldHVybiAxNjsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzIEludmFsaWQgYml0cyBwZXIgZnJhbWUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgZnJhbWVfcmF0ZSk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2RhaV9hZGRfcm91dGUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbjsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07Ci0KLQlpZiAoIWRhaSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBkYWlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghZGFpLT5kcml2ZXIpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgZGFpIGRyaXZlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGFwbSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kYXBtKGRhaS0+Y29tcG9uZW50KTsKLQltZW1zZXQoJmludGVyY29uLCAwLCBzaXplb2YoaW50ZXJjb24pKTsKLQlpZiAoZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lICYmCi0JCWRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZSkgewotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGFkZCByb3V0ZSBmb3Igd2lkZ2V0ICVzIiwKLQkJCQlfX2Z1bmNfXywgZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKLQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lOwotCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lOwotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IHNyYyAlcyBzaW5rICVzXG4iLAotCQkJCV9fZnVuY19fLCBpbnRlcmNvbi5zb3VyY2UsIGludGVyY29uLnNpbmspOwotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOwotCX0KLQlpZiAoZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUgJiYKLQkJZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWUpIHsKLQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lKTsKLQkJaW50ZXJjb24uc2luayA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lOwotCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZTsKLQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBzcmMgJXMgc2luayAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9hdXhwY21faHdfcGFyYW1zKAotCQkJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqYXV4X2RhaV9kYXRhID0KLQkJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gJmF1eF9kYWlfZGF0YS0+YmRhaV9kYXRhOwotCXN0cnVjdCBtc21fZGFpX2F1eHBjbV9wZGF0YSAqYXV4cGNtX3BkYXRhID0KLQkJCShzdHJ1Y3QgbXNtX2RhaV9hdXhwY21fcGRhdGEgKikgZGFpLT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJjID0gMCwgc2xvdF9tYXBwaW5nX2NvcHlfbGVuID0gMDsKLQotCWlmIChwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSAhPSAxIHx8IChwYXJhbXNfcmF0ZShwYXJhbXMpICE9IDgwMDAgJiYKLQkgICAgcGFyYW1zX3JhdGUocGFyYW1zKSAhPSAxNjAwMCkpIHsKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIHBhcmFtIGNoYW4gJWQgcmF0ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19UWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkgewotCQkvKiBBVVhQQ00gREFJIGluIHVzZSAqLwotCQlpZiAoZGFpX2RhdGEtPnJhdGUgIT0gcGFyYW1zX3JhdGUocGFyYW1zKSkgewotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiByYXRlIG1pc21hdGNoIG9mIHJ1bm5pbmcgREFJXG4iLAotCQkJX19mdW5jX18pOwotCQkJcmMgPSAtRUlOVkFMOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQlpZiAoZGFpX2RhdGEtPnJhdGUgPT0gODAwMCkgewotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnBjbV9jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCQkJQUZFX0FQSV9WRVJTSU9OX1BDTV9DT05GSUc7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uYXV4X21vZGUgPSBhdXhwY21fcGRhdGEtPm1vZGVfOGsubW9kZTsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zeW5jX3NyYyA9IGF1eHBjbV9wZGF0YS0+bW9kZV84ay5zeW5jOwotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmZyYW1lX3NldHRpbmcgPQotCQkJCQlhdXhwY21fcGRhdGEtPm1vZGVfOGsuZnJhbWU7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20ucXVhbnR5cGUgPQotCQkJCQkgYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnF1YW50OwotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmN0cmxfZGF0YV9vdXRfZW5hYmxlID0KLQkJCQkJIGF1eHBjbV9wZGF0YS0+bW9kZV84ay5kYXRhOwotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20ubnVtX2NoYW5uZWxzID0gZGFpX2RhdGEtPmNoYW5uZWxzOwotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmJpdF93aWR0aCA9IDE2OwotCQlpZiAoQVJSQVlfU0laRShkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNsb3RfbnVtYmVyX21hcHBpbmcpIDw9Ci0JCSAgICBhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzKQotCQkJc2xvdF9tYXBwaW5nX2NvcHlfbGVuID0KLQkJCQlBUlJBWV9TSVpFKAotCQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZykKLQkJCQkgKiBzaXplb2YodWludDE2X3QpOwotCQllbHNlCi0JCQlzbG90X21hcHBpbmdfY29weV9sZW4gPSBhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzCi0JCQkJKiBzaXplb2YodWludDE2X3QpOwotCi0JCWlmIChhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nKSB7Ci0JCQltZW1jcHkoZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nLAotCQkJICAgICAgIGF1eHBjbV9wZGF0YS0+bW9kZV84ay5zbG90X21hcHBpbmcsCi0JCQkgICAgICAgc2xvdF9tYXBwaW5nX2NvcHlfbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlcyA4a2h6IHNsb3QgbWFwcGluZyBpcyBOVUxMXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmYXV4X2RhaV9kYXRhLT5ybG9jayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20ucGNtX2NmZ19taW5vcl92ZXJzaW9uID0KLQkJCQlBRkVfQVBJX1ZFUlNJT05fUENNX0NPTkZJRzsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5hdXhfbW9kZSA9Ci0JCQkJCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubW9kZTsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zeW5jX3NyYyA9Ci0JCQkJCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc3luYzsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5mcmFtZV9zZXR0aW5nID0KLQkJCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5mcmFtZTsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5xdWFudHlwZSA9Ci0JCQkJCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucXVhbnQ7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uY3RybF9kYXRhX291dF9lbmFibGUgPQotCQkJCQlhdXhwY21fcGRhdGEtPm1vZGVfMTZrLmRhdGE7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uYml0X3dpZHRoID0gMTY7Ci0JCWlmIChBUlJBWV9TSVpFKGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZykgPD0KLQkJICAgIGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzKQotCQkJc2xvdF9tYXBwaW5nX2NvcHlfbGVuID0KLQkJCQlBUlJBWV9TSVpFKAotCQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZykKLQkJCQkgKiBzaXplb2YodWludDE2X3QpOwotCQllbHNlCi0JCQlzbG90X21hcHBpbmdfY29weV9sZW4gPSBhdXhwY21fcGRhdGEtPm1vZGVfMTZrLm51bV9zbG90cwotCQkJCSogc2l6ZW9mKHVpbnQxNl90KTsKLQotCQlpZiAoYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5zbG90X21hcHBpbmcpIHsKLQkJCW1lbWNweShkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNsb3RfbnVtYmVyX21hcHBpbmcsCi0JCQkgICAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5zbG90X21hcHBpbmcsCi0JCQkgICAgICAgc2xvdF9tYXBwaW5nX2NvcHlfbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlcyAxNmtoeiBzbG90IG1hcHBpbmcgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGF1eF9tb2RlIDB4JXggc3luY19zcmMgMHgleCBmcmFtZV9zZXR0aW5nIDB4JXhcbiIsCi0JCV9fZnVuY19fLCBkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmF1eF9tb2RlLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnN5bmNfc3JjLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLmZyYW1lX3NldHRpbmcpOwotCWRldl9kYmcoZGFpLT5kZXYsICIlczogcXR5cGUgMHgleCBkb3V0IDB4JXggbnVtX21hcFswXSAweCV4XG4iCi0JCSJudW1fbWFwWzFdIDB4JXggbnVtX21hcFsyXSAweCV4IG51bV9tYXBbM10gMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20ucXVhbnR5cGUsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uY3RybF9kYXRhX291dF9lbmFibGUsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZ1swXSwKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBjbS5zbG90X251bWJlcl9tYXBwaW5nWzFdLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucGNtLnNsb3RfbnVtYmVyX21hcHBpbmdbMl0sCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wY20uc2xvdF9udW1iZXJfbWFwcGluZ1szXSk7Ci0KLQltdXRleF91bmxvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2F1eHBjbV9zZXRfY2xrKAotCQlzdHJ1Y3QgbXNtX2RhaV9xNl9hdXhwY21fZGFpX2RhdGEgKmF1eF9kYWlfZGF0YSwKLQkJdTE2IHBvcnRfaWQsIGJvb2wgZW5hYmxlKQotewotCWludCByYzsKLQotCXByX2RlYnVnKCIlczogYWZlX2Nsa192ZXI6ICVkLCBwb3J0X2lkOiAlZCwgZW5hYmxlOiAlZFxuIiwgX19mdW5jX18sCi0JCSBhdXhfZGFpX2RhdGEtPmFmZV9jbGtfdmVyLCBwb3J0X2lkLCBlbmFibGUpOwotCWlmIChhdXhfZGFpX2RhdGEtPmFmZV9jbGtfdmVyID09IEFGRV9DTEtfVkVSU0lPTl9WMikgewotCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuZW5hYmxlID0gZW5hYmxlOwotCQlyYyA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIocG9ydF9pZCwKLQkJCQkJJmF1eF9kYWlfZGF0YS0+Y2xrX3NldCk7Ci0JfSBlbHNlIHsKLQkJaWYgKCFlbmFibGUpCi0JCQlhdXhfZGFpX2RhdGEtPmNsa19jZmcuY2xrX3ZhbDEgPSAwOwotCQlyYyA9IGFmZV9zZXRfbHBhc3NfY2xvY2socG9ydF9pZCwKLQkJCQkJJmF1eF9kYWlfZGF0YS0+Y2xrX2NmZyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2RhaV9xNl9hdXhwY21fc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9hdXhwY21fZGFpX2RhdGEgKmF1eF9kYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQltdXRleF9sb2NrKCZhdXhfZGFpX2RhdGEtPnJsb2NrKTsKLQotCWlmICghKHRlc3RfYml0KFNUQVRVU19UWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykgfHwKLQkgICAgICB0ZXN0X2JpdChTVEFUVVNfUlhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKSkgewotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMoKTogZGFpLT5pZCAlZCBQQ00gcG9ydHMgYWxyZWFkeSBjbG9zZWRcbiIsCi0JCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlpZiAodGVzdF9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkKLQkJCWNsZWFyX2JpdChTVEFUVVNfVFhfUE9SVCwKLQkJCQkgIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQkJZWxzZSB7Ci0JCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IFBDTV9UWCBwb3J0IGFscmVhZHkgY2xvc2VkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlpZiAodGVzdF9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkKLQkJCWNsZWFyX2JpdChTVEFUVVNfUlhfUE9SVCwKLQkJCQkgIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQkJZWxzZSB7Ci0JCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IFBDTV9SWCBwb3J0IGFscmVhZHkgY2xvc2VkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfUlhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlczogY2Fubm90IHNodXRkb3duIFBDTSBwb3J0c1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpLT5pZCA9ICVkIGNsb3NpbmcgUENNIEFGRSBwb3J0c1xuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQotCXJjID0gYWZlX2Nsb3NlKGF1eF9kYWlfZGF0YS0+cnhfcGlkKTsgLyogY2FuIGJsb2NrICovCi0JaWYgKHJjIDwgMCkKLQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gY2xvc2UgUENNX1JYICBBRkUgcG9ydFxuIik7Ci0KLQlyYyA9IGFmZV9jbG9zZShhdXhfZGFpX2RhdGEtPnR4X3BpZCk7Ci0JaWYgKHJjIDwgMCkKLQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gY2xvc2UgQVVYIFBDTSBUWCBwb3J0XG4iKTsKLQotCW1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoYXV4X2RhaV9kYXRhLCBhdXhfZGFpX2RhdGEtPnJ4X3BpZCwgZmFsc2UpOwotCW1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoYXV4X2RhaV9kYXRhLCBhdXhfZGFpX2RhdGEtPnR4X3BpZCwgZmFsc2UpOwotZXhpdDoKLQltdXRleF91bmxvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfYXV4cGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqYXV4X2RhaV9kYXRhID0KLQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSAmYXV4X2RhaV9kYXRhLT5iZGFpX2RhdGE7Ci0Jc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhICphdXhwY21fcGRhdGEgPSBOVUxMOwotCWludCByYyA9IDA7Ci0JdTMyIHBjbV9jbGtfcmF0ZTsKLQotCWF1eHBjbV9wZGF0YSA9IGRhaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCW11dGV4X2xvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlpZiAodGVzdF9iaXQoU1RBVFVTX1RYX1BPUlQsCi0JCQkJYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpKSB7Ci0JCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IFBDTV9UWCBwb3J0IGFscmVhZHkgT05cbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9IGVsc2UKLQkJCXNldF9iaXQoU1RBVFVTX1RYX1BPUlQsCi0JCQkJICBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cyk7Ci0JfSBlbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfUlhfUE9SVCwKLQkJCQlhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykpIHsKLQkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogUENNX1JYIHBvcnQgYWxyZWFkeSBPTlxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZQotCQkJc2V0X2JpdChTVEFUVVNfUlhfUE9SVCwKLQkJCQkgIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQl9Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19UWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykgJiYKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKSkgewotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IFBDTSBwb3J0cyBhbHJlYWR5IHNldFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZGV2X2RiZyhkYWktPmRldiwgIiVzOiBkYWktPmlkOiVkICBvcGVuaW5nIGFmZSBwb3J0c1xuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQotCXJjID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBvcGVuIEFGRSBBUFJcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyoKLQkgKiBGb3IgQVVYIFBDTSBJbnRlcmZhY2UgdGhlIGJlbG93IHNlcXVlbmNlIG9mIGNsawotCSAqIHNldHRpbmdzIGFuZCBhZmVfb3BlbiBpcyBhIHN0cmljdCByZXF1aXJlbWVudC4KLQkgKgotCSAqIEFsc28gdXNpbmcgYWZlX29wZW4gaW5zdGVhZCBvZiBhZmVfcG9ydF9zdGFydF9ub3dhaXQKLQkgKiB0byBtYWtlIHN1cmUgdGhlIHBvcnQgaXMgb3BlbiBiZWZvcmUgZGVhc3NlcnRpbmcgdGhlCi0JICogY2xvY2sgbGluZS4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHBjbSByZWdpc3RlciBpcwotCSAqIG5vdCB3cml0dGVuIGJlZm9yZSBjbG9jayBkZWFzc2VydC4gSGVuY2UgdGhlIGh3IGRvZXMKLQkgKiBub3QgZ2V0IHVwZGF0ZWQgd2l0aCBuZXcgc2V0dGluZyBpZiB0aGUgYmVsb3cgY2xvY2sKLQkgKiBhc3NlcnQvZGVhc3NldCBhbmQgYWZlX29wZW4gc2VxdWVuY2UgaXMgbm90IGZvbGxvd2VkLgotCSAqLwotCi0JaWYgKGRhaV9kYXRhLT5yYXRlID09IDgwMDApIHsKLQkJcGNtX2Nsa19yYXRlID0gYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnBjbV9jbGtfcmF0ZTsKLQl9IGVsc2UgaWYgKGRhaV9kYXRhLT5yYXRlID09IDE2MDAwKSB7Ci0JCXBjbV9jbGtfcmF0ZSA9IChhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnBjbV9jbGtfcmF0ZSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBJbnZhbGlkIEFVWCBQQ00gcmF0ZSAlZFxuIiwgX19mdW5jX18sCi0JCQlkYWlfZGF0YS0+cmF0ZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAoYXV4X2RhaV9kYXRhLT5hZmVfY2xrX3ZlciA9PSBBRkVfQ0xLX1ZFUlNJT05fVjIpIHsKLQkJbWVtY3B5KCZhdXhfZGFpX2RhdGEtPmNsa19zZXQsICZscGFzc19jbGtfc2V0X2RlZmF1bHQsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZmVfY2xrX3NldCkpOwotCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2ZyZXFfaW5faHogPSBwY21fY2xrX3JhdGU7Ci0KLQkJc3dpdGNoIChkYWktPmlkKSB7Ci0JCWNhc2UgTVNNX0RBSV9QUklfQVVYUENNX0RUX0RFVl9JRDoKLQkJCWlmIChwY21fY2xrX3JhdGUpCi0JCQkJYXV4X2RhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9Ci0JCQkJCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfUENNX0lCSVQ7Ci0JCQllbHNlCi0JCQkJYXV4X2RhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9Ci0JCQkJCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfUENNX0VCSVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNU01fREFJX1NFQ19BVVhQQ01fRFRfREVWX0lEOgotCQkJaWYgKHBjbV9jbGtfcmF0ZSkKLQkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KLQkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19QQ01fSUJJVDsKLQkJCWVsc2UKLQkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KLQkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1NFQ19QQ01fRUJJVDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9EQUlfVEVSVF9BVVhQQ01fRFRfREVWX0lEOgotCQkJaWYgKHBjbV9jbGtfcmF0ZSkKLQkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KLQkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9QQ01fSUJJVDsKLQkJCWVsc2UKLQkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KLQkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9QQ01fRUJJVDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9EQUlfUVVBVF9BVVhQQ01fRFRfREVWX0lEOgotCQkJaWYgKHBjbV9jbGtfcmF0ZSkKLQkJCQlhdXhfZGFpX2RhdGEtPmNsa19zZXQuY2xrX2lkID0KLQkJCQkJUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfUENNX0lCSVQ7Ci0JCQllbHNlCi0JCQkJYXV4X2RhaV9kYXRhLT5jbGtfc2V0LmNsa19pZCA9Ci0JCQkJCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX1BDTV9FQklUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IEFVWFBDTSBpZDogJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCW1lbWNweSgmYXV4X2RhaV9kYXRhLT5jbGtfY2ZnLCAmbHBhc3NfY2xrX2NmZ19kZWZhdWx0LAotCQkJCXNpemVvZihzdHJ1Y3QgYWZlX2Nsa19jZmcpKTsKLQkJYXV4X2RhaV9kYXRhLT5jbGtfY2ZnLmNsa192YWwxID0gcGNtX2Nsa19yYXRlOwotCX0KLQotCXJjID0gbXNtX2RhaV9xNl9hdXhwY21fc2V0X2NsayhhdXhfZGFpX2RhdGEsCi0JCQkJICAgICAgIGF1eF9kYWlfZGF0YS0+cnhfcGlkLCB0cnVlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6YWZlX3NldF9scGFzc19jbG9jayBvbiBSWCBwY21fc3JjX2NsayBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyYyA9IG1zbV9kYWlfcTZfYXV4cGNtX3NldF9jbGsoYXV4X2RhaV9kYXRhLAotCQkJCSAgICAgICBhdXhfZGFpX2RhdGEtPnR4X3BpZCwgdHJ1ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LAotCQkJIiVzOmFmZV9zZXRfbHBhc3NfY2xvY2sgb24gVFggcGNtX3NyY19jbGsgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JYWZlX29wZW4oYXV4X2RhaV9kYXRhLT5yeF9waWQsICZkYWlfZGF0YS0+cG9ydF9jb25maWcsIGRhaV9kYXRhLT5yYXRlKTsKLQlhZmVfb3BlbihhdXhfZGFpX2RhdGEtPnR4X3BpZCwgJmRhaV9kYXRhLT5wb3J0X2NvbmZpZywgZGFpX2RhdGEtPnJhdGUpOwotCWdvdG8gZXhpdDsKLQotZmFpbDoKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQljbGVhcl9iaXQoU1RBVFVTX1RYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQljbGVhcl9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQotZXhpdDoKLQltdXRleF91bmxvY2soJmF1eF9kYWlfZGF0YS0+cmxvY2spOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2F1eHBjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlpbnQgY21kLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOnBvcnQ6JWQgIGNtZDolZFxuIiwKLQkJX19mdW5jX18sIGRhaS0+aWQsIGNtZCk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCS8qIGFmZV9vcGVuIHdpbGwgYmUgY2FsbGVkIGZyb20gcHJlcGFyZSAqLwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGNtZCAlZFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci0KLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2RhaV9hdXhwY21fcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqYXV4X2RhaV9kYXRhOwotCWludCByYzsKLQotCWF1eF9kYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGRhaS0+aWQgJWQgY2xvc2luZyBhZmVcbiIsCi0JCV9fZnVuY19fLCBkYWktPmlkKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19SWF9QT1JULCBhdXhfZGFpX2RhdGEtPmF1eHBjbV9wb3J0X3N0YXR1cykpIHsKLQkJcmMgPSBhZmVfY2xvc2UoYXV4X2RhaV9kYXRhLT5yeF9waWQpOyAvKiBjYW4gYmxvY2sgKi8KLQkJaWYgKHJjIDwgMCkKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFVWFBDTSBSWCBBRkUgcG9ydFxuIik7Ci0JCXJjID0gYWZlX2Nsb3NlKGF1eF9kYWlfZGF0YS0+dHhfcGlkKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFVWFBDTSBUWCBBRkUgcG9ydFxuIik7Ci0JCWNsZWFyX2JpdChTVEFUVVNfVFhfUE9SVCwgYXV4X2RhaV9kYXRhLT5hdXhwY21fcG9ydF9zdGF0dXMpOwotCQljbGVhcl9iaXQoU1RBVFVTX1JYX1BPUlQsIGF1eF9kYWlfZGF0YS0+YXV4cGNtX3BvcnRfc3RhdHVzKTsKLQl9Ci0JbXNtX2RhaV9xNl9hdXhwY21fc2V0X2NsayhhdXhfZGFpX2RhdGEsIGF1eF9kYWlfZGF0YS0+cnhfcGlkLCBmYWxzZSk7Ci0JbXNtX2RhaV9xNl9hdXhwY21fc2V0X2NsayhhdXhfZGFpX2RhdGEsIGF1eF9kYWlfZGF0YS0+dHhfcGlkLCBmYWxzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9hdXhfcGNtX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoIWRhaSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBkYWlcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghZGFpLT5kZXYpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgZGFpIGRldlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFkYWktPmRyaXZlci0+aWQpIHsKLQkJZGV2X3dhcm4oZGFpLT5kZXYsICJEQUkgZHJpdmVyIGlkIGlzIG5vdCBzZXRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGFpLT5pZCA9IGRhaS0+ZHJpdmVyLT5pZDsKLQlyYyA9IG1zbV9kYWlfcTZfZGFpX2FkZF9yb3V0ZShkYWkpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2RhaV9xNl9hdXhwY21fb3BzID0gewotCS5wcmVwYXJlCT0gbXNtX2RhaV9xNl9hdXhwY21fcHJlcGFyZSwKLQkudHJpZ2dlcgk9IG1zbV9kYWlfcTZfYXV4cGNtX3RyaWdnZXIsCi0JLmh3X3BhcmFtcwk9IG1zbV9kYWlfcTZfYXV4cGNtX2h3X3BhcmFtcywKLQkuc2h1dGRvd24JPSBtc21fZGFpX3E2X2F1eHBjbV9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyCi0JbXNtX2RhaV9xNl9hdXhfcGNtX2RhaV9jb21wb25lbnQgPSB7Ci0JLm5hbWUJCT0gIm1zbS1hdXhwY20tZGV2IiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfYXV4X3BjbV9kYWlbXSA9IHsKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJBVVhfUENNX1JYIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDApLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDEsCi0JCQkucmF0ZV9tYXggPSAxNjAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiQVVYX1BDTV9UWCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQkJLnJhdGVfbWF4ID0gMTYwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQl9LAotCQkuaWQgPSBNU01fREFJX1BSSV9BVVhQQ01fRFRfREVWX0lELAotCQkub3BzID0gJm1zbV9kYWlfcTZfYXV4cGNtX29wcywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9hdXhfcGNtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfYXV4cGNtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfQVVYX1BDTV9SWCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQkJLnJhdGVfbWF4ID0gMTYwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfQVVYX1BDTV9UWCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQkJLnJhdGVfbWF4ID0gMTYwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQl9LAotCQkuaWQgPSBNU01fREFJX1NFQ19BVVhQQ01fRFRfREVWX0lELAotCQkub3BzID0gJm1zbV9kYWlfcTZfYXV4cGNtX29wcywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9hdXhfcGNtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfYXV4cGNtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9BVVhfUENNX1JYIiwKLQkJCS5yYXRlcyA9IChTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDApLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDEsCi0JCQkucmF0ZV9tYXggPSAxNjAwMCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX0FVWF9QQ01fVFgiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMSwKLQkJCS5yYXRlX21heCA9IDE2MDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJfSwKLQkJLmlkID0gTVNNX0RBSV9URVJUX0FVWFBDTV9EVF9ERVZfSUQsCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9hdXhwY21fb3BzLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2F1eF9wY21fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9hdXhwY21fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX0FVWF9QQ01fUlgiLAotCQkJLnJhdGVzID0gKFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCksCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMSwKLQkJCS5yYXRlX21heCA9IDE2MDAwLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfQVVYX1BDTV9UWCIsCi0JCQkucmF0ZXMgPSAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQkJLnJhdGVfbWF4ID0gMTYwMDAsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQl9LAotCQkuaWQgPSBNU01fREFJX1FVQVRfQVVYUENNX0RUX0RFVl9JRCwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X2F1eHBjbV9vcHMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfYXV4X3BjbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX2F1eHBjbV9yZW1vdmUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQotCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuZGF0YV9mb3JtYXQgPSB2YWx1ZTsKLQlwcl9kZWJ1ZygiJXM6IHZhbHVlID0gJWRcbiIsIF9fZnVuY19fLCB2YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQotCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNmZy5kYXRhX2Zvcm1hdDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGRpZl9mb3JtYXRbXSA9IHsKLQkiTFBDTSIsCi0JIkNvbXByIgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzcGRpZl9jb25maWdfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRV9FWFQoMiwgc3BkaWZfZm9ybWF0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9jaHN0YXR1c19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jaF9zdGF0dXMuc3RhdHVzX3R5cGUgPQotCQlBRkVfQVBJX1ZFUlNJT05fU1BESUZfQ0hfU1RBVFVTX0NPTkZJRzsKLQltZW1zZXQoZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2hfc3RhdHVzLnN0YXR1c19tYXNrLAotCQkJQ0hBTk5FTF9TVEFUVVNfTUFTS19JTklULCBDSEFOTkVMX1NUQVRVU19TSVpFKTsKLQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jaF9zdGF0dXMuc3RhdHVzX21hc2tbMF0gPQotCQlDSEFOTkVMX1NUQVRVU19NQVNLOwotCi0JbWVtY3B5KGRhaV9kYXRhLT5zcGRpZl9wb3J0LmNoX3N0YXR1cy5zdGF0dXNfYml0cywKLQkJCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzLCBDSEFOTkVMX1NUQVRVU19TSVpFKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spKSB7Ci0JCXByX2RlYnVnKCIlczogUG9ydCBhbHJlYWR5IHN0YXJ0ZWQuIER5bmFtaWMgdXBkYXRlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gYWZlX3NlbmRfc3BkaWZfY2hfc3RhdHVzX2NmZygKLQkJCQkmZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2hfc3RhdHVzLAotCQkJCUFGRV9QT1JUX0lEX1NQRElGX1JYKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX2Noc3RhdHVzX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0KLQlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JbWVtY3B5KHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzLAotCQkJZGFpX2RhdGEtPnNwZGlmX3BvcnQuY2hfc3RhdHVzLnN0YXR1c19iaXRzLAotCQkJQ0hBTk5FTF9TVEFUVVNfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9jaHN0YXR1c19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwZGlmX2NvbmZpZ19jb250cm9sc1tdID0gewotCXsKLQkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKLQkJCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUpLAotCQkuaWZhY2UgID0gICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lICAgPSAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIFBDTV9TVFJFQU0pLAotCQkuaW5mbyAgID0gICBtc21fZGFpX3E2X3NwZGlmX2Noc3RhdHVzX2luZm8sCi0JCS5nZXQgICAgPSAgIG1zbV9kYWlfcTZfc3BkaWZfY2hzdGF0dXNfZ2V0LAotCQkucHV0ICAgID0gICBtc21fZGFpX3E2X3NwZGlmX2Noc3RhdHVzX3B1dCwKLQl9LAotCVNPQ19FTlVNX0VYVCgiU1BESUYgUlggRm9ybWF0Iiwgc3BkaWZfY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3NwZGlmX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3NwZGlmX2Zvcm1hdF9wdXQpCi19OwotCi0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zcGRpZl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCi0JZGFpLT5pZCA9IEFGRV9QT1JUX0lEX1NQRElGX1JYOwotCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNmZy5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7Ci0Jc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuYml0X3dpZHRoID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNmZy5iaXRfd2lkdGggPSAyNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZm9ybWF0ICVkXG4iLAotCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQlkYWlfZGF0YS0+Yml0d2lkdGggPSBkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuYml0X3dpZHRoOwotCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNmZy5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOwotCWRhaV9kYXRhLT5zcGRpZl9wb3J0LmNmZy5zcGRpZl9jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCUFGRV9BUElfVkVSU0lPTl9TUERJRl9DT05GSUc7Ci0JZGV2X2RiZyhkYWktPmRldiwgIiBjaGFubmVsICVkIHNhbXBsZSByYXRlICVkIGJpdCB3aWR0aCAlZFxuIiwKLQkJCWRhaV9kYXRhLT5jaGFubmVscywgZGFpX2RhdGEtPnJhdGUsCi0JCQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcuYml0X3dpZHRoKTsKLQlkYWlfZGF0YS0+c3BkaWZfcG9ydC5jZmcucmVzZXJ2ZWQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZGFpX3E2X3NwZGlmX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCWludCByYyA9IDA7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcHJfaW5mbygiJXM6ICBhZmUgcG9ydCBub3Qgc3RhcnRlZC4gZGFpX2RhdGEtPnN0YXR1c19tYXNrID0gJWxkXG4iLAotCQkJCV9fZnVuY19fLCAqZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQkJcmV0dXJuOwotCX0KLQotCXJjID0gYWZlX2Nsb3NlKGRhaS0+aWQpOwotCWlmIChyYyA8IDApCi0JCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFGRSBwb3J0XG4iKTsKLQotCXByX2RlYnVnKCIlczogZGFpX2RhdGEtPnN0YXR1c19tYXNrID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJCSpkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCi0JY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci19Ci0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0JaW50IHJjID0gMDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgewotCQlyYyA9IGFmZV9zcGRpZl9wb3J0X3N0YXJ0KGRhaS0+aWQsICZkYWlfZGF0YS0+c3BkaWZfcG9ydCwKLQkJCQlkYWlfZGF0YS0+cmF0ZSk7Ci0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBvcGVuIEFGRSBwb3J0IDB4JXhcbiIsCi0JCQkJCWRhaS0+aWQpOwotCQllbHNlCi0JCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JCQkJCWRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3NwZGlmX2RhaV9kYXRhICpkYWlfZGF0YTsKLQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2NvbnRyb2w7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQotCWlmICghZGFpKSB7Ci0JCXByX2VycigiJXM6IGRhaSBub3QgZm91bmQhIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGFpX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2RhaV9xNl9zcGRpZl9kYWlfZGF0YSksCi0JCQlHRlBfS0VSTkVMKTsKLQotCWlmICghZGFpX2RhdGEpIHsKLQkJZGV2X2VycihkYWktPmRldiwgIkRBSS0lZDogZmFpbCB0byBhbGxvY2F0ZSBkYWkgZGF0YVxuIiwKLQkJCQlBRkVfUE9SVF9JRF9TUERJRl9SWCk7Ci0JCXJjID0gLUVOT01FTTsKLQl9IGVsc2UKLQkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBkYWlfZGF0YSk7Ci0KLQlrY29udHJvbCA9ICZzcGRpZl9jb25maWdfY29udHJvbHNbMV07Ci0JZGFwbSA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kYXBtKGRhaS0+Y29tcG9uZW50KTsKLQotCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJc25kX2N0bF9uZXcxKGtjb250cm9sLCBkYWlfZGF0YSkpOwotCi0JbWVtc2V0KCZpbnRlcmNvbiwgMCwgc2l6ZW9mKGludGVyY29uKSk7Ci0JaWYgKCFyYyAmJiBkYWkgJiYgZGFpLT5kcml2ZXIpIHsKLQkJaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZSAmJgotCQkJCWRhaS0+ZHJpdmVyLT5wbGF5YmFjay5haWZfbmFtZSkgewotCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQkJX19mdW5jX18sIGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5zdHJlYW1fbmFtZSk7Ci0JCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+cGxheWJhY2suYWlmX25hbWU7Ci0JCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lOwotCQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBzcmMgJXMgc2luayAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sICZpbnRlcmNvbiwgMSk7Ci0JCX0KLQkJaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lICYmCi0JCQkJZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWUpIHsKLQkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogYWRkIHJvdXRlIGZvciB3aWRnZXQgJXMiLAotCQkJCV9fZnVuY19fLCBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZSk7Ci0JCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWU7Ci0JCQlpbnRlcmNvbi5zb3VyY2UgPSBkYWktPmRyaXZlci0+Y2FwdHVyZS5zdHJlYW1fbmFtZTsKLQkJCWRldl9kYmcoZGFpLT5kZXYsICIlczogc3JjICVzIHNpbmsgJXNcbiIsCi0JCQkJX19mdW5jX18sIGludGVyY29uLnNvdXJjZSwgaW50ZXJjb24uc2luayk7Ci0JCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCAmaW50ZXJjb24sIDEpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX2RhaV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfc3BkaWZfZGFpX2RhdGEgKmRhaV9kYXRhOwotCWludCByYzsKLQotCWRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQotCS8qIElmIEFGRSBwb3J0IGlzIHN0aWxsIHVwLCBjbG9zZSBpdCAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spKSB7Ci0JCXJjID0gYWZlX2Nsb3NlKGRhaS0+aWQpOyAvKiBjYW4gYmxvY2sgKi8KLQkJaWYgKHJjIDwgMCkKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIEFGRSBwb3J0XG4iKTsKLQotCQljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQl9Ci0Ja2ZyZWUoZGFpX2RhdGEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2RhaV9xNl9zcGRpZl9vcHMgPSB7Ci0JLnByZXBhcmUJPSBtc21fZGFpX3E2X3NwZGlmX3ByZXBhcmUsCi0JLmh3X3BhcmFtcwk9IG1zbV9kYWlfcTZfc3BkaWZfaHdfcGFyYW1zLAotCS5zaHV0ZG93bgk9IG1zbV9kYWlfcTZfc3BkaWZfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X3NwZGlmX3NwZGlmX3J4X2RhaSA9IHsKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJTUERJRiBQbGF5YmFjayIsCi0JCS5haWZfbmFtZSA9ICJTUERJRl9SWCIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCS5yYXRlX21pbiA9IDgwMDAsCi0JCS5yYXRlX21heCA9IDQ4MDAwLAotCX0sCi0JLm9wcyA9ICZtc21fZGFpX3E2X3NwZGlmX29wcywKLQkucHJvYmUgPSBtc21fZGFpX3E2X3NwZGlmX2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9zcGRpZl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX2RhaV9zcGRpZl9xNl9jb21wb25lbnQgPSB7Ci0JLm5hbWUJCT0gIm1zbS1kYWktcTYtc3BkaWYiLAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0JaW50IHJjID0gMDsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgewotCQlpZiAoZGFpX2RhdGEtPmVuY19jb25maWcuZm9ybWF0ICE9IEVOQ19GTVRfTk9ORSkgewotCQkJaW50IGJpdHdpZHRoID0gMDsKLQotCQkJaWYgKGRhaV9kYXRhLT5hZmVfaW5fYml0Zm9ybWF0ID09Ci0JCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpCi0JCQkJYml0d2lkdGggPSAyNDsKLQkJCWVsc2UgaWYgKGRhaV9kYXRhLT5hZmVfaW5fYml0Zm9ybWF0ID09Ci0JCQkJIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKQotCQkJCWJpdHdpZHRoID0gMTY7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNhbGxpbmcgQUZFX1BPUlRfU1RBUlRfVjIgd2l0aCBlbmNfZm9ybWF0OiAlZFxuIiwKLQkJCQkgX19mdW5jX18sIGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCk7Ci0JCQlyYyA9IGFmZV9wb3J0X3N0YXJ0X3YyKGRhaS0+aWQsICZkYWlfZGF0YS0+cG9ydF9jb25maWcsCi0JCQkJCSAgICAgICBkYWlfZGF0YS0+cmF0ZSwKLQkJCQkJICAgICAgIGRhaV9kYXRhLT5hZmVfaW5fY2hhbm5lbHMsCi0JCQkJCSAgICAgICBiaXR3aWR0aCwKLQkJCQkJICAgICAgICZkYWlfZGF0YS0+ZW5jX2NvbmZpZyk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXByX2VycigiJXM6IGFmZV9wb3J0X3N0YXJ0X3YyIGZhaWxlZCBlcnJvcjogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IGFmZV9wb3J0X3N0YXJ0KGRhaS0+aWQsICZkYWlfZGF0YS0+cG9ydF9jb25maWcsCi0JCQkJCQlkYWlfZGF0YS0+cmF0ZSk7Ci0JCX0KLQkJaWYgKHJjIDwgMCkKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIG9wZW4gQUZFIHBvcnQgMHgleFxuIiwKLQkJCQlkYWktPmlkKTsKLQkJZWxzZQotCQkJc2V0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCQkJCWRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2NkY19od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlzd2l0Y2ggKGRhaV9kYXRhLT5jaGFubmVscykgewotCWNhc2UgMjoKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5tb25vX3N0ZXJlbyA9IE1TTV9BRkVfU1RFUkVPOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMubW9ub19zdGVyZW8gPSBNU01fQUZFX01PTk87Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCQlwcl9lcnIoIiVzOiBlcnIgY2hhbm5lbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpX2RhdGEtPmNoYW5uZWxzKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TUEVDSUFMOgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmJpdF93aWR0aCA9IDE2OwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmJpdF93aWR0aCA9IDI0OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBmb3JtYXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmkyc19jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCQkJCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRzsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmRhdGFfZm9ybWF0ID0gIEFGRV9MSU5FQVJfUENNX0RBVEE7Ci0JZGV2X2RiZyhkYWktPmRldiwgIiBjaGFubmVsICVkIHNhbXBsZSByYXRlICVkIGVudGVyZWRcbiIsCi0JZGFpX2RhdGEtPmNoYW5uZWxzLCBkYWlfZGF0YS0+cmF0ZSk7Ci0KLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBudW1fb2ZfYml0c19zZXQodTggc2RfbGluZV9tYXNrKQotewotCXU4IG51bV9iaXRzX3NldCA9IDA7Ci0KLQl3aGlsZSAoc2RfbGluZV9tYXNrKSB7Ci0JCW51bV9iaXRzX3NldCsrOwotCQlzZF9saW5lX21hc2sgPSBzZF9saW5lX21hc2sgJiAoc2RfbGluZV9tYXNrIC0gMSk7Ci0JfQotCXJldHVybiBudW1fYml0c19zZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9pMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHN0cmVhbSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCXN0cnVjdCBtc21faTJzX2RhdGEgKmkyc19wZGF0YSA9Ci0JCQkoc3RydWN0IG1zbV9pMnNfZGF0YSAqKSBkYWktPmRldi0+cGxhdGZvcm1fZGF0YTsKLQotCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWlmIChudW1fb2ZfYml0c19zZXQoaTJzX3BkYXRhLT5zZF9saW5lcykgPT0gMSkgewotCQlzd2l0Y2ggKGRhaV9kYXRhLT5jaGFubmVscykgewotCQljYXNlIDI6Ci0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLm1vbm9fc3RlcmVvID0gTVNNX0FGRV9TVEVSRU87Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5tb25vX3N0ZXJlbyA9IE1TTV9BRkVfTU9OTzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfd2FybigiJXM6IGdyZWF0ZXIgdGhhbiBzdGVyZW8gaGFzIG5vdCBiZWVuIHZhbGlkYXRlZCAlZCIsCi0JCQkJX19mdW5jX18sIGRhaV9kYXRhLT5jaGFubmVscyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuaTJzX2NmZ19taW5vcl92ZXJzaW9uID0KLQkJCQkJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuZGF0YV9mb3JtYXQgPSAgQUZFX0xJTkVBUl9QQ01fREFUQTsKLQkvKiBRNiBvbmx5IHN1cHBvcnRzIDE2IGFzIG5vdyAqLwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuYml0X3dpZHRoID0gMTY7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9zbGltX2J1c19od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1NQRUNJQUw6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5iaXRfd2lkdGggPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmJpdF93aWR0aCA9IDI0OwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guYml0X3dpZHRoID0gMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGZvcm1hdCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2JfY2ZnX21pbm9yX3ZlcnNpb24gPQotCQkJCUFGRV9BUElfVkVSU0lPTl9TTElNQlVTX0NPTkZJRzsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2gubnVtX2NoYW5uZWxzID0gZGFpX2RhdGEtPmNoYW5uZWxzOwotCi0Jc3dpdGNoIChkYWktPmlkKSB7Ci0JY2FzZSBTTElNQlVTXzdfUlg6Ci0JY2FzZSBTTElNQlVTXzdfVFg6Ci0JY2FzZSBTTElNQlVTXzhfUlg6Ci0JY2FzZSBTTElNQlVTXzhfVFg6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zbGltYnVzX2Rldl9pZCA9Ci0JCQlBRkVfU0xJTUJVU19ERVZJQ0VfMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNsaW1idXNfZGV2X2lkID0KLQkJCUFGRV9TTElNQlVTX0RFVklDRV8xOwotCQlicmVhazsKLQl9Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6c2xpbWJ1c19kZXZfaWRbJWh1XSBiaXRfd2RbJWh1XSBmb3JtYXRbJWh1XVxuIgotCQkibnVtX2NoYW5uZWwgJWh1ICBzaGFyZWRfY2hfbWFwcGluZ1swXSAgJWh1XG4iCi0JCSJzbGF2ZV9wb3J0X21hcHBpbmdbMV0gICVodSBzbGF2ZV9wb3J0X21hcHBpbmdbMl0gICVodVxuIgotCQkic2FtcGxlX3JhdGUgJWRcbiIsIF9fZnVuY19fLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2xpbWJ1c19kZXZfaWQsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5iaXRfd2lkdGgsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5kYXRhX2Zvcm1hdCwKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLm51bV9jaGFubmVscywKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLnNoYXJlZF9jaF9tYXBwaW5nWzBdLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMV0sCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5zaGFyZWRfY2hfbWFwcGluZ1syXSwKLQkJZGFpX2RhdGEtPnJhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl91c2JfYXVkaW9faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCQkgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1NQRUNJQUw6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uYml0X3dpZHRoID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uYml0X3dpZHRoID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uYml0X3dpZHRoID0gMzI7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIGZvcm1hdCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCQkJCUFGRV9BUElfTUlOSU9SX1ZFUlNJT05fVVNCX0FVRElPX0NPTkZJRzsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLm51bV9jaGFubmVscyA9IGRhaV9kYXRhLT5jaGFubmVsczsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLnNhbXBsZV9yYXRlID0gZGFpX2RhdGEtPnJhdGU7Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGRldl9pZFsweCV4XSBiaXRfd2RbJWh1XSBmb3JtYXRbJWh1XVxuIgotCQkibnVtX2NoYW5uZWwgJWh1ICBzYW1wbGVfcmF0ZSAlZFxuIiwgX19mdW5jX18sCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZGV2X3Rva2VuLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLmJpdF93aWR0aCwKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5kYXRhX2Zvcm1hdCwKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5udW1fY2hhbm5lbHMsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uc2FtcGxlX3JhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9idF9mbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0pCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQotCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotCWRldl9kYmcoZGFpLT5kZXYsICJjaGFubmVscyAlZCBzYW1wbGUgcmF0ZSAlZCBlbnRlcmVkXG4iLAotCQlkYWlfZGF0YS0+Y2hhbm5lbHMsIGRhaV9kYXRhLT5yYXRlKTsKLQotCW1lbXNldCgmZGFpX2RhdGEtPnBvcnRfY29uZmlnLCAwLCBzaXplb2YoZGFpX2RhdGEtPnBvcnRfY29uZmlnKSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgYnRfZm0gcGFyYW1ldGVyc1xuIiwgX19mdW5jX18pOwotCi0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmludF9idF9mbS5idF9mbV9jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCQkJCUFGRV9BUElfVkVSU0lPTl9JTlRFUk5BTF9CVF9GTV9DT05GSUc7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmludF9idF9mbS5udW1fY2hhbm5lbHMgPSBkYWlfZGF0YS0+Y2hhbm5lbHM7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLmludF9idF9mbS5zYW1wbGVfcmF0ZSA9IGRhaV9kYXRhLT5yYXRlOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pbnRfYnRfZm0uYml0X3dpZHRoID0gMTY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9ydHByb3h5X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCi0JZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5Lm51bV9jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5LnNhbXBsZV9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotCXByX2RlYnVnKCJjaGFubmVsICVkIGVudGVyZWQsZGFpX2lkOiAlZCxyYXRlOiAlZFxuIiwKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcucnRwcm94eS5udW1fY2hhbm5lbHMsIGRhaS0+aWQsIGRhaV9kYXRhLT5yYXRlKTsKLQotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5LnJ0X3Byb3h5X2NmZ19taW5vcl92ZXJzaW9uID0KLQkJCQlBRkVfQVBJX1ZFUlNJT05fUlRfUFJPWFlfQ09ORklHOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5LmJpdF93aWR0aCA9IDE2OyAvKiBRNiBvbmx5IHN1cHBvcnRzIDE2ICovCi0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuaW50ZXJsZWF2ZWQgPSAxOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5LmZyYW1lX3NpemUgPSBwYXJhbXNfcGVyaW9kX2J5dGVzKHBhcmFtcyk7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuaml0dGVyX2FsbG93YW5jZSA9Ci0JCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnJ0cHJveHkuZnJhbWVfc2l6ZS8yOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5ydHByb3h5Lmxvd193YXRlcl9tYXJrID0gMDsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcucnRwcm94eS5oaWdoX3dhdGVyX21hcmsgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9wc2V1ZG9fcG9ydF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlkYWlfZGF0YS0+Y2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQkvKiBRNiBvbmx5IHN1cHBvcnRzIDE2IGFzIG5vdyAqLwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5wc2V1ZF9wb3J0X2NmZ19taW5vcl92ZXJzaW9uID0KLQkJCQlBRkVfQVBJX1ZFUlNJT05fUFNFVURPX1BPUlRfQ09ORklHOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5udW1fY2hhbm5lbHMgPQotCQkJCXBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC5iaXRfd2lkdGggPSAxNjsKLQlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQuZGF0YV9mb3JtYXQgPSAwOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC50aW1pbmdfbW9kZSA9Ci0JCQkJQUZFX1BTRVVET1BPUlRfVElNSU5HX01PREVfVElNRVI7Ci0JZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LnNhbXBsZV9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogYml0X3dkWyVodV0gbnVtX2NoYW5uZWxzIFslaHVdIGZvcm1hdFslaHVdXG4iCi0JCSJ0aW1pbmcgTW9kZSAlaHUgc2FtcGxlX3JhdGUgJWRcbiIsIF9fZnVuY19fLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQuYml0X3dpZHRoLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQubnVtX2NoYW5uZWxzLAotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcucHNldWRvX3BvcnQuZGF0YV9mb3JtYXQsCi0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5wc2V1ZG9fcG9ydC50aW1pbmdfbW9kZSwKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnBzZXVkb19wb3J0LnNhbXBsZV9yYXRlKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgaHdfcGFyYW0gaXMgY2FsbGVkIG9uY2UKLSAqIFRoaXMgbWF5IG5vdCBiZSB0aGUgY2FzZSBidXQgd2hhdCB0byBkbyB3aGVuIEFETSBhbmQgQUZFCi0gKiBwb3J0IGFyZSBhbHJlYWR5IG9wZW5lZCBhbmQgcGFyYW1ldGVyIGNoYW5nZXMKLSAqLwotc3RhdGljIGludCBtc21fZGFpX3E2X2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoIChkYWktPmlkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19UWDoKLQljYXNlIFBSSU1BUllfSTJTX1JYOgotCWNhc2UgU0VDT05EQVJZX0kyU19SWDoKLQkJcmMgPSBtc21fZGFpX3E2X2NkY19od19wYXJhbXMocGFyYW1zLCBkYWksIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBNSTJTX1JYOgotCQlyYyA9IG1zbV9kYWlfcTZfaTJzX2h3X3BhcmFtcyhwYXJhbXMsIGRhaSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlicmVhazsKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQljYXNlIFNMSU1CVVNfMl9SWDoKLQljYXNlIFNMSU1CVVNfM19SWDoKLQljYXNlIFNMSU1CVVNfNF9SWDoKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQljYXNlIFNMSU1CVVNfNl9SWDoKLQljYXNlIFNMSU1CVVNfN19SWDoKLQljYXNlIFNMSU1CVVNfOF9SWDoKLQljYXNlIFNMSU1CVVNfMF9UWDoKLQljYXNlIFNMSU1CVVNfMV9UWDoKLQljYXNlIFNMSU1CVVNfMl9UWDoKLQljYXNlIFNMSU1CVVNfM19UWDoKLQljYXNlIFNMSU1CVVNfNF9UWDoKLQljYXNlIFNMSU1CVVNfNV9UWDoKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQljYXNlIFNMSU1CVVNfN19UWDoKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQkJcmMgPSBtc21fZGFpX3E2X3NsaW1fYnVzX2h3X3BhcmFtcyhwYXJhbXMsIGRhaSwKLQkJCQlzdWJzdHJlYW0tPnN0cmVhbSk7Ci0JCWJyZWFrOwotCWNhc2UgSU5UX0JUX1NDT19SWDoKLQljYXNlIElOVF9CVF9TQ09fVFg6Ci0JY2FzZSBJTlRfQlRfQTJEUF9SWDoKLQljYXNlIElOVF9GTV9SWDoKLQljYXNlIElOVF9GTV9UWDoKLQkJcmMgPSBtc21fZGFpX3E2X2J0X2ZtX2h3X3BhcmFtcyhwYXJhbXMsIGRhaSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlicmVhazsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQkJcmMgPSBtc21fZGFpX3E2X3VzYl9hdWRpb19od19wYXJhbXMocGFyYW1zLCBkYWksCi0JCQkJCQkgICAgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlicmVhazsKLQljYXNlIFJUX1BST1hZX0RBSV8wMDFfVFg6Ci0JY2FzZSBSVF9QUk9YWV9EQUlfMDAxX1JYOgotCWNhc2UgUlRfUFJPWFlfREFJXzAwMl9UWDoKLQljYXNlIFJUX1BST1hZX0RBSV8wMDJfUlg6Ci0JCXJjID0gbXNtX2RhaV9xNl9hZmVfcnRwcm94eV9od19wYXJhbXMocGFyYW1zLCBkYWkpOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOgotCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgotCQlyYyA9IG1zbV9kYWlfcTZfcHNldWRvX3BvcnRfaHdfcGFyYW1zKHBhcmFtcywKLQkJCQkJCWRhaSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiaW52YWxpZCBBRkUgcG9ydCBJRCAweCV4XG4iLCBkYWktPmlkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9kYWlfcTZfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcHJfZGVidWcoIiVzOiBzdG9wIHBzZXVkbyBwb3J0OiVkXG4iLCBfX2Z1bmNfXywgIGRhaS0+aWQpOwotCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCi0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7Ci0JCXByX2RlYnVnKCIlczogZGFpX2RhdGEtPnN0YXR1c19tYXNrID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJCSpkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCQljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9jZGNfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCi0Jc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgewotCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy53c19zcmMgPSAxOyAvKiBDUFUgaXMgbWFzdGVyICovCi0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy53c19zcmMgPSAwOyAvKiBDUFUgaXMgc2xhdmUgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZm10IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCi17Ci0JaW50IHJjID0gMDsKLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogaWQgPSAlZCBmbXRbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCQlkYWktPmlkLCBmbXQpOwotCXN3aXRjaCAoZGFpLT5pZCkgewotCWNhc2UgUFJJTUFSWV9JMlNfVFg6Ci0JY2FzZSBQUklNQVJZX0kyU19SWDoKLQljYXNlIE1JMlNfUlg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1JYOgotCQlyYyA9IG1zbV9kYWlfcTZfY2RjX3NldF9mbXQoZGFpLCBmbXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiaW52YWxpZCBjcHVfZGFpIGlkIDB4JXhcbiIsIGRhaS0+aWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQl1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCi0JCQkJdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCXVuc2lnbmVkIGludCBpID0gMDsKLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogaWQgPSAlZFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOwotCXN3aXRjaCAoZGFpLT5pZCkgewotCWNhc2UgU0xJTUJVU18wX1JYOgotCWNhc2UgU0xJTUJVU18xX1JYOgotCWNhc2UgU0xJTUJVU18yX1JYOgotCWNhc2UgU0xJTUJVU18zX1JYOgotCWNhc2UgU0xJTUJVU180X1JYOgotCWNhc2UgU0xJTUJVU181X1JYOgotCWNhc2UgU0xJTUJVU182X1JYOgotCWNhc2UgU0xJTUJVU183X1JYOgotCWNhc2UgU0xJTUJVU184X1JYOgotCQkvKgotCQkgKiBjaGFubmVsIG51bWJlciB0byBiZSBiZXR3ZWVuIDEyOCBhbmQgMjU1LgotCQkgKiBGb3IgUlggcG9ydCB1c2UgY2hhbm5lbCBudW1iZXJzCi0JCSAqIGZyb20gMTM4IHRvIDE0NCBmb3IgcHJlLVRhaWtvCi0JCSAqIGZyb20gMTQ0IHRvIDE1OSBmb3IgVGFpa28KLQkJICovCi0JCWlmICghcnhfc2xvdCkgewotCQkJcHJfZXJyKCIlczogcnggc2xvdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyeF9udW0gPiBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQpIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgcnggbnVtICVkXG4iLCBfX2Z1bmNfXywgcnhfbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IHJ4X251bTsgaSsrKSB7Ci0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbaV0gPQotCQkJICAgIHJ4X3Nsb3RbaV07Ci0JCQlwcl9kZWJ1ZygiJXM6IGZpbmQgbnVtYmVyIG9mIGNoYW5uZWxzWyVkXSBjaFslZF1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGksIHJ4X3Nsb3RbaV0pOwotCQl9Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5zbGltX3NjaC5udW1fY2hhbm5lbHMgPSByeF9udW07Ci0JCXByX2RlYnVnKCIlczogU0xJTUJVU18lZF9SWCBjbnRbJWRdIGNoWyVkICVkXVxuIiwgX19mdW5jX18sCi0JCQkoZGFpLT5pZCAtIFNMSU1CVVNfMF9SWCkgLyAyLCByeF9udW0sCi0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMF0sCi0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMV0pOwotCi0JCWJyZWFrOwotCWNhc2UgU0xJTUJVU18wX1RYOgotCWNhc2UgU0xJTUJVU18xX1RYOgotCWNhc2UgU0xJTUJVU18yX1RYOgotCWNhc2UgU0xJTUJVU18zX1RYOgotCWNhc2UgU0xJTUJVU180X1RYOgotCWNhc2UgU0xJTUJVU181X1RYOgotCWNhc2UgU0xJTUJVU182X1RYOgotCWNhc2UgU0xJTUJVU183X1RYOgotCWNhc2UgU0xJTUJVU184X1RYOgotCQkvKgotCQkgKiBjaGFubmVsIG51bWJlciB0byBiZSBiZXR3ZWVuIDEyOCBhbmQgMjU1LgotCQkgKiBGb3IgVFggcG9ydCB1c2UgY2hhbm5lbCBudW1iZXJzCi0JCSAqIGZyb20gMTI4IHRvIDEzNyBmb3IgcHJlLVRhaWtvCi0JCSAqIGZyb20gMTI4IHRvIDE0MyBmb3IgVGFpa28KLQkJICovCi0JCWlmICghdHhfc2xvdCkgewotCQkJcHJfZXJyKCIlczogdHggc2xvdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0eF9udW0gPiBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQpIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgdHggbnVtICVkXG4iLCBfX2Z1bmNfXywgdHhfbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IHR4X251bTsgaSsrKSB7Ci0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbaV0gPQotCQkJICAgIHR4X3Nsb3RbaV07Ci0JCQlwcl9kZWJ1ZygiJXM6IGZpbmQgbnVtYmVyIG9mIGNoYW5uZWxzWyVkXSBjaFslZF1cbiIsCi0JCQkJIF9fZnVuY19fLCBpLCB0eF9zbG90W2ldKTsKLQkJfQotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2gubnVtX2NoYW5uZWxzID0gdHhfbnVtOwotCQlwcl9kZWJ1ZygiJXM6U0xJTUJVU18lZF9UWCBjbnRbJWRdIGNoWyVkICVkXVxuIiwgX19mdW5jX18sCi0JCQkoZGFpLT5pZCAtIFNMSU1CVVNfMF9UWCkgLyAyLCB0eF9udW0sCi0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMF0sCi0JCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuc2xpbV9zY2guc2hhcmVkX2NoX21hcHBpbmdbMV0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiaW52YWxpZCBjcHVfZGFpIGlkIDB4JXhcbiIsIGRhaS0+aWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1zbV9kYWlfcTZfb3BzID0gewotCS5wcmVwYXJlCT0gbXNtX2RhaV9xNl9wcmVwYXJlLAotCS5od19wYXJhbXMJPSBtc21fZGFpX3E2X2h3X3BhcmFtcywKLQkuc2h1dGRvd24JPSBtc21fZGFpX3E2X3NodXRkb3duLAotCS5zZXRfZm10CT0gbXNtX2RhaV9xNl9zZXRfZm10LAotCS5zZXRfY2hhbm5lbF9tYXAgPSBtc21fZGFpX3E2X3NldF9jaGFubmVsX21hcCwKLX07Ci0KLS8qCi0gKiBGb3Igc2luZ2xlIENQVSBEQUkgcmVnaXN0cmF0aW9uLCB0aGUgZGFpIGlkIG5lZWRzIHRvIGJlCi0gKiBzZXQgZXhwbGljaXRseSBpbiB0aGUgZGFpIHByb2JlIGFzIEFTb0MgZG9lcyBub3QgcmVhZAotICogdGhlIGNwdS0+ZHJpdmVyLT5pZCBmaWVsZCByYXRoZXIgaXQgYXNzaWducyB0aGUgZGFpIGlkCi0gKiBmcm9tIHRoZSBkZXZpY2UgbmFtZSB0aGF0IGlzIGluIHRoZSBmb3JtICVzLiVkLiBUaGlzIGRhaQotICogaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGJhY2stZW5kIEFGRSBwb3J0IGlkIGFuZCB1c2VkCi0gKiBkdXJpbmcgZGFpIHByZXBhcmUuIEZvciBtdWx0aXBsZSBkYWkgcmVnaXN0cmF0aW9uLCBpdAotICogaXMgbm90IHJlcXVpcmVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgaG93ZXZlciB0aGUgZGFpLT4KLSAqIGRyaXZlci0+aWQgZmllbGQgbXVzdCBiZSBkZWZpbmVkIGFuZCBzZXQgdG8gY29ycmVzcG9uZGluZwotICogQUZFIFBvcnQgaWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc21fZGFpX3E2X3NldF9kYWlfaWQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaWYgKCFkYWktPmRyaXZlci0+aWQpIHsKLQkJZGV2X3dhcm4oZGFpLT5kZXYsICJEQUkgZHJpdmVyIGlkIGlzIG5vdCBzZXRcbiIpOwotCQlyZXR1cm47Ci0JfQotCWRhaS0+aWQgPSBkYWktPmRyaXZlci0+aWQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9jYWxfaW5mb19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JdTE2IHBvcnRfaWQgPSAoKHN0cnVjdCBzb2NfZW51bSAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQotCWRhaV9kYXRhLT5jYWxfbW9kZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXByX2RlYnVnKCIlczogc2V0dGluZyBjYWxfbW9kZSB0byAlZFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5jYWxfbW9kZSk7Ci0JYWZlX3NldF9jYWxfbW9kZShwb3J0X2lkLCBkYWlfZGF0YS0+Y2FsX21vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9jYWxfaW5mb19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhaV9kYXRhLT5jYWxfbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NiX2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoZGFpX2RhdGEpIHsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmRhdGFfZm9ybWF0ID0gdmFsdWU7Ci0JCXByX2RlYnVnKCIlczogZm9ybWF0ID0gJWRcbiIsICBfX2Z1bmNfXywgdmFsdWUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfc2JfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQotCWlmIChkYWlfZGF0YSkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnNsaW1fc2NoLmRhdGFfZm9ybWF0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl91c2JfYXVkaW9fY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQl1MzIgdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoZGFpX2RhdGEpIHsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5kZXZfdG9rZW4gPSB2YWw7Ci0JCXByX2RlYnVnKCIlczogZGV2X3Rva2VuID0gMHgleFxuIiwgIF9fZnVuY19fLAotCQkJCSBkYWlfZGF0YS0+cG9ydF9jb25maWcudXNiX2F1ZGlvLmRldl90b2tlbik7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogZGFpX2RhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZGFpX2RhdGEpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZGV2X3Rva2VuOwotCQlwcl9kZWJ1ZygiJXM6IGRldl90b2tlbiA9IDB4JXhcbiIsICBfX2Z1bmNfXywKLQkJCQkgZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5kZXZfdG9rZW4pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3VzYl9hdWRpb19lbmRpYW5fY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JdTMyIHZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JaWYgKGRhaV9kYXRhKSB7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZW5kaWFuID0gdmFsOwotCQlwcl9kZWJ1ZygiJXM6IGVuZGlhbiA9IDB4JXhcbiIsICBfX2Z1bmNfXywKLQkJCQkgZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5lbmRpYW4pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl91c2JfYXVkaW9fZW5kaWFuX2NmZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZGFpX2RhdGEpIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy51c2JfYXVkaW8uZW5kaWFuOwotCQlwcl9kZWJ1ZygiJXM6IGVuZGlhbiA9IDB4JXhcbiIsICBfX2Z1bmNfXywKLQkJCQkgZGFpX2RhdGEtPnBvcnRfY29uZmlnLnVzYl9hdWRpby5lbmRpYW4pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgIG1zbV9kYWlfcTZfYWZlX2VuY19jZmdfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JdWluZm8tPmNvdW50ID0gc2l6ZW9mKHN0cnVjdCBhZmVfZW5jX2NvbmZpZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGRhaV9kYXRhKSB7Ci0JCWludCBmb3JtYXRfc2l6ZSA9IHNpemVvZihkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCi0JCXByX2RlYnVnKCIlczplbmNvZGVyIGNvbmZpZyBmb3IgJWQgZm9ybWF0XG4iLAotCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsCi0JCQkmZGFpX2RhdGEtPmVuY19jb25maWcuZm9ybWF0LAotCQkJZm9ybWF0X3NpemUpOwotCQlzd2l0Y2ggKGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCkgewotCQljYXNlIEVOQ19GTVRfU0JDOgotCQkJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCi0JCQkJJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc2JjX2VuY19jZmdfdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DX0ZNVF9BQUNfVjI6Ci0JCQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBmb3JtYXRfc2l6ZSwKLQkJCQkmZGFpX2RhdGEtPmVuY19jb25maWcuZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90KSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNfRk1UX0FQVFg6Ci0JCWNhc2UgRU5DX0ZNVF9BUFRYX0hEOgotCQkJbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCi0JCQkJJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fYWFjX2VuY19jZmdfdjJfdCkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IHVua25vd24gZm9ybWF0ID0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGRhaV9kYXRhKSB7Ci0JCWludCBmb3JtYXRfc2l6ZSA9IHNpemVvZihkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCi0JCW1lbXNldCgmZGFpX2RhdGEtPmVuY19jb25maWcsIDB4MCwKLQkJCXNpemVvZihzdHJ1Y3QgYWZlX2VuY19jb25maWcpKTsKLQkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKLQkJCWZvcm1hdF9zaXplKTsKLQkJcHJfZGVidWcoIiVzOiBSZWNlaXZlZCBlbmNvZGVyIGNvbmZpZyBmb3IgJWQgZm9ybWF0XG4iLAotCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCQlzd2l0Y2ggKGRhaV9kYXRhLT5lbmNfY29uZmlnLmZvcm1hdCkgewotCQljYXNlIEVOQ19GTVRfU0JDOgotCQkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5kYXRhLAotCQkJCXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc2JjX2VuY19jZmdfdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRU5DX0ZNVF9BQUNfVjI6Ci0JCQltZW1jcHkoJmRhaV9kYXRhLT5lbmNfY29uZmlnLmRhdGEsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBmb3JtYXRfc2l6ZSwKLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192Ml90KSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFTkNfRk1UX0FQVFg6Ci0JCWNhc2UgRU5DX0ZNVF9BUFRYX0hEOgotCQkJbWVtY3B5KCZkYWlfZGF0YS0+ZW5jX2NvbmZpZy5kYXRhLAotCQkJCXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhICsgZm9ybWF0X3NpemUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fY3VzdG9tX2VuY19jZmdfYXB0eF90KSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogSWdub3JlIGVuYyBjb25maWcgZm9yIHVua25vd24gZm9ybWF0ID0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBkYWlfZGF0YS0+ZW5jX2NvbmZpZy5mb3JtYXQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWZlX2lucHV0X2Noc190ZXh0W10gPSB7Ilplcm8iLCAiT25lIiwgIlR3byJ9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFmZV9pbnB1dF9jaHNfZW51bVtdID0gewotCVNPQ19FTlVNX1NJTkdMRV9FWFQoMywgYWZlX2lucHV0X2Noc190ZXh0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZmVfaW5wdXRfYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUifTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBhZmVfaW5wdXRfYml0X2Zvcm1hdF9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBhZmVfaW5wdXRfYml0X2Zvcm1hdF90ZXh0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9hZmVfaW5wdXRfY2hhbm5lbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGRhaV9kYXRhKSB7Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVsczsKLQkJcHJfZGVidWcoIiVzOmFmZSBpbnB1dCBjaGFubmVsID0gJWRcbiIsCi0JCQkgIF9fZnVuY19fLCBkYWlfZGF0YS0+YWZlX2luX2NoYW5uZWxzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9pbnB1dF9jaGFubmVsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoZGFpX2RhdGEpIHsKLQkJZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQlwcl9kZWJ1ZygiJXM6IHVwZGF0aW5nIGFmZSBpbnB1dCBjaGFubmVsIDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpX2RhdGEtPmFmZV9pbl9jaGFubmVscyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9hZmVfaW5wdXRfYml0X2Zvcm1hdF9nZXQoCi0JCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgZGFpIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGFmZSBpbnB1dCBiaXQgZm9ybWF0IDogJWxkXG4iLAotCQkgIF9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X3B1dCgKLQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQotCWlmICghZGFpX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBkYWkgZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMToKLQkJZGFpX2RhdGEtPmFmZV9pbl9iaXRmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWRlZmF1bHQ6Ci0JCWRhaV9kYXRhLT5hZmVfaW5fYml0Zm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHVwZGF0aW5nIGFmZSBpbnB1dCBiaXQgZm9ybWF0IDogJWRcbiIsCi0JCV9fZnVuY19fLCBkYWlfZGF0YS0+YWZlX2luX2JpdGZvcm1hdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWZlX2VuY19jb25maWdfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8Ci0JCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUpLAotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lID0gIlNMSU1fN19SWCBFbmNvZGVyIENvbmZpZyIsCi0JCS5pbmZvID0gbXNtX2RhaV9xNl9hZmVfZW5jX2NmZ19pbmZvLAotCQkuZ2V0ID0gbXNtX2RhaV9xNl9hZmVfZW5jX2NmZ19nZXQsCi0JCS5wdXQgPSBtc21fZGFpX3E2X2FmZV9lbmNfY2ZnX3B1dCwKLQl9LAotCVNPQ19FTlVNX0VYVCgiQUZFIElucHV0IENoYW5uZWxzIiwgYWZlX2lucHV0X2Noc19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfYWZlX2lucHV0X2NoYW5uZWxfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfYWZlX2lucHV0X2NoYW5uZWxfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkFGRSBJbnB1dCBCaXQgRm9ybWF0IiwgYWZlX2lucHV0X2JpdF9mb3JtYXRfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X2FmZV9pbnB1dF9iaXRfZm9ybWF0X3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfc2xpbV9yeF9kcmlmdF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFUzsKLQl1aW5mby0+Y291bnQgPSBzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZfdGltaW5nX3N0YXRzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfc2xpbV9yeF9kcmlmdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfZGV2X3RpbWluZ19zdGF0cyB0aW1pbmdfc3RhdHM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcHJfZXJyKCIlczogYWZlIHBvcnQgbm90IHN0YXJ0ZWQuIGRhaV9kYXRhLT5zdGF0dXNfbWFzayA9ICVsZFxuIiwKLQkJCV9fZnVuY19fLCAqZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQkJZ290byBkb25lOwotCX0KLQotCW1lbXNldCgmdGltaW5nX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9kZXZfdGltaW5nX3N0YXRzKSk7Ci0JcmV0ID0gYWZlX2dldF9hdl9kZXZfZHJpZnQoJnRpbWluZ19zdGF0cywgZGFpLT5pZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciBnZXR0aW5nIEFGRSBEcmlmdCBmb3IgcG9ydCAlZCwgZXJyPSVkXG4iLAotCQkJX19mdW5jX18sIGRhaS0+aWQsIHJldCk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCW1lbWNweSh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwgKHZvaWQgKikmdGltaW5nX3N0YXRzLAotCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcGFyYW1faWRfZGV2X3RpbWluZ19zdGF0cykpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFmZV9jYWxfbW9kZV90ZXh0W10gPSB7Ci0JIkNBTF9NT0RFX0RFRkFVTFQiLCAiQ0FMX01PREVfTk9ORSIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2xpbV8yX3J4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShTTElNQlVTXzJfUlgsIDAsIEFSUkFZX1NJWkUoYWZlX2NhbF9tb2RlX3RleHQpLAotCQkJYWZlX2NhbF9tb2RlX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIHJ0X3Byb3h5XzFfcnhfZW51bSA9Ci0JU09DX0VOVU1fU0lOR0xFKFJUX1BST1hZX1BPUlRfMDAxX1JYLCAwLCBBUlJBWV9TSVpFKGFmZV9jYWxfbW9kZV90ZXh0KSwKLQkJCWFmZV9jYWxfbW9kZV90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBydF9wcm94eV8xX3R4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRShSVF9QUk9YWV9QT1JUXzAwMV9UWCwgMCwgQVJSQVlfU0laRShhZmVfY2FsX21vZGVfdGV4dCksCi0JCQlhZmVfY2FsX21vZGVfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYl9jb25maWdfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNF9UWCBGb3JtYXQiLCBzYl9jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X3NiX2Zvcm1hdF9nZXQsCi0JCSAgICAgbXNtX2RhaV9xNl9zYl9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBTZXRDYWxNb2RlIiwgc2xpbV8yX3J4X2VudW0sCi0JCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19nZXQsCi0JCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIEZvcm1hdCIsIHNiX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfc2JfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X3NiX2Zvcm1hdF9wdXQpCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnRfcHJveHlfY29uZmlnX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJSVF9QUk9YWV8xX1JYIFNldENhbE1vZGUiLCBydF9wcm94eV8xX3J4X2VudW0sCi0JCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19nZXQsCi0JCSAgICAgbXNtX2RhaV9xNl9jYWxfaW5mb19wdXQpLAotCVNPQ19FTlVNX0VYVCgiUlRfUFJPWFlfMV9UWCBTZXRDYWxNb2RlIiwgcnRfcHJveHlfMV90eF9lbnVtLAotCQkgICAgIG1zbV9kYWlfcTZfY2FsX2luZm9fZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfY2FsX2luZm9fcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1c2JfYXVkaW9fY2ZnX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19SWCBkZXZfdG9rZW4iLCAwLCAwLCBVSU5UX01BWCwgMCwKLQkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19nZXQsCi0JCQltc21fZGFpX3E2X3VzYl9hdWRpb19jZmdfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1JYIGVuZGlhbiIsIDAsIDAsIDEsIDAsCi0JCQltc21fZGFpX3E2X3VzYl9hdWRpb19lbmRpYW5fY2ZnX2dldCwKLQkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2VuZGlhbl9jZmdfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIGRldl90b2tlbiIsIDAsIDAsIFVJTlRfTUFYLCAwLAotCQkJbXNtX2RhaV9xNl91c2JfYXVkaW9fY2ZnX2dldCwKLQkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2NmZ19wdXQpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFggZW5kaWFuIiwgMCwgMCwgMSwgMCwKLQkJCW1zbV9kYWlfcTZfdXNiX2F1ZGlvX2VuZGlhbl9jZmdfZ2V0LAotCQkJbXNtX2RhaV9xNl91c2JfYXVkaW9fZW5kaWFuX2NmZ19wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGF2ZF9kcmlmdF9jb25maWdfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfUENNLAotCQkubmFtZQk9ICJTTElNQlVTXzBfUlggRFJJRlQiLAotCQkuaW5mbwk9IG1zbV9kYWlfcTZfc2xpbV9yeF9kcmlmdF9pbmZvLAotCQkuZ2V0CT0gbXNtX2RhaV9xNl9zbGltX3J4X2RyaWZ0X2dldCwKLQl9LAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCi0JCS5uYW1lCT0gIlNMSU1CVVNfNl9SWCBEUklGVCIsCi0JCS5pbmZvCT0gbXNtX2RhaV9xNl9zbGltX3J4X2RyaWZ0X2luZm8sCi0JCS5nZXQJPSBtc21fZGFpX3E2X3NsaW1fcnhfZHJpZnRfZ2V0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKLQkJLm5hbWUJPSAiU0xJTUJVU183X1JYIERSSUZUIiwKLQkJLmluZm8JPSBtc21fZGFpX3E2X3NsaW1fcnhfZHJpZnRfaW5mbywKLQkJLmdldAk9IG1zbV9kYWlfcTZfc2xpbV9yeF9kcmlmdF9nZXQsCi0JfSwKLX07Ci1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkYWkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgZGFpXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIWRhaS0+ZGV2KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIGRhaSBkZXZcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGFpX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkYWlfZGF0YSkKLQkJcmMgPSAtRU5PTUVNOwotCWVsc2UKLQkJZGV2X3NldF9kcnZkYXRhKGRhaS0+ZGV2LCBkYWlfZGF0YSk7Ci0KLQltc21fZGFpX3E2X3NldF9kYWlfaWQoZGFpKTsKLQotCXN3aXRjaCAoZGFpLT5pZCkgewotCWNhc2UgU0xJTUJVU180X1RYOgotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKCZzYl9jb25maWdfY29udHJvbHNbMF0sCi0JCQkJIGRhaV9kYXRhKSk7Ci0JCWJyZWFrOwotCWNhc2UgU0xJTUJVU18yX1JYOgotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKCZzYl9jb25maWdfY29udHJvbHNbMV0sCi0JCQkJIGRhaV9kYXRhKSk7Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBzbmRfY3RsX25ldzEoJnNiX2NvbmZpZ19jb250cm9sc1syXSwKLQkJCQkgZGFpX2RhdGEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTElNQlVTXzdfUlg6Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBzbmRfY3RsX25ldzEoJmFmZV9lbmNfY29uZmlnX2NvbnRyb2xzWzBdLAotCQkJCSBkYWlfZGF0YSkpOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKCZhZmVfZW5jX2NvbmZpZ19jb250cm9sc1sxXSwKLQkJCQkgZGFpX2RhdGEpKTsKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJIHNuZF9jdGxfbmV3MSgmYWZlX2VuY19jb25maWdfY29udHJvbHNbMl0sCi0JCQkJIGRhaV9kYXRhKSk7Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCXNuZF9jdGxfbmV3MSgmYXZkX2RyaWZ0X2NvbmZpZ19jb250cm9sc1syXSwKLQkJCQkJZGFpKSk7Ci0JCWJyZWFrOwotCWNhc2UgUlRfUFJPWFlfREFJXzAwMV9SWDoKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJIHNuZF9jdGxfbmV3MSgmcnRfcHJveHlfY29uZmlnX2NvbnRyb2xzWzBdLAotCQkJCSBkYWlfZGF0YSkpOwotCQlicmVhazsKLQljYXNlIFJUX1BST1hZX0RBSV8wMDFfVFg6Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBzbmRfY3RsX25ldzEoJnJ0X3Byb3h5X2NvbmZpZ19jb250cm9sc1sxXSwKLQkJCQkgZGFpX2RhdGEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBzbmRfY3RsX25ldzEoJnVzYl9hdWRpb19jZmdfY29udHJvbHNbMF0sCi0JCQkJIGRhaV9kYXRhKSk7Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBzbmRfY3RsX25ldzEoJnVzYl9hdWRpb19jZmdfY29udHJvbHNbMV0sCi0JCQkJIGRhaV9kYXRhKSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1RYOgotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKCZ1c2JfYXVkaW9fY2ZnX2NvbnRyb2xzWzJdLAotCQkJCSBkYWlfZGF0YSkpOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgc25kX2N0bF9uZXcxKCZ1c2JfYXVkaW9fY2ZnX2NvbnRyb2xzWzNdLAotCQkJCSBkYWlfZGF0YSkpOwotCQlicmVhazsKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJc25kX2N0bF9uZXcxKCZhdmRfZHJpZnRfY29uZmlnX2NvbnRyb2xzWzBdLAotCQkJCQlkYWkpKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTElNQlVTXzZfUlg6Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCXNuZF9jdGxfbmV3MSgmYXZkX2RyaWZ0X2NvbmZpZ19jb250cm9sc1sxXSwKLQkJCQkJZGFpKSk7Ci0JCWJyZWFrOwotCX0KLQlpZiAocmMgPCAwKQotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGVyciBhZGQgY29uZmlnIGN0bCwgREFJID0gJXNcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKLQotCXJjID0gbXNtX2RhaV9xNl9kYWlfYWRkX3JvdXRlKGRhaSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGE7Ci0JaW50IHJjOwotCi0JZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCi0JLyogSWYgQUZFIHBvcnQgaXMgc3RpbGwgdXAsIGNsb3NlIGl0ICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcHJfZGVidWcoIiVzOiBzdG9wIHBzZXVkbyBwb3J0OiVkXG4iLCBfX2Z1bmNfXywgIGRhaS0+aWQpOwotCQlyYyA9IGFmZV9jbG9zZShkYWktPmlkKTsgLyogY2FuIGJsb2NrICovCi0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7Ci0JCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCX0KLQlrZnJlZShkYWlfZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9hZmVfcnhfZGFpW10gPSB7Ci0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQQ01fUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBSVF9QUk9YWV9EQUlfMDAxX1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJIC5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgUlgiLAotCQkJIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkgLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCQkgLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkgLmNoYW5uZWxzX21heCA9IDIsCi0JCQkgLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkgLnJhdGVfbWF4ID0JNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFJUX1BST1hZX0RBSV8wMDJfUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2FmZV90eF9kYWlbXSA9IHsKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkFGRSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQQ01fVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9CTQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBSVF9QUk9YWV9EQUlfMDAyX1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQUZFLVBST1hZIFRYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPQk0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gUlRfUFJPWFlfREFJXzAwMV9UWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfYnRfc2NvX3J4X2RhaSA9IHsKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBCVC1TQ08gUGxheWJhY2siLAotCQkuYWlmX25hbWUgPSAiSU5UX0JUX1NDT19SWCIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSAxLAotCQkucmF0ZV9tYXggPSAxNjAwMCwKLQkJLnJhdGVfbWluID0gODAwMCwKLQl9LAotCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JLmlkID0gSU5UX0JUX1NDT19SWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9idF9hMmRwX3J4X2RhaSA9IHsKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBCVC1BMkRQIFBsYXliYWNrIiwKLQkJLmFpZl9uYW1lID0gIklOVF9CVF9BMkRQX1JYIiwKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5jaGFubmVsc19taW4gPSAxLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCS5yYXRlX21pbiA9IDQ4MDAwLAotCX0sCi0JLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkuaWQgPSBJTlRfQlRfQTJEUF9SWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9idF9zY29fdHhfZGFpID0gewotCS5jYXB0dXJlID0gewotCQkuc3RyZWFtX25hbWUgPSAiSW50ZXJuYWwgQlQtU0NPIENhcHR1cmUiLAotCQkuYWlmX25hbWUgPSAiSU5UX0JUX1NDT19UWCIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSAxLAotCQkucmF0ZV9tYXggPSAxNjAwMCwKLQkJLnJhdGVfbWluID0gODAwMCwKLQl9LAotCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JLmlkID0gSU5UX0JUX1NDT19UWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9mbV9yeF9kYWkgPSB7Ci0JLnBsYXliYWNrID0gewotCQkuc3RyZWFtX25hbWUgPSAiSW50ZXJuYWwgRk0gUGxheWJhY2siLAotCQkuYWlmX25hbWUgPSAiSU5UX0ZNX1JYIiwKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5jaGFubmVsc19taW4gPSAyLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCS5yYXRlX21pbiA9IDgwMDAsCi0JfSwKLQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCS5pZCA9IElOVF9GTV9SWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9mbV90eF9kYWkgPSB7Ci0JLmNhcHR1cmUgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJJbnRlcm5hbCBGTSBDYXB0dXJlIiwKLQkJLmFpZl9uYW1lID0gIklOVF9GTV9UWCIsCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlX21heCA9IDQ4MDAwLAotCQkucmF0ZV9taW4gPSA4MDAwLAotCX0sCi0JLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkuaWQgPSBJTlRfRk1fVFgsCi0JLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaVtdID0gewotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIEZhcmVuZCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVk9JQ0VfUExBWUJBQ0tfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBWT0lDRV9QTEFZQkFDS19UWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgRmFyZW5kIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJWT0lDRTJfUExBWUJBQ0tfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBWT0lDRTJfUExBWUJBQ0tfVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpW10gPSB7Ci0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBVcGxpbmsgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiSU5DQUxMX1JFQ09SRF9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBWT0lDRV9SRUNPUkRfVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJJTkNBTExfUkVDT1JEX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFZPSUNFX1JFQ09SRF9SWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfcTZfdXNiX3J4X2RhaSA9IHsKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gUGxheWJhY2siLAotCQkuYWlmX25hbWUgPSAiVVNCX0FVRElPX1JYIiwKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8Ci0JCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV8zODQwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSA4LAotCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCS5yYXRlX21pbiA9IDgwMDAsCi0JfSwKLQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCS5pZCA9IEFGRV9QT1JUX0lEX1VTQl9SWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl91c2JfdHhfZGFpID0gewotCS5jYXB0dXJlID0gewotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAotCQkuYWlmX25hbWUgPSAiVVNCX0FVRElPX1RYIiwKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzg4MjAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8Ci0JCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwIHwKLQkJCSBTTkRSVl9QQ01fUkFURV8zODQwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSA4LAotCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCS5yYXRlX21pbiA9IDgwMDAsCi0JfSwKLQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCS5pZCA9IEFGRV9QT1JUX0lEX1VTQl9UWCwKLQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBtc21fYXV4cGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqZGFpX2RhdGE7Ci0Jc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhICphdXhwY21fcGRhdGE7Ci0JdWludDMyX3QgdmFsX2FycmF5W1JBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTXTsKLQl1aW50MzJfdCB2YWwgPSAwOwotCWNvbnN0IGNoYXIgKmludGZfbmFtZTsKLQlpbnQgcmMgPSAwLCBpID0gMCwgbGVuID0gMDsKLQljb25zdCB1aW50MzJfdCAqc2xvdF9tYXBwaW5nX2FycmF5ID0gTlVMTDsKLQl1MzIgYXJyYXlfbGVuZ3RoID0gMDsKLQotCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfYXV4cGNtX2RhaV9kYXRhKSwKLQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghZGFpX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXV4cGNtX3BkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfYXV4cGNtX3BkYXRhKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQotCWlmICghYXV4cGNtX3BkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBsYXRmb3JtIGRhdGFcbiIpOwotCQlnb3RvIGZhaWxfcGRhdGFfbm9tZW07Ci0JfQotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiAlcEssIGRhaV9kYXRhICVwSywgYXV4cGNtX3BkYXRhICVwS1xuIiwKLQkJX19mdW5jX18sICZwZGV2LT5kZXYsIGRhaV9kYXRhLCBhdXhwY21fcGRhdGEpOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLW1vZGUiLAotCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLW1vZGUgbWlzc2luZyBpbiBEVCBub2RlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKLQl9Ci0JYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm1vZGUgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOwotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubW9kZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXN5bmMiLAotCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLXN5bmMgbWlzc2luZyBpbiBEVCBub2RlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKLQl9Ci0JYXV4cGNtX3BkYXRhLT5tb2RlXzhrLnN5bmMgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOwotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc3luYyA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLWZyYW1lIiwKLQkJCXZhbF9hcnJheSwgUkFURV9NQVhfTlVNX09GX0FVWF9QQ01fUkFURVMpOwotCi0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLWZyYW1lIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBmYWlsX2ludmFsaWRfZHQ7Ci0JfQotCWF1eHBjbV9wZGF0YS0+bW9kZV84ay5mcmFtZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfOEtIWl07Ci0JYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5mcmFtZSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXF1YW50IiwKLQkJCXZhbF9hcnJheSwgUkFURV9NQVhfTlVNX09GX0FVWF9QQ01fUkFURVMpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1xdWFudCBtaXNzaW5nIGluIERUIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2R0OwotCX0KLQlhdXhwY21fcGRhdGEtPm1vZGVfOGsucXVhbnQgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOwotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucXVhbnQgPSAodTE2KXZhbF9hcnJheVtSQVRFXzE2S0haXTsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1udW0tc2xvdHMiLAotCQkJdmFsX2FycmF5LCBSQVRFX01BWF9OVU1fT0ZfQVVYX1BDTV9SQVRFUyk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLW51bS1zbG90cyBtaXNzaW5nIGluIERUIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2R0OwotCX0KLQlhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzID0gKHUxNil2YWxfYXJyYXlbUkFURV84S0haXTsKLQotCWlmIChhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzID4KLQkgICAgbXNtX2RhaV9xNl9tYXhfbnVtX3Nsb3QoYXV4cGNtX3BkYXRhLT5tb2RlXzhrLmZyYW1lKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBNYXggc2xvdHMgJWQgZ3JlYXRlciB0aGFuIERUIG5vZGUgJWRcbiIsCi0JCQkgX19mdW5jX18sCi0JCQltc21fZGFpX3E2X21heF9udW1fc2xvdChhdXhwY21fcGRhdGEtPm1vZGVfOGsuZnJhbWUpLAotCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm51bV9zbG90cyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2ludmFsaWRfZHQ7Ci0JfQotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzID0gKHUxNil2YWxfYXJyYXlbUkFURV8xNktIWl07Ci0KLQlpZiAoYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMgPgotCSAgICBtc21fZGFpX3E2X21heF9udW1fc2xvdChhdXhwY21fcGRhdGEtPm1vZGVfMTZrLmZyYW1lKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBNYXggc2xvdHMgJWQgZ3JlYXRlciB0aGFuIERUIG5vZGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCW1zbV9kYWlfcTZfbWF4X251bV9zbG90KGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuZnJhbWUpLAotCQkJYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2R0OwotCX0KLQotCXNsb3RfbWFwcGluZ19hcnJheSA9IG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkicWNvbSxtc20tY3B1ZGFpLWF1eHBjbS1zbG90LW1hcHBpbmciLCAmbGVuKTsKLQotCWlmIChzbG90X21hcHBpbmdfYXJyYXkgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBzbG90X21hcHBpbmdfYXJyYXkgaXMgbm90IHZhbGlkXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2R0OwotCX0KLQotCWFycmF5X2xlbmd0aCA9IGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMgKwotCQkgICAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHM7Ci0KLQlpZiAobGVuICE9IHNpemVvZih1aW50MzJfdCkgKiBhcnJheV9sZW5ndGgpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgTGVuZ3RoIGlzICVkIGFuZCBleHBlY3RlZCBpcyAlemRcbiIsCi0JCQlfX2Z1bmNfXywgbGVuLCBzaXplb2YodWludDMyX3QpICogYXJyYXlfbGVuZ3RoKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKLQl9Ci0KLQlhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nID0KLQkJCQkJa3phbGxvYyhzaXplb2YodWludDE2X3QpICoKLQkJCQkJICAgIGF1eHBjbV9wZGF0YS0+bW9kZV84ay5udW1fc2xvdHMsCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWF1eHBjbV9wZGF0YS0+bW9kZV84ay5zbG90X21hcHBpbmcpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgTm8gbWVtIGZvciBtb2RlXzhrIHNsb3QgbWFwcGluZ1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfaW52YWxpZF9kdDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYXV4cGNtX3BkYXRhLT5tb2RlXzhrLm51bV9zbG90czsgaSsrKQotCQlhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nW2ldID0KLQkJCQkodTE2KWJlMzJfdG9fY3B1KHNsb3RfbWFwcGluZ19hcnJheVtpXSk7Ci0KLQlhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZyA9Ci0JCQkJCWt6YWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCi0JCQkJCSAgICAgYXV4cGNtX3BkYXRhLT5tb2RlXzE2ay5udW1fc2xvdHMsCi0JCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc2xvdF9tYXBwaW5nKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIE5vIG1lbSBmb3IgbW9kZV8xNmsgc2xvdCBtYXBwaW5nXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9pbnZhbGlkXzE2a19zbG90X21hcHBpbmc7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGF1eHBjbV9wZGF0YS0+bW9kZV8xNmsubnVtX3Nsb3RzOyBpKyspCi0JCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuc2xvdF9tYXBwaW5nW2ldID0KLQkJCSh1MTYpYmUzMl90b19jcHUoc2xvdF9tYXBwaW5nX2FycmF5W2kgKwotCQkJCQlhdXhwY21fcGRhdGEtPm1vZGVfOGsubnVtX3Nsb3RzXSk7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sbXNtLWNwdWRhaS1hdXhwY20tZGF0YSIsCi0JCQl2YWxfYXJyYXksIFJBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHFjb20sbXNtLWNwdWRhaS1hdXhwY20tZGF0YSBtaXNzaW5nIGluIERUIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2R0MTsKLQl9Ci0JYXV4cGNtX3BkYXRhLT5tb2RlXzhrLmRhdGEgPSAodTE2KXZhbF9hcnJheVtSQVRFXzhLSFpdOwotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsuZGF0YSA9ICh1MTYpdmFsX2FycmF5W1JBVEVfMTZLSFpdOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktYXV4cGNtLXBjbS1jbGstcmF0ZSIsCi0JCQl2YWxfYXJyYXksIFJBVEVfTUFYX05VTV9PRl9BVVhfUENNX1JBVEVTKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBxY29tLG1zbS1jcHVkYWktYXV4cGNtLXBjbS1jbGstcmF0ZSBtaXNzaW5nIGluIERUXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGZhaWxfaW52YWxpZF9kdDE7Ci0JfQotCWF1eHBjbV9wZGF0YS0+bW9kZV84ay5wY21fY2xrX3JhdGUgPSAoaW50KXZhbF9hcnJheVtSQVRFXzhLSFpdOwotCWF1eHBjbV9wZGF0YS0+bW9kZV8xNmsucGNtX2Nsa19yYXRlID0gKGludCl2YWxfYXJyYXlbUkFURV8xNktIWl07Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sbXNtLWF1eHBjbS1pbnRlcmZhY2UiLCAmaW50Zl9uYW1lKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBxY29tLG1zbS1hdXhwY20taW50ZXJmYWNlIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBmYWlsX25vZGV2X2ludGY7Ci0JfQotCi0JaWYgKCFzdHJjbXAoaW50Zl9uYW1lLCAicHJpbWFyeSIpKSB7Ci0JCWRhaV9kYXRhLT5yeF9waWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDsKLQkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOwotCQlwZGV2LT5pZCA9IE1TTV9EQUlfUFJJX0FVWFBDTV9EVF9ERVZfSUQ7Ci0JCWkgPSAwOwotCX0gZWxzZSBpZiAoIXN0cmNtcChpbnRmX25hbWUsICJzZWNvbmRhcnkiKSkgewotCQlkYWlfZGF0YS0+cnhfcGlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDsKLQkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg7Ci0JCXBkZXYtPmlkID0gTVNNX0RBSV9TRUNfQVVYUENNX0RUX0RFVl9JRDsKLQkJaSA9IDE7Ci0JfSBlbHNlIGlmICghc3RyY21wKGludGZfbmFtZSwgInRlcnRpYXJ5IikpIHsKLQkJZGFpX2RhdGEtPnJ4X3BpZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDsKLQkJZGFpX2RhdGEtPnR4X3BpZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDsKLQkJcGRldi0+aWQgPSBNU01fREFJX1RFUlRfQVVYUENNX0RUX0RFVl9JRDsKLQkJaSA9IDI7Ci0JfSBlbHNlIGlmICghc3RyY21wKGludGZfbmFtZSwgInF1YXRlcm5hcnkiKSkgewotCQlkYWlfZGF0YS0+cnhfcGlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg7Ci0JCWRhaV9kYXRhLT50eF9waWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDsKLQkJcGRldi0+aWQgPSBNU01fREFJX1FVQVRfQVVYUENNX0RUX0RFVl9JRDsKLQkJaSA9IDM7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGludmFsaWQgRFQgaW50ZiBuYW1lICVzXG4iLAotCQkJX19mdW5jX18sIGludGZfbmFtZSk7Ci0JCWdvdG8gZmFpbF9pbnZhbGlkX2ludGY7Ci0JfQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJICAicWNvbSxtc20tY3B1ZGFpLWFmZS1jbGstdmVyIiwgJnZhbCk7Ci0JaWYgKHJjKQotCQlkYWlfZGF0YS0+YWZlX2Nsa192ZXIgPSBBRkVfQ0xLX1ZFUlNJT05fVjE7Ci0JZWxzZQotCQlkYWlfZGF0YS0+YWZlX2Nsa192ZXIgPSB2YWw7Ci0KLQltdXRleF9pbml0KCZkYWlfZGF0YS0+cmxvY2spOwotCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzXG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGFpX2RhdGEpOwotCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikgYXV4cGNtX3BkYXRhOwotCi0JcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfcTZfYXV4X3BjbV9kYWlfY29tcG9uZW50LAotCQkJJm1zbV9kYWlfcTZfYXV4X3BjbV9kYWlbaV0sIDEpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogYXV4cGNtIGRhaSByZWcgZmFpbGVkLCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWxfcmVnX2RhaTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci0KLWZhaWxfcmVnX2RhaToKLWZhaWxfaW52YWxpZF9pbnRmOgotZmFpbF9ub2Rldl9pbnRmOgotZmFpbF9pbnZhbGlkX2R0MToKLQlrZnJlZShhdXhwY21fcGRhdGEtPm1vZGVfMTZrLnNsb3RfbWFwcGluZyk7Ci1mYWlsX2ludmFsaWRfMTZrX3Nsb3RfbWFwcGluZzoKLQlrZnJlZShhdXhwY21fcGRhdGEtPm1vZGVfOGsuc2xvdF9tYXBwaW5nKTsKLWZhaWxfaW52YWxpZF9kdDoKLQlrZnJlZShhdXhwY21fcGRhdGEpOwotZmFpbF9wZGF0YV9ub21lbToKLQlrZnJlZShkYWlfZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9hdXhwY21fZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fZGFpX3E2X2F1eHBjbV9kYWlfZGF0YSAqZGFpX2RhdGE7Ci0KLQlkYWlfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7Ci0KLQltdXRleF9kZXN0cm95KCZkYWlfZGF0YS0+cmxvY2spOwotCWtmcmVlKGRhaV9kYXRhKTsKLQlrZnJlZShwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2F1eHBjbV9kZXZfZHRfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWF1eHBjbS1kZXYiLCB9LAotCXt9Ci19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9hdXhwY21fZGV2X2RyaXZlciA9IHsKLQkucHJvYmUgID0gbXNtX2F1eHBjbV9kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9hdXhwY21fZGV2X3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tYXV4cGNtLWRldiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fYXV4cGNtX2Rldl9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9xNl9zbGltYnVzX3J4X2RhaVtdID0gewotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMF9SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU18wX1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzFfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfMV9SWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU18yX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzJfUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfM19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU18zX1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzRfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfNF9SWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU182X1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzZfUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czUgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfNV9SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzM4NDAwMCwKLQkJCS5mb3JtYXRzID0gREFJX0ZPUk1BVFNfUzE2X1MyNF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU181X1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzdfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8zODQwMDAsCi0JCQkuZm9ybWF0cyA9IERBSV9GT1JNQVRTX1MxNl9TMjRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzODQwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfN19SWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzOCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU184X1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCQkJLmZvcm1hdHMgPSBEQUlfRk9STUFUU19TMTZfUzI0X1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzg0MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzhfUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X3NsaW1idXNfdHhfZGFpW10gPSB7Ci0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMF9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfMF9UWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMV9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfMV9UWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfMl9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzJfVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJCS5jaGFubmVsc19tYXggPSA0LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU18zX1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU180X1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAyLAotCQkJLmNoYW5uZWxzX21heCA9IDQsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzRfVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTTElNQlVTXzVfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU181X1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czYgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU182X1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAxOTIwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9vcHMsCi0JCS5pZCA9IFNMSU1CVVNfNl9UWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNMSU1CVVNfN19UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X29wcywKLQkJLmlkID0gU0xJTUJVU183X1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czggQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0xJTUJVU184X1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMTkyMDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfb3BzLAotCQkuaWQgPSBTTElNQlVTXzhfVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmRhdGFfZm9ybWF0ID0gdmFsdWU7Ci0JcHJfZGVidWcoIiVzOiB2YWx1ZSA9ICVkLCBjaGFubmVsID0gJWQsIGxpbmUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCB2YWx1ZSwgZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5tb25vX3N0ZXJlbywKLQkJIGRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmRhdGFfZm9ybWF0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc192aV9mZWVkX21vbm9fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlkYWlfZGF0YS0+dmlfZmVlZF9tb25vID0gdmFsdWU7Ci0JcHJfZGVidWcoIiVzOiB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc192aV9mZWVkX21vbm9fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGRhaV9kYXRhLT52aV9mZWVkX21vbm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaTJzX2NvbmZpZ19jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiUFJJIE1JMlMgUlggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUMgTUkyUyBSWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlQgTUkyUyBSWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVQgTUkyUyBSWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVSU4gTUkyUyBSWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSSBNSTJTIFRYIEZvcm1hdCIsIG1pMnNfY29uZmlnX2VudW1bMF0sCi0JCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9nZXQsCi0JCSAgICAgbXNtX2RhaV9xNl9taTJzX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDIE1JMlMgVFggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUIE1JMlMgVFggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUIE1JMlMgVFggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUlOIE1JMlMgVFggRm9ybWF0IiwgbWkyc19jb25maWdfZW51bVswXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRU5BUlkgTUkyUyBUWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDUgTUkyUyBUWCBGb3JtYXQiLCBtaTJzX2NvbmZpZ19lbnVtWzBdLAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfZ2V0LAotCQkgICAgIG1zbV9kYWlfcTZfbWkyc19mb3JtYXRfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaTJzX3ZpX2ZlZWRfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIklOVDUgTUkyUyBWSSBNT05PIiwgbWkyc19jb25maWdfZW51bVsxXSwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfdmlfZmVlZF9tb25vX2dldCwKLQkJICAgICBtc21fZGFpX3E2X21pMnNfdmlfZmVlZF9tb25vX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9Ci0JCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCXN0cnVjdCBtc21fbWkyc19wZGF0YSAqbWkyc19wZGF0YSA9Ci0JCQkoc3RydWN0IG1zbV9taTJzX3BkYXRhICopIGRhaS0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjdHJsID0gTlVMTDsKLQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqdmlfZmVlZF9jdHJsID0gTlVMTDsKLQotCWRhaS0+aWQgPSBtaTJzX3BkYXRhLT5pbnRmX2lkOwotCi0JaWYgKG1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUpIHsKLQkJaWYgKGRhaS0+aWQgPT0gTVNNX1BSSU1fTUkyUykKLQkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbMF07Ci0JCWlmIChkYWktPmlkID09IE1TTV9TRUNfTUkyUykKLQkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbMV07Ci0JCWlmIChkYWktPmlkID09IE1TTV9URVJUX01JMlMpCi0JCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzJdOwotCQlpZiAoZGFpLT5pZCA9PSBNU01fUVVBVF9NSTJTKQotCQkJY3RybCA9ICZtaTJzX2NvbmZpZ19jb250cm9sc1szXTsKLQkJaWYgKGRhaS0+aWQgPT0gTVNNX1FVSU5fTUkyUykKLQkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbNF07Ci0JfQotCi0JaWYgKGN0cmwpIHsKLQkJa2NvbnRyb2wgPSBzbmRfY3RsX25ldzEoY3RybCwKLQkJCQkJJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhKTsKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsIGtjb250cm9sKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBlcnIgYWRkIFJYIGZtdCBjdGwgREFJID0gJXNcbiIsCi0JCQkJX19mdW5jX18sIGRhaS0+bmFtZSk7Ci0JCQlnb3RvIHJ0bjsKLQkJfQotCX0KLQotCWN0cmwgPSBOVUxMOwotCWlmIChtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlKSB7Ci0JCWlmIChkYWktPmlkID09IE1TTV9QUklNX01JMlMpCi0JCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzRdOwotCQlpZiAoZGFpLT5pZCA9PSBNU01fU0VDX01JMlMpCi0JCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzVdOwotCQlpZiAoZGFpLT5pZCA9PSBNU01fVEVSVF9NSTJTKQotCQkJY3RybCA9ICZtaTJzX2NvbmZpZ19jb250cm9sc1s2XTsKLQkJaWYgKGRhaS0+aWQgPT0gTVNNX1FVQVRfTUkyUykKLQkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbN107Ci0JCWlmIChkYWktPmlkID09IE1TTV9RVUlOX01JMlMpCi0JCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzldOwotCQlpZiAoZGFpLT5pZCA9PSBNU01fU0VOQVJZX01JMlMpCi0JCQljdHJsID0gJm1pMnNfY29uZmlnX2NvbnRyb2xzWzEwXTsKLQkJaWYgKGRhaS0+aWQgPT0gTVNNX0lOVDVfTUkyUykKLQkJCWN0cmwgPSAmbWkyc19jb25maWdfY29udHJvbHNbMTFdOwotCX0KLQotCWlmIChjdHJsKSB7Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCXNuZF9jdGxfbmV3MShjdHJsLAotCQkJCSZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlpZiAoa2NvbnRyb2wpCi0JCQkJc25kX2N0bF9yZW1vdmUoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCQkJa2NvbnRyb2wpOwotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBlcnIgYWRkIFRYIGZtdCBjdGwgREFJID0gJXNcbiIsCi0JCQkJX19mdW5jX18sIGRhaS0+bmFtZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZGFpLT5pZCA9PSBNU01fSU5UNV9NSTJTKQotCQl2aV9mZWVkX2N0cmwgPSAmbWkyc192aV9mZWVkX2NvbnRyb2xzWzBdOwotCi0JaWYgKHZpX2ZlZWRfY3RybCkgewotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQlzbmRfY3RsX25ldzEodmlfZmVlZF9jdHJsLAotCQkJCSZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSkpOwotCi0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBUWCB2aSBmZWVkIGNoYW5uZWwgY3RsIERBSSA9ICVzXG4iLAotCQkJCV9fZnVuY19fLCBkYWktPm5hbWUpOwotCQl9Ci0JfQotCi0JcmMgPSBtc21fZGFpX3E2X2RhaV9hZGRfcm91dGUoZGFpKTsKLXJ0bjoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9taTJzX2RhaV9kYXRhICptaTJzX2RhaV9kYXRhID0KLQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlpbnQgcmM7Ci0KLQkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKLQkJICAgICBtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzaykpIHsKLQkJcmMgPSBhZmVfY2xvc2UoTUkyU19SWCk7IC8qIGNhbiBibG9jayAqLwotCQlpZiAocmMgPCAwKQotCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gY2xvc2UgTUkyU19SWCBwb3J0XG4iKTsKLQkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JCQkgIG1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnN0YXR1c19tYXNrKTsKLQl9Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JCSAgICAgbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEuc3RhdHVzX21hc2spKSB7Ci0JCXJjID0gYWZlX2Nsb3NlKE1JMlNfVFgpOyAvKiBjYW4gYmxvY2sgKi8KLQkJaWYgKHJjIDwgMCkKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGNsb3NlIE1JMlNfVFggcG9ydFxuIik7Ci0JCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCQkJICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfbWkyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBtc21fbWkyc19nZXRfcG9ydF9pZCh1MzIgbWkyc19pZCwgaW50IHN0cmVhbSwgdTE2ICpwb3J0X2lkKQotewotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChzdHJlYW0pIHsKLQljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6Ci0JCXN3aXRjaCAobWkyc19pZCkgewotCQljYXNlIE1TTV9QUklNX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9TRUNfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7Ci0JCQlicmVhazsKLQkJY2FzZSBNU01fVEVSVF9NSTJTOgotCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1FVQVRfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1NFQ19NSTJTX1NEMToKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1FVSU5fTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDBfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDFfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDJfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UMl9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDNfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDRfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDVfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNV9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX0lOVDZfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBwbGF5YmFjayBlcnIgaWQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgbWkyc19pZCk7Ci0JCQlyZXQgPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6Ci0JCXN3aXRjaCAobWkyc19pZCkgewotCQljYXNlIE1TTV9QUklNX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9TRUNfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg7Ci0JCQlicmVhazsKLQkJY2FzZSBNU01fVEVSVF9NSTJTOgotCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1FVQVRfTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1FVSU5fTUkyUzoKLQkJCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX1NFTkFSWV9NSTJTOgotCQkJKnBvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQwX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQxX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQyX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQzX01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQ0X01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQ1X01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9JTlQ2X01JMlM6Ci0JCQkqcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogY2FwdHVyZSBlcnIgaWQgMHgleFxuIiwgX19mdW5jX18sIG1pMnNfaWQpOwotCQkJcmV0ID0gLTE7Ci0JCQlicmVhazsKLQkJfQotCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRlZmF1bHQgZXJyICVkXG4iLCBfX2Z1bmNfXywgc3RyZWFtKTsKLQkJcmV0ID0gLTE7Ci0JYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCAqcG9ydF9pZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0KLQkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwotCQkgJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhIDoKLQkJICZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSk7Ci0JdTE2IHBvcnRfaWQgPSAwOwotCWludCByYyA9IDA7Ci0KLQlpZiAobXNtX21pMnNfZ2V0X3BvcnRfaWQoZGFpLT5pZCwgc3Vic3RyZWFtLT5zdHJlYW0sCi0JCQkJICZwb3J0X2lkKSAhPSAwKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogSW52YWxpZCBQb3J0IElEIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGRhaSBpZCAlZCwgYWZlIHBvcnQgaWQgPSAweCV4XG4iCi0JCSJkYWlfZGF0YS0+Y2hhbm5lbHMgPSAldSBzYW1wbGVfcmF0ZSA9ICV1XG4iLCBfX2Z1bmNfXywKLQkJZGFpLT5pZCwgcG9ydF9pZCwgZGFpX2RhdGEtPmNoYW5uZWxzLCBkYWlfZGF0YS0+cmF0ZSk7Ci0KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJLyogUE9SVCBTVEFSVCBzaG91bGQgYmUgc2V0IGlmIHByZXBhcmUgY2FsbGVkCi0JCSAqIGluIGFjdGl2ZSBzdGF0ZS4KLQkJICovCi0JCXJjID0gYWZlX3BvcnRfc3RhcnQocG9ydF9pZCwgJmRhaV9kYXRhLT5wb3J0X2NvbmZpZywKLQkJCQkgICAgZGFpX2RhdGEtPnJhdGUpOwotCQlpZiAocmMgPCAwKQotCQkJZGV2X2VycihkYWktPmRldiwgImZhaWwgdG8gb3BlbiBBRkUgcG9ydCAweCV4XG4iLAotCQkJCWRhaS0+aWQpOwotCQllbHNlCi0JCQlzZXRfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQl9Ci0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cykpIHsKLQkJc2V0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cyk7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlczogc2V0IGh3ZnJlZV9zdGF0dXMgdG8gc3RhcnRlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2RhdGEgKm1pMnNfZGFpX2RhdGEgPQotCQlkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2NvbmZpZyAqbWkyc19kYWlfY29uZmlnID0KLQkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwotCQkmbWkyc19kYWlfZGF0YS0+cnhfZGFpIDogJm1pMnNfZGFpX2RhdGEtPnR4X2RhaSk7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0gJm1pMnNfZGFpX2NvbmZpZy0+bWkyc19kYWlfZGF0YTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2kyc19jZmcgKmkycyA9ICZkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzOwotCi0JZGFpX2RhdGEtPmNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0Jc3dpdGNoIChkYWlfZGF0YS0+Y2hhbm5lbHMpIHsKLQljYXNlIDg6Ci0JY2FzZSA3OgotCQlpZiAobWkyc19kYWlfY29uZmlnLT5wZGF0YV9taTJzX2xpbmVzIDwgQUZFX1BPUlRfSTJTXzhDSFMpCi0JCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKLQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPSBBRkVfUE9SVF9JMlNfOENIUzsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNToKLQkJaWYgKG1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lcyA8IEFGRV9QT1JUX0kyU182Q0hTKQotCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0gQUZFX1BPUlRfSTJTXzZDSFM7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDM6Ci0JCWlmIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMgPCBBRkVfUE9SVF9JMlNfUVVBRDAxKQotCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7Ci0JCWlmIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMgPT0gQUZFX1BPUlRfSTJTX1FVQUQyMykKLQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0KLQkJCQltaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXM7Ci0JCWVsc2UKLQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuY2hhbm5lbF9tb2RlID0KLQkJCQkJQUZFX1BPUlRfSTJTX1FVQUQwMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgMToKLQkJaWYgKG1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lcyA8IEFGRV9QT1JUX0kyU19TRDApCi0JCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKLQkJc3dpdGNoIChtaTJzX2RhaV9jb25maWctPnBkYXRhX21pMnNfbGluZXMpIHsKLQkJY2FzZSBBRkVfUE9SVF9JMlNfU0QwOgotCQljYXNlIEFGRV9QT1JUX0kyU19TRDE6Ci0JCWNhc2UgQUZFX1BPUlRfSTJTX1NEMjoKLQkJY2FzZSBBRkVfUE9SVF9JMlNfU0QzOgotCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPQotCQkJCW1pMnNfZGFpX2NvbmZpZy0+cGRhdGFfbWkyc19saW5lczsKLQkJCWJyZWFrOwotCQljYXNlIEFGRV9QT1JUX0kyU19RVUFEMDE6Ci0JCWNhc2UgQUZFX1BPUlRfSTJTXzZDSFM6Ci0JCWNhc2UgQUZFX1BPUlRfSTJTXzhDSFM6Ci0JCQlpZiAoZGFpX2RhdGEtPnZpX2ZlZWRfbW9ubyA9PSBTUEtSXzEpCi0JCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPQotCQkJCQkJCUFGRV9QT1JUX0kyU19TRDA7Ci0JCQllbHNlCi0JCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPQotCQkJCQkJCUFGRV9QT1JUX0kyU19TRDE7Ci0JCQlicmVhazsKLQkJY2FzZSBBRkVfUE9SVF9JMlNfUVVBRDIzOgotCQkJZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUgPQotCQkJCQkJQUZFX1BPUlRfSTJTX1NEMjsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChkYWlfZGF0YS0+Y2hhbm5lbHMgPT0gMikKLQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMubW9ub19zdGVyZW8gPQotCQkJCQkJTVNNX0FGRV9DSF9TVEVSRU87Ci0JCWVsc2UKLQkJCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMubW9ub19zdGVyZW8gPSBNU01fQUZFX01PTk87Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRlZmF1bHQgZXJyIGNoYW5uZWxzICVkXG4iLAotCQkJX19mdW5jX18sIGRhaV9kYXRhLT5jaGFubmVscyk7Ci0JCWdvdG8gZXJyb3JfaW52YWxpZF9kYXRhOwotCX0KLQlkYWlfZGF0YS0+cmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1NQRUNJQUw6Ci0JCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuYml0X3dpZHRoID0gMTY7Ci0JCWRhaV9kYXRhLT5iaXR3aWR0aCA9IDE2OwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQlkYWlfZGF0YS0+cG9ydF9jb25maWcuaTJzLmJpdF93aWR0aCA9IDI0OwotCQlkYWlfZGF0YS0+Yml0d2lkdGggPSAyNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZm9ybWF0ICVkXG4iLAotCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuaTJzX2NmZ19taW5vcl92ZXJzaW9uID0KLQkJCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHOwotCWRhaV9kYXRhLT5wb3J0X2NvbmZpZy5pMnMuc2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQlpZiAoKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JICAgIG1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnN0YXR1c19tYXNrKSAmJgotCSAgICB0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCSAgICBtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5od2ZyZWVfc3RhdHVzKSkgfHwKLQkgICAgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsCi0JICAgIG1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLnN0YXR1c19tYXNrKSAmJgotCSAgICB0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCSAgICBtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5od2ZyZWVfc3RhdHVzKSkpIHsKLQkJaWYgKChtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5yYXRlICE9Ci0JCSAgICBtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5yYXRlKSB8fAotCQkgICAobWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEuYml0d2lkdGggIT0KLQkJICAgIG1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLmJpdHdpZHRoKSkgewotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBFcnJvciBtaXNtYXRjaCBpbiBIVyBwYXJhbXNcbiIKLQkJCQkiVHggc2FtcGxlX3JhdGUgPSAldSBiaXRfd2lkdGggPSAlaHVcbiIKLQkJCQkiUnggc2FtcGxlX3JhdGUgPSAldSBiaXRfd2lkdGggPSAlaHVcbiIKLQkJCQksIF9fZnVuY19fLAotCQkJCW1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLnJhdGUsCi0JCQkJbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEuYml0d2lkdGgsCi0JCQkJbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEucmF0ZSwKLQkJCQltaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5iaXR3aWR0aCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGRhaSBpZCAlZCBkYWlfZGF0YS0+Y2hhbm5lbHMgPSAlZFxuIgotCQkic2FtcGxlX3JhdGUgPSAldSBpMnNfY2ZnX21pbm9yX3ZlcnNpb24gPSAweCV4XG4iCi0JCSJiaXRfd2lkdGggPSAlaHUgIGNoYW5uZWxfbW9kZSA9IDB4JXggbW9ub19zdGVyZW8gPSAlI3hcbiIKLQkJIndzX3NyYyA9IDB4JXggc2FtcGxlX3JhdGUgPSAldSBkYXRhX2Zvcm1hdCA9IDB4JXhcbiIKLQkJInJlc2VydmVkID0gJXVcbiIsIF9fZnVuY19fLCBkYWktPmlkLCBkYWlfZGF0YS0+Y2hhbm5lbHMsCi0JCWRhaV9kYXRhLT5yYXRlLCBpMnMtPmkyc19jZmdfbWlub3JfdmVyc2lvbiwgaTJzLT5iaXRfd2lkdGgsCi0JCWkycy0+Y2hhbm5lbF9tb2RlLCBpMnMtPm1vbm9fc3RlcmVvLCBpMnMtPndzX3NyYywKLQkJaTJzLT5zYW1wbGVfcmF0ZSwgaTJzLT5kYXRhX2Zvcm1hdCwgaTJzLT5yZXNlcnZlZCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfaW52YWxpZF9kYXRhOgotCXByX2VycigiJXM6IGRhaV9kYXRhLT5jaGFubmVscyA9ICVkIGNoYW5uZWxfbW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGRhaV9kYXRhLT5jaGFubmVscywgZGFpX2RhdGEtPnBvcnRfY29uZmlnLmkycy5jaGFubmVsX21vZGUpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9taTJzX3NldF9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqbWkyc19kYWlfZGF0YSA9Ci0JZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCSAgICBtaTJzX2RhaV9kYXRhLT5yeF9kYWkubWkyc19kYWlfZGF0YS5zdGF0dXNfbWFzaykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKLQkgICAgbWkyc19kYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEuc3RhdHVzX21hc2spKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGNoZyBpMnMgbW9kZSB3aGlsZSBkYWkgcnVubmluZyIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0Jc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgewotCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKLQkJbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLndzX3NyYyA9IDE7Ci0JCW1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhLnBvcnRfY29uZmlnLmkycy53c19zcmMgPSAxOwotCQlicmVhazsKLQljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06Ci0JCW1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhLnBvcnRfY29uZmlnLmkycy53c19zcmMgPSAwOwotCQltaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YS5wb3J0X2NvbmZpZy5pMnMud3Nfc3JjID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZm10ICVkXG4iLAotCQkJX19mdW5jX18sIGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9taTJzX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3E2X21pMnNfZGFpX2RhdGEgKm1pMnNfZGFpX2RhdGEgPQotCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9kYWlfZGF0YSAqZGFpX2RhdGEgPQotCQkoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyA/Ci0JCSAmbWkyc19kYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEgOgotCQkgJm1pMnNfZGFpX2RhdGEtPnR4X2RhaS5taTJzX2RhaV9kYXRhKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+aHdmcmVlX3N0YXR1cykpIHsKLQkJY2xlYXJfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5od2ZyZWVfc3RhdHVzKTsKLQkJZGV2X2RiZyhkYWktPmRldiwgIiVzOiBjbGVhciBod2ZyZWVfc3RhdHVzXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZGFpX3E2X21pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl9taTJzX2RhaV9kYXRhICptaTJzX2RhaV9kYXRhID0KLQkJCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfZGFpX2RhdGEgKmRhaV9kYXRhID0KLQkJKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwotCQkgJm1pMnNfZGFpX2RhdGEtPnJ4X2RhaS5taTJzX2RhaV9kYXRhIDoKLQkJICZtaTJzX2RhaV9kYXRhLT50eF9kYWkubWkyc19kYWlfZGF0YSk7Ci0JIHUxNiBwb3J0X2lkID0gMDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKG1zbV9taTJzX2dldF9wb3J0X2lkKGRhaS0+aWQsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQkJCSAmcG9ydF9pZCkgIT0gMCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IEludmFsaWQgUG9ydCBJRCAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQl9Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXM6IGNsb3NpbmcgYWZlIHBvcnQgaWQgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcmMgPSBhZmVfY2xvc2UocG9ydF9pZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiZmFpbCB0byBjbG9zZSBBRkUgcG9ydFxuIik7Ci0JCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELCBkYWlfZGF0YS0+c3RhdHVzX21hc2spOwotCX0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPmh3ZnJlZV9zdGF0dXMpKQotCQljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPmh3ZnJlZV9zdGF0dXMpOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3E2X21pMnNfb3BzID0gewotCS5zdGFydHVwCT0gbXNtX2RhaV9xNl9taTJzX3N0YXJ0dXAsCi0JLnByZXBhcmUJPSBtc21fZGFpX3E2X21pMnNfcHJlcGFyZSwKLQkuaHdfcGFyYW1zCT0gbXNtX2RhaV9xNl9taTJzX2h3X3BhcmFtcywKLQkuaHdfZnJlZQk9IG1zbV9kYWlfcTZfbWkyc19od19mcmVlLAotCS5zZXRfZm10CT0gbXNtX2RhaV9xNl9taTJzX3NldF9mbXQsCi0JLnNodXRkb3duCT0gbXNtX2RhaV9xNl9taTJzX3NodXRkb3duLAotfTsKLQotLyogQ2hhbm5lbCBtaW4gYW5kIG1heCBhcmUgaW5pdGlhbGl6ZWQgYmFzZSBvbiBwbGF0Zm9ybSBkYXRhICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X21pMnNfZGFpW10gPSB7Ci0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfTUkyU19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fUFJJTV9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX01JMlNfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fU0VDX01JMlMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfTUkyU19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfTUkyU19UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCi0JCS5pZCA9IE1TTV9URVJUX01JMlMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9NSTJTX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xMTAyNSB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV8yMjA1MCB8Ci0JCQkJIFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDE5MjAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fUVVBVF9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayBTRDEiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19NSTJTX1JYX1NEMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5pZCA9IE1TTV9TRUNfTUkyU19TRDEsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWluYXJ5IE1JMlMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlFVSU5fTUkyU19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgMTkyMDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWluYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVJTl9NSTJTX1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fUVVJTl9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlbmFyeV9taTJzIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFTkFSWV9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKLQkJLmlkID0gTVNNX1NFTkFSWV9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJJTlQwIE1JMlMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIklOVDBfTUkyU19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV85NjAwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDAgTUkyUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJJTlQwX01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCi0JCS5pZCA9IE1TTV9JTlQwX01JMlMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDEgTUkyUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSU5UMV9NSTJTX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UMSBNSTJTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIklOVDFfTUkyU19UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKLQkJLmlkID0gTVNNX0lOVDFfTUkyUywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UMiBNSTJTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJJTlQyX01JMlNfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJJTlQyIE1JMlMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiSU5UMl9NSTJTX1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fSU5UMl9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJJTlQzIE1JMlMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIklOVDNfTUkyU19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDMgTUkyUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJJTlQzX01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCi0JCS5pZCA9IE1TTV9JTlQzX01JMlMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDQgTUkyUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSU5UNF9NSTJTX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICAxOTIwMDAsCi0JCX0sCi0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDQgTUkyUyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJJTlQ0X01JMlNfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfbWkyc19vcHMsCi0JCS5pZCA9IE1TTV9JTlQ0X01JMlMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIklOVDUgTUkyUyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiSU5UNV9NSTJTX1JYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UNSBNSTJTIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIklOVDVfTUkyU19UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLnJhdGVfbWluID0gICAgIDgwMDAsCi0JCQkucmF0ZV9tYXggPSAgICAgNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl9taTJzX29wcywKLQkJLmlkID0gTVNNX0lOVDVfTUkyUywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX21pMnNfcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiSU5UNiBNSTJTIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJJTlQ2X01JMlNfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSwKLQkJCS5yYXRlX21pbiA9ICAgICA4MDAwLAotCQkJLnJhdGVfbWF4ID0gICAgIDQ4MDAwLAotCQl9LAotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJJTlQ2IE1JMlMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiSU5UNl9NSTJTX1RYIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkucmF0ZV9taW4gPSAgICAgODAwMCwKLQkJCS5yYXRlX21heCA9ICAgICA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X21pMnNfb3BzLAotCQkuaWQgPSBNU01fSU5UNl9NSTJTLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV9taTJzX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfbWkyc19yZW1vdmUsCi0JfSwKLX07Ci0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZ2V0X2xpbmVjb25maWcodTE2IHNkX2xpbmVzLCB1MTYgKmNvbmZpZ19wdHIsCi0JCQkJCSAgdW5zaWduZWQgaW50ICpjaF9jbnQpCi17Ci0JdTggbnVtX29mX3NkX2xpbmVzOwotCi0JbnVtX29mX3NkX2xpbmVzID0gbnVtX29mX2JpdHNfc2V0KHNkX2xpbmVzKTsKLQlzd2l0Y2ggKG51bV9vZl9zZF9saW5lcykgewotCWNhc2UgMDoKLQkJcHJfZGVidWcoIiVzOiBubyBsaW5lIGlzIGFzc2lnbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc3dpdGNoIChzZF9saW5lcykgewotCQljYXNlIE1TTV9NSTJTX1NEMDoKLQkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMDsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9NSTJTX1NEMToKLQkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMTsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9NSTJTX1NEMjoKLQkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMjsKLQkJCWJyZWFrOwotCQljYXNlIE1TTV9NSTJTX1NEMzoKLQkJCSpjb25maWdfcHRyID0gQUZFX1BPUlRfSTJTX1NEMzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogaW52YWxpZCBTRCBsaW5lcyAlZFxuIiwKLQkJCQkgICBfX2Z1bmNfXywgc2RfbGluZXMpOwotCQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzd2l0Y2ggKHNkX2xpbmVzKSB7Ci0JCWNhc2UgTVNNX01JMlNfU0QwIHwgTVNNX01JMlNfU0QxOgotCQkJKmNvbmZpZ19wdHIgPSBBRkVfUE9SVF9JMlNfUVVBRDAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgTVNNX01JMlNfU0QyIHwgTVNNX01JMlNfU0QzOgotCQkJKmNvbmZpZ19wdHIgPSBBRkVfUE9SVF9JMlNfUVVBRDIzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7Ci0JCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKLQkJfQotCQlicmVhazsKLQljYXNlIDM6Ci0JCXN3aXRjaCAoc2RfbGluZXMpIHsKLQkJY2FzZSBNU01fTUkyU19TRDAgfCBNU01fTUkyU19TRDEgfCBNU01fTUkyU19TRDI6Ci0JCQkqY29uZmlnX3B0ciA9IEFGRV9QT1JUX0kyU182Q0hTOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7Ci0JCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKLQkJfQotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXN3aXRjaCAoc2RfbGluZXMpIHsKLQkJY2FzZSBNU01fTUkyU19TRDAgfCBNU01fTUkyU19TRDEgfCBNU01fTUkyU19TRDIgfCBNU01fTUkyU19TRDM6Ci0JCQkqY29uZmlnX3B0ciA9IEFGRV9QT1JUX0kyU184Q0hTOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCBzZF9saW5lcyk7Ci0JCQlnb3RvIGVycm9yX2ludmFsaWRfZGF0YTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNEIGxpbmVzICVkXG4iLCBfX2Z1bmNfXywgbnVtX29mX3NkX2xpbmVzKTsKLQkJZ290byBlcnJvcl9pbnZhbGlkX2RhdGE7Ci0JfQotCSpjaF9jbnQgPSBudW1fb2Zfc2RfbGluZXM7Ci0JcmV0dXJuIDA7Ci0KLWVycm9yX2ludmFsaWRfZGF0YToKLQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRhdGFcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfcGxhdGZvcm1fZGF0YV92YWxpZGF0aW9uKAotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcml2ZXIpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqZGFpX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IG1zbV9taTJzX3BkYXRhICptaTJzX3BkYXRhID0KLQkJCShzdHJ1Y3QgbXNtX21pMnNfcGRhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JdW5zaWduZWQgaW50IGNoX2NudDsKLQlpbnQgcmMgPSAwOwotCXUxNiBzZF9saW5lOwotCi0JaWYgKG1pMnNfcGRhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtaTJzX3BkYXRhIE5VTEwiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gbXNtX2RhaV9xNl9taTJzX2dldF9saW5lY29uZmlnKG1pMnNfcGRhdGEtPnJ4X3NkX2xpbmVzLAotCQkJCQkgICAgJnNkX2xpbmUsICZjaF9jbnQpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBNSTJTIFJYIHNkIGxpbmUgY29uZmlnXG4iKTsKLQkJZ290byBydG47Ci0JfQotCi0JaWYgKGNoX2NudCkgewotCQlkYWlfZGF0YS0+cnhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9Ci0JCXNkX2xpbmU7Ci0JCWRhaV9kYXRhLT5yeF9kYWkucGRhdGFfbWkyc19saW5lcyA9IHNkX2xpbmU7Ci0JCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbiA9IDE7Ci0JCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21heCA9IGNoX2NudCA8PCAxOwotCX0gZWxzZSB7Ci0JCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbiA9IDA7Ci0JCWRhaV9kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21heCA9IDA7Ci0JfQotCXJjID0gbXNtX2RhaV9xNl9taTJzX2dldF9saW5lY29uZmlnKG1pMnNfcGRhdGEtPnR4X3NkX2xpbmVzLAotCQkJCQkgICAgJnNkX2xpbmUsICZjaF9jbnQpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBNSTJTIFRYIHNkIGxpbmUgY29uZmlnXG4iKTsKLQkJZ290byBydG47Ci0JfQotCi0JaWYgKGNoX2NudCkgewotCQlkYWlfZGF0YS0+dHhfZGFpLm1pMnNfZGFpX2RhdGEucG9ydF9jb25maWcuaTJzLmNoYW5uZWxfbW9kZSA9Ci0JCXNkX2xpbmU7Ci0JCWRhaV9kYXRhLT50eF9kYWkucGRhdGFfbWkyc19saW5lcyA9IHNkX2xpbmU7Ci0JCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluID0gMTsKLQkJZGFpX2RyaXZlci0+Y2FwdHVyZS5jaGFubmVsc19tYXggPSBjaF9jbnQgPDwgMTsKLQl9IGVsc2UgewotCQlkYWlfZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbiA9IDA7Ci0JCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWF4ID0gMDsKLQl9Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcGxheWJhY2sgc2RsaW5lIDB4JXggY2FwdHVyZSBzZGxpbmUgMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5yeF9kYWkucGRhdGFfbWkyc19saW5lcywKLQkJZGFpX2RhdGEtPnR4X2RhaS5wZGF0YV9taTJzX2xpbmVzKTsKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogcGxheWJhY2sgY2hfbWF4ICVkIGNhcHR1cmUgY2hfbXggJWRcbiIsCi0JCV9fZnVuY19fLCBkYWlfZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19tYXgsCi0JCWRhaV9kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWF4KTsKLXJ0bjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9xNl9taTJzX2RhaV9jb21wb25lbnQgPSB7Ci0JLm5hbWUJCT0gIm1zbS1kYWktcTYtbWkycyIsCi19Owotc3RhdGljIGludCBtc21fZGFpX3E2X21pMnNfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSAqZGFpX2RhdGE7Ci0JY29uc3QgY2hhciAqcTZfbWkyc19kZXZfaWQgPSAicWNvbSxtc20tZGFpLXE2LW1pMnMtZGV2LWlkIjsKLQl1MzIgdHhfbGluZSA9IDA7Ci0JdTMyICByeF9saW5lID0gMDsKLQl1MzIgbWkyc19pbnRmID0gMDsKLQlzdHJ1Y3QgbXNtX21pMnNfcGRhdGEgKm1pMnNfcGRhdGE7Ci0JaW50IHJjOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgcTZfbWkyc19kZXZfaWQsCi0JCQkJICAmbWkyc19pbnRmKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBtaXNzaW5nIDB4JXggaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIG1pMnNfaW50Zik7Ci0JCWdvdG8gcnRuOwotCX0KLQotCWRldl9kYmcoJnBkZXYtPmRldiwgImRldiBuYW1lICVzIGRldiBpZCAweCV4XG4iLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwKLQkJbWkyc19pbnRmKTsKLQotCWlmICgobWkyc19pbnRmIDwgTVNNX01JMlNfTUlOIHx8IG1pMnNfaW50ZiA+IE1TTV9NSTJTX01BWCkKLQkJfHwgKG1pMnNfaW50ZiA+PSBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfbWkyc19kYWkpKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IEludmFsaWQgTUkyUyBJRCAldSBmcm9tIERldmljZSBUcmVlXG4iLAotCQkJX19mdW5jX18sIG1pMnNfaW50Zik7Ci0JCXJjID0gLUVOWElPOwotCQlnb3RvIHJ0bjsKLQl9Ci0KLQlwZGV2LT5pZCA9IG1pMnNfaW50ZjsKLQotCW1pMnNfcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX21pMnNfcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pMnNfcGRhdGEpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIHJ0bjsKLQl9Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxtc20tbWkycy1yeC1saW5lcyIsCi0JCQkJICAmcnhfbGluZSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBSeCBsaW5lIGZyb20gRFQgZmlsZSAlc1xuIiwgX19mdW5jX18sCi0JCQkicWNvbSxtc20tbWkycy1yeC1saW5lcyIpOwotCQlnb3RvIGZyZWVfcGRhdGE7Ci0JfQotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInFjb20sbXNtLW1pMnMtdHgtbGluZXMiLAotCQkJCSAgJnR4X2xpbmUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVHggbGluZSBmcm9tIERUIGZpbGUgJXNcbiIsIF9fZnVuY19fLAotCQkJInFjb20sbXNtLW1pMnMtdHgtbGluZXMiKTsKLQkJZ290byBmcmVlX3BkYXRhOwotCX0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJkZXYgbmFtZSAlcyBSeCBsaW5lIDB4JXggLCBUeCBpbmUgMHgleFxuIiwKLQkJZGV2X25hbWUoJnBkZXYtPmRldiksIHJ4X2xpbmUsIHR4X2xpbmUpOwotCW1pMnNfcGRhdGEtPnJ4X3NkX2xpbmVzID0gcnhfbGluZTsKLQltaTJzX3BkYXRhLT50eF9zZF9saW5lcyA9IHR4X2xpbmU7Ci0JbWkyc19wZGF0YS0+aW50Zl9pZCA9IG1pMnNfaW50ZjsKLQotCWRhaV9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9kYWlfcTZfbWkyc19kYWlfZGF0YSksCi0JCQkgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBmcmVlX3BkYXRhOwotCX0gZWxzZQotCQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGFpX2RhdGEpOwotCi0JcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBtaTJzX3BkYXRhOwotCi0JcmMgPSBtc21fZGFpX3E2X21pMnNfcGxhdGZvcm1fZGF0YV92YWxpZGF0aW9uKHBkZXYsCi0JCQkmbXNtX2RhaV9xNl9taTJzX2RhaVttaTJzX2ludGZdKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0KLQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZtc21fcTZfbWkyc19kYWlfY29tcG9uZW50LAotCSZtc21fZGFpX3E2X21pMnNfZGFpW21pMnNfaW50Zl0sIDEpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gZXJyX3JlZ2lzdGVyOwotCXJldHVybiAwOwotCi1lcnJfcmVnaXN0ZXI6Ci0JZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbCB0byBtc21fZGFpX3E2X21pMnNfZGV2X3Byb2JlXG4iKTsKLWZyZWVfZGFpX2RhdGE6Ci0Ja2ZyZWUoZGFpX2RhdGEpOwotZnJlZV9wZGF0YToKLQlrZnJlZShtaTJzX3BkYXRhKTsKLXJ0bjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9taTJzX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBtc21fZGFpX3E2X2NvbXBvbmVudCA9IHsKLQkubmFtZQkJPSAibXNtLWRhaS1xNi1kZXYiLAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYywgaWQsIGksIGxlbjsKLQljb25zdCBjaGFyICpxNl9kZXZfaWQgPSAicWNvbSxtc20tZGFpLXE2LWRldi1pZCI7Ci0JY2hhciBzdHJlYW1fbmFtZVs4MF07Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBxNl9kZXZfaWQsICZpZCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgcTZfZGV2X2lkKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXBkZXYtPmlkID0gaWQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzLCBpZDolZFxuIiwgX19mdW5jX18sCi0JCSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGRldi0+aWQpOwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgU0xJTUJVU18wX1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1cyBQbGF5YmFjayIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOwotCWNhc2UgU0xJTUJVU18yX1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czIgUGxheWJhY2siLCA4MCk7Ci0JCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXMxIFBsYXliYWNrIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX3NsaW1fcGxheWJhY2s7Ci0JY2FzZSBTTElNQlVTXzNfUlg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzMyBQbGF5YmFjayIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOwotCWNhc2UgU0xJTUJVU180X1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czQgUGxheWJhY2siLCA4MCk7Ci0JCWdvdG8gcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazsKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM1IFBsYXliYWNrIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX3NsaW1fcGxheWJhY2s7Ci0JY2FzZSBTTElNQlVTXzZfUlg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzNiBQbGF5YmFjayIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOwotCWNhc2UgU0xJTUJVU183X1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czcgUGxheWJhY2siLCBzaXplb2Yoc3RyZWFtX25hbWUpKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOwotCWNhc2UgU0xJTUJVU184X1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czggUGxheWJhY2siLCBzaXplb2Yoc3RyZWFtX25hbWUpKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX3BsYXliYWNrOwotcmVnaXN0ZXJfc2xpbV9wbGF5YmFjazoKLQkJcmMgPSAtRU5PREVWOwotCQlsZW4gPSBzdHJubGVuKHN0cmVhbV9uYW1lLCA4MCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfc2xpbWJ1c19yeF9kYWkpOyBpKyspIHsKLQkJCWlmIChtc21fZGFpX3E2X3NsaW1idXNfcnhfZGFpW2ldLnBsYXliYWNrLnN0cmVhbV9uYW1lICYmCi0JCQkJIXN0cmNtcChzdHJlYW1fbmFtZSwKLQkJCQltc21fZGFpX3E2X3NsaW1idXNfcnhfZGFpW2ldCi0JCQkJLnBsYXliYWNrLnN0cmVhbV9uYW1lKSkgewotCQkJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsCi0JCQkJJm1zbV9kYWlfcTZfc2xpbWJ1c19yeF9kYWlbaV0sIDEpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IERldmljZSBub3QgZm91bmQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCQkJX19mdW5jX18sIHN0cmVhbV9uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTElNQlVTXzBfVFg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzIENhcHR1cmUiLCA4MCk7Ci0JCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOwotCWNhc2UgU0xJTUJVU18xX1RYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czEgQ2FwdHVyZSIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7Ci0JY2FzZSBTTElNQlVTXzJfVFg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzMiBDYXB0dXJlIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKLQljYXNlIFNMSU1CVVNfM19UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXMzIENhcHR1cmUiLCA4MCk7Ci0JCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOwotCWNhc2UgU0xJTUJVU180X1RYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czQgQ2FwdHVyZSIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7Ci0JY2FzZSBTTElNQlVTXzVfVFg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJTbGltYnVzNSBDYXB0dXJlIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM2IENhcHR1cmUiLCA4MCk7Ci0JCWdvdG8gcmVnaXN0ZXJfc2xpbV9jYXB0dXJlOwotCWNhc2UgU0xJTUJVU183X1RYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiU2xpbWJ1czcgQ2FwdHVyZSIsIHNpemVvZihzdHJlYW1fbmFtZSkpOwotCQlnb3RvIHJlZ2lzdGVyX3NsaW1fY2FwdHVyZTsKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlNsaW1idXM4IENhcHR1cmUiLCBzaXplb2Yoc3RyZWFtX25hbWUpKTsKLQkJZ290byByZWdpc3Rlcl9zbGltX2NhcHR1cmU7Ci1yZWdpc3Rlcl9zbGltX2NhcHR1cmU6Ci0JCXJjID0gLUVOT0RFVjsKLQkJbGVuID0gc3RybmxlbihzdHJlYW1fbmFtZSwgODApOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZGFpX3E2X3NsaW1idXNfdHhfZGFpKTsgaSsrKSB7Ci0JCQlpZiAobXNtX2RhaV9xNl9zbGltYnVzX3R4X2RhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lICYmCi0JCQkJIXN0cmNtcChzdHJlYW1fbmFtZSwKLQkJCQltc21fZGFpX3E2X3NsaW1idXNfdHhfZGFpW2ldCi0JCQkJLmNhcHR1cmUuc3RyZWFtX25hbWUpKSB7Ci0JCQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwKLQkJCQkmbXNtX2RhaV9xNl9zbGltYnVzX3R4X2RhaVtpXSwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogRGV2aWNlIG5vdCBmb3VuZCBzdHJlYW0gbmFtZSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgc3RyZWFtX25hbWUpOwotCQlicmVhazsKLQljYXNlIElOVF9CVF9TQ09fUlg6Ci0JCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwgJm1zbV9kYWlfcTZfYnRfc2NvX3J4X2RhaSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgSU5UX0JUX1NDT19UWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl9idF9zY29fdHhfZGFpLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRfQlRfQTJEUF9SWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl9idF9hMmRwX3J4X2RhaSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgSU5UX0ZNX1JYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsICZtc21fZGFpX3E2X2ZtX3J4X2RhaSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgSU5UX0ZNX1RYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsICZtc21fZGFpX3E2X2ZtX3R4X2RhaSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9xNl9jb21wb25lbnQsICZtc21fZGFpX3E2X3VzYl9yeF9kYWksIDEpOwotCQlicmVhazsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LCAmbXNtX2RhaV9xNl91c2JfdHhfZGFpLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBSVF9QUk9YWV9EQUlfMDAxX1JYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiQUZFIFBsYXliYWNrIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX2FmZV9wbGF5YmFjazsKLQljYXNlIFJUX1BST1hZX0RBSV8wMDJfUlg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJBRkUtUFJPWFkgUlgiLCA4MCk7Ci1yZWdpc3Rlcl9hZmVfcGxheWJhY2s6Ci0JCXJjID0gLUVOT0RFVjsKLQkJbGVuID0gc3RybmxlbihzdHJlYW1fbmFtZSwgODApOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZGFpX3E2X2FmZV9yeF9kYWkpOyBpKyspIHsKLQkJCWlmIChtc21fZGFpX3E2X2FmZV9yeF9kYWlbaV0ucGxheWJhY2suc3RyZWFtX25hbWUgJiYKLQkJCSAgICAhc3RyY21wKHN0cmVhbV9uYW1lLAotCQkJICAgIG1zbV9kYWlfcTZfYWZlX3J4X2RhaVtpXS5wbGF5YmFjay5zdHJlYW1fbmFtZSkpIHsKLQkJCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwKLQkJCQkJJm1zbV9kYWlfcTZfYWZlX3J4X2RhaVtpXSwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogRGV2aWNlIG5vdCBmb3VuZCBzdHJlYW0gbmFtZSAlc1xuIiwKLQkJCV9fZnVuY19fLCBzdHJlYW1fbmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlRfUFJPWFlfREFJXzAwMV9UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIkFGRS1QUk9YWSBUWCIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl9hZmVfY2FwdHVyZTsKLQljYXNlIFJUX1BST1hZX0RBSV8wMDJfVFg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJBRkUgQ2FwdHVyZSIsIDgwKTsKLXJlZ2lzdGVyX2FmZV9jYXB0dXJlOgotCQlyYyA9IC1FTk9ERVY7Ci0JCWxlbiA9IHN0cm5sZW4oc3RyZWFtX25hbWUsIDgwKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2RhaV9xNl9hZmVfdHhfZGFpKTsgaSsrKSB7Ci0JCQlpZiAobXNtX2RhaV9xNl9hZmVfdHhfZGFpW2ldLmNhcHR1cmUuc3RyZWFtX25hbWUgJiYKLQkJCQkhc3RyY21wKHN0cmVhbV9uYW1lLAotCQkJCW1zbV9kYWlfcTZfYWZlX3R4X2RhaVtpXS5jYXB0dXJlLnN0cmVhbV9uYW1lKSkgewotCQkJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LAotCQkJCQkmbXNtX2RhaV9xNl9hZmVfdHhfZGFpW2ldLCAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBEZXZpY2Ugbm90IGZvdW5kIHN0cmVhbSBuYW1lICVzXG4iLAotCQkJX19mdW5jX18sIHN0cmVhbV9uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBWT0lDRV9QTEFZQkFDS19UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlZvaWNlIEZhcmVuZCBQbGF5YmFjayIsIDgwKTsKLQkJZ290byByZWdpc3Rlcl92b2ljZV9wbGF5YmFjazsKLQljYXNlIFZPSUNFMl9QTEFZQkFDS19UWDoKLQkJc3RybGNweShzdHJlYW1fbmFtZSwgIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLCA4MCk7Ci1yZWdpc3Rlcl92b2ljZV9wbGF5YmFjazoKLQkJcmMgPSAtRU5PREVWOwotCQlsZW4gPSBzdHJubGVuKHN0cmVhbV9uYW1lLCA4MCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaSk7IGkrKykgewotCQkJaWYgKG1zbV9kYWlfcTZfdm9jX3BsYXliYWNrX2RhaVtpXS5wbGF5YmFjay5zdHJlYW1fbmFtZQotCQkJICAgICYmICFzdHJjbXAoc3RyZWFtX25hbWUsCi0JCQkgbXNtX2RhaV9xNl92b2NfcGxheWJhY2tfZGFpW2ldLnBsYXliYWNrLnN0cmVhbV9uYW1lKSkgewotCQkJCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCQkJJm1zbV9kYWlfcTZfY29tcG9uZW50LAotCQkJCQkmbXNtX2RhaV9xNl92b2NfcGxheWJhY2tfZGFpW2ldLCAxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzIERldmljZSBub3QgZm91bmQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHN0cmVhbV9uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBWT0lDRV9SRUNPUkRfUlg6Ci0JCXN0cmxjcHkoc3RyZWFtX25hbWUsICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwgODApOwotCQlnb3RvIHJlZ2lzdGVyX3VwbGlua19jYXB0dXJlOwotCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgotCQlzdHJsY3B5KHN0cmVhbV9uYW1lLCAiVm9pY2UgVXBsaW5rIENhcHR1cmUiLCA4MCk7Ci1yZWdpc3Rlcl91cGxpbmtfY2FwdHVyZToKLQkJcmMgPSAtRU5PREVWOwotCQlsZW4gPSBzdHJubGVuKHN0cmVhbV9uYW1lLCA4MCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9kYWlfcTZfaW5jYWxsX3JlY29yZF9kYWkpOyBpKyspIHsKLQkJCWlmIChtc21fZGFpX3E2X2luY2FsbF9yZWNvcmRfZGFpW2ldLmNhcHR1cmUuc3RyZWFtX25hbWUKLQkJCSAgICAmJiAhc3RyY21wKHN0cmVhbV9uYW1lLAotCQkJICAgIG1zbV9kYWlfcTZfaW5jYWxsX3JlY29yZF9kYWlbaV0uCi0JCQkgICAgY2FwdHVyZS5zdHJlYW1fbmFtZSkpIHsKLQkJCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkJCSZtc21fZGFpX3E2X2NvbXBvbmVudCwKLQkJCQkJJm1zbV9kYWlfcTZfaW5jYWxsX3JlY29yZF9kYWlbaV0sIDEpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IERldmljZSBub3QgZm91bmQgc3RyZWFtIG5hbWUgJXNcbiIsCi0JCQlfX2Z1bmNfXywgc3RyZWFtX25hbWUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfcTZfZGV2X2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtZGV2IiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fZGFpX3E2X2Rldl9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9kYWlfcTZfZGV2ID0gewotCS5wcm9iZSAgPSBtc21fZGFpX3E2X2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kZXZfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1kYWktcTYtZGV2IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfcTZfZGV2X2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmM7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzLCBpZDolZFxuIiwgX19mdW5jX18sCi0JCSBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcGRldi0+aWQpOwotCXJjID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocGRldi0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogZmFpbGVkIHRvIGFkZCBjaGlsZCBub2RlcywgcmM9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCX0gZWxzZQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogYWRkZWQgY2hpbGQgbm9kZVxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfcTZfZHRfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNiIsIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl9kdF9tYXRjaCk7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3E2ID0gewotCS5wcm9iZSAgPSBtc21fZGFpX3E2X3Byb2JlLAotCS5yZW1vdmUgPSBtc21fZGFpX3E2X3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tZGFpLXE2IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfcTZfZHRfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9taTJzX3E2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwgTlVMTCwgTlVMTCwgJnBkZXYtPmRldik7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIGNoaWxkIG5vZGVzLCByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JfSBlbHNlCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBhZGRlZCBjaGlsZCBub2RlXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfbWkyc19xNl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9taTJzX2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktbWkycyIsIH0sCi0JeyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fZGFpX21pMnNfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX21pMnNfcTYgPSB7Ci0JLnByb2JlICA9IG1zbV9kYWlfbWkyc19xNl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9taTJzX3E2X3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tZGFpLW1pMnMiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV9taTJzX2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X21pMnNfZGV2X2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtbWkycyIsIH0sCi0JeyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fZGFpX3E2X21pMnNfZGV2X2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9xNl9taTJzX2RyaXZlciA9IHsKLQkucHJvYmUgID0gbXNtX2RhaV9xNl9taTJzX2Rldl9wcm9iZSwKLQkucmVtb3ZlICA9IG1zbV9kYWlfcTZfbWkyc19kZXZfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1kYWktcTYtbWkycyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3E2X21pMnNfZGV2X2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfc3BkaWZfZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjOwotCi0JcGRldi0+aWQgPSBBRkVfUE9SVF9JRF9TUERJRl9SWDsKLQotCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXMsIGlkOiVkXG4iLCBfX2Z1bmNfXywKLQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBwZGV2LT5pZCk7Ci0KLQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9zcGRpZl9xNl9jb21wb25lbnQsCi0JCQkmbXNtX2RhaV9xNl9zcGRpZl9zcGRpZl9yeF9kYWksIDEpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3NwZGlmX2Rldl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3E2X3NwZGlmX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLWRhaS1xNi1zcGRpZiJ9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl9zcGRpZl9kdF9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9kYWlfcTZfc3BkaWZfZHJpdmVyID0gewotCS5wcm9iZSAgPSBtc21fZGFpX3E2X3NwZGlmX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9xNl9zcGRpZl9kZXZfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1kYWktcTYtc3BkaWYiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX2RhaV9xNl9zcGRpZl9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9zZXRfY2xrX3BhcmFtKHUzMiBncm91cF9pZCwKLQkJCQkJc3RydWN0IGFmZV9jbGtfc2V0ICpjbGtfc2V0LCB1MzIgbW9kZSkKLXsKLQlzd2l0Y2ggKGdyb3VwX2lkKSB7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9UWDoKLQkJaWYgKG1vZGUpCi0JCQljbGtfc2V0LT5jbGtfaWQgPSBRNkFGRV9MUEFTU19DTEtfSURfUFJJX1RETV9JQklUOwotCQllbHNlCi0JCQljbGtfc2V0LT5jbGtfaWQgPSBRNkFGRV9MUEFTU19DTEtfSURfUFJJX1RETV9FQklUOwotCQlicmVhazsKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9UWDoKLQkJaWYgKG1vZGUpCi0JCQljbGtfc2V0LT5jbGtfaWQgPSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX1RETV9JQklUOwotCQllbHNlCi0JCQljbGtfc2V0LT5jbGtfaWQgPSBRNkFGRV9MUEFTU19DTEtfSURfU0VDX1RETV9FQklUOwotCQlicmVhazsKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fVFg6Ci0JCWlmIChtb2RlKQotCQkJY2xrX3NldC0+Y2xrX2lkID0gUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9URE1fSUJJVDsKLQkJZWxzZQotCQkJY2xrX3NldC0+Y2xrX2lkID0gUTZBRkVfTFBBU1NfQ0xLX0lEX1RFUl9URE1fRUJJVDsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQkJaWYgKG1vZGUpCi0JCQljbGtfc2V0LT5jbGtfaWQgPSBRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9URE1fSUJJVDsKLQkJZWxzZQotCQkJY2xrX3NldC0+Y2xrX2lkID0gUTZBRkVfTFBBU1NfQ0xLX0lEX1FVQURfVERNX0VCSVQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3RkbV9xNl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0JY29uc3QgdWludDMyX3QgKnBvcnRfaWRfYXJyYXkgPSBOVUxMOwotCXVpbnQzMl90IGFycmF5X2xlbmd0aCA9IDA7Ci0JaW50IGkgPSAwOwotCWludCBncm91cF9pZHggPSAwOwotCXUzMiBjbGtfbW9kZSA9IDA7Ci0KLQkvKiBleHRyYWN0IHRkbSBncm91cCBpbmZvIGludG8gc3RhdGljICovCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJInFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtaWQiLAotCQkodTMyICopJnRkbV9ncm91cF9jZmcuZ3JvdXBfaWQpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogR3JvdXAgSUQgZnJvbSBEVCBmaWxlICVzXG4iLAotCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLWdyb3VwLWlkIik7Ci0JCWdvdG8gcnRuOwotCX0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogR3JvdXAgSUQgZnJvbSBEVCBmaWxlIDB4JXhcbiIsCi0JCV9fZnVuY19fLCB0ZG1fZ3JvdXBfY2ZnLmdyb3VwX2lkKTsKLQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZGV2X25hbWU6ICVzIGdyb3VwX2lkOiAweCV4XG4iLAotCQlfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldiksIHRkbV9ncm91cF9jZmcuZ3JvdXBfaWQpOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJInFjb20sbXNtLWNwdWRhaS10ZG0tZ3JvdXAtbnVtLXBvcnRzIiwKLQkJJm51bV90ZG1fZ3JvdXBfcG9ydHMpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogR3JvdXAgTnVtIFBvcnRzIGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1udW0tcG9ydHMiKTsKLQkJZ290byBydG47Ci0JfQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBHcm91cCBOdW0gUG9ydHMgZnJvbSBEVCBmaWxlIDB4JXhcbiIsCi0JCV9fZnVuY19fLCBudW1fdGRtX2dyb3VwX3BvcnRzKTsKLQotCWlmIChudW1fdGRtX2dyb3VwX3BvcnRzID4gQUZFX0dST1VQX0RFVklDRV9OVU1fUE9SVFMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgR3JvdXAgTnVtIFBvcnRzICVkIGdyZWF0ZXIgdGhhbiBNYXggJWRcbiIsCi0JCQlfX2Z1bmNfXywgbnVtX3RkbV9ncm91cF9wb3J0cywKLQkJCUFGRV9HUk9VUF9ERVZJQ0VfTlVNX1BPUlRTKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHJ0bjsKLQl9Ci0KLQlwb3J0X2lkX2FycmF5ID0gb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1ncm91cC1wb3J0LWlkIiwKLQkJJmFycmF5X2xlbmd0aCk7Ci0JaWYgKHBvcnRfaWRfYXJyYXkgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBwb3J0X2lkX2FycmF5IGlzIG5vdCB2YWxpZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHJ0bjsKLQl9Ci0JaWYgKGFycmF5X2xlbmd0aCAhPSBzaXplb2YodWludDMyX3QpICogbnVtX3RkbV9ncm91cF9wb3J0cykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBhcnJheV9sZW5ndGggaXMgJWQsIGV4cGVjdGVkIGlzICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBhcnJheV9sZW5ndGgsCi0JCQlzaXplb2YodWludDMyX3QpICogbnVtX3RkbV9ncm91cF9wb3J0cyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBydG47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV90ZG1fZ3JvdXBfcG9ydHM7IGkrKykKLQkJdGRtX2dyb3VwX2NmZy5wb3J0X2lkW2ldID0KLQkJCSh1MTYpYmUzMl90b19jcHUocG9ydF9pZF9hcnJheVtpXSk7Ci0JLyogVW51c2VkIGluZGV4IHNob3VsZCBiZSBmaWxsZWQgd2l0aCAwIG9yIEFGRV9QT1JUX0lOVkFMSUQgKi8KLQlmb3IgKGkgPSBudW1fdGRtX2dyb3VwX3BvcnRzOyBpIDwgQUZFX0dST1VQX0RFVklDRV9OVU1fUE9SVFM7IGkrKykKLQkJdGRtX2dyb3VwX2NmZy5wb3J0X2lkW2ldID0KLQkJCUFGRV9QT1JUX0lOVkFMSUQ7Ci0KLQkvKiBleHRyYWN0IHRkbSBjbGsgaW5mbyBpbnRvIHN0YXRpYyAqLwotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLWNsay1yYXRlIiwKLQkJJnRkbV9jbGtfc2V0LmNsa19mcmVxX2luX2h6KTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENsayBSYXRlIGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstcmF0ZSIpOwotCQlnb3RvIHJ0bjsKLQl9Ci0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IENsayBSYXRlIGZyb20gRFQgZmlsZSAlZFxuIiwKLQkJX19mdW5jX18sIHRkbV9jbGtfc2V0LmNsa19mcmVxX2luX2h6KTsKLQotCS8qIGV4dHJhY3QgdGRtIGNsayBzcmMgbWFzdGVyL3NsYXZlIGluZm8gaW50byBzdGF0aWMgKi8KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstaW50ZXJuYWwiLAotCQkmY2xrX21vZGUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogQ2xrIGlkIGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1jbGstaW50ZXJuYWwiKTsKLQkJZ290byBydG47Ci0JfQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBDbGsgaWQgZnJvbSBEVCBmaWxlICVkXG4iLAotCQlfX2Z1bmNfXywgY2xrX21vZGUpOwotCi0JcmMgPSBtc21fZGFpX3E2X3RkbV9zZXRfY2xrX3BhcmFtKHRkbV9ncm91cF9jZmcuZ3JvdXBfaWQsCi0JCQkJCSAgJnRkbV9jbGtfc2V0LCBjbGtfbW9kZSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBncm91cCBpZCBub3Qgc3VwcG9ydGVkIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgdGRtX2dyb3VwX2NmZy5ncm91cF9pZCk7Ci0JCWdvdG8gcnRuOwotCX0KLQotCS8qIG90aGVyIGluaXRpYWxpemF0aW9ucyB3aXRoaW4gZGV2aWNlIGdyb3VwICovCi0JZ3JvdXBfaWR4ID0gbXNtX2RhaV9xNl9nZXRfZ3JvdXBfaWR4KHRkbV9ncm91cF9jZmcuZ3JvdXBfaWQpOwotCWlmIChncm91cF9pZHggPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBncm91cCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgdGRtX2dyb3VwX2NmZy5ncm91cF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBydG47Ci0JfQotCWF0b21pY19zZXQoJnRkbV9ncm91cF9yZWZbZ3JvdXBfaWR4XSwgMCk7Ci0KLQkvKiBwcm9iZSBjaGlsZCBub2RlIGluZm8gKi8KLQlyYyA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBhZGQgY2hpbGQgbm9kZXMsIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBydG47Ci0JfSBlbHNlCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBhZGRlZCBjaGlsZCBub2RlXG4iLCBfX2Z1bmNfXyk7Ci0KLXJ0bjoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV90ZG1fcTZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9kYWlfdGRtX2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktdGRtIiwgfSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV90ZG1fZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3RkbV9xNiA9IHsKLQkucHJvYmUgID0gbXNtX2RhaV90ZG1fcTZfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9kYWlfdGRtX3E2X3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tZGFpLXRkbSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3RkbV9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmRhdGFfZm9ybWF0ID0gQUZFX0xJTkVBUl9QQ01fREFUQTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmRhdGFfZm9ybWF0ID0gQUZFX05PTl9MSU5FQVJfREFUQTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmRhdGFfZm9ybWF0ID0gQUZFX0dFTkVSSUNfQ09NUFJFU1NFRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZGF0YV9mb3JtYXQgaW52YWxpZFxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBkYXRhX2Zvcm1hdCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5kYXRhX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQlkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmRhdGFfZm9ybWF0OwotCXByX2RlYnVnKCIlczogZGF0YV9mb3JtYXQgPSAlZFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uZGF0YV9mb3JtYXQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKLQlpbnQgdmFsdWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJfdHlwZSA9IHZhbHVlOwotCXByX2RlYnVnKCIlczogaGVhZGVyX3R5cGUgPSAlZFxuIiwKLQkJX19mdW5jX18sCi0JCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJfdHlwZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQlkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXIuaGVhZGVyX3R5cGU7Ci0JcHJfZGVidWcoIiVzOiBoZWFkZXJfdHlwZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywKLQkJZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcl90eXBlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCWludCBpID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBBRkVfQ1VTVE9NX1RETV9IRUFERVJfTUFYX0NOVDsgaSsrKSB7Ci0JCWRhaV9kYXRhLT5wb3J0X2NmZy5jdXN0b21fdGRtX2hlYWRlci5oZWFkZXJbaV0gPQotCQkJKHUxNil1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKLQkJcHJfZGVidWcoIiVzOiBoZWFkZXIgIyVkID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBpLAotCQkJZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcltpXSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaW50IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFGRV9DVVNUT01fVERNX0hFQURFUl9NQVhfQ05UOyBpKyspIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPQotCQkJZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcltpXTsKLQkJcHJfZGVidWcoIiVzOiBoZWFkZXIgIyVkID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBpLAotCQkJZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyLmhlYWRlcltpXSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGRtX2NvbmZpZ19jb250cm9sc19kYXRhX2Zvcm1hdFtdID0gewotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfNCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfNyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8xIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzMgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF80IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzYgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF83IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8yIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF81IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfNCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfNyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfNSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8xIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzIgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF80IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzUgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF83IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8yIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzMgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfNCBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF81IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzYgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfNyBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8wIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzEgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMiBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8zIERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzQgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfNSBEYXRhIEZvcm1hdCIsIHRkbV9jb25maWdfZW51bVswXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2RhdGFfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF82IERhdGEgRm9ybWF0IiwgdGRtX2NvbmZpZ19lbnVtWzBdLAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1fZGF0YV9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzcgRGF0YSBGb3JtYXQiLCB0ZG1fY29uZmlnX2VudW1bMF0sCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9kYXRhX2Zvcm1hdF9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRkbV9jb25maWdfY29udHJvbHNfaGVhZGVyX3R5cGVbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzEgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzQgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9SWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzcgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfMSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzIgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8zIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzUgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF82IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fVFhfNyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfNSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1JYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzEgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzQgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9UWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzcgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzIgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1JYXzUgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfMSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8yIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzMgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF81IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzYgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fVFhfNyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzEgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfMiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8zIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzQgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fUlhfNSBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF82IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzcgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF8xIEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzIgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMyBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF80IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzUgSGVhZGVyIFR5cGUiLCB0ZG1fY29uZmlnX2VudW1bMV0sCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfdHlwZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfNiBIZWFkZXIgVHlwZSIsIHRkbV9jb25maWdfZW51bVsxXSwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl90eXBlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9UWF83IEhlYWRlciBUeXBlIiwgdGRtX2NvbmZpZ19lbnVtWzFdLAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3R5cGVfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZG1fY29uZmlnX2NvbnRyb2xzX2hlYWRlcltdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1JYXzAgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF8xIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fUlhfMiBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1JYXzMgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF80IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fUlhfNSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1JYXzYgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9SWF83IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fVFhfMCBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzEgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9UWF8yIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fVFhfMyBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzQgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUFJJX1RETV9UWF81IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlBSSV9URE1fVFhfNiBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQUklfVERNX1RYXzcgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9SWF8wIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfMSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1JYXzIgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9SWF8zIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfNCBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1JYXzUgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9SWF82IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fUlhfNyBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1RYXzAgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF8xIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fVFhfMiBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1RYXzMgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF80IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlNFQ19URE1fVFhfNSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTRUNfVERNX1RYXzYgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiU0VDX1RETV9UWF83IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzAgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fUlhfMSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9SWF8yIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzMgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fUlhfNCBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9SWF81IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1JYXzYgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fUlhfNyBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF8wIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1RYXzEgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fVFhfMiBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF8zIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1RYXzQgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVEVSVF9URE1fVFhfNSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJURVJUX1RETV9UWF82IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlRFUlRfVERNX1RYXzcgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfMCBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9SWF8xIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1JYXzIgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfMyBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9SWF80IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1JYXzUgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fUlhfNiBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9SWF83IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzAgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fVFhfMSBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9UWF8yIEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzMgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fVFhfNCBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJRVUFUX1RETV9UWF81IEhlYWRlciIsCi0JCQlTTkRfU09DX05PUE0sIDAsIDB4RkZGRkZGRkYsIDAsIDgsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfZ2V0LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlFVQVRfVERNX1RYXzYgSGVhZGVyIiwKLQkJCVNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwgMCwgOCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9nZXQsCi0JCQltc21fZGFpX3E2X3RkbV9oZWFkZXJfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiUVVBVF9URE1fVFhfNyBIZWFkZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLCAwLCA4LAotCQkJbXNtX2RhaV9xNl90ZG1faGVhZGVyX2dldCwKLQkJCW1zbV9kYWlfcTZfdGRtX2hlYWRlcl9wdXQpLAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9zZXRfY2xrKAotCQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhLAotCQl1MTYgcG9ydF9pZCwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJjID0gMDsKLQotCWRhaV9kYXRhLT5jbGtfc2V0LmVuYWJsZSA9IGVuYWJsZTsKLQotCXJjID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAotCQkmZGFpX2RhdGEtPmNsa19zZXQpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICp0ZG1fZGFpX2RhdGEgPQotCQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICpkYXRhX2Zvcm1hdF9rY29udHJvbCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqaGVhZGVyX3R5cGVfa2NvbnRyb2wgPSBOVUxMOwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmhlYWRlcl9rY29udHJvbCA9IE5VTEw7Ci0JaW50IHBvcnRfaWR4ID0gMDsKLQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqZGF0YV9mb3JtYXRfY3RybCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmhlYWRlcl90eXBlX2N0cmwgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpoZWFkZXJfY3RybCA9IE5VTEw7Ci0KLQltc21fZGFpX3E2X3NldF9kYWlfaWQoZGFpKTsKLQotCXBvcnRfaWR4ID0gbXNtX2RhaV9xNl9nZXRfcG9ydF9pZHgoZGFpLT5pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMgcG9ydCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBydG47Ci0JfQotCi0JZGF0YV9mb3JtYXRfY3RybCA9Ci0JCSZ0ZG1fY29uZmlnX2NvbnRyb2xzX2RhdGFfZm9ybWF0W3BvcnRfaWR4XTsKLQloZWFkZXJfdHlwZV9jdHJsID0KLQkJJnRkbV9jb25maWdfY29udHJvbHNfaGVhZGVyX3R5cGVbcG9ydF9pZHhdOwotCWhlYWRlcl9jdHJsID0KLQkJJnRkbV9jb25maWdfY29udHJvbHNfaGVhZGVyW3BvcnRfaWR4XTsKLQotCWlmIChkYXRhX2Zvcm1hdF9jdHJsKSB7Ci0JCWRhdGFfZm9ybWF0X2tjb250cm9sID0gc25kX2N0bF9uZXcxKGRhdGFfZm9ybWF0X2N0cmwsCi0JCQkJCXRkbV9kYWlfZGF0YSk7Ci0JCXJjID0gc25kX2N0bF9hZGQoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCSBkYXRhX2Zvcm1hdF9rY29udHJvbCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBkYXRhIGZvcm1hdCBjdHJsIERBSSA9ICVzXG4iLAotCQkJCV9fZnVuY19fLCBkYWktPm5hbWUpOwotCQkJZ290byBydG47Ci0JCX0KLQl9Ci0KLQlpZiAoaGVhZGVyX3R5cGVfY3RybCkgewotCQloZWFkZXJfdHlwZV9rY29udHJvbCA9IHNuZF9jdGxfbmV3MShoZWFkZXJfdHlwZV9jdHJsLAotCQkJCQl0ZG1fZGFpX2RhdGEpOwotCQlyYyA9IHNuZF9jdGxfYWRkKGRhaS0+Y29tcG9uZW50LT5jYXJkLT5zbmRfY2FyZCwKLQkJCQkgaGVhZGVyX3R5cGVfa2NvbnRyb2wpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlpZiAoZGF0YV9mb3JtYXRfa2NvbnRyb2wpCi0JCQkJc25kX2N0bF9yZW1vdmUoZGFpLT5jb21wb25lbnQtPmNhcmQtPnNuZF9jYXJkLAotCQkJCQlkYXRhX2Zvcm1hdF9rY29udHJvbCk7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGVyciBhZGQgaGVhZGVyIHR5cGUgY3RybCBEQUkgPSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JfQotCi0JaWYgKGhlYWRlcl9jdHJsKSB7Ci0JCWhlYWRlcl9rY29udHJvbCA9IHNuZF9jdGxfbmV3MShoZWFkZXJfY3RybCwKLQkJCQkJdGRtX2RhaV9kYXRhKTsKLQkJcmMgPSBzbmRfY3RsX2FkZChkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJIGhlYWRlcl9rY29udHJvbCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWlmIChoZWFkZXJfdHlwZV9rY29udHJvbCkKLQkJCQlzbmRfY3RsX3JlbW92ZShkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJCWhlYWRlcl90eXBlX2tjb250cm9sKTsKLQkJCWlmIChkYXRhX2Zvcm1hdF9rY29udHJvbCkKLQkJCQlzbmRfY3RsX3JlbW92ZShkYWktPmNvbXBvbmVudC0+Y2FyZC0+c25kX2NhcmQsCi0JCQkJCWRhdGFfZm9ybWF0X2tjb250cm9sKTsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZXJyIGFkZCBoZWFkZXIgY3RybCBEQUkgPSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgZGFpLT5uYW1lKTsKLQkJCWdvdG8gcnRuOwotCQl9Ci0JfQotCi0JcmMgPSBtc21fZGFpX3E2X2RhaV9hZGRfcm91dGUoZGFpKTsKLQotcnRuOgotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKnRkbV9kYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0JdTE2IGdyb3VwX2lkID0gdGRtX2RhaV9kYXRhLT5ncm91cF9jZmcudGRtX2NmZy5ncm91cF9pZDsKLQlpbnQgZ3JvdXBfaWR4ID0gMDsKLQlhdG9taWNfdCAqZ3JvdXBfcmVmID0gTlVMTDsKLQotCWdyb3VwX2lkeCA9IG1zbV9kYWlfcTZfZ2V0X2dyb3VwX2lkeChkYWktPmlkKTsKLQlpZiAoZ3JvdXBfaWR4IDwgMCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMgcG9ydCBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWdyb3VwX3JlZiA9ICZ0ZG1fZ3JvdXBfcmVmW2dyb3VwX2lkeF07Ci0KLQkvKiBJZiBBRkUgcG9ydCBpcyBzdGlsbCB1cCwgY2xvc2UgaXQgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgdGRtX2RhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcmMgPSBhZmVfY2xvc2UoZGFpLT5pZCk7IC8qIGNhbiBibG9jayAqLwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGZhaWwgdG8gY2xvc2UgQUZFIHBvcnQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCX0KLQkJYXRvbWljX2RlYyhncm91cF9yZWYpOwotCQljbGVhcl9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwKLQkJCSAgdGRtX2RhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci0KLQkJaWYgKGF0b21pY19yZWFkKGdyb3VwX3JlZikgPT0gMCkgewotCQkJcmMgPSBhZmVfcG9ydF9ncm91cF9lbmFibGUoZ3JvdXBfaWQsCi0JCQkJTlVMTCwgZmFsc2UpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCWRldl9lcnIoZGFpLT5kZXYsICJmYWlsIHRvIGRpc2FibGUgQUZFIGdyb3VwIDB4JXhcbiIsCi0JCQkJCWdyb3VwX2lkKTsKLQkJCX0KLQkJCXJjID0gbXNtX2RhaV9xNl90ZG1fc2V0X2Nsayh0ZG1fZGFpX2RhdGEsCi0JCQkJZGFpLT5pZCwgZmFsc2UpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBkaXNhYmxlIEFGRSBjbGsgMHgleFxuIiwKLQkJCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCXVuc2lnbmVkIGludCB0eF9tYXNrLAotCQkJCXVuc2lnbmVkIGludCByeF9tYXNrLAotCQkJCWludCBzbG90cywgaW50IHNsb3Rfd2lkdGgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KLQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2dyb3VwX2RldmljZV90ZG1fY2ZnICp0ZG1fZ3JvdXAgPQotCQkmZGFpX2RhdGEtPmdyb3VwX2NmZy50ZG1fY2ZnOwotCXVuc2lnbmVkIGludCBjYXBfbWFzazsKLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOwotCi0JLyogSFcgb25seSBzdXBwb3J0cyAxNiBhbmQgMzIgYml0IHNsb3Qgd2lkdGggY29uZmlndXJhdGlvbiAqLwotCWlmICgoc2xvdF93aWR0aCAhPSAxNikgJiYgKHNsb3Rfd2lkdGggIT0gMzIpKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBzbG90X3dpZHRoICVkXG4iLAotCQkJX19mdW5jX18sIHNsb3Rfd2lkdGgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBIVyBvbmx5IHN1cHBvcnRzIDE2IGFuZCA4IHNsb3RzIGNvbmZpZ3VyYXRpb24gKi8KLQlzd2l0Y2ggKHNsb3RzKSB7Ci0JY2FzZSAyOgotCQljYXBfbWFzayA9IDB4MDM7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJY2FwX21hc2sgPSAweEZGOwotCQlicmVhazsKLQljYXNlIDE2OgotCQljYXBfbWFzayA9IDB4RkZGRjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIHNsb3RzICVkXG4iLAotCQkJX19mdW5jX18sIHNsb3RzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChkYWktPmlkKSB7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JCXRkbV9ncm91cC0+bnNsb3RzX3Blcl9mcmFtZSA9IHNsb3RzOwotCQl0ZG1fZ3JvdXAtPnNsb3Rfd2lkdGggPSBzbG90X3dpZHRoOwotCQl0ZG1fZ3JvdXAtPnNsb3RfbWFzayA9IHJ4X21hc2sgJiBjYXBfbWFzazsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6Ci0JCXRkbV9ncm91cC0+bnNsb3RzX3Blcl9mcmFtZSA9IHNsb3RzOwotCQl0ZG1fZ3JvdXAtPnNsb3Rfd2lkdGggPSBzbG90X3dpZHRoOwotCQl0ZG1fZ3JvdXAtPnNsb3RfbWFzayA9IHR4X21hc2sgJiBjYXBfbWFzazsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIGRhaSBpZCAweCV4XG4iLAotCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fc2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCXVuc2lnbmVkIGludCB0eF9udW0sIHVuc2lnbmVkIGludCAqdHhfc2xvdCwKLQkJCQl1bnNpZ25lZCBpbnQgcnhfbnVtLCB1bnNpZ25lZCBpbnQgKnJ4X3Nsb3QpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KLQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX3Nsb3RfbWFwcGluZ19jZmcgKnNsb3RfbWFwcGluZyA9Ci0JCSZkYWlfZGF0YS0+cG9ydF9jZmcuc2xvdF9tYXBwaW5nOwotCWludCBpID0gMDsKLQotCWRldl9kYmcoZGFpLT5kZXYsICIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGRhaS0+aWQpOwotCi0Jc3dpdGNoIChkYWktPmlkKSB7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JCWlmICghcnhfc2xvdCkgewotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiByeCBzbG90IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHJ4X251bSA+IEFGRV9QT1JUX01BWF9BVURJT19DSEFOX0NOVCkgewotCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBpbnZhbGlkIHJ4IG51bSAlZFxuIiwgX19mdW5jX18sCi0JCQkJcnhfbnVtKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IHJ4X251bTsgaSsrKQotCQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbaV0gPSByeF9zbG90W2ldOwotCQlmb3IgKGkgPSByeF9udW07IGkgPCBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQ7IGkrKykKLQkJCXNsb3RfbWFwcGluZy0+b2Zmc2V0W2ldID0KLQkJCQlBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEOwotCi0JCXNsb3RfbWFwcGluZy0+bnVtX2NoYW5uZWwgPSByeF9udW07Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgotCQlpZiAoIXR4X3Nsb3QpIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogdHggc2xvdCBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0eF9udW0gPiBBRkVfUE9SVF9NQVhfQVVESU9fQ0hBTl9DTlQpIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCB0eCBudW0gJWRcbiIsIF9fZnVuY19fLAotCQkJCXR4X251bSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCB0eF9udW07IGkrKykKLQkJCXNsb3RfbWFwcGluZy0+b2Zmc2V0W2ldID0gdHhfc2xvdFtpXTsKLQkJZm9yIChpID0gdHhfbnVtOyBpIDwgQUZFX1BPUlRfTUFYX0FVRElPX0NIQU5fQ05UOyBpKyspCi0JCQlzbG90X21hcHBpbmctPm9mZnNldFtpXSA9Ci0JCQkJQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRDsKLQotCQlzbG90X21hcHBpbmctPm51bV9jaGFubmVsID0gdHhfbnVtOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgZGFpIGlkIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0KLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2dyb3VwX2RldmljZV90ZG1fY2ZnICp0ZG1fZ3JvdXAgPQotCQkmZGFpX2RhdGEtPmdyb3VwX2NmZy50ZG1fY2ZnOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfdGRtX2NmZyAqdGRtID0KLQkJJmRhaV9kYXRhLT5wb3J0X2NmZy50ZG07Ci0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zbG90X21hcHBpbmdfY2ZnICpzbG90X21hcHBpbmcgPQotCQkmZGFpX2RhdGEtPnBvcnRfY2ZnLnNsb3RfbWFwcGluZzsKLQlzdHJ1Y3QgYWZlX3BhcmFtX2lkX2N1c3RvbV90ZG1faGVhZGVyX2NmZyAqY3VzdG9tX3RkbV9oZWFkZXIgPQotCQkmZGFpX2RhdGEtPnBvcnRfY2ZnLmN1c3RvbV90ZG1faGVhZGVyOwotCi0JcHJfZGVidWcoIiVzOiBkZXZfbmFtZTogJXNcbiIsCi0JCV9fZnVuY19fLCBkZXZfbmFtZShkYWktPmRldikpOwotCi0JaWYgKChwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSA9PSAwKSB8fAotCQkocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykgPiA4KSkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgcGFyYW0gY2hhbm5lbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQlkYWlfZGF0YS0+Yml0d2lkdGggPSAxNjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJZGFpX2RhdGEtPmJpdHdpZHRoID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWRhaV9kYXRhLT5iaXR3aWR0aCA9IDMyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgcGFyYW0gZm9ybWF0IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRhaV9kYXRhLT5jaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWRhaV9kYXRhLT5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQotCS8qCi0JICogdXBkYXRlIHRkbSBncm91cCBjb25maWcgcGFyYW0KLQkgKiBOT1RFOiBncm91cCBjb25maWcgaXMgc2V0IHRvIHRoZSBzYW1lIGFzIHNsb3QgY29uZmlnLgotCSAqLwotCXRkbV9ncm91cC0+Yml0X3dpZHRoID0gdGRtX2dyb3VwLT5zbG90X3dpZHRoOwotCXRkbV9ncm91cC0+bnVtX2NoYW5uZWxzID0gdGRtX2dyb3VwLT5uc2xvdHNfcGVyX2ZyYW1lOwotCXRkbV9ncm91cC0+c2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQotCXByX2RlYnVnKCIlczogVERNIEdST1VQOlxuIgotCQkibnVtX2NoYW5uZWxzPSVkIHNhbXBsZV9yYXRlPSVkIGJpdF93aWR0aD0lZFxuIgotCQkibnNsb3RzX3Blcl9mcmFtZT0lZCBzbG90X3dpZHRoPSVkIHNsb3RfbWFzaz0weCV4XG4iLAotCQlfX2Z1bmNfXywKLQkJdGRtX2dyb3VwLT5udW1fY2hhbm5lbHMsCi0JCXRkbV9ncm91cC0+c2FtcGxlX3JhdGUsCi0JCXRkbV9ncm91cC0+Yml0X3dpZHRoLAotCQl0ZG1fZ3JvdXAtPm5zbG90c19wZXJfZnJhbWUsCi0JCXRkbV9ncm91cC0+c2xvdF93aWR0aCwKLQkJdGRtX2dyb3VwLT5zbG90X21hc2spOwotCXByX2RlYnVnKCIlczogVERNIEdST1VQOlxuIgotCQkicG9ydF9pZFswXT0weCV4IHBvcnRfaWRbMV09MHgleCBwb3J0X2lkWzJdPTB4JXggcG9ydF9pZFszXT0weCV4XG4iCi0JCSJwb3J0X2lkWzRdPTB4JXggcG9ydF9pZFs1XT0weCV4IHBvcnRfaWRbNl09MHgleCBwb3J0X2lkWzddPTB4JXhcbiIsCi0JCV9fZnVuY19fLAotCQl0ZG1fZ3JvdXAtPnBvcnRfaWRbMF0sCi0JCXRkbV9ncm91cC0+cG9ydF9pZFsxXSwKLQkJdGRtX2dyb3VwLT5wb3J0X2lkWzJdLAotCQl0ZG1fZ3JvdXAtPnBvcnRfaWRbM10sCi0JCXRkbV9ncm91cC0+cG9ydF9pZFs0XSwKLQkJdGRtX2dyb3VwLT5wb3J0X2lkWzVdLAotCQl0ZG1fZ3JvdXAtPnBvcnRfaWRbNl0sCi0JCXRkbV9ncm91cC0+cG9ydF9pZFs3XSk7Ci0KLQkvKgotCSAqIHVwZGF0ZSB0ZG0gY29uZmlnIHBhcmFtCi0JICogTk9URTogY2hhbm5lbHMvcmF0ZS9iaXR3aWR0aCBhcmUgcGVyIHN0cmVhbSBwcm9wZXJ0eQotCSAqLwotCXRkbS0+bnVtX2NoYW5uZWxzID0gZGFpX2RhdGEtPmNoYW5uZWxzOwotCXRkbS0+c2FtcGxlX3JhdGUgPSBkYWlfZGF0YS0+cmF0ZTsKLQl0ZG0tPmJpdF93aWR0aCA9IGRhaV9kYXRhLT5iaXR3aWR0aDsKLQkvKgotCSAqIHBvcnQgc2xvdCBjb25maWcgaXMgdGhlIHNhbWUgYXMgZ3JvdXAgc2xvdCBjb25maWcKLQkgKiBwb3J0IHNsb3QgbWFzayBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBvZmZzZXQKLQkgKi8KLQl0ZG0tPm5zbG90c19wZXJfZnJhbWUgPSB0ZG1fZ3JvdXAtPm5zbG90c19wZXJfZnJhbWU7Ci0JdGRtLT5zbG90X3dpZHRoID0gdGRtX2dyb3VwLT5zbG90X3dpZHRoOwotCXRkbS0+c2xvdF9tYXNrID0gdGRtX2dyb3VwLT5zbG90X21hc2s7Ci0KLQlwcl9kZWJ1ZygiJXM6IFRETTpcbiIKLQkJIm51bV9jaGFubmVscz0lZCBzYW1wbGVfcmF0ZT0lZCBiaXRfd2lkdGg9JWRcbiIKLQkJIm5zbG90c19wZXJfZnJhbWU9JWQgc2xvdF93aWR0aD0lZCBzbG90X21hc2s9MHgleFxuIgotCQkiZGF0YV9mb3JtYXQ9MHgleCBzeW5jX21vZGU9MHgleCBzeW5jX3NyYz0weCV4XG4iCi0JCSJkYXRhX291dD0weCV4IGludmVydF9zeW5jPTB4JXggZGF0YV9kZWxheT0weCV4XG4iLAotCQlfX2Z1bmNfXywKLQkJdGRtLT5udW1fY2hhbm5lbHMsCi0JCXRkbS0+c2FtcGxlX3JhdGUsCi0JCXRkbS0+Yml0X3dpZHRoLAotCQl0ZG0tPm5zbG90c19wZXJfZnJhbWUsCi0JCXRkbS0+c2xvdF93aWR0aCwKLQkJdGRtLT5zbG90X21hc2ssCi0JCXRkbS0+ZGF0YV9mb3JtYXQsCi0JCXRkbS0+c3luY19tb2RlLAotCQl0ZG0tPnN5bmNfc3JjLAotCQl0ZG0tPmN0cmxfZGF0YV9vdXRfZW5hYmxlLAotCQl0ZG0tPmN0cmxfaW52ZXJ0X3N5bmNfcHVsc2UsCi0JCXRkbS0+Y3RybF9zeW5jX2RhdGFfZGVsYXkpOwotCi0JLyoKLQkgKiB1cGRhdGUgc2xvdCBtYXBwaW5nIGNvbmZpZyBwYXJhbQotCSAqIE5PVEU6IGNoYW5uZWxzL3JhdGUvYml0d2lkdGggYXJlIHBlciBzdHJlYW0gcHJvcGVydHkKLQkgKi8KLQlzbG90X21hcHBpbmctPmJpdHdpZHRoID0gZGFpX2RhdGEtPmJpdHdpZHRoOwotCi0JcHJfZGVidWcoIiVzOiBTTE9UIE1BUFBJTkc6XG4iCi0JCSJudW1fY2hhbm5lbD0lZCBiaXR3aWR0aD0lZCBkYXRhX2FsaWduPTB4JXhcbiIsCi0JCV9fZnVuY19fLAotCQlzbG90X21hcHBpbmctPm51bV9jaGFubmVsLAotCQlzbG90X21hcHBpbmctPmJpdHdpZHRoLAotCQlzbG90X21hcHBpbmctPmRhdGFfYWxpZ25fdHlwZSk7Ci0JcHJfZGVidWcoIiVzOiBTTE9UIE1BUFBJTkc6XG4iCi0JCSJvZmZzZXRbMF09MHgleCBvZmZzZXRbMV09MHgleCBvZmZzZXRbMl09MHgleCBvZmZzZXRbM109MHgleFxuIgotCQkib2Zmc2V0WzRdPTB4JXggb2Zmc2V0WzVdPTB4JXggb2Zmc2V0WzZdPTB4JXggb2Zmc2V0WzddPTB4JXhcbiIsCi0JCV9fZnVuY19fLAotCQlzbG90X21hcHBpbmctPm9mZnNldFswXSwKLQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbMV0sCi0JCXNsb3RfbWFwcGluZy0+b2Zmc2V0WzJdLAotCQlzbG90X21hcHBpbmctPm9mZnNldFszXSwKLQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbNF0sCi0JCXNsb3RfbWFwcGluZy0+b2Zmc2V0WzVdLAotCQlzbG90X21hcHBpbmctPm9mZnNldFs2XSwKLQkJc2xvdF9tYXBwaW5nLT5vZmZzZXRbN10pOwotCi0JLyoKLQkgKiB1cGRhdGUgY3VzdG9tIGhlYWRlciBjb25maWcgcGFyYW0KLQkgKiBOT1RFOiBjaGFubmVscy9yYXRlL2JpdHdpZHRoIGFyZSBwZXIgcGxheWJhY2sgc3RyZWFtIHByb3BlcnR5LgotCSAqIGN1c3RvbSB0ZG0gaGVhZGVyIG9ubHkgYXBwbGljYWJsZSB0byBwbGF5YmFjayBzdHJlYW0uCi0JICovCi0JaWYgKGN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJfdHlwZSAhPQotCQlBRkVfQ1VTVE9NX1RETV9IRUFERVJfVFlQRV9JTlZBTElEKSB7Ci0JCXByX2RlYnVnKCIlczogQ1VTVE9NIFRETSBIRUFERVI6XG4iCi0JCQkic3RhcnRfb2Zmc2V0PTB4JXggaGVhZGVyX3dpZHRoPSVkXG4iCi0JCQkibnVtX2ZyYW1lX3JlcGVhdD0lZCBoZWFkZXJfdHlwZT0weCV4XG4iLAotCQkJX19mdW5jX18sCi0JCQljdXN0b21fdGRtX2hlYWRlci0+c3RhcnRfb2Zmc2V0LAotCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl93aWR0aCwKLQkJCWN1c3RvbV90ZG1faGVhZGVyLT5udW1fZnJhbWVfcmVwZWF0LAotCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl90eXBlKTsKLQkJcHJfZGVidWcoIiVzOiBDVVNUT00gVERNIEhFQURFUjpcbiIKLQkJCSJoZWFkZXJbMF09MHgleCBoZWFkZXJbMV09MHgleCBoZWFkZXJbMl09MHgleCBoZWFkZXJbM109MHgleFxuIgotCQkJImhlYWRlcls0XT0weCV4IGhlYWRlcls1XT0weCV4IGhlYWRlcls2XT0weCV4IGhlYWRlcls3XT0weCV4XG4iLAotCQkJX19mdW5jX18sCi0JCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzBdLAotCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlclsxXSwKLQkJCWN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJbMl0sCi0JCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzNdLAotCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcls0XSwKLQkJCWN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJbNV0sCi0JCQljdXN0b21fdGRtX2hlYWRlci0+aGVhZGVyWzZdLAotCQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcls3XSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9xNl90ZG1fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEgKmRhaV9kYXRhID0KLQkJZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQl1MTYgZ3JvdXBfaWQgPSBkYWlfZGF0YS0+Z3JvdXBfY2ZnLnRkbV9jZmcuZ3JvdXBfaWQ7Ci0JaW50IGdyb3VwX2lkeCA9IDA7Ci0JYXRvbWljX3QgKmdyb3VwX3JlZiA9IE5VTEw7Ci0KLQlncm91cF9pZHggPSBtc21fZGFpX3E2X2dldF9ncm91cF9pZHgoZGFpLT5pZCk7Ci0JaWYgKGdyb3VwX2lkeCA8IDApIHsKLQkJZGV2X2VycihkYWktPmRldiwgIiVzIHBvcnQgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0ZG1fbXV0ZXgpOwotCi0JZ3JvdXBfcmVmID0gJnRkbV9ncm91cF9yZWZbZ3JvdXBfaWR4XTsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1BPUlRfU1RBUlRFRCwgZGFpX2RhdGEtPnN0YXR1c19tYXNrKSkgewotCQkvKiBQT1JUIFNUQVJUIHNob3VsZCBiZSBzZXQgaWYgcHJlcGFyZSBjYWxsZWQKLQkJICogaW4gYWN0aXZlIHN0YXRlLgotCQkgKi8KLQkJaWYgKGF0b21pY19yZWFkKGdyb3VwX3JlZikgPT0gMCkgewotCQkJLyogVFggYW5kIFJYIHNoYXJlIHRoZSBzYW1lIGNsay4KLQkJCSAqIEFGRSBjbGsgaXMgZW5hYmxlZCBwZXIgZ3JvdXAgdG8gc2ltcGxpZnkgdGhlIGxvZ2ljLgotCQkJICogRFNQIHdpbGwgbW9uaXRvciB0aGUgY2xrIGNvdW50LgotCQkJICovCi0JCQlyYyA9IG1zbV9kYWlfcTZfdGRtX3NldF9jbGsoZGFpX2RhdGEsCi0JCQkJZGFpLT5pZCwgdHJ1ZSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGVuYWJsZSBBRkUgY2xrIDB4JXhcbiIsCi0JCQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJCQlnb3RvIHJ0bjsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIGlmIG9ubHkgb25lIHBvcnQsIGRvbid0IGRvIGdyb3VwIGVuYWJsZSBhcyB0aGVyZQotCQkJICogaXMgbm8gZ3JvdXAgbmVlZCBmb3Igb25seSBvbmUgcG9ydAotCQkJICovCi0JCQlpZiAoZGFpX2RhdGEtPm51bV9ncm91cF9wb3J0cyA+IDEpIHsKLQkJCQlyYyA9IGFmZV9wb3J0X2dyb3VwX2VuYWJsZShncm91cF9pZCwKLQkJCQkJJmRhaV9kYXRhLT5ncm91cF9jZmcsIHRydWUpOwotCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJZGV2X2VycihkYWktPmRldiwKLQkJCQkJIiVzOiBmYWlsIHRvIGVuYWJsZSBBRkUgZ3JvdXAgMHgleFxuIiwKLQkJCQkJX19mdW5jX18sIGdyb3VwX2lkKTsKLQkJCQkJZ290byBydG47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmMgPSBhZmVfdGRtX3BvcnRfc3RhcnQoZGFpLT5pZCwgJmRhaV9kYXRhLT5wb3J0X2NmZywKLQkJCWRhaV9kYXRhLT5yYXRlLCBkYWlfZGF0YS0+bnVtX2dyb3VwX3BvcnRzKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJaWYgKGF0b21pY19yZWFkKGdyb3VwX3JlZikgPT0gMCkgewotCQkJCWFmZV9wb3J0X2dyb3VwX2VuYWJsZShncm91cF9pZCwKLQkJCQkJTlVMTCwgZmFsc2UpOwotCQkJCW1zbV9kYWlfcTZfdGRtX3NldF9jbGsoZGFpX2RhdGEsCi0JCQkJCWRhaS0+aWQsIGZhbHNlKTsKLQkJCX0KLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBvcGVuIEFGRSBwb3J0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQl9IGVsc2UgewotCQkJc2V0X2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCQkJCWRhaV9kYXRhLT5zdGF0dXNfbWFzayk7Ci0JCQlhdG9taWNfaW5jKGdyb3VwX3JlZik7Ci0JCX0KLQotCQkvKiBUT0RPOiBuZWVkIHRvIG1vbml0b3IgUENNL01JMlMvVERNIEhXIHN0YXR1cyAqLwotCQkvKiBOT1RFOiBBRkUgc2hvdWxkIGVycm9yIG91dCBpZiBIVyByZXNvdXJjZSBjb250ZW50aW9uICovCi0KLQl9Ci0KLXJ0bjoKLQltdXRleF91bmxvY2soJnRkbV9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZGFpX3E2X3RkbV9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0JdTE2IGdyb3VwX2lkID0gZGFpX2RhdGEtPmdyb3VwX2NmZy50ZG1fY2ZnLmdyb3VwX2lkOwotCWludCBncm91cF9pZHggPSAwOwotCWF0b21pY190ICpncm91cF9yZWYgPSBOVUxMOwotCi0JZ3JvdXBfaWR4ID0gbXNtX2RhaV9xNl9nZXRfZ3JvdXBfaWR4KGRhaS0+aWQpOwotCWlmIChncm91cF9pZHggPCAwKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlcyBwb3J0IGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJnRkbV9tdXRleCk7Ci0KLQlncm91cF9yZWYgPSAmdGRtX2dyb3VwX3JlZltncm91cF9pZHhdOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1JUX1NUQVJURUQsIGRhaV9kYXRhLT5zdGF0dXNfbWFzaykpIHsKLQkJcmMgPSBhZmVfY2xvc2UoZGFpLT5pZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBjbG9zZSBBRkUgcG9ydCAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJfQotCQlhdG9taWNfZGVjKGdyb3VwX3JlZik7Ci0JCWNsZWFyX2JpdChTVEFUVVNfUE9SVF9TVEFSVEVELAotCQkJZGFpX2RhdGEtPnN0YXR1c19tYXNrKTsKLQotCQlpZiAoYXRvbWljX3JlYWQoZ3JvdXBfcmVmKSA9PSAwKSB7Ci0JCQlyYyA9IGFmZV9wb3J0X2dyb3VwX2VuYWJsZShncm91cF9pZCwKLQkJCQlOVUxMLCBmYWxzZSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJZGV2X2VycihkYWktPmRldiwgIiVzOiBmYWlsIHRvIGRpc2FibGUgQUZFIGdyb3VwIDB4JXhcbiIsCi0JCQkJCV9fZnVuY19fLCBncm91cF9pZCk7Ci0JCQl9Ci0JCQlyYyA9IG1zbV9kYWlfcTZfdGRtX3NldF9jbGsoZGFpX2RhdGEsCi0JCQkJZGFpLT5pZCwgZmFsc2UpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCWRldl9lcnIoZGFpLT5kZXYsICIlczogZmFpbCB0byBkaXNhYmxlIEFGRSBjbGsgMHgleFxuIiwKLQkJCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQkJfQotCQl9Ci0KLQkJLyogVE9ETzogbmVlZCB0byBtb25pdG9yIFBDTS9NSTJTL1RETSBIVyBzdGF0dXMgKi8KLQkJLyogTk9URTogQUZFIHNob3VsZCBlcnJvciBvdXQgaWYgSFcgcmVzb3VyY2UgY29udGVudGlvbiAqLwotCi0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ0ZG1fbXV0ZXgpOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3E2X3RkbV9vcHMgPSB7Ci0JLnByZXBhcmUgICAgICAgICAgPSBtc21fZGFpX3E2X3RkbV9wcmVwYXJlLAotCS5od19wYXJhbXMgICAgICAgID0gbXNtX2RhaV9xNl90ZG1faHdfcGFyYW1zLAotCS5zZXRfdGRtX3Nsb3QgICAgID0gbXNtX2RhaV9xNl90ZG1fc2V0X3RkbV9zbG90LAotCS5zZXRfY2hhbm5lbF9tYXAgID0gbXNtX2RhaV9xNl90ZG1fc2V0X2NoYW5uZWxfbWFwLAotCS5zaHV0ZG93biAgICAgICAgID0gbXNtX2RhaV9xNl90ZG1fc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3E2X3RkbV9kYWlbXSA9IHsKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTAgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfMCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTEgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF8yIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0zIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzMiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTQgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNSBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUFJJX1RETV9SWF81IiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE02IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1JYXzYiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzYsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTcgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fUlhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlBSSV9URE1fVFhfMCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzEiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzEsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzIiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzIsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzMiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzQiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzUiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzUsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzYiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzYsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNNyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJQUklfVERNX1RYXzciLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzcsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9SWF8wIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTEgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTIgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMiIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfMyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTQgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTUgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTYgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNiIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTcgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fUlhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzAiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFgsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0xIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzIiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMiwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTMgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF8zIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzMsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE00IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNNSBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJTRUNfVERNX1RYXzUiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTYgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU0VDX1RETV9UWF82IiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzYsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE03IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNFQ19URE1fVFhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMSBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzEsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0yIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF8yIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMiwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTMgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzMiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE01IFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJURVJUX1RETV9SWF81IiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTYgUGxheWJhY2siLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1JYXzYiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNNyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fUlhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzcsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiVEVSVF9URE1fVFhfMCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0xIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzEiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0yIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzIiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0zIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzMiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE00IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzQiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE01IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzUiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE02IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzYiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE03IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlRFUlRfVERNX1RYXzciLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIFBsYXliYWNrIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9SWF8wIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMSBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMiIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMiwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfMyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNCBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNSBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNiBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNiIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNiwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNyBQbGF5YmFjayIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fUlhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzAiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTEgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfMSIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMSwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0yIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzIiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzIsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMyBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF8zIiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zLAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTQgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNCwKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE01IENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlFVQVRfVERNX1RYXzUiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfCBTTkRSVl9QQ01fUkFURV8zNTI4MDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSA4LAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM1MjgwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3E2X3RkbV9vcHMsCi0JCS5pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzUsCi0JCS5wcm9iZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9wcm9iZSwKLQkJLnJlbW92ZSA9IG1zbV9kYWlfcTZfZGFpX3RkbV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNNiBDYXB0dXJlIiwKLQkJCS5haWZfbmFtZSA9ICJRVUFUX1RETV9UWF82IiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMzUyODAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gOCwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSAzNTI4MDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9xNl90ZG1fb3BzLAotCQkuaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82LAotCQkucHJvYmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcHJvYmUsCi0JCS5yZW1vdmUgPSBtc21fZGFpX3E2X2RhaV90ZG1fcmVtb3ZlLAotCX0sCi0JewotCQkuY2FwdHVyZSA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTcgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiUVVBVF9URE1fVFhfNyIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzM1MjgwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDgsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gMzUyODAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfcTZfdGRtX29wcywKLQkJLmlkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNywKLQkJLnByb2JlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3Byb2JlLAotCQkucmVtb3ZlID0gbXNtX2RhaV9xNl9kYWlfdGRtX3JlbW92ZSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbXNtX3E2X3RkbV9kYWlfY29tcG9uZW50ID0gewotCS5uYW1lCQk9ICJtc20tZGFpLXE2LXRkbSIsCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfcTZfdGRtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fZGFpX3E2X3RkbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCXN0cnVjdCBhZmVfcGFyYW1faWRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnICpjdXN0b21fdGRtX2hlYWRlciA9IE5VTEw7Ci0JaW50IHJjID0gMDsKLQl1MzIgdGRtX2Rldl9pZCA9IDA7Ci0JaW50IHBvcnRfaWR4ID0gMDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRkbV9wYXJlbnRfbm9kZSA9IE5VTEw7Ci0KLQkvKiByZXRyaWV2ZSBkZXZpY2UvYWZlIGlkICovCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJInFjb20sbXNtLWNwdWRhaS10ZG0tZGV2LWlkIiwKLQkJJnRkbV9kZXZfaWQpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRGV2aWNlIElEIG1pc3NpbmcgaW4gRFQgZmlsZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBydG47Ci0JfQotCWlmICgodGRtX2Rldl9pZCA8IEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX1NUQVJUKSB8fAotCQkodGRtX2Rldl9pZCA+IEFGRV9QT1JUX0lEX1RETV9QT1JUX1JBTkdFX0VORCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IEludmFsaWQgVERNIERldmljZSBJRCAweCV4IGluIERUIGZpbGVcbiIsCi0JCQlfX2Z1bmNfXywgdGRtX2Rldl9pZCk7Ci0JCXJjID0gLUVOWElPOwotCQlnb3RvIHJ0bjsKLQl9Ci0JcGRldi0+aWQgPSB0ZG1fZGV2X2lkOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBkZXZfbmFtZTogJXMgZGV2X2lkOiAweCV4XG4iLAotCQlfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldiksIHRkbV9kZXZfaWQpOwotCi0JZGFpX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2RhaV9xNl90ZG1fZGFpX2RhdGEpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghZGFpX2RhdGEpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXMgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGRtIGRhaV9kYXRhXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIHJ0bjsKLQl9Ci0JbWVtc2V0KGRhaV9kYXRhLCAwLCBzaXplb2YoKmRhaV9kYXRhKSk7Ci0KLQkvKiBURE0gQ0ZHICovCi0JdGRtX3BhcmVudF9ub2RlID0gb2ZfZ2V0X3BhcmVudChwZGV2LT5kZXYub2Zfbm9kZSk7Ci0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMih0ZG1fcGFyZW50X25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtbW9kZSIsCi0JCSh1MzIgKikmZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5zeW5jX21vZGUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogU3luYyBNb2RlIGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLW1vZGUiKTsKLQkJZ290byBmcmVlX2RhaV9kYXRhOwotCX0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogU3luYyBNb2RlIGZyb20gRFQgZmlsZSAweCV4XG4iLAotCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5zeW5jX21vZGUpOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMih0ZG1fcGFyZW50X25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLXN5bmMtc3JjIiwKLQkJKHUzMiAqKSZkYWlfZGF0YS0+cG9ydF9jZmcudGRtLnN5bmNfc3JjKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFN5bmMgU3JjIGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1zeW5jLXNyYyIpOwotCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0JfQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBTeW5jIFNyYyBmcm9tIERUIGZpbGUgMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uc3luY19zcmMpOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMih0ZG1fcGFyZW50X25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtb3V0IiwKLQkJKHUzMiAqKSZkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmN0cmxfZGF0YV9vdXRfZW5hYmxlKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IERhdGEgT3V0IGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLW91dCIpOwotCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0JfQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBEYXRhIE91dCBmcm9tIERUIGZpbGUgMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uY3RybF9kYXRhX291dF9lbmFibGUpOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMih0ZG1fcGFyZW50X25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jIiwKLQkJKHUzMiAqKSZkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmN0cmxfaW52ZXJ0X3N5bmNfcHVsc2UpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogSW52ZXJ0IFN5bmMgZnJvbSBEVCBmaWxlICVzXG4iLAotCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLWludmVydC1zeW5jIik7Ci0JCWdvdG8gZnJlZV9kYWlfZGF0YTsKLQl9Ci0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IEludmVydCBTeW5jIGZyb20gRFQgZmlsZSAweCV4XG4iLAotCQlfX2Z1bmNfXywgZGFpX2RhdGEtPnBvcnRfY2ZnLnRkbS5jdHJsX2ludmVydF9zeW5jX3B1bHNlKTsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIodGRtX3BhcmVudF9ub2RlLAotCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1kYXRhLWRlbGF5IiwKLQkJKHUzMiAqKSZkYWlfZGF0YS0+cG9ydF9jZmcudGRtLmN0cmxfc3luY19kYXRhX2RlbGF5KTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IERhdGEgRGVsYXkgZnJvbSBEVCBmaWxlICVzXG4iLAotCQkJX19mdW5jX18sICJxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtZGVsYXkiKTsKLQkJZ290byBmcmVlX2RhaV9kYXRhOwotCX0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogRGF0YSBEZWxheSBmcm9tIERUIGZpbGUgMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uY3RybF9zeW5jX2RhdGFfZGVsYXkpOwotCi0JLyogVERNIENGRyAtLSBzZXQgZGVmYXVsdCAqLwotCWRhaV9kYXRhLT5wb3J0X2NmZy50ZG0uZGF0YV9mb3JtYXQgPSBBRkVfTElORUFSX1BDTV9EQVRBOwotCWRhaV9kYXRhLT5wb3J0X2NmZy50ZG0udGRtX2NmZ19taW5vcl92ZXJzaW9uID0KLQkJQUZFX0FQSV9WRVJTSU9OX1RETV9DT05GSUc7Ci0KLQkvKiBURE0gU0xPVCBNQVBQSU5HIENGRyAqLwotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCSJxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtYWxpZ24iLAotCQkmZGFpX2RhdGEtPnBvcnRfY2ZnLnNsb3RfbWFwcGluZy5kYXRhX2FsaWduX3R5cGUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogRGF0YSBBbGlnbiBmcm9tIERUIGZpbGUgJXNcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWRhdGEtYWxpZ24iKTsKLQkJZ290byBmcmVlX2RhaV9kYXRhOwotCX0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogRGF0YSBBbGlnbiBmcm9tIERUIGZpbGUgMHgleFxuIiwKLQkJX19mdW5jX18sIGRhaV9kYXRhLT5wb3J0X2NmZy5zbG90X21hcHBpbmcuZGF0YV9hbGlnbl90eXBlKTsKLQotCS8qIFRETSBTTE9UIE1BUFBJTkcgQ0ZHIC0tIHNldCBkZWZhdWx0ICovCi0JZGFpX2RhdGEtPnBvcnRfY2ZnLnNsb3RfbWFwcGluZy5taW5vcl92ZXJzaW9uID0KLQkJQUZFX0FQSV9WRVJTSU9OX1NMT1RfTUFQUElOR19DT05GSUc7Ci0KLQkvKiBDVVNUT00gVERNIEhFQURFUiBDRkcgKi8KLQljdXN0b21fdGRtX2hlYWRlciA9ICZkYWlfZGF0YS0+cG9ydF9jZmcuY3VzdG9tX3RkbV9oZWFkZXI7Ci0JaWYgKG9mX2ZpbmRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItc3RhcnQtb2Zmc2V0IiwgTlVMTCkgJiYKLQkJb2ZfZmluZF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci13aWR0aCIsIE5VTEwpICYmCi0JCW9mX2ZpbmRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItbnVtLWZyYW1lLXJlcGVhdCIsIE5VTEwpKSB7Ci0JCS8qIGlmIHRoZSBwcm9wZXJ0eSBleGlzdCAqLwotCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sbXNtLWNwdWRhaS10ZG0taGVhZGVyLXN0YXJ0LW9mZnNldCIsCi0JCQkodTMyICopJmN1c3RvbV90ZG1faGVhZGVyLT5zdGFydF9vZmZzZXQpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBIZWFkZXIgU3RhcnQgT2Zmc2V0IGZyb20gRFQgZmlsZSAlc1xuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItc3RhcnQtb2Zmc2V0Iik7Ci0JCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0JCX0KLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IEhlYWRlciBTdGFydCBPZmZzZXQgZnJvbSBEVCBmaWxlIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgY3VzdG9tX3RkbV9oZWFkZXItPnN0YXJ0X29mZnNldCk7Ci0KLQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci13aWR0aCIsCi0JCQkodTMyICopJmN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJfd2lkdGgpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBIZWFkZXIgV2lkdGggZnJvbSBEVCBmaWxlICVzXG4iLAotCQkJCV9fZnVuY19fLCAicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItd2lkdGgiKTsKLQkJCWdvdG8gZnJlZV9kYWlfZGF0YTsKLQkJfQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogSGVhZGVyIFdpZHRoIGZyb20gRFQgZmlsZSAweCV4XG4iLAotCQkJX19mdW5jX18sIGN1c3RvbV90ZG1faGVhZGVyLT5oZWFkZXJfd2lkdGgpOwotCi0JCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxtc20tY3B1ZGFpLXRkbS1oZWFkZXItbnVtLWZyYW1lLXJlcGVhdCIsCi0JCQkodTMyICopJmN1c3RvbV90ZG1faGVhZGVyLT5udW1fZnJhbWVfcmVwZWF0KTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogSGVhZGVyIE51bSBGcmFtZSBSZXBlYXQgZnJvbSBEVCBmaWxlICVzXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCSJxY29tLG1zbS1jcHVkYWktdGRtLWhlYWRlci1udW0tZnJhbWUtcmVwZWF0Iik7Ci0JCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0JCX0KLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IEhlYWRlciBOdW0gRnJhbWUgUmVwZWF0IGZyb20gRFQgZmlsZSAweCV4XG4iLAotCQkJX19mdW5jX18sIGN1c3RvbV90ZG1faGVhZGVyLT5udW1fZnJhbWVfcmVwZWF0KTsKLQotCQkvKiBDVVNUT00gVERNIEhFQURFUiBDRkcgLS0gc2V0IGRlZmF1bHQgKi8KLQkJY3VzdG9tX3RkbV9oZWFkZXItPm1pbm9yX3ZlcnNpb24gPQotCQkJQUZFX0FQSV9WRVJTSU9OX0NVU1RPTV9URE1fSEVBREVSX0NPTkZJRzsKLQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl90eXBlID0KLQkJCUFGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0lOVkFMSUQ7Ci0JfSBlbHNlIHsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwKLQkJCSIlczogQ3VzdG9tIHRkbSBoZWFkZXIgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwotCQkvKiBDVVNUT00gVERNIEhFQURFUiBDRkcgLS0gc2V0IGRlZmF1bHQgKi8KLQkJY3VzdG9tX3RkbV9oZWFkZXItPmhlYWRlcl90eXBlID0KLQkJCUFGRV9DVVNUT01fVERNX0hFQURFUl9UWVBFX0lOVkFMSUQ7Ci0JCS8qIHByb2NlZWQgd2l0aCBwcm9iZSAqLwotCX0KLQotCS8qIGNvcHkgc3RhdGljIGNsayBwZXIgcGFyZW50IG5vZGUgKi8KLQlkYWlfZGF0YS0+Y2xrX3NldCA9IHRkbV9jbGtfc2V0OwotCS8qIGNvcHkgc3RhdGljIGdyb3VwIGNmZyBwZXIgcGFyZW50IG5vZGUgKi8KLQlkYWlfZGF0YS0+Z3JvdXBfY2ZnLnRkbV9jZmcgPSB0ZG1fZ3JvdXBfY2ZnOwotCS8qIGNvcHkgc3RhdGljIG51bSBncm91cCBwb3J0cyBwZXIgcGFyZW50IG5vZGUgKi8KLQlkYWlfZGF0YS0+bnVtX2dyb3VwX3BvcnRzID0gbnVtX3RkbV9ncm91cF9wb3J0czsKLQotCi0JZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRhaV9kYXRhKTsKLQotCXBvcnRfaWR4ID0gbXNtX2RhaV9xNl9nZXRfcG9ydF9pZHgodGRtX2Rldl9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBQb3J0IGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCB0ZG1fZGV2X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfZGFpX2RhdGE7Ci0JfQotCi0JcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkmbXNtX3E2X3RkbV9kYWlfY29tcG9uZW50LAotCQkmbXNtX2RhaV9xNl90ZG1fZGFpW3BvcnRfaWR4XSwgMSk7Ci0KLQlpZiAocmMpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFRETSBkYWkgMHgleCByZWdpc3RlciBmYWlsZWQsIHJjPSVkXG4iLAotCQkJX19mdW5jX18sIHRkbV9kZXZfaWQsIHJjKTsKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9yZWdpc3RlcjoKLWZyZWVfZGFpX2RhdGE6Ci0Ja2ZyZWUoZGFpX2RhdGEpOwotcnRuOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZGFpX3E2X3RkbV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9kYWlfcTZfdGRtX2RhaV9kYXRhICpkYWlfZGF0YSA9Ci0JCWRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7Ci0KLQlrZnJlZShkYWlfZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9xNl90ZG1fZGV2X2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1kYWktcTYtdGRtIiwgfSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9xNl90ZG1fZGV2X2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9xNl90ZG1fZHJpdmVyID0gewotCS5wcm9iZSAgPSBtc21fZGFpX3E2X3RkbV9kZXZfcHJvYmUsCi0JLnJlbW92ZSAgPSBtc21fZGFpX3E2X3RkbV9kZXZfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1kYWktcTYtdGRtIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfcTZfdGRtX2Rldl9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2RhaV9xNl9pbml0KHZvaWQpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9hdXhwY21fZGV2X2RyaXZlcik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgYXV4cGNtIGRldiBkcml2ZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9xNik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIHE2IGRyaXZlciIsIF9fZnVuY19fKTsKLQkJZ290byBkYWlfcTZfZmFpbDsKLQl9Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9xNl9kZXYpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBxNiBkZXYgZHJpdmVyIiwgX19mdW5jX18pOwotCQlnb3RvIGRhaV9xNl9kZXZfZmFpbDsKLQl9Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9xNl9taTJzX2RyaXZlcik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIE1JMlMgZGV2IGRydlxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRhaV9xNl9taTJzX2Rydl9mYWlsOwotCX0KLQotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX21pMnNfcTYpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBNSTJTXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZGFpX21pMnNfcTZfZmFpbDsKLQl9Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9xNl9zcGRpZl9kcml2ZXIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBTUERJRlxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRhaV9zcGRpZl9xNl9mYWlsOwotCX0KLQotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fZGFpX3E2X3RkbV9kcml2ZXIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBURE0gZGV2IGRydlxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRhaV9xNl90ZG1fZHJ2X2ZhaWw7Ci0JfQotCi0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfdGRtX3E2KTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogZmFpbCB0byByZWdpc3RlciBkYWkgVERNXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZGFpX3RkbV9xNl9mYWlsOwotCX0KLQlyZXR1cm4gcmM7Ci0KLWRhaV90ZG1fcTZfZmFpbDoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl90ZG1fZHJpdmVyKTsKLWRhaV9xNl90ZG1fZHJ2X2ZhaWw6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfcTZfc3BkaWZfZHJpdmVyKTsKLWRhaV9zcGRpZl9xNl9mYWlsOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX21pMnNfcTYpOwotZGFpX21pMnNfcTZfZmFpbDoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl9taTJzX2RyaXZlcik7Ci1kYWlfcTZfbWkyc19kcnZfZmFpbDoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNl9kZXYpOwotZGFpX3E2X2Rldl9mYWlsOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3E2KTsKLWRhaV9xNl9mYWlsOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fYXV4cGNtX2Rldl9kcml2ZXIpOwotZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci1tb2R1bGVfaW5pdChtc21fZGFpX3E2X2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX2RhaV9xNl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfcTZfZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9xNik7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9hdXhwY21fZGV2X2RyaXZlcik7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfcTZfc3BkaWZfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9kYWlfcTZfZXhpdCk7Ci0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gRFNQIERBSSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXNsaW0uYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXNsaW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNWZlZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1zbGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGltYnVzL3NsaW1idXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvbXNtLXNsaW0tZG1hLmg+Ci0KLSNkZWZpbmUgU0xJTV9ERVZfTkFNRSAibXNtLWRhaS1zbGltIgotCi0jZGVmaW5lIFNMSU1fREFJX1JBVEVTIChTTkRSVl9QQ01fUkFURV80ODAwMCB8IFwKLQkJCVNORFJWX1BDTV9SQVRFXzgwMDAgfCBcCi0JCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8IFwKLQkJCVNORFJWX1BDTV9SQVRFXzk2MDAwIHwgXAotCQkJU05EUlZfUENNX1JBVEVfMTkyMDAwIHwgXAotCQkJU05EUlZfUENNX1JBVEVfMzg0MDAwKQotCi0jZGVmaW5lIFNMSU1fREFJX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgXAotCQkJICBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFwKLQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCi0KLSNkZWZpbmUgREFJX1NUQVRFX0lOSVRJQUxJWkVEICgweDAxIDw8IDApCi0jZGVmaW5lIERBSV9TVEFURV9QUkVQQVJFRCAoMHgwMSA8PCAxKQotI2RlZmluZSBEQUlfU1RBVEVfUlVOTklORyAoMHgwMSA8PCAyKQotCi0jZGVmaW5lIFNFVF9EQUlfU1RBVEUoc3RhdHVzLCBzdGF0ZSkgXAotCShzdGF0dXMgfD0gc3RhdGUpCi0KLSNkZWZpbmUgQ0xSX0RBSV9TVEFURShzdGF0dXMsIHN0YXRlKSBcCi0JKHN0YXR1cyA9IHN0YXR1cyAmICh+c3RhdGUpKQotCi1lbnVtIHsKLQlNU01fREFJX1NMSU0wID0gMCwKLQlOVU1fU0xJTV9EQUlTLAotfTsKLQotc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhIHsKLQl1bnNpZ25lZCBpbnQgZGFpX2lkOwotCXUxNiAqY2hhbl9oOwotCXUxNiAqc2hfY2g7Ci0JdTE2IGdycGg7Ci0JdTMyIHJhdGU7Ci0JdTE2IGJpdHM7Ci0JdTE2IGNoX2NudDsKLQl1OCBzdGF0dXM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydjsKLQlzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgZG1hX2RhdGE7Ci0Jc3RydWN0IHNsaW1fcG9ydF9jZmcgcG9ydF9jZmc7Ci19OwotCi1zdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhIHsKLQlzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNkZXY7Ci0JdTE2IG51bV9kYWlzOwotCXN0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSBzbGltX2RhaV9kYXRhW05VTV9TTElNX0RBSVNdOwotfTsKLQotc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICptc21fc2xpbV9nZXRfZGFpX2RhdGEoCi0Jc3RydWN0IG1zbV9kYWlfc2xpbV9kcnZfZGF0YSAqZHJ2X2RhdGEsCi0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICpkYWlfZGF0YV90OwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGRydl9kYXRhLT5udW1fZGFpczsgaSsrKSB7Ci0JCWRhaV9kYXRhX3QgPSAmZHJ2X2RhdGEtPnNsaW1fZGFpX2RhdGFbaV07Ci0JCWlmIChkYWlfZGF0YV90LT5kYWlfaWQgPT0gZGFpLT5pZCkKLQkJCXJldHVybiBkYWlfZGF0YV90OwotCX0KLQotCWRldl9lcnIoZGFpLT5kZXYsCi0JCSIlczogbm8gZGFpIGRhdGEgZm91bmQgZm9yIGRhaV9pZCAlZFxuIiwKLQkJX19mdW5jX18sIGRhaS0+aWQpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc2xpbV9jaF9jdGwoc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSwKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHNsaW1fZGV2aWNlICpzZGV2OwotCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhOwotCXN0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSAqZGFpX2RhdGE7Ci0JaW50IHJjLCByYzEsIGk7Ci0KLQlpZiAoIWRtYV9kYXRhIHx8ICFkbWFfZGF0YS0+c2RldikgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgICghZG1hX2RhdGEpID8gImRtYV9kYXRhIiA6ICJzbGltX2RldmljZSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZGV2ID0gZG1hX2RhdGEtPnNkZXY7Ci0JZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnNkZXYtPmRldik7Ci0JZGFpX2RhdGEgPSBtc21fc2xpbV9nZXRfZGFpX2RhdGEoZHJ2X2RhdGEsIGRhaSk7Ci0KLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgZGFpX2RhdGEgZm9yIGRhaV9pZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2RiZygmc2Rldi0+ZGV2LAotCQkiJXM6IGVuYWJsZSA9ICVzLCByYXRlID0gJXVcbiIsIF9fZnVuY19fLAotCQllbmFibGUgPyAidHJ1ZSIgOiAiZmFsc2UiLAotCQlkYWlfZGF0YS0+cmF0ZSk7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCWlmICghKGRhaV9kYXRhLT5zdGF0dXMgJiBEQUlfU1RBVEVfUFJFUEFSRUQpKSB7Ci0JCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJIiVzOiBkYWkgaWQgKCVkKSBoYXMgaW52YWxpZCBzdGF0ZSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBkYWktPmlkLCBkYWlfZGF0YS0+c3RhdHVzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmMgPSBzbGltX2FsbG9jX21ncnBvcnRzKHNkZXYsCi0JCQkJCSBTTElNX1JFUV9ERUZBVUxULCBkYWlfZGF0YS0+Y2hfY250LAotCQkJCQkgJihkbWFfZGF0YS0+cGgpLAotCQkJCQkgc2l6ZW9mKGRtYV9kYXRhLT5waCkpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJIiVzOmFsbG9jIG1ncnBvcnQgZmFpbGVkIHJjICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlyYyA9IHNsaW1fY29uZmlnX21ncnBvcnRzKHNkZXYsICYoZG1hX2RhdGEtPnBoKSwKLQkJCQkJICBkYWlfZGF0YS0+Y2hfY250LAotCQkJCQkgICYoZGFpX2RhdGEtPnBvcnRfY2ZnKSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoJnNkZXYtPmRldiwKLQkJCQkiJXM6IGNvbmZpZyBtZ3Jwb3J0IGZhaWxlZCByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byBlcnJfZG9uZTsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBkYWlfZGF0YS0+Y2hfY250OyBpKyspIHsKLQkJCXJjID0gc2xpbV9jb25uZWN0X3Npbmsoc2RldiwKLQkJCQkJICAgICAgICZkbWFfZGF0YS0+cGgsIDEsCi0JCQkJCSAgICAgICBkYWlfZGF0YS0+Y2hhbl9oW2ldKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJCSIlczogc2xpbV9jb25uZWN0X3NpbmsgZmFpbGVkLCBjaCA9ICVkLCBlcnIgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGksIHJjKTsKLQkJCQlnb3RvIGVycl9kb25lOwotCQkJfQotCQl9Ci0KLQkJcmMgPSBzbGltX2NvbnRyb2xfY2goc2RldiwKLQkJCQkgICAgIGRhaV9kYXRhLT5ncnBoLAotCQkJCSAgICAgU0xJTV9DSF9BQ1RJVkFURSwgdHJ1ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoJnNkZXYtPmRldiwKLQkJCQkiJXM6IHNsaW0gYWN0aXZhdGUgY2ggZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byBlcnJfZG9uZTsKLQkJfQotCQkvKiBNYXJrIGRhaSBzdGF0dXMgYXMgcnVubmluZyAqLwotCQlTRVRfREFJX1NUQVRFKGRhaV9kYXRhLT5zdGF0dXMsIERBSV9TVEFURV9SVU5OSU5HKTsKLQl9IGVsc2UgewotCQlpZiAoIShkYWlfZGF0YS0+c3RhdHVzICYgREFJX1NUQVRFX1JVTk5JTkcpKSB7Ci0JCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJIiVzOiBkYWkgaWQgKCVkKSBoYXMgaW52YWxpZCBzdGF0ZSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBkYWktPmlkLCBkYWlfZGF0YS0+c3RhdHVzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmMgPSBzbGltX2NvbnRyb2xfY2goc2RldiwKLQkJCQkgICAgIGRhaV9kYXRhLT5ncnBoLAotCQkJCSAgICAgU0xJTV9DSF9SRU1PVkUsIHRydWUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJIiVzOiBzbGltIGFjdGl2YXRlIGNoIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXJjID0gc2xpbV9kZWFsbG9jX21ncnBvcnRzKHNkZXYsCi0JCQkJCSAgICZkbWFfZGF0YS0+cGgsIDEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKCZzZGV2LT5kZXYsCi0JCQkJIiVzOiBkZWFsbG9jIG1ncnBvcnQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCS8qIGNsZWFyIHJ1bm5pbmcgc3RhdGUgZm9yIGRhaSovCi0JCUNMUl9EQUlfU1RBVEUoZGFpX2RhdGEtPnN0YXR1cywgREFJX1NUQVRFX1JVTk5JTkcpOwotCX0KLQotCXJldHVybiByYzsKLQotZXJyX2RvbmU6Ci0JcmMxID0gc2xpbV9kZWFsbG9jX21ncnBvcnRzKHNkZXYsCi0JCQkJICAgJmRtYV9kYXRhLT5waCwgMSk7Ci0JaWYgKHJjMSA8IDApCi0JCWRldl9lcnIoJnNkZXYtPmRldiwKLQkJCSIlczogZGVhbGxvYyBtZ3Jwb3J0IGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMxKTsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc2xpbV9od19wYXJhbXMoCi0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IG1zbV9kYWlfc2xpbV9kcnZfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOwotCXN0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSAqZGFpX2RhdGE7Ci0JaW50IHJjID0gMDsKLQotCWRhaV9kYXRhID0gbXNtX3NsaW1fZ2V0X2RhaV9kYXRhKGRydl9kYXRhLCBkYWkpOwotCWlmICghZGFpX2RhdGEpIHsKLQkJZGV2X2VycihkYWktPmRldiwKLQkJCSIlczogSW52YWxpZCBkYWlfZGF0YSBmb3IgZGFpX2lkICVkXG4iLAotCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWRhaV9kYXRhLT5jaF9jbnQgfHwgZGFpX2RhdGEtPmNoX2NudCAhPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IGludmFsaWQgY2hfY250ICVkICVkXG4iLAotCQkJX19mdW5jX18sIGRhaV9kYXRhLT5jaF9jbnQsIHBhcmFtc19jaGFubmVscyhwYXJhbXMpKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGFpX2RhdGEtPnJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCWRhaV9kYXRhLT5wb3J0X2NmZy5wb3J0X29wdHMgPSBTTElNX09QVF9OT05FOwotCWlmIChkYWlfZGF0YS0+cmF0ZSA+PSBTTkRSVl9QQ01fUkFURV80ODAwMCkKLQkJZGFpX2RhdGEtPnBvcnRfY2ZnLndhdGVybWFyayA9IDE2OwotCWVsc2UKLQkJZGFpX2RhdGEtPnBvcnRfY2ZnLndhdGVybWFyayA9IDg7Ci0KLQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCWRhaV9kYXRhLT5iaXRzID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWRhaV9kYXRhLT5iaXRzID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWRhaV9kYXRhLT5iaXRzID0gMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogaW52YWxpZCBmb3JtYXQgJWRcbiIsIF9fZnVuY19fLAotCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGV2X2RiZyhkYWktPmRldiwgIiVzOiBjaF9jbnQ9JXUgcmF0ZT0ldSwgYml0X3dpZHRoID0gJXVcbiIsCi0JCV9fZnVuY19fLCBkYWlfZGF0YS0+Y2hfY250LCBkYWlfZGF0YS0+cmF0ZSwKLQkJZGFpX2RhdGEtPmJpdHMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zbGltX3NldF9jaGFubmVsX21hcChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQl1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCi0JdW5zaWduZWQgaW50IHJ4X251bSwgdW5zaWduZWQgaW50ICpyeF9zbG90KQotewotCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgbXNtX3NsaW1fZGFpX2RhdGEgKmRhaV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnY7Ci0JdTggaSA9IDA7Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LAotCQkiJXM6IHR4X251bT0ldSwgcnhfbnVtPSV1XG4iLAotCQlfX2Z1bmNfXywgdHhfbnVtLCByeF9udW0pOwotCi0JZGFpX2RhdGEgPSBtc21fc2xpbV9nZXRfZGFpX2RhdGEoZHJ2X2RhdGEsIGRhaSk7Ci0JaWYgKCFkYWlfZGF0YSkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGRhaV9kYXRhIGZvciBkYWlfaWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhaV9kcnYgPSBkYWlfZGF0YS0+ZGFpX2RydjsKLQotCWlmICh0eF9udW0gPiBkYWlfZHJ2LT5jYXB0dXJlLmNoYW5uZWxzX21heCkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IHR4X251bSAldSBtYXggb3V0IG1hc3RlciBwb3J0IGNudFxuIiwKLQkJCV9fZnVuY19fLCB0eF9udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdHhfbnVtOyBpKyspCi0JCWRhaV9kYXRhLT5zaF9jaFtpXSA9IHR4X3Nsb3RbaV07Ci0KLQlkYWlfZGF0YS0+Y2hfY250ID0gdHhfbnVtOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc2xpbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKLQlzdHJ1Y3QgbXNtX3NsaW1fZG1hX2RhdGEgKmRtYV9kYXRhOwotCXN0cnVjdCBtc21fc2xpbV9kYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCXN0cnVjdCBzbGltX2NoIHByb3A7Ci0JaW50IHJjOwotCXU4IGksIGo7Ci0KLQlkYWlfZGF0YSA9IG1zbV9zbGltX2dldF9kYWlfZGF0YShkcnZfZGF0YSwgZGFpKTsKLQlpZiAoIWRhaV9kYXRhKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgZGFpX2RhdGEgZm9yIGRhaSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCEoZGFpX2RhdGEtPnN0YXR1cyAmIERBSV9TVEFURV9JTklUSUFMSVpFRCkpIHsKLQkJZGV2X2VycihkYWktPmRldiwKLQkJCSIlczogZGFpIGlkICglZCkgaGFzIGludmFsaWQgc3RhdGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkLCBkYWlfZGF0YS0+c3RhdHVzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRhaV9kYXRhLT5zdGF0dXMgJiBEQUlfU1RBVEVfUFJFUEFSRUQpIHsKLQkJZGV2X2RiZyhkYWktPmRldiwKLQkJCSIlczogZGFpIGlkICglZCkgaGFzIGFscmVhZHkgcHJlcGFyZWQuXG4iLAotCQkJX19mdW5jX18sIGRhaS0+aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkbWFfZGF0YSA9ICZkYWlfZGF0YS0+ZG1hX2RhdGE7Ci0Jc25kX3NvY19kYWlfc2V0X2RtYV9kYXRhKGRhaSwgc3Vic3RyZWFtLCBkbWFfZGF0YSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGFpX2RhdGEtPmNoX2NudDsgaSsrKSB7Ci0JCXJjID0gc2xpbV9xdWVyeV9jaChkcnZfZGF0YS0+c2RldiwgZGFpX2RhdGEtPnNoX2NoW2ldLAotCQkJCSAgICZkYWlfZGF0YS0+Y2hhbl9oW2ldKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6cXVlcnkgY2hhbiBoYW5kbGUgZmFpbGVkIHJjICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlnb3RvIGVycm9yX2NoYW5fcXVlcnk7Ci0JCX0KLQl9Ci0KLQlwcm9wLnByb3QgPSBTTElNX0FVVE9fSVNPOwotCXByb3AuYmFzZXIgPSBTTElNX1JBVEVfNDAwMEhaOwotCXByb3AuZGF0YWYgPSBTTElNX0NIX0RBVEFGX05PVF9ERUZJTkVEOwotCXByb3AuYXV4ZiA9IFNMSU1fQ0hfQVVYRl9OT1RfQVBQTElDQUJMRTsKLQlwcm9wLnJhdGVtID0gKGRhaV9kYXRhLT5yYXRlLzQwMDApOwotCXByb3Auc2FtcGxlc3piaXRzID0gZGFpX2RhdGEtPmJpdHM7Ci0KLQlyYyA9IHNsaW1fZGVmaW5lX2NoKGRydl9kYXRhLT5zZGV2LCAmcHJvcCwgZGFpX2RhdGEtPmNoYW5faCwKLQkJCSAgICBkYWlfZGF0YS0+Y2hfY250LCB0cnVlLCAmZGFpX2RhdGEtPmdycGgpOwotCi0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczpkZWZpbmUgY2hhbiBmYWlsZWQgcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBlcnJvcl9kZWZpbmVfY2hhbjsKLQl9Ci0KLQkvKiBNYXJrIHN0cmVhbSBzdGF0dXMgYXMgcHJlcGFyZWQgKi8KLQlTRVRfREFJX1NUQVRFKGRhaV9kYXRhLT5zdGF0dXMsIERBSV9TVEFURV9QUkVQQVJFRCk7Ci0KLQlyZXR1cm4gcmM7Ci0KLWVycm9yX2RlZmluZV9jaGFuOgotZXJyb3JfY2hhbl9xdWVyeToKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlzbGltX2RlYWxsb2NfY2goZHJ2X2RhdGEtPnNkZXYsIGRhaV9kYXRhLT5jaGFuX2hbal0pOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2RhaV9zbGltX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7Ci0Jc3RydWN0IG1zbV9zbGltX2RtYV9kYXRhICpkbWFfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICpkYWlfZGF0YTsKLQlpbnQgaSwgcmMgPSAwOwotCi0JZGFpX2RhdGEgPSBtc21fc2xpbV9nZXRfZGFpX2RhdGEoZHJ2X2RhdGEsIGRhaSk7Ci0JZG1hX2RhdGEgPSBzbmRfc29jX2RhaV9nZXRfZG1hX2RhdGEoZGFpLCBzdHJlYW0pOwotCWlmICghZG1hX2RhdGEgfHwgIWRhaV9kYXRhKSB7Ci0JCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAotCQkJKCFkbWFfZGF0YSkgPyAiZG1hX2RhdGEiIDogImRhaV9kYXRhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKCEoZGFpX2RhdGEtPnN0YXR1cyAmIERBSV9TVEFURV9QUkVQQVJFRCkpIHx8Ci0JICAgICBkYWlfZGF0YS0+c3RhdHVzICYgREFJX1NUQVRFX1JVTk5JTkcpIHsKLQkJZGV2X2VycihkYWktPmRldiwKLQkJCSIlczogZGFpIGlkICglZCkgaGFzIGludmFsaWQgc3RhdGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBkYWktPmlkLCBkYWlfZGF0YS0+c3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBkYWlfZGF0YS0+Y2hfY250OyBpKyspIHsKLQkJcmMgPSBzbGltX2RlYWxsb2NfY2goZHJ2X2RhdGEtPnNkZXYsIGRhaV9kYXRhLT5jaGFuX2hbaV0pOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkJIiVzOiBkZWFsbG9jX2NoIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJfQotCX0KLQotCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN0cmVhbSwgTlVMTCk7Ci0JLyogY2xlYXIgcHJlcGFyZWQgc3RhdGUgZm9yIHRoZSBkYWkgKi8KLQlDTFJfREFJX1NUQVRFKGRhaV9kYXRhLT5zdGF0dXMsIERBSV9TVEFURV9QUkVQQVJFRCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIG1zbV9kYWlfc2xpbV9jb21wb25lbnQgPSB7Ci0JLm5hbWUJCT0gIm1zbS1kYWktc2xpbS1jbXBudCIsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtc21fZGFpX3NsaW1fb3BzID0gewotCS5wcmVwYXJlCT0gbXNtX2RhaV9zbGltX3ByZXBhcmUsCi0JLmh3X3BhcmFtcwk9IG1zbV9kYWlfc2xpbV9od19wYXJhbXMsCi0JLnNodXRkb3duCT0gbXNtX2RhaV9zbGltX3NodXRkb3duLAotCS5zZXRfY2hhbm5lbF9tYXAgPSBtc21fZGFpX3NsaW1fc2V0X2NoYW5uZWxfbWFwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX3NsaW1fZGFpc1tdID0gewotCXsKLQkJLyoKLQkJICogVGhlIGZpcnN0IGRhaSBuYW1lIHNob3VsZCBiZSBzYW1lIGFzIGRldmljZSBuYW1lCi0JCSAqIHRvIHN1cHBvcnQgcmVnaXN0ZXJpbmcgc2luZ2xlIGFuZCBtdWx0aWxlIGRhaXMuCi0JCSAqLwotCQkubmFtZSA9IFNMSU1fREVWX05BTUUsCi0JCS5pZCA9IE1TTV9EQUlfU0xJTTAsCi0JCS5jYXB0dXJlID0gewotCQkJLnJhdGVzID0gU0xJTV9EQUlfUkFURVMsCi0JCQkuZm9ybWF0cyA9IFNMSU1fREFJX0ZPUk1BVFMsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS8qCi0JCQkgKiBtYXggY2hhbm5lbHMgYWxsb3dlZCBpcwotCQkJICogZGVwZW5kZW50IG9uIHBsYXRmb3JtIGFuZAotCQkJICogd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSB0aGlzCi0JCQkgKiBkYWkgZHJpdmVyIGlzIHJlZ2lzdGVyZWQuCi0JCQkgKi8KLQkJCS5jaGFubmVsc19tYXggPSAxLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDM4NDAwMCwKLQkJCS5zdHJlYW1fbmFtZSA9ICJTTElNX0RBSTAgQ2FwdHVyZSIsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9zbGltX29wcywKLQl9LAotCS8qCi0JICogSWYgbXVsdGlwbGUgZGFpcyBhcmUgbmVlZGVkLAotCSAqIGFkZCBkYWlzIGhlcmUgYW5kIHVwZGF0ZSB0aGUKLQkgKiBkYWlfaWQgZW51bS4KLQkgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIG1zbV9kYWlfc2xpbV9yZW1vdmVfZGFpX2RhdGEoCi0JCXN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IG1zbV9kYWlfc2xpbV9kcnZfZGF0YSAqZHJ2X2RhdGEpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICpkYWlfZGF0YV90OwotCi0JZm9yIChpID0gMDsgaSA8IGRydl9kYXRhLT5udW1fZGFpczsgaSsrKSB7Ci0JCWRhaV9kYXRhX3QgPSAmZHJ2X2RhdGEtPnNsaW1fZGFpX2RhdGFbaV07Ci0KLQkJa2ZyZWUoZGFpX2RhdGFfdC0+Y2hhbl9oKTsKLQkJZGFpX2RhdGFfdC0+Y2hhbl9oID0gTlVMTDsKLQkJa2ZyZWUoZGFpX2RhdGFfdC0+c2hfY2gpOwotCQlkYWlfZGF0YV90LT5zaF9jaCA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc2xpbV9wb3B1bGF0ZV9kYWlfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBtc21fZGFpX3NsaW1fZHJ2X2RhdGEgKmRydl9kYXRhKQotewotCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnY7Ci0Jc3RydWN0IG1zbV9zbGltX2RhaV9kYXRhICpkYWlfZGF0YV90OwotCXU4IG51bV9jaDsKLQlpbnQgaSwgaiwgcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHJ2X2RhdGEtPm51bV9kYWlzOyBpKyspIHsKLQkJbnVtX2NoID0gMDsKLQkJZGFpX2RydiA9ICZtc21fc2xpbV9kYWlzW2ldOwotCQludW1fY2ggKz0gZGFpX2Rydi0+Y2FwdHVyZS5jaGFubmVsc19tYXg7Ci0JCW51bV9jaCArPSBkYWlfZHJ2LT5wbGF5YmFjay5jaGFubmVsc19tYXg7Ci0KLQkJZGFpX2RhdGFfdCA9ICZkcnZfZGF0YS0+c2xpbV9kYWlfZGF0YVtpXTsKLQkJZGFpX2RhdGFfdC0+ZGFpX2RydiA9IGRhaV9kcnY7Ci0JCWRhaV9kYXRhX3QtPmRhaV9pZCA9IGRhaV9kcnYtPmlkOwotCQlkYWlfZGF0YV90LT5kbWFfZGF0YS5zZGV2ID0gZHJ2X2RhdGEtPnNkZXY7Ci0JCWRhaV9kYXRhX3QtPmRtYV9kYXRhLmRhaV9jaGFubmVsX2N0bCA9Ci0JCQkJbXNtX2RhaV9zbGltX2NoX2N0bDsKLQkJU0VUX0RBSV9TVEFURShkYWlfZGF0YV90LT5zdGF0dXMsCi0JCQkgICAgICBEQUlfU1RBVEVfSU5JVElBTElaRUQpOwotCi0JCWRhaV9kYXRhX3QtPmNoYW5faCA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkJCXNpemVvZih1MTYpICogbnVtX2NoLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFkYWlfZGF0YV90LT5jaGFuX2gpIHsKLQkJCWRldl9lcnIoZGV2LAotCQkJCSIlczogREFJIElEICVkLCBGYWlsZWQgdG8gYWxsb2MgY2hhbm5lbCBoYW5kbGVzXG4iLAotCQkJCV9fZnVuY19fLCBpKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX21lbV9hbGxvYzsKLQkJfQotCi0JCWRhaV9kYXRhX3QtPnNoX2NoID0gZGV2bV9remFsbG9jKGRldiwKLQkJCQkJc2l6ZW9mKHUxNikgKiBudW1fY2gsCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIWRhaV9kYXRhX3QtPnNoX2NoKSB7Ci0JCQlkZXZfZXJyKGRldiwKLQkJCQkiJXM6IERBSSBJRCAlZCwgRmFpbGVkIHRvIGFsbG9jIHNoX2NoXG4iLAotCQkJCV9fZnVuY19fLCBpKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX21lbV9hbGxvYzsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLQotZXJyX21lbV9hbGxvYzoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCWRhaV9kYXRhX3QgPSAmZHJ2X2RhdGEtPnNsaW1fZGFpX2RhdGFbaV07Ci0KLQkJZGV2bV9rZnJlZShkZXYsIGRhaV9kYXRhX3QtPmNoYW5faCk7Ci0JCWRhaV9kYXRhX3QtPmNoYW5faCA9IE5VTEw7Ci0KLQkJZGV2bV9rZnJlZShkZXYsIGRhaV9kYXRhX3QtPnNoX2NoKTsKLQkJZGFpX2RhdGFfdC0+c2hfY2ggPSBOVUxMOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zbGltX2Rldl9wcm9iZShzdHJ1Y3Qgc2xpbV9kZXZpY2UgKnNkZXYpCi17Ci0JaW50IHJjLCBpOwotCXU4IG1heF9jaGFubmVsczsKLQl1MzIgYXBwc19jaF9waXBlczsKLQlzdHJ1Y3QgbXNtX2RhaV9zbGltX2Rydl9kYXRhICpkcnZfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmc2Rldi0+ZGV2OwotCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnY7Ci0KLQlpZiAoIWRldi0+b2Zfbm9kZSB8fAotCSAgICAhZGV2LT5vZl9ub2RlLT5wYXJlbnQpIHsKLQkJZGV2X2VycihkZXYsCi0JCQkiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAotCQkJKCFkZXYtPm9mX25vZGUpID8gIm9mX25vZGUiIDogInBhcmVudF9vZl9ub2RlIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLT5wYXJlbnQsCi0JCQkJCSAicWNvbSxhcHBzLWNoLXBpcGVzIiwKLQkJCQkJICZhcHBzX2NoX3BpcGVzKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihkZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBsb29rdXAgcHJvcGVydHkgJXMgaW4gbm9kZSAlcywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgInFjb20sYXBwcy1jaC1waXBlcyIsCi0JCQlkZXYtPm9mX25vZGUtPnBhcmVudC0+ZnVsbF9uYW1lLCByYyk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQltYXhfY2hhbm5lbHMgPSBod2VpZ2h0X2xvbmcoYXBwc19jaF9waXBlcyk7Ci0JaWYgKG1heF9jaGFubmVscyA8PSAwKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIiVzOiBJbnZhbGlkIGFwcHMgb3duZWQgcG9ydHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgbWF4X2NoYW5uZWxzKTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCWRldl9kYmcoZGV2LCAiJXM6IG1heCBjaGFubmVscyA9ICV1XG4iLAotCQlfX2Z1bmNfXywgbWF4X2NoYW5uZWxzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9zbGltX2RhaXMpOyBpKyspIHsKLQkJZGFpX2RydiA9ICZtc21fc2xpbV9kYWlzW2ldOwotCQlkYWlfZHJ2LT5jYXB0dXJlLmNoYW5uZWxzX21heCA9IG1heF9jaGFubmVsczsKLQkJZGFpX2Rydi0+cGxheWJhY2suY2hhbm5lbHNfbWF4ID0gbWF4X2NoYW5uZWxzOwotCX0KLQotCWRydl9kYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcnZfZGF0YSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkcnZfZGF0YSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlkcnZfZGF0YS0+c2RldiA9IHNkZXY7Ci0JZHJ2X2RhdGEtPm51bV9kYWlzID0gTlVNX1NMSU1fREFJUzsKLQotCXJjID0gbXNtX2RhaV9zbGltX3BvcHVsYXRlX2RhaV9kYXRhKGRldiwgZHJ2X2RhdGEpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldiwKLQkJCSIlczogZmFpbGVkIHRvIHNldHVwIGRhaV9kYXRhLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX3BvcHVsYXRlX2RhaTsKLQl9Ci0KLQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZzZGV2LT5kZXYsICZtc21fZGFpX3NsaW1fY29tcG9uZW50LAotCQkJCQltc21fc2xpbV9kYWlzLCBOVU1fU0xJTV9EQUlTKTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBEQUksIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBlcnJfcmVnX2NvbXA7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2X2RhdGEpOwotCXJldHVybiByYzsKLQotZXJyX3JlZ19jb21wOgotCW1zbV9kYWlfc2xpbV9yZW1vdmVfZGFpX2RhdGEoZGV2LCBkcnZfZGF0YSk7Ci0KLWVycl9wb3B1bGF0ZV9kYWk6Ci0JZGV2bV9rZnJlZShkZXYsIGRydl9kYXRhKTsKLQotZXJyX3JldDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zbGltX2Rldl9yZW1vdmUoc3RydWN0IHNsaW1fZGV2aWNlICpzZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnNkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2xpbV9kZXZpY2VfaWQgbXNtX2RhaV9zbGltX2R0X21hdGNoW10gPSB7Ci0Je1NMSU1fREVWX05BTUUsIDAgfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBzbGltX2RyaXZlciBtc21fZGFpX3NsaW1fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gU0xJTV9ERVZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkucHJvYmUgPSBtc21fZGFpX3NsaW1fZGV2X3Byb2JlLAotCS5yZW1vdmUgPSBtc21fZGFpX3NsaW1fZGV2X3JlbW92ZSwKLQkuaWRfdGFibGUgPSBtc21fZGFpX3NsaW1fZHRfbWF0Y2gsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fZGFpX3NsaW1faW5pdCh2b2lkKQotewotCWludCByYzsKLQotCXJjID0gc2xpbV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfc2xpbV9kcml2ZXIpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggc2xpbWJ1cyBkcml2ZXIgcmMgPSAlZCIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLW1vZHVsZV9pbml0KG1zbV9kYWlfc2xpbV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG1zbV9kYWlfc2xpbV9leGl0KHZvaWQpCi17Ci19Ci1tb2R1bGVfZXhpdChtc21fZGFpX3NsaW1fZXhpdCk7Ci0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTbGltYnVzIGFwcHMtb3duZWQgY2hhbm5lbCBoYW5kbGluZyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXN0dWItdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZGFpLXN0dWItdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyYzNkMy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRhaS1zdHViLXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0KLWVudW0gewotCVNUVUJfUlgsCi0JU1RVQl9UWCwKLQlTVFVCXzFfUlgsCi0JU1RVQl8xX1RYLAotCVNUVUJfRFRNRl9UWCwKLQlTVFVCX0hPU1RfUlhfQ0FQVFVSRV9UWCwKLQlTVFVCX0hPU1RfUlhfUExBWUJBQ0tfUlgsCi0JU1RVQl9IT1NUX1RYX0NBUFRVUkVfVFgsCi0JU1RVQl9IT1NUX1RYX1BMQVlCQUNLX1JYLAotfTsKLQotc3RhdGljIGludCBtc21fZGFpX3N0dWJfc2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQl1bnNpZ25lZCBpbnQgdHhfbnVtLCB1bnNpZ25lZCBpbnQgKnR4X3Nsb3QsCi0JCXVuc2lnbmVkIGludCByeF9udW0sIHVuc2lnbmVkIGludCAqcnhfc2xvdCkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbXNtX2RhaV9zdHViX29wcyA9IHsKLQkuc2V0X2NoYW5uZWxfbWFwID0gbXNtX2RhaV9zdHViX3NldF9jaGFubmVsX21hcCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zdHViX2FkZF9yb3V0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQotCWlmICghZGFpIHx8ICFkYWktPmRyaXZlcikgewotCQlwcl9lcnIoIiVzIEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkYXBtID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RhcG0oZGFpLT5jb21wb25lbnQpOwotCW1lbXNldCgmaW50ZXJjb24sIDAsIHNpemVvZihpbnRlcmNvbikpOwotCWlmIChkYWktPmRyaXZlci0+cGxheWJhY2suc3RyZWFtX25hbWUgJiYKLQkJZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlcyBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQlfX2Z1bmNfXywgZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lKTsKLQkJaW50ZXJjb24uc291cmNlID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLmFpZl9uYW1lOwotCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPnBsYXliYWNrLnN0cmVhbV9uYW1lOwotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQlfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKLQl9Ci0JaWYgKGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lICYmCi0JCWRhaS0+ZHJpdmVyLT5jYXB0dXJlLmFpZl9uYW1lKSB7Ci0JCWRldl9kYmcoZGFpLT5kZXYsICIlcyBhZGQgcm91dGUgZm9yIHdpZGdldCAlcyIsCi0JCQlfX2Z1bmNfXywgZGFpLT5kcml2ZXItPmNhcHR1cmUuc3RyZWFtX25hbWUpOwotCQlpbnRlcmNvbi5zaW5rID0gZGFpLT5kcml2ZXItPmNhcHR1cmUuYWlmX25hbWU7Ci0JCWludGVyY29uLnNvdXJjZSA9IGRhaS0+ZHJpdmVyLT5jYXB0dXJlLnN0cmVhbV9uYW1lOwotCQlkZXZfZGJnKGRhaS0+ZGV2LCAiJXMgc3JjICVzIHNpbmsgJXNcbiIsCi0JCQlfX2Z1bmNfXywgaW50ZXJjb24uc291cmNlLCBpbnRlcmNvbi5zaW5rKTsKLQkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgJmludGVyY29uLCAxKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zdHViX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlyZXR1cm4gbXNtX2RhaV9zdHViX2FkZF9yb3V0ZShkYWkpOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9zdHViX2RhaV9yeCA9IHsKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJTdHViIFBsYXliYWNrIiwKLQkJLmFpZl9uYW1lID0gIlNUVUJfUlgiLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5jaGFubmVsc19taW4gPSAxLAotCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJLnJhdGVfbWluID0gODAwMCwKLQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JfSwKLQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCi0JLnByb2JlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUsCi0JLnJlbW92ZSA9ICZtc21fZGFpX3N0dWJfZGFpX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1zbV9kYWlfc3R1Yl9kYWlfdHhbXSA9IHsKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlN0dWIgQ2FwdHVyZSIsCi0JCQkuYWlmX25hbWUgPSAiU1RVQl9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9zdHViX29wcywKLQkJLnByb2JlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIlN0dWIxIENhcHR1cmUiLAotCQkJLmFpZl9uYW1lID0gIlNUVUJfMV9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9zdHViX29wcywKLQkJLnByb2JlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbXNtX2RhaV9zdHViX2R0bWZfdHhfZGFpID0gewotCS5jYXB0dXJlID0gewotCQkuc3RyZWFtX25hbWUgPSAiRFRNRiBUWCIsCi0JCS5haWZfbmFtZSA9ICJTVFVCX0RUTUZfVFgiLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCS5yYXRlX21pbiA9IDgwMDAsCi0JCS5yYXRlX21heCA9IDQ4MDAwLAotCX0sCi0JLm9wcyA9ICZtc21fZGFpX3N0dWJfb3BzLAotCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAotCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3N0dWJfaG9zdF9jYXB0dXJlX3R4X2RhaVtdID0gewotCXsKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQ1MtVk9JQ0UgSE9TVCBSWCBDQVBUVVJFIiwKLQkJCS5haWZfbmFtZSA9ICJTVFVCX0hPU1RfUlhfQ0FQVFVSRV9UWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzE2MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJCS5jaGFubmVsc19taW4gPSAxLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZV9taW4gPSA4MDAwLAotCQkJLnJhdGVfbWF4ID0gNDgwMDAsCi0JCX0sCi0JCS5vcHMgPSAmbXNtX2RhaV9zdHViX29wcywKLQkJLnByb2JlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcHJvYmUsCi0JCS5yZW1vdmUgPSAmbXNtX2RhaV9zdHViX2RhaV9yZW1vdmUsCi0JfSwKLQl7Ci0JCS5jYXB0dXJlID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkNTLVZPSUNFIEhPU1QgVFggQ0FQVFVSRSIsCi0JCQkuYWlmX25hbWUgPSAiU1RVQl9IT1NUX1RYX0NBUFRVUkVfVFgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCi0JCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBtc21fZGFpX3N0dWJfaG9zdF9wbGF5YmFja19yeF9kYWlbXSA9IHsKLQl7Ci0JCS5wbGF5YmFjayA9IHsKLQkJCS5zdHJlYW1fbmFtZSA9ICJDUy1WT0lDRSBIT1NUIFJYIFBMQVlCQUNLIiwKLQkJCS5haWZfbmFtZSA9ICJTVFVCX0hPU1RfUlhfUExBWUJBQ0tfUlgiLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQkgU05EUlZfUENNX1JBVEVfMTYwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlX21pbiA9IDgwMDAsCi0JCQkucmF0ZV9tYXggPSA0ODAwMCwKLQkJfSwKLQkJLm9wcyA9ICZtc21fZGFpX3N0dWJfb3BzLAotCQkucHJvYmUgPSAmbXNtX2RhaV9zdHViX2RhaV9wcm9iZSwKLQkJLnJlbW92ZSA9ICZtc21fZGFpX3N0dWJfZGFpX3JlbW92ZSwKLQl9LAotCXsKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIkNTLVZPSUNFIEhPU1QgVFggUExBWUJBQ0siLAotCQkJLmFpZl9uYW1lID0gIlNUVUJfSE9TVF9UWF9QTEFZQkFDS19SWCIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAotCQkJCSBTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCQkuY2hhbm5lbHNfbWluID0gMSwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVfbWluID0gODAwMCwKLQkJCS5yYXRlX21heCA9IDQ4MDAwLAotCQl9LAotCQkub3BzID0gJm1zbV9kYWlfc3R1Yl9vcHMsCi0JCS5wcm9iZSA9ICZtc21fZGFpX3N0dWJfZGFpX3Byb2JlLAotCQkucmVtb3ZlID0gJm1zbV9kYWlfc3R1Yl9kYWlfcmVtb3ZlLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBtc21fZGFpX3N0dWJfY29tcG9uZW50ID0gewotCS5uYW1lCQk9ICJtc20tZGFpLXN0dWItZGV2IiwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zdHViX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYywgaWQgPSAtMTsKLQljb25zdCBjaGFyICpzdHViX2Rldl9pZCA9ICJxY29tLG1zbS1kYWktc3R1Yi1kZXYtaWQiOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgc3R1Yl9kZXZfaWQsICZpZCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogbWlzc2luZyAlcyBpbiBkdCBub2RlXG4iLCBfX2Z1bmNfXywgc3R1Yl9kZXZfaWQpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcGRldi0+aWQgPSBpZDsKLQotCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXMsIGlkOiVkXG4iLCBfX2Z1bmNfXywKLQkJIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBwZGV2LT5pZCk7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBTVFVCX1JYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9zdHViX2NvbXBvbmVudCwgJm1zbV9kYWlfc3R1Yl9kYWlfcngsIDEpOwotCQlicmVhazsKLQljYXNlIFNUVUJfVFg6Ci0JCXJjID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKLQkJCSZtc21fZGFpX3N0dWJfY29tcG9uZW50LCAmbXNtX2RhaV9zdHViX2RhaV90eFswXSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RVQl8xX1RYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9zdHViX2NvbXBvbmVudCwgJm1zbV9kYWlfc3R1Yl9kYWlfdHhbMV0sIDEpOwotCQlicmVhazsKLQljYXNlIFNUVUJfRFRNRl9UWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsCi0JCQkmbXNtX2RhaV9zdHViX2R0bWZfdHhfZGFpLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVFVCX0hPU1RfUlhfQ0FQVFVSRV9UWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsCi0JCQkmbXNtX2RhaV9zdHViX2hvc3RfY2FwdHVyZV90eF9kYWlbMF0sIDEpOwotCQlicmVhazsKLQljYXNlIFNUVUJfSE9TVF9UWF9DQVBUVVJFX1RYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9zdHViX2NvbXBvbmVudCwKLQkJCSZtc21fZGFpX3N0dWJfaG9zdF9jYXB0dXJlX3R4X2RhaVsxXSwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RVQl9IT1NUX1JYX1BMQVlCQUNLX1JYOgotCQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCi0JCQkmbXNtX2RhaV9zdHViX2NvbXBvbmVudCwKLQkJCSZtc21fZGFpX3N0dWJfaG9zdF9wbGF5YmFja19yeF9kYWlbMF0sIDEpOwotCQlicmVhazsKLQljYXNlIFNUVUJfSE9TVF9UWF9QTEFZQkFDS19SWDoKLQkJcmMgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkJJm1zbV9kYWlfc3R1Yl9jb21wb25lbnQsCi0JCQkmbXNtX2RhaV9zdHViX2hvc3RfcGxheWJhY2tfcnhfZGFpWzFdLCAxKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2RhaV9zdHViX2Rldl9kdF9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXN0dWItZGV2IiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fZGFpX3N0dWJfZGV2X2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2RhaV9zdHViX2RldiA9IHsKLQkucHJvYmUgID0gbXNtX2RhaV9zdHViX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2RhaV9zdHViX2Rldl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLWRhaS1zdHViLWRldiIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fZGFpX3N0dWJfZGV2X2R0X21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9kYWlfc3R1Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYyA9IDA7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJkZXYgbmFtZSAlc1xuIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCi0JcmMgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwgTlVMTCwgTlVMTCwgJnBkZXYtPmRldik7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIGNoaWxkIG5vZGVzLCByYz0lZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JfSBlbHNlCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBhZGRlZCBjaGlsZCBub2RlXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RhaV9zdHViX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fZGFpX3N0dWJfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tZGFpLXN0dWIifSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2RhaV9zdHViX2R0X21hdGNoKTsKLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fZGFpX3N0dWJfZHJpdmVyID0gewotCS5wcm9iZSAgPSBtc21fZGFpX3N0dWJfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9kYWlfc3R1Yl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLWRhaS1zdHViIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9kYWlfc3R1Yl9kdF9tYXRjaCwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2RhaV9zdHViX2luaXQodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9kYWlfc3R1Yl9kcml2ZXIpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIHJlZ2lzdGVyIGRhaSBxNiBkcml2ZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX2RhaV9zdHViX2Rldik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGZhaWwgdG8gcmVnaXN0ZXIgZGFpIHE2IGRldiBkcml2ZXIiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZGFpX3N0dWJfZGV2X2ZhaWw7Ci0JfQotCXJldHVybiByYzsKLQotZGFpX3N0dWJfZGV2X2ZhaWw6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9kYWlfc3R1Yl9kcml2ZXIpOwotZmFpbDoKLQlyZXR1cm4gcmM7Ci19Ci1tb2R1bGVfaW5pdChtc21fZGFpX3N0dWJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fZGFpX3N0dWJfZXhpdCh2b2lkKQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtc21fZGFpX3N0dWJfZGV2KTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2RhaV9zdHViX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtc21fZGFpX3N0dWJfZXhpdCk7Ci0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNU00gU3R1YiBEU1AgREFJIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1jb21tb24uaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZG9sYnktY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNGU0MmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0KLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9NU01fRE9MQllfQ09NTU9OX0hfCi0jZGVmaW5lIF9NU01fRE9MQllfQ09NTU9OX0hfCi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotCi0jZGVmaW5lIERPTEJZX0JVTkRMRV9NT0RVTEVfSUQJCTB4MDAwMTA3MjMKLSNkZWZpbmUgRE9MQllfVklTVUFMSVpFUl9NT0RVTEVfSUQJMHgwMDAxMDcyQgotCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZESEUJCTB4MDAwMTA3NEQKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfVlNQRQkJMHgwMDAxMDc1MAotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EU1NGCQkweDAwMDEwNzUzCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RWTEkJCTB4MDAwMTA3M0UKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFZMTwkJMHgwMDAxMDczRgotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EVkxFCQkweDAwMDEwNzNDCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RWTUMJCTB4MDAwMTA3NDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFZNRQkJMHgwMDAxMDc0MAotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9JRU5CCQkweDAwMDEwNzQ0Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0lFQkYJCTB4MDAwMTA3NDUKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfSUVPTgkJMHgwMDAxMDc0MwotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ERU9OCQkweDAwMDEwNzM4Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX05HT04JCTB4MDAwMTA3MzYKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfR0VPTgkJMHgwMDAxMDc0OAotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9HRU5CCQkweDAwMDEwNzQ5Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0dFQkYJCTB4MDAwMTA3NEEKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfQU9OQgkJMHgwMDAxMDc1QgotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BT0JGCQkweDAwMDEwNzVDCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FPQkcJCTB4MDAwMTA3NUQKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfQU9PTgkJMHgwMDAxMDc1OQotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BUk5CCQkweDAwMDEwNzVGCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FSQkYJCTB4MDAwMTA3NjAKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfUExCCQkweDAwMDEwNzY4Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX1BMTUQJCTB4MDAwMTA3NjcKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfREhTQgkJMHgwMDAxMDc0RQotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ESFJHCQkweDAwMDEwNzRGCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RTU0IJCTB4MDAwMTA3NTEKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfRFNTQQkJMHgwMDAxMDc1MgotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9EVkxBCQkweDAwMDEwNzNECi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0lFQlQJCTB4MDAwMTA3NDYKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfSUVBCQkweDAwMDEwNzZBCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0RFQQkJMHgwMDAxMDczOQotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9ERUQJCTB4MDAwMTA3M0EKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfR0VCRwkJMHgwMDAxMDc0QgotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BT0NDCQkweDAwMDEwNzVBCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FSQkkJCTB4MDAwMTA3NjEKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfQVJCTAkJMHgwMDAxMDc2MgotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9BUkJICQkweDAwMDEwNzYzCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX0FST0QJCTB4MDAwMTA3NjQKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfQVJUUAkJMHgwMDAxMDc2NQotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WTU9OCQkweDAwMDEwNzU2Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZNQgkJMHgwMDAxMDc1NwotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WQ05CCQkweDAwMDEwNzMzCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lEX1ZDQkYJCTB4MDAwMTA3MzQKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfUFJFRwkJMHgwMDAxMDcyOAotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WRU4JCTB4MDAwMTA3MzIKLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfUFNURwkJMHgwMDAxMDcyOQotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFAJMHgwMDAxMDcyNwotCi0vKiBOb3QgVXNlZCB3aXRoIFNldCBQYXJhbSBrY29udHJvbCwgb25seSB0byBxdWVyeSB1c2luZyBHZXQgUGFyYW0gKi8KLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfVkVSCQkweDAwMDEwNzI2Ci0KLSNkZWZpbmUgRE9MQllfUEFSQU1fSURfVkNCRwkJMHgwMDAxMDczMAotI2RlZmluZSBET0xCWV9QQVJBTV9JRF9WQ0JFCQkweDAwMDEwNzMxCi0KLS8qIERPTEJZIERBUCBjb250cm9sIHBhcmFtcyAqLwotI2RlZmluZSBET0xCWV9DT01NSVRfQUxMX1RPX0RTUAkJMHg3MDAwMDAwMQotI2RlZmluZSBET0xCWV9DT01NSVRfVE9fRFNQCQkweDcwMDAwMDAyCi0jZGVmaW5lIERPTEJZX1VTRV9DQUNIRQkJCTB4NzAwMDAwMDMKLSNkZWZpbmUgRE9MQllfQVVUT19FTkRQCQkJMHg3MDAwMDAwNAotI2RlZmluZSBET0xCWV9BVVRPX0VORERFUF9QQVJBTVMJMHg3MDAwMDAwNQotI2RlZmluZSBET0xCWV9EQVBfQllQQVNTCQkweDcwMDAwMDA2Ci0KLSNkZWZpbmUgRE9MQllfRU5BQkxFX0NVU1RPTV9TVEVSRU8JMHgwMDAxMDhjNwotCi0vKiBET0xCWSBEQVAgb2Zmc2V0cyBzdGFydCAqLwotI2RlZmluZSBET0xCWV9QQVJBTV9WREhFX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fVkRIRV9PRkZTRVQgICAwCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZTUEVfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9WU1BFX09GRlNFVCAgIChET0xCWV9QQVJBTV9WREhFX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fVkRIRV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RTU0ZfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EU1NGX09GRlNFVCAgIChET0xCWV9QQVJBTV9WU1BFX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fVlNQRV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RWTElfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EVkxJX09GRlNFVCAgIChET0xCWV9QQVJBTV9EU1NGX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFNTRl9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RWTE9fTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EVkxPX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxJX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFZMSV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RWTEVfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EVkxFX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxPX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFZMT19MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RWTUNfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EVk1DX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVkxFX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFZMRV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RWTUVfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9EVk1FX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVk1DX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFZNQ19MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lFTkJfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9JRU5CX09GRlNFVCAgIChET0xCWV9QQVJBTV9EVk1FX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fRFZNRV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lFQkZfTEVOR1RIICAgNDAKLSNkZWZpbmUgRE9MQllfUEFSQU1fSUVCRl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVOQl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0lFTkJfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9JRU9OX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fSUVPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVCRl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0lFQkZfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9ERU9OX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fREVPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fSUVPTl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0lFT05fTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9OR09OX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fREVPTl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RFT05fTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9HRU9OX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fR0VPTl9PRkZTRVQgICAoRE9MQllfUEFSQU1fTkdPTl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX05HT05fTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fR0VOQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fR0VPTl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0dFT05fTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9HRUJGX0xFTkdUSCAgIDQwCi0jZGVmaW5lIERPTEJZX1BBUkFNX0dFQkZfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0dFTkJfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQU9OQl9MRU5HVEggICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FPTkJfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0dFQkZfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9HRUJGX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQU9CRl9MRU5HVEggICA0MAotI2RlZmluZSBET0xCWV9QQVJBTV9BT0JGX09GRlNFVCAgIChET0xCWV9QQVJBTV9BT05CX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQU9OQl9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FPQkdfTEVOR1RIICAgMzI5Ci0jZGVmaW5lIERPTEJZX1BBUkFNX0FPQkdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPQkZfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9BT0JGX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQU9PTl9MRU5HVEggICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FPT05fT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPQkdfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9BT0JHX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQVJOQl9MRU5HVEggICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FSTkJfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FPT05fT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9BT09OX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQVJCRl9MRU5HVEggICA0MAotI2RlZmluZSBET0xCWV9QQVJBTV9BUkJGX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUk5CX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJOQl9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX1BMQl9MRU5HVEggICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9QTEJfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9BUkJGX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJCRl9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX1BMTURfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9QTE1EX09GRlNFVCAgIChET0xCWV9QQVJBTV9QTEJfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9QTEJfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9ESFNCX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fREhTQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fUExNRF9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX1BMTURfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9ESFJHX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fREhSR19PRkZTRVQgICAoRE9MQllfUEFSQU1fREhTQl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RIU0JfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9EU1NCX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fRFNTQl9PRkZTRVQgICAoRE9MQllfUEFSQU1fREhSR19PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RIUkdfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9EU1NBX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fRFNTQV9PRkZTRVQgICAoRE9MQllfUEFSQU1fRFNTQl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RTU0JfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9EVkxBX0xFTkdUSCAgIDEKLSNkZWZpbmUgRE9MQllfUEFSQU1fRFZMQV9PRkZTRVQgICAoRE9MQllfUEFSQU1fRFNTQV9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RTU0FfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9JRUJUX0xFTkdUSCAgIDQwCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lFQlRfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0RWTEFfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9EVkxBX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fSUVBX0xFTkdUSCAgICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lFQV9PRkZTRVQgICAgKERPTEJZX1BBUkFNX0lFQlRfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9JRUJUX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fREVBX0xFTkdUSCAgICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RFQV9PRkZTRVQgICAgKERPTEJZX1BBUkFNX0lFQV9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0lFQV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0RFRF9MRU5HVEggICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9ERURfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9ERUFfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9ERUFfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9HRUJHX0xFTkdUSCAgIDQwCi0jZGVmaW5lIERPTEJZX1BBUkFNX0dFQkdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0RFRF9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0RFRF9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FPQ0NfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9BT0NDX09GRlNFVCAgIChET0xCWV9QQVJBTV9HRUJHX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fR0VCR19MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FSQklfTEVOR1RIICAgNDAKLSNkZWZpbmUgRE9MQllfUEFSQU1fQVJCSV9PRkZTRVQgICAoRE9MQllfUEFSQU1fQU9DQ19PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX0FPQ0NfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9BUkJMX0xFTkdUSCAgIDQwCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FSQkxfT0ZGU0VUICAgKERPTEJZX1BBUkFNX0FSQklfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9BUkJJX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fQVJCSF9MRU5HVEggICA0MAotI2RlZmluZSBET0xCWV9QQVJBTV9BUkJIX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUkJMX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJCTF9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FST0RfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9BUk9EX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUkJIX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJCSF9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX0FSVFBfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9BUlRQX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUk9EX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJPRF9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZNT05fTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9WTU9OX09GRlNFVCAgIChET0xCWV9QQVJBTV9BUlRQX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fQVJUUF9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZNQl9MRU5HVEggICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9WTUJfT0ZGU0VUICAgIChET0xCWV9QQVJBTV9WTU9OX09GRlNFVCArIFwKLQkJCQkJRE9MQllfUEFSQU1fVk1PTl9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZDTkJfTEVOR1RIICAgMQotI2RlZmluZSBET0xCWV9QQVJBTV9WQ05CX09GRlNFVCAgIChET0xCWV9QQVJBTV9WTUJfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9WTUJfTEVOR1RIKQotI2RlZmluZSBET0xCWV9QQVJBTV9WQ0JGX0xFTkdUSCAgIDIwCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZDQkZfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZDTkJfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9WQ05CX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fUFJFR19MRU5HVEggICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX1BSRUdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZDQkZfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9WQ0JGX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fVkVOX0xFTkdUSCAgICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX1ZFTl9PRkZTRVQgICAgKERPTEJZX1BBUkFNX1BSRUdfT0ZGU0VUICsgXAotCQkJCQlET0xCWV9QQVJBTV9QUkVHX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfUEFSQU1fUFNUR19MRU5HVEggICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX1BTVEdfT0ZGU0VUICAgKERPTEJZX1BBUkFNX1ZFTl9PRkZTRVQgKyBcCi0JCQkJCURPTEJZX1BBUkFNX1ZFTl9MRU5HVEgpCi0KLSNkZWZpbmUgRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RICQkxCi0jZGVmaW5lIERPTEJZX1BBUkFNX1BBWUxPQURfU0laRQkJMwotI2RlZmluZSBET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0JMzI5Ci0KLSNkZWZpbmUgVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNCQk3NDUKLSNkZWZpbmUgRE9MQllfVklTX1BBUkFNX0hFQURFUl9TSVpFCQkyNQotI2RlZmluZSBET0xCWV9QQVJBTV9WQ05CX01BWF9MRU5HVEgJCTQwCi0KLSNkZWZpbmUgRE9MQllfSU5WQUxJRF9QT1JUX0lECQkJLTEKLQotZW51bSB7Ci0JREVWSUNFX05PTkUJCQk9IDB4MCwKLQkvKiBvdXRwdXQgZGV2aWNlcyAqLwotCUVBUlBJRUNFCQkJPSAweDEsCi0JU1BFQUtFUgkJCQk9IDB4MiwKLQlXSVJFRF9IRUFEU0VUCQkJPSAweDQsCi0JV0lSRURfSEVBRFBIT05FCQkJPSAweDgsCi0JQkxVRVRPT1RIX1NDTwkJCT0gMHgxMCwKLQlCTFVFVE9PVEhfU0NPX0hFQURTRVQJCT0gMHgyMCwKLQlCTFVFVE9PVEhfU0NPX0NBUktJVAkJPSAweDQwLAotCUJMVUVUT09USF9BMkRQCQkJPSAweDgwLAotCUJMVUVUT09USF9BMkRQX0hFQURQSE9ORVMJPSAweDEwMCwKLQlCTFVFVE9PVEhfQTJEUF9TUEVBS0VSCQk9IDB4MjAwLAotCUFVWF9ESUdJVEFMCQkJPSAweDQwMCwKLQlBTkxHX0RPQ0tfSEVBRFNFVAkJPSAweDgwMCwKLQlER1RMX0RPQ0tfSEVBRFNFVAkJPSAweDEwMDAsCi0JVVNCX0FDQ0VTU09SWQkJCT0gMHgyMDAwLAotCVVTQl9ERVZJQ0UJCQk9IDB4NDAwMCwKLQlSRU1PVEVfU1VCTUlYCQkJPSAweDgwMDAsCi0JQU5DX0hFQURTRVQJCQk9IDB4MTAwMDAsCi0JQU5DX0hFQURQSE9ORQkJCT0gMHgyMDAwMCwKLQlQUk9YWQkJCQk9IDB4MjAwMDAwMCwKLQlGTQkJCQk9IDB4MTAwMDAwLAotCUZNX1RYCQkJCT0gMHgxMDAwMDAwLAotCURFVklDRV9PVVRfREVGQVVMVAkJPSAweDQwMDAwMDAwLAotCURFVklDRV9PVVRfQUxMCQkJPSAweDQwM0ZGRkZGLAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kb2xieS1kYXAtY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRvbGJ5LWRhcC1jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MzEwYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRvbGJ5LWRhcC1jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9NU01fRE9MQllfREFQX0NPTkZJR19IXwotI2RlZmluZSBfTVNNX0RPTEJZX0RBUF9DT05GSUdfSF8KLQotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgIm1zbS1kb2xieS1jb21tb24uaCIKLQotI2lmZGVmIENPTkZJR19ET0xCWV9EQVAKLS8qIERPTEJZIERPTEJZIEdVSURTICovCi0jZGVmaW5lIERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lECTB4MDAwMTAzM0IKLSNkZWZpbmUgTlVNX0RPTEJZX0VORFBfREVWSUNFICAgICAgICAgICAgICAgICAyMwotCi0jZGVmaW5lIERPTEJZX05VTV9FTkRQX0RFUEVOREVOVF9QQVJBTVMJICAzCi0jZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVAkgIDAKLSNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RICSAgMQotI2RlZmluZSBET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQgICAgKERPTEJZX0VORERFUF9QQVJBTV9EVkxPX09GRlNFVCArIFwKLQkJCQkJCURPTEJZX0VORERFUF9QQVJBTV9EVkxPX0xFTkdUSCkKLSNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX0RWTElfTEVOR1RIICAgIDEKLSNkZWZpbmUgRE9MQllfRU5EREVQX1BBUkFNX1ZNQl9PRkZTRVQgICAgIChET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9PRkZTRVQgKyBcCi0JCQkJCQlET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEgpCi0jZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9WTUJfTEVOR1RIICAgICAxCi0jZGVmaW5lIERPTEJZX0VORERFUF9QQVJBTV9MRU5HVEggICAgICAgICAoRE9MQllfRU5EREVQX1BBUkFNX0RWTE9fTEVOR1RIICsgXAotCQlET0xCWV9FTkRERVBfUEFSQU1fRFZMSV9MRU5HVEggKyBET0xCWV9FTkRERVBfUEFSQU1fVk1CX0xFTkdUSCkKLQotI2RlZmluZSBNQVhfRE9MQllfUEFSQU1TCQkJNDcKLSNkZWZpbmUgTUFYX0RPTEJZX0NUUkxfUEFSQU1TCQkJNQotI2RlZmluZSBBTExfRE9MQllfUEFSQU1TCQkJKE1BWF9ET0xCWV9QQVJBTVMgKyBcCi0JCQkJCQkJTUFYX0RPTEJZX0NUUkxfUEFSQU1TKQotI2RlZmluZSBET0xCWV9DT01NSVRfQUxMX0lEWAkJCU1BWF9ET0xCWV9QQVJBTVMKLSNkZWZpbmUgRE9MQllfQ09NTUlUX0lEWAkJCShNQVhfRE9MQllfUEFSQU1TKzEpCi0jZGVmaW5lIERPTEJZX1VTRV9DQUNIRV9JRFgJCQkoTUFYX0RPTEJZX1BBUkFNUysyKQotI2RlZmluZSBET0xCWV9BVVRPX0VORFBfSURYCQkJKE1BWF9ET0xCWV9QQVJBTVMrMykKLSNkZWZpbmUgRE9MQllfQVVUT19FTkRERVBfSURYCQkJKE1BWF9ET0xCWV9QQVJBTVMrNCkKLQotLyogRE9MQlkgZGV2aWNlIGRlZmluaXRpb25zICovCi1lbnVtIHsKLQlET0xCWV9FTkRQX0lOVF9TUEVBS0VSUyA9IDAsCi0JRE9MQllfRU5EUF9FWFRfU1BFQUtFUlMsCi0JRE9MQllfRU5EUF9IRUFEUEhPTkVTLAotCURPTEJZX0VORFBfSERNSSwKLQlET0xCWV9FTkRQX1NQRElGLAotCURPTEJZX0VORFBfRExOQSwKLQlET0xCWV9FTkRQX0FOQUxPRywKLX07Ci0KLS8qIERPTEJZIGRldmljZSBkZWZpbml0aW9ucyBlbmQgKi8KLQotc3RydWN0IGRvbGJ5X2RhcF9wYXJhbXMgewotCXVpbnQzMl90IHZhbHVlW1RPVEFMX0xFTkdUSF9ET0xCWV9QQVJBTSArIE1BWF9ET0xCWV9QQVJBTVNdOwotfSBfX3BhY2tlZDsKLQotaW50IG1zbV9kb2xieV9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCi0JCSAgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pOwotdm9pZCBtc21fZG9sYnlfZGFwX2RlaW5pdChpbnQgcG9ydF9pZCk7Ci12b2lkIG1zbV9kb2xieV9kYXBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSk7Ci1pbnQgZG9sYnlfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQkJICAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOwotLyogRG9sYnkgRE9MQlkgZW5kICovCi0jZWxzZQotaW50IG1zbV9kb2xieV9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCi0JCSAgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pCi17Ci0JcmV0dXJuIDA7Ci19Ci12b2lkIG1zbV9kb2xieV9kYXBfZGVpbml0KGludCBwb3J0X2lkKSB7IH0KLXZvaWQgbXNtX2RvbGJ5X2RhcF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKSB7IH0KLWludCBkb2xieV9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCQkgICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHMyLWRhcC1jb25maWcuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHMyLWRhcC1jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlNjlmYS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRzMi1kYXAtY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzE1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgotCi0jaW5jbHVkZSAibXNtLWRzMi1kYXAtY29uZmlnLmgiCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX0RPTEJZX0RTMikgfHwgZGVmaW5lZChDT05GSUdfRE9MQllfTElDRU5TRSkKLQotLyogcmFtcCB1cC9kb3duIGZvciAzMG1zICAgICovCi0jZGVmaW5lIERPTEJZX1NPRlRfVk9MVU1FX1BFUklPRAk0MAotLyogU3RlcCB2YWx1ZSAwbXMgb3IgMHVzICovCi0jZGVmaW5lIERPTEJZX1NPRlRfVk9MVU1FX1NURVAJCTEwMDAKLSNkZWZpbmUgRE9MQllfQURESVRJT05BTF9SQU1QX1dBSVQJMTAKLSNkZWZpbmUgU09GVF9WT0xVTUVfUEFSQU1fU0laRQkJMwotI2RlZmluZSBQQVJBTV9QQVlMT0FEX1NJWkUJCTMKLQotZW51bSB7Ci0JRE9MQllfU09GVF9WT0xVTUVfQ1VSVkVfTElORUFSID0gMCwKLQlET0xCWV9TT0ZUX1ZPTFVNRV9DVVJWRV9FWFAsCi0JRE9MQllfU09GVF9WT0xVTUVfQ1VSVkVfTE9HLAotfTsKLQotI2RlZmluZSBWT0xVTUVfWkVST19HQUlOICAgICAweDAKLSNkZWZpbmUgVk9MVU1FX1VOSVRZX0dBSU4gICAgMHgyMDAwCi0vKiBXYWl0IHRpbWUgZm9yIG1vZHVsZSBlbmFibGUvZGlzYmxlICovCi0jZGVmaW5lIERPTEJZX01PRFVMRV9FTkFCTEVfUEVSSU9EICAgICA1MAotCi0vKiBET0xCWSBkZXZpY2UgZGVmaW5pdGlvbnMgZW5kICovCi1lbnVtIHsKLQlET0xCWV9PRkZfQ0FDSEUgPSAwLAotCURPTEJZX1NQRUFLRVJfQ0FDSEUsCi0JRE9MQllfSEVBRFBIT05FX0NBQ0hFLAotCURPTEJZX0hETUlfQ0FDSEUsCi0JRE9MQllfV0ZEX0NBQ0hFLAotCURPTEJZX0ZNX0NBQ0hFLAotCURPTEJZX01BWF9DQUNIRSwKLX07Ci0KLWVudW0gewotCURBUF9TT0ZUX0JZUEFTUyA9IDAsCi0JREFQX0hBUkRfQllQQVNTLAotfTsKLQotZW51bSB7Ci0JTU9EVUxFX0RJU0FCTEUgPSAwLAotCU1PRFVMRV9FTkFCTEUsCi19OwotLyogZG9sYnkgcGFyYW0gaWRzIHRvL2Zyb20gZHNwICovCi1zdGF0aWMgdWludDMyX3QJZHMyX2RhcF9wYXJhbXNfaWRbTUFYX0RTMl9QQVJBTVNdID0gewotCURPTEJZX1BBUkFNX0lEX1ZESEUsIERPTEJZX1BBUkFNX0lEX1ZTUEUsIERPTEJZX1BBUkFNX0lEX0RTU0YsCi0JRE9MQllfUEFSQU1fSURfRFZMSSwgRE9MQllfUEFSQU1fSURfRFZMTywgRE9MQllfUEFSQU1fSURfRFZMRSwKLQlET0xCWV9QQVJBTV9JRF9EVk1DLCBET0xCWV9QQVJBTV9JRF9EVk1FLCBET0xCWV9QQVJBTV9JRF9JRU5CLAotCURPTEJZX1BBUkFNX0lEX0lFQkYsIERPTEJZX1BBUkFNX0lEX0lFT04sIERPTEJZX1BBUkFNX0lEX0RFT04sCi0JRE9MQllfUEFSQU1fSURfTkdPTiwgRE9MQllfUEFSQU1fSURfR0VPTiwgRE9MQllfUEFSQU1fSURfR0VOQiwKLQlET0xCWV9QQVJBTV9JRF9HRUJGLCBET0xCWV9QQVJBTV9JRF9BT05CLCBET0xCWV9QQVJBTV9JRF9BT0JGLAotCURPTEJZX1BBUkFNX0lEX0FPQkcsIERPTEJZX1BBUkFNX0lEX0FPT04sIERPTEJZX1BBUkFNX0lEX0FSTkIsCi0JRE9MQllfUEFSQU1fSURfQVJCRiwgRE9MQllfUEFSQU1fSURfUExCLCAgRE9MQllfUEFSQU1fSURfUExNRCwKLQlET0xCWV9QQVJBTV9JRF9ESFNCLCBET0xCWV9QQVJBTV9JRF9ESFJHLCBET0xCWV9QQVJBTV9JRF9EU1NCLAotCURPTEJZX1BBUkFNX0lEX0RTU0EsIERPTEJZX1BBUkFNX0lEX0RWTEEsIERPTEJZX1BBUkFNX0lEX0lFQlQsCi0JRE9MQllfUEFSQU1fSURfSUVBLCAgRE9MQllfUEFSQU1fSURfREVBLCAgRE9MQllfUEFSQU1fSURfREVELAotCURPTEJZX1BBUkFNX0lEX0dFQkcsIERPTEJZX1BBUkFNX0lEX0FPQ0MsIERPTEJZX1BBUkFNX0lEX0FSQkksCi0JRE9MQllfUEFSQU1fSURfQVJCTCwgRE9MQllfUEFSQU1fSURfQVJCSCwgRE9MQllfUEFSQU1fSURfQVJPRCwKLQlET0xCWV9QQVJBTV9JRF9BUlRQLCBET0xCWV9QQVJBTV9JRF9WTU9OLCBET0xCWV9QQVJBTV9JRF9WTUIsCi0JRE9MQllfUEFSQU1fSURfVkNOQiwgRE9MQllfUEFSQU1fSURfVkNCRiwgRE9MQllfUEFSQU1fSURfUFJFRywKLQlET0xCWV9QQVJBTV9JRF9WRU4sICBET0xCWV9QQVJBTV9JRF9QU1RHLCBET0xCWV9QQVJBTV9JRF9JTklUX0VORFAsCi19OwotCi0vKiBtb2RpZmVkIHN0YXRlOgkweDAwMDAwMDAwIC0gTm90IHVwZGF0ZWQKLSAqCQkJPiAweDAwMDAwMDAwICYmIDwgMHgwMDAxMDAwMAotICoJCQkJVXBkYXRlZCBhbmQgbm90IGNvbW1pdHRlZCB0byBEU1AKLSAqCQkJMHgwMDAxMDAwMSAtIFVwZGF0ZWQgYW5kIGNvbW1pdHRlZCB0byBEU1AKLSAqCQkJPiAweDAwMDEwMDAxIC0gTW9kaWZpZWQgdGhlIGNvbW1pdHRlZCB2YWx1ZQotICovCi0vKiBwYXJhbSBvZmZzZXQgKi8KLXN0YXRpYyB1aW50MzJfdAlkczJfZGFwX3BhcmFtc19vZmZzZXRbTUFYX0RTMl9QQVJBTVNdID0gewotCURPTEJZX1BBUkFNX1ZESEVfT0ZGU0VULCBET0xCWV9QQVJBTV9WU1BFX09GRlNFVCwKLQlET0xCWV9QQVJBTV9EU1NGX09GRlNFVCwgRE9MQllfUEFSQU1fRFZMSV9PRkZTRVQsCi0JRE9MQllfUEFSQU1fRFZMT19PRkZTRVQsIERPTEJZX1BBUkFNX0RWTEVfT0ZGU0VULAotCURPTEJZX1BBUkFNX0RWTUNfT0ZGU0VULCBET0xCWV9QQVJBTV9EVk1FX09GRlNFVCwKLQlET0xCWV9QQVJBTV9JRU5CX09GRlNFVCwgRE9MQllfUEFSQU1fSUVCRl9PRkZTRVQsCi0JRE9MQllfUEFSQU1fSUVPTl9PRkZTRVQsIERPTEJZX1BBUkFNX0RFT05fT0ZGU0VULAotCURPTEJZX1BBUkFNX05HT05fT0ZGU0VULCBET0xCWV9QQVJBTV9HRU9OX09GRlNFVCwKLQlET0xCWV9QQVJBTV9HRU5CX09GRlNFVCwgRE9MQllfUEFSQU1fR0VCRl9PRkZTRVQsCi0JRE9MQllfUEFSQU1fQU9OQl9PRkZTRVQsIERPTEJZX1BBUkFNX0FPQkZfT0ZGU0VULAotCURPTEJZX1BBUkFNX0FPQkdfT0ZGU0VULCBET0xCWV9QQVJBTV9BT09OX09GRlNFVCwKLQlET0xCWV9QQVJBTV9BUk5CX09GRlNFVCwgRE9MQllfUEFSQU1fQVJCRl9PRkZTRVQsCi0JRE9MQllfUEFSQU1fUExCX09GRlNFVCwgIERPTEJZX1BBUkFNX1BMTURfT0ZGU0VULAotCURPTEJZX1BBUkFNX0RIU0JfT0ZGU0VULCBET0xCWV9QQVJBTV9ESFJHX09GRlNFVCwKLQlET0xCWV9QQVJBTV9EU1NCX09GRlNFVCwgRE9MQllfUEFSQU1fRFNTQV9PRkZTRVQsCi0JRE9MQllfUEFSQU1fRFZMQV9PRkZTRVQsIERPTEJZX1BBUkFNX0lFQlRfT0ZGU0VULAotCURPTEJZX1BBUkFNX0lFQV9PRkZTRVQsICBET0xCWV9QQVJBTV9ERUFfT0ZGU0VULAotCURPTEJZX1BBUkFNX0RFRF9PRkZTRVQsICBET0xCWV9QQVJBTV9HRUJHX09GRlNFVCwKLQlET0xCWV9QQVJBTV9BT0NDX09GRlNFVCwgRE9MQllfUEFSQU1fQVJCSV9PRkZTRVQsCi0JRE9MQllfUEFSQU1fQVJCTF9PRkZTRVQsIERPTEJZX1BBUkFNX0FSQkhfT0ZGU0VULAotCURPTEJZX1BBUkFNX0FST0RfT0ZGU0VULCBET0xCWV9QQVJBTV9BUlRQX09GRlNFVCwKLQlET0xCWV9QQVJBTV9WTU9OX09GRlNFVCwgRE9MQllfUEFSQU1fVk1CX09GRlNFVCwKLQlET0xCWV9QQVJBTV9WQ05CX09GRlNFVCwgRE9MQllfUEFSQU1fVkNCRl9PRkZTRVQsCi0JRE9MQllfUEFSQU1fUFJFR19PRkZTRVQsIERPTEJZX1BBUkFNX1ZFTl9PRkZTRVQsCi0JRE9MQllfUEFSQU1fUFNUR19PRkZTRVQsIERPTEJZX1BBUkFNX0lOVF9FTkRQX09GRlNFVCwKLX07Ci0vKiBwYXJhbV9sZW5ndGggKi8KLXN0YXRpYyB1aW50MzJfdAlkczJfZGFwX3BhcmFtc19sZW5ndGhbTUFYX0RTMl9QQVJBTVNdID0gewotCURPTEJZX1BBUkFNX1ZESEVfTEVOR1RILCBET0xCWV9QQVJBTV9WU1BFX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9EU1NGX0xFTkdUSCwgRE9MQllfUEFSQU1fRFZMSV9MRU5HVEgsCi0JRE9MQllfUEFSQU1fRFZMT19MRU5HVEgsIERPTEJZX1BBUkFNX0RWTEVfTEVOR1RILAotCURPTEJZX1BBUkFNX0RWTUNfTEVOR1RILCBET0xCWV9QQVJBTV9EVk1FX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9JRU5CX0xFTkdUSCwgRE9MQllfUEFSQU1fSUVCRl9MRU5HVEgsCi0JRE9MQllfUEFSQU1fSUVPTl9MRU5HVEgsIERPTEJZX1BBUkFNX0RFT05fTEVOR1RILAotCURPTEJZX1BBUkFNX05HT05fTEVOR1RILCBET0xCWV9QQVJBTV9HRU9OX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9HRU5CX0xFTkdUSCwgRE9MQllfUEFSQU1fR0VCRl9MRU5HVEgsCi0JRE9MQllfUEFSQU1fQU9OQl9MRU5HVEgsIERPTEJZX1BBUkFNX0FPQkZfTEVOR1RILAotCURPTEJZX1BBUkFNX0FPQkdfTEVOR1RILCBET0xCWV9QQVJBTV9BT09OX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9BUk5CX0xFTkdUSCwgRE9MQllfUEFSQU1fQVJCRl9MRU5HVEgsCi0JRE9MQllfUEFSQU1fUExCX0xFTkdUSCwgIERPTEJZX1BBUkFNX1BMTURfTEVOR1RILAotCURPTEJZX1BBUkFNX0RIU0JfTEVOR1RILCBET0xCWV9QQVJBTV9ESFJHX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9EU1NCX0xFTkdUSCwgRE9MQllfUEFSQU1fRFNTQV9MRU5HVEgsCi0JRE9MQllfUEFSQU1fRFZMQV9MRU5HVEgsIERPTEJZX1BBUkFNX0lFQlRfTEVOR1RILAotCURPTEJZX1BBUkFNX0lFQV9MRU5HVEgsICBET0xCWV9QQVJBTV9ERUFfTEVOR1RILAotCURPTEJZX1BBUkFNX0RFRF9MRU5HVEgsICBET0xCWV9QQVJBTV9HRUJHX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9BT0NDX0xFTkdUSCwgRE9MQllfUEFSQU1fQVJCSV9MRU5HVEgsCi0JRE9MQllfUEFSQU1fQVJCTF9MRU5HVEgsIERPTEJZX1BBUkFNX0FSQkhfTEVOR1RILAotCURPTEJZX1BBUkFNX0FST0RfTEVOR1RILCBET0xCWV9QQVJBTV9BUlRQX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9WTU9OX0xFTkdUSCwgRE9MQllfUEFSQU1fVk1CX0xFTkdUSCwKLQlET0xCWV9QQVJBTV9WQ05CX0xFTkdUSCwgRE9MQllfUEFSQU1fVkNCRl9MRU5HVEgsCi0JRE9MQllfUEFSQU1fUFJFR19MRU5HVEgsIERPTEJZX1BBUkFNX1ZFTl9MRU5HVEgsCi0JRE9MQllfUEFSQU1fUFNUR19MRU5HVEgsIERPTEJZX1BBUkFNX0lOVF9FTkRQX0xFTkdUSCwKLX07Ci0KLXN0cnVjdCBkczJfZGFwX3BhcmFtc19zIHsKLQlpbnQzMl90IHBhcmFtc192YWxbVE9UQUxfTEVOR1RIX0RTMl9QQVJBTV07Ci0JaW50MzJfdCBkYXBfcGFyYW1zX21vZGlmaWVkW01BWF9EUzJfUEFSQU1TXTsKLX07Ci0KLXN0cnVjdCBhdWRpb19yeF9jYWxfZGF0YSB7Ci0JY2hhciBhdWRfcHJvY19kYXRhW0FVRF9QUk9DX0JMT0NLX1NJWkVdOwotCWludDMyX3QgIGF1ZF9wcm9jX3NpemU7Ci0JY2hhciBhdWRfdm9sX2RhdGFbQVVEX1ZPTF9CTE9DS19TSVpFXTsKLQlpbnQzMl90IGF1ZF92b2xfc2l6ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfcyBkczJfZGFwX3BhcmFtc1tET0xCWV9NQVhfQ0FDSEVdOwotCi1zdHJ1Y3QgZHMyX2RldmljZV9tYXBwaW5nIHsKLQlpbnQzMl90IGRldmljZV9pZDsgLyogYXVkaW9fb3V0Xy4uLiAqLwotCWludCBwb3J0X2lkOyAvKiBhZmUgcG9ydC4gY29uc3RhbnQgZm9yIGEgdGFyZ2V0IHZhcmlhbnQuIHJvdXRpbmctdjIqLwotCS8qT25seSBvbmUgRG9sYnkgQ09QUCAgZm9yIGEgc3BlY2lmaWMgcG9ydCovCi0JaW50IGNvcHBfaWR4OyAvKiBpZHggZm9yIHRoZSBjb3BwIHBvcnQgb24gd2hpY2ggZHMyIGlzIGFjdGl2ZSAqLwotCWludCBjYWNoZV9kZXY7IC8qIGlkeCB0byBhIHNoYXJlZCBwYXJhbWV0ZXIgYXJyYXkgZGVwZW5kZW50IG9uIGRldmljZSovCi0JdWludDMyX3Qgc3RyZWFtX3JlZl9jb3VudDsKLQlib29sIGFjdGl2ZTsKLQl2b2lkICpjYWxfZGF0YTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZHMyX2RldmljZV9tYXBwaW5nIGRldl9tYXBbRFMyX0RFVklDRVNfQUxMXTsKLQotc3RydWN0IGRzMl9kYXBfcGFyYW1zX3N0YXRlc19zIHsKLQlib29sIHVzZV9jYWNoZTsKLQlib29sIGRhcF9ieXBhc3M7Ci0JYm9vbCBkYXBfYnlwYXNzX3R5cGU7Ci0JYm9vbCBub2RlX29wZW5lZDsKLQlpbnQzMl90ICBkZXZpY2U7Ci0JYm9vbCBjdXN0b21fc3RlcmVvX29ub2ZmOwotfTsKLQotc3RhdGljIHN0cnVjdCBkczJfZGFwX3BhcmFtc19zdGF0ZXNfcyBkczJfZGFwX3BhcmFtc19zdGF0ZXMgPSB7dHJ1ZSwgZmFsc2UsCi0JCQkJZmFsc2UsIERFVklDRV9OT05FfTsKLQotc3RhdGljIGludCBhbGxfc3VwcG9ydGVkX2RldmljZXMgPSBFQVJQSUVDRXxTUEVBS0VSfFdJUkVEX0hFQURTRVR8Ci0JCQlXSVJFRF9IRUFEUEhPTkV8QkxVRVRPT1RIX1NDT3xBVVhfRElHSVRBTHwKLQkJCUFOTEdfRE9DS19IRUFEU0VUfERHVExfRE9DS19IRUFEU0VUfAotCQkJUkVNT1RFX1NVQk1JWHxBTkNfSEVBRFNFVHxBTkNfSEVBRFBIT05FfAotCQkJUFJPWFl8Rk18Rk1fVFh8REVWSUNFX05PTkV8Ci0JCQlCTFVFVE9PVEhfU0NPX0hFQURTRVR8QkxVRVRPT1RIX1NDT19DQVJLSVQ7Ci0KLQotc3RhdGljIHZvaWQgbXNtX2RzMl9kYXBfY2hlY2tfYW5kX3VwZGF0ZV9yYW1wX3dhaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCQkJCSAgIGludCAqcmFtcF93YWl0KQotewotCi0JaW50MzJfdCAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEw7Ci0JdWludDMyX3QgcGFyYW1zX2xlbmd0aCA9IFNPRlRfVk9MVU1FX1BBUkFNX1NJWkUgKiBzaXplb2YodWludDMyX3QpOwotCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0gUEFSQU1fUEFZTE9BRF9TSVpFICogc2l6ZW9mKHVpbnQzMl90KTsKLQlpbnQgcmMgPSAwOwotCi0JdXBkYXRlX3BhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdXBkYXRlX3BhcmFtc192YWx1ZSkKLQkJZ290byBlbmQ7Ci0KLQlyYyA9IGFkbV9nZXRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAotCQkJICAgIEFVRFBST0NfTU9EVUxFX0lEX1ZPTF9DVFJMLAotCQkJICAgIEFVRFBST0NfUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUywKLQkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCi0JCQkgICAgKGNoYXIgKikgdXBkYXRlX3BhcmFtc192YWx1ZSk7Ci0JaWYgKHJjID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBwYXJhbXNfdmFsdWUgWzB4JXgsIDB4JXgsIDB4JXhdXG4iLAotCQkJX19mdW5jX18sIHVwZGF0ZV9wYXJhbXNfdmFsdWVbMF0sCi0JCQl1cGRhdGVfcGFyYW1zX3ZhbHVlWzFdLAotCQkJdXBkYXRlX3BhcmFtc192YWx1ZVsyXSk7Ci0JCSpyYW1wX3dhaXQgPSB1cGRhdGVfcGFyYW1zX3ZhbHVlWzBdOwotCX0KLWVuZDoKLQlrZnJlZSh1cGRhdGVfcGFyYW1zX3ZhbHVlKTsKLQkvKgotCSAqIE5vIGVycm9yIHJldHVybmVkIGFzIHdlIGRvIG5vdCBuZWVkIHRvIGVycm9yIG91dCBmcm9tIGRhcCBvbi9kYXAKLQkgKiBieXBhc3MuIFRoZSBkZWZhdWx0IHJhbXAgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCB0byB3YWl0IGR1cmluZwotCSAqIHJhbXAgZG93bi4KLQkgKi8KLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9zZXRfdnNwZV92ZGhlKGludCBkZXZfbWFwX2lkeCwKLQkJCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCWludDMyX3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBOVUxMOwotCWludDMyX3QgKnBhcmFtX3ZhbCA9IE5VTEw7Ci0JaW50IGlkeCwgaSwgaiwgcmMgPSAwLCBjZGV2OwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsKLQkJCQkyICogRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqCi0JCQkJc2l6ZW9mKHVpbnQzMl90KTsKLQotCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA8IDApIHx8Ci0JCShkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgIT0gU0xJTUJVU18wX1JYKSAmJgotCSAgICAgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgIT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpKSB7Ci0JCXByX2RlYnVnKCIlczpObyBDdXN0b20gc3RlcmVvIGZvciBwb3J0OjB4JXhcbiIsCi0JCQkgX19mdW5jX18sIGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQl1cGRhdGVfcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVwZGF0ZV9wYXJhbXNfdmFsdWUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVuZDsKLQl9Ci0JcGFyYW1zX2xlbmd0aCA9IDA7Ci0JcGFyYW1fdmFsID0gdXBkYXRlX3BhcmFtc192YWx1ZTsKLQljZGV2ID0gZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FjaGVfZGV2OwotCS8qIGZvciBWREhFIGFuZCBWU1BFIERBUCBwYXJhbXMgYXQgaW5kZXggMCBhbmQgMSBpbiB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX0JVTkRMRV9NT0RVTEVfSUQ7Ci0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkczJfZGFwX3BhcmFtc19pZFtpXTsKLQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IGRzMl9kYXBfcGFyYW1zX2xlbmd0aFtpXSAqCi0JCQkJCXNpemVvZih1aW50MzJfdCk7Ci0JCWlkeCA9IGRzMl9kYXBfcGFyYW1zX29mZnNldFtpXTsKLQkJZm9yIChqID0gMDsgaiA8IGRzMl9kYXBfcGFyYW1zX2xlbmd0aFtpXTsgaisrKSB7Ci0JCQlpZiAoaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotCQkJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSAwOwotCQkJZWxzZQotCQkJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPQotCQkJCQlkczJfZGFwX3BhcmFtc1tjZGV2XS5wYXJhbXNfdmFsW2lkeCtqXTsKLQkJfQotCQlwYXJhbXNfbGVuZ3RoICs9IChET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUgKwotCQkJCSAgZHMyX2RhcF9wYXJhbXNfbGVuZ3RoW2ldKSAqCi0JCQkJICBzaXplb2YodWludDMyX3QpOwotCX0KLQotCXByX2RlYnVnKCIlczogdmFsaWQgcGFyYW0gbGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sIHBhcmFtc19sZW5ndGgpOwotCWlmIChwYXJhbXNfbGVuZ3RoKSB7Ci0JCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAotCQkJCQkgICAgICAgZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHgsCi0JCQkJCSAgICAgICAoY2hhciAqKXBhcmFtX3ZhbCwKLQkJCQkJICAgICAgIHBhcmFtc19sZW5ndGgpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IHNlbmQgdmRoZS92c3BlIHBhcmFtcyBmYWlsZWQgd2l0aCByYz0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0Ja2ZyZWUocGFyYW1fdmFsKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxdGlfc2V0X2N1c3RvbV9zdGVyZW9fb24oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCSAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX29uKQotewotCi0JdWludDE2X3Qgb3BfRkxfaXBfRkxfd2VpZ2h0OwotCXVpbnQxNl90IG9wX0ZMX2lwX0ZSX3dlaWdodDsKLQl1aW50MTZfdCBvcF9GUl9pcF9GTF93ZWlnaHQ7Ci0JdWludDE2X3Qgb3BfRlJfaXBfRlJfd2VpZ2h0OwotCi0JaW50MzJfdCAqdXBkYXRlX3BhcmFtc192YWx1ZTMyID0gTlVMTCwgcmMgPSAwOwotCWludDMyX3QgKnBhcmFtX3ZhbCA9IE5VTEw7Ci0JaW50MTZfdCAqdXBkYXRlX3BhcmFtc192YWx1ZTE2ID0gMDsKLQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoX2J5dGVzID0gQ1VTVE9NX1NURVJFT19QQVlMT0FEX1NJWkUgKgotCQkJCSAgICAgICBzaXplb2YodWludDMyX3QpOwotCXVpbnQzMl90IGF2YWlsX2xlbmd0aCA9IHBhcmFtc19sZW5ndGhfYnl0ZXM7Ci0KLQlpZiAoKHBvcnRfaWQgIT0gU0xJTUJVU18wX1JYKSAmJgotCSAgICAgKHBvcnRfaWQgIT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpKSB7Ci0JCXByX2RlYnVnKCIlczpObyBDdXN0b20gc3RlcmVvIGZvciBwb3J0OjB4JXhcbiIsCi0JCQkgX19mdW5jX18sIHBvcnRfaWQpOwotCQlnb3RvIHNraXBfc2VuZF9jbWQ7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwb3J0IDB4JXgsIGNvcHBfaWR4ICVkLCBpc19jdXN0b21fc3RlcmVvX29uICVkXG4iLAotCQkgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBpc19jdXN0b21fc3RlcmVvX29uKTsKLQlpZiAoaXNfY3VzdG9tX3N0ZXJlb19vbikgewotCQlvcF9GTF9pcF9GTF93ZWlnaHQgPQotCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOwotCQlvcF9GTF9pcF9GUl93ZWlnaHQgPQotCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOwotCQlvcF9GUl9pcF9GTF93ZWlnaHQgPQotCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOwotCQlvcF9GUl9pcF9GUl93ZWlnaHQgPQotCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOwotCX0gZWxzZSB7Ci0JCW9wX0ZMX2lwX0ZMX3dlaWdodCA9IFExNF9HQUlOX1VOSVRZOwotCQlvcF9GTF9pcF9GUl93ZWlnaHQgPSAwOwotCQlvcF9GUl9pcF9GTF93ZWlnaHQgPSAwOwotCQlvcF9GUl9pcF9GUl93ZWlnaHQgPSBRMTRfR0FJTl9VTklUWTsKLQl9Ci0KLQl1cGRhdGVfcGFyYW1zX3ZhbHVlMzIgPSBremFsbG9jKHBhcmFtc19sZW5ndGhfYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmICghdXBkYXRlX3BhcmFtc192YWx1ZTMyKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBza2lwX3NlbmRfY21kOwotCX0KLQlwYXJhbV92YWwgPSB1cGRhdGVfcGFyYW1zX3ZhbHVlMzI7Ci0JaWYgKGF2YWlsX2xlbmd0aCA8IDIgKiBzaXplb2YodWludDMyX3QpKQotCQlnb3RvIHNraXBfc2VuZF9jbWQ7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUzMisrID0gTVRNWF9NT0RVTEVfSURfREVGQVVMVF9DSE1JWEVSOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMzIrKyA9IERFRkFVTFRfQ0hNSVhFUl9QQVJBTV9JRF9DT0VGRjsKLQlhdmFpbF9sZW5ndGggPSBhdmFpbF9sZW5ndGggLSAoMiAqIHNpemVvZih1aW50MzJfdCkpOwotCi0JdXBkYXRlX3BhcmFtc192YWx1ZTE2ID0gKGludDE2X3QgKil1cGRhdGVfcGFyYW1zX3ZhbHVlMzI7Ci0JaWYgKGF2YWlsX2xlbmd0aCA8IDEwICogc2l6ZW9mKHVpbnQxNl90KSkKLQkJZ290byBza2lwX3NlbmRfY21kOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fQ01EX1BBUkFNX1NJWkU7Ci0JLyogZm9yIGFsaWdubWVudCBvbmx5Ki8KLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSAwOwotCS8qIGluZGV4IGlzIDMyLWJpdCBwYXJhbSBpbiBsaXR0bGUgZW5kaWFuKi8KLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBDVVNUT01fU1RFUkVPX0lOREVYX1BBUkFNOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IDA7Ci0JLyogZm9yIHN0ZXJlbyBtaXhpbmcgbnVtIG91dCBjaCovCi0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19OVU1fT1VUX0NIOwotCS8qIGZvciBzdGVyZW8gbWl4aW5nIG51bSBpbiBjaCovCi0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19OVU1fSU5fQ0g7Ci0KLQkvKiBPdXQgY2ggbWFwIEZML0ZSKi8KLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GTDsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GUjsKLQotCS8qIEluIGNoIG1hcCBGTC9GUiovCi0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRkw7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gUENNX0NIQU5ORUxfRlI7Ci0JYXZhaWxfbGVuZ3RoID0gYXZhaWxfbGVuZ3RoIC0gKDEwICogc2l6ZW9mKHVpbnQxNl90KSk7Ci0JLyogd2VpZ2h0aW5nIGNvZWZmaWNpZW50cyBhcyBuYW1lIHN1Z2dlc3RzLAotCSAqIG1peGluZyB3aWxsIGJlIGRvbmUgYWNjb3JkaW5nIHRvIHRoZXNlIGNvZWZmaWNpZW50cwotCSAqLwotCWlmIChhdmFpbF9sZW5ndGggPCA0ICogc2l6ZW9mKHVpbnQxNl90KSkKLQkJZ290byBza2lwX3NlbmRfY21kOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZMX2lwX0ZMX3dlaWdodDsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBvcF9GTF9pcF9GUl93ZWlnaHQ7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gb3BfRlJfaXBfRkxfd2VpZ2h0OwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZSX2lwX0ZSX3dlaWdodDsKLQlhdmFpbF9sZW5ndGggPSBhdmFpbF9sZW5ndGggLSAoNCAqIHNpemVvZih1aW50MTZfdCkpOwotCWlmIChwYXJhbXNfbGVuZ3RoX2J5dGVzICE9IDApIHsKLQkJcmMgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LAotCQkJCShjaGFyICopcGFyYW1fdmFsLAotCQkJCXBhcmFtc19sZW5ndGhfYnl0ZXMpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IHNlbmQgcGFyYW1zIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gc2tpcF9zZW5kX2NtZDsKLQkJfQotCX0KLQlrZnJlZShwYXJhbV92YWwpOwotCXJldHVybiAwOwotc2tpcF9zZW5kX2NtZDoKLQkJcHJfZXJyKCIlczogaW5zdWZmaWNpZW50IG1lbW9yeSwgc2VuZCBjbWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlrZnJlZShwYXJhbV92YWwpOwotCQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IGRhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgZGV2X21hcF9pZHgsCi0JCQkJCWJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCi0JaW50MzJfdCAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEwsIHJjID0gMDsKLQlpbnQzMl90ICpwYXJhbV92YWwgPSBOVUxMOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGhfYnl0ZXMgPSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsKLQkJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpICogc2l6ZW9mKHVpbnQzMl90KTsKLQlpZiAoKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgIT0gU0xJTUJVU18wX1JYKSAmJgotCSAgICAgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgIT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpKSB7Ci0JCXByX2RlYnVnKCIlczpObyBDdXN0b20gc3RlcmVvIGZvciBwb3J0OjB4JXhcbiIsCi0JCQkgX19mdW5jX18sIGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4IDwgMCkgfHwKLQkJKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQkvKiBEQVAgY3VzdG9tIHN0ZXJlbyAqLwotCW1zbV9kczJfZGFwX3NldF92c3BlX3ZkaGUoZGV2X21hcF9pZHgsCi0JCQkJICBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOwotCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGhfYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmICghdXBkYXRlX3BhcmFtc192YWx1ZSkgewotCQlwcl9lcnIoIiVzOiBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZW5kOwotCX0KLQlwYXJhbXNfbGVuZ3RoX2J5dGVzID0gMDsKLQlwYXJhbV92YWwgPSB1cGRhdGVfcGFyYW1zX3ZhbHVlOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9FTkFCTEVfQ1VTVE9NX1NURVJFTzsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gc2l6ZW9mKHVpbnQzMl90KTsKLQlpZiAoaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gMTsKLQllbHNlCi0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSAwOwotCXBhcmFtc19sZW5ndGhfYnl0ZXMgKz0gKERPTEJZX1BBUkFNX1BBWUxPQURfU0laRSArIDEpICoKLQkJCQlzaXplb2YodWludDMyX3QpOwotCXByX2RlYnVnKCIlczogdmFsaWQgcGFyYW0gbGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sIHBhcmFtc19sZW5ndGhfYnl0ZXMpOwotCWlmIChwYXJhbXNfbGVuZ3RoX2J5dGVzKSB7Ci0JCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAotCQkJCQkgICAgICAgZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHgsCi0JCQkJCSAgICAgICAoY2hhciAqKXBhcmFtX3ZhbCwKLQkJCQkJICAgICAgIHBhcmFtc19sZW5ndGhfYnl0ZXMpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IGN1c3RvbSBzdGVyZW8gcGFyYW0gZmFpbGVkIHdpdGggcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JfQotZW5kOgotCWtmcmVlKHBhcmFtX3ZhbCk7Ci0JcmV0dXJuIHJjOwotCi19Ci0KLQotc3RhdGljIGludCBzZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgZGV2X21hcF9pZHgsCi0JCQkJCWJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1hcCBpbmRleCAlZCwgY3VzdG9tIHN0ZXJlbyAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4LAotCQkgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKTsKLQotCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0IGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA8IDApIHx8Ci0JCShkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgY29wcCBpZHhcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSAmJgotCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09IERBUF9IQVJEX0JZUEFTUykgewotCi0JCXJjID0gcXRpX3NldF9jdXN0b21fc3RlcmVvX29uKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQsCi0JCQkJCSAgICAgIGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LAotCQkJCQkgICAgICBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnF0aV9zZXRfY3VzdG9tX3N0ZXJlb19vbl9jb3BwIGZhaWxlZCBDLlMgJWQiLAotCQkJCV9fZnVuY19fLCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOwotCQl9Ci0JCWdvdG8gZW5kOwotCi0JfQotCi0JaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID09IGZhbHNlKSB7Ci0JCXJjID0gZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGRldl9tYXBfaWR4LAotCQkJCQkJIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6cXRpX3NldF9jdXN0b21fc3RlcmVvX29uX2NvcHAgZmFpbGVkIEMuUyAlZCIsCi0JCQkJX19mdW5jX18sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCk7Ci0JCX0KLQkJZ290byBlbmQ7Ci0JfQotZW5kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9hbGxvY19hbmRfc3RvcmVfY2FsX2RhdGEoaW50IGRldl9tYXBfaWR4LCBpbnQgcGF0aCwKLQkJCQkJICAgIGludCBwZXJmX21vZGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fcnhfY2FsX2RhdGEgKmF1ZF9jYWxfZGF0YTsKLQotCXByX2RlYnVnKCIlczogcGF0aCAlZCwgcGVyZl9tb2RlICVkLCBkZXZfbWFwX2lkeCAlZFxuIiwKLQkJX19mdW5jX18sIHBhdGgsIHBlcmZfbW9kZSwgZGV2X21hcF9pZHgpOwotCi0JaWYgKGRldl9tYXBfaWR4IDwgMCB8fCBkZXZfbWFwX2lkeCA+PSBEUzJfREVWSUNFU19BTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBkZXYgbWFwIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgZGV2X21hcF9pZHgpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWF1ZF9jYWxfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19yeF9jYWxfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghYXVkX2NhbF9kYXRhKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcmMgPSBhZG1fc3RvcmVfY2FsX2RhdGEoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKLQkJCQlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwgcGF0aCwgcGVyZl9tb2RlLAotCQkJCUFETV9BVURQUk9DX0NBTCwgYXVkX2NhbF9kYXRhLT5hdWRfcHJvY19kYXRhLAotCQkJCSZhdWRfY2FsX2RhdGEtPmF1ZF9wcm9jX3NpemUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogc3RvcmUgY2FsIGRhdGEgZXJyICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlrZnJlZShhdWRfY2FsX2RhdGEpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlyYyA9IGFkbV9zdG9yZV9jYWxfZGF0YShkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAotCQkJCWRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LCBwYXRoLCBwZXJmX21vZGUsCi0JCQkJQURNX0FVRFZPTF9DQUwsIGF1ZF9jYWxfZGF0YS0+YXVkX3ZvbF9kYXRhLAotCQkJCSZhdWRfY2FsX2RhdGEtPmF1ZF92b2xfc2l6ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBzdG9yZSBjYWwgZGF0YSBlcnIgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWtmcmVlKGF1ZF9jYWxfZGF0YSk7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWRldl9tYXBbZGV2X21hcF9pZHhdLmNhbF9kYXRhID0gKHZvaWQgKilhdWRfY2FsX2RhdGE7Ci0KLWVuZDoKLQlwcl9kZWJ1ZygiJXM6IHJldCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfZnJlZV9jYWxfZGF0YShpbnQgZGV2X21hcF9pZHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fcnhfY2FsX2RhdGEgKmF1ZF9jYWxfZGF0YTsKLQotCXByX2RlYnVnKCIlczogZGV2X21hcF9pZHggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7Ci0JaWYgKGRldl9tYXBfaWR4IDwgMCB8fCBkZXZfbWFwX2lkeCA+PSBEUzJfREVWSUNFU19BTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBkZXYgbWFwIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgZGV2X21hcF9pZHgpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQlhdWRfY2FsX2RhdGEgPSAoc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhICopCi0JCQkJZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FsX2RhdGE7Ci0Ja2ZyZWUoYXVkX2NhbF9kYXRhKTsKLQlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jYWxfZGF0YSA9IE5VTEw7Ci0KLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2VuZF9jYWxfZGF0YShpbnQgZGV2X21hcF9pZHgpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fcnhfY2FsX2RhdGEgKmF1ZF9jYWxfZGF0YSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRldm1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQlpZiAoZGV2X21hcF9pZHggPCAwIHx8IGRldl9tYXBfaWR4ID49IERTMl9ERVZJQ0VTX0FMTCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGRldiBtYXAgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBkZXZfbWFwX2lkeCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKGRldl9tYXBbZGV2X21hcF9pZHhdLmNhbF9kYXRhID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTm8gdmFsaWQgY2FsaWJyYXRpb24gZGF0YSBzdG9yZWQgZm9yIGlkeCAlZFxuIiwKLQkJCV9fZnVuY19fLCBkZXZfbWFwX2lkeCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JLyogc2VuZCBhdWQgcHJvYyBjYWwgKi8KLQlhdWRfY2FsX2RhdGEgPSAoc3RydWN0IGF1ZGlvX3J4X2NhbF9kYXRhICopCi0JCQkJZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FsX2RhdGE7Ci0JcmMgPSBhZG1fc2VuZF9jYWxpYnJhdGlvbihkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAotCQkJCSAgZGV2X21hcFtkZXZfbWFwX2lkeF0uY29wcF9pZHgsCi0JCQkJICBBRE1fUEFUSF9QTEFZQkFDSywgMCwKLQkJCQkgIEFETV9BVURQUk9DX0NBTCwKLQkJCQkgIGF1ZF9jYWxfZGF0YS0+YXVkX3Byb2NfZGF0YSwKLQkJCQkgIGF1ZF9jYWxfZGF0YS0+YXVkX3Byb2Nfc2l6ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZG1fc2VuZF9jYWxpYnJhdGlvbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZW5kOwotCX0KLQotCS8qIHNlbmQgYXVkIHZvbHVtZSBjYWwqLwotCXJjID0gYWRtX3NlbmRfY2FsaWJyYXRpb24oZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCwKLQkJCQkgIGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4LAotCQkJCSAgQURNX1BBVEhfUExBWUJBQ0ssIDAsCi0JCQkJICBBRE1fQVVEVk9MX0NBTCwKLQkJCQkgIGF1ZF9jYWxfZGF0YS0+YXVkX3ZvbF9kYXRhLAotCQkJCSAgYXVkX2NhbF9kYXRhLT5hdWRfdm9sX3NpemUpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiJXM6IGFkbV9zZW5kX2NhbGlicmF0aW9uIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLWVuZDoKLQlwcl9kZWJ1ZygiJXM6IHJldHVybiAgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtc21fZHMyX2RhcF9jYW5fZW5hYmxlX21vZHVsZShpbnQzMl90IG1vZHVsZV9pZCkKLXsKLQlpZiAobW9kdWxlX2lkID09IE1UTVhfTU9EVUxFX0lEX0RFRkFVTFRfQ0hNSVhFUiB8fAotCQltb2R1bGVfaWQgPT0gQVVEUFJPQ19NT0RVTEVfSURfUkVTQU1QTEVSIHx8Ci0JCW1vZHVsZV9pZCA9PSBBVURQUk9DX01PRFVMRV9JRF9WT0xfQ1RSTCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX2luaXRfbW9kdWxlc19pbl90b3BvbG9neShpbnQgZGV2X21hcF9pZHgpCi17Ci0JaW50IHJjID0gMCwgaSA9IDAsIHBvcnRfaWQsIGNvcHBfaWR4OwotCS8qIEFjY291bnQgZm9yIDMyIGJpdCBpbnRlZ2VyIGFsbG9jYXRpb24gKi8KLQlpbnQzMl90IHBhcmFtX3N6ID0gKEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEggLyBzaXplb2YodWludDMyX3QpKTsKLQlpbnQzMl90ICp1cGRhdGVfcGFyYW1fdmFsID0gTlVMTDsKLQotCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlwb3J0X2lkID0gZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZDsKLQljb3BwX2lkeCA9IGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4OwotCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4IGNvcHBfaWR4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOwotCXVwZGF0ZV9wYXJhbV92YWwgPSBremFsbG9jKEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgsIEdGUF9LRVJORUwpOwotCWlmICghdXBkYXRlX3BhcmFtX3ZhbCkgewotCQlwcl9lcnIoIiVzLCBwYXJhbSBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKCFkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcykgewotCQkvKiBnZXQgbW9kdWxlcyBmcm9tIGRzcCAqLwotCQlyYyA9IGFkbV9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdChwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCUFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgsCi0JCQkoY2hhciAqKXVwZGF0ZV9wYXJhbV92YWwpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOnRvcG8gbGlzdCBwb3J0ICVkLCBlcnIgJWQsY29wcF9pZHggJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCByYyk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCi0JCWlmICh1cGRhdGVfcGFyYW1fdmFsWzBdID4gKHBhcmFtX3N6IC0gMSkpIHsKLQkJCXByX2VycigiJXM6bWF4IG1vZHVsZXMgZXhwL3JldCBbJWQ6ICVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgKHBhcmFtX3N6IC0gMSksCi0JCQkJdXBkYXRlX3BhcmFtX3ZhbFswXSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQkvKiBUdXJuIG9mZiBtb2R1bGVzICovCi0JCWZvciAoaSA9IDE7IGkgPCB1cGRhdGVfcGFyYW1fdmFsWzBdOyBpKyspIHsKLQkJCWlmICghbXNtX2RzMl9kYXBfY2FuX2VuYWJsZV9tb2R1bGUoCi0JCQkJdXBkYXRlX3BhcmFtX3ZhbFtpXSkgfHwKLQkJCQkodXBkYXRlX3BhcmFtX3ZhbFtpXSA9PSBEUzJfTU9EVUxFX0lEKSkgewotCQkJCXByX2RlYnVnKCIlczogRG8gbm90IGVuYWJsZS9kaXNhYmxlICVkXG4iLAotCQkJCQkgX19mdW5jX18sIHVwZGF0ZV9wYXJhbV92YWxbaV0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlwcl9kZWJ1ZygiJXM6IHBhcmFtIGRpc2FibGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHVwZGF0ZV9wYXJhbV92YWxbaV0pOwotCQkJYWRtX3BhcmFtX2VuYWJsZShwb3J0X2lkLCBjb3BwX2lkeCwgdXBkYXRlX3BhcmFtX3ZhbFtpXSwKLQkJCQkJIE1PRFVMRV9ESVNBQkxFKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW1zbV9kczJfZGFwX3NlbmRfY2FsX2RhdGEoZGV2X21hcF9pZHgpOwotCi0JfQotCWFkbV9wYXJhbV9lbmFibGUocG9ydF9pZCwgY29wcF9pZHgsIERTMl9NT0RVTEVfSUQsCi0JCQkgIWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzKTsKLWVuZDoKLQlrZnJlZSh1cGRhdGVfcGFyYW1fdmFsKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBib29sIG1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKGludDMyX3QgKmRhcF9wYXJhbXNfbW9kaWZpZWQsCi0JCQkJICAgIGludDMyX3QgaWR4LCBpbnQzMl90IGNvbW1pdCkKLXsKLQlpZiAoKGRhcF9wYXJhbXNfbW9kaWZpZWRbaWR4XSA9PSAwKSB8fAotCQkoY29tbWl0ICYmCi0JCSgoZGFwX3BhcmFtc19tb2RpZmllZFtpZHhdICYgMHgwMDAxMDAwMCkgJiYKLQkJKChkYXBfcGFyYW1zX21vZGlmaWVkW2lkeF0gJiAweDAwMDBGRkZGKSA8PSAxKSkpKSB7Ci0JCXByX2RlYnVnKCIlczogbm90IG1vZGlmaWVkIGF0IGlkeCAlZFxuIiwgX19mdW5jX18sIGlkeCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBtb2RpZmllZCBhdCBpZHggJWRcbiIsIF9fZnVuY19fLCBpZHgpOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX21hcF9kZXZpY2VfdG9fZG9sYnlfY2FjaGVfZGV2aWNlcyhpbnQzMl90IGRldmljZV9pZCkKLXsKLQlpbnQzMl90IGNhY2hlX2RldiA9IC0xOwotCi0Jc3dpdGNoIChkZXZpY2VfaWQpIHsKLQljYXNlIERFVklDRV9OT05FOgotCQljYWNoZV9kZXYgPSBET0xCWV9PRkZfQ0FDSEU7Ci0JCWJyZWFrOwotCWNhc2UgRUFSUElFQ0U6Ci0JY2FzZSBTUEVBS0VSOgotCQljYWNoZV9kZXYgPSBET0xCWV9TUEVBS0VSX0NBQ0hFOwotCQlicmVhazsKLQljYXNlIFdJUkVEX0hFQURTRVQ6Ci0JY2FzZSBXSVJFRF9IRUFEUEhPTkU6Ci0JY2FzZSBBTkxHX0RPQ0tfSEVBRFNFVDoKLQljYXNlIERHVExfRE9DS19IRUFEU0VUOgotCWNhc2UgQU5DX0hFQURTRVQ6Ci0JY2FzZSBBTkNfSEVBRFBIT05FOgotCWNhc2UgQkxVRVRPT1RIX1NDTzoKLQljYXNlIEJMVUVUT09USF9TQ09fSEVBRFNFVDoKLQljYXNlIEJMVUVUT09USF9TQ09fQ0FSS0lUOgotCQljYWNoZV9kZXYgPSBET0xCWV9IRUFEUEhPTkVfQ0FDSEU7Ci0JCWJyZWFrOwotCWNhc2UgRk06Ci0JY2FzZSBGTV9UWDoKLQkJY2FjaGVfZGV2ID0gRE9MQllfRk1fQ0FDSEU7Ci0JCWJyZWFrOwotCWNhc2UgQVVYX0RJR0lUQUw6Ci0JCWNhY2hlX2RldiA9IERPTEJZX0hETUlfQ0FDSEU7Ci0JCWJyZWFrOwotCWNhc2UgUFJPWFk6Ci0JY2FzZSBSRU1PVEVfU1VCTUlYOgotCQljYWNoZV9kZXYgPSBET0xCWV9XRkRfQ0FDSEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgY2FjaGUgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCXByX2RlYnVnKCIlczogY2FjaGUgZGV2aWNlICVkXG4iLCBfX2Z1bmNfXywgY2FjaGVfZGV2KTsKLQlyZXR1cm4gY2FjaGVfZGV2OwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9udW1fZGV2aWNlcyhzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSwKLQkJCQkgICAgICBpbnQzMl90ICpudW1fZGV2aWNlLCBpbnQzMl90ICpkZXZfYXJyLAotCQkJCSAgICAgIGludDMyX3QgYXJyYXlfc2l6ZSkKLXsKLQlpbnQzMl90IGlkeCA9IDA7Ci0JaW50IHN1cHBvcnRlZF9kZXZpY2VzID0gMDsKLQotCWlmICghYXJyYXlfc2l6ZSkgewotCQlwcl9lcnIoIiVzOiBhcnJheSBzaXplIHplcm9cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRvbGJ5X2RhdGEtPmRldmljZV9pZCA9PSBERVZJQ0VfT1VUX0FMTCB8fAotCQlkb2xieV9kYXRhLT5kZXZpY2VfaWQgPT0gREVWSUNFX09VVF9ERUZBVUxUKQotCQlzdXBwb3J0ZWRfZGV2aWNlcyA9IGFsbF9zdXBwb3J0ZWRfZGV2aWNlczsKLQllbHNlCi0JCXN1cHBvcnRlZF9kZXZpY2VzID0gZG9sYnlfZGF0YS0+ZGV2aWNlX2lkOwotCi0JaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBFQVJQSUVDRSkpCi0JCWRldl9hcnJbaWR4KytdID0gRUFSUElFQ0U7Ci0JaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBTUEVBS0VSKSkKLQkJZGV2X2FycltpZHgrK10gPSBTUEVBS0VSOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgV0lSRURfSEVBRFNFVCkpCi0JCWRldl9hcnJbaWR4KytdID0gV0lSRURfSEVBRFNFVDsKLQlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIFdJUkVEX0hFQURQSE9ORSkpCi0JCWRldl9hcnJbaWR4KytdID0gV0lSRURfSEVBRFBIT05FOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgQkxVRVRPT1RIX1NDTykpCi0JCWRldl9hcnJbaWR4KytdID0gQkxVRVRPT1RIX1NDTzsKLQlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEJMVUVUT09USF9TQ09fQ0FSS0lUKSkKLQkJZGV2X2FycltpZHgrK10gPSBCTFVFVE9PVEhfU0NPX0NBUktJVDsKLQlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEJMVUVUT09USF9TQ09fSEVBRFNFVCkpCi0JCWRldl9hcnJbaWR4KytdID0gQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgQVVYX0RJR0lUQUwpKQotCQlkZXZfYXJyW2lkeCsrXSA9IEFVWF9ESUdJVEFMOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgQU5MR19ET0NLX0hFQURTRVQpKQotCQlkZXZfYXJyW2lkeCsrXSA9IEFOTEdfRE9DS19IRUFEU0VUOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgREdUTF9ET0NLX0hFQURTRVQpKQotCQlkZXZfYXJyW2lkeCsrXSA9IERHVExfRE9DS19IRUFEU0VUOwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzICYgUkVNT1RFX1NVQk1JWCkpCi0JCWRldl9hcnJbaWR4KytdID0gUkVNT1RFX1NVQk1JWDsKLQlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEFOQ19IRUFEU0VUKSkKLQkJZGV2X2FycltpZHgrK10gPSBBTkNfSEVBRFNFVDsKLQlpZiAoKGlkeCA8IGFycmF5X3NpemUpICYmIChzdXBwb3J0ZWRfZGV2aWNlcyAmIEFOQ19IRUFEUEhPTkUpKQotCQlkZXZfYXJyW2lkeCsrXSA9IEFOQ19IRUFEUEhPTkU7Ci0JaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBQUk9YWSkpCi0JCWRldl9hcnJbaWR4KytdID0gUFJPWFk7Ci0JaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBGTSkpCi0JCWRldl9hcnJbaWR4KytdID0gRk07Ci0JaWYgKChpZHggPCBhcnJheV9zaXplKSAmJiAoc3VwcG9ydGVkX2RldmljZXMgJiBGTV9UWCkpCi0JCWRldl9hcnJbaWR4KytdID0gRk1fVFg7Ci0JLyogQ0hFQ0sgZGV2aWNlIG5vbmUgc2VwYXJhdGVseSAqLwotCWlmICgoaWR4IDwgYXJyYXlfc2l6ZSkgJiYgKHN1cHBvcnRlZF9kZXZpY2VzID09IERFVklDRV9OT05FKSkKLQkJZGV2X2FycltpZHgrK10gPSBERVZJQ0VfTk9ORTsKLQlwcl9kZWJ1ZygiJXM6IGRldiBpZCAweCV4LCBpZHggJWRcbiIsIF9fZnVuY19fLAotCQkgc3VwcG9ydGVkX2RldmljZXMsIGlkeCk7Ci0JKm51bV9kZXZpY2UgPSBpZHg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfZ2V0X3BvcnRfaWQoCi0JCWludDMyX3QgZGV2aWNlX2lkLCBpbnQzMl90IGJlX2lkKQotewotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhIGJlZGFpczsKLQlpbnQgcG9ydF9pZCA9IERPTEJZX0lOVkFMSURfUE9SVF9JRDsKLQlpbnQgcG9ydF90eXBlID0gMDsKLQotCWlmIChiZV9pZCA8IDApIHsKLQkJcG9ydF9pZCA9IC0xOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQltc21fcGNtX3JvdXRpbmdfZ2V0X2JlZGFpX2luZm8oYmVfaWQsICZiZWRhaXMpOwotCXByX2RlYnVnKCIlczogYmUgcG9ydF9pZCAlZFxuIiwgX19mdW5jX18sIGJlZGFpcy5wb3J0X2lkKTsKLQlwb3J0X2lkID0gYmVkYWlzLnBvcnRfaWQ7Ci0JcG9ydF90eXBlID0gYWZlX2dldF9wb3J0X3R5cGUoYmVkYWlzLnBvcnRfaWQpOwotCWlmIChwb3J0X3R5cGUgIT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpCi0JCXBvcnRfaWQgPSBET0xCWV9JTlZBTElEX1BPUlRfSUQ7Ci1lbmQ6Ci0JcHJfZGVidWcoIiVzOiBkZXZpY2VfaWQgMHgleCwgYmVfaWQgJWQsIHBvcnRfaWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgZGV2aWNlX2lkLCBiZV9pZCwgcG9ydF9pZCk7Ci0JcmV0dXJuIHBvcnRfaWQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfdXBkYXRlX2Rldl9tYXBfcG9ydF9pZChpbnQzMl90IGRldmljZV9pZCwgaW50IHBvcnRfaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKLQkJaWYgKGRldl9tYXBbaV0uZGV2aWNlX2lkID09IGRldmljZV9pZCkKLQkJCWRldl9tYXBbaV0ucG9ydF9pZCA9IHBvcnRfaWQ7Ci0JfQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAlZCwgZGV2aWNlX2lkIDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgcG9ydF9pZCwgZGV2aWNlX2lkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzX3dhaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCQkJICBpbnQgd2FpdF90aW1lKQotewotCWludCByZXQgPSAwOwotCi0JYWRtX3NldF93YWl0X3BhcmFtZXRlcnMocG9ydF9pZCwgY29wcF9pZHgpOwotCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQlyZXQgPSBhZG1fd2FpdF90aW1lb3V0KHBvcnRfaWQsIGNvcHBfaWR4LCB3YWl0X3RpbWUpOwotCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKLQkvKiBSZXNldCB0aGUgcGFyYW1ldGVycyBpZiB3YWl0IGhhcyB0aW1lZCBvdXQgKi8KLQlpZiAocmV0ID09IDApCi0JCWFkbV9yZXNldF93YWl0X3BhcmFtZXRlcnMocG9ydF9pZCwgY29wcF9pZHgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzcyhzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSkKLXsKLQlpbnQgcmMgPSAwLCBpID0gMCwgaiA9IDA7Ci0JLypBY2NvdW50IGZvciAzMiBiaXQgaW50ZWdlciBhbGxvY2F0aW9uICAqLwotCWludDMyX3QgcGFyYW1fc3ogPSAoQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCAvIHNpemVvZih1aW50MzJfdCkpOwotCWludDMyX3QgKm1vZF9saXN0ID0gTlVMTDsKLQlpbnQgcG9ydF9pZCA9IDAsIGNvcHBfaWR4ID0gLTE7Ci0JYm9vbCBjc19vbm9mZiA9IGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5jdXN0b21fc3RlcmVvX29ub2ZmOwotCWludCByYW1wX3dhaXQgPSBET0xCWV9TT0ZUX1ZPTFVNRV9QRVJJT0Q7Ci0KLQlwcl9kZWJ1ZygiJXM6IGJ5cGFzcyB0eXBlICVkIGJ5cGFzcyAlZCBjdXN0b20gc3RlcmVvICVkXG4iLCBfX2Z1bmNfXywKLQkJIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUsCi0JCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcywKLQkJIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5jdXN0b21fc3RlcmVvX29ub2ZmKTsKLQltb2RfbGlzdCA9IGt6YWxsb2MoQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtb2RfbGlzdCkgewotCQlwcl9lcnIoIiVzOiBwYXJhbSBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7Ci0JCXByX2RlYnVnKCIlczogYWN0aXZlIGRldiAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBbaV0uYWN0aXZlKTsKLQkJaWYgKGRldl9tYXBbaV0uYWN0aXZlKSB7Ci0JCQlwb3J0X2lkID0gZGV2X21hcFtpXS5wb3J0X2lkOwotCQkJY29wcF9pZHggPSBkZXZfbWFwW2ldLmNvcHBfaWR4OwotCi0JCQlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBvcnRcbiIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IDA7Ci0JCQkJZ290byBlbmQ7Ci0JCQl9Ci0KLQkJCWlmICgoY29wcF9pZHggPCAwKSB8fAotCQkJCShjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX2lkeFxuIiwgX19mdW5jX18pOwotCQkJCXJjID0gMDsKLQkJCQlnb3RvIGVuZDsKLQkJCX0KLQotCQkJLyogZ2V0bW9kdWxlcyBmcm9tIGRzcCAqLwotCQkJcmMgPSBhZG1fZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3QocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJICAgIEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgsCi0JCQkJICAgIChjaGFyICopbW9kX2xpc3QpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCXByX2VycigiJXM6YWRtIGdldCB0b3BvIGxpc3QgcG9ydCAlZCIsCi0JCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCQlwcl9lcnIoImNvcHBfaWR4ICVkLCBlcnIgJWRcbiIsCi0JCQkJCWNvcHBfaWR4LCByYyk7Ci0JCQkJZ290byBlbmQ7Ci0JCQl9Ci0JCQlpZiAobW9kX2xpc3RbMF0gPiAocGFyYW1fc3ogLSAxKSkgewotCQkJCXByX2VycigiJXM6bWF4IG1vZHVsZXMgZXhwL3JldCBbJWQ6ICVkXVxuIiwKLQkJCQkJX19mdW5jX18sIChwYXJhbV9zeiAtIDEpLAotCQkJCQltb2RfbGlzdFswXSk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQkJLyoKLQkJCSAqIGdldCByYW1wIHBhcmFtZXRlcnMKLQkJCSAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gcmFtcCBwYXJhbWV0ZXJzCi0JCQkgKiB1cGRhdGUgcmFtcCB3YWl0Ci0JCQkgKi8KLQkJCW1zbV9kczJfZGFwX2NoZWNrX2FuZF91cGRhdGVfcmFtcF93YWl0KHBvcnRfaWQsCi0JCQkJCQkJICAgICAgIGNvcHBfaWR4LAotCQkJCQkJCSAgICAgICAmcmFtcF93YWl0KTsKLQotCQkJLyogTXV0ZSBiZWZvcmUgc3dpdGNoaW5nIG1vZHVsZXMgKi8KLQkJCXJjID0gYWRtX3NldF92b2x1bWUocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCSAgICBWT0xVTUVfWkVST19HQUlOKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQkvKgotCQkJCSAqIE5vdCBGYXRhbCBjYW4gY29udGludWUgYnlwYXNzIG9wZXJhdGlvbnMuCi0JCQkJICogRG8gbm90IG5lZWQgdG8gYmxvY2sgcGxheWJhY2sKLQkJCQkgKi8KLQkJCQlwcl9pbmZvKCIlcyA6U2V0IHZvbHVtZSBwb3J0X2lkICVkIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJCXByX2luZm8oImNvcHBfaWR4ICVkLCBlcnJvciAlZFxuIiwKLQkJCQkJY29wcF9pZHgsIHJjKTsKLQkJCX0KLQotCQkJcmMgPSBtc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzX3dhaXQocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCSAgICAocmFtcF93YWl0ICsKLQkJCQkJICAgICBET0xCWV9BRERJVElPTkFMX1JBTVBfV0FJVCkpOwotCQkJaWYgKHJjID09IC1FSU5UUikgewotCQkJCXByX2luZm8oIiVzOmJ5cGFzcyBpbnRlcnJ1cHRlZC1pZ25vcmUscG9ydCAlZCIsCi0JCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCQlwcl9pbmZvKCJjb3BwX2lkeCAlZFxuIiwgY29wcF9pZHgpOwotCQkJCXJjID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogaWYgZGFwIGJ5cGFzcyBpcyBzZXQgKi8KLQkJCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcykgewotCQkJCS8qIFR1cm4gb2ZmIGRhcCBtb2R1bGUgKi8KLQkJCQlhZG1fcGFyYW1fZW5hYmxlKHBvcnRfaWQsIGNvcHBfaWR4LAotCQkJCQkJIERTMl9NT0RVTEVfSUQsIE1PRFVMRV9ESVNBQkxFKTsKLQkJCQkvKgotCQkJCSAqIElmIGN1c3RvbSBzdGVyZW8gaXMgb24gYXQgdGhlIHRpbWUgb2YgYnlwYXNzLAotCQkJCSAqIHN3aXRjaCBvZmYgY3VzdG9tIHN0ZXJlbyBvbiBkYXAgYW5kIHR1cm4gb24KLQkJCQkgKiBjdXN0b20gc3RlcmVvIG9uIHF0aSBjaGFubmVsIG1peGVyLgotCQkJCSAqLwotCQkJCWlmIChjc19vbm9mZikgewotCQkJCQlyYyA9IGRhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpLAotCQkJCQkJCQkhY3Nfb25vZmYpOwotCQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCQlwcl9pbmZvKCIlczpEX0NTIGkgJWQscmMgJWRcbiIsCi0JCQkJCQkJX19mdW5jX18sIGksIHJjKTsKLQkJCQkJfQotCQkJCQlyYyA9IHF0aV9zZXRfY3VzdG9tX3N0ZXJlb19vbihwb3J0X2lkLAotCQkJCQkJCQkgICAgICBjb3BwX2lkeCwKLQkJCQkJCQkJICAgICAgY3Nfb25vZmYpOwotCQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCQlwcl9pbmZvKCIlczpRX0NTIHBvcnQgaWQgMHgleCIsCi0JCQkJCQkJIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCQkJCXByX2luZm8oImNvcHAgaWR4ICVkLCByYyAlZFxuIiwKLQkJCQkJCQljb3BwX2lkeCwgcmMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8qIFR1cm4gb24gcXRpIG1vZHVsZXMgKi8KLQkJCQlmb3IgKGogPSAxOyBqIDwgbW9kX2xpc3RbMF07IGorKykgewotCQkJCQlpZiAoIW1zbV9kczJfZGFwX2Nhbl9lbmFibGVfbW9kdWxlKAotCQkJCQkJbW9kX2xpc3Rbal0pIHx8Ci0JCQkJCQltb2RfbGlzdFtqXSA9PQotCQkJCQkJRFMyX01PRFVMRV9JRCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlwcl9kZWJ1ZygiJXM6IHBhcmFtIGVuYWJsZSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBtb2RfbGlzdFtqXSk7Ci0JCQkJCWFkbV9wYXJhbV9lbmFibGUocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCQkJIG1vZF9saXN0W2pdLAotCQkJCQkJCSBNT0RVTEVfRU5BQkxFKTsKLQkJCQl9Ci0KLQkJCQkvKiBBZGQgYWRtIGFwaSB0byByZXNlbmQgY2FsaWJyYXRpb24gb24gcG9ydCAqLwotCQkJCXJjID0gbXNtX2RzMl9kYXBfc2VuZF9jYWxfZGF0YShpKTsKLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdCBmYXRhbCxjb250aW51ZSBieXBhc3Mgb3BlcmF0aW9ucy4KLQkJCQkJICogRG8gbm90IG5lZWQgdG8gYmxvY2sgcGxheWJhY2sKLQkJCQkJICovCi0JCQkJCXByX2luZm8oIiVzOnNlbmQgY2FsIGVyciAlZCBpbmRleCAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCByYywgaSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKiBUdXJuIG9mZiBxdGkgbW9kdWxlcyAqLwotCQkJCWZvciAoaiA9IDE7IGogPCBtb2RfbGlzdFswXTsgaisrKSB7Ci0JCQkJCWlmICghbXNtX2RzMl9kYXBfY2FuX2VuYWJsZV9tb2R1bGUoCi0JCQkJCQltb2RfbGlzdFtqXSkgfHwKLQkJCQkJCW1vZF9saXN0W2pdID09Ci0JCQkJCQlEUzJfTU9EVUxFX0lEKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXByX2RlYnVnKCIlczogcGFyYW0gZGlzYWJsZSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBtb2RfbGlzdFtqXSk7Ci0JCQkJCWFkbV9wYXJhbV9lbmFibGUocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCQkJIG1vZF9saXN0W2pdLAotCQkJCQkJCSBNT0RVTEVfRElTQUJMRSk7Ci0JCQkJfQotCi0JCQkJLyogRW5hYmxlIERBUCBtb2R1bGVzICovCi0JCQkJcHJfZGVidWcoIiVzOkRTMiBwYXJhbSBlbmFibGVcbiIsIF9fZnVuY19fKTsKLQkJCQlhZG1fcGFyYW1fZW5hYmxlKHBvcnRfaWQsIGNvcHBfaWR4LAotCQkJCQkJIERTMl9NT0RVTEVfSUQsIE1PRFVMRV9FTkFCTEUpOwotCQkJCS8qCi0JCQkJICogSWYgY3VzdG9tIHN0ZXJlbyBpcyBvbiBhdCB0aGUgdGltZSBvZiBkYXAgb24sCi0JCQkJICogc3dpdGNoIG9mZiBjdXN0b20gc3RlcmVvIG9uIHF0aSBjaGFubmVsIG1peGVyCi0JCQkJICogYW5kIHR1cm4gb24gY3VzdG9tIHN0ZXJlbyBvbiBEQVAuCi0JCQkJICogbWl4ZXIocXRpKS4KLQkJCQkgKi8KLQkJCQlpZiAoY3Nfb25vZmYpIHsKLQkJCQkJcmMgPSBxdGlfc2V0X2N1c3RvbV9zdGVyZW9fb24ocG9ydF9pZCwKLQkJCQkJCQkJY29wcF9pZHgsCi0JCQkJCQkJCSFjc19vbm9mZik7Ci0JCQkJCWlmIChyYyA8IDApIHsKLQkJCQkJCXByX2luZm8oIiVzOlFfQ1MgcG9ydF9pZCAweCV4IiwKLQkJCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCQkJCQlwcl9pbmZvKCJjb3BwX2lkeCAlZCByYyAlZFxuIiwKLQkJCQkJCQljb3BwX2lkeCwgcmMpOwotCQkJCQl9Ci0JCQkJCXJjID0gZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGksCi0JCQkJCQkJCWNzX29ub2ZmKTsKLQkJCQkJaWYgKHJjIDwgMCkgewotCQkJCQkJcHJfaW5mbygiJXM6RF9DUyBpICVkLHJjICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCBpLCByYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJjID0gbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzc193YWl0KHBvcnRfaWQsIGNvcHBfaWR4LAotCQkJCURPTEJZX01PRFVMRV9FTkFCTEVfUEVSSU9EKTsKLQkJCWlmIChyYyA9PSAtRUlOVFIpIHsKLQkJCQlwcl9pbmZvKCIlczpieXBhc3MgaW50ZXJydXB0ZWQgcG9ydF9pZCAlZCBjb3BwX2lkeCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKLQkJCQkvKiBJbnRlcnJ1cHRlZCBpZ25vcmUgYnlwYXNzICovCi0JCQkJcmMgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBzZXQgdm9sdW1lIHRvIHVuaXR5IGdhaW4gYWZ0ZXIgbW9kdWxlIG9uL29mZiAqLwotCQkJcmMgPSBhZG1fc2V0X3ZvbHVtZShwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJICAgIFZPTFVNRV9VTklUWV9HQUlOKTsKLQkJCWlmIChyYyA8IDApIHsKLQkJCQkvKgotCQkJCSAqIE5vdCBGYXRhbCBjYW4gY29udGludWUgYnlwYXNzIG9wZXJhdGlvbnMuCi0JCQkJICogRG8gbm90IG5lZWQgdG8gYmxvY2sgcGxheWJhY2sKLQkJCQkgKi8KLQkJCQlwcl9pbmZvKCIlczogU2V0IHZvbCBwb3J0ICVkIGNvcHAgJWQsIHJjICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgsIHJjKTsKLQkJCQlyYyA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLWVuZDoKLQlrZnJlZShtb2RfbGlzdCk7Ci0JcHJfZGVidWcoIiVzOnJldHVybiByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2VuZF9lbmRfcG9pbnQoaW50IGRldl9tYXBfaWR4LCBpbnQgZW5kcF9pZHgpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQzMl90ICAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEwsICpwYXJhbXNfdmFsdWUgPSBOVUxMOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoRE9MQllfUEFSQU1fSU5UX0VORFBfTEVOR1RIICsKLQkJCQlET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpICogc2l6ZW9mKHVpbnQzMl90KTsKLQlpbnQgY2FjaGVfZGV2aWNlID0gMDsKLQlzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfcyAqZHMyX2FwX3BhcmFtc19vYmogPSBOVUxMOwotCWludDMyX3QgKm1vZGlmaWVkX3BhcmFtID0gTlVMTDsKLQotCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0JY2FjaGVfZGV2aWNlID0gZGV2X21hcFtkZXZfbWFwX2lkeF0uY2FjaGVfZGV2OwotCi0JZHMyX2FwX3BhcmFtc19vYmogPSAmZHMyX2RhcF9wYXJhbXNbY2FjaGVfZGV2aWNlXTsKLQlwcl9kZWJ1ZygiJXM6IGNhY2hlIGRldiAlZCwgZGV2X21hcF9pZHggJWRcbiIsIF9fZnVuY19fLAotCQkgY2FjaGVfZGV2aWNlLCBkZXZfbWFwX2lkeCk7Ci0JcHJfZGVidWcoIiVzOiBlbmRwIC0gJXBLICVwS1xuIiwgIF9fZnVuY19fLAotCQkgJmRzMl9kYXBfcGFyYW1zW2NhY2hlX2RldmljZV0sIGRzMl9hcF9wYXJhbXNfb2JqKTsKLQotCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbXNfdmFsdWUpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoZGV2X21hcFtkZXZfbWFwX2lkeF0ucG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKChkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA8IDApIHx8Ci0JCShkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gcGFyYW1zX3ZhbHVlOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFA7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IERPTEJZX1BBUkFNX0lOVF9FTkRQX0xFTkdUSCAqIHNpemVvZih1aW50MzJfdCk7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IGRzMl9hcF9wYXJhbXNfb2JqLT5wYXJhbXNfdmFsWwotCQkJCQlkczJfZGFwX3BhcmFtc19vZmZzZXRbZW5kcF9pZHhdXTsKLQlwcl9kZWJ1ZygiJXM6IG9mZiAlZCwgbGVuZ3RoICVkXG4iLCBfX2Z1bmNfXywKLQkJIGRzMl9kYXBfcGFyYW1zX29mZnNldFtlbmRwX2lkeF0sCi0JCSBkczJfZGFwX3BhcmFtc19sZW5ndGhbZW5kcF9pZHhdKTsKLQlwcl9kZWJ1ZygiJXM6IHBhcmFtIDB4JXgsIHBhcmFtIHZhbCAlZFxuIiwgX19mdW5jX18sCi0JCSBkczJfZGFwX3BhcmFtc19pZFtlbmRwX2lkeF0sIGRzMl9hcF9wYXJhbXNfb2JqLT4KLQkJIHBhcmFtc192YWxbZHMyX2RhcF9wYXJhbXNfb2Zmc2V0W2VuZHBfaWR4XV0pOwotCXJjID0gYWRtX2RvbGJ5X2RhcF9zZW5kX3BhcmFtcyhkZXZfbWFwW2Rldl9tYXBfaWR4XS5wb3J0X2lkLAotCQkJCSAgICAgICBkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKLQkJCQkgICAgICAgKGNoYXIgKilwYXJhbXNfdmFsdWUsIHBhcmFtc19sZW5ndGgpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBzZW5kIGRvbGJ5IHBhcmFtcyBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0JbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKLQlpZiAobW9kaWZpZWRfcGFyYW0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtb2RpZmllZCBwYXJhbSBzdHJ1Y3R1cmUgaW52YWxpZFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAobXNtX2RzMl9kYXBfY2hlY2tfaXNfcGFyYW1fbW9kaWZpZWQobW9kaWZpZWRfcGFyYW0sIGVuZHBfaWR4LCAwKSkKLQkJZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWRbZW5kcF9pZHhdID0gMHgwMDAxMDAwMTsKLQotZW5kOgotCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfY2FjaGVkX3BhcmFtcyhpbnQgZGV2X21hcF9pZHgsCi0JCQkJCSAgaW50IGNvbW1pdCkKLXsKLQlpbnQzMl90ICp1cGRhdGVfcGFyYW1zX3ZhbHVlID0gTlVMTCwgKnBhcmFtc192YWx1ZSA9IE5VTEw7Ci0JdWludDMyX3QgaWR4LCBpLCBqLCByZXQgPSAwOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsKLQkJCQkoTUFYX0RTMl9QQVJBTVMgLSAxKSAqCi0JCQkJRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFKSAqCi0JCQkJc2l6ZW9mKHVpbnQzMl90KTsKLQlpbnQgY2FjaGVfZGV2aWNlID0gMDsKLQlzdHJ1Y3QgZHMyX2RhcF9wYXJhbXNfcyAqZHMyX2FwX3BhcmFtc19vYmogPSBOVUxMOwotCWludDMyX3QgKm1vZGlmaWVkX3BhcmFtID0gTlVMTDsKLQotCWlmIChkZXZfbWFwX2lkeCA8IDAgfHwgZGV2X21hcF9pZHggPj0gRFMyX0RFVklDRVNfQUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZGV2IG1hcCBpbmRleCAlZFxuIiwgX19mdW5jX18sIGRldl9tYXBfaWR4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCWNhY2hlX2RldmljZSA9IGRldl9tYXBbZGV2X21hcF9pZHhdLmNhY2hlX2RldjsKLQotCS8qIFVzZSBvZmYgcHJvZmlsZSBjYWNoZSBpbiBvbmx5IGZvciBzb2Z0IGJ5cGFzcyAqLwotCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09IERBUF9TT0ZUX0JZUEFTUyAmJgotCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9PSB0cnVlKSB7Ci0JCXByX2RlYnVnKCIlczogdXNlIGJ5cGFzcyBjYWNoZSAwXG4iLCBfX2Z1bmNfXyk7Ci0JCWNhY2hlX2RldmljZSA9ICBkZXZfbWFwWzBdLmNhY2hlX2RldjsKLQl9Ci0KLQlkczJfYXBfcGFyYW1zX29iaiA9ICZkczJfZGFwX3BhcmFtc1tjYWNoZV9kZXZpY2VdOwotCXByX2RlYnVnKCIlczogY2FjaGVkIHBhcmFtIC0gJXBLICVwSywgY2FjaGVfZGV2aWNlICVkXG4iLCBfX2Z1bmNfXywKLQkJICZkczJfZGFwX3BhcmFtc1tjYWNoZV9kZXZpY2VdLCBkczJfYXBfcGFyYW1zX29iaiwKLQkJIGNhY2hlX2RldmljZSk7Ci0JcGFyYW1zX3ZhbHVlID0ga3phbGxvYyhwYXJhbXNfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtc192YWx1ZSkgewotCQlwcl9lcnIoIiVzOiBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAgLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQgPT0gRE9MQllfSU5WQUxJRF9QT1JUX0lEKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcG9ydCBpZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4IDwgMCkgfHwKLQkJKGRldl9tYXBbZGV2X21hcF9pZHhdLmNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX2lkeFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQl1cGRhdGVfcGFyYW1zX3ZhbHVlID0gcGFyYW1zX3ZhbHVlOwotCXBhcmFtc19sZW5ndGggPSAwOwotCWZvciAoaSA9IDA7IGkgPCAoTUFYX0RTMl9QQVJBTVMtMSk7IGkrKykgewotCQkvKmdldCB0aGUgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gdGhlIGNhY2hlKi8KLQkJbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKLQkJaWYgKG1vZGlmaWVkX3BhcmFtID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IG1vZGlmaWVkIHBhcmFtIHN0cnVjdHVyZSBpbnZhbGlkXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlpZiAoIW1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKG1vZGlmaWVkX3BhcmFtLCBpLAotCQkJCQkJCSBjb21taXQpKQotCQkJY29udGludWU7Ci0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBET0xCWV9CVU5ETEVfTU9EVUxFX0lEOwotCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gZHMyX2RhcF9wYXJhbXNfaWRbaV07Ci0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBkczJfZGFwX3BhcmFtc19sZW5ndGhbaV0gKgotCQkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKLQkJaWR4ID0gZHMyX2RhcF9wYXJhbXNfb2Zmc2V0W2ldOwotCQlmb3IgKGogPSAwOyBqIDwgZHMyX2RhcF9wYXJhbXNfbGVuZ3RoW2ldOyBqKyspIHsKLQkJCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPQotCQkJCQlkczJfYXBfcGFyYW1zX29iai0+cGFyYW1zX3ZhbFtpZHgral07Ci0JCQlwcl9kZWJ1ZygiJXM6IGlkIDB4JXgsdmFsICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgZHMyX2RhcF9wYXJhbXNfaWRbaV0sCi0JCQkJIGRzMl9hcF9wYXJhbXNfb2JqLT5wYXJhbXNfdmFsW2lkeCtqXSk7Ci0JCX0KLQkJcGFyYW1zX2xlbmd0aCArPSAoRE9MQllfUEFSQU1fUEFZTE9BRF9TSVpFICsKLQkJCQlkczJfZGFwX3BhcmFtc19sZW5ndGhbaV0pICogc2l6ZW9mKHVpbnQzMl90KTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHZhbGlkIHBhcmFtIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoKTsKLQlpZiAocGFyYW1zX2xlbmd0aCkgewotCQlyZXQgPSBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKGRldl9tYXBbZGV2X21hcF9pZHhdLnBvcnRfaWQsCi0JCQkJCQlkZXZfbWFwW2Rldl9tYXBfaWR4XS5jb3BwX2lkeCwKLQkJCQkJCShjaGFyICopcGFyYW1zX3ZhbHVlLAotCQkJCQkJcGFyYW1zX2xlbmd0aCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IHNlbmQgZG9sYnkgcGFyYW1zIGZhaWxlZCByZXQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9EUzJfUEFSQU1TLTE7IGkrKykgewotCQkJLypnZXQgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gdGhlIGNhY2hlKi8KLQkJCW1vZGlmaWVkX3BhcmFtID0gZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWQ7Ci0JCQlpZiAobW9kaWZpZWRfcGFyYW0gPT0gTlVMTCkgewotCQkJCXByX2VycigiJXM6IG1vZGlmaWVkIHBhcmFtIHN0cnVjdCBpbnZhbGlkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJCWlmICghbXNtX2RzMl9kYXBfY2hlY2tfaXNfcGFyYW1fbW9kaWZpZWQoCi0JCQkJCW1vZGlmaWVkX3BhcmFtLCBpLCBjb21taXQpKQotCQkJCWNvbnRpbnVlOwotCQkJZHMyX2FwX3BhcmFtc19vYmotPmRhcF9wYXJhbXNfbW9kaWZpZWRbaV0gPSAweDAwMDEwMDAxOwotCQl9Ci0JfQotZW5kOgotCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9jb21taXRfcGFyYW1zKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICpkb2xieV9kYXRhLAotCQkJCSBpbnQgY29tbWl0KQotewotCWludCByZXQgPSAwLCBpLCBpZHg7Ci0Jc3RydWN0IGRzMl9kYXBfcGFyYW1zX3MgKmRzMl9hcF9wYXJhbXNfb2JqID0gIE5VTEw7Ci0JaW50MzJfdCAqbW9kaWZpZWRfcGFyYW0gPSBOVUxMOwotCi0JLyogRG8gbm90IGNvbW1pdCBwYXJhbXMgaWYgaW4gaGFyZCBieXBhc3MgKi8KLQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PSBEQVBfSEFSRF9CWVBBU1MgJiYKLQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkgewotCQlwcl9kZWJ1ZygiJXM6IGNhbGxlZCBpbiBieXBhc3MiLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EUzJfUEFSQU1TOyBpZHgrKykgewotCQlpZiAoZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSA9PSBET0xCWV9QQVJBTV9JRF9JTklUX0VORFApCi0JCQlicmVhazsKLQl9Ci0JaWYgKGlkeCA+PSBNQVhfRFMyX1BBUkFNUyB8fCBpZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IGluZGV4IG9mIERTMiBQYXJhbSBub3QgZm91bmQgaWR4ICVkXG4iLAotCQkJX19mdW5jX18sIGlkeCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGZvdW5kIGVuZHAgLSBpZHggJWQgMHgleFxuIiwgX19mdW5jX18sIGlkeCwKLQkJZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSk7Ci0JZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7Ci0JCXByX2RlYnVnKCIlczpkZXZbMHgleCwweCV4XSxpOiVkLGFjdGl2ZTolZCxieXBhc3M6JWQsdHlwZTolZFxuIiwKLQkJCV9fZnVuY19fLCBkb2xieV9kYXRhLT5kZXZpY2VfaWQsIGRldl9tYXBbaV0uZGV2aWNlX2lkLAotCQkJaSwgZGV2X21hcFtpXS5hY3RpdmUsIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzLAotCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSk7Ci0KLQkJaWYgKCgoZGV2X21hcFtpXS5kZXZpY2VfaWQgJiBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlKSB8fAotCQkJKChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09Ci0JCQlEQVBfU09GVF9CWVBBU1MpICYmCi0JCQkoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkpKSAmJgotCQkJKGRldl9tYXBbaV0uYWN0aXZlID09IHRydWUpKSB7Ci0KLQkJCS8qZ2V0IHB0ciB0byB0aGUgY2FjaGUgc3RvcmluZyB0aGUgcGFyYW1zIGZvciBkZXZpY2UqLwotCQkJaWYgKChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09Ci0JCQkJREFQX1NPRlRfQllQQVNTKSAmJgotCQkJCShkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9PSB0cnVlKSkKLQkJCQlkczJfYXBfcGFyYW1zX29iaiA9Ci0JCQkJCSZkczJfZGFwX3BhcmFtc1tkZXZfbWFwWzBdLmNhY2hlX2Rldl07Ci0JCQllbHNlCi0JCQkJZHMyX2FwX3BhcmFtc19vYmogPQotCQkJCQkmZHMyX2RhcF9wYXJhbXNbZGV2X21hcFtpXS5jYWNoZV9kZXZdOwotCi0JCQkvKmdldCB0aGUgcG9pbnRlciB0byB0aGUgcGFyYW0gbW9kaWZpZWQgYXJyYXkgaW4gY2FjaGUqLwotCQkJbW9kaWZpZWRfcGFyYW0gPSBkczJfYXBfcGFyYW1zX29iai0+ZGFwX3BhcmFtc19tb2RpZmllZDsKLQkJCWlmIChtb2RpZmllZF9wYXJhbSA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCIlczogbW9kaWZpZWRfcGFyYW0gTlVMTFxuIiwgX19mdW5jX18pOwotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlbmQ7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBTZW5kIHRoZSBlbmRwIHBhcmFtIGlmIHVzZSBjYWNoZSBpcyBzZXQKLQkJCSAqIG9yIGlmIHBhcmFtIGlzIG1vZGlmaWVkCi0JCQkgKi8KLQkJCWlmICghY29tbWl0IHx8IG1zbV9kczJfZGFwX2NoZWNrX2lzX3BhcmFtX21vZGlmaWVkKAotCQkJCQltb2RpZmllZF9wYXJhbSwgaWR4LCBjb21taXQpKSB7Ci0JCQkJbXNtX2RzMl9kYXBfc2VuZF9lbmRfcG9pbnQoaSwgaWR4KTsKLQkJCQljb21taXQgPSAwOwotCQkJfQotCQkJcmV0ID0gbXNtX2RzMl9kYXBfc2VuZF9jYWNoZWRfcGFyYW1zKGksIGNvbW1pdCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IHNlbmQgY2FjaGVkIHBhcmFtICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGVuZDsKLQkJCX0KLQkJfQotCX0KLWVuZDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX2hhbmRsZV9jb21tYW5kcyh1MzIgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJldCAgPSAwLCBwb3J0X2lkID0gMDsKLQlpbnQzMl90IGRhdGE7Ci0Jc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKilhcmc7Ci0KLQlpZiAoZ2V0X3VzZXIoZGF0YSwgJmRvbGJ5X2RhdGEtPmRhdGFbMF0pKSB7Ci0JCXByX2RlYnVnKCIlcyBlcnJvciBnZXR0aW5nIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwYXJhbV9pZCAlZCxiZV9pZCAlZCxkZXZpY2VfaWQgMHgleCxsZW5ndGggJWQsZGF0YSAlZFxuIiwKLQkJIF9fZnVuY19fLCBkb2xieV9kYXRhLT5wYXJhbV9pZCwgZG9sYnlfZGF0YS0+YmVfaWQsCi0JCWRvbGJ5X2RhdGEtPmRldmljZV9pZCwgZG9sYnlfZGF0YS0+bGVuZ3RoLCBkYXRhKTsKLQotCXN3aXRjaCAoZG9sYnlfZGF0YS0+cGFyYW1faWQpIHsKLQljYXNlIERBUF9DTURfQ09NTUlUX0FMTDoKLQkJbXNtX2RzMl9kYXBfY29tbWl0X3BhcmFtcyhkb2xieV9kYXRhLCAwKTsKLQlicmVhazsKLQotCWNhc2UgREFQX0NNRF9DT01NSVRfQ0hBTkdFRDoKLQkJbXNtX2RzMl9kYXBfY29tbWl0X3BhcmFtcyhkb2xieV9kYXRhLCAxKTsKLQlicmVhazsKLQotCWNhc2UgREFQX0NNRF9VU0VfQ0FDSEVfRk9SX0lOSVQ6Ci0JCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy51c2VfY2FjaGUgPSBkYXRhOwotCWJyZWFrOwotCi0JY2FzZSBEQVBfQ01EX1NFVF9CWVBBU1M6Ci0JCXByX2RlYnVnKCIlczogYnlwYXNzICVkIGJ5cGFzcyB0eXBlICVkLCBkYXRhICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcywKLQkJCSBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlLAotCQkJIGRhdGEpOwotCQkvKiBEbyBub3QgcGVyZm9ybSBieXBhc3Mgb3BlcmF0aW9uIGlmIGJ5cGFzcyBzdGF0ZSBpcyBzYW1lKi8KLQkJaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID09IGRhdGEpCi0JCQlicmVhazsKLQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPSBkYXRhOwotCQkvKiBoYXJkIGJ5cGFzcyAqLwotCQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PSBEQVBfSEFSRF9CWVBBU1MpCi0JCQltc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzKGRvbGJ5X2RhdGEpOwotCQkvKiBzb2Z0IGJ5cGFzcyAqLwotCQltc21fZHMyX2RhcF9jb21taXRfcGFyYW1zKGRvbGJ5X2RhdGEsIDApOwotCWJyZWFrOwotCi0JY2FzZSBEQVBfQ01EX1NFVF9CWVBBU1NfVFlQRToKLQkJaWYgKGRhdGEgPT0gdHJ1ZSkKLQkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUgPQotCQkJCURBUF9IQVJEX0JZUEFTUzsKLQkJZWxzZQotCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9Ci0JCQkJREFQX1NPRlRfQllQQVNTOwotCQlwcl9kZWJ1ZygiJXM6IGJ5cGFzcyB0eXBlICVkIiwgX19mdW5jX18sCi0JCQkgZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSk7Ci0JYnJlYWs7Ci0KLQljYXNlIERBUF9DTURfU0VUX0FDVElWRV9ERVZJQ0U6Ci0JCXByX2RlYnVnKCIlczogREFQX0NNRF9TRVRfQUNUSVZFX0RFVklDRSBsZW5ndGggJWRcbiIsCi0JCQlfX2Z1bmNfXywgZG9sYnlfZGF0YS0+bGVuZ3RoKTsKLQkJLyogVE9ETzogbmVlZCB0byBoYW5kbGUgbXVsdGlwbGUgaW5zdGFuY2UqLwotCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlIHw9IGRvbGJ5X2RhdGEtPmRldmljZV9pZDsKLQkJcG9ydF9pZCA9IG1zbV9kczJfZGFwX2dldF9wb3J0X2lkKAotCQkJCQkJICBkb2xieV9kYXRhLT5kZXZpY2VfaWQsCi0JCQkJCQkgIGRvbGJ5X2RhdGEtPmJlX2lkKTsKLQkJcHJfZGVidWcoIiVzOiBkZXZpY2UgaWQgMHgleCBhbGxfZGV2IDB4JXggcG9ydF9pZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBkb2xieV9kYXRhLT5kZXZpY2VfaWQsCi0JCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlLCBwb3J0X2lkKTsKLQkJbXNtX2RzMl9kYXBfdXBkYXRlX2Rldl9tYXBfcG9ydF9pZChkb2xieV9kYXRhLT5kZXZpY2VfaWQsCi0JCQkJCSAgIHBvcnRfaWQpOwotCQlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgcG9ydCBpZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JYnJlYWs7Ci0JfQotZW5kOgotCXJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9zZXRfcGFyYW0odTMyIGNtZCwgdm9pZCAqYXJnKQotewotCWludCByYyA9IDAsIGlkeCwgaSwgaiwgb2ZmLCBwb3J0X2lkID0gMCwgY2RldiA9IDA7Ci0JaW50MzJfdCBudW1fZGV2aWNlID0gMDsKLQlpbnQzMl90IGRhdGEgPSAwOwotCWludDMyX3QgZGV2X2FycltEUzJfRFNQX1NVUFBPUlRFRF9FTkRQX0RFVklDRV0gPSB7MH07Ci0Jc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAgKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICopYXJnOwotCi0JcmMgPSBtc21fZHMyX2RhcF91cGRhdGVfbnVtX2RldmljZXMoZG9sYnlfZGF0YSwgJm51bV9kZXZpY2UsIGRldl9hcnIsCi0JCQkJICAgRFMyX0RTUF9TVVBQT1JURURfRU5EUF9ERVZJQ0UpOwotCWlmIChudW1fZGV2aWNlID09IDAgfHwgcmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG51bSBkZXZpY2VzIDBcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2U7IGkrKykgewotCQlwb3J0X2lkID0gbXNtX2RzMl9kYXBfZ2V0X3BvcnRfaWQoZGV2X2FycltpXSwKLQkJCQkJCSAgZG9sYnlfZGF0YS0+YmVfaWQpOwotCQlpZiAocG9ydF9pZCAhPSBET0xCWV9JTlZBTElEX1BPUlRfSUQpCi0JCQltc21fZHMyX2RhcF91cGRhdGVfZGV2X21hcF9wb3J0X2lkKGRldl9hcnJbaV0sIHBvcnRfaWQpOwotCi0JCWNkZXYgPSBtc21fZHMyX2RhcF9tYXBfZGV2aWNlX3RvX2RvbGJ5X2NhY2hlX2RldmljZXMoCi0JCQkJCQkJICBkZXZfYXJyW2ldKTsKLQkJaWYgKGNkZXYgPCAwIHx8IGNkZXYgPj0gRE9MQllfTUFYX0NBQ0hFKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNhY2hlIGRldmljZSAlZCBmb3IgZGV2aWNlIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIGNkZXYsIGRldl9hcnJbaV0pOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOnBvcnQ6JWQsYmU6JWQsZGV2OjB4JXgsY2RldjolZCxwYXJhbToweCV4LGxlbjolZFxuIgotCQkJICwgX19mdW5jX18sIHBvcnRfaWQsIGRvbGJ5X2RhdGEtPmJlX2lkLCBkZXZfYXJyW2ldLAotCQkJIGNkZXYsIGRvbGJ5X2RhdGEtPnBhcmFtX2lkLCBkb2xieV9kYXRhLT5sZW5ndGgpOwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EUzJfUEFSQU1TOyBpZHgrKykgewotCQkJLypwYXJhbWlkIGZyb20gdXNlciBzcGFjZSovCi0JCQlpZiAoZG9sYnlfZGF0YS0+cGFyYW1faWQgPT0gZHMyX2RhcF9wYXJhbXNfaWRbaWR4XSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaWR4ID4gTUFYX0RTMl9QQVJBTVMtMSkgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBpZCAweCV4IGF0IGlkeCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZG9sYnlfZGF0YS0+cGFyYW1faWQsIGlkeCk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCi0JCW9mZiA9IGRzMl9kYXBfcGFyYW1zX29mZnNldFtpZHhdOwotCQlpZiAoKGRvbGJ5X2RhdGEtPmxlbmd0aCA8PSAwKSB8fAotCQkJKGRvbGJ5X2RhdGEtPmxlbmd0aCA+IFRPVEFMX0xFTkdUSF9EUzJfUEFSQU0gLSBvZmYpKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGxlbmd0aCAlZCBhdCBpZHggJWRcbiIsCi0JCQkJX19mdW5jX18sIGRvbGJ5X2RhdGEtPmxlbmd0aCwgaWR4KTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KLQkJLyogY2FjaGUgdGhlIHBhcmFtZXRlcnMgKi8KLQkJZHMyX2RhcF9wYXJhbXNbY2Rldl0uZGFwX3BhcmFtc19tb2RpZmllZFtpZHhdICs9IDE7Ci0JCWZvciAoaiA9IDA7IGogPCAgZG9sYnlfZGF0YS0+bGVuZ3RoOyBqKyspIHsKLQkJCWlmIChnZXRfdXNlcihkYXRhLCAmZG9sYnlfZGF0YS0+ZGF0YVtqXSkpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6ZXJyb3IgZ2V0dGluZyBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRUZBVUxUOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQkJZHMyX2RhcF9wYXJhbXNbY2Rldl0ucGFyYW1zX3ZhbFtvZmYgKyBqXSA9IGRhdGE7Ci0JCQkJcHJfZGVidWcoIiVzOm9mZiAlZCx2YWxbaS9wOm8vcF0tWyVkIC8gJWRdXG4iLAotCQkJCQkgX19mdW5jX18sIG9mZiwgZGF0YSwKLQkJCQkJIGRzMl9kYXBfcGFyYW1zW2NkZXZdLgotCQkJCQkgcGFyYW1zX3ZhbFtvZmYgKyBqXSk7Ci0JCX0KLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX2dldF9wYXJhbSh1MzIgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJjID0gMCwgaSwgcG9ydF9pZCA9IDAsIGNvcHBfaWR4ID0gLTE7Ci0Jc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKmRvbGJ5X2RhdGEgPSAoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgKilhcmc7Ci0JaW50MzJfdCAqdXBkYXRlX3BhcmFtc192YWx1ZSA9IE5VTEwsICpwYXJhbXNfdmFsdWUgPSBOVUxMOwotCXVpbnQzMl90IHBhcmFtc19sZW5ndGggPSBET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0gKgotCQkJCQlzaXplb2YodWludDMyX3QpOwotCXVpbnQzMl90IHBhcmFtX3BheWxvYWRfbGVuID0KLQkJCURPTEJZX1BBUkFNX1BBWUxPQURfU0laRSAqIHNpemVvZih1aW50MzJfdCk7Ci0KLQkvKiBSZXR1cm4gZXJyb3Igb24gZ2V0IHBhcmFtIGluIHNvZnQgb3IgaGFyZCBieXBhc3MgKi8KLQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3MgPT0gdHJ1ZSkgewotCQlwcl9lcnIoIiVzOiBjYWxsZWQgaW4gYnlwYXNzX3R5cGUgJWQgYnlwYXNzICVkXG4iLCBfX2Z1bmNfXywKLQkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzX3R5cGUsCi0JCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JLyogUmV0dXJuIGlmIGludmFsaWQgbGVuZ3RoICovCi0JaWYgKChkb2xieV9kYXRhLT5sZW5ndGggPgotCSAgICAgIChET0xCWV9NQVhfTEVOR1RIX0lORElWSURVQUxfUEFSQU0gLSBET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkUpKSB8fAotCSAgICAgIChkb2xieV9kYXRhLT5sZW5ndGggPD0gMCkpIHsKLQkJcHJfZXJyKCJJbnZhbGlkIGxlbmd0aCAlZCIsIGRvbGJ5X2RhdGEtPmxlbmd0aCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7Ci0JCWlmICgoZGV2X21hcFtpXS5hY3RpdmUpICYmCi0JCQkoZGV2X21hcFtpXS5kZXZpY2VfaWQgJiBkb2xieV9kYXRhLT5kZXZpY2VfaWQpKSB7Ci0JCQlwb3J0X2lkID0gZGV2X21hcFtpXS5wb3J0X2lkOwotCQkJY29wcF9pZHggPSBkZXZfbWFwW2ldLmNvcHBfaWR4OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocG9ydF9pZCA9PSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKChjb3BwX2lkeCA8IDApIHx8IChjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9pZHhcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgY29wcF9pZHggJWQsIGRldl9tYXBbaV0uZGV2aWNlX2lkICV4XG4iLAotCQkgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBkZXZfbWFwW2ldLmRldmljZV9pZCk7Ci0KLQlwYXJhbXNfdmFsdWUgPSBremFsbG9jKHBhcmFtc19sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtc192YWx1ZSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZW5kOwotCX0KLQotCWlmIChkb2xieV9kYXRhLT5wYXJhbV9pZCA9PSBET0xCWV9QQVJBTV9JRF9WRVIpIHsKLQkJcmMgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkgICAgRE9MQllfQlVORExFX01PRFVMRV9JRCwKLQkJCQkgICAgRE9MQllfUEFSQU1fSURfVkVSLAotCQkJCSAgICBwYXJhbXNfbGVuZ3RoICsgcGFyYW1fcGF5bG9hZF9sZW4sCi0JCQkJICAgIChjaGFyICopcGFyYW1zX3ZhbHVlKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RTMl9QQVJBTVM7IGkrKykKLQkJCWlmIChkczJfZGFwX3BhcmFtc19pZFtpXSA9PQotCQkJCWRvbGJ5X2RhdGEtPnBhcmFtX2lkKQotCQkJCWJyZWFrOwotCQlpZiAoaSA+IE1BWF9EUzJfUEFSQU1TLTEpIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gaWQgMHgleCBhdCBpZCAlZFxuIiwgX19mdW5jX18sCi0JCQkJZG9sYnlfZGF0YS0+cGFyYW1faWQsIGkpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBlbmQ7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJhbXNfbGVuZ3RoID0KLQkJCWRzMl9kYXBfcGFyYW1zX2xlbmd0aFtpXSAqIHNpemVvZih1aW50MzJfdCk7Ci0KLQkJCXJjID0gYWRtX2dldF9wYXJhbXMocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCSAgICBET0xCWV9CVU5ETEVfTU9EVUxFX0lELAotCQkJCQkgICAgZHMyX2RhcF9wYXJhbXNfaWRbaV0sCi0JCQkJCSAgICBwYXJhbXNfbGVuZ3RoICsKLQkJCQkJICAgIHBhcmFtX3BheWxvYWRfbGVuLAotCQkJCQkgICAgKGNoYXIgKilwYXJhbXNfdmFsdWUpOwotCQl9Ci0JfQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW1ldGVycyBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBwYXJhbXNfdmFsdWU7Ci0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWRvbGJ5X2RhdGEtPmRhdGEsCi0JCQkmdXBkYXRlX3BhcmFtc192YWx1ZVtET0xCWV9QQVJBTV9QQVlMT0FEX1NJWkVdLAotCQkJKGRvbGJ5X2RhdGEtPmxlbmd0aCAqIHNpemVvZih1aW50MzJfdCkpKSkgewotCQlwcl9lcnIoIiVzOiBlcnJvciBnZXR0aW5nIHBhcmFtXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlbmQ7Ci0JfQotZW5kOgotCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbF9nZXQodTMyIGNtZCwgdm9pZCAqYXJnKQotewotCWludDMyX3QgKnZpc3VhbGl6ZXJfZGF0YSA9IE5VTEw7Ci0JaW50ICBpID0gMCwgcmV0ID0gMCwgcG9ydF9pZCA9IC0xLCBjYWNoZV9kZXYgPSAtMSwgY29wcF9pZHggPSAtMTsKLQlpbnQzMl90ICp1cGRhdGVfdmlzdWFsaXplcl9kYXRhID0gTlVMTDsKLQlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSA9IChzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqKWFyZzsKLQl1aW50MzJfdCBvZmZzZXQsIGxlbmd0aCwgcGFyYW1zX2xlbmd0aDsKLQl1aW50MzJfdCBwYXJhbV9wYXlsb2FkX2xlbiA9Ci0JCURPTEJZX1BBUkFNX1BBWUxPQURfU0laRSAqIHNpemVvZih1aW50MzJfdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKLQkJaWYgKChkZXZfbWFwW2ldLmFjdGl2ZSkpICB7Ci0JCQlwb3J0X2lkID0gZGV2X21hcFtpXS5wb3J0X2lkOwotCQkJY2FjaGVfZGV2ID0gZGV2X21hcFtpXS5jYWNoZV9kZXY7Ci0JCQljb3BwX2lkeCA9IGRldl9tYXBbaV0uY29wcF9pZHg7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChwb3J0X2lkID09IERPTEJZX0lOVkFMSURfUE9SVF9JRCB8fAotCQkoY29wcF9pZHggPCAwKSB8fCAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgewotCQlyZXQgPSAwOwotCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOwotCQlwcl9lcnIoIiVzOiBubyBkZXZpY2UgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWxlbmd0aCA9IGRzMl9kYXBfcGFyYW1zW2NhY2hlX2Rldl0ucGFyYW1zX3ZhbFtET0xCWV9QQVJBTV9WQ05CX09GRlNFVF07Ci0KLQlpZiAobGVuZ3RoID4gRE9MQllfUEFSQU1fVkNOQl9NQVhfTEVOR1RIIHx8IGxlbmd0aCA8PSAwKSB7Ci0JCXJldCA9IDA7Ci0JCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDA7Ci0JCXByX2VycigiJXMgSW5jb3JyZWN0IFZDTkIgbGVuZ3RoIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwYXJhbXNfbGVuZ3RoID0gKDIqbGVuZ3RoICsgRE9MQllfVklTX1BBUkFNX0hFQURFUl9TSVpFKSAqCi0JCQkJCQkJIHNpemVvZih1aW50MzJfdCk7Ci0KLQl2aXN1YWxpemVyX2RhdGEgPSBremFsbG9jKHBhcmFtc19sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghdmlzdWFsaXplcl9kYXRhKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWRvbGJ5X2RhdGEtPmxlbmd0aCA9IDA7Ci0JCWdvdG8gZW5kOwotCX0KLQltZW1zZXQodmlzdWFsaXplcl9kYXRhLCAweDAsIHBhcmFtc19sZW5ndGgpOwotCi0JLyogUmV0dXJuIGVycm9yIG9uIGdldCBwYXJhbSBpbiBzb2Z0IG9yIGhhcmQgYnlwYXNzICovCi0JaWYgKGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kYXBfYnlwYXNzID09IHRydWUpIHsKLQkJcHJfZGVidWcoIiVzOiB2aXN1YWxpemVyIGNhbGxlZCBpbiBieXBhc3MsIHJldHVybiAwXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0ID0gMDsKLQkJZG9sYnlfZGF0YS0+bGVuZ3RoID0gMDsKLQkJZ290byBlbmQ7Ci0JfQotCi0Jb2Zmc2V0ID0gMDsKLQlwYXJhbXNfbGVuZ3RoID0gbGVuZ3RoICogc2l6ZW9mKHVpbnQzMl90KTsKLQlyZXQgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCSAgICBET0xCWV9CVU5ETEVfTU9EVUxFX0lELAotCQkJICAgIERPTEJZX1BBUkFNX0lEX1ZDQkcsCi0JCQkgICAgcGFyYW1zX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAotCQkJICAgICgoKGNoYXIgKikodmlzdWFsaXplcl9kYXRhKSkgKyBvZmZzZXQpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGdldCBwYXJhbWV0ZXJzIGZhaWxlZCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOwotCQlnb3RvIGVuZDsKLQl9Ci0Jb2Zmc2V0ID0gbGVuZ3RoICogc2l6ZW9mKHVpbnQzMl90KTsKLQlyZXQgPSBhZG1fZ2V0X3BhcmFtcyhwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCSAgICBET0xCWV9CVU5ETEVfTU9EVUxFX0lELAotCQkJICAgIERPTEJZX1BBUkFNX0lEX1ZDQkUsCi0JCQkgICAgcGFyYW1zX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLAotCQkJICAgICgoKGNoYXIgKikodmlzdWFsaXplcl9kYXRhKSkgKyBvZmZzZXQpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGdldCBwYXJhbWV0ZXJzIGZhaWxlZCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlkb2xieV9kYXRhLT5sZW5ndGggPSAwOwotCQlnb3RvIGVuZDsKLQl9Ci0JdXBkYXRlX3Zpc3VhbGl6ZXJfZGF0YSA9IHZpc3VhbGl6ZXJfZGF0YTsKLQlkb2xieV9kYXRhLT5sZW5ndGggPSAyICogbGVuZ3RoOwotCi0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWRvbGJ5X2RhdGEtPmRhdGEsCi0JCQkodm9pZCAqKXVwZGF0ZV92aXN1YWxpemVyX2RhdGEsCi0JCQkoZG9sYnlfZGF0YS0+bGVuZ3RoICogc2l6ZW9mKHVpbnQzMl90KSkpKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgdG8gdXNlciBmYWlsZWQgZm9yIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJZG9sYnlfZGF0YS0+bGVuZ3RoID0gMDsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBlbmQ7Ci0JfQotCi1lbmQ6Ci0Ja2ZyZWUodmlzdWFsaXplcl9kYXRhKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbXNtX2RzMl9kYXBfc2V0X3NlY3VyaXR5X2NvbnRyb2wodTMyIGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlICpkb2xieV9saWNlbnNlID0KLQkJCQkgKChzdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZSAqKWFyZyk7Ci0JcHJfZGVidWcoIiVzOiBkbWlkICVkIGxpY2Vuc2Uga2V5ICVkXG4iLCBfX2Z1bmNfXywKLQkJZG9sYnlfbGljZW5zZS0+ZG1pZCwgZG9sYnlfbGljZW5zZS0+bGljZW5zZV9rZXkpOwotCWNvcmVfc2V0X2RvbGJ5X21hbnVmYWN0dXJlcl9pZChkb2xieV9saWNlbnNlLT5kbWlkKTsKLQljb3JlX3NldF9saWNlbnNlKGRvbGJ5X2xpY2Vuc2UtPmxpY2Vuc2Vfa2V5LCBET0xCWV9EUzFfTElDRU5TRV9JRCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBtc21fZHMyX2RhcF91cGRhdGVfcG9ydF9wYXJhbWV0ZXJzKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCAgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICAgIGJvb2wgb3BlbikKLXsKLQlpbnQgIGkgPSAwLCBkZXZfaWQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBvcGVuICVkXG4iLCBfX2Z1bmNfXywgb3Blbik7Ci0JZHMyX2RhcF9wYXJhbXNfc3RhdGVzLm5vZGVfb3BlbmVkID0gb3BlbjsKLQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzcyA9IHRydWU7Ci0JZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9IDA7Ci0JZHMyX2RhcF9wYXJhbXNfc3RhdGVzLnVzZV9jYWNoZSA9IDA7Ci0JZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSA9IDA7Ci0JZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmN1c3RvbV9zdGVyZW9fb25vZmYgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBEUzJfREVWSUNFU19BTEw7IGkrKykgewotCQlpZiAoaSA9PSAwKQotCQkJZGV2X21hcFtpXS5kZXZpY2VfaWQgPSAwOwotCQllbHNlIHsKLQkJCWRldl9pZCA9ICgxIDw8IChpLTEpKTsKLQkJCWlmIChhbGxfc3VwcG9ydGVkX2RldmljZXMgJiBkZXZfaWQpCi0JCQkJZGV2X21hcFtpXS5kZXZpY2VfaWQgPSBkZXZfaWQ7Ci0JCQllbHNlCi0JCQkJY29udGludWU7Ci0JCX0KLQkJZGV2X21hcFtpXS5jYWNoZV9kZXYgPQotCQkJbXNtX2RzMl9kYXBfbWFwX2RldmljZV90b19kb2xieV9jYWNoZV9kZXZpY2VzKAotCQkJCSAgICBkZXZfbWFwW2ldLmRldmljZV9pZCk7Ci0JCWlmIChkZXZfbWFwW2ldLmNhY2hlX2RldiA8IDAgfHwKLQkJCQlkZXZfbWFwW2ldLmNhY2hlX2RldiA+PSBET0xCWV9NQVhfQ0FDSEUpCi0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNhY2hlIGRldmljZSAlZCBmb3IgZGV2aWNlIDB4JXhcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCWRldl9tYXBbaV0uY2FjaGVfZGV2LAotCQkJCQkJZGV2X21hcFtpXS5kZXZpY2VfaWQpOwotCQlkZXZfbWFwW2ldLnBvcnRfaWQgPSAtMTsKLQkJZGV2X21hcFtpXS5hY3RpdmUgPSBmYWxzZTsKLQkJZGV2X21hcFtpXS5zdHJlYW1fcmVmX2NvdW50ID0gMDsKLQkJZGV2X21hcFtpXS5jYWxfZGF0YSA9IE5VTEw7Ci0JCWRldl9tYXBbaV0uY29wcF9pZHggPSAtMTsKLQkJcHJfZGVidWcoIiVzOiBkZXZpY2VfaWQgMHgleCwgY2FjaGVfZGV2ICVkIGFjdCAgJWRcbiIsIF9fZnVuY19fLAotCQkJIGRldl9tYXBbaV0uZGV2aWNlX2lkLCBkZXZfbWFwW2ldLmNhY2hlX2RldiwKLQkJCSBkZXZfbWFwW2ldLmFjdGl2ZSk7Ci0JfQotCXJldHVybiAwOwotCi19Ci0KLWludCBtc21fZHMyX2RhcF9pb2N0bF9zaGFyZWQoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICB1MzIgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNtZDogMHgleFxuIiwgX19mdW5jX18sIGNtZCk7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfU0VUX1BBUkFNOgotCQlyZXQgPSBtc21fZHMyX2RhcF9zZXRfcGFyYW0oY21kLCBhcmcpOwotCWJyZWFrOwotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU06Ci0JCXJldCA9IG1zbV9kczJfZGFwX2dldF9wYXJhbShjbWQsIGFyZyk7Ci0JYnJlYWs7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EOgotCQlyZXQgPSBtc21fZHMyX2RhcF9oYW5kbGVfY29tbWFuZHMoY21kLCBhcmcpOwotCWJyZWFrOwotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfTElDRU5TRToKLQkJcmV0ID0gbXNtX2RzMl9kYXBfc2V0X3NlY3VyaXR5X2NvbnRyb2woY21kLCBhcmcpOwotCWJyZWFrOwotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfVklTVUFMSVpFUjoKLQkJcmV0ID0gbXNtX2RzMl9kYXBfcGFyYW1fdmlzdWFsaXplcl9jb250cm9sX2dldChjbWQsIGFyZyk7Ci0JYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogY2FsbGVkIHdpdGggaW52YWxpZCBjb250cm9sIDB4JXhcbiIsIF9fZnVuY19fLCBjbWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbXNtX2RzMl9kYXBfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICB1MzIgY21kLCB2b2lkICphcmcpCi17Ci0KLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogY21kOiAweCV4XG4iLCBfX2Z1bmNfXywgY21kKTsKLQlpZiAoIWFyZykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyBldmVudCBzdGF0dXNcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTToKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0NPTU1BTkQ6IHsKLQkJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgZG9sYnlfZGF0YTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmZG9sYnlfZGF0YSwgKHZvaWQgKilhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKSkpIHsKLQkJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gIC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bF9zaGFyZWQoaHcsIGZpbGUsIGNtZCwgJmRvbGJ5X2RhdGEpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9MSUNFTlNFOiB7Ci0JCXN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlIGRvbGJ5X2xpY2Vuc2U7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmRvbGJ5X2xpY2Vuc2UsICh2b2lkICopYXJnLAotCQkJCXNpemVvZihzdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bF9zaGFyZWQoaHcsIGZpbGUsIGNtZCwgJmRvbGJ5X2xpY2Vuc2UpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9QQVJBTToKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1ZJU1VBTElaRVI6IHsKLQkJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgZG9sYnlfZGF0YTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmZG9sYnlfZGF0YSwgKHZvaWQgKilhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhKSkpIHsKLQkJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gIC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bF9zaGFyZWQoaHcsIGZpbGUsIGNtZCwgJmRvbGJ5X2RhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IGlvY3RsIGNtZCAlZCByZXR1cm5lZCBlcnIgJWRcbiIsCi0JCQkJX19mdW5jX18sIGNtZCwgcmV0KTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmRvbGJ5X2RhdGEsCi0JCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEpKSkgewotCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHgleFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotZW5kOgotCXJldHVybiByZXQ7Ci0KLX0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1pbnQgbXNtX2RzMl9kYXBfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgdTMyIGNtZCwgdm9pZCAqYXJnKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBjbWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBjbWQpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTTMyOgotCQljbWQgPSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTTsKLQkJZ290byBoYW5kbGVfc2V0X2lvY3RsOwotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfQ09NTUFORDMyOgotCQljbWQgPSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EOwotaGFuZGxlX3NldF9pb2N0bDoKLQl7Ci0JCXN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIgZG9sYnlfZGF0YTMyOwotCQlzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSBkb2xieV9kYXRhOwotCi0JCW1lbXNldCgmZG9sYnlfZGF0YTMyLCAwLCBzaXplb2YoZG9sYnlfZGF0YTMyKSk7Ci0JCW1lbXNldCgmZG9sYnlfZGF0YSwgMCwgc2l6ZW9mKGRvbGJ5X2RhdGEpKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkb2xieV9kYXRhMzIsICh2b2lkICopYXJnLAotCQkJCXNpemVvZihzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyKSkpIHsKLQkJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gIC1FRkFVTFQ7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlkb2xieV9kYXRhLnZlcnNpb24gPSBkb2xieV9kYXRhMzIudmVyc2lvbjsKLQkJZG9sYnlfZGF0YS5kZXZpY2VfaWQgPSBkb2xieV9kYXRhMzIuZGV2aWNlX2lkOwotCQlkb2xieV9kYXRhLmJlX2lkID0gZG9sYnlfZGF0YTMyLmJlX2lkOwotCQlkb2xieV9kYXRhLnBhcmFtX2lkID0gZG9sYnlfZGF0YTMyLnBhcmFtX2lkOwotCQlkb2xieV9kYXRhLmxlbmd0aCA9IGRvbGJ5X2RhdGEzMi5sZW5ndGg7Ci0JCWRvbGJ5X2RhdGEuZGF0YSA9IGNvbXBhdF9wdHIoZG9sYnlfZGF0YTMyLmRhdGEpOwotCi0JCXJldCA9IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChodywgZmlsZSwgY21kLCAmZG9sYnlfZGF0YSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNMzI6Ci0JCWNtZCA9IFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNOwotCQlnb3RvIGhhbmRsZV9nZXRfaW9jdGw7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSMzI6Ci0JCWNtZCA9IFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1ZJU1VBTElaRVI7Ci1oYW5kbGVfZ2V0X2lvY3RsOgotCXsKLQkJc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMiBkb2xieV9kYXRhMzI7Ci0JCXN0cnVjdCBkb2xieV9wYXJhbV9kYXRhIGRvbGJ5X2RhdGE7Ci0KLQkJbWVtc2V0KCZkb2xieV9kYXRhMzIsIDAsIHNpemVvZihkb2xieV9kYXRhMzIpKTsKLQkJbWVtc2V0KCZkb2xieV9kYXRhLCAwLCBzaXplb2YoZG9sYnlfZGF0YSkpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRvbGJ5X2RhdGEzMiwgKHZvaWQgKilhcmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIpKSkgewotCQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAgLUVGQVVMVDsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JCWRvbGJ5X2RhdGEudmVyc2lvbiA9IGRvbGJ5X2RhdGEzMi52ZXJzaW9uOwotCQlkb2xieV9kYXRhLmRldmljZV9pZCA9IGRvbGJ5X2RhdGEzMi5kZXZpY2VfaWQ7Ci0JCWRvbGJ5X2RhdGEuYmVfaWQgPSBkb2xieV9kYXRhMzIuYmVfaWQ7Ci0JCWRvbGJ5X2RhdGEucGFyYW1faWQgPSBkb2xieV9kYXRhMzIucGFyYW1faWQ7Ci0JCWRvbGJ5X2RhdGEubGVuZ3RoID0gZG9sYnlfZGF0YTMyLmxlbmd0aDsKLQkJZG9sYnlfZGF0YS5kYXRhID0gY29tcGF0X3B0cihkb2xieV9kYXRhMzIuZGF0YSk7Ci0KLQkJcmV0ID0gbXNtX2RzMl9kYXBfaW9jdGxfc2hhcmVkKGh3LCBmaWxlLCBjbWQsICZkb2xieV9kYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBpb2N0bCBjbWQgJWQsIHJldHVybmVkIGVyciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY21kLCByZXQpOwotCQlkb2xieV9kYXRhMzIubGVuZ3RoID0gZG9sYnlfZGF0YS5sZW5ndGg7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZkb2xieV9kYXRhMzIsCi0JCQlzaXplb2Yoc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfTElDRU5TRTMyOiB7Ci0JCXN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlMzIgZG9sYnlfbGljZW5zZTMyOwotCQlzdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZSBkb2xieV9saWNlbnNlOwotCi0JCWNtZCA9IFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0xJQ0VOU0U7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZkb2xieV9saWNlbnNlMzIsICh2b2lkICopYXJnLAotCQkJc2l6ZW9mKHN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlMzIpKSkgewotCQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJZG9sYnlfbGljZW5zZS5kbWlkID0gZG9sYnlfbGljZW5zZTMyLmRtaWQ7Ci0JCWRvbGJ5X2xpY2Vuc2UubGljZW5zZV9rZXkgPSBkb2xieV9saWNlbnNlMzIubGljZW5zZV9rZXk7Ci0JCXJldCA9IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChodywgZmlsZSwgY21kLCAmZG9sYnlfbGljZW5zZSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBjbWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLWVuZDoKLQlyZXR1cm4gcmV0OwotCi19Ci0jZW5kaWYKLQotaW50IG1zbV9kczJfZGFwX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGNoYW5uZWxzLAotCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19vbikKLXsKLQlpbnQgcmV0ID0gMCwgaWR4ID0gLTEsIGk7Ci0Jc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEgZG9sYnlfZGF0YTsKLQotCXN0cnVjdCBhdWRwcm9jX3NvZnR2b2x1bWVfcGFyYW1zIHNvZnR2b2wgPSB7Ci0JCS5wZXJpb2QgPSBET0xCWV9TT0ZUX1ZPTFVNRV9QRVJJT0QsCi0JCS5zdGVwID0gRE9MQllfU09GVF9WT0xVTUVfU1RFUCwKLQkJLnJhbXBpbmdjdXJ2ZSA9IERPTEJZX1NPRlRfVk9MVU1FX0NVUlZFX0VYUCwKLQl9OwotCi0JcHJfZGVidWcoIiVzOiBwb3J0IGlkICAlZCwgY29wcF9pZHggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQlpZiAocG9ydF9pZCAhPSBET0xCWV9JTlZBTElEX1BPUlRfSUQpIHsKLQkJZm9yIChpID0gMDsgaSA8IERTMl9ERVZJQ0VTX0FMTDsgaSsrKSB7Ci0JCQlpZiAoKGRldl9tYXBbaV0ucG9ydF9pZCA9PSBwb3J0X2lkKSAmJgotCQkJCS8qIGRldmljZSBwYXJ0IG9mIGFjdGl2ZSBkZXZpY2UgKi8KLQkJCQkoZGV2X21hcFtpXS5kZXZpY2VfaWQgJgotCQkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UpKSB7Ci0JCQkJaWR4ID0gaTsKLQkJCQkvKiBHaXZlIHByaW9yaXR5IHRvIGhlYWRzZXQgaW4gY2FzZSBvZgotCQkJCSAqIGNvbWJvIGRldmljZQotCQkJCSAqLwotCQkJCWlmIChkZXZfbWFwW2ldLmRldmljZV9pZCA9PSBTUEVBS0VSKQotCQkJCQljb250aW51ZTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpZHggPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4IGZvciBwb3J0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6aW5kZXggJWQsIGRldlsweCV4LDB4JXhdXG4iLCBfX2Z1bmNfXywgaWR4LAotCQkJIGRldl9tYXBbaWR4XS5kZXZpY2VfaWQsIGRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UpOwotCQlkZXZfbWFwW2lkeF0uYWN0aXZlID0gdHJ1ZTsKLQkJZGV2X21hcFtpZHhdLmNvcHBfaWR4ID0gY29wcF9pZHg7Ci0JCWRvbGJ5X2RhdGEucGFyYW1faWQgPSBET0xCWV9DT01NSVRfQUxMX1RPX0RTUDsKLQkJZG9sYnlfZGF0YS5sZW5ndGggPSAwOwotCQlkb2xieV9kYXRhLmRhdGEgPSBOVUxMOwotCQlkb2xieV9kYXRhLmRldmljZV9pZCA9IGRldl9tYXBbaWR4XS5kZXZpY2VfaWQ7Ci0JCXByX2RlYnVnKCIlczogIGlkeCAgJWQsIGFjdGl2ZSAlZCwgZGV2IGlkIDB4JXgsIHJlZiBjb3VudCAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgaWR4LCBkZXZfbWFwW2lkeF0uYWN0aXZlLAotCQkJIGRldl9tYXBbaWR4XS5kZXZpY2VfaWQsCi0JCQkgZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQpOwotCQlpZiAoZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQgPT0gMCkgewotCQkJLypwZXJmb3JtIG5leHQgMyBmdW5jIG9ubHkgaWYgaGFyZCBieXBhc3MgZW5hYmxlZCovCi0JCQlpZiAoZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRhcF9ieXBhc3NfdHlwZSA9PQotCQkJCURBUF9IQVJEX0JZUEFTUykgewotCQkJCXJldCA9IG1zbV9kczJfZGFwX2FsbG9jX2FuZF9zdG9yZV9jYWxfZGF0YShpZHgsCi0JCQkJCQkgICAgICAgQURNX1BBVEhfUExBWUJBQ0ssIDApOwotCQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBhbGxvYyBhbmQgc3RvcmUgY2FsIGRhdGEgZm9yIGlkeCAlZCwgZGV2aWNlICVkLCBjb3BwX2lkeCAlZCIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywKLQkJCQkJICAgICAgIGlkeCwgZGV2X21hcFtpZHhdLmRldmljZV9pZCwKLQkJCQkJICAgICAgIGRldl9tYXBbaWR4XS5jb3BwX2lkeCk7Ci0JCQkJCWRldl9tYXBbaWR4XS5hY3RpdmUgPSBmYWxzZTsKLQkJCQkJZGV2X21hcFtpZHhdLmNvcHBfaWR4ID0gLTE7Ci0JCQkJCWdvdG8gZW5kOwotCQkJCX0KLQotCQkJCXJldCA9IGFkbV9zZXRfc29mdHZvbHVtZShwb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJCQkgJnNvZnR2b2wpOwotCQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJCXByX2VycigiJXM6IFNvZnQgdm9sdW1lIHJldCBlcnJvciAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCQlkZXZfbWFwW2lkeF0uYWN0aXZlID0gZmFsc2U7Ci0JCQkJCWRldl9tYXBbaWR4XS5jb3BwX2lkeCA9IC0xOwotCQkJCQlnb3RvIGVuZDsKLQkJCQl9Ci0KLQkJCQlyZXQgPSBtc21fZHMyX2RhcF9pbml0X21vZHVsZXNfaW5fdG9wb2xvZ3koCi0JCQkJCQkJaWR4KTsKLQkJCQlpZiAocmV0IDwgMCkgewotCQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gaW5pdCBtb2R1bGVzIGluIHRvcG9sb2Z5IGZvciBpZHggJWQsIGRldmljZSAlZCwgY29wcF9pZHggJWRcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywgaWR4LAotCQkJCQkgICAgICAgZGV2X21hcFtpZHhdLmRldmljZV9pZCwKLQkJCQkJICAgICAgIGRldl9tYXBbaWR4XS5jb3BwX2lkeCk7Ci0JCQkJCWRldl9tYXBbaWR4XS5hY3RpdmUgPSBmYWxzZTsKLQkJCQkJZGV2X21hcFtpZHhdLmNvcHBfaWR4ID0gLTE7Ci0JCQkJCWdvdG8gZW5kOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0ID0gIG1zbV9kczJfZGFwX2NvbW1pdF9wYXJhbXMoJmRvbGJ5X2RhdGEsIDApOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGNvbW1pdCBwYXJhbXMgcmV0ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlyZXQgPSAwOwotCQkJfQotCQl9Ci0JCWRldl9tYXBbaWR4XS5zdHJlYW1fcmVmX2NvdW50Kys7Ci0JCWlmIChpc19jdXN0b21fc3RlcmVvX29uKSB7Ci0JCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuY3VzdG9tX3N0ZXJlb19vbm9mZiA9Ci0JCQkJaXNfY3VzdG9tX3N0ZXJlb19vbjsKLQkJCXNldF9jdXN0b21fc3RlcmVvX29ub2ZmKGlkeCwKLQkJCQkJCWlzX2N1c3RvbV9zdGVyZW9fb24pOwotCQl9Ci0JfQotCi1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBtc21fZHMyX2RhcF9kZWluaXQoaW50IHBvcnRfaWQpCi17Ci0JLyoKLQkgKiBHZXQgdGhlIGFjdGl2ZSBwb3J0IGNvcnJyZXNwb25kaW5nIHRvIHRoZSBhY3RpdmUgZGV2aWNlCi0JICogQ2hlY2sgaWYgdGhpcyBpcyBzYW1lIGFzIGluY29taW5nIHBvcnQKLQkgKiBTZXQgaXQgdG8gaW52YWxpZAotCSAqLwotCWludCBpZHggPSAtMSwgaTsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCWlmIChwb3J0X2lkICE9IERPTEJZX0lOVkFMSURfUE9SVF9JRCkgewotCQlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKLQkJCS8qIEFjdGl2ZSBwb3J0ICovCi0JCQlpZiAoKGRldl9tYXBbaV0ucG9ydF9pZCA9PSBwb3J0X2lkKSAmJgotCQkJCS8qIGRldmljZSBwYXJ0IG9mIGFjdGl2ZSBkZXZpY2UgKi8KLQkJCQkoZGV2X21hcFtpXS5kZXZpY2VfaWQgJgotCQkJCWRzMl9kYXBfcGFyYW1zX3N0YXRlcy5kZXZpY2UpICYmCi0JCQkJLyoKLQkJCQkgKiBOZWVkIHRoaXMgY2hlY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gb2YKLQkJCQkgKiBhY3RpdmUgZGV2aWNlIGJlaW5nIHNldCBhbmQgcGxheWJhY2sKLQkJCQkgKiBpbnN0YW5jZSBvcGVuZWQKLQkJCQkgKi8KLQkJCQkvKiBhY3RpdmUgZGV2aWNlKi8KLQkJCQlkZXZfbWFwW2ldLmFjdGl2ZSkgewotCQkJCWlkeCA9IGk7Ci0JCQkJaWYgKGRldl9tYXBbaV0uZGV2aWNlX2lkID09IFNQRUFLRVIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsc2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlkeCA8IDApIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggZm9yIHBvcnQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByX2RlYnVnKCIlczppbmRleCAlZCwgZGV2IFsweCV4LCAweCV4XVxuIiwgX19mdW5jX18sIGlkeCwKLQkJCSBkZXZfbWFwW2lkeF0uZGV2aWNlX2lkLCBkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGV2aWNlKTsKLQkJZGV2X21hcFtpZHhdLnN0cmVhbV9yZWZfY291bnQtLTsKLQkJaWYgKGRldl9tYXBbaWR4XS5zdHJlYW1fcmVmX2NvdW50ID09IDApIHsKLQkJCS8qcGVyZm9ybSBuZXh0IGZ1bmMgb25seSBpZiBoYXJkIGJ5cGFzcyBlbmFibGVkKi8KLQkJCWlmIChkczJfZGFwX3BhcmFtc19zdGF0ZXMuZGFwX2J5cGFzc190eXBlID09Ci0JCQkJREFQX0hBUkRfQllQQVNTKSB7Ci0JCQkJbXNtX2RzMl9kYXBfZnJlZV9jYWxfZGF0YShpZHgpOwotCQkJfQotCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSAmPSB+ZGV2X21hcFtpZHhdLmRldmljZV9pZDsKLQkJCWRldl9tYXBbaWR4XS5hY3RpdmUgPSBmYWxzZTsKLQkJCWRldl9tYXBbaWR4XS5jb3BwX2lkeCA9IC0xOwotCQl9Ci0JCXByX2RlYnVnKCIlczppZHggICVkLCBhY3RpdmUgJWQsIGRldiBpZCAweCV4IHJlZiBjb3VudCAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgaWR4LCBkZXZfbWFwW2lkeF0uYWN0aXZlLAotCQkJIGRldl9tYXBbaWR4XS5kZXZpY2VfaWQsIGRldl9tYXBbaWR4XS5zdHJlYW1fcmVmX2NvdW50KTsKLQl9Ci19Ci0KLWludCBtc21fZHMyX2RhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJCQlib29sIGlzX2N1c3RvbV9zdGVyZW9fZW5hYmxlZCkKLXsKLQlpbnQgaWR4ID0gLTEsIHJjID0gMCwgaTsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCWlmIChwb3J0X2lkICE9IERPTEJZX0lOVkFMSURfUE9SVF9JRCkgewotCQlmb3IgKGkgPSAwOyBpIDwgRFMyX0RFVklDRVNfQUxMOyBpKyspIHsKLQkJCWlmICgoZGV2X21hcFtpXS5wb3J0X2lkID09IHBvcnRfaWQpICYmCi0JCQkJLyogZGV2aWNlIHBhcnQgb2YgYWN0aXZlIGRldmljZSAqLwotCQkJCShkZXZfbWFwW2ldLmRldmljZV9pZCAmCi0JCQkJZHMyX2RhcF9wYXJhbXNfc3RhdGVzLmRldmljZSkpIHsKLQkJCQlpZHggPSBpOwotCQkJCWlmIChkZXZfbWFwW2ldLmRldmljZV9pZCA9PSBTUEVBS0VSKQotCQkJCQljb250aW51ZTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpZHggPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4IGZvciBwb3J0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlkczJfZGFwX3BhcmFtc19zdGF0ZXMuY3VzdG9tX3N0ZXJlb19vbm9mZiA9Ci0JCQlpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQ7Ci0JCXJjID0gc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaWR4LAotCQkJCQlpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBDdXN0b20gc3RlcmVvIGVyciAlZCBvbiBwb3J0ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYywgcG9ydF9pZCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX2FsbG9jX2FuZF9zdG9yZV9jYWxfZGF0YShpbnQgZGV2X21hcF9pZHgsIGludCBwYXRoLAotCQkJCQkgICAgaW50IHBlcmZfbW9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9mcmVlX2NhbF9kYXRhKGludCBkZXZfbWFwX2lkeCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9zZW5kX2NhbF9kYXRhKGludCBkZXZfbWFwX2lkeCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9jYW5fZW5hYmxlX21vZHVsZShpbnQzMl90IG1vZHVsZV9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9pbml0X21vZHVsZXNfaW5fdG9wb2xvZ3koaW50IGRldl9tYXBfaWR4KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBtc21fZHMyX2RhcF9jaGVja19pc19wYXJhbV9tb2RpZmllZChpbnQzMl90ICpkYXBfcGFyYW1zX21vZGlmaWVkLAotCQkJCSAgICBpbnQzMl90IGlkeCwgaW50MzJfdCBjb21taXQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfbWFwX2RldmljZV90b19kb2xieV9jYWNoZV9kZXZpY2VzKGludDMyX3QgZGV2aWNlX2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9udW1fZGV2aWNlcyhzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSwKLQkJCQkgICAgICBpbnQzMl90ICpudW1fZGV2aWNlLCBpbnQzMl90ICpkZXZfYXJyLAotCQkJCSAgICAgIGludDMyX3QgYXJyYXlfc2l6ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9jb21taXRfcGFyYW1zKHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhICpkb2xieV9kYXRhLAotCQkJCSBpbnQgY29tbWl0KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX2hhbmRsZV9jb21tYW5kcyh1MzIgY21kLCB2b2lkICphcmcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfc2V0X3BhcmFtKHUzMiBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9nZXRfcGFyYW0odTMyIGNtZCwgdm9pZCAqYXJnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfZW5kX3BvaW50KGludCBkZXZfbWFwX2lkeCwgaW50IGVuZHBfaWR4KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3NlbmRfY2FjaGVkX3BhcmFtcyhpbnQgZGV2X21hcF9pZHgsCi0JCQkJCSAgaW50IGNvbW1pdCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9zZXRfdnNwZV92ZGhlKGludCBkZXZfbWFwX2lkeCwKLQkJCQkgICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3BhcmFtX3Zpc3VhbGl6ZXJfY29udHJvbF9nZXQoCi0JCQl1MzIgY21kLCB2b2lkICphcmcsCi0JCQlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSAqYmVkYWlzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3NldF9zZWN1cml0eV9jb250cm9sKHUzMiBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gMAotfQotCi1zdGF0aWMgaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9kZXZfbWFwX3BvcnRfaWQoaW50MzJfdCBkZXZpY2VfaWQsIGludCBwb3J0X2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50MzJfdCBtc21fZHMyX2RhcF9nZXRfcG9ydF9pZCgKLQkJaW50MzJfdCBkZXZpY2VfaWQsIGludDMyX3QgYmVfaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2RzMl9kYXBfaGFuZGxlX2J5cGFzcyhzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YSAqZG9sYnlfZGF0YSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHMyX2RhcF9oYW5kbGVfYnlwYXNzX3dhaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCQkJICBpbnQgd2FpdF90aW1lKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZihpbnQgZGV2X21hcF9pZHgsCi0JCQkJCWJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCXJldHVybiAwOwotfQotaW50IHF0aV9zZXRfY3VzdG9tX3N0ZXJlb19vbihpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pCi17Ci0JcmV0dXJuIDA7Ci19Ci1pbnQgc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IGRldl9tYXBfaWR4LAotCQkJICAgIGJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKQotewotCXJldHVybiAwOwotfQotaW50IG1zbV9kczJfZGFwX2lvY3RsX3NoYXJlZChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHUzMiBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfRE9MQllfRFMyIHx8IENPTkZJR19ET0xCWV9MSUNFTlNFICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRzMi1kYXAtY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWRzMi1kYXAtY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOGMzYTYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kczItZGFwLWNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9NU01fRFMyX0RBUF9DT05GSUdfSF8KLSNkZWZpbmUgX01TTV9EUzJfREFQX0NPTkZJR19IXwotCi0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAibXNtLWRvbGJ5LWNvbW1vbi5oIgotI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+Ci0jaW5jbHVkZSA8dWFwaS9zb3VuZC9kZXZkZXBfcGFyYW1zLmg+Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyIHsKLQlzMzIgdmVyc2lvbjsKLQlzMzIgZGV2aWNlX2lkOwotCXMzMiBiZV9pZDsKLQlzMzIgcGFyYW1faWQ7Ci0JczMyIGxlbmd0aDsKLQljb21wYXRfdXB0cl90IGRhdGE7Ci19OwotCi1zdHJ1Y3QgZG9sYnlfcGFyYW1fbGljZW5zZTMyIHsKLQljb21wYXRfdXB0cl90IGRtaWQ7Ci0JY29tcGF0X3VwdHJfdCBsaWNlbnNlX2tleTsKLX07Ci0KLQotI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTTMyXAotCQlfSU9XUignVScsIDB4MTAsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIpCi0jZGVmaW5lIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNMzJcCi0JCV9JT1IoJ1UnLCAweDExLCBzdHJ1Y3QgZG9sYnlfcGFyYW1fZGF0YTMyKQotI2RlZmluZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0RBUF9DT01NQU5EMzJcCi0JCV9JT1dSKCdVJywgMHgxMywgc3RydWN0IGRvbGJ5X3BhcmFtX2RhdGEzMikKLSNkZWZpbmUgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfTElDRU5TRTMyXAotCQlfSU9XUignVScsIDB4MTQsIHN0cnVjdCBkb2xieV9wYXJhbV9saWNlbnNlMzIpCi0jZGVmaW5lIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1ZJU1VBTElaRVIzMlwKLQkJX0lPUignVScsIDB4MTUsIHN0cnVjdCBkb2xieV9wYXJhbV9kYXRhMzIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0RPTEJZX0RTMikgfHwgZGVmaW5lZChDT05GSUdfRE9MQllfTElDRU5TRSkKLS8qIERPTEJZIERPTEJZIEdVSURTICovCi0jZGVmaW5lIERTMl9NT0RVTEVfSUQJCQkweDAwMDEwNzc1Ci0KLSNkZWZpbmUgRFMyX0RTUF9TVVBQT1JURURfRU5EUF9ERVZJQ0UJCTE3Ci0jZGVmaW5lIERTMl9ERVZJQ0VTX0FMTAkJCQkzMiAvKiBlbnVtIHZhbCBpcyA0IGJ5dGVzICovCi0KLWVudW0gewotCi0JREFQX0NNRF9DT01NSVRfQUxMICAgICAgICAgPSAwLAotCURBUF9DTURfQ09NTUlUX0NIQU5HRUQgICAgID0gMSwKLQlEQVBfQ01EX1VTRV9DQUNIRV9GT1JfSU5JVCA9IDIsCi0JREFQX0NNRF9TRVRfQllQQVNTICAgICAgICAgPSAzLAotCURBUF9DTURfU0VUX0FDVElWRV9ERVZJQ0UgID0gNCwKLQlEQVBfQ01EX1NFVF9CWVBBU1NfVFlQRSAgICA9IDUsCi19OwotCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lOVF9FTkRQX0xFTkdUSCAgICAgICAgICAgICAxCi0jZGVmaW5lIERPTEJZX1BBUkFNX0lOVF9FTkRQX09GRlNFVAkJKERPTEJZX1BBUkFNX1BTVEdfT0ZGU0VUICsgXAotCQkJCQkJCURPTEJZX1BBUkFNX1BTVEdfTEVOR1RIKQotI2RlZmluZSBNQVhfRFMyX1BBUkFNUwkJCQk0OAotI2RlZmluZSBNQVhfRFMyX0NUUkxfUEFSQU1TCQkJNAotI2RlZmluZSBBTExfRFMyX1BBUkFNUwkJCQkoTUFYX0RTMl9QQVJBTVMgKyBcCi0JCQkJCQkJTUFYX0RTMl9DVFJMX1BBUkFNUykKLSNkZWZpbmUgVE9UQUxfTEVOR1RIX0RTMl9QQVJBTSAoVE9UQUxfTEVOR1RIX0RPTEJZX1BBUkFNICsgMSkKLQotaW50IG1zbV9kczJfZGFwX3VwZGF0ZV9wb3J0X3BhcmFtZXRlcnMoc3RydWN0IHNuZF9od2RlcCAqaHcsICBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICAgYm9vbCBvcGVuKTsKLWludCBtc21fZHMyX2RhcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgIHUzMiBjbWQsIHZvaWQgKmFyZyk7Ci1pbnQgbXNtX2RzMl9kYXBfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAotCQkJICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgdTMyIGNtZCwgdm9pZCAqYXJnKTsKLWludCBtc21fZHMyX2RhcF9pbml0KGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBjaGFubmVscywKLQkJICAgICBib29sIGlzX2N1c3RvbV9zdGVyZW9fb24pOwotdm9pZCBtc21fZHMyX2RhcF9kZWluaXQoaW50IHBvcnRfaWQpOwotaW50IG1zbV9kczJfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQkJCWJvb2wgaXNfY3VzdG9tX3N0ZXJlb19lbmFibGVkKTsKLS8qIERvbGJ5IERPTEJZIGVuZCAqLwotI2Vsc2UKLQotc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfdXBkYXRlX3BvcnRfcGFyYW1ldGVycyhzdHJ1Y3Qgc25kX2h3ZGVwICpodywKLQkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgICAgICAgYm9vbCBvcGVuKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtc21fZHMyX2RhcF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgIHUzMiBjbWQsIHZvaWQgKmFyZykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfY29tcGF0X2lvY3RsKHN0cnVjdCBzbmRfaHdkZXAgKmh3LAotCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJICAgdTMyIGNtZCwgdm9pZCAqYXJnKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgY2hhbm5lbHMsCi0JCSAgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX29uKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNtX2RzMl9kYXBfZGVpbml0KGludCBwb3J0X2lkKSB7IH0KLQotc3RhdGljIGlubGluZSBpbnQgbXNtX2RzMl9kYXBfc2V0X2N1c3RvbV9zdGVyZW9fb25vZmYoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCQkgICAgYm9vbCBpc19jdXN0b21fc3RlcmVvX2VuYWJsZWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtc3JzLXRtLWNvbmZpZy5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtc3JzLXRtLWNvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTlmNDRjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tZHRzLXNycy10bS1jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgMjAxNi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWRtLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+Ci0jaW5jbHVkZSAibXNtLWR0cy1zcnMtdG0tY29uZmlnLmgiCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0KLXN0YXRpYyBpbnQgc3JzX3BvcnRfaWRbQUZFX01BWF9QT1JUU10gPSB7LTF9Owotc3RhdGljIGludCBzcnNfY29wcF9pZHhbQUZFX01BWF9QT1JUU10gPSB7LTF9Owotc3RhdGljIHVuaW9uIHNyc190cnVtZWRpYV9wYXJhbXNfdSBtc21fc3JzX3RydW1lZGlhX3BhcmFtczsKLXN0YXRpYyBzdHJ1Y3QgaW9uX2NsaWVudCAqaW9uX2NsaWVudDsKLXN0YXRpYyBzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZTsKLXN0YXRpYyBzdHJ1Y3QgcGFyYW1fb3V0YmFuZCBwbzsKLXN0YXRpYyBhdG9taWNfdCByZWZfY250OwotI2RlZmluZSBJT05fTUVNX1NJWkUJKDggKiAxMDI0KQotCi1zdGF0aWMgaW50IHNldF9wb3J0X2lkKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpCi17Ci0JaW50IGluZGV4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQotCWlmIChpbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkeCAlZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIGluZGV4LAotCQkJcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzcnNfcG9ydF9pZFtpbmRleF0gPSBwb3J0X2lkOwotCXNyc19jb3BwX2lkeFtpbmRleF0gPSBjb3BwX2lkeDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2R0c19zcnNfdG1fc2VuZF9wYXJhbXMoX19zMzIgcG9ydF9pZCwgX191MzIgdGVjaHMpCi17Ci0JX19zMzIgaW5kZXggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCi0JaWYgKGluZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBpbmRleCwgcG9ydF9pZCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKChzcnNfY29wcF9pZHhbaW5kZXhdIDwgMCkgfHwKLQkgICAgKHNyc19jb3BwX2lkeFtpbmRleF0gPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgewotCQlwcl9kZWJ1ZygiJXM6IHNlbmQgcGFyYW1zIGNhbGxlZCBiZWZvcmUgY29wcCBvcGVuLiBzbywgY2FjaGluZ1xuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JcHJfZGVidWcoIlNSUyAlczogY2FsbGVkLCBwb3J0X2lkID0gJWQsIHRlY2hzIGZsYWdzID0gJXVcbiIsCi0JCV9fZnVuY19fLCBwb3J0X2lkLCB0ZWNocyk7Ci0JLyogZm9yY2UgYWxsIGlmIHRlY2hzIGlzIHNldCB0byAxICovCi0JaWYgKHRlY2hzID09IDEpCi0JCXRlY2hzID0gMHhGRkZGRkZGRjsKLQotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9XT1dIRCkpCi0JCXNyc190cnVtZWRpYV9vcGVuKHBvcnRfaWQsIHNyc19jb3BwX2lkeFtpbmRleF0sIFNSU19JRF9XT1dIRCwKLQkJCSh2b2lkICopJm1zbV9zcnNfdHJ1bWVkaWFfcGFyYW1zLnNyc19wYXJhbXMud293aGQpOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9DU0hQKSkKLQkJc3JzX3RydW1lZGlhX29wZW4ocG9ydF9pZCwgc3JzX2NvcHBfaWR4W2luZGV4XSwgU1JTX0lEX0NTSFAsCi0JCQkodm9pZCAqKSZtc21fc3JzX3RydW1lZGlhX3BhcmFtcy5zcnNfcGFyYW1zLmNzaHApOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9IUEYpKQotCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfSFBGLAotCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5ocGYpOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9BRVEpKQotCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfQUVRLAotCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5hZXEpOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9ITCkpCi0JCXNyc190cnVtZWRpYV9vcGVuKHBvcnRfaWQsIHNyc19jb3BwX2lkeFtpbmRleF0sIFNSU19JRF9ITCwKLQkJCSh2b2lkICopJm1zbV9zcnNfdHJ1bWVkaWFfcGFyYW1zLnNyc19wYXJhbXMuaGwpOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9HRVEpKQotCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfR0VRLAotCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5nZXEpOwotCWlmICh0ZWNocyAmICgxIDw8IFNSU19JRF9HTE9CQUwpKQotCQlzcnNfdHJ1bWVkaWFfb3Blbihwb3J0X2lkLCBzcnNfY29wcF9pZHhbaW5kZXhdLCBTUlNfSURfR0xPQkFMLAotCQkJKHZvaWQgKikmbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMuc3JzX3BhcmFtcy5nbG9iYWwpOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXRfKGludCBwb3J0X2lkLAotCQkJCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQotCV9fdTE2IG9mZnNldCwgdmFsdWUsIG1heCA9IHNpemVvZihtc21fc3JzX3RydW1lZGlhX3BhcmFtcykgPj4gMTsKLQotCWlmIChTUlNfQ01EX1VQTE9BRCA9PQotCQkodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBTUlNfQ01EX1VQTE9BRCkpIHsKLQkJX191MzIgdGVjaHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4RkY7Ci0JCV9fczMyIGluZGV4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgMHgleFxuIiwKLQkJCQkJX19mdW5jX18sIGluZGV4LCBwb3J0X2lkKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJcHJfZGVidWcoIlNSUyAlczogc2VuZCBwYXJhbXMgcmVxdWVzdCwgZmxhZyA9ICV1XG4iLAotCQkJCQlfX2Z1bmNfXywgdGVjaHMpOwotCQlpZiAoc3JzX3BvcnRfaWRbaW5kZXhdID49IDAgJiYgdGVjaHMpCi0JCQltc21fZHRzX3Nyc190bV9zZW5kX3BhcmFtcyhwb3J0X2lkLCB0ZWNocyk7Ci0JCXJldHVybiAwOwotCX0KLQlvZmZzZXQgPSAoX191MTYpKCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmCi0JCQlTUlNfUEFSQU1fT0ZGU0VUX01BU0spID4+IDE2KTsKLQl2YWx1ZSA9IChfX3UxNikodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJgotCQkJU1JTX1BBUkFNX1ZBTFVFX01BU0spOwotCWlmIChvZmZzZXQgPCBtYXgpIHsKLQkJbXNtX3Nyc190cnVtZWRpYV9wYXJhbXMucmF3X3BhcmFtc1tvZmZzZXRdID0gdmFsdWU7Ci0JCXByX2RlYnVnKCJTUlMgJXM6IGluZGV4IHNldC4uLiAobWF4ICVkLCByZXF1ZXN0ZWQgJWQsIHZhbHVlIDB4JVgpXG4iLAotCQkJIF9fZnVuY19fLCBtYXgsIG9mZnNldCwgdmFsdWUpOwotCX0gZWxzZSB7Ci0JCXByX2VycigiU1JTICVzOiBpbmRleCBvdXQgb2YgYm91bmRzISAobWF4ICVkLCByZXF1ZXN0ZWQgJWQpXG4iLAotCQkgICAgICAgX19mdW5jX18sIG1heCwgb2Zmc2V0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCwgcG9ydF9pZDsKLQotCXByX2RlYnVnKCJTUlMgY29udHJvbCBub3JtYWwgY2FsbGVkXG4iKTsKLQltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7Ci0JcG9ydF9pZCA9IFNMSU1CVVNfMF9SWDsKLQlyZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX3NldF8ocG9ydF9pZCwga2NvbnRyb2wsIHVjb250cm9sKTsKLQltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2kyc19zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCwgcG9ydF9pZDsKLQotCXByX2RlYnVnKCJTUlMgY29udHJvbCBJMlMgY2FsbGVkXG4iKTsKLQltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7Ci0JcG9ydF9pZCA9IFBSSU1BUllfSTJTX1JYOwotCXJldCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0Xyhwb3J0X2lkLCBrY29udHJvbCwgdWNvbnRyb2wpOwotCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfbWkyc19zZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCwgcG9ydF9pZDsKLQotCXByX2RlYnVnKCJTUlMgY29udHJvbCBNSTJTIGNhbGxlZFxuIik7Ci0JbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jaygpOwotCXBvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7Ci0JcmV0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9zZXRfKHBvcnRfaWQsIGtjb250cm9sLCB1Y29udHJvbCk7Ci0JbXNtX3BjbV9yb3V0aW5nX3JlbGVhc2VfbG9jaygpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9oZG1pX3NldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCwgcG9ydF9pZDsKLQotCXByX2RlYnVnKCJTUlMgY29udHJvbCBIRE1JIGNhbGxlZFxuIik7Ci0JbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jaygpOwotCXBvcnRfaWQgPSBIRE1JX1JYOwotCXJldCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0Xyhwb3J0X2lkLCBrY29udHJvbCwgdWNvbnRyb2wpOwotCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHBhX3Nyc190cnVtZWRpYV9jb250cm9sc1tdID0gewotCXsuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJTUlMgVHJ1TWVkaWEiLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywKLQkuZ2V0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQsCi0JLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfc2V0LAotCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQotCXsucmVnID0gU05EX1NPQ19OT1BNLAotCS5ycmVnID0gU05EX1NPQ19OT1BNLAotCS5zaGlmdCA9IDAsCi0JLnJzaGlmdCA9IDAsCi0JLm1heCA9IDB4RkZGRkZGRkYsCi0JLnBsYXRmb3JtX21heCA9IDB4RkZGRkZGRkYsCi0JLmludmVydCA9IDAKLQl9KQotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2hkbWlbXSA9IHsKLQl7LmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSAiU1JTIFRydU1lZGlhIEhETUkiLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192b2xzdywKLQkuZ2V0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9nZXQsCi0JLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfaGRtaV9zZXQsCi0JLnByaXZhdGVfdmFsdWUgPSAoKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wpCi0Jey5yZWcgPSBTTkRfU09DX05PUE0sCi0JLnJyZWcgPSBTTkRfU09DX05PUE0sCi0JLnNoaWZ0ID0gMCwKLQkucnNoaWZ0ID0gMCwKLQkubWF4ID0gMHhGRkZGRkZGRiwKLQkucGxhdGZvcm1fbWF4ID0gMHhGRkZGRkZGRiwKLQkuaW52ZXJ0ID0gMAotCX0pCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfaTJzW10gPSB7Ci0Jey5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5uYW1lID0gIlNSUyBUcnVNZWRpYSBJMlMiLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5pbmZvID0gc25kX3NvY19pbmZvX3ZvbHN3LAotCS5nZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2dldCwKLQkucHV0ID0gbXNtX2R0c19zcnNfdHJ1bWVkaWFfY29udHJvbF9pMnNfc2V0LAotCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQotCXsucmVnID0gU05EX1NPQ19OT1BNLAotCS5ycmVnID0gU05EX1NPQ19OT1BNLAotCS5zaGlmdCA9IDAsCi0JLnJzaGlmdCA9IDAsCi0JLm1heCA9IDB4RkZGRkZGRkYsCi0JLnBsYXRmb3JtX21heCA9IDB4RkZGRkZGRkYsCi0JLmludmVydCA9IDAKLQl9KQotCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX21pMnNbXSA9IHsKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJTUlMgVHJ1TWVkaWEgTUkyUyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQgfAotCQkJU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBzbmRfc29jX2luZm9fdm9sc3csCi0JCS5nZXQgPSBtc21fZHRzX3Nyc190cnVtZWRpYV9jb250cm9sX2dldCwKLQkJLnB1dCA9IG1zbV9kdHNfc3JzX3RydW1lZGlhX2NvbnRyb2xfbWkyc19zZXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gKCh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19taXhlcl9jb250cm9sKQotCQl7Ci0JCQkucmVnID0gU05EX1NPQ19OT1BNLAotCQkJLnJyZWcgPSBTTkRfU09DX05PUE0sCi0JCQkuc2hpZnQgPSAwLAotCQkJLnJzaGlmdCA9IDAsCi0JCQkubWF4ID0gMHhGRkZGRkZGRiwKLQkJCS5wbGF0Zm9ybV9tYXggPSAweEZGRkZGRkZGLAotCQkJLmludmVydCA9IDAKLQkJfSkKLQl9Ci19OwotCi12b2lkIG1zbV9kdHNfc3JzX3RtX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQkJbHBhX3Nyc190cnVtZWRpYV9jb250cm9scywKLQkJCUFSUkFZX1NJWkUobHBhX3Nyc190cnVtZWRpYV9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQkJbHBhX3Nyc190cnVtZWRpYV9jb250cm9sc19oZG1pLAotCQkJQVJSQVlfU0laRShscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2hkbWkpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAotCQkJCWxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfaTJzLAotCQkJQVJSQVlfU0laRShscGFfc3JzX3RydW1lZGlhX2NvbnRyb2xzX2kycykpOwotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAotCQkJCWxwYV9zcnNfdHJ1bWVkaWFfY29udHJvbHNfbWkycywKLQkJCUFSUkFZX1NJWkUobHBhX3Nyc190cnVtZWRpYV9jb250cm9sc19taTJzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX2lvbl9tZW0odm9pZCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IG1zbV9hdWRpb19pb25fYWxsb2MoIlNSU19UUlVNRURJQSIsICZpb25fY2xpZW50LCAmaW9uX2hhbmRsZSwKLQkJCQkgSU9OX01FTV9TSVpFLCAmcG8ucGFkZHIsIChzaXplX3QgKikmcG8uc2l6ZSwKLQkJCQkgJnBvLmt2YWRkcik7Ci0JaWYgKHJjICE9IDApCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iLCBfX2Z1bmNfXyk7Ci0JCXByX2RlYnVnKCIlczogZXhpdGVkIGlvbl9jbGllbnQgPSAlcEssIGlvbl9oYW5kbGUgPSAlcEssIHBoeXNfYWRkciA9ICVsdSwgbGVuZ3RoID0gJWQsIHZhZGRyID0gJXBLLCByYyA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgaW9uX2NsaWVudCwgaW9uX2hhbmRsZSwgKGxvbmcpcG8ucGFkZHIsCi0JCQkodW5zaWduZWQgaW50KXBvLnNpemUsIHBvLmt2YWRkciwgcmMpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBtc21fZHRzX3Nyc190bV9pb25fbWVtbWFwKHN0cnVjdCBwYXJhbV9vdXRiYW5kICpwb18pCi17Ci0JaWYgKHBvLmt2YWRkciA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCIlczogY2FsbGluZ3JlZ19pb25fbWVtKClcbiIsIF9fZnVuY19fKTsKLQkJcmVnX2lvbl9tZW0oKTsKLQl9Ci0JcG9fLT5zaXplID0gSU9OX01FTV9TSVpFOwotCXBvXy0+a3ZhZGRyID0gcG8ua3ZhZGRyOwotCXBvXy0+cGFkZHIgPSBwby5wYWRkcjsKLX0KLQotc3RhdGljIHZvaWQgdW5yZWdfaW9uX21lbSh2b2lkKQotewotCW1zbV9hdWRpb19pb25fZnJlZShpb25fY2xpZW50LCBpb25faGFuZGxlKTsKLQlwby5rdmFkZHIgPSBOVUxMOwotCXBvLnBhZGRyID0gMDsKLQlwby5zaXplID0gMDsKLX0KLQotdm9pZCBtc21fZHRzX3Nyc190bV9kZWluaXQoaW50IHBvcnRfaWQpCi17Ci0Jc2V0X3BvcnRfaWQocG9ydF9pZCwgLTEpOwotCWF0b21pY19kZWMoJnJlZl9jbnQpOwotCWlmIChwby5rdmFkZHIgIT0gTlVMTCkgewotCQlpZiAoIWF0b21pY19yZWFkKCZyZWZfY250KSkgewotCQkJcHJfZGVidWcoIiVzOiBjYWxsaW5nIHVucmVnX2lvbl9tZW0oKVxuIiwgX19mdW5jX18pOwotCQkJdW5yZWdfaW9uX21lbSgpOwotCQl9Ci0JfQotfQotCi12b2lkIG1zbV9kdHNfc3JzX3RtX2luaXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKLXsKLQlpbnQgY3VyX3JlZl9jbnQgPSAwOwotCi0JaWYgKHNldF9wb3J0X2lkKHBvcnRfaWQsIGNvcHBfaWR4KSA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkOiAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JY3VyX3JlZl9jbnQgPSBhdG9taWNfcmVhZCgmcmVmX2NudCk7Ci0JYXRvbWljX2luYygmcmVmX2NudCk7Ci0JaWYgKCFjdXJfcmVmX2NudCAmJiBwby5rdmFkZHIgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IGNhbGxpbmcgcmVnX2lvbl9tZW0oKVxuIiwgX19mdW5jX18pOwotCQlpZiAocmVnX2lvbl9tZW0oKSAhPSAwKSB7Ci0JCQlhdG9taWNfZGVjKCZyZWZfY250KTsKLQkJCXBvLmt2YWRkciA9IE5VTEw7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbXNtX2R0c19zcnNfdG1fc2VuZF9wYXJhbXMocG9ydF9pZCwgMSk7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWR0cy1zcnMtdG0tY29uZmlnLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWR0cy1zcnMtdG0tY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDdhZWQuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1kdHMtc3JzLXRtLWNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX01TTV9EVFNfU1JTX1RNX0NPTkZJR19IXwotI2RlZmluZSBfTVNNX0RUU19TUlNfVE1fQ09ORklHX0hfCi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotc3RydWN0IHBhcmFtX291dGJhbmQ7Ci0KLSNpZmRlZiBDT05GSUdfRFRTX1NSU19UTQotCi11bmlvbiBzcnNfdHJ1bWVkaWFfcGFyYW1zX3UgewotCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zIHNyc19wYXJhbXM7Ci0JX191MTYgcmF3X3BhcmFtc1sxXTsKLX07Ci0KLXZvaWQgbXNtX2R0c19zcnNfdG1faW9uX21lbW1hcChzdHJ1Y3QgcGFyYW1fb3V0YmFuZCAqcG9fKTsKLXZvaWQgbXNtX2R0c19zcnNfdG1faW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKLXZvaWQgbXNtX2R0c19zcnNfdG1fZGVpbml0KGludCBwb3J0X2lkKTsKLXZvaWQgbXNtX2R0c19zcnNfdG1fYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIG1zbV9kdHNfc3JzX3RtX2lvbl9tZW1tYXAoc3RydWN0IHBhcmFtX291dGJhbmQgKnBvXykgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbXNtX2R0c19zcnNfdG1faW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc21fZHRzX3Nyc190bV9kZWluaXQoaW50IHBvcnRfaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIG1zbV9kdHNfc3JzX3RtX2FkZF9jb250cm9scygKLQkJCQkJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKSB7IH0KLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1sc20tY2xpZW50LmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWxzbS1jbGllbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzNDc1Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLWxzbS1jbGllbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmxzbS5oPgotI2luY2x1ZGUgPHNvdW5kL2xzbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0KLSNkZWZpbmUgQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMgICAgIDIKLSNkZWZpbmUgQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgICAgIDgKLSNkZWZpbmUgQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUgICAgIDYxNDQwCi0jZGVmaW5lIENBUFRVUkVfTUlOX1BFUklPRF9TSVpFICAgICAzMjAKLSNkZWZpbmUgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFIDI1NgotCi0jZGVmaW5lIExBQl9CVUZGRVJfQUxMT0MgMQotI2RlZmluZSBMQUJfQlVGRkVSX0RFQUxMT0MgMAotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlID0gewotCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKLQkuZm9ybWF0cyA9ICAgICAgICAgICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKSwKLQkucmF0ZXMgPQkJKFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV80ODAwMCksCi0JLnJhdGVfbWluID0gICAgICAgICAgICAgMTYwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCi0JLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKLQkuY2hhbm5lbHNfbWF4ID0gICAgICAgICA0LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIENBUFRVUkVfTUFYX05VTV9QRVJJT0RTICoKLQkJCQlDQVBUVVJFX01BWF9QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CUNBUFRVUkVfTUlOX1BFUklPRF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gICAgIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFLAotCS5wZXJpb2RzX21pbiA9ICAgICAgICAgIENBUFRVUkVfTUlOX05VTV9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9ICAgICAgICAgIENBUFRVUkVfTUFYX05VTV9QRVJJT0RTLAotCS5maWZvX3NpemUgPSAgICAgICAgICAgIDAsCi19OwotCi0vKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7Ci0JMTYwMDAsIDQ4MDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMgPSB7Ci0JLmNvdW50ID0gQVJSQVlfU0laRShzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzKSwKLQkubGlzdCA9IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMsCi0JLm1hc2sgPSAwLAotfTsKLQotc3RydWN0IGxzbV9wcml2IHsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbHNtX2NsaWVudCAqbHNtX2NsaWVudDsKLQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjMgKmV2ZW50X3N0YXR1czsKLQlzcGlubG9ja190IGV2ZW50X2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfd2FpdDsKLQl1bnNpZ25lZCBsb25nIGV2ZW50X2F2YWlsOwotCWF0b21pY190IGV2ZW50X3dhaXRfc3RvcDsKLQlhdG9taWNfdCBidWZfY291bnQ7Ci0JYXRvbWljX3QgcmVhZF9hYm9ydDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBwZXJpb2Rfd2FpdDsKLQlzdHJ1Y3QgbXV0ZXggbHNtX2FwaV9sb2NrOwotCWludCBhcHBsX2NudDsKLQlpbnQgZG1hX3dyaXRlOwotfTsKLQotZW51bSB7IC8qIGxzbSBzZXNzaW9uIHN0YXRlcyAqLwotCUlETEUgPSAwLAotCVJVTk5JTkcsCi19OwotCi1zdGF0aWMgaW50IG1zbV9sc21fcXVldWVfbGFiX2J1ZmZlcihzdHJ1Y3QgbHNtX3ByaXYgKnBydGQsIGludCBpKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGxzbV9jbWRfcmVhZCBjbWRfcmVhZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCi0JaWYgKCFwcnRkIHx8ICFwcnRkLT5sc21fY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIHBydGQgJXBLIGxzbSBjbGllbnQgJXBLXG4iLAotCQkJX19mdW5jX18sIHBydGQsICgoIXBydGQpID8gTlVMTCA6IHBydGQtPmxzbV9jbGllbnQpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghcHJ0ZC0+c3Vic3RyZWFtIHx8ICFwcnRkLT5zdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKLQkJCSghcHJ0ZC0+c3Vic3RyZWFtKSA/ICJzdWJzdHJlYW0iIDogInByaXZhdGVfZGF0YSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcnRkID0gcHJ0ZC0+c3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIXBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXIgfHwKLQkJaSA+PSBwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50KSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IExhYiBidWZmZXIgbm90IHNldHVwICVwSyBpbmNvcnJlY3QgaW5kZXggJWQgcGVyaW9kIGNvdW50ICVkXG4iLAotCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXIsIGksCi0JCQlwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNtZF9yZWFkLmJ1Zl9hZGRyX2xzdyA9Ci0JCWxvd2VyXzMyX2JpdHMocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5waHlzKTsKLQljbWRfcmVhZC5idWZfYWRkcl9tc3cgPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyW2ldLnBoeXMpOwotCWNtZF9yZWFkLmJ1Zl9zaXplID0gcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5zaXplOwotCWNtZF9yZWFkLm1lbV9tYXBfaGFuZGxlID0KLQkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5tZW1fbWFwX2hhbmRsZTsKLQlyYyA9IHE2bHNtX3JlYWQocHJ0ZC0+bHNtX2NsaWVudCwgJmNtZF9yZWFkKTsKLQlpZiAocmMpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGVycm9yIGluIHF1ZXVpbmcgdGhlIGxhYiBidWZmZXIgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBsc21fbGFiX2J1ZmZlcl9zYW5pdHkoc3RydWN0IGxzbV9wcml2ICpwcnRkLAotCQlzdHJ1Y3QgbHNtX2NtZF9yZWFkX2RvbmUgKnJlYWRfZG9uZSwgaW50ICppbmRleCkKLXsKLQlpbnQgaSA9IDAsIHJjID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCi0JaWYgKCFwcnRkIHx8ICFyZWFkX2RvbmUgfHwgIWluZGV4KSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zIHBydGQgJXBLIHJlYWRfZG9uZSAlcEsgaW5kZXggJXBLXG4iLAotCQkJX19mdW5jX18sIHBydGQsIHJlYWRfZG9uZSwgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXBydGQtPnN1YnN0cmVhbSB8fCAhcHJ0ZC0+c3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCAlc1xuIiwgX19mdW5jX18sCi0JCQkoIXBydGQtPnN1YnN0cmVhbSkgPyAic3Vic3RyZWFtIiA6ICJwcml2YXRlX2RhdGEiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJ0ZCA9IHBydGQtPnN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFwcnRkLT5sc21fY2xpZW50LT5sYWJfZW5hYmxlIHx8ICFwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IExhYiBub3QgZW5hYmxlZCAlZCBpbnZhbGlkIGxhYiBidWZmZXIgJXBLXG4iLAotCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPmxhYl9lbmFibGUsCi0JCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50OyBpKyspIHsKLQkJaWYgKChsb3dlcl8zMl9iaXRzKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ucGh5cykgPT0KLQkJCXJlYWRfZG9uZS0+YnVmX2FkZHJfbHN3KSAmJgotCQkJKG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzCi0JCQkJKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ucGh5cykgPT0KLQkJCXJlYWRfZG9uZS0+YnVmX2FkZHJfbXN3KSAmJgotCQkJKHBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0ubWVtX21hcF9oYW5kbGUgPT0KLQkJCXJlYWRfZG9uZS0+bWVtX21hcF9oYW5kbGUpKSB7Ci0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCSIlczogQnVmZmVyIGZvdW5kICVwSyBtZW1tYXAgaGFuZGxlICVkXG4iLAotCQkJCV9fZnVuY19fLCAmcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5waHlzLAotCQkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltpXS5tZW1fbWFwX2hhbmRsZSk7Ci0JCQlpZiAocmVhZF9kb25lLT50b3RhbF9zaXplID4KLQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyW2ldLnNpemUpIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IFNpemUgbWlzbWF0Y2ggY2FsbCBiYWNrIHNpemUgJWQgYWN0dWFsIHNpemUgJXpkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmVhZF9kb25lLT50b3RhbF9zaXplLAotCQkJCXBydGQtPmxzbV9jbGllbnQtPmxhYl9idWZmZXJbaV0uc2l6ZSk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQkqaW5kZXggPSBpOwotCQkJCXJjID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGxzbV9ldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgdG9rZW4sCi0JCQkgICAgICB2b2lkICpwYXlsb2FkLCB2b2lkICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcHJpdjsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBydGQtPnN1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1c192MyAqdGVtcDsKLQl1aW50MTZfdCBzdGF0dXMgPSAwOwotCXVpbnQxNl90IHBheWxvYWRfc2l6ZSA9IDA7Ci0JdWludDE2X3QgaW5kZXggPSAwOwotCXVpbnQzMl90IGV2ZW50X3RzX2xzdyA9IDA7Ci0JdWludDMyX3QgZXZlbnRfdHNfbXN3ID0gMDsKLQotCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKLQkJCSghc3Vic3RyZWFtKSA/ICJzdWJzdHJlYW0iIDogInByaXZhdGVfZGF0YSIpOwotCQlyZXR1cm47Ci0JfQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCi0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIExTTV9EQVRBX0VWRU5UX1JFQURfRE9ORTogewotCQlpbnQgcmM7Ci0JCXN0cnVjdCBsc21fY21kX3JlYWRfZG9uZSAqcmVhZF9kb25lID0gcGF5bG9hZDsKLQkJaW50IGJ1Zl9pbmRleCA9IDA7Ci0KLQkJaWYgKHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24gIT0gdG9rZW4gfHwKLQkJICAgICFyZWFkX2RvbmUpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBFVkVOVF9SRUFEX0RPTkUgaW52YWxpZCBjYWxsYmFjaywgc2Vzc2lvbiAlZCBjYWxsYmFjayAlZCBwYXlsb2FkICVwSyIsCi0JCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sCi0JCQkJdG9rZW4sIHJlYWRfZG9uZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5yZWFkX2Fib3J0KSkgewotCQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCQkiJXM6IHJlYWQgYWJvcnQgc2V0IHNraXAgZGF0YVxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghbHNtX2xhYl9idWZmZXJfc2FuaXR5KHBydGQsIHJlYWRfZG9uZSwgJmJ1Zl9pbmRleCkpIHsKLQkJCWRldl9kYmcocnRkLT5kZXYsCi0JCQkJIiVzOiBwcm9jZXNzIHJlYWQgZG9uZSBpbmRleCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYnVmX2luZGV4KTsKLQkJCWlmIChidWZfaW5kZXggPj0KLQkJCQlwcnRkLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50KSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBJbnZhbGlkIGluZGV4ICVkIGJ1Zl9pbmRleCBtYXggY250ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYnVmX2luZGV4LAotCQkJCXBydGQtPmxzbV9jbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXBydGQtPmRtYV93cml0ZSArPSByZWFkX2RvbmUtPnRvdGFsX3NpemU7Ci0JCQlhdG9taWNfaW5jKCZwcnRkLT5idWZfY291bnQpOwotCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCQkJd2FrZV91cCgmcHJ0ZC0+cGVyaW9kX3dhaXQpOwotCQkJLyogcXVldWUgdGhlIG5leHQgcGVyaW9kIGJ1ZmZlciAqLwotCQkJYnVmX2luZGV4ID0gKGJ1Zl9pbmRleCArIDEpICUKLQkJCXBydGQtPmxzbV9jbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQ7Ci0JCQlyYyA9IG1zbV9sc21fcXVldWVfbGFiX2J1ZmZlcihwcnRkLCBidWZfaW5kZXgpOwotCQkJaWYgKHJjKQotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogZXJyb3IgaW4gcXVldWluZyB0aGUgbGFiIGJ1ZmZlciByYyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJfSBlbHNlCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IEludmFsaWQgbGFiIGJ1ZmZlciByZXR1cm5lZCBieSBkc3BcbiIsCi0JCQkJX19mdW5jX18pOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIExTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVM6Ci0JCXN0YXR1cyA9ICh1aW50MTZfdCkoKHVpbnQ4X3QgKilwYXlsb2FkKVswXTsKLQkJcGF5bG9hZF9zaXplID0gKHVpbnQxNl90KSgodWludDhfdCAqKXBheWxvYWQpWzJdOwotCQlpbmRleCA9IDQ7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IGV2ZW50IGRldGVjdCBzdGF0dXMgPSAlZCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzdGF0dXMsIHBheWxvYWRfc2l6ZSk7Ci0JYnJlYWs7Ci0KLQljYXNlIExTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjI6Ci0JCXN0YXR1cyA9ICh1aW50MTZfdCkoKHVpbnQ4X3QgKilwYXlsb2FkKVswXTsKLQkJcGF5bG9hZF9zaXplID0gKHVpbnQxNl90KSgodWludDhfdCAqKXBheWxvYWQpWzFdOwotCQlpbmRleCA9IDI7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IGV2ZW50IGRldGVjdCBzdGF0dXMgPSAlZCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzdGF0dXMsIHBheWxvYWRfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBMU01fU0VTU0lPTl9FVkVOVF9ERVRFQ1RJT05fU1RBVFVTX1YzOgotCQlldmVudF90c19sc3cgPSAoKHVpbnQzMl90ICopcGF5bG9hZClbMF07Ci0JCWV2ZW50X3RzX21zdyA9ICgodWludDMyX3QgKilwYXlsb2FkKVsxXTsKLQkJc3RhdHVzID0gKHVpbnQxNl90KSgodWludDhfdCAqKXBheWxvYWQpWzhdOwotCQlwYXlsb2FkX3NpemUgPSAodWludDE2X3QpKCh1aW50OF90ICopcGF5bG9hZClbOV07Ci0JCWluZGV4ID0gMTA7Ci0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IHRzX21zdyA9ICV1LCB0c19sc3cgPSAldSwgZXZlbnQgZGV0ZWN0IHN0YXR1cyA9ICVkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGV2ZW50X3RzX21zdywgZXZlbnRfdHNfbHN3LCBzdGF0dXMsCi0JCQlwYXlsb2FkX3NpemUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChvcGNvZGUgPT0gTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVUyB8fAotCQlvcGNvZGUgPT0gTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMiB8fAotCQlvcGNvZGUgPT0gTFNNX1NFU1NJT05fRVZFTlRfREVURUNUSU9OX1NUQVRVU19WMykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCQl0ZW1wID0ga3JlYWxsb2MocHJ0ZC0+ZXZlbnRfc3RhdHVzLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjMpICsKLQkJCQlwYXlsb2FkX3NpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoIXRlbXApIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICIlczogbm8gbWVtb3J5IGZvciBldmVudCBzdGF0dXNcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qCi0JCSAqIGV2ZW50IHN0YXR1cyB0aW1lc3RhbXAgd2lsbCBiZSBub24temVybyBhbmQgdmFsaWQgaWYKLQkJICogb3Bjb2RlIGlzIExTTV9TRVNTSU9OX0VWRU5UX0RFVEVDVElPTl9TVEFUVVNfVjMKLQkJICovCi0JCXBydGQtPmV2ZW50X3N0YXR1cyA9IHRlbXA7Ci0JCXBydGQtPmV2ZW50X3N0YXR1cy0+dGltZXN0YW1wX2xzdyA9IGV2ZW50X3RzX2xzdzsKLQkJcHJ0ZC0+ZXZlbnRfc3RhdHVzLT50aW1lc3RhbXBfbXN3ID0gZXZlbnRfdHNfbXN3OwotCQlwcnRkLT5ldmVudF9zdGF0dXMtPnN0YXR1cyA9IHN0YXR1czsKLQkJcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemU7Ci0KLQkJaWYgKGxpa2VseShwcnRkLT5ldmVudF9zdGF0dXMpKSB7Ci0JCQltZW1jcHkocHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkLAotCQkJICAgICAgICYoKHVpbnQ4X3QgKilwYXlsb2FkKVtpbmRleF0sCi0JCQkgICAgICAgcGF5bG9hZF9zaXplKTsKLQkJCXBydGQtPmV2ZW50X2F2YWlsID0gMTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQkJCXdha2VfdXAoJnBydGQtPmV2ZW50X3dhaXQpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IENvdWxkbid0IGFsbG9jYXRlICVkIGJ5dGVzIG9mIG1lbW9yeVxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZF9zaXplKTsKLQkJfQotCQlpZiAoc3Vic3RyZWFtLT50aW1lcl9ydW5uaW5nKQotCQkJc25kX3RpbWVyX2ludGVycnVwdChzdWJzdHJlYW0tPnRpbWVyLCAxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9sYWJfYnVmZmVyX2FsbG9jKHN0cnVjdCBsc21fcHJpdiAqbHNtLCBpbnQgYWxsb2MpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmID0gTlVMTDsKLQotCWlmICghbHNtKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW0gbHNtICVwS1xuIiwgX19mdW5jX18sIGxzbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWxsb2MpIHsKLQkJaWYgKCFsc20tPnN1YnN0cmVhbSkgewotCQkJcHJfZXJyKCIlczogc3Vic3RyZWFtIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXJldCA9IHE2bHNtX2xhYl9idWZmZXJfYWxsb2MobHNtLT5sc21fY2xpZW50LCBhbGxvYyk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGFsbG9jIGxhYiBidWZmZXIgZmFpbGVkIHJldCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlkbWFfYnVmID0gJmxzbS0+c3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCQlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQkJZG1hX2J1Zi0+ZGV2LmRldiA9IGxzbS0+c3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKLQkJZG1hX2J1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQkJZG1hX2J1Zi0+YXJlYSA9IGxzbS0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlclswXS5kYXRhOwotCQlkbWFfYnVmLT5hZGRyID0gbHNtLT5sc21fY2xpZW50LT5sYWJfYnVmZmVyWzBdLnBoeXM7Ci0JCWRtYV9idWYtPmJ5dGVzID0gbHNtLT5sc21fY2xpZW50LT5od19wYXJhbXMuYnVmX3N6ICoKLQkJbHNtLT5sc21fY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50OwotCQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihsc20tPnN1YnN0cmVhbSwgZG1hX2J1Zik7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcTZsc21fbGFiX2J1ZmZlcl9hbGxvYyhsc20tPmxzbV9jbGllbnQsIGFsbG9jKTsKLQkJaWYgKHJldCkKLQkJCXByX2VycigiJXM6IGZyZWUgbGFiIGJ1ZmZlciBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQlrZnJlZShsc20tPmxzbV9jbGllbnQtPmxhYl9idWZmZXIpOwotCQlsc20tPmxzbV9jbGllbnQtPmxhYl9idWZmZXIgPSBOVUxMOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2dldF9jb25mX2xldmVscyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIHU4ICpjb25mX2xldmVsc19wdHIpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmIChjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogbm8gY29uZmlkZW5jZSBsZXZlbHMgcHJvdmlkZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWNsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMgPSBOVUxMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY2xpZW50LT5jb25maWRlbmNlX2xldmVscyA9Ci0JCWt6YWxsb2MoKHNpemVvZih1aW50OF90KSAqIGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKSwKLQkJCSBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMpIHsKLQkJcHJfZXJyKCIlczogTm8gbWVtb3J5IGZvciBjb25maWRlbmNlXG4iCi0JCQkibGV2ZWxzIG51bSBvZiBsZXZlbCBmcm9tIHVzZXIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGNsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMsCi0JCQkgICBjb25mX2xldmVsc19wdHIsCi0JCQkgICBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscykpIHsKLQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkLCBzaXplID0gJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMpOwotCQlyYyA9IC1FRkFVTFQ7Ci0JCWdvdG8gY29weV9lcnI7Ci0JfQotCi0JcmV0dXJuIHJjOwotCi1jb3B5X2VycjoKLQlrZnJlZShjbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzKTsKLQljbGllbnQtPmNvbmZpZGVuY2VfbGV2ZWxzID0gTlVMTDsKLWRvbmU6Ci0JcmV0dXJuIHJjOwotCi19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9zZXRfZXBkKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9sc21fZXBfZGV0X3RocmVzIGVwZF90aDsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGVwZF90aCkpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZXBkX3RoLCBwX2luZm8tPnBhcmFtX2RhdGEsCi0JCQkgICBwX2luZm8tPnBhcmFtX3NpemUpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gcTZsc21fc2V0X29uZV9wYXJhbShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sCi0JCQkJICZlcGRfdGgsIExTTV9FTkRQT0lOVF9ERVRFQ1RfVEhSRVNIT0xEKTsKLQlpZiAocmMpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzZXQgZXBkIHBhcmFtLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX3NldF9tb2RlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfbHNtX2RldGVjdF9tb2RlIG1vZGU7Ci0JaW50IHJjID0gMDsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKG1vZGUpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcGFyYW1fc2l6ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIHBfaW5mby0+cGFyYW1fZGF0YSwKLQkJCSAgIHNpemVvZihtb2RlKSkpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJX19mdW5jX18sIHNpemVvZihtb2RlKSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gcTZsc21fc2V0X29uZV9wYXJhbShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sCi0JCQkJICZtb2RlLCBMU01fT1BFUkFUSU9OX01PREUpOwotCWlmIChyYykKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogRmFpbGVkIHRvIHNldCBkZXRfbW9kZSBwYXJhbSwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9zZXRfZ2FpbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX2xzbV9nYWluIGdhaW47Ci0JaW50IHJjID0gMDsKLQotCWlmIChwX2luZm8tPnBhcmFtX3NpemUgIT0gc2l6ZW9mKGdhaW4pKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcGFyYW1fc2l6ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3NpemUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmdhaW4sIHBfaW5mby0+cGFyYW1fZGF0YSwKLQkJCSAgIHNpemVvZihnYWluKSkpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJX19mdW5jX18sIHNpemVvZihnYWluKSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gcTZsc21fc2V0X29uZV9wYXJhbShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sCi0JCQkJICZnYWluLCBMU01fR0FJTik7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGRldF9tb2RlIHBhcmFtLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX3NldF9jb25mKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlpZiAocF9pbmZvLT5wYXJhbV9zaXplID4gTUFYX05VTV9DT05GSURFTkNFKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGludmFsaWQgY29uZmlkZW5jZSBsZXZlbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJ0ZC0+bHNtX2NsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzID0KLQkJCXBfaW5mby0+cGFyYW1fc2l6ZTsKLQlyYyA9IG1zbV9sc21fZ2V0X2NvbmZfbGV2ZWxzKHBydGQtPmxzbV9jbGllbnQsCi0JCQkJICAgICBwX2luZm8tPnBhcmFtX2RhdGEpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBnZXRfY29uZl9sZXZlbHMgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAotCQkJCSBwcnRkLT5sc21fY2xpZW50LT5jb25maWRlbmNlX2xldmVscywKLQkJCQkgTFNNX01JTl9DT05GSURFTkNFX0xFVkVMUyk7Ci0JaWYgKHJjKQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gc2V0IG1pbl9jb25mX2xldmVscywgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9sc21fcmVnX21vZGVsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0JdTggKnNuZF9tb2RlbF9wdHI7Ci0Jc2l6ZV90IG9mZnNldDsKLQotCXJjID0gcTZsc21fc25kX21vZGVsX2J1Zl9hbGxvYyhwcnRkLT5sc21fY2xpZW50LAotCQkJCSAgICAgICBwX2luZm8tPnBhcmFtX3NpemUsCi0JCQkJICAgICAgIHRydWUpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBzbmRfbW9kZWwgYnVmIGFsbG9jIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlxNmxzbV9zbV9zZXRfcGFyYW1fZGF0YShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sICZvZmZzZXQpOwotCi0JLyoKLQkgKiBGb3Igc2V0X3BhcmFtLCBhZHZhbmNlIHRoZSBzb3VuZCBtb2RlbCBkYXRhIHdpdGggdGhlCi0JICogbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGJ5IHBhcmFtX2RhdGEuCi0JICovCi0Jc25kX21vZGVsX3B0ciA9ICgodTggKikgcHJ0ZC0+bHNtX2NsaWVudC0+c291bmRfbW9kZWwuZGF0YSkgKyBvZmZzZXQ7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoc25kX21vZGVsX3B0ciwKLQkJCSAgIHBfaW5mby0+cGFyYW1fZGF0YSwgcF9pbmZvLT5wYXJhbV9zaXplKSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBjb3B5X2Zyb21fdXNlciBmb3Igc25kX21vZGVsIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlcnJfY29weTsKLQl9Ci0JcmMgPSBxNmxzbV9zZXRfb25lX3BhcmFtKHBydGQtPmxzbV9jbGllbnQsIHBfaW5mbywgTlVMTCwKLQkJCQkgTFNNX1JFR19TTkRfTU9ERUwpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBGYWlsZWQgdG8gc2V0IHNvdW5kX21vZGVsLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX2NvcHk7Ci0JfQotCXJldHVybiByYzsKLQotZXJyX2NvcHk6Ci0JcTZsc21fc25kX21vZGVsX2J1Zl9mcmVlKHBydGQtPmxzbV9jbGllbnQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2RlcmVnX21vZGVsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCByYyA9IDA7Ci0KLQlyYyA9IHE2bHNtX3NldF9vbmVfcGFyYW0ocHJ0ZC0+bHNtX2NsaWVudCwgcF9pbmZvLAotCQkJCSBOVUxMLCBMU01fREVSRUdfU05EX01PREVMKTsKLQlpZiAocmMpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzZXQgZGV0X21vZGUgcGFyYW0sIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQotCXE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShwcnRkLT5sc21fY2xpZW50KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX3NldF9jdXN0b20oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JdTggKmRhdGE7Ci0JaW50IHJjID0gMDsKLQotCWRhdGEgPSBremFsbG9jKHBfaW5mby0+cGFyYW1fc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBwX2luZm8tPnBhcmFtX2RhdGEsCi0JCQkgICBwX2luZm8tPnBhcmFtX3NpemUpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCBmb3IgY3VzdG9tIHBhcmFtcywgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCXJjID0gcTZsc21fc2V0X29uZV9wYXJhbShwcnRkLT5sc21fY2xpZW50LCBwX2luZm8sCi0JCQkJIGRhdGEsIExTTV9DVVNUT01fUEFSQU1TKTsKLQlpZiAocmMpCi0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzZXQgY3VzdG9tIHBhcmFtLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLWVycl9yZXQ6Ci0Ja2ZyZWUoZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9sc21fc2V0X3BvbGxfZW5hYmxlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICpwX2luZm8pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfbHNtX3BvbGxfZW5hYmxlIHBvbGxfZW5hYmxlOwotCWludCByYyA9IDA7Ci0KLQlpZiAocF9pbmZvLT5wYXJhbV9zaXplICE9IHNpemVvZihwb2xsX2VuYWJsZSkpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogSW52YWxpZCBwYXJhbV9zaXplICVkXG4iLAotCQkJX19mdW5jX18sIHBfaW5mby0+cGFyYW1fc2l6ZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmcG9sbF9lbmFibGUsIHBfaW5mby0+cGFyYW1fZGF0YSwKLQkJCSAgIHNpemVvZihwb2xsX2VuYWJsZSkpKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBzaXplb2YocG9sbF9lbmFibGUpKTsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHBydGQtPmxzbV9jbGllbnQtPnBvbGxfZW5hYmxlID09IHBvbGxfZW5hYmxlLnBvbGxfZW4pIHsKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogUG9sbGluZyBmb3Igc2Vzc2lvbiAlZCBhbHJlYWR5ICVzXG4iLAotCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sCi0JCQkocG9sbF9lbmFibGUucG9sbF9lbiA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLQkJcmMgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBxNmxzbV9zZXRfb25lX3BhcmFtKHBydGQtPmxzbV9jbGllbnQsIHBfaW5mbywKLQkJCQkgJnBvbGxfZW5hYmxlLCBMU01fUE9MTElOR19FTkFCTEUpOwotCWlmICghcmMpIHsKLQkJcHJ0ZC0+bHNtX2NsaWVudC0+cG9sbF9lbmFibGUgPSBwb2xsX2VuYWJsZS5wb2xsX2VuOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBzZXQgcG9sbCBlbmFibGUsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQl9Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX3Byb2Nlc3NfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zICpwX2RhdGEsCi0JCXZvaWQgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvOwotCWludCBpOwotCWludCByYyA9IDA7Ci0KLQlwX2luZm8gPSAoc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqKSBwYXJhbXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcF9kYXRhLT5udW1fcGFyYW1zOyBpKyspIHsKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogcGFyYW0gKCVkKSwgbW9kdWxlX2lkID0gMHgleCwgcGFyYW1faWQgPSAweCV4LCBwYXJhbV9zaXplID0gMHgleCwgcGFyYW1fdHlwZSA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgaSwgcF9pbmZvLT5tb2R1bGVfaWQsCi0JCQlwX2luZm8tPnBhcmFtX2lkLCBwX2luZm8tPnBhcmFtX3NpemUsCi0JCQlwX2luZm8tPnBhcmFtX3R5cGUpOwotCi0JCXN3aXRjaCAocF9pbmZvLT5wYXJhbV90eXBlKSB7Ci0JCWNhc2UgTFNNX0VORFBPSU5UX0RFVEVDVF9USFJFU0hPTEQ6Ci0JCQlyYyA9IG1zbV9sc21fc2V0X2VwZChzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fT1BFUkFUSU9OX01PREU6Ci0JCQlyYyA9IG1zbV9sc21fc2V0X21vZGUoc3Vic3RyZWFtLCBwX2luZm8pOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNNX0dBSU46Ci0JCQlyYyA9IG1zbV9sc21fc2V0X2dhaW4oc3Vic3RyZWFtLCBwX2luZm8pOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNNX01JTl9DT05GSURFTkNFX0xFVkVMUzoKLQkJCXJjID0gbXNtX2xzbV9zZXRfY29uZihzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fUkVHX1NORF9NT0RFTDoKLQkJCXJjID0gbXNtX2xzbV9yZWdfbW9kZWwoc3Vic3RyZWFtLCBwX2luZm8pOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNNX0RFUkVHX1NORF9NT0RFTDoKLQkJCXJjID0gbXNtX2xzbV9kZXJlZ19tb2RlbChzdWJzdHJlYW0sIHBfaW5mbyk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fQ1VTVE9NX1BBUkFNUzoKLQkJCXJjID0gbXNtX2xzbV9zZXRfY3VzdG9tKHN1YnN0cmVhbSwgcF9pbmZvKTsKLQkJCWJyZWFrOwotCQljYXNlIExTTV9QT0xMSU5HX0VOQUJMRToKLQkJCXJjID0gbXNtX2xzbV9zZXRfcG9sbF9lbmFibGUoc3Vic3RyZWFtLCBwX2luZm8pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogSW52YWxpZCBwYXJhbV90eXBlICVkXG4iLAotCQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3R5cGUpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXRfcGFyYW0gZmFpbCBmb3IgcGFyYW1fdHlwZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV90eXBlKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCXBfaW5mbysrOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2lvY3RsX3NoYXJlZChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0Jc3RydWN0IHNuZF9sc21fc291bmRfbW9kZWxfdjIgc25kX21vZGVsX3YyOwotCXN0cnVjdCBzbmRfbHNtX3Nlc3Npb25fZGF0YSBzZXNzaW9uX2RhdGE7Ci0JaW50IHJjID0gMDsKLQlpbnQgeGNoZyA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQ7Ci0Jc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyBkZXRfcGFyYW1zOwotCXVpbnQ4X3QgKmNvbmZpZGVuY2VfbGV2ZWwgPSBOVUxMOwotCi0JaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAotCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9MU01fU0VUX1NFU1NJT05fREFUQToKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBzZXQgc2Vzc2lvbiBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmc2Vzc2lvbl9kYXRhLCBhcmcsCi0JCQkJICAgc2l6ZW9mKHNlc3Npb25fZGF0YSkpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sICJMU01fU0VUX1NFU1NJT05fREFUQSIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAoc2Vzc2lvbl9kYXRhLmFwcF9pZCAhPSBMU01fVk9JQ0VfV0FLRVVQX0FQUF9JRF9WMikgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6SW52YWxpZCBBcHAgaWQgJWQgZm9yIExpc3RlbiBjbGllbnRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHNlc3Npb25fZGF0YS5hcHBfaWQpOwotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcnRkLT5sc21fY2xpZW50LT5hcHBfaWQgPSBzZXNzaW9uX2RhdGEuYXBwX2lkOwotCQlyZXQgPSBxNmxzbV9vcGVuKHBydGQtPmxzbV9jbGllbnQsCi0JCQkJIHBydGQtPmxzbV9jbGllbnQtPmFwcF9pZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogbHNtIG9wZW4gZmFpbGVkLCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcHJ0ZC0+bHNtX2NsaWVudC0+b3BlbmVkID0gdHJ1ZTsKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBTZXNzaW9uX0lEID0gJWQsIEFQUCBJRCA9ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlwcnRkLT5sc21fY2xpZW50LT5zZXNzaW9uLAotCQkJcHJ0ZC0+bHNtX2NsaWVudC0+YXBwX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMjoKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBSZWdpc3RlcmluZyBzb3VuZCBtb2RlbCBWMlxuIiwKLQkJCV9fZnVuY19fKTsKLQkJbWVtY3B5KCZzbmRfbW9kZWxfdjIsIGFyZywKLQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikpOwotCQlpZiAoc25kX21vZGVsX3YyLm51bV9jb25maWRlbmNlX2xldmVscyA+Ci0JCSAgICBNQVhfTlVNX0NPTkZJREVOQ0UpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBJbnZhbGlkIGNvbmZfbGV2ZWxzID0gJWQsIG1heGltdW0gYWxsb3dlZCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBzbmRfbW9kZWxfdjIubnVtX2NvbmZpZGVuY2VfbGV2ZWxzLAotCQkJCU1BWF9OVU1fQ09ORklERU5DRSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyYyA9IHE2bHNtX3NuZF9tb2RlbF9idWZfYWxsb2MocHJ0ZC0+bHNtX2NsaWVudCwKLQkJCQkJICAgICAgIHNuZF9tb2RlbF92Mi5kYXRhX3NpemUsIGZhbHNlKTsKLQkJaWYgKHJjKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogcTZsc20gYnVmZmVyIGFsbG9jIGZhaWxlZCBWMiwgc2l6ZSAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc25kX21vZGVsX3YyLmRhdGFfc2l6ZSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIocHJ0ZC0+bHNtX2NsaWVudC0+c291bmRfbW9kZWwuZGF0YSwKLQkJCSAgIHNuZF9tb2RlbF92Mi5kYXRhLCBzbmRfbW9kZWxfdjIuZGF0YV9zaXplKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGNvcHkgZnJvbSB1c2VyIGRhdGEgZmFpbGVkXG4iCi0JCQkgICAgICAgImRhdGEgJXBLIHNpemUgJWRcbiIsIF9fZnVuY19fLAotCQkJICAgICAgIHNuZF9tb2RlbF92Mi5kYXRhLCBzbmRfbW9kZWxfdjIuZGF0YV9zaXplKTsKLQkJCXE2bHNtX3NuZF9tb2RlbF9idWZfZnJlZShwcnRkLT5sc21fY2xpZW50KTsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwgIlNORCBNb2RlbCBNYWdpYyBubyBieXRlWzBdICV4LFxuIgotCQkJICJieXRlWzFdICV4LCBieXRlWzJdICV4IGJ5dGVbM10gJXhcbiIsCi0JCQkgc25kX21vZGVsX3YyLmRhdGFbMF0sIHNuZF9tb2RlbF92Mi5kYXRhWzFdLAotCQkJIHNuZF9tb2RlbF92Mi5kYXRhWzJdLCBzbmRfbW9kZWxfdjIuZGF0YVszXSk7Ci0JCXBydGQtPmxzbV9jbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyA9Ci0JCQlzbmRfbW9kZWxfdjIubnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCi0JCXJjID0gbXNtX2xzbV9nZXRfY29uZl9sZXZlbHMocHJ0ZC0+bHNtX2NsaWVudCwKLQkJCQlzbmRfbW9kZWxfdjIuY29uZmlkZW5jZV9sZXZlbCk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGdldF9jb25mX2xldmVscyBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJjID0gcTZsc21fcmVnaXN0ZXJfc291bmRfbW9kZWwocHJ0ZC0+bHNtX2NsaWVudCwKLQkJCQkJc25kX21vZGVsX3YyLmRldGVjdGlvbl9tb2RlLAotCQkJCQlzbmRfbW9kZWxfdjIuZGV0ZWN0X2ZhaWx1cmUpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogUmVnaXN0ZXIgc25kIE1vZGVsIHYyIGZhaWxlZCA9JWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQkJCWtmcmVlKGNvbmZpZGVuY2VfbGV2ZWwpOwotCQkJcTZsc21fc25kX21vZGVsX2J1Zl9mcmVlKHBydGQtPmxzbV9jbGllbnQpOwotCQl9Ci0KLQkJa2ZyZWUocHJ0ZC0+bHNtX2NsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMpOwotCQlwcnRkLT5sc21fY2xpZW50LT5jb25maWRlbmNlX2xldmVscyA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fU0VUX1BBUkFNUzoKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBzZXRfcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCW1lbWNweSgmZGV0X3BhcmFtcywgYXJnLAotCQkJc2l6ZW9mKGRldF9wYXJhbXMpKTsKLQkJaWYgKGRldF9wYXJhbXMubnVtX2NvbmZpZGVuY2VfbGV2ZWxzID4KLQkJICAgIE1BWF9OVU1fQ09ORklERU5DRSkgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcnRkLT5sc21fY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQotCQkJZGV0X3BhcmFtcy5udW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0KLQkJcmMgPSBtc21fbHNtX2dldF9jb25mX2xldmVscyhwcnRkLT5sc21fY2xpZW50LAotCQkJCWRldF9wYXJhbXMuY29uZl9sZXZlbCk7Ci0JCWlmIChyYykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBnZXQgY29uZl9sZXZlbHMsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJjID0gcTZsc21fc2V0X2RhdGEocHJ0ZC0+bHNtX2NsaWVudCwKLQkJCSAgICAgICBkZXRfcGFyYW1zLmRldGVjdF9tb2RlLAotCQkJICAgICAgIGRldF9wYXJhbXMuZGV0ZWN0X2ZhaWx1cmUpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHNldCBwYXJhbXMsIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0KLQkJa2ZyZWUocHJ0ZC0+bHNtX2NsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMpOwotCQlwcnRkLT5sc21fY2xpZW50LT5jb25maWRlbmNlX2xldmVscyA9IE5VTEw7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORFJWX0xTTV9ERVJFR19TTkRfTU9ERUw6Ci0JCWRldl9kYmcocnRkLT5kZXYsICIlczogRGVyZWdpc3RlcmluZyBzb3VuZCBtb2RlbFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSBxNmxzbV9kZXJlZ2lzdGVyX3NvdW5kX21vZGVsKHBydGQtPmxzbV9jbGllbnQpOwotCQlpZiAocmMpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogU291bmQgbW9kZWwgZGUtcmVnaXN0ZXIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVUzoKLQljYXNlIFNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjM6IHsKLQkJdWludDMyX3QgdHNfbHN3LCB0c19tc3c7Ci0JCXVpbnQxNl90IHN0YXR1cyA9IDAsIHBheWxvYWRfc2l6ZSA9IDA7Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBHZXQgZXZlbnQgc3RhdHVzXG4iLCBfX2Z1bmNfXyk7Ci0JCWF0b21pY19zZXQoJnBydGQtPmV2ZW50X3dhaXRfc3RvcCwgMCk7Ci0KLQkJLyoKLQkJICogUmVsZWFzZSB0aGUgYXBpIGxvY2sgYmVmb3JlIHdhaXQgdG8gYWxsb3cKLQkJICogb3RoZXIgSU9DVExzIHRvIGJlIGludm9rZWQgd2hpbGUgd2FpdGluZwotCQkgKiBmb3IgZXZlbnQKLQkJICovCi0JCW11dGV4X3VubG9jaygmcHJ0ZC0+bHNtX2FwaV9sb2NrKTsKLQkJcmMgPSB3YWl0X2V2ZW50X2ZyZWV6YWJsZShwcnRkLT5ldmVudF93YWl0LAotCQkJCShjbXB4Y2hnKCZwcnRkLT5ldmVudF9hdmFpbCwgMSwgMCkgfHwKLQkJCQkgKHhjaGcgPSBhdG9taWNfY21weGNoZygmcHJ0ZC0+ZXZlbnRfd2FpdF9zdG9wLAotCQkJCQkJCTEsIDApKSkpOwotCQltdXRleF9sb2NrKCZwcnRkLT5sc21fYXBpX2xvY2spOwotCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHdhaXRfZXZlbnRfZnJlZXphYmxlICVkIGV2ZW50X3dhaXRfc3RvcCAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcmMsIHhjaGcpOwotCQlpZiAoIXJjICYmICF4Y2hnKSB7Ci0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IE5ldyBldmVudCBhdmFpbGFibGUgJWxkXG4iLAotCQkJCV9fZnVuY19fLCBwcnRkLT5ldmVudF9hdmFpbCk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JCQlpZiAocHJ0ZC0+ZXZlbnRfc3RhdHVzKSB7Ci0JCQkJcGF5bG9hZF9zaXplID0gcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5wYXlsb2FkX3NpemU7Ci0JCQkJdHNfbHN3ID0gcHJ0ZC0+ZXZlbnRfc3RhdHVzLT50aW1lc3RhbXBfbHN3OwotCQkJCXRzX21zdyA9IHBydGQtPmV2ZW50X3N0YXR1cy0+dGltZXN0YW1wX21zdzsKLQkJCQlzdGF0dXMgPSBwcnRkLT5ldmVudF9zdGF0dXMtPnN0YXR1czsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5ldmVudF9sb2NrLAotCQkJCQkJICAgICAgIGZsYWdzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZXZlbnRfbG9jaywKLQkJCQkJCSAgICAgICBmbGFncyk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogcHJ0ZC0+ZXZlbnRfc3RhdHVzIGlzIE5VTExcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNtZCA9PSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTKSB7Ci0JCQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICp1c2VyID0gYXJnOwotCi0JCQkJaWYgKHVzZXItPnBheWxvYWRfc2l6ZSA8IHBheWxvYWRfc2l6ZSkgewotCQkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCQkJIiVzOiBwcm92aWRlZCAlZCBieXRlcyBpc24ndCBlbm91Z2gsIG5lZWRzICVkIGJ5dGVzXG4iLAotCQkJCQkJX19mdW5jX18sIHVzZXItPnBheWxvYWRfc2l6ZSwKLQkJCQkJCXBheWxvYWRfc2l6ZSk7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2VyLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJCXVzZXItPnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKLQkJCQkJbWVtY3B5KHVzZXItPnBheWxvYWQsCi0JCQkJCQlwcnRkLT5ldmVudF9zdGF0dXMtPnBheWxvYWQsCi0JCQkJCQlwYXlsb2FkX3NpemUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICp1c2VyX3YzID0gYXJnOwotCi0JCQkJaWYgKHVzZXJfdjMtPnBheWxvYWRfc2l6ZSA8IHBheWxvYWRfc2l6ZSkgewotCQkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCQkJIiVzOiBwcm92aWRlZCAlZCBieXRlcyBpc24ndCBlbm91Z2gsIG5lZWRzICVkIGJ5dGVzXG4iLAotCQkJCQkJX19mdW5jX18sIHVzZXJfdjMtPnBheWxvYWRfc2l6ZSwKLQkJCQkJCXBheWxvYWRfc2l6ZSk7Ci0JCQkJCXJjID0gLUVOT01FTTsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2VyX3YzLT50aW1lc3RhbXBfbHN3ID0gdHNfbHN3OwotCQkJCQl1c2VyX3YzLT50aW1lc3RhbXBfbXN3ID0gdHNfbXN3OwotCQkJCQl1c2VyX3YzLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJCXVzZXJfdjMtPnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKLQkJCQkJbWVtY3B5KHVzZXJfdjMtPnBheWxvYWQsCi0JCQkJCQlwcnRkLT5ldmVudF9zdGF0dXMtPnBheWxvYWQsCi0JCQkJCQlwYXlsb2FkX3NpemUpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghcmMpIHsKLQkJCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZQotCQkJCQkmJiAhcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX3N0YXJ0ZWQKLQkJCQkJJiYgcHJ0ZC0+ZXZlbnRfc3RhdHVzLT5zdGF0dXMgPT0KLQkJCQkJTFNNX1ZPSUNFX1dBS0VVUF9TVEFUVVNfREVURUNURUQpIHsKLQkJCQkJYXRvbWljX3NldCgmcHJ0ZC0+cmVhZF9hYm9ydCwgMCk7Ci0JCQkJCWF0b21pY19zZXQoJnBydGQtPmJ1Zl9jb3VudCwgMCk7Ci0JCQkJCXBydGQtPmFwcGxfY250ID0gMDsKLQkJCQkJcHJ0ZC0+ZG1hX3dyaXRlID0gMDsKLQkJCQkJcmMgPSBtc21fbHNtX3F1ZXVlX2xhYl9idWZmZXIocHJ0ZCwKLQkJCQkJCTApOwotCQkJCQlpZiAocmMpCi0JCQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkJCSIlczogUXVldWUgYnVmZmVyIGZhaWxlZCBmb3IgbGFiIHJjID0gJWRcbiIsCi0JCQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCQkJZWxzZQotCQkJCQkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX3N0YXJ0ZWQKLQkJCQkJCT0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoeGNoZykgewotCQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBXYWl0IGFib3J0ZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORFJWX0xTTV9BQk9SVF9FVkVOVDoKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBBYm9ydGluZyBldmVudCBzdGF0dXMgd2FpdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJYXRvbWljX3NldCgmcHJ0ZC0+ZXZlbnRfd2FpdF9zdG9wLCAxKTsKLQkJd2FrZV91cCgmcHJ0ZC0+ZXZlbnRfd2FpdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fU1RBUlQ6Ci0JCWRldl9kYmcocnRkLT5kZXYsICIlczogU3RhcnRpbmcgTFNNIGNsaWVudCBzZXNzaW9uXG4iLAotCQkJX19mdW5jX18pOwotCQlpZiAoIXBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQpIHsKLQkJCXJldCA9IHE2bHNtX3N0YXJ0KHBydGQtPmxzbV9jbGllbnQsIHRydWUpOwotCQkJaWYgKCFyZXQpIHsKLQkJCQlwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkID0gdHJ1ZTsKLQkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IExTTSBjbGllbnQgc2Vzc2lvbiBzdGFydGVkXG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9MU01fU1RPUDogewotCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJIiVzOiBTdG9wcGluZyBMU00gY2xpZW50IHNlc3Npb25cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWlmIChwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkKSB7Ci0JCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZSkgewotCQkJCWF0b21pY19zZXQoJnBydGQtPnJlYWRfYWJvcnQsIDEpOwotCQkJCWlmIChwcnRkLT5sc21fY2xpZW50LT5sYWJfc3RhcnRlZCkgewotCQkJCQlyZXQgPSBxNmxzbV9zdG9wX2xhYihwcnRkLT5sc21fY2xpZW50KTsKLQkJCQkJaWYgKHJldCkKLQkJCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCQkJIiVzOiBzdG9wIGxhYiBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfc3RhcnRlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldCA9IHE2bHNtX3N0b3AocHJ0ZC0+bHNtX2NsaWVudCwgdHJ1ZSk7Ci0JCQlpZiAoIXJldCkKLQkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IExTTSBjbGllbnQgc2Vzc2lvbiBzdG9wcGVkICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXBydGQtPmxzbV9jbGllbnQtPnN0YXJ0ZWQgPSBmYWxzZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBTTkRSVl9MU01fTEFCX0NPTlRST0w6IHsKLQkJdTMyIGVuYWJsZTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVuYWJsZSwgYXJnLCBzaXplb2YoZW5hYmxlKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICIlczogJXM6IGNvcHlfZnJtX3VzZXIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fLCAiTFNNX0xBQl9DT05UUk9MIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWRldl9kYmcocnRkLT5kZXYsICIlczogaW9jdGwgJXMsIGVuYWJsZSA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCAiU05EUlZfTFNNX0xBQl9DT05UUk9MIiwgZW5hYmxlKTsKLQkJaWYgKCFwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkKSB7Ci0JCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZSA9PSBlbmFibGUpIHsKLQkJCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IExhYiBmb3Igc2Vzc2lvbiAlZCBhbHJlYWR5ICVzXG4iLAotCQkJCQlfX2Z1bmNfXywgcHJ0ZC0+bHNtX2NsaWVudC0+c2Vzc2lvbiwKLQkJCQkJZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0JCQkJcmMgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmMgPSBxNmxzbV9sYWJfY29udHJvbChwcnRkLT5sc21fY2xpZW50LCBlbmFibGUpOwotCQkJaWYgKHJjKSB7Ci0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBpb2N0bCAlcyBmYWlsZWQgcmMgJWQgdG8gJXMgbGFiIGZvciBzZXNzaW9uICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgIlNORFJWX0xBQl9DT05UUk9MIiwgcmMsCi0JCQkJCWVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiLAotCQkJCQlwcnRkLT5sc21fY2xpZW50LT5zZXNzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSBtc21fbHNtX2xhYl9idWZmZXJfYWxsb2MocHJ0ZCwKLQkJCQkJZW5hYmxlID8gTEFCX0JVRkZFUl9BTExPQwotCQkJCQk6IExBQl9CVUZGRVJfREVBTExPQyk7Ci0JCQkJaWYgKHJjKQotCQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkJIiVzOiBtc21fbHNtX2xhYl9idWZmZXJfYWxsb2MgZmFpbGVkIHJjICVkIGZvciAlcyIsCi0JCQkJCQlfX2Z1bmNfXywgcmMsCi0JCQkJCQllbmFibGUgPyAiQUxMT0MiIDogIkRFQUxMT0MiKTsKLQkJCQlpZiAoIXJjKQotCQkJCQlwcnRkLT5sc21fY2xpZW50LT5sYWJfZW5hYmxlID0gZW5hYmxlOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBpb2N0bCAlcyBpc3N1ZWQgYWZ0ZXIgc3RhcnQiLAotCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0xBQl9DT05UUk9MIik7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgU05EUlZfTFNNX1NUT1BfTEFCOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHN0b3BwaW5nIExBQlxuIiwgX19mdW5jX18pOwotCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2VuYWJsZSAmJgotCQkJcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX3N0YXJ0ZWQpIHsKLQkJCWF0b21pY19zZXQoJnBydGQtPnJlYWRfYWJvcnQsIDEpOwotCQkJcmMgPSBxNmxzbV9zdG9wX2xhYihwcnRkLT5sc21fY2xpZW50KTsKLQkJCWlmIChyYykKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IExhYiBzdG9wIGZhaWxlZCBmb3Igc2Vzc2lvbiAlZCByYyAlZFxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCXBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sIHJjKTsKLQkJCXBydGQtPmxzbV9jbGllbnQtPmxhYl9zdGFydGVkID0gZmFsc2U7Ci0JCX0KLQlicmVhazsKLQotCWNhc2UgU05EUlZfTFNNX1NFVF9QT1JUOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXM6IHNldCBMU00gcG9ydFxuIiwgX19mdW5jX18pOwotCQlyYyA9IHE2bHNtX3NldF9wb3J0X2Nvbm5lY3RlZChwcnRkLT5sc21fY2xpZW50KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORFJWX0xTTV9TRVRfRldLX01PREVfQ09ORklHOiB7Ci0JCXUzMiBtb2RlOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgYXJnLCBzaXplb2YobW9kZSkpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6ICVzOiBjb3B5X2ZybV91c2VyIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgIkxTTV9TRVRfRldLX01PREVfQ09ORklHIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWRldl9kYmcocnRkLT5kZXYsICIlczogaW9jdGwgJXMsIGVuYWJsZSA9ICVkXG4iLAotCQkJX19mdW5jX18sICJTTkRSVl9MU01fU0VUX0ZXS19NT0RFX0NPTkZJRyIsIG1vZGUpOwotCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+ZXZlbnRfbW9kZSA9PSBtb2RlKSB7Ci0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkJCSIlczogbW9kZSBmb3IgJWQgYWxyZWFkeSBzZXQgdG8gJWRcbiIsCi0JCQkJX19mdW5jX18sIHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sIG1vZGUpOwotCQkJcmMgPSAwOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBFdmVudCBtb2RlID0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBtb2RlKTsKLQkJCXJjID0gcTZsc21fc2V0X2Z3a19tb2RlX2NmZyhwcnRkLT5sc21fY2xpZW50LCBtb2RlKTsKLQkJCWlmICghcmMpCi0JCQkJcHJ0ZC0+bHNtX2NsaWVudC0+ZXZlbnRfbW9kZSA9IG1vZGU7Ci0JCQllbHNlCi0JCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkJIiVzOiBzZXQgZXZlbnQgbW9kZSBmYWlsZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogRmFsbGluZyBpbnRvIGRlZmF1bHQgc25kX2xpYl9pb2N0bCBjbWQgMHgleFxuIiwKLQkJCSBfX2Z1bmNfXywgY21kKTsKLQkJcmMgPSBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFyYykKLQkJZGV2X2RiZyhydGQtPmRldiwgIiVzOiBsZWF2ZSAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQllbHNlCi0JCWRldl9lcnIocnRkLT5kZXYsICIlczogY21kIDB4JXggZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIGNtZCwgcmMpOwotCi0JcmV0dXJuIHJjOwotfQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzMzIgewotCXUxNiBzdGF0dXM7Ci0JdTE2IHBheWxvYWRfc2l6ZTsKLQl1OCBwYXlsb2FkWzBdOwotfTsKLQotc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzXzMyIHsKLQl1MzIgdGltZXN0YW1wX2xzdzsKLQl1MzIgdGltZXN0YW1wX21zdzsKLQl1MTYgc3RhdHVzOwotCXUxNiBwYXlsb2FkX3NpemU7Ci0JdTggcGF5bG9hZFswXTsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX3NvdW5kX21vZGVsX3YyXzMyIHsKLQljb21wYXRfdXB0cl90IGRhdGE7Ci0JY29tcGF0X3VwdHJfdCBjb25maWRlbmNlX2xldmVsOwotCXUzMiBkYXRhX3NpemU7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0aW9uX21vZGU7Ci0JdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Ci19OwotCi1zdHJ1Y3Qgc25kX2xzbV9kZXRlY3Rpb25fcGFyYW1zXzMyIHsKLQljb21wYXRfdXB0cl90IGNvbmZfbGV2ZWw7Ci0JZW51bSBsc21fZGV0ZWN0aW9uX21vZGUgZGV0ZWN0X21vZGU7Ci0JdTggbnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCWJvb2wgZGV0ZWN0X2ZhaWx1cmU7Ci19OwotCi1zdHJ1Y3QgbHNtX3BhcmFtc19pbmZvXzMyIHsKLQl1MzIgbW9kdWxlX2lkOwotCXUzMiBwYXJhbV9pZDsKLQl1MzIgcGFyYW1fc2l6ZTsKLQljb21wYXRfdXB0cl90IHBhcmFtX2RhdGE7Ci0JdWludDMyX3QgcGFyYW1fdHlwZTsKLX07Ci0KLXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXNfMzIgewotCWNvbXBhdF91cHRyX3QgcGFyYW1zOwotCXUzMiBudW1fcGFyYW1zOwotCXUzMiBkYXRhX3NpemU7Ci19OwotCi1lbnVtIHsKLQlTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMiA9Ci0JCV9JT1coJ1UnLCAweDA3LCBzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiksCi0JU05EUlZfTFNNX1NFVF9QQVJBTVNfMzIgPQotCQlfSU9XKCdVJywgMHgwQSwgc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtc18zMiksCi0JU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TXzMyID0KLQkJX0lPVygnVScsIDB4MEIsIHN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXNfMzIpLAotCVNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjNfMzIgPQotCQlfSU9XKCdVJywgMHgwRiwgc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzXzMyKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9pb2N0bF9jb21wYXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQ7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlpbnQgZXJyID0gMDsKLQl1MzIgc2l6ZSA9IDA7Ci0KLQlpZiAoUENNX1JVTlRJTUVfQ0hFQ0soc3Vic3RyZWFtKSkKLQkJcmV0dXJuIC1FTlhJTzsKLQotCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkICVzXG4iLCBfX2Z1bmNfXywKLQkJCSghc3Vic3RyZWFtKSA/ICJzdWJzdHJlYW0iIDogInByaXZhdGVfZGF0YSIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmcHJ0ZC0+bHNtX2FwaV9sb2NrKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cyAqdXNlciA9IE5VTEwsIHVzZXJhcmczMjsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzICp1c2VyMzIgPSBOVUxMOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcmFyZzMyLCBhcmcsIHNpemVvZih1c2VyYXJnMzIpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBlcnIgY29weXVzZXIgaW9jdGwgJXNcbiIsCi0JCQkJX19mdW5jX18sICJTTkRSVl9MU01fRVZFTlRfU1RBVFVTIik7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKHVzZXJhcmczMi5wYXlsb2FkX3NpemUgPgotCQkgICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOiBwYXlsb2FkX3NpemUgJWQgaXMgaW52YWxpZCwgbWF4IGFsbG93ZWQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdXNlcmFyZzMyLnBheWxvYWRfc2l6ZSwKLQkJCQlMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXNpemUgPSBzaXplb2YoKnVzZXIpICsgdXNlcmFyZzMyLnBheWxvYWRfc2l6ZTsKLQkJdXNlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXNlcikgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEFsbG9jYXRpb24gZmFpbGVkIGV2ZW50IHN0YXR1cyBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSBTTkRSVl9MU01fRVZFTlRfU1RBVFVTOwotCQkJdXNlci0+cGF5bG9hZF9zaXplID0gdXNlcmFyZzMyLnBheWxvYWRfc2l6ZTsKLQkJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCB1c2VyKTsKLQkJfQotCi0JCS8qIFVwZGF0ZSBzaXplIHdpdGggYWN0dWFsIHBheWxvYWQgc2l6ZSAqLwotCQlzaXplID0gc2l6ZW9mKHVzZXJhcmczMikgKyB1c2VyLT5wYXlsb2FkX3NpemU7Ci0JCWlmICghZXJyICYmICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogd3JpdGUgdmVyaWZ5IGZhaWxlZCBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKCFlcnIpIHsKLQkJCXVzZXIzMiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXVzZXIzMikgewotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogQWxsb2NhdGlvbiBldmVudCB1c2VyIHN0YXR1cyBzaXplICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgc2l6ZSk7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlcjMyLT5zdGF0dXMgPSB1c2VyLT5zdGF0dXM7Ci0JCQkJdXNlcjMyLT5wYXlsb2FkX3NpemUgPSB1c2VyLT5wYXlsb2FkX3NpemU7Ci0JCQkJbWVtY3B5KHVzZXIzMi0+cGF5bG9hZCwKLQkJCQl1c2VyLT5wYXlsb2FkLCB1c2VyMzItPnBheWxvYWRfc2l6ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFlcnIgJiYgKGNvcHlfdG9fdXNlcihhcmcsIHVzZXIzMiwgc2l6ZSkpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjb3B5IHBheWxvYWQgJWQiLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJa2ZyZWUodXNlcik7Ci0JCWtmcmVlKHVzZXIzMik7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXM6IGxzbWV2ZW50IGZhaWxlZCAlZCIsCi0JCQkJX19mdW5jX18sIGVycik7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVU19WM18zMjogewotCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjNfMzIgdXNlcmFyZzMyLCAqdXNlcjMyID0gTlVMTDsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICp1c2VyID0gTlVMTDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJhcmczMiwgYXJnLCBzaXplb2YodXNlcmFyZzMyKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICIlczogZXJyIGNvcHl1c2VyIGlvY3RsICVzXG4iLAotCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX0VWRU5UX1NUQVRVU19WM18zMiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlpZiAodXNlcmFyZzMyLnBheWxvYWRfc2l6ZSA+Ci0JCSAgICBMSVNURU5fTUFYX1NUQVRVU19QQVlMT0FEX1NJWkUpIHsKLQkJCXByX2VycigiJXM6IHBheWxvYWRfc2l6ZSAlZCBpcyBpbnZhbGlkLCBtYXggYWxsb3dlZCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCB1c2VyYXJnMzIucGF5bG9hZF9zaXplLAotCQkJCUxJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXNpemUgPSBzaXplb2YoKnVzZXIpICsgdXNlcmFyZzMyLnBheWxvYWRfc2l6ZTsKLQkJdXNlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXNlcikgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEFsbG9jYXRpb24gZmFpbGVkIGV2ZW50IHN0YXR1cyBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWNtZCA9IFNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjM7Ci0JCXVzZXItPnBheWxvYWRfc2l6ZSA9IHVzZXJhcmczMi5wYXlsb2FkX3NpemU7Ci0JCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCB1c2VyKTsKLQotCQkvKiBVcGRhdGUgc2l6ZSB3aXRoIGFjdHVhbCBwYXlsb2FkIHNpemUgKi8KLQkJc2l6ZSA9IHNpemVvZih1c2VyYXJnMzIpICsgdXNlci0+cGF5bG9hZF9zaXplOwotCQlpZiAoIWVyciAmJiAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJnLCBzaXplKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IHdyaXRlIHZlcmlmeSBmYWlsZWQgc2l6ZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc2l6ZSk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0JCWlmICghZXJyKSB7Ci0JCQl1c2VyMzIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1c2VyMzIpIHsKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IEFsbG9jYXRpb24gZXZlbnQgdXNlciBzdGF0dXMgc2l6ZSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHNpemUpOwotCQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQl9IGVsc2UgewotCQkJCXVzZXIzMi0+dGltZXN0YW1wX2xzdyA9IHVzZXItPnRpbWVzdGFtcF9sc3c7Ci0JCQkJdXNlcjMyLT50aW1lc3RhbXBfbXN3ID0gdXNlci0+dGltZXN0YW1wX21zdzsKLQkJCQl1c2VyMzItPnN0YXR1cyA9IHVzZXItPnN0YXR1czsKLQkJCQl1c2VyMzItPnBheWxvYWRfc2l6ZSA9IHVzZXItPnBheWxvYWRfc2l6ZTsKLQkJCQltZW1jcHkodXNlcjMyLT5wYXlsb2FkLAotCQkJCXVzZXItPnBheWxvYWQsIHVzZXIzMi0+cGF5bG9hZF9zaXplKTsKLQkJCX0KLQkJfQotCQlpZiAoIWVyciAmJiAoY29weV90b191c2VyKGFyZywgdXNlcjMyLCBzaXplKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICIlczogZmFpbGVkIHRvIGNvcHkgcGF5bG9hZCAlZCIsCi0JCQkJX19mdW5jX18sIHNpemUpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlrZnJlZSh1c2VyKTsKLQkJa2ZyZWUodXNlcjMyKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIocnRkLT5kZXYsICIlczogbHNtZXZlbnQgZmFpbGVkICVkIiwKLQkJCQlfX2Z1bmNfXywgZXJyKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMl8zMjogewotCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiBzbmRfbW9kZWx2MjMyOwotCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiBzbmRfbW9kZWx2MjsKLQotCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgdXNpbmcgdG9wb2xvZ3lcbiIsCi0JCQkJX19mdW5jX18sICJSRUdfU05EX01PREVMX1YyIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzbmRfbW9kZWx2MjMyLCBhcmcsCi0JCQlzaXplb2Yoc25kX21vZGVsdjIzMikpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGNvcHkgdXNlciBmYWlsZWQsIHNpemUgJXpkICVzXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92Ml8zMiksCi0JCQkJIlNORFJWX0xTTV9SRUdfU05EX01PREVMX1YyXzMyIik7Ci0JCX0gZWxzZSB7Ci0JCQlzbmRfbW9kZWx2Mi5jb25maWRlbmNlX2xldmVsID0KLQkJCWNvbXBhdF9wdHIoc25kX21vZGVsdjIzMi5jb25maWRlbmNlX2xldmVsKTsKLQkJCXNuZF9tb2RlbHYyLmRhdGEgPSBjb21wYXRfcHRyKHNuZF9tb2RlbHYyMzIuZGF0YSk7Ci0JCQlzbmRfbW9kZWx2Mi5kYXRhX3NpemUgPSBzbmRfbW9kZWx2MjMyLmRhdGFfc2l6ZTsKLQkJCXNuZF9tb2RlbHYyLmRldGVjdF9mYWlsdXJlID0KLQkJCXNuZF9tb2RlbHYyMzIuZGV0ZWN0X2ZhaWx1cmU7Ci0JCQlzbmRfbW9kZWx2Mi5kZXRlY3Rpb25fbW9kZSA9Ci0JCQlzbmRfbW9kZWx2MjMyLmRldGVjdGlvbl9tb2RlOwotCQkJc25kX21vZGVsdjIubnVtX2NvbmZpZGVuY2VfbGV2ZWxzID0KLQkJCXNuZF9tb2RlbHYyMzIubnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCQkJY21kID0gU05EUlZfTFNNX1JFR19TTkRfTU9ERUxfVjI7Ci0JCQllcnIgPSBtc21fbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwKLQkJCQkmc25kX21vZGVsdjIpOwotCQkJaWYgKGVycikKLQkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCQkiJXM6IGlvY3RsICVzIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJCSJTTkREUlZfTFNNX1JFR19TTkRfTU9ERUxfVjJfMzIiKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFNORFJWX0xTTV9TRVRfUEFSQU1TXzMyOnsKLQkJc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtc18zMiBkZXRfcGFyYW1zMzI7Ci0JCXN0cnVjdCBzbmRfbHNtX2RldGVjdGlvbl9wYXJhbXMgZGV0X3BhcmFtczsKLQotCQlpZiAocHJ0ZC0+bHNtX2NsaWVudC0+dXNlX3RvcG9sb2d5KSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IG5vdCBzdXBwb3J0ZWQgaWYgdXNpbmcgdG9wb2xvZ3lcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfUEFSQU1TXzMyIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfcGFyYW1zMzIsIGFyZywKLQkJCQkgICBzaXplb2YoZGV0X3BhcmFtczMyKSkpIHsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgIlNORFJWX0xTTV9TRVRfUEFSQU1TXzMyIiwKLQkJCQlzaXplb2YoZGV0X3BhcmFtczMyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXRfcGFyYW1zLmNvbmZfbGV2ZWwgPQotCQkJCWNvbXBhdF9wdHIoZGV0X3BhcmFtczMyLmNvbmZfbGV2ZWwpOwotCQkJZGV0X3BhcmFtcy5kZXRlY3RfbW9kZSA9Ci0JCQkJZGV0X3BhcmFtczMyLmRldGVjdF9tb2RlOwotCQkJZGV0X3BhcmFtcy5udW1fY29uZmlkZW5jZV9sZXZlbHMgPQotCQkJCWRldF9wYXJhbXMzMi5udW1fY29uZmlkZW5jZV9sZXZlbHM7Ci0JCQlkZXRfcGFyYW1zLmRldGVjdF9mYWlsdXJlID0KLQkJCQlkZXRfcGFyYW1zMzIuZGV0ZWN0X2ZhaWx1cmU7Ci0JCQljbWQgPSBTTkRSVl9MU01fU0VUX1BBUkFNUzsKLQkJCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLAotCQkJCQkmZGV0X3BhcmFtcyk7Ci0JCQlpZiAoZXJyKQotCQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJCSIlczogaW9jdGwgJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJIlNORFJWX0xTTV9TRVRfUEFSQU1TIik7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBTTkRSVl9MU01fU0VUX01PRFVMRV9QQVJBTVNfMzI6IHsKLQkJc3RydWN0IHNuZF9sc21fbW9kdWxlX3BhcmFtc18zMiBwX2RhdGFfMzI7Ci0JCXN0cnVjdCBzbmRfbHNtX21vZHVsZV9wYXJhbXMgcF9kYXRhOwotCQl1OCAqcGFyYW1zLCAqcGFyYW1zMzI7Ci0JCXNpemVfdCBwX3NpemU7Ci0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIgKnBfaW5mb18zMjsKLQkJc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvOwotCQlpbnQgaTsKLQotCQlpZiAoIXBydGQtPmxzbV9jbGllbnQtPnVzZV90b3BvbG9neSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TXzMyIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwX2RhdGFfMzIsIGFyZywKLQkJCQkgICBzaXplb2YocF9kYXRhXzMyKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAotCQkJCXNpemVvZihwX2RhdGFfMzIpKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlwX2RhdGEucGFyYW1zID0gY29tcGF0X3B0cihwX2RhdGFfMzIucGFyYW1zKTsKLQkJcF9kYXRhLm51bV9wYXJhbXMgPSBwX2RhdGFfMzIubnVtX3BhcmFtczsKLQkJcF9kYXRhLmRhdGFfc2l6ZSA9IHBfZGF0YV8zMi5kYXRhX3NpemU7Ci0KLQkJaWYgKHBfZGF0YS5udW1fcGFyYW1zID4gTFNNX1BBUkFNU19NQVgpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogSW52YWxpZCBudW1fcGFyYW1zICVkXG4iLAotCQkJCV9fZnVuY19fLCAiU0VUX01PRFVMRV9QQVJBTVNfMzIiLAotCQkJCXBfZGF0YS5udW1fcGFyYW1zKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAocF9kYXRhLmRhdGFfc2l6ZSAhPQotCQkgICAgKHBfZGF0YS5udW1fcGFyYW1zICogc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBJbnZhbGlkIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNU18zMiIsCi0JCQkJcF9kYXRhLmRhdGFfc2l6ZSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIpICoKLQkJCSBwX2RhdGEubnVtX3BhcmFtczsKLQotCQlwYXJhbXMzMiA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYXJhbXMzMikgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvKSAqIHBfZGF0YS5udW1fcGFyYW1zOwotCQlwYXJhbXMgPSBremFsbG9jKHBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW1zKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogbm8gbWVtb3J5IGZvciBwYXJhbXMsIHNpemUgPSAlemRcbiIsCi0JCQkJX19mdW5jX18sIHBfc2l6ZSk7Ci0JCQlrZnJlZShwYXJhbXMzMik7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtczMyLCBwX2RhdGEucGFyYW1zLAotCQkJCSAgIHBfZGF0YS5kYXRhX3NpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCAicGFyYW1zMzIiLCBwX2RhdGEuZGF0YV9zaXplKTsKLQkJCWtmcmVlKHBhcmFtczMyKTsKLQkJCWtmcmVlKHBhcmFtcyk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcF9pbmZvXzMyID0gKHN0cnVjdCBsc21fcGFyYW1zX2luZm9fMzIgKikgcGFyYW1zMzI7Ci0JCXBfaW5mbyA9IChzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvICopIHBhcmFtczsKLQkJZm9yIChpID0gMDsgaSA8IHBfZGF0YS5udW1fcGFyYW1zOyBpKyspIHsKLQkJCXBfaW5mby0+bW9kdWxlX2lkID0gcF9pbmZvXzMyLT5tb2R1bGVfaWQ7Ci0JCQlwX2luZm8tPnBhcmFtX2lkID0gcF9pbmZvXzMyLT5wYXJhbV9pZDsKLQkJCXBfaW5mby0+cGFyYW1fc2l6ZSA9IHBfaW5mb18zMi0+cGFyYW1fc2l6ZTsKLQkJCXBfaW5mby0+cGFyYW1fZGF0YSA9IGNvbXBhdF9wdHIocF9pbmZvXzMyLT5wYXJhbV9kYXRhKTsKLQkJCXBfaW5mby0+cGFyYW1fdHlwZSA9IHBfaW5mb18zMi0+cGFyYW1fdHlwZTsKLQotCQkJcF9pbmZvXzMyKys7Ci0JCQlwX2luZm8rKzsKLQkJfQotCi0JCWVyciA9IG1zbV9sc21fcHJvY2Vzc19wYXJhbXMoc3Vic3RyZWFtLAotCQkJCQkgICAgICZwX2RhdGEsIHBhcmFtcyk7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHByb2Nlc3MgcGFyYW1zLCBlcnIgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZXJyKTsKLQkJa2ZyZWUocGFyYW1zKTsKLQkJa2ZyZWUocGFyYW1zMzIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMjoKLQljYXNlIFNORFJWX0xTTV9TRVRfUEFSQU1TOgotCWNhc2UgU05EUlZfTFNNX1NFVF9NT0RVTEVfUEFSQU1TOgotCQkvKgotCQkgKiBJbiBpZGVhbCBjYXNlcywgdGhlIGNvbXBhdF9pb2N0bCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCi0JCSAqIHdpdGggdGhlIGFib3ZlIHVubG9ja2VkIGlvY3RsIGNvbW1hbmRzLiBQcmludCBlcnJvcgotCQkgKiBhbmQgcmV0dXJuIGVycm9yIGlmIGl0IGRvZXMuCi0JCSAqLwotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIGNtZCBmb3IgY29tcGF0X2lvY3RsXG4iLAotCQkJX19mdW5jX18pOwotCQllcnIgPSAtRUlOVkFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSBtc21fbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJnBydGQtPmxzbV9hcGlfbG9jayk7Ci0JcmV0dXJuIGVycjsKLX0KLSNlbHNlCi0jZGVmaW5lIG1zbV9sc21faW9jdGxfY29tcGF0IE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IG1zbV9sc21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCWludCBlcnIgPSAwOwotCXUzMiBzaXplID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0Jc3RydWN0IGxzbV9wcml2ICpwcnRkOwotCi0JaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgJXNcbiIsIF9fZnVuY19fLAotCQkJKCFzdWJzdHJlYW0pID8gInN1YnN0cmVhbSIgOiAicHJpdmF0ZV9kYXRhIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZwcnRkLT5sc21fYXBpX2xvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9MU01fUkVHX1NORF9NT0RFTF9WMjogewotCQlzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MiBzbmRfbW9kZWxfdjI7Ci0KLQkJaWYgKHBydGQtPmxzbV9jbGllbnQtPnVzZV90b3BvbG9neSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIHVzaW5nIHRvcG9sb2d5XG4iLAotCQkJCV9fZnVuY19fLCAiUkVHX1NORF9NT0RFTF9WMiIpOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc25kX21vZGVsX3YyLCBhcmcsIHNpemVvZihzbmRfbW9kZWxfdjIpKSkgewotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2xzbV9zb3VuZF9tb2RlbF92MikpOwotCQl9Ci0JCWlmICghZXJyKQotCQkJZXJyID0gbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsCi0JCQkJCQkgICAmc25kX21vZGVsX3YyKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzIFJFR19TTkRfTU9ERUwgZmFpbGVkIGVyciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZXJyKTsKLQkJZ290byBkb25lOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfTFNNX1NFVF9QQVJBTVM6IHsKLQkJc3RydWN0IHNuZF9sc21fZGV0ZWN0aW9uX3BhcmFtcyBkZXRfcGFyYW1zOwotCi0JCWlmIChwcnRkLT5sc21fY2xpZW50LT51c2VfdG9wb2xvZ3kpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogbm90IHN1cHBvcnRlZCBpZiB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9QQVJBTVMiKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6IFNORFJWX0xTTV9TRVRfUEFSQU1TXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXRfcGFyYW1zLCBhcmcsCi0JCQkJICAgc2l6ZW9mKGRldF9wYXJhbXMpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBjb3B5X2Zyb21fdXNlciBmYWlsZWQsIHNpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLCAiU05EUlZfTFNNX1NFVF9QQVJBTVMiLAotCQkJCXNpemVvZihkZXRfcGFyYW1zKSk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0KLQkJaWYgKCFlcnIpCi0JCQllcnIgPSBtc21fbHNtX2lvY3RsX3NoYXJlZChzdWJzdHJlYW0sIGNtZCwKLQkJCQkJCSAgICZkZXRfcGFyYW1zKTsKLQkJZWxzZQotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IExTTV9TRVRfUEFSQU1TIGZhaWxlZCwgZXJyICVkXG4iLAotCQkJCV9fZnVuY19fLCBlcnIpOwotCi0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljYXNlIFNORFJWX0xTTV9TRVRfTU9EVUxFX1BBUkFNUzogewotCQlzdHJ1Y3Qgc25kX2xzbV9tb2R1bGVfcGFyYW1zIHBfZGF0YTsKLQkJc2l6ZV90IHBfc2l6ZTsKLQkJdTggKnBhcmFtczsKLQotCQlpZiAoIXBydGQtPmxzbV9jbGllbnQtPnVzZV90b3BvbG9neSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBub3Qgc3VwcG9ydGVkIGlmIG5vdCB1c2luZyB0b3BvbG9neVxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwX2RhdGEsIGFyZywKLQkJCQkgICBzaXplb2YocF9kYXRhKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogY29weV9mcm9tX3VzZXIgZmFpbGVkLCBzaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCAicF9kYXRhIiwgc2l6ZW9mKHBfZGF0YSkpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmIChwX2RhdGEubnVtX3BhcmFtcyA+IExTTV9QQVJBTVNfTUFYKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IEludmFsaWQgbnVtX3BhcmFtcyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIiwKLQkJCQlwX2RhdGEubnVtX3BhcmFtcyk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcF9zaXplID0gcF9kYXRhLm51bV9wYXJhbXMgKgotCQkJIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtc19pbmZvKTsKLQotCQlpZiAocF9kYXRhLmRhdGFfc2l6ZSAhPSBwX3NpemUpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiAlczogSW52YWxpZCBzaXplICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgIlNFVF9NT0RVTEVfUEFSQU1TIiwgcF9zaXplKTsKLQotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXBhcmFtcyA9IGt6YWxsb2MocF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYXJhbXMpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW1zLCBwX2RhdGEucGFyYW1zLAotCQkJCSAgIHBfZGF0YS5kYXRhX3NpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogJXM6IGNvcHlfZnJvbV91c2VyIGZhaWxlZCwgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCAicGFyYW1zIiwgcF9kYXRhLmRhdGFfc2l6ZSk7Ci0JCQlrZnJlZShwYXJhbXMpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWVyciA9IG1zbV9sc21fcHJvY2Vzc19wYXJhbXMoc3Vic3RyZWFtLCAmcF9kYXRhLCBwYXJhbXMpOwotCQlpZiAoZXJyKQotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6ICVzOiBGYWlsZWQgdG8gc2V0IHBhcmFtcywgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sICJTRVRfTU9EVUxFX1BBUkFNUyIsIGVycik7Ci0JCWtmcmVlKHBhcmFtcyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgU05EUlZfTFNNX0VWRU5UX1NUQVRVUzogewotCQlzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXMgKnVzZXIgPSBOVUxMLCB1c2VyYXJnOwotCi0JCWRldl9kYmcocnRkLT5kZXYsCi0JCQkiJXM6IFNORFJWX0xTTV9FVkVOVF9TVEFUVVNcbiIsIF9fZnVuY19fKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyYXJnLCBhcmcsIHNpemVvZih1c2VyYXJnKSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBlcnIgY29weXVzZXIgZXZlbnRfc3RhdHVzXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlpZiAodXNlcmFyZy5wYXlsb2FkX3NpemUgPgotCQkgICAgTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOiBwYXlsb2FkX3NpemUgJWQgaXMgaW52YWxpZCwgbWF4IGFsbG93ZWQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdXNlcmFyZy5wYXlsb2FkX3NpemUsCi0JCQkJTElTVEVOX01BWF9TVEFUVVNfUEFZTE9BRF9TSVpFKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBzbmRfbHNtX2V2ZW50X3N0YXR1cykgKwotCQl1c2VyYXJnLnBheWxvYWRfc2l6ZTsKLQkJdXNlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXNlcikgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEFsbG9jYXRpb24gZmFpbGVkIGV2ZW50IHN0YXR1cyBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJdXNlci0+cGF5bG9hZF9zaXplID0gdXNlcmFyZy5wYXlsb2FkX3NpemU7Ci0JCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCB1c2VyKTsKLQotCQkvKiBVcGRhdGUgc2l6ZSB3aXRoIGFjdHVhbCBwYXlsb2FkIHNpemUgKi8KLQkJc2l6ZSA9IHNpemVvZigqdXNlcikgKyB1c2VyLT5wYXlsb2FkX3NpemU7Ci0JCWlmICghZXJyICYmICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmcsIHNpemUpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogd3JpdGUgdmVyaWZ5IGZhaWxlZCBzaXplICVkXG4iLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKCFlcnIgJiYgKGNvcHlfdG9fdXNlcihhcmcsIHVzZXIsIHNpemUpKSkgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IGZhaWxlZCB0byBjb3B5IHBheWxvYWQgJWQiLAotCQkJCV9fZnVuY19fLCBzaXplKTsKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCX0KLQkJa2ZyZWUodXNlcik7Ci0JCWlmIChlcnIpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogbHNtZXZlbnQgZmFpbGVkICVkIiwgX19mdW5jX18sIGVycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljYXNlIFNORFJWX0xTTV9FVkVOVF9TVEFUVVNfVjM6IHsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzICp1c2VyID0gTlVMTDsKLQkJc3RydWN0IHNuZF9sc21fZXZlbnRfc3RhdHVzX3YzIHVzZXJhcmc7Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogU05EUlZfTFNNX0VWRU5UX1NUQVRVU19WM1xuIiwgX19mdW5jX18pOwotCQlpZiAoIWFyZykgewotCQkJZGV2X2VycihydGQtPmRldiwKLQkJCQkiJXM6IEludmFsaWQgcGFyYW1zIGV2ZW50X3N0YXR1c192M1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcmFyZywgYXJnLCBzaXplb2YodXNlcmFyZykpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZXJyIGNvcHl1c2VyIGV2ZW50X3N0YXR1c192M1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJaWYgKHVzZXJhcmcucGF5bG9hZF9zaXplID4KLQkJICAgIExJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSkgewotCQkJcHJfZXJyKCIlczogcGF5bG9hZF9zaXplICVkIGlzIGludmFsaWQsIG1heCBhbGxvd2VkID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHVzZXJhcmcucGF5bG9hZF9zaXplLAotCQkJCUxJU1RFTl9NQVhfU1RBVFVTX1BBWUxPQURfU0laRSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2xzbV9ldmVudF9zdGF0dXNfdjMpICsKLQkJCXVzZXJhcmcucGF5bG9hZF9zaXplOwotCQl1c2VyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1c2VyKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogQWxsb2NhdGlvbiBmYWlsZWQgZXZlbnQgc3RhdHVzIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHNpemUpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQl1c2VyLT5wYXlsb2FkX3NpemUgPSB1c2VyYXJnLnBheWxvYWRfc2l6ZTsKLQkJZXJyID0gbXNtX2xzbV9pb2N0bF9zaGFyZWQoc3Vic3RyZWFtLCBjbWQsIHVzZXIpOwotCi0JCS8qIFVwZGF0ZSBzaXplIHdpdGggYWN0dWFsIHBheWxvYWQgc2l6ZSAqLwotCQlzaXplID0gc2l6ZW9mKCp1c2VyKSArIHVzZXItPnBheWxvYWRfc2l6ZTsKLQkJaWYgKCFlcnIgJiYgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgc2l6ZSkpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiB3cml0ZSB2ZXJpZnkgZmFpbGVkIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHNpemUpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlpZiAoIWVyciAmJiAoY29weV90b191c2VyKGFyZywgdXNlciwgc2l6ZSkpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGNvcHkgcGF5bG9hZCAlZCIsCi0JCQkJX19mdW5jX18sIHNpemUpOwotCQkJZXJyID0gLUVGQVVMVDsKLQkJfQotCQlrZnJlZSh1c2VyKTsKLQkJaWYgKGVycikKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiBsc21fZXZlbnRfdjMgZmFpbGVkICVkIiwgX19mdW5jX18sIGVycik7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCWVyciA9IG1zbV9sc21faW9jdGxfc2hhcmVkKHN1YnN0cmVhbSwgY21kLCBhcmcpOwotCWJyZWFrOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sc21fYXBpX2xvY2spOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGxzbV9wcml2ICpwcnRkOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsc21fcHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBsc21fcHJpdlxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW11dGV4X2luaXQoJnBydGQtPmxzbV9hcGlfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBydGQtPmV2ZW50X2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBydGQtPmV2ZW50X3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBydGQtPnBlcmlvZF93YWl0KTsKLQlwcnRkLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKLQlydW50aW1lLT5odyA9IG1zbV9wY21faGFyZHdhcmVfY2FwdHVyZTsKLQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCi0JCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJJmNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2luZm8oIiVzOiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBmYWlsZWQgcmV0ICVkXG4iLAotCQkJIF9fZnVuY19fLCByZXQpOwotCS8qIEVuc3VyZSB0aGF0IGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgcGVyaW9kIHNpemUgKi8KLQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfaW5mbygiJXM6IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKLQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKLQkJQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMgKiBDQVBUVVJFX01JTl9QRVJJT0RfU0laRSwKLQkJQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgKiBDQVBUVVJFX01BWF9QRVJJT0RfU0laRSk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2luZm8oIiVzOiBjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgbWluIG1heCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCi0JCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsIDMyKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9pbmZvKCIlczogY29uc3RyYWludCBmb3IgcGVyaW9kIGJ5dGVzIHN0ZXAgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgMzIpOwotCWlmIChyZXQgPCAwKQotCQlwcl9pbmZvKCIlczogY29uc3RyYWludCBmb3IgYnVmZmVyIGJ5dGVzIHN0ZXAgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQlwcnRkLT5sc21fY2xpZW50ID0gcTZsc21fY2xpZW50X2FsbG9jKAotCQkJCShsc21fYXBwX2NiKWxzbV9ldmVudF9oYW5kbGVyLCBwcnRkKTsKLQlpZiAoIXBydGQtPmxzbV9jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQlrZnJlZShwcnRkKTsKLQkJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXBydGQtPmxzbV9jbGllbnQtPm9wZW5lZCA9IGZhbHNlOwotCXBydGQtPmxzbV9jbGllbnQtPnNlc3Npb25fc3RhdGUgPSBJRExFOwotCXBydGQtPmxzbV9jbGllbnQtPnBvbGxfZW5hYmxlID0gdHJ1ZTsKLQlwcnRkLT5sc21fY2xpZW50LT5wZXJmX21vZGUgPSAwOwotCXBydGQtPmxzbV9jbGllbnQtPmV2ZW50X21vZGUgPSBMU01fRVZFTlRfTk9OX1RJTUVfU1RBTVBfTU9ERTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9sc21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnRkID0gcHJ0ZC0+c3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAoIXBydGQtPmxzbV9jbGllbnQpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogTFNNIGNsaWVudCBkYXRhIHB0ciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChxNmxzbV9zZXRfbWVkaWFfZm10X3BhcmFtcyhwcnRkLT5sc21fY2xpZW50KSkKLQkJZGV2X2RiZyhydGQtPmRldiwKLQkJCSIlczogZmFpbGVkIHRvIHNldCBsc20gbWVkaWEgZm10IHBhcmFtc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHBydGQtPmxzbV9jbGllbnQtPnNlc3Npb25fc3RhdGUgPT0gSURMRSkgewotCQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9jb21wcl9zdHJlYW0oCi0JCQkJcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJcHJ0ZC0+bHNtX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJCXBydGQtPmxzbV9jbGllbnQtPnNlc3Npb24sCi0JCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAotCQkJCUxJU1RFTik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsCi0JCQkJIiVzOiByZWdpc3RlciBwaHkgY29tcHIgc3RyZWFtIGZhaWxlZCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcHJ0ZC0+bHNtX2NsaWVudC0+c2Vzc2lvbl9zdGF0ZSA9IFJVTk5JTkc7Ci0JcHJ0ZC0+bHNtX2NsaWVudC0+c3RhcnRlZCA9IGZhbHNlOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlX2RhdGEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXBydGQgfHwgIXBydGQtPmxzbV9jbGllbnQpIHsKLQkJcHJfZXJyKCIlczogTm8gTFNNIHNlc3Npb24gYWN0aXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWRldl9kYmcocnRkLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCWlmIChwcnRkLT5sc21fY2xpZW50LT5zdGFydGVkKSB7Ci0JCXJldCA9IHE2bHNtX3N0b3AocHJ0ZC0+bHNtX2NsaWVudCwgdHJ1ZSk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogc2Vzc2lvbiBzdG9wIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCWVsc2UKLQkJCWRldl9kYmcocnRkLT5kZXYsCi0JCQkJIiVzOiBMU00gY2xpZW50IHNlc3Npb24gc3RvcHBlZCAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHJldCk7Ci0KLQkJLyoKLQkJICogR28gQWhlYWQgYW5kIHRyeSBkZS1yZWdpc3RlciBzb3VuZCBtb2RlbCwKLQkJICogZXZlbiBpZiBzdG9wIGZhaWxlZAotCQkgKi8KLQkJcHJ0ZC0+bHNtX2NsaWVudC0+c3RhcnRlZCA9IGZhbHNlOwotCi0JCXJldCA9IHE2bHNtX2RlcmVnaXN0ZXJfc291bmRfbW9kZWwocHJ0ZC0+bHNtX2NsaWVudCk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZGVyZWdfc25kX21vZGVsIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCWVsc2UKLQkJCWRldl9kYmcocnRkLT5kZXYsICIlczogZGVyZWdfc25kX21vZGVsIHN1Y2Nlc3NmdWxcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQl9Ci0KLQltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKLQotCWlmIChwcnRkLT5sc21fY2xpZW50LT5vcGVuZWQpIHsKLQkJcTZsc21fY2xvc2UocHJ0ZC0+bHNtX2NsaWVudCk7Ci0JCXBydGQtPmxzbV9jbGllbnQtPm9wZW5lZCA9IGZhbHNlOwotCX0KLQlxNmxzbV9jbGllbnRfZnJlZShwcnRkLT5sc21fY2xpZW50KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5ldmVudF9sb2NrLCBmbGFncyk7Ci0Ja2ZyZWUocHJ0ZC0+ZXZlbnRfc3RhdHVzKTsKLQlwcnRkLT5ldmVudF9zdGF0dXMgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmV2ZW50X2xvY2ssIGZsYWdzKTsKLQltdXRleF9kZXN0cm95KCZwcnRkLT5sc21fYXBpX2xvY2spOwotCWtmcmVlKHBydGQpOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBsc21fcHJpdiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbHNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCi0JaWYgKCFzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHByaXZhdGVfZGF0YSIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFwcnRkIHx8ICFwYXJhbXMpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogaW52YWxpZCBwYXJhbXMgcHJ0ZCAlcEsgcGFyYW1zICVwSyIsCi0JCQkgX19mdW5jX18sIHBydGQsIHBhcmFtcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlod19wYXJhbXMgPSAmcHJ0ZC0+bHNtX2NsaWVudC0+aHdfcGFyYW1zOwotCWh3X3BhcmFtcy0+bnVtX2NocyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCWh3X3BhcmFtcy0+cGVyaW9kX2NvdW50ID0gcGFyYW1zX3BlcmlvZHMocGFyYW1zKTsKLQlod19wYXJhbXMtPnNhbXBsZV9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQlpZiAoKChod19wYXJhbXMtPnNhbXBsZV9yYXRlICE9IDE2MDAwKSAmJgotCQkoaHdfcGFyYW1zLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCkpIHx8Ci0JCShod19wYXJhbXMtPnBlcmlvZF9jb3VudCA9PSAwKSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIFBhcmFtcyBzYW1wbGUgcmF0ZSAlZCBwZXJpb2QgY291bnQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgaHdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwKLQkJCWh3X3BhcmFtcy0+cGVyaW9kX2NvdW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBhcmFtc19mb3JtYXQocGFyYW1zKSA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgewotCQlod19wYXJhbXMtPnNhbXBsZV9zaXplID0gMTY7Ci0JfSBlbHNlIGlmIChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpIHsKLQkJaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZSA9IDI0OwotCX0gZWxzZSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICIlczogSW52YWxpZCBGb3JtYXQgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlod19wYXJhbXMtPmJ1Zl9zeiA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvCi0JCQlod19wYXJhbXMtPnBlcmlvZF9jb3VudDsKLQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkiJXM6IGNoYW5uZWxzICVkIHNhbXBsZSByYXRlICVkIHNhbXBsZSBzaXplICVkIGJ1ZmZlciBzaXplICVkIHBlcmlvZCBjb3VudCAlZFxuIiwKLQkJX19mdW5jX18sIGh3X3BhcmFtcy0+bnVtX2NocywgaHdfcGFyYW1zLT5zYW1wbGVfcmF0ZSwKLQkJaHdfcGFyYW1zLT5zYW1wbGVfc2l6ZSwgaHdfcGFyYW1zLT5idWZfc3osCi0JCWh3X3BhcmFtcy0+cGVyaW9kX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG1zbV9sc21fcGNtX3BvaW50ZXIoCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbHNtX3ByaXYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQotCWlmICghc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlX2RhdGEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWlmICghcHJ0ZCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtICVwS1xuIiwgX19mdW5jX18sIHBydGQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocHJ0ZC0+ZG1hX3dyaXRlID49IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKQotCQlwcnRkLT5kbWFfd3JpdGUgPSAwOwotCWRldl9kYmcocnRkLT5kZXYsCi0JCSIlczogZG1hIHBvc3QgPSAlZFxuIiwgX19mdW5jX18sIHBydGQtPmRtYV93cml0ZSk7Ci0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwcnRkLT5kbWFfd3JpdGUpOwotfQotCi1zdGF0aWMgaW50IG1zbV9sc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjaCwKLQlzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGxzbV9wcml2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKnBjbV9idWYgPSBOVUxMOwotCWludCBmYnl0ZXMgPSAwLCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQotCWlmICghc3Vic3RyZWFtLT5wcml2YXRlX2RhdGEpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwcml2YXRlX2RhdGEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWlmICghcHJ0ZCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBJbnZhbGlkIHBhcmFtICVwS1xuIiwgX19mdW5jX18sIHBydGQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKLQlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfWFJVTiB8fAotCSAgICBydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9QUkVQQVJFRCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBydW50aW1lIHN0YXRlIGluY29ycmVjdCAlZCIsIF9fZnVuY19fLAotCQkJcnVudGltZS0+c3RhdHVzLT5zdGF0ZSk7Ci0JCXJldHVybiAwOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChwcnRkLT5wZXJpb2Rfd2FpdCwKLQkJKGF0b21pY19yZWFkKCZwcnRkLT5idWZfY291bnQpIHwKLQkJYXRvbWljX3JlYWQoJnBydGQtPnJlYWRfYWJvcnQpKSwgKDIgKiBIWikpOwotCWlmICghcmMpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogdGltZW91dCBmb3IgcmVhZCByZXRyeVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZwcnRkLT5yZWFkX2Fib3J0KSkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJIiVzOiBSZWFkIGFib3J0IHJlY2VpdmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlwcnRkLT5hcHBsX2NudCA9IHBydGQtPmFwcGxfY250ICUKLQkJcHJ0ZC0+bHNtX2NsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudDsKLQlwY21fYnVmID0gcHJ0ZC0+bHNtX2NsaWVudC0+bGFiX2J1ZmZlcltwcnRkLT5hcHBsX2NudF0uZGF0YTsKLQlkZXZfZGJnKHJ0ZC0+ZGV2LAotCQkiJXM6IGNvcHkgdGhlIHBjbSBkYXRhIHNpemUgJWRcbiIsCi0JCV9fZnVuY19fLCBmYnl0ZXMpOwotCWlmIChwY21fYnVmKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwY21fYnVmLCBmYnl0ZXMpKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIGNvcHkgYnl0ZXMgJWRcbiIsCi0JCQkJX19mdW5jX18sIGZieXRlcyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IEludmFsaWQgcGNtIGJ1ZmZlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJ0ZC0+YXBwbF9jbnQgPSAocHJ0ZC0+YXBwbF9jbnQgKyAxKSAlCi0JCXBydGQtPmxzbV9jbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQ7Ci0JYXRvbWljX2RlYygmcHJ0ZC0+YnVmX2NvdW50KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCWludCBiZV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MH07Ci0JaW50IHJldCA9IDA7Ci0KLQljZmdfZGF0YS5hcHBfdHlwZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWNmZ19kYXRhLmFjZGJfZGV2X2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JY2ZnX2RhdGEuc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQotCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHUgc2Vzc2lvbl90eXBlLSAlZCBiZV9pZC0gJWQgYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICBiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQlpbnQgYmVfaWQgPSAwOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MH07Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgICZiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNmZ19kYXRhLmFwcF90eXBlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2ZnX2RhdGEuYWNkYl9kZXZfaWQ7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPSBjZmdfZGF0YS5zYW1wbGVfcmF0ZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9IGJlX2lkOwotCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBiZV9pZCAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2FkZF9hcHBfdHlwZV9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKLQlzdHJ1Y3Qgc25kX3BjbV91c3IgKmFwcF90eXBlX2luZm87Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZQk9ICJMaXN0ZW4gU3RyZWFtIjsKLQljb25zdCBjaGFyICpkZXZpY2VObwkJPSAiTk4iOwotCWNvbnN0IGNoYXIgKnN1ZmZpeAkJPSAiQXBwIFR5cGUgQ2ZnIjsKLQlpbnQgY3RsX2xlbiwgcmV0ID0gMDsKLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArCi0JCQlzdHJsZW4oZGV2aWNlTm8pICsgMSArIHN0cmxlbihzdWZmaXgpICsgMTsKLQlwcl9kZWJ1ZygiJXM6IExpc3RlbiBhcHAgdHlwZSBjbnRybCBhZGRcbiIsIF9fZnVuY19fKTsKLQlyZXQgPSBzbmRfcGNtX2FkZF91c3JfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKLQkJCQlOVUxMLCAxLCBjdGxfbGVuLCBydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkmYXBwX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogTGlzdGVuIGFwcCB0eXBlIGNudHJsIGFkZCBmYWlsZWQ6ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWtjdGwgPSBhcHBfdHlwZV9pbmZvLT5rY3RsOwotCXNucHJpbnRmKGtjdGwtPmlkLm5hbWUsIGN0bF9sZW4sICIlcyAlZCAlcyIsCi0JCW1peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOwotCWtjdGwtPnB1dCA9IG1zbV9sc21fYXBwX3R5cGVfY2ZnX2N0bF9wdXQ7Ci0Ja2N0bC0+Z2V0ID0gbXNtX2xzbV9hcHBfdHlwZV9jZmdfY3RsX2dldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbHNtX2FkZF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWludCByZXQgPSAwOwotCi0JcmV0ID0gbXNtX2xzbV9hZGRfYXBwX3R5cGVfY29udHJvbHMocnRkKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzLCBhZGQgIGFwcCB0eXBlIGNvbnRyb2xzIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9sc21fb3BzID0gewotCS5vcGVuICAgICAgICAgICA9IG1zbV9sc21fb3BlbiwKLQkuY2xvc2UgICAgICAgICAgPSBtc21fbHNtX2Nsb3NlLAotCS5pb2N0bCAgICAgICAgICA9IG1zbV9sc21faW9jdGwsCi0JLnByZXBhcmUJPSBtc21fbHNtX3ByZXBhcmUsCi0JLmNvbXBhdF9pb2N0bCAgID0gbXNtX2xzbV9pb2N0bF9jb21wYXQsCi0JLmh3X3BhcmFtcyAgICAgID0gbXNtX2xzbV9od19wYXJhbXMsCi0JLmNvcHkgICAgICAgICAgID0gbXNtX2xzbV9wY21fY29weSwKLQkucG9pbnRlciAgICAgICAgPSBtc21fbHNtX3BjbV9wb2ludGVyLAotfTsKLQotc3RhdGljIGludCBtc21fYXNvY19sc21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKLQkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0KLQlyZXQgPSBtc21fbHNtX2FkZF9jb250cm9scyhydGQpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXMsIGtjdGwgYWRkIGZhaWxlZDolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX2xzbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0JcHJfZGVidWcoImVudGVyICVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0gewotCS5vcHMJCT0gJm1zbV9sc21fb3BzLAotCS5wY21fbmV3CT0gbXNtX2Fzb2NfbHNtX25ldywKLQkucHJvYmUJCT0gbXNtX2Fzb2NfbHNtX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBtc21fbHNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0KLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmbXNtX3NvY19wbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2xzbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX2xzbV9jbGllbnRfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tbHNtLWNsaWVudCIgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1zbV9sc21fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihtc21fbHNtX2NsaWVudF9kdF9tYXRjaCksCi0JfSwKLQkucHJvYmUgPSBtc21fbHNtX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fbHNtX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9sc21fZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2xzbV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJMU00gY2xpZW50IHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX2xzbV9jbGllbnRfZHRfbWF0Y2gpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tYWZlLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1hZmUtdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YjMxMC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1hZmUtdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDkyMiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KLQotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSAibXNtLXBjbS1hZmUtdjIuaCIKLQotI2RlZmluZSBNSU5fUExBWUJBQ0tfUEVSSU9EX1NJWkUgKDEyOCAqIDIpCi0jZGVmaW5lIE1BWF9QTEFZQkFDS19QRVJJT0RfU0laRSAoMTI4ICogMiAqIDIgKiA2KQotI2RlZmluZSBNSU5fUExBWUJBQ0tfTlVNX1BFUklPRFMgKDQpCi0jZGVmaW5lIE1BWF9QTEFZQkFDS19OVU1fUEVSSU9EUyAoMzg0KQotCi0jZGVmaW5lIE1JTl9DQVBUVVJFX1BFUklPRF9TSVpFICgxMjggKiAyKQotI2RlZmluZSBNQVhfQ0FQVFVSRV9QRVJJT0RfU0laRSAoMTkyICogMiAqIDIgKiA4ICogNCkKLSNkZWZpbmUgTUlOX0NBUFRVUkVfTlVNX1BFUklPRFMgKDQpCi0jZGVmaW5lIE1BWF9DQVBUVVJFX05VTV9QRVJJT0RTICgzODQpCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fYWZlX2hhcmR3YXJlX3BsYXliYWNrID0gewotCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQpLAotCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fUkFURV84MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8xNjAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfNDgwMDApLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCi0JLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKLQkuY2hhbm5lbHNfbWF4ID0gICAgICAgICA2LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIE1BWF9QTEFZQkFDS19QRVJJT0RfU0laRSAqCi0JCQkJTUFYX1BMQVlCQUNLX05VTV9QRVJJT0RTLAotCS5wZXJpb2RfYnl0ZXNfbWluID0gICAgIE1JTl9QTEFZQkFDS19QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21heCA9ICAgICBNQVhfUExBWUJBQ0tfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZHNfbWluID0gICAgICAgICAgTUlOX1BMQVlCQUNLX05VTV9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9ICAgICAgICAgIE1BWF9QTEFZQkFDS19OVU1fUEVSSU9EUywKLQkuZmlmb19zaXplID0gICAgICAgICAgICAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9hZmVfaGFyZHdhcmVfY2FwdHVyZSA9IHsKLQkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEKSwKLQkuZm9ybWF0cyA9ICAgICAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRXwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKLQkucmF0ZXMgPSAgICAgICAgICAgICAgICAoU05EUlZfUENNX1JBVEVfODAwMCB8Ci0JCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfAotCQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwKSwKLQkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAotCS5yYXRlX21heCA9ICAgICAgICAgICAgIDQ4MDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgNiwKLQkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBNQVhfQ0FQVFVSRV9QRVJJT0RfU0laRSAqCi0JCQkJTUFYX0NBUFRVUkVfTlVNX1BFUklPRFMsCi0JLnBlcmlvZF9ieXRlc19taW4gPSAgICAgTUlOX0NBUFRVUkVfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZF9ieXRlc19tYXggPSAgICAgTUFYX0NBUFRVUkVfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZHNfbWluID0gICAgICAgICAgTUlOX0NBUFRVUkVfTlVNX1BFUklPRFMsCi0JLnBlcmlvZHNfbWF4ID0gICAgICAgICAgTUFYX0NBUFRVUkVfTlVNX1BFUklPRFMsCi0JLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKLX07Ci0KLQotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX2NhbGxiYWNrKHN0cnVjdCBocnRpbWVyICpocnQpOwotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX3JlY19jYWxsYmFjayhzdHJ1Y3QgaHJ0aW1lciAqaHJ0KTsKLQotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFmZV9ocnRpbWVyX2NhbGxiYWNrKHN0cnVjdCBocnRpbWVyICpocnQpCi17Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9Ci0JCWNvbnRhaW5lcl9vZihocnQsIHN0cnVjdCBwY21fYWZlX2luZm8sIGhydCk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwcnRkLT5zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1MzIgbWVtX21hcF9oYW5kbGUgPSAwOwotCi0JbWVtX21hcF9oYW5kbGUgPSBhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JaWYgKCFtZW1fbWFwX2hhbmRsZSkKLQkJcHJfZXJyKCIlczogbWVtX21hcF9oYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JaWYgKHBydGQtPnN0YXJ0KSB7Ci0JCXByX2RlYnVnKCJzZW5kaW5nIGZyYW1lIHRvIERTUDogcG9sbF90aW1lOiAlZFxuIiwKLQkJCQlwcnRkLT5wb2xsX3RpbWUpOwotCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQotCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7Ci0JCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgMHgleFxuIiwgX19mdW5jX18sIG1lbV9tYXBfaGFuZGxlKTsKLQkJYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUoCi0JCShwcnRkLT5kbWFfYWRkciArCi0JCShwcnRkLT5kc3BfY250ICoKLQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpKSwgbWVtX21hcF9oYW5kbGUsCi0JCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhwcnRkLT5zdWJzdHJlYW0pKTsKLQkJcHJ0ZC0+ZHNwX2NudCsrOwotCQlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgbnNfdG9fa3RpbWUocHJ0ZC0+cG9sbF90aW1lCi0JCQkJCSogMTAwMCkpOwotCi0JCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Ci0JfSBlbHNlCi0JCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKLX0KLXN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBhZmVfaHJ0aW1lcl9yZWNfY2FsbGJhY2soc3RydWN0IGhydGltZXIgKmhydCkKLXsKLQlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0KLQkJY29udGFpbmVyX29mKGhydCwgc3RydWN0IHBjbV9hZmVfaW5mbywgaHJ0KTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBydGQtPnN1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXUzMiBtZW1fbWFwX2hhbmRsZSA9IDA7Ci0JaW50IHJldDsKLQotCW1lbV9tYXBfaGFuZGxlID0gYWZlX3JlcV9tbWFwX2hhbmRsZShwcnRkLT5hdWRpb19jbGllbnQpOwotCWlmICghbWVtX21hcF9oYW5kbGUpCi0JCXByX2VycigiJXM6IG1lbV9tYXBfaGFuZGxlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCWlmIChwcnRkLT5zdGFydCkgewotCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQotCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7Ci0JCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgMHgleFxuIiwgX19mdW5jX18sIG1lbV9tYXBfaGFuZGxlKTsKLQkJcmV0ID0gYWZlX3J0X3Byb3h5X3BvcnRfcmVhZCgKLQkJKHBydGQtPmRtYV9hZGRyICsgKHBydGQtPmRzcF9jbnQKLQkJKiBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocHJ0ZC0+c3Vic3RyZWFtKSkpLCBtZW1fbWFwX2hhbmRsZSwKLQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogQUZFIHBvcnQgcmVhZCBmYWlsczogJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQkJcHJ0ZC0+c3RhcnQgPSAwOwotCQkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwotCQl9Ci0JCXBydGQtPmRzcF9jbnQrKzsKLQkJcHJfZGVidWcoInNlbmRpbmcgZnJhbWUgcmVjIHRvIERTUDogcG9sbF90aW1lOiAlZFxuIiwKLQkJCQlwcnRkLT5wb2xsX3RpbWUpOwotCQlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgbnNfdG9fa3RpbWUocHJ0ZC0+cG9sbF90aW1lCi0JCQkJKiAxMDAwKSk7Ci0KLQkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKLQl9IGVsc2UKLQkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwotfQotc3RhdGljIHZvaWQgcGNtX2FmZV9wcm9jZXNzX3R4X3BrdCh1aW50MzJfdCBvcGNvZGUsCi0JCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwKLQkJIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHByaXY7Ci0JdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBOVUxMOwotCXVpbnQxNl90IGV2ZW50OwotCXVpbnQ2NF90IHBlcmlvZF9ieXRlczsKLQl1aW50NjRfdCBieXRlc19vbmVfc2VjOwotCi0JaWYgKHBydGQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCXN1YnN0cmVhbSA9ICBwcnRkLT5zdWJzdHJlYW07Ci0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFGRV9FVkVOVF9SVF9QUk9YWV9QT1JUX1NUQVRVUzogewotCQlldmVudCA9ICh1aW50MTZfdCkoKDB4RkZGRjAwMDAgJiBwYXlsb2FkWzBdKSA+PiAweDEwKTsKLQkJCXN3aXRjaCAoZXZlbnQpIHsKLQkJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9TVEFSVDogewotCQkJCXBydGQtPmRzcF9jbnQgPSAwOwotCQkJCS8qIENhbGN1bGF0ZSBwb2xsIHRpbWUuCi0JCQkJICogU3BsaXQgc3RlcHMgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JCQkJICogUG9sbCB0aW1lLXRpbWUgY29ycmVzcG9uZGluZyB0byBvbmUgcGVyaW9kCi0JCQkJICogaW4gYnl0ZXMuCi0JCQkJICogKFNhbXBsZXJhdGUgKiBjaGFubmVsY291bnQgKiBmb3JtYXQpID0KLQkJCQkgKiBieXRlcyBpbiAxIHNlYy4KLQkJCQkgKiBQb2xsIHRpbWUgPQotCQkJCSAqCShwZXJpb2QgYnl0ZXMgLyBieXRlcyBpbiBvbmUgc2VjKSAqCi0JCQkJICoJIDEwMDAwMDAgbWljcm8gc2Vjb25kcy4KLQkJCQkgKiBNdWx0aXBsaWNhdGlvbiBieSAxMDAwMDAwIGlzIGRvbmUgaW4gdHdvCi0JCQkJICogc3RlcHMgdG8ga2VlcCB0aGUgYWNjdXJhY3kgb2YgcG9sbCB0aW1lLgotCQkJCSAqLwotCQkJCWlmIChwcnRkLT5tbWFwX2ZsYWcpIHsKLQkJCQkJcGVyaW9kX2J5dGVzID0gKCh1aW50NjRfdCkoCi0JCQkJCQkoc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKAotCQkJCQkJCXBydGQtPnN1YnN0cmVhbSkpICoKLQkJCQkJCQkxMDAwKSk7Ci0JCQkJCWJ5dGVzX29uZV9zZWMgPSAocnVudGltZS0+cmF0ZQotCQkJCQkJKiBydW50aW1lLT5jaGFubmVscyAqIDIpOwotCQkJCQlieXRlc19vbmVfc2VjID0KLQkJCQkJCWRpdl91NjQoYnl0ZXNfb25lX3NlYywgMTAwMCk7Ci0JCQkJCXBydGQtPnBvbGxfdGltZSA9Ci0JCQkJCQlkaXZfdTY0KHBlcmlvZF9ieXRlcywKLQkJCQkJCWJ5dGVzX29uZV9zZWMpOwotCQkJCQlwcl9kZWJ1ZygicHJ0ZC0+cG9sbF90aW1lOiAlZCIsCi0JCQkJCQkJcHJ0ZC0+cG9sbF90aW1lKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfU1RPUDoKLQkJCQlwcl9kZWJ1ZygiJXM6IGV2ZW50IT0wXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcHJ0ZC0+c3RhcnQgPSAwOwotCQkJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfTE9XX1dNOgotCQkJCXByX2RlYnVnKCIlczogVW5kZXJydW5cbiIsIF9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9ISV9XTToKLQkJCQlwcl9kZWJ1ZygiJXM6IE92ZXJydW5cbiIsIF9fZnVuY19fKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0JY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDogewotCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1dSSVRFX1YyOgotCQkJcHJfZGVidWcoIndyaXRlIGRvbmVcbiIpOwotCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCi0JCQkJCQkJKHBydGQtPnN1YnN0cmVhbSk7Ci0JCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPnN1YnN0cmVhbSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFJFU0VUX0VWRU5UUzoKLQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCi0JCQkJCQkocHJ0ZC0+c3Vic3RyZWFtKTsKLQkJcHJ0ZC0+cmVzZXRfZXZlbnQgPSB0cnVlOwotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPnN1YnN0cmVhbSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcGNtX2FmZV9wcm9jZXNzX3J4X3BrdCh1aW50MzJfdCBvcGNvZGUsCi0JCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwKLQkJIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHByaXY7Ci0JdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBOVUxMOwotCXVpbnQxNl90IGV2ZW50OwotCXVpbnQ2NF90IHBlcmlvZF9ieXRlczsKLQl1aW50NjRfdCBieXRlc19vbmVfc2VjOwotCXVpbnQzMl90IG1lbV9tYXBfaGFuZGxlID0gMDsKLQotCWlmIChwcnRkID09IE5VTEwpCi0JCXJldHVybjsKLQlzdWJzdHJlYW0gPSAgcHJ0ZC0+c3Vic3RyZWFtOwotCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBRkVfRVZFTlRfUlRfUFJPWFlfUE9SVF9TVEFUVVM6IHsKLQkJZXZlbnQgPSAodWludDE2X3QpKCgweEZGRkYwMDAwICYgcGF5bG9hZFswXSkgPj4gMHgxMCk7Ci0JCXN3aXRjaCAoZXZlbnQpIHsKLQkJY2FzZSBBRkVfRVZFTlRfUlRQT1JUX1NUQVJUOiB7Ci0JCQlwcnRkLT5kc3BfY250ID0gMDsKLQkJCS8qIENhbGN1bGF0ZSBwb2xsIHRpbWUuIFNwbGl0IHN0ZXBzIHRvIGF2b2lkIG92ZXJmbG93LgotCQkJICogUG9sbCB0aW1lLXRpbWUgY29ycmVzcG9uZGluZyB0byBvbmUgcGVyaW9kIGluIGJ5dGVzLgotCQkJICogKFNhbXBsZXJhdGUgKiBjaGFubmVsY291bnQgKiBmb3JtYXQpPWJ5dGVzIGluIDEgc2VjLgotCQkJICogUG9sbCB0aW1lID0gIChwZXJpb2QgYnl0ZXMgLyBieXRlcyBpbiBvbmUgc2VjKSAqCi0JCQkgKiAxMDAwMDAwIG1pY3JvIHNlY29uZHMuCi0JCQkgKiBNdWx0aXBsaWNhdGlvbiBieSAxMDAwMDAwIGlzIGRvbmUgaW4gdHdvIHN0ZXBzIHRvCi0JCQkgKiBrZWVwIHRoZSBhY2N1cmFjeSBvZiBwb2xsIHRpbWUuCi0JCQkgKi8KLQkJCWlmIChwcnRkLT5tbWFwX2ZsYWcpIHsKLQkJCQlwZXJpb2RfYnl0ZXMgPSAoKHVpbnQ2NF90KSgKLQkJCQkJKHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKLQkJCQkJcHJ0ZC0+c3Vic3RyZWFtKSkgKiAxMDAwKSk7Ci0JCQkJYnl0ZXNfb25lX3NlYyA9IChydW50aW1lLT5yYXRlICoKLQkJCQkJCXJ1bnRpbWUtPmNoYW5uZWxzICogMik7Ci0JCQkJYnl0ZXNfb25lX3NlYyA9IGRpdl91NjQoYnl0ZXNfb25lX3NlYywgMTAwMCk7Ci0JCQkJcHJ0ZC0+cG9sbF90aW1lID0KLQkJCQkJZGl2X3U2NChwZXJpb2RfYnl0ZXMsIGJ5dGVzX29uZV9zZWMpOwotCQkJCXByX2RlYnVnKCJwcnRkLT5wb2xsX3RpbWUgOiAlZFxuIiwKLQkJCQkJcHJ0ZC0+cG9sbF90aW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtX21hcF9oYW5kbGUgPQotCQkJCQlhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCQkJaWYgKCFtZW1fbWFwX2hhbmRsZSkKLQkJCQkJcHJfZXJyKCIlczptZW1fbWFwX2hhbmRsZSBpcyBOVUxMXG4iLAotCQkJCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJLyogRG8gaW5pdGlhbCByZWFkIHRvIHN0YXJ0IHRyYW5zZmVyICovCi0JCQkJYWZlX3J0X3Byb3h5X3BvcnRfcmVhZCgocHJ0ZC0+ZG1hX2FkZHIgKwotCQkJCQkocHJ0ZC0+ZHNwX2NudCAqCi0JCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKLQkJCQkJCXBydGQtPnN1YnN0cmVhbSkpKSwKLQkJCQkJbWVtX21hcF9oYW5kbGUsCi0JCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcygKLQkJCQkJCXBydGQtPnN1YnN0cmVhbSkpOwotCQkJCXBydGQtPmRzcF9jbnQrKzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9TVE9QOgotCQkJcHJfZGVidWcoIiVzOiBldmVudCE9MFxuIiwgX19mdW5jX18pOwotCQkJcHJ0ZC0+c3RhcnQgPSAwOwotCQkJc25kX3BjbV9zdG9wKHN1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1NFVFVQKTsKLQkJCWJyZWFrOwotCQljYXNlIEFGRV9FVkVOVF9SVFBPUlRfTE9XX1dNOgotCQkJcHJfZGVidWcoIiVzOiBVbmRlcnJ1blxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUZFX0VWRU5UX1JUUE9SVF9ISV9XTToKLQkJCXByX2RlYnVnKCIlczogT3ZlcnJ1blxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDogewotCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjI6Ci0JCQlwcl9kZWJ1ZygiJXMgOlJlYWQgZG9uZVxuIiwgX19mdW5jX18pOwotCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzCi0JCQkJCQkJKHBydGQtPnN1YnN0cmVhbSk7Ci0JCQlpZiAoIXBydGQtPm1tYXBfZmxhZykgewotCQkJCWF0b21pY19zZXQoJnBydGQtPnJlY19ieXRlc19hdmFpbCwgMSk7Ci0JCQkJd2FrZV91cCgmcHJ0ZC0+cmVhZF93YWl0KTsKLQkJCX0KLQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+c3Vic3RyZWFtKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgUkVTRVRfRVZFTlRTOgotCQlwcnRkLT5wY21faXJxX3BvcyArPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMKLQkJCQkJCQkocHJ0ZC0+c3Vic3RyZWFtKTsKLQkJcHJ0ZC0+cmVzZXRfZXZlbnQgPSB0cnVlOwotCQlpZiAoIXBydGQtPm1tYXBfZmxhZykgewotCQkJYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAxKTsKLQkJCXdha2VfdXAoJnBydGQtPnJlYWRfd2FpdCk7Ci0JCX0KLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChwcnRkLT5zdWJzdHJlYW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FmZV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNhbXBsZV9yYXRlPSVkXG4iLCBfX2Z1bmNfXywgcnVudGltZS0+cmF0ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhaS0+aWQgPSV4XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JcmV0ID0gYWZlX3JlZ2lzdGVyX2dldF9ldmVudHMoZGFpLT5pZCwKLQkJCXBjbV9hZmVfcHJvY2Vzc190eF9wa3QsIHBydGQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiYWZlLXBjbTpyZWdpc3RlciBmb3IgZXZlbnRzIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByX2RlYnVnKCIlczpzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7Ci0JcHJ0ZC0+cHJlcGFyZWQrKzsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hZmVfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCXByX2RlYnVnKCIlczogZGFpLT5pZCA9JXhcbiIsIF9fZnVuY19fLCBkYWktPmlkKTsKLQlyZXQgPSBhZmVfcmVnaXN0ZXJfZ2V0X2V2ZW50cyhkYWktPmlkLAotCQkJcGNtX2FmZV9wcm9jZXNzX3J4X3BrdCwgcHJ0ZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJhZmUtcGNtOnJlZ2lzdGVyIGZvciBldmVudHMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJfZGVidWcoIiVzOnN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKLQlwcnRkLT5wcmVwYXJlZCsrOwotCXJldHVybiAwOwotfQotCi0vKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7Ci0JODAwMCwgMTYwMDAsIDQ4MDAwCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyA9IHsKLQkuY291bnQgPSBBUlJBWV9TSVpFKHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMpLAotCS5saXN0ID0gc3VwcG9ydGVkX3NhbXBsZV9yYXRlcywKLQkubWFzayA9IDAsCi19OwotCi1zdGF0aWMgaW50IG1zbV9hZmVfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JcHJ0ZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY21fYWZlX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJ0ZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwcl9kZWJ1ZygicHJ0ZCAlcEtcbiIsIHBydGQpOwotCi0JbXV0ZXhfaW5pdCgmcHJ0ZC0+bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBydGQtPmRzcF9sb2NrKTsKLQlwcnRkLT5kc3BfY250ID0gMDsKLQotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJ1bnRpbWUtPmh3ID0gbXNtX2FmZV9oYXJkd2FyZV9wbGF5YmFjazsKLQllbHNlCi0JCXJ1bnRpbWUtPmh3ID0gbXNtX2FmZV9oYXJkd2FyZV9jYXB0dXJlOwotCi0JcHJ0ZC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci0JcHJ0ZC0+YXVkaW9fY2xpZW50ID0gcTZhZmVfYXVkaW9fY2xpZW50X2FsbG9jKHBydGQpOwotCWlmICghcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2RlYnVnKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQlrZnJlZShwcnRkKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAwKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcnRkLT5yZWFkX3dhaXQpOwotCi0JaHJ0aW1lcl9pbml0KCZwcnRkLT5ocnQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXBydGQtPmhydC5mdW5jdGlvbiA9IGFmZV9ocnRpbWVyX2NhbGxiYWNrOwotCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJcHJ0ZC0+aHJ0LmZ1bmN0aW9uID0gYWZlX2hydGltZXJfcmVjX2NhbGxiYWNrOwotCi0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAotCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJCSZjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7Ci0JLyogRW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLwotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2Vycigic25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIgZmFpbGVkXG4iKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKLQkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAotCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKLQkJCU1JTl9DQVBUVVJFX05VTV9QRVJJT0RTICogTUlOX0NBUFRVUkVfUEVSSU9EX1NJWkUsCi0JCQlNQVhfQ0FQVFVSRV9OVU1fUEVSSU9EUyAqIE1BWF9DQVBUVVJFX1BFUklPRF9TSVpFKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgbWluIG1heCByZXQgPSAlZFxuIiwKLQkJCSAgICAgIHJldCk7Ci0JCX0KLQl9Ci0KLQlwcnRkLT5yZXNldF9ldmVudCA9IGZhbHNlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hZmVfcGxheWJhY2tfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlpbnQgY2hhbm5lbCwgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsCi0JCQkJdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpod2J1ZiA9IHJ1bnRpbWUtPmRtYV9hcmVhICsgZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGh3b2ZmKTsKLQl1MzIgbWVtX21hcF9oYW5kbGUgPSAwOwotCi0JcHJfZGVidWcoIiVzIDogYXBwbF9wdHIgMHglbHggaHdfcHRyIDB4JWx4IGRlc3RfdG9fY29weSAweCVwS1xuIiwKLQkJX19mdW5jX18sCi0JCXJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyLCBydW50aW1lLT5zdGF0dXMtPmh3X3B0ciwgaHdidWYpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGh3YnVmLCBidWYsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpKSkgewotCQlwcl9lcnIoIiVzIDpGYWlsZWQgdG8gY29weSBhdWRpbyBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJX19mdW5jX18pOwotCi0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIXBydGQtPm1tYXBfZmxhZykgewotCQltZW1fbWFwX2hhbmRsZSA9IGFmZV9yZXFfbW1hcF9oYW5kbGUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJaWYgKCFtZW1fbWFwX2hhbmRsZSkgewotCQkJcHJfZXJyKCIlczogbWVtX21hcF9oYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXByX2RlYnVnKCIlcyA6IHBydGQtPiBkbWFfYWRkciAweCVseCBkc3BfY250ICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBydGQtPmRtYV9hZGRyLCBwcnRkLT5kc3BfY250KTsKLQotCQlpZiAocHJ0ZC0+ZHNwX2NudCA9PSBydW50aW1lLT5wZXJpb2RzKQotCQkJcHJ0ZC0+ZHNwX2NudCA9IDA7Ci0KLQkJcmV0ID0gYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUoCi0JCQkJKHBydGQtPmRtYV9hZGRyICsgKHBydGQtPmRzcF9jbnQgKgotCQkJCXNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhwcnRkLT5zdWJzdHJlYW0pKSksCi0JCQkJbWVtX21hcF9oYW5kbGUsCi0JCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpOwotCi0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEFGRSBwcm94eSBwb3J0IHdyaXRlIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlwcnRkLT5kc3BfY250Kys7Ci0JfQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hZmVfY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCWludCBjaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwKLQkJCQl2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgKmh3YnVmID0gcnVudGltZS0+ZG1hX2FyZWEgKyBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgaHdvZmYpOwotCXUzMiBtZW1fbWFwX2hhbmRsZSA9IDA7Ci0KLQlpZiAoIXBydGQtPm1tYXBfZmxhZykgewotCQltZW1fbWFwX2hhbmRsZSA9IGFmZV9yZXFfbW1hcF9oYW5kbGUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQotCQlpZiAoIW1lbV9tYXBfaGFuZGxlKSB7Ci0JCQlwcl9lcnIoIiVzOiBtZW1fbWFwX2hhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJaWYgKHBydGQtPmRzcF9jbnQgPT0gcnVudGltZS0+cGVyaW9kcykKLQkJCXBydGQtPmRzcF9jbnQgPSAwOwotCi0JCXJldCA9IGFmZV9ydF9wcm94eV9wb3J0X3JlYWQoKHBydGQtPmRtYV9hZGRyICsKLQkJCQkocHJ0ZC0+ZHNwX2NudCAqCi0JCQkJc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBydGQtPnN1YnN0cmVhbSkpKSwKLQkJCQltZW1fbWFwX2hhbmRsZSwKLQkJCQlzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocHJ0ZC0+c3Vic3RyZWFtKSk7Ci0KLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogQUZFIHByb3h5IHBvcnQgcmVhZCBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlwcnRkLT5kc3BfY250Kys7Ci0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcnRkLT5yZWFkX3dhaXQsCi0JCQkJYXRvbWljX3JlYWQoJnBydGQtPnJlY19ieXRlc19hdmFpbCksIDUgKiBIWik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50X3RpbWVvdXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYXRvbWljX3NldCgmcHJ0ZC0+cmVjX2J5dGVzX2F2YWlsLCAwKTsKLQl9Ci0JcHJfZGVidWcoIiVzOmFwcGxfcHRyIDB4JWx4IGh3X3B0ciAweCVseCBzcmNfdG9fY29weSAweCVwS1xuIiwKLQkJCV9fZnVuY19fLCBydW50aW1lLT5jb250cm9sLT5hcHBsX3B0ciwKLQkJCXJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyLCBod2J1Zik7Ci0KLQlpZiAoY29weV90b191c2VyKGJ1ZiwgaHdidWYsIGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpKSkgewotCQlwcl9lcnIoIiVzOiBjb3B5IHRvIHVzZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJZ290byBmYWlsOwotCQlyZXQgPSAtRUZBVUxUOwotCX0KLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hZmVfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNoYW5uZWwsCi0JCQlzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1ZiwKLQkJCXNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpbnQgcmV0ID0gMDsKLQotCWlmIChwcnRkLT5yZXNldF9ldmVudCkgewotCQlwcl9kZWJ1ZygiJXM6IHJlc2V0IGV2ZW50cyByZWNlaXZlZCBmcm9tIEFEU1AsIHJldHVybiBlcnJvclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9hZmVfcGxheWJhY2tfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsIGh3b2ZmLAotCQkJCQlidWYsIGZyYW1lcyk7Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlyZXQgPSBtc21fYWZlX2NhcHR1cmVfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsIGh3b2ZmLAotCQkJCQlidWYsIGZyYW1lcyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYWZlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IE5VTEw7Ci0JaW50IGRpciA9IElOOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHN1YnN0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2Vycigic3Vic3RyZWFtIGlzIE5VTExcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JZGFpID0gcnRkLT5jcHVfZGFpOwotCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJZGlyID0gSU47Ci0JCXJldCA9ICBhZmVfdW5yZWdpc3Rlcl9nZXRfZXZlbnRzKGRhaS0+aWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiQUZFIHVucmVnaXN0ZXIgZm9yIGV2ZW50cyBmYWlsZWRcbiIpOwotCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCWRpciA9IE9VVDsKLQkJcmV0ID0gIGFmZV91bnJlZ2lzdGVyX2dldF9ldmVudHMoZGFpLT5pZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCJBRkUgdW5yZWdpc3RlciBmb3IgZXZlbnRzIGZhaWxlZFxuIik7Ci0JfQotCWlmIChwcnRkLT5tbWFwX2ZsYWcpCi0JCWhydGltZXJfY2FuY2VsKCZwcnRkLT5ocnQpOwotCi0JcmMgPSBhZmVfY21kX21lbW9yeV91bm1hcChhZmVfcmVxX21tYXBfaGFuZGxlKHBydGQtPmF1ZGlvX2NsaWVudCkpOwotCWlmIChyYyA8IDApCi0JCXByX2VycigiQUZFIG1lbW9yeSB1bm1hcCBmYWlsZWRcbiIpOwotCi0JcHJfZGVidWcoInJlbGVhc2UgYWxsIGJ1ZmZlclxuIik7Ci0JZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JaWYgKGRtYV9idWYgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiZG1hX2J1ZiBpcyBOVUxMXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoZG1hX2J1Zi0+YXJlYSkKLQkJZG1hX2J1Zi0+YXJlYSA9IE5VTEw7Ci0JcTZhZmVfYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoZGlyLCBwcnRkLT5hdWRpb19jbGllbnQpOwotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IGRhaS0+aWQgPSV4XG4iLCBfX2Z1bmNfXywgZGFpLT5pZCk7Ci0JcTZhZmVfYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCXBydGQtPnByZXBhcmVkLS07Ci0Ja2ZyZWUocHJ0ZCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgbXNtX2FmZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHBjbV9hZmVfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXBydGQtPnBjbV9pcnFfcG9zID0gMDsKLQlpZiAocHJ0ZC0+cHJlcGFyZWQpCi0JCXJldHVybiAwOwotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlyZXQgPSBtc21fYWZlX3BsYXliYWNrX3ByZXBhcmUoc3Vic3RyZWFtKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9hZmVfY2FwdHVyZV9wcmVwYXJlKHN1YnN0cmVhbSk7Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIGludCBtc21fYWZlX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKLQlzdHJ1Y3QgYWZlX2F1ZGlvX3BvcnRfZGF0YSAqYXBkID0gYWMtPnBvcnQ7Ci0Jc3RydWN0IGFmZV9hdWRpb19idWZmZXIgKmFiOwotCWludCBkaXIgPSAtMTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXBydGQtPm1tYXBfZmxhZyA9IDE7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJZGlyID0gSU47Ci0JZWxzZQotCQlkaXIgPSBPVVQ7Ci0JYWIgPSAmKGFwZFtkaXJdLmJ1ZlswXSk7Ci0KLQlyZXR1cm4gbXNtX2F1ZGlvX2lvbl9tbWFwKChzdHJ1Y3QgYXVkaW9fYnVmZmVyICopYWIsIHZtYSk7Ci19Ci1zdGF0aWMgaW50IG1zbV9hZmVfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1ZygiJXM6IFNORFJWX1BDTV9UUklHR0VSX1NUQVJUXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPnN0YXJ0ID0gMTsKLQkJaWYgKHBydGQtPm1tYXBfZmxhZykKLQkJCWhydGltZXJfc3RhcnQoJnBydGQtPmhydCwgbnNfdG9fa3RpbWUoMCksCi0JCQkJCUhSVElNRVJfTU9ERV9SRUwpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJcHJfZGVidWcoIiVzOiBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPnN0YXJ0ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1zdGF0aWMgaW50IG1zbV9hZmVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQlzdHJ1Y3QgcGNtX2FmZV9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBhZmVfYXVkaW9fYnVmZmVyICpidWY7Ci0JaW50IGRpciwgcmM7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJZGlyID0gSU47Ci0JZWxzZQotCQlkaXIgPSBPVVQ7Ci0KLQlyYyA9IHE2YWZlX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhkaXIsCi0JCXBydGQtPmF1ZGlvX2NsaWVudCwKLQkJKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvIHBhcmFtc19wZXJpb2RzKHBhcmFtcykpLAotCQlwYXJhbXNfcGVyaW9kcyhwYXJhbXMpKTsKLQlwcl9kZWJ1ZygicGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpID0gJWRcbiIsCi0JCQkocGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKSk7Ci0JcHJfZGVidWcoInBhcmFtc19wZXJpb2RzKHBhcmFtcykgPSAlZFxuIiwKLQkJCShwYXJhbXNfcGVyaW9kcyhwYXJhbXMpKSk7Ci0JcHJfZGVidWcoInBhcmFtc19wZXJpb2RzaXplKHBhcmFtcykgPSAlZFxuIiwKLQkJKHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSAvIHBhcmFtc19wZXJpb2RzKHBhcmFtcykpKTsKLQotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJBdWRpbyBTdGFydDogQnVmZmVyIEFsbG9jYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKLQkJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtkaXJdLmJ1ZjsKLQotCWlmIChidWYgPT0gTlVMTCB8fCBidWZbMF0uZGF0YSA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXByX2RlYnVnKCIlczpidWYgPSAlcEtcbiIsIF9fZnVuY19fLCBidWYpOwotCWRtYV9idWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOwotCWRtYV9idWYtPmRldi5kZXYgPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2OwotCWRtYV9idWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JZG1hX2J1Zi0+YXJlYSA9IGJ1ZlswXS5kYXRhOwotCWRtYV9idWYtPmFkZHIgPSBidWZbMF0ucGh5czsKLQotCWRtYV9idWYtPmJ5dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOwotCi0JaWYgKCFkbWFfYnVmLT5hcmVhKSB7Ci0JCXByX2VycigiJXM6TVNNIEFGRSBwaHlzaWNhbCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCi0JCQkJCQkJX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1zZXQoZG1hX2J1Zi0+YXJlYSwgMCwgIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7Ci0KLQlwcnRkLT5kbWFfYWRkciA9IChwaHlzX2FkZHJfdCkgZG1hX2J1Zi0+YWRkcjsKLQotCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0KLQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwotCi0JcmMgPSBhZmVfbWVtb3J5X21hcChkbWFfYnVmLT5hZGRyLCBkbWFfYnVmLT5ieXRlcywgcHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQlpZiAocmMgPCAwKQotCQlwcl9lcnIoImZhaWwgdG8gbWFwIG1lbW9yeSB0byBEU1BcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IG1zbV9hZmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBwY21fYWZlX2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAocHJ0ZC0+cGNtX2lycV9wb3MgPj0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpCi0JCXBydGQtPnBjbV9pcnFfcG9zID0gMDsKLQotCWlmIChwcnRkLT5yZXNldF9ldmVudCkgewotCQlwcl9kZWJ1ZygiJXM6IHJlc2V0IGV2ZW50cyByZWNlaXZlZCBmcm9tIEFEU1AsIHJldHVybiBYUlVOXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gU05EUlZfUENNX1BPU19YUlVOOwotCX0KLQotCXByX2RlYnVnKCJwY21faXJxX3BvcyA9ICVkXG4iLCBwcnRkLT5wY21faXJxX3Bvcyk7Ci0JcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAocHJ0ZC0+cGNtX2lycV9wb3MpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBtc21fYWZlX29wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBtc21fYWZlX29wZW4sCi0JLmNvcHkgICAgICAgICAgID0gbXNtX2FmZV9jb3B5LAotCS5od19wYXJhbXMJPSBtc21fYWZlX2h3X3BhcmFtcywKLQkudHJpZ2dlcgk9IG1zbV9hZmVfdHJpZ2dlciwKLQkuY2xvc2UgICAgICAgICAgPSBtc21fYWZlX2Nsb3NlLAotCS5wcmVwYXJlICAgICAgICA9IG1zbV9hZmVfcHJlcGFyZSwKLQkubW1hcAkJPSBtc21fYWZlX21tYXAsCi0JLnBvaW50ZXIJPSBtc21fYWZlX3BvaW50ZXIsCi19OwotCi0KLXN0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCi0JCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FmZV9hZmVfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7Ci0JLm9wcwkJPSAmbXNtX2FmZV9vcHMsCi0JLnBjbV9uZXcJPSBtc21fYXNvY19wY21fbmV3LAotCS5wcm9iZQkJPSBtc21fYWZlX2FmZV9wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2FmZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCSAgICZtc21fc29jX3BsYXRmb3JtKTsKLX0KLQotc3RhdGljIGludCBtc21fYWZlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9wY21fYWZlX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLXBjbS1hZmUifSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9wY21fYWZlX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX2FmZV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLXBjbS1hZmUiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3BjbV9hZmVfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fYWZlX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fYWZlX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9hZmVfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX2FmZV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBRkUgUENNIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWFmZS12Mi5oIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tYWZlLXYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTRjM2MuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tYWZlLXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsMjAxNS0yMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX01TTV9QQ01fQUZFX0gKLSNkZWZpbmUgX01TTV9QQ01fQUZFX0gKLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgotCi0KLXN0cnVjdCBwY21fYWZlX2luZm8gewotCXVuc2lnbmVkIGxvbmcgZG1hX2FkZHI7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0JdW5zaWduZWQgaW50IHBjbV9pcnFfcG9zOyAgICAgICAvKiBJUlEgcG9zaXRpb24gKi8KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzcGlubG9ja190IGRzcF9sb2NrOwotCXVpbnQzMl90IHNhbXBfcmF0ZTsKLQl1aW50MzJfdCBjaGFubmVsX21vZGU7Ci0JdWludDhfdCBzdGFydDsKLQl1aW50MzJfdCBkc3BfY250OwotCXVpbnQzMl90IGJ1Zl9waHlzOwotCWludDMyX3QgbW1hcF9mbGFnOwotCWludCBwcmVwYXJlZDsKLQlzdHJ1Y3QgaHJ0aW1lciBocnQ7Ci0JaW50IHBvbGxfdGltZTsKLQlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYXVkaW9fY2xpZW50OwotCXdhaXRfcXVldWVfaGVhZF90IHJlYWRfd2FpdDsKLQlhdG9taWNfdCByZWNfYnl0ZXNfYXZhaWw7Ci0JYm9vbCByZXNldF9ldmVudDsKLX07Ci0KLQotI2RlZmluZSBNU01fRVhUKHhuYW1lLCBmcF9pbmZvLCBmcF9nZXQsIGZwX3B1dCwgYWRkcikgXAotCXsuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLCBcCi0JLm5hbWUgPSB4bmFtZSwgXAotCS5pbmZvID0gZnBfaW5mbyxcCi0JLmdldCA9IGZwX2dldCwgLnB1dCA9IGZwX3B1dCwgXAotCS5wcml2YXRlX3ZhbHVlID0gYWRkciwgXAotCX0KLQotI2VuZGlmIC8qX01TTV9QQ01fQUZFX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tZHRtZi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tZHRtZi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGUwM2ZlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWR0bWYtdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLQotI2luY2x1ZGUgIm1zbS1wY20tcTYtdjIuaCIKLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlICJxNnZvaWNlLmgiCi0KLWVudW0gewotCURUTUZfSU5fUlgsCi0JRFRNRl9JTl9UWCwKLX07Ci0KLWVudW0gZm9ybWF0IHsKLQlGT1JNQVRfUzE2X0xFID0gMgotfTsKLQotc3RydWN0IGR0bWZfZGV0X2luZm8gewotCWNoYXIgICAgIHNlc3Npb25bTUFYX1NFU1NJT05fTkFNRV9MRU5dOwotCXVpbnQ4X3QgIGRpcjsKLQl1aW50MTZfdCBoaWdoX2ZyZXE7Ci0JdWludDE2X3QgbG93X2ZyZXE7Ci19OwotCi1zdHJ1Y3QgZHRtZl9idWZfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBkdG1mX2RldF9pbmZvIGR0bWZfZGV0X3BrdDsKLX07Ci0KLWVudW0gZHRtZl9zdGF0ZSB7Ci0JRFRNRl9HRU5fUlhfU1RPUFBFRCwKLQlEVE1GX0dFTl9SWF9TVEFSVEVELAotfTsKLQotI2RlZmluZSBEVE1GX01BWF9RX0xFTiAxMAotI2RlZmluZSBEVE1GX1BLVF9TSVpFIHNpemVvZihzdHJ1Y3QgZHRtZl9kZXRfaW5mbykKLQotc3RydWN0IGR0bWZfZHJ2X2luZm8gewotCWVudW0gIGR0bWZfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX3N1YnN0cmVhbTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgb3V0X3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9vdXRfcXVldWU7Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBvdXRfd2FpdDsKLQotCXN0cnVjdCBtdXRleCBsb2NrOwotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0KLQl1aW50OF90IGNhcHR1cmVfc3RhcnQ7Ci0JdWludDhfdCBjYXB0dXJlX2luc3RhbmNlOwotCi0JdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX3NpemU7Ci0JdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX2NvdW50OwotCXVuc2lnbmVkIGludCBwY21fY2FwdHVyZV9pcnFfcG9zOwotCXVuc2lnbmVkIGludCBwY21fY2FwdHVyZV9idWZfcG9zOwotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmUgPSB7Ci0JLmluZm8gPSAgICAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCksCi0JLmZvcm1hdHMgPSAgICAgICAgICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKLQkuY2hhbm5lbHNfbWF4ID0gICAgICAgICAxLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0JKHNpemVvZihzdHJ1Y3QgZHRtZl9idWZfbm9kZSkgKiBEVE1GX01BWF9RX0xFTiksCi0JLnBlcmlvZF9ieXRlc19taW4gPQlEVE1GX1BLVF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JRFRNRl9QS1RfU0laRSwKLQkucGVyaW9kc19taW4gPQkJRFRNRl9NQVhfUV9MRU4sCi0JLnBlcmlvZHNfbWF4ID0JCURUTUZfTUFYX1FfTEVOLAotCS5maWZvX3NpemUgPSAgICAgICAgICAgIDAsCi19OwotCi1zdGF0aWMgaW50IG1zbV9kdG1mX3J4X2dlbmVyYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWludDE2X3QgbG93X2ZyZXEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1aW50MTZfdCBoaWdoX2ZyZXEgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQlpbnQ2NF90IGR1cmF0aW9uID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0JdWludDE2X3QgZ2FpbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCi0JcHJfZGVidWcoIiVzOiBsb3dfZnJlcT0lZCBoaWdoX2ZyZXE9JWQgZHVyYXRpb249JWQgZ2Fpbj0lZFxuIiwKLQkJIF9fZnVuY19fLCBsb3dfZnJlcSwgaGlnaF9mcmVxLCAoaW50KWR1cmF0aW9uLCBnYWluKTsKLQlhZmVfZHRtZl9nZW5lcmF0ZV9yeChkdXJhdGlvbiwgaGlnaF9mcmVxLCBsb3dfZnJlcSwgZ2Fpbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2R0bWZfcnhfZ2VuZXJhdGVfZ2V0KHN0cnVjdCAgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHRtZl9kZXRlY3Rfdm9pY2VfcnhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IGVuYWJsZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0Jdm9jX2VuYWJsZV9kdG1mX3J4X2RldGVjdGlvbih2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VfU0VTU0lPTl9OQU1FKSwKLQkJCQkgICAgIGVuYWJsZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHRtZl9kZXRlY3Rfdm9pY2VfcnhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHRtZl9kZXRlY3Rfdm9sdGVfcnhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IGVuYWJsZT0lZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7Ci0Jdm9jX2VuYWJsZV9kdG1mX3J4X2RldGVjdGlvbih2b2NfZ2V0X3Nlc3Npb25faWQoVk9MVEVfU0VTU0lPTl9OQU1FKSwKLQkJCQkgICAgIGVuYWJsZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZHRtZl9kZXRlY3Rfdm9sdGVfcnhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fZHRtZl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEVE1GX0dlbmVyYXRlIFJ4IExvdyBIaWdoIER1cmF0aW9uIEdhaW4iLAotCQkJICAgICBTTkRfU09DX05PUE0sIDAsIDUwMDAsIDAsIDQsCi0JCQkgICAgIG1zbV9kdG1mX3J4X2dlbmVyYXRlX2dldCwKLQkJCSAgICAgbXNtX2R0bWZfcnhfZ2VuZXJhdGVfcHV0KSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRl9EZXRlY3QgUnggVm9pY2UgZW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAotCQkJCW1zbV9kdG1mX2RldGVjdF92b2ljZV9yeF9nZXQsCi0JCQkJbXNtX2R0bWZfZGV0ZWN0X3ZvaWNlX3J4X3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUZfRGV0ZWN0IFJ4IFZvTFRFIGVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKLQkJCQltc21fZHRtZl9kZXRlY3Rfdm9sdGVfcnhfZ2V0LAotCQkJCW1zbV9kdG1mX2RldGVjdF92b2x0ZV9yeF9wdXQpLAotfTsKLQotc3RhdGljIGludCBtc21fcGNtX2R0bWZfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fZHRtZl9jb250cm9scywKLQkJCQkgICAgICBBUlJBWV9TSVpFKG1zbV9kdG1mX2NvbnRyb2xzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGR0bWZfcnhfZGV0ZWN0ZWRfY2IodWludDhfdCAqcGt0LAotCQkJCWNoYXIgKnNlc3Npb24sCi0JCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCBkdG1mX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2V2dF9yeF9kdG1mX2RldGVjdGVkICpkdG1mX2RldF9wa3QgPQotCQkoc3RydWN0IHZzc19pc3RyZWFtX2V2dF9yeF9kdG1mX2RldGVjdGVkICopcGt0OwotCXN0cnVjdCBkdG1mX2Rydl9pbmZvICpwcnRkID0gcHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIENvcHkgZHRtZiBkZXRlY3RlZCBpbmZvIGludG8gb3V0X3F1ZXVlLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkvKiBkaXNjYXJkaW5nIGR0bWYgZGV0ZWN0aW9uIGluZm8gdGlsbCBzdGFydCBpcyByZWNlaXZlZCAqLwotCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpICYmIHBydGQtPmNhcHR1cmVfc3RhcnQpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSwKLQkJCQkJICAgIHN0cnVjdCBkdG1mX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5oaWdoX2ZyZXEgPSBkdG1mX2RldF9wa3QtPmhpZ2hfZnJlcTsKLQkJYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5sb3dfZnJlcSA9IGR0bWZfZGV0X3BrdC0+bG93X2ZyZXE7Ci0JCWlmIChzZXNzaW9uICE9IE5VTEwpCi0JCQlzdHJsY3B5KGJ1Zl9ub2RlLT5kdG1mX2RldF9wa3Quc2Vzc2lvbiwKLQkJCQlzZXNzaW9uLCBNQVhfU0VTU0lPTl9OQU1FX0xFTik7Ci0KLQkJYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5kaXIgPSBEVE1GX0lOX1JYOwotCQlwcl9kZWJ1ZygiaGlnaCA9JWQsIGxvdz0lZCBzZXNzaW9uPSVzXG4iLAotCQkJIGJ1Zl9ub2RlLT5kdG1mX2RldF9wa3QuaGlnaF9mcmVxLAotCQkJIGJ1Zl9ub2RlLT5kdG1mX2RldF9wa3QubG93X2ZyZXEsCi0JCQkgYnVmX25vZGUtPmR0bWZfZGV0X3BrdC5zZXNzaW9uKTsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5vdXRfcXVldWUpOwotCQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zICs9IHBydGQtPnBjbV9jYXB0dXJlX2NvdW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCXByX2VycigiRFRNRiBkZXRlY3Rpb24gcGt0IGluIFJ4ICBkcm9wcGVkLCBubyBmcmVlIG5vZGUgYXZhaWxhYmxlXG4iKTsKLQl9Ci0KLQl3YWtlX3VwKCZwcnRkLT5vdXRfd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJaW50IGNoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGh3b2ZmLAotCQkJCXZvaWQgX191c2VyICpidWYsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBkdG1mX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQotCWNvdW50ID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIGZyYW1lcyk7Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwcnRkLT5vdXRfd2FpdCwKLQkJCQkoIWxpc3RfZW1wdHkoJnBydGQtPm91dF9xdWV1ZSkpLAotCQkJCTEgKiBIWik7Ci0KLQlpZiAocmV0ID4gMCkgewotCQlpZiAoY291bnQgPD0gRFRNRl9QS1RfU0laRSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5vdXRfcXVldWUsCi0JCQkJCXN0cnVjdCBkdG1mX2J1Zl9ub2RlLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsCi0JCQkJCSAgICZidWZfbm9kZS0+ZHRtZl9kZXRfcGt0LAotCQkJCQkgICBjb3VudCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJfZXJyKCIlczogQ29weSB0byB1c2VyIHJldHVybmVkICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCi0JCQkJICAgICAgJnBydGQtPmZyZWVfb3V0X3F1ZXVlKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCi0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBSZWFkIGNvdW50ICVkID4gRFRNRl9QS1RfU0laRVxuIiwKLQkJCQlfX2Z1bmNfXywgY291bnQpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJfQotCX0gZWxzZSBpZiAocmV0ID09IDApIHsKLQkJcHJfZXJyKCIlczogTm8gVUwgZGF0YSBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBSZWFkIHdhcyBpbnRlcnJ1cHRlZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKLQkgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsIHZvaWQgX191c2VyICpidWYsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlcygpIERUTUZcbiIsIF9fZnVuY19fKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9wY21fY2FwdHVyZV9jb3B5KHN1YnN0cmVhbSwgYSwgaHdvZmYsIGJ1ZiwgZnJhbWVzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR0bWZfZHJ2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQotCQlpZiAocHJ0ZCA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJbXV0ZXhfaW5pdCgmcHJ0ZC0+bG9jayk7Ci0JCXNwaW5fbG9ja19pbml0KCZwcnRkLT5kc3BfbG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBydGQtPm91dF93YWl0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJnBydGQtPm91dF9xdWV1ZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZwcnRkLT5mcmVlX291dF9xdWV1ZSk7Ci0KLQkJcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlOwotCi0JCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2luZm8oInNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZFxuIik7Ci0KLQkJcHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JCXBydGQtPmNhcHR1cmVfaW5zdGFuY2UrKzsKLQkJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IE5VTEw7Ci0Jc3RydWN0IGR0bWZfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmNfZG1hX2J1ZjsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKmNfc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7Ci0KLQlwcl9kZWJ1ZygiJXMoKSBEVE1GXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCQl3YWtlX3VwKCZwcnRkLT5vdXRfd2FpdCk7Ci0KLQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJCXBydGQtPmNhcHR1cmVfaW5zdGFuY2UtLTsKLQotCQlpZiAoIXBydGQtPmNhcHR1cmVfaW5zdGFuY2UpIHsKLQkJCWlmIChwcnRkLT5zdGF0ZSA9PSBEVE1GX0dFTl9SWF9TVEFSVEVEKSB7Ci0JCQkJcHJ0ZC0+c3RhdGUgPSBEVE1GX0dFTl9SWF9TVE9QUEVEOwotCQkJCXZvY19kaXNhYmxlX2R0bWZfZGV0X29uX2FjdGl2ZV9zZXNzaW9ucygpOwotCQkJCXZvY19yZWdpc3Rlcl9kdG1mX3J4X2RldGVjdGlvbl9jYihOVUxMLCBOVUxMKTsKLQkJCX0KLQkJCS8qIHJlbGVhc2UgYWxsIGJ1ZmZlciAqLwotCQkJLyogcmVsZWFzZSBvdXRfcXVldWUgYW5kIGZyZWVfb3V0X3F1ZXVlICovCi0JCQlwcl9kZWJ1ZygicmVsZWFzZSBhbGwgYnVmZmVyXG4iKTsKLQkJCWNfc3Vic3RyZWFtID0gcHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW07Ci0JCQlpZiAoY19zdWJzdHJlYW0gPT0gTlVMTCkgewotCQkJCXByX2RlYnVnKCJjX3N1YnN0cmVhbSBpcyBOVUxMXG4iKTsKLQkJCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQljX2RtYV9idWYgPSAmY19zdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JCQlpZiAoY19kbWFfYnVmID09IE5VTEwpIHsKLQkJCQlwcl9kZWJ1ZygiY19kbWFfYnVmIGlzIE5VTEwuXG4iKTsKLQkJCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQlpZiAoY19kbWFfYnVmLT5hcmVhICE9IE5VTEwpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCQkJCQkmcHJ0ZC0+b3V0X3F1ZXVlKSB7Ci0JCQkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsCi0JCQkJCQkgICBzdHJ1Y3QgZHRtZl9idWZfbm9kZSwgbGlzdCk7Ci0JCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQkJfQotCi0JCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJCQkJCSAgICZwcnRkLT5mcmVlX291dF9xdWV1ZSkgewotCQkJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQkJICAgc3RydWN0IGR0bWZfYnVmX25vZGUsIGxpc3QpOwotCQkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQkJCX0KLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF9sb2NrLAotCQkJCQkJICAgICAgIGRzcF9mbGFncyk7Ci0JCQkJZG1hX2ZyZWVfY29oZXJlbnQoY19zdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LAotCQkJCQkJICBydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4LAotCQkJCQkJICBjX2RtYV9idWYtPmFyZWEsCi0JCQkJCQkgIGNfZG1hX2J1Zi0+YWRkcik7Ci0JCQkJY19kbWFfYnVmLT5hcmVhID0gTlVMTDsKLQkJCX0KLQkJfQotCQlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgZHRtZl9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYV9idWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCXN0cnVjdCBkdG1mX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0JaW50IGkgPSAwLCBvZmZzZXQgPSAwOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBEVE1GXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQkJZG1hX2J1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7Ci0JCWRtYV9idWYtPmRldi5kZXYgPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2OwotCQlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCi0JCWRtYV9idWYtPmFyZWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCQkJCXJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgsCi0JCQkJCQkmZG1hX2J1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghZG1hX2J1Zi0+YXJlYSkgewotCQkJcHJfZXJyKCIlczpNU00gRFRNRiBkbWFfYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlkbWFfYnVmLT5ieXRlcyA9IHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXg7Ci0JCW1lbXNldChkbWFfYnVmLT5hcmVhLCAwLCBydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4KTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgRFRNRl9NQVhfUV9MRU47IGkrKykgewotCQkJcHJfZGVidWcoIm5vZGUgPSVkXG4iLCBpKTsKLQkJCWJ1Zl9ub2RlID0gKHZvaWQgKikgZG1hX2J1Zi0+YXJlYSArIG9mZnNldDsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LAotCQkJCSAgICAgICZwcnRkLT5mcmVlX291dF9xdWV1ZSk7Ci0JCQlvZmZzZXQgPSBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGR0bWZfYnVmX25vZGUpOwotCQl9Ci0KLQkJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQkJbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcl9kZWJ1ZygiJXM6IERUTUZcbiIsIF9fZnVuY19fKTsKLQlwcnRkLT5wY21fY2FwdHVyZV9zaXplICA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCXBydGQtPnBjbV9jYXB0dXJlX2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0JcHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyA9IDA7Ci0JcHJ0ZC0+cGNtX2NhcHR1cmVfYnVmX3BvcyA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcl9kZWJ1ZygiJXM6IERUTUZcbiIsIF9fZnVuY19fKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKLQkJbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7Ci0KLQkJbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3Vic3RyZWFtKTsKLQotCQlpZiAocnVudGltZS0+Zm9ybWF0ICE9IEZPUk1BVF9TMTZfTEUpIHsKLQkJCXByX2VycigiZm9ybWF0OiV1IGRvZXNuJ3QgbWF0Y2ggJWRcbiIsCi0JCQkgICAgICAgKHVpbnQzMl90KXJ1bnRpbWUtPmZvcm1hdCwgRk9STUFUX1MxNl9MRSk7Ci0JCQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAocHJ0ZC0+Y2FwdHVyZV9pbnN0YW5jZSAmJgotCQkJKHBydGQtPnN0YXRlICE9IERUTUZfR0VOX1JYX1NUQVJURUQpKSB7Ci0JCQl2b2NfcmVnaXN0ZXJfZHRtZl9yeF9kZXRlY3Rpb25fY2IoZHRtZl9yeF9kZXRlY3RlZF9jYiwKLQkJCQkJCQkgIHBydGQpOwotCQkJcHJ0ZC0+c3RhdGUgPSBEVE1GX0dFTl9SWF9TVEFSVEVEOwotCQl9Ci0JCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGR0bWZfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCXByX2RlYnVnKCIlczogVHJpZ2dlciBzdGFydFxuIiwgX19mdW5jX18pOwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQkJcHJ0ZC0+Y2FwdHVyZV9zdGFydCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoIlNORFJWX1BDTV9UUklHR0VSX1NUT1BcbiIpOwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQkJcHJ0ZC0+Y2FwdHVyZV9zdGFydCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc25kX3BjbV91ZnJhbWVzX3QgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBkdG1mX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlpZiAocHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyA+PSBwcnRkLT5wY21fY2FwdHVyZV9zaXplKQotCQkJcHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyA9IDA7Ci0JCXJldCA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCAocHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcykpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbXNtX3BjbV9vcGVuLAotCS5jb3B5CQk9IG1zbV9wY21fY29weSwKLQkuaHdfcGFyYW1zCT0gbXNtX3BjbV9od19wYXJhbXMsCi0JLmNsb3NlICAgICAgICAgID0gbXNtX3BjbV9jbG9zZSwKLQkucHJlcGFyZSAgICAgICAgPSBtc21fcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgICAgICAgID0gbXNtX3BjbV90cmlnZ2VyLAotCS5wb2ludGVyICAgICAgICA9IG1zbV9wY21fcG9pbnRlciwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2Fzb2NfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCi0JCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKLQkub3BzCQk9ICZtc21fcGNtX29wcywKLQkucGNtX25ldwk9IG1zbV9hc29jX3BjbV9uZXcsCi0JLnByb2JlCQk9IG1zbV9wY21fZHRtZl9wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0KLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCQkgJm1zbV9zb2NfcGxhdGZvcm0pOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fcGNtX2R0bWZfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLWR0bWYifSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX3BjbV9kdG1mX2R0X21hdGNoKTsKLQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tcGNtLWR0bWYiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3BjbV9kdG1mX2R0X21hdGNoLAotCX0sCi0JLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiRFRNRiBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWhvc3Qtdm9pY2UtdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWhvc3Qtdm9pY2UtdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2MGRiOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1ob3N0LXZvaWNlLXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Ci0jaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSAicTZ2b2ljZS5oIgotCi0jZGVmaW5lIEhQQ01fTUFYX1FfTEVOIDIKLSNkZWZpbmUgSFBDTV9NSU5fVk9DX1BLVF9TSVpFIDMyMAotI2RlZmluZSBIUENNX01BWF9WT0NfUEtUX1NJWkUgNjQwCi0jZGVmaW5lIFZIUENNX0JMT0NLX1NJWkUgNDA5NgotI2RlZmluZSBDQUNIRV9BTElHTk1FTlRfU0laRSAxMjgKLSNkZWZpbmUgQ0FDSEVfQUxJR05NRU5UX01BU0sgMHhGRkZGRkY4MAotCi0jZGVmaW5lIFZPSUNFX1RYX0NBUFRVUkVfREFJX0lEICAiQ1MtVk9JQ0UgSE9TVCBUWCBDQVBUVVJFIgotI2RlZmluZSBWT0lDRV9UWF9QTEFZQkFDS19EQUlfSUQgIkNTLVZPSUNFIEhPU1QgVFggUExBWUJBQ0siCi0jZGVmaW5lIFZPSUNFX1JYX0NBUFRVUkVfREFJX0lEICAiQ1MtVk9JQ0UgSE9TVCBSWCBDQVBUVVJFIgotI2RlZmluZSBWT0lDRV9SWF9QTEFZQkFDS19EQUlfSUQgIkNTLVZPSUNFIEhPU1QgUlggUExBWUJBQ0siCi0KLSNkZWZpbmUgVk9MVEVfVFhfQ0FQVFVSRV9EQUlfSUQgICJWT0xURSBIT1NUIFRYIENBUFRVUkUiCi0jZGVmaW5lIFZPTFRFX1RYX1BMQVlCQUNLX0RBSV9JRCAiVk9MVEUgSE9TVCBUWCBQTEFZQkFDSyIKLSNkZWZpbmUgVk9MVEVfUlhfQ0FQVFVSRV9EQUlfSUQgICJWT0xURSBIT1NUIFJYIENBUFRVUkUiCi0jZGVmaW5lIFZPTFRFX1JYX1BMQVlCQUNLX0RBSV9JRCAiVk9MVEUgSE9TVCBSWCBQTEFZQkFDSyIKLQotCi0jZGVmaW5lIFZvTU1vZGUxX1RYX0NBUFRVUkVfREFJX0lEICAiVm9pY2VNTW9kZTEgSE9TVCBUWCBDQVBUVVJFIgotI2RlZmluZSBWb01Nb2RlMV9UWF9QTEFZQkFDS19EQUlfSUQgIlZvaWNlTU1vZGUxIEhPU1QgVFggUExBWUJBQ0siCi0jZGVmaW5lIFZvTU1vZGUxX1JYX0NBUFRVUkVfREFJX0lEICAiVm9pY2VNTW9kZTEgSE9TVCBSWCBDQVBUVVJFIgotI2RlZmluZSBWb01Nb2RlMV9SWF9QTEFZQkFDS19EQUlfSUQgIlZvaWNlTU1vZGUxIEhPU1QgUlggUExBWUJBQ0siCi0KLSNkZWZpbmUgVm9NTW9kZTJfVFhfQ0FQVFVSRV9EQUlfSUQgICJWb2ljZU1Nb2RlMiBIT1NUIFRYIENBUFRVUkUiCi0jZGVmaW5lIFZvTU1vZGUyX1RYX1BMQVlCQUNLX0RBSV9JRCAiVm9pY2VNTW9kZTIgSE9TVCBUWCBQTEFZQkFDSyIKLSNkZWZpbmUgVm9NTW9kZTJfUlhfQ0FQVFVSRV9EQUlfSUQgICJWb2ljZU1Nb2RlMiBIT1NUIFJYIENBUFRVUkUiCi0jZGVmaW5lIFZvTU1vZGUyX1JYX1BMQVlCQUNLX0RBSV9JRCAiVm9pY2VNTW9kZTIgSE9TVCBSWCBQTEFZQkFDSyIKLQotZW51bSB7Ci0JUlggPSAxLAotCVRYLAotfTsKLQotZW51bSB7Ci0JVk9JQ0VfSU5ERVggPSAwLAotCVZPTFRFX0lOREVYLAotCVZPTU1PREUxX0lOREVYLAotCVZPTU1PREUyX0lOREVYLAotCU1BWF9TRVNTSU9OCi19OwotCi1lbnVtIGhwY21fc3RhdGUgewotCUhQQ01fU1RPUFBFRCA9IDEsCi0JSFBDTV9DTE9TRUQsCi0JSFBDTV9QUkVQQVJFRCwKLQlIUENNX1NUQVJURUQsCi19OwotCi1zdHJ1Y3QgaHBjbV9mcmFtZSB7Ci0JdWludDMyX3QgbGVuOwotCXVpbnQ4X3Qgdm9jX3BrdFtIUENNX01BWF9WT0NfUEtUX1NJWkVdOwotfTsKLQotc3RydWN0IGhwY21fYnVmX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaHBjbV9mcmFtZSBmcmFtZTsKLX07Ci0KLXN0cnVjdCB2b2NwY21faW9uX2J1ZmZlciB7Ci0JLyogUGh5c2ljYWwgYWRkcmVzcyAqLwotCXBoeXNfYWRkcl90IHBhZGRyOwotCS8qIEtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KLQl2b2lkICprdmFkZHI7Ci19OwotCi1zdHJ1Y3QgZGFpX2RhdGEgewotCWVudW0gIGhwY21fc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IGxpc3RfaGVhZCBmaWxsZWRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX3F1ZXVlOwotCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlX3dhaXQ7Ci0Jc3BpbmxvY2tfdCBkc3BfbG9jazsKLQl1aW50MzJfdCBwY21fc2l6ZTsKLQl1aW50MzJfdCBwY21fY291bnQ7Ci0JLyogSVJRIHBvc2l0aW9uICovCi0JdWludDMyX3QgcGNtX2lycV9wb3M7Ci0JLyogUG9zaXRpb24gaW4gYnVmZmVyICovCi0JdWludDMyX3QgcGNtX2J1Zl9wb3M7Ci0Jc3RydWN0IHZvY3BjbV9pb25fYnVmZmVyIHZvY3BjbV9pb25fYnVmZmVyOwotfTsKLQotc3RydWN0IHRhcF9wb2ludCB7Ci0Jc3RydWN0IGRhaV9kYXRhIHBsYXliYWNrX2RhaV9kYXRhOwotCXN0cnVjdCBkYWlfZGF0YSBjYXB0dXJlX2RhaV9kYXRhOwotfTsKLQotc3RydWN0IHNlc3Npb24gewotCXN0cnVjdCB0YXBfcG9pbnQgdHhfdGFwX3BvaW50OwotCXN0cnVjdCB0YXBfcG9pbnQgcnhfdGFwX3BvaW50OwotCXBoeXNfYWRkcl90IHNlc3NfcGFkZHI7Ci0Jdm9pZCAqc2Vzc19rdmFkZHI7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGU7Ci0Jc3RydWN0IG1lbV9tYXBfdGFibGUgdHBfbWVtX3RhYmxlOwotfTsKLQotc3RydWN0IHRhcHBudF9teHJfZGF0YSB7Ci0JYm9vbCBlbmFibGU7Ci0JdWludDE2X3QgZGlyZWN0aW9uOwotCXVpbnQxNl90IHNhbXBsZV9yYXRlOwotfTsKLQotLyogVmFsdWVzIGZyb20gbWl4ZXIgY3RsIGFyZSBjYWNoZWQgaW4gdGhpcyBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBtaXhlcl9jb25mIHsKLQlpbnQ4X3Qgc2Vzc19pbmR4OwotCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgcng7Ci0Jc3RydWN0IHRhcHBudF9teHJfZGF0YSB0eDsKLX07Ci0KLXN0cnVjdCBzdGFydF9jbWQgewotCXN0cnVjdCB2c3NfaXZwY21fdGFwX3BvaW50IHRhcF9wbnRbMl07Ci0JdWludDMyX3Qgbm9fb2ZfdGFwb2ludHM7Ci19OwotCi1zdHJ1Y3QgaHBjbV9kcnYgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXN0cnVjdCBzZXNzaW9uIHNlc3Npb25bTUFYX1NFU1NJT05dOwotCXN0cnVjdCBtaXhlcl9jb25mIG1peGVyX2NvbmY7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmlvbl9jbGllbnQ7Ci0Jc3RydWN0IHN0YXJ0X2NtZCBzdGFydF9jbWQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGhwY21fZHJ2IGhwY21fZHJ2OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbXNtX3BjbV9oYXJkd2FyZSA9IHsKLQkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEKSwKLQkuZm9ybWF0cyA9ICAgICAgICAgICAgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TUEVDSUFMLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAotCS5yYXRlX21heCA9ICAgICAgICAgICAgIDE2MDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgMSwKLQkuYnVmZmVyX2J5dGVzX21heCA9CXNpemVvZihzdHJ1Y3QgaHBjbV9idWZfbm9kZSkgKiBIUENNX01BWF9RX0xFTiwKLQkucGVyaW9kX2J5dGVzX21pbiA9CUhQQ01fTUlOX1ZPQ19QS1RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21heCA9CUhQQ01fTUFYX1ZPQ19QS1RfU0laRSwKLQkucGVyaW9kc19taW4gPQkJSFBDTV9NQVhfUV9MRU4sCi0JLnBlcmlvZHNfbWF4ID0JCUhQQ01fTUFYX1FfTEVOLAotCS5maWZvX3NpemUgPSAgICAgICAgICAgIDAsCi19OwotCi1zdGF0aWMgY2hhciAqaHBjbV9nZXRfc2Vzc19uYW1lKGludCBzZXNzX2luZHgpCi17Ci0JY2hhciAqc2Vzc19uYW1lID0gTlVMTDsKLQotCWlmIChzZXNzX2luZHggPT0gVk9JQ0VfSU5ERVgpCi0JCXNlc3NfbmFtZSA9IFZPSUNFX1NFU1NJT05fTkFNRTsKLQllbHNlIGlmIChzZXNzX2luZHggPT0gVk9MVEVfSU5ERVgpCi0JCXNlc3NfbmFtZSA9IFZPTFRFX1NFU1NJT05fTkFNRTsKLQllbHNlIGlmIChzZXNzX2luZHggPT0gVk9NTU9ERTFfSU5ERVgpCi0JCXNlc3NfbmFtZSA9IFZPSUNFTU1PREUxX05BTUU7Ci0JZWxzZSBpZiAoc2Vzc19pbmR4ID09IFZPTU1PREUyX0lOREVYKQotCQlzZXNzX25hbWUgPSBWT0lDRU1NT0RFMl9OQU1FOwotCWVsc2UKLQkJcHJfZXJyKCIlczosIEludmFsaWQgc2Vzc19pbmRleFxuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIHNlc3NfbmFtZTsKLX0KLQotc3RhdGljIHZvaWQgaHBjbV9yZXNldF9taXhlcl9jb25maWcoc3RydWN0IGhwY21fZHJ2ICpwcnRkKQotewotCXBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4ID0gLTE7Ci0JcHJ0ZC0+bWl4ZXJfY29uZi5yeC5lbmFibGUgPSBmYWxzZTsKLQlwcnRkLT5taXhlcl9jb25mLnJ4LmRpcmVjdGlvbiA9IC0xOwotCXBydGQtPm1peGVyX2NvbmYucnguc2FtcGxlX3JhdGUgPSAwOwotCi0JcHJ0ZC0+bWl4ZXJfY29uZi50eC5lbmFibGUgPSBmYWxzZTsKLQlwcnRkLT5taXhlcl9jb25mLnR4LmRpcmVjdGlvbiA9IC0xOwotCXBydGQtPm1peGVyX2NvbmYudHguc2FtcGxlX3JhdGUgPSAwOwotfQotCi0vKiBDaGVjayBmb3IgdmFsaWQgbWl4ZXIgY29udHJvbCB2YWx1ZXMgKi8KLXN0YXRpYyBib29sIGhwY21faXNfdmFsaWRfY29uZmlnKGludCBzZXNzX2luZHgsIGludCB0YXBfcG9pbnQsCi0JCQkJIHVpbnQxNl90IGRpcmVjdGlvbiwgdWludDE2X3Qgc2FtcGxlcmF0ZSkKLXsKLQlpZiAoc2Vzc19pbmR4IDwgVk9JQ0VfSU5ERVggfHwgc2Vzc19pbmR4ID4gVk9NTU9ERTJfSU5ERVgpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzX2luZHggOiVkXG4iLCBfX2Z1bmNfXywgc2Vzc19pbmR4KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpZiAoc2FtcGxlcmF0ZSAhPSBWU1NfSVZQQ01fU0FNUExJTkdfUkFURV84SyAmJgotCSAgICBzYW1wbGVyYXRlICE9IFZTU19JVlBDTV9TQU1QTElOR19SQVRFXzE2SykgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNhbXBsZSByYXRlIDolZFxuIiwgX19mdW5jX18sIHNhbXBsZXJhdGUpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmICgodGFwX3BvaW50ICE9IFJYKSAmJiAodGFwX3BvaW50ICE9IFRYKSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHRhcHBvaW50IDolZFxuIiwgX19mdW5jX18sIHRhcF9wb2ludCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWYgKChkaXJlY3Rpb24gIT0gVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfSU4pICYmCi0JICAgIChkaXJlY3Rpb24gIT0gVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfT1VUKSAmJgotCSAgICAoZGlyZWN0aW9uICE9IFZTU19JVlBDTV9UQVBfUE9JTlRfRElSX09VVF9JTikpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBkaXJlY3Rpb24gOiVkXG4iLCBfX2Z1bmNfXywgZGlyZWN0aW9uKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotZXJyb3I6Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGFpX2RhdGEgKmhwY21fZ2V0X2RhaV9kYXRhKGNoYXIgKnBjbV9pZCwgc3RydWN0IGhwY21fZHJ2ICpwcnRkKQotewotCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCXNpemVfdCBzaXplID0gMDsKLQotCWlmIChwY21faWQpIHsKLQkJc2l6ZSA9IHN0cmxlbihwY21faWQpOwotCQkvKiBDaGVjayBmb3IgVm9pY2UgREFJICovCi0JCWlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJZGFpX2RhdGEgPQotCQkmcHJ0ZC0+c2Vzc2lvbltWT0lDRV9JTkRFWF0udHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0lDRV9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCWRhaV9kYXRhID0KLQkJJnBydGQtPnNlc3Npb25bVk9JQ0VfSU5ERVhdLnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0lDRV9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGE7Ci0JCS8qIENoZWNrIGZvciBWb0xURSBEQUkgKi8KLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTFRFX0lOREVYXS50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJZGFpX2RhdGEgPQotCQkmcHJ0ZC0+c2Vzc2lvbltWT0xURV9JTkRFWF0udHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0xURV9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCWRhaV9kYXRhID0KLQkJJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0xURV9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTFRFX0lOREVYXS5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGE7Ci0JCS8qIGNoZWNrIGZvciBWb2ljZU1Nb2RlMSBEQUkgKi8KLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJZGFpX2RhdGEgPQotCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMV9JTkRFWF0udHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCWRhaV9kYXRhID0KLQkJJnBydGQtPnNlc3Npb25bVk9NTU9ERTFfSU5ERVhdLnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGE7Ci0JCS8qIGNoZWNrIGZvciBWT2ljZU1Nb2RlMiBEQUkgKi8KLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUyX0lOREVYXS50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJZGFpX2RhdGEgPQotCQkmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0udHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCWRhaV9kYXRhID0KLQkJJnBydGQtPnNlc3Npb25bVk9NTU9ERTJfSU5ERVhdLnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQlkYWlfZGF0YSA9Ci0JCSZwcnRkLT5zZXNzaW9uW1ZPTU1PREUyX0lOREVYXS5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGE7Ci0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFdyb25nIGRhaSBpZFxuIiwgX19mdW5jX18pOwotCQl9Ci0JfQotCi0JcmV0dXJuIGRhaV9kYXRhOwotfQotCi1zdGF0aWMgc3RydWN0IHRhcF9wb2ludCAqaHBjbV9nZXRfdGFwcG9pbnRfZGF0YShjaGFyICpwY21faWQsCi0JCQkJCQlzdHJ1Y3QgaHBjbV9kcnYgKnBydGQpCi17Ci0Jc3RydWN0IHRhcF9wb2ludCAqdHAgPSBOVUxMOwotCXNpemVfdCBzaXplID0gMDsKLQotCWlmIChwY21faWQpIHsKLQkJc2l6ZSA9IHN0cmxlbihwY21faWQpOwotCQkvKiBDaGVjayBmb3IgVm9pY2UgREFJICovCi0JCWlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS50eF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9JQ0VfSU5ERVhdLnR4X3RhcF9wb2ludDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPSUNFX0lOREVYXS5yeF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1JYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9JQ0VfSU5ERVhdLnJ4X3RhcF9wb2ludDsKLQkJLyogQ2hlY2sgZm9yIFZvTFRFIERBSSAqLwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0xURV9UWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnR4X3RhcF9wb2ludDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfVFhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT0xURV9JTkRFWF0udHhfdGFwX3BvaW50OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWT0xURV9SWF9DQVBUVVJFX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9MVEVfSU5ERVhdLnJ4X3RhcF9wb2ludDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVk9MVEVfUlhfUExBWUJBQ0tfREFJX0lELCBzaXplKSkgewotCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT0xURV9JTkRFWF0ucnhfdGFwX3BvaW50OwotCQkvKiBjaGVjayBmb3IgVm9pY2VNTW9kZTEgKi8KLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS50eF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1RYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9NTU9ERTFfSU5ERVhdLnR4X3RhcF9wb2ludDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfUlhfQ0FQVFVSRV9EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUxX0lOREVYXS5yeF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUxX1JYX1BMQVlCQUNLX0RBSV9JRCwgc2l6ZSkpIHsKLQkJCXRwID0gJnBydGQtPnNlc3Npb25bVk9NTU9ERTFfSU5ERVhdLnJ4X3RhcF9wb2ludDsKLQkJLyogY2hlY2sgZm9yIFZvaWNlTU1vZGUyICovCi0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgewotCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0udHhfdGFwX3BvaW50OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9UWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUyX0lOREVYXS50eF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1JYX0NBUFRVUkVfREFJX0lELCBzaXplKSkgewotCQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltWT01NT0RFMl9JTkRFWF0ucnhfdGFwX3BvaW50OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMl9SWF9QTEFZQkFDS19EQUlfSUQsIHNpemUpKSB7Ci0JCQl0cCA9ICZwcnRkLT5zZXNzaW9uW1ZPTU1PREUyX0lOREVYXS5yeF90YXBfcG9pbnQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB3cm9uZyBkYWkgaWRcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLQotCXJldHVybiB0cDsKLX0KLQotc3RhdGljIHN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKmhwY21fZ2V0X3RhcHBudF9taXhlcl9kYXRhKGNoYXIgKnBjbV9pZCwKLQkJCQkJCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKLXsKLQotCWlmIChzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfVFhfQ0FQVFVSRV9EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAotCSAgICBzdHJuc3RyKHBjbV9pZCwgVk9JQ0VfVFhfUExBWUJBQ0tfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKLQkgICAgc3RybnN0cihwY21faWQsIFZPTFRFX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKLQkgICAgc3RybnN0cihwY21faWQsIFZPTFRFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8Ci0JICAgIHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9UWF9DQVBUVVJFX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8Ci0JICAgIHN0cm5zdHIocGNtX2lkLCBWb01Nb2RlMV9UWF9QTEFZQkFDS19EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAotCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfVFhfQ0FQVFVSRV9EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAotCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTJfVFhfUExBWUJBQ0tfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkpIHsKLQkJcmV0dXJuICZwcnRkLT5taXhlcl9jb25mLnR4OwotCX0gZWxzZSB7Ci0JCXJldHVybiAmcHJ0ZC0+bWl4ZXJfY29uZi5yeDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3RhcHBudF92YWx1ZShjaGFyICpwY21faWQpCi17Ci0KLQlpZiAoc3RybnN0cihwY21faWQsIFZPSUNFX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKLQkgICAgc3RybnN0cihwY21faWQsIFZPSUNFX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8Ci0JICAgIHN0cm5zdHIocGNtX2lkLCBWT0xURV9UWF9DQVBUVVJFX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpIHx8Ci0JICAgIHN0cm5zdHIocGNtX2lkLCBWT0xURV9UWF9QTEFZQkFDS19EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAotCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfQ0FQVFVSRV9EQUlfSUQsIHN0cmxlbihwY21faWQpKSB8fAotCSAgICBzdHJuc3RyKHBjbV9pZCwgVm9NTW9kZTFfVFhfUExBWUJBQ0tfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKLQkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX0NBUFRVUkVfREFJX0lELCBzdHJsZW4ocGNtX2lkKSkgfHwKLQkgICAgc3RybnN0cihwY21faWQsIFZvTU1vZGUyX1RYX1BMQVlCQUNLX0RBSV9JRCwgc3RybGVuKHBjbV9pZCkpKSB7Ci0JCXJldHVybiBUWDsKLQl9IGVsc2UgewotCQlyZXR1cm4gUlg7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBocGNtX2FsbF9kYWlzX2FyZV9yZWFkeSh1aW50MTZfdCBkaXJlY3Rpb24sIHN0cnVjdCB0YXBfcG9pbnQgKnRwLAotCQkJCSAgICBlbnVtIGhwY21fc3RhdGUgc3RhdGUpCi17Ci0JYm9vbCBkYWlzX3N0YXJ0ZWQgPSBmYWxzZTsKLQotCS8qCi0JICogQmFzZWQgb24gdGhlIGRpcmVjdGlvbiBzZXQgcGVyIHRhcCBwb2ludCBpbiB0aGUgbWl4ZXIgY29udHJvbCwKLQkgKiBhbGwgdGhlIGRhaXMgcGVyIHRhcCBwb2ludCBzaG91bGQgbWVldCB0aGUgcmVxdWlyZWQgc3RhdGUgZm9yIHRoZQotCSAqIGNvbW1hbmRzIHN1Y2ggYXMgdnBjbV9tYXBfbWVtb3J5L3ZwY21fc3RhcnQgdG8gYmUgZXhlY3V0ZWQuCi0JICovCi0Jc3dpdGNoIChkaXJlY3Rpb24pIHsKLQljYXNlIFZTU19JVlBDTV9UQVBfUE9JTlRfRElSX09VVF9JTjoKLQkJaWYgKCh0cC0+cGxheWJhY2tfZGFpX2RhdGEuc3RhdGUgPj0gc3RhdGUpICYmCi0JCSAgICAodHAtPmNhcHR1cmVfZGFpX2RhdGEuc3RhdGUgPj0gc3RhdGUpKSB7Ci0JCQlkYWlzX3N0YXJ0ZWQgPSB0cnVlOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9JTjoKLQkJaWYgKHRwLT5wbGF5YmFja19kYWlfZGF0YS5zdGF0ZSA+PSBzdGF0ZSkKLQkJCWRhaXNfc3RhcnRlZCA9IHRydWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVQ6Ci0JCWlmICh0cC0+Y2FwdHVyZV9kYWlfZGF0YS5zdGF0ZSA+PSBzdGF0ZSkKLQkJCWRhaXNfc3RhcnRlZCA9IHRydWU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCJpbnZhbGlkIGRpcmVjdGlvblxuIik7Ci0JfQotCi0JcmV0dXJuIGRhaXNfc3RhcnRlZDsKLX0KLQotc3RhdGljIHZvaWQgaHBjbV9jcmVhdGVfZnJlZV9xdWV1ZShzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYV9idWYsCi0JCQkJICAgc3RydWN0IGRhaV9kYXRhICpkYWlfZGF0YSkKLXsKLQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCWludCBpID0gMCwgb2Zmc2V0ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBIUENNX01BWF9RX0xFTjsgaSsrKSB7Ci0JCWJ1Zl9ub2RlID0gKHZvaWQgKilkbWFfYnVmLT5hcmVhICsgb2Zmc2V0OwotCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCSAgICAgICZkYWlfZGF0YS0+ZnJlZV9xdWV1ZSk7Ci0JCW9mZnNldCA9IG9mZnNldCArIHNpemVvZihzdHJ1Y3QgaHBjbV9idWZfbm9kZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBocGNtX2ZyZWVfYWxsb2NhdGVkX21lbShzdHJ1Y3QgaHBjbV9kcnYgKnBydGQpCi17Ci0JcGh5c19hZGRyX3QgcGFkZHIgPSAwOwotCXN0cnVjdCB0YXBfcG9pbnQgKnR4dHAgPSBOVUxMOwotCXN0cnVjdCB0YXBfcG9pbnQgKnJ4dHAgPSBOVUxMOwotCXN0cnVjdCBzZXNzaW9uICpzZXNzID0gTlVMTDsKLQotCXNlc3MgPSAmcHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF07Ci0JdHh0cCA9ICZzZXNzLT50eF90YXBfcG9pbnQ7Ci0Jcnh0cCA9ICZzZXNzLT5yeF90YXBfcG9pbnQ7Ci0JcGFkZHIgPSBzZXNzLT5zZXNzX3BhZGRyOwotCi0JaWYgKHBhZGRyKSB7Ci0JCW1zbV9hdWRpb19pb25fZnJlZShwcnRkLT5pb25fY2xpZW50LCBzZXNzLT5pb25faGFuZGxlKTsKLQkJcHJ0ZC0+aW9uX2NsaWVudCA9IE5VTEw7Ci0JCXNlc3MtPmlvbl9oYW5kbGUgPSBOVUxMOwotCQltc21fYXVkaW9faW9uX2ZyZWUoc2Vzcy0+dHBfbWVtX3RhYmxlLmNsaWVudCwKLQkJCQkgICBzZXNzLT50cF9tZW1fdGFibGUuaGFuZGxlKTsKLQkJc2Vzcy0+dHBfbWVtX3RhYmxlLmNsaWVudCA9IE5VTEw7Ci0JCXNlc3MtPnRwX21lbV90YWJsZS5oYW5kbGUgPSBOVUxMOwotCQlzZXNzLT5zZXNzX3BhZGRyID0gMDsKLQkJc2Vzcy0+c2Vzc19rdmFkZHIgPSAwOwotCQlzZXNzLT5pb25faGFuZGxlID0gMDsKLQkJcHJ0ZC0+aW9uX2NsaWVudCA9IDA7Ci0JCXNlc3MtPnRwX21lbV90YWJsZS5jbGllbnQgPSAwOwotCQlzZXNzLT50cF9tZW1fdGFibGUuaGFuZGxlID0gMDsKLQotCQl0eHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0gMDsKLQkJdHh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIgPSAwOwotCi0JCXR4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0gMDsKLQkJdHh0cC0+cGxheWJhY2tfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0gMDsKLQotCQlyeHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0gMDsKLQkJcnh0cC0+Y2FwdHVyZV9kYWlfZGF0YS52b2NwY21faW9uX2J1ZmZlci5rdmFkZHIgPSAwOwotCi0JCXJ4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0gMDsKLQkJcnh0cC0+cGxheWJhY2tfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0gMDsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXMsIHBhZGRyID0gMCwgbm90aGluZyB0byBmcmVlXG4iLCBfX2Z1bmNfXyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBocGNtX3VubWFwX2FuZF9mcmVlX3NoYXJlZF9tZW1vcnkoc3RydWN0IGhwY21fZHJ2ICpwcnRkKQotCi17Ci0JcGh5c19hZGRyX3QgcGFkZHIgPSAwOwotCWNoYXIgKnNlc3NfbmFtZSA9IGhwY21fZ2V0X3Nlc3NfbmFtZShwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keCk7Ci0KLQlpZiAocHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHggPj0gMCkKLQkJcGFkZHIgPSBwcnRkLT5zZXNzaW9uW3BydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4XS5zZXNzX3BhZGRyOwotCWVsc2UKLQkJcGFkZHIgPSAwOwotCi0JaWYgKHBhZGRyKSB7Ci0JCXZvY19zZW5kX2N2cF91bm1hcF92b2NwY21fbWVtb3J5KHZvY19nZXRfc2Vzc2lvbl9pZChzZXNzX25hbWUpKTsKLQkJaHBjbV9mcmVlX2FsbG9jYXRlZF9tZW0ocHJ0ZCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzLCBwYWRkciA9IDAsIG5vdGhpbmcgdG8gdW5tYXAvZnJlZVxuIiwgX19mdW5jX18pOwotCX0KLX0KLQotc3RhdGljIGludCBocGNtX21hcF92b2NwY21fbWVtb3J5KHN0cnVjdCBocGNtX2RydiAqcHJ0ZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQljaGFyICpzZXNzX25hbWUgPSBocGNtX2dldF9zZXNzX25hbWUocHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHgpOwotCXN0cnVjdCBzZXNzaW9uICpzZXNzID0gTlVMTDsKLQotCXNlc3MgPSAmcHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF07Ci0KLQlyZXQgPSB2b2Nfc2VuZF9jdnBfbWFwX3ZvY3BjbV9tZW1vcnkodm9jX2dldF9zZXNzaW9uX2lkKHNlc3NfbmFtZSksCi0JCQkJCSAgICAgJnNlc3MtPnRwX21lbV90YWJsZSwKLQkJCQkJICAgICBzZXNzLT5zZXNzX3BhZGRyLAotCQkJCQkgICAgIFZIUENNX0JMT0NLX1NJWkUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBocGNtX2FsbG9jYXRlX3NoYXJlZF9tZW1vcnkoc3RydWN0IGhwY21fZHJ2ICpwcnRkKQotewotCWludCByZXN1bHQ7Ci0JaW50IHJldCA9IDA7Ci0Jc2l6ZV90IG1lbV9sZW47Ci0Jc2l6ZV90IGxlbjsKLQlzdHJ1Y3QgdGFwX3BvaW50ICp0eHRwID0gTlVMTDsKLQlzdHJ1Y3QgdGFwX3BvaW50ICpyeHRwID0gTlVMTDsKLQlzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcyA9IE5VTEw7Ci0KLQlzZXNzID0gJnBydGQtPnNlc3Npb25bcHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHhdOwotCXR4dHAgPSAmc2Vzcy0+dHhfdGFwX3BvaW50OwotCXJ4dHAgPSAmc2Vzcy0+cnhfdGFwX3BvaW50OwotCi0JcmVzdWx0ID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiaG9zdF9wY21fYnVmZmVyIiwKLQkJCQkgICAgICZwcnRkLT5pb25fY2xpZW50LAotCQkJCSAgICAgJnNlc3MtPmlvbl9oYW5kbGUsCi0JCQkJICAgICBWSFBDTV9CTE9DS19TSVpFLAotCQkJCSAgICAgJnNlc3MtPnNlc3NfcGFkZHIsCi0JCQkJICAgICAmbWVtX2xlbiwKLQkJCQkgICAgICZzZXNzLT5zZXNzX2t2YWRkcik7Ci0JaWYgKHJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBtc21fYXVkaW9faW9uX2FsbG9jIGVycm9yLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCXNlc3MtPnNlc3NfcGFkZHIgPSAwOwotCQlzZXNzLT5zZXNzX2t2YWRkciA9IDA7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBIb3N0IFBDTSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1fbWFwX3RhYmxlIGZvciB0YXAgcG9pbnQgKi8KLQlyZXN1bHQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJob3N0X3BjbV90YWJsZSIsCi0JCQkmc2Vzcy0+dHBfbWVtX3RhYmxlLmNsaWVudCwKLQkJCSZzZXNzLT50cF9tZW1fdGFibGUuaGFuZGxlLAotCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KSwKLQkJCSZzZXNzLT50cF9tZW1fdGFibGUucGh5cywKLQkJCSZsZW4sCi0JCQkmc2Vzcy0+dHBfbWVtX3RhYmxlLmRhdGEpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBtc21fYXVkaW9faW9uX2FsbG9jIGVycm9yLCByYyA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCW1zbV9hdWRpb19pb25fZnJlZShwcnRkLT5pb25fY2xpZW50LCBzZXNzLT5pb25faGFuZGxlKTsKLQkJcHJ0ZC0+aW9uX2NsaWVudCA9IE5VTEw7Ci0JCXNlc3MtPmlvbl9oYW5kbGUgPSBOVUxMOwotCQlzZXNzLT5zZXNzX3BhZGRyID0gMDsKLQkJc2Vzcy0+c2Vzc19rdmFkZHIgPSAwOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCXByX2RlYnVnKCIlczogIEhvc3QgUENNIG1lbW9yeSB0YWJsZSBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fKTsKLQotCW1lbXNldChzZXNzLT50cF9tZW1fdGFibGUuZGF0YSwgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KSk7Ci0KLQlzZXNzLT50cF9tZW1fdGFibGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhdGEgJXBLIHBoeXMgJXBLXG4iLCBfX2Z1bmNfXywKLQkJIHNlc3MtPnRwX21lbV90YWJsZS5kYXRhLCAmc2Vzcy0+dHBfbWVtX3RhYmxlLnBoeXMpOwotCi0JLyogU3BsaXQgNDA5NiBibG9jayBpbnRvIGZvdXIgMTAyNCBieXRlIGJsb2NrcyBmb3IgZWFjaCBkYWkgKi8KLQl0eHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0KLQlzZXNzLT5zZXNzX3BhZGRyOwotCXR4dHAtPmNhcHR1cmVfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0KLQlzZXNzLT5zZXNzX2t2YWRkcjsKLQotCXR4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0KLQlzZXNzLT5zZXNzX3BhZGRyICsgVkhQQ01fQkxPQ0tfU0laRS80OwotCXR4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9Ci0Jc2Vzcy0+c2Vzc19rdmFkZHIgKyBWSFBDTV9CTE9DS19TSVpFLzQ7Ci0KLQlyeHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0KLQlzZXNzLT5zZXNzX3BhZGRyICsgKFZIUENNX0JMT0NLX1NJWkUvNCkgKiAyOwotCXJ4dHAtPmNhcHR1cmVfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIua3ZhZGRyID0KLQlzZXNzLT5zZXNzX2t2YWRkciArIChWSFBDTV9CTE9DS19TSVpFLzQpICogMjsKLQotCXJ4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyID0KLQlzZXNzLT5zZXNzX3BhZGRyICsgKFZIUENNX0JMT0NLX1NJWkUvNCkgKiAzOwotCXJ4dHAtPnBsYXliYWNrX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciA9Ci0Jc2Vzcy0+c2Vzc19rdmFkZHIgKyAoVkhQQ01fQkxPQ0tfU0laRS80KSAqIDM7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBocGNtX3N0YXJ0X3ZvY3BjbShjaGFyICpwY21faWQsIHN0cnVjdCBocGNtX2RydiAqcHJ0ZCwKLQkJCSAgICAgc3RydWN0IHRhcF9wb2ludCAqdHApCi17Ci0JaW50IGluZHggPSBwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keDsKLQl1aW50MzJfdCAqbm9fb2ZfdHAgPSAmcHJ0ZC0+c3RhcnRfY21kLm5vX29mX3RhcG9pbnRzOwotCXN0cnVjdCB2c3NfaXZwY21fdGFwX3BvaW50ICp0YXBfcG50ID0gJnBydGQtPnN0YXJ0X2NtZC50YXBfcG50WzBdOwotCXVpbnQzMl90IG5vX29mX3RwX3JlcSA9IDA7Ci0JY2hhciAqc2Vzc19uYW1lID0gaHBjbV9nZXRfc2Vzc19uYW1lKGluZHgpOwotCi0JaWYgKHBydGQtPm1peGVyX2NvbmYucnguZW5hYmxlKQotCQlub19vZl90cF9yZXErKzsKLQlpZiAocHJ0ZC0+bWl4ZXJfY29uZi50eC5lbmFibGUpCi0JCW5vX29mX3RwX3JlcSsrOwotCi0JaWYgKHBydGQtPm1peGVyX2NvbmYucnguZW5hYmxlICYmIChnZXRfdGFwcG50X3ZhbHVlKHBjbV9pZCkgPT0gUlgpKSB7Ci0JCWlmIChocGNtX2FsbF9kYWlzX2FyZV9yZWFkeShwcnRkLT5taXhlcl9jb25mLnJ4LmRpcmVjdGlvbiwKLQkJCQkJICAgIHRwLCBIUENNX1BSRVBBUkVEKSkgewotCQkJcHJfZGVidWcoIiVzOiBSWCBjb25kaXRpb25zIG1ldFxuIiwgX19mdW5jX18pOwotCQkJdGFwX3BudFsqbm9fb2ZfdHBdLnRhcF9wb2ludCA9Ci0JCQkJCVZTU19JVlBDTV9UQVBfUE9JTlRfUlhfREVGQVVMVDsKLQkJCXRhcF9wbnRbKm5vX29mX3RwXS5kaXJlY3Rpb24gPQotCQkJCQlwcnRkLT5taXhlcl9jb25mLnJ4LmRpcmVjdGlvbjsKLQkJCXRhcF9wbnRbKm5vX29mX3RwXS5zYW1wbGluZ19yYXRlID0KLQkJCQkJcHJ0ZC0+bWl4ZXJfY29uZi5yeC5zYW1wbGVfcmF0ZTsKLQkJCSgqbm9fb2ZfdHApKys7Ci0JCX0KLQl9Ci0KLQlpZiAocHJ0ZC0+bWl4ZXJfY29uZi50eC5lbmFibGUgJiYgKGdldF90YXBwbnRfdmFsdWUocGNtX2lkKSA9PSBUWCkpIHsKLQkJaWYgKGhwY21fYWxsX2RhaXNfYXJlX3JlYWR5KHBydGQtPm1peGVyX2NvbmYudHguZGlyZWN0aW9uLAotCQkJCQkgICAgdHAsIEhQQ01fUFJFUEFSRUQpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFRYIGNvbmRpdGlvbnMgbWV0XG4iLCBfX2Z1bmNfXyk7Ci0JCQl0YXBfcG50Wypub19vZl90cF0udGFwX3BvaW50ID0KLQkJCQkJCVZTU19JVlBDTV9UQVBfUE9JTlRfVFhfREVGQVVMVDsKLQkJCXRhcF9wbnRbKm5vX29mX3RwXS5kaXJlY3Rpb24gPQotCQkJCQkJcHJ0ZC0+bWl4ZXJfY29uZi50eC5kaXJlY3Rpb247Ci0JCQl0YXBfcG50Wypub19vZl90cF0uc2FtcGxpbmdfcmF0ZSA9Ci0JCQkJCQlwcnRkLT5taXhlcl9jb25mLnR4LnNhbXBsZV9yYXRlOwotCQkJKCpub19vZl90cCkrKzsKLQkJfQotCX0KLQotCWlmICgocHJ0ZC0+bWl4ZXJfY29uZi50eC5lbmFibGUgfHwgcHJ0ZC0+bWl4ZXJfY29uZi5yeC5lbmFibGUpICYmCi0JICAgICpub19vZl90cCA9PSBub19vZl90cF9yZXEpIHsKLQkJdm9jX3NlbmRfY3ZwX3N0YXJ0X3ZvY3BjbSh2b2NfZ2V0X3Nlc3Npb25faWQoc2Vzc19uYW1lKSwKLQkJCQkJICB0YXBfcG50LCAqbm9fb2ZfdHApOwotCQkvKiBSZXNldCB0aGUgc3RhcnQgY29tbWFuZCBzbyB0aGF0IGl0IGlzIG5vdCBjYWxsZWQgdHdpY2UgKi8KLQkJbWVtc2V0KCZwcnRkLT5zdGFydF9jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhcnRfY21kKSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiByZXF1aXJlZCBwY20gaGFuZGxlcyBub3Qgb3BlbmVkIHlldFxuIiwgX19mdW5jX18pOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBQbGF5YmFjayBwYXRoKi8KLXN0YXRpYyB2b2lkIGhwY21fY29weV9wbGF5YmFja19kYXRhX2Zyb21fcXVldWUoc3RydWN0IGRhaV9kYXRhICpkYWlfZGF0YSwKLQkJCQkJICAgICAgIHVpbnQzMl90ICpsZW4pCi17Ci0Jc3RydWN0IGhwY21fYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQotCWlmIChkYWlfZGF0YS0+c3Vic3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmRhaV9kYXRhLT5maWxsZWRfcXVldWUpKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmZGFpX2RhdGEtPmZpbGxlZF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCSpsZW4gPSBidWZfbm9kZS0+ZnJhbWUubGVuOwotCQltZW1jcHkoKHU4ICopZGFpX2RhdGEtPnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciwKLQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5sZW4pOwotCi0JCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmZGFpX2RhdGEtPmZyZWVfcXVldWUpOwotCQlkYWlfZGF0YS0+cGNtX2lycV9wb3MgKz0gZGFpX2RhdGEtPnBjbV9jb3VudDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGRhaV9kYXRhLT5zdWJzdHJlYW0pOwotCX0gZWxzZSB7Ci0JCSpsZW4gPSAwOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCXByX2VycigiSU4gZGF0YSBub3QgYXZhaWxhYmxlXG4iKTsKLQl9Ci0KLQl3YWtlX3VwKCZkYWlfZGF0YS0+cXVldWVfd2FpdCk7Ci19Ci0KLS8qIENhcHR1cmUgcGF0aCovCi1zdGF0aWMgdm9pZCBocGNtX2NvcHlfY2FwdHVyZV9kYXRhX3RvX3F1ZXVlKHN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEsCi0JCQkJCSAgICB1aW50MzJfdCBsZW4pCi17Ci0Jc3RydWN0IGhwY21fYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQotCWlmIChkYWlfZGF0YS0+c3Vic3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIENvcHkgb3V0IGJ1ZmZlciBwYWNrZXQgaW50byBmcmVlX3F1ZXVlICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQotCWlmICghbGlzdF9lbXB0eSgmZGFpX2RhdGEtPmZyZWVfcXVldWUpKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmZGFpX2RhdGEtPmZyZWVfcXVldWUsCi0JCQkJCXN0cnVjdCBocGNtX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJYnVmX25vZGUtPmZyYW1lLmxlbiA9IGxlbjsKLQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJICAgICAgICh1aW50OF90ICopZGFpX2RhdGEtPnZvY3BjbV9pb25fYnVmZmVyLmt2YWRkciwKLQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5sZW4pOwotCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJmRhaV9kYXRhLT5maWxsZWRfcXVldWUpOwotCQlkYWlfZGF0YS0+cGNtX2lycV9wb3MgKz0gZGFpX2RhdGEtPnBjbV9jb3VudDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGRhaV9kYXRhLT5zdWJzdHJlYW0pOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJcHJfZXJyKCJPVVRQVVQgZGF0YSBkcm9wcGVkXG4iKTsKLQl9Ci0KLQl3YWtlX3VwKCZkYWlfZGF0YS0+cXVldWVfd2FpdCk7Ci19Ci0KLXZvaWQgaHBjbV9ub3RpZnlfZXZ0X3Byb2Nlc3NpbmcodWludDhfdCAqZGF0YSwgY2hhciAqc2Vzc2lvbiwKLQkJCQl2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gKHN0cnVjdCBocGNtX2RydiAqKXByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9ub3RpZnlfdjJfdCAqbm90aWZ5X2V2dCA9Ci0JCQkJKHN0cnVjdCB2c3NfaXZwY21fZXZ0X25vdGlmeV92Ml90ICopZGF0YTsKLQlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9wdXNoX2J1ZmZlcl92Ml90IHB1c2hfYnVmZl9ldmVudDsKLQlzdHJ1Y3QgdGFwX3BvaW50ICp0cCA9IE5VTEw7Ci0JaW50IGluX2J1Zl9sZW4gPSAwOwotCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKnRtZCA9IE5VTEw7Ci0JY2hhciAqc2Vzc19uYW1lID0gaHBjbV9nZXRfc2Vzc19uYW1lKHBydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4KTsKLQotCS8qIElmIGl0J3Mgbm90IGEgdGltZXRpY2ssIGl0J3MgYSBlcnJvciBub3RpZmljYXRpb24sIGRyb3AgdGhlIGV2ZW50ICovCi0JaWYgKChub3RpZnlfZXZ0LT5ub3RpZnlfbWFzayAmIFZTU19JVlBDTV9OT1RJRllfTUFTS19USU1FVElDSykgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciBub3RpZmljYXRpb24uIG1hc2s9JWRcbiIsIF9fZnVuY19fLAotCQkJbm90aWZ5X2V2dC0+bm90aWZ5X21hc2spOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG5vdGlmeV9ldnQtPnRhcF9wb2ludCA9PSBWU1NfSVZQQ01fVEFQX1BPSU5UX1RYX0RFRkFVTFQpIHsKLQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF0udHhfdGFwX3BvaW50OwotCQl0bWQgPSAmcHJ0ZC0+bWl4ZXJfY29uZi50eDsKLQl9IGVsc2UgaWYgKG5vdGlmeV9ldnQtPnRhcF9wb2ludCA9PSBWU1NfSVZQQ01fVEFQX1BPSU5UX1JYX0RFRkFVTFQpIHsKLQkJdHAgPSAmcHJ0ZC0+c2Vzc2lvbltwcnRkLT5taXhlcl9jb25mLnNlc3NfaW5keF0ucnhfdGFwX3BvaW50OwotCQl0bWQgPSAmcHJ0ZC0+bWl4ZXJfY29uZi5yeDsKLQl9Ci0KLQlpZiAodHAgPT0gTlVMTCB8fCB0bWQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB0cCA9ICVwSyBvciB0bWQgPSAlcEsgaXMgbnVsbFxuIiwgX19mdW5jX18sCi0JCSAgICAgICB0cCwgdG1kKTsKLQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG5vdGlmeV9ldnQtPm5vdGlmeV9tYXNrICYgVlNTX0lWUENNX05PVElGWV9NQVNLX09VVFBVVF9CVUZGRVIpIHsKLQkJaHBjbV9jb3B5X2NhcHR1cmVfZGF0YV90b19xdWV1ZSgmdHAtPmNhcHR1cmVfZGFpX2RhdGEsCi0JCQkJCQlub3RpZnlfZXZ0LT5maWxsZWRfb3V0X3NpemUpOwotCX0KLQotCWlmIChub3RpZnlfZXZ0LT5ub3RpZnlfbWFzayAmIFZTU19JVlBDTV9OT1RJRllfTUFTS19JTlBVVF9CVUZGRVIpIHsKLQkJaHBjbV9jb3B5X3BsYXliYWNrX2RhdGFfZnJvbV9xdWV1ZSgmdHAtPnBsYXliYWNrX2RhaV9kYXRhLAotCQkJCQkJICAgJmluX2J1Zl9sZW4pOwotCX0KLQotCXN3aXRjaCAodG1kLT5kaXJlY3Rpb24pIHsKLQkvKgotCSAqIFdoZW4gdGhlIGRpciBpcyBPVVRfSU4sIGZvciB0aGUgZmlyc3Qgbm90aWZ5IG1hc2ssIHB1c2hidWYgbWFzawotCSAqIHNob3VsZCBiZSBzZXQgdG8gVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUiBzaW5jZSB3ZQotCSAqIGF0bGVhc3QgbmVlZCBvbmUgYnVmZmVyJ3Mgd29ydGggZGF0YSBiZWZvcmUgd2UgY2FuIHNlbmQgSU4gYnVmZmVyLgotCSAqIEZvciB0aGUgY29uc2VjdXRpdmUgbm90aWZ5IGV2dHMsIHRoZSBwdXNoIGJ1ZiBtYXNrIHdpbGwgc2V0IGZvciBib3RoCi0JICogVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUiBhbmQKLQkgKiBWU1NfSVZQQ01fUFVTSF9CVUZGRVJfTUFTS19JTl9CVUZGRVIuCi0JICovCi0JY2FzZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVRfSU46Ci0JCWlmIChub3RpZnlfZXZ0LT5ub3RpZnlfbWFzayA9PQotCQkgICAgVlNTX0lWUENNX05PVElGWV9NQVNLX1RJTUVUSUNLKSB7Ci0JCQlwdXNoX2J1ZmZfZXZlbnQucHVzaF9idWZfbWFzayA9Ci0JCQkJVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUjsKLQkJfSBlbHNlIHsKLQkJCXB1c2hfYnVmZl9ldmVudC5wdXNoX2J1Zl9tYXNrID0KLQkJCSAgIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX09VVFBVVF9CVUZGRVIgfAotCQkJICAgVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfSU5QVVRfQlVGRkVSOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9JTjoKLQkJcHVzaF9idWZmX2V2ZW50LnB1c2hfYnVmX21hc2sgPQotCQkJVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfSU5QVVRfQlVGRkVSOwotCQlicmVhazsKLQotCWNhc2UgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfT1VUOgotCQlwdXNoX2J1ZmZfZXZlbnQucHVzaF9idWZfbWFzayA9Ci0JCQkgVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUjsKLQkJYnJlYWs7Ci0JfQotCi0JcHVzaF9idWZmX2V2ZW50LnRhcF9wb2ludCA9IG5vdGlmeV9ldnQtPnRhcF9wb2ludDsKLQlwdXNoX2J1ZmZfZXZlbnQub3V0X2J1Zl9tZW1fYWRkcmVzcyA9Ci0JCSAgICAgIHRwLT5jYXB0dXJlX2RhaV9kYXRhLnZvY3BjbV9pb25fYnVmZmVyLnBhZGRyOwotCXB1c2hfYnVmZl9ldmVudC5pbl9idWZfbWVtX2FkZHJlc3MgPQotCQkgICAgICB0cC0+cGxheWJhY2tfZGFpX2RhdGEudm9jcGNtX2lvbl9idWZmZXIucGFkZHI7Ci0JcHVzaF9idWZmX2V2ZW50LnNhbXBsaW5nX3JhdGUgPSBub3RpZnlfZXZ0LT5zYW1wbGluZ19yYXRlOwotCXB1c2hfYnVmZl9ldmVudC5udW1faW5fY2hhbm5lbHMgPSAxOwotCi0JLyoKLQkgKiBBRFNQIG11c3QgcmVhZCBhbmQgd3JpdGUgZnJvbSBhIGNhY2hlIGFsaWduZWQgKDEyOCBieXRlKSBsb2NhdGlvbiwKLQkgKiBhbmQgaW4gYmxvY2tzIG9mIHRoZSBjYWNoZSBhbGlnbm1lbnQgc2l6ZS4gVGhlIDEyOCBieXRlIGNhY2hlCi0JICogYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzIGd1YXJhbnRlZWQgZHVlIHRvIDQwOTYgYnl0ZSBtZW1vcnkKLQkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgZHVyaW5nIG1lbW9yeSBhbGxvY2F0aW9uL21hcHBpbmcuIFRoZSBvdXRwdXQKLQkgKiBidWZmZXIgKEFEU1Agd3JpdGUpIHNpemUgbWFzayBlbnN1cmVzIHRoYXQgYSAxMjggYnl0ZSBtdWx0aXBsZQotCSAqIHdvcnRoIG9mIHdpbGwgYmUgd3JpdHRlbi4gIEludGVybmFsbHksIHRoZSBpbnB1dCBidWZmZXIgKEFEU1AgcmVhZCkKLQkgKiBzaXplIHdpbGwgYWxzbyBiZSBhIG11bHRpcGxlIG9mIDEyOCBieXRlcy4gIEhvd2V2ZXIgaXQgaXMgdGhlCi0JICogYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgbm8gb3RoZXIgZGF0YSBpcyB3cml0dGVuIGluCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGggb2YgbWVtb3J5LgotCSAqLwotCXB1c2hfYnVmZl9ldmVudC5vdXRfYnVmX21lbV9zaXplID0gKChub3RpZnlfZXZ0LT5yZXF1ZXN0X2J1Zl9zaXplKSArCi0JCQkJQ0FDSEVfQUxJR05NRU5UX1NJWkUpICYgQ0FDSEVfQUxJR05NRU5UX01BU0s7Ci0JcHVzaF9idWZmX2V2ZW50LmluX2J1Zl9tZW1fc2l6ZSA9IGluX2J1Zl9sZW47Ci0KLQl2b2Nfc2VuZF9jdnBfdm9jcGNtX3B1c2hfYnVmX2V2dCh2b2NfZ2V0X3Nlc3Npb25faWQoc2Vzc19uYW1lKSwKLQkJCQkJICZwdXNoX2J1ZmZfZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IG1zbV9ocGNtX2NvbmZpZ3VyZV92b2ljZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0JaW50IHRhcF9wb2ludCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXVpbnQxNl90IGRpcmVjdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCXVpbnQxNl90IHNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0Jc3RydWN0IHRhcHBudF9teHJfZGF0YSAqdG1kID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmhwY21fZHJ2LmxvY2spOwotCXByX2RlYnVnKCIlczogdGFwX3BvaW50ID0gJWQgZGlyZWN0aW9uID0gJWQgc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCB0YXBfcG9pbnQsIGRpcmVjdGlvbiwgc2FtcGxlX3JhdGUpOwotCi0JaWYgKCFocGNtX2lzX3ZhbGlkX2NvbmZpZyhWT0lDRV9JTkRFWCwgdGFwX3BvaW50LCBkaXJlY3Rpb24sCi0JCQkJICBzYW1wbGVfcmF0ZSkpIHsKLQkJcHJfZXJyKCJJbnZhbGlkIHZwY20gbWl4ZXIgY29udHJvbCB2b2ljZSB2YWx1ZXNcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHRhcF9wb2ludCA9PSBSWCkKLQkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYucng7Ci0JZWxzZQotCQl0bWQgPSAmaHBjbV9kcnYubWl4ZXJfY29uZi50eDsKLQotCXRtZC0+ZW5hYmxlID0gdHJ1ZTsKLQl0bWQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl0bWQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0JaHBjbV9kcnYubWl4ZXJfY29uZi5zZXNzX2luZHggPSBWT0lDRV9JTkRFWDsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmhwY21fZHJ2LmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2hwY21fY29uZmlndXJlX3ZtbW9kZTFfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0JaW50IHRhcF9wb2ludCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXVpbnQxNl90IGRpcmVjdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCXVpbnQxNl90IHNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0Jc3RydWN0IHRhcHBudF9teHJfZGF0YSAqdG1kID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmhwY21fZHJ2LmxvY2spOwotCXByX2RlYnVnKCIlczogdGFwX3BvaW50ID0gJWQgZGlyZWN0aW9uID0gJWQgc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCB0YXBfcG9pbnQsIGRpcmVjdGlvbiwgc2FtcGxlX3JhdGUpOwotCi0JaWYgKCFocGNtX2lzX3ZhbGlkX2NvbmZpZyhWT01NT0RFMV9JTkRFWCwgdGFwX3BvaW50LCBkaXJlY3Rpb24sCi0JCQkJICBzYW1wbGVfcmF0ZSkpIHsKLQkJcHJfZXJyKCJJbnZhbGlkIHZwY20gbWl4ZXIgY29udHJvbCB2b2ljZSB2YWx1ZXNcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHRhcF9wb2ludCA9PSBSWCkKLQkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYucng7Ci0JZWxzZQotCQl0bWQgPSAmaHBjbV9kcnYubWl4ZXJfY29uZi50eDsKLQotCXRtZC0+ZW5hYmxlID0gdHJ1ZTsKLQl0bWQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl0bWQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0JaHBjbV9kcnYubWl4ZXJfY29uZi5zZXNzX2luZHggPSBWT01NT0RFMV9JTkRFWDsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmhwY21fZHJ2LmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2hwY21fY29uZmlndXJlX3ZtbW9kZTJfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0JaW50IHRhcF9wb2ludCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXVpbnQxNl90IGRpcmVjdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCXVpbnQxNl90IHNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0Jc3RydWN0IHRhcHBudF9teHJfZGF0YSAqdG1kID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmhwY21fZHJ2LmxvY2spOwotCXByX2RlYnVnKCIlczogdGFwX3BvaW50ID0gJWQgZGlyZWN0aW9uID0gJWQgc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCB0YXBfcG9pbnQsIGRpcmVjdGlvbiwgc2FtcGxlX3JhdGUpOwotCi0JaWYgKCFocGNtX2lzX3ZhbGlkX2NvbmZpZyhWT01NT0RFMl9JTkRFWCwgdGFwX3BvaW50LCBkaXJlY3Rpb24sCi0JCQkJICBzYW1wbGVfcmF0ZSkpIHsKLQkJcHJfZXJyKCJJbnZhbGlkIHZwY20gbWl4ZXIgY29udHJvbCB2b2ljZSB2YWx1ZXNcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHRhcF9wb2ludCA9PSBSWCkKLQkJdG1kID0gJmhwY21fZHJ2Lm1peGVyX2NvbmYucng7Ci0JZWxzZQotCQl0bWQgPSAmaHBjbV9kcnYubWl4ZXJfY29uZi50eDsKLQotCXRtZC0+ZW5hYmxlID0gdHJ1ZTsKLQl0bWQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQl0bWQtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0JaHBjbV9kcnYubWl4ZXJfY29uZi5zZXNzX2luZHggPSBWT01NT0RFMl9JTkRFWDsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmhwY21fZHJ2LmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2hwY21fY29uZmlndXJlX3ZvbHRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0KLQlpbnQgdGFwX3BvaW50ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdWludDE2X3QgZGlyZWN0aW9uID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JdWludDE2X3Qgc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQlzdHJ1Y3QgdGFwcG50X214cl9kYXRhICp0bWQgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmaHBjbV9kcnYubG9jayk7Ci0JcHJfZGVidWcoIiVzOiB0YXBfcG9pbnQ9JWQgZGlyZWN0aW9uPSVkIHNhbXBsZV9yYXRlPSVkXG4iLAotCQkgX19mdW5jX18sIHRhcF9wb2ludCwgZGlyZWN0aW9uLCBzYW1wbGVfcmF0ZSk7Ci0KLQlpZiAoIWhwY21faXNfdmFsaWRfY29uZmlnKFZPTFRFX0lOREVYLCB0YXBfcG9pbnQsIGRpcmVjdGlvbiwKLQkJCQkgIHNhbXBsZV9yYXRlKSkgewotCQlwcl9lcnIoIkludmFsaWQgdnBjbSBtaXhlciBjb250cm9sIHZvbHRlIHZhbHVlc1xuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodGFwX3BvaW50ID09IFJYKQotCQl0bWQgPSAmaHBjbV9kcnYubWl4ZXJfY29uZi5yeDsKLQllbHNlCi0JCXRtZCA9ICZocGNtX2Rydi5taXhlcl9jb25mLnR4OwotCi0JdG1kLT5lbmFibGUgPSB0cnVlOwotCXRtZC0+ZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCXRtZC0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKLQlocGNtX2Rydi5taXhlcl9jb25mLnNlc3NfaW5keCA9IFZPTFRFX0lOREVYOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmaHBjbV9kcnYubG9jayk7Ci0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX2hwY21fY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSFBDTV9Wb2ljZSB0YXBwb2ludCBkaXJlY3Rpb24gc2FtcGxlcmF0ZSIsCi0JCQkgICAgIFNORF9TT0NfTk9QTSwgMCwgMTYwMDAsIDAsIDMsCi0JCQkgICAgIE5VTEwsIG1zbV9ocGNtX2NvbmZpZ3VyZV92b2ljZV9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJIUENNX1ZvTFRFIHRhcHBvaW50IGRpcmVjdGlvbiBzYW1wbGVyYXRlIiwKLQkJCSAgICAgU05EX1NPQ19OT1BNLCAwLCAxNjAwMCwgMCwgMywKLQkJCSAgICAgTlVMTCwgbXNtX2hwY21fY29uZmlndXJlX3ZvbHRlX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIkhQQ01fVk1Nb2RlMSB0YXBwb2ludCBkaXJlY3Rpb24gc2FtcGxlcmF0ZSIsCi0JCQkgICAgIFNORF9TT0NfTk9QTSwgMCwgMTYwMDAsIDAsIDMsCi0JCQkgICAgIE5VTEwsIG1zbV9ocGNtX2NvbmZpZ3VyZV92bW1vZGUxX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIkhQQ01fVk1Nb2RlMiB0YXBwb2ludCBkaXJlY3Rpb24gc2FtcGxlcmF0ZSIsCi0JCQkgICAgIFNORF9TT0NfTk9QTSwgMCwgMTYwMDAsIDAsIDMsCi0JCQkgICAgIE5VTEwsIG1zbV9ocGNtX2NvbmZpZ3VyZV92bW1vZGUyX3B1dCksCi19OwotCi0vKiBTYW1wbGUgcmF0ZXMgc3VwcG9ydGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHs4MDAwLCAxNjAwMH07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCi0JLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAotCS5tYXNrID0gMCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBOVUxMOwotCXN0cnVjdCBocGNtX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkOwotCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOwotCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCXN0cnVjdCB0YXBfcG9pbnQgKnRwID0gTlVMTDsKLQlzdHJ1Y3QgdGFwcG50X214cl9kYXRhICp0bWQgPSBOVUxMOwotCWNoYXIgKnNlc3NfbmFtZSA9IE5VTEw7Ci0KLQlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJcHJfZXJyKCJzdWJzdHJlYW0gaXMgTlVMTFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlcywgJXNcbiIsIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOwotCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzZXNzX25hbWUgPSBocGNtX2dldF9zZXNzX25hbWUocHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHgpOwotCWRhaV9kYXRhID0gaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jd2FrZV91cCgmZGFpX2RhdGEtPnF1ZXVlX3dhaXQpOwotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCi0JdG1kID0gaHBjbV9nZXRfdGFwcG50X21peGVyX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCXRwID0gaHBjbV9nZXRfdGFwcG9pbnRfZGF0YShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQpOwotCS8qIFNlbmQgc3RvcCBjb21tYW5kICovCi0Jdm9jX3NlbmRfY3ZwX3N0b3Bfdm9jcGNtKHZvY19nZXRfc2Vzc2lvbl9pZChzZXNzX25hbWUpKTsKLQkvKiBNZW1vcnkgdW5tYXAvZnJlZSB0YWtlcyBwbGFjZSBvbmx5IHdoZW4gY2FsbGVkIHRoZSBmaXJzdCB0aW1lICovCi0JaHBjbV91bm1hcF9hbmRfZnJlZV9zaGFyZWRfbWVtb3J5KHBydGQpOwotCS8qIFVucmVnaXN0ZXIgaG9zdCBQQ00gZXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQl2b2NfZGVyZWdpc3Rlcl9ocGNtX2V2dF9jYigpOwotCS8qIFJlc2V0IHRoZSBjYWNoZWQgc3RhcnQgY21kICovCi0JbWVtc2V0KCZwcnRkLT5zdGFydF9jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhcnRfY21kKSk7Ci0JLyogUmVsZWFzZSBhbGwgYnVmZmVyICovCi0JcHJfZGVidWcoIiVzOiBSZWxlYXNlIGFsbCBidWZmZXJcbiIsIF9fZnVuY19fKTsKLQlzdWJzdHJlYW0gPSBkYWlfZGF0YS0+c3Vic3RyZWFtOwotCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IHN1YnN0cmVhbSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JaWYgKGRtYV9idWYgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IGRtYV9idWYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChkbWFfYnVmLT5hcmVhICE9IE5VTEwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmRhaV9kYXRhLT5maWxsZWRfcXVldWUpIHsKLQkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsCi0JCQkJCXN0cnVjdCBocGNtX2J1Zl9ub2RlLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCX0KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmRhaV9kYXRhLT5mcmVlX3F1ZXVlKSB7Ci0JCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCXJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgsIGRtYV9idWYtPmFyZWEsCi0JCQlkbWFfYnVmLT5hZGRyKTsKLQkJZG1hX2J1Zi0+YXJlYSA9IE5VTEw7Ci0JfQotCWRhaV9kYXRhLT5zdWJzdHJlYW0gPSBOVUxMOwotCWRhaV9kYXRhLT5wY21fYnVmX3BvcyA9IDA7Ci0JZGFpX2RhdGEtPnBjbV9jb3VudCA9IDA7Ci0JZGFpX2RhdGEtPnBjbV9pcnFfcG9zID0gMDsKLQlkYWlfZGF0YS0+cGNtX3NpemUgPSAwOwotCWRhaV9kYXRhLT5zdGF0ZSA9IEhQQ01fQ0xPU0VEOwotCWhwY21fcmVzZXRfbWl4ZXJfY29uZmlnKHBydGQpOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAotCQkJCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1ZiwKLQkJCQkgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBocGNtX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgaHBjbV9kcnYgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRhaV9kYXRhICpkYWlfZGF0YSA9IGhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7Ci0JdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7Ci0KLQlpbnQgY291bnQgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGFpX2RhdGEtPnF1ZXVlX3dhaXQsCi0JCQkJKCFsaXN0X2VtcHR5KCZkYWlfZGF0YS0+ZnJlZV9xdWV1ZSkgfHwKLQkJCQlkYWlfZGF0YS0+c3RhdGUgPT0gSFBDTV9TVE9QUEVEKSwKLQkJCQkxICogSFopOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlmIChjb3VudCA8PSBIUENNX01BWF9WT0NfUEtUX1NJWkUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQlidWZfbm9kZSA9Ci0JCQkJbGlzdF9maXJzdF9lbnRyeSgmZGFpX2RhdGEtPmZyZWVfcXVldWUsCi0JCQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0LCBidWYsCi0JCQkJCSAgICAgY291bnQpOwotCQkJYnVmX25vZGUtPmZyYW1lLmxlbiA9IGNvdW50OwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhaV9kYXRhLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmZGFpX2RhdGEtPmZpbGxlZF9xdWV1ZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBXcml0ZSBjbnQgJWQgaXMgPiBIUENNX01BWF9WT0NfUEtUX1NJWkVcbiIsCi0JCQkJX19mdW5jX18sIGNvdW50KTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCX0KLQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7Ci0JCXByX2VycigiJXM6IE5vIGZyZWUgUGxheWJhY2sgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogcGxheWJhY2sgY29weSAgd2FzIGludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi1kb25lOgotCXJldHVybiAgcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCWludCBjaGFubmVsLCBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwKLQkJCQl2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBocGNtX2dldF9kYWlfZGF0YShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQpOwotCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOwotCi0JaWYgKGRhaV9kYXRhID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcywgZGFpX2RhdGEgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOwotCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGFpX2RhdGEtPnF1ZXVlX3dhaXQsCi0JCQkJKCFsaXN0X2VtcHR5KCZkYWlfZGF0YS0+ZmlsbGVkX3F1ZXVlKSB8fAotCQkJCWRhaV9kYXRhLT5zdGF0ZSA9PSBIUENNX1NUT1BQRUQpLAotCQkJCTEgKiBIWik7Ci0KLQlpZiAocmV0ID4gMCkgewotCQlpZiAoY291bnQgPD0gSFBDTV9NQVhfVk9DX1BLVF9TSVpFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkYWlfZGF0YS0+ZmlsbGVkX3F1ZXVlLAotCQkJCQlzdHJ1Y3QgaHBjbV9idWZfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwgJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0LAotCQkJCQkgICBidWZfbm9kZS0+ZnJhbWUubGVuKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgcmV0dXJuZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFpX2RhdGEtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZkYWlfZGF0YS0+ZnJlZV9xdWV1ZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWlfZGF0YS0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFJlYWQgY291bnQgJWQgPiBIUENNX01BWF9WT0NfUEtUX1NJWkVcbiIsCi0JCQkJX19mdW5jX18sIGNvdW50KTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCX0KLQotCX0gZWxzZSBpZiAocmV0ID09IDApIHsKLQkJcHJfZXJyKCIlczogTm8gQ2FwdXRyZSBkYXRhIGF2YWlsYWJsZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IFJlYWQgd2FzIGludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FUkVTVEFSVFNZUzsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjaGFubmVsLAotCQkJc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsIHZvaWQgX191c2VyICpidWYsCi0JCQlzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJcmV0ID0gbXNtX3BjbV9wbGF5YmFja19jb3B5KHN1YnN0cmVhbSwgY2hhbm5lbCwKLQkJCQkJICAgIGh3b2ZmLCBidWYsIGZyYW1lcyk7Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfY29weShzdWJzdHJlYW0sIGNoYW5uZWwsCi0JCQkJCSAgIGh3b2ZmLCBidWYsIGZyYW1lcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPSBOVUxMOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXNuZF9wY21fdWZyYW1lc190IHJldDsKLQotCWRhaV9kYXRhID0gaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAwOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGRhaV9kYXRhLT5wY21faXJxX3BvcyA+PSBkYWlfZGF0YS0+cGNtX3NpemUpCi0JCWRhaV9kYXRhLT5wY21faXJxX3BvcyA9IDA7Ci0KLQlyZXQgPSBieXRlc190b19mcmFtZXMocnVudGltZSwgKGRhaV9kYXRhLT5wY21faXJxX3BvcykpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkYWlfZGF0YSAqZGFpX2RhdGEgPQotCQkJaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJfZGVidWcoIiVzLCAlc1xuIiwgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCXByX2RlYnVnKCJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7Ci0JCWRhaV9kYXRhLT5zdGF0ZSA9IEhQQ01fU1RBUlRFRDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXByX2RlYnVnKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKLQkJZGFpX2RhdGEtPnN0YXRlID0gSFBDTV9TVE9QUEVEOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGFpX2RhdGEgKmRhaV9kYXRhID0gTlVMTDsKLQlzdHJ1Y3QgdGFwX3BvaW50ICp0cCA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXMsICVzXG4iLCBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCWRhaV9kYXRhID0gaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZGFpX2RhdGEtPnBjbV9zaXplICA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCWRhaV9kYXRhLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQlkYWlfZGF0YS0+cGNtX2lycV9wb3MgPSAwOwotCWRhaV9kYXRhLT5wY21fYnVmX3BvcyA9IDA7Ci0JZGFpX2RhdGEtPnN0YXRlID0gSFBDTV9QUkVQQVJFRDsKLQotCS8qIFJlZ2lzdGVyIGV2ZW50IG5vdGlmeSBwcm9jZXNzaW5nIGNhbGxiYWNrIGluIHByZXBhcmUgaW5zdGVhZCBvZgotCSAqIGluaXQoKSBhcyBxNnZvaWNlIG1vZHVsZSdzIGluaXQoKSBjYW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXIgcG9pbnQKLQkgKi8KLQl2b2NfcmVnaXN0ZXJfaHBjbV9ldnRfY2IoaHBjbV9ub3RpZnlfZXZ0X3Byb2Nlc3NpbmcsICZocGNtX2Rydik7Ci0KLQl0cCA9IGhwY21fZ2V0X3RhcHBvaW50X2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQlpZiAodHAgIT0gTlVMTCkgewotCQlyZXQgPSBocGNtX3N0YXJ0X3ZvY3BjbShzdWJzdHJlYW0tPnBjbS0+aWQsIHBydGQsIHRwKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJlcnJvciBzZW5kaW5nIHN0YXJ0IGNtZCBlcnI9JWRcbiIsIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIHRwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQl9Ci1kb25lOgotCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYV9idWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCXN0cnVjdCBocGNtX2RydiAqcHJ0ZCA9IChzdHJ1Y3QgaHBjbV9kcnYgKilydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6ICVzXG4iLCBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCS8qIEFsbG9jYXRlIGFuZCBtYXAgdm9pY2UgaG9zdCBQQ00gaW9uIGJ1ZmZlciAqLwotCWlmIChwcnRkLT5zZXNzaW9uW3BydGQtPm1peGVyX2NvbmYuc2Vzc19pbmR4XS5zZXNzX3BhZGRyID09IDApIHsKLQkJcmV0ID0gaHBjbV9hbGxvY2F0ZV9zaGFyZWRfbWVtb3J5KHBydGQpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoImVycm9yIGNyZWF0aW5nIHNoYXJlZCBtZW1vcnkgZXJyPSVkXG4iLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcmV0ID0gaHBjbV9tYXBfdm9jcGNtX21lbW9yeShwcnRkKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJlcnJvciBtYXBwaW5nIHNoYXJlZCBtZW1vcnkgZXJyPSVkXG4iLCByZXQpOwotCQkJaHBjbV9mcmVlX2FsbG9jYXRlZF9tZW0ocHJ0ZCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXMsIFZIUENNIG1lbW9yeSBhbGxvY2F0aW9uL21hcHBpbmcgbm90IHBlcmZvcm1lZFxuIgotCQkJICwgX19mdW5jX18pOwotCX0KLQotCWRtYV9idWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOwotCWRtYV9idWYtPmRldi5kZXYgPSBzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2OwotCWRtYV9idWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlkbWFfYnVmLT5hcmVhID0gZG1hX2FsbG9jX2NvaGVyZW50KHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsCi0JCQlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4LAotCQkJJmRtYV9idWYtPmFkZHIsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFkbWFfYnVmLT5hcmVhKSB7Ci0JCXByX2VycigiJXM6TVNNIGRtYV9hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCWRtYV9idWYtPmJ5dGVzID0gcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heDsKLQltZW1zZXQoZG1hX2J1Zi0+YXJlYSwgMCwgcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCk7Ci0KLQlocGNtX2NyZWF0ZV9mcmVlX3F1ZXVlKGRtYV9idWYsCi0JCWhwY21fZ2V0X2RhaV9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCkpOwotCi0Jc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGhwY21fZHJ2ICpwcnRkID0gJmhwY21fZHJ2OwotCXN0cnVjdCB0YXBwbnRfbXhyX2RhdGEgKnRtZCA9IE5VTEw7Ci0Jc3RydWN0IGRhaV9kYXRhICpkYWlfZGF0YSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHRwX3ZhbCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMsICVzXG4iLCBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCWRhaV9kYXRhID0gaHBjbV9nZXRfZGFpX2RhdGEoc3Vic3RyZWFtLT5wY20tPmlkLCBwcnRkKTsKLQotCWlmIChkYWlfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMsIGRhaV9kYXRhIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlOwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJCSAmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZGVidWcoInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7Ci0KLQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2RlYnVnKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlciBmYWlsZWRcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdHBfdmFsID0gZ2V0X3RhcHBudF92YWx1ZShzdWJzdHJlYW0tPnBjbS0+aWQpOwotCXRtZCA9IGhwY21fZ2V0X3RhcHBudF9taXhlcl9kYXRhKHN1YnN0cmVhbS0+cGNtLT5pZCwgcHJ0ZCk7Ci0KLQkvKiBDaGVjayB3aGVhdGhlciB0aGUga2NvbnRyb2wgdmFsdWVzIHNldCBhcmUgdmFsaWQgKi8KLQlpZiAoIXRtZCB8fAotCSAgICAhKHRtZC0+ZW5hYmxlKSB8fAotCSAgICAhaHBjbV9pc192YWxpZF9jb25maWcocHJ0ZC0+bWl4ZXJfY29uZi5zZXNzX2luZHgsCi0JCQkJICB0cF92YWwsIHRtZC0+ZGlyZWN0aW9uLAotCQkJCSAgdG1kLT5zYW1wbGVfcmF0ZSkpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWRhaV9kYXRhLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKLQotZG9uZToKLQltdXRleF91bmxvY2soJnBydGQtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbXNtX3BjbV9vcGVuLAotCS5od19wYXJhbXMgICAgICA9IG1zbV9wY21faHdfcGFyYW1zLAotCS5wcmVwYXJlICAgICAgICA9IG1zbV9wY21fcHJlcGFyZSwKLQkudHJpZ2dlciAgICAgICAgPSBtc21fcGNtX3RyaWdnZXIsCi0JLnBvaW50ZXIgICAgICAgID0gbXNtX3BjbV9wb2ludGVyLAotCS5jb3B5ICAgICAgICAgICA9IG1zbV9wY21fY29weSwKLQkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX2Nsb3NlLAotfTsKLQotc3RhdGljIGludCBtc21fYXNvY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCi0JCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9ocGNtX3Byb2JlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKLXsKLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgbXNtX2hwY21fY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShtc21faHBjbV9jb250cm9scykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKLQkub3BzCQk9ICZtc21fcGNtX29wcywKLQkucGNtX25ldwk9IG1zbV9hc29jX3BjbV9uZXcsCi0JLnByb2JlCQk9IG1zbV9wY21faHBjbV9wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JcHJfaW5mbygiJXM6IGRldiBuYW1lICVzXG4iLCBfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZtc21fc29jX3BsYXRmb3JtKTsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3ZvaWNlX2hvc3RfcGNtX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLXZvaWNlLWhvc3QtcGNtIn0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fdm9pY2VfaG9zdF9wY21fZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tdm9pY2UtaG9zdC1wY20iLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3ZvaWNlX2hvc3RfcGNtX2R0X21hdGNoLAotCX0sCi0JLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKLXsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHNlc3Npb24gKnMgPSBOVUxMOwotCi0JbWVtc2V0KCZocGNtX2RydiwgMCwgc2l6ZW9mKGhwY21fZHJ2KSk7Ci0JbXV0ZXhfaW5pdCgmaHBjbV9kcnYubG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFU1NJT047IGkrKykgewotCQlzID0gJmhwY21fZHJ2LnNlc3Npb25baV07Ci0JCXNwaW5fbG9ja19pbml0KCZzLT5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5kc3BfbG9jayk7Ci0JCXNwaW5fbG9ja19pbml0KCZzLT5yeF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEuZHNwX2xvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmcy0+dHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEuZHNwX2xvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmcy0+dHhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhLmRzcF9sb2NrKTsKLQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKAotCQkJJnMtPnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhLnF1ZXVlX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKAotCQkJJnMtPnJ4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YS5xdWV1ZV93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgKLQkJCSZzLT50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5xdWV1ZV93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgKLQkJCSZzLT50eF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEucXVldWVfd2FpdCk7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJnMtPnJ4X3RhcF9wb2ludC5jYXB0dXJlX2RhaV9kYXRhLmZpbGxlZF9xdWV1ZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZzLT5yeF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5mcmVlX3F1ZXVlKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnMtPnJ4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YS5maWxsZWRfcXVldWUpOwotCQlJTklUX0xJU1RfSEVBRCgmcy0+cnhfdGFwX3BvaW50LnBsYXliYWNrX2RhaV9kYXRhLmZyZWVfcXVldWUpOwotCi0JCUlOSVRfTElTVF9IRUFEKCZzLT50eF90YXBfcG9pbnQuY2FwdHVyZV9kYWlfZGF0YS5maWxsZWRfcXVldWUpOwotCQlJTklUX0xJU1RfSEVBRCgmcy0+dHhfdGFwX3BvaW50LmNhcHR1cmVfZGFpX2RhdGEuZnJlZV9xdWV1ZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZzLT50eF90YXBfcG9pbnQucGxheWJhY2tfZGFpX2RhdGEuZmlsbGVkX3F1ZXVlKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnMtPnR4X3RhcF9wb2ludC5wbGF5YmFja19kYWlfZGF0YS5mcmVlX3F1ZXVlKTsKLQl9Ci0KLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUENNIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWxvb3BiYWNrLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1sb29wYmFjay12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYxY2E4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLWxvb3BiYWNrLXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MDEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Ci0jaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+Ci0KLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLQotI2RlZmluZSBMT09QQkFDS19WT0xfTUFYX1NURVBTIDB4MjAwMAotI2RlZmluZSBMT09QQkFDS19TRVNTSU9OX01BWCA0Ci0KLXN0YXRpYyBERUZJTkVfTVVURVgobG9vcGJhY2tfc2Vzc2lvbl9sb2NrKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIobG9vcGJhY2tfcnhfdm9sX2dhaW4sIDAsCi0JCQkJTE9PUEJBQ0tfVk9MX01BWF9TVEVQUyk7Ci0KLXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrIHsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX3N1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKmNhcHR1cmVfc3Vic3RyZWFtOwotCi0JaW50IGluc3RhbmNlOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCi0JaW50IHBsYXliYWNrX3N0YXJ0OwotCWludCBjYXB0dXJlX3N0YXJ0OwotCWludCBzZXNzaW9uX2lkOwotCXN0cnVjdCBhdWRpb19jbGllbnQgKmF1ZGlvX2NsaWVudDsKLQl1aW50MzJfdCB2b2x1bWU7Ci19OwotCi1zdHJ1Y3QgZmVfZGFpX3Nlc3Npb25fbWFwIHsKLQljaGFyIHN0cmVhbV9uYW1lWzMyXTsKLQlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqbG9vcGJhY2tfcHJpdjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmVfZGFpX3Nlc3Npb25fbWFwIHNlc3Npb25fbWFwW0xPT1BCQUNLX1NFU1NJT05fTUFYXSA9IHsKLQl7IHt9LCBOVUxMfSwKLQl7IHt9LCBOVUxMfSwKLQl7IHt9LCBOVUxMfSwKLQl7IHt9LCBOVUxMfSwKLX07Ci0KLXN0YXRpYyB1MzIgaGZwX3R4X211dGU7Ci0KLXN0cnVjdCBtc21fcGNtX3BkYXRhIHsKLQlpbnQgcGVyZl9tb2RlOwotfTsKLQotc3RhdGljIHZvaWQgc3RvcF9wY20oc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBjbSk7Ci1zdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfZ2V0X3Nlc3Npb24oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCQkJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKipwY20pOwotCi1zdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRlX2V2ZW50X2hhbmRsZXIoZW51bSBtc21fcGNtX3JvdXRpbmdfZXZlbnQgZXZlbnQsCi0JCQkJCXZvaWQgKnByaXZfZGF0YSkKLXsKLQlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtID0gcHJpdl9kYXRhOwotCi0JV0FSTl9PTighcGNtKTsKLQotCXByX2RlYnVnKCIlczogZXZlbnQgMHgleFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIE1TTV9QQ01fUlRfRVZUX0RFVlNXSVRDSDoKLQkJcTZhc21fY21kKHBjbS0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOwotCQlxNmFzbV9jbWQocGNtLT5hdWRpb19jbGllbnQsIENNRF9GTFVTSCk7Ci0JCXE2YXNtX3J1bihwY20tPmF1ZGlvX2NsaWVudCwgMCwgMCwgMCk7Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZGVmYXVsdCBldmVudCAweCV4XG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9wY21fbG9vcGJhY2tfZXZlbnRfaGFuZGxlcih1aW50MzJfdCBvcGNvZGUsIHVpbnQzMl90IHRva2VuLAotCQkJCQkgICB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdikKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOiB7Ci0JCXN3aXRjaCAocGF5bG9hZFswXSkgewotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogTm90IFN1cHBvcnRlZCBFdmVudCBvcGNvZGVbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgb3Bjb2RlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9sb29wYmFja19zZXNzaW9uX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZnBfdHhfbXV0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbG9vcGJhY2tfc2Vzc2lvbl9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwLCBuID0gMDsKLQlpbnQgbXV0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwY20gPSBOVUxMOwotCi0JaWYgKChtdXRlIDwgMCkgfHwgKG11dGUgPiAxKSkgewotCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogbXV0ZT0lZFxuIiwgX19mdW5jX18sIG11dGUpOwotCWhmcF90eF9tdXRlID0gbXV0ZTsKLQlmb3IgKG4gPSAwOyBuIDwgTE9PUEJBQ0tfU0VTU0lPTl9NQVg7IG4rKykgewotCQlpZiAoIXN0cmNtcChzZXNzaW9uX21hcFtuXS5zdHJlYW1fbmFtZSwgIk11bHRpTWVkaWE2IikpCi0JCQlwY20gPSBzZXNzaW9uX21hcFtuXS5sb29wYmFja19wcml2OwotCX0KLQlpZiAocGNtICYmIHBjbS0+YXVkaW9fY2xpZW50KSB7Ci0JCXJldCA9IHE2YXNtX3NldF9tdXRlKHBjbS0+YXVkaW9fY2xpZW50LCBtdXRlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiBTZW5kIG11dGUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX2xvb3BiYWNrX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkhGUCBUWCBNdXRlIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAotCQkJbXNtX2xvb3BiYWNrX3Nlc3Npb25fbXV0ZV9nZXQsCi0JCQltc21fbG9vcGJhY2tfc2Vzc2lvbl9tdXRlX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fbG9vcGJhY2tfY29udHJvbHMsCi0JCQkJICAgICAgQVJSQVlfU0laRShtc21fbG9vcGJhY2tfY29udHJvbHMpKTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBwY21fbG9vcGJhY2tfc2V0X3ZvbHVtZShzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcHJ0ZCwKLQkJCQkgICB1aW50MzJfdCB2b2x1bWUpCi17Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCXByX2RlYnVnKCIlczogU2V0dGluZyB2b2x1bWUgMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7Ci0KLQlpZiAocHJ0ZCAmJiBwcnRkLT5hdWRpb19jbGllbnQpIHsKLQkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgdm9sdW1lKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmMgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXBydGQtPnZvbHVtZSA9IHZvbHVtZTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fbG9vcGJhY2tfZ2V0X3Nlc3Npb24oc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCQkJc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKipwY20pCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IG4sIGluZGV4ID0gLTE7Ci0KLQlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBzdHJlYW0gJXNcbiIsIF9fZnVuY19fLAotCQlydGQtPmRhaV9saW5rLT5zdHJlYW1fbmFtZSk7Ci0KLQltdXRleF9sb2NrKCZsb29wYmFja19zZXNzaW9uX2xvY2spOwotCWZvciAobiA9IDA7IG4gPCBMT09QQkFDS19TRVNTSU9OX01BWDsgbisrKSB7Ci0JCWlmICghc3RyY21wKHJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLAotCQkgICAgc2Vzc2lvbl9tYXBbbl0uc3RyZWFtX25hbWUpKSB7Ci0JCQkqcGNtID0gc2Vzc2lvbl9tYXBbbl0ubG9vcGJhY2tfcHJpdjsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQkvKgotCQkgKiBTdG9yZSB0aGUgbWluIGluZGV4IHZhbHVlIGZvciBhbGxvY2F0aW5nIGEgbmV3IHNlc3Npb24uCi0JCSAqIEhlcmUsIGlmIHNlc3Npb24gc3RyZWFtIG5hbWUgaXMgbm90IGZvdW5kIGluIHRoZQotCQkgKiBleGlzdGluZyBlbnRyaWVzIGFmdGVyIHRoZSBsb29wIGl0ZXJhdGlvbiwgdGhlbiB0aGlzCi0JCSAqIGluZGV4IHdpbGwgYmUgdXNlZCB0byBhbGxvY2F0ZSB0aGUgbmV3IHNlc3Npb24uCi0JCSAqIFRoaXMgaW5kZXggdmFyaWFibGUgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIHRvcG1vc3QKLQkJICogYXZhaWxhYmxlIGZyZWUgc2Vzc2lvbi4KLQkJICovCi0JCWlmICghKHNlc3Npb25fbWFwW25dLnN0cmVhbV9uYW1lWzBdKSAmJiAoaW5kZXggPCAwKSkKLQkJCWluZGV4ID0gbjsKLQl9Ci0KLQlpZiAoaW5kZXggPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IE1heCBTZXNzaW9ucyBhbGxvY2F0ZWRcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBleGl0OwotCX0KLQotCXNlc3Npb25fbWFwW2luZGV4XS5sb29wYmFja19wcml2ID0ga3phbGxvYygKLQkJc2l6ZW9mKHN0cnVjdCBtc21fcGNtX2xvb3BiYWNrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXNzaW9uX21hcFtpbmRleF0ubG9vcGJhY2tfcHJpdikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc3RybGNweShzZXNzaW9uX21hcFtpbmRleF0uc3RyZWFtX25hbWUsCi0JCXJ0ZC0+ZGFpX2xpbmstPnN0cmVhbV9uYW1lLAotCQlzaXplb2Yoc2Vzc2lvbl9tYXBbaW5kZXhdLnN0cmVhbV9uYW1lKSk7Ci0JZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogc3RyZWFtICVzIGluZGV4ICVkXG4iLAotCQlfX2Z1bmNfXywgc2Vzc2lvbl9tYXBbaW5kZXhdLnN0cmVhbV9uYW1lLCBpbmRleCk7Ci0KLQltdXRleF9pbml0KCZzZXNzaW9uX21hcFtpbmRleF0ubG9vcGJhY2tfcHJpdi0+bG9jayk7Ci0JKnBjbSA9IHNlc3Npb25fbWFwW2luZGV4XS5sb29wYmFja19wcml2OwotZXhpdDoKLQltdXRleF91bmxvY2soJmxvb3BiYWNrX3Nlc3Npb25fbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwY20gPSBOVUxMOwotCWludCByZXQgPSAwOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZXZ0IGV2ZW50OwotCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90IGFzbV9tdG14X3N0cnRyX3dpbmRvdzsKLQl1aW50MzJfdCBwYXJhbV9pZDsKLQlzdHJ1Y3QgbXNtX3BjbV9wZGF0YSAqcGRhdGE7Ci0KLQlyZXQgPSAgbXNtX3BjbV9sb29wYmFja19nZXRfc2Vzc2lvbihydGQsICZwY20pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltdXRleF9sb2NrKCZwY20tPmxvY2spOwotCi0JcGNtLT52b2x1bWUgPSAweDIwMDA7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJcGNtLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlwY20tPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCi0JcGNtLT5pbnN0YW5jZSsrOwotCWRldl9kYmcocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IHBjbSBvdXQgb3BlbjogJWQsJWRcbiIsIF9fZnVuY19fLAotCQkJcGNtLT5pbnN0YW5jZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCWlmIChwY20tPmluc3RhbmNlID09IDIpIHsKLQkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wY21fcnggPQotCQkJCXBjbS0+cGxheWJhY2tfc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcGNtX3R4ID0KLQkJCQlwY20tPmNhcHR1cmVfc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCWlmIChwY20tPmF1ZGlvX2NsaWVudCAhPSBOVUxMKQotCQkJc3RvcF9wY20ocGNtKTsKLQotCQlwZGF0YSA9IChzdHJ1Y3QgbXNtX3BjbV9wZGF0YSAqKQotCQkJZGV2X2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0tPmRldik7Ci0JCWlmICghcGRhdGEpIHsKLQkJCWRldl9lcnIocnRkLT5wbGF0Zm9ybS0+ZGV2LAotCQkJCSIlczogcGxhdGZvcm0gZGF0YSBub3QgcG9wdWxhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnBjbS0+bG9jayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXBjbS0+YXVkaW9fY2xpZW50ID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKAotCQkJCShhcHBfY2IpbXNtX3BjbV9sb29wYmFja19ldmVudF9oYW5kbGVyLCBwY20pOwotCQlpZiAoIXBjbS0+YXVkaW9fY2xpZW50KSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+cGxhdGZvcm0tPmRldiwKLQkJCQkiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXBjbS0+c2Vzc2lvbl9pZCA9IHBjbS0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOwotCQlwY20tPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gcGRhdGEtPnBlcmZfbW9kZTsKLQkJcmV0ID0gcTZhc21fb3Blbl9sb29wYmFja192MihwY20tPmF1ZGlvX2NsaWVudCwKLQkJCQkJICAgICBiaXRzX3Blcl9zYW1wbGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihydGQtPnBsYXRmb3JtLT5kZXYsCi0JCQkJIiVzOiBwY20gb3V0IG9wZW4gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShwY20tPmF1ZGlvX2NsaWVudCk7Ci0JCQltdXRleF91bmxvY2soJnBjbS0+bG9jayk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlldmVudC5ldmVudF9mdW5jID0gbXNtX3BjbV9yb3V0ZV9ldmVudF9oYW5kbGVyOwotCQlldmVudC5wcml2X2RhdGEgPSAodm9pZCAqKSBwY207Ci0JCW1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShzb2NfcGNtX3R4LT5kYWlfbGluay0+aWQsCi0JCQlwY20tPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJcGNtLT5zZXNzaW9uX2lkLCBwY20tPmNhcHR1cmVfc3Vic3RyZWFtLT5zdHJlYW0pOwotCQltc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW1fdjIoc29jX3BjbV9yeC0+ZGFpX2xpbmstPmlkLAotCQkJcGNtLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSwKLQkJCXBjbS0+c2Vzc2lvbl9pZCwgcGNtLT5wbGF5YmFja19zdWJzdHJlYW0tPnN0cmVhbSwKLQkJCWV2ZW50KTsKLQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJCXBjbS0+cGxheWJhY2tfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCQkJcmV0ID0gcGNtX2xvb3BiYWNrX3NldF92b2x1bWUocGNtLCBwY20tPnZvbHVtZSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlkZXZfZXJyKHJ0ZC0+cGxhdGZvcm0tPmRldiwKLQkJCQkJIkVycm9yICVkIHNldHRpbmcgdm9sdW1lIiwgcmV0KTsKLQkJfQotCQkvKiBTZXQgdG8gbGFyZ2VzdCBuZWdhdGl2ZSB2YWx1ZSAqLwotCQlhc21fbXRteF9zdHJ0cl93aW5kb3cud2luZG93X2xzdyA9IDB4MDAwMDAwMDA7Ci0JCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbXN3ID0gMHg4MDAwMDAwMDsKLQkJcGFyYW1faWQgPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9XSU5ET1dfU1RBUlRfVjI7Ci0JCXE2YXNtX3NlbmRfbXRteF9zdHJ0cl93aW5kb3cocGNtLT5hdWRpb19jbGllbnQsCi0JCQkJCSAgICAgJmFzbV9tdG14X3N0cnRyX3dpbmRvdywKLQkJCQkJICAgICBwYXJhbV9pZCk7Ci0JCS8qIFNldCB0byBsYXJnZXN0IHBvc2l0aXZlIHZhbHVlICovCi0JCWFzbV9tdG14X3N0cnRyX3dpbmRvdy53aW5kb3dfbHN3ID0gMHhmZmZmZmZmZjsKLQkJYXNtX210bXhfc3RydHJfd2luZG93LndpbmRvd19tc3cgPSAweDdmZmZmZmZmOwotCQlwYXJhbV9pZCA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX1dJTkRPV19FTkRfVjI7Ci0JCXE2YXNtX3NlbmRfbXRteF9zdHJ0cl93aW5kb3cocGNtLT5hdWRpb19jbGllbnQsCi0JCQkJCSAgICAgJmFzbV9tdG14X3N0cnRyX3dpbmRvdywKLQkJCQkJICAgICBwYXJhbV9pZCk7Ci0JfQotCWRldl9pbmZvKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBJbnN0YW5jZSA9ICVkLCBTdHJlYW0gSUQgPSAlc1xuIiwKLQkJCV9fZnVuY19fLCBwY20tPmluc3RhbmNlLCBzdWJzdHJlYW0tPnBjbS0+aWQpOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBjbTsKLQotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzdG9wX3BjbShzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcGNtX3J4OwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcGNtX3R4OwotCi0JaWYgKHBjbS0+YXVkaW9fY2xpZW50ID09IE5VTEwpCi0JCXJldHVybjsKLQlxNmFzbV9jbWQocGNtLT5hdWRpb19jbGllbnQsIENNRF9DTE9TRSk7Ci0KLQlpZiAocGNtLT5wbGF5YmFja19zdWJzdHJlYW0gIT0gTlVMTCkgewotCQlzb2NfcGNtX3J4ID0gcGNtLT5wbGF5YmFja19zdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQkJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BjbV9yeC0+ZGFpX2xpbmstPmlkLAotCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwotCX0KLQlpZiAocGNtLT5jYXB0dXJlX3N1YnN0cmVhbSAhPSBOVUxMKSB7Ci0JCXNvY19wY21fdHggPSBwY20tPmNhcHR1cmVfc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCW1zbV9wY21fcm91dGluZ19kZXJlZ19waHlfc3RyZWFtKHNvY19wY21fdHgtPmRhaV9saW5rLT5pZCwKLQkJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwotCX0KLQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShwY20tPmF1ZGlvX2NsaWVudCk7Ci0JcGNtLT5hdWRpb19jbGllbnQgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0JaW50IHJldCA9IDAsIG47Ci0JYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0JbXV0ZXhfbG9jaygmcGNtLT5sb2NrKTsKLQotCWRldl9kYmcocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IGVuZCBwY20gY2FsbDolZFxuIiwKLQkJX19mdW5jX18sIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJcGNtLT5wbGF5YmFja19zdGFydCA9IDA7Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlwY20tPmNhcHR1cmVfc3RhcnQgPSAwOwotCi0JcGNtLT5pbnN0YW5jZS0tOwotCWlmICghcGNtLT5wbGF5YmFja19zdGFydCB8fCAhcGNtLT5jYXB0dXJlX3N0YXJ0KSB7Ci0JCWRldl9kYmcocnRkLT5wbGF0Zm9ybS0+ZGV2LCAiJXM6IGVuZCBwY20gY2FsbFxuIiwgX19mdW5jX18pOwotCQlzdG9wX3BjbShwY20pOwotCX0KLQotCWlmICghcGNtLT5pbnN0YW5jZSkgewotCQltdXRleF9sb2NrKCZsb29wYmFja19zZXNzaW9uX2xvY2spOwotCQlmb3IgKG4gPSAwOyBuIDwgTE9PUEJBQ0tfU0VTU0lPTl9NQVg7IG4rKykgewotCQkJaWYgKCFzdHJjbXAocnRkLT5kYWlfbGluay0+c3RyZWFtX25hbWUsCi0JCQkJCXNlc3Npb25fbWFwW25dLnN0cmVhbV9uYW1lKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZm91bmQpIHsKLQkJCW1lbXNldChzZXNzaW9uX21hcFtuXS5zdHJlYW1fbmFtZSwgMCwKLQkJCQlzaXplb2Yoc2Vzc2lvbl9tYXBbbl0uc3RyZWFtX25hbWUpKTsKLQkJCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQkJCW11dGV4X2Rlc3Ryb3koJnNlc3Npb25fbWFwW25dLmxvb3BiYWNrX3ByaXYtPmxvY2spOwotCQkJc2Vzc2lvbl9tYXBbbl0ubG9vcGJhY2tfcHJpdiA9IE5VTEw7Ci0JCQlrZnJlZShwY20pOwotCQkJZGV2X2RiZyhydGQtPnBsYXRmb3JtLT5kZXYsICIlczogc3RyZWFtIGZyZWVkICVzXG4iLAotCQkJCV9fZnVuY19fLCBydGQtPmRhaV9saW5rLT5zdHJlYW1fbmFtZSk7Ci0JCQltdXRleF91bmxvY2soJmxvb3BiYWNrX3Nlc3Npb25fbG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQltdXRleF91bmxvY2soJmxvb3BiYWNrX3Nlc3Npb25fbG9jayk7Ci0JfQotCW11dGV4X3VubG9jaygmcGNtLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQotCW11dGV4X2xvY2soJnBjbS0+bG9jayk7Ci0KLQlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwgIiVzOiBBU00gbG9vcGJhY2sgc3RyZWFtOiVkXG4iLAotCQlfX2Z1bmNfXywgc3Vic3RyZWFtLT5zdHJlYW0pOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWlmICghcGNtLT5wbGF5YmFja19zdGFydCkKLQkJCXBjbS0+cGxheWJhY2tfc3RhcnQgPSAxOwotCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCWlmICghcGNtLT5jYXB0dXJlX3N0YXJ0KQotCQkJcGNtLT5jYXB0dXJlX3N0YXJ0ID0gMTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwY20tPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3BjbV9sb29wYmFjayAqcGNtID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlkZXZfZGJnKHJ0ZC0+cGxhdGZvcm0tPmRldiwKLQkJCSIlczogcGxheWJhY2tfc3RhcnQ6JWQsY2FwdHVyZV9zdGFydDolZFxuIiwgX19mdW5jX18sCi0JCQlwY20tPnBsYXliYWNrX3N0YXJ0LCBwY20tPmNhcHR1cmVfc3RhcnQpOwotCQlpZiAocGNtLT5wbGF5YmFja19zdGFydCAmJiBwY20tPmNhcHR1cmVfc3RhcnQpCi0JCQlxNmFzbV9ydW5fbm93YWl0KHBjbS0+YXVkaW9fY2xpZW50LCAwLCAwLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCWRldl9kYmcocnRkLT5wbGF0Zm9ybS0+ZGV2LAotCQkJIiVzOlBhdXNlL1N0b3AgLSBwbGF5YmFja19zdGFydDolZCxjYXB0dXJlX3N0YXJ0OiVkXG4iLAotCQkJX19mdW5jX18sIHBjbS0+cGxheWJhY2tfc3RhcnQsIHBjbS0+Y2FwdHVyZV9zdGFydCk7Ci0JCWlmIChwY20tPnBsYXliYWNrX3N0YXJ0ICYmIHBjbS0+Y2FwdHVyZV9zdGFydCkKLQkJCXE2YXNtX2NtZF9ub3dhaXQocGNtLT5hdWRpb19jbGllbnQsIENNRF9QQVVTRSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRlZmF1bHQgY21kICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbXNtX3BjbV9vcGVuLAotCS5jbG9zZSAgICAgICAgICA9IG1zbV9wY21fY2xvc2UsCi0JLnByZXBhcmUgICAgICAgID0gbXNtX3BjbV9wcmVwYXJlLAotCS50cmlnZ2VyICAgICAgICA9IG1zbV9wY21fdHJpZ2dlciwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV92b2x1bWVfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fdm9sdW1lICp2b2wgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gdm9sLT5wY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtOwotCXN0cnVjdCBtc21fcGNtX2xvb3BiYWNrICpwcnRkOwotCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXByX2RlYnVnKCIlczogdm9sdW1lIDogMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7Ci0JaWYgKCghc3Vic3RyZWFtKSB8fCAoIXN1YnN0cmVhbS0+cnVudGltZSkpIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gb3IgcnVudGltZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXJjID0gcGNtX2xvb3BiYWNrX3NldF92b2x1bWUocHJ0ZCwgdm9sdW1lKTsKLQotZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV92b2x1bWVfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fdm9sdW1lICp2b2wgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQotCQl2b2wtPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07Ci0Jc3RydWN0IG1zbV9wY21fbG9vcGJhY2sgKnBydGQ7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoKCFzdWJzdHJlYW0pIHx8ICghc3Vic3RyZWFtLT5ydW50aW1lKSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBvciBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcnRkLT52b2x1bWU7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbS0+c3RyZWFtc1swXS5wY207Ci0Jc3RydWN0IHNuZF9wY21fdm9sdW1lICp2b2x1bWVfaW5mbzsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwotCWludCByZXQgPSAwOwotCi0JZGV2X2RiZyhydGQtPmRldiwgIiVzLCBWb2x1bWUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0ID0gc25kX3BjbV9hZGRfdm9sdW1lX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJCSAgICAgIE5VTEwsIDEsCi0JCQkJICAgICAgcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJICAgICAgJnZvbHVtZV9pbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlrY3RsID0gdm9sdW1lX2luZm8tPmtjdGw7Ci0Ja2N0bC0+cHV0ID0gbXNtX3BjbV92b2x1bWVfY3RsX3B1dDsKLQlrY3RsLT5nZXQgPSBtc21fcGNtX3ZvbHVtZV9jdGxfZ2V0OwotCWtjdGwtPnRsdi5wID0gbG9vcGJhY2tfcnhfdm9sX2dhaW47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQlpbnQgYmVfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXTsKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIGNmZ19kYXRhID0gezAsIDAsIDQ4MDAwfTsKLQlpbnQgcmV0ID0gMDsKLQotCWNmZ19kYXRhLmFwcF90eXBlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JY2ZnX2RhdGEuYWNkYl9kZXZfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gIT0gMCkKLQkJY2ZnX2RhdGEuc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1IHNlc3Npb25fdHlwZS0gJWQgYmVfaWQtICVkIGFwcF90eXBlLSAlZCBhY2RiX2Rldl9pZC0gJWQgc2FtcGxlX3JhdGUtICVkXG4iLAotCQlfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgYmVfaWQsCi0JCWNmZ19kYXRhLmFwcF90eXBlLCBjZmdfZGF0YS5hY2RiX2Rldl9pZCwgY2ZnX2RhdGEuc2FtcGxlX3JhdGUpOwotCXJldCA9IG1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgc2Vzc2lvbl90eXBlLAotCQkJCQkJICAgICAgYmVfaWQsICZjZmdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQlpbnQgYmVfaWQgPSAwOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MH07Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgICZiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNmZ19kYXRhLmFwcF90eXBlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2ZnX2RhdGEuYWNkYl9kZXZfaWQ7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPSBjZmdfZGF0YS5zYW1wbGVfcmF0ZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9IGJlX2lkOwotCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBiZV9pZCAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7Ci0JaW50IGJlX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM107Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswLCAwLCA0ODAwMH07Ci0JaW50IHJldCA9IDA7Ci0KLQljZmdfZGF0YS5hcHBfdHlwZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWNmZ19kYXRhLmFjZGJfZGV2X2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdICE9IDApCi0JCWNmZ19kYXRhLnNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0JcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdSBzZXNzaW9uX3R5cGUtICVkIGJlX2lkLSAlZCBhcHBfdHlwZS0gJWQgYWNkYl9kZXZfaWQtICVkIHNhbXBsZV9yYXRlLSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgIGJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQlpbnQgYmVfaWQgPSAwOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MH07Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgICZiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNmZ19kYXRhLmFwcF90eXBlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gY2ZnX2RhdGEuYWNkYl9kZXZfaWQ7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gPSBjZmdfZGF0YS5zYW1wbGVfcmF0ZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSA9IGJlX2lkOwotCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWxsdSwgc2Vzc2lvbl90eXBlICVkLCBiZV9pZCAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2FkZF9hcHBfdHlwZV9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbS0+c3RyZWFtc1swXS5wY207Ci0Jc3RydWN0IHNuZF9wY21fdXNyICphcHBfdHlwZV9pbmZvOwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7Ci0JY29uc3QgY2hhciAqcGxheWJhY2tfbWl4ZXJfY3RsX25hbWUJPSAiQXVkaW8gU3RyZWFtIjsKLQljb25zdCBjaGFyICpjYXB0dXJlX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSBDYXB0dXJlIjsKLQljb25zdCBjaGFyICpkZXZpY2VObwkJPSAiTk4iOwotCWNvbnN0IGNoYXIgKnN1ZmZpeAkJPSAiQXBwIFR5cGUgQ2ZnIjsKLQlpbnQgY3RsX2xlbiwgcmV0ID0gMDsKLQotCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtKSB7Ci0JCWN0bF9sZW4gPSBzdHJsZW4ocGxheWJhY2tfbWl4ZXJfY3RsX25hbWUpICsgMSArCi0JCQkJc3RybGVuKGRldmljZU5vKSArIDEgKyBzdHJsZW4oc3VmZml4KSArIDE7Ci0JCXByX2RlYnVnKCIlczogUGxheWJhY2sgYXBwIHR5cGUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IHNuZF9wY21fYWRkX3Vzcl9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKLQkJCQkJTlVMTCwgMSwgY3RsX2xlbiwgcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJCSZhcHBfdHlwZV9pbmZvKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlrY3RsID0gYXBwX3R5cGVfaW5mby0+a2N0bDsKLQkJc25wcmludGYoa2N0bC0+aWQubmFtZSwgY3RsX2xlbiwgIiVzICVkICVzIiwKLQkJCXBsYXliYWNrX21peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlLCBzdWZmaXgpOwotCQlrY3RsLT5wdXQgPSBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfcHV0OwotCQlrY3RsLT5nZXQgPSBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfZ2V0OwotCX0KLQotCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKLQkJY3RsX2xlbiA9IHN0cmxlbihjYXB0dXJlX21peGVyX2N0bF9uYW1lKSArIDEgKwotCQkJCXN0cmxlbihkZXZpY2VObykgKyAxICsgc3RybGVuKHN1ZmZpeCkgKyAxOwotCQlwcl9kZWJ1ZygiJXM6IENhcHR1cmUgYXBwIHR5cGUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IHNuZF9wY21fYWRkX3Vzcl9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAotCQkJCQlOVUxMLCAxLCBjdGxfbGVuLCBydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJJmFwcF90eXBlX2luZm8pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWtjdGwgPSBhcHBfdHlwZV9pbmZvLT5rY3RsOwotCQlzbnByaW50ZihrY3RsLT5pZC5uYW1lLCBjdGxfbGVuLCAiJXMgJWQgJXMiLAotCQkJY2FwdHVyZV9taXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKLQkJa2N0bC0+cHV0ID0gbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfcHV0OwotCQlrY3RsLT5nZXQgPSBtc21fcGNtX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2N0bF9nZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXJldCA9IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9scyhydGQpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IHBjbSBhZGQgdm9sdW1lIGNvbnRyb2xzIGZhaWxlZDolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCXJldCA9IG1zbV9wY21fYWRkX2FwcF90eXBlX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogcGNtIGFkZCBhcHAgdHlwZSBjb250cm9scyBmYWlsZWQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQotCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotCXJldCA9IG1zbV9wY21fYWRkX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihydGQtPmRldiwgIiVzLCBrY3RsIGFkZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2NfcGxhdGZvcm0gPSB7Ci0JLm9wcyAgICAgICAgICAgID0gJm1zbV9wY21fb3BzLAotCS5wY21fbmV3ICAgICAgICA9IG1zbV9hc29jX3BjbV9uZXcsCi0JLnByb2JlICAgICAgICAgID0gbXNtX3BjbV9sb29wYmFja19wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtc21fcGNtX3BkYXRhICpwZGF0YTsKLQotCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBkZXYgbmFtZSAlc1xuIiwKLQkJX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQotCXBkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9wY21fcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInFjb20sbXNtLXBjbS1sb29wYmFjay1sb3ctbGF0ZW5jeSIpKQotCQlwZGF0YS0+cGVyZl9tb2RlID0gTE9XX0xBVEVOQ1lfUENNX01PREU7Ci0JZWxzZQotCQlwZGF0YS0+cGVyZl9tb2RlID0gTEVHQUNZX1BDTV9NT0RFOwotCi0JZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHBkYXRhKTsKLQotCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCi0JCQkJICAgJm1zbV9zb2NfcGxhdGZvcm0pOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fcGNtX2xvb3BiYWNrX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLXBjbS1sb29wYmFjayJ9LAotCXt9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tcGNtLWxvb3BiYWNrIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV9wY21fbG9vcGJhY2tfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fcGNtX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fcGNtX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ00gbG9vcGJhY2sgcGxhdGZvcm0gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi1ub2lycS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtbm9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhMmJmZi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi1ub2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Ci0jaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC90aW1lci5oPgotI2luY2x1ZGUgPHNvdW5kL2h3ZGVwLmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL2RldmRlcF9wYXJhbXMuaD4KLQotI2luY2x1ZGUgIm1zbS1wY20tcTYtdjIuaCIKLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLQotI2RlZmluZSBQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMJMHgyMDAwCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1zbV9wY21fdm9sX2dhaW4sIDAsCi0JCQlQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMpOwotCi1zdHJ1Y3Qgc25kX21zbSB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci19OwotCi0jZGVmaW5lIENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIICA1MAotI2RlZmluZSBDTURfRU9TX1RJTUVPVVRfTVVMVElQTElFUiAgKEhaICogNTApCi0KLSNkZWZpbmUgQVRSQUNFX0VORCgpIFwKLQl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogRVxuIikKLSNkZWZpbmUgQVRSQUNFX0JFR0lOKG5hbWUpIFwKLQl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogQnwlZHwlc1xuIiwgY3VycmVudC0+dGdpZCwgbmFtZSkKLSNkZWZpbmUgQVRSQUNFX0ZVTkMoKSBBVFJBQ0VfQkVHSU4oX19mdW5jX18pCi0jZGVmaW5lIEFUUkFDRV9JTlQobmFtZSwgdmFsdWUpIFwKLQl0cmFjZV9wcmludGsoInRyYWNpbmdfbWFya193cml0ZTogQ3wlZHwlc3wlZFxuIiwgXAotCQkJY3VycmVudC0+dGdpZCwgbmFtZSwgKGludCkodmFsdWUpKQotCi0jZGVmaW5lIFNJT19QTEFZQkFDS19NQVhfUEVSSU9EX1NJWkUgUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFCi0jZGVmaW5lIFNJT19QTEFZQkFDS19NSU5fUEVSSU9EX1NJWkUgNDgKLSNkZWZpbmUgU0lPX1BMQVlCQUNLX01BWF9OVU1fUEVSSU9EUyA1MTIKLSNkZWZpbmUgU0lPX1BMQVlCQUNLX01JTl9OVU1fUEVSSU9EUyBQTEFZQkFDS19NSU5fTlVNX1BFUklPRFMKLSNkZWZpbmUgU0lPX1BMQVlCQUNLX01JTl9CWVRFUyAoU0lPX1BMQVlCQUNLX01JTl9OVU1fUEVSSU9EUyAqCVwKLQkJCQlTSU9fUExBWUJBQ0tfTUlOX1BFUklPRF9TSVpFKQotCi0jZGVmaW5lIFNJT19QTEFZQkFDS19NQVhfQllURVMgKChTSU9fUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTKSAqCVwKLQkJCQkoU0lPX1BMQVlCQUNLX01BWF9QRVJJT0RfU0laRSkpCi0KLSNkZWZpbmUgU0lPX0NBUFRVUkVfTUFYX1BFUklPRF9TSVpFIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFCi0jZGVmaW5lIFNJT19DQVBUVVJFX01JTl9QRVJJT0RfU0laRSA0OAotI2RlZmluZSBTSU9fQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFMgNTEyCi0jZGVmaW5lIFNJT19DQVBUVVJFX01JTl9OVU1fUEVSSU9EUyBDQVBUVVJFX01JTl9OVU1fUEVSSU9EUwotCi0jZGVmaW5lIFNJT19DQVBUVVJFX01JTl9CWVRFUyAoU0lPX0NBUFRVUkVfTUlOX05VTV9QRVJJT0RTICoJXAotCQkJICAgICAgIFNJT19DQVBUVVJFX01JTl9QRVJJT0RfU0laRSkKLQotI2RlZmluZSBTSU9fQ0FQVFVSRV9NQVhfQllURVMgKFNJT19DQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqCVwKLQkJCQlTSU9fQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUpCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX3BsYXliYWNrID0gewotCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAgfAotCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwgU05EUlZfUENNX0lORk9fUkVTVU1FKSwKLQkuZm9ybWF0cyA9ICAgICAgICAgICAgICAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUpLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgMTkyMDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgOCwKLQkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBTSU9fUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICoKLQkJCQlTSU9fUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWluID0JU0lPX1BMQVlCQUNLX01JTl9QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21heCA9ICAgICBTSU9fUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFLAotCS5wZXJpb2RzX21pbiA9ICAgICAgICAgIFNJT19QTEFZQkFDS19NSU5fTlVNX1BFUklPRFMsCi0JLnBlcmlvZHNfbWF4ID0gICAgICAgICAgU0lPX1BMQVlCQUNLX01BWF9OVU1fUEVSSU9EUywKLQkuZmlmb19zaXplID0gICAgICAgICAgICAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmVfY2FwdHVyZSA9IHsKLQkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fTU1BUCB8Ci0JCQkJU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19QQVVTRSB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRSksCi0JLmZvcm1hdHMgPSAgICAgICAgICAgICAgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFKSwKLQkucmF0ZXMgPSAgICAgICAgICAgICAgICBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCi0JLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKLQkuY2hhbm5lbHNfbWF4ID0gICAgICAgICA0LAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIFNJT19DQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqCi0JCQkJU0lPX0NBUFRVUkVfTUFYX1BFUklPRF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWluID0JU0lPX0NBUFRVUkVfTUlOX1BFUklPRF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0gICAgIFNJT19DQVBUVVJFX01BWF9QRVJJT0RfU0laRSwKLQkucGVyaW9kc19taW4gPSAgICAgICAgICBTSU9fQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMsCi0JLnBlcmlvZHNfbWF4ID0gICAgICAgICAgU0lPX0NBUFRVUkVfTUFYX05VTV9QRVJJT0RTLAotCS5maWZvX3NpemUgPSAgICAgICAgICAgIDAsCi19OwotCi0vKiBDb252ZW50aW9uYWwgYW5kIHVuY29udmVudGlvbmFsIHNhbXBsZSByYXRlIHN1cHBvcnRlZCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzW10gPSB7Ci0JODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLAotCTg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCi0JLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAotCS5tYXNrID0gMCwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1zbV9wY21fZmVfdG9wb2xvZ3lbTVNNX0ZST05URU5EX0RBSV9NQVhdOwotCi0vKiBkZWZhdWx0IHZhbHVlIGlzIERUUyAoaS5lIHJlYWQgZnJvbSBkZXZpY2UgdHJlZSkgKi8KLXN0YXRpYyBjaGFyIGNvbnN0ICptc21fcGNtX2ZlX3RvcG9sb2d5X3RleHRbXSA9IHsKLQkiRFRTIiwgIlVMTCIsICJVTExfUFAiLCAiTEwiIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbXNtX3BjbV9mZV90b3BvbG9neV9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKG1zbV9wY21fZmVfdG9wb2xvZ3lfdGV4dCksCi0JCQkgICAgbXNtX3BjbV9mZV90b3BvbG9neV90ZXh0KSwKLX07Ci0KLXN0YXRpYyB2b2lkIGV2ZW50X2hhbmRsZXIodWludDMyX3Qgb3Bjb2RlLAotCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgKnB0cm1lbSA9ICh1aW50MzJfdCAqKXBheWxvYWQ7Ci0KLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQVNNX0RBVEFfRVZFTlRfV0FURVJNQVJLOgotCQlwcl9kZWJ1ZygiJXM6IFdhdGVybWFyayBsZXZlbCA9IDB4JTA4eFxuIiwgX19mdW5jX18sICpwdHJtZW0pOwotCQlicmVhazsKLQljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOgotCQlwcl9kZWJ1ZygiJXM6IFBheWxvYWQgPSBbMHgleF1zdGF0WzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7Ci0JCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JVTl9WMjoKLQkJY2FzZSBBU01fU0VTU0lPTl9DTURfUEFVU0U6Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfRkxVU0g6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCJOb3QgU3VwcG9ydGVkIEV2ZW50IG9wY29kZVsweCV4XVxuIiwgb3Bjb2RlKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcnRkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zbV9hdWRpbyksIEdGUF9LRVJORUwpOwotCi0JaWYgKHBydGQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcnRkLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9wbGF5YmFjazsKLQllbHNlCi0JCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZV9jYXB0dXJlOwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwKLQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKLQlpZiAocmV0KQotCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBmYWlsZWRcbiIpOwotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKLQkJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAocmV0KQotCQlwcl9pbmZvKCJzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlciBmYWlsZWRcbiIpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAotCQkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKLQkJCVNJT19QTEFZQkFDS19NSU5fQllURVMsCi0JCQlTSU9fUExBWUJBQ0tfTUFYX0JZVEVTKTsKLQkJaWYgKHJldCkgewotCQkJcHJfaW5mbygiJXM6IFAgYnVmZmVyIGJ5dGVzIG1pbm1heCBjb25zdHJhaW50IHJldCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJfQotCX0gZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKLQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsCi0JCQkgICBTSU9fQ0FQVFVSRV9NSU5fQllURVMsCi0JCQkgICBTSU9fQ0FQVFVSRV9NQVhfQllURVMpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9pbmZvKCIlczogQyBidWZmZXIgYnl0ZXMgbWlubWF4IGNvbnN0cmFpbnQgcmV0ICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQl9Ci0JfQotCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29uc3RyYWludCBmb3IgcGVyaW9kIGJ5dGVzIHN0ZXAgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JfQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCi0JCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIDMyKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IENvbnN0cmFpbnQgZm9yIGJ1ZmZlciBieXRlcyBzdGVwIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQlwcnRkLT5hdWRpb19jbGllbnQgPSBxNmFzbV9hdWRpb19jbGllbnRfYWxsb2MoCi0JCQkJKGFwcF9jYilldmVudF9oYW5kbGVyLCBwcnRkKTsKLQlpZiAoIXBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlwcl9lcnIoIiVzOiBjbGllbnQgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXBydGQtPmRzcF9jbnQgPSAwOwotCXBydGQtPnNldF9jaGFubmVsX21hcCA9IGZhbHNlOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci0JcmV0dXJuIDA7Ci0KLWZhaWxfY21kOgotCWtmcmVlKHBydGQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi0KLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9wbGF0X2RhdGEgKnBkYXRhOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOwotCXN0cnVjdCBzaGFyZWRfaW9fY29uZmlnIGNvbmZpZzsKLQl1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKLQlpbnQgcmV0OwotCWludCBkaXIgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPyBJTiA6IE9VVDsKLQl1bnNpZ25lZCBsb25nIHRvcG9sb2d5OwotCWludCBwZXJmX21vZGU7Ci0KLQlwZGF0YSA9IChzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqKQotCQlkZXZfZ2V0X2RydmRhdGEoc29jX3BydGQtPnBsYXRmb3JtLT5kZXYpOwotCWlmICghcGRhdGEpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJcHJfZXJyKCIlczogcGxhdGZvcm0gZGF0YSBub3QgcG9wdWxhdGVkIHJldDogJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl0b3BvbG9neSA9IG1zbV9wY21fZmVfdG9wb2xvZ3lbc29jX3BydGQtPmRhaV9saW5rLT5pZF07Ci0KLQlpZiAoIXN0cmNtcChtc21fcGNtX2ZlX3RvcG9sb2d5X3RleHRbdG9wb2xvZ3ldLCAiVUxMX1BQIikpCi0JCXBlcmZfbW9kZSA9IFVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREU7Ci0JZWxzZSBpZiAoIXN0cmNtcChtc21fcGNtX2ZlX3RvcG9sb2d5X3RleHRbdG9wb2xvZ3ldLCAiVUxMIikpCi0JCXBlcmZfbW9kZSA9IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFOwotCWVsc2UgaWYgKCFzdHJjbXAobXNtX3BjbV9mZV90b3BvbG9neV90ZXh0W3RvcG9sb2d5XSwgIkxMIikpCi0JCXBlcmZfbW9kZSA9IExPV19MQVRFTkNZX1BDTV9NT0RFOwotCWVsc2UKLQkJLyogdXNlIHRoZSBkZWZhdWx0IGZyb20gdGhlIGRldmljZSB0cmVlICovCi0JCXBlcmZfbW9kZSA9IHBkYXRhLT5wZXJmX21vZGU7Ci0KLQotCS8qIG5lZWQgdG8gc2V0IExPV19MQVRFTkNZX1BDTV9NT0RFIGZvciBjYXB0dXJlIHNpbmNlCi0JICogcHVzaCBtb2RlIGRvZXMgbm90IHN1cHBvcnQgVUxMCi0JICovCi0JcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSAoZGlyID09IElOKSA/Ci0JCQkJCXBlcmZfbW9kZSA6Ci0JCQkJCUxPV19MQVRFTkNZX1BDTV9NT0RFOwotCi0JLyogcmF0ZSBhbmQgY2hhbm5lbHMgYXJlIHNlbnQgdG8gYXVkaW8gZHJpdmVyICovCi0JcHJ0ZC0+c2FtcF9yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQlwcnRkLT5jaGFubmVsX21vZGUgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlpZiAocHJ0ZC0+ZW5hYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKHJ1bnRpbWUtPmZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWJpdHNfcGVyX3NhbXBsZSA9IDI0OwotCQlzYW1wbGVfd29yZF9zaXplID0gMzI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKLQkJc2FtcGxlX3dvcmRfc2l6ZSA9IDI0OwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCWJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCQlzYW1wbGVfd29yZF9zaXplID0gMTY7Ci0JCWJyZWFrOwotCX0KLQotCWNvbmZpZy5mb3JtYXQgPSBGT1JNQVRfTElORUFSX1BDTTsKLQljb25maWcuYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCWNvbmZpZy5yYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQljb25maWcuY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQljb25maWcuc2FtcGxlX3dvcmRfc2l6ZSA9IHNhbXBsZV93b3JkX3NpemU7Ci0JY29uZmlnLmJ1ZnN6ID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpIC8gcGFyYW1zX3BlcmlvZHMocGFyYW1zKTsKLQljb25maWcuYnVmY250ID0gcGFyYW1zX3BlcmlvZHMocGFyYW1zKTsKLQotCXJldCA9IHE2YXNtX29wZW5fc2hhcmVkX2lvKHBydGQtPmF1ZGlvX2NsaWVudCwgJmNvbmZpZywgZGlyKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHE2YXNtX29wZW5fd3JpdGVfc2hhcmVkX2lvIGZhaWxlZCByZXQ6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJ0ZC0+cGNtX3NpemUgPSBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcyk7Ci0JcHJ0ZC0+cGNtX2NvdW50ID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOwotCXBydGQtPnBjbV9pcnFfcG9zID0gMDsKLQotCWJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtkaXJdLmJ1ZjsKLQlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKLQlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWRtYV9idWYtPmFyZWEgPSBidWYtPmRhdGE7Ci0JZG1hX2J1Zi0+YWRkciA9IGJ1Zi0+cGh5czsKLQlkbWFfYnVmLT5ieXRlcyA9IHBydGQtPnBjbV9zaXplOwotCi0Jc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvbiBJRCAlZCwgcGVyZiAlZFxuIiwgX19mdW5jX18sCi0JICAgICAgIHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbiwKLQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUpOwotCXBydGQtPnNlc3Npb25faWQgPSBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb247Ci0KLQlwcl9kZWJ1ZygibXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtIHcvIGlkICVkXG4iLAotCQkgc29jX3BydGQtPmRhaV9saW5rLT5pZCk7Ci0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKHNvY19wcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJICAgICAgIHBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJCSAgICAgICBwcnRkLT5zZXNzaW9uX2lkLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSByZWcgZmFpbGVkIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JYXRvbWljX3NldCgmcHJ0ZC0+b3V0X2NvdW50LCBydW50aW1lLT5wZXJpb2RzKTsKLQlwcnRkLT5lbmFibGVkID0gMTsKLQlwcnRkLT5jbWRfcGVuZGluZyA9IDA7Ci0JcHJ0ZC0+Y21kX2ludGVycnVwdCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWludCBkaXIgPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPyAwIDogMTsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWY7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1ZygiJXM6ICVzIFRyaWdnZXIgc3RhcnRcbiIsIF9fZnVuY19fLAotCQkJIGRpciA9PSAwID8gIlAiIDogIkMiKTsKLQkJcmV0ID0gcTZhc21fcnVuKHBydGQtPmF1ZGlvX2NsaWVudCwgMCwgMCwgMCk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDEpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXByX2RlYnVnKCIlczogU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIiwgX19mdW5jX18pOwotCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JCXE2YXNtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9QQVVTRSk7Ci0JCXE2YXNtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9GTFVTSCk7Ci0JCWJ1ZiA9IHE2YXNtX3NoYXJlZF9pb19idWYocHJ0ZC0+YXVkaW9fY2xpZW50LCBkaXIpOwotCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IHNoYXJlZCBJTyBidWZmZXIgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbXNldChidWYtPmRhdGEsIDAsIGJ1Zi0+YWN0dWFsX3NpemUpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlwcl9kZWJ1ZygiJXM6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IHE2YXNtX2NtZF9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOwotCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX3BjbV9tbWFwX2ZkKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgc3RydWN0IHNuZF9wY21fbW1hcF9mZCAqbW1hcF9mZCkKLXsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKmFwZDsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKLQlpbnQgZGlyID0gLTE7Ci0KLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKCFwcnRkIHx8ICFwcnRkLT5hdWRpb19jbGllbnQgfHwgIXBydGQtPm1tYXBfZmxhZykgewotCQlwcl9lcnIoIiVzIG5vIGF1ZGlvIGNsaWVudCBvciBub3QgYW4gbW1hcCBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlkaXIgPSBJTjsKLQllbHNlCi0JCWRpciA9IE9VVDsKLQotCWFwZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydDsKLQlhYiA9ICYoYXBkW2Rpcl0uYnVmWzBdKTsKLQltbWFwX2ZkLT5mZCA9IGlvbl9zaGFyZV9kbWFfYnVmX2ZkKGFiLT5jbGllbnQsIGFiLT5oYW5kbGUpOwotCWlmIChtbWFwX2ZkLT5mZCA+PSAwKSB7Ci0JCW1tYXBfZmQtPmRpciA9IGRpcjsKLQkJbW1hcF9mZC0+YWN0dWFsX3NpemUgPSBhYi0+YWN0dWFsX3NpemU7Ci0JCW1tYXBfZmQtPnNpemUgPSBhYi0+c2l6ZTsKLQl9Ci0JcmV0dXJuIG1tYXBfZmQtPmZkIDwgMCA/IC1FRkFVTFQgOiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgZGlyID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spID8gMCA6IDE7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9JT0NUTDFfUkVTRVQ6Ci0JCXByX2RlYnVnKCIlczogJXMgU05EUlZfUENNX0lPQ1RMMV9SRVNFVFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBkaXIgPT0gMCA/ICJQIiA6ICJDIik7Ci0JCWJ1ZiA9IHE2YXNtX3NoYXJlZF9pb19idWYocHJ0ZC0+YXVkaW9fY2xpZW50LCBkaXIpOwotCi0JCWlmIChidWYgJiYgYnVmLT5kYXRhKQotCQkJbWVtc2V0KGJ1Zi0+ZGF0YSwgMCwgYnVmLT5hY3R1YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBpbnQgbXNtX3BjbV9jb21wYXRfaW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCS8qIHdlIG9ubHkgaGFuZGxlIFJFU0VUIHdoaWNoIGlzIGNvbW1vbiBmb3IgYm90aCBtb2RlcyAqLwotCXJldHVybiBtc21fcGNtX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQl1aW50MzJfdCByZWFkX2luZGV4LCB3YWxsX2Nsa19tc3csIHdhbGxfY2xrX2xzdzsKLQkvKnRoZXNlIGFyZSBvZmZzZXRzLCB1bmxpa2UgQVNvQydzIGZ1bGwgdmFsdWVzKi8KLQlzbmRfcGNtX3NmcmFtZXNfdCBod19wdHI7Ci0Jc25kX3BjbV9zZnJhbWVzX3QgcGVyaW9kX3NpemU7Ci0JaW50IHJldDsKLQlpbnQgcmV0cmllcyA9IDEwOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwZXJpb2Rfc2l6ZSA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCi0JZG8gewotCQlyZXQgPSBxNmFzbV9nZXRfc2hhcmVkX3BvcyhwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCSAgICZyZWFkX2luZGV4LCAmd2FsbF9jbGtfbXN3LAotCQkJCQkgICAmd2FsbF9jbGtfbHN3KTsKLQl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTiAmJiAtLXJldHJpZXMpOwotCi0JaWYgKHJldCB8fCAhcGVyaW9kX3NpemUpIHsKLQkJcHJfZXJyKCJnZXRfc2hhcmVkX3BvcyBlcnJvciBvciB6ZXJvIHBlcmlvZCBzaXplXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaHdfcHRyID0gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwKLQkJCQkgcmVhZF9pbmRleCk7Ci0KLQlpZiAocnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgPT0gMCkgewotCQlwcl9kZWJ1ZygicHRyKCVzKTogYXBwbCgwKSwgaHcgPSAlbHUgcmVhZF9pbmRleCA9ICV1XG4iLAotCQkJIHBydGQtPnN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwotCQkJICJQIiA6ICJDIiwKLQkJCSBod19wdHIsIHJlYWRfaW5kZXgpOwotCX0KLQlyZXR1cm4gKGh3X3B0ci9wZXJpb2Rfc2l6ZSkgKiBwZXJpb2Rfc2l6ZTsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAotCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqYXBkID0gYWMtPnBvcnQ7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWI7Ci0JaW50IGRpciA9IC0xOwotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1tYXAgYmVnaW5cbiIsIF9fZnVuY19fKTsKLQlwcnRkLT5tbWFwX2ZsYWcgPSAxOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWRpciA9IElOOwotCWVsc2UKLQkJZGlyID0gT1VUOwotCi0JYWIgPSAmKGFwZFtkaXJdLmJ1ZlswXSk7Ci0KLQlyZXQgPSBtc21fYXVkaW9faW9uX21tYXAoYWIsIHZtYSk7Ci0KLQlpZiAocmV0KQotCQlwcnRkLT5tbWFwX2ZsYWcgPSAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFwcnRkIHx8ICFwcnRkLT5tbWFwX2ZsYWcpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcHJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBwcnRkLT5hdWRpb19jbGllbnQ7Ci0JdWludDMyX3QgdGltZW91dDsKLQlpbnQgZGlyID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChhYykgewotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJCWRpciA9IElOOwotCQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCQlkaXIgPSBPVVQ7Ci0KLQkJLyogZGV0ZXJtaW5lIHRpbWVvdXQgbGVuZ3RoICovCi0JCWlmIChydW50aW1lLT5mcmFtZV9iaXRzID09IDAgfHwgcnVudGltZS0+cmF0ZSA9PSAwKSB7Ci0JCQl0aW1lb3V0ID0gQ01EX0VPU19NSU5fVElNRU9VVF9MRU5HVEg7Ci0JCX0gZWxzZSB7Ci0JCQl0aW1lb3V0ID0gKHJ1bnRpbWUtPnBlcmlvZF9zaXplICoKLQkJCQkJQ01EX0VPU19USU1FT1VUX01VTFRJUExJRVIpIC8KLQkJCQkJKChydW50aW1lLT5mcmFtZV9iaXRzIC8gOCkgKgotCQkJCQkgcnVudGltZS0+cmF0ZSk7Ci0JCQlpZiAodGltZW91dCA8IENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIKQotCQkJCXRpbWVvdXQgPSBDTURfRU9TX01JTl9USU1FT1VUX0xFTkdUSDsKLQkJfQotCi0JCXE2YXNtX2NtZChhYywgQ01EX0NMT1NFKTsKLQotCQlyZXQgPSBxNmFzbV9zaGFyZWRfaW9fZnJlZShhYywgZGlyKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY2xvc2UgcHVsbCBtb2RlLCByZXQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQl9Ci0JCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKGFjKTsKLQl9Ci0JbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJIGRpciA9PSBJTiA/Ci0JCQkJCSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLIDoKLQkJCQkJIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7Ci0Ja2ZyZWUocHJ0ZCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fc2V0X3ZvbHVtZShzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkLCB1aW50MzJfdCB2b2x1bWUpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmIChwcnRkICYmIHBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlwcl9kZWJ1ZygiJXM6IGNoYW5uZWxzICVkIHZvbHVtZSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCQlwcnRkLT5jaGFubmVsX21vZGUsIHZvbHVtZSk7Ci0JCXJjID0gcTZhc21fc2V0X3ZvbHVtZShwcnRkLT5hdWRpb19jbGllbnQsIHZvbHVtZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IFNlbmQgVm9sdW1lIGNvbW1hbmQgZmFpbGVkIHJjPSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmMpOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3ZvbHVtZV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV92b2x1bWUgKnZvbCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9Ci0JCXZvbC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCFzdWJzdHJlYW0pIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwcnRkKQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHBydGQtPnZvbHVtZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3ZvbHVtZV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fdm9sdW1lICp2b2wgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQotCQl2b2wtPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKLQlpbnQgdm9sdW1lID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IHZvbHVtZSA6IDB4JXhcbiIsIF9fZnVuY19fLCB2b2x1bWUpOwotCWlmICghc3Vic3RyZWFtKSB7Ci0JCXByX2VycigiJXMgc3Vic3RyZWFtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gcnVudGltZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAocHJ0ZCkgewotCQlyYyA9IG1zbV9wY21fc2V0X3ZvbHVtZShwcnRkLCB2b2x1bWUpOwotCQlwcnRkLT52b2x1bWUgPSB2b2x1bWU7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2FkZF92b2x1bWVfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKLQlzdHJ1Y3Qgc25kX3BjbV92b2x1bWUgKnZvbHVtZV9pbmZvOwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXMsIFZvbHVtZSBjb250cm9sIGFkZFxuIiwgX19mdW5jX18pOwotCXJldCA9IHNuZF9wY21fYWRkX3ZvbHVtZV9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKLQkJCU5VTEwsIDEsIHJ0ZC0+ZGFpX2xpbmstPmlkLAotCQkJJnZvbHVtZV9pbmZvKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzIHZvbHVtZSBjb250cm9sIGZhaWxlZCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlrY3RsID0gdm9sdW1lX2luZm8tPmtjdGw7Ci0Ja2N0bC0+cHV0ID0gbXNtX3BjbV92b2x1bWVfY3RsX3B1dDsKLQlrY3RsLT5nZXQgPSBtc21fcGNtX3ZvbHVtZV9jdGxfZ2V0OwotCWtjdGwtPnRsdi5wID0gbXNtX3BjbV92b2xfZ2FpbjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NobWFwX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNuZF9wY21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgaW50IGlkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7Ci0KLQlwcl9kZWJ1ZygiJXMiLCBfX2Z1bmNfXyk7Ci0Jc3Vic3RyZWFtID0gc25kX3BjbV9jaG1hcF9zdWJzdHJlYW0oaW5mbywgaWR4KTsKLQlpZiAoIXN1YnN0cmVhbSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpCi0JCXJldHVybiAwOwotCi0JcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwcnRkKSB7Ci0JCXBydGQtPnNldF9jaGFubmVsX21hcCA9IHRydWU7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUw7IGkrKykKLQkJCQlwcnRkLT5jaGFubmVsX21hcFtpXSA9Ci0JCQkJKGNoYXIpKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaG1hcF9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpOwotCXN0cnVjdCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCi0JcHJfZGVidWcoIiVzIiwgX19mdW5jX18pOwotCXN1YnN0cmVhbSA9IHNuZF9wY21fY2htYXBfc3Vic3RyZWFtKGluZm8sIGlkeCk7Ci0JaWYgKCFzdWJzdHJlYW0pCi0JCXJldHVybiAtRU5PREVWOwotCW1lbXNldCh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSwgMCwKLQkJc2l6ZW9mKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlKSk7Ci0JaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpCi0JCXJldHVybiAwOyAvKiBubyBjaGFubmVscyBzZXQgKi8KLQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCWlmIChwcnRkICYmIHBydGQtPnNldF9jaGFubmVsX21hcCA9PSB0cnVlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTDsgaSsrKQotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPQotCQkJCQkoaW50KXBydGQtPmNoYW5uZWxfbWFwW2ldOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTDsgaSsrKQotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX2NobWFwX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0Jc3RydWN0IHNuZF9wY21fY2htYXAgKmNobWFwX2luZm87Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljaGFyIGRldmljZV9udW1bMTJdOwotCWludCBpLCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXMsIENoYW5uZWwgbWFwIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOwotCXJldCA9IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJCSAgICAgc25kX3BjbV9zdGRfY2htYXBzLAotCQkJCSAgICAgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwsIDAsCi0JCQkJICAgICAmY2htYXBfaW5mbyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWtjdGwgPSBjaG1hcF9pbmZvLT5rY3RsOwotCWZvciAoaSA9IDA7IGkgPCBrY3RsLT5jb3VudDsgaSsrKQotCQlrY3RsLT52ZFtpXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1dSSVRFOwotCXNucHJpbnRmKGRldmljZV9udW0sIHNpemVvZihkZXZpY2VfbnVtKSwgIiVkIiwgcGNtLT5kZXZpY2UpOwotCXN0cmxjYXQoa2N0bC0+aWQubmFtZSwgZGV2aWNlX251bSwgc2l6ZW9mKGtjdGwtPmlkLm5hbWUpKTsKLQlwcl9kZWJ1ZygiJXMsIE92ZXJ3cml0aW5nIGNoYW5uZWwgbWFwIGNvbnRyb2wgbmFtZSB0bzogJXMiLAotCQlfX2Z1bmNfXywga2N0bC0+aWQubmFtZSk7Ci0Ja2N0bC0+cHV0ID0gbXNtX3BjbV9jaG1hcF9jdGxfcHV0OwotCWtjdGwtPmdldCA9IG1zbV9wY21fY2htYXBfY3RsX2dldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2ZlX3RvcG9sb2d5X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JY29uc3Qgc3RydWN0IHNvY19lbnVtICplID0gJm1zbV9wY21fZmVfdG9wb2xvZ3lfZW51bVswXTsKLQotCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgZS0+aXRlbXMsIGUtPnRleHRzKTsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2ZlX3RvcG9sb2d5X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlcyBSZWNlaXZlZCBvdXQgb2YgYm91bmQgZmVfaWQgJWx1XG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6ICVsdSB0b3BvbG9neSAlc1xuIiwgX19mdW5jX18sIGZlX2lkLAotCQkgbXNtX3BjbV9mZV90b3BvbG9neV90ZXh0W21zbV9wY21fZmVfdG9wb2xvZ3lbZmVfaWRdXSk7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IG1zbV9wY21fZmVfdG9wb2xvZ3lbZmVfaWRdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fZmVfdG9wb2xvZ3lfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVuc2lnbmVkIGxvbmcgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBpbnQgaXRlbTsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZCBmZV9pZCAlbHVcbiIsIF9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWl0ZW0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmIChpdGVtID49IEFSUkFZX1NJWkUobXNtX3BjbV9mZV90b3BvbG9neV90ZXh0KSkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZCB0b3BvbG9neSAlbHVcbiIsIF9fZnVuY19fLAotCQkgICAgICAgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6ICVsdSBuZXcgdG9wb2xvZ3kgJXNcbiIsIF9fZnVuY19fLCBmZV9pZCwKLQkJIG1zbV9wY21fZmVfdG9wb2xvZ3lfdGV4dFtpdGVtXSk7Ci0JbXNtX3BjbV9mZV90b3BvbG9neVtmZV9pZF0gPSBpdGVtOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX2ZlX3RvcG9sb2d5X2NvbnRyb2woc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZSA9ICJQQ01fRGV2IjsKLQljb25zdCBjaGFyICpkZXZpY2VObyAgICAgICA9ICJOTiI7Ci0JY29uc3QgY2hhciAqdG9wb190ZXh0ICAgICAgPSAiVG9wb2xvZ3kiOwotCWNoYXIgKm1peGVyX3N0ciA9IE5VTEw7Ci0JaW50IGN0bF9sZW47Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0b3BvbG9neV9jb250cm9sWzFdID0gewotCQl7Ci0JCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkJLm5hbWUgPSAgIj8iLAotCQkJLmluZm8gPSAgbXNtX3BjbV9mZV90b3BvbG9neV9pbmZvLAotCQkJLmdldCA9IG1zbV9wY21fZmVfdG9wb2xvZ3lfZ2V0LAotCQkJLnB1dCA9IG1zbV9wY21fZmVfdG9wb2xvZ3lfcHV0LAotCQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9LAotCX07Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMSArCi0JCSAgc3RybGVuKHRvcG9fdGV4dCkgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIW1peGVyX3N0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzbnByaW50ZihtaXhlcl9zdHIsIGN0bF9sZW4sICIlcyAlZCAlcyIsIG1peGVyX2N0bF9uYW1lLAotCQkgcnRkLT5wY20tPmRldmljZSwgdG9wb190ZXh0KTsKLQotCXRvcG9sb2d5X2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQl0b3BvbG9neV9jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPSBydGQtPmRhaV9saW5rLT5pZDsKLQlyZXQgPSBzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLCB0b3BvbG9neV9jb250cm9sLAotCQkJCQkgICAgQVJSQVlfU0laRSh0b3BvbG9neV9jb250cm9sKSk7Ci0JbXNtX3BjbV9mZV90b3BvbG9neVtydGQtPmRhaV9saW5rLT5pZF0gPSAwOwotCWtmcmVlKG1peGVyX3N0cik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7Ci0JaW50IGJlX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM107Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswLCAwLCA0ODAwMH07Ci0JaW50IHJldCA9IDA7Ci0KLQljZmdfZGF0YS5hcHBfdHlwZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWNmZ19kYXRhLmFjZGJfZGV2X2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdICE9IDApCi0JCWNmZ19kYXRhLnNhbXBsZV9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0JcHJfZGVidWcoIiVzOiBmZV9pZC0gJWxsdSBzZXNzaW9uX3R5cGUtICVkIGJlX2lkLSAlZCBhcHBfdHlwZS0gJWQgYWNkYl9kZXZfaWQtICVkIHNhbXBsZV9yYXRlLSAlZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLCBzZXNzaW9uX3R5cGUsIGJlX2lkLAotCQljZmdfZGF0YS5hcHBfdHlwZSwgY2ZnX2RhdGEuYWNkYl9kZXZfaWQsIGNmZ19kYXRhLnNhbXBsZV9yYXRlKTsKLQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcoZmVfaWQsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgIGJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBtc21fcGNtX3JvdXRpbmdfcmVnX3N0cmVhbV9hcHBfdHlwZV9jZmcgZmFpbGVkIHJldHVybmVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7Ci0JaW50IGJlX2lkID0gMDsKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIGNmZ19kYXRhID0gezB9OwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICAmYmVfaWQsICZjZmdfZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjZmdfZGF0YS5hcHBfdHlwZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNmZ19kYXRhLmFjZGJfZGV2X2lkOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0gY2ZnX2RhdGEuc2FtcGxlX3JhdGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPSBiZV9pZDsKLQlwcl9kZWJ1ZygiJXM6IGZlZGFpX2lkICVsbHUsIHNlc3Npb25fdHlwZSAlZCwgYmVfaWQgJWQsIGFwcF90eXBlICVkLCBhY2RiX2Rldl9pZCAlZCwgc2FtcGxlX3JhdGUgJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCWludCBiZV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MCwgMCwgNDgwMDB9OwotCWludCByZXQgPSAwOwotCi0JY2ZnX2RhdGEuYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQljZmdfZGF0YS5hY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQotCQljZmdfZGF0YS5zYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOwotCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHUgc2Vzc2lvbl90eXBlLSAlZCBiZV9pZC0gJWQgYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICBiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXU2NCBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWludCBzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7Ci0JaW50IGJlX2lkID0gMDsKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIGNmZ19kYXRhID0gezB9OwotCWludCByZXQgPSAwOwotCi0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICAmYmVfaWQsICZjZmdfZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjZmdfZGF0YS5hcHBfdHlwZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGNmZ19kYXRhLmFjZGJfZGV2X2lkOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0gY2ZnX2RhdGEuc2FtcGxlX3JhdGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPSBiZV9pZDsKLQlwcl9kZWJ1ZygiJXM6IGZlZGFpX2lkICVsbHUsIHNlc3Npb25fdHlwZSAlZCwgYmVfaWQgJWQsIGFwcF90eXBlICVkLCBhY2RiX2Rldl9pZCAlZCwgc2FtcGxlX3JhdGUgJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9hZGRfYXBwX3R5cGVfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0Jc3RydWN0IHNuZF9wY21fdXNyICphcHBfdHlwZV9pbmZvOwotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7Ci0JY29uc3QgY2hhciAqcGxheWJhY2tfbWl4ZXJfY3RsX25hbWUgPSAiQXVkaW8gU3RyZWFtIjsKLQljb25zdCBjaGFyICpjYXB0dXJlX21peGVyX2N0bF9uYW1lID0gIkF1ZGlvIFN0cmVhbSBDYXB0dXJlIjsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY29uc3QgY2hhciAqc3VmZml4ID0gIkFwcCBUeXBlIENmZyI7Ci0JaW50IGN0bF9sZW4sIHJldCA9IDA7Ci0KLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkgewotCQljdGxfbGVuID0gc3RybGVuKHBsYXliYWNrX21peGVyX2N0bF9uYW1lKSArIDEgKwotCQkJCXN0cmxlbihkZXZpY2VObykgKyAxICsKLQkJCQlzdHJsZW4oc3VmZml4KSArIDE7Ci0JCXByX2RlYnVnKCIlczogUGxheWJhY2sgYXBwIHR5cGUgY250cmwgYWRkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IHNuZF9wY21fYWRkX3Vzcl9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKLQkJCQlOVUxMLCAxLCBjdGxfbGVuLCBydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkmYXBwX3R5cGVfaW5mbyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBwbGF5YmFjayBhcHAgdHlwZSBjbnRybCBhZGQgZmFpbGVkLCBlcnI6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlrY3RsID0gYXBwX3R5cGVfaW5mby0+a2N0bDsKLQkJc25wcmludGYoa2N0bC0+aWQubmFtZSwgY3RsX2xlbiwgIiVzICVkICVzIiwKLQkJCSAgICAgcGxheWJhY2tfbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7Ci0JCWtjdGwtPnB1dCA9IG1zbV9wY21fcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2N0bF9wdXQ7Ci0JCWtjdGwtPmdldCA9IG1zbV9wY21fcGxheWJhY2tfYXBwX3R5cGVfY2ZnX2N0bF9nZXQ7Ci0JfQotCi0JaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgewotCQljdGxfbGVuID0gc3RybGVuKGNhcHR1cmVfbWl4ZXJfY3RsX25hbWUpICsgMSArCi0JCQkJc3RybGVuKGRldmljZU5vKSArIDEgKyBzdHJsZW4oc3VmZml4KSArIDE7Ci0JCXByX2RlYnVnKCIlczogQ2FwdHVyZSBhcHAgdHlwZSBjbnRybCBhZGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gc25kX3BjbV9hZGRfdXNyX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQkJTlVMTCwgMSwgY3RsX2xlbiwgcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJJmFwcF90eXBlX2luZm8pOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogY2FwdHVyZSBhcHAgdHlwZSBjbnRybCBhZGQgZmFpbGVkLCBlcnI6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlrY3RsID0gYXBwX3R5cGVfaW5mby0+a2N0bDsKLQkJc25wcmludGYoa2N0bC0+aWQubmFtZSwgY3RsX2xlbiwgIiVzICVkICVzIiwKLQkJIGNhcHR1cmVfbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UsIHN1ZmZpeCk7Ci0JCWtjdGwtPnB1dCA9IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX3B1dDsKLQkJa2N0bC0+Z2V0ID0gbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfZ2V0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21faHdkZXBfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBody0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX21tYXBfZmQgX191c2VyICpfbW1hcF9mZCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9wY21fbW1hcF9mZCBtbWFwX2ZkOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gTlVMTDsKLQlpbnQzMl90IGRpciA9IC0xOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9JT0NUTF9NTUFQX0RBVEFfRkQ6Ci0JCV9tbWFwX2ZkID0gKHN0cnVjdCBzbmRfcGNtX21tYXBfZmQgX191c2VyICopYXJnOwotCQlpZiAoZ2V0X3VzZXIoZGlyLCAoaW50MzJfdCBfX3VzZXIgKikmKF9tbWFwX2ZkLT5kaXIpKSkgewotCQkJcHJfZXJyKCIlczogZXJyb3IgY29weWluZyBtbWFwX2ZkIGZyb20gdXNlclxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGRpciAhPSBPVVQgJiYgZGlyICE9IElOKSB7Ci0JCQlwcl9lcnIoIiVzIGludmFsaWQgc3RyZWFtIGRpclxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tkaXJdLnN1YnN0cmVhbTsKLQkJaWYgKCFzdWJzdHJlYW0pIHsKLQkJCXByX2VycigiJXMgc3Vic3RyZWFtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCWJyZWFrOwotCQl9Ci0JCXByX2RlYnVnKCIlcyA6ICVzIE1NQVAgRGF0YSBmZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBkaXIgPT0gMCA/ICJQIiA6ICJDIik7Ci0JCWlmIChtc21fcGNtX21tYXBfZmQoc3Vic3RyZWFtLCAmbW1hcF9mZCkgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBlcnJvciBnZXR0aW5nIGZkXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocHV0X3VzZXIobW1hcF9mZC5mZCwgJl9tbWFwX2ZkLT5mZCkgfHwKLQkJICAgIHB1dF91c2VyKG1tYXBfZmQuc2l6ZSwgJl9tbWFwX2ZkLT5zaXplKSB8fAotCQkgICAgcHV0X3VzZXIobW1hcF9mZC5hY3R1YWxfc2l6ZSwgJl9tbWFwX2ZkLT5hY3R1YWxfc2l6ZSkpIHsKLQkJCXByX2VycigiJXM6IGVycm9yIGNvcHlpbmcgZmRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBtc21fcGNtX2h3ZGVwX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywKLQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCS8qIHdlIG9ubHkgc3VwcG9ydCBtbWFwIGZkLiBIYW5kbGluZyBpcyBjb21tb24gaW4gYm90aCBtb2RlcyAqLwotCXJldHVybiBtc21fcGNtX2h3ZGVwX2lvY3RsKGh3LCBmaWxlLCBjbWQsIGFyZyk7Ci19Ci0jZWxzZQotc3RhdGljIGludCBtc21fcGNtX2h3ZGVwX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc25kX2h3ZGVwICpodywKLQkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiAtRUlOVkFMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXNtX3BjbV9hZGRfaHdkZXBfZGV2KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCXN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwOwotCWludCByYzsKLQljaGFyIGlkW10gPSAiTk9JUlFfTk4iOwotCi0Jc25wcmludGYoaWQsIHNpemVvZihpZCksICJOT0lSUV8lZCIsIHJ1bnRpbWUtPnBjbS0+ZGV2aWNlKTsKLQlwcl9kZWJ1ZygiJXM6IHBjbSBkZXYgJWRcbiIsIF9fZnVuY19fLCBydW50aW1lLT5wY20tPmRldmljZSk7Ci0JcmMgPSBzbmRfaHdkZXBfbmV3KHJ1bnRpbWUtPmNhcmQtPnNuZF9jYXJkLAotCQkJICAgJmlkWzBdLAotCQkJICAgSFdERVBfRkVfQkFTRSArIHJ1bnRpbWUtPnBjbS0+ZGV2aWNlLAotCQkJICAgJmh3ZGVwKTsKLQlpZiAoIWh3ZGVwIHx8IHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBod2RlcCBpbnRmIGZhaWxlZCB0byBjcmVhdGUgJXMgLSBod2RlcFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBpZCk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlod2RlcC0+aWZhY2UgPSBTTkRSVl9IV0RFUF9JRkFDRV9BVURJT19CRTsgLyogZm9yIGxhY2sgb2YgYSBGRSBpZmFjZSAqLwotCWh3ZGVwLT5wcml2YXRlX2RhdGEgPSBydW50aW1lLT5wY207IC8qIG9mIHR5cGUgc3RydWN0IHNuZF9wY20gKi8KLQlod2RlcC0+b3BzLmlvY3RsID0gbXNtX3BjbV9od2RlcF9pb2N0bDsKLQlod2RlcC0+b3BzLmlvY3RsX2NvbXBhdCA9IG1zbV9wY21faHdkZXBfY29tcGF0X2lvY3RsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKLQlpbnQgcmV0OwotCi0JcHJfZGVidWcoIiVzICwgcmVnaXN0ZXIgbmV3IGNvbnRyb2xcbiIsIF9fZnVuY19fKTsKLQlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCi0JCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOwotCi0JcmV0ID0gbXNtX3BjbV9hZGRfY2htYXBfY29udHJvbChydGQpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlcyBmYWlsZWQgdG8gYWRkIGNobWFwIGNudGxzXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcmV0ID0gbXNtX3BjbV9hZGRfdm9sdW1lX2NvbnRyb2wocnRkKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgcGNtIFZvbHVtZSBDb250cm9sICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JfQotCi0JcmV0ID0gbXNtX3BjbV9hZGRfZmVfdG9wb2xvZ3lfY29udHJvbChydGQpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFkZCBwY20gdG9wb2xvZ3kgY29udHJvbCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldCA9IG1zbV9wY21fYWRkX2FwcF90eXBlX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIGFwcCB0eXBlIGNvbnRyb2xzIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQlyZXQgPSBtc21fcGNtX2FkZF9od2RlcF9kZXYocnRkKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIGh3IGRlcCBub2RlXG4iLCBfX2Z1bmNfXyk7Ci0JcGNtLT5ub25hdG9taWMgPSB0cnVlOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbXNtX3BjbV9vcGVuLAotCS5wcmVwYXJlICAgICAgICA9IG1zbV9wY21fcHJlcGFyZSwKLQkuY29weSAgICAgICAgICAgPSBtc21fcGNtX2NvcHksCi0JLmh3X3BhcmFtcwk9IG1zbV9wY21faHdfcGFyYW1zLAotCS5pb2N0bCAgICAgICAgICA9IG1zbV9wY21faW9jdGwsCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCS5jb21wYXRfaW9jdGwgICA9IG1zbV9wY21fY29tcGF0X2lvY3RsLAotI2VuZGlmCi0JLnRyaWdnZXIgICAgICAgID0gbXNtX3BjbV90cmlnZ2VyLAotCS5wb2ludGVyICAgICAgICA9IG1zbV9wY21fcG9pbnRlciwKLQkubW1hcCAgICAgICAgICAgPSBtc21fcGNtX21tYXAsCi0JLmNsb3NlICAgICAgICAgID0gbXNtX3BjbV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKLQkub3BzCQk9ICZtc21fcGNtX29wcywKLQkucGNtX25ldwk9IG1zbV9hc29jX3BjbV9uZXcsCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IG1zbV9wbGF0X2RhdGEgKnBkYXRhOwotCWNvbnN0IGNoYXIgKmxhdGVuY3lfbGV2ZWw7Ci0JaW50IHBlcmZfbW9kZSA9IExPV19MQVRFTkNZX1BDTV9NT0RFOwotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiUHVsbCBtb2RlIGRyaXZlciBwcm9iZVxuIik7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSAgInFjb20sbXNtLXBjbS1sb3ctbGF0ZW5jeSIpKSB7Ci0KLQkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSJxY29tLGxhdGVuY3ktbGV2ZWwiLCAmbGF0ZW5jeV9sZXZlbCk7Ci0JCWlmICghcmMpIHsKLQkJCWlmICghc3RyY21wKGxhdGVuY3lfbGV2ZWwsICJ1bHRyYSIpKQotCQkJCXBlcmZfbW9kZSA9IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFOwotCQkJZWxzZSBpZiAoIXN0cmNtcChsYXRlbmN5X2xldmVsLCAidWxsLXBwIikpCi0JCQkJcGVyZl9tb2RlID0gVUxMX1BPU1RfUFJPQ0VTU0lOR19QQ01fTU9ERTsKLQkJfQotCX0KLQotCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgbXNtX3BsYXRfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGRhdGEtPnBlcmZfbW9kZSA9IHBlcmZfbW9kZTsKLQotCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBwZGF0YSk7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogZGV2IG5hbWUgJXNcbiIsCi0JCQkJX19mdW5jX18sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJQdWxsIG1vZGUgZHJpdmVyIHJlZ2lzdGVyXG4iKTsKLQlyYyA9IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKLQkJCQkgICAgICAgJm1zbV9zb2NfcGxhdGZvcm0pOwotCi0JaWYgKHJjKQotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcHVsbCBtb2RlIGRyaXZlclxuIik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGE7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICJQdWxsIG1vZGUgcmVtb3ZlXG4iKTsKLQlwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHBkYXRhKTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fcGNtX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLXBjbS1kc3Atbm9pcnEifSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV9wY21fZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlcl9ub2lycSA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tcGNtLWRzcC1ub2lycSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fcGNtX2R0X21hdGNoLAotCX0sCi0JLnByb2JlID0gbXNtX3BjbV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3BjbV9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcl9ub2lycSk7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyX25vaXJxKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUENNIE5PSVJRIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1xNi12Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU5OWQzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LXYyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODg0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhdWRpby12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotCi0jaW5jbHVkZSAibXNtLXBjbS1xNi12Mi5oIgotI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgotI2luY2x1ZGUgIm1zbS1xdGktcHAtY29uZmlnLmgiCi0KLWVudW0gc3RyZWFtX3N0YXRlIHsKLQlJRExFID0gMCwKLQlTVE9QUEVELAotCVJVTk5JTkcsCi19OwotCi1zdGF0aWMgc3RydWN0IGF1ZGlvX2xvY2tzIHRoZV9sb2NrczsKLQotI2RlZmluZSBQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMJMHgyMDAwCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG1zbV9wY21fdm9sX2dhaW4sIDAsCi0JCQlQQ01fTUFTVEVSX1ZPTF9NQVhfU1RFUFMpOwotCi1zdHJ1Y3Qgc25kX21zbSB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci19OwotCi0jZGVmaW5lIENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIICA1MAotI2RlZmluZSBDTURfRU9TX1RJTUVPVVRfTVVMVElQTElFUiAgKEhaICogNTApCi0jZGVmaW5lIE1BWF9QQl9DT1BZX1JFVFJJRVMgICAgICAgICAzCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlX2NhcHR1cmUgPSB7Ci0JLmluZm8gPSAgICAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAotCS5mb3JtYXRzID0gICAgICAgICAgICAgIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgMzg0MDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgNCwKLQkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBDQVBUVVJFX01BWF9OVU1fUEVSSU9EUyAqCi0JCQkJQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZF9ieXRlc19taW4gPQlDQVBUVVJFX01JTl9QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21heCA9ICAgICBDQVBUVVJFX01BWF9QRVJJT0RfU0laRSwKLQkucGVyaW9kc19taW4gPSAgICAgICAgICBDQVBUVVJFX01JTl9OVU1fUEVSSU9EUywKLQkucGVyaW9kc19tYXggPSAgICAgICAgICBDQVBUVVJFX01BWF9OVU1fUEVSSU9EUywKLQkuZmlmb19zaXplID0gICAgICAgICAgICAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmVfcGxheWJhY2sgPSB7Ci0JLmluZm8gPSAgICAgICAgICAgICAgICAgKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAotCS5mb3JtYXRzID0gICAgICAgICAgICAgIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8Ci0JCQkJU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDBfMzg0MDAwLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgMzg0MDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgOCwKLQkuYnVmZmVyX2J5dGVzX21heCA9ICAgICBQTEFZQkFDS19NQVhfTlVNX1BFUklPRFMgKgotCQkJCVBMQVlCQUNLX01BWF9QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21pbiA9CVBMQVlCQUNLX01JTl9QRVJJT0RfU0laRSwKLQkucGVyaW9kX2J5dGVzX21heCA9ICAgICBQTEFZQkFDS19NQVhfUEVSSU9EX1NJWkUsCi0JLnBlcmlvZHNfbWluID0gICAgICAgICAgUExBWUJBQ0tfTUlOX05VTV9QRVJJT0RTLAotCS5wZXJpb2RzX21heCA9ICAgICAgICAgIFBMQVlCQUNLX01BWF9OVU1fUEVSSU9EUywKLQkuZmlmb19zaXplID0gICAgICAgICAgICAwLAotfTsKLQotLyogQ29udmVudGlvbmFsIGFuZCB1bmNvbnZlbnRpb25hbCBzYW1wbGUgcmF0ZSBzdXBwb3J0ZWQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3VwcG9ydGVkX3NhbXBsZV9yYXRlc1tdID0gewotCTgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwKLQk4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwLCAzNTI4MDAsIDM4NDAwMAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c19zYW1wbGVfcmF0ZXMgPSB7Ci0JLmNvdW50ID0gQVJSQVlfU0laRShzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzKSwKLQkubGlzdCA9IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXMsCi0JLm1hc2sgPSAwLAotfTsKLQotc3RhdGljIHZvaWQgbXNtX3BjbV9yb3V0ZV9ldmVudF9oYW5kbGVyKGVudW0gbXNtX3BjbV9yb3V0aW5nX2V2ZW50IGV2ZW50LAotCQkJCQl2b2lkICpwcml2X2RhdGEpCi17Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHByaXZfZGF0YTsKLQotCVdBUk5fT04oIXBydGQpOwotCi0JcHJfZGVidWcoIiVzOiBldmVudCAleFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIE1TTV9QQ01fUlRfRVZUX0JVRl9SRUNGRzoKLQkJcTZhc21fY21kKHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX1BBVVNFKTsKLQkJcTZhc21fY21kKHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX0ZMVVNIKTsKLQkJcTZhc21fcnVuKHBydGQtPmF1ZGlvX2NsaWVudCwgMCwgMCwgMCk7Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBldmVudF9oYW5kbGVyKHVpbnQzMl90IG9wY29kZSwKLQkJdWludDMyX3QgdG9rZW4sIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBwcml2OwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcHJ0ZC0+c3Vic3RyZWFtOwotCXVpbnQzMl90ICpwdHJtZW0gPSAodWludDMyX3QgKilwYXlsb2FkOwotCXVpbnQzMl90IGlkeCA9IDA7Ci0JdWludDMyX3Qgc2l6ZSA9IDA7Ci0JdWludDhfdCBidWZfaW5kZXg7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyOiB7Ci0JCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9XUklURV9ET05FX1YyXG4iKTsKLQkJcHJfZGVidWcoIkJ1ZmZlciBDb25zdW1lZCA9IDB4JTA4eFxuIiwgKnB0cm1lbSk7Ci0JCXBydGQtPnBjbV9pcnFfcG9zICs9IHBydGQtPnBjbV9jb3VudDsKLQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpCi0JCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0JCWF0b21pY19pbmMoJnBydGQtPm91dF9jb3VudCk7Ci0JCXdha2VfdXAoJnRoZV9sb2Nrcy53cml0ZV93YWl0KTsKLQkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQotCQkJYnJlYWs7Ci0JCWlmICghcHJ0ZC0+bW1hcF9mbGFnIHx8IHBydGQtPnJlc2V0X2V2ZW50KQotCQkJYnJlYWs7Ci0JCWlmIChxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhJTiwKLQkJCQlwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJJnNpemUsICZpZHgpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6d3JpdGluZyAlZCBieXRlcyBvZiBidWZmZXIgdG8gZHNwIDJcbiIsCi0JCQkJCV9fZnVuY19fLCBwcnRkLT5wY21fY291bnQpOwotCQkJcTZhc21fd3JpdGVfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQlwcnRkLT5wY21fY291bnQsIDAsIDAsIE5PX1RJTUVTVEFNUCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgotCQlwcl9kZWJ1ZygiQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TXG4iKTsKLQkJY2xlYXJfYml0KENNRF9FT1MsICZwcnRkLT5jbWRfcGVuZGluZyk7Ci0JCXdha2VfdXAoJnRoZV9sb2Nrcy5lb3Nfd2FpdCk7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVBRF9ET05FX1YyOiB7Ci0JCXByX2RlYnVnKCJBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjJcbiIpOwotCQlidWZfaW5kZXggPSBxNmFzbV9nZXRfYnVmX2luZGV4X2Zyb21fdG9rZW4odG9rZW4pOwotCQlwcl9kZWJ1ZygiJXM6IHRva2VuPTB4JTA4eCBidWZfaW5kZXg9MHglMDh4XG4iLAotCQkJIF9fZnVuY19fLCB0b2tlbiwgYnVmX2luZGV4KTsKLQkJcHJ0ZC0+aW5fZnJhbWVfaW5mb1tidWZfaW5kZXhdLnNpemUgPSBwYXlsb2FkWzRdOwotCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0ub2Zmc2V0ID0gcGF5bG9hZFs1XTsKLQkJLyogYXNzdW1lIGRhdGEgc2l6ZSA9IDAgZHVyaW5nIGZsdXNoaW5nICovCi0JCWlmIChwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0uc2l6ZSkgewotCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0KLQkJCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2J1Zl9pbmRleF0uc2l6ZTsKLQkJCXByX2RlYnVnKCJwY21faXJxX3Bvcz0lZFxuIiwgcHJ0ZC0+cGNtX2lycV9wb3MpOwotCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5zdGFydCkpCi0JCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCQkJaWYgKGF0b21pY19yZWFkKCZwcnRkLT5pbl9jb3VudCkgPD0gcHJ0ZC0+cGVyaW9kcykKLQkJCQlhdG9taWNfaW5jKCZwcnRkLT5pbl9jb3VudCk7Ci0JCQl3YWtlX3VwKCZ0aGVfbG9ja3MucmVhZF93YWl0KTsKLQkJCWlmIChwcnRkLT5tbWFwX2ZsYWcgJiYKLQkJCSAgICBxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhPVVQsCi0JCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJCSZzaXplLCAmaWR4KSAmJgotCQkJICAgIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0KLQkJCSAgICAgU05EUlZfUENNX1NUQVRFX1JVTk5JTkcpKQotCQkJCXE2YXNtX3JlYWRfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJlY2xhaW0gZmx1c2hlZCBidWYgaW5fY291bnQgJXhcbiIsCi0JCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZwcnRkLT5pbl9jb3VudCkpOwotCQkJcHJ0ZC0+cGNtX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NvdW50OwotCQkJaWYgKHBydGQtPm1tYXBfZmxhZykgewotCQkJCWlmIChxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhPVVQsCi0JCQkJICAgIHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkgICAgJnNpemUsICZpZHgpICYmCi0JCQkJICAgIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0KLQkJCQkgICAgU05EUlZfUENNX1NUQVRFX1JVTk5JTkcpKQotCQkJCQlxNmFzbV9yZWFkX25vbG9jayhwcnRkLT5hdWRpb19jbGllbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlhdG9taWNfaW5jKCZwcnRkLT5pbl9jb3VudCk7Ci0JCQl9Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPmluX2NvdW50KSA9PSBwcnRkLT5wZXJpb2RzKSB7Ci0JCQkJcHJfaW5mbygiJXM6IHJlY2xhaW1lZCBhbGwgYnVmc1xuIiwgX19mdW5jX18pOwotCQkJCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQotCQkJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0JCQkJd2FrZV91cCgmdGhlX2xvY2tzLnJlYWRfd2FpdCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVNNX1NUUkVBTV9QUF9FVkVOVDoKLQljYXNlIEFTTV9TVFJFQU1fQ01EX0VOQ0RFQ19FVkVOVFM6IHsKLQkJcHJfZGVidWcoIiVzOiBBU01fU1RSRUFNX0VWRU5UICgweCV4KVxuIiwgX19mdW5jX18sIG9wY29kZSk7Ci0JCWlmICghc3Vic3RyZWFtKSB7Ci0JCQlwcl9lcnIoIiVzOiBzdWJzdHJlYW0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCQlpZiAoIXJ0ZCkgewotCQkJcHJfZXJyKCIlczogcnRkIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXJldCA9IG1zbV9hZHNwX2luZm9ybV9taXhlcl9jdGwocnRkLCBwYXlsb2FkKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGluZm9ybSBtaXhlciBjdGwuIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVBSX0JBU0lDX1JTUF9SRVNVTFQ6IHsKLQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7Ci0JCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JVTl9WMjoKLQkJCWlmIChzdWJzdHJlYW0tPnN0cmVhbQotCQkJCSE9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocHJ0ZC0+bW1hcF9mbGFnKSB7Ci0JCQkJcHJfZGVidWcoIiVzOndyaXRpbmcgJWQgYnl0ZXMgb2YgYnVmZmVyIHRvIGRzcFxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCXBydGQtPnBjbV9jb3VudCk7Ci0JCQkJcTZhc21fd3JpdGVfbm9sb2NrKHBydGQtPmF1ZGlvX2NsaWVudCwKLQkJCQkJcHJ0ZC0+cGNtX2NvdW50LAotCQkJCQkwLCAwLCBOT19USU1FU1RBTVApOwotCQkJfSBlbHNlIHsKLQkJCQl3aGlsZSAoYXRvbWljX3JlYWQoJnBydGQtPm91dF9uZWVkZWQpKSB7Ci0JCQkJCXByX2RlYnVnKCIlczp3cml0aW5nICVkIGJ5dGVzIG9mIGJ1ZmZlciB0byBkc3BcbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJCXBydGQtPnBjbV9jb3VudCk7Ci0JCQkJCXE2YXNtX3dyaXRlX25vbG9jayhwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQlwcnRkLT5wY21fY291bnQsCi0JCQkJCQkwLCAwLCBOT19USU1FU1RBTVApOwotCQkJCQlhdG9taWNfZGVjKCZwcnRkLT5vdXRfbmVlZGVkKTsKLQkJCQkJd2FrZV91cCgmdGhlX2xvY2tzLndyaXRlX3dhaXQpOwotCQkJCX07Ci0JCQl9Ci0JCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9SRUdJU1RFUl9QUF9FVkVOVFM6Ci0JCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fQ01EX1JFR0lTVEVSX1BQX0VWRU5UUzoiLAotCQkJCV9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZGVidWcoIiVzOlBheWxvYWQgPSBbMHgleF1zdGF0WzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWJyZWFrOwotCWNhc2UgUkVTRVRfRVZFTlRTOgotCQlwcl9kZWJ1ZygiJXMgUkVTRVRfRVZFTlRTXG4iLCBfX2Z1bmNfXyk7Ci0JCXBydGQtPnBjbV9pcnFfcG9zICs9IHBydGQtPnBjbV9jb3VudDsKLQkJYXRvbWljX2luYygmcHJ0ZC0+b3V0X2NvdW50KTsKLQkJYXRvbWljX2luYygmcHJ0ZC0+aW5fY291bnQpOwotCQlwcnRkLT5yZXNldF9ldmVudCA9IHRydWU7Ci0JCWlmIChhdG9taWNfcmVhZCgmcHJ0ZC0+c3RhcnQpKQotCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCQl3YWtlX3VwKCZ0aGVfbG9ja3MuZW9zX3dhaXQpOwotCQl3YWtlX3VwKCZ0aGVfbG9ja3Mud3JpdGVfd2FpdCk7Ci0JCXdha2VfdXAoJnRoZV9sb2Nrcy5yZWFkX3dhaXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiTm90IFN1cHBvcnRlZCBFdmVudCBvcGNvZGVbMHgleF1cbiIsIG9wY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YTsKLQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtczsKLQlpbnQgcmV0OwotCXVpbnQzMl90IGZtdF90eXBlID0gRk9STUFUX0xJTkVBUl9QQ007Ci0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlOwotCXVpbnQxNl90IHNhbXBsZV93b3JkX3NpemU7Ci0KLQlwZGF0YSA9IChzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqKQotCQlkZXZfZ2V0X2RydmRhdGEoc29jX3BydGQtPnBsYXRmb3JtLT5kZXYpOwotCWlmICghcGRhdGEpIHsKLQkJcHJfZXJyKCIlczogcGxhdGZvcm0gZGF0YSBub3QgcG9wdWxhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXBydGQgfHwgIXBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlwcl9lcnIoIiVzOiBwcml2YXRlIGRhdGEgbnVsbCBvciBhdWRpbyBjbGllbnQgZnJlZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwYXJhbXMgPSAmc29jX3BydGQtPmRwY21bc3Vic3RyZWFtLT5zdHJlYW1dLmh3X3BhcmFtczsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXBydGQtPnBjbV9zaXplID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7Ci0JcHJ0ZC0+cGNtX2NvdW50ID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0JcHJ0ZC0+cGNtX2lycV9wb3MgPSAwOwotCS8qIHJhdGUgYW5kIGNoYW5uZWxzIGFyZSBzZW50IHRvIGF1ZGlvIGRyaXZlciAqLwotCXBydGQtPnNhbXBfcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7Ci0JcHJ0ZC0+Y2hhbm5lbF9tb2RlID0gcnVudGltZS0+Y2hhbm5lbHM7Ci0JaWYgKHBydGQtPmVuYWJsZWQpCi0JCXJldHVybiAwOwotCi0JcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSBwZGF0YS0+cGVyZl9tb2RlOwotCXByX2RlYnVnKCIlczogcGVyZjogJXhcbiIsIF9fZnVuY19fLCBwZGF0YS0+cGVyZl9tb2RlKTsKLQotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJYml0c19wZXJfc2FtcGxlID0gMzI7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJYml0c19wZXJfc2FtcGxlID0gMjQ7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCWJpdHNfcGVyX3NhbXBsZSA9IDI0OwotCQlzYW1wbGVfd29yZF9zaXplID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAxNjsKLQkJYnJlYWs7Ci0JfQotCWlmIChwcnRkLT5jb21wcmVzc19lbmFibGUpIHsKLQkJZm10X3R5cGUgPSBGT1JNQVRfR0VOX0NPTVBSOwotCQlwcl9kZWJ1ZygiJXM6IENvbXByZXNzZWQgZW5hYmxlZCFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gcTZhc21fb3Blbl93cml0ZV9jb21wcmVzc2VkKHBydGQtPmF1ZGlvX2NsaWVudCwgZm10X3R5cGUsCi0JCQkJQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9HRU4pOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogcTZhc21fb3Blbl93cml0ZV9jb21wcmVzc2VkIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCQlxNmFzbV9hdWRpb19jbGllbnRfZnJlZShwcnRkLT5hdWRpb19jbGllbnQpOwotCQkJcHJ0ZC0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcTZhc21fb3Blbl93cml0ZV92NChwcnRkLT5hdWRpb19jbGllbnQsCi0JCQlmbXRfdHlwZSwgYml0c19wZXJfc2FtcGxlKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogcTZhc21fb3Blbl93cml0ZV92NCBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJCXBydGQtPmF1ZGlvX2NsaWVudCA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCXJldCA9IHE2YXNtX3NlbmRfY2FsKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZGVidWcoIiVzIDogU2VuZCBjYWwgZmFpbGVkIDogJWQiLCBfX2Z1bmNfXywgcmV0KTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uIElEICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbik7Ci0JcHJ0ZC0+c2Vzc2lvbl9pZCA9IHBydGQtPmF1ZGlvX2NsaWVudC0+c2Vzc2lvbjsKLQotCWlmIChwcnRkLT5jb21wcmVzc19lbmFibGUpIHsKLQkJcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfY29tcHJfc3RyZWFtKAotCQkJCXNvY19wcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUsCi0JCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwKLQkJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJCUNPTVBSRVNTRURfUEFTU1RIUk9VR0hfR0VOKTsKLQl9IGVsc2UgewotCQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJcHJ0ZC0+c2Vzc2lvbl9pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCX0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSByZWcgZmFpbGVkIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChwcnRkLT5jb21wcmVzc19lbmFibGUpIHsKLQkJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2dlbl9jb21wcigKLQkJCXBydGQtPmF1ZGlvX2NsaWVudCwgcnVudGltZS0+cmF0ZSwKLQkJCXJ1bnRpbWUtPmNoYW5uZWxzLCAhcHJ0ZC0+c2V0X2NoYW5uZWxfbWFwLAotCQkJcHJ0ZC0+Y2hhbm5lbF9tYXAsIGJpdHNfcGVyX3NhbXBsZSk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NCgKLQkJCQlwcnRkLT5hdWRpb19jbGllbnQsIHJ1bnRpbWUtPnJhdGUsCi0JCQkJcnVudGltZS0+Y2hhbm5lbHMsICFwcnRkLT5zZXRfY2hhbm5lbF9tYXAsCi0JCQkJcHJ0ZC0+Y2hhbm5lbF9tYXAsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQlzYW1wbGVfd29yZF9zaXplLCBBU01fTElUVExFX0VORElBTiwKLQkJCQlERUZBVUxUX1FGKTsKLQl9Ci0JaWYgKHJldCA8IDApCi0JCXByX2luZm8oIiVzOiBDTUQgRm9ybWF0IGJsb2NrIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0JYXRvbWljX3NldCgmcHJ0ZC0+b3V0X2NvdW50LCBydW50aW1lLT5wZXJpb2RzKTsKLQotCXBydGQtPmVuYWJsZWQgPSAxOwotCXBydGQtPmNtZF9wZW5kaW5nID0gMDsKLQlwcnRkLT5jbWRfaW50ZXJydXB0ID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXM7Ci0Jc3RydWN0IG1zbV9wY21fcm91dGluZ19ldnQgZXZlbnQ7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGkgPSAwOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCXVpbnQxNl90IHNhbXBsZV93b3JkX3NpemU7Ci0KLQlwZGF0YSA9IChzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqKQotCQlkZXZfZ2V0X2RydmRhdGEoc29jX3BydGQtPnBsYXRmb3JtLT5kZXYpOwotCWlmICghcGRhdGEpIHsKLQkJcHJfZXJyKCIlczogcGxhdGZvcm0gZGF0YSBub3QgcG9wdWxhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXBydGQgfHwgIXBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlwcl9lcnIoIiVzOiBwcml2YXRlIGRhdGEgbnVsbCBvciBhdWRpbyBjbGllbnQgZnJlZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChwcnRkLT5lbmFibGVkID09IElETEUpIHsKLQkJcHJfZGVidWcoIiVzOnBlcmZfbW9kZT0lZCBwZXJpb2RzPSVkXG4iLCBfX2Z1bmNfXywKLQkJCXBkYXRhLT5wZXJmX21vZGUsIHJ1bnRpbWUtPnBlcmlvZHMpOwotCQlwYXJhbXMgPSAmc29jX3BydGQtPmRwY21bc3Vic3RyZWFtLT5zdHJlYW1dLmh3X3BhcmFtczsKLQkJaWYgKChwYXJhbXNfZm9ybWF0KHBhcmFtcykgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpIHx8Ci0JCQkocGFyYW1zX2Zvcm1hdChwYXJhbXMpID09IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRSkpCi0JCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKLQkJZWxzZSBpZiAocGFyYW1zX2Zvcm1hdChwYXJhbXMpID09IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFKQotCQkJYml0c19wZXJfc2FtcGxlID0gMzI7Ci0KLQkJLyogVUxMIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBpbiBjYXB0dXJlIHBhdGggKi8KLQkJaWYgKHBkYXRhLT5wZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKQotCQkJcHJ0ZC0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSBMRUdBQ1lfUENNX01PREU7Ci0JCWVsc2UKLQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlID0gTE9XX0xBVEVOQ1lfUENNX01PREU7Ci0KLQkJcHJfZGVidWcoIiVzIE9wZW5pbmcgJWQtY2ggUENNIHJlYWQgc3RyZWFtLCBwZXJmX21vZGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLAotCQkJCXBydGQtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlKTsKLQotCQlyZXQgPSBxNmFzbV9vcGVuX3JlYWRfdjQocHJ0ZC0+YXVkaW9fY2xpZW50LCBGT1JNQVRfTElORUFSX1BDTSwKLQkJCQliaXRzX3Blcl9zYW1wbGUsIGZhbHNlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHE2YXNtX29wZW5fcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCQlwcnRkLT5hdWRpb19jbGllbnQgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlyZXQgPSBxNmFzbV9zZW5kX2NhbChwcnRkLT5hdWRpb19jbGllbnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2RlYnVnKCIlcyA6IFNlbmQgY2FsIGZhaWxlZCA6ICVkIiwgX19mdW5jX18sIHJldCk7Ci0KLQkJcHJfZGVidWcoIiVzOiBzZXNzaW9uIElEICVkXG4iLAotCQkJCV9fZnVuY19fLCBwcnRkLT5hdWRpb19jbGllbnQtPnNlc3Npb24pOwotCQlwcnRkLT5zZXNzaW9uX2lkID0gcHJ0ZC0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOwotCQlldmVudC5ldmVudF9mdW5jID0gbXNtX3BjbV9yb3V0ZV9ldmVudF9oYW5kbGVyOwotCQlldmVudC5wcml2X2RhdGEgPSAodm9pZCAqKSBwcnRkOwotCQlyZXQgPSBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW1fdjIoCi0JCQkJc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCQlwcnRkLT5hdWRpb19jbGllbnQtPnBlcmZfbW9kZSwKLQkJCQlwcnRkLT5zZXNzaW9uX2lkLCBzdWJzdHJlYW0tPnN0cmVhbSwKLQkJCQlldmVudCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IHN0cmVhbSByZWcgZmFpbGVkIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcHJ0ZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwcnRkLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwcnRkLT5wY21faXJxX3BvcyA9IDA7Ci0JLyogcmF0ZSBhbmQgY2hhbm5lbHMgYXJlIHNlbnQgdG8gYXVkaW8gZHJpdmVyICovCi0JcHJ0ZC0+c2FtcF9yYXRlID0gcnVudGltZS0+cmF0ZTsKLQlwcnRkLT5jaGFubmVsX21vZGUgPSBydW50aW1lLT5jaGFubmVsczsKLQotCWlmIChwcnRkLT5lbmFibGVkID09IElETEUgfHwgcHJ0ZC0+ZW5hYmxlZCA9PSBTVE9QUEVEKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBydW50aW1lLT5wZXJpb2RzOyBpKyspCi0JCQlxNmFzbV9yZWFkKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCXBydGQtPnBlcmlvZHMgPSBydW50aW1lLT5wZXJpb2RzOwotCX0KLQotCWlmIChwcnRkLT5lbmFibGVkICE9IElETEUpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoIChydW50aW1lLT5mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQliaXRzX3Blcl9zYW1wbGUgPSAzMjsKLQkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQliaXRzX3Blcl9zYW1wbGUgPSAyNDsKLQkJc2FtcGxlX3dvcmRfc2l6ZSA9IDMyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJYml0c19wZXJfc2FtcGxlID0gMjQ7Ci0JCXNhbXBsZV93b3JkX3NpemUgPSAyNDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQliaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJc2FtcGxlX3dvcmRfc2l6ZSA9IDE2OwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IFNhbXBfcmF0ZSA9ICVkIENoYW5uZWwgPSAlZCBiaXQgd2lkdGggPSAlZCwgd29yZCBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcHJ0ZC0+c2FtcF9yYXRlLCBwcnRkLT5jaGFubmVsX21vZGUsCi0JCQliaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOwotCXJldCA9IHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92NChwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkJCQkgICAgICBwcnRkLT5zYW1wX3JhdGUsCi0JCQkJCQkgICAgICBwcnRkLT5jaGFubmVsX21vZGUsCi0JCQkJCQkgICAgICBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCQkgICAgICBzYW1wbGVfd29yZF9zaXplLAotCQkJCQkJICAgICAgQVNNX0xJVFRMRV9FTkRJQU4sCi0JCQkJCQkgICAgICBERUZBVUxUX1FGKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZGVidWcoIiVzOiBjbWQgY2ZnIHBjbSB3YXMgYmxvY2sgZmFpbGVkIiwgX19mdW5jX18pOwotCi0JcHJ0ZC0+ZW5hYmxlZCA9IFJVTk5JTkc7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1ZygiJXM6IFRyaWdnZXIgc3RhcnRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gcTZhc21fcnVuX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXByX2RlYnVnKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKLQkJYXRvbWljX3NldCgmcHJ0ZC0+c3RhcnQsIDApOwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gIT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkJcHJ0ZC0+ZW5hYmxlZCA9IFNUT1BQRUQ7Ci0JCQlyZXQgPSBxNmFzbV9jbWRfbm93YWl0KHBydGQtPmF1ZGlvX2NsaWVudCwgQ01EX1BBVVNFKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHBlbmRpbmcgQ01EX0VPUyBpc24ndCBleHBlY3RlZCAqLwotCQlXQVJOX09OX09OQ0UodGVzdF9iaXQoQ01EX0VPUywgJnBydGQtPmNtZF9wZW5kaW5nKSk7Ci0JCXNldF9iaXQoQ01EX0VPUywgJnBydGQtPmNtZF9wZW5kaW5nKTsKLQkJcmV0ID0gcTZhc21fY21kX25vd2FpdChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9FT1MpOwotCQlpZiAocmV0KQotCQkJY2xlYXJfYml0KENNRF9FT1MsICZwcnRkLT5jbWRfcGVuZGluZyk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6Ci0JCXByX2RlYnVnKCJTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRVxuIik7Ci0JCXJldCA9IHE2YXNtX2NtZF9ub3dhaXQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfUEFVU0UpOwotCQlhdG9taWNfc2V0KCZwcnRkLT5zdGFydCwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQotCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBydGQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcnRkLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JcHJ0ZC0+YXVkaW9fY2xpZW50ID0gcTZhc21fYXVkaW9fY2xpZW50X2FsbG9jKAotCQkJCShhcHBfY2IpZXZlbnRfaGFuZGxlciwgcHJ0ZCk7Ci0JaWYgKCFwcnRkLT5hdWRpb19jbGllbnQpIHsKLQkJcHJfaW5mbygiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJa2ZyZWUocHJ0ZCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBydGQtPmF1ZGlvX2NsaWVudC0+ZGV2ID0gc29jX3BydGQtPnBsYXRmb3JtLT5kZXY7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlX3BsYXliYWNrOwotCi0JLyogQ2FwdHVyZSBwYXRoICovCi0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlydW50aW1lLT5odyA9IG1zbV9wY21faGFyZHdhcmVfY2FwdHVyZTsKLQllbHNlIHsKLQkJcHJfZXJyKCJJbnZhbGlkIFN0cmVhbSB0eXBlICVkXG4iLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCi0JCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJJmNvbnN0cmFpbnRzX3NhbXBsZV9yYXRlcyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2luZm8oInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7Ci0JLyogRW5zdXJlIHRoYXQgYnVmZmVyIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBwZXJpb2Qgc2l6ZSAqLwotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsCi0JCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2luZm8oInNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZFxuIik7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAotCQkJUExBWUJBQ0tfTUlOX05VTV9QRVJJT0RTICogUExBWUJBQ0tfTUlOX1BFUklPRF9TSVpFLAotCQkJUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICogUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiY29uc3RyYWludCBmb3IgYnVmZmVyIGJ5dGVzIG1pbiBtYXggcmV0ID0gJWRcbiIsCi0JCQkJCQkJCQlyZXQpOwotCQl9Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAotCQkJQ0FQVFVSRV9NSU5fTlVNX1BFUklPRFMgKiBDQVBUVVJFX01JTl9QRVJJT0RfU0laRSwKLQkJCUNBUFRVUkVfTUFYX05VTV9QRVJJT0RTICogQ0FQVFVSRV9NQVhfUEVSSU9EX1NJWkUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjb25zdHJhaW50IGZvciBidWZmZXIgYnl0ZXMgbWluIG1heCByZXQgPSAlZFxuIiwKLQkJCQkJCQkJCXJldCk7Ci0JCX0KLQl9Ci0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwKLQkJU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgMzIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiY29uc3RyYWludCBmb3IgcGVyaW9kIGJ5dGVzIHN0ZXAgcmV0ID0gJWRcbiIsCi0JCQkJCQkJCXJldCk7Ci0JfQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHJ1bnRpbWUsIDAsCi0JCVNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIDMyKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImNvbnN0cmFpbnQgZm9yIGJ1ZmZlciBieXRlcyBzdGVwIHJldCA9ICVkXG4iLAotCQkJCQkJCQlyZXQpOwotCX0KLQotCXBydGQtPmVuYWJsZWQgPSBJRExFOwotCXBydGQtPmRzcF9jbnQgPSAwOwotCXBydGQtPnNldF9jaGFubmVsX21hcCA9IGZhbHNlOwotCXBydGQtPnJlc2V0X2V2ZW50ID0gZmFsc2U7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKLQltc21fYWRzcF9pbml0X21peGVyX2N0bF9wcF9ldmVudF9xdWV1ZShzb2NfcHJ0ZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAotCXNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLCBzbmRfcGNtX3VmcmFtZXNfdCBmcmFtZXMpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGZieXRlcyA9IDA7Ci0JaW50IHhmZXIgPSAwOwotCWNoYXIgKmJ1ZnB0ciA9IE5VTEw7Ci0Jdm9pZCAqZGF0YSA9IE5VTEw7Ci0JdWludDMyX3QgaWR4ID0gMDsKLQl1aW50MzJfdCBzaXplID0gMDsKLQl1aW50MzJfdCByZXRyaWVzID0gMDsKLQotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCWZieXRlcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOwotCXByX2RlYnVnKCIlczogcHJ0ZC0+b3V0X2NvdW50ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZwcnRkLT5vdXRfY291bnQpKTsKLQotCXdoaWxlICgoZmJ5dGVzID4gMCkgJiYgKHJldHJpZXMgPCBNQVhfUEJfQ09QWV9SRVRSSUVTKSkgewotCQlpZiAocHJ0ZC0+cmVzZXRfZXZlbnQpIHsKLQkJCXByX2VycigiJXM6IEluIFNTUiByZXR1cm4gRU5FVFJFU0VUIGJlZm9yZSB3YWl0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5FVFJFU0VUOwotCQl9Ci0KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoZV9sb2Nrcy53cml0ZV93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmcHJ0ZC0+b3V0X2NvdW50KSksIDUgKiBIWik7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50X3RpbWVvdXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRVRJTUVET1VUOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXJldCA9IDA7Ci0KLQkJaWYgKHBydGQtPnJlc2V0X2V2ZW50KSB7Ci0JCQlwcl9lcnIoIiVzOiBJbiBTU1IgcmV0dXJuIEVORVRSRVNFVCBhZnRlciB3YWl0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5FVFJFU0VUOwotCQl9Ci0KLQkJaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+b3V0X2NvdW50KSkgewotCQkJcHJfZXJyKCIlczogcGNtIHN0b3BwZWQgb3V0X2NvdW50IDBcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJZGF0YSA9IHE2YXNtX2lzX2NwdV9idWZfYXZhaWwoSU4sIHBydGQtPmF1ZGlvX2NsaWVudCwgJnNpemUsCi0JCQkmaWR4KTsKLQkJaWYgKGRhdGEgPT0gTlVMTCkgewotCQkJcmV0cmllcysrOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXRyaWVzID0gMDsKLQkJfQotCi0JCWlmIChmYnl0ZXMgPiBzaXplKQotCQkJeGZlciA9IHNpemU7Ci0JCWVsc2UKLQkJCXhmZXIgPSBmYnl0ZXM7Ci0KLQkJYnVmcHRyID0gZGF0YTsKLQkJaWYgKGJ1ZnB0cikgewotCQkJcHJfZGVidWcoIiVzOmZieXRlcyA9JWQ6IHhmZXI9JWQgc2l6ZT0lZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBmYnl0ZXMsIHhmZXIsIHNpemUpOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZnB0ciwgYnVmLCB4ZmVyKSkgewotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJcHJfZXJyKCIlczogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKElOLCBwcnRkLT5hdWRpb19jbGllbnQpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWJ1ZiArPSB4ZmVyOwotCQkJZmJ5dGVzIC09IHhmZXI7Ci0JCQlwcl9kZWJ1ZygiJXM6ZmJ5dGVzID0gJWQ6IHhmZXI9JWRcbiIsIF9fZnVuY19fLCBmYnl0ZXMsCi0JCQkJeGZlcik7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnBydGQtPnN0YXJ0KSkgewotCQkJCXByX2RlYnVnKCIlczp3cml0aW5nICVkIGJ5dGVzIG9mIGJ1ZmZlciB0byBkc3BcbiIsCi0JCQkJCQlfX2Z1bmNfXywgeGZlcik7Ci0JCQkJcmV0ID0gcTZhc21fd3JpdGUocHJ0ZC0+YXVkaW9fY2xpZW50LCB4ZmVyLAotCQkJCQkJCTAsIDAsIE5PX1RJTUVTVEFNUCk7Ci0JCQkJaWYgKHJldCA8IDApIHsKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKElOLAotCQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWF0b21pY19pbmMoJnBydGQtPm91dF9uZWVkZWQpOwotCQkJYXRvbWljX2RlYygmcHJ0ZC0+b3V0X2NvdW50KTsKLQkJfQotCX0KLWZhaWw6Ci0JaWYgKHJldHJpZXMgPj0gTUFYX1BCX0NPUFlfUkVUUklFUykKLQkJcmV0ID0gLUVOT01FTTsKLQotCXJldHVybiAgcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3BydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVpbnQzMl90IHRpbWVvdXQ7Ci0JaW50IGRpciA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNtZF9wZW5kaW5nIDB4JWx4XG4iLCBfX2Z1bmNfXywgcHJ0ZC0+Y21kX3BlbmRpbmcpOwotCi0JaWYgKHBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlkaXIgPSBJTjsKLQotCQkvKiBkZXRlcm1pbmUgdGltZW91dCBsZW5ndGggKi8KLQkJaWYgKHJ1bnRpbWUtPmZyYW1lX2JpdHMgPT0gMCB8fCBydW50aW1lLT5yYXRlID09IDApIHsKLQkJCXRpbWVvdXQgPSBDTURfRU9TX01JTl9USU1FT1VUX0xFTkdUSDsKLQkJfSBlbHNlIHsKLQkJCXRpbWVvdXQgPSAocnVudGltZS0+cGVyaW9kX3NpemUgKgotCQkJCQlDTURfRU9TX1RJTUVPVVRfTVVMVElQTElFUikgLwotCQkJCQkoKHJ1bnRpbWUtPmZyYW1lX2JpdHMgLyA4KSAqCi0JCQkJCSBydW50aW1lLT5yYXRlKTsKLQkJCWlmICh0aW1lb3V0IDwgQ01EX0VPU19NSU5fVElNRU9VVF9MRU5HVEgpCi0JCQkJdGltZW91dCA9IENNRF9FT1NfTUlOX1RJTUVPVVRfTEVOR1RIOwotCQl9Ci0JCXByX2RlYnVnKCIlczogQ01EX0VPUyB0aW1lb3V0IGlzICVkXG4iLCBfX2Z1bmNfXywgdGltZW91dCk7Ci0KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoZV9sb2Nrcy5lb3Nfd2FpdCwKLQkJCQkJICF0ZXN0X2JpdChDTURfRU9TLCAmcHJ0ZC0+Y21kX3BlbmRpbmcpLAotCQkJCQkgdGltZW91dCk7Ci0JCWlmICghcmV0KQotCQkJcHJfZXJyKCIlczogQ01EX0VPUyBmYWlsZWQsIGNtZF9wZW5kaW5nIDB4JWx4XG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBwcnRkLT5jbWRfcGVuZGluZyk7Ci0JCXE2YXNtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIENNRF9DTE9TRSk7Ci0JCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwKLQkJCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQl9Ci0JbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oc29jX3BydGQtPmRhaV9saW5rLT5pZCwKLQkJCQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwotCW1zbV9hZHNwX2NsZWFuX21peGVyX2N0bF9wcF9ldmVudF9xdWV1ZShzb2NfcHJ0ZCk7Ci0Ja2ZyZWUocHJ0ZCk7Ci0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkgaW50IGNoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLAotCQkJCQkJIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgZmJ5dGVzID0gMDsKLQlpbnQgeGZlcjsKLQljaGFyICpidWZwdHI7Ci0Jdm9pZCAqZGF0YSA9IE5VTEw7Ci0Jc3RhdGljIHVpbnQzMl90IGlkeDsKLQlzdGF0aWMgdWludDMyX3Qgc2l6ZTsKLQl1aW50MzJfdCBvZmZzZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlmYnl0ZXMgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKLQotCXByX2RlYnVnKCJhcHBsX3B0ciAlZFxuIiwgKGludClydW50aW1lLT5jb250cm9sLT5hcHBsX3B0cik7Ci0JcHJfZGVidWcoImh3X3B0ciAlZFxuIiwgKGludClydW50aW1lLT5zdGF0dXMtPmh3X3B0cik7Ci0JcHJfZGVidWcoImF2YWlsX21pbiAlZFxuIiwgKGludClydW50aW1lLT5jb250cm9sLT5hdmFpbF9taW4pOwotCi0JaWYgKHBydGQtPnJlc2V0X2V2ZW50KSB7Ci0JCXByX2VycigiJXM6IEluIFNTUiByZXR1cm4gRU5FVFJFU0VUIGJlZm9yZSB3YWl0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5FVFJFU0VUOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhlX2xvY2tzLnJlYWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmcHJ0ZC0+aW5fY291bnQpKSwgNSAqIEhaKTsKLQlpZiAoIXJldCkgewotCQlwcl9kZWJ1ZygiJXM6IHdhaXRfZXZlbnRfdGltZW91dCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAocHJ0ZC0+cmVzZXRfZXZlbnQpIHsKLQkJcHJfZXJyKCIlczogSW4gU1NSIHJldHVybiBFTkVUUkVTRVQgYWZ0ZXIgd2FpdFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0JaWYgKCFhdG9taWNfcmVhZCgmcHJ0ZC0+aW5fY291bnQpKSB7Ci0JCXByX2RlYnVnKCIlczogcGNtIHN0b3BwZWQgaW5fY291bnQgMFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJfZGVidWcoIkNoZWNraW5nIGlmIHZhbGlkIGJ1ZmZlciBpcyBhdmFpbGFibGUuLi4lcEtcbiIsCi0JCQkJCQlkYXRhKTsKLQlkYXRhID0gcTZhc21faXNfY3B1X2J1Zl9hdmFpbChPVVQsIHBydGQtPmF1ZGlvX2NsaWVudCwgJnNpemUsICZpZHgpOwotCWJ1ZnB0ciA9IGRhdGE7Ci0JcHJfZGVidWcoIlNpemUgPSAlZFxuIiwgc2l6ZSk7Ci0JcHJfZGVidWcoImZieXRlcyA9ICVkXG4iLCBmYnl0ZXMpOwotCXByX2RlYnVnKCJpZHggPSAlZFxuIiwgaWR4KTsKLQlpZiAoYnVmcHRyKSB7Ci0JCXhmZXIgPSBmYnl0ZXM7Ci0JCWlmICh4ZmVyID4gc2l6ZSkKLQkJCXhmZXIgPSBzaXplOwotCQlvZmZzZXQgPSBwcnRkLT5pbl9mcmFtZV9pbmZvW2lkeF0ub2Zmc2V0OwotCQlwcl9kZWJ1ZygiT2Zmc2V0IHZhbHVlID0gJWRcbiIsIG9mZnNldCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBidWZwdHIrb2Zmc2V0LCB4ZmVyKSkgewotCQkJcHJfZXJyKCJGYWlsZWQgdG8gY29weSBidWYgdG8gdXNlclxuIik7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJcTZhc21fY3B1X2J1Zl9yZWxlYXNlKE9VVCwgcHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlmYnl0ZXMgLT0geGZlcjsKLQkJc2l6ZSAtPSB4ZmVyOwotCQlwcnRkLT5pbl9mcmFtZV9pbmZvW2lkeF0ub2Zmc2V0ICs9IHhmZXI7Ci0JCXByX2RlYnVnKCIlczpmYnl0ZXMgPSAlZDogc2l6ZT0lZDogeGZlcj0lZFxuIiwKLQkJCQkJX19mdW5jX18sIGZieXRlcywgc2l6ZSwgeGZlcik7Ci0JCXByX2RlYnVnKCIgU2VuZGluZyBuZXh0IGJ1ZmZlciB0byBkc3BcbiIpOwotCQltZW1zZXQoJnBydGQtPmluX2ZyYW1lX2luZm9baWR4XSwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXNtX2F1ZGlvX2luX2ZyYW1lX2luZm8pKTsKLQkJYXRvbWljX2RlYygmcHJ0ZC0+aW5fY291bnQpOwotCQlyZXQgPSBxNmFzbV9yZWFkKHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoInE2YXNtIHJlYWQgZmFpbGVkXG4iKTsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlxNmFzbV9jcHVfYnVmX3JlbGVhc2UoT1VULCBwcnRkLT5hdWRpb19jbGllbnQpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfSBlbHNlCi0JCXByX2VycigiTm8gdmFsaWQgYnVmZmVyXG4iKTsKLQotCXByX2RlYnVnKCJSZXR1cm5pbmcgZnJvbSBjYXB0dXJlX2NvcHkuLi4gJWRcbiIsIHJldCk7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgZGlyID0gT1VUOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHBydGQtPmF1ZGlvX2NsaWVudCkgewotCQlxNmFzbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBDTURfQ0xPU0UpOwotCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhkaXIsCi0JCQkJcHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQkJcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUocHJ0ZC0+YXVkaW9fY2xpZW50KTsKLQl9Ci0KLQltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShzb2NfcHJ0ZC0+ZGFpX2xpbmstPmlkLAotCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwotCWtmcmVlKHBydGQpOwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NvcHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBhLAotCSBzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9wY21fcGxheWJhY2tfY29weShzdWJzdHJlYW0sIGEsIGh3b2ZmLCBidWYsIGZyYW1lcyk7Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQlyZXQgPSBtc21fcGNtX2NhcHR1cmVfY29weShzdWJzdHJlYW0sIGEsIGh3b2ZmLCBidWYsIGZyYW1lcyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9wY21fcGxheWJhY2tfY2xvc2Uoc3Vic3RyZWFtKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9wY21fY2FwdHVyZV9jbG9zZShzdWJzdHJlYW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9wY21fcGxheWJhY2tfcHJlcGFyZShzdWJzdHJlYW0pOwotCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3Vic3RyZWFtKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbXNtX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCi0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKHBydGQtPnBjbV9pcnFfcG9zID49IHBydGQtPnBjbV9zaXplKQotCQlwcnRkLT5wY21faXJxX3BvcyA9IDA7Ci0KLQlwcl9kZWJ1ZygicGNtX2lycV9wb3MgPSAlZFxuIiwgcHJ0ZC0+cGNtX2lycV9wb3MpOwotCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgKHBydGQtPnBjbV9pcnFfcG9zKSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICphcGQgPSBhYy0+cG9ydDsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICphYjsKLQlpbnQgZGlyID0gLTE7Ci0KLQlwcnRkLT5tbWFwX2ZsYWcgPSAxOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWRpciA9IElOOwotCWVsc2UKLQkJZGlyID0gT1VUOwotCWFiID0gJihhcGRbZGlyXS5idWZbMF0pOwotCi0JcmV0dXJuIG1zbV9hdWRpb19pb25fbW1hcChhYiwgdm1hKTsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFfYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWY7Ci0JaW50IGRpciwgcmV0OwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWRpciA9IElOOwotCWVsc2UKLQkJZGlyID0gT1VUOwotCXJldCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyhkaXIsCi0JCQlwcnRkLT5hdWRpb19jbGllbnQsCi0JCQkocGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpIC8gcGFyYW1zX3BlcmlvZHMocGFyYW1zKSksCi0JCQkgcGFyYW1zX3BlcmlvZHMocGFyYW1zKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJBdWRpbyBTdGFydDogQnVmZmVyIEFsbG9jYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsCi0JCQkJCQkJcmV0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZiA9IHBydGQtPmF1ZGlvX2NsaWVudC0+cG9ydFtkaXJdLmJ1ZjsKLQlpZiAoYnVmID09IE5VTEwgfHwgYnVmWzBdLmRhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcl9kZWJ1ZygiJXM6YnVmID0gJXBLXG4iLCBfX2Z1bmNfXywgYnVmKTsKLQlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKLQlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWRtYV9idWYtPmFyZWEgPSBidWZbMF0uZGF0YTsKLQlkbWFfYnVmLT5hZGRyID0gIGJ1ZlswXS5waHlzOwotCWRtYV9idWYtPmJ5dGVzID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpOwotCWlmICghZG1hX2J1Zi0+YXJlYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzbmRfcGNtX3NldF9ydW50aW1lX2J1ZmZlcihzdWJzdHJlYW0sICZzdWJzdHJlYW0tPmRtYV9idWZmZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0gewotCS5vcGVuICAgICAgICAgICA9IG1zbV9wY21fb3BlbiwKLQkuY29weQkJPSBtc21fcGNtX2NvcHksCi0JLmh3X3BhcmFtcwk9IG1zbV9wY21faHdfcGFyYW1zLAotCS5jbG9zZSAgICAgICAgICA9IG1zbV9wY21fY2xvc2UsCi0JLmlvY3RsICAgICAgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCi0JLnByZXBhcmUgICAgICAgID0gbXNtX3BjbV9wcmVwYXJlLAotCS50cmlnZ2VyICAgICAgICA9IG1zbV9wY21fdHJpZ2dlciwKLQkucG9pbnRlciAgICAgICAgPSBtc21fcGNtX3BvaW50ZXIsCi0JLm1tYXAJCT0gbXNtX3BjbV9tbWFwLAotfTsKLQotc3RhdGljIGludCBtc21fcGNtX2Fkc3Bfc3RyZWFtX2NtZF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpwY20gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19jb21wb25lbnRfdG9fcGxhdGZvcm0ocGNtKTsKLQlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEocGxhdGZvcm0tPmRldik7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqZXZlbnRfZGF0YSA9IE5VTEw7Ci0KLQlpZiAoIXBkYXRhKSB7Ci0JCXByX2VycigiJXMgcGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3Vic3RyZWFtID0gcGRhdGEtPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07Ci0JaWYgKCFzdWJzdHJlYW0pIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwcnRkLT5hdWRpb19jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzIHBydGQgaXMgbnVsbC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWV2ZW50X2RhdGEgPSAoc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEgKil1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YTsKLQlpZiAoKGV2ZW50X2RhdGEtPmV2ZW50X3R5cGUgPCBBRFNQX1NUUkVBTV9QUF9FVkVOVCkgfHwKLQkgICAgKGV2ZW50X2RhdGEtPmV2ZW50X3R5cGUgPj0gQURTUF9TVFJFQU1fRVZFTlRfTUFYKSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGV2ZW50X3R5cGU9JWQiLAotCQkJX19mdW5jX18sIGV2ZW50X2RhdGEtPmV2ZW50X3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChzaXplb2Yoc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEpICsgZXZlbnRfZGF0YS0+cGF5bG9hZF9sZW4pID49Ci0JCQkJCXNpemVvZih1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSkpIHsKLQkJcHJfZXJyKCIlcyBwYXJhbSBsZW5ndGg9JWQgIGV4Y2VlZHMgbGltaXQiLAotCQkJX19mdW5jX18sIGV2ZW50X2RhdGEtPnBheWxvYWRfbGVuKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHE2YXNtX3NlbmRfc3RyZWFtX2NtZChwcnRkLT5hdWRpb19jbGllbnQsIGV2ZW50X2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2VuZCBzdHJlYW0gZXZlbnQgY21kLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NtZF9jb250cm9sKAotCQkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZSA9IERTUF9TVFJFQU1fQ01EOwotCWNvbnN0IGNoYXIgKmRldmljZU5vID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCWludCBjdGxfbGVuID0gMCwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9hdWRpb19hZHNwX3N0cmVhbV9jbWRfY29uZmlnX2NvbnRyb2xbMV0gPSB7Ci0JCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIj8iLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBtc21fYWRzcF9zdHJlYW1fY21kX2luZm8sCi0JCS5wdXQgPSBtc21fcGNtX2Fkc3Bfc3RyZWFtX2NtZF9wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzIHJ0ZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghbWl4ZXJfc3RyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbnByaW50ZihtaXhlcl9zdHIsIGN0bF9sZW4sICIlcyAlZCIsIG1peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlKTsKLQlmZV9hdWRpb19hZHNwX3N0cmVhbV9jbWRfY29uZmlnX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9hdWRpb19hZHNwX3N0cmVhbV9jbWRfY29uZmlnX2NvbnRyb2xbMF0ucHJpdmF0ZV92YWx1ZSA9Ci0JCXJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCJSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBtaXhlcl9zdHIpOwotCXJldCA9IHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCWZlX2F1ZGlvX2Fkc3Bfc3RyZWFtX2NtZF9jb25maWdfY29udHJvbCwKLQkJQVJSQVlfU0laRShmZV9hdWRpb19hZHNwX3N0cmVhbV9jbWRfY29uZmlnX2NvbnRyb2wpKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogZmFpbGVkIGFkZCBjdGwgJXMuIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIG1peGVyX3N0ciwgcmV0KTsKLQotCWtmcmVlKG1peGVyX3N0cik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9hZGRfYXVkaW9fYWRzcF9zdHJlYW1fY2FsbGJhY2tfY29udHJvbCgKLQkJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSBEU1BfU1RSRUFNX0NBTExCQUNLOwotCWNvbnN0IGNoYXIgKmRldmljZU5vID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCWludCBjdGxfbGVuID0gMCwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwotCi0Jc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZmVfYXVkaW9fYWRzcF9jYWxsYmFja19jb25maWdfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9hZHNwX3N0cmVhbV9jYWxsYmFja19pbmZvLAotCQkuZ2V0ID0gbXNtX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2dldCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogYWRkZWQgbmV3IHBjbSBGRSB3aXRoIG5hbWUgJXMsIGlkICVkLCBjcHUgZGFpICVzLCBkZXZpY2Ugbm8gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcnRkLT5kYWlfbGluay0+bmFtZSwgcnRkLT5kYWlfbGluay0+aWQsCi0JCSBydGQtPmRhaV9saW5rLT5jcHVfZGFpX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2F1ZGlvX2Fkc3BfY2FsbGJhY2tfY29uZmlnX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPQotCQlydGQtPmRhaV9saW5rLT5pZDsKLQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXNcbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwotCXJldCA9IHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQlmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sLAotCQkJQVJSQVlfU0laRShmZV9hdWRpb19hZHNwX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBjdGwgJXMuIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIG1peGVyX3N0ciwgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX21peGVyX3N0cjsKLQl9Ci0KLQlrY3RsID0gc25kX3NvY19jYXJkX2dldF9rY29udHJvbChydGQtPmNhcmQsIG1peGVyX3N0cik7Ci0JaWYgKCFrY3RsKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQga2N0bCAlcy5cbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfbWl4ZXJfc3RyOwotCX0KLQotCWtjdGwtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0KLWZyZWVfbWl4ZXJfc3RyOgotCWtmcmVlKG1peGVyX3N0cik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9zZXRfdm9sdW1lKHN0cnVjdCBtc21fYXVkaW8gKnBydGQsIHVpbnQzMl90IHZvbHVtZSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHBydGQgJiYgcHJ0ZC0+YXVkaW9fY2xpZW50KSB7Ci0JCXByX2RlYnVnKCIlczogY2hhbm5lbHMgJWQgdm9sdW1lIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCXBydGQtPmNoYW5uZWxfbW9kZSwgdm9sdW1lKTsKLQkJcmMgPSBxNmFzbV9zZXRfdm9sdW1lKHBydGQtPmF1ZGlvX2NsaWVudCwgdm9sdW1lKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogU2VuZCBWb2x1bWUgY29tbWFuZCBmYWlsZWQgcmM9JWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KLQkJdm9sLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwotCXN0cnVjdCBtc21fYXVkaW8gKnBydGQ7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAoIXN1YnN0cmVhbSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmICghc3Vic3RyZWFtLT5ydW50aW1lKSB7Ci0JCXByX2VycigiJXMgc3Vic3RyZWFtIHJ1bnRpbWUgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JaWYgKHBydGQpCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJ0ZC0+dm9sdW1lOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV92b2x1bWUgKnZvbCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9Ci0JCXZvbC0+cGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXByX2RlYnVnKCIlczogdm9sdW1lIDogMHgleFxuIiwgX19mdW5jX18sIHZvbHVtZSk7Ci0JaWYgKCFzdWJzdHJlYW0pIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoIXN1YnN0cmVhbS0+cnVudGltZSkgewotCQlwcl9lcnIoIiVzIHN1YnN0cmVhbSBydW50aW1lIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChwcnRkKSB7Ci0JCXJjID0gbXNtX3BjbV9zZXRfdm9sdW1lKHBydGQsIHZvbHVtZSk7Ci0JCXBydGQtPnZvbHVtZSA9IHZvbHVtZTsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwotCXN0cnVjdCBzbmRfcGNtX3ZvbHVtZSAqdm9sdW1lX2luZm87Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQotCWRldl9kYmcocnRkLT5kZXYsICIlcywgVm9sdW1lIGNvbnRyb2wgYWRkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0ID0gc25kX3BjbV9hZGRfdm9sdW1lX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJTlVMTCwgMSwgcnRkLT5kYWlfbGluay0+aWQsCi0JCQkmdm9sdW1lX2luZm8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXMgdm9sdW1lIGNvbnRyb2wgZmFpbGVkIHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWtjdGwgPSB2b2x1bWVfaW5mby0+a2N0bDsKLQlrY3RsLT5wdXQgPSBtc21fcGNtX3ZvbHVtZV9jdGxfcHV0OwotCWtjdGwtPmdldCA9IG1zbV9wY21fdm9sdW1lX2N0bF9nZXQ7Ci0Ja2N0bC0+dGx2LnAgPSBtc21fcGNtX3ZvbF9nYWluOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY29tcHJlc3NfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKLQl1aW5mby0+Y291bnQgPSAxOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHgyMDAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY29tcHJlc3NfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2NfY29tcG9uZW50X3RvX3BsYXRmb3JtKGNvbXApOwotCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCi0JaWYgKCFwZGF0YSkgewotCQlwcl9lcnIoIiVzIHBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXN1YnN0cmVhbSA9IHBkYXRhLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwotCWlmICghc3Vic3RyZWFtKSB7Ci0JCXByX2VycigiJXMgc3Vic3RyZWFtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gcnVudGltZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAocHJ0ZCkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcnRkLT5jb21wcmVzc19lbmFibGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jb21wcmVzc19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2NfY29tcG9uZW50X3RvX3BsYXRmb3JtKGNvbXApOwotCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCWludCBjb21wcmVzcyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JaWYgKCFwZGF0YSkgewotCQlwcl9lcnIoIiVzIHBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXN1YnN0cmVhbSA9IHBkYXRhLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwotCXByX2RlYnVnKCIlczogY29tcHJlc3MgOiAweCV4XG4iLCBfX2Z1bmNfXywgY29tcHJlc3MpOwotCWlmICghc3Vic3RyZWFtKSB7Ci0JCXByX2VycigiJXMgc3Vic3RyZWFtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKLQkJcHJfZXJyKCIlcyBzdWJzdHJlYW0gcnVudGltZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAocHJ0ZCkgewotCQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgY29tcHJlc3MgZmxhZyB0byAweCV4XG4iLAotCQlfX2Z1bmNfXywgY29tcHJlc3MpOwotCQlwcnRkLT5jb21wcmVzc19lbmFibGUgPSBjb21wcmVzczsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX2NvbXByZXNzX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZSA9ICJQbGF5YmFjayAiOwotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9lbmRfbmFtZSA9ICIgQ29tcHJlc3MiOwotCWNvbnN0IGNoYXIgKmRldmljZU5vID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCWludCBjdGxfbGVuOwotCWludCByZXQgPSAwOwotCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YTsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwY21fY29tcHJlc3NfY29udHJvbFsxXSA9IHsKLQkJewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiPyIsCi0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaW5mbyA9IG1zbV9wY21fY29tcHJlc3NfY3RsX2luZm8sCi0JCS5nZXQgPSBtc21fcGNtX2NvbXByZXNzX2N0bF9nZXQsCi0JCS5wdXQgPSBtc21fcGNtX2NvbXByZXNzX2N0bF9wdXQsCi0JCS5wcml2YXRlX3ZhbHVlID0gMCwKLQkJfQotCX07Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzOiBOVUxMIHJ0ZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIHN0cmxlbihkZXZpY2VObykgKwotCQkgIHN0cmxlbihtaXhlcl9jdGxfZW5kX25hbWUpICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwotCi0JaWYgKCFtaXhlcl9zdHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMlZCVzIiwgbWl4ZXJfY3RsX25hbWUsCi0JCQlydGQtPnBjbS0+ZGV2aWNlLCBtaXhlcl9jdGxfZW5kX25hbWUpOwotCi0JcGNtX2NvbXByZXNzX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlwY21fY29tcHJlc3NfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtLT5kZXYpOwotCWlmIChwZGF0YSkgewotCQlpZiAoIXBkYXRhLT5wY20pIHsKLQkJCXBkYXRhLT5wY20gPSBydGQtPnBjbTsKLQkJCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQkJCQkgICAgICBwY21fY29tcHJlc3NfY29udHJvbCwKLQkJCQkJCSAgICAgIEFSUkFZX1NJWkUKLQkJCQkJCSAgICAgIChwY21fY29tcHJlc3NfY29udHJvbCkpOwotCQkJcHJfZGVidWcoIiVzOiBhZGQgY29udHJvbCBzdWNjZXNzIHBsdCA9ICVwS1xuIiwKLQkJCQkgX19mdW5jX18sIHJ0ZC0+cGxhdGZvcm0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogTlVMTCBwZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQlrZnJlZShtaXhlcl9zdHIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaG1hcF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpOwotCXN0cnVjdCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGludCBpZHggPSBzbmRfY3RsX2dldF9pb2ZmaWR4KGtjb250cm9sLCAmdWNvbnRyb2wtPmlkKTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvICpwcnRkOwotCi0JcHJfZGVidWcoIiVzIiwgX19mdW5jX18pOwotCXN1YnN0cmVhbSA9IHNuZF9wY21fY2htYXBfc3Vic3RyZWFtKGluZm8sIGlkeCk7Ci0JaWYgKCFzdWJzdHJlYW0pCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghc3Vic3RyZWFtLT5ydW50aW1lKQotCQlyZXR1cm4gMDsKLQotCXBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAocHJ0ZCkgewotCQlwcnRkLT5zZXRfY2hhbm5lbF9tYXAgPSB0cnVlOwotCQkJZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCi0JCQkJcHJ0ZC0+Y2hhbm5lbF9tYXBbaV0gPQotCQkJCShjaGFyKSh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2htYXBfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBpbnQgaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZDsKLQotCXByX2RlYnVnKCIlcyIsIF9fZnVuY19fKTsKLQlzdWJzdHJlYW0gPSBzbmRfcGNtX2NobWFwX3N1YnN0cmVhbShpbmZvLCBpZHgpOwotCWlmICghc3Vic3RyZWFtKQotCQlyZXR1cm4gLUVOT0RFVjsKLQltZW1zZXQodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWUsIDAsCi0JCXNpemVvZih1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZSkpOwotCWlmICghc3Vic3RyZWFtLT5ydW50aW1lKQotCQlyZXR1cm4gMDsgLyogbm8gY2hhbm5lbHMgc2V0ICovCi0KLQlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAocHJ0ZCAmJiBwcnRkLT5zZXRfY2hhbm5lbF9tYXAgPT0gdHJ1ZSkgewotCQlmb3IgKGkgPSAwOyBpIDwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUw7IGkrKykKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0KLQkJCQkJKGludClwcnRkLT5jaGFubmVsX21hcFtpXTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUw7IGkrKykKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2FkZF9jaG1hcF9jb250cm9scyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKLQlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqY2htYXBfaW5mbzsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwotCWNoYXIgZGV2aWNlX251bVsxMl07Ci0JaW50IGksIHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMsIENoYW5uZWwgbWFwIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOwotCXJldCA9IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAotCQkJCSAgICAgc25kX3BjbV9zdGRfY2htYXBzLAotCQkJCSAgICAgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwsIDAsCi0JCQkJICAgICAmY2htYXBfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlcywgY2hhbm5lbCBtYXAgY250cmwgYWRkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQlrY3RsID0gY2htYXBfaW5mby0+a2N0bDsKLQlmb3IgKGkgPSAwOyBpIDwga2N0bC0+Y291bnQ7IGkrKykKLQkJa2N0bC0+dmRbaV0uYWNjZXNzIHw9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKLQlzbnByaW50ZihkZXZpY2VfbnVtLCBzaXplb2YoZGV2aWNlX251bSksICIlZCIsIHBjbS0+ZGV2aWNlKTsKLQlzdHJsY2F0KGtjdGwtPmlkLm5hbWUsIGRldmljZV9udW0sIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7Ci0JcHJfZGVidWcoIiVzLCBPdmVyd3JpdGluZyBjaGFubmVsIG1hcCBjb250cm9sIG5hbWUgdG86ICVzXG4iLAotCQlfX2Z1bmNfXywga2N0bC0+aWQubmFtZSk7Ci0Ja2N0bC0+cHV0ID0gbXNtX3BjbV9jaG1hcF9jdGxfcHV0OwotCWtjdGwtPmdldCA9IG1zbV9wY21fY2htYXBfY3RsX2dldDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1JYOwotCWludCBiZV9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgY2ZnX2RhdGEgPSB7MCwgMCwgNDgwMDB9OwotCWludCByZXQgPSAwOwotCi0JY2ZnX2RhdGEuYXBwX3R5cGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQljZmdfZGF0YS5hY2RiX2Rldl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSAhPSAwKQotCQljZmdfZGF0YS5zYW1wbGVfcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdOwotCXByX2RlYnVnKCIlczogZmVfaWQtICVsbHUgc2Vzc2lvbl90eXBlLSAlZCBiZV9pZC0gJWQgYXBwX3R5cGUtICVkIGFjZGJfZGV2X2lkLSAlZCBzYW1wbGVfcmF0ZS0gJWRcbiIsCi0JCV9fZnVuY19fLCBmZV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEuYXBwX3R5cGUsIGNmZ19kYXRhLmFjZGJfZGV2X2lkLCBjZmdfZGF0YS5zYW1wbGVfcmF0ZSk7Ci0JcmV0ID0gbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKGZlX2lkLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgICBiZV9pZCwgJmNmZ19kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnIGZhaWxlZCByZXR1cm5lZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3BsYXliYWNrX2FwcF90eXBlX2NmZ19jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1JYOwotCWludCBiZV9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswfTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgc2Vzc2lvbl90eXBlLAotCQkJCQkJICAgICAgJmJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2ZnX2RhdGEuYXBwX3R5cGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjZmdfZGF0YS5hY2RiX2Rldl9pZDsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IGNmZ19kYXRhLnNhbXBsZV9yYXRlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gYmVfaWQ7Ci0JcHJfZGVidWcoIiVzOiBmZWRhaV9pZCAlbGx1LCBzZXNzaW9uX3R5cGUgJWQsIGJlX2lkICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAotCQlfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgYmVfaWQsCi0JCWNmZ19kYXRhLmFwcF90eXBlLCBjZmdfZGF0YS5hY2RiX2Rldl9pZCwgY2ZnX2RhdGEuc2FtcGxlX3JhdGUpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2FwdHVyZV9hcHBfdHlwZV9jZmdfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTY0IGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IHNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQlpbnQgYmVfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXTsKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnIGNmZ19kYXRhID0gezAsIDAsIDQ4MDAwfTsKLQlpbnQgcmV0ID0gMDsKLQotCWNmZ19kYXRhLmFwcF90eXBlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JY2ZnX2RhdGEuYWNkYl9kZXZfaWQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gIT0gMCkKLQkJY2ZnX2RhdGEuc2FtcGxlX3JhdGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQlwcl9kZWJ1ZygiJXM6IGZlX2lkLSAlbGx1IHNlc3Npb25fdHlwZS0gJWQgYmVfaWQtICVkIGFwcF90eXBlLSAlZCBhY2RiX2Rldl9pZC0gJWQgc2FtcGxlX3JhdGUtICVkXG4iLAotCQlfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgYmVfaWQsCi0JCWNmZ19kYXRhLmFwcF90eXBlLCBjZmdfZGF0YS5hY2RiX2Rldl9pZCwgY2ZnX2RhdGEuc2FtcGxlX3JhdGUpOwotCXJldCA9IG1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgc2Vzc2lvbl90eXBlLAotCQkJCQkJICAgICAgYmVfaWQsICZjZmdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1NjQgZmVfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCWludCBiZV9pZCA9IDA7Ci0Jc3RydWN0IG1zbV9wY21fc3RyZWFtX2FwcF90eXBlX2NmZyBjZmdfZGF0YSA9IHswfTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyhmZV9pZCwgc2Vzc2lvbl90eXBlLAotCQkJCQkJICAgICAgJmJlX2lkLCAmY2ZnX2RhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyBmYWlsZWQgcmV0dXJuZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2ZnX2RhdGEuYXBwX3R5cGU7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBjZmdfZGF0YS5hY2RiX2Rldl9pZDsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXSA9IGNmZ19kYXRhLnNhbXBsZV9yYXRlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdID0gYmVfaWQ7Ci0JcHJfZGVidWcoIiVzOiBmZWRhaV9pZCAlbGx1LCBzZXNzaW9uX3R5cGUgJWQsIGJlX2lkICVkLCBhcHBfdHlwZSAlZCwgYWNkYl9kZXZfaWQgJWQsIHNhbXBsZV9yYXRlICVkXG4iLAotCQlfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgYmVfaWQsCi0JCWNmZ19kYXRhLmFwcF90eXBlLCBjZmdfZGF0YS5hY2RiX2Rldl9pZCwgY2ZnX2RhdGEuc2FtcGxlX3JhdGUpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fYWRkX2FwcF90eXBlX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwotCXN0cnVjdCBzbmRfcGNtX3VzciAqYXBwX3R5cGVfaW5mbzsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOwotCWNvbnN0IGNoYXIgKnBsYXliYWNrX21peGVyX2N0bF9uYW1lCT0gIkF1ZGlvIFN0cmVhbSI7Ci0JY29uc3QgY2hhciAqY2FwdHVyZV9taXhlcl9jdGxfbmFtZQk9ICJBdWRpbyBTdHJlYW0gQ2FwdHVyZSI7Ci0JY29uc3QgY2hhciAqZGV2aWNlTm8JCT0gIk5OIjsKLQljb25zdCBjaGFyICpzdWZmaXgJCT0gIkFwcCBUeXBlIENmZyI7Ci0JaW50IGN0bF9sZW4sIHJldCA9IDA7Ci0KLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkgewotCQljdGxfbGVuID0gc3RybGVuKHBsYXliYWNrX21peGVyX2N0bF9uYW1lKSArIDEgKwotCQkJCXN0cmxlbihkZXZpY2VObykgKyAxICsgc3RybGVuKHN1ZmZpeCkgKyAxOwotCQlwcl9kZWJ1ZygiJXM6IFBsYXliYWNrIGFwcCB0eXBlIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBzbmRfcGNtX2FkZF91c3JfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQkJCU5VTEwsIDEsIGN0bF9sZW4sIHJ0ZC0+ZGFpX2xpbmstPmlkLAotCQkJCQkmYXBwX3R5cGVfaW5mbyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBwbGF5YmFjayBhcHAgdHlwZSBjbnRybCBhZGQgZmFpbGVkOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJa2N0bCA9IGFwcF90eXBlX2luZm8tPmtjdGw7Ci0JCXNucHJpbnRmKGtjdGwtPmlkLm5hbWUsIGN0bF9sZW4sICIlcyAlZCAlcyIsCi0JCQlwbGF5YmFja19taXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKLQkJa2N0bC0+cHV0ID0gbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX3B1dDsKLQkJa2N0bC0+Z2V0ID0gbXNtX3BjbV9wbGF5YmFja19hcHBfdHlwZV9jZmdfY3RsX2dldDsKLQl9Ci0KLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7Ci0JCWN0bF9sZW4gPSBzdHJsZW4oY2FwdHVyZV9taXhlcl9jdGxfbmFtZSkgKyAxICsKLQkJCQlzdHJsZW4oZGV2aWNlTm8pICsgMSArIHN0cmxlbihzdWZmaXgpICsgMTsKLQkJcHJfZGVidWcoIiVzOiBDYXB0dXJlIGFwcCB0eXBlIGNudHJsIGFkZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBzbmRfcGNtX2FkZF91c3JfY3RscyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKLQkJCQkJTlVMTCwgMSwgY3RsX2xlbiwgcnRkLT5kYWlfbGluay0+aWQsCi0JCQkJCSZhcHBfdHlwZV9pbmZvKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGNhcHR1cmUgYXBwIHR5cGUgY250cmwgYWRkIGZhaWxlZDogJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWtjdGwgPSBhcHBfdHlwZV9pbmZvLT5rY3RsOwotCQlzbnByaW50ZihrY3RsLT5pZC5uYW1lLCBjdGxfbGVuLCAiJXMgJWQgJXMiLAotCQkJY2FwdHVyZV9taXhlcl9jdGxfbmFtZSwgcnRkLT5wY20tPmRldmljZSwgc3VmZml4KTsKLQkJa2N0bC0+cHV0ID0gbXNtX3BjbV9jYXB0dXJlX2FwcF90eXBlX2NmZ19jdGxfcHV0OwotCQlrY3RsLT5nZXQgPSBtc21fcGNtX2NhcHR1cmVfYXBwX3R5cGVfY2ZnX2N0bF9nZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXJldCA9IG1zbV9wY21fYWRkX2NobWFwX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogcGNtIGFkZCBjb250cm9scyBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCXJldCA9IG1zbV9wY21fYWRkX2FwcF90eXBlX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogcGNtIGFkZCBhcHAgdHlwZSBjb250cm9scyBmYWlsZWQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQotCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotCXJldCA9IG1zbV9wY21fYWRkX2NvbnRyb2xzKHJ0ZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzLCBrY3RsIGFkZCBmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG1zbV9wY21fYWRkX3ZvbHVtZV9jb250cm9sKHJ0ZCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGFkZCBwY20gVm9sdW1lIENvbnRyb2wgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldCA9IG1zbV9wY21fYWRkX2NvbXByZXNzX2NvbnRyb2wocnRkKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIHBjbSBDb21wcmVzcyBDb250cm9sICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXQgPSBtc21fcGNtX2FkZF9hdWRpb19hZHNwX3N0cmVhbV9jbWRfY29udHJvbChydGQpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgcGNtIEFEU1AgU3RyZWFtIENtZCBDb250cm9sXG4iLAotCQkJX19mdW5jX18pOwotCi0JcmV0ID0gbXNtX3BjbV9hZGRfYXVkaW9fYWRzcF9zdHJlYW1fY2FsbGJhY2tfY29udHJvbChydGQpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IENvdWxkIG5vdCBhZGQgcGNtIEFEU1AgU3RyZWFtIENhbGxiYWNrIENvbnRyb2xcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc25kX3BjbV9zZnJhbWVzX3QgbXNtX3BjbV9kZWxheV9ibGsoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV9hdWRpbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IHBydGQtPmF1ZGlvX2NsaWVudDsKLQlzbmRfcGNtX3NmcmFtZXNfdCBmcmFtZXM7Ci0JaW50IHJldDsKLQotCXJldCA9IHE2YXNtX2dldF9wYXRoX2RlbGF5KHBydGQtPmF1ZGlvX2NsaWVudCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBnZXRfcGF0aF9kZWxheSBmYWlsZWQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGNvbnZlcnQgbWljcm9zZWNvbmRzIHRvIGZyYW1lcyAqLwotCWZyYW1lcyA9IGFjLT5wYXRoX2RlbGF5IC8gMTAwMCAqIHJ1bnRpbWUtPnJhdGUgLyAxMDAwOwotCi0JLyogYWxzbyBjb252ZXJ0IHRoZSByZW1haW5kZXIgZnJvbSB0aGUgaW5pdGlhbCBkaXZpc2lvbiAqLwotCWZyYW1lcyArPSBhYy0+cGF0aF9kZWxheSAlIDEwMDAgKiBydW50aW1lLT5yYXRlIC8gMTAwMDAwMDsKLQotCS8qIG92ZXJjb21wZW5zYXRlIGZvciB0aGUgbG9zcyBvZiBwcmVjaXNpb24gKGVtcGlyaWNhbCkgKi8KLQlmcmFtZXMgKz0gMjsKLQotCXJldHVybiBmcmFtZXM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgbXNtX3NvY19wbGF0Zm9ybSA9IHsKLQkub3BzCQk9ICZtc21fcGNtX29wcywKLQkucGNtX25ldwk9IG1zbV9hc29jX3BjbV9uZXcsCi0JLmRlbGF5X2JsayAgICAgID0gbXNtX3BjbV9kZWxheV9ibGssCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmM7Ci0JaW50IGlkOwotCXN0cnVjdCBtc21fcGxhdF9kYXRhICpwZGF0YTsKLQljb25zdCBjaGFyICpsYXRlbmN5X2xldmVsOwotCi0JcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkicWNvbSxtc20tcGNtLWRzcC1pZCIsICZpZCk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBxY29tLG1zbS1wY20tZHNwLWlkIG1pc3NpbmcgaW4gRFQgbm9kZVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNtX3BsYXRfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkicWNvbSxtc20tcGNtLWxvdy1sYXRlbmN5IikpIHsKLQotCQlwZGF0YS0+cGVyZl9tb2RlID0gTE9XX0xBVEVOQ1lfUENNX01PREU7Ci0JCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkicWNvbSxsYXRlbmN5LWxldmVsIiwgJmxhdGVuY3lfbGV2ZWwpOwotCQlpZiAoIXJjKSB7Ci0JCQlpZiAoIXN0cmNtcChsYXRlbmN5X2xldmVsLCAidWx0cmEiKSkKLQkJCQlwZGF0YS0+cGVyZl9tb2RlID0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREU7Ci0JCQllbHNlIGlmICghc3RyY21wKGxhdGVuY3lfbGV2ZWwsICJ1bGwtcHAiKSkKLQkJCQlwZGF0YS0+cGVyZl9tb2RlID0KLQkJCQkJVUxMX1BPU1RfUFJPQ0VTU0lOR19QQ01fTU9ERTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBkYXRhLT5wZXJmX21vZGUgPSBMRUdBQ1lfUENNX01PREU7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHBkYXRhKTsKLQotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IGRldiBuYW1lICVzXG4iLAotCQkJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKLQkJCQkgICAmbXNtX3NvY19wbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbXNtX3BsYXRfZGF0YSAqcGRhdGE7Ci0KLQlwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlrZnJlZShwZGF0YSk7Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3BjbV9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS1wY20tZHNwIn0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fcGNtX2R0X21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXNtX3BjbV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNtLXBjbS1kc3AiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3BjbV9kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9wY21fcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9wY21fcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCi17Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhlX2xvY2tzLmVuYWJsZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3MuZW9zX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoZV9sb2Nrcy53cml0ZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aGVfbG9ja3MucmVhZF93YWl0KTsKLQotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1zbV9zb2NfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3BsYXRmb3JtX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXNtX3BjbV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX3NvY19wbGF0Zm9ybV9leGl0KTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ00gbW9kdWxlIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtdjIuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXE2LXYyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiM2YwNDguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcTYtdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA4IEhUQyBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB5b3UgY2FuIGZpbmQgaXQgYXQgaHR0cDovL3d3dy5mc2Yub3JnLgotICovCi0KLSNpZm5kZWYgX01TTV9QQ01fSAotI2RlZmluZSBfTVNNX1BDTV9ICi0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KLQotCi0KLS8qIFN1cHBvcnQgdW5jb252ZW50aW9uYWwgc2FtcGxlIHJhdGVzIDEyMDAwLCAyNDAwMCBhcyB3ZWxsICovCi0jZGVmaW5lIFVTRV9SQVRFICAgICAgICAgICAgICAgIFwKLQkJCShTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfS05PVCkKLQotZXh0ZXJuIGludCBjb3B5X2NvdW50OwotCi1zdHJ1Y3QgYnVmZmVyIHsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCB1c2VkOwotCXVuc2lnbmVkIGludCBhZGRyOwotfTsKLQotc3RydWN0IGJ1ZmZlcl9yZWMgewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgaW50IHJlYWQ7Ci0JdW5zaWduZWQgaW50IGFkZHI7Ci19OwotCi1zdHJ1Y3QgYXVkaW9fbG9ja3MgewotCXNwaW5sb2NrX3QgZXZlbnRfbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBlb3Nfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBlbmFibGVfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBmbHVzaF93YWl0OwotfTsKLQotc3RydWN0IG1zbV9hdWRpb19pbl9mcmFtZV9pbmZvIHsKLQl1aW50MzJfdCBzaXplOwotCXVpbnQzMl90IG9mZnNldDsKLX07Ci0KLSNkZWZpbmUgUExBWUJBQ0tfTUlOX05VTV9QRVJJT0RTICAgIDIKLSNkZWZpbmUgUExBWUJBQ0tfTUFYX05VTV9QRVJJT0RTICAgIDgKLSNkZWZpbmUgUExBWUJBQ0tfTUFYX1BFUklPRF9TSVpFICAgIDEyMjg4MAotI2RlZmluZSBQTEFZQkFDS19NSU5fUEVSSU9EX1NJWkUgICAgMTI4Ci0jZGVmaW5lIENBUFRVUkVfTUlOX05VTV9QRVJJT0RTICAgICAyCi0jZGVmaW5lIENBUFRVUkVfTUFYX05VTV9QRVJJT0RTICAgICA4Ci0jZGVmaW5lIENBUFRVUkVfTUFYX1BFUklPRF9TSVpFICAgICAxMjI4ODAKLSNkZWZpbmUgQ0FQVFVSRV9NSU5fUEVSSU9EX1NJWkUgICAgIDMyMAotCi1zdHJ1Y3QgbXNtX2F1ZGlvIHsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQl1bnNpZ25lZCBpbnQgcGNtX3NpemU7Ci0JdW5zaWduZWQgaW50IHBjbV9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcGNtX2lycV9wb3M7ICAgICAgIC8qIElSUSBwb3NpdGlvbiAqLwotCXVpbnQxNl90IHNvdXJjZTsgLyogRW5jb2Rpbmcgc291cmNlIGJpdCBtYXNrICovCi0KLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci0KLQl1aW50MTZfdCBzZXNzaW9uX2lkOwotCi0JdWludDMyX3Qgc2FtcF9yYXRlOwotCXVpbnQzMl90IGNoYW5uZWxfbW9kZTsKLQl1aW50MzJfdCBkc3BfY250OwotCi0JaW50IGFib3J0OyAvKiBzZXQgd2hlbiBlcnJvciwgbGlrZSBzYW1wbGUgcmF0ZSBtaXNtYXRjaCAqLwotCi0JYm9vbCByZXNldF9ldmVudDsKLQlpbnQgZW5hYmxlZDsKLQlpbnQgY2xvc2VfYWNrOwotCWludCBjbWRfYWNrOwotCS8qCi0JICogY21kX2FjayBkb2Vzbid0IHRlbGwgaWYgcGF0aWN1bGFyIGNvbW1hbmQgaGFzIGJlZW4gc2VudCBzbyBjYW4ndAotCSAqIGRldGVybWluZSBpZiBpdCBuZWVkcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLgotCSAqIFVzZSBjbWRfcGVuZGluZyBpbnN0ZWFkIHdoZW4gY2hlY2tpbmcgd2hldGhlciBhIGNvbW1hbmQgaXMgYmVlbgotCSAqIHNlbnQgb3Igbm90LgotCSAqLwotCXVuc2lnbmVkIGxvbmcgY21kX3BlbmRpbmc7Ci0JYXRvbWljX3Qgc3RhcnQ7Ci0JYXRvbWljX3Qgc3RvcDsKLQlhdG9taWNfdCBvdXRfY291bnQ7Ci0JYXRvbWljX3QgaW5fY291bnQ7Ci0JYXRvbWljX3Qgb3V0X25lZWRlZDsKLQlhdG9taWNfdCBlb3M7Ci0JaW50IG91dF9oZWFkOwotCWludCBwZXJpb2RzOwotCWludCBtbWFwX2ZsYWc7Ci0JYXRvbWljX3QgcGVuZGluZ19idWZmZXI7Ci0JYm9vbCBzZXRfY2hhbm5lbF9tYXA7Ci0JY2hhciBjaGFubmVsX21hcFs4XTsKLQlpbnQgY21kX2ludGVycnVwdDsKLQlib29sIG1ldGFfZGF0YV9tb2RlOwotCXVpbnQzMl90IHZvbHVtZTsKLQlib29sIGNvbXByZXNzX2VuYWJsZTsKLQkvKiBhcnJheSBvZiBmcmFtZSBpbmZvICovCi0Jc3RydWN0IG1zbV9hdWRpb19pbl9mcmFtZV9pbmZvIGluX2ZyYW1lX2luZm9bQ0FQVFVSRV9NQVhfTlVNX1BFUklPRFNdOwotfTsKLQotc3RydWN0IG91dHB1dF9tZXRhX2RhdGFfc3QgewotCXVpbnQzMl90IG1ldGFfZGF0YV9sZW5ndGg7Ci0JdWludDMyX3QgZnJhbWVfc2l6ZTsKLQl1aW50MzJfdCB0aW1lc3RhbXBfbHN3OwotCXVpbnQzMl90IHRpbWVzdGFtcF9tc3c7Ci0JdWludDMyX3QgcmVzZXJ2ZWRbMTJdOwotfTsKLQotc3RydWN0IG1zbV9wbGF0X2RhdGEgewotCWludCBwZXJmX21vZGU7Ci0Jc3RydWN0IHNuZF9wY20gKnBjbTsKLX07Ci0KLSNlbmRpZiAvKl9NU01fUENNX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy1kZXZkZXAuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctZGV2ZGVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzU5NTEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy1kZXZkZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTYtMjAxNyBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgotI2luY2x1ZGUgPHNvdW5kL2RldmRlcF9wYXJhbXMuaD4KLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgiCi0jaW5jbHVkZSAibXNtLWRzMi1kYXAtY29uZmlnLmgiCi0KLSNpZmRlZiBDT05GSUdfU05EX0hXREVQCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19od2RlcF9vcGVuKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQltc21fZHMyX2RhcF91cGRhdGVfcG9ydF9wYXJhbWV0ZXJzKGh3LCBmaWxlLCB0cnVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfcmVsZWFzZShzdHJ1Y3Qgc25kX2h3ZGVwICpodywKLQkJCQkJIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCW1zbV9kczJfZGFwX3VwZGF0ZV9wb3J0X3BhcmFtZXRlcnMoaHcsIGZpbGUsIGZhbHNlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCXByX2RlYnVnKCIlczpjbWQgJXhcbiIsIF9fZnVuY19fLCBjbWQpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTToKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfR0VUX1BBUkFNOgotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9EQVBfQ09NTUFORDoKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0xJQ0VOU0U6Ci0JCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKLQkJcmV0ID0gbXNtX2RzMl9kYXBfaW9jdGwoaHcsIGZpbGUsIGNtZCwgYXJncCk7Ci0JCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSOgotCQlyZXQgPSBtc21fZHMyX2RhcF9pb2N0bChodywgZmlsZSwgY21kLCBhcmdwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHglWFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIG1zbV9wY21fcm91dGluZ19od2RlcF9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19od2RlcF9jb21wYXRfaW9jdGwoc3RydWN0IHNuZF9od2RlcCAqaHcsCi0JCQkJCSAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQotCXByX2RlYnVnKCIlczpjbWQgJXhcbiIsIF9fZnVuY19fLCBjbWQpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX1NFVF9QQVJBTTMyOgotCWNhc2UgU05EUlZfREVWREVQX0RBUF9JT0NUTF9HRVRfUEFSQU0zMjoKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0NPTU1BTkQzMjoKLQljYXNlIFNORFJWX0RFVkRFUF9EQVBfSU9DVExfREFQX0xJQ0VOU0UzMjoKLQkJbXNtX3BjbV9yb3V0aW5nX2FjcXVpcmVfbG9jaygpOwotCQlyZXQgPSBtc21fZHMyX2RhcF9jb21wYXRfaW9jdGwoaHcsIGZpbGUsIGNtZCwgYXJncCk7Ci0JCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9ERVZERVBfREFQX0lPQ1RMX0dFVF9WSVNVQUxJWkVSMzI6Ci0JCXJldCA9IG1zbV9kczJfZGFwX2NvbXBhdF9pb2N0bChodywgZmlsZSwgY21kLCBhcmdwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbnRyb2wgMHglWFxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCi0KLWludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJICAgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgKm1zbV9iZWRhaXMpCi17Ci0Jc3RydWN0IHNuZF9od2RlcCAqaHdkZXA7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnVudGltZS0+ZGFpX2xpbms7Ci0JaW50IHJjOwotCi0JaWYgKGRhaV9saW5rLT5pZCA8IDAgfHwKLQkJZGFpX2xpbmstPmlkID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlczpCRSBpZCAlZCBpbnZhbGlkIGluZGV4XG4iLAotCQkJX19mdW5jX18sIGRhaV9saW5rLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXMgQkUgaWQgJWRcbiIsIF9fZnVuY19fLCBkYWlfbGluay0+aWQpOwotCXJjID0gc25kX2h3ZGVwX25ldyhydW50aW1lLT5jYXJkLT5zbmRfY2FyZCwKLQkJCSAgIG1zbV9iZWRhaXNbZGFpX2xpbmstPmlkXS5uYW1lLAotCQkJICAgZGFpX2xpbmstPmlkLCAmaHdkZXApOwotCWlmIChod2RlcCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGh3ZGVwIGludGYgZmFpbGVkIHRvIGNyZWF0ZSAlcy0gaHdkZXAgTlVMTFxuIiwKLQkJCV9fZnVuY19fLCBtc21fYmVkYWlzW2RhaV9saW5rLT5pZF0ubmFtZSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBod2RlcCBpbnRmIGZhaWxlZCB0byBjcmVhdGUgJXMgcmMgJWRcbiIsIF9fZnVuY19fLAotCQkJbXNtX2JlZGFpc1tkYWlfbGluay0+aWRdLm5hbWUsIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWh3ZGVwLT5pZmFjZSA9IFNORFJWX0hXREVQX0lGQUNFX0FVRElPX0JFOwotCWh3ZGVwLT5wcml2YXRlX2RhdGEgPSAmbXNtX2JlZGFpc1tkYWlfbGluay0+aWRdOwotCWh3ZGVwLT5vcHMub3BlbiA9IG1zbV9wY21fcm91dGluZ19od2RlcF9vcGVuOwotCWh3ZGVwLT5vcHMuaW9jdGwgPSBtc21fcGNtX3JvdXRpbmdfaHdkZXBfaW9jdGw7Ci0JaHdkZXAtPm9wcy5yZWxlYXNlID0gbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX3JlbGVhc2U7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCWh3ZGVwLT5vcHMuaW9jdGxfY29tcGF0ID0gbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX2NvbXBhdF9pb2N0bDsKLSNlbmRpZgotCXJldHVybiByYzsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy1kZXZkZXAuaCBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctZGV2ZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5M2QwNDguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy1kZXZkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCAyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9NU01fUENNX1JPVVRJTkdfREVWREVQX0hfCi0jZGVmaW5lIF9NU01fUENNX1JPVVRJTkdfREVWREVQX0hfCi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLQotI2lmZGVmIENPTkZJR19TTkRfSFdERVAKLWludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJICAgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgKm1zbV9iZWRhaXMpOwotdm9pZCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBtc21fcGNtX3JvdXRpbmdfaHdkZXBfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lLAotCQkJCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICptc21fYmVkYWlzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbXNtX3BjbV9yb3V0aW5nX2h3ZGVwX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjgyY2UuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5OTMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2VmZmVjdHMuaD4KLSNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgotCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLWRldmRlcC5oIgotI2luY2x1ZGUgIm1zbS1xdGktcHAtY29uZmlnLmgiCi0jaW5jbHVkZSAibXNtLWR0cy1zcnMtdG0tY29uZmlnLmgiCi0jaW5jbHVkZSAibXNtLWRvbGJ5LWRhcC1jb25maWcuaCIKLSNpbmNsdWRlICJtc20tZHMyLWRhcC1jb25maWcuaCIKLSNpbmNsdWRlICJxNnZvaWNlLmgiCi0jaW5jbHVkZSAic291bmQvcTZsc20uaCIKLQotI2lmbmRlZiBDT05GSUdfRE9MQllfREFQCi0jdW5kZWYgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQKLSNkZWZpbmUgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQgMHhGRkZGRkZGRQotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX0RPTEJZX0RTMgotI3VuZGVmIERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRAotI2RlZmluZSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQgMHhGRkZGRkZGRgotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggcm91dGluZ19sb2NrOwotCi1zdGF0aWMgc3RydWN0IGNhbF90eXBlX2RhdGEgKmNhbF9kYXRhOwotCi1zdGF0aWMgaW50IGZtX3N3aXRjaF9lbmFibGU7Ci1zdGF0aWMgaW50IGhmcF9zd2l0Y2hfZW5hYmxlOwotc3RhdGljIGludCBpbnQwX21pMnNfc3dpdGNoX2VuYWJsZTsKLXN0YXRpYyBpbnQgaW50NF9taTJzX3N3aXRjaF9lbmFibGU7Ci1zdGF0aWMgaW50IHByaV9taTJzX3N3aXRjaF9lbmFibGU7Ci1zdGF0aWMgaW50IHNlY19taTJzX3N3aXRjaF9lbmFibGU7Ci1zdGF0aWMgaW50IHRlcnRfbWkyc19zd2l0Y2hfZW5hYmxlOwotc3RhdGljIGludCBxdWF0X21pMnNfc3dpdGNoX2VuYWJsZTsKLXN0YXRpYyBpbnQgZm1fcGNtcnhfc3dpdGNoX2VuYWJsZTsKLXN0YXRpYyBpbnQgdXNiX3N3aXRjaF9lbmFibGU7Ci1zdGF0aWMgaW50IGxzbV9wb3J0X2luZGV4Owotc3RhdGljIGludCBzbGltMF9yeF9hYW5jX2ZiX3BvcnQ7Ci1zdGF0aWMgaW50IG1zbV9yb3V0ZV9lY19yZWZfcng7Ci1zdGF0aWMgaW50IG1zbV9lY19yZWZfY2ggPSA0Owotc3RhdGljIGludCBtc21fZWNfcmVmX2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLXN0YXRpYyBpbnQgbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlID0gNDgwMDA7Ci1zdGF0aWMgdWludDMyX3Qgdm9jX3Nlc3Npb25faWQgPSBBTExfU0VTU0lPTl9WU0lEOwotc3RhdGljIGludCBtc21fcm91dGVfZXh0X2VjX3JlZjsKLXN0YXRpYyBib29sIGlzX2N1c3RvbV9zdGVyZW9fb247Ci1zdGF0aWMgYm9vbCBpc19kczJfb247Ci1zdGF0aWMgYm9vbCBzd2FwX2NoOwotCi0jZGVmaW5lIFdFSUdIVF8wX0RCIDB4NDAwMAotLyogYWxsIHRoZSBGRXMgd2hpY2ggY2FuIHN1cHBvcnQgY2hhbm5lbCBtaXhlciAqLwotc3RhdGljIHN0cnVjdCBtc21fcGNtX2NoYW5uZWxfbWl4ZXIgY2hhbm5lbF9taXhlcltNU01fRlJPTlRFTkRfREFJX01NX1NJWkVdOwotLyogaW5wdXQgQkUgZm9yIGVhY2ggRkUgKi8KLXN0YXRpYyBpbnQgY2hhbm5lbF9pbnB1dFtNU01fRlJPTlRFTkRfREFJX01NX1NJWkVdW0FETV9NQVhfQ0hBTk5FTFNdOwotCi1lbnVtIHsKLQlNQUROT05FLAotCU1BREFVRElPLAotCU1BREJFQUNPTiwKLQlNQURVTFRSQVNPVU5ELAotCU1BRFNXQVVESU8sCi19OwotCi0jZGVmaW5lIEFETV9MU01fUE9SVF9JTkRFWCA5Ci0KLSNkZWZpbmUgU0xJTUJVU18wX1RYX1RFWFQgIlNMSU1CVVNfMF9UWCIKLSNkZWZpbmUgU0xJTUJVU18xX1RYX1RFWFQgIlNMSU1CVVNfMV9UWCIKLSNkZWZpbmUgU0xJTUJVU18yX1RYX1RFWFQgIlNMSU1CVVNfMl9UWCIKLSNkZWZpbmUgU0xJTUJVU18zX1RYX1RFWFQgIlNMSU1CVVNfM19UWCIKLSNkZWZpbmUgU0xJTUJVU180X1RYX1RFWFQgIlNMSU1CVVNfNF9UWCIKLSNkZWZpbmUgU0xJTUJVU181X1RYX1RFWFQgIlNMSU1CVVNfNV9UWCIKLSNkZWZpbmUgVEVSVF9NSTJTX1RYX1RFWFQgIlRFUlRfTUkyU19UWCIKLSNkZWZpbmUgUVVBVF9NSTJTX1RYX1RFWFQgIlFVQVRfTUkyU19UWCIKLSNkZWZpbmUgQURNX0xTTV9UWF9URVhUICJBRE1fTFNNX1RYIgotI2RlZmluZSBJTlQzX01JMlNfVFhfVEVYVCAiSU5UM19NSTJTX1RYIgotCi0jZGVmaW5lIExTTV9GVU5DVElPTl9URVhUICJMU00gRnVuY3Rpb24iCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxzbV9wb3J0X3RleHRbXSA9IHsKLQkiTm9uZSIsCi0JU0xJTUJVU18wX1RYX1RFWFQsIFNMSU1CVVNfMV9UWF9URVhULCBTTElNQlVTXzJfVFhfVEVYVCwKLQlTTElNQlVTXzNfVFhfVEVYVCwgU0xJTUJVU180X1RYX1RFWFQsIFNMSU1CVVNfNV9UWF9URVhULAotCVRFUlRfTUkyU19UWF9URVhULCBRVUFUX01JMlNfVFhfVEVYVCwgQURNX0xTTV9UWF9URVhULAotCUlOVDNfTUkyU19UWF9URVhUCi19OwotCi1zdHJ1Y3QgbXNtX3BjbV9yb3V0ZV9iZGFpX3BwX3BhcmFtcyB7Ci0JdTE2IHBvcnRfaWQ7IC8qIEFGRSBwb3J0IElEICovCi0JdW5zaWduZWQgbG9uZyBwcF9wYXJhbXNfY29uZmlnOwotCWJvb2wgbXV0ZV9vbjsKLQlpbnQgbGF0ZW5jeTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX3BjbV9yb3V0ZV9iZGFpX3BwX3BhcmFtcwotCW1zbV9iZWRhaXNfcHBfcGFyYW1zW01TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWF0gPSB7Ci0Je0hETUlfUlgsIDAsIDAsIDB9LAotCXtESVNQTEFZX1BPUlRfUlgsIDAsIDAsIDB9LAotfTsKLQotLyoKLSAqIFRoZSBiZV9kYWlfbmFtZV90YWJsZSBpcyBwYXNzZWQgdG8gSEFMIHNvIHRoYXQgaXQgY2FuIHNwZWNpZnkgdGhlCi0gKiBCRSBJRCBmb3IgdGhlIEJFIGl0IHdhbnRzIHRvIGVuYWJsZSBiYXNlZCBvbiB0aGUgbmFtZS4gVGh1cyB0aGVyZQotICogaXMgYSBtYXRjaGluZyB0YWJsZSBhbmQgc3RydWN0dXJlIGluIEhBTCB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZAotICogaWYgYW55IGNoYW5nZXMgdG8gdGhlc2UgYXJlIG1hZGUuCi0gKi8KLXN0cnVjdCBtc21fcGNtX3JvdXRlX2JkYWlfbmFtZSB7Ci0JdW5zaWduZWQgaW50IGJlX2lkOwotCWNoYXIgYmVfbmFtZVtMUEFTU19CRV9OQU1FX01BWF9MRU5HVEhdOwotfTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3BjbV9yb3V0ZV9iZGFpX25hbWUgYmVfZGFpX25hbWVfdGFibGVbTVNNX0JBQ0tFTkRfREFJX01BWF07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfc2VuZF9kZXZpY2VfcHBfcGFyYW1zKGludCBwb3J0X2lkLCAgaW50IGNvcHBfaWR4LAotCQkJCQkgICAgIGludCBmZV9pZCk7Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X2JpdF93aWR0aCh1bnNpZ25lZCBpbnQgZm9ybWF0KQotewotCWludCBiaXRfd2lkdGg7Ci0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWJpdF93aWR0aCA9IDMyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQliaXRfd2lkdGggPSAyNDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQliaXRfd2lkdGggPSAxNjsKLQl9Ci0JcmV0dXJuIGJpdF93aWR0aDsKLX0KLQotc3RhdGljIGJvb2wgbXNtX2lzX3Jlc2FtcGxlX25lZWRlZChpbnQgaW5wdXRfc3IsIGludCBvdXRwdXRfc3IpCi17Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0JaWYgKGlucHV0X3NyICE9IG91dHB1dF9zcikKLQkJcmMgPSB0cnVlOwotCi0JcHJfZGVidWcoInBlcmZvcm0gcmVzYW1wbGluZyAoJXMpIGZvciBjb3BwIHJhdGUgKCVkKWFmZSByYXRlICglZCkiLAotCQkocmMgPyAib2ggeWVzIiA6ICJub3QgcmVhbGx5IiksCi0JCWlucHV0X3NyLCBvdXRwdXRfc3IpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRpbmdfY2ZnX3BwKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCB0b3BvbG9neSwKLQkJCQkgICBpbnQgY2hhbm5lbHMpCi17Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAodG9wb2xvZ3kpIHsKLQljYXNlIFNSU19UUlVNRURJQV9UT1BPTE9HWV9JRDoKLQkJcHJfZGVidWcoIiVzOiBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSURcbiIsIF9fZnVuY19fKTsKLQkJbXNtX2R0c19zcnNfdG1faW5pdChwb3J0X2lkLCBjb3BwX2lkeCk7Ci0JCWJyZWFrOwotCWNhc2UgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEOgotCQlwcl9kZWJ1ZygiJXM6IERTMl9BRE1fQ09QUF9UT1BPTE9HWSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEKTsKLQkJcmMgPSBtc21fZHMyX2RhcF9pbml0KHBvcnRfaWQsIGNvcHBfaWR4LCBjaGFubmVscywKLQkJCQkgICAgICBpc19jdXN0b21fc3RlcmVvX29uKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IERTMiB0b3BvX2lkIDB4JXgsIHBvcnQgJWQsIENTICVkIHJjICVkXG4iLAotCQkJCV9fZnVuY19fLCB0b3BvbG9neSwgcG9ydF9pZCwKLQkJCQlpc19jdXN0b21fc3RlcmVvX29uLCByYyk7Ci0JCWJyZWFrOwotCWNhc2UgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQ6Ci0JCWlmIChpc19kczJfb24pIHsKLQkJCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyYyA9IG1zbV9kczJfZGFwX2luaXQocG9ydF9pZCwgY29wcF9pZHgsIGNoYW5uZWxzLAotCQkJCWlzX2N1c3RvbV9zdGVyZW9fb24pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIiVzOkRTMiB0b3BvX2lkIDB4JXgsIHBvcnQgJWQsIHJjICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgdG9wb2xvZ3ksIHBvcnRfaWQsIHJjKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSURcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gbXNtX2RvbGJ5X2RhcF9pbml0KHBvcnRfaWQsIGNvcHBfaWR4LCBjaGFubmVscywKLQkJCQkJCWlzX2N1c3RvbV9zdGVyZW9fb24pOwotCQkJaWYgKHJjIDwgMCkKLQkJCQlwcl9lcnIoIiVzOiBEUzEgdG9wb19pZCAweCV4LCBwb3J0ICVkLCByYyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHRvcG9sb2d5LCBwb3J0X2lkLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBRE1fQ01EX0NPUFBfT1BFTl9UT1BPTE9HWV9JRF9BVURJT1NQSEVSRToKLQkJcHJfZGVidWcoIiVzOiBUT1BPTE9HWV9JRF9BVURJT1NQSEVSRVxuIiwgX19mdW5jX18pOwotCQlyYyA9IG1zbV9xdGlfcHBfYXNwaGVyZV9pbml0KHBvcnRfaWQsIGNvcHBfaWR4KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByX2VycigiJXM6IHRvcG9faWQgMHgleCwgcG9ydCAlZCwgY29wcCAlZCwgcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHRvcG9sb2d5LCBwb3J0X2lkLCBjb3BwX2lkeCwgcmMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBjdXN0b20gdG9wb2xvZ3kgc3BlY2lmaWMgZmVhdHVyZSBwYXJhbSBoYW5kbGVycyAqLwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9wY21fcm91dGluZ19kZWluaXRfcHAoaW50IHBvcnRfaWQsIGludCB0b3BvbG9neSkKLXsKLQlzd2l0Y2ggKHRvcG9sb2d5KSB7Ci0JY2FzZSBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQ6Ci0JCXByX2RlYnVnKCIlczogU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7Ci0JCW1zbV9kdHNfc3JzX3RtX2RlaW5pdChwb3J0X2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQ6Ci0JCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEICVkXG4iLAotCQkJIF9fZnVuY19fLCBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpOwotCQltc21fZHMyX2RhcF9kZWluaXQocG9ydF9pZCk7Ci0JCWJyZWFrOwotCWNhc2UgRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQ6Ci0JCWlmIChpc19kczJfb24pIHsKLQkJCXByX2RlYnVnKCIlczogRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fZHMyX2RhcF9kZWluaXQocG9ydF9pZCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lEXG4iLCBfX2Z1bmNfXyk7Ci0JCQltc21fZG9sYnlfZGFwX2RlaW5pdChwb3J0X2lkKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEFETV9DTURfQ09QUF9PUEVOX1RPUE9MT0dZX0lEX0FVRElPU1BIRVJFOgotCQlwcl9kZWJ1ZygiJXM6IFRPUE9MT0dZX0lEX0FVRElPU1BIRVJFXG4iLCBfX2Z1bmNfXyk7Ci0JCW1zbV9xdGlfcHBfYXNwaGVyZV9kZWluaXQocG9ydF9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGN1c3RvbSB0b3BvbG9neSBzcGVjaWZpYyBmZWF0dXJlIGRlaW5pdCBoYW5kbGVycyAqLwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9wY21fcm91dG5nX2NmZ19tYXRyaXhfbWFwX3BwKHN0cnVjdCByb3V0ZV9wYXlsb2FkIHBheWxvYWQsCi0JCQkJCSAgICAgaW50IHBhdGhfdHlwZSwgaW50IHBlcmZfbW9kZSkKLXsKLQlpbnQgaXRyID0gMCwgcmMgPSAwOwotCi0JaWYgKChwYXRoX3R5cGUgPT0gQURNX1BBVEhfUExBWUJBQ0spICYmCi0JICAgIChwZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSAmJgotCSAgICBpc19jdXN0b21fc3RlcmVvX29uKSB7Ci0JCWZvciAoaXRyID0gMDsgaXRyIDwgcGF5bG9hZC5udW1fY29wcHM7IGl0cisrKSB7Ci0JCQlpZiAoKHBheWxvYWQucG9ydF9pZFtpdHJdICE9IFNMSU1CVVNfMF9SWCkgJiYKLQkJCSAgICAocGF5bG9hZC5wb3J0X2lkW2l0cl0gIT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXJjID0gbXNtX3F0aV9wcF9zZW5kX3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NtZCgKLQkJCQlwYXlsb2FkLnBvcnRfaWRbaXRyXSwKLQkJCQlwYXlsb2FkLmNvcHBfaWR4W2l0cl0sCi0JCQkJcGF5bG9hZC5zZXNzaW9uX2lkLAotCQkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRSwKLQkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkUsCi0JCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFLAotCQkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRSk7Ci0JCQlpZiAocmMgPCAwKQotCQkJCXByX2VycigiJXM6IGVyciBzZXR0aW5nIGN1c3RvbSBzdGVyZW9cbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBTTElNQlVTX0VYVFBST0NfUlggQUZFX1BPUlRfSU5WQUxJRAotc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgbXNtX2JlZGFpc1tNU01fQkFDS0VORF9EQUlfTUFYXSA9IHsKLQl7IFBSSU1BUllfSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LCBMUEFTU19CRV9QUklfSTJTX1JYfSwKLQl7IFBSSU1BUllfSTJTX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LCBMUEFTU19CRV9QUklfSTJTX1RYfSwKLQl7IFNMSU1CVVNfMF9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18wX1JYfSwKLQl7IFNMSU1CVVNfMF9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18wX1RYfSwKLQl7IEhETUlfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sIExQQVNTX0JFX0hETUl9LAotCXsgSU5UX0JUX1NDT19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfSU5UX0JUX1NDT19SWH0sCi0JeyBJTlRfQlRfU0NPX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LCBMUEFTU19CRV9JTlRfQlRfU0NPX1RYfSwKLQl7IElOVF9GTV9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfSU5UX0ZNX1JYfSwKLQl7IElOVF9GTV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfSU5UX0ZNX1RYfSwKLQl7IFJUX1BST1hZX1BPUlRfMDAxX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfQUZFX1BDTV9SWH0sCi0JeyBSVF9QUk9YWV9QT1JUXzAwMV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0FGRV9QQ01fVFh9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9BVVhQQ01fUlh9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9BVVhQQ01fVFh9LAotCXsgVk9JQ0VfUExBWUJBQ0tfVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9WT0lDRV9QTEFZQkFDS19UWH0sCi0JeyBWT0lDRTJfUExBWUJBQ0tfVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFh9LAotCXsgVk9JQ0VfUkVDT1JEX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWH0sCi0JeyBWT0lDRV9SRUNPUkRfVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTkNBTExfUkVDT1JEX1RYfSwKLQl7IE1JMlNfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sIExQQVNTX0JFX01JMlNfUlh9LAotCXsgTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfTUkyU19UWH0sCi0JeyBTRUNPTkRBUllfSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LCBMUEFTU19CRV9TRUNfSTJTX1JYfSwKLQl7IFNMSU1CVVNfMV9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18xX1JYfSwKLQl7IFNMSU1CVVNfMV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18xX1RYfSwKLQl7IFNMSU1CVVNfMl9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18yX1JYfSwKLQl7IFNMSU1CVVNfMl9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18yX1RYfSwKLQl7IFNMSU1CVVNfM19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18zX1JYfSwKLQl7IFNMSU1CVVNfM19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU18zX1RYfSwKLQl7IFNMSU1CVVNfNF9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU180X1JYfSwKLQl7IFNMSU1CVVNfNF9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU180X1RYfSwKLQl7IFNMSU1CVVNfNV9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU181X1JYfSwKLQl7IFNMSU1CVVNfNV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU181X1RYfSwKLQl7IFNMSU1CVVNfNl9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU182X1JYfSwKLQl7IFNMSU1CVVNfNl9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU182X1RYfSwKLQl7IFNMSU1CVVNfN19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU183X1JYfSwKLQl7IFNMSU1CVVNfN19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU183X1RYfSwKLQl7IFNMSU1CVVNfOF9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU184X1JYfSwKLQl7IFNMSU1CVVNfOF9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU0xJTUJVU184X1RYfSwKLQl7IFNMSU1CVVNfRVhUUFJPQ19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwgTFBBU1NfQkVfU1RVQl9SWH0sCi0JeyBTTElNQlVTX0VYVFBST0NfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sIExQQVNTX0JFX1NUVUJfVFh9LAotCXsgU0xJTUJVU19FWFRQUk9DX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LCBMUEFTU19CRV9TVFVCXzFfVFh9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUVVBVF9NSTJTX1JYfSwKLQl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWCwgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfTUkyU19SWH0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWCwgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlgsICAgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfTUkyU19SWH0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFgsICAgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYLCAgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX01JMlNfUlh9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWCwgICAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9NSTJTX1RYfSwKLQl7IEFVRElPX1BPUlRfSURfSTJTX1JYLCAgICAgICAgICAgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0FVRElPX0kyU19SWH0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYLAkgIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfQVVYUENNX1JYfSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFgsICAgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19BVVhQQ01fVFh9LAotCXsgQUZFX1BPUlRfSURfU1BESUZfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TUERJRl9SWH0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDEsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfTUkyU19SWF9TRDF9LAotCXsgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUVVJTl9NSTJTX1JYfSwKLQl7IEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVSU5fTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWCwgICAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VOQVJZX01JMlNfVFh9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1JYXzB9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1RYXzB9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1BSSV9URE1fUlhfMX0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUFJJX1RETV9UWF8xfSwKLQl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzIsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1JYXzJ9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1BSSV9URE1fVFhfMn0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUFJJX1RETV9SWF8zfSwKLQl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzMsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1RYXzN9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1BSSV9URE1fUlhfNH0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUFJJX1RETV9UWF80fSwKLQl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzUsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1JYXzV9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1BSSV9URE1fVFhfNX0sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUFJJX1RETV9SWF82fSwKLQl7IEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzYsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9QUklfVERNX1RYXzZ9LAotCXsgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1BSSV9URE1fUlhfN30sCi0JeyBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUFJJX1RETV9UWF83fSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1JYXzB9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19URE1fVFhfMH0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzEsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1JYXzF9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VDX1RETV9UWF8xfSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19URE1fUlhfMn0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzIsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1RYXzJ9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VDX1RETV9SWF8zfSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19URE1fVFhfM30sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1JYXzR9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VDX1RETV9UWF80fSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19URE1fUlhfNX0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzUsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1RYXzV9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VDX1RETV9SWF82fSwKLQl7IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1NFQ19URE1fVFhfNn0sCi0JeyBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzcsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9TRUNfVERNX1JYXzd9LAotCXsgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfU0VDX1RETV9UWF83fSwKLQl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzB9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9URE1fVFhfMH0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzF9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzEsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX1RETV9UWF8xfSwKLQl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9URE1fUlhfMn0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzJ9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzMsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX1RETV9SWF8zfSwKLQl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9URE1fVFhfM30sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzR9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX1RETV9UWF80fSwKLQl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9URE1fUlhfNX0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1RYXzV9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzYsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX1RETV9SWF82fSwKLQl7IEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82LCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVEVSVF9URE1fVFhfNn0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1RFUlRfVERNX1JYXzd9LAotCXsgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzcsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX1RETV9UWF83fSwKLQl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUVVBVF9URE1fUlhfMH0sCi0JeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzB9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzF9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzF9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzJ9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzJ9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzN9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzN9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzR9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzR9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzV9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNSwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzV9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzZ9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNiwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzZ9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1JYXzd9LAotCXsgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNywgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfVERNX1RYXzd9LAotCXsgSU5UX0JUX0EyRFBfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTlRfQlRfQTJEUF9SWH0sCi0JeyBBRkVfUE9SVF9JRF9VU0JfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9VU0JfQVVESU9fUlh9LAotCXsgQUZFX1BPUlRfSURfVVNCX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfVVNCX0FVRElPX1RYfSwKLQl7IERJU1BMQVlfUE9SVF9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0RJU1BMQVlfUE9SVH0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX0FVWFBDTV9SWH0sCi0JeyBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9URVJUX0FVWFBDTV9UWH0sCi0JeyBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX1FVQVRfQVVYUENNX1JYfSwKLQl7IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFh9LAotCXsgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5UMF9NSTJTX1JYfSwKLQl7IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0lOVDBfTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTlQxX01JMlNfUlh9LAotCXsgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5UMV9NSTJTX1RYfSwKLQl7IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0lOVDJfTUkyU19SWH0sCi0JeyBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTlQyX01JMlNfVFh9LAotCXsgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5UM19NSTJTX1JYfSwKLQl7IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0lOVDNfTUkyU19UWH0sCi0JeyBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTlQ0X01JMlNfUlh9LAotCXsgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5UNF9NSTJTX1RYfSwKLQl7IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0lOVDVfTUkyU19SWH0sCi0JeyBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFgsIDAsIHswfSwgezB9LCAwLCAwLCAwLCAwLCB7MH0sCi0JICBMUEFTU19CRV9JTlQ1X01JMlNfVFh9LAotCXsgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYLCAwLCB7MH0sIHswfSwgMCwgMCwgMCwgMCwgezB9LAotCSAgTFBBU1NfQkVfSU5UNl9NSTJTX1JYfSwKLQl7IEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWCwgMCwgezB9LCB7MH0sIDAsIDAsIDAsIDAsIHswfSwKLQkgIExQQVNTX0JFX0lOVDZfTUkyU19UWH0sCi19OwotCi0vKiBUcmFjayBBU00gcGxheWJhY2sgJiBjYXB0dXJlIHNlc3Npb25zIG9mIERBSQotICogVHJhY2sgTFNNIGxpc3RlbiBzZXNzaW9ucwotICovCi1zdGF0aWMgc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEKLQlmZV9kYWlfbWFwW01TTV9GUk9OVEVORF9EQUlfTUFYXVsyXSA9IHsKLQkvKiBNVUxUSU1FRElBMSAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTIgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUEzICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBNCAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTUgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUE2ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBNyovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBOCAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTkgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUExMCAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTExICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBMTIgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUExMyAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTE0ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBMTUgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUExNiAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTE3ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBNVUxUSU1FRElBMTggKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIE1VTFRJTUVESUExOSAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogTVVMVElNRURJQTIwICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBDU19WT0lDRSAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogVk9JUCAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogQUZFX1JYICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBBRkVfVFggKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIFZPSUNFX1NUVUIgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIFZPTFRFICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBEVE1GX1JYICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBWT0lDRTIgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotCS8qIFFDSEFUICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBWT0xURV9TVFVCICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU00xICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU00yICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU00zICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU000ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU001ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU002ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU003ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBMU004ICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBWT0lDRTJfU1RVQiAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogVk9XTEFOICovCi0Je3swLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0sCi0JIHswLCBJTlZBTElEX1NFU1NJT04sIExFR0FDWV9QQ01fTU9ERSwge05VTEwsIE5VTEx9IH0gfSwKLQkvKiBWT0lDRU1NT0RFMSAqLwotCXt7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9LAotCSB7MCwgSU5WQUxJRF9TRVNTSU9OLCBMRUdBQ1lfUENNX01PREUsIHtOVUxMLCBOVUxMfSB9IH0sCi0JLyogVk9JQ0VNTU9ERTIgKi8KLQl7ezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSwKLQkgezAsIElOVkFMSURfU0VTU0lPTiwgTEVHQUNZX1BDTV9NT0RFLCB7TlVMTCwgTlVMTH0gfSB9LAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2Vzc2lvbl9jb3BwX21hcFtNU01fRlJPTlRFTkRfREFJX01BWF1bMl0KLQkJCQkgICAgIFtNU01fQkFDS0VORF9EQUlfTUFYXTsKLXN0YXRpYyBzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2FwcF90eXBlX2RhdGEgYXBwX3R5cGVfY2ZnW01BWF9BUFBfVFlQRVNdOwotc3RhdGljIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYXBwX3R5cGVfZGF0YSBsc21fYXBwX3R5cGVfY2ZnW01BWF9BUFBfVFlQRVNdOwotc3RhdGljIHN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcKLQlmZV9kYWlfYXBwX3R5cGVfY2ZnW01TTV9GUk9OVEVORF9EQUlfTUFYXVsyXVtNU01fQkFDS0VORF9EQUlfTUFYXTsKLQotc3RhdGljIGludCBsYXN0X2JlX2lkX2NvbmZpZ3VyZWRbTVNNX0ZST05URU5EX0RBSV9NQVhdW01BWF9TRVNTSU9OX1RZUEVTXTsKLQotLyogVGhlIGNhbGxlciBvZiB0aGlzIHNob3VsZCBhcWN1aXJlIHJvdXRpbmcgbG9jayAqLwotdm9pZCBtc21fcGNtX3JvdXRpbmdfZ2V0X2JlZGFpX2luZm8oaW50IGJlX2lkeCwKLQkJCQkgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgKmJlX2RhaSkKLXsKLQlpZiAoYmVfaWR4ID49IDAgJiYgYmVfaWR4IDwgTVNNX0JBQ0tFTkRfREFJX01BWCkKLQkJbWVtY3B5KGJlX2RhaSwgJm1zbV9iZWRhaXNbYmVfaWR4XSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSkpOwotfQotCi0vKiBUaGUgY2FsbGVyIG9mIHRoaXMgc2hvdWxkIGFxY3VpcmUgcm91dGluZyBsb2NrICovCi12b2lkIG1zbV9wY21fcm91dGluZ19nZXRfZmVkYWlfaW5mbyhpbnQgZmVfaWR4LCBpbnQgc2Vzc190eXBlLAotCQkJCSAgICBzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2ZkYWlfZGF0YSAqZmVfZGFpKQotewotCWlmICgoc2Vzc190eXBlID09IFNFU1NJT05fVFlQRV9UWCkgfHwgKHNlc3NfdHlwZSA9PSBTRVNTSU9OX1RZUEVfUlgpKQotCQltZW1jcHkoZmVfZGFpLCAmZmVfZGFpX21hcFtmZV9pZHhdW3Nlc3NfdHlwZV0sCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEpKTsKLX0KLQotdm9pZCBtc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKHZvaWQpCi17Ci0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLX0KLQotdm9pZCBtc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKHZvaWQpCi17Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KGludCBhcHBfdHlwZSkKLXsKLQlpbnQgaWR4OwotCi0JcHJfZGVidWcoIiVzOiBhcHBfdHlwZTogJWRcbiIsIF9fZnVuY19fLCBhcHBfdHlwZSk7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQVBQX1RZUEVTOyBpZHgrKykgewotCQlpZiAoYXBwX3R5cGVfY2ZnW2lkeF0uYXBwX3R5cGUgPT0gYXBwX3R5cGUpCi0JCQlyZXR1cm4gaWR4OwotCX0KLQlwcl9pbmZvKCIlczogQXBwIHR5cGUgbm90IGF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gZGVmYXVsdFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19nZXRfbHNtX2FwcF90eXBlX2lkeChpbnQgYXBwX3R5cGUpCi17Ci0JaW50IGlkeDsKLQotCXByX2RlYnVnKCIlczogYXBwX3R5cGU6ICVkXG4iLCBfX2Z1bmNfXywgYXBwX3R5cGUpOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0FQUF9UWVBFUzsgaWR4KyspIHsKLQkJaWYgKGxzbV9hcHBfdHlwZV9jZmdbaWR4XS5hcHBfdHlwZSA9PSBhcHBfdHlwZSkKLQkJCXJldHVybiBpZHg7Ci0JfQotCXByX2RlYnVnKCIlczogQXBwIHR5cGUgbm90IGF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gZGVmYXVsdFxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBpc19tbV9sc21fZmVfaWQoaW50IGZlX2lkKQotewotCWJvb2wgcmMgPSB0cnVlOwotCi0JaWYgKGZlX2lkID4gTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQgJiYKLQkJKChmZV9pZCA8IE1TTV9GUk9OVEVORF9EQUlfTFNNMSkgfHwKLQkJIChmZV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTFNNOCkpKSB7Ci0JCXJjID0gZmFsc2U7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9wY21fcm91dGluZ19yZWdfc3RyZWFtX2FwcF90eXBlX2NmZygKLQlpbnQgZmVkYWlfaWQsIGludCBzZXNzaW9uX3R5cGUsIGludCBiZV9pZCwKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnICpjZmdfZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjZmdfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IFJlY2VpdmVkIE5VTEwgcG9pbnRlciBmb3IgY2ZnX2RhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWQsIHNlc3Npb25fdHlwZSAlZCwgYmVfaWQgJWQsIGFwcF90eXBlICVkLCBhY2RiX2Rldl9pZCAlZCwgc2FtcGxlX3JhdGUgJWRcbiIsCi0JCV9fZnVuY19fLCBmZWRhaV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJY2ZnX2RhdGEtPmFwcF90eXBlLCBjZmdfZGF0YS0+YWNkYl9kZXZfaWQsCi0JCWNmZ19kYXRhLT5zYW1wbGVfcmF0ZSk7Ci0KLQlpZiAoIWlzX21tX2xzbV9mZV9pZChmZWRhaV9pZCkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBtYWNoaW5lIGRyaXZlciBJRCAlZFxuIiwKLQkJCV9fZnVuY19fLCBmZWRhaV9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHNlc3Npb25fdHlwZSAhPSBTRVNTSU9OX1RZUEVfUlggJiYKLQkJc2Vzc2lvbl90eXBlICE9IFNFU1NJT05fVFlQRV9UWCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb24gdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzZXNzaW9uX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChiZV9pZCA8IDAgfHwgYmVfaWQgPj0gTVNNX0JBQ0tFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBvdXQgb2YgYm91bmRzIGJlX2lkICVkXG4iLAotCQkJX19mdW5jX18sIGJlX2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV1bYmVfaWRdID0gKmNmZ19kYXRhOwotCi0JLyoKLQkgKiBTdG9yZSB0aGUgQkUgSUQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gc2V0IGFzIHRoZSBsYXRlc3Qgc28KLQkgKiB0aGUgZ2V0IG1peGVyIGNvbnRyb2wga25vd3Mgd2hhdCB0byByZXR1cm4uCi0JICovCi0JbGFzdF9iZV9pZF9jb25maWd1cmVkW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdID0gYmVfaWQ7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKTsKLQotLyoqCi0gKiBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcKLSAqCi0gKiBSZWNlaXZlcyBmZWRhaV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCwgYW5kIHBvcHVsYXRlcyBhcHBfdHlwZSwKLSAqIGFjZGJfZGV2X2lkLCAmIHNhbXBsZSByYXRlLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gT24gZmFpbHVyZSByZXR1cm5zCi0gKiAtRUlOVkFMIGFuZCBkb2VzIG5vdCBhbHRlciBwYXNzZWQgdmFsdWVzLgotICoKLSAqIGZlZGFpX2lkIC0gUGFzc2VkIHZhbHVlLCBmcm9udCBlbmQgSUQgZm9yIHdoaWNoIGFwcCB0eXBlIGNvbmZpZyBpcyB3YW50ZWQKLSAqIHNlc3Npb25fdHlwZSAtIFBhc3NlZCB2YWx1ZSwgc2Vzc2lvbiB0eXBlIGZvciB3aGljaCBhcHAgdHlwZSBjb25maWcKLSAqICAgICAgICAgICAgICAgIGlzIHdhbnRlZAotICogYmVfaWQgLSBSZXR1cm5lZCB2YWx1ZSwgYmFjayBlbmQgZGV2aWNlIGlkIHRoZSBhcHAgdHlwZSBjb25maWcgZGF0YSBpcyBmb3IKLSAqIGNmZ19kYXRhIC0gUmV0dXJuZWQgdmFsdWUsIGNvbmZpZ3VyYXRpb24gZGF0YSB1c2VkIGJ5IGFwcCB0eXBlIGNvbmZpZwotICovCi1pbnQgbXNtX3BjbV9yb3V0aW5nX2dldF9zdHJlYW1fYXBwX3R5cGVfY2ZnKAotCWludCBmZWRhaV9pZCwgaW50IHNlc3Npb25fdHlwZSwgaW50ICpiZWRhaV9pZCwKLQlzdHJ1Y3QgbXNtX3BjbV9zdHJlYW1fYXBwX3R5cGVfY2ZnICpjZmdfZGF0YSkKLXsKLQlpbnQgYmVfaWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoYmVkYWlfaWQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBOVUxMIHBvaW50ZXIgZm9yIGJhY2tlbmQgSURcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoY2ZnX2RhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBOVUxMIHBvaW50ZXIgc2VudCBmb3IgY2ZnX2RhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoIWlzX21tX2xzbV9mZV9pZChmZWRhaV9pZCkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBGRSBJRCAlZFxuIiwgX19mdW5jX18sIGZlZGFpX2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAoc2Vzc2lvbl90eXBlICE9IFNFU1NJT05fVFlQRV9SWCAmJgotCQkgICBzZXNzaW9uX3R5cGUgIT0gU0VTU0lPTl9UWVBFX1RYKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbiB0eXBlICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWJlX2lkID0gbGFzdF9iZV9pZF9jb25maWd1cmVkW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdOwotCWlmIChiZV9pZCA8IDAgfHwgYmVfaWQgPj0gTVNNX0JBQ0tFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIEJFIElEICVkXG4iLCBfX2Z1bmNfXywgYmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JKmJlZGFpX2lkID0gYmVfaWQ7Ci0JKmNmZ19kYXRhID0gZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXVtiZV9pZF07Ci0JcHJfZGVidWcoIiVzOiBmZWRhaV9pZCAlZCwgc2Vzc2lvbl90eXBlICVkLCBiZV9pZCAlZCwgYXBwX3R5cGUgJWQsIGFjZGJfZGV2X2lkICVkLCBzYW1wbGVfcmF0ZSAlZFxuIiwKLQkJX19mdW5jX18sIGZlZGFpX2lkLCBzZXNzaW9uX3R5cGUsICpiZWRhaV9pZCwKLQkJY2ZnX2RhdGEtPmFwcF90eXBlLCBjZmdfZGF0YS0+YWNkYl9kZXZfaWQsCi0JCWNmZ19kYXRhLT5zYW1wbGVfcmF0ZSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9wY21fcm91dGluZ19nZXRfc3RyZWFtX2FwcF90eXBlX2NmZyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKm1zbV9yb3V0aW5nX2ZpbmRfdG9wb2xvZ3lfYnlfcGF0aChpbnQgcGF0aCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJJmNhbF9kYXRhLT5jYWxfYmxvY2tzKSB7Ci0KLQkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsCi0JCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEsIGxpc3QpOwotCi0JCWlmICgoKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hZG1fdG9wICopY2FsX2Jsb2NrLT5jYWxfaW5mbykKLQkJCS0+cGF0aCA9PSBwYXRoKSB7Ci0JCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogQ2FuJ3QgZmluZCB0b3BvbG9neSBmb3IgcGF0aCAlZFxuIiwgX19mdW5jX18sIHBhdGgpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICptc21fcm91dGluZ19maW5kX3RvcG9sb2d5KGludCBwYXRoLAotCQkJCQkJCWludCBhcHBfdHlwZSwKLQkJCQkJCQlpbnQgYWNkYl9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWRtX3RvcCAqY2FsX2luZm87Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCi0JCSZjYWxfZGF0YS0+Y2FsX2Jsb2NrcykgewotCi0JCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAotCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKLQotCQljYWxfaW5mbyA9IChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWRtX3RvcCAqKQotCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbzsKLQkJaWYgKChjYWxfaW5mby0+cGF0aCA9PSBwYXRoKSAgJiYKLQkJCShjYWxfaW5mby0+YXBwX3R5cGUgPT0gYXBwX3R5cGUpICYmCi0JCQkoY2FsX2luZm8tPmFjZGJfaWQgPT0gYWNkYl9pZCkpIHsKLQkJCXJldHVybiBjYWxfYmxvY2s7Ci0JCX0KLQl9Ci0JcHJfZGVidWcoIiVzOiBDYW4ndCBmaW5kIHRvcG9sb2d5IGZvciBwYXRoICVkLCBhcHAgJWQsIGFjZGJfaWQgJWQgZGVmYXVsdGluZyB0byBzZWFyY2ggYnkgcGF0aFxuIiwKLQkJX19mdW5jX18sIHBhdGgsIGFwcF90eXBlLCBhY2RiX2lkKTsKLQlyZXR1cm4gbXNtX3JvdXRpbmdfZmluZF90b3BvbG9neV9ieV9wYXRoKHBhdGgpOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9hZG1fdG9wb2xvZ3koaW50IGZlZGFpX2lkLCBpbnQgc2Vzc2lvbl90eXBlLAotCQkJCQlpbnQgYmVfaWQpCi17Ci0JaW50IHRvcG9sb2d5ID0gTlVMTF9DT1BQX1RPUE9MT0dZOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlpbnQgYXBwX3R5cGUgPSAwLCBhY2RiX2Rldl9pZCA9IDA7Ci0KLQotCXByX2RlYnVnKCIlczogZmVkYWlfaWQgJWQsIHNlc3Npb25fdHlwZSAlZCwgYmVfaWQgJWRcbiIsCi0JICAgICAgIF9fZnVuY19fLCBmZWRhaV9pZCwgc2Vzc2lvbl90eXBlLCBiZV9pZCk7Ci0KLQlpZiAoY2FsX2RhdGEgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCi0JbXV0ZXhfbG9jaygmY2FsX2RhdGEtPmxvY2spOwotCi0JYXBwX3R5cGUgPSBmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2JlX2lkXS5hcHBfdHlwZTsKLQlhY2RiX2Rldl9pZCA9Ci0JCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV1bYmVfaWRdLmFjZGJfZGV2X2lkOwotCi0JY2FsX2Jsb2NrID0gbXNtX3JvdXRpbmdfZmluZF90b3BvbG9neShzZXNzaW9uX3R5cGUsIGFwcF90eXBlLAotCQkJCQkgICAgICBhY2RiX2Rldl9pZCk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIHVubG9jazsKLQotCXRvcG9sb2d5ID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWRtX3RvcCAqKQotCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+dG9wb2xvZ3k7Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYWxfZGF0YS0+bG9jayk7Ci1kb25lOgotCXByX2RlYnVnKCIlczogVXNpbmcgdG9wb2xvZ3kgJWRcbiIsIF9fZnVuY19fLCB0b3BvbG9neSk7Ci0JcmV0dXJuIHRvcG9sb2d5OwotfQotCi1zdGF0aWMgdWludDhfdCBpc19iZV9kYWlfZXh0cHJvYyhpbnQgYmVfZGFpKQotewotCWlmIChiZV9kYWkgPT0gTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlggfHwKLQkgICBiZV9kYWkgPT0gTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFggfHwKLQkgICBiZV9kYWkgPT0gTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfRUNfVFgpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9wY21fcm91dGluZ19idWlsZF9tYXRyaXgoaW50IGZlZGFpX2lkLCBpbnQgc2Vzc190eXBlLAotCQkJCQkgaW50IHBhdGhfdHlwZSwgaW50IHBlcmZfbW9kZSwKLQkJCQkJIHVpbnQzMl90IHBhc3N0aHJfbW9kZSkKLXsKLQlpbnQgaSwgcG9ydF90eXBlLCBqLCBudW1fY29wcHMgPSAwOwotCXN0cnVjdCByb3V0ZV9wYXlsb2FkIHBheWxvYWQ7Ci0KLQlwb3J0X3R5cGUgPSAoKHBhdGhfdHlwZSA9PSBBRE1fUEFUSF9QTEFZQkFDSyB8fAotCQkgICAgICBwYXRoX3R5cGUgPT0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWCkgPwotCQlNU01fQUZFX1BPUlRfVFlQRV9SWCA6IE1TTV9BRkVfUE9SVF9UWVBFX1RYKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNU01fQkFDS0VORF9EQUlfTUFYOyBpKyspIHsKLQkJaWYgKCFpc19iZV9kYWlfZXh0cHJvYyhpKSAmJgotCQkgICAoYWZlX2dldF9wb3J0X3R5cGUobXNtX2JlZGFpc1tpXS5wb3J0X2lkKSA9PSBwb3J0X3R5cGUpICYmCi0JCSAgIChtc21fYmVkYWlzW2ldLmFjdGl2ZSkgJiYKLQkJICAgKHRlc3RfYml0KGZlZGFpX2lkLCAmbXNtX2JlZGFpc1tpXS5mZV9zZXNzaW9uc1swXSkpKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBqKyspIHsKLQkJCQl1bnNpZ25lZCBsb25nIGNvcHAgPQotCQkJCSAgICAgIHNlc3Npb25fY29wcF9tYXBbZmVkYWlfaWRdW3Nlc3NfdHlwZV1baV07Ci0JCQkJaWYgKHRlc3RfYml0KGosICZjb3BwKSkgewotCQkJCQlwYXlsb2FkLnBvcnRfaWRbbnVtX2NvcHBzXSA9Ci0JCQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkOwotCQkJCQlwYXlsb2FkLmNvcHBfaWR4W251bV9jb3Bwc10gPSBqOwotCQkJCQlwYXlsb2FkLmFwcF90eXBlW251bV9jb3Bwc10gPQotCQkJCQkJZmVfZGFpX2FwcF90eXBlX2NmZwotCQkJCQkJCVtmZWRhaV9pZF1bc2Vzc190eXBlXVtpXQotCQkJCQkJCQkuYXBwX3R5cGU7Ci0JCQkJCXBheWxvYWQuYWNkYl9kZXZfaWRbbnVtX2NvcHBzXSA9Ci0JCQkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnCi0JCQkJCQkJW2ZlZGFpX2lkXVtzZXNzX3R5cGVdW2ldCi0JCQkJCQkJCS5hY2RiX2Rldl9pZDsKLQkJCQkJcGF5bG9hZC5zYW1wbGVfcmF0ZVtudW1fY29wcHNdID0KLQkJCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmcKLQkJCQkJCQlbZmVkYWlfaWRdW3Nlc3NfdHlwZV1baV0KLQkJCQkJCQkJLnNhbXBsZV9yYXRlOwotCQkJCQludW1fY29wcHMrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAobnVtX2NvcHBzKSB7Ci0JCXBheWxvYWQubnVtX2NvcHBzID0gbnVtX2NvcHBzOwotCQlwYXlsb2FkLnNlc3Npb25faWQgPSBmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzX3R5cGVdLnN0cm1faWQ7Ci0JCWFkbV9tYXRyaXhfbWFwKHBhdGhfdHlwZSwgcGF5bG9hZCwgcGVyZl9tb2RlLCBwYXNzdGhyX21vZGUpOwotCQltc21fcGNtX3JvdXRuZ19jZmdfbWF0cml4X21hcF9wcChwYXlsb2FkLCBwYXRoX3R5cGUsIHBlcmZfbW9kZSk7Ci0JfQotfQotCi12b2lkIG1zbV9wY21fcm91dGluZ19yZWdfcHN0aHJfc3RyZWFtKGludCBmZWRhaV9pZCwgaW50IGRzcHN0X2lkLAotCQkJCSAgICAgIGludCBzdHJlYW1fdHlwZSkKLXsKLQlpbnQgaSwgc2Vzc2lvbl90eXBlLCBwYXRoX3R5cGUsIHBvcnRfdHlwZTsKLQl1MzIgbW9kZSA9IDA7Ci0KLQlpZiAoZmVkYWlfaWQgPiBNU01fRlJPTlRFTkRfREFJX01NX01BWF9JRCkgewotCQkvKiBiYWQgSUQgYXNzaWduZWQgaW4gbWFjaGluZSBkcml2ZXIgKi8KLQkJcHJfZXJyKCIlczogYmFkIE1NIElEXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfUlg7Ci0JCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOwotCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9SWDsKLQl9IGVsc2UgewotCQlzZXNzaW9uX3R5cGUgPSBTRVNTSU9OX1RZUEVfVFg7Ci0JCXBhdGhfdHlwZSA9IEFETV9QQVRIX0xJVkVfUkVDOwotCQlwb3J0X3R5cGUgPSBNU01fQUZFX1BPUlRfVFlQRV9UWDsKLQl9Ci0KLQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCi0JZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkID0gZHNwc3RfaWQ7Ci0JZm9yIChpID0gMDsgaSA8IE1TTV9CQUNLRU5EX0RBSV9NQVg7IGkrKykgewotCQlpZiAoIWlzX2JlX2RhaV9leHRwcm9jKGkpICYmCi0JCSAgICAoYWZlX2dldF9wb3J0X3R5cGUobXNtX2JlZGFpc1tpXS5wb3J0X2lkKSA9PSBwb3J0X3R5cGUpICYmCi0JCSAgICAobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCi0JCSAgICAodGVzdF9iaXQoZmVkYWlfaWQsICZtc21fYmVkYWlzW2ldLmZlX3Nlc3Npb25zWzBdKSkpIHsKLQkJCW1vZGUgPSBhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW2ldLnBvcnRfaWQpOwotCQkJYWRtX2Nvbm5lY3RfYWZlX3BvcnQobW9kZSwgZHNwc3RfaWQsCi0JCQkJCSAgICAgbXNtX2JlZGFpc1tpXS5wb3J0X2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLX0KLQotc3RhdGljIGJvb2wgcm91dGVfY2hlY2tfZmVfaWRfYWRtX3N1cHBvcnQoaW50IGZlX2lkKQotewotCWJvb2wgcmMgPSB0cnVlOwotCi0JaWYgKChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX0xTTTEpICYmCi0JCSAoZmVfaWQgPD0gTVNNX0ZST05URU5EX0RBSV9MU004KSkgewotCQkvKiBmZSBpZCBpcyBsaXN0ZW4gd2hpbGUgcG9ydCBpcyBzZXQgdG8gYWZlICovCi0JCWlmIChsc21fcG9ydF9pbmRleCAhPSBBRE1fTFNNX1BPUlRfSU5ERVgpIHsKLQkJCXByX2RlYnVnKCIlczogZmVfaWQgJWQsIGxzbSBtdXggc2xpbSBwb3J0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBmZV9pZCwgbHNtX3BvcnRfaW5kZXgpOwotCQkJcmMgPSBmYWxzZTsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X2NvbXByX3N0cmVhbShpbnQgZmVfaWQsIGludCBwZXJmX21vZGUsCi0JCQkJCSAgaW50IGRzcHN0X2lkLCBpbnQgc3RyZWFtX3R5cGUsCi0JCQkJCSAgdWludDMyX3QgcGFzc3Rocl9tb2RlKQotewotCWludCBpLCBqLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgcG9ydF90eXBlLCB0b3BvbG9neTsKLQlpbnQgbnVtX2NvcHBzID0gMDsKLQlzdHJ1Y3Qgcm91dGVfcGF5bG9hZCBwYXlsb2FkOwotCXUzMiBjaGFubmVscywgc2FtcGxlX3JhdGU7Ci0JdTE2IGJpdF93aWR0aCA9IDE2OwotCWJvb2wgaXNfbHNtOwotCi0JcHJfZGVidWcoIiVzOmZlX2lkWyVkXSBwZXJmX21vZGVbJWRdIGlkWyVkXSBzdHJlYW1fdHlwZVslZF0gcGFzc3RbJWRdIiwKLQkJIF9fZnVuY19fLCBmZV9pZCwgcGVyZl9tb2RlLCBkc3BzdF9pZCwKLQkJIHN0cmVhbV90eXBlLCBwYXNzdGhyX21vZGUpOwotCWlmICghaXNfbW1fbHNtX2ZlX2lkKGZlX2lkKSkgewotCQkvKiBiYWQgSUQgYXNzaWduZWQgaW4gbWFjaGluZSBkcml2ZXIgKi8KLQkJcHJfZXJyKCIlczogYmFkIE1NIElEICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIXJvdXRlX2NoZWNrX2ZlX2lkX2FkbV9zdXBwb3J0KGZlX2lkKSkgewotCQkvKiBpZ25vcmUgYWRtIG9wZW4gaWYgbm90IHN1cHBvcnRlZCBmb3IgZmVfaWQgKi8KLQkJcHJfZGVidWcoIiVzOiBObyBBRE0gc3VwcG9ydCBmb3IgZmUgaWQgJWRcbiIsIF9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChzdHJlYW1fdHlwZSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQkJaWYgKHBhc3N0aHJfbW9kZSAhPSBMRUdBQ1lfUENNKQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWDsKLQkJZWxzZQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7Ci0JCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1JYOwotCX0gZWxzZSBpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQkJaWYgKChwYXNzdGhyX21vZGUgIT0gTEVHQUNZX1BDTSkgJiYgKHBhc3N0aHJfbW9kZSAhPSBMSVNURU4pKQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfQ09NUFJFU1NFRF9UWDsKLQkJZWxzZQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7Ci0JCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1RYOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBzdHJlYW1fdHlwZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlzX2xzbSA9IChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX0xTTTEpICYmCi0JCQkgKGZlX2lkIDw9IE1TTV9GUk9OVEVORF9EQUlfTFNNOCk7Ci0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQotCXBheWxvYWQubnVtX2NvcHBzID0gMDsgLyogb25seSBSWCBuZWVkcyB0byB1c2UgcGF5bG9hZCAqLwotCWZlX2RhaV9tYXBbZmVfaWRdW3Nlc3Npb25fdHlwZV0uc3RybV9pZCA9IGRzcHN0X2lkOwotCS8qIHJlLWVuYWJsZSBFUSBpZiBhY3RpdmUgKi8KLQltc21fcXRpX3BwX3NlbmRfZXFfdmFsdWVzKGZlX2lkKTsKLQlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7Ci0JCWlmICh0ZXN0X2JpdChmZV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnNbMF0pKQotCQkJbXNtX2JlZGFpc1tpXS5wYXNzdGhyX21vZGVbZmVfaWRdID0gcGFzc3Rocl9tb2RlOwotCi0JCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKLQkJCShhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW2ldLnBvcnRfaWQpID09Ci0JCQlwb3J0X3R5cGUpICYmCi0JCQkobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCi0JCQkodGVzdF9iaXQoZmVfaWQsICZtc21fYmVkYWlzW2ldLmZlX3Nlc3Npb25zWzBdKSkpIHsKLQkJCWludCBhcHBfdHlwZSwgYXBwX3R5cGVfaWR4LCBjb3BwX2lkeCwgYWNkYl9kZXZfaWQ7Ci0KLQkJCS8qCi0JCQkgKiBjaGVjayBpZiBBRE0gbmVlZHMgdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudAotCQkJICogY2hhbm5lbCBtYXBwaW5nIHRoYW4gYmFja2VuZAotCQkJICovCi0JCQlpZiAoIW1zbV9iZWRhaXNbaV0uYWRtX292ZXJyaWRlX2NoKQotCQkJCWNoYW5uZWxzID0gbXNtX2JlZGFpc1tpXS5jaGFubmVsOwotCQkJZWxzZQotCQkJCWNoYW5uZWxzID0gbXNtX2JlZGFpc1tpXS5hZG1fb3ZlcnJpZGVfY2g7Ci0KLQkJCWJpdF93aWR0aCA9IG1zbV9yb3V0aW5nX2dldF9iaXRfd2lkdGgoCi0JCQkJCQltc21fYmVkYWlzW2ldLmZvcm1hdCk7Ci0JCQlhcHBfdHlwZSA9Ci0JCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlX2lkXVtzZXNzaW9uX3R5cGVdW2ldLmFwcF90eXBlOwotCQkJaWYgKGFwcF90eXBlICYmIGlzX2xzbSkgewotCQkJCWFwcF90eXBlX2lkeCA9Ci0JCQkJbXNtX3BjbV9yb3V0aW5nX2dldF9sc21fYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKLQkJCQlzYW1wbGVfcmF0ZSA9Ci0JCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZV9pZF1bc2Vzc2lvbl90eXBlXVtpXQotCQkJCQkuc2FtcGxlX3JhdGU7Ci0JCQkJYml0X3dpZHRoID0KLQkJCQlsc21fYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOwotCQkJfSBlbHNlIGlmIChhcHBfdHlwZSkgewotCQkJCWFwcF90eXBlX2lkeCA9Ci0JCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KAotCQkJCQkJYXBwX3R5cGUpOwotCQkJCXNhbXBsZV9yYXRlID0KLQkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVfaWRdW3Nlc3Npb25fdHlwZV1baV0uc2FtcGxlX3JhdGU7Ci0JCQkJYml0X3dpZHRoID0KLQkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOwotCQkJfSBlbHNlIHsKLQkJCQlzYW1wbGVfcmF0ZSA9IG1zbV9iZWRhaXNbaV0uc2FtcGxlX3JhdGU7Ci0JCQl9Ci0JCQlhY2RiX2Rldl9pZCA9Ci0JCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlX2lkXVtzZXNzaW9uX3R5cGVdW2ldLmFjZGJfZGV2X2lkOwotCQkJdG9wb2xvZ3kgPSBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KGZlX2lkLAotCQkJCQkJCQlzZXNzaW9uX3R5cGUsCi0JCQkJCQkJCWkpOwotCQkJaWYgKChwYXNzdGhyX21vZGUgPT0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9EU0QpCi0JCQkgICAgIHx8IChwYXNzdGhyX21vZGUgPT0KLQkJCSAgICAgQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9HRU4pKQotCQkJCXRvcG9sb2d5ID0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9OT05FX1RPUE9MT0dZOwotCQkJcHJfZGVidWcoIiVzOiBCZWZvcmUgYWRtIG9wZW4gdG9wb2xvZ3kgJWRcbiIsIF9fZnVuY19fLAotCQkJCXRvcG9sb2d5KTsKLQotCQkJY29wcF9pZHggPQotCQkJCWFkbV9vcGVuKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCwKLQkJCQkJIHBhdGhfdHlwZSwgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLAotCQkJCQkgdG9wb2xvZ3ksIHBlcmZfbW9kZSwgYml0X3dpZHRoLAotCQkJCQkgYXBwX3R5cGUsIGFjZGJfZGV2X2lkKTsKLQkJCWlmICgoY29wcF9pZHggPCAwKSB8fAotCQkJCShjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCQkJcHJfZXJyKCIlczphZG0gb3BlbiBmYWlsZWQgY29wcGlkOiVkXG4iLAotCQkJCV9fZnVuY19fLCBjb3BwX2lkeCk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJcHJfZGVidWcoIiVzOiBzZXQgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAotCQkJCSBfX2Z1bmNfXywgZmVfaWQsIHNlc3Npb25fdHlwZSwgaSk7Ci0JCQlzZXRfYml0KGNvcHBfaWR4LAotCQkJCSZzZXNzaW9uX2NvcHBfbWFwW2ZlX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKLQotCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCi0JCQkJc2FtcGxlX3JhdGUsCi0JCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSkpCi0JCQkJYWRtX2NvcHBfbWZjX2NmZygKLQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSk7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgewotCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJc2Vzc2lvbl9jb3BwX21hcFtmZV9pZF1bc2Vzc2lvbl90eXBlXVtpXTsKLQkJCQlpZiAodGVzdF9iaXQoaiwgJmNvcHApKSB7Ci0JCQkJCXBheWxvYWQucG9ydF9pZFtudW1fY29wcHNdID0KLQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkOwotCQkJCQlwYXlsb2FkLmNvcHBfaWR4W251bV9jb3Bwc10gPSBqOwotCQkJCQlwYXlsb2FkLmFwcF90eXBlW251bV9jb3Bwc10gPQotCQkJCQkJZmVfZGFpX2FwcF90eXBlX2NmZwotCQkJCQkJCVtmZV9pZF1bc2Vzc2lvbl90eXBlXVtpXQotCQkJCQkJCQkuYXBwX3R5cGU7Ci0JCQkJCXBheWxvYWQuYWNkYl9kZXZfaWRbbnVtX2NvcHBzXSA9Ci0JCQkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnCi0JCQkJCQkJW2ZlX2lkXVtzZXNzaW9uX3R5cGVdW2ldCi0JCQkJCQkJCS5hY2RiX2Rldl9pZDsKLQkJCQkJcGF5bG9hZC5zYW1wbGVfcmF0ZVtudW1fY29wcHNdID0KLQkJCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmcKLQkJCQkJCQlbZmVfaWRdW3Nlc3Npb25fdHlwZV1baV0KLQkJCQkJCQkJLnNhbXBsZV9yYXRlOwotCQkJCQludW1fY29wcHMrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGFzc3Rocl9tb2RlICE9IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfRFNECi0JCQkgICAgJiYgcGFzc3Rocl9tb2RlICE9Ci0JCQkgICAgQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9HRU4pIHsKLQkJCQltc21fcm91dGluZ19zZW5kX2RldmljZV9wcF9wYXJhbXMoCi0JCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLAotCQkJCWNvcHBfaWR4LCBmZV9pZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG51bV9jb3BwcykgewotCQlwYXlsb2FkLm51bV9jb3BwcyA9IG51bV9jb3BwczsKLQkJcGF5bG9hZC5zZXNzaW9uX2lkID0gZmVfZGFpX21hcFtmZV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkOwotCQlhZG1fbWF0cml4X21hcChwYXRoX3R5cGUsIHBheWxvYWQsIHBlcmZfbW9kZSwgcGFzc3Rocl9tb2RlKTsKLQkJbXNtX3BjbV9yb3V0bmdfY2ZnX21hdHJpeF9tYXBfcHAocGF5bG9hZCwgcGF0aF90eXBlLCBwZXJmX21vZGUpOwotCX0KLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgbXNtX3BjbV9yb3V0aW5nX2dldF92b2Nfc2Vzc2lvbmlkKHUxNiB2YWwpCi17Ci0JdTMyIHNlc3Npb25faWQ7Ci0KLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRToKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRV9TRVNTSU9OX05BTUUpOwotCQlicmVhazsKLQljYXNlIE1TTV9GUk9OVEVORF9EQUlfVk9MVEU6Ci0JCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9MVEVfU0VTU0lPTl9OQU1FKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fRlJPTlRFTkRfREFJX1ZPV0xBTjoKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT1dMQU5fU0VTU0lPTl9OQU1FKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFMjoKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRTJfU0VTU0lPTl9OQU1FKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fRlJPTlRFTkRfREFJX1FDSEFUOgotCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFFDSEFUX1NFU1NJT05fTkFNRSk7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0ZST05URU5EX0RBSV9WT0lQOgotCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFZPSVBfU0VTU0lPTl9OQU1FKTsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxOgotCQlzZXNzaW9uX2lkID0gdm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFTU1PREUxX05BTUUpOwotCQlicmVhazsKLQljYXNlIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTI6Ci0JCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VNTU9ERTJfTkFNRSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNlc3Npb25faWQgPSAwOwotCX0KLQotCXByX2RlYnVnKCIlcyBzZXNzaW9uX2lkIDB4JXgiLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JcmV0dXJuIHNlc3Npb25faWQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9yb3V0aW5nX2NoYW5uZWxfbWl4ZXIoaW50IGZlX2lkLCBib29sIHBlcmZfbW9kZSwKLQkJCQlpbnQgZHNwc3RfaWQsIGludCBzdHJlYW1fdHlwZSkKLXsKLQlpbnQgY29wcF9pZHggPSAwOwotCWludCBzZXNzX3R5cGUgPSAwOwotCWludCBpID0gMCwgaiA9IDAsIGJlX2lkOwotCWludCByZXQgPSAwOwotCi0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIShjaGFubmVsX21peGVyW2ZlX2lkXS5lbmFibGUpKSB7Ci0JCXByX2RlYnVnKCIlczogY2hhbm5lbCBtaXhlciBub3QgZW5hYmxlZCBmb3IgRkUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyZWFtX3R5cGUgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJc2Vzc190eXBlID0gU0VTU0lPTl9UWVBFX1JYOwotCWVsc2UKLQkJc2Vzc190eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCi0JZm9yIChpID0gMDsgaSA8IEFETV9NQVhfQ0hBTk5FTFMgJiYgY2hhbm5lbF9pbnB1dFtmZV9pZF1baV0gPiAwOwotCQkrK2kpIHsKLQkJYmVfaWQgPSBjaGFubmVsX2lucHV0W2ZlX2lkXVtpXSAtIDE7Ci0JCWNoYW5uZWxfbWl4ZXJbZmVfaWRdLmlucHV0X2NoYW5uZWxzW2ldID0KLQkJCQkJCW1zbV9iZWRhaXNbYmVfaWRdLmNoYW5uZWw7Ci0KLQkJaWYgKChtc21fYmVkYWlzW2JlX2lkXS5hY3RpdmUpICYmCi0JCQl0ZXN0X2JpdChmZV9pZCwKLQkJCSZtc21fYmVkYWlzW2JlX2lkXS5mZV9zZXNzaW9uc1swXSkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJc2Vzc2lvbl9jb3BwX21hcFtmZV9pZF1bc2Vzc190eXBlXVtiZV9pZF07Ci0JCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBqKyspIHsKLQkJCQlpZiAodGVzdF9iaXQoaiwgJmNvcHApKSB7Ci0JCQkJCWNvcHBfaWR4ID0gajsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlwcl9kZWJ1ZygiJXM6IGZlICVkLCBiZSAlZCwgY2hhbm5lbCAlZCwgY29wcCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlmZV9pZCwgYmVfaWQsIG1zbV9iZWRhaXNbYmVfaWRdLmNoYW5uZWwsCi0JCQkJY29wcF9pZHgpOwotCQkJcmV0ID0gYWRtX3Byb2dyYW1hYmxlX2NoYW5uZWxfbWl4ZXIoCi0JCQkJCW1zbV9iZWRhaXNbYmVfaWRdLnBvcnRfaWQsCi0JCQkJCWNvcHBfaWR4LCBkc3BzdF9pZCwgc2Vzc190eXBlLAotCQkJCQljaGFubmVsX21peGVyICsgZmVfaWQsIGkpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbShpbnQgZmVkYWlfaWQsIGludCBwZXJmX21vZGUsCi0JCQkJCWludCBkc3BzdF9pZCwgaW50IHN0cmVhbV90eXBlKQotewotCWludCBpLCBqLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgcG9ydF90eXBlLCB0b3BvbG9neSwgbnVtX2NvcHBzID0gMDsKLQlzdHJ1Y3Qgcm91dGVfcGF5bG9hZCBwYXlsb2FkOwotCXUzMiBjaGFubmVscywgc2FtcGxlX3JhdGU7Ci0JdWludDE2X3QgYml0c19wZXJfc2FtcGxlID0gMTY7Ci0JdWludDMyX3QgcGFzc3Rocl9tb2RlID0gTEVHQUNZX1BDTTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChmZWRhaV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7Ci0JCS8qIGJhZCBJRCBhc3NpZ25lZCBpbiBtYWNoaW5lIGRyaXZlciAqLwotCQlwcl9lcnIoIiVzOiBiYWQgTU0gSUQgJWRcbiIsIF9fZnVuY19fLCBmZWRhaV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJlYW1fdHlwZSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7Ci0JCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1JYOwotCX0gZWxzZSB7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7Ci0JCXBvcnRfdHlwZSA9IE1TTV9BRkVfUE9SVF9UWVBFX1RYOwotCX0KLQotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0KLQlwYXlsb2FkLm51bV9jb3BwcyA9IDA7IC8qIG9ubHkgUlggbmVlZHMgdG8gdXNlIHBheWxvYWQgKi8KLQlmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLnN0cm1faWQgPSBkc3BzdF9pZDsKLQlmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLnBlcmZfbW9kZSA9IHBlcmZfbW9kZTsKLQotCS8qIHJlLWVuYWJsZSBFUSBpZiBhY3RpdmUgKi8KLQltc21fcXRpX3BwX3NlbmRfZXFfdmFsdWVzKGZlZGFpX2lkKTsKLQlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7Ci0JCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKLQkJICAgKGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCkgPT0gcG9ydF90eXBlKSAmJgotCQkgICAobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCi0JCSAgICh0ZXN0X2JpdChmZWRhaV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnNbMF0pKSkgewotCQkJaW50IGFwcF90eXBlLCBhcHBfdHlwZV9pZHgsIGNvcHBfaWR4LCBhY2RiX2Rldl9pZDsKLQkJCS8qCi0JCQkgKiBjaGVjayBpZiBBRE0gbmVlZHMgdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudAotCQkJICogY2hhbm5lbCBtYXBwaW5nIHRoYW4gYmFja2VuZAotCQkJICovCi0JCQlpZiAoIW1zbV9iZWRhaXNbaV0uYWRtX292ZXJyaWRlX2NoKQotCQkJCWNoYW5uZWxzID0gbXNtX2JlZGFpc1tpXS5jaGFubmVsOwotCQkJZWxzZQotCQkJCWNoYW5uZWxzID0gbXNtX2JlZGFpc1tpXS5hZG1fb3ZlcnJpZGVfY2g7Ci0JCQltc21fYmVkYWlzW2ldLnBhc3N0aHJfbW9kZVtmZWRhaV9pZF0gPQotCQkJCUxFR0FDWV9QQ007Ci0KLQkJCWJpdHNfcGVyX3NhbXBsZSA9IG1zbV9yb3V0aW5nX2dldF9iaXRfd2lkdGgoCi0JCQkJCQltc21fYmVkYWlzW2ldLmZvcm1hdCk7Ci0KLQkJCWFwcF90eXBlID0KLQkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV1baV0uYXBwX3R5cGU7Ci0JCQlpZiAoYXBwX3R5cGUpIHsKLQkJCQlhcHBfdHlwZV9pZHggPQotCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKLQkJCQlzYW1wbGVfcmF0ZSA9Ci0JCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXVtpXQotCQkJCQkuc2FtcGxlX3JhdGU7Ci0JCQkJYml0c19wZXJfc2FtcGxlID0KLQkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOwotCQkJfSBlbHNlCi0JCQkJc2FtcGxlX3JhdGUgPSBtc21fYmVkYWlzW2ldLnNhbXBsZV9yYXRlOwotCi0JCQlhY2RiX2Rldl9pZCA9Ci0JCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2ldCi0JCQkJLmFjZGJfZGV2X2lkOwotCQkJdG9wb2xvZ3kgPSBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KGZlZGFpX2lkLAotCQkJCQkJCQlzZXNzaW9uX3R5cGUsCi0JCQkJCQkJCWkpOwotCQkJY29wcF9pZHggPSBhZG1fb3Blbihtc21fYmVkYWlzW2ldLnBvcnRfaWQsIHBhdGhfdHlwZSwKLQkJCQkJICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdG9wb2xvZ3ksCi0JCQkJCSAgICBwZXJmX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIGFwcF90eXBlLCBhY2RiX2Rldl9pZCk7Ci0JCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKLQkJCQkoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgewotCQkJCXByX2VycigiJXM6IGFkbSBvcGVuIGZhaWxlZCBjb3BwX2lkeDolZFxuIiwKLQkJCQkJX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAotCQkJCSBfX2Z1bmNfXywgZmVkYWlfaWQsIHNlc3Npb25fdHlwZSwgaSk7Ci0JCQlzZXRfYml0KGNvcHBfaWR4LAotCQkJCSZzZXNzaW9uX2NvcHBfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKLQotCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCi0JCQkJc2FtcGxlX3JhdGUsCi0JCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSkpCi0JCQkJYWRtX2NvcHBfbWZjX2NmZygKLQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJbXNtX2JlZGFpc1tpXS5zYW1wbGVfcmF0ZSk7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgewotCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJICAgIHNlc3Npb25fY29wcF9tYXBbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV1baV07Ci0JCQkJaWYgKHRlc3RfYml0KGosICZjb3BwKSkgewotCQkJCQlwYXlsb2FkLnBvcnRfaWRbbnVtX2NvcHBzXSA9Ci0JCQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkOwotCQkJCQlwYXlsb2FkLmNvcHBfaWR4W251bV9jb3Bwc10gPSBqOwotCQkJCQlwYXlsb2FkLmFwcF90eXBlW251bV9jb3Bwc10gPQotCQkJCQkJZmVfZGFpX2FwcF90eXBlX2NmZwotCQkJCQkJCVtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXQotCQkJCQkJCVtpXS5hcHBfdHlwZTsKLQkJCQkJcGF5bG9hZC5hY2RiX2Rldl9pZFtudW1fY29wcHNdID0KLQkJCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmcKLQkJCQkJCQlbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0KLQkJCQkJCQlbaV0uYWNkYl9kZXZfaWQ7Ci0JCQkJCXBheWxvYWQuc2FtcGxlX3JhdGVbbnVtX2NvcHBzXSA9Ci0JCQkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnCi0JCQkJCQkJW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdCi0JCQkJCQkJW2ldLnNhbXBsZV9yYXRlOwotCQkJCQludW1fY29wcHMrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCi0JCQkJKG1zbV9iZWRhaXNbaV0ucGFzc3Rocl9tb2RlW2ZlZGFpX2lkXSA9PQotCQkJCUxFR0FDWV9QQ00pKQotCQkJCW1zbV9wY21fcm91dGluZ19jZmdfcHAobXNtX2JlZGFpc1tpXS5wb3J0X2lkLAotCQkJCQkJICAgICAgIGNvcHBfaWR4LCB0b3BvbG9neSwKLQkJCQkJCSAgICAgICBjaGFubmVscyk7Ci0JCX0KLQl9Ci0JaWYgKG51bV9jb3BwcykgewotCQlwYXlsb2FkLm51bV9jb3BwcyA9IG51bV9jb3BwczsKLQkJcGF5bG9hZC5zZXNzaW9uX2lkID0gZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXS5zdHJtX2lkOwotCQlhZG1fbWF0cml4X21hcChwYXRoX3R5cGUsIHBheWxvYWQsIHBlcmZfbW9kZSwgcGFzc3Rocl9tb2RlKTsKLQkJbXNtX3BjbV9yb3V0bmdfY2ZnX21hdHJpeF9tYXBfcHAocGF5bG9hZCwgcGF0aF90eXBlLCBwZXJmX21vZGUpOwotCX0KLQotCXJldCA9IG1zbV9wY21fcm91dGluZ19jaGFubmVsX21peGVyKGZlZGFpX2lkLCBwZXJmX21vZGUsCi0JCQkJZHNwc3RfaWQsIHN0cmVhbV90eXBlKTsKLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbV92MihpbnQgZmVkYWlfaWQsIGludCBwZXJmX21vZGUsCi0JCQkJICAgICAgaW50IGRzcHN0X2lkLCBpbnQgc3RyZWFtX3R5cGUsCi0JCQkJICAgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19ldnQgZXZlbnRfaW5mbykKLXsKLQlpZiAobXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfc3RyZWFtKGZlZGFpX2lkLCBwZXJmX21vZGUsIGRzcHN0X2lkLAotCQkJCSAgICAgICBzdHJlYW1fdHlwZSkpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZyBwaHkgc3RyZWFtXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJlYW1fdHlwZSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlmZV9kYWlfbWFwW2ZlZGFpX2lkXVtTRVNTSU9OX1RZUEVfUlhdLmV2ZW50X2luZm8gPSBldmVudF9pbmZvOwotCWVsc2UKLQkJZmVfZGFpX21hcFtmZWRhaV9pZF1bU0VTU0lPTl9UWVBFX1RYXS5ldmVudF9pbmZvID0gZXZlbnRfaW5mbzsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbShpbnQgZmVkYWlfaWQsIGludCBzdHJlYW1fdHlwZSkKLXsKLQlpbnQgaSwgcG9ydF90eXBlLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgdG9wb2xvZ3k7Ci0Jc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgKmZkYWk7Ci0KLQlpZiAoIWlzX21tX2xzbV9mZV9pZChmZWRhaV9pZCkpIHsKLQkJLyogYmFkIElEIGFzc2lnbmVkIGluIG1hY2hpbmUgZHJpdmVyICovCi0JCXByX2VycigiJXM6IGJhZCBNTSBJRFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHN0cmVhbV90eXBlID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcG9ydF90eXBlID0gTVNNX0FGRV9QT1JUX1RZUEVfUlg7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJcG9ydF90eXBlID0gTVNNX0FGRV9QT1JUX1RZUEVfVFg7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9UWDsKLQkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgaSsrKSB7Ci0JCWlmICghaXNfYmVfZGFpX2V4dHByb2MoaSkgJiYKLQkJICAgKGFmZV9nZXRfcG9ydF90eXBlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCkgPT0gcG9ydF90eXBlKSAmJgotCQkgICAobXNtX2JlZGFpc1tpXS5hY3RpdmUpICYmCi0JCSAgICh0ZXN0X2JpdChmZWRhaV9pZCwgJm1zbV9iZWRhaXNbaV0uZmVfc2Vzc2lvbnNbMF0pKSkgewotCQkJaW50IGlkeDsKLQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJc2Vzc2lvbl9jb3BwX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXVtpXTsKLQkJCWZkYWkgPSAmZmVfZGFpX21hcFtmZWRhaV9pZF1bc2Vzc2lvbl90eXBlXTsKLQotCQkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKQotCQkJCWlmICh0ZXN0X2JpdChpZHgsICZjb3BwKSkKLQkJCQkJYnJlYWs7Ci0KLQkJCWlmIChpZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUIHx8IGlkeCA8IDApIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGNvcHAgaWR4IGlzIGludmFsaWQsIGV4aXRpbmdcbiIsCi0JCQkJCQkJCV9fZnVuY19fKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXRvcG9sb2d5ID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeCgKLQkJCQkJbXNtX2JlZGFpc1tpXS5wb3J0X2lkLCBpZHgpOwotCQkJYWRtX2Nsb3NlKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCwgZmRhaS0+cGVyZl9tb2RlLCBpZHgpOwotCQkJcHJfZGVidWcoIiVzOmNvcHA6JWxkLGlkeCBiaXQgZmU6JWQsdHlwZTolZCxiZTolZFxuIiwKLQkJCQkgX19mdW5jX18sIGNvcHAsIGZlZGFpX2lkLCBzZXNzaW9uX3R5cGUsIGkpOwotCQkJY2xlYXJfYml0KGlkeCwKLQkJCQkgICZzZXNzaW9uX2NvcHBfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdW2ldKTsKLQkJCWlmICgodG9wb2xvZ3kgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQgfHwKLQkJCQl0b3BvbG9neSA9PSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpICYmCi0JCQkgICAgKGZkYWktPnBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpICYmCi0JCQkgICAgKG1zbV9iZWRhaXNbaV0ucGFzc3Rocl9tb2RlW2ZlZGFpX2lkXSA9PQotCQkJCQlMRUdBQ1lfUENNKSkKLQkJCQltc21fcGNtX3JvdXRpbmdfZGVpbml0X3BwKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCwKLQkJCQkJCQkgIHRvcG9sb2d5KTsKLQkJfQotCX0KLQotCWZlX2RhaV9tYXBbZmVkYWlfaWRdW3Nlc3Npb25fdHlwZV0uc3RybV9pZCA9IElOVkFMSURfU0VTU0lPTjsKLQlmZV9kYWlfbWFwW2ZlZGFpX2lkXVtzZXNzaW9uX3R5cGVdLmJlX3NyYXRlID0gMDsKLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci19Ci0KLS8qIENoZWNrIGlmIEZFL0JFIHJvdXRlIGlzIHNldCAqLwotc3RhdGljIGJvb2wgbXNtX3BjbV9yb3V0aW5nX3JvdXRlX2lzX3NldCh1MTYgYmVfaWQsIHUxNiBmZV9pZCkKLXsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQlpZiAoIWlzX21tX2xzbV9mZV9pZChmZV9pZCkpIHsKLQkJLyogcmVjaGVjayBGRSBJRCBpbiB0aGUgbWl4ZXIgY29udHJvbCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotCQlwcl9lcnIoIiVzOiBiYWQgTU0gSURcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCWlmICh0ZXN0X2JpdChmZV9pZCwgJm1zbV9iZWRhaXNbYmVfaWRdLmZlX3Nlc3Npb25zWzBdKSkKLQkJcmMgPSB0cnVlOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBtc21fcGNtX3JvdXRpbmdfcHJvY2Vzc19hdWRpbyh1MTYgcmVnLCB1MTYgdmFsLCBpbnQgc2V0KQotewotCWludCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwgdG9wb2xvZ3k7Ci0JdTMyIGNoYW5uZWxzLCBzYW1wbGVfcmF0ZTsKLQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2ZkYWlfZGF0YSAqZmRhaTsKLQl1aW50MzJfdCBwYXNzdGhyX21vZGU7Ci0JYm9vbCBpc19sc207Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlZyAleCB2YWwgJXggc2V0ICV4XG4iLCBfX2Z1bmNfXywgcmVnLCB2YWwsIHNldCk7Ci0KLQlpZiAoIWlzX21tX2xzbV9mZV9pZCh2YWwpKSB7Ci0JCS8qIHJlY2hlY2sgRkUgSUQgaW4gdGhlIG1peGVyIGNvbnRyb2wgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KLQkJcHJfZXJyKCIlczogYmFkIE1NIElEXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXJvdXRlX2NoZWNrX2ZlX2lkX2FkbV9zdXBwb3J0KHZhbCkpIHsKLQkJLyogaWdub3JlIGFkbSBvcGVuIGlmIG5vdCBzdXBwb3J0ZWQgZm9yIGZlX2lkICovCi0JCXByX2RlYnVnKCIlczogTm8gQURNIHN1cHBvcnQgZm9yIGZlIGlkICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKLQkJcmV0dXJuOwotCX0KLQotCXBhc3N0aHJfbW9kZSA9IG1zbV9iZWRhaXNbcmVnXS5wYXNzdGhyX21vZGVbdmFsXTsKLQlpZiAoYWZlX2dldF9wb3J0X3R5cGUobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQpID09Ci0JCU1TTV9BRkVfUE9SVF9UWVBFX1JYKSB7Ci0JCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQkJaWYgKHBhc3N0aHJfbW9kZSAhPSBMRUdBQ1lfUENNKQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWDsKLQkJZWxzZQotCQkJcGF0aF90eXBlID0gQURNX1BBVEhfUExBWUJBQ0s7Ci0JfSBlbHNlIHsKLQkJc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCQlpZiAocGFzc3Rocl9tb2RlICE9IExFR0FDWV9QQ00pCi0JCQlwYXRoX3R5cGUgPSBBRE1fUEFUSF9DT01QUkVTU0VEX1RYOwotCQllbHNlCi0JCQlwYXRoX3R5cGUgPSBBRE1fUEFUSF9MSVZFX1JFQzsKLQl9Ci0JaXNfbHNtID0gKHZhbCA+PSBNU01fRlJPTlRFTkRfREFJX0xTTTEpICYmCi0JCQkgKHZhbCA8PSBNU01fRlJPTlRFTkRfREFJX0xTTTgpOwotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlpZiAoc2V0KSB7Ci0JCWlmICghdGVzdF9iaXQodmFsLCAmbXNtX2JlZGFpc1tyZWddLmZlX3Nlc3Npb25zWzBdKSAmJgotCQkJKChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRV9QTEFZQkFDS19UWCkgfHwKLQkJCShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRTJfUExBWUJBQ0tfVFgpKSkKLQkJCXZvY19zdGFydF9wbGF5YmFjayhzZXQsIG1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkKTsKLQotCQlzZXRfYml0KHZhbCwgJm1zbV9iZWRhaXNbcmVnXS5mZV9zZXNzaW9uc1swXSk7Ci0JCWZkYWkgPSAmZmVfZGFpX21hcFt2YWxdW3Nlc3Npb25fdHlwZV07Ci0JCWlmIChtc21fYmVkYWlzW3JlZ10uYWN0aXZlICYmIGZkYWktPnN0cm1faWQgIT0KLQkJCUlOVkFMSURfU0VTU0lPTikgewotCQkJaW50IGFwcF90eXBlLCBhcHBfdHlwZV9pZHgsIGNvcHBfaWR4LCBhY2RiX2Rldl9pZDsKLQkJCS8qCi0JCQkgKiBjaGVjayBpZiBBRE0gbmVlZHMgdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudAotCQkJICogY2hhbm5lbCBtYXBwaW5nIHRoYW4gYmFja2VuZAotCQkJICovCi0JCQlpZiAoIW1zbV9iZWRhaXNbcmVnXS5hZG1fb3ZlcnJpZGVfY2gpCi0JCQkJY2hhbm5lbHMgPSBtc21fYmVkYWlzW3JlZ10uY2hhbm5lbDsKLQkJCWVsc2UKLQkJCQljaGFubmVscyA9IG1zbV9iZWRhaXNbcmVnXS5hZG1fb3ZlcnJpZGVfY2g7Ci0JCQlpZiAoc2Vzc2lvbl90eXBlID09IFNFU1NJT05fVFlQRV9UWCAmJgotCQkJICAgIGZkYWktPmJlX3NyYXRlICYmCi0JCQkgICAgKGZkYWktPmJlX3NyYXRlICE9IG1zbV9iZWRhaXNbcmVnXS5zYW1wbGVfcmF0ZSkpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGZsdXNoIHN0cm0gJWQgZGlmZiBCRSByYXRlc1xuIiwKLQkJCQkJX19mdW5jX18sIGZkYWktPnN0cm1faWQpOwotCi0JCQkJaWYgKGZkYWktPmV2ZW50X2luZm8uZXZlbnRfZnVuYykKLQkJCQkJZmRhaS0+ZXZlbnRfaW5mby5ldmVudF9mdW5jKAotCQkJCQkJTVNNX1BDTV9SVF9FVlRfQlVGX1JFQ0ZHLAotCQkJCQkJZmRhaS0+ZXZlbnRfaW5mby5wcml2X2RhdGEpOwotCQkJCWZkYWktPmJlX3NyYXRlID0gMDsgLyogbWlnaHQgbm90IG5lZWQgaXQgKi8KLQkJCX0KLQotCQkJYml0c19wZXJfc2FtcGxlID0gbXNtX3JvdXRpbmdfZ2V0X2JpdF93aWR0aCgKLQkJCQkJCW1zbV9iZWRhaXNbcmVnXS5mb3JtYXQpOwotCi0JCQlhcHBfdHlwZSA9Ci0JCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddLmFwcF90eXBlOwotCQkJaWYgKGFwcF90eXBlICYmIGlzX2xzbSkgewotCQkJCWFwcF90eXBlX2lkeCA9Ci0JCQkJbXNtX3BjbV9yb3V0aW5nX2dldF9sc21fYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKLQkJCQlzYW1wbGVfcmF0ZSA9Ci0JCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1t2YWxdW3Nlc3Npb25fdHlwZV1bcmVnXQotCQkJCQkuc2FtcGxlX3JhdGU7Ci0JCQkJYml0c19wZXJfc2FtcGxlID0KLQkJCQlsc21fYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOwotCQkJfSBlbHNlIGlmIChhcHBfdHlwZSkgewotCQkJCWFwcF90eXBlX2lkeCA9Ci0JCQkJbXNtX3BjbV9yb3V0aW5nX2dldF9hcHBfdHlwZV9pZHgoYXBwX3R5cGUpOwotCQkJCXNhbXBsZV9yYXRlID0KLQkJCQlmZV9kYWlfYXBwX3R5cGVfY2ZnW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddCi0JCQkJCS5zYW1wbGVfcmF0ZTsKLQkJCQliaXRzX3Blcl9zYW1wbGUgPQotCQkJCQlhcHBfdHlwZV9jZmdbYXBwX3R5cGVfaWR4XS5iaXRfd2lkdGg7Ci0JCQl9IGVsc2UKLQkJCQlzYW1wbGVfcmF0ZSA9IG1zbV9iZWRhaXNbcmVnXS5zYW1wbGVfcmF0ZTsKLQotCQkJdG9wb2xvZ3kgPSBtc21fcm91dGluZ19nZXRfYWRtX3RvcG9sb2d5KHZhbCwKLQkJCQkJCQkJc2Vzc2lvbl90eXBlLAotCQkJCQkJCQlyZWcpOwotCQkJYWNkYl9kZXZfaWQgPQotCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1t2YWxdW3Nlc3Npb25fdHlwZV1bcmVnXS5hY2RiX2Rldl9pZDsKLQkJCWNvcHBfaWR4ID0gYWRtX29wZW4obXNtX2JlZGFpc1tyZWddLnBvcnRfaWQsIHBhdGhfdHlwZSwKLQkJCQkJICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdG9wb2xvZ3ksCi0JCQkJCSAgICBmZGFpLT5wZXJmX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIGFwcF90eXBlLCBhY2RiX2Rldl9pZCk7Ci0JCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKLQkJCSAgICAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgewotCQkJCXByX2VycigiJXM6IGFkbSBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgaWR4IGJpdCBvZiBmZTolZCwgdHlwZTogJWQsIGJlOiVkXG4iLAotCQkJCSBfX2Z1bmNfXywgdmFsLCBzZXNzaW9uX3R5cGUsIHJlZyk7Ci0JCQlzZXRfYml0KGNvcHBfaWR4LAotCQkJCSZzZXNzaW9uX2NvcHBfbWFwW3ZhbF1bc2Vzc2lvbl90eXBlXVtyZWddKTsKLQotCQkJaWYgKG1zbV9pc19yZXNhbXBsZV9uZWVkZWQoCi0JCQkJc2FtcGxlX3JhdGUsCi0JCQkJbXNtX2JlZGFpc1tyZWddLnNhbXBsZV9yYXRlKSkKLQkJCQlhZG1fY29wcF9tZmNfY2ZnKAotCQkJCQltc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCW1zbV9iZWRhaXNbcmVnXS5zYW1wbGVfcmF0ZSk7Ci0KLQkJCWlmIChzZXNzaW9uX3R5cGUgPT0gU0VTU0lPTl9UWVBFX1JYICYmCi0JCQkgICAgZmRhaS0+ZXZlbnRfaW5mby5ldmVudF9mdW5jKQotCQkJCWZkYWktPmV2ZW50X2luZm8uZXZlbnRfZnVuYygKLQkJCQkJTVNNX1BDTV9SVF9FVlRfREVWU1dJVENILAotCQkJCQlmZGFpLT5ldmVudF9pbmZvLnByaXZfZGF0YSk7Ci0KLQkJCW1zbV9wY21fcm91dGluZ19idWlsZF9tYXRyaXgodmFsLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkgICAgIHBhdGhfdHlwZSwKLQkJCQkJCSAgICAgZmRhaS0+cGVyZl9tb2RlLAotCQkJCQkJICAgICBwYXNzdGhyX21vZGUpOwotCQkJaWYgKChmZGFpLT5wZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSAmJgotCQkJCShwYXNzdGhyX21vZGUgPT0gTEVHQUNZX1BDTSkpCi0JCQkJbXNtX3BjbV9yb3V0aW5nX2NmZ19wcChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwKLQkJCQkJCSAgICAgICBjb3BwX2lkeCwgdG9wb2xvZ3ksCi0JCQkJCQkgICAgICAgY2hhbm5lbHMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHRlc3RfYml0KHZhbCwgJm1zbV9iZWRhaXNbcmVnXS5mZV9zZXNzaW9uc1swXSkgJiYKLQkJCSgobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQgPT0gVk9JQ0VfUExBWUJBQ0tfVFgpIHx8Ci0JCQkobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQgPT0gVk9JQ0UyX1BMQVlCQUNLX1RYKSkpCi0JCQl2b2Nfc3RhcnRfcGxheWJhY2soc2V0LCBtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCk7Ci0JCWNsZWFyX2JpdCh2YWwsICZtc21fYmVkYWlzW3JlZ10uZmVfc2Vzc2lvbnNbMF0pOwotCQlmZGFpID0gJmZlX2RhaV9tYXBbdmFsXVtzZXNzaW9uX3R5cGVdOwotCQlpZiAobXNtX2JlZGFpc1tyZWddLmFjdGl2ZSAmJiBmZGFpLT5zdHJtX2lkICE9Ci0JCQlJTlZBTElEX1NFU1NJT04pIHsKLQkJCWludCBpZHg7Ci0JCQlpbnQgcG9ydF9pZDsKLQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJc2Vzc2lvbl9jb3BwX21hcFt2YWxdW3Nlc3Npb25fdHlwZV1bcmVnXTsKLQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykKLQkJCQlpZiAodGVzdF9iaXQoaWR4LCAmY29wcCkpCi0JCQkJCWJyZWFrOwotCi0JCQlwb3J0X2lkID0gbXNtX2JlZGFpc1tyZWddLnBvcnRfaWQ7Ci0JCQl0b3BvbG9neSA9IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfY29wcF9pZHgocG9ydF9pZCwKLQkJCQkJCQkJICAgICAgaWR4KTsKLQkJCWFkbV9jbG9zZShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgZmRhaS0+cGVyZl9tb2RlLAotCQkJCSAgaWR4KTsKLQkJCXByX2RlYnVnKCIlczogY29wcDogJWxkLCByZXNldCBpZHggYml0IGZlOiVkLCB0eXBlOiAlZCwgYmU6JWQgdG9wb2xvZ3k9MHgleFxuIiwKLQkJCQkgX19mdW5jX18sIGNvcHAsIHZhbCwgc2Vzc2lvbl90eXBlLCByZWcsCi0JCQkJIHRvcG9sb2d5KTsKLQkJCWNsZWFyX2JpdChpZHgsCi0JCQkJICAmc2Vzc2lvbl9jb3BwX21hcFt2YWxdW3Nlc3Npb25fdHlwZV1bcmVnXSk7Ci0JCQlpZiAoKHRvcG9sb2d5ID09IERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lEIHx8Ci0JCQkJdG9wb2xvZ3kgPT0gRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEKSAmJgotCQkJICAgIChmZGFpLT5wZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSAmJgotCQkJICAgIChwYXNzdGhyX21vZGUgPT0gTEVHQUNZX1BDTSkpCi0JCQkJbXNtX3BjbV9yb3V0aW5nX2RlaW5pdF9wcCgKLQkJCQkJCW1zbV9iZWRhaXNbcmVnXS5wb3J0X2lkLAotCQkJCQkJdG9wb2xvZ3kpOwotCQkJbXNtX3BjbV9yb3V0aW5nX2J1aWxkX21hdHJpeCh2YWwsIHNlc3Npb25fdHlwZSwKLQkJCQkJCSAgICAgcGF0aF90eXBlLAotCQkJCQkJICAgICBmZGFpLT5wZXJmX21vZGUsCi0JCQkJCQkgICAgIHBhc3N0aHJfbW9kZSk7Ci0JCX0KLQl9Ci0JaWYgKChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCA9PSBWT0lDRV9SRUNPUkRfUlgpCi0JCQl8fCAobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQgPT0gVk9JQ0VfUkVDT1JEX1RYKSkKLQkJdm9jX3N0YXJ0X3JlY29yZChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgc2V0LCB2b2Nfc2Vzc2lvbl9pZCk7Ci0KLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQotCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQotCWlmICh0ZXN0X2JpdChtYy0+c2hpZnQsICZtc21fYmVkYWlzW21jLT5yZWddLmZlX3Nlc3Npb25zWzBdKSkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCWVsc2UKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCi0JcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmJgotCSAgIG1zbV9wY21fcm91dGluZ19yb3V0ZV9pc19zZXQobWMtPnJlZywgbWMtPnNoaWZ0KSA9PSBmYWxzZSkgewotCQltc21fcGNtX3JvdXRpbmdfcHJvY2Vzc19hdWRpbyhtYy0+cmVnLCBtYy0+c2hpZnQsIDEpOwotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCi0JCQl1cGRhdGUpOwotCX0gZWxzZSBpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICYmCi0JCSAgbXNtX3BjbV9yb3V0aW5nX3JvdXRlX2lzX3NldChtYy0+cmVnLCBtYy0+c2hpZnQpID09IHRydWUpIHsKLQkJbXNtX3BjbV9yb3V0aW5nX3Byb2Nlc3NfYXVkaW8obWMtPnJlZywgbWMtPnNoaWZ0LCAwKTsKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJdXBkYXRlKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQotCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQotCWlmICh0ZXN0X2JpdChtYy0+c2hpZnQsICZtc21fYmVkYWlzW21jLT5yZWddLmZlX3Nlc3Npb25zWzBdKSkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCWVsc2UKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCi0JcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JCWlmIChtc21fcGNtX3JvdXRpbmdfcm91dGVfaXNfc2V0KG1jLT5yZWcsIG1jLT5zaGlmdCkgPT0gZmFsc2UpCi0JCQltc21fcGNtX3JvdXRpbmdfcHJvY2Vzc19hdWRpbyhtYy0+cmVnLCBtYy0+c2hpZnQsIDEpOwotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwKLQkJCQkJCWtjb250cm9sLCAxLCB1cGRhdGUpOwotCX0gZWxzZSBpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JCWlmIChtc21fcGNtX3JvdXRpbmdfcm91dGVfaXNfc2V0KG1jLT5yZWcsIG1jLT5zaGlmdCkgPT0gdHJ1ZSkKLQkJCW1zbV9wY21fcm91dGluZ19wcm9jZXNzX2F1ZGlvKG1jLT5yZWcsIG1jLT5zaGlmdCwgMCk7Ci0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLAotCQkJCQkJa2NvbnRyb2wsIDAsIHVwZGF0ZSk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9wY21fcm91dGluZ19wcm9jZXNzX3ZvaWNlKHUxNiByZWcsIHUxNiB2YWwsIGludCBzZXQpCi17Ci0JdTMyIHNlc3Npb25faWQgPSAwOwotCXUxNiBwYXRoX3R5cGU7Ci0Jc3RydWN0IG1lZGlhX2Zvcm1hdF9pbmZvIHZvY19iZV9tZWRpYV9mb3JtYXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlZyAleCB2YWwgJXggc2V0ICV4XG4iLCBfX2Z1bmNfXywgcmVnLCB2YWwsIHNldCk7Ci0KLQlzZXNzaW9uX2lkID0gbXNtX3BjbV9yb3V0aW5nX2dldF92b2Nfc2Vzc2lvbmlkKHZhbCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IEZFIERBSSAweCV4IHNlc3Npb25faWQgMHgleFxuIiwKLQkJX19mdW5jX18sIHZhbCwgc2Vzc2lvbl9pZCk7Ci0KLQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCi0JaWYgKHNldCkKLQkJc2V0X2JpdCh2YWwsICZtc21fYmVkYWlzW3JlZ10uZmVfc2Vzc2lvbnNbMF0pOwotCWVsc2UKLQkJY2xlYXJfYml0KHZhbCwgJm1zbV9iZWRhaXNbcmVnXS5mZV9zZXNzaW9uc1swXSk7Ci0KLQlpZiAodmFsID09IE1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCAmJgotCSAgICBhZmVfZ2V0X3BvcnRfdHlwZShtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCkgPT0KLQkJCQkJCU1TTV9BRkVfUE9SVF9UWVBFX1JYKSB7Ci0JCXByX2RlYnVnKCIlcygpOiBzZXQ9JWQgcG9ydCBpZD0weCV4IGZvciBkdG1mIGdlbmVyYXRpb25cbiIsCi0JCQkgX19mdW5jX18sIHNldCwgbXNtX2JlZGFpc1tyZWddLnBvcnRfaWQpOwotCQlhZmVfc2V0X2R0bWZfZ2VuX3J4X3BvcnRpZChtc21fYmVkYWlzW3JlZ10ucG9ydF9pZCwgc2V0KTsKLQl9Ci0KLQlpZiAoYWZlX2dldF9wb3J0X3R5cGUobXNtX2JlZGFpc1tyZWddLnBvcnRfaWQpID09Ci0JCQkJCQlNU01fQUZFX1BPUlRfVFlQRV9SWCkKLQkJcGF0aF90eXBlID0gUlhfUEFUSDsKLQllbHNlCi0JCXBhdGhfdHlwZSA9IFRYX1BBVEg7Ci0KLQlpZiAoc2V0KSB7Ci0JCWlmIChtc21fYmVkYWlzW3JlZ10uYWN0aXZlKSB7Ci0JCQl2b2Nfc2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgcGF0aF90eXBlLCAxKTsKLQotCQkJbWVtc2V0KCZ2b2NfYmVfbWVkaWFfZm9ybWF0LCAwLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWVkaWFfZm9ybWF0X2luZm8pKTsKLQotCQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5wb3J0X2lkID0gbXNtX2JlZGFpc1tyZWddLnBvcnRfaWQ7Ci0JCQl2b2NfYmVfbWVkaWFfZm9ybWF0Lm51bV9jaGFubmVscyA9Ci0JCQkJCQltc21fYmVkYWlzW3JlZ10uY2hhbm5lbDsKLQkJCXZvY19iZV9tZWRpYV9mb3JtYXQuc2FtcGxlX3JhdGUgPQotCQkJCQkJbXNtX2JlZGFpc1tyZWddLnNhbXBsZV9yYXRlOwotCQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5iaXRzX3Blcl9zYW1wbGUgPQotCQkJCQkJbXNtX2JlZGFpc1tyZWddLmZvcm1hdDsKLQkJCS8qIERlZmF1bHRpbmcgdGhpcyB0byAxIGZvciB2b2ljZSBjYWxsIHVzZWNhc2VzICovCi0JCQl2b2NfYmVfbWVkaWFfZm9ybWF0LmNoYW5uZWxfbWFwcGluZ1swXSA9IDE7Ci0KLQkJCXZvY19zZXRfZGV2aWNlX2NvbmZpZyhzZXNzaW9uX2lkLCBwYXRoX3R5cGUsCi0JCQkJCSAgICAgICZ2b2NfYmVfbWVkaWFfZm9ybWF0KTsKLQotCQkJaWYgKHZvY19nZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCBUWF9QQVRIKSAmJgotCQkJCXZvY19nZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCBSWF9QQVRIKSkKLQkJCQl2b2NfZW5hYmxlX2RldmljZShzZXNzaW9uX2lkKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlcyBCRSBpcyBub3QgYWN0aXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQl9IGVsc2UgewotCQl2b2Nfc2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgcGF0aF90eXBlLCAwKTsKLQkJdm9jX2Rpc2FibGVfZGV2aWNlKHNlc3Npb25faWQpOwotCX0KLQotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCi0JaWYgKHRlc3RfYml0KG1jLT5zaGlmdCwgJm1zbV9iZWRhaXNbbWMtPnJlZ10uZmVfc2Vzc2lvbnNbMF0pKQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0JZWxzZQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0KLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlZyAleCBzaGlmdCAleCB2YWwgJWxkXG4iLCBfX2Z1bmNfXywgbWMtPnJlZywgbWMtPnNoaWZ0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JCW1zbV9wY21fcm91dGluZ19wcm9jZXNzX3ZvaWNlKG1jLT5yZWcsIG1jLT5zaGlmdCwgMSk7Ci0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMSwKLQkJCQkJCXVwZGF0ZSk7Ci0JfSBlbHNlIHsKLQkJbXNtX3BjbV9yb3V0aW5nX3Byb2Nlc3Nfdm9pY2UobWMtPnJlZywgbWMtPnNoaWZ0LCAwKTsKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJCQkJdXBkYXRlKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0KLQlpZiAodGVzdF9iaXQobWMtPnNoaWZ0LCAmbXNtX2JlZGFpc1ttYy0+cmVnXS5mZV9zZXNzaW9uc1swXSkpCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQllbHNlCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQotCXByX2RlYnVnKCIlczogcmVnICV4IHNoaWZ0ICV4IHZhbCAlbGRcbiIsIF9fZnVuY19fLCBtYy0+cmVnLCBtYy0+c2hpZnQsCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCQlzZXRfYml0KG1jLT5zaGlmdCwgJm1zbV9iZWRhaXNbbWMtPnJlZ10uZmVfc2Vzc2lvbnNbMF0pOwotCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0KLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAxLAotCQkJCQkJdXBkYXRlKTsKLQl9IGVsc2UgewotCQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCQljbGVhcl9iaXQobWMtPnNoaWZ0LCAmbXNtX2JlZGFpc1ttYy0+cmVnXS5mZV9zZXNzaW9uc1swXSk7Ci0JCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDAsCi0JCQkJCQl1cGRhdGUpOwotCX0KLQotCXByX2RlYnVnKCIlczogcmVnICV4IHNoaWZ0ICV4IHZhbCAlbGRcbiIsIF9fZnVuY19fLCBtYy0+cmVnLCBtYy0+c2hpZnQsCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAxOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBtYXBwaW5nIGJldHdlZW4gcG9ydCBJRCBhbmQgYmFja2VuZCBJRCB0byBlbmFibGUgdGhlIEFGRSBjYWxsYmFjawotICogdG8gZGV0ZXJtaW5lIHRoZSBhY2RiX2Rldl9pZCBmcm9tIHRoZSBwb3J0IGlkCi0gKi8KLWludCBtc21fcGNtX2dldF9iZV9pZF9mcm9tX3BvcnRfaWQoaW50IHBvcnRfaWQpCi17Ci0JaW50IGk7Ci0JaW50IGJlX2lkID0gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7IGkgPCBNU01fQkFDS0VORF9EQUlfTUFYOyBpKyspIHsKLQkJaWYgKG1zbV9iZWRhaXNbaV0ucG9ydF9pZCA9PSBwb3J0X2lkKSB7Ci0JCQliZV9pZCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBiZV9pZDsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCBkZXZfYWNkYl9pZCBnaXZlbiBhIHBvcnQgSUQgdG8gZW5hYmxlIGlkZW50aWZ5aW5nIHRoZQotICogY29ycmVjdCBBRkUgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gYnkgY29tcGFyaW5nIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgbXNtX3BjbV9nZXRfZGV2X2FjZGJfaWRfYnlfcG9ydF9pZChpbnQgcG9ydF9pZCkKLXsKLQlpbnQgYWNkYl9pZCA9IC1FSU5WQUw7Ci0JaW50IGkgPSAwOwotCWludCBzZXNzaW9uOwotCWludCBwb3J0X3R5cGUgPSBhZmVfZ2V0X3BvcnRfdHlwZShwb3J0X2lkKTsKLQlpbnQgYmVfaWQgPSBtc21fcGNtX2dldF9iZV9pZF9mcm9tX3BvcnRfaWQocG9ydF9pZCk7Ci0KLQlwcl9kZWJ1ZygiJXM6cG9ydF9pZCAlZCBiZV9pZCAlZCwgcG9ydF90eXBlIDB4JXhcbiIsCi0JCSAgX19mdW5jX18sIHBvcnRfaWQsIGJlX2lkLCBwb3J0X3R5cGUpOwotCi0JaWYgKHBvcnRfdHlwZSA9PSBNU01fQUZFX1BPUlRfVFlQRV9UWCkgewotCQlzZXNzaW9uID0gU0VTU0lPTl9UWVBFX1RYOwotCX0gZWxzZSBpZiAocG9ydF90eXBlID09IE1TTV9BRkVfUE9SVF9UWVBFX1JYKSB7Ci0JCXNlc3Npb24gPSBTRVNTSU9OX1RZUEVfUlg7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IHR5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X3R5cGUpOwotCQlhY2RiX2lkID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChiZV9pZCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgZ2V0dGluZyBiYWNrZW5kIGlkICVkXG4iLCBfX2Z1bmNfXywgYmVfaWQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlpID0gZmluZF9maXJzdF9iaXQoJm1zbV9iZWRhaXNbYmVfaWRdLmZlX3Nlc3Npb25zWzBdLAotCQkJICAgTVNNX0ZST05URU5EX0RBSV9NQVgpOwotCWlmIChpIDwgTVNNX0ZST05URU5EX0RBSV9NQVgpCi0JCWFjZGJfaWQgPSBmZV9kYWlfYXBwX3R5cGVfY2ZnW2ldW3Nlc3Npb25dW2JlX2lkXS5hY2RiX2Rldl9pZDsKLQotCXByX2RlYnVnKCIlczogRkVbJWRdIHNlc3Npb25bJWRdIEJFWyVkXSBhY2RiX2lkKCVkKVxuIiwKLQkJIF9fZnVuY19fLCBpLCBzZXNzaW9uLCBiZV9pZCwgYWNkYl9pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotZXhpdDoKLQlyZXR1cm4gYWNkYl9pZDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZm1fc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IEZNIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBGTSBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCi0JCQkJCQl1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJCQkJdXBkYXRlKTsKLQlmbV9zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X2hmcF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoZnBfc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IEhGUCBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfaGZwX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IEhGUCBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsCi0JCQkJCQkxLCB1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAotCQkJCQkJMCwgdXBkYXRlKTsKLQloZnBfc3dpdGNoX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9pbnQwX21pMnNfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaW50MF9taTJzX3N3aXRjaF9lbmFibGU7Ci0JcHJfZGVidWcoIiVzOiBJTlQwIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2ludDBfbWkyc19zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBJTlQwIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAxLAotCQkJCQkJdXBkYXRlKTsKLQllbHNlCi0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMCwKLQkJCQkJCXVwZGF0ZSk7Ci0JaW50MF9taTJzX3N3aXRjaF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfaW50NF9taTJzX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGludDRfbWkyc19zd2l0Y2hfZW5hYmxlOwotCXByX2RlYnVnKCIlczogSU5UNCBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9pbnQ0X21pMnNfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3VwZGF0ZSAqdXBkYXRlID0gTlVMTDsKLQotCXByX2RlYnVnKCIlczogSU5UNCBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCi0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMSwKLQkJCQkJCXVwZGF0ZSk7Ci0JZWxzZQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDAsCi0JCQkJCQl1cGRhdGUpOwotCWludDRfbWkyc19zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3VzYl9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB1c2Jfc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IEhGUCBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfdXNiX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IFVTQiBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsCi0JCQkJCQkxLCB1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAotCQkJCQkJMCwgdXBkYXRlKTsKLQl1c2Jfc3dpdGNoX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9wcmlfbWkyc19zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcmlfbWkyc19zd2l0Y2hfZW5hYmxlOwotCXByX2RlYnVnKCIlczogUFJJIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3ByaV9taTJzX3N3aXRjaF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IFBSSSBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCi0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMSwKLQkJCQkJCXVwZGF0ZSk7Ci0JZWxzZQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDAsCi0JCQkJCQl1cGRhdGUpOwotCXByaV9taTJzX3N3aXRjaF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfc2VjX21pMnNfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2VjX21pMnNfc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IFNFQyBNSTJTIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9zZWNfbWkyc19zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBTRUMgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCi0JCQkJCQl1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJCQkJdXBkYXRlKTsKLQlzZWNfbWkyc19zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3RlcnRfbWkyc19zd2l0Y2hfbWl4ZXIoCi0JCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB0ZXJ0X21pMnNfc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IFRFUlQgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfdGVydF9taTJzX3N3aXRjaF9taXhlcigKLQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0KLQkJc25kX3NvY19kYXBtX2tjb250cm9sX3dpZGdldChrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IFRFUlQgTUkyUyBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCi0JCQkJCQl1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJCQkJdXBkYXRlKTsKLQl0ZXJ0X21pMnNfc3dpdGNoX2VuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9xdWF0X21pMnNfc3dpdGNoX21peGVyKAotCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcXVhdF9taTJzX3N3aXRjaF9lbmFibGU7Ci0JcHJfZGVidWcoIiVzOiBRVUFUIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3F1YXRfbWkyc19zd2l0Y2hfbWl4ZXIoCi0JCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBRVUFUIE1JMlMgU3dpdGNoIGVuYWJsZSAlbGRcbiIsIF9fZnVuY19fLAotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAxLAotCQkJCQkJdXBkYXRlKTsKLQllbHNlCi0JCXNuZF9zb2NfZGFwbV9taXhlcl91cGRhdGVfcG93ZXIod2lkZ2V0LT5kYXBtLCBrY29udHJvbCwgMCwKLQkJCQkJCXVwZGF0ZSk7Ci0JcXVhdF9taTJzX3N3aXRjaF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfZm1fcGNtcnhfc3dpdGNoX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZm1fcGNtcnhfc3dpdGNoX2VuYWJsZTsKLQlwcl9kZWJ1ZygiJXM6IEZNIFN3aXRjaCBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3B1dF9mbV9wY21yeF9zd2l0Y2hfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fdXBkYXRlICp1cGRhdGUgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBGTSBTd2l0Y2ggZW5hYmxlICVsZFxuIiwgX19mdW5jX18sCi0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIDEsCi0JCQkJCQl1cGRhdGUpOwotCWVsc2UKLQkJc25kX3NvY19kYXBtX21peGVyX3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLCAwLAotCQkJCQkJdXBkYXRlKTsKLQlmbV9wY21yeF9zd2l0Y2hfZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbHNtX3BvcnRfaW5kZXg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfbHNtX3BvcnRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgbXV4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlpbnQgbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNV9UWDsKLQotCWlmIChtdXggPj0gZS0+aXRlbXMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBtdXggdmFsdWUgJWRcbiIsIF9fZnVuY19fLCBtdXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IExTTSBlbmFibGUgJWxkXG4iLCBfX2Z1bmNfXywKLQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAxOgotCQlsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8wX1RYOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWxzbV9wb3J0ID0gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzFfVFg7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMl9UWDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8zX1RYOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCWxzbV9wb3J0ID0gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzRfVFg7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNV9UWDsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQlsc21fcG9ydCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJbHNtX3BvcnQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7Ci0JCWJyZWFrOwotCWNhc2UgOToKLQkJbHNtX3BvcnQgPSBBRE1fTFNNX1BPUlRfSUQ7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCWxzbV9wb3J0ID0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIkRlZmF1bHQgbHNtIHBvcnQiKTsKLQkJYnJlYWs7Ci0JfQotCXNldF9sc21fcG9ydChsc21fcG9ydCk7Ci0JbHNtX3BvcnRfaW5kZXggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGk7Ci0JdTE2IHBvcnRfaWQ7Ci0JZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHNtX3BvcnRfdGV4dCk7IGkrKykKLQkJaWYgKCFzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCBsc21fcG9ydF90ZXh0W2ldLAotCQkJICAgIHN0cmxlbihsc21fcG9ydF90ZXh0W2ldKSkpCi0JCQlicmVhazsKLQotCWlmIChpLS0gPT0gQVJSQVlfU0laRShsc21fcG9ydF90ZXh0KSkgewotCQlXQVJOKDEsICJJbnZhbGlkIGlkIG5hbWUgJXNcbiIsIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcG9ydF9pZCA9IGkgKiAyICsgMSArIFNMSU1CVVNfMF9SWDsKLQotCS8qQ2hlY2sgZm9yIFRlcnRpYXJ5L1F1YXRlcm5hcnkvSU5UMyBUWCBwb3J0Ki8KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgbHNtX3BvcnRfdGV4dFs3XSwKLQkJCXN0cmxlbihsc21fcG9ydF90ZXh0WzddKSkpCi0JCXBvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsIGxzbV9wb3J0X3RleHRbOF0sCi0JCQlzdHJsZW4obHNtX3BvcnRfdGV4dFs4XSkpKQotCQlwb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsIGxzbV9wb3J0X3RleHRbMTBdLAotCQkJc3RybGVuKGxzbV9wb3J0X3RleHRbMTBdKSkpCi0JCXBvcnRfaWQgPSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg7Ci0KLQltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAotCQkgbWFkX3R5cGUpOwotCXN3aXRjaCAobWFkX3R5cGUpIHsKLQljYXNlIE1BRF9IV19OT05FOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRE5PTkU7Ci0JCWJyZWFrOwotCWNhc2UgTUFEX0hXX0FVRElPOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BREFVRElPOwotCQlicmVhazsKLQljYXNlIE1BRF9IV19CRUFDT046Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gTUFEQkVBQ09OOwotCQlicmVhazsKLQljYXNlIE1BRF9IV19VTFRSQVNPVU5EOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRFVMVFJBU09VTkQ7Ci0JCWJyZWFrOwotCWNhc2UgTUFEX1NXX0FVRElPOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IE1BRFNXQVVESU87Ci0JYnJlYWs7Ci0JZGVmYXVsdDoKLQkJV0FSTigxLCAiVW5rbm93blxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19sc21fZnVuY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpOwotCXUxNiBwb3J0X2lkOwotCWVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxzbV9wb3J0X3RleHQpOyBpKyspCi0JCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCBsc21fcG9ydF90ZXh0W2ldLAotCQkJICAgIHN0cmxlbihsc21fcG9ydF90ZXh0W2ldKSkpCi0JCQlicmVhazsKLQotCWlmIChpLS0gPT0gQVJSQVlfU0laRShsc21fcG9ydF90ZXh0KSkgewotCQlXQVJOKDEsICJJbnZhbGlkIGlkIG5hbWUgJXNcbiIsIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcG9ydF9pZCA9IGkgKiAyICsgMSArIFNMSU1CVVNfMF9SWDsKLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSBNQUROT05FOgotCQltYWRfdHlwZSA9IE1BRF9IV19OT05FOwotCQlicmVhazsKLQljYXNlIE1BREFVRElPOgotCQltYWRfdHlwZSA9IE1BRF9IV19BVURJTzsKLQkJYnJlYWs7Ci0JY2FzZSBNQURCRUFDT046Ci0JCW1hZF90eXBlID0gTUFEX0hXX0JFQUNPTjsKLQkJYnJlYWs7Ci0JY2FzZSBNQURVTFRSQVNPVU5EOgotCQltYWRfdHlwZSA9IE1BRF9IV19VTFRSQVNPVU5EOwotCQlicmVhazsKLQljYXNlIE1BRFNXQVVESU86Ci0JCW1hZF90eXBlID0gTUFEX1NXX0FVRElPOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQVJOKDEsICJVbmtub3duXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLypDaGVjayBmb3IgVGVydGlhcnkvUXVhdGVybmFyeS9JTlQzIFRYIHBvcnQqLwotCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCBsc21fcG9ydF90ZXh0WzddLAotCQkJc3RybGVuKGxzbV9wb3J0X3RleHRbN10pKSkKLQkJcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgbHNtX3BvcnRfdGV4dFs4XSwKLQkJCXN0cmxlbihsc21fcG9ydF90ZXh0WzhdKSkpCi0JCXBvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgbHNtX3BvcnRfdGV4dFsxMF0sCi0JCQlzdHJsZW4obHNtX3BvcnRfdGV4dFsxMF0pKSkKLQkJcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4LCBtYWRfdHlwZSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsCi0JCSBtYWRfdHlwZSk7Ci0JcmV0dXJuIGFmZV9wb3J0X3NldF9tYWRfdHlwZShwb3J0X2lkLCBtYWRfdHlwZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhZG1fb3ZlcnJpZGVfY2hzX3RleHRbXSA9IHsiWmVybyIsICJPbmUiLCAiVHdvIn07Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV83X3J4X2FkbV9vdmVycmlkZV9jaHMsCi0JCQkJYWRtX292ZXJyaWRlX2Noc190ZXh0KTsKLQotc3RhdGljIGludCBtc21fcm91dGluZ19hZG1fZ2V0X2JhY2tlbmRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBiYWNrZW5kX2lkOwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNN19SWCIsIHNpemVvZigiU0xJTTdfUlgiKSkpIHsKLQkJYmFja2VuZF9pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlg7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgYmFja2VuZCBpZDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGJhY2tlbmRfaWQ7Ci19Ci1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2FkbV9jaGFubmVsX2NvbmZpZ19nZXQoCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgYmFja2VuZF9pZCA9IG1zbV9yb3V0aW5nX2FkbV9nZXRfYmFja2VuZF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGJhY2tlbmRfaWQgPj0gMCkgewotCQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCQkgbXNtX2JlZGFpc1tiYWNrZW5kX2lkXS5hZG1fb3ZlcnJpZGVfY2g7Ci0JCXByX2RlYnVnKCIlczogYWRtIGNoYW5uZWwgY291bnQgJWxkIGZvciBCRTolZFxuIiwgX19mdW5jX18sCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sIGJhY2tlbmRfaWQpOwotCQkgbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2FkbV9jaGFubmVsX2NvbmZpZ19wdXQoCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgYmFja2VuZF9pZCA9IG1zbV9yb3V0aW5nX2FkbV9nZXRfYmFja2VuZF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGJhY2tlbmRfaWQgPj0gMCkgewotCQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCQltc21fYmVkYWlzW2JhY2tlbmRfaWRdLmFkbV9vdmVycmlkZV9jaCA9Ci0JCQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCQlwcl9kZWJ1ZygiJXM6dXBkYXRpbmcgQkUgOiVkICBhZG0gY2hhbm5lbHM6ICVkXG4iLAotCQkJICBfX2Z1bmNfXywgYmFja2VuZF9pZCwKLQkJCSAgbXNtX2JlZGFpc1tiYWNrZW5kX2lkXS5hZG1fb3ZlcnJpZGVfY2gpOwotCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZG1fY2hhbm5lbF9jb25maWdfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIlNMSU03X1JYIEFETSBDaGFubmVscyIsIHNsaW1fN19yeF9hZG1fb3ZlcnJpZGVfY2hzLAotCQkJbXNtX3JvdXRpbmdfYWRtX2NoYW5uZWxfY29uZmlnX2dldCwKLQkJCW1zbV9yb3V0aW5nX2FkbV9jaGFubmVsX2NvbmZpZ19wdXQpLAotfTsKLQotc3RhdGljIGludCBtc21fcm91dGluZ19zbGltXzBfcnhfYWFuY19tdXhfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHNsaW0wX3J4X2FhbmNfZmJfcG9ydDsKLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JcHJfZGVidWcoIiVzOiBBQU5DIE11eCBQb3J0ICVsZFxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfc2xpbV8wX3J4X2FhbmNfbXV4X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgYWFuY19kYXRhIGFhbmNfaW5mbzsKLQotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0JbWVtc2V0KCZhYW5jX2luZm8sIDB4MDAsIHNpemVvZihhYW5jX2luZm8pKTsKLQlwcl9kZWJ1ZygiJXM6IEFBTkMgTXV4IFBvcnQgJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXNsaW0wX3J4X2FhbmNfZmJfcG9ydCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9PSAwKSB7Ci0JCWFhbmNfaW5mby5hYW5jX2FjdGl2ZSA9IGZhbHNlOwotCQlhYW5jX2luZm8uYWFuY190eF9wb3J0ID0gMDsKLQkJYWFuY19pbmZvLmFhbmNfcnhfcG9ydCA9IDA7Ci0JfSBlbHNlIHsKLQkJYWFuY19pbmZvLmFhbmNfYWN0aXZlID0gdHJ1ZTsKLQkJYWFuY19pbmZvLmFhbmNfcnhfcG9ydCA9IFNMSU1CVVNfMF9SWDsKLQkJYWFuY19pbmZvLmFhbmNfdHhfcG9ydCA9Ci0JCQkoU0xJTUJVU18wX1JYIC0gMSArIChzbGltMF9yeF9hYW5jX2ZiX3BvcnQgKiAyKSk7Ci0JfQotCWFmZV9zZXRfYWFuY19pbmZvKCZhYW5jX2luZm8pOwotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQlyZXR1cm4gMDsKLX07Ci1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSAwLCBzaGlmdCA9IDA7Ci0Jc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9Ci0JKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCi0JaWR4ID0gbWMtPnNoaWZ0LyhzaXplb2YobXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X3Nlc3Npb25zWzBdKSAqIDgpOwotCXNoaWZ0ID0gbWMtPnNoaWZ0JShzaXplb2YobXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X3Nlc3Npb25zWzBdKSAqIDgpOwotCi0JaWYgKGlkeCA+PSBCRV9EQUlfUE9SVF9TRVNTSU9OU19JRFhfTUFYKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgaWR4ID0gJWRcbiIsIF9fZnVuY19fLCBpZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoc2hpZnQsCi0JCSh1bnNpZ25lZCBsb25nICopJm1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9zZXNzaW9uc1tpZHhdKSkKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCWVsc2UKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCi0JcHJfZGVidWcoIiVzOiByZWcgJXggc2hpZnQgJXggdmFsICVsZFxuIiwgX19mdW5jX18sIG1jLT5yZWcsIG1jLT5zaGlmdCwKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfcG9ydF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gMCwgc2hpZnQgPSAwOwotCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQotCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQlpZHggPSBtYy0+c2hpZnQvKHNpemVvZihtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfc2Vzc2lvbnNbMF0pICogOCk7Ci0Jc2hpZnQgPSBtYy0+c2hpZnQlKHNpemVvZihtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfc2Vzc2lvbnNbMF0pICogOCk7Ci0KLQlpZiAoaWR4ID49IEJFX0RBSV9QT1JUX1NFU1NJT05TX0lEWF9NQVgpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBpZHggPSAlZFxuIiwgX19mdW5jX18sIGlkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogcmVnIDB4JXggc2hpZnQgMHgleCB2YWwgJWxkIGlkeCAlZCByZW1pbmRlciBzaGlmdCAlZFxuIiwKLQkJIF9fZnVuY19fLCBtYy0+cmVnLCBtYy0+c2hpZnQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwgaWR4LCBzaGlmdCk7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQkJYWZlX2xvb3BiYWNrKDEsIG1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9pZCwKLQkJCSAgICBtc21fYmVkYWlzW21jLT5zaGlmdF0ucG9ydF9pZCk7Ci0JCXNldF9iaXQoc2hpZnQsCi0JCSh1bnNpZ25lZCBsb25nICopJm1zbV9iZWRhaXNbbWMtPnJlZ10ucG9ydF9zZXNzaW9uc1tpZHhdKTsKLQl9IGVsc2UgewotCQlhZmVfbG9vcGJhY2soMCwgbXNtX2JlZGFpc1ttYy0+cmVnXS5wb3J0X2lkLAotCQkJICAgIG1zbV9iZWRhaXNbbWMtPnNoaWZ0XS5wb3J0X2lkKTsKLQkJY2xlYXJfYml0KHNoaWZ0LAotCQkodW5zaWduZWQgbG9uZyAqKSZtc21fYmVkYWlzW21jLT5yZWddLnBvcnRfc2Vzc2lvbnNbaWR4XSk7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9nZXRfY2hhbm5lbF9ydWxlX2luZGV4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1MTYgZmVfaWQgPSAwOwotCi0JZmVfaWQgPSAoKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlpZiAoZmVfaWQgPj0gTVNNX0ZST05URU5EX0RBSV9NTV9TSVpFKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgRkUgJWRcbiIsIF9fZnVuY19fLCBmZV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY2hhbm5lbF9taXhlcltmZV9pZF0ucnVsZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcHV0X2NoYW5uZWxfcnVsZV9pbmRleChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTE2IGZlX2lkID0gMDsKLQotCWZlX2lkID0gKChzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKikKLQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljaGFubmVsX21peGVyW2ZlX2lkXS5ydWxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2dldF9vdXRfY2hzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXUxNiBmZV9pZCA9IDA7Ci0KLQlmZV9pZCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBGRSAlZFxuIiwgX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQljaGFubmVsX21peGVyW2ZlX2lkXS5vdXRwdXRfY2hhbm5lbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3B1dF9vdXRfY2hzKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXUxNiBmZV9pZCA9IDA7Ci0KLQlmZV9pZCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBGRSAlZFxuIiwgX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBmZV9pZCBpcyAlZCwgb3V0cHV0IGNoYW5uZWxzID0gJWRcbiIsIF9fZnVuY19fLAotCQkJZmVfaWQsCi0JCQkodW5zaWduZWQgaW50KSh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkpOwotCWNoYW5uZWxfbWl4ZXJbZmVfaWRdLm91dHB1dF9jaGFubmVsID0KLQkJCSh1bnNpZ25lZCBpbnQpKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hfbWl4ZXJbXSA9IHsiRGlzYWJsZSIsICJFbmFibGUifTsKLQotLyogSWYgbmV3IGJhY2tlbmQgaXMgYWRkZWQsIG5lZWQgdXBkYXRlIHRoaXMgYXJyYXkgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBiZV9uYW1lW10gPSB7Ci0iWkVSTyIsICJQUklfSTJTX1JYIiwgIlBSSV9JMlNfVFgiLCAiU0xJTV8wX1JYIiwKLSJTTElNXzBfVFgiLCAiSERNSV9SWCIsICJJTlRfQlRfU0NPX1JYIiwgIklOVF9CVF9TQ09fVFgiLAotIklOVF9GTV9SWCIsICJJTlRfRk1fVFgiLCAiQUZFX1BDTV9SWCIsICJBRkVfUENNX1RYIiwKLSJBVVhQQ01fUlgiLCAiQVVYUENNX1RYIiwgIlZPSUNFX1BMQVlCQUNLX1RYIiwgIlZPSUNFMl9QTEFZQkFDS19UWCIsCi0iSU5DQUxMX1JFQ09SRF9SWCIsICJJTkNBTExfUkVDT1JEX1RYIiwgIk1JMlNfUlgiLCAiTUkyU19UWCIsCi0iU0VDX0kyU19SWCIsICJTTElNXzFfUlgiLCAiU0xJTV8xX1RYIiwgIlNMSU1fMl9SWCIsCi0iU0xJTV8yX1RYIiwgIlNMSU1fM19SWCIsICJTTElNXzNfVFgiLCAiU0xJTV80X1JYIiwKLSJTTElNXzRfVFgiLCAiU0xJTV81X1JYIiwgIlNMSU1fNV9UWCIsICJTTElNXzZfUlgiLAotIlNMSU1fNl9UWCIsICJTTElNXzdfUlgiLCAiU0xJTV83X1RYIiwgIlNMSU1fOF9SWCIsCi0iU0xJTV84X1RYIiwgIkVYVFBST0NfUlgiLCAiRVhUUFJPQ19UWCIsICJFWFBST0NfRUNfVFgiLAotIlFVQVRfTUkyU19SWCIsICJRVUFUX01JMlNfVFgiLCAiU0VDT05EX01JMlNfUlgiLCAiU0VDT05EX01JMlNfVFgiLAotIlBSSV9NSTJTX1JYIiwgIlBSSV9NSTJTX1RYIiwgIlRFUlRfTUkyU19SWCIsICJURVJUX01JMlNfVFgiLAotIkFVRElPX0kyU19SWCIsICJTRUNfQVVYUENNX1JYIiwgIlNFQ19BVVhQQ01fVFgiLCAiU1BESUZfUlgiLAotIlNFQ09ORF9NSTJTX1JYX1NEMSIsICJRVUlOX01JMlNfUlgiLCAiUVVJTl9NSTJTX1RYIiwgIlNFTkFSWV9NSTJTX1RYIiwKLSJQUklfVERNX1JYXzAiLCAiUFJJX1RETV9UWF8wIiwgIlBSSV9URE1fUlhfMSIsICJQUklfVERNX1RYXzEiLAotIlBSSV9URE1fUlhfMiIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9SWF8zIiwgIlBSSV9URE1fVFhfMyIsCi0iUFJJX1RETV9SWF80IiwgIlBSSV9URE1fVFhfNCIsICJQUklfVERNX1JYXzUiLCAiUFJJX1RETV9UWF81IiwKLSJQUklfVERNX1JYXzYiLCAiUFJJX1RETV9UWF82IiwgIlBSSV9URE1fUlhfNyIsICJQUklfVERNX1RYXzciLAotIlNFQ19URE1fUlhfMCIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9SWF8xIiwgIlNFQ19URE1fVFhfMSIsCi0iU0VDX1RETV9SWF8yIiwgIlNFQ19URE1fVFhfMiIsICJTRUNfVERNX1JYXzMiLCAiU0VDX1RETV9UWF8zIiwKLSJTRUNfVERNX1JYXzQiLCAiU0VDX1RETV9UWF80IiwgIlNFQ19URE1fUlhfNSIsICJTRUNfVERNX1RYXzUiLAotIlNFQ19URE1fUlhfNiIsICJTRUNfVERNX1RYXzYiLCAiU0VDX1RETV9SWF83IiwgIlNFQ19URE1fVFhfNyIsCi0iVEVSVF9URE1fUlhfMCIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1JYXzEiLCAiVEVSVF9URE1fVFhfMSIsCi0iVEVSVF9URE1fUlhfMiIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1JYXzMiLCAiVEVSVF9URE1fVFhfMyIsCi0iVEVSVF9URE1fUlhfNCIsICJURVJUX1RETV9UWF80IiwgIlRFUlRfVERNX1JYXzUiLCAiVEVSVF9URE1fVFhfNSIsCi0iVEVSVF9URE1fUlhfNiIsICJURVJUX1RETV9UWF82IiwgIlRFUlRfVERNX1JYXzciLCAiVEVSVF9URE1fVFhfNyIsCi0iUVVBVF9URE1fUlhfMCIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1JYXzEiLCAiUVVBVF9URE1fVFhfMSIsCi0iUVVBVF9URE1fUlhfMiIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1JYXzMiLCAiUVVBVF9URE1fVFhfMyIsCi0iUVVBVF9URE1fUlhfNCIsICJRVUFUX1RETV9UWF80IiwgIlFVQVRfVERNX1JYXzUiLCAiUVVBVF9URE1fVFhfNSIsCi0iUVVBVF9URE1fUlhfNiIsICJRVUFUX1RETV9UWF82IiwgIlFVQVRfVERNX1JYXzciLCAiUVVBVF9URE1fVFhfNyIsCi0iSU5UX0JUX0EyRFBfUlgiLCAiVVNCX1JYIiwgIlVTQl9UWCIsICJESVNQTEFZX1BPUlRfUlgiLAotIlRFUlRfQVVYUENNX1JYIiwgIlRFUlRfQVVYUENNX1RYIiwgIlFVQVRfQVVYUENNX1JYIiwgIlFVQVRfQVVYUENNX1RYIiwKLSJJTlQwX01JMlNfUlgiLCAiSU5UMF9NSTJTX1RYIiwgIklOVDFfTUkyU19SWCIsICJJTlQxX01JMlNfVFgiLAotIklOVDJfTUkyU19SWCIsICJJTlQyX01JMlNfVFgiLCAiSU5UM19NSTJTX1JYIiwgIklOVDNfTUkyU19UWCIsCi0iSU5UNF9NSTJTX1JYIiwgIklOVDRfTUkyU19UWCIsICJJTlQ1X01JMlNfUlgiLCAiSU5UNV9NSTJTX1RYIiwKLSJJTlQ2X01JMlNfUlgiLCAiSU5UNl9NSTJTX1RYIgotfTsKLQotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1tMV9jaGFubmVsX211eCwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIGNoX21peGVyKTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChtbTJfY2hhbm5lbF9tdXgsCi0JU05EX1NPQ19OT1BNLCBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCBjaF9taXhlcik7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobW0zX2NoYW5uZWxfbXV4LAotCVNORF9TT0NfTk9QTSwgTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgY2hfbWl4ZXIpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKG1tNF9jaGFubmVsX211eCwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIGNoX21peGVyKTsKLQotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDFfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDAsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDJfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDNfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDIsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDRfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDMsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDVfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDQsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDZfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDUsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDdfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDYsIGJlX25hbWUpOwotc3RhdGljIFNPQ19FTlVNX0RPVUJMRV9ERUNMKG1tMV9jaDhfZW51bSwKLQlTTkRfU09DX05PUE0sIE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDcsIGJlX25hbWUpOwotCi1zdGF0aWMgaW50IG1zbV9wY21fZ2V0X2N0bF9lbnVtX2luZm8oc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbywKLQkJdW5zaWduZWQgaW50IGNoYW5uZWxzLAotCQl1bnNpZ25lZCBpbnQgaXRlbXMsIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10pCi17Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gaXRlbXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBpdGVtcyAtIDE7Ci0KLQlXQVJOKHN0cmxlbihuYW1lc1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSkgPj0KLQkJc2l6ZW9mKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUpLAotCQkiQUxTQTogdG9vIGxvbmcgaXRlbSBuYW1lICclcydcbiIsCi0JCW5hbWVzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlzdHJsY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCi0JCW5hbWVzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dLAotCQlzaXplb2YodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2hhbm5lbF9taXhlcl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCi0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7Ci0JdWluZm8tPmNvdW50ID0gMTsKLQotCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gQVJSQVlfU0laRShjaF9taXhlcik7Ci0JbXNtX3BjbV9nZXRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgZS0+aXRlbXMsIGUtPnRleHRzKTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXUxNiBmZV9pZCA9IDA7Ci0KLQlmZV9pZCA9ICgoc3RydWN0IHNvY19lbnVtICopCi0JCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0X2w7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IEZFICVkICVzXG4iLCBfX2Z1bmNfXywKLQkJZmVfaWQsCi0JCWNoYW5uZWxfbWl4ZXJbZmVfaWRdLmVuYWJsZSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBjaGFubmVsX21peGVyW2ZlX2lkXS5lbmFibGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaGFubmVsX21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1MTYgZmVfaWQgPSAwOwotCi0JZmVfaWQgPSAoKHN0cnVjdCBzb2NfZW51bSAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdF9sOwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBGRSAlZFxuIiwgX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2hhbm5lbF9taXhlcltmZV9pZF0uZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlwcl9kZWJ1ZygiJXM6ICVzIEZFICVkXG4iLCBfX2Z1bmNfXywKLQkJY2hhbm5lbF9taXhlcltmZV9pZF0uZW5hYmxlID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIsCi0JCWZlX2lkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQotewotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQotCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOwotCXVpbmZvLT5jb3VudCA9IDE7Ci0KLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IEFSUkFZX1NJWkUoYmVfbmFtZSk7Ci0JbXNtX3BjbV9nZXRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgZS0+aXRlbXMsIGUtPnRleHRzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXUxNiBmZV9pZCA9IDAsIGluX2NoID0gMDsKLQotCWZlX2lkID0gZS0+c2hpZnRfbDsKLQlpbl9jaCA9IGUtPnNoaWZ0X3I7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGluX2NoID49IEFETV9NQVhfQ0hBTk5FTFMpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBpbnB1dCBjaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaW5fY2gpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljaGFubmVsX2lucHV0W2ZlX2lkXVtpbl9jaF0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXUxNiBmZV9pZCA9IDAsIGluX2NoID0gMDsKLQotCWZlX2lkID0gZS0+c2hpZnRfbDsKLQlpbl9jaCA9IGUtPnNoaWZ0X3I7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGluX2NoID49IEFETV9NQVhfQ0hBTk5FTFMpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBpbnB1dCBjaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaW5fY2gpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gY2hhbm5lbF9pbnB1dFtmZV9pZF1baW5fY2hdOwotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaGFubmVsX3dlaWdodF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7Ci0JdWluZm8tPmNvdW50ID0gQURNX01BWF9DSEFOTkVMUzsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IFdFSUdIVF8wX0RCOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaGFubmVsX3dlaWdodF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTE2IGZlX2lkID0gMCwgb3V0X2NoID0gMDsKLQlpbnQgaSwgd2VpZ2h0OwotCi0JZmVfaWQgPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5zaGlmdDsKLQlvdXRfY2ggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yc2hpZnQ7Ci0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIEZFICVkXG4iLCBfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKG91dF9jaCA+PSBBRE1fTUFYX0NIQU5ORUxTKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgaW5wdXQgY2hhbm5lbCAlZFxuIiwgX19mdW5jX18sIG91dF9jaCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogRkVfSUQ6ICVkLCBjaGFubmVsIHdlaWdodCAlbGQsICVsZCwgJWxkLCAlbGQsICVsZCwgJWxkLCAlbGQsICVsZFxuIiwKLQkJX19mdW5jX18sIGZlX2lkLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVszXSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNF0sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzVdLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs2XSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbN10pOwotCi0JZm9yIChpID0gMDsgaSA8IEFETV9NQVhfQ0hBTk5FTFM7ICsraSkgewotCQl3ZWlnaHQgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXTsKLQkJY2hhbm5lbF9taXhlcltmZV9pZF0uY2hhbm5lbF93ZWlnaHRbb3V0X2NoXVtpXSA9IHdlaWdodDsKLQkJcHJfZGVidWcoIiVzOiBGRV9JRCAlZCwgb3V0cHV0ICVkIGlucHV0ICVkIHdlaWdodCAlZFxuIiwKLQkJCV9fZnVuY19fLCBmZV9pZCwgb3V0X2NoLCBpLAotCQkJY2hhbm5lbF9taXhlcltmZV9pZF0uY2hhbm5lbF93ZWlnaHRbb3V0X2NoXVtpXSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTE2IGZlX2lkID0gMCwgb3V0X2NoID0gMDsKLQlpbnQgaTsKLQotCWZlX2lkID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+c2hpZnQ7Ci0Jb3V0X2NoID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cnNoaWZ0OwotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBGRSAlZFxuIiwgX19mdW5jX18sIGZlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChvdXRfY2ggPj0gQURNX01BWF9DSEFOTkVMUykgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGlucHV0IGNoYW5uZWwgJWRcbiIsIF9fZnVuY19fLCBvdXRfY2gpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQURNX01BWF9DSEFOTkVMUzsgKytpKQotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9Ci0JCQljaGFubmVsX21peGVyW2ZlX2lkXS5jaGFubmVsX3dlaWdodFtvdXRfY2hdW2ldOwotCi0JcHJfZGVidWcoIiVzOiBGRV9JRDogJWQsIHdlaWdodCAgJWxkLCAlbGQsICVsZCwgJWxkLCAlbGQsICVsZCwgJWxkLCAlbGQiLAotCQlfX2Z1bmNfXywgZmVfaWQsCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbNV0sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzZdLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs3XSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNoYW5uZWxfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEgQ2hhbm5lbCBSdWxlIiwgU05EX1NPQ19OT1BNLAotCQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgOCwgMCwKLQkJCW1zbV9wY21fZ2V0X2NoYW5uZWxfcnVsZV9pbmRleCwKLQkJCW1zbV9wY21fcHV0X2NoYW5uZWxfcnVsZV9pbmRleCksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIENoYW5uZWwgUnVsZSIsIFNORF9TT0NfTk9QTSwKLQkJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDgsIDAsCi0JCQltc21fcGNtX2dldF9jaGFubmVsX3J1bGVfaW5kZXgsCi0JCQltc21fcGNtX3B1dF9jaGFubmVsX3J1bGVfaW5kZXgpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyBDaGFubmVsIFJ1bGUiLCBTTkRfU09DX05PUE0sCi0JCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCA4LCAwLAotCQkJbXNtX3BjbV9nZXRfY2hhbm5lbF9ydWxlX2luZGV4LAotCQkJbXNtX3BjbV9wdXRfY2hhbm5lbF9ydWxlX2luZGV4KSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQgQ2hhbm5lbCBSdWxlIiwgU05EX1NPQ19OT1BNLAotCQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgOCwgMCwKLQkJCW1zbV9wY21fZ2V0X2NoYW5uZWxfcnVsZV9pbmRleCwKLQkJCW1zbV9wY21fcHV0X2NoYW5uZWxfcnVsZV9pbmRleCksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IENoYW5uZWwgUnVsZSIsIFNORF9TT0NfTk9QTSwKLQkJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDgsIDAsCi0JCQltc21fcGNtX2dldF9jaGFubmVsX3J1bGVfaW5kZXgsCi0JCQltc21fcGNtX3B1dF9jaGFubmVsX3J1bGVfaW5kZXgpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiBDaGFubmVsIFJ1bGUiLCBTTkRfU09DX05PUE0sCi0JCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCA4LCAwLAotCQkJbXNtX3BjbV9nZXRfY2hhbm5lbF9ydWxlX2luZGV4LAotCQkJbXNtX3BjbV9wdXRfY2hhbm5lbF9ydWxlX2luZGV4KSwKLQotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSBDaGFubmVscyIsIFNORF9TT0NfTk9QTSwKLQkJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDgsIDAsCi0JCQltc21fcGNtX2dldF9vdXRfY2hzLAotCQkJbXNtX3BjbV9wdXRfb3V0X2NocyksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIENoYW5uZWxzIiwgU05EX1NPQ19OT1BNLAotCQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgOCwgMCwKLQkJCW1zbV9wY21fZ2V0X291dF9jaHMsCi0JCQltc21fcGNtX3B1dF9vdXRfY2hzKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMgQ2hhbm5lbHMiLCBTTkRfU09DX05PUE0sCi0JCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCA4LCAwLAotCQkJbXNtX3BjbV9nZXRfb3V0X2NocywKLQkJCW1zbV9wY21fcHV0X291dF9jaHMpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCBDaGFubmVscyIsIFNORF9TT0NfTk9QTSwKLQkJCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDgsIDAsCi0JCQltc21fcGNtX2dldF9vdXRfY2hzLAotCQkJbXNtX3BjbV9wdXRfb3V0X2NocyksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IENoYW5uZWxzIiwgU05EX1NPQ19OT1BNLAotCQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgOCwgMCwKLQkJCW1zbV9wY21fZ2V0X291dF9jaHMsCi0JCQltc21fcGNtX3B1dF9vdXRfY2hzKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYgQ2hhbm5lbHMiLCBTTkRfU09DX05PUE0sCi0JCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCA4LCAwLAotCQkJbXNtX3BjbV9nZXRfb3V0X2NocywKLQkJCW1zbV9wY21fcHV0X291dF9jaHMpLAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBDaGFubmVsIE1peGVyIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF9taXhlcl9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihtbTFfY2hhbm5lbF9tdXgpCi0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTIgQ2hhbm5lbCBNaXhlciIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX21peGVyX2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX21peGVyX3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYobW0yX2NoYW5uZWxfbXV4KQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWEzIENoYW5uZWwgTWl4ZXIiLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX21peGVyX2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF9taXhlcl9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF9taXhlcl9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKG1tM19jaGFubmVsX211eCkKLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhNCBDaGFubmVsIE1peGVyIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF9taXhlcl9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfbWl4ZXJfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihtbTRfY2hhbm5lbF9tdXgpCi0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgT3V0cHV0IENoYW5uZWwxIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsgLnNoaWZ0ID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgLnJzaGlmdCA9IDAsfQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWExIE91dHB1dCBDaGFubmVsMiIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sKQotCQl7IC5zaGlmdCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIC5yc2hpZnQgPSAxLCB9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgT3V0cHV0IENoYW5uZWwzIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsgLnNoaWZ0ID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgLnJzaGlmdCA9IDIsfQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWExIE91dHB1dCBDaGFubmVsNCIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sKQotCQl7IC5zaGlmdCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIC5yc2hpZnQgPSAzLH0KLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBPdXRwdXQgQ2hhbm5lbDUiLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCkKLQkJeyAuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAucnNoaWZ0ID0gNCx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgT3V0cHV0IENoYW5uZWw2IiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsgLnNoaWZ0ID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgLnJzaGlmdCA9IDUsfQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWExIE91dHB1dCBDaGFubmVsNyIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sKQotCQl7IC5zaGlmdCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIC5yc2hpZnQgPSA2LH0KLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBPdXRwdXQgQ2hhbm5lbDgiLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfd2VpZ2h0X2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCkKLQkJeyAuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAucnNoaWZ0ID0gNyx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTIgT3V0cHV0IENoYW5uZWwxIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAucnNoaWZ0ID0gMCx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTIgT3V0cHV0IENoYW5uZWwyIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAucnNoaWZ0ID0gMSx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTIgT3V0cHV0IENoYW5uZWwzIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAucnNoaWZ0ID0gMix9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTMgT3V0cHV0IENoYW5uZWwxIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAucnNoaWZ0ID0gMCx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTMgT3V0cHV0IENoYW5uZWwyIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX3dlaWdodF9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF93ZWlnaHRfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wpCi0JCXsuc2hpZnQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAucnNoaWZ0ID0gMSx9Ci0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgQ2hhbm5lbDEiLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKG1tMV9jaDFfZW51bSkKLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBDaGFubmVsMiIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYobW0xX2NoMl9lbnVtKQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWExIENoYW5uZWwzIiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihtbTFfY2gzX2VudW0pCi0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgQ2hhbm5lbDQiLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKG1tMV9jaDRfZW51bSkKLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBDaGFubmVsNSIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYobW0xX2NoNV9lbnVtKQotCX0sCi0JewotCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCS5uYW1lID0gIk11bHRpTWVkaWExIENoYW5uZWw2IiwKLQkuaW5mbyA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9pbmZvLAotCS5nZXQgPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfZ2V0LAotCS5wdXQgPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfcHV0LAotCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJihtbTFfY2g2X2VudW0pCi0JfSwKLQl7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JLm5hbWUgPSAiTXVsdGlNZWRpYTEgQ2hhbm5lbDciLAotCS5pbmZvID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2luZm8sCi0JLmdldCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9nZXQsCi0JLnB1dCA9IG1zbV9wY21fY2hhbm5lbF9pbnB1dF9iZV9wdXQsCi0JLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmKG1tMV9jaDdfZW51bSkKLQl9LAotCXsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkubmFtZSA9ICJNdWx0aU1lZGlhMSBDaGFubmVsOCIsCi0JLmluZm8gPSBtc21fcGNtX2NoYW5uZWxfaW5wdXRfYmVfaW5mbywKLQkuZ2V0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX2dldCwKLQkucHV0ID0gbXNtX3BjbV9jaGFubmVsX2lucHV0X2JlX3B1dCwKLQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSYobW0xX2NoOF9lbnVtKQotCX0sCi19Owotc3RhdGljIGludCBtc21fZWNfcmVmX2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9lY19yZWZfY2g7Ci0JcHJfZGVidWcoIiVzOiBtc21fZWNfcmVmX2NoID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9lY19yZWZfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCW1zbV9lY19yZWZfY2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9lY19yZWZfY2ggPSAlZFxuIiwgX19mdW5jX18sIG1zbV9lY19yZWZfY2gpOwotCWFkbV9udW1fZWNfcmVmX3J4X2NoYW5zKG1zbV9lY19yZWZfY2gpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZWNfcmVmX2NoX3RleHRbXSA9IHsiWmVybyIsICJPbmUiLCAiVHdvIiwgIlRocmVlIiwKLQkiRm91ciIsICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9OwotCi1zdGF0aWMgaW50IG1zbV9lY19yZWZfYml0X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoIChtc21fZWNfcmVmX2JpdF9mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBtc21fZWNfcmVmX2JpdF9mb3JtYXQgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9lY19yZWZfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdTE2IGJpdF93aWR0aCA9IDA7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAyOgotCQltc21fZWNfcmVmX2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQltc21fZWNfcmVmX2JpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbXNtX2VjX3JlZl9iaXRfZm9ybWF0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKG1zbV9lY19yZWZfYml0X2Zvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkKLQkJYml0X3dpZHRoID0gMTY7Ci0JZWxzZSBpZiAobXNtX2VjX3JlZl9iaXRfZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKQotCQliaXRfd2lkdGggPSAyNDsKLQotCXByX2RlYnVnKCIlczogbXNtX2VjX3JlZl9iaXRfZm9ybWF0ID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgbXNtX2VjX3JlZl9iaXRfZm9ybWF0KTsKLQlhZG1fZWNfcmVmX3J4X2JpdF93aWR0aChiaXRfd2lkdGgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciBjb25zdCAqZWNfcmVmX2JpdF9mb3JtYXRfdGV4dFtdID0geyIwIiwgIlMxNl9MRSIsICJTMjRfTEUifTsKLQotc3RhdGljIGludCBtc21fZWNfcmVmX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlOwotCXByX2RlYnVnKCIlczogbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZWNfcmVmX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDA6Ci0JCW1zbV9lY19yZWZfc2FtcGxpbmdfcmF0ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlID0gODAwMDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSAxNjAwMDsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSAzMjAwMDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSA0NDEwMDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSA0ODAwMDsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSA5NjAwMDsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSAxOTIwMDA7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlID0gMzg0MDAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc21fZWNfcmVmX3NhbXBsaW5nX3JhdGUgPSA0ODAwMDsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgbXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlKTsKLQlhZG1fZWNfcmVmX3J4X3NhbXBsaW5nX3JhdGUobXNtX2VjX3JlZl9zYW1wbGluZ19yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVjX3JlZl9yYXRlX3RleHRbXSA9IHsiMCIsICI4MDAwIiwgIjE2MDAwIiwKLQkiMzIwMDAiLCAiNDQxMDAiLCAiNDgwMDAiLCAiOTYwMDAiLCAiMTkyMDAwIiwgIjM4NDAwMCJ9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1zbV9yb3V0ZV9lY19yZWZfcGFyYW1zX2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKDksIGVjX3JlZl9jaF90ZXh0KSwKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKDMsIGVjX3JlZl9iaXRfZm9ybWF0X3RleHQpLAotCVNPQ19FTlVNX1NJTkdMRV9FWFQoOSwgZWNfcmVmX3JhdGVfdGV4dCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZWNfcmVmX3BhcmFtX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJFQyBSZWZlcmVuY2UgQ2hhbm5lbHMiLCBtc21fcm91dGVfZWNfcmVmX3BhcmFtc19lbnVtWzBdLAotCQltc21fZWNfcmVmX2NoX2dldCwgbXNtX2VjX3JlZl9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRUMgUmVmZXJlbmNlIEJpdCBGb3JtYXQiLCBtc21fcm91dGVfZWNfcmVmX3BhcmFtc19lbnVtWzFdLAotCQltc21fZWNfcmVmX2JpdF9mb3JtYXRfZ2V0LCBtc21fZWNfcmVmX2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkVDIFJlZmVyZW5jZSBTYW1wbGVSYXRlIiwgbXNtX3JvdXRlX2VjX3JlZl9wYXJhbXNfZW51bVsyXSwKLQkJbXNtX2VjX3JlZl9yYXRlX2dldCwgbXNtX2VjX3JlZl9yYXRlX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiBlY19yZWZfcnggID0gJWQiLCBfX2Z1bmNfXywgbXNtX3JvdXRlX2VjX3JlZl9yeCk7Ci0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9yb3V0ZV9lY19yZWZfcng7Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGVjX3JlZl9wb3J0X2lkOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPQotCQlzbmRfc29jX2RhcG1fa2NvbnRyb2xfd2lkZ2V0KGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMDoKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDA7Ci0JCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSU5WQUxJRDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBTTElNQlVTXzBfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDI7Ci0JCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAzOwotCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gNDsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gNTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSA2OwotCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gNzsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gOTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBTTElNQlVTXzVfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxMDsKLQkJZWNfcmVmX3BvcnRfaWQgPSBTTElNQlVTXzFfVFg7Ci0JCWJyZWFrOwotCWNhc2UgMTE6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxMTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOwotCQlicmVhazsKLQljYXNlIDEyOgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMTI7Ci0JCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg7Ci0JCWJyZWFrOwotCWNhc2UgMTM6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxMzsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOwotCQlicmVhazsKLQljYXNlIDE0OgotCQltc21fcm91dGVfZWNfcmVmX3J4ID0gMTQ7Ci0JCWVjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjsKLQkJYnJlYWs7Ci0JY2FzZSAxNToKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDE1OwotCQllY19yZWZfcG9ydF9pZCA9IFNMSU1CVVNfNl9SWDsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeCA9IDE2OwotCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMTc6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxNzsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMTg6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxODsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg7Ci0JCWJyZWFrOwotCWNhc2UgMTk6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAxOTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9VU0JfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMjA6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAyMDsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMjE6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAyMTsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgMjI6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAyMjsKLQkJZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1zbV9yb3V0ZV9lY19yZWZfcnggPSAwOyAvKiBOT05FICovCi0JCXByX2VycigiJXMgRUMgcmVmIHJ4ICVsZCBub3QgdmFsaWRcbiIsCi0JCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCQllY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lOVkFMSUQ7Ci0JCWJyZWFrOwotCX0KLQlhZG1fZWNfcmVmX3J4X2lkKGVjX3JlZl9wb3J0X2lkKTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9yb3V0ZV9lY19yZWZfcnggPSAlZFxuIiwKLQkgICAgX19mdW5jX18sIG1zbV9yb3V0ZV9lY19yZWZfcngpOwotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQlzbmRfc29jX2RhcG1fbXV4X3VwZGF0ZV9wb3dlcih3aWRnZXQtPmRhcG0sIGtjb250cm9sLAotCQkJCQltc21fcm91dGVfZWNfcmVmX3J4LCBlLCB1cGRhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZWNfcmVmX3J4W10gPSB7ICJOb25lIiwgIlNMSU1fUlgiLCAiSTJTX1JYIiwKLQkiUFJJX01JMlNfVFgiLCAiU0VDX01JMlNfVFgiLAotCSJURVJUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIiwgIlNFQ19JMlNfUlgiLCAiUFJPWFlfUlgiLAotCSJTTElNXzVfUlgiLCAiU0xJTV8xX1RYIiwgIlFVQVRfVERNX1RYXzEiLAotCSJRVUFUX1RETV9SWF8wIiwgIlFVQVRfVERNX1JYXzEiLCAiUVVBVF9URE1fUlhfMiIsICJTTElNXzZfUlgiLAotCSJURVJUX01JMlNfUlgiLCAiUVVBVF9NSTJTX1JYIiwgIlRFUlRfVERNX1RYXzAiLCAiVVNCX0FVRElPX1JYIiwKLQkiSU5UMF9NSTJTX1JYIiwgIklOVDRfTUkyU19SWCIsICJJTlQzX01JMlNfVFgifTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fcm91dGVfZWNfcmVmX3J4X2VudW1bXSA9IHsKLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUoZWNfcmVmX3J4KSwgZWNfcmVmX3J4KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDEgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxIE1VWCBNdXgiLAotCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCi0JCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWwyID0KLQlTT0NfREFQTV9FTlVNX0VYVCgiQVVESU9fUkVGX0VDX1VMMiBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMyA9Ci0JU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDMgTVVYIE11eCIsCi0JCW1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVswXSwKLQkJbXNtX3JvdXRpbmdfZWNfcmVmX3J4X2dldCwgbXNtX3JvdXRpbmdfZWNfcmVmX3J4X3B1dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDQgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUw0IE1VWCBNdXgiLAotCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCi0JCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWw1ID0KLQlTT0NfREFQTV9FTlVNX0VYVCgiQVVESU9fUkVGX0VDX1VMNSBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsNiA9Ci0JU09DX0RBUE1fRU5VTV9FWFQoIkFVRElPX1JFRl9FQ19VTDYgTVVYIE11eCIsCi0JCW1zbV9yb3V0ZV9lY19yZWZfcnhfZW51bVswXSwKLQkJbXNtX3JvdXRpbmdfZWNfcmVmX3J4X2dldCwgbXNtX3JvdXRpbmdfZWNfcmVmX3J4X3B1dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBleHRfZWNfcmVmX211eF91bDggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUw4IE1VWCBNdXgiLAotCQltc21fcm91dGVfZWNfcmVmX3J4X2VudW1bMF0sCi0JCW1zbV9yb3V0aW5nX2VjX3JlZl9yeF9nZXQsIG1zbV9yb3V0aW5nX2VjX3JlZl9yeF9wdXQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZXh0X2VjX3JlZl9tdXhfdWw5ID0KLQlTT0NfREFQTV9FTlVNX0VYVCgiQVVESU9fUkVGX0VDX1VMOSBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMTYgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxNiBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMTAgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxMCBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMTcgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxNyBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMTggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxOCBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGV4dF9lY19yZWZfbXV4X3VsMTkgPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJBVURJT19SRUZfRUNfVUwxOSBNVVggTXV4IiwKLQkJbXNtX3JvdXRlX2VjX3JlZl9yeF9lbnVtWzBdLAotCQltc21fcm91dGluZ19lY19yZWZfcnhfZ2V0LCBtc21fcm91dGluZ19lY19yZWZfcnhfcHV0KTsKLQotc3RhdGljIGludCBtc21fcm91dGluZ19leHRfZWNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiBleHRfZWNfcmVmX3J4ICA9ICV4XG4iLCBfX2Z1bmNfXywgbXNtX3JvdXRlX2V4dF9lY19yZWYpOwotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9yb3V0ZV9leHRfZWNfcmVmOwotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19leHRfZWNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9Ci0JCXNuZF9zb2NfZGFwbV9rY29udHJvbF93aWRnZXQoa2NvbnRyb2wpOwotCWludCBtdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQlpbnQgcmV0ID0gMTsKLQlib29sIHN0YXRlID0gdHJ1ZTsKLQl1aW50MTZfdCBleHRfZWNfcmVmX3BvcnRfaWQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV91cGRhdGUgKnVwZGF0ZSA9IE5VTEw7Ci0KLQlpZiAobXV4ID49IGUtPml0ZW1zKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgbXV4IHZhbHVlICVkXG4iLCBfX2Z1bmNfXywgbXV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQltc21fcm91dGVfZXh0X2VjX3JlZiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0Jc3dpdGNoIChtc21fcm91dGVfZXh0X2VjX3JlZikgewotCWNhc2UgRVhUX0VDX1JFRl9QUklfTUkyU19UWDoKLQkJZXh0X2VjX3JlZl9wb3J0X2lkID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIEVYVF9FQ19SRUZfU0VDX01JMlNfVFg6Ci0JCWV4dF9lY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIEVYVF9FQ19SRUZfVEVSVF9NSTJTX1RYOgotCQlleHRfZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIEVYVF9FQ19SRUZfUVVBVF9NSTJTX1RYOgotCQlleHRfZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7Ci0JCWJyZWFrOwotCWNhc2UgRVhUX0VDX1JFRl9RVUlOX01JMlNfVFg6Ci0JCWV4dF9lY19yZWZfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBFWFRfRUNfUkVGX1NMSU1fMV9UWDoKLQkJZXh0X2VjX3JlZl9wb3J0X2lkID0gU0xJTUJVU18xX1RYOwotCQlicmVhazsKLQljYXNlIEVYVF9FQ19SRUZfTk9ORToKLQlkZWZhdWx0OgotCQlleHRfZWNfcmVmX3BvcnRfaWQgPSBBRkVfUE9SVF9JTlZBTElEOwotCQlzdGF0ZSA9IGZhbHNlOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHZhbCA9ICVkIGV4dF9lY19yZWZfcG9ydF9pZCA9IDB4JTB4IHN0YXRlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgbXNtX3JvdXRlX2V4dF9lY19yZWYsIGV4dF9lY19yZWZfcG9ydF9pZCwgc3RhdGUpOwotCi0JaWYgKCF2b2Nfc2V0X2V4dF9lY19yZWZfcG9ydF9pZChleHRfZWNfcmVmX3BvcnRfaWQsIHN0YXRlKSkgewotCQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JCXNuZF9zb2NfZGFwbV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldC0+ZGFwbSwga2NvbnRyb2wsIG11eCwgZSwKLQkJCQkJCXVwZGF0ZSk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dF9lY19yZWZfcnhbXSA9IHsiTk9ORSIsICJQUklfTUkyU19UWCIsCi0JCQkJCSJTRUNfTUkyU19UWCIsICJURVJUX01JMlNfVFgiLAotCQkJCQkiUVVBVF9NSTJTX1RYIiwgIlFVSU5fTUkyU19UWCIsCi0JCQkJCSJTTElNXzFfVFgifTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fcm91dGVfZXh0X2VjX3JlZl9yeF9lbnVtW10gPSB7Ci0JU09DX0VOVU1fU0lOR0xFX0VYVChBUlJBWV9TSVpFKGV4dF9lY19yZWZfcngpLCBleHRfZWNfcmVmX3J4KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2b2NfZXh0X2VjX211eCA9Ci0JU09DX0RBUE1fRU5VTV9FWFQoIlZPQ19FWFRfRUMgTVVYIE11eCIsIG1zbV9yb3V0ZV9leHRfZWNfcmVmX3J4X2VudW1bMF0sCi0JCQkgIG1zbV9yb3V0aW5nX2V4dF9lY19nZXQsIG1zbV9yb3V0aW5nX2V4dF9lY19wdXQpOwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfaTJzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfaTJzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzcGRpZl9yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NQRElGX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU1BESUZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c18yX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfNV9yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRlcm5hcnlfbWkyc19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWluYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGVydGlhcnlfbWkyc19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2Vjb25kYXJ5X21pMnNfcngyX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYX1NEMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNvbmRhcnlfbWkyc19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaW1hcnlfbWkyc19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDBfbWkyc19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQ0X21pMnNfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGRtaV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNyIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGlzcGxheV9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotCS8qIGluY2FsbCBtdXNpYyBkZWxpdmVyeSBtaXhlciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGluY2FsbF9tdXNpY19kZWxpdmVyeV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRV9QTEFZQkFDS19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRV9QTEFZQkFDS19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbmNhbGxfbXVzaWMyX2RlbGl2ZXJ5X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9WT0lDRTJfUExBWUJBQ0tfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzRfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfNl9yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzdfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdXNiX2F1ZGlvX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludF9idF9zY29fcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludF9idF9hMmRwX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9BMkRQX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX0EyRFBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50X2ZtX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE4IiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFmZV9wY21fcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTciLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE5IiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGF1eHBjbV9yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTkiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X2F1eHBjbV9yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX3RkbV9yeF8wX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV90ZG1fcnhfMV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX3RkbV9yeF8zX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV90ZG1fdHhfMF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX3RkbV9yeF8xX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY190ZG1fcnhfMl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX3RkbV90eF8wX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzQsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF80LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzQsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfNCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF80LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzQsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMjAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF90ZG1fdHhfMF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF90ZG1fcnhfMV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhNyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhOSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8yX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE1IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE3IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE4IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWE5IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTExIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE0IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTUiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTYiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTciLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTkiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEzIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMTQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWExNSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTE2IiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMjAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDFfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UMl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfREwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV80X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzZfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVSU5fTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8xLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMywKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8zLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsMl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UMl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV82X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVJTl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDNfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQyX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsNF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX0RMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfVUwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UMl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsNV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDJfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsNl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDJfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWw4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDJfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fNl9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWwxNl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UMl9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX0RMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzZfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDlfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fNl9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWwxMF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfREwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZPQ19SRUNfVUwiLCBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fNl9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFgiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbW11bDE3X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTcsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19VTCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsMThfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19ETCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVk9DX1JFQ19VTCIsIE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtbXVsMTlfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExOSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX0RMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWT0NfUkVDX1VMIiwgTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTksIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1tdWwyMF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8yLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMywKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfYXVkaW9fbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2F1ZGlvX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9hdWRpb19taXhlciwKLQltc21fcm91dGluZ19wdXRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX2kyc19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c182X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVzYl9hdWRpb19yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBidF9zY29fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQwX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWluX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUVVJTkFSWV9NSTJTX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZmVfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGF1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X2F1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiRFRNRiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGRtaV9yeF92b2ljZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJDU1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9IRE1JX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9EVE1GX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzdfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQ1NWb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb0xURSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkRUTUYiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZU1Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbWJ1c184X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIkNTVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJEVE1GIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX0RUTUZfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfdGRtX3J4XzJfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2VNTW9kZTEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdHViX3J4X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlZvaWNlIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfRVhUUFJPQ19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfRVhUUFJPQ19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfRVhUUFJPQ19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzFfcnhfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvaWNlMiBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlZvTFRFIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW1idXNfM19yeF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJWb2ljZSBTdHViIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9pY2UyIFN0dWIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVm9MVEUgU3R1YiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9pY2VfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaWNlIiwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwKLQltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfQVVYX1BDTV9UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX1ZvaWNlIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9DU19WT0lDRSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9Wb2ljZSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfVm9pY2UiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvaWNlMl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFhfVm9pY2UyIiwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsCi0JbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWF9Wb2ljZTIiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX1ZvaWNlMiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfVm9pY2UyIiwgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9sdGVfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX1ZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWF9Wb0xURSIsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsCi0JbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYX1ZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFhfVm9MVEUiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYX1ZvTFRFIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWF9Wb0xURSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm93bGFuX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYX1ZvV0xBTiIsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLAotCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYX1BDTV9UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYX1ZvV0xBTiIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfVm9XTEFOIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPV0xBTiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWF9Wb1dMQU4iLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9XTEFOLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF92b2ljZW1tb2RlMV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfVFhfTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFhfTU1vZGUxIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWF9NTW9kZTEiLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRfQlRfU0NPX1RYX01Nb2RlMSIsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYX01Nb2RlMSIsCi0JTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsIDAsCi0JbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYX01Nb2RlMSIsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwKLQltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX01Nb2RlMSIsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFhfTU1vZGUxIiwKLQlNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFhfTU1vZGUxIiwKLQlNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWF9NTW9kZTEiLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwKLQltc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9NTW9kZTEiLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLAotCTEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYX01Nb2RlMSIsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKLQkxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWF9NTW9kZTEiLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTEsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfTU1vZGUxIiwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYX01Nb2RlMSIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzBfTU1vZGUxIiwKLQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKLQkxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9pY2VtbW9kZTJfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX01Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX01Nb2RlMiIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfTU1vZGUyIiwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UX0JUX1NDT19UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLCAwLAotCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsCi0JbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX01Nb2RlMiIsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhfUENNX1RYX01Nb2RlMiIsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfTU1vZGUyIiwKLQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsIDAsCi0JbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFhfTU1vZGUyIiwKLQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwKLQkxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCi0JMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfTU1vZGUyIiwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLCBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLCAxLAotCTAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYX01Nb2RlMiIsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMiwgMSwKLQkwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsIG1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWF9NTW9kZTIiLAotCU1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsIE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsIDEsCi0JMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLCBtc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3ZvaXBfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfUFJJX0kyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWF9QQ01fVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWF9Wb2lwIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSVAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfVm9pcCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVVNCX0FVRElPX1RYX1ZvaXAiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JUCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9pY2Vfc3R1Yl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTVFVCX1RYX0hMIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTVFVCXzFfVFhfSEwiLCBNU01fQkFDS0VORF9EQUlfRVhUUFJPQ19FQ19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fM19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0eF92b2ljZTJfc3R1Yl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTVFVCX1RYX0hMIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU1RVQl8xX1RYX0hMIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfRUNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fM19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRTJfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMl9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdHhfdm9sdGVfc3R1Yl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTVFVCX1RYX0hMIiwgTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNUVUJfMV9UWF9ITCIsIE1TTV9CQUNLRU5EX0RBSV9FWFRQUk9DX0VDX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFX1NUVUIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9zdHViX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9zdHViX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfQVVYUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9WT0xURV9TVFVCLCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2Vfc3R1Yl9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2Vfc3R1Yl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX3N0dWJfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX3N0dWJfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHR4X3FjaGF0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9UWF9RQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFhfUUNIQVQiLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCBNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLAotCW1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwgbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWF9RQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhfUENNX1RYX1FDSEFUIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWF9QQ01fVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfTUkyU19UWCwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULCAxLCAwLCBtc21fcm91dGluZ19nZXRfdm9pY2VfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ZvaWNlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JTVNNX0ZST05URU5EX0RBSV9RQ0hBVCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3ZvaWNlX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF92b2ljZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWF9RQ0hBVCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJVU0JfQVVESU9fVFhfUUNIQVQiLCBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfUUNIQVQsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF92b2ljZV9taXhlciwKLQltc21fcm91dGluZ19wdXRfdm9pY2VfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDBfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzdfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50NF9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzYnVzXzBfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fN19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk1JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfUlgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfUlgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19SWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGF1eF9wY21fcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2VjX2F1eHBjbV9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNidXNfMV9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9BVVhQQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX0FVWFBDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2J1c18zX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1JYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9SWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNidXNfNl9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV83X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fOF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBidF9zY29fcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZmVfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhkbWlfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0hETUlfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkaXNwbGF5X3BvcnRfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fQkFDS0VORF9EQUlfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19pMnNfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtaTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmltYXJ5X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUlOX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHVzYl9yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlVTQl9BVURJT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1fMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3J4XzBfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3J4XzFfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3J4XzJfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwcmlfdGRtX3J4XzNfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlBSSV9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzBfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzFfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzJfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfdGRtX3J4XzNfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGVydF90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfdGRtX3J4XzJfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzAsCi0JCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBxdWF0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMSwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfQlRfU0NPX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfU0NPX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBRkVfUENNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJBVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19BVVhfUENNX1VMX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8wIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8xIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8yIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX1RETV9UWF8zIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzEsCi0JCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHF1YXRfdGRtX3J4XzJfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzIsCi0JCU1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9GTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlRFUk5BTF9CVF9TQ09fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0lOVF9CVF9TQ09fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFGRV9QQ01fVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIkFVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX0FVWF9QQ01fVUxfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzAiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzAsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzEiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzEsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzIiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzIsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfVERNX1RYXzMiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMiwKLQkJTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1RYXzMsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlBSSV9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMywKLQkJTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0ZNX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzMsCi0JCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsIDEsIDAsCi0JCW1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVEVSTkFMX0JUX1NDT19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQUZFX1BDTV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLCAxLCAwLAotCQltc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTRUNfQVVYX1BDTV9VTF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMSIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMSwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMiIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMiwgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9URE1fVFhfMyIsIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCQlNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMywgMSwgMCwKLQkJbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZXJ0X21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJQUklfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0VDX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV84X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNlY19taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiUFJJX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcG9ydF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcG9ydF9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNFQ19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTV8wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wb3J0X21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9wb3J0X21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5URVJOQUxfRk1fVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVF9GTV9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNXzhfVFgiLCBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3BvcnRfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3BvcnRfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTFfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00xLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00xLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18zX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00xLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU180X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00xLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU181X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00xLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMSwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtMl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzRfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzVfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTIsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00yLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00yLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU00yLCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsc20zX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfMV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfM19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfNF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfNV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNMywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTMsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU000LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU000LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18zX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU000LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU180X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU000LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU181X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU000LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtNV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzRfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzVfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTUsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU001LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU001LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU001LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsc202X21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfMF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfMV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfM19UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfNF9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlNMSU1CVVNfNV9UWCIsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlRFUlRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJRVUFUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJJTlQzX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTYsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxzbTdfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18wX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU003LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18xX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU003LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU18zX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU003LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU180X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU003LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiU0xJTUJVU181X1RYIiwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU003LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiVEVSVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIlFVQVRfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIklOVDNfTUkyU19UWCIsIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFgsCi0JCU1TTV9GUk9OVEVORF9EQUlfTFNNNywgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2xpc3Rlbl9taXhlciwKLQkJbXNtX3JvdXRpbmdfcHV0X2xpc3Rlbl9taXhlciksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtOF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzBfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzFfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzNfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzRfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJTTElNQlVTXzVfVFgiLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYLAotCQlNU01fRlJPTlRFTkRfREFJX0xTTTgsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9saXN0ZW5fbWl4ZXIsCi0JCW1zbV9yb3V0aW5nX3B1dF9saXN0ZW5fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJURVJUX01JMlNfVFgiLCBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU004LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiUVVBVF9NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU004LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiSU5UM19NSTJTX1RYIiwgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCwKLQkJTVNNX0ZST05URU5EX0RBSV9MU004LCAxLCAwLCBtc21fcm91dGluZ19nZXRfbGlzdGVuX21peGVyLAotCQltc21fcm91dGluZ19wdXRfbGlzdGVuX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltX2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyA9Ci0JU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKLQkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfc3dpdGNoX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbTFfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltM19mbV9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3N3aXRjaF9taXhlciwKLQltc21fcm91dGluZ19wdXRfc3dpdGNoX21peGVyKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW00X2ZtX3N3aXRjaF9taXhlcl9jb250cm9scyA9Ci0JU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKLQkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfc3dpdGNoX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2xpbTZfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwY21fcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9mbV9wY21yeF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2ZtX3BjbXJ4X3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQwX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9pbnQwX21pMnNfc3dpdGNoX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9pbnQwX21pMnNfc3dpdGNoX21peGVyKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludDRfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2ludDRfbWkyc19zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2ludDRfbWkyc19zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcHJpX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF9wcmlfbWkyc19zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3ByaV9taTJzX3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3NlY19taTJzX3N3aXRjaF9taXhlciwKLQltc21fcm91dGluZ19wdXRfc2VjX21pMnNfc3dpdGNoX21peGVyKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlcnRfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3RlcnRfbWkyc19zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X3RlcnRfbWkyc19zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcXVhdF9taTJzX3J4X3N3aXRjaF9taXhlcl9jb250cm9scyA9Ci0JU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKLQkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfcXVhdF9taTJzX3N3aXRjaF9taXhlciwKLQltc21fcm91dGluZ19wdXRfcXVhdF9taTJzX3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoZnBfcHJpX2F1eF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2hmcF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2hmcF9zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGZwX2F1eF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2hmcF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2hmcF9zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGZwX2ludF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMgPQotCVNPQ19TSU5HTEVfRVhUKCJTd2l0Y2giLCBTTkRfU09DX05PUE0sCi0JMCwgMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X2hmcF9zd2l0Y2hfbWl4ZXIsCi0JbXNtX3JvdXRpbmdfcHV0X2hmcF9zd2l0Y2hfbWl4ZXIpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGZwX3NsaW03X3N3aXRjaF9taXhlcl9jb250cm9scyA9Ci0JU09DX1NJTkdMRV9FWFQoIlN3aXRjaCIsIFNORF9TT0NfTk9QTSwKLQkwLCAxLCAwLCBtc21fcm91dGluZ19nZXRfaGZwX3N3aXRjaF9taXhlciwKLQltc21fcm91dGluZ19wdXRfaGZwX3N3aXRjaF9taXhlcik7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1c2Jfc3dpdGNoX21peGVyX2NvbnRyb2xzID0KLQlTT0NfU0lOR0xFX0VYVCgiU3dpdGNoIiwgU05EX1NPQ19OT1BNLAotCTAsIDEsIDAsIG1zbV9yb3V0aW5nX2dldF91c2Jfc3dpdGNoX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF91c2Jfc3dpdGNoX21peGVyKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsc21fcG9ydF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKEFSUkFZX1NJWkUobHNtX3BvcnRfdGV4dCksIGxzbV9wb3J0X3RleHQpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxzbV9mdW5jX3RleHRbXSA9IHsKLQkiTm9uZSIsICJBVURJTyIsICJCRUFDT04iLCAiVUxUUkFTT1VORCIsICJTV0FVRElPIiwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxzbV9mdW5jX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShsc21fZnVuY190ZXh0KSwgbHNtX2Z1bmNfdGV4dCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsc21fY29udHJvbHNbXSA9IHsKLQkvKiBrY29udHJvbCBvZiBsc21fZnVuY3Rpb24gKi8KLQlTT0NfRU5VTV9FWFQoU0xJTUJVU18wX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKLQkJICAgICBtc21fcm91dGluZ19sc21fZnVuY19nZXQsIG1zbV9yb3V0aW5nX2xzbV9mdW5jX3B1dCksCi0JU09DX0VOVU1fRVhUKFNMSU1CVVNfMV9UWF9URVhUIiAiTFNNX0ZVTkNUSU9OX1RFWFQsIGxzbV9mdW5jX2VudW0sCi0JCSAgICAgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfZ2V0LCBtc21fcm91dGluZ19sc21fZnVuY19wdXQpLAotCVNPQ19FTlVNX0VYVChTTElNQlVTXzJfVFhfVEVYVCIgIkxTTV9GVU5DVElPTl9URVhULCBsc21fZnVuY19lbnVtLAotCQkgICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKLQlTT0NfRU5VTV9FWFQoU0xJTUJVU18zX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKLQkJICAgICBtc21fcm91dGluZ19sc21fZnVuY19nZXQsIG1zbV9yb3V0aW5nX2xzbV9mdW5jX3B1dCksCi0JU09DX0VOVU1fRVhUKFNMSU1CVVNfNF9UWF9URVhUIiAiTFNNX0ZVTkNUSU9OX1RFWFQsIGxzbV9mdW5jX2VudW0sCi0JCSAgICAgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfZ2V0LCBtc21fcm91dGluZ19sc21fZnVuY19wdXQpLAotCVNPQ19FTlVNX0VYVChTTElNQlVTXzVfVFhfVEVYVCIgIkxTTV9GVU5DVElPTl9URVhULCBsc21fZnVuY19lbnVtLAotCQkgICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKLQlTT0NfRU5VTV9FWFQoVEVSVF9NSTJTX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKLQkJICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKLQlTT0NfRU5VTV9FWFQoUVVBVF9NSTJTX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKLQkJICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKLQlTT0NfRU5VTV9FWFQoSU5UM19NSTJTX1RYX1RFWFQiICJMU01fRlVOQ1RJT05fVEVYVCwgbHNtX2Z1bmNfZW51bSwKLQkJICAgIG1zbV9yb3V0aW5nX2xzbV9mdW5jX2dldCwgbXNtX3JvdXRpbmdfbHNtX2Z1bmNfcHV0KSwKLQkvKiBrY29udHJvbCBvZiBsc21fcG9ydCAqLwotCVNPQ19FTlVNX0VYVCgiTFNNMSBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNMiBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNMyBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNNCBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNNSBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNNiBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNNyBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTFNNOCBQb3J0IiwgbHNtX3BvcnRfZW51bSwKLQkJCSAgbXNtX3JvdXRpbmdfbHNtX3BvcnRfZ2V0LAotCQkJICBtc21fcm91dGluZ19sc21fcG9ydF9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhYW5jX3NsaW1fMF9yeF90ZXh0W10gPSB7Ci0JIlpFUk8iLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzJfVFgiLCAiU0xJTUJVU18zX1RYIiwKLQkiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzZfVFgiCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGFhbmNfc2xpbV8wX3J4X2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoQVJSQVlfU0laRShhYW5jX3NsaW1fMF9yeF90ZXh0KSwKLQkJCQlhYW5jX3NsaW1fMF9yeF90ZXh0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFhbmNfc2xpbV8wX3J4X211eFtdID0gewotCVNPQ19FTlVNX0VYVCgiQUFOQ19TTElNXzBfUlggTVVYIiwgYWFuY19zbGltXzBfcnhfZW51bSwKLQkJbXNtX3JvdXRpbmdfc2xpbV8wX3J4X2FhbmNfbXV4X2dldCwKLQkJbXNtX3JvdXRpbmdfc2xpbV8wX3J4X2FhbmNfbXV4X3B1dCkKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2woCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGlzX2N1c3RvbV9zdGVyZW9fb247Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2woCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgZmxhZyA9IDAsIGkgPSAwLCByYyA9IDAsIGlkeCA9IDA7Ci0JaW50IGJlX2luZGV4ID0gMCwgcG9ydF9pZCwgdG9wb19pZDsKLQl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCA9IDA7Ci0JdWludDE2X3Qgb3BfRkxfaXBfRkxfd2VpZ2h0ID0gMDsKLQl1aW50MTZfdCBvcF9GTF9pcF9GUl93ZWlnaHQgPSAwOwotCXVpbnQxNl90IG9wX0ZSX2lwX0ZMX3dlaWdodCA9IDA7Ci0JdWludDE2X3Qgb3BfRlJfaXBfRlJfd2VpZ2h0ID0gMDsKLQotCWZsYWcgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlwcl9kZWJ1ZygiJXMgRSBmbGFnICVkXG4iLCBfX2Z1bmNfXywgZmxhZyk7Ci0KLQlpZiAoKGlzX2N1c3RvbV9zdGVyZW9fb24gJiYgZmxhZykgfHwgKCFpc19jdXN0b21fc3RlcmVvX29uICYmICFmbGFnKSkgewotCQlwcl9lcnIoIiVzOiBpc19jdXN0b21fc3RlcmVvX29uICVkLCBmbGFnICVkXG4iLAotCQkJX19mdW5jX18sIGlzX2N1c3RvbV9zdGVyZW9fb24sIGZsYWcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaXNfY3VzdG9tX3N0ZXJlb19vbiA9IGZsYWcgPyB0cnVlIDogZmFsc2U7Ci0JcHJfZGVidWcoIiVzOmlzX2N1c3RvbV9zdGVyZW9fb24gJWRcbiIsIF9fZnVuY19fLCBpc19jdXN0b21fc3RlcmVvX29uKTsKLQlmb3IgKGJlX2luZGV4ID0gMDsgYmVfaW5kZXggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pbmRleCsrKSB7Ci0JCXBvcnRfaWQgPSBtc21fYmVkYWlzW2JlX2luZGV4XS5wb3J0X2lkOwotCQlpZiAoIW1zbV9iZWRhaXNbYmVfaW5kZXhdLmFjdGl2ZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKHBvcnRfaWQgIT0gU0xJTUJVU18wX1JYKSAmJgotCQkgICAgIChwb3J0X2lkICE9IFJUX1BST1hZX1BPUlRfMDAxX1JYKSAmJgotCQkJKHBvcnRfaWQgIT0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYKSAmJgotCQkJKHBvcnRfaWQgIT0gQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYKSkKLQkJCWNvbnRpbnVlOwotCi0JCWZvcl9lYWNoX3NldF9iaXQoaSwgJm1zbV9iZWRhaXNbYmVfaW5kZXhdLmZlX3Nlc3Npb25zWzBdLAotCQkJCU1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQkJaWYgKGZlX2RhaV9tYXBbaV1bU0VTU0lPTl9UWVBFX1JYXS5wZXJmX21vZGUgIT0KLQkJCSAgICBMRUdBQ1lfUENNX01PREUpCi0JCQkJZ290byBza2lwX3NlbmRfY3VzdG9tX3N0ZXJlbzsKLQkJCXNlc3Npb25faWQgPQotCQkJCWZlX2RhaV9tYXBbaV1bU0VTU0lPTl9UWVBFX1JYXS5zdHJtX2lkOwotCQkJaWYgKGlzX2N1c3RvbV9zdGVyZW9fb24pIHsKLQkJCQlvcF9GTF9pcF9GTF93ZWlnaHQgPQotCQkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkU7Ci0JCQkJb3BfRkxfaXBfRlJfd2VpZ2h0ID0KLQkJCQkJUTE0X0dBSU5fWkVST19QT0lOVF9GSVZFOwotCQkJCW9wX0ZSX2lwX0ZMX3dlaWdodCA9Ci0JCQkJCVExNF9HQUlOX1pFUk9fUE9JTlRfRklWRTsKLQkJCQlvcF9GUl9pcF9GUl93ZWlnaHQgPQotCQkJCQlRMTRfR0FJTl9aRVJPX1BPSU5UX0ZJVkU7Ci0JCQl9IGVsc2UgewotCQkJCW9wX0ZMX2lwX0ZMX3dlaWdodCA9IFExNF9HQUlOX1VOSVRZOwotCQkJCW9wX0ZMX2lwX0ZSX3dlaWdodCA9IDA7Ci0JCQkJb3BfRlJfaXBfRkxfd2VpZ2h0ID0gMDsKLQkJCQlvcF9GUl9pcF9GUl93ZWlnaHQgPSBRMTRfR0FJTl9VTklUWTsKLQkJCX0KLQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgewotCQkJCXVuc2lnbmVkIGxvbmcgY29wcCA9Ci0JCQkJCXNlc3Npb25fY29wcF9tYXBbaV0KLQkJCQkJW1NFU1NJT05fVFlQRV9SWF1bYmVfaW5kZXhdOwotCQkJCWlmICghdGVzdF9iaXQoaWR4LCAmY29wcCkpCi0JCQkJCWdvdG8gc2tpcF9zZW5kX2N1c3RvbV9zdGVyZW87Ci0JCQkJdG9wb19pZCA9IGFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfY29wcF9pZHgoCi0JCQkJCW1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsIGlkeCk7Ci0JCQkJaWYgKHRvcG9faWQgPCAwKQotCQkJCQlwcl9kZWJ1ZygiJXM6RXJyOmN1c3RvbSBzdGVyZW8gdG9wbyAlZCIsCi0JCQkJCQkgX19mdW5jX18sIHRvcG9faWQpOwotCQkJCQlwcl9kZWJ1ZygiaWR4ICVkXG4iLCBpZHgpOwotCQkJCWlmICh0b3BvX2lkID09IERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRCkKLQkJCQkJcmMgPSBtc21fZHMyX2RhcF9zZXRfY3VzdG9tX3N0ZXJlb19vbm9mZgotCQkJCQkJKG1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsCi0JCQkJCQlpZHgsIGlzX2N1c3RvbV9zdGVyZW9fb24pOwotCQkJCWVsc2UgaWYgKHRvcG9faWQgPT0gRE9MQllfQURNX0NPUFBfVE9QT0xPR1lfSUQpCi0JCQkJCXJjID0gZG9sYnlfZGFwX3NldF9jdXN0b21fc3RlcmVvX29ub2ZmKAotCQkJCQkJbXNtX2JlZGFpc1tiZV9pbmRleF0ucG9ydF9pZCwKLQkJCQkJCWlkeCwgaXNfY3VzdG9tX3N0ZXJlb19vbik7Ci0JCQkJZWxzZQotCQkJCXJjID0gbXNtX3F0aV9wcF9zZW5kX3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NtZAotCQkJCQkJKG1zbV9iZWRhaXNbYmVfaW5kZXhdLnBvcnRfaWQsCi0JCQkJCQlpZHgsIHNlc3Npb25faWQsCi0JCQkJCQlvcF9GTF9pcF9GTF93ZWlnaHQsCi0JCQkJCQlvcF9GTF9pcF9GUl93ZWlnaHQsCi0JCQkJCQlvcF9GUl9pcF9GTF93ZWlnaHQsCi0JCQkJCQlvcF9GUl9pcF9GUl93ZWlnaHQpOwotCQkJCWlmIChyYyA8IDApCi1za2lwX3NlbmRfY3VzdG9tX3N0ZXJlbzoKLQkJCQkJcHJfZXJyKCIlczogZXJyIHNldHRpbmcgY3VzdG9tIHN0ZXJlb1xuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCX0KLQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiU2V0IEN1c3RvbSBTdGVyZW8gT25PZmYiLCBTTkRfU09DX05PUE0sIDAsCi0JMSwgMCwgbXNtX3JvdXRpbmdfZ2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2wsCi0JbXNtX3JvdXRpbmdfcHV0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2wpLAotfTsKLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfYXBwX3R5cGVfY2ZnX2NvbnRyb2woc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2FwcF90eXBlX2NmZ19jb250cm9sKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpID0gMCwgajsKLQlpbnQgbnVtX2FwcF90eXBlcyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCW1lbXNldChhcHBfdHlwZV9jZmcsIDAsIE1BWF9BUFBfVFlQRVMqCi0JCQkJc2l6ZW9mKHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYXBwX3R5cGVfZGF0YSkpOwotCWlmIChudW1fYXBwX3R5cGVzID4gTUFYX0FQUF9UWVBFUykgewotCQlwcl9lcnIoIiVzOiBudW1iZXIgb2YgYXBwIHR5cGVzIGV4Y2VlZCB0aGUgbWF4IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWZvciAoaiA9IDA7IGogPCBudW1fYXBwX3R5cGVzOyBqKyspIHsKLQkJYXBwX3R5cGVfY2ZnW2pdLmFwcF90eXBlID0KLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpKytdOwotCQlhcHBfdHlwZV9jZmdbal0uc2FtcGxlX3JhdGUgPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107Ci0JCWFwcF90eXBlX2NmZ1tqXS5iaXRfd2lkdGggPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2FwcF90eXBlX2dhaW5fY29udHJvbChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaiwgZmVfaWQsIGJlX2lkLCBwb3J0X3R5cGU7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBjb3BwOwotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICpiZWRhaTsKLQlpbnQgZGlyID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPyBTRVNTSU9OX1RZUEVfVFggOgotCQkJCQkJICAgICBTRVNTSU9OX1RZUEVfUlg7Ci0JaW50IGFwcF90eXBlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JaW50IGdhaW4gPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl0gKwotCQkgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10pLzI7Ci0KLQlwb3J0X3R5cGUgPSAoZGlyID09IFNFU1NJT05fVFlQRV9SWCkgPyBNU01fQUZFX1BPUlRfVFlQRV9SWCA6Ci0JCQkJCSAgICAgICBNU01fQUZFX1BPUlRfVFlQRV9UWDsKLQotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0JZm9yIChiZV9pZCA9IDA7IGJlX2lkIDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgYmVfaWQrKykgewotCQlpZiAoaXNfYmVfZGFpX2V4dHByb2MoYmVfaWQpKQotCQkJY29udGludWU7Ci0KLQkJYmVkYWkgPSAmbXNtX2JlZGFpc1tiZV9pZF07Ci0JCWlmIChhZmVfZ2V0X3BvcnRfdHlwZShiZWRhaS0+cG9ydF9pZCkgIT0gcG9ydF90eXBlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFiZWRhaS0+YWN0aXZlKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChmZV9pZCA9IDA7IGZlX2lkIDwgTVNNX0ZST05URU5EX0RBSV9NQVg7IGZlX2lkKyspIHsKLQkJCWlmICghdGVzdF9iaXQoZmVfaWQsICZiZWRhaS0+ZmVfc2Vzc2lvbnNbMF0pKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoYXBwX3R5cGUgIT0KLQkJCSAgICBmZV9kYWlfYXBwX3R5cGVfY2ZnW2ZlX2lkXVtkaXJdW2JlX2lkXS5hcHBfdHlwZSkKLQkJCQljb250aW51ZTsKLQotCQkJY29wcCA9IHNlc3Npb25fY29wcF9tYXBbZmVfaWRdW2Rpcl1bYmVfaWRdOwotCQkJZm9yIChqID0gMDsgaiA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaisrKSB7Ci0JCQkJaWYgKCF0ZXN0X2JpdChqLCAmY29wcCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXJldCB8PSBhZG1fc2V0X3ZvbHVtZShiZWRhaS0+cG9ydF9pZCwgaiwgZ2Fpbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCXJldHVybiByZXQgPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFwcF90eXBlX2NmZ19jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJBcHAgVHlwZSBDb25maWciLCBTTkRfU09DX05PUE0sIDAsCi0JMHhGRkZGRkZGRiwgMCwgMTI4LCBtc21fcm91dGluZ19nZXRfYXBwX3R5cGVfY2ZnX2NvbnRyb2wsCi0JbXNtX3JvdXRpbmdfcHV0X2FwcF90eXBlX2NmZ19jb250cm9sKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiQXBwIFR5cGUgR2FpbiIsIFNORF9TT0NfTk9QTSwgMCwKLQkweDIwMDAsIDAsIDQsIE5VTEwsIG1zbV9yb3V0aW5nX3B1dF9hcHBfdHlwZV9nYWluX2NvbnRyb2wpCi19OwotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX2dldF9sc21fYXBwX3R5cGVfY2ZnX2NvbnRyb2woCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfbHNtX2FwcF90eXBlX2NmZ19jb250cm9sKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGkgPSAwLCBqOwotCWludCBudW1fYXBwX3R5cGVzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaSsrXTsKLQotCW1lbXNldChsc21fYXBwX3R5cGVfY2ZnLCAwLCBNQVhfQVBQX1RZUEVTKgotCQkJCXNpemVvZihzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2FwcF90eXBlX2RhdGEpKTsKLQlpZiAobnVtX2FwcF90eXBlcyA+IE1BWF9BUFBfVFlQRVMpIHsKLQkJcHJfZXJyKCIlczogbnVtYmVyIG9mIGFwcCB0eXBlcyBleGNlZWQgdGhlIG1heCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlmb3IgKGogPSAwOyBqIDwgbnVtX2FwcF90eXBlczsgaisrKSB7Ci0JCWxzbV9hcHBfdHlwZV9jZmdbal0uYXBwX3R5cGUgPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107Ci0JCWxzbV9hcHBfdHlwZV9jZmdbal0uc2FtcGxlX3JhdGUgPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2krK107Ci0JCWxzbV9hcHBfdHlwZV9jZmdbal0uYml0X3dpZHRoID0KLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpKytdOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbHNtX2FwcF90eXBlX2NmZ19jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJMaXN0ZW4gQXBwIFR5cGUgQ29uZmlnIiwgU05EX1NPQ19OT1BNLCAwLAotCTB4RkZGRkZGRkYsIDAsIDEyOCwgbXNtX3JvdXRpbmdfZ2V0X2xzbV9hcHBfdHlwZV9jZmdfY29udHJvbCwKLQltc21fcm91dGluZ19wdXRfbHNtX2FwcF90eXBlX2NmZ19jb250cm9sKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfZ2V0X3VzZV9kczFfb3JfZHMyX2NvbnRyb2woCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGlzX2RzMl9vbjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19wdXRfdXNlX2RzMV9vcl9kczJfY29udHJvbCgKLQkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWlzX2RzMl9vbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdXNlX2RzMV9vcl9kczJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiRFMyIE9uT2ZmIiwgU05EX1NPQ19OT1BNLCAwLAotCTEsIDAsIG1zbV9yb3V0aW5nX2dldF91c2VfZHMxX29yX2RzMl9jb250cm9sLAotCW1zbV9yb3V0aW5nX3B1dF91c2VfZHMxX29yX2RzMl9jb250cm9sKSwKLX07Ci0KLWludCBtc21fcm91dGluZ19nZXRfcm1zX3ZhbHVlX2NvbnRyb2woc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpIHsKLQlpbnQgcmMgPSAwOwotCWludCBiZV9pZHggPSAwOwotCWNoYXIgKnBhcmFtX3ZhbHVlOwotCWludCAqdXBkYXRlX3BhcmFtX3ZhbHVlOwotCXVpbnQzMl90IHBhcmFtX2xlbmd0aCA9IHNpemVvZih1aW50MzJfdCk7Ci0JdWludDMyX3QgcGFyYW1fcGF5bG9hZF9sZW4gPSBSTVNfUEFZTE9BRF9MRU4gKiBzaXplb2YodWludDMyX3QpOwotCi0JcGFyYW1fdmFsdWUgPSBremFsbG9jKHBhcmFtX2xlbmd0aCArIHBhcmFtX3BheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhcmFtX3ZhbHVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoYmVfaWR4ID0gMDsgYmVfaWR4IDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgYmVfaWR4KyspCi0JCWlmIChtc21fYmVkYWlzW2JlX2lkeF0ucG9ydF9pZCA9PSBTTElNQlVTXzBfVFgpCi0JCQlicmVhazsKLQlpZiAoKGJlX2lkeCA8IE1TTV9CQUNLRU5EX0RBSV9NQVgpICYmIG1zbV9iZWRhaXNbYmVfaWR4XS5hY3RpdmUpIHsKLQkJcmMgPSBhZG1fZ2V0X3BhcmFtcyhTTElNQlVTXzBfVFgsIDAsCi0JCQkJUk1TX01PRFVMRUlEX0FQUElfUEFTU1RIUlUsCi0JCQkJUk1TX1BBUkFNX0ZJUlNUX1NBTVBMRSwKLQkJCQlwYXJhbV9sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKLQkJCQlwYXJhbV92YWx1ZSk7Ci0JCWlmIChyYykgewotCQkJcHJfZXJyKCIlczogZ2V0IHBhcmFtZXRlcnMgZmFpbGVkOiVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQkJa2ZyZWUocGFyYW1fdmFsdWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJdXBkYXRlX3BhcmFtX3ZhbHVlID0gKGludCAqKXBhcmFtX3ZhbHVlOwotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHVwZGF0ZV9wYXJhbV92YWx1ZVswXTsKLQotCQlwcl9kZWJ1ZygiJXM6IEZST00gRFNQIHZhbHVlWzBdIDB4JXhcbiIsCi0JCQkgIF9fZnVuY19fLCB1cGRhdGVfcGFyYW1fdmFsdWVbMF0pOwotCX0KLQlrZnJlZShwYXJhbV92YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvY19zZXNzaW9uX2lkX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXZvY19zZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IHZvY19zZXNzaW9uX2lkPSV1XG4iLCBfX2Z1bmNfXywgdm9jX3Nlc3Npb25faWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvY19zZXNzaW9uX2lkX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdm9jX3Nlc3Npb25faWQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV92b2Nfc2Vzc2lvbl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2MgVlNJRCIsIFNORF9TT0NfTk9QTSwgMCwKLQkJCSAgICAgMHhGRkZGRkZGRiwgMCwgMSwgbXNtX3ZvY19zZXNzaW9uX2lkX2dldCwKLQkJCSAgICAgbXNtX3ZvY19zZXNzaW9uX2lkX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9zb3VuZF9mb2N1c19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTOwotCXVpbmZvLT5jb3VudCA9IHNpemVvZihzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX3NvdW5kX2ZvY3VzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YTsKLQotCW1lbWNweSgodm9pZCAqKSZzb3VuZEZvY3VzRGF0YSwgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsCi0JCXNpemVvZihzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0pKTsKLQlyZXQgPSB2b2Nfc2V0X3NvdW5kX2ZvY3VzKHNvdW5kRm9jdXNEYXRhKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yIHNldHRpbmcgU291bmQgRm9jdXMgUGFyYW1zLCBlcnI9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fdm9pY2Vfc291bmRfZm9jdXNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhOwotCi0JbWVtc2V0KCZzb3VuZEZvY3VzRGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSkpOwotCi0JcmV0ID0gdm9jX2dldF9zb3VuZF9mb2N1cygmc291bmRGb2N1c0RhdGEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgZ2V0dGluZyBTb3VuZCBGb2N1cyBQYXJhbXMsIGVycj0lZFxuIiwKLQkJCSAgX19mdW5jX18sIHJldCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsICh2b2lkICopJnNvdW5kRm9jdXNEYXRhLAotCQlzaXplb2Yoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtKSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fc291cmNlX3RyYWNraW5nX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTOwotCXVpbmZvLT5jb3VudCA9IHNpemVvZihzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV9zb3VyY2VfdHJhY2tpbmdfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSBzb3VyY2VUcmFja2luZ0RhdGE7Ci0KLQltZW1zZXQoJnNvdXJjZVRyYWNraW5nRGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBzb3VyY2VfdHJhY2tpbmdfcGFyYW0pKTsKLQotCXJldCA9IHZvY19nZXRfc291cmNlX3RyYWNraW5nKCZzb3VyY2VUcmFja2luZ0RhdGEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgZ2V0dGluZyBTb3VyY2UgVHJhY2tpbmcgUGFyYW1zLCBlcnI9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAodm9pZCAqKSZzb3VyY2VUcmFja2luZ0RhdGEsCi0JCXNpemVvZihzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtKSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXVkaW9fZ2V0X2NvcHBfaWR4X2Zyb21fcG9ydF9pZChpbnQgcG9ydF9pZCwgaW50IHNlc3Npb25fdHlwZSwKLQkJCQkJIGludCAqY29wcF9pZHgpCi17Ci0JaW50IGksIGlkeCwgYmVfaWR4OwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgY29wcDsKLQotCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQ9JWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0IHZhbGlkYXRpb24gZmFpbGVkIGlkIDB4JXggcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWZvciAoYmVfaWR4ID0gMDsgYmVfaWR4IDwgTVNNX0JBQ0tFTkRfREFJX01BWDsgYmVfaWR4KyspIHsKLQkJaWYgKG1zbV9iZWRhaXNbYmVfaWR4XS5wb3J0X2lkID09IHBvcnRfaWQpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGJlX2lkeCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgYmUgaWQgJWRcbiIsIF9fZnVuY19fLCBiZV9pZHgpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlmb3JfZWFjaF9zZXRfYml0KGksICZtc21fYmVkYWlzW2JlX2lkeF0uZmVfc2Vzc2lvbnNbMF0sCi0JCQkgTVNNX0ZST05URU5EX0RBSV9NTV9TSVpFKSB7Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgewotCQkJY29wcCA9IHNlc3Npb25fY29wcF9tYXBbaV0KLQkJCQlbc2Vzc2lvbl90eXBlXVtiZV9pZHhdOwotCQkJaWYgKHRlc3RfYml0KGlkeCwgJmNvcHApKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKQotCQkJY29udGludWU7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQlpZiAoaSA+PSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBGRSwgZXhpdGluZ1xuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JKmNvcHBfaWR4ID0gaWR4OwotCXByX2RlYnVnKCIlczogY29wcF9pZHg9JWRcbiIsIF9fZnVuY19fLCAqY29wcF9pZHgpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2Rlcml2ZV9wb3J0X2lkKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICAgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgKnBvcnRfaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyLCBwcmVmaXg6JXNcbiIsIF9fZnVuY19fLCBwcmVmaXgpOwotCi0JLyoKLQkgKiBNaXhlciBjb250cm9sIG5hbWUgd2lsbCBiZSBsaWtlICJTb3VuZCBGb2N1cyBBdWRpbyBUeCBTTElNQlVTXzAiCi0JICogd2hlcmUgdGhlIHByZWZpeCBpcyAiU291bmQgRm9jdXMgQXVkaW8gVHggIi4gU2tpcCB0aGUgcHJlZml4Ci0JICogYW5kIGNvbXBhcmUgdGhlIHN0cmluZyB3aXRoIHRoZSBiYWNrZW5kIG5hbWUgdG8gZGVyaXZlIHRoZSBwb3J0IGlkLgotCSAqLwotCWlmICghc3RyY21wKGtjb250cm9sLT5pZC5uYW1lICsgc3RybGVuKHByZWZpeCksCi0JCQkJCSJTTElNQlVTXzAiKSkgewotCQkqcG9ydF9pZCA9IFNMSU1CVVNfMF9UWDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUgKyBzdHJsZW4ocHJlZml4KSwKLQkJCQkJIlRFUlRfTUkyUyIpKSB7Ci0JCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa2NvbnRyb2wtPmlkLm5hbWUgKyBzdHJsZW4ocHJlZml4KSwKLQkJCQkJIklOVDNfTUkyUyIpKSB7Ci0JCSpwb3J0X2lkID0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IG1peGVyIGN0bCBuYW1lPSVzLCBjb3VsZCBub3QgZGVyaXZlIHZhbGlkIHBvcnQgaWRcbiIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBtaXhlciBjdGwgbmFtZT0lcywgZGVyaXZlZCBwb3J0X2lkPSVkXG4iLAotCQkgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSwgKnBvcnRfaWQpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSBzb3VuZEZvY3VzRGF0YTsKLQlpbnQgcG9ydF9pZCwgY29wcF9pZHg7Ci0KLQlyZXQgPSBtc21fYXVkaW9fc291bmRfZm9jdXNfZGVyaXZlX3BvcnRfaWQoa2NvbnRyb2wsCi0JCQkJIlNvdW5kIEZvY3VzIEF1ZGlvIFR4ICIsICZwb3J0X2lkKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gZGVyaXZpbmcgcG9ydCBpZCwgZXJyPSVkXG4iLAotCQkJICBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gbXNtX2F1ZGlvX2dldF9jb3BwX2lkeF9mcm9tX3BvcnRfaWQocG9ydF9pZCwgU0VTU0lPTl9UWVBFX1RYLAotCQkJCQkgICAgJmNvcHBfaWR4KTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY29wcCBpZHggZm9yIHBvcnRfaWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW1lbWNweSgodm9pZCAqKSZzb3VuZEZvY3VzRGF0YSwgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsCi0JCXNpemVvZihzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0pKTsKLQotCXJldCA9IGFkbV9zZXRfc291bmRfZm9jdXMocG9ydF9pZCwgY29wcF9pZHgsIHNvdW5kRm9jdXNEYXRhKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yIHNldHRpbmcgU291bmQgRm9jdXMgUGFyYW1zLCBlcnI9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXVkaW9fc291bmRfZm9jdXNfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGE7Ci0JaW50IHBvcnRfaWQsIGNvcHBfaWR4OwotCi0JcmV0ID0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2Rlcml2ZV9wb3J0X2lkKGtjb250cm9sLAotCQkJCSJTb3VuZCBGb2N1cyBBdWRpbyBUeCAiLCAmcG9ydF9pZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBkZXJpdmluZyBwb3J0IGlkLCBlcnI9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBtc21fYXVkaW9fZ2V0X2NvcHBfaWR4X2Zyb21fcG9ydF9pZChwb3J0X2lkLCBTRVNTSU9OX1RZUEVfVFgsCi0JCQkJCSAgICAmY29wcF9pZHgpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBjb3BwIGlkeCBmb3IgcG9ydF9pZD0lZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gYWRtX2dldF9zb3VuZF9mb2N1cyhwb3J0X2lkLCBjb3BwX2lkeCwgJnNvdW5kRm9jdXNEYXRhKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgU291bmQgRm9jdXMgUGFyYW1zLCBlcnI9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltZW1jcHkodWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsICh2b2lkICopJnNvdW5kRm9jdXNEYXRhLAotCQlzaXplb2Yoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtKSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXVkaW9fc291cmNlX3RyYWNraW5nX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSBzb3VyY2VUcmFja2luZ0RhdGE7Ci0JaW50IHBvcnRfaWQsIGNvcHBfaWR4OwotCi0JcmV0ID0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2Rlcml2ZV9wb3J0X2lkKGtjb250cm9sLAotCQkJCSJTb3VyY2UgVHJhY2tpbmcgQXVkaW8gVHggIiwgJnBvcnRfaWQpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gZGVyaXZpbmcgcG9ydCBpZCwgZXJyPSVkXG4iLAotCQkJICBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gbXNtX2F1ZGlvX2dldF9jb3BwX2lkeF9mcm9tX3BvcnRfaWQocG9ydF9pZCwgU0VTU0lPTl9UWVBFX1RYLAotCQkJCQkgICAgJmNvcHBfaWR4KTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBnZXQgY29wcCBpZHggZm9yIHBvcnRfaWQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGFkbV9nZXRfc291cmNlX3RyYWNraW5nKHBvcnRfaWQsIGNvcHBfaWR4LCAmc291cmNlVHJhY2tpbmdEYXRhKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgU291cmNlIFRyYWNraW5nIFBhcmFtcywgZXJyPSVkXG4iLAotCQkJICBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCAodm9pZCAqKSZzb3VyY2VUcmFja2luZ0RhdGEsCi0JCXNpemVvZihzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtKSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9zb3VyY2VfdHJhY2tpbmdfY29udHJvbHNbXSA9IHsKLQl7Ci0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUJPSAiU291bmQgRm9jdXMgVm9pY2UgVHggU0xJTUJVU18wIiwKLQkJLmluZm8JPSBtc21fc291bmRfZm9jdXNfaW5mbywKLQkJLmdldAk9IG1zbV92b2ljZV9zb3VuZF9mb2N1c19nZXQsCi0JCS5wdXQJPSBtc21fdm9pY2Vfc291bmRfZm9jdXNfcHV0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZQk9ICJTb3VyY2UgVHJhY2tpbmcgVm9pY2UgVHggU0xJTUJVU18wIiwKLQkJLmluZm8JPSBtc21fc291cmNlX3RyYWNraW5nX2luZm8sCi0JCS5nZXQJPSBtc21fdm9pY2Vfc291cmNlX3RyYWNraW5nX2dldCwKLQl9LAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZQk9ICJTb3VuZCBGb2N1cyBBdWRpbyBUeCBTTElNQlVTXzAiLAotCQkuaW5mbwk9IG1zbV9zb3VuZF9mb2N1c19pbmZvLAotCQkuZ2V0CT0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX2dldCwKLQkJLnB1dAk9IG1zbV9hdWRpb19zb3VuZF9mb2N1c19wdXQsCi0JfSwKLQl7Ci0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lCT0gIlNvdXJjZSBUcmFja2luZyBBdWRpbyBUeCBTTElNQlVTXzAiLAotCQkuaW5mbwk9IG1zbV9zb3VyY2VfdHJhY2tpbmdfaW5mbywKLQkJLmdldAk9IG1zbV9hdWRpb19zb3VyY2VfdHJhY2tpbmdfZ2V0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lCT0gIlNvdW5kIEZvY3VzIFZvaWNlIFR4IFRFUlRfTUkyUyIsCi0JCS5pbmZvCT0gbXNtX3NvdW5kX2ZvY3VzX2luZm8sCi0JCS5nZXQJPSBtc21fdm9pY2Vfc291bmRfZm9jdXNfZ2V0LAotCQkucHV0CT0gbXNtX3ZvaWNlX3NvdW5kX2ZvY3VzX3B1dCwKLQl9LAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUJPSAiU291cmNlIFRyYWNraW5nIFZvaWNlIFR4IFRFUlRfTUkyUyIsCi0JCS5pbmZvCT0gbXNtX3NvdXJjZV90cmFja2luZ19pbmZvLAotCQkuZ2V0CT0gbXNtX3ZvaWNlX3NvdXJjZV90cmFja2luZ19nZXQsCi0JfSwKLQl7Ci0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUJPSAiU291bmQgRm9jdXMgQXVkaW8gVHggVEVSVF9NSTJTIiwKLQkJLmluZm8JPSBtc21fc291bmRfZm9jdXNfaW5mbywKLQkJLmdldAk9IG1zbV9hdWRpb19zb3VuZF9mb2N1c19nZXQsCi0JCS5wdXQJPSBtc21fYXVkaW9fc291bmRfZm9jdXNfcHV0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZQk9ICJTb3VyY2UgVHJhY2tpbmcgQXVkaW8gVHggVEVSVF9NSTJTIiwKLQkJLmluZm8JPSBtc21fc291cmNlX3RyYWNraW5nX2luZm8sCi0JCS5nZXQJPSBtc21fYXVkaW9fc291cmNlX3RyYWNraW5nX2dldCwKLQl9LAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZQk9ICJTb3VuZCBGb2N1cyBWb2ljZSBUeCBJTlQzX01JMlMiLAotCQkuaW5mbwk9IG1zbV9zb3VuZF9mb2N1c19pbmZvLAotCQkuZ2V0CT0gbXNtX3ZvaWNlX3NvdW5kX2ZvY3VzX2dldCwKLQkJLnB1dAk9IG1zbV92b2ljZV9zb3VuZF9mb2N1c19wdXQsCi0JfSwKLQl7Ci0JCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKLQkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lCT0gIlNvdXJjZSBUcmFja2luZyBWb2ljZSBUeCBJTlQzX01JMlMiLAotCQkuaW5mbwk9IG1zbV9zb3VyY2VfdHJhY2tpbmdfaW5mbywKLQkJLmdldAk9IG1zbV92b2ljZV9zb3VyY2VfdHJhY2tpbmdfZ2V0LAotCX0sCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmlmYWNlCT0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lCT0gIlNvdW5kIEZvY3VzIEF1ZGlvIFR4IElOVDNfTUkyUyIsCi0JCS5pbmZvCT0gbXNtX3NvdW5kX2ZvY3VzX2luZm8sCi0JCS5nZXQJPSBtc21fYXVkaW9fc291bmRfZm9jdXNfZ2V0LAotCQkucHV0CT0gbXNtX2F1ZGlvX3NvdW5kX2ZvY3VzX3B1dCwKLQl9LAotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAotCQkuaWZhY2UJPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUJPSAiU291cmNlIFRyYWNraW5nIEF1ZGlvIFR4IElOVDNfTUkyUyIsCi0JCS5pbmZvCT0gbXNtX3NvdXJjZV90cmFja2luZ19pbmZvLAotCQkuZ2V0CT0gbXNtX2F1ZGlvX3NvdXJjZV90cmFja2luZ19nZXQsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgc3Brcl9wcm90X3B1dF92aV9sY2hfcG9ydChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaXRlbTsKLQlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQlwcl9kZWJ1ZygiJXMgaXRlbSBpcyAlZFxuIiwgX19mdW5jX18sCi0JCSAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCW11dGV4X2xvY2soJnJvdXRpbmdfbG9jayk7Ci0JaXRlbSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JaWYgKGl0ZW0gPCBlLT5pdGVtcykgewotCQlwcl9kZWJ1ZygiJXMgUlggREFJIElEICVkIFRYIERBSSBpZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBlLT5zaGlmdF9sLCBlLT52YWx1ZXNbaXRlbV0pOwotCQlpZiAoZS0+c2hpZnRfbCA8IE1TTV9CQUNLRU5EX0RBSV9NQVggJiYKLQkJCWUtPnZhbHVlc1tpdGVtXSA8IE1TTV9CQUNLRU5EX0RBSV9NQVgpCi0JCQkvKiBFbmFibGUgZmVlZGJhY2sgVFggcGF0aCAqLwotCQkJcmV0ID0gYWZlX3Nwa19wcm90X2ZlZWRfYmFja19jZmcoCi0JCQkgICBtc21fYmVkYWlzW2UtPnZhbHVlc1tpdGVtXV0ucG9ydF9pZCwKLQkJCSAgIG1zbV9iZWRhaXNbZS0+c2hpZnRfbF0ucG9ydF9pZCwgMSwgMCwgMSk7Ci0JCWVsc2UgewotCQkJcHJfZGVidWcoIiVzIHZhbHVlcyBhcmUgb3V0IG9mIHJhbmdlIGl0ZW0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgZS0+dmFsdWVzW2l0ZW1dKTsKLQkJCS8qIERpc2FibGUgZmVlZGJhY2sgVFggcGF0aCAqLwotCQkJaWYgKGUtPnZhbHVlc1tpdGVtXSA9PSBNU01fQkFDS0VORF9EQUlfTUFYKQotCQkJCXJldCA9IGFmZV9zcGtfcHJvdF9mZWVkX2JhY2tfY2ZnKDAsIDAsIDAsIDAsIDApOwotCQkJZWxzZQotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzIGl0ZW0gdmFsdWUgaXMgb3V0IG9mIHJhbmdlIGl0ZW1cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3Brcl9wcm90X3B1dF92aV9yY2hfcG9ydChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGl0ZW07Ci0Jc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCi0JcHJfZGVidWcoIiVzIGl0ZW0gaXMgJWRcbiIsIF9fZnVuY19fLAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlpdGVtID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKLQlpZiAoaXRlbSA8IGUtPml0ZW1zKSB7Ci0JCXByX2RlYnVnKCIlcyBSWCBEQUkgSUQgJWQgVFggREFJIGlkICVkXG4iLAotCQkJCV9fZnVuY19fLCBlLT5zaGlmdF9sLCBlLT52YWx1ZXNbaXRlbV0pOwotCQlpZiAoZS0+c2hpZnRfbCA8IE1TTV9CQUNLRU5EX0RBSV9NQVggJiYKLQkJCQllLT52YWx1ZXNbaXRlbV0gPCBNU01fQkFDS0VORF9EQUlfTUFYKQotCQkJLyogRW5hYmxlIGZlZWRiYWNrIFRYIHBhdGggKi8KLQkJCXJldCA9IGFmZV9zcGtfcHJvdF9mZWVkX2JhY2tfY2ZnKAotCQkJCQltc21fYmVkYWlzW2UtPnZhbHVlc1tpdGVtXV0ucG9ydF9pZCwKLQkJCQkJbXNtX2JlZGFpc1tlLT5zaGlmdF9sXS5wb3J0X2lkLAotCQkJCQkxLCAxLCAxKTsKLQkJZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXMgdmFsdWVzIGFyZSBvdXQgb2YgcmFuZ2UgaXRlbSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGUtPnZhbHVlc1tpdGVtXSk7Ci0JCQkvKiBEaXNhYmxlIGZlZWRiYWNrIFRYIHBhdGggKi8KLQkJCWlmIChlLT52YWx1ZXNbaXRlbV0gPT0gTVNNX0JBQ0tFTkRfREFJX01BWCkKLQkJCQlyZXQgPSBhZmVfc3BrX3Byb3RfZmVlZF9iYWNrX2NmZygwLAotCQkJCQkJMCwgMCwgMCwgMCk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXMgaXRlbSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgaXRlbVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzcGtyX3Byb3RfZ2V0X3ZpX2xjaF9wb3J0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNwa3JfcHJvdF9nZXRfdmlfcmNoX3BvcnQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNsaW0wX3J4X3ZpX2ZiX3R4X2xjaF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlNMSU00X1RYIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbGltMF9yeF92aV9mYl90eF9yY2hfbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJTTElNNF9UWCIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWkyc19yeF92aV9mYl90eF9tdXhfdGV4dFtdID0gewotCSJaRVJPIiwgIlNFTkFSWV9UWCIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW50NF9taTJzX3J4X3ZpX2ZiX3R4X21vbm9fbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJJTlQ1X01JMlNfVFgiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludDRfbWkyc19yeF92aV9mYl90eF9zdGVyZW9fbXV4X3RleHRbXSA9IHsKLQkiWkVSTyIsICJJTlQ1X01JMlNfVFgiCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IHNsaW0wX3J4X3ZpX2ZiX3R4X2xjaF92YWx1ZVtdID0gewotCU1TTV9CQUNLRU5EX0RBSV9NQVgsIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY29uc3Qgc2xpbTBfcnhfdmlfZmJfdHhfcmNoX3ZhbHVlW10gPSB7Ci0JTVNNX0JBQ0tFTkRfREFJX01BWCwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWAotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb25zdCBtaTJzX3J4X3ZpX2ZiX3R4X3ZhbHVlW10gPSB7Ci0JTVNNX0JBQ0tFTkRfREFJX01BWCwgTVNNX0JBQ0tFTkRfREFJX1NFTkFSWV9NSTJTX1RYCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGNvbnN0IGludDRfbWkyc19yeF92aV9mYl90eF9tb25vX2NoX3ZhbHVlW10gPSB7Ci0JTVNNX0JBQ0tFTkRfREFJX01BWCwgTVNNX0JBQ0tFTkRfREFJX0lOVDVfTUkyU19UWAotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb25zdCBpbnQ0X21pMnNfcnhfdmlfZmJfdHhfc3RlcmVvX2NoX3ZhbHVlW10gPSB7Ci0JTVNNX0JBQ0tFTkRfREFJX01BWCwgTVNNX0JBQ0tFTkRfREFJX0lOVDVfTUkyU19UWAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBzbGltMF9yeF92aV9mYl9sY2hfbXV4X2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSgwLCBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLCAwLCAwLAotCUFSUkFZX1NJWkUoc2xpbTBfcnhfdmlfZmJfdHhfbGNoX211eF90ZXh0KSwKLQlzbGltMF9yeF92aV9mYl90eF9sY2hfbXV4X3RleHQsIHNsaW0wX3J4X3ZpX2ZiX3R4X2xjaF92YWx1ZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gc2xpbTBfcnhfdmlfZmJfcmNoX211eF9lbnVtID0KLQlTT0NfVkFMVUVfRU5VTV9ET1VCTEUoMCwgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwgMCwgMCwKLQlBUlJBWV9TSVpFKHNsaW0wX3J4X3ZpX2ZiX3R4X3JjaF9tdXhfdGV4dCksCi0Jc2xpbTBfcnhfdmlfZmJfdHhfcmNoX211eF90ZXh0LCBzbGltMF9yeF92aV9mYl90eF9yY2hfdmFsdWUpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG1pMnNfcnhfdmlfZmJfbXV4X2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSgwLCBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsIDAsIDAsCi0JQVJSQVlfU0laRShtaTJzX3J4X3ZpX2ZiX3R4X211eF90ZXh0KSwKLQltaTJzX3J4X3ZpX2ZiX3R4X211eF90ZXh0LCBtaTJzX3J4X3ZpX2ZiX3R4X3ZhbHVlKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBpbnQ0X21pMnNfcnhfdmlfZmJfbW9ub19jaF9tdXhfZW51bSA9Ci0JU09DX1ZBTFVFX0VOVU1fRE9VQkxFKDAsIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsIDAsIDAsCi0JQVJSQVlfU0laRShpbnQ0X21pMnNfcnhfdmlfZmJfdHhfbW9ub19tdXhfdGV4dCksCi0JaW50NF9taTJzX3J4X3ZpX2ZiX3R4X21vbm9fbXV4X3RleHQsCi0JaW50NF9taTJzX3J4X3ZpX2ZiX3R4X21vbm9fY2hfdmFsdWUpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGludDRfbWkyc19yeF92aV9mYl9zdGVyZW9fY2hfbXV4X2VudW0gPQotCVNPQ19WQUxVRV9FTlVNX0RPVUJMRSgwLCBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLCAwLCAwLAotCUFSUkFZX1NJWkUoaW50NF9taTJzX3J4X3ZpX2ZiX3R4X3N0ZXJlb19tdXhfdGV4dCksCi0JaW50NF9taTJzX3J4X3ZpX2ZiX3R4X3N0ZXJlb19tdXhfdGV4dCwKLQlpbnQ0X21pMnNfcnhfdmlfZmJfdHhfc3RlcmVvX2NoX3ZhbHVlKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNsaW0wX3J4X3ZpX2ZiX2xjaF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJTTElNMF9SWF9WSV9GQl9MQ0hfTVVYIiwKLQlzbGltMF9yeF92aV9mYl9sY2hfbXV4X2VudW0sIHNwa3JfcHJvdF9nZXRfdmlfbGNoX3BvcnQsCi0Jc3Brcl9wcm90X3B1dF92aV9sY2hfcG9ydCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltMF9yeF92aV9mYl9yY2hfbXV4ID0KLQlTT0NfREFQTV9FTlVNX0VYVCgiU0xJTTBfUlhfVklfRkJfUkNIX01VWCIsCi0Jc2xpbTBfcnhfdmlfZmJfcmNoX211eF9lbnVtLCBzcGtyX3Byb3RfZ2V0X3ZpX3JjaF9wb3J0LAotCXNwa3JfcHJvdF9wdXRfdmlfcmNoX3BvcnQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWkyc19yeF92aV9mYl9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJQUklfTUkyU19SWF9WSV9GQl9NVVgiLAotCW1pMnNfcnhfdmlfZmJfbXV4X2VudW0sIHNwa3JfcHJvdF9nZXRfdmlfbGNoX3BvcnQsCi0Jc3Brcl9wcm90X3B1dF92aV9sY2hfcG9ydCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnQ0X21pMnNfcnhfdmlfZmJfbW9ub19jaF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJJTlQ0X01JMlNfUlhfVklfRkJfTU9OT19DSF9NVVgiLAotCWludDRfbWkyc19yeF92aV9mYl9tb25vX2NoX211eF9lbnVtLCBzcGtyX3Byb3RfZ2V0X3ZpX2xjaF9wb3J0LAotCXNwa3JfcHJvdF9wdXRfdmlfbGNoX3BvcnQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW50NF9taTJzX3J4X3ZpX2ZiX3N0ZXJlb19jaF9tdXggPQotCVNPQ19EQVBNX0VOVU1fRVhUKCJJTlQ0X01JMlNfUlhfVklfRkJfU1RFUkVPX0NIX01VWCIsCi0JaW50NF9taTJzX3J4X3ZpX2ZiX3N0ZXJlb19jaF9tdXhfZW51bSwgc3Brcl9wcm90X2dldF92aV9yY2hfcG9ydCwKLQlzcGtyX3Byb3RfcHV0X3ZpX3JjaF9wb3J0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG1zbV9xZHNwNl93aWRnZXRzW10gPSB7Ci0JLyogRnJvbnRlbmQgQUlGICovCi0JLyogV2lkZ2V0IG5hbWUgZXF1YWxzIHRvIEZyb250LUVuZCBEQUkgbmFtZTxOZWVkIGNvbmZpcm1hdGlvbj4sCi0JICogU3RyZWFtIG5hbWUgbXVzdCBjb250YWlucyBzdWJzdHJpbmcgb2YgZnJvbnQtZW5kIGRhaSBuYW1lCi0JICovCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxIiwgIk11bHRpTWVkaWExIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwyIiwgIk11bHRpTWVkaWEyIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwzIiwgIk11bHRpTWVkaWEzIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw0IiwgIk11bHRpTWVkaWE0IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw1IiwgIk11bHRpTWVkaWE1IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw2IiwgIk11bHRpTWVkaWE2IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw3IiwgIk11bHRpTWVkaWE3IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw4IiwgIk11bHRpTWVkaWE4IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREw5IiwgIk11bHRpTWVkaWE5IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxMCIsICJNdWx0aU1lZGlhMTAgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJNTV9ETDExIiwgIk11bHRpTWVkaWExMSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMTIiLCAiTXVsdGlNZWRpYTEyIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxMyIsICJNdWx0aU1lZGlhMTMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJNTV9ETDE0IiwgIk11bHRpTWVkaWExNCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIk1NX0RMMTUiLCAiTXVsdGlNZWRpYTE1IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTU1fREwxNiIsICJNdWx0aU1lZGlhMTYgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJNTV9ETDIwIiwgIk11bHRpTWVkaWEyMCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPSVBfREwiLCAiVm9JUCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDEiLCAiTXVsdGlNZWRpYTEgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDIiLCAiTXVsdGlNZWRpYTIgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDMiLCAiTXVsdGlNZWRpYTMgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDQiLCAiTXVsdGlNZWRpYTQgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDUiLCAiTXVsdGlNZWRpYTUgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDYiLCAiTXVsdGlNZWRpYTYgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDgiLCAiTXVsdGlNZWRpYTggQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDkiLCAiTXVsdGlNZWRpYTkgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDEwIiwgIk11bHRpTWVkaWExMCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMTYiLCAiTXVsdGlNZWRpYTE2IENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTU1fVUwxNyIsICJNdWx0aU1lZGlhMTcgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNTV9VTDE4IiwgIk11bHRpTWVkaWExOCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1NX1VMMTkiLCAiTXVsdGlNZWRpYTE5IENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTU1fVUwyMCIsICJNdWx0aU1lZGlhMjAgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIkNTLVZPSUNFX0RMMSIsICJDUy1WT0lDRSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJDUy1WT0lDRV9VTDEiLCAiQ1MtVk9JQ0UgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPSUNFMl9ETCIsICJWb2ljZTIgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0UyX1VMIiwgIlZvaWNlMiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVm9MVEVfREwiLCAiVm9MVEUgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVm9MVEVfVUwiLCAiVm9MVEUgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZvV0xBTl9ETCIsICJWb1dMQU4gUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVm9XTEFOX1VMIiwgIlZvV0xBTiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlZPSVBfVUwiLCAiVm9JUCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVk9JQ0VNTU9ERTFfREwiLAotCQkiVm9pY2VNTW9kZTEgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0VNTU9ERTFfVUwiLAotCQkiVm9pY2VNTW9kZTEgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPSUNFTU1PREUyX0RMIiwKLQkJIlZvaWNlTU1vZGUyIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlZPSUNFTU1PREUyX1VMIiwKLQkJIlZvaWNlTU1vZGUyIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNMF9ETF9ITCIsICJTTElNQlVTMF9IT1NUTEVTUyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNMF9VTF9ITCIsICJTTElNQlVTMF9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIkNQRV9MU01fVUxfSEwiLCAiQ1BFIExTTSBjYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTTFfRExfSEwiLCAiU0xJTUJVUzFfSE9TVExFU1MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTTFfVUxfSEwiLCAiU0xJTUJVUzFfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU0zX0RMX0hMIiwgIlNMSU1CVVMzX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU0zX1VMX0hMIiwgIlNMSU1CVVMzX0hPU1RMRVNTIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNNF9ETF9ITCIsICJTTElNQlVTNF9IT1NUTEVTUyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNNF9VTF9ITCIsICJTTElNQlVTNF9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTTZfRExfSEwiLCAiU0xJTUJVUzZfSE9TVExFU1MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTTZfVUxfSEwiLCAiU0xJTUJVUzZfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU03X0RMX0hMIiwgIlNMSU1CVVM3X0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU03X1VMX0hMIiwgIlNMSU1CVVM3X0hPU1RMRVNTIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNOF9ETF9ITCIsICJTTElNQlVTOF9IT1NUTEVTUyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNOF9VTF9ITCIsICJTTElNQlVTOF9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiSU5URk1fRExfSEwiLCAiSU5UX0ZNX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIklOVEZNX1VMX0hMIiwgIklOVF9GTV9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiSU5USEZQX0RMX0hMIiwgIklOVF9IRlBfQlRfSE9TVExFU1MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5USEZQX1VMX0hMIiwgIklOVF9IRlBfQlRfSE9TVExFU1MgQ2FwdHVyZSIsCi0JMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVVNCQVVESU9fRExfSEwiLCAiVVNCQVVESU9fSE9TVExFU1MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVVNCQVVESU9fVUxfSEwiLCAiVVNCQVVESU9fSE9TVExFU1MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIkhETUlfRExfSEwiLCAiSERNSV9IT1NUTEVTUyBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19JMlNfRExfSEwiLCAiU0VDX0kyU19SWF9IT1NUTEVTUyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVDBfTUkyU19ETF9ITCIsCi0JCSJJTlQwIE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJJTlQ0X01JMlNfRExfSEwiLAotCQkiSU5UNCBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX01JMlNfRExfSEwiLAotCQkiUHJpbWFyeSBNSTJTX1JYIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX01JMlNfRExfSEwiLAotCQkiU2Vjb25kYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX01JMlNfRExfSEwiLAotCQkiVGVydGlhcnkgTUkyU19SWCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfTUkyU19ETF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IE1JMlNfUlggSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQotCVNORF9TT0NfREFQTV9BSUZfSU4oIkFVWFBDTV9ETF9ITCIsICJBVVhQQ01fSE9TVExFU1MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiQVVYUENNX1VMX0hMIiwgIkFVWFBDTV9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIk1JMlNfVUxfSEwiLCAiTUkyU19UWF9IT1NUTEVTUyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIklOVDNfTUkyU19VTF9ITCIsCi0JCSJJTlQzIE1JMlNfVFggSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX01JMlNfVUxfSEwiLAotCQkiVGVydGlhcnkgTUkyU19UWCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1VMX0hMIiwKLQkJIlNlY29uZGFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX01JMlNfVUxfSEwiLAotCQkiUHJpbWFyeSBNSTJTX1RYIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTUkyU19ETF9ITCIsICJNSTJTX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiRFRNRl9ETF9ITCIsICJEVE1GX1JYX0hPU1RMRVNTIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfTUkyU19VTF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IE1JMlNfVFggSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF8wX0RMX0hMIiwKLQkJIlByaW1hcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzBfVUxfSEwiLAotCQkiUHJpbWFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzFfRExfSEwiLAotCQkiUHJpbWFyeSBURE0xIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfMV9VTF9ITCIsCi0JCSJQcmltYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fUlhfMl9ETF9ITCIsCi0JCSJQcmltYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX1RETV9UWF8yX1VMX0hMIiwKLQkJIlByaW1hcnkgVERNMiBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF8zX0RMX0hMIiwKLQkJIlByaW1hcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzNfVUxfSEwiLAotCQkiUHJpbWFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzRfRExfSEwiLAotCQkiUHJpbWFyeSBURE00IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfNF9VTF9ITCIsCi0JCSJQcmltYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fUlhfNV9ETF9ITCIsCi0JCSJQcmltYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUFJJX1RETV9UWF81X1VMX0hMIiwKLQkJIlByaW1hcnkgVERNNSBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX1RETV9SWF82X0RMX0hMIiwKLQkJIlByaW1hcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfVERNX1RYXzZfVUxfSEwiLAotCQkiUHJpbWFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJQUklfVERNX1JYXzdfRExfSEwiLAotCQkiUHJpbWFyeSBURE03IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fVFhfN19VTF9ITCIsCi0JCSJQcmltYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMF9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzBfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMV9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzFfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfMl9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzJfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfM19ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzNfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNF9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzRfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNV9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzVfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfNl9ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzZfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fUlhfN19ETF9ITCIsCi0JCSJTZWNvbmRhcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1RYXzdfVUxfSEwiLAotCQkiU2Vjb25kYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzBfRExfSEwiLAotCQkiVGVydGlhcnkgVERNMCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8wX1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTAgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzFfRExfSEwiLAotCQkiVGVydGlhcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8xX1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTEgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzJfRExfSEwiLAotCQkiVGVydGlhcnkgVERNMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8yX1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzNfRExfSEwiLAotCQkiVGVydGlhcnkgVERNMyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF8zX1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTMgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzRfRExfSEwiLAotCQkiVGVydGlhcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF80X1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTQgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzVfRExfSEwiLAotCQkiVGVydGlhcnkgVERNNSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF81X1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzZfRExfSEwiLAotCQkiVGVydGlhcnkgVERNNiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF82X1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTYgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1JYXzdfRExfSEwiLAotCQkiVGVydGlhcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9UWF83X1VMX0hMIiwKLQkJIlRlcnRpYXJ5IFRETTcgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzBfRExfSEwiLAotCQkiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzBfVUxfSEwiLAotCQkiUXVhdGVybmFyeSBURE0wIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF8xX0RMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNMSBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF8xX1VMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNMSBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fUlhfMl9ETF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fVFhfMl9VTF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IFRETTIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzNfRExfSEwiLAotCQkiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzNfVUxfSEwiLAotCQkiUXVhdGVybmFyeSBURE0zIEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF80X0RMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNNCBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF80X1VMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNNCBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fUlhfNV9ETF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgUGxheWJhY2siLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fVFhfNV9VTF9ITCIsCi0JCSJRdWF0ZXJuYXJ5IFRETTUgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1JYXzZfRExfSEwiLAotCQkiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1RYXzZfVUxfSEwiLAotCQkiUXVhdGVybmFyeSBURE02IEhvc3RsZXNzIENhcHR1cmUiLAotCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9SWF83X0RMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNNyBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9UWF83X1VMX0hMIiwKLQkJIlF1YXRlcm5hcnkgVERNNyBIb3N0bGVzcyBDYXB0dXJlIiwKLQkJMCwgMCwgMCwgMCksCi0KLQkvKiBMU00gKi8KLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNMV9VTF9ITCIsICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJICAgICAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNMl9VTF9ITCIsICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJICAgICAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNM19VTF9ITCIsICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJCSAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiTFNNNF9VTF9ITCIsICJMaXN0ZW4gNCBBdWRpbyBTZXJ2aWNlIENhcHR1cmUiLAotCQkJCQkJIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU001X1VMX0hMIiwgIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkJIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU002X1VMX0hMIiwgIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkJIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU003X1VMX0hMIiwgIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkJIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJMU004X1VMX0hMIiwgIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UgQ2FwdHVyZSIsCi0JCQkgICAgIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFDSEFUX0RMIiwgIlFDSEFUIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFDSEFUX1VMIiwgIlFDSEFUIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQkvKiBCYWNrZW5kIEFJRiAqLwotCS8qIFN0cmVhbSBuYW1lIGVxdWFscyB0byBiYWNrZW5kIGRhaSBsaW5rIHN0cmVhbSBuYW1lICovCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9JMlNfUlgiLCAiUHJpbWFyeSBJMlMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX0kyU19SWCIsICJTZWNvbmRhcnkgSTJTIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU1BESUZfUlgiLCAiU1BESUYgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU18wX1JYIiwgIlNsaW1idXMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU18yX1JYIiwgIlNsaW1idXMyIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfNV9SWCIsICJTbGltYnVzNSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJIRE1JIiwgIkhETUkgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiRElTUExBWV9QT1JUIiwgIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCi0JCQkgICAgIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJNSTJTX1JYIiwgIk1JMlMgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9NSTJTX1JYIiwgIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCi0JCQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9NSTJTX1JYIiwgIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAotCQkJCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1JYIiwgIlNlY29uZGFyeSBNSTJTIFBsYXliYWNrIiwKLQkJCSAgICAgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19NSTJTX1JYX1NEMSIsCi0JCQkiU2Vjb25kYXJ5IE1JMlMgUGxheWJhY2sgU0QxIiwKLQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJQUklfTUkyU19SWCIsICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAotCQkJICAgICAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UMF9NSTJTX1JYIiwgIklOVDAgTUkyUyBQbGF5YmFjayIsCi0JCQkgICAgIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJTlQ0X01JMlNfUlgiLCAiSU5UNCBNSTJTIFBsYXliYWNrIiwKLQkJCSAgICAgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVSU5fTUkyU19SWCIsICJRdWluYXJ5IE1JMlMgUGxheWJhY2siLAotCQkJCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX0kyU19UWCIsICJQcmltYXJ5IEkyUyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiTUkyU19UWCIsICJNSTJTIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX01JMlNfVFgiLCAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAotCQkJCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUFJJX01JMlNfVFgiLCAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAotCQkJICAgIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfTUkyU19UWCIsICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAotCQkJCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiSU5UMl9NSTJTX1RYIiwgIklOVDIgTUkyUyBDYXB0dXJlIiwKLQkJCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVDNfTUkyU19UWCIsICJJTlQzIE1JMlMgQ2FwdHVyZSIsCi0JCQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfTUkyU19UWCIsICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKLQkJCSAgICAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzBfVFgiLCAiU2xpbWJ1cyBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU18yX1RYIiwgIlNsaW1idXMyIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUlOX01JMlNfVFgiLCAiUXVpbmFyeSBNSTJTIENhcHR1cmUiLAotCQkJCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0VOQVJZX01JMlNfVFgiLCAiU2VuYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UX0JUX1NDT19SWCIsICJJbnRlcm5hbCBCVC1TQ08gUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIklOVF9CVF9TQ09fVFgiLCAiSW50ZXJuYWwgQlQtU0NPIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJJTlRfQlRfQTJEUF9SWCIsICJJbnRlcm5hbCBCVC1BMkRQIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiSU5UX0ZNX1JYIiwgIkludGVybmFsIEZNIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJJTlRfRk1fVFgiLCAiSW50ZXJuYWwgRk0gQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBDTV9SWCIsICJBRkUgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBDTV9UWCIsICJBRkUgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMCIsICJQcmltYXJ5IFRETTAgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMCIsICJQcmltYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMSIsICJQcmltYXJ5IFRETTEgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMSIsICJQcmltYXJ5IFRETTEgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMiIsICJQcmltYXJ5IFRETTIgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMiIsICJQcmltYXJ5IFRETTIgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfMyIsICJQcmltYXJ5IFRETTMgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfMyIsICJQcmltYXJ5IFRETTMgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNCIsICJQcmltYXJ5IFRETTQgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNCIsICJQcmltYXJ5IFRETTQgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNSIsICJQcmltYXJ5IFRETTUgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNSIsICJQcmltYXJ5IFRETTUgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNiIsICJQcmltYXJ5IFRETTYgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNiIsICJQcmltYXJ5IFRETTYgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlBSSV9URE1fUlhfNyIsICJQcmltYXJ5IFRETTcgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlBSSV9URE1fVFhfNyIsICJQcmltYXJ5IFRETTcgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfMCIsICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF8wIiwgIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzEiLCAiU2Vjb25kYXJ5IFRETTEgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfMSIsICJTZWNvbmRhcnkgVERNMSBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX1RETV9SWF8yIiwgIlNlY29uZGFyeSBURE0yIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfVERNX1RYXzIiLCAiU2Vjb25kYXJ5IFRETTIgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfMyIsICJTZWNvbmRhcnkgVERNMyBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF8zIiwgIlNlY29uZGFyeSBURE0zIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzQiLCAiU2Vjb25kYXJ5IFRETTQgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfNCIsICJTZWNvbmRhcnkgVERNNCBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX1RETV9SWF81IiwgIlNlY29uZGFyeSBURE01IFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTRUNfVERNX1RYXzUiLCAiU2Vjb25kYXJ5IFRETTUgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNFQ19URE1fUlhfNiIsICJTZWNvbmRhcnkgVERNNiBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0VDX1RETV9UWF82IiwgIlNlY29uZGFyeSBURE02IENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTRUNfVERNX1JYXzciLCAiU2Vjb25kYXJ5IFRETTcgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19URE1fVFhfNyIsICJTZWNvbmRhcnkgVERNNyBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfMCIsICJUZXJ0aWFyeSBURE0wIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF8wIiwgIlRlcnRpYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzEiLCAiVGVydGlhcnkgVERNMSBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfMSIsICJUZXJ0aWFyeSBURE0xIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9SWF8yIiwgIlRlcnRpYXJ5IFRETTIgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1RYXzIiLCAiVGVydGlhcnkgVERNMiBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfMyIsICJUZXJ0aWFyeSBURE0zIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF8zIiwgIlRlcnRpYXJ5IFRETTMgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzQiLCAiVGVydGlhcnkgVERNNCBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfNCIsICJUZXJ0aWFyeSBURE00IENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX1RETV9SWF81IiwgIlRlcnRpYXJ5IFRETTUgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlRFUlRfVERNX1RYXzUiLCAiVGVydGlhcnkgVERNNSBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVEVSVF9URE1fUlhfNiIsICJUZXJ0aWFyeSBURE02IFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX1RETV9UWF82IiwgIlRlcnRpYXJ5IFRETTYgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlRFUlRfVERNX1JYXzciLCAiVGVydGlhcnkgVERNNyBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVEVSVF9URE1fVFhfNyIsICJUZXJ0aWFyeSBURE03IENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF8wIiwgIlF1YXRlcm5hcnkgVERNMCBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfMCIsICJRdWF0ZXJuYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzEiLCAiUXVhdGVybmFyeSBURE0xIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF8xIiwgIlF1YXRlcm5hcnkgVERNMSBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fUlhfMiIsICJRdWF0ZXJuYXJ5IFRETTIgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1RYXzIiLCAiUXVhdGVybmFyeSBURE0yIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF8zIiwgIlF1YXRlcm5hcnkgVERNMyBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfMyIsICJRdWF0ZXJuYXJ5IFRETTMgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzQiLCAiUXVhdGVybmFyeSBURE00IFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF80IiwgIlF1YXRlcm5hcnkgVERNNCBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiUVVBVF9URE1fUlhfNSIsICJRdWF0ZXJuYXJ5IFRETTUgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlFVQVRfVERNX1RYXzUiLCAiUXVhdGVybmFyeSBURE01IENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX1RETV9SWF82IiwgIlF1YXRlcm5hcnkgVERNNiBQbGF5YmFjayIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiUVVBVF9URE1fVFhfNiIsICJRdWF0ZXJuYXJ5IFRETTYgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlFVQVRfVERNX1JYXzciLCAiUXVhdGVybmFyeSBURE03IFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX1RETV9UWF83IiwgIlF1YXRlcm5hcnkgVERNNyBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQkvKiBpbmNhbGwgKi8KLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0VfUExBWUJBQ0tfVFgiLCAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0UyX1BMQVlCQUNLX1RYIiwgIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNQlVTXzRfUlgiLCAiU2xpbWJ1czQgUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIklOQ0FMTF9SRUNPUkRfVFgiLCAiVm9pY2UgVXBsaW5rIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIklOQ0FMTF9SRUNPUkRfUlgiLCAiVm9pY2UgRG93bmxpbmsgQ2FwdHVyZSIsCi0JCQkJMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU180X1RYIiwgIlNsaW1idXM0IENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFTkFSWV9UWCIsICJTZW5hcnlfbWkycyBDYXB0dXJlIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJJTlQ1X01JMlNfVFgiLCAiSU5UNSBNSTJTIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU1CVVNfNV9UWCIsICJTbGltYnVzNSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0KLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiQVVYX1BDTV9SWCIsICJBVVggUENNIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiQVVYX1BDTV9UWCIsICJBVVggUENNIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0VDX0FVWF9QQ01fUlgiLCAiU2VjIEFVWCBQQ00gUGxheWJhY2siLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNFQ19BVVhfUENNX1RYIiwgIlNlYyBBVVggUENNIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJURVJUX0FVWF9QQ01fUlgiLCAiVGVydCBBVVggUENNIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJURVJUX0FVWF9QQ01fVFgiLCAiVGVydCBBVVggUENNIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJRVUFUX0FVWF9QQ01fUlgiLCAiUXVhdCBBVVggUENNIFBsYXliYWNrIiwKLQkJCQkwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJRVUFUX0FVWF9QQ01fVFgiLCAiUXVhdCBBVVggUENNIENhcHR1cmUiLAotCQkJCTAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPSUNFX1NUVUJfREwiLCAiVk9JQ0VfU1RVQiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJWT0lDRV9TVFVCX1VMIiwgIlZPSUNFX1NUVUIgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlZPSUNFMl9TVFVCX0RMIiwgIlZPSUNFMl9TVFVCIFBsYXliYWNrIiwKLQkJCSAgICAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiVk9JQ0UyX1NUVUJfVUwiLCAiVk9JQ0UyX1NUVUIgQ2FwdHVyZSIsCi0JCQkgICAgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiVk9MVEVfU1RVQl9ETCIsICJWT0xURV9TVFVCIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlZPTFRFX1NUVUJfVUwiLCAiVk9MVEVfU1RVQiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNUVUJfUlgiLCAiU3R1YiBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNUVUJfVFgiLCAiU3R1YiBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfMV9SWCIsICJTbGltYnVzMSBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU1CVVNfMV9UWCIsICJTbGltYnVzMSBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU1RVQl8xX1RYIiwgIlN0dWIxIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU18zX1JYIiwgIlNsaW1idXMzIFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU18zX1RYIiwgIlNsaW1idXMzIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQkvKiBJbi0gY2FsbCByZWNvcmRpbmcgKi8KLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU0xJTUJVU182X1JYIiwgIlNsaW1idXM2IFBsYXliYWNrIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU0xJTUJVU182X1RYIiwgIlNsaW1idXM2IENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQotCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTTElNQlVTXzdfUlgiLCAiU2xpbWJ1czcgUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTTElNQlVTXzdfVFgiLCAiU2xpbWJ1czcgQ2FwdHVyZSIsIDAsIDAsIDAsIDApLAotCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNMSU1CVVNfOF9SWCIsICJTbGltYnVzOCBQbGF5YmFjayIsIDAsIDAsIDAsIDApLAotCVNORF9TT0NfREFQTV9BSUZfSU4oIlNMSU1CVVNfOF9UWCIsICJTbGltYnVzOCBDYXB0dXJlIiwgMCwgMCwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlVTQl9BVURJT19SWCIsICJVU0IgQXVkaW8gUGxheWJhY2siLCAwLCAwLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJVU0JfQVVESU9fVFgiLCAiVVNCIEF1ZGlvIENhcHR1cmUiLCAwLCAwLCAwLCAwKSwKLQotCS8qIFN3aXRjaCBEZWZpbml0aW9ucyAqLwotCVNORF9TT0NfREFQTV9TV0lUQ0goIlNMSU1CVVNfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJnNsaW1fZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJTTElNQlVTMV9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmc2xpbTFfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJTTElNQlVTM19ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmc2xpbTNfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJTTElNQlVTNF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmc2xpbTRfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJTTElNQlVTNl9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmc2xpbTZfZm1fc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJQQ01fUlhfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJnBjbV9yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIklOVDBfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmaW50MF9taTJzX3J4X3N3aXRjaF9taXhlcl9jb250cm9scyksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiSU5UNF9NSTJTX1JYX0RMX0hMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCSZpbnQ0X21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJQUklfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmcHJpX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJTRUNfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmc2VjX21pMnNfcnhfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJURVJUX01JMlNfUlhfRExfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJnRlcnRfbWkyc19yeF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIlFVQVRfTUkyU19SWF9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmcXVhdF9taTJzX3J4X3N3aXRjaF9taXhlcl9jb250cm9scyksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiSEZQX1BSSV9BVVhfVUxfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJmhmcF9wcmlfYXV4X3N3aXRjaF9taXhlcl9jb250cm9scyksCi0JU05EX1NPQ19EQVBNX1NXSVRDSCgiSEZQX0FVWF9VTF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmaGZwX2F1eF9zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIkhGUF9JTlRfVUxfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJmhmcF9pbnRfc3dpdGNoX21peGVyX2NvbnRyb2xzKSwKLQlTTkRfU09DX0RBUE1fU1dJVENIKCJIRlBfU0xJTTdfVUxfSEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJmhmcF9zbGltN19zd2l0Y2hfbWl4ZXJfY29udHJvbHMpLAotCVNORF9TT0NfREFQTV9TV0lUQ0goIlVTQl9ETF9ITCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQkmdXNiX3N3aXRjaF9taXhlcl9jb250cm9scyksCi0KLQkvKiBNaXhlciBkZWZpbml0aW9ucyAqLwotCVNORF9TT0NfREFQTV9NSVhFUigiUFJJX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaV9pMnNfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUocHJpX2kyc19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0VDX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNlY19pMnNfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2VjX2kyc19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNsaW1idXNfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2xpbWJ1c19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNsaW1idXNfMl9yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShzbGltYnVzXzJfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzbGltYnVzXzVfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2xpbWJ1c181X3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0Jc2xpbWJ1c183X3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNsaW1idXNfN19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiSERNSSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQloZG1pX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKGhkbWlfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkRJU1BMQVlfUE9SVCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlkaXNwbGF5X3BvcnRfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoZGlzcGxheV9wb3J0X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTUERJRl9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzcGRpZl9yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShzcGRpZl9yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltaTJzX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlxdWF0ZXJuYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShxdWF0ZXJuYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQl0ZXJ0aWFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUodGVydGlhcnlfbWkyc19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICBzZWNvbmRhcnlfbWkyc19yeF9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUoc2Vjb25kYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19NSTJTX1JYX1NEMSBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgIHNlY29uZGFyeV9taTJzX3J4Ml9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUoc2Vjb25kYXJ5X21pMnNfcngyX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgIHByaW1hcnlfbWkyc19yeF9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUocHJpbWFyeV9taTJzX3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICBpbnQwX21pMnNfcnhfbWl4ZXJfY29udHJvbHMsCi0JCQkgICBBUlJBWV9TSVpFKGludDBfbWkyc19yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgaW50NF9taTJzX3J4X21peGVyX2NvbnRyb2xzLAotCQkJICAgQVJSQVlfU0laRShpbnQ0X21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlxdWluYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShxdWluYXJ5X21pMnNfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlwcmlfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShwcmlfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMSBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlwcmlfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShwcmlfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMiBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlwcmlfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShwcmlfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlwcmlfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShwcmlfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fVFhfMCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlwcmlfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShwcmlfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlzZWNfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlzZWNfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMiBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlzZWNfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMyBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlzZWNfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQlzZWNfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fcnhfMF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fdHhfMF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fcnhfMV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fcnhfMl9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fcnhfM19taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJdGVydF90ZG1fcnhfNF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHRlcnRfdGRtX3J4XzRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fcnhfMF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3J4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fdHhfMF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3R4XzBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fcnhfMV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3J4XzFfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fcnhfMl9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3J4XzJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fcnhfM19taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3J4XzNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWExIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCW1tdWwxX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWwxX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhMiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltbXVsMl9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsMl9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTMgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbW11bDNfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWE0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCW1tdWw0X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWw0X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhNSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltbXVsNV9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsNV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTYgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbW11bDZfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDZfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWE4IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCW1tdWw4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWw4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhOSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltbXVsOV9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsOV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTEwIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCW1tdWwxMF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsMTBfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWExNiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltbXVsMTZfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDE2X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhMTcgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbW11bDE3X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWwxN19taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTXVsdGlNZWRpYTE4IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCW1tdWwxOF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShtbXVsMThfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk11bHRpTWVkaWExOSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltbXVsMTlfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobW11bDE5X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJNdWx0aU1lZGlhMjAgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbW11bDIwX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKG1tdWwyMF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlhdXhwY21fcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzZWNfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKHNlY19hdXhwY21fcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl0ZXJ0X2F1eHBjbV9yeF9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKHRlcnRfYXV4cGNtX3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JcXVhdF9hdXhwY21fcnhfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShxdWF0X2F1eHBjbV9yeF9taXhlcl9jb250cm9scykpLAotCS8qIGluY2FsbCAqLwotCVNORF9TT0NfREFQTV9NSVhFUigiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWluY2FsbF9tdXNpY19kZWxpdmVyeV9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKGluY2FsbF9tdXNpY19kZWxpdmVyeV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiSW5jYWxsX011c2ljXzIgQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JaW5jYWxsX211c2ljMl9kZWxpdmVyeV9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKGluY2FsbF9tdXNpYzJfZGVsaXZlcnlfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNF9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzbGltYnVzXzRfcnhfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShzbGltYnVzXzRfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzbGltYnVzXzZfcnhfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShzbGltYnVzXzZfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl1c2JfYXVkaW9fcnhfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh1c2JfYXVkaW9fcnhfbWl4ZXJfY29udHJvbHMpKSwKLQkvKiBWb2ljZSBNaXhlciAqLwotCVNORF9TT0NfREFQTV9NSVhFUigiUFJJX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsIHByaV9yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHByaV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0VDX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJc2VjX2kyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHNlY19pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJc2VjX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShzZWNfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTV8wX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJc2xpbWJ1c19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHNsaW1idXNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCWJ0X3Njb19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGJ0X3Njb19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCWFmZV9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShhZmVfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGF1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKLQkJCSAgICAgIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgIHNlY19hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJICAgICAgQVJSQVlfU0laRShzZWNfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwKLQkJCSAgICAgIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICAgIHRlcnRfYXV4X3BjbV9yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCSAgICAgIEFSUkFZX1NJWkUodGVydF9hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLAotCQkJICAgICAgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgICAgcXVhdF9hdXhfcGNtX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJICAgICAgQVJSQVlfU0laRShxdWF0X2F1eF9wY21fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkhETUlfUlhfVm9pY2UgTWl4ZXIiLAotCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQloZG1pX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUoaGRtaV9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTUkyU19SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCW1pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShtaTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCXByaV9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUocHJpX21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCWludDBfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGludDBfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJaW50NF9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUoaW50NF9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLAotCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCQl0ZXJ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0ZXJ0X21pMnNfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfTUkyU19SWF9Wb2ljZSBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCXF1YXRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfbWkyc19yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVpbl9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUocXVpbl9taTJzX3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJRVUFUX1RETV9SWF8yX1ZvaWNlIE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJcXVhdF90ZG1fcnhfMl92b2ljZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHF1YXRfdGRtX3J4XzJfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlZvaWNlX1R4IE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsIHR4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUodHhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlZvaWNlMl9UeCBNaXhlciIsCi0JCQkgICBTTkRfU09DX05PUE0sIDAsIDAsIHR4X3ZvaWNlMl9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUodHhfdm9pY2UyX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJWb2lwX1R4IE1peGVyIiwKLQkJCQlTTkRfU09DX05PUE0sIDAsIDAsIHR4X3ZvaXBfbWl4ZXJfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRSh0eF92b2lwX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJWb0xURV9UeCBNaXhlciIsCi0JCQkJU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2x0ZV9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKHR4X3ZvbHRlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJWb1dMQU5fVHggTWl4ZXIiLAotCQkJCVNORF9TT0NfTk9QTSwgMCwgMCwgdHhfdm93bGFuX21peGVyX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUodHhfdm93bGFuX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsCi0JCQkgICBTTkRfU09DX05PUE0sIDAsIDAsIHR4X3ZvaWNlbW1vZGUxX21peGVyX2NvbnRyb2xzLAotCQkJICAgQVJSQVlfU0laRSh0eF92b2ljZW1tb2RlMV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLAotCQkJICAgU05EX1NPQ19OT1BNLCAwLCAwLCB0eF92b2ljZW1tb2RlMl9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUodHhfdm9pY2VtbW9kZTJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlpbnRfYnRfc2NvX3J4X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKGludF9idF9zY29fcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlpbnRfYnRfYTJkcF9yeF9taXhlcl9jb250cm9scywKLQkJCUFSUkFZX1NJWkUoaW50X2J0X2EyZHBfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWludF9mbV9yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShpbnRfZm1fcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JYWZlX3BjbV9yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShhZmVfcGNtX3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJWb2ljZSBTdHViIFR4IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXR4X3ZvaWNlX3N0dWJfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUodHhfdm9pY2Vfc3R1Yl9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICB0eF92b2ljZTJfc3R1Yl9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUodHhfdm9pY2UyX3N0dWJfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlZvTFRFIFN0dWIgVHggTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JdHhfdm9sdGVfc3R1Yl9taXhlcl9jb250cm9scywgQVJSQVlfU0laRSh0eF92b2x0ZV9zdHViX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTVFVCX1JYIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXN0dWJfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc3R1Yl9yeF9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiU0xJTUJVU18xX1JYIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNsaW1idXNfMV9yeF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShzbGltYnVzXzFfcnhfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfM19SWF9Wb2ljZSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlzbGltYnVzXzNfcnhfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUoc2xpbWJ1c18zX3J4X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLAotCQkJU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJc2xpbWJ1c182X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShzbGltYnVzXzZfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgIHNsaW1idXNfN19yeF92b2ljZV9taXhlcl9jb250cm9scywKLQkJCSAgIEFSUkFZX1NJWkUoc2xpbWJ1c183X3J4X3ZvaWNlX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICBzbGltYnVzXzhfcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JCQkgICBBUlJBWV9TSVpFKHNsaW1idXNfOF9yeF92b2ljZV9taXhlcl9jb250cm9scykpLAotCS8qIHBvcnQgbWl4ZXIgKi8KLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIHNidXNfMF9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2J1c18wX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFVWF9QQ01fUlggUG9ydCBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCBhdXhfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShhdXhfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19BVVhQQ01fUlggUG9ydCBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCBzZWNfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShzZWNfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLAotCVNORF9TT0NfTk9QTSwgMCwgMCwgdGVydF9hdXhwY21fcnhfcG9ydF9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKHRlcnRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLAotCVNORF9TT0NfTk9QTSwgMCwgMCwgcXVhdF9hdXhwY21fcnhfcG9ydF9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKHF1YXRfYXV4cGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfMV9SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNidXNfMV9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2J1c18xX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVEVSTkFMX0JUX1NDT19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWJ0X3Njb19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoYnRfc2NvX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkFGRV9QQ01fUlggUG9ydCBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCBhZmVfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShhZmVfcGNtX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkhETUlfUlggUG9ydCBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCBoZG1pX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShoZG1pX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkRJU1BMQVlfUE9SVF9SWCBQb3J0IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIGRpc3BsYXlfcG9ydF9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoZGlzcGxheV9wb3J0X3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19JMlNfUlggUG9ydCBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCBzZWNfaTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShzZWNfaTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIHNidXNfM19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2J1c18zX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIHNidXNfNl9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2J1c182X3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIk1JMlNfUlggUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltaTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJQUklfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaW1hcnlfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocHJpbWFyeV9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0Jc2VjX21pMnNfcnhfcG9ydF9taXhlcl9jb250cm9scywKLQlBUlJBWV9TSVpFKHNlY19taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXRlcnRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUodGVydF9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXF1YXRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocXVhdF9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaV90ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocHJpX3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaV90ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocHJpX3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaV90ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocHJpX3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXByaV90ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUocHJpX3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNlY190ZG1fcnhfMF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2VjX3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNlY190ZG1fcnhfMV9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2VjX3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNlY190ZG1fcnhfMl9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2VjX3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCXNlY190ZG1fcnhfM19wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoc2VjX3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl0ZXJ0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl0ZXJ0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl0ZXJ0X3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQl0ZXJ0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh0ZXJ0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlxdWF0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShxdWF0X3RkbV9yeF8wX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlxdWF0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShxdWF0X3RkbV9yeF8xX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlxdWF0X3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShxdWF0X3RkbV9yeF8yX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlxdWF0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRShxdWF0X3RkbV9yeF8zX3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVDBfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWludDBfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoaW50MF9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIklOVDRfTUkyU19SWCBQb3J0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWludDRfbWkyc19yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUoaW50NF9taTJzX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlFDSEFUX1R4IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIHR4X3FjaGF0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUodHhfcWNoYXRfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsCi0JU05EX1NPQ19OT1BNLCAwLCAwLCB1c2JfYXVkaW9fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMsCi0JQVJSQVlfU0laRSh1c2JfYXVkaW9fcnhfdm9pY2VfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIlVTQl9BVURJT19SWCBQb3J0IE1peGVyIiwKLQlTTkRfU09DX05PUE0sIDAsIDAsIHVzYl9yeF9wb3J0X21peGVyX2NvbnRyb2xzLAotCUFSUkFZX1NJWkUodXNiX3J4X3BvcnRfbWl4ZXJfY29udHJvbHMpKSwKLQkvKiBsc20gbWl4ZXIgZGVmaW5pdGlvbnMgKi8KLQlTTkRfU09DX0RBUE1fTUlYRVIoIkxTTTEgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbHNtMV9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShsc20xX21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJMU00yIE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWxzbTJfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobHNtMl9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTFNNMyBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlsc20zX21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKGxzbTNfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkxTTTQgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbHNtNF9taXhlcl9jb250cm9scywgQVJSQVlfU0laRShsc200X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJMU001IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWxzbTVfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobHNtNV9taXhlcl9jb250cm9scykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiTFNNNiBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQlsc202X21peGVyX2NvbnRyb2xzLCBBUlJBWV9TSVpFKGxzbTZfbWl4ZXJfY29udHJvbHMpKSwKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkxTTTcgTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbHNtN19taXhlcl9jb250cm9scywgQVJSQVlfU0laRShsc203X21peGVyX2NvbnRyb2xzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJMU004IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCWxzbThfbWl4ZXJfY29udHJvbHMsIEFSUkFZX1NJWkUobHNtOF9taXhlcl9jb250cm9scykpLAotCS8qIFZpcnR1YWwgUGlucyB0byBmb3JjZSBiYWNrZW5kcyBPTiBhdG0gKi8KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJCRV9PVVQiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIkJFX0lOIiksCi0KLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNMF9SWF9WSV9GQl9MQ0hfTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCSZzbGltMF9yeF92aV9mYl9sY2hfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJTTElNMF9SWF9WSV9GQl9SQ0hfTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJCSZzbGltMF9yeF92aV9mYl9yY2hfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJQUklfTUkyU19SWF9WSV9GQl9NVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJm1pMnNfcnhfdmlfZmJfbXV4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJJTlQ0X01JMlNfUlhfVklfRkJfTU9OT19DSF9NVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJmludDRfbWkyc19yeF92aV9mYl9tb25vX2NoX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiSU5UNF9NSTJTX1JYX1ZJX0ZCX1NURVJFT19DSF9NVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkJJmludDRfbWkyc19yeF92aV9mYl9zdGVyZW9fY2hfbXV4KSwKLQotCVNORF9TT0NfREFQTV9NVVgoIlZPQ19FWFRfRUMgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICZ2b2NfZXh0X2VjX211eCksCi0JU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDEpLAotCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDIgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmZXh0X2VjX3JlZl9tdXhfdWwyKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwzIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJmV4dF9lY19yZWZfbXV4X3VsMyksCi0JU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMNCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDQpLAotCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDUgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmZXh0X2VjX3JlZl9tdXhfdWw1KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUw2IE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJJmV4dF9lY19yZWZfbXV4X3VsNiksCi0JU05EX1NPQ19EQVBNX01VWCgiQVVESU9fUkVGX0VDX1VMOCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDgpLAotCVNORF9TT0NfREFQTV9NVVgoIkFVRElPX1JFRl9FQ19VTDkgTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkmZXh0X2VjX3JlZl9tdXhfdWw5KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDEwKSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxNiBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDE2KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxNyBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDE3KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxOCBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDE4KSwKLQlTTkRfU09DX0RBUE1fTVVYKCJBVURJT19SRUZfRUNfVUwxOSBNVVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCSZleHRfZWNfcmVmX211eF91bDE5KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uW10gPSB7Ci0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiUFJJX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlBSSV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiUFJJX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJQUklfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlBSSV9JMlNfUlgiLCBOVUxMLCAiUFJJX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTRUNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0VDX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTRUNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlNFQ19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0VDX0kyU19SWCIsIE5VTEwsICJTRUNfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNMSU1CVVNfMF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJTTElNQlVTXzBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNMSU1CVVNfMF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJTTElNQlVTXzBfUlgiLCBOVUxMLCAiU0xJTUJVU18wX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTTElNQlVTXzJfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0xJTUJVU18yX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTTElNQlVTXzJfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0xJTUJVU18yX1JYIiwgTlVMTCwgIlNMSU1CVVNfMl9SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiU0xJTUJVU181X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlNMSU1CVVNfNV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiU0xJTUJVU181X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlNMSU1CVVNfNV9SWCIsIE5VTEwsICJTTElNQlVTXzVfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IkhETUkgTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJIRE1JIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiSERNSSBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiSERNSSIsIE5VTEwsICJIRE1JIE1peGVyIn0sCi0KLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJESVNQTEFZX1BPUlQgTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiRElTUExBWV9QT1JUIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJESVNQTEFZX1BPUlQgTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IkRJU1BMQVlfUE9SVCBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiRElTUExBWV9QT1JUIiwgTlVMTCwgIkRJU1BMQVlfUE9SVCBNaXhlciJ9LAotCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU1BESUZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNQRElGX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJTUERJRl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU1BESUZfUlgiLCBOVUxMLCAiU1BESUZfUlggQXVkaW8gTWl4ZXIifSwKLQotCS8qIGluY2FsbCAqLwotCXsiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiVk9JQ0VfUExBWUJBQ0tfVFgiLCBOVUxMLCAiSW5jYWxsX011c2ljIEF1ZGlvIE1peGVyIn0sCi0JeyJJbmNhbGxfTXVzaWNfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IkluY2FsbF9NdXNpY18yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiSW5jYWxsX011c2ljXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJJbmNhbGxfTXVzaWNfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlZPSUNFMl9QTEFZQkFDS19UWCIsIE5VTEwsICJJbmNhbGxfTXVzaWNfMiBBdWRpbyBNaXhlciJ9LAotCXsiU0xJTUJVU180X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiU0xJTUJVU180X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU0xJTUJVU180X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU0xJTUJVU180X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0xJTUJVU180X1JYIiwgTlVMTCwgIlNMSU1CVVNfNF9SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiU0xJTUJVU182X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlNMSU1CVVNfNl9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiU0xJTUJVU182X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlNMSU1CVVNfNl9SWCIsIE5VTEwsICJTTElNQlVTXzZfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNMSU1CVVNfN19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJTTElNQlVTXzdfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNMSU1CVVNfN19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJTTElNQlVTXzdfUlgiLCBOVUxMLCAiU0xJTUJVU183X1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJVU0JfQVVESU9fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiVVNCX0FVRElPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJVU0JfQVVESU9fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiVVNCX0FVRElPX1JYIiwgTlVMTCwgIlVTQl9BVURJT19SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJWT0NfUkVDX1VMIiwgIklOQ0FMTF9SRUNPUkRfVFgifSwKLQl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlZPQ19SRUNfVUwiLCAiSU5DQUxMX1JFQ09SRF9UWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiVk9DX1JFQ19VTCIsICJJTkNBTExfUkVDT1JEX1RYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJWT0NfUkVDX0RMIiwgIklOQ0FMTF9SRUNPUkRfUlgifSwKLQl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlZPQ19SRUNfREwiLCAiSU5DQUxMX1JFQ09SRF9SWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiVk9DX1JFQ19ETCIsICJJTkNBTExfUkVDT1JEX1JYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTTElNXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTTElNXzZfVFgiLCAiU0xJTUJVU182X1RYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTTElNXzZfVFgiLCAiU0xJTUJVU182X1RYIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTcgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTXVsdGlNZWRpYTE4IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7Ik11bHRpTWVkaWExOSBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWExNyBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTE4IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTkgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTggTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7Ik1JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJNSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiTUkyU19SWCIsIE5VTEwsICJNSTJTX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiUVVBVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiUVVBVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJRVUFUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiUVVBVF9NSTJTX1JYIiwgTlVMTCwgIlFVQVRfTUkyU19SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlRFUlRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlRFUlRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiVEVSVF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlRFUlRfTUkyU19SWCIsIE5VTEwsICJURVJUX01JMlNfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNFQ19NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJTRUNfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0VDX01JMlNfUlgiLCBOVUxMLCAiU0VDX01JMlNfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiU0VDX01JMlNfUlhfU0QxIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0VDX01JMlNfUlhfU0QxIiwgTlVMTCwgIlNFQ19NSTJTX1JYX1NEMSBBdWRpbyBNaXhlciJ9LAotCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCi0JeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJQUklfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiUFJJX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlBSSV9NSTJTX1JYIiwgTlVMTCwgIlBSSV9NSTJTX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiSU5UMF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiSU5UMF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJJTlQwX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiSU5UMF9NSTJTX1JYIiwgTlVMTCwgIklOVDBfTUkyU19SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IklOVDRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IklOVDRfTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiSU5UNF9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IklOVDRfTUkyU19SWCIsIE5VTEwsICJJTlQ0X01JMlNfUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJRVUlOX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJRVUlOX01JMlNfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlFVSU5fTUkyU19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJRVUlOX01JMlNfUlgiLCBOVUxMLCAiUVVJTl9NSTJTX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiUFJJX1RETV9SWF8wIiwgTlVMTCwgIlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciJ9LAotCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlBSSV9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiUFJJX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlBSSV9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiUFJJX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlBSSV9URE1fUlhfMSIsIE5VTEwsICJQUklfVERNX1JYXzEgQXVkaW8gTWl4ZXIifSwKLQotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJQUklfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlBSSV9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJQUklfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlBSSV9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJQUklfVERNX1JYXzIiLCBOVUxMLCAiUFJJX1RETV9SWF8yIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiUFJJX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJQUklfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiUFJJX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJQUklfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiUFJJX1RETV9SWF8zIiwgTlVMTCwgIlBSSV9URE1fUlhfMyBBdWRpbyBNaXhlciJ9LAotCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlBSSV9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlBSSV9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiUFJJX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlBSSV9URE1fVFhfMCIsIE5VTEwsICJQUklfVERNX1RYXzAgQXVkaW8gTWl4ZXIifSwKLQotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJTRUNfVERNX1JYXzAiLCBOVUxMLCAiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0VDX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTRUNfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0VDX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTRUNfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0VDX1RETV9SWF8xIiwgTlVMTCwgIlNFQ19URE1fUlhfMSBBdWRpbyBNaXhlciJ9LAotCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlNFQ19URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiU0VDX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlNFQ19URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiU0VDX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlNFQ19URE1fUlhfMiIsIE5VTEwsICJTRUNfVERNX1JYXzIgQXVkaW8gTWl4ZXIifSwKLQotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJTRUNfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlNFQ19URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJTRUNfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlNFQ19URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJTRUNfVERNX1JYXzMiLCBOVUxMLCAiU0VDX1RETV9SWF8zIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0VDX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0VDX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTRUNfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0VDX1RETV9UWF8wIiwgTlVMTCwgIlNFQ19URE1fVFhfMCBBdWRpbyBNaXhlciJ9LAotCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiVEVSVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJURVJUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJURVJUX1RETV9SWF8wIiwgTlVMTCwgIlRFUlRfVERNX1JYXzAgQXVkaW8gTWl4ZXIifSwKLQotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlRFUlRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiVEVSVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiVEVSVF9URE1fVFhfMCIsIE5VTEwsICJURVJUX1RETV9UWF8wIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJURVJUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlRFUlRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlRFUlRfVERNX1JYXzEiLCBOVUxMLCAiVEVSVF9URE1fUlhfMSBBdWRpbyBNaXhlciJ9LAotCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiVEVSVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJURVJUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJURVJUX1RETV9SWF8yIiwgTlVMTCwgIlRFUlRfVERNX1JYXzIgQXVkaW8gTWl4ZXIifSwKLQotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlRFUlRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiVEVSVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiVEVSVF9URE1fUlhfMyIsIE5VTEwsICJURVJUX1RETV9SWF8zIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJURVJUX1RETV9SWF80IEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiVEVSVF9URE1fUlhfNCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJURVJUX1RETV9SWF80IEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiVEVSVF9URE1fUlhfNCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJURVJUX1RETV9SWF80IEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiVEVSVF9URE1fUlhfNCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlRFUlRfVERNX1JYXzQgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlRFUlRfVERNX1JYXzQiLCBOVUxMLCAiVEVSVF9URE1fUlhfNCBBdWRpbyBNaXhlciJ9LAotCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUVVBVF9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJRVUFUX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyMCIsICJNTV9ETDIwIn0sCi0JeyJRVUFUX1RETV9SWF8wIiwgTlVMTCwgIlFVQVRfVERNX1JYXzAgQXVkaW8gTWl4ZXIifSwKLQotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJQUklfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlBSSV9URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJQUklfVERNX1JYXzAiLCBOVUxMLCAiUFJJX1RETV9SWF8wIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiU0VDX1RETV9SWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTRUNfVERNX1JYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiU0VDX1RETV9SWF8wIiwgTlVMTCwgIlNFQ19URE1fUlhfMCBBdWRpbyBNaXhlciJ9LAotCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUVVBVF9URE1fVFhfMCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJRVUFUX1RETV9UWF8wIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJRVUFUX1RETV9UWF8wIiwgTlVMTCwgIlFVQVRfVERNX1RYXzAgQXVkaW8gTWl4ZXIifSwKLQotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlFVQVRfVERNX1JYXzEgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiUVVBVF9URE1fUlhfMSBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMjAiLCAiTU1fREwyMCJ9LAotCXsiUVVBVF9URE1fUlhfMSIsIE5VTEwsICJRVUFUX1RETV9SWF8xIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJRVUFUX1RETV9SWF8yIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlFVQVRfVERNX1JYXzIgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIwIiwgIk1NX0RMMjAifSwKLQl7IlFVQVRfVERNX1JYXzIiLCBOVUxMLCAiUVVBVF9URE1fUlhfMiBBdWRpbyBNaXhlciJ9LAotCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiUVVBVF9URE1fUlhfMyBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJRVUFUX1RETV9SWF8zIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyMCIsICJNTV9ETDIwIn0sCi0JeyJRVUFUX1RETV9SWF8zIiwgTlVMTCwgIlFVQVRfVERNX1JYXzMgQXVkaW8gTWl4ZXIifSwKLQotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUFJJX1RYIiwgIlBSSV9JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTE2IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVJTl9NSTJTX1RYIiwgIlFVSU5fTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiUVVJTl9NSTJTX1RYIiwgIlFVSU5fTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiSU5UMl9NSTJTX1RYIiwgIklOVDJfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiSU5UMl9NSTJTX1RYIiwgIklOVDJfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJBVVhfUENNX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIkFVWF9QQ01fVFgiLCAiQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlNFQ19BVVhfUENNX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTRUNfQVVYX1BDTV9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIlNFQ19BVVhfUENNX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiQVVYX1BDTV9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfQVVYUENNX1VMX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWCIsICJURVJUX0FVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVQVRfQVVYUENNX1VMX1RYIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWCIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJRVUFUX0FVWF9QQ01fVFgiLCAiUVVBVF9BVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzZfVFgiLCAiU0xJTUJVU182X1RYIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiSU5UMl9NSTJTX1RYIiwgIklOVDJfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiSU5UMl9NSTJTX1RYIiwgIklOVDJfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiSU5UMl9NSTJTX1RYIiwgIklOVDJfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIklOVDJfTUkyU19UWCIsICJJTlQyX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJJTlQyX01JMlNfVFgiLCAiSU5UMl9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTE2IE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMSBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWExIE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWEyIE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTMgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMyBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWE0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhNiBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWE2IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWE4IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhOSBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWE5IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTkgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhOSBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWE5IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTkgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhOSBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWE5IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMTAgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMjAgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiTXVsdGlNZWRpYTIwIE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJNdWx0aU1lZGlhMjAgTWl4ZXIiLCAiUFJJX1RETV9UWF8wIiwgIlBSSV9URE1fVFhfMCJ9LAotCXsiTXVsdGlNZWRpYTIwIE1peGVyIiwgIlBSSV9URE1fVFhfMSIsICJQUklfVERNX1RYXzEifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMjAgTWl4ZXIiLCAiUFJJX1RETV9UWF8zIiwgIlBSSV9URE1fVFhfMyJ9LAotCXsiTXVsdGlNZWRpYTIwIE1peGVyIiwgIlNFQ19URE1fVFhfMCIsICJTRUNfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMjAgTWl4ZXIiLCAiU0VDX1RETV9UWF8yIiwgIlNFQ19URE1fVFhfMiJ9LAotCXsiTXVsdGlNZWRpYTIwIE1peGVyIiwgIlNFQ19URE1fVFhfMyIsICJTRUNfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWEyMCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTIgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTQgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTUgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIlVTQl9BVURJT19UWCIsICJVU0JfQVVESU9fVFgifSwKLQotCXsiTXVsdGlNZWRpYTE2IE1peGVyIiwgIlBSSV9URE1fVFhfMCIsICJQUklfVERNX1RYXzAifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiUFJJX1RETV9UWF8yIiwgIlBSSV9URE1fVFhfMiJ9LAotCXsiTXVsdGlNZWRpYTE2IE1peGVyIiwgIlBSSV9URE1fVFhfMyIsICJQUklfVERNX1RYXzMifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiU0VDX1RETV9UWF8xIiwgIlNFQ19URE1fVFhfMSJ9LAotCXsiTXVsdGlNZWRpYTE2IE1peGVyIiwgIlNFQ19URE1fVFhfMiIsICJTRUNfVERNX1RYXzIifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCi0JeyJNdWx0aU1lZGlhMTYgTWl4ZXIiLCAiVVNCX0FVRElPX1RYIiwgIlVTQl9BVURJT19UWCJ9LAotCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9VTDYifSwKLQl7IklOVF9CVF9TQ09fUlgiLCBOVUxMLCAiSU5URVJOQUxfQlRfU0NPX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEyIiwgIk1NX0RMMiJ9LAotCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE1IiwgIk1NX0RMNSJ9LAotCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE4IiwgIk1NX0RMOCJ9LAotCXsiSU5URVJOQUxfQTJEUF9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTExIiwgIk1NX0RMMTEifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE0IiwgIk1NX0RMMTQifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IklOVEVSTkFMX0EyRFBfUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fVUw2In0sCi0JeyJJTlRfQlRfQTJEUF9SWCIsIE5VTEwsICJJTlRFUk5BTF9BMkRQX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJJTlRFUk5BTF9GTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IklOVEVSTkFMX0ZNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJJTlRfRk1fUlgiLCBOVUxMLCAiSU5URVJOQUxfRk1fUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJBRkVfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiQUZFX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiUENNX1JYIiwgTlVMTCwgIkFGRV9QQ01fUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTcgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7Ik11bHRpTWVkaWExOCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiTXVsdGlNZWRpYTE5IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik11bHRpTWVkaWExNyBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik11bHRpTWVkaWExOCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik11bHRpTWVkaWExOSBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik11bHRpTWVkaWE1IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTYgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJNdWx0aU1lZGlhOCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQotCXsiTXVsdGlNZWRpYTEgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7Ik11bHRpTWVkaWEzIE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhNCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTEwIE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhMTcgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7Ik11bHRpTWVkaWExOCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTE5IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJNdWx0aU1lZGlhNSBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiTXVsdGlNZWRpYTggTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7Ik11bHRpTWVkaWExNiBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiTU1fVUwxIiwgTlVMTCwgIk11bHRpTWVkaWExIE1peGVyIn0sCi0JeyJNdWx0aU1lZGlhMiBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7Ik1NX1VMMiIsIE5VTEwsICJNdWx0aU1lZGlhMiBNaXhlciJ9LAotCXsiTU1fVUwzIiwgTlVMTCwgIk11bHRpTWVkaWEzIE1peGVyIn0sCi0JeyJNTV9VTDQiLCBOVUxMLCAiTXVsdGlNZWRpYTQgTWl4ZXIifSwKLQl7Ik1NX1VMNSIsIE5VTEwsICJNdWx0aU1lZGlhNSBNaXhlciJ9LAotCXsiTU1fVUw2IiwgTlVMTCwgIk11bHRpTWVkaWE2IE1peGVyIn0sCi0JeyJNTV9VTDgiLCBOVUxMLCAiTXVsdGlNZWRpYTggTWl4ZXIifSwKLQl7Ik1NX1VMOSIsIE5VTEwsICJNdWx0aU1lZGlhOSBNaXhlciJ9LAotCXsiTU1fVUwxMCIsIE5VTEwsICJNdWx0aU1lZGlhMTAgTWl4ZXIifSwKLQl7Ik1NX1VMMTYiLCBOVUxMLCAiTXVsdGlNZWRpYTE2IE1peGVyIn0sCi0JeyJNTV9VTDE3IiwgTlVMTCwgIk11bHRpTWVkaWExNyBNaXhlciJ9LAotCXsiTU1fVUwxOCIsIE5VTEwsICJNdWx0aU1lZGlhMTggTWl4ZXIifSwKLQl7Ik1NX1VMMTkiLCBOVUxMLCAiTXVsdGlNZWRpYTE5IE1peGVyIn0sCi0JeyJNTV9VTDIwIiwgTlVMTCwgIk11bHRpTWVkaWEyMCBNaXhlciJ9LAotCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExIiwgIk1NX0RMMSJ9LAotCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE0IiwgIk1NX0RMNCJ9LAotCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE3IiwgIk1NX0RMNyJ9LAotCXsiQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMCIsICJNTV9ETDEwIn0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMyIsICJNTV9ETDEzIn0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJBVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNiIsICJNTV9ETDE2In0sCi0JeyJBVVhfUENNX1JYIiwgTlVMTCwgIkFVWF9QQ01fUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWEzIiwgIk1NX0RMMyJ9LAotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE2IiwgIk1NX0RMNiJ9LAotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWE5IiwgIk1NX0RMOSJ9LAotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTIiLCAiTU1fREwxMiJ9LAotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJTRUNfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTUiLCAiTU1fREwxNSJ9LAotCXsiU0VDX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlNFQ19BVVhfUENNX1JYIiwgTlVMTCwgIlNFQ19BVVhfUENNX1JYIEF1ZGlvIE1peGVyIn0sCi0KLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMSIsICJNTV9ETDEifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMiIsICJNTV9ETDIifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMyIsICJNTV9ETDMifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNCIsICJNTV9ETDQifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNSIsICJNTV9ETDUifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNiIsICJNTV9ETDYifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhNyIsICJNTV9ETDcifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOCIsICJNTV9ETDgifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhOSIsICJNTV9ETDkifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTAiLCAiTU1fREwxMCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMSIsICJNTV9ETDExIn0sCi0JeyJURVJUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEyIiwgIk1NX0RMMTIifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTMiLCAiTU1fREwxMyJ9LAotCXsiVEVSVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNCIsICJNTV9ETDE0In0sCi0JeyJURVJUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE1IiwgIk1NX0RMMTUifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTYiLCAiTU1fREwxNiJ9LAotCXsiVEVSVF9BVVhfUENNX1JYIiwgTlVMTCwgIlRFUlRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciJ9LAotCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEiLCAiTU1fREwxIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTIiLCAiTU1fREwyIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTMiLCAiTU1fREwzIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTQiLCAiTU1fREw0In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTUiLCAiTU1fREw1In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTYiLCAiTU1fREw2In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTciLCAiTU1fREw3In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTgiLCAiTU1fREw4In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTkiLCAiTU1fREw5In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEwIiwgIk1NX0RMMTAifSwKLQl7IlFVQVRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTEiLCAiTU1fREwxMSJ9LAotCXsiUVVBVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExMiIsICJNTV9ETDEyIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTEzIiwgIk1NX0RMMTMifSwKLQl7IlFVQVRfQVVYX1BDTV9SWCBBdWRpbyBNaXhlciIsICJNdWx0aU1lZGlhMTQiLCAiTU1fREwxNCJ9LAotCXsiUVVBVF9BVVhfUENNX1JYIEF1ZGlvIE1peGVyIiwgIk11bHRpTWVkaWExNSIsICJNTV9ETDE1In0sCi0JeyJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIiLCAiTXVsdGlNZWRpYTE2IiwgIk1NX0RMMTYifSwKLQl7IlFVQVRfQVVYX1BDTV9SWCIsIE5VTEwsICJRVUFUX0FVWF9QQ01fUlggQXVkaW8gTWl4ZXIifSwKLQotCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJNSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJNSTJTX1JYIiwgTlVMTCwgIk1JMlNfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCi0JeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiUFJJX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJQUklfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlBSSV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiUFJJX0kyU19SWCIsIE5VTEwsICJQUklfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJTRUNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCi0JeyJTRUNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiU0VDX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJTRUNfSTJTX1JYIiwgTlVMTCwgIlNFQ19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKLQl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiU0VDX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlNFQ19NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJTRUNfTUkyU19SWCIsIE5VTEwsICJTRUNfTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKLQl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKLQl7IlNMSU1fMF9SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiU0xJTV8wX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJTTElNXzBfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNXzBfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCi0JeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCi0JeyJTTElNXzZfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IlNMSU1fNl9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiU0xJTV82X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJTTElNQlVTXzZfUlgiLCBOVUxMLCAiU0xJTV82X1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiIsICJWT0lDRTJfREwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAotCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiVVNCX0FVRElPX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJVU0JfQVVESU9fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiVVNCX0FVRElPX1JYIiwgTlVMTCwgIlVTQl9BVURJT19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IklOVEVSTkFMX0JUX1NDT19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiSU5URVJOQUxfQlRfU0NPX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJJTlRFUk5BTF9CVF9TQ09fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKLQl7IklOVF9CVF9TQ09fUlgiLCBOVUxMLCAiSU5URVJOQUxfQlRfU0NPX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiQUZFX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IlBDTV9SWCIsIE5VTEwsICJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IkFVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiQVVYX1BDTV9SWCIsIE5VTEwsICJBVVhfUENNX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAotCXsiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IlNFQ19BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJTRUNfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiU0VDX0FVWF9QQ01fUlgiLCBOVUxMLCAiU0VDX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCi0JeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJURVJUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlRFUlRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiVEVSVF9BVVhfUENNX1JYIiwgTlVMTCwgIlRFUlRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IlFVQVRfQVVYX1BDTV9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiUVVBVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlgiLCBOVUxMLCAiUVVBVF9BVVhfUENNX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJIRE1JX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiSERNSV9SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IkhETUlfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IkhETUkiLCBOVUxMLCAiSERNSV9SWF9Wb2ljZSBNaXhlciJ9LAotCXsiSERNSSIsIE5VTEwsICJIRE1JX0RMX0hMIn0sCi0KLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7Ik1JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7Ik1JMlNfUlgiLCBOVUxMLCAiTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCi0JeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7IlBSSV9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJQUklfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiUFJJX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IlBSSV9NSTJTX1JYIiwgTlVMTCwgIlBSSV9NSTJTX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKLQl7IklOVDBfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiSU5UMF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiSU5UMF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJJTlQwX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IklOVDBfTUkyU19SWCIsIE5VTEwsICJJTlQwX01JMlNfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiSU5UNF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJJTlQ0X01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJJTlQ0X01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IklOVDRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiSU5UNF9NSTJTX1JYIiwgTlVMTCwgIklOVDRfTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKLQl7IlRFUlRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiVEVSVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkRUTUYiLCAiRFRNRl9ETF9ITCJ9LAotCXsiVEVSVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IlRFUlRfTUkyU19SWCIsIE5VTEwsICJURVJUX01JMlNfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIkNTVm9pY2UiLCAiQ1MtVk9JQ0VfREwxIn0sCi0JeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIiwgIlZPSUNFMl9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaXAiLCAiVk9JUF9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIiwgIlZvTFRFX0RMIn0sCi0JeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9XTEFOIiwgIlZvV0xBTl9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJRVUFUX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiUUNIQVQiLCAiUUNIQVRfREwifSwKLQl7IlFVQVRfTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMSIsICJWT0lDRU1NT0RFMV9ETCJ9LAotCXsiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUyIiwgIlZPSUNFTU1PREUyX0RMIn0sCi0JeyJRVUFUX01JMlNfUlgiLCBOVUxMLCAiUVVBVF9NSTJTX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiIsICJWT0lDRTJfREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAotCXsiUVVJTl9NSTJTX1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJRVUlOX01JMlNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiUVVJTl9NSTJTX1JYIiwgTlVMTCwgIlFVSU5fTUkyU19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJRVUFUX1RETV9SWF8yX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJRVUFUX1RETV9SWF8yIiwgTlVMTCwgIlFVQVRfVERNX1JYXzJfVm9pY2UgTWl4ZXIifSwKLQotCXsiVk9DX0VYVF9FQyBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlZPQ19FWFRfRUMgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJWT0NfRVhUX0VDIE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJWT0NfRVhUX0VDIE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJWT0NfRVhUX0VDIE1VWCIsICJTTElNXzFfVFgiLCAgICAiU0xJTUJVU18xX1RYIn0sCi0JeyJDUy1WT0lDRV9VTDEiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKLQl7IlZPSVBfVUwiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKLQl7IlZvTFRFX1VMIiwgTlVMTCwgIlZPQ19FWFRfRUMgTVVYIn0sCi0JeyJWT0lDRTJfVUwiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKLQl7IlZvV0xBTl9VTCIsIE5VTEwsICJWT0NfRVhUX0VDIE1VWCJ9LAotCXsiVk9JQ0VNTU9ERTFfVUwiLCBOVUxMLCAiVk9DX0VYVF9FQyBNVVgifSwKLQl7IlZPSUNFTU1PREUyX1VMIiwgTlVMTCwgIlZPQ19FWFRfRUMgTVVYIn0sCi0KLQl7IkFVRElPX1JFRl9FQ19VTDEgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJRVUFUX1RETV9SWF8wIiwgIlFVQVRfVERNX1JYXzAifSwKLQl7IkFVRElPX1JFRl9FQ19VTDEgTVVYIiwgIlFVQVRfVERNX1JYXzEiLCAiUVVBVF9URE1fUlhfMSJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMSBNVVgiLCAiUVVBVF9URE1fUlhfMiIsICJRVUFUX1RETV9SWF8yIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxIE1VWCIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQotCXsiQVVESU9fUkVGX0VDX1VMMiBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDIgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwyIE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwyIE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0KLQl7IkFVRElPX1JFRl9FQ19VTDMgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwzIE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMyBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMyBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCi0JeyJBVURJT19SRUZfRUNfVUw0IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMNCBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDQgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDQgTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQotCXsiQVVESU9fUkVGX0VDX1VMNSBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDUgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUw1IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUw1IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0KLQl7IkFVRElPX1JFRl9FQ19VTDYgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUw2IE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMNiBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMNiBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCi0JeyJBVURJT19SRUZfRUNfVUw4IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMOCBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDggTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDggTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQotCXsiQVVESU9fUkVGX0VDX1VMOSBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDkgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUw5IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUw5IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0KLQl7IkFVRElPX1JFRl9FQ19VTDEwIE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMTAgTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMTAgTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDEwIE1VWCIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiUVVBVF9URE1fUlhfMCIsICJRVUFUX1RETV9SWF8wIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiUVVBVF9URE1fUlhfMSIsICJRVUFUX1RETV9SWF8xIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiUVVBVF9URE1fUlhfMiIsICJRVUFUX1RETV9SWF8yIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxMCBNVVgiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxNyBNVVgiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDE3IE1VWCIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMTcgTVVYIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDE3IE1VWCIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0KLQl7IkFVRElPX1JFRl9FQ19VTDE4IE1VWCIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMTggTVVYIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxOCBNVVgiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiQVVESU9fUkVGX0VDX1VMMTggTVVYIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQotCXsiQVVESU9fUkVGX0VDX1VMMTkgTVVYIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxOSBNVVgiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IkFVRElPX1JFRl9FQ19VTDE5IE1VWCIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJBVURJT19SRUZfRUNfVUwxOSBNVVgiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCi0JeyJNTV9VTDEiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMMSBNVVgifSwKLQl7Ik1NX1VMMiIsIE5VTEwsICJBVURJT19SRUZfRUNfVUwyIE1VWCJ9LAotCXsiTU1fVUwzIiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDMgTVVYIn0sCi0JeyJNTV9VTDQiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMNCBNVVgifSwKLQl7Ik1NX1VMNSIsIE5VTEwsICJBVURJT19SRUZfRUNfVUw1IE1VWCJ9LAotCXsiTU1fVUw2IiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDYgTVVYIn0sCi0JeyJNTV9VTDgiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMOCBNVVgifSwKLQl7Ik1NX1VMOSIsIE5VTEwsICJBVURJT19SRUZfRUNfVUw5IE1VWCJ9LAotCXsiTU1fVUwxMCIsIE5VTEwsICJBVURJT19SRUZfRUNfVUwxMCBNVVgifSwKLQl7Ik1NX1VMMTYiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMMTYgTVVYIn0sCi0JeyJNTV9VTDE3IiwgTlVMTCwgIkFVRElPX1JFRl9FQ19VTDE3IE1VWCJ9LAotCXsiTU1fVUwxOCIsIE5VTEwsICJBVURJT19SRUZfRUNfVUwxOCBNVVgifSwKLQl7Ik1NX1VMMTkiLCBOVUxMLCAiQVVESU9fUkVGX0VDX1VMMTkgTVVYIn0sCi0KLQl7IlZvaWNlX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2ljZSIsICJQUklfSTJTX1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb2ljZSIsICJQUklfTUkyU19UWCJ9LAotCXsiVm9pY2VfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb2ljZSIsICJNSTJTX1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfVm9pY2UiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzBfVFhfVm9pY2UiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzdfVFhfVm9pY2UiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9pY2UiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJVU0JfQVVESU9fVFhfVm9pY2UiLCAiVVNCX0FVRElPX1RYIn0sCi0JeyJWb2ljZV9UeCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFhfVm9pY2UiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiVm9pY2VfVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb2ljZSIsICJQQ01fVFgifSwKLQl7IlZvaWNlX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfVm9pY2UiLCAiQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2VfVHggTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFhfVm9pY2UiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb2ljZSIsICJURVJUX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9Wb2ljZSIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlX1R4IE1peGVyIiwgIlNFQ19NSTJTX1RYX1ZvaWNlIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJDUy1WT0lDRV9VTDEiLCBOVUxMLCAiVm9pY2VfVHggTWl4ZXIifSwKLQotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2ljZTIiLCAiUFJJX0kyU19UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlBSSV9NSTJTX1RYX1ZvaWNlMiIsICJQUklfTUkyU19UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIk1JMlNfVFhfVm9pY2UyIiwgIk1JMlNfVFgifSwKLQl7IlZvaWNlMl9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfVm9pY2UyIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb2ljZTIiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJWb2ljZTJfVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvaWNlMiIsICJTTElNQlVTXzdfVFgifSwKLQl7IlZvaWNlMl9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9pY2UyIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb2ljZTIiLCAiVVNCX0FVRElPX1RYIn0sCi0JeyJWb2ljZTJfVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaWNlMiIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJWb2ljZTJfVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb2ljZTIiLCAiUENNX1RYIn0sCi0JeyJWb2ljZTJfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb2ljZTIiLCAiQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvaWNlMiIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2UyX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb2ljZTIiLCAiVEVSVF9BVVhfUENNX1RYIn0sCi0JeyJWb2ljZTJfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvaWNlMiIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlZPSUNFMl9VTCIsIE5VTEwsICJWb2ljZTJfVHggTWl4ZXIifSwKLQotCXsiVm9MVEVfVHggTWl4ZXIiLCAiUFJJX1RYX1ZvTFRFIiwgIlBSSV9JMlNfVFgifSwKLQl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb0xURSIsICJTTElNQlVTXzBfVFgifSwKLQl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fN19UWF9Wb0xURSIsICJTTElNQlVTXzdfVFgifSwKLQl7IlZvTFRFX1R4IE1peGVyIiwgIlNMSU1fOF9UWF9Wb0xURSIsICJTTElNQlVTXzhfVFgifSwKLQl7IlZvTFRFX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb0xURSIsICJVU0JfQVVESU9fVFgifSwKLQl7IlZvTFRFX1R4IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWF9Wb0xURSIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJWb0xURV9UeCBNaXhlciIsICJBRkVfUENNX1RYX1ZvTFRFIiwgIlBDTV9UWCJ9LAotCXsiVm9MVEVfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb0xURSIsICJBVVhfUENNX1RYIn0sCi0JeyJWb0xURV9UeCBNaXhlciIsICJTRUNfQVVYX1BDTV9UWF9Wb0xURSIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiVm9MVEVfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX1ZvTFRFIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiVm9MVEVfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvTFRFIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiVm9MVEVfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb0xURSIsICJNSTJTX1RYIn0sCi0JeyJWb0xURV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb0xURSIsICJQUklfTUkyU19UWCJ9LAotCXsiVm9MVEVfVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvTFRFIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiVm9MVEVfVUwiLCBOVUxMLCAiVm9MVEVfVHggTWl4ZXIifSwKLQotCXsiVm9XTEFOX1R4IE1peGVyIiwgIlBSSV9UWF9Wb1dMQU4iLCAiUFJJX0kyU19UWCJ9LAotCXsiVm9XTEFOX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9Wb1dMQU4iLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvV0xBTiIsICJTTElNQlVTXzdfVFgifSwKLQl7IlZvV0xBTl9UeCBNaXhlciIsICJTTElNXzhfVFhfVm9XTEFOIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiVm9XTEFOX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9Wb1dMQU4iLCAiVVNCX0FVRElPX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvV0xBTiIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9Wb1dMQU4iLCAiUENNX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9Wb1dMQU4iLCAiQVVYX1BDTV9UWCJ9LAotCXsiVm9XTEFOX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvV0xBTiIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiVm9XTEFOX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9Wb1dMQU4iLCAiVEVSVF9BVVhfUENNX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX1ZvV0xBTiIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlZvV0xBTl9UeCBNaXhlciIsICJNSTJTX1RYX1ZvV0xBTiIsICJNSTJTX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiUFJJX01JMlNfVFhfVm9XTEFOIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJWb1dMQU5fVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvV0xBTiIsICJURVJUX01JMlNfVFgifSwKLQl7IlZvV0xBTl9VTCIsIE5VTEwsICJWb1dMQU5fVHggTWl4ZXIifSwKLQotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiUFJJX1RYX01Nb2RlMSIsICJQUklfSTJTX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJQUklfTUkyU19UWF9NTW9kZTEiLCAiUFJJX01JMlNfVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIk1JMlNfVFhfTU1vZGUxIiwgIk1JMlNfVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIlRFUlRfTUkyU19UWF9NTW9kZTEiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJJTlQzX01JMlNfVFhfTU1vZGUxIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiU0xJTV8wX1RYX01Nb2RlMSIsICJTTElNQlVTXzBfVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIlNMSU1fN19UWF9NTW9kZTEiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJTTElNXzhfVFhfTU1vZGUxIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiVVNCX0FVRElPX1RYX01Nb2RlMSIsICJVU0JfQVVESU9fVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIklOVF9CVF9TQ09fVFhfTU1vZGUxIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIkFGRV9QQ01fVFhfTU1vZGUxIiwgIlBDTV9UWCJ9LAotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiQVVYX1BDTV9UWF9NTW9kZTEiLCAiQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFhfTU1vZGUxIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMV9UeCBNaXhlciIsICJURVJUX0FVWF9QQ01fVFhfTU1vZGUxIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2VNTW9kZTFfVHggTWl4ZXIiLCAiUVVBVF9BVVhfUENNX1RYX01Nb2RlMSIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlTU1vZGUxX1R4IE1peGVyIiwgIlFVQVRfVERNX1RYXzBfTU1vZGUxIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlZPSUNFTU1PREUxX1VMIiwgTlVMTCwgIlZvaWNlTU1vZGUxX1R4IE1peGVyIn0sCi0KLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlBSSV9UWF9NTW9kZTIiLCAiUFJJX0kyU19UWCJ9LAotCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiUFJJX01JMlNfVFhfTU1vZGUyIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJNSTJTX1RYX01Nb2RlMiIsICJNSTJTX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJURVJUX01JMlNfVFhfTU1vZGUyIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiSU5UM19NSTJTX1RYX01Nb2RlMiIsICJJTlQzX01JMlNfVFgifSwKLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlNMSU1fMF9UWF9NTW9kZTIiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJTTElNXzdfVFhfTU1vZGUyIiwgIlNMSU1CVVNfN19UWCJ9LAotCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiU0xJTV84X1RYX01Nb2RlMiIsICJTTElNQlVTXzhfVFgifSwKLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9NTW9kZTIiLCAiVVNCX0FVRElPX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJJTlRfQlRfU0NPX1RYX01Nb2RlMiIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJWb2ljZU1Nb2RlMl9UeCBNaXhlciIsICJBRkVfUENNX1RYX01Nb2RlMiIsICJQQ01fVFgifSwKLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfTU1vZGUyIiwgIkFVWF9QQ01fVFgifSwKLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX01Nb2RlMiIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2VNTW9kZTJfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX01Nb2RlMiIsICJURVJUX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlTU1vZGUyX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9NTW9kZTIiLCAiUVVBVF9BVVhfUENNX1RYIn0sCi0JeyJWT0lDRU1NT0RFMl9VTCIsIE5VTEwsICJWb2ljZU1Nb2RlMl9UeCBNaXhlciJ9LAotCi0JeyJWb2lwX1R4IE1peGVyIiwgIlBSSV9UWF9Wb2lwIiwgIlBSSV9JMlNfVFgifSwKLQl7IlZvaXBfVHggTWl4ZXIiLCAiTUkyU19UWF9Wb2lwIiwgIk1JMlNfVFgifSwKLQl7IlZvaXBfVHggTWl4ZXIiLCAiVEVSVF9NSTJTX1RYX1ZvaXAiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJWb2lwX1R4IE1peGVyIiwgIklOVDNfTUkyU19UWF9Wb2lwIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiVm9pcF9UeCBNaXhlciIsICJTTElNXzBfVFhfVm9pcCIsICJTTElNQlVTXzBfVFgifSwKLQl7IlZvaXBfVHggTWl4ZXIiLCAiU0xJTV83X1RYX1ZvaXAiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb2lwX1R4IE1peGVyIiwgIlNMSU1fOF9UWF9Wb2lwIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiVm9pcF9UeCBNaXhlciIsICJVU0JfQVVESU9fVFhfVm9pcCIsICJVU0JfQVVESU9fVFgifSwKLQl7IlZvaXBfVHggTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYX1ZvaXAiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiVm9pcF9UeCBNaXhlciIsICJBRkVfUENNX1RYX1ZvaXAiLCAiUENNX1RYIn0sCi0JeyJWb2lwX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfVm9pcCIsICJBVVhfUENNX1RYIn0sCi0JeyJWb2lwX1R4IE1peGVyIiwgIlNFQ19BVVhfUENNX1RYX1ZvaXAiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlZvaXBfVHggTWl4ZXIiLCAiVEVSVF9BVVhfUENNX1RYX1ZvaXAiLCAiVEVSVF9BVVhfUENNX1RYIn0sCi0JeyJWb2lwX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9Wb2lwIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiVm9pcF9UeCBNaXhlciIsICJQUklfTUkyU19UWF9Wb2lwIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJWT0lQX1VMIiwgTlVMTCwgIlZvaXBfVHggTWl4ZXIifSwKLQotCXsiU0xJTUJVU19ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTBfRExfSEwifSwKLQl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNQlVTX0RMX0hMIn0sCi0JeyJTTElNQlVTMV9ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTFfRExfSEwifSwKLQl7IlNMSU1CVVNfMV9SWCIsIE5VTEwsICJTTElNQlVTMV9ETF9ITCJ9LAotCXsiU0xJTUJVUzNfRExfSEwiLCAiU3dpdGNoIiwgIlNMSU0zX0RMX0hMIn0sCi0JeyJTTElNQlVTXzNfUlgiLCBOVUxMLCAiU0xJTUJVUzNfRExfSEwifSwKLQl7IlNMSU1CVVM0X0RMX0hMIiwgIlN3aXRjaCIsICJTTElNNF9ETF9ITCJ9LAotCXsiU0xJTUJVU180X1JYIiwgTlVMTCwgIlNMSU1CVVM0X0RMX0hMIn0sCi0JeyJTTElNQlVTNl9ETF9ITCIsICJTd2l0Y2giLCAiU0xJTTBfRExfSEwifSwKLQl7IlNMSU1CVVNfNl9SWCIsIE5VTEwsICJTTElNQlVTNl9ETF9ITCJ9LAotCXsiU0xJTTBfVUxfSEwiLCBOVUxMLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJTTElNMV9VTF9ITCIsIE5VTEwsICJTTElNQlVTXzFfVFgifSwKLQl7IlNMSU0zX1VMX0hMIiwgTlVMTCwgIlNMSU1CVVNfM19UWCJ9LAotCXsiU0xJTTRfVUxfSEwiLCBOVUxMLCAiU0xJTUJVU180X1RYIn0sCi0JeyJTTElNOF9VTF9ITCIsIE5VTEwsICJTTElNQlVTXzhfVFgifSwKLQotCXsiTFNNMSBNaXhlciIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJMU00xIE1peGVyIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKLQl7IkxTTTEgTWl4ZXIiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiTFNNMSBNaXhlciIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJMU00xIE1peGVyIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKLQl7IkxTTTEgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTFNNMSBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJMU00xIE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKLQl7IkxTTTFfVUxfSEwiLCBOVUxMLCAiTFNNMSBNaXhlciJ9LAotCi0JeyJMU00yIE1peGVyIiwgIlNMSU1CVVNfMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7IkxTTTIgTWl4ZXIiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiTFNNMiBNaXhlciIsICJTTElNQlVTXzNfVFgiLCAiU0xJTUJVU18zX1RYIn0sCi0JeyJMU00yIE1peGVyIiwgIlNMSU1CVVNfNF9UWCIsICJTTElNQlVTXzRfVFgifSwKLQl7IkxTTTIgTWl4ZXIiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAotCXsiTFNNMiBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJMU00yIE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IkxTTTIgTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiTFNNMl9VTF9ITCIsIE5VTEwsICJMU00yIE1peGVyIn0sCi0KLQotCXsiTFNNMyBNaXhlciIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJMU00zIE1peGVyIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKLQl7IkxTTTMgTWl4ZXIiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiTFNNMyBNaXhlciIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJMU00zIE1peGVyIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKLQl7IkxTTTMgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTFNNMyBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJMU00zIE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKLQl7IkxTTTNfVUxfSEwiLCBOVUxMLCAiTFNNMyBNaXhlciJ9LAotCi0KLQl7IkxTTTQgTWl4ZXIiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTFNNNCBNaXhlciIsICJTTElNQlVTXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJMU000IE1peGVyIiwgIlNMSU1CVVNfM19UWCIsICJTTElNQlVTXzNfVFgifSwKLQl7IkxTTTQgTWl4ZXIiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAotCXsiTFNNNCBNaXhlciIsICJTTElNQlVTXzVfVFgiLCAiU0xJTUJVU181X1RYIn0sCi0JeyJMU000IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IkxTTTQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTFNNNCBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJMU000X1VMX0hMIiwgTlVMTCwgIkxTTTQgTWl4ZXIifSwKLQotCXsiTFNNNSBNaXhlciIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJMU001IE1peGVyIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKLQl7IkxTTTUgTWl4ZXIiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiTFNNNSBNaXhlciIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJMU001IE1peGVyIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKLQl7IkxTTTUgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiTFNNNSBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJMU001IE1peGVyIiwgIklOVDNfTUkyU19UWCIsICJJTlQzX01JMlNfVFgifSwKLQl7IkxTTTVfVUxfSEwiLCBOVUxMLCAiTFNNNSBNaXhlciJ9LAotCi0JeyJMU002IE1peGVyIiwgIlNMSU1CVVNfMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7IkxTTTYgTWl4ZXIiLCAiU0xJTUJVU18xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiTFNNNiBNaXhlciIsICJTTElNQlVTXzNfVFgiLCAiU0xJTUJVU18zX1RYIn0sCi0JeyJMU002IE1peGVyIiwgIlNMSU1CVVNfNF9UWCIsICJTTElNQlVTXzRfVFgifSwKLQl7IkxTTTYgTWl4ZXIiLCAiU0xJTUJVU181X1RYIiwgIlNMSU1CVVNfNV9UWCJ9LAotCXsiTFNNNiBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJMU002X1VMX0hMIiwgTlVMTCwgIkxTTTYgTWl4ZXIifSwKLQotCXsiTFNNNyBNaXhlciIsICJTTElNQlVTXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJMU003IE1peGVyIiwgIlNMSU1CVVNfMV9UWCIsICJTTElNQlVTXzFfVFgifSwKLQl7IkxTTTcgTWl4ZXIiLCAiU0xJTUJVU18zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiTFNNNyBNaXhlciIsICJTTElNQlVTXzRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJMU003IE1peGVyIiwgIlNMSU1CVVNfNV9UWCIsICJTTElNQlVTXzVfVFgifSwKLQl7IkxTTTcgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiTFNNN19VTF9ITCIsIE5VTEwsICJMU003IE1peGVyIn0sCi0KLQl7IkxTTTggTWl4ZXIiLCAiU0xJTUJVU18wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiTFNNOCBNaXhlciIsICJTTElNQlVTXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJMU004IE1peGVyIiwgIlNMSU1CVVNfM19UWCIsICJTTElNQlVTXzNfVFgifSwKLQl7IkxTTTggTWl4ZXIiLCAiU0xJTUJVU180X1RYIiwgIlNMSU1CVVNfNF9UWCJ9LAotCXsiTFNNOCBNaXhlciIsICJTTElNQlVTXzVfVFgiLCAiU0xJTUJVU181X1RYIn0sCi0JeyJMU004IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IkxTTThfVUxfSEwiLCBOVUxMLCAiTFNNOCBNaXhlciJ9LAotCi0KLQl7IkNQRV9MU01fVUxfSEwiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIlBSSV9UWF9RQ0hBVCIsICJQUklfSTJTX1RYIn0sCi0JeyJRQ0hBVF9UeCBNaXhlciIsICJTTElNXzBfVFhfUUNIQVQiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJRQ0hBVF9UeCBNaXhlciIsICJTTElNXzdfVFhfUUNIQVQiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJRQ0hBVF9UeCBNaXhlciIsICJTTElNXzhfVFhfUUNIQVQiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJRQ0hBVF9UeCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFhfUUNIQVQiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiUUNIQVRfVHggTWl4ZXIiLCAiQUZFX1BDTV9UWF9RQ0hBVCIsICJQQ01fVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIkFVWF9QQ01fVFhfUUNIQVQiLCAiQVVYX1BDTV9UWCJ9LAotCXsiUUNIQVRfVHggTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVFhfUUNIQVQiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIlRFUlRfQVVYX1BDTV9UWF9RQ0hBVCIsICJURVJUX0FVWF9QQ01fVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIlFVQVRfQVVYX1BDTV9UWF9RQ0hBVCIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIk1JMlNfVFhfUUNIQVQiLCAiTUkyU19UWCJ9LAotCXsiUUNIQVRfVHggTWl4ZXIiLCAiUFJJX01JMlNfVFhfUUNIQVQiLCAiUFJJX01JMlNfVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIlRFUlRfTUkyU19UWF9RQ0hBVCIsICJURVJUX01JMlNfVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIklOVDNfTUkyU19UWF9RQ0hBVCIsICJJTlQzX01JMlNfVFgifSwKLQl7IlFDSEFUX1R4IE1peGVyIiwgIlVTQl9BVURJT19UWF9RQ0hBVCIsICJVU0JfQVVESU9fVFgifSwKLQl7IlFDSEFUX1VMIiwgTlVMTCwgIlFDSEFUX1R4IE1peGVyIn0sCi0KLQl7IklOVF9GTV9SWCIsIE5VTEwsICJJTlRGTV9ETF9ITCJ9LAotCXsiSU5URk1fVUxfSEwiLCBOVUxMLCAiSU5UX0ZNX1RYIn0sCi0JeyJJTlRIRlBfVUxfSEwiLCBOVUxMLCAiSEZQX1BSSV9BVVhfVUxfSEwifSwKLQl7IkhGUF9QUklfQVVYX1VMX0hMIiwgIlN3aXRjaCIsICJBVVhfUENNX1RYIn0sCi0JeyJJTlRIRlBfVUxfSEwiLCBOVUxMLCAiSEZQX0FVWF9VTF9ITCJ9LAotCXsiSEZQX0FVWF9VTF9ITCIsICJTd2l0Y2giLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IklOVEhGUF9VTF9ITCIsIE5VTEwsICJIRlBfSU5UX1VMX0hMIn0sCi0JeyJIRlBfSU5UX1VMX0hMIiwgIlN3aXRjaCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJTTElNN19VTF9ITCIsIE5VTEwsICJIRlBfU0xJTTdfVUxfSEwifSwKLQl7IkhGUF9TTElNN19VTF9ITCIsICJTd2l0Y2giLCAiU0xJTUJVU183X1RYIn0sCi0JeyJBVVhfUENNX1JYIiwgTlVMTCwgIkFVWFBDTV9ETF9ITCJ9LAotCXsiQVVYX1BDTV9SWCIsIE5VTEwsICJJTlRIRlBfRExfSEwifSwKLQl7IkFVWFBDTV9VTF9ITCIsIE5VTEwsICJBVVhfUENNX1RYIn0sCi0JeyJNSTJTX1JYIiwgTlVMTCwgIk1JMlNfRExfSEwifSwKLQl7Ik1JMlNfVUxfSEwiLCBOVUxMLCAiTUkyU19UWCJ9LAotCXsiUENNX1JYX0RMX0hMIiwgIlN3aXRjaCIsICJTTElNMF9ETF9ITCJ9LAotCXsiUENNX1JYIiwgTlVMTCwgIlBDTV9SWF9ETF9ITCJ9LAotCi0JLyogY29ubmVjdCB0byBJTlQ0X01JMlNfRExfSEwgc2luY2Ugc2FtZSBwY21faWQgKi8KLQl7IklOVDBfTUkyU19SWF9ETF9ITCIsICJTd2l0Y2giLCAiSU5UNF9NSTJTX0RMX0hMIn0sCi0JeyJJTlQwX01JMlNfUlgiLCBOVUxMLCAiSU5UMF9NSTJTX1JYX0RMX0hMIn0sCi0JeyJJTlQ0X01JMlNfUlhfRExfSEwiLCAiU3dpdGNoIiwgIklOVDRfTUkyU19ETF9ITCJ9LAotCXsiSU5UNF9NSTJTX1JYIiwgTlVMTCwgIklOVDRfTUkyU19SWF9ETF9ITCJ9LAotCXsiUFJJX01JMlNfUlhfRExfSEwiLCAiU3dpdGNoIiwgIlBSSV9NSTJTX0RMX0hMIn0sCi0JeyJQUklfTUkyU19SWCIsIE5VTEwsICJQUklfTUkyU19SWF9ETF9ITCJ9LAotCXsiU0VDX01JMlNfUlhfRExfSEwiLCAiU3dpdGNoIiwgIlNFQ19NSTJTX0RMX0hMIn0sCi0JeyJTRUNfTUkyU19SWCIsIE5VTEwsICJTRUNfTUkyU19SWF9ETF9ITCJ9LAotCXsiVEVSVF9NSTJTX1JYX0RMX0hMIiwgIlN3aXRjaCIsICJURVJUX01JMlNfRExfSEwifSwKLQl7IlRFUlRfTUkyU19SWCIsIE5VTEwsICJURVJUX01JMlNfUlhfRExfSEwifSwKLQotCXsiUVVBVF9NSTJTX1JYX0RMX0hMIiwgIlN3aXRjaCIsICJRVUFUX01JMlNfRExfSEwifSwKLQl7IlFVQVRfTUkyU19SWCIsIE5VTEwsICJRVUFUX01JMlNfUlhfRExfSEwifSwKLQl7Ik1JMlNfVUxfSEwiLCBOVUxMLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJJTlQzX01JMlNfVUxfSEwiLCBOVUxMLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJURVJUX01JMlNfVUxfSEwiLCBOVUxMLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJTRUNfSTJTX1JYIiwgTlVMTCwgIlNFQ19JMlNfRExfSEwifSwKLQl7IlBSSV9NSTJTX1VMX0hMIiwgTlVMTCwgIlBSSV9NSTJTX1RYIn0sCi0JeyJTRUNfTUkyU19VTF9ITCIsIE5VTEwsICJTRUNfTUkyU19UWCJ9LAotCXsiU0VDX01JMlNfUlgiLCBOVUxMLCAiU0VDX01JMlNfRExfSEwifSwKLQl7IlBSSV9NSTJTX1JYIiwgTlVMTCwgIlBSSV9NSTJTX0RMX0hMIn0sCi0JeyJURVJUX01JMlNfUlgiLCBOVUxMLCAiVEVSVF9NSTJTX0RMX0hMIn0sCi0JeyJRVUFUX01JMlNfVUxfSEwiLCBOVUxMLCAiUVVBVF9NSTJTX1RYIn0sCi0KLQl7IlBSSV9URE1fVFhfMF9VTF9ITCIsIE5VTEwsICJQUklfVERNX1RYXzAifSwKLQl7IlBSSV9URE1fVFhfMV9VTF9ITCIsIE5VTEwsICJQUklfVERNX1RYXzEifSwKLQl7IlBSSV9URE1fVFhfMl9VTF9ITCIsIE5VTEwsICJQUklfVERNX1RYXzIifSwKLQl7IlBSSV9URE1fVFhfM19VTF9ITCIsIE5VTEwsICJQUklfVERNX1RYXzMifSwKLQl7IlBSSV9URE1fUlhfMCIsIE5VTEwsICJQUklfVERNX1JYXzBfRExfSEwifSwKLQl7IlBSSV9URE1fUlhfMSIsIE5VTEwsICJQUklfVERNX1JYXzFfRExfSEwifSwKLQl7IlBSSV9URE1fUlhfMiIsIE5VTEwsICJQUklfVERNX1JYXzJfRExfSEwifSwKLQl7IlBSSV9URE1fUlhfMyIsIE5VTEwsICJQUklfVERNX1JYXzNfRExfSEwifSwKLQl7IlNFQ19URE1fVFhfMF9VTF9ITCIsIE5VTEwsICJTRUNfVERNX1RYXzAifSwKLQl7IlNFQ19URE1fVFhfMV9VTF9ITCIsIE5VTEwsICJTRUNfVERNX1RYXzEifSwKLQl7IlNFQ19URE1fVFhfMl9VTF9ITCIsIE5VTEwsICJTRUNfVERNX1RYXzIifSwKLQl7IlNFQ19URE1fVFhfM19VTF9ITCIsIE5VTEwsICJTRUNfVERNX1RYXzMifSwKLQl7IlNFQ19URE1fUlhfMCIsIE5VTEwsICJTRUNfVERNX1JYXzBfRExfSEwifSwKLQl7IlNFQ19URE1fUlhfMSIsIE5VTEwsICJTRUNfVERNX1JYXzFfRExfSEwifSwKLQl7IlNFQ19URE1fUlhfMiIsIE5VTEwsICJTRUNfVERNX1JYXzJfRExfSEwifSwKLQl7IlNFQ19URE1fUlhfMyIsIE5VTEwsICJTRUNfVERNX1JYXzNfRExfSEwifSwKLQl7IlRFUlRfVERNX1RYXzBfVUxfSEwiLCBOVUxMLCAiVEVSVF9URE1fVFhfMCJ9LAotCXsiVEVSVF9URE1fVFhfMV9VTF9ITCIsIE5VTEwsICJURVJUX1RETV9UWF8xIn0sCi0JeyJURVJUX1RETV9UWF8yX1VMX0hMIiwgTlVMTCwgIlRFUlRfVERNX1RYXzIifSwKLQl7IlRFUlRfVERNX1RYXzNfVUxfSEwiLCBOVUxMLCAiVEVSVF9URE1fVFhfMyJ9LAotCXsiVEVSVF9URE1fUlhfMCIsIE5VTEwsICJURVJUX1RETV9SWF8wX0RMX0hMIn0sCi0JeyJURVJUX1RETV9SWF8xIiwgTlVMTCwgIlRFUlRfVERNX1JYXzFfRExfSEwifSwKLQl7IlRFUlRfVERNX1JYXzIiLCBOVUxMLCAiVEVSVF9URE1fUlhfMl9ETF9ITCJ9LAotCXsiVEVSVF9URE1fUlhfMyIsIE5VTEwsICJURVJUX1RETV9SWF8zX0RMX0hMIn0sCi0JeyJRVUFUX1RETV9UWF8wX1VMX0hMIiwgTlVMTCwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlFVQVRfVERNX1RYXzFfVUxfSEwiLCBOVUxMLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUVVBVF9URE1fVFhfMl9VTF9ITCIsIE5VTEwsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJRVUFUX1RETV9UWF8zX1VMX0hMIiwgTlVMTCwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlFVQVRfVERNX1JYXzAiLCBOVUxMLCAiUVVBVF9URE1fUlhfMF9ETF9ITCJ9LAotCXsiUVVBVF9URE1fUlhfMSIsIE5VTEwsICJRVUFUX1RETV9SWF8xX0RMX0hMIn0sCi0JeyJRVUFUX1RETV9SWF8yIiwgTlVMTCwgIlFVQVRfVERNX1JYXzJfRExfSEwifSwKLQl7IlFVQVRfVERNX1JYXzMiLCBOVUxMLCAiUVVBVF9URE1fUlhfM19ETF9ITCJ9LAotCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUFJJX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUFJJX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlBSSV9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUFJJX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlBSSV9URE1fUlhfMCIsIE5VTEwsICJQUklfVERNX1JYXzAgUG9ydCBNaXhlciJ9LAotCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUFJJX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUFJJX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlBSSV9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUFJJX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlBSSV9URE1fUlhfMSIsIE5VTEwsICJQUklfVERNX1JYXzEgUG9ydCBNaXhlciJ9LAotCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUFJJX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUFJJX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlBSSV9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUFJJX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlBSSV9URE1fUlhfMiIsIE5VTEwsICJQUklfVERNX1JYXzIgUG9ydCBNaXhlciJ9LAotCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUFJJX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUFJJX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzAiLCAiUFJJX1RETV9UWF8wIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzEiLCAiUFJJX1RETV9UWF8xIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzIiLCAiUFJJX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfVERNX1RYXzMiLCAiUFJJX1RETV9UWF8zIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlBSSV9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUFJJX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJQUklfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlBSSV9URE1fUlhfMyIsIE5VTEwsICJQUklfVERNX1JYXzMgUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0VDX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0VDX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlNFQ19URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiU0VDX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlNFQ19URE1fUlhfMCIsIE5VTEwsICJTRUNfVERNX1JYXzAgUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0VDX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0VDX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlNFQ19URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiU0VDX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlNFQ19URE1fUlhfMSIsIE5VTEwsICJTRUNfVERNX1JYXzEgUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0VDX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0VDX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlNFQ19URE1fUlhfMiBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiU0VDX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlNFQ19URE1fUlhfMiIsIE5VTEwsICJTRUNfVERNX1JYXzIgUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0VDX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0VDX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzAiLCAiU0VDX1RETV9UWF8wIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzEiLCAiU0VDX1RETV9UWF8xIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzIiLCAiU0VDX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfVERNX1RYXzMiLCAiU0VDX1RETV9UWF8zIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlNFQ19URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiU0VDX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlNFQ19URE1fUlhfMyIsIE5VTEwsICJTRUNfVERNX1JYXzMgUG9ydCBNaXhlciJ9LAotCi0JeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7IlRFUlRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlRFUlRfVERNX1JYXzAiLCBOVUxMLCAiVEVSVF9URE1fUlhfMCBQb3J0IE1peGVyIn0sCi0KLQl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlRFUlRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzIiLCAiVEVSVF9URE1fVFhfMiJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAotCXsiVEVSVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCXsiVEVSVF9URE1fUlhfMSIsIE5VTEwsICJURVJUX1RETV9SWF8xIFBvcnQgTWl4ZXIifSwKLQotCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAotCXsiVEVSVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJURVJUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCi0JeyJURVJUX1RETV9SWF8yIiwgTlVMTCwgIlRFUlRfVERNX1JYXzIgUG9ydCBNaXhlciJ9LAotCi0JeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJURVJUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7IlRFUlRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlRFUlRfVERNX1JYXzMiLCBOVUxMLCAiVEVSVF9URE1fUlhfMyBQb3J0IE1peGVyIn0sCi0KLQl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlFVQVRfVERNX1JYXzAgUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzIiLCAiVEVSVF9URE1fVFhfMiJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAotCXsiUVVBVF9URE1fUlhfMCBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCXsiUVVBVF9URE1fUlhfMCIsIE5VTEwsICJRVUFUX1RETV9SWF8wIFBvcnQgTWl4ZXIifSwKLQotCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIkFVWF9QQ01fVUxfVFgiLCAiQVVYX1BDTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMSBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMCIsICJURVJUX1RETV9UWF8wIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMSIsICJURVJUX1RETV9UWF8xIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMiIsICJURVJUX1RETV9UWF8yIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiVEVSVF9URE1fVFhfMyIsICJURVJUX1RETV9UWF8zIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMSIsICJRVUFUX1RETV9UWF8xIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMiIsICJRVUFUX1RETV9UWF8yIn0sCi0JeyJRVUFUX1RETV9SWF8xIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMyIsICJRVUFUX1RETV9UWF8zIn0sCi0JeyJRVUFUX1RETV9SWF8xIiwgTlVMTCwgIlFVQVRfVERNX1JYXzEgUG9ydCBNaXhlciJ9LAotCi0JeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJJTlRFUk5BTF9CVF9TQ09fVFgiLCAiSU5UX0JUX1NDT19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8yIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8wIiwgIlRFUlRfVERNX1RYXzAifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8xIiwgIlRFUlRfVERNX1RYXzEifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8yIiwgIlRFUlRfVERNX1RYXzIifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJURVJUX1RETV9UWF8zIiwgIlRFUlRfVERNX1RYXzMifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8wIiwgIlFVQVRfVERNX1RYXzAifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8xIiwgIlFVQVRfVERNX1RYXzEifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8yIiwgIlFVQVRfVERNX1RYXzIifSwKLQl7IlFVQVRfVERNX1JYXzIgUG9ydCBNaXhlciIsICJRVUFUX1RETV9UWF8zIiwgIlFVQVRfVERNX1RYXzMifSwKLQl7IlFVQVRfVERNX1JYXzIiLCBOVUxMLCAiUVVBVF9URE1fUlhfMiBQb3J0IE1peGVyIn0sCi0KLQl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlFVQVRfVERNX1JYXzMgUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzAiLCAiVEVSVF9URE1fVFhfMCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzEiLCAiVEVSVF9URE1fVFhfMSJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzIiLCAiVEVSVF9URE1fVFhfMiJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlRFUlRfVERNX1RYXzMiLCAiVEVSVF9URE1fVFhfMyJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzAiLCAiUVVBVF9URE1fVFhfMCJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzEiLCAiUVVBVF9URE1fVFhfMSJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzIiLCAiUVVBVF9URE1fVFhfMiJ9LAotCXsiUVVBVF9URE1fUlhfMyBQb3J0IE1peGVyIiwgIlFVQVRfVERNX1RYXzMiLCAiUVVBVF9URE1fVFhfMyJ9LAotCXsiUVVBVF9URE1fUlhfMyIsIE5VTEwsICJRVUFUX1RETV9SWF8zIFBvcnQgTWl4ZXIifSwKLQotCXsiSU5UMF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IklOVDBfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJJTlQwX01JMlNfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IklOVDBfTUkyU19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJJTlQwX01JMlNfUlgiLCBOVUxMLCAiSU5UMF9NSTJTX1JYIFBvcnQgTWl4ZXIifSwKLQotCXsiSU5UNF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IklOVDRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJURVJUX01JMlNfVFgiLCAiVEVSVF9NSTJTX1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJJTlQzX01JMlNfVFgiLCAiSU5UM19NSTJTX1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJJTlQ0X01JMlNfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IklOVDRfTUkyU19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJJTlQ0X01JMlNfUlgiLCBOVUxMLCAiSU5UNF9NSTJTX1JYIFBvcnQgTWl4ZXIifSwKLQotCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJURVJUX0FVWFBDTV9VTF9UWCIsICJURVJUX0FVWF9QQ01fVFgifSwKLQl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIlFVQVRfQVVYUENNX1VMX1RYIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJTTElNQlVTXzBfUlggUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIiLCAiU0VDX01JMlNfVFgiLCAiU0VDX01JMlNfVFgifSwKLQl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlNMSU1CVVNfMF9SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJTTElNQlVTXzBfUlgiLCBOVUxMLCAiU0xJTUJVU18wX1JYIFBvcnQgTWl4ZXIifSwKLQl7IkFGRV9QQ01fUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IkFGRV9QQ01fUlggUG9ydCBNaXhlciIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJQQ01fUlgiLCBOVUxMLCAiQUZFX1BDTV9SWCBQb3J0IE1peGVyIn0sCi0JeyJVU0JfQVVESU9fUlggUG9ydCBNaXhlciIsICJVU0JfQVVESU9fVFgiLCAiVVNCX0FVRElPX1RYIn0sCi0JeyJVU0JfQVVESU9fUlgiLCBOVUxMLCAiVVNCX0FVRElPX1JYIFBvcnQgTWl4ZXIifSwKLQl7IlVTQl9ETF9ITCIsICJTd2l0Y2giLCAiVVNCQVVESU9fRExfSEwifSwKLQl7IlVTQl9BVURJT19SWCIsIE5VTEwsICJVU0JfRExfSEwifSwKLQl7IlVTQkFVRElPX1VMX0hMIiwgTlVMTCwgIlVTQl9BVURJT19UWCJ9LAotCi0KLQl7IkFVWF9QQ01fUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IkFVWF9QQ01fUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJBVVhfUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiQVVYX1BDTV9SWCBQb3J0IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJBVVhfUENNX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9URE1fVFhfMCIsICJRVUFUX1RETV9UWF8wIn0sCi0JeyJBVVhfUENNX1JYIiwgTlVMTCwgIkFVWF9QQ01fUlggUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJTRUNfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiU0VDX0FVWF9QQ01fVUxfVFgiLCAiU0VDX0FVWF9QQ01fVFgifSwKLQl7IlNFQ19BVVhQQ01fUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJTRUNfQVVYX1BDTV9SWCIsIE5VTEwsICJTRUNfQVVYUENNX1JYIFBvcnQgTWl4ZXIifSwKLQotCXsiVEVSVF9BVVhQQ01fUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlRFUlRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9BVVhQQ01fVUxfVFgiLCAiVEVSVF9BVVhfUENNX1RYIn0sCi0JeyJURVJUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7IlRFUlRfQVVYX1BDTV9SWCIsIE5VTEwsICJURVJUX0FVWFBDTV9SWCBQb3J0IE1peGVyIn0sCi0KLQl7IlFVQVRfQVVYUENNX1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJRVUFUX0FVWFBDTV9SWCBQb3J0IE1peGVyIiwgIlFVQVRfQVVYUENNX1VMX1RYIiwgIlFVQVRfQVVYX1BDTV9UWCJ9LAotCXsiUVVBVF9BVVhQQ01fUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJRVUFUX0FVWF9QQ01fUlgiLCBOVUxMLCAiUVVBVF9BVVhQQ01fUlggUG9ydCBNaXhlciJ9LAotCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNUVUJfVFhfSEwiLCAiU1RVQl9UWCJ9LAotCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIklOVEVSTkFMX0JUX1NDT19UWCIsICJJTlRfQlRfU0NPX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNUVUJfMV9UWF9ITCIsICJTVFVCXzFfVFgifSwKLQl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNFQ19BVVhfUENNX1VMX1RYIiwgIlNFQ19BVVhfUENNX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlRFUlRfQVVYUENNX1VMX1RYIiwgIlRFUlRfQVVYX1BDTV9UWCJ9LAotCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJRVUFUX0FVWFBDTV9VTF9UWCIsICJRVUFUX0FVWF9QQ01fVFgifSwKLQl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiSU5UM19NSTJTX1RYIiwgIklOVDNfTUkyU19UWCJ9LAotCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiVm9pY2UgU3R1YiBUeCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb2ljZSBTdHViIFR4IE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKLQl7IlZvaWNlIFN0dWIgVHggTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7IlZPSUNFX1NUVUJfVUwiLCBOVUxMLCAiVm9pY2UgU3R1YiBUeCBNaXhlciJ9LAotCi0JeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlNUVUJfVFhfSEwiLCAiU1RVQl9UWCJ9LAotCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTTElNXzFfVFgiLCAiU0xJTUJVU18xX1RYIn0sCi0JeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlNUVUJfMV9UWF9ITCIsICJTVFVCXzFfVFgifSwKLQl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlNMSU1fMF9UWCIsICJTTElNQlVTXzBfVFgifSwKLQl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8zX1RYIiwgIlNMSU1CVVNfM19UWCJ9LAotCXsiVm9MVEUgU3R1YiBUeCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb0xURSBTdHViIFR4IE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKLQl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiQUZFX1BDTV9UWCIsICJQQ01fVFgifSwKLQl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlZvTFRFIFN0dWIgVHggTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiVk9MVEVfU1RVQl9VTCIsIE5VTEwsICJWb0xURSBTdHViIFR4IE1peGVyIn0sCi0KLQl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIlNUVUJfVFhfSEwiLCAiU1RVQl9UWCJ9LAotCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiU1RVQl8xX1RYX0hMIiwgIlNUVUJfMV9UWCJ9LAotCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJTTElNXzNfVFgiLCAiU0xJTUJVU18zX1RYIn0sCi0JeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJTTElNXzdfVFgiLCAiU0xJTUJVU183X1RYIn0sCi0JeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJWb2ljZTIgU3R1YiBUeCBNaXhlciIsICJBRkVfUENNX1RYIiwgIlBDTV9UWCJ9LAotCXsiVm9pY2UyIFN0dWIgVHggTWl4ZXIiLCAiUFJJX01JMlNfVFgiLCAiUFJJX01JMlNfVFgifSwKLQl7IlZvaWNlMiBTdHViIFR4IE1peGVyIiwgIlFVQVRfTUkyU19UWCIsICJRVUFUX01JMlNfVFgifSwKLQl7IlZPSUNFMl9TVFVCX1VMIiwgTlVMTCwgIlZvaWNlMiBTdHViIFR4IE1peGVyIn0sCi0KLQl7IlNUVUJfUlggTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJTVFVCX1JYIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJTVFVCX1JYIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiU1RVQl9SWCIsIE5VTEwsICJTVFVCX1JYIE1peGVyIn0sCi0JeyJTTElNQlVTXzFfUlggTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJTTElNQlVTXzFfUlggTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKLQl7IlNMSU1CVVNfMV9SWCBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKLQl7IlNMSU1CVVNfMV9SWCIsIE5VTEwsICJTTElNQlVTXzFfUlggTWl4ZXIifSwKLQl7IkFGRV9QQ01fUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJBRkVfUENNX1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiU0xJTUJVU18zX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlIFN0dWIiLCAiVk9JQ0VfU1RVQl9ETCJ9LAotCXsiU0xJTUJVU18zX1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiBTdHViIiwgIlZPSUNFMl9TVFVCX0RMIn0sCi0JeyJTTElNQlVTXzNfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUgU3R1YiIsICJWT0xURV9TVFVCX0RMIn0sCi0JeyJTTElNQlVTXzNfUlgiLCBOVUxMLCAiU0xJTUJVU18zX1JYX1ZvaWNlIE1peGVyIn0sCi0KLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJDU1ZvaWNlIiwgIkNTLVZPSUNFX0RMMSJ9LAotCXsiU0xJTV83X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlMiIsICJWT0lDRTJfREwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb0xURSIsICJWb0xURV9ETCJ9LAotCXsiU0xJTV83X1JYX1ZvaWNlIE1peGVyIiwgIlZvV0xBTiIsICJWb1dMQU5fREwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb2lwIiwgIlZPSVBfREwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJEVE1GIiwgIkRUTUZfRExfSEwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZSBTdHViIiwgIlZPSUNFX1NUVUJfREwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIgU3R1YiIsICJWT0lDRTJfU1RVQl9ETCJ9LAotCXsiU0xJTV83X1JYX1ZvaWNlIE1peGVyIiwgIlZvTFRFIFN0dWIiLCAiVk9MVEVfU1RVQl9ETCJ9LAotCXsiU0xJTV83X1JYX1ZvaWNlIE1peGVyIiwgIlFDSEFUIiwgIlFDSEFUX0RMIn0sCi0JeyJTTElNXzdfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTEiLCAiVk9JQ0VNTU9ERTFfREwifSwKLQl7IlNMSU1fN19SWF9Wb2ljZSBNaXhlciIsICJWb2ljZU1Nb2RlMiIsICJWT0lDRU1NT0RFMl9ETCJ9LAotCXsiU0xJTUJVU183X1JYIiwgTlVMTCwgIlNMSU1fN19SWF9Wb2ljZSBNaXhlciJ9LAotCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiQ1NWb2ljZSIsICJDUy1WT0lDRV9ETDEifSwKLQl7IlNMSU1fOF9SWF9Wb2ljZSBNaXhlciIsICJWb2ljZTIiLCAiVk9JQ0UyX0RMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9MVEUiLCAiVm9MVEVfREwifSwKLQl7IlNMSU1fOF9SWF9Wb2ljZSBNaXhlciIsICJWb1dMQU4iLCAiVm9XTEFOX0RMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pcCIsICJWT0lQX0RMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiRFRNRiIsICJEVE1GX0RMX0hMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UgU3R1YiIsICJWT0lDRV9TVFVCX0RMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2UyIFN0dWIiLCAiVk9JQ0UyX1NUVUJfREwifSwKLQl7IlNMSU1fOF9SWF9Wb2ljZSBNaXhlciIsICJWb0xURSBTdHViIiwgIlZPTFRFX1NUVUJfREwifSwKLQl7IlNMSU1fOF9SWF9Wb2ljZSBNaXhlciIsICJRQ0hBVCIsICJRQ0hBVF9ETCJ9LAotCXsiU0xJTV84X1JYX1ZvaWNlIE1peGVyIiwgIlZvaWNlTU1vZGUxIiwgIlZPSUNFTU1PREUxX0RMIn0sCi0JeyJTTElNXzhfUlhfVm9pY2UgTWl4ZXIiLCAiVm9pY2VNTW9kZTIiLCAiVk9JQ0VNTU9ERTJfREwifSwKLQl7IlNMSU1CVVNfOF9SWCIsIE5VTEwsICJTTElNXzhfUlhfVm9pY2UgTWl4ZXIifSwKLQotCXsiU0xJTUJVU18xX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNMSU1CVVNfMV9SWCBQb3J0IE1peGVyIiwgIkFGRV9QQ01fVFgiLCAiUENNX1RYIn0sCi0JeyJTTElNQlVTXzFfUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlNMSU1CVVNfMV9SWCIsIE5VTEwsICJTTElNQlVTXzFfUlggUG9ydCBNaXhlciJ9LAotCXsiSU5URVJOQUxfQlRfU0NPX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiSU5URVJOQUxfQlRfU0NPX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiSU5UX0JUX1NDT19SWCIsIE5VTEwsICJJTlRFUk5BTF9CVF9TQ09fUlggUG9ydCBNaXhlciJ9LAotCXsiU0xJTUJVU18zX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1JYIiwgIklOVF9CVF9TQ09fUlgifSwKLQl7IlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiU0xJTUJVU18zX1JYIFBvcnQgTWl4ZXIiLCAiQUZFX1BDTV9SWCIsICJQQ01fUlgifSwKLQl7IlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIiwgIkFVWF9QQ01fUlgiLCAiQVVYX1BDTV9SWCJ9LAotCXsiU0xJTUJVU18zX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1JYIiwgIlNMSU1CVVNfMF9SWCJ9LAotCXsiU0xJTUJVU18zX1JYIiwgTlVMTCwgIlNMSU1CVVNfM19SWCBQb3J0IE1peGVyIn0sCi0KLQl7IlNMSU1CVVNfNl9SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV83X1RYIiwgIlNMSU1CVVNfN19UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV84X1RYIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiQVVYX1BDTV9VTF9UWCIsICJBVVhfUENNX1RYIn0sCi0JeyJTTElNQlVTXzZfUlggUG9ydCBNaXhlciIsICJTRUNfQVVYX1BDTV9VTF9UWCIsICJTRUNfQVVYX1BDTV9UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJTTElNQlVTXzZfUlggUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiU0xJTUJVU182X1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlNMSU1CVVNfNl9SWCIsIE5VTEwsICJTTElNQlVTXzZfUlggUG9ydCBNaXhlciJ9LAotCi0JeyJIRE1JX1JYIFBvcnQgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJIRE1JIiwgTlVMTCwgIkhETUlfUlggUG9ydCBNaXhlciJ9LAotCi0JeyJESVNQTEFZX1BPUlRfUlggUG9ydCBNaXhlciIsICJNSTJTX1RYIiwgIk1JMlNfVFgifSwKLQl7IkRJU1BMQVlfUE9SVCIsIE5VTEwsICJESVNQTEFZX1BPUlRfUlggUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfSTJTX1JYIFBvcnQgTWl4ZXIiLCAiTUkyU19UWCIsICJNSTJTX1RYIn0sCi0JeyJTRUNfSTJTX1JYIiwgTlVMTCwgIlNFQ19JMlNfUlggUG9ydCBNaXhlciJ9LAotCi0JeyJNSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8xX1RYIiwgIlNMSU1CVVNfMV9UWCJ9LAotCXsiTUkyU19SWCBQb3J0IE1peGVyIiwgIk1JMlNfVFgiLCAiTUkyU19UWCJ9LAotCXsiTUkyU19SWCIsIE5VTEwsICJNSTJTX1JYIFBvcnQgTWl4ZXIifSwKLQotCXsiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsICJQUklfTUkyU19UWCIsICJQUklfTUkyU19UWCJ9LAotCXsiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsICJRVUFUX01JMlNfVFgiLCAiUVVBVF9NSTJTX1RYIn0sCi0JeyJQUklfTUkyU19SWCBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiUFJJX01JMlNfUlggUG9ydCBNaXhlciIsICJJTlRFUk5BTF9GTV9UWCIsICJJTlRfRk1fVFgifSwKLQl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfQlRfU0NPX1RYIiwgIklOVF9CVF9TQ09fVFgifSwKLQl7IlBSSV9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV84X1RYIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiUFJJX01JMlNfUlgiLCBOVUxMLCAiUFJJX01JMlNfUlggUG9ydCBNaXhlciJ9LAotCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNFQ19NSTJTX1RYIiwgIlNFQ19NSTJTX1RYIn0sCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIlRFUlRfTUkyU19UWCIsICJURVJUX01JMlNfVFgifSwKLQl7IlNFQ19NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiU0VDX01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzBfVFgiLCAiU0xJTUJVU18wX1RYIn0sCi0JeyJTRUNfTUkyU19SWCBQb3J0IE1peGVyIiwgIklOVEVSTkFMX0ZNX1RYIiwgIklOVF9GTV9UWCJ9LAotCXsiU0VDX01JMlNfUlggUG9ydCBNaXhlciIsICJTTElNXzhfVFgiLCAiU0xJTUJVU184X1RYIn0sCi0JeyJTRUNfTUkyU19SWCIsIE5VTEwsICJTRUNfTUkyU19SWCBQb3J0IE1peGVyIn0sCi0KLQl7IlRFUlRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJURVJUX01JMlNfUlggUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiVEVSVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV84X1RYIiwgIlNMSU1CVVNfOF9UWCJ9LAotCXsiVEVSVF9NSTJTX1JYIiwgTlVMTCwgIlRFUlRfTUkyU19SWCBQb3J0IE1peGVyIn0sCi0KLQl7IlFVQVRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlBSSV9NSTJTX1RYIiwgIlBSSV9NSTJTX1RYIn0sCi0JeyJRVUFUX01JMlNfUlggUG9ydCBNaXhlciIsICJTRUNfTUkyU19UWCIsICJTRUNfTUkyU19UWCJ9LAotCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiVEVSVF9NSTJTX1RYIiwgIlRFUlRfTUkyU19UWCJ9LAotCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiUVVBVF9NSTJTX1RYIiwgIlFVQVRfTUkyU19UWCJ9LAotCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiU0xJTV8wX1RYIiwgIlNMSU1CVVNfMF9UWCJ9LAotCXsiUVVBVF9NSTJTX1JYIFBvcnQgTWl4ZXIiLCAiSU5URVJOQUxfRk1fVFgiLCAiSU5UX0ZNX1RYIn0sCi0JeyJRVUFUX01JMlNfUlggUG9ydCBNaXhlciIsICJBVVhfUENNX1VMX1RYIiwgIkFVWF9QQ01fVFgifSwKLQl7IlFVQVRfTUkyU19SWCBQb3J0IE1peGVyIiwgIlNMSU1fOF9UWCIsICJTTElNQlVTXzhfVFgifSwKLQl7IlFVQVRfTUkyU19SWCIsIE5VTEwsICJRVUFUX01JMlNfUlggUG9ydCBNaXhlciJ9LAotCi0JLyogQmFja2VuZCBFbmFibGVtZW50ICovCi0KLQl7IkJFX09VVCIsIE5VTEwsICJQUklfSTJTX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0VDX0kyU19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMF9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMV9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfMl9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNF9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNV9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfNl9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfN19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfOF9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlVTQl9BVURJT19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIkhETUkifSwKLQl7IkJFX09VVCIsIE5VTEwsICJESVNQTEFZX1BPUlQifSwKLQl7IkJFX09VVCIsIE5VTEwsICJTUERJRl9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIk1JMlNfUlgifSwKLQl7IkJFX09VVCIsIE5VTEwsICJRVUFUX01JMlNfUlgifSwKLQl7IkJFX09VVCIsIE5VTEwsICJRVUlOX01JMlNfUlgifSwKLQl7IkJFX09VVCIsIE5VTEwsICJURVJUX01JMlNfUlgifSwKLQl7IkJFX09VVCIsIE5VTEwsICJTRUNfTUkyU19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNFQ19NSTJTX1JYX1NEMSJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlBSSV9NSTJTX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiSU5UMF9NSTJTX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiSU5UNF9NSTJTX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0JUX1NDT19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIklOVF9CVF9BMkRQX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0ZNX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUENNX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0xJTUJVU18zX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiQVVYX1BDTV9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNFQ19BVVhfUENNX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9BVVhfUENNX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUVVBVF9BVVhfUENNX1JYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiSU5UX0JUX1NDT19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIklOVF9GTV9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlBDTV9SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlZPSUNFX1BMQVlCQUNLX1RYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiVk9JQ0UyX1BMQVlCQUNLX1RYIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUFJJX1RETV9SWF8wIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUFJJX1RETV9SWF8xIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUFJJX1RETV9SWF8yIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUFJJX1RETV9SWF8zIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0VDX1RETV9SWF8wIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0VDX1RETV9SWF8xIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0VDX1RETV9SWF8yIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiU0VDX1RETV9SWF8zIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9URE1fUlhfMCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlRFUlRfVERNX1JYXzEifSwKLQl7IkJFX09VVCIsIE5VTEwsICJURVJUX1RETV9SWF8yIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiVEVSVF9URE1fUlhfMyJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlRFUlRfVERNX1JYXzQifSwKLQl7IkJFX09VVCIsIE5VTEwsICJRVUFUX1RETV9SWF8wIn0sCi0JeyJCRV9PVVQiLCBOVUxMLCAiUVVBVF9URE1fUlhfMSJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlFVQVRfVERNX1JYXzIifSwKLQl7IkJFX09VVCIsIE5VTEwsICJRVUFUX1RETV9SWF8zIn0sCi0KLQl7IlBSSV9JMlNfVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7Ik1JMlNfVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlFVQVRfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiUVVJTl9NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJQUklfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiVEVSVF9NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJJTlQyX01JMlNfVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IklOVDNfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiSU5UNV9NSTJTX1RYIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJTRUNfTUkyU19UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiU0VOQVJZX01JMlNfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzBfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzFfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzNfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzRfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzVfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzZfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzdfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJTTElNQlVTXzhfVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJVU0JfQVVESU9fVFgiLCBOVUxMLCAiQkVfSU4iIH0sCi0JeyJJTlRfQlRfU0NPX1RYIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJJTlRfRk1fVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlBDTV9UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNMSU1CVVNfM19SWCJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIlNUVUJfUlgifSwKLQl7IlNUVUJfVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlNUVUJfMV9UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiQkVfT1VUIiwgTlVMTCwgIkFVWF9QQ01fUlgifSwKLQl7IkFVWF9QQ01fVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlNFQ19BVVhfUENNX1RYIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJURVJUX0FVWF9QQ01fVFgiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlFVQVRfQVVYX1BDTV9UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiSU5DQUxMX1JFQ09SRF9UWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiSU5DQUxMX1JFQ09SRF9SWCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiU0xJTTBfUlhfVklfRkJfTENIX01VWCIsICJTTElNNF9UWCIsICJTTElNQlVTXzRfVFgifSwKLQl7IlNMSU0wX1JYX1ZJX0ZCX1JDSF9NVVgiLCAiU0xJTTRfVFgiLCAiU0xJTUJVU180X1RYIn0sCi0JeyJQUklfTUkyU19SWF9WSV9GQl9NVVgiLCAiU0VOQVJZX1RYIiwgIlNFTkFSWV9UWCJ9LAotCXsiSU5UNF9NSTJTX1JYX1ZJX0ZCX01PTk9fQ0hfTVVYIiwgIklOVDVfTUkyU19UWCIsICJJTlQ1X01JMlNfVFgifSwKLQl7IklOVDRfTUkyU19SWF9WSV9GQl9TVEVSRU9fQ0hfTVVYIiwgIklOVDVfTUkyU19UWCIsICJJTlQ1X01JMlNfVFgifSwKLQl7IlNMSU1CVVNfMF9SWCIsIE5VTEwsICJTTElNMF9SWF9WSV9GQl9MQ0hfTVVYIn0sCi0JeyJTTElNQlVTXzBfUlgiLCBOVUxMLCAiU0xJTTBfUlhfVklfRkJfUkNIX01VWCJ9LAotCXsiUFJJX01JMlNfUlgiLCBOVUxMLCAiUFJJX01JMlNfUlhfVklfRkJfTVVYIn0sCi0JeyJJTlQ0X01JMlNfUlgiLCBOVUxMLCAiSU5UNF9NSTJTX1JYX1ZJX0ZCX01PTk9fQ0hfTVVYIn0sCi0JeyJJTlQ0X01JMlNfUlgiLCBOVUxMLCAiSU5UNF9NSTJTX1JYX1ZJX0ZCX1NURVJFT19DSF9NVVgifSwKLQl7IlBSSV9URE1fVFhfMCIsIE5VTEwsICJCRV9JTiJ9LAotCXsiUFJJX1RETV9UWF8xIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJQUklfVERNX1RYXzIiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlBSSV9URE1fVFhfMyIsIE5VTEwsICJCRV9JTiJ9LAotCXsiU0VDX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJTRUNfVERNX1RYXzEiLCBOVUxMLCAiQkVfSU4ifSwKLQl7IlNFQ19URE1fVFhfMiIsIE5VTEwsICJCRV9JTiJ9LAotCXsiU0VDX1RETV9UWF8zIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJURVJUX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJURVJUX1RETV9UWF8xIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJURVJUX1RETV9UWF8yIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJURVJUX1RETV9UWF8zIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJRVUFUX1RETV9UWF8wIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJRVUFUX1RETV9UWF8xIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJRVUFUX1RETV9UWF8yIiwgTlVMTCwgIkJFX0lOIn0sCi0JeyJRVUFUX1RETV9UWF8zIiwgTlVMTCwgIkJFX0lOIn0sCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBiZV9pZCA9IHJ0ZC0+ZGFpX2xpbmstPmlkOwotCi0JaWYgKGJlX2lkID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlczogdW5leHBlY3RlZCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQltc21fYmVkYWlzW2JlX2lkXS5zYW1wbGVfcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0JbXNtX2JlZGFpc1tiZV9pZF0uY2hhbm5lbCA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCW1zbV9iZWRhaXNbYmVfaWRdLmZvcm1hdCA9IHBhcmFtc19mb3JtYXQocGFyYW1zKTsKLQlwcl9kZWJ1ZygiJXM6IEJFIFNhbXBsZSBSYXRlICglZCkgZm9ybWF0ICglZCkgQkUgaWQgJWRcbiIsCi0JCV9fZnVuY19fLCBtc21fYmVkYWlzW2JlX2lkXS5zYW1wbGVfcmF0ZSwKLQkJbXNtX2JlZGFpc1tiZV9pZF0uZm9ybWF0LCBiZV9pZCk7Ci0JbXV0ZXhfdW5sb2NrKCZyb3V0aW5nX2xvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgaW50IGJlX2lkID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JaW50IGksIHNlc3Npb25fdHlwZSwgcGF0aF90eXBlLCB0b3BvbG9neTsKLQlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2JkYWlfZGF0YSAqYmVkYWk7Ci0Jc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgKmZkYWk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHN1YnN0cmVhbS0+cGNtLT5pZDolc1xuIiwKLQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOwotCi0JaWYgKGJlX2lkID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKLQkJcHJfZXJyKCIlczogdW5leHBlY3RlZCBCRSBpZCAlZFxuIiwgX19mdW5jX18sIGJlX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYmVkYWkgPSAmbXNtX2JlZGFpc1tiZV9pZF07Ci0Jc2Vzc2lvbl90eXBlID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwotCQkwIDogMSk7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXBhdGhfdHlwZSA9IEFETV9QQVRIX1BMQVlCQUNLOwotCWVsc2UKLQkJcGF0aF90eXBlID0gQURNX1BBVEhfTElWRV9SRUM7Ci0KLQltdXRleF9sb2NrKCZyb3V0aW5nX2xvY2spOwotCWZvcl9lYWNoX3NldF9iaXQoaSwgJmJlZGFpLT5mZV9zZXNzaW9uc1swXSwgTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKLQkJaWYgKCFpc19tbV9sc21fZmVfaWQoaSkpCi0JCQljb250aW51ZTsKLQkJZmRhaSA9ICZmZV9kYWlfbWFwW2ldW3Nlc3Npb25fdHlwZV07Ci0JCWlmIChmZGFpLT5zdHJtX2lkICE9IElOVkFMSURfU0VTU0lPTikgewotCQkJaW50IGlkeDsKLQkJCWludCBwb3J0X2lkOwotCQkJdW5zaWduZWQgbG9uZyBjb3BwID0KLQkJCQlzZXNzaW9uX2NvcHBfbWFwW2ldW3Nlc3Npb25fdHlwZV1bYmVfaWRdOwotCQkJZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKQotCQkJCWlmICh0ZXN0X2JpdChpZHgsICZjb3BwKSkKLQkJCQkJYnJlYWs7Ci0JCQlmZGFpLT5iZV9zcmF0ZSA9IGJlZGFpLT5zYW1wbGVfcmF0ZTsKLQkJCXBvcnRfaWQgPSBiZWRhaS0+cG9ydF9pZDsKLQkJCXRvcG9sb2d5ID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChwb3J0X2lkLAotCQkJCQkJCQkgICAgIGlkeCk7Ci0JCQlhZG1fY2xvc2UoYmVkYWktPnBvcnRfaWQsIGZkYWktPnBlcmZfbW9kZSwgaWR4KTsKLQkJCXByX2RlYnVnKCIlczogY29wcDolbGQsaWR4IGJpdCBmZTolZCwgdHlwZTolZCxiZTolZCB0b3BvbG9neT0weCV4XG4iLAotCQkJCSBfX2Z1bmNfXywgY29wcCwgaSwgc2Vzc2lvbl90eXBlLCBiZV9pZCwKLQkJCQkgdG9wb2xvZ3kpOwotCQkJY2xlYXJfYml0KGlkeCwKLQkJCQkgICZzZXNzaW9uX2NvcHBfbWFwW2ldW3Nlc3Npb25fdHlwZV1bYmVfaWRdKTsKLQkJCWlmICgoZmRhaS0+cGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkgJiYKLQkJCQkoYmVkYWktPnBhc3N0aHJfbW9kZVtpXSA9PSBMRUdBQ1lfUENNKSkKLQkJCQltc21fcGNtX3JvdXRpbmdfZGVpbml0X3BwKGJlZGFpLT5wb3J0X2lkLAotCQkJCQkJCSAgdG9wb2xvZ3kpOwotCQl9Ci0JfQotCi0JYmVkYWktPmFjdGl2ZSA9IDA7Ci0JYmVkYWktPnNhbXBsZV9yYXRlID0gMDsKLQliZWRhaS0+Y2hhbm5lbCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE1TTV9GUk9OVEVORF9EQUlfTUFYOyBpKyspIHsKLQkJaWYgKGJlZGFpLT5wYXNzdGhyX21vZGVbaV0gIT0gTElTVEVOKQotCQkJYmVkYWktPnBhc3N0aHJfbW9kZVtpXSA9IExFR0FDWV9QQ007Ci0JfQotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcm91dGluZ19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBpbnQgYmVfaWQgPSBydGQtPmRhaV9saW5rLT5pZDsKLQlpbnQgaSwgcGF0aF90eXBlLCB0b3BvbG9neTsKLQlpbnQgc2Vzc2lvbl90eXBlID0gSU5WQUxJRF9TRVNTSU9OOwotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhICpiZWRhaTsKLQl1MzIgY2hhbm5lbHMsIHNhbXBsZV9yYXRlOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSA9IDE2LCB2b2NfcGF0aF90eXBlOwotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhICpmZGFpOwotCXUzMiBzZXNzaW9uX2lkOwotCXN0cnVjdCBtZWRpYV9mb3JtYXRfaW5mbyB2b2NfYmVfbWVkaWFfZm9ybWF0OwotCWJvb2wgaXNfbHNtOwotCi0JcHJfZGVidWcoIiVzOiBzdWJzdHJlYW0tPnBjbS0+aWQ6JXNcbiIsCi0JCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQotCWlmIChiZV9pZCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXM6IHVuZXhwZWN0ZWQgQkUgaWQgJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJlZGFpID0gJm1zbV9iZWRhaXNbYmVfaWRdOwotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlpZiAoYmVkYWktPmFjdGl2ZSA9PSAxKQotCQlnb3RvIGRvbmU7IC8qIElnbm9yZSBwcmVwYXJlIGlmIGJhY2stZW5kIGFscmVhZHkgYWN0aXZlICovCi0KLQkvKiBBRkUgcG9ydCBpcyBub3QgYWN0aXZlIGF0IHRoaXMgcG9pbnQuIEhvd2V2ZXIsIHN0aWxsCi0JICogZ28gYWhlYWQgc2V0dGluZyBhY3RpdmUgZmxhZyB1bmRlciB0aGUgbm90aW9uIHRoYXQKLQkgKiBRRFNQNiBpcyBhYmxlIHRvIGhhbmRsZSBBRE0gc3RhcnRpbmcgYmVmb3JlIEFGRSBwb3J0Ci0JICogaXMgc3RhcnRlZC4KLQkgKi8KLQliZWRhaS0+YWN0aXZlID0gMTsKLQotCWZvcl9lYWNoX3NldF9iaXQoaSwgJmJlZGFpLT5mZV9zZXNzaW9uc1swXSwgTVNNX0ZST05URU5EX0RBSV9NQVgpIHsKLQkJaWYgKCEoaXNfbW1fbHNtX2ZlX2lkKGkpICYmCi0JCQkJcm91dGVfY2hlY2tfZmVfaWRfYWRtX3N1cHBvcnQoaSkpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJCWlmIChiZWRhaS0+cGFzc3Rocl9tb2RlW2ldICE9IExFR0FDWV9QQ00pCi0JCQkJcGF0aF90eXBlID0gQURNX1BBVEhfQ09NUFJFU1NFRF9SWDsKLQkJCWVsc2UKLQkJCQlwYXRoX3R5cGUgPSBBRE1fUEFUSF9QTEFZQkFDSzsKLQkJCXNlc3Npb25fdHlwZSA9IFNFU1NJT05fVFlQRV9SWDsKLQkJfSBlbHNlIHsKLQkJCXBhdGhfdHlwZSA9IEFETV9QQVRIX0xJVkVfUkVDOwotCQkJc2Vzc2lvbl90eXBlID0gU0VTU0lPTl9UWVBFX1RYOwotCQl9Ci0KLQkJaXNfbHNtID0gKGkgPj0gTVNNX0ZST05URU5EX0RBSV9MU00xKSAmJgotCQkJCSAoaSA8PSBNU01fRlJPTlRFTkRfREFJX0xTTTgpOwotCQlmZGFpID0gJmZlX2RhaV9tYXBbaV1bc2Vzc2lvbl90eXBlXTsKLQkJaWYgKGZkYWktPnN0cm1faWQgIT0gSU5WQUxJRF9TRVNTSU9OKSB7Ci0JCQlpbnQgYXBwX3R5cGUsIGFwcF90eXBlX2lkeCwgY29wcF9pZHgsIGFjZGJfZGV2X2lkOwotCi0JCQlpZiAoc2Vzc2lvbl90eXBlID09IFNFU1NJT05fVFlQRV9UWCAmJgotCQkJICAgIGZkYWktPmJlX3NyYXRlICYmCi0JCQkgICAgKGZkYWktPmJlX3NyYXRlICE9IGJlZGFpLT5zYW1wbGVfcmF0ZSkpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGZsdXNoIHN0cm0gJWQgZGlmZiBCRSByYXRlc1xuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCWZkYWktPnN0cm1faWQpOwotCi0JCQkJaWYgKGZkYWktPmV2ZW50X2luZm8uZXZlbnRfZnVuYykKLQkJCQkJZmRhaS0+ZXZlbnRfaW5mby5ldmVudF9mdW5jKAotCQkJCQkJTVNNX1BDTV9SVF9FVlRfQlVGX1JFQ0ZHLAotCQkJCQkJZmRhaS0+ZXZlbnRfaW5mby5wcml2X2RhdGEpOwotCQkJCWZkYWktPmJlX3NyYXRlID0gMDsgLyogbWlnaHQgbm90IG5lZWQgaXQgKi8KLQkJCX0KLQkJCWJpdHNfcGVyX3NhbXBsZSA9IG1zbV9yb3V0aW5nX2dldF9iaXRfd2lkdGgoCi0JCQkJCQliZWRhaS0+Zm9ybWF0KTsKLQotCQkJYXBwX3R5cGUgPQotCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tpXVtzZXNzaW9uX3R5cGVdW2JlX2lkXS5hcHBfdHlwZTsKLQkJCWlmIChhcHBfdHlwZSAmJiBpc19sc20pIHsKLQkJCQlhcHBfdHlwZV9pZHggPQotCQkJCW1zbV9wY21fcm91dGluZ19nZXRfbHNtX2FwcF90eXBlX2lkeChhcHBfdHlwZSk7Ci0JCQkJc2FtcGxlX3JhdGUgPQotCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbaV1bc2Vzc2lvbl90eXBlXVtiZV9pZF0KLQkJCQkJLnNhbXBsZV9yYXRlOwotCQkJCWJpdHNfcGVyX3NhbXBsZSA9Ci0JCQkJbHNtX2FwcF90eXBlX2NmZ1thcHBfdHlwZV9pZHhdLmJpdF93aWR0aDsKLQkJCX0gZWxzZSBpZiAoYXBwX3R5cGUpIHsKLQkJCQlhcHBfdHlwZV9pZHggPQotCQkJCW1zbV9wY21fcm91dGluZ19nZXRfYXBwX3R5cGVfaWR4KGFwcF90eXBlKTsKLQkJCQlzYW1wbGVfcmF0ZSA9Ci0JCQkJCWZlX2RhaV9hcHBfdHlwZV9jZmdbaV1bc2Vzc2lvbl90eXBlXQotCQkJCQkJCSAgIFtiZV9pZF0uc2FtcGxlX3JhdGU7Ci0JCQkJYml0c19wZXJfc2FtcGxlID0KLQkJCQkJYXBwX3R5cGVfY2ZnW2FwcF90eXBlX2lkeF0uYml0X3dpZHRoOwotCQkJfSBlbHNlCi0JCQkJc2FtcGxlX3JhdGUgPSBiZWRhaS0+c2FtcGxlX3JhdGU7Ci0JCQkvKgotCQkJICogY2hlY2sgaWYgQURNIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBkaWZmZXJlbnQKLQkJCSAqIGNoYW5uZWwgbWFwcGluZyB0aGFuIGJhY2tlbmQKLQkJCSAqLwotCQkJaWYgKCFiZWRhaS0+YWRtX292ZXJyaWRlX2NoKQotCQkJCWNoYW5uZWxzID0gYmVkYWktPmNoYW5uZWw7Ci0JCQllbHNlCi0JCQkJY2hhbm5lbHMgPSBiZWRhaS0+YWRtX292ZXJyaWRlX2NoOwotCQkJYWNkYl9kZXZfaWQgPQotCQkJZmVfZGFpX2FwcF90eXBlX2NmZ1tpXVtzZXNzaW9uX3R5cGVdW2JlX2lkXS5hY2RiX2Rldl9pZDsKLQkJCXRvcG9sb2d5ID0gbXNtX3JvdXRpbmdfZ2V0X2FkbV90b3BvbG9neShpLCBzZXNzaW9uX3R5cGUsCi0JCQkJCQkJCWJlX2lkKTsKLQkJCWNvcHBfaWR4ID0gYWRtX29wZW4oYmVkYWktPnBvcnRfaWQsIHBhdGhfdHlwZSwKLQkJCQkJICAgIHNhbXBsZV9yYXRlLCBjaGFubmVscywgdG9wb2xvZ3ksCi0JCQkJCSAgICBmZGFpLT5wZXJmX21vZGUsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIGFwcF90eXBlLCBhY2RiX2Rldl9pZCk7Ci0JCQlpZiAoKGNvcHBfaWR4IDwgMCkgfHwKLQkJCQkoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSkgewotCQkJCXByX2VycigiJXM6IGFkbSBvcGVuIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXByX2RlYnVnKCIlczogc2V0dGluZyBpZHggYml0IG9mIGZlOiVkLCB0eXBlOiAlZCwgYmU6JWRcbiIsCi0JCQkJIF9fZnVuY19fLCBpLCBzZXNzaW9uX3R5cGUsIGJlX2lkKTsKLQkJCXNldF9iaXQoY29wcF9pZHgsCi0JCQkJJnNlc3Npb25fY29wcF9tYXBbaV1bc2Vzc2lvbl90eXBlXVtiZV9pZF0pOwotCi0JCQlpZiAobXNtX2lzX3Jlc2FtcGxlX25lZWRlZCgKLQkJCQlzYW1wbGVfcmF0ZSwKLQkJCQliZWRhaS0+c2FtcGxlX3JhdGUpKQotCQkJCWFkbV9jb3BwX21mY19jZmcoCi0JCQkJCWJlZGFpLT5wb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJYmVkYWktPnNhbXBsZV9yYXRlKTsKLQotCQkJbXNtX3BjbV9yb3V0aW5nX2J1aWxkX21hdHJpeChpLCBzZXNzaW9uX3R5cGUsIHBhdGhfdHlwZSwKLQkJCQkJCSAgICAgZmRhaS0+cGVyZl9tb2RlLAotCQkJCQkJICAgICBiZWRhaS0+cGFzc3Rocl9tb2RlW2ldKTsKLQkJCWlmICgoZmRhaS0+cGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSkgJiYKLQkJCQkoYmVkYWktPnBhc3N0aHJfbW9kZVtpXSA9PSBMRUdBQ1lfUENNKSkKLQkJCQltc21fcGNtX3JvdXRpbmdfY2ZnX3BwKGJlZGFpLT5wb3J0X2lkLCBjb3BwX2lkeCwKLQkJCQkJCSAgICAgICB0b3BvbG9neSwgY2hhbm5lbHMpOwotCQl9Ci0JfQotCi0JZm9yX2VhY2hfc2V0X2JpdChpLCAmYmVkYWktPmZlX3Nlc3Npb25zWzBdLCBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlzZXNzaW9uX2lkID0gbXNtX3BjbV9yb3V0aW5nX2dldF92b2Nfc2Vzc2lvbmlkKGkpOwotCQlpZiAoc2Vzc2lvbl9pZCkgewotCQkJcHJfZGVidWcoIiVzIHZvaWNlIHNlc3Npb25faWQ6IDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCSBzZXNzaW9uX2lkKTsKLQotCQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCQkJdm9jX3BhdGhfdHlwZSA9IFJYX1BBVEg7Ci0JCQllbHNlCi0JCQkJdm9jX3BhdGhfdHlwZSA9IFRYX1BBVEg7Ci0KLQkJCXZvY19zZXRfcm91dGVfZmxhZyhzZXNzaW9uX2lkLCB2b2NfcGF0aF90eXBlLCAxKTsKLQotCQkJbWVtc2V0KCZ2b2NfYmVfbWVkaWFfZm9ybWF0LCAwLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWVkaWFfZm9ybWF0X2luZm8pKTsKLQotCQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5wb3J0X2lkID0gYmVkYWktPnBvcnRfaWQ7Ci0JCQl2b2NfYmVfbWVkaWFfZm9ybWF0Lm51bV9jaGFubmVscyA9IGJlZGFpLT5jaGFubmVsOwotCQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5zYW1wbGVfcmF0ZSA9IGJlZGFpLT5zYW1wbGVfcmF0ZTsKLQkJCXZvY19iZV9tZWRpYV9mb3JtYXQuYml0c19wZXJfc2FtcGxlID0gYmVkYWktPmZvcm1hdDsKLQkJCS8qIERlZmF1bHRpbmcgdGhpcyB0byAxIGZvciB2b2ljZSBjYWxsIHVzZWNhc2VzICovCi0JCQl2b2NfYmVfbWVkaWFfZm9ybWF0LmNoYW5uZWxfbWFwcGluZ1swXSA9IDE7Ci0KLQkJCXZvY19zZXRfZGV2aWNlX2NvbmZpZyhzZXNzaW9uX2lkLCB2b2NfcGF0aF90eXBlLAotCQkJCQkgICAgICAmdm9jX2JlX21lZGlhX2Zvcm1hdCk7Ci0KLQkJCWlmICh2b2NfZ2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgUlhfUEFUSCkgJiYKLQkJCSAgICB2b2NfZ2V0X3JvdXRlX2ZsYWcoc2Vzc2lvbl9pZCwgVFhfUEFUSCkpCi0JCQkJdm9jX2VuYWJsZV9kZXZpY2Uoc2Vzc2lvbl9pZCk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBpZiBiYWNrZW5kIGlzIGFuIGV4dGVybmFsIGVjIHJlZiBwb3J0IGFuZCBzZXQgYXMgbmVlZGVkICovCi0JaWYgKHVubGlrZWx5KGJlZGFpLT5wb3J0X2lkID09IHZvY19nZXRfZXh0X2VjX3JlZl9wb3J0X2lkKCkpKSB7Ci0KLQkJbWVtc2V0KCZ2b2NfYmVfbWVkaWFfZm9ybWF0LCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZWRpYV9mb3JtYXRfaW5mbykpOwotCi0JCS8qIEdldCBmb3JtYXQgaW5mbyBmb3IgZWMgcmVmIHBvcnQgZnJvbSBtc21fYmVkYWlzW10gKi8KLQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5wb3J0X2lkID0gYmVkYWktPnBvcnRfaWQ7Ci0JCXZvY19iZV9tZWRpYV9mb3JtYXQubnVtX2NoYW5uZWxzID0gYmVkYWktPmNoYW5uZWw7Ci0JCXZvY19iZV9tZWRpYV9mb3JtYXQuYml0c19wZXJfc2FtcGxlID0gYmVkYWktPmZvcm1hdDsKLQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5zYW1wbGVfcmF0ZSA9IGJlZGFpLT5zYW1wbGVfcmF0ZTsKLQkJLyogRGVmYXVsdGluZyB0aGlzIHRvIDEgZm9yIHZvaWNlIGNhbGwgdXNlY2FzZXMgKi8KLQkJdm9jX2JlX21lZGlhX2Zvcm1hdC5jaGFubmVsX21hcHBpbmdbMF0gPSAxOwotCQl2b2Nfc2V0X2V4dF9lY19yZWZfbWVkaWFfZm10X2luZm8oJnZvY19iZV9tZWRpYV9mb3JtYXQpOwotCQlwcl9kZWJ1ZygiJXM6IEVDIFJlZiBtZWRpYSBmb3JtYXQgaW5mbyBzZXQgdG8gcG9ydF9pZD0lZCwgbnVtX2NoYW5uZWxzPSVkLCBiaXRzX3Blcl9zYW1wbGU9JWQsIHNhbXBsZV9yYXRlPSVkXG4iLAotCQkJIF9fZnVuY19fLCB2b2NfYmVfbWVkaWFfZm9ybWF0LnBvcnRfaWQsCi0JCQkgdm9jX2JlX21lZGlhX2Zvcm1hdC5udW1fY2hhbm5lbHMsCi0JCQkgdm9jX2JlX21lZGlhX2Zvcm1hdC5iaXRzX3Blcl9zYW1wbGUsCi0JCQkgdm9jX2JlX21lZGlhX2Zvcm1hdC5zYW1wbGVfcmF0ZSk7Ci0JfQotCi1kb25lOgotCW11dGV4X3VubG9jaygmcm91dGluZ19sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3NlbmRfZGV2aWNlX3BwX3BhcmFtcyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJCQkgICAgIGludCBmZV9pZCkKLXsKLQlpbnQgaW5kZXgsIHRvcG9faWQsIGJlX2lkeDsKLQl1bnNpZ25lZCBsb25nIHBwX2NvbmZpZyA9IDA7Ci0JYm9vbCBtdXRlX29uOwotCWludCBsYXRlbmN5OwotCWJvb2wgY29tcHJfcGFzc3Rocl9tb2RlID0gdHJ1ZTsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAlZCwgY29wcF9pZHggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQlpZiAocG9ydF9pZCAhPSBIRE1JX1JYICYmIHBvcnRfaWQgIT0gRElTUExBWV9QT1JUX1JYKSB7Ci0JCXByX2VycigiJXM6IERldmljZSBwcCBwYXJhbXMgb24gaW52YWxpZCBwb3J0ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXR1cm4gIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykgewotCQlpZiAocG9ydF9pZCA9PSBtc21fYmVkYWlzW2JlX2lkeF0ucG9ydF9pZCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChiZV9pZHggPj0gTVNNX0JBQ0tFTkRfREFJX01BWCkgewotCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgYmUgaWQgJWRcbiIsIF9fZnVuY19fLCBiZV9pZHgpOwotCQlyZXR1cm4gIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTVNNX0JBQ0tFTkRfREFJX1BQX1BBUkFNU19SRVFfTUFYOyBpbmRleCsrKSB7Ci0JCWlmIChtc21fYmVkYWlzX3BwX3BhcmFtc1tpbmRleF0ucG9ydF9pZCA9PSBwb3J0X2lkKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbmRleCA+PSBNU01fQkFDS0VORF9EQUlfUFBfUEFSQU1TX1JFUV9NQVgpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBiYWNrZW5kIHBwIHBhcmFtcyBpbmRleCAlZFxuIiwKLQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRvcG9faWQgPSBhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2NvcHBfaWR4KHBvcnRfaWQsIGNvcHBfaWR4KTsKLQlpZiAodG9wb19pZCAhPSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RFRkFVTFRfVE9QT0xPR1kpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXNzdGhyb3VnaCB0b3BvbG9neSAweCV4XG4iLAotCQkJX19mdW5jX18sIHRvcG9faWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKG1zbV9iZWRhaXNbYmVfaWR4XS5wYXNzdGhyX21vZGVbZmVfaWRdID09IExFR0FDWV9QQ00pIHx8Ci0JCShtc21fYmVkYWlzW2JlX2lkeF0ucGFzc3Rocl9tb2RlW2ZlX2lkXSA9PSBMSVNURU4pKQotCQljb21wcl9wYXNzdGhyX21vZGUgPSBmYWxzZTsKLQotCXBwX2NvbmZpZyA9IG1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnOwotCWlmICh0ZXN0X2JpdChBRE1fUFBfUEFSQU1fTVVURV9CSVQsICZwcF9jb25maWcpKSB7Ci0JCXByX2RlYnVnKCIlczogQURNX1BQX1BBUkFNX01VVEVcbiIsIF9fZnVuY19fKTsKLQkJY2xlYXJfYml0KEFETV9QUF9QQVJBTV9NVVRFX0JJVCwgJnBwX2NvbmZpZyk7Ci0JCW11dGVfb24gPSBtc21fYmVkYWlzX3BwX3BhcmFtc1tpbmRleF0ubXV0ZV9vbjsKLQkJaWYgKChtc21fYmVkYWlzW2JlX2lkeF0uYWN0aXZlKSAmJiBjb21wcl9wYXNzdGhyX21vZGUpCi0JCQlhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9tdXRlKHBvcnRfaWQsCi0JCQkJCQkJCWNvcHBfaWR4LAotCQkJCQkJCQltdXRlX29uKTsKLQl9Ci0JaWYgKHRlc3RfYml0KEFETV9QUF9QQVJBTV9MQVRFTkNZX0JJVCwgJnBwX2NvbmZpZykpIHsKLQkJcHJfZGVidWcoIiVzOiBBRE1fUFBfUEFSQU1fTEFURU5DWVxuIiwgX19mdW5jX18pOwotCQljbGVhcl9iaXQoQURNX1BQX1BBUkFNX0xBVEVOQ1lfQklULAotCQkJICAmcHBfY29uZmlnKTsKLQkJbGF0ZW5jeSA9IG1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5sYXRlbmN5OwotCQlpZiAoKG1zbV9iZWRhaXNbYmVfaWR4XS5hY3RpdmUpICYmIGNvbXByX3Bhc3N0aHJfbW9kZSkKLQkJCWFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3kocG9ydF9pZCwKLQkJCQkJCQkgICBjb3BwX2lkeCwKLQkJCQkJCQkgICBsYXRlbmN5KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcHV0X2RldmljZV9wcF9wYXJhbXNfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBwcF9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWludCBwb3J0X2lkID0gMDsKLQlpbnQgaW5kZXgsIGJlX2lkeCwgaSwgdG9wb19pZCwgaWR4OwotCWJvb2wgbXV0ZTsKLQlpbnQgbGF0ZW5jeTsKLQlib29sIGNvbXByX3Bhc3N0aHJfbW9kZSA9IHRydWU7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBwX2lkOiAweCV4XG4iLCBfX2Z1bmNfXywgcHBfaWQpOwotCi0JZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykgewotCQlwb3J0X2lkID0gbXNtX2JlZGFpc1tiZV9pZHhdLnBvcnRfaWQ7Ci0JCWlmIChwb3J0X2lkID09IEhETUlfUlggfHwgcG9ydF9pZCA9PSBESVNQTEFZX1BPUlRfUlgpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoYmVfaWR4ID49IE1TTV9CQUNLRU5EX0RBSV9NQVgpIHsKLQkJcHJfZGVidWcoIiVzOiBJbnZhbGlkIGJlIGlkICVkXG4iLCBfX2Z1bmNfXywgYmVfaWR4KTsKLQkJcmV0dXJuICAtRUlOVkFMOwotCX0KLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWDsgaW5kZXgrKykgewotCQlpZiAobXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLnBvcnRfaWQgPT0gcG9ydF9pZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoaW5kZXggPj0gTVNNX0JBQ0tFTkRfREFJX1BQX1BBUkFNU19SRVFfTUFYKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcHAgcGFyYW1zIGJhY2tlbmQgaW5kZXggJWRcbiIsCi0JCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3JfZWFjaF9zZXRfYml0KGksICZtc21fYmVkYWlzW2JlX2lkeF0uZmVfc2Vzc2lvbnNbMF0sCi0JCQkJTVNNX0ZST05URU5EX0RBSV9NTV9TSVpFKSB7Ci0JCWlmICgobXNtX2JlZGFpc1tiZV9pZHhdLnBhc3N0aHJfbW9kZVtpXSA9PSBMRUdBQ1lfUENNKSB8fAotCQkJKG1zbV9iZWRhaXNbYmVfaWR4XS5wYXNzdGhyX21vZGVbaV0gPT0gTElTVEVOKSkKLQkJCWNvbXByX3Bhc3N0aHJfbW9kZSA9IGZhbHNlOwotCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgewotCQkJdW5zaWduZWQgbG9uZyBjb3BwID0KLQkJCQlzZXNzaW9uX2NvcHBfbWFwW2ldCi0JCQkJW1NFU1NJT05fVFlQRV9SWF1bYmVfaWR4XTsKLQkJCWlmICghdGVzdF9iaXQoaWR4LCAmY29wcCkpCi0JCQkJY29udGludWU7Ci0JCQl0b3BvX2lkID0gYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChwb3J0X2lkLAotCQkJCQkJCQkgICAgIGlkeCk7Ci0JCQlpZiAodG9wb19pZCAhPSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RFRkFVTFRfVE9QT0xPR1kpCi0JCQkJY29udGludWU7Ci0JCXByX2RlYnVnKCIlczogcG9ydDogMHgleCwgY29wcCAlbGQsIGJlIGFjdGl2ZTogJWQsIHBhc3N0OiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcCwgbXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSwKLQkJCSBtc21fYmVkYWlzW2JlX2lkeF0ucGFzc3Rocl9tb2RlW2ldKTsKLQkJc3dpdGNoIChwcF9pZCkgewotCQljYXNlIEFETV9QUF9QQVJBTV9NVVRFX0lEOgotCQkJcHJfZGVidWcoIiVzOiBBRE1fUFBfUEFSQU1fTVVURVxuIiwgX19mdW5jX18pOwotCQkJbXV0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID8gdHJ1ZSA6IGZhbHNlOwotCQkJbXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLm11dGVfb24gPSBtdXRlOwotCQkJc2V0X2JpdChBRE1fUFBfUEFSQU1fTVVURV9CSVQsCi0JCQkJJm1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnKTsKLQkJCWlmICgobXNtX2JlZGFpc1tiZV9pZHhdLmFjdGl2ZSkgJiYgY29tcHJfcGFzc3Rocl9tb2RlKQotCQkJCWFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX211dGUocG9ydF9pZCwKLQkJCQkJaWR4LCBtdXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIEFETV9QUF9QQVJBTV9MQVRFTkNZX0lEOgotCQkJcHJfZGVidWcoIiVzOiBBRE1fUFBfUEFSQU1fTEFURU5DWVxuIiwgX19mdW5jX18pOwotCQkJbXNtX2JlZGFpc19wcF9wYXJhbXNbaW5kZXhdLmxhdGVuY3kgPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCQkJc2V0X2JpdChBRE1fUFBfUEFSQU1fTEFURU5DWV9CSVQsCi0JCQkJJm1zbV9iZWRhaXNfcHBfcGFyYW1zW2luZGV4XS5wcF9wYXJhbXNfY29uZmlnKTsKLQkJCWxhdGVuY3kgPSBtc21fYmVkYWlzX3BwX3BhcmFtc1tpbmRleF0ubGF0ZW5jeSA9Ci0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JCQlpZiAoKG1zbV9iZWRhaXNbYmVfaWR4XS5hY3RpdmUpICYmIGNvbXByX3Bhc3N0aHJfbW9kZSkKLQkJCQlhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9sYXRlbmN5KHBvcnRfaWQsCi0JCQkJCWlkeCwgbGF0ZW5jeSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2luZm8oIiVzLCBkZXZpY2UgcHAgcGFyYW0gJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcHBfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19nZXRfZGV2aWNlX3BwX3BhcmFtc19taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOm1zbV9yb3V0aW5nX2dldF9kZXZpY2VfcHBfcGFyYW1zX21peGVyIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGV2aWNlX3BwX3BhcmFtc19taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJEZXZpY2UgUFAgUGFyYW1zIiwgU05EX1NPQ19OT1BNLCAwLCAweEZGRkZGRkZGLAotCTAsIDMsIG1zbV9yb3V0aW5nX2dldF9kZXZpY2VfcHBfcGFyYW1zX21peGVyLAotCW1zbV9yb3V0aW5nX3B1dF9kZXZpY2VfcHBfcGFyYW1zX21peGVyKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2FwdHhfZGVjX2xpY2Vuc2VfY29udHJvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJY29yZV9nZXRfbGljZW5zZV9zdGF0dXMoQVNNX01FRElBX0ZNVF9BUFRYKTsKLQlwcl9kZWJ1ZygiJXM6IHN0YXR1cyAlbGRcbiIsIF9fZnVuY19fLAotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hcHR4X2RlY19saWNlbnNlX2NvbnRyb2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludDMyX3Qgc3RhdHVzID0gMDsKLQotCXN0YXR1cyA9IGNvcmVfc2V0X2xpY2Vuc2UodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCi0JCQkJQVBUWF9DTEFTU0lDX0RFQ19MSUNFTlNFX0lEKTsKLQlwcl9kZWJ1ZygiJXM6IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFwdHhfZGVjX2xpY2Vuc2VfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiQVBUWCBEZWMgTGljZW5zZSIsIFNORF9TT0NfTk9QTSwgMCwKLQkweEZGRkYsIDAsIG1zbV9hcHR4X2RlY19saWNlbnNlX2NvbnRyb2xfZ2V0LAotCW1zbV9hcHR4X2RlY19saWNlbnNlX2NvbnRyb2xfcHV0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfYmVfZGFpX25hbWVfdGFibGVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JdWluZm8tPmNvdW50ID0gc2l6ZW9mKGJlX2RhaV9uYW1lX3RhYmxlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19iZV9kYWlfbmFtZV90YWJsZV90bHZfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkJIHVuc2lnbmVkIGludCBfX3VzZXIgKmJ5dGVzLAotCQkJCQkJIHVuc2lnbmVkIGludCBzaXplKQotewotCWludCBpOwotCWludCByZXQ7Ci0KLQlpZiAoc2l6ZSA8IHNpemVvZihiZV9kYWlfbmFtZV90YWJsZSkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzaXplICVkIHJlcXVlc3RlZCwgcmV0dXJuaW5nXG4iLAotCQkJX19mdW5jX18sIHNpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyoKLQkgKiBGaWxsIGJlX2RhaV9uYW1lX3RhYmxlIGZyb20gbXNtX2JlZGFpcyB0YWJsZSB0byByZWR1Y2UgY29kZSBjaGFuZ2VzCi0JICogbmVlZGVkIHdoZW4gYWRkaW5nIG5ldyBiYWNrZW5kcwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBNU01fQkFDS0VORF9EQUlfTUFYOyBpKyspIHsKLQkJYmVfZGFpX25hbWVfdGFibGVbaV0uYmVfaWQgPSBpOwotCQlzdHJsY3B5KGJlX2RhaV9uYW1lX3RhYmxlW2ldLmJlX25hbWUsCi0JCQltc21fYmVkYWlzW2ldLm5hbWUsCi0JCQlMUEFTU19CRV9OQU1FX01BWF9MRU5HVEgpOwotCX0KLQotCXJldCA9IGNvcHlfdG9fdXNlcihieXRlcywgJmJlX2RhaV9uYW1lX3RhYmxlLAotCQkJICAgc2l6ZW9mKGJlX2RhaV9uYW1lX3RhYmxlKSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY29weSBiZV9kYWlfbmFtZV90YWJsZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUZBVUxUOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcKLQltc21fcm91dGluZ19iZV9kYWlfbmFtZV90YWJsZV9taXhlcl9jb250cm9sc1tdID0gewotCXsKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCB8Ci0JCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ0FMTEJBQ0ssCi0JCS5pbmZvID0gbXNtX3JvdXRpbmdfYmVfZGFpX25hbWVfdGFibGVfaW5mbywKLQkJLm5hbWUgPSAiQmFja2VuZCBEQUkgTmFtZSBUYWJsZSIsCi0JCS50bHYuYyA9IHNuZF9zb2NfYnl0ZXNfdGx2X2NhbGxiYWNrLAotCQkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSAmKHN0cnVjdCBzb2NfYnl0ZXNfZXh0KSB7Ci0JCQkubWF4ID0gc2l6ZW9mKGJlX2RhaV9uYW1lX3RhYmxlKSwKLQkJCS5nZXQgPSBtc21fcm91dGluZ19iZV9kYWlfbmFtZV90YWJsZV90bHZfZ2V0LAotCQl9Ci0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfc3RlcmVvX2NoYW5uZWxfcmV2ZXJzZV9jb250cm9sX2dldCgKLQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzd2FwX2NoOwotCXByX2RlYnVnKCIlczogU3dhcCBjaGFubmVsIHZhbHVlOiAlbGRcbiIsIF9fZnVuY19fLAotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcm91dGluZ19zdGVyZW9fY2hhbm5lbF9yZXZlcnNlX2NvbnRyb2xfcHV0KAotCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaSwgaWR4LCBiZV9pbmRleCwgcG9ydF9pZDsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGNvcHA7Ci0KLQlwcl9kZWJ1ZygiJXMgU3dhcCBjaGFubmVsIHZhbHVlOiVsZFxuIiwgX19mdW5jX18sCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0Jc3dhcF9jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JbXV0ZXhfbG9jaygmcm91dGluZ19sb2NrKTsKLQlmb3IgKGJlX2luZGV4ID0gMDsgYmVfaW5kZXggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pbmRleCsrKSB7Ci0JCXBvcnRfaWQgPSBtc21fYmVkYWlzW2JlX2luZGV4XS5wb3J0X2lkOwotCQlpZiAoIW1zbV9iZWRhaXNbYmVfaW5kZXhdLmFjdGl2ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWZvcl9lYWNoX3NldF9iaXQoaSwgJm1zbV9iZWRhaXNbYmVfaW5kZXhdLmZlX3Nlc3Npb25zWzBdLAotCQkJCU1TTV9GUk9OVEVORF9EQUlfTU1fU0laRSkgewotCQkJY29wcCA9IHNlc3Npb25fY29wcF9tYXBbaV1bU0VTU0lPTl9UWVBFX1JYXVtiZV9pbmRleF07Ci0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaWR4KyspIHsKLQkJCQlpZiAoIXRlc3RfYml0KGlkeCwgJmNvcHApKQotCQkJCQljb250aW51ZTsKLQotCQkJCXByX2RlYnVnKCIlczogc3dhcCBjaGFubmVsIGNvbnRyb2wgb2YgcG9ydGlkOiVkLCBjb3BwaWQ6JWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcG9ydF9pZCwgaWR4KTsKLQkJCQlyZXQgPSBhZG1fc3dhcF9zcGVha2VyX2NoYW5uZWxzKAotCQkJCQlwb3J0X2lkLCBpZHgsCi0JCQkJCW1zbV9iZWRhaXNbYmVfaW5kZXhdLnNhbXBsZV9yYXRlLAotCQkJCQlzd2FwX2NoKTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCXByX2VycigiJXM6U3dhcF9jaGFubmVsIGZhaWxlZCwgZXJyPSVkXG4iLAotCQkJCQkJIF9fZnVuY19fLCByZXQpOwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJnJvdXRpbmdfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0ZXJlb19jaGFubmVsX3JldmVyc2VfY29udHJvbFtdID0gewotCVNPQ19TSU5HTEVfRVhUKCJTd2FwIGNoYW5uZWwiLCBTTkRfU09DX05PUE0sIDAsCi0JMSwgMCwgbXNtX3JvdXRpbmdfc3RlcmVvX2NoYW5uZWxfcmV2ZXJzZV9jb250cm9sX2dldCwKLQltc21fcm91dGluZ19zdGVyZW9fY2hhbm5lbF9yZXZlcnNlX2NvbnRyb2xfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3JvdXRpbmdfcGNtX29wcyA9IHsKLQkuaHdfcGFyYW1zCT0gbXNtX3BjbV9yb3V0aW5nX2h3X3BhcmFtcywKLQkuY2xvc2UgICAgICAgICAgPSBtc21fcGNtX3JvdXRpbmdfY2xvc2UsCi0JLnByZXBhcmUgICAgICAgID0gbXNtX3BjbV9yb3V0aW5nX3ByZXBhcmUsCi19OwotCi0vKiBOb3QgdXNlZCBidXQgZnJhbWUgc2VlbXMgdG8gcmVxdWlyZSBpdCAqLwotc3RhdGljIGludCBtc21fcm91dGluZ19wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc25kX3NvY19kYXBtX25ld19jb250cm9scygmcGxhdGZvcm0tPmNvbXBvbmVudC5kYXBtLCBtc21fcWRzcDZfd2lkZ2V0cywKLQkJCSAgIEFSUkFZX1NJWkUobXNtX3Fkc3A2X3dpZGdldHMpKTsKLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmcGxhdGZvcm0tPmNvbXBvbmVudC5kYXBtLCBpbnRlcmNvbiwKLQkJQVJSQVlfU0laRShpbnRlcmNvbikpOwotCi0Jc25kX3NvY19kYXBtX25ld193aWRnZXRzKHBsYXRmb3JtLT5jb21wb25lbnQuZGFwbS5jYXJkKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBsc21fY29udHJvbHMsCi0JCQkJICAgICAgQVJSQVlfU0laRShsc21fY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBhYW5jX3NsaW1fMF9yeF9tdXgsCi0JCQkJICAgICAgQVJSQVlfU0laRShhYW5jX3NsaW1fMF9yeF9tdXgpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fdm9jX3Nlc3Npb25fY29udHJvbHMsCi0JCQkJICAgICAgQVJSQVlfU0laRShtc21fdm9jX3Nlc3Npb25fY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBhcHBfdHlwZV9jZmdfY29udHJvbHMsCi0JCQkJICAgICAgQVJSQVlfU0laRShhcHBfdHlwZV9jZmdfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBsc21fYXBwX3R5cGVfY2ZnX2NvbnRyb2xzLAotCQkJCSAgICAgIEFSUkFZX1NJWkUobHNtX2FwcF90eXBlX2NmZ19jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQkJc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKHN0ZXJlb190b19jdXN0b21fc3RlcmVvX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgZWNfcmVmX3BhcmFtX2NvbnRyb2xzLAotCQkJCUFSUkFZX1NJWkUoZWNfcmVmX3BhcmFtX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgY2hhbm5lbF9taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGNoYW5uZWxfbWl4ZXJfY29udHJvbHMpKTsKLQotCW1zbV9xdGlfcHBfYWRkX2NvbnRyb2xzKHBsYXRmb3JtKTsKLQotCW1zbV9kdHNfc3JzX3RtX2FkZF9jb250cm9scyhwbGF0Zm9ybSk7Ci0KLQltc21fZG9sYnlfZGFwX2FkZF9jb250cm9scyhwbGF0Zm9ybSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwKLQkJCXVzZV9kczFfb3JfZHMyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRSh1c2VfZHMxX29yX2RzMl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQkJZGV2aWNlX3BwX3BhcmFtc19taXhlcl9jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGRldmljZV9wcF9wYXJhbXNfbWl4ZXJfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAotCQltc21fcm91dGluZ19iZV9kYWlfbmFtZV90YWJsZV9taXhlcl9jb250cm9scywKLQkJQVJSQVlfU0laRShtc21fcm91dGluZ19iZV9kYWlfbmFtZV90YWJsZV9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV9zb3VyY2VfdHJhY2tpbmdfY29udHJvbHMsCi0JCQkJQVJSQVlfU0laRShtc21fc291cmNlX3RyYWNraW5nX2NvbnRyb2xzKSk7Ci0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGFkbV9jaGFubmVsX2NvbmZpZ19jb250cm9scywKLQkJCQlBUlJBWV9TSVpFKGFkbV9jaGFubmVsX2NvbmZpZ19jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGFwdHhfZGVjX2xpY2Vuc2VfY29udHJvbHMsCi0JCQkJCUFSUkFZX1NJWkUoYXB0eF9kZWNfbGljZW5zZV9jb250cm9scykpOwotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBzdGVyZW9fY2hhbm5lbF9yZXZlcnNlX2NvbnRyb2wsCi0JCQkJQVJSQVlfU0laRShzdGVyZW9fY2hhbm5lbF9yZXZlcnNlX2NvbnRyb2wpKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9yb3V0aW5nX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0JcmV0dXJuIG1zbV9wY21fcm91dGluZ19od2RlcF9uZXcocnVudGltZSwgbXNtX2JlZGFpcyk7Ci19Ci0KLXZvaWQgbXNtX3JvdXRpbmdfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLQltc21fcGNtX3JvdXRpbmdfaHdkZXBfZnJlZShwY20pOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIG1zbV9zb2Nfcm91dGluZ19wbGF0Zm9ybSA9IHsKLQkub3BzCQk9ICZtc21fcm91dGluZ19wY21fb3BzLAotCS5wcm9iZQkJPSBtc21fcm91dGluZ19wcm9iZSwKLQkucGNtX25ldwk9IG1zbV9yb3V0aW5nX3BjbV9uZXcsCi0JLnBjbV9mcmVlCT0gbXNtX3JvdXRpbmdfcGNtX2ZyZWUsCi19OwotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiZGV2IG5hbWUgJXNcbiIsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKLQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCSAgJm1zbV9zb2Nfcm91dGluZ19wbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfcGNtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3BjbV9yb3V0aW5nX2R0X21hdGNoW10gPSB7Ci0Jey5jb21wYXRpYmxlID0gInFjb20sbXNtLXBjbS1yb3V0aW5nIn0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fcGNtX3JvdXRpbmdfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcm91dGluZ19wY21fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBtc21fcGNtX3JvdXRpbmdfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fcm91dGluZ19wY21fcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9yb3V0aW5nX3BjbV9yZW1vdmUsCi19OwotCi1pbnQgbXNtX3JvdXRpbmdfY2hlY2tfYmFja2VuZF9lbmFibGVkKGludCBmZWRhaV9pZCkKLXsKLQlpbnQgaTsKLQotCWlmIChmZWRhaV9pZCA+IE1TTV9GUk9OVEVORF9EQUlfTU1fTUFYX0lEKSB7Ci0JCS8qIGJhZCBJRCBhc3NpZ25lZCBpbiBtYWNoaW5lIGRyaXZlciAqLwotCQlwcl9lcnIoIiVzOiBiYWQgTU0gSURcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNU01fQkFDS0VORF9EQUlfTUFYOyBpKyspIHsKLQkJaWYgKHRlc3RfYml0KGZlZGFpX2lkLCAmbXNtX2JlZGFpc1tpXS5mZV9zZXNzaW9uc1swXSkpCi0JCQlyZXR1cm4gbXNtX2JlZGFpc1tpXS5hY3RpdmU7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9yb3V0aW5nX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwKLQkJCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JcmV0ID0gY2FsX3V0aWxzX3NldF9jYWwoZGF0YV9zaXplLCBkYXRhLCBjYWxfZGF0YSwgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX3NldF9jYWwgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9yb3V0aW5nX2RlbGV0ZV9jYWxfZGF0YSh2b2lkKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKDEsICZjYWxfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRpbmdfaW5pdF9jYWxfZGF0YSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjYWxfdHlwZV9pbmZvIGNhbF90eXBlX2luZm8gPSB7Ci0JCXtBRE1fVE9QT0xPR1lfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLAotCQltc21fcm91dGluZ19zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19Ci0JfTsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKDEsICZjYWxfZGF0YSwKLQkJJmNhbF90eXBlX2luZm8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBjcmVhdGUgY2FsIHR5cGUhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotZXJyOgotCW1zbV9yb3V0aW5nX2RlbGV0ZV9jYWxfZGF0YSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zb2Nfcm91dGluZ19wbGF0Zm9ybV9pbml0KHZvaWQpCi17Ci0JbXV0ZXhfaW5pdCgmcm91dGluZ19sb2NrKTsKLQlpZiAobXNtX3JvdXRpbmdfaW5pdF9jYWxfZGF0YSgpKQotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgaW5pdCBjYWwgZGF0YSFcbiIsIF9fZnVuY19fKTsKLQotCWFmZV9zZXRfcm91dGluZ19jYWxsYmFjaygKLQkJKHJvdXRpbmdfY2IpbXNtX3BjbV9nZXRfZGV2X2FjZGJfaWRfYnlfcG9ydF9pZCk7Ci0KLQltZW1zZXQoJmJlX2RhaV9uYW1lX3RhYmxlLCAwLCBzaXplb2YoYmVfZGFpX25hbWVfdGFibGUpKTsKLQltZW1zZXQoJmxhc3RfYmVfaWRfY29uZmlndXJlZCwgMCwgc2l6ZW9mKGxhc3RfYmVfaWRfY29uZmlndXJlZCkpOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXNtX3JvdXRpbmdfcGNtX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3JvdXRpbmdfcGxhdGZvcm1faW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtc21fc29jX3JvdXRpbmdfcGxhdGZvcm1fZXhpdCh2b2lkKQotewotCW1zbV9yb3V0aW5nX2RlbGV0ZV9jYWxfZGF0YSgpOwotCW1lbXNldCgmYmVfZGFpX25hbWVfdGFibGUsIDAsIHNpemVvZihiZV9kYWlfbmFtZV90YWJsZSkpOwotCW11dGV4X2Rlc3Ryb3koJnJvdXRpbmdfbG9jayk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9yb3V0aW5nX3BjbV9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQobXNtX3NvY19yb3V0aW5nX3BsYXRmb3JtX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1TTSByb3V0aW5nIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU3MjYwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfTVNNX1BDTV9ST1VUSU5HX0gKLSNkZWZpbmUgX01TTV9QQ01fUk9VVElOR19ICi0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0KLS8qCi0gKiBUaGVzZSBuYW1lcyBhcmUgdXNlZCBieSBIQUwgdG8gc3BlY2lmeSB0aGUgQkUuIElmIGFueSBjaGFuZ2VzIGFyZQotICogbWFkZSB0byB0aGUgc3RyaW5nIG5hbWVzIG9yIHRoZSBtYXggbmFtZSBsZW5ndGggY29ycmVzcG9uZGluZwotICogY2hhbmdlcyBuZWVkIHRvIGJlIG1hZGUgaW4gdGhlIEhBTCB0byBlbnN1cmUgdGhleSBzdGlsbCBtYXRjaC4KLSAqLwotI2RlZmluZSBMUEFTU19CRV9OQU1FX01BWF9MRU5HVEggMjQKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX0kyU19SWCAiUFJJTUFSWV9JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9JMlNfVFggIlBSSU1BUllfSTJTX1RYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzBfUlggIlNMSU1CVVNfMF9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18wX1RYICJTTElNQlVTXzBfVFgiCi0jZGVmaW5lIExQQVNTX0JFX0hETUkgIkhETUkiCi0jZGVmaW5lIExQQVNTX0JFX0RJU1BMQVlfUE9SVCAiRElTUExBWV9QT1JUIgotI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfU0NPX1JYICJJTlRfQlRfU0NPX1JYIgotI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfU0NPX1RYICJJTlRfQlRfU0NPX1RYIgotI2RlZmluZSBMUEFTU19CRV9JTlRfQlRfQTJEUF9SWCAiSU5UX0JUX0EyRFBfUlgiCi0jZGVmaW5lIExQQVNTX0JFX0lOVF9GTV9SWCAiSU5UX0ZNX1JYIgotI2RlZmluZSBMUEFTU19CRV9JTlRfRk1fVFggIklOVF9GTV9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfQUZFX1BDTV9SWCAiUlRfUFJPWFlfREFJXzAwMV9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfQUZFX1BDTV9UWCAiUlRfUFJPWFlfREFJXzAwMl9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfQVVYUENNX1JYICJBVVhfUENNX1JYIgotI2RlZmluZSBMUEFTU19CRV9BVVhQQ01fVFggIkFVWF9QQ01fVFgiCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19BVVhQQ01fUlggIlNFQ19BVVhfUENNX1JYIgotI2RlZmluZSBMUEFTU19CRV9TRUNfQVVYUENNX1RYICJTRUNfQVVYX1BDTV9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfVEVSVF9BVVhQQ01fUlggIlRFUlRfQVVYX1BDTV9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfVEVSVF9BVVhQQ01fVFggIlRFUlRfQVVYX1BDTV9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlggIlFVQVRfQVVYX1BDTV9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFggIlFVQVRfQVVYX1BDTV9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfVk9JQ0VfUExBWUJBQ0tfVFggIlZPSUNFX1BMQVlCQUNLX1RYIgotI2RlZmluZSBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFggIlZPSUNFMl9QTEFZQkFDS19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCAiSU5DQUxMX1JFQ09SRF9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCAiSU5DQUxMX1JFQ09SRF9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX0kyU19SWCAiU0VDT05EQVJZX0kyU19SWCIKLSNkZWZpbmUgTFBBU1NfQkVfU1BESUZfUlggIlNQRElGX1JYIgotCi0jZGVmaW5lIExQQVNTX0JFX01JMlNfUlggIk1JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX01JMlNfVFggIk1JMlNfVFgiCi0jZGVmaW5lIExQQVNTX0JFX1FVQVRfTUkyU19SWCAiUVVBVF9NSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX01JMlNfVFggIlFVQVRfTUkyU19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX01JMlNfUlggIlNFQ19NSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9TRUNfTUkyU19SWF9TRDEgIlNFQ19NSTJTX1JYX1NEMSIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX01JMlNfVFggIlNFQ19NSTJTX1RYIgotI2RlZmluZSBMUEFTU19CRV9QUklfTUkyU19SWCAiUFJJX01JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9NSTJTX1RYICJQUklfTUkyU19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfVEVSVF9NSTJTX1JYICJURVJUSUFSWV9NSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9URVJUX01JMlNfVFggIlRFUlRJQVJZX01JMlNfVFgiCi0jZGVmaW5lIExQQVNTX0JFX0FVRElPX0kyU19SWCAiQVVESU9fSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9TVFVCX1JYICJTVFVCX1JYIgotI2RlZmluZSBMUEFTU19CRV9TVFVCX1RYICJTVFVCX1RYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzFfUlggIlNMSU1CVVNfMV9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18xX1RYICJTTElNQlVTXzFfVFgiCi0jZGVmaW5lIExQQVNTX0JFX1NUVUJfMV9UWCAiU1RVQl8xX1RYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzJfUlggIlNMSU1CVVNfMl9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU18yX1RYICJTTElNQlVTXzJfVFgiCi0jZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfM19SWCAiU0xJTUJVU18zX1JYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzNfVFggIlNMSU1CVVNfM19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU180X1JYICJTTElNQlVTXzRfUlgiCi0jZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfNF9UWCAiU0xJTUJVU180X1RYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTX1RYX1ZJICJTTElNQlVTX1RYX1ZJIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzVfUlggIlNMSU1CVVNfNV9SWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU181X1RYICJTTElNQlVTXzVfVFgiCi0jZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfNl9SWCAiU0xJTUJVU182X1JYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzZfVFggIlNMSU1CVVNfNl9UWCIKLSNkZWZpbmUgTFBBU1NfQkVfUVVJTl9NSTJTX1JYICJRVUlOX01JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX1FVSU5fTUkyU19UWCAiUVVJTl9NSTJTX1RYIgotI2RlZmluZSBMUEFTU19CRV9TRU5BUllfTUkyU19UWCAiU0VOQVJZX01JMlNfVFgiCi0KLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF8wICJQUklfVERNX1JYXzAiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfMCAiUFJJX1RETV9UWF8wIgotI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzEgIlBSSV9URE1fUlhfMSIKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF8xICJQUklfVERNX1RYXzEiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fUlhfMiAiUFJJX1RETV9SWF8yIgotI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1RYXzIgIlBSSV9URE1fVFhfMiIKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF8zICJQUklfVERNX1JYXzMiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfMyAiUFJJX1RETV9UWF8zIgotI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzQgIlBSSV9URE1fUlhfNCIKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF80ICJQUklfVERNX1RYXzQiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fUlhfNSAiUFJJX1RETV9SWF81IgotI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1RYXzUgIlBSSV9URE1fVFhfNSIKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9SWF82ICJQUklfVERNX1JYXzYiCi0jZGVmaW5lIExQQVNTX0JFX1BSSV9URE1fVFhfNiAiUFJJX1RETV9UWF82IgotI2RlZmluZSBMUEFTU19CRV9QUklfVERNX1JYXzcgIlBSSV9URE1fUlhfNyIKLSNkZWZpbmUgTFBBU1NfQkVfUFJJX1RETV9UWF83ICJQUklfVERNX1RYXzciCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfMCAiU0VDX1RETV9SWF8wIgotI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzAgIlNFQ19URE1fVFhfMCIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF8xICJTRUNfVERNX1JYXzEiCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfMSAiU0VDX1RETV9UWF8xIgotI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1JYXzIgIlNFQ19URE1fUlhfMiIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9UWF8yICJTRUNfVERNX1RYXzIiCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfMyAiU0VDX1RETV9SWF8zIgotI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzMgIlNFQ19URE1fVFhfMyIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF80ICJTRUNfVERNX1JYXzQiCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfNCAiU0VDX1RETV9UWF80IgotI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1JYXzUgIlNFQ19URE1fUlhfNSIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9UWF81ICJTRUNfVERNX1RYXzUiCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fUlhfNiAiU0VDX1RETV9SWF82IgotI2RlZmluZSBMUEFTU19CRV9TRUNfVERNX1RYXzYgIlNFQ19URE1fVFhfNiIKLSNkZWZpbmUgTFBBU1NfQkVfU0VDX1RETV9SWF83ICJTRUNfVERNX1JYXzciCi0jZGVmaW5lIExQQVNTX0JFX1NFQ19URE1fVFhfNyAiU0VDX1RETV9UWF83IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8wICJURVJUX1RETV9SWF8wIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8wICJURVJUX1RETV9UWF8wIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8xICJURVJUX1RETV9SWF8xIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8xICJURVJUX1RETV9UWF8xIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8yICJURVJUX1RETV9SWF8yIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8yICJURVJUX1RETV9UWF8yIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF8zICJURVJUX1RETV9SWF8zIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF8zICJURVJUX1RETV9UWF8zIgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF80ICJURVJUX1RETV9SWF80IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF80ICJURVJUX1RETV9UWF80IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF81ICJURVJUX1RETV9SWF81IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF81ICJURVJUX1RETV9UWF81IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF82ICJURVJUX1RETV9SWF82IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF82ICJURVJUX1RETV9UWF82IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9SWF83ICJURVJUX1RETV9SWF83IgotI2RlZmluZSBMUEFTU19CRV9URVJUX1RETV9UWF83ICJURVJUX1RETV9UWF83IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8wICJRVUFUX1RETV9SWF8wIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8wICJRVUFUX1RETV9UWF8wIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8xICJRVUFUX1RETV9SWF8xIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8xICJRVUFUX1RETV9UWF8xIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8yICJRVUFUX1RETV9SWF8yIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8yICJRVUFUX1RETV9UWF8yIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF8zICJRVUFUX1RETV9SWF8zIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF8zICJRVUFUX1RETV9UWF8zIgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF80ICJRVUFUX1RETV9SWF80IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF80ICJRVUFUX1RETV9UWF80IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF81ICJRVUFUX1RETV9SWF81IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF81ICJRVUFUX1RETV9UWF81IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF82ICJRVUFUX1RETV9SWF82IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF82ICJRVUFUX1RETV9UWF82IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9SWF83ICJRVUFUX1RETV9SWF83IgotI2RlZmluZSBMUEFTU19CRV9RVUFUX1RETV9UWF83ICJRVUFUX1RETV9UWF83IgotCi0jZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfN19SWCAiU0xJTUJVU183X1JYIgotI2RlZmluZSBMUEFTU19CRV9TTElNQlVTXzdfVFggIlNMSU1CVVNfN19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfU0xJTUJVU184X1JYICJTTElNQlVTXzhfUlgiCi0jZGVmaW5lIExQQVNTX0JFX1NMSU1CVVNfOF9UWCAiU0xJTUJVU184X1RYIgotCi0jZGVmaW5lIExQQVNTX0JFX1VTQl9BVURJT19SWCAiVVNCX0FVRElPX1JYIgotI2RlZmluZSBMUEFTU19CRV9VU0JfQVVESU9fVFggIlVTQl9BVURJT19UWCIKLQotI2RlZmluZSBMUEFTU19CRV9JTlQwX01JMlNfUlggIklOVDBfTUkyU19SWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5UMF9NSTJTX1RYICJJTlQwX01JMlNfVFgiCi0jZGVmaW5lIExQQVNTX0JFX0lOVDFfTUkyU19SWCAiSU5UMV9NSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9JTlQxX01JMlNfVFggIklOVDFfTUkyU19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5UMl9NSTJTX1JYICJJTlQyX01JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX0lOVDJfTUkyU19UWCAiSU5UMl9NSTJTX1RYIgotI2RlZmluZSBMUEFTU19CRV9JTlQzX01JMlNfUlggIklOVDNfTUkyU19SWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5UM19NSTJTX1RYICJJTlQzX01JMlNfVFgiCi0jZGVmaW5lIExQQVNTX0JFX0lOVDRfTUkyU19SWCAiSU5UNF9NSTJTX1JYIgotI2RlZmluZSBMUEFTU19CRV9JTlQ0X01JMlNfVFggIklOVDRfTUkyU19UWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5UNV9NSTJTX1JYICJJTlQ1X01JMlNfUlgiCi0jZGVmaW5lIExQQVNTX0JFX0lOVDVfTUkyU19UWCAiSU5UNV9NSTJTX1RYIgotI2RlZmluZSBMUEFTU19CRV9JTlQ2X01JMlNfUlggIklOVDZfTUkyU19SWCIKLSNkZWZpbmUgTFBBU1NfQkVfSU5UNl9NSTJTX1RYICJJTlQ2X01JMlNfVFgiCi0vKiBGb3IgbXVsdGltZWRpYSBmcm9udC1lbmRzLCBhc20gc2Vzc2lvbiBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCi0gKiBIZW5jZSwgYXNtIHNlc3Npb24vbXVsdGltZWRpYSBmcm9udC1lbmQgbWFwcGluZyBoYXMgdG8gYmUgbWFpbnRhaW5lZC4KLSAqIER1ZSB0byB0aGlzIHJlYXNvbiwgYWRkaXRpb25hbCBtdWx0aW1lZGlhIGZyb250LWVuZCBtdXN0IGJlIHBsYWNlZCBiZWZvcmUKLSAqIG5vbi1tdWx0aW1lZGlhIGZyb250LWVuZHMuCi0gKi8KLQotZW51bSB7Ci0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSA9IDAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTQsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE2LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE5LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTExLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEyLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEzLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE0LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE1LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE2LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE3LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE4LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTE5LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwLAotCU1TTV9GUk9OVEVORF9EQUlfQ1NfVk9JQ0UsCi0JTVNNX0ZST05URU5EX0RBSV9WT0lQLAotCU1TTV9GUk9OVEVORF9EQUlfQUZFX1JYLAotCU1TTV9GUk9OVEVORF9EQUlfQUZFX1RYLAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0VfU1RVQiwKLQlNU01fRlJPTlRFTkRfREFJX1ZPTFRFLAotCU1TTV9GUk9OVEVORF9EQUlfRFRNRl9SWCwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFMiwKLQlNU01fRlJPTlRFTkRfREFJX1FDSEFULAotCU1TTV9GUk9OVEVORF9EQUlfVk9MVEVfU1RVQiwKLQlNU01fRlJPTlRFTkRfREFJX0xTTTEsCi0JTVNNX0ZST05URU5EX0RBSV9MU00yLAotCU1TTV9GUk9OVEVORF9EQUlfTFNNMywKLQlNU01fRlJPTlRFTkRfREFJX0xTTTQsCi0JTVNNX0ZST05URU5EX0RBSV9MU001LAotCU1TTV9GUk9OVEVORF9EQUlfTFNNNiwKLQlNU01fRlJPTlRFTkRfREFJX0xTTTcsCi0JTVNNX0ZST05URU5EX0RBSV9MU004LAotCU1TTV9GUk9OVEVORF9EQUlfVk9JQ0UyX1NUVUIsCi0JTVNNX0ZST05URU5EX0RBSV9WT1dMQU4sCi0JTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKLQlNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAotCU1TTV9GUk9OVEVORF9EQUlfTUFYLAotfTsKLQotI2RlZmluZSBNU01fRlJPTlRFTkRfREFJX01NX1NJWkUgKE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIwICsgMSkKLSNkZWZpbmUgTVNNX0ZST05URU5EX0RBSV9NTV9NQVhfSUQgTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMjAKLQotZW51bSB7Ci0JTVNNX0JBQ0tFTkRfREFJX1BSSV9JMlNfUlggPSAwLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQlNU01fQkFDS0VORF9EQUlfSERNSV9SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0JUX1NDT19UWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UX0ZNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfRk1fVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9WT0lDRV9QTEFZQkFDS19UWCwKLQlNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9NSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQlNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0VYVFBST0NfRUNfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19UWCwKLQlNU01fQkFDS0VORF9EQUlfQVVESU9fSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9TUERJRl9SWCwKLQlNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlhfU0QxLAotCU1TTV9CQUNLRU5EX0RBSV9RVUlOQVJZX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1FVSU5BUllfTUkyU19UWCwKLQlNU01fQkFDS0VORF9EQUlfU0VOQVJZX01JMlNfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzEsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMSwKLQlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8yLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzIsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMywKLQlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzQsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfNCwKLQlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF81LAotCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzUsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfNiwKLQlNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF82LAotCU1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzcsCi0JTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfNywKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzAsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMSwKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8xLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzIsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMiwKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzMsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfNCwKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF80LAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzUsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfNSwKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF82LAotCU1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzYsCi0JTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfNywKLQlNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF83LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8xLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8xLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8yLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8yLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF80LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF80LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF81LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF81LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF82LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF82LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF83LAotCU1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9UWF83LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8xLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8xLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8yLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8yLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8zLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF80LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF80LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF81LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF81LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF82LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF82LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF83LAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF83LAotCU1TTV9CQUNLRU5EX0RBSV9JTlRfQlRfQTJEUF9SWCwKLQlNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9VU0JfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQlNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQlNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQxX01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDFfTUkyU19UWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQyX01JMlNfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDRfTUkyU19UWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UNV9NSTJTX1JYLAotCU1TTV9CQUNLRU5EX0RBSV9JTlQ1X01JMlNfVFgsCi0JTVNNX0JBQ0tFTkRfREFJX0lOVDZfTUkyU19SWCwKLQlNU01fQkFDS0VORF9EQUlfSU5UNl9NSTJTX1RYLAotCU1TTV9CQUNLRU5EX0RBSV9NQVgsCi19OwotCi1lbnVtIG1zbV9wY21fcm91dGluZ19ldmVudCB7Ci0JTVNNX1BDTV9SVF9FVlRfQlVGX1JFQ0ZHLAotCU1TTV9QQ01fUlRfRVZUX0RFVlNXSVRDSCwKLQlNU01fUENNX1JUX0VWVF9NQVgsCi19OwotCi1lbnVtIHsKLQlFWFRfRUNfUkVGX05PTkUgPSAwLAotCUVYVF9FQ19SRUZfUFJJX01JMlNfVFgsCi0JRVhUX0VDX1JFRl9TRUNfTUkyU19UWCwKLQlFWFRfRUNfUkVGX1RFUlRfTUkyU19UWCwKLQlFWFRfRUNfUkVGX1FVQVRfTUkyU19UWCwKLQlFWFRfRUNfUkVGX1FVSU5fTUkyU19UWCwKLQlFWFRfRUNfUkVGX1NMSU1fMV9UWCwKLX07Ci0KLSNkZWZpbmUgSU5WQUxJRF9TRVNTSU9OIC0xCi0jZGVmaW5lIFNFU1NJT05fVFlQRV9SWCAwCi0jZGVmaW5lIFNFU1NJT05fVFlQRV9UWCAxCi0jZGVmaW5lIE1BWF9TRVNTSU9OX1RZUEVTIDIKLSNkZWZpbmUgSU5UX1JYX1ZPTF9NQVhfU1RFUFMgMHgyMDAwCi0jZGVmaW5lIElOVF9SWF9WT0xfR0FJTiAweDIwMDAKLQotI2RlZmluZSBSRUxFQVNFX0xPQ0sJMAotI2RlZmluZSBBQ1FVSVJFX0xPQ0sJMQotCi0jZGVmaW5lIE1TTV9CQUNLRU5EX0RBSV9QUF9QQVJBTVNfUkVRX01BWAkyCi0jZGVmaW5lIEhETUlfUlhfSUQJCQkJMHg4MDAxCi0jZGVmaW5lIEFETV9QUF9QQVJBTV9NVVRFX0lECQkJMAotI2RlZmluZSBBRE1fUFBfUEFSQU1fTVVURV9CSVQJCQkxCi0jZGVmaW5lIEFETV9QUF9QQVJBTV9MQVRFTkNZX0lECQkJMQotI2RlZmluZSBBRE1fUFBfUEFSQU1fTEFURU5DWV9CSVQJCTIKLSNkZWZpbmUgQkVfREFJX1BPUlRfU0VTU0lPTlNfSURYX01BWAkJNAotI2RlZmluZSBCRV9EQUlfRkVfU0VTU0lPTlNfSURYX01BWAkJMgotCi1zdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2V2dCB7Ci0Jdm9pZCAoKmV2ZW50X2Z1bmMpKGVudW0gbXNtX3BjbV9yb3V0aW5nX2V2ZW50LCB2b2lkICopOwotCXZvaWQgKnByaXZfZGF0YTsKLX07Ci0KLXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhIHsKLQl1MTYgcG9ydF9pZDsgLyogQUZFIHBvcnQgSUQgKi8KLQl1OCBhY3RpdmU7IC8qIHRyYWNrIGlmIHRoaXMgYmFja2VuZCBpcyBlbmFibGVkICovCi0KLQkvKiBGcm9udC1lbmQgc2Vzc2lvbnMgKi8KLQl1bnNpZ25lZCBsb25nIGZlX3Nlc3Npb25zW0JFX0RBSV9GRV9TRVNTSU9OU19JRFhfTUFYXTsKLQkvKgotCSAqIFRyYWNrIFR4IEJFIHBvcnRzIC0+IFJ4IEJFIHBvcnRzLgotCSAqIHBvcnRfc2Vzc2lvbnNbMF0gdXNlZCB0byB0cmFjayBCRSAwIHRvIEJFIDYzLgotCSAqIHBvcnRfc2Vzc2lvbnNbMV0gdXNlZCB0byB0cmFjayBCRSA2NCB0byBCRSAxMjcuCi0JICogcG9ydF9zZXNzaW9uc1syXSB1c2VkIHRvIHRyYWNrIEJFIDEyOCB0byBCRSAxOTEuCi0JICogcG9ydF9zZXNzaW9uc1szXSB1c2VkIHRvIHRyYWNrIEJFIDE5MiB0byBCRSAyNTUuCi0JICovCi0JdTY0IHBvcnRfc2Vzc2lvbnNbQkVfREFJX1BPUlRfU0VTU0lPTlNfSURYX01BWF07Ci0KLQl1bnNpZ25lZCBpbnQgIHNhbXBsZV9yYXRlOwotCXVuc2lnbmVkIGludCAgY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgIGZvcm1hdDsKLQl1bnNpZ25lZCBpbnQgIGFkbV9vdmVycmlkZV9jaDsKLQl1MzIgcGFzc3Rocl9tb2RlW01TTV9GUk9OVEVORF9EQUlfTUFYXTsKLQljaGFyICpuYW1lOwotfTsKLQotc3RydWN0IG1zbV9wY21fcm91dGluZ19mZGFpX2RhdGEgewotCXUxNiBiZV9zcmF0ZTsgLyogdHJhY2sgcHJpb3IgYmFja2VuZCBzYW1wbGUgcmF0ZSBmb3IgZmx1c2hpbmcgcHVycG9zZSAqLwotCWludCBzdHJtX2lkOyAvKiBBU00gc3RyZWFtIElEICovCi0JaW50IHBlcmZfbW9kZTsKLQlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2V2dCBldmVudF9pbmZvOwotfTsKLQotI2RlZmluZSBNQVhfQVBQX1RZUEVTCTE2Ci1zdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2FwcF90eXBlX2RhdGEgewotCWludCBhcHBfdHlwZTsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JaW50IGJpdF93aWR0aDsKLX07Ci0KLXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgewotCWludCBhcHBfdHlwZTsKLQlpbnQgYWNkYl9kZXZfaWQ7Ci0JaW50IHNhbXBsZV9yYXRlOwotfTsKLQotLyogZGFpX2lkOiBmcm9udC1lbmQgSUQsCi0gKiBkc3BzdF9pZDogIERTUCBhdWRpbyBzdHJlYW0gSUQKLSAqIHN0cmVhbV90eXBlOiBwbGF5YmFjayBvciBjYXB0dXJlCi0gKi8KLWludCBtc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oaW50IGZlZGFpX2lkLCBpbnQgcGVyZl9tb2RlLCBpbnQgZHNwc3RfaWQsCi0JCQkJICAgaW50IHN0cmVhbV90eXBlKTsKLXZvaWQgbXNtX3BjbV9yb3V0aW5nX3JlZ19wc3Rocl9zdHJlYW0oaW50IGZlZGFpX2lkLCBpbnQgZHNwc3RfaWQsCi0JCWludCBzdHJlYW1fdHlwZSk7Ci1pbnQgbXNtX3BjbV9yb3V0aW5nX3JlZ19waHlfY29tcHJfc3RyZWFtKGludCBmZWRhaV9pZCwgaW50IHBlcmZfbW9kZSwKLQkJCQkJICBpbnQgZHNwc3RfaWQsIGludCBzdHJlYW1fdHlwZSwKLQkJCQkJICB1aW50MzJfdCBjb21wcl9wYXNzdGhyKTsKLQotaW50IG1zbV9wY21fcm91dGluZ19yZWdfcGh5X3N0cmVhbV92MihpbnQgZmVkYWlfaWQsIGludCBwZXJmX21vZGUsCi0JCQkJICAgICAgaW50IGRzcHN0X2lkLCBpbnQgc3RyZWFtX3R5cGUsCi0JCQkJICAgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19ldnQgZXZlbnRfaW5mbyk7Ci0KLXZvaWQgbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oaW50IGZlZGFpX2lkLCBpbnQgc3RyZWFtX3R5cGUpOwotCi1pbnQgbXNtX3JvdXRpbmdfY2hlY2tfYmFja2VuZF9lbmFibGVkKGludCBmZWRhaV9pZCk7Ci0KLQotdm9pZCBtc21fcGNtX3JvdXRpbmdfZ2V0X2JlZGFpX2luZm8oaW50IGJlX2lkeCwKLQkJCQkgICAgc3RydWN0IG1zbV9wY21fcm91dGluZ19iZGFpX2RhdGEgKmJlZGFpKTsKLXZvaWQgbXNtX3BjbV9yb3V0aW5nX2dldF9mZWRhaV9pbmZvKGludCBmZV9pZHgsIGludCBzZXNzX3R5cGUsCi0JCQkJICAgIHN0cnVjdCBtc21fcGNtX3JvdXRpbmdfZmRhaV9kYXRhICpmZV9kYWkpOwotdm9pZCBtc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKHZvaWQpOwotdm9pZCBtc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKHZvaWQpOwotCi1pbnQgbXNtX3BjbV9yb3V0aW5nX3JlZ19zdHJlYW1fYXBwX3R5cGVfY2ZnKAotCWludCBmZWRhaV9pZCwgaW50IHNlc3Npb25fdHlwZSwgaW50IGJlX2lkLAotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgKmNmZ19kYXRhKTsKLWludCBtc21fcGNtX3JvdXRpbmdfZ2V0X3N0cmVhbV9hcHBfdHlwZV9jZmcoCi0JaW50IGZlZGFpX2lkLCBpbnQgc2Vzc2lvbl90eXBlLCBpbnQgKmJlX2lkLAotCXN0cnVjdCBtc21fcGNtX3N0cmVhbV9hcHBfdHlwZV9jZmcgKmNmZ19kYXRhKTsKLSNlbmRpZiAvKl9NU01fUENNX0gqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pY2UtdjIuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXZvaWNlLXYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDgwNmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pY2UtdjIuYworKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJtc20tcGNtLXZvaWNlLXYyLmgiCi0jaW5jbHVkZSAicTZ2b2ljZS5oIgotCi1zdGF0aWMgc3RydWN0IG1zbV92b2ljZSB2b2ljZV9pbmZvW1ZPSUNFX1NFU1NJT05fSU5ERVhfTUFYXTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG1zbV9wY21faGFyZHdhcmUgPSB7Ci0KLQkuaW5mbyA9ICAgICAgICAgICAgICAgICAoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUpLAotCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCS5yYXRlcyA9ICAgICAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFXzgwMDAgfCBTTkRSVl9QQ01fUkFURV8xNjAwMCwKLQkucmF0ZV9taW4gPSAgICAgICAgICAgICA4MDAwLAotCS5yYXRlX21heCA9ICAgICAgICAgICAgIDE2MDAwLAotCS5jaGFubmVsc19taW4gPSAgICAgICAgIDEsCi0JLmNoYW5uZWxzX21heCA9ICAgICAgICAgMSwKLQotCS5idWZmZXJfYnl0ZXNfbWF4ID0gICAgIDQwOTYgKiAyLAotCS5wZXJpb2RfYnl0ZXNfbWluID0gICAgIDIwNDgsCi0JLnBlcmlvZF9ieXRlc19tYXggPSAgICAgNDA5NiwKLQkucGVyaW9kc19taW4gPSAgICAgICAgICAyLAotCS5wZXJpb2RzX21heCA9ICAgICAgICAgIDQsCi0KLQkuZmlmb19zaXplID0gICAgICAgICAgICAwLAotfTsKLXN0YXRpYyBib29sIGlzX3ZvbHRlKHN0cnVjdCBtc21fdm9pY2UgKnB2b2x0ZSkKLXsKLQlpZiAocHZvbHRlID09ICZ2b2ljZV9pbmZvW1ZPTFRFX1NFU1NJT05fSU5ERVhdKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaXNfdm9pY2UyKHN0cnVjdCBtc21fdm9pY2UgKnB2b2ljZTIpCi17Ci0JaWYgKHB2b2ljZTIgPT0gJnZvaWNlX2luZm9bVk9JQ0UyX1NFU1NJT05fSU5ERVhdKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaXNfcWNoYXQoc3RydWN0IG1zbV92b2ljZSAqcHFjaGF0KQotewotCWlmIChwcWNoYXQgPT0gJnZvaWNlX2luZm9bUUNIQVRfU0VTU0lPTl9JTkRFWF0pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBpc192b3dsYW4oc3RydWN0IG1zbV92b2ljZSAqcHZvd2xhbikKLXsKLQlpZiAocHZvd2xhbiA9PSAmdm9pY2VfaW5mb1tWT1dMQU5fU0VTU0lPTl9JTkRFWF0pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMShzdHJ1Y3QgbXNtX3ZvaWNlICpwdm9pY2VtbW9kZTEpCi17Ci0JaWYgKHB2b2ljZW1tb2RlMSA9PSAmdm9pY2VfaW5mb1tWT0lDRU1NT0RFMV9JTkRFWF0pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMihzdHJ1Y3QgbXNtX3ZvaWNlICpwdm9pY2VtbW9kZTIpCi17Ci0JaWYgKHB2b2ljZW1tb2RlMiA9PSAmdm9pY2VfaW5mb1tWT0lDRU1NT0RFMl9JTkRFWF0pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdWludDMyX3QgZ2V0X3Nlc3Npb25faWQoc3RydWN0IG1zbV92b2ljZSAqcHZvYykKLXsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gMDsKLQotCWlmIChpc192b2x0ZShwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0xURV9TRVNTSU9OX05BTUUpOwotCWVsc2UgaWYgKGlzX3ZvaWNlMihwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRTJfU0VTU0lPTl9OQU1FKTsKLQllbHNlIGlmIChpc19xY2hhdChwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChRQ0hBVF9TRVNTSU9OX05BTUUpOwotCWVsc2UgaWYgKGlzX3Zvd2xhbihwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT1dMQU5fU0VTU0lPTl9OQU1FKTsKLQllbHNlIGlmIChpc192b2ljZW1tb2RlMShwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMV9OQU1FKTsKLQllbHNlIGlmIChpc192b2ljZW1tb2RlMihwdm9jKSkKLQkJc2Vzc2lvbl9pZCA9IHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMl9OQU1FKTsKLQllbHNlCi0JCXNlc3Npb25faWQgPSB2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VfU0VTU0lPTl9OQU1FKTsKLQotCXJldHVybiBzZXNzaW9uX2lkOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKCFwcnRkLT5wbGF5YmFja19zdGFydCkKLQkJcHJ0ZC0+cGxheWJhY2tfc3RhcnQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIXBydGQtPmNhcHR1cmVfc3RhcnQpCi0JCXBydGQtPmNhcHR1cmVfc3RhcnQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IG1zbV9wY21fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fdm9pY2UgKnZvaWNlOwotCi0JaWYgKCFzdHJuY21wKCJWb0xURSIsIHN1YnN0cmVhbS0+cGNtLT5pZCwgNSkpIHsKLQkJdm9pY2UgPSAmdm9pY2VfaW5mb1tWT0xURV9TRVNTSU9OX0lOREVYXTsKLQkJcHJfZGVidWcoIiVzOiBPcGVuIFZvTFRFIFN1YnN0cmVhbSBJZD0lc1xuIiwKLQkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCJWb2ljZTIiLCBzdWJzdHJlYW0tPnBjbS0+aWQsIDYpKSB7Ci0JCXZvaWNlID0gJnZvaWNlX2luZm9bVk9JQ0UyX1NFU1NJT05fSU5ERVhdOwotCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9pY2UyIFN1YnN0cmVhbSBJZD0lc1xuIiwKLQkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCJRQ0hBVCIsIHN1YnN0cmVhbS0+cGNtLT5pZCwgNSkpIHsKLQkJdm9pY2UgPSAmdm9pY2VfaW5mb1tRQ0hBVF9TRVNTSU9OX0lOREVYXTsKLQkJcHJfZGVidWcoIiVzOiBPcGVuIFFDSEFUIFN1YnN0cmVhbSBJZD0lc1xuIiwKLQkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCJWb1dMQU4iLCBzdWJzdHJlYW0tPnBjbS0+aWQsIDYpKSB7Ci0JCXZvaWNlID0gJnZvaWNlX2luZm9bVk9XTEFOX1NFU1NJT05fSU5ERVhdOwotCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9XTEFOIFN1YnN0cmVhbSBJZD0lc1xuIiwKLQkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKCJWb2ljZU1Nb2RlMSIsIHN1YnN0cmVhbS0+cGNtLT5pZCwgMTEpKSB7Ci0JCXZvaWNlID0gJnZvaWNlX2luZm9bVk9JQ0VNTU9ERTFfSU5ERVhdOwotCQlwcl9kZWJ1ZygiJXM6IE9wZW4gVm9pY2VNTW9kZTEgU3Vic3RyZWFtIElkPSVzXG4iLAotCQkJIF9fZnVuY19fLCBzdWJzdHJlYW0tPnBjbS0+aWQpOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoIlZvaWNlTU1vZGUyIiwgc3Vic3RyZWFtLT5wY20tPmlkLCAxMSkpIHsKLQkJdm9pY2UgPSAmdm9pY2VfaW5mb1tWT0lDRU1NT0RFMl9JTkRFWF07Ci0JCXByX2RlYnVnKCIlczogT3BlbiBWb2ljZU1Nb2RlMiBTdWJzdHJlYW0gSWQ9JXNcbiIsCi0JCQkgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCk7Ci0JfSBlbHNlIHsKLQkJdm9pY2UgPSAmdm9pY2VfaW5mb1tWT0lDRV9TRVNTSU9OX0lOREVYXTsKLQkJcHJfZGVidWcoIiVzOiBPcGVuIFZPSUNFIFN1YnN0cmVhbSBJZD0lc1xuIiwKLQkJCSBfX2Z1bmNfXywgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQl9Ci0JbXV0ZXhfbG9jaygmdm9pY2UtPmxvY2spOwotCi0JcnVudGltZS0+aHcgPSBtc21fcGNtX2hhcmR3YXJlOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXZvaWNlLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JZWxzZSBpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQl2b2ljZS0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0KLQl2b2ljZS0+aW5zdGFuY2UrKzsKLQlwcl9kZWJ1ZygiJXM6IEluc3RhbmNlID0gJWQsIFN0cmVhbSBJRCA9ICVzXG4iLAotCQkJX19mdW5jX18sIHZvaWNlLT5pbnN0YW5jZSwgc3Vic3RyZWFtLT5wY20tPmlkKTsKLQlydW50aW1lLT5wcml2YXRlX2RhdGEgPSB2b2ljZTsKLQotCW11dGV4X3VubG9jaygmdm9pY2UtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IG1zbV9wY21fcGxheWJhY2tfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAocHJ0ZC0+cGxheWJhY2tfc3RhcnQpCi0JCXBydGQtPnBsYXliYWNrX3N0YXJ0ID0gMDsKLQotCXBydGQtPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHBydGQtPmNhcHR1cmVfc3RhcnQpCi0JCXBydGQtPmNhcHR1cmVfc3RhcnQgPSAwOwotCXBydGQtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBtc21fcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCi0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3ZvaWNlICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVpbnQzMl90IHNlc3Npb25faWQgPSAwOwotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmcHJ0ZC0+bG9jayk7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9wY21fcGxheWJhY2tfY2xvc2Uoc3Vic3RyZWFtKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9wY21fY2FwdHVyZV9jbG9zZShzdWJzdHJlYW0pOwotCi0JcHJ0ZC0+aW5zdGFuY2UtLTsKLQlpZiAoIXBydGQtPnBsYXliYWNrX3N0YXJ0ICYmICFwcnRkLT5jYXB0dXJlX3N0YXJ0KSB7Ci0JCXByX2RlYnVnKCJlbmQgdm9pY2UgY2FsbFxuIik7Ci0KLQkJc2Vzc2lvbl9pZCA9IGdldF9zZXNzaW9uX2lkKHBydGQpOwotCQlpZiAoc2Vzc2lvbl9pZCkKLQkJCXZvY19lbmRfdm9pY2VfY2FsbChzZXNzaW9uX2lkKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci1zdGF0aWMgaW50IG1zbV9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fdm9pY2UgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IDA7Ci0KLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX3ByZXBhcmUoc3Vic3RyZWFtKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN1YnN0cmVhbSk7Ci0KLQlpZiAocHJ0ZC0+cGxheWJhY2tfc3RhcnQgJiYgcHJ0ZC0+Y2FwdHVyZV9zdGFydCkgewotCQlzZXNzaW9uX2lkID0gZ2V0X3Nlc3Npb25faWQocHJ0ZCk7Ci0JCWlmIChzZXNzaW9uX2lkKQotCQkJdm9jX3N0YXJ0X3ZvaWNlX2NhbGwoc2Vzc2lvbl9pZCk7Ci0JfQotCW11dGV4X3VubG9jaygmcHJ0ZC0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCi0JcHJfZGVidWcoIiVzOiBWb2ljZVxuIiwgX19mdW5jX18pOwotCi0Jc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBtc21fdm9pY2UgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKLQotCXNlc3Npb25faWQgPSBnZXRfc2Vzc2lvbl9pZChwcnRkKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCXByX2RlYnVnKCJTdGFydCAmIFN0b3AgVm9pY2UgY2FsbCBub3QgaGFuZGxlZCBpbiBUcmlnZ2VyLlxuIik7Ci0JYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlwcl9kZWJ1ZygiJXM6IHJlc3VtZSBjYWxsIHNlc3Npb25faWQgPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgc2Vzc2lvbl9pZCk7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJcmV0ID0gbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN1YnN0cmVhbSk7Ci0JCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJCXJldCA9IG1zbV9wY21fY2FwdHVyZV9wcmVwYXJlKHN1YnN0cmVhbSk7Ci0JCWlmIChwcnRkLT5wbGF5YmFja19zdGFydCAmJiBwcnRkLT5jYXB0dXJlX3N0YXJ0KSB7Ci0JCQlpZiAoc2Vzc2lvbl9pZCkKLQkJCQl2b2NfcmVzdW1lX3ZvaWNlX2NhbGwoc2Vzc2lvbl9pZCk7Ci0JCX0KLQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlwcl9kZWJ1ZygiJXM6IHBhdXNlIGNhbGwgc2Vzc2lvbl9pZD0lZFxuIiwKLQkJCSBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCQlpZiAocHJ0ZC0+cGxheWJhY2tfc3RhcnQpCi0JCQkJcHJ0ZC0+cGxheWJhY2tfc3RhcnQgPSAwOwotCQl9IGVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgewotCQkJaWYgKHBydGQtPmNhcHR1cmVfc3RhcnQpCi0JCQkJcHJ0ZC0+Y2FwdHVyZV9zdGFydCA9IDA7Ci0JCX0KLQkJaWYgKHNlc3Npb25faWQpCi0JCQl2b2Nfc3RhbmRieV92b2ljZV9jYWxsKHNlc3Npb25faWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21faW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV92b2ljZSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gZ2V0X3Nlc3Npb25faWQocHJ0ZCk7Ci0JZW51bSB2b2ljZV9sY2hfbW9kZSBsY2hfbW9kZTsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9WT0lDRV9JT0NUTF9MQ0g6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbGNoX21vZGUsICh2b2lkICopYXJnLAotCQkJCSAgIHNpemVvZihlbnVtIHZvaWNlX2xjaF9tb2RlKSkpIHsKLQkJCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZCwgc2l6ZSAlemRcbiIsCi0JCQkJX19mdW5jX18sIHNpemVvZihlbnVtIHZvaWNlX2xjaF9tb2RlKSk7Ci0KLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczogJXMgbGNoX21vZGU6JWRcbiIsCi0JCQkgX19mdW5jX18sIHN1YnN0cmVhbS0+cGNtLT5pZCwgbGNoX21vZGUpOwotCi0JCXN3aXRjaCAobGNoX21vZGUpIHsKLQkJY2FzZSBWT0lDRV9MQ0hfU1RBUlQ6Ci0JCWNhc2UgVk9JQ0VfTENIX1NUT1A6Ci0JCQlyZXQgPSB2b2Nfc2V0X2xjaChzZXNzaW9uX2lkLCBsY2hfbW9kZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogSW52YWxpZCBMQ0ggTU9ERSAlZFxuIiwgX19mdW5jX18sIGxjaF9tb2RlKTsKLQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJfQotCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogRmFsbGluZyBpbnRvIGRlZmF1bHQgc25kX2xpYl9pb2N0bCBjbWQgMHgleFxuIiwKLQkJCSBfX2Z1bmNfXywgY21kKTsKLQotCQlyZXQgPSBzbmRfcGNtX2xpYl9pb2N0bChzdWJzdHJlYW0sIGNtZCwgYXJnKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFyZXQpCi0JCXByX2RlYnVnKCIlczogcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQllbHNlCi0JCXByX2VycigiJXM6IGNtZCAweCV4IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIGNtZCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX3NpZGV0b25lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldDsKLQlsb25nIHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JYm9vbCBzaWRldG9uZV9lbmFibGUgPSB2YWx1ZTsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gQUxMX1NFU1NJT05fVlNJRDsKLQotCWlmICh2YWx1ZSA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcmd1bWVudHMgc2lkZXRvbmUgZW5hYmxlICVsZFxuIiwKLQkJCSBfX2Z1bmNfXywgdmFsdWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSB2b2Nfc2V0X2FmZV9zaWRldG9uZShzZXNzaW9uX2lkLCBzaWRldG9uZV9lbmFibGUpOwotCXByX2RlYnVnKCIlczogQUZFIFNpZGV0b25lIGVuYWJsZT0lZCBzZXNzaW9uX2lkPTB4JXggcmV0PSVkXG4iLAotCQkgX19mdW5jX18sIHNpZGV0b25lX2VuYWJsZSwgc2Vzc2lvbl9pZCwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV9zaWRldG9uZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdm9jX2dldF9hZmVfc2lkZXRvbmUoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdm9pY2VfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdm9sdW1lID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWludCByYW1wX2R1cmF0aW9uID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0KLQlpZiAoKHZvbHVtZSA8IDApIHx8IChyYW1wX2R1cmF0aW9uIDwgMCkKLQkJfHwgKHJhbXBfZHVyYXRpb24gPiBNQVhfUkFNUF9EVVJBVElPTikpIHsKLQkJcHJfZXJyKCIgJXMgSW52YWxpZCBhcmd1bWVudHMiLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogdm9sdW1lOiAlZCBzZXNzaW9uX2lkOiAlI3ggcmFtcF9kdXJhdGlvbjogJWRcbiIsIF9fZnVuY19fLAotCQl2b2x1bWUsIHNlc3Npb25faWQsIHJhbXBfZHVyYXRpb24pOwotCi0Jdm9jX3NldF9yeF92b2xfc3RlcChzZXNzaW9uX2lkLCBSWF9QQVRILCB2b2x1bWUsIHJhbXBfZHVyYXRpb24pOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX211dGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IG11dGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0JaW50IHJhbXBfZHVyYXRpb24gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsyXTsKLQotCWlmICgobXV0ZSA8IDApIHx8IChtdXRlID4gMSkgfHwgKHJhbXBfZHVyYXRpb24gPCAwKQotCQl8fCAocmFtcF9kdXJhdGlvbiA+IE1BWF9SQU1QX0RVUkFUSU9OKSkgewotCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50cyIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBtdXRlPSVkIHNlc3Npb25faWQ9JSN4IHJhbXBfZHVyYXRpb249JWRcbiIsIF9fZnVuY19fLAotCQltdXRlLCBzZXNzaW9uX2lkLCByYW1wX2R1cmF0aW9uKTsKLQotCXJldCA9IHZvY19zZXRfdHhfbXV0ZShzZXNzaW9uX2lkLCBUWF9QQVRILCBtdXRlLCByYW1wX2R1cmF0aW9uKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV90eF9kZXZpY2VfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCWludCBtdXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWludCByYW1wX2R1cmF0aW9uID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0KLQlpZiAoKG11dGUgPCAwKSB8fCAobXV0ZSA+IDEpIHx8IChyYW1wX2R1cmF0aW9uIDwgMCkgfHwKLQkgICAgKHJhbXBfZHVyYXRpb24gPiBNQVhfUkFNUF9EVVJBVElPTikpIHsKLQkJcHJfZXJyKCIgJXMgSW52YWxpZCBhcmd1bWVudHMiLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogbXV0ZT0lZCBzZXNzaW9uX2lkPSUjeCByYW1wX2R1cmF0aW9uPSVkXG4iLCBfX2Z1bmNfXywKLQkJIG11dGUsIHNlc3Npb25faWQsIHJhbXBfZHVyYXRpb24pOwotCi0JcmV0ID0gdm9jX3NldF9kZXZpY2VfbXV0ZShzZXNzaW9uX2lkLCBWU1NfSVZPTFVNRV9ESVJFQ1RJT05fVFgsCi0JCQkJICBtdXRlLCByYW1wX2R1cmF0aW9uKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV9yeF9kZXZpY2VfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCWludCBtdXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWludCByYW1wX2R1cmF0aW9uID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0KLQlpZiAoKG11dGUgPCAwKSB8fCAobXV0ZSA+IDEpIHx8IChyYW1wX2R1cmF0aW9uIDwgMCkgfHwKLQkgICAgKHJhbXBfZHVyYXRpb24gPiBNQVhfUkFNUF9EVVJBVElPTikpIHsKLQkJcHJfZXJyKCIgJXMgSW52YWxpZCBhcmd1bWVudHMiLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogbXV0ZT0lZCBzZXNzaW9uX2lkPSUjeCByYW1wX2R1cmF0aW9uPSVkXG4iLCBfX2Z1bmNfXywKLQkJIG11dGUsIHNlc3Npb25faWQsIHJhbXBfZHVyYXRpb24pOwotCi0Jdm9jX3NldF9kZXZpY2VfbXV0ZShzZXNzaW9uX2lkLCBWU1NfSVZPTFVNRV9ESVJFQ1RJT05fUlgsCi0JCQkgICAgbXV0ZSwgcmFtcF9kdXJhdGlvbik7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHR5X21vZGVbXSA9IHsiT0ZGIiwgIkhDTyIsICJWQ08iLCAiRlVMTCJ9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtc21fdHR5X21vZGVfZW51bVtdID0gewotCQlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIHR0eV9tb2RlKSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX3R0eV9tb2RlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9Ci0JCXZvY19nZXRfdHR5X21vZGUodm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFX1NFU1NJT05fTkFNRSkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV90dHlfbW9kZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHR0eV9tb2RlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlwcl9kZWJ1ZygiJXM6IHR0eV9tb2RlPSVkXG4iLCBfX2Z1bmNfXywgdHR5X21vZGUpOwotCi0Jdm9jX3NldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VfU0VTU0lPTl9OQU1FKSwgdHR5X21vZGUpOwotCXZvY19zZXRfdHR5X21vZGUodm9jX2dldF9zZXNzaW9uX2lkKFZPSUNFMl9TRVNTSU9OX05BTUUpLCB0dHlfbW9kZSk7Ci0Jdm9jX3NldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9MVEVfU0VTU0lPTl9OQU1FKSwgdHR5X21vZGUpOwotCXZvY19zZXRfdHR5X21vZGUodm9jX2dldF9zZXNzaW9uX2lkKFZPV0xBTl9TRVNTSU9OX05BTUUpLCB0dHlfbW9kZSk7Ci0Jdm9jX3NldF90dHlfbW9kZSh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JQ0VNTU9ERTFfTkFNRSksIHR0eV9tb2RlKTsKLQl2b2Nfc2V0X3R0eV9tb2RlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lDRU1NT0RFMl9OQU1FKSwgdHR5X21vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX3Nsb3d0YWxrX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBzdF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0KLQlwcl9kZWJ1ZygiJXM6IHN0IGVuYWJsZT0lZCBzZXNzaW9uX2lkPSUjeFxuIiwgX19mdW5jX18sIHN0X2VuYWJsZSwKLQkJIHNlc3Npb25faWQpOwotCi0Jdm9jX3NldF9wcF9lbmFibGUoc2Vzc2lvbl9pZCwKLQkJCSAgTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCwgc3RfZW5hYmxlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV9oZF92b2ljZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1aW50MzJfdCBoZF9lbmFibGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQl1aW50MzJfdCBzZXNzaW9uX2lkID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0KLQlwcl9kZWJ1ZygiJXM6IEhEIFZvaWNlIGVuYWJsZT0lZCBzZXNzaW9uX2lkPSUjeFxuIiwgX19mdW5jX18sIGhkX2VuYWJsZSwKLQkJIHNlc3Npb25faWQpOwotCi0JcmV0ID0gdm9jX3NldF9oZF9lbmFibGUoc2Vzc2lvbl9pZCwgaGRfZW5hYmxlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaWNlX3RvcG9sb2d5X2Rpc2FibGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCWludCBkaXNhYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JdWludDMyX3Qgc2Vzc2lvbl9pZCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCi0JaWYgKChkaXNhYmxlIDwgMCkgfHwgKGRpc2FibGUgPiAxKSkgewotCQlwcl9lcnIoIiAlcyBJbnZhbGlkIGFyZ3VtZW50czogJWRcbiIsIF9fZnVuY19fLCBkaXNhYmxlKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCXByX2RlYnVnKCIlczogZGlzYWJsZSA9ICVkLCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLCBkaXNhYmxlLAotCQkgc2Vzc2lvbl9pZCk7Ci0KLQlyZXQgPSB2b2NfZGlzYWJsZV90b3BvbG9neShzZXNzaW9uX2lkLCBkaXNhYmxlKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV92b2ljZV9jdmRfdmVyc2lvbl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JdWluZm8tPmNvdW50ID0gQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fdm9pY2VfY3ZkX3ZlcnNpb25fZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JY2hhciBjdmRfdmVyc2lvbltDVkRfVkVSU0lPTl9TVFJJTkdfTUFYX1NJWkVdID0gQ1ZEX1ZFUlNJT05fREVGQVVMVDsKLQlpbnQgcmV0OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JcmV0ID0gdm9jX2dldF9jdmRfdmVyc2lvbihjdmRfdmVyc2lvbik7Ci0KLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBFcnJvciByZXRyaWV2aW5nIENWRCB2ZXJzaW9uLCBlcnJvcjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JbWVtY3B5KHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLCBjdmRfdmVyc2lvbiwgc2l6ZW9mKGN2ZF92ZXJzaW9uKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fdm9pY2VfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVm9pY2UgUnggRGV2aWNlIE11dGUiLCBTTkRfU09DX05PUE0sIDAsIFZTSURfTUFYLAotCQkJCTAsIDMsIE5VTEwsIG1zbV92b2ljZV9yeF9kZXZpY2VfbXV0ZV9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2ljZSBUeCBEZXZpY2UgTXV0ZSIsIFNORF9TT0NfTk9QTSwgMCwgVlNJRF9NQVgsCi0JCQkJMCwgMywgTlVMTCwgbXNtX3ZvaWNlX3R4X2RldmljZV9tdXRlX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvaWNlIFR4IE11dGUiLCBTTkRfU09DX05PUE0sIDAsIFZTSURfTUFYLAotCQkJCTAsIDMsIE5VTEwsIG1zbV92b2ljZV9tdXRlX3B1dCksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvaWNlIFJ4IEdhaW4iLCBTTkRfU09DX05PUE0sIDAsIFZTSURfTUFYLCAwLCAzLAotCQkJCU5VTEwsIG1zbV92b2ljZV9nYWluX3B1dCksCi0JU09DX0VOVU1fRVhUKCJUVFkgTW9kZSIsIG1zbV90dHlfbW9kZV9lbnVtWzBdLCBtc21fdm9pY2VfdHR5X21vZGVfZ2V0LAotCQkJCW1zbV92b2ljZV90dHlfbW9kZV9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJTbG93dGFsayBFbmFibGUiLCBTTkRfU09DX05PUE0sIDAsIFZTSURfTUFYLCAwLCAyLAotCQkJCU5VTEwsIG1zbV92b2ljZV9zbG93dGFsa19wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2ljZSBUb3BvbG9neSBEaXNhYmxlIiwgU05EX1NPQ19OT1BNLCAwLAotCQkJICAgICBWU0lEX01BWCwgMCwgMiwgTlVMTCwKLQkJCSAgICAgbXNtX3ZvaWNlX3RvcG9sb2d5X2Rpc2FibGVfcHV0KSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiSEQgVm9pY2UgRW5hYmxlIiwgU05EX1NPQ19OT1BNLCAwLCBWU0lEX01BWCwgMCwgMiwKLQkJCSAgICAgTlVMTCwgbXNtX3ZvaWNlX2hkX3ZvaWNlX3B1dCksCi0JewotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCi0JCS5pZmFjZQk9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZQk9ICJDVkQgVmVyc2lvbiIsCi0JCS5pbmZvCT0gbXNtX3ZvaWNlX2N2ZF92ZXJzaW9uX2luZm8sCi0JCS5nZXQJPSBtc21fdm9pY2VfY3ZkX3ZlcnNpb25fZ2V0LAotCX0sCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIlZvaWNlIFNpZGV0b25lIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwgMSwKLQkJCSAgICAgbXNtX3ZvaWNlX3NpZGV0b25lX2dldCwgbXNtX3ZvaWNlX3NpZGV0b25lX3B1dCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG1zbV9wY21fb3BzID0gewotCS5vcGVuCQkJPSBtc21fcGNtX29wZW4sCi0JLmh3X3BhcmFtcwkJPSBtc21fcGNtX2h3X3BhcmFtcywKLQkuY2xvc2UJCQk9IG1zbV9wY21fY2xvc2UsCi0JLnByZXBhcmUJCT0gbXNtX3BjbV9wcmVwYXJlLAotCS50cmlnZ2VyCQk9IG1zbV9wY21fdHJpZ2dlciwKLQkuaW9jdGwJCQk9IG1zbV9wY21faW9jdGwsCi0JLmNvbXBhdF9pb2N0bAkJPSBtc21fcGNtX2lvY3RsLAotfTsKLQotCi1zdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFjYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrKQotCQljYXJkLT5kZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fdm9pY2VfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fdm9pY2VfY29udHJvbHMsCi0JCQkJCUFSUkFZX1NJWkUobXNtX3ZvaWNlX2NvbnRyb2xzKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0gewotCS5vcHMJCT0gJm1zbV9wY21fb3BzLAotCS5wY21fbmV3CT0gbXNtX2Fzb2NfcGNtX25ldywKLQkucHJvYmUJCT0gbXNtX3BjbV92b2ljZV9wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByYzsKLQlib29sIGRlc3Ryb3lfY3ZkID0gZmFsc2U7Ci0JY29uc3QgY2hhciAqaXNfZGVzdHJveV9jdmQgPSAicWNvbSxkZXN0cm95LWN2ZCI7Ci0KLQlpZiAoIWlzX3ZvY19pbml0aWFsaXplZCgpKSB7Ci0JCXByX2RlYnVnKCIlczogdm9pY2UgbW9kdWxlIG5vdCBpbml0aWFsaXplZCB5ZXQsIGRlZmVycmluZyBwcm9iZSgpXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCi0JCXJjID0gLUVQUk9CRV9ERUZFUjsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gdm9jX2FsbG9jX2NhbF9zaGFyZWRfbWVtb3J5KCk7Ci0JaWYgKHJjID09IC1FUFJPQkVfREVGRVIpIHsKLQkJcHJfZGVidWcoIiVzOiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY2FsaWJyYXRpb24gZGVmZXJyZWQgJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQotCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGNhbGlicmF0aW9uIGZhaWxlZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBkZXYgbmFtZSAlc1xuIiwKLQkJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0JZGVzdHJveV9jdmQgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQlpc19kZXN0cm95X2N2ZCk7Ci0Jdm9jX3NldF9kZXN0cm95X2N2ZF9mbGFnKGRlc3Ryb3lfY3ZkKTsKLQotCXJjID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCSAgICAgICAmbXNtX3NvY19wbGF0Zm9ybSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fdm9pY2VfZHRfbWF0Y2hbXSA9IHsKLQl7LmNvbXBhdGlibGUgPSAicWNvbSxtc20tcGNtLXZvaWNlIn0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtc21fdm9pY2VfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV92b2ljZV9kdF9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9wY21fcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9wY21fcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX3NvY19wbGF0Zm9ybV9pbml0KHZvaWQpCi17Ci0JaW50IGkgPSAwOwotCi0JbWVtc2V0KCZ2b2ljZV9pbmZvLCAwLCBzaXplb2Yodm9pY2VfaW5mbykpOwotCi0JZm9yIChpID0gMDsgaSA8IFZPSUNFX1NFU1NJT05fSU5ERVhfTUFYOyBpKyspCi0JCW11dGV4X2luaXQoJnZvaWNlX2luZm9baV0ubG9jayk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVm9pY2UgUENNIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXZvaWNlLXYyLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS12b2ljZS12Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBjZWJjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcGNtLXZvaWNlLXYyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfTVNNX1BDTV9WT0lDRV9ICi0jZGVmaW5lIF9NU01fUENNX1ZPSUNFX0gKLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLQotZW51bSB7Ci0JVk9JQ0VfU0VTU0lPTl9JTkRFWCwKLQlWT0xURV9TRVNTSU9OX0lOREVYLAotCVZPSUNFMl9TRVNTSU9OX0lOREVYLAotCVFDSEFUX1NFU1NJT05fSU5ERVgsCi0JVk9XTEFOX1NFU1NJT05fSU5ERVgsCi0JVk9JQ0VNTU9ERTFfSU5ERVgsCi0JVk9JQ0VNTU9ERTJfSU5ERVgsCi0JVk9JQ0VfU0VTU0lPTl9JTkRFWF9NQVgsCi19OwotCi1zdHJ1Y3QgbXNtX3ZvaWNlIHsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBsYXliYWNrX3N1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKmNhcHR1cmVfc3Vic3RyZWFtOwotCi0JaW50IGluc3RhbmNlOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQl1aW50MzJfdCBzYW1wX3JhdGU7Ci0JdWludDMyX3QgY2hhbm5lbF9tb2RlOwotCi0JaW50IHBsYXliYWNrX3N0YXJ0OwotCWludCBjYXB0dXJlX3N0YXJ0OwotfTsKLQotI2VuZGlmIC8qX01TTV9QQ01fVk9JQ0VfSCovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS12b2lwLXYyLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXBjbS12b2lwLXYyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjI1ZjAuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1wY20tdm9pcC12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0KLSNpbmNsdWRlICJtc20tcGNtLXE2LXYyLmgiCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSAicTZ2b2ljZS5oIgotCi0jZGVmaW5lIFNIQVJFRF9NRU1fQlVGIDIKLSNkZWZpbmUgVk9JUF9NQVhfUV9MRU4gMTAKLSNkZWZpbmUgVk9JUF9NQVhfVk9DX1BLVF9TSVpFIDQwOTYKLSNkZWZpbmUgVk9JUF9NSU5fVk9DX1BLVF9TSVpFIDMyMAotCi0vKiBMZW5ndGggb2YgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlciBhZGRlZCB0byB0aGUgdm9jIHBhY2tldC4gKi8KLSNkZWZpbmUgRFNQX0ZSQU1FX0hEUl9MRU4gMQotCi0jZGVmaW5lIE1PREVfSVMxMjcJCTB4MgotI2RlZmluZSBNT0RFXzRHVl9OQgkJMHgzCi0jZGVmaW5lIE1PREVfNEdWX1dCCQkweDQKLSNkZWZpbmUgTU9ERV9BTVIJCTB4NQotI2RlZmluZSBNT0RFX0FNUl9XQgkJMHhECi0jZGVmaW5lIE1PREVfUENNCQkweEMKLSNkZWZpbmUgTU9ERV80R1ZfTlcJCTB4RQotI2RlZmluZSBNT0RFX0c3MTEJCTB4QQotI2RlZmluZSBNT0RFX0c3MTFBCQkweEYKLQotZW51bSBtc21fYXVkaW9fZzcxMWFfZnJhbWVfdHlwZSB7Ci0JTVZTX0c3MTFBX1NQRUVDSF9HT09ELAotCU1WU19HNzExQV9TSUQsCi0JTVZTX0c3MTFBX05PX0RBVEEsCi0JTVZTX0c3MTFBX0VSQVNVUkUKLX07Ci0KLWVudW0gbXNtX2F1ZGlvX2c3MTFhX21vZGUgewotCU1WU19HNzExQV9NT0RFX01VTEFXLAotCU1WU19HNzExQV9NT0RFX0FMQVcKLX07Ci0KLWVudW0gbXNtX2F1ZGlvX2c3MTFfbW9kZSB7Ci0JTVZTX0c3MTFfTU9ERV9NVUxBVywKLQlNVlNfRzcxMV9NT0RFX0FMQVcKLX07Ci0KLSNkZWZpbmUgVk9JUF9NT0RFX01BWAkJTU9ERV9HNzExQQotI2RlZmluZSBWT0lQX1JBVEVfTUFYCQkyMzg1MAotCi1lbnVtIGZvcm1hdCB7Ci0JRk9STUFUX1MxNl9MRSA9IDIsCi0JRk9STUFUX1NQRUNJQUwgPSAzMSwKLX07Ci0KLQotZW51bSBhbXJfcmF0ZV90eXBlIHsKLQlBTVJfUkFURV80NzUwLCAvKiBBTVIgNC43NSBrYnBzICovCi0JQU1SX1JBVEVfNTE1MCwgLyogQU1SIDUuMTUga2JwcyAqLwotCUFNUl9SQVRFXzU5MDAsIC8qIEFNUiA1LjkwIGticHMgKi8KLQlBTVJfUkFURV82NzAwLCAvKiBBTVIgNi43MCBrYnBzICovCi0JQU1SX1JBVEVfNzQwMCwgLyogQU1SIDcuNDAga2JwcyAqLwotCUFNUl9SQVRFXzc5NTAsIC8qIEFNUiA3Ljk1IGticHMgKi8KLQlBTVJfUkFURV8xMDIwMCwgLyogQU1SIDEwLjIwIGticHMgKi8KLQlBTVJfUkFURV8xMjIwMCwgLyogQU1SIDEyLjIwIGticHMgKi8KLQlBTVJfUkFURV82NjAwLCAvKiBBTVItV0IgNi42MCBrYnBzICovCi0JQU1SX1JBVEVfODg1MCwgLyogQU1SLVdCIDguODUga2JwcyAqLwotCUFNUl9SQVRFXzEyNjUwLCAvKiBBTVItV0IgMTIuNjUga2JwcyAqLwotCUFNUl9SQVRFXzE0MjUwLCAvKiBBTVItV0IgMTQuMjUga2JwcyAqLwotCUFNUl9SQVRFXzE1ODUwLCAvKiBBTVItV0IgMTUuODUga2JwcyAqLwotCUFNUl9SQVRFXzE4MjUwLCAvKiBBTVItV0IgMTguMjUga2JwcyAqLwotCUFNUl9SQVRFXzE5ODUwLCAvKiBBTVItV0IgMTkuODUga2JwcyAqLwotCUFNUl9SQVRFXzIzMDUwLCAvKiBBTVItV0IgMjMuMDUga2JwcyAqLwotCUFNUl9SQVRFXzIzODUwLCAvKiBBTVItV0IgMjMuODUga2JwcyAqLwotCUFNUl9SQVRFX1VOREVGCi19OwotCi1lbnVtIHZvaXBfc3RhdGUgewotCVZPSVBfU1RPUFBFRCwKLQlWT0lQX1NUQVJURUQsCi19OwotCi1zdHJ1Y3Qgdm9pcF9mcmFtZV9oZHIgewotCXVpbnQzMl90IHRpbWVzdGFtcDsKLQl1bmlvbiB7Ci0JCS8qCi0JCSAqIEJpdHMgMC0zOiBGcmFtZSB0eXBlCi0JCSAqIFtvcHRpb25hbF0gQml0cyAxNi0xOTogRnJhbWUgcmF0ZQotCQkgKi8KLQkJdWludDMyX3QgZnJhbWVfdHlwZTsKLQkJdWludDMyX3QgcGFja2V0X3JhdGU7Ci0JfTsKLX07Ci1zdHJ1Y3Qgdm9pcF9mcmFtZSB7Ci0Jc3RydWN0IHZvaXBfZnJhbWVfaGRyIGZybV9oZHI7Ci0JdWludDMyX3QgcGt0bGVuOwotCXVpbnQ4X3Qgdm9jX3BrdFtWT0lQX01BWF9WT0NfUEtUX1NJWkVdOwotfTsKLQotc3RydWN0IHZvaXBfYnVmX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3Qgdm9pcF9mcmFtZSBmcmFtZTsKLX07Ci0KLXN0cnVjdCB2b2lwX2Rydl9pbmZvIHsKLQllbnVtICB2b2lwX3N0YXRlIHN0YXRlOwotCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwbGF5YmFja19zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpjYXB0dXJlX3N1YnN0cmVhbTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgaW5fcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX2luX3F1ZXVlOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBvdXRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBmcmVlX291dF9xdWV1ZTsKLQotCXdhaXRfcXVldWVfaGVhZF90IG91dF93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGluX3dhaXQ7Ci0KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQotCXNwaW5sb2NrX3QgZHNwX2xvY2s7Ci0Jc3BpbmxvY2tfdCBkc3BfdWxfbG9jazsKLQotCWJvb2wgdm9pcF9yZXNldDsKLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IHJhdGVfdHlwZTsKLQl1aW50MzJfdCByYXRlOwotCXVpbnQzMl90IGR0eF9tb2RlOwotCi0JdWludDhfdCBjYXB0dXJlX3N0YXJ0OwotCXVpbnQ4X3QgcGxheWJhY2tfc3RhcnQ7Ci0KLQl1aW50OF90IHBsYXliYWNrX3ByZXBhcmU7Ci0JdWludDhfdCBjYXB0dXJlX3ByZXBhcmU7Ci0KLQl1bnNpZ25lZCBpbnQgcGxheV9zYW1wX3JhdGU7Ci0JdW5zaWduZWQgaW50IGNhcF9zYW1wX3JhdGU7Ci0KLQl1bnNpZ25lZCBpbnQgcGNtX3NpemU7Ci0JdW5zaWduZWQgaW50IHBjbV9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcGNtX3BsYXliYWNrX2lycV9wb3M7ICAgICAgLyogSVJRIHBvc2l0aW9uICovCi0JdW5zaWduZWQgaW50IHBjbV9wbGF5YmFja19idWZfcG9zOyAgICAgIC8qIHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotCi0JdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX3NpemU7Ci0JdW5zaWduZWQgaW50IHBjbV9jYXB0dXJlX2NvdW50OwotCXVuc2lnbmVkIGludCBwY21fY2FwdHVyZV9pcnFfcG9zOyAgICAgICAvKiBJUlEgcG9zaXRpb24gKi8KLQl1bnNpZ25lZCBpbnQgcGNtX2NhcHR1cmVfYnVmX3BvczsgICAgICAgLyogcG9zaXRpb24gaW4gYnVmZmVyICovCi0KLQl1aW50MzJfdCBldnJjX21pbl9yYXRlOwotCXVpbnQzMl90IGV2cmNfbWF4X3JhdGU7Ci19OwotCi1zdGF0aWMgaW50IHZvaXBfZ2V0X21lZGlhX3R5cGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgcmF0ZV90eXBlLAotCQkJCXVuc2lnbmVkIGludCBzYW1wX3JhdGUsCi0JCQkJdW5zaWduZWQgaW50ICptZWRpYV90eXBlKTsKLXN0YXRpYyBpbnQgdm9pcF9nZXRfcmF0ZV90eXBlKHVpbnQzMl90IG1vZGUsCi0JCQkJdWludDMyX3QgcmF0ZSwKLQkJCQl1aW50MzJfdCAqcmF0ZV90eXBlKTsKLXN0YXRpYyBpbnQgdm9pcF9jb25maWdfdm9jb2RlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7Ci1zdGF0aWMgaW50IG1zbV92b2lwX21vZGVfY29uZmlnX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotc3RhdGljIGludCBtc21fdm9pcF9tb2RlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLXN0YXRpYyBpbnQgbXNtX3ZvaXBfcmF0ZV9jb25maWdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1zdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1zdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyB2b2lwX2luZm87Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBtc21fcGNtX2hhcmR3YXJlID0gewotCS5pbmZvID0gICAgICAgICAgICAgICAgIChTTkRSVl9QQ01fSU5GT19NTUFQIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQpLAotCS5mb3JtYXRzID0gICAgICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQlTTkRSVl9QQ01fRk1UQklUX1NQRUNJQUwsCi0JLnJhdGVzID0gICAgICAgICAgICAgICAgU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwKLQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCS5yYXRlX21pbiA9ICAgICAgICAgICAgIDgwMDAsCi0JLnJhdGVfbWF4ID0gICAgICAgICAgICAgNDgwMDAsCi0JLmNoYW5uZWxzX21pbiA9ICAgICAgICAgMSwKLQkuY2hhbm5lbHNfbWF4ID0gICAgICAgICAxLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0Jc2l6ZW9mKHN0cnVjdCB2b2lwX2J1Zl9ub2RlKSAqIFZPSVBfTUFYX1FfTEVOLAotCS5wZXJpb2RfYnl0ZXNfbWluID0JVk9JUF9NSU5fVk9DX1BLVF9TSVpFLAotCS5wZXJpb2RfYnl0ZXNfbWF4ID0JVk9JUF9NQVhfVk9DX1BLVF9TSVpFLAotCS5wZXJpb2RzX21pbiA9CQlWT0lQX01BWF9RX0xFTiwKLQkucGVyaW9kc19tYXggPQkJVk9JUF9NQVhfUV9MRU4sCi0JLmZpZm9fc2l6ZSA9ICAgICAgICAgICAgMCwKLX07Ci0KLQotc3RhdGljIGludCBtc21fdm9pcF9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IG11dGUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlpbnQgcmFtcF9kdXJhdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCi0JaWYgKChtdXRlIDwgMCkgfHwgKG11dGUgPiAxKSB8fCAocmFtcF9kdXJhdGlvbiA8IDApKSB7Ci0JCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IG11dGU9JWQgcmFtcF9kdXJhdGlvbj0lZFxuIiwgX19mdW5jX18sIG11dGUsCi0JCXJhbXBfZHVyYXRpb24pOwotCi0Jdm9jX3NldF90eF9tdXRlKHZvY19nZXRfc2Vzc2lvbl9pZChWT0lQX1NFU1NJT05fTkFNRSksIFRYX1BBVEgsIG11dGUsCi0JCQkJCXJhbXBfZHVyYXRpb24pOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaXBfZ2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCWludCB2b2x1bWUgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlpbnQgcmFtcF9kdXJhdGlvbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCi0JaWYgKCh2b2x1bWUgPCAwKSB8fCAocmFtcF9kdXJhdGlvbiA8IDApKSB7Ci0JCXByX2VycigiICVzIEludmFsaWQgYXJndW1lbnRzIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHZvbHVtZTogJWQgcmFtcF9kdXJhdGlvbjogJWRcbiIsIF9fZnVuY19fLCB2b2x1bWUsCi0JCXJhbXBfZHVyYXRpb24pOwotCi0Jdm9jX3NldF9yeF92b2xfc3RlcCh2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpLAotCQkJCQkJUlhfUEFUSCwKLQkJCQkJCXZvbHVtZSwKLQkJCQkJCXJhbXBfZHVyYXRpb24pOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaXBfZHR4X21vZGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCW11dGV4X2xvY2soJnZvaXBfaW5mby5sb2NrKTsKLQotCXZvaXBfaW5mby5kdHhfbW9kZSAgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXByX2RlYnVnKCIlczogZHR4OiAlZFxuIiwgX19mdW5jX18sIHZvaXBfaW5mby5kdHhfbW9kZSk7Ci0KLQltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBtc21fdm9pcF9kdHhfbW9kZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2lwX2luZm8uZHR4X21vZGU7Ci0KLQltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3ZvaXBfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiVm9pcCBUeCBNdXRlIiwgU05EX1NPQ19OT1BNLCAwLAotCQkJICAgICBNQVhfUkFNUF9EVVJBVElPTiwKLQkJCSAgICAgMCwgMiwgTlVMTCwgbXNtX3ZvaXBfbXV0ZV9wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2lwIFJ4IEdhaW4iLCBTTkRfU09DX05PUE0sIDAsCi0JCQkgICAgIE1BWF9SQU1QX0RVUkFUSU9OLAotCQkJICAgICAwLCAyLCBOVUxMLCBtc21fdm9pcF9nYWluX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAgTW9kZSBDb25maWciLCBTTkRfU09DX05PUE0sIDAsIFZPSVBfTU9ERV9NQVgsIDAsCi0JCSAgICAgICBtc21fdm9pcF9tb2RlX2NvbmZpZ19nZXQsIG1zbV92b2lwX21vZGVfY29uZmlnX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAgUmF0ZSBDb25maWciLCBTTkRfU09DX05PUE0sIDAsIFZPSVBfUkFURV9NQVgsIDAsCi0JCSAgICAgICBOVUxMLCBtc21fdm9pcF9yYXRlX2NvbmZpZ19wdXQpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJWb2lwIEV2cmMgTWluIE1heCBSYXRlIENvbmZpZyIsIFNORF9TT0NfTk9QTSwKLQkJCSAgICAgMCwgVk9DXzFfUkFURSwgMCwgMiwKLQkJCSAgICAgbXNtX3ZvaXBfZXZyY19taW5fbWF4X3JhdGVfY29uZmlnX2dldCwKLQkJCSAgICAgbXNtX3ZvaXBfZXZyY19taW5fbWF4X3JhdGVfY29uZmlnX3B1dCksCi0JU09DX1NJTkdMRV9FWFQoIlZvaXAgRHR4IE1vZGUiLCBTTkRfU09DX05PUE0sIDAsIDEsIDAsCi0JCSAgICAgICBtc21fdm9pcF9kdHhfbW9kZV9nZXQsIG1zbV92b2lwX2R0eF9tb2RlX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9wY21fdm9pcF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIG1zbV92b2lwX2NvbnRyb2xzLAotCQkJCQlBUlJBWV9TSVpFKG1zbV92b2lwX2NvbnRyb2xzKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogc2FtcGxlIHJhdGUgc3VwcG9ydGVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHN1cHBvcnRlZF9zYW1wbGVfcmF0ZXNbXSA9IHs4MDAwLCAxNjAwMCwgMzIwMDAsIDQ4MDAwfTsKLQotc3RhdGljIHZvaWQgdm9pcF9zc3JfY2JfZm4odWludDMyX3Qgb3Bjb2RlLCB2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0KLQkvKiBOb3RpZnkgQVNvQyB0byBzZW5kIG5leHQgcGxheWJhY2svQ2FwdHVyZSB0byB1bmJsb2NrIHdyaXRlL3JlYWQgKi8KLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHByaXZhdGVfZGF0YTsKLQotCWlmIChvcGNvZGUgPT0gMHhGRkZGRkZGRikgewotCi0JCXBydGQtPnZvaXBfcmVzZXQgPSB0cnVlOwotCQlwcl9kZWJ1ZygiJXM6IE5vdGlmeSBBU29DIHRvIHNlbmQgbmV4dCBwbGF5YmFjay9DYXB0dXJlXG4iLAotCQkJX19mdW5jX18pOwotCi0JCXBydGQtPnBjbV9wbGF5YmFja19pcnFfcG9zICs9IHBydGQtPnBjbV9jb3VudDsKLQkJaWYgKHBydGQtPnN0YXRlID09IFZPSVBfU1RBUlRFRCkKLQkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKLQkJd2FrZV91cCgmcHJ0ZC0+b3V0X3dhaXQpOwotCi0JCXBydGQtPnBjbV9jYXB0dXJlX2lycV9wb3MgKz0gcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQ7Ci0JCWlmIChwcnRkLT5zdGF0ZSA9PSBWT0lQX1NUQVJURUQpCi0JCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtKTsKLQkJd2FrZV91cCgmcHJ0ZC0+aW5fd2FpdCk7Ci0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG9wY29kZSBkdXJpbmcgcmVzZXQgOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBvcGNvZGUpOwotCX0KLX0KLQotLyogY2FwdHVyZSBwYXRoICovCi1zdGF0aWMgdm9pZCB2b2lwX3Byb2Nlc3NfdWxfcGt0KHVpbnQ4X3QgKnZvY19wa3QsCi0JCQkJdWludDMyX3QgcGt0X2xlbiwKLQkJCQl1aW50MzJfdCB0aW1lc3RhbXAsCi0JCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBwcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBkc3BfZmxhZ3M7Ci0KLQlpZiAocHJ0ZC0+Y2FwdHVyZV9zdWJzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogQ29weSB1cC1saW5rIHBhY2tldCBpbnRvIG91dF9xdWV1ZS4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7Ci0KLQkvKiBkaXNjYXJkaW5nIFVMIHBhY2tldHMgdGlsbCBzdGFydCBpcyByZWNlaXZlZCAqLwotCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpICYmIHBydGQtPmNhcHR1cmVfc3RhcnQpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSwKLQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQlzd2l0Y2ggKHBydGQtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX0FNUl9XQjoKLQkJY2FzZSBNT0RFX0FNUjogewotCQkJLyogUmVtb3ZlIHRoZSBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuIEhlYWRlciBmb3JtYXQ6Ci0JCQkgKiBCaXRzIDAtMzogRnJhbWUgcmF0ZQotCQkJICogQml0cyA0LTc6IEZyYW1lIHR5cGUKLQkJCSAqLwotCQkJYnVmX25vZGUtPmZyYW1lLmZybV9oZHIudGltZXN0YW1wID0gdGltZXN0YW1wOwotCQkJYnVmX25vZGUtPmZyYW1lLmZybV9oZHIuZnJhbWVfdHlwZSA9Ci0JCQkJCQkoKCp2b2NfcGt0KSAmIDB4RjApID4+IDQ7Ci0JCQl2b2NfcGt0ID0gdm9jX3BrdCArIERTUF9GUkFNRV9IRFJfTEVOOwotCQkJYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA9IHBrdF9sZW4gLSBEU1BfRlJBTUVfSERSX0xFTjsKLQkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCi0JCQkJdm9jX3BrdCwKLQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5vdXRfcXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBNT0RFX0lTMTI3OgotCQljYXNlIE1PREVfNEdWX05COgotCQljYXNlIE1PREVfNEdWX1dCOgotCQljYXNlIE1PREVfNEdWX05XOiB7Ci0JCQkvKiBSZW1vdmUgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlci4KLQkJCSAqIEhlYWRlciBmb3JtYXQ6Ci0JCQkgKiBCaXRzIDAtMzogZnJhbWUgcmF0ZQotCQkJICovCi0JCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5wYWNrZXRfcmF0ZSA9ICgqdm9jX3BrdCkgJiAweDBGOwotCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKLQkJCWJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4gPSBwa3RfbGVuIC0gRFNQX0ZSQU1FX0hEUl9MRU47Ci0KLQkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCi0JCQkJdm9jX3BrdCwKLQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5vdXRfcXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBNT0RFX0c3MTE6Ci0JCWNhc2UgTU9ERV9HNzExQTp7Ci0JCQkvKiBHNzExIGZyYW1lcyBhcmUgMTBtcyBlYWNoLCBidXQgdGhlIERTUCB3b3JrcyB3aXRoCi0JCQkgKiAyMG1zIGZyYW1lcyBhbmQgc2VuZHMgdHdvIDEwbXMgZnJhbWVzIHBlciBidWZmZXIuCi0JCQkgKiBFeHRyYWN0IHRoZSB0d28gZnJhbWVzIGFuZCBwdXQgdGhlbSBpbiBzZXBhcmF0ZQotCQkJICogYnVmZmVycy4KLQkJCSAqLwotCQkJLyogUmVtb3ZlIHRoZSBmaXJzdCBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuCi0JCQkgKiBIZWFkZXIgZm9ybWF0OiBHNzExQQotCQkJICogQml0cyAwLTE6IEZyYW1lIHR5cGUKLQkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCi0JCQkgKgotCQkJICogSGVhZGVyIGZvcm1hdDogRzcxMQotCQkJICogQml0cyAyLTM6IEZyYW1lIHJhdGUKLQkJCSAqLwotCQkJaWYgKHBydGQtPm1vZGUgPT0gTU9ERV9HNzExQSkKLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlID0KLQkJCQkJCQkoKnZvY19wa3QpICYgMHgwMzsKLQkJCWJ1Zl9ub2RlLT5mcmFtZS5mcm1faGRyLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQkJCXZvY19wa3QgPSB2b2NfcGt0ICsgRFNQX0ZSQU1FX0hEUl9MRU47Ci0KLQkJCS8qIFRoZXJlIGFyZSB0d28gZnJhbWVzIGluIHRoZSBidWZmZXIuIExlbmd0aCBvZiB0aGUKLQkJCSAqIGZpcnN0IGZyYW1lOgotCQkJICovCi0JCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gKHBrdF9sZW4gLQotCQkJCQkJICAyICogRFNQX0ZSQU1FX0hEUl9MRU4pIC8gMjsKLQotCQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCSAgICAgICB2b2NfcGt0LAotCQkJICAgICAgIGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW4pOwotCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOwotCi0JCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwgJnBydGQtPm91dF9xdWV1ZSk7Ci0KLQkJCS8qIEdldCBhbm90aGVyIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIFEgYW5kIGZpbGwgaW4gdGhlCi0JCQkgKiBzZWNvbmQgZnJhbWUuCi0JCQkgKi8KLQkJCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpKSB7Ci0JCQkJYnVmX25vZGUgPQotCQkJCQlsaXN0X2ZpcnN0X2VudHJ5KCZwcnRkLT5mcmVlX291dF9xdWV1ZSwKLQkJCQkJCQkgc3RydWN0IHZvaXBfYnVmX25vZGUsCi0JCQkJCQkJIGxpc3QpOwotCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0KLQkJCQkvKiBSZW1vdmUgdGhlIHNlY29uZCBEU1AgZnJhbWUgaW5mbyBoZWFkZXIuCi0JCQkJICogSGVhZGVyIGZvcm1hdDoKLQkJCQkgKiBCaXRzIDAtMTogRnJhbWUgdHlwZQotCQkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCi0JCQkJICovCi0KLQkJCQlpZiAocHJ0ZC0+bW9kZSA9PSBNT0RFX0c3MTFBKQotCQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlID0KLQkJCQkJCQkoKnZvY19wa3QpICYgMHgwMzsKLQkJCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKLQotCQkJCS8qIFRoZXJlIGFyZSB0d28gZnJhbWVzIGluIHRoZSBidWZmZXIuIExlbmd0aAotCQkJCSAqIG9mIHRoZSBzZWNvbmQgZnJhbWU6Ci0JCQkJICovCi0JCQkJYnVmX25vZGUtPmZyYW1lLnBrdGxlbiA9IChwa3RfbGVuIC0KLQkJCQkJCTIgKiBEU1BfRlJBTUVfSERSX0xFTikgLyAyOwotCi0JCQkJbWVtY3B5KCZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCQkgICAgICAgdm9jX3BrdCwKLQkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7Ci0KLQkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJICAgICAgJnBydGQtPm91dF9xdWV1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIERyb3AgdGhlIHNlY29uZCBmcmFtZSAqLwotCQkJCXByX2VycigiJXM6IFVMIGRhdGEgZHJvcHBlZCwgcmVhZCBpcyBzbG93XG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCQlidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gcGt0X2xlbjsKLQkJCW1lbWNweSgmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCi0JCQkgICAgICAgdm9jX3BrdCwKLQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+b3V0X3F1ZXVlKTsKLQkJfQotCQl9Ci0JCXByX2RlYnVnKCIlczogcGt0X2xlbiA9JWQsIGZyYW1lLnBrdGxlbj0lZCwgdGltZXN0YW1wPSVkXG4iLAotCQkJIF9fZnVuY19fLCBwa3RfbGVuLCBidWZfbm9kZS0+ZnJhbWUucGt0bGVuLCB0aW1lc3RhbXApOwotCi0JCWlmIChwcnRkLT5tb2RlID09IE1PREVfUENNKQotCQkJcHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyArPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOwotCQllbHNlCi0JCQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zICs9IHBydGQtPnBjbV9jYXB0dXJlX2NvdW50OwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBydGQtPmRzcF91bF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHBydGQtPmNhcHR1cmVfc3Vic3RyZWFtKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKLQkJcHJfZXJyKCJVTCBkYXRhIGRyb3BwZWRcbiIpOwotCX0KLQotCXdha2VfdXAoJnBydGQtPm91dF93YWl0KTsKLX0KLQotLyogcGxheWJhY2sgcGF0aCAqLwotc3RhdGljIHZvaWQgdm9pcF9wcm9jZXNzX2RsX3BrdCh1aW50OF90ICp2b2NfcGt0LCB2b2lkICpwcml2YXRlX2RhdGEpCi17Ci0Jc3RydWN0IHZvaXBfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQl1aW50MzJfdCByYXRlX3R5cGU7Ci0JdWludDMyX3QgZnJhbWVfcmF0ZTsKLQl1MzIgcGt0X2xlbjsKLQl1OCAqdm9jX2FkZHIgPSBOVUxMOwotCi0JaWYgKHBydGQtPnBsYXliYWNrX3N1YnN0cmVhbSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnBydGQtPmluX3F1ZXVlKSAmJiBwcnRkLT5wbGF5YmFja19zdGFydCkgewotCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJnBydGQtPmluX3F1ZXVlLAotCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKLQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJc3dpdGNoIChwcnRkLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9BTVI6Ci0JCWNhc2UgTU9ERV9BTVJfV0I6IHsKLQkJCSooKHVpbnQzMl90ICopdm9jX3BrdCkgPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuICsKLQkJCQkJCQlEU1BfRlJBTUVfSERSX0xFTjsKLQkJCS8qIEFkdmFuY2UgdG8gdGhlIGhlYWRlciBvZiB2b2lwIHBhY2tldCAqLwotCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBzaXplb2YodWludDMyX3QpOwotCQkJLyoKLQkJCSAqIEFkZCB0aGUgRFNQIGZyYW1lIGluZm8gaGVhZGVyLiBIZWFkZXIgZm9ybWF0OgotCQkJICogQml0cyAwLTM6IEZyYW1lIHJhdGUKLQkJCSAqIEJpdHMgNC03OiBGcmFtZSB0eXBlCi0JCQkgKi8KLQkJCSp2b2NfcGt0ID0gKChidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYKLQkJCQkgICAweDBGKSA8PCA0KTsKLQkJCWZyYW1lX3JhdGUgPSAoYnVmX25vZGUtPmZyYW1lLmZybV9oZHIuZnJhbWVfdHlwZSAmCi0JCQkJICAgICAweEZGRkYwMDAwKSA+PiAxNjsKLQkJCWlmIChmcmFtZV9yYXRlKSB7Ci0JCQkJaWYgKHZvaXBfZ2V0X3JhdGVfdHlwZShwcnRkLT5tb2RlLCBmcmFtZV9yYXRlLAotCQkJCQkJICAgICAgICZyYXRlX3R5cGUpKSB7Ci0JCQkJCXByX2VycigiJXMoKTogZmFpbCBhdCBnZXR0aW5nIHJhdGVfdHlwZVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJ0ZC0+cmF0ZV90eXBlID0gcmF0ZV90eXBlOwotCQkJfQotCQkJKnZvY19wa3QgfD0gcHJ0ZC0+cmF0ZV90eXBlICYgMHgwRjsKLQotCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKLQkJCW1lbWNweSh2b2NfcGt0LAotCQkJCSZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIE1PREVfSVMxMjc6Ci0JCWNhc2UgTU9ERV80R1ZfTkI6Ci0JCWNhc2UgTU9ERV80R1ZfV0I6Ci0JCWNhc2UgTU9ERV80R1ZfTlc6IHsKLQkJCSooKHVpbnQzMl90ICopdm9jX3BrdCkgPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuICsKLQkJCQkJCQkgRFNQX0ZSQU1FX0hEUl9MRU47Ci0JCQkvKiBBZHZhbmNlIHRvIHRoZSBoZWFkZXIgb2Ygdm9pcCBwYWNrZXQgKi8KLQkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKLQkJCS8qCi0JCQkgKiBBZGQgdGhlIERTUCBmcmFtZSBpbmZvIGhlYWRlci4gSGVhZGVyIGZvcm1hdDoKLQkJCSAqIEJpdHMgMC0zIDogRnJhbWUgcmF0ZQotCQkJICovCi0JCQkqdm9jX3BrdCA9IGJ1Zl9ub2RlLT5mcmFtZS5mcm1faGRyLnBhY2tldF9yYXRlICYgMHgwRjsKLQkJCXZvY19wa3QgPSB2b2NfcGt0ICsgRFNQX0ZSQU1FX0hEUl9MRU47Ci0KLQkJCW1lbWNweSh2b2NfcGt0LAotCQkJCSZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5mcmVlX2luX3F1ZXVlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgTU9ERV9HNzExOgotCQljYXNlIE1PREVfRzcxMUE6ewotCQkJLyogRzcxMSBmcmFtZXMgYXJlIDEwbXMgZWFjaCBidXQgdGhlIERTUCBleHBlY3RzIDIwbXMKLQkJCSAqIHdvcnRoIG9mIGRhdGEsIHNvIHNlbmQgdHdvIDEwbXMgZnJhbWVzIHBlciBidWZmZXIuCi0JCQkgKi8KLQkJCS8qIEFkZCB0aGUgZmlyc3QgRFNQIGZyYW1lIGluZm8gaGVhZGVyLiBIZWFkZXIgZm9ybWF0OgotCQkJICogQml0cyAwLTE6IEZyYW1lIHR5cGUKLQkJCSAqIEJpdHMgMi0zOiBGcmFtZSByYXRlCi0JCQkgKi8KLQkJCXZvY19hZGRyID0gdm9jX3BrdDsKLQkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKLQotCQkJKnZvY19wa3QgPSAoKHBydGQtPnJhdGVfdHlwZSAgJiAweDBGKSA8PCAyKSB8Ci0JCQkJICAgIChidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYgMHgwMyk7Ci0JCQl2b2NfcGt0ID0gdm9jX3BrdCArIERTUF9GUkFNRV9IRFJfTEVOOwotCi0JCQlwa3RfbGVuID0gYnVmX25vZGUtPmZyYW1lLnBrdGxlbiArIERTUF9GUkFNRV9IRFJfTEVOOwotCi0JCQltZW1jcHkodm9jX3BrdCwKLQkJCSAgICAgICAmYnVmX25vZGUtPmZyYW1lLnZvY19wa3RbMF0sCi0JCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7Ci0JCQl2b2NfcGt0ID0gdm9jX3BrdCArIGJ1Zl9ub2RlLT5mcmFtZS5wa3RsZW47Ci0KLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7Ci0KLQkJCWlmICghbGlzdF9lbXB0eSgmcHJ0ZC0+aW5fcXVldWUpKSB7Ci0JCQkJLyogR2V0IHRoZSBzZWNvbmQgYnVmZmVyLiAqLwotCQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmcHJ0ZC0+aW5fcXVldWUsCi0JCQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsCi0JCQkJCQkJbGlzdCk7Ci0JCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQotCQkJCS8qIEFkZCB0aGUgc2Vjb25kIERTUCBmcmFtZSBpbmZvIGhlYWRlci4KLQkJCQkgKiBIZWFkZXIgZm9ybWF0OgotCQkJCSAqIEJpdHMgMC0xOiBGcmFtZSB0eXBlCi0JCQkJICogQml0cyAyLTM6IEZyYW1lIHJhdGUKLQkJCQkgKi8KLQkJCQkqdm9jX3BrdCA9ICgocHJ0ZC0+cmF0ZV90eXBlICYgMHgwRikgPDwgMikgfAotCQkJCShidWZfbm9kZS0+ZnJhbWUuZnJtX2hkci5mcmFtZV90eXBlICYgMHgwMyk7Ci0JCQkJdm9jX3BrdCA9IHZvY19wa3QgKyBEU1BfRlJBTUVfSERSX0xFTjsKLQotCQkJCXBrdF9sZW4gPSBwa3RfbGVuICsgYnVmX25vZGUtPmZyYW1lLnBrdGxlbiArCi0JCQkJCSAgIERTUF9GUkFNRV9IRFJfTEVOOwotCi0JCQkJbWVtY3B5KHZvY19wa3QsCi0JCQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCQkgICAgICAgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7Ci0KLQkJCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJICAgICAgJnBydGQtPmZyZWVfaW5fcXVldWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBPbmx5IDEwbXMgd29ydGggb2YgZGF0YSBpcyBhdmFpbGFibGUsIHNpZ25hbAotCQkJCSAqIGVyYXN1cmUgZnJhbWUuCi0JCQkJICovCi0JCQkJKnZvY19wa3QgPSAoKHBydGQtPnJhdGVfdHlwZSAmIDB4MEYpIDw8IDIpIHwKLQkJCQkJICAgIChNVlNfRzcxMUFfRVJBU1VSRSAmIDB4MDMpOwotCi0JCQkJcGt0X2xlbiA9IHBrdF9sZW4gKyBEU1BfRlJBTUVfSERSX0xFTjsKLQkJCQlwcl9kZWJ1ZygiJXMsIE9ubHkgMTBtcyByZWFkLCBlcmFzZSAybmQgZnJhbWVcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQl9Ci0JCQkqKCh1aW50MzJfdCAqKXZvY19hZGRyKSA9IHBrdF9sZW47Ci0JCQlicmVhazsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCQkqKCh1aW50MzJfdCAqKXZvY19wa3QpID0gYnVmX25vZGUtPmZyYW1lLnBrdGxlbjsKLQkJCXZvY19wa3QgPSB2b2NfcGt0ICsgc2l6ZW9mKHVpbnQzMl90KTsKLQkJCW1lbWNweSh2b2NfcGt0LAotCQkJICAgICAgICZidWZfbm9kZS0+ZnJhbWUudm9jX3BrdFswXSwKLQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmJ1Zl9ub2RlLT5saXN0LCAmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSk7Ci0JCX0KLQkJfQotCQlwcl9kZWJ1ZygiJXM6IGZyYW1lLnBrdGxlbj0lZFxuIiwgX19mdW5jX18sCi0JCQkgYnVmX25vZGUtPmZyYW1lLnBrdGxlbik7Ci0KLQkJaWYgKHBydGQtPm1vZGUgPT0gTU9ERV9QQ00pCi0JCQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyArPSBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOwotCQllbHNlCi0JCQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyArPSBwcnRkLT5wY21fY291bnQ7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKLQl9IGVsc2UgewotCQkqKCh1aW50MzJfdCAqKXZvY19wa3QpID0gMDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCXByX2Vycl9yYXRlbGltaXRlZCgiREwgZGF0YSBub3QgYXZhaWxhYmxlXG4iKTsKLQl9Ci0Jd2FrZV91cCgmcHJ0ZC0+aW5fd2FpdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfc2FtcGxlX3JhdGVzID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUoc3VwcG9ydGVkX3NhbXBsZV9yYXRlcyksCi0JLmxpc3QgPSBzdXBwb3J0ZWRfc2FtcGxlX3JhdGVzLAotCS5tYXNrID0gMCwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcnRkLT5wbGF5X3NhbXBfcmF0ZSA9IHJ1bnRpbWUtPnJhdGU7Ci0JcHJ0ZC0+cGNtX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwcnRkLT5wY21fY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcyA9IDA7Ci0JcHJ0ZC0+cGNtX3BsYXliYWNrX2J1Zl9wb3MgPSAwOwotCXBydGQtPnBsYXliYWNrX3ByZXBhcmUgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCXBydGQtPmNhcF9zYW1wX3JhdGUgPSBydW50aW1lLT5yYXRlOwotCXBydGQtPnBjbV9jYXB0dXJlX3NpemUgID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7Ci0JcHJ0ZC0+cGNtX2NhcHR1cmVfY291bnQgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID0gMDsKLQlwcnRkLT5wY21fY2FwdHVyZV9idWZfcG9zID0gMDsKLQlwcnRkLT5jYXB0dXJlX3ByZXBhcmUgPSAxOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCXByX2RlYnVnKCIlczogVHJpZ2dlciBzdGFydFxuIiwgX19mdW5jX18pOwotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQkJcHJ0ZC0+Y2FwdHVyZV9zdGFydCA9IDE7Ci0JCWVsc2UKLQkJCXBydGQtPnBsYXliYWNrX3N0YXJ0ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlwcl9kZWJ1ZygiU05EUlZfUENNX1RSSUdHRVJfU1RPUFxuIik7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJcHJ0ZC0+cGxheWJhY2tfc3RhcnQgPSAwOwotCQllbHNlCi0JCQlwcnRkLT5jYXB0dXJlX3N0YXJ0ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9ICZ2b2lwX2luZm87Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMsIFZvSVBcbiIsIF9fZnVuY19fKTsKLQltdXRleF9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXJ1bnRpbWUtPmh3ID0gbXNtX3BjbV9oYXJkd2FyZTsKLQotCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJCQkmY29uc3RyYWludHNfc2FtcGxlX3JhdGVzKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZGVidWcoInNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGZhaWxlZFxuIik7Ci0KLQlyZXQgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZGVidWcoInNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlwcnRkLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JZWxzZQotCQlwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7Ci1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9wbGF5YmFja19jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKLQlzbmRfcGNtX3VmcmFtZXNfdCBod29mZiwgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQotCWludCBjb3VudCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCBmcmFtZXMpOwotCi0JcHJfZGVidWcoIiVzOiBjb3VudCA9ICVkLCBmcmFtZXM9JWRcbiIsIF9fZnVuY19fLCBjb3VudCwgKGludClmcmFtZXMpOwotCi0JaWYgKHBydGQtPnZvaXBfcmVzZXQpIHsKLQkJcHJfZGVidWcoIiVzOiBSRVNFVCBldmVudCBoYXBwZW5lZCBkdXJpbmcgVm9JUFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChwcnRkLT5pbl93YWl0LAotCQkJCSghbGlzdF9lbXB0eSgmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSkgfHwKLQkJCQlwcnRkLT5zdGF0ZSA9PSBWT0lQX1NUT1BQRUQpLAotCQkJCTEgKiBIWik7Ci0JaWYgKHBydGQtPnZvaXBfcmVzZXQpIHsKLQkJcHJfZGVidWcoIiVzOiBSRVNFVCBldmVudCBoYXBwZW5lZCBkdXJpbmcgVm9JUFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0KLQlpZiAocmV0ID4gMCkgewotCQlpZiAoY291bnQgPD0gVk9JUF9NQVhfVk9DX1BLVF9TSVpFKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQlidWZfbm9kZSA9Ci0JCQkJbGlzdF9maXJzdF9lbnRyeSgmcHJ0ZC0+ZnJlZV9pbl9xdWV1ZSwKLQkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWlmIChwcnRkLT5tb2RlID09IE1PREVfUENNKSB7Ci0JCQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmJ1Zl9ub2RlLT5mcmFtZS52b2NfcGt0LAotCQkJCQkJCWJ1ZiwgY291bnQpOwotCQkJCWlmIChyZXQpIHsKLQkJCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkICVkXG4iLAotCQkJCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gY291bnQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZidWZfbm9kZS0+ZnJhbWUsCi0JCQkJCQkJYnVmLCBjb3VudCk7Ci0JCQkJaWYgKHJldCkgewotCQkJCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQgJWRcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWlmIChidWZfbm9kZS0+ZnJhbWUucGt0bGVuID49IGNvdW50KQotCQkJCQlidWZfbm9kZS0+ZnJhbWUucGt0bGVuID0gY291bnQgLQotCQkJCQkoc2l6ZW9mKGJ1Zl9ub2RlLT5mcmFtZS5mcm1faGRyKSArCi0JCQkJCSBzaXplb2YoYnVmX25vZGUtPmZyYW1lLnBrdGxlbikpOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsICZwcnRkLT5pbl9xdWV1ZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFdyaXRlIGNudCAlZCBpcyA+IFZPSVBfTUFYX1ZPQ19QS1RfU0laRVxuIiwKLQkJCQlfX2Z1bmNfXywgY291bnQpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJfQotCi0JfSBlbHNlIGlmIChyZXQgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBObyBmcmVlIERMIGJ1ZmZzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogcGxheWJhY2sgY29weSB3YXMgaW50ZXJydXB0ZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldHVybiAgcmV0OwotfQotc3RhdGljIGludCBtc21fcGNtX2NhcHR1cmVfY29weShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJaW50IGNoYW5uZWwsIHNuZF9wY21fdWZyYW1lc190IGh3b2ZmLCB2b2lkIF9fdXNlciAqYnVmLAotCQkJCQkJc25kX3BjbV91ZnJhbWVzX3QgZnJhbWVzKQotewotCWludCByZXQgPSAwOwotCWludCBjb3VudCA9IDA7Ci0Jc3RydWN0IHZvaXBfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCB2b2lwX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZHNwX2ZsYWdzOwotCWludCBzaXplOwotCi0JY291bnQgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwgZnJhbWVzKTsKLQotCXByX2RlYnVnKCIlczogY291bnQgPSAlZFxuIiwgX19mdW5jX18sIGNvdW50KTsKLQotCWlmIChwcnRkLT52b2lwX3Jlc2V0KSB7Ci0JCXByX2RlYnVnKCIlczogUkVTRVQgZXZlbnQgaGFwcGVuZWQgZHVyaW5nIFZvSVBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTkVUUkVTRVQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocHJ0ZC0+b3V0X3dhaXQsCi0JCQkJKCFsaXN0X2VtcHR5KCZwcnRkLT5vdXRfcXVldWUpIHx8Ci0JCQkJcHJ0ZC0+c3RhdGUgPT0gVk9JUF9TVE9QUEVEKSwKLQkJCQkxICogSFopOwotCi0JaWYgKHBydGQtPnZvaXBfcmVzZXQpIHsKLQkJcHJfZGVidWcoIiVzOiBSRVNFVCBldmVudCBoYXBwZW5lZCBkdXJpbmcgVm9JUFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVORVRSRVNFVDsKLQl9Ci0KLQlpZiAocmV0ID4gMCkgewotCi0JCWlmIChjb3VudCA8PSBWT0lQX01BWF9WT0NfUEtUX1NJWkUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWJ1Zl9ub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmcHJ0ZC0+b3V0X3F1ZXVlLAotCQkJCQlzdHJ1Y3Qgdm9pcF9idWZfbm9kZSwgbGlzdCk7Ci0JCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQlpZiAocHJ0ZC0+bW9kZSA9PSBNT0RFX1BDTSkgewotCQkJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsCi0JCQkJCQkgICAmYnVmX25vZGUtPmZyYW1lLnZvY19wa3QsCi0JCQkJCQkgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2l6ZSA9IHNpemVvZihidWZfbm9kZS0+ZnJhbWUuZnJtX2hkcikgKwotCQkJCSAgICAgICBzaXplb2YoYnVmX25vZGUtPmZyYW1lLnBrdGxlbikgKwotCQkJCSAgICAgICBidWZfbm9kZS0+ZnJhbWUucGt0bGVuOwotCi0JCQkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwKLQkJCQkJCSAgICZidWZfbm9kZS0+ZnJhbWUsCi0JCQkJCQkgICBzaXplKTsKLQkJCX0KLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOiBDb3B5IHRvIHVzZXIgcmV0dXJuZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJ0ZC0+ZHNwX3VsX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJCSZwcnRkLT5mcmVlX291dF9xdWV1ZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IFJlYWQgY291bnQgJWQgPiBWT0lQX01BWF9WT0NfUEtUX1NJWkVcbiIsCi0JCQkJX19mdW5jX18sIGNvdW50KTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCX0KLQotCi0JfSBlbHNlIGlmIChyZXQgPT0gMCkgewotCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIiVzOiBObyBVTCBkYXRhIGF2YWlsYWJsZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IFJlYWQgd2FzIGludGVycnVwdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FUkVTVEFSVFNZUzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLXN0YXRpYyBpbnQgbXNtX3BjbV9jb3B5KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYSwKLQkgc25kX3BjbV91ZnJhbWVzX3QgaHdvZmYsIHZvaWQgX191c2VyICpidWYsIHNuZF9wY21fdWZyYW1lc190IGZyYW1lcykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX2NvcHkoc3Vic3RyZWFtLCBhLCBod29mZiwgYnVmLCBmcmFtZXMpOwotCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX2NvcHkoc3Vic3RyZWFtLCBhLCBod29mZiwgYnVmLCBmcmFtZXMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IE5VTEw7Ci0Jc3RydWN0IHZvaXBfYnVmX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKnBfZG1hX2J1ZiwgKmNfZG1hX2J1ZjsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBfc3Vic3RyZWFtLCAqY19zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZDsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQotCWlmIChzdWJzdHJlYW0gPT0gTlVMTCkgewotCQlwcl9lcnIoInN1YnN0cmVhbSBpcyBOVUxMXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCXdha2VfdXAoJnBydGQtPm91dF93YWl0KTsKLQotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXBydGQtPnBsYXliYWNrX3ByZXBhcmUgPSAwOwotCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJcHJ0ZC0+Y2FwdHVyZV9wcmVwYXJlID0gMDsKLQotCWlmICghcHJ0ZC0+cGxheWJhY2tfcHJlcGFyZSAmJiAhcHJ0ZC0+Y2FwdHVyZV9wcmVwYXJlKSB7Ci0JCWlmIChwcnRkLT5zdGF0ZSA9PSBWT0lQX1NUQVJURUQpIHsKLQkJCXBydGQtPnZvaXBfcmVzZXQgPSBmYWxzZTsKLQkJCXBydGQtPnN0YXRlID0gVk9JUF9TVE9QUEVEOwotCQkJdm9jX2VuZF92b2ljZV9jYWxsKAotCQkJCQl2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpKTsKLQkJCXZvY19yZWdpc3Rlcl9tdnNfY2IoTlVMTCwgTlVMTCwgTlVMTCwgcHJ0ZCk7Ci0JCX0KLQkJLyogcmVsZWFzZSBhbGwgYnVmZmVyICovCi0JCS8qIHJlbGVhc2UgaW5fcXVldWUgYW5kIGZyZWVfaW5fcXVldWUgKi8KLQkJcHJfZGVidWcoInJlbGVhc2UgYWxsIGJ1ZmZlclxuIik7Ci0JCXBfc3Vic3RyZWFtID0gcHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtOwotCQlpZiAocF9zdWJzdHJlYW0gPT0gTlVMTCkgewotCQkJcHJfZGVidWcoInBfc3Vic3RyZWFtIGlzIE5VTExcbiIpOwotCQkJZ290byBjYXB0OwotCQl9Ci0JCXBfZG1hX2J1ZiA9ICZwX3N1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQkJaWYgKHBfZG1hX2J1ZiA9PSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygicF9kbWFfYnVmIGlzIE5VTExcbiIpOwotCQkJZ290byBjYXB0OwotCQl9Ci0JCWlmIChwX2RtYV9idWYtPmFyZWEgIT0gTlVMTCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBydGQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJnBydGQtPmluX3F1ZXVlKSB7Ci0JCQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCQkJCXN0cnVjdCB2b2lwX2J1Zl9ub2RlLCBsaXN0KTsKLQkJCQlsaXN0X2RlbCgmYnVmX25vZGUtPmxpc3QpOwotCQkJfQotCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJnBydGQtPmZyZWVfaW5fcXVldWUpIHsKLQkJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOwotCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWRtYV9mcmVlX2NvaGVyZW50KHBfc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCQlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4LCBwX2RtYV9idWYtPmFyZWEsCi0JCQkJcF9kbWFfYnVmLT5hZGRyKTsKLQkJCXBfZG1hX2J1Zi0+YXJlYSA9IE5VTEw7Ci0JCX0KLQkJLyogcmVsZWFzZSBvdXRfcXVldWUgYW5kIGZyZWVfb3V0X3F1ZXVlICovCi1jYXB0OgkJY19zdWJzdHJlYW0gPSBwcnRkLT5jYXB0dXJlX3N1YnN0cmVhbTsKLQkJaWYgKGNfc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJCXByX2RlYnVnKCJjX3N1YnN0cmVhbSBpcyBOVUxMXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQljX2RtYV9idWYgPSAmY19zdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JCWlmIChjX3N1YnN0cmVhbSA9PSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiY19kbWFfYnVmIGlzIE5VTEwuXG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlpZiAoY19kbWFfYnVmLT5hcmVhICE9IE5VTEwpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZwcnRkLT5vdXRfcXVldWUpIHsKLQkJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOwotCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQl9Ci0JCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmcHJ0ZC0+ZnJlZV9vdXRfcXVldWUpIHsKLQkJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQkJc3RydWN0IHZvaXBfYnVmX25vZGUsIGxpc3QpOwotCQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcnRkLT5kc3BfdWxfbG9jaywgZHNwX2ZsYWdzKTsKLQkJCWRtYV9mcmVlX2NvaGVyZW50KGNfc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwKLQkJCQlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4LCBjX2RtYV9idWYtPmFyZWEsCi0JCQkJY19kbWFfYnVmLT5hZGRyKTsKLQkJCWNfZG1hX2J1Zi0+YXJlYSA9IE5VTEw7Ci0JCX0KLWRvbmU6Ci0JCXBydGQtPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKLQkJcHJ0ZC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pcF9jb25maWdfdm9jb2RlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCB2b2lwX2Rydl9pbmZvICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVpbnQzMl90IG1lZGlhX3R5cGUgPSAwOwotCXVpbnQzMl90IHJhdGVfdHlwZSA9IDA7Ci0JdWludDMyX3QgZXZyY19taW5fcmF0ZV90eXBlID0gMDsKLQl1aW50MzJfdCBldnJjX21heF9yYXRlX3R5cGUgPSAwOwotCi0JcHJfZGVidWcoIiVzKCk6IG1vZGU9JWQsIHBsYXliYWNrIHJhdGU9JWQsIGNhcHR1cmUgcmF0ZT0lZFxuIiwKLQkJIF9fZnVuY19fLCBwcnRkLT5tb2RlLCBwcnRkLT5wbGF5X3NhbXBfcmF0ZSwKLQkJIHBydGQtPmNhcF9zYW1wX3JhdGUpOwotCi0JaWYgKChydW50aW1lLT5mb3JtYXQgIT0gRk9STUFUX1MxNl9MRSAmJgotCSAgICAgcnVudGltZS0+Zm9ybWF0ICE9IEZPUk1BVF9TUEVDSUFMKSAmJgotCSAgICAoKHBydGQtPm1vZGUgPT0gTU9ERV9BTVIpIHx8IChwcnRkLT5tb2RlID09IE1PREVfQU1SX1dCKSB8fAotCSAgICAocHJ0ZC0+bW9kZSA9PSBNT0RFX0lTMTI3KSB8fCAocHJ0ZC0+bW9kZSA9PSBNT0RFXzRHVl9OQikgfHwKLQkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV80R1ZfV0IpIHx8IChwcnRkLT5tb2RlID09IE1PREVfNEdWX05XKSB8fAotCSAgICAocHJ0ZC0+bW9kZSA9PSBNT0RFX0c3MTEpIHx8IChwcnRkLT5tb2RlID09IE1PREVfRzcxMUEpKSkgewotCQlwcl9lcnIoIiVzKCk6IG1vZGU6JWQgYW5kIGZvcm1hdDoldSBhcmUgbm90IG1hdGNoZWRcbiIsCi0JCQlfX2Z1bmNfXywgcHJ0ZC0+bW9kZSwgKHVpbnQzMl90KXJ1bnRpbWUtPmZvcm1hdCk7Ci0KLQkJcmV0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAocnVudGltZS0+Zm9ybWF0ICE9IEZPUk1BVF9TMTZfTEUgJiYgKHBydGQtPm1vZGUgPT0gTU9ERV9QQ00pKSB7Ci0JCXByX2VycigiJXMoKTogbW9kZTolZCBhbmQgZm9ybWF0OiV1IGFyZSBub3QgbWF0Y2hlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBwcnRkLT5tb2RlLCBydW50aW1lLT5mb3JtYXQpOwotCi0JCXJldCA9ICAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChwcnRkLT5tb2RlID09IE1PREVfUENNKSB8fAotCSAgICAocHJ0ZC0+bW9kZSA9PSBNT0RFX0FNUikgfHwKLQkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV9BTVJfV0IpIHx8Ci0JICAgIChwcnRkLT5tb2RlID09IE1PREVfRzcxMSkgfHwKLQkgICAgKHBydGQtPm1vZGUgPT0gTU9ERV9HNzExQSkpIHsKLQkJcmV0ID0gdm9pcF9nZXRfcmF0ZV90eXBlKHBydGQtPm1vZGUsCi0JCQkJCSBwcnRkLT5yYXRlLAotCQkJCQkgJnJhdGVfdHlwZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzKCk6IGZhaWwgYXQgZ2V0dGluZyByYXRlX3R5cGUsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlwcnRkLT5yYXRlX3R5cGUgPSByYXRlX3R5cGU7Ci0JCXByX2RlYnVnKCJyYXRlX3R5cGU9JWRcbiIsIHJhdGVfdHlwZSk7Ci0KLQl9IGVsc2UgaWYgKChwcnRkLT5tb2RlID09IE1PREVfSVMxMjcpIHx8Ci0JCSAgIChwcnRkLT5tb2RlID09IE1PREVfNEdWX05CKSB8fAotCQkgICAocHJ0ZC0+bW9kZSA9PSBNT0RFXzRHVl9XQikgfHwKLQkJICAgKHBydGQtPm1vZGUgPT0gTU9ERV80R1ZfTlcpKSB7Ci0JCXJldCA9IHZvaXBfZ2V0X3JhdGVfdHlwZShwcnRkLT5tb2RlLAotCQkJCQkgcHJ0ZC0+ZXZyY19taW5fcmF0ZSwKLQkJCQkJICZldnJjX21pbl9yYXRlX3R5cGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlcygpOiBmYWlsIGF0IGdldHRpbmcgbWluIHJhdGUsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlpZiAoZXZyY19taW5fcmF0ZV90eXBlID09IFZPQ18wX1JBVEUpCi0JCQlldnJjX21pbl9yYXRlX3R5cGUgPSBWT0NfOF9SQVRFOwotCi0JCXJldCA9IHZvaXBfZ2V0X3JhdGVfdHlwZShwcnRkLT5tb2RlLAotCQkJCQkgcHJ0ZC0+ZXZyY19tYXhfcmF0ZSwKLQkJCQkJICZldnJjX21heF9yYXRlX3R5cGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlcygpOiBmYWlsIGF0IGdldHRpbmcgbWF4IHJhdGUsIHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlpZiAoZXZyY19tYXhfcmF0ZV90eXBlID09IFZPQ18wX1JBVEUpCi0JCQlldnJjX21heF9yYXRlX3R5cGUgPSBWT0NfMV9SQVRFOwotCi0JCWlmIChldnJjX21heF9yYXRlX3R5cGUgPCBldnJjX21pbl9yYXRlX3R5cGUpIHsKLQkJCXByX2VycigiJXMoKTogSW52YWxpZCBFVlJDIG1pbiBtYXggcmF0ZXM6ICVkLCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgZXZyY19taW5fcmF0ZV90eXBlLAotCQkJCWV2cmNfbWF4X3JhdGVfdHlwZSk7Ci0KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcHJfZGVidWcoIiVzKCk6IG1pbiByYXRlPSVkLCBtYXggcmF0ZT0lZFxuIiwKLQkJCSAgX19mdW5jX18sIGV2cmNfbWluX3JhdGVfdHlwZSwgZXZyY19tYXhfcmF0ZV90eXBlKTsKLQl9Ci0JcmV0ID0gdm9pcF9nZXRfbWVkaWFfdHlwZShwcnRkLT5tb2RlLAotCQkJCSAgcHJ0ZC0+cmF0ZV90eXBlLAotCQkJCSAgcHJ0ZC0+cGxheV9zYW1wX3JhdGUsCi0JCQkJICAmbWVkaWFfdHlwZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlcygpOiBmYWlsIGF0IGdldHRpbmcgbWVkaWFfdHlwZSwgcmV0PSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlwcl9kZWJ1ZygiJXMoKTogbWVkaWFfdHlwZT0lZFxuIiwgX19mdW5jX18sIG1lZGlhX3R5cGUpOwotCi0JaWYgKChwcnRkLT5wbGF5X3NhbXBfcmF0ZSA9PSA4MDAwICYmIHBydGQtPmNhcF9zYW1wX3JhdGUgPT0gODAwMCkgfHwKLQkgICAgKHBydGQtPnBsYXlfc2FtcF9yYXRlID09IDE2MDAwICYmIHBydGQtPmNhcF9zYW1wX3JhdGUgPT0gMTYwMDApIHx8Ci0JICAgIChwcnRkLT5wbGF5X3NhbXBfcmF0ZSA9PSAzMjAwMCAmJiBwcnRkLT5jYXBfc2FtcF9yYXRlID09IDMyMDAwKSB8fAotCSAgICAocHJ0ZC0+cGxheV9zYW1wX3JhdGUgPT0gNDgwMDAgJiYgcHJ0ZC0+Y2FwX3NhbXBfcmF0ZSA9PSA0ODAwMCkpIHsKLQkJdm9jX2NvbmZpZ192b2NvZGVyKG1lZGlhX3R5cGUsIHJhdGVfdHlwZSwKLQkJCQkgICBWU1NfTkVUV09SS19JRF9WT0lQLAotCQkJCSAgIHZvaXBfaW5mby5kdHhfbW9kZSwKLQkJCQkgICBldnJjX21pbl9yYXRlX3R5cGUsCi0JCQkJICAgZXZyY19tYXhfcmF0ZV90eXBlKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgcmF0ZSBwbGF5YmFjayAlZCwgY2FwdHVyZSAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcHJ0ZC0+cGxheV9zYW1wX3JhdGUsCi0JCQkgcHJ0ZC0+Y2FwX3NhbXBfcmF0ZSk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci1kb25lOgotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgdm9pcF9kcnZfaW5mbyAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnBydGQtPmxvY2spOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCXJldCA9IG1zbV9wY21fcGxheWJhY2tfcHJlcGFyZShzdWJzdHJlYW0pOwotCWVsc2UgaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKLQkJcmV0ID0gbXNtX3BjbV9jYXB0dXJlX3ByZXBhcmUoc3Vic3RyZWFtKTsKLQotCWlmIChwcnRkLT5wbGF5YmFja19wcmVwYXJlICYmIHBydGQtPmNhcHR1cmVfcHJlcGFyZQotCSAgICAmJiAocHJ0ZC0+c3RhdGUgIT0gVk9JUF9TVEFSVEVEKSkgewotCQlyZXQgPSB2b2lwX2NvbmZpZ192b2NvZGVyKHN1YnN0cmVhbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzKCk6IGZhaWwgYXQgY29uZmlndXJpbmcgdm9jb2RlciBmb3Igdm9pcCwgcmV0PSVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCi0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkvKiBJbml0aWFsYWl6aW5nIGNiIHZhcmlhYmxlcyAqLwotCQl2b2NfcmVnaXN0ZXJfbXZzX2NiKHZvaXBfcHJvY2Vzc191bF9wa3QsCi0JCQkJICAgIHZvaXBfcHJvY2Vzc19kbF9wa3QsCi0JCQkJICAgIHZvaXBfc3NyX2NiX2ZuLCBwcnRkKTsKLQotCQlyZXQgPSB2b2Nfc3RhcnRfdm9pY2VfY2FsbCgKLQkJCQl2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogdm9jX3N0YXJ0X3ZvaWNlX2NhbGwoKSBmYWlsZWQgZXJyICVkIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQotCQkJZ290byBkb25lOwotCQl9Ci0JCXBydGQtPnN0YXRlID0gVk9JUF9TVEFSVEVEOwotCX0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAotbXNtX3BjbV9wbGF5YmFja19wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAocHJ0ZC0+cGNtX3BsYXliYWNrX2lycV9wb3MgPj0gcHJ0ZC0+cGNtX3NpemUpCi0JCXBydGQtPnBjbV9wbGF5YmFja19pcnFfcG9zID0gMDsKLQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChwcnRkLT5wY21fcGxheWJhY2tfaXJxX3BvcykpOwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QKLW1zbV9wY21fY2FwdHVyZV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHZvaXBfZHJ2X2luZm8gKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAocHJ0ZC0+cGNtX2NhcHR1cmVfaXJxX3BvcyA+PSBwcnRkLT5wY21fY2FwdHVyZV9zaXplKQotCQlwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zID0gMDsKLQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIChwcnRkLT5wY21fY2FwdHVyZV9pcnFfcG9zKSk7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBtc21fcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc25kX3BjbV91ZnJhbWVzX3QgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQlyZXQgPSBtc21fcGNtX3BsYXliYWNrX3BvaW50ZXIoc3Vic3RyZWFtKTsKLQllbHNlIGlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJldCA9IG1zbV9wY21fY2FwdHVyZV9wb2ludGVyKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JZG1hX21tYXBfY29oZXJlbnQoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAotCQkJCSAgICAgcnVudGltZS0+ZG1hX2FyZWEsCi0JCQkJICAgICBydW50aW1lLT5kbWFfYWRkciwKLQkJCQkgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmRtYV9idWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCXN0cnVjdCB2b2lwX2J1Zl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0JaW50IGkgPSAwLCBvZmZzZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiB2b2lwXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlkbWFfYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQlkbWFfYnVmLT5kZXYuZGV2ID0gc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldjsKLQlkbWFfYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCi0JZG1hX2J1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChzdWJzdHJlYW0tPnBjbS0+Y2FyZC0+ZGV2LAotCQkJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCwKLQkJCSZkbWFfYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRtYV9idWYtPmFyZWEpIHsKLQkJcHJfZXJyKCIlczpNU00gVk9JUCBkbWFfYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkbWFfYnVmLT5ieXRlcyA9IHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXg7Ci0JbWVtc2V0KGRtYV9idWYtPmFyZWEsIDAsIHJ1bnRpbWUtPmh3LmJ1ZmZlcl9ieXRlc19tYXgpOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJZm9yIChpID0gMDsgaSA8IFZPSVBfTUFYX1FfTEVOOyBpKyspIHsKLQkJCWJ1Zl9ub2RlID0gKHZvaWQgKilkbWFfYnVmLT5hcmVhICsgb2Zmc2V0OwotCi0JCQlsaXN0X2FkZF90YWlsKCZidWZfbm9kZS0+bGlzdCwKLQkJCQkJJnZvaXBfaW5mby5mcmVlX2luX3F1ZXVlKTsKLQkJCW9mZnNldCA9IG9mZnNldCArIHNpemVvZihzdHJ1Y3Qgdm9pcF9idWZfbm9kZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgVk9JUF9NQVhfUV9MRU47IGkrKykgewotCQkJYnVmX25vZGUgPSAodm9pZCAqKSBkbWFfYnVmLT5hcmVhICsgb2Zmc2V0OwotCQkJbGlzdF9hZGRfdGFpbCgmYnVmX25vZGUtPmxpc3QsCi0JCQkJCSZ2b2lwX2luZm8uZnJlZV9vdXRfcXVldWUpOwotCQkJb2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCB2b2lwX2J1Zl9ub2RlKTsKLQkJfQotCX0KLQotCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOwotCi0Jc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92b2lwX21vZGVfY29uZmlnX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JbXV0ZXhfbG9jaygmdm9pcF9pbmZvLmxvY2spOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2b2lwX2luZm8ubW9kZTsKLQotCW11dGV4X3VubG9jaygmdm9pcF9pbmZvLmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZvaXBfbW9kZV9jb25maWdfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQltdXRleF9sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQl2b2lwX2luZm8ubW9kZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcHJfZGVidWcoIiVzOiBtb2RlPSVkXG4iLCBfX2Z1bmNfXywgdm9pcF9pbmZvLm1vZGUpOwotCi0JbXV0ZXhfdW5sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdm9pcF9yYXRlX2NvbmZpZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByZXQgPSAwOwotCWludCByYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQltdXRleF9sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlpZiAodm9pcF9pbmZvLnJhdGUgIT0gcmF0ZSkgewotCQl2b2lwX2luZm8ucmF0ZSA9IHJhdGU7Ci0JCXByX2RlYnVnKCIlczogcmF0ZT0lZFxuIiwgX19mdW5jX18sIHZvaXBfaW5mby5yYXRlKTsKLQotCQlpZiAodm9pcF9pbmZvLnN0YXRlID09IFZPSVBfU1RBUlRFRCAmJgotCQkgICAodm9pcF9pbmZvLm1vZGUgPT0gTU9ERV9BTVIgfHwKLQkJICAgIHZvaXBfaW5mby5tb2RlID09IE1PREVfQU1SX1dCKSkgewotCQkJcmV0ID0gdm9pcF9jb25maWdfdm9jb2RlcigKLQkJCQkJdm9pcF9pbmZvLmNhcHR1cmVfc3Vic3RyZWFtKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOkZhaWxlZCB0byBjb25maWd1cmUgdm9jb2RlciwgcmV0PSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQotCQkJcmV0ID0gdm9jX3VwZGF0ZV9hbXJfdm9jb2Rlcl9yYXRlKAotCQkJCQl2b2NfZ2V0X3Nlc3Npb25faWQoVk9JUF9TRVNTSU9OX05BTUUpKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOkZhaWxlZCB0byB1cGRhdGUgQU1SIHJhdGUsIHJldD0lZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQltdXRleF9sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHZvaXBfaW5mby5ldnJjX21pbl9yYXRlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdm9pcF9pbmZvLmV2cmNfbWF4X3JhdGU7Ci0KLQltdXRleF91bmxvY2soJnZvaXBfaW5mby5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV92b2lwX2V2cmNfbWluX21heF9yYXRlX2NvbmZpZ19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQltdXRleF9sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQl2b2lwX2luZm8uZXZyY19taW5fcmF0ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXZvaXBfaW5mby5ldnJjX21heF9yYXRlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07Ci0KLQlwcl9kZWJ1ZygiJXMoKTogZXZyY19taW5fcmF0ZT0lZCxldnJjX21heF9yYXRlPSVkXG4iLCBfX2Z1bmNfXywKLQkJICB2b2lwX2luZm8uZXZyY19taW5fcmF0ZSwgdm9pcF9pbmZvLmV2cmNfbWF4X3JhdGUpOwotCi0JbXV0ZXhfdW5sb2NrKCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2b2lwX2dldF9yYXRlX3R5cGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgcmF0ZSwKLQkJCQkgdWludDMyX3QgKnJhdGVfdHlwZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTU9ERV9BTVI6IHsKLQkJc3dpdGNoIChyYXRlKSB7Ci0JCWNhc2UgNDc1MDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV80NzUwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTE1MDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV81MTUwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTkwMDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV81OTAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjcwMDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV82NzAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNzQwMDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV83NDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNzk1MDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV83OTUwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTAyMDA6Ci0JCQkqcmF0ZV90eXBlID0gQU1SX1JBVEVfMTAyMDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjIwMDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV8xMjIwMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJ3cm9uZyByYXRlIGZvciBBTVIgTkIuXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNT0RFX0FNUl9XQjogewotCQlzd2l0Y2ggKHJhdGUpIHsKLQkJY2FzZSA2NjAwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzY2MDAgLSBBTVJfUkFURV82NjAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgODg1MDoKLQkJCSpyYXRlX3R5cGUgPSBBTVJfUkFURV84ODUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDEyNjUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzEyNjUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDE0MjUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzE0MjUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDE1ODUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzE1ODUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDE4MjUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzE4MjUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDE5ODUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzE5ODUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDIzMDUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzIzMDUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQljYXNlIDIzODUwOgotCQkJKnJhdGVfdHlwZSA9IEFNUl9SQVRFXzIzODUwIC0gQU1SX1JBVEVfNjYwMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJ3cm9uZyByYXRlIGZvciBBTVJfV0IuXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNT0RFX1BDTTogewotCQkqcmF0ZV90eXBlID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgTU9ERV9JUzEyNzoKLQljYXNlIE1PREVfNEdWX05COgotCWNhc2UgTU9ERV80R1ZfV0I6IHsKLQkJc3dpdGNoIChyYXRlKSB7Ci0JCWNhc2UgVk9DXzBfUkFURToKLQkJY2FzZSBWT0NfOF9SQVRFOgotCQljYXNlIFZPQ180X1JBVEU6Ci0JCWNhc2UgVk9DXzJfUkFURToKLQkJY2FzZSBWT0NfMV9SQVRFOgotCQkJKnJhdGVfdHlwZSA9IHJhdGU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2Vycigid3JvbmcgcmF0ZSBmb3IgSVMxMjcvNEdWX05CL1dCLlxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgTU9ERV80R1ZfTlc6IHsKLQkJc3dpdGNoIChyYXRlKSB7Ci0JCWNhc2UgVk9DXzBfUkFURToKLQkJY2FzZSBWT0NfOF9SQVRFOgotCQljYXNlIFZPQ180X1JBVEU6Ci0JCWNhc2UgVk9DXzJfUkFURToKLQkJY2FzZSBWT0NfMV9SQVRFOgotCQljYXNlIFZPQ184X1JBVEVfTkM6Ci0JCQkqcmF0ZV90eXBlID0gcmF0ZTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJ3cm9uZyByYXRlIGZvciA0R1ZfTlcuXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBNT0RFX0c3MTE6Ci0JY2FzZSBNT0RFX0c3MTFBOgotCQkqcmF0ZV90eXBlID0gcmF0ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCJ3cm9uZyBtb2RlIHR5cGUuXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzLCBtb2RlPSVkLCByYXRlPSV1LCByYXRlX3R5cGU9JWRcbiIsCi0JCV9fZnVuY19fLCBtb2RlLCByYXRlLCAqcmF0ZV90eXBlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaXBfZ2V0X21lZGlhX3R5cGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgcmF0ZV90eXBlLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBzYW1wX3JhdGUsCi0JCQkgICAgICAgdW5zaWduZWQgaW50ICptZWRpYV90eXBlKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBtb2RlPSVkLCBzYW1wX3JhdGU9JWRcbiIsIF9fZnVuY19fLAotCQltb2RlLCBzYW1wX3JhdGUpOwotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgTU9ERV9BTVI6Ci0JCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX0FNUl9OQl9NT0RFTTsKLQkJYnJlYWs7Ci0JY2FzZSBNT0RFX0FNUl9XQjoKLQkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfQU1SX1dCX01PREVNOwotCQlicmVhazsKLQljYXNlIE1PREVfUENNOgotCQlpZiAoc2FtcF9yYXRlID09IDgwMDApCi0JCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF9QQ01fOF9LSFo7Ci0JCWVsc2UgaWYgKHNhbXBfcmF0ZSA9PSAxNjAwMCkKLQkJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX1BDTV8xNl9LSFo7Ci0JCWVsc2UgaWYgKHNhbXBfcmF0ZSA9PSAzMjAwMCkKLQkJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX1BDTV8zMl9LSFo7Ci0JCWVsc2UKLQkJCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX1BDTV80OF9LSFo7Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV9JUzEyNzogLyogRVZSQy1BICovCi0JCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEX0VWUkNfTU9ERU07Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV80R1ZfTkI6IC8qIEVWUkMtQiAqLwotCQkqbWVkaWFfdHlwZSA9IFZTU19NRURJQV9JRF80R1ZfTkJfTU9ERU07Ci0JCWJyZWFrOwotCWNhc2UgTU9ERV80R1ZfV0I6IC8qIEVWUkMtV0IgKi8KLQkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfNEdWX1dCX01PREVNOwotCQlicmVhazsKLQljYXNlIE1PREVfNEdWX05XOiAvKiBFVlJDLU5XICovCi0JCSptZWRpYV90eXBlID0gVlNTX01FRElBX0lEXzRHVl9OV19NT0RFTTsKLQkJYnJlYWs7Ci0JY2FzZSBNT0RFX0c3MTE6Ci0JY2FzZSBNT0RFX0c3MTFBOgotCQlpZiAocmF0ZV90eXBlID09IE1WU19HNzExQV9NT0RFX01VTEFXKQotCQkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfRzcxMV9NVUxBVzsKLQkJZWxzZQotCQkJKm1lZGlhX3R5cGUgPSBWU1NfTUVESUFfSURfRzcxMV9BTEFXOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiIGlucHV0IG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBtZWRpYV90eXBlIGlzIDB4JXhcbiIsIF9fZnVuY19fLCAqbWVkaWFfdHlwZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbXNtX3BjbV9vcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gbXNtX3BjbV9vcGVuLAotCS5jb3B5CQk9IG1zbV9wY21fY29weSwKLQkuaHdfcGFyYW1zCT0gbXNtX3BjbV9od19wYXJhbXMsCi0JLmNsb3NlICAgICAgICAgID0gbXNtX3BjbV9jbG9zZSwKLQkucHJlcGFyZSAgICAgICAgPSBtc21fcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgICAgICAgID0gbXNtX3BjbV90cmlnZ2VyLAotCS5wb2ludGVyICAgICAgICA9IG1zbV9wY21fcG9pbnRlciwKLQkubW1hcAkJPSBtc21fcGNtX21tYXAsCi19OwotCi1zdGF0aWMgaW50IG1zbV9hc29jX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIm1zbV9hc29jX3BjbV9uZXdcbiIpOwotCWlmICghY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzaykKLQkJY2FyZC0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0gewotCS5vcHMJCT0gJm1zbV9wY21fb3BzLAotCS5wY21fbmV3CT0gbXNtX2Fzb2NfcGNtX25ldywKLQkucHJvYmUJCT0gbXNtX3BjbV92b2lwX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBtc21fcGNtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJjOwotCi0JaWYgKCFpc192b2NfaW5pdGlhbGl6ZWQoKSkgewotCQlwcl9kZWJ1ZygiJXM6IHZvaWNlIG1vZHVsZSBub3QgaW5pdGlhbGl6ZWQgeWV0LCBkZWZlcnJpbmcgcHJvYmUoKVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQotCQlyYyA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IHZvY19hbGxvY19jYWxfc2hhcmVkX21lbW9yeSgpOwotCWlmIChyYyA9PSAtRVBST0JFX0RFRkVSKSB7Ci0JCXByX2RlYnVnKCIlczogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGNhbGlicmF0aW9uIGRlZmVycmVkICVkXG4iLAotCQkJIF9fZnVuY19fLCByYyk7Ci0KLQkJZ290byBkb25lOwotCX0gZWxzZSBpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjYWxpYnJhdGlvbiBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCX0KLQotCXJjID0gdm9jX2FsbG9jX3ZvaXBfc2hhcmVkX21lbW9yeSgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyBzaGFyZWQgbWVtIGVyciAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JfQotCi0KLQlwcl9kZWJ1ZygiJXM6IGRldiBuYW1lICVzXG4iLCBfX2Z1bmNfXywgZGV2X25hbWUoJnBkZXYtPmRldikpOwotCXJjID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LAotCQkJCSAgICAgICAmbXNtX3NvY19wbGF0Zm9ybSk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IG1zbV9wY21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtc21fdm9pcF9kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS12b2lwLWRzcCJ9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXNtX3ZvaXBfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcGNtX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tdm9pcC1kc3AiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gbXNtX3ZvaXBfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fcGNtX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fcGNtX3JlbW92ZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1zbV9zb2NfcGxhdGZvcm1faW5pdCh2b2lkKQotewotCW1lbXNldCgmdm9pcF9pbmZvLCAwLCBzaXplb2Yodm9pcF9pbmZvKSk7Ci0Jdm9pcF9pbmZvLm1vZGUgPSBNT0RFX1BDTTsKLQltdXRleF9pbml0KCZ2b2lwX2luZm8ubG9jayk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmdm9pcF9pbmZvLmRzcF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdm9pcF9pbmZvLmRzcF91bF9sb2NrKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZvaXBfaW5mby5vdXRfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdm9pcF9pbmZvLmluX3dhaXQpOwotCi0JSU5JVF9MSVNUX0hFQUQoJnZvaXBfaW5mby5pbl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnZvaXBfaW5mby5mcmVlX2luX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmdm9pcF9pbmZvLm91dF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnZvaXBfaW5mby5mcmVlX291dF9xdWV1ZSk7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fcGNtX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV9wY21fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUENNIG1vZHVsZSBwbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcXRpLXBwLWNvbmZpZy5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODI2ZmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXNtLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0KLSNpbmNsdWRlICJtc20tcXRpLXBwLWNvbmZpZy5oIgotI2luY2x1ZGUgIm1zbS1wY20tcm91dGluZy12Mi5oIgotCi0vKiBFUVVBTElaRVIgKi8KLS8qIEVxdWFsIHRvIEZyb250ZW5kIGFmdGVyIGxhc3Qgb2YgdGhlIE1VTFRJTUVESUEgU0VTU0lPTlMgKi8KLSNkZWZpbmUgTUFYX0VRX1NFU1NJT05TCQlNU01fRlJPTlRFTkRfREFJX0NTX1ZPSUNFCi0KLWVudW0gewotCUVRX0JBTkQxID0gMCwKLQlFUV9CQU5EMiwKLQlFUV9CQU5EMywKLQlFUV9CQU5ENCwKLQlFUV9CQU5ENSwKLQlFUV9CQU5ENiwKLQlFUV9CQU5ENywKLQlFUV9CQU5EOCwKLQlFUV9CQU5EOSwKLQlFUV9CQU5EMTAsCi0JRVFfQkFORDExLAotCUVRX0JBTkQxMiwKLQlFUV9CQU5EX01BWCwKLX07Ci0KLS8qIEF1ZGlvIFNwaGVyZSBkYXRhIHN0cnVjdHVyZXMgKi8KLXN0cnVjdCBtc21fYXVkaW9fcHBfYXNwaGVyZV9zdGF0ZV9zIHsKLQl1aW50MzJfdCBlbmFibGVkOwotCXVpbnQzMl90IHN0cmVuZ3RoOwotCXVpbnQzMl90IG1vZGU7Ci0JdWludDMyX3QgdmVyc2lvbjsKLQlpbnQgIHBvcnRfaWRbQUZFX01BWF9QT1JUU107Ci0JaW50ICBjb3BwX2lkeFtBRkVfTUFYX1BPUlRTXTsKLQlib29sICBpbml0aWFsaXplZDsKLQl1aW50MzJfdCBlbmFibGVkX3ByZXY7Ci0JdWludDMyX3Qgc3RyZW5ndGhfcHJldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2F1ZGlvX3BwX2FzcGhlcmVfc3RhdGVfcyBhc3BoZXJlX3N0YXRlOwotCi1zdHJ1Y3QgbXNtX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcJZXFfZGF0YVtNQVhfRVFfU0VTU0lPTlNdOwotCi1zdGF0aWMgaW50IG1zbV9yb3V0ZV9oZnBfdm9sX2NvbnRyb2w7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGhmcF9yeF92b2xfZ2FpbiwgMCwKLQkJCQlJTlRfUlhfVk9MX01BWF9TVEVQUyk7Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRlX2ljY192b2xfY29udHJvbDsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoaWNjX3J4X3ZvbF9nYWluLCAwLAotCQkJCUlOVF9SWF9WT0xfTUFYX1NURVBTKTsKLQotc3RhdGljIGludCBtc21fcm91dGVfcHJpX2F1eHBjbV9sYl92b2xfY3RybDsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIocHJpX2F1eHBjbV9sYl92b2xfZ2FpbiwgMCwKLQkJCQlJTlRfUlhfVk9MX01BWF9TVEVQUyk7Ci0KLXN0YXRpYyBpbnQgbXNtX3JvdXRlX3NlY19hdXhwY21fbGJfdm9sX2N0cmw7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKHNlY19hdXhwY21fbGJfdm9sX2dhaW4sIDAsCi0JCQkJSU5UX1JYX1ZPTF9NQVhfU1RFUFMpOwotCi1zdGF0aWMgaW50IG1zbV9tdWx0aWNoYW5uZWxfZWNfcHJpbWFyeV9taWNfY2g7Ci0KLXN0YXRpYyB2b2lkIG1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXNfKGludCBlcV9pZHgpCi17Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgbXNtX3BjbV9yb3V0aW5nX2ZkYWlfZGF0YSBmZV9kYWk7Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMgPSBOVUxMOwotCi0JbXNtX3BjbV9yb3V0aW5nX2dldF9mZWRhaV9pbmZvKGVxX2lkeCwgU0VTU0lPTl9UWVBFX1JYLCAmZmVfZGFpKTsKLQlhYyA9IHE2YXNtX2dldF9hdWRpb19jbGllbnQoZmVfZGFpLnN0cm1faWQpOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBhdWRpbyBjbGllbnQgZm9yIHNlc3Npb246ICVkXG4iLAotCQkgICAgICBfX2Z1bmNfXywgZmVfZGFpLnN0cm1faWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmVzdWx0ID0gcTZhc21fZXF1YWxpemVyKGFjLCAmZXFfZGF0YVtlcV9pZHhdKTsKLQotCWlmIChyZXN1bHQgPCAwKQotCQlwcl9lcnIoIiVzOiBDYWxsIHRvIEFTTSBlcXVhbGl6ZXIgZmFpbGVkLCByZXR1cm5lZCA9ICVkXG4iLAotCQkgICAgICBfX2Z1bmNfXywgcmVzdWx0KTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X2VxX2VuYWJsZV9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgZXFfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0KLQlpZiAoKGVxX2lkeCA8IDApIHx8IChlcV9pZHggPj0gTUFYX0VRX1NFU1NJT05TKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVxX2RhdGFbZXFfaWR4XS5lbmFibGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVRICMlZCBlbmFibGUgJWRcbiIsIF9fZnVuY19fLAotCQllcV9pZHgsIGVxX2RhdGFbZXFfaWR4XS5lbmFibGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfcHV0X2VxX2VuYWJsZV9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgZXFfaWR4ID0gKChzdHJ1Y3Qgc29jX211bHRpX21peGVyX2NvbnRyb2wgKikKLQkJCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpLT5yZWc7Ci0JaW50IHZhbHVlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlpZiAoKGVxX2lkeCA8IDApIHx8IChlcV9pZHggPj0gTUFYX0VRX1NFU1NJT05TKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcHJfZGVidWcoIiVzOiBFUSAjJWQgZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywKLQkJZXFfaWR4LCB2YWx1ZSk7Ci0JZXFfZGF0YVtlcV9pZHhdLmVuYWJsZSA9IHZhbHVlOwotCW1zbV9wY21fcm91dGluZ19hY3F1aXJlX2xvY2soKTsKLQltc21fcXRpX3BwX3NlbmRfZXFfdmFsdWVzXyhlcV9pZHgpOwotCW1zbV9wY21fcm91dGluZ19yZWxlYXNlX2xvY2soKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGVxX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOwotCi0JaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykpCi0JCXJldHVybiAtRUlOVkFMOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZXFfZGF0YVtlcV9pZHhdLm51bV9iYW5kczsKLQotCXByX2RlYnVnKCIlczogRVEgIyVkIGJhbmRzICVkXG4iLCBfX2Z1bmNfXywKLQkJZXFfaWR4LCBlcV9kYXRhW2VxX2lkeF0ubnVtX2JhbmRzKTsKLQlyZXR1cm4gZXFfZGF0YVtlcV9pZHhdLm51bV9iYW5kczsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGVxX2lkeCA9ICgoc3RydWN0IHNvY19tdWx0aV9taXhlcl9jb250cm9sICopCi0JCQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKS0+cmVnOwotCWludCB2YWx1ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJfZGVidWcoIiVzOiBFUSAjJWQgYmFuZHMgJWRcbiIsIF9fZnVuY19fLAotCQllcV9pZHgsIHZhbHVlKTsKLQllcV9kYXRhW2VxX2lkeF0ubnVtX2JhbmRzID0gdmFsdWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBlcV9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykgfHwKLQkgICAgKGJhbmRfaWR4IDwgRVFfQkFORDEpIHx8IChiYW5kX2lkeCA+PSBFUV9CQU5EX01BWCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5iYW5kX2lkeDsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9Ci0JCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmZpbHRlcl90eXBlOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzJdID0KLQkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uY2VudGVyX2ZyZXFfaHo7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbM10gPQotCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5maWx0ZXJfZ2FpbjsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XSA9Ci0JCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLnFfZmFjdG9yOwotCi0JcHJfZGVidWcoIiVzOiBiYW5kX2lkeCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uYmFuZF9pZHgpOwotCXByX2RlYnVnKCIlczogZmlsdGVyX3R5cGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmZpbHRlcl90eXBlKTsKLQlwcl9kZWJ1ZygiJXM6IGNlbnRlcl9mcmVxX2h6ID0gJWRcbiIsIF9fZnVuY19fLAotCQkJZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5jZW50ZXJfZnJlcV9oeik7Ci0JcHJfZGVidWcoIiVzOiBmaWx0ZXJfZ2FpbiA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uZmlsdGVyX2dhaW4pOwotCXByX2RlYnVnKCIlczogcV9mYWN0b3IgPSAlZFxuIiwgX19mdW5jX18sCi0JCQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLnFfZmFjdG9yKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBlcV9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnJlZzsKLQlpbnQgYmFuZF9pZHggPSAoKHN0cnVjdCBzb2NfbXVsdGlfbWl4ZXJfY29udHJvbCAqKQotCQkJCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSktPnNoaWZ0OwotCi0JaWYgKChlcV9pZHggPCAwKSB8fCAoZXFfaWR4ID49IE1BWF9FUV9TRVNTSU9OUykgfHwKLQkgICAgKGJhbmRfaWR4IDwgRVFfQkFORDEpIHx8IChiYW5kX2lkeCA+PSBFUV9CQU5EX01BWCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5iYW5kX2lkeCA9Ci0JCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0uZmlsdGVyX3R5cGUgPQotCQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKLQllcV9kYXRhW2VxX2lkeF0uZXFfYmFuZHNbYmFuZF9pZHhdLmNlbnRlcl9mcmVxX2h6ID0KLQkJCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMl07Ci0JZXFfZGF0YVtlcV9pZHhdLmVxX2JhbmRzW2JhbmRfaWR4XS5maWx0ZXJfZ2FpbiA9Ci0JCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzNdOwotCWVxX2RhdGFbZXFfaWR4XS5lcV9iYW5kc1tiYW5kX2lkeF0ucV9mYWN0b3IgPQotCQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVs0XTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19RVElfUFAKLXZvaWQgbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlcyhpbnQgZmVkYWlfaWQpCi17Ci0JaWYgKGVxX2RhdGFbZmVkYWlfaWRdLmVuYWJsZSkKLQkJbXNtX3F0aV9wcF9zZW5kX2VxX3ZhbHVlc18oZmVkYWlfaWQpOwotfQotCi0vKiBDVVNUT00gTUlYSU5HICovCi1pbnQgbXNtX3F0aV9wcF9zZW5kX3N0ZXJlb190b19jdXN0b21fc3RlcmVvX2NtZChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJCQkJdW5zaWduZWQgaW50IHNlc3Npb25faWQsCi0JCQkJCQl1aW50MTZfdCBvcF9GTF9pcF9GTF93ZWlnaHQsCi0JCQkJCQl1aW50MTZfdCBvcF9GTF9pcF9GUl93ZWlnaHQsCi0JCQkJCQl1aW50MTZfdCBvcF9GUl9pcF9GTF93ZWlnaHQsCi0JCQkJCQl1aW50MTZfdCBvcF9GUl9pcF9GUl93ZWlnaHQpCi17Ci0JY2hhciAqcGFyYW1zX3ZhbHVlOwotCWludCAqdXBkYXRlX3BhcmFtc192YWx1ZTMyLCByYyA9IDA7Ci0JaW50MTZfdCAqdXBkYXRlX3BhcmFtc192YWx1ZTE2ID0gMDsKLQl1aW50MzJfdCBwYXJhbXNfbGVuZ3RoID0gQ1VTVE9NX1NURVJFT19QQVlMT0FEX1NJWkUgKiBzaXplb2YodWludDMyX3QpOwotCXVpbnQzMl90IGF2YWlsX2xlbmd0aCA9IHBhcmFtc19sZW5ndGg7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgLSAlZCwgc2Vzc2lvbiBpZCAtICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwKLQkJIHNlc3Npb25faWQpOwotCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbXNfdmFsdWUpIHsKLQkJcHJfZXJyKCIlcywgcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXVwZGF0ZV9wYXJhbXNfdmFsdWUzMiA9IChpbnQgKilwYXJhbXNfdmFsdWU7Ci0JaWYgKGF2YWlsX2xlbmd0aCA8IDIgKiBzaXplb2YodWludDMyX3QpKQotCQlnb3RvIHNraXBfc2VuZF9jbWQ7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUzMisrID0gTVRNWF9NT0RVTEVfSURfREVGQVVMVF9DSE1JWEVSOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMzIrKyA9IERFRkFVTFRfQ0hNSVhFUl9QQVJBTV9JRF9DT0VGRjsKLQlhdmFpbF9sZW5ndGggPSBhdmFpbF9sZW5ndGggLSAoMiAqIHNpemVvZih1aW50MzJfdCkpOwotCi0JdXBkYXRlX3BhcmFtc192YWx1ZTE2ID0gKGludDE2X3QgKil1cGRhdGVfcGFyYW1zX3ZhbHVlMzI7Ci0JaWYgKGF2YWlsX2xlbmd0aCA8IDEwICogc2l6ZW9mKHVpbnQxNl90KSkKLQkJZ290byBza2lwX3NlbmRfY21kOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IENVU1RPTV9TVEVSRU9fQ01EX1BBUkFNX1NJWkU7Ci0JLypmb3IgYWxpZ25tZW50IG9ubHkqLwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IDA7Ci0JLyppbmRleCBpcyAzMi1iaXQgcGFyYW0gaW4gbGl0dGxlIGVuZGlhbiovCi0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19JTkRFWF9QQVJBTTsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSAwOwotCS8qZm9yIHN0ZXJlbyBtaXhpbmcgbnVtIG91dCBjaCovCi0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gQ1VTVE9NX1NURVJFT19OVU1fT1VUX0NIOwotCS8qZm9yIHN0ZXJlbyBtaXhpbmcgbnVtIGluIGNoKi8KLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBDVVNUT01fU1RFUkVPX05VTV9JTl9DSDsKLQotCS8qIE91dCBjaCBtYXAgRkwvRlIqLwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IFBDTV9DSEFOTkVMX0ZMOwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IFBDTV9DSEFOTkVMX0ZSOwotCi0JLyogSW4gY2ggbWFwIEZML0ZSKi8KLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GTDsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBQQ01fQ0hBTk5FTF9GUjsKLQlhdmFpbF9sZW5ndGggPSBhdmFpbF9sZW5ndGggLSAoMTAgKiBzaXplb2YodWludDE2X3QpKTsKLQkvKiB3ZWlnaHRpbmcgY29lZmZpY2llbnRzIGFzIG5hbWUgc3VnZ2VzdHMsCi0JICogbWl4aW5nIHdpbGwgYmUgZG9uZSBhY2NvcmRpbmcgdG8gdGhlc2UgY29lZmZpY2llbnRzCi0JICovCi0JaWYgKGF2YWlsX2xlbmd0aCA8IDQgKiBzaXplb2YodWludDE2X3QpKQotCQlnb3RvIHNraXBfc2VuZF9jbWQ7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gb3BfRkxfaXBfRkxfd2VpZ2h0OwotCSp1cGRhdGVfcGFyYW1zX3ZhbHVlMTYrKyA9IG9wX0ZMX2lwX0ZSX3dlaWdodDsKLQkqdXBkYXRlX3BhcmFtc192YWx1ZTE2KysgPSBvcF9GUl9pcF9GTF93ZWlnaHQ7Ci0JKnVwZGF0ZV9wYXJhbXNfdmFsdWUxNisrID0gb3BfRlJfaXBfRlJfd2VpZ2h0OwotCWF2YWlsX2xlbmd0aCA9IGF2YWlsX2xlbmd0aCAtICg0ICogc2l6ZW9mKHVpbnQxNl90KSk7Ci0JaWYgKHBhcmFtc19sZW5ndGgpIHsKLQkJcmMgPSBhZG1fc2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvKHBvcnRfaWQsCi0JCQkJCQkgICAgIGNvcHBfaWR4LAotCQkJCQkJICAgICBzZXNzaW9uX2lkLAotCQkJCQkJICAgICBwYXJhbXNfdmFsdWUsCi0JCQkJCQkgICAgIHBhcmFtc19sZW5ndGgpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IHNlbmQgcGFyYW1zIGZhaWxlZCByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlrZnJlZShwYXJhbXNfdmFsdWUpOwotCXJldHVybiAwOwotc2tpcF9zZW5kX2NtZDoKLQkJcHJfZXJyKCIlczogaW5zdWZmaWNpZW50IG1lbW9yeSwgc2VuZCBjbWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlrZnJlZShwYXJhbXNfdmFsdWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUVRJX1BQICovCi0KLS8qIFJNUyAqLwotc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9ybXNfdmFsdWVfY29udHJvbChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0JaW50IGJlX2lkeCA9IDAsIGNvcHBfaWR4OwotCWNoYXIgKnBhcmFtX3ZhbHVlOwotCWludCAqdXBkYXRlX3BhcmFtX3ZhbHVlOwotCXVpbnQzMl90IHBhcmFtX2xlbmd0aCA9IHNpemVvZih1aW50MzJfdCk7Ci0JdWludDMyX3QgcGFyYW1fcGF5bG9hZF9sZW4gPSBSTVNfUEFZTE9BRF9MRU4gKiBzaXplb2YodWludDMyX3QpOwotCXN0cnVjdCBtc21fcGNtX3JvdXRpbmdfYmRhaV9kYXRhIG1zbV9iZWRhaTsKLQotCXBhcmFtX3ZhbHVlID0ga3phbGxvYyhwYXJhbV9sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbV92YWx1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltc21fcGNtX3JvdXRpbmdfYWNxdWlyZV9sb2NrKCk7Ci0JZm9yIChiZV9pZHggPSAwOyBiZV9pZHggPCBNU01fQkFDS0VORF9EQUlfTUFYOyBiZV9pZHgrKykgewotCQltc21fcGNtX3JvdXRpbmdfZ2V0X2JlZGFpX2luZm8oYmVfaWR4LCAmbXNtX2JlZGFpKTsKLQkJaWYgKG1zbV9iZWRhaS5wb3J0X2lkID09IFNMSU1CVVNfMF9UWCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoKGJlX2lkeCA+PSBNU01fQkFDS0VORF9EQUlfTUFYKSB8fCAhbXNtX2JlZGFpLmFjdGl2ZSkgewotCQlwcl9lcnIoIiVzLCBiYWNrIG5vdCBhY3RpdmUgdG8gcXVlcnkgcm1zIGJlX2lkeDolZFxuIiwKLQkJCV9fZnVuY19fLCBiZV9pZHgpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZ2V0X3Jtc192YWx1ZV9lcnI7Ci0JfQotCWNvcHBfaWR4ID0gYWRtX2dldF9kZWZhdWx0X2NvcHBfaWR4KFNMSU1CVVNfMF9UWCk7Ci0JaWYgKChjb3BwX2lkeCA8IDApIHx8IChjb3BwX2lkeCA+IE1BWF9DT1BQU19QRVJfUE9SVCkpIHsKLQkJcHJfZXJyKCIlcywgbm8gYWN0aXZlIGNvcHAgdG8gcXVlcnkgcm1zIGNvcHBfaWR4OiVkXG4iLAotCQkJX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGdldF9ybXNfdmFsdWVfZXJyOwotCX0KLQlyYyA9IGFkbV9nZXRfcGFyYW1zKFNMSU1CVVNfMF9UWCwgY29wcF9pZHgsCi0JCQlSTVNfTU9EVUxFSURfQVBQSV9QQVNTVEhSVSwKLQkJCVJNU19QQVJBTV9GSVJTVF9TQU1QTEUsCi0JCQlwYXJhbV9sZW5ndGggKyBwYXJhbV9wYXlsb2FkX2xlbiwKLQkJCXBhcmFtX3ZhbHVlKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogZ2V0IHBhcmFtZXRlcnMgZmFpbGVkIHJjPSVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZ2V0X3Jtc192YWx1ZV9lcnI7Ci0JfQotCXVwZGF0ZV9wYXJhbV92YWx1ZSA9IChpbnQgKilwYXJhbV92YWx1ZTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHVwZGF0ZV9wYXJhbV92YWx1ZVswXTsKLQotCXByX2RlYnVnKCIlczogRlJPTSBEU1AgdmFsdWVbMF0gMHgleFxuIiwKLQkJX19mdW5jX18sIHVwZGF0ZV9wYXJhbV92YWx1ZVswXSk7Ci1nZXRfcm1zX3ZhbHVlX2VycjoKLQltc21fcGNtX3JvdXRpbmdfcmVsZWFzZV9sb2NrKCk7Ci0Ja2ZyZWUocGFyYW1fdmFsdWUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3B1dF9ybXNfdmFsdWVfY29udHJvbChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCS8qIG5vdCB1c2VkICovCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFZPTFVNRSAqLwotc3RhdGljIGludCBtc21fcm91dGVfZm1fdm9sX2NvbnRyb2w7Ci1zdGF0aWMgaW50IG1zbV9hZmVfbGJfdm9sX2N0cmw7Ci1zdGF0aWMgaW50IG1zbV9hZmVfc2VjX21pMnNfbGJfdm9sX2N0cmw7Ci1zdGF0aWMgaW50IG1zbV9hZmVfdGVydF9taTJzX2xiX3ZvbF9jdHJsOwotc3RhdGljIGludCBtc21fYWZlX3F1YXRfbWkyc19sYl92b2xfY3RybDsKLXN0YXRpYyBpbnQgbXNtX2FmZV9zbGltYnVzXzdfbGJfdm9sX2N0cmw7Ci1zdGF0aWMgaW50IG1zbV9hZmVfc2xpbWJ1c184X2xiX3ZvbF9jdHJsOwotc3RhdGljIGludCBtc21fYXNtX2JpdF93aWR0aDsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoZm1fcnhfdm9sX2dhaW4sIDAsIElOVF9SWF9WT0xfTUFYX1NURVBTKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoYWZlX2xiX3ZvbF9nYWluLCAwLCBJTlRfUlhfVk9MX01BWF9TVEVQUyk7Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfZm1fdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9yb3V0ZV9mbV92b2xfY29udHJvbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3NldF9mbV92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JYWZlX2xvb3BiYWNrX2dhaW4oSU5UX0ZNX1RYLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQltc21fcm91dGVfZm1fdm9sX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hc21fYml0X3dpZHRoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlcyBnZXQgQVNNIGJpdHdpZHRoID0gJWRcbiIsCi0JCV9fZnVuY19fLCBtc21fYXNtX2JpdF93aWR0aCk7Ci0KLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hc21fYml0X3dpZHRoOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FzbV9iaXRfd2lkdGhfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMTY6Ci0JCW1zbV9hc21fYml0X3dpZHRoID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCW1zbV9hc21fYml0X3dpZHRoID0gMjQ7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCW1zbV9hc21fYml0X3dpZHRoID0gMzI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1zbV9hc21fYml0X3dpZHRoID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfcHJpX21pMnNfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hZmVfbGJfdm9sX2N0cmw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfcHJpX21pMnNfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWFmZV9sb29wYmFja19nYWluKEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWCwKLQkJCSAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JbXNtX2FmZV9sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfc2VjX21pMnNfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hZmVfc2VjX21pMnNfbGJfdm9sX2N0cmw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfc2VjX21pMnNfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWFmZV9sb29wYmFja19nYWluKEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYLAotCQkJICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JbXNtX2FmZV9zZWNfbWkyc19sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfdGVydF9taTJzX2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fYWZlX3RlcnRfbWkyc19sYl92b2xfY3RybDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3NldF90ZXJ0X21pMnNfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWFmZV9sb29wYmFja19nYWluKEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFgsCi0JCQkgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQltc21fYWZlX3RlcnRfbWkyc19sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X3NsaW1idXNfN19sYl92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX2FmZV9zbGltYnVzXzdfbGJfdm9sX2N0cmw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfc2xpbWJ1c183X2xiX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmV0ID0gYWZlX2xvb3BiYWNrX2dhaW4oU0xJTUJVU183X1RYLAotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgTEIgdm9sIGZvciBTTElNQlVTXzdfVFgsIGVyciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCWVsc2UKLQkJbXNtX2FmZV9zbGltYnVzXzdfbGJfdm9sX2N0cmwgPQotCQkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9zbGltYnVzXzhfbGJfdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hZmVfc2xpbWJ1c184X2xiX3ZvbF9jdHJsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3NsaW1idXNfOF9sYl92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBhZmVfbG9vcGJhY2tfZ2FpbihTTElNQlVTXzhfVFgsCi0JCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBMQiB2b2wgZm9yIFNMSU1CVVNfOF9UWCIsIF9fZnVuY19fKTsKLQllbHNlCi0JCW1zbV9hZmVfc2xpbWJ1c184X2xiX3ZvbF9jdHJsID0KLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfaWNjX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fcm91dGVfaWNjX3ZvbF9jb250cm9sOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X2ljY192b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JYWRtX3NldF9taWNfZ2FpbihBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWCwKLQkJYWRtX2dldF9kZWZhdWx0X2NvcHBfaWR4KEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYKSwKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCW1zbV9yb3V0ZV9pY2Nfdm9sX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9xdWF0X21pMnNfZm1fdm9sX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV9hZmVfcXVhdF9taTJzX2xiX3ZvbF9jdHJsOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X3F1YXRfbWkyc19mbV92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JYWZlX2xvb3BiYWNrX2dhaW4oQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYLAotCQkJICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQltc21fYWZlX3F1YXRfbWkyc19sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfaGZwX3ZvbF9taXhlcihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fcm91dGVfaGZwX3ZvbF9jb250cm9sOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfc2V0X2hmcF92b2xfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWFmZV9sb29wYmFja19nYWluKElOVF9CVF9TQ09fVFgsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCW1zbV9yb3V0ZV9oZnBfdm9sX2NvbnRyb2wgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfZ2V0X3ByaV9hdXhwY21fbGJfdm9sX21peGVyKAotCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fcm91dGVfcHJpX2F1eHBjbV9sYl92b2xfY3RybDsKLQlwcl9kZWJ1ZygiJXM6IFZvbHVtZSA9ICVsZFxuIiwgX19mdW5jX18sCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX3NldF9wcmlfYXV4cGNtX2xiX3ZvbF9taXhlcigKLQkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQotCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQotCWFmZV9sb29wYmFja19nYWluKG1jLT5yZWcsIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCW1zbV9yb3V0ZV9wcmlfYXV4cGNtX2xiX3ZvbF9jdHJsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fcXRpX3BwX2dldF9zZWNfYXV4cGNtX2xiX3ZvbF9taXhlcigKLQkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX3JvdXRlX3NlY19hdXhwY21fbGJfdm9sX2N0cmw7Ci0JcHJfZGVidWcoIiVzOiBWb2x1bWUgPSAlbGRcbiIsIF9fZnVuY19fLAotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9zZXRfc2VjX2F1eHBjbV9sYl92b2xfbWl4ZXIoCi0JCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQlhZmVfbG9vcGJhY2tfZ2FpbihtYy0+cmVnLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQltc21fcm91dGVfc2VjX2F1eHBjbV9sYl92b2xfY3RybCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9nZXRfY2hhbm5lbF9tYXBfbWl4ZXIoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQljaGFyIGNoYW5uZWxfbWFwW1BDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMXSA9IHswfTsKLQlpbnQgaTsKLQotCWFkbV9nZXRfbXVsdGlfY2hfbWFwKGNoYW5uZWxfbWFwLCBBRE1fUEFUSF9QTEFZQkFDSyk7Ci0JZm9yIChpID0gMDsgaSA8IFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMOyBpKyspCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlW2ldID0KLQkJCSh1bnNpZ25lZCBpbnQpIGNoYW5uZWxfbWFwW2ldOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfcHV0X2NoYW5uZWxfbWFwX21peGVyKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JY2hhciBjaGFubmVsX21hcFtQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUw7IGkrKykKLQkJY2hhbm5lbF9tYXBbaV0gPSAoY2hhcikodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0pOwotCWFkbV9zZXRfbXVsdGlfY2hfbWFwKGNoYW5uZWxfbWFwLCBBRE1fUEFUSF9QTEFZQkFDSyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogQXVkaW8gU3BoZXJlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBtc21fcXRpX3BwX2FzcGhlcmVfaW5pdF9zdGF0ZSh2b2lkKQotewotCWludCBpOwotCi0JaWYgKGFzcGhlcmVfc3RhdGUuaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlhc3BoZXJlX3N0YXRlLmluaXRpYWxpemVkID0gdHJ1ZTsKLQlmb3IgKGkgPSAwOyBpIDwgQUZFX01BWF9QT1JUUzsgaSsrKSB7Ci0JCWFzcGhlcmVfc3RhdGUucG9ydF9pZFtpXSA9IC0xOwotCQlhc3BoZXJlX3N0YXRlLmNvcHBfaWR4W2ldID0gLTE7Ci0JfQotCWFzcGhlcmVfc3RhdGUuZW5hYmxlZCA9IDA7Ci0JYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aCA9IDA7Ci0JYXNwaGVyZV9zdGF0ZS5tb2RlID0gMDsKLQlhc3BoZXJlX3N0YXRlLnZlcnNpb24gPSAwOwotCWFzcGhlcmVfc3RhdGUuZW5hYmxlZF9wcmV2ID0gMDsKLQlhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoX3ByZXYgPSAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9xdGlfcHBfYXNwaGVyZV9zZW5kX3BhcmFtcyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBib29sIGZvcmNlKQotewotCWNoYXIgKnBhcmFtc192YWx1ZSA9IE5VTEw7Ci0JdWludDMyX3QgKnVwZGF0ZV9wYXJhbXNfdmFsdWUgPSBOVUxMOwotCXVpbnQzMl90IHBhcmFtX3NpemUgPSBzaXplb2YodWludDMyX3QpICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOwotCWludCBwYXJhbXNfbGVuZ3RoID0gMCwgcGFyYW1fY291bnQgPSAwLCByZXQgPSAwOwotCWJvb2wgc2V0X2VuYWJsZSA9IGZvcmNlIHx8Ci0JCQkoYXNwaGVyZV9zdGF0ZS5lbmFibGVkICE9IGFzcGhlcmVfc3RhdGUuZW5hYmxlZF9wcmV2KTsKLQlib29sIHNldF9zdHJlbmd0aCA9IGFzcGhlcmVfc3RhdGUuZW5hYmxlZCA9PSAxICYmIChzZXRfZW5hYmxlIHx8Ci0JCShhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoICE9IGFzcGhlcmVfc3RhdGUuc3RyZW5ndGhfcHJldikpOwotCi0JaWYgKHNldF9lbmFibGUpCi0JCXBhcmFtX2NvdW50Kys7Ci0JaWYgKHNldF9zdHJlbmd0aCkKLQkJcGFyYW1fY291bnQrKzsKLQlwYXJhbXNfbGVuZ3RoID0gcGFyYW1fY291bnQgKiBwYXJhbV9zaXplOwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkLCBjb3BwX2lkICVkLCBmb3JjZWQgJWQsIHBhcmFtX2NvdW50ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCBmb3JjZSwgcGFyYW1fY291bnQpOwotCXByX2RlYnVnKCIlczogZW5hYmxlIHByZXY6JXUgY3VyOiV1LCBzdHJlbmd0aCBwcmV2OiV1IGN1cjoldVxuIiwKLQkJX19mdW5jX18sIGFzcGhlcmVfc3RhdGUuZW5hYmxlZF9wcmV2LCBhc3BoZXJlX3N0YXRlLmVuYWJsZWQsCi0JCWFzcGhlcmVfc3RhdGUuc3RyZW5ndGhfcHJldiwgYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aCk7Ci0KLQlpZiAocGFyYW1zX2xlbmd0aCA+IDApCi0JCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1zX2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXJhbXNfdmFsdWUpIHsKLQkJcHJfZXJyKCIlcywgcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXVwZGF0ZV9wYXJhbXNfdmFsdWUgPSAodWludDMyX3QgKilwYXJhbXNfdmFsdWU7Ci0JcGFyYW1zX2xlbmd0aCA9IDA7Ci0JaWYgKHNldF9zdHJlbmd0aCkgewotCQkvKiBhZGQgc3RyZW5ndGggY29tbWFuZCAqLwotCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gQVVEUFJPQ19NT0RVTEVfSURfQVVESU9TUEhFUkU7Ci0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBBVURQUk9DX1BBUkFNX0lEX0FVRElPU1BIRVJFX1NUUkVOR1RIOwotCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IGFzcGhlcmVfc3RhdGUuc3RyZW5ndGg7Ci0JCXBhcmFtc19sZW5ndGggKz0gcGFyYW1fc2l6ZTsKLQl9Ci0JaWYgKHNldF9lbmFibGUpIHsKLQkJLyogYWRkIGVuYWJsZSBjb21tYW5kICovCi0JCSp1cGRhdGVfcGFyYW1zX3ZhbHVlKysgPSBBVURQUk9DX01PRFVMRV9JRF9BVURJT1NQSEVSRTsKLQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IEFVRFBST0NfUEFSQU1fSURfQVVESU9TUEhFUkVfRU5BQkxFOwotCQkqdXBkYXRlX3BhcmFtc192YWx1ZSsrID0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJKnVwZGF0ZV9wYXJhbXNfdmFsdWUrKyA9IGFzcGhlcmVfc3RhdGUuZW5hYmxlZDsKLQkJcGFyYW1zX2xlbmd0aCArPSBwYXJhbV9zaXplOwotCX0KLQlwcl9kZWJ1ZygiJXMsIHBhcmFtIGxlbmd0aDogJWRcbiIsIF9fZnVuY19fLCBwYXJhbXNfbGVuZ3RoKTsKLQlpZiAocGFyYW1zX2xlbmd0aCkgewotCQlyZXQgPSBhZG1fc2VuZF9wYXJhbXNfdjUocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJCXBhcmFtc192YWx1ZSwgcGFyYW1zX2xlbmd0aCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IHNldHRpbmcgcGFyYW0gZmFpbGVkIHdpdGggZXJyPSVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJa2ZyZWUocGFyYW1zX3ZhbHVlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19RVElfUFApICYmIGRlZmluZWQoQ09ORklHX1FUSV9QUF9BVURJT1NQSEVSRSkKLWludCBtc21fcXRpX3BwX2FzcGhlcmVfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KQotewotCWludCBpbmRleCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0KLQlwcl9kZWJ1ZygiJXMsIHBvcnRfaWQgJWQsIGNvcHBfaWQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0JaWYgKGluZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWR4ICVkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgaW5kZXgsCi0JCQlwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW1zbV9xdGlfcHBfYXNwaGVyZV9pbml0X3N0YXRlKCk7Ci0KLQlhc3BoZXJlX3N0YXRlLnBvcnRfaWRbaW5kZXhdID0gcG9ydF9pZDsKLQlhc3BoZXJlX3N0YXRlLmNvcHBfaWR4W2luZGV4XSA9IGNvcHBfaWR4OwotCi0JaWYgKGFzcGhlcmVfc3RhdGUuZW5hYmxlZCkKLQkJbXNtX3F0aV9wcF9hc3BoZXJlX3NlbmRfcGFyYW1zKHBvcnRfaWQsIGNvcHBfaWR4LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG1zbV9xdGlfcHBfYXNwaGVyZV9kZWluaXQoaW50IHBvcnRfaWQpCi17Ci0JaW50IGluZGV4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQotCXByX2RlYnVnKCIlcywgcG9ydF9pZCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkeCAlZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIGluZGV4LAotCQkJcG9ydF9pZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYXNwaGVyZV9zdGF0ZS5wb3J0X2lkW2luZGV4XSA9PSBwb3J0X2lkKSB7Ci0JCWFzcGhlcmVfc3RhdGUucG9ydF9pZFtpbmRleF0gPSAtMTsKLQkJYXNwaGVyZV9zdGF0ZS5jb3BwX2lkeFtpbmRleF0gPSAtMTsKLQl9Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBtc21fcXRpX3BwX2FzcGhlcmVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaWYgKCFhc3BoZXJlX3N0YXRlLmluaXRpYWxpemVkKQotCQlyZXR1cm4gLUVBR0FJTjsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGFzcGhlcmVfc3RhdGUuZW5hYmxlZDsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGFzcGhlcmVfc3RhdGUuc3RyZW5ndGg7Ci0JcHJfZGVidWcoIiVzLCBlbmFibGUgJXUsIHN0cmVuZ3RoICV1XG4iLCBfX2Z1bmNfXywKLQkJCWFzcGhlcmVfc3RhdGUuZW5hYmxlZCwgYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3F0aV9wcF9hc3BoZXJlX3NldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludDMyX3QgZW5hYmxlID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JaW50MzJfdCBzdHJlbmd0aCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOwotCWludCBpOwotCi0JcHJfZGVidWcoIiVzLCBlbmFibGUgJXUsIHN0cmVuZ3RoICV1XG4iLCBfX2Z1bmNfXywgZW5hYmxlLCBzdHJlbmd0aCk7Ci0KLQltc21fcXRpX3BwX2FzcGhlcmVfaW5pdF9zdGF0ZSgpOwotCi0JaWYgKGVuYWJsZSA9PSAwIHx8IGVuYWJsZSA9PSAxKSB7Ci0JCWFzcGhlcmVfc3RhdGUuZW5hYmxlZF9wcmV2ID0gYXNwaGVyZV9zdGF0ZS5lbmFibGVkOwotCQlhc3BoZXJlX3N0YXRlLmVuYWJsZWQgPSBlbmFibGU7Ci0JfQotCi0JaWYgKHN0cmVuZ3RoID49IDAgJiYgc3RyZW5ndGggPD0gMTAwMCkgewotCQlhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoX3ByZXYgPSBhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoOwotCQlhc3BoZXJlX3N0YXRlLnN0cmVuZ3RoID0gc3RyZW5ndGg7Ci0JfQotCi0JaWYgKGFzcGhlcmVfc3RhdGUuc3RyZW5ndGggIT0gYXNwaGVyZV9zdGF0ZS5zdHJlbmd0aF9wcmV2IHx8Ci0JCWFzcGhlcmVfc3RhdGUuZW5hYmxlZCAhPSBhc3BoZXJlX3N0YXRlLmVuYWJsZWRfcHJldikgewotCQlmb3IgKGkgPSAwOyBpIDwgQUZFX01BWF9QT1JUUzsgaSsrKSB7Ci0JCQlpZiAoYXNwaGVyZV9zdGF0ZS5wb3J0X2lkW2ldID49IDApCi0JCQkJbXNtX3F0aV9wcF9hc3BoZXJlX3NlbmRfcGFyYW1zKAotCQkJCQlhc3BoZXJlX3N0YXRlLnBvcnRfaWRbaV0sCi0JCQkJCWFzcGhlcmVfc3RhdGUuY29wcF9pZHhbaV0sCi0JCQkJCWZhbHNlKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IG1zbV9hZHNwX2luaXRfbWl4ZXJfY3RsX3BwX2V2ZW50X3F1ZXVlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSBEU1BfU1RSRUFNX0NBTExCQUNLOwotCXN0cnVjdCBkc3Bfc3RyZWFtX2NhbGxiYWNrX3BydGQgKmtjdGxfcHJ0ZCA9IE5VTEw7Ci0KLQlpZiAoIXJ0ZCkgewotCQlwcl9lcnIoIiVzOiBydGQgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3RsX2xlbiA9IHN0cmxlbihtaXhlcl9jdGxfbmFtZSkgKyAxICsgc3RybGVuKGRldmljZU5vKSArIDE7Ci0JbWl4ZXJfc3RyID0ga3phbGxvYyhjdGxfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1peGVyX3N0cikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc25wcmludGYobWl4ZXJfc3RyLCBjdGxfbGVuLCAiJXMgJWQiLCBtaXhlcl9jdGxfbmFtZSwKLQkJcnRkLT5wY20tPmRldmljZSk7Ci0Ja2N0bCA9IHNuZF9zb2NfY2FyZF9nZXRfa2NvbnRyb2wocnRkLT5jYXJkLCBtaXhlcl9zdHIpOwotCWtmcmVlKG1peGVyX3N0cik7Ci0JaWYgKCFrY3RsKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQga2N0bC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChrY3RsLT5wcml2YXRlX2RhdGEgIT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBrY3RsX3BydGQgaXMgbm90IE5VTEwgYXQgaW5pdGlhbGl6YXRpb24uXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlrY3RsX3BydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19wcnRkKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICgha2N0bF9wcnRkKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgma2N0bF9wcnRkLT5wcnRkX3NwaW5fbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmtjdGxfcHJ0ZC0+ZXZlbnRfcXVldWUpOwotCWtjdGxfcHJ0ZC0+ZXZlbnRfY291bnQgPSAwOwotCWtjdGwtPnByaXZhdGVfZGF0YSA9IGtjdGxfcHJ0ZDsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbXNtX2Fkc3BfY2xlYW5fbWl4ZXJfY3RsX3BwX2V2ZW50X3F1ZXVlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfbGlzdCAqbm9kZSwgKm47Ci0JdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOwotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gRFNQX1NUUkVBTV9DQUxMQkFDSzsKLQlzdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19wcnRkICprY3RsX3BydGQgPSBOVUxMOwotCi0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlczogcnRkIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsCi0JCXJ0ZC0+cGNtLT5kZXZpY2UpOwotCWtjdGwgPSBzbmRfc29jX2NhcmRfZ2V0X2tjb250cm9sKHJ0ZC0+Y2FyZCwgbWl4ZXJfc3RyKTsKLQlrZnJlZShtaXhlcl9zdHIpOwotCWlmICgha2N0bCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGtjdGwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlrY3RsX3BydGQgPSAoc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfcHJ0ZCAqKQotCQkJa2N0bC0+cHJpdmF0ZV9kYXRhOwotCWlmIChrY3RsX3BydGQgIT0gTlVMTCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgma2N0bF9wcnRkLT5wcnRkX3NwaW5fbG9jaywgc3Bpbl9mbGFncyk7Ci0JCS8qIGNsZWFuIHRoZSBxdWV1ZSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgbiwKLQkJCQkma2N0bF9wcnRkLT5ldmVudF9xdWV1ZSwgbGlzdCkgewotCQkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOwotCQkJa2N0bF9wcnRkLT5ldmVudF9jb3VudC0tOwotCQkJcHJfZGVidWcoIiVzOiAlZCByZW1haW5pbmcgZXZlbnRzIGFmdGVyIGRlbC5cbiIsCi0JCQkJX19mdW5jX18sIGtjdGxfcHJ0ZC0+ZXZlbnRfY291bnQpOwotCQkJa2ZyZWUobm9kZSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2N0bF9wcnRkLT5wcnRkX3NwaW5fbG9jaywgc3Bpbl9mbGFncyk7Ci0JfQotCi0Ja2ZyZWUoa2N0bF9wcnRkKTsKLQlrY3RsLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBtc21fYWRzcF9pbmZvcm1fbWl4ZXJfY3RsKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQl1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQkvKiBhZHNwIHBwIGV2ZW50IG5vdGlmaWVyICovCi0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlIGNvbnRyb2w7Ci0JY29uc3QgY2hhciAqZGV2aWNlTm8gPSAiTk4iOwotCWNoYXIgKm1peGVyX3N0ciA9IE5VTEw7Ci0JaW50IGN0bF9sZW4gPSAwLCByZXQgPSAwOwotCXN0cnVjdCBkc3Bfc3RyZWFtX2NhbGxiYWNrX2xpc3QgKm5ld19ldmVudDsKLQlzdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19saXN0ICpvbGRlc3RfZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBzcGluX2ZsYWdzOwotCXN0cnVjdCBkc3Bfc3RyZWFtX2NhbGxiYWNrX3BydGQgKmtjdGxfcHJ0ZCA9IE5VTEw7Ci0Jc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEgKmV2ZW50X2RhdGEgPSBOVUxMOwotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gRFNQX1NUUkVBTV9DQUxMQkFDSzsKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8ga2N0bF9pbmZvOwotCi0JaWYgKCFydGQgfHwgIXBheWxvYWQpIHsKLQkJcHJfZXJyKCIlczogJXMgaXMgTlVMTFxuIiwgX19mdW5jX18sCi0JCQkoIXJ0ZCkgPyAicnRkIiA6ICJwYXlsb2FkIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAocnRkLT5jYXJkLT5zbmRfY2FyZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHNuZF9jYXJkIGlzIG51bGwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9BVE9NSUMpOwotCWlmICghbWl4ZXJfc3RyKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbnByaW50ZihtaXhlcl9zdHIsIGN0bF9sZW4sICIlcyAlZCIsIG1peGVyX2N0bF9uYW1lLAotCQlydGQtPnBjbS0+ZGV2aWNlKTsKLQlrY3RsID0gc25kX3NvY19jYXJkX2dldF9rY29udHJvbChydGQtPmNhcmQsIG1peGVyX3N0cik7Ci0Ja2ZyZWUobWl4ZXJfc3RyKTsKLQlpZiAoIWtjdGwpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBrY3RsLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZXZlbnRfZGF0YSA9IChzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqKXBheWxvYWQ7Ci0Ja2N0bC0+aW5mbyhrY3RsLCAma2N0bF9pbmZvKTsKLQlpZiAoc2l6ZW9mKHN0cnVjdCBtc21fYWRzcF9ldmVudF9kYXRhKQotCQkrIGV2ZW50X2RhdGEtPnBheWxvYWRfbGVuID4ga2N0bF9pbmZvLmNvdW50KSB7Ci0JCXByX2VycigiJXM6IHBheWxvYWQgbGVuZ3RoIGV4Y2VlZHMgbGltaXQgb2YgJXUgYnl0ZXMuXG4iLAotCQkJX19mdW5jX18sIGtjdGxfaW5mby5jb3VudCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlrY3RsX3BydGQgPSAoc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfcHJ0ZCAqKQotCQkJa2N0bC0+cHJpdmF0ZV9kYXRhOwotCWlmIChrY3RsX3BydGQgPT0gTlVMTCkgewotCQkvKiBxdWV1ZSBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KLQkJcmV0ID0gLUVJTlZBTDsKLQkJcHJfZXJyKCIlczogZXZlbnQgcXVldWUgaXMgbm90IGluaXRpYWxpemVkLlxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbmV3X2V2ZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfbGlzdCkKLQkJCSsgZXZlbnRfZGF0YS0+cGF5bG9hZF9sZW4sCi0JCQlHRlBfQVRPTUlDKTsKLQlpZiAobmV3X2V2ZW50ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQltZW1jcHkoKHZvaWQgKikmbmV3X2V2ZW50LT5ldmVudCwgKHZvaWQgKilwYXlsb2FkLAotCQkgICBldmVudF9kYXRhLT5wYXlsb2FkX2xlbgotCQkgICArIHNpemVvZihzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmtjdGxfcHJ0ZC0+cHJ0ZF9zcGluX2xvY2ssIHNwaW5fZmxhZ3MpOwotCXdoaWxlIChrY3RsX3BydGQtPmV2ZW50X2NvdW50ID49IERTUF9TVFJFQU1fQ0FMTEJBQ0tfUVVFVUVfU0laRSkgewotCQlwcl9pbmZvKCIlczogcXVldWUgb2Ygc2l6ZSAlZCBpcyBmdWxsLiBkZWxldGUgb2xkZXN0IG9uZS5cbiIsCi0JCQlfX2Z1bmNfXywgRFNQX1NUUkVBTV9DQUxMQkFDS19RVUVVRV9TSVpFKTsKLQkJb2xkZXN0X2V2ZW50ID0gbGlzdF9maXJzdF9lbnRyeSgma2N0bF9wcnRkLT5ldmVudF9xdWV1ZSwKLQkJCQlzdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19saXN0LCBsaXN0KTsKLQkJcHJfaW5mbygiJXM6IGV2ZW50IGRlbGV0ZWQ6IHR5cGUgJWQgbGVuZ3RoICVkXG4iLAotCQkJX19mdW5jX18sIG9sZGVzdF9ldmVudC0+ZXZlbnQuZXZlbnRfdHlwZSwKLQkJCW9sZGVzdF9ldmVudC0+ZXZlbnQucGF5bG9hZF9sZW4pOwotCQlsaXN0X2RlbCgmb2xkZXN0X2V2ZW50LT5saXN0KTsKLQkJa2N0bF9wcnRkLT5ldmVudF9jb3VudC0tOwotCQlrZnJlZShvbGRlc3RfZXZlbnQpOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJm5ld19ldmVudC0+bGlzdCwgJmtjdGxfcHJ0ZC0+ZXZlbnRfcXVldWUpOwotCWtjdGxfcHJ0ZC0+ZXZlbnRfY291bnQrKzsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrY3RsX3BydGQtPnBydGRfc3Bpbl9sb2NrLCBzcGluX2ZsYWdzKTsKLQotCWNvbnRyb2wuaWQgPSBrY3RsLT5pZDsKLQlzbmRfY3RsX25vdGlmeShydGQtPmNhcmQtPnNuZF9jYXJkLAotCQkJU05EUlZfQ1RMX0VWRU5UX01BU0tfSU5GTywKLQkJCSZjb250cm9sLmlkKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbXNtX2Fkc3Bfc3RyZWFtX2NtZF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JdWluZm8tPmNvdW50ID0KLQkJc2l6ZW9mKCgoc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqKTApLT52YWx1ZS5ieXRlcy5kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgbXNtX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVpbnQzMl90IHBheWxvYWRfc2l6ZSA9IDA7Ci0Jc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfbGlzdCAqb2xkZXN0X2V2ZW50OwotCXVuc2lnbmVkIGxvbmcgc3Bpbl9mbGFnczsKLQlzdHJ1Y3QgZHNwX3N0cmVhbV9jYWxsYmFja19wcnRkICprY3RsX3BydGQgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0Ja2N0bF9wcnRkID0gKHN0cnVjdCBkc3Bfc3RyZWFtX2NhbGxiYWNrX3BydGQgKikKLQkJCWtjb250cm9sLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGtjdGxfcHJ0ZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFTTSBTdHJlYW0gUFAgZXZlbnQgcXVldWUgaXMgbm90IGluaXRpYWxpemVkLlxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZrY3RsX3BydGQtPnBydGRfc3Bpbl9sb2NrLCBzcGluX2ZsYWdzKTsKLQlwcl9kZWJ1ZygiJXM6ICVkIGV2ZW50cyBpbiBxdWV1ZS5cbiIsIF9fZnVuY19fLCBrY3RsX3BydGQtPmV2ZW50X2NvdW50KTsKLQlpZiAobGlzdF9lbXB0eSgma2N0bF9wcnRkLT5ldmVudF9xdWV1ZSkpIHsKLQkJcHJfZXJyKCIlczogQVNNIFN0cmVhbSBQUCBldmVudCBxdWV1ZSBpcyBlbXB0eS5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2N0bF9wcnRkLT5wcnRkX3NwaW5fbG9jaywgc3Bpbl9mbGFncyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlvbGRlc3RfZXZlbnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZrY3RsX3BydGQtPmV2ZW50X3F1ZXVlLAotCQkJc3RydWN0IGRzcF9zdHJlYW1fY2FsbGJhY2tfbGlzdCwgbGlzdCk7Ci0JbGlzdF9kZWwoJm9sZGVzdF9ldmVudC0+bGlzdCk7Ci0Ja2N0bF9wcnRkLT5ldmVudF9jb3VudC0tOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmtjdGxfcHJ0ZC0+cHJ0ZF9zcGluX2xvY2ssIHNwaW5fZmxhZ3MpOwotCi0JcGF5bG9hZF9zaXplID0gb2xkZXN0X2V2ZW50LT5ldmVudC5wYXlsb2FkX2xlbjsKLQlwcl9kZWJ1ZygiJXM6IGV2ZW50IGZldGNoZWQ6IHR5cGUgJWQgbGVuZ3RoICVkXG4iLAotCQkJX19mdW5jX18sIG9sZGVzdF9ldmVudC0+ZXZlbnQuZXZlbnRfdHlwZSwKLQkJCW9sZGVzdF9ldmVudC0+ZXZlbnQucGF5bG9hZF9sZW4pOwotCW1lbWNweSh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwgJm9sZGVzdF9ldmVudC0+ZXZlbnQsCi0JCXNpemVvZihzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSkgKyBwYXlsb2FkX3NpemUpOwotCWtmcmVlKG9sZGVzdF9ldmVudCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IG1zbV9hZHNwX3N0cmVhbV9jYWxsYmFja19pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQllURVM7Ci0JdWluZm8tPmNvdW50ID0KLQkJc2l6ZW9mKCgoc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqKTApLT52YWx1ZS5ieXRlcy5kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9tdWx0aWNoYW5uZWxfZWNfcHJpbWFyeV9taWNfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNvcHBfaWR4ID0gMDsKLQlpbnQgcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOwotCi0JbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCXByX2RlYnVnKCIlczogbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaCA9ICV1XG4iLAotCQlfX2Z1bmNfXywgbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaCk7Ci0JY29wcF9pZHggPSBhZG1fZ2V0X2RlZmF1bHRfY29wcF9pZHgocG9ydF9pZCk7Ci0JaWYgKChjb3BwX2lkeCA8IDApIHx8IChjb3BwX2lkeCA+IE1BWF9DT1BQU19QRVJfUE9SVCkpIHsKLQkJcHJfZXJyKCIlcyA6IG5vIGFjdGl2ZSBjb3BwIHRvIHF1ZXJ5IG11bHRpY2hhbm5lbCBlYyBjb3BwX2lkeDogJXVcbiIsCi0JCQlfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYWRtX3NlbmRfc2V0X211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaChwb3J0X2lkLCBjb3BwX2lkeCwKLQkJbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9tdWx0aWNoYW5uZWxfZWNfcHJpbWFyeV9taWNfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fbXVsdGljaGFubmVsX2VjX3ByaW1hcnlfbWljX2NoOwotCXByX2RlYnVnKCIlczogbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaCA9ICVsdVxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCAgc25kX2tjb250cm9sX25ldyBtc21fbXVsdGljaGFubmVsX2VjX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFQoIk11bHRpY2hhbm5lbCBFQyBQcmltYXJ5IE1pYyBDaCIsIFNORF9TT0NfTk9QTSwgMCwKLQkJMHhGRkZGRkZGRiwgMCwgbXNtX211bHRpY2hhbm5lbF9lY19wcmltYXJ5X21pY19jaF9nZXQsCi0JCW1zbV9tdWx0aWNoYW5uZWxfZWNfcHJpbWFyeV9taWNfY2hfcHV0KSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBpbnRfZm1fdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJJbnRlcm5hbCBGTSBSWCBWb2x1bWUiLCBTTkRfU09DX05PUE0sIDAsCi0JSU5UX1JYX1ZPTF9HQUlOLCAwLCBtc21fcXRpX3BwX2dldF9mbV92b2xfbWl4ZXIsCi0JbXNtX3F0aV9wcF9zZXRfZm1fdm9sX21peGVyLCBmbV9yeF92b2xfZ2FpbiksCi0JU09DX1NJTkdMRV9FWFRfVExWKCJRdWF0IE1JMlMgRk0gUlggVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfcXVhdF9taTJzX2ZtX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9xdWF0X21pMnNfZm1fdm9sX21peGVyLCBmbV9yeF92b2xfZ2FpbiksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZHNwX2JpdF93aWR0aF9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKERTUF9CSVRfV0lEVEhfTUlYRVJfQ1RMLCBTTkRfU09DX05PUE0sIDAsIDB4MjAsCi0JMCwgbXNtX2FzbV9iaXRfd2lkdGhfZ2V0LCBtc21fYXNtX2JpdF93aWR0aF9wdXQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV9taTJzX2xiX3ZvbF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUX1RMVigiUFJJIE1JMlMgTE9PUEJBQ0sgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfcHJpX21pMnNfbGJfdm9sX21peGVyLAotCW1zbV9xdGlfcHBfc2V0X3ByaV9taTJzX2xiX3ZvbF9taXhlciwgYWZlX2xiX3ZvbF9nYWluKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVF9UTFYoIlNFQyBNSTJTIExPT1BCQUNLIFZvbHVtZSIsIFNORF9TT0NfTk9QTSwgMCwKLQlJTlRfUlhfVk9MX0dBSU4sIDAsIG1zbV9xdGlfcHBfZ2V0X3NlY19taTJzX2xiX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9zZWNfbWkyc19sYl92b2xfbWl4ZXIsIGFmZV9sYl92b2xfZ2FpbiksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdGVydF9taTJzX2xiX3ZvbF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUX1RMVigiVGVydCBNSTJTIExPT1BCQUNLIFZvbHVtZSIsIFNORF9TT0NfTk9QTSwgMCwKLQlJTlRfUlhfVk9MX0dBSU4sIDAsIG1zbV9xdGlfcHBfZ2V0X3RlcnRfbWkyc19sYl92b2xfbWl4ZXIsCi0JbXNtX3F0aV9wcF9zZXRfdGVydF9taTJzX2xiX3ZvbF9taXhlciwgYWZlX2xiX3ZvbF9nYWluKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzdfbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJTTElNQlVTXzcgTE9PUEJBQ0sgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCQkJCUlOVF9SWF9WT0xfR0FJTiwgMCwKLQkJCQltc21fcXRpX3BwX2dldF9zbGltYnVzXzdfbGJfdm9sX21peGVyLAotCQkJCW1zbV9xdGlfcHBfc2V0X3NsaW1idXNfN19sYl92b2xfbWl4ZXIsCi0JCQkJYWZlX2xiX3ZvbF9nYWluKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbGltYnVzXzhfbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJTTElNQlVTXzggTE9PUEJBQ0sgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfc2xpbWJ1c184X2xiX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9zbGltYnVzXzhfbGJfdm9sX21peGVyLCBhZmVfbGJfdm9sX2dhaW4pLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludF9oZnBfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJJbnRlcm5hbCBIRlAgUlggVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfaGZwX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9oZnBfdm9sX21peGVyLCBoZnBfcnhfdm9sX2dhaW4pLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGludF9pY2Nfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJJbnRlcm5hbCBJQ0MgVm9sdW1lIiwgU05EX1NPQ19OT1BNLCAwLAotCUlOVF9SWF9WT0xfR0FJTiwgMCwgbXNtX3F0aV9wcF9nZXRfaWNjX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9pY2Nfdm9sX21peGVyLCBpY2Nfcnhfdm9sX2dhaW4pLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHByaV9hdXhwY21fbGJfdm9sX21peGVyX2NvbnRyb2xzW10gPSB7Ci0JU09DX1NJTkdMRV9FWFRfVExWKCJQUkkgQVVYUENNIExPT1BCQUNLIFZvbHVtZSIsCi0JQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFgsIDAsIElOVF9SWF9WT0xfR0FJTiwgMCwKLQltc21fcXRpX3BwX2dldF9wcmlfYXV4cGNtX2xiX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9wcmlfYXV4cGNtX2xiX3ZvbF9taXhlciwKLQlwcmlfYXV4cGNtX2xiX3ZvbF9nYWluKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzZWNfYXV4cGNtX2xiX3ZvbF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUX1RMVigiU0VDIEFVWFBDTSBMT09QQkFDSyBWb2x1bWUiLAotCUFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFgsIDAsIElOVF9SWF9WT0xfR0FJTiwgMCwKLQltc21fcXRpX3BwX2dldF9zZWNfYXV4cGNtX2xiX3ZvbF9taXhlciwKLQltc21fcXRpX3BwX3NldF9zZWNfYXV4cGNtX2xiX3ZvbF9taXhlciwKLQlzZWNfYXV4cGNtX2xiX3ZvbF9nYWluKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtdWx0aV9jaF9jaGFubmVsX21hcF9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJQbGF5YmFjayBEZXZpY2UgQ2hhbm5lbCBNYXAiLCBTTkRfU09DX05PUE0sIDAsIDE2LAotCTAsIDgsIG1zbV9xdGlfcHBfZ2V0X2NoYW5uZWxfbWFwX21peGVyLAotCW1zbV9xdGlfcHBfcHV0X2NoYW5uZWxfbWFwX21peGVyKSwKLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGdldF9ybXNfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiR2V0IFJNUyIsIFNORF9TT0NfTk9QTSwgMCwgMHhGRkZGRkZGRiwKLQkwLCBtc21fcXRpX3BwX2dldF9ybXNfdmFsdWVfY29udHJvbCwgbXNtX3F0aV9wcF9wdXRfcm1zX3ZhbHVlX2NvbnRyb2wpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVxX2VuYWJsZV9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMSBFUSBFbmFibGUiLCBTTkRfU09DX05PUE0sCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMSwgMCwgbXNtX3F0aV9wcF9nZXRfZXFfZW5hYmxlX21peGVyLAotCW1zbV9xdGlfcHBfcHV0X2VxX2VuYWJsZV9taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEyIEVRIEVuYWJsZSIsIFNORF9TT0NfTk9QTSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAxLCAwLCBtc21fcXRpX3BwX2dldF9lcV9lbmFibGVfbWl4ZXIsCi0JbXNtX3F0aV9wcF9wdXRfZXFfZW5hYmxlX21peGVyKSwKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTMgRVEgRW5hYmxlIiwgU05EX1NPQ19OT1BNLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDEsIDAsIG1zbV9xdGlfcHBfZ2V0X2VxX2VuYWJsZV9taXhlciwKLQltc21fcXRpX3BwX3B1dF9lcV9lbmFibGVfbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGVxX2JhbmRfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZCBDb3VudCIsIFNORF9TT0NfTk9QTSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAxMSwgMCwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyLAotCW1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfY291bnRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kIENvdW50IiwgU05EX1NPQ19OT1BNLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDExLCAwLAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfY291bnRfYXVkaW9fbWl4ZXIsCi0JbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQgQ291bnQiLCBTTkRfU09DX05PUE0sCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMTEsIDAsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9jb3VudF9hdWRpb19taXhlciwKLQltc21fcXRpX3BwX3B1dF9lcV9iYW5kX2NvdW50X2F1ZGlvX21peGVyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBlcV9jb2VmZl9taXhlcl9jb250cm9sc1tdID0gewotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kMSIsIEVRX0JBTkQxLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDIiLCBFUV9CQU5EMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQzIiwgRVFfQkFORDMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kNCIsIEVRX0JBTkQ0LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDUiLCBFUV9CQU5ENSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQ2IiwgRVFfQkFORDYsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kNyIsIEVRX0JBTkQ3LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTEgRVEgQmFuZDgiLCBFUV9CQU5EOCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWExIEVRIEJhbmQ5IiwgRVFfQkFORDksCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kMTAiLCBFUV9CQU5EMTAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kMTEiLCBFUV9CQU5EMTEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMSBFUSBCYW5kMTIiLCBFUV9CQU5EMTIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMSwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kMSIsIEVRX0JBTkQxLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDIiLCBFUV9CQU5EMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQzIiwgRVFfQkFORDMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kNCIsIEVRX0JBTkQ0LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDUiLCBFUV9CQU5ENSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQ2IiwgRVFfQkFORDYsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kNyIsIEVRX0JBTkQ3LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTIgRVEgQmFuZDgiLCBFUV9CQU5EOCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEyIEVRIEJhbmQ5IiwgRVFfQkFORDksCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kMTAiLCBFUV9CQU5EMTAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kMTEiLCBFUV9CQU5EMTEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMiBFUSBCYW5kMTIiLCBFUV9CQU5EMTIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kMSIsIEVRX0JBTkQxLAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDIiLCBFUV9CQU5EMiwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQzIiwgRVFfQkFORDMsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kNCIsIEVRX0JBTkQ0LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDUiLCBFUV9CQU5ENSwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQ2IiwgRVFfQkFORDYsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kNyIsIEVRX0JBTkQ3LAotCU1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsIDI1NSwgMCwgNSwKLQltc21fcXRpX3BwX2dldF9lcV9iYW5kX2F1ZGlvX21peGVyLCBtc21fcXRpX3BwX3B1dF9lcV9iYW5kX2F1ZGlvX21peGVyKSwKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTXVsdGlNZWRpYTMgRVEgQmFuZDgiLCBFUV9CQU5EOCwKLQlNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLCAyNTUsIDAsIDUsCi0JbXNtX3F0aV9wcF9nZXRfZXFfYmFuZF9hdWRpb19taXhlciwgbXNtX3F0aV9wcF9wdXRfZXFfYmFuZF9hdWRpb19taXhlciksCi0JU09DX1NJTkdMRV9NVUxUSV9FWFQoIk11bHRpTWVkaWEzIEVRIEJhbmQ5IiwgRVFfQkFORDksCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kMTAiLCBFUV9CQU5EMTAsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kMTEiLCBFUV9CQU5EMTEsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotCVNPQ19TSU5HTEVfTVVMVElfRVhUKCJNdWx0aU1lZGlhMyBFUSBCYW5kMTIiLCBFUV9CQU5EMTIsCi0JTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywgMjU1LCAwLCA1LAotCW1zbV9xdGlfcHBfZ2V0X2VxX2JhbmRfYXVkaW9fbWl4ZXIsIG1zbV9xdGlfcHBfcHV0X2VxX2JhbmRfYXVkaW9fbWl4ZXIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFzcGhlcmVfbWl4ZXJfY29udHJvbHNbXSA9IHsKLQlTT0NfU0lOR0xFX01VTFRJX0VYVCgiTVNNIEFTcGhlcmUgU2V0IFBhcmFtIiwgU05EX1NPQ19OT1BNLCAwLAotCTB4RkZGRkZGRkYsIDAsIDIsIG1zbV9xdGlfcHBfYXNwaGVyZV9nZXQsIG1zbV9xdGlfcHBfYXNwaGVyZV9zZXQpLAotfTsKLQotI2lmZGVmIENPTkZJR19RVElfUFAKLXZvaWQgbXNtX3F0aV9wcF9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBpbnRfZm1fdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShpbnRfZm1fdm9sX21peGVyX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgcHJpX21pMnNfbGJfdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShwcmlfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBzZWNfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKHNlY19taTJzX2xiX3ZvbF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIHRlcnRfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKHRlcnRfbWkyc19sYl92b2xfbWl4ZXJfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBzbGltYnVzXzdfbGJfdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShzbGltYnVzXzdfbGJfdm9sX21peGVyX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgc2xpbWJ1c184X2xiX3ZvbF9taXhlcl9jb250cm9scywKLQkJCUFSUkFZX1NJWkUoc2xpbWJ1c184X2xiX3ZvbF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGludF9oZnBfdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShpbnRfaGZwX3ZvbF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGludF9pY2Nfdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShpbnRfaWNjX3ZvbF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQlwcmlfYXV4cGNtX2xiX3ZvbF9taXhlcl9jb250cm9scywKLQkJCUFSUkFZX1NJWkUocHJpX2F1eHBjbV9sYl92b2xfbWl4ZXJfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLAotCQkJCXNlY19hdXhwY21fbGJfdm9sX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShzZWNfYXV4cGNtX2xiX3ZvbF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sCi0JCQkJbXVsdGlfY2hfY2hhbm5lbF9tYXBfbWl4ZXJfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKG11bHRpX2NoX2NoYW5uZWxfbWFwX21peGVyX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgZ2V0X3Jtc19jb250cm9scywKLQkJCUFSUkFZX1NJWkUoZ2V0X3Jtc19jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGVxX2VuYWJsZV9taXhlcl9jb250cm9scywKLQkJCUFSUkFZX1NJWkUoZXFfZW5hYmxlX21peGVyX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgZXFfYmFuZF9taXhlcl9jb250cm9scywKLQkJCUFSUkFZX1NJWkUoZXFfYmFuZF9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGVxX2NvZWZmX21peGVyX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShlcV9jb2VmZl9taXhlcl9jb250cm9scykpOwotCi0Jc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocGxhdGZvcm0sIGFzcGhlcmVfbWl4ZXJfY29udHJvbHMsCi0JCQlBUlJBWV9TSVpFKGFzcGhlcmVfbWl4ZXJfY29udHJvbHMpKTsKLQotCXNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHBsYXRmb3JtLCBtc21fbXVsdGljaGFubmVsX2VjX2NvbnRyb2xzLAotCQkJQVJSQVlfU0laRShtc21fbXVsdGljaGFubmVsX2VjX2NvbnRyb2xzKSk7Ci0KLQlzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhwbGF0Zm9ybSwgZHNwX2JpdF93aWR0aF9jb250cm9scywKLQkJCUFSUkFZX1NJWkUoZHNwX2JpdF93aWR0aF9jb250cm9scykpOwotfQotI2VuZGlmIC8qIENPTkZJR19RVElfUFAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9tc20tcXRpLXBwLWNvbmZpZy5oIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjlkMzcuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS1xdGktcHAtY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX01TTV9RVElfUFBfSF8KLSNkZWZpbmUgX01TTV9RVElfUFBfSF8KLQotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2RlZmluZSBEU1BfQklUX1dJRFRIX01JWEVSX0NUTCAiQVNNIEJpdCBXaWR0aCIKLWludCBtc21fYWRzcF9pbmZvcm1fbWl4ZXJfY3RsKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQl1aW50MzJfdCAqcGF5bG9hZCk7Ci1pbnQgbXNtX2Fkc3BfaW5pdF9taXhlcl9jdGxfcHBfZXZlbnRfcXVldWUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7Ci1pbnQgbXNtX2Fkc3BfY2xlYW5fbWl4ZXJfY3RsX3BwX2V2ZW50X3F1ZXVlKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpOwotaW50IG1zbV9hZHNwX3N0cmVhbV9jbWRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwotaW50IG1zbV9hZHNwX3N0cmVhbV9jYWxsYmFja19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7Ci1pbnQgbXNtX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKLSNpZmRlZiBDT05GSUdfUVRJX1BQCi12b2lkIG1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXMoaW50IGZlZGFpX2lkKTsKLWludCBtc21fcXRpX3BwX3NlbmRfc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY21kKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQkJCQl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCwKLQkJCQkJCXVpbnQxNl90IG9wX0ZMX2lwX0ZMX3dlaWdodCwKLQkJCQkJCXVpbnQxNl90IG9wX0ZMX2lwX0ZSX3dlaWdodCwKLQkJCQkJCXVpbnQxNl90IG9wX0ZSX2lwX0ZMX3dlaWdodCwKLQkJCQkJCXVpbnQxNl90IG9wX0ZSX2lwX0ZSX3dlaWdodCk7Ci12b2lkIG1zbV9xdGlfcHBfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSk7Ci0jZWxzZSAvKiBDT05GSUdfUVRJX1BQICovCi0jZGVmaW5lIG1zbV9xdGlfcHBfc2VuZF9lcV92YWx1ZXMoZmVkYWlfaWQpIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBtc21fcXRpX3BwX3NlbmRfc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fY21kKHBvcnRfaWQsIGNvcHBfaWR4LCBcCi0JCQlzZXNzaW9uX2lkLCBvcF9GTF9pcF9GTF93ZWlnaHQsIG9wX0ZMX2lwX0ZSX3dlaWdodCwgXAotCQkJb3BfRlJfaXBfRkxfd2VpZ2h0LCBvcF9GUl9pcF9GUl93ZWlnaHQpICgwKQotI2RlZmluZSBtc21fcXRpX3BwX2FkZF9jb250cm9scyhwbGF0Zm9ybSkgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX1FUSV9QUCAqLwotCi0KLSNpZiBkZWZpbmVkKENPTkZJR19RVElfUFApICYmIGRlZmluZWQoQ09ORklHX1FUSV9QUF9BVURJT1NQSEVSRSkKLWludCBtc21fcXRpX3BwX2FzcGhlcmVfaW5pdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KTsKLXZvaWQgbXNtX3F0aV9wcF9hc3BoZXJlX2RlaW5pdChpbnQgcG9ydF9pZCk7Ci0jZWxzZQotI2RlZmluZSBtc21fcXRpX3BwX2FzcGhlcmVfaW5pdChwb3J0X2lkLCBjb3BwX2lkeCkgKDApCi0jZGVmaW5lIG1zbV9xdGlfcHBfYXNwaGVyZV9kZWluaXQocG9ydF9pZCkgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9NU01fUVRJX1BQX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXRyYW5zY29kZS1sb29wYmFjay1xNi12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL21zbS10cmFuc2NvZGUtbG9vcGJhY2stcTYtdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiYjI3Mi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvbXNtLXRyYW5zY29kZS1sb29wYmFjay1xNi12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvdGltZXIuaD4KLSNpbmNsdWRlIDxzb3VuZC90bHYuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19vZmZsb2FkLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlICJtc20tcXRpLXBwLWNvbmZpZy5oIgotCi0jZGVmaW5lIExPT1BCQUNLX1NFU1NJT05fTUFYX05VTV9TVFJFQU1TIDIKLQotc3RhdGljIERFRklORV9NVVRFWCh0cmFuc2NvZGVfbG9vcGJhY2tfc2Vzc2lvbl9sb2NrKTsKLQotc3RydWN0IHRyYW5zX2xvb3BiYWNrX3BkYXRhIHsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbVtNU01fRlJPTlRFTkRfREFJX01BWF07Ci19OwotCi1zdHJ1Y3QgbG9vcGJhY2tfc3RyZWFtIHsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbTsKLQl1aW50MzJfdCBjb2RlY19mb3JtYXQ7Ci0JYm9vbCBzdGFydDsKLX07Ci0KLWVudW0gbG9vcGJhY2tfc2Vzc2lvbl9zdGF0ZSB7Ci0JLyogT25lIG9yIGJvdGggc3RyZWFtcyBub3Qgb3BlbmVkICovCi0JTE9PUEJBQ0tfU0VTU0lPTl9DTE9TRSA9IDAsCi0JLyogTG9vcGJhY2sgc3RyZWFtcyBvcGVuZWQgKi8KLQlMT09QQkFDS19TRVNTSU9OX1JFQURZLAotCS8qIExvb3BiYWNrIHN0cmVhbXMgb3BlbmVkIGFuZCBmb3JtYXRzIGNvbmZpZ3VyZWQgKi8KLQlMT09QQkFDS19TRVNTSU9OX1NUQVJULAotCS8qIFRyaWdnZXIgaXNzdWVkIG9uIGVpdGhlciBvZiBzdHJlYW1zIHdoZW4gaW4gU1RBUlQgc3RhdGUgKi8KLQlMT09QQkFDS19TRVNTSU9OX1JVTgotfTsKLQotc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgewotCXN0cnVjdCBsb29wYmFja19zdHJlYW0gc291cmNlOwotCXN0cnVjdCBsb29wYmFja19zdHJlYW0gc2luazsKLQotCXN0cnVjdCBzbmRfY29tcHJfY2FwcyBzb3VyY2VfY29tcHJfY2FwOwotCXN0cnVjdCBzbmRfY29tcHJfY2FwcyBzaW5rX2NvbXByX2NhcDsKLQotCXVpbnQzMl90IGluc3RhbmNlOwotCXVpbnQzMl90IG51bV9zdHJlYW1zOwotCWludCBzZXNzaW9uX3N0YXRlOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQlpbnQgc2Vzc2lvbl9pZDsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphdWRpb19jbGllbnQ7Ci19OwotCi0vKiBUcmFuc2NvZGUgbG9vcGJhY2sgZ2xvYmFsIGluZm8gc3RydWN0ICovCi1zdGF0aWMgc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgdHJhbnNjb2RlX2luZm87Ci0KLXN0YXRpYyB2b2lkIGxvb3BiYWNrX2V2ZW50X2hhbmRsZXIodWludDMyX3Qgb3Bjb2RlLAotCQl1aW50MzJfdCB0b2tlbiwgdWludDMyX3QgKnBheWxvYWQsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgKnRyYW5zID0KLQkJCShzdHJ1Y3QgbXNtX3RyYW5zY29kZV9sb29wYmFjayAqKXByaXY7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbTsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYzsKLQlpbnQgc3RyZWFtX2lkOwotCWludCByZXQ7Ci0KLQlpZiAoIXRyYW5zIHx8ICFwYXlsb2FkKSB7Ci0JCXByX2VycigiJXM6IHJ0ZCBvciBwYXlsb2FkIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWNzdHJlYW0gPSB0cmFucy0+c291cmNlLmNzdHJlYW07Ci0JYWMgPSB0cmFucy0+YXVkaW9fY2xpZW50OwotCi0JLyoKLQkgKiBUb2tlbiBmb3IgcmVzdCBvZiB0aGUgY29tcHJlc3NlZCBjb21tYW5kcyB1c2UgdG8gc2V0Ci0JICogc2Vzc2lvbiBpZCwgc3RyZWFtIGlkLCBkaXIgZXRjLgotCSAqLwotCXN0cmVhbV9pZCA9IHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbih0b2tlbik7Ci0KLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQVNNX1NUUkVBTV9DTURfRU5DREVDX0VWRU5UUzoKLQljYXNlIEFTTV9JRUNfNjE5MzdfTUVESUFfRk1UX0VWRU5UOgotCQlwcl9kZWJ1ZygiJXM6IEFTTV9JRUNfNjE5MzdfTUVESUFfRk1UX0VWRU5UXG4iLCBfX2Z1bmNfXyk7Ci0JCXJ0ZCA9IGNzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQkJaWYgKCFydGQpIHsKLQkJCXByX2VycigiJXM6IHJ0ZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXQgPSBtc21fYWRzcF9pbmZvcm1fbWl4ZXJfY3RsKHJ0ZCwgcGF5bG9hZCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBpbmZvcm0gbWl4ZXIgY3RybC4gZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBUFJfQkFTSUNfUlNQX1JFU1VMVDogewotCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJY2FzZSBBU01fU0VTU0lPTl9DTURfUlVOX1YyOgotCQkJcHJfZGVidWcoIiVzOiBBU01fU0VTU0lPTl9DTURfUlVOX1YyOiIsIF9fZnVuY19fKTsKLQkJCXByX2RlYnVnKCJ0b2tlbiAweCV4LCBzdHJlYW0gaWQgJWRcbiIsIHRva2VuLAotCQkJCSAgc3RyZWFtX2lkKTsKLQkJCWJyZWFrOwotCQljYXNlIEFTTV9TVFJFQU1fQ01EX0NMT1NFOgotCQkJcHJfZGVidWcoIiVzOiBBU01fREFUQV9DTURfQ0xPU0U6IiwgX19mdW5jX18pOwotCQkJcHJfZGVidWcoInRva2VuIDB4JXgsIHN0cmVhbSBpZCAlZFxuIiwgdG9rZW4sCi0JCQkJICBzdHJlYW1faWQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBOb3QgU3VwcG9ydGVkIEV2ZW50IG9wY29kZVsweCV4XVxuIiwKLQkJCSAgX19mdW5jX18sIG9wY29kZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcG9wdWxhdGVfY29kZWNfbGlzdChzdHJ1Y3QgbXNtX3RyYW5zY29kZV9sb29wYmFjayAqdHJhbnMsCi0JCQkJc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9jb21wcl9jYXBzIGNvbXByX2NhcDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbWVtc2V0KCZjb21wcl9jYXAsIDAsIHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKLQotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpIHsKLQkJY29tcHJfY2FwLmRpcmVjdGlvbiA9IFNORF9DT01QUkVTU19DQVBUVVJFOwotCQljb21wcl9jYXAubnVtX2NvZGVjcyA9IDM7Ci0JCWNvbXByX2NhcC5jb2RlY3NbMF0gPSBTTkRfQVVESU9DT0RFQ19QQ007Ci0JCWNvbXByX2NhcC5jb2RlY3NbMV0gPSBTTkRfQVVESU9DT0RFQ19BQzM7Ci0JCWNvbXByX2NhcC5jb2RlY3NbMl0gPSBTTkRfQVVESU9DT0RFQ19FQUMzOwotCQltZW1jcHkoJnRyYW5zLT5zb3VyY2VfY29tcHJfY2FwLCAmY29tcHJfY2FwLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKLQl9Ci0KLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQljb21wcl9jYXAuZGlyZWN0aW9uID0gU05EX0NPTVBSRVNTX1BMQVlCQUNLOwotCQljb21wcl9jYXAubnVtX2NvZGVjcyA9IDE7Ci0JCWNvbXByX2NhcC5jb2RlY3NbMF0gPSBTTkRfQVVESU9DT0RFQ19QQ007Ci0JCW1lbWNweSgmdHJhbnMtPnNpbmtfY29tcHJfY2FwLCAmY29tcHJfY2FwLAotCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja19vcGVuKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBtc21fdHJhbnNjb2RlX2xvb3BiYWNrICp0cmFucyA9ICZ0cmFuc2NvZGVfaW5mbzsKLQlzdHJ1Y3QgdHJhbnNfbG9vcGJhY2tfcGRhdGEgKnBkYXRhOwotCi0JaWYgKGNzdHJlYW0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN1YnN0cmVhbVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0JcnRkID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChjc3RyZWFtKTsKLQlwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0JcGRhdGEtPmNzdHJlYW1bcnRkLT5kYWlfbGluay0+aWRdID0gY3N0cmVhbTsKLQotCW11dGV4X2xvY2soJnRyYW5zLT5sb2NrKTsKLQlpZiAodHJhbnMtPm51bV9zdHJlYW1zID4gTE9PUEJBQ0tfU0VTU0lPTl9NQVhfTlVNX1NUUkVBTVMpIHsKLQkJcHJfZXJyKCJtc21fdHJhbnNjb2RlX29wZW4gZmFpbGVkLi5pbnZhbGlkIHN0cmVhbVxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19DQVBUVVJFKSB7Ci0JCWlmICh0cmFucy0+c291cmNlLmNzdHJlYW0gPT0gTlVMTCkgewotCQkJdHJhbnMtPnNvdXJjZS5jc3RyZWFtID0gY3N0cmVhbTsKLQkJCXRyYW5zLT5udW1fc3RyZWFtcysrOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogY2FwdHVyZSBzdHJlYW0gYWxyZWFkeSBvcGVuZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSBpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQlpZiAodHJhbnMtPnNpbmsuY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCQl0cmFucy0+c2luay5jc3RyZWFtID0gY3N0cmVhbTsKLQkJCXRyYW5zLT5udW1fc3RyZWFtcysrOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiBwbGF5YmFjayBzdHJlYW0gYWxyZWFkeSBvcGVuZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCXByX2RlYnVnKCIlczogbnVtIHN0cmVhbSVkLCBzdHJlYW0gbmFtZSAlc1xuIiwgX19mdW5jX18sCi0JCSB0cmFucy0+bnVtX3N0cmVhbXMsIGNzdHJlYW0tPm5hbWUpOwotCi0JcG9wdWxhdGVfY29kZWNfbGlzdCh0cmFucywgY3N0cmVhbSk7Ci0KLQlpZiAodHJhbnMtPm51bV9zdHJlYW1zID09IExPT1BCQUNLX1NFU1NJT05fTUFYX05VTV9TVFJFQU1TKQl7Ci0JCXByX2RlYnVnKCIlczogTW92aW5nIGxvb3BiYWNrIHNlc3Npb24gdG8gUkVBRFkgc3RhdGUgJWRcbiIsCi0JCQkgX19mdW5jX18sIHRyYW5zLT5zZXNzaW9uX3N0YXRlKTsKLQkJdHJhbnMtPnNlc3Npb25fc3RhdGUgPSBMT09QQkFDS19TRVNTSU9OX1JFQURZOwotCX0KLQotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHRyYW5zOwotCWlmICh0cmFucy0+bnVtX3N0cmVhbXMgPT0gMSkKLQkJbXNtX2Fkc3BfaW5pdF9taXhlcl9jdGxfcHBfZXZlbnRfcXVldWUocnRkKTsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ0cmFucy0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc3RvcF90cmFuc2NvZGluZyhzdHJ1Y3QgbXNtX3RyYW5zY29kZV9sb29wYmFjayAqdHJhbnMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wY21fcng7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19wY21fdHg7Ci0KLQlpZiAodHJhbnMtPmF1ZGlvX2NsaWVudCAhPSBOVUxMKSB7Ci0JCXE2YXNtX2NtZCh0cmFucy0+YXVkaW9fY2xpZW50LCBDTURfQ0xPU0UpOwotCi0JCWlmICh0cmFucy0+c2luay5jc3RyZWFtICE9IE5VTEwpIHsKLQkJCXNvY19wY21fcnggPSB0cmFucy0+c2luay5jc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCQltc21fcGNtX3JvdXRpbmdfZGVyZWdfcGh5X3N0cmVhbSgKLQkJCQkJc29jX3BjbV9yeC0+ZGFpX2xpbmstPmlkLAotCQkJCQlTTkRfQ09NUFJFU1NfUExBWUJBQ0spOwotCQl9Ci0JCWlmICh0cmFucy0+c291cmNlLmNzdHJlYW0gIT0gTlVMTCkgewotCQkJc29jX3BjbV90eCA9IHRyYW5zLT5zb3VyY2UuY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCQkJbXNtX3BjbV9yb3V0aW5nX2RlcmVnX3BoeV9zdHJlYW0oCi0JCQkJCXNvY19wY21fdHgtPmRhaV9saW5rLT5pZCwKLQkJCQkJU05EX0NPTVBSRVNTX0NBUFRVUkUpOwotCQl9Ci0JCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKHRyYW5zLT5hdWRpb19jbGllbnQpOwotCQl0cmFucy0+YXVkaW9fY2xpZW50ID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja19mcmVlKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtKQotewotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgKnRyYW5zID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKGNzdHJlYW0pOwotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmdHJhbnMtPmxvY2spOwotCi0JcHJfZGVidWcoIiVzOiBUcmFuc2NvZGUgbG9vcGJhY2sgZW5kOiVkLCBzdHJlYW1zICVkXG4iLCBfX2Z1bmNfXywKLQkJICBjc3RyZWFtLT5kaXJlY3Rpb24sIHRyYW5zLT5udW1fc3RyZWFtcyk7Ci0JdHJhbnMtPm51bV9zdHJlYW1zLS07Ci0Jc3RvcF90cmFuc2NvZGluZyh0cmFucyk7Ci0KLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykKLQkJbWVtc2V0KCZ0cmFucy0+c2luaywgMCwgc2l6ZW9mKHN0cnVjdCBsb29wYmFja19zdHJlYW0pKTsKLQllbHNlIGlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpCi0JCW1lbXNldCgmdHJhbnMtPnNvdXJjZSwgMCwgc2l6ZW9mKHN0cnVjdCBsb29wYmFja19zdHJlYW0pKTsKLQotCXRyYW5zLT5zZXNzaW9uX3N0YXRlID0gTE9PUEJBQ0tfU0VTU0lPTl9DTE9TRTsKLQlpZiAodHJhbnMtPm51bV9zdHJlYW1zID09IDEpCi0JCW1zbV9hZHNwX2NsZWFuX21peGVyX2N0bF9wcF9ldmVudF9xdWV1ZShydGQpOwotCW11dGV4X3VubG9jaygmdHJhbnMtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja190cmlnZ2VyKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCQkgIGludCBjbWQpCi17Ci0Jc3RydWN0IHNuZF9jb21wcl9ydW50aW1lICpydW50aW1lID0gY3N0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgbXNtX3RyYW5zY29kZV9sb29wYmFjayAqdHJhbnMgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCi0JCWlmICh0cmFucy0+c2Vzc2lvbl9zdGF0ZSA9PSBMT09QQkFDS19TRVNTSU9OX1NUQVJUKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IElzc3VlIExvb3BiYWNrIHNlc3Npb24gJWQgUlVOXG4iLAotCQkJCSAgX19mdW5jX18sIHRyYW5zLT5pbnN0YW5jZSk7Ci0JCQlxNmFzbV9ydW5fbm93YWl0KHRyYW5zLT5hdWRpb19jbGllbnQsIDAsIDAsIDApOwotCQkJdHJhbnMtPnNlc3Npb25fc3RhdGUgPSBMT09QQkFDS19TRVNTSU9OX1JVTjsKLQkJfQotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJcHJfZGVidWcoIiVzOiBJc3N1ZSBMb29wYmFjayBzZXNzaW9uICVkIFNUT1BcbiIsIF9fZnVuY19fLAotCQkJICB0cmFucy0+aW5zdGFuY2UpOwotCQlpZiAodHJhbnMtPnNlc3Npb25fc3RhdGUgPT0gTE9PUEJBQ0tfU0VTU0lPTl9SVU4pCi0JCQlxNmFzbV9jbWRfbm93YWl0KHRyYW5zLT5hdWRpb19jbGllbnQsIENNRF9QQVVTRSk7Ci0JCXRyYW5zLT5zZXNzaW9uX3N0YXRlID0gTE9PUEJBQ0tfU0VTU0lPTl9TVEFSVDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja19zZXRfcGFyYW1zKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfY29tcHJfcGFyYW1zICpjb2RlY19wYXJhbSkKLXsKLQotCXN0cnVjdCBzbmRfY29tcHJfcnVudGltZSAqcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgKnRyYW5zID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcGNtX3J4OwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcGNtX3R4OwotCXVpbnQzMl90IGJpdF93aWR0aCA9IDE2OwotCWludCByZXQgPSAwOwotCi0JaWYgKHRyYW5zID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0cmFucy0+bG9jayk7Ci0KLQlpZiAoY3N0cmVhbS0+ZGlyZWN0aW9uID09IFNORF9DT01QUkVTU19QTEFZQkFDSykgewotCQlpZiAoY29kZWNfcGFyYW0tPmNvZGVjLmlkID09IFNORF9BVURJT0NPREVDX1BDTSkgewotCQkJdHJhbnMtPnNpbmsuY29kZWNfZm9ybWF0ID0KLQkJCQlGT1JNQVRfTElORUFSX1BDTTsKLQkJCXN3aXRjaCAoY29kZWNfcGFyYW0tPmNvZGVjLmZvcm1hdCkgewotCQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJCQliaXRfd2lkdGggPSAzMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCQkJYml0X3dpZHRoID0gMjQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJCQliaXRfd2lkdGggPSAyNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCQlkZWZhdWx0OgotCQkJCWJpdF93aWR0aCA9IDE2OwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiB1bmtub3duIHNpbmsgY29kZWNcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJdHJhbnMtPnNpbmsuc3RhcnQgPSB0cnVlOwotCX0KLQotCWlmIChjc3RyZWFtLT5kaXJlY3Rpb24gPT0gU05EX0NPTVBSRVNTX0NBUFRVUkUpIHsKLQkJc3dpdGNoIChjb2RlY19wYXJhbS0+Y29kZWMuaWQpIHsKLQkJY2FzZSBTTkRfQVVESU9DT0RFQ19QQ006Ci0JCQlwcl9kZWJ1ZygiU291cmNlIFNORF9BVURJT0NPREVDX1BDTVxuIik7Ci0JCQl0cmFucy0+c291cmNlLmNvZGVjX2Zvcm1hdCA9Ci0JCQkJRk9STUFUX0xJTkVBUl9QQ007Ci0JCQlicmVhazsKLQkJY2FzZSBTTkRfQVVESU9DT0RFQ19BQzM6Ci0JCQlwcl9kZWJ1ZygiU291cmNlIFNORF9BVURJT0NPREVDX0FDM1xuIik7Ci0JCQl0cmFucy0+c291cmNlLmNvZGVjX2Zvcm1hdCA9Ci0JCQkJRk9STUFUX0FDMzsKLQkJCWJyZWFrOwotCQljYXNlIFNORF9BVURJT0NPREVDX0VBQzM6Ci0JCQlwcl9kZWJ1ZygiU291cmNlIFNORF9BVURJT0NPREVDX0VBQzNcbiIpOwotCQkJdHJhbnMtPnNvdXJjZS5jb2RlY19mb3JtYXQgPQotCQkJCUZPUk1BVF9FQUMzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IHVua25vd24gc291cmNlIGNvZGVjXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCXRyYW5zLT5zb3VyY2Uuc3RhcnQgPSB0cnVlOwotCX0KLQotCXByX2RlYnVnKCIlczogdHJhbnMtPnNvdXJjZS5zdGFydCAlZCB0cmFucy0+c2luay5zdGFydCAlZCB0cmFucy0+c291cmNlLmNzdHJlYW0gJXBLIHRyYW5zLT5zaW5rLmNzdHJlYW0gJXBLIHRyYW5zLT5zZXNzaW9uX3N0YXRlICVkXG4iLAotCQkJX19mdW5jX18sIHRyYW5zLT5zb3VyY2Uuc3RhcnQsIHRyYW5zLT5zaW5rLnN0YXJ0LAotCQkJdHJhbnMtPnNvdXJjZS5jc3RyZWFtLCB0cmFucy0+c2luay5jc3RyZWFtLAotCQkJdHJhbnMtPnNlc3Npb25fc3RhdGUpOwotCi0JaWYgKCh0cmFucy0+c2Vzc2lvbl9zdGF0ZSA9PSBMT09QQkFDS19TRVNTSU9OX1JFQURZKSAmJgotCQkJdHJhbnMtPnNvdXJjZS5zdGFydCAmJiB0cmFucy0+c2luay5zdGFydCkgewotCQlwcl9kZWJ1ZygiJXM6IE1vdmluZyBsb29wYmFjayBzZXNzaW9uIHRvIHN0YXJ0IHN0YXRlXG4iLAotCQkJICBfX2Z1bmNfXyk7Ci0JCXRyYW5zLT5zZXNzaW9uX3N0YXRlID0gTE9PUEJBQ0tfU0VTU0lPTl9TVEFSVDsKLQl9Ci0KLQlpZiAodHJhbnMtPnNlc3Npb25fc3RhdGUgPT0gTE9PUEJBQ0tfU0VTU0lPTl9TVEFSVCkgewotCQlpZiAodHJhbnMtPmF1ZGlvX2NsaWVudCAhPSBOVUxMKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IEFTTSBjbGllbnQgYWxyZWFkeSBvcGVuZWQsIGNsb3NpbmdcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCXN0b3BfdHJhbnNjb2RpbmcodHJhbnMpOwotCQl9Ci0KLQkJdHJhbnMtPmF1ZGlvX2NsaWVudCA9IHE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYygKLQkJCQkoYXBwX2NiKWxvb3BiYWNrX2V2ZW50X2hhbmRsZXIsIHRyYW5zKTsKLQkJaWYgKCF0cmFucy0+YXVkaW9fY2xpZW50KSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCXByX2RlYnVnKCIlczogQVNNIGNsaWVudCBhbGxvY2F0ZWQsIGNhbGxiYWNrICVwS1xuIiwgX19mdW5jX18sCi0JCQkJCQlsb29wYmFja19ldmVudF9oYW5kbGVyKTsKLQkJdHJhbnMtPnNlc3Npb25faWQgPSB0cmFucy0+YXVkaW9fY2xpZW50LT5zZXNzaW9uOwotCQl0cmFucy0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUgPSBmYWxzZTsKLQkJcmV0ID0gcTZhc21fb3Blbl90cmFuc2NvZGVfbG9vcGJhY2sodHJhbnMtPmF1ZGlvX2NsaWVudCwKLQkJCQkJYml0X3dpZHRoLAotCQkJCQl0cmFucy0+c291cmNlLmNvZGVjX2Zvcm1hdCwKLQkJCQkJdHJhbnMtPnNpbmsuY29kZWNfZm9ybWF0KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IFNlc3Npb24gdHJhbnNjb2RlIGxvb3BiYWNrIG9wZW4gZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXE2YXNtX2F1ZGlvX2NsaWVudF9mcmVlKHRyYW5zLT5hdWRpb19jbGllbnQpOwotCQkJdHJhbnMtPmF1ZGlvX2NsaWVudCA9IE5VTEw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6IFN0YXJ0aW5nIEFETSBvcGVuIGZvciBsb29wYmFja1xuIiwgX19mdW5jX18pOwotCQlzb2NfcGNtX3J4ID0gdHJhbnMtPnNpbmsuY3N0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCQlzb2NfcGNtX3R4ID0gdHJhbnMtPnNvdXJjZS5jc3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JCWlmICh0cmFucy0+c291cmNlLmNvZGVjX2Zvcm1hdCAhPSBGT1JNQVRfTElORUFSX1BDTSkKLQkJCW1zbV9wY21fcm91dGluZ19yZWdfcGh5X2NvbXByX3N0cmVhbSgKLQkJCQkJc29jX3BjbV90eC0+ZGFpX2xpbmstPmlkLAotCQkJCQl0cmFucy0+YXVkaW9fY2xpZW50LT5wZXJmX21vZGUsCi0JCQkJCXRyYW5zLT5zZXNzaW9uX2lkLAotCQkJCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQkJCXRydWUpOwotCQllbHNlCi0JCQltc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oCi0JCQkJCXNvY19wY21fdHgtPmRhaV9saW5rLT5pZCwKLQkJCQkJdHJhbnMtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJCQl0cmFucy0+c2Vzc2lvbl9pZCwKLQkJCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKLQotCQltc21fcGNtX3JvdXRpbmdfcmVnX3BoeV9zdHJlYW0oCi0JCQkJCXNvY19wY21fcngtPmRhaV9saW5rLT5pZCwKLQkJCQkJdHJhbnMtPmF1ZGlvX2NsaWVudC0+cGVyZl9tb2RlLAotCQkJCQl0cmFucy0+c2Vzc2lvbl9pZCwKLQkJCQkJU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7Ci0JCXByX2RlYnVnKCIlczogU3VjY2Vzc2Z1bGx5IG9wZW5lZCBBRE0gc2Vzc2lvbnNcbiIsIF9fZnVuY19fKTsKLQl9Ci1leGl0OgotCW11dGV4X3VubG9jaygmdHJhbnMtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja19nZXRfY2FwcyhzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX2NvbXByX2NhcHMgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX2NvbXByX3J1bnRpbWUgKnJ1bnRpbWU7Ci0Jc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgKnRyYW5zOwotCi0JaWYgKCFhcmcgfHwgIWNzdHJlYW0pIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBhcmd1bWVudHNcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnVudGltZSA9IGNzdHJlYW0tPnJ1bnRpbWU7Ci0JdHJhbnMgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKGNzdHJlYW0tPmRpcmVjdGlvbiA9PSBTTkRfQ09NUFJFU1NfQ0FQVFVSRSkKLQkJbWVtY3B5KGFyZywgJnRyYW5zLT5zb3VyY2VfY29tcHJfY2FwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzbmRfY29tcHJfY2FwcykpOwotCWVsc2UKLQkJbWVtY3B5KGFyZywgJnRyYW5zLT5zaW5rX2NvbXByX2NhcCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX2NvbXByX2NhcHMpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdHJhbnNjb2RlX3N0cmVhbV9jbWRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IHRyYW5zX2xvb3BiYWNrX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgdHJhbnNfbG9vcGJhY2tfcGRhdGEgKikKLQkJCQlzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjb21wKTsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IE5VTEw7Ci0Jc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2sgKnBydGQ7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEgKmV2ZW50X2RhdGEgPSBOVUxMOwotCi0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXMgUmVjZWl2ZWQgaW52YWxpZCBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3N0cmVhbSA9IHBkYXRhLT5jc3RyZWFtW2ZlX2lkXTsKLQlpZiAoY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgY3N0cmVhbSBpcyBudWxsLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJ0ZCA9IGNzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXBydGQpIHsKLQkJcHJfZXJyKCIlczogcHJ0ZCBpcyBudWxsLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHBydGQtPmF1ZGlvX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvX2NsaWVudCBpcyBudWxsLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZXZlbnRfZGF0YSA9IChzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqKXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhOwotCWlmICgoZXZlbnRfZGF0YS0+ZXZlbnRfdHlwZSA8IEFEU1BfU1RSRUFNX1BQX0VWRU5UKSB8fAotCSAgICAoZXZlbnRfZGF0YS0+ZXZlbnRfdHlwZSA+PSBBRFNQX1NUUkVBTV9FVkVOVF9NQVgpKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgZXZlbnRfdHlwZT0lZCIsCi0JCQkgX19mdW5jX18sIGV2ZW50X2RhdGEtPmV2ZW50X3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChzaXplb2Yoc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEpICsgZXZlbnRfZGF0YS0+cGF5bG9hZF9sZW4pID49Ci0JCQkJCXNpemVvZih1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSkpIHsKLQkJcHJfZXJyKCIlcyBwYXJhbSBsZW5ndGg9JWQgIGV4Y2VlZHMgbGltaXQiLAotCQkJIF9fZnVuY19fLCBldmVudF9kYXRhLT5wYXlsb2FkX2xlbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBxNmFzbV9zZW5kX3N0cmVhbV9jbWQocHJ0ZC0+YXVkaW9fY2xpZW50LCBldmVudF9kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNlbmQgc3RyZWFtIGV2ZW50IGNtZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fdHJhbnNjb2RlX2lvbl9mZF9tYXBfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdW5zaWduZWQgbG9uZyBmZV9pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCB0cmFuc19sb29wYmFja19wZGF0YSAqcGRhdGEgPSAoc3RydWN0IHRyYW5zX2xvb3BiYWNrX3BkYXRhICopCi0JCQkJc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcCk7Ci0Jc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0gPSBOVUxMOwotCXN0cnVjdCBtc21fdHJhbnNjb2RlX2xvb3BiYWNrICpwcnRkOwotCWludCBmZDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChmZV9pZCA+PSBNU01fRlJPTlRFTkRfREFJX01BWCkgewotCQlwcl9lcnIoIiVzIFJlY2VpdmVkIG91dCBvZiBib3VuZHMgaW52YWxpZCBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3N0cmVhbSA9IHBkYXRhLT5jc3RyZWFtW2ZlX2lkXTsKLQlpZiAoY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgY3N0cmVhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChwcnRkLT5hdWRpb19jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19jbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KCZmZCwgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEsIHNpemVvZihmZCkpOwotCXJldCA9IHE2YXNtX3NlbmRfaW9uX2ZkKHBydGQtPmF1ZGlvX2NsaWVudCwgZmQpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaW9uIGZkXG4iLCBfX2Z1bmNfXyk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9ydGljX2V2ZW50X2Fja19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQl1bnNpZ25lZCBsb25nIGZlX2lkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IHRyYW5zX2xvb3BiYWNrX3BkYXRhICpwZGF0YSA9IChzdHJ1Y3QgdHJhbnNfbG9vcGJhY2tfcGRhdGEgKikKLQkJCQkJc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY29tcCk7Ci0Jc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW0gPSBOVUxMOwotCXN0cnVjdCBtc21fdHJhbnNjb2RlX2xvb3BiYWNrICpwcnRkOwotCWludCByZXQgPSAwOwotCWludCBwYXJhbV9sZW5ndGggPSAwOwotCi0JaWYgKGZlX2lkID49IE1TTV9GUk9OVEVORF9EQUlfTUFYKSB7Ci0JCXByX2VycigiJXMgUmVjZWl2ZWQgaW52YWxpZCBmZV9pZCAlbHVcbiIsCi0JCQlfX2Z1bmNfXywgZmVfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3N0cmVhbSA9IHBkYXRhLT5jc3RyZWFtW2ZlX2lkXTsKLQlpZiAoY3N0cmVhbSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXMgY3N0cmVhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcnRkID0gY3N0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWlmICghcHJ0ZCkgewotCQlwcl9lcnIoIiVzOiBwcnRkIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChwcnRkLT5hdWRpb19jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhdWRpb19jbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbWVtY3B5KCZwYXJhbV9sZW5ndGgsIHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAotCQlzaXplb2YocGFyYW1fbGVuZ3RoKSk7Ci0JaWYgKChwYXJhbV9sZW5ndGggKyBzaXplb2YocGFyYW1fbGVuZ3RoKSkKLQkJPj0gc2l6ZW9mKHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhKSkgewotCQlwcl9lcnIoIiVzIHBhcmFtIGxlbmd0aD0lZCAgZXhjZWVkcyBsaW1pdCIsCi0JCQlfX2Z1bmNfXywgcGFyYW1fbGVuZ3RoKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHE2YXNtX3NlbmRfcnRpY19ldmVudF9hY2socHJ0ZC0+YXVkaW9fY2xpZW50LAotCQkJdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEgKyBzaXplb2YocGFyYW1fbGVuZ3RoKSwKLQkJCXBhcmFtX2xlbmd0aCk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBzZW5kIHJ0aWMgZXZlbnQgYWNrLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV90cmFuc2NvZGVfc3RyZWFtX2NtZF9jb250cm9sKAotCQkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZSA9IERTUF9TVFJFQU1fQ01EOwotCWNvbnN0IGNoYXIgKmRldmljZU5vID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCWludCBjdGxfbGVuID0gMCwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9sb29wYmFja19zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2Fkc3Bfc3RyZWFtX2NtZF9pbmZvLAotCQkucHV0ID0gbXNtX3RyYW5zY29kZV9zdHJlYW1fY21kX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2xvb3BiYWNrX3N0cmVhbV9jbWRfY29uZmlnX2NvbnRyb2xbMF0ubmFtZSA9IG1peGVyX3N0cjsKLQlmZV9sb29wYmFja19zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPQotCQkJCXJ0ZC0+ZGFpX2xpbmstPmlkOwotCXByX2RlYnVnKCIlczogUmVnaXN0ZXJpbmcgbmV3IG1peGVyIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0JcmV0ID0gc25kX3NvY19hZGRfcGxhdGZvcm1fY29udHJvbHMocnRkLT5wbGF0Zm9ybSwKLQkJZmVfbG9vcGJhY2tfc3RyZWFtX2NtZF9jb25maWdfY29udHJvbCwKLQkJQVJSQVlfU0laRShmZV9sb29wYmFja19zdHJlYW1fY21kX2NvbmZpZ19jb250cm9sKSk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGZhaWxlZCB0byBhZGQgY3RsICVzLiBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBtaXhlcl9zdHIsIHJldCk7Ci0KLQlrZnJlZShtaXhlcl9zdHIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV90cmFuc2NvZGVfc3RyZWFtX2NhbGxiYWNrX2NvbnRyb2woCi0JCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWNvbnN0IGNoYXIgKm1peGVyX2N0bF9uYW1lID0gRFNQX1NUUkVBTV9DQUxMQkFDSzsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKLQotCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGZlX2xvb3BiYWNrX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2Fkc3Bfc3RyZWFtX2NhbGxiYWNrX2luZm8sCi0JCS5nZXQgPSBtc21fYWRzcF9zdHJlYW1fY2FsbGJhY2tfZ2V0LAotCQkucHJpdmF0ZV92YWx1ZSA9IDAsCi0JCX0KLQl9OwotCi0JaWYgKCFydGQpIHsKLQkJcHJfZXJyKCIlczogcnRkIGlzICBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdGxfbGVuID0gc3RybGVuKG1peGVyX2N0bF9uYW1lKSArIDEgKyBzdHJsZW4oZGV2aWNlTm8pICsgMTsKLQltaXhlcl9zdHIgPSBremFsbG9jKGN0bF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghbWl4ZXJfc3RyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbnByaW50ZihtaXhlcl9zdHIsIGN0bF9sZW4sICIlcyAlZCIsIG1peGVyX2N0bF9uYW1lLCBydGQtPnBjbS0+ZGV2aWNlKTsKLQlmZV9sb29wYmFja19jYWxsYmFja19jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2xvb3BiYWNrX2NhbGxiYWNrX2NvbmZpZ19jb250cm9sWzBdLnByaXZhdGVfdmFsdWUgPQotCQkJCQlydGQtPmRhaV9saW5rLT5pZDsKLQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIG5ldyBtaXhlciBjdGwgJXNcbiIsIF9fZnVuY19fLCBtaXhlcl9zdHIpOwotCXJldCA9IHNuZF9zb2NfYWRkX3BsYXRmb3JtX2NvbnRyb2xzKHJ0ZC0+cGxhdGZvcm0sCi0JCQlmZV9sb29wYmFja19jYWxsYmFja19jb25maWdfY29udHJvbCwKLQkJCUFSUkFZX1NJWkUoZmVfbG9vcGJhY2tfY2FsbGJhY2tfY29uZmlnX2NvbnRyb2wpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlcy4gZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgbWl4ZXJfc3RyLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfbWl4ZXJfc3RyOwotCX0KLQotCWtjdGwgPSBzbmRfc29jX2NhcmRfZ2V0X2tjb250cm9sKHJ0ZC0+Y2FyZCwgbWl4ZXJfc3RyKTsKLQlpZiAoIWtjdGwpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBrY3RsICVzLlxuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9taXhlcl9zdHI7Ci0JfQotCi0Ja2N0bC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLWZyZWVfbWl4ZXJfc3RyOgotCWtmcmVlKG1peGVyX3N0cik7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9hZGRfaW9uX2ZkX2NtZF9jb250cm9sKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JY29uc3QgY2hhciAqbWl4ZXJfY3RsX25hbWUgPSAiUGxheWJhY2sgSU9OIEZEIjsKLQljb25zdCBjaGFyICpkZXZpY2VObyA9ICJOTiI7Ci0JY2hhciAqbWl4ZXJfc3RyID0gTlVMTDsKLQlpbnQgY3RsX2xlbiA9IDAsIHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZmVfaW9uX2ZkX2NvbmZpZ19jb250cm9sWzFdID0gewotCQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICI/IiwKLQkJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCi0JCS5pbmZvID0gbXNtX2Fkc3Bfc3RyZWFtX2NtZF9pbmZvLAotCQkucHV0ID0gbXNtX3RyYW5zY29kZV9pb25fZmRfbWFwX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2lvbl9mZF9jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2lvbl9mZF9jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlyZXQgPSBzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCWZlX2lvbl9mZF9jb25maWdfY29udHJvbCwKLQkJCQlBUlJBWV9TSVpFKGZlX2lvbl9mZF9jb25maWdfY29udHJvbCkpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0KLQlrZnJlZShtaXhlcl9zdHIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV90cmFuc2NvZGVfYWRkX2V2ZW50X2Fja19jbWRfY29udHJvbCgKLQkJCQkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQljb25zdCBjaGFyICptaXhlcl9jdGxfbmFtZSA9ICJQbGF5YmFjayBFdmVudCBBY2siOwotCWNvbnN0IGNoYXIgKmRldmljZU5vID0gIk5OIjsKLQljaGFyICptaXhlcl9zdHIgPSBOVUxMOwotCWludCBjdGxfbGVuID0gMCwgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBmZV9ldmVudF9hY2tfY29uZmlnX2NvbnRyb2xbMV0gPSB7Ci0JCXsKLQkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIj8iLAotCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKLQkJLmluZm8gPSBtc21fYWRzcF9zdHJlYW1fY21kX2luZm8sCi0JCS5wdXQgPSBtc21fdHJhbnNjb2RlX3J0aWNfZXZlbnRfYWNrX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAwLAotCQl9Ci0JfTsKLQotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXMgTlVMTCBydGRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN0bF9sZW4gPSBzdHJsZW4obWl4ZXJfY3RsX25hbWUpICsgMSArIHN0cmxlbihkZXZpY2VObykgKyAxOwotCW1peGVyX3N0ciA9IGt6YWxsb2MoY3RsX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaXhlcl9zdHIpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXNucHJpbnRmKG1peGVyX3N0ciwgY3RsX2xlbiwgIiVzICVkIiwgbWl4ZXJfY3RsX25hbWUsIHJ0ZC0+cGNtLT5kZXZpY2UpOwotCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbFswXS5uYW1lID0gbWl4ZXJfc3RyOwotCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbFswXS5wcml2YXRlX3ZhbHVlID0gcnRkLT5kYWlfbGluay0+aWQ7Ci0JcHJfZGVidWcoIiVzOiBSZWdpc3RlcmluZyBuZXcgbWl4ZXIgY3RsICVzXG4iLCBfX2Z1bmNfXywgbWl4ZXJfc3RyKTsKLQlyZXQgPSBzbmRfc29jX2FkZF9wbGF0Zm9ybV9jb250cm9scyhydGQtPnBsYXRmb3JtLAotCQkJCWZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbCwKLQkJCQlBUlJBWV9TSVpFKGZlX2V2ZW50X2Fja19jb25maWdfY29udHJvbCkpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIGN0bCAlc1xuIiwgX19mdW5jX18sIG1peGVyX3N0cik7Ci0KLQlrZnJlZShtaXhlcl9zdHIpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBtc21fdHJhbnNjb2RlX3N0cmVhbV9jbWRfY29udHJvbChydGQpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogQURTUCBTdHJlYW0gQ21kIENvbnRyb2wgb3BlbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCXJjID0gbXNtX3RyYW5zY29kZV9zdHJlYW1fY2FsbGJhY2tfY29udHJvbChydGQpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogQURTUCBTdHJlYW0gY2FsbGJhY2sgQ29udHJvbCBvcGVuIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJjID0gbXNtX3RyYW5zY29kZV9hZGRfaW9uX2ZkX2NtZF9jb250cm9sKHJ0ZCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIHRyYW5zY29kZSBpb24gZmQgQ29udHJvbFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJjID0gbXNtX3RyYW5zY29kZV9hZGRfZXZlbnRfYWNrX2NtZF9jb250cm9sKHJ0ZCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWRkIHRyYW5zY29kZSBldmVudCBhY2sgQ29udHJvbFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9jb21wcl9vcHMgbXNtX3RyYW5zY29kZV9sb29wYmFja19vcHMgPSB7Ci0JLm9wZW4JCQk9IG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfb3BlbiwKLQkuZnJlZQkJCT0gbXNtX3RyYW5zY29kZV9sb29wYmFja19mcmVlLAotCS50cmlnZ2VyCQk9IG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfdHJpZ2dlciwKLQkuc2V0X3BhcmFtcwkJPSBtc21fdHJhbnNjb2RlX2xvb3BiYWNrX3NldF9wYXJhbXMsCi0JLmdldF9jYXBzCQk9IG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfZ2V0X2NhcHMsCi19OwotCi0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9sb29wYmFja19wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc3RydWN0IHRyYW5zX2xvb3BiYWNrX3BkYXRhICpwZGF0YSA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlwZGF0YSA9IChzdHJ1Y3QgdHJhbnNfbG9vcGJhY2tfcGRhdGEgKikKLQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFuc19sb29wYmFja19wZGF0YSksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNuZF9zb2NfcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdGZvcm0sIHBkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBtc21fc29jX3BsYXRmb3JtID0gewotCS5wcm9iZQkJPSBtc21fdHJhbnNjb2RlX2xvb3BiYWNrX3Byb2JlLAotCS5jb21wcl9vcHMJPSAmbXNtX3RyYW5zY29kZV9sb29wYmFja19vcHMsCi0JLnBjbV9uZXcJPSBtc21fdHJhbnNjb2RlX2xvb3BiYWNrX25ldywKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3RyYW5zY29kZV9kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQotCXByX2RlYnVnKCIlczogZGV2IG5hbWUgJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSk7Ci0JaWYgKHBkZXYtPmRldi5vZl9ub2RlKQotCQlkZXZfc2V0X25hbWUoJnBkZXYtPmRldiwgIiVzIiwgIm1zbS10cmFuc2NvZGUtbG9vcGJhY2siKTsKLQotCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsCi0JCQkJCSZtc21fc29jX3BsYXRmb3JtKTsKLX0KLQotc3RhdGljIGludCBtc21fdHJhbnNjb2RlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXNtX3RyYW5zY29kZV9sb29wYmFja19kdF9tYXRjaFtdID0gewotCXsuY29tcGF0aWJsZSA9ICJxY29tLG1zbS10cmFuc2NvZGUtbG9vcGJhY2sifSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfZHRfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fdHJhbnNjb2RlX2xvb3BiYWNrX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJtc20tdHJhbnNjb2RlLWxvb3BiYWNrIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1zbV90cmFuc2NvZGVfbG9vcGJhY2tfZHRfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSBtc21fdHJhbnNjb2RlX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX3RyYW5zY29kZV9yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21fc29jX3BsYXRmb3JtX2luaXQodm9pZCkKLXsKLQltZW1zZXQoJnRyYW5zY29kZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IG1zbV90cmFuc2NvZGVfbG9vcGJhY2spKTsKLQltdXRleF9pbml0KCZ0cmFuc2NvZGVfaW5mby5sb2NrKTsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtc21fdHJhbnNjb2RlX2xvb3BiYWNrX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChtc21fc29jX3BsYXRmb3JtX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXNtX3NvY19wbGF0Zm9ybV9leGl0KHZvaWQpCi17Ci0JbXV0ZXhfZGVzdHJveSgmdHJhbnNjb2RlX2luZm8ubG9jayk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1zbV90cmFuc2NvZGVfbG9vcGJhY2tfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KG1zbV9zb2NfcGxhdGZvcm1fZXhpdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiVHJhbnNjb2RlIGxvb3BiYWNrIHBsYXRmb3JtIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YWRtLmMgYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwOTE3Zi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhZG0uYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHIuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFkbS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgotI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgotI2luY2x1ZGUgIm1zbS1kdHMtc3JzLXRtLWNvbmZpZy5oIgotI2luY2x1ZGUgPHNvdW5kL2Fkc3BfZXJyLmg+Ci0KLSNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCi0KLSNkZWZpbmUgUkVTRVRfQ09QUF9JRCA5OQotI2RlZmluZSBJTlZBTElEX0NPUFBfSUQgMHhGRgotLyogVXNlZCBmb3IgaW5iYW5kIHBheWxvYWQgY29weSwgbWF4IHNpemUgaXMgNGsgKi8KLS8qIDIgaXMgdG8gYWNjb3VudCBmb3IgbW9kdWxlICYgcGFyYW0gSUQgaW4gcGF5bG9hZCAqLwotI2RlZmluZSBBRE1fR0VUX1BBUkFNRVRFUl9MRU5HVEggICg0MDk2IC0gQVBSX0hEUl9TSVpFIC0gMiAqIHNpemVvZih1aW50MzJfdCkpCi0KLSNkZWZpbmUgVUxMX1NVUFBPUlRFRF9CSVRTX1BFUl9TQU1QTEUgMTYKLSNkZWZpbmUgVUxMX1NVUFBPUlRFRF9TQU1QTEVfUkFURSA0ODAwMAotCi0jaWZuZGVmIENPTkZJR19ET0xCWV9EQVAKLSN1bmRlZiBET0xCWV9BRE1fQ09QUF9UT1BPTE9HWV9JRAotI2RlZmluZSBET0xCWV9BRE1fQ09QUF9UT1BPTE9HWV9JRCAweEZGRkZGRkZFCi0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfRE9MQllfRFMyCi0jdW5kZWYgRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lECi0jZGVmaW5lIERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRCAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogRU5VTSBmb3IgYWRtX3N0YXR1cyAqLwotZW51bSBhZG1fY2FsX3N0YXR1cyB7Ci0JQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRCA9IDAsCi0JQURNX1NUQVRVU19NQVgsCi19OwotCi1zdHJ1Y3QgYWRtX2NvcHAgewotCi0JYXRvbWljX3QgaWRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQlhdG9taWNfdCBjbnRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQlhdG9taWNfdCB0b3BvbG9neVtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWF0b21pY190IG1vZGVbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQlhdG9taWNfdCBzdGF0W0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07Ci0JYXRvbWljX3QgcmF0ZVtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWF0b21pY190IGJpdF93aWR0aFtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCWF0b21pY190IGNoYW5uZWxzW0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07Ci0JYXRvbWljX3QgYXBwX3R5cGVbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQlhdG9taWNfdCBhY2RiX2lkW0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdFtBRkVfTUFYX1BPUlRTXVtNQVhfQ09QUFNfUEVSX1BPUlRdOwotCXdhaXRfcXVldWVfaGVhZF90IGFkbV9kZWxheV93YWl0W0FGRV9NQVhfUE9SVFNdW01BWF9DT1BQU19QRVJfUE9SVF07Ci0JYXRvbWljX3QgYWRtX2RlbGF5X3N0YXRbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQl1aW50MzJfdCBhZG1fZGVsYXlbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLQl1bnNpZ25lZCBsb25nIGFkbV9zdGF0dXNbQUZFX01BWF9QT1JUU11bTUFYX0NPUFBTX1BFUl9QT1JUXTsKLX07Ci0KLXN0cnVjdCBzb3VyY2VfdHJhY2tpbmdfZGF0YSB7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmlvbl9jbGllbnQ7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGU7Ci0Jc3RydWN0IHBhcmFtX291dGJhbmQgbWVtbWFwOwotCWludCBhcHJfY21kX3N0YXR1czsKLX07Ci0KLXN0cnVjdCBhZG1fY3RsIHsKLQl2b2lkICphcHI7Ci0KLQlzdHJ1Y3QgYWRtX2NvcHAgY29wcDsKLQotCWF0b21pY190IG1hdHJpeF9tYXBfc3RhdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBtYXRyaXhfbWFwX3dhaXQ7Ci0KLQlhdG9taWNfdCBhZG1fc3RhdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBhZG1fd2FpdDsKLQotCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfZGF0YVtBRE1fTUFYX0NBTF9UWVBFU107Ci0KLQlhdG9taWNfdCBtZW1fbWFwX2hhbmRsZXNbQURNX01FTV9NQVBfSU5ERVhfTUFYXTsKLQlhdG9taWNfdCBtZW1fbWFwX2luZGV4OwotCi0Jc3RydWN0IHBhcmFtX291dGJhbmQgb3V0YmFuZF9tZW1tYXA7Ci0Jc3RydWN0IHNvdXJjZV90cmFja2luZ19kYXRhIHNvdXJjZVRyYWNraW5nRGF0YTsKLQotCWludCBzZXRfY3VzdG9tX3RvcG9sb2d5OwotCWludCBlY19yZWZfcng7Ci0JaW50IG51bV9lY19yZWZfcnhfY2hhbnM7Ci0JaW50IGVjX3JlZl9yeF9iaXRfd2lkdGg7Ci0JaW50IGVjX3JlZl9yeF9zYW1wbGluZ19yYXRlOwotfTsKLQotc3RhdGljIHN0cnVjdCBhZG1fY3RsCQkJdGhpc19hZG07Ci0KLXN0cnVjdCBhZG1fbXVsdGlfY2hfbWFwIHsKLQlib29sIHNldF9jaGFubmVsX21hcDsKLQljaGFyIGNoYW5uZWxfbWFwcGluZ1tQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTF07Ci19OwotCi0jZGVmaW5lIEFETV9NQ0hfTUFQX0lEWF9QTEFZQkFDSyAwCi0jZGVmaW5lIEFETV9NQ0hfTUFQX0lEWF9SRUMgMQotc3RhdGljIHN0cnVjdCBhZG1fbXVsdGlfY2hfbWFwIG11bHRpX2NoX21hcHNbMl0gPSB7Ci0JCQkJCQkJeyBmYWxzZSwKLQkJCQkJCQl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KLQkJCQkJCQl9LAotCQkJCQkJCXsgZmFsc2UsCi0JCQkJCQkJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9Ci0JCQkJCQkJfQotfTsKLQotc3RhdGljIGludCBhZG1fZ2V0X3BhcmFtZXRlcnNbTUFYX0NPUFBTX1BFUl9QT1JUICogQURNX0dFVF9QQVJBTUVURVJfTEVOR1RIXTsKLXN0YXRpYyBpbnQgYWRtX21vZHVsZV90b3BvX2xpc3RbCi0JTUFYX0NPUFBTX1BFUl9QT1JUICogQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSF07Ci0KLWludCBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KGludCBwb3J0X2lkKQotewotCWludCBpbmRleDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgdmFsaWRhdGlvbiBmYWlsZWQgaWQgMHgleCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZHggJWQgcG9ydF9pZCAweCV4XG4iLAotCQkJX19mdW5jX18sIGluZGV4LAotCQkJcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWR4LSAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLWludCBhZG1fZ2V0X2RlZmF1bHRfY29wcF9pZHgoaW50IHBvcnRfaWQpCi17Ci0JaW50IHBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKSwgaWR4OwotCi0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQ6IDB4JXgiLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWR4OiVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZHgpOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgewotCQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2lkeF0pICE9Ci0JCQlSRVNFVF9DT1BQX0lEKQotCQkJcmV0dXJuIGlkeDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBhZG1fZ2V0X3RvcG9sb2d5X2Zvcl9wb3J0X2Zyb21fY29wcF9pZChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWQpCi17Ci0JaW50IHBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKSwgaWR4OwotCi0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQ6IDB4JXgiLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9DT1BQU19QRVJfUE9SVDsgaWR4KyspCi0JCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1baWR4XSkgPT0gY29wcF9pZCkKLQkJCXJldHVybiBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC50b3BvbG9neVtwb3J0X2lkeF0KLQkJCQkJCQkJICBbaWR4XSk7Ci0JcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX2lkICVkIHBvcnRfaWQgMHgleFxuIiwKLQkJX19mdW5jX18sIGNvcHBfaWQsIHBvcnRfaWQpOwotCXJldHVybiAwOwotfQotCi1pbnQgYWRtX2dldF90b3BvbG9neV9mb3JfcG9ydF9jb3BwX2lkeChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4KQotewotCWludCBwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0KLQlpZiAocG9ydF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQ6IDB4JXggY29wcCBpZDogMHgleCIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC50b3BvbG9neVtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLX0KLQotaW50IGFkbV9nZXRfaW5kZXhlc19mcm9tX2NvcHBfaWQoaW50IGNvcHBfaWQsIGludCAqY29wcF9pZHgsIGludCAqcG9ydF9pZHgpCi17Ci0JaW50IHBfaWR4LCBjX2lkeDsKLQotCWZvciAocF9pZHggPSAwOyBwX2lkeCA8IEFGRV9NQVhfUE9SVFM7IHBfaWR4KyspIHsKLQkJZm9yIChjX2lkeCA9IDA7IGNfaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBjX2lkeCsrKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcF9pZHhdW2NfaWR4XSkKLQkJCQkJCQkJPT0gY29wcF9pZCkgewotCQkJCWlmIChjb3BwX2lkeCAhPSBOVUxMKQotCQkJCQkqY29wcF9pZHggPSBjX2lkeDsKLQkJCQlpZiAocG9ydF9pZHggIT0gTlVMTCkKLQkJCQkJKnBvcnRfaWR4ID0gcF9pZHg7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX2dldF9jb3BwX2lkKGludCBwb3J0X2lkeCwgaW50IGNvcHBfaWR4KQotewotCXByX2RlYnVnKCIlczogcG9ydF9pZHg6JWQgY29wcF9pZHg6JWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkeCwgY29wcF9pZHgpOwotCi0JaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX2dldF9pZHhfaWZfY29wcF9leGlzdHMoaW50IHBvcnRfaWR4LCBpbnQgdG9wb2xvZ3ksIGludCBtb2RlLAotCQkJCSBpbnQgcmF0ZSwgaW50IGJpdF93aWR0aCwgaW50IGFwcF90eXBlKQotewotCWludCBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWR4LSVkLCB0b3BvbG9neS0weCV4LCBtb2RlLSVkLCByYXRlLSVkLCBiaXRfd2lkdGgtJWRcbiIsCi0JCSBfX2Z1bmNfXywgcG9ydF9pZHgsIHRvcG9sb2d5LCBtb2RlLCByYXRlLCBiaXRfd2lkdGgpOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGlkeCsrKQotCQlpZiAoKHRvcG9sb2d5ID09Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC50b3BvbG9neVtwb3J0X2lkeF1baWR4XSkpICYmCi0JCSAgICAobW9kZSA9PSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5tb2RlW3BvcnRfaWR4XVtpZHhdKSkgJiYKLQkJICAgIChyYXRlID09IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnJhdGVbcG9ydF9pZHhdW2lkeF0pKSAmJgotCQkgICAgKGJpdF93aWR0aCA9PQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuYml0X3dpZHRoW3BvcnRfaWR4XVtpZHhdKSkgJiYKLQkJICAgIChhcHBfdHlwZSA9PQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuYXBwX3R5cGVbcG9ydF9pZHhdW2lkeF0pKSkKLQkJCXJldHVybiBpZHg7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX2dldF9uZXh0X2F2YWlsYWJsZV9jb3BwKGludCBwb3J0X2lkeCkKLXsKLQlpbnQgaWR4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBpZHgrKykgewotCQlwcl9kZWJ1ZygiJXM6IGNvcHBfaWQ6MHgleCBwb3J0X2lkeDolZCBpZHg6JWRcbiIsIF9fZnVuY19fLAotCQkJIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtpZHhdKSwKLQkJCSBwb3J0X2lkeCwgaWR4KTsKLQkJaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtpZHhdKSA9PQotCQkJCQkJCQlSRVNFVF9DT1BQX0lEKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBpZHg7Ci19Ci0KLWludCBzcnNfdHJ1bWVkaWFfb3BlbihpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBfX3MzMiBzcnNfdGVjaF9pZCwKLQkJICAgICAgdm9pZCAqc3JzX3BhcmFtcykKLXsKLQlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSAqYWRtX3BhcmFtcyA9IE5VTEw7Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NSAqYWRtX3BhcmFtc18gPSBOVUxMOwotCV9fczMyIHN6ID0gMCwgcGFyYW1faWQsIG1vZHVsZV9pZCA9IFNSU19UUlVNRURJQV9NT0RVTEVfSUQsIG91dGJhbmQgPSAwOwotCWludCByZXQgPSAwLCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCJTUlMgLSAlcyIsIF9fZnVuY19fKTsKLQotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzd2l0Y2ggKHNyc190ZWNoX2lkKSB7Ci0JY2FzZSBTUlNfSURfR0xPQkFMOiB7Ci0JCXN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCAqZ2xiX3BhcmFtcyA9IE5VTEw7Ci0KLQkJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpICsKLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HTE9CQUwpOwotCQlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYWRtX3BhcmFtcykgewotCQkJcHJfZXJyKCIlcywgYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0xPQkFMKSArCi0JCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KTsKLQkJcGFyYW1faWQgPSBTUlNfVFJVTUVESUFfUEFSQU1TOwotCQlhZG1fcGFyYW1zLT5wYXJhbXMucGFyYW1fc2l6ZSA9Ci0JCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dMT0JBTCk7Ci0JCWdsYl9wYXJhbXMgPSAoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0xPQkFMICopCi0JCQkoKHU4ICopYWRtX3BhcmFtcyArCi0JCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpKTsKLQkJbWVtY3B5KGdsYl9wYXJhbXMsIHNyc19wYXJhbXMsCi0JCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0xPQkFMKSk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFNSU19JRF9XT1dIRDogewotCQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCAqd2hkX3BhcmFtcyA9IE5VTEw7Ci0KLQkJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpICsKLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCk7Ci0JCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFhZG1fcGFyYW1zKSB7Ci0JCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSk7Ci0JCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNU19XT1dIRDsKLQkJYWRtX3BhcmFtcy0+cGFyYW1zLnBhcmFtX3NpemUgPQotCQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19XT1dIRCk7Ci0JCXdoZF9wYXJhbXMgPSAoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQgKikKLQkJCSgodTggKilhZG1fcGFyYW1zICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSkpOwotCQltZW1jcHkod2hkX3BhcmFtcywgc3JzX3BhcmFtcywKLQkJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfV09XSEQpKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU1JTX0lEX0NTSFA6IHsKLQkJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfQ1NIUCAqY2hwX3BhcmFtcyA9IE5VTEw7Ci0KLQkJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpICsKLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQKTsKLQkJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIWFkbV9wYXJhbXMpIHsKLQkJCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFApICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpOwotCQlwYXJhbV9pZCA9IFNSU19UUlVNRURJQV9QQVJBTVNfQ1NIUDsKLQkJYWRtX3BhcmFtcy0+cGFyYW1zLnBhcmFtX3NpemUgPQotCQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQKTsKLQkJY2hwX3BhcmFtcyA9IChzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19DU0hQICopCi0JCQkoKHU4ICopYWRtX3BhcmFtcyArCi0JCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpKTsKLQkJbWVtY3B5KGNocF9wYXJhbXMsIHNyc19wYXJhbXMsCi0JCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0NTSFApKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU1JTX0lEX0hQRjogewotCQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYgKmhwZl9wYXJhbXMgPSBOVUxMOwotCi0JCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCi0JCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGKTsKLQkJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIWFkbV9wYXJhbXMpIHsKLQkJCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hQRikgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSk7Ci0JCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNU19IUEY7Ci0JCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9zaXplID0KLQkJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSFBGKTsKLQkJaHBmX3BhcmFtcyA9IChzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYgKikKLQkJCSgodTggKilhZG1fcGFyYW1zICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX2luYmFuZF92NSkpOwotCQltZW1jcHkoaHBmX3BhcmFtcywgc3JzX3BhcmFtcywKLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19IUEYpKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU1JTX0lEX0FFUTogewotCQlpbnQgKnVwZGF0ZV9wYXJhbXNfcHRyID0gKGludCAqKXRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLmt2YWRkcjsKLQotCQlvdXRiYW5kID0gMTsKLQkJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWFkbV9wYXJhbXNfID0gKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUgKilhZG1fcGFyYW1zOwotCQlpZiAoIWFkbV9wYXJhbXNfKSB7Ci0JCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlzeiA9IHNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19BRVEpOwotCQlpZiAodXBkYXRlX3BhcmFtc19wdHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCJBRE1fU1JTX1RSVU1FRElBIC0gJXM6IG51bGwgbWVtbWFwIGZvciBBRVEgcGFyYW1zXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNU19BRVE7Ci0JCSp1cGRhdGVfcGFyYW1zX3B0cisrID0gbW9kdWxlX2lkOwotCQkqdXBkYXRlX3BhcmFtc19wdHIrKyA9IHBhcmFtX2lkOwotCQkqdXBkYXRlX3BhcmFtc19wdHIrKyA9IHN6OwotCQltZW1jcHkodXBkYXRlX3BhcmFtc19wdHIsIHNyc19wYXJhbXMsIHN6KTsKLQotCQlhZG1fcGFyYW1zXy0+cGF5bG9hZF9zaXplID0gc3ogKyAxMjsKLQotCQlicmVhazsKLQl9Ci0JY2FzZSBTUlNfSURfSEw6IHsKLQkJc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwgKmhsX3BhcmFtcyA9IE5VTEw7Ci0KLQkJc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpICsKLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITCk7Ci0JCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFhZG1fcGFyYW1zKSB7Ci0JCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19ITCkgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSk7Ci0JCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNU19ITDsKLQkJYWRtX3BhcmFtcy0+cGFyYW1zLnBhcmFtX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMKTsKLQkJaGxfcGFyYW1zID0gKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0hMICopCi0JCQkoKHU4ICopYWRtX3BhcmFtcyArCi0JCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc19pbmJhbmRfdjUpKTsKLQkJbWVtY3B5KGhsX3BhcmFtcywgc3JzX3BhcmFtcywKLQkJCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfSEwpKTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgU1JTX0lEX0dFUTogewotCQlzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEgKmdlcV9wYXJhbXMgPSBOVUxMOwotCi0JCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSArCi0JCQlzaXplb2Yoc3RydWN0IHNyc190cnVtZWRpYV9wYXJhbXNfR0VRKTsKLQkJYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIWFkbV9wYXJhbXMpIHsKLQkJCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUSkgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSk7Ci0JCXBhcmFtX2lkID0gU1JTX1RSVU1FRElBX1BBUkFNU19HRVE7Ci0JCWFkbV9wYXJhbXMtPnBhcmFtcy5wYXJhbV9zaXplID0KLQkJCXNpemVvZihzdHJ1Y3Qgc3JzX3RydW1lZGlhX3BhcmFtc19HRVEpOwotCQlnZXFfcGFyYW1zID0gKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUSAqKQotCQkJKCh1OCAqKWFkbV9wYXJhbXMgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfaW5iYW5kX3Y1KSk7Ci0JCW1lbWNweShnZXFfcGFyYW1zLCBzcnNfcGFyYW1zLAotCQkJc2l6ZW9mKHN0cnVjdCBzcnNfdHJ1bWVkaWFfcGFyYW1zX0dFUSkpOwotCQlwcl9kZWJ1ZygiU1JTIC0gJXM6IEdFUSBwYXJhbXMgcHJlcGFyZWRcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCA9Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlhZG1fcGFyYW1zLT5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7Ci0JaWYgKG91dGJhbmQgJiYgdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAucGFkZHIpIHsKLQkJYWRtX3BhcmFtcy0+aGRyLnBrdF9zaXplID0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpOwotCQlhZG1fcGFyYW1zLT5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cygKLQkJCQkJCXRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyKTsKLQkJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAotCQkJCQkJdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAucGFkZHIpOwotCQlhZG1fcGFyYW1zLT5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS4KLQkJCQkJbWVtX21hcF9oYW5kbGVzW0FETV9TUlNfVFJVTUVESUFdKTsKLQl9IGVsc2UgewotCQlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKLQkJYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCQlhZG1fcGFyYW1zLT5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0KLQkJYWRtX3BhcmFtcy0+cGFyYW1zLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKLQkJYWRtX3BhcmFtcy0+cGFyYW1zLnBhcmFtX2lkID0gcGFyYW1faWQ7Ci0JCWFkbV9wYXJhbXMtPnBhcmFtcy5yZXNlcnZlZCA9IDA7Ci0JfQotCi0JcHJfZGVidWcoIlNSUyAtICVzOiBDb21tYW5kIHdhcyBzZW50IG5vdyBjaGVjayBRNiAtIHBvcnQgaWQgPSAlZCwgc2l6ZSAlZCwgbW9kdWxlIGlkICV4LCBwYXJhbSBpZCAleC5cbiIsCi0JCQlfX2Z1bmNfXywgYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCwKLQkJCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSwgbW9kdWxlX2lkLCBwYXJhbV9pZCk7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wYXJhbXMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiU1JTIC0gJXM6IEFETSBlbmFibGUgZm9yIHBvcnQgJWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCXBvcnRfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgd2l0aCBjb3BwIGlkICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBTUlMgc2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCWtmcmVlKGFkbV9wYXJhbXMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX3BvcHVsYXRlX2NoYW5uZWxfd2VpZ2h0KHUxNiAqcHRyLAotCQkJCQlzdHJ1Y3QgbXNtX3BjbV9jaGFubmVsX21peGVyICpjaF9taXhlciwKLQkJCQkJaW50IGNoYW5uZWxfaW5kZXgpCi17Ci0JdTE2IGksIGosIHN0YXJ0X2luZGV4ID0gMDsKLQotCWlmIChjaGFubmVsX2luZGV4ID4gY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsKSB7Ci0JCXByX2VycigiJXM6IGNoYW5uZWwgaW5kZXggJWQgaXMgbGFyZ2VyIHRoYW4gb3V0cHV0X2NoYW5uZWwgJWRcbiIsCi0JCQkgX19mdW5jX18sIGNoYW5uZWxfaW5kZXgsIGNoX21peGVyLT5vdXRwdXRfY2hhbm5lbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjaF9taXhlci0+b3V0cHV0X2NoYW5uZWw7IGkrKykgewotCQlwcl9kZWJ1ZygiJXM6IHdlaWdodCBmb3Igb3V0cHV0ICVkOiIsIF9fZnVuY19fLCBpKTsKLQkJZm9yIChqID0gMDsgaiA8IEFETV9NQVhfQ0hBTk5FTFM7IGorKykKLQkJCXByX2RlYnVnKCIgJWQiLAotCQkJCWNoX21peGVyLT5jaGFubmVsX3dlaWdodFtpXVtqXSk7Ci0JCXByX2RlYnVnKCJcbiIpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsX2luZGV4OyArK2kpCi0JCXN0YXJ0X2luZGV4ICs9IGNoX21peGVyLT5pbnB1dF9jaGFubmVsc1tpXTsKLQotCWZvciAoaSA9IDA7IGkgPCBjaF9taXhlci0+b3V0cHV0X2NoYW5uZWw7ICsraSkgewotCQlmb3IgKGogPSBzdGFydF9pbmRleDsKLQkJCWogPCBzdGFydF9pbmRleCArCi0JCQljaF9taXhlci0+aW5wdXRfY2hhbm5lbHNbY2hhbm5lbF9pbmRleF07IGorKykgewotCQkJKnB0ciA9IGNoX21peGVyLT5jaGFubmVsX3dlaWdodFtpXVtqXTsKLQkJCSBwcl9kZWJ1ZygiJXM6IHB0clslZF1bJWRdID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGksIGosICpwdHIpOwotCQkJIHB0cisrOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhZG1fcHJvZ3JhbWFibGVfY2hhbm5lbF9taXhlcgotICoKLSAqIFJlY2VpdmVzIHBvcnRfaWQsIGNvcHBfaWR4LCBzZXNzaW9uX2lkLCBzZXNzaW9uX3R5cGUsIGNoX21peGVyCi0gKiBhbmQgY2hhbm5lbF9pbmRleCB0byBzZW5kIEFETSBjb21tYW5kIHRvIG1peCBDT1BQIGRhdGEuCi0gKgotICogcG9ydF9pZCAtIFBhc3NlZCB2YWx1ZSwgcG9ydF9pZCBmb3Igd2hpY2ggYmFja2VuZCBpcyB3YW50ZWQKLSAqIGNvcHBfaWR4IC0gUGFzc2VkIHZhbHVlLCBjb3BwX2lkeCBmb3Igd2hpY2ggQ09QUCBpcyB3YW50ZWQKLSAqIHNlc3Npb25faWQgLSBQYXNzZWQgdmFsdWUsIHNlc3Npb25faWQgZm9yIHdoaWNoIHNlc3Npb24gaXMgbmVlZGVkCi0gKiBzZXNzaW9uX3R5cGUgLSBQYXNzZWQgdmFsdWUsIHNlc3Npb25fdHlwZSBmb3IgUlggb3IgVFgKLSAqIGNoX21peGVyIC0gUGFzc2VkIHZhbHVlLCBjaF9taXhlciBmb3Igd2hpY2ggY2hhbm5lbCBtaXhlciBjb25maWcgaXMgbmVlZGVkCi0gKiBjaGFubmVsX2luZGV4IC0gUGFzc2VkIHZhbHVlLCBjaGFubmVsX2luZGV4IGZvciB3aGljaCBjaGFubmVsIGlzIG5lZWRlZAotICovCi1pbnQgYWRtX3Byb2dyYW1hYmxlX2NoYW5uZWxfbWl4ZXIoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHNlc3Npb25faWQsCi0JCQkJICBpbnQgc2Vzc2lvbl90eXBlLAotCQkJCSAgc3RydWN0IG1zbV9wY21fY2hhbm5lbF9taXhlciAqY2hfbWl4ZXIsCi0JCQkJICBpbnQgY2hhbm5lbF9pbmRleCkKLXsKLQlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHNwZF9tdG14X3N0cnRyX3BhcmFtc192NSAqYWRtX3BhcmFtcyA9IE5VTEw7Ci0Jc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1IGRhdGFfdjU7Ci0JaW50IHJldCA9IDAsIHBvcnRfaWR4LCBzeiA9IDAsIHBhcmFtX3NpemUgPSAwOwotCXUxNiAqYWRtX3BzcGRfcGFyYW1zOwotCXUxNiAqcHRyOwotCWludCBpbmRleCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgPSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKgotCSAqIEZpcnN0IDggYnl0ZXMgYXJlIDQgYnl0ZXMgYXMgcnVsZSBudW1iZXIsIDIgYnl0ZXMgYXMgb3V0cHV0Ci0JICogY2hhbm5lbCBhbmQgMiBieXRlcyBhcyBpbnB1dCBjaGFubmVsLgotCSAqIDIgKiBjaF9taXhlci0+b3V0cHV0X2NoYW5uZWwgbWVhbnMgb3V0cHV0IGNoYW5uZWwgbWFwcGluZy4KLQkgKiAyICogY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdKSBtZWFucyBpbnB1dAotCSAqIGNoYW5uZWwgbWFwcGluZy4KLQkgKiAyICogY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdICoKLQkgKiBjaF9taXhlci0+b3V0cHV0X2NoYW5uZWwpIG1lYW5zIHRoZSBjaGFubmVsIG1peGVyIHdlaWdodGluZwotCSAqIGNvZWZmaWNpZW50cy4KLQkgKiBwYXJhbV9zaXplIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KLQkgKi8KLQotCXBhcmFtX3NpemUgPSAyICogKDQgKyBjaF9taXhlci0+b3V0cHV0X2NoYW5uZWwgKwotCQkJY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdICsKLQkJCWNoX21peGVyLT5pbnB1dF9jaGFubmVsc1tjaGFubmVsX2luZGV4XSAqCi0JCQljaF9taXhlci0+b3V0cHV0X2NoYW5uZWwpOwotCXJvdW5kdXAocGFyYW1fc2l6ZSwgNCk7Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHNwZF9tdG14X3N0cnRyX3BhcmFtc192NSkgKwotCQkJc2l6ZW9mKHN0cnVjdCBkZWZhdWx0X2NobWl4ZXJfcGFyYW1faWRfY29lZmYpICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX3BhcmFtX2RhdGFfdjUpICsgcGFyYW1fc2l6ZTsKLQlwcl9kZWJ1ZygiJXM6IHN6ID0gJWRcbiIsIF9fZnVuY19fLCBzeik7Ci0JYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghYWRtX3BhcmFtcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhZG1fcGFyYW1zLT5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlhZG1fcGFyYW1zLT5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQlhZG1fcGFyYW1zLT5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JYWRtX3BhcmFtcy0+ZGlyZWN0aW9uID0gc2Vzc2lvbl90eXBlOwotCWFkbV9wYXJhbXMtPnNlc3Npb25pZCA9IHNlc3Npb25faWQ7Ci0JcHJfZGVidWcoIiVzOiBjb3BwX2lkID0gJWQsIHNlc3Npb24gaWQgICVkXG4iLCBfX2Z1bmNfXywKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSksCi0JCQlzZXNzaW9uX2lkKTsKLQlhZG1fcGFyYW1zLT5kZXZpY2VpZCA9IGF0b21pY19yZWFkKAotCQkJCSZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWFkbV9wYXJhbXMtPnJlc2VydmVkID0gMDsKLQotCWRhdGFfdjUubW9kdWxlX2lkID0gTVRNWF9NT0RVTEVfSURfREVGQVVMVF9DSE1JWEVSOwotCWRhdGFfdjUucGFyYW1faWQgPSAgREVGQVVMVF9DSE1JWEVSX1BBUkFNX0lEX0NPRUZGOwotCWRhdGFfdjUucmVzZXJ2ZWQgPSAwOwotCWRhdGFfdjUucGFyYW1fc2l6ZSA9IHBhcmFtX3NpemU7Ci0JYWRtX3BhcmFtcy0+cGF5bG9hZF9zaXplID0KLQkJCXNpemVvZihzdHJ1Y3QgZGVmYXVsdF9jaG1peGVyX3BhcmFtX2lkX2NvZWZmKSArCi0JCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KSArIGRhdGFfdjUucGFyYW1fc2l6ZTsKLQlhZG1fcHNwZF9wYXJhbXMgPSAodTE2ICopKCh1OCAqKWFkbV9wYXJhbXMgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KSk7Ci0JbWVtY3B5KGFkbV9wc3BkX3BhcmFtcywgJmRhdGFfdjUsIHNpemVvZihkYXRhX3Y1KSk7Ci0KLQlhZG1fcHNwZF9wYXJhbXMgPSAodTE2ICopKCh1OCAqKWFkbV9wYXJhbXMgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KQotCQkJKyBzaXplb2YoZGF0YV92NSkpOwotCi0JYWRtX3BzcGRfcGFyYW1zWzBdID0gY2hfbWl4ZXItPnJ1bGU7Ci0JYWRtX3BzcGRfcGFyYW1zWzJdID0gY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsOwotCWFkbV9wc3BkX3BhcmFtc1szXSA9IGNoX21peGVyLT5pbnB1dF9jaGFubmVsc1tjaGFubmVsX2luZGV4XTsKLQlpbmRleCA9IDQ7Ci0KLQlpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDEpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDIpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDMpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDQpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAzXSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDUpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAzXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyA0XSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPm91dHB1dF9jaGFubmVsID09IDYpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgM10gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgNF0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgNV0gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoX21peGVyLT5vdXRwdXRfY2hhbm5lbCA9PSA4KSB7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgMl0gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDNdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDRdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDVdID0gUENNX0NIQU5ORUxfUlM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDZdID0gUENNX0NIQU5ORUxfTEI7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDddID0gUENNX0NIQU5ORUxfUkI7Ci0JfQotCi0JaW5kZXggPSBpbmRleCArIGNoX21peGVyLT5vdXRwdXRfY2hhbm5lbDsKLQlpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDEpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDIpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDMpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDQpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAzXSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDUpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAzXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyA0XSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hfbWl4ZXItPmlucHV0X2NoYW5uZWxzW2NoYW5uZWxfaW5kZXhdID09IDYpIHsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4XSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlhZG1fcHNwZF9wYXJhbXNbaW5kZXggKyAyXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgM10gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgNF0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgNV0gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoX21peGVyLT5pbnB1dF9jaGFubmVsc1tjaGFubmVsX2luZGV4XSA9PSA4KSB7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJYWRtX3BzcGRfcGFyYW1zW2luZGV4ICsgMl0gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDNdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDRdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDVdID0gUENNX0NIQU5ORUxfUlM7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDZdID0gUENNX0NIQU5ORUxfTEI7Ci0JCWFkbV9wc3BkX3BhcmFtc1tpbmRleCArIDddID0gUENNX0NIQU5ORUxfUkI7Ci0JfQotCi0JaW5kZXggPSBpbmRleCArIGNoX21peGVyLT5pbnB1dF9jaGFubmVsc1tjaGFubmVsX2luZGV4XTsKLQlyZXQgPSBhZG1fcG9wdWxhdGVfY2hhbm5lbF93ZWlnaHQoJmFkbV9wc3BkX3BhcmFtc1tpbmRleF0sCi0JCQkJCWNoX21peGVyLCBjaGFubmVsX2luZGV4KTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGdldCBjaGFubmVsIHdlaWdodCB3aXRoIGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCA9Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlhZG1fcGFyYW1zLT5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QU1BEX01UTVhfU1RSVFJfUEFSQU1TX1Y1OwotCWFkbV9wYXJhbXMtPmhkci5wa3Rfc2l6ZSA9IHN6OwotCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCWFkbV9wYXJhbXMtPm1lbV9tYXBfaGFuZGxlID0gMDsKLQlhZG1fcGFyYW1zLT5yZXNlcnZlZCA9IDA7Ci0KLQlwdHIgPSAodTE2ICopYWRtX3BhcmFtczsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAoc3ogLyAyKTsgaW5kZXgrKykKLQkJcHJfZGVidWcoIiVzOiBhZG1fcGFyYW1zWyVkXSA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgaW5kZXgsICh1bnNpZ25lZCBpbnQpcHRyW2luZGV4XSk7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCAlZCByYyAlZFxuIiwgX19mdW5jX18sCi0JCQlwb3J0X2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCWF0b21pY19yZWFkKAotCQkJJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogc2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSAwOwotZmFpbF9jbWQ6Ci0Ja2ZyZWUoYWRtX3BhcmFtcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWRtX3NldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlbyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZCwgY2hhciAqcGFyYW1zLAotCQkJCSAgICB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKQotewotCXN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1ICphZG1fcGFyYW1zID0gTlVMTDsKLQlpbnQgc3osIHJjID0gMCwgcG9ydF9pZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KSArCi0JCXBhcmFtc19sZW5ndGg7Ci0JYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghYWRtX3BhcmFtcykgewotCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsKLQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wc3BkX210bXhfc3RydHJfcGFyYW1zX3Y1KSksCi0JCXBhcmFtcywgcGFyYW1zX2xlbmd0aCk7Ci0JYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKLQlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPSAwOyAvKiBJZ25vcmVkICovOwotCWFkbV9wYXJhbXMtPmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7Ci0JYWRtX3BhcmFtcy0+aGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BTUERfTVRNWF9TVFJUUl9QQVJBTVNfVjU7Ci0JYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSAwOwotCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9IHBhcmFtc19sZW5ndGg7Ci0JLyogZGlyZWN0aW9uIFJYIGFzIDAgKi8KLQlhZG1fcGFyYW1zLT5kaXJlY3Rpb24gPSBBRE1fTUFUUklYX0lEX0FVRElPX1JYOwotCS8qIHNlc3Npb24gaWQgZm9yIHRoaXMgY21kIHRvIGJlIGFwcGxpZWQgb24gKi8KLQlhZG1fcGFyYW1zLT5zZXNzaW9uaWQgPSBzZXNzaW9uX2lkOwotCWFkbV9wYXJhbXMtPmRldmljZWlkID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWFkbV9wYXJhbXMtPnJlc2VydmVkID0gMDsKLQlwcl9kZWJ1ZygiJXM6IGRldmljZWlkICVkLCBzZXNzaW9uX2lkICVkLCBzcmNfcG9ydCAlZCwgZGVzdF9wb3J0ICVkXG4iLAotCQlfX2Z1bmNfXywgYWRtX3BhcmFtcy0+ZGV2aWNlaWQsIGFkbV9wYXJhbXMtPnNlc3Npb25pZCwKLQkJYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0LCBhZG1fcGFyYW1zLT5oZHIuZGVzdF9wb3J0KTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gMHgleCByYyAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBzZXRfc3RlcmVvX3RvX2N1c3RvbV9zdGVyZW9fcmV0dXJuOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleFxuIiwgX19mdW5jX18sCi0JCQlwb3J0X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHNldF9zdGVyZW9fdG9fY3VzdG9tX3N0ZXJlb19yZXR1cm47Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLCBfX2Z1bmNfXywKLQkJCWFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAotCQkJJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gc2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX3JldHVybjsKLQl9Ci0JcmMgPSAwOwotc2V0X3N0ZXJlb190b19jdXN0b21fc3RlcmVvX3JldHVybjoKLQlrZnJlZShhZG1fcGFyYW1zKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhZG1fZG9sYnlfZGFwX3NlbmRfcGFyYW1zKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGNoYXIgKnBhcmFtcywKLQkJCSAgICAgIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpCi17Ci0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NQkqYWRtX3BhcmFtcyA9IE5VTEw7Ci0JaW50IHN6LCByYyA9IDA7Ci0JaW50IHBvcnRfaWR4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSArIHBhcmFtc19sZW5ndGg7Ci0JYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghYWRtX3BhcmFtcykgewotCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbWNweSgoKHU4ICopYWRtX3BhcmFtcyArIHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSksCi0JCQlwYXJhbXMsIHBhcmFtc19sZW5ndGgpOwotCWFkbV9wYXJhbXMtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKLQlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JYWRtX3BhcmFtcy0+aGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQlhZG1fcGFyYW1zLT5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OwotCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCWFkbV9wYXJhbXMtPnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCWFkbV9wYXJhbXMtPm1lbV9tYXBfaGFuZGxlID0gMDsKLQlhZG1fcGFyYW1zLT5wYXlsb2FkX3NpemUgPSBwYXJhbXNfbGVuZ3RoOwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9IDB4JXggcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9sYnlfZGFwX3NlbmRfcGFyYW1fcmV0dXJuOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAweCV4XG4iLAotCQkJIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbGJ5X2RhcF9zZW5kX3BhcmFtX3JldHVybjsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBkb2xieV9kYXBfc2VuZF9wYXJhbV9yZXR1cm47Ci0JfQotCXJjID0gMDsKLWRvbGJ5X2RhcF9zZW5kX3BhcmFtX3JldHVybjoKLQlrZnJlZShhZG1fcGFyYW1zKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhZG1fc2VuZF9wYXJhbXNfdjUoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgY2hhciAqcGFyYW1zLAotCQkJICAgICAgdWludDMyX3QgcGFyYW1zX2xlbmd0aCkKLXsKLQlzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1CSphZG1fcGFyYW1zID0gTlVMTDsKLQlpbnQgcmMgPSAwOwotCWludCBzeiwgcG9ydF9pZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpICsgcGFyYW1zX2xlbmd0aDsKLQlhZG1fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZG1fcGFyYW1zKSB7Ci0JCXByX2VycigiJXMsIGFkbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpKSwKLQkJCXBhcmFtcywgcGFyYW1zX2xlbmd0aCk7Ci0JYWRtX3BhcmFtcy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbV9wYXJhbXMtPmhkci5wa3Rfc2l6ZSA9IHN6OwotCWFkbV9wYXJhbXMtPmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfcG9ydCA9Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlhZG1fcGFyYW1zLT5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7Ci0JYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JYWRtX3BhcmFtcy0+cGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JYWRtX3BhcmFtcy0+bWVtX21hcF9oYW5kbGUgPSAwOwotCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9IHBhcmFtc19sZW5ndGg7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gMHgleCByYyAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleFxuIiwKLQkJCSBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBzZW5kX3BhcmFtX3JldHVybjsKLQl9Ci0JcmMgPSAwOwotc2VuZF9wYXJhbV9yZXR1cm46Ci0Ja2ZyZWUoYWRtX3BhcmFtcyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYWRtX2dldF9wYXJhbXNfdjIoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgdWludDMyX3QgbW9kdWxlX2lkLAotCQkgICAgICB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgcGFyYW1zX2xlbmd0aCwKLQkJICAgICAgY2hhciAqcGFyYW1zLCB1aW50MzJfdCBjbGllbnRfaWQpCi17Ci0Jc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSAqYWRtX3BhcmFtcyA9IE5VTEw7Ci0JaW50IHJjID0gMCwgaSA9IDA7Ci0JaW50IHBvcnRfaWR4LCBpZHg7Ci0JaW50ICpwYXJhbXNfZGF0YSA9IChpbnQgKilwYXJhbXM7Ci0JdWludDY0X3Qgc3ogPSAwOwotCi0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN6ID0gKHVpbnQ2NF90KXNpemVvZihzdHJ1Y3QgYWRtX2NtZF9nZXRfcHBfcGFyYW1zX3Y1KSArCi0JCQkJKHVpbnQ2NF90KXBhcmFtc19sZW5ndGg7Ci0JLyoKLQkgKiBDaGVjayBpZiB0aGUgdmFsdWUgb2YgInN6IiAod2hpY2ggaXMgdWx0aW1hdGVseSBhc3NpZ25lZCB0bwotCSAqICJoZHIucGt0X3NpemUiKSBjcm9zc2VzIFUxNl9NQVguCi0JICovCi0JaWYgKHN6ID4gVTE2X01BWCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc19sZW5ndGhcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFkbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFkbV9wYXJhbXMpIHsKLQkJcHJfZXJyKCIlczogYWRtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1jcHkoKCh1OCAqKWFkbV9wYXJhbXMgKyBzaXplb2Yoc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSkpLAotCQlwYXJhbXMsIHBhcmFtc19sZW5ndGgpOwotCWFkbV9wYXJhbXMtPmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlhZG1fcGFyYW1zLT5oZHIucGt0X3NpemUgPSBzejsKLQlhZG1fcGFyYW1zLT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFkbV9wYXJhbXMtPmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFkbV9wYXJhbXMtPmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JYWRtX3BhcmFtcy0+aGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjbGllbnRfaWQgPDwgOCB8IGNvcHBfaWR4OwotCWFkbV9wYXJhbXMtPmhkci5vcGNvZGUgPSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjU7Ci0JYWRtX3BhcmFtcy0+ZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlhZG1fcGFyYW1zLT5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOwotCWFkbV9wYXJhbXMtPm1lbV9tYXBfaGFuZGxlID0gMDsKLQlhZG1fcGFyYW1zLT5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7Ci0JYWRtX3BhcmFtcy0+cGFyYW1faWQgPSBwYXJhbV9pZDsKLQlhZG1fcGFyYW1zLT5wYXJhbV9tYXhfc2l6ZSA9IHBhcmFtc19sZW5ndGg7Ci0JYWRtX3BhcmFtcy0+cmVzZXJ2ZWQgPSAwOwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKWFkbV9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIEdldCBQYXJhbXMgb24gcG9ydF9pZCAweCV4ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGFkbV9nZXRfcGFyYW1fcmV0dXJuOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgd2l0aCBjb3BwIGlkICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IGdldCBwYXJhbXMgdGltZWQgb3V0IHBvcnRfaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCXBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gYWRtX2dldF9wYXJhbV9yZXR1cm47Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gYWRtX2dldF9wYXJhbV9yZXR1cm47Ci0JfQotCWlkeCA9IEFETV9HRVRfUEFSQU1FVEVSX0xFTkdUSCAqIGNvcHBfaWR4OwotCi0JaWYgKGFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdIDwgMCkgewotCQlwcl9lcnIoIiVzOiBTaXplIGlzIGludmFsaWQgJWRcbiIsIF9fZnVuY19fLAotCQkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gYWRtX2dldF9wYXJhbV9yZXR1cm47Ci0JfQotCWlmICgocGFyYW1zX2RhdGEpICYmCi0JCShBUlJBWV9TSVpFKGFkbV9nZXRfcGFyYW1ldGVycykgPgotCQlpZHgpICYmCi0JCShBUlJBWV9TSVpFKGFkbV9nZXRfcGFyYW1ldGVycykgPj0KLQkJMSthZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XStpZHgpICYmCi0JCShwYXJhbXNfbGVuZ3RoL3NpemVvZih1aW50MzJfdCkgPj0KLQkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0pKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XTsgaSsrKQotCQkJcGFyYW1zX2RhdGFbaV0gPSBhZG1fZ2V0X3BhcmFtZXRlcnNbMStpK2lkeF07Ci0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBHZXQgcGFyYW0gZGF0YSBub3QgY29waWVkISBnZXRfcGFyYW0gYXJyYXkgc2l6ZSAlemQsIGluZGV4ICVkLCBwYXJhbXMgYXJyYXkgc2l6ZSAlemQsIGluZGV4ICVkXG4iLAotCQlfX2Z1bmNfXywgQVJSQVlfU0laRShhZG1fZ2V0X3BhcmFtZXRlcnMpLAotCQkoMSthZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XStpZHgpLAotCQlwYXJhbXNfbGVuZ3RoL3NpemVvZihpbnQpLAotCQlhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSk7Ci0JfQotCXJjID0gMDsKLWFkbV9nZXRfcGFyYW1fcmV0dXJuOgotCWtmcmVlKGFkbV9wYXJhbXMpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQgYWRtX2dldF9wYXJhbXMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgdWludDMyX3QgbW9kdWxlX2lkLAotCQkgICB1aW50MzJfdCBwYXJhbV9pZCwgdWludDMyX3QgcGFyYW1zX2xlbmd0aCwgY2hhciAqcGFyYW1zKQotewotCXJldHVybiBhZG1fZ2V0X3BhcmFtc192Mihwb3J0X2lkLCBjb3BwX2lkeCwgbW9kdWxlX2lkLCBwYXJhbV9pZCwKLQkJCQkgcGFyYW1zX2xlbmd0aCwgcGFyYW1zLCAwKTsKLX0KLQotaW50IGFkbV9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQzMl90IHBhcmFtX2xlbmd0aCwKLQkJCQljaGFyICpwYXJhbXMpCi17Ci0Jc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3RvcG9fbW9kdWxlX2xpc3RfdCAqYWRtX3BwX21vZHVsZV9saXN0ID0gTlVMTDsKLQlpbnQgc3osIHJjID0gMCwgaSA9IDA7Ci0JaW50IHBvcnRfaWR4LCBpZHg7Ci0JaW50MzJfdCAqcGFyYW1zX2RhdGEgPSAoaW50MzJfdCAqKXBhcmFtczsKLQlpbnQgKnRvcG9fbGlzdDsKLQotCXByX2RlYnVnKCIlcyA6IHBvcnRfaWQgJXgiLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9nZXRfcHBfdG9wb19tb2R1bGVfbGlzdF90KSArIHBhcmFtX2xlbmd0aDsKLQlhZG1fcHBfbW9kdWxlX2xpc3QgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFkbV9wcF9tb2R1bGVfbGlzdCkgewotCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW1lbWNweSgoKHU4ICopYWRtX3BwX21vZHVsZV9saXN0ICsKLQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX2dldF9wcF90b3BvX21vZHVsZV9saXN0X3QpKSwKLQkJcGFyYW1zLCBwYXJhbV9sZW5ndGgpOwotCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLnBrdF9zaXplID0gc3o7Ci0JYWRtX3BwX21vZHVsZV9saXN0LT5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX3BwX21vZHVsZV9saXN0LT5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOwotCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BwX21vZHVsZV9saXN0LT5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX3BwX21vZHVsZV9saXN0LT5oZHIuZGVzdF9wb3J0ID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWFkbV9wcF9tb2R1bGVfbGlzdC0+aGRyLnRva2VuID0gIHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7Ci0JYWRtX3BwX21vZHVsZV9saXN0LT5oZHIub3Bjb2RlID0gQURNX0NNRF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVDsKLQlhZG1fcHBfbW9kdWxlX2xpc3QtPnBhcmFtX21heF9zaXplID0gcGFyYW1fbGVuZ3RoOwotCS8qIFBheWxvYWQgYWRkcmVzcyBhbmQgbW1hcCBoYW5kbGUgc2V0IHRvIHplcm8gYnkga3phbGxvYyAqLwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BwX21vZHVsZV9saXN0KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBHZXQgUGFyYW1zIG9uIHBvcnQgJWRcbiIsIF9fZnVuY19fLAotCQkJcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBhZG1fcHBfbW9kdWxlX2xpc3RfbDsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrIHdpdGggY29wcCBpZCAqLwotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogZ2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gYWRtX3BwX21vZHVsZV9saXN0X2w7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gYWRtX3BwX21vZHVsZV9saXN0X2w7Ci0JfQotCWlmIChwYXJhbXNfZGF0YSkgewotCQlpZHggPSBBRE1fR0VUX1RPUE9fTU9EVUxFX0xJU1RfTEVOR1RIICogY29wcF9pZHg7Ci0JCXRvcG9fbGlzdCA9IChpbnQgKikoYWRtX21vZHVsZV90b3BvX2xpc3QgKyBpZHgpOwotCQlpZiAocGFyYW1fbGVuZ3RoIDw9IEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEggJiYKLQkJCWlkeCA8Ci0JCQkoTUFYX0NPUFBTX1BFUl9QT1JUICogQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCkpCi0JCQltZW1jcHkocGFyYW1zX2RhdGEsIHRvcG9fbGlzdCwgcGFyYW1fbGVuZ3RoKTsKLQkJZWxzZQotCQkJcHJfZGVidWcoIiVzOiBpL3Agc2l6ZTolZCA+IE1BWCBwYXJhbSBzaXplOiVkXG4iLAotCQkJCSBfX2Z1bmNfXywgcGFyYW1fbGVuZ3RoLAotCQkJCSAoaW50KUFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEgpOwotCQlmb3IgKGkgPSAxOyBpIDw9IHBhcmFtc19kYXRhWzBdOyBpKyspCi0JCQlwcl9kZWJ1ZygibW9kdWxlID0gMHgleFxuIiwgcGFyYW1zX2RhdGFbaV0pOwotCX0KLQlyYyA9IDA7Ci1hZG1fcHBfbW9kdWxlX2xpc3RfbDoKLQlrZnJlZShhZG1fcHBfbW9kdWxlX2xpc3QpOwotCXByX2RlYnVnKCIlcyA6IHJjID0gJWQgIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgdm9pZCBhZG1fY2FsbGJhY2tfZGVidWdfcHJpbnQoc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSkKLXsKLQl1aW50MzJfdCAqcGF5bG9hZDsKLQotCXBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOwotCi0JaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA4KQotCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIFBMIzFbMHgleF0sIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCi0JCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCWVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA0KQotCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sCi0JCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCWVsc2UKLQkJcHJfZGVidWcoIiVzOiBjb2RlID0gMHgleCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGRhdGEtPm9wY29kZSwgZGF0YS0+cGF5bG9hZF9zaXplKTsKLX0KLQotaW50IGFkbV9zZXRfbXVsdGlfY2hfbWFwKGNoYXIgKmNoYW5uZWxfbWFwLCBpbnQgcGF0aCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHBhdGggPT0gQURNX1BBVEhfUExBWUJBQ0spIHsKLQkJaWR4ID0gQURNX01DSF9NQVBfSURYX1BMQVlCQUNLOwotCX0gZWxzZSBpZiAocGF0aCA9PSBBRE1fUEFUSF9MSVZFX1JFQykgewotCQlpZHggPSBBRE1fTUNIX01BUF9JRFhfUkVDOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgYXR0ZW1wdCB0byBzZXQgcGF0aCAlZFxuIiwgX19mdW5jX18sIHBhdGgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltZW1jcHkobXVsdGlfY2hfbWFwc1tpZHhdLmNoYW5uZWxfbWFwcGluZywgY2hhbm5lbF9tYXAsCi0JCVBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKLQltdWx0aV9jaF9tYXBzW2lkeF0uc2V0X2NoYW5uZWxfbWFwID0gdHJ1ZTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYWRtX2dldF9tdWx0aV9jaF9tYXAoY2hhciAqY2hhbm5lbF9tYXAsIGludCBwYXRoKQotewotCWludCBpZHg7Ci0KLQlpZiAocGF0aCA9PSBBRE1fUEFUSF9QTEFZQkFDSykgewotCQlpZHggPSBBRE1fTUNIX01BUF9JRFhfUExBWUJBQ0s7Ci0JfSBlbHNlIGlmIChwYXRoID09IEFETV9QQVRIX0xJVkVfUkVDKSB7Ci0JCWlkeCA9IEFETV9NQ0hfTUFQX0lEWF9SRUM7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBhdHRlbXB0IHRvIGdldCBwYXRoICVkXG4iLCBfX2Z1bmNfXywgcGF0aCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChtdWx0aV9jaF9tYXBzW2lkeF0uc2V0X2NoYW5uZWxfbWFwKSB7Ci0JCW1lbWNweShjaGFubmVsX21hcCwgbXVsdGlfY2hfbWFwc1tpZHhdLmNoYW5uZWxfbWFwcGluZywKLQkJICAgICAgIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludDMyX3QgYWRtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgKnBheWxvYWQ7Ci0JaW50IGksIGosIHBvcnRfaWR4LCBjb3BwX2lkeCwgaWR4LCBjbGllbnRfaWQ7Ci0KLQlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGRhdGEgcGFyYW1ldGVyIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7Ci0KLQlpZiAoZGF0YS0+b3Bjb2RlID09IFJFU0VUX0VWRU5UUykgewotCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGV2ZW50IGlzIHJlY2VpdmVkOiAlZCAlZCBhcHJbJXBLXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJZGF0YS0+cmVzZXRfZXZlbnQsIGRhdGEtPnJlc2V0X3Byb2MsIHRoaXNfYWRtLmFwcik7Ci0JCWlmICh0aGlzX2FkbS5hcHIpIHsKLQkJCWFwcl9yZXNldCh0aGlzX2FkbS5hcHIpOwotCQkJZm9yIChpID0gMDsgaSA8IEFGRV9NQVhfUE9SVFM7IGkrKykgewotCQkJCWZvciAoaiA9IDA7IGogPCBNQVhfQ09QUFNfUEVSX1BPUlQ7IGorKykgewotCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmlkW2ldW2pdLAotCQkJCQkJICAgUkVTRVRfQ09QUF9JRCk7Ci0JCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuY250W2ldW2pdLCAwKTsKLQkJCQkJYXRvbWljX3NldCgKLQkJCQkJICAgJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbaV1bal0sIDApOwotCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLm1vZGVbaV1bal0sCi0JCQkJCQkgICAwKTsKLQkJCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W2ldW2pdLAotCQkJCQkJICAgMCk7Ci0JCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAucmF0ZVtpXVtqXSwKLQkJCQkJCSAgIDApOwotCQkJCQlhdG9taWNfc2V0KAotCQkJCQkmdGhpc19hZG0uY29wcC5jaGFubmVsc1tpXVtqXSwKLQkJCQkJCSAgIDApOwotCQkJCQlhdG9taWNfc2V0KAotCQkJCQkgICAgJnRoaXNfYWRtLmNvcHAuYml0X3dpZHRoW2ldW2pdLCAwKTsKLQkJCQkJYXRvbWljX3NldCgKLQkJCQkJICAgICZ0aGlzX2FkbS5jb3BwLmFwcF90eXBlW2ldW2pdLCAwKTsKLQkJCQkJYXRvbWljX3NldCgKLQkJCQkJICAgJnRoaXNfYWRtLmNvcHAuYWNkYl9pZFtpXVtqXSwgMCk7Ci0JCQkJCXRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1tpXVtqXSA9Ci0JCQkJCQlBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVEOwotCQkJCX0KLQkJCX0KLQkJCXRoaXNfYWRtLmFwciA9IE5VTEw7Ci0JCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhBRE1fTUFYX0NBTF9UWVBFUywKLQkJCQl0aGlzX2FkbS5jYWxfZGF0YSk7Ci0JCQltdXRleF9sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YQotCQkJCVtBRE1fQ1VTVE9NX1RPUF9DQUxdLT5sb2NrKTsKLQkJCXRoaXNfYWRtLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOwotCQkJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YVsKLQkJCQlBRE1fQ1VTVE9NX1RPUF9DQUxdLT5sb2NrKTsKLQkJCXJ0YWNfY2xlYXJfbWFwcGluZyhBRE1fUlRBQ19DQUwpOwotCQkJLyoKLQkJCSAqIEZyZWUgdGhlIElPTiBtZW1vcnkgYW5kIGNsZWFyIHRoZSBtYXAgaGFuZGxlcwotCQkJICogZm9yIFNvdXJjZSBUcmFja2luZwotCQkJICovCi0JCQlpZiAodGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciAhPSAwKSB7Ci0JCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAotCQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2NsaWVudCwKLQkJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9oYW5kbGUpOwotCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50ID0gTlVMTDsKLQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7Ci0JCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplID0gMDsKLQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciA9Ci0JCQkJCQkJCQkgTlVMTDsKLQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyID0gMDsKLQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMgPSAtMTsKLQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCi0JCQkJCUFETV9NRU1fTUFQX0lOREVYX1NPVVJDRV9UUkFDS0lOR10sIDApOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCWFkbV9jYWxsYmFja19kZWJ1Z19wcmludChkYXRhKTsKLQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplKSB7Ci0JCWNvcHBfaWR4ID0gKGRhdGEtPnRva2VuKSAmIDBYRkY7Ci0JCXBvcnRfaWR4ID0gKChkYXRhLT50b2tlbikgPj4gMTYpICYgMHhGRjsKLQkJY2xpZW50X2lkID0gKChkYXRhLT50b2tlbikgPj4gOCkgJiAweEZGOwotCQlpZiAocG9ydF9pZHggPCAwIHx8IHBvcnRfaWR4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZHggJWQgdG9rZW4gJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWR4LCBkYXRhLT50b2tlbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwIGlkeCAlZCB0b2tlbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY29wcF9pZHgsIGRhdGEtPnRva2VuKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChjbGllbnRfaWQgPCAwIHx8IGNsaWVudF9pZCA+PSBBRE1fQ0xJRU5UX0lEX01BWCkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBjbGllbnQgaWQgJWRcbiIsIF9fZnVuY19fLAotCQkJCWNsaWVudF9pZCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IEFQUl9CQVNJQ19SU1BfUkVTVUxUIGlkIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWRbMF0pOwotCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkgewotCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJCWNhc2UgQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OgotCQkJCXByX2RlYnVnKCIlczogQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJaWYgKGNsaWVudF9pZCA9PSBBRE1fQ0xJRU5UX0lEX1NPVVJDRV9UUkFDS0lORykKLQkJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLgotCQkJCQkJYXByX2NtZF9zdGF0dXMgPSBwYXlsb2FkWzFdOwotCQkJCWVsc2UgaWYgKHJ0YWNfbWFrZV9hZG1fY2FsbGJhY2socGF5bG9hZCwKLQkJCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQotCQkJCQlicmVhazsKLQkJCQkvKgotCQkJCSAqIGlmIHNvZnQgdm9sdW1lIGlzIGNhbGxlZCBhbmQgYWxyZWFkeQotCQkJCSAqIGludGVycnVwdGVkIGJyZWFrIG91dCBvZiB0aGUgc2VxdWVuY2UgaGVyZQotCQkJCSAqLwotCQkJY2FzZSBBRE1fQ01EX0RFVklDRV9PUEVOX1Y1OgotCQkJY2FzZSBBRE1fQ01EX0RFVklDRV9DTE9TRV9WNToKLQkJCWNhc2UgQURNX0NNRF9ERVZJQ0VfT1BFTl9WNjoKLQkJCQlwcl9kZWJ1ZygiJXM6IEJhc2ljIGNhbGxiYWNrIHJlY2VpdmVkLCB3YWtlIHVwLlxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF0KLQkJCQkJCVtjb3BwX2lkeF0sIHBheWxvYWRbMV0pOwotCQkJCXdha2VfdXAoCi0JCQkJJnRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQURNX0NNRF9BRERfVE9QT0xPR0lFUzoKLQkJCQlwcl9kZWJ1ZygiJXM6IGNhbGxiYWNrIHJlY2VpdmVkLCBBRE1fQ01EX0FERF9UT1BPTE9HSUVTLlxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LCBwYXlsb2FkWzFdKTsKLQkJCQl3YWtlX3VwKCZ0aGlzX2FkbS5hZG1fd2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNToKLQkJCWNhc2UgQURNX0NNRF9TVFJFQU1fREVWSUNFX01BUF9ST1VUSU5HU19WNToKLQkJCQlwcl9kZWJ1ZygiJXM6IEJhc2ljIGNhbGxiYWNrIHJlY2VpdmVkLCB3YWtlIHVwLlxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLm1hdHJpeF9tYXBfc3RhdCwKLQkJCQkJcGF5bG9hZFsxXSk7Ci0JCQkJd2FrZV91cCgmdGhpc19hZG0ubWF0cml4X21hcF93YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQURNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM6Ci0JCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OU1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LCBwYXlsb2FkWzFdKTsKLQkJCQl3YWtlX3VwKCZ0aGlzX2FkbS5hZG1fd2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKLQkJCQlwcl9kZWJ1ZygiJXM6IEFETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OU1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCS8qIFNob3VsZCBvbmx5IGNvbWUgaGVyZSBpZiB0aGVyZSBpcyBhbiBBUFIgKi8KLQkJCQkvKiBlcnJvciBvciBtYWxmb3JtZWQgQVBSIHBhY2tldC4gT3RoZXJ3aXNlICovCi0JCQkJLyogcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCBhcyAqLwotCQkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKLQkJCQkJcHJfZXJyKCIlczogQURNIG1hcCBlcnJvciwgcmVzdW1pbmdcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LAotCQkJCQkJcGF5bG9hZFsxXSk7Ci0JCQkJCXdha2VfdXAoJnRoaXNfYWRtLmFkbV93YWl0KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFETV9DTURfR0VUX1BQX1BBUkFNU19WNToKLQkJCQlwcl9kZWJ1ZygiJXM6IEFETV9DTURfR0VUX1BQX1BBUkFNU19WNVxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCS8qIFNob3VsZCBvbmx5IGNvbWUgaGVyZSBpZiB0aGVyZSBpcyBhbiBBUFIgKi8KLQkJCQkvKiBlcnJvciBvciBtYWxmb3JtZWQgQVBSIHBhY2tldC4gT3RoZXJ3aXNlICovCi0JCQkJLyogcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCBhcyAqLwotCQkJCS8qIEFETV9DTURSU1BfR0VUX1BQX1BBUkFNU19WNSAqLwotCQkJCWlmIChjbGllbnRfaWQgPT0KLQkJCQkJQURNX0NMSUVOVF9JRF9TT1VSQ0VfVFJBQ0tJTkcpIHsKLQkJCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLgotCQkJCQkJYXByX2NtZF9zdGF0dXMgPSBwYXlsb2FkWzFdOwotCQkJCQlpZiAocGF5bG9hZFsxXSAhPSAwKQotCQkJCQkJcHJfZXJyKCIlczogQURNIGdldCBwYXJhbSBlcnJvciA9ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzFdKTsKLQotCQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJCQkJcGF5bG9hZFsxXSk7Ci0JCQkJCXdha2VfdXAoJnRoaXNfYWRtLmNvcHAud2FpdAotCQkJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocGF5bG9hZFsxXSAhPSAwKSB7Ci0JCQkJCQlwcl9lcnIoIiVzOiBBRE0gZ2V0IHBhcmFtIGVycm9yID0gJWQsIHJlc3VtaW5nXG4iLAotCQkJCQkJCV9fZnVuY19fLCBwYXlsb2FkWzFdKTsKLQotCQkJCQkJcnRhY19tYWtlX2FkbV9jYWxsYmFjayhwYXlsb2FkLAotCQkJCQkJCWRhdGEtPnBheWxvYWRfc2l6ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFETV9DTURfU0VUX1BTUERfTVRNWF9TVFJUUl9QQVJBTVNfVjU6Ci0JCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EX1NFVF9QU1BEX01UTVhfU1RSVFJfUEFSQU1TX1Y1XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XQotCQkJCQkJW2NvcHBfaWR4XSwgcGF5bG9hZFsxXSk7Ci0JCQkJd2FrZV91cCgKLQkJCQkmdGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRE1fQ01EX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUOgotCQkJCXByX2RlYnVnKCIlczpBRE1fQ01EX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUXG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJCWlmIChwYXlsb2FkWzFdICE9IDApCi0JCQkJCXByX2VycigiJXM6IEFETSBnZXQgdG9wbyBsaXN0IGVycm9yID0gJWQsXG4iLAotCQkJCQkJX19mdW5jX18sIHBheWxvYWRbMV0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl9lcnIoIiVzOiBVbmtub3duIENtZDogMHgleFxuIiwgX19mdW5jX18sCi0JCQkJCQkJCXBheWxvYWRbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgewotCQljYXNlIEFETV9DTURSU1BfREVWSUNFX09QRU5fVjU6Ci0JCWNhc2UgQURNX0NNRFJTUF9ERVZJQ0VfT1BFTl9WNjogewotCQkJc3RydWN0IGFkbV9jbWRfcnNwX2RldmljZV9vcGVuX3Y1ICpvcGVuID0KLQkJCShzdHJ1Y3QgYWRtX2NtZF9yc3BfZGV2aWNlX29wZW5fdjUgKilkYXRhLT5wYXlsb2FkOwotCi0JCQlpZiAob3Blbi0+Y29wcF9pZCA9PSBJTlZBTElEX0NPUFBfSUQpIHsKLQkJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNvcHBpZCByeGVkICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgb3Blbi0+Y29wcF9pZCk7Ci0JCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XQotCQkJCQkJW2NvcHBfaWR4XSwgQURTUF9FQkFEUEFSQU0pOwotCQkJCXdha2VfdXAoCi0JCQkJJnRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdLCBwYXlsb2FkWzBdKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCQkgICBvcGVuLT5jb3BwX2lkKTsKLQkJCXByX2RlYnVnKCIlczogY29wcGlkIHJ4ZWQ9JWRcbiIsIF9fZnVuY19fLAotCQkJCSBvcGVuLT5jb3BwX2lkKTsKLQkJCXdha2VfdXAoJnRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFETV9DTURSU1BfR0VUX1BQX1BBUkFNU19WNToKLQkJCXByX2RlYnVnKCIlczogQURNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1Y1XG4iLCBfX2Z1bmNfXyk7Ci0JCQlpZiAocGF5bG9hZFswXSAhPSAwKQotCQkJCXByX2VycigiJXM6IEFETV9DTURSU1BfR0VUX1BQX1BBUkFNU19WNSByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCi0JCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdKTsKLQkJCWlmIChjbGllbnRfaWQgPT0gQURNX0NMSUVOVF9JRF9TT1VSQ0VfVFJBQ0tJTkcpCi0JCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzID0KLQkJCQkJCQkJcGF5bG9hZFswXTsKLQkJCWVsc2UgaWYgKHJ0YWNfbWFrZV9hZG1fY2FsbGJhY2socGF5bG9hZCwKLQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKSkKLQkJCQlicmVhazsKLQotCQkJaWR4ID0gQURNX0dFVF9QQVJBTUVURVJfTEVOR1RIICogY29wcF9pZHg7Ci0JCQlpZiAoKHBheWxvYWRbMF0gPT0gMCkgJiYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+Ci0JCQkJKDQgKiBzaXplb2YoKnBheWxvYWQpKSkgJiYKLQkJCQkoZGF0YS0+cGF5bG9hZF9zaXplIC0gNCA+PQotCQkJCXBheWxvYWRbM10pICYmCi0JCQkJKEFSUkFZX1NJWkUoYWRtX2dldF9wYXJhbWV0ZXJzKSA+Ci0JCQkJaWR4KSAmJgotCQkJCShBUlJBWV9TSVpFKGFkbV9nZXRfcGFyYW1ldGVycyktaWR4LTEgPj0KLQkJCQlwYXlsb2FkWzNdKSkgewotCQkJCWFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdID0gcGF5bG9hZFszXSAvCi0JCQkJCQkJc2l6ZW9mKHVpbnQzMl90KTsKLQkJCQkvKgotCQkJCSAqIHBheWxvYWRbM10gaXMgcGFyYW1fc2l6ZSB3aGljaCBpcwotCQkJCSAqIGV4cHJlc3NlZCBpbiBudW1iZXIgb2YgYnl0ZXMKLQkJCQkgKi8KLQkJCQlwcl9kZWJ1ZygiJXM6IEdFVF9QUCBQQVJBTTpyZWNlaXZlZCBwYXJhbWV0ZXIgbGVuZ3RoOiAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0pOwotCQkJCS8qIHN0b3JpbmcgcGFyYW0gc2l6ZSB0aGVuIHBhcmFtcyAqLwotCQkJCWZvciAoaSA9IDA7IGkgPCBwYXlsb2FkWzNdIC8KLQkJCQkJCXNpemVvZih1aW50MzJfdCk7IGkrKykKLQkJCQkJYWRtX2dldF9wYXJhbWV0ZXJzW2lkeCsxK2ldID0KLQkJCQkJCQlwYXlsb2FkWzQraV07Ci0JCQl9IGVsc2UgaWYgKHBheWxvYWRbMF0gPT0gMCkgewotCQkJCWFkbV9nZXRfcGFyYW1ldGVyc1tpZHhdID0gLTE7Ci0JCQkJcHJfZXJyKCIlczogT3V0IG9mIGJhbmQgY2FzZSwgc2V0dGluZyBzaXplIHRvICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgYWRtX2dldF9wYXJhbWV0ZXJzW2lkeF0pOwotCQkJfSBlbHNlIHsKLQkJCQlhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSA9IC0xOwotCQkJCXByX2VycigiJXM6IEdFVF9QUF9QQVJBTVMgZmFpbGVkLCBzZXR0aW5nIHNpemUgdG8gJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhZG1fZ2V0X3BhcmFtZXRlcnNbaWR4XSk7Ci0JCQl9Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSwgcGF5bG9hZFswXSk7Ci0JCQl3YWtlX3VwKCZ0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBRE1fQ01EUlNQX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUOgotCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EUlNQX0dFVF9QUF9UT1BPX01PRFVMRV9MSVNUXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlpZiAocGF5bG9hZFswXSAhPSAwKSB7Ci0JCQkJcHJfZXJyKCIlczogQURNX0NNRFJTUF9HRVRfUFBfVE9QT19NT0RVTEVfTElTVCIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJcHJfZXJyKCI6ZXJyID0gMHgleFxuIiwgcGF5bG9hZFswXSk7Ci0JCQl9IGVsc2UgaWYgKHBheWxvYWRbMV0gPgotCQkJCSAgICgoQURNX0dFVF9UT1BPX01PRFVMRV9MSVNUX0xFTkdUSCAvCi0JCQkJICAgc2l6ZW9mKHVpbnQzMl90KSkgLSAxKSkgewotCQkJCXByX2VycigiJXM6IEFETV9DTURSU1BfR0VUX1BQX1RPUE9fTU9EVUxFX0xJU1QiLAotCQkJCQkgX19mdW5jX18pOwotCQkJCXByX2VycigiOnNpemUgPSAlZFxuIiwgcGF5bG9hZFsxXSk7Ci0JCQl9IGVsc2UgewotCQkJCWlkeCA9IEFETV9HRVRfVE9QT19NT0RVTEVfTElTVF9MRU5HVEggKgotCQkJCQljb3BwX2lkeDsKLQkJCQlwcl9kZWJ1ZygiJXM6TnVtIG1vZHVsZXMgcGF5bG9hZFsxXSAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBwYXlsb2FkWzFdKTsKLQkJCQlhZG1fbW9kdWxlX3RvcG9fbGlzdFtpZHhdID0gcGF5bG9hZFsxXTsKLQkJCQlmb3IgKGkgPSAxOyBpIDw9IHBheWxvYWRbMV07IGkrKykgewotCQkJCQlhZG1fbW9kdWxlX3RvcG9fbGlzdFtpZHgraV0gPQotCQkJCQkJcGF5bG9hZFsxK2ldOwotCQkJCQlwcl9kZWJ1ZygiJXM6cGF5bG9hZFslZF0gPSAleFxuIiwKLQkJCQkJCSBfX2Z1bmNfXywgKGkrMSksIHBheWxvYWRbMStpXSk7Ci0JCQkJfQotCQkJfQotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0sIHBheWxvYWRbMF0pOwotCQkJd2FrZV91cCgmdGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQURNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TOgotCQkJcHJfZGVidWcoIiVzOiBBRE1fQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlNcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzWwotCQkJCSAgIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4KV0sCi0JCQkJICAgKnBheWxvYWQpOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uYWRtX3N0YXQsIDApOwotCQkJd2FrZV91cCgmdGhpc19hZG0uYWRtX3dhaXQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBVbmtub3duIGNtZDoweCV4XG4iLCBfX2Z1bmNfXywKLQkJCQlkYXRhLT5vcGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX21lbW9yeV9tYXBfcmVnaW9ucyhwaHlzX2FkZHJfdCAqYnVmX2FkZCwgdWludDMyX3QgbWVtcG9vbF9pZCwKLQkJCSAgIHVpbnQzMl90ICpidWZzeiwgdWludDMyX3QgYnVmY250KQotewotCXN0cnVjdCAgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICptbWFwX3JlZ2lvbnMgPSBOVUxMOwotCXN0cnVjdCAgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKm1yZWdpb25zID0gTlVMTDsKLQl2b2lkICAgICptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOwotCXZvaWQgICAgKnBheWxvYWQgPSBOVUxMOwotCWludCAgICAgcmV0ID0gMDsKLQlpbnQgICAgIGkgPSAwOwotCWludCAgICAgY21kX3NpemUgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCWlmICh0aGlzX2FkbS5hcHIgPT0gTlVMTCkgewotCQl0aGlzX2FkbS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQURNIiwgYWRtX2NhbGxiYWNrLAotCQkJCQkJMHhGRkZGRkZGRiwgJnRoaXNfYWRtKTsKLQkJaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQURNXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlydGFjX3NldF9hZG1faGFuZGxlKHRoaXNfYWRtLmFwcik7Ci0JfQotCi0JY21kX3NpemUgPSBzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykKLQkJCSsgc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkKLQkJCSogYnVmY250OwotCi0JbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtbWFwX3JlZ2lvbl9jbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbW1hcF9yZWdpb25zID0gKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKiltbWFwX3JlZ2lvbl9jbWQ7Ci0JbW1hcF9yZWdpb25zLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltbWFwX3JlZ2lvbnMtPmhkci5wa3Rfc2l6ZSA9IGNtZF9zaXplOwotCW1tYXBfcmVnaW9ucy0+aGRyLnNyY19wb3J0ID0gMDsKLQotCW1tYXBfcmVnaW9ucy0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JbW1hcF9yZWdpb25zLT5oZHIudG9rZW4gPSAwOwotCW1tYXBfcmVnaW9ucy0+aGRyLm9wY29kZSA9IEFETV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzsKLQltbWFwX3JlZ2lvbnMtPm1lbV9wb29sX2lkID0gQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MICYgMHgwMGZmOwotCW1tYXBfcmVnaW9ucy0+bnVtX3JlZ2lvbnMgPSBidWZjbnQgJiAweDAwZmY7Ci0JbW1hcF9yZWdpb25zLT5wcm9wZXJ0eV9mbGFnID0gMHgwMDsKLQotCXByX2RlYnVnKCIlczogbWFwX3JlZ2lvbnMtPm51bV9yZWdpb25zID0gJWRcbiIsIF9fZnVuY19fLAotCQkJCW1tYXBfcmVnaW9ucy0+bnVtX3JlZ2lvbnMpOwotCXBheWxvYWQgPSAoKHU4ICopIG1tYXBfcmVnaW9uX2NtZCArCi0JCQkJc2l6ZW9mKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMpKTsKLQltcmVnaW9ucyA9IChzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOwotCi0JZm9yIChpID0gMDsgaSA8IGJ1ZmNudDsgaSsrKSB7Ci0JCW1yZWdpb25zLT5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9hZGRbaV0pOwotCQltcmVnaW9ucy0+c2htX2FkZHJfbXN3ID0KLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkW2ldKTsKLQkJbXJlZ2lvbnMtPm1lbV9zaXplX2J5dGVzID0gYnVmc3pbaV07Ci0JCSsrbXJlZ2lvbnM7Ci0JfQotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uYWRtX3N0YXQsIC0xKTsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikgbW1hcF9yZWdpb25fY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCQltbWFwX3JlZ2lvbnMtPmhkci5vcGNvZGUsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmFkbV93YWl0LAotCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpID49IDAsCi0JCQkJIDUgKiBIWik7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfbWFwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmFkbV9zdGF0KSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotZmFpbF9jbWQ6Ci0Ja2ZyZWUobW1hcF9yZWdpb25fY21kKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyh2b2lkKQotewotCXN0cnVjdCAgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgdW5tYXBfcmVnaW9uczsKLQlpbnQgICAgIHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl1bm1hcF9yZWdpb25zLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCQlBUFJfUEtUX1ZFUik7Ci0JdW5tYXBfcmVnaW9ucy5oZHIucGt0X3NpemUgPSBzaXplb2YodW5tYXBfcmVnaW9ucyk7Ci0JdW5tYXBfcmVnaW9ucy5oZHIuc3JjX3BvcnQgPSAwOwotCXVubWFwX3JlZ2lvbnMuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JdW5tYXBfcmVnaW9ucy5oZHIudG9rZW4gPSAwOwotCXVubWFwX3JlZ2lvbnMuaGRyLm9wY29kZSA9IEFETV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOwotCXVubWFwX3JlZ2lvbnMubWVtX21hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uCi0JCW1lbV9tYXBfaGFuZGxlc1thdG9taWNfcmVhZCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCldKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgLTEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSAmdW5tYXBfcmVnaW9ucyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogbW1hcF9yZWdpb25zIG9wWzB4JXhdcmNbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQl1bm1hcF9yZWdpb25zLmhkci5vcGNvZGUsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmFkbV93YWl0LAotCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpID49IDAsCi0JCQkJIDUgKiBIWik7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfdW5tYXBcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmFkbV9zdGF0KSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBVbm1hcCBoYW5kbGUgMHgleCBzdWNjZWVkZWRcbiIsIF9fZnVuY19fLAotCQkJIHVubWFwX3JlZ2lvbnMubWVtX21hcF9oYW5kbGUpOwotCX0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVtYXBfY2FsX2RhdGEoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssIGludCBjYWxfaW5kZXgpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5pb25fY2xpZW50ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTm8gSU9OIGFsbG9jYXRpb24gZm9yIGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA+IDApICYmCi0JCShjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9PSAwKSkgewotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOwotCQlyZXQgPSBhZG1fbWVtb3J5X21hcF9yZWdpb25zKCZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLCAwLAotCQkJCSh1aW50MzJfdCAqKSZjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCAxKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEFETSBtbWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgcmV0KTsKLQkJCXByX2RlYnVnKCIlczogQURNIG1tYXAgZGlkIG5vdCB3b3JrISBhZGRyID0gMHglcEssIHNpemUgPSAlemQgcmV0ICVkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uCi0JCQltZW1fbWFwX2hhbmRsZXNbY2FsX2luZGV4XSk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzZW5kX2FkbV9jdXN0b21fdG9wb2xvZ3kodm9pZCkKLXsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0Jc3RydWN0IGNtZF9zZXRfdG9wb2xvZ2llcyBhZG1fdG9wOwotCWludCBjYWxfaW5kZXggPSBBRE1fQ1VTVE9NX1RPUF9DQUw7Ci0JaW50IHJlc3VsdDsKLQotCWlmICh0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQotCW11dGV4X2xvY2soJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCWlmICghdGhpc19hZG0uc2V0X2N1c3RvbV90b3BvbG9neSkKLQkJZ290byB1bmxvY2s7Ci0JdGhpc19hZG0uc2V0X2N1c3RvbV90b3BvbG9neSA9IDA7Ci0KLQljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKHRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0pOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKLQkJZ290byB1bmxvY2s7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgY2FsX2luZGV4ICVkXG4iLCBfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQotCXJlc3VsdCA9IHJlbWFwX2NhbF9kYXRhKGNhbF9ibG9jaywgY2FsX2luZGV4KTsKLQlpZiAocmVzdWx0KSB7Ci0JCXByX2VycigiJXM6IFJlbWFwX2NhbF9kYXRhIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwgY2FsX2luZGV4KTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbY2FsX2luZGV4XSwKLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOwotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogTm8gQURNIGNhbCB0byBzZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWFkbV90b3AuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCUFQUl9IRFJfTEVOKDIwKSwgQVBSX1BLVF9WRVIpOwotCWFkbV90b3AuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFkbV90b3ApOwotCWFkbV90b3AuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fdG9wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFkbV90b3AuaGRyLnNyY19wb3J0ID0gMDsKLQlhZG1fdG9wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV90b3AuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFkbV90b3AuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JYWRtX3RvcC5oZHIudG9rZW4gPSAwOwotCWFkbV90b3AuaGRyLm9wY29kZSA9IEFETV9DTURfQUREX1RPUE9MT0dJRVM7Ci0JYWRtX3RvcC5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlhZG1fdG9wLnBheWxvYWRfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCWFkbV90b3AubWVtX21hcF9oYW5kbGUgPSBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKLQlhZG1fdG9wLnBheWxvYWRfc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmFkbV9zdGF0LCAtMSk7Ci0JcHJfZGVidWcoIiVzOiBTZW5kaW5nIEFETV9DTURfQUREX1RPUE9MT0dJRVMgcGF5bG9hZCA9IDB4JXBLLCBzaXplID0gJWRcbiIsCi0JCV9fZnVuY19fLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJYWRtX3RvcC5wYXlsb2FkX3NpemUpOwotCXJlc3VsdCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZhZG1fdG9wKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgdG9wb2xvZ2llcyBmYWlsZWQgcGF5bG9hZCBzaXplID0gJXpkIHJlc3VsdCAlZFxuIiwKLQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsIHJlc3VsdCk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uYWRtX3dhaXQsCi0JCQkJICAgIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPj0gMCwKLQkJCQkgICAgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJcHJfZXJyKCIlczogU2V0IHRvcG9sb2dpZXMgdGltZWQgb3V0IHBheWxvYWQgc2l6ZSA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUpOwotCQlnb3RvIHVubG9jazsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5hZG1fc3RhdCkpKTsKLQkJcmVzdWx0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uYWRtX3N0YXQpKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotdW5sb2NrOgotCW11dGV4X3VubG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Ci1kb25lOgotCXJldHVybjsKLX0KLQotc3RhdGljIGludCBzZW5kX2FkbV9jYWxfYmxvY2soaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCSAgICAgIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLCBpbnQgcGVyZl9tb2RlLAotCQkJICAgICAgaW50IGFwcF90eXBlLCBpbnQgYWNkYl9pZCwgaW50IHNhbXBsZV9yYXRlKQotewotCXMzMiByZXN1bHQgPSAwOwotCXN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUJYWRtX3BhcmFtczsKLQlpbnQgcG9ydF9pZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IFBvcnQgaWQgMHgleCBzYW1wbGVfcmF0ZSAlZCAsXG4iLCBfX2Z1bmNfXywKLQkJCXBvcnRfaWQsIHNhbXBsZV9yYXRlKTsKLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICghY2FsX2Jsb2NrKSB7Ci0JCXByX2RlYnVnKCIlczogTm8gQURNIGNhbCB0byBzZW5kIGZvciBwb3J0X2lkID0gMHgleCFcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA8PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogTm8gQURNIGNhbCBzZW5kIGZvciBwb3J0X2lkID0gMHgleCFcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAocGVyZl9tb2RlID09IExFR0FDWV9QQ01fTU9ERSAmJgotCQkoKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnRvcG9sb2d5W3BvcnRfaWR4XVtjb3BwX2lkeF0pKSA9PQotCQkJRFMyX0FETV9DT1BQX1RPUE9MT0dZX0lEKSkgewotCQlwcl9lcnIoIiVzOiBwZXJmX21vZGUgJWQsIHRvcG9sb2d5IDB4JXhcbiIsIF9fZnVuY19fLCBwZXJmX21vZGUsCi0JCQlhdG9taWNfcmVhZCgKLQkJCQkmdGhpc19hZG0uY29wcC50b3BvbG9neVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhZG1fcGFyYW1zLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQlBUFJfSERSX0xFTigyMCksIEFQUl9QS1RfVkVSKTsKLQlhZG1fcGFyYW1zLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihhZG1fcGFyYW1zKTsKLQlhZG1fcGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYWRtX3BhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlhZG1fcGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYWRtX3BhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQotCWFkbV9wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQlhZG1fcGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JYWRtX3BhcmFtcy5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OwotCWFkbV9wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JYWRtX3BhcmFtcy5wYXlsb2FkX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCQljYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlhZG1fcGFyYW1zLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7Ci0JYWRtX3BhcmFtcy5wYXlsb2FkX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXByX2RlYnVnKCIlczogU2VuZGluZyBTRVRfUEFSQU1TIHBheWxvYWQgPSAweCVwSywgc2l6ZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCWFkbV9wYXJhbXMucGF5bG9hZF9zaXplKTsKLQlyZXN1bHQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmYWRtX3BhcmFtcyk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCAweCV4IHJlc3VsdCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmVzdWx0KTsKLQkJcHJfZGVidWcoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gMHgleCBwYXlsb2FkID0gMHglcEsgcmVzdWx0ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLwotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBwb3J0ID0gMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXByX2RlYnVnKCIlczogU2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9IDB4JXgsIHBheWxvYWQgPSAweCVwS1xuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmVzdWx0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWRtX2ZpbmRfY2FsX2J5X3BhdGgoaW50IGNhbF9pbmRleCwgaW50IHBhdGgpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHByb2MgKmF1ZHByb2NfY2FsX2luZm8gPSBOVUxMOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWR2b2wgKmF1ZHZvbF9jYWxfaW5mbyA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+Y2FsX2Jsb2NrcykgewotCi0JCWNhbF9ibG9jayA9IGxpc3RfZW50cnkocHRyLAotCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhLCBsaXN0KTsKLQotCQlpZiAoY2FsX2luZGV4ID09IEFETV9BVURQUk9DX0NBTCkgewotCQkJYXVkcHJvY19jYWxfaW5mbyA9IGNhbF9ibG9jay0+Y2FsX2luZm87Ci0JCQlpZiAoKGF1ZHByb2NfY2FsX2luZm8tPnBhdGggPT0gcGF0aCkgJiYKLQkJCSAgICAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID4gMCkpCi0JCQkJcmV0dXJuIGNhbF9ibG9jazsKLQkJfSBlbHNlIGlmIChjYWxfaW5kZXggPT0gQURNX0FVRFZPTF9DQUwpIHsKLQkJCWF1ZHZvbF9jYWxfaW5mbyA9IGNhbF9ibG9jay0+Y2FsX2luZm87Ci0JCQlpZiAoKGF1ZHZvbF9jYWxfaW5mby0+cGF0aCA9PSBwYXRoKSAmJgotCQkJICAgIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiAwKSkKLQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogQ2FuJ3QgZmluZCBBRE0gY2FsIGZvciBjYWxfaW5kZXggJWQsIHBhdGggJWRcbiIsCi0JCV9fZnVuY19fLCBjYWxfaW5kZXgsIHBhdGgpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNhbF9ibG9ja19kYXRhICphZG1fZmluZF9jYWxfYnlfYXBwX3R5cGUoaW50IGNhbF9pbmRleCwgaW50IHBhdGgsCi0JCQkJCQkJCWludCBhcHBfdHlwZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkcHJvYyAqYXVkcHJvY19jYWxfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2F1ZHZvbCAqYXVkdm9sX2NhbF9pbmZvID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0KLQkJaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEUFJPQ19DQUwpIHsKLQkJCWF1ZHByb2NfY2FsX2luZm8gPSBjYWxfYmxvY2stPmNhbF9pbmZvOwotCQkJaWYgKChhdWRwcm9jX2NhbF9pbmZvLT5wYXRoID09IHBhdGgpICYmCi0JCQkgICAgKGF1ZHByb2NfY2FsX2luZm8tPmFwcF90eXBlID09IGFwcF90eXBlKSAmJgotCQkJICAgIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiAwKSkKLQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9IGVsc2UgaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEVk9MX0NBTCkgewotCQkJYXVkdm9sX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKLQkJCWlmICgoYXVkdm9sX2NhbF9pbmZvLT5wYXRoID09IHBhdGgpICYmCi0JCQkgICAgKGF1ZHZvbF9jYWxfaW5mby0+YXBwX3R5cGUgPT0gYXBwX3R5cGUpICYmCi0JCQkgICAgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA+IDApKQotCQkJCXJldHVybiBjYWxfYmxvY2s7Ci0JCX0KLQl9Ci0JcHJfZGVidWcoIiVzOiBDYW4ndCBmaW5kIEFETSBjYWxpIGZvciBjYWxfaW5kZXggJWQsIHBhdGggJWQsIGFwcCAlZCwgZGVmYXVsdGluZyB0byBzZWFyY2ggYnkgcGF0aFxuIiwKLQkJX19mdW5jX18sIGNhbF9pbmRleCwgcGF0aCwgYXBwX3R5cGUpOwotCXJldHVybiBhZG1fZmluZF9jYWxfYnlfcGF0aChjYWxfaW5kZXgsIHBhdGgpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmFkbV9maW5kX2NhbChpbnQgY2FsX2luZGV4LCBpbnQgcGF0aCwKLQkJCQkJICAgaW50IGFwcF90eXBlLCBpbnQgYWNkYl9pZCwKLQkJCQkJICAgaW50IHNhbXBsZV9yYXRlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hdWRwcm9jICphdWRwcm9jX2NhbF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkdm9sICphdWR2b2xfY2FsX2luZm8gPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0KLQkJaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEUFJPQ19DQUwpIHsKLQkJCWF1ZHByb2NfY2FsX2luZm8gPSBjYWxfYmxvY2stPmNhbF9pbmZvOwotCQkJaWYgKChhdWRwcm9jX2NhbF9pbmZvLT5wYXRoID09IHBhdGgpICYmCi0JCQkgICAgKGF1ZHByb2NfY2FsX2luZm8tPmFwcF90eXBlID09IGFwcF90eXBlKSAmJgotCQkJICAgIChhdWRwcm9jX2NhbF9pbmZvLT5hY2RiX2lkID09IGFjZGJfaWQpICYmCi0JCQkgICAgKGF1ZHByb2NfY2FsX2luZm8tPnNhbXBsZV9yYXRlID09IHNhbXBsZV9yYXRlKSAmJgotCQkJICAgIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiAwKSkKLQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9IGVsc2UgaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEVk9MX0NBTCkgewotCQkJYXVkdm9sX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKLQkJCWlmICgoYXVkdm9sX2NhbF9pbmZvLT5wYXRoID09IHBhdGgpICYmCi0JCQkgICAgKGF1ZHZvbF9jYWxfaW5mby0+YXBwX3R5cGUgPT0gYXBwX3R5cGUpICYmCi0JCQkgICAgKGF1ZHZvbF9jYWxfaW5mby0+YWNkYl9pZCA9PSBhY2RiX2lkKSAmJgotCQkJICAgIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiAwKSkKLQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogQ2FuJ3QgZmluZCBBRE0gY2FsIGZvciBjYWxfaW5kZXggJWQsIHBhdGggJWQsIGFwcCAlZCwgYWNkYl9pZCAlZCBzYW1wbGVfcmF0ZSAlZCBkZWZhdWx0aW5nIHRvIHNlYXJjaCBieSBhcHAgdHlwZVxuIiwKLQkJX19mdW5jX18sIGNhbF9pbmRleCwgcGF0aCwgYXBwX3R5cGUsIGFjZGJfaWQsIHNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gYWRtX2ZpbmRfY2FsX2J5X2FwcF90eXBlKGNhbF9pbmRleCwgcGF0aCwgYXBwX3R5cGUpOwotfQotCi1zdGF0aWMgaW50IGFkbV9yZW1hcF9hbmRfc2VuZF9jYWxfYmxvY2soaW50IGNhbF9pbmRleCwgaW50IHBvcnRfaWQsCi0JaW50IGNvcHBfaWR4LCBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgaW50IHBlcmZfbW9kZSwKLQlpbnQgYXBwX3R5cGUsIGludCBhY2RiX2lkLCBpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgY2FsX2luZGV4IGNhbCAlZFxuIiwgX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JcmV0ID0gcmVtYXBfY2FsX2RhdGEoY2FsX2Jsb2NrLCBjYWxfaW5kZXgpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gc2VuZF9hZG1fY2FsX2Jsb2NrKHBvcnRfaWQsIGNvcHBfaWR4LCBjYWxfYmxvY2ssIHBlcmZfbW9kZSwKLQkJCQlhcHBfdHlwZSwgYWNkYl9pZCwgc2FtcGxlX3JhdGUpOwotCWlmIChyZXQgPCAwKQotCQlwcl9kZWJ1ZygiJXM6IE5vIGNhbCBzZW50IGZvciBjYWxfaW5kZXggJWQsIHBvcnRfaWQgPSAweCV4ISByZXQgJWQgc2FtcGxlX3JhdGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4LCBwb3J0X2lkLCByZXQsIHNhbXBsZV9yYXRlKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9hZG1fY2FsX3R5cGUoaW50IGNhbF9pbmRleCwgaW50IHBhdGgsIGludCBwb3J0X2lkLAotCQkJICAgICAgaW50IGNvcHBfaWR4LCBpbnQgcGVyZl9tb2RlLCBpbnQgYXBwX3R5cGUsCi0JCQkgICAgICBpbnQgYWNkYl9pZCwgaW50IHNhbXBsZV9yYXRlKQotewotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YQkJKmNhbF9ibG9jayA9IE5VTEw7Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlczogY2FsIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQotCWlmICh0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBjYWxfaW5kZXggJWQgbm90IGFsbG9jYXRlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCWNhbF9ibG9jayA9IGFkbV9maW5kX2NhbChjYWxfaW5kZXgsIHBhdGgsIGFwcF90eXBlLCBhY2RiX2lkLAotCQkJCXNhbXBsZV9yYXRlKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpCi0JCWdvdG8gdW5sb2NrOwotCi0JcmV0ID0gYWRtX3JlbWFwX2FuZF9zZW5kX2NhbF9ibG9jayhjYWxfaW5kZXgsIHBvcnRfaWQsIGNvcHBfaWR4LAotCQljYWxfYmxvY2ssIHBlcmZfbW9kZSwgYXBwX3R5cGUsIGFjZGJfaWQsIHNhbXBsZV9yYXRlKTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJnRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbF9wYXRoKGludCBwYXRoKQotewotCWlmIChwYXRoID09IDB4MSkKLQkJcmV0dXJuIFJYX0RFVklDRTsKLQllbHNlCi0JCXJldHVybiBUWF9ERVZJQ0U7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfYWRtX2NhbChpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgcGF0aCwgaW50IHBlcmZfbW9kZSwKLQkJCSBpbnQgYXBwX3R5cGUsIGludCBhY2RiX2lkLCBpbnQgc2FtcGxlX3JhdGUpCi17Ci0JcHJfZGVidWcoIiVzOiBwb3J0IGlkIDB4JXggY29wcF9pZHggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQlzZW5kX2FkbV9jYWxfdHlwZShBRE1fQVVEUFJPQ19DQUwsIHBhdGgsIHBvcnRfaWQsIGNvcHBfaWR4LCBwZXJmX21vZGUsCi0JCQkgIGFwcF90eXBlLCBhY2RiX2lkLCBzYW1wbGVfcmF0ZSk7Ci0Jc2VuZF9hZG1fY2FsX3R5cGUoQURNX0FVRFZPTF9DQUwsIHBhdGgsIHBvcnRfaWQsIGNvcHBfaWR4LCBwZXJmX21vZGUsCi0JCQkgIGFwcF90eXBlLCBhY2RiX2lkLCBzYW1wbGVfcmF0ZSk7Ci19Ci0KLWludCBhZG1fY29ubmVjdF9hZmVfcG9ydChpbnQgbW9kZSwgaW50IHNlc3Npb25faWQsIGludCBwb3J0X2lkKQotewotCXN0cnVjdCBhZG1fY21kX2Nvbm5lY3RfYWZlX3BvcnRfdjUJY21kOwotCWludCByZXQgPSAwOwotCWludCBwb3J0X2lkeCwgY29wcF9pZHggPSAwOwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkOiAweCV4IHNlc3Npb24gaWQ6JWQgbW9kZTolZFxuIiwgX19mdW5jX18sCi0JCQkJcG9ydF9pZCwgc2Vzc2lvbl9pZCwgbW9kZSk7Ci0KLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWRtLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRE0iLCBhZG1fY2FsbGJhY2ssCi0JCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZG0pOwotCQlpZiAodGhpc19hZG0uYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRE1cbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJ0YWNfc2V0X2FkbV9oYW5kbGUodGhpc19hZG0uYXByKTsKLQl9Ci0JcHJfZGVidWcoIiVzOiBQb3J0IElEIDB4JXgsIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcG9ydF9pZHgpOwotCi0JY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNtZC5oZHIucGt0X3NpemUgPSBzaXplb2YoY21kKTsKLQljbWQuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQljbWQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JY21kLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JY21kLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWNtZC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JY21kLmhkci5kZXN0X3BvcnQgPSAwOyAvKiBJZ25vcmVkICovCi0JY21kLmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7Ci0JY21kLmhkci5vcGNvZGUgPSBBRE1fQ01EX0NPTk5FQ1RfQUZFX1BPUlRfVjU7Ci0KLQljbWQubW9kZSA9IG1vZGU7Ci0JY21kLnNlc3Npb25faWQgPSBzZXNzaW9uX2lkOwotCWNtZC5hZmVfcG9ydF9pZCA9IHBvcnRfaWQ7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZjbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFETSBlbmFibGUgZm9yIHBvcnRfaWQ6IDB4JXggZmFpbGVkIHJldCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayB3aXRoIGNvcHAgaWQgKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQURNIGNvbm5lY3QgdGltZWRvdXQgZm9yIHBvcnRfaWQ6IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlhdG9taWNfaW5jKCZ0aGlzX2FkbS5jb3BwLmNudFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlyZXR1cm4gMDsKLQotZmFpbF9jbWQ6Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWRtX2FycmFuZ2VfbWNoX21hcChzdHJ1Y3QgYWRtX2NtZF9kZXZpY2Vfb3Blbl92NSAqb3BlbiwgaW50IHBhdGgsCi0JCQkgaW50IGNoYW5uZWxfbW9kZSkKLXsKLQlpbnQgcmMgPSAwLCBpZHg7Ci0KLQltZW1zZXQob3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCXN3aXRjaCAocGF0aCkgewotCWNhc2UgQURNX1BBVEhfUExBWUJBQ0s6Ci0JCWlkeCA9IEFETV9NQ0hfTUFQX0lEWF9QTEFZQkFDSzsKLQkJYnJlYWs7Ci0JY2FzZSBBRE1fUEFUSF9MSVZFX1JFQzoKLQljYXNlIEFETV9QQVRIX05PTkxJVkVfUkVDOgotCQlpZHggPSBBRE1fTUNIX01BUF9JRFhfUkVDOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIG5vbl9tY2hfcGF0aDsKLQl9OwotCWlmICgob3Blbi0+ZGV2X251bV9jaGFubmVsID4gMikgJiYgbXVsdGlfY2hfbWFwc1tpZHhdLnNldF9jaGFubmVsX21hcCkgewotCQltZW1jcHkob3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZywKLQkJCW11bHRpX2NoX21hcHNbaWR4XS5jaGFubmVsX21hcHBpbmcsCi0JCQlQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGNoYW5uZWxfbW9kZSA9PSAxKSB7Ci0JCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbF9tb2RlID09IDIpIHsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gMykgewotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA0KSB7Ci0JCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfTFM7Ci0JCQlvcGVuLT5kZXZfY2hhbm5lbF9tYXBwaW5nWzNdID0gUENNX0NIQU5ORUxfUlM7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbF9tb2RlID09IDUpIHsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gNikgewotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gNykgewotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9MQjsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9SQjsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9DUzsKLQkJfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gOCkgewotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQkJb3Blbi0+ZGV2X2NoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNV0gPSBQQ01fQ0hBTk5FTF9SUzsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbNl0gPSBQQ01fQ0hBTk5FTF9MQjsKLQkJCW9wZW4tPmRldl9jaGFubmVsX21hcHBpbmdbN10gPSBQQ01fQ0hBTk5FTF9SQjsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgbnVtX2NoYW4gJWRcbiIsIF9fZnVuY19fLAotCQkJCWNoYW5uZWxfbW9kZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGludmFsX2NoX21vZDsKLQkJfQotCX0KLQotbm9uX21jaF9wYXRoOgotaW52YWxfY2hfbW9kOgotCXJldHVybiByYzsKLX0KLQotaW50IGFkbV9hcnJhbmdlX21jaF9lcDJfbWFwKHN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y2ICpvcGVuX3Y2LAotCQkJIGludCBjaGFubmVsX21vZGUpCi17Ci0JaW50IHJjID0gMDsKLQotCW1lbXNldChvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDIsIDAsCi0JICAgICAgIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKLQotCWlmIChjaGFubmVsX21vZGUgPT0gMSkJewotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMF0gPSBQQ01fQ0hBTk5FTF9GQzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSAyKSB7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlswXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSAzKQl7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlswXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzJdID0gUENNX0NIQU5ORUxfRkM7Ci0JfSBlbHNlIGlmIChjaGFubmVsX21vZGUgPT0gNCkgewotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlsyXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbM10gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA1KSB7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlswXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzJdID0gUENNX0NIQU5ORUxfRkM7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlszXSA9IFBDTV9DSEFOTkVMX0xTOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbNF0gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxfbW9kZSA9PSA2KSB7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlswXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzJdID0gUENNX0NIQU5ORUxfTEZFOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbM10gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzRdID0gUENNX0NIQU5ORUxfTFM7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMls1XSA9IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hhbm5lbF9tb2RlID09IDgpIHsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlsxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbMl0gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMlszXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbNF0gPSBQQ01fQ0hBTk5FTF9MUzsKLQkJb3Blbl92Ni0+ZGV2X2NoYW5uZWxfbWFwcGluZ19laWQyWzVdID0gUENNX0NIQU5ORUxfUlM7Ci0JCW9wZW5fdjYtPmRldl9jaGFubmVsX21hcHBpbmdfZWlkMls2XSA9IFBDTV9DSEFOTkVMX0xCOwotCQlvcGVuX3Y2LT5kZXZfY2hhbm5lbF9tYXBwaW5nX2VpZDJbN10gPSBQQ01fQ0hBTk5FTF9SQjsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG51bV9jaGFuICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNoYW5uZWxfbW9kZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhZG1fb3BlbihpbnQgcG9ydF9pZCwgaW50IHBhdGgsIGludCByYXRlLCBpbnQgY2hhbm5lbF9tb2RlLCBpbnQgdG9wb2xvZ3ksCi0JICAgICBpbnQgcGVyZl9tb2RlLCB1aW50MTZfdCBiaXRfd2lkdGgsIGludCBhcHBfdHlwZSwgaW50IGFjZGJfaWQpCi17Ci0Jc3RydWN0IGFkbV9jbWRfZGV2aWNlX29wZW5fdjUJb3BlbjsKLQlzdHJ1Y3QgYWRtX2NtZF9kZXZpY2Vfb3Blbl92NglvcGVuX3Y2OwotCWludCByZXQgPSAwOwotCWludCBwb3J0X2lkeCwgZmxhZ3M7Ci0JaW50IGNvcHBfaWR4ID0gLTE7Ci0JaW50IHRtcF9wb3J0ID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQotCXByX2RlYnVnKCIlczpwb3J0ICUjeCBwYXRoOiVkIHJhdGU6JWQgbW9kZTolZCBwZXJmX21vZGU6JWQsdG9wb19pZCAlZFxuIiwKLQkJIF9fZnVuY19fLCBwb3J0X2lkLCBwYXRoLCByYXRlLCBjaGFubmVsX21vZGUsIHBlcmZfbW9kZSwKLQkJIHRvcG9sb2d5KTsKLQotCXBvcnRfaWQgPSBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHRoaXNfYWRtLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWRtLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRE0iLCBhZG1fY2FsbGJhY2ssCi0JCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZG0pOwotCQlpZiAodGhpc19hZG0uYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRE1cbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXJ0YWNfc2V0X2FkbV9oYW5kbGUodGhpc19hZG0uYXByKTsKLQl9Ci0KLQlpZiAocGVyZl9tb2RlID09IFVMTF9QT1NUX1BST0NFU1NJTkdfUENNX01PREUpIHsKLQkJZmxhZ3MgPSBBRE1fVUxMX1BPU1RfUFJPQ0VTU0lOR19ERVZJQ0VfU0VTU0lPTjsKLQkJaWYgKCh0b3BvbG9neSA9PSBET0xCWV9BRE1fQ09QUF9UT1BPTE9HWV9JRCkgfHwKLQkJICAgICh0b3BvbG9neSA9PSBEUzJfQURNX0NPUFBfVE9QT0xPR1lfSUQpIHx8Ci0JCSAgICAodG9wb2xvZ3kgPT0gU1JTX1RSVU1FRElBX1RPUE9MT0dZX0lEKSkKLQkJCXRvcG9sb2d5ID0gREVGQVVMVF9DT1BQX1RPUE9MT0dZOwotCX0gZWxzZSBpZiAocGVyZl9tb2RlID09IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFKSB7Ci0JCWZsYWdzID0gQURNX1VMVFJBX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OOwotCQl0b3BvbG9neSA9IE5VTExfQ09QUF9UT1BPTE9HWTsKLQkJcmF0ZSA9IFVMTF9TVVBQT1JURURfU0FNUExFX1JBVEU7Ci0JCWJpdF93aWR0aCA9IFVMTF9TVVBQT1JURURfQklUU19QRVJfU0FNUExFOwotCX0gZWxzZSBpZiAocGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKSB7Ci0JCWZsYWdzID0gQURNX0xPV19MQVRFTkNZX0RFVklDRV9TRVNTSU9OOwotCQlpZiAoKHRvcG9sb2d5ID09IERPTEJZX0FETV9DT1BQX1RPUE9MT0dZX0lEKSB8fAotCQkgICAgKHRvcG9sb2d5ID09IERTMl9BRE1fQ09QUF9UT1BPTE9HWV9JRCkgfHwKLQkJICAgICh0b3BvbG9neSA9PSBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQpKQotCQkJdG9wb2xvZ3kgPSBERUZBVUxUX0NPUFBfVE9QT0xPR1k7Ci0JfSBlbHNlIHsKLQkJaWYgKChwYXRoID09IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpIHx8Ci0JCSAgICAocGF0aCA9PSBBRE1fUEFUSF9DT01QUkVTU0VEX1RYKSkKLQkJCWZsYWdzID0gMDsKLQkJZWxzZQotCQkJZmxhZ3MgPSBBRE1fTEVHQUNZX0RFVklDRV9TRVNTSU9OOwotCX0KLQotCWlmICgodG9wb2xvZ3kgPT0gVlBNX1RYX1NNX0VDTlNfVjJfQ09QUF9UT1BPTE9HWSkgfHwKLQkgICAgKHRvcG9sb2d5ID09IFZQTV9UWF9ETV9GTFVFTkNFX0NPUFBfVE9QT0xPR1kpIHx8Ci0JICAgICh0b3BvbG9neSA9PSBWUE1fVFhfRE1fUkZFQ05TX0NPUFBfVE9QT0xPR1kpKQotCQlyYXRlID0gMTYwMDA7Ci0KLQkvKgotCSAqIFJvdXRpbmcgZHJpdmVyIHJldXNlcyB0aGUgc2FtZSBhZG0gZm9yIHN0cmVhbXMgd2l0aCB0aGUgc2FtZQotCSAqIGFwcF90eXBlLCBzYW1wbGVfcmF0ZSBldGMuCi0JICogVGhpcyBpc24ndCBhbGxvd2VkIGZvciBVTEwgc3RyZWFtcyBhcyBwZXIgdGhlIERTUCBpbnRlcmZhY2UKLQkgKi8KLQlpZiAocGVyZl9tb2RlICE9IFVMVFJBX0xPV19MQVRFTkNZX1BDTV9NT0RFKQotCQljb3BwX2lkeCA9IGFkbV9nZXRfaWR4X2lmX2NvcHBfZXhpc3RzKHBvcnRfaWR4LCB0b3BvbG9neSwKLQkJCQkJCSAgICAgIHBlcmZfbW9kZSwKLQkJCQkJCSAgICAgIHJhdGUsIGJpdF93aWR0aCwKLQkJCQkJCSAgICAgIGFwcF90eXBlKTsKLQotCWlmIChjb3BwX2lkeCA8IDApIHsKLQkJY29wcF9pZHggPSBhZG1fZ2V0X25leHRfYXZhaWxhYmxlX2NvcHAocG9ydF9pZHgpOwotCQlpZiAoY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7Ci0JCQlwcl9lcnIoIiVzOiBleGNlZWRlZCBjb3BwIGlkICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5jbnRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7Ci0JCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCSAgIHRvcG9sb2d5KTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5tb2RlW3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCQkgICBwZXJmX21vZGUpOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnJhdGVbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCSAgIHJhdGUpOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNoYW5uZWxzW3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCQkgICBjaGFubmVsX21vZGUpOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmJpdF93aWR0aFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJICAgYml0X3dpZHRoKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJICAgYXBwX3R5cGUpOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFjZGJfaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCSAgIGFjZGJfaWQpOwotCQlzZXRfYml0KEFETV9TVEFUVVNfQ0FMSUJSQVRJT05fUkVRVUlSRUQsCi0JCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1twb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJaWYgKChwYXRoICE9IEFETV9QQVRIX0NPTVBSRVNTRURfUlgpICYmCi0JCSAgICAocGF0aCAhPSBBRE1fUEFUSF9DT01QUkVTU0VEX1RYKSkKLQkJCXNlbmRfYWRtX2N1c3RvbV90b3BvbG9neSgpOwotCX0KLQotCWlmICh0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtwb3J0X2lkeF1bY29wcF9pZHhdICYmCi0JCXBlcmZfbW9kZSA9PSBMRUdBQ1lfUENNX01PREUpIHsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJICAgMSk7Ci0JCXRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5W3BvcnRfaWR4XVtjb3BwX2lkeF0gPSAwOwotCQl3YWtlX3VwKCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV93YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCX0KLQotCS8qIENyZWF0ZSBhIENPUFAgaWYgcG9ydCBpZCBhcmUgbm90IGVuYWJsZWQgKi8KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuY250W3BvcnRfaWR4XVtjb3BwX2lkeF0pID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBvcGVuIEFETTogcG9ydF9pZHg6ICVkLCBjb3BwX2lkeDogJWRcbiIsIF9fZnVuY19fLAotCQkJIHBvcnRfaWR4LCBjb3BwX2lkeCk7Ci0JaWYgKCh0b3BvbG9neSA9PSBTUlNfVFJVTUVESUFfVE9QT0xPR1lfSUQpICYmCi0JICAgICBwZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSB7Ci0JCWludCByZXM7Ci0KLQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwgQURNX1NSU19UUlVNRURJQSk7Ci0JCW1zbV9kdHNfc3JzX3RtX2lvbl9tZW1tYXAoJnRoaXNfYWRtLm91dGJhbmRfbWVtbWFwKTsKLQkJcmVzID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygmdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAucGFkZHIsIDAsCi0JCSh1aW50MzJfdCAqKSZ0aGlzX2FkbS5vdXRiYW5kX21lbW1hcC5zaXplLCAxKTsKLQkJaWYgKHJlcyA8IDApIHsKLQkJCXByX2VycigiJXM6IFNSUyBhZG1fbWVtb3J5X21hcF9yZWdpb25zIGZhaWxlZCAhIGFkZHIgPSAweCVwSywgc2l6ZSA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCAodm9pZCAqKXRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyLAotCQkodWludDMyX3QpdGhpc19hZG0ub3V0YmFuZF9tZW1tYXAuc2l6ZSk7Ci0JCX0KLQl9Ci0JCW9wZW4uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQkgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJICAgQVBSX1BLVF9WRVIpOwotCQlvcGVuLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihvcGVuKTsKLQkJb3Blbi5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCQlvcGVuLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCQlvcGVuLmhkci5zcmNfcG9ydCA9IHRtcF9wb3J0OwotCQlvcGVuLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCQlvcGVuLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQkJb3Blbi5oZHIuZGVzdF9wb3J0ID0gdG1wX3BvcnQ7Ci0JCW9wZW4uaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQkJb3Blbi5oZHIub3Bjb2RlID0gQURNX0NNRF9ERVZJQ0VfT1BFTl9WNTsKLQkJb3Blbi5mbGFncyA9IGZsYWdzOwotCQlvcGVuLm1vZGVfb2Zfb3BlcmF0aW9uID0gcGF0aDsKLQkJb3Blbi5lbmRwb2ludF9pZF8xID0gdG1wX3BvcnQ7Ci0JCW9wZW4uZW5kcG9pbnRfaWRfMiA9IDB4RkZGRjsKLQotCQlpZiAodGhpc19hZG0uZWNfcmVmX3J4ICYmIChwYXRoICE9IDEpKSB7Ci0JCQlvcGVuLmVuZHBvaW50X2lkXzIgPSB0aGlzX2FkbS5lY19yZWZfcng7Ci0JCQl0aGlzX2FkbS5lY19yZWZfcnggPSAtMTsKLQkJfQotCi0JCW9wZW4udG9wb2xvZ3lfaWQgPSB0b3BvbG9neTsKLQotCQlvcGVuLmRldl9udW1fY2hhbm5lbCA9IGNoYW5uZWxfbW9kZSAmIDB4MDBGRjsKLQkJb3Blbi5iaXRfd2lkdGggPSBiaXRfd2lkdGg7Ci0JCVdBUk5fT04oKHBlcmZfbW9kZSA9PSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERSkgJiYKLQkJCShyYXRlICE9IFVMTF9TVVBQT1JURURfU0FNUExFX1JBVEUpKTsKLQkJb3Blbi5zYW1wbGVfcmF0ZSAgPSByYXRlOwotCi0JCXJldCA9IGFkbV9hcnJhbmdlX21jaF9tYXAoJm9wZW4sIHBhdGgsIGNoYW5uZWxfbW9kZSk7Ci0KLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcHJfZGVidWcoIiVzOiBwb3J0X2lkPTB4JXggcmF0ZT0lZCB0b3BvbG9neV9pZD0weCVYXG4iLAotCQkJX19mdW5jX18sIG9wZW4uZW5kcG9pbnRfaWRfMSwgb3Blbi5zYW1wbGVfcmF0ZSwKLQkJCW9wZW4udG9wb2xvZ3lfaWQpOwotCi0JCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0KLQkJaWYgKCh0aGlzX2FkbS5udW1fZWNfcmVmX3J4X2NoYW5zICE9IDApICYmIChwYXRoICE9IDEpICYmCi0JCQkob3Blbi5lbmRwb2ludF9pZF8yICE9IDB4RkZGRikpIHsKLQkJCW1lbXNldCgmb3Blbl92NiwgMCwKLQkJCQlzaXplb2Yoc3RydWN0IGFkbV9jbWRfZGV2aWNlX29wZW5fdjYpKTsKLQkJCW1lbWNweSgmb3Blbl92NiwgJm9wZW4sCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX2RldmljZV9vcGVuX3Y1KSk7Ci0JCQlvcGVuX3Y2Lmhkci5vcGNvZGUgPSBBRE1fQ01EX0RFVklDRV9PUEVOX1Y2OwotCQkJb3Blbl92Ni5oZHIucGt0X3NpemUgPSBzaXplb2Yob3Blbl92Nik7Ci0JCQlvcGVuX3Y2LmRldl9udW1fY2hhbm5lbF9laWQyID0KLQkJCQl0aGlzX2FkbS5udW1fZWNfcmVmX3J4X2NoYW5zOwotCQkJdGhpc19hZG0ubnVtX2VjX3JlZl9yeF9jaGFucyA9IDA7Ci0KLQkJCWlmICh0aGlzX2FkbS5lY19yZWZfcnhfYml0X3dpZHRoICE9IDApIHsKLQkJCQlvcGVuX3Y2LmJpdF93aWR0aF9laWQyID0KLQkJCQkJdGhpc19hZG0uZWNfcmVmX3J4X2JpdF93aWR0aDsKLQkJCQl0aGlzX2FkbS5lY19yZWZfcnhfYml0X3dpZHRoID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJb3Blbl92Ni5iaXRfd2lkdGhfZWlkMiA9IGJpdF93aWR0aDsKLQkJCX0KLQotCQkJaWYgKHRoaXNfYWRtLmVjX3JlZl9yeF9zYW1wbGluZ19yYXRlICE9IDApIHsKLQkJCQlvcGVuX3Y2LnNhbXBsZV9yYXRlX2VpZDIgPQotCQkJCQl0aGlzX2FkbS5lY19yZWZfcnhfc2FtcGxpbmdfcmF0ZTsKLQkJCQl0aGlzX2FkbS5lY19yZWZfcnhfc2FtcGxpbmdfcmF0ZSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCW9wZW5fdjYuc2FtcGxlX3JhdGVfZWlkMiA9IHJhdGU7Ci0JCQl9Ci0KLQkJCXByX2RlYnVnKCIlczogZWlkMl9jaGFubmVscz0lZCBlaWQyX2JpdF93aWR0aD0lZCBlaWQyX3JhdGU9JWRcbiIsCi0JCQkJX19mdW5jX18sIG9wZW5fdjYuZGV2X251bV9jaGFubmVsX2VpZDIsCi0JCQkJb3Blbl92Ni5iaXRfd2lkdGhfZWlkMiwKLQkJCQlvcGVuX3Y2LnNhbXBsZV9yYXRlX2VpZDIpOwotCi0JCQlyZXQgPSBhZG1fYXJyYW5nZV9tY2hfZXAyX21hcCgmb3Blbl92NiwKLQkJCQlvcGVuX3Y2LmRldl9udW1fY2hhbm5lbF9laWQyKTsKLQotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCi0JCQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmb3Blbl92Nik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmb3Blbik7Ci0JCX0KLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHBvcnRfaWQ6IDB4JXggZm9yWzB4JXhdIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCB0bXBfcG9ydCwgcG9ydF9pZCwgcmV0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayB3aXRoIGNvcHAgaWQgKi8KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IEFETSBvcGVuIHRpbWVkb3V0IGZvciBwb3J0X2lkOiAweCV4IGZvciBbMHgleF1cbiIsCi0JCQkJCQlfX2Z1bmNfXywgdG1wX3BvcnQsIHBvcnRfaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCQlyZXR1cm4gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJfQotCX0KLQlhdG9taWNfaW5jKCZ0aGlzX2FkbS5jb3BwLmNudFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlyZXR1cm4gY29wcF9pZHg7Ci19Ci0KLXZvaWQgYWRtX2NvcHBfbWZjX2NmZyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgZHN0X3NhbXBsZV9yYXRlKQotewotCXN0cnVjdCBhdWRwcm9jX21mY19vdXRwdXRfbWVkaWFfZm10IG1mY19jZmc7Ci0Jc3RydWN0IGFkbV9jbWRfZGV2aWNlX29wZW5fdjUgb3BlbjsKLQlpbnQgcG9ydF9pZHg7Ci0JaW50IHN6ID0gMDsKLQlpbnQgcmMgID0gMDsKLQlpbnQgaSAgPSAwOwotCi0JcG9ydF9pZCA9IHE2YXVkaW9fY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0KLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXVkcHJvY19tZmNfb3V0cHV0X21lZGlhX2ZtdCk7Ci0KLQltZmNfY2ZnLnBhcmFtcy5oZHIuaGRyX2ZpZWxkID0KLQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQltZmNfY2ZnLnBhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKLQltZmNfY2ZnLnBhcmFtcy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCW1mY19jZmcucGFyYW1zLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCW1mY19jZmcucGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCW1mY19jZmcucGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQltZmNfY2ZnLnBhcmFtcy5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OwotCW1mY19jZmcucGFyYW1zLnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCW1mY19jZmcucGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCW1mY19jZmcucGFyYW1zLm1lbV9tYXBfaGFuZGxlID0gMDsKLQltZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX3NpemUgPSBzaXplb2YobWZjX2NmZykgLQotCQkJCXNpemVvZihtZmNfY2ZnLnBhcmFtcyk7Ci0JbWZjX2NmZy5kYXRhLm1vZHVsZV9pZCA9IEFVRFBST0NfTU9EVUxFX0lEX01GQzsKLQltZmNfY2ZnLmRhdGEucGFyYW1faWQgPQotCQkJQVVEUFJPQ19QQVJBTV9JRF9NRkNfT1VUUFVUX01FRElBX0ZPUk1BVDsKLQltZmNfY2ZnLmRhdGEucGFyYW1fc2l6ZSA9IG1mY19jZmcucGFyYW1zLnBheWxvYWRfc2l6ZSAtCi0JCQkJc2l6ZW9mKG1mY19jZmcuZGF0YSk7Ci0JbWZjX2NmZy5kYXRhLnJlc2VydmVkID0gMDsKLQltZmNfY2ZnLnNhbXBsaW5nX3JhdGUgPSBkc3Rfc2FtcGxlX3JhdGU7Ci0JbWZjX2NmZy5iaXRzX3Blcl9zYW1wbGUgPQotCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5iaXRfd2lkdGhbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0Jb3Blbi5kZXZfbnVtX2NoYW5uZWwgPSBtZmNfY2ZnLm51bV9jaGFubmVscyA9Ci0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmNoYW5uZWxzW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCi0JcmMgPSBhZG1fYXJyYW5nZV9tY2hfbWFwKCZvcGVuLCBBRE1fUEFUSF9QTEFZQkFDSywKLQkJbWZjX2NmZy5udW1fY2hhbm5lbHMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGdldCBjaGFubmFsIG1hcFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBtZmNfY2ZnLm51bV9jaGFubmVsczsgaSsrKQotCQltZmNfY2ZnLmNoYW5uZWxfdHlwZVtpXSA9Ci0JCQkodWludDE2X3QpIG9wZW4uZGV2X2NoYW5uZWxfbWFwcGluZ1tpXTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1mYyBjb25maWc6IHBvcnRfaWR4ICVkIGNvcHBfaWR4ICAlZCBjb3BwIFNSICVkIGNvcHAgQlcgJWQgY29wcCBjaGFuICVkIG8vcCBTUiAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkeCwgY29wcF9pZHgsCi0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5yYXRlW3BvcnRfaWR4XVtjb3BwX2lkeF0pLAotCQkJbWZjX2NmZy5iaXRzX3Blcl9zYW1wbGUsIG1mY19jZmcubnVtX2NoYW5uZWxzLAotCQkJbWZjX2NmZy5zYW1wbGluZ19yYXRlKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJm1mY19jZmcpOwotCi0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0X2lkOiBmb3JbMHgleF0gZmFpbGVkICVkXG4iLAotCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgd2l0aCBjb3BwIGlkICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogbWZjX2NmZyBTZXQgcGFyYW1zIHRpbWVkIG91dCBmb3IgcG9ydF9pZDogZm9yIFsweCV4XVxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHJvdXRlX3NldF9vcGNvZGVfbWF0cml4X2lkKAotCQkJc3RydWN0IGFkbV9jbWRfbWF0cml4X21hcF9yb3V0aW5nc192NSAqKnJvdXRlX2FkZHIsCi0JCQlpbnQgcGF0aCwgdWludDMyX3QgcGFzc3Rocl9tb2RlKQotewotCXN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUgKnJvdXRlID0gKnJvdXRlX2FkZHI7Ci0KLQlzd2l0Y2ggKHBhdGgpIHsKLQljYXNlIEFETV9QQVRIX1BMQVlCQUNLOgotCQlyb3V0ZS0+aGRyLm9wY29kZSA9IEFETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNTsKLQkJcm91dGUtPm1hdHJpeF9pZCA9IEFETV9NQVRSSVhfSURfQVVESU9fUlg7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1BBVEhfTElWRV9SRUM6Ci0JCWlmIChwYXNzdGhyX21vZGUgPT0gTElTVEVOKSB7Ci0JCQlyb3V0ZS0+aGRyLm9wY29kZSA9Ci0JCQkJQURNX0NNRF9TVFJFQU1fREVWSUNFX01BUF9ST1VUSU5HU19WNTsKLQkJCXJvdXRlLT5tYXRyaXhfaWQgPSBBRE1fTUFUUklYX0lEX0xJU1RFTl9UWDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCB0byBzZXQgbWF0cml4IGlkIGZvciBub24tbGlzdGVuIGNhc2UgKi8KLQljYXNlIEFETV9QQVRIX05PTkxJVkVfUkVDOgotCQlyb3V0ZS0+aGRyLm9wY29kZSA9IEFETV9DTURfTUFUUklYX01BUF9ST1VUSU5HU19WNTsKLQkJcm91dGUtPm1hdHJpeF9pZCA9IEFETV9NQVRSSVhfSURfQVVESU9fVFg7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1BBVEhfQ09NUFJFU1NFRF9SWDoKLQkJcm91dGUtPmhkci5vcGNvZGUgPSBBRE1fQ01EX1NUUkVBTV9ERVZJQ0VfTUFQX1JPVVRJTkdTX1Y1OwotCQlyb3V0ZS0+bWF0cml4X2lkID0gQURNX01BVFJJWF9JRF9DT01QUkVTU0VEX0FVRElPX1JYOwotCQlicmVhazsKLQljYXNlIEFETV9QQVRIX0NPTVBSRVNTRURfVFg6Ci0JCXJvdXRlLT5oZHIub3Bjb2RlID0gQURNX0NNRF9TVFJFQU1fREVWSUNFX01BUF9ST1VUSU5HU19WNTsKLQkJcm91dGUtPm1hdHJpeF9pZCA9IEFETV9NQVRSSVhfSURfQ09NUFJFU1NFRF9BVURJT19UWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogV3JvbmcgcGF0aCBzZXRbJWRdXG4iLCBfX2Z1bmNfXywgcGF0aCk7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IG9wY29kZSAweCV4LCBtYXRyaXggaWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgcm91dGUtPmhkci5vcGNvZGUsIHJvdXRlLT5tYXRyaXhfaWQpOwotfQotCi1pbnQgYWRtX21hdHJpeF9tYXAoaW50IHBhdGgsIHN0cnVjdCByb3V0ZV9wYXlsb2FkIHBheWxvYWRfbWFwLCBpbnQgcGVyZl9tb2RlLAotCQkJdWludDMyX3QgcGFzc3Rocl9tb2RlKQotewotCXN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUJKnJvdXRlOwotCXN0cnVjdCBhZG1fc2Vzc2lvbl9tYXBfbm9kZV92NSAqbm9kZTsKLQl1aW50MTZfdCAqY29wcHNfbGlzdDsKLQlpbnQgY21kX3NpemUgPSAwOwotCWludCByZXQgPSAwLCBpID0gMDsKLQl2b2lkICpwYXlsb2FkID0gTlVMTDsKLQl2b2lkICptYXRyaXhfbWFwID0gTlVMTDsKLQlpbnQgcG9ydF9pZHgsIGNvcHBfaWR4OwotCi0JLyogQXNzdW1lcyBwb3J0X2lkcyBoYXZlIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgZHVyaW5nIGFkbV9vcGVuICovCi0JY21kX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUpICsKLQkJCXNpemVvZihzdHJ1Y3QgYWRtX3Nlc3Npb25fbWFwX25vZGVfdjUpICsKLQkJCShzaXplb2YodWludDMyX3QpICogcGF5bG9hZF9tYXAubnVtX2NvcHBzKSk7Ci0JbWF0cml4X21hcCA9IGt6YWxsb2MoY21kX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChtYXRyaXhfbWFwID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTWVtIGFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyb3V0ZSA9IChzdHJ1Y3QgYWRtX2NtZF9tYXRyaXhfbWFwX3JvdXRpbmdzX3Y1ICopbWF0cml4X21hcDsKLQotCXJvdXRlLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0Jcm91dGUtPmhkci5wa3Rfc2l6ZSA9IGNtZF9zaXplOwotCXJvdXRlLT5oZHIuc3JjX3N2YyA9IDA7Ci0Jcm91dGUtPmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCXJvdXRlLT5oZHIuc3JjX3BvcnQgPSAwOyAvKiBJZ25vcmVkICovOwotCXJvdXRlLT5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlyb3V0ZS0+aGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCXJvdXRlLT5oZHIuZGVzdF9wb3J0ID0gMDsgLyogSWdub3JlZCAqLzsKLQlyb3V0ZS0+aGRyLnRva2VuID0gMDsKLQlyb3V0ZS0+bnVtX3Nlc3Npb25zID0gMTsKLQlyb3V0ZV9zZXRfb3Bjb2RlX21hdHJpeF9pZCgmcm91dGUsIHBhdGgsIHBhc3N0aHJfbW9kZSk7Ci0KLQlwYXlsb2FkID0gKCh1OCAqKW1hdHJpeF9tYXAgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fY21kX21hdHJpeF9tYXBfcm91dGluZ3NfdjUpKTsKLQlub2RlID0gKHN0cnVjdCBhZG1fc2Vzc2lvbl9tYXBfbm9kZV92NSAqKXBheWxvYWQ7Ci0KLQlub2RlLT5zZXNzaW9uX2lkID0gcGF5bG9hZF9tYXAuc2Vzc2lvbl9pZDsKLQlub2RlLT5udW1fY29wcHMgPSBwYXlsb2FkX21hcC5udW1fY29wcHM7Ci0JcGF5bG9hZCA9ICh1OCAqKW5vZGUgKyBzaXplb2Yoc3RydWN0IGFkbV9zZXNzaW9uX21hcF9ub2RlX3Y1KTsKLQljb3Bwc19saXN0ID0gKHVpbnQxNl90ICopcGF5bG9hZDsKLQlmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZF9tYXAubnVtX2NvcHBzOyBpKyspIHsKLQkJcG9ydF9pZHggPQotCQlhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBheWxvYWRfbWFwLnBvcnRfaWRbaV0pOwotCQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwgX19mdW5jX18sCi0JCQkJcGF5bG9hZF9tYXAucG9ydF9pZFtpXSk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCQljb3BwX2lkeCA9IHBheWxvYWRfbWFwLmNvcHBfaWR4W2ldOwotCQljb3Bwc19saXN0W2ldID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdCi0JCQkJCQkJICAgICBbY29wcF9pZHhdKTsKLQl9Ci0JYXRvbWljX3NldCgmdGhpc19hZG0ubWF0cml4X21hcF9zdGF0LCAtMSk7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKiltYXRyaXhfbWFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiByb3V0aW5nIGZvciBzeXJlYW0gJWQgZmFpbGVkIHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkX21hcC5zZXNzaW9uX2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0ubWF0cml4X21hcF93YWl0LAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3N0YXQpID49IDAsCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogcm91dGluZyBmb3Igc3lyZWFtICVkIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQlwYXlsb2FkX21hcC5zZXNzaW9uX2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tYXRyaXhfbWFwX3N0YXQpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLCBfX2Z1bmNfXywKLQkJCWFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAotCQkJJnRoaXNfYWRtLm1hdHJpeF9tYXBfc3RhdCkpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0ubWF0cml4X21hcF9zdGF0KSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaWYgKChwZXJmX21vZGUgIT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpICYmCi0JCSAocGF0aCAhPSBBRE1fUEFUSF9DT01QUkVTU0VEX1JYKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgcGF5bG9hZF9tYXAubnVtX2NvcHBzOyBpKyspIHsKLQkJCXBvcnRfaWR4ID0gYWZlX2dldF9wb3J0X2luZGV4KHBheWxvYWRfbWFwLnBvcnRfaWRbaV0pOwotCQkJY29wcF9pZHggPSBwYXlsb2FkX21hcC5jb3BwX2lkeFtpXTsKLQkJCWlmIChwb3J0X2lkeCA8IDAgfHwgY29wcF9pZHggPCAwIHx8Ci0JCQkgICAgKGNvcHBfaWR4ID4gTUFYX0NPUFBTX1BFUl9QT1JUIC0gMSkpIHsKLQkJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGlkeCBwb3J0X2lkeCAlZCBjb3BwX2lkeCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHBvcnRfaWR4LCBjb3BwX2lkeCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlydGFjX2FkZF9hZG1fZGV2aWNlKHBheWxvYWRfbWFwLnBvcnRfaWRbaV0sCi0JCQkJCSAgICBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZAotCQkJCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSwKLQkJCQkJICAgIGdldF9jYWxfcGF0aChwYXRoKSwKLQkJCQkJICAgIHBheWxvYWRfbWFwLnNlc3Npb25faWQsCi0JCQkJCSAgICBwYXlsb2FkX21hcC5hcHBfdHlwZVtpXSwKLQkJCQkJICAgIHBheWxvYWRfbWFwLmFjZGJfZGV2X2lkW2ldKTsKLQotCQkJaWYgKCF0ZXN0X2JpdChBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVELAotCQkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1twb3J0X2lkeF0KLQkJCQkJCQkJW2NvcHBfaWR4XSkpIHsKLQkJCQlwcl9kZWJ1ZygiJXM6IGFkbSBjb3BwWzB4JXhdWyVkXSBhbHJlYWR5IHNlbnQiLAotCQkJCQkJX19mdW5jX18sIHBvcnRfaWR4LCBjb3BwX2lkeCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzZW5kX2FkbV9jYWwocGF5bG9hZF9tYXAucG9ydF9pZFtpXSwgY29wcF9pZHgsCi0JCQkJICAgICBnZXRfY2FsX3BhdGgocGF0aCksIHBlcmZfbW9kZSwKLQkJCQkgICAgIHBheWxvYWRfbWFwLmFwcF90eXBlW2ldLAotCQkJCSAgICAgcGF5bG9hZF9tYXAuYWNkYl9kZXZfaWRbaV0sCi0JCQkJICAgICBwYXlsb2FkX21hcC5zYW1wbGVfcmF0ZVtpXSk7Ci0JCQkvKiBBRE0gQ09QUCBjYWxpYnJhdGlvbiBpcyBhbHJlYWR5IHNlbnQgKi8KLQkJCWNsZWFyX2JpdChBRE1fU1RBVFVTX0NBTElCUkFUSU9OX1JFUVVJUkVELAotCQkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuCi0JCQkJYWRtX3N0YXR1c1twb3J0X2lkeF1bY29wcF9pZHhdKTsKLQkJCXByX2RlYnVnKCIlczogY29wcF9pZDogJWRcbiIsIF9fZnVuY19fLAotCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF0KLQkJCQkJCQkgICAgICBbY29wcF9pZHhdKSk7Ci0JCX0KLQl9Ci0KLWZhaWxfY21kOgotCWtmcmVlKG1hdHJpeF9tYXApOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYWRtX2VjX3JlZl9yeF9pZChpbnQgcG9ydF9pZCkKLXsKLQl0aGlzX2FkbS5lY19yZWZfcnggPSBwb3J0X2lkOwotCXByX2RlYnVnKCIlczogZWNfcmVmX3J4OiVkXG4iLCBfX2Z1bmNfXywgdGhpc19hZG0uZWNfcmVmX3J4KTsKLX0KLQotdm9pZCBhZG1fbnVtX2VjX3JlZl9yeF9jaGFucyhpbnQgbnVtX2NoYW5zKQotewotCXRoaXNfYWRtLm51bV9lY19yZWZfcnhfY2hhbnMgPSBudW1fY2hhbnM7Ci0JcHJfZGVidWcoIiVzOiBudW1fZWNfcmVmX3J4X2NoYW5zOiVkXG4iLAotCQlfX2Z1bmNfXywgdGhpc19hZG0ubnVtX2VjX3JlZl9yeF9jaGFucyk7Ci19Ci0KLXZvaWQgYWRtX2VjX3JlZl9yeF9iaXRfd2lkdGgoaW50IGJpdF93aWR0aCkKLXsKLQl0aGlzX2FkbS5lY19yZWZfcnhfYml0X3dpZHRoID0gYml0X3dpZHRoOwotCXByX2RlYnVnKCIlczogZWNfcmVmX3J4X2JpdF93aWR0aDolZFxuIiwKLQkJX19mdW5jX18sIHRoaXNfYWRtLmVjX3JlZl9yeF9iaXRfd2lkdGgpOwotfQotCi12b2lkIGFkbV9lY19yZWZfcnhfc2FtcGxpbmdfcmF0ZShpbnQgc2FtcGxpbmdfcmF0ZSkKLXsKLQl0aGlzX2FkbS5lY19yZWZfcnhfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7Ci0JcHJfZGVidWcoIiVzOiBlY19yZWZfcnhfc2FtcGxpbmdfcmF0ZTolZFxuIiwKLQkJX19mdW5jX18sIHRoaXNfYWRtLmVjX3JlZl9yeF9zYW1wbGluZ19yYXRlKTsKLX0KLQotaW50IGFkbV9jbG9zZShpbnQgcG9ydF9pZCwgaW50IHBlcmZfbW9kZSwgaW50IGNvcHBfaWR4KQotewotCXN0cnVjdCBhcHJfaGRyIGNsb3NlOwotCi0JaW50IHJldCA9IDAsIHBvcnRfaWR4OwotCWludCBjb3BwX2lkID0gUkVTRVRfQ09QUF9JRDsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZD0weCV4IHBlcmZfbW9kZTogJWQgY29wcF9pZHg6ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHBvcnRfaWQsIHBlcmZfbW9kZSwgY29wcF9pZHgpOwotCi0JcG9ydF9pZCA9IHE2YXVkaW9fY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKChjb3BwX2lkeCA8IDApIHx8IChjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcCBpZHg6ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodGhpc19hZG0uY29wcC5hZG1fZGVsYXlbcG9ydF9pZHhdW2NvcHBfaWR4XSAmJiBwZXJmX21vZGUKLQkJPT0gTEVHQUNZX1BDTV9NT0RFKSB7Ci0JCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3N0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCSAgIDEpOwotCQl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtwb3J0X2lkeF1bY29wcF9pZHhdID0gMDsKLQkJd2FrZV91cCgmdGhpc19hZG0uY29wcC5hZG1fZGVsYXlfd2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQl9Ci0KLQlhdG9taWNfZGVjKCZ0aGlzX2FkbS5jb3BwLmNudFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlpZiAoIShhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5jbnRbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKSB7Ci0JCWNvcHBfaWQgPSBhZG1fZ2V0X2NvcHBfaWQocG9ydF9pZHgsIGNvcHBfaWR4KTsKLQkJcHJfZGVidWcoIiVzOiBDbG9zaW5nIEFETSBwb3J0X2lkeDolZCBjb3BwX2lkeDolZCBjb3BwX2lkOjB4JXhcbiIsCi0JCQkgX19mdW5jX18sIHBvcnRfaWR4LCBjb3BwX2lkeCwgY29wcF9pZCk7Ci0JCWlmICgoIXBlcmZfbW9kZSkgJiYgKHRoaXNfYWRtLm91dGJhbmRfbWVtbWFwLnBhZGRyICE9IDApICYmCi0JCSAgICAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPT0KLQkJCVNSU19UUlVNRURJQV9UT1BPTE9HWV9JRCkpIHsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgsCi0JCQkJQURNX1NSU19UUlVNRURJQSk7Ci0JCQlyZXQgPSBhZG1fbWVtb3J5X3VubWFwX3JlZ2lvbnMoKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogYWRtIG1lbSB1bm1tYXAgZXJyICVkIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQl9IGVsc2UgewotCQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaGFuZGxlcwotCQkJCQkgICBbQURNX1NSU19UUlVNRURJQV0sIDApOwotCQkJfQotCQl9Ci0KLQotCQlpZiAoKGFmZV9nZXRfcG9ydF90eXBlKHBvcnRfaWQpID09IE1TTV9BRkVfUE9SVF9UWVBFX1RYKSAmJgotCQkgICAgdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkcikgewotCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwKLQkJCQkgICBBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkcpOwotCQkJcmV0ID0gYWRtX21lbW9yeV91bm1hcF9yZWdpb25zKCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IGFkbSBtZW0gdW5tbWFwIGVyciAlZCIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQkJfQotCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAotCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAotCQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlKTsKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50ID0gTlVMTDsKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlID0gTlVMTDsKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7Ci0JCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciA9IE5VTEw7Ci0JCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyID0gMDsKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cyA9IC0xOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzWwotCQkJCQlBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddLCAwKTsKLQkJfQotCi0JCWNsb3NlLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCQljbG9zZS5wa3Rfc2l6ZSA9IHNpemVvZihjbG9zZSk7Ci0JCWNsb3NlLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQkJY2xvc2Uuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQkJY2xvc2Uuc3JjX3BvcnQgPSBwb3J0X2lkOwotCQljbG9zZS5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCQljbG9zZS5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQkJY2xvc2UuZGVzdF9wb3J0ID0gY29wcF9pZDsKLQkJY2xvc2UudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCQljbG9zZS5vcGNvZGUgPSBBRE1fQ01EX0RFVklDRV9DTE9TRV9WNTsKLQotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCQkgICBSRVNFVF9DT1BQX0lEKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5jbnRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7Ci0JCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAudG9wb2xvZ3lbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7Ci0JCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAubW9kZVtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5yYXRlW3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNoYW5uZWxzW3BvcnRfaWR4XVtjb3BwX2lkeF0sIDApOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmJpdF93aWR0aFtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hcHBfdHlwZVtwb3J0X2lkeF1bY29wcF9pZHhdLCAwKTsKLQotCQljbGVhcl9iaXQoQURNX1NUQVRVU19DQUxJQlJBVElPTl9SRVFVSVJFRCwKLQkJCSh2b2lkICopJnRoaXNfYWRtLmNvcHAuYWRtX3N0YXR1c1twb3J0X2lkeF1bY29wcF9pZHhdKTsKLQotCQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmY2xvc2UpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogQURNIGNsb3NlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBBRE0gY21kIFJvdXRlIHRpbWVkb3V0IGZvciBwb3J0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCQlyZXR1cm4gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJfQotCX0KLQotCWlmIChwZXJmX21vZGUgIT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpIHsKLQkJcHJfZGVidWcoIiVzOiByZW1vdmUgYWRtIGRldmljZSBmcm9tIHJ0YWNcbiIsIF9fZnVuY19fKTsKLQkJcnRhY19yZW1vdmVfYWRtX2RldmljZShwb3J0X2lkLCBjb3BwX2lkKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzZW5kX3J0YWNfYXVkdm9sX2NhbCh2b2lkKQotewotCWludCByZXQgPSAwOwotCWludCByZXQyID0gMDsKLQlpbnQgaSA9IDA7Ci0JaW50IGNvcHBfaWR4LCBwb3J0X2lkeCwgYWNkYl9pZCwgYXBwX2lkLCBwYXRoOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXVkdm9sICphdWR2b2xfY2FsX2luZm8gPSBOVUxMOwotCXN0cnVjdCBydGFjX2FkbSBydGFjX2FkbV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbQURNX1JUQUNfQVVEVk9MX0NBTF0tPmxvY2spOwotCi0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJdGhpc19hZG0uY2FsX2RhdGFbQURNX1JUQUNfQVVEVk9MX0NBTF0pOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYW4ndCBmaW5kIGNhbCBibG9jayFcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JYXVkdm9sX2NhbF9pbmZvID0gY2FsX2Jsb2NrLT5jYWxfaW5mbzsKLQlpZiAoYXVkdm9sX2NhbF9pbmZvID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYXVkdm9sX2NhbF9pbmZvIGlzIE5VTEwhXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWdldF9ydGFjX2FkbV9kYXRhKCZydGFjX2FkbV9kYXRhKTsKLQlmb3IgKDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7Ci0KLQkJYWNkYl9pZCA9IHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFjZGJfZGV2X2lkOwotCQlpZiAoYWNkYl9pZCA9PSAwKQotCQkJYWNkYl9pZCA9IGF1ZHZvbF9jYWxfaW5mby0+YWNkYl9pZDsKLQotCQlhcHBfaWQgPSBydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hcHBfdHlwZTsKLQkJaWYgKGFwcF9pZCA9PSAwKQotCQkJYXBwX2lkID0gYXVkdm9sX2NhbF9pbmZvLT5hcHBfdHlwZTsKLQotCQlwYXRoID0gYWZlX2dldF9wb3J0X3R5cGUocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQpOwotCQlpZiAoKGFjZGJfaWQgPT0gYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkKSAmJgotCQkJKGFwcF9pZCA9PSBhdWR2b2xfY2FsX2luZm8tPmFwcF90eXBlKSAmJgotCQkJKHBhdGggPT0gYXVkdm9sX2NhbF9pbmZvLT5wYXRoKSkgewotCi0JCQlpZiAoYWRtX2dldF9pbmRleGVzX2Zyb21fY29wcF9pZChydGFjX2FkbV9kYXRhLgotCQkJCWRldmljZVtpXS5jb3BwLCAmY29wcF9pZHgsICZwb3J0X2lkeCkgIT0gMCkgewotCQkJCXByX2RlYnVnKCIlczogQ29wcCBJZCAlZCBpcyBub3QgYWN0aXZlXG4iLAotCQkJCQlfX2Z1bmNfXywKLQkJCQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uY29wcCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXJldDIgPSBhZG1fcmVtYXBfYW5kX3NlbmRfY2FsX2Jsb2NrKEFETV9SVEFDX0FVRFZPTF9DQUwsCi0JCQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQsCi0JCQkJY29wcF9pZHgsIGNhbF9ibG9jaywKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC4KLQkJCQltb2RlW3BvcnRfaWR4XVtjb3BwX2lkeF0pLAotCQkJCWF1ZHZvbF9jYWxfaW5mby0+YXBwX3R5cGUsCi0JCQkJYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkLAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLgotCQkJCXJhdGVbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOwotCQkJaWYgKHJldDIgPCAwKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiByZW1hcCBhbmQgc2VuZCBmYWlsZWQgZm9yIGNvcHAgSWQgJWQsIGFjZGIgaWQgJWQsIGFwcCB0eXBlICVkLCBwYXRoICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uY29wcCwKLQkJCQkJYXVkdm9sX2NhbF9pbmZvLT5hY2RiX2lkLAotCQkJCQlhdWR2b2xfY2FsX2luZm8tPmFwcF90eXBlLAotCQkJCQlhdWR2b2xfY2FsX2luZm8tPnBhdGgpOwotCQkJCXJldCA9IHJldDI7Ci0JCQl9Ci0JCX0KLQl9Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YVtBRE1fUlRBQ19BVURWT0xfQ0FMXS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFkbV9tYXBfcnRhY19ibG9jayhzdHJ1Y3QgcnRhY19jYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXN1bHQgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBObyBhZGRyZXNzIHRvIG1hcCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogbWFwIHNpemUgaXMgMCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiB2YWxpZCBwb3J0IElEIG5lZWRlZCBmb3IgY2FsbGJhY2sgdXNlIHByaW1hcnkgSTJTICovCi0JYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9pbmRleCwgQURNX1JUQUNfQVBSX0NBTCk7Ci0JcmVzdWx0ID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwgMCwKLQkJCQkJJmNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIDEpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByX2VycigiJXM6IFJUQUMgbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlZCByZXN1bHQgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJlc3VsdCk7Ci0JCXByX2RlYnVnKCIlczogUlRBQyBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgKLQkJJnRoaXNfYWRtLm1lbV9tYXBfaGFuZGxlc1tBRE1fUlRBQ19BUFJfQ0FMXSk7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBhZG1fdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAobWVtX21hcF9oYW5kbGUgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgqbWVtX21hcF9oYW5kbGUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgMCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgqbWVtX21hcF9oYW5kbGUgIT0gYXRvbWljX3JlYWQoCi0JCQkmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW0FETV9SVEFDX0FQUl9DQUxdKSkgewotCQlwcl9lcnIoIiVzOiBNYXAgaGFuZGxlcyBkbyBub3QgbWF0Y2ghIFVubWFwcGluZyBSVEFDLCBSVEFDIG1hcCAweCV4LCBBRE0gbWFwIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgKm1lbV9tYXBfaGFuZGxlLCBhdG9taWNfcmVhZCgKLQkJCSZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbQURNX1JUQUNfQVBSX0NBTF0pKTsKLQotCQkvKiBpZiBtaXNtYXRjaCB1c2UgaGFuZGxlIHBhc3NlZCBpbiB0byB1bm1hcCAqLwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbQURNX1JUQUNfQVBSX0NBTF0sCi0JCQkgICAqbWVtX21hcF9oYW5kbGUpOwotCX0KLQotCS8qIHZhbGlkIHBvcnQgSUQgbmVlZGVkIGZvciBjYWxsYmFjayB1c2UgcHJpbWFyeSBJMlMgKi8KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBBRE1fUlRBQ19BUFJfQ0FMKTsKLQlyZXN1bHQgPSBhZG1fbWVtb3J5X3VubWFwX3JlZ2lvbnMoKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9kZWJ1ZygiJXM6IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyBmYWlsZWQsIGVycm9yICVkXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JfSBlbHNlIHsKLQkJYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW0FETV9SVEFDX0FQUl9DQUxdLCAwKTsKLQkJKm1lbV9tYXBfaGFuZGxlID0gMDsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBBRE1fQVVEUFJPQ19DQUxfVFlQRToKLQkJcmV0ID0gQURNX0FVRFBST0NfQ0FMOwotCQlicmVhazsKLQljYXNlIEFETV9BVURWT0xfQ0FMX1RZUEU6Ci0JCXJldCA9IEFETV9BVURWT0xfQ0FMOwotCQlicmVhazsKLQljYXNlIEFETV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFOgotCQlyZXQgPSBBRE1fQ1VTVE9NX1RPUF9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1JUQUNfSU5GT19DQUxfVFlQRToKLQkJcmV0ID0gQURNX1JUQUNfSU5GT19DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQURNX1JUQUNfQVBSX0NBTF9UWVBFOgotCQlyZXQgPSBBRE1fUlRBQ19BUFJfQ0FMOwotCQlicmVhazsKLQljYXNlIEFETV9SVEFDX0FVRFZPTF9DQUxfVFlQRToKLQkJcmV0ID0gQURNX1JUQUNfQVVEVk9MX0NBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZCFcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX2FsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZG1fZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19kZWFsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19kZWFsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkbV9zZXRfY2FsKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCXRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9pbmRleCA9PSBBRE1fQ1VTVE9NX1RPUF9DQUwpIHsKLQkJbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbQURNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7Ci0JCXRoaXNfYWRtLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOwotCQltdXRleF91bmxvY2soJnRoaXNfYWRtLmNhbF9kYXRhW0FETV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOwotCX0gZWxzZSBpZiAoY2FsX2luZGV4ID09IEFETV9SVEFDX0FVRFZPTF9DQUwpIHsKLQkJc2VuZF9ydGFjX2F1ZHZvbF9jYWwoKTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX21hcF9jYWxfZGF0YShpbnQzMl90IGNhbF90eXBlLAotCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOwotCXJldCA9IGFkbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsIDAsCi0JCSh1aW50MzJfdCAqKSZjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCAxKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtYXAgZGlkIG5vdCB3b3JrISBjYWxfdHlwZSAlaSByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4LCByZXQpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7Ci0JfQotCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLgotCQltZW1fbWFwX2hhbmRsZXNbY2FsX2luZGV4XSk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRtX3VubWFwX2NhbF9kYXRhKGludDMyX3QgY2FsX3R5cGUsCi0JCQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYWwgYmxvY2sgaXMgTlVMTCFcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCi0JCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXRvbWljX3NldCgmdGhpc19hZG0ubWVtX21hcF9oYW5kbGVzW2NhbF9pbmRleF0sCi0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2luZGV4LCBjYWxfaW5kZXgpOwotCXJldCA9IGFkbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgY2FsX3R5cGUgJWkgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcmV0KTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkbV9kZWxldGVfY2FsX2RhdGEodm9pZCkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoQURNX01BWF9DQUxfVFlQRVMsIHRoaXNfYWRtLmNhbF9kYXRhKTsKLX0KLQotc3RhdGljIGludCBhZG1faW5pdF9jYWxfZGF0YSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjYWxfdHlwZV9pbmZvCWNhbF90eXBlX2luZm9bXSA9IHsKLQkJe3tBRE1fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRSwKLQkJe2FkbV9hbGxvY19jYWwsIGFkbV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJYWRtX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXthZG1fbWFwX2NhbF9kYXRhLCBhZG1fdW5tYXBfY2FsX2RhdGEsCi0JCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QURNX0FVRFBST0NfQ0FMX1RZUEUsCi0JCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCi0JCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAotCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FETV9BVURWT0xfQ0FMX1RZUEUsCi0JCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCi0JCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAotCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FETV9SVEFDX0lORk9fQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tBRE1fUlRBQ19BUFJfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tTUlNfVFJVTUVESUFfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tBRE1fUlRBQ19BVURWT0xfQ0FMX1RZUEUsCi0JCXthZG1fYWxsb2NfY2FsLCBhZG1fZGVhbGxvY19jYWwsIE5VTEwsCi0JCWFkbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7YWRtX21hcF9jYWxfZGF0YSwgYWRtX3VubWFwX2NhbF9kYXRhLAotCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQl9OwotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKEFETV9NQVhfQ0FMX1RZUEVTLCB0aGlzX2FkbS5jYWxfZGF0YSwKLQkJY2FsX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSEgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiByZXQ7Ci1lcnI6Ci0JYWRtX2RlbGV0ZV9jYWxfZGF0YSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZG1fc2V0X3ZvbHVtZShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgdm9sdW1lKQotewotCXN0cnVjdCBhdWRwcm9jX3ZvbHVtZV9jdHJsX21hc3Rlcl9nYWluIGF1ZHByb2Nfdm9sOwotCWludCBzeiA9IDA7Ci0JaW50IHJjICA9IDA7Ci0JaW50IHBvcnRfaWR4OwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkICVkLCB2b2x1bWUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCB2b2x1bWUpOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGF1ZHByb2Nfdm9sdW1lX2N0cmxfbWFzdGVyX2dhaW4pOwotCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JYXVkcHJvY192b2wucGFyYW1zLmhkci5wa3Rfc2l6ZSA9IHN6OwotCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWF1ZHByb2Nfdm9sLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYXVkcHJvY192b2wucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLmRlc3RfcG9ydCA9Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQlhdWRwcm9jX3ZvbC5wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCWF1ZHByb2Nfdm9sLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfc2l6ZSA9IHNpemVvZihhdWRwcm9jX3ZvbCkgLQotCQkJCXNpemVvZihhdWRwcm9jX3ZvbC5wYXJhbXMpOwotCWF1ZHByb2Nfdm9sLmRhdGEubW9kdWxlX2lkID0gQVVEUFJPQ19NT0RVTEVfSURfVk9MX0NUUkw7Ci0JYXVkcHJvY192b2wuZGF0YS5wYXJhbV9pZCA9IEFVRFBST0NfUEFSQU1fSURfVk9MX0NUUkxfTUFTVEVSX0dBSU47Ci0JYXVkcHJvY192b2wuZGF0YS5wYXJhbV9zaXplID0gYXVkcHJvY192b2wucGFyYW1zLnBheWxvYWRfc2l6ZSAtCi0JCQkJCQlzaXplb2YoYXVkcHJvY192b2wuZGF0YSk7Ci0JYXVkcHJvY192b2wuZGF0YS5yZXNlcnZlZCA9IDA7Ci0JYXVkcHJvY192b2wubWFzdGVyX2dhaW4gPSB2b2x1bWU7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmF1ZHByb2Nfdm9sKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgZmFpbGVkIHBvcnQgPSAlI3hcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiBWb2wgY250cmwgU2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICUjeFxuIiwKLQkJCSBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYWRtX3NldF9zb2Z0dm9sdW1lKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQlzdHJ1Y3QgYXVkcHJvY19zb2Z0dm9sdW1lX3BhcmFtcyAqc29mdHZvbF9wYXJhbSkKLXsKLQlzdHJ1Y3QgYXVkcHJvY19zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyBhdWRwcm9jX3NvZnR2b2w7Ci0JaW50IHN6ID0gMDsKLQlpbnQgcmMgID0gMDsKLQlpbnQgcG9ydF9pZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBlcmlvZCAlZCBzdGVwICVkIGN1cnZlICVkXG4iLCBfX2Z1bmNfXywKLQkJIHNvZnR2b2xfcGFyYW0tPnBlcmlvZCwgc29mdHZvbF9wYXJhbS0+c3RlcCwKLQkJIHNvZnR2b2xfcGFyYW0tPnJhbXBpbmdjdXJ2ZSk7Ci0KLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhdWRwcm9jX3NvZnRfc3RlcF92b2x1bWVfcGFyYW1zKTsKLQotCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKLQlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQlhdWRwcm9jX3NvZnR2b2wucGFyYW1zLnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCWF1ZHByb2Nfc29mdHZvbC5wYXJhbXMucGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5wYXlsb2FkX3NpemUgPSBzaXplb2YoYXVkcHJvY19zb2Z0dm9sKSAtCi0JCQkJc2l6ZW9mKGF1ZHByb2Nfc29mdHZvbC5wYXJhbXMpOwotCWF1ZHByb2Nfc29mdHZvbC5kYXRhLm1vZHVsZV9pZCA9IEFVRFBST0NfTU9EVUxFX0lEX1ZPTF9DVFJMOwotCWF1ZHByb2Nfc29mdHZvbC5kYXRhLnBhcmFtX2lkID0KLQkJCUFVRFBST0NfUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUzsKLQlhdWRwcm9jX3NvZnR2b2wuZGF0YS5wYXJhbV9zaXplID0gYXVkcHJvY19zb2Z0dm9sLnBhcmFtcy5wYXlsb2FkX3NpemUgLQotCQkJCXNpemVvZihhdWRwcm9jX3NvZnR2b2wuZGF0YSk7Ci0JYXVkcHJvY19zb2Z0dm9sLmRhdGEucmVzZXJ2ZWQgPSAwOwotCWF1ZHByb2Nfc29mdHZvbC5wZXJpb2QgPSBzb2Z0dm9sX3BhcmFtLT5wZXJpb2Q7Ci0JYXVkcHJvY19zb2Z0dm9sLnN0ZXAgPSBzb2Z0dm9sX3BhcmFtLT5zdGVwOwotCWF1ZHByb2Nfc29mdHZvbC5yYW1waW5nX2N1cnZlID0gc29mdHZvbF9wYXJhbS0+cmFtcGluZ2N1cnZlOwotCi0JcHJfZGVidWcoIiVzOiBwZXJpb2QgJWQsIHN0ZXAgJWQsIGN1cnZlICVkXG4iLCBfX2Z1bmNfXywKLQkJIGF1ZHByb2Nfc29mdHZvbC5wZXJpb2QsIGF1ZHByb2Nfc29mdHZvbC5zdGVwLAotCQkgYXVkcHJvY19zb2Z0dm9sLnJhbXBpbmdfY3VydmUpOwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZhdWRwcm9jX3NvZnR2b2wpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IFNvZnQgdm9sdW1lIFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlI3hcbiIsCi0JCQkgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IGFkbV9zZXRfbWljX2dhaW4oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHZvbHVtZSkKLXsKLQlzdHJ1Y3QgYWRtX3NldF9taWNfZ2Fpbl9wYXJhbXMJbWljX2dhaW5fcGFyYW1zOwotCWludCByYyA9IDA7Ci0JaW50IHN6LCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9zZXRfbWljX2dhaW5fcGFyYW1zKTsKLQotCW1pY19nYWluX3BhcmFtcy5wYXJhbXMuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKLQltaWNfZ2Fpbl9wYXJhbXMucGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQltaWNfZ2Fpbl9wYXJhbXMucGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQltaWNfZ2Fpbl9wYXJhbXMucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQltaWNfZ2Fpbl9wYXJhbXMucGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCW1pY19nYWluX3BhcmFtcy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQltaWNfZ2Fpbl9wYXJhbXMucGFyYW1zLnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCW1pY19nYWluX3BhcmFtcy5wYXJhbXMucGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JbWljX2dhaW5fcGFyYW1zLnBhcmFtcy5wYXlsb2FkX3NpemUgPQotCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KSArCi0JCXNpemVvZihzdHJ1Y3QgYWRteF9taWNfZ2Fpbik7Ci0JbWljX2dhaW5fcGFyYW1zLmRhdGEubW9kdWxlX2lkID0gQURNX01PRFVMRV9JRFhfTUlDX0dBSU5fQ1RSTDsKLQltaWNfZ2Fpbl9wYXJhbXMuZGF0YS5wYXJhbV9pZCA9IEFETV9QQVJBTV9JRFhfTUlDX0dBSU47Ci0JbWljX2dhaW5fcGFyYW1zLmRhdGEucGFyYW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYWRteF9taWNfZ2Fpbik7Ci0JbWljX2dhaW5fcGFyYW1zLmRhdGEucmVzZXJ2ZWQgPSAwOwotCW1pY19nYWluX3BhcmFtcy5taWNfZ2Fpbl9kYXRhLnR4X21pY19nYWluID0gdm9sdW1lOwotCW1pY19nYWluX3BhcmFtcy5taWNfZ2Fpbl9kYXRhLnJlc2VydmVkID0gMDsKLQlwcl9kZWJ1ZygiJXM6IE1pYyBHYWluIHNldCB0byAlZCBhdCBwb3J0X2lkIDB4JXhcbiIsCi0JCV9fZnVuY19fLCB2b2x1bWUsIHBvcnRfaWQpOwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZtaWNfZ2Fpbl9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IE1pYyBHYWluIFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlI3hcbiIsCi0JCQkgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IGFkbV9zZW5kX3NldF9tdWx0aWNoYW5uZWxfZWNfcHJpbWFyeV9taWNfY2goaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCWludCBwcmltYXJ5X21pY19jaCkKLXsKLQlzdHJ1Y3QgYWRtX3NldF9zZWNfcHJpbWFyeV9jaF9wYXJhbXMgc2VjX3ByaW1hcnlfY2hfcGFyYW1zOwotCWludCByYyA9IDA7Ci0JaW50IHN6LCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCIlcyBwb3J0X2lkIDB4JXgsIGNvcHBfaWR4IDB4JXgsIHByaW1hcnlfbWljX2NoICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsICBjb3BwX2lkeCwgIHByaW1hcnlfbWljX2NoKTsKLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX2lkeCAweCV4XG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX3NldF9zZWNfcHJpbWFyeV9jaF9wYXJhbXMpOwotCi0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5oZHIuaGRyX2ZpZWxkID0KLQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMucGFyYW1zLmhkci5zcmNfc3ZjID0gQVBSX1NWQ19BRE07Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMucGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5oZHIuZGVzdF9zdmMgPSBBUFJfU1ZDX0FETTsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMucGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5oZHIudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCXNlY19wcmltYXJ5X2NoX3BhcmFtcy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMucGFyYW1zLnBheWxvYWRfYWRkcl9sc3cgPSAwOwotCXNlY19wcmltYXJ5X2NoX3BhcmFtcy5wYXJhbXMucGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnBhcmFtcy5wYXlsb2FkX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSkgKwotCQkJc2l6ZW9mKHN0cnVjdCBhZG14X3NlY19wcmltYXJ5X21pY19jaCk7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLmRhdGEubW9kdWxlX2lkID0KLQkJCUFVRFBST0NfTU9EVUxFX0lEX1ZPSUNFX1RYX1NFQ05TOwotCXNlY19wcmltYXJ5X2NoX3BhcmFtcy5kYXRhLnBhcmFtX2lkID0KLQkJCUFVRFBST0NfUEFSQU1fSURYX1NFQ19QUklNQVJZX01JQ19DSDsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMuZGF0YS5wYXJhbV9zaXplID0KLQkJCXNpemVvZihzdHJ1Y3QgYWRteF9zZWNfcHJpbWFyeV9taWNfY2gpOwotCXNlY19wcmltYXJ5X2NoX3BhcmFtcy5kYXRhLnJlc2VydmVkID0gMDsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMuc2VjX3ByaW1hcnlfbWljX2NoX2RhdGEudmVyc2lvbiA9IDA7Ci0Jc2VjX3ByaW1hcnlfY2hfcGFyYW1zLnNlY19wcmltYXJ5X21pY19jaF9kYXRhLnJlc2VydmVkID0gMDsKLQlzZWNfcHJpbWFyeV9jaF9wYXJhbXMuc2VjX3ByaW1hcnlfbWljX2NoX2RhdGEuc2VjX3ByaW1hcnlfbWljX2NoID0KLQkJCXByaW1hcnlfbWljX2NoOwotCXNlY19wcmltYXJ5X2NoX3BhcmFtcy5zZWNfcHJpbWFyeV9taWNfY2hfZGF0YS5yZXNlcnZlZDEgPSAwOwotCi0JYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZzZWNfcHJpbWFyeV9jaF9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiBNaWMgU2V0IHBhcmFtcyB0aW1lZCBvdXQgcG9ydCA9ICUjeFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgYWRtX3BhcmFtX2VuYWJsZShpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LCBpbnQgbW9kdWxlX2lkLCAgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYXVkcHJvY19lbmFibGVfcGFyYW1fdCBhZG1fbW9kX2VuYWJsZTsKLQlpbnQgc3ogPSAwOwotCWludCByYyAgPSAwOwotCWludCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCIlcyBwb3J0X2lkICVkLCBtb2R1bGVfaWQgMHgleCwgZW5hYmxlICVkXG4iLAotCQkgX19mdW5jX18sIHBvcnRfaWQsICBtb2R1bGVfaWQsICBlbmFibGUpOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGF1ZHByb2NfZW5hYmxlX3BhcmFtX3QpOwotCi0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5oZHJfZmllbGQgPQotCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIucGt0X3NpemUgPSBzejsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5zcmNfcG9ydCA9IHBvcnRfaWQ7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci5kZXN0X3BvcnQgPQotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuaWRbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLmhkci50b2tlbiA9ICBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5oZHIub3Bjb2RlID0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1OwotCWFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcy5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLm1lbV9tYXBfaGFuZGxlID0gMDsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGF5bG9hZF9zaXplID0gc2l6ZW9mKGFkbV9tb2RfZW5hYmxlKSAtCi0JCQkJc2l6ZW9mKGFkbV9tb2RfZW5hYmxlLnBwX3BhcmFtcykgKwotCQkJCXNpemVvZihhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGFyYW1zKTsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGFyYW1zLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGFyYW1zLnBhcmFtX2lkID0gQVVEUFJPQ19QQVJBTV9JRF9FTkFCTEU7Ci0JYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBhcmFtcy5wYXJhbV9zaXplID0KLQkJYWRtX21vZF9lbmFibGUucHBfcGFyYW1zLnBheWxvYWRfc2l6ZSAtCi0JCXNpemVvZihhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGFyYW1zKTsKLQlhZG1fbW9kX2VuYWJsZS5wcF9wYXJhbXMucGFyYW1zLnJlc2VydmVkID0gMDsKLQlhZG1fbW9kX2VuYWJsZS5lbmFibGUgPSBlbmFibGU7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmYWRtX21vZF9lbmFibGUpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9ICUjeFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6ICBtb2R1bGUgJXggIGVuYWJsZSAlZCB0aW1lZCBvdXQgb24gcG9ydCA9ICUjeFxuIiwKLQkJCSBfX2Z1bmNfXywgbW9kdWxlX2lkLCBlbmFibGUsIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLQotfQotCi1pbnQgYWRtX3NlbmRfY2FsaWJyYXRpb24oaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHBhdGgsIGludCBwZXJmX21vZGUsCi0JCQkgaW50IGNhbF90eXBlLCBjaGFyICpwYXJhbXMsIGludCBzaXplKQotewotCi0Jc3RydWN0IGFkbV9jbWRfc2V0X3BwX3BhcmFtc192NQkqYWRtX3BhcmFtcyA9IE5VTEw7Ci0JaW50IHN6LCByYyA9IDA7Ci0JaW50IHBvcnRfaWR4OwotCi0JcHJfZGVidWcoIiVzOnBvcnRfaWQgJWQsIHBhdGggJWQsIHBlcmZfbW9kZSAlZCwgY2FsX3R5cGUgJWQsIHNpemUgJWRcbiIsCi0JCSBfX2Z1bmNfXywgcG9ydF9pZCwgcGF0aCwgcGVyZl9tb2RlLCBjYWxfdHlwZSwgc2l6ZSk7Ci0KLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYXBzIGF1ZGlvX2Rldl9jdHJsIHBhdGggZGVmaW5pdGlvbiB0byBBQ0RCIGRlZmluaXRpb24gKi8KLQlpZiAoZ2V0X2NhbF9wYXRoKHBhdGgpICE9IFJYX0RFVklDRSkgewotCQlwcl9lcnIoIiVzOiBhY2RiX3BhdGggJWRcbiIsIF9fZnVuY19fLCBwYXRoKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYWRtX2NtZF9zZXRfcHBfcGFyYW1zX3Y1KSArIHNpemU7Ci0JYWRtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghYWRtX3BhcmFtcykgewotCQlwcl9lcnIoIiVzLCBhZG0gcGFyYW1zIG1lbW9yeSBhbGxvYyBmYWlsZWQiLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JbWVtY3B5KCgodTggKilhZG1fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhZG1fY21kX3NldF9wcF9wYXJhbXNfdjUpKSwKLQkJCXBhcmFtcywgc2l6ZSk7Ci0KLQlhZG1fcGFyYW1zLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JYWRtX3BhcmFtcy0+aGRyLnBrdF9zaXplID0gc3o7Ci0JYWRtX3BhcmFtcy0+aGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLT5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlhZG1fcGFyYW1zLT5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOwotCWFkbV9wYXJhbXMtPmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wYXJhbXMtPmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQlhZG1fcGFyYW1zLT5oZHIuZGVzdF9wb3J0ID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWFkbV9wYXJhbXMtPmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7Ci0JYWRtX3BhcmFtcy0+aGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQkvKiBwYXlsb2FkIGFkZHJlc3MgYW5kIG1tYXAgaGFuZGxlIGluaXRpYWxpemVkIHRvIHplcm8gYnkga3phbGxvYyAqLwotCWFkbV9wYXJhbXMtPnBheWxvYWRfc2l6ZSA9IHNpemU7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXJjID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopYWRtX3BhcmFtcyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBwb3J0ID0gJSN4XG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwKLQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAlI3hcbiIsCi0JCQkgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCQlbcG9ydF9pZHhdW2NvcHBfaWR4XSkpOwotCQlnb3RvIGVuZDsKLQl9Ci0JcmMgPSAwOwotCi1lbmQ6Ci0Ja2ZyZWUoYWRtX3BhcmFtcyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogYWRtX3VwZGF0ZV93YWl0X3BhcmFtZXRlcnMgbXVzdCBiZSBjYWxsZWQgd2l0aCByb3V0aW5nIGRyaXZlciBsb2Nrcy4KLSAqIGFkbV9yZXNldF93YWl0X3BhcmFtZXRlcnMgbXVzdCBiZSBjYWxsZWQgd2l0aCByb3V0aW5nIGRyaXZlciBsb2Nrcy4KLSAqIHNldCBhbmQgcmVzZXQgcGFybWV0ZXJzIGFyZSBzZXBhcmF0ZWQgdG8gbWFrZSBzdXJlIGl0IGlzIGFsd2F5cyBjYWxsZWQKLSAqIHVuZGVyIHJvdXRpbmcgZHJpdmVyIGxvY2suCi0gKiBhZG1fd2FpdF90aW1lb3V0IGlzIHRvIGJsb2NrIHVudGlsIHRpbWVvdXQgb3IgaW50ZXJydXB0ZWQuIFRpbWVvdXQgaXMKLSAqIG5vdCBhIGFuIGVycm9yLgotICovCi1pbnQgYWRtX3NldF93YWl0X3BhcmFtZXRlcnMoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCkKLXsKLQotCWludCByZXQgPSAwLCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4LCBjb3BwX2lkeCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsCi0JCSBjb3BwX2lkeCk7Ci0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5W3BvcnRfaWR4XVtjb3BwX2lkeF0gPSAxOwotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3N0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgMCk7Ci0KLWVuZDoKLQlyZXR1cm4gcmV0OwotCi19Ci0KLWludCBhZG1fcmVzZXRfd2FpdF9wYXJhbWV0ZXJzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgpCi17Ci0JaW50IHJldCA9IDAsIHBvcnRfaWR4OwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkIDB4JXggY29wcF9pZHggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAotCQkgY29wcF9pZHgpOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQgJSN4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV9zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0sIDEpOwotCXRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5W3BvcnRfaWR4XVtjb3BwX2lkeF0gPSAwOwotCi1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFkbV93YWl0X3RpbWVvdXQoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IHdhaXRfdGltZSkKLXsKLQlpbnQgcmV0ID0gMCwgcG9ydF9pZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgY29wcF9pZHggJWQsIHdhaXRfdGltZSAlZFxuIiwgX19mdW5jX18sCi0JCSBwb3J0X2lkLCBjb3BwX2lkeCwgd2FpdF90aW1lKTsKLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KAotCQl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV93YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV9zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pLAotCQltc2Vjc190b19qaWZmaWVzKHdhaXRfdGltZSkpOwotCXByX2RlYnVnKCIlczogcmV0dXJuICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldCA9IC1FSU5UUjsKLWVuZDoKLQlwcl9kZWJ1ZygiJXM6IHJldHVybiAlZC0tXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWRtX3N0b3JlX2NhbF9kYXRhKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGludCBwYXRoLCBpbnQgcGVyZl9tb2RlLAotCQkgICAgICAgaW50IGNhbF9pbmRleCwgY2hhciAqcGFyYW1zLCBpbnQgKnNpemUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOwotCWludCBhcHBfdHlwZSwgYWNkYl9pZCwgcG9ydF9pZHgsIHNhbXBsZV9yYXRlOwotCi0JaWYgKHRoaXNfYWRtLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiJXM6IGNhbF9pbmRleCAlZCBub3QgYWxsb2NhdGVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoZ2V0X2NhbF9wYXRoKHBhdGgpICE9IFJYX0RFVklDRSkgewotCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgcGF0aCB0byBzdG9yZSBjYWxpYnJhdGlvbiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcGF0aCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBvcnRfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocG9ydF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKGNvcHBfaWR4IDwgMCB8fCBjb3BwX2lkeCA+PSBNQVhfQ09QUFNfUEVSX1BPUlQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBjb3BwX251bTogJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkeCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFjZGJfaWQgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5hY2RiX2lkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWFwcF90eXBlID0gYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuYXBwX3R5cGVbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0Jc2FtcGxlX3JhdGUgPSBhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5yYXRlW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCi0JbXV0ZXhfbG9jaygmdGhpc19hZG0uY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gYWRtX2ZpbmRfY2FsKGNhbF9pbmRleCwgZ2V0X2NhbF9wYXRoKHBhdGgpLCBhcHBfdHlwZSwKLQkJCQlhY2RiX2lkLCBzYW1wbGVfcmF0ZSk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIHVubG9jazsKLQotCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPD0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIEFETSBjYWwgc2VuZCBmb3IgcG9ydF9pZCA9IDB4JXghXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWlmIChjYWxfaW5kZXggPT0gQURNX0FVRFBST0NfQ0FMKSB7Ci0JCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPiBBVURfUFJPQ19CTE9DS19TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOmF1ZHByb2M6aW52YWxpZCBzaXplIGV4cC9hY3R1YWxbJXpkLCAlZF1cbiIsCi0JCQkJX19mdW5jX18sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwgKnNpemUpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byB1bmxvY2s7Ci0JCX0KLQl9IGVsc2UgaWYgKGNhbF9pbmRleCA9PSBBRE1fQVVEVk9MX0NBTCkgewotCQlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplID4gQVVEX1ZPTF9CTE9DS19TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOmF1ZF92b2w6aW52YWxpZCBzaXplIGV4cC9hY3R1YWxbJXpkLCAlZF1cbiIsCi0JCQkJX19mdW5jX18sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwgKnNpemUpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byB1bmxvY2s7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IE5vdCB2YWxpZCBjYWxpYnJhdGlvbiBmb3IgZG9sYnkgdG9wb2xneVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCW1lbWNweShwYXJhbXMsIGNhbF9ibG9jay0+Y2FsX2RhdGEua3ZhZGRyLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUpOwotCSpzaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOwotCi0JcHJfZGVidWcoIiVzOnBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkLCBwYXRoICVkIiwKLQkJIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCwgcGF0aCk7Ci0JcHJfZGVidWcoInBlcmZfbW9kZSAlZCwgY2FsX3R5cGUgJWQsIHNpemUgJWRcbiIsCi0JCSBwZXJmX21vZGUsIGNhbF9pbmRleCwgKnNpemUpOwotCi11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FkbS5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKLWVuZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBhZG1fc2VuZF9jb21wcmVzc2VkX2RldmljZV9tdXRlKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsIGJvb2wgbXV0ZV9vbikKLXsKLQlzdHJ1Y3QgYWRtX3NldF9jb21wcmVzc2VkX2RldmljZV9tdXRlIG11dGVfcGFyYW1zOwotCWludCByZXQgPSAwOwotCWludCBwb3J0X2lkeDsKLQotCXByX2RlYnVnKCIlcyBwb3J0X2lkOiAweCV4LCBjb3BwX2lkeCAlZCwgbXV0ZV9vbjogJWRcbiIsCi0JCSBfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgsIG11dGVfb24pOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCB8fCBwb3J0X2lkeCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3ggY29wcF9pZHggJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQltdXRlX3BhcmFtcy5jb21tYW5kLmhkci5oZHJfZmllbGQgPQotCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQltdXRlX3BhcmFtcy5jb21tYW5kLmhkci5wa3Rfc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbXV0ZSk7Ci0JbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOwotCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JbXV0ZV9wYXJhbXMuY29tbWFuZC5oZHIuZGVzdF9wb3J0ID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCW11dGVfcGFyYW1zLmNvbW1hbmQuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQltdXRlX3BhcmFtcy5jb21tYW5kLmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7Ci0JbXV0ZV9wYXJhbXMuY29tbWFuZC5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQltdXRlX3BhcmFtcy5jb21tYW5kLnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCW11dGVfcGFyYW1zLmNvbW1hbmQubWVtX21hcF9oYW5kbGUgPSAwOwotCW11dGVfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9zaXplID0gc2l6ZW9mKG11dGVfcGFyYW1zKSAtCi0JCQkJCQlzaXplb2YobXV0ZV9wYXJhbXMuY29tbWFuZCk7Ci0JbXV0ZV9wYXJhbXMucGFyYW1zLm1vZHVsZV9pZCA9IEFVRFBST0NfTU9EVUxFX0lEX0NPTVBSRVNTRURfTVVURTsKLQltdXRlX3BhcmFtcy5wYXJhbXMucGFyYW1faWQgPSBBVURQUk9DX1BBUkFNX0lEX0NPTVBSRVNTRURfTVVURTsKLQltdXRlX3BhcmFtcy5wYXJhbXMucGFyYW1fc2l6ZSA9IG11dGVfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9zaXplIC0KLQkJCQkJc2l6ZW9mKG11dGVfcGFyYW1zLnBhcmFtcyk7Ci0JbXV0ZV9wYXJhbXMucGFyYW1zLnJlc2VydmVkID0gMDsKLQltdXRlX3BhcmFtcy5tdXRlX29uID0gbXV0ZV9vbjsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJm11dGVfcGFyYW1zKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBkZXZpY2UgbXV0ZSBmb3IgcG9ydCAlZCBjb3BwICVkIGZhaWxlZCwgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogc2VuZCBkZXZpY2UgbXV0ZSBmb3IgcG9ydCAlZCBjb3BwICVkIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBlbmQ7Ci0JfQotCXJldCA9IDA7Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFkbV9zZW5kX2NvbXByZXNzZWRfZGV2aWNlX2xhdGVuY3koaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwgaW50IGxhdGVuY3kpCi17Ci0Jc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbGF0ZW5jeSBsYXRlbmN5X3BhcmFtczsKLQlpbnQgcG9ydF9pZHg7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMgcG9ydF9pZDogMHgleCwgY29wcF9pZHggJWQgbGF0ZW5jeTogJWRcbiIsIF9fZnVuY19fLAotCQkgcG9ydF9pZCwgY29wcF9pZHgsIGxhdGVuY3kpOwotCXBvcnRfaWQgPSBhZmVfY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCB8fCBwb3J0X2lkeCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3ggY29wcF9pZHggJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgY29wcF9pZHgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci5oZHJfZmllbGQgPQotCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci5wa3Rfc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IGFkbV9zZXRfY29tcHJlc3NlZF9kZXZpY2VfbGF0ZW5jeSk7Ci0JbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOwotCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0JbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5oZHIuZGVzdF9wb3J0ID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfCBjb3BwX2lkeDsKLQlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLmhkci5vcGNvZGUgPSBBRE1fQ01EX1NFVF9QUF9QQVJBTVNfVjU7Ci0JbGF0ZW5jeV9wYXJhbXMuY29tbWFuZC5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlsYXRlbmN5X3BhcmFtcy5jb21tYW5kLnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQubWVtX21hcF9oYW5kbGUgPSAwOwotCWxhdGVuY3lfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9zaXplID0gc2l6ZW9mKGxhdGVuY3lfcGFyYW1zKSAtCi0JCQkJCQlzaXplb2YobGF0ZW5jeV9wYXJhbXMuY29tbWFuZCk7Ci0JbGF0ZW5jeV9wYXJhbXMucGFyYW1zLm1vZHVsZV9pZCA9IEFVRFBST0NfTU9EVUxFX0lEX0NPTVBSRVNTRURfTEFURU5DWTsKLQlsYXRlbmN5X3BhcmFtcy5wYXJhbXMucGFyYW1faWQgPSBBVURQUk9DX1BBUkFNX0lEX0NPTVBSRVNTRURfTEFURU5DWTsKLQlsYXRlbmN5X3BhcmFtcy5wYXJhbXMucGFyYW1fc2l6ZSA9IGxhdGVuY3lfcGFyYW1zLmNvbW1hbmQucGF5bG9hZF9zaXplIC0KLQkJCQkJc2l6ZW9mKGxhdGVuY3lfcGFyYW1zLnBhcmFtcyk7Ci0JbGF0ZW5jeV9wYXJhbXMucGFyYW1zLnJlc2VydmVkID0gMDsKLQlsYXRlbmN5X3BhcmFtcy5sYXRlbmN5ID0gbGF0ZW5jeTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJmxhdGVuY3lfcGFyYW1zKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBzZW5kIGRldmljZSBsYXRlbmN5IGVyciAlZCBmb3IgcG9ydCAlZCBjb3BwICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZG0uY29wcC53YWl0W3BvcnRfaWR4XVtjb3BwX2lkeF0sCi0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogc2VuZCBkZXZpY2UgbGF0ZW5jeSBmb3IgcG9ydCAlZCBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQkJW3BvcnRfaWR4XVtjb3BwX2lkeF0pKTsKLQkJZ290byBlbmQ7Ci0JfQotCXJldCA9IDA7Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhZG1fc3dhcF9zcGVha2VyX2NoYW5uZWxzCi0gKgotICogUmVjZWl2ZXMgcG9ydF9pZCwgY29wcF9pZHgsIHNhbXBsZSByYXRlLCBzcGtfc3dhcCBhbmQKLSAqIHNlbmQgTUZDIGNvbW1hbmQgdG8gc3dhcCBzcGVha2VyIGNoYW5uZWwuCi0gKiBSZXR1cm4gemVybyBvbiBzdWNjZXNzLiBPbiBmYWlsdXJlIHJldHVybnMgbm9uemVyby4KLSAqCi0gKiBwb3J0X2lkIC0gUGFzc2VkIHZhbHVlLCBwb3J0X2lkIGZvciB3aGljaCBjaGFubmVscyBzd2FwIGlzIHdhbnRlZAotICogY29wcF9pZHggLSBQYXNzZWQgdmFsdWUsIGNvcHBfaWR4IGZvciB3aGljaCBjaGFubmVscyBzd2FwIGlzIHdhbnRlZAotICogc2FtcGxlX3JhdGUgLSBQYXNzZWQgdmFsdWUsIHNhbXBsZSByYXRlIHVzZWQgYnkgYXBwIHR5cGUgY29uZmlnCi0gKiBzcGtfc3dhcCAgLSBQYXNzZWQgdmFsdWUsIHNwa19zd2FwIGZvciBjaGVjayBpZiBzd2FwIGZsYWcgaXMgc2V0Ci0gKi8KLWludCBhZG1fc3dhcF9zcGVha2VyX2NoYW5uZWxzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQlpbnQgc2FtcGxlX3JhdGUsIGJvb2wgc3BrX3N3YXApCi17Ci0Jc3RydWN0IGF1ZHByb2NfbWZjX291dHB1dF9tZWRpYV9mbXQgbWZjX2NmZzsKLQl1aW50MTZfdCBudW1fY2hhbm5lbHM7Ci0JaW50IHBvcnRfaWR4OwotCWludCByZXQgID0gMDsKLQotCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkXG4iLAotCQkgIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0JcG9ydF9pZCA9IHE2YXVkaW9fY29udmVydF92aXJ0dWFsX3RvX3BvcnRpZChwb3J0X2lkKTsKLQlwb3J0X2lkeCA9IGFkbV92YWxpZGF0ZV9hbmRfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKHBvcnRfaWR4IDwgMCB8fCBwb3J0X2lkeCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydF9pZCAlI3hcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3BwX2lkeCA8IDAgfHwgY29wcF9pZHggPj0gTUFYX0NPUFBTX1BFUl9QT1JUKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY29wcF9udW06ICVkXG4iLCBfX2Z1bmNfXywgY29wcF9pZHgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbnVtX2NoYW5uZWxzID0gYXRvbWljX3JlYWQoCi0JCQkJJnRoaXNfYWRtLmNvcHAuY2hhbm5lbHNbcG9ydF9pZHhdW2NvcHBfaWR4XSk7Ci0JaWYgKG51bV9jaGFubmVscyAhPSAyKSB7Ci0JCXByX2RlYnVnKCIlczogSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVkXG4iLAotCQkJX19mdW5jX18sIG51bV9jaGFubmVscyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltZW1zZXQoJm1mY19jZmcsIDAsIHNpemVvZihtZmNfY2ZnKSk7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLnBrdF9zaXplID0KLQkJCQlzaXplb2YobWZjX2NmZyk7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQltZmNfY2ZnLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQltZmNfY2ZnLnBhcmFtcy5oZHIuc3JjX3BvcnQgPSBwb3J0X2lkOwotCW1mY19jZmcucGFyYW1zLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCW1mY19jZmcucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQltZmNfY2ZnLnBhcmFtcy5oZHIuZGVzdF9wb3J0ID0KLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BvcnRfaWR4XVtjb3BwX2lkeF0pOwotCW1mY19jZmcucGFyYW1zLmhkci50b2tlbiA9IHBvcnRfaWR4IDw8IDE2IHwgY29wcF9pZHg7Ci0JbWZjX2NmZy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQltZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQltZmNfY2ZnLnBhcmFtcy5wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQltZmNfY2ZnLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JbWZjX2NmZy5wYXJhbXMucGF5bG9hZF9zaXplID0gc2l6ZW9mKG1mY19jZmcpIC0KLQkJCQlzaXplb2YobWZjX2NmZy5wYXJhbXMpOwotCW1mY19jZmcuZGF0YS5tb2R1bGVfaWQgPSBBVURQUk9DX01PRFVMRV9JRF9NRkM7Ci0JbWZjX2NmZy5kYXRhLnBhcmFtX2lkID0gQVVEUFJPQ19QQVJBTV9JRF9NRkNfT1VUUFVUX01FRElBX0ZPUk1BVDsKLQltZmNfY2ZnLmRhdGEucGFyYW1fc2l6ZSA9IG1mY19jZmcucGFyYW1zLnBheWxvYWRfc2l6ZSAtCi0JCQkJc2l6ZW9mKG1mY19jZmcuZGF0YSk7Ci0JbWZjX2NmZy5kYXRhLnJlc2VydmVkID0gMDsKLQltZmNfY2ZnLnNhbXBsaW5nX3JhdGUgPSBzYW1wbGVfcmF0ZTsKLQltZmNfY2ZnLmJpdHNfcGVyX3NhbXBsZSA9Ci0JCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmJpdF93aWR0aFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQltZmNfY2ZnLm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKLQotCS8qIEN1cnJlbnRseSBhcHBseWluZyBzcGVha2VyIHN3YXAgZm9yIG9ubHkgMiBjaGFubmVsIHVzZSBjYXNlICovCi0JaWYgKHNwa19zd2FwKSB7Ci0JCW1mY19jZmcuY2hhbm5lbF90eXBlWzBdID0KLQkJCSh1aW50MTZfdCkgUENNX0NIQU5ORUxfRlI7Ci0JCW1mY19jZmcuY2hhbm5lbF90eXBlWzFdID0KLQkJCSh1aW50MTZfdCkgUENNX0NIQU5ORUxfRkw7Ci0JfSBlbHNlIHsKLQkJbWZjX2NmZy5jaGFubmVsX3R5cGVbMF0gPQotCQkJKHVpbnQxNl90KSBQQ01fQ0hBTk5FTF9GTDsKLQkJbWZjX2NmZy5jaGFubmVsX3R5cGVbMV0gPQotCQkJKHVpbnQxNl90KSBQQ01fQ0hBTk5FTF9GUjsKLQl9Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLnN0YXRbcG9ydF9pZHhdW2NvcHBfaWR4XSwgLTEpOwotCXByX2RlYnVnKCIlczogbWZjIGNvbmZpZzogcG9ydF9pZHggJWQgY29wcF9pZHggICVkIGNvcHAgU1IgJWQgY29wcCBCVyAlZCBjb3BwIGNoYW4gJWRcbiIsCi0JCV9fZnVuY19fLCBwb3J0X2lkeCwgY29wcF9pZHgsIG1mY19jZmcuc2FtcGxpbmdfcmF0ZSwKLQkJbWZjX2NmZy5iaXRzX3Blcl9zYW1wbGUsIG1mY19jZmcubnVtX2NoYW5uZWxzKTsKLQotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FkbS5hcHIsICh1aW50MzJfdCAqKSZtZmNfY2ZnKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0X2lkOiBmb3JbMHgleF0gZmFpbGVkICVkXG4iLAotCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQkvKiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgd2l0aCBjb3BwIGlkICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCVtwb3J0X2lkeF1bY29wcF9pZHhdKSA+PSAwLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBtZmNfY2ZnIFNldCBwYXJhbXMgdGltZWQgb3V0IGZvciBwb3J0X2lkOiBmb3IgWzB4JXhdXG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWRtLmNvcHAuc3RhdAotCQkJCVtwb3J0X2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IG1mY19jZmcgU2V0IHBhcmFtcyByZXR1cm5lZCBzdWNjZXNzIiwgX19mdW5jX18pOwotCXJldCA9IDA7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woYWRtX3N3YXBfc3BlYWtlcl9jaGFubmVscyk7Ci0KLWludCBhZG1fc2V0X3NvdW5kX2ZvY3VzKGludCBwb3J0X2lkLCBpbnQgY29wcF9pZHgsCi0JCQlzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGEpCi17Ci0Jc3RydWN0IGFkbV9zZXRfZmx1ZW5jZV9zb3VuZGZvY3VzX3BhcmFtIHNvdW5kZm9jdXNfcGFyYW1zOwotCWludCBzeiA9IDA7Ci0JaW50IHJldCAgPSAwOwotCWludCBwb3J0X2lkeDsKLQlpbnQgaTsKLQotCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkXG4iLAotCQkgIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQlwb3J0X2lkID0gYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JcG9ydF9pZHggPSBhZG1fdmFsaWRhdGVfYW5kX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChwb3J0X2lkeCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkICUjeFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29wcF9pZHggPCAwIHx8IGNvcHBfaWR4ID49IE1BWF9DT1BQU19QRVJfUE9SVCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNvcHBfbnVtOiAlZFxuIiwgX19mdW5jX18sIGNvcHBfaWR4KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGFkbV9zZXRfZmx1ZW5jZV9zb3VuZGZvY3VzX3BhcmFtKTsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmhkcl9maWVsZCA9Ci0JCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkgICAgICBBUFJfUEtUX1ZFUik7Ci0Jc291bmRmb2N1c19wYXJhbXMucGFyYW1zLmhkci5wa3Rfc2l6ZSA9IHN6OwotCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURNOwotCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRE07Ci0Jc291bmRmb2N1c19wYXJhbXMucGFyYW1zLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLmRlc3RfcG9ydCA9Ci0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5pZFtwb3J0X2lkeF1bY29wcF9pZHhdKTsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLnRva2VuID0gcG9ydF9pZHggPDwgMTYgfAotCQkJCUFETV9DTElFTlRfSURfU09VUkNFX1RSQUNLSU5HIDw8IDggfCBjb3BwX2lkeDsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMuaGRyLm9wY29kZSA9IEFETV9DTURfU0VUX1BQX1BBUkFNU19WNTsKLQlzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMucGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0Jc291bmRmb2N1c19wYXJhbXMucGFyYW1zLnBheWxvYWRfYWRkcl9tc3cgPSAwOwotCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0Jc291bmRmb2N1c19wYXJhbXMucGFyYW1zLnBheWxvYWRfc2l6ZSA9IHNpemVvZihzb3VuZGZvY3VzX3BhcmFtcykgLQotCQkJCXNpemVvZihzb3VuZGZvY3VzX3BhcmFtcy5wYXJhbXMpOwotCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEubW9kdWxlX2lkID0gVk9JQ0VQUk9DX01PRFVMRV9JRF9HRU5FUklDX1RYOwotCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEucGFyYW1faWQgPSBWT0lDRVBST0NfUEFSQU1fSURfRkxVRU5DRV9TT1VOREZPQ1VTOwotCXNvdW5kZm9jdXNfcGFyYW1zLmRhdGEucGFyYW1fc2l6ZSA9Ci0JCXNvdW5kZm9jdXNfcGFyYW1zLnBhcmFtcy5wYXlsb2FkX3NpemUgLQotCQlzaXplb2Yoc291bmRmb2N1c19wYXJhbXMuZGF0YSk7Ci0Jc291bmRmb2N1c19wYXJhbXMuZGF0YS5yZXNlcnZlZCA9IDA7Ci0KLQltZW1zZXQoJihzb3VuZGZvY3VzX3BhcmFtcy5zb3VuZGZvY3VzX2RhdGEpLCAweEZGLAotCQlzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdW5kZm9jdXNfdCkpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7Ci0JCXNvdW5kZm9jdXNfcGFyYW1zLnNvdW5kZm9jdXNfZGF0YS5zdGFydF9hbmdsZXNbaV0gPQotCQkJc291bmRGb2N1c0RhdGEuc3RhcnRfYW5nbGVbaV07Ci0JCXNvdW5kZm9jdXNfcGFyYW1zLnNvdW5kZm9jdXNfZGF0YS5lbmFibGVzW2ldID0KLQkJCXNvdW5kRm9jdXNEYXRhLmVuYWJsZVtpXTsKLQkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLnN0YXJ0X2FuZ2xlW2ldKTsKLQkJcHJfZGVidWcoIiVzOiBlbmFibGVbJWRdID0gJWRcbiIsCi0JCQkgIF9fZnVuY19fLCBpLCBzb3VuZEZvY3VzRGF0YS5lbmFibGVbaV0pOwotCX0KLQlzb3VuZGZvY3VzX3BhcmFtcy5zb3VuZGZvY3VzX2RhdGEuZ2Fpbl9zdGVwID0KLQkJCQkJc291bmRGb2N1c0RhdGEuZ2Fpbl9zdGVwOwotCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLCBzb3VuZEZvY3VzRGF0YS5nYWluX3N0ZXApOwotCi0Jc291bmRmb2N1c19wYXJhbXMuc291bmRmb2N1c19kYXRhLnJlc2VydmVkID0gMDsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwb3J0X2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWRtLmFwciwgKHVpbnQzMl90ICopJnNvdW5kZm9jdXNfcGFyYW1zKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWRtLmNvcHAud2FpdFtwb3J0X2lkeF1bY29wcF9pZHhdLAotCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0W3BvcnRfaWR4XVtjb3BwX2lkeF0pID49IDAsCi0JCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICh0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMgIT0gMCkgewotCQlwcl9lcnIoIiVzIC0gc2V0IHBhcmFtcyByZXR1cm5lZCBlcnJvciBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKSk7Ci0KLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuYXByX2NtZF9zdGF0dXMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gMDsKLQotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWRtX2dldF9zb3VuZF9mb2N1cyhpbnQgcG9ydF9pZCwgaW50IGNvcHBfaWR4LAotCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSkKLXsKLQlpbnQgcmV0ID0gMCwgaTsKLQljaGFyICpwYXJhbXNfdmFsdWU7Ci0JdWludDMyX3QgcGFyYW1fcGF5bG9hZF9sZW4gPSBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QpOwotCXN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgKnNvdW5kZm9jdXNfcGFyYW1zOwotCi0JcHJfZGVidWcoIiVzOiBFbnRlciwgcG9ydF9pZCAlZCwgY29wcF9pZHggJWRcbiIsCi0JCSAgX19mdW5jX18sIHBvcnRfaWQsIGNvcHBfaWR4KTsKLQotCXBhcmFtc192YWx1ZSA9IGt6YWxsb2MocGFyYW1fcGF5bG9hZF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghcGFyYW1zX3ZhbHVlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gYWRtX2dldF9wYXJhbXNfdjIocG9ydF9pZCwgY29wcF9pZHgsCi0JCQkJVk9JQ0VQUk9DX01PRFVMRV9JRF9HRU5FUklDX1RYLAotCQkJCVZPSUNFUFJPQ19QQVJBTV9JRF9GTFVFTkNFX1NPVU5ERk9DVVMsCi0JCQkJcGFyYW1fcGF5bG9hZF9sZW4sCi0JCQkJcGFyYW1zX3ZhbHVlLAotCQkJCUFETV9DTElFTlRfSURfU09VUkNFX1RSQUNLSU5HKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGdldCBwYXJhbWV0ZXJzIGZhaWxlZCByZXQ6JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCi0JCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzICE9IDApIHsKLQkJcHJfZXJyKCIlcyAtIGdldCBwYXJhbXMgcmV0dXJuZWQgZXJyb3IgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cykpOwotCi0JCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKTsKLQkJZ290byBkb25lOwotCX0KLQotCXNvdW5kZm9jdXNfcGFyYW1zID0gKHN0cnVjdCBhZG1fcGFyYW1fZmx1ZW5jZV9zb3VuZGZvY3VzX3QgKikKLQkJCQkJCQkJcGFyYW1zX3ZhbHVlOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7Ci0JCXNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSA9Ci0JCQkJCXNvdW5kZm9jdXNfcGFyYW1zLT5zdGFydF9hbmdsZXNbaV07Ci0JCXNvdW5kRm9jdXNEYXRhLT5lbmFibGVbaV0gPSBzb3VuZGZvY3VzX3BhcmFtcy0+ZW5hYmxlc1tpXTsKLQkJcHJfZGVidWcoIiVzOiBzdGFydF9hbmdsZVslZF0gPSAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSk7Ci0JCXByX2RlYnVnKCIlczogZW5hYmxlWyVkXSA9ICVkXG4iLAotCQkJICBfX2Z1bmNfXywgaSwgc291bmRGb2N1c0RhdGEtPmVuYWJsZVtpXSk7Ci0JfQotCXNvdW5kRm9jdXNEYXRhLT5nYWluX3N0ZXAgPSBzb3VuZGZvY3VzX3BhcmFtcy0+Z2Fpbl9zdGVwOwotCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLCBzb3VuZEZvY3VzRGF0YS0+Z2Fpbl9zdGVwKTsKLQotCWtmcmVlKHBhcmFtc192YWx1ZSk7Ci0KLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBFeGl0LCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkbV9zb3VyY2VfdHJhY2tpbmdfYWxsb2NfbWFwX21lbW9yeSh2b2lkKQotewotCWludCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJTT1VSQ0VfVFJBQ0tJTkciLAotCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAotCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlLAotCQkJCSAgQVVEX1BST0NfQkxPQ0tfU0laRSwKLQkJCQkgICZ0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyLAotCQkJCSAgJnRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSwKLQkJCQkgICZ0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaW5kZXgsIEFETV9NRU1fTUFQX0lOREVYX1NPVVJDRV9UUkFDS0lORyk7Ci0JcmV0ID0gYWRtX21lbW9yeV9tYXBfcmVnaW9ucygmdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciwKLQkJCTAsCi0JCQkodWludDMyX3QgKikmdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplLAotCQkJMSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBtZW1vcnksIHBhZGRyID0gMHglcEssIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJKHZvaWQgKil0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLnBhZGRyLAotCQkJKHVpbnQzMl90KXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSk7Ci0KLQkJbXNtX2F1ZGlvX2lvbl9mcmVlKHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25fY2xpZW50LAotCQkJCSAgIHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5pb25faGFuZGxlKTsKLQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9jbGllbnQgPSBOVUxMOwotCQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2hhbmRsZSA9IE5VTEw7Ci0JCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7Ci0JCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAua3ZhZGRyID0gTlVMTDsKLQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciA9IDA7Ci0JCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cyA9IC0xOwotCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXMKLQkJCQlbQURNX01FTV9NQVBfSU5ERVhfU09VUkNFX1RSQUNLSU5HXSwgMCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSAwOwotCXByX2RlYnVnKCIlczogcGFkZHIgPSAweCVwSywgc2l6ZSA9ICVkLCBtZW1fbWFwX2hhbmRsZSA9IDB4JXhcbiIsCi0JCSAgX19mdW5jX18sICh2b2lkICopdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkciwKLQkJICAodWludDMyX3QpdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5zaXplLAotCQkgIGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXMKLQkJCSAgICAgIFtBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddKSk7Ci0KLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBFeGl0LCByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWRtX2dldF9zb3VyY2VfdHJhY2tpbmcoaW50IHBvcnRfaWQsIGludCBjb3BwX2lkeCwKLQkJCSAgICBzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpCi17Ci0Jc3RydWN0IGFkbV9jbWRfZ2V0X3BwX3BhcmFtc192NSBhZG1wOwotCWludCBwX2lkeCwgcmV0ID0gMCwgaTsKLQlzdHJ1Y3QgYWRtX3BhcmFtX2ZsdWVuY2Vfc291cmNldHJhY2tpbmdfdCAqc291cmNlX3RyYWNraW5nX3BhcmFtczsKLQotCXByX2RlYnVnKCIlczogRW50ZXIsIHBvcnRfaWQgJWQsIGNvcHBfaWR4ICVkXG4iLAotCQkgIF9fZnVuY19fLCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQlpZiAoIXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIpIHsKLQkJLyogQWxsb2NhdGUgYW5kIG1hcCBzaGFyZWQgbWVtb3J5IGZvciBvdXQgb2YgYmFuZCB1c2FnZSAqLwotCQlyZXQgPSBhZG1fc291cmNlX3RyYWNraW5nX2FsbG9jX21hcF9tZW1vcnkoKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JcG9ydF9pZCA9IGFmZV9jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCXBfaWR4ID0gYWRtX3ZhbGlkYXRlX2FuZF9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAocF9pZHggPCAwKSB7Ci0JCXByX2VycigiJXMgLSBpbnZhbGlkIHBvcnQgaW5kZXggJWksIHBvcnQgaWQgJWksIGNvcHAgaWR4ICVpXG4iLAotCQkJX19mdW5jX18sIHBfaWR4LCBwb3J0X2lkLCBjb3BwX2lkeCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWFkbXAuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFkbXAuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFkbXApOwotCWFkbXAuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFkbXAuaGRyLnNyY19wb3J0ID0gcG9ydF9pZDsKLQlhZG1wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbXAuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFkbXAuaGRyLmRlc3RfcG9ydCA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLmlkW3BfaWR4XVtjb3BwX2lkeF0pOwotCWFkbXAuaGRyLnRva2VuID0gcF9pZHggPDwgMTYgfCBBRE1fQ0xJRU5UX0lEX1NPVVJDRV9UUkFDS0lORyA8PCA4IHwKLQkJCSBjb3BwX2lkeDsKLQlhZG1wLmhkci5vcGNvZGUgPSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjU7Ci0JYWRtcC5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPQotCQlsb3dlcl8zMl9iaXRzKHRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIpOwotCWFkbXAuZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5wYWRkcik7Ci0JYWRtcC5tZW1fbWFwX2hhbmRsZSA9IGF0b21pY19yZWFkKCZ0aGlzX2FkbS5tZW1fbWFwX2hhbmRsZXNbCi0JCQkJCSAgQURNX01FTV9NQVBfSU5ERVhfU09VUkNFX1RSQUNLSU5HXSk7Ci0JYWRtcC5tb2R1bGVfaWQgPSBWT0lDRVBST0NfTU9EVUxFX0lEX0dFTkVSSUNfVFg7Ci0JYWRtcC5wYXJhbV9pZCA9IFZPSUNFUFJPQ19QQVJBTV9JRF9GTFVFTkNFX1NPVVJDRVRSQUNLSU5HOwotCWFkbXAucGFyYW1fbWF4X3NpemUgPSBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QpCi0JCQkJKyBzaXplb2Yoc3RydWN0IGFkbV9wYXJhbV9kYXRhX3Y1KTsKLQlhZG1wLnJlc2VydmVkID0gMDsKLQotCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuc3RhdFtwX2lkeF1bY29wcF9pZHhdLCAtMSk7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZG0uYXByLCAodWludDMyX3QgKikmYWRtcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBnZXQgU291cmNlIFRyYWNraW5nIFBhcmFtc1xuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FkbS5jb3BwLndhaXRbcF9pZHhdW2NvcHBfaWR4XSwKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXRbcF9pZHhdW2NvcHBfaWR4XSkgPj0gMCwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXMgLSBnZXQgcGFyYW1zIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FkbS5jb3BwLnN0YXQKLQkJCQlbcF9pZHhdW2NvcHBfaWR4XSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQlbcF9pZHhdW2NvcHBfaWR4XSkpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZG0uY29wcC5zdGF0Ci0JCQkJCVtwX2lkeF1bY29wcF9pZHhdKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzICE9IDApIHsKLQkJcHJfZXJyKCIlcyAtIGdldCBwYXJhbXMgcmV0dXJuZWQgZXJyb3IgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cykpOwotCi0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmFwcl9jbWRfc3RhdHVzKTsKLQkJZ290byBkb25lOwotCX0KLQotCXNvdXJjZV90cmFja2luZ19wYXJhbXMgPSAoc3RydWN0IGFkbV9wYXJhbV9mbHVlbmNlX3NvdXJjZXRyYWNraW5nX3QgKikKLQkJCSh0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEubWVtbWFwLmt2YWRkciArCi0JCQkgc2l6ZW9mKHN0cnVjdCBhZG1fcGFyYW1fZGF0YV92NSkpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7Ci0JCXNvdXJjZVRyYWNraW5nRGF0YS0+dmFkW2ldID0gc291cmNlX3RyYWNraW5nX3BhcmFtcy0+dmFkW2ldOwotCQlwcl9kZWJ1ZygiJXM6IHZhZFslZF0gPSAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGksIHNvdXJjZVRyYWNraW5nRGF0YS0+dmFkW2ldKTsKLQl9Ci0Jc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffc3BlZWNoID0gc291cmNlX3RyYWNraW5nX3BhcmFtcy0+ZG9hX3NwZWVjaDsKLQlwcl9kZWJ1ZygiJXM6IGRvYV9zcGVlY2ggPSAlZFxuIiwKLQkJICBfX2Z1bmNfXywgc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffc3BlZWNoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlM7IGkrKykgewotCQlzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9ub2lzZVtpXSA9Ci0JCQkJCXNvdXJjZV90cmFja2luZ19wYXJhbXMtPmRvYV9ub2lzZVtpXTsKLQkJcHJfZGVidWcoIiVzOiBkb2Ffbm9pc2VbJWRdID0gJWRcbiIsCi0JCQkgIF9fZnVuY19fLCBpLCBzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9ub2lzZVtpXSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9MQVJfQUNUSVZJVFlfSU5ESUNBVE9SUzsgaSsrKSB7Ci0JCXNvdXJjZVRyYWNraW5nRGF0YS0+cG9sYXJfYWN0aXZpdHlbaV0gPQotCQkJCXNvdXJjZV90cmFja2luZ19wYXJhbXMtPnBvbGFyX2FjdGl2aXR5W2ldOwotCQlwcl9kZWJ1ZygiJXM6IHBvbGFyX2FjdGl2aXR5WyVkXSA9ICVkXG4iLAotCQkJICBfX2Z1bmNfXywgaSwgc291cmNlVHJhY2tpbmdEYXRhLT5wb2xhcl9hY3Rpdml0eVtpXSk7Ci0JfQotCi0JcmV0ID0gMDsKLQotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhZG1faW5pdCh2b2lkKQotewotCWludCBpID0gMCwgajsKLQotCXRoaXNfYWRtLmFwciA9IE5VTEw7Ci0JdGhpc19hZG0uZWNfcmVmX3J4ID0gLTE7Ci0JdGhpc19hZG0ubnVtX2VjX3JlZl9yeF9jaGFucyA9IDA7Ci0JdGhpc19hZG0uZWNfcmVmX3J4X2JpdF93aWR0aCA9IDA7Ci0JdGhpc19hZG0uZWNfcmVmX3J4X3NhbXBsaW5nX3JhdGUgPSAwOwotCWF0b21pY19zZXQoJnRoaXNfYWRtLm1hdHJpeF9tYXBfc3RhdCwgMCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpc19hZG0ubWF0cml4X21hcF93YWl0KTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5hZG1fc3RhdCwgMCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpc19hZG0uYWRtX3dhaXQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFGRV9NQVhfUE9SVFM7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgTUFYX0NPUFBTX1BFUl9QT1JUOyBqKyspIHsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuaWRbaV1bal0sIFJFU0VUX0NPUFBfSUQpOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5jbnRbaV1bal0sIDApOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC50b3BvbG9neVtpXVtqXSwgMCk7Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLm1vZGVbaV1bal0sIDApOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5zdGF0W2ldW2pdLCAwKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAucmF0ZVtpXVtqXSwgMCk7Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmNoYW5uZWxzW2ldW2pdLCAwKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYml0X3dpZHRoW2ldW2pdLCAwKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWRtLmNvcHAuYXBwX3R5cGVbaV1bal0sIDApOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC5hY2RiX2lkW2ldW2pdLCAwKTsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRoaXNfYWRtLmNvcHAud2FpdFtpXVtqXSk7Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FkbS5jb3BwLmFkbV9kZWxheV9zdGF0W2ldW2pdLCAwKTsKLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoCi0JCQkJJnRoaXNfYWRtLmNvcHAuYWRtX2RlbGF5X3dhaXRbaV1bal0pOwotCQkJYXRvbWljX3NldCgmdGhpc19hZG0uY29wcC50b3BvbG9neVtpXVtqXSwgMCk7Ci0JCQl0aGlzX2FkbS5jb3BwLmFkbV9kZWxheVtpXVtqXSA9IDA7Ci0JCQl0aGlzX2FkbS5jb3BwLmFkbV9zdGF0dXNbaV1bal0gPQotCQkJCUFETV9TVEFUVVNfQ0FMSUJSQVRJT05fUkVRVUlSRUQ7Ci0JCX0KLQl9Ci0KLQlpZiAoYWRtX2luaXRfY2FsX2RhdGEoKSkKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGluaXQgY2FsIGRhdGEhXG4iLCBfX2Z1bmNfXyk7Ci0KLQl0aGlzX2FkbS5zb3VyY2VUcmFja2luZ0RhdGEuaW9uX2NsaWVudCA9IE5VTEw7Ci0JdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLmlvbl9oYW5kbGUgPSBOVUxMOwotCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAuc2l6ZSA9IDA7Ci0JdGhpc19hZG0uc291cmNlVHJhY2tpbmdEYXRhLm1lbW1hcC5rdmFkZHIgPSBOVUxMOwotCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5tZW1tYXAucGFkZHIgPSAwOwotCXRoaXNfYWRtLnNvdXJjZVRyYWNraW5nRGF0YS5hcHJfY21kX3N0YXR1cyA9IC0xOwotCWF0b21pY19zZXQoJnRoaXNfYWRtLm1lbV9tYXBfaGFuZGxlc1tBRE1fTUVNX01BUF9JTkRFWF9TT1VSQ0VfVFJBQ0tJTkddLAotCQkgICAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWRtX2V4aXQodm9pZCkKLXsKLQlhZG1fZGVsZXRlX2NhbF9kYXRhKCk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChhZG1faW5pdCk7Ci1tb2R1bGVfZXhpdChhZG1fZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhZmUuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFmZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWNlOTQ3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFmZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE1MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KLSNpbmNsdWRlICJtc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlIDxzb3VuZC9hdWRpb19jYWxfdXRpbHMuaD4KLSNpbmNsdWRlIDxzb3VuZC9hZHNwX2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByX3RhbC5oPgotCi0jZGVmaW5lIFdBS0VMT0NLX1RJTUVPVVQJNTAwMAotZW51bSB7Ci0JQUZFX0NPTU1PTl9SWF9DQUwgPSAwLAotCUFGRV9DT01NT05fVFhfQ0FMLAotCUFGRV9BQU5DX0NBTCwKLQlBRkVfRkJfU1BLUl9QUk9UX0NBTCwKLQlBRkVfSFdfREVMQVlfQ0FMLAotCUFGRV9TSURFVE9ORV9DQUwsCi0JQUZFX1NJREVUT05FX0lJUl9DQUwsCi0JQUZFX1RPUE9MT0dZX0NBTCwKLQlBRkVfQ1VTVF9UT1BPTE9HWV9DQUwsCi0JQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUwsCi0JQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUwsCi0JTUFYX0FGRV9DQUxfVFlQRVMKLX07Ci0KLWVudW0gZmJzcF9zdGF0ZSB7Ci0JRkJTUF9JTkNPUlJFQ1RfT1BfTU9ERSwKLQlGQlNQX0lOQUNUSVZFLAotCUZCU1BfV0FSTVVQLAotCUZCU1BfSU5fUFJPR1JFU1MsCi0JRkJTUF9TVUNDRVNTLAotCUZCU1BfRkFJTEVELAotCU1BWF9GQlNQX1NUQVRFCi19OwotCi1zdGF0aWMgY2hhciBmYnNwX3N0YXRlW01BWF9GQlNQX1NUQVRFXVs1MF0gPSB7Ci0JW0ZCU1BfSU5DT1JSRUNUX09QX01PREVdID0gImluY29ycmVjdCBvcGVyYXRpb24gbW9kZSIsCi0JW0ZCU1BfSU5BQ1RJVkVdID0gInBvcnQgbm90IHN0YXJ0ZWQiLAotCVtGQlNQX1dBUk1VUF0gPSAid2FpdGluZyBmb3Igd2FybXVwIiwKLQlbRkJTUF9JTl9QUk9HUkVTU10gPSAiaW4gcHJvZ3Jlc3Mgc3RhdGUiLAotCVtGQlNQX1NVQ0NFU1NdID0gInN1Y2Nlc3MiLAotCVtGQlNQX0ZBSUxFRF0gPSAiZmFpbGVkIgotfTsKLQotZW51bSB7Ci0JVVNFX0NBTElCUkFURURfUjBUTywKLQlVU0VfU0FGRV9SMFRPCi19OwotCi1lbnVtIHsKLQlRVUlDS19DQUxJQl9ESVNBQkxFLAotCVFVSUNLX0NBTElCX0VOQUJMRQotfTsKLQotZW51bSB7Ci0JUTZBRkVfTVNNX1NQS1JfUFJPQ0VTU0lORyA9IDAsCi0JUTZBRkVfTVNNX1NQS1JfQ0FMSUJSQVRJT04sCi0JUTZBRkVfTVNNX1NQS1JfRlRNX01PREUKLX07Ci0KLXN0cnVjdCB3bG9jayB7Ci0Jc3RydWN0IHdha2V1cF9zb3VyY2Ugd3M7Ci19OwotCi1zdGF0aWMgc3RydWN0IHdsb2NrIHdsOwotCi1zdHJ1Y3QgYWZlX2N0bCB7Ci0Jdm9pZCAqYXByOwotCWF0b21pY190IHN0YXRlOwotCWF0b21pY190IHN0YXR1czsKLQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0W0FGRV9NQVhfUE9SVFNdOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl2b2lkICgqdHhfY2IpKHVpbnQzMl90IG9wY29kZSwKLQkJdWludDMyX3QgdG9rZW4sIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KTsKLQl2b2lkICgqcnhfY2IpKHVpbnQzMl90IG9wY29kZSwKLQkJdWludDMyX3QgdG9rZW4sIHVpbnQzMl90ICpwYXlsb2FkLCB2b2lkICpwcml2KTsKLQl2b2lkICp0eF9wcml2YXRlX2RhdGE7Ci0Jdm9pZCAqcnhfcHJpdmF0ZV9kYXRhOwotCXVpbnQzMl90IG1tYXBfaGFuZGxlOwotCi0JaW50CXRvcG9sb2d5W0FGRV9NQVhfUE9SVFNdOwotCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfZGF0YVtNQVhfQUZFX0NBTF9UWVBFU107Ci0KLQlhdG9taWNfdCBtZW1fbWFwX2NhbF9oYW5kbGVzW01BWF9BRkVfQ0FMX1RZUEVTXTsKLQlhdG9taWNfdCBtZW1fbWFwX2NhbF9pbmRleDsKLQl1MzIgYWZlX2NhbF9tb2RlW0FGRV9NQVhfUE9SVFNdOwotCi0JdTE2IGR0bWZfZ2VuX3J4X3BvcnRpZDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BrX3Byb3RfY2ZnCXByb3RfY2ZnOwotCXN0cnVjdCBhZmVfc3Brcl9wcm90X2NhbGliX2dldF9yZXNwCWNhbGliX2RhdGE7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NwX3RoX3ZpX2Z0bV9jZmcJdGhfZnRtX2NmZzsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc3BfZXhfdmlfZnRtX2NmZwlleF9mdG1fY2ZnOwotCXN0cnVjdCBhZmVfc3BfdGhfdmlfZ2V0X3BhcmFtX3Jlc3AJdGhfdmlfcmVzcDsKLQlzdHJ1Y3QgYWZlX3NwX2V4X3ZpX2dldF9wYXJhbV9yZXNwCWV4X3ZpX3Jlc3A7Ci0Jc3RydWN0IGFmZV9hdl9kZXZfZHJpZnRfZ2V0X3BhcmFtX3Jlc3AJYXZfZGV2X2RyaWZ0X3Jlc3A7Ci0JaW50IHZpX3R4X3BvcnQ7Ci0JaW50IHZpX3J4X3BvcnQ7Ci0JdWludDMyX3QgYWZlX3NhbXBsZV9yYXRlc1tBRkVfTUFYX1BPUlRTXTsKLQlzdHJ1Y3QgYWFuY19kYXRhIGFhbmNfaW5mbzsKLQlzdHJ1Y3QgbXV0ZXggYWZlX2NtZF9sb2NrOwotCWludCBzZXRfY3VzdG9tX3RvcG9sb2d5OwotCWludCBkZXZfYWNkYl9pZFtBRkVfTUFYX1BPUlRTXTsKLQlyb3V0aW5nX2NiIHJ0X2NiOwotfTsKLQotc3RhdGljIGF0b21pY190IGFmZV9wb3J0c19tYWRfdHlwZVtTTElNQlVTX1BPUlRfTEFTVCAtIFNMSU1CVVNfMF9SWF07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBhZmVfY29uZmlndXJlZF9jbWQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX2N0bCB0aGlzX2FmZTsKLQotI2RlZmluZSBUSU1FT1VUX01TIDEwMDAKLSNkZWZpbmUgUTZBRkVfTUFYX1ZPTFVNRSAweDNGRkYKLQotc3RhdGljIGludCBwY21fYWZlX2luc3RhbmNlWzJdOwotc3RhdGljIGludCBwcm94eV9hZmVfaW5zdGFuY2VbMl07Ci1ib29sIGFmZV9jbG9zZV9kb25lWzJdID0ge3RydWUsIHRydWV9OwotCi0jZGVmaW5lIFNJWkVPRl9DRkdfQ01EKHkpIFwKLQkJKHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKyBzaXplb2YodTE2KSArIChzaXplb2Yoc3RydWN0IHkpKSkKLQotc3RhdGljIGludCBhZmVfZ2V0X2NhbF9od19kZWxheShpbnQzMl90IHBhdGgsCi0JCQkJc3RydWN0IGF1ZGlvX2NhbF9od19kZWxheV9lbnRyeSAqZW50cnkpOwotc3RhdGljIGludCByZW1hcF9jYWxfZGF0YShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgaW50IGNhbF9pbmRleCk7Ci0KLWludCBhZmVfZ2V0X3RvcG9sb2d5KGludCBwb3J0X2lkKQotewotCWludCB0b3BvbG9neTsKLQlpbnQgcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQotCWlmICgocG9ydF9pbmRleCA8IDApIHx8IChwb3J0X2luZGV4ID49IEFGRV9NQVhfUE9SVFMpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpbmRleCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaW5kZXgpOwotCQl0b3BvbG9neSA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl0b3BvbG9neSA9IHRoaXNfYWZlLnRvcG9sb2d5W3BvcnRfaW5kZXhdOwotZG9uZToKLQlyZXR1cm4gdG9wb2xvZ3k7Ci19Ci0KLXZvaWQgYWZlX3NldF9hYW5jX2luZm8oc3RydWN0IGFhbmNfZGF0YSAqcTZfYWFuY19pbmZvKQotewotCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSA9IHE2X2FhbmNfaW5mby0+YWFuY19hY3RpdmU7Ci0JdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydCA9IHE2X2FhbmNfaW5mby0+YWFuY19yeF9wb3J0OwotCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnQgPSBxNl9hYW5jX2luZm8tPmFhbmNfdHhfcG9ydDsKLQotCXByX2RlYnVnKCIlczogYWFuYyBhY3RpdmUgaXMgJWQgcnggcG9ydCBpcyAweCV4LCB0eCBwb3J0IGlzIDB4JXhcbiIsCi0JCV9fZnVuY19fLAotCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19hY3RpdmUsCi0JCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnQsCi0JCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBhZmVfY2FsbGJhY2tfZGVidWdfcHJpbnQoc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSkKLXsKLQl1aW50MzJfdCAqcGF5bG9hZDsKLQotCXBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOwotCi0JaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA4KQotCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIFBMIzFbMHgleF0sIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCi0JCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCWVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+PSA0KQotCQlwcl9kZWJ1ZygiJXM6IGNvZGUgPSAweCV4IFBMIzBbMHgleF0sIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIHBheWxvYWRbMF0sCi0JCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCWVsc2UKLQkJcHJfZGVidWcoIiVzOiBjb2RlID0gMHgleCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGRhdGEtPm9wY29kZSwgZGF0YS0+cGF5bG9hZF9zaXplKTsKLX0KLQotc3RhdGljIHZvaWQgYXZfZGV2X2RyaWZ0X2FmZV9jYl9oYW5kbGVyKHVpbnQzMl90ICpwYXlsb2FkLAotCQkJCQl1aW50MzJfdCBwYXlsb2FkX3NpemUpCi17Ci0JdTMyIHBhcmFtX2lkOwotCXN0cnVjdCBhZmVfYXZfZGV2X2RyaWZ0X2dldF9wYXJhbV9yZXNwICpyZXNwID0KLQkJKHN0cnVjdCBhZmVfYXZfZGV2X2RyaWZ0X2dldF9wYXJhbV9yZXNwICopIHBheWxvYWQ7Ci0KLQlpZiAoISgmKHJlc3AtPnBkYXRhKSkpIHsKLQkJcHJfZXJyKCIlczogRXJyb3I6IHJlc3AgcGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcGFyYW1faWQgPSByZXNwLT5wZGF0YS5wYXJhbV9pZDsKLQlpZiAocGFyYW1faWQgPT0gQUZFX1BBUkFNX0lEX0RFVl9USU1JTkdfU1RBVFMpIHsKLQkJaWYgKHBheWxvYWRfc2l6ZSA8IHNpemVvZih0aGlzX2FmZS5hdl9kZXZfZHJpZnRfcmVzcCkpIHsKLQkJCXByX2VycigiJXM6IEVycm9yOiByZWNlaXZlZCBzaXplICVkLCByZXNwIHNpemUgJXp1XG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUsCi0JCQkJc2l6ZW9mKHRoaXNfYWZlLmF2X2Rldl9kcmlmdF9yZXNwKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWVtY3B5KCZ0aGlzX2FmZS5hdl9kZXZfZHJpZnRfcmVzcCwgcGF5bG9hZCwKLQkJCQlzaXplb2YodGhpc19hZmUuYXZfZGV2X2RyaWZ0X3Jlc3ApKTsKLQkJaWYgKCF0aGlzX2FmZS5hdl9kZXZfZHJpZnRfcmVzcC5zdGF0dXMpIHsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogYXZfZGV2X2RyaWZ0X3Jlc3Agc3RhdHVzOiAlZCIsIF9fZnVuY19fLAotCQkJCSAgdGhpc19hZmUuYXZfZGV2X2RyaWZ0X3Jlc3Auc3RhdHVzKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAtMSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHNwX21ha2VfYWZlX2NhbGxiYWNrKHVpbnQzMl90ICpwYXlsb2FkLCB1aW50MzJfdCBwYXlsb2FkX3NpemUpCi17Ci0JdTMyIHBhcmFtX2lkOwotCXN0cnVjdCBhZmVfc3Brcl9wcm90X2NhbGliX2dldF9yZXNwICpyZXNwID0KLQkJKHN0cnVjdCBhZmVfc3Brcl9wcm90X2NhbGliX2dldF9yZXNwICopIHBheWxvYWQ7Ci0KLQlpZiAoISgmKHJlc3AtPnBkYXRhKSkpIHsKLQkJcHJfZXJyKCIlczogRXJyb3I6IHJlc3AgcGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwYXJhbV9pZCA9IHJlc3AtPnBkYXRhLnBhcmFtX2lkOwotCWlmIChwYXJhbV9pZCA9PSBBRkVfUEFSQU1fSURfQ0FMSUJfUkVTX0NGR19WMikgewotCQlpZiAocGF5bG9hZF9zaXplIDwgc2l6ZW9mKHRoaXNfYWZlLmNhbGliX2RhdGEpKSB7Ci0JCQlwcl9lcnIoIiVzOiBFcnJvcjogcmVjZWl2ZWQgc2l6ZSAlZCwgY2FsaWJfZGF0YSBzaXplICV6dVxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZF9zaXplLAotCQkJCXNpemVvZih0aGlzX2FmZS5jYWxpYl9kYXRhKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQltZW1jcHkoJnRoaXNfYWZlLmNhbGliX2RhdGEsIHBheWxvYWQsCi0JCQlzaXplb2YodGhpc19hZmUuY2FsaWJfZGF0YSkpOwotCQlpZiAoIXRoaXNfYWZlLmNhbGliX2RhdGEuc3RhdHVzKSB7Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGNhbGliIHJlc3Agc3RhdHVzOiAlZCIsIF9fZnVuY19fLAotCQkJCSAgdGhpc19hZmUuY2FsaWJfZGF0YS5zdGF0dXMpOwotCQkJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIC0xKTsKLQkJfQotCX0KLQlpZiAocGFyYW1faWQgPT0gQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX0ZUTV9QQVJBTVMpIHsKLQkJaWYgKHBheWxvYWRfc2l6ZSA8IHNpemVvZih0aGlzX2FmZS50aF92aV9yZXNwKSkgewotCQkJcHJfZXJyKCIlczogRXJyb3I6IHJlY2VpdmVkIHNpemUgJWQsIHRoX3ZpX3Jlc3Agc2l6ZSAlenVcbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWRfc2l6ZSwKLQkJCQlzaXplb2YodGhpc19hZmUudGhfdmlfcmVzcCkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJbWVtY3B5KCZ0aGlzX2FmZS50aF92aV9yZXNwLCBwYXlsb2FkLAotCQkJc2l6ZW9mKHRoaXNfYWZlLnRoX3ZpX3Jlc3ApKTsKLQkJaWYgKCF0aGlzX2FmZS50aF92aV9yZXNwLnN0YXR1cykgewotCQkJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDApOwotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiB0aCB2aSByZXNwIHN0YXR1czogJWQiLCBfX2Z1bmNfXywKLQkJCQkgIHRoaXNfYWZlLnRoX3ZpX3Jlc3Auc3RhdHVzKTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAtMSk7Ci0JCX0KLQl9Ci0JaWYgKHBhcmFtX2lkID09IEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fUEFSQU1TKSB7Ci0JCWlmIChwYXlsb2FkX3NpemUgPCBzaXplb2YodGhpc19hZmUuZXhfdmlfcmVzcCkpIHsKLQkJCXByX2VycigiJXM6IEVycm9yOiByZWNlaXZlZCBzaXplICVkLCBleF92aV9yZXNwIHNpemUgJXp1XG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUsCi0JCQkJc2l6ZW9mKHRoaXNfYWZlLmV4X3ZpX3Jlc3ApKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCW1lbWNweSgmdGhpc19hZmUuZXhfdmlfcmVzcCwgcGF5bG9hZCwKLQkJCXNpemVvZih0aGlzX2FmZS5leF92aV9yZXNwKSk7Ci0JCWlmICghdGhpc19hZmUuZXhfdmlfcmVzcC5zdGF0dXMpIHsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogZXggdmkgcmVzcCBzdGF0dXM6ICVkIiwgX19mdW5jX18sCi0JCQkJICB0aGlzX2FmZS5leF92aV9yZXNwLnN0YXR1cyk7Ci0JCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgLTEpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IGFmZV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQotewotCWlmICghZGF0YSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7Ci0JCXByX2RlYnVnKCIlczogcmVzZXQgZXZlbnQgPSAlZCAlZCBhcHJbJXBLXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJZGF0YS0+cmVzZXRfZXZlbnQsIGRhdGEtPnJlc2V0X3Byb2MsIHRoaXNfYWZlLmFwcik7Ci0KLQkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoTUFYX0FGRV9DQUxfVFlQRVMsCi0JCQl0aGlzX2FmZS5jYWxfZGF0YSk7Ci0KLQkJLyogUmVzZXQgdGhlIGN1c3RvbSB0b3BvbG9neSBtb2RlOiB0byByZXNlbmQgYWdhaW4gdG8gQUZFLiAqLwotCQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfQ1VTVF9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKLQkJdGhpc19hZmUuc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7Ci0JCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0NVU1RfVE9QT0xPR1lfQ0FMXS0+bG9jayk7Ci0JCXJ0YWNfY2xlYXJfbWFwcGluZyhBRkVfUlRBQ19DQUwpOwotCi0JCWlmICh0aGlzX2FmZS5hcHIpIHsKLQkJCWFwcl9yZXNldCh0aGlzX2FmZS5hcHIpOwotCQkJYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDApOwotCQkJdGhpc19hZmUuYXByID0gTlVMTDsKLQkJCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKLQkJfQotCQkvKiBzZW5kIGluZm8gdG8gdXNlciAqLwotCQlpZiAodGhpc19hZmUudGFzayA9PSBOVUxMKQotCQkJdGhpc19hZmUudGFzayA9IGN1cnJlbnQ7Ci0JCXByX2RlYnVnKCIlczogdGFza19uYW1lID0gJXMgcGlkID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCXRoaXNfYWZlLnRhc2stPmNvbW0sIHRoaXNfYWZlLnRhc2stPnBpZCk7Ci0KLQkJLyoKLQkJICogUGFzcyByZXNldCBldmVudHMgdG8gcHJveHkgZHJpdmVyLCBpZiBjYiBpcyByZWdpc3RlcmVkCi0JCSAqLwotCQlpZiAodGhpc19hZmUudHhfY2IpIHsKLQkJCXRoaXNfYWZlLnR4X2NiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQkJCWRhdGEtPnBheWxvYWQsCi0JCQkJCXRoaXNfYWZlLnR4X3ByaXZhdGVfZGF0YSk7Ci0JCQl0aGlzX2FmZS50eF9jYiA9IE5VTEw7Ci0JCX0KLQkJaWYgKHRoaXNfYWZlLnJ4X2NiKSB7Ci0JCQl0aGlzX2FmZS5yeF9jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCQlkYXRhLT5wYXlsb2FkLAotCQkJCQl0aGlzX2FmZS5yeF9wcml2YXRlX2RhdGEpOwotCQkJdGhpc19hZmUucnhfY2IgPSBOVUxMOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWFmZV9jYWxsYmFja19kZWJ1Z19wcmludChkYXRhKTsKLQlpZiAoZGF0YS0+b3Bjb2RlID09IEFGRV9QT1JUX0NNRFJTUF9HRVRfUEFSQU1fVjIpIHsKLQkJdWludDMyX3QgKnBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOwotCi0JCWlmICghcGF5bG9hZCB8fCAoZGF0YS0+dG9rZW4gPj0gQUZFX01BWF9QT1JUUykpIHsKLQkJCXByX2VycigiJXM6IEVycm9yOiBzaXplICVkIHBheWxvYWQgJXBLIHRva2VuICVkXG4iLAotCQkJCV9fZnVuY19fLCBkYXRhLT5wYXlsb2FkX3NpemUsCi0JCQkJcGF5bG9hZCwgZGF0YS0+dG9rZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAocGF5bG9hZFsyXSA9PSBBRkVfUEFSQU1fSURfREVWX1RJTUlOR19TVEFUUykgewotCQkJYXZfZGV2X2RyaWZ0X2FmZV9jYl9oYW5kbGVyKGRhdGEtPnBheWxvYWQsCi0JCQkJCQkgICAgZGF0YS0+cGF5bG9hZF9zaXplKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChydGFjX21ha2VfYWZlX2NhbGxiYWNrKGRhdGEtPnBheWxvYWQsCi0JCQkJCQkgICBkYXRhLT5wYXlsb2FkX3NpemUpKQotCQkJCXJldHVybiAwOwotCi0JCQlpZiAoc3BfbWFrZV9hZmVfY2FsbGJhY2soZGF0YS0+cGF5bG9hZCwKLQkJCQkJCSBkYXRhLT5wYXlsb2FkX3NpemUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXdha2VfdXAoJnRoaXNfYWZlLndhaXRbZGF0YS0+dG9rZW5dKTsKLQl9IGVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSkgewotCQl1aW50MzJfdCAqcGF5bG9hZDsKLQkJdWludDE2X3QgcG9ydF9pZCA9IDA7Ci0KLQkJcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7Ci0JCWlmIChkYXRhLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKLQkJCXByX2RlYnVnKCIlczpvcGNvZGUgPSAweCV4IGNtZCA9IDB4JXggc3RhdHVzID0gMHgleCB0b2tlbj0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLAotCQkJCXBheWxvYWRbMF0sIHBheWxvYWRbMV0sIGRhdGEtPnRva2VuKTsKLQkJCS8qIHBheWxvYWRbMV0gY29udGFpbnMgdGhlIGVycm9yIHN0YXR1cyBmb3IgcmVzcG9uc2UgKi8KLQkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKLQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIHBheWxvYWRbMV0pOwotCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJCWNhc2UgQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjoKLQkJCQlpZiAocnRhY19tYWtlX2FmZV9jYWxsYmFjayhwYXlsb2FkLAotCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQotCQkJCQlyZXR1cm4gMDsKLQkJCWNhc2UgQUZFX1BPUlRfQ01EX0RFVklDRV9TVE9QOgotCQkJY2FzZSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUOgotCQkJY2FzZSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQ6Ci0JCQljYXNlIEFGRV9QU0VVRE9QT1JUX0NNRF9TVE9QOgotCQkJY2FzZSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKLQkJCWNhc2UgQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzoKLQkJCWNhc2UgQUZFX1NFUlZJQ0VfQ01EX1VOUkVHSVNURVJfUlRfUE9SVF9EUklWRVI6Ci0JCQljYXNlIEFGRV9QT1JUU19DTURfRFRNRl9DVEw6Ci0JCQljYXNlIEFGRV9TVkNfQ01EX1NFVF9QQVJBTToKLQkJCQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMCk7Ci0JCQkJd2FrZV91cCgmdGhpc19hZmUud2FpdFtkYXRhLT50b2tlbl0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRkVfU0VSVklDRV9DTURfUkVHSVNURVJfUlRfUE9SVF9EUklWRVI6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFGRV9QT1JUX0RBVEFfQ01EX1JUX1BST1hZX1BPUlRfV1JJVEVfVjI6Ci0JCQkJcG9ydF9pZCA9IFJUX1BST1hZX1BPUlRfMDAxX1RYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjI6Ci0JCQkJcG9ydF9pZCA9IFJUX1BST1hZX1BPUlRfMDAxX1JYOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBRkVfQ01EX0FERF9UT1BPTE9HSUVTOgotCQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKLQkJCQl3YWtlX3VwKCZ0aGlzX2FmZS53YWl0W2RhdGEtPnRva2VuXSk7Ci0JCQkJcHJfZGVidWcoIiVzOiBBRkVfQ01EX0FERF9UT1BPTE9HSUVTIGNtZCAweCV4XG4iLAotCQkJCQkJX19mdW5jX18sIHBheWxvYWRbMV0pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl9lcnIoIiVzOiBVbmtub3duIGNtZCAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCQkJCXBheWxvYWRbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PQotCQkJCUFGRV9TRVJWSUNFX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IG1tYXBfaGFuZGxlOiAweCV4LCBjYWwgaW5kZXggJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBwYXlsb2FkWzBdLAotCQkJCSBhdG9taWNfcmVhZCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpICE9IC0xKQotCQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLm1lbV9tYXBfY2FsX2hhbmRsZXNbCi0JCQkJCWF0b21pY19yZWFkKAotCQkJCQkmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgpXSwKLQkJCQkJKHVpbnQzMl90KXBheWxvYWRbMF0pOwotCQkJZWxzZQotCQkJCXRoaXNfYWZlLm1tYXBfaGFuZGxlID0gcGF5bG9hZFswXTsKLQkJCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAwKTsKLQkJCXdha2VfdXAoJnRoaXNfYWZlLndhaXRbZGF0YS0+dG9rZW5dKTsKLQkJfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gQUZFX0VWRU5UX1JUX1BST1hZX1BPUlRfU1RBVFVTKSB7Ci0JCQlwb3J0X2lkID0gKHVpbnQxNl90KSgweDAwMDBGRkZGICYgcGF5bG9hZFswXSk7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlzd2l0Y2ggKHBvcnRfaWQpIHsKLQkJY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9UWDogewotCQkJaWYgKHRoaXNfYWZlLnR4X2NiKSB7Ci0JCQkJdGhpc19hZmUudHhfY2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKLQkJCQkJZGF0YS0+cGF5bG9hZCwKLQkJCQkJdGhpc19hZmUudHhfcHJpdmF0ZV9kYXRhKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfUlg6IHsKLQkJCWlmICh0aGlzX2FmZS5yeF9jYikgewotCQkJCXRoaXNfYWZlLnJ4X2NiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQkJCWRhdGEtPnBheWxvYWQsCi0JCQkJCXRoaXNfYWZlLnJ4X3ByaXZhdGVfZGF0YSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlkZWZhdWx0OgotCQkJcHJfZGVidWcoIiVzOiBkZWZhdWx0IGNhc2UgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBhZmVfZ2V0X3BvcnRfdHlwZSh1MTYgcG9ydF9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwb3J0X2lkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19SWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6Ci0JY2FzZSBNSTJTX1JYOgotCWNhc2UgSERNSV9SWDoKLQljYXNlIERJU1BMQVlfUE9SVF9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NQRElGX1JYOgotCWNhc2UgU0xJTUJVU18wX1JYOgotCWNhc2UgU0xJTUJVU18xX1JYOgotCWNhc2UgU0xJTUJVU18yX1JYOgotCWNhc2UgU0xJTUJVU18zX1JYOgotCWNhc2UgU0xJTUJVU180X1JYOgotCWNhc2UgU0xJTUJVU181X1JYOgotCWNhc2UgU0xJTUJVU182X1JYOgotCWNhc2UgU0xJTUJVU183X1JYOgotCWNhc2UgU0xJTUJVU184X1JYOgotCWNhc2UgSU5UX0JUX1NDT19SWDoKLQljYXNlIElOVF9CVF9BMkRQX1JYOgotCWNhc2UgSU5UX0ZNX1JYOgotCWNhc2UgVk9JQ0VfUExBWUJBQ0tfVFg6Ci0JY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6Ci0JY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDoKLQljYXNlIEFVRElPX1BPUlRfSURfSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6Ci0JCXJldCA9IE1TTV9BRkVfUE9SVF9UWVBFX1JYOwotCQlicmVhazsKLQotCWNhc2UgUFJJTUFSWV9JMlNfVFg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOgotCWNhc2UgTUkyU19UWDoKLQljYXNlIERJR0lfTUlDX1RYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgotCWNhc2UgU0xJTUJVU18wX1RYOgotCWNhc2UgU0xJTUJVU18xX1RYOgotCWNhc2UgU0xJTUJVU18yX1RYOgotCWNhc2UgU0xJTUJVU18zX1RYOgotCWNhc2UgU0xJTUJVU180X1RYOgotCWNhc2UgU0xJTUJVU181X1RYOgotCWNhc2UgU0xJTUJVU182X1RYOgotCWNhc2UgU0xJTUJVU183X1RYOgotCWNhc2UgU0xJTUJVU184X1RYOgotCWNhc2UgSU5UX0ZNX1RYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgotCWNhc2UgSU5UX0JUX1NDT19UWDoKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQkJcmV0ID0gTVNNX0FGRV9QT1JUX1RZUEVfVFg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJV0FSTl9PTigxKTsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGlkID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3NpemVvZl9jZmdfY21kKHUxNiBwb3J0X2lkKQotewotCWludCByZXRfc2l6ZTsKLQotCXN3aXRjaCAocG9ydF9pZCkgewotCWNhc2UgUFJJTUFSWV9JMlNfUlg6Ci0JY2FzZSBQUklNQVJZX0kyU19UWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOgotCWNhc2UgTUkyU19SWDoKLQljYXNlIE1JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg6Ci0JCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX2kyc19jZmcpOwotCQlicmVhazsKLQljYXNlIEhETUlfUlg6Ci0JY2FzZSBESVNQTEFZX1BPUlRfUlg6Ci0JCXJldF9zaXplID0KLQkJU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX2hkbWlfbXVsdGlfY2hhbl9hdWRpb19jZmcpOwotCQlicmVhazsKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQljYXNlIFNMSU1CVVNfMF9UWDoKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQljYXNlIFNMSU1CVVNfMV9UWDoKLQljYXNlIFNMSU1CVVNfMl9SWDoKLQljYXNlIFNMSU1CVVNfMl9UWDoKLQljYXNlIFNMSU1CVVNfM19SWDoKLQljYXNlIFNMSU1CVVNfM19UWDoKLQljYXNlIFNMSU1CVVNfNF9SWDoKLQljYXNlIFNMSU1CVVNfNF9UWDoKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQljYXNlIFNMSU1CVVNfNV9UWDoKLQljYXNlIFNMSU1CVVNfNl9SWDoKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQljYXNlIFNMSU1CVVNfN19SWDoKLQljYXNlIFNMSU1CVVNfN19UWDoKLQljYXNlIFNMSU1CVVNfOF9SWDoKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQkJcmV0X3NpemUgPSBTSVpFT0ZfQ0ZHX0NNRChhZmVfcGFyYW1faWRfc2xpbWJ1c19jZmcpOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOgotCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOgotCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOgotCQlyZXRfc2l6ZSA9IFNJWkVPRl9DRkdfQ01EKGFmZV9wYXJhbV9pZF9wc2V1ZG9fcG9ydF9jZmcpOwotCQlicmVhazsKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOgotCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6Ci0JCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX3J0X3Byb3h5X3BvcnRfY2ZnKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6Ci0JCXJldF9zaXplID0gU0laRU9GX0NGR19DTUQoYWZlX3BhcmFtX2lkX3VzYl9hdWRpb19jZmcpOwotCQlicmVhazsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6Ci0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBkZWZhdWx0IGNhc2UgMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCQlyZXRfc2l6ZSA9IFNJWkVPRl9DRkdfQ01EKGFmZV9wYXJhbV9pZF9wY21fY2ZnKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXRfc2l6ZTsKLX0KLQotaW50IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCi0JCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOwotCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogYWZlX2Fwcl9zZW5kX3BrdCA6IHJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQgYWZlX2Fwcl9zZW5kX3BrdCh2b2lkICpkYXRhLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHdhaXQpCi0JCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsIGRhdGEpOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlmICh3YWl0KSB7Ci0JCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoKndhaXQsCi0JCQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwgX19mdW5jX18sCi0JCQkJCWFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAotCQkJCQkmdGhpc19hZmUuc3RhdHVzKSkpOwotCQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfSBlbHNlIGlmIChyZXQgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBwYWNrZXQgbm90IHRyYW5zbWl0dGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCS8qIGFwcl9zZW5kX3BrdCBjYW4gcmV0dXJuIDAgd2hlbiBub3RoaW5nIGlzIHRyYW5zbWl0dGVkICovCi0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc2VuZF9jYWxfYmxvY2sodTE2IHBvcnRfaWQsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludAkJCQkJCXJlc3VsdCA9IDA7Ci0JaW50CQkJCQkJaW5kZXggPSAwOwotCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZF9ub19wYXlsb2FkCWFmZV9jYWw7Ci0KLQlpZiAoIWNhbF9ibG9jaykgewotCQlwcl9kZWJ1ZygiJXM6IE5vIEFGRSBjYWwgdG8gc2VuZCFcbiIsIF9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKLQkJcHJfZGVidWcoIiVzOiBBRkUgY2FsIGhhcyBpbnZhbGlkIHNpemUhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYWZlX2NhbC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JYWZlX2NhbC5oZHIucGt0X3NpemUgPSBzaXplb2YoYWZlX2NhbCk7Ci0JYWZlX2NhbC5oZHIuc3JjX3BvcnQgPSAwOwotCWFmZV9jYWwuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JYWZlX2NhbC5oZHIudG9rZW4gPSBpbmRleDsKLQlhZmVfY2FsLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWFmZV9jYWwucGFyYW0ucG9ydF9pZCA9IHBvcnRfaWQ7Ci0JYWZlX2NhbC5wYXJhbS5wYXlsb2FkX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0JYWZlX2NhbC5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0KLQkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlhZmVfY2FsLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlhZmVfY2FsLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IEFGRSBjYWwgc2VudCBmb3IgZGV2aWNlIHBvcnQgPSAweCV4LCBjYWwgc2l6ZSA9ICV6ZCwgY2FsIGFkZHIgPSAweCVwS1xuIiwKLQkJX19mdW5jX18sIHBvcnRfaWQsCi0JCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCi0JcmVzdWx0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmYWZlX2NhbCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmVzdWx0KQotCQlwcl9lcnIoIiVzOiBBRkUgY2FsIGZvciBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJlc3VsdCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2N1c3RvbV90b3BvbG9neV9ibG9jayhzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKLXsKLQlpbnQJcmVzdWx0ID0gMDsKLQlpbnQJaW5kZXggPSAwOwotCXN0cnVjdCBjbWRfc2V0X3RvcG9sb2dpZXMgYWZlX2NhbDsKLQotCWlmICghY2FsX2Jsb2NrKSB7Ci0JCXByX2VycigiJXM6IE5vIEFGRSBTVkMgY2FsIHRvIHNlbmQhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKLQkJcHJfZXJyKCIlczogQUZFIFNWQyBjYWwgaGFzIGludmFsaWQgc2l6ZTogJXpkIVxuIiwKLQkJX19mdW5jX18sIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFmZV9jYWwuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFmZV9jYWwuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGFmZV9jYWwpOwotCWFmZV9jYWwuaGRyLnNyY19wb3J0ID0gMDsKLQlhZmVfY2FsLmhkci5kZXN0X3BvcnQgPSAwOwotCWFmZV9jYWwuaGRyLnRva2VuID0gaW5kZXg7Ci0JYWZlX2NhbC5oZHIub3Bjb2RlID0gQUZFX0NNRF9BRERfVE9QT0xPR0lFUzsKLQotCWFmZV9jYWwucGF5bG9hZF9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOwotCWFmZV9jYWwucGF5bG9hZF9hZGRyX2xzdyA9Ci0JCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JYWZlX2NhbC5wYXlsb2FkX2FkZHJfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JYWZlX2NhbC5tZW1fbWFwX2hhbmRsZSA9IGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCi0JcHJfZGVidWcoIiVzOmNtZF9pZDoweCV4IGNhbHNpemU6JXpkIG1lbW1hcF9oZGw6MHgleCBjYWxhZGRyOjB4JXBLIiwKLQkJX19mdW5jX18sIEFGRV9DTURfQUREX1RPUE9MT0dJRVMsIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSwKLQkJYWZlX2NhbC5tZW1fbWFwX2hhbmRsZSwgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCi0JcmVzdWx0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmYWZlX2NhbCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmVzdWx0KQotCQlwcl9lcnIoIiVzOiBBRkUgc2VuZCB0b3BvbG9neSBmb3IgY29tbWFuZCAweCV4IGZhaWxlZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBBRkVfQ01EX0FERF9UT1BPTE9HSUVTLCByZXN1bHQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgYWZlX3NlbmRfY3VzdG9tX3RvcG9sb2d5KHZvaWQpCi17Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICAgKmNhbF9ibG9jayA9IE5VTEw7Ci0JaW50IGNhbF9pbmRleCA9IEFGRV9DVVNUX1RPUE9MT0dZX0NBTDsKLQlpbnQgcmV0OwotCi0JaWYgKHRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfaW5kZXggJWQgbm90IGFsbG9jYXRlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0dXJuOwotCX0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKLQotCWlmICghdGhpc19hZmUuc2V0X2N1c3RvbV90b3BvbG9neSkKLQkJZ290byB1bmxvY2s7Ci0JdGhpc19hZmUuc2V0X2N1c3RvbV90b3BvbG9neSA9IDA7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jayh0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBjYWxfYmxvY2sgbm90IGZvdW5kISFcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBTZW5kaW5nIGNhbF9pbmRleCBjYWwgJWRcbiIsIF9fZnVuY19fLCBjYWxfaW5kZXgpOwotCi0JcmV0ID0gcmVtYXBfY2FsX2RhdGEoY2FsX2Jsb2NrLCBjYWxfaW5kZXgpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlyZXQgPSBhZmVfc2VuZF9jdXN0b21fdG9wb2xvZ3lfYmxvY2soY2FsX2Jsb2NrKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBObyBjYWwgc2VudCBmb3IgY2FsX2luZGV4ICVkISByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4LCByZXQpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcHJfZGVidWcoIiVzOnNlbnQgY3VzdG9tIHRvcG9sb2d5IGZvciBBRkVcbiIsIF9fZnVuY19fKTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotfQotCi1zdGF0aWMgaW50IGFmZV9zcGtfcmFtcF9kbl9jZmcoaW50IHBvcnQpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IGluZGV4ID0gMDsKLQlzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9jb25maWdfY29tbWFuZCBjb25maWc7Ci0KLQlpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydCkgIT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpIHsKLQkJcHJfZGVidWcoIiVzOiBwb3J0IGRvZXNuJ3QgbWF0Y2ggMHgleFxuIiwgX19mdW5jX18sIHBvcnQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgPT0gTVNNX1NQS1JfUFJPVF9ESVNBQkxFRCB8fAotCQkodGhpc19hZmUudmlfcnhfcG9ydCAhPSBwb3J0KSkgewotCQlwcl9kZWJ1ZygiJXM6IHNwa3IgcHJvdGVjdGlvbiBkaXNhYmxlZCBwb3J0IDB4JXggJWQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydCwgcmV0LCB0aGlzX2FmZS52aV9yeF9wb3J0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsIF9fZnVuY19fLCBwb3J0LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPQotCQlzaXplb2YoY29uZmlnKSAtIHNpemVvZihjb25maWcuaGRyKSAtIHNpemVvZihjb25maWcucGFyYW0pCi0JCS0gc2l6ZW9mKGNvbmZpZy5wcm90X2NvbmZpZyk7Ci0JY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1YyX1JYOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9GQlNQX1BUT05FX1JBTVBfQ0ZHOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gMDsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNvbmZpZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogcG9ydCA9IDB4JXggcGFyYW0gPSAweCV4IGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydCwgY29uZmlnLnBkYXRhLnBhcmFtX2lkLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCi0JCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7Ci0JCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JLyogZHNwIG5lZWRzIGF0bGVhc3QgMTVtcyB0byByYW1wIGRvd24gcGlsb3QgdG9uZSovCi0JdXNsZWVwX3JhbmdlKDE1MDAwLCAxNTAxMCk7Ci0JcmV0ID0gMDsKLWZhaWxfY21kOgotCXByX2RlYnVnKCIlczogY29uZmlnLnBkYXRhLnBhcmFtX2lkIDB4JXggc3RhdHVzICVkXG4iLAotCQlfX2Z1bmNfXywgY29uZmlnLnBkYXRhLnBhcmFtX2lkLCByZXQpOwotcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc3BrX3Byb3RfcHJlcGFyZShpbnQgc3JjX3BvcnQsIGludCBkc3RfcG9ydCwgaW50IHBhcmFtX2lkLAotCQl1bmlvbiBhZmVfc3Brcl9wcm90X2NvbmZpZyAqcHJvdF9jb25maWcpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IGluZGV4ID0gMDsKLQlzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9jb25maWdfY29tbWFuZCBjb25maWc7Ci0KLQltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwotCWlmICghcHJvdF9jb25maWcpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHNyY19wb3J0KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNyYyBwb3J0IDB4JXggcmV0ICVkIiwKLQkJCQlfX2Z1bmNfXywgc3JjX3BvcnQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChkc3RfcG9ydCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBkc3QgcG9ydCAweCV4IHJldCAlZCIsIF9fZnVuY19fLAotCQkJCWRzdF9wb3J0LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgoc3JjX3BvcnQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0Jc3dpdGNoIChwYXJhbV9pZCkgewotCWNhc2UgQUZFX1BBUkFNX0lEX0ZCU1BfTU9ERV9SWF9DRkc6Ci0JCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0ZCX1NQS1JfUFJPVF9WMl9SWDsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUEFSQU1fSURfRkVFREJBQ0tfUEFUSF9DRkc6Ci0JCXRoaXNfYWZlLnZpX3R4X3BvcnQgPSBzcmNfcG9ydDsKLQkJdGhpc19hZmUudmlfcnhfcG9ydCA9IGRzdF9wb3J0OwotCQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9GRUVEQkFDSzsKLQkJYnJlYWs7Ci0JLyoKLQkgKiBBRkVfUEFSQU1fSURfU1BLUl9DQUxJQl9WSV9QUk9DX0NGR19WMiBpcyBzYW1lIGFzCi0JICogQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX01PREVfQ0ZHCi0JICovCi0JY2FzZSBBRkVfUEFSQU1fSURfU1BLUl9DQUxJQl9WSV9QUk9DX0NGR19WMjoKLQljYXNlIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fQ0ZHOgotCQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9TUEVBS0VSX1BST1RFQ1RJT05fVjJfVEhfVkk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX01PREVfQ0ZHOgotCWNhc2UgQUZFX1BBUkFNX0lEX1NQX1YyX0VYX1ZJX0ZUTV9DRkc6Ci0JCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9FWF9WSTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZGVmYXVsdCBjYXNlIDB4JXhcbiIsIF9fZnVuY19fLCBwYXJhbV9pZCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKLQotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKLQljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQoc3JjX3BvcnQpOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihjb25maWcuaGRyKQotCQktIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IHBhcmFtX2lkOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wcm90X2NvbmZpZyk7Ci0JY29uZmlnLnByb3RfY29uZmlnID0gKnByb3RfY29uZmlnOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY29uZmlnKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0ID0gMHgleCBwYXJhbSA9IDB4JXggZmFpbGVkICVkXG4iLAotCQlfX2Z1bmNfXywgc3JjX3BvcnQsIHBhcmFtX2lkLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCi0JCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldCA9IDA7Ci1mYWlsX2NtZDoKLQlwcl9kZWJ1ZygiJXM6IGNvbmZpZy5wZGF0YS5wYXJhbV9pZCAweCV4IHN0YXR1cyAlZCAweCV4XG4iLAotCV9fZnVuY19fLCBjb25maWcucGRhdGEucGFyYW1faWQsIHJldCwgc3JjX3BvcnQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFmZV9zZW5kX2NhbF9zcGtyX3Byb3RfdHgoaW50IHBvcnRfaWQpCi17Ci0JdW5pb24gYWZlX3Nwa3JfcHJvdF9jb25maWcgYWZlX3Nwa19jb25maWc7Ci0KLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdID09IE5VTEwgfHwKLQkgICAgdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdID09IE5VTEwgfHwKLQkgICAgdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdID09IE5VTEwpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7Ci0JaWYgKCh0aGlzX2FmZS5wcm90X2NmZy5tb2RlICE9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQpICYmCi0JCSh0aGlzX2FmZS52aV90eF9wb3J0ID09IHBvcnRfaWQpKSB7Ci0JCWlmICh0aGlzX2FmZS5wcm90X2NmZy5tb2RlID09Ci0JCQlNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTKSB7Ci0JCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9Ci0JCQkJCVE2QUZFX01TTV9TUEtSX0NBTElCUkFUSU9OOwotCQkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcucXVpY2tfY2FsaWJfZmxhZyA9Ci0JCQkJCXRoaXNfYWZlLnByb3RfY2ZnLnF1aWNrX2NhbGliX2ZsYWc7Ci0JCX0gZWxzZSB7Ci0JCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9Ci0JCQkJCVE2QUZFX01TTV9TUEtSX1BST0NFU1NJTkc7Ci0JCX0KLQotCQlpZiAodGhpc19hZmUudGhfZnRtX2NmZy5tb2RlID09IE1TTV9TUEtSX1BST1RfSU5fRlRNX01PREUpCi0JCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5vcGVyYXRpb25fbW9kZSA9Ci0JCQkJCSAgICBRNkFGRV9NU01fU1BLUl9GVE1fTU9ERTsKLQkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcubWlub3JfdmVyc2lvbiA9IDE7Ci0JCWFmZV9zcGtfY29uZmlnLnZpX3Byb2NfY2ZnLnIwX2NhbGlfcTI0W1NQX1YyX1NQS1JfMV0gPQotCQkJKHVpbnQzMl90KSB0aGlzX2FmZS5wcm90X2NmZy5yMFtTUF9WMl9TUEtSXzFdOwotCQlhZmVfc3BrX2NvbmZpZy52aV9wcm9jX2NmZy5yMF9jYWxpX3EyNFtTUF9WMl9TUEtSXzJdID0KLQkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcucjBbU1BfVjJfU1BLUl8yXTsKLQkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcudDBfY2FsaV9xNltTUF9WMl9TUEtSXzFdID0KLQkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcudDBbU1BfVjJfU1BLUl8xXTsKLQkJYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmcudDBfY2FsaV9xNltTUF9WMl9TUEtSXzJdID0KLQkJCSh1aW50MzJfdCkgdGhpc19hZmUucHJvdF9jZmcudDBbU1BfVjJfU1BLUl8yXTsKLQkJaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgIT0gTVNNX1NQS1JfUFJPVF9OT1RfQ0FMSUJSQVRFRCkgewotCQkJc3RydWN0IGFzbV9zcGtyX2NhbGliX3ZpX3Byb2NfY2ZnICp2aV9wcm9jX2NmZzsKLQotCQkJdmlfcHJvY19jZmcgPSAmYWZlX3Nwa19jb25maWcudmlfcHJvY19jZmc7Ci0JCQl2aV9wcm9jX2NmZy0+cjBfdDBfc2VsZWN0aW9uX2ZsYWdbU1BfVjJfU1BLUl8xXSA9Ci0JCQkJCSAgICBVU0VfQ0FMSUJSQVRFRF9SMFRPOwotCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMl0gPQotCQkJCQkgICAgVVNFX0NBTElCUkFURURfUjBUTzsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBhc21fc3Brcl9jYWxpYl92aV9wcm9jX2NmZyAqdmlfcHJvY19jZmc7Ci0KLQkJCXZpX3Byb2NfY2ZnID0gJmFmZV9zcGtfY29uZmlnLnZpX3Byb2NfY2ZnOwotCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMV0gPQotCQkJCQkJCSAgICBVU0VfU0FGRV9SMFRPOwotCQkJdmlfcHJvY19jZmctPnIwX3QwX3NlbGVjdGlvbl9mbGFnW1NQX1YyX1NQS1JfMl0gPQotCQkJCQkJCSAgICBVU0VfU0FGRV9SMFRPOwotCQl9Ci0JCWlmIChhZmVfc3BrX3Byb3RfcHJlcGFyZShwb3J0X2lkLCAwLAotCQkJQUZFX1BBUkFNX0lEX1NQS1JfQ0FMSUJfVklfUFJPQ19DRkdfVjIsCi0JCQkJJmFmZV9zcGtfY29uZmlnKSkKLQkJCXByX2VycigiJXM6IFNQS1JfQ0FMSUJfVklfUFJPQ19DRkcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOwotCi0JbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKLQlpZiAoKHRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9PSBNU01fU1BLUl9QUk9UX0lOX0ZUTV9NT0RFKSAmJgotCSAgICAodGhpc19hZmUudmlfdHhfcG9ydCA9PSBwb3J0X2lkKSkgewotCQlhZmVfc3BrX2NvbmZpZy50aF92aV9mdG1fY2ZnLm1pbm9yX3ZlcnNpb24gPSAxOwotCQlhZmVfc3BrX2NvbmZpZy50aF92aV9mdG1fY2ZnLndhaXRfdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KLQkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcud2FpdF90aW1lW1NQX1YyX1NQS1JfMV07Ci0JCWFmZV9zcGtfY29uZmlnLnRoX3ZpX2Z0bV9jZmcud2FpdF90aW1lX21zW1NQX1YyX1NQS1JfMl0gPQotCQkJdGhpc19hZmUudGhfZnRtX2NmZy53YWl0X3RpbWVbU1BfVjJfU1BLUl8yXTsKLQkJYWZlX3Nwa19jb25maWcudGhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KLQkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8xXTsKLQkJYWZlX3Nwa19jb25maWcudGhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzJdID0KLQkJCXRoaXNfYWZlLnRoX2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8yXTsKLQotCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKLQkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9USF9WSV9GVE1fQ0ZHLAotCQkJCQkgJmFmZV9zcGtfY29uZmlnKSkKLQkJCXByX2VycigiJXM6IHRoIHZpIGZ0bSBjZmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXRoaXNfYWZlLnRoX2Z0bV9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7Ci0JfQotCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKLQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXS0+bG9jayk7Ci0JaWYgKCh0aGlzX2FmZS5leF9mdG1fY2ZnLm1vZGUgPT0gTVNNX1NQS1JfUFJPVF9JTl9GVE1fTU9ERSkgJiYKLQkgICAgKHRoaXNfYWZlLnZpX3R4X3BvcnQgPT0gcG9ydF9pZCkpIHsKLQkJYWZlX3Nwa19jb25maWcuZXhfdmlfbW9kZV9jZmcubWlub3JfdmVyc2lvbiA9IDE7Ci0JCWFmZV9zcGtfY29uZmlnLmV4X3ZpX21vZGVfY2ZnLm9wZXJhdGlvbl9tb2RlID0KLQkJCQkJCVE2QUZFX01TTV9TUEtSX0ZUTV9NT0RFOwotCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKLQkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9NT0RFX0NGRywKLQkJCQkJICZhZmVfc3BrX2NvbmZpZykpCi0JCQlwcl9lcnIoIiVzOiBleCB2aSBtb2RlIGNmZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCQlhZmVfc3BrX2NvbmZpZy5leF92aV9mdG1fY2ZnLm1pbm9yX3ZlcnNpb24gPSAxOwotCQlhZmVfc3BrX2NvbmZpZy5leF92aV9mdG1fY2ZnLndhaXRfdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KLQkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcud2FpdF90aW1lW1NQX1YyX1NQS1JfMV07Ci0JCWFmZV9zcGtfY29uZmlnLmV4X3ZpX2Z0bV9jZmcud2FpdF90aW1lX21zW1NQX1YyX1NQS1JfMl0gPQotCQkJdGhpc19hZmUuZXhfZnRtX2NmZy53YWl0X3RpbWVbU1BfVjJfU1BLUl8yXTsKLQkJYWZlX3Nwa19jb25maWcuZXhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzFdID0KLQkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8xXTsKLQkJYWZlX3Nwa19jb25maWcuZXhfdmlfZnRtX2NmZy5mdG1fdGltZV9tc1tTUF9WMl9TUEtSXzJdID0KLQkJCXRoaXNfYWZlLmV4X2Z0bV9jZmcuZnRtX3RpbWVbU1BfVjJfU1BLUl8yXTsKLQotCQlpZiAoYWZlX3Nwa19wcm90X3ByZXBhcmUocG9ydF9pZCwgMCwKLQkJCQkJIEFGRV9QQVJBTV9JRF9TUF9WMl9FWF9WSV9GVE1fQ0ZHLAotCQkJCQkgJmFmZV9zcGtfY29uZmlnKSkKLQkJCXByX2VycigiJXM6IGV4IHZpIGZ0bSBjZmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXRoaXNfYWZlLmV4X2Z0bV9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7Ci0JfQotCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdLT5sb2NrKTsKLQotfQotCi1zdGF0aWMgdm9pZCBhZmVfc2VuZF9jYWxfc3Brcl9wcm90X3J4KGludCBwb3J0X2lkKQotewotCXVuaW9uIGFmZV9zcGtyX3Byb3RfY29uZmlnIGFmZV9zcGtfY29uZmlnOwotCi0JaWYgKHRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOwotCi0JaWYgKHRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgIT0gTVNNX1NQS1JfUFJPVF9ESVNBQkxFRCAmJgotCQkodGhpc19hZmUudmlfcnhfcG9ydCA9PSBwb3J0X2lkKSkgewotCQlpZiAodGhpc19hZmUucHJvdF9jZmcubW9kZSA9PQotCQkJTVNNX1NQS1JfUFJPVF9DQUxJQlJBVElPTl9JTl9QUk9HUkVTUykKLQkJCWFmZV9zcGtfY29uZmlnLm1vZGVfcnhfY2ZnLm1vZGUgPQotCQkJCVE2QUZFX01TTV9TUEtSX0NBTElCUkFUSU9OOwotCQllbHNlCi0JCQlhZmVfc3BrX2NvbmZpZy5tb2RlX3J4X2NmZy5tb2RlID0KLQkJCQlRNkFGRV9NU01fU1BLUl9QUk9DRVNTSU5HOwotCQlhZmVfc3BrX2NvbmZpZy5tb2RlX3J4X2NmZy5taW5vcl92ZXJzaW9uID0gMTsKLQkJaWYgKGFmZV9zcGtfcHJvdF9wcmVwYXJlKHBvcnRfaWQsIDAsCi0JCQlBRkVfUEFSQU1fSURfRkJTUF9NT0RFX1JYX0NGRywKLQkJCSZhZmVfc3BrX2NvbmZpZykpCi0JCQlwcl9lcnIoIiVzOiBSWCBNT0RFX1ZJX1BST0NfQ0ZHIGZhaWxlZFxuIiwKLQkJCQkgICBfX2Z1bmNfXyk7Ci0JfQotCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2h3X2RlbGF5KHUxNiBwb3J0X2lkLCB1MzIgcmF0ZSkKLXsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2h3X2RlbGF5X2VudHJ5CQlkZWxheV9lbnRyeTsKLQlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQJY29uZmlnOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltZW1zZXQoJmRlbGF5X2VudHJ5LCAwLCBzaXplb2YoZGVsYXlfZW50cnkpKTsKLQlkZWxheV9lbnRyeS5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JaWYgKGFmZV9nZXRfcG9ydF90eXBlKHBvcnRfaWQpID09IE1TTV9BRkVfUE9SVF9UWVBFX1RYKQotCQlyZXQgPSBhZmVfZ2V0X2NhbF9od19kZWxheShUWF9ERVZJQ0UsICZkZWxheV9lbnRyeSk7Ci0JZWxzZSBpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpCi0JCXJldCA9IGFmZV9nZXRfY2FsX2h3X2RlbGF5KFJYX0RFVklDRSwgJmRlbGF5X2VudHJ5KTsKLQotCS8qCi0JICogSFcgZGVsYXkgaXMgb25seSB1c2VkIGZvciBJTVMgY2FsbHMgdG8gc3luYyBhdWRpbyB3aXRoIHZpZGVvCi0JICogSXQgaXMgb25seSBuZWVkZWQgZm9yIGRldmljZXMgJiBzYW1wbGUgcmF0ZXMgdXNlZCBmb3IgSU1TIHZpZGVvCi0JICogY2FsbHMuIFZhbHVlcyBhcmUgcmVjZWl2ZWQgZnJvbSBBQ0RCIGNhbGJyYXRpb24gZmlsZXMKLQkgKi8KLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZGVidWcoIiVzOiBkZWJ1ZzogSFcgZGVsYXkgaW5mbyBub3QgYXZhaWxhYmxlICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKLQljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKLQljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci50b2tlbiA9IGluZGV4OwotCi0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0RFVklDRV9IV19ERUxBWTsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcucG9ydCk7Ci0KLQljb25maWcucG9ydC5od19kZWxheS5kZWxheV9pbl91cyA9IGRlbGF5X2VudHJ5LmRlbGF5X3VzZWM7Ci0JY29uZmlnLnBvcnQuaHdfZGVsYXkuZGV2aWNlX2h3X2RlbGF5X21pbm9yX3ZlcnNpb24gPQotCQkJCUFGRV9BUElfVkVSU0lPTl9ERVZJQ0VfSFdfREVMQVk7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkUgaHcgZGVsYXkgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4IHJhdGUgJXUgZGVsYXlfdXNlYyAlZCBzdGF0dXMgJWRcbiIsCi0JX19mdW5jX18sIHBvcnRfaWQsIHJhdGUsIGRlbGF5X2VudHJ5LmRlbGF5X3VzZWMsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWZlX2ZpbmRfY2FsX3RvcG9faWRfYnlfcG9ydCgKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwgdTE2IHBvcnRfaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZAkJKnB0ciwgKm5leHQ7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhCSpjYWxfYmxvY2sgPSBOVUxMOwotCWludDMyX3QgcGF0aDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcCAqYWZlX3RvcDsKLQlpbnQgYWZlX3BvcnRfaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCi0JaWYgKGFmZV9wb3J0X2luZGV4IDwgMCkKLQkJZ290byBlcnJfZXhpdDsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsCi0JCSZjYWxfdHlwZS0+Y2FsX2Jsb2NrcykgewotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0KLQkJcGF0aCA9ICgoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0KLQkJCU1TTV9BRkVfUE9SVF9UWVBFX1RYKT8oVFhfREVWSUNFKTooUlhfREVWSUNFKSk7Ci0JCWFmZV90b3AgPQotCQkoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2FmZV90b3AgKiljYWxfYmxvY2stPmNhbF9pbmZvOwotCQlpZiAoYWZlX3RvcC0+cGF0aCA9PSBwYXRoKSB7Ci0JCQlpZiAodGhpc19hZmUuZGV2X2FjZGJfaWRbYWZlX3BvcnRfaW5kZXhdID4gMCkgewotCQkJCWlmIChhZmVfdG9wLT5hY2RiX2lkID09Ci0JCQkJICAgIHRoaXNfYWZlLmRldl9hY2RiX2lkW2FmZV9wb3J0X2luZGV4XSkgewotCQkJCQlwcl9kZWJ1ZygiJXM6IHRvcF9pZDoleCBhY2RiX2lkOiVkIGFmZV9wb3J0X2lkOiVkXG4iLAotCQkJCQkJIF9fZnVuY19fLCBhZmVfdG9wLT50b3BvbG9neSwKLQkJCQkJCSBhZmVfdG9wLT5hY2RiX2lkLAotCQkJCQkJIHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCkpOwotCQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcHJfZGVidWcoIiVzOiB0b3BfaWQ6JXggYWNkYl9pZDolZCBhZmVfcG9ydDolZFxuIiwKLQkJCQkgX19mdW5jX18sIGFmZV90b3AtPnRvcG9sb2d5LCBhZmVfdG9wLT5hY2RiX2lkLAotCQkJCSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpKTsKLQkJCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQkJfQotCQl9Ci0JfQotCi1lcnJfZXhpdDoKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBhZmVfZ2V0X2NhbF90b3BvbG9neV9pZCh1MTYgcG9ydF9pZCwgdTMyICp0b3BvbG9neV9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAgICpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19jYWxfaW5mb19hZmVfdG9wICAgKmFmZV90b3BfaW5mbyA9IE5VTEw7Ci0KLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX1RPUE9MT0dZX0NBTF0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBbQUZFX1RPUE9MT0dZX0NBTF0gbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodG9wb2xvZ3lfaWQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB0b3BvbG9neV9pZCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkqdG9wb2xvZ3lfaWQgPSAwOwotCi0JbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX1RPUE9MT0dZX0NBTF0tPmxvY2spOwotCWNhbF9ibG9jayA9IGFmZV9maW5kX2NhbF90b3BvX2lkX2J5X3BvcnQoCi0JCXRoaXNfYWZlLmNhbF9kYXRhW0FGRV9UT1BPTE9HWV9DQUxdLCBwb3J0X2lkKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogW0FGRV9UT1BPTE9HWV9DQUxdIG5vdCBpbml0aWFsaXplZCBmb3IgdGhpcyBwb3J0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JYWZlX3RvcF9pbmZvID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlX3RvcCAqKQotCQljYWxfYmxvY2stPmNhbF9pbmZvKTsKLQlpZiAoIWFmZV90b3BfaW5mby0+dG9wb2xvZ3kpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCB0b3BvbG9neSBpZCA6IFslZCwgJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFmZV90b3BfaW5mby0+YWNkYl9pZCwgYWZlX3RvcF9pbmZvLT50b3BvbG9neSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQkqdG9wb2xvZ3lfaWQgPSAodTMyKWFmZV90b3BfaW5mby0+dG9wb2xvZ3k7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgPSAldSBhY2RiX2lkID0gJWQgdG9wb2xvZ3lfaWQgPSAldSByZXQ9JWRcbiIsCi0JCV9fZnVuY19fLCBwb3J0X2lkLCBhZmVfdG9wX2luZm8tPmFjZGJfaWQsCi0JCWFmZV90b3BfaW5mby0+dG9wb2xvZ3ksIHJldCk7Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfVE9QT0xPR1lfQ0FMXS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc2VuZF9wb3J0X3RvcG9sb2d5X2lkKHUxNiBwb3J0X2lkKQotewotCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZAljb25maWc7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgdG9wb2xvZ3lfaWQgPSAwOwotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX2dldF9jYWxfdG9wb2xvZ3lfaWQocG9ydF9pZCwgJnRvcG9sb2d5X2lkKTsKLQlpZiAocmV0IHx8ICF0b3BvbG9neV9pZCkgewotCQlwcl9kZWJ1ZygiJXM6IEFGRSBwb3J0WyVkXSBnZXRfY2FsX3RvcG9sb2d5WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgdG9wb2xvZ3lfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKLQotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKLQljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCi0JCQkJICAgIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCAgID0gQUZFX1BBUkFNX0lEX1NFVF9UT1BPTE9HWTsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY29uZmlnLnBvcnQpOwotCWNvbmZpZy5wb3J0LnRvcG9sb2d5Lm1pbm9yX3ZlcnNpb24gPSBBRkVfQVBJX1ZFUlNJT05fVE9QT0xPR1lfVjE7Ci0JY29uZmlnLnBvcnQudG9wb2xvZ3kudG9wb2xvZ3lfaWQgPSB0b3BvbG9neV9pZDsKLQotCXByX2RlYnVnKCIlczogcGFyYW0gUEwgc2l6ZT0lZCBpcGFyYW1fc2l6ZVslZF1bJXpkICV6ZCAlemQgJXpkXSBwYXJhbV9pZFsweCV4XVxuIiwKLQkJX19mdW5jX18sIGNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUsIGNvbmZpZy5wZGF0YS5wYXJhbV9zaXplLAotCQlzaXplb2YoY29uZmlnKSwgc2l6ZW9mKGNvbmZpZy5wYXJhbSksIHNpemVvZihjb25maWcucG9ydCksCi0JCXNpemVvZihzdHJ1Y3QgYXByX2hkciksIGNvbmZpZy5wZGF0YS5wYXJhbV9pZCk7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkUgc2V0IHRvcG9sb2d5IGlkIGVuYWJsZSBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdGhpc19hZmUudG9wb2xvZ3lbaW5kZXhdID0gdG9wb2xvZ3lfaWQ7Ci0JcnRhY191cGRhdGVfYWZlX3RvcG9sb2d5KHBvcnRfaWQpOwotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IEFGRSBzZXQgdG9wb2xvZ3kgaWQgMHgleCAgZW5hYmxlIGZvciBwb3J0IDB4JXggcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHRvcG9sb2d5X2lkLCBwb3J0X2lkLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludCByZW1hcF9jYWxfZGF0YShzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaywgaW50IGNhbF9pbmRleCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLmlvbl9jbGllbnQgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBObyBJT04gYWxsb2NhdGlvbiBmb3IgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKLQkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7Ci0JCWF0b21pY19zZXQoJnRoaXNfYWZlLm1lbV9tYXBfY2FsX2luZGV4LCBjYWxfaW5kZXgpOwotCQlyZXQgPSBhZmVfY21kX21lbW9yeV9tYXAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKLQkJYXRvbWljX3NldCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgsIC0xKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkIHJldCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCByZXQpOwotCQkJcHJfZGVidWcoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gYXRvbWljX3JlYWQoJnRoaXNfYWZlLgotCQkJbWVtX21hcF9jYWxfaGFuZGxlc1tjYWxfaW5kZXhdKTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmFmZV9maW5kX2NhbChpbnQgY2FsX2luZGV4LCBpbnQgcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYWZlICphZmVfY2FsX2luZm8gPSBOVUxMOwotCWludCBhZmVfcG9ydF9pbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNhbF9pbmRleCAlZCBwb3J0X2lkICVkIHBvcnRfaW5kZXggJWRcbiIsIF9fZnVuY19fLAotCQkgIGNhbF9pbmRleCwgcG9ydF9pZCwgYWZlX3BvcnRfaW5kZXgpOwotCWlmIChhZmVfcG9ydF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgZ2V0dGluZyBBRkUgcG9ydCBpbmRleCAlZFxuIiwKLQkJCV9fZnVuY19fLCBhZmVfcG9ydF9pbmRleCk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkJICAgJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmNhbF9ibG9ja3MpIHsKLQkJY2FsX2Jsb2NrID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0JCWFmZV9jYWxfaW5mbyA9IGNhbF9ibG9jay0+Y2FsX2luZm87Ci0JCWlmICgoYWZlX2NhbF9pbmZvLT5hY2RiX2lkID09Ci0JCSAgICAgdGhpc19hZmUuZGV2X2FjZGJfaWRbYWZlX3BvcnRfaW5kZXhdKSAmJgotCQkgICAgKGFmZV9jYWxfaW5mby0+c2FtcGxlX3JhdGUgPT0KLQkJICAgICB0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW2FmZV9wb3J0X2luZGV4XSkpIHsKLQkJCXByX2RlYnVnKCIlczogY2FsIGJsb2NrIGlzIGEgbWF0Y2gsIHNpemUgaXMgJXpkXG4iLAotCQkJCSBfX2Z1bmNfXywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQlwcl9lcnIoIiVzOiBubyBtYXRjaGluZyBjYWxfYmxvY2sgZm91bmRcbiIsIF9fZnVuY19fKTsKLQljYWxfYmxvY2sgPSBOVUxMOwotCi1leGl0OgotCXJldHVybiBjYWxfYmxvY2s7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlbmRfYWZlX2NhbF90eXBlKGludCBjYWxfaW5kZXgsIGludCBwb3J0X2lkKQotewotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YQkJKmNhbF9ibG9jayA9IE5VTEw7Ci0JaW50IHJldDsKLQlpbnQgYWZlX3BvcnRfaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkgewotCQlwcl93YXJuKCIlczogY2FsX2luZGV4ICVkIG5vdCBhbGxvY2F0ZWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYWZlX3BvcnRfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGdldHRpbmcgQUZFIHBvcnQgaW5kZXggJWRcbiIsCi0JCQlfX2Z1bmNfXywgYWZlX3BvcnRfaW5kZXgpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Ci0KLQlpZiAoKChjYWxfaW5kZXggPT0gQUZFX0NPTU1PTl9SWF9DQUwpIHx8Ci0JICAgICAoY2FsX2luZGV4ID09IEFGRV9DT01NT05fVFhfQ0FMKSkgJiYKLQkgICAgKHRoaXNfYWZlLmRldl9hY2RiX2lkW2FmZV9wb3J0X2luZGV4XSA+IDApKQotCQljYWxfYmxvY2sgPSBhZmVfZmluZF9jYWwoY2FsX2luZGV4LCBwb3J0X2lkKTsKLQllbHNlCi0JCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCi0JCQkJdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSk7Ci0KLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlcyBjYWxfYmxvY2sgbm90IGZvdW5kISFcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBTZW5kaW5nIGNhbF9pbmRleCBjYWwgJWRcbiIsIF9fZnVuY19fLCBjYWxfaW5kZXgpOwotCi0JcmV0ID0gcmVtYXBfY2FsX2RhdGEoY2FsX2Jsb2NrLCBjYWxfaW5kZXgpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlyZXQgPSBhZmVfc2VuZF9jYWxfYmxvY2socG9ydF9pZCwgY2FsX2Jsb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZGVidWcoIiVzOiBObyBjYWwgc2VudCBmb3IgY2FsX2luZGV4ICVkLCBwb3J0X2lkID0gMHgleCEgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcG9ydF9pZCwgcmV0KTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm47Ci19Ci0KLXZvaWQgYWZlX3NlbmRfY2FsKHUxNiBwb3J0X2lkKQotewotCXByX2RlYnVnKCIlczogcG9ydF9pZD0weCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfVFgpIHsKLQkJYWZlX3NlbmRfY2FsX3Nwa3JfcHJvdF90eChwb3J0X2lkKTsKLQkJc2VuZF9hZmVfY2FsX3R5cGUoQUZFX0NPTU1PTl9UWF9DQUwsIHBvcnRfaWQpOwotCX0gZWxzZSBpZiAoYWZlX2dldF9wb3J0X3R5cGUocG9ydF9pZCkgPT0gTVNNX0FGRV9QT1JUX1RZUEVfUlgpIHsKLQkJYWZlX3NlbmRfY2FsX3Nwa3JfcHJvdF9yeChwb3J0X2lkKTsKLQkJc2VuZF9hZmVfY2FsX3R5cGUoQUZFX0NPTU1PTl9SWF9DQUwsIHBvcnRfaWQpOwotCX0KLX0KLQotaW50IGFmZV90dXJuX29ub2ZmX2h3X21hZCh1MTYgbWFkX3R5cGUsIHUxNiBlbmFibGUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWZlX2NtZF9od19tYWRfY3RybCBjb25maWc7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gU0xJTUJVU181X1RYOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQkJCSAgICBzaXplb2YoY29uZmlnLnBhcmFtKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfSFdfTUFEOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9IV19NQURfQ1RSTDsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcucGF5bG9hZCk7Ci0JY29uZmlnLnBheWxvYWQubWlub3JfdmVyc2lvbiA9IDE7Ci0JY29uZmlnLnBheWxvYWQubWFkX3R5cGUgPSBtYWRfdHlwZTsKLQljb25maWcucGF5bG9hZC5tYWRfZW5hYmxlID0gZW5hYmxlOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9IV19NQURfQ1RSTCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfY2ZnKAotCXN0cnVjdCBhZmVfcGFyYW1fY2RjX3NsaW1idXNfc2xhdmVfY2ZnICpzYl9zbGF2ZV9jZmcpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2Jfc2xhdmVfY2ZnIGNvbmZpZzsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKLQljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9DRENfU0xJTUJVU19TTEFWRV9DRkc7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPQotCSAgICBzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9jZGNfc2xpbWJ1c19zbGF2ZV9jZmcpOwotCWNvbmZpZy5zYl9zbGF2ZV9jZmcgPSAqc2Jfc2xhdmVfY2ZnOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9DRENfU0xJTUJVU19TTEFWRV9DRkcgZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGxlYXZlICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2NvZGVjX3JlZ19wYWdlX2NvbmZpZygKLQlzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcgKmNkY19yZWdfcGFnZV9jZmcpCi17Ci0Jc3RydWN0IGFmZV9zdmNfY21kX2NkY19yZWdfcGFnZV9jZmcgY29uZmlnOwotCWludCByZXQ7Ci0KLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCi0JCQkJICAgIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9DRENfREVWX0NGRzsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0RDX1JFR19QQUdFX0NGRzsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9Ci0JICAgIHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfcGFnZV9jZmcpOwotCWNvbmZpZy5jZGNfcmVnX3BhZ2VfY2ZnID0gKmNkY19yZWdfcGFnZV9jZmc7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W0lEWF9HTE9CQUxfQ0ZHXSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19SRUdfUEFHRV9DRkcgZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2NvZGVjX3JlZ19jb25maWcoCi0Jc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19kYXRhICpjZGNfcmVnX2NmZykKLXsKLQlpbnQgaSwgaiwgcmV0ID0gLUVJTlZBTDsKLQlpbnQgcGt0X3NpemUsIHBheWxvYWRfc2l6ZSwgcmVnX3Blcl9wa3QsIG51bV9wa3RzLCBudW1fcmVnczsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfY2RjX3JlZ19jZmcgKmNvbmZpZzsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X3BhcmFtICpwYXJhbTsKLQotCXJlZ19wZXJfcGt0ID0gKEFQUl9NQVhfQlVGIC0gc2l6ZW9mKCpjb25maWcpKSAvCi0JCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9jZGNfcmVnX2NmZ19wYXlsb2FkKTsKLQlpZiAocmVnX3Blcl9wa3QgPiAwKSB7Ci0JCW51bV9wa3RzID0gKGNkY19yZWdfY2ZnLT5udW1fcmVnaXN0ZXJzIC8gcmVnX3Blcl9wa3QpICsKLQkJCShjZGNfcmVnX2NmZy0+bnVtX3JlZ2lzdGVycyAlIHJlZ19wZXJfcGt0ID09IDAgPyAwIDogMSk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGJ1aWxkIGNvZGVjIHJlZyBjb25maWcgQVBSIHBhY2tldFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChqID0gMDsgaiA8IG51bV9wa3RzOyArK2opIHsKLQkJLyoKLQkJICogbnVtX3JlZ3MgaXMgc2V0IHRvIHJlZ19wZXJfcGt0IG9uIGVhY2ggcGFzcyB0aHJvdWdoIHRoZSBsb29wCi0JCSAqIGV4Y2VwdCB0aGUgbGFzdCwgd2hlbiBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiByZWdpc3RlcnMKLQkJICogcmVtYWluaW5nIGZyb20gdGhlIHRvdGFsCi0JCSAqLwotCQludW1fcmVncyA9IChqIDwgKG51bV9wa3RzIC0gMSkgPyByZWdfcGVyX3BrdCA6Ci0JCQkJY2RjX3JlZ19jZmctPm51bV9yZWdpc3RlcnMgLSAocmVnX3Blcl9wa3QgKiBqKSk7Ci0JCXBheWxvYWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2NkY19yZWdfY2ZnX3BheWxvYWQpICoKLQkJCQludW1fcmVnczsKLQkJcGt0X3NpemUgPSBzaXplb2YoKmNvbmZpZykgKyBwYXlsb2FkX3NpemU7Ci0JCXByX2RlYnVnKCIlczogcGt0X3NpemUgJWQsIHBheWxvYWRfc2l6ZSAlZFxuIiwgX19mdW5jX18sCi0JCQkgcGt0X3NpemUsIHBheWxvYWRfc2l6ZSk7Ci0JCWNvbmZpZyA9IGt6YWxsb2MocGt0X3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNvbmZpZykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWNvbmZpZy0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQkgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJICAgICAgQVBSX1BLVF9WRVIpOwotCQljb25maWctPmhkci5wa3Rfc2l6ZSA9IHBrdF9zaXplOwotCQljb25maWctPmhkci5zcmNfcG9ydCA9IDA7Ci0JCWNvbmZpZy0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JCWNvbmZpZy0+aGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JCWNvbmZpZy0+aGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKLQotCQlwYXJhbSA9ICZjb25maWctPnBhcmFtOwotCQlwYXJhbS0+cGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplOwotCQlwYXJhbS0+cGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JCXBhcmFtLT5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQkJcGFyYW0tPm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ3M7IGkrKykgewotCQkJY29uZmlnLT5yZWdfZGF0YVtpXS5jb21tb24ubW9kdWxlX2lkID0KLQkJCQkJCUFGRV9NT0RVTEVfQ0RDX0RFVl9DRkc7Ci0JCQljb25maWctPnJlZ19kYXRhW2ldLmNvbW1vbi5wYXJhbV9pZCA9Ci0JCQkJCQlBRkVfUEFSQU1fSURfQ0RDX1JFR19DRkc7Ci0JCQljb25maWctPnJlZ19kYXRhW2ldLmNvbW1vbi5wYXJhbV9zaXplID0KLQkJCSAgICBzaXplb2YoY29uZmlnLT5yZWdfZGF0YVtpXS5yZWdfY2ZnKTsKLQkJCWNvbmZpZy0+cmVnX2RhdGFbaV0ucmVnX2NmZyA9Ci0JCQkJY2RjX3JlZ19jZmctPnJlZ19kYXRhW2kgKyAoaiAqIHJlZ19wZXJfcGt0KV07Ci0JCX0KLQotCQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KGNvbmZpZywgJnRoaXNfYWZlLndhaXRbSURYX0dMT0JBTF9DRkddKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWtmcmVlKGNvbmZpZyk7Ci0JCQlicmVhazsKLQkJfQotCQlrZnJlZShjb25maWcpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWZlX2luaXRfY2RjX3JlZ19jb25maWcodm9pZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhZmVfc3ZjX2NtZF9pbml0X2NkY19yZWdfY2ZnIGNvbmZpZzsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07Ci0KLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0KLQljb25maWcuaW5pdC5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOwotCWNvbmZpZy5pbml0LnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NEQ19SRUdfQ0ZHX0lOSVQ7Ci0JY29uZmlnLmluaXQucGFyYW1fc2l6ZSA9IDA7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W0lEWF9HTE9CQUxfQ0ZHXSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkVfUEFSQU1fSURfQ0RDX0lOSVRfUkVHX0NGRyBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcoCi0Jc3RydWN0IGFmZV9wYXJhbV9zbGltYnVzX3NsYXZlX3BvcnRfY2ZnICpwb3J0X2NvbmZpZywgdTE2IHBvcnRfaWQpCi17Ci0JaW50IHJldCwgaW5kZXg7Ci0Jc3RydWN0IGFmZV9jbWRfaHdfbWFkX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcgY29uZmlnOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlciwgcG9ydF9pZCA9ICAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0IGlkID0gMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcG9ydF9pZDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0hXX01BRDsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU0xJTUJVU19TTEFWRV9QT1JUX0NGRzsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZigqcG9ydF9jb25maWcpOwotCWNvbmZpZy5zYl9wb3J0X2NmZyA9ICpwb3J0X2NvbmZpZzsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRV9QQVJBTV9JRF9TTElNQlVTX1NMQVZFX1BPUlRfQ0ZHIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGxlYXZlICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIGludCBhZmVfYWFuY19wb3J0X2NmZyh2b2lkICphcHIsIHVpbnQxNl90IHR4X3BvcnQsIHVpbnQxNl90IHJ4X3BvcnQpCi17Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfYWFuY19wYXJhbSBjZmc7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQotCXByX2RlYnVnKCIlczogdHhfcG9ydCAweCV4LCByeF9wb3J0IDB4JXhcbiIsCi0JCV9fZnVuY19fLCB0eF9wb3J0LCByeF9wb3J0KTsKLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgodHhfcG9ydCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHR4X3BvcnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgdHhfcG9ydCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogQUFOQyBzYW1wbGUgcmF0ZSB0eCByYXRlOiAlZCByeCByYXRlICVkXG4iLAotCQlfX2Z1bmNfXywgdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydF9zYW1wbGVfcmF0ZSwKLQkgICAgICAgdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydF9zYW1wbGVfcmF0ZSk7Ci0JLyoKLQkgKiBJZiBhYW5jIHR4IHNhbXBsZSByYXRlIG9yIHJ4IHNhbXBsZSByYXRlIGlzIHplcm8sIHNraXAgYWFuYwotCSAqIGNvbmZpZ3VyYXRpb24gYXMgQUZFIHJlc2FtcGxlciB3aWxsIGZhaWwgZm9yIGludmFsaWQgc2FtcGxlCi0JICogcmF0ZXMuCi0JICovCi0JaWYgKCF0aGlzX2FmZS5hYW5jX2luZm8uYWFuY190eF9wb3J0X3NhbXBsZV9yYXRlIHx8Ci0JICAgICF0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0X3NhbXBsZV9yYXRlKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNmZyk7Ci0JY2ZnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNmZy5oZHIudG9rZW4gPSBpbmRleDsKLQljZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0KLQljZmcucGFyYW0ucG9ydF9pZCA9IHR4X3BvcnQ7Ci0JY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSAgICAgICAgPSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcGFyYW1fYWFuY19wb3J0X2NmZyk7Ci0JY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgICAgID0gMDsKLQljZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyAgICAgPSAwOwotCWNmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZQkgID0gMDsKLQotCWNmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FBTkM7Ci0JY2ZnLnBkYXRhLnBhcmFtX2lkICAgID0gQUZFX1BBUkFNX0lEX0FBTkNfUE9SVF9DT05GSUc7Ci0JY2ZnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9hYW5jX3BvcnRfY2ZnKTsKLQljZmcucGRhdGEucmVzZXJ2ZWQgICAgPSAwOwotCi0JY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy5hYW5jX3BvcnRfY2ZnX21pbm9yX3ZlcnNpb24gPQotCQlBRkVfQVBJX1ZFUlNJT05fQUFOQ19QT1JUX0NPTkZJRzsKLQljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfc2FtcGxlX3JhdGUgPQotCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY190eF9wb3J0X3NhbXBsZV9yYXRlOwotCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFswXSA9IEFBTkNfVFhfVk9JQ0VfTUlDOwotCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFsxXSA9IEFBTkNfVFhfTk9JU0VfTUlDOwotCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFsyXSA9IEFBTkNfVFhfRVJST1JfTUlDOwotCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFszXSA9IEFBTkNfVFhfTUlDX1VOVVNFRDsKLQljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbNF0gPSBBQU5DX1RYX01JQ19VTlVTRUQ7Ci0JY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy50eF9wb3J0X2NoYW5uZWxfbWFwWzVdID0gQUFOQ19UWF9NSUNfVU5VU0VEOwotCWNmZy5kYXRhLmFhbmNfcG9ydF9jZmcudHhfcG9ydF9jaGFubmVsX21hcFs2XSA9IEFBTkNfVFhfTUlDX1VOVVNFRDsKLQljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnR4X3BvcnRfY2hhbm5lbF9tYXBbN10gPSBBQU5DX1RYX01JQ19VTlVTRUQ7Ci0JY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy50eF9wb3J0X251bV9jaGFubmVscyA9IDM7Ci0JY2ZnLmRhdGEuYWFuY19wb3J0X2NmZy5yeF9wYXRoX3JlZl9wb3J0X2lkID0gcnhfcG9ydDsKLQljZmcuZGF0YS5hYW5jX3BvcnRfY2ZnLnJlZl9wb3J0X3NhbXBsZV9yYXRlID0KLQkJIHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnRfc2FtcGxlX3JhdGU7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCh1aW50MzJfdCAqKSAmY2ZnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFIEFBTkMgcG9ydCBjb25maWcgZmFpbGVkIGZvciB0eF9wb3J0IDB4JXgsIHJ4X3BvcnQgMHgleCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdHhfcG9ydCwgcnhfcG9ydCwgcmV0KTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9hYW5jX21vZF9lbmFibGUodm9pZCAqYXByLCB1aW50MTZfdCB0eF9wb3J0LCB1aW50MTZfdCBlbmFibGUpCi17Ci0Jc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfYWFuY19wYXJhbSBjZmc7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQotCXByX2RlYnVnKCIlczogdHhfcG9ydCAweCV4XG4iLAotCQlfX2Z1bmNfXywgdHhfcG9ydCk7Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHR4X3BvcnQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydCh0eF9wb3J0KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHR4X3BvcnQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNmZyk7Ci0JY2ZnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNmZy5oZHIudG9rZW4gPSBpbmRleDsKLQljZmcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0KLQljZmcucGFyYW0ucG9ydF9pZCA9IHR4X3BvcnQ7Ci0JY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSAgICAgICAgPSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBhZmVfbW9kX2VuYWJsZV9wYXJhbSk7Ci0JY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgICAgID0gMDsKLQljZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyAgICAgPSAwOwotCWNmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSAgICAgICAgICA9IDA7Ci0KLQljZmcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BQU5DOwotCWNmZy5wZGF0YS5wYXJhbV9pZCAgICA9IEFGRV9QQVJBTV9JRF9FTkFCTEU7Ci0JY2ZnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9tb2RfZW5hYmxlX3BhcmFtKTsKLQljZmcucGRhdGEucmVzZXJ2ZWQgICAgPSAwOwotCi0JY2ZnLmRhdGEubW9kX2VuYWJsZS5lbmFibGUgPSBlbmFibGU7Ci0JY2ZnLmRhdGEubW9kX2VuYWJsZS5yZXNlcnZlZCA9IDA7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCh1aW50MzJfdCAqKSAmY2ZnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFIEFBTkMgZW5hYmxlIGZhaWxlZCBmb3IgdHhfcG9ydCAweCV4IHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLCB0eF9wb3J0LCByZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2Jhbmtfc2VsZWN0aW9uX2NsaXAoCi0JCXN0cnVjdCBhZmVfcGFyYW1faWRfY2xpcF9iYW5rX3NlbCAqcGFyYW0pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfc2V0X2NsaXBfYmFua19zZWxlY3Rpb24gY29uZmlnOwotCi0JaWYgKCFwYXJhbSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtcyIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBJRFhfR0xPQkFMX0NGRzsKLQljb25maWcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKLQotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0KLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9DRENfREVWX0NGRzsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0xJUF9CQU5LX1NFTF9DRkc7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPQotCQlzaXplb2Yoc3RydWN0IGFmZV9wYXJhbV9pZF9jbGlwX2Jhbmtfc2VsKTsKLQljb25maWcuYmFua19zZWwgPSAqcGFyYW07Ci0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NMSVBfQkFOS19TRUxfQ0ZHIGZhaWxlZCAlZFxuIiwKLQkJX19mdW5jX18sIHJldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1pbnQgYWZlX3NlbmRfYWFuY192ZXJzaW9uKAotCXN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbiAqdmVyc2lvbl9jZmcpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWZlX3N2Y19jbWRfY2RjX2FhbmNfdmVyc2lvbiBjb25maWc7Ci0KLQlwcl9kZWJ1ZygiJXM6IGVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JY29uZmlnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKLQljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKLQljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci50b2tlbiA9IElEWF9HTE9CQUxfQ0ZHOwotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1NWQ19DTURfU0VUX1BBUkFNOwotCi0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MikgKwotCQkJCXNpemVvZihzdHJ1Y3QgYWZlX3BhcmFtX2lkX2NkY19hYW5jX3ZlcnNpb24pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0NEQ19ERVZfQ0ZHOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9DRENfQUFOQ19WRVJTSU9OOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCBhZmVfcGFyYW1faWRfY2RjX2FhbmNfdmVyc2lvbik7Ci0JY29uZmlnLnZlcnNpb24gPSAqdmVyc2lvbl9jZmc7Ci0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtJRFhfR0xPQkFMX0NGR10pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFX1BBUkFNX0lEX0NEQ19BQU5DX1ZFUlNJT04gZmFpbGVkICVkXG4iLAotCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9wb3J0X3NldF9tYWRfdHlwZSh1MTYgcG9ydF9pZCwgZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGUpCi17Ci0JaW50IGk7Ci0KLQlpZiAocG9ydF9pZCA9PSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYIHx8Ci0JCXBvcnRfaWQgPT0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYKSB7Ci0JCW1hZF90eXBlID0gTUFEX1NXX0FVRElPOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpID0gcG9ydF9pZCAtIFNMSU1CVVNfMF9SWDsKLQlpZiAoaSA8IDAgfHwgaSA+PSBBUlJBWV9TSVpFKGFmZV9wb3J0c19tYWRfdHlwZSkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0X2lkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWF0b21pY19zZXQoJmFmZV9wb3J0c19tYWRfdHlwZVtpXSwgbWFkX3R5cGUpOwotCXJldHVybiAwOwotfQotCi1lbnVtIGFmZV9tYWRfdHlwZSBhZmVfcG9ydF9nZXRfbWFkX3R5cGUodTE2IHBvcnRfaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAocG9ydF9pZCA9PSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYIHx8Ci0JCXBvcnRfaWQgPT0gQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYKQotCQlyZXR1cm4gTUFEX1NXX0FVRElPOwotCi0JaSA9IHBvcnRfaWQgLSBTTElNQlVTXzBfUlg7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gQVJSQVlfU0laRShhZmVfcG9ydHNfbWFkX3R5cGUpKSB7Ci0JCXByX2RlYnVnKCIlczogTm9uIFNsaW1idXMgcG9ydF9pZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiBNQURfSFdfTk9ORTsKLQl9Ci0JcmV0dXJuIChlbnVtIGFmZV9tYWRfdHlwZSkgYXRvbWljX3JlYWQoJmFmZV9wb3J0c19tYWRfdHlwZVtpXSk7Ci19Ci0KLWludCBhZmVfc2V0X2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWdfdHlwZSwgdm9pZCAqY29uZmlnX2RhdGEsIGludCBhcmcpCi17Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlczogZW50ZXIgY29uZmlnX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBjb25maWdfdHlwZSk7Ci0JcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN3aXRjaCAoY29uZmlnX3R5cGUpIHsKLQljYXNlIEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRzoKLQkJcmV0ID0gYWZlX3NlbmRfc2xpbWJ1c19zbGF2ZV9jZmcoY29uZmlnX2RhdGEpOwotCQlpZiAoIXJldCkKLQkJCXJldCA9IGFmZV9pbml0X2NkY19yZWdfY29uZmlnKCk7Ci0JCWVsc2UKLQkJCXByX2VycigiJXM6IFNlbmRpbmcgc2xpbWJ1cyBzbGF2ZSBjb25maWcgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRzoKLQkJcmV0ID0gYWZlX3NlbmRfY29kZWNfcmVnX2NvbmZpZyhjb25maWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUc6Ci0JCXJldCA9IGFmZV9zZW5kX3NsaW1idXNfc2xhdmVfcG9ydF9jZmcoY29uZmlnX2RhdGEsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0FBTkNfVkVSU0lPTjoKLQkJcmV0ID0gYWZlX3NlbmRfYWFuY192ZXJzaW9uKGNvbmZpZ19kYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfQ0xJUF9CQU5LX1NFTDoKLQkJcmV0ID0gYWZlX3NlbmRfYmFua19zZWxlY3Rpb25fY2xpcChjb25maWdfZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0NEQ19DTElQX1JFR0lTVEVSU19DT05GSUc6Ci0JCXJldCA9IGFmZV9zZW5kX2NvZGVjX3JlZ19jb25maWcoY29uZmlnX2RhdGEpOwotCQlicmVhazsKLQljYXNlIEFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUc6Ci0JCXJldCA9IGFmZV9zZW5kX2NvZGVjX3JlZ19wYWdlX2NvbmZpZyhjb25maWdfZGF0YSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHVua25vd24gY29uZmlndXJhdGlvbiB0eXBlICVkIiwKLQkJCV9fZnVuY19fLCBjb25maWdfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFyZXQpCi0JCXNldF9iaXQoY29uZmlnX3R5cGUsICZhZmVfY29uZmlndXJlZF9jbWQpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX3NldF9jb25maWcpOwotCi0vKgotICogYWZlX2NsZWFyX2NvbmZpZyAtIElmIFNTUiBoYXBwZW5zIEFEU1AgbG9zZXMgQUZFIGNvbmZpZ3MsIGxldCBBRkUgZHJpdmVyIGtub3cKLSAqCQkgICAgICBhYm91dCB0aGUgc3RhdGUgc28gY2xpZW50IGRyaXZlciBjYW4gd2FpdCB1bnRpbCBBRkUgaXMKLSAqCQkgICAgICByZWNvbmZpZ3VyZWQuCi0gKi8KLXZvaWQgYWZlX2NsZWFyX2NvbmZpZyhlbnVtIGFmZV9jb25maWdfdHlwZSBjb25maWcpCi17Ci0JY2xlYXJfYml0KGNvbmZpZywgJmFmZV9jb25maWd1cmVkX2NtZCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGFmZV9jbGVhcl9jb25maWcpOwotCi1ib29sIGFmZV9oYXNfY29uZmlnKGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZykKLXsKLQlyZXR1cm4gISF0ZXN0X2JpdChjb25maWcsICZhZmVfY29uZmlndXJlZF9jbWQpOwotfQotCi1pbnQgYWZlX3NlbmRfc3BkaWZfY2xrX2NmZyhzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2Nsa19jZmcgKmNmZywKLQkJdTE2IHBvcnRfaWQpCi17Ci0Jc3RydWN0IGFmZV9zcGRpZl9jbGtfY29uZmlnX2NvbW1hbmQgY2xrX2NmZzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCi0JaWYgKCFjZmcpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQljbGtfY2ZnLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOwotCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKLQljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNsa19jZmcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNsa19jZmcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNsa19jZmcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWNsa19jZmcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BESUZfQ0xLX0NPTkZJRzsKLQljbGtfY2ZnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNsa19jZmcuY2xrX2NmZyk7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY2xrX2NmZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCi0JCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOwotCWNsa19jZmcuY2xrX2NmZyA9ICpjZmc7Ci0KLQlwcl9kZWJ1ZygiJXM6IE1pbm9yIHZlcnNpb24gPSAweCV4IGNsayB2YWwgPSAlZFxuIgotCQkJImNsayByb290ID0gMHgleFxuIHBvcnQgaWQgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGNmZy0+Y2xrX2NmZ19taW5vcl92ZXJzaW9uLAotCQkJY2ZnLT5jbGtfdmFsdWUsIGNmZy0+Y2xrX3Jvb3QsCi0JCQlxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpKTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2xrX2NmZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogQUZFIHNlbmQgY2xvY2sgY29uZmlnIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3NlbmRfc3BkaWZfY2hfc3RhdHVzX2NmZyhzdHJ1Y3QgYWZlX3BhcmFtX2lkX3NwZGlmX2NoX3N0YXR1c19jZmcKLQkJKmNoX3N0YXR1c19jZmcsCXUxNiBwb3J0X2lkKQotewotCXN0cnVjdCBhZmVfc3BkaWZfY2hzdGF0dXNfY29uZmlnX2NvbW1hbmQgY2hfc3RhdHVzOwotCWludCByZXQgPSAwOwotCWludCBpbmRleCA9IDA7Ci0KLQlpZiAoIWNoX3N0YXR1c19jZmcpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWNoX3N0YXR1cy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljaF9zdGF0dXMuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNoX3N0YXR1c19jZmcpOwotCWNoX3N0YXR1cy5oZHIuc3JjX3BvcnQgPSAwOwotCWNoX3N0YXR1cy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljaF9zdGF0dXMuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljaF9zdGF0dXMuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JY2hfc3RhdHVzLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOwotCWNoX3N0YXR1cy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljaF9zdGF0dXMucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY2hfc3RhdHVzLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljaF9zdGF0dXMucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWNoX3N0YXR1cy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9TUERJRl9DTEtfQ09ORklHOwotCWNoX3N0YXR1cy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjaF9zdGF0dXMuY2hfc3RhdHVzKTsKLQljaF9zdGF0dXMucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNoX3N0YXR1cykKLQkJLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0gc2l6ZW9mKGNoX3N0YXR1cy5wYXJhbSk7Ci0JY2hfc3RhdHVzLmNoX3N0YXR1cyA9ICpjaF9zdGF0dXNfY2ZnOwotCi0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjaF9zdGF0dXMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFGRSBzZW5kIGNoYW5uZWwgc3RhdHVzIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zZW5kX2NtZF9wb3J0X3N0YXJ0KHUxNiBwb3J0X2lkKQotewotCXN0cnVjdCBhZmVfcG9ydF9jbWRfZGV2aWNlX3N0YXJ0IHN0YXJ0OwotCWludCByZXQsIGluZGV4OwotCi0JcHJfZGVidWcoIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwotCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogcG9ydCBpZDogMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdGFydC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCSAgICBBUFJfUEtUX1ZFUik7Ci0Jc3RhcnQuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0YXJ0KTsKLQlzdGFydC5oZHIuc3JjX3BvcnQgPSAwOwotCXN0YXJ0Lmhkci5kZXN0X3BvcnQgPSAwOwotCXN0YXJ0Lmhkci50b2tlbiA9IGluZGV4OwotCXN0YXJ0Lmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfREVWSUNFX1NUQVJUOwotCXN0YXJ0LnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOwotCXByX2RlYnVnKCIlczogY21kIGRldmljZSBzdGFydCBvcGNvZGVbMHgleF0gcG9ydCBpZFsweCV4XVxuIiwKLQkJIF9fZnVuY19fLCBzdGFydC5oZHIub3Bjb2RlLCBzdGFydC5wb3J0X2lkKTsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0YXJ0LCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBwb3J0X2lkLCByZXQpOwotCX0gZWxzZSBpZiAodGhpc19hZmUudGFzayAhPSBjdXJyZW50KSB7Ci0JCXRoaXNfYWZlLnRhc2sgPSBjdXJyZW50OwotCQlwcl9kZWJ1ZygidGFza19uYW1lID0gJXMgcGlkID0gJWRcbiIsCi0JCQkgdGhpc19hZmUudGFzay0+Y29tbSwgdGhpc19hZmUudGFzay0+cGlkKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9hYW5jX3N0YXJ0KHVpbnQxNl90IHR4X3BvcnRfaWQsIHVpbnQxNl90IHJ4X3BvcnRfaWQpCi17Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlczogIFR4IHBvcnQgaXMgMHgleCwgUnggcG9ydCBpcyAweCV4XG4iLAotCQkgX19mdW5jX18sIHR4X3BvcnRfaWQsIHJ4X3BvcnRfaWQpOwotCXJldCA9IGFmZV9hYW5jX3BvcnRfY2ZnKHRoaXNfYWZlLmFwciwgdHhfcG9ydF9pZCwgcnhfcG9ydF9pZCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBTZW5kIEFBTkMgUG9ydCBDb25maWcgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXNlbmRfYWZlX2NhbF90eXBlKEFGRV9BQU5DX0NBTCwgdHhfcG9ydF9pZCk7Ci0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfc3BkaWZfcG9ydF9zdGFydCh1MTYgcG9ydF9pZCwgc3RydWN0IGFmZV9zcGRpZl9wb3J0X2NvbmZpZyAqc3BkaWZfcG9ydCwKLQkJdTMyIHJhdGUpCi17Ci0Jc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXVpbnQxNl90IHBvcnRfaW5kZXg7Ci0KLQlpZiAoIXNwZGlmX3BvcnQpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByX2RlYnVnKCIlczogcG9ydCBpZDogMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBwb3J0IGlkOiAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFmZV9zZW5kX2NhbChwb3J0X2lkKTsKLQlhZmVfc2VuZF9od19kZWxheShwb3J0X2lkLCByYXRlKTsKLQotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKLQljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQlzaXplb2YoY29uZmlnLnBhcmFtKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BESUZfQ09ORklHOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0KTsKLQljb25maWcucG9ydC5zcGRpZiA9IHNwZGlmX3BvcnQtPmNmZzsKLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKChwb3J0X2luZGV4ID49IDApICYmIChwb3J0X2luZGV4IDwgQUZFX01BWF9QT1JUUykpIHsKLQkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1twb3J0X2luZGV4XSA9IHJhdGU7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gYWZlX3NlbmRfc3BkaWZfY2hfc3RhdHVzX2NmZygmc3BkaWZfcG9ydC0+Y2hfc3RhdHVzLCBwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZmUgc2VuZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldHVybiBhZmVfc2VuZF9jbWRfcG9ydF9zdGFydChwb3J0X2lkKTsKLQotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9zZW5kX3Nsb3RfbWFwcGluZ19jZmcoCi0Jc3RydWN0IGFmZV9wYXJhbV9pZF9zbG90X21hcHBpbmdfY2ZnICpzbG90X21hcHBpbmdfY2ZnLAotCXUxNiBwb3J0X2lkKQotewotCXN0cnVjdCBhZmVfc2xvdF9tYXBwaW5nX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCi0JaWYgKCFzbG90X21hcHBpbmdfY2ZnKSB7Ci0JCXByX2VycigiJXM6IEVycm9yLCBubyBjb25maWd1cmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwb3J0IGlkOiAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljb25maWcuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JY29uZmlnLnBhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKQotCQktIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLSBzaXplb2YoY29uZmlnLnBhcmFtKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfVERNOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9QT1JUX1NMT1RfTUFQUElOR19DT05GSUc7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNvbmZpZy5zbG90X21hcHBpbmcpOwotCWNvbmZpZy5zbG90X21hcHBpbmcgPSAqc2xvdF9tYXBwaW5nX2NmZzsKLQotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY29uZmlnKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBBRkUgc2VuZCBzbG90IG1hcHBpbmcgZm9yIHBvcnQgMHgleCBmYWlsZWQgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAotCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7Ci0JCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfc2VuZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcoCi0Jc3RydWN0IGFmZV9wYXJhbV9pZF9jdXN0b21fdGRtX2hlYWRlcl9jZmcgKmN1c3RvbV90ZG1faGVhZGVyX2NmZywKLQl1MTYgcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgYWZlX2N1c3RvbV90ZG1faGVhZGVyX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCi0JaWYgKCFjdXN0b21fdGRtX2hlYWRlcl9jZmcpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQotCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogcG9ydCBpZDogMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljb25maWcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNvbmZpZyk7Ci0JY29uZmlnLmhkci5zcmNfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNvbmZpZy5oZHIudG9rZW4gPSBpbmRleDsKLQotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKLQljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpCi0JCS0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9URE07Ci0JY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NVU1RPTV9URE1fSEVBREVSX0NPTkZJRzsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY29uZmlnLmN1c3RvbV90ZG1faGVhZGVyKTsKLQljb25maWcuY3VzdG9tX3RkbV9oZWFkZXIgPSAqY3VzdG9tX3RkbV9oZWFkZXJfY2ZnOwotCi0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjb25maWcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFGRSBzZW5kIGN1c3RvbSB0ZG0gaGVhZGVyIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3RkbV9wb3J0X3N0YXJ0KHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX3RkbV9wb3J0X2NvbmZpZyAqdGRtX3BvcnQsCi0JCSAgICAgICB1MzIgcmF0ZSwgdTE2IG51bV9ncm91cHMpCi17Ci0Jc3RydWN0IGFmZV9hdWRpb2lmX2NvbmZpZ19jb21tYW5kIGNvbmZpZzsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXVpbnQxNl90IHBvcnRfaW5kZXggPSAwOwotCWVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlID0gTUFEX0hXX05PTkU7Ci0KLQlpZiAoIXRkbV9wb3J0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yLCBubyBjb25maWd1cmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwb3J0IGlkOiAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgewotCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW2luZGV4XSA9IHJhdGU7Ci0KLQkJaWYgKHRoaXNfYWZlLnJ0X2NiKQotCQkJdGhpc19hZmUuZGV2X2FjZGJfaWRbaW5kZXhdID0gdGhpc19hZmUucnRfY2IocG9ydF9pZCk7Ci0JfQotCi0JLyogQWxzbyBzZW5kIHRoZSB0b3BvbG9neSBpZCBoZXJlIGlmIG11bHRpcGxlIHBvcnRzOiAqLwotCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKCEodGhpc19hZmUuYWZlX2NhbF9tb2RlW3BvcnRfaW5kZXhdID09IEFGRV9DQUxfTU9ERV9OT05FKSAmJgotCSAgICBudW1fZ3JvdXBzID4gMSkgewotCQkvKiBPbmUgdGltZSBjYWxsOiBvbmx5IGZvciBmaXJzdCB0aW1lICovCi0JCWFmZV9zZW5kX2N1c3RvbV90b3BvbG9neSgpOwotCQlhZmVfc2VuZF9wb3J0X3RvcG9sb2d5X2lkKHBvcnRfaWQpOwotCQlhZmVfc2VuZF9jYWwocG9ydF9pZCk7Ci0JCWFmZV9zZW5kX2h3X2RlbGF5KHBvcnRfaWQsIHJhdGUpOwotCX0KLQotCS8qIFN0YXJ0IFNXIE1BRCBtb2R1bGUgKi8KLQltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAotCQkgbWFkX3R5cGUpOwotCWlmIChtYWRfdHlwZSAhPSBNQURfSFdfTk9ORSAmJiBtYWRfdHlwZSAhPSBNQURfU1dfQVVESU8pIHsKLQkJaWYgKCFhZmVfaGFzX2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpIHx8Ci0JCQkhYWZlX2hhc19jb25maWcoQUZFX1NMSU1CVVNfU0xBVkVfQ09ORklHKSkgewotCQkJcHJfZXJyKCIlczogQUZFIGlzbid0IGNvbmZpZ3VyZWQgeWV0IGZvclxuIgotCQkJCSJIVyBNQUQgdHJ5IEFnYWluXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JCXJldCA9IGFmZV90dXJuX29ub2ZmX2h3X21hZChtYWRfdHlwZSwgdHJ1ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGFmZV90dXJuX29ub2ZmX2h3X21hZCBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JfQotCi0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX1RETV9DT05GSUc7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnBvcnQpOwotCWNvbmZpZy5wb3J0LnRkbSA9IHRkbV9wb3J0LT50ZG07Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKChwb3J0X2luZGV4ID49IDApICYmIChwb3J0X2luZGV4IDwgQUZFX01BWF9QT1JUUykpIHsKLQkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1twb3J0X2luZGV4XSA9IHJhdGU7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IGluZGV4ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCS8qIHNsb3QgbWFwcGluZyBpcyBub3QgbmVlZCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cCAqLwotCWlmIChudW1fZ3JvdXBzID4gMSkgewotCQlyZXQgPSBhZmVfc2VuZF9zbG90X21hcHBpbmdfY2ZnKCZ0ZG1fcG9ydC0+c2xvdF9tYXBwaW5nLAotCQkJCQkJcG9ydF9pZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBhZmUgc2VuZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCX0KLQotCWlmICh0ZG1fcG9ydC0+Y3VzdG9tX3RkbV9oZWFkZXIuaGVhZGVyX3R5cGUpIHsKLQkJcmV0ID0gYWZlX3NlbmRfY3VzdG9tX3RkbV9oZWFkZXJfY2ZnKAotCQkJJnRkbV9wb3J0LT5jdXN0b21fdGRtX2hlYWRlciwgcG9ydF9pZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBhZmUgc2VuZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCX0KLQotCXJldCA9IGFmZV9zZW5kX2NtZF9wb3J0X3N0YXJ0KHBvcnRfaWQpOwotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGFmZV9zZXRfY2FsX21vZGUodTE2IHBvcnRfaWQsIGVudW0gYWZlX2NhbF9tb2RlIGFmZV9jYWxfbW9kZSkKLXsKLQl1aW50MTZfdCBwb3J0X2luZGV4OwotCi0JcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQl0aGlzX2FmZS5hZmVfY2FsX21vZGVbcG9ydF9pbmRleF0gPSBhZmVfY2FsX21vZGU7Ci19Ci0KLXZvaWQgYWZlX3NldF9yb3V0aW5nX2NhbGxiYWNrKHJvdXRpbmdfY2IgY2IpCi17Ci0JdGhpc19hZmUucnRfY2IgPSBjYjsKLX0KLQotaW50IGFmZV9wb3J0X3NlbmRfdXNiX2Rldl9wYXJhbSh1MTYgcG9ydF9pZCwgdW5pb24gYWZlX3BvcnRfY29uZmlnICphZmVfY29uZmlnKQotewotCXN0cnVjdCBhZmVfdXNiX2F1ZGlvX2Rldl9wYXJhbV9jb21tYW5kIGNvbmZpZzsKLQlpbnQgcmV0ID0gMCwgaW5kZXggPSAwOwotCi0JaWYgKCFhZmVfY29uZmlnKSB7Ci0JCXByX2VycigiJXM6IEVycm9yLCBubyBjb25maWd1cmF0aW9uIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkISBmb3IgcG9ydCBJRCAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCwgcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKLQljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKLQljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci50b2tlbiA9IGluZGV4OwotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKLQljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCi0JCQkJICAgIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fREVWX1BBUkFNUzsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcudXNiX2Rldik7Ci0JY29uZmlnLnVzYl9kZXYuY2ZnX21pbm9yX3ZlcnNpb24gPQotCQkJCUFGRV9BUElfTUlOSU9SX1ZFUlNJT05fVVNCX0FVRElPX0NPTkZJRzsKLQljb25maWcudXNiX2Rldi5kZXZfdG9rZW4gPSBhZmVfY29uZmlnLT51c2JfYXVkaW8uZGV2X3Rva2VuOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFIGRldmljZSBwYXJhbSBjbWQgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfVVNCX0FVRElPX0RFVl9MUENNX0ZNVDsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcubHBjbV9mbXQpOwotCWNvbmZpZy5scGNtX2ZtdC5jZmdfbWlub3JfdmVyc2lvbiA9Ci0JCUFGRV9BUElfTUlOSU9SX1ZFUlNJT05fVVNCX0FVRElPX0NPTkZJRzsKLQljb25maWcubHBjbV9mbXQuZW5kaWFuID0gYWZlX2NvbmZpZy0+dXNiX2F1ZGlvLmVuZGlhbjsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRSBkZXZpY2UgcGFyYW0gY21kIExQQ01fRk1UIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhZmVfc2VuZF9lbmNfY29uZmlnKHUxNiBwb3J0X2lkLAotCQkJCSB1bmlvbiBhZmVfZW5jX2NvbmZpZ19kYXRhICpjZmcsIHUzMiBmb3JtYXQsCi0JCQkJIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyBhZmVfY29uZmlnLAotCQkJCSB1MTYgYWZlX2luX2NoYW5uZWxzLCB1MTYgYWZlX2luX2JpdF93aWR0aCkKLXsKLQlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQgY29uZmlnOwotCWludCBpbmRleDsKLQlpbnQgcmV0OwotCWludCBwYXlsb2FkX3NpemUgPSBzaXplb2YoY29uZmlnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQkJCXNpemVvZihjb25maWcucGFyYW0pIC0gc2l6ZW9mKGNvbmZpZy5wb3J0KTsKLQotCXByX2RlYnVnKCIlczp1cGRhdGUgRFNQIGZvciBlbmMgZm9ybWF0ID0gJWRcbiIsIF9fZnVuY19fLCBmb3JtYXQpOwotCWlmIChmb3JtYXQgIT0gQVNNX01FRElBX0ZNVF9TQkMgJiYgZm9ybWF0ICE9IEFTTV9NRURJQV9GTVRfQUFDX1YyICYmCi0JICAgIGZvcm1hdCAhPSBBU01fTUVESUFfRk1UX0FQVFggJiYgZm9ybWF0ICE9IEFTTV9NRURJQV9GTVRfQVBUWF9IRCkgewotCQlwcl9lcnIoIiVzOlVuc3VwcHBvcnRlZCBmb3JtYXQgSWdub3JlIEFGRSBjb25maWdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBpbmRleCBudW1iZXI6ICVkXG4iLCBfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNvbmZpZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY29uZmlnKTsKLQljb25maWcuaGRyLnNyY19wb3J0ID0gMDsKLQljb25maWcuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY29uZmlnLmhkci50b2tlbiA9IGluZGV4OwotCi0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19mbXQpOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9JRF9FTkNPREVSOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19GTVRfSUQ7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoY29uZmlnLnBvcnQuZW5jX2ZtdCk7Ci0JY29uZmlnLnBvcnQuZW5jX2ZtdC5mbXRfaWQgPSBmb3JtYXQ7Ci0JcHJfZGVidWcoIiVzOnNlbmRpbmcgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0ZNVF9JRCBwYXlsb2FkOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBjb25maWcucGFyYW0ucGF5bG9hZF9zaXplKTsKLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZjb25maWcsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOnVuYWJsZSB0byBzZW5kIEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19GTVRfSUQiLAotCQkJCV9fZnVuY19fKTsKLQkJZ290byBleGl0OwotCX0KLQotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBwYXlsb2FkX3NpemUKLQkJCQkJKyBzaXplb2YoY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbSk7Ci0JcHJfZGVidWcoIiVzOnNlbmQgQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgdG8gRFNQIHBheWxvYWQ6JWRcbiIsCi0JCQkJX19mdW5jX18sIGNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUpOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9FTkNPREVSX1BBUkFNX0lEX0VOQ19DRkdfQkxLOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19ibGtfcGFyYW0pOwotCWNvbmZpZy5wb3J0LmVuY19ibGtfcGFyYW0uZW5jX2NmZ19ibGtfc2l6ZSA9Ci0JCQlzaXplb2YoY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbS5lbmNfYmxrX2NvbmZpZyk7Ci0JY29uZmlnLnBvcnQuZW5jX2Jsa19wYXJhbS5lbmNfYmxrX2NvbmZpZyA9ICpjZmc7Ci0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY29uZmlnLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogQUZFX0VOQ09ERVJfUEFSQU1fSURfRU5DX0NGR19CTEsgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPQotCQkJcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0pOwotCXByX2RlYnVnKCIlczpzZW5kaW5nIEFGRV9FTkNPREVSX1BBUkFNX0lEX1BBQ0tFVElaRVIgdG8gRFNQIHBheWxvYWQgPSAlZCIsCi0JCQkJCV9fZnVuY19fLCBjb25maWcucGFyYW0ucGF5bG9hZF9zaXplKTsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfRU5DT0RFUl9QQVJBTV9JRF9QQUNLRVRJWkVSX0lEOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0pOwotCWNvbmZpZy5wb3J0LmVuY19wa3RfaWRfcGFyYW0uZW5jX3BhY2tldGl6ZXJfaWQgPQotCQkJCQlBRkVfTU9EVUxFX0lEX1BBQ0tFVElaRVJfQ09QOwotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRV9FTkNPREVSX1BBUkFNX0lEX1BBQ0tFVElaRVIgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX3NpemUgPQotCQkJcGF5bG9hZF9zaXplICsgc2l6ZW9mKGNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUpOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUpOwotCi0JcHJfZGVidWcoIiVzOlNlbmRpbmcgQUZFX0FQSV9WRVJTSU9OX1BPUlRfTUVESUFfVFlQRSB0byBEU1AiLCBfX2Z1bmNfXyk7Ci0JY29uZmlnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfUE9SVDsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfUE9SVF9NRURJQV9UWVBFOwotCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUubWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEU7Ci0JY29uZmlnLnBvcnQubWVkaWFfdHlwZS5zYW1wbGVfcmF0ZSA9IGFmZV9jb25maWcuc2xpbV9zY2guc2FtcGxlX3JhdGU7Ci0JaWYgKGFmZV9pbl9iaXRfd2lkdGgpCi0JCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUuYml0X3dpZHRoID0gYWZlX2luX2JpdF93aWR0aDsKLQllbHNlCi0JCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUuYml0X3dpZHRoID0KLQkJCQkJYWZlX2NvbmZpZy5zbGltX3NjaC5iaXRfd2lkdGg7Ci0KLQlpZiAoYWZlX2luX2NoYW5uZWxzKQotCQljb25maWcucG9ydC5tZWRpYV90eXBlLm51bV9jaGFubmVscyA9IGFmZV9pbl9jaGFubmVsczsKLQllbHNlCi0JCWNvbmZpZy5wb3J0Lm1lZGlhX3R5cGUubnVtX2NoYW5uZWxzID0KLQkJCQkJYWZlX2NvbmZpZy5zbGltX3NjaC5udW1fY2hhbm5lbHM7Ci0JY29uZmlnLnBvcnQubWVkaWFfdHlwZS5kYXRhX2Zvcm1hdCA9IEFGRV9QT1JUX0RBVEFfRk9STUFUX1BDTTsKLQljb25maWcucG9ydC5tZWRpYV90eXBlLnJlc2VydmVkID0gMDsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRV9BUElfVkVSU0lPTl9QT1JUX01FRElBX1RZUEUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fYWZlX3BvcnRfc3RhcnQodTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywKLQkJCSAgICB1MzIgcmF0ZSwgdTE2IGFmZV9pbl9jaGFubmVscywgdTE2IGFmZV9pbl9iaXRfd2lkdGgsCi0JCQkgICAgdW5pb24gYWZlX2VuY19jb25maWdfZGF0YSAqY2ZnLCB1MzIgZW5jX2Zvcm1hdCkKLXsKLQlzdHJ1Y3QgYWZlX2F1ZGlvaWZfY29uZmlnX2NvbW1hbmQgY29uZmlnOwotCWludCByZXQgPSAwOwotCWludCBjZmdfdHlwZTsKLQlpbnQgaW5kZXggPSAwOwotCWVudW0gYWZlX21hZF90eXBlIG1hZF90eXBlOwotCXVpbnQxNl90IHBvcnRfaW5kZXg7Ci0KLQlpZiAoIWFmZV9jb25maWcpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1JYKSB8fAotCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1RYKSkgewotCQlwcl9kZWJ1ZygiJXM6IGJlZm9yZSBpbmNyZW1lbnRpbmcgcGNtX2FmZV9pbnN0YW5jZSAlZCBwb3J0X2lkIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCXBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0sIHBvcnRfaWQpOwotCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JCXBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0rKzsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAotCQkJKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpIHsKLQkJcHJfZGVidWcoIiVzOiBiZWZvcmUgaW5jcmVtZW50aW5nIHByb3h5X2FmZV9pbnN0YW5jZSAlZCBwb3J0X2lkIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCXByb3h5X2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSwgcG9ydF9pZCk7Ci0KLQkJaWYgKCFhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSkgewotCQkJLypjbG9zZSBwY20gZGFpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3h5IGRhaSovCi0JCQlhZmVfY2xvc2UocG9ydF9pZCAtIDB4MTApOwotCQkJcGNtX2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSsrOwotCQkJcHJfZGVidWcoIiVzOiByZWNvbmZpZ3VyZSBhZmUgcG9ydCBhZ2FpblxuIiwgX19mdW5jX18pOwotCQl9Ci0JCXByb3h5X2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSsrOwotCQlhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSA9IGZhbHNlOwotCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwb3J0IGlkOiAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHBvcnQgaWQ6IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX3E2X2ludGVyZmFjZV9wcmVwYXJlKCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXByX2VycigiJXM6IFE2IGludGVyZmFjZSBwcmVwYXJlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgewotCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW2luZGV4XSA9IHJhdGU7Ci0KLQkJaWYgKHRoaXNfYWZlLnJ0X2NiKQotCQkJdGhpc19hZmUuZGV2X2FjZGJfaWRbaW5kZXhdID0gdGhpc19hZmUucnRfY2IocG9ydF9pZCk7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKLQkvKiBBbHNvIHNlbmQgdGhlIHRvcG9sb2d5IGlkIGhlcmU6ICovCi0JcG9ydF9pbmRleCA9IGFmZV9nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAoISh0aGlzX2FmZS5hZmVfY2FsX21vZGVbcG9ydF9pbmRleF0gPT0gQUZFX0NBTF9NT0RFX05PTkUpKSB7Ci0JCS8qIE9uZSB0aW1lIGNhbGw6IG9ubHkgZm9yIGZpcnN0IHRpbWUgKi8KLQkJYWZlX3NlbmRfY3VzdG9tX3RvcG9sb2d5KCk7Ci0JCWFmZV9zZW5kX3BvcnRfdG9wb2xvZ3lfaWQocG9ydF9pZCk7Ci0JCWFmZV9zZW5kX2NhbChwb3J0X2lkKTsKLQkJYWZlX3NlbmRfaHdfZGVsYXkocG9ydF9pZCwgcmF0ZSk7Ci0JfQotCi0JLyogU3RhcnQgU1cgTUFEIG1vZHVsZSAqLwotCW1hZF90eXBlID0gYWZlX3BvcnRfZ2V0X21hZF90eXBlKHBvcnRfaWQpOwotCXByX2RlYnVnKCIlczogcG9ydF9pZCAweCV4LCBtYWRfdHlwZSAlZFxuIiwgX19mdW5jX18sIHBvcnRfaWQsCi0JCSBtYWRfdHlwZSk7Ci0JaWYgKG1hZF90eXBlICE9IE1BRF9IV19OT05FICYmIG1hZF90eXBlICE9IE1BRF9TV19BVURJTykgewotCQlpZiAoIWFmZV9oYXNfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRykgfHwKLQkJCSFhZmVfaGFzX2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpKSB7Ci0JCQlwcl9lcnIoIiVzOiBBRkUgaXNuJ3QgY29uZmlndXJlZCB5ZXQgZm9yXG4iCi0JCQkJIkhXIE1BRCB0cnkgQWdhaW5cbiIsIF9fZnVuY19fKTsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQkJcmV0ID0gYWZlX3R1cm5fb25vZmZfaHdfbWFkKG1hZF90eXBlLCB0cnVlKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogYWZlX3R1cm5fb25vZmZfaHdfbWFkIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9Ci0KLQlpZiAoKHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSkgJiYKLQkgICAgKHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3R4X3BvcnQgPT0gcG9ydF9pZCkpIHsKLQkJdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydF9zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JCXBvcnRfaW5kZXggPQotCQkJYWZlX2dldF9wb3J0X2luZGV4KHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnQpOwotCQlpZiAoKHBvcnRfaW5kZXggPj0gMCkgJiYgKHBvcnRfaW5kZXggPCBBRkVfTUFYX1BPUlRTKSkgewotCQkJdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydF9zYW1wbGVfcmF0ZSA9Ci0JCQkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1twb3J0X2luZGV4XTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpbmRleCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pbmRleCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCQlyZXQgPSBhZmVfYWFuY19zdGFydCh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY190eF9wb3J0LAotCQkJCXRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX3J4X3BvcnQpOwotCQlwcl9kZWJ1ZygiJXM6IGFmZV9hYW5jX3N0YXJ0IHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JfQotCi0JaWYgKChwb3J0X2lkID09IEFGRV9QT1JUX0lEX1VTQl9SWCkgfHwKLQkgICAgKHBvcnRfaWQgPT0gQUZFX1BPUlRfSURfVVNCX1RYKSkgewotCQlyZXQgPSBhZmVfcG9ydF9zZW5kX3VzYl9kZXZfcGFyYW0ocG9ydF9pZCwgYWZlX2NvbmZpZyk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEFGRSBkZXZpY2UgcGFyYW0gZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQkJICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCX0KLQotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQlzd2l0Y2ggKHBvcnRfaWQpIHsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6Ci0JCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1BDTV9DT05GSUc7Ci0JCWJyZWFrOwotCWNhc2UgUFJJTUFSWV9JMlNfUlg6Ci0JY2FzZSBQUklNQVJZX0kyU19UWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOgotCWNhc2UgTUkyU19SWDoKLQljYXNlIE1JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfSTJTX0NPTkZJRzsKLQkJYnJlYWs7Ci0JY2FzZSBIRE1JX1JYOgotCWNhc2UgRElTUExBWV9QT1JUX1JYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9IRE1JX0NPTkZJRzsKLQkJYnJlYWs7Ci0JY2FzZSBWT0lDRV9QTEFZQkFDS19UWDoKLQljYXNlIFZPSUNFMl9QTEFZQkFDS19UWDoKLQljYXNlIFZPSUNFX1JFQ09SRF9SWDoKLQljYXNlIFZPSUNFX1JFQ09SRF9UWDoKLQkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfUFNFVURPX1BPUlRfQ09ORklHOwotCQlicmVhazsKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQljYXNlIFNMSU1CVVNfMF9UWDoKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQljYXNlIFNMSU1CVVNfMV9UWDoKLQljYXNlIFNMSU1CVVNfMl9SWDoKLQljYXNlIFNMSU1CVVNfMl9UWDoKLQljYXNlIFNMSU1CVVNfM19SWDoKLQljYXNlIFNMSU1CVVNfM19UWDoKLQljYXNlIFNMSU1CVVNfNF9SWDoKLQljYXNlIFNMSU1CVVNfNF9UWDoKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQljYXNlIFNMSU1CVVNfNV9UWDoKLQljYXNlIFNMSU1CVVNfNl9SWDoKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQljYXNlIFNMSU1CVVNfN19SWDoKLQljYXNlIFNMSU1CVVNfN19UWDoKLQljYXNlIFNMSU1CVVNfOF9SWDoKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfU0xJTUJVU19DT05GSUc7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1RYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fQ09ORklHOwotCQlicmVhazsKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOgotCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6Ci0JCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1JUX1BST1hZX0NPTkZJRzsKLQkJYnJlYWs7Ci0JY2FzZSBJTlRfQlRfU0NPX1JYOgotCWNhc2UgSU5UX0JUX0EyRFBfUlg6Ci0JY2FzZSBJTlRfQlRfU0NPX1RYOgotCWNhc2UgSU5UX0ZNX1JYOgotCWNhc2UgSU5UX0ZNX1RYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9JTlRFUk5BTF9CVF9GTV9DT05GSUc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWNvbmZpZy5oZHIub3Bjb2RlID0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMjsKLQljb25maWcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjb25maWcpIC0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCi0JCQkJICAgIHNpemVvZihjb25maWcucGFyYW0pOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY29uZmlnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljb25maWcucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9pZCA9IGNmZ190eXBlOwotCWNvbmZpZy5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNvbmZpZy5wb3J0KTsKLQotCWNvbmZpZy5wb3J0ID0gKmFmZV9jb25maWc7Ci0JaWYgKChlbmNfZm9ybWF0ICE9IEFTTV9NRURJQV9GTVRfTk9ORSkgJiYKLQkgICAgKGNmZ190eXBlID09IEFGRV9QQVJBTV9JRF9TTElNQlVTX0NPTkZJRykpIHsKLQkJY29uZmlnLnBvcnQuc2xpbV9zY2guZGF0YV9mb3JtYXQgPQotCQkJCUFGRV9TQl9EQVRBX0ZPUk1BVF9HRU5FUklDX0NPTVBSRVNTRUQ7Ci0JfQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoKGVuY19mb3JtYXQgIT0gQVNNX01FRElBX0ZNVF9OT05FKSAmJgotCSAgICAoY2ZnX3R5cGUgPT0gQUZFX1BBUkFNX0lEX1NMSU1CVVNfQ09ORklHKSkgewotCQlwcl9kZWJ1ZygiJXM6IEZvdW5kIEFGRSBlbmNvZGVyIHN1cHBvcnQgZm9yIFNMSU1CVVMgZW5jX2Zvcm1hdCA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgZW5jX2Zvcm1hdCk7Ci0JCXJldCA9IHE2YWZlX3NlbmRfZW5jX2NvbmZpZyhwb3J0X2lkLCBjZmcsIGVuY19mb3JtYXQsCi0JCQkJCSAgICAqYWZlX2NvbmZpZywgYWZlX2luX2NoYW5uZWxzLAotCQkJCQkgICAgYWZlX2luX2JpdF93aWR0aCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEFGRSBlbmNvZGVyIGNvbmZpZyBmb3IgcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9Ci0KLQlwb3J0X2luZGV4ID0gYWZlX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmICgocG9ydF9pbmRleCA+PSAwKSAmJiAocG9ydF9pbmRleCA8IEFGRV9NQVhfUE9SVFMpKSB7Ci0JCS8qCi0JCSAqIElmIGFmZV9wb3J0X3N0YXJ0KCkgZm9yIHR4IHBvcnQgY2FsbGVkIGJlZm9yZQotCQkgKiByeCBwb3J0LCB0aGVuIGFhbmMgcnggc2FtcGxlIHJhdGUgaXMgemVyby4gU28sCi0JCSAqIEFBTkMgc3RhdGUgbWFjaGluZSBpbiBBRkUgd2lsbCBub3QgZ2V0IHRyaWdnZXJlZC4KLQkJICogTWFrZSBzdXJlIHRvIGNoZWNrIHdoZXRoZXIgYWFuYyBpcyBhY3RpdmUgZHVyaW5nCi0JCSAqIGFmZV9wb3J0X3N0YXJ0KCkgZm9yIHJ4IHBvcnQgYW5kIGlmIGFhbmMgcngKLQkJICogc2FtcGxlIHJhdGUgaXMgemVybywgY2FsbCBhZmVfYWFuY19zdGFydCB0byBjb25maWd1cmUKLQkJICogYWFuYyB3aXRoIHZhbGlkIHNhbXBsZSByYXRlcy4KLQkJICovCi0JCWlmICh0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19hY3RpdmUgJiYKLQkJICAgICF0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0X3NhbXBsZV9yYXRlKSB7Ci0JCQl0aGlzX2FmZS5hYW5jX2luZm8uYWFuY19yeF9wb3J0X3NhbXBsZV9yYXRlID0KLQkJCQl0aGlzX2FmZS5hZmVfc2FtcGxlX3JhdGVzW3BvcnRfaW5kZXhdOwotCQkJcmV0ID0gYWZlX2FhbmNfc3RhcnQodGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydCwKLQkJCQkJdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfcnhfcG9ydCk7Ci0JCQlwcl9kZWJ1ZygiJXM6IGFmZV9hYW5jX3N0YXJ0IHJldCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBwb3J0X2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0ID0gYWZlX3NlbmRfY21kX3BvcnRfc3RhcnQocG9ydF9pZCk7Ci0KLWZhaWxfY21kOgotCW11dGV4X3VubG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFmZV9wb3J0X3N0YXJ0IC0gdG8gY29uZmlndXJlIEFGRSBzZXNzaW9uIHdpdGgKLSAqIHNwZWNpZmllZCBwb3J0IGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBAcG9ydF9pZDogQUZFIHBvcnQgaWQgbnVtYmVyCi0gKiBAYWZlX2NvbmZpZzogcG9ydCBjb25maWd1dGF0aW9uCi0gKiBAcmF0ZTogc2FtcGxpbmcgcmF0ZSBvZiBwb3J0Ci0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgdmFsdWUgb24gcG9ydCBzdGFydCBmYWlsdXJlLgotICovCi1pbnQgYWZlX3BvcnRfc3RhcnQodTE2IHBvcnRfaWQsIHVuaW9uIGFmZV9wb3J0X2NvbmZpZyAqYWZlX2NvbmZpZywKLQkJICAgdTMyIHJhdGUpCi17Ci0JcmV0dXJuIF9fYWZlX3BvcnRfc3RhcnQocG9ydF9pZCwgYWZlX2NvbmZpZywgcmF0ZSwKLQkJCQkwLCAwLCBOVUxMLCBBU01fTUVESUFfRk1UX05PTkUpOwotfQotRVhQT1JUX1NZTUJPTChhZmVfcG9ydF9zdGFydCk7Ci0KLS8qKgotICogYWZlX3BvcnRfc3RhcnRfdjIgLSB0byBjb25maWd1cmUgQUZFIHNlc3Npb24gd2l0aAotICogc3BlY2lmaWVkIHBvcnQgY29uZmlndXJhdGlvbiBhbmQgZW5jb2RlciBwYXJhbXMKLSAqCi0gKiBAcG9ydF9pZDogQUZFIHBvcnQgaWQgbnVtYmVyCi0gKiBAYWZlX2NvbmZpZzogcG9ydCBjb25maWd1dGF0aW9uCi0gKiBAcmF0ZTogc2FtcGxpbmcgcmF0ZSBvZiBwb3J0Ci0gKiBAY2ZnOiBBRkUgZW5jb2RlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHNldHVwIGVuY29kZXIKLSAqIEBhZmVfaW5fY2hhbm5lbHM6IEFGRSBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24sIHRoaXMgbmVlZHMKLSAqICB1cGRhdGUgb25seSBpZiBpbnB1dCBjaGFubmVsIGlzIGRpZmZlciBmcm9tIEFGRSBvdXRwdXQKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBlcnJvciB2YWx1ZSBvbiBwb3J0IHN0YXJ0IGZhaWx1cmUuCi0gKi8KLWludCBhZmVfcG9ydF9zdGFydF92Mih1MTYgcG9ydF9pZCwgdW5pb24gYWZlX3BvcnRfY29uZmlnICphZmVfY29uZmlnLAotCQkgICAgICB1MzIgcmF0ZSwgdTE2IGFmZV9pbl9jaGFubmVscywgdTE2IGFmZV9pbl9iaXRfd2lkdGgsCi0JCSAgICAgIHN0cnVjdCBhZmVfZW5jX2NvbmZpZyAqZW5jX2NmZykKLXsKLQlyZXR1cm4gX19hZmVfcG9ydF9zdGFydChwb3J0X2lkLCBhZmVfY29uZmlnLCByYXRlLAotCQkJCWFmZV9pbl9jaGFubmVscywgYWZlX2luX2JpdF93aWR0aCwKLQkJCQkmZW5jX2NmZy0+ZGF0YSwgZW5jX2NmZy0+Zm9ybWF0KTsKLX0KLUVYUE9SVF9TWU1CT0woYWZlX3BvcnRfc3RhcnRfdjIpOwotCi1pbnQgYWZlX2dldF9wb3J0X2luZGV4KHUxNiBwb3J0X2lkKQotewotCXN3aXRjaCAocG9ydF9pZCkgewotCWNhc2UgUFJJTUFSWV9JMlNfUlg6IHJldHVybiBJRFhfUFJJTUFSWV9JMlNfUlg7Ci0JY2FzZSBQUklNQVJZX0kyU19UWDogcmV0dXJuIElEWF9QUklNQVJZX0kyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg7Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1JYOiByZXR1cm4gSURYX1NFQ09OREFSWV9JMlNfUlg7Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOiByZXR1cm4gSURYX1NFQ09OREFSWV9JMlNfVFg7Ci0JY2FzZSBNSTJTX1JYOiByZXR1cm4gSURYX01JMlNfUlg7Ci0JY2FzZSBNSTJTX1RYOiByZXR1cm4gSURYX01JMlNfVFg7Ci0JY2FzZSBIRE1JX1JYOiByZXR1cm4gSURYX0hETUlfUlg7Ci0JY2FzZSBESVNQTEFZX1BPUlRfUlg6IHJldHVybiBJRFhfRElTUExBWV9QT1JUX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfU1BESUZfUlg6IHJldHVybiBJRFhfU1BESUZfUlg7Ci0JY2FzZSBSU1ZEXzI6IHJldHVybiBJRFhfUlNWRF8yOwotCWNhc2UgUlNWRF8zOiByZXR1cm4gSURYX1JTVkRfMzsKLQljYXNlIERJR0lfTUlDX1RYOiByZXR1cm4gSURYX0RJR0lfTUlDX1RYOwotCWNhc2UgVk9JQ0VfUkVDT1JEX1JYOiByZXR1cm4gSURYX1ZPSUNFX1JFQ09SRF9SWDsKLQljYXNlIFZPSUNFX1JFQ09SRF9UWDogcmV0dXJuIElEWF9WT0lDRV9SRUNPUkRfVFg7Ci0JY2FzZSBWT0lDRV9QTEFZQkFDS19UWDogcmV0dXJuIElEWF9WT0lDRV9QTEFZQkFDS19UWDsKLQljYXNlIFZPSUNFMl9QTEFZQkFDS19UWDogcmV0dXJuIElEWF9WT0lDRTJfUExBWUJBQ0tfVFg7Ci0JY2FzZSBTTElNQlVTXzBfUlg6IHJldHVybiBJRFhfU0xJTUJVU18wX1JYOwotCWNhc2UgU0xJTUJVU18wX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfMF9UWDsKLQljYXNlIFNMSU1CVVNfMV9SWDogcmV0dXJuIElEWF9TTElNQlVTXzFfUlg7Ci0JY2FzZSBTTElNQlVTXzFfVFg6IHJldHVybiBJRFhfU0xJTUJVU18xX1RYOwotCWNhc2UgU0xJTUJVU18yX1JYOiByZXR1cm4gSURYX1NMSU1CVVNfMl9SWDsKLQljYXNlIFNMSU1CVVNfMl9UWDogcmV0dXJuIElEWF9TTElNQlVTXzJfVFg7Ci0JY2FzZSBTTElNQlVTXzNfUlg6IHJldHVybiBJRFhfU0xJTUJVU18zX1JYOwotCWNhc2UgU0xJTUJVU18zX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfM19UWDsKLQljYXNlIElOVF9CVF9TQ09fUlg6IHJldHVybiBJRFhfSU5UX0JUX1NDT19SWDsKLQljYXNlIElOVF9CVF9TQ09fVFg6IHJldHVybiBJRFhfSU5UX0JUX1NDT19UWDsKLQljYXNlIElOVF9CVF9BMkRQX1JYOiByZXR1cm4gSURYX0lOVF9CVF9BMkRQX1JYOwotCWNhc2UgSU5UX0ZNX1JYOiByZXR1cm4gSURYX0lOVF9GTV9SWDsKLQljYXNlIElOVF9GTV9UWDogcmV0dXJuIElEWF9JTlRfRk1fVFg7Ci0JY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDogcmV0dXJuIElEWF9SVF9QUk9YWV9QT1JUXzAwMV9SWDsKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOiByZXR1cm4gSURYX1JUX1BST1hZX1BPUlRfMDAxX1RYOwotCWNhc2UgU0xJTUJVU180X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfNF9SWDsKLQljYXNlIFNMSU1CVVNfNF9UWDogcmV0dXJuIElEWF9TTElNQlVTXzRfVFg7Ci0JY2FzZSBTTElNQlVTXzVfUlg6IHJldHVybiBJRFhfU0xJTUJVU181X1JYOwotCWNhc2UgU0xJTUJVU181X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfNV9UWDsKLQljYXNlIFNMSU1CVVNfNl9SWDogcmV0dXJuIElEWF9TTElNQlVTXzZfUlg7Ci0JY2FzZSBTTElNQlVTXzZfVFg6IHJldHVybiBJRFhfU0xJTUJVU182X1RYOwotCWNhc2UgU0xJTUJVU183X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfN19SWDsKLQljYXNlIFNMSU1CVVNfN19UWDogcmV0dXJuIElEWF9TTElNQlVTXzdfVFg7Ci0JY2FzZSBTTElNQlVTXzhfUlg6IHJldHVybiBJRFhfU0xJTUJVU184X1JYOwotCWNhc2UgU0xJTUJVU184X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfOF9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDogcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9VU0JfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6IHJldHVybiBJRFhfQUZFX1BPUlRfSURfVVNCX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOwotCWNhc2UgQUZFX1BPUlRfSURfUVVJTkFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzA7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzA7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzA7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMl9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNV9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogcG9ydCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotaW50IGFmZV9vcGVuKHUxNiBwb3J0X2lkLAotCQl1bmlvbiBhZmVfcG9ydF9jb25maWcgKmFmZV9jb25maWcsIGludCByYXRlKQotewotCXN0cnVjdCBhZmVfcG9ydF9jbWRfZGV2aWNlX3N0YXJ0IHN0YXJ0OwotCXN0cnVjdCBhZmVfYXVkaW9pZl9jb25maWdfY29tbWFuZCBjb25maWc7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNmZ190eXBlOwotCWludCBpbmRleCA9IDA7Ci0KLQlpZiAoIWFmZV9jb25maWcpIHsKLQkJcHJfZXJyKCIlczogRXJyb3IsIG5vIGNvbmZpZ3VyYXRpb24gZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByX2VycigiJXM6IHBvcnRfaWQgMHgleCByYXRlICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgcmF0ZSk7Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCkgfHwKLQkJKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9UWCkpIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgcG9ydCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9SWCkgfHwKLQkJKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpCi0JCXBvcnRfaWQgPSBWSVJUVUFMX0lEX1RPX1BPUlRJRChwb3J0X2lkKTsKLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IEFGRV9NQVhfUE9SVFMpKSB7Ci0JCXRoaXNfYWZlLmFmZV9zYW1wbGVfcmF0ZXNbaW5kZXhdID0gcmF0ZTsKLQotCQlpZiAodGhpc19hZmUucnRfY2IpCi0JCQl0aGlzX2FmZS5kZXZfYWNkYl9pZFtpbmRleF0gPSB0aGlzX2FmZS5ydF9jYihwb3J0X2lkKTsKLQl9Ci0KLQkvKiBBbHNvIHNlbmQgdGhlIHRvcG9sb2d5IGlkIGhlcmU6ICovCi0JYWZlX3NlbmRfY3VzdG9tX3RvcG9sb2d5KCk7IC8qIE9uZSB0aW1lIGNhbGw6IG9ubHkgZm9yIGZpcnN0IHRpbWUgICovCi0JYWZlX3NlbmRfcG9ydF90b3BvbG9neV9pZChwb3J0X2lkKTsKLQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgOiBJbnZhbGlkIFBvcnQgaWQgPSAweCV4IHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXV0ZXhfbG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKLQotCWNvbmZpZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gaW5kZXg7Ci0Jc3dpdGNoIChwb3J0X2lkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19SWDoKLQljYXNlIFBSSU1BUllfSTJTX1RYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9JMlNfQ09ORklHOwotCQlicmVhazsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fVFg6Ci0JCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX1BDTV9DT05GSUc7Ci0JCWJyZWFrOwotCWNhc2UgU0VDT05EQVJZX0kyU19SWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg6Ci0JY2FzZSBNSTJTX1JYOgotCWNhc2UgTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVSU5BUllfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9JMlNfQ09ORklHOwotCQlicmVhazsKLQljYXNlIEhETUlfUlg6Ci0JY2FzZSBESVNQTEFZX1BPUlRfUlg6Ci0JCWNmZ190eXBlID0gQUZFX1BBUkFNX0lEX0hETUlfQ09ORklHOwotCQlicmVhazsKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQljYXNlIFNMSU1CVVNfMF9UWDoKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQljYXNlIFNMSU1CVVNfMV9UWDoKLQljYXNlIFNMSU1CVVNfMl9SWDoKLQljYXNlIFNMSU1CVVNfMl9UWDoKLQljYXNlIFNMSU1CVVNfM19SWDoKLQljYXNlIFNMSU1CVVNfM19UWDoKLQljYXNlIFNMSU1CVVNfNF9SWDoKLQljYXNlIFNMSU1CVVNfNF9UWDoKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQljYXNlIFNMSU1CVVNfNl9SWDoKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQljYXNlIFNMSU1CVVNfN19SWDoKLQljYXNlIFNMSU1CVVNfN19UWDoKLQljYXNlIFNMSU1CVVNfOF9SWDoKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfU0xJTUJVU19DT05GSUc7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1RYOgotCQljZmdfdHlwZSA9IEFGRV9QQVJBTV9JRF9VU0JfQVVESU9fQ09ORklHOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgaWQgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNvbmZpZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCi0JCQkJIC0gc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX2lkID0gY2ZnX3R5cGU7Ci0JY29uZmlnLnBkYXRhLnBhcmFtX3NpemUgPSAgc2l6ZW9mKGNvbmZpZy5wb3J0KTsKLQotCWNvbmZpZy5wb3J0ID0gKmFmZV9jb25maWc7Ci0JcHJfZGVidWcoIiVzOiBwYXJhbSBQTCBzaXplPSVkIGlwYXJhbV9zaXplWyVkXVslemQgJXpkICV6ZCAlemRdIHBhcmFtX2lkWzB4JXhdXG4iLAotCQlfX2Z1bmNfXywgY29uZmlnLnBhcmFtLnBheWxvYWRfc2l6ZSwgY29uZmlnLnBkYXRhLnBhcmFtX3NpemUsCi0JCXNpemVvZihjb25maWcpLCBzaXplb2YoY29uZmlnLnBhcmFtKSwgc2l6ZW9mKGNvbmZpZy5wb3J0KSwKLQkJc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSwgY29uZmlnLnBkYXRhLnBhcmFtX2lkKTsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBvcGNvZGVbMHgleF1mYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgY2ZnX3R5cGUsIHJldCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXN0YXJ0Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlzdGFydC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RhcnQpOwotCXN0YXJ0Lmhkci5zcmNfcG9ydCA9IDA7Ci0Jc3RhcnQuaGRyLmRlc3RfcG9ydCA9IDA7Ci0Jc3RhcnQuaGRyLnRva2VuID0gaW5kZXg7Ci0Jc3RhcnQuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RBUlQ7Ci0Jc3RhcnQucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JcHJfZGVidWcoIiVzOiBjbWQgZGV2aWNlIHN0YXJ0IG9wY29kZVsweCV4XSBwb3J0IGlkWzB4JXhdXG4iLAotCQlfX2Z1bmNfXywgc3RhcnQuaGRyLm9wY29kZSwgc3RhcnQucG9ydF9pZCk7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzdGFydCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAotCQkJCXBvcnRfaWQsIHJldCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9sb29wYmFjayh1MTYgZW5hYmxlLCB1MTYgcnhfcG9ydCwgdTE2IHR4X3BvcnQpCi17Ci0Jc3RydWN0IGFmZV9sb29wYmFja19jZmdfdjEgbGJfY21kOwotCWludCByZXQgPSAwOwotCWludCBpbmRleCA9IDA7Ci0KLQlpZiAocnhfcG9ydCA9PSBNSTJTX1JYKQotCQlyeF9wb3J0ID0gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOwotCWlmICh0eF9wb3J0ID09IE1JMlNfVFgpCi0JCXR4X3BvcnQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocnhfcG9ydCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHJ4X3BvcnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsIF9fZnVuY19fLCByeF9wb3J0LCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlsYl9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTigyMCksIEFQUl9QS1RfVkVSKTsKLQlsYl9jbWQuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGxiX2NtZCk7Ci0JbGJfY21kLmhkci5zcmNfcG9ydCA9IDA7Ci0JbGJfY21kLmhkci5kZXN0X3BvcnQgPSAwOwotCWxiX2NtZC5oZHIudG9rZW4gPSBpbmRleDsKLQlsYl9jbWQuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JbGJfY21kLnBhcmFtLnBvcnRfaWQgPSB0eF9wb3J0OwotCWxiX2NtZC5wYXJhbS5wYXlsb2FkX3NpemUgPSAoc2l6ZW9mKGxiX2NtZCkgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MikpOwotCWxiX2NtZC5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQlsYl9jbWQucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JbGJfY21kLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQlsYl9jbWQucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9MT09QQkFDSzsKLQlsYl9jbWQucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfQ09ORklHOwotCWxiX2NtZC5wZGF0YS5wYXJhbV9zaXplID0gbGJfY21kLnBhcmFtLnBheWxvYWRfc2l6ZSAtCi0JCQkJICBzaXplb2Yoc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIpOwotCi0JbGJfY21kLmRzdF9wb3J0X2lkID0gcnhfcG9ydDsKLQlsYl9jbWQucm91dGluZ19tb2RlID0gTEJfTU9ERV9ERUZBVUxUOwotCWxiX2NtZC5lbmFibGUgPSAoZW5hYmxlID8gMSA6IDApOwotCWxiX2NtZC5sb29wYmFja19jZmdfbWlub3JfdmVyc2lvbiA9IEFGRV9BUElfVkVSU0lPTl9MT09QQkFDS19DT05GSUc7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZsYl9jbWQsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIGxvb3BiYWNrIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9sb29wYmFja19nYWluKHUxNiBwb3J0X2lkLCB1MTYgdm9sdW1lKQotewotCXN0cnVjdCBhZmVfbG9vcGJhY2tfZ2Fpbl9wZXJfcGF0aF9wYXJhbSBzZXRfcGFyYW07Ci0JaW50IHJldCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQotCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAotCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOwotCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKLQl9Ci0KLQlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIDogSW52YWxpZCBQb3J0IGlkID0gMHgleCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWQiLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJYIHBvcnRzIG51bWJlcnMgYXJlIGV2ZW4gLlRYIHBvcnRzIG51bWJlcnMgYXJlIG9kZC4gKi8KLQlpZiAocG9ydF9pZCAlIDIgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgOiBhZmUgbG9vcGJhY2sgZ2FpbiBvbmx5IGZvciBUWCBwb3J0cy4gcG9ydF9pZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwb3J0IDB4JXggdm9sdW1lICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCwgdm9sdW1lKTsKLQotCXNldF9wYXJhbS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0Jc2V0X3BhcmFtLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihzZXRfcGFyYW0pOwotCXNldF9wYXJhbS5oZHIuc3JjX3BvcnQgPSAwOwotCXNldF9wYXJhbS5oZHIuZGVzdF9wb3J0ID0gMDsKLQlzZXRfcGFyYW0uaGRyLnRva2VuID0gaW5kZXg7Ci0Jc2V0X3BhcmFtLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCi0Jc2V0X3BhcmFtLnBhcmFtLnBvcnRfaWQJPSBwb3J0X2lkOwotCXNldF9wYXJhbS5wYXJhbS5wYXlsb2FkX3NpemUgPQotCSAgICAoc2l6ZW9mKHN0cnVjdCBhZmVfbG9vcGJhY2tfZ2Fpbl9wZXJfcGF0aF9wYXJhbSkgLQotCSAgICAgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtIHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MikpOwotCXNldF9wYXJhbS5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3CT0gMDsKLQlzZXRfcGFyYW0ucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdwk9IDA7Ci0Jc2V0X3BhcmFtLnBhcmFtLm1lbV9tYXBfaGFuZGxlICAgICAgICA9IDA7Ci0KLQlzZXRfcGFyYW0ucGRhdGEubW9kdWxlX2lkID0gQUZFX01PRFVMRV9MT09QQkFDSzsKLQlzZXRfcGFyYW0ucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfR0FJTl9QRVJfUEFUSDsKLQlzZXRfcGFyYW0ucGRhdGEucGFyYW1fc2l6ZSA9Ci0JICAgIChzZXRfcGFyYW0ucGFyYW0ucGF5bG9hZF9zaXplIC0KLQkgICAgIHNpemVvZihzdHJ1Y3QgYWZlX3BvcnRfcGFyYW1fZGF0YV92MikpOwotCXNldF9wYXJhbS5yeF9wb3J0X2lkID0gcG9ydF9pZDsKLQlzZXRfcGFyYW0uZ2FpbiA9IHZvbHVtZTsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnNldF9wYXJhbSwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEFGRSBwYXJhbSBzZXQgZmFpbGVkIGZvciBwb3J0IDB4JXggcmV0ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfcHNldWRvX3BvcnRfc3RhcnRfbm93YWl0KHUxNiBwb3J0X2lkKQotewotCXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdGFydF9jb21tYW5kIHN0YXJ0OwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkPTB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUZFIEFQUiBpcyBub3QgcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQotCXN0YXJ0Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlzdGFydC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RhcnQpOwotCXN0YXJ0Lmhkci5zcmNfcG9ydCA9IDA7Ci0Jc3RhcnQuaGRyLmRlc3RfcG9ydCA9IDA7Ci0Jc3RhcnQuaGRyLnRva2VuID0gMDsKLQlzdGFydC5oZHIub3Bjb2RlID0gQUZFX1BTRVVET1BPUlRfQ01EX1NUQVJUOwotCXN0YXJ0LnBvcnRfaWQgPSBwb3J0X2lkOwotCXN0YXJ0LnRpbWluZyA9IDE7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzdGFydCwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgYWZlX3N0YXJ0X3BzZXVkb19wb3J0KHUxNiBwb3J0X2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdGFydF9jb21tYW5kIHN0YXJ0OwotCWludCBpbmRleCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcG9ydCAweCV4IHJldCAlZCIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RhcnQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXN0YXJ0Lmhkci5wa3Rfc2l6ZSA9IHNpemVvZihzdGFydCk7Ci0Jc3RhcnQuaGRyLnNyY19wb3J0ID0gMDsKLQlzdGFydC5oZHIuZGVzdF9wb3J0ID0gMDsKLQlzdGFydC5oZHIudG9rZW4gPSAwOwotCXN0YXJ0Lmhkci5vcGNvZGUgPSBBRkVfUFNFVURPUE9SVF9DTURfU1RBUlQ7Ci0Jc3RhcnQucG9ydF9pZCA9IHBvcnRfaWQ7Ci0Jc3RhcnQudGltaW5nID0gMTsKLQlzdGFydC5oZHIudG9rZW4gPSBpbmRleDsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0YXJ0LCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3BzZXVkb19wb3J0X3N0b3Bfbm93YWl0KHUxNiBwb3J0X2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhZmVfcHNldWRvcG9ydF9zdG9wX2NvbW1hbmQgc3RvcDsKLQlpbnQgaW5kZXggPSAwOwotCi0JcHJfZGVidWcoIiVzOiBwb3J0X2lkID0gMHgleFxuIiwgX19mdW5jX18sIHBvcnRfaWQpOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFGRSBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWQiLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0b3AuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXN0b3AuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHN0b3ApOwotCXN0b3AuaGRyLnNyY19wb3J0ID0gMDsKLQlzdG9wLmhkci5kZXN0X3BvcnQgPSAwOwotCXN0b3AuaGRyLnRva2VuID0gMDsKLQlzdG9wLmhkci5vcGNvZGUgPSBBRkVfUFNFVURPUE9SVF9DTURfU1RPUDsKLQlzdG9wLnBvcnRfaWQgPSBwb3J0X2lkOwotCXN0b3AucmVzZXJ2ZWQgPSAwOwotCXN0b3AuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZzdG9wLCBOVUxMKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkUgY2xvc2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfcG9ydF9ncm91cF9zZXRfcGFyYW0odTE2IGdyb3VwX2lkLAotCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyAqYWZlX2dyb3VwX2NvbmZpZykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhZmVfcG9ydF9ncm91cF9jcmVhdGUgY29uZmlnOwotCWludCBjZmdfdHlwZTsKLQotCWlmICghYWZlX2dyb3VwX2NvbmZpZykgewotCQlwcl9lcnIoIiVzOiBFcnJvciwgbm8gY29uZmlndXJhdGlvbiBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogZ3JvdXAgaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBncm91cF9pZCk7Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzd2l0Y2ggKGdyb3VwX2lkKSB7Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1BSSU1BUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9QUklNQVJZX1RETV9UWDoKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfU0VDT05EQVJZX1RETV9UWDoKLQljYXNlIEFGRV9HUk9VUF9ERVZJQ0VfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9URVJUSUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfR1JPVVBfREVWSUNFX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCWNhc2UgQUZFX0dST1VQX0RFVklDRV9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQkJY2ZnX3R5cGUgPSBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX1RETV9DT05GSUc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZ3JvdXAgaWQgMHgleFxuIiwgX19mdW5jX18sIGdyb3VwX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07Ci0KLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0dST1VQX0RFVklDRTsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBjZmdfdHlwZTsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcuZGF0YSk7Ci0JY29uZmlnLmRhdGEgPSAqYWZlX2dyb3VwX2NvbmZpZzsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbSURYX0dMT0JBTF9DRkddKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0NGRyBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfcG9ydF9ncm91cF9lbmFibGUodTE2IGdyb3VwX2lkLAotCXVuaW9uIGFmZV9wb3J0X2dyb3VwX2NvbmZpZyAqYWZlX2dyb3VwX2NvbmZpZywKLQl1MTYgZW5hYmxlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGFmZV9wb3J0X2dyb3VwX2NyZWF0ZSBjb25maWc7Ci0KLQlwcl9kZWJ1ZygiJXM6IGdyb3VwIGlkOiAweCV4IGVuYWJsZTogJWRcbiIsIF9fZnVuY19fLAotCQlncm91cF9pZCwgZW5hYmxlKTsKLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChlbmFibGUpIHsKLQkJcmV0ID0gYWZlX3BvcnRfZ3JvdXBfc2V0X3BhcmFtKGdyb3VwX2lkLCBhZmVfZ3JvdXBfY29uZmlnKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGFmZSBzZW5kIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKLQljb25maWcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0JY29uZmlnLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjb25maWcpOwotCWNvbmZpZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNvbmZpZy5oZHIuZGVzdF9wb3J0ID0gMDsKLQljb25maWcuaGRyLnRva2VuID0gSURYX0dMT0JBTF9DRkc7Ci0JY29uZmlnLmhkci5vcGNvZGUgPSBBRkVfU1ZDX0NNRF9TRVRfUEFSQU07Ci0KLQljb25maWcucGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbmZpZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQkgICAgc2l6ZW9mKGNvbmZpZy5wYXJhbSk7Ci0JY29uZmlnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNvbmZpZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljb25maWcucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNvbmZpZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0dST1VQX0RFVklDRTsKLQljb25maWcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0VOQUJMRTsKLQljb25maWcucGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihjb25maWcuZGF0YSk7Ci0JY29uZmlnLmRhdGEuZ3JvdXBfZW5hYmxlLmdyb3VwX2lkID0gZ3JvdXBfaWQ7Ci0JY29uZmlnLmRhdGEuZ3JvdXBfZW5hYmxlLmVuYWJsZSA9IGVuYWJsZTsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmNvbmZpZywgJnRoaXNfYWZlLndhaXRbSURYX0dMT0JBTF9DRkddKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkVfUEFSQU1fSURfR1JPVVBfREVWSUNFX0VOQUJMRSBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfc3RvcF9wc2V1ZG9fcG9ydCh1MTYgcG9ydF9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWZlX3BzZXVkb3BvcnRfc3RvcF9jb21tYW5kIHN0b3A7Ci0JaW50IGluZGV4ID0gMDsKLQotCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQotCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBRkUgaXMgYWxyZWFkeSBjbG9zZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0Jc3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RvcCk7Ci0Jc3RvcC5oZHIuc3JjX3BvcnQgPSAwOwotCXN0b3AuaGRyLmRlc3RfcG9ydCA9IDA7Ci0Jc3RvcC5oZHIudG9rZW4gPSAwOwotCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QU0VVRE9QT1JUX0NNRF9TVE9QOwotCXN0b3AucG9ydF9pZCA9IHBvcnRfaWQ7Ci0Jc3RvcC5yZXNlcnZlZCA9IDA7Ci0Jc3RvcC5oZHIudG9rZW4gPSBpbmRleDsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnN0b3AsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIGNsb3NlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi11aW50MzJfdCBhZmVfcmVxX21tYXBfaGFuZGxlKHN0cnVjdCBhZmVfYXVkaW9fY2xpZW50ICphYykKLXsKLQlyZXR1cm4gYWMtPm1lbV9tYXBfaGFuZGxlOwotfQotCi1zdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqcTZhZmVfYXVkaW9fY2xpZW50X2FsbG9jKHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjOwotCWludCBsY250ID0gMDsKLQotCWFjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFmZV9hdWRpb19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gTlVMTDsKLQotCWFjLT5wcml2ID0gcHJpdjsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFjLT5jbWRfd2FpdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFjLT5wb3J0WzBdLm1lbV9tYXBfaGFuZGxlKTsKLQlJTklUX0xJU1RfSEVBRCgmYWMtPnBvcnRbMV0ubWVtX21hcF9oYW5kbGUpOwotCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgbGlzdCBpbml0J2VkXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfaW5pdCgmYWMtPmNtZF9sb2NrKTsKLQlmb3IgKGxjbnQgPSAwOyBsY250IDw9IE9VVDsgbGNudCsrKSB7Ci0JCW11dGV4X2luaXQoJmFjLT5wb3J0W2xjbnRdLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmYWMtPnBvcnRbbGNudF0uZHNwX2xvY2spOwotCX0KLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAwKTsKLQotCXJldHVybiBhYzsKLX0KLQotaW50IHE2YWZlX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjLAotCQkJdW5zaWduZWQgaW50IGJ1ZnN6LAotCQkJdW5zaWduZWQgaW50IGJ1ZmNudCkKLXsKLQlpbnQgY250ID0gMDsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBhZmVfYXVkaW9fYnVmZmVyICpidWY7Ci0Jc2l6ZV90IGxlbjsKLQotCWlmICghKGFjKSB8fCAoKGRpciAhPSBJTikgJiYgKGRpciAhPSBPVVQpKSkgewotCQlwcl9lcnIoIiVzOiBhYyAlcEsgZGlyICVkXG4iLCBfX2Z1bmNfXywgYWMsIGRpcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogYnVmc3pbJWRdYnVmY250WyVkXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJYnVmc3osIGJ1ZmNudCk7Ci0KLQlpZiAoYWMtPnBvcnRbZGlyXS5idWYpIHsKLQkJcHJfZGVidWcoIiVzOiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7Ci0JYnVmID0ga3phbGxvYygoKHNpemVvZihzdHJ1Y3QgYWZlX2F1ZGlvX2J1ZmZlcikpKmJ1ZmNudCksCi0JCQlHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmKSB7Ci0JCXByX2VycigiJXM6IG51bGwgYnVmXG4iLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWFjLT5wb3J0W2Rpcl0uYnVmID0gYnVmOwotCi0JcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJhZmVfY2xpZW50IiwgJmJ1ZlswXS5jbGllbnQsCi0JCQkJJmJ1ZlswXS5oYW5kbGUsIGJ1ZnN6KmJ1ZmNudCwKLQkJCQkmYnVmWzBdLnBoeXMsICZsZW4sCi0JCQkJJmJ1ZlswXS5kYXRhKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGFsbG9jIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWJ1ZlswXS51c2VkID0gZGlyIF4gMTsKLQlidWZbMF0uc2l6ZSA9IGJ1ZnN6OwotCWJ1ZlswXS5hY3R1YWxfc2l6ZSA9IGJ1ZnN6OwotCWNudCA9IDE7Ci0Jd2hpbGUgKGNudCA8IGJ1ZmNudCkgewotCQlpZiAoYnVmc3ogPiAwKSB7Ci0JCQlidWZbY250XS5kYXRhID0gIGJ1ZlswXS5kYXRhICsgKGNudCAqIGJ1ZnN6KTsKLQkJCWJ1ZltjbnRdLnBoeXMgPSAgYnVmWzBdLnBoeXMgKyAoY250ICogYnVmc3opOwotCQkJaWYgKCFidWZbY250XS5kYXRhKSB7Ci0JCQkJcHJfZXJyKCIlczogQnVmIGFsbG9jIGZhaWxlZFxuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWJ1ZltjbnRdLnVzZWQgPSBkaXIgXiAxOwotCQkJYnVmW2NudF0uc2l6ZSA9IGJ1ZnN6OwotCQkJYnVmW2NudF0uYWN0dWFsX3NpemUgPSBidWZzejsKLQkJCXByX2RlYnVnKCIlczogIGRhdGFbJXBLXXBoeXNbJXBLXVslcEtdXG4iLCBfX2Z1bmNfXywKLQkJCQkgICBidWZbY250XS5kYXRhLAotCQkJCSAgICZidWZbY250XS5waHlzLAotCQkJCSAgICZidWZbY250XS5waHlzKTsKLQkJfQotCQljbnQrKzsKLQl9Ci0JYWMtPnBvcnRbZGlyXS5tYXhfYnVmX2NudCA9IGNudDsKLQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXByX2VycigiJXM6IGp1bXAgZmFpbFxuIiwgX19mdW5jX18pOwotCXE2YWZlX2F1ZGlvX2NsaWVudF9idWZfZnJlZV9jb250aWd1b3VzKGRpciwgYWMpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgYWZlX21lbW9yeV9tYXAocGh5c19hZGRyX3QgZG1hX2FkZHJfcCwgdTMyIGRtYV9idWZfc3osCi0JCQlzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOwotCWFjLT5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JcmV0ID0gYWZlX2NtZF9tZW1vcnlfbWFwKGRtYV9hZGRyX3AsIGRtYV9idWZfc3opOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFmZV9jbWRfbWVtb3J5X21hcCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCQltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWFjLT5tZW1fbWFwX2hhbmRsZSA9IHRoaXNfYWZlLm1tYXBfaGFuZGxlOwotCW11dGV4X3VubG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfY21kX21lbW9yeV9tYXAocGh5c19hZGRyX3QgZG1hX2FkZHJfcCwgdTMyIGRtYV9idWZfc3opCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNtZF9zaXplID0gMDsKLQl2b2lkICAgICpwYXlsb2FkID0gTlVMTDsKLQl2b2lkICAgICptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOwotCXN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqbXJlZ2lvbiA9IE5VTEw7Ci0Jc3RydWN0ICBhZmVfc2VydmljZV9zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICptcmVnaW9uX3BsID0gTlVMTDsKLQlpbnQgaW5kZXggPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCi0JCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7Ci0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQlpZiAoZG1hX2J1Zl9zeiAlIFNaXzRLICE9IDApIHsKLQkJLyoKLQkJICogVGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgbXNtX2F1ZGlvX2lvbl9hbGxvYyBpcyBhbHdheXMgNGtCCi0JCSAqIGFsaWduZWQsIEFEU1AgZXhwZWN0cyB0aGUgc2l6ZSB0byBiZSA0a0IgYWxpZ25lZCBhcyB3ZWxsCi0JCSAqIHNvIHJlLWFkanVzdHMgdGhlICBidWZmZXIgc2l6ZSBiZWZvcmUgcGFzc2luZyB0byBBRFNQLgotCQkgKi8KLQkJZG1hX2J1Zl9zeiA9IFBBR0VfQUxJR04oZG1hX2J1Zl9zeik7Ci0JfQotCi0JY21kX3NpemUgPSBzaXplb2Yoc3RydWN0IGFmZV9zZXJ2aWNlX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQotCQkrIHNpemVvZihzdHJ1Y3QgYWZlX3NlcnZpY2Vfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCk7Ci0KLQltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1tYXBfcmVnaW9uX2NtZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltcmVnaW9uID0gKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqKQotCQkJCQkJCW1tYXBfcmVnaW9uX2NtZDsKLQltcmVnaW9uLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JbXJlZ2lvbi0+aGRyLnBrdF9zaXplID0gY21kX3NpemU7Ci0JbXJlZ2lvbi0+aGRyLnNyY19wb3J0ID0gMDsKLQltcmVnaW9uLT5oZHIuZGVzdF9wb3J0ID0gMDsKLQltcmVnaW9uLT5oZHIudG9rZW4gPSAwOwotCW1yZWdpb24tPmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzsKLQltcmVnaW9uLT5tZW1fcG9vbF9pZCA9IEFEU1BfTUVNT1JZX01BUF9TSE1FTThfNEtfUE9PTDsKLQltcmVnaW9uLT5udW1fcmVnaW9ucyA9IDE7Ci0JbXJlZ2lvbi0+cHJvcGVydHlfZmxhZyA9IDB4MDA7Ci0JLyogVG9kbyAqLwotCWluZGV4ID0gbXJlZ2lvbi0+aGRyLnRva2VuID0gSURYX1JTVkRfMjsKLQotCXBheWxvYWQgPSAoKHU4ICopIG1tYXBfcmVnaW9uX2NtZCArCi0JCSAgIHNpemVvZihzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMpKTsKLQotCW1yZWdpb25fcGwgPSAoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOwotCi0JbXJlZ2lvbl9wbC0+c2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKLQltcmVnaW9uX3BsLT5zaG1fYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKLQltcmVnaW9uX3BsLT5tZW1fc2l6ZV9ieXRlcyA9IGRtYV9idWZfc3o7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRtYV9hZGRyX3AgMHglcEsgLCBzaXplICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJJmRtYV9hZGRyX3AsIGRtYV9idWZfc3opOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXRoaXNfYWZlLm1tYXBfaGFuZGxlID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgbW1hcF9yZWdpb25fY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBBRkUgbWVtb3J5IG1hcCBjbWQgZmFpbGVkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAotCQkJCSAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSA+IDApIHsKLQkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWQgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWtmcmVlKG1tYXBfcmVnaW9uX2NtZCk7Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOwotCXByX2VycigiJXM6IGZhaWxfY21kXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9jbWRfbWVtb3J5X21hcF9ub3dhaXQoaW50IHBvcnRfaWQsIHBoeXNfYWRkcl90IGRtYV9hZGRyX3AsCi0JCXUzMiBkbWFfYnVmX3N6KQotewotCWludCByZXQgPSAwOwotCWludCBjbWRfc2l6ZSA9IDA7Ci0Jdm9pZCAgICAqcGF5bG9hZCA9IE5VTEw7Ci0Jdm9pZCAgICAqbW1hcF9yZWdpb25fY21kID0gTlVMTDsKLQlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKm1yZWdpb24gPSBOVUxMOwotCXN0cnVjdCAgYWZlX3NlcnZpY2Vfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqbXJlZ2lvbl9wbCA9IE5VTEw7Ci0JaW50IGluZGV4ID0gMDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAotCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOwotCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleCByZXQgJWQiLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNtZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykKLQkJKyBzaXplb2Yoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQpOwotCi0JbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtbWFwX3JlZ2lvbl9jbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXJlZ2lvbiA9IChzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKikKLQkJCQkJCW1tYXBfcmVnaW9uX2NtZDsKLQltcmVnaW9uLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JbXJlZ2lvbi0+aGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOwotCW1yZWdpb24tPmhkci5zcmNfcG9ydCA9IDA7Ci0JbXJlZ2lvbi0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JbXJlZ2lvbi0+aGRyLnRva2VuID0gMDsKLQltcmVnaW9uLT5oZHIub3Bjb2RlID0gQUZFX1NFUlZJQ0VfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM7Ci0JbXJlZ2lvbi0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0JbXJlZ2lvbi0+bnVtX3JlZ2lvbnMgPSAxOwotCW1yZWdpb24tPnByb3BlcnR5X2ZsYWcgPSAweDAwOwotCi0JcGF5bG9hZCA9ICgodTggKikgbW1hcF9yZWdpb25fY21kICsKLQkJc2l6ZW9mKHN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOwotCW1yZWdpb25fcGwgPSAoc3RydWN0IGFmZV9zZXJ2aWNlX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgKilwYXlsb2FkOwotCi0JbXJlZ2lvbl9wbC0+c2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKLQltcmVnaW9uX3BsLT5zaG1fYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKLQltcmVnaW9uX3BsLT5tZW1fc2l6ZV9ieXRlcyA9IGRtYV9idWZfc3o7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KG1tYXBfcmVnaW9uX2NtZCwgTlVMTCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIG1lbW9yeSBtYXAgY21kIGZhaWxlZCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCWtmcmVlKG1tYXBfcmVnaW9uX2NtZCk7Ci0JcmV0dXJuIHJldDsKLX0KLWludCBxNmFmZV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IGFmZV9hdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhZmVfYXVkaW9fcG9ydF9kYXRhICpwb3J0OwotCWludCBjbnQgPSAwOwotCi0JbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKLQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07Ci0JaWYgKCFwb3J0LT5idWYpIHsKLQkJcHJfZXJyKCIlczogYnVmIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JY250ID0gcG9ydC0+bWF4X2J1Zl9jbnQgLSAxOwotCi0JaWYgKHBvcnQtPmJ1ZlswXS5kYXRhKSB7Ci0JCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS10gLCBjbGllbnRbJXBLXSBoYW5kbGVbJXBLXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJcG9ydC0+YnVmWzBdLmRhdGEsCi0JCQkmcG9ydC0+YnVmWzBdLnBoeXMsCi0JCQkmcG9ydC0+YnVmWzBdLnBoeXMsCi0JCQlwb3J0LT5idWZbMF0uY2xpZW50LAotCQkJcG9ydC0+YnVmWzBdLmhhbmRsZSk7Ci0JCW1zbV9hdWRpb19pb25fZnJlZShwb3J0LT5idWZbMF0uY2xpZW50LCBwb3J0LT5idWZbMF0uaGFuZGxlKTsKLQkJcG9ydC0+YnVmWzBdLmNsaWVudCA9IE5VTEw7Ci0JCXBvcnQtPmJ1ZlswXS5oYW5kbGUgPSBOVUxMOwotCX0KLQotCXdoaWxlIChjbnQgPj0gMCkgewotCQlwb3J0LT5idWZbY250XS5kYXRhID0gTlVMTDsKLQkJcG9ydC0+YnVmW2NudF0ucGh5cyA9IDA7Ci0JCWNudC0tOwotCX0KLQlwb3J0LT5tYXhfYnVmX2NudCA9IDA7Ci0Ja2ZyZWUocG9ydC0+YnVmKTsKLQlwb3J0LT5idWYgPSBOVUxMOwotCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBxNmFmZV9hdWRpb19jbGllbnRfZnJlZShzdHJ1Y3QgYWZlX2F1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IGxvb3BjbnQ7Ci0Jc3RydWN0IGFmZV9hdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0KLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChsb29wY250ID0gMDsgbG9vcGNudCA8PSBPVVQ7IGxvb3BjbnQrKykgewotCQlwb3J0ID0gJmFjLT5wb3J0W2xvb3BjbnRdOwotCQlpZiAoIXBvcnQtPmJ1ZikKLQkJCWNvbnRpbnVlOwotCQlwcl9kZWJ1ZygiJXM6IGxvb3BjbnQgPSAlZFxuIiwgX19mdW5jX18sIGxvb3BjbnQpOwotCQlxNmFmZV9hdWRpb19jbGllbnRfYnVmX2ZyZWVfY29udGlndW91cyhsb29wY250LCBhYyk7Ci0JfQotCWtmcmVlKGFjKTsKLX0KLQotaW50IGFmZV9jbWRfbWVtb3J5X3VubWFwKHUzMiBtZW1fbWFwX2hhbmRsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3NoYXJlZF9tZW1fdW5tYXBfcmVnaW9ucyBtcmVnaW9uOwotCWludCBpbmRleCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IGhhbmRsZSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtX21hcF9oYW5kbGUpOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCi0JCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7Ci0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQotCW1yZWdpb24uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCW1yZWdpb24uaGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOwotCW1yZWdpb24uaGRyLnNyY19wb3J0ID0gMDsKLQltcmVnaW9uLmhkci5kZXN0X3BvcnQgPSAwOwotCW1yZWdpb24uaGRyLnRva2VuID0gMDsKLQltcmVnaW9uLmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOwotCW1yZWdpb24ubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKLQotCS8qIFRvZG8gKi8KLQlpbmRleCA9IG1yZWdpb24uaGRyLnRva2VuID0gSURYX1JTVkRfMjsKLQotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmbXJlZ2lvbiwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkUgbWVtb3J5IHVubWFwIGNtZCBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfY21kX21lbW9yeV91bm1hcF9ub3dhaXQodTMyIG1lbV9tYXBfaGFuZGxlKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhZmVfc2VydmljZV9jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIG1yZWdpb247Ci0KLQlwcl9kZWJ1ZygiJXM6IGhhbmRsZSAweCV4XG4iLCBfX2Z1bmNfXywgbWVtX21hcF9oYW5kbGUpOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCi0JCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7Ci0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQotCW1yZWdpb24uaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCW1yZWdpb24uaGRyLnBrdF9zaXplID0gc2l6ZW9mKG1yZWdpb24pOwotCW1yZWdpb24uaGRyLnNyY19wb3J0ID0gMDsKLQltcmVnaW9uLmhkci5kZXN0X3BvcnQgPSAwOwotCW1yZWdpb24uaGRyLnRva2VuID0gMDsKLQltcmVnaW9uLmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOwotCW1yZWdpb24ubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJm1yZWdpb24sIE5VTEwpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRSBtZW1vcnkgdW5tYXAgY21kIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfcmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCwKLQkJdm9pZCAoKmNiKSh1aW50MzJfdCBvcGNvZGUsCi0JCXVpbnQzMl90IHRva2VuLCB1aW50MzJfdCAqcGF5bG9hZCwgdm9pZCAqcHJpdiksCi0JCXZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3JlZ2lzdGVyX3J0X3BvcnRfZHJpdmVyIHJ0cHJveHk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQ6IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQotCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQl0aGlzX2FmZS5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQUZFIiwgYWZlX2NhbGxiYWNrLAotCQkJCQkweEZGRkZGRkZGLCAmdGhpc19hZmUpOwotCQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBRkVcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJ0YWNfc2V0X2FmZV9oYW5kbGUodGhpc19hZmUuYXByKTsKLQl9Ci0JaWYgKChwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfUlgpIHx8Ci0JCShwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDFfVFgpKSB7Ci0JCXBvcnRfaWQgPSBWSVJUVUFMX0lEX1RPX1BPUlRJRChwb3J0X2lkKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiB3cm9uZyBwb3J0IGlkIDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfUE9SVF8wMDFfVFgpIHsKLQkJdGhpc19hZmUudHhfY2IgPSBjYjsKLQkJdGhpc19hZmUudHhfcHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOwotCX0gZWxzZSBpZiAocG9ydF9pZCA9PSBSVF9QUk9YWV9QT1JUXzAwMV9SWCkgewotCQl0aGlzX2FmZS5yeF9jYiA9IGNiOwotCQl0aGlzX2FmZS5yeF9wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Ci0JfQotCi0JcnRwcm94eS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JcnRwcm94eS5oZHIucGt0X3NpemUgPSBzaXplb2YocnRwcm94eSk7Ci0JcnRwcm94eS5oZHIuc3JjX3BvcnQgPSAxOwotCXJ0cHJveHkuaGRyLmRlc3RfcG9ydCA9IDE7Ci0JcnRwcm94eS5oZHIub3Bjb2RlID0gQUZFX1NFUlZJQ0VfQ01EX1JFR0lTVEVSX1JUX1BPUlRfRFJJVkVSOwotCXJ0cHJveHkucG9ydF9pZCA9IHBvcnRfaWQ7Ci0JcnRwcm94eS5yZXNlcnZlZCA9IDA7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZydHByb3h5LCBOVUxMKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkUgIHJlZy4gcnRwcm94eV9ldmVudCBmYWlsZWQgJWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3VucmVnaXN0ZXJfZ2V0X2V2ZW50cyh1MTYgcG9ydF9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWZlX3NlcnZpY2VfY21kX3VucmVnaXN0ZXJfcnRfcG9ydF9kcml2ZXIgcnRwcm94eTsKLQlpbnQgaW5kZXggPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXRoaXNfYWZlLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBRkUiLCBhZmVfY2FsbGJhY2ssCi0JCQkJCTB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7Ci0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQotCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAotCQkocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYKSkgewotCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogd3JvbmcgcG9ydCBpZCAweCV4XG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwb3J0IDB4JXggcmV0ICVkIiwgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ0cHJveHkuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXJ0cHJveHkuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHJ0cHJveHkpOwotCXJ0cHJveHkuaGRyLnNyY19wb3J0ID0gMDsKLQlydHByb3h5Lmhkci5kZXN0X3BvcnQgPSAwOwotCXJ0cHJveHkuaGRyLnRva2VuID0gMDsKLQlydHByb3h5Lmhkci5vcGNvZGUgPSBBRkVfU0VSVklDRV9DTURfVU5SRUdJU1RFUl9SVF9QT1JUX0RSSVZFUjsKLQlydHByb3h5LnBvcnRfaWQgPSBwb3J0X2lkOwotCXJ0cHJveHkucmVzZXJ2ZWQgPSAwOwotCi0JcnRwcm94eS5oZHIudG9rZW4gPSBpbmRleDsKLQotCWlmIChwb3J0X2lkID09IFJUX1BST1hZX1BPUlRfMDAxX1RYKSB7Ci0JCXRoaXNfYWZlLnR4X2NiID0gTlVMTDsKLQkJdGhpc19hZmUudHhfcHJpdmF0ZV9kYXRhID0gTlVMTDsKLQl9IGVsc2UgaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfUE9SVF8wMDFfUlgpIHsKLQkJdGhpc19hZmUucnhfY2IgPSBOVUxMOwotCQl0aGlzX2FmZS5yeF9wcml2YXRlX2RhdGEgPSBOVUxMOwotCX0KLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJnJ0cHJveHksICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBVbnJlZy4gcnRwcm94eV9ldmVudCBmYWlsZWQgJWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3J0X3Byb3h5X3BvcnRfd3JpdGUocGh5c19hZGRyX3QgYnVmX2FkZHJfcCwKLQkJdTMyIG1lbV9tYXBfaGFuZGxlLCBpbnQgYnl0ZXMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFmZV9wb3J0X2RhdGFfY21kX3J0X3Byb3h5X3BvcnRfd3JpdGVfdjIgYWZlY21kX3dyOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHJlZ2lzdGVyIHRvIEFGRSBpcyBub3QgZG9uZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRU5PREVWOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcl9kZWJ1ZygiJXM6IGJ1Zl9hZGRyX3AgPSAweCVwSyBieXRlcyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJCSZidWZfYWRkcl9wLCBieXRlcyk7Ci0KLQlhZmVjbWRfd3IuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFmZWNtZF93ci5oZHIucGt0X3NpemUgPSBzaXplb2YoYWZlY21kX3dyKTsKLQlhZmVjbWRfd3IuaGRyLnNyY19wb3J0ID0gMDsKLQlhZmVjbWRfd3IuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JYWZlY21kX3dyLmhkci50b2tlbiA9IDA7Ci0JYWZlY21kX3dyLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1dSSVRFX1YyOwotCWFmZWNtZF93ci5wb3J0X2lkID0gUlRfUFJPWFlfUE9SVF8wMDFfVFg7Ci0JYWZlY21kX3dyLmJ1ZmZlcl9hZGRyZXNzX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2FkZHJfcCk7Ci0JYWZlY21kX3dyLmJ1ZmZlcl9hZGRyZXNzX21zdyA9Ci0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkcl9wKTsKLQlhZmVjbWRfd3IubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKLQlhZmVjbWRfd3IuYXZhaWxhYmxlX2J5dGVzID0gYnl0ZXM7Ci0JYWZlY21kX3dyLnJlc2VydmVkID0gMDsKLQotCXJldCA9IGFmZV9hcHJfc2VuZF9wa3QoJmFmZWNtZF93ciwgTlVMTCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIHJ0cHJveHkgd3JpdGUgdG8gcG9ydCAweCV4IGZhaWxlZCAlZFxuIiwKLQkJCSAgIF9fZnVuY19fLCBhZmVjbWRfd3IucG9ydF9pZCwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi19Ci0KLWludCBhZmVfcnRfcHJveHlfcG9ydF9yZWFkKHBoeXNfYWRkcl90IGJ1Zl9hZGRyX3AsCi0JCXUzMiBtZW1fbWFwX2hhbmRsZSwgaW50IGJ5dGVzKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhZmVfcG9ydF9kYXRhX2NtZF9ydF9wcm94eV9wb3J0X3JlYWRfdjIgYWZlY21kX3JkOwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHJlZ2lzdGVyIHRvIEFGRSBpcyBub3QgZG9uZVxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRU5PREVWOwotCQlyZXR1cm4gcmV0OwotCX0KLQlwcl9kZWJ1ZygiJXM6IGJ1Zl9hZGRyX3AgPSAweCVwSyBieXRlcyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJCSZidWZfYWRkcl9wLCBieXRlcyk7Ci0KLQlhZmVjbWRfcmQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFmZWNtZF9yZC5oZHIucGt0X3NpemUgPSBzaXplb2YoYWZlY21kX3JkKTsKLQlhZmVjbWRfcmQuaGRyLnNyY19wb3J0ID0gMDsKLQlhZmVjbWRfcmQuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JYWZlY21kX3JkLmhkci50b2tlbiA9IDA7Ci0JYWZlY21kX3JkLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9EQVRBX0NNRF9SVF9QUk9YWV9QT1JUX1JFQURfVjI7Ci0JYWZlY21kX3JkLnBvcnRfaWQgPSBSVF9QUk9YWV9QT1JUXzAwMV9SWDsKLQlhZmVjbWRfcmQuYnVmZmVyX2FkZHJlc3NfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkcl9wKTsKLQlhZmVjbWRfcmQuYnVmZmVyX2FkZHJlc3NfbXN3ID0KLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfYWRkcl9wKTsKLQlhZmVjbWRfcmQuYXZhaWxhYmxlX2J5dGVzID0gYnl0ZXM7Ci0JYWZlY21kX3JkLm1lbV9tYXBfaGFuZGxlID0gbWVtX21hcF9oYW5kbGU7Ci0KLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZhZmVjbWRfcmQsIE5VTEwpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRSBydHByb3h5IHJlYWQgIGNtZCB0byBwb3J0IDB4JXggZmFpbGVkICVkXG4iLAotCQkJICAgX19mdW5jX18sIGFmZWNtZF9yZC5wb3J0X2lkLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2FmZWxiOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfYWZlbGJfZ2FpbjsKLQotc3RhdGljIGludCBhZmVfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXByX2luZm8oIiVzOiBkZWJ1ZyBpbnRmICVzXG4iLCBfX2Z1bmNfXywgKGNoYXIgKikgZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZmVfZ2V0X3BhcmFtZXRlcnMoY2hhciAqYnVmLCBsb25nIGludCAqcGFyYW0xLCBpbnQgbnVtX29mX3BhcikKLXsKLQljaGFyICp0b2tlbjsKLQlpbnQgYmFzZSwgY250OwotCi0JdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIiAiKTsKLQotCWZvciAoY250ID0gMDsgY250IDwgbnVtX29mX3BhcjsgY250KyspIHsKLQkJaWYgKHRva2VuICE9IE5VTEwpIHsKLQkJCWlmICgodG9rZW5bMV0gPT0gJ3gnKSB8fCAodG9rZW5bMV0gPT0gJ1gnKSkKLQkJCQliYXNlID0gMTY7Ci0JCQllbHNlCi0JCQkJYmFzZSA9IDEwOwotCi0JCQlpZiAoa3N0cnRvdWwodG9rZW4sIGJhc2UsICZwYXJhbTFbY250XSkgIT0gMCkgewotCQkJCXByX2VycigiJXM6IGtzdHJ0b3VsIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiICIpOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogdG9rZW4gTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZGVmaW5lIEFGRV9MT09QQkFDS19PTiAoMSkKLSNkZWZpbmUgQUZFX0xPT1BCQUNLX09GRiAoMCkKLXN0YXRpYyBzc2l6ZV90IGFmZV9kZWJ1Z193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwKLQljb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmxiX3N0ciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQljaGFyIGxidWZbMzJdOwotCWludCByYzsKLQl1bnNpZ25lZCBsb25nIHBhcmFtWzVdOwotCi0JaWYgKGNudCA+IHNpemVvZihsYnVmKSAtIDEpIHsKLQkJcHJfZXJyKCIlczogY250ICV6ZCBzaXplICV6ZFxuIiwgX19mdW5jX18sIGNudCwgc2l6ZW9mKGxidWYpLTEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYyA9IGNvcHlfZnJvbV91c2VyKGxidWYsIHVidWYsIGNudCk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JbGJ1ZltjbnRdID0gJ1wwJzsKLQotCWlmICghc3RyY21wKGxiX3N0ciwgImFmZV9sb29wYmFjayIpKSB7Ci0JCXJjID0gYWZlX2dldF9wYXJhbWV0ZXJzKGxidWYsIHBhcmFtLCAzKTsKLQkJaWYgKCFyYykgewotCQkJcHJfaW5mbygiJXM6ICVsdSAlbHUgJWx1XG4iLCBsYl9zdHIsIHBhcmFtWzBdLCBwYXJhbVsxXSwKLQkJCQlwYXJhbVsyXSk7Ci0KLQkJCWlmICgocGFyYW1bMF0gIT0gQUZFX0xPT1BCQUNLX09OKSAmJiAocGFyYW1bMF0gIT0KLQkJCQlBRkVfTE9PUEJBQ0tfT0ZGKSkgewotCQkJCXByX2VycigiJXM6IEVycm9yLCBwYXJhbWV0ZXIgMCBpbmNvcnJlY3RcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBhZmVfZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoKHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwYXJhbVsxXSkgPCAwKSB8fAotCQkJICAgIChxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocGFyYW1bMl0pKSA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBFcnJvciwgaW52YWxpZCBhZmUgcG9ydFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJfQotCQkJaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCIlczogRXJyb3IsIEFGRSBub3Qgb3BlbmVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IGFmZV9sb29wYmFjayhwYXJhbVswXSwgcGFyYW1bMV0sIHBhcmFtWzJdKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEVycm9yLCBpbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCi0JfSBlbHNlIGlmICghc3RyY21wKGxiX3N0ciwgImFmZV9sb29wYmFja19nYWluIikpIHsKLQkJcmMgPSBhZmVfZ2V0X3BhcmFtZXRlcnMobGJ1ZiwgcGFyYW0sIDIpOwotCQlpZiAoIXJjKSB7Ci0JCQlwcl9pbmZvKCIlczogJXMgJWx1ICVsdVxuIiwKLQkJCQlfX2Z1bmNfXywgbGJfc3RyLCBwYXJhbVswXSwgcGFyYW1bMV0pOwotCi0JCQlyYyA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwYXJhbVswXSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRXJyb3IsIGludmFsaWQgYWZlIHBvcnQgJWQgJWx1XG4iLAotCQkJCQlfX2Z1bmNfXywgcmMsIHBhcmFtWzBdKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQkJZ290byBhZmVfZXJyb3I7Ci0JCQl9Ci0KLQkJCWlmIChwYXJhbVsxXSA+IDEwMCkgewotCQkJCXByX2VycigiJXM6IEVycm9yLCB2b2x1bWUgc2hvdWxkIGJlIDAgdG8gMTAwIHBlcmNlbnRhZ2UgcGFyYW0gPSAlbHVcbiIsCi0JCQkJCV9fZnVuY19fLCBwYXJhbVsxXSk7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gYWZlX2Vycm9yOwotCQkJfQotCi0JCQlwYXJhbVsxXSA9IChRNkFGRV9NQVhfVk9MVU1FICogcGFyYW1bMV0pIC8gMTAwOwotCi0JCQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJCQlwcl9lcnIoIiVzOiBFcnJvciwgQUZFIG5vdCBvcGVuZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlyYyA9IC1FSU5WQUw7Ci0JCQl9IGVsc2UgewotCQkJCXJjID0gYWZlX2xvb3BiYWNrX2dhaW4ocGFyYW1bMF0sIHBhcmFtWzFdKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEVycm9yLCBpbnZhbGlkIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJfQotCX0KLQotYWZlX2Vycm9yOgotCWlmIChyYyA9PSAwKQotCQlyYyA9IGNudDsKLQllbHNlCi0JCXByX2VycigiJXM6IHJjID0gJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmZV9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gYWZlX2RlYnVnX29wZW4sCi0JLndyaXRlID0gYWZlX2RlYnVnX3dyaXRlCi19OwotCi1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfaW5pdCh2b2lkKQotewotCWRlYnVnZnNfYWZlbGIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhZmVfbG9vcGJhY2siLAotCTA2NjQsIE5VTEwsICh2b2lkICopICJhZmVfbG9vcGJhY2siLAotCSZhZmVfZGVidWdfZm9wcyk7Ci0KLQlkZWJ1Z2ZzX2FmZWxiX2dhaW4gPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhZmVfbG9vcGJhY2tfZ2FpbiIsCi0JMDY2NCwgTlVMTCwgKHZvaWQgKikgImFmZV9sb29wYmFja19nYWluIiwKLQkmYWZlX2RlYnVnX2ZvcHMpOwotfQotc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX2V4aXQodm9pZCkKLXsKLQlkZWJ1Z2ZzX3JlbW92ZShkZWJ1Z2ZzX2FmZWxiKTsKLQlkZWJ1Z2ZzX3JlbW92ZShkZWJ1Z2ZzX2FmZWxiX2dhaW4pOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCi17Ci19Ci1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfZXhpdCh2b2lkKQotewotfQotI2VuZGlmCi0KLXZvaWQgYWZlX3NldF9kdG1mX2dlbl9yeF9wb3J0aWQodTE2IHBvcnRfaWQsIGludCBzZXQpCi17Ci0JaWYgKHNldCkKLQkJdGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkID0gcG9ydF9pZDsKLQllbHNlIGlmICh0aGlzX2FmZS5kdG1mX2dlbl9yeF9wb3J0aWQgPT0gcG9ydF9pZCkKLQkJdGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkID0gLTE7Ci19Ci0KLWludCBhZmVfZHRtZl9nZW5lcmF0ZV9yeChpbnQ2NF90IGR1cmF0aW9uX2luX21zLAotCQkJIHVpbnQxNl90IGhpZ2hfZnJlcSwKLQkJCSB1aW50MTZfdCBsb3dfZnJlcSwgdWludDE2X3QgZ2FpbikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXN0cnVjdCBhZmVfZHRtZl9nZW5lcmF0aW9uX2NvbW1hbmQgY21kX2R0bWY7Ci0KLQlwcl9kZWJ1ZygiJXM6IERUTUYgQUZFIEdlblxuIiwgX19mdW5jX18pOwotCi0JaWYgKGFmZV92YWxpZGF0ZV9wb3J0KHRoaXNfYWZlLmR0bWZfZ2VuX3J4X3BvcnRpZCkgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCA6IEludmFsaWQgUG9ydCBpZCA9IDB4JXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJdGhpc19hZmUuYXByID0gYXByX3JlZ2lzdGVyKCJBRFNQIiwgIkFGRSIsIGFmZV9jYWxsYmFjaywKLQkJCQkJICAgIDB4RkZGRkZGRkYsICZ0aGlzX2FmZSk7Ci0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgQUZFXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmICh0aGlzX2FmZS5hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIEFGRVxuIiwgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcnRhY19zZXRfYWZlX2hhbmRsZSh0aGlzX2FmZS5hcHIpOwotCX0KLQotCXByX2RlYnVnKCIlczogZHVyPSVsbGQ6IGhmcmVxPSVkIGxmcmVxPSVkIGdhaW49JWQgcG9ydGlkPTB4JXhcbiIsCi0JCV9fZnVuY19fLAotCQlkdXJhdGlvbl9pbl9tcywgaGlnaF9mcmVxLCBsb3dfZnJlcSwgZ2FpbiwKLQkJdGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkKTsKLQotCWNtZF9kdG1mLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljbWRfZHRtZi5oZHIucGt0X3NpemUgPSBzaXplb2YoY21kX2R0bWYpOwotCWNtZF9kdG1mLmhkci5zcmNfcG9ydCA9IDA7Ci0JY21kX2R0bWYuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY21kX2R0bWYuaGRyLnRva2VuID0gMDsKLQljbWRfZHRtZi5oZHIub3Bjb2RlID0gQUZFX1BPUlRTX0NNRF9EVE1GX0NUTDsKLQljbWRfZHRtZi5kdXJhdGlvbl9pbl9tcyA9IGR1cmF0aW9uX2luX21zOwotCWNtZF9kdG1mLmhpZ2hfZnJlcSA9IGhpZ2hfZnJlcTsKLQljbWRfZHRtZi5sb3dfZnJlcSA9IGxvd19mcmVxOwotCWNtZF9kdG1mLmdhaW4gPSBnYWluOwotCWNtZF9kdG1mLm51bV9wb3J0cyA9IDE7Ci0JY21kX2R0bWYucG9ydF9pZHMgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHRoaXNfYWZlLmR0bWZfZ2VuX3J4X3BvcnRpZCk7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNtZF9kdG1mKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBBRkUgRFRNRiBmYWlsZWQgZm9yIG51bV9wb3J0czolZCBpZHM6MHgleFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjbWRfZHRtZi5udW1fcG9ydHMsIGNtZF9kdG1mLnBvcnRfaWRzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHRoaXNfYWZlLmR0bWZfZ2VuX3J4X3BvcnRpZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCi0JCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSA+IDApIHsKLQkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWQgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLQotZmFpbF9jbWQ6Ci0JcHJfZXJyKCIlczogZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9zaWRldG9uZV9paXIodTE2IHR4X3BvcnRfaWQpCi17Ci0Jc3RydWN0IGFmZV9sb29wYmFja19paXJfY2ZnX3YyIGlpcl9zaWRldG9uZTsKLQlpbnQgcmV0OwotCWludCBpbmRleCA9IDA7Ci0JdWludDE2X3Qgc2l6ZSA9IDA7Ci0JaW50IGNhbF9pbmRleCA9IEFGRV9TSURFVE9ORV9JSVJfQ0FMOwotCWludCBpaXJfcHJlZ2FpbiA9IDA7Ci0JaW50IGlpcl9udW1fYmlxdWFkX3N0YWdlcyA9IDA7Ci0JaW50IGlpcl9lbmFibGU7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2s7Ci0JaW50IG1pZDsKLQotCW1lbXNldCgmaWlyX3NpZGV0b25lLCAwLCBzaXplb2YoaWlyX3NpZGV0b25lKSk7Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHR4X3BvcnRfaWQpOwotCWlpcl9zaWRldG9uZS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlpaXJfc2lkZXRvbmUuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGlpcl9zaWRldG9uZSk7Ci0JaWlyX3NpZGV0b25lLmhkci5zcmNfcG9ydCA9IDA7Ci0JaWlyX3NpZGV0b25lLmhkci5kZXN0X3BvcnQgPSAwOwotCWlpcl9zaWRldG9uZS5oZHIudG9rZW4gPSBpbmRleDsKLQlpaXJfc2lkZXRvbmUuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjI7Ci0JaWlyX3NpZGV0b25lLnBhcmFtLnBvcnRfaWQgPSB0eF9wb3J0X2lkOwotCWlpcl9zaWRldG9uZS5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMHgwMDsKLQlpaXJfc2lkZXRvbmUucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JaWlyX3NpZGV0b25lLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQotCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsIGRhdGEgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2sodGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF9ibG9jayBub3QgZm91bmRcbiAiLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpaXJfcHJlZ2FpbiA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lX2lpciAqKQotCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbyktPnByZWdhaW47Ci0JaWlyX2VuYWJsZSA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lX2lpciAqKQotCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbyktPmlpcl9lbmFibGU7Ci0JaWlyX251bV9iaXF1YWRfc3RhZ2VzID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmVfaWlyICopCi0JCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+bnVtX2JpcXVhZF9zdGFnZXM7Ci0JbWlkID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmVfaWlyICopCi0JCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+bWlkOwotCi0JLyoKLQkgKiBjYWxjdWxhdGUgdGhlIGFjdHVhbCBzaXplIG9mIHBheWxvYWQgYmFzZWQgb24gbm8gb2Ygc3RhZ2VzCi0JICogZW5hYmxlZCBpbiBjYWxpYnJhdGlvbgotCSAqLwotCXNpemUgPSAoTUFYX1NJREVUT05FX0lJUl9EQVRBX1NJWkUgLyBNQVhfTk9fSUlSX0ZJTFRFUl9TVEFHRSkgKgotCQlpaXJfbnVtX2JpcXVhZF9zdGFnZXM7Ci0JLyoKLQkgKiBGb3IgYW4gb2RkIG51bWJlciBvZiBzdGFnZXMsIDIgYnl0ZXMgb2YgcGFkZGluZyBhcmUKLQkgKiByZXF1aXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYXlsb2FkLgotCSAqLwotCWlmIChpaXJfbnVtX2JpcXVhZF9zdGFnZXMgJSAyKSB7Ci0JCXByX2RlYnVnKCIlczogYWRkaW5nIDIgdG8gc2l6ZTolZFxuIiwgX19mdW5jX18sIHNpemUpOwotCQlzaXplID0gc2l6ZSArIDI7Ci0JfQotCW1lbWNweSgmaWlyX3NpZGV0b25lLnN0X2lpcl9maWx0ZXJfY29uZmlnX2RhdGEuaWlyX2NvbmZpZywKLQkJJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lX2lpciAqKQotCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+aWlyX2NvbmZpZywKLQkJc2l6ZW9mKGlpcl9zaWRldG9uZS5zdF9paXJfZmlsdGVyX2NvbmZpZ19kYXRhLmlpcl9jb25maWcpKTsKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgdGhlIHBheWxvYWQgc2l6ZSBmb3Igc2V0cGFyYW1zIGNvbW1hbmQKLQkgKi8KLQlpaXJfc2lkZXRvbmUucGFyYW0ucGF5bG9hZF9zaXplID0gKHNpemVvZihpaXJfc2lkZXRvbmUpIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIpIC0KLQkJCQkoTUFYX1NJREVUT05FX0lJUl9EQVRBX1NJWkUgLSBzaXplKSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBheWxvYWQgc2l6ZSA6JWRcbiIsIF9fZnVuY19fLAotCQkgaWlyX3NpZGV0b25lLnBhcmFtLnBheWxvYWRfc2l6ZSk7Ci0KLQkvKgotCSAqIFNldCBJSVIgZW5hYmxlIHBhcmFtcwotCSAqLwotCWlpcl9zaWRldG9uZS5zdF9paXJfZW5hYmxlX3BkYXRhLm1vZHVsZV9pZCA9IG1pZDsKLQlpaXJfc2lkZXRvbmUuc3RfaWlyX2VuYWJsZV9wZGF0YS5wYXJhbV9pZCA9Ci0JCQlBRkVfUEFSQU1fSURfRU5BQkxFOwotCWlpcl9zaWRldG9uZS5zdF9paXJfZW5hYmxlX3BkYXRhLnBhcmFtX3NpemUgPQotCQkJc2l6ZW9mKGlpcl9zaWRldG9uZS5zdF9paXJfbW9kZV9lbmFibGVfZGF0YSk7Ci0JaWlyX3NpZGV0b25lLnN0X2lpcl9tb2RlX2VuYWJsZV9kYXRhLmVuYWJsZSA9IGlpcl9lbmFibGU7Ci0KLQkvKgotCSAqIFNldCBJSVIgZmlsdGVyIGNvbmZpZyBwYXJhbXMKLQkgKi8KLQlpaXJfc2lkZXRvbmUuc3RfaWlyX2ZpbHRlcl9jb25maWdfcGRhdGEubW9kdWxlX2lkID0gbWlkOwotCWlpcl9zaWRldG9uZS5zdF9paXJfZmlsdGVyX2NvbmZpZ19wZGF0YS5wYXJhbV9pZCA9Ci0JCQlBRkVfUEFSQU1fSURfU0lERVRPTkVfSUlSX0ZJTFRFUl9DT05GSUc7Ci0JaWlyX3NpZGV0b25lLnN0X2lpcl9maWx0ZXJfY29uZmlnX3BkYXRhLnBhcmFtX3NpemUgPQotCQlzaXplb2YoaWlyX3NpZGV0b25lLnN0X2lpcl9maWx0ZXJfY29uZmlnX2RhdGEubnVtX2JpcXVhZF9zdGFnZXMpCi0JCSsKLQkJc2l6ZW9mKGlpcl9zaWRldG9uZS5zdF9paXJfZmlsdGVyX2NvbmZpZ19kYXRhLnByZWdhaW4pICsgc2l6ZTsKLQlpaXJfc2lkZXRvbmUuc3RfaWlyX2ZpbHRlcl9jb25maWdfcGRhdGEucmVzZXJ2ZWQgPSAwOwotCWlpcl9zaWRldG9uZS5zdF9paXJfZmlsdGVyX2NvbmZpZ19kYXRhLm51bV9iaXF1YWRfc3RhZ2VzID0KLQkJCWlpcl9udW1fYmlxdWFkX3N0YWdlczsKLQlpaXJfc2lkZXRvbmUuc3RfaWlyX2ZpbHRlcl9jb25maWdfZGF0YS5wcmVnYWluID0gaWlyX3ByZWdhaW47Ci0JcHJfZGVidWcoIiVzOiB0eCgweCV4KW1pZCgweCV4KWlpcl9lbiglZClzdGcoJWQpZ2FpbigweCV4KXNpemUoJWQpXG4iLAotCQkgIF9fZnVuY19fLCB0eF9wb3J0X2lkLCBtaWQsCi0JCSAgaWlyX3NpZGV0b25lLnN0X2lpcl9tb2RlX2VuYWJsZV9kYXRhLmVuYWJsZSwKLQkJICBpaXJfc2lkZXRvbmUuc3RfaWlyX2ZpbHRlcl9jb25maWdfZGF0YS5udW1fYmlxdWFkX3N0YWdlcywKLQkJICBpaXJfc2lkZXRvbmUuc3RfaWlyX2ZpbHRlcl9jb25maWdfZGF0YS5wcmVnYWluLAotCQkgIGlpcl9zaWRldG9uZS5zdF9paXJfZmlsdGVyX2NvbmZpZ19wZGF0YS5wYXJhbV9zaXplKTsKLQlyZXQgPSBhZmVfYXByX3NlbmRfcGt0KCZpaXJfc2lkZXRvbmUsICZ0aGlzX2FmZS53YWl0W2luZGV4XSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIHNpZGV0b25lIGZhaWxlZCBmb3IgdHhfcG9ydCgweCV4KVxuIiwKLQkJCSBfX2Z1bmNfXywgdHhfcG9ydF9pZCk7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgaW50IGFmZV9zaWRldG9uZSh1MTYgdHhfcG9ydF9pZCwgdTE2IHJ4X3BvcnRfaWQsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBhZmVfc3RfbG9vcGJhY2tfY2ZnX3YxIGNtZF9zaWRldG9uZTsKLQlpbnQgcmV0OwotCWludCBpbmRleDsKLQlpbnQgY2FsX2luZGV4ID0gQUZFX1NJREVUT05FX0NBTDsKLQlpbnQgc2lkZXRvbmVfZ2FpbjsKLQlpbnQgc2lkZXRvbmVfZW5hYmxlOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrOwotCWludCBtaWQgPSAwOwotCi0JbWVtc2V0KCZjbWRfc2lkZXRvbmUsIDAsIHNpemVvZihjbWRfc2lkZXRvbmUpKTsKLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbCBkYXRhIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKLQljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKHRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0pOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfYmxvY2sgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XS0+bG9jayk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Jc2lkZXRvbmVfZ2FpbiA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lICopCi0JCQkgY2FsX2Jsb2NrLT5jYWxfaW5mbyktPmdhaW47Ci0Jc2lkZXRvbmVfZW5hYmxlID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fc2lkZXRvbmUgKikKLQkJCSBjYWxfYmxvY2stPmNhbF9pbmZvKS0+ZW5hYmxlOwotCW1pZCA9ICgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3NpZGV0b25lICopCi0JCQkgY2FsX2Jsb2NrLT5jYWxfaW5mbyktPm1pZDsKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHR4X3BvcnRfaWQpOwotCWNtZF9zaWRldG9uZS5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY21kX3NpZGV0b25lLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihjbWRfc2lkZXRvbmUpOwotCWNtZF9zaWRldG9uZS5oZHIuc3JjX3BvcnQgPSAwOwotCWNtZF9zaWRldG9uZS5oZHIuZGVzdF9wb3J0ID0gMDsKLQljbWRfc2lkZXRvbmUuaGRyLnRva2VuID0gaW5kZXg7Ci0JY21kX3NpZGV0b25lLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNtZF9zaWRldG9uZS5wYXJhbS5wb3J0X2lkID0gdHhfcG9ydF9pZDsKLQljbWRfc2lkZXRvbmUucGFyYW0ucGF5bG9hZF9zaXplID0gKHNpemVvZihjbWRfc2lkZXRvbmUpIC0KLQkJCXNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyKSk7Ci0JY21kX3NpZGV0b25lLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNtZF9zaWRldG9uZS5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljbWRfc2lkZXRvbmUucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAweDAwOwotCWNtZF9zaWRldG9uZS5nYWluX3BkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfTE9PUEJBQ0s7Ci0JY21kX3NpZGV0b25lLmdhaW5fcGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfTE9PUEJBQ0tfR0FJTl9QRVJfUEFUSDsKLQkvKgotCSAqIHNpemUgb2YgYWN0dWFsIHBheWxvYWQgb25seQotCSAqLwotCWNtZF9zaWRldG9uZS5nYWluX3BkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoCi0JCQkJCSAgICAgc3RydWN0IGFmZV9sb29wYmFja19zaWRldG9uZV9nYWluKTsKLQljbWRfc2lkZXRvbmUuZ2Fpbl9kYXRhLnJ4X3BvcnRfaWQgPSByeF9wb3J0X2lkOwotCWNtZF9zaWRldG9uZS5nYWluX2RhdGEuZ2FpbiA9IHNpZGV0b25lX2dhaW47Ci0KLQljbWRfc2lkZXRvbmUuY2ZnX3BkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfTE9PUEJBQ0s7Ci0JY21kX3NpZGV0b25lLmNmZ19wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9MT09QQkFDS19DT05GSUc7Ci0JLyoKLQkgKiBzaXplIG9mIGFjdHVhbCBwYXlsb2FkIG9ubHkKLQkgKi8KLQljbWRfc2lkZXRvbmUuY2ZnX3BkYXRhLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvb3BiYWNrX2NmZ19kYXRhKTsKLQljbWRfc2lkZXRvbmUuY2ZnX2RhdGEubG9vcGJhY2tfY2ZnX21pbm9yX3ZlcnNpb24gPQotCQkJCQlBRkVfQVBJX1ZFUlNJT05fTE9PUEJBQ0tfQ09ORklHOwotCWNtZF9zaWRldG9uZS5jZmdfZGF0YS5kc3RfcG9ydF9pZCA9IHJ4X3BvcnRfaWQ7Ci0JY21kX3NpZGV0b25lLmNmZ19kYXRhLnJvdXRpbmdfbW9kZSA9IExCX01PREVfU0lERVRPTkU7Ci0JY21kX3NpZGV0b25lLmNmZ19kYXRhLmVuYWJsZSA9IGVuYWJsZTsKLQotCXByX2RlYnVnKCIlcyByeCgweCV4KSB0eCgweCV4KSBlbmFibGUoJWQpIG1pZCgweCV4KSBnYWluKCVkKSBzaWRldG9uZV9lbmFibGUoJWQpXG4iLAotCQkgIF9fZnVuY19fLCByeF9wb3J0X2lkLCB0eF9wb3J0X2lkLAotCQkgIGVuYWJsZSwgbWlkLCBzaWRldG9uZV9nYWluLCBzaWRldG9uZV9lbmFibGUpOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmY21kX3NpZGV0b25lLCAmdGhpc19hZmUud2FpdFtpbmRleF0pOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEFGRSBzaWRldG9uZSBzZW5kIGZhaWxlZCBmb3IgdHhfcG9ydDolZCByeF9wb3J0OiVkIHJldDolZFxuIiwKLQkJCV9fZnVuY19fLCB0eF9wb3J0X2lkLCByeF9wb3J0X2lkLCByZXQpOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3NpZGV0b25lX2VuYWJsZSh1MTYgdHhfcG9ydF9pZCwgdTE2IHJ4X3BvcnRfaWQsIGJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0JaW50IGluZGV4OwotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHJ4X3BvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAocTZhdWRpb192YWxpZGF0ZV9wb3J0KHJ4X3BvcnRfaWQpIDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcnhfcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHR4X3BvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAocTZhdWRpb192YWxpZGF0ZV9wb3J0KHR4X3BvcnRfaWQpIDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgdHhfcG9ydF9pZCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGVuYWJsZSkgewotCQlyZXQgPSBhZmVfc2lkZXRvbmVfaWlyKHR4X3BvcnRfaWQpOwotCQlpZiAocmV0KQotCQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGFmZV9zaWRldG9uZSh0eF9wb3J0X2lkLCByeF9wb3J0X2lkLCBlbmFibGUpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfdmFsaWRhdGVfcG9ydCh1MTYgcG9ydF9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwb3J0X2lkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19SWDoKLQljYXNlIFBSSU1BUllfSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOgotCWNhc2UgTUkyU19SWDoKLQljYXNlIE1JMlNfVFg6Ci0JY2FzZSBIRE1JX1JYOgotCWNhc2UgRElTUExBWV9QT1JUX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU1BESUZfUlg6Ci0JY2FzZSBSU1ZEXzI6Ci0JY2FzZSBSU1ZEXzM6Ci0JY2FzZSBESUdJX01JQ19UWDoKLQljYXNlIFZPSUNFX1JFQ09SRF9SWDoKLQljYXNlIFZPSUNFX1JFQ09SRF9UWDoKLQljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOgotCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOgotCWNhc2UgU0xJTUJVU18wX1JYOgotCWNhc2UgU0xJTUJVU18wX1RYOgotCWNhc2UgU0xJTUJVU18xX1JYOgotCWNhc2UgU0xJTUJVU18xX1RYOgotCWNhc2UgU0xJTUJVU18yX1JYOgotCWNhc2UgU0xJTUJVU18yX1RYOgotCWNhc2UgU0xJTUJVU18zX1JYOgotCWNhc2UgSU5UX0JUX1NDT19SWDoKLQljYXNlIElOVF9CVF9TQ09fVFg6Ci0JY2FzZSBJTlRfQlRfQTJEUF9SWDoKLQljYXNlIElOVF9GTV9SWDoKLQljYXNlIElOVF9GTV9UWDoKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1JYOgotCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6Ci0JY2FzZSBTTElNQlVTXzRfUlg6Ci0JY2FzZSBTTElNQlVTXzRfVFg6Ci0JY2FzZSBTTElNQlVTXzVfUlg6Ci0JY2FzZSBTTElNQlVTXzZfUlg6Ci0JY2FzZSBTTElNQlVTXzZfVFg6Ci0JY2FzZSBTTElNQlVTXzdfUlg6Ci0JY2FzZSBTTElNQlVTXzdfVFg6Ci0JY2FzZSBTTElNQlVTXzhfUlg6Ci0JY2FzZSBTTElNQlVTXzhfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9VU0JfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUlOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQl7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRlZmF1bHQgcmV0IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQodTE2IHBvcnRfaWQpCi17Ci0JaW50IHJldDsKLQotCS8qCi0JICogaWYgcG9ydF9pZCBpcyB2aXJ0dWFsLCBjb252ZXJ0IHRvIHBoeXNpY2FsLi4KLQkgKiBpZiBwb3J0X2lkIGlzIGFscmVhZHkgcGh5c2ljYWwsIHJldHVybiBwaHlzaWNhbAotCSAqLwotCWlmIChhZmVfdmFsaWRhdGVfcG9ydChwb3J0X2lkKSA8IDApIHsKLQkJaWYgKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCB8fAotCQkgICAgcG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1RYIHx8Ci0JCSAgICBwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfUlggfHwKLQkJICAgIHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9UWCkgewotCQkJcmV0ID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB3cm9uZyBwb3J0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBvcnRfaWQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCX0gZWxzZQotCQlyZXQgPSBwb3J0X2lkOwotCi0JcmV0dXJuIHJldDsKLX0KLWludCBhZmVfcG9ydF9zdG9wX25vd2FpdChpbnQgcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHN0b3A7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodGhpc19hZmUuYXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUZFIGlzIGFscmVhZHkgY2xvc2VkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQlwb3J0X2lkID0gcTZhdWRpb19jb252ZXJ0X3ZpcnR1YWxfdG9fcG9ydGlkKHBvcnRfaWQpOwotCi0Jc3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0Jc3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2Yoc3RvcCk7Ci0Jc3RvcC5oZHIuc3JjX3BvcnQgPSAwOwotCXN0b3AuaGRyLmRlc3RfcG9ydCA9IDA7Ci0Jc3RvcC5oZHIudG9rZW4gPSAwOwotCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RPUDsKLQlzdG9wLnBvcnRfaWQgPSBwb3J0X2lkOwotCXN0b3AucmVzZXJ2ZWQgPSAwOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmc3RvcCwgTlVMTCk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCIlczogQUZFIGNsb3NlIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci0KLX0KLQotaW50IGFmZV9jbG9zZShpbnQgcG9ydF9pZCkKLXsKLQlzdHJ1Y3QgYWZlX3BvcnRfY21kX2RldmljZV9zdG9wIHN0b3A7Ci0JZW51bSBhZmVfbWFkX3R5cGUgbWFkX3R5cGU7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQl1aW50MTZfdCBwb3J0X2luZGV4OwotCi0JaWYgKHRoaXNfYWZlLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFGRSBpcyBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOwotCQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCkgfHwKLQkJICAgIChwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfVFgpKQotCQkJcGNtX2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSA9IDA7Ci0JCWlmICgocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1JYKSB8fAotCQkgICAgKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpCi0JCQlwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPSAwOwotCQlhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSA9IHRydWU7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBwb3J0X2lkKTsKLQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9SWCkgfHwKLQkJCShwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDJfVFgpKSB7Ci0JCXByX2RlYnVnKCIlczogYmVmb3JlIGRlY3JlbWVudGluZyBwY21fYWZlX2luc3RhbmNlICVkXG4iLAotCQkJX19mdW5jX18sIHBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0pOwotCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JCXBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0tLTsKLQkJaWYgKCghKHBjbV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPT0gMCAmJgotCQkJcHJveHlfYWZlX2luc3RhbmNlW3BvcnRfaWQgJiAweDFdID09IDApKSB8fAotCQkJYWZlX2Nsb3NlX2RvbmVbcG9ydF9pZCAmIDB4MV0gPT0gdHJ1ZSkKLQkJCXJldHVybiAwOwotCi0JCWFmZV9jbG9zZV9kb25lW3BvcnRfaWQgJiAweDFdID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9SWCkgfHwKLQkJKHBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMV9UWCkpIHsKLQkJcHJfZGVidWcoIiVzOiBiZWZvcmUgZGVjcmVtZW50aW5nIHByb3h5X2FmZV9pbnN0YW5jZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0pOwotCQlwb3J0X2lkID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JCXByb3h5X2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXS0tOwotCQlpZiAoKCEocGNtX2FmZV9pbnN0YW5jZVtwb3J0X2lkICYgMHgxXSA9PSAwICYmCi0JCQlwcm94eV9hZmVfaW5zdGFuY2VbcG9ydF9pZCAmIDB4MV0gPT0gMCkpIHx8Ci0JCQlhZmVfY2xvc2VfZG9uZVtwb3J0X2lkICYgMHgxXSA9PSB0cnVlKQotCQkJcmV0dXJuIDA7Ci0KLQkJYWZlX2Nsb3NlX2RvbmVbcG9ydF9pZCAmIDB4MV0gPSB0cnVlOwotCX0KLQotCXBvcnRfaWQgPSBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQocG9ydF9pZCk7Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl93YXJuKCIlczogTm90IGEgdmFsaWQgcG9ydCBpZCAweCV4IHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltYWRfdHlwZSA9IGFmZV9wb3J0X2dldF9tYWRfdHlwZShwb3J0X2lkKTsKLQlwcl9kZWJ1ZygiJXM6IHBvcnRfaWQgMHgleCwgbWFkX3R5cGUgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2lkLAotCQkgbWFkX3R5cGUpOwotCWlmIChtYWRfdHlwZSAhPSBNQURfSFdfTk9ORSAmJiBtYWRfdHlwZSAhPSBNQURfU1dfQVVESU8pIHsKLQkJcHJfZGVidWcoIiVzOiBUdXJuIG9mZiBNQURcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gYWZlX3R1cm5fb25vZmZfaHdfbWFkKG1hZF90eXBlLCBmYWxzZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IGFmZV90dXJuX29ub2ZmX2h3X21hZCBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBOb3QgYSBNQUQgcG9ydFxuIiwgX19mdW5jX18pOwotCX0KLQotCXBvcnRfaW5kZXggPSBhZmVfZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKChwb3J0X2luZGV4ID49IDApICYmIChwb3J0X2luZGV4IDwgQUZFX01BWF9QT1JUUykpIHsKLQkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1twb3J0X2luZGV4XSA9IDA7Ci0JCXRoaXNfYWZlLnRvcG9sb2d5W3BvcnRfaW5kZXhdID0gMDsKLQkJdGhpc19hZmUuZGV2X2FjZGJfaWRbcG9ydF9pbmRleF0gPSAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IHBvcnQgJWRcbiIsIF9fZnVuY19fLCBwb3J0X2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoKHBvcnRfaWQgPT0gdGhpc19hZmUuYWFuY19pbmZvLmFhbmNfdHhfcG9ydCkgJiYKLQkgICAgKHRoaXNfYWZlLmFhbmNfaW5mby5hYW5jX2FjdGl2ZSkpIHsKLQkJbWVtc2V0KCZ0aGlzX2FmZS5hYW5jX2luZm8sIDB4MDAsIHNpemVvZih0aGlzX2FmZS5hYW5jX2luZm8pKTsKLQkJcmV0ID0gYWZlX2FhbmNfbW9kX2VuYWJsZSh0aGlzX2FmZS5hcHIsIHBvcnRfaWQsIDApOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogQUZFIG1vZCBkaXNhYmxlIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0KLQkvKgotCSAqIGV2ZW4gaWYgcmFtcCBkb3duIGNvbmZpZ3VyYXRpb24gZmFpbGVkIGl0IGlzIG5vdCBzZXJpb3VzIGVub3VnaCB0bwotCSAqIHdhcnJhbnQgYmFpbGFpbmcgb3V0LgotCSAqLwotCWlmIChhZmVfc3BrX3JhbXBfZG5fY2ZnKHBvcnRfaWQpIDwgMCkKLQkJcHJfZXJyKCIlczogcmFtcCBkb3duIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzdG9wLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlzdG9wLmhkci5wa3Rfc2l6ZSA9IHNpemVvZihzdG9wKTsKLQlzdG9wLmhkci5zcmNfcG9ydCA9IDA7Ci0Jc3RvcC5oZHIuZGVzdF9wb3J0ID0gMDsKLQlzdG9wLmhkci50b2tlbiA9IGluZGV4OwotCXN0b3AuaGRyLm9wY29kZSA9IEFGRV9QT1JUX0NNRF9ERVZJQ0VfU1RPUDsKLQlzdG9wLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpOwotCXN0b3AucmVzZXJ2ZWQgPSAwOwotCi0JcmV0ID0gYWZlX2Fwcl9zZW5kX3BrdCgmc3RvcCwgJnRoaXNfYWZlLndhaXRbaW5kZXhdKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBBRkUgY2xvc2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9zZXRfZGlnaXRhbF9jb2RlY19jb3JlX2Nsb2NrKHUxNiBwb3J0X2lkLAotCQkJCXN0cnVjdCBhZmVfZGlnaXRhbF9jbGtfY2ZnICpjZmcpCi17Ci0Jc3RydWN0IGFmZV9scGFzc19kaWdpdGFsX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNmZykgewotCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOwotCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKLQljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCS8qZGVmYXVsdCByeCBwb3J0IGlzIHRha2VuIHRvIGVuYWJsZSB0aGUgY29kZWMgZGlnaXRhbCBjbG9jayovCi0JY2xrX2NmZy5wYXJhbS5wb3J0X2lkID0gcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKTsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKLQkJCQkJCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOwotCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljbGtfY2ZnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljbGtfY2ZnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQVVESU9fREVWX0lOVEVSRkFDRTsKLQljbGtfY2ZnLnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0lOVEVSTkFMX0RJR0lBVExfQ0RDX0NMS19DT05GSUc7Ci0JY2xrX2NmZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjbGtfY2ZnLmNsa19jZmcpOwotCWNsa19jZmcuY2xrX2NmZyA9ICpjZmc7Ci0KLQlwcl9kZWJ1ZygiJXM6IE1pbm9yIHZlcnNpb24gPTB4JXggY2xrIHZhbCA9ICVkXG4iCi0JCSAiY2xrIHJvb3QgPSAweCV4IHJlc3J2ID0gMHgleFxuIiwKLQkJIF9fZnVuY19fLCBjZmctPmkyc19jZmdfbWlub3JfdmVyc2lvbiwKLQkJIGNmZy0+Y2xrX3ZhbCwgY2ZnLT5jbGtfcm9vdCwgY2ZnLT5yZXNlcnZlZCk7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNsa19jZmcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFGRSBlbmFibGUgZm9yIHBvcnQgMHgleCByZXQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCi0JCQkoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7Ci0JCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfc2V0X2xwYXNzX2Nsb2NrKHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX2Nsa19jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgYWZlX2xwYXNzX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNmZykgewotCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UgZmFpbCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOwotCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOwotCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKLQljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNsa19jZmcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY2xrX2NmZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCi0JCQkJCQktIHNpemVvZihjbGtfY2ZnLnBhcmFtKTsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY2xrX2NmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY2xrX2NmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9MUEFJRl9DTEtfQ09ORklHOwotCWNsa19jZmcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2xrX2NmZy5jbGtfY2ZnKTsKLQljbGtfY2ZnLmNsa19jZmcgPSAqY2ZnOwotCi0JcHJfZGVidWcoIiVzOiBNaW5vciB2ZXJzaW9uID0weCV4IGNsayB2YWwxID0gJWRcbiIKLQkJICJjbGsgdmFsMiA9ICVkLCBjbGsgc3JjID0gMHgleFxuIgotCQkgImNsayByb290ID0gMHgleCBjbGsgbW9kZSA9IDB4JXggcmVzcnYgPSAweCV4XG4iCi0JCSAicG9ydCBpZCA9IDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgY2ZnLT5pMnNfY2ZnX21pbm9yX3ZlcnNpb24sCi0JCSBjZmctPmNsa192YWwxLCBjZmctPmNsa192YWwyLCBjZmctPmNsa19zcmMsCi0JCSBjZmctPmNsa19yb290LCBjZmctPmNsa19zZXRfbW9kZSwKLQkJIGNmZy0+cmVzZXJ2ZWQsIHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCkpOwotCi0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopICZjbGtfY2ZnKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBBRkUgZW5hYmxlIGZvciBwb3J0IDB4JXggcmV0ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAotCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhZmVfc2V0X2xwYXNzX2Nsa19jZmcgLSBTZXQgQUZFIGNsayBjb25maWcKLSAqCi0gKiBAaW5kZXg6IHBvcnQgaW5kZXgKLSAqIEBjZmc6IHBvaW50ZXIgdG8gY2xrIHNldCBzdHJ1Y3QKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqLwotaW50IGFmZV9zZXRfbHBhc3NfY2xrX2NmZyhpbnQgaW5kZXgsIHN0cnVjdCBhZmVfY2xrX3NldCAqY2ZnKQotewotCXN0cnVjdCBhZmVfbHBhc3NfY2xrX2NvbmZpZ19jb21tYW5kX3YyIGNsa19jZmc7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWNmZykgewotCQlwcl9lcnIoIiVzOiBjbG9jayBjZmcgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBpbmRleFslZF0gaW52YWxpZCFcbiIsIF9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JY2xrX2NmZy5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY2xrX2NmZy5oZHIucGt0X3NpemUgPSBzaXplb2YoY2xrX2NmZyk7Ci0JY2xrX2NmZy5oZHIuc3JjX3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JY2xrX2NmZy5oZHIudG9rZW4gPSBpbmRleDsKLQotCWNsa19jZmcuaGRyLm9wY29kZSA9IEFGRV9TVkNfQ01EX1NFVF9QQVJBTTsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfc2l6ZSA9IHNpemVvZihjbGtfY2ZnKSAtIHNpemVvZihzdHJ1Y3QgYXByX2hkcikKLQkJCQkJCS0gc2l6ZW9mKGNsa19jZmcucGFyYW0pOwotCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX2xzdyA9IDB4MDA7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMHgwMDsKLQljbGtfY2ZnLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMHgwMDsKLQljbGtfY2ZnLnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfQ0xPQ0tfU0VUOwotCWNsa19jZmcucGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0xPQ0tfU0VUOwotCWNsa19jZmcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2xrX2NmZy5jbGtfY2ZnKTsKLQljbGtfY2ZnLmNsa19jZmcgPSAqY2ZnOwotCi0KLQlwcl9kZWJ1ZygiJXM6IE1pbm9yIHZlcnNpb24gPTB4JXggY2xrIGlkID0gJWRcbiIKLQkJICJjbGsgZnJlcSAoSHopID0gJWQsIGNsayBhdHRyaSA9IDB4JXhcbiIKLQkJICJjbGsgcm9vdCA9IDB4JXggY2xrIGVuYWJsZSA9IDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgY2ZnLT5jbGtfc2V0X21pbm9yX3ZlcnNpb24sCi0JCSBjZmctPmNsa19pZCwgY2ZnLT5jbGtfZnJlcV9pbl9oeiwgY2ZnLT5jbGtfYXR0cmksCi0JCSBjZmctPmNsa19yb290LCBjZmctPmVuYWJsZSk7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlyZXQgPSBhcHJfc2VuZF9wa3QodGhpc19hZmUuYXByLCAodWludDMyX3QgKikgJmNsa19jZmcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFGRSBjbGsgY2ZnIGZhaWxlZCB3aXRoIHJldCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfSBlbHNlIHsKLQkJLyogc2V0IHJldCB0byAwIGFzIG5vIHRpbWVvdXQgaGFwcGVuZWQgKi8KLQkJcmV0ID0gMDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpICE9IDApIHsKLQkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLWZhaWxfY21kOgotCW11dGV4X3VubG9jaygmdGhpc19hZmUuYWZlX2NtZF9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChhZmVfc2V0X2xwYXNzX2Nsa19jZmcpOwotCi0vKioKLSAqIGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIgLSBFbmFibGUgQUZFIGxwYXNzIGNsb2NrCi0gKgotICogQHBvcnRfaWQ6IEFGRSBwb3J0IGlkCi0gKiBAY2ZnOiBwb2ludGVyIHRvIGNsayBzZXQgc3RydWN0Ci0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCi0gKi8KLWludCBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHUxNiBwb3J0X2lkLCBzdHJ1Y3QgYWZlX2Nsa19zZXQgKmNmZykKLXsKLQlpbnQgaW5kZXggPSAwOwotCWludCByZXQgPSAwOwotCi0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnRfaWQpOwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQUZFX01BWF9QT1JUUykgewotCQlwcl9lcnIoIiVzOiBBRkUgcG9ydCBpbmRleFslZF0gaW52YWxpZCFcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHE2YXVkaW9faXNfZGlnaXRhbF9wY21faW50ZXJmYWNlKHBvcnRfaWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHE2YXVkaW9faXNfZGlnaXRhbF9wY21faW50ZXJmYWNlIGZhaWwgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWZlX3NldF9scGFzc19jbGtfY2ZnKGluZGV4LCBjZmcpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IGFmZV9zZXRfbHBhc3NfY2xrX2NmZ192MiBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIpOwotCi1pbnQgYWZlX3NldF9scGFzc19pbnRlcm5hbF9kaWdpdGFsX2NvZGVjX2Nsb2NrKHUxNiBwb3J0X2lkLAotCQkJc3RydWN0IGFmZV9kaWdpdGFsX2Nsa19jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgYWZlX2xwYXNzX2RpZ2l0YWxfY2xrX2NvbmZpZ19jb21tYW5kIGNsa19jZmc7Ci0JaW50IGluZGV4ID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY2ZnKSB7Ci0JCXByX2VycigiJXM6IGNsb2NrIGNmZyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0X2lkKTsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJcHJfZXJyKCIlczogQUZFIHBvcnQgaW5kZXhbJWRdIGludmFsaWQhXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXQgPSBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZShwb3J0X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBxNmF1ZGlvX2lzX2RpZ2l0YWxfcGNtX2ludGVyZmFjZSBmYWlsICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGFmZV9xNl9pbnRlcmZhY2VfcHJlcGFyZSgpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBRNiBpbnRlcmZhY2UgcHJlcGFyZSBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOwotCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKLQljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNsa19jZmcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY2xrX2NmZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCi0JCQkJCQktIHNpemVvZihjbGtfY2ZnLnBhcmFtKTsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY2xrX2NmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY2xrX2NmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9JTlRFUk5BTF9ESUdJQVRMX0NEQ19DTEtfQ09ORklHOwotCWNsa19jZmcucGRhdGEucGFyYW1fc2l6ZSA9ICBzaXplb2YoY2xrX2NmZy5jbGtfY2ZnKTsKLQljbGtfY2ZnLmNsa19jZmcgPSAqY2ZnOwotCi0JcHJfZGVidWcoIiVzOiBNaW5vciB2ZXJzaW9uID0weCV4IGNsayB2YWwgPSAlZFxuIgotCQkgImNsayByb290ID0gMHgleCByZXNydiA9IDB4JXggcG9ydCBpZCA9IDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgY2ZnLT5pMnNfY2ZnX21pbm9yX3ZlcnNpb24sCi0JCSBjZmctPmNsa192YWwsIGNmZy0+Y2xrX3Jvb3QsIGNmZy0+cmVzZXJ2ZWQsCi0JCSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnRfaWQpKTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2xrX2NmZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweDB4JXggcmV0ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAotCQkJKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX2VuYWJsZV9scGFzc19jb3JlX3NoYXJlZF9jbG9jayh1MTYgcG9ydF9pZCwgdTMyIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYWZlX2xwYXNzX2NvcmVfc2hhcmVkX2Nsa19jb25maWdfY29tbWFuZCBjbGtfY2ZnOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0ID0gcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UocG9ydF9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UgZmFpbCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhZmVfcTZfaW50ZXJmYWNlX3ByZXBhcmUoKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogUTYgaW50ZXJmYWNlIHByZXBhcmUgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOwotCWNsa19jZmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNsa19jZmcuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGNsa19jZmcpOwotCWNsa19jZmcuaGRyLnNyY19wb3J0ID0gMDsKLQljbGtfY2ZnLmhkci5kZXN0X3BvcnQgPSAwOwotCWNsa19jZmcuaGRyLnRva2VuID0gaW5kZXg7Ci0KLQljbGtfY2ZnLmhkci5vcGNvZGUgPSBBRkVfUE9SVF9DTURfU0VUX1BBUkFNX1YyOwotCWNsa19jZmcucGFyYW0ucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQocG9ydF9pZCk7Ci0JY2xrX2NmZy5wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoY2xrX2NmZykgLSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpCi0JCQkJCQktIHNpemVvZihjbGtfY2ZnLnBhcmFtKTsKLQljbGtfY2ZnLnBhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAweDAwOwotCWNsa19jZmcucGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDB4MDA7Ci0JY2xrX2NmZy5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDB4MDA7Ci0JY2xrX2NmZy5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JY2xrX2NmZy5wZGF0YS5wYXJhbV9pZCA9IEFGRV9QQVJBTV9JRF9MUEFTU19DT1JFX1NIQVJFRF9DTE9DS19DT05GSUc7Ci0JY2xrX2NmZy5wZGF0YS5wYXJhbV9zaXplID0gIHNpemVvZihjbGtfY2ZnLmNsa19jZmcpOwotCWNsa19jZmcuY2xrX2NmZy5scGFzc19jb3JlX3NoYXJlZF9jbGtfY2ZnX21pbm9yX3ZlcnNpb24gPQotCQkJCUFGRV9BUElfVkVSU0lPTl9MUEFTU19DT1JFX1NIQVJFRF9DTEtfQ09ORklHOwotCWNsa19jZmcuY2xrX2NmZy5lbmFibGUgPSBlbmFibGU7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcnQgaWQgPSAlZCwgZW5hYmxlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcTZhdWRpb19nZXRfcG9ydF9pZChwb3J0X2lkKSwgZW5hYmxlKTsKLQotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXRlLCAxKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0dXMsIDApOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKSAmY2xrX2NmZyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogQUZFIGVuYWJsZSBmb3IgcG9ydCAweCV4IHJldCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSA+IDApIHsKLQkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWQgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotZmFpbF9jbWQ6Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBxNmFmZV9jaGVja19vc3JfY2xrX2ZyZXEodTMyIGZyZXEpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKGZyZXEpIHsKLQljYXNlIFE2QUZFX0xQQVNTX09TUl9DTEtfMTJfUDI4OF9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzhfUDE5Ml9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzZfUDE0NF9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzRfUDA5Nl9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzNfUDA3Ml9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzJfUDA0OF9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzFfUDUzNl9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzFfUDAyNF9NSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzc2OF9rSFo6Ci0JY2FzZSBRNkFGRV9MUEFTU19PU1JfQ0xLXzUxMl9rSFo6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRlYWZhdWx0IGZyZXEgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBmcmVxKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9nZXRfc3BfdGhfdmlfZnRtX2RhdGEoc3RydWN0IGFmZV9zcF90aF92aV9nZXRfcGFyYW0gKnRoX3ZpKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCWludCBpbmRleCA9IDAsIHBvcnQgPSBTTElNQlVTXzRfVFg7Ci0KLQlpZiAoIXRoX3ZpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHRoaXNfYWZlLnZpX3R4X3BvcnQgIT0gLTEpCi0JCXBvcnQgPSB0aGlzX2FmZS52aV90eF9wb3J0OwotCi0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcG9ydCAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnQsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaW5kZXggPSBxNmF1ZGlvX2dldF9wb3J0X2luZGV4KHBvcnQpOwotCWlmIChpbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0IDB4JXgsIGluZGV4ICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnQsIGluZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQl0aF92aS0+aGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXRoX3ZpLT5oZHIucGt0X3NpemUgPSBzaXplb2YoKnRoX3ZpKTsKLQl0aF92aS0+aGRyLnNyY19wb3J0ID0gMDsKLQl0aF92aS0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JdGhfdmktPmhkci50b2tlbiA9IGluZGV4OwotCXRoX3ZpLT5oZHIub3Bjb2RlID0gIEFGRV9QT1JUX0NNRF9HRVRfUEFSQU1fVjI7Ci0JdGhfdmktPmdldF9wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JdGhfdmktPmdldF9wYXJhbS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9USF9WSTsKLQl0aF92aS0+Z2V0X3BhcmFtLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX1NQX1YyX1RIX1ZJX0ZUTV9QQVJBTVM7Ci0JdGhfdmktPmdldF9wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbHN3ID0gMDsKLQl0aF92aS0+Z2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19tc3cgPSAwOwotCXRoX3ZpLT5nZXRfcGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKCp0aF92aSkKLQkJCQktIHNpemVvZih0aF92aS0+Z2V0X3BhcmFtKSAtIHNpemVvZih0aF92aS0+aGRyKTsKLQl0aF92aS0+Z2V0X3BhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOwotCXRoX3ZpLT5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9USF9WSTsKLQl0aF92aS0+cGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BfVjJfVEhfVklfRlRNX1BBUkFNUzsKLQl0aF92aS0+cGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZih0aF92aS0+cGFyYW0pOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKXRoX3ZpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW0gcG9ydCAweCV4IHBhcmFtIGlkWzB4JXhdZmFpbGVkICVkXG4iLAotCQkJIF9fZnVuY19fLCBwb3J0LCB0aF92aS0+Z2V0X3BhcmFtLnBhcmFtX2lkLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCQkgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0ZSkgPT0gMCksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSA+IDApIHsKLQkJcHJfZXJyKCIlczogY29uZmlnIGNtZCBmYWlsZWQgWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpOwotCQlnb3RvIGRvbmU7Ci0JfQotCW1lbWNweSgmdGhfdmktPnBhcmFtLCAmdGhpc19hZmUudGhfdmlfcmVzcC5wYXJhbSwKLQkJc2l6ZW9mKHRoaXNfYWZlLnRoX3ZpX3Jlc3AucGFyYW0pKTsKLQlwcl9kZWJ1ZygiJXM6IERDIHJlc2lzdGFuY2UgJWQgJWQgdGVtcCAlZCAlZCBzdGF0dXMgJWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgdGhfdmktPnBhcmFtLmRjX3Jlc19xMjRbU1BfVjJfU1BLUl8xXSwKLQkJIHRoX3ZpLT5wYXJhbS5kY19yZXNfcTI0W1NQX1YyX1NQS1JfMl0sCi0JCSB0aF92aS0+cGFyYW0udGVtcF9xMjJbU1BfVjJfU1BLUl8xXSwKLQkJIHRoX3ZpLT5wYXJhbS50ZW1wX3EyMltTUF9WMl9TUEtSXzJdLAotCQkgdGhfdmktPnBhcmFtLnN0YXR1c1tTUF9WMl9TUEtSXzFdLAotCQkgdGhfdmktPnBhcmFtLnN0YXR1c1tTUF9WMl9TUEtSXzJdKTsKLQlyZXQgPSAwOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX2dldF9zcF9leF92aV9mdG1fZGF0YShzdHJ1Y3QgYWZlX3NwX2V4X3ZpX2dldF9wYXJhbSAqZXhfdmkpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IGluZGV4ID0gMCwgcG9ydCA9IFNMSU1CVVNfNF9UWDsKLQotCWlmICghZXhfdmkpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXNcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodGhpc19hZmUudmlfdHhfcG9ydCAhPSAtMSkKLQkJcG9ydCA9IHRoaXNfYWZlLnZpX3R4X3BvcnQ7Ci0KLQlyZXQgPSBxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQocG9ydCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0IDB4JXggcmV0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydCwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCWluZGV4ID0gcTZhdWRpb19nZXRfcG9ydF9pbmRleChwb3J0KTsKLQlpZiAoaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJWQgcG9ydCAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCWluZGV4LCBwb3J0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWV4X3ZpLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JZXhfdmktPmhkci5wa3Rfc2l6ZSA9IHNpemVvZigqZXhfdmkpOwotCWV4X3ZpLT5oZHIuc3JjX3BvcnQgPSAwOwotCWV4X3ZpLT5oZHIuZGVzdF9wb3J0ID0gMDsKLQlleF92aS0+aGRyLnRva2VuID0gaW5kZXg7Ci0JZXhfdmktPmhkci5vcGNvZGUgPSAgQUZFX1BPUlRfQ01EX0dFVF9QQVJBTV9WMjsKLQlleF92aS0+Z2V0X3BhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKLQlleF92aS0+Z2V0X3BhcmFtLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfU1BFQUtFUl9QUk9URUNUSU9OX1YyX0VYX1ZJOwotCWV4X3ZpLT5nZXRfcGFyYW0ucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BfVjJfRVhfVklfRlRNX1BBUkFNUzsKLQlleF92aS0+Z2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAwOwotCWV4X3ZpLT5nZXRfcGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDA7Ci0JZXhfdmktPmdldF9wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoKmV4X3ZpKQotCQktIHNpemVvZihleF92aS0+Z2V0X3BhcmFtKSAtIHNpemVvZihleF92aS0+aGRyKTsKLQlleF92aS0+Z2V0X3BhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOwotCWV4X3ZpLT5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX1NQRUFLRVJfUFJPVEVDVElPTl9WMl9FWF9WSTsKLQlleF92aS0+cGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfU1BfVjJfRVhfVklfRlRNX1BBUkFNUzsKLQlleF92aS0+cGRhdGEucGFyYW1fc2l6ZSA9IHNpemVvZihleF92aS0+cGFyYW0pOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKWV4X3ZpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBnZXQgcGFyYW0gcG9ydCAweCV4IHBhcmFtIGlkWzB4JXhdZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHBvcnQsIGV4X3ZpLT5nZXRfcGFyYW0ucGFyYW1faWQsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHRoaXNfYWZlLndhaXRbaW5kZXhdLAotCQkJCSAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXRlKSA9PSAwKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbWVtY3B5KCZleF92aS0+cGFyYW0sICZ0aGlzX2FmZS5leF92aV9yZXNwLnBhcmFtLAotCQlzaXplb2YodGhpc19hZmUuZXhfdmlfcmVzcC5wYXJhbSkpOwotCXByX2RlYnVnKCIlczogZnJlcSAlZCAlZCByZXNpc3RhbmNlICVkICVkIHFmYWN0b3IgJWQgJWQgc3RhdGUgJWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgZXhfdmktPnBhcmFtLmZyZXFfcTIwW1NQX1YyX1NQS1JfMV0sCi0JCSBleF92aS0+cGFyYW0uZnJlcV9xMjBbU1BfVjJfU1BLUl8yXSwKLQkJIGV4X3ZpLT5wYXJhbS5yZXNpc19xMjRbU1BfVjJfU1BLUl8xXSwKLQkJIGV4X3ZpLT5wYXJhbS5yZXNpc19xMjRbU1BfVjJfU1BLUl8yXSwKLQkJIGV4X3ZpLT5wYXJhbS5xbWN0X3EyNFtTUF9WMl9TUEtSXzFdLAotCQkgZXhfdmktPnBhcmFtLnFtY3RfcTI0W1NQX1YyX1NQS1JfMl0sCi0JCSBleF92aS0+cGFyYW0uc3RhdHVzW1NQX1YyX1NQS1JfMV0sCi0JCSBleF92aS0+cGFyYW0uc3RhdHVzW1NQX1YyX1NQS1JfMl0pOwotCXJldCA9IDA7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBhZmVfZ2V0X2F2X2Rldl9kcmlmdChzdHJ1Y3QgYWZlX3BhcmFtX2lkX2Rldl90aW1pbmdfc3RhdHMgKnRpbWluZ19zdGF0cywKLQkJCSB1MTYgcG9ydCkKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlpbnQgaW5kZXggPSAwOwotCXN0cnVjdCBhZmVfYXZfZGV2X2RyaWZ0X2dldF9wYXJhbSBhdl9kZXZfZHJpZnQ7Ci0KLQlpZiAoIXRpbWluZ19zdGF0cykgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtc1xuIiwgX19mdW5jX18pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gcTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcG9ydCAweCV4IHJldCAlZFxuIiwgX19mdW5jX18sIHBvcnQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgQUZFIHBvcnQgaW5kZXhbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBpbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQltZW1zZXQoJmF2X2Rldl9kcmlmdCwgMCwgc2l6ZW9mKHN0cnVjdCBhZmVfYXZfZGV2X2RyaWZ0X2dldF9wYXJhbSkpOwotCi0JYXZfZGV2X2RyaWZ0Lmhkci5oZHJfZmllbGQgPQotCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQlhdl9kZXZfZHJpZnQuaGRyLnBrdF9zaXplID0gc2l6ZW9mKGF2X2Rldl9kcmlmdCk7Ci0JYXZfZGV2X2RyaWZ0Lmhkci5zcmNfcG9ydCA9IDA7Ci0JYXZfZGV2X2RyaWZ0Lmhkci5kZXN0X3BvcnQgPSAwOwotCWF2X2Rldl9kcmlmdC5oZHIudG9rZW4gPSBpbmRleDsKLQlhdl9kZXZfZHJpZnQuaGRyLm9wY29kZSA9ICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyOwotCWF2X2Rldl9kcmlmdC5nZXRfcGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCWF2X2Rldl9kcmlmdC5nZXRfcGFyYW0ubW9kdWxlX2lkID0gQUZFX01PRFVMRV9BVURJT19ERVZfSU5URVJGQUNFOwotCWF2X2Rldl9kcmlmdC5nZXRfcGFyYW0ucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfREVWX1RJTUlOR19TVEFUUzsKLQlhdl9kZXZfZHJpZnQuZ2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAwOwotCWF2X2Rldl9kcmlmdC5nZXRfcGFyYW0ucGF5bG9hZF9hZGRyZXNzX21zdyA9IDA7Ci0JYXZfZGV2X2RyaWZ0LmdldF9wYXJhbS5wYXlsb2FkX3NpemUgPSBzaXplb2YoYXZfZGV2X2RyaWZ0KQotCQktIHNpemVvZihhdl9kZXZfZHJpZnQuZ2V0X3BhcmFtKSAtIHNpemVvZihhdl9kZXZfZHJpZnQuaGRyKTsKLQlhdl9kZXZfZHJpZnQuZ2V0X3BhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOwotCWF2X2Rldl9kcmlmdC5wZGF0YS5tb2R1bGVfaWQgPSBBRkVfTU9EVUxFX0FVRElPX0RFVl9JTlRFUkZBQ0U7Ci0JYXZfZGV2X2RyaWZ0LnBkYXRhLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0RFVl9USU1JTkdfU1RBVFM7Ci0JYXZfZGV2X2RyaWZ0LnBkYXRhLnBhcmFtX3NpemUgPSBzaXplb2YoYXZfZGV2X2RyaWZ0LnRpbWluZ19zdGF0cyk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMSk7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KHRoaXNfYWZlLmFwciwgKHVpbnQzMl90ICopJmF2X2Rldl9kcmlmdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZ2V0IHBhcmFtIHBvcnQgMHgleCBwYXJhbSBpZFsweCV4XSBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydCwgYXZfZGV2X2RyaWZ0LmdldF9wYXJhbS5wYXJhbV9pZCwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh0aGlzX2FmZS53YWl0W2luZGV4XSwKLQkJCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykgPiAwKSB7Ci0JCXByX2VycigiJXM6IGNvbmZpZyBjbWQgZmFpbGVkIFslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSkpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpKTsKLQkJZ290byBleGl0OwotCX0KLQotCW1lbWNweSh0aW1pbmdfc3RhdHMsICZ0aGlzX2FmZS5hdl9kZXZfZHJpZnRfcmVzcC50aW1pbmdfc3RhdHMsCi0JICAgICAgIHNpemVvZih0aGlzX2FmZS5hdl9kZXZfZHJpZnRfcmVzcC50aW1pbmdfc3RhdHMpKTsKLQlyZXQgPSAwOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3Nwa19wcm90X2dldF9jYWxpYl9kYXRhKHN0cnVjdCBhZmVfc3Brcl9wcm90X2dldF92aV9jYWxpYiAqY2FsaWJfcmVzcCkKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlpbnQgaW5kZXggPSAwLCBwb3J0ID0gU0xJTUJVU180X1RYOwotCi0JaWYgKCFjYWxpYl9yZXNwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmICh0aGlzX2FmZS52aV90eF9wb3J0ICE9IC0xKQotCQlwb3J0ID0gdGhpc19hZmUudmlfdHhfcG9ydDsKLQotCXJldCA9IHE2YXVkaW9fdmFsaWRhdGVfcG9ydChwb3J0KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBvcnQgMHgleCByZXQgJWRcbiIsIF9fZnVuY19fLCBwb3J0LCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgocG9ydCk7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBBRkVfTUFYX1BPUlRTKSB7Ci0JCXByX2VycigiJXM6IEFGRSBwb3J0IGluZGV4WyVkXSBpbnZhbGlkIVxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQljYWxpYl9yZXNwLT5oZHIuaGRyX2ZpZWxkID0KLQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljYWxpYl9yZXNwLT5oZHIucGt0X3NpemUgPSBzaXplb2YoKmNhbGliX3Jlc3ApOwotCWNhbGliX3Jlc3AtPmhkci5zcmNfcG9ydCA9IDA7Ci0JY2FsaWJfcmVzcC0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JY2FsaWJfcmVzcC0+aGRyLnRva2VuID0gaW5kZXg7Ci0JY2FsaWJfcmVzcC0+aGRyLm9wY29kZSA9ICBBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyOwotCWNhbGliX3Jlc3AtPmdldF9wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1ZJX1BST0NfVjI7Ci0JY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBhcmFtX2lkID0gQUZFX1BBUkFNX0lEX0NBTElCX1JFU19DRkdfVjI7Ci0JY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBheWxvYWRfYWRkcmVzc19sc3cgPSAwOwotCWNhbGliX3Jlc3AtPmdldF9wYXJhbS5wYXlsb2FkX2FkZHJlc3NfbXN3ID0gMDsKLQljYWxpYl9yZXNwLT5nZXRfcGFyYW0ucGF5bG9hZF9zaXplID0gc2l6ZW9mKCpjYWxpYl9yZXNwKQotCQktIHNpemVvZihjYWxpYl9yZXNwLT5nZXRfcGFyYW0pIC0gc2l6ZW9mKGNhbGliX3Jlc3AtPmhkcik7Ci0JY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBvcnRfaWQgPSBxNmF1ZGlvX2dldF9wb3J0X2lkKHBvcnQpOwotCWNhbGliX3Jlc3AtPnBkYXRhLm1vZHVsZV9pZCA9IEFGRV9NT0RVTEVfRkJfU1BLUl9QUk9UX1ZJX1BST0NfVjI7Ci0JY2FsaWJfcmVzcC0+cGRhdGEucGFyYW1faWQgPSBBRkVfUEFSQU1fSURfQ0FMSUJfUkVTX0NGR19WMjsKLQljYWxpYl9yZXNwLT5wZGF0YS5wYXJhbV9zaXplID0gc2l6ZW9mKGNhbGliX3Jlc3AtPnJlc19jZmcpOwotCWF0b21pY19zZXQoJnRoaXNfYWZlLnN0YXR1cywgMCk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdGUsIDEpOwotCXJldCA9IGFwcl9zZW5kX3BrdCh0aGlzX2FmZS5hcHIsICh1aW50MzJfdCAqKWNhbGliX3Jlc3ApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGdldCBwYXJhbSBwb3J0IDB4JXggcGFyYW0gaWRbMHgleF1mYWlsZWQgJWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgcG9ydCwgY2FsaWJfcmVzcC0+Z2V0X3BhcmFtLnBhcmFtX2lkLCByZXQpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodGhpc19hZmUud2FpdFtpbmRleF0sCi0JCShhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdGUpID09IDApLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZ0aGlzX2FmZS5zdGF0dXMpID4gMCkgewotCQlwcl9lcnIoIiVzOiBjb25maWcgY21kIGZhaWxlZCBbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJnRoaXNfYWZlLnN0YXR1cykpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmdGhpc19hZmUuc3RhdHVzKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCW1lbWNweSgmY2FsaWJfcmVzcC0+cmVzX2NmZywgJnRoaXNfYWZlLmNhbGliX2RhdGEucmVzX2NmZywKLQkJc2l6ZW9mKHRoaXNfYWZlLmNhbGliX2RhdGEucmVzX2NmZykpOwotCXByX2luZm8oIiVzOiBzdGF0ZSAlcyByZXNpc3RhbmNlICVkICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBmYnNwX3N0YXRlW2NhbGliX3Jlc3AtPnJlc19jZmcudGhfdmlfY2Ffc3RhdGVdLAotCQkJIGNhbGliX3Jlc3AtPnJlc19jZmcucjBfY2FsaV9xMjRbU1BfVjJfU1BLUl8xXSwKLQkJCSBjYWxpYl9yZXNwLT5yZXNfY2ZnLnIwX2NhbGlfcTI0W1NQX1YyX1NQS1JfMl0pOwotCXJldCA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX3Nwa19wcm90X2ZlZWRfYmFja19jZmcoaW50IHNyY19wb3J0LCBpbnQgZHN0X3BvcnQsCi0JaW50IGxfY2gsIGludCByX2NoLCB1MzIgZW5hYmxlKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCXVuaW9uIGFmZV9zcGtyX3Byb3RfY29uZmlnIHByb3RfY29uZmlnOwotCWludCBpbmRleCA9IDA7Ci0KLQlpZiAoIWVuYWJsZSkgewotCQlwcl9kZWJ1ZygiJXM6IERpc2FibGUgRmVlZGJhY2sgdHggcGF0aCIsIF9fZnVuY19fKTsKLQkJdGhpc19hZmUudmlfdHhfcG9ydCA9IC0xOwotCQl0aGlzX2FmZS52aV9yeF9wb3J0ID0gLTE7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICgocTZhdWRpb192YWxpZGF0ZV9wb3J0KHNyY19wb3J0KSA8IDApIHx8Ci0JCShxNmF1ZGlvX3ZhbGlkYXRlX3BvcnQoZHN0X3BvcnQpIDwgMCkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwb3J0cyBzcmMgMHgleCBkc3QgMHgleCIsCi0JCQlfX2Z1bmNfXywgc3JjX3BvcnQsIGRzdF9wb3J0KTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKCFsX2NoICYmICFyX2NoKSB7Ci0JCXByX2VycigiJXM6IGVycm9yIGNoIHZhbHVlcyB6ZXJvXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogc3JjX3BvcnQgMHgleCAgZHN0X3BvcnQgMHgleCBsX2NoICVkIHJfY2ggJWRcbiIsCi0JCSBfX2Z1bmNfXywgc3JjX3BvcnQsIGRzdF9wb3J0LCBsX2NoLCByX2NoKTsKLQltZW1zZXQoJnByb3RfY29uZmlnLCAwLCBzaXplb2YocHJvdF9jb25maWcpKTsKLQlwcm90X2NvbmZpZy5mZWVkYmFja19wYXRoX2NmZy5kc3RfcG9ydGlkID0KLQkJcTZhdWRpb19nZXRfcG9ydF9pZChkc3RfcG9ydCk7Ci0JaWYgKGxfY2gpIHsKLQkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMTsKLQkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMjsKLQl9Ci0JaWYgKHJfY2gpIHsKLQkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gMzsKLQkJcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcuY2hhbl9pbmZvW2luZGV4KytdID0gNDsKLQl9Ci0JcHJvdF9jb25maWcuZmVlZGJhY2tfcGF0aF9jZmcubnVtX2NoYW5uZWxzID0gaW5kZXg7Ci0JcHJfZGVidWcoIiVzIG5vIG9mIGNoYW5uZWxzOiAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKLQlwcm90X2NvbmZpZy5mZWVkYmFja19wYXRoX2NmZy5taW5vcl92ZXJzaW9uID0gMTsKLQlyZXQgPSBhZmVfc3BrX3Byb3RfcHJlcGFyZShzcmNfcG9ydCwgZHN0X3BvcnQsCi0JCQlBRkVfUEFSQU1fSURfRkVFREJBQ0tfUEFUSF9DRkcsICZwcm90X2NvbmZpZyk7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGdldF9jYWxfdHlwZV9pbmRleChpbnQzMl90IGNhbF90eXBlKQotewotCWludCByZXQgPSAtRUlOVkFMOwotCi0Jc3dpdGNoIChjYWxfdHlwZSkgewotCWNhc2UgQUZFX0NPTU1PTl9SWF9DQUxfVFlQRToKLQkJcmV0ID0gQUZFX0NPTU1PTl9SWF9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0NPTU1PTl9UWF9DQUxfVFlQRToKLQkJcmV0ID0gQUZFX0NPTU1PTl9UWF9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0FBTkNfQ0FMX1RZUEU6Ci0JCXJldCA9IEFGRV9BQU5DX0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfSFdfREVMQVlfQ0FMX1RZUEU6Ci0JCXJldCA9IEFGRV9IV19ERUxBWV9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX0ZCX1NQS1JfUFJPVF9DQUxfVFlQRToKLQkJcmV0ID0gQUZFX0ZCX1NQS1JfUFJPVF9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1NJREVUT05FX0NBTF9UWVBFOgotCQlyZXQgPSBBRkVfU0lERVRPTkVfQ0FMOwotCQlicmVhazsKLQljYXNlIEFGRV9TSURFVE9ORV9JSVJfQ0FMX1RZUEU6Ci0JCXJldCA9IEFGRV9TSURFVE9ORV9JSVJfQ0FMOwotCQlicmVhazsKLQljYXNlIEFGRV9UT1BPTE9HWV9DQUxfVFlQRToKLQkJcmV0ID0gQUZFX1RPUE9MT0dZX0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKLQkJcmV0ID0gQUZFX0NVU1RfVE9QT0xPR1lfQ0FMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFmZV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCQkJCXZvaWQgKmRhdGEpCi17Ci0JaW50CQkJCXJldCA9IDA7Ci0JaW50CQkJCWNhbF9pbmRleDsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkIGNhbF9pbmRleCA9ICVkXG4iLAotCQkgIF9fZnVuY19fLCBjYWxfdHlwZSwgY2FsX2luZGV4KTsKLQotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gY2FsX3V0aWxzX2FsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCXRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCQkJCQl2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gY2FsX3V0aWxzX2RlYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJdGhpc19hZmUuY2FsX2RhdGFbY2FsX2luZGV4XSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWZlX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCQkJCXZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCXRoaXNfYWZlLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9pbmRleCA9PSBBRkVfQ1VTVF9UT1BPTE9HWV9DQUwpIHsKLQkJbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0NVU1RfVE9QT0xPR1lfQ0FMXS0+bG9jayk7Ci0JCXRoaXNfYWZlLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOwotCQlwcl9kZWJ1ZygiJXM6W0FGRV9DVVNUT01fVE9QT0xPR1ldIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQkJbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfQ1VTVF9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqYWZlX2ZpbmRfaHdfZGVsYXlfYnlfcGF0aCgKLQkJCXN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfdHlwZSwgaW50IHBhdGgpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmY2FsX3R5cGUtPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0KLQkJaWYgKCgoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5ICopY2FsX2Jsb2NrLT5jYWxfaW5mbykKLQkJCS0+cGF0aCA9PSBwYXRoKSB7Ci0JCQlyZXR1cm4gY2FsX2Jsb2NrOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGFmZV9nZXRfY2FsX2h3X2RlbGF5KGludDMyX3QgcGF0aCwKLQkJCQlzdHJ1Y3QgYXVkaW9fY2FsX2h3X2RlbGF5X2VudHJ5ICplbnRyeSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEJCSpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBhdWRpb19jYWxfaHdfZGVsYXlfZGF0YQkqaHdfZGVsYXlfaW5mbyA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0hXX0RFTEFZX0NBTF0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBRkVfSFdfREVMQVlfQ0FMIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChlbnRyeSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGVudHJ5IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoKHBhdGggPj0gTUFYX1BBVEhfVFlQRSkgfHwgKHBhdGggPCAwKSkgewotCQlwcl9lcnIoIiVzOiBiYWQgcGF0aDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcGF0aCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfSFdfREVMQVlfQ0FMXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gYWZlX2ZpbmRfaHdfZGVsYXlfYnlfcGF0aCgKLQkJdGhpc19hZmUuY2FsX2RhdGFbQUZFX0hXX0RFTEFZX0NBTF0sIHBhdGgpOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKLQkJZ290byB1bmxvY2s7Ci0KLQlod19kZWxheV9pbmZvID0gJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX2h3X2RlbGF5ICopCi0JCWNhbF9ibG9jay0+Y2FsX2luZm8pLT5kYXRhOwotCWlmIChod19kZWxheV9pbmZvLT5udW1fZW50cmllcyA+IE1BWF9IV19ERUxBWV9FTlRSSUVTKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgbnVtIGVudHJpZXM6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzOyBpKyspIHsKLQkJaWYgKGh3X2RlbGF5X2luZm8tPmVudHJ5W2ldLnNhbXBsZV9yYXRlID09Ci0JCQllbnRyeS0+c2FtcGxlX3JhdGUpIHsKLQkJCWVudHJ5LT5kZWxheV91c2VjID0gaHdfZGVsYXlfaW5mby0+ZW50cnlbaV0uZGVsYXlfdXNlYzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IGh3X2RlbGF5X2luZm8tPm51bV9lbnRyaWVzKSB7Ci0JCXByX2VycigiJXM6IFVuYWJsZSB0byBmaW5kIGRlbGF5IGZvciBzYW1wbGUgcmF0ZSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBlbnRyeS0+c2FtcGxlX3JhdGUpOwotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBQYXRoID0gJWQgc2FtcGxlcmF0ZSA9ICV1IHVzZWMgPSAldSBzdGF0dXMgJWRcbiIsCi0JCSBfX2Z1bmNfXywgcGF0aCwgZW50cnktPnNhbXBsZV9yYXRlLCBlbnRyeS0+ZGVsYXlfdXNlYywgcmV0KTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9IV19ERUxBWV9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc2V0X2NhbF9zcF90aF92aV9mdG1fY2ZnKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsCi0JCQkJCXZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX2Z0bV9jZmcgKmNhbF9kYXRhID0gZGF0YTsKLQotCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF0gPT0gTlVMTCB8fAotCSAgICBjYWxfZGF0YSA9PSBOVUxMIHx8Ci0JICAgIGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKLQkJZ290byBkb25lOwotCi0JcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMXS0+bG9jayk7Ci0JbWVtY3B5KCZ0aGlzX2FmZS50aF9mdG1fY2ZnLCAmY2FsX2RhdGEtPmNhbF9pbmZvLAotCQlzaXplb2YodGhpc19hZmUudGhfZnRtX2NmZykpOwotCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc2V0X2NhbF9zcF9leF92aV9mdG1fY2ZnKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsCi0JCQkJCXZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX2V4X3ZpX2Z0bV9jZmcgKmNhbF9kYXRhID0gZGF0YTsKLQotCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF0gPT0gTlVMTCB8fAotCSAgICBjYWxfZGF0YSA9PSBOVUxMIHx8Ci0JICAgIGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKLQkJZ290byBkb25lOwotCi0JcHJfZGVidWcoIiVzOiBjYWxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXS0+bG9jayk7Ci0JbWVtY3B5KCZ0aGlzX2FmZS5leF9mdG1fY2ZnLCAmY2FsX2RhdGEtPmNhbF9pbmZvLAotCQlzaXplb2YodGhpc19hZmUuZXhfZnRtX2NmZykpOwotCW11dGV4X3VubG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfc2V0X2NhbF9mYl9zcGtyX3Byb3QoaW50MzJfdCBjYWxfdHlwZSwgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCQkJCQkJdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfZmJfc3BrX3Byb3RfY2ZnCSpjYWxfZGF0YSA9IGRhdGE7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQlpZiAoY2FsX2RhdGEgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWlmIChkYXRhX3NpemUgIT0gc2l6ZW9mKCpjYWxfZGF0YSkpCi0JCWdvdG8gZG9uZTsKLQotCWlmIChjYWxfZGF0YS0+Y2FsX2luZm8ubW9kZSA9PSBNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTKQotCQlfX3BtX3dha2V1cF9ldmVudCgmd2wud3MsIGppZmZpZXNfdG9fbXNlY3MoV0FLRUxPQ0tfVElNRU9VVCkpOwotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfQ0FMXS0+bG9jayk7Ci0JbWVtY3B5KCZ0aGlzX2FmZS5wcm90X2NmZywgJmNhbF9kYXRhLT5jYWxfaW5mbywKLQkJc2l6ZW9mKHRoaXNfYWZlLnByb3RfY2ZnKSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9nZXRfY2FsX3NwX3RoX3ZpX2Z0bV9wYXJhbShpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLAotCQkJCQkgIHZvaWQgKmRhdGEpCi17Ci0JaW50IGksIHJldCA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2NhbF90eXBlX3NwX3RoX3ZpX3BhcmFtICpjYWxfZGF0YSA9IGRhdGE7Ci0Jc3RydWN0IGFmZV9zcF90aF92aV9nZXRfcGFyYW0gdGhfdmk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGNhbF90eXBlID0gJWRcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JaWYgKHRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMXSA9PSBOVUxMIHx8Ci0JICAgIGNhbF9kYXRhID09IE5VTEwgfHwKLQkgICAgZGF0YV9zaXplICE9IHNpemVvZigqY2FsX2RhdGEpKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX1RIX1ZJX0NBTF0tPmxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBTUF9WMl9OVU1fTUFYX1NQS1JTOyBpKyspIHsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1c1tpXSA9IC1FSU5WQUw7Ci0JCWNhbF9kYXRhLT5jYWxfaW5mby5yX2RjX3EyNFtpXSA9IC0xOwotCQljYWxfZGF0YS0+Y2FsX2luZm8udGVtcF9xMjJbaV0gPSAtMTsKLQl9Ci0JaWYgKCFhZmVfZ2V0X3NwX3RoX3ZpX2Z0bV9kYXRhKCZ0aF92aSkpIHsKLQkJZm9yIChpID0gMDsgaSA8IFNQX1YyX05VTV9NQVhfU1BLUlM7IGkrKykgewotCQkJcHJfZGVidWcoIiVzOiBmdG0gcGFyYW0gc3RhdHVzID0gJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgdGhfdmkucGFyYW0uc3RhdHVzW2ldKTsKLQkJCWlmICh0aF92aS5wYXJhbS5zdGF0dXNbaV0gPT0gRkJTUF9JTl9QUk9HUkVTUykgewotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXNbaV0gPSAtRUFHQUlOOwotCQkJfSBlbHNlIGlmICh0aF92aS5wYXJhbS5zdGF0dXNbaV0gPT0gRkJTUF9TVUNDRVNTKSB7Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1c1tpXSA9IDA7Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnJfZGNfcTI0W2ldID0KLQkJCQkJdGhfdmkucGFyYW0uZGNfcmVzX3EyNFtpXTsKLQkJCQljYWxfZGF0YS0+Y2FsX2luZm8udGVtcF9xMjJbaV0gPQotCQkJCQl0aF92aS5wYXJhbS50ZW1wX3EyMltpXTsKLQkJCX0KLQkJfQotCX0KLQltdXRleF91bmxvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfVEhfVklfQ0FMXS0+bG9jayk7Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWZlX2dldF9jYWxfc3BfZXhfdmlfZnRtX3BhcmFtKGludDMyX3QgY2FsX3R5cGUsIHNpemVfdCBkYXRhX3NpemUsCi0JCQkJCSAgdm9pZCAqZGF0YSkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX3R5cGVfc3BfZXhfdmlfcGFyYW0gKmNhbF9kYXRhID0gZGF0YTsKLQlzdHJ1Y3QgYWZlX3NwX2V4X3ZpX2dldF9wYXJhbSBleF92aTsKLQotCXByX2RlYnVnKCIlczogY2FsX3R5cGUgPSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKLQlpZiAodGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxdID09IE5VTEwgfHwKLQkgICAgY2FsX2RhdGEgPT0gTlVMTCB8fAotCSAgICBkYXRhX3NpemUgIT0gc2l6ZW9mKCpjYWxfZGF0YSkpCi0JCWdvdG8gZG9uZTsKLQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmNhbF9kYXRhW0FGRV9GQl9TUEtSX1BST1RfRVhfVklfQ0FMXS0+bG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IFNQX1YyX05VTV9NQVhfU1BLUlM7IGkrKykgewotCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzW2ldID0gLUVJTlZBTDsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLmZyZXFfcTIwW2ldID0gLTE7Ci0JCWNhbF9kYXRhLT5jYWxfaW5mby5yZXNpc19xMjRbaV0gPSAtMTsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnFtY3RfcTI0W2ldID0gLTE7Ci0JfQotCWlmICghYWZlX2dldF9zcF9leF92aV9mdG1fZGF0YSgmZXhfdmkpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTUF9WMl9OVU1fTUFYX1NQS1JTOyBpKyspIHsKLQkJCXByX2RlYnVnKCIlczogZnRtIHBhcmFtIHN0YXR1cyA9ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIGV4X3ZpLnBhcmFtLnN0YXR1c1tpXSk7Ci0JCQlpZiAoZXhfdmkucGFyYW0uc3RhdHVzW2ldID09IEZCU1BfSU5fUFJPR1JFU1MpIHsKLQkJCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzW2ldID0gLUVBR0FJTjsKLQkJCX0gZWxzZSBpZiAoZXhfdmkucGFyYW0uc3RhdHVzW2ldID09IEZCU1BfU1VDQ0VTUykgewotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXNbaV0gPSAwOwotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5mcmVxX3EyMFtpXSA9Ci0JCQkJCWV4X3ZpLnBhcmFtLmZyZXFfcTIwW2ldOwotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yZXNpc19xMjRbaV0gPQotCQkJCQlleF92aS5wYXJhbS5yZXNpc19xMjRbaV07Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnFtY3RfcTI0W2ldID0KLQkJCQkJZXhfdmkucGFyYW0ucW1jdF9xMjRbaV07Ci0JCQl9Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0VYX1ZJX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV9nZXRfY2FsX2ZiX3Nwa3JfcHJvdChpbnQzMl90IGNhbF90eXBlLCBzaXplX3QgZGF0YV9zaXplLAotCQkJCQkJCQl2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhdWRpb19jYWxfdHlwZV9mYl9zcGtfcHJvdF9zdGF0dXMgKmNhbF9kYXRhID0gZGF0YTsKLQlzdHJ1Y3QgYWZlX3Nwa3JfcHJvdF9nZXRfdmlfY2FsaWIgY2FsaWJfcmVzcDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWlmICh0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0gPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWlmIChjYWxfZGF0YSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JaWYgKGRhdGFfc2l6ZSAhPSBzaXplb2YoKmNhbF9kYXRhKSkKLQkJZ290byBkb25lOwotCi0JbXV0ZXhfbG9jaygmdGhpc19hZmUuY2FsX2RhdGFbQUZFX0ZCX1NQS1JfUFJPVF9DQUxdLT5sb2NrKTsKLQlpZiAodGhpc19hZmUucHJvdF9jZmcubW9kZSA9PSBNU01fU1BLUl9QUk9UX0NBTElCUkFURUQpIHsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMV0gPQotCQkJdGhpc19hZmUucHJvdF9jZmcucjBbU1BfVjJfU1BLUl8xXTsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMl0gPQotCQkJdGhpc19hZmUucHJvdF9jZmcucjBbU1BfVjJfU1BLUl8yXTsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1cyA9IDA7Ci0JfSBlbHNlIGlmICh0aGlzX2FmZS5wcm90X2NmZy5tb2RlID09Ci0JCQlNU01fU1BLUl9QUk9UX0NBTElCUkFUSU9OX0lOX1BST0dSRVNTKSB7Ci0JCS8qQ2FsbCBBRkUgdG8gcXVlcnkgdGhlIHN0YXR1cyovCi0JCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXMgPSAtRUlOVkFMOwotCQljYWxfZGF0YS0+Y2FsX2luZm8ucjBbU1BfVjJfU1BLUl8xXSA9IC0xOwotCQljYWxfZGF0YS0+Y2FsX2luZm8ucjBbU1BfVjJfU1BLUl8yXSA9IC0xOwotCQlpZiAoIWFmZV9zcGtfcHJvdF9nZXRfY2FsaWJfZGF0YSgmY2FsaWJfcmVzcCkpIHsKLQkJCWlmIChjYWxpYl9yZXNwLnJlc19jZmcudGhfdmlfY2Ffc3RhdGUgPT0KLQkJCQkJCQlGQlNQX0lOX1BST0dSRVNTKQotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXMgPSAtRUFHQUlOOwotCQkJZWxzZSBpZiAoY2FsaWJfcmVzcC5yZXNfY2ZnLnRoX3ZpX2NhX3N0YXRlID09Ci0JCQkJCQkJRkJTUF9TVUNDRVNTKSB7Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnN0YXR1cyA9IDA7Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMV0gPQotCQkJCWNhbGliX3Jlc3AucmVzX2NmZy5yMF9jYWxpX3EyNFtTUF9WMl9TUEtSXzFdOwotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzJdID0KLQkJCQljYWxpYl9yZXNwLnJlc19jZmcucjBfY2FsaV9xMjRbU1BfVjJfU1BLUl8yXTsKLQkJCX0KLQkJfQotCQlpZiAoIWNhbF9kYXRhLT5jYWxfaW5mby5zdGF0dXMpIHsKLQkJCXRoaXNfYWZlLnByb3RfY2ZnLm1vZGUgPQotCQkJCU1TTV9TUEtSX1BST1RfQ0FMSUJSQVRFRDsKLQkJCXRoaXNfYWZlLnByb3RfY2ZnLnIwW1NQX1YyX1NQS1JfMV0gPQotCQkJCWNhbF9kYXRhLT5jYWxfaW5mby5yMFtTUF9WMl9TUEtSXzFdOwotCQkJdGhpc19hZmUucHJvdF9jZmcucjBbU1BfVjJfU1BLUl8yXSA9Ci0JCQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMl07Ci0JCX0KLQl9IGVsc2UgewotCQkvKkluZGljYXRlcyBjYWxpYnJhdGlvbiBkYXRhIGlzIGludmFsaWQqLwotCQljYWxfZGF0YS0+Y2FsX2luZm8uc3RhdHVzID0gLUVJTlZBTDsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMV0gPSAtMTsKLQkJY2FsX2RhdGEtPmNhbF9pbmZvLnIwW1NQX1YyX1NQS1JfMl0gPSAtMTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5jYWxfZGF0YVtBRkVfRkJfU1BLUl9QUk9UX0NBTF0tPmxvY2spOwotCV9fcG1fcmVsYXgoJndsLndzKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZmVfbWFwX2NhbF9kYXRhKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQotCW11dGV4X2xvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUubWVtX21hcF9jYWxfaW5kZXgsIGNhbF9pbmRleCk7Ci0JcmV0ID0gYWZlX2NtZF9tZW1vcnlfbWFwKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgLTEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBzaXplID0gJXpkIHJldCAlZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgcmV0KTsKLQkJcHJfZGVidWcoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJXpkXG4iLAotCQkJX19mdW5jX18sCi0JCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOwotCQltdXRleF91bmxvY2soJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSBhdG9taWNfcmVhZCgmdGhpc19hZmUuCi0JCW1lbV9tYXBfY2FsX2hhbmRsZXNbY2FsX2luZGV4XSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0aGlzX2FmZS5hZmVfY21kX2xvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFmZV91bm1hcF9jYWxfZGF0YShpbnQzMl90IGNhbF90eXBlLAotCQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IENhbCBibG9jayBpcyBOVUxMIVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9PSAwKSB7Ci0JCXByX2VycigiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9oYW5kbGVzW2NhbF9pbmRleF0sCi0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgY2FsX2luZGV4KTsKLQlyZXQgPSBhZmVfY21kX21lbW9yeV91bm1hcF9ub3dhaXQoCi0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgLTEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgY2FsX3R5cGUgJWkgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCwgcmV0KTsKLQl9Ci0JY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSAwOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBhZmVfZGVsZXRlX2NhbF9kYXRhKHZvaWQpCi17Ci0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKE1BWF9BRkVfQ0FMX1RZUEVTLCB0aGlzX2FmZS5jYWxfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWZlX2luaXRfY2FsX2RhdGEodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY2FsX3R5cGVfaW5mbwljYWxfdHlwZV9pbmZvW10gPSB7Ci0JCXt7QUZFX0NPTU1PTl9SWF9DQUxfVFlQRSwKLQkJe2FmZV9hbGxvY19jYWwsIGFmZV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXthZmVfbWFwX2NhbF9kYXRhLCBhZmVfdW5tYXBfY2FsX2RhdGEsCi0JCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QUZFX0NPTU1PTl9UWF9DQUxfVFlQRSwKLQkJe2FmZV9hbGxvY19jYWwsIGFmZV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXthZmVfbWFwX2NhbF9kYXRhLCBhZmVfdW5tYXBfY2FsX2RhdGEsCi0JCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QUZFX0FBTkNfQ0FMX1RZUEUsCi0JCXthZmVfYWxsb2NfY2FsLCBhZmVfZGVhbGxvY19jYWwsIE5VTEwsCi0JCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7YWZlX21hcF9jYWxfZGF0YSwgYWZlX3VubWFwX2NhbF9kYXRhLAotCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FGRV9GQl9TUEtSX1BST1RfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCBhZmVfc2V0X2NhbF9mYl9zcGtyX3Byb3QsCi0JCWFmZV9nZXRfY2FsX2ZiX3Nwa3JfcHJvdCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QUZFX0hXX0RFTEFZX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwKLQkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FGRV9TSURFVE9ORV9DQUxfVFlQRSwKLQkJe05VTEwsIE5VTEwsIE5VTEwsCi0JCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tBRkVfU0lERVRPTkVfSUlSX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwKLQkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FGRV9UT1BPTE9HWV9DQUxfVFlQRSwKLQkJe05VTEwsIE5VTEwsIE5VTEwsCi0JCWFmZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwKLQkJY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tBRkVfQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRSwKLQkJe2FmZV9hbGxvY19jYWwsIGFmZV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJYWZlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXthZmVfbWFwX2NhbF9kYXRhLCBhZmVfdW5tYXBfY2FsX2RhdGEsCi0JCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QUZFX0ZCX1NQS1JfUFJPVF9USF9WSV9DQUxfVFlQRSwKLQkJe05VTEwsIE5VTEwsIE5VTEwsIGFmZV9zZXRfY2FsX3NwX3RoX3ZpX2Z0bV9jZmcsCi0JCWFmZV9nZXRfY2FsX3NwX3RoX3ZpX2Z0bV9wYXJhbSwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QUZFX0ZCX1NQS1JfUFJPVF9FWF9WSV9DQUxfVFlQRSwKLQkJe05VTEwsIE5VTEwsIE5VTEwsIGFmZV9zZXRfY2FsX3NwX2V4X3ZpX2Z0bV9jZmcsCi0JCWFmZV9nZXRfY2FsX3NwX2V4X3ZpX2Z0bV9wYXJhbSwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCX07Ci0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JcmV0ID0gY2FsX3V0aWxzX2NyZWF0ZV9jYWxfdHlwZXMoTUFYX0FGRV9DQUxfVFlQRVMsIHRoaXNfYWZlLmNhbF9kYXRhLAotCQljYWxfdHlwZV9pbmZvKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgY3JlYXRlIGNhbCB0eXBlISAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotZXJyOgotCWFmZV9kZWxldGVfY2FsX2RhdGEoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYWZlX21hcF9ydGFjX2Jsb2NrKHN0cnVjdCBydGFjX2NhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIGFkZHJlc3MgdG8gbWFwIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBtYXAgc2l6ZSBpcyAwIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJlc3VsdCA9IGFmZV9jbWRfbWVtb3J5X21hcChjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZmVfY21kX21lbW9yeV9tYXAgZmFpbGVkIGZvciBhZGRyID0gMHglcEssIHNpemUgPSAlZCwgZXJyICVkXG4iLAotCQkJX19mdW5jX18sICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfaGFuZGxlID0gdGhpc19hZmUubW1hcF9oYW5kbGU7Ci0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IGFmZV91bm1hcF9ydGFjX2Jsb2NrKHVpbnQzMl90ICptZW1fbWFwX2hhbmRsZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWlmIChtZW1fbWFwX2hhbmRsZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE1hcCBoYW5kbGUgaXMgTlVMTCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgqbWVtX21hcF9oYW5kbGUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgMCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJlc3VsdCA9IGFmZV9jbWRfbWVtb3J5X3VubWFwKCptZW1fbWFwX2hhbmRsZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBBRkUgbWVtb3J5IHVubWFwIGZhaWxlZCAlZCwgaGFuZGxlIDB4JXhcbiIsCi0JCSAgICAgX19mdW5jX18sIHJlc3VsdCwgKm1lbV9tYXBfaGFuZGxlKTsKLQkJZ290byBkb25lOwotCX0gZWxzZSB7Ci0JCSptZW1fbWFwX2hhbmRsZSA9IDA7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFmZV9pbml0KHZvaWQpCi17Ci0JaW50IGkgPSAwLCByZXQ7Ci0KLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5zdGF0ZSwgMCk7Ci0JYXRvbWljX3NldCgmdGhpc19hZmUuc3RhdHVzLCAwKTsKLQlhdG9taWNfc2V0KCZ0aGlzX2FmZS5tZW1fbWFwX2NhbF9pbmRleCwgLTEpOwotCXRoaXNfYWZlLmFwciA9IE5VTEw7Ci0JdGhpc19hZmUuZHRtZl9nZW5fcnhfcG9ydGlkID0gLTE7Ci0JdGhpc19hZmUubW1hcF9oYW5kbGUgPSAwOwotCXRoaXNfYWZlLnZpX3R4X3BvcnQgPSAtMTsKLQl0aGlzX2FmZS52aV9yeF9wb3J0ID0gLTE7Ci0JdGhpc19hZmUucHJvdF9jZmcubW9kZSA9IE1TTV9TUEtSX1BST1RfRElTQUJMRUQ7Ci0JdGhpc19hZmUudGhfZnRtX2NmZy5tb2RlID0gTVNNX1NQS1JfUFJPVF9ESVNBQkxFRDsKLQl0aGlzX2FmZS5leF9mdG1fY2ZnLm1vZGUgPSBNU01fU1BLUl9QUk9UX0RJU0FCTEVEOwotCW11dGV4X2luaXQoJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IEFGRV9NQVhfUE9SVFM7IGkrKykgewotCQl0aGlzX2FmZS5hZmVfY2FsX21vZGVbaV0gPSBBRkVfQ0FMX01PREVfREVGQVVMVDsKLQkJdGhpc19hZmUuYWZlX3NhbXBsZV9yYXRlc1tpXSA9IDA7Ci0JCXRoaXNfYWZlLmRldl9hY2RiX2lkW2ldID0gMDsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpc19hZmUud2FpdFtpXSk7Ci0JfQotCXdha2V1cF9zb3VyY2VfaW5pdCgmd2wud3MsICJzcGtyLXByb3QiKTsKLQlyZXQgPSBhZmVfaW5pdF9jYWxfZGF0YSgpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBpbml0IGNhbCBkYXRhISAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQljb25maWdfZGVidWdfZnNfaW5pdCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWZlX2V4aXQodm9pZCkKLXsKLQlhZmVfZGVsZXRlX2NhbF9kYXRhKCk7Ci0KLQljb25maWdfZGVidWdfZnNfZXhpdCgpOwotCW11dGV4X2Rlc3Ryb3koJnRoaXNfYWZlLmFmZV9jbWRfbG9jayk7Ci0Jd2FrZXVwX3NvdXJjZV90cmFzaCgmd2wud3MpOwotfQotCi1kZXZpY2VfaW5pdGNhbGwoYWZlX2luaXQpOwotX19leGl0Y2FsbChhZmVfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhc20uYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UxNjE4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmFzbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTM5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQXV0aG9yOiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpby5oPgotCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21lbW9yeS5oPgotCi0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhc20tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmF1ZGlvLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19wYXJhbXMuaD4KLQotI2RlZmluZSBUUlVFICAgICAgICAweDAxCi0jZGVmaW5lIEZBTFNFICAgICAgIDB4MDAKLSNkZWZpbmUgU0VTU0lPTl9NQVggOAotCi1lbnVtIHsKLQlBU01fVE9QT0xPR1lfQ0FMID0gMCwKLQlBU01fQ1VTVE9NX1RPUF9DQUwsCi0JQVNNX0FVRFNUUk1fQ0FMLAotCUFTTV9SVEFDX0FQUl9DQUwsCi0JQVNNX01BWF9DQUxfVFlQRVMKLX07Ci0KLXVuaW9uIGFzbV90b2tlbl9zdHJ1Y3QgewotCXN0cnVjdCB7Ci0JCXU4IHN0cmVhbV9pZDsKLQkJdTggc2Vzc2lvbl9pZDsKLQkJdTggYnVmX2luZGV4OwotCQl1OCBmbGFnczsKLQl9IF90b2tlbjsKLQl1MzIgdG9rZW47Ci19IF9fcGFja2VkOwotCi0KLWVudW0gewotCUFTTV9ESVJFQ1RJT05fT0ZGU0VULAotCUFTTV9DTURfTk9fV0FJVF9PRkZTRVQsCi0JLyoKLQkgKiBPZmZzZXQgaXMgbGltaXRlZCB0byA3IGJlY2F1c2UgZmxhZ3MgaXMgc3RvcmVkIGluIHU4Ci0JICogZmllbGQgaW4gYXNtX3Rva2VuX3N0cnVjdHVyZSBkZWZpbmVkIGFib3ZlLiBUaGUgb2Zmc2V0Ci0JICogc3RhcnRzIGZyb20gMC4KLQkgKi8KLQlBU01fTUFYX09GRlNFVCA9IDcsCi19OwotCi1lbnVtIHsKLQlXQUlUX0NNRCwKLQlOT19XQUlUX0NNRAotfTsKLQotI2RlZmluZSBBU01fU0VUX0JJVChuLCB4KQkobiB8PSAxIDw8IHgpCi0jZGVmaW5lIEFTTV9URVNUX0JJVChuLCB4KQkoKG4gPj4geCkgJiAxKQotCi0vKiBUT0RPLCBjb21iaW5lIHRoZW0gdG9nZXRoZXIgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoc2Vzc2lvbl9sb2NrKTsKLXN0cnVjdCBhc21fbW1hcCB7Ci0JYXRvbWljX3QgcmVmX2NudDsKLQl2b2lkICphcHI7Ci19OwotCi1zdGF0aWMgc3RydWN0IGFzbV9tbWFwIHRoaXNfbW1hcDsKLS8qIHNlc3Npb24gaWQ6IDAgcmVzZXJ2ZWQgKi8KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fY2xpZW50ICpzZXNzaW9uW0FTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEICsgMV07Ci0KLXN0cnVjdCBhc21fYnVmZmVyX25vZGUgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlwaHlzX2FkZHJfdCBidWZfcGh5c19hZGRyOwotCXVpbnQzMl90ICBtbWFwX2hkbDsKLX07Ci1zdGF0aWMgaW50MzJfdCBxNmFzbV9zcnZjX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOwotc3RhdGljIGludDMyX3QgcTZhc21fY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdik7Ci1zdGF0aWMgdm9pZCBxNmFzbV9hZGRfaGRyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcpOwotc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcl9jdXN0b21fdG9wb2xvZ3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCQkJICB1aW50MzJfdCBwa3Rfc2l6ZSk7Ci1zdGF0aWMgdm9pZCBxNmFzbV9hZGRfaGRyX2FzeW5jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcpOwotc3RhdGljIGludCBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIsCi0JCQkJdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCwKLQkJCQlib29sIGlzX2NvbnRpZ3VvdXMpOwotc3RhdGljIGludCBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGRpcik7Ci1zdGF0aWMgdm9pZCBxNmFzbV9yZXNldF9idWZfc3RhdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpOwotCi1zdGF0aWMgaW50IHE2YXNtX21hcF9jaGFubmVscyh1OCAqY2hhbm5lbF9tYXBwaW5nLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQlib29sIHVzZV9iYWNrX2ZsYXZvcik7Ci12b2lkICpxNmFzbV9tbWFwX2Fwcl9yZWcodm9pZCk7Ci0KLXN0YXRpYyBpbnQgcTZhc21faXNfdmFsaWRfc2Vzc2lvbihzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKLXN0YXRpYyBpbnQgcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwodm9pZCk7Ci1zdGF0aWMgaW50IHE2YXNtX2dldF9hc21fYXBwX3R5cGVfY2FsKHZvaWQpOwotCi0vKiBmb3IgQVNNIGN1c3RvbSB0b3BvbG9neSAqLwotc3RhdGljIHN0cnVjdCBjYWxfdHlwZV9kYXRhICpjYWxfZGF0YVtBU01fTUFYX0NBTF9UWVBFU107Ci1zdGF0aWMgc3RydWN0IGF1ZGlvX2J1ZmZlciBjb21tb25fYnVmWzJdOwotc3RhdGljIHN0cnVjdCBhdWRpb19jbGllbnQgY29tbW9uX2NsaWVudDsKLXN0YXRpYyBpbnQgc2V0X2N1c3RvbV90b3BvbG9neTsKLXN0YXRpYyBpbnQgdG9wb2xvZ3lfbWFwX2hhbmRsZTsKLQotc3RydWN0IGdlbmVyaWNfZ2V0X2RhdGFfIHsKLQlpbnQgdmFsaWQ7Ci0JaW50IGlzX2luYmFuZDsKLQlpbnQgc2l6ZV9pbl9pbnRzOwotCWludCBpbnRzW107Ci19Owotc3RhdGljIHN0cnVjdCBnZW5lcmljX2dldF9kYXRhXyAqZ2VuZXJpY19nZXRfZGF0YTsKLQotI2lmZGVmIENPTkZJR19ERUJVR19GUwotI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgNTYKLSNkZWZpbmUgSU5fQlVGRkVSX1NJWkUgMjQKLQotc3RhdGljIHN0cnVjdCB0aW1ldmFsIG91dF9jb2xkX3R2Owotc3RhdGljIHN0cnVjdCB0aW1ldmFsIG91dF93YXJtX3R2Owotc3RhdGljIHN0cnVjdCB0aW1ldmFsIG91dF9jb250X3R2Owotc3RhdGljIHN0cnVjdCB0aW1ldmFsIGluX2NvbnRfdHY7Ci1zdGF0aWMgbG9uZyBvdXRfZW5hYmxlX2ZsYWc7Ci1zdGF0aWMgbG9uZyBpbl9lbmFibGVfZmxhZzsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvdXRfZGVudHJ5Owotc3RhdGljIHN0cnVjdCBkZW50cnkgKmluX2RlbnRyeTsKLXN0YXRpYyBpbnQgaW5fY29udF9pbmRleDsKLS8qVGhpcyB2YXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGZpcnN0IHdyaXRlIGRvbmUgZm9yIGNvbGQgb3V0cHV0IGxhdGVuY3kgKi8KLXN0YXRpYyBpbnQgb3V0X2NvbGRfaW5kZXg7Ci1zdGF0aWMgY2hhciAqb3V0X2J1ZmZlcjsKLXN0YXRpYyBjaGFyICppbl9idWZmZXI7Ci0KLXN0YXRpYyB1aW50MzJfdCBhZHNwX3JlZ19ldmVudF9vcGNvZGVbXSA9IHsKLQlBU01fU1RSRUFNX0NNRF9SRUdJU1RFUl9QUF9FVkVOVFMsCi0JQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfRU5DREVDX0VWRU5UUywKLQlBU01fU1RSRUFNX0NNRF9SRUdJU1RFUl9JRUNfNjE5MzdfRk1UX1VQREFURSB9OwotCi1zdGF0aWMgdWludDMyX3QgYWRzcF9yYWlzZV9ldmVudF9vcGNvZGVbXSA9IHsKLQlBU01fU1RSRUFNX1BQX0VWRU5ULAotCUFTTV9TVFJFQU1fQ01EX0VOQ0RFQ19FVkVOVFMsCi0JQVNNX0lFQ182MTkzN19NRURJQV9GTVRfRVZFTlQgfTsKLQotc3RhdGljIGludCBpc19hZHNwX3JlZ19ldmVudCh1aW50MzJfdCBjbWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZHNwX3JlZ19ldmVudF9vcGNvZGUpOyBpKyspIHsKLQkJaWYgKGNtZCA9PSBhZHNwX3JlZ19ldmVudF9vcGNvZGVbaV0pCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYWRzcF9yYWlzZV9ldmVudCh1aW50MzJfdCBjbWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZHNwX3JhaXNlX2V2ZW50X29wY29kZSk7IGkrKykgewotCQlpZiAoY21kID09IGFkc3BfcmFpc2VfZXZlbnRfb3Bjb2RlW2ldKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcTZhc21fc2V0X2ZsYWdfaW5fdG9rZW4odW5pb24gYXNtX3Rva2VuX3N0cnVjdCAqYXNtX3Rva2VuLAotCQkJCQkgICBpbnQgZmxhZywgaW50IGZsYWdfb2Zmc2V0KQotewotCWlmIChmbGFnKQotCQlBU01fU0VUX0JJVChhc21fdG9rZW4tPl90b2tlbi5mbGFncywgZmxhZ19vZmZzZXQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBxNmFzbV9nZXRfZmxhZ19mcm9tX3Rva2VuKHVuaW9uIGFzbV90b2tlbl9zdHJ1Y3QgKmFzbV90b2tlbiwKLQkJCQkJICAgIGludCBmbGFnX29mZnNldCkKLXsKLQlyZXR1cm4gQVNNX1RFU1RfQklUKGFzbV90b2tlbi0+X3Rva2VuLmZsYWdzLCBmbGFnX29mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBxNmFzbV91cGRhdGVfdG9rZW4odTMyICp0b2tlbiwgdTggc2Vzc2lvbl9pZCwgdTggc3RyZWFtX2lkLAotCQkJCSAgICAgIHU4IGJ1Zl9pbmRleCwgdTggZGlyLCB1OCBub3dhaXRfZmxhZykKLXsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQotCWFzbV90b2tlbi50b2tlbiA9IDA7Ci0JYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKLQlhc21fdG9rZW4uX3Rva2VuLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKLQlhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleCA9IGJ1Zl9pbmRleDsKLQlxNmFzbV9zZXRfZmxhZ19pbl90b2tlbigmYXNtX3Rva2VuLCBkaXIsIEFTTV9ESVJFQ1RJT05fT0ZGU0VUKTsKLQlxNmFzbV9zZXRfZmxhZ19pbl90b2tlbigmYXNtX3Rva2VuLCBub3dhaXRfZmxhZywKLQkJCQkgIEFTTV9DTURfTk9fV0FJVF9PRkZTRVQpOwotCSp0b2tlbiA9IGFzbV90b2tlbi50b2tlbjsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdCBxNmFzbV9nZXRfcGNtX2Zvcm1hdF9pZCh1aW50MzJfdCBtZWRpYV9mb3JtYXRfYmxvY2tfdmVyKQotewotCXVpbnQzMl90IHBjbV9mb3JtYXRfaWQ7Ci0KLQlzd2l0Y2ggKG1lZGlhX2Zvcm1hdF9ibG9ja192ZXIpIHsKLQljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjQ6Ci0JCXBjbV9mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1Y0OwotCQlicmVhazsKLQljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjM6Ci0JCXBjbV9mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzOwotCQlicmVhazsKLQljYXNlIFBDTV9NRURJQV9GT1JNQVRfVjI6Ci0JZGVmYXVsdDoKLQkJcGNtX2Zvcm1hdF9pZCA9IEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjI7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcGNtX2Zvcm1hdF9pZDsKLX0KLQotLyoKLSAqIHE2YXNtX2dldF9idWZfaW5kZXhfZnJvbV90b2tlbjoKLSAqICAgICAgIFJldHJpZXZlIGJ1ZmZlciBpbmRleCBmcm9tIHRva2VuLgotICoKLSAqIEB0b2tlbjogdG9rZW4gdmFsdWUgc2VudCB0byBBU00gc2VydmljZSBvbiBxNi4KLSAqIFJldHVybnMgYnVmZmVyIGluZGV4IGluIHRoZSByZWFkL3dyaXRlIGNvbW1hbmRzLgotICovCi11aW50OF90IHE2YXNtX2dldF9idWZfaW5kZXhfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbikKLXsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQotCWFzbV90b2tlbi50b2tlbiA9IHRva2VuOwotCXJldHVybiBhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleDsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fZ2V0X2J1Zl9pbmRleF9mcm9tX3Rva2VuKTsKLQotLyoKLSAqIHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbjoKLSAqICAgICAgIFJldHJpZXZlIHN0cmVhbSBpZCBmcm9tIHRva2VuLgotICoKLSAqIEB0b2tlbjogdG9rZW4gdmFsdWUgc2VudCB0byBBU00gc2VydmljZSBvbiBxNi4KLSAqIFJldHVybnMgc3RyZWFtIGlkLgotICovCi11aW50OF90IHE2YXNtX2dldF9zdHJlYW1faWRfZnJvbV90b2tlbih1aW50MzJfdCB0b2tlbikKLXsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQotCWFzbV90b2tlbi50b2tlbiA9IHRva2VuOwotCXJldHVybiBhc21fdG9rZW4uX3Rva2VuLnN0cmVhbV9pZDsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fZ2V0X3N0cmVhbV9pZF9mcm9tX3Rva2VuKTsKLQotc3RhdGljIGludCBhdWRpb19vdXRwdXRfbGF0ZW5jeV9kYmdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCQkJc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90IGF1ZGlvX291dHB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JaWYgKG91dF9idWZmZXIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBvdXRfYnVmZmVyIGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNucHJpbnRmKG91dF9idWZmZXIsIE9VVF9CVUZGRVJfU0laRSwgIiVsZCwlbGQsJWxkLCVsZCwlbGQsJWxkLCIsCi0JCW91dF9jb2xkX3R2LnR2X3NlYywgb3V0X2NvbGRfdHYudHZfdXNlYywgb3V0X3dhcm1fdHYudHZfc2VjLAotCQlvdXRfd2FybV90di50dl91c2VjLCBvdXRfY29udF90di50dl9zZWMsIG91dF9jb250X3R2LnR2X3VzZWMpOwotCXJldHVybiAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBPVVRfQlVGRkVSX1NJWkUsIHBwb3MsCi0JCQkJCQlvdXRfYnVmZmVyLCBPVVRfQlVGRkVSX1NJWkUpOwotfQotc3RhdGljIHNzaXplX3QgYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICp0ZW1wOwotCi0JaWYgKGNvdW50ID4gMipzaXplb2YoY2hhcikpIHsKLQkJcHJfZXJyKCIlczogZXJyIGNvdW50IGlzIG1vcmUgJXpkXG4iLCBfX2Z1bmNfXywgY291bnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdGVtcCAgPSBrbWFsbG9jKDIqc2l6ZW9mKGNoYXIpLCBHRlBfS0VSTkVMKTsKLQotCW91dF9jb2xkX2luZGV4ID0gMDsKLQotCWlmICh0ZW1wKSB7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcih0ZW1wLCBidWYsIDIqc2l6ZW9mKGNoYXIpKSkgewotCQkJcHJfZXJyKCIlczogY29weSBmcm9tIHVzZXIgZmFpbGVkIGZvciBzaXplICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgMipzaXplb2YoY2hhcikpOwotCQkJa2ZyZWUodGVtcCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlpZiAoIWtzdHJ0b2wodGVtcCwgMTAsICZvdXRfZW5hYmxlX2ZsYWcpKSB7Ci0JCQlrZnJlZSh0ZW1wKTsKLQkJCXJldHVybiBjb3VudDsKLQkJfQotCQlrZnJlZSh0ZW1wKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWRpb19vdXRwdXRfbGF0ZW5jeV9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfb3BlbiwKLQkucmVhZCA9IGF1ZGlvX291dHB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQsCi0JLndyaXRlID0gYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUKLX07Ci1zdGF0aWMgaW50IGF1ZGlvX2lucHV0X2xhdGVuY3lfZGJnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3NpemVfdCBhdWRpb19pbnB1dF9sYXRlbmN5X2RiZ2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JaWYgKGluX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGluX2J1ZmZlciBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlzbnByaW50Zihpbl9idWZmZXIsIElOX0JVRkZFUl9TSVpFLCAiJWxkLCVsZCwiLAotCQkJCWluX2NvbnRfdHYudHZfc2VjLCBpbl9jb250X3R2LnR2X3VzZWMpOwotCXJldHVybiAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBJTl9CVUZGRVJfU0laRSwgcHBvcywKLQkJCQkJCWluX2J1ZmZlciwgSU5fQlVGRkVSX1NJWkUpOwotfQotc3RhdGljIHNzaXplX3QgYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKnRlbXA7Ci0KLQlpZiAoY291bnQgPiAyKnNpemVvZihjaGFyKSkgewotCQlwcl9lcnIoIiVzOiBlcnIgY291bnQgaXMgbW9yZSAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl0ZW1wICA9IGttYWxsb2MoMipzaXplb2YoY2hhciksIEdGUF9LRVJORUwpOwotCi0JaWYgKHRlbXApIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHRlbXAsIGJ1ZiwgMipzaXplb2YoY2hhcikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5IGZyb20gdXNlciBmYWlsZWQgZm9yIHNpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLCAyKnNpemVvZihjaGFyKSk7Ci0JCQlrZnJlZSh0ZW1wKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmICgha3N0cnRvbCh0ZW1wLCAxMCwgJmluX2VuYWJsZV9mbGFnKSkgewotCQkJa2ZyZWUodGVtcCk7Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQkJa2ZyZWUodGVtcCk7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXVkaW9faW5wdXRfbGF0ZW5jeV9kZWJ1Z19mb3BzID0gewotCS5vcGVuID0gYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc19vcGVuLAotCS5yZWFkID0gYXVkaW9faW5wdXRfbGF0ZW5jeV9kYmdmc19yZWFkLAotCS53cml0ZSA9IGF1ZGlvX2lucHV0X2xhdGVuY3lfZGJnZnNfd3JpdGUKLX07Ci0KLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc193cml0ZV9jYih2b2lkKQotewotCWlmIChvdXRfZW5hYmxlX2ZsYWcpIHsKLQkJLyogRm9yIGZpcnN0IFdyaXRlIGRvbmUgbG9nIHRoZSB0aW1lIGFuZCByZXNldAotCQkgKiBvdXRfY29sZF9pbmRleAotCQkgKi8KLQkJaWYgKG91dF9jb2xkX2luZGV4ICE9IDEpIHsKLQkJCWRvX2dldHRpbWVvZmRheSgmb3V0X2NvbGRfdHYpOwotCQkJcHJfZGVidWcoIkNPTEQ6IGFwcl9zZW5kX3BrdCBhdCAlbGQgc2VjICVsZCBtaWNyb3NlY1xuIiwKLQkJCQlvdXRfY29sZF90di50dl9zZWMsCi0JCQkJb3V0X2NvbGRfdHYudHZfdXNlYyk7Ci0JCQlvdXRfY29sZF9pbmRleCA9IDE7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBvdXRfZW5hYmxlX2ZsYWcgJWxkXG4iLAotCQkJX19mdW5jX18sIG91dF9lbmFibGVfZmxhZyk7Ci0JfQotfQotc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX3JlYWRfY2Iodm9pZCkKLXsKLQlpZiAoaW5fZW5hYmxlX2ZsYWcpIHsKLQkJLyogd2hlbiBpbl9jb250X2luZGV4ID09IDcsIERTUCB3b3VsZCBiZQotCQkgKiB3cml0aW5nIGludG8gdGhlIDh0aCA1MTIgYnl0ZSBidWZmZXIgYW5kIHRoaXMKLQkJICogdGltZXN0YW1wIGlzIHRhcHBlZCBoZXJlLk9uY2UgZG9uZSBpdCB0aGVuIHdyaXRlcwotCQkgKiB0byA5dGggNTEyIGJ5dGUgYnVmZmVyLlRoZXNlIHR3byBidWZmZXJzKDh0aCwgOXRoKQotCQkgKiByZWFjaCB0aGUgdGVzdCBhcHBsaWNhdGlvbiBpbiA1dGggaXRlcmF0aW9uIGFuZCB0aGF0Ci0JCSAqIHRpbWVzdGFtcCBpcyB0YXBwZWQgYXQgdXNlciBsZXZlbC4gVGhlIGRpZmZlcmVuY2UKLQkJICogb2YgdGhlc2UgdHdvIHRpbWVzdGFtcHMgZ2l2ZXMgdXMgdGhlIHRpbWUgYmV0d2VlbgotCQkgKiB0aGUgdGltZSBhdCB3aGljaCBkc3Agc3RhcnRlZCBmaWxsaW5nIHRoZSBzYW1wbGUKLQkJICogcmVxdWlyZWQgYW5kIHdoZW4gaXQgcmVhY2hlZCB0aGUgdGVzdCBhcHBsaWNhdGlvbi4KLQkJICogSGVuY2UgY29udGludW91cyBpbnB1dCBsYXRlbmN5Ci0JCSAqLwotCQlpZiAoaW5fY29udF9pbmRleCA9PSA3KSB7Ci0JCQlkb19nZXR0aW1lb2ZkYXkoJmluX2NvbnRfdHYpOwotCQkJcHJfaW5mbygiJXM6IHJlYWQgYnVmZmVyIGF0ICVsZCBzZWMgJWxkIG1pY3Jvc2VjXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWluX2NvbnRfdHYudHZfc2VjLCBpbl9jb250X3R2LnR2X3VzZWMpOwotCQl9Ci0JCWluX2NvbnRfaW5kZXgrKzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19yZXNldF9pbmRleCh2b2lkKQotewotCWluX2NvbnRfaW5kZXggPSAwOwotfQotCi1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcnVuKHZvaWQpCi17Ci0JaWYgKG91dF9lbmFibGVfZmxhZykgewotCQlkb19nZXR0aW1lb2ZkYXkoJm91dF9jb2xkX3R2KTsKLQkJcHJfZGVidWcoIiVzOiBDT0xEIGFwcl9zZW5kX3BrdCBhdCAlbGQgc2VjICVsZCBtaWNyb3NlY1xuIiwKLQkJCV9fZnVuY19fLCBvdXRfY29sZF90di50dl9zZWMsIG91dF9jb2xkX3R2LnR2X3VzZWMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY29uZmlnX2RlYnVnX2ZzX3dyaXRlKHN0cnVjdCBhdWRpb19idWZmZXIgKmFiKQotewotCWlmIChvdXRfZW5hYmxlX2ZsYWcpIHsKLQkJY2hhciB6ZXJvX3BhdHRlcm5bMl0gPSB7MHgwMCwgMHgwMH07Ci0JCS8qIElmIEZpcnN0IHR3byBieXRlIGlzIG5vbiB6ZXJvIGFuZCBsYXN0IHR3byBieXRlCi0JCSAqIGlzIHplcm8gdGhlbiBpdCBpcyB3YXJtIG91dHB1dCBwYXR0ZXJuCi0JCSAqLwotCQlpZiAoKHN0cmNtcCgoKGNoYXIgKilhYi0+ZGF0YSksIHplcm9fcGF0dGVybikpICYmCi0JCSghc3RyY21wKCgoY2hhciAqKWFiLT5kYXRhICsgMiksIHplcm9fcGF0dGVybikpKSB7Ci0JCQlkb19nZXR0aW1lb2ZkYXkoJm91dF93YXJtX3R2KTsKLQkJCXByX2RlYnVnKCIlczogV0FSTTphcHJfc2VuZF9wa3QgYXQgJWxkIHNlYyAlbGQgbWljcm9zZWNcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgb3V0X3dhcm1fdHYudHZfc2VjLAotCQkJb3V0X3dhcm1fdHYudHZfdXNlYyk7Ci0JCQlwcl9kZWJ1ZygiJXM6IFdhcm0gUGF0dGVybiBNYXRjaGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQkJLyogSWYgRmlyc3QgdHdvIGJ5dGUgaXMgemVybyBhbmQgbGFzdCB0d28gYnl0ZSBpcwotCQkgKiBub24gemVybyB0aGVuIGl0IGlzIGNvbnQgb3V0cHV0IHBhdHRlcm4KLQkJICovCi0JCWVsc2UgaWYgKCghc3RyY21wKCgoY2hhciAqKWFiLT5kYXRhKSwgemVyb19wYXR0ZXJuKSkKLQkJJiYgKHN0cmNtcCgoKGNoYXIgKilhYi0+ZGF0YSArIDIpLCB6ZXJvX3BhdHRlcm4pKSkgewotCQkJZG9fZ2V0dGltZW9mZGF5KCZvdXRfY29udF90dik7Ci0JCQlwcl9kZWJ1ZygiJXM6IENPTlQ6YXByX3NlbmRfcGt0IGF0ICVsZCBzZWMgJWxkIG1pY3Jvc2VjXG4iLAotCQkJX19mdW5jX18sCi0JCQlvdXRfY29udF90di50dl9zZWMsCi0JCQlvdXRfY29udF90di50dl91c2VjKTsKLQkJCXByX2RlYnVnKCIlczogQ29udCBQYXR0ZXJuIE1hdGNoZWRcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLX0KLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCi17Ci0Jb3V0X2J1ZmZlciA9IGt6YWxsb2MoT1VUX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAob3V0X2J1ZmZlciA9PSBOVUxMKQotCQlnb3RvIG91dGJ1Zl9mYWlsOwotCi0JaW5fYnVmZmVyID0ga3phbGxvYyhJTl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGluX2J1ZmZlciA9PSBOVUxMKQotCQlnb3RvIGluYnVmX2ZhaWw7Ci0KLQlvdXRfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXVkaW9fb3V0X2xhdGVuY3lfbWVhc3VyZW1lbnRfbm9kZSIsCi0JCQkJMDY2NCwKLQkJCQlOVUxMLCBOVUxMLCAmYXVkaW9fb3V0cHV0X2xhdGVuY3lfZGVidWdfZm9wcyk7Ci0JaWYgKElTX0VSUihvdXRfZGVudHJ5KSkgewotCQlwcl9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZpbGVfZmFpbDsKLQl9Ci0JaW5fZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXVkaW9faW5fbGF0ZW5jeV9tZWFzdXJlbWVudF9ub2RlIiwKLQkJCQkwNjY0LAotCQkJCU5VTEwsIE5VTEwsICZhdWRpb19pbnB1dF9sYXRlbmN5X2RlYnVnX2ZvcHMpOwotCWlmIChJU19FUlIoaW5fZGVudHJ5KSkgewotCQlwcl9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZpbGVfZmFpbDsKLQl9Ci0JcmV0dXJuOwotZmlsZV9mYWlsOgotCWtmcmVlKGluX2J1ZmZlcik7Ci1pbmJ1Zl9mYWlsOgotCWtmcmVlKG91dF9idWZmZXIpOwotb3V0YnVmX2ZhaWw6Ci0JaW5fYnVmZmVyID0gTlVMTDsKLQlvdXRfYnVmZmVyID0gTlVMTDsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfd3JpdGUoc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIpCi17Ci19Ci1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcnVuKHZvaWQpCi17Ci19Ci1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfcmVzZXRfaW5kZXgodm9pZCkKLXsKLX0KLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19yZWFkX2NiKHZvaWQpCi17Ci19Ci1zdGF0aWMgdm9pZCBjb25maWdfZGVidWdfZnNfd3JpdGVfY2Iodm9pZCkKLXsKLX0KLXN0YXRpYyB2b2lkIGNvbmZpZ19kZWJ1Z19mc19pbml0KHZvaWQpCi17Ci19Ci0jZW5kaWYKLQotaW50IHE2YXNtX21tYXBfYXByX2RlcmVnKHZvaWQpCi17Ci0JaW50IGM7Ci0KLQljID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwgJnRoaXNfbW1hcC5yZWZfY250KTsKLQlpZiAoYyA9PSAwKSB7Ci0JCWFwcl9kZXJlZ2lzdGVyKHRoaXNfbW1hcC5hcHIpOwotCQljb21tb25fY2xpZW50Lm1tYXBfYXByID0gTlVMTDsKLQkJcHJfZGVidWcoIiVzOiBBUFIgRGUtUmVnaXN0ZXIgY29tbW9uIHBvcnRcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgaWYgKGMgPCAwKSB7Ci0JCXByX2VycigiJXM6IEFQUiBDb21tb24gUG9ydCBBbHJlYWR5IENsb3NlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBjKTsKLQkJYXRvbWljX3NldCgmdGhpc19tbWFwLnJlZl9jbnQsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHE2YXNtX3Nlc3Npb25fYWxsb2Moc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IG47Ci0KLQlmb3IgKG4gPSAxOyBuIDw9IEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEOyBuKyspIHsKLQkJaWYgKCFzZXNzaW9uW25dKSB7Ci0JCQlzZXNzaW9uW25dID0gYWM7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCX0KLQlwcl9lcnIoIiVzOiBzZXNzaW9uIG5vdCBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIGJvb2wgcTZhc21faXNfdmFsaWRfYXVkaW9fY2xpZW50KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCWludCBuOwotCi0JZm9yIChuID0gMTsgbiA8PSBBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRDsgbisrKSB7Ci0JCWlmIChzZXNzaW9uW25dID09IGFjKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBxNmFzbV9zZXNzaW9uX2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uaWRbJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCXJ0YWNfcmVtb3ZlX3BvcHBfZnJvbV9hZG1fZGV2aWNlcyhhYy0+c2Vzc2lvbik7Ci0Jc2Vzc2lvblthYy0+c2Vzc2lvbl0gPSAwOwotCWFjLT5zZXNzaW9uID0gMDsKLQlhYy0+cGVyZl9tb2RlID0gTEVHQUNZX1BDTV9NT0RFOwotCWFjLT5mcHRyX2NhY2hlX29wcyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBxNmFzbV9nZXRfbmV4dF9idWYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IGN1cnJfYnVmLCB1aW50MzJfdCBtYXhfYnVmX2NudCkKLXsKLQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IGN1cnJfYnVmID0gJWQsIG1heF9idWZfY250ID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgY3Vycl9idWYsIG1heF9idWZfY250KTsKLQljdXJyX2J1ZiArPSAxOwotCXJldHVybiAoY3Vycl9idWYgPj0gbWF4X2J1Zl9jbnQpID8gMCA6IGN1cnJfYnVmOwotfQotCi1zdGF0aWMgaW50IHE2YXNtX21hcF9jYWxfbWVtb3J5KGludDMyX3QgY2FsX3R5cGUsCi0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2spCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0KLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIGFkZHJlc3MgdG8gbWFwIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWNvbW1vbl9jbGllbnQubW1hcF9hcHIgPSBxNmFzbV9tbWFwX2Fwcl9yZWcoKTsKLQlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHE2YXNtX21tYXBfYXByX3JlZyBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FUEVSTTsKLQkJZ290byBkb25lOwotCX0KLQljb21tb25fY2xpZW50LmFwciA9IGNvbW1vbl9jbGllbnQubW1hcF9hcHI7Ci0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IG1hcCBzaXplIGlzIDAhXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogVXNlIHNlY29uZCBhc20gYnVmIHRvIG1hcCBtZW1vcnkgKi8KLQlpZiAoY29tbW9uX2NsaWVudC5wb3J0W0lOXS5idWYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjb21tb24gYnVmIGlzIE5VTExcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljb21tb25fY2xpZW50LnBvcnRbSU5dLmJ1Zi0+cGh5cyA9IGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHI7Ci0KLQlyZXN1bHQgPSBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoJmNvbW1vbl9jbGllbnQsCi0JCQlJTiwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgMSwgMSk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlemQgcmVzdWx0ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplLCByZXN1bHQpOwotCQlwcl9kZWJ1ZygiJXM6IG1tYXAgZGlkIG5vdCB3b3JrISBhZGRyID0gMHglcEssIHNpemUgPSAlemRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmY29tbW9uX2NsaWVudC5wb3J0W0lOXS5tZW1fbWFwX2hhbmRsZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAotCQkJCQlsaXN0KTsKLQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpIHsKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gIGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHJlbWFwX2NhbF9kYXRhKGludDMyX3QgY2FsX3R5cGUsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE5vIElPTiBhbGxvY2F0aW9uIGZvciBjYWwgdHlwZSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKLQkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApKSB7Ci0KLQkJcmV0ID0gcTZhc21fbWFwX2NhbF9tZW1vcnkoY2FsX3R5cGUsIGNhbF9ibG9jayk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBtbWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fdW5tYXBfY2FsX21lbW9yeShpbnQzMl90IGNhbF90eXBlLAotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0JaW50CQkJcmVzdWx0MiA9IDA7Ci0KLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsX2Jsb2NrIGlzIE5VTEwhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBObyBhZGRyZXNzIHRvIHVubWFwIVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb21tb25fY2xpZW50Lm1tYXBfYXByID09IE5VTEwpIHsKLQkJY29tbW9uX2NsaWVudC5tbWFwX2FwciA9IHE2YXNtX21tYXBfYXByX3JlZygpOwotCQlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBxNmFzbV9tbWFwX2Fwcl9yZWcgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJlc3VsdCA9IC1FUEVSTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCXJlc3VsdDIgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwgSU4pOwotCWlmIChyZXN1bHQyIDwgMCkgewotCQlwcl9lcnIoIiVzOiB1bm1hcCBmYWlsZWQsIGVyciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXN1bHQyKTsKLQkJcmVzdWx0ID0gcmVzdWx0MjsKLQl9Ci0KLQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9IDA7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBxNmFzbV91bm1hcF9jYWxfZGF0YShpbnQgY2FsX3R5cGUsIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKChjYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplID4gMCkgJiYKLQkJKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlICE9IDApKSB7Ci0KLQkJcmV0ID0gcTZhc21fdW5tYXBfY2FsX21lbW9yeShjYWxfdHlwZSwgY2FsX2Jsb2NrKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IHVubWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZCByZXQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBzZW5kX2FzbV9jdXN0b21fdG9wb2xvZ3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhCQkqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgY21kX3NldF90b3BvbG9naWVzCWFzbV90b3A7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHJlc3VsdDEgPSAwOwotCi0JaWYgKGNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0gPT0gTlVMTCkKLQkJZ290byBkb25lOwotCi0JbXV0ZXhfbG9jaygmY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7Ci0JaWYgKCFzZXRfY3VzdG9tX3RvcG9sb2d5KQotCQlnb3RvIHVubG9jazsKLQlzZXRfY3VzdG9tX3RvcG9sb2d5ID0gMDsKLQotCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXSk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIHVubG9jazsKLQotCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIGNhbCB0byBzZW5kIVxuIiwgX19mdW5jX18pOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgY2FsX2luZGV4ICVkXG4iLCBfX2Z1bmNfXywgQVNNX0NVU1RPTV9UT1BfQ0FMKTsKLQotCXJlc3VsdCA9IHJlbWFwX2NhbF9kYXRhKEFTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLCBjYWxfYmxvY2spOwotCWlmIChyZXN1bHQpIHsKLQkJcHJfZXJyKCIlczogUmVtYXBfY2FsX2RhdGEgZmFpbGVkIGZvciBjYWwgJWQhXG4iLAotCQkJX19mdW5jX18sIEFTTV9DVVNUT01fVE9QX0NBTCk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCXE2YXNtX2FkZF9oZHJfY3VzdG9tX3RvcG9sb2d5KGFjLCAmYXNtX3RvcC5oZHIsIHNpemVvZihhc21fdG9wKSk7Ci0JYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOwotCWFzbV90b3AuaGRyLm9wY29kZSA9IEFTTV9DTURfQUREX1RPUE9MT0dJRVM7Ci0JYXNtX3RvcC5wYXlsb2FkX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlhc21fdG9wLnBheWxvYWRfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCWFzbV90b3AubWVtX21hcF9oYW5kbGUgPSBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZTsKLQlhc21fdG9wLnBheWxvYWRfc2l6ZSA9IGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKLQotCSBwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgQVNNX0NNRF9BRERfVE9QT0xPR0lFUyBwYXlsb2FkID0gJXBLLCBzaXplID0gJWQsIG1hcCBoYW5kbGUgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCWFzbV90b3AucGF5bG9hZF9zaXplLCBhc21fdG9wLm1lbV9tYXBfaGFuZGxlKTsKLQotCXJlc3VsdCA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmFzbV90b3ApOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByX2VycigiJXM6IFNldCB0b3BvbG9naWVzIGZhaWxlZCByZXN1bHQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKLQkJcHJfZGVidWcoIiVzOiBTZXQgdG9wb2xvZ2llcyBmYWlsZWQgcGF5bG9hZCA9IDB4JXBLXG4iLAotCQkJX19mdW5jX18sICZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQkJZ290byB1bm1hcDsKLQotCX0KLQotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+bWVtX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBTZXQgdG9wb2xvZ2llcyBmYWlsZWQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlwcl9kZWJ1ZygiJXM6IFNldCB0b3BvbG9naWVzIGZhaWxlZCBhZnRlciB0aW1lZG91dCBwYXlsb2FkID0gMHglcEtcbiIsCi0JCQlfX2Z1bmNfXywgJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCQlyZXN1bHQgPSAtRVRJTUVET1VUOwotCQlnb3RvIHVubWFwOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7Ci0JCXJlc3VsdCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpOwotCQlnb3RvIHVubWFwOwotCX0KLQotdW5tYXA6Ci0JcmVzdWx0MSA9IHE2YXNtX3VubWFwX2NhbF9tZW1vcnkoQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEUsCi0JCWNhbF9ibG9jayk7Ci0JaWYgKHJlc3VsdDEgPCAwKSB7Ci0JCXJlc3VsdCA9IHJlc3VsdDE7Ci0JCXByX2RlYnVnKCIlczogdW5tYXAgY2FsIGZhaWxlZCEgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwotCX0KLXVubG9jazoKLQltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcTZhc21fbWFwX3J0YWNfYmxvY2soc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfYmxvY2sgaXMgTlVMTCFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogTm8gYWRkcmVzcyB0byBtYXAhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvbW1vbl9jbGllbnQubW1hcF9hcHIgPT0gTlVMTCkgewotCQljb21tb25fY2xpZW50Lm1tYXBfYXByID0gcTZhc21fbW1hcF9hcHJfcmVnKCk7Ci0JCWlmIChjb21tb25fY2xpZW50Lm1tYXBfYXByID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IHE2YXNtX21tYXBfYXByX3JlZyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmVzdWx0ID0gLUVQRVJNOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IG1hcCBzaXplIGlzIDAhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogVXNlIHNlY29uZCBhc20gYnVmIHRvIG1hcCBtZW1vcnkgKi8KLQlpZiAoY29tbW9uX2NsaWVudC5wb3J0W09VVF0uYnVmID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY29tbW9uIGJ1ZiBpcyBOVUxMXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY29tbW9uX2NsaWVudC5wb3J0W09VVF0uYnVmLT5waHlzID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcjsKLQotCXJlc3VsdCA9IHE2YXNtX21lbW9yeV9tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwKLQkJCU9VVCwgY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgMSwgMSk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogbW1hcCBkaWQgbm90IHdvcmshIHNpemUgPSAlZCByZXN1bHQgJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsIHJlc3VsdCk7Ci0JCXByX2RlYnVnKCIlczogbW1hcCBkaWQgbm90IHdvcmshIGFkZHIgPSAweCVwSywgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQkmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwKLQkJJmNvbW1vbl9jbGllbnQucG9ydFtPVVRdLm1lbV9tYXBfaGFuZGxlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCi0JCQkJCWxpc3QpOwotCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcikgewotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfaGFuZGxlID0gIGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcTZhc21fdW5tYXBfcnRhY19ibG9jayh1aW50MzJfdCAqbWVtX21hcF9oYW5kbGUpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHJlc3VsdDIgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKG1lbV9tYXBfaGFuZGxlID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoKm1lbV9tYXBfaGFuZGxlID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIDAsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29tbW9uX2NsaWVudC5tbWFwX2FwciA9PSBOVUxMKSB7Ci0JCWNvbW1vbl9jbGllbnQubW1hcF9hcHIgPSBxNmFzbV9tbWFwX2Fwcl9yZWcoKTsKLQkJaWYgKGNvbW1vbl9jbGllbnQubW1hcF9hcHIgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogcTZhc21fbW1hcF9hcHJfcmVnIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXN1bHQgPSAtRVBFUk07Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQotCXJlc3VsdDIgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucygmY29tbW9uX2NsaWVudCwgT1VUKTsKLQlpZiAocmVzdWx0MiA8IDApIHsKLQkJcHJfZXJyKCIlczogdW5tYXAgZmFpbGVkLCBlcnIgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0Mik7Ci0JCXJlc3VsdCA9IHJlc3VsdDI7Ci0JfSBlbHNlIHsKLQkJbWVtX21hcF9oYW5kbGUgPSAwOwotCX0KLQotCXJlc3VsdDIgPSBxNmFzbV9tbWFwX2Fwcl9kZXJlZygpOwotCWlmIChyZXN1bHQyIDwgMCkgewotCQlwcl9lcnIoIiVzOiBxNmFzbV9tbWFwX2Fwcl9kZXJlZyBmYWlsZWQsIGVyciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXN1bHQyKTsKLQkJcmVzdWx0ID0gcmVzdWx0MjsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWUodW5zaWduZWQgaW50IGRpciwKLQkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0JaW50IGNudCA9IDA7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogU2Vzc2lvbiBpZCAlZFxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07Ci0JCWlmICghcG9ydC0+YnVmKSB7Ci0JCQlwcl9lcnIoIiVzOiBidWYgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY250ID0gcG9ydC0+bWF4X2J1Zl9jbnQgLSAxOwotCi0JCWlmIChjbnQgPj0gMCkgewotCQkJcmMgPSBxNmFzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhhYywgZGlyKTsKLQkJCWlmIChyYyA8IDApCi0JCQkJcHJfZXJyKCIlczogTWVtb3J5X3VubWFwX3JlZ2lvbnMgZmFpbGVkICVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXywgcmMpOwotCQl9Ci0KLQkJd2hpbGUgKGNudCA+PSAwKSB7Ci0JCQlpZiAocG9ydC0+YnVmW2NudF0uZGF0YSkgewotCQkJCWlmICghcmMgfHwgYXRvbWljX3JlYWQoJmFjLT5yZXNldCkpCi0JCQkJCW1zbV9hdWRpb19pb25fZnJlZSgKLQkJCQkJCXBvcnQtPmJ1ZltjbnRdLmNsaWVudCwKLQkJCQkJCXBvcnQtPmJ1ZltjbnRdLmhhbmRsZSk7Ci0KLQkJCQlwb3J0LT5idWZbY250XS5jbGllbnQgPSBOVUxMOwotCQkJCXBvcnQtPmJ1ZltjbnRdLmhhbmRsZSA9IE5VTEw7Ci0JCQkJcG9ydC0+YnVmW2NudF0uZGF0YSA9IE5VTEw7Ci0JCQkJcG9ydC0+YnVmW2NudF0ucGh5cyA9IDA7Ci0JCQkJLS0ocG9ydC0+bWF4X2J1Zl9jbnQpOwotCQkJfQotCQkJLS1jbnQ7Ci0JCX0KLQkJa2ZyZWUocG9ydC0+YnVmKTsKLQkJcG9ydC0+YnVmID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXModW5zaWduZWQgaW50IGRpciwKLQkJCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0JaW50IGNudCA9IDA7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogU2Vzc2lvbiBpZCAlZFxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKLQlpZiAoIXBvcnQtPmJ1ZikgewotCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQljbnQgPSBwb3J0LT5tYXhfYnVmX2NudCAtIDE7Ci0KLQlpZiAoY250ID49IDApIHsKLQkJcmMgPSBxNmFzbV9tZW1vcnlfdW5tYXAoYWMsIHBvcnQtPmJ1ZlswXS5waHlzLCBkaXIpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlczogTWVtb3J5X3VubWFwX3JlZ2lvbnMgZmFpbGVkICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCByYyk7Ci0JfQotCi0JaWYgKHBvcnQtPmJ1ZlswXS5kYXRhKSB7Ci0JCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS10gLCBjbGllbnRbJXBLXSBoYW5kbGVbJXBLXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJcG9ydC0+YnVmWzBdLmRhdGEsCi0JCQkmcG9ydC0+YnVmWzBdLnBoeXMsCi0JCQkmcG9ydC0+YnVmWzBdLnBoeXMsCi0JCQlwb3J0LT5idWZbMF0uY2xpZW50LAotCQkJcG9ydC0+YnVmWzBdLmhhbmRsZSk7Ci0JCWlmICghcmMgfHwgYXRvbWljX3JlYWQoJmFjLT5yZXNldCkpCi0JCQltc21fYXVkaW9faW9uX2ZyZWUocG9ydC0+YnVmWzBdLmNsaWVudCwKLQkJCQkJICAgcG9ydC0+YnVmWzBdLmhhbmRsZSk7Ci0JCXBvcnQtPmJ1ZlswXS5jbGllbnQgPSBOVUxMOwotCQlwb3J0LT5idWZbMF0uaGFuZGxlID0gTlVMTDsKLQl9Ci0KLQl3aGlsZSAoY250ID49IDApIHsKLQkJcG9ydC0+YnVmW2NudF0uZGF0YSA9IE5VTEw7Ci0JCXBvcnQtPmJ1ZltjbnRdLnBoeXMgPSAwOwotCQljbnQtLTsKLQl9Ci0JcG9ydC0+bWF4X2J1Zl9jbnQgPSAwOwotCWtmcmVlKHBvcnQtPmJ1Zik7Ci0JcG9ydC0+YnVmID0gTlVMTDsKLQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcTZhc21fYXVkaW9fY2xpZW50X2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IGxvb3BjbnQ7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYWMgJXBLXG4iLCBfX2Z1bmNfXywgYWMpOwotCQlyZXR1cm47Ci0JfQotCWlmICghYWMtPnNlc3Npb24pIHsKLQkJcHJfZXJyKCIlczogYWMgc2Vzc2lvbiBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltdXRleF9sb2NrKCZzZXNzaW9uX2xvY2spOwotCi0JcHJfZGVidWcoIiVzOiBTZXNzaW9uIGlkICVkXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlmb3IgKGxvb3BjbnQgPSAwOyBsb29wY250IDw9IE9VVDsgbG9vcGNudCsrKSB7Ci0JCQlwb3J0ID0gJmFjLT5wb3J0W2xvb3BjbnRdOwotCQkJaWYgKCFwb3J0LT5idWYpCi0JCQkJY29udGludWU7Ci0JCQlwcl9kZWJ1ZygiJXM6IGxvb3BjbnQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgbG9vcGNudCk7Ci0JCQlxNmFzbV9hdWRpb19jbGllbnRfYnVmX2ZyZWUobG9vcGNudCwgYWMpOwotCQl9Ci0JfQotCi0JcnRhY19zZXRfYXNtX2hhbmRsZShhYy0+c2Vzc2lvbiwgTlVMTCk7Ci0JYXByX2RlcmVnaXN0ZXIoYWMtPmFwcjIpOwotCWFwcl9kZXJlZ2lzdGVyKGFjLT5hcHIpOwotCXE2YXNtX21tYXBfYXByX2RlcmVnKCk7Ci0JYWMtPmFwcjIgPSBOVUxMOwotCWFjLT5hcHIgPSBOVUxMOwotCWFjLT5tbWFwX2FwciA9IE5VTEw7Ci0JcTZhc21fc2Vzc2lvbl9mcmVlKGFjKTsKLQotCXByX2RlYnVnKCIlczogQVBSIERlLVJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLS8qZG9uZToqLwotCWtmcmVlKGFjKTsKLQlhYyA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZzZXNzaW9uX2xvY2spOwotfQotCi1pbnQgcTZhc21fc2V0X2lvX21vZGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IG1vZGUxKQotewotCXVpbnQzMl90IG1vZGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYWMtPmlvX21vZGUgJj0gMHhGRjAwOwotCW1vZGUgPSAobW9kZTEgJiAweEYpOwotCi0JcHJfZGVidWcoIiVzOiBhYy0+bW9kZSBhZnRlciBhbmRpbmcgd2l0aCBGRjAwOjB4JXgsXG4iLAotCQlfX2Z1bmNfXywgYWMtPmlvX21vZGUpOwotCi0JaWYgKChtb2RlID09IEFTWU5DX0lPX01PREUpIHx8IChtb2RlID09IFNZTkNfSU9fTU9ERSkpIHsKLQkJYWMtPmlvX21vZGUgfD0gbW9kZTE7Ci0JCXByX2RlYnVnKCIlczogU2V0IE1vZGUgdG8gMHgleFxuIiwgX19mdW5jX18sIGFjLT5pb19tb2RlKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBOb3QgYW4gdmFsaWQgSU8gTW9kZTolZFxuIiwgX19mdW5jX18sIGFjLT5pb19tb2RlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkICpxNmFzbV9tbWFwX2Fwcl9yZWcodm9pZCkKLXsKLQlpZiAoKGF0b21pY19yZWFkKCZ0aGlzX21tYXAucmVmX2NudCkgPT0gMCkgfHwKLQkgICAgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkpIHsKLQkJdGhpc19tbWFwLmFwciA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBU00iLAotCQkJCQkoYXByX2ZuKXE2YXNtX3NydmNfY2FsbGJhY2ssCi0JCQkJCTB4MEZGRkZGRkZGLCAmdGhpc19tbWFwKTsKLQkJaWYgKHRoaXNfbW1hcC5hcHIgPT0gTlVMTCkgewotCQkJcHJfZGVidWcoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQVBSIEFTTSBjb21tb24gcG9ydFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0JYXRvbWljX2luYygmdGhpc19tbWFwLnJlZl9jbnQpOwotCi0JcmV0dXJuIHRoaXNfbW1hcC5hcHI7Ci1mYWlsOgotCXJldHVybiBOVUxMOwotfQotCi1pbnQgcTZhc21fc2VuZF9zdHJlYW1fY21kKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICBzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqZGF0YSkKLXsKLQljaGFyICphc21fcGFyYW1zID0gTlVMTDsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JaW50IHN6LCByYzsKLQotCWlmICghZGF0YSB8fCAhYWMpIHsKLQkJcHJfZXJyKCIlczogJXMgaXMgTlVMTFxuIiwgX19mdW5jX18sCi0JCQkoIWRhdGEpID8gImRhdGEiIDogImFjIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChkYXRhLT5ldmVudF90eXBlID49IEFSUkFZX1NJWkUoYWRzcF9yZWdfZXZlbnRfb3Bjb2RlKSkgewotCQlwcl9lcnIoIiVzOiBldmVudCAldSBvdXQgb2YgYm91bmRhcnkgb2YgYXJyYXkgc2l6ZSBvZiAoJWx1KVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBkYXRhLT5ldmVudF90eXBlLAotCQkgICAgICAgKGxvbmcpQVJSQVlfU0laRShhZHNwX3JlZ19ldmVudF9vcGNvZGUpKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsgZGF0YS0+cGF5bG9hZF9sZW47Ci0JYXNtX3BhcmFtcyA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOwotCWlmICghYXNtX3BhcmFtcykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmaGRyLCBzeiwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZV9wcCwgLTEpOwotCWhkci5vcGNvZGUgPSBhZHNwX3JlZ19ldmVudF9vcGNvZGVbZGF0YS0+ZXZlbnRfdHlwZV07Ci0JbWVtY3B5KGFzbV9wYXJhbXMsICZoZHIsIHNpemVvZihzdHJ1Y3QgYXByX2hkcikpOwotCW1lbWNweShhc21fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSwKLQkJZGF0YS0+cGF5bG9hZCwgZGF0YS0+cGF5bG9hZF9sZW4pOwotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSBhc21fcGFyYW1zKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHN0cmVhbSBldmVudCBjbWQgYXByIHBrdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfc2VuZF9wYXJhbTsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSA+PSAwKSwgMSAqIEhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQgZm9yIHN0cmVhbSBldmVudCBjbWQgcmVzcFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9zZW5kX3BhcmFtOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gZm9yIHN0cmVhbSBldmVudCBjbWRcbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKTsKLQkJZ290byBmYWlsX3NlbmRfcGFyYW07Ci0JfQotCi0JcmMgPSAwOwotZmFpbF9zZW5kX3BhcmFtOgotCWtmcmVlKGFzbV9wYXJhbXMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0cnVjdCBhdWRpb19jbGllbnQgKnE2YXNtX2F1ZGlvX2NsaWVudF9hbGxvYyhhcHBfY2IgY2IsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGF1ZGlvX2NsaWVudCAqYWM7Ci0JaW50IG47Ci0JaW50IGxjbnQgPSAwOwotCWludCByYyA9IDA7Ci0KLQlhYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFjKQotCQlyZXR1cm4gTlVMTDsKLQotCW11dGV4X2xvY2soJnNlc3Npb25fbG9jayk7Ci0JbiA9IHE2YXNtX3Nlc3Npb25fYWxsb2MoYWMpOwotCWlmIChuIDw9IDApIHsKLQkJcHJfZXJyKCIlczogQVNNIFNlc3Npb24gYWxsb2MgZmFpbCBuPSVkXG4iLCBfX2Z1bmNfXywgbik7Ci0JCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJZ290byBmYWlsX3Nlc3Npb247Ci0JfQotCWFjLT5zZXNzaW9uID0gbjsKLQlhYy0+Y2IgPSBjYjsKLQlhYy0+cGF0aF9kZWxheSA9IFVJTlRfTUFYOwotCWFjLT5wcml2ID0gcHJpdjsKLQlhYy0+aW9fbW9kZSA9IFNZTkNfSU9fTU9ERTsKLQlhYy0+cGVyZl9tb2RlID0gTEVHQUNZX1BDTV9NT0RFOwotCWFjLT5mcHRyX2NhY2hlX29wcyA9IE5VTEw7Ci0JLyogRFNQIGV4cGVjdHMgc3RyZWFtIGlkIGZyb20gMSAqLwotCWFjLT5zdHJlYW1faWQgPSAxOwotCWFjLT5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQVNNIiwKLQkJCShhcHJfZm4pcTZhc21fY2FsbGJhY2ssCi0JCQkoKGFjLT5zZXNzaW9uKSA8PCA4IHwgMHgwMDAxKSwKLQkJCWFjKTsKLQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogUmVnaXN0cmF0aW9uIHdpdGggQVBSIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJnNlc3Npb25fbG9jayk7Ci0JCWdvdG8gZmFpbF9hcHIxOwotCX0KLQlhYy0+YXByMiA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJBU00iLAotCQkJKGFwcl9mbilxNmFzbV9jYWxsYmFjaywKLQkJCSgoYWMtPnNlc3Npb24pIDw8IDggfCAweDAwMDIpLAotCQkJYWMpOwotCi0JaWYgKGFjLT5hcHIyID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogUmVnaXN0cmF0aW9uIHdpdGggQVBSLTIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJZ290byBmYWlsX2FwcjI7Ci0JfQotCi0JcnRhY19zZXRfYXNtX2hhbmRsZShuLCBhYy0+YXByKTsKLQotCXByX2RlYnVnKCIlczogUmVnaXN0ZXJpbmcgdGhlIGNvbW1vbiBwb3J0IHdpdGggQVBSXG4iLCBfX2Z1bmNfXyk7Ci0JYWMtPm1tYXBfYXByID0gcTZhc21fbW1hcF9hcHJfcmVnKCk7Ci0JaWYgKGFjLT5tbWFwX2FwciA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJZ290byBmYWlsX21tYXA7Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmYWMtPmNtZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhYy0+dGltZV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhYy0+bWVtX3dhaXQpOwotCWF0b21pY19zZXQoJmFjLT50aW1lX2ZsYWcsIDEpOwotCWF0b21pY19zZXQoJmFjLT5yZXNldCwgMCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFjLT5wb3J0WzBdLm1lbV9tYXBfaGFuZGxlKTsKLQlJTklUX0xJU1RfSEVBRCgmYWMtPnBvcnRbMV0ubWVtX21hcF9oYW5kbGUpOwotCXByX2RlYnVnKCIlczogbWVtX21hcF9oYW5kbGUgbGlzdCBpbml0J2VkXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfaW5pdCgmYWMtPmNtZF9sb2NrKTsKLQlmb3IgKGxjbnQgPSAwOyBsY250IDw9IE9VVDsgbGNudCsrKSB7Ci0JCW11dGV4X2luaXQoJmFjLT5wb3J0W2xjbnRdLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmYWMtPnBvcnRbbGNudF0uZHNwX2xvY2spOwotCX0KLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAwKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCAwKTsKLQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAwKTsKLQotCXJjID0gc2VuZF9hc21fY3VzdG9tX3RvcG9sb2d5KGFjKTsKLQlpZiAocmMgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQkJZ290byBmYWlsX21tYXA7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQotCW11dGV4X3VubG9jaygmc2Vzc2lvbl9sb2NrKTsKLQotCXJldHVybiBhYzsKLWZhaWxfbW1hcDoKLQlhcHJfZGVyZWdpc3RlcihhYy0+YXByMik7Ci1mYWlsX2FwcjI6Ci0JYXByX2RlcmVnaXN0ZXIoYWMtPmFwcik7Ci1mYWlsX2FwcjE6Ci0JcTZhc21fc2Vzc2lvbl9mcmVlKGFjKTsKLWZhaWxfc2Vzc2lvbjoKLQlrZnJlZShhYyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0cnVjdCBhdWRpb19jbGllbnQgKnE2YXNtX2dldF9hdWRpb19jbGllbnQoaW50IHNlc3Npb25faWQpCi17Ci0JaWYgKHNlc3Npb25faWQgPT0gQVNNX0NPTlRST0xfU0VTU0lPTikKLQkJcmV0dXJuICZjb21tb25fY2xpZW50OwotCi0JaWYgKChzZXNzaW9uX2lkIDw9IDApIHx8IChzZXNzaW9uX2lkID4gQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQpKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbjogJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKCFzZXNzaW9uW3Nlc3Npb25faWRdKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb24gbm90IGFjdGl2ZTogJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJZ290byBlcnI7Ci0JfQotCXJldHVybiBzZXNzaW9uW3Nlc3Npb25faWRdOwotZXJyOgotCXJldHVybiBOVUxMOwotfQotCi1pbnQgcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1bnNpZ25lZCBpbnQgYnVmc3osCi0JCQl1aW50MzJfdCBidWZjbnQpCi17Ci0JaW50IGNudCA9IDA7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWY7Ci0Jc2l6ZV90IGxlbjsKLQotCWlmICghKGFjKSB8fCAhKGJ1ZnN6KSB8fCAoKGRpciAhPSBJTikgJiYgKGRpciAhPSBPVVQpKSkgewotCQlwcl9lcnIoIiVzOiBhYyAlcEsgYnVmc3ogJWQgZGlyICVkXG4iLCBfX2Z1bmNfXywgYWMsIGJ1ZnN6LAotCQkJZGlyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWJ1ZnN6WyVkXWJ1ZmNudFslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJYnVmc3osIGJ1ZmNudCk7Ci0KLQlpZiAoYWMtPnNlc3Npb24gPD0gMCB8fCBhYy0+c2Vzc2lvbiA+IDgpIHsKLQkJcHJfZXJyKCIlczogU2Vzc2lvbiBJRCBpcyBpbnZhbGlkLCBzZXNzaW9uID0gJWRcbiIsIF9fZnVuY19fLAotCQkJYWMtPnNlc3Npb24pOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKGFjLT5pb19tb2RlICYgU1lOQ19JT19NT0RFKSB7Ci0JCWlmIChhYy0+cG9ydFtkaXJdLmJ1ZikgewotCQkJcHJfZGVidWcoIiVzOiBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7Ci0JCWlmIChidWZjbnQgPiAoVTMyX01BWC9zaXplb2Yoc3RydWN0IGF1ZGlvX2J1ZmZlcikpKSB7Ci0JCQlwcl9lcnIoIiVzOiBCdWZmZXIgc2l6ZSBvdmVyZmxvd3MiLCBfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJYnVmID0ga3phbGxvYygoKHNpemVvZihzdHJ1Y3QgYXVkaW9fYnVmZmVyKSkqYnVmY250KSwKLQkJCQlHRlBfS0VSTkVMKTsKLQotCQlpZiAoIWJ1ZikgewotCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYWMtPnBvcnRbZGlyXS5idWYgPSBidWY7Ci0KLQkJd2hpbGUgKGNudCA8IGJ1ZmNudCkgewotCQkJaWYgKGJ1ZnN6ID4gMCkgewotCQkJCWlmICghYnVmW2NudF0uZGF0YSkgewotCQkJCQlyYyA9IG1zbV9hdWRpb19pb25fYWxsb2MoImFzbV9jbGllbnQiLAotCQkJCQkmYnVmW2NudF0uY2xpZW50LCAmYnVmW2NudF0uaGFuZGxlLAotCQkJCQkgICAgICBidWZzeiwKLQkJCQkJICAgICAgKGlvbl9waHlzX2FkZHJfdCAqKSZidWZbY250XS5waHlzLAotCQkJCQkgICAgICAmbGVuLAotCQkJCQkgICAgICAmYnVmW2NudF0uZGF0YSk7Ci0JCQkJCWlmIChyYykgewotCQkJCQkJcHJfZXJyKCIlczogSU9OIEdldCBQaHlzaWNhbCBmb3IgQVVESU8gZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCByYyk7Ci0JCQkJCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JCQkJCWdvdG8gZmFpbDsKLQkJCQkJfQotCi0JCQkJCWJ1ZltjbnRdLnVzZWQgPSAxOwotCQkJCQlidWZbY250XS5zaXplID0gYnVmc3o7Ci0JCQkJCWJ1ZltjbnRdLmFjdHVhbF9zaXplID0gYnVmc3o7Ci0JCQkJCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS11cbiIsCi0JCQkJCQlfX2Z1bmNfXywKLQkJCQkJICAgYnVmW2NudF0uZGF0YSwKLQkJCQkJICAgJmJ1ZltjbnRdLnBoeXMsCi0JCQkJCSAgICZidWZbY250XS5waHlzKTsKLQkJCQkJY250Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFjLT5wb3J0W2Rpcl0ubWF4X2J1Zl9jbnQgPSBjbnQ7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQlyYyA9IHE2YXNtX21lbW9yeV9tYXBfcmVnaW9ucyhhYywgZGlyLCBidWZzeiwgY250LCAwKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogQ01EIE1lbW9yeV9tYXBfcmVnaW9ucyBmYWlsZWQgJWQgZm9yIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjLCBidWZzeik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXE2YXNtX2F1ZGlvX2NsaWVudF9idWZfZnJlZShkaXIsIGFjKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IHE2YXNtX2F1ZGlvX2NsaWVudF9idWZfYWxsb2NfY29udGlndW91cyh1bnNpZ25lZCBpbnQgZGlyLAotCQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1bnNpZ25lZCBpbnQgYnVmc3osCi0JCQl1bnNpZ25lZCBpbnQgYnVmY250KQotewotCWludCBjbnQgPSAwOwotCWludCByYyA9IDA7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYnVmOwotCXNpemVfdCBsZW47Ci0JaW50IGJ5dGVzX3RvX2FsbG9jOwotCi0JaWYgKCEoYWMpIHx8ICgoZGlyICE9IElOKSAmJiAoZGlyICE9IE9VVCkpKSB7Ci0JCXByX2VycigiJXM6IGFjICVwSyBkaXIgJWRcbiIsIF9fZnVuY19fLCBhYywgZGlyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWJ1ZnN6WyVkXWJ1ZmNudFslZF1cbiIsCi0JCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sCi0JCQlidWZzeiwgYnVmY250KTsKLQotCWlmIChhYy0+c2Vzc2lvbiA8PSAwIHx8IGFjLT5zZXNzaW9uID4gOCkgewotCQlwcl9lcnIoIiVzOiBTZXNzaW9uIElEIGlzIGludmFsaWQsIHNlc3Npb24gPSAlZFxuIiwgX19mdW5jX18sCi0JCQlhYy0+c2Vzc2lvbik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoYWMtPnBvcnRbZGlyXS5idWYpIHsKLQkJcHJfZXJyKCIlczogYnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCWJ1ZiA9IGt6YWxsb2MoKChzaXplb2Yoc3RydWN0IGF1ZGlvX2J1ZmZlcikpKmJ1ZmNudCksCi0JCQlHRlBfS0VSTkVMKTsKLQotCWlmICghYnVmKSB7Ci0JCXByX2VycigiJXM6IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlhYy0+cG9ydFtkaXJdLmJ1ZiA9IGJ1ZjsKLQotCS8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCi0JaWYgKChidWZjbnQgPiAwKSAmJiAoKElOVF9NQVggLyBidWZjbnQpIDwgYnVmc3opKSB7Ci0JCXByX2VycigiJXM6IGludGVnZXIgb3ZlcmZsb3dcbiIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQlnb3RvIGZhaWw7Ci0JfQotCWJ5dGVzX3RvX2FsbG9jID0gYnVmc3ogKiBidWZjbnQ7Ci0KLQkvKiBUaGUgc2l6ZSB0byBhbGxvY2F0ZSBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNEsgYnl0ZXMgKi8KLQlieXRlc190b19hbGxvYyA9IFBBR0VfQUxJR04oYnl0ZXNfdG9fYWxsb2MpOwotCi0JcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJhc21fY2xpZW50IiwgJmJ1ZlswXS5jbGllbnQsICZidWZbMF0uaGFuZGxlLAotCQlieXRlc190b19hbGxvYywKLQkJKGlvbl9waHlzX2FkZHJfdCAqKSZidWZbMF0ucGh5cywgJmxlbiwKLQkJJmJ1ZlswXS5kYXRhKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogQXVkaW8gSU9OIGFsbG9jIGlzIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWJ1ZlswXS51c2VkID0gZGlyIF4gMTsKLQlidWZbMF0uc2l6ZSA9IGJ1ZnN6OwotCWJ1ZlswXS5hY3R1YWxfc2l6ZSA9IGJ1ZnN6OwotCWNudCA9IDE7Ci0Jd2hpbGUgKGNudCA8IGJ1ZmNudCkgewotCQlpZiAoYnVmc3ogPiAwKSB7Ci0JCQlidWZbY250XS5kYXRhID0gIGJ1ZlswXS5kYXRhICsgKGNudCAqIGJ1ZnN6KTsKLQkJCWJ1ZltjbnRdLnBoeXMgPSAgYnVmWzBdLnBoeXMgKyAoY250ICogYnVmc3opOwotCQkJaWYgKCFidWZbY250XS5kYXRhKSB7Ci0JCQkJcHJfZXJyKCIlczogQnVmIGFsbG9jIGZhaWxlZFxuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWJ1ZltjbnRdLnVzZWQgPSBkaXIgXiAxOwotCQkJYnVmW2NudF0uc2l6ZSA9IGJ1ZnN6OwotCQkJYnVmW2NudF0uYWN0dWFsX3NpemUgPSBidWZzejsKLQkJCXByX2RlYnVnKCIlczogZGF0YVslcEtdcGh5c1slcEtdWyVwS11cbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJYnVmW2NudF0uZGF0YSwKLQkJCQkmYnVmW2NudF0ucGh5cywKLQkJCQkmYnVmW2NudF0ucGh5cyk7Ci0JCX0KLQkJY250Kys7Ci0JfQotCWFjLT5wb3J0W2Rpcl0ubWF4X2J1Zl9jbnQgPSBjbnQ7Ci0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCXJjID0gcTZhc21fbWVtb3J5X21hcF9yZWdpb25zKGFjLCBkaXIsIGJ1ZnN6LCBjbnQsIDEpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ01EIE1lbW9yeV9tYXBfcmVnaW9ucyBmYWlsZWQgJWQgZm9yIHNpemUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMsIGJ1ZnN6KTsKLQkJZ290byBmYWlsOwotCX0KLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcTZhc21fYXVkaW9fY2xpZW50X2J1Zl9mcmVlX2NvbnRpZ3VvdXMoZGlyLCBhYyk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHE2YXNtX3NydmNfY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKLXsKLQl1aW50MzJfdCBkaXIgPSAwOwotCXVpbnQzMl90IGkgPSBJTjsKLQl1aW50MzJfdCAqcGF5bG9hZDsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQotCXN0cnVjdCBhdWRpb19jbGllbnQgKmFjID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0OwotCi0JaWYgKCFkYXRhKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgQ0JcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7Ci0KLQlpZiAoZGF0YS0+b3Bjb2RlID09IFJFU0VUX0VWRU5UUykgewotCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGV2ZW50IGlzIHJlY2VpdmVkOiAlZCAlZCBhcHJbJXBLXVxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlkYXRhLT5yZXNldF9ldmVudCwKLQkJCQlkYXRhLT5yZXNldF9wcm9jLAotCQkJCXRoaXNfbW1hcC5hcHIpOwotCQlhdG9taWNfc2V0KCZ0aGlzX21tYXAucmVmX2NudCwgMCk7Ci0JCWFwcl9yZXNldCh0aGlzX21tYXAuYXByKTsKLQkJdGhpc19tbWFwLmFwciA9IE5VTEw7Ci0JCWZvciAoOyBpIDw9IE9VVDsgaSsrKSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkJCSZjb21tb25fY2xpZW50LnBvcnRbaV0ubWVtX21hcF9oYW5kbGUpIHsKLQkJCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLAotCQkJCQkJc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKLQkJCQkJCWxpc3QpOwotCQkJCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PQotCQkJCWNvbW1vbl9jbGllbnQucG9ydFtpXS5idWYtPnBoeXMpIHsKLQkJCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJCQkJa2ZyZWUoYnVmX25vZGUpOwotCQkJCX0KLQkJCX0KLQkJCXByX2RlYnVnKCIlczogQ2xlYXJpbmcgY3VzdG9tIHRvcG9sb2d5XG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQotCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhBU01fTUFYX0NBTF9UWVBFUywgY2FsX2RhdGEpOwotCQljb21tb25fY2xpZW50Lm1tYXBfYXByID0gTlVMTDsKLQkJbXV0ZXhfbG9jaygmY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7Ci0JCXNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOwotCQltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9DVVNUT01fVE9QX0NBTF0tPmxvY2spOwotCQl0b3BvbG9neV9tYXBfaGFuZGxlID0gMDsKLQkJcnRhY19jbGVhcl9tYXBwaW5nKEFTTV9SVEFDX0NBTCk7Ci0JCXJldHVybiAwOwotCX0KLQlhc21fdG9rZW4udG9rZW4gPSBkYXRhLT50b2tlbjsKLQlhYyA9IHE2YXNtX2dldF9hdWRpb19jbGllbnQoYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkKTsKLQlkaXIgPSBxNmFzbV9nZXRfZmxhZ19mcm9tX3Rva2VuKCZhc21fdG9rZW4sIEFTTV9ESVJFQ1RJT05fT0ZGU0VUKTsKLQotCWlmICghYWMpIHsKLQkJcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXSBhbHJlYWR5IGZyZWVkXG4iLAotCQkJIF9fZnVuY19fLCBhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplID4gc2l6ZW9mKGludCkpIHsKLQkJcHJfZGVidWcoIiVzOnB0cjBbMHgleF1wdHIxWzB4JXhdb3Bjb2RlWzB4JXhdIHRva2VuWzB4JXhdcGF5bG9hZF9zWyVkXSBzcmNbJWRdIGRlc3RbJWRdc2lkWyVkXWRpclslZF1cbiIsCi0JCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSwgZGF0YS0+b3Bjb2RlLAotCQkJZGF0YS0+dG9rZW4sIGRhdGEtPnBheWxvYWRfc2l6ZSwgZGF0YS0+c3JjX3BvcnQsCi0JCQlkYXRhLT5kZXN0X3BvcnQsIGFzbV90b2tlbi5fdG9rZW4uc2Vzc2lvbl9pZCwgZGlyKTsKLQkJcHJfZGVidWcoIiVzOlBheWxvYWQgPSBbMHgleF0gc3RhdHVzWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOwotCX0gZWxzZSBpZiAoZGF0YS0+cGF5bG9hZF9zaXplID09IHNpemVvZihpbnQpKSB7Ci0JCXByX2RlYnVnKCIlczpwdHIwWzB4JXhdb3Bjb2RlWzB4JXhdIHRva2VuWzB4JXhdcGF5bG9hZF9zWyVkXSBzcmNbJWRdIGRlc3RbJWRdc2lkWyVkXWRpclslZF1cbiIsCi0JCQlfX2Z1bmNfXywgcGF5bG9hZFswXSwgZGF0YS0+b3Bjb2RlLAotCQkJZGF0YS0+dG9rZW4sIGRhdGEtPnBheWxvYWRfc2l6ZSwgZGF0YS0+c3JjX3BvcnQsCi0JCQlkYXRhLT5kZXN0X3BvcnQsIGFzbV90b2tlbi5fdG9rZW4uc2Vzc2lvbl9pZCwgZGlyKTsKLQkJcHJfZGVidWcoIiVzOlBheWxvYWQgPSBbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7Ci0JfQotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgewotCQlzd2l0Y2ggKHBheWxvYWRbMF0pIHsKLQkJY2FzZSBBU01fQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6Ci0JCWNhc2UgQVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM6Ci0JCWNhc2UgQVNNX0NNRF9BRERfVE9QT0xPR0lFUzoKLQkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBjbWQgPSAweCV4IHJldHVybmVkIGVycm9yID0gMHgleCBzaWQ6JWRcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLAotCQkJCSAgICAgICBhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQpOwotCQkJCWlmIChwYXlsb2FkWzBdID09Ci0JCQkJICAgIEFTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TKQotCQkJCQlhdG9taWNfc2V0KCZhYy0+dW5tYXBfY2Jfc3VjY2VzcywgMCk7Ci0KLQkJCQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCBwYXlsb2FkWzFdKTsKLQkJCQl3YWtlX3VwKCZhYy0+bWVtX3dhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGF5bG9hZFswXSA9PQotCQkJCSAgICBBU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUykKLQkJCQkJYXRvbWljX3NldCgmYWMtPnVubWFwX2NiX3N1Y2Nlc3MsIDEpOwotCQkJfQotCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJmFjLT5tZW1fc3RhdGUsIC0xLCAwKSA9PSAtMSkKLQkJCQl3YWtlX3VwKCZhYy0+bWVtX3dhaXQpOwotCQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBQYXlsb2FkID0gWzB4JXhdIHN0YXR1c1sweCV4XVxuIiwKLQkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IGNvbW1hbmRbMHgleF0gbm90IGV4cGVjdGluZyByc3BcbiIsCi0JCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07Ci0KLQlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgewotCWNhc2UgQVNNX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TOnsKLQkJcHJfZGVidWcoIiVzOlBMIzBbMHgleF0gZGlyPTB4JXggc19pZD0weCV4XG4iLAotCQkgICAgICAgX19mdW5jX18sIHBheWxvYWRbMF0sIGRpciwgYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlpZiAoYXRvbWljX2NtcHhjaGcoJmFjLT5tZW1fc3RhdGUsIC0xLCAwKSA9PSAtMSkgewotCQkJYWMtPnBvcnRbZGlyXS50bXBfaGRsID0gcGF5bG9hZFswXTsKLQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFTTV9DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOnsKLQkJcHJfZGVidWcoIiVzOiBQTCMwWzB4JXhdUEwjMSBbMHgleF1cbiIsCi0JCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQlpZiAoYXRvbWljX2NtcHhjaGcoJmFjLT5tZW1fc3RhdGUsIC0xLCAwKSA9PSAtMSkKLQkJCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCi0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiJXM6IGNvbW1hbmRbMHgleF1zdWNjZXNzIFsweCV4XVxuIiwKLQkJCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOwotCX0KLQlpZiAoYWMtPmNiKQotCQlhYy0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKLQkJCWRhdGEtPnBheWxvYWQsIGFjLT5wcml2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcTZhc21fcHJvY2Vzc19tdG14X2dldF9wYXJhbV9yc3Aoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IGFzbV9tdG14X3N0cnRyX2dldF9wYXJhbXNfY21kcnNwICpjbWRyc3ApCi17Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fc2Vzc2lvbl90aW1lX3YzX3QgKnRpbWU7Ci0KLQlpZiAoY21kcnNwLT5lcnJfY29kZSkgewotCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGFjLT5kZXYsCi0JCQkJICAgICIlczogZXJyPSV4LCBtb2RfaWQ9JXgsIHBhcmFtX2lkPSV4XG4iLAotCQkJCSAgICBfX2Z1bmNfXywgY21kcnNwLT5lcnJfY29kZSwKLQkJCQkgICAgY21kcnNwLT5wYXJhbV9pbmZvLm1vZHVsZV9pZCwKLQkJCQkgICAgY21kcnNwLT5wYXJhbV9pbmZvLnBhcmFtX2lkKTsKLQkJcmV0dXJuOwotCX0KLQlkZXZfZGJnX3JhdGVsaW1pdGVkKGFjLT5kZXYsCi0JCQkgICAgIiVzOiBtb2RfaWQ9JXgsIHBhcmFtX2lkPSV4XG4iLCBfX2Z1bmNfXywKLQkJCSAgICBjbWRyc3AtPnBhcmFtX2luZm8ubW9kdWxlX2lkLAotCQkJICAgIGNtZHJzcC0+cGFyYW1faW5mby5wYXJhbV9pZCk7Ci0KLQlzd2l0Y2ggKGNtZHJzcC0+cGFyYW1faW5mby5tb2R1bGVfaWQpIHsKLQljYXNlIEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQzoKLQkJc3dpdGNoIChjbWRyc3AtPnBhcmFtX2luZm8ucGFyYW1faWQpIHsKLQkJY2FzZSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NFU1NJT05fVElNRV9WMzoKLQkJCXRpbWUgPSAmY21kcnNwLT5wYXJhbV9kYXRhLnNlc3Npb25fdGltZTsKLQkJCWRldl92ZGJnKGFjLT5kZXYsICIlczogR0VUX1RJTUVfVjMsIHRpbWVfbHN3PSV4LCB0aW1lX21zdz0leFxuIiwKLQkJCQkgX19mdW5jX18sIHRpbWUtPnNlc3Npb25fdGltZV9sc3csCi0JCQkJIHRpbWUtPnNlc3Npb25fdGltZV9tc3cpOwotCQkJYWMtPnRpbWVfc3RhbXAgPSAodWludDY0X3QpKCgodWludDY0X3QpCi0JCQkJCSB0aW1lLT5zZXNzaW9uX3RpbWVfbXN3IDw8IDMyKSB8Ci0JCQkJCSB0aW1lLT5zZXNzaW9uX3RpbWVfbHN3KTsKLQkJCWlmICh0aW1lLT5mbGFncyAmCi0JCQkgICAgQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9TVElNRV9UU1RNUF9GTEdfQk1BU0spCi0JCQkJZGV2X3dhcm5fcmF0ZWxpbWl0ZWQoYWMtPmRldiwKLQkJCQkJCSAgICAgIiVzOiByZWN2IGludmFsIHRzdG1wXG4iLAotCQkJCQkJICAgICBfX2Z1bmNfXyk7Ci0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJmFjLT50aW1lX2ZsYWcsIDEsIDApKQotCQkJCXdha2VfdXAoJmFjLT50aW1lX3dhaXQpOwotCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIoYWMtPmRldiwgIiVzOiB1bmV4cGVjdGVkIHBhcmFtX2lkICV4XG4iLAotCQkJCV9fZnVuY19fLCBjbWRyc3AtPnBhcmFtX2luZm8ucGFyYW1faWQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IHVuZXhwZWN0ZWQgbW9kX2lkICV4XG4iLCAgX19mdW5jX18sCi0JCQljbWRyc3AtPnBhcmFtX2luZm8ubW9kdWxlX2lkKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50MzJfdCBxNmFzbV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KQotewotCWludCBpID0gMDsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IChzdHJ1Y3QgYXVkaW9fY2xpZW50ICopcHJpdjsKLQl1bnNpZ25lZCBsb25nIGRzcF9mbGFnczsKLQl1aW50MzJfdCAqcGF5bG9hZDsKLQl1aW50MzJfdCB3YWtldXBfZmxhZyA9IDE7Ci0JaW50MzJfdCAgcmV0ID0gMDsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQl1aW50OF90IGJ1Zl9pbmRleDsKLQlzdHJ1Y3QgbXNtX2Fkc3BfZXZlbnRfZGF0YSAqcHBfZXZlbnRfcGFja2FnZSA9IE5VTEw7Ci0JdWludDMyX3QgcGF5bG9hZF9zaXplID0gMDsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGFjIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChkYXRhID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogZGF0YSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIXE2YXNtX2lzX3ZhbGlkX2F1ZGlvX2NsaWVudChhYykpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IHBvaW50ZXIgaXMgaW52YWxpZCwgYWMgPSAlcEtcbiIsCi0JCQkJX19mdW5jX18sIGFjKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGFjLT5zZXNzaW9uIDw9IDAgfHwgYWMtPnNlc3Npb24gPiA4KSB7Ci0JCXByX2VycigiJXM6IFNlc3Npb24gSUQgaXMgaW52YWxpZCwgc2Vzc2lvbiA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWFjLT5zZXNzaW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGF5bG9hZCA9IGRhdGEtPnBheWxvYWQ7Ci0JYXNtX3Rva2VuLnRva2VuID0gZGF0YS0+dG9rZW47Ci0JaWYgKHE2YXNtX2dldF9mbGFnX2Zyb21fdG9rZW4oJmFzbV90b2tlbiwgQVNNX0NNRF9OT19XQUlUX09GRlNFVCkpIHsKLQkJcHJfZGVidWcoIiVzOiBObyB3YWl0IGNvbW1hbmQgb3Bjb2RlWzB4JXhdIGNtZF9vcGNvZGU6JXhcbiIsCi0JCQkgX19mdW5jX18sIGRhdGEtPm9wY29kZSwgcGF5bG9hZCA/IHBheWxvYWRbMF0gOiAwKTsKLQkJd2FrZXVwX2ZsYWcgPSAwOwotCX0KLQotCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7Ci0JCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7Ci0JCWF0b21pY19zZXQoJmFjLT5yZXNldCwgMSk7Ci0JCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJCWFjLT5hcHIgPSBhYy0+YXByMjsKLQkJCWFjLT5hcHIyID0gTlVMTDsKLQkJfQotCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGV2ZW50IGlzIHJlY2VpdmVkOiAlZCAlZCBhcHJbJXBLXVxuIiwKLQkJCV9fZnVuY19fLAotCQkJZGF0YS0+cmVzZXRfZXZlbnQsIGRhdGEtPnJlc2V0X3Byb2MsIGFjLT5hcHIpOwotCQlpZiAoYWMtPmNiKQotCQkJYWMtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQkJKHVpbnQzMl90ICopZGF0YS0+cGF5bG9hZCwgYWMtPnByaXYpOwotCQlhcHJfcmVzZXQoYWMtPmFwcik7Ci0JCWFjLT5hcHIgPSBOVUxMOwotCQlhdG9taWNfc2V0KCZhYy0+dGltZV9mbGFnLCAwKTsKLQkJYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMCk7Ci0JCWF0b21pY19zZXQoJmFjLT5tZW1fc3RhdGUsIDApOwotCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCAwKTsKLQkJd2FrZV91cCgmYWMtPnRpbWVfd2FpdCk7Ci0JCXdha2VfdXAoJmFjLT5jbWRfd2FpdCk7Ci0JCXdha2VfdXAoJmFjLT5tZW1fd2FpdCk7Ci0JCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXW9wY29kZVsweCV4XSB0b2tlblsweCV4XXBheWxvYWRfc2l6ZVslZF0gc3JjWyVkXSBkZXN0WyVkXVxuIiwKLQkJIF9fZnVuY19fLAotCQlhYy0+c2Vzc2lvbiwgZGF0YS0+b3Bjb2RlLAotCQlkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5zcmNfcG9ydCwKLQkJZGF0YS0+ZGVzdF9wb3J0KTsKLQlpZiAoKGRhdGEtPm9wY29kZSAhPSBBU01fREFUQV9FVkVOVF9SRU5ERVJFRF9FT1MpICYmCi0JICAgIChkYXRhLT5vcGNvZGUgIT0gQVNNX0RBVEFfRVZFTlRfRU9TKSAmJgotCSAgICAoZGF0YS0+b3Bjb2RlICE9IEFTTV9TRVNTSU9OX0VWRU5UX1JYX1VOREVSRkxPVykpIHsKLQkJaWYgKHBheWxvYWQgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogcGF5bG9hZCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IFBheWxvYWQgPSBbMHgleF0gc3RhdHVzWzB4JXhdIG9wY29kZSAweCV4XG4iLAotCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIGRhdGEtPm9wY29kZSk7Ci0JfQotCWlmIChkYXRhLT5vcGNvZGUgPT0gQVBSX0JBU0lDX1JTUF9SRVNVTFQpIHsKLQkJc3dpdGNoIChwYXlsb2FkWzBdKSB7Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjoKLQkJCWlmIChydGFjX21ha2VfYXNtX2NhbGxiYWNrKGFjLT5zZXNzaW9uLCBwYXlsb2FkLAotCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpKQotCQkJCWJyZWFrOwotCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9QQVVTRToKLQkJY2FzZSBBU01fU0VTU0lPTl9DTURfU1VTUEVORDoKLQkJY2FzZSBBU01fREFUQV9DTURfRU9TOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX0NMT1NFOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX0ZMVVNIOgotCQljYXNlIEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI6Ci0JCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX0ZPUlhfT1ZFUkZMT1dfRVZFTlRTOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX0ZMVVNIX1JFQURCVUZTOgotCQlwcl9kZWJ1ZygiJXM6IHNlc3Npb24gJWQgb3Bjb2RlIDB4JXggdG9rZW4gMHgleCBQYXlsb2FkID0gWzB4JXhdIHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJcGF5bG9hZFswXSwgZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7Ci0JCXJldCA9IHE2YXNtX2lzX3ZhbGlkX3Nlc3Npb24oZGF0YSwgcHJpdik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJcHJfZXJyKCIlczogc2Vzc2lvbiBpbnZhbGlkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJY2FzZSBBU01fU0VTU0lPTl9DTURfU0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUkVBRF9WMzoKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9PUEVOX1dSSVRFX1YzOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVMTF9NT0RFX1dSSVRFOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fUFVTSF9NT0RFX1JFQUQ6Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEVfVjI6Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfT1BFTl9MT09QQkFDS19WMjoKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9PUEVOX1RSQU5TQ09ERV9MT09QQkFDSzoKLQkJY2FzZSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjoKLQkJY2FzZSBBU01fREFUQV9DTURfSUVDXzYwOTU4X01FRElBX0ZNVDoKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU1fVjI6Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfRU5DREVDX0VWRU5UUzoKLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9SRUdJU1RFUl9JRUNfNjE5MzdfRk1UX1VQREFURToKLQkJY2FzZSBBU01fREFUQV9DTURfUkVNT1ZFX0lOSVRJQUxfU0lMRU5DRToKLQkJY2FzZSBBU01fREFUQV9DTURfUkVNT1ZFX1RSQUlMSU5HX1NJTEVOQ0U6Ci0JCWNhc2UgQVNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX0ZPUl9SWF9VTkRFUkZMT1dfRVZFTlRTOgotCQljYXNlIEFTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfQ09NUFJFU1NFRDoKLQkJCXByX2RlYnVnKCIlczogc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IFBheWxvYWQgPSBbMHgleF0gc3RhdCAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCXBheWxvYWRbMF0sIHBheWxvYWRbMV0sCi0JCQkJZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7Ci0JCQlpZiAocGF5bG9hZFsxXSAhPSAwKSB7Ci0JCQkJcHJfZXJyKCIlczogY21kID0gMHgleCByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCi0JCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJCQlpZiAod2FrZXVwX2ZsYWcpIHsKLQkJCQkJaWYgKChpc19hZHNwX3JlZ19ldmVudChwYXlsb2FkWzBdKSA+PSAwKQotCQkJCQkgICAgICB8fCAocGF5bG9hZFswXSA9PQotCQkJCQkgICAgICBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyKSkKLQkJCQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGVfcHAsCi0JCQkJCQkJCXBheWxvYWRbMV0pOwotCQkJCQllbHNlCi0JCQkJCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLAotCQkJCQkJCQlwYXlsb2FkWzFdKTsKLQkJCQkJd2FrZV91cCgmYWMtPmNtZF93YWl0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoKGlzX2Fkc3BfcmVnX2V2ZW50KHBheWxvYWRbMF0pID49IDApIHx8Ci0JCQkgICAgKHBheWxvYWRbMF0gPT0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMikpIHsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApICYmCi0JCQkJCXdha2V1cF9mbGFnKSB7Ci0JCQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGVfcHAsIDApOwotCQkJCQl3YWtlX3VwKCZhYy0+Y21kX3dhaXQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSAmJgotCQkJCQl3YWtldXBfZmxhZykgewotCQkJCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAwKTsKLQkJCQkJd2FrZV91cCgmYWMtPmNtZF93YWl0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWMtPmNiKQotCQkJCWFjLT5jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCQkodWludDMyX3QgKilkYXRhLT5wYXlsb2FkLCBhYy0+cHJpdik7Ci0JCQlicmVhazsKLQkJY2FzZSBBU01fQ01EX0FERF9UT1BPTE9HSUVTOgotCQkJcHJfZGVidWcoIiVzOlBheWxvYWQgPSBbMHgleF1zdGF0WzB4JXhdXG4iLAotCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCQlpZiAocGF5bG9hZFsxXSAhPSAwKSB7Ci0JCQkJcHJfZXJyKCIlczogY21kID0gMHgleCByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcGF5bG9hZFswXSwgcGF5bG9hZFsxXSk7Ci0JCQkJaWYgKHdha2V1cF9mbGFnKSB7Ci0JCQkJCWF0b21pY19zZXQoJmFjLT5tZW1fc3RhdGUsIHBheWxvYWRbMV0pOwotCQkJCQl3YWtlX3VwKCZhYy0+bWVtX3dhaXQpOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkgJiYgd2FrZXVwX2ZsYWcpIHsKLQkJCQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAwKTsKLQkJCQl3YWtlX3VwKCZhYy0+bWVtX3dhaXQpOwotCQkJfQotCQkJaWYgKGFjLT5jYikKLQkJCQlhYy0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKLQkJCQkJKHVpbnQzMl90ICopZGF0YS0+cGF5bG9hZCwgYWMtPnByaXYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVNNX0RBVEFfRVZFTlRfV0FURVJNQVJLOiB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFdhdGVybWFyayBvcGNvZGVbMHgleF0gc3RhdHVzWzB4JXhdIiwKLQkJCQkgX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TX1YyOgotCQkJcHJfZGVidWcoIiVzOiBBU01fU1RSRUFNX0NNRF9HRVRfUFBfUEFSQU1TX1YyIHNlc3Npb24gJWQgb3Bjb2RlIDB4JXggdG9rZW4gMHgleCBzcmMgJWQgZGVzdCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sCi0JCQkJZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKLQkJCQlkYXRhLT5zcmNfcG9ydCwgZGF0YS0+ZGVzdF9wb3J0KTsKLQkJCS8qIFNob3VsZCBvbmx5IGNvbWUgaGVyZSBpZiB0aGVyZSBpcyBhbiBBUFIgKi8KLQkJCS8qIGVycm9yIG9yIG1hbGZvcm1lZCBBUFIgcGFja2V0LiBPdGhlcndpc2UgKi8KLQkJCS8qIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgKi8KLQkJCS8qIEFTTV9TVFJFQU1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjIgKi8KLQkJCWlmIChwYXlsb2FkWzFdICE9IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBBU00gZ2V0IHBhcmFtIGVycm9yID0gJWQsIHJlc3VtaW5nXG4iLAotCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFsxXSk7Ci0JCQkJcnRhY19tYWtlX2FzbV9jYWxsYmFjayhhYy0+c2Vzc2lvbiwgcGF5bG9hZCwKLQkJCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQVNNX1NUUkVBTV9DTURfUkVHSVNURVJfUFBfRVZFTlRTOgotCQkJcHJfZGVidWcoIiVzOiBBU01fU1RSRUFNX0NNRF9SRUdJU1RFUl9QUF9FVkVOVFMgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCQkJaWYgKHBheWxvYWRbMV0gIT0gMCkKLQkJCQlwcl9lcnIoIiVzOiBBU00gZ2V0IHBhcmFtIGVycm9yID0gJWQsIHJlc3VtaW5nXG4iLAotCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFsxXSk7Ci0JCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCBwYXlsb2FkWzFdKTsKLQkJCXdha2VfdXAoJmFjLT5jbWRfd2FpdCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogY29tbWFuZFsweCV4XSBub3QgZXhwZWN0aW5nIHJzcFxuIiwKLQkJCQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGRhdGEtPm9wY29kZSkgewotCWNhc2UgQVNNX0RBVEFfRVZFTlRfV1JJVEVfRE9ORV9WMjp7Ci0JCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSAmYWMtPnBvcnRbSU5dOwotCi0JCWRldl92ZGJnKGFjLT5kZXYsICIlczogUnhlZCBvcGNvZGVbMHgleF0gc3RhdHVzWzB4JXhdIHRva2VuWyVkXSIsCi0JCQkJX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sCi0JCQkJZGF0YS0+dG9rZW4pOwotCQlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKLQkJCWlmIChwb3J0LT5idWYgPT0gTlVMTCkgewotCQkJCXByX2VycigiJXM6IFVuZXhwZWN0ZWQgV3JpdGUgRG9uZVxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmRzcF9sb2NrLCBkc3BfZmxhZ3MpOwotCQkJYnVmX2luZGV4ID0gYXNtX3Rva2VuLl90b2tlbi5idWZfaW5kZXg7Ci0JCQlpZiAobG93ZXJfMzJfYml0cyhwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKSAhPQotCQkJcGF5bG9hZFswXSB8fAotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJcG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cykgIT0JcGF5bG9hZFsxXSkgewotCQkJCXByX2RlYnVnKCIlczogRXhwZWN0ZWQgYWRkciAlcEtcbiIsCi0JCQkJX19mdW5jX18sICZwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKTsKLQkJCQlwcl9lcnIoIiVzOiByeGVkbFsweCV4XSByeGVkdSBbMHgleF1cbiIsCi0JCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKLQkJCQkJCQkJZHNwX2ZsYWdzKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXBvcnQtPmJ1ZltidWZfaW5kZXhdLnVzZWQgPSAxOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0KLQkJCWNvbmZpZ19kZWJ1Z19mc193cml0ZV9jYigpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgcG9ydC0+bWF4X2J1Zl9jbnQ7IGkrKykKLQkJCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXMgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBwb3J0LT5idWZbaV0udXNlZCk7Ci0KLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1YyOgotCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fQ01EUlNQX0dFVF9QUF9QQVJBTVNfVjIgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZGF0YS0+b3Bjb2RlLAotCQkJCWRhdGEtPnRva2VuLAotCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCQlpZiAocGF5bG9hZFswXSAhPSAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBBU01fU1RSRUFNX0NNRFJTUF9HRVRfUFBfUEFSQU1TX1YyIHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZFswXSk7Ci0JCX0gZWxzZSBpZiAoZ2VuZXJpY19nZXRfZGF0YSkgewotCQkJZ2VuZXJpY19nZXRfZGF0YS0+dmFsaWQgPSAxOwotCQkJaWYgKGdlbmVyaWNfZ2V0X2RhdGEtPmlzX2luYmFuZCkgewotCQkJCXByX2RlYnVnKCIlczogcGF5bG9hZFsxXSA9IDB4JXgsIHBheWxvYWRbMl09MHgleCwgcGF5bG9hZFszXT0weCV4XG4iLAotCQkJCSAgX19mdW5jX18sIHBheWxvYWRbMV0sIHBheWxvYWRbMl0sIHBheWxvYWRbM10pOwotCQkJCWdlbmVyaWNfZ2V0X2RhdGEtPnNpemVfaW5faW50cyA9IHBheWxvYWRbM10+PjI7Ci0JCQkJZm9yIChpID0gMDsgaSA8IHBheWxvYWRbM10+PjI7IGkrKykgewotCQkJCQlnZW5lcmljX2dldF9kYXRhLT5pbnRzW2ldID0KLQkJCQkJCQkJICAgcGF5bG9hZFs0K2ldOwotCQkJCQlwcl9kZWJ1ZygiJXM6IEFTTSBjYWxsYmFjayB2YWwgJWkgPSAlaVxuIiwKLQkJCQkJCSBfX2Z1bmNfXywgaSwgcGF5bG9hZFs0K2ldKTsKLQkJCQl9Ci0JCQkJcHJfZGVidWcoIiVzOiBjYWxsYmFjayBzaXplIGluIGludHMgPSAlaVxuIiwKLQkJCQkJIF9fZnVuY19fLAotCQkJCQlnZW5lcmljX2dldF9kYXRhLT5zaXplX2luX2ludHMpOwotCQkJfQotCQkJaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSAmJiB3YWtldXBfZmxhZykgewotCQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOwotCQkJCXdha2VfdXAoJmFjLT5jbWRfd2FpdCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlydGFjX21ha2VfYXNtX2NhbGxiYWNrKGFjLT5zZXNzaW9uLCBwYXlsb2FkLAotCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9SRUFEX0RPTkVfVjI6ewotCi0JCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSAmYWMtPnBvcnRbT1VUXTsKLQotCQljb25maWdfZGVidWdfZnNfcmVhZF9jYigpOwotCi0JCWRldl92ZGJnKGFjLT5kZXYsICIlczogUmVhZERvbmU6IHN0YXR1cz0lZCBidWZmX2FkZD0weCV4IGFjdF9zaXplPSVkIG9mZnNldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZFtSRUFERE9ORV9JRFhfU1RBVFVTXSwKLQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9CVUZBRERfTFNXXSwKLQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9TSVpFXSwKLQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9PRkZTRVRdKTsKLQotCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IFJlYWREb25lOm1zd190cz0lZCBsc3dfdHM9JWQgbWVtbWFwX2hkbD0weCV4IGZsYWdzPSVkIGlkPSVkIG51bT0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZFtSRUFERE9ORV9JRFhfTVNXX1RTXSwKLQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9MU1dfVFNdLAotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX01FTU1BUF9IRExdLAotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0ZMQUdTXSwKLQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9TRVFfSURdLAotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX05VTUZSQU1FU10pOwotCi0JCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQkJaWYgKHBvcnQtPmJ1ZiA9PSBOVUxMKSB7Ci0JCQkJcHJfZXJyKCIlczogVW5leHBlY3RlZCBXcml0ZSBEb25lXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCQlidWZfaW5kZXggPSBhc21fdG9rZW4uX3Rva2VuLmJ1Zl9pbmRleDsKLQkJCXBvcnQtPmJ1ZltidWZfaW5kZXhdLnVzZWQgPSAwOwotCQkJaWYgKGxvd2VyXzMyX2JpdHMocG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cykgIT0KLQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9MU1ddIHx8Ci0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQlwb3J0LT5idWZbYnVmX2luZGV4XS5waHlzKSAhPQotCQkJCQlwYXlsb2FkW1JFQURET05FX0lEWF9CVUZBRERfTVNXXSkgewotCQkJCWRldl92ZGJnKGFjLT5kZXYsICIlczogRXhwZWN0ZWQgYWRkciAlcEtcbiIsCi0JCQkJCV9fZnVuY19fLCAmcG9ydC0+YnVmW2J1Zl9pbmRleF0ucGh5cyk7Ci0JCQkJcHJfZXJyKCIlczogcnhlZGxbMHgleF0gcnhlZHVbMHgleF1cbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9MU1ddLAotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX0JVRkFERF9NU1ddKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5kc3BfbG9jaywKLQkJCQkJCQlkc3BfZmxhZ3MpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcG9ydC0+YnVmW2J1Zl9pbmRleF0uYWN0dWFsX3NpemUgPQotCQkJCXBheWxvYWRbUkVBRERPTkVfSURYX1NJWkVdOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+ZHNwX2xvY2ssIGRzcF9mbGFncyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgQVNNX0RBVEFfRVZFTlRfRU9TOgotCWNhc2UgQVNNX0RBVEFfRVZFTlRfUkVOREVSRURfRU9TOgotCQlwcl9kZWJ1ZygiJXM6IEVPUyBBQ0sgcmVjZWl2ZWQ6IHJ4ZWQgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCQlicmVhazsKLQljYXNlIEFTTV9TRVNTSU9OX0VWRU5UWF9PVkVSRkxPVzoKLQkJcHJfZGVidWcoIiVzOiBBU01fU0VTU0lPTl9FVkVOVFhfT1ZFUkZMT1cgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCQlicmVhazsKLQljYXNlIEFTTV9TRVNTSU9OX0VWRU5UX1JYX1VOREVSRkxPVzoKLQkJcHJfZGVidWcoIiVzOiBBU01fU0VTU0lPTl9FVkVOVF9SWF9VTkRFUkZMT1cgc2Vzc2lvbiAlZCBvcGNvZGUgMHgleCB0b2tlbiAweCV4IHNyYyAlZCBkZXN0ICVkXG4iLAotCQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCWRhdGEtPnNyY19wb3J0LCBkYXRhLT5kZXN0X3BvcnQpOwotCQlicmVhazsKLQljYXNlIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfU0VTU0lPTlRJTUVfVjM6Ci0JCWRldl92ZGJnKGFjLT5kZXYsICIlczogQVNNX1NFU1NJT05fQ01EUlNQX0dFVF9TRVNTSU9OVElNRV9WMywgcGF5bG9hZFswXSA9ICVkLCBwYXlsb2FkWzFdID0gJWQsIHBheWxvYWRbMl0gPSAlZFxuIiwKLQkJCQkgX19mdW5jX18sCi0JCQkJIHBheWxvYWRbMF0sIHBheWxvYWRbMV0sIHBheWxvYWRbMl0pOwotCQlhYy0+dGltZV9zdGFtcCA9ICh1aW50NjRfdCkoKCh1aW50NjRfdClwYXlsb2FkWzJdIDw8IDMyKSB8Ci0JCQkJcGF5bG9hZFsxXSk7Ci0JCWlmIChhdG9taWNfY21weGNoZygmYWMtPnRpbWVfZmxhZywgMSwgMCkpCi0JCQl3YWtlX3VwKCZhYy0+dGltZV93YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fREFUQV9FVkVOVF9TUl9DTV9DSEFOR0VfTk9USUZZOgotCWNhc2UgQVNNX0RBVEFfRVZFTlRfRU5DX1NSX0NNX0NIQU5HRV9OT1RJRlk6Ci0JCXByX2RlYnVnKCIlczogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSBzZXNzaW9uICVkIG9wY29kZSAweCV4IHRva2VuIDB4JXggc3JjICVkIGRlc3QgJWRcbiIsCi0JCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLAotCQkJCWRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQkJZGF0YS0+c3JjX3BvcnQsIGRhdGEtPmRlc3RfcG9ydCk7Ci0JCXByX2RlYnVnKCIlczogQVNNX0RBVEFfRVZFTlRfU1JfQ01fQ0hBTkdFX05PVElGWSwgcGF5bG9hZFswXSA9ICVkLCBwYXlsb2FkWzFdID0gJWQsIHBheWxvYWRbMl0gPSAlZCwgcGF5bG9hZFszXSA9ICVkXG4iLAotCQkJCSBfX2Z1bmNfXywKLQkJCQlwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLCBwYXlsb2FkWzJdLAotCQkJCXBheWxvYWRbM10pOwotCQlicmVhazsKLQljYXNlIEFTTV9TRVNTSU9OX0NNRFJTUF9HRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI6Ci0JCXE2YXNtX3Byb2Nlc3NfbXRteF9nZXRfcGFyYW1fcnNwKGFjLCAodm9pZCAqKSBwYXlsb2FkKTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fU1RSRUFNX1BQX0VWRU5UOgotCWNhc2UgQVNNX1NUUkVBTV9DTURfRU5DREVDX0VWRU5UUzoKLQljYXNlIEFTTV9TVFJFQU1fQ01EX1JFR0lTVEVSX0lFQ182MTkzN19GTVRfVVBEQVRFOgotCQlwcl9kZWJ1ZygiJXM6IEFTTV9TVFJFQU1fRVZFTlQgcGF5bG9hZFswXVsweCV4XSBwYXlsb2FkWzFdWzB4JXhdIiwKLQkJCQkgX19mdW5jX18sIHBheWxvYWRbMF0sIHBheWxvYWRbMV0pOwotCQlpID0gaXNfYWRzcF9yYWlzZV9ldmVudChkYXRhLT5vcGNvZGUpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm4gMDsKLQotCQkvKiByZXBhY2sgcGF5bG9hZCBmb3IgYXNtX3N0cmVhbV9wcF9ldmVudAotCQkgKiBwYWNrYWdlIGlzIGNvbXBvc2VkIG9mIGV2ZW50IHR5cGUgKyBzaXplICsgYWN0dWFsIHBheWxvYWQKLQkJICovCi0JCXBheWxvYWRfc2l6ZSA9IGRhdGEtPnBheWxvYWRfc2l6ZTsKLQkJcHBfZXZlbnRfcGFja2FnZSA9IGt6YWxsb2MocGF5bG9hZF9zaXplCi0JCQkJKyBzaXplb2Yoc3RydWN0IG1zbV9hZHNwX2V2ZW50X2RhdGEpLAotCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXBwX2V2ZW50X3BhY2thZ2UpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlwcF9ldmVudF9wYWNrYWdlLT5ldmVudF90eXBlID0gaTsKLQkJcHBfZXZlbnRfcGFja2FnZS0+cGF5bG9hZF9sZW4gPSBwYXlsb2FkX3NpemU7Ci0JCW1lbWNweSgodm9pZCAqKXBwX2V2ZW50X3BhY2thZ2UtPnBheWxvYWQsCi0JCQlkYXRhLT5wYXlsb2FkLCBwYXlsb2FkX3NpemUpOwotCQlhYy0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwKLQkJCSh2b2lkICopcHBfZXZlbnRfcGFja2FnZSwgYWMtPnByaXYpOwotCQlrZnJlZShwcF9ldmVudF9wYWNrYWdlKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBBU01fU0VTU0lPTl9DTURSU1BfQURKVVNUX1NFU1NJT05fQ0xPQ0tfVjI6Ci0JCXByX2RlYnVnKCIlczogQVNNX1NFU1NJT05fQ01EUlNQX0FESlVTVF9TRVNTSU9OX0NMT0NLX1YyIHNlc2lvbiAlZCBzdGF0dXMgMHgleCBtc3cgJXUgbHN3ICV1XG4iLAotCQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgcGF5bG9hZFswXSwgcGF5bG9hZFsyXSwKLQkJCSBwYXlsb2FkWzFdKTsKLQkJd2FrZV91cCgmYWMtPmNtZF93YWl0KTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fU0VTU0lPTl9DTURSU1BfR0VUX1BBVEhfREVMQVlfVjI6Ci0JCXByX2RlYnVnKCIlczogQVNNX1NFU1NJT05fQ01EUlNQX0dFVF9QQVRIX0RFTEFZX1YyIHNlc3Npb24gJWQgc3RhdHVzIDB4JXggbXN3ICV1IGxzdyAldVxuIiwKLQkJCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sIHBheWxvYWRbMF0sIHBheWxvYWRbMl0sCi0JCQkJcGF5bG9hZFsxXSk7Ci0JCWlmIChwYXlsb2FkWzBdID09IDApIHsKLQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOwotCQkJLyogaWdub3JlIG1zdywgYXMgYSBkZWxheSB0aGF0IGxhcmdlIHNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCWFjLT5wYXRoX2RlbGF5ID0gcGF5bG9hZFsxXTsKLQkJfSBlbHNlIHsKLQkJCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIHBheWxvYWRbMF0pOwotCQkJYWMtPnBhdGhfZGVsYXkgPSBVSU5UX01BWDsKLQkJfQotCQl3YWtlX3VwKCZhYy0+Y21kX3dhaXQpOwotCQlicmVhazsKLQl9Ci0JaWYgKGFjLT5jYikKLQkJYWMtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQlkYXRhLT5wYXlsb2FkLCBhYy0+cHJpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCAqcTZhc21faXNfY3B1X2J1Zl9hdmFpbChpbnQgZGlyLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgKnNpemUsCi0JCQkJdWludDMyX3QgKmluZGV4KQotewotCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgY2hhciBpZHg7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQotCWlmICghYWMgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKLQkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoYWMtPmlvX21vZGUgJiBTWU5DX0lPX01PREUpIHsKLQkJcG9ydCA9ICZhYy0+cG9ydFtkaXJdOwotCi0JCW11dGV4X2xvY2soJnBvcnQtPmxvY2spOwotCQlpZHggPSBwb3J0LT5jcHVfYnVmOwotCQlpZiAocG9ydC0+YnVmID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IEJ1ZmZlciBwb2ludGVyIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJCW11dGV4X3VubG9jaygmcG9ydC0+bG9jayk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBkaXIgMDogdXNlZCA9IDAgbWVhbnMgYnVmIGluIHVzZQotCQkgKiBkaXIgMTogdXNlZCA9IDEgbWVhbnMgYnVmIGluIHVzZQotCQkgKi8KLQkJaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gZGlyKSB7Ci0JCQkvKiBUbyBtYWtlIGl0IG1vcmUgcm9idXN0LCB3ZSBjb3VsZCBsb29wIGFuZCBnZXQgdGhlCi0JCQkgKiBuZXh0IGF2YWlsIGJ1ZiwgaXRzIHJpc2t5IHRob3VnaAotCQkJICovCi0JCQlwcl9lcnIoIiVzOiBOZXh0IGJ1ZiBpZHhbMHgleF0gbm90IGF2YWlsYWJsZSwgZGlyWyVkXVxuIiwKLQkJCSBfX2Z1bmNfXywgaWR4LCBkaXIpOwotCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCSpzaXplID0gcG9ydC0+YnVmW2lkeF0uYWN0dWFsX3NpemU7Ci0JCSppbmRleCA9IHBvcnQtPmNwdV9idWY7Ci0JCWRhdGEgPSBwb3J0LT5idWZbaWR4XS5kYXRhOwotCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdaW5kZXhbJWRdIGRhdGFbJXBLXXNpemVbJWRdXG4iLAotCQkJCQkJX19mdW5jX18sCi0JCQkJCQlhYy0+c2Vzc2lvbiwKLQkJCQkJCXBvcnQtPmNwdV9idWYsCi0JCQkJCQlkYXRhLCAqc2l6ZSk7Ci0JCS8qIEJ5IGRlZmF1bHQgaW5jcmVhc2UgdGhlIGNwdV9idWYgY250Ci0JCSAqIHVzZXIgYWNjZXNzZXMgdGhpcyBmdW5jdGlvbixpbmNyZWFzZSBjcHUKLQkJICogYnVmKHRvIGF2b2lkIGFub3RoZXIgYXBpKQotCQkgKi8KLQkJcG9ydC0+YnVmW2lkeF0udXNlZCA9IGRpcjsKLQkJcG9ydC0+Y3B1X2J1ZiA9IHE2YXNtX2dldF9uZXh0X2J1ZihhYywgcG9ydC0+Y3B1X2J1ZiwKLQkJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKLQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1pbnQgcTZhc21fY3B1X2J1Zl9yZWxlYXNlKGludCBkaXIsIHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGlkeDsKLQotCWlmICghYWMgfHwgKChkaXIgIT0gSU4pICYmIChkaXIgIT0gT1VUKSkpIHsKLQkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGFjLT5pb19tb2RlICYgU1lOQ19JT19NT0RFKSB7Ci0JCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKLQkJbXV0ZXhfbG9jaygmcG9ydC0+bG9jayk7Ci0JCWlkeCA9IHBvcnQtPmNwdV9idWY7Ci0JCWlmIChwb3J0LT5jcHVfYnVmID09IDApIHsKLQkJCXBvcnQtPmNwdV9idWYgPSBwb3J0LT5tYXhfYnVmX2NudCAtIDE7Ci0JCX0gZWxzZSBpZiAocG9ydC0+Y3B1X2J1ZiA8IHBvcnQtPm1heF9idWZfY250KSB7Ci0JCQlwb3J0LT5jcHVfYnVmID0gcG9ydC0+Y3B1X2J1ZiAtIDE7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBidWZmZXIgaW5kZXgoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcG9ydC0+Y3B1X2J1Zik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlwb3J0LT5idWZbcG9ydC0+Y3B1X2J1Zl0udXNlZCA9IGRpciBeIDE7Ci0JCW11dGV4X3VubG9jaygmcG9ydC0+bG9jayk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkICpxNmFzbV9pc19jcHVfYnVmX2F2YWlsX25vbG9jayhpbnQgZGlyLCBzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJdWludDMyX3QgKnNpemUsIHVpbnQzMl90ICppbmRleCkKLXsKLQl2b2lkICpkYXRhOwotCXVuc2lnbmVkIGNoYXIgaWR4OwotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0KLQlpZiAoIWFjIHx8ICgoZGlyICE9IElOKSAmJiAoZGlyICE9IE9VVCkpKSB7Ci0JCXByX2VycigiJXM6IGFjICVwSyBkaXIgJWRcbiIsIF9fZnVuY19fLCBhYywgZGlyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcG9ydCA9ICZhYy0+cG9ydFtkaXJdOwotCi0JaWR4ID0gcG9ydC0+Y3B1X2J1ZjsKLQlpZiAocG9ydC0+YnVmID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQnVmZmVyIHBvaW50ZXIgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyoKLQkgKiBkaXIgMDogdXNlZCA9IDAgbWVhbnMgYnVmIGluIHVzZQotCSAqIGRpciAxOiB1c2VkID0gMSBtZWFucyBidWYgaW4gdXNlCi0JICovCi0JaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gZGlyKSB7Ci0JCS8qCi0JCSAqIFRvIG1ha2UgaXQgbW9yZSByb2J1c3QsIHdlIGNvdWxkIGxvb3AgYW5kIGdldCB0aGUKLQkJICogbmV4dCBhdmFpbCBidWYsIGl0cyByaXNreSB0aG91Z2gKLQkJICovCi0JCXByX2VycigiJXM6IE5leHQgYnVmIGlkeFsweCV4XSBub3QgYXZhaWxhYmxlLCBkaXJbJWRdXG4iLAotCQkgX19mdW5jX18sIGlkeCwgZGlyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSpzaXplID0gcG9ydC0+YnVmW2lkeF0uYWN0dWFsX3NpemU7Ci0JKmluZGV4ID0gcG9ydC0+Y3B1X2J1ZjsKLQlkYXRhID0gcG9ydC0+YnVmW2lkeF0uZGF0YTsKLQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdaW5kZXhbJWRdIGRhdGFbJXBLXXNpemVbJWRdXG4iLAotCQlfX2Z1bmNfXywgYWMtPnNlc3Npb24sIHBvcnQtPmNwdV9idWYsCi0JCWRhdGEsICpzaXplKTsKLQkvKgotCSAqIEJ5IGRlZmF1bHQgaW5jcmVhc2UgdGhlIGNwdV9idWYgY250Ci0JICogdXNlciBhY2Nlc3NlcyB0aGlzIGZ1bmN0aW9uLGluY3JlYXNlIGNwdQotCSAqIGJ1Zih0byBhdm9pZCBhbm90aGVyIGFwaSkKLQkgKi8KLQlwb3J0LT5idWZbaWR4XS51c2VkID0gZGlyOwotCXBvcnQtPmNwdV9idWYgPSBxNmFzbV9nZXRfbmV4dF9idWYoYWMsIHBvcnQtPmNwdV9idWYsCi0JCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotaW50IHE2YXNtX2lzX2RzcF9idWZfYXZhaWwoaW50IGRpciwgc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IHJldCA9IC0xOwotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQ7Ci0JdWludDMyX3QgaWR4OwotCi0JaWYgKCFhYyB8fCAoZGlyICE9IE9VVCkpIHsKLQkJcHJfZXJyKCIlczogYWMgJXBLIGRpciAlZFxuIiwgX19mdW5jX18sIGFjLCBkaXIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W2Rpcl07Ci0KLQkJbXV0ZXhfbG9jaygmcG9ydC0+bG9jayk7Ci0JCWlkeCA9IHBvcnQtPmRzcF9idWY7Ci0KLQkJaWYgKHBvcnQtPmJ1ZltpZHhdLnVzZWQgPT0gKGRpciBeIDEpKSB7Ci0JCQkvKiBUbyBtYWtlIGl0IG1vcmUgcm9idXN0LCB3ZSBjb3VsZCBsb29wIGFuZCBnZXQgdGhlCi0JCQkgKiBuZXh0IGF2YWlsIGJ1ZiwgaXRzIHJpc2t5IHRob3VnaAotCQkJICovCi0JCQlwcl9lcnIoIiVzOiBOZXh0IGJ1ZiBpZHhbMHgleF0gbm90IGF2YWlsYWJsZSwgZGlyWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgaWR4LCBkaXIpOwotCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXWRzcF9idWY9JWQgY3B1X2J1Zj0lZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJYWMtPnNlc3Npb24sIHBvcnQtPmRzcF9idWYsIHBvcnQtPmNwdV9idWYpOwotCQlyZXQgPSAoKHBvcnQtPmRzcF9idWYgIT0gcG9ydC0+Y3B1X2J1ZikgPyAwIDogLTEpOwotCQltdXRleF91bmxvY2soJnBvcnQtPmxvY2spOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX3E2YXNtX2FkZF9oZHIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHN0cnVjdCBhcHJfaGRyICpoZHIsCi0JCQl1aW50MzJfdCBwa3Rfc2l6ZSwgdWludDMyX3QgY21kX2ZsZywgdWludDMyX3Qgc3RyZWFtX2lkKQotewotCWRldl92ZGJnKGFjLT5kZXYsICIlczogcGt0X3NpemU9JWQgY21kX2ZsZz0lZCBzZXNzaW9uPSVkIHN0cmVhbV9pZD0lZFxuIiwKLQkJCV9fZnVuY19fLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnNlc3Npb24sIHN0cmVhbV9pZCk7Ci0JbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTCIsIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCi0JCQlBUFJfUEtUX1ZFUik7Ci0JaGRyLT5zcmNfc3ZjID0gKChzdHJ1Y3QgYXByX3N2YyAqKWFjLT5hcHIpLT5pZDsKLQloZHItPnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JaGRyLT5kZXN0X3N2YyA9IEFQUl9TVkNfQVNNOwotCWhkci0+ZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JaGRyLT5zcmNfcG9ydCA9ICgoYWMtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgKHN0cmVhbV9pZCk7Ci0JaGRyLT5kZXN0X3BvcnQgPSAoKGFjLT5zZXNzaW9uIDw8IDgpICYgMHhGRjAwKSB8IChzdHJlYW1faWQpOwotCWlmIChjbWRfZmxnKQotCQlxNmFzbV91cGRhdGVfdG9rZW4oJmhkci0+dG9rZW4sCi0JCQkJICAgYWMtPnNlc3Npb24sCi0JCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCi0JCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCi0JCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KLQkJCQkgICBXQUlUX0NNRCk7Ci0KLQloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOwotCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKQotewotCV9fcTZhc21fYWRkX2hkcihhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnN0cmVhbV9pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHE2YXNtX3N0cmVhbV9hZGRfaGRyKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcsIGludDMyX3Qgc3RyZWFtX2lkKQotewotCV9fcTZhc21fYWRkX2hkcihhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywgc3RyZWFtX2lkKTsKLX0KLQotc3RhdGljIHZvaWQgX19xNmFzbV9hZGRfaGRyX2FzeW5jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJCSAgdWludDMyX3QgcGt0X3NpemUsIHVpbnQzMl90IGNtZF9mbGcsCi0JCQkJICB1aW50MzJfdCBzdHJlYW1faWQsIHU4IG5vX3dhaXRfZmxhZykKLXsKLQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHBrdF9zaXplID0gJWQsIGNtZF9mbGcgPSAlZCwgc2Vzc2lvbiA9ICVkIHN0cmVhbV9pZD0lZFxuIiwKLQkJCV9fZnVuY19fLCBwa3Rfc2l6ZSwgY21kX2ZsZywgYWMtPnNlc3Npb24sIHN0cmVhbV9pZCk7Ci0JaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJQVBSX0hEUl9MRU4oc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSksCi0JCQlBUFJfUEtUX1ZFUik7Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQloZHItPnNyY19zdmMgPSAoKHN0cnVjdCBhcHJfc3ZjICopYWMtPmFwciktPmlkOwotCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQloZHItPmRlc3Rfc3ZjID0gQVBSX1NWQ19BU007Ci0JaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQloZHItPnNyY19wb3J0ID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkYwMCkgfCAoc3RyZWFtX2lkKTsKLQloZHItPmRlc3RfcG9ydCA9ICgoYWMtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgKHN0cmVhbV9pZCk7Ci0JaWYgKGNtZF9mbGcpIHsKLQkJcTZhc21fdXBkYXRlX3Rva2VuKCZoZHItPnRva2VuLAotCQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLwotCQkJCSAgIDAsIC8qIEJ1ZmZlciBpbmRleCBpcyBOQSAqLwotCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCi0JCQkJICAgbm9fd2FpdF9mbGFnKTsKLQotCX0KLQloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOwotfQotCi1zdGF0aWMgdm9pZCBxNmFzbV9hZGRfaGRyX2FzeW5jKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBzdHJ1Y3QgYXByX2hkciAqaGRyLAotCQkJCXVpbnQzMl90IHBrdF9zaXplLCB1aW50MzJfdCBjbWRfZmxnKQotewotCV9fcTZhc21fYWRkX2hkcl9hc3luYyhhYywgaGRyLCBwa3Rfc2l6ZSwgY21kX2ZsZywKLQkJCSAgICAgIGFjLT5zdHJlYW1faWQsIFdBSVRfQ01EKTsKLX0KLQotc3RhdGljIHZvaWQgcTZhc21fc3RyZWFtX2FkZF9oZHJfYXN5bmMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCXN0cnVjdCBhcHJfaGRyICpoZHIsIHVpbnQzMl90IHBrdF9zaXplLAotCQkJCQl1aW50MzJfdCBjbWRfZmxnLCBpbnQzMl90IHN0cmVhbV9pZCkKLXsKLQlfX3E2YXNtX2FkZF9oZHJfYXN5bmMoYWMsIGhkciwgcGt0X3NpemUsIGNtZF9mbGcsCi0JCQkgICAgICBzdHJlYW1faWQsIE5PX1dBSVRfQ01EKTsKLX0KLQotc3RhdGljIHZvaWQgcTZhc21fYWRkX2hkcl9jdXN0b21fdG9wb2xvZ3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCQkJICB1aW50MzJfdCBwa3Rfc2l6ZSkKLXsKLQlwcl9kZWJ1ZygiJXM6IHBrdF9zaXplPSVkIHNlc3Npb249JWRcbiIsCi0JCQlfX2Z1bmNfXywgcGt0X3NpemUsIGFjLT5zZXNzaW9uKTsKLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKLQloZHItPmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihzaXplb2Yoc3RydWN0IGFwcl9oZHIpKSwKLQkJCUFQUl9QS1RfVkVSKTsKLQloZHItPnNyY19zdmMgPSAoKHN0cnVjdCBhcHJfc3ZjICopYWMtPmFwciktPmlkOwotCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQloZHItPmRlc3Rfc3ZjID0gQVBSX1NWQ19BU007Ci0JaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQloZHItPnNyY19wb3J0ID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkYwMCkgfCAweDAxOwotCWhkci0+ZGVzdF9wb3J0ID0gMDsKLQlxNmFzbV91cGRhdGVfdG9rZW4oJmhkci0+dG9rZW4sCi0JCQkgICBhYy0+c2Vzc2lvbiwKLQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLwotCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCi0JCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJICAgV0FJVF9DTUQpOwotCWhkci0+cGt0X3NpemUgID0gcGt0X3NpemU7Ci0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBxNmFzbV9hZGRfbW1hcGhkcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCXUzMiBwa3Rfc2l6ZSwgaW50IGRpcikKLXsKLQlwcl9kZWJ1ZygiJXM6IHBrdCBzaXplPSVkXG4iLAotCQlfX2Z1bmNfXywgcGt0X3NpemUpOwotCWhkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JaGRyLT5zcmNfcG9ydCA9IDA7Ci0JaGRyLT5kZXN0X3BvcnQgPSAwOwotCXE2YXNtX3VwZGF0ZV90b2tlbigmaGRyLT50b2tlbiwKLQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCi0JCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KLQkJCSAgIGRpciwKLQkJCSAgIFdBSVRfQ01EKTsKLQloZHItPnBrdF9zaXplICA9IHBrdF9zaXplOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fb3Blbl9yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCSAgICAgdWludDMyX3QgcGNtX2Zvcm1hdF9ibG9ja192ZXIsCi0JCQkgICAgIGJvb2wgdHNfbW9kZSkKLXsKLQlpbnQgcmMgPSAweDAwOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWRfdjMgb3BlbjsKLQotCWNvbmZpZ19kZWJ1Z19mc19yZXNldF9pbmRleCgpOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQotCXE2YXNtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0Jb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEX1YzOwotCS8qIFN0cmVhbSBwcmlvIDogSGlnaCwgcHJvdmlkZSBtZXRhIGluZm8gd2l0aCBlbmNvZGVkIGZyYW1lcyAqLwotCW9wZW4uc3JjX2VuZHBvaW50eXBlID0gQVNNX0VORF9QT0lOVF9ERVZJQ0VfTUFUUklYOwotCi0Jb3Blbi5wcmVwcm9jb3BvX2lkID0gcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwoKTsKLQlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQlvcGVuLm1vZGVfZmxhZ3MgPSAweDA7Ci0KLQlhYy0+dG9wb2xvZ3kgPSBvcGVuLnByZXByb2NvcG9faWQ7Ci0JYWMtPmFwcF90eXBlID0gcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwoKTsKLQlpZiAoYWMtPnBlcmZfbW9kZSA9PSBMT1dfTEFURU5DWV9QQ01fTU9ERSkgewotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX0xPV19MQVRFTkNZX1RYX1NUUkVBTV9TRVNTSU9OIDw8Ci0JCQlBU01fU0hJRlRfU1RSRUFNX1BFUkZfTU9ERV9GTEFHX0lOX09QRU5fUkVBRDsKLQl9IGVsc2UgewotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX0xFR0FDWV9TVFJFQU1fU0VTU0lPTiA8PAotCQkJQVNNX1NISUZUX1NUUkVBTV9QRVJGX01PREVfRkxBR19JTl9PUEVOX1JFQUQ7Ci0JfQotCi0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIEZPUk1BVF9MSU5FQVJfUENNOgotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gMHgwMDsKLQkJb3Blbi5lbmNfY2ZnX2lkID0gcTZhc21fZ2V0X3BjbV9mb3JtYXRfaWQocGNtX2Zvcm1hdF9ibG9ja192ZXIpOwotCQlpZiAodHNfbW9kZSkKLQkJCW9wZW4ubW9kZV9mbGFncyB8PSBBQlNPTFVURV9USU1FU1RBTVBfRU5BQkxFOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9NUEVHNF9BQUM6Ci0JCW9wZW4ubW9kZV9mbGFncyB8PSBCVUZGRVJfTUVUQV9FTkFCTEU7Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfQUFDX1YyOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9HNzExX0FMQVdfRlM6Ci0JCW9wZW4ubW9kZV9mbGFncyB8PSBCVUZGRVJfTUVUQV9FTkFCTEU7Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9BTEFXX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9HNzExX01MQVdfRlM6Ci0JCW9wZW4ubW9kZV9mbGFncyB8PSBCVUZGRVJfTUVUQV9FTkFCTEU7Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9NTEFXX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9WMTNLOgotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOwotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX1YxM0tfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0VWUkM6Ci0JCW9wZW4ubW9kZV9mbGFncyB8PSBCVUZGRVJfTUVUQV9FTkFCTEU7Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRVZSQ19GUzsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfQU1STkI6Ci0JCW9wZW4ubW9kZV9mbGFncyB8PSBCVUZGRVJfTUVUQV9FTkFCTEU7Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfQU1STkJfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FNUldCOgotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQlVGRkVSX01FVEFfRU5BQkxFOwotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FNUldCX0ZTOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGZvcm1hdCAweCV4XG4iLAotCQkJX19mdW5jX18sIGZvcm1hdCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZvcGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3Igb3BlbiByZWFkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JYWMtPmlvX21vZGUgfD0gVFVOX1JFQURfSU9fTU9ERTsKLQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fb3Blbl9yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQl1aW50MzJfdCBmb3JtYXQpCi17Ci0JcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkKGFjLCBmb3JtYXQsIDE2LAotCQkJCVBDTV9NRURJQV9GT1JNQVRfVjIgLyptZWRpYSBmbXQgYmxvY2sgdmVyKi8sCi0JCQkJZmFsc2UvKnRzX21vZGUqLyk7Ci19Ci0KLWludCBxNmFzbV9vcGVuX3JlYWRfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKLXsKLQlyZXR1cm4gX19xNmFzbV9vcGVuX3JlYWQoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAotCQkJCSBQQ01fTUVESUFfRk9STUFUX1YyIC8qbWVkaWEgZm10IGJsb2NrIHZlciovLAotCQkJCSBmYWxzZS8qdHNfbW9kZSovKTsKLX0KLQotLyoKLSAqIGFzbV9vcGVuX3JlYWRfdjMgLSBPcGVucyBhdWRpbyBjYXB0dXJlIHNlc3Npb24KLSAqCi0gKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQotICogQGZvcm1hdDogZW5jb2RlciBmb3JtYXQKLSAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBjYXB0dXJlIHNlc3Npb24KLSAqLwotaW50IHE2YXNtX29wZW5fcmVhZF92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQotewotCXJldHVybiBfX3E2YXNtX29wZW5fcmVhZChhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJIFBDTV9NRURJQV9GT1JNQVRfVjMvKm1lZGlhIGZtdCBibG9jayB2ZXIqLywKLQkJCQkgZmFsc2UvKnRzX21vZGUqLyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX29wZW5fcmVhZF92Myk7Ci0KLS8qCi0gKiBhc21fb3Blbl9yZWFkX3Y0IC0gT3BlbnMgYXVkaW8gY2FwdHVyZSBzZXNzaW9uCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEBmb3JtYXQ6IGVuY29kZXIgZm9ybWF0Ci0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgY2FwdHVyZSBzZXNzaW9uCi0gKiBAdHNfbW9kZTogdGltZXN0YW1wIG1vZGUKLSAqLwotaW50IHE2YXNtX29wZW5fcmVhZF92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBib29sIHRzX21vZGUpCi17Ci0JcmV0dXJuIF9fcTZhc21fb3Blbl9yZWFkKGFjLCBmb3JtYXQsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkgUENNX01FRElBX0ZPUk1BVF9WNCAvKm1lZGlhIGZtdCBibG9jayB2ZXIqLywKLQkJCQkgdHNfbW9kZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX29wZW5fcmVhZF92NCk7Ci0KLWludCBxNmFzbV9vcGVuX3dyaXRlX2NvbXByZXNzZWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCQl1aW50MzJfdCBwYXNzdGhyb3VnaF9mbGFnKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fd3JpdGVfY29tcHJlc3NlZCBvcGVuOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYWNbJXBLXSBOVUxMXG4iLCAgX19mdW5jX18sIGFjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZVslcEtdIE5VTExcbiIsIF9fZnVuY19fLCAgYWMtPmFwcik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXSB3cl9mb3JtYXRbMHgleF0iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24sCi0JCWZvcm1hdCk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmb3Blbi5oZHIsIHNpemVvZihvcGVuKSwgVFJVRSk7Ci0Jb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9XUklURV9DT01QUkVTU0VEOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCXN3aXRjaCAoZm9ybWF0KSB7Ci0JY2FzZSBGT1JNQVRfQUMzOgotCQlvcGVuLmZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQUMzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FQUMzOgotCQlvcGVuLmZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRUFDMzsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfRFRTOgotCQlvcGVuLmZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRFRTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9EU0Q6Ci0JCW9wZW4uZm10X2lkID0gQVNNX01FRElBX0ZNVF9EU0Q7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0dFTl9DT01QUjoKLQkJb3Blbi5mbXRfaWQgPSBBU01fTUVESUFfRk1UX0dFTkVSSUNfQ09NUFJFU1NFRDsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfVFJVRUhEOgotCQlvcGVuLmZtdF9pZCA9IEFTTV9NRURJQV9GTVRfVFJVRUhEOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9JRUM2MTkzNzoKLQkJb3Blbi5mbXRfaWQgPSBBU01fTUVESUFfRk1UX0lFQzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgZm9ybWF0KTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQkvKiBCZWxvdyBmbGFnIGluZGljYXRlcyB0aGUgRFNQIHRoYXQgQ29tcHJlc3NlZCBhdWRpbyBpbnB1dAotCSAqIHN0cmVhbSBpcyBub3QgSUVDIDYxOTM3IG9yIElFQyA2MDk1OCBwYWNrZXRpemllZAotCSAqLwotCWlmIChwYXNzdGhyb3VnaF9mbGFnID09IENPTVBSRVNTRURfUEFTU1RIUk9VR0ggfHwKLQkJcGFzc3Rocm91Z2hfZmxhZyA9PSBDT01QUkVTU0VEX1BBU1NUSFJPVUdIX0RTRCB8fAotCQlwYXNzdGhyb3VnaF9mbGFnID09IENPTVBSRVNTRURfUEFTU1RIUk9VR0hfR0VOKSB7Ci0JCW9wZW4uZmxhZ3MgPSAweDA7Ci0JCXByX2RlYnVnKCIlczogRmxhZyAwIENPTVBSRVNTRURfUEFTU1RIUk9VR0hcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgaWYgKHBhc3N0aHJvdWdoX2ZsYWcgPT0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9DT05WRVJUKSB7Ci0JCW9wZW4uZmxhZ3MgPSAweDg7Ci0JCXByX2RlYnVnKCIlczogRmxhZyA4IC0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9DT05WRVJUXG4iLAotCQkJIF9fZnVuY19fKTsKLQl9IGVsc2UgaWYgKHBhc3N0aHJvdWdoX2ZsYWcgPT0gQ09NUFJFU1NFRF9QQVNTVEhST1VHSF9JRUM2MTkzNykgewotCQlvcGVuLmZsYWdzID0gMHgxOwotCQlwcl9kZWJ1ZygiJXM6IEZsYWcgMSAtIENPTVBSRVNTRURfUEFTU1RIUk9VR0hfSUVDNjE5MzdcbiIsCi0JCQkgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcGFzc3Rocm91Z2ggdHlwZVslZF1cbiIsCi0JCQlfX2Z1bmNfXywgcGFzc3Rocm91Z2hfZmxhZyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZvcGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJX19mdW5jX18sIG9wZW4uaGRyLm9wY29kZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgMSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIE9QRU5fV1JJVEVfQ09NUFIgcmNbJWRdXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fb3Blbl93cml0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCB1aW50MzJfdCBzdHJlYW1faWQsCi0JCQkgICAgICBib29sIGlzX2dhcGxlc3NfbW9kZSwKLQkJCSAgICAgIHVpbnQzMl90IHBjbV9mb3JtYXRfYmxvY2tfdmVyKQotewotCWludCByYyA9IDB4MDA7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fd3JpdGVfdjMgb3BlbjsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXSB3cl9mb3JtYXRbMHgleF1cbiIsCi0JCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZm9ybWF0KTsKLQotCXE2YXNtX3N0cmVhbV9hZGRfaGRyKGFjLCAmb3Blbi5oZHIsIHNpemVvZihvcGVuKSwgVFJVRSwgc3RyZWFtX2lkKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JLyoKLQkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCi0JICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCi0JICogYXNzb2NpYXRlZAotCSAqLwotCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQotCQlxNmFzbV91cGRhdGVfdG9rZW4oJm9wZW4uaGRyLnRva2VuLAotCQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJCSAgIHN0cmVhbV9pZCwKLQkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIFdBSVRfQ01EKTsKLQotCWRldl92ZGJnKGFjLT5kZXYsICIlczogdG9rZW4gPSAweCV4LCBzdHJlYW1faWQgICVkLCBzZXNzaW9uIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgb3Blbi5oZHIudG9rZW4sIHN0cmVhbV9pZCwgYWMtPnNlc3Npb24pOwotCW9wZW4uaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX09QRU5fV1JJVEVfVjM7Ci0Jb3Blbi5tb2RlX2ZsYWdzID0gMHgwMDsKLQlpZiAoYWMtPnBlcmZfbW9kZSA9PSBVTExfUE9TVF9QUk9DRVNTSU5HX1BDTV9NT0RFKQotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX1VMTF9QT1NUX1BST0NFU1NJTkdfU1RSRUFNX1NFU1NJT047Ci0JZWxzZSBpZiAoYWMtPnBlcmZfbW9kZSA9PSBVTFRSQV9MT1dfTEFURU5DWV9QQ01fTU9ERSkKLQkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9VTFRSQV9MT1dfTEFURU5DWV9TVFJFQU1fU0VTU0lPTjsKLQllbHNlIGlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKQotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX0xPV19MQVRFTkNZX1NUUkVBTV9TRVNTSU9OOwotCWVsc2UgewotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX0xFR0FDWV9TVFJFQU1fU0VTU0lPTjsKLQkJaWYgKGlzX2dhcGxlc3NfbW9kZSkKLQkJCW9wZW4ubW9kZV9mbGFncyB8PSAxIDw8IEFTTV9TSElGVF9HQVBMRVNTX01PREVfRkxBRzsKLQl9Ci0KLQkvKiBzb3VyY2UgZW5kcG9pbnQgOiBtYXRyaXggKi8KLQlvcGVuLnNpbmtfZW5kcG9pbnR5cGUgPSBBU01fRU5EX1BPSU5UX0RFVklDRV9NQVRSSVg7Ci0Jb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0KLQlvcGVuLnBvc3Rwcm9jb3BvX2lkID0gcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwoKTsKLQlpZiAoYWMtPnBlcmZfbW9kZSAhPSBMRUdBQ1lfUENNX01PREUpCi0JCW9wZW4ucG9zdHByb2NvcG9faWQgPSBBU01fU1RSRUFNX1BPU1RQUk9DT1BPX0lEX05PTkU7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBlcmZfbW9kZSAlZCBhc21fdG9wb2xvZ3kgMHgleCBicHMgJWRcbiIsIF9fZnVuY19fLAotCQkgYWMtPnBlcmZfbW9kZSwgb3Blbi5wb3N0cHJvY29wb19pZCwgb3Blbi5iaXRzX3Blcl9zYW1wbGUpOwotCi0JLyoKLQkgKiBGb3IgR2FwbGVzcyBwbGF5YmFjayBpdCB3aWxsIHVzZSB0aGUgc2FtZSBzZXNzaW9uIGZvciBuZXh0IHN0cmVhbSwKLQkgKiBTbyB1c2UgdGhlIHNhbWUgdG9wb2xvZ3kKLQkgKi8KLQlpZiAoIWFjLT50b3BvbG9neSkgewotCQlhYy0+dG9wb2xvZ3kgPSBvcGVuLnBvc3Rwcm9jb3BvX2lkOwotCQlhYy0+YXBwX3R5cGUgPSBxNmFzbV9nZXRfYXNtX2FwcF90eXBlX2NhbCgpOwotCX0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgRk9STUFUX0xJTkVBUl9QQ006Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IHE2YXNtX2dldF9wY21fZm9ybWF0X2lkKHBjbV9mb3JtYXRfYmxvY2tfdmVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfTVBFRzRfQUFDOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfTVBFRzRfTVVMVElfQUFDOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FBQ19WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfV01BX1Y5OgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX1dNQV9WOV9WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfV01BX1YxMFBSTzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9XTUFfVjEwUFJPX1YyOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9NUDM6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfTVAzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BQzM6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQUMzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FQUMzOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0VBQzM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX01QMjoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9NUDI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0ZMQUM6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRkxBQzsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfQUxBQzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BTEFDOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9WT1JCSVM6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfVk9SQklTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BUEU6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQVBFOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9EU0Q6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRFNEOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BUFRYOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FQVFg7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0dFTl9DT01QUjoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9HRU5FUklDX0NPTVBSRVNTRUQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0IDB4JXhcbiIsIF9fZnVuY19fLCBmb3JtYXQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBvcGVuIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG9wZW4gd3JpdGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWFjLT5pb19tb2RlIHw9IFRVTl9XUklURV9JT19NT0RFOwotCi0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9vcGVuX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmb3JtYXQpCi17Ci0JcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCAxNiwgYWMtPnN0cmVhbV9pZCwKLQkJCQkgIGZhbHNlIC8qZ2FwbGVzcyovLAotCQkJCSAgUENNX01FRElBX0ZPUk1BVF9WMiAvKnBjbV9mb3JtYXRfYmxvY2tfdmVyKi8pOwotfQotCi1pbnQgcTZhc21fb3Blbl93cml0ZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQotewotCXJldHVybiBfX3E2YXNtX29wZW5fd3JpdGUoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAotCQkJCSAgYWMtPnN0cmVhbV9pZCwgZmFsc2UgLypnYXBsZXNzKi8sCi0JCQkJICBQQ01fTUVESUFfRk9STUFUX1YyIC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Ci19Ci0KLS8qCi0gKiBxNmFzbV9vcGVuX3dyaXRlX3YzIC0gT3BlbnMgYXVkaW8gcGxheWJhY2sgc2Vzc2lvbgotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAZm9ybWF0OiBkZWNvZGVyIGZvcm1hdAotICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIHBsYXliYWNrIHNlc3Npb24KLSAqLwotaW50IHE2YXNtX29wZW5fd3JpdGVfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKLXsKLQlyZXR1cm4gX19xNmFzbV9vcGVuX3dyaXRlKGFjLCBmb3JtYXQsIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkgIGFjLT5zdHJlYW1faWQsIGZhbHNlIC8qZ2FwbGVzcyovLAotCQkJCSAgUENNX01FRElBX0ZPUk1BVF9WMyAvKnBjbV9mb3JtYXRfYmxvY2tfdmVyKi8pOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9vcGVuX3dyaXRlX3YzKTsKLQotLyoKLSAqIHE2YXNtX29wZW5fd3JpdGVfdjQgLSBPcGVucyBhdWRpbyBwbGF5YmFjayBzZXNzaW9uCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEBmb3JtYXQ6IGRlY29kZXIgZm9ybWF0Ci0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgcGxheWJhY2sgc2Vzc2lvbgotICovCi1pbnQgcTZhc21fb3Blbl93cml0ZV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQotewotCXJldHVybiBfX3E2YXNtX29wZW5fd3JpdGUoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAotCQkJCSAgYWMtPnN0cmVhbV9pZCwgZmFsc2UgLypnYXBsZXNzKi8sCi0JCQkJICBQQ01fTUVESUFfRk9STUFUX1Y0IC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX29wZW5fd3JpdGVfdjQpOwotCi1pbnQgcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludDMyX3Qgc3RyZWFtX2lkLAotCQkJICAgICAgIGJvb2wgaXNfZ2FwbGVzc19tb2RlKQotewotCXJldHVybiBfX3E2YXNtX29wZW5fd3JpdGUoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAotCQkJCSAgc3RyZWFtX2lkLCBpc19nYXBsZXNzX21vZGUsCi0JCQkJICBQQ01fTUVESUFfRk9STUFUX1YyIC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Ci19Ci0KLS8qCi0gKiBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92MyAtIENyZWF0ZXMgYXVkaW8gc3RyZWFtIGZvciBwbGF5YmFjawotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAZm9ybWF0OiBhc20gcGxheWJhY2sgZm9ybWF0Ci0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgcmVxdWVzdGVkIHN0cmVhbQotICogQHN0cmVhbV9pZDogc3RyZWFtIGlkIG9mIHN0cmVhbSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXNzaW9uCi0gKiBAaXNfZ2FwbGVzc19tb2RlOiB0cnVlIGlmIGdhcGxlc3MgbW9kZSBuZWVkcyB0byBiZSBlbmFibGVkCi0gKi8KLWludCBxNmFzbV9zdHJlYW1fb3Blbl93cml0ZV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZm9ybWF0LAotCQkJICAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgaW50MzJfdCBzdHJlYW1faWQsCi0JCQkgICAgICAgYm9vbCBpc19nYXBsZXNzX21vZGUpCi17Ci0JcmV0dXJuIF9fcTZhc21fb3Blbl93cml0ZShhYywgZm9ybWF0LCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJICBzdHJlYW1faWQsIGlzX2dhcGxlc3NfbW9kZSwKLQkJCQkgIFBDTV9NRURJQV9GT1JNQVRfVjMgLypwY21fZm9ybWF0X2Jsb2NrX3ZlciovKTsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjMpOwotCi0vKgotICogcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQgLSBDcmVhdGVzIGF1ZGlvIHN0cmVhbSBmb3IgcGxheWJhY2sKLSAqCi0gKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQotICogQGZvcm1hdDogYXNtIHBsYXliYWNrIGZvcm1hdAotICogQGJpdHNfcGVyX3NhbXBsZTogYml0IHdpZHRoIG9mIHJlcXVlc3RlZCBzdHJlYW0KLSAqIEBzdHJlYW1faWQ6IHN0cmVhbSBpZCBvZiBzdHJlYW0gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgotICogQGlzX2dhcGxlc3NfbW9kZTogdHJ1ZSBpZiBnYXBsZXNzIG1vZGUgbmVlZHMgdG8gYmUgZW5hYmxlZAotICovCi1pbnQgcTZhc21fc3RyZWFtX29wZW5fd3JpdGVfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZvcm1hdCwKLQkJCSAgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGludDMyX3Qgc3RyZWFtX2lkLAotCQkJICAgICAgIGJvb2wgaXNfZ2FwbGVzc19tb2RlKQotewotCXJldHVybiBfX3E2YXNtX29wZW5fd3JpdGUoYWMsIGZvcm1hdCwgYml0c19wZXJfc2FtcGxlLAotCQkJCSAgc3RyZWFtX2lkLCBpc19nYXBsZXNzX21vZGUsCi0JCQkJICBQQ01fTUVESUFfRk9STUFUX1Y0IC8qcGNtX2Zvcm1hdF9ibG9ja192ZXIqLyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX3N0cmVhbV9vcGVuX3dyaXRlX3Y0KTsKLQotc3RhdGljIGludCBfX3E2YXNtX29wZW5fcmVhZF93cml0ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmRfZm9ybWF0LAotCQkJCSAgIHVpbnQzMl90IHdyX2Zvcm1hdCwgYm9vbCBpc19tZXRhX2RhdGFfbW9kZSwKLQkJCQkgICB1aW50MzJfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJICAgYm9vbCBvdmVyd3JpdGVfdG9wb2xvZ3ksIGludCB0b3BvbG9neSkKLXsKLQlpbnQgcmMgPSAweDAwOwotCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3JlYWR3cml0ZV92MiBvcGVuOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQlwcl9kZWJ1ZygiJXM6IHdyX2Zvcm1hdFsweCV4XXJkX2Zvcm1hdFsweCV4XVxuIiwKLQkJCV9fZnVuY19fLCB3cl9mb3JtYXQsIHJkX2Zvcm1hdCk7Ci0KLQlhYy0+aW9fbW9kZSB8PSBOVF9NT0RFOwotCXE2YXNtX2FkZF9oZHIoYWMsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0Jb3Blbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfT1BFTl9SRUFEV1JJVEVfVjI7Ci0KLQlvcGVuLm1vZGVfZmxhZ3MgPSBpc19tZXRhX2RhdGFfbW9kZSA/IEJVRkZFUl9NRVRBX0VOQUJMRSA6IDA7Ci0Jb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0JLyogc291cmNlIGVuZHBvaW50IDogbWF0cml4ICovCi0Jb3Blbi5wb3N0cHJvY29wb19pZCA9IHE2YXNtX2dldF9hc21fdG9wb2xvZ3lfY2FsKCk7Ci0KLQlvcGVuLnBvc3Rwcm9jb3BvX2lkID0gb3ZlcndyaXRlX3RvcG9sb2d5ID8KLQkJCSAgICAgIHRvcG9sb2d5IDogb3Blbi5wb3N0cHJvY29wb19pZDsKLQlhYy0+dG9wb2xvZ3kgPSBvcGVuLnBvc3Rwcm9jb3BvX2lkOwotCWFjLT5hcHBfdHlwZSA9IHE2YXNtX2dldF9hc21fYXBwX3R5cGVfY2FsKCk7Ci0KLQotCXN3aXRjaCAod3JfZm9ybWF0KSB7Ci0JY2FzZSBGT1JNQVRfTElORUFSX1BDTToKLQljYXNlIEZPUk1BVF9NVUxUSV9DSEFOTkVMX0xJTkVBUl9QQ006Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX01QRUc0X0FBQzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BQUNfVjI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX01QRUc0X01VTFRJX0FBQzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BQUNfVjI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1dNQV9WOToKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9XTUFfVjlfVjI7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX1dNQV9WMTBQUk86Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfV01BX1YxMFBST19WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfQU1STkI6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfQU1STkJfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FNUldCOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FNUldCX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BTVJfV0JfUExVUzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BTVJfV0JfUExVU19WMjsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfVjEzSzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9WMTNLX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FVlJDOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0VWUkNfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0VWUkNCOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0VWUkNCX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FVlJDV0I6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfRVZSQ1dCX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9NUDM6Ci0JCW9wZW4uZGVjX2ZtdF9pZCA9IEFTTV9NRURJQV9GTVRfTVAzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BTEFDOgotCQlvcGVuLmRlY19mbXRfaWQgPSBBU01fTUVESUFfRk1UX0FMQUM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FQRToKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9BUEU7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0RTRDoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9EU0Q7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0c3MTFfQUxBV19GUzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9HNzExX0FMQVdfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0c3MTFfTUxBV19GUzoKLQkJb3Blbi5kZWNfZm10X2lkID0gQVNNX01FRElBX0ZNVF9HNzExX01MQVdfRlM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHdyX2Zvcm1hdCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlzd2l0Y2ggKHJkX2Zvcm1hdCkgewotCWNhc2UgRk9STUFUX0xJTkVBUl9QQ006Ci0JY2FzZSBGT1JNQVRfTVVMVElfQ0hBTk5FTF9MSU5FQVJfUENNOgotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9NUEVHNF9BQUM6Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfQUFDX1YyOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9HNzExX0FMQVdfRlM6Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9BTEFXX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9HNzExX01MQVdfRlM6Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRzcxMV9NTEFXX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9WMTNLOgotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX1YxM0tfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0VWUkM6Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfRVZSQ19GUzsKLQkJYnJlYWs7Ci0JY2FzZSBGT1JNQVRfQU1STkI6Ci0JCW9wZW4uZW5jX2NmZ19pZCA9IEFTTV9NRURJQV9GTVRfQU1STkJfRlM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FNUldCOgotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FNUldCX0ZTOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BTEFDOgotCQlvcGVuLmVuY19jZmdfaWQgPSBBU01fTUVESUFfRk1UX0FMQUM7Ci0JCWJyZWFrOwotCWNhc2UgRk9STUFUX0FQRToKLQkJb3Blbi5lbmNfY2ZnX2lkID0gQVNNX01FRElBX0ZNVF9BUEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHJkX2Zvcm1hdCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiByZGZvcm1hdFsweCV4XXdyZm9ybWF0WzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCW9wZW4uZW5jX2NmZ19pZCwgb3Blbi5kZWNfZm10X2lkKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBvcGVuIGZhaWxlZCBvcFsweCV4XXJjWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG9wZW4gcmVhZC13cml0ZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fb3Blbl9yZWFkX3dyaXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCByZF9mb3JtYXQsCi0JCQkgIHVpbnQzMl90IHdyX2Zvcm1hdCkKLXsKLQlyZXR1cm4gX19xNmFzbV9vcGVuX3JlYWRfd3JpdGUoYWMsIHJkX2Zvcm1hdCwgd3JfZm9ybWF0LAotCQkJCSAgICAgICB0cnVlLyptZXRhIGRhdGEgbW9kZSovLAotCQkJCSAgICAgICAxNiAvKmJpdHNfcGVyX3NhbXBsZSovLAotCQkJCSAgICAgICBmYWxzZSAvKm92ZXJ3cml0ZV90b3BvbG9neSovLCAwKTsKLX0KLQotaW50IHE2YXNtX29wZW5fcmVhZF93cml0ZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgcmRfZm9ybWF0LAotCQkJICAgICB1aW50MzJfdCB3cl9mb3JtYXQsIGJvb2wgaXNfbWV0YV9kYXRhX21vZGUsCi0JCQkgICAgIHVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCBvdmVyd3JpdGVfdG9wb2xvZ3ksCi0JCQkgICAgIGludCB0b3BvbG9neSkKLXsKLQlyZXR1cm4gX19xNmFzbV9vcGVuX3JlYWRfd3JpdGUoYWMsIHJkX2Zvcm1hdCwgd3JfZm9ybWF0LAotCQkJCSAgICAgICBpc19tZXRhX2RhdGFfbW9kZSwgYml0c19wZXJfc2FtcGxlLAotCQkJCSAgICAgICBvdmVyd3JpdGVfdG9wb2xvZ3ksIHRvcG9sb2d5KTsKLX0KLQotaW50IHE2YXNtX29wZW5fbG9vcGJhY2tfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKLXsKLQlpbnQgcmMgPSAweDAwOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQotCWlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKSB7Ci0JCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX3RyYW5zY29kZV9sb29wYmFja190IG9wZW47Ci0KLQkJcTZhc21fYWRkX2hkcihhYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIFRSVUUpOwotCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JCW9wZW4uaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX09QRU5fVFJBTlNDT0RFX0xPT1BCQUNLOwotCi0JCW9wZW4ubW9kZV9mbGFncyA9IDA7Ci0JCW9wZW4uc3JjX2VuZHBvaW50X3R5cGUgPSAwOwotCQlvcGVuLnNpbmtfZW5kcG9pbnRfdHlwZSA9IDA7Ci0JCW9wZW4uc3JjX2Zvcm1hdF9pZCA9IEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjI7Ci0JCW9wZW4uc2lua19mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YyOwotCQkvKiBzb3VyY2UgZW5kcG9pbnQgOiBtYXRyaXggKi8KLQkJb3Blbi5hdWRwcm9jX3RvcG9faWQgPSBxNmFzbV9nZXRfYXNtX3RvcG9sb2d5X2NhbCgpOwotCi0JCWFjLT5hcHBfdHlwZSA9IHE2YXNtX2dldF9hc21fYXBwX3R5cGVfY2FsKCk7Ci0JCWlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKQotCQkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9MT1dfTEFURU5DWV9TVFJFQU1fU0VTU0lPTjsKLQkJZWxzZQotCQkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9MRUdBQ1lfU1RSRUFNX1NFU1NJT047Ci0JCWFjLT50b3BvbG9neSA9IG9wZW4uYXVkcHJvY190b3BvX2lkOwotCQlvcGVuLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQkJb3Blbi5yZXNlcnZlZCA9IDA7Ci0JCXByX2RlYnVnKCIlczogb3BlbmluZyBhIHRyYW5zY29kZV9sb29wYmFjayB3aXRoIG1vZGVfZmxhZ3MgPVslZF0gc2Vzc2lvblslZF1cbiIsCi0JCQkJX19mdW5jX18sIG9wZW4ubW9kZV9mbGFncywgYWMtPnNlc3Npb24pOwotCi0JCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JfSBlbHNlIHsvKmlmKGFjLT5wZXJmX21vZGUgPT0gTEVHQUNZX1BDTV9NT0RFKSovCi0JCXN0cnVjdCBhc21fc3RyZWFtX2NtZF9vcGVuX2xvb3BiYWNrX3YyIG9wZW47Ci0KLQkJcTZhc21fYWRkX2hkcihhYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIFRSVUUpOwotCQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JCW9wZW4uaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX09QRU5fTE9PUEJBQ0tfVjI7Ci0KLQkJb3Blbi5tb2RlX2ZsYWdzID0gMDsKLQkJb3Blbi5zcmNfZW5kcG9pbnR5cGUgPSAwOwotCQlvcGVuLnNpbmtfZW5kcG9pbnR5cGUgPSAwOwotCQkvKiBzb3VyY2UgZW5kcG9pbnQgOiBtYXRyaXggKi8KLQkJb3Blbi5wb3N0cHJvY29wb19pZCA9IHE2YXNtX2dldF9hc21fdG9wb2xvZ3lfY2FsKCk7Ci0KLQkJYWMtPmFwcF90eXBlID0gcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwoKTsKLQkJYWMtPnRvcG9sb2d5ID0gb3Blbi5wb3N0cHJvY29wb19pZDsKLQkJb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0JCW9wZW4ucmVzZXJ2ZWQgPSAwOwotCQlwcl9kZWJ1ZygiJXM6IG9wZW5pbmcgYSBsb29wYmFja192MiB3aXRoIG1vZGVfZmxhZ3MgPVslZF0gc2Vzc2lvblslZF1cbiIsCi0JCQkJX19mdW5jX18sIG9wZW4ubW9kZV9mbGFncywgYWMtPnNlc3Npb24pOwotCi0JCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmb3Blbik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCQlfX2Z1bmNfXywgb3Blbi5oZHIub3Bjb2RlLCByYyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBvcGVuX2xvb3BiYWNrXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotaW50IHE2YXNtX29wZW5fdHJhbnNjb2RlX2xvb3BiYWNrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJdWludDMyX3Qgc291cmNlX2Zvcm1hdCwgdWludDMyX3Qgc2lua19mb3JtYXQpCi17Ci0JaW50IHJjID0gMHgwMDsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl90cmFuc2NvZGVfbG9vcGJhY2tfdCBvcGVuOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCi0JcTZhc21fYWRkX2hkcihhYywgJm9wZW4uaGRyLCBzaXplb2Yob3BlbiksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQlvcGVuLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9PUEVOX1RSQU5TQ09ERV9MT09QQkFDSzsKLQotCW9wZW4ubW9kZV9mbGFncyA9IDA7Ci0Jb3Blbi5zcmNfZW5kcG9pbnRfdHlwZSA9IDA7Ci0Jb3Blbi5zaW5rX2VuZHBvaW50X3R5cGUgPSAwOwotCXN3aXRjaCAoc291cmNlX2Zvcm1hdCkgewotCWNhc2UgRk9STUFUX0xJTkVBUl9QQ006Ci0JY2FzZSBGT1JNQVRfTVVMVElfQ0hBTk5FTF9MSU5FQVJfUENNOgotCQlvcGVuLnNyY19mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX01VTFRJX0NIQU5ORUxfUENNX1YzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9BQzM6Ci0JCW9wZW4uc3JjX2Zvcm1hdF9pZCA9IEFTTV9NRURJQV9GTVRfQUMzOwotCQlicmVhazsKLQljYXNlIEZPUk1BVF9FQUMzOgotCQlvcGVuLnNyY19mb3JtYXRfaWQgPSBBU01fTUVESUFfRk1UX0VBQzM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHNyYyBmbXQgWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzb3VyY2VfZm9ybWF0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXN3aXRjaCAoc2lua19mb3JtYXQpIHsKLQljYXNlIEZPUk1BVF9MSU5FQVJfUENNOgotCWNhc2UgRk9STUFUX01VTFRJX0NIQU5ORUxfTElORUFSX1BDTToKLQkJb3Blbi5zaW5rX2Zvcm1hdF9pZCA9IEFTTV9NRURJQV9GTVRfTVVMVElfQ0hBTk5FTF9QQ01fVjM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IFVuc3VwcG9ydGVkIHNpbmsgZm10IFslZF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc2lua19mb3JtYXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBzb3VyY2UgZW5kcG9pbnQgOiBtYXRyaXggKi8KLQlvcGVuLmF1ZHByb2NfdG9wb19pZCA9IHE2YXNtX2dldF9hc21fdG9wb2xvZ3lfY2FsKCk7Ci0KLQlhYy0+YXBwX3R5cGUgPSBxNmFzbV9nZXRfYXNtX2FwcF90eXBlX2NhbCgpOwotCWlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKQotCQlvcGVuLm1vZGVfZmxhZ3MgfD0gQVNNX0xPV19MQVRFTkNZX1NUUkVBTV9TRVNTSU9OOwotCWVsc2UKLQkJb3Blbi5tb2RlX2ZsYWdzIHw9IEFTTV9MRUdBQ1lfU1RSRUFNX1NFU1NJT047Ci0JYWMtPnRvcG9sb2d5ID0gb3Blbi5hdWRwcm9jX3RvcG9faWQ7Ci0Jb3Blbi5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0Jb3Blbi5yZXNlcnZlZCA9IDA7Ci0JcHJfZGVidWcoIiVzOiBvcGVuaW5nIGEgdHJhbnNjb2RlX2xvb3BiYWNrIHdpdGggbW9kZV9mbGFncyA9WyVkXSBzZXNzaW9uWyVkXVxuIiwKLQkJX19mdW5jX18sIG9wZW4ubW9kZV9mbGFncywgYWMtPnNlc3Npb24pOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZvcGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IG9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCV9fZnVuY19fLCBvcGVuLmhkci5vcGNvZGUsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3Igb3Blbl90cmFuc2NvZGVfbG9vcGJhY2tcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljCi1pbnQgcTZhc21fc2V0X3NoYXJlZF9jaXJjX2J1ZmYoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgICAgc3RydWN0IGFzbV9zdHJlYW1fY21kX29wZW5fc2hhcmVkX2lvICpvcGVuLAotCQkJICAgICAgIGludCBidWZzeiwgaW50IGJ1ZmNudCwKLQkJCSAgICAgICBpbnQgZGlyKQotewotCXN0cnVjdCBhdWRpb19idWZmZXIgKmJ1Zl9jaXJjOwotCWludCBieXRlc190b19hbGxvYywgcmM7Ci0Jc2l6ZV90IGxlbjsKLQotCWJ1Zl9jaXJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX2J1ZmZlciksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFidWZfY2lyYykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCi0JYWMtPnBvcnRbZGlyXS5idWYgPSBidWZfY2lyYzsKLQotCWJ5dGVzX3RvX2FsbG9jID0gYnVmc3ogKiBidWZjbnQ7Ci0JYnl0ZXNfdG9fYWxsb2MgPSBQQUdFX0FMSUdOKGJ5dGVzX3RvX2FsbG9jKTsKLQotCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygiYXVkaW9fY2xpZW50IiwgJmJ1Zl9jaXJjLT5jbGllbnQsCi0JCQkmYnVmX2NpcmMtPmhhbmRsZSwgYnl0ZXNfdG9fYWxsb2MsCi0JCQkoaW9uX3BoeXNfYWRkcl90ICopJmJ1Zl9jaXJjLT5waHlzLAotCQkJJmxlbiwgJmJ1Zl9jaXJjLT5kYXRhKTsKLQotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBBdWRpbyBJT04gYWxsb2MgaXMgZmFpbGVkLCByYyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCQlyYyk7Ci0JCW11dGV4X3VubG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJa2ZyZWUoYnVmX2NpcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYnVmX2NpcmMtPnVzZWQgPSBkaXIgXiAxOwotCWJ1Zl9jaXJjLT5zaXplID0gYnl0ZXNfdG9fYWxsb2M7Ci0JYnVmX2NpcmMtPmFjdHVhbF9zaXplID0gYnl0ZXNfdG9fYWxsb2M7Ci0JbWVtc2V0KGJ1Zl9jaXJjLT5kYXRhLCAwLCBidWZfY2lyYy0+YWN0dWFsX3NpemUpOwotCi0JYWMtPnBvcnRbZGlyXS5tYXhfYnVmX2NudCA9IDE7Ci0KLQlvcGVuLT5zaGFyZWRfY2lyY19idWZfbWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0Jb3Blbi0+c2hhcmVkX2NpcmNfYnVmX251bV9yZWdpb25zID0gMTsKLQlvcGVuLT5zaGFyZWRfY2lyY19idWZfcHJvcGVydHlfZmxhZyA9IDB4MDA7Ci0Jb3Blbi0+c2hhcmVkX2NpcmNfYnVmX3N0YXJ0X3BoeV9hZGRyX2xzdyA9Ci0JCQlsb3dlcl8zMl9iaXRzKGJ1Zl9jaXJjLT5waHlzKTsKLQlvcGVuLT5zaGFyZWRfY2lyY19idWZfc3RhcnRfcGh5X2FkZHJfbXN3ID0KLQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9jaXJjLT5waHlzKTsKLQlvcGVuLT5zaGFyZWRfY2lyY19idWZfc2l6ZSA9IGJ1ZnN6ICogYnVmY250OwotCi0Jb3Blbi0+bWFwX3JlZ2lvbl9jaXJjX2J1Zi5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9jaXJjLT5waHlzKTsKLQlvcGVuLT5tYXBfcmVnaW9uX2NpcmNfYnVmLnNobV9hZGRyX21zdyA9Ci0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfY2lyYy0+cGh5cyk7Ci0Jb3Blbi0+bWFwX3JlZ2lvbl9jaXJjX2J1Zi5tZW1fc2l6ZV9ieXRlcyA9IGJ5dGVzX3RvX2FsbG9jOwotCi0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljCi1pbnQgcTZhc21fc2V0X3NoYXJlZF9wb3NfYnVmZihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSAgICAgICBzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8gKm9wZW4sCi0JCQkgICAgICAgaW50IGRpcikKLXsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICpidWZfcG9zID0gJmFjLT5zaGFyZWRfcG9zX2J1ZjsKLQlpbnQgcmM7Ci0Jc2l6ZV90IGxlbjsKLQlpbnQgYnl0ZXNfdG9fYWxsb2MgPSBzaXplb2Yoc3RydWN0IGFzbV9zaGFyZWRfcG9zaXRpb25fYnVmZmVyKTsKLQotCW11dGV4X2xvY2soJmFjLT5jbWRfbG9jayk7Ci0KLQlieXRlc190b19hbGxvYyA9IFBBR0VfQUxJR04oYnl0ZXNfdG9fYWxsb2MpOwotCi0JcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJhdWRpb19jbGllbnQiLCAmYnVmX3Bvcy0+Y2xpZW50LAotCQkJJmJ1Zl9wb3MtPmhhbmRsZSwgYnl0ZXNfdG9fYWxsb2MsCi0JCQkoaW9uX3BoeXNfYWRkcl90ICopJmJ1Zl9wb3MtPnBoeXMsICZsZW4sCi0JCQkmYnVmX3Bvcy0+ZGF0YSk7Ci0KLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogQXVkaW8gcG9zIGJ1ZiBJT04gYWxsb2MgaXMgZmFpbGVkLCByYyA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlidWZfcG9zLT51c2VkID0gZGlyIF4gMTsKLQlidWZfcG9zLT5zaXplID0gYnl0ZXNfdG9fYWxsb2M7Ci0JYnVmX3Bvcy0+YWN0dWFsX3NpemUgPSBieXRlc190b19hbGxvYzsKLQotCW9wZW4tPnNoYXJlZF9wb3NfYnVmX21lbV9wb29sX2lkID0gQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MOwotCW9wZW4tPnNoYXJlZF9wb3NfYnVmX251bV9yZWdpb25zID0gMTsKLQlvcGVuLT5zaGFyZWRfcG9zX2J1Zl9wcm9wZXJ0eV9mbGFnID0gMHgwMDsKLQlvcGVuLT5zaGFyZWRfcG9zX2J1Zl9waHlfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9wb3MtPnBoeXMpOwotCW9wZW4tPnNoYXJlZF9wb3NfYnVmX3BoeV9hZGRyX21zdyA9Ci0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhidWZfcG9zLT5waHlzKTsKLQotCW9wZW4tPm1hcF9yZWdpb25fcG9zX2J1Zi5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGJ1Zl9wb3MtPnBoeXMpOwotCW9wZW4tPm1hcF9yZWdpb25fcG9zX2J1Zi5zaG1fYWRkcl9tc3cgPQotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX3Bvcy0+cGh5cyk7Ci0Jb3Blbi0+bWFwX3JlZ2lvbl9wb3NfYnVmLm1lbV9zaXplX2J5dGVzID0gYnl0ZXNfdG9fYWxsb2M7Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIHE2YXNtX29wZW5fc2hhcmVkX2lvOiBPcGVuIGFuIEFTTSBzZXNzaW9uIGZvciBwdWxsIG1vZGUgKHBsYXliYWNrKQotICogb3IgcHVzaCBtb2RlIChjYXB0dXJlKS4KLSAqIHBhcmFtZXRlcnMKLSAqICAgY29uZmlnIC0gc2Vzc2lvbiBwYXJhbWV0ZXJzIChjaGFubmVscywgYml0c19wZXJfc2FtcGxlLCBzcikKLSAqICAgZGlyIC0gc3RyZWFtIGRpcmVjdGlvbiAoSU4gZm9yIHBsYXliYWNrLCBPVVQgZm9yIGNhcHR1cmUpCi0gKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBvdGhlcndpc2UKLSAqLwotaW50IHE2YXNtX29wZW5fc2hhcmVkX2lvKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJIHN0cnVjdCBzaGFyZWRfaW9fY29uZmlnICpjb25maWcsCi0JCQkgaW50IGRpcikKLXsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8gKm9wZW47Ci0JdTggKmNoYW5uZWxfbWFwcGluZzsKLQlpbnQgaSwgc2l6ZV9vZl9vcGVuLCBudW1fd2F0ZXJtYXJrcywgYnVmc3osIGJ1ZmNudCwgcmMsIGZsYWdzID0gMDsKLQotCWlmICghYWMgfHwgIWNvbmZpZykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlidWZzeiA9IGNvbmZpZy0+YnVmc3o7Ci0JYnVmY250ID0gY29uZmlnLT5idWZjbnQ7Ci0JbnVtX3dhdGVybWFya3MgPSAwOwotCi0JYWMtPmNvbmZpZyA9ICpjb25maWc7Ci0KLQlpZiAoYWMtPnNlc3Npb24gPD0gMCB8fCBhYy0+c2Vzc2lvbiA+IFNFU1NJT05fTUFYKSB7Ci0JCXByX2VycigiJXM6IFNlc3Npb24gJWQgaXMgb3V0IG9mIGJvdW5kc1xuIiwKLQkJCV9fZnVuY19fLCBhYy0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNpemVfb2Zfb3BlbiA9IHNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfb3Blbl9zaGFyZWRfaW8pICsKLQkJKHNpemVvZihzdHJ1Y3QgYXNtX3NoYXJlZF93YXRlcm1hcmtfbGV2ZWwpICogbnVtX3dhdGVybWFya3MpOwotCi0Jb3BlbiA9IGt6YWxsb2MoUEFHRV9BTElHTihzaXplX29mX29wZW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9wZW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZvcGVuLT5oZHIsIHNpemVfb2Zfb3BlbiwgVFJVRSwKLQkJCQlhYy0+c3RyZWFtX2lkKTsKLQotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDEpOwotCi0JcHJfZGVidWcoIiVzOiB0b2tlbiA9IDB4JXgsIHN0cmVhbV9pZCAlZCwgc2Vzc2lvbiAweCV4LCBwZXJmICVkXG4iLAotCQkgX19mdW5jX18sIG9wZW4tPmhkci50b2tlbiwgYWMtPnN0cmVhbV9pZCwgYWMtPnNlc3Npb24sCi0JCSBhYy0+cGVyZl9tb2RlKTsKLQotCW9wZW4tPmhkci5vcGNvZGUgPQotCQlkaXIgPT0gSU4gPyBBU01fU1RSRUFNX0NNRF9PUEVOX1BVTExfTU9ERV9XUklURSA6Ci0JCUFTTV9TVFJFQU1fQ01EX09QRU5fUFVTSF9NT0RFX1JFQUQ7Ci0KLQlwcl9kZWJ1ZygiJXMgcGVyZl9tb2RlICVkXG4iLCBfX2Z1bmNfXywgYWMtPnBlcmZfbW9kZSk7Ci0JaWYgKGRpciA9PSBJTikKLQkJaWYgKGFjLT5wZXJmX21vZGUgPT0gVUxMX1BPU1RfUFJPQ0VTU0lOR19QQ01fTU9ERSkKLQkJCWZsYWdzID0gNCA8PCBBU01fU0hJRlRfU1RSRUFNX1BFUkZfRkxBR19QVUxMX01PREVfV1JJVEU7Ci0JCWVsc2UgaWYgKGFjLT5wZXJmX21vZGUgPT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpCi0JCQlmbGFncyA9IDIgPDwgQVNNX1NISUZUX1NUUkVBTV9QRVJGX0ZMQUdfUFVMTF9NT0RFX1dSSVRFOwotCQllbHNlIGlmIChhYy0+cGVyZl9tb2RlID09IExPV19MQVRFTkNZX1BDTV9NT0RFKQotCQkJZmxhZ3MgPSAxIDw8IEFTTV9TSElGVF9TVFJFQU1fUEVSRl9GTEFHX1BVTExfTU9ERV9XUklURTsKLQkJZWxzZQotCQkJcHJfZXJyKCJJbnZhbGlkIHBlcmYgbW9kZSBmb3IgcHVsbCB3cml0ZVxuIik7Ci0JZWxzZQotCQlpZiAoYWMtPnBlcmZfbW9kZSA9PSBMT1dfTEFURU5DWV9QQ01fTU9ERSkKLQkJCWZsYWdzID0gQVNNX0xPV19MQVRFTkNZX1RYX1NUUkVBTV9TRVNTSU9OIDw8Ci0JCQkJQVNNX1NISUZUX1NUUkVBTV9QRVJGX0ZMQUdfUFVTSF9NT0RFX1JFQUQ7Ci0JCWVsc2UKLQkJCXByX2VycigiSW52YWxpZCBwZXJmIG1vZGUgZm9yIHB1c2ggcmVhZFxuIik7Ci0KLQlpZiAoZmxhZ3MgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG1vZGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIGFjLT5wZXJmX21vZGUpOwotCQlrZnJlZShvcGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl9Ci0KLQlwcl9kZWJ1Zygib3Blbi5tb2RlX2ZsYWdzID0gMHgleFxuIiwgZmxhZ3MpOwotCW9wZW4tPm1vZGVfZmxhZ3MgPSBmbGFnczsKLQlvcGVuLT5lbmRwb2ludF90eXBlID0gQVNNX0VORF9QT0lOVF9ERVZJQ0VfTUFUUklYOwotCW9wZW4tPnRvcG9fYml0c19wZXJfc2FtcGxlID0gY29uZmlnLT5iaXRzX3Blcl9zYW1wbGU7Ci0KLQlvcGVuLT50b3BvX2lkID0gcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwoKTsKLQotCWlmIChjb25maWctPmZvcm1hdCA9PSBGT1JNQVRfTElORUFSX1BDTSkKLQkJb3Blbi0+Zm10X2lkID0gQVNNX01FRElBX0ZNVF9NVUxUSV9DSEFOTkVMX1BDTV9WMzsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBmb3JtYXRbJWRdXG4iLCBfX2Z1bmNfXywgY29uZmlnLT5mb3JtYXQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYWMtPnBvcnRbZGlyXS5idWYpIHsKLQkJcHJfZXJyKCIlczogQnVmZmVyIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJjID0gcTZhc21fc2V0X3NoYXJlZF9jaXJjX2J1ZmYoYWMsIG9wZW4sIGJ1ZnN6LCBidWZjbnQsIGRpcik7Ci0KLQlpZiAocmMpCi0JCWdvdG8gZG9uZTsKLQotCWFjLT5wb3J0W2Rpcl0udG1wX2hkbCA9IDA7Ci0KLQlyYyA9IHE2YXNtX3NldF9zaGFyZWRfcG9zX2J1ZmYoYWMsIG9wZW4sIGRpcik7Ci0KLQlpZiAocmMpCi0JCWdvdG8gZG9uZTsKLQotCS8qIGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YzICovCi0Jb3Blbi0+Zm10Lm51bV9jaGFubmVscyA9IGNvbmZpZy0+Y2hhbm5lbHM7Ci0Jb3Blbi0+Zm10LmJpdHNfcGVyX3NhbXBsZSA9IGNvbmZpZy0+Yml0c19wZXJfc2FtcGxlOwotCW9wZW4tPmZtdC5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+cmF0ZTsKLQlvcGVuLT5mbXQuaXNfc2lnbmVkID0gMTsKLQlvcGVuLT5mbXQuc2FtcGxlX3dvcmRfc2l6ZSA9IGNvbmZpZy0+c2FtcGxlX3dvcmRfc2l6ZTsKLQotCWNoYW5uZWxfbWFwcGluZyA9IG9wZW4tPmZtdC5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlyYyA9IHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNvbmZpZy0+Y2hhbm5lbHMsIGZhbHNlKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogTWFwIGNoYW5uZWxzIGZhaWxlZCwgcmV0OiAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBkb25lOwotCX0KLQotCW9wZW4tPm51bV93YXRlcm1hcmtfbGV2ZWxzID0gbnVtX3dhdGVybWFya3M7Ci0JZm9yIChpID0gMDsgaSA8IG51bV93YXRlcm1hcmtzOyBpKyspIHsKLQkJb3Blbi0+d2F0ZXJtYXJrW2ldLndhdGVybWFya19sZXZlbF9ieXRlcyA9IGkgKgotCQkJCSgoYnVmc3ogKiBidWZjbnQpIC8gbnVtX3dhdGVybWFya3MpOwotCQlwcl9kZWJ1ZygiJXM6IFdhdGVybWFyayBsZXZlbCBzZXQgZm9yICVpXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCW9wZW4tPndhdGVybWFya1tpXS53YXRlcm1hcmtfbGV2ZWxfYnl0ZXMpOwotCX0KLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSBvcGVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IE9wZW4gZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkgICAgICAgX19mdW5jX18sIG9wZW4tPmhkci5vcGNvZGUsIHJjKTsKLQkJZ290byBkb25lOwotCX0KLQotCXByX2RlYnVnKCIlczogc2VudCBvcGVuIGFwciBwa3RcbiIsIF9fZnVuY19fKTsKLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpIDw9IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IFRpbWVvdXQuIFdhaXRlZCBmb3Igb3BlbiB3cml0ZSBhcHIgcGt0IHJjWyVkXVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPCAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvciBbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhYy0+aW9fbW9kZSB8PSBUVU5fV1JJVEVfSU9fTU9ERTsKLQlyYyA9IDA7Ci1kb25lOgotCWtmcmVlKG9wZW4pOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fb3Blbl9zaGFyZWRfaW8pOwotCi0vKgotICogcTZhc21fc2hhcmVkX2lvX2J1ZjogUmV0dXJucyBoYW5kbGUgdG8gdGhlIHNoYXJlZCBjaXJjdWxhciBidWZmZXIgYmVpbmcKLSAqIHVzZWQgZm9yIHB1bGwvcHVzaCBtb2RlLgotICogcGFyYW1ldGVycwotICogICBkaXIgLSB1c2VkIHRvIGlkZW50aWZ5IGlucHV0L291dHB1dCBwb3J0Ci0gKiByZXR1cm5zIGJ1ZmZlciBoYW5kbGUKLSAqLwotc3RydWN0IGF1ZGlvX2J1ZmZlciAqcTZhc21fc2hhcmVkX2lvX2J1ZihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJIGludCBkaXIpCi17Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYWMgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcG9ydCA9ICZhYy0+cG9ydFtkaXJdOwotCXJldHVybiBwb3J0LT5idWY7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX3NoYXJlZF9pb19idWYpOwotCi0vKgotICogcTZhc21fc2hhcmVkX2lvX2ZyZWU6IEZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGEgcHVsbC9wdXNoIHNlc3Npb24KLSAqIHBhcmFtZXRlcnMKLSAqICBkaXIgLSBwb3J0IGRpcmVjdGlvbgotICogcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIG90aGVyd2lzZQotICovCi1pbnQgcTZhc21fc2hhcmVkX2lvX2ZyZWUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpCi17Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCWlmIChwb3J0LT5idWYgJiYgcG9ydC0+YnVmLT5kYXRhKSB7Ci0JCW1zbV9hdWRpb19pb25fZnJlZShwb3J0LT5idWYtPmNsaWVudCwgcG9ydC0+YnVmLT5oYW5kbGUpOwotCQlwb3J0LT5idWYtPmNsaWVudCA9IE5VTEw7Ci0JCXBvcnQtPmJ1Zi0+aGFuZGxlID0gTlVMTDsKLQkJcG9ydC0+bWF4X2J1Zl9jbnQgPSAwOwotCQlrZnJlZShwb3J0LT5idWYpOwotCQlwb3J0LT5idWYgPSBOVUxMOwotCX0KLQlpZiAoYWMtPnNoYXJlZF9wb3NfYnVmLmRhdGEpIHsKLQkJbXNtX2F1ZGlvX2lvbl9mcmVlKGFjLT5zaGFyZWRfcG9zX2J1Zi5jbGllbnQsCi0JCQkJYWMtPnNoYXJlZF9wb3NfYnVmLmhhbmRsZSk7Ci0JCWFjLT5zaGFyZWRfcG9zX2J1Zi5jbGllbnQgPSBOVUxMOwotCQlhYy0+c2hhcmVkX3Bvc19idWYuaGFuZGxlID0gTlVMTDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9zaGFyZWRfaW9fZnJlZSk7Ci0KLS8qCi0gKiBxNmFzbV9nZXRfc2hhcmVkX3BvczogUmV0dXJucyBjdXJyZW50IHJlYWQgaW5kZXgvd3JpdGUgaW5kZXggYXMgb2JzZXJ2ZWQKLSAqIGJ5IHRoZSBEU1AuIE5vdGUgdGhhdCB0aGlzIGlzIGFuIG9mZnNldCBhbmQgaXRlcmF0ZXMgZnJvbSBbMCxCVUZfU0laRSAtIDFdCi0gKiBwYXJhbWV0ZXJzIC0gKGFsbCBvdXRwdXQpCi0gKiAgIHJlYWRfaW5kZXggLSBvZmZzZXQKLSAqICAgd2FsbF9jbGtfbXN3MSAtIEFEU1Agd2FsbGNsb2NrIG1zdwotICogICB3YWxsX2Nsa19sc3cxIC0gQURTUCB3YWxsY2xvY2sgbHN3Ci0gKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLUVBR0FJTiBpZiBEU1AgZmFpbGVkIHRvIHVwZGF0ZSBhZnRlciBzb21lCi0gKiByZXRyaWVzCi0gKi8KLWludCBxNmFzbV9nZXRfc2hhcmVkX3BvcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgKnJlYWRfaW5kZXgsCi0JCQkgdWludDMyX3QgKndhbGxfY2xrX21zdzEsIHVpbnQzMl90ICp3YWxsX2Nsa19sc3cxKQotewotCXN0cnVjdCBhc21fc2hhcmVkX3Bvc2l0aW9uX2J1ZmZlciAqcG9zX2J1ZjsKLQl1aW50MzJfdCBmcmFtZV9jbnQxLCBmcmFtZV9jbnQyOwotCWludCBpLCBqOwotCi0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwb3NfYnVmID0gYWMtPnNoYXJlZF9wb3NfYnVmLmRhdGE7Ci0KLQkvKiBhbHdheXMgdHJ5IHRvIGdldCB0aGUgbGF0ZXN0IHVwZGF0ZSBpbiB0aGUgc2hhcmVkIHBvcyBidWZmZXIgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCS8qIHJldHJ5IHVudGlsIHRoZXJlIGlzIGFuIHVwZGF0ZSBmcm9tIERTUCAqLwotCQlmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7Ci0JCQlmcmFtZV9jbnQxID0gcG9zX2J1Zi0+ZnJhbWVfY291bnRlcjsKLQkJCWlmIChmcmFtZV9jbnQxICE9IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkqd2FsbF9jbGtfbXN3MSA9IHBvc19idWYtPndhbGxfY2xvY2tfdXNfbXN3OwotCQkqd2FsbF9jbGtfbHN3MSA9IHBvc19idWYtPndhbGxfY2xvY2tfdXNfbHN3OwotCQkqcmVhZF9pbmRleCA9IHBvc19idWYtPmluZGV4OwotCQlmcmFtZV9jbnQyID0gcG9zX2J1Zi0+ZnJhbWVfY291bnRlcjsKLQotCQlpZiAoZnJhbWVfY250MSAhPSBmcmFtZV9jbnQyKQotCQkJY29udGludWU7Ci0JCXJldHVybiAwOwotCX0KLQlwcl9lcnIoIiVzIG91dCBvZiB0cmllcyB0cnlpbmcgdG8gZ2V0IGEgZ29vZCByZWFkLCB0cnkgYWdhaW5cbiIsCi0JICAgICAgIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVBR0FJTjsKLX0KLQotaW50IHE2YXNtX3J1bihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCi0JCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzKQotewotCXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcnVuX3YyIHJ1bjsKLQlpbnQgcmM7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCi0JcTZhc21fYWRkX2hkcihhYywgJnJ1bi5oZHIsIHNpemVvZihydW4pLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlydW4uaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9SVU5fVjI7Ci0JcnVuLmZsYWdzICAgID0gZmxhZ3M7Ci0JcnVuLnRpbWVfbHN3ID0gbHN3X3RzOwotCXJ1bi50aW1lX21zdyA9IG1zd190czsKLQotCWNvbmZpZ19kZWJ1Z19mc19ydW4oKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmcnVuKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1tYW5kIHJ1biBmYWlsZWRbJWRdIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIHJ1biBzdWNjZXNzIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fcnVuX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCi0JCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzLCB1aW50MzJfdCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9ydW5fdjIgcnVuOwotCWludCByYzsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcl9hc3luYyhhYywgJnJ1bi5oZHIsIHNpemVvZihydW4pLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDEpOwotCXJ1bi5oZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1JVTl9WMjsKLQlydW4uZmxhZ3MgICAgPSBmbGFnczsKLQlydW4udGltZV9sc3cgPSBsc3dfdHM7Ci0JcnVuLnRpbWVfbXN3ID0gbXN3X3RzOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZydW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbW1hbmQgcnVuIGZhaWxlZFslZF0iLCBfX2Z1bmNfXywgcmMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNmFzbV9ydW5fbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmbGFncywKLQkJCXVpbnQzMl90IG1zd190cywgdWludDMyX3QgbHN3X3RzKQotewotCXJldHVybiBfX3E2YXNtX3J1bl9ub3dhaXQoYWMsIGZsYWdzLCBtc3dfdHMsIGxzd190cywgYWMtPnN0cmVhbV9pZCk7Ci19Ci0KLWludCBxNmFzbV9zdHJlYW1fcnVuX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZmxhZ3MsCi0JCQl1aW50MzJfdCBtc3dfdHMsIHVpbnQzMl90IGxzd190cywgdWludDMyX3Qgc3RyZWFtX2lkKQotewotCXJldHVybiBfX3E2YXNtX3J1bl9ub3dhaXQoYWMsIGZsYWdzLCBtc3dfdHMsIGxzd190cywgc3RyZWFtX2lkKTsKLX0KLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX2FhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKLQkJCXVpbnQzMl90IHNhbXBsZV9yYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCXVpbnQzMl90IGJpdF9yYXRlLCB1aW50MzJfdCBtb2RlLCB1aW50MzJfdCBmb3JtYXQpCi17Ci0Jc3RydWN0IGFzbV9hYWNfZW5jX2NmZ192MiBlbmNfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXVNSWyVkXWNoWyVkXWJpdHJhdGVbJWRdbW9kZVslZF0gZm9ybWF0WyVkXVxuIiwKLQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZnJhbWVzX3Blcl9idWYsCi0JCXNhbXBsZV9yYXRlLCBjaGFubmVscywgYml0X3JhdGUsIG1vZGUsIGZvcm1hdCk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCi0JZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2FhY19lbmNfY2ZnX3YyKSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKTsKLQllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOwotCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOwotCWVuY19jZmcuYml0X3JhdGUgPSBiaXRfcmF0ZTsKLQllbmNfY2ZnLmVuY19tb2RlID0gbW9kZTsKLQllbmNfY2ZnLmFhY19mbXRfZmxhZyA9IGZvcm1hdDsKLQllbmNfY2ZnLmNoYW5uZWxfY2ZnID0gY2hhbm5lbHM7Ci0JZW5jX2NmZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgJWQgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfZzcxMShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQkJdWludDMyX3Qgc2FtcGxlX3JhdGUpCi17Ci0Jc3RydWN0IGFzbV9nNzExX2VuY19jZmdfdjIgZW5jX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWZyYW1lc1slZF1TUlslZF1cbiIsCi0JCSBfX2Z1bmNfXywgYWMtPnNlc3Npb24sIGZyYW1lc19wZXJfYnVmLAotCQlzYW1wbGVfcmF0ZSk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCi0JZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2c3MTFfZW5jX2NmZ192MikgLQotCQkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSk7Ci0JZW5jX2NmZy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKLQllbmNfY2ZnLmVuY2Jsay5lbmNfY2ZnX2Jsa19zaXplICA9IGVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgLQotCQkJCXNpemVvZihzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyKTsKLQllbmNfY2ZnLnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCAlZCBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9zZXRfZW5jZGVjX2NoYW5fbWFwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJdWludDMyX3QgbnVtX2NoYW5uZWxzKQotewotCXN0cnVjdCBhc21fZGVjX291dF9jaGFuX21hcF9wYXJhbSBjaGFuX21hcDsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQsIG51bV9jaGFubmVscyA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgbnVtX2NoYW5uZWxzKTsKLQlxNmFzbV9hZGRfaGRyKGFjLCAmY2hhbl9tYXAuaGRyLCBzaXplb2YoY2hhbl9tYXApLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JY2hhbl9tYXAuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07Ci0JY2hhbl9tYXAuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0RFQ19PVVRQVVRfQ0hBTl9NQVA7Ci0JY2hhbl9tYXAuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV9kZWNfb3V0X2NoYW5fbWFwX3BhcmFtKSAtCi0JCQkgKHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKwotCQkJIHNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSkpOwotCWNoYW5fbWFwLm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKLQljaGFubmVsX21hcHBpbmcgPSBjaGFuX21hcC5jaGFubmVsX21hcHBpbmc7Ci0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgUENNX0NIQU5ORUxfTlVMTCwgTUFYX0NIQU5fTUFQX0NIQU5ORUxTKTsKLQotCWlmIChxNmFzbV9tYXBfY2hhbm5lbHMoY2hhbm5lbF9tYXBwaW5nLCBudW1fY2hhbm5lbHMsIGZhbHNlKSkgewotCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgbnVtX2NoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZjaGFuX21hcCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21tYW5kIG9wY29kZVsweCV4XXBhcmFtaWRbMHgleF0gZmFpbGVkICVkXG4iLAotCQkJICAgX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sCi0JCQkgICBBU01fUEFSQU1fSURfREVDX09VVFBVVF9DSEFOX01BUCwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkJIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsIF9fZnVuY19fLAotCQkJICAgY2hhbl9tYXAuaGRyLm9wY29kZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjQgLSBzZW5kcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgZW5jb2RlciBzZXNzaW9uCi0gKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCAgdG8gYmUgdXNlZAotICogQHVzZV9iYWNrX2ZsYXZvcjogdG8gY29uZmlndXJlIGJhY2sgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbAotICogQGNoYW5uZWxfbWFwOiBpbnB1dCBjaGFubmVsIG1hcAotICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAotICogQGVuZGlhbm5lc3M6IGVuZGlhbm5lc3Mgb2YgdGhlIHBjbSBkYXRhCi0gKiBAbW9kZTogTW9kZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgcGNtIGlucHV0IGRhdGEKLSAqLwotaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKLQkJCSAgICAgYm9vbCB1c2VfYmFja19mbGF2b3IsIHU4ICpjaGFubmVsX21hcCwKLQkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwgdWludDE2X3QgZW5kaWFubmVzcywKLQkJCSAgICAgdWludDE2X3QgbW9kZSkKLXsKLQlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjQgZW5jX2NmZzsKLQlzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyIGVuY19mZ19ibGs7Ci0JdTggKmNoYW5uZWxfbWFwcGluZzsKLQl1MzIgZnJhbWVzX3Blcl9idWYgPSAwOwotCWludCByYzsKLQotCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1icHNbJWRdd29yZHNpemVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscywKLQkJIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7Ci0KLQltZW1zZXQoJmVuY19jZmcsIDAsIHNpemVvZihlbmNfY2ZnKSk7Ci0JcTZhc21fYWRkX2hkcihhYywgJmVuY19jZmcuaGRyLCBzaXplb2YoZW5jX2NmZyksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKGVuY19jZmcpIC0gc2l6ZW9mKGVuY19jZmcuaGRyKSAtCi0JCQkJICAgIHNpemVvZihlbmNfY2ZnLmVuY2RlYyk7Ci0JZW5jX2NmZy5lbmNibGsuZnJhbWVzX3Blcl9idWYgPSBmcmFtZXNfcGVyX2J1ZjsKLQllbmNfY2ZnLmVuY2Jsay5lbmNfY2ZnX2Jsa19zaXplID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJCSAgc2l6ZW9mKGVuY19mZ19ibGspOwotCWVuY19jZmcubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZW5jX2NmZy5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0JZW5jX2NmZy5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JZW5jX2NmZy5pc19zaWduZWQgPSAxOwotCWVuY19jZmcuc2FtcGxlX3dvcmRfc2l6ZSA9IHNhbXBsZV93b3JkX3NpemU7Ci0JZW5jX2NmZy5lbmRpYW5uZXNzID0gZW5kaWFubmVzczsKLQllbmNfY2ZnLm1vZGUgPSBtb2RlOwotCWNoYW5uZWxfbWFwcGluZyA9IGVuY19jZmcuY2hhbm5lbF9tYXBwaW5nOwotCi0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JaWYgKHVzZV9kZWZhdWx0X2NobWFwKSB7Ci0JCXByX2RlYnVnKCIlczogc2V0dGluZyBkZWZhdWx0IGNoYW5uZWwgbWFwIGZvciAlZCBjaGFubmVscyIsCi0JCQkgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLAotCQkJCQl1c2VfYmFja19mbGF2b3IpKSB7Ci0JCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjaGFubmVscyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBVc2luZyBwcmUtZGVmaW5lZCBjaGFubmVsIG1hcCIsIF9fZnVuY19fKTsKLQkJbWVtY3B5KGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbF9tYXAsCi0JCQlQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgb3BlbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZW5jX2NmZy5oZHIub3Bjb2RlKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkgICAgICAgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fZW5jX2NmZ19ibGtfcGNtX3Y0KTsKLQotLyoKLSAqIHE2YXNtX2VuY19jZmdfYmxrX3BjbV92MyAtIHNlbmRzIGVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEByYXRlOiBzYW1wbGUgcmF0ZQotICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KLSAqIEB1c2VfZGVmYXVsdF9jaG1hcDogdHJ1ZSBpZiBkZWZhdWx0IGNoYW5uZWwgbWFwICB0byBiZSB1c2VkCi0gKiBAdXNlX2JhY2tfZmxhdm9yOiB0byBjb25maWd1cmUgYmFjayBsZWZ0IGFuZCByaWdodCBjaGFubmVsCi0gKiBAY2hhbm5lbF9tYXA6IGlucHV0IGNoYW5uZWwgbWFwCi0gKiBAc2FtcGxlX3dvcmRfc2l6ZTogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsCi0gKi8KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkgICAgIGJvb2wgdXNlX2JhY2tfZmxhdm9yLCB1OCAqY2hhbm5lbF9tYXAsCi0JCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpCi17Ci0Jc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9lbmNfY2ZnX3YzIGVuY19jZmc7Ci0Jc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92MiBlbmNfZmdfYmxrOwotCXU4ICpjaGFubmVsX21hcHBpbmc7Ci0JdTMyIGZyYW1lc19wZXJfYnVmID0gMDsKLQlpbnQgcmM7Ci0KLQlpZiAoIXVzZV9kZWZhdWx0X2NobWFwICYmIChjaGFubmVsX21hcCA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBObyB2YWxpZCBjaGFuIG1hcCBhbmQgY2FuJ3QgdXNlIGRlZmF1bHRcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdYnBzWyVkXXdvcmRzaXplWyVkXVxuIiwgX19mdW5jX18sCi0JCSBhYy0+c2Vzc2lvbiwgcmF0ZSwgY2hhbm5lbHMsCi0JCSBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOwotCi0JbWVtc2V0KCZlbmNfY2ZnLCAwLCBzaXplb2YoZW5jX2NmZykpOwotCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihlbmNfY2ZnKSAtIHNpemVvZihlbmNfY2ZnLmhkcikgLQotCQkJCSAgICBzaXplb2YoZW5jX2NmZy5lbmNkZWMpOwotCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7Ci0JZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSA9IGVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgLQotCQkJCQkgIHNpemVvZihlbmNfZmdfYmxrKTsKLQllbmNfY2ZnLm51bV9jaGFubmVscyA9IGNoYW5uZWxzOwotCWVuY19jZmcuYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCWVuY19jZmcuc2FtcGxlX3JhdGUgPSByYXRlOwotCWVuY19jZmcuaXNfc2lnbmVkID0gMTsKLQllbmNfY2ZnLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOwotCWNoYW5uZWxfbWFwcGluZyA9IGVuY19jZmcuY2hhbm5lbF9tYXBwaW5nOwotCi0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JaWYgKHVzZV9kZWZhdWx0X2NobWFwKSB7Ci0JCXByX2RlYnVnKCIlczogc2V0dGluZyBkZWZhdWx0IGNoYW5uZWwgbWFwIGZvciAlZCBjaGFubmVscyIsCi0JCQkgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLAotCQkJCQl1c2VfYmFja19mbGF2b3IpKSB7Ci0JCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjaGFubmVscyk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBVc2luZyBwcmUtZGVmaW5lZCBjaGFubmVsIG1hcCIsIF9fZnVuY19fKTsKLQkJbWVtY3B5KGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbF9tYXAsCi0JCQlQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgb3BlbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZW5jX2NmZy5oZHIub3Bjb2RlKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkgICAgICAgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fZW5jX2NmZ19ibGtfcGNtX3YzKTsKLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX3BjbV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwgYm9vbCB1c2VfYmFja19mbGF2b3IsIHU4ICpjaGFubmVsX21hcCkKLXsKLQlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2VuY19jZmdfdjIgIGVuY19jZmc7Ci0JdTggKmNoYW5uZWxfbWFwcGluZzsKLQl1MzIgZnJhbWVzX3Blcl9idWYgPSAwOwotCi0JaW50IHJjID0gMDsKLQotCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogU2Vzc2lvbiAlZCwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBhYy0+c2Vzc2lvbiwgcmF0ZSwgY2hhbm5lbHMpOwotCi0JcTZhc21fYWRkX2hkcihhYywgJmVuY19jZmcuaGRyLCBzaXplb2YoZW5jX2NmZyksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKGVuY19jZmcpIC0gc2l6ZW9mKGVuY19jZmcuaGRyKSAtCi0JCQkJc2l6ZW9mKGVuY19jZmcuZW5jZGVjKTsKLQllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOwotCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyKTsKLQotCWVuY19jZmcubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZW5jX2NmZy5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0JZW5jX2NmZy5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JZW5jX2NmZy5pc19zaWduZWQgPSAxOwotCWNoYW5uZWxfbWFwcGluZyA9IGVuY19jZmcuY2hhbm5lbF9tYXBwaW5nOwotCi0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JaWYgKHVzZV9kZWZhdWx0X2NobWFwKSB7Ci0JCXByX2RlYnVnKCIlczogc2V0dGluZyBkZWZhdWx0IGNoYW5uZWwgbWFwIGZvciAlZCBjaGFubmVscyIsCi0JCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCWlmIChxNmFzbV9tYXBfY2hhbm5lbHMoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVscywKLQkJCQkJdXNlX2JhY2tfZmxhdm9yKSkgewotCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgY2hhbm5lbHMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IFVzaW5nIHByZS1kZWZpbmVkIGNoYW5uZWwgbWFwIiwgX19mdW5jX18pOwotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCVBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKLQl9Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmVuY19jZmcpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQgb3Bjb2RlWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIGVuY19jZmcuaGRyLm9wY29kZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3E2YXNtX2VuY19jZmdfYmxrX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkgICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJICAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKLQkJCQkgICAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJCSAgICAgIHVpbnQxNl90IG1vZGUpCi17Ci0JcmV0dXJuIHE2YXNtX2VuY19jZmdfYmxrX3BjbV92NChhYywgcmF0ZSwgY2hhbm5lbHMsCi0JCQkJCWJpdHNfcGVyX3NhbXBsZSwgdHJ1ZSwgZmFsc2UsIE5VTEwsCi0JCQkJCXNhbXBsZV93b3JkX3NpemUsIGVuZGlhbm5lc3MsIG1vZGUpOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCSAgICAgIHVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCSAgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkgICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKQotewotCXJldHVybiBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjMoYWMsIHJhdGUsIGNoYW5uZWxzLAotCQkJCQliaXRzX3Blcl9zYW1wbGUsIHRydWUsIGZhbHNlLCBOVUxMLAotCQkJCQlzYW1wbGVfd29yZF9zaXplKTsKLX0KLQotc3RhdGljIGludCBfX3E2YXNtX2VuY19jZmdfYmxrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSkKLXsKLQlyZXR1cm4gcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YyKGFjLCByYXRlLCBjaGFubmVscywKLQkJCQkJYml0c19wZXJfc2FtcGxlLCB0cnVlLCBmYWxzZSwgTlVMTCk7Ci19Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY20oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQlyZXR1cm4gX19xNmFzbV9lbmNfY2ZnX2Jsa19wY20oYWMsIHJhdGUsIGNoYW5uZWxzLCAxNik7Ci19Ci0KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLCB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCi17Ci0JcmV0dXJuIF9fcTZhc21fZW5jX2NmZ19ibGtfcGNtKGFjLCByYXRlLCBjaGFubmVscywgYml0c19wZXJfc2FtcGxlKTsKLX0KLQotLyoKLSAqIHE2YXNtX2VuY19jZmdfYmxrX3BjbV9mb3JtYXRfc3VwcG9ydF92MyAtIHNlbmRzIGVuY29kZXIgY29uZmlndXJhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgZW5jb2RlciBzZXNzaW9uCi0gKiBAc2FtcGxlX3dvcmRfc2l6ZTogU2l6ZSBpbiBiaXRzIG9mIHRoZSB3b3JkIHRoYXQgaG9sZHMgYSBzYW1wbGUgb2YgYSBjaGFubmVsCi0gKi8KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpCi17Ci0JcmV0dXJuIF9fcTZhc21fZW5jX2NmZ19ibGtfcGNtX3YzKGFjLCByYXRlLCBjaGFubmVscywKLQkJCQkJICBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjMpOwotCi0vKgotICogcTZhc21fZW5jX2NmZ19ibGtfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0IC0gc2VuZHMgZW5jb2RlciBjb25maWd1cmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEByYXRlOiBzYW1wbGUgcmF0ZQotICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KLSAqIEBzYW1wbGVfd29yZF9zaXplOiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwKLSAqIEBlbmRpYW5uZXNzOiBlbmRpYW5uZXNzIG9mIHRoZSBwY20gZGF0YQotICogQG1vZGU6IE1vZGUgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm8gYWJvdXQgdGhlIHBjbSBpbnB1dCBkYXRhCi0gKi8KLWludCBxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUsCi0JCQkJCSAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJCQkgICAgdWludDE2X3QgbW9kZSkKLXsKLQlyZXR1cm4gX19xNmFzbV9lbmNfY2ZnX2Jsa19wY21fdjQoYWMsIHJhdGUsIGNoYW5uZWxzLAotCQkJCQkgICBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUsCi0JCQkJCSAgIGVuZGlhbm5lc3MsIG1vZGUpOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9lbmNfY2ZnX2Jsa19wY21fZm9ybWF0X3N1cHBvcnRfdjQpOwotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfcGNtX25hdGl2ZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQotewotCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZW5jX2NmZ192MiAgZW5jX2NmZzsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCXUzMiBmcmFtZXNfcGVyX2J1ZiA9IDA7Ci0KLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBTZXNzaW9uICVkLCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscyk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2YoZW5jX2NmZykgLSBzaXplb2YoZW5jX2NmZy5oZHIpIC0KLQkJCQkgc2l6ZW9mKGVuY19jZmcuZW5jZGVjKTsKLQllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOwotCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOwotCi0JZW5jX2NmZy5udW1fY2hhbm5lbHMgPSAwOy8qY2hhbm5lbHM7Ki8KLQllbmNfY2ZnLmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotCWVuY19jZmcuc2FtcGxlX3JhdGUgPSAwOy8qcmF0ZTsqLwotCWVuY19jZmcuaXNfc2lnbmVkID0gMTsKLQljaGFubmVsX21hcHBpbmcgPSBlbmNfY2ZnLmNoYW5uZWxfbWFwcGluZzsKLQotCi0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgb3BlbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwKLQkJCV9fZnVuY19fLCBlbmNfY2ZnLmhkci5vcGNvZGUpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fbWFwX2NoYW5uZWxzKHU4ICpjaGFubmVsX21hcHBpbmcsIHVpbnQzMl90IGNoYW5uZWxzLAotCQlib29sIHVzZV9iYWNrX2ZsYXZvcikKLXsKLQl1OCAqbGNoYW5uZWxfbWFwcGluZzsKLQotCWxjaGFubmVsX21hcHBpbmcgPSBjaGFubmVsX21hcHBpbmc7Ci0JcHJfZGVidWcoIiVzOiAgY2hhbm5lbHMgcGFzc2VkOiAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWxzKTsKLQlpZiAoY2hhbm5lbHMgPT0gMSkgIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gMikgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDMpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GQzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDQpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSB1c2VfYmFja19mbGF2b3IgPwotCQkJUENNX0NIQU5ORUxfTEIgOiBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IHVzZV9iYWNrX2ZsYXZvciA/Ci0JCQlQQ01fQ0hBTk5FTF9SQiA6IFBDTV9DSEFOTkVMX1JTOwotCX0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNSkgewotCQlsY2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWxjaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbGNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlsY2hhbm5lbF9tYXBwaW5nWzNdID0gdXNlX2JhY2tfZmxhdm9yID8KLQkJCVBDTV9DSEFOTkVMX0xCIDogUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSB1c2VfYmFja19mbGF2b3IgPwotCQkJUENNX0NIQU5ORUxfUkIgOiBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgaWYgKGNoYW5uZWxzID09IDYpIHsKLQkJbGNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQlsY2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWxjaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJbGNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX0xGRTsKLQkJbGNoYW5uZWxfbWFwcGluZ1s0XSA9IHVzZV9iYWNrX2ZsYXZvciA/Ci0JCQlQQ01fQ0hBTk5FTF9MQiA6IFBDTV9DSEFOTkVMX0xTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzVdID0gdXNlX2JhY2tfZmxhdm9yID8KLQkJCVBDTV9DSEFOTkVMX1JCIDogUENNX0NIQU5ORUxfUlM7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA3KSB7Ci0JCS8qCi0JCSAqIENvbmZpZ3VyZWQgZm9yIDUuMSBjaGFubmVsIG1hcHBpbmcgKyAxIGNoYW5uZWwgZm9yIGRlYnVnCi0JCSAqIENhbiBiZSBjdXN0b21pemVkIGJhc2VkIG9uIERTUC4KLQkJICovCi0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSB1c2VfYmFja19mbGF2b3IgPwotCQkJUENNX0NIQU5ORUxfTEIgOiBQQ01fQ0hBTk5FTF9MUzsKLQkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IHVzZV9iYWNrX2ZsYXZvciA/Ci0JCQlQQ01fQ0hBTk5FTF9SQiA6IFBDTV9DSEFOTkVMX1JTOwotCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfQ1M7Ci0JfSBlbHNlIGlmIChjaGFubmVscyA9PSA4KSB7Ci0JCWxjaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbGNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQlsY2hhbm5lbF9tYXBwaW5nWzJdID0gUENNX0NIQU5ORUxfRkM7Ci0JCWxjaGFubmVsX21hcHBpbmdbM10gPSBQQ01fQ0hBTk5FTF9MRkU7Ci0JCWxjaGFubmVsX21hcHBpbmdbNF0gPSBQQ01fQ0hBTk5FTF9MQjsKLQkJbGNoYW5uZWxfbWFwcGluZ1s1XSA9IFBDTV9DSEFOTkVMX1JCOwotCQlsY2hhbm5lbF9tYXBwaW5nWzZdID0gUENNX0NIQU5ORUxfTFM7Ci0JCWxjaGFubmVsX21hcHBpbmdbN10gPSBQQ01fQ0hBTk5FTF9SUzsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBFUlJPUi51bnN1cHBvcnRlZCBudW1fY2ggPSAldVxuIiwKLQkJIF9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHE2YXNtX2VuYWJsZV9zYnJwcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCXVpbnQzMl90IHNicl9wc19lbmFibGUpCi17Ci0Jc3RydWN0IGFzbV9hYWNfc2JyX3BzX2ZsYWdfcGFyYW0gIHNicnBzOwotCXUzMiBmcmFtZXNfcGVyX2J1ZiA9IDA7Ci0KLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBTZXNzaW9uICVkXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCi0JcTZhc21fYWRkX2hkcihhYywgJnNicnBzLmhkciwgc2l6ZW9mKHNicnBzKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCi0Jc2JycHMuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07Ci0Jc2JycHMuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0FBQ19TQlJfUFNfRkxBRzsKLQlzYnJwcy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2FhY19zYnJfcHNfZmxhZ19wYXJhbSkgLQotCQkJCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X2VuY2RlY19wYXJhbSk7Ci0Jc2JycHMuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7Ci0Jc2JycHMuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gc2JycHMuZW5jZGVjLnBhcmFtX3NpemUgLQotCQkJCXNpemVvZihzdHJ1Y3QgYXNtX2VuY19jZmdfYmxrX3BhcmFtX3YyKTsKLQotCXNicnBzLnNicl9wc19mbGFnID0gc2JyX3BzX2VuYWJsZTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmc2JycHMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCBvcGNvZGVbMHgleF1wYXJhbWlkWzB4JXhdIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLAotCQkJCUFTTV9QQVJBTV9JRF9BQUNfU0JSX1BTX0ZMQUcsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQgb3Bjb2RlWzB4JXhdICIsIF9fZnVuY19fLCBzYnJwcy5oZHIub3Bjb2RlKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fY2ZnX2R1YWxfbW9ub19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQl1aW50MTZfdCBzY2VfbGVmdCwgdWludDE2X3Qgc2NlX3JpZ2h0KQotewotCXN0cnVjdCBhc21fYWFjX2R1YWxfbW9ub19tYXBwaW5nX3BhcmFtIGR1YWxfbW9ubzsKLQotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQsIHNjZV9sZWZ0ID0gJWQsIHNjZV9yaWdodCA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgc2NlX2xlZnQsIHNjZV9yaWdodCk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZHVhbF9tb25vLmhkciwgc2l6ZW9mKGR1YWxfbW9ubyksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWR1YWxfbW9uby5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQlkdWFsX21vbm8uZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0FBQ19EVUFMX01PTk9fTUFQUElORzsKLQlkdWFsX21vbm8uZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2YoZHVhbF9tb25vLmxlZnRfY2hhbm5lbF9zY2UpICsKLQkJCQkgICAgICBzaXplb2YoZHVhbF9tb25vLnJpZ2h0X2NoYW5uZWxfc2NlKTsKLQlkdWFsX21vbm8ubGVmdF9jaGFubmVsX3NjZSA9IHNjZV9sZWZ0OwotCWR1YWxfbW9uby5yaWdodF9jaGFubmVsX3NjZSA9IHNjZV9yaWdodDsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZHVhbF9tb25vKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgb3Bjb2RlWzB4JXhdcGFyYW1pZFsweCV4XSBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sCi0JCQkJQVNNX1BBUkFNX0lEX0FBQ19EVUFMX01PTk9fTUFQUElORywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCBvcGNvZGVbMHgleF1cbiIsIF9fZnVuY19fLAotCQkJCQkJZHVhbF9tb25vLmhkci5vcGNvZGUpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIFN1cHBvcnQgZm9yIHNlbGVjdGluZyBzdGVyZW8gbWl4aW5nIGNvZWZmaWNpZW50cyBmb3IgQiBmYW1pbHkgbm90IGRvbmUgKi8KLWludCBxNmFzbV9jZmdfYWFjX3NlbF9taXhfY29lZihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbWl4X2NvZWZmKQotewotCXN0cnVjdCBhc21fYWFjX3N0ZXJlb19taXhfY29lZmZfc2VsZWN0aW9uX3BhcmFtX3YyIGFhY19taXhfY29lZmY7Ci0JaW50IHJjID0gMDsKLQotCXE2YXNtX2FkZF9oZHIoYWMsICZhYWNfbWl4X2NvZWZmLmhkciwgc2l6ZW9mKGFhY19taXhfY29lZmYpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JYWFjX21peF9jb2VmZi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQlhYWNfbWl4X2NvZWZmLnBhcmFtX2lkID0KLQkJQVNNX1BBUkFNX0lEX0FBQ19TVEVSRU9fTUlYX0NPRUZGX1NFTEVDVElPTl9GTEFHX1YyOwotCWFhY19taXhfY29lZmYucGFyYW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXNtX2FhY19zdGVyZW9fbWl4X2NvZWZmX3NlbGVjdGlvbl9wYXJhbV92Mik7Ci0JYWFjX21peF9jb2VmZi5hYWNfc3RlcmVvX21peF9jb2VmZl9mbGFnID0gbWl4X2NvZWZmOwotCXByX2RlYnVnKCIlczogbWl4X2NvZWZmID0gJXVcbiIsIF9fZnVuY19fLCBtaXhfY29lZmYpOwotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmYWFjX21peF9jb2VmZik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21tYW5kIG9wY29kZVsweCV4XXBhcmFtaWRbMHgleF0gZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sCi0JCQlBU01fUEFSQU1fSURfQUFDX1NURVJFT19NSVhfQ09FRkZfU0VMRUNUSU9OX0ZMQUdfVjIsCi0JCQlyYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQgb3Bjb2RlWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIGFhY19taXhfY29lZmYuaGRyLm9wY29kZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX3FjZWxwKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKLQkJdWludDE2X3QgbWluX3JhdGUsIHVpbnQxNl90IG1heF9yYXRlLAotCQl1aW50MTZfdCByZWR1Y2VkX3JhdGVfbGV2ZWwsIHVpbnQxNl90IHJhdGVfbW9kdWxhdGlvbl9jbWQpCi17Ci0Jc3RydWN0IGFzbV92MTNrX2VuY19jZmcgZW5jX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWZyYW1lc1slZF1taW5fcmF0ZVsweCU0eF1tYXhfcmF0ZVsweCU0eF0gcmVkdWNlZF9yYXRlX2xldmVsWzB4JTR4XXJhdGVfbW9kdWxhdGlvbl9jbWRbMHglNHhdXG4iLAotCQkgX19mdW5jX18sCi0JCWFjLT5zZXNzaW9uLCBmcmFtZXNfcGVyX2J1ZiwgbWluX3JhdGUsIG1heF9yYXRlLAotCQlyZWR1Y2VkX3JhdGVfbGV2ZWwsIHJhdGVfbW9kdWxhdGlvbl9jbWQpOwotCi0JcTZhc21fYWRkX2hkcihhYywgJmVuY19jZmcuaGRyLCBzaXplb2YoZW5jX2NmZyksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQllbmNfY2ZnLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX0VOQ0RFQ19FTkNfQ0ZHX0JMS19WMjsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhc21fdjEza19lbmNfY2ZnKSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKTsKLQllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOwotCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOwotCi0JZW5jX2NmZy5taW5fcmF0ZSA9IG1pbl9yYXRlOwotCWVuY19jZmcubWF4X3JhdGUgPSBtYXhfcmF0ZTsKLQllbmNfY2ZnLnJlZHVjZWRfcmF0ZV9jbWQgPSByZWR1Y2VkX3JhdGVfbGV2ZWw7Ci0JZW5jX2NmZy5yYXRlX21vZF9jbWQgPSByYXRlX21vZHVsYXRpb25fY21kOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgJWQgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3Igc2V0ZW5jZGVjIHYxM2sgcmVzcFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfZXZyYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgZnJhbWVzX3Blcl9idWYsCi0JCXVpbnQxNl90IG1pbl9yYXRlLCB1aW50MTZfdCBtYXhfcmF0ZSwKLQkJdWludDE2X3QgcmF0ZV9tb2R1bGF0aW9uX2NtZCkKLXsKLQlzdHJ1Y3QgYXNtX2V2cmNfZW5jX2NmZyBlbmNfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXW1pbl9yYXRlWzB4JTR4XW1heF9yYXRlWzB4JTR4XSByYXRlX21vZHVsYXRpb25fY21kWzB4JTR4XVxuIiwKLQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwKLQkJZnJhbWVzX3Blcl9idWYsCW1pbl9yYXRlLCBtYXhfcmF0ZSwgcmF0ZV9tb2R1bGF0aW9uX2NtZCk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV9ldnJjX2VuY19jZmcpIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0pOwotCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7Ci0JZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7Ci0KLQllbmNfY2ZnLm1pbl9yYXRlID0gbWluX3JhdGU7Ci0JZW5jX2NmZy5tYXhfcmF0ZSA9IG1heF9yYXRlOwotCWVuY19jZmcucmF0ZV9tb2RfY21kID0gcmF0ZV9tb2R1bGF0aW9uX2NtZDsKLQllbmNfY2ZnLnJlc2VydmVkID0gMDsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZW5jX2NmZyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21hbW5kICVkIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIGVuY2RlYyBldnJjXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX2VuY19jZmdfYmxrX2Ftcm5iKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBmcmFtZXNfcGVyX2J1ZiwKLQkJCXVpbnQxNl90IGJhbmRfbW9kZSwgdWludDE2X3QgZHR4X2VuYWJsZSkKLXsKLQlzdHJ1Y3QgYXNtX2Ftcm5iX2VuY19jZmcgZW5jX2NmZzsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWZyYW1lc1slZF1iYW5kX21vZGVbMHglNHhdZHR4X2VuYWJsZVsweCU0eF1cbiIsCi0JCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgZnJhbWVzX3Blcl9idWYsIGJhbmRfbW9kZSwgZHR4X2VuYWJsZSk7Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmZW5jX2NmZy5oZHIsIHNpemVvZihlbmNfY2ZnKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCWVuY19jZmcuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU07Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRU5DREVDX0VOQ19DRkdfQkxLX1YyOwotCWVuY19jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV9hbXJuYl9lbmNfY2ZnKSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKTsKLQllbmNfY2ZnLmVuY2Jsay5mcmFtZXNfcGVyX2J1ZiA9IGZyYW1lc19wZXJfYnVmOwotCWVuY19jZmcuZW5jYmxrLmVuY19jZmdfYmxrX3NpemUgID0gZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fZW5jX2NmZ19ibGtfcGFyYW1fdjIpOwotCi0JZW5jX2NmZy5lbmNfbW9kZSA9IGJhbmRfbW9kZTsKLQllbmNfY2ZnLmR0eF9tb2RlID0gZHR4X2VuYWJsZTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZW5jX2NmZyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21hbW5kICVkIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIHNldCBlbmNkZWMgYW1ybmJcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fZW5jX2NmZ19ibGtfYW1yd2Ioc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGZyYW1lc19wZXJfYnVmLAotCQkJdWludDE2X3QgYmFuZF9tb2RlLCB1aW50MTZfdCBkdHhfZW5hYmxlKQotewotCXN0cnVjdCBhc21fYW1yd2JfZW5jX2NmZyBlbmNfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdZnJhbWVzWyVkXWJhbmRfbW9kZVsweCU0eF1kdHhfZW5hYmxlWzB4JTR4XVxuIiwKLQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBmcmFtZXNfcGVyX2J1ZiwgYmFuZF9tb2RlLCBkdHhfZW5hYmxlKTsKLQotCXE2YXNtX2FkZF9oZHIoYWMsICZlbmNfY2ZnLmhkciwgc2l6ZW9mKGVuY19jZmcpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JZW5jX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQllbmNfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9FTkNERUNfRU5DX0NGR19CTEtfVjI7Ci0JZW5jX2NmZy5lbmNkZWMucGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXNtX2FtcndiX2VuY19jZmcpIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9lbmNkZWNfcGFyYW0pOwotCWVuY19jZmcuZW5jYmxrLmZyYW1lc19wZXJfYnVmID0gZnJhbWVzX3Blcl9idWY7Ci0JZW5jX2NmZy5lbmNibGsuZW5jX2NmZ19ibGtfc2l6ZSAgPSBlbmNfY2ZnLmVuY2RlYy5wYXJhbV9zaXplIC0KLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9lbmNfY2ZnX2Jsa19wYXJhbV92Mik7Ci0KLQllbmNfY2ZnLmVuY19tb2RlID0gYmFuZF9tb2RlOwotCWVuY19jZmcuZHR4X21vZGUgPSBkdHhfZW5hYmxlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZlbmNfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgJWQgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIEFTTV9TVFJFQU1fQ01EX1NFVF9FTkNERUNfUEFSQU0sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBpbnQgc3RyZWFtX2lkLAotCQkJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwKQotewotCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa192MiBmbXQ7Ci0JdTggKmNoYW5uZWxfbWFwcGluZzsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24sIHJhdGUsCi0JCWNoYW5uZWxzKTsKLQotCXE2YXNtX3N0cmVhbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUsIHN0cmVhbV9pZCk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCS8qCi0JICogVXBkYXRlZCB0aGUgdG9rZW4gZmllbGQgd2l0aCBzdHJlYW0vc2Vzc2lvbiBmb3IgY29tcHJlc3NlZCBwbGF5YmFjawotCSAqIFBsYXRmb3JtIGRyaXZlciBtdXN0IGtub3cgdGhlIHRoZSBzdHJlYW0gd2l0aCB3aGljaCB0aGUgY29tbWFuZCBpcwotCSAqIGFzc29jaWF0ZWQKLQkgKi8KLQlpZiAoYWMtPmlvX21vZGUgJiBDT01QUkVTU0VEX1NUUkVBTV9JTykKLQkJcTZhc21fdXBkYXRlX3Rva2VuKCZmbXQuaGRyLnRva2VuLAotCQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJCSAgIHN0cmVhbV9pZCwKLQkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIFdBSVRfQ01EKTsKLQotCXByX2RlYnVnKCIlczogdG9rZW4gPSAweCV4LCBzdHJlYW1faWQgICVkLCBzZXNzaW9uIDB4JXhcbiIsCi0JCSAgX19mdW5jX18sIGZtdC5oZHIudG9rZW4sIHN0cmVhbV9pZCwgYWMtPnNlc3Npb24pOwotCi0JZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKLQlmbXQuZm10X2Jsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCi0JCQkJCXNpemVvZihmbXQuZm10X2Jsayk7Ci0JZm10Lm51bV9jaGFubmVscyA9IGNoYW5uZWxzOwotCWZtdC5iaXRzX3Blcl9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0JZm10LnNhbXBsZV9yYXRlID0gcmF0ZTsKLQlmbXQuaXNfc2lnbmVkID0gMTsKLQotCWNoYW5uZWxfbWFwcGluZyA9IGZtdC5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbF9tYXAsCi0JCQkgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCX0KLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgb3BlbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIGZvcm1hdCB1cGRhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCSAgICAgaW50IHN0cmVhbV9pZCwKLQkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUpCi17Ci0Jc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3BhcmFtX3YzIGZtdDsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCWludCByYzsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXWJwc1slZF13b3Jkc2l6ZVslZF1cbiIsIF9fZnVuY19fLAotCQkgYWMtPnNlc3Npb24sIHJhdGUsIGNoYW5uZWxzLAotCQkgYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKLQotCW1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JLyoKLQkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCi0JICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCi0JICogYXNzb2NpYXRlZAotCSAqLwotCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQotCQlmbXQuaGRyLnRva2VuID0gKChhYy0+c2Vzc2lvbiA8PCA4KSAmIDB4RkZGRjAwKSB8Ci0JCQkJKHN0cmVhbV9pZCAmIDB4RkYpOwotCi0JcHJfZGVidWcoIiVzOiB0b2tlbiA9IDB4JXgsIHN0cmVhbV9pZCAgJWQsIHNlc3Npb24gMHgleFxuIiwKLQkJIF9fZnVuY19fLCBmbXQuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdF9ibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQotCQkJCQlzaXplb2YoZm10LmZtdF9ibGspOwotCWZtdC5wYXJhbS5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKLQlmbXQucGFyYW0uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCWZtdC5wYXJhbS5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JZm10LnBhcmFtLmlzX3NpZ25lZCA9IDE7Ci0JZm10LnBhcmFtLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOwotCWNoYW5uZWxfbWFwcGluZyA9IGZtdC5wYXJhbS5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV92NChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCSAgICAgaW50IHN0cmVhbV9pZCwKLQkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkgICAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUsCi0JCQkJCSAgICAgdWludDE2X3QgZW5kaWFubmVzcywKLQkJCQkJICAgICB1aW50MTZfdCBtb2RlKQotewotCXN0cnVjdCBhc21fbXVsdGlfY2hhbm5lbF9wY21fZm10X2Jsa19wYXJhbV92NCBmbXQ7Ci0JdTggKmNoYW5uZWxfbWFwcGluZzsKLQlpbnQgcmM7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1icHNbJWRdd29yZHNpemVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJIGFjLT5zZXNzaW9uLCByYXRlLCBjaGFubmVscywKLQkJIGJpdHNfcGVyX3NhbXBsZSwgc2FtcGxlX3dvcmRfc2l6ZSk7Ci0KLQltZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotCXE2YXNtX3N0cmVhbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUsIHN0cmVhbV9pZCk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCS8qCi0JICogVXBkYXRlZCB0aGUgdG9rZW4gZmllbGQgd2l0aCBzdHJlYW0vc2Vzc2lvbiBmb3IgY29tcHJlc3NlZCBwbGF5YmFjawotCSAqIFBsYXRmb3JtIGRyaXZlciBtdXN0IGtub3cgdGhlIHRoZSBzdHJlYW0gd2l0aCB3aGljaCB0aGUgY29tbWFuZCBpcwotCSAqIGFzc29jaWF0ZWQKLQkgKi8KLQlpZiAoYWMtPmlvX21vZGUgJiBDT01QUkVTU0VEX1NUUkVBTV9JTykKLQkJZm10Lmhkci50b2tlbiA9ICgoYWMtPnNlc3Npb24gPDwgOCkgJiAweEZGRkYwMCkgfAotCQkJCShzdHJlYW1faWQgJiAweEZGKTsKLQotCXByX2RlYnVnKCIlczogdG9rZW4gPSAweCV4LCBzdHJlYW1faWQgICVkLCBzZXNzaW9uIDB4JXhcbiIsCi0JCSBfX2Z1bmNfXywgZm10Lmhkci50b2tlbiwgc3RyZWFtX2lkLCBhYy0+c2Vzc2lvbik7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKLQlmbXQucGFyYW0ubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZm10LnBhcmFtLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQlmbXQucGFyYW0uc2FtcGxlX3JhdGUgPSByYXRlOwotCWZtdC5wYXJhbS5pc19zaWduZWQgPSAxOwotCWZtdC5wYXJhbS5zYW1wbGVfd29yZF9zaXplID0gc2FtcGxlX3dvcmRfc2l6ZTsKLQlmbXQucGFyYW0uZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7Ci0JZm10LnBhcmFtLm1vZGUgPSBtb2RlOwotCWNoYW5uZWxfbWFwcGluZyA9IGZtdC5wYXJhbS5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscykKLXsKLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtKGFjLCByYXRlLAotCQkJCWNoYW5uZWxzLCAxNiwgYWMtPnN0cmVhbV9pZCwKLQkJCQl0cnVlLCBOVUxMKTsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQotewotCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYWMsIHJhdGUsCi0JCQkJY2hhbm5lbHMsIGJpdHNfcGVyX3NhbXBsZSwgYWMtPnN0cmVhbV9pZCwKLQkJCQl0cnVlLCBOVUxMKTsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlLCBpbnQgc3RyZWFtX2lkLAotCQkJCWJvb2wgdXNlX2RlZmF1bHRfY2htYXAsIGNoYXIgKmNoYW5uZWxfbWFwKQotewotCWlmICghdXNlX2RlZmF1bHRfY2htYXAgJiYgKGNoYW5uZWxfbWFwID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IE5vIHZhbGlkIGNoYW4gbWFwIGFuZCBjYW4ndCB1c2UgZGVmYXVsdFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY20oYWMsIHJhdGUsCi0JCQkJY2hhbm5lbHMsIGJpdHNfcGVyX3NhbXBsZSwgc3RyZWFtX2lkLAotCQkJCXVzZV9kZWZhdWx0X2NobWFwLCBjaGFubmVsX21hcCk7Ci19Ci0KLS8qCi0gKiBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3YzLSBzZW5kcyBwY20gZGVjb2RlcgotICoJCQkJCQkgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEByYXRlOiBzYW1wbGUgcmF0ZQotICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KLSAqIEBzdHJlYW1faWQ6IHN0cmVhbSBpZCBvZiBzdHJlYW0gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgotICogQHVzZV9kZWZhdWx0X2NobWFwOiB0cnVlIGlmIGRlZmF1bHQgY2hhbm5lbCBtYXAgIHRvIGJlIHVzZWQKLSAqIEBjaGFubmVsX21hcDogaW5wdXQgY2hhbm5lbCBtYXAKLSAqIEBzYW1wbGVfd29yZF9zaXplOiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwKLSAqLwotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19wY21fZm9ybWF0X3N1cHBvcnRfdjMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCQkgICB1aW50MzJfdCByYXRlLAotCQkJCQkJICAgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJCQkgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCQkgICBpbnQgc3RyZWFtX2lkLAotCQkJCQkJICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKLQkJCQkJCSAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkJICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSkKLXsKLQlpZiAoIXVzZV9kZWZhdWx0X2NobWFwICYmIChjaGFubmVsX21hcCA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBObyB2YWxpZCBjaGFuIG1hcCBhbmQgY2FuJ3QgdXNlIGRlZmF1bHRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX3YzKGFjLCByYXRlLAotCQkJCWNoYW5uZWxzLCBiaXRzX3Blcl9zYW1wbGUsIHN0cmVhbV9pZCwKLQkJCQl1c2VfZGVmYXVsdF9jaG1hcCwgY2hhbm5lbF9tYXAsCi0JCQkJc2FtcGxlX3dvcmRfc2l6ZSk7Ci0KLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX3BjbV9mb3JtYXRfc3VwcG9ydF92Myk7Ci0KLS8qCi0gKiBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0LSBzZW5kcyBwY20gZGVjb2RlcgotICoJCQkJCQkgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKgotICogQGFjOiBDbGllbnQgc2Vzc2lvbiBoYW5kbGUKLSAqIEByYXRlOiBzYW1wbGUgcmF0ZQotICogQGNoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBiaXRzX3Blcl9zYW1wbGU6IGJpdCB3aWR0aCBvZiBlbmNvZGVyIHNlc3Npb24KLSAqIEBzdHJlYW1faWQ6IHN0cmVhbSBpZCBvZiBzdHJlYW0gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbgotICogQHVzZV9kZWZhdWx0X2NobWFwOiB0cnVlIGlmIGRlZmF1bHQgY2hhbm5lbCBtYXAgIHRvIGJlIHVzZWQKLSAqIEBjaGFubmVsX21hcDogaW5wdXQgY2hhbm5lbCBtYXAKLSAqIEBzYW1wbGVfd29yZF9zaXplOiBTaXplIGluIGJpdHMgb2YgdGhlIHdvcmQgdGhhdCBob2xkcyBhIHNhbXBsZSBvZiBhIGNoYW5uZWwKLSAqIEBlbmRpYW5uZXNzOiBlbmRpYW5uZXNzIG9mIHRoZSBwY20gZGF0YQotICogQG1vZGU6IE1vZGUgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm8gYWJvdXQgdGhlIHBjbSBpbnB1dCBkYXRhCi0gKi8KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkJICAgdWludDMyX3QgcmF0ZSwKLQkJCQkJCSAgIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCQkJICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJCQkJICAgaW50IHN0cmVhbV9pZCwKLQkJCQkJCSAgIGJvb2wgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCQkgICBjaGFyICpjaGFubmVsX21hcCwKLQkJCQkJCSAgIHVpbnQxNl90IHNhbXBsZV93b3JkX3NpemUsCi0JCQkJCQkgICB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJCQkJICAgdWludDE2X3QgbW9kZSkKLXsKLQlpZiAoIXVzZV9kZWZhdWx0X2NobWFwICYmIChjaGFubmVsX21hcCA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBObyB2YWxpZCBjaGFuIG1hcCBhbmQgY2FuJ3QgdXNlIGRlZmF1bHRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX3Y0KGFjLCByYXRlLAotCQkJCWNoYW5uZWxzLCBiaXRzX3Blcl9zYW1wbGUsIHN0cmVhbV9pZCwKLQkJCQl1c2VfZGVmYXVsdF9jaG1hcCwgY2hhbm5lbF9tYXAsCi0JCQkJc2FtcGxlX3dvcmRfc2l6ZSwgZW5kaWFubmVzcywKLQkJCQltb2RlKTsKLQotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfcGNtX2Zvcm1hdF9zdXBwb3J0X3Y0KTsKLQotCi1zdGF0aWMgaW50IF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCwKLQkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCi17Ci0Jc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3YyIGZtdDsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgcmF0ZSwKLQkJY2hhbm5lbHMpOwotCi0JcTZhc21fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKLQlmbXQubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZm10LmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQlmbXQuc2FtcGxlX3JhdGUgPSByYXRlOwotCWZtdC5pc19zaWduZWQgPSAxOwotCi0JY2hhbm5lbF9tYXBwaW5nID0gZm10LmNoYW5uZWxfbWFwcGluZzsKLQotCW1lbXNldChjaGFubmVsX21hcHBpbmcsIDAsIFBDTV9GT1JNQVRfTUFYX05VTV9DSEFOTkVMKTsKLQotCWlmICh1c2VfZGVmYXVsdF9jaG1hcCkgewotCQlpZiAocTZhc21fbWFwX2NoYW5uZWxzKGNoYW5uZWxfbWFwcGluZywgY2hhbm5lbHMsIGZhbHNlKSkgewotCQkJcHJfZXJyKCIlczogbWFwIGNoYW5uZWxzIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2hhbm5lbHMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgZm9ybWF0IHVwZGF0ZVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3YzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCQkJICAgICAgdWludDMyX3QgcmF0ZSwKLQkJCQkJCSAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAotCQkJCQkJICAgICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKLQkJCQkJCSAgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkJICAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlLAotCQkJCQkJICAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSkKLXsKLQlzdHJ1Y3QgYXNtX211bHRpX2NoYW5uZWxfcGNtX2ZtdF9ibGtfcGFyYW1fdjMgZm10OwotCXU4ICpjaGFubmVsX21hcHBpbmc7Ci0JaW50IHJjOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdYnBzWyVkXXdvcmRzaXplWyVkXVxuIiwgX19mdW5jX18sCi0JCSBhYy0+c2Vzc2lvbiwgcmF0ZSwgY2hhbm5lbHMsCi0JCSBiaXRzX3Blcl9zYW1wbGUsIHNhbXBsZV93b3JkX3NpemUpOwotCi0JbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKLQlxNmFzbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdF9ibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQotCQkJCQlzaXplb2YoZm10LmZtdF9ibGspOwotCWZtdC5wYXJhbS5udW1fY2hhbm5lbHMgPSBjaGFubmVsczsKLQlmbXQucGFyYW0uYml0c19wZXJfc2FtcGxlID0gYml0c19wZXJfc2FtcGxlOwotCWZtdC5wYXJhbS5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0JZm10LnBhcmFtLmlzX3NpZ25lZCA9IDE7Ci0JZm10LnBhcmFtLnNhbXBsZV93b3JkX3NpemUgPSBzYW1wbGVfd29yZF9zaXplOwotCWNoYW5uZWxfbWFwcGluZyA9IGZtdC5wYXJhbS5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIGZvcm1hdCB1cGRhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkgICAgICAgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCQkgICAgICB1aW50MzJfdCByYXRlLAotCQkJCQkJICAgICAgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJCQkgICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkJICAgICAgY2hhciAqY2hhbm5lbF9tYXAsCi0JCQkJCQkgICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCQkgICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplLAotCQkJCQkJICAgICAgdWludDE2X3QgZW5kaWFubmVzcywKLQkJCQkJCSAgICAgIHVpbnQxNl90IG1vZGUpCi17Ci0Jc3RydWN0IGFzbV9tdWx0aV9jaGFubmVsX3BjbV9mbXRfYmxrX3BhcmFtX3Y0IGZtdDsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCWludCByYzsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXWJwc1slZF13b3Jkc2l6ZVslZF1cbiIsIF9fZnVuY19fLAotCQkgYWMtPnNlc3Npb24sIHJhdGUsIGNoYW5uZWxzLAotCQkgYml0c19wZXJfc2FtcGxlLCBzYW1wbGVfd29yZF9zaXplKTsKLQotCW1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0JcTZhc21fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKLQlmbXQucGFyYW0ubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZm10LnBhcmFtLmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQlmbXQucGFyYW0uc2FtcGxlX3JhdGUgPSByYXRlOwotCWZtdC5wYXJhbS5pc19zaWduZWQgPSAxOwotCWZtdC5wYXJhbS5zYW1wbGVfd29yZF9zaXplID0gc2FtcGxlX3dvcmRfc2l6ZTsKLQlmbXQucGFyYW0uZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7Ci0JZm10LnBhcmFtLm1vZGUgPSBtb2RlOwotCWNoYW5uZWxfbWFwcGluZyA9IGZtdC5wYXJhbS5jaGFubmVsX21hcHBpbmc7Ci0KLQltZW1zZXQoY2hhbm5lbF9tYXBwaW5nLCAwLCBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0KLQlpZiAodXNlX2RlZmF1bHRfY2htYXApIHsKLQkJaWYgKHE2YXNtX21hcF9jaGFubmVscyhjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxzLCBmYWxzZSkpIHsKLQkJCXByX2VycigiJXM6IG1hcCBjaGFubmVscyBmYWlsZWQgJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVsX21hcCwKLQkJCSBQQ01fRk9STUFUX01BWF9OVU1fQ0hBTk5FTCk7Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIGZvcm1hdCB1cGRhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkgICAgICAgX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkgICAgICAgYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY20oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCkKLXsKLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtKGFjLCByYXRlLAotCQkJY2hhbm5lbHMsIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFubmVsX21hcCwgMTYpOwotfQotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MigKLQkJc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLAotCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCwKLQkJdWludDE2X3QgYml0c19wZXJfc2FtcGxlKQotewotCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY20oYWMsIHJhdGUsCi0JCQljaGFubmVscywgdXNlX2RlZmF1bHRfY2htYXAsIGNoYW5uZWxfbWFwLAotCQkJYml0c19wZXJfc2FtcGxlKTsKLX0KLQotLyoKLSAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjMgLSBzZW5kcyBwY20gZGVjb2RlciBjb25maWd1cmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgZW5jb2RlciBzZXNzaW9uCi0gKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCAgdG8gYmUgdXNlZAotICogQGNoYW5uZWxfbWFwOiBpbnB1dCBjaGFubmVsIG1hcAotICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAotICovCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92MyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICAgICB1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQkJICAgICBib29sIHVzZV9kZWZhdWx0X2NobWFwLAotCQkJCQkgICAgIGNoYXIgKmNoYW5uZWxfbWFwLAotCQkJCQkgICAgIHVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJICAgICB1aW50MTZfdCBzYW1wbGVfd29yZF9zaXplKQotewotCXJldHVybiBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjMoYWMsIHJhdGUsIGNoYW5uZWxzLAotCQkJCQkJCSAgdXNlX2RlZmF1bHRfY2htYXAsCi0JCQkJCQkJICBjaGFubmVsX21hcCwKLQkJCQkJCQkgIGJpdHNfcGVyX3NhbXBsZSwKLQkJCQkJCQkgIHNhbXBsZV93b3JkX3NpemUpOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfY2hfcGNtX3YzKTsKLQotLyoKLSAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjQgLSBzZW5kcyBwY20gZGVjb2RlciBjb25maWd1cmF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgZW5jb2RlciBzZXNzaW9uCi0gKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCAgdG8gYmUgdXNlZAotICogQGNoYW5uZWxfbWFwOiBpbnB1dCBjaGFubmVsIG1hcAotICogQHNhbXBsZV93b3JkX3NpemU6IFNpemUgaW4gYml0cyBvZiB0aGUgd29yZCB0aGF0IGhvbGRzIGEgc2FtcGxlIG9mIGEgY2hhbm5lbAotICogQGVuZGlhbm5lc3M6IGVuZGlhbm5lc3Mgb2YgdGhlIHBjbSBkYXRhCi0gKiBAbW9kZTogTW9kZSB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mbyBhYm91dCB0aGUgcGNtIGlucHV0IGRhdGEKLSAqLwotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9jaF9wY21fdjQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgICAgdWludDMyX3QgcmF0ZSwgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkJCSAgICAgYm9vbCB1c2VfZGVmYXVsdF9jaG1hcCwKLQkJCQkJICAgICBjaGFyICpjaGFubmVsX21hcCwKLQkJCQkJICAgICB1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUsCi0JCQkJCSAgICAgdWludDE2X3Qgc2FtcGxlX3dvcmRfc2l6ZSwKLQkJCQkJICAgICB1aW50MTZfdCBlbmRpYW5uZXNzLAotCQkJCQkgICAgIHVpbnQxNl90IG1vZGUpCi17Ci0JcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NChhYywgcmF0ZSwgY2hhbm5lbHMsCi0JCQkJCQkJICB1c2VfZGVmYXVsdF9jaG1hcCwKLQkJCQkJCQkgIGNoYW5uZWxfbWFwLAotCQkJCQkJCSAgYml0c19wZXJfc2FtcGxlLAotCQkJCQkJCSAgc2FtcGxlX3dvcmRfc2l6ZSwKLQkJCQkJCQkgIGVuZGlhbm5lc3MsCi0JCQkJCQkJICBtb2RlKTsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2NoX3BjbV92NCk7Ci0KLS8qCi0gKiBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfZ2VuX2NvbXByIC0gc2V0IHVwIGdlbmVyaWMgY29tcHJlc3MgZm9ybWF0IHBhcmFtcwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAdXNlX2RlZmF1bHRfY2htYXA6IHRydWUgaWYgZGVmYXVsdCBjaGFubmVsIG1hcCB0byBiZSB1c2VkCi0gKiBAY2hhbm5lbF9tYXA6IGlucHV0IGNoYW5uZWwgbWFwCi0gKiBAYml0c19wZXJfc2FtcGxlOiBiaXQgd2lkdGggb2YgZ2VuIGNvbXByZXNzIHN0cmVhbQotICovCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2dlbl9jb21wcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQl1aW50MzJfdCByYXRlLCB1aW50MzJfdCBjaGFubmVscywKLQkJCQlib29sIHVzZV9kZWZhdWx0X2NobWFwLCBjaGFyICpjaGFubmVsX21hcCwKLQkJCQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGUpCi17Ci0Jc3RydWN0IGFzbV9nZW5lcmljX2NvbXByZXNzZWRfZm10X2Jsa190IGZtdDsKLQl1OCAqY2hhbm5lbF9tYXBwaW5nOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1icHNbJWRdXG4iLAotCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLCByYXRlLAotCQkgY2hhbm5lbHMsIGJpdHNfcGVyX3NhbXBsZSk7Ci0KLQltZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKGZtdCkpOwotCXE2YXNtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKLQlmbXQubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZm10LmJpdHNfcGVyX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKLQlmbXQuc2FtcGxpbmdfcmF0ZSA9IHJhdGU7Ci0KLQljaGFubmVsX21hcHBpbmcgPSBmbXQuY2hhbm5lbF9tYXBwaW5nOwotCi0JbWVtc2V0KGNoYW5uZWxfbWFwcGluZywgMCwgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCi0JaWYgKHVzZV9kZWZhdWx0X2NobWFwKSB7Ci0JCWlmIChxNmFzbV9tYXBfY2hhbm5lbHMoY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVscywgZmFsc2UpKSB7Ci0JCQlwcl9lcnIoIiVzOiBtYXAgY2hhbm5lbHMgZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSB7Ci0JCW1lbWNweShjaGFubmVsX21hcHBpbmcsIGNoYW5uZWxfbWFwLAotCQkgICAgICAgUENNX0ZPUk1BVF9NQVhfTlVNX0NIQU5ORUwpOwotCX0KLQotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBmb3JtYXQgdXBkYXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wocTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2dlbl9jb21wcik7Ci0KLQotLyoKLSAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19pZWMgLSBzZXQgdXAgSUVDNjE5MzcgKGNvbXByZXNzZWQpIG9yIElFQzYwOTU4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBjbSkgZm9ybWF0IHBhcmFtcy4gQm90aCBhdWRpbyBzdGFuZGFyZHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIHNhbWUgZm9ybWF0IGFuZCBhcmUgdXNlZCBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRE1JIG9yIFNQRElGLgotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAcmF0ZTogc2FtcGxlIHJhdGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzCi0gKi8KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfaWVjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXVpbnQzMl90IHJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQotewotCXN0cnVjdCBhc21faWVjX2NvbXByZXNzZWRfZm10X2Jsa190IGZtdDsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdXG4iLAotCQkgX19mdW5jX18sIGFjLT5zZXNzaW9uLCByYXRlLAotCQkgY2hhbm5lbHMpOwotCi0JbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKLQlxNmFzbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUpOwotCi0JZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfSUVDXzYwOTU4X01FRElBX0ZNVDsKLQlmbXQubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0JZm10LnNhbXBsaW5nX3JhdGUgPSByYXRlOwotCi0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbWFtbmQgb3BlbiBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIGZvcm1hdCB1cGRhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfaWVjKTsKLQotc3RhdGljIGludCBfX3E2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IGFzbV9hYWNfZm10X2Jsa192MiBmbXQ7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1yYXRlWyVkXWNoWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uLAotCQljZmctPnNhbXBsZV9yYXRlLCBjZmctPmNoX2NmZyk7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQkvKgotCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKLQkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKLQkgKiBhc3NvY2lhdGVkCi0JICovCi0JaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCi0JCXE2YXNtX3VwZGF0ZV90b2tlbigmZm10Lmhkci50b2tlbiwKLQkJCQkgICBhYy0+c2Vzc2lvbiwKLQkJCQkgICBzdHJlYW1faWQsCi0JCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCi0JCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KLQkJCQkgICBXQUlUX0NNRCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAotCQkgIF9fZnVuY19fLCBmbXQuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRfYmxrKTsKLQlmbXQuYWFjX2ZtdF9mbGFnID0gY2ZnLT5mb3JtYXQ7Ci0JZm10LmF1ZGlvX29ianlwZSA9IGNmZy0+YW90OwotCS8qIElmIHplcm8sIFBDRSBpcyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiBiaXRzdHJlYW0qLwotCWZtdC50b3RhbF9zaXplX29mX1BDRV9iaXRzID0gMDsKLQlmbXQuY2hhbm5lbF9jb25maWcgPSBjZmctPmNoX2NmZzsKLQlmbXQuc2FtcGxlX3JhdGUgPSBjZmctPnNhbXBsZV9yYXRlOwotCi0JcHJfZGVidWcoIiVzOiBmb3JtYXQ9MHgleCBjZmdfc2l6ZT0lZCBhYWMtY2ZnPTB4JXggYW90PSVkIGNoPSVkIHNyPSVkXG4iLAotCQkJX19mdW5jX18sIGZtdC5hYWNfZm10X2ZsYWcsIGZtdC5mbXRfYmxrLmZtdF9ibGtfc2l6ZSwKLQkJCWZtdC5hYWNfZm10X2ZsYWcsCi0JCQlmbXQuYXVkaW9fb2JqeXBlLAotCQkJZm10LmNoYW5uZWxfY29uZmlnLAotCQkJZm10LnNhbXBsZV9yYXRlKTsKLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19tdWx0aV9hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IGFzbV9hYWNfY2ZnICpjZmcpCi17Ci0JcmV0dXJuIF9fcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX211bHRpX2FhYyhhYywgY2ZnLCBhYy0+c3RyZWFtX2lkKTsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2FhY19jZmcgKmNmZykKLXsKLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKGFjLCBjZmcsIGFjLT5zdHJlYW1faWQpOwotfQotCi1pbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19hYWMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQlzdHJ1Y3QgYXNtX2FhY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlyZXR1cm4gX19xNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfbXVsdGlfYWFjKGFjLCBjZmcsIHN0cmVhbV9pZCk7Ci19Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfd21hKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXZvaWQgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX3dtYXN0ZHY5X2ZtdF9ibGtfdjIgZm10OwotCXN0cnVjdCBhc21fd21hX2NmZyAqd21hX2NmZyA9IChzdHJ1Y3QgYXNtX3dtYV9jZmcgKiljZmc7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCJzZXNzaW9uWyVkXWZvcm1hdF90YWdbMHglNHhdIHJhdGVbJWRdIGNoWzB4JTR4XSBicHNbJWRdLCBiYWxpZ25bMHglNHhdLCBiaXRfc2FtcGxlWzB4JTR4XSwgY2hfbXNrWyVkXSwgZW5jX29wdFsweCU0eF1cbiIsCi0JCWFjLT5zZXNzaW9uLCB3bWFfY2ZnLT5mb3JtYXRfdGFnLCB3bWFfY2ZnLT5zYW1wbGVfcmF0ZSwKLQkJd21hX2NmZy0+Y2hfY2ZnLCB3bWFfY2ZnLT5hdmdfYnl0ZXNfcGVyX3NlYywKLQkJd21hX2NmZy0+YmxvY2tfYWxpZ24sIHdtYV9jZmctPnZhbGlkX2JpdHNfcGVyX3NhbXBsZSwKLQkJd21hX2NmZy0+Y2hfbWFzaywgd21hX2NmZy0+ZW5jb2RlX29wdCk7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCi0JCQkJCXNpemVvZihmbXQuZm10YmxrKTsKLQlmbXQuZm10YWcgPSB3bWFfY2ZnLT5mb3JtYXRfdGFnOwotCWZtdC5udW1fY2hhbm5lbHMgPSB3bWFfY2ZnLT5jaF9jZmc7Ci0JZm10LnNhbXBsZV9yYXRlID0gd21hX2NmZy0+c2FtcGxlX3JhdGU7Ci0JZm10LmF2Z19ieXRlc19wZXJfc2VjID0gd21hX2NmZy0+YXZnX2J5dGVzX3Blcl9zZWM7Ci0JZm10LmJsa19hbGlnbiA9IHdtYV9jZmctPmJsb2NrX2FsaWduOwotCWZtdC5iaXRzX3Blcl9zYW1wbGUgPQotCQkJd21hX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlOwotCWZtdC5jaGFubmVsX21hc2sgPSB3bWFfY2ZnLT5jaF9tYXNrOwotCWZtdC5lbmNfb3B0aW9ucyA9IHdtYV9jZmctPmVuY29kZV9vcHQ7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21hbW5kIG9wZW4gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja193bWFwcm8oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJdm9pZCAqY2ZnLCBpbnQgc3RyZWFtX2lkKQotewotCXN0cnVjdCBhc21fd21hcHJvdjEwX2ZtdF9ibGtfdjIgZm10OwotCXN0cnVjdCBhc21fd21hcHJvX2NmZyAqd21hcHJvX2NmZyA9IChzdHJ1Y3QgYXNtX3dtYXByb19jZmcgKiljZmc7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1mb3JtYXRfdGFnWzB4JTR4XSByYXRlWyVkXSBjaFsweCU0eF0gYnBzWyVkXSwgYmFsaWduWzB4JTR4XSwgYml0X3NhbXBsZVsweCU0eF0sIGNoX21za1slZF0sIGVuY19vcHRbMHglNHhdLCBhZHZfZW5jX29wdFsweCU0eF0sIGFkdl9lbmNfb3B0MlsweCU4eF1cbiIsCi0JCV9fZnVuY19fLAotCQlhYy0+c2Vzc2lvbiwgd21hcHJvX2NmZy0+Zm9ybWF0X3RhZywgd21hcHJvX2NmZy0+c2FtcGxlX3JhdGUsCi0JCXdtYXByb19jZmctPmNoX2NmZywgIHdtYXByb19jZmctPmF2Z19ieXRlc19wZXJfc2VjLAotCQl3bWFwcm9fY2ZnLT5ibG9ja19hbGlnbiwgd21hcHJvX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlLAotCQl3bWFwcm9fY2ZnLT5jaF9tYXNrLCB3bWFwcm9fY2ZnLT5lbmNvZGVfb3B0LAotCQl3bWFwcm9fY2ZnLT5hZHZfZW5jb2RlX29wdCwgd21hcHJvX2NmZy0+YWR2X2VuY29kZV9vcHQyKTsKLQotCXE2YXNtX3N0cmVhbV9hZGRfaGRyKGFjLCAmZm10Lmhkciwgc2l6ZW9mKGZtdCksIFRSVUUsIHN0cmVhbV9pZCk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCi0JZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKLQlmbXQuZm10YmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJCXNpemVvZihmbXQuZm10YmxrKTsKLQotCWZtdC5mbXRhZyA9IHdtYXByb19jZmctPmZvcm1hdF90YWc7Ci0JZm10Lm51bV9jaGFubmVscyA9IHdtYXByb19jZmctPmNoX2NmZzsKLQlmbXQuc2FtcGxlX3JhdGUgPSB3bWFwcm9fY2ZnLT5zYW1wbGVfcmF0ZTsKLQlmbXQuYXZnX2J5dGVzX3Blcl9zZWMgPQotCQkJCXdtYXByb19jZmctPmF2Z19ieXRlc19wZXJfc2VjOwotCWZtdC5ibGtfYWxpZ24gPSB3bWFwcm9fY2ZnLT5ibG9ja19hbGlnbjsKLQlmbXQuYml0c19wZXJfc2FtcGxlID0gd21hcHJvX2NmZy0+dmFsaWRfYml0c19wZXJfc2FtcGxlOwotCWZtdC5jaGFubmVsX21hc2sgPSB3bWFwcm9fY2ZnLT5jaF9tYXNrOwotCWZtdC5lbmNfb3B0aW9ucyA9IHdtYXByb19jZmctPmVuY29kZV9vcHQ7Ci0JZm10LnVzQWR2YW5jZWRFbmNvZGVPcHQgPSB3bWFwcm9fY2ZnLT5hZHZfZW5jb2RlX29wdDsKLQlmbXQuYWR2YW5jZWRfZW5jX29wdGlvbnMyID0gd21hcHJvX2NmZy0+YWR2X2VuY29kZV9vcHQyOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBvcGVuIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYW1yd2JwbHVzKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXN0cnVjdCBhc21fYW1yd2JwbHVzX2NmZyAqY2ZnKQotewotCXN0cnVjdCBhc21fYW1yd2JwbHVzX2ZtdF9ibGtfdjIgZm10OwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdYmFuZC1tb2RlWyVkXWZyYW1lLWZtdFslZF1jaFslZF1cbiIsCi0JCV9fZnVuY19fLAotCQlhYy0+c2Vzc2lvbiwKLQkJY2ZnLT5hbXJfYmFuZF9tb2RlLAotCQljZmctPmFtcl9mcmFtZV9mbXQsCi0JCWNmZy0+bnVtX2NoYW5uZWxzKTsKLQotCXE2YXNtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCi0JZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKLQlmbXQuZm10YmxrLmZtdF9ibGtfc2l6ZSA9IHNpemVvZihmbXQpIC0gc2l6ZW9mKGZtdC5oZHIpIC0KLQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOwotCWZtdC5hbXJfZnJhbWVfZm10ID0gY2ZnLT5hbXJfZnJhbWVfZm10OwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tYW1uZCBtZWRpYSBmb3JtYXQgdXBkYXRlIGZhaWxlZC4uICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19mbGFjKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXN0cnVjdCBhc21fZmxhY19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX2ZsYWNfZm10X2Jsa192MiBmbXQ7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlcyA6c2Vzc2lvblslZF0gcmF0ZVslZF0gY2hbJWRdIHNpemVbJWRdIHN0cmVhbV9pZFslZF1cbiIsCi0JCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5jaF9jZmcsCi0JCWNmZy0+c2FtcGxlX3NpemUsIHN0cmVhbV9pZCk7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCi0JCQkJCQlzaXplb2YoZm10LmZtdGJsayk7Ci0KLQlmbXQuaXNfc3RyZWFtX2luZm9fcHJlc2VudCA9IGNmZy0+c3RyZWFtX2luZm9fcHJlc2VudDsKLQlmbXQubnVtX2NoYW5uZWxzID0gY2ZnLT5jaF9jZmc7Ci0JZm10Lm1pbl9ibGtfc2l6ZSA9IGNmZy0+bWluX2Jsa19zaXplOwotCWZtdC5tYXhfYmxrX3NpemUgPSBjZmctPm1heF9ibGtfc2l6ZTsKLQlmbXQuc2FtcGxlX3JhdGUgPSBjZmctPnNhbXBsZV9yYXRlOwotCWZtdC5taW5fZnJhbWVfc2l6ZSA9IGNmZy0+bWluX2ZyYW1lX3NpemU7Ci0JZm10Lm1heF9mcmFtZV9zaXplID0gY2ZnLT5tYXhfZnJhbWVfc2l6ZTsKLQlmbXQuc2FtcGxlX3NpemUgPSBjZmctPnNhbXBsZV9zaXplOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyA6Q29tYW1uZCBtZWRpYSBmb3JtYXQgdXBkYXRlIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzIDp0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfYWxhYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlzdHJ1Y3QgYXNtX2FsYWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IGFzbV9hbGFjX2ZtdF9ibGtfdjIgZm10OwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMgOnNlc3Npb25bJWRdcmF0ZVslZF1jaFslZF1cbiIsIF9fZnVuY19fLAotCQlhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSwgY2ZnLT5udW1fY2hhbm5lbHMpOwotCi0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQotCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOwotCi0JZm10LmZyYW1lX2xlbmd0aCA9IGNmZy0+ZnJhbWVfbGVuZ3RoOwotCWZtdC5jb21wYXRpYmxlX3ZlcnNpb24gPSBjZmctPmNvbXBhdGlibGVfdmVyc2lvbjsKLQlmbXQuYml0X2RlcHRoID0gY2ZnLT5iaXRfZGVwdGg7Ci0JZm10LnBiID0gY2ZnLT5wYjsKLQlmbXQubWIgPSBjZmctPm1iOwotCWZtdC5rYiA9IGNmZy0+a2I7Ci0JZm10Lm51bV9jaGFubmVscyA9IGNmZy0+bnVtX2NoYW5uZWxzOwotCWZtdC5tYXhfcnVuID0gY2ZnLT5tYXhfcnVuOwotCWZtdC5tYXhfZnJhbWVfYnl0ZXMgPSBjZmctPm1heF9mcmFtZV9ieXRlczsKLQlmbXQuYXZnX2JpdF9yYXRlID0gY2ZnLT5hdmdfYml0X3JhdGU7Ci0JZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKLQlmbXQuY2hhbm5lbF9sYXlvdXRfdGFnID0gY2ZnLT5jaGFubmVsX2xheW91dF90YWc7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIDpDb21hbW5kIG1lZGlhIGZvcm1hdCB1cGRhdGUgZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXMgOnRpbWVvdXQuIHdhaXRlZCBmb3IgRk9STUFUX1VQREFURVxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExIC0gc2VuZHMgZzcxMSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCi0gKiBAYWM6IENsaWVudCBzZXNzaW9uIGhhbmRsZQotICogQGNmZzogQXVkaW8gc3RyZWFtIG1hbmFnZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKiBAc3RyZWFtX2lkOiBTdHJlYW0gaWQKLSAqLwotaW50IHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19nNzExKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCXN0cnVjdCBhc21fZzcxMV9kZWNfY2ZnICpjZmcsIGludCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IGFzbV9nNzExX2RlY19mbXRfYmxrX3YyIGZtdDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFjZmcpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBBU00gY29uZmlnXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJlYW1faWQgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHN0cmVhbSBpZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXMgOnNlc3Npb25bJWRdcmF0ZVslZF1cbiIsIF9fZnVuY19fLAotCQlhYy0+c2Vzc2lvbiwgY2ZnLT5zYW1wbGVfcmF0ZSk7Ci0KLQltZW1zZXQoJmZtdCwgMCwgc2l6ZW9mKHN0cnVjdCBhc21fZzcxMV9kZWNfZm10X2Jsa192MikpOwotCi0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQotCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOwotCi0JZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgOkNvbW1hbmQgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChxNmFzbV9tZWRpYV9mb3JtYXRfYmxvY2tfZzcxMSk7Ci0KLWludCBxNmFzbV9zdHJlYW1fbWVkaWFfZm9ybWF0X2Jsb2NrX3ZvcmJpcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlzdHJ1Y3QgYXNtX3ZvcmJpc19jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX3ZvcmJpc19mbXRfYmxrX3YyIGZtdDsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzIDpzZXNzaW9uWyVkXSBiaXRfc3RyZWFtX2ZtdFslZF0gc3RyZWFtX2lkWyVkXVxuIiwKLQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBjZmctPmJpdF9zdHJlYW1fZm10LCBzdHJlYW1faWQpOwotCi0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlmbXQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9NRURJQV9GTVRfVVBEQVRFX1YyOwotCWZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGZtdCkgLSBzaXplb2YoZm10LmhkcikgLQotCQkJCQkJc2l6ZW9mKGZtdC5mbXRibGspOwotCi0JZm10LmJpdF9zdHJlYW1fZm10ID0gY2ZnLT5iaXRfc3RyZWFtX2ZtdDsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmZm10KTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXMgOkNvbWFtbmQgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2FwZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlzdHJ1Y3QgYXNtX2FwZV9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX2FwZV9mbXRfYmxrX3YyIGZtdDsKLQlpbnQgcmMgPSAwOwotCi0JcHJfZGVidWcoIiVzIDpzZXNzaW9uWyVkXXJhdGVbJWRdY2hbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCWFjLT5zZXNzaW9uLCBjZmctPnNhbXBsZV9yYXRlLCBjZmctPm51bV9jaGFubmVscyk7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmZtdC5oZHIsIHNpemVvZihmbXQpLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCi0JCXNpemVvZihmbXQuZm10YmxrKTsKLQotCWZtdC5jb21wYXRpYmxlX3ZlcnNpb24gPSBjZmctPmNvbXBhdGlibGVfdmVyc2lvbjsKLQlmbXQuY29tcHJlc3Npb25fbGV2ZWwgPSBjZmctPmNvbXByZXNzaW9uX2xldmVsOwotCWZtdC5mb3JtYXRfZmxhZ3MgPSBjZmctPmZvcm1hdF9mbGFnczsKLQlmbXQuYmxvY2tzX3Blcl9mcmFtZSA9IGNmZy0+YmxvY2tzX3Blcl9mcmFtZTsKLQlmbXQuZmluYWxfZnJhbWVfYmxvY2tzID0gY2ZnLT5maW5hbF9mcmFtZV9ibG9ja3M7Ci0JZm10LnRvdGFsX2ZyYW1lcyA9IGNmZy0+dG90YWxfZnJhbWVzOwotCWZtdC5iaXRzX3Blcl9zYW1wbGUgPSBjZmctPmJpdHNfcGVyX3NhbXBsZTsKLQlmbXQubnVtX2NoYW5uZWxzID0gY2ZnLT5udW1fY2hhbm5lbHM7Ci0JZm10LnNhbXBsZV9yYXRlID0gY2ZnLT5zYW1wbGVfcmF0ZTsKLQlmbXQuc2Vla190YWJsZV9wcmVzZW50ID0gY2ZnLT5zZWVrX3RhYmxlX3ByZXNlbnQ7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmZtdCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzIDpDb21hbW5kIG1lZGlhIGZvcm1hdCB1cGRhdGUgZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlcyA6dGltZW91dC4gd2FpdGVkIGZvciBGT1JNQVRfVVBEQVRFXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2RzZC0gU2VuZHMgRFNEIERlY29kZXIKLSAqIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotICoKLSAqIEBhYzogQ2xpZW50IHNlc3Npb24gaGFuZGxlCi0gKiBAY2ZnOiBEU0QgTWVkaWEgRm9ybWF0IENvbmZpZ3VyYXRpb24uCi0gKiBAc3RyZWFtX2lkOiBzdHJlYW0gaWQgb2Ygc3RyZWFtIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24KLSAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQotICovCi1pbnQgcTZhc21fbWVkaWFfZm9ybWF0X2Jsb2NrX2RzZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQlzdHJ1Y3QgYXNtX2RzZF9jZmcgKmNmZywgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX2RzZF9mbXRfYmxrX3YyIGZtdDsKLQlpbnQgcmM7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIGRhdGFfcmF0ZVslZF0gY2hbJWRdXG4iLCBfX2Z1bmNfXywKLQkJIGFjLT5zZXNzaW9uLCBjZmctPmRzZF9kYXRhX3JhdGUsIGNmZy0+bnVtX2NoYW5uZWxzKTsKLQotCW1lbXNldCgmZm10LCAwLCBzaXplb2YoZm10KSk7Ci0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZmbXQuaGRyLCBzaXplb2YoZm10KSwgVFJVRSwgc3RyZWFtX2lkKTsKLQotCWZtdC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX01FRElBX0ZNVF9VUERBVEVfVjI7Ci0JZm10LmZtdGJsay5mbXRfYmxrX3NpemUgPSBzaXplb2YoZm10KSAtIHNpemVvZihmbXQuaGRyKSAtCi0JCQkJCXNpemVvZihmbXQuZm10YmxrKTsKLQotCWZtdC5udW1fdmVyc2lvbiA9IGNmZy0+bnVtX3ZlcnNpb247Ci0JZm10LmlzX2JpdHdpc2VfYmlnX2VuZGlhbiA9IGNmZy0+aXNfYml0d2lzZV9iaWdfZW5kaWFuOwotCWZtdC5kc2RfY2hhbm5lbF9ibG9ja19zaXplID0gY2ZnLT5kc2RfY2hhbm5lbF9ibG9ja19zaXplOwotCWZtdC5udW1fY2hhbm5lbHMgPSBjZmctPm51bV9jaGFubmVsczsKLQlmbXQuZHNkX2RhdGFfcmF0ZSA9IGNmZy0+ZHNkX2RhdGFfcmF0ZTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZmbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCBEU0QgbWVkaWEgZm9ybWF0IHVwZGF0ZSBmYWlsZWQsIGVycjogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgRFNEIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldHVybiAwOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2YXNtX21lZGlhX2Zvcm1hdF9ibG9ja19kc2QpOwotCi1pbnQgcTZhc21fc3RyZWFtX21lZGlhX2Zvcm1hdF9ibG9ja19hcHR4X2RlYyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJCXVpbnQzMl90IHNyYXRlLCBpbnQgc3RyZWFtX2lkKQotewotCXN0cnVjdCBhc21fYXB0eF9kZWNfZm10X2Jsa192MiBhcHR4X2ZtdDsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFhYy0+c2Vzc2lvbikgewotCQlwcl9lcnIoIiVzOiBhYyBzZXNzaW9uIGludmFsaWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlwcl9kZWJ1ZygiJXMgOnNlc3Npb25bJWRdIHJhdGVbJWRdIHN0cmVhbV9pZFslZF1cbiIsCi0JCV9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgc3JhdGUsIHN0cmVhbV9pZCk7Ci0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcihhYywgJmFwdHhfZm10Lmhkciwgc2l6ZW9mKGFwdHhfZm10KSwgVFJVRSwKLQkJCQlzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCWFwdHhfZm10Lmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfTUVESUFfRk1UX1VQREFURV9WMjsKLQlhcHR4X2ZtdC5mbXRibGsuZm10X2Jsa19zaXplID0gc2l6ZW9mKGFwdHhfZm10KSAtIHNpemVvZihhcHR4X2ZtdC5oZHIpIC0KLQkJCQkJCXNpemVvZihhcHR4X2ZtdC5mbXRibGspOwotCi0JYXB0eF9mbXQuc2FtcGxlX3JhdGUgPSBzcmF0ZTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmYXB0eF9mbXQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlcyA6Q29tYW1uZCBtZWRpYSBmb3JtYXQgdXBkYXRlIGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzIDp0aW1lb3V0LiB3YWl0ZWQgZm9yIEZPUk1BVF9VUERBVEVcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHBhcmFtX2lkLAotCQkJCWludCBwYXJhbV92YWx1ZSwgaW50IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXNtX2RlY19kZHBfZW5kcF9wYXJhbV92MiBkZHBfY2ZnOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlc3Npb25bJWRdIHN0cmVhbVslZF0scGFyYW1faWRbJWRdcGFyYW1fdmFsdWVbJWRdIiwKLQkJIF9fZnVuY19fLCBhYy0+c2Vzc2lvbiwgc3RyZWFtX2lkLCBwYXJhbV9pZCwgcGFyYW1fdmFsdWUpOwotCi0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZkZHBfY2ZnLmhkciwgc2l6ZW9mKGRkcF9jZmcpLCBUUlVFLAotCQkJICAgICBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQkvKgotCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKLQkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSBzdHJlYW0gd2l0aCB3aGljaCB0aGUgY29tbWFuZCBpcwotCSAqIGFzc29jaWF0ZWQKLQkgKi8KLQlpZiAoYWMtPmlvX21vZGUgJiBDT01QUkVTU0VEX1NUUkVBTV9JTykKLQkJcTZhc21fdXBkYXRlX3Rva2VuKCZkZHBfY2ZnLmhkci50b2tlbiwKLQkJCQkgICBhYy0+c2Vzc2lvbiwKLQkJCQkgICBzdHJlYW1faWQsCi0JCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCi0JCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KLQkJCQkgICBXQUlUX0NNRCk7Ci0JZGRwX2NmZy5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTTsKLQlkZHBfY2ZnLmVuY2RlYy5wYXJhbV9pZCA9IHBhcmFtX2lkOwotCWRkcF9jZmcuZW5jZGVjLnBhcmFtX3NpemUgPSBzaXplb2Yoc3RydWN0IGFzbV9kZWNfZGRwX2VuZHBfcGFyYW1fdjIpIC0KLQkJCQkoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtKSk7Ci0JZGRwX2NmZy5lbmRwX3BhcmFtX3ZhbHVlID0gcGFyYW1fdmFsdWU7Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZkZHBfY2ZnKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgb3Bjb2RlWzB4JXhdIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0IG9wY29kZVsweCV4XVxuIiwgX19mdW5jX18sCi0JCQlkZHBfY2ZnLmhkci5vcGNvZGUpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9kczFfc2V0X2VuZHBfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgICAgaW50IHBhcmFtX2lkLCBpbnQgcGFyYW1fdmFsdWUpCi17Ci0JcmV0dXJuIF9fcTZhc21fZHMxX3NldF9lbmRwX3BhcmFtcyhhYywgcGFyYW1faWQsIHBhcmFtX3ZhbHVlLAotCQkJCQkgICBhYy0+c3RyZWFtX2lkKTsKLX0KLQotaW50IHE2YXNtX2RzMV9zZXRfc3RyZWFtX2VuZHBfcGFyYW1zKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJCSAgICAgaW50IHBhcmFtX2lkLCBpbnQgcGFyYW1fdmFsdWUsCi0JCQkJICAgICBpbnQgc3RyZWFtX2lkKQotewotCXJldHVybiBfX3E2YXNtX2RzMV9zZXRfZW5kcF9wYXJhbXMoYWMsIHBhcmFtX2lkLCBwYXJhbV92YWx1ZSwKLQkJCQkJICAgc3RyZWFtX2lkKTsKLX0KLQotaW50IHE2YXNtX21lbW9yeV9tYXAoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHBoeXNfYWRkcl90IGJ1Zl9hZGQsIGludCBkaXIsCi0JCQkJdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCkKLXsKLQlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICptbWFwX3JlZ2lvbnMgPSBOVUxMOwotCXN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAgKm1yZWdpb25zID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKLQl2b2lkCSptbWFwX3JlZ2lvbl9jbWQgPSBOVUxMOwotCXZvaWQJKnBheWxvYWQgPSBOVUxMOwotCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1ZmZlcl9ub2RlID0gTlVMTDsKLQlpbnQJcmMgPSAwOwotCWludAljbWRfc2l6ZSA9IDA7Ci0KLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFjLT5tbWFwX2FwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IG1tYXAgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlwcl9kZWJ1ZygiJXM6IFNlc3Npb25bJWRdXG4iLCBfX2Z1bmNfXywgYWMtPnNlc3Npb24pOwotCi0JYnVmZmVyX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXJfbm9kZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQotCQkJKyBzaXplb2Yoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkKSAqIGJ1ZmNudDsKLQotCW1tYXBfcmVnaW9uX2NtZCA9IGt6YWxsb2MoY21kX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChtbWFwX3JlZ2lvbl9jbWQgPT0gTlVMTCkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWtmcmVlKGJ1ZmZlcl9ub2RlKTsKLQkJcmV0dXJuIHJjOwotCX0KLQltbWFwX3JlZ2lvbnMgPSAoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqKQotCQkJCQkJCW1tYXBfcmVnaW9uX2NtZDsKLQlxNmFzbV9hZGRfbW1hcGhkcihhYywgJm1tYXBfcmVnaW9ucy0+aGRyLCBjbWRfc2l6ZSwgZGlyKTsKLQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAtMSk7Ci0JbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOwotCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0JbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudCAmIDB4MDBmZjsKLQltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOwotCXBheWxvYWQgPSAoKHU4ICopIG1tYXBfcmVnaW9uX2NtZCArCi0JCXNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSk7Ci0JbXJlZ2lvbnMgPSAoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICopcGF5bG9hZDsKLQotCWFjLT5wb3J0W2Rpcl0udG1wX2hkbCA9IDA7Ci0JcG9ydCA9ICZhYy0+cG9ydFtkaXJdOwotCXByX2RlYnVnKCIlczogYnVmX2FkZCAweCVwSywgYnVmc3o6ICVkXG4iLCBfX2Z1bmNfXywKLQkJJmJ1Zl9hZGQsIGJ1ZnN6KTsKLQltcmVnaW9ucy0+c2htX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhidWZfYWRkKTsKLQltcmVnaW9ucy0+c2htX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYnVmX2FkZCk7Ci0JbXJlZ2lvbnMtPm1lbV9zaXplX2J5dGVzID0gYnVmc3o7Ci0JKyttcmVnaW9uczsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopIG1tYXBfcmVnaW9uX2NtZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtbWFwIG9wWzB4JXhdcmNbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCQkJbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJa2ZyZWUoYnVmZmVyX25vZGUpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5tZW1fd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkgPj0gMCAmJgotCQkJIGFjLT5wb3J0W2Rpcl0udG1wX2hkbCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfbWFwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJa2ZyZWUoYnVmZmVyX25vZGUpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIGZvciBtZW1vcnlfbWFwXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCWF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSk7Ci0JCWtmcmVlKGJ1ZmZlcl9ub2RlKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JYnVmZmVyX25vZGUtPmJ1Zl9waHlzX2FkZHIgPSBidWZfYWRkOwotCWJ1ZmZlcl9ub2RlLT5tbWFwX2hkbCA9IGFjLT5wb3J0W2Rpcl0udG1wX2hkbDsKLQlsaXN0X2FkZF90YWlsKCZidWZmZXJfbm9kZS0+bGlzdCwgJmFjLT5wb3J0W2Rpcl0ubWVtX21hcF9oYW5kbGUpOwotCWFjLT5wb3J0W2Rpcl0udG1wX2hkbCA9IDA7Ci0JcmMgPSAwOwotCi1mYWlsX2NtZDoKLQlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOwotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX21lbW9yeV91bm1hcChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgcGh5c19hZGRyX3QgYnVmX2FkZCwgaW50IGRpcikKLXsKLQlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgbWVtX3VubWFwOwotCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCi0JaW50IHJjID0gMDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodGhpc19tbWFwLmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBTZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQotCXE2YXNtX2FkZF9tbWFwaGRyKGFjLCAmbWVtX3VubWFwLmhkciwKLQkJCXNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMpLAotCQkJZGlyKTsKLQlhdG9taWNfc2V0KCZhYy0+bWVtX3N0YXRlLCAtMSk7Ci0JbWVtX3VubWFwLmhkci5vcGNvZGUgPSBBU01fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzsKLQltZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPSAwOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCi0JCQkJCQlsaXN0KTsKLQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGJ1Zl9hZGQpIHsKLQkJCXByX2RlYnVnKCIlczogRm91bmQgdGhlIGVsZW1lbnRcbiIsIF9fZnVuY19fKTsKLQkJCW1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogbWVtX3VubWFwLW1lbV9tYXBfaGFuZGxlOiAweCV4XG4iLAotCQlfX2Z1bmNfXywgbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKLQotCWlmIChtZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBEbyBub3Qgc2VuZCBudWxsIG1lbSBoYW5kbGUgdG8gRFNQXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gMDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPm1tYXBfYXByLCAodWludDMyX3QgKikgJm1lbV91bm1hcCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtZW1fdW5tYXAgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCQltZW1fdW5tYXAuaGRyLm9wY29kZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPm1lbV93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+PSAwKSwgNSAqIEhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X3VubWFwIG9mIGhhbmRsZSAweCV4XG4iLAotCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlcyBEU1AgcmV0dXJuZWQgZXJyb3IgWyVzXSBtYXAgaGFuZGxlIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpLAotCQkJbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+dW5tYXBfY2Jfc3VjY2VzcykgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBtZW0gdW5tYXAgY2FsbGJhY2sgb2YgaGFuZGxlIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gMDsKLWZhaWxfY21kOgotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCi0JCQkJCQlsaXN0KTsKLQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGJ1Zl9hZGQpIHsKLQkJCWxpc3RfZGVsKCZidWZfbm9kZS0+bGlzdCk7Ci0JCQlrZnJlZShidWZfbm9kZSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIGludCBxNmFzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIsCi0JCQkJdWludDMyX3QgYnVmc3osIHVpbnQzMl90IGJ1ZmNudCwKLQkJCQlib29sIGlzX2NvbnRpZ3VvdXMpCi17Ci0Jc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucyAqbW1hcF9yZWdpb25zID0gTlVMTDsKLQlzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQgICptcmVnaW9ucyA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX2J1ZmZlciAqYWIgPSBOVUxMOwotCXZvaWQJKm1tYXBfcmVnaW9uX2NtZCA9IE5VTEw7Ci0Jdm9pZAkqcGF5bG9hZCA9IE5VTEw7Ci0Jc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmZmVyX25vZGUgPSBOVUxMOwotCWludAlyYyA9IDA7Ci0JaW50ICAgIGkgPSAwOwotCXVpbnQzMl90IGNtZF9zaXplID0gMDsKLQl1aW50MzJfdCBidWZjbnRfdDsKLQl1aW50MzJfdCBidWZzel90OwotCi0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+bW1hcF9hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBtbWFwIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBTZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQotCWJ1ZmNudF90ID0gKGlzX2NvbnRpZ3VvdXMpID8gMSA6IGJ1ZmNudDsKLQlidWZzel90ID0gKGlzX2NvbnRpZ3VvdXMpID8gKGJ1ZnN6ICogYnVmY250KSA6IGJ1ZnN6OwotCi0JaWYgKGlzX2NvbnRpZ3VvdXMpIHsKLQkJLyogVGhlIHNpemUgdG8gbWVtb3J5IG1hcCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgNEsgYnl0ZXMgKi8KLQkJYnVmc3pfdCA9IFBBR0VfQUxJR04oYnVmc3pfdCk7Ci0JfQotCi0JaWYgKGJ1ZmNudF90ID4gKFVJTlRfTUFYCi0JCQktIHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSkKLQkJCS8gc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkpIHsKLQkJcHJfZXJyKCIlczogVW5zaWduZWQgSW50ZWdlciBPdmVyZmxvdy4gYnVmY250X3QgPSAldVxuIiwKLQkJCQlfX2Z1bmNfXywgYnVmY250X3QpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQotCQkJKyAoc2l6ZW9mKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCkKLQkJCQkJCQkqIGJ1ZmNudF90KTsKLQotCi0JaWYgKGJ1ZmNudCA+IChVSU5UX01BWCAvIHNpemVvZihzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlKSkpIHsKLQkJcHJfZXJyKCIlczogVW5zaWduZWQgSW50ZWdlciBPdmVyZmxvdy4gYnVmY250ID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIGJ1ZmNudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJ1ZmZlcl9ub2RlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzbV9idWZmZXJfbm9kZSkgKiBidWZjbnQsCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXJfbm9kZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAobW1hcF9yZWdpb25fY21kID09IE5VTEwpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlrZnJlZShidWZmZXJfbm9kZSk7Ci0JCXJldHVybiByYzsKLQl9Ci0JbW1hcF9yZWdpb25zID0gKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKikKLQkJCQkJCQltbWFwX3JlZ2lvbl9jbWQ7Ci0JcTZhc21fYWRkX21tYXBoZHIoYWMsICZtbWFwX3JlZ2lvbnMtPmhkciwgY21kX3NpemUsIGRpcik7Ci0JYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOwotCXByX2RlYnVnKCIlczogbW1hcF9yZWdpb249MHglcEsgdG9rZW49MHgleFxuIiwgX19mdW5jX18sCi0JCW1tYXBfcmVnaW9ucywgKChhYy0+c2Vzc2lvbiA8PCA4KSB8IGRpcikpOwotCi0JbW1hcF9yZWdpb25zLT5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOwotCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0JbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudF90OyAvKmJ1ZmNudCAmIDB4MDBmZjsgKi8KLQltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOwotCXByX2RlYnVnKCIlczogbWFwX3JlZ2lvbnMtPm5yZWdpb25zID0gJWRcbiIsIF9fZnVuY19fLAotCQltbWFwX3JlZ2lvbnMtPm51bV9yZWdpb25zKTsKLQlwYXlsb2FkID0gKCh1OCAqKSBtbWFwX3JlZ2lvbl9jbWQgKwotCQlzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOwotCW1yZWdpb25zID0gKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqKXBheWxvYWQ7Ci0KLQlhYy0+cG9ydFtkaXJdLnRtcF9oZGwgPSAwOwotCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmY250X3Q7IGkrKykgewotCQlhYiA9ICZwb3J0LT5idWZbaV07Ci0JCW1yZWdpb25zLT5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGFiLT5waHlzKTsKLQkJbXJlZ2lvbnMtPnNobV9hZGRyX21zdyA9Ci0JCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYWItPnBoeXMpOwotCQltcmVnaW9ucy0+bWVtX3NpemVfYnl0ZXMgPSBidWZzel90OwotCQkrK21yZWdpb25zOwotCX0KLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopIG1tYXBfcmVnaW9uX2NtZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCQltbWFwX3JlZ2lvbnMtPmhkci5vcGNvZGUsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlrZnJlZShidWZmZXJfbm9kZSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPm1lbV93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+PSAwKQotCQkJICwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeV9tYXBcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlrZnJlZShidWZmZXJfbm9kZSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXMgRFNQIHJldHVybmVkIGVycm9yIGZvciBtZW1vcnlfbWFwIFslc11cbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKTsKLQkJa2ZyZWUoYnVmZmVyX25vZGUpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQltdXRleF9sb2NrKCZhYy0+Y21kX2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IGJ1ZmNudDsgaSsrKSB7Ci0JCWFiID0gJnBvcnQtPmJ1ZltpXTsKLQkJYnVmZmVyX25vZGVbaV0uYnVmX3BoeXNfYWRkciA9IGFiLT5waHlzOwotCQlidWZmZXJfbm9kZVtpXS5tbWFwX2hkbCA9IGFjLT5wb3J0W2Rpcl0udG1wX2hkbDsKLQkJbGlzdF9hZGRfdGFpbCgmYnVmZmVyX25vZGVbaV0ubGlzdCwKLQkJCSZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKTsKLQkJcHJfZGVidWcoIiVzOiBpPSVkLCBidWZhZGRbaV0gPSAweCVwSywgbWFwaGRsW2ldID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBpLCAmYnVmZmVyX25vZGVbaV0uYnVmX3BoeXNfYWRkciwKLQkJCWJ1ZmZlcl9ub2RlW2ldLm1tYXBfaGRsKTsKLQl9Ci0JYWMtPnBvcnRbZGlyXS50bXBfaGRsID0gMDsKLQltdXRleF91bmxvY2soJmFjLT5jbWRfbG9jayk7Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0Ja2ZyZWUobW1hcF9yZWdpb25fY21kKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBkaXIpCi17Ci0Jc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zIG1lbV91bm1hcDsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICpwb3J0ID0gTlVMTDsKLQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbmV4dDsKLQlwaHlzX2FkZHJfdCBidWZfYWRkOwotCWludAlyYyA9IDA7Ci0JaW50CWNtZF9zaXplID0gMDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPm1tYXBfYXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogbW1hcCBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogU2Vzc2lvblslZF1cbiIsIF9fZnVuY19fLCBhYy0+c2Vzc2lvbik7Ci0KLQljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMpOwotCXE2YXNtX2FkZF9tbWFwaGRyKGFjLCAmbWVtX3VubWFwLmhkciwgY21kX3NpemUsIGRpcik7Ci0JYXRvbWljX3NldCgmYWMtPm1lbV9zdGF0ZSwgLTEpOwotCXBvcnQgPSAmYWMtPnBvcnRbZGlyXTsKLQlidWZfYWRkID0gcG9ydC0+YnVmLT5waHlzOwotCW1lbV91bm1hcC5oZHIub3Bjb2RlID0gQVNNX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM7Ci0JbWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlID0gMDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LCAmYWMtPnBvcnRbZGlyXS5tZW1fbWFwX2hhbmRsZSkgewotCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAotCQkJCQkJbGlzdCk7Ci0JCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBidWZfYWRkKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IEZvdW5kIHRoZSBlbGVtZW50XG4iLCBfX2Z1bmNfXyk7Ci0JCQltZW1fdW5tYXAubWVtX21hcF9oYW5kbGUgPSBidWZfbm9kZS0+bW1hcF9oZGw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXByX2RlYnVnKCIlczogbWVtX3VubWFwLW1lbV9tYXBfaGFuZGxlOiAweCV4XG4iLAotCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7Ci0KLQlpZiAobWVtX3VubWFwLm1lbV9tYXBfaGFuZGxlID09IDApIHsKLQkJcHJfZXJyKCIlczogRG8gbm90IHNlbmQgbnVsbCBtZW0gaGFuZGxlIHRvIERTUFxuIiwgX19mdW5jX18pOwotCQlyYyA9IDA7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5tbWFwX2FwciwgKHVpbnQzMl90ICopICZtZW1fdW5tYXApOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJtbWFwX3JlZ2lvbnMgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJbWVtX3VubWFwLmhkci5vcGNvZGUsIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+bWVtX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgbWVtb3J5X3VubWFwIG9mIGhhbmRsZSAweCV4XG4iLAotCQkJX19mdW5jX18sIG1lbV91bm1hcC5tZW1fbWFwX2hhbmRsZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZhYy0+bWVtX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5tZW1fc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPm1lbV9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJmFjLT51bm1hcF9jYl9zdWNjZXNzKSA9PSAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGluIG1lbSB1bm1hcCBjYWxsYmFjayBvZiBoYW5kbGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBtZW1fdW5tYXAubWVtX21hcF9oYW5kbGUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLQotZmFpbF9jbWQ6Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmFjLT5wb3J0W2Rpcl0ubWVtX21hcF9oYW5kbGUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKLQkJCQkJCWxpc3QpOwotCQlpZiAoYnVmX25vZGUtPmJ1Zl9waHlzX2FkZHIgPT0gYnVmX2FkZCkgewotCQkJbGlzdF9kZWwoJmJ1Zl9ub2RlLT5saXN0KTsKLQkJCWtmcmVlKGJ1Zl9ub2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NldF9scmdhaW4oc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBsZWZ0X2dhaW4sIGludCByaWdodF9nYWluKQotewotCXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbXVsdGljaGFubmVsX2dhaW4gbXVsdGlfY2hfZ2FpbjsKLQlpbnQgc3ogPSAwOwotCWludCByYyAgPSAwOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCW1lbXNldCgmbXVsdGlfY2hfZ2FpbiwgMCwgc2l6ZW9mKG11bHRpX2NoX2dhaW4pKTsKLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX211bHRpY2hhbm5lbF9nYWluKTsKLQlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmbXVsdGlfY2hfZ2Fpbi5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCAtMSk7Ci0JbXVsdGlfY2hfZ2Fpbi5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKLQltdWx0aV9jaF9nYWluLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JbXVsdGlfY2hfZ2Fpbi5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOwotCW11bHRpX2NoX2dhaW4ucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCW11bHRpX2NoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2YobXVsdGlfY2hfZ2FpbikgLQotCQlzaXplb2YobXVsdGlfY2hfZ2Fpbi5oZHIpIC0gc2l6ZW9mKG11bHRpX2NoX2dhaW4ucGFyYW0pOwotCW11bHRpX2NoX2dhaW4uZGF0YS5tb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOwotCW11bHRpX2NoX2dhaW4uZGF0YS5wYXJhbV9pZCA9IEFTTV9QQVJBTV9JRF9NVUxUSUNIQU5ORUxfR0FJTjsKLQltdWx0aV9jaF9nYWluLmRhdGEucGFyYW1fc2l6ZSA9IG11bHRpX2NoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQotCQlzaXplb2YobXVsdGlfY2hfZ2Fpbi5kYXRhKTsKLQltdWx0aV9jaF9nYWluLmRhdGEucmVzZXJ2ZWQgPSAwOwotCW11bHRpX2NoX2dhaW4uZ2Fpbl9kYXRhWzBdLmNoYW5uZWx0eXBlID0gUENNX0NIQU5ORUxfRkw7Ci0JbXVsdGlfY2hfZ2Fpbi5nYWluX2RhdGFbMF0uZ2FpbiA9IGxlZnRfZ2FpbiA8PCAxNTsKLQltdWx0aV9jaF9nYWluLmdhaW5fZGF0YVsxXS5jaGFubmVsdHlwZSA9IFBDTV9DSEFOTkVMX0ZSOwotCW11bHRpX2NoX2dhaW4uZ2Fpbl9kYXRhWzFdLmdhaW4gPSByaWdodF9nYWluIDw8IDE1OwotCW11bHRpX2NoX2dhaW4ubnVtX2NoYW5uZWxzID0gMjsKLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm11bHRpX2NoX2dhaW4pOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogc2V0LXBhcmFtcyBzZW5kIGZhaWxlZCBwYXJhbWlkWzB4JXhdIHJjICVkXG4iLAotCQkJCV9fZnVuY19fLCBtdWx0aV9jaF9nYWluLmRhdGEucGFyYW1faWQsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCQltdWx0aV9jaF9nYWluLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gLCBzZXQtcGFyYW1zIHBhcmFtaWRbMHgleF1cbiIsCi0JCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKSwKLQkJCQkJbXVsdGlfY2hfZ2Fpbi5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIHE2YXNtX3NldF9tdWx0aWNoX2dhaW46IHNldCBtdWx0aXBsZSBjaGFubmVsIGdhaW5zIG9uIGFuIEFTTSBzZXNzaW9uCi0gKiBAYWM6IGF1ZGlvIGNsaWVudCBoYW5kbGUKLSAqIEBjaGFubmVsczogbnVtYmVyIG9mIGNoYW5uZWxzIGNhbGxlciBpbnRlbmRzIHRvIHNldCBnYWlucwotICogQGdhaW5zOiBsaXN0IG9mIGdhaW5zIG9mIGF1ZGlvIGNoYW5uZWxzCi0gKiBAY2hfbWFwOiBsaXN0IG9mIGNoYW5uZWwgbWFwcGluZy4gT25seSB2YWxpZCBpZiB1c2VfZGVmYXVsdCBpcyBmYWxzZQotICogQHVzZV9kZWZhdWx0OiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgbWFwcGluZwotICovCi1pbnQgcTZhc21fc2V0X211bHRpY2hfZ2FpbihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgY2hhbm5lbHMsCi0JCQkgICB1aW50MzJfdCAqZ2FpbnMsIHVpbnQ4X3QgKmNoX21hcCwgYm9vbCB1c2VfZGVmYXVsdCkKLXsKLQlzdHJ1Y3QgYXNtX3ZvbHVtZV9jdHJsX211bHRpY2hhbm5lbF9nYWluIG11bHRpY2hfZ2FpbjsKLQlpbnQgc3ogPSAwOwotCWludCByYyAgPSAwOwotCWludCBpOwotCXU4IGRlZmF1bHRfY2htYXBbVk9MVU1FX0NPTlRST0xfTUFYX0NIQU5ORUxTXTsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGFjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGdhaW5zID09IE5VTEwpIHsKLQkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IGdhaW5fbGlzdCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoY2hhbm5lbHMgPiBWT0xVTUVfQ09OVFJPTF9NQVhfQ0hBTk5FTFMpIHsKLQkJZGV2X2VycihhYy0+ZGV2LCAiJXM6IEludmFsaWQgY2hhbm5lbCBjb3VudCAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoIXVzZV9kZWZhdWx0ICYmIGNoX21hcCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoYWMtPmRldiwgIiVzOiBOVUxMIGNoYW5uZWwgbWFwXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW1lbXNldCgmbXVsdGljaF9nYWluLCAwLCBzaXplb2YobXVsdGljaF9nYWluKSk7Ci0Jc3ogPSBzaXplb2Yoc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdWx0aWNoYW5uZWxfZ2Fpbik7Ci0JcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJm11bHRpY2hfZ2Fpbi5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCAtMSk7Ci0JbXVsdGljaF9nYWluLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOwotCW11bHRpY2hfZ2Fpbi5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCW11bHRpY2hfZ2Fpbi5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOwotCW11bHRpY2hfZ2Fpbi5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JbXVsdGljaF9nYWluLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKG11bHRpY2hfZ2FpbikgLQotCQlzaXplb2YobXVsdGljaF9nYWluLmhkcikgLSBzaXplb2YobXVsdGljaF9nYWluLnBhcmFtKTsKLQltdWx0aWNoX2dhaW4uZGF0YS5tb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOwotCW11bHRpY2hfZ2Fpbi5kYXRhLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX01VTFRJQ0hBTk5FTF9HQUlOOwotCW11bHRpY2hfZ2Fpbi5kYXRhLnBhcmFtX3NpemUgPSBtdWx0aWNoX2dhaW4ucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQotCQlzaXplb2YobXVsdGljaF9nYWluLmRhdGEpOwotCW11bHRpY2hfZ2Fpbi5kYXRhLnJlc2VydmVkID0gMDsKLQotCWlmICh1c2VfZGVmYXVsdCkgewotCQlyYyA9IHE2YXNtX21hcF9jaGFubmVscyhkZWZhdWx0X2NobWFwLCBjaGFubmVscywgZmFsc2UpOwotCQlpZiAocmMgPCAwKQotCQkJZ290byBkb25lOwotCQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgewotCQkJbXVsdGljaF9nYWluLmdhaW5fZGF0YVtpXS5jaGFubmVsdHlwZSA9Ci0JCQkJZGVmYXVsdF9jaG1hcFtpXTsKLQkJCW11bHRpY2hfZ2Fpbi5nYWluX2RhdGFbaV0uZ2FpbiA9IGdhaW5zW2ldIDw8IDE1OwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKLQkJCW11bHRpY2hfZ2Fpbi5nYWluX2RhdGFbaV0uY2hhbm5lbHR5cGUgPSBjaF9tYXBbaV07Ci0JCQltdWx0aWNoX2dhaW4uZ2Fpbl9kYXRhW2ldLmdhaW4gPSBnYWluc1tpXSA8PCAxNTsKLQkJfQotCX0KLQltdWx0aWNoX2dhaW4ubnVtX2NoYW5uZWxzID0gY2hhbm5lbHM7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJm11bHRpY2hfZ2Fpbik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkIHBhcmFtaWRbMHgleF0gcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIG11bHRpY2hfZ2Fpbi5kYXRhLnBhcmFtX2lkLCByYyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCi0JCQkJbXVsdGljaF9nYWluLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVkXSAsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCksCi0JCSAgICAgICBtdWx0aWNoX2dhaW4uZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlyYyA9IDA7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NldF9tdXRlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgbXV0ZWZsYWcpCi17Ci0Jc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZyBtdXRlOwotCWludCBzeiA9IDA7Ci0JaW50IHJjICA9IDA7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGFzbV92b2x1bWVfY3RybF9tdXRlX2NvbmZpZyk7Ci0JcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJm11dGUuaGRyLCBzeiwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZV9wcCwgLTEpOwotCW11dGUuaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjI7Ci0JbXV0ZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCW11dGUucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQltdXRlLnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKLQltdXRlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKG11dGUpIC0KLQkJc2l6ZW9mKG11dGUuaGRyKSAtIHNpemVvZihtdXRlLnBhcmFtKTsKLQltdXRlLmRhdGEubW9kdWxlX2lkID0gQVNNX01PRFVMRV9JRF9WT0xfQ1RSTDsKLQltdXRlLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfVk9MX0NUUkxfTVVURV9DT05GSUc7Ci0JbXV0ZS5kYXRhLnBhcmFtX3NpemUgPSBtdXRlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplIC0gc2l6ZW9mKG11dGUuZGF0YSk7Ci0JbXV0ZS5kYXRhLnJlc2VydmVkID0gMDsKLQltdXRlLm11dGVfZmxhZyA9IG11dGVmbGFnOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtdXRlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgbXV0ZS5kYXRhLnBhcmFtX2lkLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCi0JCQkJbXV0ZS5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKSwKLQkJCQltdXRlLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fc2V0X3ZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHZvbHVtZSwgaW50IGluc3RhbmNlKQotewotCXN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbWFzdGVyX2dhaW4gdm9sOwotCWludCBzeiA9IDA7Ci0JaW50IHJjICA9IDA7Ci0JaW50IG1vZHVsZV9pZDsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlzd2l0Y2ggKGluc3RhbmNlKSB7Ci0JY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yOgotCQltb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKLQkJYnJlYWs7Ci0JY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xOgotCWRlZmF1bHQ6Ci0JCW1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfVk9MX0NUUkw7Ci0JCWJyZWFrOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fdm9sdW1lX2N0cmxfbWFzdGVyX2dhaW4pOwotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZ2b2wuaGRyLCBzeiwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZV9wcCwgLTEpOwotCXZvbC5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKLQl2b2wucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQl2b2wucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQl2b2wucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCXZvbC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZih2b2wpIC0KLQkJc2l6ZW9mKHZvbC5oZHIpIC0gc2l6ZW9mKHZvbC5wYXJhbSk7Ci0Jdm9sLmRhdGEubW9kdWxlX2lkID0gbW9kdWxlX2lkOwotCXZvbC5kYXRhLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX1ZPTF9DVFJMX01BU1RFUl9HQUlOOwotCXZvbC5kYXRhLnBhcmFtX3NpemUgPSB2b2wucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLSBzaXplb2Yodm9sLmRhdGEpOwotCXZvbC5kYXRhLnJlc2VydmVkID0gMDsKLQl2b2wubWFzdGVyX2dhaW4gPSB2b2x1bWU7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnZvbCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkIHBhcmFtaWRbMHgleF0gcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHZvbC5kYXRhLnBhcmFtX2lkLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCi0JCQkJdm9sLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkpLAotCQkJCXZvbC5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZhc21fc2V0X3ZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHZvbHVtZSkKLXsKLQlyZXR1cm4gX19xNmFzbV9zZXRfdm9sdW1lKGFjLCB2b2x1bWUsIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzEpOwotfQotCi1pbnQgcTZhc21fc2V0X3ZvbHVtZV92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IHZvbHVtZSwgaW50IGluc3RhbmNlKQotewotCXJldHVybiBfX3E2YXNtX3NldF92b2x1bWUoYWMsIHZvbHVtZSwgaW5zdGFuY2UpOwotfQotCi1pbnQgcTZhc21fc2V0X2FwdHhfZGVjX2J0X2FkZHIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJc3RydWN0IGFwdHhfZGVjX2J0X2FkZHJfY2ZnICpjZmcpCi17Ci0Jc3RydWN0IGFwdHhfZGVjX2J0X2Rldl9hZGRyIHBheWxvZDsKLQlpbnQgc3ogPSAwOwotCWludCByYyA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IEJUIGFkZHIgbmFwICVkLCB1YXAgJWQsIGxhcCAlZFxuIiwgX19mdW5jX18sIGNmZy0+bmFwLAotCQkJY2ZnLT51YXAsIGNmZy0+bGFwKTsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhcHR4X2RlY19idF9kZXZfYWRkcik7Ci0JcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnBheWxvZC5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JcGF5bG9kLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNOwotCXBheWxvZC5lbmNkZWMucGFyYW1faWQgPSBBUFRYX0RFQ09ERVJfQlRfQUREUkVTUzsKLQlwYXlsb2QuZW5jZGVjLnBhcmFtX3NpemUgPSBzeiAtIHNpemVvZihwYXlsb2QuaGRyKQotCQkJCQktIHNpemVvZihwYXlsb2QuZW5jZGVjKTsKLQlwYXlsb2QuYnRfYWRkcl9jZmcubGFwID0gY2ZnLT5sYXA7Ci0JcGF5bG9kLmJ0X2FkZHJfY2ZnLnVhcCA9IGNmZy0+dWFwOwotCXBheWxvZC5idF9hZGRyX2NmZy5uYXAgPSBjZmctPm5hcDsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmcGF5bG9kKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9kLmVuY2RlYy5wYXJhbV9pZCwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCBzZXQtcGFyYW1zIHBhcmFtaWRbMHgleF1cbiIsIF9fZnVuY19fLAotCQkJcGF5bG9kLmVuY2RlYy5wYXJhbV9pZCk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXSBzZXQtcGFyYW1zIHBhcmFtaWRbMHgleF1cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSksCi0JCQkJcGF5bG9kLmVuY2RlYy5wYXJhbV9pZCk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogc2V0IEJUIGFkZHIgaXMgc3VjY2Vzc1xuIiwgX19mdW5jX18pOwotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NlbmRfaW9uX2ZkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgZmQpCi17Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwotCWlvbl9waHlzX2FkZHJfdCBwYWRkcjsKLQlzaXplX3QgcGFfbGVuID0gMDsKLQl2b2lkICp2YWRkcjsKLQlpbnQgcmV0OwotCWludCBzeiA9IDA7Ci0Jc3RydWN0IGF2c19ydGljX3NoYXJlZF9tZW1fYWRkciBzaG07Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyZXQgPSBtc21fYXVkaW9faW9uX2ltcG9ydCgiYXVkaW9fbWVtX2NsaWVudCIsCi0JCQkJICAgJmNsaWVudCwKLQkJCQkgICAmaGFuZGxlLAotCQkJCSAgIGZkLAotCQkJCSAgIE5VTEwsCi0JCQkJICAgMCwKLQkJCQkgICAmcGFkZHIsCi0JCQkJICAgJnBhX2xlbiwKLQkJCQkgICAmdmFkZHIpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGltcG9ydCBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JLyogZ2V0IHBheWxvYWQgbGVuZ3RoICovCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGF2c19ydGljX3NoYXJlZF9tZW1fYWRkcik7Ci0JcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnNobS5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0Jc2htLnNobV9idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKHBhZGRyKTsKLQlzaG0uc2htX2J1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKHBhZGRyKTsKLQlzaG0uYnVmX3NpemUgPSBwYV9sZW47Ci0Jc2htLnNobV9idWZfbnVtX3JlZ2lvbnMgPSAxOwotCXNobS5zaG1fYnVmX21lbV9wb29sX2lkID0gQURTUF9NRU1PUllfTUFQX1NITUVNOF80S19QT09MOwotCXNobS5zaG1fYnVmX2ZsYWcgPSAweDAwOwotCXNobS5lbmNkZWMucGFyYW1faWQgPSBBVlNfUEFSQU1fSURfUlRJQ19TSEFSRURfTUVNT1JZX0FERFI7Ci0Jc2htLmVuY2RlYy5wYXJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBhdnNfcnRpY19zaGFyZWRfbWVtX2FkZHIpIC0KLQkJCQkJCXNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX2NtZF9zZXRfZW5jZGVjX3BhcmFtX3YyKTsKLQlzaG0uZW5jZGVjLnNlcnZpY2VfaWQgPSBPVVQ7Ci0Jc2htLmVuY2RlYy5yZXNlcnZlZCA9IDA7Ci0Jc2htLm1hcF9yZWdpb24uc2htX2FkZHJfbHN3ID0gc2htLnNobV9idWZfYWRkcl9sc3c7Ci0Jc2htLm1hcF9yZWdpb24uc2htX2FkZHJfbXN3ID0gc2htLnNobV9idWZfYWRkcl9tc3c7Ci0Jc2htLm1hcF9yZWdpb24ubWVtX3NpemVfYnl0ZXMgPSBwYV9sZW47Ci0Jc2htLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfRU5DREVDX1BBUkFNX1YyOwotCXJldCA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnNobSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogc2V0LXBhcmFtcyBzZW5kIGZhaWxlZCBwYXJhbWlkWzB4JXhdIHJjICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHNobS5lbmNkZWMucGFyYW1faWQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCAxKkhaKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCBzaG0uZW5jZGVjIHBhcmFtaWRbMHgleF1cbiIsIF9fZnVuY19fLAotCQkgICAgICAgc2htLmVuY2RlYy5wYXJhbV9pZCk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2htLmVuY2RlYyBwYXJhbWlkWzB4JXhdXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICBhZHNwX2Vycl9nZXRfZXJyX3N0cihhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpLAotCQkgICAgICAgc2htLmVuY2RlYy5wYXJhbV9pZCk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmV0ID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBxNmFzbV9zZW5kX3J0aWNfZXZlbnRfYWNrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJICAgICAgdm9pZCAqcGFyYW0sIHVpbnQzMl90IHBhcmFtc19sZW5ndGgpCi17Ci0JY2hhciAqYXNtX3BhcmFtcyA9IE5VTEw7Ci0JaW50IHN6LCByYzsKLQlzdHJ1Y3QgYXZzX3BhcmFtX3J0aWNfZXZlbnRfYWNrIGFjazsKLQotCWlmICghcGFyYW0gfHwgIWFjKSB7Ci0JCXByX2VycigiJXM6ICVzIGlzIE5VTExcbiIsIF9fZnVuY19fLAotCQkJKCFwYXJhbSkgPyAicGFyYW0iIDogImFjIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhdnNfcGFyYW1fcnRpY19ldmVudF9hY2spICsgcGFyYW1zX2xlbmd0aDsKLQlhc21fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhc21fcGFyYW1zKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZhY2suaGRyLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgYXZzX3BhcmFtX3J0aWNfZXZlbnRfYWNrKSArCi0JCQkgICAgcGFyYW1zX2xlbmd0aCwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCWFjay5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX0VOQ0RFQ19QQVJBTV9WMjsKLQlhY2suZW5jZGVjLnBhcmFtX2lkID0gQVZTX1BBUkFNX0lEX1JUSUNfRVZFTlRfQUNLOwotCWFjay5lbmNkZWMucGFyYW1fc2l6ZSA9IHBhcmFtc19sZW5ndGg7Ci0JYWNrLmVuY2RlYy5yZXNlcnZlZCA9IDA7Ci0JYWNrLmVuY2RlYy5zZXJ2aWNlX2lkID0gT1VUOwotCW1lbWNweShhc21fcGFyYW1zLCAmYWNrLCBzaXplb2Yoc3RydWN0IGF2c19wYXJhbV9ydGljX2V2ZW50X2FjaykpOwotCW1lbWNweShhc21fcGFyYW1zICsgc2l6ZW9mKHN0cnVjdCBhdnNfcGFyYW1fcnRpY19ldmVudF9hY2spLAotCQlwYXJhbSwgcGFyYW1zX2xlbmd0aCk7Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopIGFzbV9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXByIHBrdCBmYWlsZWQgZm9yIHJ0aWMgZXZlbnQgYWNrXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX3NlbmRfcGFyYW07Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDEgKiBIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0IGZvciBydGljIGV2ZW50IGFjayBjbWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfc2VuZF9wYXJhbTsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIGZvciBydGljIGV2ZW50IGFjayBjbWRcbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBmYWlsX3NlbmRfcGFyYW07Ci0JfQotCXJjID0gMDsKLQotZmFpbF9zZW5kX3BhcmFtOgotCWtmcmVlKGFzbV9wYXJhbXMpOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9zZXRfc29mdHBhdXNlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQkJc3RydWN0IGFzbV9zb2Z0cGF1c2VfcGFyYW1zICpwYXVzZV9wYXJhbSkKLXsKLQlzdHJ1Y3QgYXNtX3NvZnRfcGF1c2VfcGFyYW1zIHNvZnRwYXVzZTsKLQlpbnQgc3ogPSAwOwotCWludCByYyAgPSAwOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fc29mdF9wYXVzZV9wYXJhbXMpOwotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZzb2Z0cGF1c2UuaGRyLCBzeiwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZV9wcCwgLTEpOwotCXNvZnRwYXVzZS5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKLQotCXNvZnRwYXVzZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCXNvZnRwYXVzZS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOwotCXNvZnRwYXVzZS5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0Jc29mdHBhdXNlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKHNvZnRwYXVzZSkgLQotCQlzaXplb2Yoc29mdHBhdXNlLmhkcikgLSBzaXplb2Yoc29mdHBhdXNlLnBhcmFtKTsKLQlzb2Z0cGF1c2UuZGF0YS5tb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMOwotCXNvZnRwYXVzZS5kYXRhLnBhcmFtX2lkID0gQVNNX1BBUkFNX0lEX1NPRlRfUEFVU0VfUEFSQU1FVEVSUzsKLQlzb2Z0cGF1c2UuZGF0YS5wYXJhbV9zaXplID0gc29mdHBhdXNlLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplIC0KLQkJc2l6ZW9mKHNvZnRwYXVzZS5kYXRhKTsKLQlzb2Z0cGF1c2UuZGF0YS5yZXNlcnZlZCA9IDA7Ci0Jc29mdHBhdXNlLmVuYWJsZV9mbGFnID0gcGF1c2VfcGFyYW0tPmVuYWJsZTsKLQlzb2Z0cGF1c2UucGVyaW9kID0gcGF1c2VfcGFyYW0tPnBlcmlvZDsKLQlzb2Z0cGF1c2Uuc3RlcCA9IHBhdXNlX3BhcmFtLT5zdGVwOwotCXNvZnRwYXVzZS5yYW1waW5nX2N1cnZlID0gcGF1c2VfcGFyYW0tPnJhbXBpbmdjdXJ2ZTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmc29mdHBhdXNlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc29mdHBhdXNlLmRhdGEucGFyYW1faWQsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCXNvZnRwYXVzZS5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKSwKLQkJCQlzb2Z0cGF1c2UuZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgX19xNmFzbV9zZXRfc29mdHZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkgIHN0cnVjdCBhc21fc29mdHZvbHVtZV9wYXJhbXMgKnNvZnR2b2xfcGFyYW0sCi0JCQkJICBpbnQgaW5zdGFuY2UpCi17Ci0Jc3RydWN0IGFzbV9zb2Z0X3N0ZXBfdm9sdW1lX3BhcmFtcyBzb2Z0dm9sOwotCWludCBzeiA9IDA7Ci0JaW50IHJjICA9IDA7Ci0JaW50IG1vZHVsZV9pZDsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlzd2l0Y2ggKGluc3RhbmNlKSB7Ci0JY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8yOgotCQltb2R1bGVfaWQgPSBBU01fTU9EVUxFX0lEX1ZPTF9DVFJMMjsKLQkJYnJlYWs7Ci0JY2FzZSBTT0ZUX1ZPTFVNRV9JTlNUQU5DRV8xOgotCWRlZmF1bHQ6Ci0JCW1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfVk9MX0NUUkw7Ci0JCWJyZWFrOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fc29mdF9zdGVwX3ZvbHVtZV9wYXJhbXMpOwotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZzb2Z0dm9sLmhkciwgc3osIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGVfcHAsIC0xKTsKLQlzb2Z0dm9sLmhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOwotCXNvZnR2b2wucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlzb2Z0dm9sLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0Jc29mdHZvbC5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0Jc29mdHZvbC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZihzb2Z0dm9sKSAtCi0JCXNpemVvZihzb2Z0dm9sLmhkcikgLSBzaXplb2Yoc29mdHZvbC5wYXJhbSk7Ci0Jc29mdHZvbC5kYXRhLm1vZHVsZV9pZCA9IG1vZHVsZV9pZDsKLQlzb2Z0dm9sLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfU09GVF9WT0xfU1RFUFBJTkdfUEFSQU1FVEVSUzsKLQlzb2Z0dm9sLmRhdGEucGFyYW1fc2l6ZSA9IHNvZnR2b2wucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLQotCQlzaXplb2Yoc29mdHZvbC5kYXRhKTsKLQlzb2Z0dm9sLmRhdGEucmVzZXJ2ZWQgPSAwOwotCXNvZnR2b2wucGVyaW9kID0gc29mdHZvbF9wYXJhbS0+cGVyaW9kOwotCXNvZnR2b2wuc3RlcCA9IHNvZnR2b2xfcGFyYW0tPnN0ZXA7Ci0Jc29mdHZvbC5yYW1waW5nX2N1cnZlID0gc29mdHZvbF9wYXJhbS0+cmFtcGluZ2N1cnZlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZzb2Z0dm9sKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHNldC1wYXJhbXMgc2VuZCBmYWlsZWQgcGFyYW1pZFsweCV4XSByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgc29mdHZvbC5kYXRhLnBhcmFtX2lkLCByYyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIHNldC1wYXJhbXMgcGFyYW1pZFsweCV4XVxuIiwgX19mdW5jX18sCi0JCQkJCQlzb2Z0dm9sLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkpLAotCQkJCXNvZnR2b2wuZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9zZXRfc29mdHZvbHVtZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCSBzdHJ1Y3QgYXNtX3NvZnR2b2x1bWVfcGFyYW1zICpzb2Z0dm9sX3BhcmFtKQotewotCXJldHVybiBfX3E2YXNtX3NldF9zb2Z0dm9sdW1lKGFjLCBzb2Z0dm9sX3BhcmFtLAotCQkJCSAgICAgIFNPRlRfVk9MVU1FX0lOU1RBTkNFXzEpOwotfQotCi1pbnQgcTZhc21fc2V0X3NvZnR2b2x1bWVfdjIoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkgICAgc3RydWN0IGFzbV9zb2Z0dm9sdW1lX3BhcmFtcyAqc29mdHZvbF9wYXJhbSwKLQkJCSAgICBpbnQgaW5zdGFuY2UpCi17Ci0JcmV0dXJuIF9fcTZhc21fc2V0X3NvZnR2b2x1bWUoYWMsIHNvZnR2b2xfcGFyYW0sIGluc3RhbmNlKTsKLX0KLQotaW50IHE2YXNtX2VxdWFsaXplcihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdm9pZCAqZXFfcCkKLXsKLQlzdHJ1Y3QgYXNtX2VxX3BhcmFtcyBlcTsKLQlzdHJ1Y3QgbXNtX2F1ZGlvX2VxX3N0cmVhbV9jb25maWcgKmVxX3BhcmFtcyA9IE5VTEw7Ci0JaW50IGkgID0gMDsKLQlpbnQgc3ogPSAwOwotCWludCByYyAgPSAwOwotCi0JaWYgKGFjID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChlcV9wID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogWyVkXTogSW52YWxpZCBFcSBwYXJhbVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX2VxX3BhcmFtcyk7Ci0JZXFfcGFyYW1zID0gKHN0cnVjdCBtc21fYXVkaW9fZXFfc3RyZWFtX2NvbmZpZyAqKSBlcV9wOwotCXE2YXNtX2FkZF9oZHIoYWMsICZlcS5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlX3BwLCAtMSk7Ci0KLQllcS5oZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKLQllcS5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCWVxLnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JZXEucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCWVxLnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKGVxKSAtCi0JCXNpemVvZihlcS5oZHIpIC0gc2l6ZW9mKGVxLnBhcmFtKTsKLQllcS5kYXRhLm1vZHVsZV9pZCA9IEFTTV9NT0RVTEVfSURfRVFVQUxJWkVSOwotCWVxLmRhdGEucGFyYW1faWQgPSBBU01fUEFSQU1fSURfRVFVQUxJWkVSX1BBUkFNRVRFUlM7Ci0JZXEuZGF0YS5wYXJhbV9zaXplID0gZXEucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgLSBzaXplb2YoZXEuZGF0YSk7Ci0JZXEuZW5hYmxlX2ZsYWcgPSBlcV9wYXJhbXMtPmVuYWJsZTsKLQllcS5udW1fYmFuZHMgPSBlcV9wYXJhbXMtPm51bV9iYW5kczsKLQotCXByX2RlYnVnKCIlczogZW5hYmxlOiVkIG51bWJhbmRzOiVkXG4iLCBfX2Z1bmNfXywgZXFfcGFyYW1zLT5lbmFibGUsCi0JCQllcV9wYXJhbXMtPm51bV9iYW5kcyk7Ci0JZm9yIChpID0gMDsgaSA8IGVxX3BhcmFtcy0+bnVtX2JhbmRzOyBpKyspIHsKLQkJZXEuZXFfYmFuZHNbaV0uYmFuZF9pZHggPQotCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5iYW5kX2lkeDsKLQkJZXEuZXFfYmFuZHNbaV0uZmlsdGVyeXBlID0KLQkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uZmlsdGVyX3R5cGU7Ci0JCWVxLmVxX2JhbmRzW2ldLmNlbnRlcl9mcmVxX2h6ID0KLQkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uY2VudGVyX2ZyZXFfaHo7Ci0JCWVxLmVxX2JhbmRzW2ldLmZpbHRlcl9nYWluID0KLQkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0uZmlsdGVyX2dhaW47Ci0JCWVxLmVxX2JhbmRzW2ldLnFfZmFjdG9yID0KLQkJCWVxX3BhcmFtcy0+ZXFfYmFuZHNbaV0ucV9mYWN0b3I7Ci0JCXByX2RlYnVnKCIlczogZmlsdGVyX3R5cGU6JXUgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCi0JCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5maWx0ZXJfdHlwZSwgaSk7Ci0JCXByX2RlYnVnKCIlczogY2VudGVyX2ZyZXFfaHo6JXUgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCi0JCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5jZW50ZXJfZnJlcV9oeiwgaSk7Ci0JCXByX2RlYnVnKCIlczogZmlsdGVyX2dhaW46JWQgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCi0JCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5maWx0ZXJfZ2FpbiwgaSk7Ci0JCXByX2RlYnVnKCIlczogcV9mYWN0b3I6JWQgYmFuZG51bTolZFxuIiwgX19mdW5jX18sCi0JCQkJZXFfcGFyYW1zLT5lcV9iYW5kc1tpXS5xX2ZhY3RvciwgaSk7Ci0JfQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSZlcSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkIHBhcmFtaWRbMHgleF0gcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIGVxLmRhdGEucGFyYW1faWQsIHJjKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCwgc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCQkJCWVxLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gc2V0LXBhcmFtcyBwYXJhbWlkWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkpLAotCQkJCWVxLmRhdGEucGFyYW1faWQpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgYm9vbCBpc19jdXN0b21fbGVuX3JlcWQsCi0JCQlpbnQgbGVuKQotewotCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVhZF92MiByZWFkOwotCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKLQlpbnQgZHNwX2J1ZjsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKLQlpbnQgcmM7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W09VVF07Ci0KLQkJcTZhc21fYWRkX2hkcihhYywgJnJlYWQuaGRyLCBzaXplb2YocmVhZCksIEZBTFNFKTsKLQotCQltdXRleF9sb2NrKCZwb3J0LT5sb2NrKTsKLQotCQlkc3BfYnVmID0gcG9ydC0+ZHNwX2J1ZjsKLQkJaWYgKHBvcnQtPmJ1ZiA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBidWYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWFiID0gJnBvcnQtPmJ1Zltkc3BfYnVmXTsKLQotCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdZHNwLWJ1ZlslZF1bJXBLXWNwdV9idWZbJWRdWyVwS11cbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJYWMtPnNlc3Npb24sCi0JCQkJZHNwX2J1ZiwKLQkJCQlwb3J0LT5idWZbZHNwX2J1Zl0uZGF0YSwKLQkJCQlwb3J0LT5jcHVfYnVmLAotCQkJCSZwb3J0LT5idWZbcG9ydC0+Y3B1X2J1Zl0ucGh5cyk7Ci0KLQkJcmVhZC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX1JFQURfVjI7Ci0JCXJlYWQuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhhYi0+cGh5cyk7Ci0JCXJlYWQuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoYWItPnBoeXMpOwotCi0JCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtPVVRdLm1lbV9tYXBfaGFuZGxlKSB7Ci0JCQlidWZfbm9kZSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAotCQkJCQlsaXN0KTsKLQkJCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBhYi0+cGh5cykKLQkJCQlyZWFkLm1lbV9tYXBfaGFuZGxlID0gYnVmX25vZGUtPm1tYXBfaGRsOwotCQl9Ci0JCWRldl92ZGJnKGFjLT5kZXYsICJtZW1vcnlfbWFwIGhhbmRsZSBpbiBxNmFzbV9yZWFkOiBbJTB4XToiLAotCQkJCXJlYWQubWVtX21hcF9oYW5kbGUpOwotCQlyZWFkLmJ1Zl9zaXplID0gaXNfY3VzdG9tX2xlbl9yZXFkID8gbGVuIDogYWItPnNpemU7Ci0JCXJlYWQuc2VxX2lkID0gcG9ydC0+ZHNwX2J1ZjsKLQkJcTZhc21fdXBkYXRlX3Rva2VuKCZyZWFkLmhkci50b2tlbiwKLQkJCQkgICAwLCAvKiBTZXNzaW9uIElEIGlzIE5BICovCi0JCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCi0JCQkJICAgcG9ydC0+ZHNwX2J1ZiwKLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIFdBSVRfQ01EKTsKLQkJcG9ydC0+ZHNwX2J1ZiA9IHE2YXNtX2dldF9uZXh0X2J1ZihhYywgcG9ydC0+ZHNwX2J1ZiwKLQkJCQkJCSAgIHBvcnQtPm1heF9idWZfY250KTsKLQkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5sb2NrKTsKLQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBidWYgYWRkWyVwS10gdG9rZW5bMHgleF0gdWlkWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgJmFiLT5waHlzLCByZWFkLmhkci50b2tlbiwKLQkJCQlyZWFkLnNlcV9pZCk7Ci0JCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmcmVhZCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IHJlYWQgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJCV9fZnVuY19fLCByZWFkLmhkci5vcGNvZGUsIHJjKTsKLQkJCWdvdG8gZmFpbF9jbWQ7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotZmFpbF9jbWQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBxNmFzbV9yZWFkKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXJldHVybiBfX3E2YXNtX3JlYWQoYWMsIGZhbHNlLyppc19jdXN0b21fbGVuX3JlcWQqLywgMCk7Ci19Ci1pbnQgcTZhc21fcmVhZF92MihzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbGVuKQotewotCXJldHVybiBfX3E2YXNtX3JlYWQoYWMsIHRydWUgLyppc19jdXN0b21fbGVuX3JlcWQqLywgbGVuKTsKLX0KLQotaW50IHE2YXNtX3JlYWRfbm9sb2NrKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBhc21fZGF0YV9jbWRfcmVhZF92MiByZWFkOwotCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKLQlpbnQgZHNwX2J1ZjsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKLQlpbnQgcmM7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W09VVF07Ci0KLQkJcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnJlYWQuaGRyLCBzaXplb2YocmVhZCksIEZBTFNFKTsKLQotCi0JCWRzcF9idWYgPSBwb3J0LT5kc3BfYnVmOwotCQlhYiA9ICZwb3J0LT5idWZbZHNwX2J1Zl07Ci0KLQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBzZXNzaW9uWyVkXWRzcC1idWZbJWRdWyVwS11jcHVfYnVmWyVkXVslcEtdXG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWFjLT5zZXNzaW9uLAotCQkJCWRzcF9idWYsCi0JCQkJcG9ydC0+YnVmW2RzcF9idWZdLmRhdGEsCi0JCQkJcG9ydC0+Y3B1X2J1ZiwKLQkJCQkmcG9ydC0+YnVmW3BvcnQtPmNwdV9idWZdLnBoeXMpOwotCi0JCXJlYWQuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9SRUFEX1YyOwotCQlyZWFkLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYWItPnBoeXMpOwotCQlyZWFkLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGFiLT5waHlzKTsKLQkJcmVhZC5idWZfc2l6ZSA9IGFiLT5zaXplOwotCQlyZWFkLnNlcV9pZCA9IHBvcnQtPmRzcF9idWY7Ci0JCXE2YXNtX3VwZGF0ZV90b2tlbigmcmVhZC5oZHIudG9rZW4sCi0JCQkJICAgMCwgLyogU2Vzc2lvbiBJRCBpcyBOQSAqLwotCQkJCSAgIDAsIC8qIFN0cmVhbSBJRCBpcyBOQSAqLwotCQkJCSAgIHBvcnQtPmRzcF9idWYsCi0JCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KLQkJCQkgICBXQUlUX0NNRCk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbmV4dCwgJmFjLT5wb3J0W09VVF0ubWVtX21hcF9oYW5kbGUpIHsKLQkJCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCi0JCQkJCWxpc3QpOwotCQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGFiLT5waHlzKSB7Ci0JCQkJcmVhZC5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXBvcnQtPmRzcF9idWYgPSBxNmFzbV9nZXRfbmV4dF9idWYoYWMsIHBvcnQtPmRzcF9idWYsCi0JCQkJCQkgICBwb3J0LT5tYXhfYnVmX2NudCk7Ci0JCWRldl92ZGJnKGFjLT5kZXYsICIlczogYnVmIGFkZFslcEtdIHRva2VuWzB4JXhdIHVpZFslZF1cbiIsCi0JCQkJX19mdW5jX18sICZhYi0+cGh5cywgcmVhZC5oZHIudG9rZW4sCi0JCQkJcmVhZC5zZXFfaWQpOwotCQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnJlYWQpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiByZWFkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCQlfX2Z1bmNfXywgcmVhZC5oZHIub3Bjb2RlLCByYyk7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fYXN5bmNfd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCQkJCSAgc3RydWN0IGF1ZGlvX2Fpb193cml0ZV9wYXJhbSAqcGFyYW0pCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX3dyaXRlX3YyIHdyaXRlOwotCXN0cnVjdCBhc21fYnVmZmVyX25vZGUgKmJ1Zl9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuZXh0OwotCXN0cnVjdCBhdWRpb19idWZmZXIgICAgICAgICphYjsKLQlzdHJ1Y3QgYXVkaW9fcG9ydF9kYXRhICAgICAqcG9ydDsKLQlwaHlzX2FkZHJfdCBsYnVmX3BoeXNfYWRkcjsKLQl1MzIgbGlvbW9kZTsKLQl1MzIgaW9fY29tcHJlc3NlZDsKLQl1MzIgaW9fY29tcHJlc3NlZF9zdHJlYW07Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXE2YXNtX3N0cmVhbV9hZGRfaGRyX2FzeW5jKAotCQkJYWMsICZ3cml0ZS5oZHIsIHNpemVvZih3cml0ZSksIFRSVUUsIGFjLT5zdHJlYW1faWQpOwotCXBvcnQgPSAmYWMtPnBvcnRbSU5dOwotCWFiID0gJnBvcnQtPmJ1Zltwb3J0LT5kc3BfYnVmXTsKLQotCS8qIFBhc3Mgc2Vzc2lvbiBpZCBhcyB0b2tlbiBmb3IgQUlPIHNjaGVtZSAqLwotCXdyaXRlLmhkci50b2tlbiA9IHBhcmFtLT51aWQ7Ci0Jd3JpdGUuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9XUklURV9WMjsKLQl3cml0ZS5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKHBhcmFtLT5wYWRkcik7Ci0Jd3JpdGUuYnVmX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMocGFyYW0tPnBhZGRyKTsKLQl3cml0ZS5idWZfc2l6ZSA9IHBhcmFtLT5sZW47Ci0Jd3JpdGUudGltZXN0YW1wX21zdyA9IHBhcmFtLT5tc3dfdHM7Ci0Jd3JpdGUudGltZXN0YW1wX2xzdyA9IHBhcmFtLT5sc3dfdHM7Ci0JbGlvbW9kZSA9IChBU1lOQ19JT19NT0RFIHwgTlRfTU9ERSk7Ci0JaW9fY29tcHJlc3NlZCA9IChBU1lOQ19JT19NT0RFIHwgQ09NUFJFU1NFRF9JTyk7Ci0JaW9fY29tcHJlc3NlZF9zdHJlYW0gPSAoQVNZTkNfSU9fTU9ERSB8IENPTVBSRVNTRURfU1RSRUFNX0lPKTsKLQotCWlmIChhYy0+aW9fbW9kZSA9PSBsaW9tb2RlKQotCQlsYnVmX3BoeXNfYWRkciA9IChwYXJhbS0+cGFkZHIgLSAzMik7Ci0JZWxzZSBpZiAoYWMtPmlvX21vZGUgPT0gaW9fY29tcHJlc3NlZCB8fAotCQkJYWMtPmlvX21vZGUgPT0gaW9fY29tcHJlc3NlZF9zdHJlYW0pCi0JCWxidWZfcGh5c19hZGRyID0gKHBhcmFtLT5wYWRkciAtIHBhcmFtLT5tZXRhZGF0YV9sZW4pOwotCWVsc2UgewotCQlpZiAocGFyYW0tPmZsYWdzICYgU0VUX1RJTUVTVEFNUCkKLQkJCWxidWZfcGh5c19hZGRyID0gcGFyYW0tPnBhZGRyIC0KLQkJCQlzaXplb2Yoc3RydWN0IHNuZF9jb2RlY19tZXRhZGF0YSk7Ci0JCWVsc2UKLQkJCWxidWZfcGh5c19hZGRyID0gcGFyYW0tPnBhZGRyOwotCX0KLQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHRva2VuWzB4JXhdLCBidWZfYWRkclslcEtdLCBidWZfc2l6ZVsweCV4XSwgdHNfbXN3WzB4JXhdLCB0c19sc3dbMHgleF0sIGxidWZfcGh5c19hZGRyOiAweFslcEtdXG4iLAotCQkJX19mdW5jX18sCi0JCQl3cml0ZS5oZHIudG9rZW4sICZwYXJhbS0+cGFkZHIsCi0JCQl3cml0ZS5idWZfc2l6ZSwgd3JpdGUudGltZXN0YW1wX21zdywKLQkJCXdyaXRlLnRpbWVzdGFtcF9sc3csICZsYnVmX3BoeXNfYWRkcik7Ci0KLQkvKiBVc2UgMHhGRjAwIGZvciBkaXNhYmxpbmcgdGltZXN0YW1wcyAqLwotCWlmIChwYXJhbS0+ZmxhZ3MgPT0gMHhGRjAwKQotCQl3cml0ZS5mbGFncyA9ICgweDAwMDAwMDAwIHwgKHBhcmFtLT5mbGFncyAmIDB4ODAwMDAwRkYpKTsKLQllbHNlCi0JCXdyaXRlLmZsYWdzID0gKDB4ODAwMDAwMDAgfCBwYXJhbS0+ZmxhZ3MpOwotCXdyaXRlLmZsYWdzIHw9IHBhcmFtLT5sYXN0X2J1ZmZlciA8PCBBU01fU0hJRlRfTEFTVF9CVUZGRVJfRkxBRzsKLQl3cml0ZS5zZXFfaWQgPSBwYXJhbS0+dWlkOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtJTl0ubWVtX21hcF9oYW5kbGUpIHsKLQkJYnVmX25vZGUgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IGFzbV9idWZmZXJfbm9kZSwKLQkJCQlsaXN0KTsKLQkJaWYgKGJ1Zl9ub2RlLT5idWZfcGh5c19hZGRyID09IGxidWZfcGh5c19hZGRyKSB7Ci0JCQl3cml0ZS5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZ3cml0ZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiB3cml0ZSBvcFsweCV4XXJjWyVkXVxuIiwgX19mdW5jX18sCi0JCQkJd3JpdGUuaGRyLm9wY29kZSwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fYXN5bmNfcmVhZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJCQkJICBzdHJ1Y3QgYXVkaW9fYWlvX3JlYWRfcGFyYW0gKnBhcmFtKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF9yZWFkX3YyIHJlYWQ7Ci0Jc3RydWN0IGFzbV9idWZmZXJfbm9kZSAqYnVmX25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7Ci0JcGh5c19hZGRyX3QgbGJ1Zl9waHlzX2FkZHI7Ci0JdTMyIGxpb21vZGU7Ci0JdTMyIGlvX2NvbXByZXNzZWQ7Ci0JaW50IGRpciA9IDA7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZyZWFkLmhkciwgc2l6ZW9mKHJlYWQpLCBGQUxTRSk7Ci0KLQkvKiBQYXNzIHNlc3Npb24gaWQgYXMgdG9rZW4gZm9yIEFJTyBzY2hlbWUgKi8KLQlyZWFkLmhkci50b2tlbiA9IHBhcmFtLT51aWQ7Ci0JcmVhZC5oZHIub3Bjb2RlID0gQVNNX0RBVEFfQ01EX1JFQURfVjI7Ci0JcmVhZC5idWZfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKHBhcmFtLT5wYWRkcik7Ci0JcmVhZC5idWZfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhwYXJhbS0+cGFkZHIpOwotCXJlYWQuYnVmX3NpemUgPSBwYXJhbS0+bGVuOwotCXJlYWQuc2VxX2lkID0gcGFyYW0tPnVpZDsKLQlsaW9tb2RlID0gKE5UX01PREUgfCBBU1lOQ19JT19NT0RFKTsKLQlpb19jb21wcmVzc2VkID0gKEFTWU5DX0lPX01PREUgfCBDT01QUkVTU0VEX0lPKTsKLQlpZiAoYWMtPmlvX21vZGUgPT0gbGlvbW9kZSkgewotCQlsYnVmX3BoeXNfYWRkciA9IChwYXJhbS0+cGFkZHIgLSAzMik7Ci0JCS8qbGVnYWN5IHdtYSBkcml2ZXIgY2FzZSovCi0JCWRpciA9IElOOwotCX0gZWxzZSBpZiAoYWMtPmlvX21vZGUgPT0gaW9fY29tcHJlc3NlZCkgewotCQlsYnVmX3BoeXNfYWRkciA9IChwYXJhbS0+cGFkZHIgLSA2NCk7Ci0JCWRpciA9IE9VVDsKLQl9IGVsc2UgewotCQlpZiAocGFyYW0tPmZsYWdzICYgQ09NUFJFU1NFRF9USU1FU1RBTVBfRkxBRykKLQkJCWxidWZfcGh5c19hZGRyID0gcGFyYW0tPnBhZGRyIC0KLQkJCQkgc2l6ZW9mKHN0cnVjdCBzbmRfY29kZWNfbWV0YWRhdGEpOwotCQllbHNlCi0JCQlsYnVmX3BoeXNfYWRkciA9IHBhcmFtLT5wYWRkcjsKLQkJZGlyID0gT1VUOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG5leHQsICZhYy0+cG9ydFtkaXJdLm1lbV9tYXBfaGFuZGxlKSB7Ci0JCWJ1Zl9ub2RlID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBhc21fYnVmZmVyX25vZGUsCi0JCQkJbGlzdCk7Ci0JCWlmIChidWZfbm9kZS0+YnVmX3BoeXNfYWRkciA9PSBsYnVmX3BoeXNfYWRkcikgewotCQkJcmVhZC5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZyZWFkKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IHJlYWQgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAotCQkJCXJlYWQuaGRyLm9wY29kZSwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fd3JpdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQzMl90IGxlbiwgdWludDMyX3QgbXN3X3RzLAotCQl1aW50MzJfdCBsc3dfdHMsIHVpbnQzMl90IGZsYWdzKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF93cml0ZV92MiB3cml0ZTsKLQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICAgICphYjsKLQlpbnQgZHNwX2J1ZiA9IDA7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl92ZGJnKGFjLT5kZXYsICIlczogc2Vzc2lvblslZF0gbGVuPSVkXG4iLAotCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBsZW4pOwotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W0lOXTsKLQotCQlxNmFzbV9hZGRfaGRyKGFjLCAmd3JpdGUuaGRyLCBzaXplb2Yod3JpdGUpLAotCQkJCUZBTFNFKTsKLQkJbXV0ZXhfbG9jaygmcG9ydC0+bG9jayk7Ci0KLQkJZHNwX2J1ZiA9IHBvcnQtPmRzcF9idWY7Ci0JCWFiID0gJnBvcnQtPmJ1Zltkc3BfYnVmXTsKLQotCQlxNmFzbV91cGRhdGVfdG9rZW4oJndyaXRlLmhkci50b2tlbiwKLQkJCQkgICAwLCAvKiBTZXNzaW9uIElEIGlzIE5BICovCi0JCQkJICAgMCwgLyogU3RyZWFtIElEIGlzIE5BICovCi0JCQkJICAgcG9ydC0+ZHNwX2J1ZiwKLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIE5PX1dBSVRfQ01EKTsKLQkJd3JpdGUuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9XUklURV9WMjsKLQkJd3JpdGUuYnVmX2FkZHJfbHN3ID0gbG93ZXJfMzJfYml0cyhhYi0+cGh5cyk7Ci0JCXdyaXRlLmJ1Zl9hZGRyX21zdyA9IG1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGFiLT5waHlzKTsKLQkJd3JpdGUuYnVmX3NpemUgPSBsZW47Ci0JCXdyaXRlLnNlcV9pZCA9IHBvcnQtPmRzcF9idWY7Ci0JCXdyaXRlLnRpbWVzdGFtcF9sc3cgPSBsc3dfdHM7Ci0JCXdyaXRlLnRpbWVzdGFtcF9tc3cgPSBtc3dfdHM7Ci0JCS8qIFVzZSAweEZGMDAgZm9yIGRpc2FibGluZyB0aW1lc3RhbXBzICovCi0JCWlmIChmbGFncyA9PSAweEZGMDApCi0JCQl3cml0ZS5mbGFncyA9ICgweDAwMDAwMDAwIHwgKGZsYWdzICYgMHg4MDAwMDBGRikpOwotCQllbHNlCi0JCQl3cml0ZS5mbGFncyA9ICgweDgwMDAwMDAwIHwgZmxhZ3MpOwotCQlwb3J0LT5kc3BfYnVmID0gcTZhc21fZ2V0X25leHRfYnVmKGFjLCBwb3J0LT5kc3BfYnVmLAotCQkJCQkJICAgcG9ydC0+bWF4X2J1Zl9jbnQpOwotCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmFjLT5wb3J0W0lOXS5tZW1fbWFwX2hhbmRsZSwKLQkJCQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAotCQkJCWxpc3QpOwotCQl3cml0ZS5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQotCQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IGFiLT5waHlzWyVwS11idWZhZGRbMHgleF0gdG9rZW5bMHgleF1idWZfaWRbMHgleF1idWZfc2l6ZVsweCV4XW1tYXBoZGxbMHgleF0iCi0JCQkJLCBfX2Z1bmNfXywKLQkJCQkmYWItPnBoeXMsCi0JCQkJd3JpdGUuYnVmX2FkZHJfbHN3LAotCQkJCXdyaXRlLmhkci50b2tlbiwKLQkJCQl3cml0ZS5zZXFfaWQsCi0JCQkJd3JpdGUuYnVmX3NpemUsCi0JCQkJd3JpdGUubWVtX21hcF9oYW5kbGUpOwotCQltdXRleF91bmxvY2soJnBvcnQtPmxvY2spOwotCi0JCWNvbmZpZ19kZWJ1Z19mc193cml0ZShhYik7Ci0KLQkJcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZ3cml0ZSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXByX2VycigiJXM6IHdyaXRlIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCQlfX2Z1bmNfXywgd3JpdGUuaGRyLm9wY29kZSwgcmMpOwotCQkJZ290byBmYWlsX2NtZDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci1mYWlsX2NtZDoKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IHE2YXNtX3dyaXRlX25vbG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDMyX3QgbGVuLCB1aW50MzJfdCBtc3dfdHMsCi0JCQl1aW50MzJfdCBsc3dfdHMsIHVpbnQzMl90IGZsYWdzKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGFzbV9kYXRhX2NtZF93cml0ZV92MiB3cml0ZTsKLQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlICpidWZfbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX3BvcnRfZGF0YSAqcG9ydDsKLQlzdHJ1Y3QgYXVkaW9fYnVmZmVyICAgICphYjsKLQlpbnQgZHNwX2J1ZiA9IDA7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl92ZGJnKGFjLT5kZXYsICIlczogc2Vzc2lvblslZF0gbGVuPSVkXG4iLAotCQkJX19mdW5jX18sIGFjLT5zZXNzaW9uLCBsZW4pOwotCWlmIChhYy0+aW9fbW9kZSAmIFNZTkNfSU9fTU9ERSkgewotCQlwb3J0ID0gJmFjLT5wb3J0W0lOXTsKLQotCQlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmd3JpdGUuaGRyLCBzaXplb2Yod3JpdGUpLAotCQkJCUZBTFNFKTsKLQotCQlkc3BfYnVmID0gcG9ydC0+ZHNwX2J1ZjsKLQkJYWIgPSAmcG9ydC0+YnVmW2RzcF9idWZdOwotCi0JCXE2YXNtX3VwZGF0ZV90b2tlbigmd3JpdGUuaGRyLnRva2VuLAotCQkJCSAgIDAsIC8qIFNlc3Npb24gSUQgaXMgTkEgKi8KLQkJCQkgICAwLCAvKiBTdHJlYW0gSUQgaXMgTkEgKi8KLQkJCQkgICBwb3J0LT5kc3BfYnVmLAotCQkJCSAgIDAsIC8qIERpcmVjdGlvbiBmbGFnIGlzIE5BICovCi0JCQkJICAgTk9fV0FJVF9DTUQpOwotCi0JCXdyaXRlLmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfV1JJVEVfVjI7Ci0JCXdyaXRlLmJ1Zl9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYWItPnBoeXMpOwotCQl3cml0ZS5idWZfYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhhYi0+cGh5cyk7Ci0JCXdyaXRlLmJ1Zl9zaXplID0gbGVuOwotCQl3cml0ZS5zZXFfaWQgPSBwb3J0LT5kc3BfYnVmOwotCQl3cml0ZS50aW1lc3RhbXBfbHN3ID0gbHN3X3RzOwotCQl3cml0ZS50aW1lc3RhbXBfbXN3ID0gbXN3X3RzOwotCQlidWZfbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoJmFjLT5wb3J0W0lOXS5tZW1fbWFwX2hhbmRsZSwKLQkJCQlzdHJ1Y3QgYXNtX2J1ZmZlcl9ub2RlLAotCQkJCWxpc3QpOwotCQl3cml0ZS5tZW1fbWFwX2hhbmRsZSA9IGJ1Zl9ub2RlLT5tbWFwX2hkbDsKLQkJLyogVXNlIDB4RkYwMCBmb3IgZGlzYWJsaW5nIHRpbWVzdGFtcHMgKi8KLQkJaWYgKGZsYWdzID09IDB4RkYwMCkKLQkJCXdyaXRlLmZsYWdzID0gKDB4MDAwMDAwMDAgfCAoZmxhZ3MgJiAweDgwMDAwMEZGKSk7Ci0JCWVsc2UKLQkJCXdyaXRlLmZsYWdzID0gKDB4ODAwMDAwMDAgfCBmbGFncyk7Ci0JCXBvcnQtPmRzcF9idWYgPSBxNmFzbV9nZXRfbmV4dF9idWYoYWMsIHBvcnQtPmRzcF9idWYsCi0JCQkJCQkgICBwb3J0LT5tYXhfYnVmX2NudCk7Ci0KLQkJZGV2X3ZkYmcoYWMtPmRldiwgIiVzOiBhYi0+cGh5c1slcEtdYnVmYWRkWzB4JXhddG9rZW5bMHgleF0gYnVmX2lkWzB4JXhdYnVmX3NpemVbMHgleF1tbWFwaGRsWzB4JXhdIgotCQkJCSwgX19mdW5jX18sCi0JCQkJJmFiLT5waHlzLAotCQkJCXdyaXRlLmJ1Zl9hZGRyX2xzdywKLQkJCQl3cml0ZS5oZHIudG9rZW4sCi0JCQkJd3JpdGUuc2VxX2lkLAotCQkJCXdyaXRlLmJ1Zl9zaXplLAotCQkJCXdyaXRlLm1lbV9tYXBfaGFuZGxlKTsKLQotCQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJndyaXRlKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJcHJfZXJyKCIlczogd3JpdGUgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJCV9fZnVuY19fLCB3cml0ZS5oZHIub3Bjb2RlLCByYyk7Ci0JCQlnb3RvIGZhaWxfY21kOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fZ2V0X3Nlc3Npb25fdGltZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDY0X3QgKnRzdGFtcCkKLXsKLQlzdHJ1Y3QgYXNtX210bXhfc3RydHJfZ2V0X3BhcmFtcyBtdG14X3BhcmFtczsKLQlpbnQgcmM7Ci0KLQlpZiAoYWMgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAodHN0YW1wID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdHN0YW1wIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcTZhc21fYWRkX2hkcihhYywgJm10bXhfcGFyYW1zLmhkciwgc2l6ZW9mKG10bXhfcGFyYW1zKSwgVFJVRSk7Ci0JbXRteF9wYXJhbXMuaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9HRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI7Ci0JbXRteF9wYXJhbXMucGFyYW1faW5mby5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCW10bXhfcGFyYW1zLnBhcmFtX2luZm8uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQltdG14X3BhcmFtcy5wYXJhbV9pbmZvLm1lbV9tYXBfaGFuZGxlID0gMDsKLQltdG14X3BhcmFtcy5wYXJhbV9pbmZvLmRpcmVjdGlvbiA9IChhYy0+aW9fbW9kZSAmIFRVTl9SRUFEX0lPX01PREUKLQkJCQkJICAgID8gMSA6IDApOwotCW10bXhfcGFyYW1zLnBhcmFtX2luZm8ubW9kdWxlX2lkID0KLQkJQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DOwotCW10bXhfcGFyYW1zLnBhcmFtX2luZm8ucGFyYW1faWQgPQotCQlBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1NFU1NJT05fVElNRV9WMzsKLQltdG14X3BhcmFtcy5wYXJhbV9pbmZvLnBhcmFtX21heF9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIpICsKLQkJc2l6ZW9mKHN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3Nlc3Npb25fdGltZV92M190KTsKLQlhdG9taWNfc2V0KCZhYy0+dGltZV9mbGFnLCAxKTsKLQotCWRldl92ZGJnKGFjLT5kZXYsICIlczogc2Vzc2lvblslZF1vcGNvZGVbMHgleF1cbiIsIF9fZnVuY19fLAotCQkgYWMtPnNlc3Npb24sIG10bXhfcGFyYW1zLmhkci5vcGNvZGUpOwotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmbXRteF9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbW1hbmQgMHgleCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgbXRteF9wYXJhbXMuaGRyLm9wY29kZSwgcmMpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+dGltZV93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+dGltZV9mbGFnKSA9PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0IGluIGdldHRpbmcgc2Vzc2lvbiB0aW1lIGZyb20gRFNQXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQkqdHN0YW1wID0gYWMtPnRpbWVfc3RhbXA7Ci0JcmV0dXJuIDA7Ci0KLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fZ2V0X3Nlc3Npb25fdGltZV9sZWdhY3koc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIHVpbnQ2NF90ICp0c3RhbXApCi17Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCWludCByYzsKLQotCWlmIChhYyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICh0c3RhbXAgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB0c3RhbXAgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlxNmFzbV9hZGRfaGRyKGFjLCAmaGRyLCBzaXplb2YoaGRyKSwgVFJVRSk7Ci0JaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9HRVRfU0VTU0lPTlRJTUVfVjM7Ci0JYXRvbWljX3NldCgmYWMtPnRpbWVfZmxhZywgMSk7Ci0KLQlkZXZfdmRiZyhhYy0+ZGV2LCAiJXM6IHNlc3Npb25bJWRdb3Bjb2RlWzB4JXhdXG4iLCBfX2Z1bmNfXywKLQkJCWFjLT5zZXNzaW9uLAotCQkJaGRyLm9wY29kZSk7Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZoZHIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbW1hbmQgMHgleCBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIGhkci5vcGNvZGUsIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPnRpbWVfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPnRpbWVfZmxhZykgPT0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCBpbiBnZXR0aW5nIHNlc3Npb24gdGltZSBmcm9tIERTUFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JKnRzdGFtcCA9IGFjLT50aW1lX3N0YW1wOwotCXJldHVybiAwOwotCi1mYWlsX2NtZDoKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotCi1pbnQgcTZhc21fc2VuZF9hdWRpb19lZmZlY3RzX3BhcmFtcyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgY2hhciAqcGFyYW1zLAotCQkJCSAgICB1aW50MzJfdCBwYXJhbXNfbGVuZ3RoKQotewotCWNoYXIgKmFzbV9wYXJhbXMgPSBOVUxMOwotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MiBwYXlsb2FkX3BhcmFtczsKLQlpbnQgc3osIHJjOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHBhcmFtcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKwotCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpICsKLQkJcGFyYW1zX2xlbmd0aDsKLQlhc21fcGFyYW1zID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhc21fcGFyYW1zKSB7Ci0JCXByX2VycigiJXMsIGFzbSBwYXJhbXMgbWVtb3J5IGFsbG9jIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXE2YXNtX2FkZF9oZHJfYXN5bmMoYWMsICZoZHIsIChzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpICsKLQkJCQlwYXJhbXNfbGVuZ3RoKSwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZV9wcCwgLTEpOwotCWhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9TRVRfUFBfUEFSQU1TX1YyOwotCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JcGF5bG9hZF9wYXJhbXMuZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQlwYXlsb2FkX3BhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JcGF5bG9hZF9wYXJhbXMuZGF0YV9wYXlsb2FkX3NpemUgPSBwYXJhbXNfbGVuZ3RoOwotCW1lbWNweSgoKHU4ICopYXNtX3BhcmFtcyksICZoZHIsIHNpemVvZihzdHJ1Y3QgYXByX2hkcikpOwotCW1lbWNweSgoKHU4ICopYXNtX3BhcmFtcyArIHNpemVvZihzdHJ1Y3QgYXByX2hkcikpLCAmcGF5bG9hZF9wYXJhbXMsCi0JCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpKTsKLQltZW1jcHkoKCh1OCAqKWFzbV9wYXJhbXMgKyBzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpKSwKLQkJCXBhcmFtcywgcGFyYW1zX2xlbmd0aCk7Ci0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopIGFzbV9wYXJhbXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gZWZmZWN0cyBzZXQtcGFyYW1zIHNlbmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX3NlbmRfcGFyYW07Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID49IDApLCAxKkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIGF1ZGlvIGVmZmVjdHMgc2V0LXBhcmFtc1xuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9zZW5kX3BhcmFtOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIHNldC1wYXJhbXNcbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApKTsKLQkJZ290byBmYWlsX3NlbmRfcGFyYW07Ci0JfQotCi0JcmMgPSAwOwotZmFpbF9zZW5kX3BhcmFtOgotCWtmcmVlKGFzbV9wYXJhbXMpOwotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl93aW5kb3coc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90ICp3aW5kb3dfcGFyYW0sCi0JCXVpbnQzMl90IHBhcmFtX2lkKQotewotCXN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMgbWF0cml4OwotCWludCBzeiA9IDA7Ci0JaW50IHJjICA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IFdpbmRvdyBsc3cgaXMgJWQsIHdpbmRvdyBtc3cgaXMgJWRcbiIsIF9fZnVuY19fLAotCQkgIHdpbmRvd19wYXJhbS0+d2luZG93X2xzdywgd2luZG93X3BhcmFtLT53aW5kb3dfbXN3KTsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGFjLT5hcHIgaXMgTlVMTCIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXN6ID0gc2l6ZW9mKHN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMpOwotCXE2YXNtX2FkZF9oZHIoYWMsICZtYXRyaXguaGRyLCBzeiwgVFJVRSk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgLTEpOwotCW1hdHJpeC5oZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1NFVF9NVE1YX1NUUlRSX1BBUkFNU19WMjsKLQotCW1hdHJpeC5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPSAwOwotCW1hdHJpeC5wYXJhbS5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSAwOwotCW1hdHJpeC5wYXJhbS5tZW1fbWFwX2hhbmRsZSA9IDA7Ci0JbWF0cml4LnBhcmFtLmRhdGFfcGF5bG9hZF9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCBhc21fc3RyZWFtX3BhcmFtX2RhdGFfdjIpICsKLQkJc2l6ZW9mKHN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90KTsKLQltYXRyaXgucGFyYW0uZGlyZWN0aW9uID0gMDsgLyogUlggKi8KLQltYXRyaXguZGF0YS5tb2R1bGVfaWQgPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX01PRFVMRV9JRF9BVlNZTkM7Ci0JbWF0cml4LmRhdGEucGFyYW1faWQgPSBwYXJhbV9pZDsKLQltYXRyaXguZGF0YS5wYXJhbV9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX3dpbmRvd192Ml90KTsKLQltYXRyaXguZGF0YS5yZXNlcnZlZCA9IDA7Ci0JbWVtY3B5KCYobWF0cml4LmNvbmZpZy53aW5kb3dfcGFyYW0pLAotCSAgICAgICB3aW5kb3dfcGFyYW0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV93aW5kb3dfdjJfdCkpOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtYXRyaXgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogUmVuZGVyIHdpbmRvdyBzdGFydCBzZW5kIGZhaWxlZCBwYXJhbWlkIFsweCV4XVxuIiwKLQkJCV9fZnVuY19fLCBtYXRyaXguZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIFJlbmRlciB3aW5kb3cgc3RhcnQgcGFyYW1pZFsweCV4XVxuIiwKLQkJCV9fZnVuY19fLCBtYXRyaXguZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gMDsKLWZhaWxfY21kOgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl9yZW5kZXJfbW9kZShzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3QgcmVuZGVyX21vZGUpCi17Ci0Jc3RydWN0IGFzbV9tdG14X3N0cnRyX3BhcmFtcyBtYXRyaXg7Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCByZW5kZXJfcGFyYW07Ci0JaW50IHN6ID0gMDsKLQlpbnQgcmMgID0gMDsKLQotCXByX2RlYnVnKCIlczogcmVuZGVyIG1vZGUgaXMgJWRcbiIsIF9fZnVuY19fLCByZW5kZXJfbW9kZSk7Ci0KLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvIGNsaWVudCBoYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGFjLT5hcHIgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoKHJlbmRlcl9tb2RlICE9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fUkVOREVSX0RFRkFVTFQpICYmCi0JICAgIChyZW5kZXJfbW9kZSAhPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX1BBUkFNX1JFTkRFUl9MT0NBTF9TVEMpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgcmVuZGVyIG1vZGUgJWRcbiIsIF9fZnVuY19fLCByZW5kZXJfbW9kZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCW1lbXNldCgmcmVuZGVyX3BhcmFtLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCkpOwotCXJlbmRlcl9wYXJhbS5mbGFncyA9IHJlbmRlcl9tb2RlOwotCi0JbWVtc2V0KCZtYXRyaXgsIDAsIHNpemVvZihzdHJ1Y3QgYXNtX210bXhfc3RydHJfcGFyYW1zKSk7Ci0Jc3ogPSBzaXplb2Yoc3RydWN0IGFzbV9tdG14X3N0cnRyX3BhcmFtcyk7Ci0JcTZhc21fYWRkX2hkcihhYywgJm1hdHJpeC5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JbWF0cml4Lmhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfU0VUX01UTVhfU1RSVFJfUEFSQU1TX1YyOwotCi0JbWF0cml4LnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX2xzdyA9IDA7Ci0JbWF0cml4LnBhcmFtLmRhdGFfcGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JbWF0cml4LnBhcmFtLm1lbV9tYXBfaGFuZGxlID0gMDsKLQltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX3NpemUgPQotCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fcGFyYW1fZGF0YV92MikgKwotCQlzaXplb2Yoc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCk7Ci0JbWF0cml4LnBhcmFtLmRpcmVjdGlvbiA9IDA7IC8qIFJYICovCi0JbWF0cml4LmRhdGEubW9kdWxlX2lkID0gQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9NT0RVTEVfSURfQVZTWU5DOwotCW1hdHJpeC5kYXRhLnBhcmFtX2lkID0gQVNNX1NFU1NJT05fTVRNWF9TVFJUUl9QQVJBTV9SRU5ERVJfTU9ERV9DTUQ7Ci0JbWF0cml4LmRhdGEucGFyYW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9yZW5kZXJfbW9kZV90KTsKLQltYXRyaXguZGF0YS5yZXNlcnZlZCA9IDA7Ci0JbWVtY3B5KCYobWF0cml4LmNvbmZpZy5yZW5kZXJfcGFyYW0pLAotCSAgICAgICAmcmVuZGVyX3BhcmFtLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fcmVuZGVyX21vZGVfdCkpOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtYXRyaXgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogUmVuZGVyIG1vZGUgc2VuZCBmYWlsZWQgcGFyYW1pZCBbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgbWF0cml4LmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQsIFJlbmRlciBtb2RlIHNlbmQgcGFyYW1pZCBbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgbWF0cml4LmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcmMgPSAwOwotZXhpdDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9zZW5kX210bXhfc3RydHJfY2xrX3JlY19tb2RlKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLAotCQl1aW50MzJfdCBjbGtfcmVjX21vZGUpCi17Ci0Jc3RydWN0IGFzbV9tdG14X3N0cnRyX3BhcmFtcyBtYXRyaXg7Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX210bXhfc3RydHJfcGFyYW1fY2xrX3JlY190IGNsa19yZWNfcGFyYW07Ci0JaW50IHN6ID0gMDsKLQlpbnQgcmMgID0gMDsKLQotCXByX2RlYnVnKCIlczogY2xrIHJlYyBtb2RlIGlzICVkXG4iLCBfX2Z1bmNfXywgY2xrX3JlY19tb2RlKTsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYWMtPmFwciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICgoY2xrX3JlY19tb2RlICE9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19OT05FKSAmJgotCSAgICAoY2xrX3JlY19tb2RlICE9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19BVVRPKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNsayByZWMgbW9kZSAlZFxuIiwgX19mdW5jX18sIGNsa19yZWNfbW9kZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCW1lbXNldCgmY2xrX3JlY19wYXJhbSwgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX2Nsa19yZWNfdCkpOwotCWNsa19yZWNfcGFyYW0uZmxhZ3MgPSBjbGtfcmVjX21vZGU7Ci0KLQltZW1zZXQoJm1hdHJpeCwgMCwgc2l6ZW9mKHN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMpKTsKLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX210bXhfc3RydHJfcGFyYW1zKTsKLQlxNmFzbV9hZGRfaGRyKGFjLCAmbWF0cml4Lmhkciwgc3osIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQltYXRyaXguaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI7Ci0KLQltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQltYXRyaXgucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCW1hdHJpeC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyKSArCi0JCXNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9jbGtfcmVjX3QpOwotCW1hdHJpeC5wYXJhbS5kaXJlY3Rpb24gPSAwOyAvKiBSWCAqLwotCW1hdHJpeC5kYXRhLm1vZHVsZV9pZCA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfTU9EVUxFX0lEX0FWU1lOQzsKLQltYXRyaXguZGF0YS5wYXJhbV9pZCA9IEFTTV9TRVNTSU9OX01UTVhfU1RSVFJfUEFSQU1fQ0xLX1JFQ19DTUQ7Ci0JbWF0cml4LmRhdGEucGFyYW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9zdHJ0cl9wYXJhbV9jbGtfcmVjX3QpOwotCW1hdHJpeC5kYXRhLnJlc2VydmVkID0gMDsKLQltZW1jcHkoJihtYXRyaXguY29uZmlnLmNsa19yZWNfcGFyYW0pLAotCSAgICAgICAmY2xrX3JlY19wYXJhbSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3N0cnRyX3BhcmFtX2Nsa19yZWNfdCkpOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtYXRyaXgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogY2xrIHJlYyBtb2RlIHNlbmQgZmFpbGVkIHBhcmFtaWQgWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIG1hdHJpeC5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCBjbGsgcmVjIG1vZGUgc2VuZCBwYXJhbWlkIFsweCV4XVxuIiwKLQkJCV9fZnVuY19fLCBtYXRyaXguZGF0YS5wYXJhbV9pZCk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSkpOwotCQlyYyA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKTsKLQkJZ290byBleGl0OwotCX0KLQlyYyA9IDA7Ci1leGl0OgotCXJldHVybiByYzsKLX0KLQotaW50IHE2YXNtX3NlbmRfbXRteF9zdHJ0cl9lbmFibGVfYWRqdXN0X3Nlc3Npb25fY2xvY2soc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsCi0JCWJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMgbWF0cml4OwotCXN0cnVjdCBhc21fc2Vzc2lvbl9tdG14X3BhcmFtX2FkanVzdF9zZXNzaW9uX3RpbWVfY3RsX3QgYWRqdXN0X3RpbWU7Ci0JaW50IHN6ID0gMDsKLQlpbnQgcmMgID0gMDsKLQotCXByX2RlYnVnKCIlczogYWRqdXN0IHNlc3Npb24gZW5hYmxlICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gY2xpZW50IGhhbmRsZSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYWMtPmFwciBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWFkanVzdF90aW1lLmVuYWJsZSA9IGVuYWJsZTsKLQltZW1zZXQoJm1hdHJpeCwgMCwgc2l6ZW9mKHN0cnVjdCBhc21fbXRteF9zdHJ0cl9wYXJhbXMpKTsKLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXNtX210bXhfc3RydHJfcGFyYW1zKTsKLQlxNmFzbV9hZGRfaGRyKGFjLCAmbWF0cml4Lmhkciwgc3osIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQltYXRyaXguaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9TRVRfTVRNWF9TVFJUUl9QQVJBTVNfVjI7Ci0KLQltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQltYXRyaXgucGFyYW0uZGF0YV9wYXlsb2FkX2FkZHJfbXN3ID0gMDsKLQltYXRyaXgucGFyYW0ubWVtX21hcF9oYW5kbGUgPSAwOwotCW1hdHJpeC5wYXJhbS5kYXRhX3BheWxvYWRfc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9wYXJhbV9kYXRhX3YyKSArCi0JCXNpemVvZihzdHJ1Y3QgYXNtX3Nlc3Npb25fbXRteF9wYXJhbV9hZGp1c3Rfc2Vzc2lvbl90aW1lX2N0bF90KTsKLQltYXRyaXgucGFyYW0uZGlyZWN0aW9uID0gMDsgLyogUlggKi8KLQltYXRyaXguZGF0YS5tb2R1bGVfaWQgPSBBU01fU0VTU0lPTl9NVE1YX1NUUlRSX01PRFVMRV9JRF9BVlNZTkM7Ci0JbWF0cml4LmRhdGEucGFyYW1faWQgPSBBU01fU0VTU0lPTl9NVE1YX1BBUkFNX0FESlVTVF9TRVNTSU9OX1RJTUVfQ1RMOwotCW1hdHJpeC5kYXRhLnBhcmFtX3NpemUgPQotCQlzaXplb2Yoc3RydWN0IGFzbV9zZXNzaW9uX210bXhfcGFyYW1fYWRqdXN0X3Nlc3Npb25fdGltZV9jdGxfdCk7Ci0JbWF0cml4LmRhdGEucmVzZXJ2ZWQgPSAwOwotCW1hdHJpeC5jb25maWcuYWRqX3RpbWVfcGFyYW0uZW5hYmxlID0gYWRqdXN0X3RpbWUuZW5hYmxlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZtYXRyaXgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogZW5hYmxlIGFkanVzdCBzZXNzaW9uIGZhaWxlZCBmYWlsZWQgcGFyYW1pZCBbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgbWF0cml4LmRhdGEucGFyYW1faWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlyYyA9IHdhaXRfZXZlbnRfdGltZW91dChhYy0+Y21kX3dhaXQsCi0JCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IGVuYWJsZSBhZGp1c3Qgc2Vzc2lvbiBmYWlsZWQgZmFpbGVkIHBhcmFtaWQgWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIG1hdHJpeC5kYXRhLnBhcmFtX2lkKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXJjID0gMDsKLWV4aXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgX19xNmFzbV9jbWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBjbWQsIHVpbnQzMl90IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JaW50IHJjOwotCWF0b21pY190ICpzdGF0ZTsKLQlpbnQgY250ID0gMDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcTZhc21fc3RyZWFtX2FkZF9oZHIoYWMsICZoZHIsIHNpemVvZihoZHIpLCBUUlVFLCBzdHJlYW1faWQpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQkvKgotCSAqIFVwZGF0ZWQgdGhlIHRva2VuIGZpZWxkIHdpdGggc3RyZWFtL3Nlc3Npb24gZm9yIGNvbXByZXNzZWQgcGxheWJhY2sKLQkgKiBQbGF0Zm9ybSBkcml2ZXIgbXVzdCBrbm93IHRoZSB0aGUgc3RyZWFtIHdpdGggd2hpY2ggdGhlIGNvbW1hbmQgaXMKLQkgKiBhc3NvY2lhdGVkCi0JICovCi0JaWYgKGFjLT5pb19tb2RlICYgQ09NUFJFU1NFRF9TVFJFQU1fSU8pCi0JCXE2YXNtX3VwZGF0ZV90b2tlbigmaGRyLnRva2VuLAotCQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJCSAgIHN0cmVhbV9pZCwKLQkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIFdBSVRfQ01EKTsKLQlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAotCQkJX19mdW5jX18sIGhkci50b2tlbiwgc3RyZWFtX2lkLCBhYy0+c2Vzc2lvbik7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIENNRF9QQVVTRToKLQkJcHJfZGVidWcoIiVzOiBDTURfUEFVU0VcbiIsIF9fZnVuY19fKTsKLQkJaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9QQVVTRTsKLQkJc3RhdGUgPSAmYWMtPmNtZF9zdGF0ZTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfU1VTUEVORDoKLQkJcHJfZGVidWcoIiVzOiBDTURfU1VTUEVORFxuIiwgX19mdW5jX18pOwotCQloZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX1NVU1BFTkQ7Ci0JCXN0YXRlID0gJmFjLT5jbWRfc3RhdGU7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0ZMVVNIOgotCQlwcl9kZWJ1ZygiJXM6IENNRF9GTFVTSFxuIiwgX19mdW5jX18pOwotCQloZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfRkxVU0g7Ci0JCXN0YXRlID0gJmFjLT5jbWRfc3RhdGU7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX09VVF9GTFVTSDoKLQkJcHJfZGVidWcoIiVzOiBDTURfT1VUX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7Ci0JCWhkci5vcGNvZGUgPSBBU01fU1RSRUFNX0NNRF9GTFVTSF9SRUFEQlVGUzsKLQkJc3RhdGUgPSAmYWMtPmNtZF9zdGF0ZTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfRU9TOgotCQlwcl9kZWJ1ZygiJXM6IENNRF9FT1NcbiIsIF9fZnVuY19fKTsKLQkJaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9FT1M7Ci0JCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIDApOwotCQlzdGF0ZSA9ICZhYy0+Y21kX3N0YXRlOwotCQlicmVhazsKLQljYXNlIENNRF9DTE9TRToKLQkJcHJfZGVidWcoIiVzOiBDTURfQ0xPU0VcbiIsIF9fZnVuY19fKTsKLQkJaGRyLm9wY29kZSA9IEFTTV9TVFJFQU1fQ01EX0NMT1NFOwotCQlzdGF0ZSA9ICZhYy0+Y21kX3N0YXRlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGZvcm1hdFslZF1cbiIsIF9fZnVuY19fLCBjbWQpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1vcGNvZGVbMHgleF1cbiIsIF9fZnVuY19fLAotCQkJYWMtPnNlc3Npb24sCi0JCQloZHIub3Bjb2RlKTsKLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmhkcik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21tbWFuZCAweCV4IGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaGRyLm9wY29kZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwgKGF0b21pY19yZWFkKHN0YXRlKSA+PSAwKSwgNSpIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIHJlc3BvbnNlIG9wY29kZVsweCV4XVxuIiwKLQkJCQlfX2Z1bmNfXywgaGRyLm9wY29kZSk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKHN0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXSBvcGNvZGUgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQkJYXRvbWljX3JlYWQoc3RhdGUpKSwKLQkJCQkJaGRyLm9wY29kZSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZShhdG9taWNfcmVhZChzdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChjbWQgPT0gQ01EX0ZMVVNIKQotCQlxNmFzbV9yZXNldF9idWZfc3RhdGUoYWMpOwotCWlmIChjbWQgPT0gQ01EX0NMT1NFKSB7Ci0JCS8qIGNoZWNrIGlmIERTUCByZXR1cm4gYWxsIGJ1ZmZlcnMgKi8KLQkJaWYgKGFjLT5wb3J0W0lOXS5idWYpIHsKLQkJCWZvciAoY250ID0gMDsgY250IDwgYWMtPnBvcnRbSU5dLm1heF9idWZfY250OwotCQkJCQljbnQrKykgewotCQkJCWlmIChhYy0+cG9ydFtJTl0uYnVmW2NudF0udXNlZCA9PSBJTikgewotCQkJCQlkZXZfdmRiZyhhYy0+ZGV2LCAiV3JpdGUgQnVmWyVkXSBub3QgcmV0dXJuZWRcbiIsCi0JCQkJCQkJY250KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGFjLT5wb3J0W09VVF0uYnVmKSB7Ci0JCQlmb3IgKGNudCA9IDA7IGNudCA8IGFjLT5wb3J0W09VVF0ubWF4X2J1Zl9jbnQ7IGNudCsrKSB7Ci0JCQkJaWYgKGFjLT5wb3J0W09VVF0uYnVmW2NudF0udXNlZCA9PSBPVVQpIHsKLQkJCQkJZGV2X3ZkYmcoYWMtPmRldiwgIlJlYWQgQnVmWyVkXSBub3QgcmV0dXJuZWRcbiIsCi0JCQkJCQkJY250KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9jbWQoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMsIGludCBjbWQpCi17Ci0JcmV0dXJuIF9fcTZhc21fY21kKGFjLCBjbWQsIGFjLT5zdHJlYW1faWQpOwotfQotCi1pbnQgcTZhc21fc3RyZWFtX2NtZChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCwgdWludDMyX3Qgc3RyZWFtX2lkKQotewotCXJldHVybiBfX3E2YXNtX2NtZChhYywgY21kLCBzdHJlYW1faWQpOwotfQotCi1zdGF0aWMgaW50IF9fcTZhc21fY21kX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCwKLQkJCSAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCkKLXsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JaW50IHJjOwotCi0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlxNmFzbV9zdHJlYW1fYWRkX2hkcl9hc3luYyhhYywgJmhkciwgc2l6ZW9mKGhkciksIFRSVUUsIHN0cmVhbV9pZCk7Ci0JYXRvbWljX3NldCgmYWMtPmNtZF9zdGF0ZSwgMSk7Ci0JLyoKLQkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCi0JICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCi0JICogYXNzb2NpYXRlZAotCSAqLwotCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQotCQlxNmFzbV91cGRhdGVfdG9rZW4oJmhkci50b2tlbiwKLQkJCQkgICBhYy0+c2Vzc2lvbiwKLQkJCQkgICBzdHJlYW1faWQsCi0JCQkJICAgMCwgLyogQnVmZmVyIGluZGV4IGlzIE5BICovCi0JCQkJICAgMCwgLyogRGlyZWN0aW9uIGZsYWcgaXMgTkEgKi8KLQkJCQkgICBOT19XQUlUX0NNRCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAotCQkJX19mdW5jX18sIGhkci50b2tlbiwgc3RyZWFtX2lkLCBhYy0+c2Vzc2lvbik7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIENNRF9QQVVTRToKLQkJcHJfZGVidWcoIiVzOiBDTURfUEFVU0VcbiIsIF9fZnVuY19fKTsKLQkJaGRyLm9wY29kZSA9IEFTTV9TRVNTSU9OX0NNRF9QQVVTRTsKLQkJYnJlYWs7Ci0JY2FzZSBDTURfRU9TOgotCQlwcl9kZWJ1ZygiJXM6IENNRF9FT1NcbiIsIF9fZnVuY19fKTsKLQkJaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9FT1M7Ci0JCWJyZWFrOwotCWNhc2UgQ01EX0NMT1NFOgotCQlwcl9kZWJ1ZygiJXM6IENNRF9DTE9TRVxuIiwgX19mdW5jX18pOwotCQloZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfQ0xPU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgZm9ybWF0WyVkXVxuIiwgX19mdW5jX18sIGNtZCk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1vcGNvZGVbMHgleF1cbiIsIF9fZnVuY19fLAotCQkJYWMtPnNlc3Npb24sCi0JCQloZHIub3Bjb2RlKTsKLQotCXJjID0gYXByX3NlbmRfcGt0KGFjLT5hcHIsICh1aW50MzJfdCAqKSAmaGRyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1tYW5kIDB4JXggZmFpbGVkICVkXG4iLAotCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBxNmFzbV9jbWRfbm93YWl0KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCBpbnQgY21kKQotewotCXByX2RlYnVnKCIlczogc3RyZWFtX2lkOiAlZFxuIiwgX19mdW5jX18sIGFjLT5zdHJlYW1faWQpOwotCXJldHVybiBfX3E2YXNtX2NtZF9ub3dhaXQoYWMsIGNtZCwgYWMtPnN0cmVhbV9pZCk7Ci19Ci0KLWludCBxNmFzbV9zdHJlYW1fY21kX25vd2FpdChzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgaW50IGNtZCwKLQkJCSAgICB1aW50MzJfdCBzdHJlYW1faWQpCi17Ci0JcHJfZGVidWcoIiVzOiBzdHJlYW1faWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RyZWFtX2lkKTsKLQlyZXR1cm4gX19xNmFzbV9jbWRfbm93YWl0KGFjLCBjbWQsIHN0cmVhbV9pZCk7Ci19Ci0KLWludCBfX3E2YXNtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBzdHJlYW1faWQsCi0JCQkgIHVpbnQzMl90IGluaXRpYWxfc2FtcGxlcywgdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlcykKLXsKLQlzdHJ1Y3QgYXNtX2RhdGFfY21kX3JlbW92ZV9zaWxlbmNlIHNpbGVuY2U7Ci0JaW50IHJjID0gMDsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFDIEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXVxuIiwgX19mdW5jX18sIGFjLT5zZXNzaW9uKTsKLQlxNmFzbV9zdHJlYW1fYWRkX2hkcl9hc3luYyhhYywgJnNpbGVuY2UuaGRyLCBzaXplb2Yoc2lsZW5jZSksIFRSVUUsCi0JCQlzdHJlYW1faWQpOwotCi0JLyoKLQkgKiBVcGRhdGVkIHRoZSB0b2tlbiBmaWVsZCB3aXRoIHN0cmVhbS9zZXNzaW9uIGZvciBjb21wcmVzc2VkIHBsYXliYWNrCi0JICogUGxhdGZvcm0gZHJpdmVyIG11c3Qga25vdyB0aGUgdGhlIHN0cmVhbSB3aXRoIHdoaWNoIHRoZSBjb21tYW5kIGlzCi0JICogYXNzb2NpYXRlZAotCSAqLwotCWlmIChhYy0+aW9fbW9kZSAmIENPTVBSRVNTRURfU1RSRUFNX0lPKQotCQlxNmFzbV91cGRhdGVfdG9rZW4oJnNpbGVuY2UuaGRyLnRva2VuLAotCQkJCSAgIGFjLT5zZXNzaW9uLAotCQkJCSAgIHN0cmVhbV9pZCwKLQkJCQkgICAwLCAvKiBCdWZmZXIgaW5kZXggaXMgTkEgKi8KLQkJCQkgICAwLCAvKiBEaXJlY3Rpb24gZmxhZyBpcyBOQSAqLwotCQkJCSAgIE5PX1dBSVRfQ01EKTsKLQlwcl9kZWJ1ZygiJXM6IHRva2VuID0gMHgleCwgc3RyZWFtX2lkICAlZCwgc2Vzc2lvbiAweCV4XG4iLAotCQkJX19mdW5jX18sIHNpbGVuY2UuaGRyLnRva2VuLCBzdHJlYW1faWQsIGFjLT5zZXNzaW9uKTsKLQotCXNpbGVuY2UuaGRyLm9wY29kZSA9IEFTTV9EQVRBX0NNRF9SRU1PVkVfSU5JVElBTF9TSUxFTkNFOwotCXNpbGVuY2UubnVtX3NhbXBsZXNfdG9fcmVtb3ZlICAgID0gaW5pdGlhbF9zYW1wbGVzOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZzaWxlbmNlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IENvbW1tYW5kIHNpbGVuY2UgZmFpbGVkWyVkXSIsIF9fZnVuY19fLCByYyk7Ci0KLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlzaWxlbmNlLmhkci5vcGNvZGUgPSBBU01fREFUQV9DTURfUkVNT1ZFX1RSQUlMSU5HX1NJTEVOQ0U7Ci0Jc2lsZW5jZS5udW1fc2FtcGxlc190b19yZW1vdmUgICAgPSB0cmFpbGluZ19zYW1wbGVzOwotCi0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJnNpbGVuY2UpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogQ29tbW1hbmQgc2lsZW5jZSBmYWlsZWRbJWRdIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBmYWlsX2NtZDsKLQl9Ci0KLQlyZXR1cm4gMDsKLWZhaWxfY21kOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgcTZhc21fc3RyZWFtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBzdHJlYW1faWQsCi0JCXVpbnQzMl90IGluaXRpYWxfc2FtcGxlcywgdWludDMyX3QgdHJhaWxpbmdfc2FtcGxlcykKLXsKLQlyZXR1cm4gX19xNmFzbV9zZW5kX21ldGFfZGF0YShhYywgc3RyZWFtX2lkLCBpbml0aWFsX3NhbXBsZXMsCi0JCQkJICAgICB0cmFpbGluZ19zYW1wbGVzKTsKLX0KLQotaW50IHE2YXNtX3NlbmRfbWV0YV9kYXRhKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MzJfdCBpbml0aWFsX3NhbXBsZXMsCi0JCXVpbnQzMl90IHRyYWlsaW5nX3NhbXBsZXMpCi17Ci0JcmV0dXJuIF9fcTZhc21fc2VuZF9tZXRhX2RhdGEoYWMsIGFjLT5zdHJlYW1faWQsIGluaXRpYWxfc2FtcGxlcywKLQkJCQkgICAgIHRyYWlsaW5nX3NhbXBsZXMpOwotfQotCi1zdGF0aWMgdm9pZCBxNmFzbV9yZXNldF9idWZfc3RhdGUoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IGNudCA9IDA7Ci0JaW50IGxvb3BjbnQgPSAwOwotCWludCB1c2VkOwotCXN0cnVjdCBhdWRpb19wb3J0X2RhdGEgKnBvcnQgPSBOVUxMOwotCi0JaWYgKGFjLT5pb19tb2RlICYgU1lOQ19JT19NT0RFKSB7Ci0JCXVzZWQgPSAoYWMtPmlvX21vZGUgJiBUVU5fV1JJVEVfSU9fTU9ERSA/IDEgOiAwKTsKLQkJbXV0ZXhfbG9jaygmYWMtPmNtZF9sb2NrKTsKLQkJZm9yIChsb29wY250ID0gMDsgbG9vcGNudCA8PSBPVVQ7IGxvb3BjbnQrKykgewotCQkJcG9ydCA9ICZhYy0+cG9ydFtsb29wY250XTsKLQkJCWNudCA9IHBvcnQtPm1heF9idWZfY250IC0gMTsKLQkJCXBvcnQtPmRzcF9idWYgPSAwOwotCQkJcG9ydC0+Y3B1X2J1ZiA9IDA7Ci0JCQl3aGlsZSAoY250ID49IDApIHsKLQkJCQlpZiAoIXBvcnQtPmJ1ZikKLQkJCQkJY29udGludWU7Ci0JCQkJcG9ydC0+YnVmW2NudF0udXNlZCA9IHVzZWQ7Ci0JCQkJY250LS07Ci0JCQl9Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZhYy0+Y21kX2xvY2spOwotCX0KLX0KLQotaW50IHE2YXNtX3JlZ190eF9vdmVyZmxvdyhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywgdWludDE2X3QgZW5hYmxlKQotewotCXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfcmVneF9vdmVyZmxvdyB0eF9vdmVyZmxvdzsKLQlpbnQgcmM7Ci0KLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBQyBBUFIgaGFuZGxlIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogc2Vzc2lvblslZF1lbmFibGVbJWRdXG4iLCBfX2Z1bmNfXywKLQkJCWFjLT5zZXNzaW9uLCBlbmFibGUpOwotCXE2YXNtX2FkZF9oZHIoYWMsICZ0eF9vdmVyZmxvdy5oZHIsIHNpemVvZih0eF9vdmVyZmxvdyksIFRSVUUpOwotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGUsIC0xKTsKLQotCXR4X292ZXJmbG93Lmhkci5vcGNvZGUgPQotCQkJCSBBU01fU0VTU0lPTl9DTURfUkVHSVNURVJfRk9SWF9PVkVSRkxPV19FVkVOVFM7Ci0JLyogdHggb3ZlcmZsb3cgZXZlbnQ6IGVuYWJsZSAqLwotCXR4X292ZXJmbG93LmVuYWJsZV9mbGFnID0gZW5hYmxlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZ0eF9vdmVyZmxvdyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiB0eCBvdmVyZmxvdyBvcFsweCV4XXJjWyVkXVxuIiwKLQkJCQlfX2Z1bmNfXywgdHhfb3ZlcmZsb3cuaGRyLm9wY29kZSwgcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCQkoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID49IDApLCA1KkhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgdHggb3ZlcmZsb3dcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRVRJTUVET1VUOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpKTsKLQkJcmMgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCWF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmFzbV9yZWdfcnhfdW5kZXJmbG93KHN0cnVjdCBhdWRpb19jbGllbnQgKmFjLCB1aW50MTZfdCBlbmFibGUpCi17Ci0Jc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9yZ3N0cl9yeF91bmRlcmZsb3cgcnhfdW5kZXJmbG93OwotCWludCByYzsKLQotCWlmICghYWMpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoYWMtPmFwciA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uWyVkXWVuYWJsZVslZF1cbiIsIF9fZnVuY19fLAotCQkJYWMtPnNlc3Npb24sIGVuYWJsZSk7Ci0JcTZhc21fYWRkX2hkcl9hc3luYyhhYywgJnJ4X3VuZGVyZmxvdy5oZHIsIHNpemVvZihyeF91bmRlcmZsb3cpLCBGQUxTRSk7Ci0KLQlyeF91bmRlcmZsb3cuaGRyLm9wY29kZSA9Ci0JCUFTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9GT1JfUlhfVU5ERVJGTE9XX0VWRU5UUzsKLQkvKiB0eCBvdmVyZmxvdyBldmVudDogZW5hYmxlICovCi0JcnhfdW5kZXJmbG93LmVuYWJsZV9mbGFnID0gZW5hYmxlOwotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZyeF91bmRlcmZsb3cpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogdHggb3ZlcmZsb3cgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJX19mdW5jX18sIHJ4X3VuZGVyZmxvdy5oZHIub3Bjb2RlLCByYyk7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCXJldHVybiAwOwotZmFpbF9jbWQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBxNmFzbV9hZGp1c3Rfc2Vzc2lvbl9jbG9jayhzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYywKLQkJdWludDMyX3QgYWRqdXN0X3RpbWVfbHN3LAotCQl1aW50MzJfdCBhZGp1c3RfdGltZV9tc3cpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgc3ogPSAwOwotCXN0cnVjdCBhc21fc2Vzc2lvbl9jbWRfYWRqdXN0X3Nlc3Npb25fY2xvY2tfdjIgYWRqdXN0X2Nsb2NrOwotCi0JcHJfZGVidWcoIiVzOiBhZGp1c3RfdGltZV9sc3cgaXMgJXgsIGFkanVzdF90aW1lX21zdyBpcyAleFxuIiwgX19mdW5jX18sCi0JCSAgYWRqdXN0X3RpbWVfbHN3LCBhZGp1c3RfdGltZV9tc3cpOwotCi0JaWYgKCFhYykgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBjbGllbnQgaGFuZGxlIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYWMtPmFwciBpcyBOVUxMIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0Jc3ogPSBzaXplb2Yoc3RydWN0IGFzbV9zZXNzaW9uX2NtZF9hZGp1c3Rfc2Vzc2lvbl9jbG9ja192Mik7Ci0JcTZhc21fYWRkX2hkcihhYywgJmFkanVzdF9jbG9jay5oZHIsIHN6LCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0JYWRqdXN0X2Nsb2NrLmhkci5vcGNvZGUgPSBBU01fU0VTU0lPTl9DTURfQURKVVNUX1NFU1NJT05fQ0xPQ0tfVjI7Ci0KLQlhZGp1c3RfY2xvY2suYWRqdXN0aW1lX2xzdyA9IGFkanVzdF90aW1lX2xzdzsKLQlhZGp1c3RfY2xvY2suYWRqdXN0aW1lX21zdyA9IGFkanVzdF90aW1lX21zdzsKLQotCi0JcmMgPSBhcHJfc2VuZF9wa3QoYWMtPmFwciwgKHVpbnQzMl90ICopICZhZGp1c3RfY2xvY2spOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYWRqdXN0X2Nsb2NrIHNlbmQgZmFpbGVkIHBhcmFtaWQgWzB4JXhdXG4iLAotCQkJX19mdW5jX18sIGFkanVzdF9jbG9jay5oZHIub3Bjb2RlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KGFjLT5jbWRfd2FpdCwKLQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkgPj0gMCksIDUqSFopOwotCWlmICghcmMpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dCwgYWRqdXN0X2Nsb2NrIHBhcmFtaWRbMHgleF1cbiIsCi0JCQlfX2Z1bmNfXywgYWRqdXN0X2Nsb2NrLmhkci5vcGNvZGUpOwotCQlyYyA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlyYyA9IDA7Ci1mYWlsX2NtZDoKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBxNmFzbV9nZXRfcGF0aF9kZWxheSgpIC0gZ2V0IHRoZSBwYXRoIGRlbGF5IGZvciBhbiBhdWRpbyBzZXNzaW9uCi0gKiBAYWM6IGF1ZGlvIGNsaWVudCBoYW5kbGUKLSAqCi0gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgYXVkaW8gRFNQIHBhdGggZGVsYXkgZm9yIHRoZSBnaXZlbiBhdWRpbyBzZXNzaW9uLgotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQotICovCi1pbnQgcTZhc21fZ2V0X3BhdGhfZGVsYXkoc3RydWN0IGF1ZGlvX2NsaWVudCAqYWMpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0KLQlpZiAoIWFjIHx8IGFjLT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGF1ZGlvIGNsaWVudFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQloZHIub3Bjb2RlID0gQVNNX1NFU1NJT05fQ01EX0dFVF9QQVRIX0RFTEFZX1YyOwotCXE2YXNtX2FkZF9oZHIoYWMsICZoZHIsIHNpemVvZihoZHIpLCBUUlVFKTsKLQlhdG9taWNfc2V0KCZhYy0+Y21kX3N0YXRlLCAtMSk7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgJmhkcik7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBDb21tbWFuZCAweCV4IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCi0JCQkJaGRyLm9wY29kZSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+PSAwKSwgNSAqIEhaKTsKLQlpZiAoIXJjKSB7Ci0JCXByX2VycigiJXM6IHRpbWVvdXQuIHdhaXRlZCBmb3IgcmVzcG9uc2Ugb3Bjb2RlWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBoZHIub3Bjb2RlKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JaWYgKGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlKSA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGUpKSk7Ci0JCXJjID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQlhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZSkpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBxNmFzbV9nZXRfYXByX3NlcnZpY2VfaWQoaW50IHNlc3Npb25faWQpCi17Ci0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JaWYgKHNlc3Npb25faWQgPD0gMCB8fCBzZXNzaW9uX2lkID4gQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuICgoc3RydWN0IGFwcl9zdmMgKilzZXNzaW9uW3Nlc3Npb25faWRdLT5hcHIpLT5pZDsKLX0KLQotaW50IHE2YXNtX2dldF9hc21fdG9wb2xvZ3koaW50IHNlc3Npb25faWQpCi17Ci0JaW50IHRvcG9sb2d5ID0gLUVJTlZBTDsKLQotCWlmIChzZXNzaW9uX2lkIDw9IDAgfHwgc2Vzc2lvbl9pZCA+IEFTTV9BQ1RJVkVfU1RSRUFNU19BTExPV0VEKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCA9ICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHNlc3Npb25bc2Vzc2lvbl9pZF0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBzZXNzaW9uIG5vdCBjcmVhdGVkIGZvciBzZXNzaW9uIGlkID0gJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JdG9wb2xvZ3kgPSBzZXNzaW9uW3Nlc3Npb25faWRdLT50b3BvbG9neTsKLWRvbmU6Ci0JcmV0dXJuIHRvcG9sb2d5OwotfQotCi1pbnQgcTZhc21fZ2V0X2FzbV9hcHBfdHlwZShpbnQgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgYXBwX3R5cGUgPSAtRUlOVkFMOwotCi0JaWYgKHNlc3Npb25faWQgPD0gMCB8fCBzZXNzaW9uX2lkID4gQVNNX0FDVElWRV9TVFJFQU1TX0FMTE9XRUQpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkID0gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAoc2Vzc2lvbltzZXNzaW9uX2lkXSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb24gbm90IGNyZWF0ZWQgZm9yIHNlc3Npb24gaWQgPSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQlhcHBfdHlwZSA9IHNlc3Npb25bc2Vzc2lvbl9pZF0tPmFwcF90eXBlOwotZG9uZToKLQlyZXR1cm4gYXBwX3R5cGU7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fZ2V0X2FzbV90b3BvbG9neV9jYWwodm9pZCkKLXsKLQlpbnQgdG9wb2xvZ3kgPSBERUZBVUxUX1BPUFBfVE9QT0xPR1k7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCi0JaWYgKGNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQotCW11dGV4X2xvY2soJmNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKLQljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKGNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpCi0JCWdvdG8gdW5sb2NrOwotCi0JdG9wb2xvZ3kgPSAoKHN0cnVjdCBhdWRpb19jYWxfaW5mb19hc21fdG9wICopCi0JCWNhbF9ibG9jay0+Y2FsX2luZm8pLT50b3BvbG9neTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9UT1BPTE9HWV9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBVc2luZyB0b3BvbG9neSAlZFxuIiwgX19mdW5jX18sIHRvcG9sb2d5KTsKLQlyZXR1cm4gdG9wb2xvZ3k7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fZ2V0X2FzbV9hcHBfdHlwZV9jYWwodm9pZCkKLXsKLQlpbnQgYXBwX3R5cGUgPSBERUZBVUxUX0FQUF9UWVBFOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQotCWlmIChjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jayhjYWxfZGF0YVtBU01fVE9QT0xPR1lfQ0FMXSk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKQotCQlnb3RvIHVubG9jazsKLQotCWFwcF90eXBlID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fYXNtX3RvcCAqKQotCQljYWxfYmxvY2stPmNhbF9pbmZvKS0+YXBwX3R5cGU7Ci0KLQlpZiAoYXBwX3R5cGUgPT0gMCkKLQkJYXBwX3R5cGUgPSBERUZBVUxUX0FQUF9UWVBFOwotdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FsX2RhdGFbQVNNX1RPUE9MT0dZX0NBTF0tPmxvY2spOwotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IFVzaW5nIGFwcF90eXBlICVkXG4iLCBfX2Z1bmNfXywgYXBwX3R5cGUpOwotCXJldHVybiBhcHBfdHlwZTsKLX0KLQotaW50IHE2YXNtX3NlbmRfY2FsKHN0cnVjdCBhdWRpb19jbGllbnQgKmFjKQotewotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXByX2hkcgloZHI7Ci0JY2hhciAqYXNtX3BhcmFtcyA9IE5VTEw7Ci0Jc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgcGF5bG9hZF9wYXJhbXM7Ci0JaW50IHN6LCByYyA9IC1FSU5WQUw7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWFjKSB7Ci0JCXByX2VycigiJXM6IEFQUiBoYW5kbGUgTlVMTFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChhYy0+YXByID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQUMgQVBSIGhhbmRsZSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGFjLT5pb19tb2RlICYgTlRfTU9ERSkgewotCQlwcl9kZWJ1ZygiJXM6IGNhbGxlZCBmb3IgTlQgTU9ERSwgZXhpdGluZ1xuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9kYXRhW0FTTV9BVURTVFJNX0NBTF0gPT0gTlVMTCkKLQkJZ290byBkb25lOwotCi0JaWYgKGFjLT5wZXJmX21vZGUgPT0gVUxUUkFfTE9XX0xBVEVOQ1lfUENNX01PREUpIHsKLQkJcmMgPSAwOyAvKiBubyBjYWwgaXMgcmVxdWlyZWQsIG5vdCBlcnJvciBjYXNlICovCi0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fQVVEU1RSTV9DQUxdLT5sb2NrKTsKLQljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKGNhbF9kYXRhW0FTTV9BVURTVFJNX0NBTF0pOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBjYWxfYmxvY2sgaXMgTlVMTFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA9PSAwKSB7Ci0JCXJjID0gMDsgLyogbm90IGVycm9yIGNhc2UgKi8KLQkJcHJfZGVidWcoIiVzOiBjYWxfZGF0YS5zaXplIGlzIDAsIGRvbid0IHNlbmQgY2FsIGRhdGFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCXJjID0gcmVtYXBfY2FsX2RhdGEoQVNNX0FVRFNUUk1fQ0FMX1RZUEUsIGNhbF9ibG9jayk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IFJlbWFwX2NhbF9kYXRhIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKLQkJCV9fZnVuY19fLCBBU01fQVVEU1RSTV9DQUwpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlzeiA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcikgKwotCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpOwotCWFzbV9wYXJhbXMgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFzbV9wYXJhbXMpIHsKLQkJcHJfZXJyKCIlcywgYXNtIHBhcmFtcyBtZW1vcnkgYWxsb2MgZmFpbGVkIiwgX19mdW5jX18pOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCS8qIGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIgaGFzIG5vIEFQUiBoZWFkZXIgaW4gaXQgKi8KLQlxNmFzbV9hZGRfaGRyX2FzeW5jKGFjLCAmaGRyLCAoc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCi0JCXNpemVvZihzdHJ1Y3QgYXNtX3N0cmVhbV9jbWRfc2V0X3BwX3BhcmFtc192MikpLCBUUlVFKTsKLQotCWF0b21pY19zZXQoJmFjLT5jbWRfc3RhdGVfcHAsIC0xKTsKLQloZHIub3Bjb2RlID0gQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMjsKLQlwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPQotCQkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPQotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCQljYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlwYXlsb2FkX3BhcmFtcy5tZW1fbWFwX2hhbmRsZSA9IGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCXBheWxvYWRfcGFyYW1zLmRhdGFfcGF5bG9hZF9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOwotCW1lbWNweSgoKHU4ICopYXNtX3BhcmFtcyksICZoZHIsIHNpemVvZihzdHJ1Y3QgYXByX2hkcikpOwotCW1lbWNweSgoKHU4ICopYXNtX3BhcmFtcyArIHNpemVvZihzdHJ1Y3QgYXByX2hkcikpLCAmcGF5bG9hZF9wYXJhbXMsCi0JCQlzaXplb2Yoc3RydWN0IGFzbV9zdHJlYW1fY21kX3NldF9wcF9wYXJhbXNfdjIpKTsKLQotCXByX2RlYnVnKCIlczogcGh5YWRkciBsc3cgPSAleCBtc3cgPSAleCwgbWFwaGRsID0gJXggY2Fsc2l6ZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywgcGF5bG9hZF9wYXJhbXMuZGF0YV9wYXlsb2FkX2FkZHJfbHN3LAotCQlwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfYWRkcl9tc3csCi0JCXBheWxvYWRfcGFyYW1zLm1lbV9tYXBfaGFuZGxlLAotCQlwYXlsb2FkX3BhcmFtcy5kYXRhX3BheWxvYWRfc2l6ZSk7Ci0KLQlyYyA9IGFwcl9zZW5kX3BrdChhYy0+YXByLCAodWludDMyX3QgKikgYXNtX3BhcmFtcyk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoIiVzOiBhdWRpbyBhdWRzdHJtIGNhbCBzZW5kIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0JcmMgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYWMtPmNtZF93YWl0LAotCQkJCShhdG9taWNfcmVhZCgmYWMtPmNtZF9zdGF0ZV9wcCkgPj0gMCksIDUgKiBIWik7Ci0JaWYgKCFyYykgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LCBhdWRpbyBhdWRzdHJtIGNhbCBzZW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVUSU1FRE9VVDsKLQkJZ290byBmcmVlOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJmFjLT5jbWRfc3RhdGVfcHApID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJWRdIGF1ZGlvIGF1ZHN0cm0gY2FsIHNlbmRcbiIsCi0JCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZhYy0+Y21kX3N0YXRlX3BwKSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmcmVlOwotCX0KLQotCXJjID0gMDsKLQotZnJlZToKLQlrZnJlZShhc21fcGFyYW1zKTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJmNhbF9kYXRhW0FTTV9BVURTVFJNX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBBU01fVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXJldCA9IEFTTV9UT1BPTE9HWV9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQVNNX0NVU1RfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXJldCA9IEFTTV9DVVNUT01fVE9QX0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fQVVEU1RSTV9DQUxfVFlQRToKLQkJcmV0ID0gQVNNX0FVRFNUUk1fQ0FMOwotCQlicmVhazsKLQljYXNlIEFTTV9SVEFDX0FQUl9DQUxfVFlQRToKLQkJcmV0ID0gQVNNX1JUQUNfQVBSX0NBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZCFcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19hbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAotCQljYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fZGVhbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKLQkJCQlzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gY2FsX3V0aWxzX2RlYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJY2FsX2RhdGFbY2FsX2luZGV4XSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX2RlYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21fc2V0X2NhbChpbnQzMl90IGNhbF90eXBlLAotCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19zZXRfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJY2FsX2RhdGFbY2FsX2luZGV4XSwgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX3NldF9jYWwgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2luZGV4ID09IEFTTV9DVVNUT01fVE9QX0NBTCkgewotCQltdXRleF9sb2NrKCZjYWxfZGF0YVtBU01fQ1VTVE9NX1RPUF9DQUxdLT5sb2NrKTsKLQkJc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7Ci0JCW11dGV4X3VubG9jaygmY2FsX2RhdGFbQVNNX0NVU1RPTV9UT1BfQ0FMXS0+bG9jayk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBxNmFzbV9kZWxldGVfY2FsX2RhdGEodm9pZCkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0JY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKEFTTV9NQVhfQ0FMX1RZUEVTLCBjYWxfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgcTZhc21faW5pdF9jYWxfZGF0YSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjYWxfdHlwZV9pbmZvCWNhbF90eXBlX2luZm9bXSA9IHsKLQkJe3tBU01fVE9QT0xPR1lfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLAotCQlxNmFzbV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tBU01fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRSwKLQkJe3E2YXNtX2FsbG9jX2NhbCwgcTZhc21fZGVhbGxvY19jYWwsIE5VTEwsCi0JCXE2YXNtX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCBxNmFzbV91bm1hcF9jYWxfbWVtb3J5LCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0FTTV9BVURTVFJNX0NBTF9UWVBFLAotCQl7cTZhc21fYWxsb2NfY2FsLCBxNmFzbV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJcTZhc21fc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIHE2YXNtX3VubWFwX2NhbF9tZW1vcnksIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7QVNNX1JUQUNfQVBSX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9Ci0JfTsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKEFTTV9NQVhfQ0FMX1RZUEVTLCBjYWxfZGF0YSwKLQkJY2FsX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSEgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIHJldDsKLWVycjoKLQlxNmFzbV9kZWxldGVfY2FsX2RhdGEoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHE2YXNtX2lzX3ZhbGlkX3Nlc3Npb24oc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3QgYXVkaW9fY2xpZW50ICphYyA9IChzdHJ1Y3QgYXVkaW9fY2xpZW50ICopcHJpdjsKLQl1bmlvbiBhc21fdG9rZW5fc3RydWN0IGFzbV90b2tlbjsKLQotCWFzbV90b2tlbi50b2tlbiA9IGRhdGEtPnRva2VuOwotCWlmIChhc21fdG9rZW4uX3Rva2VuLnNlc3Npb25faWQgIT0gYWMtPnNlc3Npb24pIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXNzaW9uWyVkXSByeGVkIGV4cGVjdGVkWyVkXSIsCi0JCQlfX2Z1bmNfXywgYXNtX3Rva2VuLl90b2tlbi5zZXNzaW9uX2lkLCBhYy0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcTZhc21faW5pdCh2b2lkKQotewotCWludCBsY250LCByZXQ7Ci0KLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQltZW1zZXQoc2Vzc2lvbiwgMCwgc2l6ZW9mKHNlc3Npb24pKTsKLQlzZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKLQotCS8qc2V0dXAgY29tbW9uIGNsaWVudCB1c2VkIGZvciBjYWwgbWVtIG1hcCAqLwotCWNvbW1vbl9jbGllbnQuc2Vzc2lvbiA9IEFTTV9DT05UUk9MX1NFU1NJT047Ci0JY29tbW9uX2NsaWVudC5wb3J0WzBdLmJ1ZiA9ICZjb21tb25fYnVmWzBdOwotCWNvbW1vbl9jbGllbnQucG9ydFsxXS5idWYgPSAmY29tbW9uX2J1ZlsxXTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb25fY2xpZW50LmNtZF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb25fY2xpZW50LnRpbWVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY29tbW9uX2NsaWVudC5tZW1fd2FpdCk7Ci0JYXRvbWljX3NldCgmY29tbW9uX2NsaWVudC50aW1lX2ZsYWcsIDEpOwotCUlOSVRfTElTVF9IRUFEKCZjb21tb25fY2xpZW50LnBvcnRbMF0ubWVtX21hcF9oYW5kbGUpOwotCUlOSVRfTElTVF9IRUFEKCZjb21tb25fY2xpZW50LnBvcnRbMV0ubWVtX21hcF9oYW5kbGUpOwotCW11dGV4X2luaXQoJmNvbW1vbl9jbGllbnQuY21kX2xvY2spOwotCWZvciAobGNudCA9IDA7IGxjbnQgPD0gT1VUOyBsY250KyspIHsKLQkJbXV0ZXhfaW5pdCgmY29tbW9uX2NsaWVudC5wb3J0W2xjbnRdLmxvY2spOwotCQlzcGluX2xvY2tfaW5pdCgmY29tbW9uX2NsaWVudC5wb3J0W2xjbnRdLmRzcF9sb2NrKTsKLQl9Ci0JYXRvbWljX3NldCgmY29tbW9uX2NsaWVudC5jbWRfc3RhdGUsIDApOwotCWF0b21pY19zZXQoJmNvbW1vbl9jbGllbnQubWVtX3N0YXRlLCAwKTsKLQotCXJldCA9IHE2YXNtX2luaXRfY2FsX2RhdGEoKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgaW5pdCBjYWwgZGF0YSEgcmV0ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQljb25maWdfZGVidWdfZnNfaW5pdCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBxNmFzbV9leGl0KHZvaWQpCi17Ci0JcTZhc21fZGVsZXRlX2NhbF9kYXRhKCk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNmFzbV9pbml0KTsKLV9fZXhpdGNhbGwocTZhc21fZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhdWRpby12Mi5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2YXVkaW8tdjIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3OGU2YS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZhdWRpby12Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFmZS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YXVkaW8tdjIuaD4KLQotaW50IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgodTE2IHBvcnRfaWQpCi17Ci0Jc3dpdGNoIChwb3J0X2lkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19SWDogcmV0dXJuIElEWF9QUklNQVJZX0kyU19SWDsKLQljYXNlIFBSSU1BUllfSTJTX1RYOiByZXR1cm4gSURYX1BSSU1BUllfSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDsKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6IHJldHVybiBJRFhfU0VDT05EQVJZX0kyU19SWDsKLQljYXNlIFNFQ09OREFSWV9JMlNfVFg6IHJldHVybiBJRFhfU0VDT05EQVJZX0kyU19UWDsKLQljYXNlIE1JMlNfUlg6IHJldHVybiBJRFhfTUkyU19SWDsKLQljYXNlIE1JMlNfVFg6IHJldHVybiBJRFhfTUkyU19UWDsKLQljYXNlIEhETUlfUlg6IHJldHVybiBJRFhfSERNSV9SWDsKLQljYXNlIERJU1BMQVlfUE9SVF9SWDogcmV0dXJuIElEWF9ESVNQTEFZX1BPUlRfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TUERJRl9SWDogcmV0dXJuIElEWF9TUERJRl9SWDsKLQljYXNlIFJTVkRfMjogcmV0dXJuIElEWF9SU1ZEXzI7Ci0JY2FzZSBSU1ZEXzM6IHJldHVybiBJRFhfUlNWRF8zOwotCWNhc2UgRElHSV9NSUNfVFg6IHJldHVybiBJRFhfRElHSV9NSUNfVFg7Ci0JY2FzZSBWT0lDRV9SRUNPUkRfUlg6IHJldHVybiBJRFhfVk9JQ0VfUkVDT1JEX1JYOwotCWNhc2UgVk9JQ0VfUkVDT1JEX1RYOiByZXR1cm4gSURYX1ZPSUNFX1JFQ09SRF9UWDsKLQljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOiByZXR1cm4gSURYX1ZPSUNFX1BMQVlCQUNLX1RYOwotCWNhc2UgVk9JQ0UyX1BMQVlCQUNLX1RYOiByZXR1cm4gSURYX1ZPSUNFMl9QTEFZQkFDS19UWDsKLQljYXNlIFNMSU1CVVNfMF9SWDogcmV0dXJuIElEWF9TTElNQlVTXzBfUlg7Ci0JY2FzZSBTTElNQlVTXzBfVFg6IHJldHVybiBJRFhfU0xJTUJVU18wX1RYOwotCWNhc2UgU0xJTUJVU18xX1JYOiByZXR1cm4gSURYX1NMSU1CVVNfMV9SWDsKLQljYXNlIFNMSU1CVVNfMV9UWDogcmV0dXJuIElEWF9TTElNQlVTXzFfVFg7Ci0JY2FzZSBTTElNQlVTXzJfUlg6IHJldHVybiBJRFhfU0xJTUJVU18yX1JYOwotCWNhc2UgU0xJTUJVU18yX1RYOiByZXR1cm4gSURYX1NMSU1CVVNfMl9UWDsKLQljYXNlIFNMSU1CVVNfM19SWDogcmV0dXJuIElEWF9TTElNQlVTXzNfUlg7Ci0JY2FzZSBTTElNQlVTXzNfVFg6IHJldHVybiBJRFhfU0xJTUJVU18zX1RYOwotCWNhc2UgU0xJTUJVU180X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfNF9SWDsKLQljYXNlIFNMSU1CVVNfNF9UWDogcmV0dXJuIElEWF9TTElNQlVTXzRfVFg7Ci0JY2FzZSBTTElNQlVTXzVfUlg6IHJldHVybiBJRFhfU0xJTUJVU181X1JYOwotCWNhc2UgU0xJTUJVU181X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfNV9UWDsKLQljYXNlIFNMSU1CVVNfNl9SWDogcmV0dXJuIElEWF9TTElNQlVTXzZfUlg7Ci0JY2FzZSBTTElNQlVTXzZfVFg6IHJldHVybiBJRFhfU0xJTUJVU182X1RYOwotCWNhc2UgU0xJTUJVU183X1JYOiByZXR1cm4gSURYX1NMSU1CVVNfN19SWDsKLQljYXNlIFNMSU1CVVNfN19UWDogcmV0dXJuIElEWF9TTElNQlVTXzdfVFg7Ci0JY2FzZSBTTElNQlVTXzhfUlg6IHJldHVybiBJRFhfU0xJTUJVU184X1JYOwotCWNhc2UgU0xJTUJVU184X1RYOiByZXR1cm4gSURYX1NMSU1CVVNfOF9UWDsKLQljYXNlIElOVF9CVF9TQ09fUlg6IHJldHVybiBJRFhfSU5UX0JUX1NDT19SWDsKLQljYXNlIElOVF9CVF9TQ09fVFg6IHJldHVybiBJRFhfSU5UX0JUX1NDT19UWDsKLQljYXNlIElOVF9CVF9BMkRQX1JYOiByZXR1cm4gSURYX0lOVF9CVF9BMkRQX1JYOwotCWNhc2UgSU5UX0ZNX1JYOiByZXR1cm4gSURYX0lOVF9GTV9SWDsKLQljYXNlIElOVF9GTV9UWDogcmV0dXJuIElEWF9JTlRfRk1fVFg7Ci0JY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDogcmV0dXJuIElEWF9SVF9QUk9YWV9QT1JUXzAwMV9SWDsKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOiByZXR1cm4gSURYX1JUX1BST1hZX1BPUlRfMDAxX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg7Ci0JY2FzZSBBVURJT19QT1JUX0lEX0kyU19SWDoKLQkJcmV0dXJuIElEWF9BVURJT19QT1JUX0lEX0kyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYX1NEMToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzA7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8xOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF8zOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF80OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF82OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWF83OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8wOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1NFTkFSWV9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfVVNCX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX1VTQl9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9VU0JfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UMV9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UMl9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UM19NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UM19NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNF9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UNV9NSTJTX1JYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQkJcmV0dXJuIElEWF9BRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6Ci0JCXJldHVybiBJRFhfQUZFX1BPUlRfSURfSU5UNl9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UNl9NSTJTX1RYOgotCQlyZXR1cm4gSURYX0FGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDsKLQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLWludCBxNmF1ZGlvX2dldF9wb3J0X2lkKHUxNiBwb3J0X2lkKQotewotCXN3aXRjaCAocG9ydF9pZCkgewotCWNhc2UgUFJJTUFSWV9JMlNfUlg6IHJldHVybiBQUklNQVJZX0kyU19SWDsKLQljYXNlIFBSSU1BUllfSTJTX1RYOiByZXR1cm4gUFJJTUFSWV9JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOgotCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9UWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgotCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1BDTV9UWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYOgotCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYOwotCWNhc2UgU0VDT05EQVJZX0kyU19SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1JYOwotCWNhc2UgU0VDT05EQVJZX0kyU19UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOwotCWNhc2UgTUkyU19SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDsKLQljYXNlIE1JMlNfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg7Ci0JY2FzZSBIRE1JX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfTVVMVElDSEFOX0hETUlfUlg7Ci0JY2FzZSBESVNQTEFZX1BPUlRfUlg6Ci0JCQlyZXR1cm4gQUZFX1BPUlRfSURfSERNSV9PVkVSX0RQX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfU1BESUZfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TUERJRl9SWDsKLQljYXNlIFJTVkRfMjogcmV0dXJuIElEWF9SU1ZEXzI7Ci0JY2FzZSBSU1ZEXzM6IHJldHVybiBJRFhfUlNWRF8zOwotCWNhc2UgRElHSV9NSUNfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9ESUdJVEFMX01JQ19UWDsKLQljYXNlIFZPSUNFX1JFQ09SRF9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9SWDsKLQljYXNlIFZPSUNFX1JFQ09SRF9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1ZPSUNFX1JFQ09SRF9UWDsKLQljYXNlIFZPSUNFX1BMQVlCQUNLX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfVk9JQ0VfUExBWUJBQ0tfVFg7Ci0JY2FzZSBWT0lDRTJfUExBWUJBQ0tfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9WT0lDRTJfUExBWUJBQ0tfVFg7Ci0JY2FzZSBTTElNQlVTXzBfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMF9SWDsKLQljYXNlIFNMSU1CVVNfMF9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8wX1RYOwotCWNhc2UgU0xJTUJVU18xX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzFfUlg7Ci0JY2FzZSBTTElNQlVTXzFfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fMV9UWDsKLQljYXNlIFNMSU1CVVNfMl9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8yX1JYOwotCWNhc2UgU0xJTUJVU18yX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzJfVFg7Ci0JY2FzZSBTTElNQlVTXzNfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fM19SWDsKLQljYXNlIFNMSU1CVVNfM19UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl8zX1RYOwotCWNhc2UgU0xJTUJVU180X1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzRfUlg7Ci0JY2FzZSBTTElNQlVTXzRfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNF9UWDsKLQljYXNlIFNMSU1CVVNfNV9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl81X1JYOwotCWNhc2UgU0xJTUJVU181X1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzVfVFg7Ci0JY2FzZSBTTElNQlVTXzZfUlg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fNl9SWDsKLQljYXNlIFNMSU1CVVNfNl9UWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl82X1RYOwotCWNhc2UgU0xJTUJVU183X1JYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzdfUlg7Ci0JY2FzZSBTTElNQlVTXzdfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9TTElNQlVTX01VTFRJX0NIQU5fN19UWDsKLQljYXNlIFNMSU1CVVNfOF9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1NMSU1CVVNfTVVMVElfQ0hBTl84X1JYOwotCWNhc2UgU0xJTUJVU184X1RYOiByZXR1cm4gQUZFX1BPUlRfSURfU0xJTUJVU19NVUxUSV9DSEFOXzhfVFg7Ci0JY2FzZSBJTlRfQlRfU0NPX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfSU5URVJOQUxfQlRfU0NPX1JYOwotCWNhc2UgSU5UX0JUX1NDT19UWDogcmV0dXJuIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0JUX1NDT19UWDsKLQljYXNlIElOVF9CVF9BMkRQX1JYOiByZXR1cm4gQUZFX1BPUlRfSURfSU5URVJOQUxfQlRfQTJEUF9SWDsKLQljYXNlIElOVF9GTV9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX0lOVEVSTkFMX0ZNX1JYOwotCWNhc2UgSU5UX0ZNX1RYOiByZXR1cm4gQUZFX1BPUlRfSURfSU5URVJOQUxfRk1fVFg7Ci0JY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDogcmV0dXJuIEFGRV9QT1JUX0lEX1JUX1BST1hZX1BPUlRfMDAxX1JYOwotCWNhc2UgUlRfUFJPWFlfUE9SVF8wMDFfVFg6IHJldHVybiBBRkVfUE9SVF9JRF9SVF9QUk9YWV9QT1JUXzAwMV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfVFg6Ci0JCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgotCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX01JMlNfVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOgotCQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDoKLQkJCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1RYOwotCWNhc2UgQVVESU9fUE9SVF9JRF9JMlNfUlg6Ci0JCQlyZXR1cm4gQVVESU9fUE9SVF9JRF9JMlNfUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6Ci0JCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8xOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8yOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF80OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF81OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF83OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzE7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzQ7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjsKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzc7Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8xOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzI7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8yOgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzM7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF80OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNToKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzU7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF81OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNTsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OwotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzY7Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF83OgotCQlyZXR1cm4gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzsKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OwotCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6Ci0JCXJldHVybiBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1VTQl9SWDsKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX1VTQl9UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQkJcmV0dXJuIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDsKLQlkZWZhdWx0OgotCQlwcl93YXJuKCIlczogSW52YWxpZCBwb3J0X2lkICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLWludCBxNmF1ZGlvX2NvbnZlcnRfdmlydHVhbF90b19wb3J0aWQodTE2IHBvcnRfaWQpCi17Ci0JaW50IHJldDsKLQotCS8qIGlmIHBvcnRfaWQgaXMgdmlydHVhbCwgY29udmVydCB0byBwaHlzaWNhbC4uCi0JICogaWYgcG9ydF9pZCBpcyBhbHJlYWR5IHBoeXNpY2FsLCByZXR1cm4gcGh5c2ljYWwKLQkgKi8KLQlpZiAocTZhdWRpb192YWxpZGF0ZV9wb3J0KHBvcnRfaWQpIDwgMCkgewotCQlpZiAocG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAxX1JYIHx8Ci0JCQlwb3J0X2lkID09IFJUX1BST1hZX0RBSV8wMDFfVFggfHwKLQkJCXBvcnRfaWQgPT0gUlRfUFJPWFlfREFJXzAwMl9SWCB8fAotCQkJcG9ydF9pZCA9PSBSVF9QUk9YWV9EQUlfMDAyX1RYKQotCQkJcmV0ID0gVklSVFVBTF9JRF9UT19QT1JUSUQocG9ydF9pZCk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU5WQUw7Ci0JfSBlbHNlCi0JCXJldCA9IHBvcnRfaWQ7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcTZhdWRpb19pc19kaWdpdGFsX3BjbV9pbnRlcmZhY2UodTE2IHBvcnRfaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHBvcnRfaWQpIHsKLQljYXNlIFBSSU1BUllfSTJTX1JYOgotCWNhc2UgUFJJTUFSWV9JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfUENNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9QQ01fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfUENNX1RYOgotCWNhc2UgU0VDT05EQVJZX0kyU19SWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfVFg6Ci0JY2FzZSBNSTJTX1JYOgotCWNhc2UgTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDoKLQljYXNlIEFVRElPX1BPUlRfSURfSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlhfU0QxOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzI6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF80OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzU6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF83OgotCWNhc2UgQUZFX1BPUlRfSURfU0VOQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQwX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQxX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQzX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ0X01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ2X01JMlNfVFg6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHE2YXVkaW9fdmFsaWRhdGVfcG9ydCh1MTYgcG9ydF9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwb3J0X2lkKSB7Ci0JY2FzZSBQUklNQVJZX0kyU19SWDoKLQljYXNlIFBSSU1BUllfSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1BDTV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfUENNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfUENNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9QQ01fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1BDTV9UWDoKLQljYXNlIFNFQ09OREFSWV9JMlNfUlg6Ci0JY2FzZSBTRUNPTkRBUllfSTJTX1RYOgotCWNhc2UgTUkyU19SWDoKLQljYXNlIE1JMlNfVFg6Ci0JY2FzZSBIRE1JX1JYOgotCWNhc2UgRElTUExBWV9QT1JUX1JYOgotCWNhc2UgUlNWRF8yOgotCWNhc2UgUlNWRF8zOgotCWNhc2UgRElHSV9NSUNfVFg6Ci0JY2FzZSBWT0lDRV9SRUNPUkRfUlg6Ci0JY2FzZSBWT0lDRV9SRUNPUkRfVFg6Ci0JY2FzZSBWT0lDRV9QTEFZQkFDS19UWDoKLQljYXNlIFZPSUNFMl9QTEFZQkFDS19UWDoKLQljYXNlIFNMSU1CVVNfMF9SWDoKLQljYXNlIFNMSU1CVVNfMF9UWDoKLQljYXNlIFNMSU1CVVNfMV9SWDoKLQljYXNlIFNMSU1CVVNfMV9UWDoKLQljYXNlIFNMSU1CVVNfMl9SWDoKLQljYXNlIFNMSU1CVVNfMl9UWDoKLQljYXNlIFNMSU1CVVNfM19SWDoKLQljYXNlIFNMSU1CVVNfM19UWDoKLQljYXNlIFNMSU1CVVNfNF9SWDoKLQljYXNlIFNMSU1CVVNfNF9UWDoKLQljYXNlIFNMSU1CVVNfNV9SWDoKLQljYXNlIFNMSU1CVVNfNV9UWDoKLQljYXNlIFNMSU1CVVNfNl9SWDoKLQljYXNlIFNMSU1CVVNfNl9UWDoKLQljYXNlIFNMSU1CVVNfN19SWDoKLQljYXNlIFNMSU1CVVNfN19UWDoKLQljYXNlIFNMSU1CVVNfOF9SWDoKLQljYXNlIFNMSU1CVVNfOF9UWDoKLQljYXNlIElOVF9CVF9TQ09fUlg6Ci0JY2FzZSBJTlRfQlRfU0NPX1RYOgotCWNhc2UgSU5UX0JUX0EyRFBfUlg6Ci0JY2FzZSBJTlRfRk1fUlg6Ci0JY2FzZSBJTlRfRk1fVFg6Ci0JY2FzZSBSVF9QUk9YWV9QT1JUXzAwMV9SWDoKLQljYXNlIFJUX1BST1hZX1BPUlRfMDAxX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9NSTJTX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NQRElGX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfTUkyU19SWF9TRDE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF8xOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfMzoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF80OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWF81OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFhfNjoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWF83OgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfMToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzE6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF8yOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfMjoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzM6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF8zOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzQ6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWF81OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFhfNToKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYXzY6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWF82OgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlhfNzoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYXzc6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRU5BUllfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1VTQl9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDBfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDFfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDRfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19SWDoKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDZfTUkyU19UWDoKLQl7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmNvcmUuYyBiL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgwNjAwNC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZjb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL2Fwci5oPgotI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL2F1ZGlvX2NhbF91dGlscy5oPgotI2luY2x1ZGUgPHNvdW5kL2Fkc3BfZXJyLmg+Ci0jaW5jbHVkZSA8c291bmQvYXByX2F1ZGlvLXYyLmg+Ci0KLSNkZWZpbmUgVElNRU9VVF9NUyAxMDAwCi0vKgotICogQVZTIGJyaW5nIHVwIGluIHRoZSBtb2RlbSBpcyBvcHRpbWl0aXplZCBmb3IgdGhlIG5ldwotICogU3ViIFN5c3RlbSBSZXN0YXJ0IGRlc2lnbiBhbmQgMTAwIG1pbGxpc2Vjb25kcyB0aW1lb3V0Ci0gKiBpcyBzdWZmaWNpZW50IHRvIG1ha2Ugc3VyZSB0aGUgUTYgd2lsbCBiZSByZWFkeS4KLSAqLwotI2RlZmluZSBRNl9SRUFEWV9USU1FT1VUX01TIDEwMAotCi1lbnVtIHsKLQlNRVRBX0NBTCwKLQlDVVNUX1RPUF9DQUwsCi0JQ09SRV9NQVhfQ0FMCi19OwotCi1lbnVtIHZlcl9xdWVyeV9zdGF0dXMgewotCVZFUl9RVUVSWV9VTkFUVEVNUFRFRCwKLQlWRVJfUVVFUllfVU5TVVBQT1JURUQsCi0JVkVSX1FVRVJZX1NVUFBPUlRFRAotfTsKLQotc3RydWN0IHE2Y29yZV9hdmNzX3Zlcl9pbmZvIHsKLQllbnVtIHZlcl9xdWVyeV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhdmNzX2Z3a192ZXJfaW5mbyB2ZXJfaW5mbzsKLX07Ci0KLXN0cnVjdCBxNmNvcmVfc3RyIHsKLQlzdHJ1Y3QgYXByX3N2YyAqY29yZV9oYW5kbGVfcTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBidXNfYndfcmVxX3dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgY21kX3JlcV93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGF2Y3NfZndrX3Zlcl9yZXFfd2FpdDsKLQl1MzIgYnVzX2J3X3Jlc3BfcmVjZWl2ZWQ7Ci0JZW51bSBjbWRfZmxhZ3MgewotCQlGTEFHX05PTkUsCi0JCUZMQUdfQ01EUlNQX0xJQ0VOU0VfUkVTVUxUCi0JfSBjbWRfcmVzcF9yZWNlaXZlZF9mbGFnOwotCXUzMiBhdmNzX2Z3a192ZXJfcmVzcF9yZWNlaXZlZDsKLQlzdHJ1Y3QgbXV0ZXggY21kX2xvY2s7Ci0Jc3RydWN0IG11dGV4IHZlcl9sb2NrOwotCXVuaW9uIHsKLQkJc3RydWN0IGF2Y3NfY21kcnNwX2dldF9saWNlbnNlX3ZhbGlkYXRpb25fcmVzdWx0Ci0JCQkJCQljbWRyc3BfbGljZW5zZV9yZXN1bHQ7Ci0JfSBjbWRfcmVzcF9wYXlsb2FkOwotCXUzMiBwYXJhbTsKLQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbQ09SRV9NQVhfQ0FMXTsKLQl1aW50MzJfdCBtZW1fbWFwX2NhbF9oYW5kbGU7Ci0JaW50MzJfdCBhZHNwX3N0YXR1czsKLQlzdHJ1Y3QgcTZjb3JlX2F2Y3NfdmVyX2luZm8gcTZjb3JlX2F2Y3NfdmVyX2luZm87Ci19OwotCi1zdGF0aWMgc3RydWN0IHE2Y29yZV9zdHIgcTZjb3JlX2xjbDsKLQotc3RydWN0IGdlbmVyaWNfZ2V0X2RhdGFfIHsKLQlpbnQgdmFsaWQ7Ci0JaW50IHNpemVfaW5faW50czsKLQlpbnQgaW50c1tdOwotfTsKLXN0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19nZXRfZGF0YV8gKmdlbmVyaWNfZ2V0X2RhdGE7Ci0KLXN0YXRpYyBpbnQgcGFyc2VfZndrX3ZlcnNpb25faW5mbyh1aW50MzJfdCAqcGF5bG9hZCkKLXsKLQlzaXplX3QgZndrX3Zlcl9zaXplOwotCXNpemVfdCBzdmNfc2l6ZTsKLQlpbnQgbnVtX3NlcnZpY2VzOwotCWludCByZXQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBQYXlsb2FkIGluZm8gbnVtIHNlcnZpY2VzICVkXG4iLAotCQkgX19mdW5jX18sIHBheWxvYWRbNF0pOwotCS8qCi0JICogcGF5bG9hZDFbNF0gaXMgdGhlIG51bWJlciBvZiBzZXJ2aWNlcyBydW5uaW5nIG9uIERTUAotCSAqIEJhc2VkIG9uIHRoaXMgaW5mbywgd2UgY29weSB0aGUgcGF5bG9hZCBpbnRvIGNvcmUKLQkgKiBhdmNzIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUuCi0JICovCi0JbnVtX3NlcnZpY2VzID0gcGF5bG9hZFs0XTsKLQlxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLnZlcl9pbmZvLmF2Y3NfZndrX3ZlcnNpb24uCi0JCQludW1fc2VydmljZXMgPSBudW1fc2VydmljZXM7Ci0JaWYgKG51bV9zZXJ2aWNlcyA+IFZTU19NQVhfQVZDU19OVU1fU0VSVklDRVMpIHsKLQkJcHJfZXJyKCIlczogbnVtX3NlcnZpY2VzOiAlZCBncmVhdGVyIHRoYW4gbWF4IHNlcnZpY2VzOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBudW1fc2VydmljZXMsIFZTU19NQVhfQVZDU19OVU1fU0VSVklDRVMpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWZ3a192ZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZjc19nZXRfZndrX3ZlcnNpb24pOwotCXN2Y19zaXplID0gbnVtX3NlcnZpY2VzICogc2l6ZW9mKHN0cnVjdCBhdnNfc3ZjX2FwaV9pbmZvKTsKLQkvKgotCSAqIER5bmFtaWNhbGx5IGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsCi0JICogdGhlIHNlcnZpY2VzIGJhc2VkIG9uIG51bV9zZXJ2aWNlcwotCSAqLwotCXE2Y29yZV9sY2wucTZjb3JlX2F2Y3NfdmVyX2luZm8udmVyX2luZm8uc2VydmljZXMgPSBOVUxMOwotCXE2Y29yZV9sY2wucTZjb3JlX2F2Y3NfdmVyX2luZm8udmVyX2luZm8uc2VydmljZXMgPQotCQkJCWt6YWxsb2Moc3ZjX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmIChxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLnZlcl9pbmZvLnNlcnZpY2VzID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQkvKgotCSAqIG1lbWNweSBpcyBkb25lIHR3aWNlIGJlY2F1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yCi0JICogcTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby52ZXJfaW5mbyBpcyBub3QKLQkgKiBjb250aWd1b3VzLgotCSAqLwotCW1lbWNweSgmcTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby52ZXJfaW5mbywKLQkgICAgICAgKHVpbnQ4X3QgKilwYXlsb2FkLCBmd2tfdmVyX3NpemUpOwotCW1lbWNweShxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLnZlcl9pbmZvLnNlcnZpY2VzLAotCSAgICAgICAodWludDhfdCAqKSZwYXlsb2FkW3NpemVvZihzdHJ1Y3QgYXZjc19nZXRfZndrX3ZlcnNpb24pLwotCQkJCSAgIHNpemVvZih1aW50MzJfdCldLCBzdmNfc2l6ZSk7Ci0JcmV0ID0gMDsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludDMyX3QgYXBydjJfY29yZV9mbl9xKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgKnBheWxvYWQxOwotCWludCByZXQgPSAwOwotCi0JaWYgKGRhdGEgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBkYXRhIGFyZ3VtZW50IGlzIG51bGxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjb3JlIG1zZzogcGF5bG9hZCBsZW4gPSAldSwgYXByIHJlc3Agb3Bjb2RlID0gMHgleFxuIiwKLQkJX19mdW5jX18sCi0JCWRhdGEtPnBheWxvYWRfc2l6ZSwgZGF0YS0+b3Bjb2RlKTsKLQotCXN3aXRjaCAoZGF0YS0+b3Bjb2RlKSB7Ci0KLQljYXNlIEFQUl9CQVNJQ19SU1BfUkVTVUxUOnsKLQotCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplID09IDApIHsKLQkJCXByX2VycigiJXM6IEFQUl9CQVNJQ19SU1BfUkVTVUxUIE5vIFBheWxvYWQgIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwYXlsb2FkMSA9IGRhdGEtPnBheWxvYWQ7Ci0KLQkJc3dpdGNoIChwYXlsb2FkMVswXSkgewotCi0JCWNhc2UgQVZDU19DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOgotCQkJcHJfZGVidWcoIiVzOiBDbWQgPSBBVkNTX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlMgc3RhdHVzWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkMVsxXSk7Ci0JCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMTsKLQkJCXdha2VfdXAoJnE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0KTsKLQkJCWJyZWFrOwotCQljYXNlIEFWQ1NfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6Ci0JCQlwcl9kZWJ1ZygiJXM6IENtZCA9IEFWQ1NfQ01EX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlMgc3RhdHVzWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkMVsxXSk7Ci0JCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMTsKLQkJCXdha2VfdXAoJnE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0KTsKLQkJCWJyZWFrOwotCQljYXNlIEFWQ1NfQ01EX1JFR0lTVEVSX1RPUE9MT0dJRVM6Ci0JCQlwcl9kZWJ1ZygiJXM6IENtZCA9IEFWQ1NfQ01EX1JFR0lTVEVSX1RPUE9MT0dJRVMgc3RhdHVzWzB4JXhdXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkMVsxXSk7Ci0JCQkvKiAtQURTUCBzdGF0dXMgdG8gbWF0Y2ggTGludXggZXJyb3Igc3RhbmRhcmQgKi8KLQkJCXE2Y29yZV9sY2wuYWRzcF9zdGF0dXMgPSAtcGF5bG9hZDFbMV07Ci0JCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMTsKLQkJCXdha2VfdXAoJnE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0KTsKLQkJCWJyZWFrOwotCQljYXNlIEFWQ1NfQ01EX0RFUkVHSVNURVJfVE9QT0xPR0lFUzoKLQkJCXByX2RlYnVnKCIlczogQ21kID0gQVZDU19DTURfREVSRUdJU1RFUl9UT1BPTE9HSUVTIHN0YXR1c1sweCV4XVxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMV0pOwotCQkJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDE7Ci0JCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBBVkNTX0NNRF9HRVRfRldLX1ZFUlNJT046Ci0JCQlwcl9kZWJ1ZygiJXM6IENtZCA9IEFWQ1NfQ01EX0dFVF9GV0tfVkVSU0lPTiBzdGF0dXNbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cihwYXlsb2FkMVsxXSkpOwotCQkJLyogQURTUCBzdGF0dXMgdG8gbWF0Y2ggTGludXggZXJyb3Igc3RhbmRhcmQgKi8KLQkJCXE2Y29yZV9sY2wuYWRzcF9zdGF0dXMgPSAtcGF5bG9hZDFbMV07Ci0JCQlpZiAocGF5bG9hZDFbMV0gPT0gQURTUF9FVU5TVVBQT1JURUQpCi0JCQkJcTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby5zdGF0dXMgPQotCQkJCQlWRVJfUVVFUllfVU5TVVBQT1JURUQ7Ci0JCQlxNmNvcmVfbGNsLmF2Y3NfZndrX3Zlcl9yZXNwX3JlY2VpdmVkID0gMTsKLQkJCXdha2VfdXAoJnE2Y29yZV9sY2wuYXZjc19md2tfdmVyX3JlcV93YWl0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogSW52YWxpZCBjbWQgcnNwWzB4JXhdWzB4JXhdIG9wY29kZSAlZFxuIiwKLQkJCQkJX19mdW5jX18sCi0JCQkJCXBheWxvYWQxWzBdLCBwYXlsb2FkMVsxXSwgZGF0YS0+b3Bjb2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUkVTRVRfRVZFTlRTOnsKLQkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCByZWNlaXZlZCBpbiBDb3JlIHNlcnZpY2VcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCS8qIG5vIHJlc2V0IGRvbmUgYXMgdGhlIGRhdGEgd2lsbCBub3QgY2hhbmdlIGFmdGVyIFNTUiovCi0JCXE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQljYXNlIEFWQ1NfQ01EUlNQX1NIQVJFRF9NRU1fTUFQX1JFR0lPTlM6Ci0JCXBheWxvYWQxID0gZGF0YS0+cGF5bG9hZDsKLQkJcHJfZGVidWcoIiVzOiBBVkNTX0NNRFJTUF9TSEFSRURfTUVNX01BUF9SRUdJT05TIGhhbmRsZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwYXlsb2FkMVswXSk7Ci0JCXE2Y29yZV9sY2wubWVtX21hcF9jYWxfaGFuZGxlID0gcGF5bG9hZDFbMF07Ci0JCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAxOwotCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7Ci0JCWJyZWFrOwotCWNhc2UgQVZDU19DTURSU1BfQURTUF9FVkVOVF9HRVRfU1RBVEU6Ci0JCXBheWxvYWQxID0gZGF0YS0+cGF5bG9hZDsKLQkJcTZjb3JlX2xjbC5wYXJhbSA9IHBheWxvYWQxWzBdOwotCQlwcl9kZWJ1ZygiJXM6IFJlY2VpdmVkIEFEU1AgZ2V0IHN0YXRlIHJlc3BvbnNlIDB4JXhcbiIsCi0JCQkgX19mdW5jX18sIHE2Y29yZV9sY2wucGFyYW0pOwotCQkvKiBlbnN1cmUgLnBhcmFtIGlzIHVwZGF0ZWQgcHJpb3IgdG8gLmJ1c19id19yZXNwX3JlY2VpdmVkICovCi0JCXdtYigpOwotCQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMTsKLQkJd2FrZV91cCgmcTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQpOwotCQlicmVhazsKLQljYXNlIEFWQ1NfQ01EUlNQX0dFVF9MSUNFTlNFX1ZBTElEQVRJT05fUkVTVUxUOgotCQlwYXlsb2FkMSA9IGRhdGEtPnBheWxvYWQ7Ci0JCXByX2RlYnVnKCIlczogY21kID0gTElDRU5TRV9WQUxJREFUSU9OX1JFU1VMVCwgcmVzdWx0ID0gMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcGF5bG9hZDFbMF0pOwotCQlxNmNvcmVfbGNsLmNtZF9yZXNwX3BheWxvYWQuY21kcnNwX2xpY2Vuc2VfcmVzdWx0LnJlc3VsdAotCQkJCQkJCQk9IHBheWxvYWQxWzBdOwotCQlxNmNvcmVfbGNsLmNtZF9yZXNwX3JlY2VpdmVkX2ZsYWcgPSBGTEFHX0NNRFJTUF9MSUNFTlNFX1JFU1VMVDsKLQkJd2FrZV91cCgmcTZjb3JlX2xjbC5jbWRfcmVxX3dhaXQpOwotCQlicmVhazsKLQljYXNlIEFWQ1NfQ01EUlNQX0dFVF9GV0tfVkVSU0lPTjoKLQkJcHJfZGVidWcoIiVzOiBSZWNlaXZlZCBBVkNTX0NNRFJTUF9HRVRfRldLX1ZFUlNJT05cbiIsCi0JCQkgX19mdW5jX18pOwotCQlwYXlsb2FkMSA9IGRhdGEtPnBheWxvYWQ7Ci0JCXE2Y29yZV9sY2wucTZjb3JlX2F2Y3NfdmVyX2luZm8uc3RhdHVzID0gVkVSX1FVRVJZX1NVUFBPUlRFRDsKLQkJcTZjb3JlX2xjbC5hdmNzX2Z3a192ZXJfcmVzcF9yZWNlaXZlZCA9IDE7Ci0JCXJldCA9IHBhcnNlX2Z3a192ZXJzaW9uX2luZm8ocGF5bG9hZDEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBwYXJzZSBwYXlsb2FkOiVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmF2Y3NfZndrX3Zlcl9yZXFfd2FpdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IE1lc3NhZ2UgaWQgZnJvbSBhZHNwIGNvcmUgc3ZjOiAweCV4XG4iLAotCQkJX19mdW5jX18sIGRhdGEtPm9wY29kZSk7Ci0JCWlmIChnZW5lcmljX2dldF9kYXRhKSB7Ci0JCQlnZW5lcmljX2dldF9kYXRhLT52YWxpZCA9IDE7Ci0JCQlnZW5lcmljX2dldF9kYXRhLT5zaXplX2luX2ludHMgPQotCQkJCWRhdGEtPnBheWxvYWRfc2l6ZS9zaXplb2YoaW50KTsKLQkJCXByX2RlYnVnKCJjYWxsYmFjayBzaXplID0gJWlcbiIsCi0JCQkJIGRhdGEtPnBheWxvYWRfc2l6ZSk7Ci0JCQltZW1jcHkoZ2VuZXJpY19nZXRfZGF0YS0+aW50cywgZGF0YS0+cGF5bG9hZCwKLQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCQkJcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9IDE7Ci0JCQl3YWtlX3VwKCZxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBvY21fY29yZV9vcGVuKHZvaWQpCi17Ci0JaWYgKHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSA9PSBOVUxMKQotCQlxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQ09SRSIsCi0JCQkJCWFwcnYyX2NvcmVfZm5fcSwgMHhGRkZGRkZGRiwgTlVMTCk7Ci0JcHJfZGVidWcoIiVzOiBPcGVuX3EgJXBLXG4iLCBfX2Z1bmNfXywgcTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xKTsKLQlpZiAocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xID09IE5VTEwpCi0JCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBDT1JFXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX3V0aWxzX2dldF9jYWxfYmxvY2tfYnlfa2V5KAotCQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX3R5cGUsIHVpbnQzMl90IGtleSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICAgICpwdHIsICpuZXh0OwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAgICAgICAgICAgKmNhbF9ibG9jayA9IE5VTEw7Ci0Jc3RydWN0IGF1ZGlvX2NhbF9pbmZvX21ldGFpbmZvICAqbWV0YWluZm87Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocHRyLCBuZXh0LAotCQkmY2FsX3R5cGUtPmNhbF9ibG9ja3MpIHsKLQotCQljYWxfYmxvY2sgPSBsaXN0X2VudHJ5KHB0ciwKLQkJCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSwgbGlzdCk7Ci0JCW1ldGFpbmZvID0gKHN0cnVjdCBhdWRpb19jYWxfaW5mb19tZXRhaW5mbyAqKQotCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbzsKLQkJaWYgKG1ldGFpbmZvLT5uS2V5ICE9IGtleSkgewotCQkJcHJfZGVidWcoIiVzOiBtZXRhaW5mbyBrZXkgbWlzbWF0Y2ghISEgZm91bmQ6JXgsIG5lZWRlZDoleFxuIiwKLQkJCQlfX2Z1bmNfXywgbWV0YWluZm8tPm5LZXksIGtleSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IG1ldGFpbmZvIGtleSBtYXRjaCBmb3VuZCIsIF9fZnVuY19fKTsKLQkJCXJldHVybiBjYWxfYmxvY2s7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcTZjb3JlX3NlbmRfZ2V0X2F2Y3NfZndrX3Zlcl9jbWQodm9pZCkKLXsKLQlzdHJ1Y3QgYXByX2hkciBhdmNzX3Zlcl9jbWQ7Ci0JaW50IHJldDsKLQotCWF2Y3NfdmVyX2NtZC5oZHJfZmllbGQgPQotCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELCBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJICAgICAgQVBSX1BLVF9WRVIpOwotCWF2Y3NfdmVyX2NtZC5wa3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXByX2hkcik7Ci0JYXZjc192ZXJfY21kLnNyY19wb3J0ID0gMDsKLQlhdmNzX3Zlcl9jbWQuZGVzdF9wb3J0ID0gMDsKLQlhdmNzX3Zlcl9jbWQudG9rZW4gPSAwOwotCWF2Y3NfdmVyX2NtZC5vcGNvZGUgPSBBVkNTX0NNRF9HRVRfRldLX1ZFUlNJT047Ci0KLQlxNmNvcmVfbGNsLmFkc3Bfc3RhdHVzID0gMDsKLQlxNmNvcmVfbGNsLmF2Y3NfZndrX3Zlcl9yZXNwX3JlY2VpdmVkID0gMDsKLQotCXJldCA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsCi0JCQkgICAodWludDMyX3QgKikgJmF2Y3NfdmVyX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNlbmQgYXByIHBhY2tldCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5hdmNzX2Z3a192ZXJfcmVxX3dhaXQsCi0JCQkJIChxNmNvcmVfbGNsLmF2Y3NfZndrX3Zlcl9yZXNwX3JlY2VpdmVkID09IDEpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgZm9yIEFWQ1MgZndrIHZlcnNpb24gaW5mb1xuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChxNmNvcmVfbGNsLmFkc3Bfc3RhdHVzIDwgMCkgewotCQkvKgotCQkgKiBhZHNwX2Vycl9nZXRfZXJyX3N0ciBleHBlY3RzIGEgcG9zaXRpdmUgdmFsdWUgYnV0IHdlIHN0b3JlCi0JCSAqIHRoZSBEU1AgZXJyb3IgYXMgbmVnYXRpdmUgdG8gbWF0Y2ggdGhlIExpbnV4IGVycm9yIHN0YW5kYXJkLgotCQkgKiBQYXNzIGluIHRoZSBuZWdhdGVkIHZhbHVlIHNvIGFkc3BfZXJyX2dldF9lcnJfc3RyIHJldHVybnMKLQkJICogdGhlIGNvcnJlY3Qgc3RyaW5nLgotCQkgKi8KLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwgX19mdW5jX18sCi0JCSAgICAgICBhZHNwX2Vycl9nZXRfZXJyX3N0cigtcTZjb3JlX2xjbC5hZHNwX3N0YXR1cykpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKHE2Y29yZV9sY2wuYWRzcF9zdGF0dXMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gMDsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcTZjb3JlX2dldF9zZXJ2aWNlX3ZlcnNpb24odWludDMyX3Qgc2VydmljZV9pZCwKLQkJCSAgICAgICBzdHJ1Y3QgYXZjc19md2tfdmVyX2luZm8gKnZlcl9pbmZvLAotCQkJICAgICAgIHNpemVfdCBzaXplKQotewotCWludCBpOwotCXVpbnQzMl90IG51bV9zZXJ2aWNlczsKLQlzaXplX3Qgc3ZjX3NpemU7Ci0KLQlzdmNfc2l6ZSA9IHE2Y29yZV9nZXRfYXZjc19zZXJ2aWNlX3NpemUoc2VydmljZV9pZCk7Ci0JaWYgKHN2Y19zaXplICE9IHNpemUpIHsKLQkJcHJfZXJyKCIlczogRXhwZWN0ZWQgc2l6ZTogJXp1LCBQcm92aWRlZCBzaXplOiAlenUiLAotCQkgICAgICAgX19mdW5jX18sIHN2Y19zaXplLCBzaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbnVtX3NlcnZpY2VzID0KLQkJcTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby52ZXJfaW5mby4KLQkJYXZjc19md2tfdmVyc2lvbi5udW1fc2VydmljZXM7Ci0KLQlpZiAodmVyX2luZm8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBOVUxMIHBhcmFtZXRlciB2ZXJfaW5mb1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltZW1jcHkodmVyX2luZm8sICZxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLgotCSAgICAgICB2ZXJfaW5mby5hdmNzX2Z3a192ZXJzaW9uLCBzaXplb2Yoc3RydWN0IGF2Y3NfZ2V0X2Z3a192ZXJzaW9uKSk7Ci0KLQlpZiAoc2VydmljZV9pZCA9PSBBVkNTX1NFUlZJQ0VfSURfQUxMKSB7Ci0JCW1lbWNweSgmdmVyX2luZm8tPnNlcnZpY2VzWzBdLCAmcTZjb3JlX2xjbC4KLQkJICAgICAgIHE2Y29yZV9hdmNzX3Zlcl9pbmZvLnZlcl9pbmZvLnNlcnZpY2VzWzBdLAotCQkgICAgICAgKG51bV9zZXJ2aWNlcyAqIHNpemVvZihzdHJ1Y3QgYXZzX3N2Y19hcGlfaW5mbykpKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlcnZpY2VzOyBpKyspIHsKLQkJCWlmIChxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLgotCQkJICAgIHZlcl9pbmZvLnNlcnZpY2VzW2ldLnNlcnZpY2VfaWQgPT0gc2VydmljZV9pZCkgewotCQkJCW1lbWNweSgmdmVyX2luZm8tPnNlcnZpY2VzWzBdLAotCQkJCSAgICAgICAmcTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby4KLQkJCQkgICAgICAgdmVyX2luZm8uc2VydmljZXNbaV0sIHNpemUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHE2Y29yZV9nZXRfc2VydmljZV92ZXJzaW9uKTsKLQotc2l6ZV90IHE2Y29yZV9nZXRfYXZjc19zZXJ2aWNlX3NpemUodWludDMyX3Qgc2VydmljZV9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1aW50MzJfdCBudW1fc2VydmljZXM7Ci0KLQludW1fc2VydmljZXMgPQotCQlxNmNvcmVfbGNsLnE2Y29yZV9hdmNzX3Zlcl9pbmZvLnZlcl9pbmZvLgotCQlhdmNzX2Z3a192ZXJzaW9uLm51bV9zZXJ2aWNlczsKLQotCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLnZlcl9sb2NrKSk7Ci0JcHJfZGVidWcoIiVzOiBxNmNvcmVfYXZjc192ZXJfaW5mby5zdGF0dXMoJWQpXG4iLCBfX2Z1bmNfXywKLQkJIHE2Y29yZV9sY2wucTZjb3JlX2F2Y3NfdmVyX2luZm8uc3RhdHVzKTsKLQotCXN3aXRjaCAocTZjb3JlX2xjbC5xNmNvcmVfYXZjc192ZXJfaW5mby5zdGF0dXMpIHsKLQljYXNlIFZFUl9RVUVSWV9TVVBQT1JURUQ6Ci0JCXByX2RlYnVnKCIlczogQVZDUyBGV0sgdmVyc2lvbiBxdWVyeSBhbHJlYWR5IGF0dGVtcHRlZFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldCA9IG51bV9zZXJ2aWNlcyAqIHNpemVvZihzdHJ1Y3QgYXZzX3N2Y19hcGlfaW5mbyk7Ci0JCWJyZWFrOwotCWNhc2UgVkVSX1FVRVJZX1VOU1VQUE9SVEVEOgotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0JY2FzZSBWRVJfUVVFUllfVU5BVFRFTVBURUQ6Ci0JCXByX2RlYnVnKCIlczogQXR0ZW1wdGluZyBBVkNTIEZXSyB2ZXJzaW9uIHF1ZXJ5XG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChxNmNvcmVfaXNfYWRzcF9yZWFkeSgpKSB7Ci0JCQlyZXQgPSBxNmNvcmVfc2VuZF9nZXRfYXZjc19md2tfdmVyX2NtZCgpOwotCQkJaWYgKHJldCA9PSAwKQotCQkJCXJldCA9IG51bV9zZXJ2aWNlcyAqCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhdnNfc3ZjX2FwaV9pbmZvKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEFEU1AgaXMgbm90IHJlYWR5IHRvIHF1ZXJ5IHZlcnNpb25cbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotCQkJcmV0ID0gLUVOT0RFVjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHZlcnNpb24gcXVlcnkgc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIHE2Y29yZV9sY2wucTZjb3JlX2F2Y3NfdmVyX2luZm8uc3RhdHVzKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wudmVyX2xvY2spKTsKLQotCWlmIChzZXJ2aWNlX2lkICE9IEFWQ1NfU0VSVklDRV9JRF9BTEwpCi0JCXJldHVybiBzaXplb2Yoc3RydWN0IGF2c19zdmNfYXBpX2luZm8pOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wocTZjb3JlX2dldF9hdmNzX3NlcnZpY2Vfc2l6ZSk7Ci0KLWludDMyX3QgY29yZV9zZXRfbGljZW5zZSh1aW50MzJfdCBrZXksIHVpbnQzMl90IG1vZHVsZV9pZCkKLXsKLQlzdHJ1Y3QgYXZjc19jbWRfc2V0X2xpY2Vuc2UgKmNtZF9zZXRsID0gTlVMTDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0JaW50IHJjID0gMCwgcGFja2V0X3NpemUgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBrZXk6MHgleCwgaWQ6MHgleFxuIiwgX19mdW5jX18sIGtleSwgbW9kdWxlX2lkKTsKLQotCW11dGV4X2xvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7Ci0JaWYgKHE2Y29yZV9sY2wuY2FsX2RhdGFbTUVUQV9DQUxdID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsX2RhdGEgbm90IGluaXRpYWxpemVkIHlldCEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBjbWRfdW5sb2NrOwotCX0KLQotCW11dGV4X2xvY2soJigocTZjb3JlX2xjbC5jYWxfZGF0YVtNRVRBX0NBTF0pLT5sb2NrKSk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9jYWxfYmxvY2tfYnlfa2V5KAotCQkJCXE2Y29yZV9sY2wuY2FsX2RhdGFbTUVUQV9DQUxdLCBrZXkpOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCB8fAotCQljYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkciA9PSBOVUxMIHx8Ci0JCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSA8PSAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgY2FsIGJsb2NrIHRvIHNlbmQiLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBjYWxfZGF0YV91bmxvY2s7Ci0JfQotCi0JcGFja2V0X3NpemUgPSBzaXplb2Yoc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlKSArCi0JCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZTsKLQkvKnJvdW5kIHVwIHRvdGFsIHBhY2tldF9zaXplIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5Ki8KLQlwYWNrZXRfc2l6ZSA9ICgocGFja2V0X3NpemUgKyAweDMpPj4yKTw8MjsKLQotCWNtZF9zZXRsID0ga3phbGxvYyhwYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNtZF9zZXRsID09IE5VTEwpIHsKLQkJcmMgID0gLUVOT01FTTsKLQkJZ290byBjYWxfZGF0YV91bmxvY2s7Ci0JfQotCi0Jb2NtX2NvcmVfb3BlbigpOwotCWlmIChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBhcHIgcmVnaXN0cmF0aW9uIGZvciBDT1JFIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyYyAgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCWNtZF9zZXRsLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfRVZFTlQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWNtZF9zZXRsLT5oZHIucGt0X3NpemUgPSBwYWNrZXRfc2l6ZTsKLQljbWRfc2V0bC0+aGRyLnNyY19wb3J0ID0gMDsKLQljbWRfc2V0bC0+aGRyLmRlc3RfcG9ydCA9IDA7Ci0JY21kX3NldGwtPmhkci50b2tlbiA9IDA7Ci0JY21kX3NldGwtPmhkci5vcGNvZGUgPSBBVkNTX0NNRF9TRVRfTElDRU5TRTsKLQljbWRfc2V0bC0+aWQgPSBtb2R1bGVfaWQ7Ci0JY21kX3NldGwtPm92ZXJ3cml0ZSA9IDE7Ci0JY21kX3NldGwtPnNpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0JbWVtY3B5KCh1aW50OF90ICopY21kX3NldGwgKyBzaXplb2Yoc3RydWN0IGF2Y3NfY21kX3NldF9saWNlbnNlKSwKLQkJY2FsX2Jsb2NrLT5jYWxfZGF0YS5rdmFkZHIsCi0JCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7Ci0JcHJfaW5mbygiJXM6IFNldCBsaWNlbnNlIG9wY29kZT0weCV4LCBpZCA9MHgleCwgc2l6ZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIGNtZF9zZXRsLT5oZHIub3Bjb2RlLAotCQkJY21kX3NldGwtPmlkLCBjbWRfc2V0bC0+c2l6ZSk7Ci0JcmMgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKiljbWRfc2V0bCk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJfZXJyKCIlczogU0VUX0xJQ0VOU0UgZmFpbGVkIG9wWzB4JXhdcmNbJWRdXG4iLAotCQkJCQlfX2Z1bmNfXywgY21kX3NldGwtPmhkci5vcGNvZGUsIHJjKTsKLQotZmFpbF9jbWQ6Ci0Ja2ZyZWUoY21kX3NldGwpOwotY2FsX2RhdGFfdW5sb2NrOgotCW11dGV4X3VubG9jaygmKChxNmNvcmVfbGNsLmNhbF9kYXRhW01FVEFfQ0FMXSktPmxvY2spKTsKLWNtZF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOwotCi0JcmV0dXJuIHJjOwotfQotCi1pbnQzMl90IGNvcmVfZ2V0X2xpY2Vuc2Vfc3RhdHVzKHVpbnQzMl90IG1vZHVsZV9pZCkKLXsKLQlzdHJ1Y3QgYXZjc19jbWRfZ2V0X2xpY2Vuc2VfdmFsaWRhdGlvbl9yZXN1bHQgZ2V0X2x2cl9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1vZHVsZV9pZCAweCV4IiwgX19mdW5jX18sIG1vZHVsZV9pZCk7Ci0KLQltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOwotCW9jbV9jb3JlX29wZW4oKTsKLQlpZiAocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogYXByIHJlZ2lzdHJhdGlvbiBmb3IgQ09SRSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ICA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbF9jbWQ7Ci0JfQotCi0JZ2V0X2x2cl9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWdldF9sdnJfY21kLmhkci5wa3Rfc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYXZjc19jbWRfZ2V0X2xpY2Vuc2VfdmFsaWRhdGlvbl9yZXN1bHQpOwotCi0JZ2V0X2x2cl9jbWQuaGRyLnNyY19wb3J0ID0gMDsKLQlnZXRfbHZyX2NtZC5oZHIuZGVzdF9wb3J0ID0gMDsKLQlnZXRfbHZyX2NtZC5oZHIudG9rZW4gPSAwOwotCWdldF9sdnJfY21kLmhkci5vcGNvZGUgPSBBVkNTX0NNRF9HRVRfTElDRU5TRV9WQUxJREFUSU9OX1JFU1VMVDsKLQlnZXRfbHZyX2NtZC5pZCA9IG1vZHVsZV9pZDsKLQotCi0JcmV0ID0gYXByX3NlbmRfcGt0KHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSwgKHVpbnQzMl90ICopICZnZXRfbHZyX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogbGljZW5zZV92YWxpZGF0aW9uIHJlcXVlc3QgZmFpbGVkLCBlcnIgJWRcbiIsCi0JCQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FUkVNT1RFOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQotCXE2Y29yZV9sY2wuY21kX3Jlc3BfcmVjZWl2ZWRfZmxhZyAmPSB+KEZMQUdfQ01EUlNQX0xJQ0VOU0VfUkVTVUxUKTsKLQltdXRleF91bmxvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuY21kX3JlcV93YWl0LAotCQkJKHE2Y29yZV9sY2wuY21kX3Jlc3BfcmVjZWl2ZWRfZmxhZyA9PQotCQkJCUZMQUdfQ01EUlNQX0xJQ0VOU0VfUkVTVUxUKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCBmb3IgQ01EUlNQX0xJQ0VOU0VfUkVTVUxUXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FOwotCQlnb3RvIGZhaWxfY21kOwotCX0KLQlxNmNvcmVfbGNsLmNtZF9yZXNwX3JlY2VpdmVkX2ZsYWcgJj0gfihGTEFHX0NNRFJTUF9MSUNFTlNFX1JFU1VMVCk7Ci0JcmV0ID0gcTZjb3JlX2xjbC5jbWRfcmVzcF9wYXlsb2FkLmNtZHJzcF9saWNlbnNlX3Jlc3VsdC5yZXN1bHQ7Ci0KLWZhaWxfY21kOgotCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKLQlwcl9pbmZvKCIlczogY21kcnNwX2xpY2Vuc2VfcmVzdWx0LnJlc3VsdCA9IDB4JXggZm9yIG1vZHVsZSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCByZXQsIG1vZHVsZV9pZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotdWludDMyX3QgY29yZV9zZXRfZG9sYnlfbWFudWZhY3R1cmVyX2lkKGludCBtYW51ZmFjdHVyZXJfaWQpCi17Ci0Jc3RydWN0IGFkc3BfZG9sYnlfbWFudWZhY3R1cmVyX2lkIHBheWxvYWQ7Ci0JaW50IHJjID0gMDsKLQotCXByX2RlYnVnKCIlczogbWFudWZhY3R1cmVyX2lkIDolZFxuIiwgX19mdW5jX18sIG1hbnVmYWN0dXJlcl9pZCk7Ci0JbXV0ZXhfbG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKLQlvY21fY29yZV9vcGVuKCk7Ci0JaWYgKHE2Y29yZV9sY2wuY29yZV9oYW5kbGVfcSkgewotCQlwYXlsb2FkLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9FVkVOVCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQkJcGF5bG9hZC5oZHIucGt0X3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCBhZHNwX2RvbGJ5X21hbnVmYWN0dXJlcl9pZCk7Ci0JCXBheWxvYWQuaGRyLnNyY19wb3J0ID0gMDsKLQkJcGF5bG9hZC5oZHIuZGVzdF9wb3J0ID0gMDsKLQkJcGF5bG9hZC5oZHIudG9rZW4gPSAwOwotCQlwYXlsb2FkLmhkci5vcGNvZGUgPSBBRFNQX0NNRF9TRVRfRE9MQllfTUFOVUZBQ1RVUkVSX0lEOwotCQlwYXlsb2FkLm1hbnVmYWN0dXJlcl9pZCA9IG1hbnVmYWN0dXJlcl9pZDsKLQkJcHJfZGVidWcoIiVzOiBTZW5kIERvbGJ5IHNlY3VyaXR5IG9wY29kZT0weCV4IG1hbnVmYWN0dXJlciBJRCA9ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlwYXlsb2FkLmhkci5vcGNvZGUsIHBheWxvYWQubWFudWZhY3R1cmVyX2lkKTsKLQkJcmMgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLAotCQkJCQkJKHVpbnQzMl90ICopJnBheWxvYWQpOwotCQlpZiAocmMgPCAwKQotCQkJcHJfZXJyKCIlczogU0VUX0RPTEJZX01BTlVGQUNUVVJFUl9JRCBmYWlsZWQgb3BbMHgleF1yY1slZF1cbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWQuaGRyLm9wY29kZSwgcmMpOwotCX0KLQltdXRleF91bmxvY2soJihxNmNvcmVfbGNsLmNtZF9sb2NrKSk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIHE2Y29yZV9pc19hZHNwX3JlYWR5IC0gY2hlY2sgYWRzcCByZWFkeSBzdGF0dXMKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgYWRzcCBpcyByZWFkeSBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQotICovCi1ib29sIHE2Y29yZV9pc19hZHNwX3JlYWR5KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQlib29sIHJldCA9IGZhbHNlOwotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQltZW1zZXQoJmhkciwgMCwgc2l6ZW9mKGhkcikpOwotCWhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQloZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLCAwKTsKLQloZHIub3Bjb2RlID0gQVZDU19DTURfQURTUF9FVkVOVF9HRVRfU1RBVEU7Ci0KLQltdXRleF9sb2NrKCYocTZjb3JlX2xjbC5jbWRfbG9jaykpOwotCW9jbV9jb3JlX29wZW4oKTsKLQlpZiAocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xKSB7Ci0JCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAwOwotCQlyYyA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsICh1aW50MzJfdCAqKSZoZHIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBHZXQgQURTUCBzdGF0ZSBBUFIgcGFja2V0IHNlbmQgZXZlbnQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCi0JCXJjID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0LAotCQkJCQkocTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9PSAxKSwKLQkJCQkJbXNlY3NfdG9famlmZmllcyhRNl9SRUFEWV9USU1FT1VUX01TKSk7Ci0JCWlmIChyYyA+IDAgJiYgcTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCkgewotCQkJLyogZW5zdXJlIHRvIHJlYWQgdXBkYXRlZCBwYXJhbSBieSBjYWxsYmFjayB0aHJlYWQgKi8KLQkJCXJtYigpOwotCQkJcmV0ID0gISFxNmNvcmVfbGNsLnBhcmFtOwotCQl9Ci0JfQotYmFpbDoKLQlwcl9kZWJ1ZygiJXM6IGxlYXZlLCByYyAlZCwgYWRzcCByZWFkeSAlZFxuIiwgX19mdW5jX18sIHJjLCByZXQpOwotCW11dGV4X3VubG9jaygmKHE2Y29yZV9sY2wuY21kX2xvY2spKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChxNmNvcmVfaXNfYWRzcF9yZWFkeSk7Ci0KLXN0YXRpYyBpbnQgcTZjb3JlX21hcF9tZW1vcnlfcmVnaW9ucyhwaHlzX2FkZHJfdCAqYnVmX2FkZCwgdWludDMyX3QgbWVtcG9vbF9pZCwKLQkJCXVpbnQzMl90ICpidWZzeiwgdWludDMyX3QgYnVmY250LCB1aW50MzJfdCAqbWFwX2hhbmRsZSkKLXsKLQlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zICptbWFwX3JlZ2lvbnMgPSBOVUxMOwotCXN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqbXJlZ2lvbnMgPSBOVUxMOwotCXZvaWQgKm1tYXBfcmVnaW9uX2NtZCA9IE5VTEw7Ci0Jdm9pZCAqcGF5bG9hZCA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGkgPSAwOwotCWludCBjbWRfc2l6ZSA9IDA7Ci0KLQljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKQotCQkJKyBzaXplb2Yoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkKQotCQkJKiBidWZjbnQ7Ci0KLQltbWFwX3JlZ2lvbl9jbWQgPSBremFsbG9jKGNtZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAobW1hcF9yZWdpb25fY21kID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbW1hcF9yZWdpb25zID0gKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKiltbWFwX3JlZ2lvbl9jbWQ7Ci0JbW1hcF9yZWdpb25zLT5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltbWFwX3JlZ2lvbnMtPmhkci5wa3Rfc2l6ZSA9IGNtZF9zaXplOwotCW1tYXBfcmVnaW9ucy0+aGRyLnNyY19wb3J0ID0gMDsKLQltbWFwX3JlZ2lvbnMtPmhkci5kZXN0X3BvcnQgPSAwOwotCW1tYXBfcmVnaW9ucy0+aGRyLnRva2VuID0gMDsKLQltbWFwX3JlZ2lvbnMtPmhkci5vcGNvZGUgPSBBVkNTX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOwotCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0wgJiAweDAwZmY7Ci0JbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IGJ1ZmNudCAmIDB4MDBmZjsKLQltbWFwX3JlZ2lvbnMtPnByb3BlcnR5X2ZsYWcgPSAweDAwOwotCi0JcGF5bG9hZCA9ICgodTggKikgbW1hcF9yZWdpb25fY21kICsKLQkJCQlzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV9tYXBfcmVnaW9ucykpOwotCW1yZWdpb25zID0gKHN0cnVjdCBhdnNfc2hhcmVkX21hcF9yZWdpb25fcGF5bG9hZCAqKXBheWxvYWQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYnVmY250OyBpKyspIHsKLQkJbXJlZ2lvbnMtPnNobV9hZGRyX2xzdyA9IGxvd2VyXzMyX2JpdHMoYnVmX2FkZFtpXSk7Ci0JCW1yZWdpb25zLT5zaG1fYWRkcl9tc3cgPQotCQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGJ1Zl9hZGRbaV0pOwotCQltcmVnaW9ucy0+bWVtX3NpemVfYnl0ZXMgPSBidWZzeltpXTsKLQkJKyttcmVnaW9uczsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHNlbmRpbmcgbWVtb3J5IG1hcCwgYWRkciAlcEssIHNpemUgJWQsIGJ1ZmNudCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgYnVmX2FkZCwgYnVmc3pbMF0sIG1tYXBfcmVnaW9ucy0+bnVtX3JlZ2lvbnMpOwotCi0JKm1hcF9oYW5kbGUgPSAwOwotCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsICh1aW50MzJfdCAqKQotCQltbWFwX3JlZ2lvbnMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IG1tYXAgcmVnaW9ucyBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChxNmNvcmVfbGNsLmJ1c19id19yZXFfd2FpdCwKLQkJCQkocTZjb3JlX2xjbC5idXNfYndfcmVzcF9yZWNlaXZlZCA9PSAxKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB0aW1lb3V0LiB3YWl0ZWQgZm9yIG1lbW9yeSBtYXBcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JKm1hcF9oYW5kbGUgPSBxNmNvcmVfbGNsLm1lbV9tYXBfY2FsX2hhbmRsZTsKLWRvbmU6Ci0Ja2ZyZWUobW1hcF9yZWdpb25fY21kKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHE2Y29yZV9tZW1vcnlfdW5tYXBfcmVnaW9ucyh1aW50MzJfdCBtZW1fbWFwX2hhbmRsZSkKLXsKLQlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgdW5tYXBfcmVnaW9uczsKLQlpbnQgcmV0ID0gMDsKLQotCW1lbXNldCgmdW5tYXBfcmVnaW9ucywgMCwgc2l6ZW9mKHVubWFwX3JlZ2lvbnMpKTsKLQl1bm1hcF9yZWdpb25zLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JdW5tYXBfcmVnaW9ucy5oZHIucGt0X3NpemUgPSBzaXplb2YodW5tYXBfcmVnaW9ucyk7Ci0JdW5tYXBfcmVnaW9ucy5oZHIuc3JjX3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOwotCXVubWFwX3JlZ2lvbnMuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JdW5tYXBfcmVnaW9ucy5oZHIuc3JjX3BvcnQgPSAwOwotCXVubWFwX3JlZ2lvbnMuaGRyLmRlc3Rfc3ZjID0gQVBSX1NWQ19BRFNQX0NPUkU7Ci0JdW5tYXBfcmVnaW9ucy5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JdW5tYXBfcmVnaW9ucy5oZHIuZGVzdF9wb3J0ID0gMDsKLQl1bm1hcF9yZWdpb25zLmhkci50b2tlbiA9IDA7Ci0JdW5tYXBfcmVnaW9ucy5oZHIub3Bjb2RlID0gQVZDU19DTURfU0hBUkVEX01FTV9VTk1BUF9SRUdJT05TOwotCXVubWFwX3JlZ2lvbnMubWVtX21hcF9oYW5kbGUgPSBtZW1fbWFwX2hhbmRsZTsKLQotCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiB1bm1hcCByZWdpb25zIG1hcCBoYW5kbGUgJWRcbiIsCi0JCV9fZnVuY19fLCBtZW1fbWFwX2hhbmRsZSk7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKikKLQkJJnVubWFwX3JlZ2lvbnMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHVubWFwIHJlZ2lvbnMgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQsCi0JCQkJKHE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPT0gMSksCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogdGltZW91dC4gd2FpdGVkIGZvciBtZW1vcnlfdW5tYXBcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxNmNvcmVfZGVyZWdfYWxsX2N1c3RvbV90b3BvbG9naWVzKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGF2Y3NfY21kX2RlcmVnaXN0ZXJfdG9wb2xvZ2llcyBkZXJlZ190b3A7Ci0KLQltZW1zZXQoJmRlcmVnX3RvcCwgMCwgc2l6ZW9mKGRlcmVnX3RvcCkpOwotCWRlcmVnX3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWRlcmVnX3RvcC5oZHIucGt0X3NpemUgPSBzaXplb2YoZGVyZWdfdG9wKTsKLQlkZXJlZ190b3AuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FEU1BfQ09SRTsKLQlkZXJlZ190b3AuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JZGVyZWdfdG9wLmhkci5zcmNfcG9ydCA9IDA7Ci0JZGVyZWdfdG9wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOwotCWRlcmVnX3RvcC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JZGVyZWdfdG9wLmhkci5kZXN0X3BvcnQgPSAwOwotCWRlcmVnX3RvcC5oZHIudG9rZW4gPSAwOwotCWRlcmVnX3RvcC5oZHIub3Bjb2RlID0gQVZDU19DTURfREVSRUdJU1RFUl9UT1BPTE9HSUVTOwotCWRlcmVnX3RvcC5wYXlsb2FkX2FkZHJfbHN3ID0gMDsKLQlkZXJlZ190b3AucGF5bG9hZF9hZGRyX21zdyA9IDA7Ci0JZGVyZWdfdG9wLm1lbV9tYXBfaGFuZGxlID0gMDsKLQlkZXJlZ190b3AucGF5bG9hZF9zaXplID0gMDsKLQlkZXJlZ190b3AubW9kZSA9IEFWQ1NfTU9ERV9ERVJFR0lTVEVSX0FMTF9DVVNUT01fVE9QT0xPR0lFUzsKLQotCXE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPSAwOwotCi0JcHJfZGVidWcoIiVzOiBEZXJlZ2lzdGVyIHRvcG9sb2dpZXMgbW9kZSAlZFxuIiwKLQkJX19mdW5jX18sIGRlcmVnX3RvcC5tb2RlKTsKLQotCXJldCA9IGFwcl9zZW5kX3BrdChxNmNvcmVfbGNsLmNvcmVfaGFuZGxlX3EsICh1aW50MzJfdCAqKSAmZGVyZWdfdG9wKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBEZXJlZ2lzdGVyIHRvcG9sb2dpZXMgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQsCi0JCQkJKHE2Y29yZV9sY2wuYnVzX2J3X3Jlc3BfcmVjZWl2ZWQgPT0gMSksCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0IGZvciBEZXJlZ2lzdGVyIHRvcG9sb2dpZXNcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZjb3JlX3NlbmRfY3VzdG9tX3RvcG9sb2dpZXModm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgcmV0MiA9IDA7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBhdmNzX2NtZF9yZWdpc3Rlcl90b3BvbG9naWVzIHJlZ190b3A7Ci0KLQlpZiAoIXE2Y29yZV9pc19hZHNwX3JlYWR5KCkpIHsKLQkJcHJfZXJyKCIlczogQURTUCBpcyBub3QgcmVhZHkhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCW1lbXNldCgmcmVnX3RvcCwgMCwgc2l6ZW9mKHJlZ190b3ApKTsKLQltdXRleF9sb2NrKCZxNmNvcmVfbGNsLmNhbF9kYXRhW0NVU1RfVE9QX0NBTF0tPmxvY2spOwotCW11dGV4X2xvY2soJnE2Y29yZV9sY2wuY21kX2xvY2spOwotCi0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJcTZjb3JlX2xjbC5jYWxfZGF0YVtDVVNUX1RPUF9DQUxdKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBjYWwgYmxvY2sgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPD0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IGNhbCBzaXplIGlzICV6ZCBub3Qgc2VuZGluZ1xuIiwKLQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlxNmNvcmVfZGVyZWdfYWxsX2N1c3RvbV90b3BvbG9naWVzKCk7Ci0KLQlyZXQgPSBxNmNvcmVfbWFwX21lbW9yeV9yZWdpb25zKCZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLCAwLAotCQkodWludDMyX3QgKikmY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwgMSwKLQkJJmNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlpZiAoIXJldCkgIHsKLQkJcHJfZXJyKCIlczogcTZjb3JlX21hcF9tZW1vcnlfcmVnaW9ucyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcmVnX3RvcC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXJlZ190b3AuaGRyLnBrdF9zaXplID0gc2l6ZW9mKHJlZ190b3ApOwotCXJlZ190b3AuaGRyLnNyY19zdmMgPSBBUFJfU1ZDX0FEU1BfQ09SRTsKLQlyZWdfdG9wLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCXJlZ190b3AuaGRyLnNyY19wb3J0ID0gMDsKLQlyZWdfdG9wLmhkci5kZXN0X3N2YyA9IEFQUl9TVkNfQURTUF9DT1JFOwotCXJlZ190b3AuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCXJlZ190b3AuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JcmVnX3RvcC5oZHIudG9rZW4gPSAwOwotCXJlZ190b3AuaGRyLm9wY29kZSA9IEFWQ1NfQ01EX1JFR0lTVEVSX1RPUE9MT0dJRVM7Ci0JcmVnX3RvcC5wYXlsb2FkX2FkZHJfbHN3ID0KLQkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlyZWdfdG9wLnBheWxvYWRfYWRkcl9tc3cgPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlyZWdfdG9wLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7Ci0JcmVnX3RvcC5wYXlsb2FkX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQlxNmNvcmVfbGNsLmFkc3Bfc3RhdHVzID0gMDsKLQlxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID0gMDsKLQotCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgdG9wb2xvZ2llcyBhZGRyICVwSywgc2l6ZSAlemQsIG1hcCBoYW5kbGUgJWRcbiIsCi0JCV9fZnVuY19fLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplLAotCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QocTZjb3JlX2xjbC5jb3JlX2hhbmRsZV9xLCAodWludDMyX3QgKikgJnJlZ190b3ApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IFJlZ2lzdGVyIHRvcG9sb2dpZXMgZmFpbGVkICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gdW5tYXA7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHE2Y29yZV9sY2wuYnVzX2J3X3JlcV93YWl0LAotCQkJCShxNmNvcmVfbGNsLmJ1c19id19yZXNwX3JlY2VpdmVkID09IDEpLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCBmb3IgUmVnaXN0ZXIgdG9wb2xvZ2llc1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byB1bm1hcDsKLQl9Ci0KLQlpZiAocTZjb3JlX2xjbC5hZHNwX3N0YXR1cyA8IDApCi0JCXJldCA9IHE2Y29yZV9sY2wuYWRzcF9zdGF0dXM7Ci11bm1hcDoKLQlyZXQyID0gcTZjb3JlX21lbW9yeV91bm1hcF9yZWdpb25zKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlpZiAoIXJldDIpICB7Ci0JCXByX2VycigiJXM6IHE2Y29yZV9tZW1vcnlfdW5tYXBfcmVnaW9ucyBmYWlsZWQgZm9yIG1hcCBoYW5kbGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUpOwotCQlyZXQgPSByZXQyOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLXVubG9jazoKLQltdXRleF91bmxvY2soJnE2Y29yZV9sY2wuY21kX2xvY2spOwotCW11dGV4X3VubG9jaygmcTZjb3JlX2xjbC5jYWxfZGF0YVtDVVNUX1RPUF9DQUxdLT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBBVURJT19DT1JFX01FVEFJTkZPX0NBTF9UWVBFOgotCQlyZXQgPSBNRVRBX0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBDT1JFX0NVU1RPTV9UT1BPTE9HSUVTX0NBTF9UWVBFOgotCQlyZXQgPSBDVVNUX1RPUF9DQUw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgY2FsIHR5cGUgJWQhXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHE2Y29yZV9hbGxvY19jYWwoaW50MzJfdCBjYWxfdHlwZSwKLQkJCSAgICBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQlyZXQgPSBjYWxfdXRpbHNfYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJcTZjb3JlX2xjbC5jYWxfZGF0YVtjYWxfaW5kZXhdLCAwLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjYWxfdXRpbHNfYWxsb2NfYmxvY2sgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZjb3JlX2RlYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsCi0JCQkgICAgICBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQljYWxfaW5kZXggPSBnZXRfY2FsX3R5cGVfaW5kZXgoY2FsX3R5cGUpOwotCWlmIChjYWxfaW5kZXggPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgY2FsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQlyZXQgPSBjYWxfdXRpbHNfZGVhbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAotCQkJCQlxNmNvcmVfbGNsLmNhbF9kYXRhW2NhbF9pbmRleF0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19kZWFsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHE2Y29yZV9zZXRfY2FsKGludDMyX3QgY2FsX3R5cGUsCi0Jc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCi0JcmV0ID0gY2FsX3V0aWxzX3NldF9jYWwoZGF0YV9zaXplLCBkYXRhLAotCQkJCSAgICBxNmNvcmVfbGNsLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2luZGV4ID09IENVU1RfVE9QX0NBTCkKLQkJcmV0ID0gcTZjb3JlX3NlbmRfY3VzdG9tX3RvcG9sb2dpZXMoKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcTZjb3JlX2RlbGV0ZV9jYWxfZGF0YSh2b2lkKQotewotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF91dGlsc19kZXN0cm95X2NhbF90eXBlcyhDT1JFX01BWF9DQUwsIHE2Y29yZV9sY2wuY2FsX2RhdGEpOwotfQotCi0KLXN0YXRpYyBpbnQgcTZjb3JlX2luaXRfY2FsX2RhdGEodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY2FsX3R5cGVfaW5mbyAgICBjYWxfdHlwZV9pbmZvW10gPSB7Ci0JCXt7QVVESU9fQ09SRV9NRVRBSU5GT19DQUxfVFlQRSwKLQkJe3E2Y29yZV9hbGxvY19jYWwsIHE2Y29yZV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJcTZjb3JlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0NPUkVfQ1VTVE9NX1RPUE9MT0dJRVNfQ0FMX1RZUEUsCi0JCXtxNmNvcmVfYWxsb2NfY2FsLCBxNmNvcmVfZGVhbGxvY19jYWwsIE5VTEwsCi0JCXE2Y29yZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0KLQl9OwotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKENPUkVfTUFYX0NBTCwKLQkJcTZjb3JlX2xjbC5jYWxfZGF0YSwgY2FsX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiByZXQ7Ci1lcnI6Ci0JcTZjb3JlX2RlbGV0ZV9jYWxfZGF0YSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNvcmVfaW5pdCh2b2lkKQotewotCW1lbXNldCgmcTZjb3JlX2xjbCwgMCwgc2l6ZW9mKHN0cnVjdCBxNmNvcmVfc3RyKSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcTZjb3JlX2xjbC5idXNfYndfcmVxX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnE2Y29yZV9sY2wuY21kX3JlcV93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZxNmNvcmVfbGNsLmF2Y3NfZndrX3Zlcl9yZXFfd2FpdCk7Ci0JcTZjb3JlX2xjbC5jbWRfcmVzcF9yZWNlaXZlZF9mbGFnID0gRkxBR19OT05FOwotCW11dGV4X2luaXQoJnE2Y29yZV9sY2wuY21kX2xvY2spOwotCW11dGV4X2luaXQoJnE2Y29yZV9sY2wudmVyX2xvY2spOwotCi0JcTZjb3JlX2luaXRfY2FsX2RhdGEoKTsKLQotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQoY29yZV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGNvcmVfZXhpdCh2b2lkKQotewotCW11dGV4X2Rlc3Ryb3koJnE2Y29yZV9sY2wuY21kX2xvY2spOwotCW11dGV4X2Rlc3Ryb3koJnE2Y29yZV9sY2wudmVyX2xvY2spOwotCXE2Y29yZV9kZWxldGVfY2FsX2RhdGEoKTsKLX0KLW1vZHVsZV9leGl0KGNvcmVfZXhpdCk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFEU1AgY29yZSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNmxzbS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2bHNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OWQxYmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9xZHNwNnYyL3E2bHNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNywgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9sc21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZjb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZsc20uaD4KLSNpbmNsdWRlIDxhc20vaW9jdGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2F1ZGlvX2lvbi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvYXVkaW9fY2FsX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KLQotI2RlZmluZSBBUFJfVElNRU9VVAkoNSAqIEhaKQotI2RlZmluZSBMU01fQUxJR05fQk9VTkRBUlkgNTEyCi0jZGVmaW5lIExTTV9TQU1QTEVfUkFURSAxNjAwMAotI2RlZmluZSBRTFNNX1BBUkFNX0lEX01JTk9SX1ZFUlNJT04gMQotI2RlZmluZSBRTFNNX1BBUkFNX0lEX01JTk9SX1ZFUlNJT05fMiAyCi0KLXN0YXRpYyBpbnQgbHNtX2FmZV9wb3J0OwotCi1lbnVtIHsKLQlMU01fQ1VTVE9NX1RPUF9JRFgsCi0JTFNNX1RPUF9JRFgsCi0JTFNNX0NBTF9JRFgsCi0JTFNNX01BWF9DQUxfSURYCi19OwotCi1lbnVtIHsKLQlDTURfU1RBVEVfQ0xFQVJFRCA9IDAsCi0JQ01EX1NUQVRFX1dBSVRfUkVTUCA9IDEsCi19OwotCi1lbnVtIHsKLQlMU01fSU5WQUxJRF9TRVNTSU9OX0lEID0gMCwKLQlMU01fTUlOX1NFU1NJT05fSUQgPSAxLAotCUxTTV9NQVhfU0VTU0lPTl9JRCA9IDgsCi0JTFNNX0NPTlRST0xfU0VTU0lPTiA9IDB4MEYsCi19OwotCi0jZGVmaW5lIENIRUNLX1NFU1NJT04oeCkgKHggPCBMU01fTUlOX1NFU1NJT05fSUQgfHwgeCA+IExTTV9NQVhfU0VTU0lPTl9JRCkKLXN0cnVjdCBsc21fY29tbW9uIHsKLQl2b2lkICphcHI7Ci0JYXRvbWljX3QgYXByX3VzZXJzOwotCXN0cnVjdCBsc21fY2xpZW50CWNvbW1vbl9jbGllbnRbTFNNX01BWF9TRVNTSU9OX0lEICsgMV07Ci0KLQlpbnQgc2V0X2N1c3RvbV90b3BvbG9neTsKLQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YQkqY2FsX2RhdGFbTFNNX01BWF9DQUxfSURYXTsKLQotCXN0cnVjdCBtdXRleCBhcHJfbG9jazsKLX07Ci0KLXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyB7Ci0JdWludDMyX3QgbW9kdWxlX2lkOwotCXVpbnQzMl90IHBhcmFtX2lkOwotfTsKLQotc3RhdGljIHN0cnVjdCBsc21fY29tbW9uIGxzbV9jb21tb247Ci0vKgotICogbW1hcF9oYW5kbGVfcCBjYW4gcG9pbnQgZWl0aGVyIGNsaWVudC0+c291bmRfbW9kZWwubWVtX21hcF9oYW5kbGUgb3IKLSAqIGxzbV9jb21tb24ubW1hcF9oYW5kbGVfZm9yX2NhbC4KLSAqIG1tYXBfbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUgYWNjZXNzaW5nIHRoaXMuCi0gKi8KLXN0YXRpYyBzcGlubG9ja190IG1tYXBfbG9jazsKLXN0YXRpYyB1aW50MzJfdCAqbW1hcF9oYW5kbGVfcDsKLQotc3RhdGljIHNwaW5sb2NrX3QgbHNtX3Nlc3Npb25fbG9jazsKLXN0YXRpYyBzdHJ1Y3QgbHNtX2NsaWVudCAqbHNtX3Nlc3Npb25bTFNNX01BWF9TRVNTSU9OX0lEICsgMV07Ci0KLXN0YXRpYyBpbnQgcTZsc21fbW1hcGNhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOwotc3RhdGljIGludCBxNmxzbV9zZW5kX2NhbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCB1MzIgc2V0X3BhcmFtc19vcGNvZGUpOwotc3RhdGljIGludCBxNmxzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgZG1hX2FkZHJfdCBkbWFfYWRkcl9wLCB1aW50MzJfdCBkbWFfYnVmX3N6LAotCQkJCSAgICB1aW50MzJfdCAqbW1hcF9wKTsKLXN0YXRpYyBpbnQgcTZsc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICB1aW50MzJfdCBoYW5kbGUpOwotCi1zdGF0aWMgdm9pZCBxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oCi0JCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgKnBhcmFtX2hkciwKLQkJdTMyIHBheWxvYWRfc2l6ZSwgdTMyIGFkZHJfbHN3LCB1MzIgYWRkcl9tc3csCi0JCXUzMiBtbWFwX2hhbmRsZSkKLXsKLQlwYXJhbV9oZHItPmRhdGFfcGF5bG9hZF9zaXplID0gcGF5bG9hZF9zaXplOwotCXBhcmFtX2hkci0+ZGF0YV9wYXlsb2FkX2FkZHJfbHN3ID0gYWRkcl9sc3c7Ci0JcGFyYW1faGRyLT5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPSBhZGRyX21zdzsKLQlwYXJhbV9oZHItPm1lbV9tYXBfaGFuZGxlID0gbW1hcF9oYW5kbGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHE2bHNtX3NldF9wYXJhbV9jb21tb24oCi0JCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gKmNvbW1vbiwKLQkJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzICppZHMsCi0JCXUzMiBwYXJhbV9zaXplLCB1MzIgc2V0X3BhcmFtX3ZlcnNpb24pCi17Ci0JY29tbW9uLT5tb2R1bGVfaWQgPSBpZHMtPm1vZHVsZV9pZDsKLQljb21tb24tPnBhcmFtX2lkID0gaWRzLT5wYXJhbV9pZDsKLQotCXN3aXRjaCAoc2V0X3BhcmFtX3ZlcnNpb24pIHsKLQljYXNlIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOgotCQljb21tb24tPnBfc2l6ZS5wYXJhbV9zaXplID0gcGFyYW1fc2l6ZTsKLQkJYnJlYWs7Ci0JY2FzZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUzoKLQlkZWZhdWx0OgotCQljb21tb24tPnBfc2l6ZS5zci5wYXJhbV9zaXplID0KLQkJCSh1MTYpIHBhcmFtX3NpemU7Ci0JCWNvbW1vbi0+cF9zaXplLnNyLnJlc2VydmVkID0gMDsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IHE2bHNtX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0Jc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCA9IChzdHJ1Y3QgbHNtX2NsaWVudCAqKXByaXY7Ci0JdWludDMyX3QgdG9rZW47Ci0JdWludDMyX3QgKnBheWxvYWQ7Ci0KLQlpZiAoIWNsaWVudCB8fCAhZGF0YSkgewotCQlwcl9lcnIoIiVzOiBjbGllbnQgJXBLIGRhdGEgJXBLXG4iLAotCQkJX19mdW5jX18sIGNsaWVudCwgZGF0YSk7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChkYXRhLT5vcGNvZGUgPT0gUkVTRVRfRVZFTlRTKSB7Ci0JCXByX2RlYnVnKCIlczogU1NSIGV2ZW50IHJlY2VpdmVkIDB4JXgsIGV2ZW50IDB4JXgsIHByb2MgMHgleFxuIiwKLQkJCSBfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLCBkYXRhLT5yZXNldF9ldmVudCwKLQkJCSBkYXRhLT5yZXNldF9wcm9jKTsKLQotCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhMU01fTUFYX0NBTF9JRFgsCi0JCQlsc21fY29tbW9uLmNhbF9kYXRhKTsKLQkJbXV0ZXhfbG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ1VTVE9NX1RPUF9JRFhdLT5sb2NrKTsKLQkJbHNtX2NvbW1vbi5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMTsKLQkJbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DVVNUT01fVE9QX0lEWF0tPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwYXlsb2FkID0gZGF0YS0+cGF5bG9hZDsKLQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQgb3Bjb2RlIDB4JXggdG9rZW4gMHgleCBwYXlsb2FkIHNpemUgJWRcbiIKLQkJCSAicGF5bG9hZCBbMF0gPSAweCV4XG4iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uLAotCQlkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLCBkYXRhLT5wYXlsb2FkX3NpemUsIHBheWxvYWRbMF0pOwotCWlmIChkYXRhLT5vcGNvZGUgPT0gTFNNX0RBVEFfRVZFTlRfUkVBRF9ET05FKSB7Ci0JCXN0cnVjdCBsc21fY21kX3JlYWRfZG9uZSByZWFkX2RvbmU7Ci0KLQkJdG9rZW4gPSBkYXRhLT50b2tlbjsKLQkJaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSA+IHNpemVvZihyZWFkX2RvbmUpKSB7Ci0JCQlwcl9lcnIoIiVzOiByZWFkIGRvbmUgZXJyb3IgcGF5bG9hZCBzaXplICVkIGV4cGVjdGVkIHNpemUgJXpkXG4iLAotCQkJCV9fZnVuY19fLCBkYXRhLT5wYXlsb2FkX3NpemUsCi0JCQkJc2l6ZW9mKHJlYWRfZG9uZSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBvcGNvZGUgJXggc3RhdHVzICV4IGxzdyAleCBtc3cgJXggbWVtX21hcCBoYW5kbGUgJXhcbiIsCi0JCQlfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLCBwYXlsb2FkWzBdLCBwYXlsb2FkWzFdLAotCQkJcGF5bG9hZFsyXSwgcGF5bG9hZFszXSk7Ci0JCXJlYWRfZG9uZS5zdGF0dXMgPSBwYXlsb2FkWzBdOwotCQlyZWFkX2RvbmUuYnVmX2FkZHJfbHN3ID0gcGF5bG9hZFsxXTsKLQkJcmVhZF9kb25lLmJ1Zl9hZGRyX21zdyA9IHBheWxvYWRbMl07Ci0JCXJlYWRfZG9uZS5tZW1fbWFwX2hhbmRsZSA9IHBheWxvYWRbM107Ci0JCXJlYWRfZG9uZS50b3RhbF9zaXplID0gcGF5bG9hZFs0XTsKLQkJcmVhZF9kb25lLm9mZnNldCA9IHBheWxvYWRbNV07Ci0JCWlmIChjbGllbnQtPmNiKQotCQkJY2xpZW50LT5jYihkYXRhLT5vcGNvZGUsIGRhdGEtPnRva2VuLAotCQkJCQkodm9pZCAqKSZyZWFkX2RvbmUsCi0JCQkJCWNsaWVudC0+cHJpdik7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7Ci0JCXRva2VuID0gZGF0YS0+dG9rZW47Ci0JCXN3aXRjaCAocGF5bG9hZFswXSkgewotCQljYXNlIExTTV9TRVNTSU9OX0NNRF9TVEFSVDoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfU1RPUDoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUzoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfT1BFTl9UWDoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfQ0xPU0VfVFg6Ci0JCWNhc2UgTFNNX1NFU1NJT05fQ01EX1JFR0lTVEVSX1NPVU5EX01PREVMOgotCQljYXNlIExTTV9TRVNTSU9OX0NNRF9ERVJFR0lTVEVSX1NPVU5EX01PREVMOgotCQljYXNlIExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM6Ci0JCWNhc2UgTFNNX1NFU1NJT05fQ01EX0VPQjoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfUkVBRDoKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfT1BFTl9UWF9WMjoKLQkJY2FzZSBMU01fQ01EX0FERF9UT1BPTE9HSUVTOgotCQljYXNlIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOgotCQkJaWYgKHRva2VuICE9IGNsaWVudC0+c2Vzc2lvbiAmJgotCQkJICAgIHBheWxvYWRbMF0gIT0KLQkJCQlMU01fU0VTU0lPTl9DTURfREVSRUdJU1RFUl9TT1VORF9NT0RFTCkgewotCQkJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbiAlZCByZWNlaXZjZWQgZXhwZWN0ZWQgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCB0b2tlbiwgY2xpZW50LT5zZXNzaW9uKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWNsaWVudC0+Y21kX2Vycl9jb2RlID0gcGF5bG9hZFsxXTsKLQkJCWlmIChjbGllbnQtPmNtZF9lcnJfY29kZSkKLQkJCQlwcl9lcnIoIiVzOiBjbWQgMHgleCBmYWlsZWQgc3RhdHVzICVkXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkWzBdLCBjbGllbnQtPmNtZF9lcnJfY29kZSk7Ci0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJmNsaWVudC0+Y21kX3N0YXRlLAotCQkJCQkgICBDTURfU1RBVEVfV0FJVF9SRVNQLAotCQkJCQkgICBDTURfU1RBVEVfQ0xFQVJFRCkgPT0KLQkJCQkJICAgICAgIENNRF9TVEFURV9XQUlUX1JFU1ApCi0JCQkJd2FrZV91cCgmY2xpZW50LT5jbWRfd2FpdCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogVW5rbm93biBjb21tYW5kIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWRbMF0pOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGNsaWVudC0+Y2IpCi0JCWNsaWVudC0+Y2IoZGF0YS0+b3Bjb2RlLCBkYXRhLT50b2tlbiwgZGF0YS0+cGF5bG9hZCwKLQkJCSAgIGNsaWVudC0+cHJpdik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxNmxzbV9zZXNzaW9uX2FsbG9jKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbiwgcmV0ID0gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsc21fc2Vzc2lvbl9sb2NrLCBmbGFncyk7Ci0JZm9yIChuID0gTFNNX01JTl9TRVNTSU9OX0lEOyBuIDw9IExTTV9NQVhfU0VTU0lPTl9JRDsgbisrKSB7Ci0JCWlmICghbHNtX3Nlc3Npb25bbl0pIHsKLQkJCWxzbV9zZXNzaW9uW25dID0gY2xpZW50OwotCQkJcmV0ID0gbjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxzbV9zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQlwcl9kZWJ1ZygiJXM6IEFsbG9jIFNlc3Npb24gJWQiLCBfX2Z1bmNfXywgbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcTZsc21fc2Vzc2lvbl9mcmVlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczogRnJlZWluZyBzZXNzaW9uIElEICVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbHNtX3Nlc3Npb25fbG9jaywgZmxhZ3MpOwotCWxzbV9zZXNzaW9uW2NsaWVudC0+c2Vzc2lvbl0gPSBMU01fSU5WQUxJRF9TRVNTSU9OX0lEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxzbV9zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQljbGllbnQtPnNlc3Npb24gPSBMU01fSU5WQUxJRF9TRVNTSU9OX0lEOwotfQotCi1zdGF0aWMgdm9pZCAqcTZsc21fbW1hcF9hcHJfcmVnKHZvaWQpCi17Ci0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZsc21fY29tbW9uLmFwcl91c2VycykgPT0gMSkgewotCQlsc21fY29tbW9uLmFwciA9Ci0JCSAgICBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiTFNNIiwgcTZsc21fbW1hcGNhbGxiYWNrLAotCQkJCSAweDBGRkZGRkZGRiwgJmxzbV9jb21tb24pOwotCQlpZiAoIWxzbV9jb21tb24uYXByKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFVuYWJsZSB0byByZWdpc3RlciBBUFIgTFNNIGNvbW1vbiBwb3J0XG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCQlhdG9taWNfZGVjKCZsc21fY29tbW9uLmFwcl91c2Vycyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxzbV9jb21tb24uYXByOwotfQotCi1zdGF0aWMgaW50IHE2bHNtX21tYXBfYXByX2RlcmVnKHZvaWQpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZsc21fY29tbW9uLmFwcl91c2VycykgPD0gMCkgewotCQlXQVJOKCIlczogQVBSIGNvbW1vbiBwb3J0IGFscmVhZHkgY2xvc2VkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZsc21fY29tbW9uLmFwcl91c2VycykgPT0gMCkgewotCQkJYXByX2RlcmVnaXN0ZXIobHNtX2NvbW1vbi5hcHIpOwotCQkJcHJfZGVidWcoIiVzOiBBUFIgRGUtUmVnaXN0ZXIgY29tbW9uIHBvcnRcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGxzbV9jbGllbnQgKnE2bHNtX2NsaWVudF9hbGxvYyhsc21fYXBwX2NiIGNiLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQ7Ci0JaW50IG47Ci0KLQljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHNtX2NsaWVudCksIEdGUF9LRVJORUwpOwotCWlmICghY2xpZW50KQotCQlyZXR1cm4gTlVMTDsKLQluID0gcTZsc21fc2Vzc2lvbl9hbGxvYyhjbGllbnQpOwotCWlmIChuIDw9IDApIHsKLQkJa2ZyZWUoY2xpZW50KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNsaWVudC0+c2Vzc2lvbiA9IG47Ci0JY2xpZW50LT5jYiA9IGNiOwotCWNsaWVudC0+cHJpdiA9IHByaXY7Ci0JaWYgKENIRUNLX1NFU1NJT04oY2xpZW50LT5zZXNzaW9uKSkgewotCQlwcl9lcnIoIiVzOiBDbGllbnQgc2Vzc2lvbiAlZFxuIiwKLQkJCV9fZnVuY19fLCBjbGllbnQtPnNlc3Npb24pOwotCQlrZnJlZShjbGllbnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBDbGllbnQgU2Vzc2lvbiAlZFxuIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7Ci0JY2xpZW50LT5hcHIgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiTFNNIiwgcTZsc21fY2FsbGJhY2ssCi0JCQkJICAgKChjbGllbnQtPnNlc3Npb24pIDw8IDggfCBjbGllbnQtPnNlc3Npb24pLAotCQkJCSAgIGNsaWVudCk7Ci0KLQlpZiAoY2xpZW50LT5hcHIgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBSZWdpc3RyYXRpb24gd2l0aCBBUFIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IFJlZ2lzdGVyaW5nIHRoZSBjb21tb24gcG9ydCB3aXRoIEFQUlxuIiwgX19mdW5jX18pOwotCWNsaWVudC0+bW1hcF9hcHIgPSBxNmxzbV9tbWFwX2Fwcl9yZWcoKTsKLQlpZiAoIWNsaWVudC0+bW1hcF9hcHIpIHsKLQkJcHJfZXJyKCIlczogQVBSIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNsaWVudC0+Y21kX3dhaXQpOwotCW11dGV4X2luaXQoJmNsaWVudC0+Y21kX2xvY2spOwotCWF0b21pY19zZXQoJmNsaWVudC0+Y21kX3N0YXRlLCBDTURfU1RBVEVfQ0xFQVJFRCk7Ci0JcHJfZGVidWcoIiVzOiBOZXcgY2xpZW50IGFsbG9jYXRlZFxuIiwgX19mdW5jX18pOwotCXJldHVybiBjbGllbnQ7Ci1mYWlsOgotCXE2bHNtX2NsaWVudF9mcmVlKGNsaWVudCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgcTZsc21fY2xpZW50X2ZyZWUoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKLXsKLQlpZiAoIWNsaWVudCkKLQkJcmV0dXJuOwotCWlmIChDSEVDS19TRVNTSU9OKGNsaWVudC0+c2Vzc2lvbikpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBTZXNzaW9uICVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKLQkJcmV0dXJuOwotCX0KLQlhcHJfZGVyZWdpc3RlcihjbGllbnQtPmFwcik7Ci0JY2xpZW50LT5tbWFwX2FwciA9IE5VTEw7Ci0JcTZsc21fc2Vzc2lvbl9mcmVlKGNsaWVudCk7Ci0JcTZsc21fbW1hcF9hcHJfZGVyZWcoKTsKLQltdXRleF9kZXN0cm95KCZjbGllbnQtPmNtZF9sb2NrKTsKLQlrZnJlZShjbGllbnQpOwotCWNsaWVudCA9IE5VTEw7Ci19Ci0KLS8qCi0gKiBxNmxzbV9hcHJfc2VuZF9wa3QgOiBJZiB3YWl0ID09IHRydWUsIGhvbGQgbXV0ZXggdG8gcHJldmVudCBmcm9tIHByZWVtcHRpbmcKLSAqCQkJb3RoZXIgdGhyZWFkJ3Mgd2FpdC4KLSAqCQkJSWYgbW1hcF9oYW5kbGVfcCAhPSBOVUxMLCBkaXNhYmxlIGlycSBhbmQgc3BpbiBsb2NrIHRvCi0gKgkJCXByb3RlY3QgbW1hcF9oYW5kbGVfcAotICovCi1zdGF0aWMgaW50IHE2bHNtX2Fwcl9zZW5kX3BrdChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCB2b2lkICpoYW5kbGUsCi0JCQkgICAgICB2b2lkICpkYXRhLCBib29sIHdhaXQsIHVpbnQzMl90ICptbWFwX3ApCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3QgYXByX2hkciAqbXNnX2hkciA9IChzdHJ1Y3QgYXByX2hkciAqKSBkYXRhOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlciB3YWl0ICVkXG4iLCBfX2Z1bmNfXywgd2FpdCk7Ci0JaWYgKHdhaXQpCi0JCW11dGV4X2xvY2soJmxzbV9jb21tb24uYXByX2xvY2spOwotCWlmIChtbWFwX3ApIHsKLQkJV0FSTl9PTighd2FpdCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtbWFwX2xvY2ssIGZsYWdzKTsKLQkJbW1hcF9oYW5kbGVfcCA9IG1tYXBfcDsKLQl9Ci0JYXRvbWljX3NldCgmY2xpZW50LT5jbWRfc3RhdGUsIENNRF9TVEFURV9XQUlUX1JFU1ApOwotCWNsaWVudC0+Y21kX2Vycl9jb2RlID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoaGFuZGxlLCBkYXRhKTsKLQlpZiAobW1hcF9wKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtbWFwX2xvY2ssIGZsYWdzKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9zZW5kX3BrdCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCX0gZWxzZSBpZiAod2FpdCkgewotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoY2xpZW50LT5jbWRfd2FpdCwKLQkJCQkJIChhdG9taWNfcmVhZCgmY2xpZW50LT5jbWRfc3RhdGUpID09Ci0JCQkJCSAgICAgIENNRF9TVEFURV9DTEVBUkVEKSwKLQkJCQkJIEFQUl9USU1FT1VUKTsKLQkJaWYgKGxpa2VseShyZXQpKSB7Ci0JCQkvKiBxNiByZXR1cm5lZCBlcnJvciAqLwotCQkJaWYgKGNsaWVudC0+Y21kX2Vycl9jb2RlKSB7Ci0JCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCQljbGllbnQtPmNtZF9lcnJfY29kZSkpOwotCQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCQljbGllbnQtPmNtZF9lcnJfY29kZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldCA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0IHRpbWVkb3V0LCBhcHJfb3Bjb2RlID0gMHgleCwgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBtc2dfaGRyLT5vcGNvZGUsIG1zZ19oZHItPnBrdF9zaXplKTsKLQkJCS8qIHJldCA9IDAgbWVhbnMgd2FpdCB0aW1lZCBvdXQgKi8KLQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSAwOwotCX0KLQlpZiAod2FpdCkKLQkJbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmFwcl9sb2NrKTsKLQotCXByX2RlYnVnKCIlczogbGVhdmUgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBxNmxzbV9hZGRfaGRyKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBhcHJfaGRyICpoZHIsCi0JCQl1aW50MzJfdCBwa3Rfc2l6ZSwgYm9vbCBjbWRfZmxnKQotewotCXByX2RlYnVnKCIlczogcGt0X3NpemUgJWQgY21kX2ZsZyAlZCBzZXNzaW9uICVkXG4iLCBfX2Z1bmNfXywKLQkJcGt0X3NpemUsIGNtZF9mbGcsIGNsaWVudC0+c2Vzc2lvbik7Ci0JaGRyLT5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCSAgICAgICBBUFJfSERSX0xFTihzaXplb2Yoc3RydWN0IGFwcl9oZHIpKSwKLQkJCQkgICAgICAgQVBSX1BLVF9WRVIpOwotCWhkci0+c3JjX3N2YyA9IEFQUl9TVkNfTFNNOwotCWhkci0+c3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQloZHItPmRlc3Rfc3ZjID0gQVBSX1NWQ19MU007Ci0JaGRyLT5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQloZHItPnNyY19wb3J0ID0gKChjbGllbnQtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgY2xpZW50LT5zZXNzaW9uOwotCWhkci0+ZGVzdF9wb3J0ID0gKChjbGllbnQtPnNlc3Npb24gPDwgOCkgJiAweEZGMDApIHwgY2xpZW50LT5zZXNzaW9uOwotCWhkci0+cGt0X3NpemUgPSBwa3Rfc2l6ZTsKLQlpZiAoY21kX2ZsZykKLQkJaGRyLT50b2tlbiA9IGNsaWVudC0+c2Vzc2lvbjsKLX0KLQotCi1zdGF0aWMgaW50IHE2bHNtX3NlbmRfY3VzdG9tX3RvcG9sb2dpZXMoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBsc21fY3VzdG9tX3RvcG9sb2dpZXMgY3N0bV90b3A7Ci0KLQlpZiAobHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ1VTVE9NX1RPUF9JRFhdID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTFNNX0NVU1RPTV9UT1BfSURYIGludmFsaWRcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbHNtX2NvbW1vbi5zZXRfY3VzdG9tX3RvcG9sb2d5ID0gMDsKLQotCW11dGV4X2xvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJCWxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXSk7Ci0JaWYgKCFjYWxfYmxvY2spIHsKLQkJcHJfZXJyKCIlczogQ2FsIGJsb2NrIGZvciBMU01fQ1VTVE9NX1RPUF9JRFggbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWlmIChjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNpemUgZm9yIExTTV9DVVNUT01fVE9QICV6ZFxuIiwKLQkJCV9fZnVuY19fLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCW1lbXNldCgmY3N0bV90b3AsIDAsIHNpemVvZihjc3RtX3RvcCkpOwotCS8qIE1hcCB0aGUgbWVtb3J5IGZvciBvdXQtb2YtYmFuZCBkYXRhICovCi0JcmMgPSBxNmxzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoY2xpZW50LCBjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJCSAgICAgIGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsCi0JCQkJICAgICAgJmNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBtYXAgY3VzdG9tIHRvcG9sb2dpZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcTZsc21fYWRkX2hkcihjbGllbnQsICZjc3RtX3RvcC5oZHIsCi0JCSAgICAgIHNpemVvZihjc3RtX3RvcCksIHRydWUpOwotCWNzdG1fdG9wLmhkci5vcGNvZGUgPSBMU01fQ01EX0FERF9UT1BPTE9HSUVTOwotCi0JLyoKLQkgKiBGb3IgQUREX1RPUE9MT0dJRVMsIHRoZSBkZXN0X3BvcnQgc2hvdWxkIGJlIDAKLQkgKiBOb3RlIHRoYXQgc291cmNlIHBvcnQgY2Fubm90IGJlIHplcm8gYXMgaXQgaXMgdXNlZAotCSAqIHRvIHJvdXRlIHRoZSByZXNwb25zZSB0byBhIHNwZWNpZmljIGNsaWVudCByZWdpc3RlcmVkCi0JICogb24gQVBSCi0JICovCi0JY3N0bV90b3AuaGRyLmRlc3RfcG9ydCA9IDA7Ci0KLQljc3RtX3RvcC5kYXRhX3BheWxvYWRfYWRkcl9sc3cgPQotCQkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQljc3RtX3RvcC5kYXRhX3BheWxvYWRfYWRkcl9tc3cgPQotCQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCWNzdG1fdG9wLm1lbV9tYXBfaGFuZGxlID0gY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGU7Ci0JY3N0bV90b3AuYnVmZmVyX3NpemUgPSBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCSZjc3RtX3RvcCwgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWRkIGN1c3RvbSB0b3AsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkvKiBnbyBhaGVhZCBhbmQgdW5tYXAgZXZlbiBpZiBjdXN0b20gdG9wIGZhaWxlZCAqLwotCXJjID0gcTZsc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoY2xpZW50LAotCQkJCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byB1bm1hcCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCQkvKiBFdmVuIGlmIG1lbSB1bm1hcCBmYWlsZWQsIHRyZWF0IHRoZSBjbWQgYXMgc3VjY2VzcyAqLwotCQlyYyA9IDA7Ci0JfQotCi11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DVVNUT01fVE9QX0lEWF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fZG9fb3Blbl92MihzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQl1aW50MTZfdCBhcHBfaWQpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fbHNtX3RvcCAqbHNtX3RvcDsKLQlzdHJ1Y3QgbHNtX3N0cmVhbV9jbWRfb3Blbl90eF92MiBvcGVuX3YyOwotCi0JaWYgKGxzbV9jb21tb24uY2FsX2RhdGFbTFNNX1RPUF9JRFhdID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTFNNX1RPUF9JRFggaW52YWxpZFxuIiwgX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9UT1BfSURYXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJCWxzbV9jb21tb24uY2FsX2RhdGFbTFNNX1RPUF9JRFhdKTsKLQlpZiAoIWNhbF9ibG9jaykgewotCQlwcl9lcnIoIiVzOiBDYWwgYmxvY2sgZm9yIExTTV9UT1BfSURYIG5vdCBmb3VuZFxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlsc21fdG9wID0gKHN0cnVjdCBhdWRpb19jYWxfaW5mb19sc21fdG9wICopCi0JCQljYWxfYmxvY2stPmNhbF9pbmZvOwotCWlmICghbHNtX3RvcCkgewotCQlwcl9lcnIoIiVzOiBjYWxfaW5mbyBmb3IgTFNNX1RPUF9JRFggbm90IGZvdW5kXG4iLAotCQkJX19mdW5jX18pOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCXByX2RlYnVnKCIlczogdG9wb2xvZ3lfaWQgPSAweCV4LCBhY2RiX2lkID0gMHgleCwgYXBwX3R5cGUgPSAweCV4XG4iLAotCQkgX19mdW5jX18sIGxzbV90b3AtPnRvcG9sb2d5LCBsc21fdG9wLT5hY2RiX2lkLAotCQkgbHNtX3RvcC0+YXBwX3R5cGUpOwotCi0JaWYgKGxzbV90b3AtPnRvcG9sb2d5ID09IDApIHsKLQkJcHJfZXJyKCIlczogdG9wbG9neSBpZCBub3Qgc2VudCBmb3IgYXBwX3R5cGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBsc21fdG9wLT5hcHBfdHlwZSk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JY2xpZW50LT5hcHBfaWQgPSBsc21fdG9wLT5hcHBfdHlwZTsKLQltZW1zZXQoJm9wZW5fdjIsIDAsIHNpemVvZihvcGVuX3YyKSk7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsICZvcGVuX3YyLmhkciwKLQkJICAgICAgc2l6ZW9mKG9wZW5fdjIpLCB0cnVlKTsKLQlvcGVuX3YyLnRvcG9sb2d5X2lkID0gbHNtX3RvcC0+dG9wb2xvZ3k7Ci0Jb3Blbl92Mi5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX09QRU5fVFhfVjI7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCSZvcGVuX3YyLCB0cnVlLCBOVUxMKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IG9wZW5fdjIgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JZWxzZQotCQljbGllbnQtPnVzZV90b3BvbG9neSA9IHRydWU7Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9UT1BfSURYXS0+bG9jayk7Ci1kb25lOgotCXJldHVybiByYzsKLQotfQotCi12b2lkIHE2bHNtX3NtX3NldF9wYXJhbV9kYXRhKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCi0JCXN0cnVjdCBsc21fcGFyYW1zX2luZm8gKnBfaW5mbywKLQkJc2l6ZV90ICpvZmZzZXQpCi17Ci0Jc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbiAqcGFyYW07Ci0KLQlwYXJhbSA9IChzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uICopCi0JCQljbGllbnQtPnNvdW5kX21vZGVsLmRhdGE7Ci0JcGFyYW0tPm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOwotCXBhcmFtLT5wYXJhbV9pZCA9IHBfaW5mby0+cGFyYW1faWQ7Ci0JcGFyYW0tPnBfc2l6ZS5wYXJhbV9zaXplID0gY2xpZW50LT5zb3VuZF9tb2RlbC5zaXplOwotCSpvZmZzZXQgPSBzaXplb2YoKnBhcmFtKTsKLX0KLQotaW50IHE2bHNtX29wZW4oc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgdWludDE2X3QgYXBwX2lkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGxzbV9zdHJlYW1fY21kX29wZW5fdHggb3BlbjsKLQotCS8qIEFkZCBDdXN0b20gdG9wb2xvZ2llcyBpZiBuZWVkZWQgKi8KLQlpZiAobHNtX2NvbW1vbi5zZXRfY3VzdG9tX3RvcG9sb2d5KSB7Ci0JCXJjID0gcTZsc21fc2VuZF9jdXN0b21fdG9wb2xvZ2llcyhjbGllbnQpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2VuZCBjdXN0X3RvcCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQl9Ci0KLQkvKiBUcnkgdG8gb3BlbiB3aXRoIHRvcG9sb2d5IGZpcnN0ICovCi0JcmMgPSBxNmxzbV9kb19vcGVuX3YyKGNsaWVudCwgYXBwX2lkKTsKLQlpZiAoIXJjKQotCQkvKiBvcGVuX3YyIHdhcyBzdWNjZXNzZnVsICovCi0JCWdvdG8gZG9uZTsKLQotCXByX2RlYnVnKCIlczogdHJ5IHdpdGhvdXQgdG9wb2xvZ3lcbiIsCi0JCSBfX2Z1bmNfXyk7Ci0KLQltZW1zZXQoJm9wZW4sIDAsIHNpemVvZihvcGVuKSk7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsICZvcGVuLmhkciwgc2l6ZW9mKG9wZW4pLCB0cnVlKTsKLQlzd2l0Y2ggKGNsaWVudC0+YXBwX2lkKSB7Ci0JY2FzZSBMU01fVk9JQ0VfV0FLRVVQX0FQUF9JRF9WMjoKLQkJb3Blbi5hcHBfaWQgPSBjbGllbnQtPmFwcF9pZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogIGRlZmF1bHQgZXJyIDB4JXhcbiIsIF9fZnVuY19fLCBjbGllbnQtPmFwcF9pZCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0Jb3Blbi5zYW1wbGluZ19yYXRlID0gTFNNX1NBTVBMRV9SQVRFOwotCW9wZW4uaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9PUEVOX1RYOwotCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCi0JCQkJJm9wZW4sIHRydWUsIE5VTEwpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogT3BlbiBmYWlsZWQgb3Bjb2RlIDB4JXgsIHJjICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIG9wZW4uaGRyLm9wY29kZSwgcmMpOwotCWVsc2UKLQkJY2xpZW50LT51c2VfdG9wb2xvZ3kgPSBmYWxzZTsKLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fc2VuZF9jb25maWRlbmNlX2xldmVscygKLQkJc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzICppZHMsCi0JCXUzMiBzZXRfcGFyYW1fb3Bjb2RlKQotewotCXU4ICpwYWNrZXQ7Ci0Jc2l6ZV90IHBrdF9zaXplOwotCXN0cnVjdCBsc21fY21kX3NldF9wYXJhbXNfY29uZiAqY29uZl9wYXJhbXM7Ci0Jc3RydWN0IGFwcl9oZHIgKm1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9taW5fY29uZmlkZW5jZV9sZXZlbHMgKmNmbDsKLQl1aW50OF90IGkgPSAwOwotCXVpbnQ4X3QgcGFkZF9zaXplID0gMDsKLQl1OCAqY29uZl9sZXZlbHM7Ci0JaW50IHJjOwotCXUzMiBwYXlsb2FkX3NpemUsIHBhcmFtX3NpemU7Ci0KLQlwYWRkX3NpemUgPSAoNCAtIChjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyAlIDQpKSAtIDE7Ci0JcGt0X3NpemUgPSBzaXplb2YoKmNvbmZfcGFyYW1zKSArIHBhZGRfc2l6ZSArCi0JCSAgIGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCi0JcGFja2V0ID0ga3phbGxvYyhwa3Rfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWNrZXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY29uZl9wYXJhbXMgPSAoc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtc19jb25mICopIHBhY2tldDsKLQljb25mX2xldmVscyA9ICh1OCAqKSAocGFja2V0ICsgc2l6ZW9mKCpjb25mX3BhcmFtcykpOwotCW1zZ19oZHIgPSAmY29uZl9wYXJhbXMtPm1zZ19oZHI7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsCi0JCSAgICAgIHBrdF9zaXplLCB0cnVlKTsKLQltc2dfaGRyLT5vcGNvZGUgPSBzZXRfcGFyYW1fb3Bjb2RlOwotCXBheWxvYWRfc2l6ZSA9IHBrdF9zaXplIC0gc2l6ZW9mKCptc2dfaGRyKSAtCi0JCSAgICAgICBzaXplb2YoY29uZl9wYXJhbXMtPnBhcmFtc19oZHIpOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmY29uZl9wYXJhbXMtPnBhcmFtc19oZHIsCi0JCQkJIHBheWxvYWRfc2l6ZSwgMCwgMCwgMCk7Ci0JY2ZsID0gJmNvbmZfcGFyYW1zLT5jb25mX3BheWxvYWQ7Ci0JcGFyYW1fc2l6ZSA9ICgoc2l6ZW9mKHVpbnQ4X3QpICsgcGFkZF9zaXplICsKLQkJICAgICAgIGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKSkgKgotCQkgICAgICBzaXplb2YodWludDhfdCk7Ci0JcTZsc21fc2V0X3BhcmFtX2NvbW1vbigmY2ZsLT5jb21tb24sIGlkcywKLQkJCSAgICAgICBwYXJhbV9zaXplLCBzZXRfcGFyYW1fb3Bjb2RlKTsKLQljZmwtPm51bV9jb25maWRlbmNlX2xldmVscyA9IGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzOwotCi0JcHJfZGVidWcoIiVzOiBDTUQgUEFSQU0gU0laRSA9ICVkXG4iLAotCQkgX19mdW5jX18sIHBhcmFtX3NpemUpOwotCXByX2RlYnVnKCIlczogTnVtIGNvbmZfbGV2ZWwgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBjbGllbnQtPm51bV9jb25maWRlbmNlX2xldmVscyk7Ci0KLQltZW1jcHkoY29uZl9sZXZlbHMsIGNsaWVudC0+Y29uZmlkZW5jZV9sZXZlbHMsCi0JICAgICAgIGNsaWVudC0+bnVtX2NvbmZpZGVuY2VfbGV2ZWxzKTsKLQlmb3IgKGkgPSAwOyBpIDwgY2xpZW50LT5udW1fY29uZmlkZW5jZV9sZXZlbHM7IGkrKykKLQkJcHJfZGVidWcoIiVzOiBDb25maWRlbmNlX2xldmVsWyVkXSA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBpLCBjb25mX2xldmVsc1tpXSk7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCXBhY2tldCwgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBjb25maWRlbmNlX2xldmVscyBjbWQgZmFpbGVkLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0Ja2ZyZWUocGFja2V0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fc2VuZF9wYXJhbV9vcG1vZGUoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzICpvcG1vZGVfaWRzLAotCQl1MzIgc2V0X3BhcmFtX29wY29kZSkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtc19vcG1vZGUgb3Btb2RlX3BhcmFtczsKLQlzdHJ1Y3QgYXByX2hkciAgKm1zZ19oZHI7Ci0KLQlzdHJ1Y3QgbHNtX3BhcmFtX29wX21vZGUgKm9wX21vZGU7Ci0JdTMyIGRhdGFfcGF5bG9hZF9zaXplLCBwYXJhbV9zaXplOwotCi0JbXNnX2hkciA9ICZvcG1vZGVfcGFyYW1zLm1zZ19oZHI7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsCi0JCSAgICAgIHNpemVvZihvcG1vZGVfcGFyYW1zKSwgdHJ1ZSk7Ci0JbXNnX2hkci0+b3Bjb2RlID0gc2V0X3BhcmFtX29wY29kZTsKLQlkYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZihvcG1vZGVfcGFyYW1zKSAtCi0JCQkgICAgc2l6ZW9mKCptc2dfaGRyKSAtCi0JCQkgICAgc2l6ZW9mKG9wbW9kZV9wYXJhbXMucGFyYW1zX2hkcik7Ci0JcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZvcG1vZGVfcGFyYW1zLnBhcmFtc19oZHIsCi0JCQkJIGRhdGFfcGF5bG9hZF9zaXplLCAwLCAwLCAwKTsKLQlvcF9tb2RlID0gJm9wbW9kZV9wYXJhbXMub3BfbW9kZTsKLQotCi0JcGFyYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX29wX21vZGUpIC0KLQkJICAgICBzaXplb2Yob3BfbW9kZS0+Y29tbW9uKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZvcF9tb2RlLT5jb21tb24sCi0JCQkgICAgICAgb3Btb2RlX2lkcywgcGFyYW1fc2l6ZSwKLQkJCSAgICAgICBzZXRfcGFyYW1fb3Bjb2RlKTsKLQlvcF9tb2RlLT5taW5vcl92ZXJzaW9uID0gUUxTTV9QQVJBTV9JRF9NSU5PUl9WRVJTSU9OOwotCW9wX21vZGUtPm1vZGUgPSBjbGllbnQtPm1vZGU7Ci0Jb3BfbW9kZS0+cmVzZXJ2ZWQgPSAwOwotCXByX2RlYnVnKCIlczogbW9kZSA9IDB4JXgiLCBfX2Z1bmNfXywgb3BfbW9kZS0+bW9kZSk7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCSZvcG1vZGVfcGFyYW1zLCB0cnVlLCBOVUxMKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCBzZXRfcGFyYW1zIG9wY29kZSAweCV4LCByYyAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtc2dfaGRyLT5vcGNvZGUsIHJjKTsKLQotCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi12b2lkIHNldF9sc21fcG9ydChpbnQgbHNtX3BvcnQpCi17Ci0JbHNtX2FmZV9wb3J0ID0gbHNtX3BvcnQ7Ci19Ci0KLWludCBnZXRfbHNtX3BvcnQodm9pZCkKLXsKLQlyZXR1cm4gbHNtX2FmZV9wb3J0OwotfQotCi1pbnQgcTZsc21fc2V0X3BvcnRfY29ubmVjdGVkKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBsc21fY21kX3NldF9jb25uZWN0cG9ydCBjb25uZWN0cG9ydDsKLQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgY29ubmVjdHBvcnRfaWRzOwotCXN0cnVjdCBhcHJfaGRyICptc2dfaGRyOwotCXN0cnVjdCBsc21fcGFyYW1fY29ubmVjdF90b19wb3J0ICpjb25uZWN0X3RvX3BvcnQ7Ci0JdTMyIGRhdGFfcGF5bG9hZF9zaXplLCBwYXJhbV9zaXplLCBzZXRfcGFyYW1fb3Bjb2RlOwotCi0JaWYgKGNsaWVudC0+dXNlX3RvcG9sb2d5KSB7Ci0JCXNldF9wYXJhbV9vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjsKLQkJY29ubmVjdHBvcnRfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfRlJBTUVXT1JLOwotCQljb25uZWN0cG9ydF9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfQ09OTkVDVF9UT19QT1JUOwotCX0gZWxzZSB7Ci0JCXNldF9wYXJhbV9vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUzsKLQkJY29ubmVjdHBvcnRfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfVk9JQ0VfV0FLRVVQOwotCQljb25uZWN0cG9ydF9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfQ09OTkVDVF9UT19QT1JUOwotCX0KLQljbGllbnQtPmNvbm5lY3RfdG9fcG9ydCA9IGdldF9sc21fcG9ydCgpOwotCi0JbXNnX2hkciA9ICZjb25uZWN0cG9ydC5tc2dfaGRyOwotCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBtc2dfaGRyLAotCQkgICAgICBzaXplb2YoY29ubmVjdHBvcnQpLCB0cnVlKTsKLQltc2dfaGRyLT5vcGNvZGUgPSBzZXRfcGFyYW1fb3Bjb2RlOwotCWRhdGFfcGF5bG9hZF9zaXplID0gc2l6ZW9mKGNvbm5lY3Rwb3J0KSAtCi0JCQkgICAgc2l6ZW9mKCptc2dfaGRyKSAtCi0JCQkgICAgc2l6ZW9mKGNvbm5lY3Rwb3J0LnBhcmFtc19oZHIpOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmY29ubmVjdHBvcnQucGFyYW1zX2hkciwKLQkJCQkgZGF0YV9wYXlsb2FkX3NpemUsIDAsIDAsIDApOwotCWNvbm5lY3RfdG9fcG9ydCA9ICZjb25uZWN0cG9ydC5jb25uZWN0X3RvX3BvcnQ7Ci0KLQlwYXJhbV9zaXplID0gKHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX2Nvbm5lY3RfdG9fcG9ydCkgLQotCQkgICAgICBzaXplb2YoY29ubmVjdF90b19wb3J0LT5jb21tb24pKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZjb25uZWN0X3RvX3BvcnQtPmNvbW1vbiwKLQkJCSAgICAgICAmY29ubmVjdHBvcnRfaWRzLCBwYXJhbV9zaXplLAotCQkJICAgICAgIHNldF9wYXJhbV9vcGNvZGUpOwotCWNvbm5lY3RfdG9fcG9ydC0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTjsKLQljb25uZWN0X3RvX3BvcnQtPnBvcnRfaWQgPSBjbGllbnQtPmNvbm5lY3RfdG9fcG9ydDsKLQljb25uZWN0X3RvX3BvcnQtPnJlc2VydmVkID0gMDsKLQlwcl9kZWJ1ZygiJXM6IHBvcnQ9ICVkIiwgX19mdW5jX18sIGNvbm5lY3RfdG9fcG9ydC0+cG9ydF9pZCk7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCSZjb25uZWN0cG9ydCwgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgc2V0X3BhcmFtcyBvcGNvZGUgMHgleCwgcmMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgbXNnX2hkci0+b3Bjb2RlLCByYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1zdGF0aWMgaW50IHE2bHNtX3NlbmRfcGFyYW1fcG9sbGluZ19lbmFibGUoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJYm9vbCBwb2xsX2VuLAotCQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgKnBvbGxfZW5hYmxlX2lkcywKLQkJdTMyIHNldF9wYXJhbV9vcGNvZGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbHNtX2NtZF9wb2xsX2VuYWJsZSBjbWQ7Ci0Jc3RydWN0IGFwcl9oZHIgICptc2dfaGRyOwotCXN0cnVjdCBsc21fcGFyYW1fcG9sbF9lbmFibGUgKnBvbGxfZW5hYmxlOwotCXUzMiBkYXRhX3BheWxvYWRfc2l6ZSwgcGFyYW1fc2l6ZTsKLQotCW1zZ19oZHIgPSAmY21kLm1zZ19oZHI7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgbHNtX2NtZF9wb2xsX2VuYWJsZSksIHRydWUpOwotCW1zZ19oZHItPm9wY29kZSA9IHNldF9wYXJhbV9vcGNvZGU7Ci0JZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2Yoc3RydWN0IGxzbV9jbWRfcG9sbF9lbmFibGUpIC0KLQkJCSAgICBzaXplb2Yoc3RydWN0IGFwcl9oZHIpIC0KLQkJCSAgICBzaXplb2Yoc3RydWN0IGxzbV9zZXRfcGFyYW1zX2hkcik7Ci0JcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZjbWQucGFyYW1zX2hkciwKLQkJCQkgZGF0YV9wYXlsb2FkX3NpemUsIDAsIDAsIDApOwotCXBvbGxfZW5hYmxlID0gJmNtZC5wb2xsX2VuYWJsZTsKLQotCXBhcmFtX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1fcG9sbF9lbmFibGUpIC0KLQkJICAgICAgc2l6ZW9mKHBvbGxfZW5hYmxlLT5jb21tb24pKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZwb2xsX2VuYWJsZS0+Y29tbW9uLAotCQkJICAgICAgIHBvbGxfZW5hYmxlX2lkcywgcGFyYW1fc2l6ZSwKLQkJCSAgICAgICBzZXRfcGFyYW1fb3Bjb2RlKTsKLQlwb2xsX2VuYWJsZS0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTjsKLQlwb2xsX2VuYWJsZS0+cG9sbGluZ19lbmFibGUgPSAocG9sbF9lbikgPyAxIDogMDsKLQlwcl9kZWJ1ZygiJXM6IHBvbGwgZW5hYmxlPSAlZCIsIF9fZnVuY19fLCBwb2xsX2VuYWJsZS0+cG9sbGluZ19lbmFibGUpOwotCi0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKLQkJCQkmY21kLCB0cnVlLCBOVUxMKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCBzZXRfcGFyYW1zIG9wY29kZSAweCV4LCByYyAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtc2dfaGRyLT5vcGNvZGUsIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IHE2bHNtX3NldF9md2tfbW9kZV9jZmcoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJCSAgIHVpbnQzMl90IGV2ZW50X21vZGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbHNtX2NtZF9zZXRfZndrX21vZGVfY2ZnIGNtZDsKLQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgZndrX21vZGVfY2ZnX2lkczsKLQlzdHJ1Y3QgYXByX2hkciAgKm1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9md2tfbW9kZV9jZmcgKmZ3a19tb2RlX2NmZzsKLQl1MzIgZGF0YV9wYXlsb2FkX3NpemUsIHBhcmFtX3NpemUsIHNldF9wYXJhbV9vcGNvZGU7Ci0KLQlpZiAoY2xpZW50LT51c2VfdG9wb2xvZ3kpIHsKLQkJc2V0X3BhcmFtX29wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOwotCQlmd2tfbW9kZV9jZmdfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfRlJBTUVXT1JLOwotCQlmd2tfbW9kZV9jZmdfaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0ZXS19NT0RFX0NPTkZJRzsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IElnbm9yZSBzZW5kaW5nIGV2ZW50IG1vZGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCW1zZ19oZHIgPSAmY21kLm1zZ19oZHI7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgbHNtX2NtZF9zZXRfZndrX21vZGVfY2ZnKSwgdHJ1ZSk7Ci0JbXNnX2hkci0+b3Bjb2RlID0gc2V0X3BhcmFtX29wY29kZTsKLQlkYXRhX3BheWxvYWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbHNtX2NtZF9zZXRfZndrX21vZGVfY2ZnKSAtCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSAtCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIpOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmY21kLnBhcmFtc19oZHIsCi0JCQkJIGRhdGFfcGF5bG9hZF9zaXplLCAwLCAwLCAwKTsKLQlmd2tfbW9kZV9jZmcgPSAmY21kLmZ3a19tb2RlX2NmZzsKLQotCXBhcmFtX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBsc21fcGFyYW1fZndrX21vZGVfY2ZnKSAtCi0JCSAgICAgIHNpemVvZihmd2tfbW9kZV9jZmctPmNvbW1vbikpOwotCXE2bHNtX3NldF9wYXJhbV9jb21tb24oJmZ3a19tb2RlX2NmZy0+Y29tbW9uLAotCQkJICAgICAgICZmd2tfbW9kZV9jZmdfaWRzLCBwYXJhbV9zaXplLAotCQkJICAgICAgIHNldF9wYXJhbV9vcGNvZGUpOwotCi0JZndrX21vZGVfY2ZnLT5taW5vcl92ZXJzaW9uID0gUUxTTV9QQVJBTV9JRF9NSU5PUl9WRVJTSU9OOwotCWZ3a19tb2RlX2NmZy0+bW9kZSA9IGV2ZW50X21vZGU7Ci0JcHJfZGVidWcoIiVzOiBtb2RlID0gJWRcbiIsIF9fZnVuY19fLCBmd2tfbW9kZV9jZmctPm1vZGUpOwotCi0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKLQkJCQkmY21kLCB0cnVlLCBOVUxMKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCBzZXRfcGFyYW1zIG9wY29kZSAweCV4LCByYyAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtc2dfaGRyLT5vcGNvZGUsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fYXJyYW5nZV9tY2hfbWFwKHN0cnVjdCBsc21fcGFyYW1fbWVkaWFfZm10ICptZWRpYV9mbXQsCi0JCQkgaW50IGNoYW5uZWxfY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCW1lbXNldChtZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZywgMCwgTFNNX01BWF9OVU1fQ0hBTk5FTFMpOwotCi0Jc3dpdGNoIChjaGFubmVsX2NvdW50KSB7Ci0JY2FzZSAxOgotCQltZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZDOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCW1lZGlhX2ZtdC0+Y2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCW1lZGlhX2ZtdC0+Y2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJbWVkaWFfZm10LT5jaGFubmVsX21hcHBpbmdbMF0gPSBQQ01fQ0hBTk5FTF9GTDsKLQkJbWVkaWFfZm10LT5jaGFubmVsX21hcHBpbmdbMV0gPSBQQ01fQ0hBTk5FTF9GUjsKLQkJbWVkaWFfZm10LT5jaGFubmVsX21hcHBpbmdbMl0gPSBQQ01fQ0hBTk5FTF9GQzsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQltZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZ1swXSA9IFBDTV9DSEFOTkVMX0ZMOwotCQltZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZ1sxXSA9IFBDTV9DSEFOTkVMX0ZSOwotCQltZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZ1syXSA9IFBDTV9DSEFOTkVMX0xTOwotCQltZWRpYV9mbXQtPmNoYW5uZWxfbWFwcGluZ1szXSA9IFBDTV9DSEFOTkVMX1JTOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG51bV9jaGFuICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbF9jb3VudCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotaW50IHE2bHNtX3NldF9tZWRpYV9mbXRfcGFyYW1zKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbHNtX2NtZF9zZXRfbWVkaWFfZm10IGNtZDsKLQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgbWVkaWFfZm10X2lkczsKLQlzdHJ1Y3QgYXByX2hkciAgKm1zZ19oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9tZWRpYV9mbXQgKm1lZGlhX2ZtdDsKLQl1MzIgZGF0YV9wYXlsb2FkX3NpemUsIHBhcmFtX3NpemUsIHNldF9wYXJhbV9vcGNvZGU7Ci0Jc3RydWN0IGxzbV9od19wYXJhbXMgcGFyYW0gPSBjbGllbnQtPmh3X3BhcmFtczsKLQotCWlmIChjbGllbnQtPnVzZV90b3BvbG9neSkgewotCQlzZXRfcGFyYW1fb3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI7Ci0JCW1lZGlhX2ZtdF9pZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9GUkFNRVdPUks7Ci0JCW1lZGlhX2ZtdF9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfTUVESUFfRk1UOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogSWdub3JlIHNlbmRpbmcgbWVkaWEgZm9ybWF0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQltc2dfaGRyID0gJmNtZC5tc2dfaGRyOwotCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBtc2dfaGRyLAotCQkgICAgICBzaXplb2Yoc3RydWN0IGxzbV9jbWRfc2V0X21lZGlhX2ZtdCksIHRydWUpOwotCW1zZ19oZHItPm9wY29kZSA9IHNldF9wYXJhbV9vcGNvZGU7Ci0JZGF0YV9wYXlsb2FkX3NpemUgPSBzaXplb2Yoc3RydWN0IGxzbV9jbWRfc2V0X21lZGlhX2ZtdCkgLQotCQkJICAgIHNpemVvZihzdHJ1Y3QgYXByX2hkcikgLQotCQkJICAgIHNpemVvZihzdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyKTsKLQlxNmxzbV9zZXRfcGFyYW1faGRyX2luZm8oJmNtZC5wYXJhbXNfaGRyLAotCQkJCSBkYXRhX3BheWxvYWRfc2l6ZSwgMCwgMCwgMCk7Ci0JbWVkaWFfZm10ID0gJmNtZC5tZWRpYV9mbXQ7Ci0KLQlwYXJhbV9zaXplID0gKHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX21lZGlhX2ZtdCkgLQotCQkgICAgICBzaXplb2YobWVkaWFfZm10LT5jb21tb24pKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZtZWRpYV9mbXQtPmNvbW1vbiwKLQkJCSAgICAgICAmbWVkaWFfZm10X2lkcywgcGFyYW1fc2l6ZSwKLQkJCSAgICAgICBzZXRfcGFyYW1fb3Bjb2RlKTsKLQotCW1lZGlhX2ZtdC0+bWlub3JfdmVyc2lvbiA9IFFMU01fUEFSQU1fSURfTUlOT1JfVkVSU0lPTl8yOwotCW1lZGlhX2ZtdC0+c2FtcGxlX3JhdGUgPSBwYXJhbS5zYW1wbGVfcmF0ZTsKLQltZWRpYV9mbXQtPm51bV9jaGFubmVscyA9IHBhcmFtLm51bV9jaHM7Ci0JbWVkaWFfZm10LT5iaXRfd2lkdGggPSBwYXJhbS5zYW1wbGVfc2l6ZTsKLQotCXJjID0gcTZsc21fYXJyYW5nZV9tY2hfbWFwKG1lZGlhX2ZtdCwgbWVkaWFfZm10LT5udW1fY2hhbm5lbHMpOwotCWlmIChyYykKLQkJZ290byBlcnJfcmV0OwotCi0JcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZT0gJWQsIGNoYW5uZWxzICVkIGJpdCB3aWR0aCAlZFxuIiwKLQkJIF9fZnVuY19fLCBtZWRpYV9mbXQtPnNhbXBsZV9yYXRlLCBtZWRpYV9mbXQtPm51bV9jaGFubmVscywKLQkJIG1lZGlhX2ZtdC0+Yml0X3dpZHRoKTsKLQotCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCi0JCQkJJmNtZCwgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgc2V0X3BhcmFtcyBvcGNvZGUgMHgleCwgcmMgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbXNnX2hkci0+b3Bjb2RlLCByYyk7Ci1lcnJfcmV0OgotCXJldHVybiByYzsKLX0KLQotaW50IHE2bHNtX3NldF9kYXRhKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCi0JCQkgICBlbnVtIGxzbV9kZXRlY3Rpb25fbW9kZSBtb2RlLAotCQkJICAgYm9vbCBkZXRlY3RmYWlsdXJlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzIG9wbW9kZV9pZHM7Ci0Jc3RydWN0IGxzbV9tb2R1bGVfcGFyYW1faWRzIGNvbmZfbGV2ZWxzX2lkczsKLQotCWlmICghY2xpZW50LT5jb25maWRlbmNlX2xldmVscykgewotCQkvKgotCQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNvbmZpZGVuY2UgbGV2ZWxzIGFyZQotCQkgKiBub3QgcHJvdmlkZWQuIFRoaXMgaXMgbm90IGEgZXJyb3IgY29uZGl0aW9uLgotCQkgKiBSZXR1cm4gZ3JhY2VmdWxseSB3aXRob3V0IGFueSBlcnJvcgotCQkgKi8KLQkJcHJfZGVidWcoIiVzOiBubyBjb25mIGxldmVscyB0byBzZXRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlpZiAobW9kZSA9PSBMU01fTU9ERV9LRVlXT1JEX09OTFlfREVURUNUSU9OKSB7Ci0JCWNsaWVudC0+bW9kZSA9IDB4MDE7Ci0JfSBlbHNlIGlmIChtb2RlID09IExTTV9NT0RFX1VTRVJfS0VZV09SRF9ERVRFQ1RJT04pIHsKLQkJY2xpZW50LT5tb2RlID0gMHgwMzsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZGV0ZWN0aW9uIG1vZGUgJWRcbiIsIF9fZnVuY19fLCBtb2RlKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZXQ7Ci0JfQotCWNsaWVudC0+bW9kZSB8PSBkZXRlY3RmYWlsdXJlIDw8IDI7Ci0KLQlvcG1vZGVfaWRzLm1vZHVsZV9pZCA9IExTTV9NT0RVTEVfSURfVk9JQ0VfV0FLRVVQOwotCW9wbW9kZV9pZHMucGFyYW1faWQgPSBMU01fUEFSQU1fSURfT1BFUkFUSU9OX01PREU7Ci0KLQlyYyA9IHE2bHNtX3NlbmRfcGFyYW1fb3Btb2RlKGNsaWVudCwgJm9wbW9kZV9pZHMsCi0JCQkJCUxTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKLQlpZiAocmMpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBsc20gY29uZmlnIHBhcmFtcyAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQljb25mX2xldmVsc19pZHMubW9kdWxlX2lkID0gTFNNX01PRFVMRV9JRF9WT0lDRV9XQUtFVVA7Ci0JY29uZl9sZXZlbHNfaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX01JTl9DT05GSURFTkNFX0xFVkVMUzsKLQotCXJjID0gcTZsc21fc2VuZF9jb25maWRlbmNlX2xldmVscyhjbGllbnQsICZjb25mX2xldmVsc19pZHMsCi0JCQkJCSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUyk7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZW5kIGNvbmZfbGV2ZWxzLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCWdvdG8gZXJyX3JldDsKLQl9Ci0KLQlyYyA9IHE2bHNtX3NlbmRfY2FsKGNsaWVudCwgTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVMpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2VuZCBjYWxpYnJhdGlvbiBkYXRhICVkXG4iLAotCQkJX19mdW5jX18sIHJjKTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotZXJyX3JldDoKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmxzbV9yZWdpc3Rlcl9zb3VuZF9tb2RlbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJICAgICAgIGVudW0gbHNtX2RldGVjdGlvbl9tb2RlIG1vZGUsCi0JCQkgICAgICAgYm9vbCBkZXRlY3RmYWlsdXJlKQotewotCWludCByYzsKLQlzdHJ1Y3QgbHNtX2NtZF9yZWdfc25kX21vZGVsIGNtZDsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JcmMgPSBxNmxzbV9zZXRfZGF0YShjbGllbnQsIG1vZGUsIGRldGVjdGZhaWx1cmUpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGxzbSBkYXRhLCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJmNtZC5oZHIsIHNpemVvZihjbWQpLCB0cnVlKTsKLQljbWQuaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9SRUdJU1RFUl9TT1VORF9NT0RFTDsKLQljbWQubW9kZWxfYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGNsaWVudC0+c291bmRfbW9kZWwucGh5cyk7Ci0JY21kLm1vZGVsX2FkZHJfbXN3ID0gbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCQljbGllbnQtPnNvdW5kX21vZGVsLnBoeXMpOwotCWNtZC5tb2RlbF9zaXplID0gY2xpZW50LT5zb3VuZF9tb2RlbC5zaXplOwotCS8qIHJlYWQgdXBkYXRlZCBtZW1fbWFwX2hhbmRsZSBieSBxNmxzbV9tbWFwY2FsbGJhY2sgKi8KLQlybWIoKTsKLQljbWQubWVtX21hcF9oYW5kbGUgPSBjbGllbnQtPnNvdW5kX21vZGVsLm1lbV9tYXBfaGFuZGxlOwotCi0JcHJfZGVidWcoIiVzOiBhZGRyICVwSywgc2l6ZSAlZCwgaGFuZGxlIDB4JXhcbiIsIF9fZnVuY19fLAotCQkmY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzLCBjbWQubW9kZWxfc2l6ZSwgY21kLm1lbV9tYXBfaGFuZGxlKTsKLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLCAmY21kLCB0cnVlLCBOVUxMKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCBjbWQgb3BbMHgleF1yY1slZF1cbiIsIF9fZnVuY19fLAotCQkgICAgICAgY21kLmhkci5vcGNvZGUsIHJjKTsKLQllbHNlCi0JCXByX2RlYnVnKCIlczogUmVnaXN0ZXIgc291bmQgbW9kZWwgc3VjY2VlZGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmxzbV9kZXJlZ2lzdGVyX3NvdW5kX21vZGVsKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJjOwotCXN0cnVjdCBsc21fY21kX3JlZ19zbmRfbW9kZWwgY21kOwotCi0JaWYgKCFjbGllbnQpIHsKLQkJcHJfZXJyKCJBUFIgaGFuZGxlIE5VTExcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFjbGllbnQtPmFwcikgewotCQlwcl9lcnIoIkFQUiBjbGllbnQgaGFuZGxlIE5VTExcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsICZjbWQuaGRyLCBzaXplb2YoY21kLmhkciksIGZhbHNlKTsKLQljbWQuaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9ERVJFR0lTVEVSX1NPVU5EX01PREVMOwotCi0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgJmNtZC5oZHIsIHRydWUsIE5VTEwpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgY21kIG9wY29kZSAweCV4LCByYyAlZFxuIiwgX19mdW5jX18sCi0JCSAgICAgICBjbWQuaGRyLm9wY29kZSwgcmMpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogRGVyZWdpc3RlciBzb3VuZCBtb2RlbCBzdWNjZWVkZWRcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlxNmxzbV9zbmRfbW9kZWxfYnVmX2ZyZWUoY2xpZW50KTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgcTZsc21fYWRkX21tYXBoZHIoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgc3RydWN0IGFwcl9oZHIgKmhkciwKLQkJCSAgICAgIHUzMiBwa3Rfc2l6ZSwgdTMyIGNtZF9mbGcsIHUzMiB0b2tlbikKLXsKLQlwcl9kZWJ1ZygiJXM6IHBrdCBzaXplPSVkIGNtZF9mbGc9JWQgc2Vzc2lvbj0lZFxuIiwgX19mdW5jX18sIHBrdF9zaXplLAotCQkgY21kX2ZsZywgY2xpZW50LT5zZXNzaW9uKTsKLQloZHItPmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJICAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQloZHItPnNyY19wb3J0ID0gMHgwMDsKLQloZHItPmRlc3RfcG9ydCA9IGNsaWVudC0+c2Vzc2lvbjsKLQlpZiAoY21kX2ZsZykKLQkJaGRyLT50b2tlbiA9IHRva2VuOwotCWhkci0+cGt0X3NpemUgPSBwa3Rfc2l6ZTsKLX0KLQotc3RhdGljIGludCBxNmxzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgZG1hX2FkZHJfdCBkbWFfYWRkcl9wLCB1aW50MzJfdCBkbWFfYnVmX3N6LAotCQkJCSAgICB1aW50MzJfdCAqbW1hcF9wKQotewotCXN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKm1tYXBfcmVnaW9ucyA9IE5VTEw7Ci0Jc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICptcmVnaW9ucyA9IE5VTEw7Ci0Jdm9pZCAqbW1hcF9yZWdpb25fY21kID0gTlVMTDsKLQl2b2lkICpwYXlsb2FkID0gTlVMTDsKLQlpbnQgcmM7Ci0JaW50IGNtZF9zaXplID0gMDsKLQotCXByX2RlYnVnKCIlczogZG1hX2FkZHJfcCAweCVwSywgZG1hX2J1Zl9zeiAlZCwgbW1hcF9wIDB4JXBLLCBzZXNzaW9uICVkXG4iLAotCQlfX2Z1bmNfXywgJmRtYV9hZGRyX3AsIGRtYV9idWZfc3osIG1tYXBfcCwKLQkJY2xpZW50LT5zZXNzaW9uKTsKLQlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSArCi0JCSAgIHNpemVvZihzdHJ1Y3QgYXZzX3NoYXJlZF9tYXBfcmVnaW9uX3BheWxvYWQpOwotCi0JbW1hcF9yZWdpb25fY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtbWFwX3JlZ2lvbl9jbWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbW1hcF9yZWdpb25zID0gKHN0cnVjdCBhdnNfY21kX3NoYXJlZF9tZW1fbWFwX3JlZ2lvbnMgKiltbWFwX3JlZ2lvbl9jbWQ7Ci0JcTZsc21fYWRkX21tYXBoZHIoY2xpZW50LCAmbW1hcF9yZWdpb25zLT5oZHIsIGNtZF9zaXplLCB0cnVlLAotCQkJICAoY2xpZW50LT5zZXNzaW9uIDw8IDgpKTsKLQotCW1tYXBfcmVnaW9ucy0+aGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX01BUF9SRUdJT05TOwotCW1tYXBfcmVnaW9ucy0+bWVtX3Bvb2xfaWQgPSBBRFNQX01FTU9SWV9NQVBfU0hNRU04XzRLX1BPT0w7Ci0JbW1hcF9yZWdpb25zLT5udW1fcmVnaW9ucyA9IDE7Ci0JbW1hcF9yZWdpb25zLT5wcm9wZXJ0eV9mbGFnID0gMHgwMDsKLQlwYXlsb2FkID0gKCh1OCAqKW1tYXBfcmVnaW9uX2NtZCArCi0JCSAgIHNpemVvZihzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX21hcF9yZWdpb25zKSk7Ci0JbXJlZ2lvbnMgPSAoc3RydWN0IGF2c19zaGFyZWRfbWFwX3JlZ2lvbl9wYXlsb2FkICopcGF5bG9hZDsKLQotCW1yZWdpb25zLT5zaG1fYWRkcl9sc3cgPSBsb3dlcl8zMl9iaXRzKGRtYV9hZGRyX3ApOwotCW1yZWdpb25zLT5zaG1fYWRkcl9tc3cgPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhkbWFfYWRkcl9wKTsKLQltcmVnaW9ucy0+bWVtX3NpemVfYnl0ZXMgPSBkbWFfYnVmX3N6OwotCi0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPm1tYXBfYXByLCBtbWFwX3JlZ2lvbl9jbWQsCi0JCQkJdHJ1ZSwgbW1hcF9wKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IEZhaWxlZCBtbWFwX3JlZ2lvbnMgb3Bjb2RlIDB4JXgsIHJjICVkXG4iLAotCQkJX19mdW5jX18sIG1tYXBfcmVnaW9ucy0+aGRyLm9wY29kZSwgcmMpOwotCi0JcHJfZGVidWcoIiVzOiBsZWF2ZSAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQlrZnJlZShtbWFwX3JlZ2lvbl9jbWQpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNmxzbV9tZW1vcnlfdW5tYXBfcmVnaW9ucyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgIHVpbnQzMl90IGhhbmRsZSkKLXsKLQlzdHJ1Y3QgYXZzX2NtZF9zaGFyZWRfbWVtX3VubWFwX3JlZ2lvbnMgdW5tYXA7Ci0JaW50IHJjID0gMDsKLQlpbnQgY21kX3NpemUgPSAwOwotCi0JaWYgKENIRUNLX1NFU1NJT04oY2xpZW50LT5zZXNzaW9uKSkgewotCQlwcl9lcnIoIiVzOiBzZXNzaW9uWyVkXSIsIF9fZnVuY19fLCBjbGllbnQtPnNlc3Npb24pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY21kX3NpemUgPSBzaXplb2Yoc3RydWN0IGF2c19jbWRfc2hhcmVkX21lbV91bm1hcF9yZWdpb25zKTsKLQlxNmxzbV9hZGRfbW1hcGhkcihjbGllbnQsICZ1bm1hcC5oZHIsIGNtZF9zaXplLAotCQkJICB0cnVlLCAoY2xpZW50LT5zZXNzaW9uIDw8IDgpKTsKLQl1bm1hcC5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NIQVJFRF9NRU1fVU5NQVBfUkVHSU9OUzsKLQl1bm1hcC5tZW1fbWFwX2hhbmRsZSA9IGhhbmRsZTsKLQotCXByX2RlYnVnKCIlczogdW5tYXAgaGFuZGxlIDB4JXhcbiIsIF9fZnVuY19fLCB1bm1hcC5tZW1fbWFwX2hhbmRsZSk7Ci0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPm1tYXBfYXByLCAmdW5tYXAsIHRydWUsCi0JCQkJTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgbW1hcF9yZWdpb25zIG9wY29kZSAweCV4IHJjICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHVubWFwLmhkci5vcGNvZGUsIHJjKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBxNmxzbV9zZW5kX2NhbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQkJICB1MzIgc2V0X3BhcmFtc19vcGNvZGUpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zIHBhcmFtczsKLQlzdHJ1Y3QgbHNtX3NldF9wYXJhbXNfaGRyICpwYXJhbXNfaGRyID0gJnBhcmFtcy5wYXJhbV9oZHI7Ci0Jc3RydWN0IGFwcl9oZHIgKm1zZ19oZHIgPSAmcGFyYW1zLm1zZ19oZHI7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzOiBTZXNzaW9uIGlkICVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKLQlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ0FMX0lEWF0pOwotCi0JaWYgKCFjYWxfYmxvY2sgfHwgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplIDw9IDApIHsKLQkJcHJfZGVidWcoIiVzOiBObyBjYWwgdG8gc2VuZCFcbiIsIF9fZnVuY19fKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSAhPSBjbGllbnQtPmxzbV9jYWxfc2l6ZSkgewotCQlwcl9lcnIoIiVzOiBDYWwgc2l6ZSAlemQgZG9lc24ndCBtYXRjaCBsc20gY2FsIHNpemUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplLAotCQkJY2xpZW50LT5sc21fY2FsX3NpemUpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQkvKiBDYWNoZSBtbWFwIGFkZHJlc3MsIG9ubHkgbWFwIG9uY2Ugb3IgaWYgbmV3IGFkZHIgKi8KLQlsc21fY29tbW9uLmNvbW1vbl9jbGllbnRbY2xpZW50LT5zZXNzaW9uXS5zZXNzaW9uID0gY2xpZW50LT5zZXNzaW9uOwotCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBtc2dfaGRyLCBzaXplb2YocGFyYW1zKSwgdHJ1ZSk7Ci0JbXNnX2hkci0+b3Bjb2RlID0gc2V0X3BhcmFtc19vcGNvZGU7Ci0JcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKHBhcmFtc19oZHIsCi0JCQljYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsCi0JCQlsb3dlcl8zMl9iaXRzKGNsaWVudC0+bHNtX2NhbF9waHlfYWRkciksCi0JCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQljbGllbnQtPmxzbV9jYWxfcGh5X2FkZHIpLAotCQkJY2xpZW50LT5zb3VuZF9tb2RlbC5tZW1fbWFwX2hhbmRsZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IENhbCBTaXplID0gJXpkIiwgX19mdW5jX18sCi0JCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7Ci0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgJnBhcmFtcywgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjKQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgc2V0X3BhcmFtcyBvcGNvZGUgMHgleCwgcmMgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgbXNnX2hkci0+b3Bjb2RlLCByYyk7Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXS0+bG9jayk7Ci1kb25lOgotCXJldHVybiByYzsKLX0KLQotCi1pbnQgcTZsc21fc25kX21vZGVsX2J1Zl9mcmVlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJjOwotCi0JcHJfZGVidWcoIiVzOiBTZXNzaW9uIGlkICVkXG4iLCBfX2Z1bmNfXywgY2xpZW50LT5zZXNzaW9uKTsKLQlpZiAoQ0hFQ0tfU0VTU0lPTihjbGllbnQtPnNlc3Npb24pKSB7Ci0JCXByX2VycigiJXM6IHNlc3Npb25bJWRdIiwgX19mdW5jX18sIGNsaWVudC0+c2Vzc2lvbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJmNsaWVudC0+Y21kX2xvY2spOwotCXJjID0gcTZsc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoY2xpZW50LAotCQkJCQljbGllbnQtPnNvdW5kX21vZGVsLm1lbV9tYXBfaGFuZGxlKTsKLQlpZiAocmMpCi0JCXByX2VycigiJXM6IENNRCBNZW1vcnlfdW5tYXBfcmVnaW9ucyBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmMpOwotCi0JaWYgKGNsaWVudC0+c291bmRfbW9kZWwuZGF0YSkgewotCQltc21fYXVkaW9faW9uX2ZyZWUoY2xpZW50LT5zb3VuZF9tb2RlbC5jbGllbnQsCi0JCQkJIGNsaWVudC0+c291bmRfbW9kZWwuaGFuZGxlKTsKLQkJY2xpZW50LT5zb3VuZF9tb2RlbC5jbGllbnQgPSBOVUxMOwotCQljbGllbnQtPnNvdW5kX21vZGVsLmhhbmRsZSA9IE5VTEw7Ci0JCWNsaWVudC0+c291bmRfbW9kZWwuZGF0YSA9IE5VTEw7Ci0JCWNsaWVudC0+c291bmRfbW9kZWwucGh5cyA9IDA7Ci0JCWNsaWVudC0+bHNtX2NhbF9waHlfYWRkciA9IDA7Ci0JCWNsaWVudC0+bHNtX2NhbF9zaXplID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmNtZF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbHNtX2NsaWVudCAqcTZsc21fZ2V0X2xzbV9jbGllbnQoaW50IHNlc3Npb25faWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50ID0gTlVMTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsc21fc2Vzc2lvbl9sb2NrLCBmbGFncyk7Ci0JaWYgKHNlc3Npb25faWQgPCBMU01fTUlOX1NFU1NJT05fSUQgfHwgc2Vzc2lvbl9pZCA+IExTTV9NQVhfU0VTU0lPTl9JRCkKLQkJcHJfZXJyKCIlczogSW52YWxpZCBzZXNzaW9uICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JZWxzZSBpZiAoIWxzbV9zZXNzaW9uW3Nlc3Npb25faWRdKQotCQlwcl9lcnIoIiVzOiBOb3QgYW4gYWN0aXZlIHNlc3Npb24gJWRcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQllbHNlCi0JCWNsaWVudCA9IGxzbV9zZXNzaW9uW3Nlc3Npb25faWRdOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxzbV9zZXNzaW9uX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gY2xpZW50OwotfQotCi0vKgotICogcTZsc21fbW1hcGNhbGxiYWNrIDogYXRvbWljIGNvbnRleHQKLSAqLwotc3RhdGljIGludCBxNmxzbV9tbWFwY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IGNvbW1hbmQ7Ci0JdWludDMyX3QgcmV0Y29kZTsKLQl1aW50MzJfdCBzaWQ7Ci0JY29uc3QgdWludDMyX3QgKnBheWxvYWQgPSBkYXRhLT5wYXlsb2FkOwotCXN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQgPSBOVUxMOwotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKLQkJc2lkID0gKGRhdGEtPnRva2VuID4+IDgpICYgMHgwRjsKLQkJcHJfZGVidWcoIiVzOiBTU1IgZXZlbnQgcmVjZWl2ZWQgMHgleCwgZXZlbnQgMHgleCxcbiIKLQkJCSAicHJvYyAweCV4IFNJRCAweCV4XG4iLCBfX2Z1bmNfXywgZGF0YS0+b3Bjb2RlLAotCQkJIGRhdGEtPnJlc2V0X2V2ZW50LCBkYXRhLT5yZXNldF9wcm9jLCBzaWQpOwotCQlsc21fY29tbW9uLmNvbW1vbl9jbGllbnRbc2lkXS5sc21fY2FsX3BoeV9hZGRyID0gMDsKLQkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoTFNNX01BWF9DQUxfSURYLAotCQkJbHNtX2NvbW1vbi5jYWxfZGF0YSk7Ci0JCWxzbV9jb21tb24uc2V0X2N1c3RvbV90b3BvbG9neSA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWNvbW1hbmQgPSBwYXlsb2FkWzBdOwotCXJldGNvZGUgPSBwYXlsb2FkWzFdOwotCXNpZCA9IChkYXRhLT50b2tlbiA+PiA4KSAmIDB4MEY7Ci0JcHJfZGVidWcoIiVzOiBvcGNvZGUgMHgleCBjb21tYW5kIDB4JXggcmV0dXJuIGNvZGUgMHgleCBTSUQgMHgleFxuIiwKLQkJIF9fZnVuY19fLCBkYXRhLT5vcGNvZGUsIGNvbW1hbmQsIHJldGNvZGUsIHNpZCk7Ci0JY2xpZW50ID0gcTZsc21fZ2V0X2xzbV9jbGllbnQoc2lkKTsKLQlpZiAoIWNsaWVudCkgewotCQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQgYWxyZWFkeSBmcmVlZFxuIiwgX19mdW5jX18sIHNpZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoZGF0YS0+b3Bjb2RlKSB7Ci0JY2FzZSBMU01fU0VTU0lPTl9DTURSU1BfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKLQkJaWYgKGF0b21pY19yZWFkKCZjbGllbnQtPmNtZF9zdGF0ZSkgPT0gQ01EX1NUQVRFX1dBSVRfUkVTUCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1tYXBfbG9jaywgZmxhZ3MpOwotCQkJKm1tYXBfaGFuZGxlX3AgPSBjb21tYW5kOwotCQkJLyogc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSBpbXBsaWVzIGJhcnJpZXIgKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1tYXBfbG9jaywgZmxhZ3MpOwotCQkJYXRvbWljX3NldCgmY2xpZW50LT5jbWRfc3RhdGUsIENNRF9TVEFURV9DTEVBUkVEKTsKLQkJCXdha2VfdXAoJmNsaWVudC0+Y21kX3dhaXQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQVBSX0JBU0lDX1JTUF9SRVNVTFQ6Ci0JCXN3aXRjaCAoY29tbWFuZCkgewotCQljYXNlIExTTV9TRVNTSU9OX0NNRF9TSEFSRURfTUVNX1VOTUFQX1JFR0lPTlM6Ci0JCQlhdG9taWNfc2V0KCZjbGllbnQtPmNtZF9zdGF0ZSwgQ01EX1NUQVRFX0NMRUFSRUQpOwotCQkJd2FrZV91cCgmY2xpZW50LT5jbWRfd2FpdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBMU01fU0VTU0lPTl9DTURfU0hBUkVEX01FTV9NQVBfUkVHSU9OUzoKLQkJCWlmIChyZXRjb2RlICE9IDApIHsKLQkJCQkvKiBlcnJvciBzdGF0ZSwgc2lnbmFsIHRvIHN0b3Agd2FpdGluZyAqLwotCQkJCWlmIChhdG9taWNfcmVhZCgmY2xpZW50LT5jbWRfc3RhdGUpID09Ci0JCQkJCUNNRF9TVEFURV9XQUlUX1JFU1ApIHsKLQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1tYXBfbG9jaywgZmxhZ3MpOwotCQkJCQkvKiBpbXBsaWVzIGJhcnJpZXIgKi8KLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW1hcF9sb2NrLAotCQkJCQkJZmxhZ3MpOwotCQkJCQlhdG9taWNfc2V0KCZjbGllbnQtPmNtZF9zdGF0ZSwKLQkJCQkJCUNNRF9TVEFURV9DTEVBUkVEKTsKLQkJCQkJd2FrZV91cCgmY2xpZW50LT5jbWRfd2FpdCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl93YXJuKCIlczogVW5leHBlY3RlZCBjb21tYW5kIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCWNvbW1hbmQpOwotCQl9Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJcHJfZGVidWcoIiVzOiBjb21tYW5kIDB4JXggcmV0dXJuIGNvZGUgMHgleCBvcGNvZGUgMHgleFxuIiwKLQkJCSBfX2Z1bmNfXywgY29tbWFuZCwgcmV0Y29kZSwgZGF0YS0+b3Bjb2RlKTsKLQkJYnJlYWs7Ci0JfQotCWlmIChjbGllbnQtPmNiKQotCQljbGllbnQtPmNiKGRhdGEtPm9wY29kZSwgZGF0YS0+dG9rZW4sCi0JCQkgICBkYXRhLT5wYXlsb2FkLCBjbGllbnQtPnByaXYpOwotCXJldHVybiAwOwotfQotCi1pbnQgcTZsc21fc25kX21vZGVsX2J1Zl9hbGxvYyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBzaXplX3QgbGVuLAotCQkJICAgICAgYm9vbCBhbGxvY2F0ZV9tb2R1bGVfZGF0YSkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YQkJKmNhbF9ibG9jayA9IE5VTEw7Ci0KLQlzaXplX3QgcGFkX3plcm8gPSAwLCB0b3RhbF9tZW0gPSAwOwotCi0JaWYgKCFjbGllbnQgfHwgbGVuIDw9IExTTV9BTElHTl9CT1VOREFSWSkKLQkJcmV0dXJuIHJjOwotCi0JbXV0ZXhfbG9jaygmY2xpZW50LT5jbWRfbG9jayk7Ci0KLQltdXRleF9sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DQUxfSURYXS0+bG9jayk7Ci0JY2FsX2Jsb2NrID0gY2FsX3V0aWxzX2dldF9vbmx5X2NhbF9ibG9jaygKLQkJbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ0FMX0lEWF0pOwotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCi0JcHJfZGVidWcoIiVzOlNuZCBNb2RlbCBsZW4gPSAlemQgY2FsIHNpemUgJXpkIHBoeXMgYWRkciAlcEsiLCBfX2Z1bmNfXywKLQkJbGVuLCBjYWxfYmxvY2stPmNhbF9kYXRhLnNpemUsCi0JCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQlpZiAoIWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpIHsKLQkJcHJfZXJyKCIlczogTm8gTFNNIGNhbGlicmF0aW9uIHNldCBmb3Igc2Vzc2lvbiIsIF9fZnVuY19fKTsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICghY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhKSB7Ci0KLQkJLyoKLQkJICogaWYgc291bmQgbW9kdWxlIGlzIHNlbnQgYXMgc2V0X3BhcmFtCi0JCSAqIFRoZW4gbWVtb3J5IG5lZWRzIHRvIGJlIGFsbG9jYXRlZCBmb3IKLQkJICogc2V0X3BhcmFtIHBheWxvYWQgYXMgd2VsbC4KLQkJICovCi0JCWlmIChhbGxvY2F0ZV9tb2R1bGVfZGF0YSkKLQkJCWxlbiArPSBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbik7Ci0KLQkJY2xpZW50LT5zb3VuZF9tb2RlbC5zaXplID0gbGVuOwotCQlwYWRfemVybyA9IChMU01fQUxJR05fQk9VTkRBUlkgLQotCQkJICAgIChsZW4gJSBMU01fQUxJR05fQk9VTkRBUlkpKTsKLQkJaWYgKChsZW4gPiBTSVpFX01BWCAtIHBhZF96ZXJvKSB8fAotCQkgICAgKGxlbiArIHBhZF96ZXJvID4KLQkJICAgICBTSVpFX01BWCAtIGNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSkpIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgYWxsb2NhdGlvbiBzaXplLCBsZW4gPSAlemQsIHBhZF96ZXJvID0lemQsIGNhbF9zaXplID0gJXpkXG4iLAotCQkJCV9fZnVuY19fLCBsZW4sIHBhZF96ZXJvLAotCQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7Ci0JCQlyYyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQl0b3RhbF9tZW0gPSBQQUdFX0FMSUdOKHBhZF96ZXJvICsgbGVuICsKLQkJCWNhbF9ibG9jay0+Y2FsX2RhdGEuc2l6ZSk7Ci0JCXByX2RlYnVnKCIlczogUGFkIHplcm9zIHNvdW5kIG1vZGVsICV6ZCBUb3RhbCBtZW0gJXpkXG4iLAotCQkJCSBfX2Z1bmNfXywgcGFkX3plcm8sIHRvdGFsX21lbSk7Ci0JCXJjID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygibHNtX2NsaWVudCIsCi0JCQkJJmNsaWVudC0+c291bmRfbW9kZWwuY2xpZW50LAotCQkJCSZjbGllbnQtPnNvdW5kX21vZGVsLmhhbmRsZSwKLQkJCQl0b3RhbF9tZW0sCi0JCQkJJmNsaWVudC0+c291bmRfbW9kZWwucGh5cywKLQkJCQkmbGVuLAotCQkJCSZjbGllbnQtPnNvdW5kX21vZGVsLmRhdGEpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IEF1ZGlvIElPTiBhbGxvYyBpcyBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCXByX2RlYnVnKCIlczogTGVuZ3RoID0gJXpkXG4iLCBfX2Z1bmNfXywgbGVuKTsKLQljbGllbnQtPmxzbV9jYWxfcGh5X2FkZHIgPSAocGFkX3plcm8gKwotCQkJCSAgICBjbGllbnQtPnNvdW5kX21vZGVsLnBoeXMgKwotCQkJCSAgICBjbGllbnQtPnNvdW5kX21vZGVsLnNpemUpOwotCWNsaWVudC0+bHNtX2NhbF9zaXplID0gY2FsX2Jsb2NrLT5jYWxfZGF0YS5zaXplOwotCW1lbWNweSgoY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhICsgcGFkX3plcm8gKwotCQljbGllbnQtPnNvdW5kX21vZGVsLnNpemUpLAotCSAgICAgICAodWludDMyX3QgKiljYWxfYmxvY2stPmNhbF9kYXRhLmt2YWRkciwgY2xpZW50LT5sc21fY2FsX3NpemUpOwotCXByX2RlYnVnKCIlczogQ29weSBjYWwgc3RhcnQgdmlydF9hZGRyICVwSyBwaHlfYWRkciAlcEtcbiIKLQkJCSAiT2Zmc2V0IGNhbCB2aXJ0dWFsIEFkZHIgJXBLXG4iLCBfX2Z1bmNfXywKLQkJCSBjbGllbnQtPnNvdW5kX21vZGVsLmRhdGEsICZjbGllbnQtPnNvdW5kX21vZGVsLnBoeXMsCi0JCQkgKHBhZF96ZXJvICsgY2xpZW50LT5zb3VuZF9tb2RlbC5kYXRhICsKLQkJCSBjbGllbnQtPnNvdW5kX21vZGVsLnNpemUpKTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBzb3VuZCBtb2RlbCBidXN5XG4iLCBfX2Z1bmNfXyk7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIGZhaWw7Ci0JfQotCW11dGV4X3VubG9jaygmbHNtX2NvbW1vbi5jYWxfZGF0YVtMU01fQ0FMX0lEWF0tPmxvY2spOwotCW11dGV4X3VubG9jaygmY2xpZW50LT5jbWRfbG9jayk7Ci0KLQlyYyA9IHE2bHNtX21lbW9yeV9tYXBfcmVnaW9ucyhjbGllbnQsIGNsaWVudC0+c291bmRfbW9kZWwucGh5cywKLQkJCQkgICAgICBsZW4sCi0JCQkJICAgICAgJmNsaWVudC0+c291bmRfbW9kZWwubWVtX21hcF9oYW5kbGUpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBDTUQgTWVtb3J5X21hcF9yZWdpb25zIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldHVybiAwOwotZmFpbDoKLQltdXRleF91bmxvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NBTF9JRFhdLT5sb2NrKTsKLQltdXRleF91bmxvY2soJmNsaWVudC0+Y21kX2xvY2spOwotZXhpdDoKLQlxNmxzbV9zbmRfbW9kZWxfYnVmX2ZyZWUoY2xpZW50KTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fY21kKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsIGludCBvcGNvZGUsIGJvb2wgd2FpdCkKLXsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JaW50IHJjOwotCi0JcHJfZGVidWcoIiVzOiBlbnRlciBvcGNvZGUgJXggd2FpdCAlZFxuIiwgX19mdW5jX18sIG9wY29kZSwgd2FpdCk7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsICZoZHIsIHNpemVvZihoZHIpLCB0cnVlKTsKLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NUQVJUOgotCWNhc2UgTFNNX1NFU1NJT05fQ01EX1NUT1A6Ci0JY2FzZSBMU01fU0VTU0lPTl9DTURfQ0xPU0VfVFg6Ci0JY2FzZSBMU01fU0VTU0lPTl9DTURfRU9COgotCQloZHIub3Bjb2RlID0gb3Bjb2RlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIG9wY29kZSAweCV4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsICZoZHIsIHdhaXQsIE5VTEwpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogRmFpbGVkIGNvbW1tYW5kIDB4JXhcbiIsIF9fZnVuY19fLCBoZHIub3Bjb2RlKTsKLQotCXByX2RlYnVnKCIlczogbGVhdmUgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2bHNtX3NlbmRfcGFyYW1fZXBkX3RocmVzKAotCQlzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LAotCQl2b2lkICpkYXRhLCBzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgKmlkcykKLXsKLQlzdHJ1Y3Qgc25kX2xzbV9lcF9kZXRfdGhyZXMgKmVwX2RldF9kYXRhOwotCXN0cnVjdCBsc21fY21kX3NldF9lcGRfdGhyZXNob2xkIGVwZF9jbWQ7Ci0Jc3RydWN0IGFwcl9oZHIgKm1zZ19oZHIgPSAmZXBkX2NtZC5tc2dfaGRyOwotCXN0cnVjdCBsc21fc2V0X3BhcmFtc19oZHIgKnBhcmFtX2hkciA9Ci0JCQkmZXBkX2NtZC5wYXJhbV9oZHI7Ci0Jc3RydWN0IGxzbV9wYXJhbV9lcGRfdGhyZXMgKmVwZF90aHJlcyA9Ci0JCQkmZXBkX2NtZC5lcGRfdGhyZXM7Ci0JaW50IHJjOwotCi0JZXBfZGV0X2RhdGEgPSAoc3RydWN0IHNuZF9sc21fZXBfZGV0X3RocmVzICopIGRhdGE7Ci0JcTZsc21fYWRkX2hkcihjbGllbnQsIG1zZ19oZHIsCi0JCSAgICAgIHNpemVvZihlcGRfY21kKSwgdHJ1ZSk7Ci0JbXNnX2hkci0+b3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI7Ci0JcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKHBhcmFtX2hkciwKLQkJc2l6ZW9mKCplcGRfdGhyZXMpLCAwLCAwLCAwKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZlcGRfdGhyZXMtPmNvbW1vbiwgaWRzLAotCQlzaXplb2YoKmVwZF90aHJlcykgLSBzaXplb2YoZXBkX3RocmVzLT5jb21tb24pLAotCQlMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0JZXBkX3RocmVzLT5taW5vcl92ZXJzaW9uID0gUUxTTV9QQVJBTV9JRF9NSU5PUl9WRVJTSU9OOwotCWVwZF90aHJlcy0+ZXBkX2JlZ2luID0gZXBfZGV0X2RhdGEtPmVwZF9iZWdpbjsKLQllcGRfdGhyZXMtPmVwZF9lbmQgPSBlcF9kZXRfZGF0YS0+ZXBkX2VuZDsKLQotCXJjID0gcTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCi0JCQkJJmVwZF9jbWQsIHRydWUsIE5VTEwpOwotCWlmICh1bmxpa2VseShyYykpCi0JCXByX2VycigiJXM6IEVQRF9USFJFU0hPTEQgZmFpbGVkLCByYyAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHE2bHNtX3NlbmRfcGFyYW1fZ2FpbigKLQkJc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwKLQkJdTE2IGdhaW4sIHN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyAqaWRzKQotewotCXN0cnVjdCBsc21fY21kX3NldF9nYWluIGxzbV9jbWRfZ2FpbjsKLQlzdHJ1Y3QgYXByX2hkciAqbXNnX2hkciA9ICZsc21fY21kX2dhaW4ubXNnX2hkcjsKLQlzdHJ1Y3QgbHNtX3BhcmFtX2dhaW4gKmxzbV9nYWluID0gJmxzbV9jbWRfZ2Fpbi5sc21fZ2FpbjsKLQlpbnQgcmM7Ci0KLQlxNmxzbV9hZGRfaGRyKGNsaWVudCwgbXNnX2hkciwKLQkJICAgICAgc2l6ZW9mKGxzbV9jbWRfZ2FpbiksIHRydWUpOwotCW1zZ19oZHItPm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmbHNtX2NtZF9nYWluLnBhcmFtX2hkciwKLQkJCXNpemVvZigqbHNtX2dhaW4pLCAwLCAwLCAwKTsKLQlxNmxzbV9zZXRfcGFyYW1fY29tbW9uKCZsc21fZ2Fpbi0+Y29tbW9uLCBpZHMsCi0JCXNpemVvZigqbHNtX2dhaW4pIC0gc2l6ZW9mKGxzbV9nYWluLT5jb21tb24pLAotCQlMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0JbHNtX2dhaW4tPm1pbm9yX3ZlcnNpb24gPSBRTFNNX1BBUkFNX0lEX01JTk9SX1ZFUlNJT047Ci0JbHNtX2dhaW4tPmdhaW4gPSBnYWluOwotCWxzbV9nYWluLT5yZXNlcnZlZCA9IDA7Ci0KLQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCSZsc21fY21kX2dhaW4sIHRydWUsIE5VTEwpOwotCWlmICh1bmxpa2VseShyYykpCi0JCXByX2VycigiJXM6IExTTV9HQUlOIENNRCBzZW5kIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQkgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBxNmxzbV9zZXRfb25lX3BhcmFtKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IGxzbV9wYXJhbXNfaW5mbyAqcF9pbmZvLCB2b2lkICpkYXRhLAotCXVpbnQzMl90IHBhcmFtX3R5cGUpCi17Ci0JaW50IHJjID0gMCwgcGt0X3N6OwotCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyBpZHM7Ci0JdTggKnBhY2tldDsKLQotCW1lbXNldCgmaWRzLCAwLCBzaXplb2YoaWRzKSk7Ci0Jc3dpdGNoIChwYXJhbV90eXBlKSB7Ci0JY2FzZSBMU01fRU5EUE9JTlRfREVURUNUX1RIUkVTSE9MRDogewotCQlpZHMubW9kdWxlX2lkID0gcF9pbmZvLT5tb2R1bGVfaWQ7Ci0JCWlkcy5wYXJhbV9pZCA9IHBfaW5mby0+cGFyYW1faWQ7Ci0JCXJjID0gcTZsc21fc2VuZF9wYXJhbV9lcGRfdGhyZXMoY2xpZW50LCBkYXRhLAotCQkJCQkJJmlkcyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgTFNNX09QRVJBVElPTl9NT0RFOiB7Ci0JCXN0cnVjdCBzbmRfbHNtX2RldGVjdF9tb2RlICpkZXRfbW9kZSA9IGRhdGE7Ci0JCXN0cnVjdCBsc21fbW9kdWxlX3BhcmFtX2lkcyBvcG1vZGVfaWRzOwotCi0JCWlmIChkZXRfbW9kZS0+bW9kZSA9PSBMU01fTU9ERV9LRVlXT1JEX09OTFlfREVURUNUSU9OKSB7Ci0JCQljbGllbnQtPm1vZGUgPSAweDAxOwotCQl9IGVsc2UgaWYgKGRldF9tb2RlLT5tb2RlID09IExTTV9NT0RFX1VTRVJfS0VZV09SRF9ERVRFQ1RJT04pIHsKLQkJCWNsaWVudC0+bW9kZSA9IDB4MDM7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZGV0ZWN0aW9uIG1vZGUgJWRcbiIsCi0JCQkJX19mdW5jX18sIGRldF9tb2RlLT5tb2RlKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJY2xpZW50LT5tb2RlIHw9IGRldF9tb2RlLT5kZXRlY3RfZmFpbHVyZSA8PCAyOwotCi0JCW9wbW9kZV9pZHMubW9kdWxlX2lkID0gcF9pbmZvLT5tb2R1bGVfaWQ7Ci0JCW9wbW9kZV9pZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOwotCi0JCXJjID0gcTZsc21fc2VuZF9wYXJhbV9vcG1vZGUoY2xpZW50LCAmb3Btb2RlX2lkcywKLQkJCQkJTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjIpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBPUEVSQVRJT05fTU9ERSBmYWlsZWQsIHJjICVkXG4iLAotCQkJCV9fZnVuY19fLCByYyk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgTFNNX0dBSU46IHsKLQkJc3RydWN0IHNuZF9sc21fZ2FpbiAqbHNtX2dhaW4gPSAoc3RydWN0IHNuZF9sc21fZ2FpbiAqKSBkYXRhOwotCi0JCWlkcy5tb2R1bGVfaWQgPSBwX2luZm8tPm1vZHVsZV9pZDsKLQkJaWRzLnBhcmFtX2lkID0gcF9pbmZvLT5wYXJhbV9pZDsKLQkJcmMgPSBxNmxzbV9zZW5kX3BhcmFtX2dhaW4oY2xpZW50LCBsc21fZ2Fpbi0+Z2FpbiwgJmlkcyk7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IExTTV9HQUlOIGNvbW1hbmQgZmFpbGVkLCByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIExTTV9NSU5fQ09ORklERU5DRV9MRVZFTFM6Ci0JCWlkcy5tb2R1bGVfaWQgPSBwX2luZm8tPm1vZHVsZV9pZDsKLQkJaWRzLnBhcmFtX2lkID0gcF9pbmZvLT5wYXJhbV9pZDsKLQkJcmMgPSBxNmxzbV9zZW5kX2NvbmZpZGVuY2VfbGV2ZWxzKGNsaWVudCwgJmlkcywKLQkJCQlMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IENPTkZJREVOQ0VfTEVWRUxTIGNtZCBmYWlsZWQsIHJjICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQljYXNlIExTTV9QT0xMSU5HX0VOQUJMRTogewotCQlzdHJ1Y3Qgc25kX2xzbV9wb2xsX2VuYWJsZSAqbHNtX3BvbGxfZW5hYmxlID0KLQkJCQkoc3RydWN0IHNuZF9sc21fcG9sbF9lbmFibGUgKikgZGF0YTsKLQkJaWRzLm1vZHVsZV9pZCA9IHBfaW5mby0+bW9kdWxlX2lkOwotCQlpZHMucGFyYW1faWQgPSBwX2luZm8tPnBhcmFtX2lkOwotCQlyYyA9IHE2bHNtX3NlbmRfcGFyYW1fcG9sbGluZ19lbmFibGUoY2xpZW50LAotCQkJCWxzbV9wb2xsX2VuYWJsZS0+cG9sbF9lbiwgJmlkcywKLQkJCQlMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMik7Ci0JCWlmIChyYykKLQkJCXByX2VycigiJXM6IFBPTExJTkcgRU5BQkxFIGNtZCBmYWlsZWQsIHJjICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgcmMpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIExTTV9SRUdfU05EX01PREVMOiB7Ci0JCXN0cnVjdCBsc21fY21kX3NldF9wYXJhbXMgbW9kZWxfcGFyYW07Ci0JCXUzMiBwYXlsb2FkX3NpemU7Ci0KLQkJbWVtc2V0KCZtb2RlbF9wYXJhbSwgMCwgc2l6ZW9mKG1vZGVsX3BhcmFtKSk7Ci0JCXE2bHNtX2FkZF9oZHIoY2xpZW50LCAmbW9kZWxfcGFyYW0ubXNnX2hkciwKLQkJCSAgICAgIHNpemVvZihtb2RlbF9wYXJhbSksIHRydWUpOwotCQltb2RlbF9wYXJhbS5tc2dfaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyOwotCQlwYXlsb2FkX3NpemUgPSBwX2luZm8tPnBhcmFtX3NpemUgKwotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uKTsKLQkJcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZtb2RlbF9wYXJhbS5wYXJhbV9oZHIsCi0JCQkJcGF5bG9hZF9zaXplLAotCQkJCWxvd2VyXzMyX2JpdHMoY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzKSwKLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQkJY2xpZW50LT5zb3VuZF9tb2RlbC5waHlzKSwKLQkJCQljbGllbnQtPnNvdW5kX21vZGVsLm1lbV9tYXBfaGFuZGxlKTsKLQotCQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCQkmbW9kZWxfcGFyYW0sIHRydWUsIE5VTEwpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IFJFR19TTkRfTU9ERUwgZmFpbGVkLCByYyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0KLQkJcmMgPSBxNmxzbV9zZW5kX2NhbChjbGllbnQsIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNlbmQgbHNtIGNhbCwgZXJyID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBMU01fREVSRUdfU05EX01PREVMOiB7Ci0JCXN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gKmNvbW1vbjsKLQkJc3RydWN0IGxzbV9jbWRfc2V0X3BhcmFtcyAqcGFyYW07Ci0KLQkJcGt0X3N6ID0gc2l6ZW9mKCpwYXJhbSkgKyBzaXplb2YoKmNvbW1vbik7Ci0JCXBhY2tldCA9IGt6YWxsb2MocGt0X3N6LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWNrZXQpIHsKLQkJCXByX2VycigiJXM6IE5vIG1lbW9yeSBmb3IgREVSRUdfU05EX01PREVMIHBrdCwgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwa3Rfc3opOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlwYXJhbSA9IChzdHJ1Y3QgbHNtX2NtZF9zZXRfcGFyYW1zICopIHBhY2tldDsKLQkJY29tbW9uID0gKHN0cnVjdCBsc21fcGFyYW1fcGF5bG9hZF9jb21tb24gKikKLQkJCQkocGFja2V0ICsgc2l6ZW9mKCpwYXJhbSkpOwotCQlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJnBhcmFtLT5tc2dfaGRyLCBwa3Rfc3osIHRydWUpOwotCQlwYXJhbS0+bXNnX2hkci5vcGNvZGUgPSBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNU19WMjsKLQkJcTZsc21fc2V0X3BhcmFtX2hkcl9pbmZvKCZwYXJhbS0+cGFyYW1faGRyLAotCQkJCQkgc2l6ZW9mKCpjb21tb24pLAotCQkJCQkgMCwgMCwgMCk7Ci0JCWlkcy5tb2R1bGVfaWQgPSBwX2luZm8tPm1vZHVsZV9pZDsKLQkJaWRzLnBhcmFtX2lkID0gcF9pbmZvLT5wYXJhbV9pZDsKLQkJcTZsc21fc2V0X3BhcmFtX2NvbW1vbihjb21tb24sICZpZHMsIDAsCi0JCQkJICAgICAgIExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TX1YyKTsKLQkJcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwKLQkJCQkJcGFja2V0LCB0cnVlLCBOVUxMKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogREVSRUdfU05EX01PREVMIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJa2ZyZWUocGFja2V0KTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBMU01fQ1VTVE9NX1BBUkFNUzogewotCQlzdHJ1Y3QgYXByX2hkciAqaGRyOwotCQl1OCAqY3VzdG9tX2RhdGE7Ci0KLQkJaWYgKHBfaW5mby0+cGFyYW1fc2l6ZSA8Ci0JCSAgICBzaXplb2Yoc3RydWN0IGxzbV9wYXJhbV9wYXlsb2FkX2NvbW1vbikpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcGFyYW1fc2l6ZSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcGt0X3N6ID0gcF9pbmZvLT5wYXJhbV9zaXplICsgc2l6ZW9mKCpoZHIpOwotCQlwYWNrZXQgPSBremFsbG9jKHBrdF9zeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFja2V0KSB7Ci0JCQlwcl9lcnIoIiVzOiBubyBtZW1vcnkgZm9yIENVU1RPTV9QQVJBTVMsIHNpemUgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGt0X3N6KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJaGRyID0gKHN0cnVjdCBhcHJfaGRyICopIHBhY2tldDsKLQkJY3VzdG9tX2RhdGEgPSAodTggKikgKHBhY2tldCArIHNpemVvZigqaGRyKSk7Ci0JCXE2bHNtX2FkZF9oZHIoY2xpZW50LCBoZHIsIHBrdF9zeiwgdHJ1ZSk7Ci0JCWhkci0+b3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1NFVF9QQVJBTVNfVjI7Ci0JCW1lbWNweShjdXN0b21fZGF0YSwgZGF0YSwgcF9pbmZvLT5wYXJhbV9zaXplKTsKLQotCQlyYyA9IHE2bHNtX2Fwcl9zZW5kX3BrdChjbGllbnQsIGNsaWVudC0+YXByLAotCQkJCQlwYWNrZXQsIHRydWUsIE5VTEwpOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBDVVNUT01fUEFSQU1TIGZhaWxlZCwgcmMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJa2ZyZWUocGFja2V0KTsKLQkJYnJlYWs7Ci0JfQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IHdyb25nIHBhcmFtX3R5cGUgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBwX2luZm8tPnBhcmFtX3R5cGUpOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotCi1pbnQgcTZsc21fc3RhcnQoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgYm9vbCB3YWl0KQotewotCXJldHVybiBxNmxzbV9jbWQoY2xpZW50LCBMU01fU0VTU0lPTl9DTURfU1RBUlQsIHdhaXQpOwotfQotCi1pbnQgcTZsc21fc3RvcChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBib29sIHdhaXQpCi17Ci0JcmV0dXJuIHE2bHNtX2NtZChjbGllbnQsIExTTV9TRVNTSU9OX0NNRF9TVE9QLCB3YWl0KTsKLX0KLQotaW50IHE2bHNtX2Nsb3NlKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIHE2bHNtX2NtZChjbGllbnQsIExTTV9TRVNTSU9OX0NNRF9DTE9TRV9UWCwgdHJ1ZSk7Ci19Ci0KLWludCBxNmxzbV9sYWJfY29udHJvbChzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCB1MzIgZW5hYmxlKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGxzbV9wYXJhbXNfbGFiX2VuYWJsZSBsYWJfZW5hYmxlOwotCXN0cnVjdCBsc21fcGFyYW1zX2xhYl9jb25maWcgbGFiX2NvbmZpZzsKLQlzdHJ1Y3QgbHNtX21vZHVsZV9wYXJhbV9pZHMgbGFiX2lkczsKLQl1MzIgcGFyYW1fc2l6ZTsKLQotCWlmICghY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gY2xpZW50ICVwS1xuIiwgX19mdW5jX18sIGNsaWVudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBlbmFibGUvZGlzYWJsZSBsYWIgb24gZHNwICovCi0JcTZsc21fYWRkX2hkcihjbGllbnQsICZsYWJfZW5hYmxlLm1zZ19oZHIsIHNpemVvZihsYWJfZW5hYmxlKSwgdHJ1ZSk7Ci0JbGFiX2VuYWJsZS5tc2dfaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmbGFiX2VuYWJsZS5wYXJhbXNfaGRyLAotCQkJCSBzaXplb2Yoc3RydWN0IGxzbV9sYWJfZW5hYmxlKSwKLQkJCQkgMCwgMCwgMCk7Ci0JcGFyYW1fc2l6ZSA9IChzaXplb2Yoc3RydWN0IGxzbV9sYWJfZW5hYmxlKSAtCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uKSk7Ci0JbGFiX2lkcy5tb2R1bGVfaWQgPSBMU01fTU9EVUxFX0lEX0xBQjsKLQlsYWJfaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0xBQl9FTkFCTEU7Ci0JcTZsc21fc2V0X3BhcmFtX2NvbW1vbigmbGFiX2VuYWJsZS5sYWJfZW5hYmxlLmNvbW1vbiwKLQkJCQkmbGFiX2lkcywgcGFyYW1fc2l6ZSwKLQkJCQlMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUyk7Ci0JbGFiX2VuYWJsZS5sYWJfZW5hYmxlLmVuYWJsZSA9IChlbmFibGUpID8gMSA6IDA7Ci0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgJmxhYl9lbmFibGUsIHRydWUsIE5VTEwpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBMYWIgZW5hYmxlIGZhaWxlZCByYyAlZFxuIiwgX19mdW5jX18sIHJjKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlpZiAoIWVuYWJsZSkKLQkJZ290byBleGl0OwotCS8qIGxhYiBzZXNzaW9uIGlzIGJlaW5nIGVuYWJsZWQgc2V0IHRoZSBjb25maWcgdmFsdWVzICovCi0JcTZsc21fYWRkX2hkcihjbGllbnQsICZsYWJfY29uZmlnLm1zZ19oZHIsIHNpemVvZihsYWJfY29uZmlnKSwgdHJ1ZSk7Ci0JbGFiX2NvbmZpZy5tc2dfaGRyLm9wY29kZSA9IExTTV9TRVNTSU9OX0NNRF9TRVRfUEFSQU1TOwotCXE2bHNtX3NldF9wYXJhbV9oZHJfaW5mbygmbGFiX2NvbmZpZy5wYXJhbXNfaGRyLAotCQkJCSBzaXplb2Yoc3RydWN0IGxzbV9sYWJfY29uZmlnKSwKLQkJCQkgMCwgMCwgMCk7Ci0JbGFiX2lkcy5tb2R1bGVfaWQgPSBMU01fTU9EVUxFX0lEX0xBQjsKLQlsYWJfaWRzLnBhcmFtX2lkID0gTFNNX1BBUkFNX0lEX0xBQl9DT05GSUc7Ci0JcGFyYW1fc2l6ZSA9IChzaXplb2Yoc3RydWN0IGxzbV9sYWJfY29uZmlnKSAtCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgbHNtX3BhcmFtX3BheWxvYWRfY29tbW9uKSk7Ci0JcTZsc21fc2V0X3BhcmFtX2NvbW1vbigmbGFiX2NvbmZpZy5sYWJfY29uZmlnLmNvbW1vbiwKLQkJCSAgICAgICAmbGFiX2lkcywgcGFyYW1fc2l6ZSwKLQkJCSAgICAgICBMU01fU0VTU0lPTl9DTURfU0VUX1BBUkFNUyk7Ci0JbGFiX2NvbmZpZy5sYWJfY29uZmlnLm1pbm9yX3ZlcnNpb24gPSAxOwotCWxhYl9jb25maWcubGFiX2NvbmZpZy53YWtlX3VwX2xhdGVuY3lfbXMgPSAyNTA7Ci0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgJmxhYl9jb25maWcsIHRydWUsIE5VTEwpOwotCWlmIChyYykgewotCQlwcl9lcnIoIiVzOiBMYWIgY29uZmlnIGZhaWxlZCByYyAlZCBkaXNhYmxlIGxhYlxuIiwKLQkJIF9fZnVuY19fLCByYyk7Ci0JCS8qIExhYiBjb25maWcgZmFpbGVkIGRpc2FibGUgbGFiICovCi0JCWxhYl9lbmFibGUubGFiX2VuYWJsZS5lbmFibGUgPSAwOwotCQlpZiAocTZsc21fYXByX3NlbmRfcGt0KGNsaWVudCwgY2xpZW50LT5hcHIsCi0JCQkmbGFiX2VuYWJsZSwgdHJ1ZSwgTlVMTCkpCi0JCQlwcl9lcnIoIiVzOiBMYWIgZGlzYWJsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQl9Ci1leGl0OgotCXJldHVybiByYzsKLX0KLQotaW50IHE2bHNtX3N0b3BfbGFiKHN0cnVjdCBsc21fY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICghY2xpZW50KSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gY2xpZW50ICVwS1xuIiwgX19mdW5jX18sIGNsaWVudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyYyA9IHE2bHNtX2NtZChjbGllbnQsIExTTV9TRVNTSU9OX0NNRF9FT0IsIHRydWUpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogTGFiIHN0b3AgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmMpOwotCXJldHVybiByYzsKLX0KLQotaW50IHE2bHNtX3JlYWQoc3RydWN0IGxzbV9jbGllbnQgKmNsaWVudCwgc3RydWN0IGxzbV9jbWRfcmVhZCAqcmVhZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFjbGllbnQgfHwgIXJlYWQpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbXMgY2xpZW50ICVwSyByZWFkICVwS1xuIiwgX19mdW5jX18sCi0JCQljbGllbnQsIHJlYWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiByZWFkIGNhbGwgbWVtbWFwIGhhbmRsZSAleCBhZGRyZXNzICV4JXggc2l6ZSAlZFxuIiwKLQkJIF9fZnVuY19fLCByZWFkLT5tZW1fbWFwX2hhbmRsZSwgcmVhZC0+YnVmX2FkZHJfbXN3LAotCQlyZWFkLT5idWZfYWRkcl9sc3csIHJlYWQtPmJ1Zl9zaXplKTsKLQlxNmxzbV9hZGRfaGRyKGNsaWVudCwgJnJlYWQtPmhkciwgc2l6ZW9mKHN0cnVjdCBsc21fY21kX3JlYWQpLCB0cnVlKTsKLQlyZWFkLT5oZHIub3Bjb2RlID0gTFNNX1NFU1NJT05fQ01EX1JFQUQ7Ci0JcmMgPSBxNmxzbV9hcHJfc2VuZF9wa3QoY2xpZW50LCBjbGllbnQtPmFwciwgcmVhZCwgZmFsc2UsIE5VTEwpOwotCWlmIChyYykKLQkJcHJfZXJyKCIlczogcmVhZCBidWZmZXIgY2FsbCBmYWlsZWQgcmMgJWRcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgcTZsc21fbGFiX2J1ZmZlcl9hbGxvYyhzdHJ1Y3QgbHNtX2NsaWVudCAqY2xpZW50LCBib29sIGFsbG9jKQotewotCWludCByZXQgPSAwLCBpID0gMDsKLQlzaXplX3QgYWxsb2NhdGVfc2l6ZSA9IDAsIGxlbiA9IDA7Ci0KLQlpZiAoIWNsaWVudCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGNsaWVudFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGFsbG9jKSB7Ci0JCWlmIChjbGllbnQtPmxhYl9idWZmZXIpIHsKLQkJCXByX2VycigiJXM6IGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBwZXJpb2QgY291bnQgJWQgcGVyaW9kIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50LAotCQkJCWNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zeik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlhbGxvY2F0ZV9zaXplID0gY2xpZW50LT5od19wYXJhbXMucGVyaW9kX2NvdW50ICoKLQkJCQljbGllbnQtPmh3X3BhcmFtcy5idWZfc3o7Ci0JCWFsbG9jYXRlX3NpemUgPSBQQUdFX0FMSUdOKGFsbG9jYXRlX3NpemUpOwotCQljbGllbnQtPmxhYl9idWZmZXIgPQotCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGxzbV9sYWJfYnVmZmVyKSAqCi0JCQljbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNsaWVudC0+bGFiX2J1ZmZlcikgewotCQkJcHJfZXJyKCIlczogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGxhYiBidWZmZXIgZmFpbGVkIGNvdW50ICVkXG4iCi0JCQkJLCBfX2Z1bmNfXywKLQkJCQljbGllbnQtPmh3X3BhcmFtcy5wZXJpb2RfY291bnQpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJcmV0ID0gbXNtX2F1ZGlvX2lvbl9hbGxvYygibHNtX2xhYiIsCi0JCQkmY2xpZW50LT5sYWJfYnVmZmVyWzBdLmNsaWVudCwKLQkJCSZjbGllbnQtPmxhYl9idWZmZXJbMF0uaGFuZGxlLAotCQkJYWxsb2NhdGVfc2l6ZSwgJmNsaWVudC0+bGFiX2J1ZmZlclswXS5waHlzLAotCQkJJmxlbiwKLQkJCSZjbGllbnQtPmxhYl9idWZmZXJbMF0uZGF0YSk7Ci0JCWlmIChyZXQpCi0JCQlwcl9lcnIoIiVzOiBpb24gYWxsb2MgZmFpbGVkIHJldCAlZCBzaXplICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0LCBhbGxvY2F0ZV9zaXplKTsKLQkJZWxzZSB7Ci0JCQlyZXQgPSBxNmxzbV9tZW1vcnlfbWFwX3JlZ2lvbnMoY2xpZW50LAotCQkJCWNsaWVudC0+bGFiX2J1ZmZlclswXS5waHlzLCBsZW4sCi0JCQkJJmNsaWVudC0+bGFiX2J1ZmZlclswXS5tZW1fbWFwX2hhbmRsZSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJfZXJyKCIlczogbWVtb3J5IG1hcCBmaWxlZCByZXQgJWQgc2l6ZSAlemRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQsIGxlbik7Ci0JCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAotCQkJCWNsaWVudC0+bGFiX2J1ZmZlclswXS5jbGllbnQsCi0JCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLmhhbmRsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogYWxsb2MgbGFiIGJ1ZmZlciBmYWlsZWQgcmV0ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJa2ZyZWUoY2xpZW50LT5sYWJfYnVmZmVyKTsKLQkJCWNsaWVudC0+bGFiX2J1ZmZlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IE1lbW9yeSBtYXAgaGFuZGxlICV4IHBoeXMgJXBLIHNpemUgJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLm1lbV9tYXBfaGFuZGxlLAotCQkJCSZjbGllbnQtPmxhYl9idWZmZXJbMF0ucGh5cywKLQkJCQljbGllbnQtPmh3X3BhcmFtcy5idWZfc3opOwotCQkJZm9yIChpID0gMDsgaSA8IGNsaWVudC0+aHdfcGFyYW1zLnBlcmlvZF9jb3VudDsgaSsrKSB7Ci0JCQkJY2xpZW50LT5sYWJfYnVmZmVyW2ldLnBoeXMgPQotCQkJCWNsaWVudC0+bGFiX2J1ZmZlclswXS5waHlzICsKLQkJCQkoaSAqIGNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zeik7Ci0JCQkJY2xpZW50LT5sYWJfYnVmZmVyW2ldLnNpemUgPQotCQkJCWNsaWVudC0+aHdfcGFyYW1zLmJ1Zl9zejsKLQkJCQljbGllbnQtPmxhYl9idWZmZXJbaV0uZGF0YSA9Ci0JCQkJKHU4ICopKGNsaWVudC0+bGFiX2J1ZmZlclswXS5kYXRhKSArCi0JCQkJKGkgKiBjbGllbnQtPmh3X3BhcmFtcy5idWZfc3opOwotCQkJCWNsaWVudC0+bGFiX2J1ZmZlcltpXS5tZW1fbWFwX2hhbmRsZSA9Ci0JCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLm1lbV9tYXBfaGFuZGxlOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcTZsc21fbWVtb3J5X3VubWFwX3JlZ2lvbnMoY2xpZW50LAotCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLm1lbV9tYXBfaGFuZGxlKTsKLQkJaWYgKCFyZXQpCi0JCQltc21fYXVkaW9faW9uX2ZyZWUoCi0JCQljbGllbnQtPmxhYl9idWZmZXJbMF0uY2xpZW50LAotCQkJY2xpZW50LT5sYWJfYnVmZmVyWzBdLmhhbmRsZSk7Ci0JCWVsc2UKLQkJCXByX2VycigiJXM6IHVubWFwIGZhaWxlZCBub3QgZnJlZWluZyBtZW1vcnlcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWtmcmVlKGNsaWVudC0+bGFiX2J1ZmZlcik7Ci0JCWNsaWVudC0+bGFiX2J1ZmZlciA9IE5VTEw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbF90eXBlX2luZGV4KGludDMyX3QgY2FsX3R5cGUpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBMU01fQ1VTVF9UT1BPTE9HWV9DQUxfVFlQRToKLQkJcmV0ID0gTFNNX0NVU1RPTV9UT1BfSURYOwotCQlicmVhazsKLQljYXNlIExTTV9UT1BPTE9HWV9DQUxfVFlQRToKLQkJcmV0ID0gTFNNX1RPUF9JRFg7Ci0JCWJyZWFrOwotCWNhc2UgTFNNX0NBTF9UWVBFOgotCQlyZXQgPSBMU01fQ0FMX0lEWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZCFcbiIsIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcTZsc21fYWxsb2NfY2FsKGludDMyX3QgY2FsX3R5cGUsCi0JCQkJc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCi0JY2FsX2luZGV4ID0gZ2V0X2NhbF90eXBlX2luZGV4KGNhbF90eXBlKTsKLQlpZiAoY2FsX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNhbCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19hbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAotCQlsc21fY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBxNmxzbV9kZWFsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLAotCQkJCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfZGVhbGxvY19jYWwoZGF0YV9zaXplLCBkYXRhLAotCQlsc21fY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNhbF91dGlsc19kZWFsbG9jX2Jsb2NrIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHE2bHNtX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwKLQkJCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNhbF9pbmRleDsKLQotCXByX2RlYnVnKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfc2V0X2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCWxzbV9jb21tb24uY2FsX2RhdGFbY2FsX2luZGV4XSwgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogY2FsX3V0aWxzX3NldF9jYWwgZmFpbGVkLCByZXQgPSAlZCwgY2FsIHR5cGUgPSAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgcmV0LCBjYWxfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2luZGV4ID09IExTTV9DVVNUT01fVE9QX0lEWCkgewotCQltdXRleF9sb2NrKCZsc21fY29tbW9uLmNhbF9kYXRhW0xTTV9DVVNUT01fVE9QX0lEWF0tPmxvY2spOwotCQlsc21fY29tbW9uLnNldF9jdXN0b21fdG9wb2xvZ3kgPSAxOwotCQltdXRleF91bmxvY2soJmxzbV9jb21tb24uY2FsX2RhdGFbTFNNX0NVU1RPTV9UT1BfSURYXS0+bG9jayk7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGxzbV9kZWxldGVfY2FsX2RhdGEodm9pZCkKLXsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQljYWxfdXRpbHNfZGVzdHJveV9jYWxfdHlwZXMoTFNNX01BWF9DQUxfSURYLCBsc21fY29tbW9uLmNhbF9kYXRhKTsKLX0KLQotc3RhdGljIGludCBxNmxzbV9pbml0X2NhbF9kYXRhKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGNhbF90eXBlX2luZm8JY2FsX3R5cGVfaW5mb1tdID0gewotCQl7e0xTTV9DVVNUX1RPUE9MT0dZX0NBTF9UWVBFLAotCQl7cTZsc21fYWxsb2NfY2FsLCBxNmxzbV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJcTZsc21fc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7TFNNX1RPUE9MT0dZX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwKLQkJcTZsc21fc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7TFNNX0NBTF9UWVBFLAotCQl7cTZsc21fYWxsb2NfY2FsLCBxNmxzbV9kZWFsbG9jX2NhbCwgTlVMTCwKLQkJcTZsc21fc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9Ci0JfTsKLQlwcl9kZWJ1ZygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSBjYWxfdXRpbHNfY3JlYXRlX2NhbF90eXBlcyhMU01fTUFYX0NBTF9JRFgsCi0JCWxzbV9jb21tb24uY2FsX2RhdGEsIGNhbF90eXBlX2luZm8pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBjcmVhdGUgY2FsIHR5cGUhXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotZXJyOgotCWxzbV9kZWxldGVfY2FsX2RhdGEoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBxNmxzbV9pbml0KHZvaWQpCi17Ci0JaW50IGkgPSAwOwotCi0JcHJfZGVidWcoIiVzOlxuIiwgX19mdW5jX18pOwotCXNwaW5fbG9ja19pbml0KCZsc21fc2Vzc2lvbl9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmbW1hcF9sb2NrKTsKLQltdXRleF9pbml0KCZsc21fY29tbW9uLmFwcl9sb2NrKTsKLQlmb3IgKDsgaSA8PSBMU01fTUFYX1NFU1NJT05fSUQ7IGkrKykgewotCQlsc21fY29tbW9uLmNvbW1vbl9jbGllbnRbaV0uc2Vzc2lvbiA9IExTTV9DT05UUk9MX1NFU1NJT047Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxzbV9jb21tb24uY29tbW9uX2NsaWVudFtpXS5jbWRfd2FpdCk7Ci0JCW11dGV4X2luaXQoJmxzbV9jb21tb24uY29tbW9uX2NsaWVudFtpXS5jbWRfbG9jayk7Ci0JCWF0b21pY19zZXQoJmxzbV9jb21tb24uY29tbW9uX2NsaWVudFtpXS5jbWRfc3RhdGUsCi0JCQkgICBDTURfU1RBVEVfQ0xFQVJFRCk7Ci0JfQotCi0JaWYgKHE2bHNtX2luaXRfY2FsX2RhdGEoKSkKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGluaXQgY2FsIGRhdGEhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHE2bHNtX2V4aXQodm9pZCkKLXsKLQlsc21fZGVsZXRlX2NhbF9kYXRhKCk7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChxNmxzbV9pbml0KTsKLV9fZXhpdGNhbGwocTZsc21fZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3E2dm9pY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1ZTBmZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODk5OCArMCwwIEBACi0vKiAgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tc21fYXVkaW9faW9uLmg+Ci0KLSNpbmNsdWRlIDxzb2MvcWNvbS9zb2NpbmZvLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9hcHJfdGFsLmg+Ci0KLSNpbmNsdWRlICJzb3VuZC9xNmNvcmUuaCIKLSNpbmNsdWRlICJzb3VuZC9xNmF1ZGlvLXYyLmgiCi0jaW5jbHVkZSAic291bmQvYXByX2F1ZGlvLXYyLmgiCi0jaW5jbHVkZSAic291bmQvcTZhZmUtdjIuaCIKLSNpbmNsdWRlIDxzb3VuZC9hdWRpb19jYWxfdXRpbHMuaD4KLSNpbmNsdWRlICJxNnZvaWNlLmgiCi0jaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KLQotI2RlZmluZSBUSU1FT1VUX01TIDMwMAotCi0KLSNkZWZpbmUgQ01EX1NUQVRVU19TVUNDRVNTIDAKLSNkZWZpbmUgQ01EX1NUQVRVU19GQUlMIDEKLSNkZWZpbmUgTlVNX0NIQU5ORUxTX01PTk8gMQotI2RlZmluZSBOVU1fQ0hBTk5FTFNfU1RFUkVPIDIKLSNkZWZpbmUgQ1ZQX1ZFUlNJT05fMiAyCi0KLWVudW0gewotCVZPQ19UT0tFTl9OT05FLAotCVZPSVBfTUVNX01BUF9UT0tFTiwKLQlWT0NfQ0FMX01FTV9NQVBfVE9LRU4sCi0JVk9DX1ZPSUNFX0hPU1RfUENNX01BUF9UT0tFTiwKLQlWT0NfUlRBQ19NRU1fTUFQX1RPS0VOLAotCVZPQ19TT1VSQ0VfVFJBQ0tJTkdfTUVNX01BUF9UT0tFTgotfTsKLQotc3RydWN0IGN2ZF92ZXJzaW9uX3RhYmxlIGN2ZF92ZXJzaW9uX3RhYmxlX21hcHBpbmdbQ1ZEX0lOVF9WRVJTSU9OX01BWF0gPSB7Ci0JCXtDVkRfVkVSU0lPTl9ERUZBVUxULCBDVkRfSU5UX1ZFUlNJT05fREVGQVVMVH0sCi0JCXtDVkRfVkVSU0lPTl8wXzAsIENWRF9JTlRfVkVSU0lPTl8wXzB9LAotCQl7Q1ZEX1ZFUlNJT05fMl8xLCBDVkRfSU5UX1ZFUlNJT05fMl8xfSwKLQkJe0NWRF9WRVJTSU9OXzJfMiwgQ1ZEX0lOVF9WRVJTSU9OXzJfMn0sCi0JCXtDVkRfVkVSU0lPTl8yXzMsIENWRF9JTlRfVkVSU0lPTl8yXzN9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjb21tb25fZGF0YSBjb21tb247Ci1zdGF0aWMgYm9vbCBtb2R1bGVfaW5pdGlhbGl6ZWQ7Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9lbmFibGVfdm9jcHJvY19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX25ldGlkX3RpbWluZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2F0dGFjaF92b2Nwcm9jX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfc2V0X2RldmljZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX3ZvbF9zdGVwX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJCQkgICAgdWludDMyX3QgbWVtX2hhbmRsZSk7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX2NhbF9uZXR3b3JrX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfZGF0YV9leGNoYW5nZV9tb2RlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX3BhY2tldF9leGNoYW5nZV9jb25maWdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX2FuZF9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwKLQkJCQkJCSAgICAgdWludDMyX3QgbW9kZSk7Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX2RlcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2NyZWF0ZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9kZXZfY2ZnX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfdm9sX2NhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfbWVkaWFfZm10X2luZm9fY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGV2aWNlX2NoYW5uZWxzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX21lZGlhX2Zvcm1hdF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJCSAgIHVpbnQzMl90IHBhcmFtX3R5cGUpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF90b3BvbG9neV9jb21taXRfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfY2hhbm5lbF9pbmZvX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2NoYW5uZWxfaW5mb192MihzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKLQkJCQkJICB1aW50MzJfdCBwYXJhbV90eXBlKTsKLXN0YXRpYyBpbnQgdm9pY2VfZ2V0X2F2Y3NfdmVyc2lvbl9wZXJfc2VydmljZSh1aW50MzJfdCBzZXJ2aWNlX2lkKTsKLQotCi1zdGF0aWMgaW50IHZvaWNlX2N2c19zdG9wX3BsYXliYWNrKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0YXJ0X3BsYXliYWNrKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLXN0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0YXJ0X3JlY29yZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdWludDMyX3QgcmVjX21vZGUpOwotc3RhdGljIGludCB2b2ljZV9jdnNfc3RvcF9yZWNvcmQoc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotCi1zdGF0aWMgaW50MzJfdCBxZHNwX212bV9jYWxsYmFjayhzdHJ1Y3QgYXByX2NsaWVudF9kYXRhICpkYXRhLCB2b2lkICpwcml2KTsKLXN0YXRpYyBpbnQzMl90IHFkc3BfY3ZzX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpOwotc3RhdGljIGludDMyX3QgcWRzcF9jdnBfY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdik7Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKLQkJCQkJdWludDMyX3QgbW9kdWxlX2lkLCBpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgaXNfY2FsX21lbW9yeV9hbGxvY2F0ZWQodm9pZCk7Ci1zdGF0aWMgYm9vbCBpc19jdmRfdmVyc2lvbl9xdWVyaWVkKHZvaWQpOwotc3RhdGljIGludCBpc192b2lwX21lbW9yeV9hbGxvY2F0ZWQodm9pZCk7Ci1zdGF0aWMgaW50IHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY2hhciAqY3ZkX3Zlcl9zdHJpbmcpOwotc3RhdGljIGludCB2b2ljZV9hbGxvY19jYWxfbWVtX21hcF90YWJsZSh2b2lkKTsKLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2NfcnRhY19tZW1fbWFwX3RhYmxlKHZvaWQpOwotc3RhdGljIGludCB2b2ljZV9hbGxvY19vb2Jfc2hhcmVkX21lbSh2b2lkKTsKLXN0YXRpYyBpbnQgdm9pY2VfZnJlZV9vb2Jfc2hhcmVkX21lbSh2b2lkKTsKLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfb29iX21lbV90YWJsZSh2b2lkKTsKLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2NfYW5kX21hcF9vb2JfbWVtKHN0cnVjdCB2b2ljZV9kYXRhICp2KTsKLQotc3RhdGljIHN0cnVjdCB2b2ljZV9kYXRhICp2b2ljZV9nZXRfc2Vzc2lvbl9ieV9pZHgoaW50IGlkeCk7Ci0KLXN0YXRpYyBpbnQgcmVtYXBfY2FsX2RhdGEoc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2ssCi0JCQkgIHVpbnQzMl90IHNlc3Npb25faWQpOwotc3RhdGljIGludCB2b2ljZV91bm1hcF9jYWxfbWVtb3J5KGludDMyX3QgY2FsX3R5cGUsCi0JCQkJICBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayk7Ci0KLXN0YXRpYyBpbnQgaXNfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vbXJ5X2FsbG9jYXRlZCh2b2lkKTsKLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkodm9pZCk7Ci1zdGF0aWMgaW50IHZvaWNlX2FsbG9jX2FuZF9tYXBfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkoCi0JCQkJCQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdik7Ci1zdGF0aWMgaW50IHZvaWNlX3VubWFwX2FuZF9mcmVlX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KAotCQkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKnYpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX3NldF9zb3VuZF9mb2N1c19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhKTsKLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9nZXRfc291bmRfZm9jdXNfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSAqc291bmRGb2N1c0RhdGEpOwotc3RhdGljIGludCB2b2ljZV9zZW5kX2dldF9zb3VyY2VfdHJhY2tpbmdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSAqc291cmNlVHJhY2tpbmdEYXRhKTsKLQotc3RhdGljIHZvaWQgdm9pY2VfaXRyX2luaXQoc3RydWN0IHZvaWNlX3Nlc3Npb25faXRyICppdHIsCi0JCQkgICB1MzIgc2Vzc2lvbl9pZCkKLXsKLQlpZiAoaXRyID09IE5VTEwpCi0JCXJldHVybjsKLQlpdHItPnNlc3Npb25faWR4ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpZiAoc2Vzc2lvbl9pZCA9PSBBTExfU0VTU0lPTl9WU0lEKQotCQlpdHItPmN1cl9pZHggPSAwOwotCWVsc2UKLQkJaXRyLT5jdXJfaWR4ID0gaXRyLT5zZXNzaW9uX2lkeDsKLQotfQotCi1zdGF0aWMgYm9vbCB2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbihzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgKml0ciwKLQkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKip2b2ljZSkKLXsKLQlib29sIHJldCA9IGZhbHNlOwotCi0JaWYgKGl0ciA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JcHJfZGVidWcoIiVzIDogY3VyIGlkeCA9ICVkIHNlc3Npb24gaWR4ID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIGl0ci0+Y3VyX2lkeCwgaXRyLT5zZXNzaW9uX2lkeCk7Ci0KLQlpZiAoaXRyLT5jdXJfaWR4IDw9IGl0ci0+c2Vzc2lvbl9pZHgpIHsKLQkJcmV0ID0gdHJ1ZTsKLQkJKnZvaWNlID0gdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGl0ci0+Y3VyX2lkeCk7Ci0JCWl0ci0+Y3VyX2lkeCsrOwotCX0gZWxzZSB7Ci0JCSp2b2ljZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGJvb2wgdm9pY2VfaXNfdmFsaWRfc2Vzc2lvbl9pZCh1aW50MzJfdCBzZXNzaW9uX2lkKQotewotCWJvb2wgcmV0ID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHNlc3Npb25faWQpIHsKLQljYXNlIFZPSUNFX1NFU1NJT05fVlNJRDoKLQljYXNlIFZPSUNFMl9TRVNTSU9OX1ZTSUQ6Ci0JY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6Ci0JY2FzZSBWT0lQX1NFU1NJT05fVlNJRDoKLQljYXNlIFFDSEFUX1NFU1NJT05fVlNJRDoKLQljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6Ci0JY2FzZSBWT0lDRU1NT0RFMV9WU0lEOgotCWNhc2UgVk9JQ0VNTU9ERTJfVlNJRDoKLQljYXNlIEFMTF9TRVNTSU9OX1ZTSUQ6Ci0JCXJldCA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCA6ICV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHUxNiB2b2ljZV9nZXRfbXZtX2hhbmRsZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IG12bV9oYW5kbGUgJWRcbiIsIF9fZnVuY19fLCB2LT5tdm1faGFuZGxlKTsKLQotCXJldHVybiB2LT5tdm1faGFuZGxlOwotfQotCi1zdGF0aWMgdm9pZCB2b2ljZV9zZXRfbXZtX2hhbmRsZShzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwgdTE2IG12bV9oYW5kbGUpCi17Ci0JcHJfZGVidWcoIiVzOiBtdm1faGFuZGxlICVkXG4iLCBfX2Z1bmNfXywgbXZtX2hhbmRsZSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXYtPm12bV9oYW5kbGUgPSBtdm1faGFuZGxlOwotfQotCi1zdGF0aWMgdTE2IHZvaWNlX2dldF9jdnNfaGFuZGxlKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByX2RlYnVnKCIlczogY3ZzX2hhbmRsZSAlZFxuIiwgX19mdW5jX18sIHYtPmN2c19oYW5kbGUpOwotCi0JcmV0dXJuIHYtPmN2c19oYW5kbGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHZvaWNlX3NldF9jdnNfaGFuZGxlKHN0cnVjdCB2b2ljZV9kYXRhICp2LCB1MTYgY3ZzX2hhbmRsZSkKLXsKLQlwcl9kZWJ1ZygiJXM6IGN2c19oYW5kbGUgJWRcbiIsIF9fZnVuY19fLCBjdnNfaGFuZGxlKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jdi0+Y3ZzX2hhbmRsZSA9IGN2c19oYW5kbGU7Ci19Ci0KLXN0YXRpYyB1MTYgdm9pY2VfZ2V0X2N2cF9oYW5kbGUoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjdnBfaGFuZGxlICVkXG4iLCBfX2Z1bmNfXywgdi0+Y3ZwX2hhbmRsZSk7Ci0KLQlyZXR1cm4gdi0+Y3ZwX2hhbmRsZTsKLX0KLQotc3RhdGljIHZvaWQgdm9pY2Vfc2V0X2N2cF9oYW5kbGUoc3RydWN0IHZvaWNlX2RhdGEgKnYsIHUxNiBjdnBfaGFuZGxlKQotewotCXByX2RlYnVnKCIlczogY3ZwX2hhbmRsZSAlZFxuIiwgX19mdW5jX18sIGN2cF9oYW5kbGUpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2LT5jdnBfaGFuZGxlID0gY3ZwX2hhbmRsZTsKLX0KLQotY2hhciAqdm9jX2dldF9zZXNzaW9uX25hbWUodTMyIHNlc3Npb25faWQpCi17Ci0JY2hhciAqc2Vzc2lvbl9uYW1lID0gTlVMTDsKLQotCWlmIChzZXNzaW9uX2lkID09IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7Ci0JCXNlc3Npb25fbmFtZSA9IFZPSUNFX1NFU1NJT05fTkFNRTsKLQl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0xURV9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7Ci0JCXNlc3Npb25fbmFtZSA9IFZPTFRFX1NFU1NJT05fTkFNRTsKLQl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9RQ0hBVF9QQVNTSVZFXS5zZXNzaW9uX2lkKSB7Ci0JCXNlc3Npb25fbmFtZSA9IFFDSEFUX1NFU1NJT05fTkFNRTsKLQl9IGVsc2UgaWYgKHNlc3Npb25faWQgPT0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRV0uc2Vzc2lvbl9pZCkgewotCQlzZXNzaW9uX25hbWUgPSBWT1dMQU5fU0VTU0lPTl9OQU1FOwotCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PQotCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTFfUEFTU0lWRV0uc2Vzc2lvbl9pZCkgewotCQlzZXNzaW9uX25hbWUgPSBWT0lDRU1NT0RFMV9OQU1FOwotCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PQotCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTJfUEFTU0lWRV0uc2Vzc2lvbl9pZCkgewotCQlzZXNzaW9uX25hbWUgPSBWT0lDRU1NT0RFMl9OQU1FOwotCX0gZWxzZSBpZiAoc2Vzc2lvbl9pZCA9PSBjb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCkgewotCQlzZXNzaW9uX25hbWUgPSBWT0lQX1NFU1NJT05fTkFNRTsKLQl9Ci0JcmV0dXJuIHNlc3Npb25fbmFtZTsKLX0KLQotdWludDMyX3Qgdm9jX2dldF9zZXNzaW9uX2lkKGNoYXIgKm5hbWUpCi17Ci0JdTMyIHNlc3Npb25faWQgPSAwOwotCi0JaWYgKG5hbWUgIT0gTlVMTCkgewotCQlpZiAoIXN0cmNtcChuYW1lLCAiVm9pY2Ugc2Vzc2lvbiIpKQotCQkJc2Vzc2lvbl9pZCA9IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXS5zZXNzaW9uX2lkOwotCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJWb2ljZTIgc2Vzc2lvbiIpKQotCQkJc2Vzc2lvbl9pZCA9Ci0JCQljb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0UyX1BBU1NJVkVdLnNlc3Npb25faWQ7Ci0JCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvTFRFIHNlc3Npb24iKSkKLQkJCXNlc3Npb25faWQgPQotCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdLnNlc3Npb25faWQ7Ci0JCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlFDSEFUIHNlc3Npb24iKSkKLQkJCXNlc3Npb25faWQgPQotCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1FDSEFUX1BBU1NJVkVdLnNlc3Npb25faWQ7Ci0JCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvV0xBTiBzZXNzaW9uIikpCi0JCQlzZXNzaW9uX2lkID0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRV0uc2Vzc2lvbl9pZDsKLQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiVm9pY2VNTW9kZTEiKSkKLQkJCXNlc3Npb25faWQgPQotCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkVdLnNlc3Npb25faWQ7Ci0JCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlZvaWNlTU1vZGUyIikpCi0JCQlzZXNzaW9uX2lkID0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMl9QQVNTSVZFXS5zZXNzaW9uX2lkOwotCQllbHNlCi0JCQlzZXNzaW9uX2lkID0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdLnNlc3Npb25faWQ7Ci0KLQkJcHJfZGVidWcoIiVzOiAlcyBoYXMgc2Vzc2lvbiBpZCAweCV4XG4iLCBfX2Z1bmNfXywgbmFtZSwKLQkJCQlzZXNzaW9uX2lkKTsKLQl9Ci0KLQlyZXR1cm4gc2Vzc2lvbl9pZDsKLX0KLQotc3RhdGljIHN0cnVjdCB2b2ljZV9kYXRhICp2b2ljZV9nZXRfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHNlc3Npb25faWQpIHsKLQljYXNlIFZPSUNFX1NFU1NJT05fVlNJRDoKLQkJdiA9ICZjb21tb24udm9pY2VbVk9DX1BBVEhfUEFTU0lWRV07Ci0JCWJyZWFrOwotCi0JY2FzZSBWT0lDRTJfU0VTU0lPTl9WU0lEOgotCQl2ID0gJmNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRTJfUEFTU0lWRV07Ci0JCWJyZWFrOwotCi0JY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6Ci0JCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdOwotCQlicmVhazsKLQotCWNhc2UgVk9JUF9TRVNTSU9OX1ZTSUQ6Ci0JCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX0ZVTExdOwotCQlicmVhazsKLQotCWNhc2UgUUNIQVRfU0VTU0lPTl9WU0lEOgotCQl2ID0gJmNvbW1vbi52b2ljZVtWT0NfUEFUSF9RQ0hBVF9QQVNTSVZFXTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6Ci0JCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFXTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZPSUNFTU1PREUxX1ZTSUQ6Ci0JCXYgPSAmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkVdOwotCQlicmVhazsKLQotCWNhc2UgVk9JQ0VNTU9ERTJfVlNJRDoKLQkJdiA9ICZjb21tb24udm9pY2VbVk9DX1BBVEhfVk9JQ0VNTU9ERTJfUEFTU0lWRV07Ci0JCWJyZWFrOwotCi0JY2FzZSBBTExfU0VTU0lPTl9WU0lEOgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCA6ICV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOnNlc3Npb25faWQgMHgleCBzZXNzaW9uIGhhbmRsZSAlcEtcbiIsCi0JCV9fZnVuY19fLCBzZXNzaW9uX2lkLCB2KTsKLQotCXJldHVybiB2OwotfQotCi1pbnQgdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgaWR4ID0gMDsKLQotCXN3aXRjaCAoc2Vzc2lvbl9pZCkgewotCWNhc2UgVk9JQ0VfU0VTU0lPTl9WU0lEOgotCQlpZHggPSBWT0NfUEFUSF9QQVNTSVZFOwotCQlicmVhazsKLQotCWNhc2UgVk9JQ0UyX1NFU1NJT05fVlNJRDoKLQkJaWR4ID0gVk9DX1BBVEhfVk9JQ0UyX1BBU1NJVkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBWT0xURV9TRVNTSU9OX1ZTSUQ6Ci0JCWlkeCA9IFZPQ19QQVRIX1ZPTFRFX1BBU1NJVkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBWT0lQX1NFU1NJT05fVlNJRDoKLQkJaWR4ID0gVk9DX1BBVEhfRlVMTDsKLQkJYnJlYWs7Ci0KLQljYXNlIFFDSEFUX1NFU1NJT05fVlNJRDoKLQkJaWR4ID0gVk9DX1BBVEhfUUNIQVRfUEFTU0lWRTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZPV0xBTl9TRVNTSU9OX1ZTSUQ6Ci0JCWlkeCA9IFZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFOwotCQlicmVhazsKLQotCWNhc2UgVk9JQ0VNTU9ERTFfVlNJRDoKLQkJaWR4ID0gVk9DX1BBVEhfVk9JQ0VNTU9ERTFfUEFTU0lWRTsKLQkJYnJlYWs7Ci0KLQljYXNlIFZPSUNFTU1PREUyX1ZTSUQ6Ci0JCWlkeCA9IFZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTExfU0VTU0lPTl9WU0lEOgotCQlpZHggPSBNQVhfVk9DX1NFU1NJT05TIC0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb25faWQgOiAleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOwotCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm9pY2VfZGF0YSAqdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGludCBpZHgpCi17Ci0JcmV0dXJuICgoaWR4IDwgMCB8fCBpZHggPj0gTUFYX1ZPQ19TRVNTSU9OUykgPwotCQkJCU5VTEwgOiAmY29tbW9uLnZvaWNlW2lkeF0pOwotfQotCi1zdGF0aWMgYm9vbCBpc192b2lwX3Nlc3Npb24odTMyIHNlc3Npb25faWQpCi17Ci0JcmV0dXJuIChzZXNzaW9uX2lkID09IGNvbW1vbi52b2ljZVtWT0NfUEFUSF9GVUxMXS5zZXNzaW9uX2lkKTsKLX0KLQotc3RhdGljIGJvb2wgaXNfdm9sdGVfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdLnNlc3Npb25faWQpOwotfQotCi1zdGF0aWMgYm9vbCBpc192b2ljZTJfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFMl9QQVNTSVZFXS5zZXNzaW9uX2lkKTsKLX0KLQotc3RhdGljIGJvb2wgaXNfcWNoYXRfc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1FDSEFUX1BBU1NJVkVdLnNlc3Npb25faWQpOwotfQotCi1zdGF0aWMgYm9vbCBpc192b3dsYW5fc2Vzc2lvbih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gKHNlc3Npb25faWQgPT0gY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPV0xBTl9QQVNTSVZFXS5zZXNzaW9uX2lkKTsKLX0KLQotc3RhdGljIGJvb2wgaXNfdm9pY2VtbW9kZTEodTMyIHNlc3Npb25faWQpCi17Ci0JcmV0dXJuIHNlc3Npb25faWQgPT0KLQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT0lDRU1NT0RFMV9QQVNTSVZFXS5zZXNzaW9uX2lkOwotfQotCi1zdGF0aWMgYm9vbCBpc192b2ljZW1tb2RlMih1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gc2Vzc2lvbl9pZCA9PQotCQkJY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkVdLnNlc3Npb25faWQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzX3ZvY19zdGF0ZV9hY3RpdmUoaW50IHZvY19zdGF0ZSkKLXsKLQlpZiAoKHZvY19zdGF0ZSA9PSBWT0NfUlVOKSB8fAotCQkodm9jX3N0YXRlID09IFZPQ19DSEFOR0UpIHx8Ci0JCSh2b2Nfc3RhdGUgPT0gVk9DX1NUQU5EQlkpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgdm9jX3NldF9lcnJvcl9zdGF0ZSh1aW50MTZfdCByZXNldF9wcm9jKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKLQkJdiA9ICZjb21tb24udm9pY2VbaV07Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCXYtPnZvY19zdGF0ZSA9IFZPQ19FUlJPUjsKLQkJCXYtPnJlY19pbmZvLnJlY29yZGluZyA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBib29sIGlzX290aGVyX3Nlc3Npb25fYWN0aXZlKHUzMiBzZXNzaW9uX2lkKQotewotCWludCBpOwotCWJvb2wgcmV0ID0gZmFsc2U7Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBpcyBvdGhlciBhY3RpdmUgc2Vzc2lvbiBleGNlcHQgdGhlIGlucHV0IG9uZSAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKLQkJaWYgKGNvbW1vbi52b2ljZVtpXS5zZXNzaW9uX2lkID09IHNlc3Npb25faWQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoaXNfdm9jX3N0YXRlX2FjdGl2ZShjb21tb24udm9pY2VbaV0udm9jX3N0YXRlKSkgewotCQkJcmV0ID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXByX2RlYnVnKCIlczogcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzX3N1YjFfdnNpZCh1MzIgc2Vzc2lvbl9pZCkKLXsKLQlib29sIHJldDsKLQotCXN3aXRjaCAoc2Vzc2lvbl9pZCkgewotCWNhc2UgVk9JQ0VfU0VTU0lPTl9WU0lEOgotCWNhc2UgVk9MVEVfU0VTU0lPTl9WU0lEOgotCWNhc2UgVk9XTEFOX1NFU1NJT05fVlNJRDoKLQljYXNlIFZPSUNFTU1PREUxX1ZTSUQ6Ci0JCXJldCA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzX3N1YjJfdnNpZCh1MzIgc2Vzc2lvbl9pZCkKLXsKLQlib29sIHJldDsKLQotCXN3aXRjaCAoc2Vzc2lvbl9pZCkgewotCWNhc2UgVk9JQ0UyX1NFU1NJT05fVlNJRDoKLQljYXNlIFZPSUNFTU1PREUyX1ZTSUQ6Ci0JCXJldCA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzX3ZvaWNlX2FwcF9pZCh1MzIgc2Vzc2lvbl9pZCkKLXsKLQlyZXR1cm4gaXNfc3ViMV92c2lkKHNlc3Npb25faWQpIHx8IGlzX3N1YjJfdnNpZChzZXNzaW9uX2lkKTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9zZXNzaW9uX2lkKHZvaWQpCi17Ci0JY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1BBU1NJVkVdLnNlc3Npb25faWQgPSBWT0lDRV9TRVNTSU9OX1ZTSUQ7Ci0JY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPTFRFX1BBU1NJVkVdLnNlc3Npb25faWQgPSBWT0xURV9TRVNTSU9OX1ZTSUQ7Ci0JY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFMl9QQVNTSVZFXS5zZXNzaW9uX2lkID0gVk9JQ0UyX1NFU1NJT05fVlNJRDsKLQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCA9IFZPSVBfU0VTU0lPTl9WU0lEOwotCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9RQ0hBVF9QQVNTSVZFXS5zZXNzaW9uX2lkID0gUUNIQVRfU0VTU0lPTl9WU0lEOwotCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRV0uc2Vzc2lvbl9pZCA9IFZPV0xBTl9TRVNTSU9OX1ZTSUQ7Ci0JY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkVdLnNlc3Npb25faWQgPQotCQkJCQkJCVZPSUNFTU1PREUxX1ZTSUQ7Ci0JY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1ZPSUNFTU1PREUyX1BBU1NJVkVdLnNlc3Npb25faWQgPQotCQkJCQkJCVZPSUNFTU1PREUyX1ZTSUQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzX2N2ZF92ZXJzaW9uX3F1ZXJpZWQodm9pZCkKLXsKLQlib29sIHJldCA9IDA7Ci0KLQlpZiAoIXN0cmNtcChjb21tb24uY3ZkX3ZlcnNpb24sIENWRF9WRVJTSU9OX0RFRkFVTFQpKQotCQlyZXQgPSBmYWxzZTsKLQllbHNlCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY2hhciAqY3ZkX3Zlcl9zdHJpbmcpCi17Ci0JdW5zaWduZWQgaW50IGlkeDsKLQlpbnQgY3ZkX2ludF92ZXIgPSBDVkRfSU5UX1ZFUlNJT05fREVGQVVMVDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgQ1ZEX0lOVF9WRVJTSU9OX01BWDsgaWR4KyspIHsKLQkJaWYgKHN0cmNtcCgoY2hhciAqKWN2ZF92ZXJfc3RyaW5nLAotCQkJICBjdmRfdmVyc2lvbl90YWJsZV9tYXBwaW5nW2lkeF0uY3ZkX3ZlcikgPT0gMCkgewotCQkJY3ZkX2ludF92ZXIgPQotCQkJY3ZkX3ZlcnNpb25fdGFibGVfbWFwcGluZ1tpZHhdLmN2ZF92ZXJfaW50OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGN2ZF9pbnRfdmVyOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2Fwcl9yZWdpc3Rlcih1aW50MzJfdCBzZXNzaW9uX2lkKQotewotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCi0JLyogcmVnaXN0ZXIgY2FsbGJhY2sgdG8gQVBSICovCi0JaWYgKGNvbW1vbi5hcHJfcTZfbXZtID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBTdGFydCB0byByZWdpc3RlciBNVk0gY2FsbGJhY2tcbiIsIF9fZnVuY19fKTsKLQotCQljb21tb24uYXByX3E2X212bSA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJNVk0iLAotCQkJCQkJIHFkc3BfbXZtX2NhbGxiYWNrLAotCQkJCQkJIDB4RkZGRkZGRkYsICZjb21tb24pOwotCi0JCWlmIChjb21tb24uYXByX3E2X212bSA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgTVZNXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCWlmIChjb21tb24uYXByX3E2X2N2cyA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCIlczogU3RhcnQgdG8gcmVnaXN0ZXIgQ1ZTIGNhbGxiYWNrXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJY29tbW9uLmFwcl9xNl9jdnMgPSBhcHJfcmVnaXN0ZXIoIkFEU1AiLCAiQ1ZTIiwKLQkJCQkJCSBxZHNwX2N2c19jYWxsYmFjaywKLQkJCQkJCSAweEZGRkZGRkZGLCAmY29tbW9uKTsKLQotCQlpZiAoY29tbW9uLmFwcl9xNl9jdnMgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIENWU1xuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJcnRhY19zZXRfdm9pY2VfaGFuZGxlKFJUQUNfQ1ZTLCBjb21tb24uYXByX3E2X2N2cyk7Ci0JfQotCi0JaWYgKGNvbW1vbi5hcHJfcTZfY3ZwID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBTdGFydCB0byByZWdpc3RlciBDVlAgY2FsbGJhY2tcbiIsIF9fZnVuY19fKTsKLQotCQljb21tb24uYXByX3E2X2N2cCA9IGFwcl9yZWdpc3RlcigiQURTUCIsICJDVlAiLAotCQkJCQkJIHFkc3BfY3ZwX2NhbGxiYWNrLAotCQkJCQkJIDB4RkZGRkZGRkYsICZjb21tb24pOwotCi0JCWlmIChjb21tb24uYXByX3E2X2N2cCA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgQ1ZQXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlydGFjX3NldF92b2ljZV9oYW5kbGUoUlRBQ19DVlAsIGNvbW1vbi5hcHJfcTZfY3ZwKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCWlmIChjb21tb24uYXByX3E2X2N2cyAhPSBOVUxMKSB7Ci0JCWFwcl9kZXJlZ2lzdGVyKGNvbW1vbi5hcHJfcTZfY3ZzKTsKLQkJY29tbW9uLmFwcl9xNl9jdnMgPSBOVUxMOwotCQlydGFjX3NldF92b2ljZV9oYW5kbGUoUlRBQ19DVlMsIE5VTEwpOwotCX0KLQlpZiAoY29tbW9uLmFwcl9xNl9tdm0gIT0gTlVMTCkgewotCQlhcHJfZGVyZWdpc3Rlcihjb21tb24uYXByX3E2X212bSk7Ci0JCWNvbW1vbi5hcHJfcTZfbXZtID0gTlVMTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX212bV9jdmRfdmVyc2lvbl9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYXByX2hkciBjdmRfdmVyc2lvbl9nZXRfY21kOwotCXZvaWQgKmFwcl9tdm07Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0JaWYgKCFhcHJfbXZtKSB7Ci0JCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2VuZCBjb21tYW5kIHRvIENWRCB0byByZXRyaWV2ZSBWZXJzaW9uICovCi0JY3ZkX3ZlcnNpb25fZ2V0X2NtZC5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAotCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJQVBSX1BLVF9WRVIpOwotCWN2ZF92ZXJzaW9uX2dldF9jbWQucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoCi0JCQkJQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdmRfdmVyc2lvbl9nZXRfY21kKSAtCi0JCQkJQVBSX0hEUl9TSVpFKTsKLQljdmRfdmVyc2lvbl9nZXRfY21kLnNyY19wb3J0ID0KLQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdmRfdmVyc2lvbl9nZXRfY21kLmRlc3RfcG9ydCA9IDA7Ci0JY3ZkX3ZlcnNpb25fZ2V0X2NtZC50b2tlbiA9IDA7Ci0JY3ZkX3ZlcnNpb25fZ2V0X2NtZC5vcGNvZGUgPSBWU1NfSVZFUlNJT05fQ01EX0dFVDsKLQotCXByX2RlYnVnKCIlczogc2VuZCBDVkQgdmVyc2lvbiBnZXQgY21kLCBwa3Qgc2l6ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGN2ZF92ZXJzaW9uX2dldF9jbWQucGt0X3NpemUpOwotCi0Jdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sCi0JCQkgICAodWludDMyX3QgKikgJmN2ZF92ZXJzaW9uX2dldF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIHNlbmRpbmcgY29tbWFuZFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCi0JCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQsIGZhbGwgYmFjayB0byBkZWZhdWx0XG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSAwOwotCi1kb25lOgotCWlmIChyZXQpIHsKLQkJc3RybGNweShjb21tb24uY3ZkX3ZlcnNpb24sIENWRF9WRVJTSU9OXzBfMCwKLQkJCQlzaXplb2YoY29tbW9uLmN2ZF92ZXJzaW9uKSk7Ci0JfQotCXByX2RlYnVnKCIlczogQ1ZEIFZlcnNpb24gcmV0cmlldmVkPSVzXG4iLAotCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfZHVhbF9jb250cm9sX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXZtX21vZGVtX2R1YWxfY29udHJvbF9zZXNzaW9uX2NtZCBtdm1fdm9pY2VfY3RsX2NtZDsKLQl2b2lkICphcHJfbXZtOwotCXUxNiBtdm1faGFuZGxlOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBTZW5kIER1YWwgQ29udHJvbCBjb21tYW5kIHRvIE1WTVxuIiwgX19mdW5jX18pOwotCWlmICghaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7Ci0JCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKLQkJbXZtX3ZvaWNlX2N0bF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoCi0JCQkJCQlBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCW12bV92b2ljZV9jdGxfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRSgKLQkJCQkJCUFQUl9IRFJfU0laRSwKLQkJCQkJCXNpemVvZihtdm1fdm9pY2VfY3RsX2NtZCkgLQotCQkJCQkJQVBSX0hEUl9TSVpFKTsKLQkJcHJfZGVidWcoIiVzOiBzZW5kIG12bSBWb2ljZSBDdGwgcGt0IHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBtdm1fdm9pY2VfY3RsX2NtZC5oZHIucGt0X3NpemUpOwotCQltdm1fdm9pY2VfY3RsX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCW12bV92b2ljZV9jdGxfY21kLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCQltdm1fdm9pY2VfY3RsX2NtZC5oZHIudG9rZW4gPSAwOwotCQltdm1fdm9pY2VfY3RsX2NtZC5oZHIub3Bjb2RlID0KLQkJCQkJVlNTX0lNVk1fQ01EX1NFVF9QT0xJQ1lfRFVBTF9DT05UUk9MOwotCQltdm1fdm9pY2VfY3RsX2NtZC52b2ljZV9jdGwuZW5hYmxlX2ZsYWcgPSB0cnVlOwotCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0JCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3ZvaWNlX2N0bF9jbWQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogRXJyb3Igc2VuZGluZyBNVk0gVm9pY2UgQ1RMIENNRFxuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQlyZXQgPSAwOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgdm9pY2VfY3JlYXRlX212bV9jdnNfc2Vzc2lvbihzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXZtX2NyZWF0ZV9jdGxfc2Vzc2lvbl9jbWQgbXZtX3Nlc3Npb25fY21kOwotCXN0cnVjdCBjdnNfY3JlYXRlX3Bhc3NpdmVfY3RsX3Nlc3Npb25fY21kIGN2c19zZXNzaW9uX2NtZDsKLQlzdHJ1Y3QgY3ZzX2NyZWF0ZV9mdWxsX2N0bF9zZXNzaW9uX2NtZCBjdnNfZnVsbF9jdGxfY21kOwotCXN0cnVjdCBtdm1fYXR0YWNoX3N0cmVhbV9jbWQgYXR0YWNoX3N0cmVhbV9jbWQ7Ci0Jdm9pZCAqYXByX212bSwgKmFwcl9jdnMsICphcHJfY3ZwOwotCXUxNiBtdm1faGFuZGxlLCBjdnNfaGFuZGxlLCBjdnBfaGFuZGxlOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKLQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7Ci0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCi0JaWYgKCFhcHJfbXZtIHx8ICFhcHJfY3ZzIHx8ICFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9tdm0gb3IgYXByX2N2cyBvciBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKLQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JcHJfZGVidWcoIiVzOiBtdm1faGRsPSVkLCBjdnNfaGRsPSVkXG4iLCBfX2Z1bmNfXywKLQkJbXZtX2hhbmRsZSwgY3ZzX2hhbmRsZSk7Ci0JLyogc2VuZCBjbWQgdG8gY3JlYXRlIG12bSBzZXNzaW9uIGFuZCB3YWl0IGZvciByZXNwb25zZSAqLwotCi0JaWYgKCFtdm1faGFuZGxlKSB7Ci0JCW1lbXNldChtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwgMCwKLQkJCXNpemVvZihtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSkpOwotCQlpZiAoIWlzX3ZvaXBfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgewotCQkJbXZtX3Nlc3Npb25fY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAotCQkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCQkJbXZtX3Nlc3Npb25fY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRSgKLQkJCQkJCUFQUl9IRFJfU0laRSwKLQkJCQkJCXNpemVvZihtdm1fc2Vzc2lvbl9jbWQpIC0KLQkJCQkJCUFQUl9IRFJfU0laRSk7Ci0JCQlwcl9kZWJ1ZygiJXM6IHNlbmQgbXZtIGNyZWF0ZSBzZXNzaW9uIHBrdCBzaXplID0gJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBtdm1fc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplKTsKLQkJCW12bV9zZXNzaW9uX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCQltdm1fc2Vzc2lvbl9jbWQuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JCQltdm1fc2Vzc2lvbl9jbWQuaGRyLnRva2VuID0gMDsKLQkJCW12bV9zZXNzaW9uX2NtZC5oZHIub3Bjb2RlID0KLQkJCQlWU1NfSU1WTV9DTURfQ1JFQVRFX1BBU1NJVkVfQ09OVFJPTF9TRVNTSU9OOwotCQkJaWYgKGlzX3ZvbHRlX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKLQkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCSJkZWZhdWx0IHZvbHRlIHZvaWNlIiwKLQkJCQlzdHJsZW4oImRlZmF1bHQgdm9sdGUgdm9pY2UiKSsxKTsKLQkJCX0gZWxzZSBpZiAoaXNfdm9pY2UyX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKLQkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCVZPSUNFMl9TRVNTSU9OX1ZTSURfU1RSLAotCQkJCXN0cmxlbihWT0lDRTJfU0VTU0lPTl9WU0lEX1NUUikrMSk7Ci0JCQl9IGVsc2UgaWYgKGlzX3FjaGF0X3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKLQkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCVFDSEFUX1NFU1NJT05fVlNJRF9TVFIsCi0JCQkJc3RybGVuKFFDSEFUX1NFU1NJT05fVlNJRF9TVFIpKzEpOwotCQkJfSBlbHNlIGlmIChpc192b3dsYW5fc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkobXZtX3Nlc3Npb25fY21kLm12bV9zZXNzaW9uLm5hbWUsCi0JCQkJVk9XTEFOX1NFU1NJT05fVlNJRF9TVFIsCi0JCQkJc3RybGVuKFZPV0xBTl9TRVNTSU9OX1ZTSURfU1RSKSsxKTsKLQkJCX0gZWxzZSBpZiAoaXNfdm9pY2VtbW9kZTEodi0+c2Vzc2lvbl9pZCkpIHsKLQkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCVZPSUNFTU1PREUxX1ZTSURfU1RSLAotCQkJCXN0cmxlbihWT0lDRU1NT0RFMV9WU0lEX1NUUikgKyAxKTsKLQkJCX0gZWxzZSBpZiAoaXNfdm9pY2VtbW9kZTIodi0+c2Vzc2lvbl9pZCkpIHsKLQkJCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCVZPSUNFTU1PREUyX1ZTSURfU1RSLAotCQkJCXN0cmxlbihWT0lDRU1NT0RFMl9WU0lEX1NUUikgKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RybGNweShtdm1fc2Vzc2lvbl9jbWQubXZtX3Nlc3Npb24ubmFtZSwKLQkJCQkiZGVmYXVsdCBtb2RlbSB2b2ljZSIsCi0JCQkJc3RybGVuKCJkZWZhdWx0IG1vZGVtIHZvaWNlIikrMSk7Ci0JCQl9Ci0KLQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQkJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLAotCQkJCQkodWludDMyX3QgKikgJm12bV9zZXNzaW9uX2NtZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IEVycm9yIHNlbmRpbmcgTVZNX0NPTlRST0xfU0VTU0lPTlxuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkJKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJCXYtPmFzeW5jX2VycikpOwotCQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCQl2LT5hc3luY19lcnIpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogY3JlYXRpbmcgTVZNIGZ1bGwgY3RybFxuIiwgX19mdW5jX18pOwotCQkJbXZtX3Nlc3Npb25fY21kLmhkci5oZHJfZmllbGQgPQotCQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JCQltdm1fc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplID0KLQkJCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQkJc2l6ZW9mKG12bV9zZXNzaW9uX2NtZCkgLQotCQkJCQlBUFJfSERSX1NJWkUpOwotCQkJbXZtX3Nlc3Npb25fY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJCW12bV9zZXNzaW9uX2NtZC5oZHIuZGVzdF9wb3J0ID0gMDsKLQkJCW12bV9zZXNzaW9uX2NtZC5oZHIudG9rZW4gPSAwOwotCQkJbXZtX3Nlc3Npb25fY21kLmhkci5vcGNvZGUgPQotCQkJCVZTU19JTVZNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT047Ci0JCQlzdHJsY3B5KG12bV9zZXNzaW9uX2NtZC5tdm1fc2Vzc2lvbi5uYW1lLAotCQkJCSJkZWZhdWx0IHZvaXAiLAotCQkJCXN0cmxlbigiZGVmYXVsdCB2b2lwIikrMSk7Ci0KLQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQkJCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLAotCQkJCQkodWludDMyX3QgKikgJm12bV9zZXNzaW9uX2NtZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIE1WTV9DT05UUk9MX1NFU1NJT05cbiIpOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCQkJaWYgKCFyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJCXYtPmFzeW5jX2Vycik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQl9Ci0JCS8qIEdldCB0aGUgY3JlYXRlZCBNVk0gaGFuZGxlLiAqLwotCQltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7Ci0JfQotCS8qIHNlbmQgY21kIHRvIGNyZWF0ZSBjdnMgc2Vzc2lvbiAqLwotCWlmICghY3ZzX2hhbmRsZSkgewotCQltZW1zZXQoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsIDAsCi0JCQlzaXplb2YoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUpKTsKLQkJaWYgKCFpc192b2lwX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKLQkJCXByX2RlYnVnKCIlczogY3JlYXRpbmcgQ1ZTIHBhc3NpdmUgc2Vzc2lvblxuIiwKLQkJCQkgX19mdW5jX18pOwotCi0JCQljdnNfc2Vzc2lvbl9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoCi0JCQkJCQlBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCQljdnNfc2Vzc2lvbl9jbWQuaGRyLnBrdF9zaXplID0KLQkJCQkJCUFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCQlzaXplb2YoY3ZzX3Nlc3Npb25fY21kKSAtCi0JCQkJCQlBUFJfSERSX1NJWkUpOwotCQkJY3ZzX3Nlc3Npb25fY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJCWN2c19zZXNzaW9uX2NtZC5oZHIuZGVzdF9wb3J0ID0gMDsKLQkJCWN2c19zZXNzaW9uX2NtZC5oZHIudG9rZW4gPSAwOwotCQkJY3ZzX3Nlc3Npb25fY21kLmhkci5vcGNvZGUgPQotCQkJCVZTU19JU1RSRUFNX0NNRF9DUkVBVEVfUEFTU0lWRV9DT05UUk9MX1NFU1NJT047Ci0JCQlpZiAoaXNfdm9sdGVfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJImRlZmF1bHQgdm9sdGUgdm9pY2UiLAotCQkJCXN0cmxlbigiZGVmYXVsdCB2b2x0ZSB2b2ljZSIpKzEpOwotCQkJfSBlbHNlIGlmIChpc192b2ljZTJfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJVk9JQ0UyX1NFU1NJT05fVlNJRF9TVFIsCi0JCQkJc3RybGVuKFZPSUNFMl9TRVNTSU9OX1ZTSURfU1RSKSsxKTsKLQkJCX0gZWxzZSBpZiAoaXNfcWNoYXRfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJUUNIQVRfU0VTU0lPTl9WU0lEX1NUUiwKLQkJCQlzdHJsZW4oUUNIQVRfU0VTU0lPTl9WU0lEX1NUUikrMSk7Ci0JCQl9IGVsc2UgaWYgKGlzX3Zvd2xhbl9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7Ci0JCQkJc3RybGNweShjdnNfc2Vzc2lvbl9jbWQuY3ZzX3Nlc3Npb24ubmFtZSwKLQkJCQlWT1dMQU5fU0VTU0lPTl9WU0lEX1NUUiwKLQkJCQlzdHJsZW4oVk9XTEFOX1NFU1NJT05fVlNJRF9TVFIpKzEpOwotCQkJfSBlbHNlIGlmIChpc192b2ljZW1tb2RlMSh2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJVk9JQ0VNTU9ERTFfVlNJRF9TVFIsCi0JCQkJc3RybGVuKFZPSUNFTU1PREUxX1ZTSURfU1RSKSArIDEpOwotCQkJfSBlbHNlIGlmIChpc192b2ljZW1tb2RlMih2LT5zZXNzaW9uX2lkKSkgewotCQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJVk9JQ0VNTU9ERTJfVlNJRF9TVFIsCi0JCQkJc3RybGVuKFZPSUNFTU1PREUyX1ZTSURfU1RSKSArIDEpOwotCQkJfSBlbHNlIHsKLQkJCXN0cmxjcHkoY3ZzX3Nlc3Npb25fY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJImRlZmF1bHQgbW9kZW0gdm9pY2UiLAotCQkJCXN0cmxlbigiZGVmYXVsdCBtb2RlbSB2b2ljZSIpKzEpOwotCQkJfQotCQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCQkJdi0+YXN5bmNfZXJyID0gMDsKLQotCQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsCi0JCQkJCSh1aW50MzJfdCAqKSAmY3ZzX3Nlc3Npb25fY21kKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgU1RSRUFNX0NPTlRST0xfU0VTU0lPTlxuIik7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCQlpZiAoIXJldCkgewotCQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCQl2LT5hc3luY19lcnIpKTsKLQkJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQkvKiBHZXQgdGhlIGNyZWF0ZWQgQ1ZTIGhhbmRsZS4gKi8KLQkJCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiBjcmVhdGluZyBDVlMgZnVsbCBzZXNzaW9uXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCWN2c19mdWxsX2N0bF9jbWQuaGRyLmhkcl9maWVsZCA9Ci0JCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCUFQUl9QS1RfVkVSKTsKLQotCQkJY3ZzX2Z1bGxfY3RsX2NtZC5oZHIucGt0X3NpemUgPQotCQkJCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YoY3ZzX2Z1bGxfY3RsX2NtZCkgLQotCQkJCQlBUFJfSERSX1NJWkUpOwotCi0JCQljdnNfZnVsbF9jdGxfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJCWN2c19mdWxsX2N0bF9jbWQuaGRyLmRlc3RfcG9ydCA9IDA7Ci0JCQljdnNfZnVsbF9jdGxfY21kLmhkci50b2tlbiA9IDA7Ci0JCQljdnNfZnVsbF9jdGxfY21kLmhkci5vcGNvZGUgPQotCQkJCVZTU19JU1RSRUFNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT047Ci0JCQljdnNfZnVsbF9jdGxfY21kLmN2c19zZXNzaW9uLmRpcmVjdGlvbiA9IDI7Ci0JCQljdnNfZnVsbF9jdGxfY21kLmN2c19zZXNzaW9uLmVuY19tZWRpYV90eXBlID0KLQkJCQkJCWNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlOwotCQkJY3ZzX2Z1bGxfY3RsX2NtZC5jdnNfc2Vzc2lvbi5kZWNfbWVkaWFfdHlwZSA9Ci0JCQkJCQljb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZTsKLQkJCWN2c19mdWxsX2N0bF9jbWQuY3ZzX3Nlc3Npb24ubmV0d29ya19pZCA9Ci0JCQkJCSAgICAgICBjb21tb24ubXZzX2luZm8ubmV0d29ya190eXBlOwotCQkJc3RybGNweShjdnNfZnVsbF9jdGxfY21kLmN2c19zZXNzaW9uLm5hbWUsCi0JCQkJImRlZmF1bHQgcTYgdm9pY2UiLAotCQkJCXN0cmxlbigiZGVmYXVsdCBxNiB2b2ljZSIpKzEpOwotCi0JCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0JCQl2LT5hc3luY19lcnIgPSAwOwotCi0JCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywKLQkJCQkJICAgKHVpbnQzMl90ICopICZjdnNfZnVsbF9jdGxfY21kKTsKLQotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBFcnIgJWQgc2VuZGluZyBDUkVBVEVfRlVMTF9DVFJMXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJCSh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCQlpZiAoIXJldCkgewotCQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCQl2LT5hc3luY19lcnIpKTsKLQkJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQkvKiBHZXQgdGhlIGNyZWF0ZWQgQ1ZTIGhhbmRsZS4gKi8KLQkJCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCQkJLyogQXR0YWNoIE1WTSB0byBDVlMuICovCi0JCQlwcl9kZWJ1ZygiJXM6IEF0dGFjaCBNVk0gdG8gc3RyZWFtXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCWF0dGFjaF9zdHJlYW1fY21kLmhkci5oZHJfZmllbGQgPQotCQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCQlhdHRhY2hfc3RyZWFtX2NtZC5oZHIucGt0X3NpemUgPQotCQkJCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YoYXR0YWNoX3N0cmVhbV9jbWQpIC0KLQkJCQkJQVBSX0hEUl9TSVpFKTsKLQkJCWF0dGFjaF9zdHJlYW1fY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJCWF0dGFjaF9zdHJlYW1fY21kLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCQkJYXR0YWNoX3N0cmVhbV9jbWQuaGRyLnRva2VuID0gMDsKLQkJCWF0dGFjaF9zdHJlYW1fY21kLmhkci5vcGNvZGUgPQotCQkJCQkJVlNTX0lNVk1fQ01EX0FUVEFDSF9TVFJFQU07Ci0JCQlhdHRhY2hfc3RyZWFtX2NtZC5hdHRhY2hfc3RyZWFtLmhhbmRsZSA9IGN2c19oYW5kbGU7Ci0KLQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJCXYtPmFzeW5jX2VyciA9IDA7Ci0JCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwKLQkJCQkJICAgKHVpbnQzMl90ICopICZhdHRhY2hfc3RyZWFtX2NtZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgQVRUQUNIX1NUUkVBTVxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCQlpZiAoIXJldCkgewotCQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gZmFpbDsKLQkJCX0KLQkJCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCQl2LT5hc3luY19lcnIpKTsKLQkJCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV91bm1hcF9jYWxfYmxvY2soc3RydWN0IHZvaWNlX2RhdGEgKnYsIGludCBjYWxfaW5kZXgpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2s7Ci0KLQlpZiAoY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYWwgdHlwZSBpcyBOVUxMLCBpbmRleCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2luZGV4KTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0tPmxvY2spOwotCWNhbF9ibG9jayA9IGNhbF91dGlsc19nZXRfb25seV9jYWxfYmxvY2soCi0JCWNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKLQlpZiAoY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQ2FsIGJsb2NrIGlzIE5VTEwsIGluZGV4ICVkIVxuIiwKLQkJCV9fZnVuY19fLCBjYWxfaW5kZXgpOwotCi0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWlmIChjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogUTYgaGFuZGxlIGlzIG5vdCBzZXQhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlyZXN1bHQgPSB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKAotCQl2LCBjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7Ci0JaWYgKHJlc3VsdCkKLQkJcHJfZXJyKCIlczogVm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCBmYWlsZWQgZm9yIHNlc3Npb24gMHgleCwgZXJyICVkIVxuIiwKLQkJCV9fZnVuY19fLCB2LT5zZXNzaW9uX2lkLCByZXN1bHQpOwotCi0JY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgPSAwOwotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9kZXN0cm95X212bV9jdnNfc2Vzc2lvbihzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbXZtX2RldGFjaF9zdHJlYW1fY21kIGRldGFjaF9zdHJlYW07Ci0Jc3RydWN0IGFwcl9oZHIgbXZtX2Rlc3Ryb3k7Ci0Jc3RydWN0IGFwcl9oZHIgY3ZzX2Rlc3Ryb3k7Ci0Jdm9pZCAqYXByX212bSwgKmFwcl9jdnM7Ci0JdTE2IG12bV9oYW5kbGUsIGN2c19oYW5kbGU7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOwotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX212bSB8fCAhYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfbXZtIG9yIGFwcl9jdnMgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCS8qIE1WTSwgQ1ZTIHNlc3Npb25zIGFyZSBkZXN0cm95ZWQgb25seSBmb3IgRnVsbCBjb250cm9sIHNlc3Npb25zLiAqLwotCWlmIChpc192b2lwX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkpIHsKLQkJcHJfZGVidWcoIiVzOiBNVk0gZGV0YWNoIHN0cmVhbSwgVk9DX1NUQVRFOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJdi0+dm9jX3N0YXRlKTsKLQotCQkvKiBEZXRhY2ggdm9pY2Ugc3RyZWFtLiAqLwotCQlkZXRhY2hfc3RyZWFtLmhkci5oZHJfZmllbGQgPQotCQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCWRldGFjaF9zdHJlYW0uaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQkJc2l6ZW9mKGRldGFjaF9zdHJlYW0pIC0gQVBSX0hEUl9TSVpFKTsKLQkJZGV0YWNoX3N0cmVhbS5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCWRldGFjaF9zdHJlYW0uaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JCWRldGFjaF9zdHJlYW0uaGRyLnRva2VuID0gMDsKLQkJZGV0YWNoX3N0cmVhbS5oZHIub3Bjb2RlID0gVlNTX0lNVk1fQ01EX0RFVEFDSF9TVFJFQU07Ci0JCWRldGFjaF9zdHJlYW0uZGV0YWNoX3N0cmVhbS5oYW5kbGUgPSBjdnNfaGFuZGxlOwotCi0JCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJdi0+YXN5bmNfZXJyID0gMDsKLQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmZGV0YWNoX3N0cmVhbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIERFVEFDSF9TVFJFQU1cbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCi0JCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IHdhaXQgZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCS8qIFVubWFwIG1lbW9yeSAqLwotCQlpZiAodi0+c2htZW1faW5mby5tZW1faGFuZGxlICE9IDApIHsKLQkJCXJldCA9IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQodiwKLQkJCQkJCXYtPnNobWVtX2luZm8ubWVtX2hhbmRsZSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXMgTWVtb3J5X3VubWFwIGZvciB2b2lwIGZhaWxlZCAlZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQl2LT5zaG1lbV9pbmZvLm1lbV9oYW5kbGUgPSAwOwotCQl9Ci0JfQotCi0JLyogVW5tYXAgU291cmNlIFRyYWNraW5nIHNoYXJlZCBtZW1vcnkgaWYgbWFwcGVkIGVhcmxpZXIgKi8KLQl2b2ljZV91bm1hcF9hbmRfZnJlZV9zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9yeSh2KTsKLQotCWlmIChpc192b2lwX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkgfHwKLQkgICAgaXNfcWNoYXRfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKSB8fAotCSAgICBpc192b2x0ZV9zZXNzaW9uKHYtPnNlc3Npb25faWQpIHx8Ci0JICAgIGlzX3Zvd2xhbl9zZXNzaW9uKHYtPnNlc3Npb25faWQpIHx8Ci0JICAgIHYtPnZvY19zdGF0ZSA9PSBWT0NfRVJST1IgfHwgY29tbW9uLmlzX2Rlc3Ryb3lfY3ZkKSB7Ci0JCS8qIERlc3Ryb3kgQ1ZTLiAqLwotCQlwcl9kZWJ1ZygiJXM6IENWUyBkZXN0cm95IHNlc3Npb25cbiIsIF9fZnVuY19fKTsKLQotCQljdnNfZGVzdHJveS5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQkJY3ZzX2Rlc3Ryb3kucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YoY3ZzX2Rlc3Ryb3kpIC0gQVBSX0hEUl9TSVpFKTsKLQkJY3ZzX2Rlc3Ryb3kuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCWN2c19kZXN0cm95LmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7Ci0JCWN2c19kZXN0cm95LnRva2VuID0gMDsKLQkJY3ZzX2Rlc3Ryb3kub3Bjb2RlID0gQVBSVjJfSUJBU0lDX0NNRF9ERVNUUk9ZX1NFU1NJT047Ci0KLQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCQl2LT5hc3luY19lcnIgPSAwOwotCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfZGVzdHJveSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIENWUyBERVNUUk9ZXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0IGV2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCXYtPmFzeW5jX2Vycik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJY3ZzX2hhbmRsZSA9IDA7Ci0JCXZvaWNlX3NldF9jdnNfaGFuZGxlKHYsIGN2c19oYW5kbGUpOwotCi0JCS8qIFVubWFwIHBoeXNpY2FsIG1lbW9yeSBmb3IgYWxsIGNhbGlicmF0aW9uIGJ1ZmZlcnMgKi8KLQkJaWYgKCFpc19vdGhlcl9zZXNzaW9uX2FjdGl2ZSh2LT5zZXNzaW9uX2lkKSkgewotCQkJaWYgKHZvaWNlX3VubWFwX2NhbF9ibG9jayh2LCBDVlBfVk9DUFJPQ19DQUwpKQotCQkJCXByX2VycigiJXM6IFVubWFwIFZPQ1BST0MgY2FsIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJaWYgKHZvaWNlX3VubWFwX2NhbF9ibG9jayh2LCBDVlBfVk9DVk9MX0NBTCkpCi0JCQkJcHJfZXJyKCIlczogVW5tYXAgVk9DVk9MIGNhbCBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCWlmICh2b2ljZV91bm1hcF9jYWxfYmxvY2sodiwgQ1ZQX1ZPQ0RFVl9DRkdfQ0FMKSkKLQkJCQlwcl9lcnIoIiVzOiBVbm1hcCBWT0NERVZfQ0ZHIGNhbCBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCWlmICh2b2ljZV91bm1hcF9jYWxfYmxvY2sodiwgQ1ZTX1ZPQ1NUUk1fQ0FMKSkKLQkJCQlwcl9lcnIoIiVzOiBVbm1hcCBWT0NTVFJNIGNhbCBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJfQotCi0JCS8qIERlc3Ryb3kgTVZNLiAqLwotCQlwcl9kZWJ1ZygiJXM6IE1WTSBkZXN0cm95IHNlc3Npb25cbiIsIF9fZnVuY19fKTsKLQotCQltdm1fZGVzdHJveS5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQkJbXZtX2Rlc3Ryb3kucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQkgICAgc2l6ZW9mKG12bV9kZXN0cm95KSAtIEFQUl9IRFJfU0laRSk7Ci0JCW12bV9kZXN0cm95LnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCQltdm1fZGVzdHJveS5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCQltdm1fZGVzdHJveS50b2tlbiA9IDA7Ci0JCW12bV9kZXN0cm95Lm9wY29kZSA9IEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OOwotCi0JCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJdi0+YXN5bmNfZXJyID0gMDsKLQotCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fZGVzdHJveSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIE1WTSBERVNUUk9ZXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0IGV2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQl2LT5hc3luY19lcnIpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCW12bV9oYW5kbGUgPSAwOwotCQl2b2ljZV9zZXRfbXZtX2hhbmRsZSh2LCBtdm1faGFuZGxlKTsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF90dHlfbW9kZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG12bV9zZXRfdHR5X21vZGVfY21kIG12bV90dHlfbW9kZV9jbWQ7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCi0JLyogc2VuZCB0dHkgbW9kZSBjbWQgdG8gbXZtICovCi0JbXZtX3R0eV9tb2RlX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRCgKLQkJCQkJQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCUFQUl9QS1RfVkVSKTsKLQltdm1fdHR5X21vZGVfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCXNpemVvZihtdm1fdHR5X21vZGVfY21kKSAtCi0JCQkJCUFQUl9IRFJfU0laRSk7Ci0JcHJfZGVidWcoIiVzOiBwa3Qgc2l6ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIG12bV90dHlfbW9kZV9jbWQuaGRyLnBrdF9zaXplKTsKLQltdm1fdHR5X21vZGVfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCW12bV90dHlfbW9kZV9jbWQuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JbXZtX3R0eV9tb2RlX2NtZC5oZHIudG9rZW4gPSAwOwotCW12bV90dHlfbW9kZV9jbWQuaGRyLm9wY29kZSA9IFZTU19JU1RSRUFNX0NNRF9TRVRfVFRZX01PREU7Ci0JbXZtX3R0eV9tb2RlX2NtZC50dHlfbW9kZS5tb2RlID0gdi0+dHR5X21vZGU7Ci0JcHJfZGVidWcoInR0eSBtb2RlID0lZFxuIiwgbXZtX3R0eV9tb2RlX2NtZC50dHlfbW9kZS5tb2RlKTsKLQotCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV90dHlfbW9kZV9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX1RUWV9NT0RFXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKLQkJCQkJdWludDMyX3QgbW9kdWxlX2lkLCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBjdnNfc2V0X3BwX2VuYWJsZV9jbWQgY3ZzX3NldF9wcF9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2czsKLQl1MTYgY3ZzX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7Ci0KLQlpZiAoIWFwcl9jdnMpIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCi0JY3ZzX3NldF9wcF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQkgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQkgICAgIEFQUl9QS1RfVkVSKTsKLQljdnNfc2V0X3BwX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQkJICAgc2l6ZW9mKGN2c19zZXRfcHBfY21kKSAtCi0JCQkJCQkgICBBUFJfSERSX1NJWkUpOwotCWN2c19zZXRfcHBfY21kLmhkci5zcmNfcG9ydCA9IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZzX3NldF9wcF9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7Ci0JY3ZzX3NldF9wcF9jbWQuaGRyLnRva2VuID0gMDsKLQljdnNfc2V0X3BwX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lDT01NT05fQ01EX1NFVF9VSV9QUk9QRVJUWTsKLQotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAubW9kdWxlX2lkID0gbW9kdWxlX2lkOwotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAucGFyYW1faWQgPSBWT0lDRV9QQVJBTV9NT0RfRU5BQkxFOwotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAucGFyYW1fc2l6ZSA9IE1PRF9FTkFCTEVfUEFSQU1fTEVOOwotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAucmVzZXJ2ZWQgPSAwOwotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAuZW5hYmxlID0gZW5hYmxlOwotCWN2c19zZXRfcHBfY21kLnZzc19zZXRfcHAucmVzZXJ2ZWRfZmllbGQgPSAwOwotCXByX2RlYnVnKCJ2b2ljZV9zZW5kX3NldF9wcF9lbmFibGVfY21kLCBtb2R1bGVfaWQ9JWQsIGVuYWJsZT0lZFxuIiwKLQkJbW9kdWxlX2lkLCBlbmFibGUpOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3NldF9wcF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbDogc2VuZGluZyBjdnMgc2V0IHBwIGVuYWJsZSxcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfaGRfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LCBpbnQgZW5hYmxlKQotewotCXN0cnVjdCBtdm1fc2V0X2hkX2VuYWJsZV9jbWQgbXZtX3NldF9oZF9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7Ci0JaWYgKCFtdm1faGFuZGxlKSB7Ci0JCXByX2VycigiJXM6IG12bV9oYW5kbGUgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdm1fc2V0X2hkX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCSAgICAgQVBSX1BLVF9WRVIpOwotCW12bV9zZXRfaGRfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCQkgICBzaXplb2YobXZtX3NldF9oZF9jbWQpIC0KLQkJCQkJCSAgIEFQUl9IRFJfU0laRSk7Ci0JbXZtX3NldF9oZF9jbWQuaGRyLnNyY19wb3J0ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQltdm1fc2V0X2hkX2NtZC5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKLQltdm1fc2V0X2hkX2NtZC5oZHIudG9rZW4gPSAwOwotCi0JaWYgKGVuYWJsZSkKLQkJbXZtX3NldF9oZF9jbWQuaGRyLm9wY29kZSA9IFZTU19JSERWT0lDRV9DTURfRU5BQkxFOwotCWVsc2UKLQkJbXZtX3NldF9oZF9jbWQuaGRyLm9wY29kZSA9IFZTU19JSERWT0lDRV9DTURfRElTQUJMRTsKLQotCXByX2RlYnVnKCIlczogZW5hYmxlPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKLQotCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV9zZXRfaGRfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2VuZGluZyBtdm0gc2V0IEhEIFZvaWNlIGVuYWJsZSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCi0JCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2V0X2R0eChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICphcHJfY3ZzOwotCXUxNiBjdnNfaGFuZGxlOwotCXN0cnVjdCBjdnNfc2V0X2VuY19kdHhfbW9kZV9jbWQgY3ZzX3NldF9kdHg7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOwotCi0JaWYgKCFhcHJfY3ZzKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCi0JLyogU2V0IERUWCAqLwotCWN2c19zZXRfZHR4Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkgICAgICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkgICAgICBBUFJfUEtUX1ZFUik7Ci0JY3ZzX3NldF9kdHguaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQkJc2l6ZW9mKGN2c19zZXRfZHR4KSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZzX3NldF9kdHguaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2c19zZXRfZHR4Lmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOwotCWN2c19zZXRfZHR4Lmhkci50b2tlbiA9IDA7Ci0JY3ZzX3NldF9kdHguaGRyLm9wY29kZSA9IFZTU19JU1RSRUFNX0NNRF9TRVRfRU5DX0RUWF9NT0RFOwotCWN2c19zZXRfZHR4LmR0eF9tb2RlLmVuYWJsZSA9IGNvbW1vbi5tdnNfaW5mby5kdHhfbW9kZTsKLQotCXByX2RlYnVnKCIlczogU2V0dGluZyBEVFggJWRcbiIsIF9fZnVuY19fLCBjb21tb24ubXZzX2luZm8uZHR4X21vZGUpOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfc2V0X2R0eCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTRVRfRFRYXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX212bV9tZWRpYV90eXBlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9jYWxfbWVkaWFfdHlwZV90IG12bV9zZXRfY2FsX21lZGlhX3R5cGU7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCi0JbXZtX3NldF9jYWxfbWVkaWFfdHlwZS5oZHIuaGRyX2ZpZWxkID0KLQkJCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJQVBSX1BLVF9WRVIpOwotCW12bV9zZXRfY2FsX21lZGlhX3R5cGUuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQkJc2l6ZW9mKG12bV9zZXRfY2FsX21lZGlhX3R5cGUpIC0KLQkJCQkJQVBSX0hEUl9TSVpFKTsKLQltdm1fc2V0X2NhbF9tZWRpYV90eXBlLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQltdm1fc2V0X2NhbF9tZWRpYV90eXBlLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCW12bV9zZXRfY2FsX21lZGlhX3R5cGUuaGRyLnRva2VuID0gMDsKLQltdm1fc2V0X2NhbF9tZWRpYV90eXBlLmhkci5vcGNvZGUgPSBWU1NfSU1WTV9DTURfU0VUX0NBTF9NRURJQV9UWVBFOwotCW12bV9zZXRfY2FsX21lZGlhX3R5cGUubWVkaWFfaWQgPSBjb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZTsKLQlwcl9kZWJ1ZygiJXM6IHNldHRpbmcgbWVkaWFfaWQgYXMgJXhcbiIsCi0JCSBfX2Z1bmNfXywgbXZtX3NldF9jYWxfbWVkaWFfdHlwZS5tZWRpYV9pZCk7Ci0KLQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc2V0X2NhbF9tZWRpYV90eXBlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIG1lZGlhIHR5cGVcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCSh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfZHRtZl9yeF9kZXRlY3Rpb25fY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJCQkgICAgdWludDMyX3QgZW5hYmxlKQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0Jc3RydWN0IGN2c19zZXRfcnhfZHRtZl9kZXRlY3Rpb25fY21kIGN2c19kdG1mX3J4X2RldGVjdGlvbjsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7Ci0KLQlpZiAoIWFwcl9jdnMpIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0KLQkvKiBTZXQgU0VUX0RUTUZfUlhfREVURUNUSU9OICovCi0JY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmhkci5oZHJfZmllbGQgPQotCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQljdnNfZHRtZl9yeF9kZXRlY3Rpb24uaGRyLnBrdF9zaXplID0KLQkJCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnNfZHRtZl9yeF9kZXRlY3Rpb24pIC0gQVBSX0hEUl9TSVpFKTsKLQljdnNfZHRtZl9yeF9kZXRlY3Rpb24uaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2c19kdG1mX3J4X2RldGVjdGlvbi5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQljdnNfZHRtZl9yeF9kZXRlY3Rpb24uaGRyLnRva2VuID0gMDsKLQljdnNfZHRtZl9yeF9kZXRlY3Rpb24uaGRyLm9wY29kZSA9Ci0JCQkJCVZTU19JU1RSRUFNX0NNRF9TRVRfUlhfRFRNRl9ERVRFQ1RJT047Ci0JY3ZzX2R0bWZfcnhfZGV0ZWN0aW9uLmN2c19kdG1mX2RldC5lbmFibGUgPSBlbmFibGU7Ci0KLQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19kdG1mX3J4X2RldGVjdGlvbik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTRVRfRFRNRl9SWF9ERVRFQ1RJT05cbiIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHZvY19kaXNhYmxlX2R0bWZfZGV0X29uX2FjdGl2ZV9zZXNzaW9ucyh2b2lkKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKLQkJdiA9ICZjb21tb24udm9pY2VbaV07Ci0JCWlmICgodi0+ZHRtZl9yeF9kZXRlY3RfZW4pICYmCi0JCQlpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkpIHsKLQotCQkJcHJfZGVidWcoImRpc2FibGUgZHRtZiBkZXQgb24gc2VzX2lkPSVkXG4iLAotCQkJCSB2LT5zZXNzaW9uX2lkKTsKLQkJCXZvaWNlX3NlbmRfZHRtZl9yeF9kZXRlY3Rpb25fY21kKHYsIDApOwotCQl9Ci0JfQotfQotCi1pbnQgdm9jX2VuYWJsZV9kdG1mX3J4X2RldGVjdGlvbih1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBlbmFibGUpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0Jdi0+ZHRtZl9yeF9kZXRlY3RfZW4gPSBlbmFibGU7Ci0KLQlpZiAoaXNfdm9jX3N0YXRlX2FjdGl2ZSh2LT52b2Nfc3RhdGUpKQotCQlyZXQgPSB2b2ljZV9zZW5kX2R0bWZfcnhfZGV0ZWN0aW9uX2NtZCh2LAotCQkJCQkJICAgICAgIHYtPmR0bWZfcnhfZGV0ZWN0X2VuKTsKLQotCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHZvY19zZXRfZGVzdHJveV9jdmRfZmxhZyhib29sIGlzX2Rlc3Ryb3lfY3ZkKQotewotCXByX2RlYnVnKCIlczogJWRcbiIsIF9fZnVuY19fLCBpc19kZXN0cm95X2N2ZCk7Ci0JY29tbW9uLmlzX2Rlc3Ryb3lfY3ZkID0gaXNfZGVzdHJveV9jdmQ7Ci19Ci0KLWludCB2b2NfYWxsb2NfY2FsX3NoYXJlZF9tZW1vcnkodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlpZiAoaXNfY2FsX21lbW9yeV9hbGxvY2F0ZWQoKSkgewotCQlwcl9kZWJ1ZygiJXM6IENhbGlicmF0aW9uIHNoYXJlZCBidWZmZXIgYWxyZWFkeSBhbGxvY2F0ZWQiLAotCQkJIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNhbGlicmF0aW9uIG1lbW9yeSBtYXAgdGFibGUuICovCi0JCXJjID0gdm9pY2VfYWxsb2NfY2FsX21lbV9tYXBfdGFibGUoKTsKLQkJaWYgKChyYyA8IDApICYmIChyYyAhPSAtRVBST0JFX0RFRkVSKSkgewotCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGNhbCBtZW1vcnksIGVycj0lZCIsCi0JCQkgICAgICAgX19mdW5jX18sIHJjKTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB2b2NfYWxsb2Nfdm9pcF9zaGFyZWRfbWVtb3J5KHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQotCS8qIEFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yIE9PQiBWb2lwICovCi0JcmMgPSB2b2ljZV9hbGxvY19vb2Jfc2hhcmVkX21lbSgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGFsbG9jIHNoYXJlZCBtZW1vcnkgZm9yIE9PQiByYzolZFxuIiwKLQkJCSAgIF9fZnVuY19fLCByYyk7Ci0JfSBlbHNlIHsKLQkJLyogQWxsb2NhdGUgbWVtIG1hcCB0YWJsZSBmb3IgT09CICovCi0JCXJjID0gdm9pY2VfYWxsb2Nfb29iX21lbV90YWJsZSgpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2MgbWVtIG1hcCB0YWxiZSByYzolZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmMpOwotCi0JCQl2b2ljZV9mcmVlX29vYl9zaGFyZWRfbWVtKCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfY2FsX21lbW9yeV9hbGxvY2F0ZWQodm9pZCkKLXsKLQlib29sIHJldDsKLQotCWlmIChjb21tb24uY2FsX21lbV9tYXBfdGFibGUuY2xpZW50ICE9IE5VTEwgJiYKLQkgICAgY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmhhbmRsZSAhPSBOVUxMKQotCQlyZXQgPSB0cnVlOwotCWVsc2UKLQkJcmV0ID0gZmFsc2U7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgZnJlZV9jYWxfbWFwX3RhYmxlKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoKGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5jbGllbnQgPT0gTlVMTCkgfHwKLQkJKGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5oYW5kbGUgPT0gTlVMTCkpCi0JCWdvdG8gZG9uZTsKLQotCXJldCA9IG1zbV9hdWRpb19pb25fZnJlZShjb21tb24uY2FsX21lbV9tYXBfdGFibGUuY2xpZW50LAotCQljb21tb24uY2FsX21lbV9tYXBfdGFibGUuaGFuZGxlKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogbXNtX2F1ZGlvX2lvbl9mcmVlIGZhaWxlZDpcbiIsIF9fZnVuY19fKTsKLQotZG9uZToKLQljb21tb24uY2FsX21lbV9tYXBfdGFibGUuY2xpZW50ID0gTlVMTDsKLQljb21tb24uY2FsX21lbV9tYXBfdGFibGUuaGFuZGxlID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGlzX3J0YWNfbWVtb3J5X2FsbG9jYXRlZCh2b2lkKQotewotCWJvb2wgcmV0OwotCi0JaWYgKGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuY2xpZW50ICE9IE5VTEwgJiYKLQkgICAgY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5oYW5kbGUgIT0gTlVMTCkKLQkJcmV0ID0gdHJ1ZTsKLQllbHNlCi0JCXJldCA9IGZhbHNlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmcmVlX3J0YWNfbWFwX3RhYmxlKHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoKGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuY2xpZW50ID09IE5VTEwpIHx8Ci0JCShjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmhhbmRsZSA9PSBOVUxMKSkKLQkJZ290byBkb25lOwotCi0JcmV0ID0gbXNtX2F1ZGlvX2lvbl9mcmVlKGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuY2xpZW50LAotCQljb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmhhbmRsZSk7Ci0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IG1zbV9hdWRpb19pb25fZnJlZSBmYWlsZWQ6XG4iLCBfX2Z1bmNfXyk7Ci0KLWRvbmU6Ci0JY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5jbGllbnQgPSBOVUxMOwotCWNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuaGFuZGxlID0gTlVMTDsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgaXNfdm9pcF9tZW1vcnlfYWxsb2NhdGVkKHZvaWQpCi17Ci0JYm9vbCByZXQ7Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbigKLQkJCQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCk7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTCwgc2Vzc2lvbl9pZDolZFxuIiwgX19mdW5jX18sCi0JCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9GVUxMXS5zZXNzaW9uX2lkKTsKLQotCQlyZXQgPSBmYWxzZTsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JaWYgKHYtPnNobWVtX2luZm8uc2hfYnVmLmNsaWVudCAhPSBOVUxMICYmCi0JICAgIHYtPnNobWVtX2luZm8uc2hfYnVmLmhhbmRsZSAhPSBOVUxMKQotCQlyZXQgPSB0cnVlOwotCWVsc2UKLQkJcmV0ID0gZmFsc2U7Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfY29uZmlnX2N2c192b2NvZGVyX2Ftcl9yYXRlKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0Jc3RydWN0IGN2c19zZXRfYW1yX2VuY19yYXRlX2NtZCBjdnNfc2V0X2Ftcl9yYXRlOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCXByX2RlYnVnKCIlczogU2V0dGluZyBBTVIgcmF0ZS4gTWVkaWEgVHlwZTogJWRcbiIsIF9fZnVuY19fLAotCQkgY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGUpOwotCi0JY3ZzX3NldF9hbXJfcmF0ZS5oZHIuaGRyX2ZpZWxkID0KLQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJQVBSX1BLVF9WRVIpOwotCWN2c19zZXRfYW1yX3JhdGUuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCSAgICAgICBzaXplb2YoY3ZzX3NldF9hbXJfcmF0ZSkgLSBBUFJfSERSX1NJWkUpOwotCWN2c19zZXRfYW1yX3JhdGUuaGRyLnNyY19wb3J0ID0KLQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZzX3NldF9hbXJfcmF0ZS5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQljdnNfc2V0X2Ftcl9yYXRlLmhkci50b2tlbiA9IDA7Ci0KLQlpZiAoY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGUgPT0gVlNTX01FRElBX0lEX0FNUl9OQl9NT0RFTSkKLQkJY3ZzX3NldF9hbXJfcmF0ZS5oZHIub3Bjb2RlID0KLQkJCQlWU1NfSVNUUkVBTV9DTURfVk9DX0FNUl9TRVRfRU5DX1JBVEU7Ci0JZWxzZSBpZiAoY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGUgPT0gVlNTX01FRElBX0lEX0FNUl9XQl9NT0RFTSkKLQkJY3ZzX3NldF9hbXJfcmF0ZS5oZHIub3Bjb2RlID0KLQkJCQlWU1NfSVNUUkVBTV9DTURfVk9DX0FNUldCX1NFVF9FTkNfUkFURTsKLQotCWN2c19zZXRfYW1yX3JhdGUuYW1yX3JhdGUubW9kZSA9IGNvbW1vbi5tdnNfaW5mby5yYXRlOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfc2V0X2Ftcl9yYXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9BTVJfUkFURVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldHVybiAwOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2NvbmZpZ19jdnNfdm9jb2RlcihzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICphcHJfY3ZzOwotCXUxNiBjdnNfaGFuZGxlOwotCS8qIFNldCBtZWRpYSB0eXBlLiAqLwotCXN0cnVjdCBjdnNfc2V0X21lZGlhX3R5cGVfY21kIGN2c19zZXRfbWVkaWFfY21kOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCWN2c19zZXRfbWVkaWFfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQljdnNfc2V0X21lZGlhX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQkJc2l6ZW9mKGN2c19zZXRfbWVkaWFfY21kKSAtCi0JCQkJCQlBUFJfSERSX1NJWkUpOwotCWN2c19zZXRfbWVkaWFfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnNfc2V0X21lZGlhX2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQljdnNfc2V0X21lZGlhX2NtZC5oZHIudG9rZW4gPSAwOwotCWN2c19zZXRfbWVkaWFfY21kLmhkci5vcGNvZGUgPSBWU1NfSVNUUkVBTV9DTURfU0VUX01FRElBX1RZUEU7Ci0JY3ZzX3NldF9tZWRpYV9jbWQubWVkaWFfdHlwZS50eF9tZWRpYV9pZCA9IGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlOwotCWN2c19zZXRfbWVkaWFfY21kLm1lZGlhX3R5cGUucnhfbWVkaWFfaWQgPSBjb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZTsKLQotCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCi0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3NldF9tZWRpYV9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX01FRElBX1RZUEVcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCQlnb3RvIGZhaWw7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogU2V0IGVuY29kZXIgcHJvcGVydGllcy4gKi8KLQlzd2l0Y2ggKGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlKSB7Ci0JY2FzZSBWU1NfTUVESUFfSURfRVZSQ19NT0RFTToKLQljYXNlIFZTU19NRURJQV9JRF80R1ZfTkJfTU9ERU06Ci0JY2FzZSBWU1NfTUVESUFfSURfNEdWX1dCX01PREVNOgotCWNhc2UgVlNTX01FRElBX0lEXzRHVl9OV19NT0RFTTogewotCQlzdHJ1Y3QgY3ZzX3NldF9jZG1hX2VuY19taW5tYXhfcmF0ZV9jbWQgY3ZzX3NldF9jZG1hX3JhdGU7Ci0KLQkJcHJfZGVidWcoIlNldHRpbmcgRVZSQyBtaW4tbWF4IHJhdGVcbiIpOwotCi0JCWN2c19zZXRfY2RtYV9yYXRlLmhkci5oZHJfZmllbGQgPQotCQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJICAgICAgc2l6ZW9mKGN2c19zZXRfY2RtYV9yYXRlKSAtIEFQUl9IRFJfU0laRSk7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJY3ZzX3NldF9jZG1hX3JhdGUuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmhkci50b2tlbiA9IDA7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmhkci5vcGNvZGUgPQotCQkJCVZTU19JU1RSRUFNX0NNRF9DRE1BX1NFVF9FTkNfTUlOTUFYX1JBVEU7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmNkbWFfcmF0ZS5taW5fcmF0ZSA9Ci0JCQkJY29tbW9uLm12c19pbmZvLmV2cmNfbWluX3JhdGU7Ci0JCWN2c19zZXRfY2RtYV9yYXRlLmNkbWFfcmF0ZS5tYXhfcmF0ZSA9Ci0JCQkJY29tbW9uLm12c19pbmZvLmV2cmNfbWF4X3JhdGU7Ci0KLQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCQl2LT5hc3luY19lcnIgPSAwOwotCi0JCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zZXRfY2RtYV9yYXRlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU0VUX0VWUkNfTUlOTUFYX1JBVEVcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JCWlmICghcmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCXYtPmFzeW5jX2Vycik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlpZiAoY29tbW9uLm12c19pbmZvLm1lZGlhX3R5cGUgIT0gVlNTX01FRElBX0lEX0VWUkNfTU9ERU0pIHsKLQkJCXJldCA9IHZvaWNlX3NldF9kdHgodik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0JY2FzZSBWU1NfTUVESUFfSURfQU1SX05CX01PREVNOgotCWNhc2UgVlNTX01FRElBX0lEX0FNUl9XQl9NT0RFTTogewotCQlyZXQgPSB2b2ljZV9jb25maWdfY3ZzX3ZvY29kZXJfYW1yX3JhdGUodik7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byB1cGRhdGUgdm9jb2RlciByYXRlLiAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJcmV0ID0gdm9pY2Vfc2V0X2R0eCh2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZhaWw7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVlNTX01FRElBX0lEX0c3Mjk6Ci0JY2FzZSBWU1NfTUVESUFfSURfRzcxMV9BTEFXOgotCWNhc2UgVlNTX01FRElBX0lEX0c3MTFfTVVMQVc6IHsKLQkJcmV0ID0gdm9pY2Vfc2V0X2R0eCh2KTsKLQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJLyogRG8gbm90aGluZy4gKi8KLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfdXBkYXRlX2Ftcl92b2NvZGVyX3JhdGUodWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdjsKLQotCXByX2RlYnVnKCIlczogc2Vzc2lvbl9pZDolZCIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCXYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMLCBzZXNzaW9uX2lkOiVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIHNlc3Npb25faWQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlyZXQgPSB2b2ljZV9jb25maWdfY3ZzX3ZvY29kZXJfYW1yX3JhdGUodik7Ci0JbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfc3RhcnRfdm9pY2VfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBhcHJfaGRyIG12bV9zdGFydF92b2ljZV9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCi0JbXZtX3N0YXJ0X3ZvaWNlX2NtZC5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltdm1fc3RhcnRfdm9pY2VfY21kLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YobXZtX3N0YXJ0X3ZvaWNlX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXByX2RlYnVnKCJzZW5kIG12bV9zdGFydF92b2ljZV9jbWQgcGt0IHNpemUgPSAlZFxuIiwKLQkJCQltdm1fc3RhcnRfdm9pY2VfY21kLnBrdF9zaXplKTsKLQltdm1fc3RhcnRfdm9pY2VfY21kLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCW12bV9zdGFydF92b2ljZV9jbWQuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKLQltdm1fc3RhcnRfdm9pY2VfY21kLnRva2VuID0gMDsKLQltdm1fc3RhcnRfdm9pY2VfY21kLm9wY29kZSA9IFZTU19JTVZNX0NNRF9TVEFSVF9WT0lDRTsKLQotCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV9zdGFydF92b2ljZV9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZTU19JTVZNX0NNRF9TVEFSVF9WT0lDRVxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZvY19nZXRfdHhfcnhfdG9wb2xvZ3koc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJICAgdWludDMyX3QgKnR4X3RvcG9sb2d5X2lkLAotCQkJCSAgIHVpbnQzMl90ICpyeF90b3BvbG9neV9pZCkKLXsKLQl1aW50MzJfdCB0eF9pZCA9IDA7Ci0JdWludDMyX3QgcnhfaWQgPSAwOwotCi0JaWYgKHYtPmxjaF9tb2RlID09IFZPSUNFX0xDSF9TVEFSVCB8fCB2LT5kaXNhYmxlX3RvcG9sb2d5KSB7Ci0JCXByX2RlYnVnKCIlczogU2V0dGluZyBUWCBhbmQgUlggdG9wb2xvZ3kgdG8gTk9ORSBmb3IgTENIXG4iLAotCQkJIF9fZnVuY19fKTsKLQotCQl0eF9pZCA9IFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FOwotCQlyeF9pZCA9IFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FOwotCX0gZWxzZSB7Ci0JCXR4X2lkID0gdm9pY2VfZ2V0X3RvcG9sb2d5KENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMKTsKLQkJcnhfaWQgPSB2b2ljZV9nZXRfdG9wb2xvZ3koQ1ZQX1ZPQ19SWF9UT1BPTE9HWV9DQUwpOwotCX0KLQotCSp0eF90b3BvbG9neV9pZCA9IHR4X2lkOwotCSpyeF90b3BvbG9neV9pZCA9IHJ4X2lkOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfc2V0X2RldmljZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0Jc3RydWN0IGN2cF9zZXRfZGV2aWNlX2NtZCAgY3ZwX3NldGRldl9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0KLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JLyogc2V0IGRldmljZSBhbmQgd2FpdCBmb3IgcmVzcG9uc2UgKi8KLQljdnBfc2V0ZGV2X2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JY3ZwX3NldGRldl9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YoY3ZwX3NldGRldl9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQlwcl9kZWJ1ZygiIHNlbmQgY3JlYXRlIGN2cCBzZXRkZXYsIHBrdCBzaXplID0gJWRcbiIsCi0JCQljdnBfc2V0ZGV2X2NtZC5oZHIucGt0X3NpemUpOwotCWN2cF9zZXRkZXZfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnBfc2V0ZGV2X2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKLQljdnBfc2V0ZGV2X2NtZC5oZHIudG9rZW4gPSAwOwotCi0JaWYgKHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY29tbW9uLmN2ZF92ZXJzaW9uKSA+PQotCSAgICBDVkRfSU5UX1ZFUlNJT05fMl8yKQotCQljdnBfc2V0ZGV2X2NtZC5oZHIub3Bjb2RlID0KLQkJCQlWU1NfSVZPQ1BST0NfQ01EX1NFVF9ERVZJQ0VfVjM7Ci0JZWxzZQotCQljdnBfc2V0ZGV2X2NtZC5oZHIub3Bjb2RlID0KLQkJCQlWU1NfSVZPQ1BST0NfQ01EX1NFVF9ERVZJQ0VfVjI7Ci0KLQl2b2NfZ2V0X3R4X3J4X3RvcG9sb2d5KHYsCi0JCQkmY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIudHhfdG9wb2xvZ3lfaWQsCi0JCQkmY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIucnhfdG9wb2xvZ3lfaWQpOwotCi0JY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIudHhfcG9ydF9pZCA9IHYtPmRldl90eC5wb3J0X2lkOwotCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnJ4X3BvcnRfaWQgPSB2LT5kZXZfcngucG9ydF9pZDsKLQotCWlmIChjb21tb24uZWNfcmVmX2V4dCkgewotCQljdnBfc2V0ZGV2X2NtZC5jdnBfc2V0X2RldmljZV92Mi52b2Nwcm9jX21vZGUgPQotCQkJCVZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfRVhUX01JWElORzsKLQkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIuZWNfcmVmX3BvcnRfaWQgPQotCQkJCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5wb3J0X2lkOwotCX0gZWxzZSB7Ci0JCWN2cF9zZXRkZXZfY21kLmN2cF9zZXRfZGV2aWNlX3YyLnZvY3Byb2NfbW9kZSA9Ci0JCQkJICAgIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORzsKLQkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIuZWNfcmVmX3BvcnRfaWQgPQotCQkJCSAgICBWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FOwotCX0KLQlwcl9kZWJ1ZygidG9wb2xvZ3k9JWQgLCB0eF9wb3J0X2lkPSVkLCByeF9wb3J0X2lkPSVkXG4iLAotCQljdnBfc2V0ZGV2X2NtZC5jdnBfc2V0X2RldmljZV92Mi50eF90b3BvbG9neV9pZCwKLQkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIudHhfcG9ydF9pZCwKLQkJY3ZwX3NldGRldl9jbWQuY3ZwX3NldF9kZXZpY2VfdjIucnhfcG9ydF9pZCk7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc2V0ZGV2X2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVlNTX0lWT0NQUk9DX0NNRF9TRVRfREVWSUNFXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCSh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX3N0b3Bfdm9pY2VfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBhcHJfaGRyIG12bV9zdG9wX3ZvaWNlX2NtZDsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICphcHJfbXZtOwotCXUxNiBtdm1faGFuZGxlOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKLQotCWlmICghYXByX212bSkgewotCQlwcl9lcnIoIiVzOiBhcHJfbXZtIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltdm1faGFuZGxlID0gdm9pY2VfZ2V0X212bV9oYW5kbGUodik7Ci0KLQltdm1fc3RvcF92b2ljZV9jbWQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JbXZtX3N0b3Bfdm9pY2VfY21kLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YobXZtX3N0b3Bfdm9pY2VfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JcHJfZGVidWcoInNlbmQgbXZtX3N0b3Bfdm9pY2VfY21kIHBrdCBzaXplID0gJWRcbiIsCi0JCQkJbXZtX3N0b3Bfdm9pY2VfY21kLnBrdF9zaXplKTsKLQltdm1fc3RvcF92b2ljZV9jbWQuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JbXZtX3N0b3Bfdm9pY2VfY21kLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JbXZtX3N0b3Bfdm9pY2VfY21kLnRva2VuID0gMDsKLQltdm1fc3RvcF92b2ljZV9jbWQub3Bjb2RlID0gVlNTX0lNVk1fQ01EX1NUT1BfVk9JQ0U7Ci0KLQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX212bSwgKHVpbnQzMl90ICopICZtdm1fc3RvcF92b2ljZV9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZTU19JTVZNX0NNRF9TVE9QX1ZPSUNFXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCi0JCQkJICh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIGludCB2b2ljZV9nZXRfY2FsKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqKmNhbF9ibG9jaywKLQkJCSBpbnQgY2FsX2Jsb2NrX2lkeCwKLQkJCSBzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKipjb2xfZGF0YSwKLQkJCSBpbnQgY29sX2RhdGFfaWR4LCBpbnQgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCSpjYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAotCQljb21tb24uY2FsX2RhdGFbY2FsX2Jsb2NrX2lkeF0pOwotCWlmICgqY2FsX2Jsb2NrID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogTm8gY2FsIGRhdGEgZm9yIGNhbCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2Jsb2NrX2lkeCk7Ci0KLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSByZW1hcF9jYWxfZGF0YSgqY2FsX2Jsb2NrLCBzZXNzaW9uX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBSZW1hcF9jYWxfZGF0YSBmYWlsZWQgZm9yIGNhbCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX2Jsb2NrX2lkeCk7Ci0KLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb2xfZGF0YSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0KLQkqY29sX2RhdGEgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAotCQljb21tb24uY2FsX2RhdGFbY29sX2RhdGFfaWR4XSk7Ci0JaWYgKCpjb2xfZGF0YSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE5vIGNhbCBkYXRhIGZvciBjYWwgJWQhXG4iLAotCQkJX19mdW5jX18sIGNvbF9kYXRhX2lkeCk7Ci0KLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2c19yZWdpc3Rlcl9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBjdnNfcmVnaXN0ZXJfY2FsX2RhdGFfY21kIGN2c19yZWdfY2FsX2NtZDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjb2xfZGF0YSA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KLQltZW1zZXQoJmN2c19yZWdfY2FsX2NtZCwgMCwgc2l6ZW9mKGN2c19yZWdfY2FsX2NtZCkpOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCFjb21tb24uYXByX3E2X2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNhbF9kYXRhW0NWU19WT0NTVFJNX0NBTF0tPmxvY2spOwotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlNfVk9DU1RSTV9DT0xfQ0FMXS0+bG9jayk7Ci0KLQlyZXQgPSB2b2ljZV9nZXRfY2FsKCZjYWxfYmxvY2ssIENWU19WT0NTVFJNX0NBTCwgJmNvbF9kYXRhLAotCQlDVlNfVk9DU1RSTV9DT0xfQ0FMLCB2LT5zZXNzaW9uX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBWb2ljZV9nZXRfY2FsIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKLQkJCV9fZnVuY19fLCBDVlNfVk9DU1RSTV9DQUwpOwotCi0JCWdvdG8gdW5sb2NrOwotCX0KLQotCW1lbWNweSgmY3ZzX3JlZ19jYWxfY21kLmN2c19jYWxfZGF0YS5jb2x1bW5faW5mb1swXSwKLQkgICAgICAgKHZvaWQgKikgJigoc3RydWN0IGF1ZGlvX2NhbF9pbmZvX3ZvY19jb2wgKikKLQkgICAgICAgY29sX2RhdGEtPmNhbF9pbmZvKS0+ZGF0YSwKLQkgICAgICAgY29sX2RhdGEtPmNhbF9kYXRhLnNpemUpOwotCi0JY3ZzX3JlZ19jYWxfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljdnNfcmVnX2NhbF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YoY3ZzX3JlZ19jYWxfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZzX3JlZ19jYWxfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnNfcmVnX2NhbF9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCWN2c19yZWdfY2FsX2NtZC5oZHIudG9rZW4gPSAwOwotCWlmIChjb21tb24uaXNfcGVyX3ZvY29kZXJfY2FsX2VuYWJsZWQpCi0JCWN2c19yZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JU1RSRUFNX0NNRF9SRUdJU1RFUl9TVEFUSUNfQ0FMSUJSQVRJT05fREFUQTsKLQllbHNlCi0JCWN2c19yZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JU1RSRUFNX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyOwotCi0JY3ZzX3JlZ19jYWxfY21kLmN2c19jYWxfZGF0YS5jYWxfbWVtX2hhbmRsZSA9Ci0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCWN2c19yZWdfY2FsX2NtZC5jdnNfY2FsX2RhdGEuY2FsX21lbV9hZGRyZXNzX2xzdyA9Ci0JCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JY3ZzX3JlZ19jYWxfY21kLmN2c19jYWxfZGF0YS5jYWxfbWVtX2FkZHJlc3NfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JY3ZzX3JlZ19jYWxfY21kLmN2c19jYWxfZGF0YS5jYWxfbWVtX3NpemUgPQotCQljYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3JlZ19jYWxfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCByZWdpc3RlcmluZyBDVlMgY2FsXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2c193YWl0LAotCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIHVubG9jazsKLQl9Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZTX1ZPQ1NUUk1fQ09MX0NBTF0tPmxvY2spOwotCW11dGV4X3VubG9jaygmY29tbW9uLmNhbF9kYXRhW0NWU19WT0NTVFJNX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZzX2RlcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgY3ZzX2RlcmVnaXN0ZXJfY2FsX2RhdGFfY21kIGN2c19kZXJlZ19jYWxfY21kOwotCWludCByZXQgPSAwOwotCi0JbWVtc2V0KCZjdnNfZGVyZWdfY2FsX2NtZCwgMCwgc2l6ZW9mKGN2c19kZXJlZ19jYWxfY21kKSk7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZzKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBkb25lOwotCX0KLQotCWN2c19kZXJlZ19jYWxfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljdnNfZGVyZWdfY2FsX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnNfZGVyZWdfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2c19kZXJlZ19jYWxfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnNfZGVyZWdfY2FsX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0JY3ZzX2RlcmVnX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKLQlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQotCQljdnNfZGVyZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JU1RSRUFNX0NNRF9ERVJFR0lTVEVSX1NUQVRJQ19DQUxJQlJBVElPTl9EQVRBOwotCWVsc2UKLQkJY3ZzX2RlcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9Ci0JCQlWU1NfSVNUUkVBTV9DTURfREVSRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZzLCAodWludDMyX3QgKikgJmN2c19kZXJlZ19jYWxfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBkZS1yZWdpc3RlcmluZyBDVlMgY2FsXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCAgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2NyZWF0ZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0Jc3RydWN0IGN2cF9jcmVhdGVfZnVsbF9jdGxfc2Vzc2lvbl9jbWQgY3ZwX3Nlc3Npb25fY21kOwotCXZvaWQgKmFwcl9jdnA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCWlmICghYXByX2N2cCkgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIGNyZWF0ZSBjdnAgc2Vzc2lvbiBhbmQgd2FpdCBmb3IgcmVzcG9uc2UgKi8KLQljdnBfc2Vzc2lvbl9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCWN2cF9zZXNzaW9uX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfc2Vzc2lvbl9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQlwcl9kZWJ1ZygiJXM6IHNlbmQgY3JlYXRlIGN2cCBzZXNzaW9uLCBwa3Qgc2l6ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGN2cF9zZXNzaW9uX2NtZC5oZHIucGt0X3NpemUpOwotCWN2cF9zZXNzaW9uX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3Nlc3Npb25fY21kLmhkci5kZXN0X3BvcnQgPSAwOwotCWN2cF9zZXNzaW9uX2NtZC5oZHIudG9rZW4gPSAwOwotCi0JaWYgKHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY29tbW9uLmN2ZF92ZXJzaW9uKSA+PQotCSAgICBDVkRfSU5UX1ZFUlNJT05fMl8yKQotCQljdnBfc2Vzc2lvbl9jbWQuaGRyLm9wY29kZSA9Ci0JCQkJVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjM7Ci0JZWxzZQotCQljdnBfc2Vzc2lvbl9jbWQuaGRyLm9wY29kZSA9Ci0JCQkJVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjI7Ci0KLQl2b2NfZ2V0X3R4X3J4X3RvcG9sb2d5KHYsCi0JCQkmY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnR4X3RvcG9sb2d5X2lkLAotCQkJJmN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi5yeF90b3BvbG9neV9pZCk7Ci0KLQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24uZGlyZWN0aW9uID0gMjsgLyp0eCBhbmQgcngqLwotCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi50eF9wb3J0X2lkID0gdi0+ZGV2X3R4LnBvcnRfaWQ7Ci0JY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnJ4X3BvcnRfaWQgPSB2LT5kZXZfcngucG9ydF9pZDsKLQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24ucHJvZmlsZV9pZCA9Ci0JCQkJCSBWU1NfSUNPTU1PTl9DQUxfTkVUV09SS19JRF9OT05FOwotCWlmIChjb21tb24uZWNfcmVmX2V4dCkgewotCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24udm9jcHJvY19tb2RlID0KLQkJCQlWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkc7Ci0JCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi5lY19yZWZfcG9ydF9pZCA9Ci0JCQkJY29tbW9uLmVjX21lZGlhX2ZtdF9pbmZvLnBvcnRfaWQ7Ci0JfSBlbHNlIHsKLQkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnZvY3Byb2NfbW9kZSA9Ci0JCQkJIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORzsKLQkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLmVjX3JlZl9wb3J0X2lkID0KLQkJCQkJCSBWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FOwotCX0KLQotCXByX2RlYnVnKCJ0eF90b3BvbG9neTogJWQgdHhfcG9ydF9pZD0lZCwgcnhfcG9ydF9pZD0lZCwgbW9kZTogMHgleFxuIiwKLQkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnR4X3RvcG9sb2d5X2lkLAotCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24udHhfcG9ydF9pZCwKLQkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnJ4X3BvcnRfaWQsCi0JCWN2cF9zZXNzaW9uX2NtZC5jdnBfc2Vzc2lvbi52b2Nwcm9jX21vZGUpOwotCXByX2RlYnVnKCJyeF90b3BvbG9neTogJWQsIHByb2ZpbGVfaWQ6IDB4JXgsIHBrdF9zaXplOiAlZFxuIiwKLQkJY3ZwX3Nlc3Npb25fY21kLmN2cF9zZXNzaW9uLnJ4X3RvcG9sb2d5X2lkLAotCQljdnBfc2Vzc2lvbl9jbWQuY3ZwX3Nlc3Npb24ucHJvZmlsZV9pZCwKLQkJY3ZwX3Nlc3Npb25fY21kLmhkci5wa3Rfc2l6ZSk7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc2Vzc2lvbl9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZPQ1BST0NfRlVMTF9DT05UUk9MX1NFU1NJT05cbiIpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX3JlZ2lzdGVyX2Rldl9jZmdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBjdnBfcmVnaXN0ZXJfZGV2X2NmZ19jbWQgY3ZwX3JlZ19kZXZfY2ZnX2NtZDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0JaW50IHJldCA9IDA7Ci0KLQltZW1zZXQoJmN2cF9yZWdfZGV2X2NmZ19jbWQsIDAsIHNpemVvZihjdnBfcmVnX2Rldl9jZmdfY21kKSk7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DREVWX0NGR19DQUxdLT5sb2NrKTsKLQotCXJldCA9IHZvaWNlX2dldF9jYWwoJmNhbF9ibG9jaywgQ1ZQX1ZPQ0RFVl9DRkdfQ0FMLCBOVUxMLAotCQkwLCB2LT5zZXNzaW9uX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBWb2ljZV9nZXRfY2FsIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKLQkJCV9fZnVuY19fLCBDVlBfVk9DREVWX0NGR19DQUwpOwotCi0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YoY3ZwX3JlZ19kZXZfY2ZnX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuaGRyLnRva2VuID0gMDsKLQljdnBfcmVnX2Rldl9jZmdfY21kLmhkci5vcGNvZGUgPQotCQkJCQlWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RFVklDRV9DT05GSUc7Ci0KLQljdnBfcmVnX2Rldl9jZmdfY21kLmN2cF9kZXZfY2ZnX2RhdGEubWVtX2hhbmRsZSA9Ci0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuY3ZwX2Rldl9jZmdfZGF0YS5tZW1fYWRkcmVzc19sc3cgPQotCQlsb3dlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCWN2cF9yZWdfZGV2X2NmZ19jbWQuY3ZwX2Rldl9jZmdfZGF0YS5tZW1fYWRkcmVzc19tc3cgPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQljdnBfcmVnX2Rldl9jZmdfY21kLmN2cF9kZXZfY2ZnX2RhdGEubWVtX3NpemUgPQotCQljYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnAsCi0JCQkgICAodWludDMyX3QgKikgJmN2cF9yZWdfZGV2X2NmZ19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHJlZ2lzdGVyaW5nIENWUCBkZXYgY2ZnIGNhbFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2s7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLXVubG9jazoKLQltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DREVWX0NGR19DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBjdnBfZGVyZWdpc3Rlcl9kZXZfY2ZnX2NtZCBjdnBfZGVyZWdfZGV2X2NmZ19jbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQltZW1zZXQoJmN2cF9kZXJlZ19kZXZfY2ZnX2NtZCwgMCwgc2l6ZW9mKGN2cF9kZXJlZ19kZXZfY2ZnX2NtZCkpOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCFjb21tb24uYXByX3E2X2N2cCkgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdnBfZGVyZWdfZGV2X2NmZ19jbWQuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWN2cF9kZXJlZ19kZXZfY2ZnX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfZGVyZWdfZGV2X2NmZ19jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnBfZGVyZWdfZGV2X2NmZ19jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF9kZXJlZ19kZXZfY2ZnX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0JY3ZwX2RlcmVnX2Rldl9jZmdfY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZwX2RlcmVnX2Rldl9jZmdfY21kLmhkci5vcGNvZGUgPQotCQkJCVZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9ERVZJQ0VfQ09ORklHOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZwLAotCQkJICAgKHVpbnQzMl90ICopICZjdnBfZGVyZWdfZGV2X2NmZ19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIGRlLXJlZ2lzdGVyaW5nIENWUCBkZXYgY2ZnIGNhbFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgY3ZwX3JlZ2lzdGVyX2NhbF9kYXRhX2NtZCBjdnBfcmVnX2NhbF9jbWQ7Ci0Jc3RydWN0IGNhbF9ibG9ja19kYXRhICpjYWxfYmxvY2sgPSBOVUxMOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY29sX2RhdGEgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JbWVtc2V0KCZjdnBfcmVnX2NhbF9jbWQsIDAsIHNpemVvZihjdnBfcmVnX2NhbF9jbWQpKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghY29tbW9uLmFwcl9xNl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DUFJPQ19DQUxdLT5sb2NrKTsKLQltdXRleF9sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZQX1ZPQ1BST0NfQ09MX0NBTF0tPmxvY2spOwotCi0JcmV0ID0gdm9pY2VfZ2V0X2NhbCgmY2FsX2Jsb2NrLCBDVlBfVk9DUFJPQ19DQUwsICZjb2xfZGF0YSwKLQkJQ1ZQX1ZPQ1BST0NfQ09MX0NBTCwgdi0+c2Vzc2lvbl9pZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogVm9pY2VfZ2V0X2NhbCBmYWlsZWQgZm9yIGNhbCAlZCFcbiIsCi0JCQlfX2Z1bmNfXywgQ1ZQX1ZPQ1BST0NfQ0FMKTsKLQotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQl2LT5kZXZfdHguZGV2X2lkID0gKChzdHJ1Y3QgYXVkaW9fY2FsX2luZm9fdm9jcHJvYyAqKQotCQkJCWNhbF9ibG9jay0+Y2FsX2luZm8pLT50eF9hY2RiX2lkOwotCXYtPmRldl9yeC5kZXZfaWQgPSAoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2Nwcm9jICopCi0JCQkJY2FsX2Jsb2NrLT5jYWxfaW5mbyktPnJ4X2FjZGJfaWQ7Ci0JcHJfZGVidWcoIiVzOiAlczogVHggYWNkYiBpZCA9ICVkIGFuZCBSeCBhY2RiIGlkID0gJWQiLCBfX2Z1bmNfXywKLQkJIHZvY19nZXRfc2Vzc2lvbl9uYW1lKHYtPnNlc3Npb25faWQpLCB2LT5kZXZfdHguZGV2X2lkLAotCQkgdi0+ZGV2X3J4LmRldl9pZCk7Ci0KLQltZW1jcHkoJmN2cF9yZWdfY2FsX2NtZC5jdnBfY2FsX2RhdGEuY29sdW1uX2luZm9bMF0sCi0JICAgICAgICh2b2lkICopICYoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sICopCi0JICAgICAgIGNvbF9kYXRhLT5jYWxfaW5mbyktPmRhdGEsCi0JICAgICAgIGNvbF9kYXRhLT5jYWxfZGF0YS5zaXplKTsKLQotCWN2cF9yZWdfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY3ZwX3JlZ19jYWxfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJc2l6ZW9mKGN2cF9yZWdfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2cF9yZWdfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3JlZ19jYWxfY21kLmhkci5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQljdnBfcmVnX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKLQlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQotCQljdnBfcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9Ci0JCQlWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX1NUQVRJQ19DQUxJQlJBVElPTl9EQVRBOwotCWVsc2UKLQkJY3ZwX3JlZ19jYWxfY21kLmhkci5vcGNvZGUgPQotCQkJVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyOwotCi0JY3ZwX3JlZ19jYWxfY21kLmN2cF9jYWxfZGF0YS5jYWxfbWVtX2hhbmRsZSA9Ci0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCWN2cF9yZWdfY2FsX2NtZC5jdnBfY2FsX2RhdGEuY2FsX21lbV9hZGRyZXNzX2xzdyA9Ci0JCWxvd2VyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JY3ZwX3JlZ19jYWxfY21kLmN2cF9jYWxfZGF0YS5jYWxfbWVtX2FkZHJlc3NfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkcik7Ci0JY3ZwX3JlZ19jYWxfY21kLmN2cF9jYWxfZGF0YS5jYWxfbWVtX3NpemUgPQotCQljYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX3JlZ19jYWxfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCByZWdpc3RlcmluZyBDVlAgY2FsXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIHVubG9jazsKLQl9Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZQX1ZPQ1BST0NfQ09MX0NBTF0tPmxvY2spOwotCW11dGV4X3VubG9jaygmY29tbW9uLmNhbF9kYXRhW0NWUF9WT0NQUk9DX0NBTF0tPmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgY3ZwX2RlcmVnaXN0ZXJfY2FsX2RhdGFfY21kIGN2cF9kZXJlZ19jYWxfY21kOwotCWludCByZXQgPSAwOwotCi0JbWVtc2V0KCZjdnBfZGVyZWdfY2FsX2NtZCwgMCwgc2l6ZW9mKGN2cF9kZXJlZ19jYWxfY21kKSk7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdnBfZGVyZWdfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JY3ZwX2RlcmVnX2NhbF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YoY3ZwX2RlcmVnX2NhbF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnBfZGVyZWdfY2FsX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX2RlcmVnX2NhbF9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCWN2cF9kZXJlZ19jYWxfY21kLmhkci50b2tlbiA9IDA7Ci0JaWYgKGNvbW1vbi5pc19wZXJfdm9jb2Rlcl9jYWxfZW5hYmxlZCkKLQkJY3ZwX2RlcmVnX2NhbF9jbWQuaGRyLm9wY29kZSA9Ci0JCQlWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE7Ci0JZWxzZQotCQljdnBfZGVyZWdfY2FsX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZwLCAodWludDMyX3QgKikgJmN2cF9kZXJlZ19jYWxfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBkZS1yZWdpc3RlcmluZyBDVlAgY2FsXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX3JlZ2lzdGVyX3ZvbF9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBjdnBfcmVnaXN0ZXJfdm9sX2NhbF9kYXRhX2NtZCBjdnBfcmVnX3ZvbF9jYWxfY21kOwotCXN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrID0gTlVMTDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNvbF9kYXRhID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQotCW1lbXNldCgmY3ZwX3JlZ192b2xfY2FsX2NtZCwgMCwgc2l6ZW9mKGN2cF9yZWdfdm9sX2NhbF9jbWQpKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghY29tbW9uLmFwcl9xNl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DVk9MX0NBTF0tPmxvY2spOwotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVtDVlBfVk9DVk9MX0NPTF9DQUxdLT5sb2NrKTsKLQotCXJldCA9IHZvaWNlX2dldF9jYWwoJmNhbF9ibG9jaywgQ1ZQX1ZPQ1ZPTF9DQUwsICZjb2xfZGF0YSwKLQkJQ1ZQX1ZPQ1ZPTF9DT0xfQ0FMLCB2LT5zZXNzaW9uX2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBWb2ljZV9nZXRfY2FsIGZhaWxlZCBmb3IgY2FsICVkIVxuIiwKLQkJCV9fZnVuY19fLCBDVlBfVk9DVk9MX0NBTCk7Ci0KLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JbWVtY3B5KCZjdnBfcmVnX3ZvbF9jYWxfY21kLmN2cF92b2xfY2FsX2RhdGEuY29sdW1uX2luZm9bMF0sCi0JICAgICAgICh2b2lkICopICYoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfY29sICopCi0JICAgICAgIGNvbF9kYXRhLT5jYWxfaW5mbyktPmRhdGEsCi0JICAgICAgIGNvbF9kYXRhLT5jYWxfZGF0YS5zaXplKTsKLQotCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YoY3ZwX3JlZ192b2xfY2FsX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuaGRyLnRva2VuID0gMDsKLQlpZiAoY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkKQotCQljdnBfcmVnX3ZvbF9jYWxfY21kLmhkci5vcGNvZGUgPQotCQkJVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9EWU5BTUlDX0NBTElCUkFUSU9OX0RBVEE7Ci0JZWxzZQotCQljdnBfcmVnX3ZvbF9jYWxfY21kLmhkci5vcGNvZGUgPQotCQkJVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9WT0xfQ0FMSUJSQVRJT05fREFUQTsKLQotCWN2cF9yZWdfdm9sX2NhbF9jbWQuY3ZwX3ZvbF9jYWxfZGF0YS5jYWxfbWVtX2hhbmRsZSA9Ci0JCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuY3ZwX3ZvbF9jYWxfZGF0YS5jYWxfbWVtX2FkZHJlc3NfbHN3ID0KLQkJbG93ZXJfMzJfYml0cyhjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyKTsKLQljdnBfcmVnX3ZvbF9jYWxfY21kLmN2cF92b2xfY2FsX2RhdGEuY2FsX21lbV9hZGRyZXNzX21zdyA9Ci0JCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIpOwotCWN2cF9yZWdfdm9sX2NhbF9jbWQuY3ZwX3ZvbF9jYWxfZGF0YS5jYWxfbWVtX3NpemUgPQotCQljYWxfYmxvY2stPmNhbF9kYXRhLnNpemU7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoY29tbW9uLmFwcl9xNl9jdnAsCi0JCQkgICAodWludDMyX3QgKikgJmN2cF9yZWdfdm9sX2NhbF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHJlZ2lzdGVyaW5nIENWUCB2b2wgY2FsXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIHVubG9jazsKLQl9Ci11bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZQX1ZPQ1ZPTF9DT0xfQ0FMXS0+bG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY2FsX2RhdGFbQ1ZQX1ZPQ1ZPTF9DQUxdLT5sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCXN0cnVjdCBjdnBfZGVyZWdpc3Rlcl92b2xfY2FsX2RhdGFfY21kIGN2cF9kZXJlZ192b2xfY2FsX2NtZDsKLQlpbnQgcmV0ID0gMDsKLQotCW1lbXNldCgmY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLCAwLCBzaXplb2YoY3ZwX2RlcmVnX3ZvbF9jYWxfY21kKSk7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIWNvbW1vbi5hcHJfcTZfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBkb25lOwotCX0KLQotCWN2cF9kZXJlZ192b2xfY2FsX2NtZC5oZHIuaGRyX2ZpZWxkID0KLQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWN2cF9kZXJlZ192b2xfY2FsX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfZGVyZWdfdm9sX2NhbF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnBfZGVyZWdfdm9sX2NhbF9jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF9kZXJlZ192b2xfY2FsX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0JY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci50b2tlbiA9IDA7Ci0JaWYgKGNvbW1vbi5pc19wZXJfdm9jb2Rlcl9jYWxfZW5hYmxlZCkKLQkJY3ZwX2RlcmVnX3ZvbF9jYWxfY21kLmhkci5vcGNvZGUgPQotCQkJVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQTsKLQllbHNlCi0JCWN2cF9kZXJlZ192b2xfY2FsX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9WT0xfQ0FMSUJSQVRJT05fREFUQTsKLQotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cCwKLQkJCSAgICh1aW50MzJfdCAqKSAmY3ZwX2RlcmVnX3ZvbF9jYWxfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBkZS1yZWdpc3RlcmluZyBDVlAgdm9sIGNhbFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfbWFwX21lbW9yeV9waHlzaWNhbF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJCSBzdHJ1Y3QgbWVtX21hcF90YWJsZSAqdGFibGVfaW5mbywKLQkJCQkJIGRtYV9hZGRyX3QgcGh5cywKLQkJCQkJIHVpbnQzMl90IHNpemUsCi0JCQkJCSB1aW50MzJfdCB0b2tlbikKLXsKLQlzdHJ1Y3QgdnNzX2ltZW1vcnlfY21kX21hcF9waHlzaWNhbF90IG12bV9tYXBfcGh5c19jbWQ7Ci0JdWludDMyX3QgKm1lbXRhYmxlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmICghY29tbW9uLmFwcl9xNl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKCF0YWJsZV9pbmZvLT5kYXRhKSB7Ci0JCXByX2VycigiJXM6IG1lbW9yeSB0YWJsZSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JbWVtdGFibGUgPSAodWludDMyX3QgKikgdGFibGVfaW5mby0+ZGF0YTsKLQotCS8qCi0JICogU3RvcmUgbmV4dCB0YWJsZSBkZXNjcmlwdG9yJ3MgYWRkcmVzcyg2NCBiaXQpIGFzIE5VTEwgYXMgdGhlcmUKLQkgKiBpcyBvbmx5IG9uZSBtZW1vcnkgYmxvY2sKLQkgKi8KLQltZW10YWJsZVswXSA9IDA7Ci0JbWVtdGFibGVbMV0gPSAwOwotCi0JLyogU3RvcmUgbmV4dCB0YWJsZSBkZXNjcmlwdG9yJ3Mgc2l6ZSAqLwotCW1lbXRhYmxlWzJdID0gMDsKLQotCS8qIFN0b3JlIHNoYXJlZCBtZW0gYWRkZHJlc3MgKDY0IGJpdCkgKi8KLQltZW10YWJsZVszXSA9IGxvd2VyXzMyX2JpdHMocGh5cyk7Ci0JbWVtdGFibGVbNF0gPSBtc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhwaHlzKTsKLQotCS8qIFN0b3JlIHNoYXJlZCBtZW1vcnkgc2l6ZSAqLwotCW1lbXRhYmxlWzVdID0gc2l6ZTsKLQotCW12bV9tYXBfcGh5c19jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCW12bV9tYXBfcGh5c19jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YobXZtX21hcF9waHlzX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCW12bV9tYXBfcGh5c19jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCW12bV9tYXBfcGh5c19jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCW12bV9tYXBfcGh5c19jbWQuaGRyLnRva2VuID0gdG9rZW47Ci0JbXZtX21hcF9waHlzX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lNRU1PUllfQ01EX01BUF9QSFlTSUNBTDsKLQotCW12bV9tYXBfcGh5c19jbWQudGFibGVfZGVzY3JpcHRvci5tZW1fYWRkcmVzc19sc3cgPQotCQkJbG93ZXJfMzJfYml0cyh0YWJsZV9pbmZvLT5waHlzKTsKLQltdm1fbWFwX3BoeXNfY21kLnRhYmxlX2Rlc2NyaXB0b3IubWVtX2FkZHJlc3NfbXN3ID0KLQkJCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKHRhYmxlX2luZm8tPnBoeXMpOwotCW12bV9tYXBfcGh5c19jbWQudGFibGVfZGVzY3JpcHRvci5tZW1fc2l6ZSA9Ci0JCQlzaXplb2Yoc3RydWN0IHZzc19pbWVtb3J5X2Jsb2NrX3QpICsKLQkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfZGVzY3JpcHRvcl90KTsKLQltdm1fbWFwX3BoeXNfY21kLmlzX2NhY2hlZCA9IHRydWU7Ci0JbXZtX21hcF9waHlzX2NtZC5jYWNoZV9saW5lX3NpemUgPSAxMjg7Ci0JbXZtX21hcF9waHlzX2NtZC5hY2Nlc3NfbWFzayA9IDM7Ci0JbXZtX21hcF9waHlzX2NtZC5wYWdlX2FsaWduID0gNDA5NjsKLQltdm1fbWFwX3BoeXNfY21kLm1pbl9kYXRhX3dpZHRoID0gODsKLQltdm1fbWFwX3BoeXNfY21kLm1heF9kYXRhX3dpZHRoID0gNjQ7Ci0KLQlwcl9kZWJ1ZygiJXM6IG5leHQgdGFibGUgZGVzYzogYWRkOiAlbGxkLCBzaXplOiAlZFxuIiwKLQkJIF9fZnVuY19fLCAqKCh1aW50NjRfdCAqKSBtZW10YWJsZSksCi0JCSAqKCgodWludDMyX3QgKikgbWVtdGFibGUpICsgMikpOwotCXByX2RlYnVnKCIlczogcGh5IGFkZCBvZiBvZiBtZW0gYmVpbmcgbWFwcGVkIExTVzoweCV4LCBNU1c6MHgleCBzaXplOiAlZFxuIiwKLQkJIF9fZnVuY19fLCAqKCgodWludDMyX3QgKikgbWVtdGFibGUpICsgMyksCi0JCSooKCh1aW50MzJfdCAqKSBtZW10YWJsZSkgKyA0KSwgKigoKHVpbnQzMl90ICopIG1lbXRhYmxlKSArIDUpKTsKLQotCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X212bSwgKHVpbnQzMl90ICopICZtdm1fbWFwX3BoeXNfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIG12bSBtYXAgcGh5IGNtZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiBDb21tYW5kIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3BhdXNlX3ZvaWNlX2NhbGwoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0Jc3RydWN0IGFwcl9oZHIJbXZtX3BhdXNlX3ZvaWNlX2NtZDsKLQl2b2lkCQkqYXByX212bTsKLQlpbnQJCXJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogVm9pY2UgZGF0YSBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWFwcl9tdm0gPSBjb21tb24uYXByX3E2X212bTsKLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdm1fcGF1c2Vfdm9pY2VfY21kLmhkcl9maWVsZCA9Ci0JCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQltdm1fcGF1c2Vfdm9pY2VfY21kLnBrdF9zaXplID0KLQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJc2l6ZW9mKG12bV9wYXVzZV92b2ljZV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQltdm1fcGF1c2Vfdm9pY2VfY21kLnNyY19wb3J0ID0KLQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JbXZtX3BhdXNlX3ZvaWNlX2NtZC5kZXN0X3BvcnQgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKLQltdm1fcGF1c2Vfdm9pY2VfY21kLnRva2VuID0gMDsKLQltdm1fcGF1c2Vfdm9pY2VfY21kLm9wY29kZSA9IFZTU19JTVZNX0NNRF9QQVVTRV9WT0lDRTsKLQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQotCXByX2RlYnVnKCIlczogc2VuZCBtdm1fcGF1c2Vfdm9pY2VfY21kIHBrdCBzaXplID0gJWRcbiIsCi0JCV9fZnVuY19fLCBtdm1fcGF1c2Vfdm9pY2VfY21kLnBrdF9zaXplKTsKLQotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLAotCQkodWludDMyX3QgKikmbXZtX3BhdXNlX3ZvaWNlX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVlNTX0lNVk1fQ01EX1BBVVNFX1ZPSUNFXG4iKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IENvbW1hbmQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX21hcF9jYWxfbWVtb3J5KHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLAotCQkJCXVpbnQzMl90IHNlc3Npb25faWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHZvY19pbmRleDsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYWwgYmxvY2sgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIGFkZHJlc3MgdG8gbWFwIVxuIiwgX19mdW5jX18pOwotCi0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA9PSAwKSB7Ci0JCXByX2RlYnVnKCIlczogTWFwIHNpemUgaXMgMCFcbiIsIF9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jdm9jX2luZGV4ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpZiAodm9jX2luZGV4IDwgMCkgewotCQlwcl9lcnIoIiVzOiAgSW52YWxpZCBzZXNzaW9uIElEICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JdiA9ICZjb21tb24udm9pY2Vbdm9jX2luZGV4XTsKLQotCXJlc3VsdCA9IHZvaWNlX21hcF9tZW1vcnlfcGh5c2ljYWxfY21kKHYsCi0JCSZjb21tb24uY2FsX21lbV9tYXBfdGFibGUsCi0JCShkbWFfYWRkcl90KWNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsCi0JCVZPQ19DQUxfTUVNX01BUF9UT0tFTik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogTW1hcCBkaWQgbm90IHdvcmshIGFkZHIgPSAweCVwSywgc2l6ZSA9ICV6ZFxuIiwKLQkJCV9fZnVuY19fLAotCQkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLm1hcF9zaXplKTsKLQotCQlnb3RvIGRvbmVfdW5sb2NrOwotCX0KLQotCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gY29tbW9uLmNhbF9tZW1faGFuZGxlOwotZG9uZV91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IHJlbWFwX2NhbF9kYXRhKHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrLAotCQkJICAgdWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEuaW9uX2NsaWVudCA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IE5vIElPTiBhbGxvY2F0aW9uIGZvciBzZXNzaW9uX2lkICVkIVxuIiwKLQkJCV9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICgoY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSA+IDApICYmCi0JCShjYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSA9PSAwKSkgewotCi0JCS8qIGNhbCB0eXBlIG5vdCB1c2VkICovCi0JCXJldCA9IHZvaWNlX21hcF9jYWxfbWVtb3J5KGNhbF9ibG9jaywgc2Vzc2lvbl9pZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBNbWFwIGRpZCBub3Qgd29yayEgc2l6ZSA9ICV6ZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci0KLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogIENhbCBibG9jayAweCVwSywgc2l6ZSAlemQgYWxyZWFkeSBtYXBwZWQuIFE2IG1hcCBoYW5kbGUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCAmY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUsCi0JCQljYWxfYmxvY2stPm1hcF9kYXRhLnE2bWFwX2hhbmRsZSk7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3VubWFwX2NhbF9tZW1vcnkoaW50MzJfdCBjYWxfdHlwZSwKLQkJCQkgIHN0cnVjdCBjYWxfYmxvY2tfZGF0YSAqY2FsX2Jsb2NrKQotewotCWludCByZXN1bHQgPSAwOwotCWludCByZXN1bHQyID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjYWxfYmxvY2sgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYWwgYmxvY2sgaXMgTlVMTCFcbiIsIF9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBRNiBoYW5kbGUgaXMgbm90IHNldCFcbiIsIF9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKLQkJdiA9ICZjb21tb24udm9pY2VbaV07Ci0KLQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0JCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkpIHsKLQkJCXJlc3VsdDIgPSB2b2ljZV9wYXVzZV92b2ljZV9jYWxsKHYpOwotCQkJaWYgKHJlc3VsdDIgPCAwKSB7Ci0JCQkJcHJfZXJyKCIlczogVm9pY2VfcGF1c2Vfdm9pY2VfY2FsbCBmYWlsZWQgZm9yIHNlc3Npb24gMHgleCwgZXJyICVkIVxuIiwKLQkJCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQsIHJlc3VsdDIpOwotCi0JCQkJcmVzdWx0ID0gcmVzdWx0MjsKLQkJCX0KLQotCQkJaWYgKGNhbF90eXBlID09IENWUF9WT0NQUk9DX0RZTkFNSUNfQ0FMX1RZUEUpCi0JCQkJdm9pY2Vfc2VuZF9jdnBfZGVyZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKLQkJCWVsc2UgaWYgKGNhbF90eXBlID09IENWUF9WT0NQUk9DX1NUQVRJQ19DQUxfVFlQRSkKLQkJCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2NhbF9jbWQodik7Ci0JCQllbHNlIGlmIChjYWxfdHlwZSA9PSBDVlBfVk9DREVWX0NGR19DQUxfVFlQRSkKLQkJCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kKHYpOwotCQkJZWxzZSBpZiAoY2FsX3R5cGUgPT0gQ1ZTX1ZPQ1NUUk1fU1RBVElDX0NBTF9UWVBFKQotCQkJCXZvaWNlX3NlbmRfY3ZzX2RlcmVnaXN0ZXJfY2FsX2NtZCh2KTsKLQkJCWVsc2UKLQkJCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGNhbCB0eXBlICVkIVxuIiwKLQkJCQkJX19mdW5jX18sIGNhbF90eXBlKTsKLQotCQkJcmVzdWx0MiA9IHZvaWNlX3NlbmRfc3RhcnRfdm9pY2VfY21kKHYpOwotCQkJaWYgKHJlc3VsdDIpIHsKLQkJCQlwcl9lcnIoIiVzOiBWb2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZCBmYWlsZWQgZm9yIHNlc3Npb24gMHgleCwgZXJyICVkIVxuIiwKLQkJCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQsIHJlc3VsdDIpOwotCi0JCQkJcmVzdWx0ID0gcmVzdWx0MjsKLQkJCX0KLQkJfQotCi0JCWlmICgoY2FsX2Jsb2NrLT5tYXBfZGF0YS5xNm1hcF9oYW5kbGUgIT0gMCkgJiYKLQkJCSghaXNfb3RoZXJfc2Vzc2lvbl9hY3RpdmUodi0+c2Vzc2lvbl9pZCkpKSB7Ci0KLQkJCXJlc3VsdDIgPSB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKAotCQkJCXYsIGNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlKTsKLQkJCWlmIChyZXN1bHQyKSB7Ci0JCQkJcHJfZXJyKCIlczogVm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCBmYWlsZWQgZm9yIHNlc3Npb24gMHgleCwgZXJyICVkIVxuIiwKLQkJCQkJX19mdW5jX18sIHYtPnNlc3Npb25faWQsIHJlc3VsdDIpOwotCi0JCQkJcmVzdWx0ID0gcmVzdWx0MjsKLQkJCX0KLQkJCWNhbF9ibG9jay0+bWFwX2RhdGEucTZtYXBfaGFuZGxlID0gMDsKLQkJfQotCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCX0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCB2b2NfcmVnaXN0ZXJfdm9jcHJvY192b2xfdGFibGUodm9pZCkKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWludAkJCXJlc3VsdDIgPSAwOwotCWludAkJCWk7Ci0Jc3RydWN0IHZvaWNlX2RhdGEJKnYgPSBOVUxMOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfVk9DX1NFU1NJT05TOyBpKyspIHsKLQkJdiA9ICZjb21tb24udm9pY2VbaV07Ci0KLQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0JCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkpIHsKLQkJCXJlc3VsdDIgPSB2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKLQkJCWlmIChyZXN1bHQyIDwgMCkgewotCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byByZWdpc3RlciB2b2N2b2wgdGFibGUgZm9yIHNlc3Npb24gMHgleCFcbiIsCi0JCQkJCV9fZnVuY19fLCB2LT5zZXNzaW9uX2lkKTsKLQotCQkJCXJlc3VsdCA9IHJlc3VsdDI7Ci0JCQkJLyogU3RpbGwgdHJ5IHRvIHJlZ2lzdGVyIG90aGVyIHNlc3Npb25zICovCi0JCQl9Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHZvY19kZXJlZ2lzdGVyX3ZvY3Byb2Nfdm9sX3RhYmxlKHZvaWQpCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlpbnQJCQlzdWNjZXNzID0gMDsKLQlpbnQJCQlpOwotCXN0cnVjdCB2b2ljZV9kYXRhCSp2ID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZPQ19TRVNTSU9OUzsgaSsrKSB7Ci0JCXYgPSAmY29tbW9uLnZvaWNlW2ldOwotCi0JCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQlpZiAoaXNfdm9jX3N0YXRlX2FjdGl2ZSh2LT52b2Nfc3RhdGUpKSB7Ci0JCQlyZXN1bHQgPSB2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHYpOwotCQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gZGVyZWdpc3RlciB2b2N2b2wgdGFibGUgZm9yIHNlc3Npb24gMHgleCFcbiIsCi0JCQkJCV9fZnVuY19fLCB2LT5zZXNzaW9uX2lkKTsKLQotCQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCXByX2VycigiJXM6IFRyeSB0byByZS1yZWdpc3RlciBhbGwgZGVyZWdpc3RlcmVkIHNlc3Npb25zIVxuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQotCQkJCQl2b2NfcmVnaXN0ZXJfdm9jcHJvY192b2xfdGFibGUoKTsKLQkJCQl9Ci0JCQkJZ290byBkb25lOwotCQkJfSBlbHNlIHsKLQkJCQlzdWNjZXNzID0gMTsKLQkJCX0KLQkJfQotCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCX0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCB2b2NfbWFwX3J0YWNfYmxvY2soc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jaykKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCB2b2ljZV9kYXRhCSp2ID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGNhbF9ibG9jayBpcyBOVUxMIVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE5vIGFkZHJlc3MgdG8gbWFwIVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNhbF9ibG9jay0+bWFwX2RhdGEubWFwX3NpemUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IG1hcCBzaXplIGlzIDAhXG4iLAotCQkJX19mdW5jX18pOwotCi0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCS8qIHVzZSBmaXJzdCBzZXNzaW9uICovCi0JdiA9ICZjb21tb24udm9pY2VbMF07Ci0JbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0KLQlpZiAoIWlzX3J0YWNfbWVtb3J5X2FsbG9jYXRlZCgpKSB7Ci0JCXJlc3VsdCA9IHZvaWNlX2FsbG9jX3J0YWNfbWVtX21hcF90YWJsZSgpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJcHJfZXJyKCIlczogUlRBQyBhbGxvYyBtZW0gbWFwIHRhYmxlIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJWRcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJJmNhbF9ibG9jay0+Y2FsX2RhdGEucGFkZHIsCi0JCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci0KLQkJCWdvdG8gZG9uZV91bmxvY2s7Ci0JCX0KLQl9Ci0KLQlyZXN1bHQgPSB2b2ljZV9tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCh2LAotCQkmY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZSwKLQkJKGRtYV9hZGRyX3QpY2FsX2Jsb2NrLT5jYWxfZGF0YS5wYWRkciwKLQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSwKLQkJVk9DX1JUQUNfTUVNX01BUF9UT0tFTik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogUlRBQyBtbWFwIGRpZCBub3Qgd29yayEgYWRkciA9IDB4JXBLLCBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSZjYWxfYmxvY2stPmNhbF9kYXRhLnBhZGRyLAotCQkJY2FsX2Jsb2NrLT5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci0KLQkJZnJlZV9ydGFjX21hcF90YWJsZSgpOwotCQlnb3RvIGRvbmVfdW5sb2NrOwotCX0KLQotCWNhbF9ibG9jay0+bWFwX2RhdGEubWFwX2hhbmRsZSA9IGNvbW1vbi5ydGFjX21lbV9oYW5kbGU7Ci1kb25lX3VubG9jazoKLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHZvY191bm1hcF9ydGFjX2Jsb2NrKHVpbnQzMl90ICptZW1fbWFwX2hhbmRsZSkKLXsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXN0cnVjdCB2b2ljZV9kYXRhCSp2ID0gTlVMTDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKG1lbV9tYXBfaGFuZGxlID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBNYXAgaGFuZGxlIGlzIE5VTEwsIG5vdGhpbmcgdG8gdW5tYXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCWlmICgqbWVtX21hcF9oYW5kbGUgPT0gMCkgewotCQlwcl9kZWJ1ZygiJXM6IE1hcCBoYW5kbGUgaXMgMCwgbm90aGluZyB0byB1bm1hcFxuIiwKLQkJCV9fZnVuY19fKTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQkvKiBVc2UgZmlyc3Qgc2Vzc2lvbiAqLwotCS8qIE9ubHkgdXNlZCBmb3IgYXByIHdhaXQgbG9jayAqLwotCXYgPSAmY29tbW9uLnZvaWNlWzBdOwotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCi0JcmVzdWx0ID0gdm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCgKLQkJCXYsICptZW1fbWFwX2hhbmRsZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kIEZhaWxlZCBmb3Igc2Vzc2lvbiAweCV4IVxuIiwKLQkJCV9fZnVuY19fLCB2LT5zZXNzaW9uX2lkKTsKLQl9IGVsc2UgewotCQkqbWVtX21hcF9oYW5kbGUgPSAwOwotCQljb21tb24ucnRhY19tZW1faGFuZGxlID0gMDsKLQkJZnJlZV9ydGFjX21hcF90YWJsZSgpOwotCX0KLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9jaGFubmVsX2luZm9fdjIoc3RydWN0IHZvaWNlX2RhdGEgKnYsCi0JCQkJCSAgdWludDMyX3QgcGFyYW1fdHlwZSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBjdnBfc2V0X2NoYW5uZWxfaW5mb19jbWRfdjIgY3ZwX3NldF9jaGFubmVsX2luZm9fY21kOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0Jc3RydWN0IHZzc19pY29tbW9uX3BhcmFtX2RhdGFfY2hhbm5lbF9pbmZvX3YyX3QKLQkJKmNoYW5uZWxfaW5mb19wYXJhbV9kYXRhID0KLQkJCSZjdnBfc2V0X2NoYW5uZWxfaW5mb19jbWQuCi0JCQljdnBfc2V0X2NoX2luZm9fcGFyYW1fdjIucGFyYW1fZGF0YTsKLQlzdHJ1Y3QgdnNzX3BhcmFtX3ZvY3Byb2NfZGV2X2NoYW5uZWxfaW5mb190ICpjaGFubmVsX2luZm8gPQotCQkJJmNoYW5uZWxfaW5mb19wYXJhbV9kYXRhLT5jaGFubmVsX2luZm87Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCWlmICghYXByX2N2cCkgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQltZW1zZXQoJmN2cF9zZXRfY2hhbm5lbF9pbmZvX2NtZCwgMCwgc2l6ZW9mKGN2cF9zZXRfY2hhbm5lbF9pbmZvX2NtZCkpOwotCi0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5oZHJfZmllbGQgPQotCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELCBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJICAgICAgQVBSX1BLVF9WRVIpOwotCWN2cF9zZXRfY2hhbm5lbF9pbmZvX2NtZC5oZHIucGt0X3NpemUgPQotCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQlzaXplb2YoY3ZwX3NldF9jaGFubmVsX2luZm9fY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5zcmNfc3ZjID0gMDsKLQljdnBfc2V0X2NoYW5uZWxfaW5mb19jbWQuaGRyLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5zcmNfcG9ydCA9Ci0JCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5kZXN0X3N2YyA9IDA7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5kZXN0X2RvbWFpbiA9IEFQUl9ET01BSU5fQURTUDsKLQljdnBfc2V0X2NoYW5uZWxfaW5mb19jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZwX3NldF9jaGFubmVsX2luZm9fY21kLmhkci5vcGNvZGUgPSAgVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMjsKLQotCWN2cF9zZXRfY2hhbm5lbF9pbmZvX2NtZC5jdnBfc2V0X2NoX2luZm9fcGFyYW1fdjIubWVtX3NpemUgPQotCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX2NoYW5uZWxfaW5mb192Ml90KTsKLQotCWNoYW5uZWxfaW5mb19wYXJhbV9kYXRhLT5tb2R1bGVfaWQgPSBWU1NfTU9EVUxFX0NWRF9HRU5FUklDOwotCWNoYW5uZWxfaW5mb19wYXJhbV9kYXRhLT5wYXJhbV9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCB2c3NfcGFyYW1fdm9jcHJvY19kZXZfY2hhbm5lbF9pbmZvX3QpOwotCi0JIC8qIERldmljZSBzcGVjaWZpYyBkYXRhICovCi0Jc3dpdGNoIChwYXJhbV90eXBlKSB7Ci0JY2FzZSBSWF9QQVRIOgotCQljaGFubmVsX2luZm9fcGFyYW1fZGF0YS0+cGFyYW1faWQgPQotCQkJVlNTX1BBUkFNX1ZPQ1BST0NfUlhfQ0hBTk5FTF9JTkZPOwotCQljaGFubmVsX2luZm8tPm51bV9jaGFubmVscyA9IHYtPmRldl9yeC5ub19vZl9jaGFubmVsczsKLQkJY2hhbm5lbF9pbmZvLT5iaXRzX3Blcl9zYW1wbGUgPSB2LT5kZXZfcnguYml0c19wZXJfc2FtcGxlOwotCQlicmVhazsKLQotCWNhc2UgVFhfUEFUSDoKLQkJY2hhbm5lbF9pbmZvX3BhcmFtX2RhdGEtPnBhcmFtX2lkID0KLQkJCVZTU19QQVJBTV9WT0NQUk9DX1RYX0NIQU5ORUxfSU5GTzsKLQkJY2hhbm5lbF9pbmZvLT5udW1fY2hhbm5lbHMgPSB2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHM7Ci0JCWNoYW5uZWxfaW5mby0+Yml0c19wZXJfc2FtcGxlID0gdi0+ZGV2X3R4LmJpdHNfcGVyX3NhbXBsZTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVDX1JFRl9QQVRIOgotCQljaGFubmVsX2luZm9fcGFyYW1fZGF0YS0+cGFyYW1faWQgPQotCQkJVlNTX1BBUkFNX1ZPQ1BST0NfRUNfUkVGX0NIQU5ORUxfSU5GTzsKLQkJY2hhbm5lbF9pbmZvLT5udW1fY2hhbm5lbHMgPSB2LT5kZXZfcngubm9fb2ZfY2hhbm5lbHM7Ci0JCWNoYW5uZWxfaW5mby0+Yml0c19wZXJfc2FtcGxlID0gdi0+ZGV2X3J4LmJpdHNfcGVyX3NhbXBsZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXJhbSB0eXBlXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNoYW5uZWxfaW5mby0+bnVtX2NoYW5uZWxzID09IE5VTV9DSEFOTkVMU19NT05PKSB7Ci0JCWNoYW5uZWxfaW5mby0+Y2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JfSBlbHNlIGlmIChjaGFubmVsX2luZm8tPm51bV9jaGFubmVscyA9PSBOVU1fQ0hBTk5FTFNfU1RFUkVPKSB7Ci0JCWNoYW5uZWxfaW5mby0+Y2hhbm5lbF9tYXBwaW5nWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCWNoYW5uZWxfaW5mby0+Y2hhbm5lbF9tYXBwaW5nWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogVW5zdXBwb3J0ZWQgbnVtIGNoYW5uZWxzOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjaGFubmVsX2luZm8tPm51bV9jaGFubmVscyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc2V0X2NoYW5uZWxfaW5mb19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZW5kIFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjJcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc10gaGFuZGxlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgYWRzcF9lcnJfZ2V0X2Vycl9zdHIodi0+YXN5bmNfZXJyKSwgY3ZwX2hhbmRsZSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUodi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSAwOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX2NoYW5uZWxfaW5mb19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9jaGFubmVsX2luZm9fdjIodiwgUlhfUEFUSCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gc2VuZGluZyBjdnBfY2hhbm5lbF9pbmZvIFJYOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gdm9pY2Vfc2VuZF9jdnBfY2hhbm5lbF9pbmZvX3YyKHYsIFRYX1BBVEgpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGluIHNlbmRpbmcgY3ZwX2NoYW5uZWxfaW5mbyBUWDogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHZvaWNlX3NlbmRfY3ZwX2NoYW5uZWxfaW5mb192Mih2LCBFQ19SRUZfUEFUSCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gc2VuZGluZyBjdnBfY2hhbm5lbF9pbmZvIEVDIFJlZjogJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9tZmNfY29uZmlnX3YyKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGN2cF9zZXRfbWZjX2NvbmZpZ19jbWRfdjIgY3ZwX3NldF9tZmNfY29uZmlnX2NtZDsKLQl2b2lkICphcHJfY3ZwOwotCXUxNiBjdnBfaGFuZGxlOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX21mY19jb25maWdfdjJfdCAqY3ZwX2NvbmZpZ19wYXJhbV9kYXRhID0KLQkJJmN2cF9zZXRfbWZjX2NvbmZpZ19jbWQuY3ZwX3NldF9tZmNfcGFyYW1fdjIucGFyYW1fZGF0YTsKLQlzdHJ1Y3QgdnNzX3BhcmFtX21mY19jb25maWdfaW5mb190ICptZmNfY29uZmlnX2luZm8gPQotCQkmY3ZwX2NvbmZpZ19wYXJhbV9kYXRhLT5tZmNfY29uZmlnX2luZm87Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYXByX2N2cCAgPSBjb21tb24uYXByX3E2X2N2cDsKLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0JbWVtc2V0KCZjdnBfc2V0X21mY19jb25maWdfY21kLCAwLCBzaXplb2YoY3ZwX3NldF9tZmNfY29uZmlnX2NtZCkpOwotCi0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5oZHIuaGRyX2ZpZWxkID0KLQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQljdnBfc2V0X21mY19jb25maWdfY21kLmhkci5wa3Rfc2l6ZSA9Ci0JCUFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCXNpemVvZihjdnBfc2V0X21mY19jb25maWdfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5oZHIuc3JjX3N2YyA9IDA7Ci0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5oZHIuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQljdnBfc2V0X21mY19jb25maWdfY21kLmhkci5zcmNfcG9ydCA9Ci0JCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5oZHIuZGVzdF9zdmMgPSAwOwotCWN2cF9zZXRfbWZjX2NvbmZpZ19jbWQuaGRyLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWN2cF9zZXRfbWZjX2NvbmZpZ19jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5oZHIudG9rZW4gPSAwOwotCWN2cF9zZXRfbWZjX2NvbmZpZ19jbWQuaGRyLm9wY29kZSA9IFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjI7Ci0JY3ZwX3NldF9tZmNfY29uZmlnX2NtZC5jdnBfc2V0X21mY19wYXJhbV92Mi5tZW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgdnNzX2ljb21tb25fcGFyYW1fZGF0YV9tZmNfY29uZmlnX3YyX3QpOwotCi0JY3ZwX2NvbmZpZ19wYXJhbV9kYXRhLT5tb2R1bGVfaWQgPSBBVURQUk9DX01PRFVMRV9JRF9NRkM7Ci0JY3ZwX2NvbmZpZ19wYXJhbV9kYXRhLT5wYXJhbV9pZCA9Ci0JCUFVRFBST0NfUEFSQU1fSURfTUZDX09VVFBVVF9NRURJQV9GT1JNQVQ7Ci0JY3ZwX2NvbmZpZ19wYXJhbV9kYXRhLT5wYXJhbV9zaXplID0KLQkJc2l6ZW9mKHN0cnVjdCB2c3NfcGFyYW1fbWZjX2NvbmZpZ19pbmZvX3QpOwotCi0JbWZjX2NvbmZpZ19pbmZvLT5udW1fY2hhbm5lbHMgPSB2LT5kZXZfcngubm9fb2ZfY2hhbm5lbHM7Ci0JbWZjX2NvbmZpZ19pbmZvLT5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQltZmNfY29uZmlnX2luZm8tPnNhbXBsZV9yYXRlID0gdi0+ZGV2X3J4LnNhbXBsZV9yYXRlOwotCi0JaWYgKG1mY19jb25maWdfaW5mby0+bnVtX2NoYW5uZWxzID09IE5VTV9DSEFOTkVMU19NT05PKSB7Ci0JCW1mY19jb25maWdfaW5mby0+Y2hhbm5lbF90eXBlWzBdID0gUENNX0NIQU5ORUxfRkM7Ci0JfSBlbHNlIGlmIChtZmNfY29uZmlnX2luZm8tPm51bV9jaGFubmVscyA9PSBOVU1fQ0hBTk5FTFNfU1RFUkVPKSB7Ci0JCW1mY19jb25maWdfaW5mby0+Y2hhbm5lbF90eXBlWzBdID0gUENNX0NIQU5ORUxfRkw7Ci0JCW1mY19jb25maWdfaW5mby0+Y2hhbm5lbF90eXBlWzFdID0gUENNX0NIQU5ORUxfRlI7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogVW5zdXBwb3J0ZWQgbnVtIGNoYW5uZWxzOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBtZmNfY29uZmlnX2luZm8tPm51bV9jaGFubmVscyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopJmN2cF9zZXRfbWZjX2NvbmZpZ19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZW5kIFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjIgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCi0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIGhhbmRsZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIGFkc3BfZXJyX2dldF9lcnJfc3RyKHYtPmFzeW5jX2VyciksIGN2cF9oYW5kbGUpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKHYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gMDsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9tZmNfY29uZmlnX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjb21tb24uY3ZwX3ZlcnNpb24gPj0gQ1ZQX1ZFUlNJT05fMikgewotCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZmNfY29uZmlnX3YyKHYpOwotCX0gZWxzZSB7Ci0JCXByX3dhcm4oIiVzOiBDVlAgVmVyc2lvbiBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9nZXRfYXZjc192ZXJzaW9uX3Blcl9zZXJ2aWNlKHVpbnQzMl90IHNlcnZpY2VfaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc2l6ZV90IHN2Y19zaXplOwotCXN0cnVjdCBhdmNzX2Z3a192ZXJfaW5mbyB2ZXJfaW5mbyA9IHt7MH0sIE5VTEx9OwotCi0JaWYgKHNlcnZpY2VfaWQgPT0gQVZDU19TRVJWSUNFX0lEX0FMTCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlcnZpY2UgaWQ6ICVkIiwgX19mdW5jX18sCi0JCSAgICAgICBBVkNTX1NFUlZJQ0VfSURfQUxMKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3ZjX3NpemUgPSBzaXplb2Yoc3RydWN0IGF2c19zdmNfYXBpX2luZm8pOwotCXZlcl9pbmZvLnNlcnZpY2VzID0ga3phbGxvYyhzdmNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHZlcl9pbmZvLnNlcnZpY2VzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gcTZjb3JlX2dldF9zZXJ2aWNlX3ZlcnNpb24oc2VydmljZV9pZCwgJnZlcl9pbmZvLCBzdmNfc2l6ZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZTsKLQotCXJldCA9IHZlcl9pbmZvLnNlcnZpY2VzWzBdLmFwaV92ZXJzaW9uOwotCWNvbW1vbi5pc19hdmNzX3ZlcnNpb25fcXVlcmllZCA9IHRydWU7Ci1kb25lOgotCWtmcmVlKHZlcl9pbmZvLnNlcnZpY2VzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NldHVwX3ZvY3Byb2Moc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9jcmVhdGVfY21kKHYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IENWUCBjcmVhdGUgZmFpbGVkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoY29tbW9uLmlzX2F2Y3NfdmVyc2lvbl9xdWVyaWVkID09IGZhbHNlKQotCQljb21tb24uY3ZwX3ZlcnNpb24gPSB2b2ljZV9nZXRfYXZjc192ZXJzaW9uX3Blcl9zZXJ2aWNlKAotCQkJCSAgICAgQVBSVjJfSURTX1NFUlZJQ0VfSURfQURTUF9DVlBfVik7Ci0KLQlpZiAoY29tbW9uLmN2cF92ZXJzaW9uIDwgMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIENWUCB2ZXJzaW9uICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNvbW1vbi5jdnBfdmVyc2lvbik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcHJfZGVidWcoIiVzOiBDVlAgVmVyc2lvbiAlZFxuIiwgX19mdW5jX18sIGNvbW1vbi5jdnBfdmVyc2lvbik7Ci0KLQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZWRpYV9mbXRfaW5mb19jbWQodik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IG1lZGlhIGZvcm1hdCBpbmZvIGZhaWxlZCBlcnI6JWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHZvaWNlX3NlbmRfY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQodik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHRvcG9sb2d5IGNvbW1pdCBmYWlsZWQgZXJyOiVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTZW5kIE1GQyBjb25maWcgb25seSB3aGVuIHRoZSBubyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIDEgKi8KLQlpZiAodi0+ZGV2X3J4Lm5vX29mX2NoYW5uZWxzID4gTlVNX0NIQU5ORUxTX01PTk8pIHsKLQkJcmV0ID0gdm9pY2Vfc2VuZF9jdnBfbWZjX2NvbmZpZ19jbWQodik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl93YXJuKCIlczogU2V0IG1mYyBjb25maWcgZmFpbGVkIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJfQotCX0KLQotCXZvaWNlX3NlbmRfY3ZzX3JlZ2lzdGVyX2NhbF9jbWQodik7Ci0Jdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfZGV2X2NmZ19jbWQodik7Ci0Jdm9pY2Vfc2VuZF9jdnBfcmVnaXN0ZXJfY2FsX2NtZCh2KTsKLQl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKLQotCS8qIGVuYWJsZSB2b2Nwcm9jICovCi0JcmV0ID0gdm9pY2Vfc2VuZF9lbmFibGVfdm9jcHJvY19jbWQodik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmFpbDsKLQotCS8qIGF0dGFjaCB2b2Nwcm9jICovCi0JcmV0ID0gdm9pY2Vfc2VuZF9hdHRhY2hfdm9jcHJvY19jbWQodik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmFpbDsKLQotCS8qIHNlbmQgdHR5IG1vZGUgaWYgdHR5IGRldmljZSBpcyB1c2VkICovCi0Jdm9pY2Vfc2VuZF90dHlfbW9kZV9jbWQodik7Ci0KLQlpZiAoaXNfdm9pcF9zZXNzaW9uKHYtPnNlc3Npb25faWQpKSB7Ci0JCXJldCA9IHZvaWNlX3NlbmRfbXZtX2NhbF9uZXR3b3JrX2NtZCh2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiB2b2ljZV9zZW5kX212bV9jYWxfbmV0d29ya19jbWQ6ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kKHYpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IHZvaWNlX3NlbmRfbXZtX21lZGlhX3R5cGVfY21kOiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQotCQl2b2ljZV9zZW5kX25ldGlkX3RpbWluZ19jbWQodik7Ci0JfQotCi0JaWYgKHYtPnN0X2VuYWJsZSAmJiAhdi0+dHR5X21vZGUpCi0JCXZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwKLQkJCQkJICAgICBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULAotCQkJCQkgICAgIHYtPnN0X2VuYWJsZSk7Ci0JLyogU3RhcnQgaW4tY2FsbCBtdXNpYyBkZWxpdmVyeSBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCAqLwotCWlmICh2LT5tdXNpY19pbmZvLnBsYXlfZW5hYmxlKQotCQl2b2ljZV9jdnNfc3RhcnRfcGxheWJhY2sodik7Ci0KLQkvKiBTdGFydCBpbi1jYWxsIHJlY29yZGluZyBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCAqLwotCWlmICh2LT5yZWNfaW5mby5yZWNfZW5hYmxlKQotCQl2b2ljZV9jdnNfc3RhcnRfcmVjb3JkKHYsIHYtPnJlY19pbmZvLnJlY19tb2RlKTsKLQotCWlmICh2LT5kdG1mX3J4X2RldGVjdF9lbikKLQkJdm9pY2Vfc2VuZF9kdG1mX3J4X2RldGVjdGlvbl9jbWQodiwgdi0+ZHRtZl9yeF9kZXRlY3RfZW4pOwotCi0JaWYgKHYtPmhkX2VuYWJsZSkKLQkJdm9pY2Vfc2VuZF9oZF9jbWQodiwgdi0+aGRfZW5hYmxlKTsKLQotCXJ0YWNfYWRkX3ZvaWNlKHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpLAotCQl2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KSwKLQkJdi0+ZGV2X3J4LnBvcnRfaWQsIHYtPmRldl90eC5wb3J0X2lkLAotCQl2LT5kZXZfcnguZGV2X2lkLCB2LT5kZXZfdHguZGV2X2lkLAotCQl2LT5zZXNzaW9uX2lkKTsKLQotCXJldHVybiAwOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnBfZGV2aWNlX2NoYW5uZWxzX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgIGN2cF9zZXRfZGV2X2NoYW5uZWxzX2NtZCBjdnBfc2V0X2Rldl9jaGFubmVsc19jbWQ7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQotCWlmICghKHZvaWNlX2dldF9jdmRfaW50X3ZlcnNpb24oY29tbW9uLmN2ZF92ZXJzaW9uKSA+PQotCSAgICAgIENWRF9JTlRfVkVSU0lPTl8yXzIpKSB7Ci0JCXByX2RlYnVnKCIlcyBDVkQgdmVyICVzIGRvZXNuJ3Qgc3VwcG9ydCBzZW5kX2RldmljZV9jaGFubmVscyBjbWRcbiIsCi0JCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5oZHJfZmllbGQgPQotCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQlBUFJfUEtUX1ZFUik7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQlzaXplb2YoY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnBfc2V0X2Rldl9jaGFubmVsc19jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmhkci5vcGNvZGUgPQotCQkJCVZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfU0VUX0RFVl9DSEFOTkVMUzsKLQljdnBfc2V0X2Rldl9jaGFubmVsc19jbWQuY3ZwX3NldF9jaGFubmVscy5yeF9udW1fY2hhbm5lbHMgPQotCQkJCVZTU19OVU1fREVWX0NIQU5ORUxTXzE7Ci0JY3ZwX3NldF9kZXZfY2hhbm5lbHNfY21kLmN2cF9zZXRfY2hhbm5lbHMudHhfbnVtX2NoYW5uZWxzID0KLQkJCQl2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHM7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfc2V0X2Rldl9jaGFubmVsc19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWwgaW4gc2VuZGluZyBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX1NFVF9ERVZfQ0hBTk5FTFNcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCQkodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfY3ZwX21lZGlhX2ZtdF9pbmZvX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChjb21tb24uY3ZwX3ZlcnNpb24gPCBDVlBfVkVSU0lPTl8yKQotCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9kZXZpY2VfY2hhbm5lbHNfY21kKHYpOwotCWVsc2UKLQkJcmV0ID0gdm9pY2Vfc2VuZF9jdnBfY2hhbm5lbF9pbmZvX2NtZCh2KTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IFNldCBjaGFubmVsIGluZm8gZmFpbGVkIGVycjogJWRcbiIsIF9fZnVuY19fLAotCQkgICAgICAgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2b2ljZV9nZXRfY3ZkX2ludF92ZXJzaW9uKGNvbW1vbi5jdmRfdmVyc2lvbikgPj0KLQkgICAgQ1ZEX0lOVF9WRVJTSU9OXzJfMykgewotCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZWRpYV9mb3JtYXRfY21kKHYsIFJYX1BBVEgpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZG9uZTsKLQotCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZWRpYV9mb3JtYXRfY21kKHYsIFRYX1BBVEgpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZG9uZTsKLQotCQlpZiAoY29tbW9uLmVjX3JlZl9leHQpCi0JCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZWRpYV9mb3JtYXRfY21kKHYsIEVDX1JFRl9QQVRIKTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF9tZWRpYV9mb3JtYXRfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJCQkgICB1aW50MzJfdCBwYXJhbV90eXBlKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjdnBfc2V0X21lZGlhX2Zvcm1hdF9jbWQgY3ZwX3NldF9tZWRpYV9mb3JtYXRfY21kOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0Jc3RydWN0IHZzc19pY29tbW9uX3BhcmFtX2RhdGFfdCAqbWVkaWFfZm10X3BhcmFtX2RhdGEgPQotCQkmY3ZwX3NldF9tZWRpYV9mb3JtYXRfY21kLmN2cF9zZXRfbWVkaWFfcGFyYW1fdjIucGFyYW1fZGF0YTsKLQlzdHJ1Y3QgdnNzX3BhcmFtX2VuZHBvaW50X21lZGlhX2Zvcm1hdF9pbmZvX3QgKm1lZGlhX2ZtdF9pbmZvID0KLQkJJm1lZGlhX2ZtdF9wYXJhbV9kYXRhLT5tZWRpYV9mb3JtYXRfaW5mbzsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0JaWYgKCFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQltZW1zZXQoJmN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZCwgMCwgc2l6ZW9mKGN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZCkpOwotCi0JLyogRmlsbCBoZWFkZXIgZGF0YSAqLwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIuaGRyX2ZpZWxkID0KLQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQljdnBfc2V0X21lZGlhX2Zvcm1hdF9jbWQuaGRyLnBrdF9zaXplID0KLQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCSAgICAgc2l6ZW9mKGN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIuc3JjX3N2YyA9IDA7Ci0JY3ZwX3NldF9tZWRpYV9mb3JtYXRfY21kLmhkci5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIuc3JjX3BvcnQgPQotCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIuZGVzdF9zdmMgPSAwOwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JY3ZwX3NldF9tZWRpYV9mb3JtYXRfY21kLmhkci5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOwotCWN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZC5oZHIudG9rZW4gPSBWT0NfU0VUX01FRElBX0ZPUk1BVF9QQVJBTV9UT0tFTjsKLQljdnBfc2V0X21lZGlhX2Zvcm1hdF9jbWQuaGRyLm9wY29kZSA9IFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjI7Ci0KLQkvKiBGaWxsIHBhcmFtIGRhdGEgKi8KLQljdnBfc2V0X21lZGlhX2Zvcm1hdF9jbWQuY3ZwX3NldF9tZWRpYV9wYXJhbV92Mi5tZW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgdnNzX2ljb21tb25fcGFyYW1fZGF0YV90KTsKLQltZWRpYV9mbXRfcGFyYW1fZGF0YS0+bW9kdWxlX2lkID0gVlNTX01PRFVMRV9DVkRfR0VORVJJQzsKLQltZWRpYV9mbXRfcGFyYW1fZGF0YS0+cGFyYW1fc2l6ZSA9Ci0JCXNpemVvZihzdHJ1Y3QgdnNzX3BhcmFtX2VuZHBvaW50X21lZGlhX2Zvcm1hdF9pbmZvX3QpOwotCi0JLyogRmlsbCBkZXZpY2Ugc3BlY2lmaWMgZGF0YSAqLwotCXN3aXRjaCAocGFyYW1fdHlwZSkgewotCWNhc2UgUlhfUEFUSDoKLQkJbWVkaWFfZm10X3BhcmFtX2RhdGEtPnBhcmFtX2lkID0KLQkJCVZTU19QQVJBTV9SWF9QT1JUX0VORFBPSU5UX01FRElBX0lORk87Ci0JCW1lZGlhX2ZtdF9pbmZvLT5wb3J0X2lkID0gdi0+ZGV2X3J4LnBvcnRfaWQ7Ci0JCW1lZGlhX2ZtdF9pbmZvLT5udW1fY2hhbm5lbHMgPSB2LT5kZXZfcngubm9fb2ZfY2hhbm5lbHM7Ci0JCW1lZGlhX2ZtdF9pbmZvLT5iaXRzX3Blcl9zYW1wbGUgPSB2LT5kZXZfcnguYml0c19wZXJfc2FtcGxlOwotCQltZWRpYV9mbXRfaW5mby0+c2FtcGxlX3JhdGUgPSB2LT5kZXZfcnguc2FtcGxlX3JhdGU7Ci0JCW1lbWNweSgmbWVkaWFfZm10X2luZm8tPmNoYW5uZWxfbWFwcGluZywKLQkJICAgICAgICZ2LT5kZXZfcnguY2hhbm5lbF9tYXBwaW5nLCBWU1NfQ0hBTk5FTF9NQVBQSU5HX1NJWkUpOwotCQlicmVhazsKLQotCWNhc2UgVFhfUEFUSDoKLQkJbWVkaWFfZm10X3BhcmFtX2RhdGEtPnBhcmFtX2lkID0KLQkJCVZTU19QQVJBTV9UWF9QT1JUX0VORFBPSU5UX01FRElBX0lORk87Ci0JCW1lZGlhX2ZtdF9pbmZvLT5wb3J0X2lkID0gdi0+ZGV2X3R4LnBvcnRfaWQ7Ci0JCW1lZGlhX2ZtdF9pbmZvLT5udW1fY2hhbm5lbHMgPSB2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHM7Ci0JCW1lZGlhX2ZtdF9pbmZvLT5iaXRzX3Blcl9zYW1wbGUgPSB2LT5kZXZfdHguYml0c19wZXJfc2FtcGxlOwotCQltZWRpYV9mbXRfaW5mby0+c2FtcGxlX3JhdGUgPSB2LT5kZXZfdHguc2FtcGxlX3JhdGU7Ci0JCW1lbWNweSgmbWVkaWFfZm10X2luZm8tPmNoYW5uZWxfbWFwcGluZywKLQkJICAgICAgICZ2LT5kZXZfdHguY2hhbm5lbF9tYXBwaW5nLCBWU1NfQ0hBTk5FTF9NQVBQSU5HX1NJWkUpOwotCQlicmVhazsKLQotCWNhc2UgRUNfUkVGX1BBVEg6Ci0JCW1lZGlhX2ZtdF9wYXJhbV9kYXRhLT5wYXJhbV9pZCA9Ci0JCQlWU1NfUEFSQU1fRUNfUkVGX1BPUlRfRU5EUE9JTlRfTUVESUFfSU5GTzsKLQkJbWVkaWFfZm10X2luZm8tPnBvcnRfaWQgPSBjb21tb24uZWNfbWVkaWFfZm10X2luZm8ucG9ydF9pZDsKLQkJbWVkaWFfZm10X2luZm8tPm51bV9jaGFubmVscyA9Ci0JCQljb21tb24uZWNfbWVkaWFfZm10X2luZm8ubnVtX2NoYW5uZWxzOwotCQltZWRpYV9mbXRfaW5mby0+Yml0c19wZXJfc2FtcGxlID0KLQkJCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5iaXRzX3Blcl9zYW1wbGU7Ci0JCW1lZGlhX2ZtdF9pbmZvLT5zYW1wbGVfcmF0ZSA9Ci0JCQljb21tb24uZWNfbWVkaWFfZm10X2luZm8uc2FtcGxlX3JhdGU7Ci0JCW1lbWNweSgmbWVkaWFfZm10X2luZm8tPmNoYW5uZWxfbWFwcGluZywKLQkJICAgICAgICZjb21tb24uZWNfbWVkaWFfZm10X2luZm8uY2hhbm5lbF9tYXBwaW5nLAotCQkgICAgICAgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBhcmFtIHR5cGUgJWRcbiIsIF9fZnVuY19fLCBwYXJhbV90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFNlbmQgY29tbWFuZCAqLwotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRmFpbCBpbiBzZW5kaW5nIFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjJcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdIGhhbmRsZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgIGFkc3BfZXJyX2dldF9lcnJfc3RyKHYtPmFzeW5jX2VyciksIGN2cF9oYW5kbGUpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKHYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2cF90b3BvbG9neV9jb21taXRfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhcHJfaGRyIGN2cF90b3BvbG9neV9jb21taXRfY21kOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0KLQlpZiAoISh2b2ljZV9nZXRfY3ZkX2ludF92ZXJzaW9uKGNvbW1vbi5jdmRfdmVyc2lvbikgPj0KLQkgICAgICBDVkRfSU5UX1ZFUlNJT05fMl8yKSkgewotCQlwcl9kZWJ1ZygiJXMgQ1ZEIHZlcnNpb24gc3RyaW5nICVzIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmRcbiIsCi0JCQkgX19mdW5jX18sIGNvbW1vbi5jdmRfdmVyc2lvbik7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0JY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfdG9wb2xvZ3lfY29tbWl0X2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCWN2cF90b3BvbG9neV9jb21taXRfY21kLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2cF90b3BvbG9neV9jb21taXRfY21kLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0JY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQudG9rZW4gPSAwOwotCWN2cF90b3BvbG9neV9jb21taXRfY21kLm9wY29kZSA9IFZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfQ09NTUlUOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWwgaW4gc2VuZGluZyBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX0NPTU1JVFxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfZW5hYmxlX3ZvY3Byb2NfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhcHJfaGRyIGN2cF9lbmFibGVfY21kOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCi0JaWYgKCFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQotCS8qIGVuYWJsZSB2b2Nwcm9jIGFuZCB3YWl0IGZvciByZXNwb3NlICovCi0JY3ZwX2VuYWJsZV9jbWQuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JY3ZwX2VuYWJsZV9jbWQucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfZW5hYmxlX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXByX2RlYnVnKCJjdnBfZW5hYmxlX2NtZCBwa3Qgc2l6ZSA9ICVkLCBjdnBfaGFuZGxlPSVkXG4iLAotCQljdnBfZW5hYmxlX2NtZC5wa3Rfc2l6ZSwgY3ZwX2hhbmRsZSk7Ci0JY3ZwX2VuYWJsZV9jbWQuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX2VuYWJsZV9jbWQuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKLQljdnBfZW5hYmxlX2NtZC50b2tlbiA9IDA7Ci0JY3ZwX2VuYWJsZV9jbWQub3Bjb2RlID0gVlNTX0lWT0NQUk9DX0NNRF9FTkFCTEU7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZjdnBfZW5hYmxlX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJGYWlsIGluIHNlbmRpbmcgVlNTX0lWT0NQUk9DX0NNRF9FTkFCTEVcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCQkodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NlbmRfbXZtX2NhbF9uZXR3b3JrX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9jYWxfbmV0d29ya190IG12bV9zZXRfY2FsX25ldHdvcms7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCi0JbXZtX3NldF9jYWxfbmV0d29yay5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JbXZtX3NldF9jYWxfbmV0d29yay5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihtdm1fc2V0X2NhbF9uZXR3b3JrKSAtIEFQUl9IRFJfU0laRSk7Ci0JbXZtX3NldF9jYWxfbmV0d29yay5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JbXZtX3NldF9jYWxfbmV0d29yay5oZHIuZGVzdF9wb3J0ID0gbXZtX2hhbmRsZTsKLQltdm1fc2V0X2NhbF9uZXR3b3JrLmhkci50b2tlbiA9IDA7Ci0JbXZtX3NldF9jYWxfbmV0d29yay5oZHIub3Bjb2RlID0gVlNTX0lNVk1fQ01EX1NFVF9DQUxfTkVUV09SSzsKLQltdm1fc2V0X2NhbF9uZXR3b3JrLm5ldHdvcmtfaWQgPSBWU1NfSUNPTU1PTl9DQUxfTkVUV09SS19JRF9OT05FOwotCi0Jdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3NldF9jYWxfbmV0d29yayk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBTRVRfTkVUV09SS1xuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+bXZtX3dhaXQsCi0JCQkJKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9uZXRpZF90aW1pbmdfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9tdm07Ci0JdTE2IG12bV9oYW5kbGU7Ci0Jc3RydWN0IG12bV9zZXRfbmV0d29ya19jbWQgbXZtX3NldF9uZXR3b3JrOwotCXN0cnVjdCBtdm1fc2V0X3ZvaWNlX3RpbWluZ19jbWQgbXZtX3NldF92b2ljZV90aW1pbmc7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOwotCi0JaWYgKCFhcHJfbXZtKSB7Ci0JCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCW12bV9oYW5kbGUgPSB2b2ljZV9nZXRfbXZtX2hhbmRsZSh2KTsKLQotCXJldCA9IHZvaWNlX2NvbmZpZ19jdnNfdm9jb2Rlcih2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBjb25maWd1cmluZyBDVlMgdm9jIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JLyogU2V0IG5ldHdvcmsgSUQuICovCi0JcHJfZGVidWcoIlNldHRpbmcgbmV0d29yayBJRCAleFxuIiwgY29tbW9uLm12c19pbmZvLm5ldHdvcmtfdHlwZSk7Ci0KLQltdm1fc2V0X25ldHdvcmsuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCW12bV9zZXRfbmV0d29yay5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YobXZtX3NldF9uZXR3b3JrKSAtIEFQUl9IRFJfU0laRSk7Ci0JbXZtX3NldF9uZXR3b3JrLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQltdm1fc2V0X25ldHdvcmsuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JbXZtX3NldF9uZXR3b3JrLmhkci50b2tlbiA9IDA7Ci0JbXZtX3NldF9uZXR3b3JrLmhkci5vcGNvZGUgPSBWU1NfSU1WTV9DTURfU0VUX0NBTF9ORVRXT1JLOwotCW12bV9zZXRfbmV0d29yay5uZXR3b3JrLm5ldHdvcmtfaWQgPSBjb21tb24ubXZzX2luZm8ubmV0d29ya190eXBlOwotCi0Jdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX3NldF9uZXR3b3JrKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9ORVRXT1JLXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTZXQgdm9pY2UgdGltaW5nLiAqLwotCSBwcl9kZWJ1ZygiU2V0dGluZyB2b2ljZSB0aW1pbmdcbiIpOwotCi0JbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCW12bV9zZXRfdm9pY2VfdGltaW5nLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCQlzaXplb2YobXZtX3NldF92b2ljZV90aW1pbmcpIC0KLQkJCQkJCUFQUl9IRFJfU0laRSk7Ci0JbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCW12bV9zZXRfdm9pY2VfdGltaW5nLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCW12bV9zZXRfdm9pY2VfdGltaW5nLmhkci50b2tlbiA9IDA7Ci0JbXZtX3NldF92b2ljZV90aW1pbmcuaGRyLm9wY29kZSA9IFZTU19JQ09NTU9OX0NNRF9TRVRfVk9JQ0VfVElNSU5HOwotCW12bV9zZXRfdm9pY2VfdGltaW5nLnRpbWluZy5tb2RlID0gMDsKLQltdm1fc2V0X3ZvaWNlX3RpbWluZy50aW1pbmcuZW5jX29mZnNldCA9IDgwMDA7Ci0JbXZtX3NldF92b2ljZV90aW1pbmcudGltaW5nLmRlY19yZXFfb2Zmc2V0ID0gMzMwMDsKLQltdm1fc2V0X3ZvaWNlX3RpbWluZy50aW1pbmcuZGVjX29mZnNldCA9IDgzMDA7Ci0KLQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV9zZXRfdm9pY2VfdGltaW5nKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciAlZCBzZW5kaW5nIFNFVF9USU1JTkdcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCSh2LT5tdm1fc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9hdHRhY2hfdm9jcHJvY19jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG12bV9hdHRhY2hfdm9jcHJvY19jbWQgbXZtX2Ffdm9jcHJvY19jbWQ7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZSwgY3ZwX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQotCS8qIGF0dGFjaCB2b2Nwcm9jIGFuZCB3YWl0IGZvciByZXNwb25zZSAqLwotCW12bV9hX3ZvY3Byb2NfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltdm1fYV92b2Nwcm9jX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihtdm1fYV92b2Nwcm9jX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXByX2RlYnVnKCJzZW5kIG12bV9hX3ZvY3Byb2NfY21kIHBrdCBzaXplID0gJWRcbiIsCi0JCW12bV9hX3ZvY3Byb2NfY21kLmhkci5wa3Rfc2l6ZSk7Ci0JbXZtX2Ffdm9jcHJvY19jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCW12bV9hX3ZvY3Byb2NfY21kLmhkci5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCW12bV9hX3ZvY3Byb2NfY21kLmhkci50b2tlbiA9IDA7Ci0JbXZtX2Ffdm9jcHJvY19jbWQuaGRyLm9wY29kZSA9IFZTU19JTVZNX0NNRF9BVFRBQ0hfVk9DUFJPQzsKLQltdm1fYV92b2Nwcm9jX2NtZC5tdm1fYXR0YWNoX2N2cF9oYW5kbGUuaGFuZGxlID0gY3ZwX2hhbmRsZTsKLQotCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfbXZtLCAodWludDMyX3QgKikgJm12bV9hX3ZvY3Byb2NfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSU1WTV9DTURfQVRUQUNIX1ZPQ1BST0NcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZvY191cGRhdGVfc2Vzc2lvbl9wYXJhbXMoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JLyogcmVzZXQgTENIIG1vZGUgKi8KLQl2LT5sY2hfbW9kZSA9IDA7Ci0KLQkvKiBjbGVhciBkaXNhYmxlIHRvcG9sb2d5IHNldHRpbmcgKi8KLQl2LT5kaXNhYmxlX3RvcG9sb2d5ID0gZmFsc2U7Ci0KLQkvKiBjbGVhciBtdXRlIHNldHRpbmcgKi8KLQl2LT5kZXZfcnguZGV2X211dGUgPSAgY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7Ci0Jdi0+ZGV2X3R4LmRldl9tdXRlID0gIGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOwotCXYtPnN0cmVhbV9yeC5zdHJlYW1fbXV0ZSA9IGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOwotCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZSA9IGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2Rlc3Ryb3lfdm9jcHJvYyhzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgbXZtX2RldGFjaF92b2Nwcm9jX2NtZCBtdm1fZF92b2Nwcm9jX2NtZDsKLQlzdHJ1Y3QgYXByX2hkciBjdnBfZGVzdHJveV9zZXNzaW9uX2NtZDsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICphcHJfbXZtLCAqYXByX2N2cDsKLQl1MTYgbXZtX2hhbmRsZSwgY3ZwX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCi0JaWYgKCFhcHJfbXZtIHx8ICFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9tdm0gb3IgYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQotCS8qIGRpc2FibGUgc2xvd3RhbGsgaWYgc3RfZW5hYmxlIGlzIHNldCAqLwotCWlmICh2LT5zdF9lbmFibGUpCi0JCXZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwgTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCwgMCk7Ci0KLQkvKiBEaXNhYmxlIEhEIFZvaWNlIGlmIGhkX2VuYWJsZSBpcyBzZXQgKi8KLQlpZiAodi0+aGRfZW5hYmxlKQotCQl2b2ljZV9zZW5kX2hkX2NtZCh2LCAwKTsKLQotCS8qIHN0b3AgcGxheWJhY2sgb3IgcmVjb3JkaW5nICovCi0Jdi0+bXVzaWNfaW5mby5mb3JjZSA9IDE7Ci0Jdm9pY2VfY3ZzX3N0b3BfcGxheWJhY2sodik7Ci0Jdm9pY2VfY3ZzX3N0b3BfcmVjb3JkKHYpOwotCS8qIElmIHZvaWNlIGNhbGwgaXMgYWN0aXZlIGR1cmluZyBWb0xURSwgU1JWQ0MgaGFwcGVucy4KLQkgKiBTdGFydCByZWNvcmRpbmcgb24gdm9pY2Ugc2Vzc2lvbiBpZiByZWNvcmRpbmcgc3RhcnRlZCBkdXJpbmcgVm9MVEUuCi0JICovCi0JaWYgKGlzX3ZvbHRlX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCkgJiYKLQkgICAgKChjb21tb24udm9pY2VbVk9DX1BBVEhfUEFTU0lWRV0udm9jX3N0YXRlID09IFZPQ19SVU4pIHx8Ci0JICAgICAoY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1BBU1NJVkVdLnZvY19zdGF0ZSA9PSBWT0NfQ0hBTkdFKSkpIHsKLQkJaWYgKHYtPnJlY19pbmZvLnJlY19lbmFibGUpIHsKLQkJCXZvaWNlX2N2c19zdGFydF9yZWNvcmQoCi0JCQkJJmNvbW1vbi52b2ljZVtWT0NfUEFUSF9QQVNTSVZFXSwKLQkJCQl2LT5yZWNfaW5mby5yZWNfbW9kZSk7Ci0JCQljb21tb24uc3J2Y2NfcmVjX2ZsYWcgPSB0cnVlOwotCi0JCQlwcl9kZWJ1ZygiJXM6IHN3aXRjaCByZWNvcmRpbmcsIHNydmNjX3JlY19mbGFnICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgY29tbW9uLnNydmNjX3JlY19mbGFnKTsKLQkJfQotCX0KLQotCS8qIHNlbmQgc3RvcCB2b2ljZSBjbWQgKi8KLQl2b2ljZV9zZW5kX3N0b3Bfdm9pY2VfY21kKHYpOwotCi0JLyogc2VuZCBzdG9wIGR0bWYgZGV0ZWN0b24gY21kICovCi0JaWYgKHYtPmR0bWZfcnhfZGV0ZWN0X2VuKQotCQl2b2ljZV9zZW5kX2R0bWZfcnhfZGV0ZWN0aW9uX2NtZCh2LCAwKTsKLQotCS8qIGRldGFjaCBWT0NQUk9DIGFuZCB3YWl0IGZvciByZXNwb25zZSBmcm9tIG12bSAqLwotCW12bV9kX3ZvY3Byb2NfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltdm1fZF92b2Nwcm9jX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihtdm1fZF92b2Nwcm9jX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXByX2RlYnVnKCJtdm1fZF92b2Nwcm9jX2NtZCAgcGt0IHNpemUgPSAlZFxuIiwKLQkJbXZtX2Rfdm9jcHJvY19jbWQuaGRyLnBrdF9zaXplKTsKLQltdm1fZF92b2Nwcm9jX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JbXZtX2Rfdm9jcHJvY19jbWQuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JbXZtX2Rfdm9jcHJvY19jbWQuaGRyLnRva2VuID0gMDsKLQltdm1fZF92b2Nwcm9jX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lNVk1fQ01EX0RFVEFDSF9WT0NQUk9DOwotCW12bV9kX3ZvY3Byb2NfY21kLm12bV9kZXRhY2hfY3ZwX2hhbmRsZS5oYW5kbGUgPSBjdnBfaGFuZGxlOwotCi0Jdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbXZtX2Rfdm9jcHJvY19jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFZTU19JTVZNX0NNRF9ERVRBQ0hfVk9DUFJPQ1xuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPm12bV93YWl0LAotCQkJCSAodi0+bXZtX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHYpOwotCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfY2FsX2NtZCh2KTsKLQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2Rldl9jZmdfY21kKHYpOwotCXZvaWNlX3NlbmRfY3ZzX2RlcmVnaXN0ZXJfY2FsX2NtZCh2KTsKLQotCS8qIGRlc3Ryb3AgY3ZwIHNlc3Npb24gKi8KLQljdnBfZGVzdHJveV9zZXNzaW9uX2NtZC5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQljdnBfZGVzdHJveV9zZXNzaW9uX2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJc2l6ZW9mKGN2cF9kZXN0cm95X3Nlc3Npb25fY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JcHJfZGVidWcoImN2cF9kZXN0cm95X3Nlc3Npb25fY21kIHBrdCBzaXplID0gJWRcbiIsCi0JCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLnBrdF9zaXplKTsKLQljdnBfZGVzdHJveV9zZXNzaW9uX2NtZC5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnBfZGVzdHJveV9zZXNzaW9uX2NtZC5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOwotCWN2cF9kZXN0cm95X3Nlc3Npb25fY21kLnRva2VuID0gMDsKLQljdnBfZGVzdHJveV9zZXNzaW9uX2NtZC5vcGNvZGUgPSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTjsKLQotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF9kZXN0cm95X3Nlc3Npb25fY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTlxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlydGFjX3JlbW92ZV92b2ljZSh2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KSk7Ci0JY3ZwX2hhbmRsZSA9IDA7Ci0Jdm9pY2Vfc2V0X2N2cF9oYW5kbGUodiwgY3ZwX2hhbmRsZSk7Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9tdm1fdW5tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKLQkJCQkJCSAgICB1aW50MzJfdCBtZW1faGFuZGxlKQotewotCXN0cnVjdCB2c3NfaW1lbW9yeV9jbWRfdW5tYXBfdCBtZW1fdW5tYXA7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX212bTsKLQl1MTYgbXZtX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfbXZtID0gY29tbW9uLmFwcl9xNl9tdm07Ci0KLQlpZiAoIWFwcl9tdm0pIHsKLQkJcHJfZXJyKCIlczogYXByX212bSBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCi0JbWVtX3VubWFwLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQltZW1fdW5tYXAuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQlzaXplb2YobWVtX3VubWFwKSAtIEFQUl9IRFJfU0laRSk7Ci0JbWVtX3VubWFwLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQltZW1fdW5tYXAuaGRyLmRlc3RfcG9ydCA9IG12bV9oYW5kbGU7Ci0JbWVtX3VubWFwLmhkci50b2tlbiA9IDA7Ci0JbWVtX3VubWFwLmhkci5vcGNvZGUgPSBWU1NfSU1FTU9SWV9DTURfVU5NQVA7Ci0JbWVtX3VubWFwLm1lbV9oYW5kbGUgPSBtZW1faGFuZGxlOwotCi0JcHJfZGVidWcoIiVzOiBtZW1faGFuZGxlOiAweCV4XG4iLCBfX2Z1bmNfXywgbWVtX3VubWFwLm1lbV9oYW5kbGUpOwotCi0Jdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sICh1aW50MzJfdCAqKSAmbWVtX3VubWFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIm1lbV91bm1hcCBvcFsweCV4XXJldFslZF1cbiIsCi0JCQltZW1fdW5tYXAuaGRyLm9wY29kZSwgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5tdm1fd2FpdCwKLQkJCQkgKHYtPm12bV9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9zZW5kX2N2c19wYWNrZXRfZXhjaGFuZ2VfY29uZmlnX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9vb2JfcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ190Ci0JCQkJCQkgcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3Q7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2czsKLQl1MTYgY3ZzX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0KLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRCgKLQkJCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YocGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QpIC0KLQkJCQkJIEFQUl9IRFJfU0laRSk7Ci0JcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0Lmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOwotCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0Lmhkci50b2tlbiA9IDA7Ci0JcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuaGRyLm9wY29kZSA9Ci0JCQkgVlNTX0lTVFJFQU1fQ01EX1NFVF9PT0JfUEFDS0VUX0VYQ0hBTkdFX0NPTkZJRzsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5tZW1faGFuZGxlID0gdi0+c2htZW1faW5mby5tZW1faGFuZGxlOwotCS8qIGRlYyBidWZmZXIgYWRkcmVzcyAqLwotCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmRlY19idWZfYWRkcl9sc3cgPQotCQlsb3dlcl8zMl9iaXRzKHYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlswXS5waHlzKTsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5kZWNfYnVmX2FkZHJfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlswXS5waHlzKTsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5kZWNfYnVmX3NpemUgPSA0MDk2OwotCS8qIGVuYyBidWZmZXIgYWRkcmVzcyAqLwotCXBhY2tldF9leGNoYW5nZV9jb25maWdfcGt0LmVuY19idWZfYWRkcl9sc3cgPQotCQlsb3dlcl8zMl9iaXRzKHYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlsxXS5waHlzKTsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5lbmNfYnVmX2FkZHJfbXN3ID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJCXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlsxXS5waHlzKTsKLQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5lbmNfYnVmX3NpemUgPSA0MDk2OwotCi0JcHJfZGVidWcoIiVzOiBkZWMgYnVmIGFkZDogbHN3ICUweCBtc3cgJTB4LCBzaXplICVkLCBlbmMgYnVmIGFkZDogbHN3ICUweCBtc3cgJTB4LCBzaXplICVkXG4iLAotCQlfX2Z1bmNfXywKLQkJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuZGVjX2J1Zl9hZGRyX2xzdywKLQkJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuZGVjX2J1Zl9hZGRyX21zdywKLQkJcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QuZGVjX2J1Zl9zaXplLAotCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5lbmNfYnVmX2FkZHJfbHN3LAotCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5lbmNfYnVmX2FkZHJfbXN3LAotCQlwYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3BrdC5lbmNfYnVmX3NpemUpOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmcGFja2V0X2V4Y2hhbmdlX2NvbmZpZ19wa3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIHNlbmQgcGFja2V0IGV4Y2hhbmdlIGNvbmZpZyBjbWQgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpCi0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dCAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9jdnNfZGF0YV9leGNoYW5nZV9tb2RlX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9wYWNrZXRfZXhjaGFuZ2VfbW9kZV90IGRhdGFfZXhjaGFuZ2VfcGt0OwotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOwotCi0JaWYgKCFhcHJfY3ZzKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJCUFQUl9QS1RfVkVSKTsKLQlkYXRhX2V4Y2hhbmdlX3BrdC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihkYXRhX2V4Y2hhbmdlX3BrdCkgLSBBUFJfSERSX1NJWkUpOwotCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQlkYXRhX2V4Y2hhbmdlX3BrdC5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQlkYXRhX2V4Y2hhbmdlX3BrdC5oZHIudG9rZW4gPSAwOwotCWRhdGFfZXhjaGFuZ2VfcGt0Lmhkci5vcGNvZGUgPSBWU1NfSVNUUkVBTV9DTURfU0VUX1BBQ0tFVF9FWENIQU5HRV9NT0RFOwotCWRhdGFfZXhjaGFuZ2VfcGt0Lm1vZGUgPSBWU1NfSVNUUkVBTV9QQUNLRVRfRVhDSEFOR0VfTU9ERV9PVVRfT0ZfQkFORDsKLQotCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmRhdGFfZXhjaGFuZ2VfcGt0KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIkZhaWxlZCB0byBzZW5kIGRhdGEgZXhjaGFuZ2UgbW9kZSAlZFxuIiwgcmV0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0dXJuIDA7Ci1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zdHJlYW1fbXV0ZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsIHVpbnQxNl90IGRpcmVjdGlvbiwKLQkJCQkgICAgIHVpbnQxNl90IG11dGVfZmxhZywgdWludDMyX3QgcmFtcF9kdXJhdGlvbikKLXsKLQlzdHJ1Y3QgY3ZzX3NldF9tdXRlX2NtZCBjdnNfbXV0ZV9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKCFjb21tb24uYXByX3E2X2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBzZW5kIG11dGUvdW5tdXRlIHRvIGN2cyAqLwotCWN2c19tdXRlX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JY3ZzX211dGVfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCXNpemVvZihjdnNfbXV0ZV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnNfbXV0ZV9jbWQuaGRyLnNyY19wb3J0ID0KLQkJCQl2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKHYtPnNlc3Npb25faWQpOwotCWN2c19tdXRlX2NtZC5oZHIuZGVzdF9wb3J0ID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0JY3ZzX211dGVfY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZzX211dGVfY21kLmhkci5vcGNvZGUgPSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMjsKLQljdnNfbXV0ZV9jbWQuY3ZzX3NldF9tdXRlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQljdnNfbXV0ZV9jbWQuY3ZzX3NldF9tdXRlLm11dGVfZmxhZyA9IG11dGVfZmxhZzsKLQljdnNfbXV0ZV9jbWQuY3ZzX3NldF9tdXRlLnJhbXBfZHVyYXRpb25fbXMgPSByYW1wX2R1cmF0aW9uOwotCi0Jdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGNvbW1vbi5hcHJfcTZfY3ZzLCAodWludDMyX3QgKikgJmN2c19tdXRlX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgJWQgc2VuZGluZyBzdHJlYW0gbXV0ZVxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQkJZ290byBmYWlsOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiAwOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9kZXZpY2VfbXV0ZV9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYsIHVpbnQxNl90IGRpcmVjdGlvbiwKLQkJCQkgICAgIHVpbnQxNl90IG11dGVfZmxhZywgdWludDMyX3QgcmFtcF9kdXJhdGlvbikKLXsKLQlzdHJ1Y3QgY3ZwX3NldF9tdXRlX2NtZCBjdnBfbXV0ZV9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKCFjb21tb24uYXByX3E2X2N2cCkgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQljdnBfbXV0ZV9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQkJQVBSX1BLVF9WRVIpOwotCWN2cF9tdXRlX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCQlzaXplb2YoY3ZwX211dGVfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZwX211dGVfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnBfbXV0ZV9jbWQuaGRyLmRlc3RfcG9ydCA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCWN2cF9tdXRlX2NtZC5oZHIudG9rZW4gPSAwOwotCWN2cF9tdXRlX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lWT0xVTUVfQ01EX01VVEVfVjI7Ci0JY3ZwX211dGVfY21kLmN2cF9zZXRfbXV0ZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0JY3ZwX211dGVfY21kLmN2cF9zZXRfbXV0ZS5tdXRlX2ZsYWcgPSBtdXRlX2ZsYWc7Ci0JY3ZwX211dGVfY21kLmN2cF9zZXRfbXV0ZS5yYW1wX2R1cmF0aW9uX21zID0gcmFtcF9kdXJhdGlvbjsKLQotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChjb21tb24uYXByX3E2X2N2cCwgKHVpbnQzMl90ICopICZjdnBfbXV0ZV9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgcnggZGV2aWNlIGNtZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQkJZ290byBmYWlsOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogQ29tbWFuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiAwOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF92b2xfc3RlcF9jbWQoc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0Jc3RydWN0IGN2cF9zZXRfcnhfdm9sdW1lX3N0ZXBfY21kIGN2cF92b2xfc3RlcF9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0KLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JLyogc2VuZCB2b2x1bWUgaW5kZXggdG8gY3ZwICovCi0JY3ZwX3ZvbF9zdGVwX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCQlBUFJfUEtUX1ZFUik7Ci0JY3ZwX3ZvbF9zdGVwX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnBfdm9sX3N0ZXBfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0JY3ZwX3ZvbF9zdGVwX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3ZvbF9zdGVwX2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKLQljdnBfdm9sX3N0ZXBfY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZwX3ZvbF9zdGVwX2NtZC5oZHIub3Bjb2RlID0gVlNTX0lWT0xVTUVfQ01EX1NFVF9TVEVQOwotCWN2cF92b2xfc3RlcF9jbWQuY3ZwX3NldF92b2xfc3RlcC5kaXJlY3Rpb24gPSBWU1NfSVZPTFVNRV9ESVJFQ1RJT05fUlg7Ci0JY3ZwX3ZvbF9zdGVwX2NtZC5jdnBfc2V0X3ZvbF9zdGVwLnZhbHVlID0gdi0+ZGV2X3J4LnZvbHVtZV9zdGVwX3ZhbHVlOwotCWN2cF92b2xfc3RlcF9jbWQuY3ZwX3NldF92b2xfc3RlcC5yYW1wX2R1cmF0aW9uX21zID0KLQkJCQkJdi0+ZGV2X3J4LnZvbHVtZV9yYW1wX2R1cmF0aW9uX21zOwotCSBwcl9kZWJ1ZygiJXMgc3RlcF92YWx1ZTolZCwgcmFtcF9kdXJhdGlvbl9tczolZCIsCi0JCQlfX2Z1bmNfXywKLQkJCWN2cF92b2xfc3RlcF9jbWQuY3ZwX3NldF92b2xfc3RlcC52YWx1ZSwKLQkJCWN2cF92b2xfc3RlcF9jbWQuY3ZwX3NldF92b2xfc3RlcC5yYW1wX2R1cmF0aW9uX21zKTsKLQotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF92b2xfc3RlcF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFJYIFZPTCBzdGVwXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnBfd2FpdCwKLQkJCQkgKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2N2c19zdGFydF9yZWNvcmQoc3RydWN0IHZvaWNlX2RhdGEgKnYsIHVpbnQzMl90IHJlY19tb2RlKQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0KLQlzdHJ1Y3QgY3ZzX3N0YXJ0X3JlY29yZF9jbWQgY3ZzX3N0YXJ0X3JlY29yZDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7Ci0KLQlpZiAoIWFwcl9jdnMpIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cyBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdnNfaGFuZGxlID0gdm9pY2VfZ2V0X2N2c19oYW5kbGUodik7Ci0KLQlpZiAoIXYtPnJlY19pbmZvLnJlY29yZGluZykgewotCQljdnNfc3RhcnRfcmVjb3JkLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKAotCQkJCQlBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJQVBSX1BLVF9WRVIpOwotCQljdnNfc3RhcnRfcmVjb3JkLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJICBzaXplb2YoY3ZzX3N0YXJ0X3JlY29yZCkgLSBBUFJfSERSX1NJWkUpOwotCQljdnNfc3RhcnRfcmVjb3JkLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJY3ZzX3N0YXJ0X3JlY29yZC5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQkJY3ZzX3N0YXJ0X3JlY29yZC5oZHIudG9rZW4gPSAwOwotCQljdnNfc3RhcnRfcmVjb3JkLmhkci5vcGNvZGUgPSBWU1NfSVJFQ09SRF9DTURfU1RBUlQ7Ci0KLQkJY3ZzX3N0YXJ0X3JlY29yZC5yZWNfbW9kZS5wb3J0X2lkID0KLQkJCQkJVlNTX0lSRUNPUkRfUE9SVF9JRF9ERUZBVUxUOwotCQlpZiAocmVjX21vZGUgPT0gVk9DX1JFQ19VUExJTkspIHsKLQkJCWN2c19zdGFydF9yZWNvcmQucmVjX21vZGUucnhfdGFwX3BvaW50ID0KLQkJCQkJVlNTX0lSRUNPUkRfVEFQX1BPSU5UX05PTkU7Ci0JCQljdnNfc3RhcnRfcmVjb3JkLnJlY19tb2RlLnR4X3RhcF9wb2ludCA9Ci0JCQkJCVZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5EOwotCQl9IGVsc2UgaWYgKHJlY19tb2RlID09IFZPQ19SRUNfRE9XTkxJTkspIHsKLQkJCWN2c19zdGFydF9yZWNvcmQucmVjX21vZGUucnhfdGFwX3BvaW50ID0KLQkJCQkJVlNTX0lSRUNPUkRfVEFQX1BPSU5UX1NUUkVBTV9FTkQ7Ci0JCQljdnNfc3RhcnRfcmVjb3JkLnJlY19tb2RlLnR4X3RhcF9wb2ludCA9Ci0JCQkJCVZTU19JUkVDT1JEX1RBUF9QT0lOVF9OT05FOwotCQl9IGVsc2UgaWYgKHJlY19tb2RlID09IFZPQ19SRUNfQk9USCkgewotCQkJY3ZzX3N0YXJ0X3JlY29yZC5yZWNfbW9kZS5yeF90YXBfcG9pbnQgPQotCQkJCQlWU1NfSVJFQ09SRF9UQVBfUE9JTlRfU1RSRUFNX0VORDsKLQkJCWN2c19zdGFydF9yZWNvcmQucmVjX21vZGUudHhfdGFwX3BvaW50ID0KLQkJCQkJVlNTX0lSRUNPUkRfVEFQX1BPSU5UX1NUUkVBTV9FTkQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGluLWNhbGwgcmVjX21vZGUgJWRcbiIsIF9fZnVuY19fLAotCQkJCXJlY19tb2RlKTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJdi0+YXN5bmNfZXJyID0gMDsKLQotCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZjdnNfc3RhcnRfcmVjb3JkKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU1RBUlRfUkVDT1JEXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJICh2LT5jdnNfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0KLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQl2LT5yZWNfaW5mby5yZWNvcmRpbmcgPSAxOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogU3RhcnQgcmVjb3JkIGFscmVhZHkgc2VudFxuIiwgX19mdW5jX18pOwotCX0KLQotCXJldHVybiAwOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfY3ZzX3N0b3BfcmVjb3JkKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0Jc3RydWN0IGFwcl9oZHIgY3ZzX3N0b3BfcmVjb3JkOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCWlmICh2LT5yZWNfaW5mby5yZWNvcmRpbmcpIHsKLQkJY3ZzX3N0b3BfcmVjb3JkLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJICBBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JCWN2c19zdG9wX3JlY29yZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJICBzaXplb2YoY3ZzX3N0b3BfcmVjb3JkKSAtIEFQUl9IRFJfU0laRSk7Ci0JCWN2c19zdG9wX3JlY29yZC5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJY3ZzX3N0b3BfcmVjb3JkLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7Ci0JCWN2c19zdG9wX3JlY29yZC50b2tlbiA9IDA7Ci0JCWN2c19zdG9wX3JlY29yZC5vcGNvZGUgPSBWU1NfSVJFQ09SRF9DTURfU1RPUDsKLQotCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0JCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsICh1aW50MzJfdCAqKSAmY3ZzX3N0b3BfcmVjb3JkKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU1RPUF9SRUNPUkRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0KLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQl2LT5yZWNfaW5mby5yZWNvcmRpbmcgPSAwOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogU3RvcCByZWNvcmQgYWxyZWFkeSBzZW50XG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zdGFydF9yZWNvcmQodWludDMyX3QgcG9ydF9pZCwgdWludDMyX3Qgc2V0LCB1aW50MzJfdCBzZXNzaW9uX2lkKQotewotCWludCByZXQgPSAwOwotCWludCByZWNfbW9kZSA9IDA7Ci0JdTE2IGN2c19oYW5kbGU7Ci0JaW50IHJlY19zZXQgPSAwOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCi0JLyogY2hlY2sgaWYgc2Vzc2lvbl9pZCBpcyB2YWxpZCAqLwotCWlmICghdm9pY2VfaXNfdmFsaWRfc2Vzc2lvbl9pZChzZXNzaW9uX2lkKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb24gaWQ6JXVcbiIsIF9fZnVuY19fLAotCQkgICAgICAgc2Vzc2lvbl9pZCk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgc2Vzc2lvbl9pZCk7Ci0JcHJfZGVidWcoIiVzOiBzZXNzaW9uX2lkOiV1XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXByX2VycigiJXM6IHYgaXMgTlVMTCwgc2Vzc2lvbmlkOiV1XG4iLCBfX2Z1bmNfXywKLQkJCQlzZXNzaW9uX2lkKTsKLQotCQkJYnJlYWs7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBwb3J0X2lkOiAlZCwgc2V0OiAlZCwgdjogJXBLXG4iLAotCQkJIF9fZnVuY19fLCBwb3J0X2lkLCBzZXQsIHYpOwotCi0JCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQlyZWNfbW9kZSA9IHYtPnJlY19pbmZvLnJlY19tb2RlOwotCQlyZWNfc2V0ID0gc2V0OwotCQlpZiAoc2V0KSB7Ci0JCQlpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnICE9IDApICYmCi0JCQkJKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnICE9IDApKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiByZWMgbW9kZSBhbHJlYWR5IHNldC5cbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChwb3J0X2lkID09IFZPSUNFX1JFQ09SRF9UWCkgewotCQkJCWlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPT0gMCkKLQkJCQkmJiAodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgPT0gMCkpIHsKLQkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX1VQTElOSzsKLQkJCQkJdi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPSAxOwotCQkJCX0gZWxzZSBpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID09IDApCi0JCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyAhPSAwKSkgewotCQkJCQl2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7Ci0JCQkJCXJlY19tb2RlID0gVk9DX1JFQ19CT1RIOwotCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9IDE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwb3J0X2lkID09IFZPSUNFX1JFQ09SRF9SWCkgewotCQkJCWlmICgodi0+cmVjX3JvdXRlX3N0YXRlLnVsX2ZsYWcgPT0gMCkKLQkJCQkJJiYgKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID09IDApKSB7Ci0JCQkJCXJlY19tb2RlID0gVk9DX1JFQ19ET1dOTElOSzsKLQkJCQkJdi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgPSAxOwotCQkJCX0gZWxzZSBpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnICE9IDApCi0JCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9PSAwKSkgewotCQkJCQl2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7Ci0JCQkJCXJlY19tb2RlID0gVk9DX1JFQ19CT1RIOwotCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9IDE7Ci0JCQkJfQotCQkJfQotCQkJcmVjX3NldCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID09IDApICYmCi0JCQkJKHYtPnJlY19yb3V0ZV9zdGF0ZS5kbF9mbGFnID09IDApKSB7Ci0JCQkJcHJfZGVidWcoIiVzOiByZWMgYWxyZWFkeSBzdG9wcy5cbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocG9ydF9pZCA9PSBWT0lDRV9SRUNPUkRfVFgpIHsKLQkJCQlpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnICE9IDApCi0JCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9PSAwKSkgewotCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9IDA7Ci0JCQkJCXJlY19zZXQgPSAwOwotCQkJCX0gZWxzZSBpZiAoKHYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnICE9IDApCi0JCQkJCSYmICh2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyAhPSAwKSkgewotCQkJCQl2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7Ci0JCQkJCXYtPnJlY19yb3V0ZV9zdGF0ZS51bF9mbGFnID0gMDsKLQkJCQkJcmVjX21vZGUgPSBWT0NfUkVDX0RPV05MSU5LOwotCQkJCQlyZWNfc2V0ID0gMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBvcnRfaWQgPT0gVk9JQ0VfUkVDT1JEX1JYKSB7Ci0JCQkJaWYgKCh2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyA9PSAwKQotCQkJCQkmJiAodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgIT0gMCkpIHsKLQkJCQkJdi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgPSAwOwotCQkJCQlyZWNfc2V0ID0gMDsKLQkJCQl9IGVsc2UgaWYgKCh2LT5yZWNfcm91dGVfc3RhdGUudWxfZmxhZyAhPSAwKQotCQkJCQkmJiAodi0+cmVjX3JvdXRlX3N0YXRlLmRsX2ZsYWcgIT0gMCkpIHsKLQkJCQkJdm9pY2VfY3ZzX3N0b3BfcmVjb3JkKHYpOwotCQkJCQl2LT5yZWNfcm91dGVfc3RhdGUuZGxfZmxhZyA9IDA7Ci0JCQkJCXJlY19tb2RlID0gVk9DX1JFQ19VUExJTks7Ci0JCQkJCXJlY19zZXQgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcl9kZWJ1ZygiJXM6IG1vZGUgPSVkLCBzZXQgPSVkXG4iLCBfX2Z1bmNfXywKLQkJCSByZWNfbW9kZSwgcmVjX3NldCk7Ci0JCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCQlpZiAoY3ZzX2hhbmRsZSAhPSAwKSB7Ci0JCQlpZiAocmVjX3NldCkKLQkJCQlyZXQgPSB2b2ljZV9jdnNfc3RhcnRfcmVjb3JkKHYsIHJlY19tb2RlKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSB2b2ljZV9jdnNfc3RvcF9yZWNvcmQodik7Ci0JCX0KLQotCQkvKiBEdXJpbmcgU1JWQ0MsIHJlY29yZGluZyB3aWxsIHN3aXRjaCBmcm9tIFZvTFRFIHNlc3Npb24gdG8KLQkJICogdm9pY2Ugc2Vzc2lvbi4KLQkJICogVGhlbiBzdG9wIHJlY29yZGluZywgbmVlZCB0byBzdG9wIHJlY29yZGluZyBvbiB2b2ljZSBzZXNzaW9uLgotCQkgKi8KLQkJaWYgKCghcmVjX3NldCkgJiYgY29tbW9uLnNydmNjX3JlY19mbGFnKSB7Ci0JCQlwcl9kZWJ1ZygiJXMsIHNydmNjX3JlY19mbGFnOiVkXG4iLCAgX19mdW5jX18sCi0JCQkJIGNvbW1vbi5zcnZjY19yZWNfZmxhZyk7Ci0KLQkJCXZvaWNlX2N2c19zdG9wX3JlY29yZCgmY29tbW9uLnZvaWNlW1ZPQ19QQVRIX1BBU1NJVkVdKTsKLQkJCWNvbW1vbi5zcnZjY19yZWNfZmxhZyA9IGZhbHNlOwotCQl9Ci0KLQkJLyogQ2FjaGUgdGhlIHZhbHVlICovCi0JCXYtPnJlY19pbmZvLnJlY19lbmFibGUgPSByZWNfc2V0OwotCQl2LT5yZWNfaW5mby5yZWNfbW9kZSA9IHJlY19tb2RlOwotCi0JCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9jdnNfc3RhcnRfcGxheWJhY2soc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGN2c19zdGFydF9wbGF5YmFja19jbWQgY3ZzX3N0YXJ0X3BsYXliYWNrOwotCXZvaWQgKmFwcl9jdnM7Ci0JdTE2IGN2c19oYW5kbGU7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOwotCi0JaWYgKCFhcHJfY3ZzKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCi0JaWYgKCF2LT5tdXNpY19pbmZvLnBsYXlpbmcgJiYgdi0+bXVzaWNfaW5mby5jb3VudCkgewotCQljdnNfc3RhcnRfcGxheWJhY2suaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoCi0JCQkJCUFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCQlBUFJfUEtUX1ZFUik7Ci0JCWN2c19zdGFydF9wbGF5YmFjay5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnNfc3RhcnRfcGxheWJhY2spIC0gQVBSX0hEUl9TSVpFKTsKLQkJY3ZzX3N0YXJ0X3BsYXliYWNrLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJY3ZzX3N0YXJ0X3BsYXliYWNrLmhkci5kZXN0X3BvcnQgPSBjdnNfaGFuZGxlOwotCQljdnNfc3RhcnRfcGxheWJhY2suaGRyLnRva2VuID0gMDsKLQkJY3ZzX3N0YXJ0X3BsYXliYWNrLmhkci5vcGNvZGUgPSBWU1NfSVBMQVlCQUNLX0NNRF9TVEFSVDsKLQkJY3ZzX3N0YXJ0X3BsYXliYWNrLnBsYXliYWNrX21vZGUucG9ydF9pZCA9Ci0JCQkJCQl2LT5tdXNpY19pbmZvLnBvcnRfaWQ7Ci0KLQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCQl2LT5hc3luY19lcnIgPSAwOwotCi0JCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zdGFydF9wbGF5YmFjayk7Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU1RBUlRfUExBWUJBQ0tcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0KLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dCh2LT5jdnNfd2FpdCwKLQkJCQkgKHYtPmN2c19zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXYtPm11c2ljX2luZm8ucGxheWluZyA9IDE7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBTdGFydCBwbGF5YmFjayBhbHJlYWR5IHNlbnRcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2N2c19zdG9wX3BsYXliYWNrKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCSBpbnQgcmV0ID0gMDsKLQkgc3RydWN0IGFwcl9oZHIgY3ZzX3N0b3BfcGxheWJhY2s7Ci0JIHZvaWQgKmFwcl9jdnM7Ci0JIHUxNiBjdnNfaGFuZGxlOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFwcl9jdnMgPSBjb21tb24uYXByX3E2X2N2czsKLQotCWlmICghYXByX2N2cykgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTEwuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCWlmICh2LT5tdXNpY19pbmZvLnBsYXlpbmcgJiYgKCghdi0+bXVzaWNfaW5mby5jb3VudCkgfHwKLQkJCQkJCSh2LT5tdXNpY19pbmZvLmZvcmNlKSkpIHsKLQkJY3ZzX3N0b3BfcGxheWJhY2suaGRyX2ZpZWxkID0KLQkJCQlBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQkJY3ZzX3N0b3BfcGxheWJhY2sucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZihjdnNfc3RvcF9wbGF5YmFjaykgLSBBUFJfSERSX1NJWkUpOwotCQljdnNfc3RvcF9wbGF5YmFjay5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQkJY3ZzX3N0b3BfcGxheWJhY2suZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQkJY3ZzX3N0b3BfcGxheWJhY2sudG9rZW4gPSAwOwotCi0JCWN2c19zdG9wX3BsYXliYWNrLm9wY29kZSA9IFZTU19JUExBWUJBQ0tfQ01EX1NUT1A7Ci0KLQkJdi0+Y3ZzX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCQl2LT5hc3luY19lcnIgPSAwOwotCi0JCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZzLCAodWludDMyX3QgKikgJmN2c19zdG9wX3BsYXliYWNrKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEVycm9yICVkIHNlbmRpbmcgU1RPUF9QTEFZQkFDS1xuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcmV0KTsKLQotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZzX3dhaXQsCi0JCQkJCSAodi0+Y3ZzX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJCSBtc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQkJaWYgKCFyZXQpIHsKLQkJCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJdi0+YXN5bmNfZXJyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXYtPm11c2ljX2luZm8ucGxheWluZyA9IDA7Ci0JCXYtPm11c2ljX2luZm8uZm9yY2UgPSAwOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogU3RvcCBwbGF5YmFjayBhbHJlYWR5IHNlbnRcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvY19sY2hfb3BzKHN0cnVjdCB2b2ljZV9kYXRhICp2LCBlbnVtIHZvaWNlX2xjaF9tb2RlIGxjaF9tb2RlKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3dpdGNoIChsY2hfbW9kZSkgewotCWNhc2UgVk9JQ0VfTENIX1NUQVJUOgotCi0JCXJldCA9IHZvY19lbmRfdm9pY2VfY2FsbCh2LT5zZXNzaW9uX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoIiVzOiB2b2ljZSBjYWxsIGVuZCBmYWlsZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCWJyZWFrOwotCWNhc2UgVk9JQ0VfTENIX1NUT1A6Ci0KLQkJcmV0ID0gdm9jX3N0YXJ0X3ZvaWNlX2NhbGwodi0+c2Vzc2lvbl9pZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiB2b2ljZSBjYWxsIHN0YXJ0IGZhaWxlZCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIExDSCBtb2RlOiAlZFxuIiwKLQkJCV9fZnVuY19fLCB2LT5sY2hfbW9kZSk7Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zdGFydF9wbGF5YmFjayh1aW50MzJfdCBzZXQsIHVpbnQxNl90IHBvcnRfaWQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0JdTE2IGN2c19oYW5kbGU7Ci0KLQlwcl9kZWJ1ZygiJXMgcG9ydF9pZCA9ICUjeCBzZXQgPSAlZCIsIF9fZnVuY19fLCBwb3J0X2lkLCBzZXQpOwotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgQUxMX1NFU1NJT05fVlNJRCk7Ci0Jd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgewotCQlpZiAoKHYgIT0gTlVMTCkgJiYKLQkJICAgICgoKHBvcnRfaWQgPT0gVk9JQ0VfUExBWUJBQ0tfVFgpICYmCi0JCSAgICAgICBpc19zdWIxX3ZzaWQodi0+c2Vzc2lvbl9pZCkpIHx8Ci0JCSAgICAgKChwb3J0X2lkID09IFZPSUNFMl9QTEFZQkFDS19UWCkgJiYKLQkJICAgICAgIGlzX3N1YjJfdnNpZCh2LT5zZXNzaW9uX2lkKSkpKSB7Ci0KLQkJCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQkJdi0+bXVzaWNfaW5mby5wb3J0X2lkID0gcG9ydF9pZDsKLQkJCXYtPm11c2ljX2luZm8ucGxheV9lbmFibGUgPSBzZXQ7Ci0JCQlpZiAoc2V0KQotCQkJCXYtPm11c2ljX2luZm8uY291bnQrKzsKLQkJCWVsc2UKLQkJCQl2LT5tdXNpY19pbmZvLmNvdW50LS07Ci0JCQlwcl9kZWJ1ZygiJXM6IG11c2ljX2luZm8gY291bnQ9JWRcbiIsIF9fZnVuY19fLAotCQkJCSB2LT5tdXNpY19pbmZvLmNvdW50KTsKLQotCQkJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCQkJaWYgKGN2c19oYW5kbGUgIT0gMCkgewotCQkJCWlmIChzZXQpCi0JCQkJCXJldCA9IHZvaWNlX2N2c19zdGFydF9wbGF5YmFjayh2KTsKLQkJCQllbHNlCi0JCQkJCXJldCA9IHZvaWNlX2N2c19zdG9wX3BsYXliYWNrKHYpOwotCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvblxuIiwgX19mdW5jX18pOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19kaXNhYmxlX3RvcG9sb2d5KHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGRpc2FibGUpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQotCXYtPmRpc2FibGVfdG9wb2xvZ3kgPSBkaXNhYmxlOwotCi0JbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX2FuZF9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwKLQkJCQkJCSB1aW50MzJfdCBtb2RlKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh2LT52b2Nfc3RhdGUgIT0gVk9DX1JVTikKLQkJcmV0ID0gdm9pY2Vfc2VuZF9jdnNfZGF0YV9leGNoYW5nZV9tb2RlX2NtZCh2KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRXJyb3Igdm9pY2Vfc2VuZF9kYXRhX2V4Y2hhbmdlX21vZGVfY21kICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSB2b2ljZV9zZW5kX2N2c19wYWNrZXRfZXhjaGFuZ2VfY29uZmlnX2NtZCh2KTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEVycm9yOiB2b2ljZV9zZW5kX3BhY2tldF9leGNoYW5nZV9jb25maWdfY21kICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotZmFpbDoKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IHZvY19zZXRfdHhfbXV0ZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBkaXIsIHVpbnQzMl90IG11dGUsCi0JCSAgICB1aW50MzJfdCByYW1wX2R1cmF0aW9uKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOwotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgc2Vzc2lvbl9pZCk7Ci0Jd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgewotCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZSA9IG11dGU7Ci0JCQl2LT5zdHJlYW1fdHguc3RyZWFtX211dGVfcmFtcF9kdXJhdGlvbl9tcyA9Ci0JCQkJCQkJCXJhbXBfZHVyYXRpb247Ci0JCQlpZiAoaXNfdm9jX3N0YXRlX2FjdGl2ZSh2LT52b2Nfc3RhdGUpICYmCi0JCQkJKHYtPmxjaF9tb2RlID09IDApKQotCQkJCXJldCA9IHZvaWNlX3NlbmRfc3RyZWFtX211dGVfY21kKHYsCi0JCQkJVlNTX0lWT0xVTUVfRElSRUNUSU9OX1RYLAotCQkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZSwKLQkJCQl2LT5zdHJlYW1fdHguc3RyZWFtX211dGVfcmFtcF9kdXJhdGlvbl9tcyk7Ci0JCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCXNlc3Npb25faWQpOwotCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm9jX3NldF9kZXZpY2VfbXV0ZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBkaXIsIHVpbnQzMl90IG11dGUsCi0JCQl1aW50MzJfdCByYW1wX2R1cmF0aW9uKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOwotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgc2Vzc2lvbl9pZCk7Ci0Jd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgewotCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQkJCWlmIChkaXIgPT0gVlNTX0lWT0xVTUVfRElSRUNUSU9OX1RYKSB7Ci0JCQkJdi0+ZGV2X3R4LmRldl9tdXRlID0gbXV0ZTsKLQkJCQl2LT5kZXZfdHguZGV2X211dGVfcmFtcF9kdXJhdGlvbl9tcyA9Ci0JCQkJCQkJcmFtcF9kdXJhdGlvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJdi0+ZGV2X3J4LmRldl9tdXRlID0gbXV0ZTsKLQkJCQl2LT5kZXZfcnguZGV2X211dGVfcmFtcF9kdXJhdGlvbl9tcyA9Ci0JCQkJCQkJcmFtcF9kdXJhdGlvbjsKLQkJCX0KLQotCQkJaWYgKCgodi0+dm9jX3N0YXRlID09IFZPQ19SVU4pIHx8Ci0JCQkJKHYtPnZvY19zdGF0ZSA9PSBWT0NfU1RBTkRCWSkpICYmCi0JCQkJKHYtPmxjaF9tb2RlID09IDApKQotCQkJCXJldCA9IHZvaWNlX3NlbmRfZGV2aWNlX211dGVfY21kKHYsCi0JCQkJCQkJZGlyLAotCQkJCQkJCW11dGUsCi0JCQkJCQkJcmFtcF9kdXJhdGlvbik7Ci0JCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCXNlc3Npb25faWQpOwotCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm9jX2dldF9yeF9kZXZpY2VfbXV0ZSh1aW50MzJfdCBzZXNzaW9uX2lkKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0KLQlyZXQgPSB2LT5kZXZfcnguZGV2X211dGU7Ci0KLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZXRfdHR5X21vZGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCB0dHlfbW9kZSkKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCi0Jdi0+dHR5X21vZGUgPSB0dHlfbW9kZTsKLQotCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi11aW50OF90IHZvY19nZXRfdHR5X21vZGUodWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCi0JcmV0ID0gdi0+dHR5X21vZGU7Ci0KLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZXRfcHBfZW5hYmxlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IG1vZHVsZV9pZCwgdWludDMyX3QgZW5hYmxlKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOwotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgc2Vzc2lvbl9pZCk7Ci0Jd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgewotCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQlpZiAoIShpc192b2ljZV9hcHBfaWQodi0+c2Vzc2lvbl9pZCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQkJCWlmIChtb2R1bGVfaWQgPT0gTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCkKLQkJCQl2LT5zdF9lbmFibGUgPSBlbmFibGU7Ci0KLQkJCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9DX1JVTikgewotCQkJCWlmICgobW9kdWxlX2lkID09IE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QpICYmCi0JCQkJICAgICghdi0+dHR5X21vZGUpKQotCQkJCQlyZXQgPSB2b2ljZV9zZW5kX3NldF9wcF9lbmFibGVfY21kKHYsCi0JCQkJCQlNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULAotCQkJCQkJZW5hYmxlKTsKLQkJCX0KLQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sCi0JCQkJCQkJCXNlc3Npb25faWQpOwotCQkJcmV0ID0gIC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2Nfc2V0X2hkX2VuYWJsZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBlbmFibGUpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0KLQl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKLQl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQkJdi0+aGRfZW5hYmxlID0gZW5hYmxlOwotCi0JCQlpZiAodi0+dm9jX3N0YXRlID09IFZPQ19SVU4pCi0JCQkJcmV0ID0gdm9pY2Vfc2VuZF9oZF9jbWQodiwgZW5hYmxlKTsKLQotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgICBzZXNzaW9uX2lkKTsKLQkJCXJldCA9ICAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm9jX3NldF9hZmVfc2lkZXRvbmUodWludDMyX3Qgc2Vzc2lvbl9pZCwgYm9vbCBzaWRldG9uZV9lbmFibGUpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0JdTE2IHJ4X3BvcnQsIHR4X3BvcnQ7Ci0KLQljb21tb24uc2lkZXRvbmVfZW5hYmxlID0gc2lkZXRvbmVfZW5hYmxlOwotCXZvaWNlX2l0cl9pbml0KCZpdHIsIHNlc3Npb25faWQpOwotCXdoaWxlICh2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbigmaXRyLCAmdikpIHsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLAotCQkJCSAgc2Vzc2lvbl9pZCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmdi0+bG9jayk7Ci0JCWlmICh2LT52b2Nfc3RhdGUgIT0gVk9DX1JVTikgewotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXJ4X3BvcnQgPSB2LT5kZXZfcngucG9ydF9pZDsKLQkJdHhfcG9ydCA9IHYtPmRldl90eC5wb3J0X2lkOwotCQlyZXQgPSBhZmVfc2lkZXRvbmVfZW5hYmxlKHR4X3BvcnQsIHJ4X3BvcnQsCi0JCQkJCSAgc2lkZXRvbmVfZW5hYmxlKTsKLQkJaWYgKCFyZXQpIHsKLQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JCQlicmVhazsKLQkJfQotCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1ib29sIHZvY19nZXRfYWZlX3NpZGV0b25lKHZvaWQpCi17Ci0JYm9vbCByZXQ7Ci0KLQlyZXQgPSBjb21tb24uc2lkZXRvbmVfZW5hYmxlOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfZ2V0X3BwX2VuYWJsZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBtb2R1bGVfaWQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlpZiAobW9kdWxlX2lkID09IE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QpCi0JCXJldCA9IHYtPnN0X2VuYWJsZTsKLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZXRfcnhfdm9sX3N0ZXAodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlyLCB1aW50MzJfdCB2b2xfc3RlcCwKLQkJCXVpbnQzMl90IHJhbXBfZHVyYXRpb24pCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0KLQlwcl9kZWJ1ZygiJXMgc2Vzc2lvbiBpZCA9ICUjeCB2b2wgPSAldSIsIF9fZnVuY19fLCBzZXNzaW9uX2lkLAotCQl2b2xfc3RlcCk7Ci0KLQl2b2ljZV9pdHJfaW5pdCgmaXRyLCBzZXNzaW9uX2lkKTsKLQl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQkJdi0+ZGV2X3J4LnZvbHVtZV9zdGVwX3ZhbHVlID0gdm9sX3N0ZXA7Ci0JCQl2LT5kZXZfcngudm9sdW1lX3JhbXBfZHVyYXRpb25fbXMgPSByYW1wX2R1cmF0aW9uOwotCQkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSkKLQkJCQlyZXQgPSB2b2ljZV9zZW5kX3ZvbF9zdGVwX2NtZCh2KTsKLQkJCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sCi0JCQkJc2Vzc2lvbl9pZCk7Ci0KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2Nfc2V0X2RldmljZV9jb25maWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2RpciwKLQkJCSAgc3RydWN0IG1lZGlhX2Zvcm1hdF9pbmZvICpmaW5mbykKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogcGF0aF9kaXI9JWQgcG9ydF9pZD0leCwgY2hhbm5lbHM9JWQsIHNhbXBsZV9yYXRlPSVkLCBiaXRzX3Blcl9zYW1wbGU9JWRcbiIsCi0JCV9fZnVuY19fLCBwYXRoX2RpciwgZmluZm8tPnBvcnRfaWQsIGZpbmZvLT5udW1fY2hhbm5lbHMsCi0JCWZpbmZvLT5zYW1wbGVfcmF0ZSwgZmluZm8tPmJpdHNfcGVyX3NhbXBsZSk7Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlzd2l0Y2ggKHBhdGhfZGlyKSB7Ci0JY2FzZSBSWF9QQVRIOgotCQl2LT5kZXZfcngucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQoZmluZm8tPnBvcnRfaWQpOwotCQl2LT5kZXZfcngubm9fb2ZfY2hhbm5lbHMgPSBmaW5mby0+bnVtX2NoYW5uZWxzOwotCQl2LT5kZXZfcnguc2FtcGxlX3JhdGUgPSBmaW5mby0+c2FtcGxlX3JhdGU7Ci0JCXYtPmRldl9yeC5iaXRzX3Blcl9zYW1wbGUgPSBmaW5mby0+Yml0c19wZXJfc2FtcGxlOwotCQltZW1jcHkoJnYtPmRldl9yeC5jaGFubmVsX21hcHBpbmcsICZmaW5mby0+Y2hhbm5lbF9tYXBwaW5nLAotCQkgICAgICAgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9QQVRIOgotCQl2LT5kZXZfdHgucG9ydF9pZCA9IHE2YXVkaW9fZ2V0X3BvcnRfaWQoZmluZm8tPnBvcnRfaWQpOwotCQl2LT5kZXZfdHgubm9fb2ZfY2hhbm5lbHMgPSBmaW5mby0+bnVtX2NoYW5uZWxzOwotCQl2LT5kZXZfdHguc2FtcGxlX3JhdGUgPSBmaW5mby0+c2FtcGxlX3JhdGU7Ci0JCXYtPmRldl90eC5iaXRzX3Blcl9zYW1wbGUgPSBmaW5mby0+Yml0c19wZXJfc2FtcGxlOwotCQltZW1jcHkoJnYtPmRldl90eC5jaGFubmVsX21hcHBpbmcsICZmaW5mby0+Y2hhbm5lbF9tYXBwaW5nLAotCQkgICAgICAgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXRoX2RpciAlZFxuIiwgX19mdW5jX18sIHBhdGhfZGlyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgdm9jX3NldF9leHRfZWNfcmVmX21lZGlhX2ZtdF9pbmZvKHN0cnVjdCBtZWRpYV9mb3JtYXRfaW5mbyAqZmluZm8pCi17Ci0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlpZiAoY29tbW9uLmVjX3JlZl9leHQpIHsKLQkJY29tbW9uLmVjX21lZGlhX2ZtdF9pbmZvLm51bV9jaGFubmVscyA9IGZpbmZvLT5udW1fY2hhbm5lbHM7Ci0JCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5iaXRzX3Blcl9zYW1wbGUgPQotCQkJZmluZm8tPmJpdHNfcGVyX3NhbXBsZTsKLQkJY29tbW9uLmVjX21lZGlhX2ZtdF9pbmZvLnNhbXBsZV9yYXRlID0gZmluZm8tPnNhbXBsZV9yYXRlOwotCQltZW1jcHkoJmNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5jaGFubmVsX21hcHBpbmcsCi0JCSAgICAgICAmZmluZm8tPmNoYW5uZWxfbWFwcGluZywgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFKTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IEV4dCBFYyBSZWYgbm90IGFjdGl2ZSwgcmV0dXJuaW5nIiwgX19mdW5jX18pOwotCX0KLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCB2b2Nfc2V0X3JvdXRlX2ZsYWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2RpciwgdWludDhfdCBzZXQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHBhdGhfZGlyPSVkLCBzZXQ9JWRcbiIsIF9fZnVuY19fLCBwYXRoX2Rpciwgc2V0KTsKLQotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCi0JaWYgKHBhdGhfZGlyID09IFJYX1BBVEgpCi0JCXYtPnZvY19yb3V0ZV9zdGF0ZS5yeF9yb3V0ZV9mbGFnID0gc2V0OwotCWVsc2UKLQkJdi0+dm9jX3JvdXRlX3N0YXRlLnR4X3JvdXRlX2ZsYWcgPSBzZXQ7Ci0KLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXVpbnQ4X3Qgdm9jX2dldF9yb3V0ZV9mbGFnKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQ4X3QgcGF0aF9kaXIpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQotCWlmIChwYXRoX2RpciA9PSBSWF9QQVRIKQotCQlyZXQgPSB2LT52b2Nfcm91dGVfc3RhdGUucnhfcm91dGVfZmxhZzsKLQllbHNlCi0JCXJldCA9IHYtPnZvY19yb3V0ZV9zdGF0ZS50eF9yb3V0ZV9mbGFnOwotCi0JbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfZW5kX3ZvaWNlX2NhbGwodWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNlc3Npb25faWQgMHgleFxuIiwgX19mdW5jX18sIHNlc3Npb25faWQpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCi0JaWYgKHYtPnZvY19zdGF0ZSA9PSBWT0NfUlVOIHx8IHYtPnZvY19zdGF0ZSA9PSBWT0NfRVJST1IgfHwKLQkgICAgdi0+dm9jX3N0YXRlID09IFZPQ19DSEFOR0UgfHwgdi0+dm9jX3N0YXRlID09IFZPQ19TVEFOREJZKSB7Ci0KLQkJcHJfZGVidWcoIiVzOiBWT0NfU1RBVEU6ICVkXG4iLCBfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKLQotCQlyZXQgPSB2b2ljZV9kZXN0cm95X3ZvY3Byb2Modik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogIGRlc3Ryb3kgdm9pY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJdm9jX3VwZGF0ZV9zZXNzaW9uX3BhcmFtcyh2KTsKLQotCQl2b2ljZV9kZXN0cm95X212bV9jdnNfc2Vzc2lvbih2KTsKLQkJdi0+dm9jX3N0YXRlID0gVk9DX1JFTEVBU0U7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogRXJyb3I6IEVuZCB2b2ljZSBjYWxsZWQgaW4gc3RhdGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zdGFuZGJ5X3ZvaWNlX2NhbGwodWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCXN0cnVjdCBhcHJfaGRyIG12bV9zdGFuZGJ5X3ZvaWNlX2NtZDsKLQl2b2lkICphcHJfbXZtOwotCXUxNiBtdm1faGFuZGxlOwotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXByX2RlYnVnKCIlczogdm9jIHN0YXRlPSVkIiwgX19mdW5jX18sIHYtPnZvY19zdGF0ZSk7Ci0KLQlpZiAodi0+dm9jX3N0YXRlID09IFZPQ19SVU4pIHsKLQkJYXByX212bSA9IGNvbW1vbi5hcHJfcTZfbXZtOwotCQlpZiAoIWFwcl9tdm0pIHsKLQkJCXByX2VycigiJXM6IGFwcl9tdm0gaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbXZtX2hhbmRsZSA9IHZvaWNlX2dldF9tdm1faGFuZGxlKHYpOwotCQltdm1fc3RhbmRieV92b2ljZV9jbWQuaGRyX2ZpZWxkID0KLQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLCBBUFJfUEtUX1ZFUik7Ci0JCW12bV9zdGFuZGJ5X3ZvaWNlX2NtZC5wa3Rfc2l6ZSA9Ci0JCQlBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJc2l6ZW9mKG12bV9zdGFuZGJ5X3ZvaWNlX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCQlwcl9kZWJ1Zygic2VuZCBtdm1fc3RhbmRieV92b2ljZV9jbWQgcGt0IHNpemUgPSAlZFxuIiwKLQkJCSBtdm1fc3RhbmRieV92b2ljZV9jbWQucGt0X3NpemUpOwotCQltdm1fc3RhbmRieV92b2ljZV9jbWQuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCW12bV9zdGFuZGJ5X3ZvaWNlX2NtZC5kZXN0X3BvcnQgPSBtdm1faGFuZGxlOwotCQltdm1fc3RhbmRieV92b2ljZV9jbWQudG9rZW4gPSAwOwotCQltdm1fc3RhbmRieV92b2ljZV9jbWQub3Bjb2RlID0gVlNTX0lNVk1fQ01EX1NUQU5EQllfVk9JQ0U7Ci0JCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9tdm0sCi0JCQkJKHVpbnQzMl90ICopJm12bV9zdGFuZGJ5X3ZvaWNlX2NtZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIkZhaWwgaW4gc2VuZGluZyBWU1NfSU1WTV9DTURfU1RBTkRCWV9WT0lDRVxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXYtPnZvY19zdGF0ZSA9IFZPQ19TVEFOREJZOwotCX0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19kaXNhYmxlX2RldmljZSh1aW50MzJfdCBzZXNzaW9uX2lkKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IHYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHZvYyBzdGF0ZT0lZFxuIiwgX19mdW5jX18sIHYtPnZvY19zdGF0ZSk7Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlpZiAodi0+dm9jX3N0YXRlID09IFZPQ19SVU4pIHsKLQkJcmV0ID0gdm9pY2VfcGF1c2Vfdm9pY2VfY2FsbCh2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IFBhdXNlIFZvaWNlIENhbGwgZmFpbGVkIGZvciBzZXNzaW9uIDB4JXgsIGVyciAlZCFcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHYtPnNlc3Npb25faWQsIHJldCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJcnRhY19yZW1vdmVfdm9pY2Uodm9pY2VfZ2V0X2N2c19oYW5kbGUodikpOwotCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX3ZvbF9jYWxfY21kKHYpOwotCQl2b2ljZV9zZW5kX2N2cF9kZXJlZ2lzdGVyX2NhbF9jbWQodik7Ci0JCXZvaWNlX3NlbmRfY3ZwX2RlcmVnaXN0ZXJfZGV2X2NmZ19jbWQodik7Ci0KLQkJdi0+dm9jX3N0YXRlID0gVk9DX0NIQU5HRTsKLQl9IGVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IGNhbGxlZCBpbiB2b2Mgc3RhdGU9JWQsIE5vX09QXG4iLAotCQkJIF9fZnVuY19fLCB2LT52b2Nfc3RhdGUpOwotCX0KLQotZG9uZToKLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19lbmFibGVfZGV2aWNlKHVpbnQzMl90IHNlc3Npb25faWQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByX2RlYnVnKCIlczogdm9jIHN0YXRlPSVkXG4iLCBfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlpZiAodi0+dm9jX3N0YXRlID09IFZPQ19DSEFOR0UpIHsKLQkJcmV0ID0gdm9pY2Vfc2VuZF90dHlfbW9kZV9jbWQodik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBTZW5kaW5nIFRUWSBtb2RlIGZhaWxlZCwgcmV0PSVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQkJLyogTm90IGEgY3JpdGljYWwgZXJyb3IsIGFsbG93IHZvaWNlIGNhbGwgdG8gY29udGludWUgKi8KLQkJfQotCi0JCWlmICh2LT50dHlfbW9kZSkgewotCQkJLyogZGlzYWJsZSBzbG93dGFsayAqLwotCQkJdm9pY2Vfc2VuZF9zZXRfcHBfZW5hYmxlX2NtZCh2LAotCQkJCQkJICAgICBNT0RVTEVfSURfVk9JQ0VfTU9EVUxFX1NULAotCQkJCQkJICAgICAwKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlc3RvcmUgc2xvd3RhbGsgKi8KLQkJCXZvaWNlX3NlbmRfc2V0X3BwX2VuYWJsZV9jbWQodiwKLQkJCQkJCSAgICAgTU9EVUxFX0lEX1ZPSUNFX01PRFVMRV9TVCwKLQkJCQkJCSAgICAgdi0+c3RfZW5hYmxlKTsKLQkJfQotCi0JCXJldCA9IHZvaWNlX3NlbmRfc2V0X2RldmljZV9jbWQodik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBTZXQgZGV2aWNlIGZhaWxlZCwgcmV0PSVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcmV0ID0gdm9pY2Vfc2VuZF9jdnBfbWVkaWFfZm10X2luZm9fY21kKHYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogU2V0IGZvcm1hdCBmYWlsZWQgZXJyOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCXJldCA9IHZvaWNlX3NlbmRfY3ZwX3RvcG9sb2d5X2NvbW1pdF9jbWQodik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiAgU2V0IHRvcG9sb2d5IGNvbW1pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8qIFNlbmQgTUZDIGNvbmZpZyBvbmx5IHdoZW4gdGhlIG5vIG9mIGNoYW5uZWxzIGFyZSA+IDEgKi8KLQkJaWYgKHYtPmRldl9yeC5ub19vZl9jaGFubmVscyA+IE5VTV9DSEFOTkVMU19NT05PKSB7Ci0JCQlyZXQgPSB2b2ljZV9zZW5kX2N2cF9tZmNfY29uZmlnX2NtZCh2KTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJfd2FybigiJXM6IFNldCBtZmMgY29uZmlnIGZhaWxlZCBlcnI6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCX0KLQkJfQotCi0JCXZvaWNlX3NlbmRfY3ZwX3JlZ2lzdGVyX2Rldl9jZmdfY21kKHYpOwotCQl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl9jYWxfY21kKHYpOwotCQl2b2ljZV9zZW5kX2N2cF9yZWdpc3Rlcl92b2xfY2FsX2NtZCh2KTsKLQotCQlydGFjX2FkZF92b2ljZSh2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KSwKLQkJCSAgICAgICB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KSwKLQkJCSAgICAgICB2LT5kZXZfcngucG9ydF9pZCwgdi0+ZGV2X3R4LnBvcnRfaWQsCi0JCQkgICAgICAgdi0+ZGV2X3J4LmRldl9pZCwgdi0+ZGV2X3R4LmRldl9pZCwKLQkJCSAgICAgICB2LT5zZXNzaW9uX2lkKTsKLQotCQlyZXQgPSB2b2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZCh2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEZhaWwgaW4gc2VuZGluZyBTVEFSVF9WT0lDRSwgcmV0PSVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXYtPnZvY19zdGF0ZSA9IFZPQ19SVU47Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBjYWxsZWQgaW4gdm9jIHN0YXRlPSVkLCBOb19PUFxuIiwKLQkJCSBfX2Z1bmNfXywgdi0+dm9jX3N0YXRlKTsKLQl9Ci0KLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2Nfc2V0X2xjaCh1aW50MzJfdCBzZXNzaW9uX2lkLCBlbnVtIHZvaWNlX2xjaF9tb2RlIGxjaF9tb2RlKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gdm9pY2VfZ2V0X3Nlc3Npb24oc2Vzc2lvbl9pZCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJnYtPmxvY2spOwotCWlmICh2LT5sY2hfbW9kZSA9PSBsY2hfbW9kZSkgewotCQlwcl9kZWJ1ZygiJXM6IFNlc3Npb24gJWQgYWxyZWFkeSBpbiBMQ0ggbW9kZSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHNlc3Npb25faWQsIGxjaF9tb2RlKTsKLQotCQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jdi0+bGNoX21vZGUgPSBsY2hfbW9kZTsKLQltdXRleF91bmxvY2soJnYtPmxvY2spOwotCi0JcmV0ID0gdm9jX2xjaF9vcHModiwgdi0+bGNoX21vZGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGxjaCBvcHMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm9jX3Jlc3VtZV92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IHZvaWNlX3NlbmRfc3RhcnRfdm9pY2VfY21kKHYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbCBpbiBzZW5kaW5nIFNUQVJUX1ZPSUNFXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQl2LT52b2Nfc3RhdGUgPSBWT0NfUlVOOwotCXJldHVybiAwOwotZmFpbDoKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotaW50IHZvY19zdGFydF92b2ljZV9jYWxsKHVpbnQzMl90IHNlc3Npb25faWQpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQotCWlmICh2LT52b2Nfc3RhdGUgPT0gVk9DX0VSUk9SKSB7Ci0JCXByX2RlYnVnKCIlczogVk9DIGluIEVSUiBzdGF0ZVxuIiwgX19mdW5jX18pOwotCi0JCXZvaWNlX2Rlc3Ryb3lfbXZtX2N2c19zZXNzaW9uKHYpOwotCQl2LT52b2Nfc3RhdGUgPSBWT0NfSU5JVDsKLQl9Ci0KLQlpZiAoKHYtPnZvY19zdGF0ZSA9PSBWT0NfSU5JVCkgfHwKLQkJKHYtPnZvY19zdGF0ZSA9PSBWT0NfUkVMRUFTRSkpIHsKLQkJcmV0ID0gdm9pY2VfYXByX3JlZ2lzdGVyKHNlc3Npb25faWQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogIGFwciByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWlmIChpc19jdmRfdmVyc2lvbl9xdWVyaWVkKCkpIHsKLQkJCXByX2RlYnVnKCIlczogUmV0dXJuaW5nIHRoZSBjYWNoZWQgdmFsdWUgJXNcbiIsCi0JCQkJIF9fZnVuY19fLCBjb21tb24uY3ZkX3ZlcnNpb24pOwotCQl9IGVsc2UgewotCQkJcmV0ID0gdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kKHYpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcHJfZGVidWcoIiVzOiBFcnJvciByZXRyaWV2aW5nIENWRCB2ZXJzaW9uICVkXG4iLAotCQkJCQkgX19mdW5jX18sIHJldCk7Ci0JCX0KLQotCQlyZXQgPSB2b2ljZV9jcmVhdGVfbXZtX2N2c19zZXNzaW9uKHYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjcmVhdGUgbXZtIGFuZCBjdnMgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWlmIChpc192b2lwX3Nlc3Npb24oc2Vzc2lvbl9pZCkpIHsKLQkJCS8qIEFsbG9jYXRlIG9vYiBtZW0gaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkIGFuZAotCQkJICogbWVtb3J5IG1hcCB0aGUgb29iIG1lbW9yeSBibG9jay4KLQkJCSAqLwotCQkJcmV0ID0gdm9pY2VfYWxsb2NfYW5kX21hcF9vb2JfbWVtKHYpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiB2b2ljZV9hbGxvY19hbmRfbWFwX29vYl9tZW0oKSBmYWlsZWQsIHJldDolZFxuIiwKLQkJCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0KLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0KLQkJCXJldCA9IHZvaWNlX3NldF9wYWNrZXRfZXhjaGFuZ2VfbW9kZV9hbmRfY29uZmlnKAotCQkJCXNlc3Npb25faWQsCi0JCQkJVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfT1VUX09GX0JBTkQpOwotCQkJaWYgKHJldCkgewotCQkJCXByX2VycigiJXM6IEVycjogZXhjaGFuZ2VfbW9kZV9hbmRfY29uZmlnICAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0KLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCX0KLQkJcmV0ID0gdm9pY2Vfc2VuZF9kdWFsX2NvbnRyb2xfY21kKHYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJFcnIgRHVhbCBjb21tYW5kIGZhaWxlZFxuIik7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJcmV0ID0gdm9pY2Vfc2V0dXBfdm9jcHJvYyh2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2Vycigic2V0dXAgdm9pY2UgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXJldCA9IHZvaWNlX3NlbmRfdm9sX3N0ZXBfY21kKHYpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2Vycigidm9pY2Ugdm9sdW1lIGZhaWxlZFxuIik7Ci0KLQkJcmV0ID0gdm9pY2Vfc2VuZF9zdHJlYW1fbXV0ZV9jbWQodiwKLQkJCQlWU1NfSVZPTFVNRV9ESVJFQ1RJT05fVFgsCi0JCQkJdi0+c3RyZWFtX3R4LnN0cmVhbV9tdXRlLAotCQkJCXYtPnN0cmVhbV90eC5zdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwcl9lcnIoInZvaWNlIG11dGUgZmFpbGVkXG4iKTsKLQotCQlyZXQgPSB2b2ljZV9zZW5kX3N0YXJ0X3ZvaWNlX2NtZCh2KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2Vycigic3RhcnQgdm9pY2UgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXYtPnZvY19zdGF0ZSA9IFZPQ19SVU47Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogRXJyb3I6IFN0YXJ0IHZvaWNlIGNhbGxlZCBpbiBzdGF0ZSAlZFxuIiwKLQkJCV9fZnVuY19fLCB2LT52b2Nfc3RhdGUpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDsKLQl9Ci1mYWlsOgotCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZXRfZXh0X2VjX3JlZl9wb3J0X2lkKHVpbnQxNl90IHBvcnRfaWQsIGJvb2wgc3RhdGUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCWlmIChzdGF0ZSA9PSB0cnVlKSB7Ci0JCWlmIChwb3J0X2lkID09IEFGRV9QT1JUX0lOVkFMSUQpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcG9ydCBpZCIsIF9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJY29tbW9uLmVjX3JlZl9leHQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCWNvbW1vbi5lY19yZWZfZXh0ID0gZmFsc2U7Ci0JfQotCS8qIENhY2hlIEVDIEZyb21hdCBJbmZvIGluIGNvbW1vbiAqLwotCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5wb3J0X2lkID0gcG9ydF9pZDsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfZ2V0X2V4dF9lY19yZWZfcG9ydF9pZCh2b2lkKQotewotCWlmIChjb21tb24uZWNfcmVmX2V4dCkKLQkJcmV0dXJuIGNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5wb3J0X2lkOwotCWVsc2UKLQkJcmV0dXJuIEFGRV9QT1JUX0lOVkFMSUQ7Ci19Ci0KLXZvaWQgdm9jX3JlZ2lzdGVyX212c19jYih1bF9jYl9mbiB1bF9jYiwKLQkJCSAgIGRsX2NiX2ZuIGRsX2NiLAotCQkJICAgdm9pcF9zc3JfY2Igc3NyX2NiLAotCQkJICAgdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCWNvbW1vbi5tdnNfaW5mby51bF9jYiA9IHVsX2NiOwotCWNvbW1vbi5tdnNfaW5mby5kbF9jYiA9IGRsX2NiOwotCWNvbW1vbi5tdnNfaW5mby5zc3JfY2IgPSBzc3JfY2I7Ci0JY29tbW9uLm12c19pbmZvLnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKLX0KLQotdm9pZCB2b2NfcmVnaXN0ZXJfZHRtZl9yeF9kZXRlY3Rpb25fY2IoZHRtZl9yeF9kZXRfY2JfZm4gZHRtZl9yeF91bF9jYiwKLQkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKQotewotCWNvbW1vbi5kdG1mX2luZm8uZHRtZl9yeF91bF9jYiA9IGR0bWZfcnhfdWxfY2I7Ci0JY29tbW9uLmR0bWZfaW5mby5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7Ci19Ci0KLXZvaWQgdm9jX2NvbmZpZ192b2NvZGVyKHVpbnQzMl90IG1lZGlhX3R5cGUsCi0JCQl1aW50MzJfdCByYXRlLAotCQkJdWludDMyX3QgbmV0d29ya190eXBlLAotCQkJdWludDMyX3QgZHR4X21vZGUsCi0JCQl1aW50MzJfdCBldnJjX21pbl9yYXRlLAotCQkJdWludDMyX3QgZXZyY19tYXhfcmF0ZSkKLXsKLQljb21tb24ubXZzX2luZm8ubWVkaWFfdHlwZSA9IG1lZGlhX3R5cGU7Ci0JY29tbW9uLm12c19pbmZvLnJhdGUgPSByYXRlOwotCWNvbW1vbi5tdnNfaW5mby5uZXR3b3JrX3R5cGUgPSBuZXR3b3JrX3R5cGU7Ci0JY29tbW9uLm12c19pbmZvLmR0eF9tb2RlID0gZHR4X21vZGU7Ci0JY29tbW9uLm12c19pbmZvLmV2cmNfbWluX3JhdGUgPSBldnJjX21pbl9yYXRlOwotCWNvbW1vbi5tdnNfaW5mby5ldnJjX21heF9yYXRlID0gZXZyY19tYXhfcmF0ZTsKLX0KLQotc3RhdGljIGludDMyX3QgcWRzcF9tdm1fY2FsbGJhY2soc3RydWN0IGFwcl9jbGllbnRfZGF0YSAqZGF0YSwgdm9pZCAqcHJpdikKLXsKLQl1aW50MzJfdCAqcHRyID0gTlVMTDsKLQlzdHJ1Y3QgY29tbW9uX2RhdGEgKmMgPSBOVUxMOwotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IHZzc19pdmVyc2lvbl9yc3BfZ2V0X3QgKnZlcnNpb25fcnNwID0gTlVMTDsKLQotCWlmICgoZGF0YSA9PSBOVUxMKSB8fCAocHJpdiA9PSBOVUxMKSkgewotCQlwcl9lcnIoIiVzOiBkYXRhIG9yIHByaXYgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljID0gcHJpdjsKLQotCXByX2RlYnVnKCIlczogUGF5bG9hZCBMZW5ndGggPSAlZCwgb3Bjb2RlPSV4XG4iLCBfX2Z1bmNfXywKLQkJZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5vcGNvZGUpOwotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCByZWNlaXZlZCBpbiBWb2ljZSBzZXJ2aWNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQotCQlpZiAoY29tbW9uLm12c19pbmZvLnNzcl9jYikgewotCQkJcHJfZGVidWcoIiVzOiBJbmZvcm1pbmcgcmVzZXQgZXZlbnQgdG8gVm9JUFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJY29tbW9uLm12c19pbmZvLnNzcl9jYihkYXRhLT5vcGNvZGUsCi0JCQkJCWNvbW1vbi5tdnNfaW5mby5wcml2YXRlX2RhdGEpOwotCQl9Ci0KLQkJYXByX3Jlc2V0KGMtPmFwcl9xNl9tdm0pOwotCQljLT5hcHJfcTZfbXZtID0gTlVMTDsKLQotCQkvKiBjbGVhbiB1cCBtZW1vcnkgaGFuZGxlICovCi0JCWMtPmNhbF9tZW1faGFuZGxlID0gMDsKLQkJYy0+cnRhY19tZW1faGFuZGxlID0gMDsKLQkJY2FsX3V0aWxzX2NsZWFyX2NhbF9ibG9ja19xNm1hcHMoTUFYX1ZPSUNFX0NBTF9UWVBFUywKLQkJCQljb21tb24uY2FsX2RhdGEpOwotCQlydGFjX2NsZWFyX21hcHBpbmcoVk9JQ0VfUlRBQ19DQUwpOwotCi0JCS8qIFN1Yi1zeXN0ZW0gcmVzdGFydCBpcyBhcHBsaWNhYmxlIHRvIGFsbCBzZXNzaW9ucy4gKi8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykgewotCQkJYy0+dm9pY2VbaV0ubXZtX2hhbmRsZSA9IDA7Ci0JCQljLT52b2ljZVtpXS5zaG1lbV9pbmZvLm1lbV9oYW5kbGUgPSAwOwotCQl9Ci0KLQkJLyogRnJlZSB0aGUgSU9OIG1lbW9yeSBhbmQgY2xlYXIgaGFuZGxlcyBmb3IgU291cmNlIFRyYWNraW5nICovCi0JCWlmIChpc19zb3VyY2VfdHJhY2tpbmdfc2hhcmVkX21lbW9tcnlfYWxsb2NhdGVkKCkpIHsKLQkJCW1zbV9hdWRpb19pb25fZnJlZSgKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQsCi0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlKTsKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLm1lbV9oYW5kbGUgPSAwOwotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCA9Ci0JCQkJCQkJCQlOVUxMOwotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSA9Ci0JCQkJCQkJCQlOVUxMOwotCQl9Ci0JCS8qIGNsZWFuIHVwIHNydmNjIHJlYyBmbGFnICovCi0JCWMtPnNydmNjX3JlY19mbGFnID0gZmFsc2U7Ci0JCXZvY19zZXRfZXJyb3Jfc3RhdGUoZGF0YS0+cmVzZXRfcHJvYyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByX2RlYnVnKCIlczogc2Vzc2lvbl9pZHggMHgleFxuIiwgX19mdW5jX18sIGRhdGEtPmRlc3RfcG9ydCk7Ci0KLQl2ID0gdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGRhdGEtPmRlc3RfcG9ydCk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7Ci0JCWlmIChkYXRhLT5wYXlsb2FkX3NpemUpIHsKLQkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7Ci0KLQkJCXByX2RlYnVnKCIleCAleFxuIiwgcHRyWzBdLCBwdHJbMV0pOwotCQkJLyogcGluZyBtdm0gc2VydmljZSBBQ0sgKi8KLQkJCXN3aXRjaCAocHRyWzBdKSB7Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9DUkVBVEVfUEFTU0lWRV9DT05UUk9MX1NFU1NJT046Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT046Ci0JCQkJLyogUGFzc2l2ZSBzZXNzaW9uIGlzIHVzZWQgZm9yIENTIGNhbGwKLQkJCQkgKiBGdWxsIHNlc3Npb24gaXMgdXNlZCBmb3IgVm9JUCBjYWxsLgotCQkJCSAqLwotCQkJCXByX2RlYnVnKCIlczogY21kID0gMHgleFxuIiwgX19mdW5jX18sIHB0clswXSk7Ci0JCQkJaWYgKCFwdHJbMV0pIHsKLQkJCQkJcHJfZGVidWcoIiVzOiBNVk0gaGFuZGxlIGlzICVkXG4iLAotCQkJCQkJIF9fZnVuY19fLCBkYXRhLT5zcmNfcG9ydCk7Ci0JCQkJCXZvaWNlX3NldF9tdm1faGFuZGxlKHYsIGRhdGEtPnNyY19wb3J0KTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJfZXJyKCJnb3QgTkFDSyBmb3Igc2VuZGluZyBNVk0gY3JlYXRlIHNlc3Npb25cbiIpOwotCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07Ci0JCQkJd2FrZV91cCgmdi0+bXZtX3dhaXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWU1NfSU1WTV9DTURfU1RBUlRfVk9JQ0U6Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9BVFRBQ0hfVk9DUFJPQzoKLQkJCWNhc2UgVlNTX0lNVk1fQ01EX1NUT1BfVk9JQ0U6Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9ERVRBQ0hfVk9DUFJPQzoKLQkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX1NFVF9UVFlfTU9ERToKLQkJCWNhc2UgQVBSVjJfSUJBU0lDX0NNRF9ERVNUUk9ZX1NFU1NJT046Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9BVFRBQ0hfU1RSRUFNOgotCQkJY2FzZSBWU1NfSU1WTV9DTURfREVUQUNIX1NUUkVBTToKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX1NFVF9ORVRXT1JLOgotCQkJY2FzZSBWU1NfSUNPTU1PTl9DTURfU0VUX1ZPSUNFX1RJTUlORzoKLQkJCWNhc2UgVlNTX0lNVk1fQ01EX1NFVF9QT0xJQ1lfRFVBTF9DT05UUk9MOgotCQkJY2FzZSBWU1NfSU1WTV9DTURfU0VUX0NBTF9ORVRXT1JLOgotCQkJY2FzZSBWU1NfSU1WTV9DTURfU0VUX0NBTF9NRURJQV9UWVBFOgotCQkJY2FzZSBWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMOgotCQkJY2FzZSBWU1NfSU1FTU9SWV9DTURfVU5NQVA6Ci0JCQljYXNlIFZTU19JTVZNX0NNRF9QQVVTRV9WT0lDRToKLQkJCWNhc2UgVlNTX0lNVk1fQ01EX1NUQU5EQllfVk9JQ0U6Ci0JCQljYXNlIFZTU19JSERWT0lDRV9DTURfRU5BQkxFOgotCQkJY2FzZSBWU1NfSUhEVk9JQ0VfQ01EX0RJU0FCTEU6Ci0JCQkJcHJfZGVidWcoIiVzOiBjbWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgcHRyWzBdKTsKLQkJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOwotCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVlNTX0lWRVJTSU9OX0NNRF9HRVQ6Ci0JCQkJcHJfZGVidWcoIiVzOiBFcnJvciByZXRyaWV2aW5nIENWRCBWZXJzaW9uLCBlcnJvcjolZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBwdHJbMV0pOwotCi0JCQkJc3RybGNweShjb21tb24uY3ZkX3ZlcnNpb24sIENWRF9WRVJTSU9OXzBfMCwKLQkJCQkJc2l6ZW9mKGNvbW1vbi5jdmRfdmVyc2lvbikpOwotCQkJCXByX2RlYnVnKCIlczogRmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUsIENWRCBWZXJzaW9uID0gJXNcbiIsCi0JCQkJCSBfX2Z1bmNfXywgY29tbW9uLmN2ZF92ZXJzaW9uKTsKLQotCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07Ci0JCQkJd2FrZV91cCgmdi0+bXZtX3dhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl9kZWJ1ZygiJXM6IG5vdCBtYXRjaCBjbWQgPSAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgcHRyWzBdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JTUVNT1JZX1JTUF9NQVApIHsKLQkJcHJfZGVidWcoIiVzLCBSZXZkIFZTU19JTUVNT1JZX1JTUF9NQVAgcmVzcG9uc2VcbiIsIF9fZnVuY19fKTsKLQotCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplICYmIGRhdGEtPnRva2VuID09IFZPSVBfTUVNX01BUF9UT0tFTikgewotCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJCWlmIChwdHJbMF0pIHsKLQkJCQl2LT5zaG1lbV9pbmZvLm1lbV9oYW5kbGUgPSBwdHJbMF07Ci0JCQkJcHJfZGVidWcoIiVzOiBzaGFyZWQgbWVtX2hhbmRsZTogMHhbJXhdXG4iLAotCQkJCQkgX19mdW5jX18sIHYtPnNobWVtX2luZm8ubWVtX2hhbmRsZSk7Ci0JCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOwotCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgJiYKLQkJCSAgIGRhdGEtPnRva2VuID09IFZPQ19DQUxfTUVNX01BUF9UT0tFTikgewotCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJCWlmIChwdHJbMF0pIHsKLQkJCQljLT5jYWxfbWVtX2hhbmRsZSA9IHB0clswXTsKLQotCQkJCXByX2RlYnVnKCIlczogY2FsIG1lbSBoYW5kbGUgMHgleFxuIiwKLQkJCQkJIF9fZnVuY19fLCBjLT5jYWxfbWVtX2hhbmRsZSk7Ci0KLQkJCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJd2FrZV91cCgmdi0+bXZtX3dhaXQpOwotCQkJfQotCQl9IGVsc2UgaWYgKGRhdGEtPnBheWxvYWRfc2l6ZSAmJgotCQkJICAgZGF0YS0+dG9rZW4gPT0gVk9DX1ZPSUNFX0hPU1RfUENNX01BUF9UT0tFTikgewotCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJCWlmIChwdHJbMF0pIHsKLQkJCQljb21tb24udm9pY2VfaG9zdF9wY21fbWVtX2hhbmRsZSA9IHB0clswXTsKLQotCQkJCXByX2RlYnVnKCIlczogdmhwY20gbWVtIGhhbmRsZSAweCV4XG4iLAotCQkJCQkgX19mdW5jX18sCi0JCQkJCSBjb21tb24udm9pY2VfaG9zdF9wY21fbWVtX2hhbmRsZSk7Ci0JCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOwotCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgJiYKLQkJCQlkYXRhLT50b2tlbiA9PSBWT0NfUlRBQ19NRU1fTUFQX1RPS0VOKSB7Ci0JCQlwdHIgPSBkYXRhLT5wYXlsb2FkOwotCQkJaWYgKHB0clswXSkgewotCQkJCWMtPnJ0YWNfbWVtX2hhbmRsZSA9IHB0clswXTsKLQotCQkJCXByX2RlYnVnKCIlczogY2FsIG1lbSBoYW5kbGUgMHgleFxuIiwKLQkJCQkJIF9fZnVuY19fLCBjLT5ydGFjX21lbV9oYW5kbGUpOwotCi0JCQkJdi0+bXZtX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOwotCQkJCXdha2VfdXAoJnYtPm12bV93YWl0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChkYXRhLT5wYXlsb2FkX3NpemUgJiYKLQkJCSAgIGRhdGEtPnRva2VuID09IFZPQ19TT1VSQ0VfVFJBQ0tJTkdfTUVNX01BUF9UT0tFTikgewotCQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJCWlmIChwdHJbMF0pIHsKLQkJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlID0KLQkJCQkJCQkJCXB0clswXTsKLQotCQkJCXByX2RlYnVnKCIlczogU291cmNlIFRyYWNraW5nIHNoYXJlZCBtZW0gaGFuZGxlIDB4JXhcbiIsCi0JCQkJCSBfX2Z1bmNfXywKLQkJCQkgICBjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlKTsKLQotCQkJCXYtPm12bV9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiBVbmtub3duIG1lbSBtYXAgdG9rZW4gJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGRhdGEtPnRva2VuKTsKLQkJfQotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JVkVSU0lPTl9SU1BfR0VUKSB7Ci0JCXByX2RlYnVnKCIlczogUmVjZWl2ZWQgVlNTX0lWRVJTSU9OX1JTUF9HRVRcbiIsIF9fZnVuY19fKTsKLQotCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplKSB7Ci0JCQl2ZXJzaW9uX3JzcCA9Ci0JCQkJKHN0cnVjdCB2c3NfaXZlcnNpb25fcnNwX2dldF90ICopZGF0YS0+cGF5bG9hZDsKLQkJCW1lbWNweShjb21tb24uY3ZkX3ZlcnNpb24sIHZlcnNpb25fcnNwLT52ZXJzaW9uLAotCQkJICAgICAgIENWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRSk7Ci0JCQlwcl9kZWJ1ZygiJXM6IENWRCBWZXJzaW9uID0gJXNcbiIsCi0JCQkJIF9fZnVuY19fLCBjb21tb24uY3ZkX3ZlcnNpb24pOwotCi0JCQl2LT5tdm1fc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQl3YWtlX3VwKCZ2LT5tdm1fd2FpdCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFkc3BfY3ZzX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGNvbW1vbl9kYXRhICpjID0gTlVMTDsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCi0JaWYgKChkYXRhID09IE5VTEwpIHx8IChwcml2ID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IGRhdGEgb3IgcHJpdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWMgPSBwcml2OwotCi0JcHJfZGVidWcoIiVzOiBzZXNzaW9uX2lkIDB4JXhcbiIsIF9fZnVuY19fLCBkYXRhLT5kZXN0X3BvcnQpOwotCXByX2RlYnVnKCIlczogUGF5bG9hZCBMZW5ndGggPSAlZCwgb3Bjb2RlPSV4XG4iLCBfX2Z1bmNfXywKLQkJZGF0YS0+cGF5bG9hZF9zaXplLCBkYXRhLT5vcGNvZGUpOwotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCByZWNlaXZlZCBpbiBWb2ljZSBzZXJ2aWNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQotCQlhcHJfcmVzZXQoYy0+YXByX3E2X2N2cyk7Ci0JCWMtPmFwcl9xNl9jdnMgPSBOVUxMOwotCi0JCS8qIFN1Yi1zeXN0ZW0gcmVzdGFydCBpcyBhcHBsaWNhYmxlIHRvIGFsbCBzZXNzaW9ucy4gKi8KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykKLQkJCWMtPnZvaWNlW2ldLmN2c19oYW5kbGUgPSAwOwotCi0JCWNhbF91dGlsc19jbGVhcl9jYWxfYmxvY2tfcTZtYXBzKE1BWF9WT0lDRV9DQUxfVFlQRVMsCi0JCQkJY29tbW9uLmNhbF9kYXRhKTsKLQotCQkvKiBGcmVlIHRoZSBJT04gbWVtb3J5IGFuZCBjbGVhciBoYW5kbGVzIGZvciBTb3VyY2UgVHJhY2tpbmcgKi8KLQkJaWYgKGlzX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb21yeV9hbGxvY2F0ZWQoKSkgewotCQkJbXNtX2F1ZGlvX2lvbl9mcmVlKAotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCwKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUpOwotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSA9IDA7Ci0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50ID0KLQkJCQkJCQkJCU5VTEw7Ci0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlID0KLQkJCQkJCQkJCU5VTEw7Ci0JCX0KLQkJdm9jX3NldF9lcnJvcl9zdGF0ZShkYXRhLT5yZXNldF9wcm9jKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdiA9IHZvaWNlX2dldF9zZXNzaW9uX2J5X2lkeChkYXRhLT5kZXN0X3BvcnQpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBBUFJfQkFTSUNfUlNQX1JFU1VMVCkgewotCQlpZiAoZGF0YS0+cGF5bG9hZF9zaXplKSB7Ci0JCQlwdHIgPSBkYXRhLT5wYXlsb2FkOwotCi0JCQlwcl9kZWJ1ZygiJXggJXhcbiIsIHB0clswXSwgcHRyWzFdKTsKLQkJCWlmIChwdHJbMV0gIT0gMCkgewotCQkJCXByX2VycigiJXM6IGNtZCA9IDB4JXggcmV0dXJuZWQgZXJyb3IgPSAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgcHRyWzBdLCBwdHJbMV0pOwotCQkJfQotCQkJLypyZXNwb25zZSBmcm9tICBDVlMgKi8KLQkJCXN3aXRjaCAocHRyWzBdKSB7Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9DUkVBVEVfUEFTU0lWRV9DT05UUk9MX1NFU1NJT046Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT046Ci0JCQkJaWYgKCFwdHJbMV0pIHsKLQkJCQkJcHJfZGVidWcoIiVzOiBDVlMgaGFuZGxlIGlzICVkXG4iLAotCQkJCQkJIF9fZnVuY19fLCBkYXRhLT5zcmNfcG9ydCk7Ci0JCQkJCXZvaWNlX3NldF9jdnNfaGFuZGxlKHYsIGRhdGEtPnNyY19wb3J0KTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJfZXJyKCJnb3QgTkFDSyBmb3Igc2VuZGluZyBDVlMgY3JlYXRlIHNlc3Npb25cbiIpOwotCQkJCXYtPmN2c19zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07Ci0JCQkJd2FrZV91cCgmdi0+Y3ZzX3dhaXQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMjoKLQkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX1NFVF9NRURJQV9UWVBFOgotCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfVk9DX0FNUl9TRVRfRU5DX1JBVEU6Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9WT0NfQU1SV0JfU0VUX0VOQ19SQVRFOgotCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfU0VUX0VOQ19EVFhfTU9ERToKLQkJCWNhc2UgVlNTX0lTVFJFQU1fQ01EX0NETUFfU0VUX0VOQ19NSU5NQVhfUkFURToKLQkJCWNhc2UgQVBSVjJfSUJBU0lDX0NNRF9ERVNUUk9ZX1NFU1NJT046Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyOgotCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfREVSRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBOgotCQkJY2FzZSBWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE6Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9ERVJFR0lTVEVSX1NUQVRJQ19DQUxJQlJBVElPTl9EQVRBOgotCQkJY2FzZSBWU1NfSUNPTU1PTl9DTURfTUFQX01FTU9SWToKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX1VOTUFQX01FTU9SWToKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX1NFVF9VSV9QUk9QRVJUWToKLQkJCWNhc2UgVlNTX0lQTEFZQkFDS19DTURfU1RBUlQ6Ci0JCQljYXNlIFZTU19JUExBWUJBQ0tfQ01EX1NUT1A6Ci0JCQljYXNlIFZTU19JUkVDT1JEX0NNRF9TVEFSVDoKLQkJCWNhc2UgVlNTX0lSRUNPUkRfQ01EX1NUT1A6Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9TRVRfUEFDS0VUX0VYQ0hBTkdFX01PREU6Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9TRVRfT09CX1BBQ0tFVF9FWENIQU5HRV9DT05GSUc6Ci0JCQljYXNlIFZTU19JU1RSRUFNX0NNRF9TRVRfUlhfRFRNRl9ERVRFQ1RJT046Ci0JCQkJcHJfZGVidWcoIiVzOiBjbWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgcHRyWzBdKTsKLQkJCQl2LT5jdnNfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOwotCQkJCXdha2VfdXAoJnYtPmN2c193YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMjoKLQkJCQlwcl9kZWJ1ZygiJXM6IFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjJcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJcnRhY19tYWtlX3ZvaWNlX2NhbGxiYWNrKFJUQUNfQ1ZTLCBwdHIsCi0JCQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX0dFVF9QQVJBTV9WMjoKLQkJCQlwcl9kZWJ1ZygiJXM6IFZTU19JQ09NTU9OX0NNRF9HRVRfUEFSQU1fVjJcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJLyogU2hvdWxkIG9ubHkgY29tZSBoZXJlIGlmIHRoZXJlIGlzIGFuIEFQUiAqLwotCQkJCS8qIGVycm9yIG9yIG1hbGZvcm1lZCBBUFIgcGFja2V0LiBPdGhlcndpc2UgKi8KLQkJCQkvKiByZXNwb25zZSB3aWxsIGJlIHJldHVybmVkIGFzICovCi0JCQkJLyogVlNTX0lDT01NT05fUlNQX0dFVF9QQVJBTSAqLwotCQkJCWlmIChwdHJbMV0gIT0gMCkgewotCQkJCQlwcl9lcnIoIiVzOiBDVlAgZ2V0IHBhcmFtIGVycm9yID0gJWQsIHJlc3VtaW5nXG4iLAotCQkJCQkJX19mdW5jX18sIHB0clsxXSk7Ci0JCQkJCXJ0YWNfbWFrZV92b2ljZV9jYWxsYmFjayhSVEFDX0NWUCwKLQkJCQkJCWRhdGEtPnBheWxvYWQsCi0JCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJfZGVidWcoIiVzOiBjbWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgcHRyWzBdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09Ci0JCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfRU5DX0JVRkZFUl9SRUFEWSkgewotCQlpbnQgcmV0ID0gMDsKLQkJdTE2IGN2c19oYW5kbGU7Ci0JCXVpbnQzMl90ICpjdnNfdm9jX3BrdDsKLQkJc3RydWN0IGN2c19lbmNfYnVmZmVyX2NvbnN1bWVkX2NtZCBzZW5kX2VuY19idWZfY29uc3VtZWRfY21kOwotCQl2b2lkICphcHJfY3ZzOwotCi0JCXByX2RlYnVnKCJFbmNvZGVyIGJ1ZmZlciBpcyByZWFkeVxuIik7Ci0KLQkJYXByX2N2cyA9IGNvbW1vbi5hcHJfcTZfY3ZzOwotCQlpZiAoIWFwcl9jdnMpIHsKLQkJCXByX2VycigiJXM6IGFwcl9jdnMgaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY3ZzX2hhbmRsZSA9IHZvaWNlX2dldF9jdnNfaGFuZGxlKHYpOwotCi0JCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCUFQUl9QS1RfVkVSKTsKLQkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIucGt0X3NpemUgPQotCQkJQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCXNpemVvZihzZW5kX2VuY19idWZfY29uc3VtZWRfY21kKSAtIEFQUl9IRFJfU0laRSk7Ci0KLQkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2c19oYW5kbGU7Ci0JCXNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQuaGRyLnRva2VuID0gMDsKLQkJc2VuZF9lbmNfYnVmX2NvbnN1bWVkX2NtZC5oZHIub3Bjb2RlID0KLQkJCVZTU19JU1RSRUFNX0VWVF9PT0JfTk9USUZZX0VOQ19CVUZGRVJfQ09OU1VNRUQ7Ci0KLQkJY3ZzX3ZvY19wa3QgPSB2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMV0uZGF0YTsKLQkJaWYgKGN2c192b2NfcGt0ICE9IE5VTEwgJiYgIGNvbW1vbi5tdnNfaW5mby51bF9jYiAhPSBOVUxMKSB7Ci0JCQkvKiBjdnNfdm9jX3BrdFswXSBjb250YWlucyB0eCB0aW1lc3RhbXAgKi8KLQkJCWNvbW1vbi5tdnNfaW5mby51bF9jYigodWludDhfdCAqKSZjdnNfdm9jX3BrdFszXSwKLQkJCQkJICAgICAgY3ZzX3ZvY19wa3RbMl0sCi0JCQkJCSAgICAgIGN2c192b2NfcGt0WzBdLAotCQkJCQkgICAgICBjb21tb24ubXZzX2luZm8ucHJpdmF0ZV9kYXRhKTsKLQkJfSBlbHNlCi0JCQlwcl9lcnIoIiVzOiBjdnNfdm9jX3BrdCBvciB1bF9jYiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnMsCi0JCQkodWludDMyX3QgKikgJnNlbmRfZW5jX2J1Zl9jb25zdW1lZF9jbWQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogRXJyIHNlbmQgRU5DX0JVRl9DT05TVU1FRF9OT1RJRlkgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9IGVsc2UgaWYgKGRhdGEtPm9wY29kZSA9PSBWU1NfSVNUUkVBTV9FVlRfU0VORF9FTkNfQlVGRkVSKSB7Ci0JCXByX2RlYnVnKCJSZWNkIFZTU19JU1RSRUFNX0VWVF9TRU5EX0VOQ19CVUZGRVJcbiIpOwotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09Ci0JCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfREVDX0JVRkZFUl9SRVFVRVNUKSB7Ci0JCWludCByZXQgPSAwOwotCQl1MTYgY3ZzX2hhbmRsZTsKLQkJdWludDMyX3QgKmN2c192b2NfcGt0OwotCQlzdHJ1Y3QgY3ZzX2RlY19idWZmZXJfcmVhZHlfY21kIHNlbmRfZGVjX2J1ZjsKLQkJdm9pZCAqYXByX2N2czsKLQotCQlhcHJfY3ZzID0gY29tbW9uLmFwcl9xNl9jdnM7Ci0KLQkJaWYgKCFhcHJfY3ZzKSB7Ci0JCQlwcl9lcnIoIiVzOiBhcHJfY3ZzIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWN2c19oYW5kbGUgPSB2b2ljZV9nZXRfY3ZzX2hhbmRsZSh2KTsKLQotCQlzZW5kX2RlY19idWYuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQlBUFJfSERSX0xFTihBUFJfSERSX1NJWkUpLAotCQkJCUFQUl9QS1RfVkVSKTsKLQotCQlzZW5kX2RlY19idWYuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCQkJc2l6ZW9mKHNlbmRfZGVjX2J1ZikgLSBBUFJfSERSX1NJWkUpOwotCi0JCXNlbmRfZGVjX2J1Zi5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JCXNlbmRfZGVjX2J1Zi5oZHIuZGVzdF9wb3J0ID0gY3ZzX2hhbmRsZTsKLQkJc2VuZF9kZWNfYnVmLmhkci50b2tlbiA9IDA7Ci0JCXNlbmRfZGVjX2J1Zi5oZHIub3Bjb2RlID0KLQkJCQkgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfREVDX0JVRkZFUl9SRUFEWTsKLQotCQljdnNfdm9jX3BrdCA9ICh1aW50MzJfdCAqKSh2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0uZGF0YSk7Ci0JCWlmIChjdnNfdm9jX3BrdCAhPSBOVUxMICYmIGNvbW1vbi5tdnNfaW5mby5kbF9jYiAhPSBOVUxMKSB7Ci0JCQkvKiBTZXQgdGltZXN0YW1wIHRvIDAgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KLQkJCWN2c192b2NfcGt0WzBdID0gMDsKLQkJCS8qIFNldCBtZWRpYV90eXBlIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCi0JCQljdnNfdm9jX3BrdFsxXSA9IGNvbW1vbi5tdnNfaW5mby5tZWRpYV90eXBlOwotCQkJY29tbW9uLm12c19pbmZvLmRsX2NiKAotCQkJCQkgICAgICAodWludDhfdCAqKSZjdnNfdm9jX3BrdFsyXSwKLQkJCQkJICAgICAgY29tbW9uLm12c19pbmZvLnByaXZhdGVfZGF0YSk7Ci0JCQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cywgKHVpbnQzMl90ICopICZzZW5kX2RlY19idWYpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBFcnIgc2VuZCBERUNfQlVGX1JFQURZX05PVElGSSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJfZGVidWcoIiVzOiB2b2NfcGt0IG9yIGRsX2NiIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU1RSRUFNX0VWVF9SRVFVRVNUX0RFQ19CVUZGRVIpIHsKLQkJcHJfZGVidWcoIlJlY2QgVlNTX0lTVFJFQU1fRVZUX1JFUVVFU1RfREVDX0JVRkZFUlxuIik7Ci0JfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUikgewotCQlwcl9kZWJ1ZygiU2VuZCBkZWMgYnVmIHJlc3BcbiIpOwotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9SU1BfQUNDRVBURUQpIHsKLQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJaWYgKHB0clswXSkKLQkJCXByX2RlYnVnKCIlczogQVBSX1JTUF9BQ0NFUFRFRCBmb3IgMHgleDpcbiIsCi0JCQkJIF9fZnVuY19fLCBwdHJbMF0pOwotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU1RSRUFNX0VWVF9OT1RfUkVBRFkpIHsKLQkJcHJfZGVidWcoIlJlY2QgVlNTX0lTVFJFQU1fRVZUX05PVF9SRUFEWVxuIik7Ci0JfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lTVFJFQU1fRVZUX1JFQURZKSB7Ci0JCXByX2RlYnVnKCJSZWNkIFZTU19JU1RSRUFNX0VWVF9SRUFEWVxuIik7Ci0JfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lDT01NT05fUlNQX0dFVF9QQVJBTSkgewotCQlwcl9kZWJ1ZygiJXM6IFZTU19JQ09NTU9OX1JTUF9HRVRfUEFSQU1cbiIsIF9fZnVuY19fKTsKLQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJaWYgKHB0clswXSAhPSAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBWU1NfSUNPTU1PTl9SU1BfR0VUX1BBUkFNIHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcHRyWzBdKTsKLQkJfQotCQlydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2soUlRBQ19DVlMsIGRhdGEtPnBheWxvYWQsCi0JCQkJCWRhdGEtPnBheWxvYWRfc2l6ZSk7Ci0JfSAgZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JU1RSRUFNX0VWVF9SWF9EVE1GX0RFVEVDVEVEKSB7Ci0JCXN0cnVjdCB2c3NfaXN0cmVhbV9ldnRfcnhfZHRtZl9kZXRlY3RlZCAqZHRtZl9yeF9kZXRlY3RlZDsKLQkJdWludDMyX3QgKnZvY19wa3QgPSBkYXRhLT5wYXlsb2FkOwotCQl1aW50MzJfdCBwa3RfbGVuID0gZGF0YS0+cGF5bG9hZF9zaXplOwotCi0JCWlmICgodm9jX3BrdCAhPSBOVUxMKSAmJgotCQkgICAgKHBrdF9sZW4gPT0KLQkJCXNpemVvZihzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQpKSkgewotCi0JCQlkdG1mX3J4X2RldGVjdGVkID0KLQkJCShzdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgKikgdm9jX3BrdDsKLQkJCXByX2RlYnVnKCJSWF9EVE1GX0RFVEVDVEVEIGxvd19mcmVxPSVkIGhpZ2hfZnJlcT0lZFxuIiwKLQkJCQkgZHRtZl9yeF9kZXRlY3RlZC0+bG93X2ZyZXEsCi0JCQkJIGR0bWZfcnhfZGV0ZWN0ZWQtPmhpZ2hfZnJlcSk7Ci0JCQlpZiAoYy0+ZHRtZl9pbmZvLmR0bWZfcnhfdWxfY2IpCi0JCQkJYy0+ZHRtZl9pbmZvLmR0bWZfcnhfdWxfY2IoKHVpbnQ4X3QgKil2b2NfcGt0LAotCQkJCQl2b2NfZ2V0X3Nlc3Npb25fbmFtZSh2LT5zZXNzaW9uX2lkKSwKLQkJCQkJYy0+ZHRtZl9pbmZvLnByaXZhdGVfZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIkludmFsaWQgcGFja2V0XG4iKTsKLQkJfQotCX0gIGVsc2UKLQkJcHJfZGVidWcoIlVua25vd24gb3Bjb2RlIDB4JXhcbiIsIGRhdGEtPm9wY29kZSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQzMl90IHFkc3BfY3ZwX2NhbGxiYWNrKHN0cnVjdCBhcHJfY2xpZW50X2RhdGEgKmRhdGEsIHZvaWQgKnByaXYpCi17Ci0JdWludDMyX3QgKnB0ciA9IE5VTEw7Ci0Jc3RydWN0IGNvbW1vbl9kYXRhICpjID0gTlVMTDsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IE5VTEw7Ci0JaW50IGkgPSAwOwotCi0JaWYgKChkYXRhID09IE5VTEwpIHx8IChwcml2ID09IE5VTEwpKSB7Ci0JCXByX2VycigiJXM6IGRhdGEgb3IgcHJpdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWMgPSBwcml2OwotCi0JaWYgKGRhdGEtPm9wY29kZSA9PSBSRVNFVF9FVkVOVFMpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXNldCBldmVudCByZWNlaXZlZCBpbiBWb2ljZSBzZXJ2aWNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQotCQlhcHJfcmVzZXQoYy0+YXByX3E2X2N2cCk7Ci0JCWMtPmFwcl9xNl9jdnAgPSBOVUxMOwotCQljYWxfdXRpbHNfY2xlYXJfY2FsX2Jsb2NrX3E2bWFwcyhNQVhfVk9JQ0VfQ0FMX1RZUEVTLAotCQkJCWNvbW1vbi5jYWxfZGF0YSk7Ci0KLQkJLyogU3ViLXN5c3RlbSByZXN0YXJ0IGlzIGFwcGxpY2FibGUgdG8gYWxsIHNlc3Npb25zLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZPQ19TRVNTSU9OUzsgaSsrKQotCQkJYy0+dm9pY2VbaV0uY3ZwX2hhbmRsZSA9IDA7Ci0KLQkJLyoKLQkJICogRnJlZSB0aGUgSU9OIG1lbW9yeSBhbmQgY2xlYXIgaGFuZGxlcyBmb3IKLQkJICogU291cmNlIFRyYWNraW5nCi0JCSAqLwotCQlpZiAoaXNfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vbXJ5X2FsbG9jYXRlZCgpKSB7Ci0JCQltc21fYXVkaW9faW9uX2ZyZWUoCi0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50LAotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSk7Ci0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlID0gMDsKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQgPQotCQkJCQkJCQkJTlVMTDsKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgPQotCQkJCQkJCQkJTlVMTDsKLQkJfQotCQl2b2Nfc2V0X2Vycm9yX3N0YXRlKGRhdGEtPnJlc2V0X3Byb2MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl2ID0gdm9pY2VfZ2V0X3Nlc3Npb25fYnlfaWR4KGRhdGEtPmRlc3RfcG9ydCk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZGF0YS0+b3Bjb2RlID09IEFQUl9CQVNJQ19SU1BfUkVTVUxUKSB7Ci0JCWlmIChkYXRhLT5wYXlsb2FkX3NpemUpIHsKLQkJCXB0ciA9IGRhdGEtPnBheWxvYWQ7Ci0KLQkJCXByX2RlYnVnKCIleCAleFxuIiwgcHRyWzBdLCBwdHJbMV0pOwotCQkJaWYgKHB0clsxXSAhPSAwKSB7Ci0JCQkJcHJfZXJyKCIlczogY21kID0gMHgleCByZXR1cm5lZCBlcnJvciA9IDB4JXhcbiIsCi0JCQkJCV9fZnVuY19fLCBwdHJbMF0sIHB0clsxXSk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHB0clswXSkgewotCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0NSRUFURV9GVUxMX0NPTlRST0xfU0VTU0lPTl9WMjoKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjM6Ci0JCQkvKnJlc3BvbnNlIGZyb20gIENWUCAqLwotCQkJCXByX2RlYnVnKCIlczogY21kID0gMHgleFxuIiwgX19mdW5jX18sIHB0clswXSk7Ci0JCQkJaWYgKCFwdHJbMV0pIHsKLQkJCQkJdm9pY2Vfc2V0X2N2cF9oYW5kbGUodiwgZGF0YS0+c3JjX3BvcnQpOwotCQkJCQlwcl9kZWJ1Zygic3RhdHVzOiAlZCwgY3ZwaGRsPSVkXG4iLAotCQkJCQkJIHB0clsxXSwgZGF0YS0+c3JjX3BvcnQpOwotCQkJCX0gZWxzZQotCQkJCQlwcl9lcnIoImdvdCBOQUNLIGZyb20gQ1ZQIGNyZWF0ZSBzZXNzaW9uIHJlc3BvbnNlXG4iKTsKLQkJCQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOwotCQkJCXdha2VfdXAoJnYtPmN2cF93YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9TRVRfREVWSUNFX1YyOgotCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX1NFVF9ERVZJQ0VfVjM6Ci0JCQljYXNlIFZTU19JVk9MVU1FX0NNRF9TRVRfU1RFUDoKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9FTkFCTEU6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfRElTQUJMRToKLQkJCWNhc2UgQVBSVjJfSUJBU0lDX0NNRF9ERVNUUk9ZX1NFU1NJT046Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEE6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9WT0xfQ0FMSUJSQVRJT05fREFUQToKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyOgotCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfQ0FMSUJSQVRJT05fREFUQToKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9EWU5BTUlDX0NBTElCUkFUSU9OX0RBVEE6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9EWU5BTUlDX0NBTElCUkFUSU9OX0RBVEE6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEE6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfREVSRUdJU1RFUl9TVEFUSUNfQ0FMSUJSQVRJT05fREFUQToKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9ERVZJQ0VfQ09ORklHOgotCQkJY2FzZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfREVWSUNFX0NPTkZJRzoKLQkJCWNhc2UgVlNTX0lDT01NT05fQ01EX01BUF9NRU1PUlk6Ci0JCQljYXNlIFZTU19JQ09NTU9OX0NNRF9VTk1BUF9NRU1PUlk6Ci0JCQljYXNlIFZTU19JVk9MVU1FX0NNRF9NVVRFX1YyOgotCQkJY2FzZSBWU1NfSVZQQ01fQ01EX1NUQVJUX1YyOgotCQkJY2FzZSBWU1NfSVZQQ01fQ01EX1NUT1A6Ci0JCQljYXNlIFZTU19JVk9DUFJPQ19DTURfVE9QT0xPR1lfU0VUX0RFVl9DSEFOTkVMUzoKLQkJCWNhc2UgVlNTX0lWT0NQUk9DX0NNRF9UT1BPTE9HWV9DT01NSVQ6Ci0JCQkJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOwotCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKLQkJCQl3YWtlX3VwKCZ2LT5jdnBfd2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZTU19JVlBDTV9FVlRfUFVTSF9CVUZGRVJfVjI6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjI6Ci0JCQkJc3dpdGNoIChkYXRhLT50b2tlbikgewotCQkJCWNhc2UgVk9DX1NFVF9NRURJQV9GT1JNQVRfUEFSQU1fVE9LRU46Ci0JCQkJY2FzZSBWT0NfR0VORVJJQ19TRVRfUEFSQU1fVE9LRU46Ci0JCQkJCXByX2RlYnVnKCIlczogVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMiBjYWxsZWRcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOwotCQkJCQl3YWtlX3VwKCZ2LT5jdnBfd2FpdCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVk9DX1JUQUNfU0VUX1BBUkFNX1RPS0VOOgotCQkJCQlwcl9kZWJ1ZygiJXM6IFZTU19JQ09NTU9OX0NNRF9TRVRfUEFSQU1fVjIgY2FsbGVkIGJ5IHJ0YWNcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCXJ0YWNfbWFrZV92b2ljZV9jYWxsYmFjaygKLQkJCQkJCVJUQUNfQ1ZQLCBwdHIsCi0JCQkJCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwcl9kZWJ1ZygiJXM6IGludmFsaWQgdG9rZW4gZm9yIGNvbW1hbmQgVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMjogJWRcbiIsCi0JCQkJCQlfX2Z1bmNfXywgZGF0YS0+dG9rZW4pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZTU19JQ09NTU9OX0NNRF9HRVRfUEFSQU1fVjI6Ci0JCQkJcHJfZGVidWcoIiVzOiBWU1NfSUNPTU1PTl9DTURfR0VUX1BBUkFNX1YyXG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJCS8qIFNob3VsZCBvbmx5IGNvbWUgaGVyZSBpZiB0aGVyZSBpcyBhbiBBUFIgKi8KLQkJCQkvKiBlcnJvciBvciBtYWxmb3JtZWQgQVBSIHBhY2tldC4gT3RoZXJ3aXNlICovCi0JCQkJLyogcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZCBhcyAqLwotCQkJCS8qIFZTU19JQ09NTU9OX1JTUF9HRVRfUEFSQU0gKi8KLQkJCQlpZiAocHRyWzFdICE9IDApIHsKLQkJCQkJcHJfZXJyKCIlczogQ1ZQIGdldCBwYXJhbSBlcnJvciA9ICVkLCByZXN1bWluZ1xuIiwKLQkJCQkJCV9fZnVuY19fLCBwdHJbMV0pOwotCQkJCQlydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2soUlRBQ19DVlAsCi0JCQkJCQlkYXRhLT5wYXlsb2FkLAotCQkJCQkJZGF0YS0+cGF5bG9hZF9zaXplKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZTU19JU09VTkRGT0NVU19DTURfU0VUX1NFQ1RPUlM6Ci0JCQkJaWYgKCFwdHJbMV0pCi0JCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPQotCQkJCQkJCQkJdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPQotCQkJCQkJCQkJZmFsc2U7Ci0JCQkJdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19TVUNDRVNTOwotCQkJCXYtPmFzeW5jX2VyciA9IHB0clsxXTsKLQkJCQl3YWtlX3VwKCZ2LT5jdnBfd2FpdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZTU19JU09VTkRGT0NVU19DTURfR0VUX1NFQ1RPUlM6Ci0JCQkJLyoKLQkJCQkgKiBTaG91bGQgb25seSBjb21lIGhlcmUgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLQkJCQkgKiByZXNwb25zZSByZWNlaXZlZCBmcm9tIEFEU1AuIE90aGVyd2lzZQotCQkJCSAqIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMKLQkJCQkgKiBWU1NfSVNPVU5ERk9DVVNfUlNQX0dFVF9TRUNUT1JTCi0JCQkJICovCi0JCQkJcHJfZXJyKCIlczogVlNTX0lTT1VOREZPQ1VTX0NNRF9HRVRfU0VDVE9SUyBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJCWNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MgPSBmYWxzZTsKLQkJCQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJdi0+YXN5bmNfZXJyID0gcHRyWzFdOwotCQkJCXdha2VfdXAoJnYtPmN2cF93YWl0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVlNTX0lTT1VSQ0VUUkFDS19DTURfR0VUX0FDVElWSVRZOgotCQkJCWlmICghcHRyWzFdKSB7Ci0JCQkJCS8qIFJlYWQgZGF0YSBmcm9tIHNoYXJlZCBtZW1vcnkgKi8KLQkJCQkJbWVtY3B5KCZjb21tb24uc291cmNlVHJhY2tpbmdSZXNwb25zZSwKLQkJCQkJICAgICAgIGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLgotCQkJCQkJCXNoX21lbV9ibG9jay5kYXRhLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkgdnNzX2lzb3VyY2V0cmFja19hY3Rpdml0eV9kYXRhX3QpKTsKLQkJCQkJY29tbW9uLmlzX3NvdXJjZV90cmFja2luZ19yZXNwX3N1Y2Nlc3MgPQotCQkJCQkJCQkJdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQljb21tb24uaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzcyA9Ci0JCQkJCQkJCQlmYWxzZTsKLQkJCQkJcHJfZXJyKCIlczogRXJyb3IgcmVjZWl2ZWQgZm9yIHNvdXJjZSB0cmFja2luZyBwYXJhbXNcbiIsCi0JCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJfQotCQkJCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJCQl2LT5hc3luY19lcnIgPSBwdHJbMV07Ci0JCQkJd2FrZV91cCgmdi0+Y3ZwX3dhaXQpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcl9kZWJ1ZygiJXM6IG5vdCBtYXRjaCBjbWQgPSAweCV4XG4iLAotCQkJCQkgIF9fZnVuY19fLCBwdHJbMF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lDT01NT05fUlNQX0dFVF9QQVJBTSkgewotCQlwcl9kZWJ1ZygiJXM6IFZTU19JQ09NTU9OX1JTUF9HRVRfUEFSQU1cbiIsIF9fZnVuY19fKTsKLQkJcHRyID0gZGF0YS0+cGF5bG9hZDsKLQkJaWYgKHB0clswXSAhPSAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBWU1NfSUNPTU1PTl9SU1BfR0VUX1BBUkFNIHJldHVybmVkIGVycm9yID0gMHgleFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgcHRyWzBdKTsKLQkJfQotCQlydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2soUlRBQ19DVlAsIGRhdGEtPnBheWxvYWQsCi0JCQlkYXRhLT5wYXlsb2FkX3NpemUpOwotCX0gZWxzZSBpZiAoZGF0YS0+b3Bjb2RlID09IFZTU19JVlBDTV9FVlRfTk9USUZZX1YyKSB7Ci0JCWlmICgoZGF0YS0+cGF5bG9hZCAhPSBOVUxMKSAmJiBkYXRhLT5wYXlsb2FkX3NpemUgPT0KLQkJICAgIHNpemVvZihzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9ub3RpZnlfdjJfdCkgJiYKLQkJICAgIGNvbW1vbi5ob3N0cGNtX2luZm8uaG9zdHBjbV9ldnRfY2IgIT0gTlVMTCkgewotCQkJY29tbW9uLmhvc3RwY21faW5mby5ob3N0cGNtX2V2dF9jYihkYXRhLT5wYXlsb2FkLAotCQkJCQl2b2NfZ2V0X3Nlc3Npb25fbmFtZSh2LT5zZXNzaW9uX2lkKSwKLQkJCQkJY29tbW9uLmhvc3RwY21faW5mby5wcml2YXRlX2RhdGEpOwotCQl9Ci0JfSBlbHNlIGlmIChkYXRhLT5vcGNvZGUgPT0gVlNTX0lTT1VOREZPQ1VTX1JTUF9HRVRfU0VDVE9SUykgewotCQlpZiAoZGF0YS0+cGF5bG9hZCAmJiAoZGF0YS0+cGF5bG9hZF9zaXplID09Ci0JCQlzaXplb2Yoc3RydWN0IHZzc19pc291bmRmb2N1c19yc3BfZ2V0X3NlY3RvcnNfdCkpKSB7Ci0JCQljb21tb24uaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzID0gdHJ1ZTsKLQkJCW1lbWNweSgmY29tbW9uLnNvdW5kRm9jdXNSZXNwb25zZSwKLQkJCSAgICAgICAoc3RydWN0IHZzc19pc291bmRmb2N1c19yc3BfZ2V0X3NlY3RvcnNfdCAqKQotCQkJICAgICAgIGRhdGEtPnBheWxvYWQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkgdnNzX2lzb3VuZGZvY3VzX3JzcF9nZXRfc2VjdG9yc190KSk7Ci0JCX0gZWxzZSB7Ci0JCQljb21tb24uaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzID0gZmFsc2U7Ci0JCQlwcl9kZWJ1ZygiJXM6IEludmFsaWQgcGF5bG9hZCByZWNlaXZlZCBmcm9tIENWRFxuIiwKLQkJCQkgX19mdW5jX18pOwotCQl9Ci0JCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfU1VDQ0VTUzsKLQkJd2FrZV91cCgmdi0+Y3ZwX3dhaXQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9mcmVlX29vYl9zaGFyZWRfbWVtKHZvaWQpCi17Ci0JaW50IHJjID0gMDsKLQlpbnQgY250ID0gMDsKLQlpbnQgYnVmY250ID0gTlVNX09GX0JVRkZFUlM7Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbigKLQkJCQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBtc21fYXVkaW9faW9uX2ZyZWUodi0+c2htZW1faW5mby5zaF9idWYuY2xpZW50LAotCQkJCXYtPnNobWVtX2luZm8uc2hfYnVmLmhhbmRsZSk7Ci0Jdi0+c2htZW1faW5mby5zaF9idWYuY2xpZW50ID0gTlVMTDsKLQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5oYW5kbGUgPSBOVUxMOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3I6JWQgZnJlZWluZyBtZW1vcnlcbiIsIF9fZnVuY19fLCByYyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCi0Jd2hpbGUgKGNudCA8IGJ1ZmNudCkgewotCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbY250XS5kYXRhID0gIE5VTEw7Ci0JCXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZltjbnRdLnBoeXMgPSAgMDsKLQkJY250Kys7Ci0JfQotCi0Jdi0+c2htZW1faW5mby5zaF9idWYuY2xpZW50ID0gTlVMTDsKLQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5oYW5kbGUgPSBOVUxMOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfb29iX3NoYXJlZF9tZW0odm9pZCkKLXsKLQlpbnQgY250ID0gMDsKLQlpbnQgcmMgPSAwOwotCXNpemVfdCBsZW47Ci0Jdm9pZCAqbWVtX2FkZHI7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCWludCBidWZzeiA9IEJVRkZFUl9CTE9DS19TSVpFOwotCWludCBidWZjbnQgPSBOVU1fT0ZfQlVGRkVSUzsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKAotCQkJCWNvbW1vbi52b2ljZVtWT0NfUEFUSF9GVUxMXS5zZXNzaW9uX2lkKTsKLQotCW11dGV4X2xvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYyA9IG1zbV9hdWRpb19pb25fYWxsb2MoInZvaXBfY2xpZW50IiwgJih2LT5zaG1lbV9pbmZvLnNoX2J1Zi5jbGllbnQpLAotCQkJJih2LT5zaG1lbV9pbmZvLnNoX2J1Zi5oYW5kbGUpLAotCQkJYnVmc3oqYnVmY250LAotCQkJJnBoeXMsICZsZW4sCi0JCQkmbWVtX2FkZHIpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGFsbG9jIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCXdoaWxlIChjbnQgPCBidWZjbnQpIHsKLQkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmW2NudF0uZGF0YSA9ICBtZW1fYWRkciAgKyAoY250ICogYnVmc3opOwotCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbY250XS5waHlzID0gIHBoeXMgKyAoY250ICogYnVmc3opOwotCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbY250XS5zaXplID0gYnVmc3o7Ci0JCWNudCsrOwotCX0KLQotCXByX2RlYnVnKCIlcyBidWZbMF0uZGF0YTpbJXBLXSwgYnVmWzBdLnBoeXM6WyVwS10sICZidWZbMF0ucGh5czpbJXBLXSxcbiIsCi0JCSBfX2Z1bmNfXywKLQkJKHZvaWQgKil2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0uZGF0YSwKLQkJJnYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlswXS5waHlzLAotCQkodm9pZCAqKSZ2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0ucGh5cyk7Ci0JcHJfZGVidWcoIiVzOiBidWZbMV0uZGF0YTpbJXBLXSwgYnVmWzFdLnBoeXNbJXBLXSwgJmJ1ZlsxXS5waHlzWyVwS11cbiIsCi0JCV9fZnVuY19fLAotCQkodm9pZCAqKXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlsxXS5kYXRhLAotCQkmdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzFdLnBoeXMsCi0JCSh2b2lkICopJnYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlsxXS5waHlzKTsKLQotCW1lbXNldCgodm9pZCAqKXYtPnNobWVtX2luZm8uc2hfYnVmLmJ1ZlswXS5kYXRhLCAwLCAoYnVmc3ogKiBidWZjbnQpKTsKLQotZG9uZToKLQltdXRleF91bmxvY2soJmNvbW1vbi5jb21tb25fbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2FsbG9jX29vYl9tZW1fdGFibGUodm9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXNpemVfdCBsZW47Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbigKLQkJCQljb21tb24udm9pY2VbVk9DX1BBVEhfRlVMTF0uc2Vzc2lvbl9pZCk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmMgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ2b2lwX2NsaWVudCIsICYodi0+c2htZW1faW5mby5tZW10YmwuY2xpZW50KSwKLQkJCQkmKHYtPnNobWVtX2luZm8ubWVtdGJsLmhhbmRsZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KSwKLQkJCQkmdi0+c2htZW1faW5mby5tZW10YmwucGh5cywKLQkJCQkmbGVuLAotCQkJCSYodi0+c2htZW1faW5mby5tZW10YmwuZGF0YSkpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGFsbG9jIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByYyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCXYtPnNobWVtX2luZm8ubWVtdGJsLnNpemUgPSBzaXplb2Yoc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX3QpOwotCXByX2RlYnVnKCIlcyBkYXRhWyVwS11waHlzWyVwS11bJXBLXVxuIiwgX19mdW5jX18sCi0JCSAodm9pZCAqKXYtPnNobWVtX2luZm8ubWVtdGJsLmRhdGEsCi0JCSAmdi0+c2htZW1faW5mby5tZW10YmwucGh5cywKLQkJICh2b2lkICopJnYtPnNobWVtX2luZm8ubWVtdGJsLnBoeXMpOwotCi1kb25lOgotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWludCB2b2Nfc2VuZF9jdnBfc3RhcnRfdm9jcGNtKHVpbnQzMl90IHNlc3Npb25faWQsCi0JCQkgICAgICBzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCAqdnBjbV90cCwKLQkJCSAgICAgIHVpbnQzMl90IG5vX29mX3RwKQotewotCXN0cnVjdCBjdnBfc3RhcnRfY21kIGN2cF9zdGFydF9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCWludCBpID0gMDsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCi0JaWYgKCFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQotCS8qIEZpbGwgdGhlIGhlYWRlciAqLwotCWN2cF9zdGFydF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQljdnBfc3RhcnRfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCXNpemVvZihzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCkgKiBub19vZl90cCkgKwotCQlzaXplb2YoY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC5udW1fdGFwX3BvaW50cykgKwotCQlzaXplb2YoY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC5tZW1faGFuZGxlKTsKLQljdnBfc3RhcnRfY21kLmhkci5zcmNfcG9ydCA9IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3N0YXJ0X2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKLQljdnBfc3RhcnRfY21kLmhkci50b2tlbiA9IDA7Ci0JY3ZwX3N0YXJ0X2NtZC5oZHIub3Bjb2RlID0gVlNTX0lWUENNX0NNRF9TVEFSVF9WMjsKLQotCWZvciAoaSA9IDA7IGkgPCBub19vZl90cDsgaSsrKSB7Ci0JCWN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQudGFwX3BvaW50c1tpXS50YXBfcG9pbnQgPQotCQkJCQkJCXZwY21fdHBbaV0udGFwX3BvaW50OwotCQljdnBfc3RhcnRfY21kLnZwY21fc3RhcnRfY21kLnRhcF9wb2ludHNbaV0uZGlyZWN0aW9uID0KLQkJCQkJCQl2cGNtX3RwW2ldLmRpcmVjdGlvbjsKLQkJY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC50YXBfcG9pbnRzW2ldLnNhbXBsaW5nX3JhdGUgPQotCQkJCQkJICAgIHZwY21fdHBbaV0uc2FtcGxpbmdfcmF0ZTsKLQkJY3ZwX3N0YXJ0X2NtZC52cGNtX3N0YXJ0X2NtZC50YXBfcG9pbnRzW2ldLmR1cmF0aW9uID0gMDsKLQl9Ci0KLQljdnBfc3RhcnRfY21kLnZwY21fc3RhcnRfY21kLm1lbV9oYW5kbGUgPQotCQkJCWNvbW1vbi52b2ljZV9ob3N0X3BjbV9tZW1faGFuZGxlOwotCWN2cF9zdGFydF9jbWQudnBjbV9zdGFydF9jbWQubnVtX3RhcF9wb2ludHMgPSBub19vZl90cDsKLQotCXYtPmN2cF9zdGF0ZSA9IENNRF9TVEFUVVNfRkFJTDsKLQl2LT5hc3luY19lcnIgPSAwOwotCXJldCA9IGFwcl9zZW5kX3BrdChhcHJfY3ZwLCAodWludDMyX3QgKikgJmN2cF9zdGFydF9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEZhaWw6IHNlbmRpbmcgdm9jcGNtIG1hcCBtZW1vcnksXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJKHYtPmN2cF9zdGF0ZSA9PSBDTURfU1RBVFVTX1NVQ0NFU1MpLAotCQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHYtPmFzeW5jX2VyciA+IDApIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yWyVzXVxuIiwKLQkJCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoCi0JCQkJdi0+YXN5bmNfZXJyKSk7Ci0JCXJldCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJdi0+YXN5bmNfZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgdm9jX3NlbmRfY3ZwX3N0b3Bfdm9jcGNtKHVpbnQzMl90IHNlc3Npb25faWQpCi17Ci0Jc3RydWN0IGN2cF9jb21tYW5kIHZwY21fc3RvcF9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiA9IHZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0KLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JLyogZmlsbCBpbiB0aGUgaGVhZGVyICovCi0JdnBjbV9zdG9wX2NtZC5oZHIuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCXZwY21fc3RvcF9jbWQuaGRyLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJCSBzaXplb2YodnBjbV9zdG9wX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXZwY21fc3RvcF9jbWQuaGRyLnNyY19wb3J0ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQl2cGNtX3N0b3BfY21kLmhkci5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOwotCXZwY21fc3RvcF9jbWQuaGRyLnRva2VuID0gMDsKLQl2cGNtX3N0b3BfY21kLmhkci5vcGNvZGUgPSBWU1NfSVZQQ01fQ01EX1NUT1A7Ci0KLQl2LT5jdnBfc3RhdGUgPSBDTURfU1RBVFVTX0ZBSUw7Ci0Jdi0+YXN5bmNfZXJyID0gMDsKLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopICZ2cGNtX3N0b3BfY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIkZhaWw6IHNlbmRpbmcgdm9jcGNtIHN0b3AsXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgewotCQlwcl9lcnIoIiVzOiB3YWl0X2V2ZW50IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZW5kX2N2cF9tYXBfdm9jcGNtX21lbW9yeSh1aW50MzJfdCBzZXNzaW9uX2lkLAotCQkJCSAgIHN0cnVjdCBtZW1fbWFwX3RhYmxlICp0cF9tZW1fdGFibGUsCi0JCQkJICAgcGh5c19hZGRyX3QgcGFkZHIsIHVpbnQzMl90IGJ1ZnNpemUpCi17Ci0JcmV0dXJuICB2b2ljZV9tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCh2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKSwKLQkJCQkJICAgICAgdHBfbWVtX3RhYmxlLAotCQkJCQkgICAgICAoZG1hX2FkZHJfdCkgcGFkZHIsIGJ1ZnNpemUsCi0JCQkJCSAgICAgIFZPQ19WT0lDRV9IT1NUX1BDTV9NQVBfVE9LRU4pOwotfQotCi1pbnQgdm9jX3NlbmRfY3ZwX3VubWFwX3ZvY3BjbV9tZW1vcnkodWludDMyX3Qgc2Vzc2lvbl9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9ICB2b2ljZV9zZW5kX212bV91bm1hcF9tZW1vcnlfcGh5c2ljYWxfY21kKAotCQkJCXZvaWNlX2dldF9zZXNzaW9uKHNlc3Npb25faWQpLAotCQkJCWNvbW1vbi52b2ljZV9ob3N0X3BjbV9tZW1faGFuZGxlKTsKLQotCWlmIChyZXQgPT0gMCkKLQkJY29tbW9uLnZvaWNlX2hvc3RfcGNtX21lbV9oYW5kbGUgPSAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZW5kX2N2cF92b2NwY21fcHVzaF9idWZfZXZ0KHVpbnQzMl90IHNlc3Npb25faWQsCi0JCQlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9wdXNoX2J1ZmZlcl92Ml90ICpwdXNoX2J1ZmZfZXZ0KQotewotCXN0cnVjdCBjdnBfcHVzaF9idWZfY21kIHZwY21fcHVzaF9idWZfY21kOwotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihzZXNzaW9uX2lkKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JYXByX2N2cCA9IGNvbW1vbi5hcHJfcTZfY3ZwOwotCi0JaWYgKCFhcHJfY3ZwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9jdnAgaXMgTlVMTC5cbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCW1lbXNldCgmdnBjbV9wdXNoX2J1Zl9jbWQsIDAsIHNpemVvZih2cGNtX3B1c2hfYnVmX2NtZCkpOwotCWN2cF9oYW5kbGUgPSB2b2ljZV9nZXRfY3ZwX2hhbmRsZSh2KTsKLQotCS8qIGZpbGwgaW4gdGhlIGhlYWRlciAqLwotCXZwY21fcHVzaF9idWZfY21kLmhkci5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQkJCUFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksIEFQUl9QS1RfVkVSKTsKLQl2cGNtX3B1c2hfYnVmX2NtZC5oZHIucGt0X3NpemUgPSBBUFJfUEtUX1NJWkUoQVBSX0hEUl9TSVpFLAotCQkJCXNpemVvZih2cGNtX3B1c2hfYnVmX2NtZCkgLSBBUFJfSERSX1NJWkUpOwotCXZwY21fcHVzaF9idWZfY21kLmhkci5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQl2cGNtX3B1c2hfYnVmX2NtZC5oZHIuZGVzdF9wb3J0ID0gY3ZwX2hhbmRsZTsKLQl2cGNtX3B1c2hfYnVmX2NtZC5oZHIudG9rZW4gPSAwOwotCXZwY21fcHVzaF9idWZfY21kLmhkci5vcGNvZGUgPSBWU1NfSVZQQ01fRVZUX1BVU0hfQlVGRkVSX1YyOwotCi0JdnBjbV9wdXNoX2J1Zl9jbWQudnBjbV9ldnRfcHVzaF9idWZmZXIudGFwX3BvaW50ID0KLQkJCQkJcHVzaF9idWZmX2V2dC0+dGFwX3BvaW50OwotCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLnB1c2hfYnVmX21hc2sgPQotCQkJCQlwdXNoX2J1ZmZfZXZ0LT5wdXNoX2J1Zl9tYXNrOwotCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLm91dF9idWZfbWVtX2FkZHJlc3MgPQotCQkJCQlwdXNoX2J1ZmZfZXZ0LT5vdXRfYnVmX21lbV9hZGRyZXNzOwotCXZwY21fcHVzaF9idWZfY21kLnZwY21fZXZ0X3B1c2hfYnVmZmVyLmluX2J1Zl9tZW1fYWRkcmVzcyA9Ci0JCQkJCXB1c2hfYnVmZl9ldnQtPmluX2J1Zl9tZW1fYWRkcmVzczsKLQl2cGNtX3B1c2hfYnVmX2NtZC52cGNtX2V2dF9wdXNoX2J1ZmZlci5vdXRfYnVmX21lbV9zaXplID0KLQkJCQkJcHVzaF9idWZmX2V2dC0+b3V0X2J1Zl9tZW1fc2l6ZTsKLQl2cGNtX3B1c2hfYnVmX2NtZC52cGNtX2V2dF9wdXNoX2J1ZmZlci5pbl9idWZfbWVtX3NpemUgPQotCQkJCQlwdXNoX2J1ZmZfZXZ0LT5pbl9idWZfbWVtX3NpemU7Ci0JdnBjbV9wdXNoX2J1Zl9jbWQudnBjbV9ldnRfcHVzaF9idWZmZXIuc2FtcGxpbmdfcmF0ZSA9Ci0JCQkJCXB1c2hfYnVmZl9ldnQtPnNhbXBsaW5nX3JhdGU7Ci0JdnBjbV9wdXNoX2J1Zl9jbWQudnBjbV9ldnRfcHVzaF9idWZmZXIubnVtX2luX2NoYW5uZWxzID0KLQkJCQkJcHVzaF9idWZmX2V2dC0+bnVtX2luX2NoYW5uZWxzOwotCi0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSAmdnBjbV9wdXNoX2J1Zl9jbWQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiRmFpbDogc2VuZGluZyB2b2NwY20gbWFwIG1lbW9yeSxcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgdm9jX3JlZ2lzdGVyX2hwY21fZXZ0X2NiKGhvc3RwY21fY2JfZm4gaG9zdHBjbV9jYiwKLQkJCSAgICAgIHZvaWQgKnByaXZhdGVfZGF0YSkKLXsKLQljb21tb24uaG9zdHBjbV9pbmZvLmhvc3RwY21fZXZ0X2NiID0gaG9zdHBjbV9jYjsKLQljb21tb24uaG9zdHBjbV9pbmZvLnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKLX0KLQotdm9pZCB2b2NfZGVyZWdpc3Rlcl9ocGNtX2V2dF9jYih2b2lkKQotewotCWNvbW1vbi5ob3N0cGNtX2luZm8uaG9zdHBjbV9ldnRfY2IgPSBOVUxMOwotCWNvbW1vbi5ob3N0cGNtX2luZm8ucHJpdmF0ZV9kYXRhID0gTlVMTDsKLX0KLQotaW50IHZvY19nZXRfY3ZkX3ZlcnNpb24oY2hhciAqY3ZkX3ZlcnNpb24pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSB2b2ljZV9nZXRfc2Vzc2lvbihWT0lDRV9TRVNTSU9OX1ZTSUQpOwotCi0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvbl9pZCAweCV4XG4iLAotCQkgICAgICAgX19mdW5jX18sIFZPSUNFX1NFU1NJT05fVlNJRCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChpc19jdmRfdmVyc2lvbl9xdWVyaWVkKCkpIHsKLQkJcHJfZGVidWcoIiVzOiBSZXR1cm5pbmcgdGhlIGNhY2hlZCB2YWx1ZSAlc1xuIiwKLQkJCSBfX2Z1bmNfXywgY29tbW9uLmN2ZF92ZXJzaW9uKTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogUmVnaXN0ZXIgY2FsbGJhY2sgdG8gQVBSICovCi0JcmV0ID0gdm9pY2VfYXByX3JlZ2lzdGVyKFZPSUNFX1NFU1NJT05fVlNJRCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogYXByIHJlZ2lzdGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQlyZXQgPSB2b2ljZV9zZW5kX212bV9jdmRfdmVyc2lvbl9jbWQodik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogdm9pY2Vfc2VuZF9tdm1fY3ZkX3ZlcnNpb25fY21kIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmV0ID0gMDsKLQotdW5sb2NrOgotCW11dGV4X3VubG9jaygmdi0+bG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCi1kb25lOgotCWlmIChjdmRfdmVyc2lvbikKLQkJbWVtY3B5KGN2ZF92ZXJzaW9uLCBjb21tb24uY3ZkX3ZlcnNpb24sCi0JCSAgICAgICBDVkRfVkVSU0lPTl9TVFJJTkdfTUFYX1NJWkUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9hbGxvY19jYWxfbWVtX21hcF90YWJsZSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXNpemVfdCBsZW47Ci0KLQlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ2b2NfY2FsIiwKLQkJCQkmKGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5jbGllbnQpLAotCQkJCSYoY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLmhhbmRsZSksCi0JCQkJc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KSwKLQkJCQkmY29tbW9uLmNhbF9tZW1fbWFwX3RhYmxlLnBoeXMsCi0JCQkJJmxlbiwKLQkJCQkmKGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5kYXRhKSk7Ci0JaWYgKChyZXQgPCAwKSAmJiAocmV0ICE9IC1FUFJPQkVfREVGRVIpKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQsIHJjID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCWNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5zaXplID0gc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KTsKLQlwcl9kZWJ1ZygiJXM6IGRhdGEgJXBLIHBoeXMgJXBLXG4iLCBfX2Z1bmNfXywKLQkJIGNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5kYXRhLAotCQkgJmNvbW1vbi5jYWxfbWVtX21hcF90YWJsZS5waHlzKTsKLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2FsbG9jX3J0YWNfbWVtX21hcF90YWJsZSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXNpemVfdCBsZW47Ci0KLQlyZXQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJ2b2NfcnRhY19jYWwiLAotCQkJJihjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLmNsaWVudCksCi0JCQkmKGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuaGFuZGxlKSwKLQkJCXNpemVvZihzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfdCksCi0JCQkmY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5waHlzLAotCQkJJmxlbiwKLQkJCSYoY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5kYXRhKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGFsbG9jIGZhaWxlZCwgcmMgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY29tbW9uLnJ0YWNfbWVtX21hcF90YWJsZS5zaXplID0gc2l6ZW9mKHN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90KTsKLQlwcl9kZWJ1ZygiJXM6IGRhdGEgJXBLIHBoeXMgJXBLXG4iLCBfX2Z1bmNfXywKLQkJIGNvbW1vbi5ydGFjX21lbV9tYXBfdGFibGUuZGF0YSwKLQkJICZjb21tb24ucnRhY19tZW1fbWFwX3RhYmxlLnBoeXMpOwotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2NfYW5kX21hcF9vb2JfbWVtKHN0cnVjdCB2b2ljZV9kYXRhICp2KQotewotCWludCByZXQgPSAwOwotCi0JaWYgKHYgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWlzX3ZvaXBfbWVtb3J5X2FsbG9jYXRlZCgpKSB7Ci0JCXJldCA9IHZvY19hbGxvY192b2lwX3NoYXJlZF9tZW1vcnkoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBjcmVhdGUgdm9pcCBvb2IgbWVtb3J5ICVkXG4iLAotCQkJCSAgIF9fZnVuY19fLCByZXQpOwotCi0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB2b2ljZV9tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCh2LAotCQkJJnYtPnNobWVtX2luZm8ubWVtdGJsLAotCQkJdi0+c2htZW1faW5mby5zaF9idWYuYnVmWzBdLnBoeXMsCi0JCQl2LT5zaG1lbV9pbmZvLnNoX2J1Zi5idWZbMF0uc2l6ZSAqIE5VTV9PRl9CVUZGRVJTLAotCQkJVk9JUF9NRU1fTUFQX1RPS0VOKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IG12bV9tYXBfbWVtb3J5X3BoeSBmYWlsZWQgJWRcbiIsCi0JCQkgICBfX2Z1bmNfXywgcmV0KTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXVpbnQzMl90IHZvaWNlX2dldF90b3BvbG9neSh1aW50MzJfdCB0b3BvbG9neV9pZHgpCi17Ci0JdWludDMyX3QgdG9wb2xvZ3kgPSBWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfUlhfREVGQVVMVDsKLQlzdHJ1Y3QgY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayA9IE5VTEw7Ci0KLQkvKiBpbml0aWFsaXplIGFzIGRlZmF1bHQgdG9wb2xvZ3kgKi8KLQlpZiAodG9wb2xvZ3lfaWR4ID09IENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMKSB7Ci0JCXRvcG9sb2d5ID0gVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX1JYX0RFRkFVTFQ7Ci0JfSBlbHNlIGlmICh0b3BvbG9neV9pZHggPT0gQ1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUwpIHsKLQkJdG9wb2xvZ3kgPSBWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfVFhfU01fRUNOU19WMjsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBjYWwgaW5kZXggJXggaXMgaW52YWxpZCFcbiIsCi0JCQlfX2Z1bmNfXywgdG9wb2xvZ3lfaWR4KTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvbW1vbi5jYWxfZGF0YVt0b3BvbG9neV9pZHhdID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogY2FsIHR5cGUgaXMgTlVMTCBmb3IgY2FsIGluZGV4ICV4XG4iLAotCQkJX19mdW5jX18sIHRvcG9sb2d5X2lkeCk7Ci0KLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJmNvbW1vbi5jYWxfZGF0YVt0b3BvbG9neV9pZHhdLT5sb2NrKTsKLQljYWxfYmxvY2sgPSBjYWxfdXRpbHNfZ2V0X29ubHlfY2FsX2Jsb2NrKAotCQljb21tb24uY2FsX2RhdGFbdG9wb2xvZ3lfaWR4XSk7Ci0JaWYgKGNhbF9ibG9jayA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCIlczogY2FsX2Jsb2NrIG5vdCBmb3VuZCBmb3IgY2FsIGluZGV4ICV4XG4iLAotCQkJX19mdW5jX18sIHRvcG9sb2d5X2lkeCk7Ci0KLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JdG9wb2xvZ3kgPSAoKHN0cnVjdCBhdWRpb19jYWxfaW5mb192b2NfdG9wICopCi0JCWNhbF9ibG9jay0+Y2FsX2luZm8pLT50b3BvbG9neTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJmNvbW1vbi5jYWxfZGF0YVt0b3BvbG9neV9pZHhdLT5sb2NrKTsKLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBVc2luZyB0b3BvbG9neSAlZFxuIiwgX19mdW5jX18sIHRvcG9sb2d5KTsKLQotCXJldHVybiB0b3BvbG9neTsKLX0KLQotc3RhdGljIGludCBnZXRfY2FsX3R5cGVfaW5kZXgoaW50MzJfdCBjYWxfdHlwZSkKLXsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCXN3aXRjaCAoY2FsX3R5cGUpIHsKLQljYXNlIENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXJldCA9IENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMX1RZUEU6Ci0JCXJldCA9IENWUF9WT0NfVFhfVE9QT0xPR1lfQ0FMOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NQUk9DX1NUQVRJQ19DQUxfVFlQRToKLQkJcmV0ID0gQ1ZQX1ZPQ1BST0NfQ0FMOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NQUk9DX0RZTkFNSUNfQ0FMX1RZUEU6Ci0JCXJldCA9IENWUF9WT0NWT0xfQ0FMOwotCQlicmVhazsKLQljYXNlIENWU19WT0NTVFJNX1NUQVRJQ19DQUxfVFlQRToKLQkJcmV0ID0gQ1ZTX1ZPQ1NUUk1fQ0FMOwotCQlicmVhazsKLQljYXNlIENWUF9WT0NERVZfQ0ZHX0NBTF9UWVBFOgotCQlyZXQgPSBDVlBfVk9DREVWX0NGR19DQUw7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZQX1ZPQ1BST0NfU1RBVElDX0NPTF9DQUxfVFlQRToKLQkJcmV0ID0gQ1ZQX1ZPQ1BST0NfQ09MX0NBTDsKLQkJYnJlYWs7Ci0JY2FzZSBDVlBfVk9DUFJPQ19EWU5BTUlDX0NPTF9DQUxfVFlQRToKLQkJcmV0ID0gQ1ZQX1ZPQ1ZPTF9DT0xfQ0FMOwotCQlicmVhazsKLQljYXNlIENWU19WT0NTVFJNX1NUQVRJQ19DT0xfQ0FMX1RZUEU6Ci0JCXJldCA9IENWU19WT0NTVFJNX0NPTF9DQUw7Ci0JCWJyZWFrOwotCWNhc2UgVk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFOgotCQlyZXQgPSBWT0lDRV9SVEFDX0lORk9fQ0FMOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1JUQUNfQVBSX0NBTF9UWVBFOgotCQlyZXQgPSBWT0lDRV9SVEFDX0FQUl9DQUw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IEludmFsaWQgY2FsIHR5cGUgJWQhXG4iLCBfX2Z1bmNfXywgY2FsX3R5cGUpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3ByZXBhcmVfdm9sdW1lX2Jvb3N0KGludDMyX3QgY2FsX3R5cGUsCi0JCQkJCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHZvY19kZXJlZ2lzdGVyX3ZvY3Byb2Nfdm9sX3RhYmxlKCk7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfZW5hYmxlX3ZvbHVtZV9ib29zdChpbnQzMl90IGNhbF90eXBlLAotCQkJCXNpemVfdCBkYXRhX3NpemUsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHZvY19yZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSgpOwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2FsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLAotCQkJICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2FsX2luZGV4OwotCWludCBjYWxfdmVyc2lvbjsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JY2FsX3ZlcnNpb24gPSBjYWxfdXRpbHNfZ2V0X2NhbF90eXBlX3ZlcnNpb24oZGF0YSk7Ci0JY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkID0KLQkJCSEhKGNhbF92ZXJzaW9uICYgUEVSX1ZPQ09ERVJfQ0FMX0JJVF9NQVNLKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSBjYWxfdXRpbHNfYWxsb2NfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IENhbF91dGlsc19hbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB2b2ljZV9kZWFsbG9jX2NhbChpbnQzMl90IGNhbF90eXBlLAotCQkJICAgICBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19kZWFsbG9jX2NhbChkYXRhX3NpemUsIGRhdGEsCi0JCWNvbW1vbi5jYWxfZGF0YVtjYWxfaW5kZXhdKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBDYWxfdXRpbHNfZGVhbGxvY19ibG9jayBmYWlsZWQsIHJldCA9ICVkLCBjYWwgdHlwZSA9ICVkIVxuIiwKLQkJCV9fZnVuY19fLCByZXQsIGNhbF90eXBlKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX3NldF9jYWwoaW50MzJfdCBjYWxfdHlwZSwKLQkJCSBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQotewotCWludCByZXQgPSAwOwotCWludCBjYWxfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWNhbF9pbmRleCA9IGdldF9jYWxfdHlwZV9pbmRleChjYWxfdHlwZSk7Ci0JaWYgKGNhbF9pbmRleCA8IDApIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGdldCBjYWwgaW5kZXggJWQhXG4iLAotCQkJX19mdW5jX18sIGNhbF9pbmRleCk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJldCA9IGNhbF91dGlsc19zZXRfY2FsKGRhdGFfc2l6ZSwgZGF0YSwKLQkJY29tbW9uLmNhbF9kYXRhW2NhbF9pbmRleF0sIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IENhbF91dGlsc19zZXRfY2FsIGZhaWxlZCwgcmV0ID0gJWQsIGNhbCB0eXBlID0gJWQhXG4iLAotCQkJX19mdW5jX18sIHJldCwgY2FsX3R5cGUpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHZvaWNlX2RlbGV0ZV9jYWxfZGF0YSh2b2lkKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JY2FsX3V0aWxzX2Rlc3Ryb3lfY2FsX3R5cGVzKE1BWF9WT0lDRV9DQUxfVFlQRVMsIGNvbW1vbi5jYWxfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfaW5pdF9jYWxfZGF0YSh2b2lkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBjYWxfdHlwZV9pbmZvIGNhbF90eXBlX2luZm9bXSA9IHsKLQkJe3tDVlBfVk9DX1JYX1RPUE9MT0dZX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwgdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7Q1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUxfVFlQRSwKLQkJe05VTEwsIE5VTEwsIE5VTEwsIHZvaWNlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCBOVUxMLCBjYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0NWUF9WT0NQUk9DX1NUQVRJQ19DQUxfVFlQRSwKLQkJe3ZvaWNlX2FsbG9jX2NhbCwgdm9pY2VfZGVhbGxvY19jYWwsIE5VTEwsCi0JCXZvaWNlX3NldF9jYWwsIE5VTEwsIE5VTEx9IH0sCi0JCXtOVUxMLCB2b2ljZV91bm1hcF9jYWxfbWVtb3J5LAotCQljYWxfdXRpbHNfbWF0Y2hfYnVmX251bX0gfSwKLQotCQl7e0NWUF9WT0NQUk9DX0RZTkFNSUNfQ0FMX1RZUEUsCi0JCXt2b2ljZV9hbGxvY19jYWwsIHZvaWNlX2RlYWxsb2NfY2FsLAotCQl2b2ljZV9wcmVwYXJlX3ZvbHVtZV9ib29zdCwKLQkJdm9pY2Vfc2V0X2NhbCwgTlVMTCwKLQkJdm9pY2VfZW5hYmxlX3ZvbHVtZV9ib29zdH0gfSwKLQkJe05VTEwsIHZvaWNlX3VubWFwX2NhbF9tZW1vcnksCi0JCWNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7Q1ZQX1ZPQ0RFVl9DRkdfQ0FMX1RZUEUsCi0JCXt2b2ljZV9hbGxvY19jYWwsIHZvaWNlX2RlYWxsb2NfY2FsLCBOVUxMLAotCQl2b2ljZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgdm9pY2VfdW5tYXBfY2FsX21lbW9yeSwKLQkJY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tDVlBfVk9DUFJPQ19TVEFUSUNfQ09MX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwgdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7Q1ZQX1ZPQ1BST0NfRFlOQU1JQ19DT0xfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCB2b2ljZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tDVlNfVk9DU1RSTV9TVEFUSUNfQ0FMX1RZUEUsCi0JCXt2b2ljZV9hbGxvY19jYWwsIHZvaWNlX2RlYWxsb2NfY2FsLCBOVUxMLAotCQl2b2ljZV9zZXRfY2FsLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgdm9pY2VfdW5tYXBfY2FsX21lbW9yeSwKLQkJY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0KLQkJe3tDVlNfVk9DU1RSTV9TVEFUSUNfQ09MX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwgdm9pY2Vfc2V0X2NhbCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7Vk9JQ0VfUlRBQ19JTkZPX0NBTF9UWVBFLAotCQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gfSwKLQkJe05VTEwsIE5VTEwsIGNhbF91dGlsc19tYXRjaF9idWZfbnVtfSB9LAotCi0JCXt7Vk9JQ0VfUlRBQ19BUFJfQ0FMX1RZUEUsCi0JCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSB9LAotCQl7TlVMTCwgTlVMTCwgY2FsX3V0aWxzX21hdGNoX2J1Zl9udW19IH0sCi0JfTsKLQotCXJldCA9IGNhbF91dGlsc19jcmVhdGVfY2FsX3R5cGVzKE1BWF9WT0lDRV9DQUxfVFlQRVMsIGNvbW1vbi5jYWxfZGF0YSwKLQkJY2FsX3R5cGVfaW5mbyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNyZWF0ZSBjYWwgdHlwZSFcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIHJldDsKLWVycjoKLQl2b2ljZV9kZWxldGVfY2FsX2RhdGEoKTsKLQltZW1zZXQoJmNvbW1vbiwgMCwgc2l6ZW9mKHN0cnVjdCBjb21tb25fZGF0YSkpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9zZXRfc291bmRfZm9jdXNfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJCSBzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRGb2N1c0RhdGEpCi17Ci0Jc3RydWN0IGN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kX3QgY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQlpbnQgaTsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWlmICh2ID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0KLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JLyogc2VuZCBTb3VuZCBGb2N1cyBQYXJhbXMgdG8gY3ZwICovCi0JY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyLmhkcl9maWVsZCA9Ci0JCQkJQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJCQkJICAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICAgQVBSX1BLVF9WRVIpOwotCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQlzaXplb2YoY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5oZHIuc3JjX3BvcnQgPQotCQkJCXZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odi0+c2Vzc2lvbl9pZCk7Ci0JY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0JY3ZwX3NldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQuaGRyLnRva2VuID0gMDsKLQljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5oZHIub3Bjb2RlID0KLQkJCQkJIFZTU19JU09VTkRGT0NVU19DTURfU0VUX1NFQ1RPUlM7Ci0KLQltZW1zZXQoJihjdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5jdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtKSwgMHhGRiwKLQkJc2l6ZW9mKHN0cnVjdCB2c3NfaXNvdW5kZm9jdXNfY21kX3NldF9zZWN0b3JzX3QpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NFQ1RPUlM7IGkrKykgewotCQljdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5jdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtLgotCQkJc3RhcnRfYW5nbGVzW2ldID0gc291bmRGb2N1c0RhdGEuc3RhcnRfYW5nbGVbaV07Ci0JCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW0uCi0JCQllbmFibGVzW2ldID0gc291bmRGb2N1c0RhdGEuZW5hYmxlW2ldOwotCQlwcl9kZWJ1ZygiJXM6IHN0YXJ0X2FuZ2xlWyVkXSA9ICVkXG4iLAotCQkJICBfX2Z1bmNfXywgaSwgc291bmRGb2N1c0RhdGEuc3RhcnRfYW5nbGVbaV0pOwotCQlwcl9kZWJ1ZygiJXM6IGVuYWJsZVslZF0gPSAlZFxuIiwKLQkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLmVuYWJsZVtpXSk7Ci0JfQotCWN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLmN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW0uZ2Fpbl9zdGVwID0KLQkJCQkJc291bmRGb2N1c0RhdGEuZ2Fpbl9zdGVwOwotCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLCBzb3VuZEZvY3VzRGF0YS5nYWluX3N0ZXApOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0KLQlyZXQgPSBhcHJfc2VuZF9wa3QoYXByX2N2cCwgKHVpbnQzMl90ICopJmN2cF9zZXRfc291bmRfZm9jdXNfcGFyYW1fY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBFcnJvciBpbiBzZW5kaW5nIEFQUiBjb21tYW5kXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodi0+Y3ZwX3dhaXQsCi0JCQkJICh2LT5jdnBfc3RhdGUgPT0gQ01EX1NUQVRVU19TVUNDRVNTKSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfZXJyKCIlczogd2FpdF9ldmVudCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICh2LT5hc3luY19lcnIgPiAwKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvclslc11cbiIsCi0JCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKAotCQkJCXYtPmFzeW5jX2VycikpOwotCQlyZXQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCXYtPmFzeW5jX2Vycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29tbW9uLmlzX3NvdW5kX2ZvY3VzX3Jlc3Bfc3VjY2VzcykgewotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IEVycm9yIGluIHNldHRpbmcgc291bmQgZm9jdXMgcGFyYW1zXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLWRvbmU6Ci0JcHJfZGVidWcoIiVzOiBFeGl0LCByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHZvY19zZXRfc291bmRfZm9jdXMoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtIHNvdW5kRm9jdXNEYXRhKQotewotCXN0cnVjdCB2b2ljZV9kYXRhICp2ID0gTlVMTDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgaXRyOwotCi0JcHJfZGVidWcoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQl2b2ljZV9pdHJfaW5pdCgmaXRyLCBBTExfU0VTU0lPTl9WU0lEKTsKLQl3aGlsZSAodm9pY2VfaXRyX2dldF9uZXh0X3Nlc3Npb24oJml0ciwgJnYpKSB7Ci0JCWlmICh2ICE9IE5VTEwpIHsKLQkJCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSAmJgotCQkJCSh2LT5sY2hfbW9kZSAhPSBWT0lDRV9MQ0hfU1RBUlQpICYmCi0JCQkJIXYtPmRpc2FibGVfdG9wb2xvZ3kpCi0JCQkJcmV0ID0gdm9pY2Vfc2VuZF9zZXRfc291bmRfZm9jdXNfY21kKHYsCi0JCQkJCQkJc291bmRGb2N1c0RhdGEpOwotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvblxuIiwgX19mdW5jX18pOwotCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9nZXRfc291bmRfZm9jdXNfY21kKHN0cnVjdCB2b2ljZV9kYXRhICp2LAotCQkJCXN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSAqc291bmRGb2N1c0RhdGEpCi17Ci0Jc3RydWN0IGFwcl9oZHIgY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYXByX2N2cDsKLQl1MTYgY3ZwX2hhbmRsZTsKLQlpbnQgaTsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWlmICghdikgewotCQlwcl9lcnIoIiVzOiB2IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCWFwcl9jdnAgPSBjb21tb24uYXByX3E2X2N2cDsKLQotCWlmICghYXByX2N2cCkgewotCQlwcl9lcnIoIiVzOiBhcHJfY3ZwIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JY3ZwX2hhbmRsZSA9IHZvaWNlX2dldF9jdnBfaGFuZGxlKHYpOwotCi0JLyogc2VuZCBBUFIgY29tbWFuZCB0byByZXRyaWV2ZSBTb3VuZCBGb2N1cyBQYXJhbXMgKi8KLQljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5oZHJfZmllbGQgPQotCQkJCUFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgIEFQUl9IRFJfTEVOKEFQUl9IRFJfU0laRSksCi0JCQkJCSAgICAgIEFQUl9QS1RfVkVSKTsKLQljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQlzaXplb2YoY3ZwX2dldF9zb3VuZF9mb2N1c19wYXJhbV9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5zcmNfcG9ydCA9Ci0JCQkJdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5kZXN0X3BvcnQgPSBjdnBfaGFuZGxlOwotCWN2cF9nZXRfc291bmRfZm9jdXNfcGFyYW1fY21kLnRva2VuID0gMDsKLQljdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZC5vcGNvZGUgPSBWU1NfSVNPVU5ERk9DVVNfQ01EX0dFVF9TRUNUT1JTOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsICh1aW50MzJfdCAqKSZjdnBfZ2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gc2VuZGluZyBBUFIgY29tbWFuZFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvbW1vbi5pc19zb3VuZF9mb2N1c19yZXNwX3N1Y2Nlc3MpIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9TRUNUT1JTOyBpKyspIHsKLQkJCXNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSA9Ci0JCQkJY29tbW9uLnNvdW5kRm9jdXNSZXNwb25zZS5zdGFydF9hbmdsZXNbaV07Ci0JCQlzb3VuZEZvY3VzRGF0YS0+ZW5hYmxlW2ldID0KLQkJCQljb21tb24uc291bmRGb2N1c1Jlc3BvbnNlLmVuYWJsZXNbaV07Ci0JCQlwcl9kZWJ1ZygiJXM6IHN0YXJ0X2FuZ2xlWyVkXSA9ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIGksIHNvdW5kRm9jdXNEYXRhLT5zdGFydF9hbmdsZVtpXSk7Ci0JCQlwcl9kZWJ1ZygiJXM6IGVuYWJsZVslZF0gPSAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCBpLCBzb3VuZEZvY3VzRGF0YS0+ZW5hYmxlW2ldKTsKLQkJfQotCQlzb3VuZEZvY3VzRGF0YS0+Z2Fpbl9zdGVwID0gY29tbW9uLnNvdW5kRm9jdXNSZXNwb25zZS5nYWluX3N0ZXA7Ci0JCXByX2RlYnVnKCIlczogZ2Fpbl9zdGVwID0gJWRcbiIsIF9fZnVuY19fLAotCQkJICBzb3VuZEZvY3VzRGF0YS0+Z2Fpbl9zdGVwKTsKLQotCQljb21tb24uaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzID0gZmFsc2U7Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXlsb2FkIHJlY2VpdmVkIGZyb20gQ1ZEXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci1kb25lOgotCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfZ2V0X3NvdW5kX2ZvY3VzKHN0cnVjdCBzb3VuZF9mb2N1c19wYXJhbSAqc291bmRGb2N1c0RhdGEpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCXZvaWNlX2l0cl9pbml0KCZpdHIsIEFMTF9TRVNTSU9OX1ZTSUQpOwotCXdoaWxlICh2b2ljZV9pdHJfZ2V0X25leHRfc2Vzc2lvbigmaXRyLCAmdikpIHsKLQkJaWYgKHYpIHsKLQkJCW11dGV4X2xvY2soJnYtPmxvY2spOwotCQkJaWYgKGlzX3ZvY19zdGF0ZV9hY3RpdmUodi0+dm9jX3N0YXRlKSAmJgotCQkJCSh2LT5sY2hfbW9kZSAhPSBWT0lDRV9MQ0hfU1RBUlQpICYmCi0JCQkJIXYtPmRpc2FibGVfdG9wb2xvZ3kpCi0JCQkJcmV0ID0gdm9pY2Vfc2VuZF9nZXRfc291bmRfZm9jdXNfY21kKHYsCi0JCQkJCQkJc291bmRGb2N1c0RhdGEpOwotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvblxuIiwgX19mdW5jX18pOwotCi0JCQlyZXQgPSAgLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGlzX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb21yeV9hbGxvY2F0ZWQodm9pZCkKLXsKLQlib29sIHJldDsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWlmIChjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suY2xpZW50ICE9IE5VTEwgJiYKLQkgICAgY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSAhPSBOVUxMKQotCQlyZXQgPSB0cnVlOwotCWVsc2UKLQkJcmV0ID0gZmFsc2U7Ci0KLQlwcl9kZWJ1ZygiJXM6IEV4aXRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfYWxsb2Nfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IG1zbV9hdWRpb19pb25fYWxsb2MoInNvdXJjZV90cmFja2luZ19zaF9tZW1fYmxvY2siLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQpLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUpLAotCQlCVUZGRVJfQkxPQ0tfU0laRSwKLQkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2sucGh5cyksCi0JCShzaXplX3QgKikmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5zaXplKSwKLQkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suZGF0YSkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGF1ZGlvIElPTiBhbGxvYyBmYWlsZWQgZm9yIHNoX21lbSBibG9jaywgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCW1lbXNldCgodm9pZCAqKShjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suZGF0YSksIDAsCi0JCSAgIGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5zaXplKTsKLQotCXByX2RlYnVnKCIlczogc2hfbWVtX2Jsb2NrOiBwaHlzOlslcEtdLCBkYXRhOlsweCVwS10sIHNpemU6WyV6ZF1cbiIsCi0JCSBfX2Z1bmNfXywKLQkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2sucGh5cyksCi0JCSh2b2lkICopKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5kYXRhKSwKLQkJKHNpemVfdCkoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnNpemUpKTsKLQotCXJldCA9IG1zbV9hdWRpb19pb25fYWxsb2MoInNvdXJjZV90cmFja2luZ19zaF9tZW1fdGFibGUiLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5jbGllbnQpLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5oYW5kbGUpLAotCQlzaXplb2Yoc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX3QpLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5waHlzKSwKLQkJKHNpemVfdCAqKSYoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX3RhYmxlLnNpemUpLAotCQkmKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5kYXRhKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogYXVkaW8gSU9OIGFsbG9jIGZhaWxlZCBmb3Igc2hfbWVtIHRhYmxlLCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IG1zbV9hdWRpb19pb25fZnJlZSgKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQsCi0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suaGFuZGxlKTsKLQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCA9IE5VTEw7Ci0JCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgPSBOVUxMOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IEVycm9yOiVkIGZyZWVpbmcgbWVtb3J5XG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCW1lbXNldCgodm9pZCAqKShjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUuZGF0YSksIDAsCi0JCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5zaXplKTsKLQotCXByX2RlYnVnKCIlcyBzaF9tZW1fdGFibGU6IHBoeXM6WyVwS10sIGRhdGE6WzB4JXBLXSwgc2l6ZTpbJXpkXSxcbiIsCi0JCSBfX2Z1bmNfXywKLQkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUucGh5cyksCi0JCSh2b2lkICopKGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV90YWJsZS5kYXRhKSwKLQkJKHNpemVfdCkoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX3RhYmxlLnNpemUpKTsKLQotZG9uZToKLQlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZvaWNlX2FsbG9jX2FuZF9tYXBfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkoCi0JCQkJCQlzdHJ1Y3Qgdm9pY2VfZGF0YSAqdikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCXJldCA9IHZvaWNlX2FsbG9jX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXQgPSB2b2ljZV9tYXBfbWVtb3J5X3BoeXNpY2FsX2NtZCh2LAotCQkJJihjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fdGFibGUpLAotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnBoeXMsCi0JCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suc2l6ZSwKLQkJCVZPQ19TT1VSQ0VfVFJBQ0tJTkdfTUVNX01BUF9UT0tFTik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiBtZW1vcnkgbWFwcGluZyBmYWlsZWQgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2VfdW5tYXBfYW5kX2ZyZWVfc291cmNlX3RyYWNraW5nX3NoYXJlZF9tZW1vcnkoCi0JCQkJCQkJc3RydWN0IHZvaWNlX2RhdGEgKnYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0ubWVtX2hhbmRsZSAhPSAwKSB7Ci0JCXJldCA9IHZvaWNlX3NlbmRfbXZtX3VubWFwX21lbW9yeV9waHlzaWNhbF9jbWQodiwKLQkJCQljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5tZW1faGFuZGxlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IE1lbW9yeV91bm1hcCBmYWlsZWQgZXJyICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgcmV0KTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmICgoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCA9PSBOVUxMKSB8fAotCSAgICAoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmhhbmRsZSA9PSBOVUxMKSkKLQkJZ290byBkb25lOwotCi0JcmV0ID0gbXNtX2F1ZGlvX2lvbl9mcmVlKAotCQkJY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLmNsaWVudCwKLQkJCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IEVycm9yOiVkIGZyZWVpbmcgbWVtb3J5XG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLm1lbV9oYW5kbGUgPSAwOwotCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5jbGllbnQgPSBOVUxMOwotCWNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLnNoX21lbV9ibG9jay5oYW5kbGUgPSBOVUxMOwotCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdm9pY2Vfc2VuZF9nZXRfc291cmNlX3RyYWNraW5nX2NtZChzdHJ1Y3Qgdm9pY2VfZGF0YSAqdiwKLQkJCXN0cnVjdCBzb3VyY2VfdHJhY2tpbmdfcGFyYW0gKnNvdXJjZVRyYWNraW5nRGF0YSkKLXsKLQlzdHJ1Y3QgY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW1fY21kX3Qgc3RfY21kOwotCWludCByZXQgPSAwOwotCXZvaWQgKmFwcl9jdnA7Ci0JdTE2IGN2cF9oYW5kbGU7Ci0JaW50IGk7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIXYpIHsKLQkJcHJfZXJyKCIlczogdiBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlhcHJfY3ZwID0gY29tbW9uLmFwcl9xNl9jdnA7Ci0KLQlpZiAoIWFwcl9jdnApIHsKLQkJcHJfZXJyKCIlczogYXByX2N2cCBpcyBOVUxMLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljdnBfaGFuZGxlID0gdm9pY2VfZ2V0X2N2cF9oYW5kbGUodik7Ci0KLQlpZiAoIWlzX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb21yeV9hbGxvY2F0ZWQoKSkgewotCQlyZXQgPSB2b2ljZV9hbGxvY19hbmRfbWFwX3NvdXJjZV90cmFja2luZ19zaGFyZWRfbWVtb3J5KHYpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsIGluIGFsbG9jYXRpbmcvbWFwcGluZyBzaGFyZWQgbWVtb3J5XG4iLAotCQkJCV9fZnVuY19fKTsKLQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQlzdF9jbWQuaGRyLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCQkJCSAgICAgQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwKLQkJCQkJICAgICBBUFJfUEtUX1ZFUik7Ci0Jc3RfY21kLmhkci5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCQkJCSAgIHNpemVvZihzdF9jbWQpIC0gQVBSX0hEUl9TSVpFKTsKLQlzdF9jbWQuaGRyLnNyY19wb3J0ID0gdm9pY2VfZ2V0X2lkeF9mb3Jfc2Vzc2lvbih2LT5zZXNzaW9uX2lkKTsKLQlzdF9jbWQuaGRyLmRlc3RfcG9ydCA9IGN2cF9oYW5kbGU7Ci0Jc3RfY21kLmhkci50b2tlbiA9IDA7Ci0Jc3RfY21kLmhkci5vcGNvZGUgPSBWU1NfSVNPVVJDRVRSQUNLX0NNRF9HRVRfQUNUSVZJVFk7Ci0KLQlzdF9jbWQuY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW0ubWVtX2hhbmRsZQk9Ci0JCQkJIGNvbW1vbi5zb3VyY2VfdHJhY2tpbmdfc2hfbWVtLm1lbV9oYW5kbGU7Ci0Jc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9hZGRyZXNzX2xzdyA9Ci0JCWxvd2VyXzMyX2JpdHMoY29tbW9uLnNvdXJjZV90cmFja2luZ19zaF9tZW0uc2hfbWVtX2Jsb2NrLnBoeXMpOwotCXN0X2NtZC5jdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbS5tZW1fYWRkcmVzc19tc3cgPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cyhjb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS4KLQkJCQkJc2hfbWVtX2Jsb2NrLnBoeXMpOwotCXN0X2NtZC5jdnBfZ2V0X3NvdXJjZV90cmFja2luZ19wYXJhbS5tZW1fc2l6ZSA9Ci0JCSh1aW50MzJfdCljb21tb24uc291cmNlX3RyYWNraW5nX3NoX21lbS5zaF9tZW1fYmxvY2suc2l6ZTsKLQlwcl9kZWJ1ZygiJXM6IG1lbV9oYW5kbGU9MHgleCwgbWVtX2FkZHJlc3NfbHN3PTB4JXgsIG1zdz0weCV4LCBtZW1fc2l6ZT0lZFxuIiwKLQkJIF9fZnVuY19fLAotCQkgc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9oYW5kbGUsCi0JCSBzdF9jbWQuY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW0ubWVtX2FkZHJlc3NfbHN3LAotCQkgc3RfY21kLmN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtLm1lbV9hZGRyZXNzX21zdywKLQkJICh1aW50MzJfdClzdF9jbWQuY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW0ubWVtX3NpemUpOwotCi0Jdi0+Y3ZwX3N0YXRlID0gQ01EX1NUQVRVU19GQUlMOwotCXYtPmFzeW5jX2VyciA9IDA7Ci0JcmV0ID0gYXByX3NlbmRfcGt0KGFwcl9jdnAsCi0JCQkgICAodWludDMyX3QgKikgJnN0X2NtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogRXJyb3IgaW4gc2VuZGluZyBBUFIgY29tbWFuZFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHYtPmN2cF93YWl0LAotCQkJCSAodi0+Y3ZwX3N0YXRlID09IENNRF9TVEFUVVNfU1VDQ0VTUyksCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmV0KSB7Ci0JCXByX2VycigiJXM6IHdhaXRfZXZlbnQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAodi0+YXN5bmNfZXJyID4gMCkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3JbJXNdXG4iLAotCQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cigKLQkJCQl2LT5hc3luY19lcnIpKTsKLQkJcmV0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQl2LT5hc3luY19lcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvbW1vbi5pc19zb3VyY2VfdHJhY2tpbmdfcmVzcF9zdWNjZXNzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDVE9SUzsgaSsrKSB7Ci0JCQlzb3VyY2VUcmFja2luZ0RhdGEtPnZhZFtpXSA9Ci0JCQkJY29tbW9uLnNvdXJjZVRyYWNraW5nUmVzcG9uc2Uudm9pY2VfYWN0aXZlW2ldOwotCQkJcHJfZGVidWcoIiVzOiB2YWRbJWRdID0gJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgaSwgc291cmNlVHJhY2tpbmdEYXRhLT52YWRbaV0pOwotCQl9Ci0JCXNvdXJjZVRyYWNraW5nRGF0YS0+ZG9hX3NwZWVjaCA9Ci0JCQkJY29tbW9uLnNvdXJjZVRyYWNraW5nUmVzcG9uc2UudGFsa2VyX2RvYTsKLQkJcHJfZGVidWcoIiVzOiBkb2Ffc3BlZWNoID0gJWRcbiIsCi0JCQkgIF9fZnVuY19fLCBzb3VyY2VUcmFja2luZ0RhdGEtPmRvYV9zcGVlY2gpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTk9JU0VfU09VUkNFX0lORElDQVRPUlM7IGkrKykgewotCQkJc291cmNlVHJhY2tpbmdEYXRhLT5kb2Ffbm9pc2VbaV0gPQotCQkJIGNvbW1vbi5zb3VyY2VUcmFja2luZ1Jlc3BvbnNlLmludGVyZmVyZXJfZG9hW2ldOwotCQkJcHJfZGVidWcoIiVzOiBkb2Ffbm9pc2VbJWRdID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIGksIHNvdXJjZVRyYWNraW5nRGF0YS0+ZG9hX25vaXNlW2ldKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BPTEFSX0FDVElWSVRZX0lORElDQVRPUlM7IGkrKykgewotCQkJc291cmNlVHJhY2tpbmdEYXRhLT5wb2xhcl9hY3Rpdml0eVtpXSA9Ci0JCQkgY29tbW9uLnNvdXJjZVRyYWNraW5nUmVzcG9uc2Uuc291bmRfc3RyZW5ndGhbaV07Ci0JCQlwcl9kZWJ1ZygiJXM6IHBvbGFyX2FjdGl2aXR5WyVkXSA9ICVkXG4iLAotCQkJIF9fZnVuY19fLCBpLCBzb3VyY2VUcmFja2luZ0RhdGEtPnBvbGFyX2FjdGl2aXR5W2ldKTsKLQkJfQotCQljb21tb24uaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzcyA9IGZhbHNlOwotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IEVycm9yIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gQ1ZEXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci1kb25lOgotCXByX2RlYnVnKCIlczogRXhpdCwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCB2b2NfZ2V0X3NvdXJjZV90cmFja2luZyhzdHJ1Y3Qgc291cmNlX3RyYWNraW5nX3BhcmFtICpzb3VyY2VUcmFja2luZ0RhdGEpCi17Ci0Jc3RydWN0IHZvaWNlX2RhdGEgKnYgPSBOVUxMOwotCWludCByZXQgPSAtRUlOVkFMOwotCXN0cnVjdCB2b2ljZV9zZXNzaW9uX2l0ciBpdHI7Ci0KLQlwcl9kZWJ1ZygiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZjb21tb24uY29tbW9uX2xvY2spOwotCi0Jdm9pY2VfaXRyX2luaXQoJml0ciwgQUxMX1NFU1NJT05fVlNJRCk7Ci0Jd2hpbGUgKHZvaWNlX2l0cl9nZXRfbmV4dF9zZXNzaW9uKCZpdHIsICZ2KSkgewotCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQltdXRleF9sb2NrKCZ2LT5sb2NrKTsKLQkJCWlmIChpc192b2Nfc3RhdGVfYWN0aXZlKHYtPnZvY19zdGF0ZSkgJiYKLQkJCQkodi0+bGNoX21vZGUgIT0gVk9JQ0VfTENIX1NUQVJUKSAmJgotCQkJCSF2LT5kaXNhYmxlX3RvcG9sb2d5KQotCQkJCXJldCA9IHZvaWNlX3NlbmRfZ2V0X3NvdXJjZV90cmFja2luZ19jbWQodiwKLQkJCQkJCQlzb3VyY2VUcmFja2luZ0RhdGEpOwotCQkJbXV0ZXhfdW5sb2NrKCZ2LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgc2Vzc2lvblxuIiwgX19mdW5jX18pOwotCi0JCQlicmVhazsKLQkJfQotCX0KLQotCW11dGV4X3VubG9jaygmY29tbW9uLmNvbW1vbl9sb2NrKTsKLQlwcl9kZWJ1ZygiJXM6IEV4aXQsIHJldD0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXNfdm9jX2luaXRpYWxpemVkKHZvaWQpCi17Ci0JcmV0dXJuIG1vZHVsZV9pbml0aWFsaXplZDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdm9pY2VfaW5pdCh2b2lkKQotewotCWludCByYyA9IDAsIGkgPSAwOwotCi0JbWVtc2V0KCZjb21tb24sIDAsIHNpemVvZihzdHJ1Y3QgY29tbW9uX2RhdGEpKTsKLQotCS8qIHNldCBkZWZhdWx0IHZhbHVlICovCi0JY29tbW9uLmRlZmF1bHRfbXV0ZV92YWwgPSAwOyAgLyogZGVmYXVsdCBpcyB1bi1tdXRlICovCi0JY29tbW9uLmRlZmF1bHRfc2FtcGxlX3ZhbCA9IDgwMDA7Ci0JY29tbW9uLmRlZmF1bHRfdm9sX3N0ZXBfdmFsID0gMDsKLQljb21tb24uZGVmYXVsdF92b2xfcmFtcF9kdXJhdGlvbl9tcyA9IERFRkFVTFRfVk9MVU1FX1JBTVBfRFVSQVRJT047Ci0JY29tbW9uLmRlZmF1bHRfbXV0ZV9yYW1wX2R1cmF0aW9uX21zID0gREVGQVVMVF9NVVRFX1JBTVBfRFVSQVRJT047Ci0JY29tbW9uLmN2cF92ZXJzaW9uID0gMDsKLQljb21tb24uaXNfYXZjc192ZXJzaW9uX3F1ZXJpZWQgPSBmYWxzZTsKLQkvKiBJbml0aWFsaXplIEVDIFJlZiBtZWRpYSBmb3JtYXQgaW5mbyAqLwotCWNvbW1vbi5lY19yZWZfZXh0ID0gZmFsc2U7Ci0JY29tbW9uLmVjX21lZGlhX2ZtdF9pbmZvLnBvcnRfaWQgPSBBRkVfUE9SVF9JTlZBTElEOwotCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5udW1fY2hhbm5lbHMgPSAwOwotCWNvbW1vbi5lY19tZWRpYV9mbXRfaW5mby5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQljb21tb24uZWNfbWVkaWFfZm10X2luZm8uc2FtcGxlX3JhdGUgPSA4MDAwOwotCW1lbXNldCgmY29tbW9uLmVjX21lZGlhX2ZtdF9pbmZvLmNoYW5uZWxfbWFwcGluZywgMCwKLQkgICAgICAgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFKTsKLQotCS8qIEluaXRpYWxpemUgQUZFIFNpZGV0b25lIEVuYWJsZSAqLwotCWNvbW1vbi5zaWRldG9uZV9lbmFibGUgPSBmYWxzZTsKLQotCS8qIEluaXRpYWxpemUgTVZTIGluZm8uICovCi0JY29tbW9uLm12c19pbmZvLm5ldHdvcmtfdHlwZSA9IFZTU19ORVRXT1JLX0lEX0RFRkFVTFQ7Ci0KLQkvKiBJbml0aWFsaXplIGlzIGxvdyBtZW1vcnkgZmxhZyAqLwotCWNvbW1vbi5pc19kZXN0cm95X2N2ZCA9IGZhbHNlOwotCi0JLyogSW5pdGlhbGl6ZSBDVkQgdmVyc2lvbiAqLwotCXN0cmxjcHkoY29tbW9uLmN2ZF92ZXJzaW9uLCBDVkRfVkVSU0lPTl9ERUZBVUxULAotCQlzaXplb2YoY29tbW9uLmN2ZF92ZXJzaW9uKSk7Ci0JLyogSW5pdGlhbGl6ZSBQZXItVm9jb2RlciBDYWxpYnJhdGlvbiBmbGFnICovCi0JY29tbW9uLmlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkID0gZmFsc2U7Ci0KLQltdXRleF9pbml0KCZjb21tb24uY29tbW9uX2xvY2spOwotCi0JLyogSW5pdGlhbGl6ZSBzZXNzaW9uIGlkIHdpdGggdnNpZCAqLwotCWluaXRfc2Vzc2lvbl9pZCgpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9WT0NfU0VTU0lPTlM7IGkrKykgewotCi0JCS8qIGluaXRpYWxpemUgZGV2X3J4IGFuZCBkZXZfdHggKi8KLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC5kZXZfbXV0ZSA9ICBjb21tb24uZGVmYXVsdF9tdXRlX3ZhbDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl90eC5kZXZfbXV0ZSA9ICBjb21tb24uZGVmYXVsdF9tdXRlX3ZhbDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC52b2x1bWVfc3RlcF92YWx1ZSA9Ci0JCQkJCWNvbW1vbi5kZWZhdWx0X3ZvbF9zdGVwX3ZhbDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC52b2x1bWVfcmFtcF9kdXJhdGlvbl9tcyA9Ci0JCQkJCWNvbW1vbi5kZWZhdWx0X3ZvbF9yYW1wX2R1cmF0aW9uX21zOwotCQljb21tb24udm9pY2VbaV0uZGV2X3J4LmRldl9tdXRlX3JhbXBfZHVyYXRpb25fbXMgPQotCQkJCQljb21tb24uZGVmYXVsdF9tdXRlX3JhbXBfZHVyYXRpb25fbXM7Ci0JCWNvbW1vbi52b2ljZVtpXS5kZXZfdHguZGV2X211dGVfcmFtcF9kdXJhdGlvbl9tcyA9Ci0JCQkJCWNvbW1vbi5kZWZhdWx0X211dGVfcmFtcF9kdXJhdGlvbl9tczsKLQkJY29tbW9uLnZvaWNlW2ldLnN0cmVhbV9yeC5zdHJlYW1fbXV0ZSA9IGNvbW1vbi5kZWZhdWx0X211dGVfdmFsOwotCQljb21tb24udm9pY2VbaV0uc3RyZWFtX3R4LnN0cmVhbV9tdXRlID0gY29tbW9uLmRlZmF1bHRfbXV0ZV92YWw7Ci0KLQkJY29tbW9uLnZvaWNlW2ldLmRldl90eC5wb3J0X2lkID0gMHgxMDBCOwotCQljb21tb24udm9pY2VbaV0uZGV2X3J4LnBvcnRfaWQgPSAweDEwMEE7Ci0JCWNvbW1vbi52b2ljZVtpXS5kZXZfdHguZGV2X2lkID0gMDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC5kZXZfaWQgPSAwOwotCQljb21tb24udm9pY2VbaV0uZGV2X3R4Lm5vX29mX2NoYW5uZWxzID0gMDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC5ub19vZl9jaGFubmVscyA9IDA7Ci0JCWNvbW1vbi52b2ljZVtpXS5kZXZfdHguc2FtcGxlX3JhdGUgPSA4MDAwOwotCQljb21tb24udm9pY2VbaV0uZGV2X3J4LnNhbXBsZV9yYXRlID0gODAwMDsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl90eC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJY29tbW9uLnZvaWNlW2ldLmRldl9yeC5iaXRzX3Blcl9zYW1wbGUgPSAxNjsKLQkJbWVtc2V0KCZjb21tb24udm9pY2VbaV0uZGV2X3R4LmNoYW5uZWxfbWFwcGluZywgMCwKLQkJICAgICAgIFZTU19DSEFOTkVMX01BUFBJTkdfU0laRSk7Ci0JCW1lbXNldCgmY29tbW9uLnZvaWNlW2ldLmRldl9yeC5jaGFubmVsX21hcHBpbmcsIDAsCi0JCSAgICAgICBWU1NfQ0hBTk5FTF9NQVBQSU5HX1NJWkUpOwotCQljb21tb24udm9pY2VbaV0uc2lkZXRvbmVfZ2FpbiA9IDB4NTEyOwotCQljb21tb24udm9pY2VbaV0uZHRtZl9yeF9kZXRlY3RfZW4gPSAwOwotCQljb21tb24udm9pY2VbaV0ubGNoX21vZGUgPSAwOwotCQljb21tb24udm9pY2VbaV0uZGlzYWJsZV90b3BvbG9neSA9IGZhbHNlOwotCi0JCWNvbW1vbi52b2ljZVtpXS52b2Nfc3RhdGUgPSBWT0NfSU5JVDsKLQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb24udm9pY2VbaV0ubXZtX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb24udm9pY2VbaV0uY3ZzX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb21tb24udm9pY2VbaV0uY3ZwX3dhaXQpOwotCi0JCW11dGV4X2luaXQoJmNvbW1vbi52b2ljZVtpXS5sb2NrKTsKLQl9Ci0KLQlpZiAodm9pY2VfaW5pdF9jYWxfZGF0YSgpKQotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgaW5pdCBjYWwgZGF0YSFcbiIsIF9fZnVuY19fKTsKLQotCWlmIChyYyA9PSAwKQotCQltb2R1bGVfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JcHJfZGVidWcoIiVzOiByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLWRldmljZV9pbml0Y2FsbCh2b2ljZV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IHZvaWNlX2V4aXQodm9pZCkKLXsKLQl2b2ljZV9kZWxldGVfY2FsX2RhdGEoKTsKLQlmcmVlX2NhbF9tYXBfdGFibGUoKTsKLX0KLQotX19leGl0Y2FsbCh2b2ljZV9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vcWRzcDZ2Mi9xNnZvaWNlLmggYi9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTgzOTk2ZS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcTZ2b2ljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX1FEU1A2Vk9JQ0VfSF9fCi0jZGVmaW5lIF9fUURTUDZWT0lDRV9IX18KLQotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXByLmg+Ci0jaW5jbHVkZSA8bGludXgvcWRzcDZ2Mi9ydGFjLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgotI2luY2x1ZGUgPHNvdW5kL3ZvaWNlX3BhcmFtcy5oPgotCi0jZGVmaW5lIE1BWF9WT0NfUEtUX1NJWkUgNjQyCi0jZGVmaW5lIFNFU1NJT05fTkFNRV9MRU4gMjAKLSNkZWZpbmUgTlVNX09GX01FTU9SWV9CTE9DS1MgMQotI2RlZmluZSBOVU1fT0ZfQlVGRkVSUyAyCi0jZGVmaW5lIFZTU19OVU1fQ0hBTk5FTFNfTUFYIDgKLSNkZWZpbmUgVlNTX0NIQU5ORUxfTUFQUElOR19TSVpFIChzaXplb2YodWludDhfdCkgKiBWU1NfTlVNX0NIQU5ORUxTX01BWCkKLS8qCi0gKiBCVUZGRVIgQkxPQ0sgU0laRSBiYXNlZCBvbgotICogdGhlIHN1cHBvcnRlZCBwYWdlIHNpemUKLSAqLwotI2RlZmluZSBCVUZGRVJfQkxPQ0tfU0laRSAgICAgICA0MDk2Ci0KLSNkZWZpbmUgTUFYX0NPTF9JTkZPX1NJWkUJMzI0Ci0KLSNkZWZpbmUgVk9DX1JFQ19VUExJTksJCTB4MDAKLSNkZWZpbmUgVk9DX1JFQ19ET1dOTElOSwkweDAxCi0jZGVmaW5lIFZPQ19SRUNfQk9USAkJMHgwMgotCi0jZGVmaW5lIFZTU19JVkVSU0lPTl9DTURfR0VUICAgICAgICAgICAgICAgICAweDAwMDExMzc4Ci0jZGVmaW5lIFZTU19JVkVSU0lPTl9SU1BfR0VUICAgICAgICAgICAgICAgICAweDAwMDExMzc5Ci0jZGVmaW5lIENWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRSAgICAgICAgICAzMQotI2RlZmluZSBDVkRfVkVSU0lPTl9ERUZBVUxUICAgICAgICAgICAgICAgICAgIiIKLSNkZWZpbmUgQ1ZEX1ZFUlNJT05fMF8wICAgICAgICAgICAgICAgICAgICAgICIwLjAiCi0jZGVmaW5lIENWRF9WRVJTSU9OXzJfMSAgICAgICAgICAgICAgICAgICAgICAiMi4xIgotI2RlZmluZSBDVkRfVkVSU0lPTl8yXzIgICAgICAgICAgICAgICAgICAgICAgIjIuMiIKLSNkZWZpbmUgQ1ZEX1ZFUlNJT05fMl8zICAgICAgICAgICAgICAgICAgICAgICIyLjMiCi0KLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX0RFRkFVTFQgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzBfMCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMSAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMiAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OXzJfMyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX0xBU1QgICAgICAgICAgICAgICAgIENWRF9JTlRfVkVSU0lPTl8yXzMKLSNkZWZpbmUgQ1ZEX0lOVF9WRVJTSU9OX01BWCAgICAgICAgICAgICAgICAgIChDVkRfSU5UX1ZFUlNJT05fTEFTVCArIDEpCi0KLXN0cnVjdCBjdmRfdmVyc2lvbl90YWJsZSB7Ci0JY2hhciBjdmRfdmVyW0NWRF9WRVJTSU9OX1NUUklOR19NQVhfU0laRV07Ci0JaW50IGN2ZF92ZXJfaW50OwotfTsKLQotaW50IHZvY19nZXRfY3ZkX3ZlcnNpb24oY2hhciAqY3ZkX3ZlcnNpb24pOwotCi0vKiBQYXlsb2FkIHN0cnVjdHVyZSBmb3IgdGhlIFZTU19JVkVSU0lPTl9SU1BfR0VUIGNvbW1hbmQgcmVzcG9uc2UgKi8KLXN0cnVjdCB2c3NfaXZlcnNpb25fcnNwX2dldF90IHsKLQljaGFyIHZlcnNpb25bQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFXTsKLQkvKiBOVUxMLXRlcm1pbmF0ZWQgdmVyc2lvbiBzdHJpbmcgKi8KLX07Ci0KLWVudW0gewotCUNWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMID0gMCwKLQlDVlBfVk9DX1RYX1RPUE9MT0dZX0NBTCwKLQlDVlBfVk9DUFJPQ19DQUwsCi0JQ1ZQX1ZPQ1ZPTF9DQUwsCi0JQ1ZQX1ZPQ0RFVl9DRkdfQ0FMLAotCUNWUF9WT0NQUk9DX0NPTF9DQUwsCi0JQ1ZQX1ZPQ1ZPTF9DT0xfQ0FMLAotCUNWU19WT0NTVFJNX0NBTCwKLQlDVlNfVk9DU1RSTV9DT0xfQ0FMLAotCVZPSUNFX1JUQUNfSU5GT19DQUwsCi0JVk9JQ0VfUlRBQ19BUFJfQ0FMLAotCU1BWF9WT0lDRV9DQUxfVFlQRVMKLX07Ci0KLXN0cnVjdCB2b2ljZV9oZWFkZXIgewotCXVpbnQzMl90IGlkOwotCXVpbnQzMl90IGRhdGFfbGVuOwotfTsKLQotc3RydWN0IHZvaWNlX2luaXQgewotCXN0cnVjdCB2b2ljZV9oZWFkZXIgaGRyOwotCXZvaWQgKmNiX2hhbmRsZTsKLX07Ci0KLS8qIFN0cmVhbSBpbmZvcm1hdGlvbiBwYXlsb2FkIHN0cnVjdHVyZSAqLwotc3RydWN0IHN0cmVhbV9kYXRhIHsKLQl1aW50MzJfdCBzdHJlYW1fbXV0ZTsKLQl1aW50MzJfdCBzdHJlYW1fbXV0ZV9yYW1wX2R1cmF0aW9uX21zOwotfTsKLQotLyogRGV2aWNlIGluZm9ybWF0aW9uIHBheWxvYWQgc3RydWN0dXJlICovCi1zdHJ1Y3QgZGV2aWNlX2RhdGEgewotCXVpbnQzMl90IGRldl9tdXRlOwotCXVpbnQzMl90IHNhbXBsZV9yYXRlOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKLQl1aW50OF90ICBjaGFubmVsX21hcHBpbmdbVlNTX05VTV9DSEFOTkVMU19NQVhdOwotCXVpbnQzMl90IGVuYWJsZWQ7Ci0JdWludDMyX3QgZGV2X2lkOwotCXVpbnQzMl90IHBvcnRfaWQ7Ci0JdWludDMyX3Qgdm9sdW1lX3N0ZXBfdmFsdWU7Ci0JdWludDMyX3Qgdm9sdW1lX3JhbXBfZHVyYXRpb25fbXM7Ci0JdWludDMyX3QgZGV2X211dGVfcmFtcF9kdXJhdGlvbl9tczsKLQl1aW50MzJfdCBub19vZl9jaGFubmVsczsKLX07Ci0KLS8qCi0gKiBGb3JtYXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIHRvIG1hdGNoCi0gKiB2c3NfcGFyYW1fZW5kcG9pbnRfbWVkaWFfZm9ybWF0X2luZm9fdAotICovCi1zdHJ1Y3QgbWVkaWFfZm9ybWF0X2luZm8gewotCXVpbnQzMl90IHBvcnRfaWQ7Ci0JdWludDE2X3QgbnVtX2NoYW5uZWxzOwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQl1aW50OF90ICBjaGFubmVsX21hcHBpbmdbVlNTX05VTV9DSEFOTkVMU19NQVhdOwotfTsKLQotZW51bSB7Ci0JVk9DX0dFTkVSSUNfU0VUX1BBUkFNX1RPS0VOID0gMCwKLQlWT0NfUlRBQ19TRVRfUEFSQU1fVE9LRU4sCi0JVk9DX1NFVF9NRURJQV9GT1JNQVRfUEFSQU1fVE9LRU4sCi0JVk9DX1NFVF9QQVJBTV9UT0tFTl9NQVgKLX07Ci0KLXN0cnVjdCB2b2ljZV9kZXZfcm91dGVfc3RhdGUgewotCXUxNiByeF9yb3V0ZV9mbGFnOwotCXUxNiB0eF9yb3V0ZV9mbGFnOwotfTsKLQotc3RydWN0IHZvaWNlX3JlY19yb3V0ZV9zdGF0ZSB7Ci0JdTE2IHVsX2ZsYWc7Ci0JdTE2IGRsX2ZsYWc7Ci19OwotCi1lbnVtIHsKLQlWT0NfSU5JVCA9IDAsCi0JVk9DX1JVTiwKLQlWT0NfQ0hBTkdFLAotCVZPQ19SRUxFQVNFLAotCVZPQ19FUlJPUiwKLQlWT0NfU1RBTkRCWSwKLX07Ci0KLXN0cnVjdCBtZW1fYnVmZmVyIHsKLQlkbWFfYWRkcl90CQlwaHlzOwotCXZvaWQJCQkqZGF0YTsKLQl1aW50MzJfdAkJc2l6ZTsgLyogc2l6ZSBvZiBidWZmZXIgKi8KLX07Ci0KLXN0cnVjdCBzaGFyZV9tZW1fYnVmIHsKLQlzdHJ1Y3QgaW9uX2hhbmRsZQkqaGFuZGxlOwotCXN0cnVjdCBpb25fY2xpZW50CSpjbGllbnQ7Ci0Jc3RydWN0IG1lbV9idWZmZXIJYnVmW05VTV9PRl9CVUZGRVJTXTsKLX07Ci0KLXN0cnVjdCBtZW1fbWFwX3RhYmxlIHsKLQlkbWFfYWRkcl90CQlwaHlzOwotCXZvaWQJCQkqZGF0YTsKLQlzaXplX3QJCQlzaXplOyAvKiBzaXplIG9mIGJ1ZmZlciAqLwotCXN0cnVjdCBpb25faGFuZGxlCSpoYW5kbGU7Ci0Jc3RydWN0IGlvbl9jbGllbnQJKmNsaWVudDsKLX07Ci0KLS8qIENvbW1vbiAqLwotI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfU0VUX1VJX1BST1BFUlRZIDB4MDAwMTExMDMKLS8qIFNldCBhIFVJIHByb3BlcnR5ICovCi0jZGVmaW5lIFZTU19JQ09NTU9OX0NNRF9NQVBfTUVNT1JZICAgMHgwMDAxMTAyNQotI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfVU5NQVBfTUVNT1JZIDB4MDAwMTEwMjYKLS8qIEdlbmVyYWwgc2hhcmVkIG1lbW9yeTsgYnl0ZS1hY2Nlc3NpYmxlLCA0IGtCLWFsaWduZWQuICovCi0jZGVmaW5lIFZTU19JQ09NTU9OX01BUF9NRU1PUllfU0hNRU04XzRLX1BPT0wgIDMKLQotc3RydWN0IHZzc19pY29tbW9uX2NtZF9tYXBfbWVtb3J5X3QgewotCXVpbnQzMl90IHBoeXNfYWRkcjsKLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGEgbWVtb3J5IHJlZ2lvbjsgbXVzdCBiZSBhdCBsZWFzdAotCSAqICA0IGtCIGFsaWduZWQuCi0JICovCi0KLQl1aW50MzJfdCBtZW1fc2l6ZTsKLQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlZ2lvbjsgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMzIuICovCi0KLQl1aW50MTZfdCBtZW1fcG9vbF9pZDsKLQkvKiBUeXBlIG9mIG1lbW9yeSBiZWluZyBwcm92aWRlZC4gVGhlIG1lbW9yeSBJRCBpbXBsaWNpdGx5IGRlZmluZXMKLQkgKiAgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgbWVtb3J5LiBUaGUgY2hhcmFjdGVyaXN0aWNzIG1pZ2h0IGluY2x1ZGUKLQkgKiAgYWxpZ25tZW50IHR5cGUsIHBlcm1pc3Npb25zLCBldGMuCi0JICogTWVtb3J5IHBvb2wgSUQuIFBvc3NpYmxlIHZhbHVlczoKLQkgKiAzIC0tIFZTU19JQ09NTU9OX01FTV9UWVBFX1NITUVNOF80S19QT09MLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pY29tbW9uX2NtZF91bm1hcF9tZW1vcnlfdCB7Ci0JdWludDMyX3QgcGh5c19hZGRyOwotCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYSBtZW1vcnkgcmVnaW9uOyBtdXN0IGJlIGF0IGxlYXN0Ci0JICogIDQga0IgYWxpZ25lZC4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfbWFwX21lbW9yeV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2ljb21tb25fY21kX21hcF9tZW1vcnlfdCB2c3NfbWFwX21lbTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfdW5tYXBfbWVtb3J5X2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfdW5tYXBfbWVtb3J5X3QgdnNzX3VubWFwX21lbTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfcGFyYW1fZW5kcG9pbnRfbWVkaWFfZm9ybWF0X2luZm9fdCB7Ci0JLyogQUZFIHBvcnQgSUQgdG8gd2hpY2ggdGhpcyBtZWRpYSBmb3JtYXQgY29ycmVzcG9uZHMgdG8uICovCi0JdWludDMyX3QgcG9ydF9pZDsKLQkvKgotCSAqIE51bWJlciBvZiBjaGFubmVscyBvZiBkYXRhLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDEgdG8gOAotCSAqLwotCXVpbnQxNl90IG51bV9jaGFubmVsczsKLQkvKgotCSAqIEJpdHMgcGVyIHNhbXBsZSBvZiBkYXRhLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDE2IGFuZCAyNAotCSAqLwotCXVpbnQxNl90IGJpdHNfcGVyX3NhbXBsZTsKLQkvKgotCSAqIFNhbXBsaW5nIHJhdGUgaW4gSHouCi0JICogU3VwcG9ydGVkIHZhbHVlczogODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLAotCSAqIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIGFuZCAxOTIwMDAKLQkgKi8KLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQkvKgotCSAqIFRoZSBjaGFubmVsW2ldIG1hcHBpbmcgZGVzY3JpYmVzIGNoYW5uZWwgaS4gRWFjaCBlbGVtZW50IGkKLQkgKiBvZiB0aGUgYXJyYXkgZGVzY3JpYmVzIGNoYW5uZWwgaSBpbnNpZGUgdGhlIGRhdGEgYnVmZmVyLiBBbgotCSAqIHVudXNlZCBvciB1bmtub3duIGNoYW5uZWwgaXMgc2V0IHRvIDAuCi0JICovCi0JdWludDhfdCBjaGFubmVsX21hcHBpbmdbVlNTX05VTV9DSEFOTkVMU19NQVhdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19wYXJhbV92b2Nwcm9jX2Rldl9jaGFubmVsX2luZm9fdCB7Ci0JdWludDMyX3QgbnVtX2NoYW5uZWxzOwotCXVpbnQzMl90IGJpdHNfcGVyX3NhbXBsZTsKLQl1aW50OF90IGNoYW5uZWxfbWFwcGluZ1tWU1NfTlVNX0NIQU5ORUxTX01BWF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX3BhcmFtX21mY19jb25maWdfaW5mb190IHsKLQl1aW50MzJfdCBzYW1wbGVfcmF0ZTsKLQl1aW50MTZfdCBiaXRzX3Blcl9zYW1wbGU7Ci0JdWludDE2X3QgbnVtX2NoYW5uZWxzOwotCXVpbnQxNl90IGNoYW5uZWxfdHlwZVtWU1NfTlVNX0NIQU5ORUxTX01BWF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2ljb21tb25fcGFyYW1fZGF0YV90IHsKLQkvKiBWYWxpZCBJRCBvZiB0aGUgbW9kdWxlLiAqLwotCXVpbnQzMl90IG1vZHVsZV9pZDsKLQkvKiBWYWxpZCBJRCBvZiB0aGUgcGFyYW1ldGVyLiAqLwotCXVpbnQzMl90IHBhcmFtX2lkOwotCS8qCi0JICogRGF0YSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgcmVsYXRpbmcgdG8gdGhlIHBhcmFtX2lkL21vZHVsZV9pZAotCSAqIGNvbWJpbmF0aW9uIGluIHVpbnQ4X3QgYnl0ZXMuCi0JICovCi0JdWludDE2X3QgcGFyYW1fc2l6ZTsKLQkvKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIHplcm8uICovCi0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JLyoKLQkgKiBQYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIHdoZW4gaW5iYW5kLiBTaG91bGQgaGF2ZSBzaXplIHBhcmFtX3NpemUuCi0JICogQml0IHNpemUgb2YgcGF5bG9hZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KLQkgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCB2c3NfcGFyYW1fZW5kcG9pbnRfbWVkaWFfZm9ybWF0X2luZm9fdCBtZWRpYV9mb3JtYXRfaW5mbzsKLQl9OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pY29tbW9uX3BhcmFtX2RhdGFfY2hhbm5lbF9pbmZvX3YyX3QgewotCS8qIFZhbGlkIElEIG9mIHRoZSBtb2R1bGUuICovCi0JdWludDMyX3QgbW9kdWxlX2lkOwotCS8qIFZhbGlkIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCi0JdWludDMyX3QgcGFyYW1faWQ7Ci0JLyoKLQkgKiBEYXRhIHNpemUgb2YgdGhlIHN0cnVjdHVyZSByZWxhdGluZyB0byB0aGUgcGFyYW1faWQvbW9kdWxlX2lkCi0JICogY29tYmluYXRpb24gaW4gdWludDhfdCBieXRlcy4KLQkgKi8KLQl1aW50MTZfdCBwYXJhbV9zaXplOwotCS8qIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgdG8gemVyby4gKi8KLQl1aW50MTZfdCByZXNlcnZlZDsKLQlzdHJ1Y3QgdnNzX3BhcmFtX3ZvY3Byb2NfZGV2X2NoYW5uZWxfaW5mb190IGNoYW5uZWxfaW5mbzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3BhcmFtX2NoYW5uZWxfaW5mb192Ml90IHsKLQkvKgotCSAqIFBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzIChwaHlzaWNhbC92aXJ0dWFsKS4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGlzIHdpdGhpbiB0aGUgbWVzc2FnZSBwYXlsb2FkCi0JICogKGluLWJhbmQpLCBzZXQgdGhpcyBmaWVsZCB0byAwLiBUaGUgcGFyYW1ldGVyIGRhdGEgYmVnaW5zIGF0IHRoZQotCSAqIHNwZWNpZmllZCBkYXRhIHBheWxvYWQgYWRkcmVzcy4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBpcyBvdXQtb2YtYmFuZCwgdGhpcyBmaWVsZCBpcyB0aGUgaGFuZGxlIHRvCi0JICogdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBtZW1vcnkgdGhhdCBob2xkcyB0aGUgcGFyYW1ldGVyCi0JICogZGF0YS4KLQkgKi8KLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCS8qCi0JICogTG9jYXRpb24gb2YgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWQuCi0JICoKLQkgKiBUaGUgcGF5bG9hZCBpcyBhbiBhcnJheSBvZiB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX3QuIElmIHRoZQotCSAqIG1lbV9oYW5kbGUgaXMgMCwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLgotCSAqLwotCXVpbnQ2NF90IG1lbV9hZGRyZXNzOwotCS8qIFNpemUgb2YgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgaW4gYnl0ZXMuICovCi0JdWludDMyX3QgbWVtX3NpemU7Ci0Jc3RydWN0IHZzc19pY29tbW9uX3BhcmFtX2RhdGFfY2hhbm5lbF9pbmZvX3YyX3QgcGFyYW1fZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX21mY19jb25maWdfdjJfdCB7Ci0JLyogVmFsaWQgSUQgb2YgdGhlIG1vZHVsZS4gKi8KLQl1aW50MzJfdCBtb2R1bGVfaWQ7Ci0JLyogVmFsaWQgSUQgb2YgdGhlIHBhcmFtZXRlci4gKi8KLQl1aW50MzJfdCBwYXJhbV9pZDsKLQkvKgotCSAqIERhdGEgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHJlbGF0aW5nIHRvIHRoZSBwYXJhbV9pZC9tb2R1bGVfaWQKLQkgKiBjb21iaW5hdGlvbiBpbiB1aW50OF90IGJ5dGVzLgotCSAqLwotCXVpbnQxNl90IHBhcmFtX3NpemU7Ci0JLyogVGhpcyBmaWVsZCBtdXN0IGJlIHNldCB0byB6ZXJvLiAqLwotCXVpbnQxNl90IHJlc2VydmVkOwotCXN0cnVjdCB2c3NfcGFyYW1fbWZjX2NvbmZpZ19pbmZvX3QgbWZjX2NvbmZpZ19pbmZvOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pY29tbW9uX2NtZF9zZXRfcGFyYW1fbWZjX2NvbmZpZ192Ml90IHsKLQkvKgotCSAqIFBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzIChwaHlzaWNhbC92aXJ0dWFsKS4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGlzIHdpdGhpbiB0aGUgbWVzc2FnZSBwYXlsb2FkCi0JICogKGluLWJhbmQpLCBzZXQgdGhpcyBmaWVsZCB0byAwLiBUaGUgcGFyYW1ldGVyIGRhdGEgYmVnaW5zIGF0IHRoZQotCSAqIHNwZWNpZmllZCBkYXRhIHBheWxvYWQgYWRkcmVzcy4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBpcyBvdXQtb2YtYmFuZCwgdGhpcyBmaWVsZCBpcyB0aGUgaGFuZGxlIHRvCi0JICogdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBtZW1vcnkgdGhhdCBob2xkcyB0aGUgcGFyYW1ldGVyCi0JICogZGF0YS4KLQkgKi8KLQotCXVpbnQzMl90IG1lbV9oYW5kbGU7Ci0JLyoKLQkgKiBMb2NhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZC4KLQkgKgotCSAqIFRoZSBwYXlsb2FkIGlzIGFuIGFycmF5IG9mIHZzc19pY29tbW9uX3BhcmFtX2RhdGFfdC4gSWYgdGhlCi0JICogbWVtX2hhbmRsZSBpcyAwLCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuCi0JICovCi0JdWludDY0X3QgbWVtX2FkZHJlc3M7Ci0JLyogU2l6ZSBvZiB0aGUgcGFyYW1ldGVyIGRhdGEgcGF5bG9hZCBpbiBieXRlcy4gKi8KLQl1aW50MzJfdCBtZW1fc2l6ZTsKLQotCXN0cnVjdCB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX21mY19jb25maWdfdjJfdCBwYXJhbV9kYXRhOwotfSBfX3BhY2tlZDsKLQotLyogUGF5bG9hZCBzdHJ1Y3R1cmUgZm9yIHRoZSBWU1NfSUNPTU1PTl9DTURfU0VUX1BBUkFNX1YyIGNvbW1hbmQuICovCi1zdHJ1Y3QgdnNzX2ljb21tb25fY21kX3NldF9wYXJhbV92Ml90IHsKLQkvKgotCSAqIFBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBhZGRyZXNzIChwaHlzaWNhbC92aXJ0dWFsKS4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBwYXlsb2FkIGlzIHdpdGhpbiB0aGUgbWVzc2FnZSBwYXlsb2FkCi0JICogKGluLWJhbmQpLCBzZXQgdGhpcyBmaWVsZCB0byAwLiBUaGUgcGFyYW1ldGVyIGRhdGEgYmVnaW5zIGF0IHRoZQotCSAqIHNwZWNpZmllZCBkYXRhIHBheWxvYWQgYWRkcmVzcy4KLQkgKgotCSAqIElmIHRoZSBwYXJhbWV0ZXIgZGF0YSBpcyBvdXQtb2YtYmFuZCwgdGhpcyBmaWVsZCBpcyB0aGUgaGFuZGxlIHRvCi0JICogdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIHNoYXJlZCBtZW1vcnkgdGhhdCBob2xkcyB0aGUgcGFyYW1ldGVyCi0JICogZGF0YS4KLQkgKi8KLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCS8qCi0JICogTG9jYXRpb24gb2YgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWQuCi0JICoKLQkgKiBUaGUgcGF5bG9hZCBpcyBhbiBhcnJheSBvZiB2c3NfaWNvbW1vbl9wYXJhbV9kYXRhX3QuIElmIHRoZQotCSAqIG1lbV9oYW5kbGUgaXMgMCwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLgotCSAqLwotCXVpbnQ2NF90IG1lbV9hZGRyZXNzOwotCS8qIFNpemUgb2YgdGhlIHBhcmFtZXRlciBkYXRhIHBheWxvYWQgaW4gYnl0ZXMuICovCi0JdWludDMyX3QgbWVtX3NpemU7Ci0JLyogUGFyYW1ldGVyIGRhdGEgcGF5bG9hZCB3aGVuIHRoZSBkYXRhIGlzIGluYmFuZC4gKi8KLQlzdHJ1Y3QgdnNzX2ljb21tb25fcGFyYW1fZGF0YV90IHBhcmFtX2RhdGE7Ci19IF9fcGFja2VkOwotCi0vKiBUTyBNVk0gY29tbWFuZHMgKi8KLSNkZWZpbmUgVlNTX0lNVk1fQ01EX0NSRUFURV9QQVNTSVZFX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMEZGCi0vKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLwotCi0jZGVmaW5lIFZTU19JTVZNX0NNRF9TRVRfUE9MSUNZX0RVQUxfQ09OVFJPTAkweDAwMDExMzI3Ci0vKgotICogVlNTX0lNVk1fQ01EX1NFVF9QT0xJQ1lfRFVBTF9DT05UUk9MCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBjb21tYW5kIGlzIHJlcXVpcmVkIHRvIGxldCBNVk0ga25vdwotICogd2hvIGlzIGluIGNvbnRyb2wgb2Ygc2Vzc2lvbi4KLSAqIFBheWxvYWQ6IERlZmluZWQgYnkgdnNzX2ltdm1fY21kX3NldF9wb2xpY3lfZHVhbF9jb250cm9sX3QuCi0gKiBSZXN1bHQ6IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLgotICovCi0KLSNkZWZpbmUgVlNTX0lNVk1fQ01EX0NSRUFURV9GVUxMX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMEZFCi0vKiBDcmVhdGUgYSBuZXcgZnVsbCBjb250cm9sIE1WTSBzZXNzaW9uLiAqLwotCi0jZGVmaW5lIEFQUlYyX0lCQVNJQ19DTURfREVTVFJPWV9TRVNTSU9OCQkweDAwMDEwMDNDCi0vKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLwotCi0jZGVmaW5lIFZTU19JTVZNX0NNRF9BVFRBQ0hfU1RSRUFNCQkJMHgwMDAxMTIzQwotLyogQXR0YWNoIGEgc3RyZWFtIHRvIHRoZSBNVk0uICovCi0KLSNkZWZpbmUgVlNTX0lNVk1fQ01EX0RFVEFDSF9TVFJFQU0JCQkweDAwMDExMjNECi0vKiBEZXRhY2ggYSBzdHJlYW0gZnJvbSB0aGUgTVZNLiAqLwotCi0jZGVmaW5lIFZTU19JTVZNX0NNRF9BVFRBQ0hfVk9DUFJPQwkJICAgICAgIDB4MDAwMTEyM0UKLS8qIEF0dGFjaCBhIHZvY3Byb2MgdG8gdGhlIE1WTS4gVGhlIE1WTSB3aWxsIHN5bW1ldHJpY2FsbHkgY29ubmVjdCB0aGlzIHZvY3Byb2MKLSAqIHRvIGFsbCB0aGUgc3RyZWFtcyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gaXQuCi0gKi8KLQotI2RlZmluZSBWU1NfSU1WTV9DTURfREVUQUNIX1ZPQ1BST0MJCQkweDAwMDExMjNGCi0vKiBEZXRhY2ggYSB2b2Nwcm9jIGZyb20gdGhlIE1WTS4gVGhlIE1WTSB3aWxsIHN5bW1ldHJpY2FsbHkgZGlzY29ubmVjdCB0aGlzCi0gKiB2b2Nwcm9jIGZyb20gYWxsIHRoZSBzdHJlYW1zIHRvIHdoaWNoIGl0IGlzIGN1cnJlbnRseSBhdHRhY2hlZC4KLSAqLwotCi0jZGVmaW5lIFZTU19JTVZNX0NNRF9TVEFSVF9WT0lDRQkJCTB4MDAwMTExOTAKLS8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCi0KLSNkZWZpbmUgVlNTX0lNVk1fQ01EX1NUQU5EQllfVk9JQ0UgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTExOTEKLS8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCi0KLSNkZWZpbmUgVlNTX0lNVk1fQ01EX1NUT1BfVk9JQ0UJCQkJMHgwMDAxMTE5MgotLyoqPCBObyBwYXlsb2FkLiBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KLQotI2RlZmluZSBWU1NfSU1WTV9DTURfUEFVU0VfVk9JQ0UJCQkweDAwMDExMzdECi0vKiBObyBwYXlsb2FkLiBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfQVRUQUNIX1ZPQ1BST0MJCQkweDAwMDExMEY4Ci0vKio8IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLwotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9ERVRBQ0hfVk9DUFJPQwkJCTB4MDAwMTEwRjkKLS8qKjwgV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCi0KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfU0VUX1RUWV9NT0RFCQkJMHgwMDAxMTE5NgotLyoqPCBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KLQotI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfU0VUX05FVFdPUksJCQkweDAwMDExMTlDCi0vKiBTZXQgdGhlIG5ldHdvcmsgdHlwZS4gKi8KLQotI2RlZmluZSBWU1NfSUNPTU1PTl9DTURfU0VUX1ZPSUNFX1RJTUlORwkJMHgwMDAxMTFFMAotLyogU2V0IHRoZSB2b2ljZSB0aW1pbmcgcGFyYW1ldGVycy4gKi8KLQotI2RlZmluZSBWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMCQkJMHgwMDAxMTMzNAotI2RlZmluZSBWU1NfSU1FTU9SWV9SU1BfTUFQCQkJCTB4MDAwMTEzMzYKLSNkZWZpbmUgVlNTX0lNRU1PUllfQ01EX1VOTUFQCQkJCTB4MDAwMTEzMzcKLSNkZWZpbmUgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTkVUV09SSwkJCTB4MDAwMTEzN0EKLSNkZWZpbmUgVlNTX0lNVk1fQ01EX1NFVF9DQUxfTUVESUFfVFlQRQkJMHgwMDAxMTM3QgotI2RlZmluZSBWU1NfSUhEVk9JQ0VfQ01EX0VOQUJMRQkJCQkweDAwMDEzMEEyCi0jZGVmaW5lIFZTU19JSERWT0lDRV9DTURfRElTQUJMRQkJCTB4MDAwMTMwQTMKLQotZW51bSBtc21fYXVkaW9fdm9jX3JhdGUgewotCQlWT0NfMF9SQVRFLCAvKiBCbGFuayBmcmFtZSAqLwotCQlWT0NfOF9SQVRFLCAvKiAxLzggcmF0ZSAgICAqLwotCQlWT0NfNF9SQVRFLCAvKiAxLzQgcmF0ZSAgICAqLwotCQlWT0NfMl9SQVRFLCAvKiAxLzIgcmF0ZSAgICAqLwotCQlWT0NfMV9SQVRFLCAgLyogRnVsbCByYXRlICAgKi8KLQkJVk9DXzhfUkFURV9OQyAgLyogTm9uY3JpdGljYWwgMS84IHJhdGUgICAqLwotfTsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfdHR5X21vZGVfdCB7Ci0JdWludDMyX3QgbW9kZTsKLQkvKio8Ci0JICogVFRZIG1vZGUuCi0JICoKLQkgKiAwIDogVFRZIGRpc2FibGVkCi0JICogMSA6IEhDTwotCSAqIDIgOiBWQ08KLQkgKiAzIDogRlVMTAotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9hdHRhY2hfdm9jcHJvY190IHsKLQl1aW50MTZfdCBoYW5kbGU7Ci0JLyoqPCBIYW5kbGUgb2Ygdm9jcHJvYyBiZWluZyBhdHRhY2hlZC4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfZGV0YWNoX3ZvY3Byb2NfdCB7Ci0JdWludDE2X3QgaGFuZGxlOwotCS8qKjwgSGFuZGxlIG9mIHZvY3Byb2MgYmVpbmcgZGV0YWNoZWQuICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2ltdm1fY21kX2F0dGFjaF9zdHJlYW1fdCB7Ci0JdWludDE2X3QgaGFuZGxlOwotCS8qIFRoZSBzdHJlYW0gaGFuZGxlIHRvIGF0dGFjaC4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW12bV9jbWRfZGV0YWNoX3N0cmVhbV90IHsKLQl1aW50MTZfdCBoYW5kbGU7Ci0JLyogVGhlIHN0cmVhbSBoYW5kbGUgdG8gZGV0YWNoLiAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pY29tbW9uX2NtZF9zZXRfbmV0d29ya190IHsKLQl1aW50MzJfdCBuZXR3b3JrX2lkOwotCS8qIE5ldHdvcmsgSUQuIChSZWZlciB0byBWU1NfTkVUV09SS19JRF9YWFgpLiAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pY29tbW9uX2NtZF9zZXRfdm9pY2VfdGltaW5nX3QgewotCXVpbnQxNl90IG1vZGU7Ci0JLyoKLQkgKiBUaGUgdm9jb2RlciBmcmFtZSBzeW5jaHJvbml6YXRpb24gbW9kZS4KLQkgKgotCSAqIDAgOiBObyBmcmFtZSBzeW5jLgotCSAqIDEgOiBIYXJkIFZGUiAoMjBtcyBWb2NvZGVyIEZyYW1lIFJlZmVyZW5jZSBpbnRlcnJ1cHQpLgotCSAqLwotCXVpbnQxNl90IGVuY19vZmZzZXQ7Ci0JLyoKLQkgKiBUaGUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyBmcm9tIHRoZSBWRlIgdG8gZGVsaXZlciBhIFR4IHZvY29kZXIKLQkgKiBwYWNrZXQuIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGxlc3MgdGhhbiAyMDAwMHVzLgotCSAqLwotCXVpbnQxNl90IGRlY19yZXFfb2Zmc2V0OwotCS8qCi0JICogVGhlIG9mZnNldCBpbiBtaWNyb3NlY29uZHMgZnJvbSB0aGUgVkZSIHRvIHJlcXVlc3QgZm9yIGFuIFJ4IHZvY29kZXIKLQkgKiBwYWNrZXQuIFRoZSBvZmZzZXQgc2hvdWxkIGJlIGxlc3MgdGhhbiAyMDAwMHVzLgotCSAqLwotCXVpbnQxNl90IGRlY19vZmZzZXQ7Ci0JLyoKLQkgKiBUaGUgb2Zmc2V0IGluIG1pY3Jvc2Vjb25kcyBmcm9tIHRoZSBWRlIgdG8gaW5kaWNhdGUgdGhlIGRlYWRsaW5lIHRvCi0JICogcmVjZWl2ZSBhbiBSeCB2b2NvZGVyIHBhY2tldC4gVGhlIG9mZnNldCBzaG91bGQgYmUgbGVzcyB0aGFuIDIwMDAwdXMuCi0JICogUnggdm9jb2RlciBwYWNrZXRzIHJlY2VpdmVkIGFmdGVyIHRoaXMgZGVhZGxpbmUgYXJlIG5vdCBndWFyYW50ZWVkIHRvCi0JICogYmUgcHJvY2Vzc2VkLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pbXZtX2NtZF9jcmVhdGVfY29udHJvbF9zZXNzaW9uX3QgewotCWNoYXIgbmFtZVtTRVNTSU9OX05BTUVfTEVOXTsKLQkvKgotCSAqIEEgdmFyaWFibGUtc2l6ZWQgc3RyZWFtIG5hbWUuCi0JICoKLQkgKiBUaGUgc3RyZWFtIG5hbWUgc2l6ZSBpcyB0aGUgcGF5bG9hZCBzaXplIG1pbnVzIHRoZSBzaXplIG9mIHRoZSBvdGhlcgotCSAqIGZpZWxkcy4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLQotc3RydWN0IHZzc19pbXZtX2NtZF9zZXRfcG9saWN5X2R1YWxfY29udHJvbF90IHsKLQlib29sIGVuYWJsZV9mbGFnOwotCS8qIFNldCB0byBUUlVFIHRvIGVuYWJsZSBtb2RlbSBzdGF0ZSBtYWNoaW5lIGNvbnRyb2wgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtdm1fYXR0YWNoX3ZvY3Byb2NfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9hdHRhY2hfdm9jcHJvY190IG12bV9hdHRhY2hfY3ZwX2hhbmRsZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtdm1fZGV0YWNoX3ZvY3Byb2NfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9kZXRhY2hfdm9jcHJvY190IG12bV9kZXRhY2hfY3ZwX2hhbmRsZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtdm1fY3JlYXRlX2N0bF9zZXNzaW9uX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaW12bV9jbWRfY3JlYXRlX2NvbnRyb2xfc2Vzc2lvbl90IG12bV9zZXNzaW9uOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG12bV9tb2RlbV9kdWFsX2NvbnRyb2xfc2Vzc2lvbl9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9wb2xpY3lfZHVhbF9jb250cm9sX3Qgdm9pY2VfY3RsOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG12bV9zZXRfdHR5X21vZGVfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfdHR5X21vZGVfdCB0dHlfbW9kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtdm1fYXR0YWNoX3N0cmVhbV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2ltdm1fY21kX2F0dGFjaF9zdHJlYW1fdCBhdHRhY2hfc3RyZWFtOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG12bV9kZXRhY2hfc3RyZWFtX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaW12bV9jbWRfZGV0YWNoX3N0cmVhbV90IGRldGFjaF9zdHJlYW07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgbXZtX3NldF9uZXR3b3JrX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X25ldHdvcmtfdCBuZXR3b3JrOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IG12bV9zZXRfdm9pY2VfdGltaW5nX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3ZvaWNlX3RpbWluZ190IHRpbWluZzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBtdm1fc2V0X2hkX2VuYWJsZV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV9kZXNjcmlwdG9yX3QgewotCXVpbnQzMl90IG1lbV9hZGRyZXNzX2xzdzsKLQl1aW50MzJfdCBtZW1fYWRkcmVzc19tc3c7Ci0JLyoKLQkgKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRhYmxlLiBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQKLQkgKiB0byBMQ00oIGNhY2hlX2xpbmVfc2l6ZSwgcGFnZV9hbGlnbiwgbWF4X2RhdGFfd2lkdGggKSwgd2hlcmUgdGhlCi0JICogYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGluICNWU1NfSU1FTU9SWV9DTURfTUFQX1BIWVNJQ0FMLCBhbmQKLQkgKiBMQ00gPSBMZWFzdCBDb21tb24gTXVsdGlwbGUuIFRoZSB0YWJsZSBhdCB0aGUgYWRkcmVzcyBtdXN0IGhhdmUKLQkgKiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSAjdnNzX2ltZW1vcnlfdGFibGVfdC4KLQkgKi8KLQl1aW50MzJfdCBtZW1fc2l6ZTsKLQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSB0YWJsZS4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW1lbW9yeV9ibG9ja190IHsKLQl1aW50NjRfdCBtZW1fYWRkcmVzczsKLQkvKgotCSAqIEJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJsb2NrLiBUaGUgYWRkcmVzcyBpcyB2aXJ0dWFsIGZvciB2aXJ0dWFsCi0JICogbWVtb3J5IGFuZCBwaHlzaWNhbCBmb3IgcGh5c2ljYWwgbWVtb3J5LiBUaGUgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQKLQkgKiB0byBMQ00oIGNhY2hlX2xpbmVfc2l6ZSwgcGFnZV9hbGlnbiwgbWF4X2RhdGFfd2lkdGggKSwgd2hlcmUgdGhlCi0JICogYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkIGluIFZTU19JTUVNT1JZX0NNRF9NQVBfVklSVFVBTCBvcgotCSAqIFZTU19JTUVNT1JZX0NNRF9NQVBfUEhZU0lDQUwsIGFuZCBMQ00gPSBMZWFzdCBDb21tb24gTXVsdGlwbGUuCi0JICovCi0JdWludDMyX3QgbWVtX3NpemU7Ci0JLyoKLQkgKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgYmxvY2suIFRoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YKLQkgKiBwYWdlX2FsaWduLCB3aGVyZSBwYWdlX2FsaWduIGlzIHNwZWNpZmllZCBpbgotCSAqIFZTU19JTUVNT1JZX0NNRF9NQVBfVklSVFVBTCBvciAjVlNTX0lNRU1PUllfQ01EX01BUF9QSFlTSUNBTC4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW1lbW9yeV90YWJsZV90IHsKLQlzdHJ1Y3QgdnNzX2ltZW1vcnlfdGFibGVfZGVzY3JpcHRvcl90IG5leHRfdGFibGVfZGVzY3JpcHRvcjsKLQkvKgotCSAqIFNwZWNpZmllcyB0aGUgbmV4dCB0YWJsZS4gSWYgdGhlcmUgaXMgbm8gbmV4dCB0YWJsZSwKLQkgKiBzZXQgdGhlIHNpemUgb2YgdGhlIHRhYmxlIHRvIDAgYW5kIHRoZSB0YWJsZSBhZGRyZXNzIGlzIGlnbm9yZWQuCi0JICovCi0Jc3RydWN0IHZzc19pbWVtb3J5X2Jsb2NrX3QgYmxvY2tzW05VTV9PRl9NRU1PUllfQkxPQ0tTXTsKLQkvKiBTcGVjaWZpZXMgb25lIG9yZSBtb3JlIG1lbW9yeSBibG9ja3MuICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2ltZW1vcnlfY21kX21hcF9waHlzaWNhbF90IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pbWVtb3J5X3RhYmxlX2Rlc2NyaXB0b3JfdCB0YWJsZV9kZXNjcmlwdG9yOwotCWJvb2wgaXNfY2FjaGVkOwotCS8qCi0JICogSW5kaWNhdGVzIGNhY2hlZCBvciB1bmNhY2hlZCBtZW1vcnkuIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogVFJVRSAtIENhY2hlZC4KLQkgKi8KLQl1aW50MTZfdCBjYWNoZV9saW5lX3NpemU7Ci0JLyogQ2FjaGUgbGluZSBzaXplIGluIGJ5dGVzLiBTdXBwb3J0ZWQgdmFsdWVzOiAxMjggKi8KLQl1aW50MzJfdCBhY2Nlc3NfbWFzazsKLQkvKgotCSAqIENWRCdzIGFjY2VzcyBwZXJtaXNzaW9uIHRvIHRoZSBtZW1vcnkgd2hpbGUgaXQgaXMgbWFwcGVkLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogYml0IDAgLSBJZiBzZXQsIHRoZSBtZW1vcnkgaXMgcmVhZGFibGUuCi0JICogYml0IDEgLSBJZiBzZXQsIHRoZSBtZW1vcnkgaXMgd3JpdGFibGUuCi0JICovCi0JdWludDMyX3QgcGFnZV9hbGlnbjsKLQkvKiBQYWdlIGZyYW1lIGFsaWdubWVudCBpbiBieXRlcy4gU3VwcG9ydGVkIHZhbHVlczogNDA5NiAqLwotCXVpbnQ4X3QgbWluX2RhdGFfd2lkdGg7Ci0JLyoKLQkgKiBNaW5pbXVtIG5hdGl2ZSBkYXRhIHR5cGUgd2lkdGggaW4gYml0cyB0aGF0IGNhbiBiZSBhY2Nlc3NlZC4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzOiA4Ci0JICovCi0JdWludDhfdCBtYXhfZGF0YV93aWR0aDsKLQkvKgotCSAqIE1heGltdW0gbmF0aXZlIGRhdGEgdHlwZSB3aWR0aCBpbiBiaXRzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXM6IDY0Ci0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2ltdm1fY21kX3NldF9jYWxfbmV0d29ya190IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0JdWludDMyX3QgbmV0d29ya19pZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW12bV9jbWRfc2V0X2NhbF9tZWRpYV90eXBlX3QgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdCBtZWRpYV9pZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaW1lbW9yeV9jbWRfdW5tYXBfdCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXVpbnQzMl90IG1lbV9oYW5kbGU7Ci19IF9fcGFja2VkOwotCi0vKiBUTyBDVlMgY29tbWFuZHMgKi8KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0NSRUFURV9QQVNTSVZFX0NPTlRST0xfU0VTU0lPTgkweDAwMDExMTQwCi0vKio8IFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLwotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT04JMHgwMDAxMTBGNwotLyogQ3JlYXRlIGEgbmV3IGZ1bGwgY29udHJvbCBzdHJlYW0gc2Vzc2lvbi4gKi8KLQotI2RlZmluZSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTgkJMHgwMDAxMDAzQwotCi0vKgotICogVGhpcyBjb21tYW5kIGNoYW5nZXMgdGhlIG11dGUgc2V0dGluZy4gVGhlIG5ldyBtdXRlIHNldHRpbmcgd2lsbAotICogYmUgYXBwbGllZCBvdmVyIHRoZSBzcGVjaWZpZWQgcmFtcCBkdXJhdGlvbi4KLSAqLwotI2RlZmluZSBWU1NfSVZPTFVNRV9DTURfTVVURV9WMgkJCQkweDAwMDExMzhCCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1JFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEFfVjIgICAgMHgwMDAxMTM2OQotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEEgICAgIDB4MDAwMTEyN0EKLQotI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAgIDB4MDAwMTMwN0QKLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAweDAwMDEzMDdFCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9NRURJQV9UWVBFCQkJMHgwMDAxMTE4NgotLyogU2V0IG1lZGlhIHR5cGUgb24gdGhlIHN0cmVhbS4gKi8KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfU0VORF9FTkNfQlVGRkVSCQkJMHgwMDAxMTAxNQotLyogRXZlbnQgc2VudCBieSB0aGUgc3RyZWFtIHRvIGl0cyBjbGllbnQgdG8gcHJvdmlkZSBhbiBlbmNvZGVkIHBhY2tldC4gKi8KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfUkVRVUVTVF9ERUNfQlVGRkVSCQkweDAwMDExMDE3Ci0vKiBFdmVudCBzZW50IGJ5IHRoZSBzdHJlYW0gdG8gaXRzIGNsaWVudCByZXF1ZXN0aW5nIGZvciBhIGRlY29kZXIgcGFja2V0LgotICogVGhlIGNsaWVudCBzaG91bGQgcmVzcG9uZCB3aXRoIGEgVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUiBldmVudC4KLSAqLwotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0VWVF9PT0JfTk9USUZZX0RFQ19CVUZGRVJfUkVRVUVTVAkweDAwMDExMzZFCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1NFTkRfREVDX0JVRkZFUgkJCTB4MDAwMTEwMTYKLS8qIEV2ZW50IHNlbnQgYnkgdGhlIGNsaWVudCB0byB0aGUgc3RyZWFtIGluIHJlc3BvbnNlIHRvIGEKLSAqIFZTU19JU1RSRUFNX0VWVF9SRVFVRVNUX0RFQ19CVUZGRVIgZXZlbnQsIHByb3ZpZGluZyBhIGRlY29kZXIgcGFja2V0LgotICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1ZPQ19BTVJfU0VUX0VOQ19SQVRFCQkweDAwMDExMTNFCi0vKiBTZXQgQU1SIGVuY29kZXIgcmF0ZS4gKi8KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9DTURfVk9DX0FNUldCX1NFVF9FTkNfUkFURQkJMHgwMDAxMTEzRgotLyogU2V0IEFNUi1XQiBlbmNvZGVyIHJhdGUuICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX0NETUFfU0VUX0VOQ19NSU5NQVhfUkFURQkweDAwMDExMDE5Ci0vKiBTZXQgZW5jb2RlciBtaW5pbXVtIGFuZCBtYXhpbXVtIHJhdGUuICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9FTkNfRFRYX01PREUJCTB4MDAwMTEwMUQKLS8qIFNldCBlbmNvZGVyIERUWCBtb2RlLiAqLwotCi0jZGVmaW5lIE1PRFVMRV9JRF9WT0lDRV9NT0RVTEVfU1QJCQkweDAwMDEwRUUzCi0jZGVmaW5lIFZPSUNFX1BBUkFNX01PRF9FTkFCTEUJCQkJMHgwMDAxMEUwMAotI2RlZmluZSBNT0RfRU5BQkxFX1BBUkFNX0xFTgkJCQk0Ci0KLSNkZWZpbmUgVlNTX0lQTEFZQkFDS19DTURfU1RBUlQJCQkJMHgwMDAxMTJCRAotLyogU3RhcnQgaW4tY2FsbCBtdXNpYyBkZWxpdmVyeSBvbiB0aGUgVHggdm9pY2UgcGF0aC4gKi8KLQotI2RlZmluZSBWU1NfSVBMQVlCQUNLX0NNRF9TVE9QCQkJCTB4MDAwMTEyMzkKLS8qIFN0b3AgdGhlIGluLWNhbGwgbXVzaWMgZGVsaXZlcnkgb24gdGhlIFR4IHZvaWNlIHBhdGguICovCi0KLSNkZWZpbmUgVlNTX0lQTEFZQkFDS19QT1JUX0lEX0RFRkFVTFQJCQkweDAwMDBGRkZGCi0vKiBEZWZhdWx0IEFGRSBwb3J0IElELiAqLwotCi0jZGVmaW5lIFZTU19JUExBWUJBQ0tfUE9SVF9JRF9WT0lDRQkJCTB4MDAwMDgwMDUKLS8qIEFGRSBwb3J0IElEIGZvciBWT0lDRSAxLiAqLwotCi0jZGVmaW5lIFZTU19JUExBWUJBQ0tfUE9SVF9JRF9WT0lDRTIJCQkweDAwMDA4MDAyCi0vKiBBRkUgcG9ydCBJRCBmb3IgVk9JQ0UgMi4gKi8KLQotI2RlZmluZSBWU1NfSVJFQ09SRF9DTURfU1RBUlQJCQkJMHgwMDAxMTJCRQotLyogU3RhcnQgaW4tY2FsbCBjb252ZXJzYXRpb24gcmVjb3JkaW5nLiAqLwotI2RlZmluZSBWU1NfSVJFQ09SRF9DTURfU1RPUAkJCQkweDAwMDExMjM3Ci0vKiBTdG9wIGluLWNhbGwgY29udmVyc2F0aW9uIHJlY29yZGluZy4gKi8KLQotI2RlZmluZSBWU1NfSVJFQ09SRF9QT1JUX0lEX0RFRkFVTFQJCQkweDAwMDBGRkZGCi0vKiBEZWZhdWx0IEFGRSBwb3J0IElELiAqLwotCi0jZGVmaW5lIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9OT05FCQkJMHgwMDAxMEY3OAotLyogSW5kaWNhdGVzIG5vIHRhcHBpbmcgZm9yIHNwZWNpZmllZCBwYXRoLiAqLwotCi0jZGVmaW5lIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5ECQkweDAwMDEwRjc5Ci0vKiBJbmRpY2F0ZXMgdGhhdCBzcGVjaWZpZWQgcGF0aCBzaG91bGQgYmUgdGFwcGVkIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLQotI2RlZmluZSBWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX1NURVJFTwkJCTB4MDAwMTBGN0EKLS8qIFNlbGVjdCBUeCBvbiBsZWZ0IGNoYW5uZWwgYW5kIFJ4IG9uIHJpZ2h0IGNoYW5uZWwuICovCi0KLSNkZWZpbmUgVlNTX0lSRUNPUkRfTU9ERV9UWF9SWF9NSVhJTkcJCQkweDAwMDEwRjdCCi0vKiBTZWxlY3QgbWl4ZWQgVHggYW5kIFJ4IHBhdGhzLiAqLwotCi0jZGVmaW5lIFZTU19QQVJBTV9WT0NQUk9DX1RYX0NIQU5ORUxfSU5GTyAgICAgICAgICAgICAgMHgwMDAxMzI4RQotCi0jZGVmaW5lIFZTU19QQVJBTV9WT0NQUk9DX1JYX0NIQU5ORUxfSU5GTyAgICAgICAgICAgICAgMHgwMDAxMzI4RgotCi0jZGVmaW5lIFZTU19QQVJBTV9WT0NQUk9DX0VDX1JFRl9DSEFOTkVMX0lORk8gICAgICAgICAgMHgwMDAxMzI5MAotCi0jZGVmaW5lIFZTU19QQVJBTV9UWF9QT1JUX0VORFBPSU5UX01FRElBX0lORk8JCTB4MDAwMTMyNTMKLQotI2RlZmluZSBWU1NfUEFSQU1fUlhfUE9SVF9FTkRQT0lOVF9NRURJQV9JTkZPCQkweDAwMDEzMjU0Ci0KLSNkZWZpbmUgVlNTX1BBUkFNX0VDX1JFRl9QT1JUX0VORFBPSU5UX01FRElBX0lORk8JMHgwMDAxMzI1NQotCi0jZGVmaW5lIFZTU19NT0RVTEVfQ1ZEX0dFTkVSSUMJCQkJMHgwMDAxMzE2RQotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0VWVF9OT1RfUkVBRFkJCQkweDAwMDExMEZECi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1JFQURZCQkJCTB4MDAwMTEwRkMKLQotI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfT09CX05PVElGWV9ERUNfQlVGRkVSX1JFQURZCTB4MDAwMTEzNkYKLS8qbm90aWZ5IGRzcCB0aGF0IGRlY29kZXIgYnVmZmVyIGlzIHJlYWR5Ki8KLQotI2RlZmluZSBWU1NfSVNUUkVBTV9FVlRfT09CX05PVElGWV9FTkNfQlVGRkVSX1JFQURZCTB4MDAwMTEzNkMKLS8qZHNwIG5vdGlmeWluZyBjbGllbnQgdGhhdCBlbmNvZGVyIGJ1ZmZlciBpcyByZWFkeSovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX09PQl9OT1RJRllfRU5DX0JVRkZFUl9DT05TVU1FRAkweDAwMDExMzZECi0vKm5vdGlmeSBkc3AgdGhhdCBlbmNvZGVyIGJ1ZmZlciBpcyBjb25zdW1lZCovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9PT0JfUEFDS0VUX0VYQ0hBTkdFX0NPTkZJRwkweDAwMDExMzZCCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfSU5CQU5ECTAKLS8qIEluLWJhbmQgcGFja2V0IGV4Y2hhbmdlIG1vZGUuICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fUEFDS0VUX0VYQ0hBTkdFX01PREVfT1VUX09GX0JBTkQJMQotLyogT3V0LW9mLWJhbmQgcGFja2V0IGV4Y2hhbmdlIG1vZGUuICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fQ01EX1NFVF9QQUNLRVRfRVhDSEFOR0VfTU9ERQkweDAwMDExMzZBCi0KLXN0cnVjdCB2c3NfaXBsYXliYWNrX2NtZF9zdGFydF90IHsKLQl1aW50MTZfdCBwb3J0X2lkOwotCS8qCi0JICogQUZFIFBvcnQgSUQgZnJvbSB3aGljaCB0aGUgYXVkaW8gc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgotCSAqIFRvIHVzZSB0aGUgZGVmYXVsdCBBRkUgcHNldWRvIHBvcnQgKDB4ODAwNSksIHNldCB0aGlzIHZhbHVlIHRvCi0JICogI1ZTU19JUExBWUJBQ0tfUE9SVF9JRF9ERUZBVUxULgotCSAqLwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXJlY29yZF9jbWRfc3RhcnRfdCB7Ci0JdWludDMyX3QgcnhfdGFwX3BvaW50OwotCS8qIFRhcCBwb2ludCB0byB1c2Ugb24gdGhlIFJ4IHBhdGguIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgotCSAqIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9OT05FIDogRG8gbm90IHJlY29yZCBSeCBwYXRoLgotCSAqIFZTU19JUkVDT1JEX1RBUF9QT0lOVF9TVFJFQU1fRU5EIDogUnggdGFwIHBvaW50IGlzIGF0IHRoZSBlbmQgb2YKLQkgKiB0aGUgc3RyZWFtLgotCSAqLwotCXVpbnQzMl90IHR4X3RhcF9wb2ludDsKLQkvKiBUYXAgcG9pbnQgdG8gdXNlIG9uIHRoZSBUeCBwYXRoLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKLQkgKiBWU1NfSVJFQ09SRF9UQVBfUE9JTlRfTk9ORSA6IERvIG5vdCByZWNvcmQgdHggcGF0aC4KLQkgKiBWU1NfSVJFQ09SRF9UQVBfUE9JTlRfU1RSRUFNX0VORCA6IFR4IHRhcCBwb2ludCBpcyBhdCB0aGUgZW5kIG9mCi0JICogdGhlIHN0cmVhbS4KLQkgKi8KLQl1aW50MTZfdCBwb3J0X2lkOwotCS8qIEFGRSBQb3J0IElEIHRvIHdoaWNoIHRoZSBjb252ZXJzYXRpb24gcmVjb3JkaW5nIHN0cmVhbSBuZWVkcyB0byBiZQotCSAqIHNlbnQuIFNldCB0aGlzIHRvICNWU1NfSVJFQ09SRF9QT1JUX0lEX0RFRkFVTFQgdG8gdXNlIGRlZmF1bHQgQUZFCi0JICogcHNldWRvIHBvcnRzICgweDgwMDMgZm9yIFJ4IGFuZCAweDgwMDQgZm9yIFR4KS4KLQkgKi8KLQl1aW50MzJfdCBtb2RlOwotCS8qIFJlY29yZGluZyBNb2RlLiBUaGUgbW9kZSBwYXJhbWV0ZXIgdmFsdWUgaXMgaWdub3JlZCBpZiB0aGUgcG9ydF9pZAotCSAqIGlzIHNldCB0byAjVlNTX0lSRUNPUkRfUE9SVF9JRF9ERUZBVUxULgotCSAqIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgotCSAqICNWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX1NURVJFTwotCSAqICNWU1NfSVJFQ09SRF9NT0RFX1RYX1JYX01JWElORwotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jcmVhdGVfcGFzc2l2ZV9jb250cm9sX3Nlc3Npb25fdCB7Ci0JY2hhciBuYW1lW1NFU1NJT05fTkFNRV9MRU5dOwotCS8qKjwKLQkgKiBBIHZhcmlhYmxlLXNpemVkIHN0cmVhbSBuYW1lLgotCSAqCi0JICogVGhlIHN0cmVhbSBuYW1lIHNpemUgaXMgdGhlIHBheWxvYWQgc2l6ZSBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgb3RoZXIKLQkgKiBmaWVsZHMuCi0JICovCi19IF9fcGFja2VkOwotCi0jZGVmaW5lIFZTU19JVk9MVU1FX0RJUkVDVElPTl9UWAkwCi0jZGVmaW5lIFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWAkxCi0KLSNkZWZpbmUgVlNTX0lWT0xVTUVfTVVURV9PRkYJCTAKLSNkZWZpbmUgVlNTX0lWT0xVTUVfTVVURV9PTgkJMQotCi0jZGVmaW5lIERFRkFVTFRfTVVURV9SQU1QX0RVUkFUSU9OCTUwMAotI2RlZmluZSBERUZBVUxUX1ZPTFVNRV9SQU1QX0RVUkFUSU9OCTIwCi0jZGVmaW5lIE1BWF9SQU1QX0RVUkFUSU9OCQk1MDAwCi0KLXN0cnVjdCB2c3NfaXZvbHVtZV9jbWRfbXV0ZV92Ml90IHsKLQl1aW50MTZfdCBkaXJlY3Rpb247Ci0JLyoKLQkgKiBUaGUgZGlyZWN0aW9uIGZpZWxkIHNldHMgdGhlIGRpcmVjdGlvbiB0byBhcHBseSB0aGUgbXV0ZSBjb21tYW5kLgotCSAqIFRoZSBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIFZTU19JVk9MVU1FX0RJUkVDVElPTl9UWAotCSAqIFZTU19JVk9MVU1FX0RJUkVDVElPTl9SWAotCSAqLwotCXVpbnQxNl90IG11dGVfZmxhZzsKLQkvKgotCSAqIFR1cm4gbXV0ZSBvbiBvciBvZmYuIFRoZSBTdXBwb3J0ZWQgdmFsdWVzOgotCSAqIFZTU19JVk9MVU1FX01VVEVfT0ZGCi0JICogVlNTX0lWT0xVTUVfTVVURV9PTgotCSAqLwotCXVpbnQxNl90IHJhbXBfZHVyYXRpb25fbXM7Ci0JLyoKLQkgKiBNdXRlIGNoYW5nZSByYW1wIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLQkgKiBUaGUgU3VwcG9ydGVkIHZhbHVlczogMCB0byA1MDAwLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jcmVhdGVfZnVsbF9jb250cm9sX3Nlc3Npb25fdCB7Ci0JdWludDE2X3QgZGlyZWN0aW9uOwotCS8qCi0JICogU3RyZWFtIGRpcmVjdGlvbi4KLQkgKgotCSAqIDAgOiBUWCBvbmx5Ci0JICogMSA6IFJYIG9ubHkKLQkgKiAyIDogVFggYW5kIFJYCi0JICogMyA6IFRYIGFuZCBSWCBsb29wYmFjawotCSAqLwotCXVpbnQzMl90IGVuY19tZWRpYV90eXBlOwotCS8qIFR4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLwotCXVpbnQzMl90IGRlY19tZWRpYV90eXBlOwotCS8qIFJ4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLwotCXVpbnQzMl90IG5ldHdvcmtfaWQ7Ci0JLyogTmV0d29yayBJRC4gKFJlZmVyIHRvIFZTU19ORVRXT1JLX0lEX1hYWCkuICovCi0JY2hhciBuYW1lW1NFU1NJT05fTkFNRV9MRU5dOwotCS8qCi0JICogQSB2YXJpYWJsZS1zaXplZCBzdHJlYW0gbmFtZS4KLQkgKgotCSAqIFRoZSBzdHJlYW0gbmFtZSBzaXplIGlzIHRoZSBwYXlsb2FkIHNpemUgbWludXMgdGhlIHNpemUgb2YgdGhlIG90aGVyCi0JICogZmllbGRzLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfbWVkaWFfdHlwZV90IHsKLQl1aW50MzJfdCByeF9tZWRpYV9pZDsKLQkvKiBTZXQgdGhlIFJ4IHZvY29kZXIgdHlwZS4gKFJlZmVyIHRvIFZTU19NRURJQV9JRF9YWFgpLiAqLwotCXVpbnQzMl90IHR4X21lZGlhX2lkOwotCS8qIFNldCB0aGUgVHggdm9jb2RlciB0eXBlLiAoUmVmZXIgdG8gVlNTX01FRElBX0lEX1hYWCkuICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3NlbmRfZW5jX2J1ZmZlcl90IHsKLQl1aW50MzJfdCBtZWRpYV9pZDsKLSAgICAgIC8qIE1lZGlhIElEIG9mIHRoZSBwYWNrZXQuICovCi0JdWludDhfdCBwYWNrZXRfZGF0YVtNQVhfVk9DX1BLVF9TSVpFXTsKLSAgICAgIC8qIFBhY2tldCBkYXRhIGJ1ZmZlci4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXN0cmVhbV9ldnRfc2VuZF9kZWNfYnVmZmVyX3QgewotCXVpbnQzMl90IG1lZGlhX2lkOwotICAgICAgLyogTWVkaWEgSUQgb2YgdGhlIHBhY2tldC4gKi8KLQl1aW50OF90IHBhY2tldF9kYXRhW01BWF9WT0NfUEtUX1NJWkVdOwotICAgICAgLyogUGFja2V0IGRhdGEuICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJfc2V0X2VuY19yYXRlX3QgewotCXVpbnQzMl90IG1vZGU7Ci0JLyogU2V0IHRoZSBBTVIgZW5jb2RlciByYXRlLgotCSAqCi0JICogMHgwMDAwMDAwMCA6IDQuNzUga2JwcwotCSAqIDB4MDAwMDAwMDEgOiA1LjE1IGticHMKLQkgKiAweDAwMDAwMDAyIDogNS45MCBrYnBzCi0JICogMHgwMDAwMDAwMyA6IDYuNzAga2JwcwotCSAqIDB4MDAwMDAwMDQgOiA3LjQwIGticHMKLQkgKiAweDAwMDAwMDA1IDogNy45NSBrYnBzCi0JICogMHgwMDAwMDAwNiA6IDEwLjIga2JwcwotCSAqIDB4MDAwMDAwMDcgOiAxMi4yIGticHMKLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfdm9jX2FtcndiX3NldF9lbmNfcmF0ZV90IHsKLQl1aW50MzJfdCBtb2RlOwotCS8qIFNldCB0aGUgQU1SLVdCIGVuY29kZXIgcmF0ZS4KLQkgKgotCSAqIDB4MDAwMDAwMDAgOiAgNi42MCBrYnBzCi0JICogMHgwMDAwMDAwMSA6ICA4Ljg1IGticHMKLQkgKiAweDAwMDAwMDAyIDogMTIuNjUga2JwcwotCSAqIDB4MDAwMDAwMDMgOiAxNC4yNSBrYnBzCi0JICogMHgwMDAwMDAwNCA6IDE1Ljg1IGticHMKLQkgKiAweDAwMDAwMDA1IDogMTguMjUga2JwcwotCSAqIDB4MDAwMDAwMDYgOiAxOS44NSBrYnBzCi0JICogMHgwMDAwMDAwNyA6IDIzLjA1IGticHMKLQkgKiAweDAwMDAwMDA4IDogMjMuODUga2JwcwotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jZG1hX3NldF9lbmNfbWlubWF4X3JhdGVfdCB7Ci0JdWludDE2X3QgbWluX3JhdGU7Ci0JLyogU2V0IHRoZSBsb3dlciBib3VuZCBlbmNvZGVyIHJhdGUuCi0JICoKLQkgKiAweDAwMDAgOiBCbGFuayBmcmFtZQotCSAqIDB4MDAwMSA6IEVpZ2h0aCByYXRlCi0JICogMHgwMDAyIDogUXVhcnRlciByYXRlCi0JICogMHgwMDAzIDogSGFsZiByYXRlCi0JICogMHgwMDA0IDogRnVsbCByYXRlCi0JICovCi0JdWludDE2X3QgbWF4X3JhdGU7Ci0JLyogU2V0IHRoZSB1cHBlciBib3VuZCBlbmNvZGVyIHJhdGUuCi0JICoKLQkgKiAweDAwMDAgOiBCbGFuayBmcmFtZQotCSAqIDB4MDAwMSA6IEVpZ2h0aCByYXRlCi0JICogMHgwMDAyIDogUXVhcnRlciByYXRlCi0JICogMHgwMDAzIDogSGFsZiByYXRlCi0JICogMHgwMDA0IDogRnVsbCByYXRlCi0JICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9lbmNfZHR4X21vZGVfdCB7Ci0JdWludDMyX3QgZW5hYmxlOwotCS8qIFRvZ2dsZSBEVFggb24gb3Igb2ZmLgotCSAqCi0JICogMCA6IERpc2FibGVzIERUWAotCSAqIDEgOiBFbmFibGVzIERUWAotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pc3RyZWFtX2NtZF9yZWdpc3Rlcl9jYWxpYnJhdGlvbl9kYXRhX3YyX3QgewotCXVpbnQzMl90IGNhbF9tZW1faGFuZGxlOwotCS8qIEhhbmRsZSB0byB0aGUgc2hhcmVkIG1lbW9yeSB0aGF0IGhvbGRzIHRoZSBjYWxpYnJhdGlvbiBkYXRhLiAqLwotCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7Ci0JdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKLQkvKiBMb2NhdGlvbiBvZiBjYWxpYnJhdGlvbiBkYXRhLiAqLwotCXVpbnQzMl90IGNhbF9tZW1fc2l6ZTsKLQkvKiBTaXplIG9mIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGluIGJ5dGVzLiAqLwotCXVpbnQ4X3QgY29sdW1uX2luZm9bTUFYX0NPTF9JTkZPX1NJWkVdOwotCS8qCi0JICogQ29sdW1uIGluZm8gY29udGFpbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCB0aGUgYXJyYXkgb2YgY29sdW1ucwotCSAqIGluIHRoZSBjYWxpYnJhdGlvbiB0YWJsZS4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb2x1bW5zIGFyZSBwcm92aWRlZAotCSAqIGhlcmUgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBleGlzdCBpbiB0aGUgY2FsaWJyYXRpb24KLQkgKiB0YWJsZSBwcm92aWRlZC4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3VpX3Byb3BlcnR5X2VuYWJsZV90IHsKLQl1aW50MzJfdCBtb2R1bGVfaWQ7Ci0JLyogVW5pcXVlIElEIG9mIHRoZSBtb2R1bGUuICovCi0JdWludDMyX3QgcGFyYW1faWQ7Ci0JLyogVW5pcXVlIElEIG9mIHRoZSBwYXJhbWV0ZXIuICovCi0JdWludDE2X3QgcGFyYW1fc2l6ZTsKLQkvKiBTaXplIG9mIHRoZSBwYXJhbWV0ZXIgaW4gYnl0ZXM6IE1PRF9FTkFCTEVfUEFSQU1fTEVOICovCi0JdWludDE2X3QgcmVzZXJ2ZWQ7Ci0JLyogUmVzZXJ2ZWQ7IHNldCB0byAwLiAqLwotCXVpbnQxNl90IGVuYWJsZTsKLQl1aW50MTZfdCByZXNlcnZlZF9maWVsZDsKLQkvKiBSZXNlcnZlZCwgc2V0IHRvIDAuICovCi19OwotCi0vKgotICogRXZlbnQgc2VudCBieSB0aGUgc3RyZWFtIHRvIHRoZSBjbGllbnQgdGhhdCBlbmFibGVzIFJ4IERUTUYKLSAqIGRldGVjdGlvbiB3aGVuZXZlciBEVE1GIGlzIGRldGVjdGVkIGluIHRoZSBSeCBwYXRoLgotICoKLSAqIFRoZSBEVE1GIGRldGVjdGlvbiBmZWF0dXJlIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGV0ZWN0IERUTUYKLSAqIGZyZXF1ZW5jaWVzIGFzIGxpc3RlZCBpbiB0aGUgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWRfdAotICogc3RydWN0dXJlLgotICovCi0KLSNkZWZpbmUgVlNTX0lTVFJFQU1fRVZUX1JYX0RUTUZfREVURUNURUQgMHgwMDAxMTAxQQotCi1zdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9yeF9kdG1mX2RldGVjdGlvbiB7Ci0JLyoKLQkgKiBFbmFibGVzL2Rpc2FibGVzIFJ4IERUTUYgZGV0ZWN0aW9uCi0JICoKLQkgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlCi0JICogMCAtIGRpc2FibGUKLQkgKiAxIC0gZW5hYmxlCi0JICoKLQkgKi8KLQl1aW50MzJfdCBlbmFibGU7Ci19OwotCi0jZGVmaW5lIFZTU19JU1RSRUFNX0NNRF9TRVRfUlhfRFRNRl9ERVRFQ1RJT04gMHgwMDAxMTAyNwotCi1zdHJ1Y3QgdnNzX2lzdHJlYW1fZXZ0X3J4X2R0bWZfZGV0ZWN0ZWQgewotCXVpbnQxNl90IGxvd19mcmVxOwotCS8qCi0JICogRGV0ZWN0ZWQgbG93IGZyZXF1ZW5jeS4gUG9zc2libGUgdmFsdWVzOgotCSAqIDY5NyBIegotCSAqIDc3MCBIegotCSAqIDg1MiBIegotCSAqIDk0MSBIegotCSAqLwotCXVpbnQxNl90IGhpZ2hfZnJlcTsKLQkvKgotCSAqIERldGVjdGVkIGhpZ2ggZnJlcXVlbmN5LiBQb3NzaWJsZSB2YWx1ZXM6Ci0JICogMTIwOSBIegotCSAqIDEzMzYgSHoKLQkgKiAxNDc3IEh6Ci0JICogMTYzMyBIegotCSAqLwotfTsKLQotc3RydWN0IGN2c19zZXRfcnhfZHRtZl9kZXRlY3Rpb25fY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfcnhfZHRtZl9kZXRlY3Rpb24gY3ZzX2R0bWZfZGV0OwotfSBfX3BhY2tlZDsKLQotCi1zdHJ1Y3QgY3ZzX2NyZWF0ZV9wYXNzaXZlX2N0bF9zZXNzaW9uX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfY3JlYXRlX3Bhc3NpdmVfY29udHJvbF9zZXNzaW9uX3QgY3ZzX3Nlc3Npb247Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZzX2NyZWF0ZV9mdWxsX2N0bF9zZXNzaW9uX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfY3JlYXRlX2Z1bGxfY29udHJvbF9zZXNzaW9uX3QgY3ZzX3Nlc3Npb247Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZzX2Rlc3Ryb3lfc2Vzc2lvbl9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfc2V0X211dGVfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pdm9sdW1lX2NtZF9tdXRlX3YyX3QgY3ZzX3NldF9tdXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2c19zZXRfbWVkaWFfdHlwZV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3NldF9tZWRpYV90eXBlX3QgbWVkaWFfdHlwZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfc2VuZF9kZWNfYnVmX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXN0cmVhbV9ldnRfc2VuZF9kZWNfYnVmZmVyX3QgZGVjX2J1ZjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfc2V0X2Ftcl9lbmNfcmF0ZV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJfc2V0X2VuY19yYXRlX3QgYW1yX3JhdGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZzX3NldF9hbXJ3Yl9lbmNfcmF0ZV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2lzdHJlYW1fY21kX3ZvY19hbXJ3Yl9zZXRfZW5jX3JhdGVfdCBhbXJ3Yl9yYXRlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2c19zZXRfY2RtYV9lbmNfbWlubWF4X3JhdGVfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9jZG1hX3NldF9lbmNfbWlubWF4X3JhdGVfdCBjZG1hX3JhdGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZzX3NldF9lbmNfZHR4X21vZGVfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc3RyZWFtX2NtZF9zZXRfZW5jX2R0eF9tb2RlX3QgZHR4X21vZGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZzX3JlZ2lzdGVyX2NhbF9kYXRhX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfcmVnaXN0ZXJfY2FsaWJyYXRpb25fZGF0YV92Ml90IGN2c19jYWxfZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfZGVyZWdpc3Rlcl9jYWxfZGF0YV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfc2V0X3BwX2VuYWJsZV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2ljb21tb25fY21kX3NldF91aV9wcm9wZXJ0eV9lbmFibGVfdCB2c3Nfc2V0X3BwOwotfSBfX3BhY2tlZDsKLXN0cnVjdCBjdnNfc3RhcnRfcmVjb3JkX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXJlY29yZF9jbWRfc3RhcnRfdCByZWNfbW9kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfc3RhcnRfcGxheWJhY2tfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pcGxheWJhY2tfY21kX3N0YXJ0X3QgcGxheWJhY2tfbW9kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfZGVjX2J1ZmZlcl9yZWFkeV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnNfZW5jX2J1ZmZlcl9jb25zdW1lZF9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X29vYl9wYWNrZXRfZXhjaGFuZ2VfY29uZmlnX3QgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCXVpbnQzMl90IGVuY19idWZfYWRkcl9sc3c7Ci0JdWludDMyX3QgZW5jX2J1Zl9hZGRyX21zdzsKLQl1aW50MzJfdCBlbmNfYnVmX3NpemU7Ci0JdWludDMyX3QgZGVjX2J1Zl9hZGRyX2xzdzsKLQl1aW50MzJfdCBkZWNfYnVmX2FkZHJfbXN3OwotCXVpbnQzMl90IGRlY19idWZfc2l6ZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXN0cmVhbV9jbWRfc2V0X3BhY2tldF9leGNoYW5nZV9tb2RlX3QgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQl1aW50MzJfdCBtb2RlOwotfSBfX3BhY2tlZDsKLQotLyogVE8gQ1ZQIGNvbW1hbmRzICovCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT04JMHgwMDAxMDBDMwotLyoqPCBXYWl0IGZvciBBUFJWMl9JQkFTSUNfUlNQX1JFU1VMVCByZXNwb25zZS4gKi8KLQotI2RlZmluZSBBUFJWMl9JQkFTSUNfQ01EX0RFU1RST1lfU0VTU0lPTgkJMHgwMDAxMDAzQwotCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfU0VUX0RFVklDRV9WMgkJCTB4MDAwMTEyQzYKLQotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1NFVF9ERVZJQ0VfVjMJCQkweDAwMDEzMTZBCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9UT1BPTE9HWV9TRVRfREVWX0NIQU5ORUxTCTB4MDAwMTMxOTkKLQotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1RPUE9MT0dZX0NPTU1JVAkJMHgwMDAxMzE5OAotCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfU0VUX1ZQM19EQVRBCQkJMHgwMDAxMTBFQgotCi0jZGVmaW5lIFZTU19JVk9MVU1FX0NNRF9TRVRfU1RFUAkJCTB4MDAwMTEyQzIKLQotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0VOQUJMRQkJCQkweDAwMDEwMEM2Ci0vKio8IE5vIHBheWxvYWQuIFdhaXQgZm9yIEFQUlYyX0lCQVNJQ19SU1BfUkVTVUxUIHJlc3BvbnNlLiAqLwotCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfRElTQUJMRQkJCTB4MDAwMTEwRTEKLS8qKjwgTm8gcGF5bG9hZC4gV2FpdCBmb3IgQVBSVjJfSUJBU0lDX1JTUF9SRVNVTFQgcmVzcG9uc2UuICovCi0KLS8qCi0gKiBSZWdpc3RlcnMgdGhlIG1lbW9yeSB0aGF0IGNvbnRhaW5zIGRldmljZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEgd2l0aAotICogdGhlIHZvY3Byb2MuIFRoZSBjbGllbnQgbXVzdCByZWdpc3RlciBkZXZpY2UgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlCi0gKiB2b2Nwcm9jIHRoYXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgZGV2aWNlIGJlaW5nIHNldCBvbiB0aGUgdm9jcHJvYy4KLSAqLwotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RFVklDRV9DT05GSUcJCTB4MDAwMTEzNzEKLQotLyoKLSAqIERlcmVnaXN0ZXJzIHRoZSBtZW1vcnkgdGhhdCBob2xkcyBkZXZpY2UgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gdGhlCi0gIHZvY3Byb2MuCi0qLwotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfREVWSUNFX0NPTkZJRwkweDAwMDExMzcyCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9SRUdJU1RFUl9DQUxJQlJBVElPTl9EQVRBX1YyCTB4MDAwMTEzNzMKLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTI3NgotCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTM3NAotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfVk9MX0NBTElCUkFUSU9OX0RBVEEJMHgwMDAxMTM3NQotCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19DTURfUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgICAgMHgwMDAxMzA3OQotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0RFUkVHSVNURVJfU1RBVElDX0NBTElCUkFUSU9OX0RBVEEgICAgIDB4MDAwMTMwN0EKLQotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX1JFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQSAgICAgIDB4MDAwMTMwN0IKLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9ERVJFR0lTVEVSX0RZTkFNSUNfQ0FMSUJSQVRJT05fREFUQSAgICAweDAwMDEzMDdDCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX05PTkUJCQkweDAwMDEwRjcwCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9UWF9TTV9FQ05TX1YyCQkweDAwMDEwRjg5Ci0jZGVmaW5lIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9UWF9ETV9GTFVFTkNFCQkweDAwMDEwRjcyCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX1JYX0RFRkFVTFQJCTB4MDAwMTBGNzcKLQotLyogTmV3dHdvcmsgSURzICovCi0jZGVmaW5lIFZTU19JQ09NTU9OX0NBTF9ORVRXT1JLX0lEX05PTkUJCTB4MDAwMTEzNUUKLQotLyogU2VsZWN0IGludGVybmFsIG1peGluZyBtb2RlLiAqLwotI2RlZmluZSBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0lOVF9NSVhJTkcJMHgwMDAxMEY3QwotCi0vKiBTZWxlY3QgZXh0ZXJuYWwgbWl4aW5nIG1vZGUuICovCi0jZGVmaW5lIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfRVhUX01JWElORwkweDAwMDEwRjdECi0KLS8qIERlZmF1bHQgQUZFIHBvcnQgSUQuIEFwcGxpY2FibGUgdG8gVHggYW5kIFJ4LiAqLwotI2RlZmluZSBWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FCQkweEZGRkYKLQotI2RlZmluZSBWU1NfTkVUV09SS19JRF9ERUZBVUxUCQkweDAwMDEwMDM3Ci0KLS8qIFZvaWNlIG92ZXIgSW50ZXJuZXQgUHJvdG9jb2wgKFZvSVApIG5ldHdvcmsgSUQuIENvbW1vbiBmb3IgYWxsIGJhbmRzLiovCi0jZGVmaW5lIFZTU19ORVRXT1JLX0lEX1ZPSVAJCTB4MDAwMTEzNjIKLQotLyogTWVkaWEgdHlwZXMgKi8KLSNkZWZpbmUgVlNTX01FRElBX0lEX0VWUkNfTU9ERU0JCTB4MDAwMTBGQzIKLS8qIDgwLVZGNjkwLTQ3IENETUEgZW5oYW5jZWQgdmFyaWFibGUgcmF0ZSB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KLSNkZWZpbmUgVlNTX01FRElBX0lEX0FNUl9OQl9NT0RFTQkweDAwMDEwRkM2Ci0vKiA4MC1WRjY5MC00NyBVTVRTIEFNUi1OQiB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KLSNkZWZpbmUgVlNTX01FRElBX0lEX0FNUl9XQl9NT0RFTQkweDAwMDEwRkM3Ci0vKiA4MC1WRjY5MC00NyBVTVRTIEFNUi1XQiB2b2NvZGVyIG1vZGVtIGZvcm1hdC4gKi8KLQotI2RlZmluZSBWU1NfTUVESUFfSURfUENNXzhfS0haCQkweDAwMDEwRkNCCi0jZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fMTZfS0haCQkweDAwMDEwRkNDCi0jZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fMzJfS0haCQkweDAwMDEwRkQ5Ci0jZGVmaW5lIFZTU19NRURJQV9JRF9QQ01fNDhfS0haCQkweDAwMDEwRkQ2Ci0KLS8qIExpbmVhciBQQ00gKDE2LWJpdCwgbGl0dGxlLWVuZGlhbikuICovCi0jZGVmaW5lIFZTU19NRURJQV9JRF9HNzExX0FMQVcJCTB4MDAwMTBGQ0QKLS8qIEcuNzExIGEtbGF3IChjb250YWlucyB0d28gMTBtcyB2b2NvZGVyIGZyYW1lcykuICovCi0jZGVmaW5lIFZTU19NRURJQV9JRF9HNzExX01VTEFXCQkweDAwMDEwRkNFCi0vKiBHLjcxMSBtdS1sYXcgKGNvbnRhaW5zIHR3byAxMG1zIHZvY29kZXIgZnJhbWVzKS4gKi8KLSNkZWZpbmUgVlNTX01FRElBX0lEX0c3MjkJCTB4MDAwMTBGRDAKLS8qIEcuNzI5QUIgKGNvbnRhaW5zIHR3byAxMG1zIHZvY29kZXIgZnJhbWVzLiAqLwotI2RlZmluZSBWU1NfTUVESUFfSURfNEdWX05CX01PREVNCTB4MDAwMTBGQzMKLS8qQ0RNQSBFVlJDLUIgdm9jb2RlciBtb2RlbSBmb3JtYXQgKi8KLSNkZWZpbmUgVlNTX01FRElBX0lEXzRHVl9XQl9NT0RFTQkweDAwMDEwRkM0Ci0vKkNETUEgRVZSQy1XQiB2b2NvZGVyIG1vZGVtIGZvcm1hdCAqLwotI2RlZmluZSBWU1NfTUVESUFfSURfNEdWX05XX01PREVNCTB4MDAwMTBGQzUKLS8qQ0RNQSBFVlJDLU5XIHZvY29kZXIgbW9kZW0gZm9ybWF0ICovCi0KLSNkZWZpbmUgVlNTX0lWT0NQUk9DX0NNRF9DUkVBVEVfRlVMTF9DT05UUk9MX1NFU1NJT05fVjIJMHgwMDAxMTJCRgotI2RlZmluZSBWU1NfSVZPQ1BST0NfQ01EX0NSRUFURV9GVUxMX0NPTlRST0xfU0VTU0lPTl9WMwkweDAwMDEzMTY5Ci0KLSNkZWZpbmUgVlNTX05VTV9ERVZfQ0hBTk5FTFNfMSAxCi0jZGVmaW5lIFZTU19OVU1fREVWX0NIQU5ORUxTXzIgMgotI2RlZmluZSBWU1NfTlVNX0RFVl9DSEFOTkVMU18zIDMKLSNkZWZpbmUgVlNTX05VTV9ERVZfQ0hBTk5FTFNfNCA0Ci0KLXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX2NyZWF0ZV9mdWxsX2NvbnRyb2xfc2Vzc2lvbl92Ml90IHsKLQl1aW50MTZfdCBkaXJlY3Rpb247Ci0JLyoKLQkgKiBWb2Nwcm9jIGRpcmVjdGlvbi4gVGhlIHN1cHBvcnRlZCB2YWx1ZXM6Ci0JICogVlNTX0lWT0NQUk9DX0RJUkVDVElPTl9SWAotCSAqIFZTU19JVk9DUFJPQ19ESVJFQ1RJT05fVFgKLQkgKiBWU1NfSVZPQ1BST0NfRElSRUNUSU9OX1JYX1RYCi0JICovCi0JdWludDE2X3QgdHhfcG9ydF9pZDsKLQkvKgotCSAqIFR4IGRldmljZSBwb3J0IElEIHRvIHdoaWNoIHRoZSB2b2Nwcm9jIGNvbm5lY3RzLiBJZiBhIHBvcnQgSUQgaXMKLQkgKiBub3QgYmVpbmcgc3VwcGxpZWQsIHNldCB0aGlzIHRvICNWU1NfSVZPQ1BST0NfUE9SVF9JRF9OT05FLgotCSAqLwotCXVpbnQzMl90IHR4X3RvcG9sb2d5X2lkOwotCS8qCi0JICogVHggcGF0aCB0b3BvbG9neSBJRC4gSWYgYSB0b3BvbG9neSBJRCBpcyBub3QgYmVpbmcgc3VwcGxpZWQsIHNldAotCSAqIHRoaXMgdG8gI1ZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FLgotCSAqLwotCXVpbnQxNl90IHJ4X3BvcnRfaWQ7Ci0JLyoKLQkgKiBSeCBkZXZpY2UgcG9ydCBJRCB0byB3aGljaCB0aGUgdm9jcHJvYyBjb25uZWN0cy4gSWYgYSBwb3J0IElEIGlzCi0JICogbm90IGJlaW5nIHN1cHBsaWVkLCBzZXQgdGhpcyB0byAjVlNTX0lWT0NQUk9DX1BPUlRfSURfTk9ORS4KLQkgKi8KLQl1aW50MzJfdCByeF90b3BvbG9neV9pZDsKLQkvKgotCSAqIFJ4IHBhdGggdG9wb2xvZ3kgSUQuIElmIGEgdG9wb2xvZ3kgSUQgaXMgbm90IGJlaW5nIHN1cHBsaWVkLCBzZXQKLQkgKiB0aGlzIHRvICNWU1NfSVZPQ1BST0NfVE9QT0xPR1lfSURfTk9ORS4KLQkgKi8KLQl1aW50MzJfdCBwcm9maWxlX2lkOwotCS8qIFZvaWNlIGNhbGlicmF0aW9uIHByb2ZpbGUgSUQuICovCi0JdWludDMyX3Qgdm9jcHJvY19tb2RlOwotCS8qCi0JICogVm9jcHJvYyBtb2RlLiBUaGUgc3VwcG9ydGVkIHZhbHVlczoKLQkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0lOVF9NSVhJTkcKLQkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkcKLQkgKi8KLQl1aW50MTZfdCBlY19yZWZfcG9ydF9pZDsKLQkvKgotCSAqIFBvcnQgSUQgdG8gd2hpY2ggdGhlIHZvY3Byb2MgY29ubmVjdHMgZm9yIHJlY2VpdmluZyBlY2hvCi0JICogY2FuY2VsbGF0aW9uIHJlZmVyZW5jZSBzaWduYWwuIElmIGEgcG9ydCBJRCBpcyBub3QgYmVpbmcgc3VwcGxpZWQsCi0JICogc2V0IHRoaXMgdG8gI1ZTU19JVk9DUFJPQ19QT1JUX0lEX05PTkUuIFRoaXMgcGFyYW1ldGVyIHZhbHVlIGlzCi0JICogaWdub3JlZCB3aGVuIHRoZSB2b2Nwcm9jX21vZGUgcGFyYW1ldGVyIGlzIHNldCB0bwotCSAqIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORy4KLQkgKi8KLQljaGFyIG5hbWVbU0VTU0lPTl9OQU1FX0xFTl07Ci0JLyoKLQkgKiBTZXNzaW9uIG5hbWUgc3RyaW5nIHVzZWQgdG8gaWRlbnRpZnkgYSBzZXNzaW9uIHRoYXQgY2FuIGJlIHNoYXJlZAotCSAqIHdpdGggcGFzc2l2ZSBjb250cm9sbGVycyAob3B0aW9uYWwpLiBUaGUgc3RyaW5nIHNpemUsIGluY2x1ZGluZyB0aGUKLQkgKiBOVUxMIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgaXMgbGltaXRlZCB0byAzMSBjaGFyYWN0ZXJzLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X3ZvbHVtZV9pbmRleF90IHsKLQl1aW50MTZfdCB2b2xfaW5kZXg7Ci0JLyoKLQkgKiBWb2x1bWUgaW5kZXggdXRpbGl6ZWQgYnkgdGhlIHZvY3Byb2MgdG8gaW5kZXggaW50byB0aGUgdm9sdW1lIHRhYmxlCi0JICogcHJvdmlkZWQgaW4gVlNTX0lWT0NQUk9DX0NNRF9DQUNIRV9WT0xVTUVfQ0FMSUJSQVRJT05fVEFCTEUgYW5kIHNldAotCSAqIHZvbHVtZSBvbiB0aGUgVkRTUC4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXZvbHVtZV9jbWRfc2V0X3N0ZXBfdCB7Ci0JdWludDE2X3QgZGlyZWN0aW9uOwotCS8qCi0JICogVGhlIGRpcmVjdGlvbiBmaWVsZCBzZXRzIHRoZSBkaXJlY3Rpb24gdG8gYXBwbHkgdGhlIHZvbHVtZSBjb21tYW5kLgotCSAqIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgotCSAqICNWU1NfSVZPTFVNRV9ESVJFQ1RJT05fUlgKLQkgKi8KLQl1aW50MzJfdCB2YWx1ZTsKLQkvKgotCSAqIFZvbHVtZSBzdGVwIHVzZWQgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBsaW5lYXIgdm9sdW1lIGFuZAotCSAqIHRoZSBiZXN0IG1hdGNoIGluZGV4IGluIHRoZSByZWdpc3RlcmVkIHZvbHVtZSBjYWxpYnJhdGlvbiB0YWJsZS4KLQkgKi8KLQl1aW50MTZfdCByYW1wX2R1cmF0aW9uX21zOwotCS8qCi0JICogVm9sdW1lIGNoYW5nZSByYW1wIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLQkgKiBUaGUgc3VwcG9ydGVkIHZhbHVlczogMCB0byA1MDAwLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X2RldmljZV92Ml90IHsKLQl1aW50MTZfdCB0eF9wb3J0X2lkOwotCS8qCi0JICogVFggZGV2aWNlIHBvcnQgSUQgd2hpY2ggdm9jcHJvYyB3aWxsIGNvbm5lY3QgdG8uCi0JICogVlNTX0lWT0NQUk9DX1BPUlRfSURfTk9ORSBtZWFucyB2b2Nwcm9jIHdpbGwgbm90IGNvbm5lY3QgdG8gYW55IHBvcnQuCi0JICovCi0JdWludDMyX3QgdHhfdG9wb2xvZ3lfaWQ7Ci0JLyoKLQkgKiBUWCBsZWcgdG9wb2xvZ3kgSUQuCi0JICogVlNTX0lWT0NQUk9DX1RPUE9MT0dZX0lEX05PTkUgbWVhbnMgdm9jcHJvYyBkb2VzIG5vdCBjb250YWluIGFueQotCSAqIHByZS9wb3N0LXByb2Nlc3NpbmcgYmxvY2tzIGFuZCBpcyBwYXNzLXRocm91Z2guCi0JICovCi0JdWludDE2X3QgcnhfcG9ydF9pZDsKLQkvKgotCSAqIFJYIGRldmljZSBwb3J0IElEIHdoaWNoIHZvY3Byb2Mgd2lsbCBjb25uZWN0IHRvLgotCSAqIFZTU19JVk9DUFJPQ19QT1JUX0lEX05PTkUgbWVhbnMgdm9jcHJvYyB3aWxsIG5vdCBjb25uZWN0IHRvIGFueSBwb3J0LgotCSAqLwotCXVpbnQzMl90IHJ4X3RvcG9sb2d5X2lkOwotCS8qCi0JICogUlggbGVnIHRvcG9sb2d5IElELgotCSAqIFZTU19JVk9DUFJPQ19UT1BPTE9HWV9JRF9OT05FIG1lYW5zIHZvY3Byb2MgZG9lcyBub3QgY29udGFpbiBhbnkKLQkgKiBwcmUvcG9zdC1wcm9jZXNzaW5nIGJsb2NrcyBhbmQgaXMgcGFzcy10aHJvdWdoLgotCSAqLwotCXVpbnQzMl90IHZvY3Byb2NfbW9kZTsKLQkvKiBWb2Nwcm9jIG1vZGUuIFRoZSBzdXBwb3J0ZWQgdmFsdWVzOgotCSAqIFZTU19JVk9DUFJPQ19WT0NQUk9DX01PREVfRUNfSU5UX01JWElORyAtIDB4MDAwMTBGN0MKLQkgKiBWU1NfSVZPQ1BST0NfVk9DUFJPQ19NT0RFX0VDX0VYVF9NSVhJTkcgLSAweDAwMDEwRjdECi0JICovCi0JdWludDE2X3QgZWNfcmVmX3BvcnRfaWQ7Ci0JLyogUG9ydCBJRCB0byB3aGljaCB0aGUgdm9jcHJvYyBjb25uZWN0cyBmb3IgcmVjZWl2aW5nCi0JICogZWNobwotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pdm9jcHJvY19jbWRfcmVnaXN0ZXJfZGV2aWNlX2NvbmZpZ190IHsKLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCS8qCi0JICogSGFuZGxlIHRvIHRoZSBzaGFyZWQgbWVtb3J5IHRoYXQgaG9sZHMgdGhlIHBlci1uZXR3b3JrIGNhbGlicmF0aW9uCi0JICogZGF0YS4KLQkgKi8KLQl1aW50MzJfdCBtZW1fYWRkcmVzc19sc3c7Ci0JdWludDMyX3QgbWVtX2FkZHJlc3NfbXN3OwotCS8qIExvY2F0aW9uIG9mIGNhbGlicmF0aW9uIGRhdGEuICovCi0JdWludDMyX3QgbWVtX3NpemU7Ci0JLyogU2l6ZSBvZiB0aGUgY2FsaWJyYXRpb24gZGF0YSBpbiBieXRlcy4gKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX2NhbGlicmF0aW9uX2RhdGFfdjJfdCB7Ci0JdWludDMyX3QgY2FsX21lbV9oYW5kbGU7Ci0JLyoKLQkgKiBIYW5kbGUgdG8gdGhlIHNoYXJlZCBtZW1vcnkgdGhhdCBob2xkcyB0aGUgcGVyLW5ldHdvcmsgY2FsaWJyYXRpb24KLQkgKiBkYXRhLgotCSAqLwotCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7Ci0JdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKLQkvKiBMb2NhdGlvbiBvZiBjYWxpYnJhdGlvbiBkYXRhLiAqLwotCXVpbnQzMl90IGNhbF9tZW1fc2l6ZTsKLQkvKiBTaXplIG9mIHRoZSBjYWxpYnJhdGlvbiBkYXRhIGluIGJ5dGVzLiAqLwotCXVpbnQ4X3QgY29sdW1uX2luZm9bTUFYX0NPTF9JTkZPX1NJWkVdOwotCS8qCi0JICogQ29sdW1uIGluZm8gY29udGFpbnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGFuZCB0aGUgYXJyYXkgb2YgY29sdW1ucwotCSAqIGluIHRoZSBjYWxpYnJhdGlvbiB0YWJsZS4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjb2x1bW5zIGFyZSBwcm92aWRlZAotCSAqIGhlcmUgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBleGlzdCBpbiB0aGUgY2FsaWJyYXRpb24KLQkgKiB0YWJsZSBwcm92aWRlZC4KLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3JlZ2lzdGVyX3ZvbHVtZV9jYWxfZGF0YV90IHsKLQl1aW50MzJfdCBjYWxfbWVtX2hhbmRsZTsKLQkvKgotCSAqIEhhbmRsZSB0byB0aGUgc2hhcmVkIG1lbW9yeSB0aGF0IGhvbGRzIHRoZSB2b2x1bWUgY2FsaWJyYXRpb24KLQkgKiBkYXRhLgotCSAqLwotCXVpbnQzMl90IGNhbF9tZW1fYWRkcmVzc19sc3c7Ci0JdWludDMyX3QgY2FsX21lbV9hZGRyZXNzX21zdzsKLQkvKiBMb2NhdGlvbiBvZiB2b2x1bWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KLQl1aW50MzJfdCBjYWxfbWVtX3NpemU7Ci0JLyogU2l6ZSBvZiB0aGUgdm9sdW1lIGNhbGlicmF0aW9uIGRhdGEgaW4gYnl0ZXMuICovCi0JdWludDhfdCBjb2x1bW5faW5mb1tNQVhfQ09MX0lORk9fU0laRV07Ci0JLyoKLQkgKiBDb2x1bW4gaW5mbyBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgYW5kIHRoZSBhcnJheSBvZiBjb2x1bW5zCi0JICogaW4gdGhlIGNhbGlicmF0aW9uIHRhYmxlLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbHVtbnMgYXJlIHByb3ZpZGVkCi0JICogaGVyZSBtdXN0IG1hdGNoIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGV4aXN0IGluIHRoZSBjYWxpYnJhdGlvbgotCSAqIHRhYmxlIHByb3ZpZGVkLgotCSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHZzc19pdm9jcHJvY19jbWRfdG9wb2xvZ3lfc2V0X2Rldl9jaGFubmVsc190IHsKLQl1aW50MTZfdCB0eF9udW1fY2hhbm5lbHM7Ci0JLyoKLQkgKiBOdW1iZXIgb2YgTWljcy4KLQkgKiBTdXBwb3J0ZWQgdmFsdWVzCi0JICogMSAgVlNTX05VTV9ERVZfQ0hBTk5FTFNfMQotCSAqIDIgIFZTU19OVU1fREVWX0NIQU5ORUxTXzIKLQkgKiAzICBWU1NfTlVNX0RFVl9DSEFOTkVMU18zCi0JICogNCAgVlNTX05VTV9ERVZfQ0hBTk5FTFNfNAotCSAqLwotCXVpbnQxNl90IHJ4X251bV9jaGFubmVsczsKLQkvKgotCSAqIE51bWJlciBvZiBzcGVha2VyIGNoYW5uZWxzLgotCSAqIFN1cHBvcnRlZCB2YWx1ZXMKLQkgKiAxIFZTU19OVU1fREVWX0NIQU5ORUxTXzEKLQkgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIFN0YXJ0cyBhIHZvY29kZXIgUENNIHNlc3Npb24gKi8KLSNkZWZpbmUgVlNTX0lWUENNX0NNRF9TVEFSVF9WMgkweDAwMDExMzM5Ci0KLS8qIERlZmF1bHQgdGFwIHBvaW50IGxvY2F0aW9uIG9uIHRoZSBUWCBwYXRoLiAqLwotI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX1RYX0RFRkFVTFQJMHgwMDAxMTI4OQotCi0vKiBEZWZhdWx0IHRhcCBwb2ludCBsb2NhdGlvbiBvbiB0aGUgUlggcGF0aC4gKi8KLSNkZWZpbmUgVlNTX0lWUENNX1RBUF9QT0lOVF9SWF9ERUZBVUxUCTB4MDAwMTEyOEEKLQotLyogSW5kaWNhdGVzIHRhcCBwb2ludCBkaXJlY3Rpb24gaXMgb3V0cHV0LiAqLwotI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVQJMAotCi0vKiBJbmRpY2F0ZXMgdGFwIHBvaW50IGRpcmVjdGlvbiBpcyBpbnB1dC4gKi8KLSNkZWZpbmUgVlNTX0lWUENNX1RBUF9QT0lOVF9ESVJfSU4JMQotCi0vKiBJbmRpY2F0ZXMgdGFwIHBvaW50IGRpcmVjdGlvbiBpcyBvdXRwdXQgYW5kIGlucHV0LiAqLwotI2RlZmluZSBWU1NfSVZQQ01fVEFQX1BPSU5UX0RJUl9PVVRfSU4JMgotCi0KLSNkZWZpbmUgVlNTX0lWUENNX1NBTVBMSU5HX1JBVEVfQVVUTwkwCi0KLS8qIEluZGljYXRlcyA4IEtIeiB2b2NvZGVyIFBDTSBzYW1wbGluZyByYXRlLiAqLwotI2RlZmluZSBWU1NfSVZQQ01fU0FNUExJTkdfUkFURV84Swk4MDAwCi0KLS8qIEluZGljYXRlcyAxNiBLSHogdm9jb2RlciBQQ00gc2FtcGxpbmcgcmF0ZS4gKi8KLSNkZWZpbmUgVlNTX0lWUENNX1NBTVBMSU5HX1JBVEVfMTZLCTE2MDAwCi0KLS8qIFJYIGFuZCBUWCAqLwotI2RlZmluZSBNQVhfVEFQX1BPSU5UU19TVVBQT1JURUQJMgotCi1zdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCB7Ci0JdWludDMyX3QgdGFwX3BvaW50OwotCXVpbnQxNl90IGRpcmVjdGlvbjsKLQl1aW50MTZfdCBzYW1wbGluZ19yYXRlOwotCXVpbnQxNl90IGR1cmF0aW9uOwotfSBfX3BhY2tlZDsKLQotCi1zdHJ1Y3QgdnNzX2l2cGNtX2NtZF9zdGFydF92Ml90IHsKLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCXVpbnQzMl90IG51bV90YXBfcG9pbnRzOwotCXN0cnVjdCB2c3NfaXZwY21fdGFwX3BvaW50IHRhcF9wb2ludHNbTUFYX1RBUF9QT0lOVFNfU1VQUE9SVEVEXTsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgVlNTX0lWUENNX0VWVF9QVVNIX0JVRkZFUl9WMgkweDAwMDExMzNBCi0KLS8qIFB1c2ggYnVmZmVyIGV2ZW50IG1hc2sgaW5kaWNhdGluZyBvdXRwdXQgYnVmZmVyIGlzIGZpbGxlZC4gKi8KLSNkZWZpbmUgVlNTX0lWUENNX1BVU0hfQlVGRkVSX01BU0tfT1VUUFVUX0JVRkZFUiAxCi0KLS8qIFB1c2ggYnVmZmVyIGV2ZW50IG1hc2sgaW5kaWNhdGluZyBpbnB1dCBidWZmZXIgaXMgY29uc3VtZWQuICovCi0jZGVmaW5lIFZTU19JVlBDTV9QVVNIX0JVRkZFUl9NQVNLX0lOUFVUX0JVRkZFUiAyCi0KLQotc3RydWN0IHZzc19pdnBjbV9ldnRfcHVzaF9idWZmZXJfdjJfdCB7Ci0JdWludDMyX3QgdGFwX3BvaW50OwotCXVpbnQzMl90IHB1c2hfYnVmX21hc2s7Ci0JdWludDY0X3Qgb3V0X2J1Zl9tZW1fYWRkcmVzczsKLQl1aW50MTZfdCBvdXRfYnVmX21lbV9zaXplOwotCXVpbnQ2NF90IGluX2J1Zl9tZW1fYWRkcmVzczsKLQl1aW50MTZfdCBpbl9idWZfbWVtX3NpemU7Ci0JdWludDE2X3Qgc2FtcGxpbmdfcmF0ZTsKLQl1aW50MTZfdCBudW1faW5fY2hhbm5lbHM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIFZTU19JVlBDTV9FVlRfTk9USUZZX1YyIDB4MDAwMTEzM0IKLQotLyogTm90aWZ5IGV2ZW50IG1hc2sgaW5kaWNhdGVzIG91dHB1dCBidWZmZXIgaXMgZmlsbGVkLiAqLwotI2RlZmluZSBWU1NfSVZQQ01fTk9USUZZX01BU0tfT1VUUFVUX0JVRkZFUiAxCi0KLS8qIE5vdGlmeSBldmVudCBtYXNrIGluZGljYXRlcyBpbnB1dCBidWZmZXIgaXMgY29uc3VtZWQuICovCi0jZGVmaW5lIFZTU19JVlBDTV9OT1RJRllfTUFTS19JTlBVVF9CVUZGRVIgMgotCi0vKiBOb3RpZnkgZXZlbnQgbWFzayBpbmRpY2F0ZXMgYSB0aW1ldGljayAqLwotI2RlZmluZSBWU1NfSVZQQ01fTk9USUZZX01BU0tfVElNRVRJQ0sgNAotCi0vKiBOb3RpZnkgZXZlbnQgbWFzayBpbmRpY2F0ZXMgYW4gZXJyb3Igb2NjdXJyZWQgaW4gb3V0cHV0IGJ1ZmZlciBvcGVyYXRpb24gKi8KLSNkZWZpbmUgVlNTX0lWUENNX05PVElGWV9NQVNLX09VVFBVVF9FUlJPUiA4Ci0KLS8qIE5vdGlmeSBldmVudCBtYXNrIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCBpbiBpbnB1dCBidWZmZXIgb3BlcmF0aW9uICovCi0jZGVmaW5lIFZTU19JVlBDTV9OT1RJRllfTUFTS19JTlBVVF9FUlJPUiAxNgotCi0KLXN0cnVjdCB2c3NfaXZwY21fZXZ0X25vdGlmeV92Ml90IHsKLQl1aW50MzJfdCB0YXBfcG9pbnQ7Ci0JdWludDMyX3Qgbm90aWZ5X21hc2s7Ci0JdWludDY0X3Qgb3V0X2J1ZmZfYWRkcjsKLQl1aW50NjRfdCBpbl9idWZmX2FkZHI7Ci0JdWludDE2X3QgZmlsbGVkX291dF9zaXplOwotCXVpbnQxNl90IHJlcXVlc3RfYnVmX3NpemU7Ci0JdWludDE2X3Qgc2FtcGxpbmdfcmF0ZTsKLQl1aW50MTZfdCBudW1fb3V0X2NoYW5uZWxzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9zdGFydF9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2l2cGNtX2NtZF9zdGFydF92Ml90IHZwY21fc3RhcnRfY21kOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9wdXNoX2J1Zl9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2l2cGNtX2V2dF9wdXNoX2J1ZmZlcl92Ml90IHZwY21fZXZ0X3B1c2hfYnVmZmVyOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBWU1NfSVZQQ01fQ01EX1NUT1AgMHgwMDAxMTAwQgotCi1zdHJ1Y3QgY3ZwX2NyZWF0ZV9mdWxsX2N0bF9zZXNzaW9uX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX2NyZWF0ZV9mdWxsX2NvbnRyb2xfc2Vzc2lvbl92Ml90IGN2cF9zZXNzaW9uOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9jb21tYW5kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZwX3NldF9kZXZpY2VfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pdm9jcHJvY19jbWRfc2V0X2RldmljZV92Ml90IGN2cF9zZXRfZGV2aWNlX3YyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9zZXRfZGV2X2NoYW5uZWxzX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3RvcG9sb2d5X3NldF9kZXZfY2hhbm5lbHNfdCBjdnBfc2V0X2NoYW5uZWxzOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9zZXRfbWVkaWFfZm9ybWF0X2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3BhcmFtX3YyX3QgY3ZwX3NldF9tZWRpYV9wYXJhbV92MjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfc2V0X2NoYW5uZWxfaW5mb19jbWRfdjIgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2ljb21tb25fY21kX3NldF9wYXJhbV9jaGFubmVsX2luZm9fdjJfdAotCQkJCQljdnBfc2V0X2NoX2luZm9fcGFyYW1fdjI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZwX3NldF9tZmNfY29uZmlnX2NtZF92MiB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaWNvbW1vbl9jbWRfc2V0X3BhcmFtX21mY19jb25maWdfdjJfdCBjdnBfc2V0X21mY19wYXJhbV92MjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfc2V0X3ZwM19kYXRhX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9zZXRfcnhfdm9sdW1lX2luZGV4X2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXZvY3Byb2NfY21kX3NldF92b2x1bWVfaW5kZXhfdCBjdnBfc2V0X3ZvbF9pZHg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZwX3NldF9yeF92b2x1bWVfc3RlcF9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2l2b2x1bWVfY21kX3NldF9zdGVwX3QgY3ZwX3NldF92b2xfc3RlcDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfcmVnaXN0ZXJfZGV2X2NmZ19jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2l2b2Nwcm9jX2NtZF9yZWdpc3Rlcl9kZXZpY2VfY29uZmlnX3QgY3ZwX2Rldl9jZmdfZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfZGVyZWdpc3Rlcl9kZXZfY2ZnX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9yZWdpc3Rlcl9jYWxfZGF0YV9jbWQgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2l2b2Nwcm9jX2NtZF9yZWdpc3Rlcl9jYWxpYnJhdGlvbl9kYXRhX3YyX3QgY3ZwX2NhbF9kYXRhOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9kZXJlZ2lzdGVyX2NhbF9kYXRhX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGN2cF9yZWdpc3Rlcl92b2xfY2FsX2RhdGFfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pdm9jcHJvY19jbWRfcmVnaXN0ZXJfdm9sdW1lX2NhbF9kYXRhX3QgY3ZwX3ZvbF9jYWxfZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfZGVyZWdpc3Rlcl92b2xfY2FsX2RhdGFfY21kIHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZwX3NldF9tdXRlX2NtZCB7Ci0Jc3RydWN0IGFwcl9oZHIgaGRyOwotCXN0cnVjdCB2c3NfaXZvbHVtZV9jbWRfbXV0ZV92Ml90IGN2cF9zZXRfbXV0ZTsKLX0gX19wYWNrZWQ7Ci0KLS8qIENCIGZvciB1cC1saW5rIHBhY2tldHMuICovCi10eXBlZGVmIHZvaWQgKCp1bF9jYl9mbikodWludDhfdCAqdm9jX3BrdCwKLQkJCSB1aW50MzJfdCBwa3RfbGVuLAotCQkJIHVpbnQzMl90IHRpbWVzdGFtcCwKLQkJCSB2b2lkICpwcml2YXRlX2RhdGEpOwotCi0vKiBDQiBmb3IgZG93bi1saW5rIHBhY2tldHMuICovCi10eXBlZGVmIHZvaWQgKCpkbF9jYl9mbikodWludDhfdCAqdm9jX3BrdCwKLQkJCSB2b2lkICpwcml2YXRlX2RhdGEpOwotCi0vKiBDQiBmb3IgRFRNRiBSWCBEZXRlY3Rpb24gKi8KLXR5cGVkZWYgdm9pZCAoKmR0bWZfcnhfZGV0X2NiX2ZuKSh1aW50OF90ICpwa3QsCi0JCQkJICBjaGFyICpzZXNzaW9uLAotCQkJCSAgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLQotdHlwZWRlZiB2b2lkICgqdm9pcF9zc3JfY2IpICh1aW50MzJfdCBvcGNvZGUsCi0JCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLQotdHlwZWRlZiB2b2lkICgqaG9zdHBjbV9jYl9mbikodWludDhfdCAqZGF0YSwKLQkJCSAgIGNoYXIgKnNlc3Npb24sCi0JCQkgICB2b2lkICpwcml2YXRlX2RhdGEpOwotCi1zdHJ1Y3QgbXZzX2RyaXZlcl9pbmZvIHsKLQl1aW50MzJfdCBtZWRpYV90eXBlOwotCXVpbnQzMl90IHJhdGU7Ci0JdWludDMyX3QgbmV0d29ya190eXBlOwotCXVpbnQzMl90IGR0eF9tb2RlOwotCXVsX2NiX2ZuIHVsX2NiOwotCWRsX2NiX2ZuIGRsX2NiOwotCXZvaXBfc3NyX2NiIHNzcl9jYjsKLQl2b2lkICpwcml2YXRlX2RhdGE7Ci0JdWludDMyX3QgZXZyY19taW5fcmF0ZTsKLQl1aW50MzJfdCBldnJjX21heF9yYXRlOwotfTsKLQotc3RydWN0IGR0bWZfZHJpdmVyX2luZm8gewotCWR0bWZfcnhfZGV0X2NiX2ZuIGR0bWZfcnhfdWxfY2I7Ci0Jdm9pZCAqcHJpdmF0ZV9kYXRhOwotfTsKLQotc3RydWN0IGhvc3RwY21fZHJpdmVyX2luZm8gewotCWhvc3RwY21fY2JfZm4gaG9zdHBjbV9ldnRfY2I7Ci0Jdm9pZCAqcHJpdmF0ZV9kYXRhOwotfTsKLQotc3RydWN0IGluY2FsbF9yZWNfaW5mbyB7Ci0JdWludDMyX3QgcmVjX2VuYWJsZTsKLQl1aW50MzJfdCByZWNfbW9kZTsKLQl1aW50MzJfdCByZWNvcmRpbmc7Ci19OwotCi1zdHJ1Y3QgaW5jYWxsX211c2ljX2luZm8gewotCXVpbnQzMl90IHBsYXlfZW5hYmxlOwotCXVpbnQzMl90IHBsYXlpbmc7Ci0JaW50IGNvdW50OwotCWludCBmb3JjZTsKLQl1aW50MTZfdCBwb3J0X2lkOwotfTsKLQotc3RydWN0IHNoYXJlX21lbW9yeV9pbmZvIHsKLQl1MzIJCQltZW1faGFuZGxlOwotCXN0cnVjdCBzaGFyZV9tZW1fYnVmCXNoX2J1ZjsKLQlzdHJ1Y3QgbWVtX21hcF90YWJsZQltZW10Ymw7Ci19OwotCi0jZGVmaW5lIFZTU19JU09VTkRGT0NVU19DTURfU0VUX1NFQ1RPUlMgICAgIDB4MDAwMTMxMzMKLSNkZWZpbmUgVlNTX0lTT1VOREZPQ1VTX0NNRF9HRVRfU0VDVE9SUyAgICAgMHgwMDAxMzEzNAotI2RlZmluZSBWU1NfSVNPVU5ERk9DVVNfUlNQX0dFVF9TRUNUT1JTICAgICAweDAwMDEzMTM1Ci0jZGVmaW5lIFZTU19JU09VUkNFVFJBQ0tfQ01EX0dFVF9BQ1RJVklUWSAgIDB4MDAwMTMxMzYKLQotc3RydWN0IHZzc19pc291bmRmb2N1c19jbWRfc2V0X3NlY3RvcnNfdCB7Ci0JdWludDE2X3Qgc3RhcnRfYW5nbGVzWzhdOwotCXVpbnQ4X3QgZW5hYmxlc1s4XTsKLQl1aW50MTZfdCBnYWluX3N0ZXA7Ci19IF9fcGFja2VkOwotCi0vKiBQYXlsb2FkIG9mIHRoZSBWU1NfSVNPVU5ERk9DVVNfUlNQX0dFVF9TRUNUT1JTIHJlc3BvbnNlICovCi1zdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX3JzcF9nZXRfc2VjdG9yc190IHsKLQl1aW50MTZfdCBzdGFydF9hbmdsZXNbOF07Ci0JdWludDhfdCBlbmFibGVzWzhdOwotCXVpbnQxNl90IGdhaW5fc3RlcDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBjdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtX2NtZF90IHsKLQlzdHJ1Y3QgYXByX2hkciBoZHI7Ci0Jc3RydWN0IHZzc19pc291bmRmb2N1c19jbWRfc2V0X3NlY3RvcnNfdCBjdnBfc2V0X3NvdW5kX2ZvY3VzX3BhcmFtOwotfSBfX3BhY2tlZDsKLQotLyogUGF5bG9hZCBzdHJ1Y3R1cmUgZm9yIHRoZSBWU1NfSVNPVVJDRVRSQUNLX0NNRF9HRVRfQUNUSVZJVFkgY29tbWFuZCAqLwotc3RydWN0IHZzc19pc291cmNldHJhY2tfY21kX2dldF9hY3Rpdml0eV90IHsKLQl1aW50MzJfdCBtZW1faGFuZGxlOwotCXVpbnQzMl90IG1lbV9hZGRyZXNzX2xzdzsKLQl1aW50MzJfdCBtZW1fYWRkcmVzc19tc3c7Ci0JdWludDMyX3QgbWVtX3NpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgY3ZwX2dldF9zb3VyY2VfdHJhY2tpbmdfcGFyYW1fY21kX3QgewotCXN0cnVjdCBhcHJfaGRyIGhkcjsKLQlzdHJ1Y3QgdnNzX2lzb3VyY2V0cmFja19jbWRfZ2V0X2FjdGl2aXR5X3QKLQkJCWN2cF9nZXRfc291cmNlX3RyYWNraW5nX3BhcmFtOwotfSBfX3BhY2tlZDsKLQotLyogU3RydWN0dXJlIGZvciB0aGUgc291bmQgYWN0aXZpdHkgZGF0YSAqLwotc3RydWN0IHZzc19pc291cmNldHJhY2tfYWN0aXZpdHlfZGF0YV90IHsKLQl1aW50OF90IHZvaWNlX2FjdGl2ZVs4XTsKLQl1aW50MTZfdCB0YWxrZXJfZG9hOwotCXVpbnQxNl90IGludGVyZmVyZXJfZG9hWzNdOwotCXVpbnQ4X3Qgc291bmRfc3RyZW5ndGhbMzYwXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzaGFyZWRfbWVtX2luZm8gewotCXVpbnQzMl90IG1lbV9oYW5kbGU7Ci0Jc3RydWN0IG1lbV9tYXBfdGFibGUgc2hfbWVtX2Jsb2NrOwotCXN0cnVjdCBtZW1fbWFwX3RhYmxlIHNoX21lbV90YWJsZTsKLX07Ci0KLXN0cnVjdCB2b2ljZV9kYXRhIHsKLQlpbnQgdm9jX3N0YXRlOy8qSU5JVCwgQ0hBTkdFLCBSRUxFQVNFLCBSVU4gKi8KLQotCS8qIFNoYXJlZCBtZW0gdG8gc3RvcmUgZGVjb2RlciBhbmQgZW5jb2RlciBwYWNrZXRzICovCi0Jc3RydWN0IHNoYXJlX21lbW9yeV9pbmZvCXNobWVtX2luZm87Ci0KLQl3YWl0X3F1ZXVlX2hlYWRfdCBtdm1fd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjdnNfd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjdnBfd2FpdDsKLQotCS8qIENhY2hlIHRoZSB2YWx1ZXMgcmVsYXRlZCB0byBSeCBhbmQgVHggZGV2aWNlcyAqLwotCXN0cnVjdCBkZXZpY2VfZGF0YSBkZXZfcng7Ci0Jc3RydWN0IGRldmljZV9kYXRhIGRldl90eDsKLQotCS8qIENhY2hlIHRoZSB2YWx1ZXMgcmVsYXRlZCB0byBSeCBhbmQgVHggc3RyZWFtcyAqLwotCXN0cnVjdCBzdHJlYW1fZGF0YSBzdHJlYW1fcng7Ci0Jc3RydWN0IHN0cmVhbV9kYXRhIHN0cmVhbV90eDsKLQotCXUzMiBtdm1fc3RhdGU7Ci0JdTMyIGN2c19zdGF0ZTsKLQl1MzIgY3ZwX3N0YXRlOwotCi0JdTMyIGFzeW5jX2VycjsKLQotCS8qIEhhbmRsZSB0byBNVk0gaW4gdGhlIFE2ICovCi0JdTE2IG12bV9oYW5kbGU7Ci0JLyogSGFuZGxlIHRvIENWUyBpbiB0aGUgUTYgKi8KLQl1MTYgY3ZzX2hhbmRsZTsKLQkvKiBIYW5kbGUgdG8gQ1ZQIGluIHRoZSBRNiAqLwotCXUxNiBjdnBfaGFuZGxlOwotCi0Jc3RydWN0IG11dGV4IGxvY2s7Ci0KLQlib29sIGRpc2FibGVfdG9wb2xvZ3k7Ci0KLQl1aW50MTZfdCBzaWRldG9uZV9nYWluOwotCXVpbnQ4X3QgdHR5X21vZGU7Ci0JLyogc2xvd3RhbGsgZW5hYmxlIHZhbHVlICovCi0JdWludDMyX3Qgc3RfZW5hYmxlOwotCXVpbnQzMl90IGhkX2VuYWJsZTsKLQl1aW50MzJfdCBkdG1mX3J4X2RldGVjdF9lbjsKLQkvKiBMb2NhbCBDYWxsIEhvbGQgbW9kZSAqLwotCXVpbnQ4X3QgbGNoX21vZGU7Ci0KLQlzdHJ1Y3Qgdm9pY2VfZGV2X3JvdXRlX3N0YXRlIHZvY19yb3V0ZV9zdGF0ZTsKLQotCXUzMiBzZXNzaW9uX2lkOwotCi0Jc3RydWN0IGluY2FsbF9yZWNfaW5mbyByZWNfaW5mbzsKLQotCXN0cnVjdCBpbmNhbGxfbXVzaWNfaW5mbyBtdXNpY19pbmZvOwotCi0Jc3RydWN0IHZvaWNlX3JlY19yb3V0ZV9zdGF0ZSByZWNfcm91dGVfc3RhdGU7Ci19OwotCi1zdHJ1Y3QgY2FsX21lbSB7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQl1aW50MzJfdCBwaHk7Ci0Jdm9pZCAqYnVmOwotfTsKLQotI2RlZmluZSBNQVhfVk9DX1NFU1NJT05TIDgKLQotc3RydWN0IGNvbW1vbl9kYXRhIHsKLQkvKiB0aGVzZSBkZWZhdWx0IHZhbHVlcyBhcmUgZm9yIGFsbCBkZXZpY2VzICovCi0JdWludDMyX3QgZGVmYXVsdF9tdXRlX3ZhbDsKLQl1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV92YWw7Ci0JdWludDMyX3QgZGVmYXVsdF92b2xfc3RlcF92YWw7Ci0JdWludDMyX3QgZGVmYXVsdF92b2xfcmFtcF9kdXJhdGlvbl9tczsKLQl1aW50MzJfdCBkZWZhdWx0X211dGVfcmFtcF9kdXJhdGlvbl9tczsKLQlib29sIGVjX3JlZl9leHQ7Ci0Jc3RydWN0IG1lZGlhX2Zvcm1hdF9pbmZvIGVjX21lZGlhX2ZtdF9pbmZvOwotCi0JLyogQVBSIHRvIE1WTSBpbiB0aGUgUTYgKi8KLQl2b2lkICphcHJfcTZfbXZtOwotCS8qIEFQUiB0byBDVlMgaW4gdGhlIFE2ICovCi0Jdm9pZCAqYXByX3E2X2N2czsKLQkvKiBBUFIgdG8gQ1ZQIGluIHRoZSBRNiAqLwotCXZvaWQgKmFwcl9xNl9jdnA7Ci0KLQlzdHJ1Y3QgY2FsX3R5cGVfZGF0YSAqY2FsX2RhdGFbTUFYX1ZPSUNFX0NBTF9UWVBFU107Ci0KLQlzdHJ1Y3QgbWVtX21hcF90YWJsZSBjYWxfbWVtX21hcF90YWJsZTsKLQl1aW50MzJfdCBjYWxfbWVtX2hhbmRsZTsKLQotCXN0cnVjdCBtZW1fbWFwX3RhYmxlIHJ0YWNfbWVtX21hcF90YWJsZTsKLQl1aW50MzJfdCBydGFjX21lbV9oYW5kbGU7Ci0KLQl1aW50MzJfdCB2b2ljZV9ob3N0X3BjbV9tZW1faGFuZGxlOwotCi0Jc3RydWN0IGNhbF9tZW0gY3ZwX2NhbDsKLQlzdHJ1Y3QgY2FsX21lbSBjdnNfY2FsOwotCi0Jc3RydWN0IG11dGV4IGNvbW1vbl9sb2NrOwotCi0Jc3RydWN0IG12c19kcml2ZXJfaW5mbyBtdnNfaW5mbzsKLQotCXN0cnVjdCBkdG1mX2RyaXZlcl9pbmZvIGR0bWZfaW5mbzsKLQotCXN0cnVjdCBob3N0cGNtX2RyaXZlcl9pbmZvIGhvc3RwY21faW5mbzsKLQotCXN0cnVjdCB2b2ljZV9kYXRhIHZvaWNlW01BWF9WT0NfU0VTU0lPTlNdOwotCi0JYm9vbCBzcnZjY19yZWNfZmxhZzsKLQlib29sIGlzX2Rlc3Ryb3lfY3ZkOwotCWNoYXIgY3ZkX3ZlcnNpb25bQ1ZEX1ZFUlNJT05fU1RSSU5HX01BWF9TSVpFXTsKLQlpbnQgY3ZwX3ZlcnNpb247Ci0JYm9vbCBpc19hdmNzX3ZlcnNpb25fcXVlcmllZDsKLQlib29sIGlzX3Blcl92b2NvZGVyX2NhbF9lbmFibGVkOwotCWJvb2wgaXNfc291bmRfZm9jdXNfcmVzcF9zdWNjZXNzOwotCWJvb2wgaXNfc291cmNlX3RyYWNraW5nX3Jlc3Bfc3VjY2VzczsKLQlzdHJ1Y3QgdnNzX2lzb3VuZGZvY3VzX3JzcF9nZXRfc2VjdG9yc190IHNvdW5kRm9jdXNSZXNwb25zZTsKLQlzdHJ1Y3Qgc2hhcmVkX21lbV9pbmZvIHNvdXJjZV90cmFja2luZ19zaF9tZW07Ci0Jc3RydWN0IHZzc19pc291cmNldHJhY2tfYWN0aXZpdHlfZGF0YV90IHNvdXJjZVRyYWNraW5nUmVzcG9uc2U7Ci0JYm9vbCBzaWRldG9uZV9lbmFibGU7Ci19OwotCi1zdHJ1Y3Qgdm9pY2Vfc2Vzc2lvbl9pdHIgewotCWludCBjdXJfaWR4OwotCWludCBzZXNzaW9uX2lkeDsKLX07Ci0KLXZvaWQgdm9jX3JlZ2lzdGVyX212c19jYih1bF9jYl9mbiB1bF9jYiwKLQkJCWRsX2NiX2ZuIGRsX2NiLAotCQkJdm9pcF9zc3JfY2Igc3NyX2NiLAotCQkJdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLQotdm9pZCB2b2NfcmVnaXN0ZXJfZHRtZl9yeF9kZXRlY3Rpb25fY2IoZHRtZl9yeF9kZXRfY2JfZm4gZHRtZl9yeF91bF9jYiwKLQkJCQkgICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLQotdm9pZCB2b2NfY29uZmlnX3ZvY29kZXIodWludDMyX3QgbWVkaWFfdHlwZSwKLQkJCXVpbnQzMl90IHJhdGUsCi0JCQl1aW50MzJfdCBuZXR3b3JrX3R5cGUsCi0JCQl1aW50MzJfdCBkdHhfbW9kZSwKLQkJCXVpbnQzMl90IGV2cmNfbWluX3JhdGUsCi0JCQl1aW50MzJfdCBldnJjX21heF9yYXRlKTsKLQotZW51bSB7Ci0JREVWX1JYID0gMCwKLQlERVZfVFgsCi19OwotCi1lbnVtIHsKLQlSWF9QQVRIID0gMCwKLQlUWF9QQVRILAotCUVDX1JFRl9QQVRILAotfTsKLQotI2RlZmluZSBWT0NfUEFUSF9QQVNTSVZFIDAKLSNkZWZpbmUgVk9DX1BBVEhfRlVMTCAxCi0jZGVmaW5lIFZPQ19QQVRIX1ZPTFRFX1BBU1NJVkUgMgotI2RlZmluZSBWT0NfUEFUSF9WT0lDRTJfUEFTU0lWRSAzCi0jZGVmaW5lIFZPQ19QQVRIX1FDSEFUX1BBU1NJVkUgNAotI2RlZmluZSBWT0NfUEFUSF9WT1dMQU5fUEFTU0lWRSA1Ci0jZGVmaW5lIFZPQ19QQVRIX1ZPSUNFTU1PREUxX1BBU1NJVkUgNgotI2RlZmluZSBWT0NfUEFUSF9WT0lDRU1NT0RFMl9QQVNTSVZFIDcKLQotI2RlZmluZSBNQVhfU0VTU0lPTl9OQU1FX0xFTiAzMgotI2RlZmluZSBWT0lDRV9TRVNTSU9OX05BTUUgICAiVm9pY2Ugc2Vzc2lvbiIKLSNkZWZpbmUgVk9JUF9TRVNTSU9OX05BTUUgICAgIlZvSVAgc2Vzc2lvbiIKLSNkZWZpbmUgVk9MVEVfU0VTU0lPTl9OQU1FICAgIlZvTFRFIHNlc3Npb24iCi0jZGVmaW5lIFZPSUNFMl9TRVNTSU9OX05BTUUgICJWb2ljZTIgc2Vzc2lvbiIKLSNkZWZpbmUgUUNIQVRfU0VTU0lPTl9OQU1FICAgIlFDSEFUIHNlc3Npb24iCi0jZGVmaW5lIFZPV0xBTl9TRVNTSU9OX05BTUUgICJWb1dMQU4gc2Vzc2lvbiIKLSNkZWZpbmUgVk9JQ0VNTU9ERTFfTkFNRSAgICAgIlZvaWNlTU1vZGUxIgotI2RlZmluZSBWT0lDRU1NT0RFMl9OQU1FICAgICAiVm9pY2VNTW9kZTIiCi0KLSNkZWZpbmUgVk9JQ0UyX1NFU1NJT05fVlNJRF9TVFIgICAgICAiMTBEQzEwMDAiCi0jZGVmaW5lIFFDSEFUX1NFU1NJT05fVlNJRF9TVFIgICAgICAgIjEwODAzMDAwIgotI2RlZmluZSBWT1dMQU5fU0VTU0lPTl9WU0lEX1NUUiAgICAgICIxMDAwMjAwMCIKLSNkZWZpbmUgVk9JQ0VNTU9ERTFfVlNJRF9TVFIgICAgICAgICAiMTFDMDUwMDAiCi0jZGVmaW5lIFZPSUNFTU1PREUyX1ZTSURfU1RSICAgICAgICAgIjExREM1MDAwIgotI2RlZmluZSBWT0lDRV9TRVNTSU9OX1ZTSUQgICAgICAgICAgIDB4MTBDMDEwMDAKLSNkZWZpbmUgVk9JQ0UyX1NFU1NJT05fVlNJRCAgICAgICAgICAweDEwREMxMDAwCi0jZGVmaW5lIFZPTFRFX1NFU1NJT05fVlNJRCAgICAgICAgICAgMHgxMEMwMjAwMAotI2RlZmluZSBWT0lQX1NFU1NJT05fVlNJRCAgICAgICAgICAgIDB4MTAwMDQwMDAKLSNkZWZpbmUgUUNIQVRfU0VTU0lPTl9WU0lEICAgICAgICAgICAweDEwODAzMDAwCi0jZGVmaW5lIFZPV0xBTl9TRVNTSU9OX1ZTSUQgICAgICAgICAgMHgxMDAwMjAwMAotI2RlZmluZSBWT0lDRU1NT0RFMV9WU0lEICAgICAgICAgICAgIDB4MTFDMDUwMDAKLSNkZWZpbmUgVk9JQ0VNTU9ERTJfVlNJRCAgICAgICAgICAgICAweDExREM1MDAwCi0jZGVmaW5lIEFMTF9TRVNTSU9OX1ZTSUQgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBWU0lEX01BWCAgICAgICAgICAgICAgICAgICAgIEFMTF9TRVNTSU9OX1ZTSUQKLQotLyogY2FsbGVkICBieSBhbHNhIGRyaXZlciAqLwotaW50IHZvY19zZXRfcHBfZW5hYmxlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IG1vZHVsZV9pZCwKLQkJICAgICAgdWludDMyX3QgZW5hYmxlKTsKLWludCB2b2NfZ2V0X3BwX2VuYWJsZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBtb2R1bGVfaWQpOwotaW50IHZvY19zZXRfaGRfZW5hYmxlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGVuYWJsZSk7Ci11aW50OF90IHZvY19nZXRfdHR5X21vZGUodWludDMyX3Qgc2Vzc2lvbl9pZCk7Ci1pbnQgdm9jX3NldF90dHlfbW9kZSh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50OF90IHR0eV9tb2RlKTsKLWludCB2b2Nfc3RhcnRfdm9pY2VfY2FsbCh1aW50MzJfdCBzZXNzaW9uX2lkKTsKLWludCB2b2NfZW5kX3ZvaWNlX2NhbGwodWludDMyX3Qgc2Vzc2lvbl9pZCk7Ci1pbnQgdm9jX3N0YW5kYnlfdm9pY2VfY2FsbCh1aW50MzJfdCBzZXNzaW9uX2lkKTsKLWludCB2b2NfcmVzdW1lX3ZvaWNlX2NhbGwodWludDMyX3Qgc2Vzc2lvbl9pZCk7Ci1pbnQgdm9jX3NldF9sY2godWludDMyX3Qgc2Vzc2lvbl9pZCwgZW51bSB2b2ljZV9sY2hfbW9kZSBsY2hfbW9kZSk7Ci1pbnQgdm9jX3NldF9yeF92b2xfc3RlcCh1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBkaXIsIHVpbnQzMl90IHZvbF9zdGVwLAotCQkJdWludDMyX3QgcmFtcF9kdXJhdGlvbik7Ci1pbnQgdm9jX3NldF90eF9tdXRlKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQzMl90IGRpciwgdWludDMyX3QgbXV0ZSwKLQkJICAgIHVpbnQzMl90IHJhbXBfZHVyYXRpb24pOwotaW50IHZvY19zZXRfZGV2aWNlX211dGUodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlyLCB1aW50MzJfdCBtdXRlLAotCQkJdWludDMyX3QgcmFtcF9kdXJhdGlvbik7Ci1pbnQgdm9jX2dldF9yeF9kZXZpY2VfbXV0ZSh1aW50MzJfdCBzZXNzaW9uX2lkKTsKLWludCB2b2Nfc2V0X3JvdXRlX2ZsYWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2RpciwgdWludDhfdCBzZXQpOwotdWludDhfdCB2b2NfZ2V0X3JvdXRlX2ZsYWcodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDhfdCBwYXRoX2Rpcik7Ci1pbnQgdm9jX2VuYWJsZV9kdG1mX3J4X2RldGVjdGlvbih1aW50MzJfdCBzZXNzaW9uX2lkLCB1aW50MzJfdCBlbmFibGUpOwotdm9pZCB2b2NfZGlzYWJsZV9kdG1mX2RldF9vbl9hY3RpdmVfc2Vzc2lvbnModm9pZCk7Ci1pbnQgdm9jX2FsbG9jX2NhbF9zaGFyZWRfbWVtb3J5KHZvaWQpOwotaW50IHZvY19hbGxvY192b2lwX3NoYXJlZF9tZW1vcnkodm9pZCk7Ci1pbnQgaXNfdm9jX2luaXRpYWxpemVkKHZvaWQpOwotaW50IHZvY19yZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSh2b2lkKTsKLWludCB2b2NfZGVyZWdpc3Rlcl92b2Nwcm9jX3ZvbF90YWJsZSh2b2lkKTsKLWludCB2b2Nfc2VuZF9jdnBfbWFwX3ZvY3BjbV9tZW1vcnkodWludDMyX3Qgc2Vzc2lvbl9pZCwKLQkJCQkgICBzdHJ1Y3QgbWVtX21hcF90YWJsZSAqdHBfbWVtX3RhYmxlLAotCQkJCSAgIHBoeXNfYWRkcl90IHBhZGRyLCB1aW50MzJfdCBidWZzaXplKTsKLWludCB2b2Nfc2VuZF9jdnBfdW5tYXBfdm9jcGNtX21lbW9yeSh1aW50MzJfdCBzZXNzaW9uX2lkKTsKLWludCB2b2Nfc2VuZF9jdnBfc3RhcnRfdm9jcGNtKHVpbnQzMl90IHNlc3Npb25faWQsCi0JCQkgICAgICBzdHJ1Y3QgdnNzX2l2cGNtX3RhcF9wb2ludCAqdnBjbV90cCwKLQkJCSAgICAgIHVpbnQzMl90IG5vX29mX3RwKTsKLWludCB2b2Nfc2VuZF9jdnBfdm9jcGNtX3B1c2hfYnVmX2V2dCh1aW50MzJfdCBzZXNzaW9uX2lkLAotCQkJc3RydWN0IHZzc19pdnBjbV9ldnRfcHVzaF9idWZmZXJfdjJfdCAqcHVzaF9idWZmX2V2dCk7Ci1pbnQgdm9jX3NlbmRfY3ZwX3N0b3Bfdm9jcGNtKHVpbnQzMl90IHNlc3Npb25faWQpOwotdm9pZCB2b2NfcmVnaXN0ZXJfaHBjbV9ldnRfY2IoaG9zdHBjbV9jYl9mbiBob3N0cGNtX2NiLAotCQkJICAgICAgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLXZvaWQgdm9jX2RlcmVnaXN0ZXJfaHBjbV9ldnRfY2Iodm9pZCk7Ci0KLWludCB2b2NfbWFwX3J0YWNfYmxvY2soc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEgKmNhbF9ibG9jayk7Ci1pbnQgdm9jX3VubWFwX3J0YWNfYmxvY2sodWludDMyX3QgKm1lbV9tYXBfaGFuZGxlKTsKLQotdWludDMyX3Qgdm9jX2dldF9zZXNzaW9uX2lkKGNoYXIgKm5hbWUpOwotCi1pbnQgdm9jX3N0YXJ0X3BsYXliYWNrKHVpbnQzMl90IHNldCwgdWludDE2X3QgcG9ydF9pZCk7Ci1pbnQgdm9jX3N0YXJ0X3JlY29yZCh1aW50MzJfdCBwb3J0X2lkLCB1aW50MzJfdCBzZXQsIHVpbnQzMl90IHNlc3Npb25faWQpOwotaW50IHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24odTMyIHNlc3Npb25faWQpOwotaW50IHZvY19zZXRfZXh0X2VjX3JlZl9wb3J0X2lkKHVpbnQxNl90IHBvcnRfaWQsIGJvb2wgc3RhdGUpOwotaW50IHZvY19nZXRfZXh0X2VjX3JlZl9wb3J0X2lkKHZvaWQpOwotaW50IHZvY19zZXRfZXh0X2VjX3JlZl9tZWRpYV9mbXRfaW5mbyhzdHJ1Y3QgbWVkaWFfZm9ybWF0X2luZm8gKmZpbmZvKTsKLWludCB2b2NfdXBkYXRlX2Ftcl92b2NvZGVyX3JhdGUodWludDMyX3Qgc2Vzc2lvbl9pZCk7Ci1pbnQgdm9jX2Rpc2FibGVfZGV2aWNlKHVpbnQzMl90IHNlc3Npb25faWQpOwotaW50IHZvY19lbmFibGVfZGV2aWNlKHVpbnQzMl90IHNlc3Npb25faWQpOwotdm9pZCB2b2Nfc2V0X2Rlc3Ryb3lfY3ZkX2ZsYWcoYm9vbCBpc19kZXN0cm95X2N2ZCk7Ci1pbnQgdm9jX2Rpc2FibGVfdG9wb2xvZ3kodWludDMyX3Qgc2Vzc2lvbl9pZCwgdWludDMyX3QgZGlzYWJsZSk7Ci1pbnQgdm9jX3NldF9kZXZpY2VfY29uZmlnKHVpbnQzMl90IHNlc3Npb25faWQsIHVpbnQ4X3QgcGF0aF9kaXIsCi0JCQkgIHN0cnVjdCBtZWRpYV9mb3JtYXRfaW5mbyAqZmluZm8pOwotdWludDMyX3Qgdm9pY2VfZ2V0X3RvcG9sb2d5KHVpbnQzMl90IHRvcG9sb2d5X2lkeCk7Ci1pbnQgdm9jX3NldF9zb3VuZF9mb2N1cyhzdHJ1Y3Qgc291bmRfZm9jdXNfcGFyYW0gc291bmRfZm9jdXNfcGFyYW0pOwotaW50IHZvY19nZXRfc291bmRfZm9jdXMoc3RydWN0IHNvdW5kX2ZvY3VzX3BhcmFtICpzb3VuZEZvY3VzRGF0YSk7Ci1pbnQgdm9jX2dldF9zb3VyY2VfdHJhY2tpbmcoc3RydWN0IHNvdXJjZV90cmFja2luZ19wYXJhbSAqc291cmNlVHJhY2tpbmdEYXRhKTsKLWludCB2b2Nfc2V0X2FmZV9zaWRldG9uZSh1aW50MzJfdCBzZXNzaW9uX2lkLCBib29sIHNpZGV0b25lX2VuYWJsZSk7Ci1ib29sIHZvY19nZXRfYWZlX3NpZGV0b25lKHZvaWQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcnRhYy5jIGIvc291bmQvc29jL21zbS9xZHNwNnYyL3J0YWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwMjUwMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3Fkc3A2djIvcnRhYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19jYWxpYnJhdGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L21zbV9hdWRpb19pb24uaD4KLSNpbmNsdWRlIDxsaW51eC9xZHNwNnYyL3J0YWMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmFzbS12Mi5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZG0tdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9hcHJfYXVkaW8tdjIuaD4KLSNpbmNsdWRlICJxNnZvaWNlLmgiCi0jaW5jbHVkZSAibXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSA8c291bmQvYWRzcF9lcnIuaD4KLQotCi0vKiBNYXggc2l6ZSBvZiBwYXlsb2FkIChidWYgc2l6ZSAtIGFwciBoZWFkZXIpICovCi0jZGVmaW5lIE1BWF9QQVlMT0FEX1NJWkUJCTQwNzYKLSNkZWZpbmUgUlRBQ19NQVhfQUNUSVZFX1ZPSUNFX0NPTUJPUwkyCi0jZGVmaW5lIFJUQUNfTUFYX0FDVElWRV9QT1BQCQk4Ci0jZGVmaW5lIFJUQUNfQlVGX1NJWkUJCQkxNjM4NDAKLQotI2RlZmluZSBUSU1FT1VUX01TCTEwMDAKLQotc3RydWN0IHJ0YWNfY2FsX2Jsb2NrX2RhdGEJcnRhY19jYWxbTUFYX1JUQUNfQkxPQ0tTXSA9IHsKLS8qIEFETV9SVEFDX0NBTCAqLwotCXt7UlRBQ19CVUZfU0laRSwgMCwgMCwgMH0sIHswLCAwLCAwfSB9LAotLyogQVNNX1JUQUNfQ0FMICovCi0Je3tSVEFDX0JVRl9TSVpFLCAwLCAwLCAwfSwgezAsIDAsIDB9IH0sCi0vKiBWT0lDRV9SVEFDX0NBTCAqLwotCXt7UlRBQ19CVUZfU0laRSwgMCwgMCwgMH0sIHswLCAwLCAwfSB9LAotLyogQUZFX1JUQUNfQ0FMICovCi0Je3tSVEFDX0JVRl9TSVpFLCAwLCAwLCAwfSwgezAsIDAsIDB9IH0KLX07Ci0KLXN0cnVjdCBydGFjX2NvbW1vbl9kYXRhIHsKLQlhdG9taWNfdAkJCXVzYWdlX2NvdW50OwotCWF0b21pY190CQkJYXByX2Vycl9jb2RlOwotfTsKLQotc3RhdGljIHN0cnVjdCBydGFjX2NvbW1vbl9kYXRhCQlydGFjX2NvbW1vbjsKLQotLyogQVBSIGRhdGEgKi8KLXN0cnVjdCBydGFjX2Fwcl9kYXRhIHsKLQl2b2lkCQkJKmFwcl9oYW5kbGU7Ci0JYXRvbWljX3QJCWNtZF9zdGF0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAljbWRfd2FpdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRhY19hcHJfZGF0YSBydGFjX2FkbV9hcHJfZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgcnRhY19hcHJfZGF0YSBydGFjX2FzbV9hcHJfZGF0YVtBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCArIDFdOwotc3RhdGljIHN0cnVjdCBydGFjX2Fwcl9kYXRhCXJ0YWNfYWZlX2Fwcl9kYXRhOwotc3RhdGljIHN0cnVjdCBydGFjX2Fwcl9kYXRhCXJ0YWNfdm9pY2VfYXByX2RhdGFbUlRBQ19WT0lDRV9NT0RFU107Ci0KLS8qIEFETSBpbmZvICYgQVBSICovCi1zdGF0aWMgc3RydWN0IHJ0YWNfYWRtCQlydGFjX2FkbV9kYXRhOwotc3RhdGljIHUzMgkJCSpydGFjX2FkbV9idWZmZXI7Ci0KLQotLyogQVNNIEFQUiAqLwotc3RhdGljIHUzMgkJCSpydGFjX2FzbV9idWZmZXI7Ci0KLXN0YXRpYyB1MzIJCQkqcnRhY19hZmVfYnVmZmVyOwotCi0vKiBWb2ljZSBpbmZvICYgQVBSICovCi1zdHJ1Y3QgcnRhY192b2ljZV9kYXRhX3QgewotCXVpbnQzMl90CXR4X3RvcG9sb2d5X2lkOwotCXVpbnQzMl90CXJ4X3RvcG9sb2d5X2lkOwotCXVpbnQzMl90CXR4X2FmZV90b3BvbG9neTsKLQl1aW50MzJfdAlyeF9hZmVfdG9wb2xvZ3k7Ci0JdWludDMyX3QJdHhfYWZlX3BvcnQ7Ci0JdWludDMyX3QJcnhfYWZlX3BvcnQ7Ci0JdWludDE2X3QJY3ZzX2hhbmRsZTsKLQl1aW50MTZfdAljdnBfaGFuZGxlOwotCXVpbnQzMl90CXR4X2FjZGJfaWQ7Ci0JdWludDMyX3QJcnhfYWNkYl9pZDsKLX07Ci0KLXN0cnVjdCBydGFjX3ZvaWNlIHsKLQl1aW50MzJfdAkJCW51bV9vZl92b2ljZV9jb21ib3M7Ci0Jc3RydWN0IHJ0YWNfdm9pY2VfZGF0YV90CXZvaWNlW1JUQUNfTUFYX0FDVElWRV9WT0lDRV9DT01CT1NdOwotfTsKLQotc3RydWN0IHJ0YWNfYWZlX3VzZXJfZGF0YSB7Ci0JdWludDMyX3QJYnVmX3NpemU7Ci0JdWludDMyX3QJY21kX3NpemU7Ci0JdWludDMyX3QJcG9ydF9pZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBydGFjX2FmZV9zZXQgewotCQkJc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgY21kOwotCQkJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgZGF0YTsKLQkJfSBydGFjX2FmZV9zZXQ7Ci0JCXN0cnVjdCBydGFjX2FmZV9nZXQgewotCQkJc3RydWN0IGFmZV9wb3J0X2NtZF9nZXRfcGFyYW1fdjIgY21kOwotCQkJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgICAgZGF0YTsKLQkJfSBydGFjX2FmZV9nZXQ7Ci0JfTsKLX0gIF9fcGFja2VkOwotCi1zdGF0aWMgc3RydWN0IHJ0YWNfdm9pY2UJcnRhY192b2ljZV9kYXRhOwotc3RhdGljIHUzMgkJCSpydGFjX3ZvaWNlX2J1ZmZlcjsKLXN0YXRpYyB1MzIJCQl2b2ljZV9zZXNzaW9uX2lkW1JUQUNfTUFYX0FDVElWRV9WT0lDRV9DT01CT1NdOwotCi0KLXN0cnVjdCBtdXRleAkJCXJ0YWNfYWRtX211dGV4Owotc3RydWN0IG11dGV4CQkJcnRhY19hZG1fYXByX211dGV4Owotc3RydWN0IG11dGV4CQkJcnRhY19hc21fYXByX211dGV4Owotc3RydWN0IG11dGV4CQkJcnRhY192b2ljZV9tdXRleDsKLXN0cnVjdCBtdXRleAkJCXJ0YWNfdm9pY2VfYXByX211dGV4Owotc3RydWN0IG11dGV4CQkJcnRhY19hZmVfYXByX211dGV4OwotCi1pbnQgcnRhY19jbGVhcl9tYXBwaW5nKHVpbnQzMl90IGNhbF90eXBlKQotewotCWludCByZXN1bHQgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX3R5cGUgPj0gTUFYX1JUQUNfQkxPQ0tTKSB7Ci0JCXByX2RlYnVnKCIlczogaW52YWxpZCBjYWwgdHlwZSAlZFxuIiwgX19mdW5jX18sIGNhbF90eXBlKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID0gMDsKLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHJ0YWNfYWxsb2NhdGVfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzaXplX3QgbGVuOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoY2FsX3R5cGUgPj0gTUFYX1JUQUNfQkxPQ0tTKSB7Ci0JCXByX2VycigiJXM6IGNhbF90eXBlICVkIGlzIGludmFsaWQhXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlKTsKLQkJcmVzdWx0ID0gIC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAocnRhY19jYWxbY2FsX3R5cGVdLmNhbF9kYXRhLnBhZGRyICE9IDApIHsKLQkJcHJfZXJyKCIlczogbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkISBjYWxfdHlwZSAlZCwgcGFkZHIgMHglcEtcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2FsX3R5cGUsICZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIpOwotCQlyZXN1bHQgPSAtRVBFUk07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXN1bHQgPSBtc21fYXVkaW9faW9uX2FsbG9jKCJydGFjX2NsaWVudCIsCi0JCSZydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEuaW9uX2NsaWVudCwKLQkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5pb25faGFuZGxlLAotCQlydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEubWFwX3NpemUsCi0JCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIsCi0JCSZsZW4sCi0JCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEua3ZhZGRyKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBJT04gY3JlYXRlIGNsaWVudCBmb3IgUlRBQyBmYWlsZWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNhbF90eXBlICVkLCBwYWRkciAweCVwSywga3ZhZGRyIDB4JXBLLCBtYXBfc2l6ZSAweCV4XG4iLAotCQlfX2Z1bmNfXywgY2FsX3R5cGUsCi0JCSZydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIsCi0JCXJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5rdmFkZHIsCi0JCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfc2l6ZSk7Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBydGFjX2ZyZWVfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCXJlc3VsdCA9ICAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5pb25fY2xpZW50ID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIiVzOiBjYWxfdHlwZSAlZCBub3QgYWxsb2NhdGVkIVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyZXN1bHQgPSBtc21fYXVkaW9faW9uX2ZyZWUocnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9jbGllbnQsCi0JCQkJcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9oYW5kbGUpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByX2VycigiJXM6IElPTiBmcmVlIGZvciBSVEFDIGZhaWxlZCEgY2FsX3R5cGUgJWQsIHBhZGRyIDB4JXBLXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlLCAmcnRhY19jYWxbY2FsX3R5cGVdLmNhbF9kYXRhLnBhZGRyKTsKLQkJZ290byBkb25lOwotCX0KLQotCXJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID0gMDsKLQlydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEuaW9uX2NsaWVudCA9IE5VTEw7Ci0JcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLmlvbl9oYW5kbGUgPSBOVUxMOwotCXJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5zaXplID0gMDsKLQlydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEua3ZhZGRyID0gMDsKLQlydGFjX2NhbFtjYWxfdHlwZV0uY2FsX2RhdGEucGFkZHIgPSAwOwotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcnRhY19tYXBfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCXJlc3VsdCA9ICAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlICE9IDApIHsKLQkJcHJfZXJyKCIlczogYWxyZWFkeSBtYXBwZWQgY2FsX3R5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2FsX3R5cGUpOwotCQlyZXN1bHQgPSAgLUVQRVJNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5jYWxfZGF0YS5wYWRkciA9PSAwKSB7Ci0JCXByX2VycigiJXM6IHBoeXNpY2FsIGFkZHJlc3MgaXMgTlVMTCBjYWxfdHlwZSAlZFxuIiwKLQkJCV9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCXJlc3VsdCA9ICAtRVBFUk07Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JY2FzZSBBRE1fUlRBQ19DQUw6Ci0JCXJlc3VsdCA9IGFkbV9tYXBfcnRhY19ibG9jaygmcnRhY19jYWxbY2FsX3R5cGVdKTsKLQkJYnJlYWs7Ci0JY2FzZSBBU01fUlRBQ19DQUw6Ci0JCXJlc3VsdCA9IHE2YXNtX21hcF9ydGFjX2Jsb2NrKCZydGFjX2NhbFtjYWxfdHlwZV0pOwotCQlicmVhazsKLQljYXNlIFZPSUNFX1JUQUNfQ0FMOgotCQlyZXN1bHQgPSB2b2NfbWFwX3J0YWNfYmxvY2soJnJ0YWNfY2FsW2NhbF90eXBlXSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1JUQUNfQ0FMOgotCQlyZXN1bHQgPSBhZmVfbWFwX3J0YWNfYmxvY2soJnJ0YWNfY2FsW2NhbF90eXBlXSk7Ci0JCWJyZWFrOwotCX0KLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBtYXAgUlRBQyBmYWlsZWQhIGNhbF90eXBlICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNhbF90eXBlKTsKLQkJZ290byBkb25lOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHJ0YWNfdW5tYXBfY2FsX2J1ZmZlcih1aW50MzJfdCBjYWxfdHlwZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKGNhbF90eXBlID49IE1BWF9SVEFDX0JMT0NLUykgewotCQlwcl9lcnIoIiVzOiBjYWxfdHlwZSAlZCBpcyBpbnZhbGlkIVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCXJlc3VsdCA9ICAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlID09IDApIHsKLQkJcHJfZGVidWcoIiVzOiBub3RoaW5nIHRvIHVubWFwIGNhbF90eXBlICVkXG4iLAotCQkJX19mdW5jX18sIGNhbF90eXBlKTsKLQkJZ290byBkb25lOwotCX0KLQotCXN3aXRjaCAoY2FsX3R5cGUpIHsKLQljYXNlIEFETV9SVEFDX0NBTDoKLQkJcmVzdWx0ID0gYWRtX3VubWFwX3J0YWNfYmxvY2soCi0JCQkmcnRhY19jYWxbY2FsX3R5cGVdLm1hcF9kYXRhLm1hcF9oYW5kbGUpOwotCQlicmVhazsKLQljYXNlIEFTTV9SVEFDX0NBTDoKLQkJcmVzdWx0ID0gcTZhc21fdW5tYXBfcnRhY19ibG9jaygKLQkJCSZydGFjX2NhbFtjYWxfdHlwZV0ubWFwX2RhdGEubWFwX2hhbmRsZSk7Ci0JCWJyZWFrOwotCWNhc2UgVk9JQ0VfUlRBQ19DQUw6Ci0JCXJlc3VsdCA9IHZvY191bm1hcF9ydGFjX2Jsb2NrKAotCQkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUlRBQ19DQUw6Ci0JCXJlc3VsdCA9IGFmZV91bm1hcF9ydGFjX2Jsb2NrKAotCQkJJnJ0YWNfY2FsW2NhbF90eXBlXS5tYXBfZGF0YS5tYXBfaGFuZGxlKTsKLQkJYnJlYWs7Ci0JfQotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByX2VycigiJXM6IHVubWFwIFJUQUMgZmFpbGVkISBjYWxfdHlwZSAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjYWxfdHlwZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnRhY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmKQotewotCWludCByZXN1bHQgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlhdG9taWNfaW5jKCZydGFjX2NvbW1vbi51c2FnZV9jb3VudCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBydGFjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmYpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHJlc3VsdDIgPSAwOwotCWludCBpOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlhdG9taWNfZGVjKCZydGFjX2NvbW1vbi51c2FnZV9jb3VudCk7Ci0JcHJfZGVidWcoIiVzOiByZWYgY291bnQgJWQhXG4iLCBfX2Z1bmNfXywKLQkJYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLnVzYWdlX2NvdW50KSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLnVzYWdlX2NvdW50KSA+IDApCi0JCWdvdG8gZG9uZTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfUlRBQ19CTE9DS1M7IGkrKykgewotCQlyZXN1bHQyID0gcnRhY191bm1hcF9jYWxfYnVmZmVyKGkpOwotCQlpZiAocmVzdWx0MiA8IDApIHsKLQkJCXByX2VycigiJXM6IHVubWFwIGJ1ZmZlciBmYWlsZWQhIGVycm9yICVkIVxuIiwKLQkJCQlfX2Z1bmNfXywgcmVzdWx0Mik7Ci0JCQlyZXN1bHQgPSByZXN1bHQyOwotCQl9Ci0KLQkJcmVzdWx0MiA9IHJ0YWNfZnJlZV9jYWxfYnVmZmVyKGkpOwotCQlpZiAocmVzdWx0MiA8IDApIHsKLQkJCXByX2VycigiJXM6IGZyZWUgYnVmZmVyIGZhaWxlZCEgZXJyb3IgJWQhXG4iLAotCQkJCV9fZnVuY19fLCByZXN1bHQyKTsKLQkJCXJlc3VsdCA9IHJlc3VsdDI7Ci0JCX0KLQl9Ci1kb25lOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogQURNIEluZm8gKi8KLXZvaWQgYWRkX3BvcHAodTMyIGRldl9pZHgsIHUzMiBwb3J0X2lkLCB1MzIgcG9wcF9pZCkKLXsKLQl1MzIgaSA9IDA7Ci0KLQlmb3IgKDsgaSA8IHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwOyBpKyspCi0JCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwW2ldLnBvcHAgPT0gcG9wcF9pZCkKLQkJCWdvdG8gZG9uZTsKLQotCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCA9PQotCQkJUlRBQ19NQVhfQUNUSVZFX1BPUFApIHsKLQkJcHJfZXJyKCIlcywgTWF4IFBPUFAhXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ubnVtX29mX3BvcHBdLnBvcHAgPSBwb3BwX2lkOwotCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLnBvcHBbCi0JCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwXS5wb3BwX3RvcG9sb2d5ID0KLQkJcTZhc21fZ2V0X2FzbV90b3BvbG9neShwb3BwX2lkKTsKLQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwWwotCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCsrXS5hcHBfdHlwZSA9Ci0JCXE2YXNtX2dldF9hc21fYXBwX3R5cGUocG9wcF9pZCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBvcHBfaWQgPSAlZCwgcG9wcCB0b3BvbG9neSA9IDB4JXgsIHBvcHAgYXBwIHR5cGUgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKLQkJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2Rldl9pZHhdLm51bV9vZl9wb3BwIC0gMV0ucG9wcCwKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ucG9wcFsKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0ubnVtX29mX3BvcHAgLSAxXS5wb3BwX3RvcG9sb2d5LAotCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5wb3BwWwotCQlydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XS5udW1fb2ZfcG9wcCAtIDFdLmFwcF90eXBlKTsKLWRvbmU6Ci0JcmV0dXJuOwotfQotCi12b2lkIHJ0YWNfdXBkYXRlX2FmZV90b3BvbG9neSh1MzIgcG9ydF9pZCkKLXsKLQl1MzIgaSA9IDA7Ci0KLQltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7Ci0JCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hZmVfcG9ydCA9PSBwb3J0X2lkKSB7Ci0JCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hZmVfdG9wb2xvZ3kgPQotCQkJCQkJYWZlX2dldF90b3BvbG9neShwb3J0X2lkKTsKLQkJCXByX2RlYnVnKCIlczogcG9ydF9pZCA9IDB4JXggdG9wb2xvZ3lfaWQgPSAweCV4IGNvcHBfaWQgPSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHBvcnRfaWQsCi0JCQkJIHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV90b3BvbG9neSwKLQkJCQkgcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uY29wcCk7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci19Ci0KLXZvaWQgcnRhY19hZGRfYWRtX2RldmljZSh1MzIgcG9ydF9pZCwgdTMyIGNvcHBfaWQsIHUzMiBwYXRoX2lkLCB1MzIgcG9wcF9pZCwKLQkJCSB1MzIgYXBwX3R5cGUsIHUzMiBhY2RiX2lkKQotewotCXUzMiBpID0gMDsKLQotCXByX2RlYnVnKCIlczogbnVtIHJ0YWMgZGV2aWNlcyAlZCBwb3J0X2lkID0gJWQsIGNvcHBfaWQgPSAlZFxuIiwKLQkJX19mdW5jX18sIHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldiwgcG9ydF9pZCwgY29wcF9pZCk7Ci0KLQltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci0JaWYgKHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldiA9PSBSVEFDX01BWF9BQ1RJVkVfREVWSUNFUykgewotCQlwcl9lcnIoIiVzLCBDYW4ndCBhZGQgYW55bW9yZSBSVEFDIGRldmljZXMhXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBDaGVjayBpZiBkZXZpY2UgYWxyZWFkeSBhZGRlZCAqLwotCWlmIChydGFjX2FkbV9kYXRhLm51bV9vZl9kZXYgIT0gMCkgewotCQlmb3IgKDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7Ci0JCQlpZiAocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQgPT0gcG9ydF9pZCAmJgotCQkJICAgIHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmNvcHAgPT0gY29wcF9pZCkgewotCQkJCWFkZF9wb3BwKGksIHBvcnRfaWQsIHBvcHBfaWQpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCWlmIChydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcCA9PQotCQkJCQkJUlRBQ19NQVhfQUNUSVZFX1BPUFApIHsKLQkJCQlwcl9lcnIoIiVzLCBNYXggUE9QUCFcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBBZGQgZGV2aWNlICovCi0JcnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2Kys7Ci0KLQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS50b3BvbG9neV9pZCA9Ci0JCWFkbV9nZXRfdG9wb2xvZ3lfZm9yX3BvcnRfZnJvbV9jb3BwX2lkKHBvcnRfaWQsIGNvcHBfaWQpOwotCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV90b3BvbG9neSA9Ci0JCWFmZV9nZXRfdG9wb2xvZ3kocG9ydF9pZCk7Ci0JcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQgPSBwb3J0X2lkOwotCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmNvcHAgPSBjb3BwX2lkOwotCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFwcF90eXBlID0gYXBwX3R5cGU7Ci0JcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWNkYl9kZXZfaWQgPSBhY2RiX2lkOwotCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbCi0JCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLm51bV9vZl9wb3BwXS5wb3BwID0gcG9wcF9pZDsKLQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5wb3BwWwotCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcF0ucG9wcF90b3BvbG9neSA9Ci0JCXE2YXNtX2dldF9hc21fdG9wb2xvZ3kocG9wcF9pZCk7Ci0JcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFsKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHArK10uYXBwX3R5cGUgPQotCQlxNmFzbV9nZXRfYXNtX2FwcF90eXBlKHBvcHBfaWQpOwotCi0JcHJfZGVidWcoIiVzOiB0b3BvbG9neSA9IDB4JXgsIGFmZV90b3BvbG9neSA9IDB4JXgsIHBvcnRfaWQgPSAlZCwgY29wcF9pZCA9ICVkLCBhcHAgaWQgPSAweCV4LCBhY2RiIGlkID0gJWQsIHBvcHBfaWQgPSAlZCwgcG9wcCB0b3BvbG9neSA9IDB4JXgsIHBvcHAgYXBwIHR5cGUgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0udG9wb2xvZ3lfaWQsCi0JCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV90b3BvbG9neSwKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0uYWZlX3BvcnQsCi0JCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmNvcHAsCi0JCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFwcF90eXBlLAotCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5hY2RiX2Rldl9pZCwKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFsKLQkJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLm51bV9vZl9wb3BwIC0gMV0ucG9wcCwKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFsKLQkJcnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ubnVtX29mX3BvcHAgLSAxXS5wb3BwX3RvcG9sb2d5LAotCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5wb3BwWwotCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcCAtIDFdLmFwcF90eXBlKTsKLWRvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNoaWZ0X2FkbV9kZXZpY2VzKHUzMiBkZXZfaWR4KQotewotCWZvciAoOyBkZXZfaWR4IDwgcnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2OyBkZXZfaWR4KyspIHsKLQkJbWVtY3B5KCZydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4XSwKLQkJCSZydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4ICsgMV0sCi0JCQlzaXplb2YocnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0pKTsKLQkJbWVtc2V0KCZydGFjX2FkbV9kYXRhLmRldmljZVtkZXZfaWR4ICsgMV0sIDAsCi0JCQkgICBzaXplb2YocnRhY19hZG1fZGF0YS5kZXZpY2VbZGV2X2lkeF0pKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNoaWZ0X3BvcHAodTMyIGNvcHBfaWR4LCB1MzIgcG9wcF9pZHgpCi17Ci0JZm9yICg7IHBvcHBfaWR4IDwgcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLm51bV9vZl9wb3BwOwotCQkJCQkJCXBvcHBfaWR4KyspIHsKLQkJbWVtY3B5KCZydGFjX2FkbV9kYXRhLmRldmljZVtjb3BwX2lkeF0ucG9wcFtwb3BwX2lkeF0ucG9wcCwKLQkJCSZydGFjX2FkbV9kYXRhLmRldmljZVtjb3BwX2lkeF0ucG9wcFtwb3BwX2lkeCArIDFdLgotCQkJcG9wcCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JCW1lbWNweSgmcnRhY19hZG1fZGF0YS5kZXZpY2VbY29wcF9pZHhdLnBvcHBbcG9wcF9pZHhdLgotCQkJcG9wcF90b3BvbG9neSwKLQkJCSZydGFjX2FkbV9kYXRhLmRldmljZVtjb3BwX2lkeF0ucG9wcFtwb3BwX2lkeCArIDFdLgotCQkJcG9wcF90b3BvbG9neSwKLQkJCXNpemVvZih1aW50MzJfdCkpOwotCQltZW1zZXQoJnJ0YWNfYWRtX2RhdGEuZGV2aWNlW2NvcHBfaWR4XS5wb3BwW3BvcHBfaWR4ICsgMV0uCi0JCQlwb3BwLCAwLCBzaXplb2YodWludDMyX3QpKTsKLQkJbWVtc2V0KCZydGFjX2FkbV9kYXRhLmRldmljZVtjb3BwX2lkeF0ucG9wcFtwb3BwX2lkeCArIDFdLgotCQkJcG9wcF90b3BvbG9neSwgMCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0JfQotfQotCi12b2lkIHJ0YWNfcmVtb3ZlX2FkbV9kZXZpY2UodTMyIHBvcnRfaWQsIHUzMiBjb3BwX2lkKQotewotCXMzMiBpOwotCi0JcHJfZGVidWcoIiVzOiBudW0gcnRhYyBkZXZpY2VzICVkIHBvcnRfaWQgPSAlZCwgY29wcF9pZCA9ICVkXG4iLAotCQlfX2Z1bmNfXywgcnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2LCBwb3J0X2lkLCBjb3BwX2lkKTsKLQotCW11dGV4X2xvY2soJnJ0YWNfYWRtX211dGV4KTsKLQkvKiBsb29rIGZvciBkZXZpY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2OyBpKyspIHsKLQkJaWYgKHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmFmZV9wb3J0ID09IHBvcnRfaWQgJiYKLQkJICAgIHJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLmNvcHAgPT0gY29wcF9pZCkgewotCQkJbWVtc2V0KCZydGFjX2FkbV9kYXRhLmRldmljZVtpXSwgMCwKLQkJCQkgICBzaXplb2YocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0pKTsKLQkJCXJ0YWNfYWRtX2RhdGEubnVtX29mX2Rldi0tOwotCi0JCQlpZiAocnRhY19hZG1fZGF0YS5udW1fb2ZfZGV2ID49IDEpIHsKLQkJCQlzaGlmdF9hZG1fZGV2aWNlcyhpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCW11dGV4X3VubG9jaygmcnRhY19hZG1fbXV0ZXgpOwotfQotCi12b2lkIHJ0YWNfcmVtb3ZlX3BvcHBfZnJvbV9hZG1fZGV2aWNlcyh1MzIgcG9wcF9pZCkKLXsKLQlzMzIgaSwgajsKLQotCXByX2RlYnVnKCIlczogcG9wcF9pZCA9ICVkXG4iLCBfX2Z1bmNfXywgcG9wcF9pZCk7Ci0KLQltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IHJ0YWNfYWRtX2RhdGEubnVtX29mX2RldjsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBydGFjX2FkbV9kYXRhLmRldmljZVtpXS5udW1fb2ZfcG9wcDsgaisrKSB7Ci0JCQlpZiAocnRhY19hZG1fZGF0YS5kZXZpY2VbaV0ucG9wcFtqXS5wb3BwID09Ci0JCQkJCQkJCXBvcHBfaWQpIHsKLQkJCQlydGFjX2FkbV9kYXRhLmRldmljZVtpXS5wb3BwW2pdLnBvcHAgPSAwOwotCQkJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLnBvcHBbal0uCi0JCQkJCXBvcHBfdG9wb2xvZ3kgPSAwOwotCQkJCXJ0YWNfYWRtX2RhdGEuZGV2aWNlW2ldLm51bV9vZl9wb3BwLS07Ci0JCQkJc2hpZnRfcG9wcChpLCBqKTsKLQkJCX0KLQkJfQotCX0KLQltdXRleF91bmxvY2soJnJ0YWNfYWRtX211dGV4KTsKLX0KLQotCi0vKiBWb2ljZSBJbmZvICovCi1zdGF0aWMgdm9pZCBzZXRfcnRhY192b2ljZV9kYXRhKGludCBpZHgsIHUzMiBjdnNfaGFuZGxlLCB1MzIgY3ZwX2hhbmRsZSwKLQkJCQkJdTMyIHJ4X2FmZV9wb3J0LCB1MzIgdHhfYWZlX3BvcnQsCi0JCQkJCXUzMiByeF9hY2RiX2lkLCB1MzIgdHhfYWNkYl9pZCwKLQkJCQkJdTMyIHNlc3Npb25faWQpCi17Ci0JcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0udHhfdG9wb2xvZ3lfaWQgPQotCQl2b2ljZV9nZXRfdG9wb2xvZ3koQ1ZQX1ZPQ19UWF9UT1BPTE9HWV9DQUwpOwotCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnJ4X3RvcG9sb2d5X2lkID0KLQkJdm9pY2VfZ2V0X3RvcG9sb2d5KENWUF9WT0NfUlhfVE9QT0xPR1lfQ0FMKTsKLQlydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS50eF9hZmVfdG9wb2xvZ3kgPQotCQlhZmVfZ2V0X3RvcG9sb2d5KHR4X2FmZV9wb3J0KTsKLQlydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS5yeF9hZmVfdG9wb2xvZ3kgPQotCQlhZmVfZ2V0X3RvcG9sb2d5KHJ4X2FmZV9wb3J0KTsKLQlydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS50eF9hZmVfcG9ydCA9IHR4X2FmZV9wb3J0OwotCXJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpZHhdLnJ4X2FmZV9wb3J0ID0gcnhfYWZlX3BvcnQ7Ci0JcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0udHhfYWNkYl9pZCA9IHR4X2FjZGJfaWQ7Ci0JcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0ucnhfYWNkYl9pZCA9IHJ4X2FjZGJfaWQ7Ci0JcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0uY3ZzX2hhbmRsZSA9IGN2c19oYW5kbGU7Ci0JcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0uY3ZwX2hhbmRsZSA9IGN2cF9oYW5kbGU7Ci0JcHJfZGVidWcoIiVzXG4lczogJXhcbiVzOiAlZCAlczogJWRcbiVzOiAlZCAlczogJWRcbiAlczogJWRcbiAlczogJWRcbiVzOiAlZCAlczogJWRcbiVzIiwKLQkJICI8LS0tLSBWb2ljZSBEYXRhIEluZm8gLS0tLT4iLCAiU2Vzc2lvbiBpZCIsIHNlc3Npb25faWQsCi0JCSAiY3ZzX2hhbmRsZSIsIGN2c19oYW5kbGUsICJjdnBfaGFuZGxlIiwgY3ZwX2hhbmRsZSwKLQkJICJyeF9hZmVfdG9wb2xvZ3kiLCBydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XS5yeF9hZmVfdG9wb2xvZ3ksCi0JCSAidHhfYWZlX3RvcG9sb2d5IiwgcnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0udHhfYWZlX3RvcG9sb2d5LAotCQkgInJ4X2FmZV9wb3J0IiwgcnhfYWZlX3BvcnQsICJ0eF9hZmVfcG9ydCIsIHR4X2FmZV9wb3J0LAotCQkgInJ4X2FjZGJfaWQiLCByeF9hY2RiX2lkLCAidHhfYWNkYl9pZCIsIHR4X2FjZGJfaWQsCi0JCSAiPC0tLS0tLS0tLS0tRW5kLS0tLS0tLS0tLS0+Iik7Ci0KLQkvKiBTdG9yZSBzZXNzaW9uIElEIGZvciB2b2ljZSBSVEFDICovCi0Jdm9pY2Vfc2Vzc2lvbl9pZFtpZHhdID0gc2Vzc2lvbl9pZDsKLX0KLQotdm9pZCBydGFjX2FkZF92b2ljZSh1MzIgY3ZzX2hhbmRsZSwgdTMyIGN2cF9oYW5kbGUsIHUzMiByeF9hZmVfcG9ydCwKLQkJCXUzMiB0eF9hZmVfcG9ydCwgdTMyIHJ4X2FjZGJfaWQsIHUzMiB0eF9hY2RiX2lkLAotCQkJdTMyIHNlc3Npb25faWQpCi17Ci0JdTMyIGkgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfbG9jaygmcnRhY192b2ljZV9tdXRleCk7Ci0KLQlpZiAocnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3MgPT0KLQkJCVJUQUNfTUFYX0FDVElWRV9WT0lDRV9DT01CT1MpIHsKLQkJcHJfZXJyKCIlcywgQ2FuJ3QgYWRkIGFueW1vcmUgUlRBQyBkZXZpY2VzIVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQ2hlY2sgaWYgZGV2aWNlIGFscmVhZHkgYWRkZWQgKi8KLQlpZiAocnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3MgIT0gMCkgewotCQlmb3IgKDsgaSA8IHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zOyBpKyspIHsKLQkJCWlmIChydGFjX3ZvaWNlX2RhdGEudm9pY2VbaV0uY3ZzX2hhbmRsZSA9PQotCQkJCQkJCWN2c19oYW5kbGUpIHsKLQkJCQlzZXRfcnRhY192b2ljZV9kYXRhKGksIGN2c19oYW5kbGUsIGN2cF9oYW5kbGUsCi0JCQkJCXJ4X2FmZV9wb3J0LCB0eF9hZmVfcG9ydCwgcnhfYWNkYl9pZCwKLQkJCQkJdHhfYWNkYl9pZCwgc2Vzc2lvbl9pZCk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQl9Ci0JfQotCi0JLyogQWRkIGRldmljZSAqLwotCXJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zKys7Ci0Jc2V0X3J0YWNfdm9pY2VfZGF0YShpLCBjdnNfaGFuZGxlLCBjdnBfaGFuZGxlLAotCQkJCXJ4X2FmZV9wb3J0LCB0eF9hZmVfcG9ydCwKLQkJCQlyeF9hY2RiX2lkLCB0eF9hY2RiX2lkLAotCQkJCXNlc3Npb25faWQpOwotZG9uZToKLQltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfbXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBzaGlmdF92b2ljZV9kZXZpY2VzKHUzMiBpZHgpCi17Ci0JZm9yICg7IGlkeCA8IHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zIC0gMTsgaWR4KyspIHsKLQkJbWVtY3B5KCZydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4XSwKLQkJCSZydGFjX3ZvaWNlX2RhdGEudm9pY2VbaWR4ICsgMV0sCi0JCQlzaXplb2YocnRhY192b2ljZV9kYXRhLnZvaWNlW2lkeF0pKTsKLQkJdm9pY2Vfc2Vzc2lvbl9pZFtpZHhdID0gdm9pY2Vfc2Vzc2lvbl9pZFtpZHggKyAxXTsKLQl9Ci19Ci0KLXZvaWQgcnRhY19yZW1vdmVfdm9pY2UodTMyIGN2c19oYW5kbGUpCi17Ci0JdTMyIGkgPSAwOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZydGFjX3ZvaWNlX211dGV4KTsKLQkvKiBsb29rIGZvciBkZXZpY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3M7IGkrKykgewotCQlpZiAocnRhY192b2ljZV9kYXRhLnZvaWNlW2ldLmN2c19oYW5kbGUgPT0gY3ZzX2hhbmRsZSkgewotCQkJc2hpZnRfdm9pY2VfZGV2aWNlcyhpKTsKLQkJCXJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zLS07Ci0JCQltZW1zZXQoJnJ0YWNfdm9pY2VfZGF0YS52b2ljZVsKLQkJCQlydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvc10sIDAsCi0JCQkJc2l6ZW9mKHJ0YWNfdm9pY2VfZGF0YS52b2ljZQotCQkJCVtydGFjX3ZvaWNlX2RhdGEubnVtX29mX3ZvaWNlX2NvbWJvc10pKTsKLQkJCXZvaWNlX3Nlc3Npb25faWRbcnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3NdCi0JCQkJPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX3ZvaWNlX211dGV4KTsKLX0KLQotc3RhdGljIHUzMiBnZXRfdm9pY2Vfc2Vzc2lvbl9pZF9jdnModTMyIGN2c19oYW5kbGUpCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcnRhY192b2ljZV9kYXRhLm51bV9vZl92b2ljZV9jb21ib3M7IGkrKykgewotCQlpZiAocnRhY192b2ljZV9kYXRhLnZvaWNlW2ldLmN2c19oYW5kbGUgPT0gY3ZzX2hhbmRsZSkKLQkJCXJldHVybiB2b2ljZV9zZXNzaW9uX2lkW2ldOwotCX0KLQotCXByX2VycigiJXM6IE5vIHZvaWNlIGluZGV4IGZvciBDVlMgaGFuZGxlICVkIGZvdW5kIHJldHVybmluZyAwXG4iLAotCSAgICAgICBfX2Z1bmNfXywgY3ZzX2hhbmRsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0X3ZvaWNlX3Nlc3Npb25faWRfY3ZwKHUzMiBjdnBfaGFuZGxlKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJ0YWNfdm9pY2VfZGF0YS5udW1fb2Zfdm9pY2VfY29tYm9zOyBpKyspIHsKLQkJaWYgKHJ0YWNfdm9pY2VfZGF0YS52b2ljZVtpXS5jdnBfaGFuZGxlID09IGN2cF9oYW5kbGUpCi0JCQlyZXR1cm4gdm9pY2Vfc2Vzc2lvbl9pZFtpXTsKLQl9Ci0KLQlwcl9lcnIoIiVzOiBObyB2b2ljZSBpbmRleCBmb3IgQ1ZQIGhhbmRsZSAlZCBmb3VuZCByZXR1cm5pbmcgMFxuIiwKLQkgICAgICAgX19mdW5jX18sIGN2cF9oYW5kbGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF92b2ljZV9pbmRleCh1MzIgbW9kZSwgdTMyIGhhbmRsZSkKLXsKLQlpZiAobW9kZSA9PSBSVEFDX0NWUCkKLQkJcmV0dXJuIHZvaWNlX2dldF9pZHhfZm9yX3Nlc3Npb24oCi0JCQlnZXRfdm9pY2Vfc2Vzc2lvbl9pZF9jdnAoaGFuZGxlKSk7Ci0JaWYgKG1vZGUgPT0gUlRBQ19DVlMpCi0JCXJldHVybiB2b2ljZV9nZXRfaWR4X2Zvcl9zZXNzaW9uKAotCQkJZ2V0X3ZvaWNlX3Nlc3Npb25faWRfY3ZzKGhhbmRsZSkpOwotCi0JcHJfZXJyKCIlczogSW52YWxpZCBtb2RlICVkLCByZXR1cm5pbmcgMFxuIiwKLQkgICAgICAgX19mdW5jX18sIG1vZGUpOwotCXJldHVybiAwOwotfQotCi0KLS8qIEFETSBBUFIgKi8KLXZvaWQgcnRhY19zZXRfYWRtX2hhbmRsZSh2b2lkICpoYW5kbGUpCi17Ci0JcHJfZGVidWcoIiVzOiBoYW5kbGUgPSAlcEtcbiIsIF9fZnVuY19fLCBoYW5kbGUpOwotCi0JbXV0ZXhfbG9jaygmcnRhY19hZG1fYXByX211dGV4KTsKLQlydGFjX2FkbV9hcHJfZGF0YS5hcHJfaGFuZGxlID0gaGFuZGxlOwotCW11dGV4X3VubG9jaygmcnRhY19hZG1fYXByX211dGV4KTsKLX0KLQotYm9vbCBydGFjX21ha2VfYWRtX2NhbGxiYWNrKHVpbnQzMl90ICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKQotewotCXByX2RlYnVnKCIlczpjbWRfc3RhdGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlhdG9taWNfcmVhZCgmcnRhY19hZG1fYXByX2RhdGEuY21kX3N0YXRlKSk7Ci0JaWYgKGF0b21pY19yZWFkKCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfc3RhdGUpICE9IDEpCi0JCXJldHVybiBmYWxzZTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChwYXlsb2FkX3NpemUgPT0gc2l6ZW9mKHVpbnQzMl90KSkKLQkJYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCBwYXlsb2FkWzBdKTsKLQllbHNlIGlmIChwYXlsb2FkX3NpemUgPT0gKDIqc2l6ZW9mKHVpbnQzMl90KSkpCi0JCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFsxXSk7Ci0KLQlhdG9taWNfc2V0KCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfc3RhdGUsIDApOwotCXdha2VfdXAoJnJ0YWNfYWRtX2Fwcl9kYXRhLmNtZF93YWl0KTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHNlbmRfYWRtX2Fwcih2b2lkICpidWYsIHUzMiBvcGNvZGUpCi17Ci0JczMyCXJlc3VsdDsKLQl1MzIJdXNlcl9idWZfc2l6ZSA9IDA7Ci0JdTMyCWJ5dGVzX3JldHVybmVkID0gMDsKLQl1MzIJY29wcF9pZDsKLQl1MzIJcGF5bG9hZF9zaXplOwotCXUzMglkYXRhX3NpemUgPSAwOwotCWludAljb3BwX2lkeDsKLQlpbnQJcG9ydF9pZHg7Ci0Jc3RydWN0IGFwcl9oZHIJYWRtX3BhcmFtczsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHJ0YWNfY2FsW0FETV9SVEFDX0NBTF0ubWFwX2RhdGEuaW9uX2hhbmRsZSA9PSBOVUxMKSB7Ci0JCXJlc3VsdCA9IHJ0YWNfYWxsb2NhdGVfY2FsX2J1ZmZlcihBRE1fUlRBQ19DQUwpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJcHJfZXJyKCIlczogYWxsb2NhdGUgYnVmZmVyIGZhaWxlZCEiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChydGFjX2NhbFtBRE1fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGUgPT0gMCkgewotCQlyZXN1bHQgPSBydGFjX21hcF9jYWxfYnVmZmVyKEFETV9SVEFDX0NBTCk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBtYXAgYnVmZmVyIGZhaWxlZCEiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlcl9idWZfc2l6ZSwgKHZvaWQgKilidWYsCi0JCQkJCQlzaXplb2YodXNlcl9idWZfc2l6ZSkpKSB7Ci0JCXByX2VycigiJXM6IENvcHkgZnJvbSB1c2VyIGZhaWxlZCEgYnVmID0gMHglcEtcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgYnVmKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAodXNlcl9idWZfc2l6ZSA8PSAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgYnVmZmVyIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB1c2VyX2J1Zl9zaXplKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmcGF5bG9hZF9zaXplLCBidWYgKyBzaXplb2YodTMyKSwgc2l6ZW9mKHUzMikpKSB7Ci0JCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgc2l6ZSBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjb3BwX2lkLCBidWYgKyAyICogc2l6ZW9mKHUzMiksIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwb3J0IGlkIGZyb20gdXNlciBidWZmZXJcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoYWRtX2dldF9pbmRleGVzX2Zyb21fY29wcF9pZChjb3BwX2lkLCAmY29wcF9pZHgsICZwb3J0X2lkeCkgIT0gMCkgewotCQlwcl9lcnIoIiVzOiBDb3BwIElkLSVkIGlzIG5vdCBhY3RpdmVcbiIsIF9fZnVuY19fLCBjb3BwX2lkKTsKLQkJZ290byBkb25lOwotCX0KLQotCW11dGV4X2xvY2soJnJ0YWNfYWRtX2Fwcl9tdXRleCk7Ci0JaWYgKHJ0YWNfYWRtX2Fwcl9kYXRhLmFwcl9oYW5kbGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChvcGNvZGUgPT0gQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1KSB7Ci0JCS8qIHNldCBwYXlsb2FkIHNpemUgdG8gaW4tYmFuZCBwYXlsb2FkICovCi0JCS8qIHNldCBkYXRhIHNpemUgdG8gYWN0dWFsIG91dCBvZiBiYW5kIHBheWxvYWQgc2l6ZSAqLwotCQlkYXRhX3NpemUgPSBwYXlsb2FkX3NpemUgLSA0ICogc2l6ZW9mKHUzMik7Ci0JCWlmIChkYXRhX3NpemUgPiBydGFjX2NhbFtBRE1fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRhdGEgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBkYXRhX3NpemUpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXBheWxvYWRfc2l6ZSA9IDQgKiBzaXplb2YodTMyKTsKLQotCQkvKiBDb3B5IGJ1ZmZlciB0byBvdXQtb2YtYmFuZCBwYXlsb2FkICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKQotCQkJCXJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAotCQkJCWJ1ZiArIDcgKiBzaXplb2YodTMyKSwgZGF0YV9zaXplKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQkvKiBzZXQgcGF5bG9hZCBzaXplIGluIHBhY2tldCAqLwotCQlydGFjX2FkbV9idWZmZXJbOF0gPSBkYXRhX3NpemU7Ci0JfSBlbHNlIHsKLQkJaWYgKHBheWxvYWRfc2l6ZSA+IE1BWF9QQVlMT0FEX1NJWkUpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgcGF5bG9hZCBzaXplID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHBheWxvYWRfc2l6ZSk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQkvKiBDb3B5IGJ1ZmZlciB0byBpbi1iYW5kIHBheWxvYWQgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHJ0YWNfYWRtX2J1ZmZlciArCi0JCQkJc2l6ZW9mKGFkbV9wYXJhbXMpL3NpemVvZih1MzIpLAotCQkJCWJ1ZiArIDMgKiBzaXplb2YodTMyKSwgcGF5bG9hZF9zaXplKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCS8qIFBhY2sgaGVhZGVyICovCi0JYWRtX3BhcmFtcy5oZHJfZmllbGQgPSBBUFJfSERSX0ZJRUxEKEFQUl9NU0dfVFlQRV9TRVFfQ01ELAotCQlBUFJfSERSX0xFTigyMCksIEFQUl9QS1RfVkVSKTsKLQlhZG1fcGFyYW1zLnBrdF9zaXplID0gQVBSX1BLVF9TSVpFKEFQUl9IRFJfU0laRSwKLQkJcGF5bG9hZF9zaXplKTsKLQlhZG1fcGFyYW1zLnNyY19zdmMgPSBBUFJfU1ZDX0FETTsKLQlhZG1fcGFyYW1zLnNyY19kb21haW4gPSBBUFJfRE9NQUlOX0FQUFM7Ci0JYWRtX3BhcmFtcy5zcmNfcG9ydCA9IGNvcHBfaWQ7Ci0JYWRtX3BhcmFtcy5kZXN0X3N2YyA9IEFQUl9TVkNfQURNOwotCWFkbV9wYXJhbXMuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYWRtX3BhcmFtcy5kZXN0X3BvcnQgPSBjb3BwX2lkOwotCWFkbV9wYXJhbXMudG9rZW4gPSBwb3J0X2lkeCA8PCAxNiB8IGNvcHBfaWR4OwotCWFkbV9wYXJhbXMub3Bjb2RlID0gb3Bjb2RlOwotCi0JLyogZmlsbCBmb3Igb3V0LW9mLWJhbmQgKi8KLQlydGFjX2FkbV9idWZmZXJbNV0gPQotCQlsb3dlcl8zMl9iaXRzKHJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCXJ0YWNfYWRtX2J1ZmZlcls2XSA9Ci0JCW1zbV9hdWRpb19wb3B1bGF0ZV91cHBlcl8zMl9iaXRzKAotCQkJCXJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCXJ0YWNfYWRtX2J1ZmZlcls3XSA9IHJ0YWNfY2FsW0FETV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZTsKLQotCW1lbWNweShydGFjX2FkbV9idWZmZXIsICZhZG1fcGFyYW1zLCBzaXplb2YoYWRtX3BhcmFtcykpOwotCWF0b21pY19zZXQoJnJ0YWNfYWRtX2Fwcl9kYXRhLmNtZF9zdGF0ZSwgMSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgUlRBQyBjb21tYW5kIGlvY3RsIDB4JXgsIHBhZGRyIDB4JXBLXG4iLAotCQlfX2Z1bmNfXywgb3Bjb2RlLAotCQkmcnRhY19jYWxbQURNX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7Ci0KLQlyZXN1bHQgPSBhcHJfc2VuZF9wa3QocnRhY19hZG1fYXByX2RhdGEuYXByX2hhbmRsZSwKLQkJCQkJKHVpbnQzMl90ICopcnRhY19hZG1fYnVmZmVyKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBjb3BwID0gJWRcbiIsIF9fZnVuY19fLCBjb3BwX2lkKTsKLQkJZ290byBlcnI7Ci0JfQotCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLwotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChydGFjX2FkbV9hcHJfZGF0YS5jbWRfd2FpdCwKLQkJKGF0b21pY19yZWFkKCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfc3RhdGUpID09IDApLAotCQltc2Vjc190b19qaWZmaWVzKFRJTUVPVVRfTVMpKTsKLQlpZiAoIXJlc3VsdCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIHRpbWVkIG91dCBjb3BwID0gJWRcbiIsIF9fZnVuY19fLAotCQkJY29wcF9pZCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoYXRvbWljX3JlYWQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpIHsKLQkJcHJfZXJyKCIlczogRFNQIHJldHVybmVkIGVycm9yIGNvZGUgPSBbJXNdLCBvcGNvZGUgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIGFkc3BfZXJyX2dldF9lcnJfc3RyKGF0b21pY19yZWFkKAotCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpLAotCQkJb3Bjb2RlKTsKLQkJcmVzdWx0ID0gYWRzcF9lcnJfZ2V0X2xueF9lcnJfY29kZSgKLQkJCQkJYXRvbWljX3JlYWQoCi0JCQkJCSZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKG9wY29kZSA9PSBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjUpIHsKLQkJYnl0ZXNfcmV0dXJuZWQgPSAoKHUzMiAqKXJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEuCi0JCQlrdmFkZHIpWzJdICsgMyAqIHNpemVvZih1MzIpOwotCi0JCWlmIChieXRlc19yZXR1cm5lZCA+IHVzZXJfYnVmX3NpemUpIHsKLQkJCXByX2VycigiJXM6IFVzZXIgYnVmIG5vdCBiaWcgZW5vdWdoLCBzaXplID0gMHgleCwgcmV0dXJuZWQgc2l6ZSA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHVzZXJfYnVmX3NpemUsIGJ5dGVzX3JldHVybmVkKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAodm9pZCAqKQotCQkJCXJ0YWNfY2FsW0FETV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAotCQkJCWJ5dGVzX3JldHVybmVkKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgYnVmZmVyIHRvIHVzZXIsc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBieXRlc19yZXR1cm5lZCk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQlieXRlc19yZXR1cm5lZCA9IGRhdGFfc2l6ZTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9hcHJfbXV0ZXgpOwotZG9uZToKLQlyZXR1cm4gYnl0ZXNfcmV0dXJuZWQ7Ci1lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9hcHJfbXV0ZXgpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyogQVNNIEFQUiAqLwotdm9pZCBydGFjX3NldF9hc21faGFuZGxlKHUzMiBzZXNzaW9uX2lkLCB2b2lkICpoYW5kbGUpCi17Ci0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltdXRleF9sb2NrKCZydGFjX2FzbV9hcHJfbXV0ZXgpOwotCXJ0YWNfYXNtX2Fwcl9kYXRhW3Nlc3Npb25faWRdLmFwcl9oYW5kbGUgPSBoYW5kbGU7Ci0JbXV0ZXhfdW5sb2NrKCZydGFjX2FzbV9hcHJfbXV0ZXgpOwotfQotCi1ib29sIHJ0YWNfbWFrZV9hc21fY2FsbGJhY2sodTMyIHNlc3Npb25faWQsIHVpbnQzMl90ICpwYXlsb2FkLAotCXUzMiBwYXlsb2FkX3NpemUpCi17Ci0JaWYgKGF0b21pY19yZWFkKCZydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfc3RhdGUpICE9IDEpCi0JCXJldHVybiBmYWxzZTsKLQotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCWlmIChwYXlsb2FkX3NpemUgPT0gc2l6ZW9mKHVpbnQzMl90KSkKLQkJYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCBwYXlsb2FkWzBdKTsKLQllbHNlIGlmIChwYXlsb2FkX3NpemUgPT0gKDIqc2l6ZW9mKHVpbnQzMl90KSkpCi0JCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFsxXSk7Ci0KLQlhdG9taWNfc2V0KCZydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfc3RhdGUsIDApOwotCXdha2VfdXAoJnJ0YWNfYXNtX2Fwcl9kYXRhW3Nlc3Npb25faWRdLmNtZF93YWl0KTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHNlbmRfcnRhY19hc21fYXByKHZvaWQgKmJ1ZiwgdTMyIG9wY29kZSkKLXsKLQlzMzIgcmVzdWx0OwotCXUzMiB1c2VyX2J1Zl9zaXplID0gMDsKLQl1MzIgYnl0ZXNfcmV0dXJuZWQgPSAwOwotCXUzMiBzZXNzaW9uX2lkID0gMDsKLQl1MzIgcGF5bG9hZF9zaXplOwotCXUzMiBkYXRhX3NpemUgPSAwOwotCXN0cnVjdCBhcHJfaGRyIGFzbV9wYXJhbXM7Ci0KLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChydGFjX2NhbFtBU01fUlRBQ19DQUxdLm1hcF9kYXRhLmlvbl9oYW5kbGUgPT0gTlVMTCkgewotCQlyZXN1bHQgPSBydGFjX2FsbG9jYXRlX2NhbF9idWZmZXIoQVNNX1JUQUNfQ0FMKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCXByX2VycigiJXM6IGFsbG9jYXRlIGJ1ZmZlciBmYWlsZWQhIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlpZiAocnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfaGFuZGxlID09IDApIHsKLQkJcmVzdWx0ID0gcnRhY19tYXBfY2FsX2J1ZmZlcihBU01fUlRBQ19DQUwpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJcHJfZXJyKCIlczogbWFwIGJ1ZmZlciBmYWlsZWQhIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfYnVmX3NpemUsICh2b2lkICopYnVmLAotCQkJCQkJc2l6ZW9mKHVzZXJfYnVmX3NpemUpKSkgewotCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWQhIGJ1ZiA9IDB4JXBLXG4iLAotCQkgICAgICAgX19mdW5jX18sIGJ1Zik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHVzZXJfYnVmX3NpemUgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1ZmZlciBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgdXNlcl9idWZfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnBheWxvYWRfc2l6ZSwgYnVmICsgc2l6ZW9mKHUzMiksIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIHNpemUgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmc2Vzc2lvbl9pZCwgYnVmICsgMiAqIHNpemVvZih1MzIpLCBzaXplb2YodTMyKSkpIHsKLQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgc2Vzc2lvbiBpZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChzZXNzaW9uX2lkID49IChBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCArIDEpKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgU2Vzc2lvbiA9ICVkXG4iLCBfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQltdXRleF9sb2NrKCZydGFjX2FzbV9hcHJfbXV0ZXgpOwotCWlmIChydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5hcHJfaGFuZGxlID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogQVBSIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAob3Bjb2RlID09IEFTTV9TVFJFQU1fQ01EX1NFVF9QUF9QQVJBTVNfVjIpIHsKLQkJLyogc2V0IHBheWxvYWQgc2l6ZSB0byBpbi1iYW5kIHBheWxvYWQgKi8KLQkJLyogc2V0IGRhdGEgc2l6ZSB0byBhY3R1YWwgb3V0IG9mIGJhbmQgcGF5bG9hZCBzaXplICovCi0JCWRhdGFfc2l6ZSA9IHBheWxvYWRfc2l6ZSAtIDQgKiBzaXplb2YodTMyKTsKLQkJaWYgKGRhdGFfc2l6ZSA+IHJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgZGF0YSBzaXplID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGRhdGFfc2l6ZSk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJcGF5bG9hZF9zaXplID0gNCAqIHNpemVvZih1MzIpOwotCi0JCS8qIENvcHkgYnVmZmVyIHRvIG91dC1vZi1iYW5kIHBheWxvYWQgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopCi0JCQkJcnRhY19jYWxbQVNNX1JUQUNfQ0FMXS5jYWxfZGF0YS5rdmFkZHIsCi0JCQkJYnVmICsgNyAqIHNpemVvZih1MzIpLCBkYXRhX3NpemUpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCS8qIHNldCBwYXlsb2FkIHNpemUgaW4gcGFja2V0ICovCi0JCXJ0YWNfYXNtX2J1ZmZlcls4XSA9IGRhdGFfc2l6ZTsKLQotCX0gZWxzZSB7Ci0JCWlmIChwYXlsb2FkX3NpemUgPiBNQVhfUEFZTE9BRF9TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBwYXlsb2FkX3NpemUpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJLyogQ29weSBidWZmZXIgdG8gaW4tYmFuZCBwYXlsb2FkICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihydGFjX2FzbV9idWZmZXIgKwotCQkJCXNpemVvZihhc21fcGFyYW1zKS9zaXplb2YodTMyKSwKLQkJCQlidWYgKyAzICogc2l6ZW9mKHUzMiksIHBheWxvYWRfc2l6ZSkpIHsKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQkvKiBQYWNrIGhlYWRlciAqLwotCWFzbV9wYXJhbXMuaGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJQVBSX0hEUl9MRU4oMjApLCBBUFJfUEtUX1ZFUik7Ci0JYXNtX3BhcmFtcy5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCXBheWxvYWRfc2l6ZSk7Ci0JYXNtX3BhcmFtcy5zcmNfc3ZjID0gcTZhc21fZ2V0X2Fwcl9zZXJ2aWNlX2lkKHNlc3Npb25faWQpOwotCWFzbV9wYXJhbXMuc3JjX2RvbWFpbiA9IEFQUl9ET01BSU5fQVBQUzsKLQlhc21fcGFyYW1zLnNyY19wb3J0ID0gKHNlc3Npb25faWQgPDwgOCkgfCAweDAwMDE7Ci0JYXNtX3BhcmFtcy5kZXN0X3N2YyA9IEFQUl9TVkNfQVNNOwotCWFzbV9wYXJhbXMuZGVzdF9kb21haW4gPSBBUFJfRE9NQUlOX0FEU1A7Ci0JYXNtX3BhcmFtcy5kZXN0X3BvcnQgPSAoc2Vzc2lvbl9pZCA8PCA4KSB8IDB4MDAwMTsKLQlhc21fcGFyYW1zLnRva2VuID0gc2Vzc2lvbl9pZDsKLQlhc21fcGFyYW1zLm9wY29kZSA9IG9wY29kZTsKLQotCS8qIGZpbGwgZm9yIG91dC1vZi1iYW5kICovCi0JcnRhY19hc21fYnVmZmVyWzVdID0KLQkJbG93ZXJfMzJfYml0cyhydGFjX2NhbFtBU01fUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKLQlydGFjX2FzbV9idWZmZXJbNl0gPQotCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQlydGFjX2NhbFtBU01fUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKLQlydGFjX2FzbV9idWZmZXJbN10gPSBydGFjX2NhbFtBU01fUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGU7Ci0KLQltZW1jcHkocnRhY19hc21fYnVmZmVyLCAmYXNtX3BhcmFtcywgc2l6ZW9mKGFzbV9wYXJhbXMpKTsKLQlhdG9taWNfc2V0KCZydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfc3RhdGUsIDEpOwotCi0JcHJfZGVidWcoIiVzOiBTZW5kaW5nIFJUQUMgY29tbWFuZCBpb2N0bCAweCV4LCBwYWRkciAweCVwS1xuIiwKLQkJX19mdW5jX18sIG9wY29kZSwKLQkJJnJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCi0JcmVzdWx0ID0gYXByX3NlbmRfcGt0KHJ0YWNfYXNtX2Fwcl9kYXRhW3Nlc3Npb25faWRdLmFwcl9oYW5kbGUsCi0JCQkJKHVpbnQzMl90ICopcnRhY19hc21fYnVmZmVyKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBTZXQgcGFyYW1zIGZhaWxlZCBzZXNzaW9uID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgc2Vzc2lvbl9pZCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLwotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfd2FpdCwKLQkJKGF0b21pY19yZWFkKCZydGFjX2FzbV9hcHJfZGF0YVtzZXNzaW9uX2lkXS5jbWRfc3RhdGUpID09IDApLAotCQk1ICogSFopOwotCWlmICghcmVzdWx0KSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHNlc3Npb24gPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBzZXNzaW9uX2lkKTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3IgY29kZSA9IFslc10sIG9wY29kZSA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoYXRvbWljX3JlYWQoCi0JCQkmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSksCi0JCQlvcGNvZGUpOwotCQlyZXN1bHQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQlhdG9taWNfcmVhZCgKLQkJCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAob3Bjb2RlID09IEFTTV9TVFJFQU1fQ01EX0dFVF9QUF9QQVJBTVNfVjIpIHsKLQkJYnl0ZXNfcmV0dXJuZWQgPSAoKHUzMiAqKXJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0uY2FsX2RhdGEuCi0JCQlrdmFkZHIpWzJdICsgMyAqIHNpemVvZih1MzIpOwotCi0JCWlmIChieXRlc19yZXR1cm5lZCA+IHVzZXJfYnVmX3NpemUpIHsKLQkJCXByX2VycigiJXM6IFVzZXIgYnVmIG5vdCBiaWcgZW5vdWdoLCBzaXplID0gMHgleCwgcmV0dXJuZWQgc2l6ZSA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHVzZXJfYnVmX3NpemUsIGJ5dGVzX3JldHVybmVkKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAodm9pZCAqKQotCQkJCXJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAotCQkJCWJ5dGVzX3JldHVybmVkKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgYnVmZmVyIHRvIHVzZXIsc2l6ZSA9ICVkXG4iLAotCQkJCSBfX2Z1bmNfXywgYnl0ZXNfcmV0dXJuZWQpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlIHsKLQkJYnl0ZXNfcmV0dXJuZWQgPSBkYXRhX3NpemU7Ci0JfQotCW11dGV4X3VubG9jaygmcnRhY19hc21fYXByX211dGV4KTsKLWRvbmU6Ci0JcmV0dXJuIGJ5dGVzX3JldHVybmVkOwotZXJyOgotCW11dGV4X3VubG9jaygmcnRhY19hc21fYXByX211dGV4KTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKiBBRkUgQVBSICovCi12b2lkIHJ0YWNfc2V0X2FmZV9oYW5kbGUodm9pZCAqaGFuZGxlKQotewotCW11dGV4X2xvY2soJnJ0YWNfYWZlX2Fwcl9tdXRleCk7Ci0JcnRhY19hZmVfYXByX2RhdGEuYXByX2hhbmRsZSA9IGhhbmRsZTsKLQltdXRleF91bmxvY2soJnJ0YWNfYWZlX2Fwcl9tdXRleCk7Ci19Ci0KLWJvb2wgcnRhY19tYWtlX2FmZV9jYWxsYmFjayh1aW50MzJfdCAqcGF5bG9hZCwgdWludDMyX3QgcGF5bG9hZF9zaXplKQotewotCXByX2RlYnVnKCIlczpjbWRfc3RhdGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCQlhdG9taWNfcmVhZCgmcnRhY19hZmVfYXByX2RhdGEuY21kX3N0YXRlKSk7Ci0JaWYgKGF0b21pY19yZWFkKCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfc3RhdGUpICE9IDEpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwYXlsb2FkX3NpemUgPT0gc2l6ZW9mKHVpbnQzMl90KSkKLQkJYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCBwYXlsb2FkWzBdKTsKLQllbHNlIGlmIChwYXlsb2FkX3NpemUgPT0gKDIqc2l6ZW9mKHVpbnQzMl90KSkpCi0JCWF0b21pY19zZXQoJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSwgcGF5bG9hZFsxXSk7Ci0KLQlhdG9taWNfc2V0KCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfc3RhdGUsIDApOwotCXdha2VfdXAoJnJ0YWNfYWZlX2Fwcl9kYXRhLmNtZF93YWl0KTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBmaWxsX2FmZV9hcHJfaGRyKHN0cnVjdCBhcHJfaGRyICphcHJfaGRyLCB1aW50MzJfdCBwb3J0LAotCQkJIHVpbnQzMl90IG9wY29kZSwgdWludDMyX3QgYXByX21zZ19zaXplKQotewotCWlmIChhcHJfaGRyID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBBUFIgcG9pbnRlciIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYXByX2hkci0+aGRyX2ZpZWxkID0gQVBSX0hEUl9GSUVMRChBUFJfTVNHX1RZUEVfU0VRX0NNRCwKLQkJQVBSX0hEUl9MRU4oQVBSX0hEUl9TSVpFKSwgQVBSX1BLVF9WRVIpOwotCWFwcl9oZHItPnBrdF9zaXplID0gYXByX21zZ19zaXplOwotCWFwcl9oZHItPnNyY19zdmMgPSBBUFJfU1ZDX0FGRTsKLQlhcHJfaGRyLT5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCWFwcl9oZHItPnNyY19wb3J0ID0gMDsKLQlhcHJfaGRyLT5kZXN0X3N2YyA9IEFQUl9TVkNfQUZFOwotCWFwcl9oZHItPmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9BRFNQOwotCWFwcl9oZHItPmRlc3RfcG9ydCA9IDA7Ci0JYXByX2hkci0+dG9rZW4gPSBwb3J0OwotCWFwcl9oZHItPm9wY29kZSA9IG9wY29kZTsKLQotCXJldHVybiAwOwotCi19Ci1zdGF0aWMgaW50IHNlbmRfcnRhY19hZmVfYXByKHZvaWQgKmJ1ZiwgdWludDMyX3Qgb3Bjb2RlKQotewotCWludDMyX3QgcmVzdWx0OwotCXVpbnQzMl90IGJ5dGVzX3JldHVybmVkID0gMDsKLQl1aW50MzJfdCBwb3J0X2luZGV4ID0gMDsKLQl1aW50MzJfdCBhcHJfbXNnX3NpemUgPSAwOwotCXN0cnVjdCBydGFjX2FmZV91c2VyX2RhdGEgdXNlcl9hZmVfYnVmOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAocnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5tYXBfZGF0YS5pb25faGFuZGxlID09IE5VTEwpIHsKLQkJcmVzdWx0ID0gcnRhY19hbGxvY2F0ZV9jYWxfYnVmZmVyKEFGRV9SVEFDX0NBTCk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBhbGxvY2F0ZSBidWZmZXIgZmFpbGVkISByZXQgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChydGFjX2NhbFtBRkVfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9oYW5kbGUgPT0gMCkgewotCQlyZXN1bHQgPSBydGFjX21hcF9jYWxfYnVmZmVyKEFGRV9SVEFDX0NBTCk7Ci0JCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBtYXAgYnVmZmVyIGZhaWxlZCEgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJlc3VsdCk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfYWZlX2J1ZiwgKHZvaWQgKilidWYsCi0JCXNpemVvZihzdHJ1Y3QgcnRhY19hZmVfdXNlcl9kYXRhKSkpIHsKLQkJcHJfZXJyKCIlczogQ29weSBmcm9tIHVzZXIgZmFpbGVkISBidWYgPSAweCVwS1xuIiwKLQkJICAgICAgIF9fZnVuY19fLCBidWYpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHVzZXJfYWZlX2J1Zi5idWZfc2l6ZSA8PSAwKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgYnVmZmVyIHNpemUgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB1c2VyX2FmZV9idWYuYnVmX3NpemUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcG9ydF9pbmRleCA9IHE2YXVkaW9fZ2V0X3BvcnRfaW5kZXgodXNlcl9hZmVfYnVmLnBvcnRfaWQpOwotCWlmIChwb3J0X2luZGV4ID49IEFGRV9NQVhfUE9SVFMpIHsKLQkJcHJfZXJyKCIlczogSW52YWxpZCBBRkUgcG9ydCA9IDB4JXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgdXNlcl9hZmVfYnVmLnBvcnRfaWQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcnRhY19hZmVfYXByX211dGV4KTsKLQlpZiAocnRhY19hZmVfYXByX2RhdGEuYXByX2hhbmRsZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiJXM6IEFQUiBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChvcGNvZGUgPT0gQUZFX1BPUlRfQ01EX1NFVF9QQVJBTV9WMikgewotCQlzdHJ1Y3QgYWZlX3BvcnRfY21kX3NldF9wYXJhbV92MiAqYWZlX3NldF9hcHJfbXNnOwotCi0JCS8qIHNldCBkYXRhIHNpemUgdG8gYWN0dWFsIG91dCBvZiBiYW5kIHBheWxvYWQgc2l6ZSAqLwotCQlpZiAodXNlcl9hZmVfYnVmLnJ0YWNfYWZlX3NldC5jbWQucGF5bG9hZF9zaXplID4KLQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUpIHsKLQkJCXByX2VycigiJXM6IEludmFsaWQgZGF0YSBzaXplID0gJWRcbiIsCi0JCQkJICAgX19mdW5jX18sCi0JCQkJICAgdXNlcl9hZmVfYnVmLnJ0YWNfYWZlX3NldC5jbWQucGF5bG9hZF9zaXplKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCS8qIENvcHkgYnVmZmVyIHRvIG91dC1vZi1iYW5kIHBheWxvYWQgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopCi0JCQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5rdmFkZHIsCi0JCQkJYnVmK29mZnNldG9mKHN0cnVjdCBydGFjX2FmZV91c2VyX2RhdGEsCi0JCQkJcnRhY19hZmVfc2V0LmRhdGEpLAotCQkJCXVzZXJfYWZlX2J1Zi5ydGFjX2FmZV9zZXQuY21kLnBheWxvYWRfc2l6ZSkpIHsKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQkvKiBDb3B5IEFGRSBBUFIgTWVzc2FnZSAqLwotCQlhZmVfc2V0X2Fwcl9tc2cgPSAoc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIgKikKLQkJCQkoKHU4ICopcnRhY19hZmVfYnVmZmVyICsKLQkJCQlzaXplb2Yoc3RydWN0IGFwcl9oZHIpKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopCi0JCQkJYWZlX3NldF9hcHJfbXNnLAotCQkJCWJ1ZiArIG9mZnNldG9mKHN0cnVjdCBydGFjX2FmZV91c2VyX2RhdGEsCi0JCQkJcnRhY19hZmVfc2V0LmNtZCksCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfc2V0X3BhcmFtX3YyKSkpIHsKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlhZmVfc2V0X2Fwcl9tc2ctPnBheWxvYWRfYWRkcmVzc19sc3cgPQotCQkJbG93ZXJfMzJfYml0cyhydGFjX2NhbFtBRkVfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKLQkJYWZlX3NldF9hcHJfbXNnLT5wYXlsb2FkX2FkZHJlc3NfbXN3ID0KLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7Ci0JCWFmZV9zZXRfYXByX21zZy0+bWVtX21hcF9oYW5kbGUgPQotCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZTsKLQotCQlhcHJfbXNnX3NpemUgPSBzaXplb2Yoc3RydWN0IGFwcl9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGFmZV9wb3J0X2NtZF9zZXRfcGFyYW1fdjIpOwotCi0JfSBlbHNlIHsKLQkJc3RydWN0IGFmZV9wb3J0X2NtZF9nZXRfcGFyYW1fdjIgKmFmZV9nZXRfYXByX21zZzsKLQotCQlpZiAodXNlcl9hZmVfYnVmLmNtZF9zaXplID4gTUFYX1BBWUxPQURfU0laRSkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBwYXlsb2FkIHNpemUgPSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdXNlcl9hZmVfYnVmLmNtZF9zaXplKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCS8qIENvcHkgYnVmZmVyIHRvIGluLWJhbmQgcGF5bG9hZCAqLwotCQlhZmVfZ2V0X2Fwcl9tc2cgPSAoc3RydWN0IGFmZV9wb3J0X2NtZF9nZXRfcGFyYW1fdjIgKikKLQkJCQkJKCh1OCAqKSBydGFjX2FmZV9idWZmZXIgKwotCQkJCQlzaXplb2Yoc3RydWN0IGFwcl9oZHIpKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopYWZlX2dldF9hcHJfbXNnLAotCQkJCWJ1ZitvZmZzZXRvZihzdHJ1Y3QgcnRhY19hZmVfdXNlcl9kYXRhLAotCQkJCXJ0YWNfYWZlX2dldC5jbWQpLAotCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyKSkpIHsKLQkJCXByX2VycigiJXM6IENvdWxkIG5vdCBjb3B5IHBheWxvYWQgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlhZmVfZ2V0X2Fwcl9tc2ctPnBheWxvYWRfYWRkcmVzc19sc3cgPQotCQkJbG93ZXJfMzJfYml0cyhydGFjX2NhbFtBRkVfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKLQkJYWZlX2dldF9hcHJfbXNnLT5wYXlsb2FkX2FkZHJlc3NfbXN3ID0KLQkJCQltc21fYXVkaW9fcG9wdWxhdGVfdXBwZXJfMzJfYml0cygKLQkJCQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5wYWRkcik7Ci0JCWFmZV9nZXRfYXByX21zZy0+bWVtX21hcF9oYW5kbGUgPQotCQkJCXJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZTsKLQkJYWZlX2dldF9hcHJfbXNnLT5wYXlsb2FkX3NpemUgLT0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKTsKLQkJYXByX21zZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBhcHJfaGRyKSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9jbWRfZ2V0X3BhcmFtX3YyKTsKLQl9Ci0KLQlmaWxsX2FmZV9hcHJfaGRyKChzdHJ1Y3QgYXByX2hkciAqKSBydGFjX2FmZV9idWZmZXIsCi0JCQlwb3J0X2luZGV4LCBvcGNvZGUsIGFwcl9tc2dfc2l6ZSk7Ci0KLQlhdG9taWNfc2V0KCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfc3RhdGUsIDEpOwotCi0JcHJfZGVidWcoIiVzOiBTZW5kaW5nIFJUQUMgY29tbWFuZCBpb2N0bCAweCV4LCBwYWRkciAweCVwS1xuIiwKLQkJX19mdW5jX18sIG9wY29kZSwKLQkJJnJ0YWNfY2FsW0FGRV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCi0JcmVzdWx0ID0gYXByX3NlbmRfcGt0KHJ0YWNfYWZlX2Fwcl9kYXRhLmFwcl9oYW5kbGUsCi0JCQkJCSh1aW50MzJfdCAqKXJ0YWNfYWZlX2J1ZmZlcik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJcHJfZXJyKCIlczogU2V0IHBhcmFtcyBmYWlsZWQgcG9ydCA9IDB4JXgsIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHVzZXJfYWZlX2J1Zi5wb3J0X2lkLCByZXN1bHQpOwotCQlnb3RvIGVycjsKLQl9Ci0JLyogV2FpdCBmb3IgdGhlIGNhbGxiYWNrICovCi0JcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KHJ0YWNfYWZlX2Fwcl9kYXRhLmNtZF93YWl0LAotCQkoYXRvbWljX3JlYWQoJnJ0YWNfYWZlX2Fwcl9kYXRhLmNtZF9zdGF0ZSkgPT0gMCksCi0JCW1zZWNzX3RvX2ppZmZpZXMoVElNRU9VVF9NUykpOwotCWlmICghcmVzdWx0KSB7Ci0JCXByX2VycigiJXM6IFNldCBwYXJhbXMgdGltZWQgb3V0IHBvcnQgPSAweCV4LCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB1c2VyX2FmZV9idWYucG9ydF9pZCwgcmVzdWx0KTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChhdG9taWNfcmVhZCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSkgewotCQlwcl9lcnIoIiVzOiBEU1AgcmV0dXJuZWQgZXJyb3IgY29kZSA9IFslc10sIG9wY29kZSA9IDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgYWRzcF9lcnJfZ2V0X2Vycl9zdHIoYXRvbWljX3JlYWQoCi0JCQkmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSksCi0JCQlvcGNvZGUpOwotCQlyZXN1bHQgPSBhZHNwX2Vycl9nZXRfbG54X2Vycl9jb2RlKAotCQkJCQlhdG9taWNfcmVhZCgKLQkJCQkJJnJ0YWNfY29tbW9uLmFwcl9lcnJfY29kZSkpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAob3Bjb2RlID09IEFGRV9QT1JUX0NNRF9HRVRfUEFSQU1fVjIpIHsKLQkJc3RydWN0IGFmZV9wb3J0X3BhcmFtX2RhdGFfdjIgKmdldF9yZXNwOwotCi0JCWdldF9yZXNwID0gKHN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyICopCi0JCQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5rdmFkZHI7Ci0KLQkJYnl0ZXNfcmV0dXJuZWQgPSBnZXRfcmVzcC0+cGFyYW1fc2l6ZSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBhZmVfcG9ydF9wYXJhbV9kYXRhX3YyKTsKLQotCQlpZiAoYnl0ZXNfcmV0dXJuZWQgPiB1c2VyX2FmZV9idWYuYnVmX3NpemUpIHsKLQkJCXByX2VycigiJXM6IHVzZXIgc2l6ZSA9IDB4JXgsIHJldHVybmVkIHNpemUgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCB1c2VyX2FmZV9idWYuYnVmX3NpemUsCi0JCQkJYnl0ZXNfcmV0dXJuZWQpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihidWYsICh2b2lkICopCi0JCQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5jYWxfZGF0YS5rdmFkZHIsCi0JCQkJYnl0ZXNfcmV0dXJuZWQpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBidWZmZXIgdG8gdXNlcixzaXplID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIGJ5dGVzX3JldHVybmVkKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ5dGVzX3JldHVybmVkID0gdXNlcl9hZmVfYnVmLnJ0YWNfYWZlX3NldC5jbWQucGF5bG9hZF9zaXplOwotCX0KLQltdXRleF91bmxvY2soJnJ0YWNfYWZlX2Fwcl9tdXRleCk7Ci1kb25lOgotCXJldHVybiBieXRlc19yZXR1cm5lZDsKLWVycjoKLQltdXRleF91bmxvY2soJnJ0YWNfYWZlX2Fwcl9tdXRleCk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogVm9pY2UgQVBSICovCi12b2lkIHJ0YWNfc2V0X3ZvaWNlX2hhbmRsZSh1MzIgbW9kZSwgdm9pZCAqaGFuZGxlKQotewotCXByX2RlYnVnKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmcnRhY192b2ljZV9hcHJfbXV0ZXgpOwotCXJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uYXByX2hhbmRsZSA9IGhhbmRsZTsKLQltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfYXByX211dGV4KTsKLX0KLQotYm9vbCBydGFjX21ha2Vfdm9pY2VfY2FsbGJhY2sodTMyIG1vZGUsIHVpbnQzMl90ICpwYXlsb2FkLCB1MzIgcGF5bG9hZF9zaXplKQotewotCWlmICgoYXRvbWljX3JlYWQoJnJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uY21kX3N0YXRlKSAhPSAxKSB8fAotCQkobW9kZSA+PSBSVEFDX1ZPSUNFX01PREVTKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKHBheWxvYWRfc2l6ZSA9PSBzaXplb2YodWludDMyX3QpKQotCQlhdG9taWNfc2V0KCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUsIHBheWxvYWRbMF0pOwotCWVsc2UgaWYgKHBheWxvYWRfc2l6ZSA9PSAoMipzaXplb2YodWludDMyX3QpKSkKLQkJYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCBwYXlsb2FkWzFdKTsKLQotCWF0b21pY19zZXQoJnJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uY21kX3N0YXRlLCAwKTsKLQl3YWtlX3VwKCZydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF93YWl0KTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHNlbmRfdm9pY2VfYXByKHUzMiBtb2RlLCB2b2lkICpidWYsIHUzMiBvcGNvZGUpCi17Ci0JczMyIHJlc3VsdDsKLQl1MzIgdXNlcl9idWZfc2l6ZSA9IDA7Ci0JdTMyIGJ5dGVzX3JldHVybmVkID0gMDsKLQl1MzIgcGF5bG9hZF9zaXplOwotCXUzMiBkZXN0X3BvcnQ7Ci0JdTMyIGRhdGFfc2l6ZSA9IDA7Ci0Jc3RydWN0IGFwcl9oZHIgdm9pY2VfcGFyYW1zOwotCi0JcHJfZGVidWcoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAocnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLm1hcF9kYXRhLmlvbl9oYW5kbGUgPT0gTlVMTCkgewotCQlyZXN1bHQgPSBydGFjX2FsbG9jYXRlX2NhbF9idWZmZXIoVk9JQ0VfUlRBQ19DQUwpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJcHJfZXJyKCIlczogYWxsb2NhdGUgYnVmZmVyIGZhaWxlZCEiLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCWlmIChydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX2hhbmRsZSA9PSAwKSB7Ci0JCXJlc3VsdCA9IHJ0YWNfbWFwX2NhbF9idWZmZXIoVk9JQ0VfUlRBQ19DQUwpOwotCQlpZiAocmVzdWx0IDwgMCkgewotCQkJcHJfZXJyKCIlczogbWFwIGJ1ZmZlciBmYWlsZWQhIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfYnVmX3NpemUsICh2b2lkICopYnVmLAotCQkJCQkJc2l6ZW9mKHVzZXJfYnVmX3NpemUpKSkgewotCQlwcl9lcnIoIiVzOiBDb3B5IGZyb20gdXNlciBmYWlsZWQhIGJ1ZiA9IDB4JXBLXG4iLAotCQkgICAgICAgX19mdW5jX18sIGJ1Zik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKHVzZXJfYnVmX3NpemUgPD0gMCkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGJ1ZmZlciBzaXplID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgdXNlcl9idWZfc2l6ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnBheWxvYWRfc2l6ZSwgYnVmICsgc2l6ZW9mKHUzMiksIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIHNpemUgZnJvbSB1c2VyIGJ1ZmZlclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZGVzdF9wb3J0LCBidWYgKyAyICogc2l6ZW9mKHUzMiksIHNpemVvZih1MzIpKSkgewotCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwb3J0IGlkIGZyb20gdXNlciBidWZmZXJcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoKG1vZGUgIT0gUlRBQ19DVlApICYmIChtb2RlICE9IFJUQUNfQ1ZTKSkgewotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIE1vZGUgZm9yIEFQUiwgbW9kZSA9ICVkXG4iLAotCQkJX19mdW5jX18sIG1vZGUpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcnRhY192b2ljZV9hcHJfbXV0ZXgpOwotCWlmIChydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmFwcl9oYW5kbGUgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBBUFIgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChvcGNvZGUgPT0gVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMikgewotCQkvKiBzZXQgcGF5bG9hZCBzaXplIHRvIGluLWJhbmQgcGF5bG9hZCAqLwotCQkvKiBzZXQgZGF0YSBzaXplIHRvIGFjdHVhbCBvdXQgb2YgYmFuZCBwYXlsb2FkIHNpemUgKi8KLQkJZGF0YV9zaXplID0gcGF5bG9hZF9zaXplIC0gNCAqIHNpemVvZih1MzIpOwotCQlpZiAoZGF0YV9zaXplID4gcnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLm1hcF9kYXRhLm1hcF9zaXplKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGRhdGEgc2l6ZSA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCBkYXRhX3NpemUpOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXBheWxvYWRfc2l6ZSA9IDQgKiBzaXplb2YodTMyKTsKLQotCQkvKiBDb3B5IGJ1ZmZlciB0byBvdXQtb2YtYmFuZCBwYXlsb2FkICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKQotCQkJCXJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5jYWxfZGF0YS5rdmFkZHIsCi0JCQkJYnVmICsgNyAqIHNpemVvZih1MzIpLCBkYXRhX3NpemUpKSB7Ci0JCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgY29weSBwYXlsb2FkIGZyb20gdXNlciBidWZmZXJcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCS8qIHNldCBwYXlsb2FkIHNpemUgaW4gcGFja2V0ICovCi0JCXJ0YWNfdm9pY2VfYnVmZmVyWzhdID0gZGF0YV9zaXplOwotCX0gZWxzZSB7Ci0JCWlmIChwYXlsb2FkX3NpemUgPiBNQVhfUEFZTE9BRF9TSVpFKSB7Ci0JCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBheWxvYWQgc2l6ZSA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcGF5bG9hZF9zaXplKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCS8qIENvcHkgYnVmZmVyIHRvIGluLWJhbmQgcGF5bG9hZCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIocnRhY192b2ljZV9idWZmZXIgKwotCQkJCXNpemVvZih2b2ljZV9wYXJhbXMpL3NpemVvZih1MzIpLAotCQkJCWJ1ZiArIDMgKiBzaXplb2YodTMyKSwgcGF5bG9hZF9zaXplKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgcGF5bG9hZCBmcm9tIHVzZXIgYnVmZmVyXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCS8qIFBhY2sgaGVhZGVyICovCi0Jdm9pY2VfcGFyYW1zLmhkcl9maWVsZCA9IEFQUl9IRFJfRklFTEQoQVBSX01TR19UWVBFX1NFUV9DTUQsCi0JCUFQUl9IRFJfTEVOKDIwKSwgQVBSX1BLVF9WRVIpOwotCXZvaWNlX3BhcmFtcy5wa3Rfc2l6ZSA9IEFQUl9QS1RfU0laRShBUFJfSERSX1NJWkUsCi0JCXBheWxvYWRfc2l6ZSk7Ci0Jdm9pY2VfcGFyYW1zLnNyY19zdmMgPSAwOwotCXZvaWNlX3BhcmFtcy5zcmNfZG9tYWluID0gQVBSX0RPTUFJTl9BUFBTOwotCXZvaWNlX3BhcmFtcy5zcmNfcG9ydCA9IGdldF92b2ljZV9pbmRleChtb2RlLCBkZXN0X3BvcnQpOwotCXZvaWNlX3BhcmFtcy5kZXN0X3N2YyA9IDA7Ci0Jdm9pY2VfcGFyYW1zLmRlc3RfZG9tYWluID0gQVBSX0RPTUFJTl9NT0RFTTsKLQl2b2ljZV9wYXJhbXMuZGVzdF9wb3J0ID0gKHUxNilkZXN0X3BvcnQ7Ci0Jdm9pY2VfcGFyYW1zLnRva2VuID0gKG9wY29kZSA9PSBWU1NfSUNPTU1PTl9DTURfU0VUX1BBUkFNX1YyKSA/Ci0JCQkJICAgICBWT0NfUlRBQ19TRVRfUEFSQU1fVE9LRU4gOgotCQkJCSAgICAgMDsKLQl2b2ljZV9wYXJhbXMub3Bjb2RlID0gb3Bjb2RlOwotCi0JLyogZmlsbCBmb3Igb3V0LW9mLWJhbmQgKi8KLQlydGFjX3ZvaWNlX2J1ZmZlcls1XSA9IHJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfaGFuZGxlOwotCXJ0YWNfdm9pY2VfYnVmZmVyWzZdID0KLQkJbG93ZXJfMzJfYml0cyhydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCXJ0YWNfdm9pY2VfYnVmZmVyWzddID0KLQkJbXNtX2F1ZGlvX3BvcHVsYXRlX3VwcGVyXzMyX2JpdHMoCi0JCQkJcnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLmNhbF9kYXRhLnBhZGRyKTsKLQotCW1lbWNweShydGFjX3ZvaWNlX2J1ZmZlciwgJnZvaWNlX3BhcmFtcywgc2l6ZW9mKHZvaWNlX3BhcmFtcykpOwotCWF0b21pY19zZXQoJnJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uY21kX3N0YXRlLCAxKTsKLQotCXByX2RlYnVnKCIlczogU2VuZGluZyBSVEFDIGNvbW1hbmQgaW9jdGwgMHgleCwgcGFkZHIgMHglcEtcbiIsCi0JCV9fZnVuY19fLCBvcGNvZGUsCi0JCSZydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0uY2FsX2RhdGEucGFkZHIpOwotCi0JcmVzdWx0ID0gYXByX3NlbmRfcGt0KHJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uYXByX2hhbmRsZSwKLQkJCQkJKHVpbnQzMl90ICopcnRhY192b2ljZV9idWZmZXIpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFwcl9zZW5kX3BrdCBmYWlsZWQgb3Bjb2RlID0gJXhcbiIsCi0JCQlfX2Z1bmNfXywgb3Bjb2RlKTsKLQkJZ290byBlcnI7Ci0JfQotCS8qIFdhaXQgZm9yIHRoZSBjYWxsYmFjayAqLwotCXJlc3VsdCA9IHdhaXRfZXZlbnRfdGltZW91dChydGFjX3ZvaWNlX2Fwcl9kYXRhW21vZGVdLmNtZF93YWl0LAotCQkoYXRvbWljX3JlYWQoJnJ0YWNfdm9pY2VfYXByX2RhdGFbbW9kZV0uY21kX3N0YXRlKSA9PSAwKSwKLQkJbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKSk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJcHJfZXJyKCIlczogYXByX3NlbmRfcGt0IHRpbWVkIG91dCBvcGNvZGUgPSAleFxuIiwKLQkJCV9fZnVuY19fLCBvcGNvZGUpOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKGF0b21pY19yZWFkKCZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKSB7Ci0JCXByX2VycigiJXM6IERTUCByZXR1cm5lZCBlcnJvciBjb2RlID0gWyVzXSwgb3Bjb2RlID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBhZHNwX2Vycl9nZXRfZXJyX3N0cihhdG9taWNfcmVhZCgKLQkJCSZydGFjX2NvbW1vbi5hcHJfZXJyX2NvZGUpKSwKLQkJCW9wY29kZSk7Ci0JCXJlc3VsdCA9IGFkc3BfZXJyX2dldF9sbnhfZXJyX2NvZGUoCi0JCQkJCWF0b21pY19yZWFkKAotCQkJCQkmcnRhY19jb21tb24uYXByX2Vycl9jb2RlKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChvcGNvZGUgPT0gVlNTX0lDT01NT05fQ01EX0dFVF9QQVJBTV9WMikgewotCQlieXRlc19yZXR1cm5lZCA9ICgodTMyICopcnRhY19jYWxbVk9JQ0VfUlRBQ19DQUxdLmNhbF9kYXRhLgotCQkJa3ZhZGRyKVsyXSArIDMgKiBzaXplb2YodTMyKTsKLQotCQlpZiAoYnl0ZXNfcmV0dXJuZWQgPiB1c2VyX2J1Zl9zaXplKSB7Ci0JCQlwcl9lcnIoIiVzOiBVc2VyIGJ1ZiBub3QgYmlnIGVub3VnaCwgc2l6ZSA9IDB4JXgsIHJldHVybmVkIHNpemUgPSAweCV4XG4iLAotCQkJCV9fZnVuY19fLCB1c2VyX2J1Zl9zaXplLCBieXRlc19yZXR1cm5lZCk7Ci0JCQlyZXN1bHQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlpZiAoY29weV90b191c2VyKGJ1ZiwgKHZvaWQgKikKLQkJCQlydGFjX2NhbFtWT0lDRV9SVEFDX0NBTF0uY2FsX2RhdGEua3ZhZGRyLAotCQkJCWJ5dGVzX3JldHVybmVkKSkgewotCQkJcHJfZXJyKCIlczogQ291bGQgbm90IGNvcHkgYnVmZmVyIHRvIHVzZXIsIHNpemUgPSAlZFxuIiwKLQkJCQkgX19mdW5jX18sIGJ5dGVzX3JldHVybmVkKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ5dGVzX3JldHVybmVkID0gZGF0YV9zaXplOwotCX0KLQltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfYXByX211dGV4KTsKLWRvbmU6Ci0JcmV0dXJuIGJ5dGVzX3JldHVybmVkOwotZXJyOgotCW11dGV4X3VubG9jaygmcnRhY192b2ljZV9hcHJfbXV0ZXgpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgZ2V0X3J0YWNfYWRtX2RhdGEoc3RydWN0IHJ0YWNfYWRtICphZG1fZGF0YSkKLXsKLQltdXRleF9sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci0JbWVtY3B5KGFkbV9kYXRhLCAmcnRhY19hZG1fZGF0YSwgc2l6ZW9mKHN0cnVjdCBydGFjX2FkbSkpOwotCW11dGV4X3VubG9jaygmcnRhY19hZG1fbXV0ZXgpOwotfQotCi0KLXN0YXRpYyBsb25nIHJ0YWNfaW9jdGxfc2hhcmVkKHN0cnVjdCBmaWxlICpmLAotCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlpZiAoIWFyZykgewotCQlwcl9lcnIoIiVzOiBObyBkYXRhIHNlbnQgdG8gZHJpdmVyIVxuIiwgX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0dFVF9SVEFDX0FETV9JTkZPOiB7Ci0JCW11dGV4X2xvY2soJnJ0YWNfYWRtX211dGV4KTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJnJ0YWNfYWRtX2RhdGEsCi0JCQkJCQlzaXplb2YocnRhY19hZG1fZGF0YSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkIGZvciBBVURJT19HRVRfUlRBQ19BRE1fSU5GT1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJbXV0ZXhfdW5sb2NrKCZydGFjX2FkbV9tdXRleCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyZXN1bHQgPSBzaXplb2YocnRhY19hZG1fZGF0YSk7Ci0JCW11dGV4X3VubG9jaygmcnRhY19hZG1fbXV0ZXgpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBBVURJT19HRVRfUlRBQ19WT0lDRV9JTkZPOiB7Ci0JCW11dGV4X2xvY2soJnJ0YWNfdm9pY2VfbXV0ZXgpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmcnRhY192b2ljZV9kYXRhLAotCQkJCQkJc2l6ZW9mKHJ0YWNfdm9pY2VfZGF0YSkpKSB7Ci0JCQlwcl9lcnIoIiVzOiBjb3B5X3RvX3VzZXIgZmFpbGVkIGZvciBBVURJT19HRVRfUlRBQ19WT0lDRV9JTkZPXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQltdXRleF91bmxvY2soJnJ0YWNfdm9pY2VfbXV0ZXgpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJcmVzdWx0ID0gc2l6ZW9mKHJ0YWNfdm9pY2VfZGF0YSk7Ci0JCW11dGV4X3VubG9jaygmcnRhY192b2ljZV9tdXRleCk7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQVVESU9fR0VUX1JUQUNfQURNX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF9hZG1fYXByKCh2b2lkICopYXJnLCBBRE1fQ01EX0dFVF9QUF9QQVJBTVNfVjUpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9SVEFDX0FETV9DQUw6Ci0JCXJlc3VsdCA9IHNlbmRfYWRtX2Fwcigodm9pZCAqKWFyZywgQURNX0NNRF9TRVRfUFBfUEFSQU1TX1Y1KTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19HRVRfUlRBQ19BU01fQ0FMOgotCQlyZXN1bHQgPSBzZW5kX3J0YWNfYXNtX2Fwcigodm9pZCAqKWFyZywKLQkJCUFTTV9TVFJFQU1fQ01EX0dFVF9QUF9QQVJBTVNfVjIpOwotCQlicmVhazsKLQljYXNlIEFVRElPX1NFVF9SVEFDX0FTTV9DQUw6Ci0JCXJlc3VsdCA9IHNlbmRfcnRhY19hc21fYXByKCh2b2lkICopYXJnLAotCQkJQVNNX1NUUkVBTV9DTURfU0VUX1BQX1BBUkFNU19WMik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQ1ZTX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF92b2ljZV9hcHIoUlRBQ19DVlMsICh2b2lkICopIGFyZywKLQkJCQkJVlNTX0lDT01NT05fQ01EX0dFVF9QQVJBTV9WMik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1JUQUNfQ1ZTX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF92b2ljZV9hcHIoUlRBQ19DVlMsICh2b2lkICopIGFyZywKLQkJCQkJVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQ1ZQX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF92b2ljZV9hcHIoUlRBQ19DVlAsICh2b2lkICopIGFyZywKLQkJCQkJVlNTX0lDT01NT05fQ01EX0dFVF9QQVJBTV9WMik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fU0VUX1JUQUNfQ1ZQX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF92b2ljZV9hcHIoUlRBQ19DVlAsICh2b2lkICopIGFyZywKLQkJCQkJVlNTX0lDT01NT05fQ01EX1NFVF9QQVJBTV9WMik7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQUZFX0NBTDoKLQkJcmVzdWx0ID0gc2VuZF9ydGFjX2FmZV9hcHIoKHZvaWQgKilhcmcsCi0JCQlBRkVfUE9SVF9DTURfR0VUX1BBUkFNX1YyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBVURJT19TRVRfUlRBQ19BRkVfQ0FMOgotCQlyZXN1bHQgPSBzZW5kX3J0YWNfYWZlX2Fwcigodm9pZCAqKWFyZywKLQkJCUFGRV9QT1JUX0NNRF9TRVRfUEFSQU1fVjIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIElPQ1RMLCBjb21tYW5kID0gJWQhXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNtZCk7Ci0JCXJlc3VsdCA9IC1FSU5WQUw7Ci0JfQotZG9uZToKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgbG9uZyBydGFjX2lvY3RsKHN0cnVjdCBmaWxlICpmLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCWlmICghYXJnKSB7Ci0JCXByX2VycigiJXM6IE5vIGRhdGEgc2VudCB0byBkcml2ZXIhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gcnRhY19pb2N0bF9zaGFyZWQoZiwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0jZGVmaW5lIEFVRElPX0dFVF9SVEFDX0FETV9JTkZPXzMyICAgX0lPUihDQUxfSU9DVExfTUFHSUMsIDIwNywgY29tcGF0X3VwdHJfdCkKLSNkZWZpbmUgQVVESU9fR0VUX1JUQUNfVk9JQ0VfSU5GT18zMiBfSU9SKENBTF9JT0NUTF9NQUdJQywgMjA4LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19BRE1fQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjA5LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19BRE1fQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjEwLCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19BU01fQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjExLCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19BU01fQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjEyLCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19DVlNfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjEzLCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19DVlNfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjE0LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19DVlBfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjE1LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19DVlBfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjE2LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19HRVRfUlRBQ19BRkVfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjE3LCBjb21wYXRfdXB0cl90KQotI2RlZmluZSBBVURJT19TRVRfUlRBQ19BRkVfQ0FMXzMyIF9JT1dSKENBTF9JT0NUTF9NQUdJQywgMjE4LCBjb21wYXRfdXB0cl90KQotCi1zdGF0aWMgbG9uZyBydGFjX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlpZiAoIWFyZykgewotCQlwcl9lcnIoIiVzOiBObyBkYXRhIHNlbnQgdG8gZHJpdmVyIVxuIiwgX19mdW5jX18pOwotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFVRElPX0dFVF9SVEFDX0FETV9JTkZPXzMyOgotCQljbWQgPSBBVURJT19HRVRfUlRBQ19BRE1fSU5GTzsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfVk9JQ0VfSU5GT18zMjoKLQkJY21kID0gQVVESU9fR0VUX1JUQUNfVk9JQ0VfSU5GTzsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQUZFX0NBTF8zMjoKLQkJY21kID0gQVVESU9fR0VUX1JUQUNfQUZFX0NBTDsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fU0VUX1JUQUNfQUZFX0NBTF8zMjoKLQkJY21kID0gQVVESU9fU0VUX1JUQUNfQUZFX0NBTDsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQURNX0NBTF8zMjoKLQkJY21kID0gQVVESU9fR0VUX1JUQUNfQURNX0NBTDsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fU0VUX1JUQUNfQURNX0NBTF8zMjoKLQkJY21kID0gQVVESU9fU0VUX1JUQUNfQURNX0NBTDsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fR0VUX1JUQUNfQVNNX0NBTF8zMjoKLQkJY21kID0gQVVESU9fR0VUX1JUQUNfQVNNX0NBTDsKLQkJZ290byBwcm9jZXNzOwotCWNhc2UgQVVESU9fU0VUX1JUQUNfQVNNX0NBTF8zMjoKLQkJY21kID0gIEFVRElPX1NFVF9SVEFDX0FTTV9DQUw7Ci0JCWdvdG8gcHJvY2VzczsKLQljYXNlIEFVRElPX0dFVF9SVEFDX0NWU19DQUxfMzI6Ci0JCWNtZCA9IEFVRElPX0dFVF9SVEFDX0NWU19DQUw7Ci0JCWdvdG8gcHJvY2VzczsKLQljYXNlIEFVRElPX1NFVF9SVEFDX0NWU19DQUxfMzI6Ci0JCWNtZCA9IEFVRElPX1NFVF9SVEFDX0NWU19DQUw7Ci0JCWdvdG8gcHJvY2VzczsKLQljYXNlIEFVRElPX0dFVF9SVEFDX0NWUF9DQUxfMzI6Ci0JCWNtZCA9ICBBVURJT19HRVRfUlRBQ19DVlBfQ0FMOwotCQlnb3RvIHByb2Nlc3M7Ci0JY2FzZSBBVURJT19TRVRfUlRBQ19DVlBfQ0FMXzMyOgotCQljbWQgPSBBVURJT19TRVRfUlRBQ19DVlBfQ0FMOwotcHJvY2VzczoKLQkJcmVzdWx0ID0gcnRhY19pb2N0bF9zaGFyZWQoZiwgY21kLCBjb21wYXRfcHRyKGFyZykpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXN1bHQgPSAtRUlOVkFMOwotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIElPQ1RMLCBjb21tYW5kID0gJWQhXG4iLAotCQkgICAgICAgX19mdW5jX18sIGNtZCk7Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLSNlbHNlCi0jZGVmaW5lIHJ0YWNfY29tcGF0X2lvY3RsIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBydGFjX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBydGFjX29wZW4sCi0JLnJlbGVhc2UgPSBydGFjX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gcnRhY19pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gcnRhY19jb21wYXRfaW9jdGwsCi19OwotCi1zdHJ1Y3QgbWlzY2RldmljZSBydGFjX21pc2MgPSB7Ci0JLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lCT0gIm1zbV9ydGFjIiwKLQkuZm9wcwk9ICZydGFjX2ZvcHMsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBydGFjX2luaXQodm9pZCkKLXsKLQlpbnQgaSA9IDA7Ci0KLQkvKiBEcml2ZXIgKi8KLQlhdG9taWNfc2V0KCZydGFjX2NvbW1vbi51c2FnZV9jb3VudCwgMCk7Ci0JYXRvbWljX3NldCgmcnRhY19jb21tb24uYXByX2Vycl9jb2RlLCAwKTsKLQotCS8qIEFETSAqLwotCW1lbXNldCgmcnRhY19hZG1fZGF0YSwgMCwgc2l6ZW9mKHJ0YWNfYWRtX2RhdGEpKTsKLQlydGFjX2FkbV9hcHJfZGF0YS5hcHJfaGFuZGxlID0gTlVMTDsKLQlhdG9taWNfc2V0KCZydGFjX2FkbV9hcHJfZGF0YS5jbWRfc3RhdGUsIDApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0YWNfYWRtX2Fwcl9kYXRhLmNtZF93YWl0KTsKLQltdXRleF9pbml0KCZydGFjX2FkbV9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcnRhY19hZG1fYXByX211dGV4KTsKLQotCXJ0YWNfYWRtX2J1ZmZlciA9IGt6YWxsb2MoCi0JCXJ0YWNfY2FsW0FETV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChydGFjX2FkbV9idWZmZXIgPT0gTlVMTCkKLQkJZ290byBub21lbTsKLQotCS8qIEFTTSAqLwotCWZvciAoaSA9IDA7IGkgPCBBU01fQUNUSVZFX1NUUkVBTVNfQUxMT1dFRCsxOyBpKyspIHsKLQkJcnRhY19hc21fYXByX2RhdGFbaV0uYXByX2hhbmRsZSA9IE5VTEw7Ci0JCWF0b21pY19zZXQoJnJ0YWNfYXNtX2Fwcl9kYXRhW2ldLmNtZF9zdGF0ZSwgMCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0YWNfYXNtX2Fwcl9kYXRhW2ldLmNtZF93YWl0KTsKLQl9Ci0JbXV0ZXhfaW5pdCgmcnRhY19hc21fYXByX211dGV4KTsKLQotCXJ0YWNfYXNtX2J1ZmZlciA9IGt6YWxsb2MoCi0JCXJ0YWNfY2FsW0FTTV9SVEFDX0NBTF0ubWFwX2RhdGEubWFwX3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChydGFjX2FzbV9idWZmZXIgPT0gTlVMTCkgewotCQlremZyZWUocnRhY19hZG1fYnVmZmVyKTsKLQkJZ290byBub21lbTsKLQl9Ci0KLQkvKiBBRkUgKi8KLQlydGFjX2FmZV9hcHJfZGF0YS5hcHJfaGFuZGxlID0gTlVMTDsKLQlhdG9taWNfc2V0KCZydGFjX2FmZV9hcHJfZGF0YS5jbWRfc3RhdGUsIDApOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0YWNfYWZlX2Fwcl9kYXRhLmNtZF93YWl0KTsKLQltdXRleF9pbml0KCZydGFjX2FmZV9hcHJfbXV0ZXgpOwotCi0JcnRhY19hZmVfYnVmZmVyID0ga3phbGxvYygKLQkJcnRhY19jYWxbQUZFX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJ0YWNfYWZlX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCWt6ZnJlZShydGFjX2FkbV9idWZmZXIpOwotCQlremZyZWUocnRhY19hc21fYnVmZmVyKTsKLQkJZ290byBub21lbTsKLQl9Ci0KLQkvKiBWb2ljZSAqLwotCW1lbXNldCgmcnRhY192b2ljZV9kYXRhLCAwLCBzaXplb2YocnRhY192b2ljZV9kYXRhKSk7Ci0JZm9yIChpID0gMDsgaSA8IFJUQUNfVk9JQ0VfTU9ERVM7IGkrKykgewotCQlydGFjX3ZvaWNlX2Fwcl9kYXRhW2ldLmFwcl9oYW5kbGUgPSBOVUxMOwotCQlhdG9taWNfc2V0KCZydGFjX3ZvaWNlX2Fwcl9kYXRhW2ldLmNtZF9zdGF0ZSwgMCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0YWNfdm9pY2VfYXByX2RhdGFbaV0uY21kX3dhaXQpOwotCX0KLQltdXRleF9pbml0KCZydGFjX3ZvaWNlX211dGV4KTsKLQltdXRleF9pbml0KCZydGFjX3ZvaWNlX2Fwcl9tdXRleCk7Ci0KLQlydGFjX3ZvaWNlX2J1ZmZlciA9IGt6YWxsb2MoCi0JCXJ0YWNfY2FsW1ZPSUNFX1JUQUNfQ0FMXS5tYXBfZGF0YS5tYXBfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJ0YWNfdm9pY2VfYnVmZmVyID09IE5VTEwpIHsKLQkJa3pmcmVlKHJ0YWNfYWRtX2J1ZmZlcik7Ci0JCWt6ZnJlZShydGFjX2FzbV9idWZmZXIpOwotCQlremZyZWUocnRhY19hZmVfYnVmZmVyKTsKLQkJZ290byBub21lbTsKLQl9Ci0KLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmcnRhY19taXNjKTsKLW5vbWVtOgotCXJldHVybiAtRU5PTUVNOwotfQotCi1tb2R1bGVfaW5pdChydGFjX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNvQyBRRFNQNnYyIFJlYWwtVGltZSBBdWRpbyBDYWxpYnJhdGlvbiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vc2RtNjYwLWNvbW1vbi5jIGIvc291bmQvc29jL21zbS9zZG02NjAtY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjEzN2UuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9zZG02NjAtY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjI0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbXNtLWNkYy1waW5jdHJsLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3E2YWZlLXYyLmg+Ci0jaW5jbHVkZSAicWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlICJzZG02NjAtY29tbW9uLmgiCi0jaW5jbHVkZSAic2RtNjYwLWludGVybmFsLmgiCi0jaW5jbHVkZSAic2RtNjYwLWV4dGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3NkbTY2MF9jZGMvbXNtLWFuYWxvZy1jZGMuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd3NhODgxeC5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJzZG02NjAtYXNvYy1zbmQiCi0KLSNkZWZpbmUgTVNNX0lOVF9ESUdJVEFMX0NPREVDICJtc20tZGlnLWNvZGVjIgotI2RlZmluZSBQTUlDX0lOVF9BTkFMT0dfQ09ERUMgImFuYWxvZy1jb2RlYyIKLQotI2RlZmluZSBERVZfTkFNRV9TVFJfTEVOICAzMgotI2RlZmluZSBERUZBVUxUX01DTEtfUkFURSA5NjAwMDAwCi0KLXN0cnVjdCBkZXZfY29uZmlnIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGJpdF9mb3JtYXQ7Ci0JdTMyIGNoYW5uZWxzOwotfTsKLQotZW51bSB7Ci0JRFBfUlhfSURYLAotCUVYVF9ESVNQX1JYX0lEWF9NQVgsCi19OwotCi1ib29sIGNvZGVjX3JlZ19kb25lOwotCi0vKiBURE0gZGVmYXVsdCBjb25maWcgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB0ZG1fcnhfY2ZnW1RETV9JTlRFUkZBQ0VfTUFYXVtURE1fUE9SVF9NQVhdID0gewotCXsgLyogUFJJIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KLQl9LAotCXsgLyogU0VDIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KLQl9LAotCXsgLyogVEVSVCBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCi0JfSwKLQl7IC8qIFFVQVQgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLwotCX0KLX07Ci0KLS8qIFRETSBkZWZhdWx0IGNvbmZpZyAqLwotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHRkbV90eF9jZmdbVERNX0lOVEVSRkFDRV9NQVhdW1RETV9QT1JUX01BWF0gPSB7Ci0JeyAvKiBQUkkgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLwotCX0sCi0JeyAvKiBTRUMgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLwotCX0sCi0JeyAvKiBURVJUIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KLQl9LAotCXsgLyogUVVBVCBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCi0JfQotfTsKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGV4dGVybmFsIGRpc3BsYXkgQkUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBleHRfZGlzcF9yeF9jZmdbXSA9IHsKLQlbRFBfUlhfSURYXSA9ICAge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgdXNiX3J4X2NmZyA9IHsKLQkuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haLAotCS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsCi0JLmNoYW5uZWxzID0gMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfdHhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAxLAotfTsKLQotZW51bSB7Ci0JUFJJTV9NSTJTID0gMCwKLQlTRUNfTUkyUywKLQlURVJUX01JMlMsCi0JUVVBVF9NSTJTLAotCU1JMlNfTUFYLAotfTsKLQotZW51bSB7Ci0JUFJJTV9BVVhfUENNID0gMCwKLQlTRUNfQVVYX1BDTSwKLQlURVJUX0FVWF9QQ00sCi0JUVVBVF9BVVhfUENNLAotCUFVWF9QQ01fTUFYLAotfTsKLQotZW51bSB7Ci0JUENNX0kyU19TRUxfUFJJTSA9IDAsCi0JUENNX0kyU19TRUxfU0VDLAotCVBDTV9JMlNfU0VMX1RFUlQsCi0JUENNX0kyU19TRUxfUVVBVCwKLQlQQ01fSTJTX1NFTF9NQVgsCi19OwotCi1zdHJ1Y3QgbWkyc19jb25mIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQl1MzIgcmVmX2NudDsKLQl1MzIgbXNtX2lzX21pMnNfbWFzdGVyOwotCXUzMiBtc21faXNfZXh0X21jbGs7Ci19OwotCi1zdGF0aWMgdTMyIG1pMnNfZWJpdF9jbGtbTUkyU19NQVhdID0gewotCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19FQklULAotCVE2QUZFX0xQQVNTX0NMS19JRF9TRUNfTUkyU19FQklULAotCVE2QUZFX0xQQVNTX0NMS19JRF9URVJfTUkyU19FQklULAotCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfRUJJVAotfTsKLQotc3RydWN0IG1zbV93c2E4ODF4X2Rldl9pbmZvIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci0JdTMyIGluZGV4OwotfTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2ICptc21fYXV4X2RldjsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICptc21fY29kZWNfY29uZjsKLQotc3RhdGljIGJvb2wgbXNtX3N3YXBfZ25kX21pYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgYWN0aXZlKTsKLQotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgbWJoY19jZmcgPSB7Ci0JLnJlYWRfZndfYmluID0gZmFsc2UsCi0JLmNhbGlicmF0aW9uID0gTlVMTCwKLQkuZGV0ZWN0X2V4dG5fY2FibGUgPSB0cnVlLAotCS5tb25vX3N0ZXJvX2RldGVjdGlvbiA9IGZhbHNlLAotCS5zd2FwX2duZF9taWMgPSBOVUxMLAotCS5oc19leHRfbWljYmlhcyA9IHRydWUsCi0JLmtleV9jb2RlWzBdID0gS0VZX01FRElBLAotCS5rZXlfY29kZVsxXSA9IEtFWV9WT0lDRUNPTU1BTkQsCi0JLmtleV9jb2RlWzJdID0gS0VZX1ZPTFVNRVVQLAotCS5rZXlfY29kZVszXSA9IEtFWV9WT0xVTUVET1dOLAotCS5rZXlfY29kZVs0XSA9IDAsCi0JLmtleV9jb2RlWzVdID0gMCwKLQkua2V5X2NvZGVbNl0gPSAwLAotCS5rZXlfY29kZVs3XSA9IDAsCi0JLmxpbmVpbl90aCA9IDUwMDAsCi0JLm1vaXN0dXJlX2VuID0gZmFsc2UsCi0JLm1iaGNfbWljYmlhcyA9IDAsCi0JLmFuY19taWNiaWFzID0gMCwKLQkuZW5hYmxlX2FuY19taWNfZGV0ZWN0ID0gZmFsc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgcHJveHlfcnhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAyLAotfTsKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3J4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3R4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBhdXhfcGNtX3J4X2NmZ1tdID0gewotCVtQUklNX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTRUNfQVVYX1BDTV0gID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtURVJUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fdHhfY2ZnW10gPSB7Ci0JW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi19OwotCi1zdGF0aWMgY2hhciBjb25zdCAqY2hfdGV4dFtdID0geyJUd28iLCAiVGhyZWUiLCAiRm91ciIsICJGaXZlIiwKLQkJCQkJIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGF1eHBjbV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2In07Ci1zdGF0aWMgY2hhciBjb25zdCAqbWkyc19yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKLQkJCQkgICAgICAiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJICAgICAgIktIWl85NiIsICJLSFpfMTkyIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWkyc19jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCi0JCQkJCSAgICJFaWdodCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmJpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIiwgIlMyNF8zTEUiLAotCQkJCQkgICJTMzJfTEUifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICptaTJzX2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCi0JCQkJCSAgIlMzMl9MRSJ9Owotc3RhdGljIGNoYXIgY29uc3QgKnRkbV9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJICAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsICJFaWdodCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKnRkbV9iaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMzJfTEUifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICp0ZG1fc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzMyIiwKLQkJCQkJICAgICAiS0haXzQ0UDEiLCAiS0haXzQ4IiwgIktIWl85NiIsCi0JCQkJCSAgICAgIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1c2JfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAotCQkJCQkgICAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLAotCQkJCQkgICAiRWlnaHQifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKLQkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAotCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJCSJLSFpfOTYiLCAiS0haXzE5MiIsICJLSFpfMzg0In07Ci1zdGF0aWMgY2hhciBjb25zdCAqZXh0X2Rpc3BfYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICpleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAotCQkJCQkJICAiS0haXzE5MiJ9OwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGV4dF9kaXNwX3J4X2NocywgY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByb3h5X3J4X2NocywgY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfcnhfZm9ybWF0LCBtaTJzX2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfcnhfZm9ybWF0LCBtaTJzX2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3J4X2Zvcm1hdCwgbWkyc19mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc19yeF9mb3JtYXQsIG1pMnNfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfdHhfZm9ybWF0LCBtaTJzX2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfZm9ybWF0LCBtaTJzX2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3R4X2Zvcm1hdCwgbWkyc19mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc190eF9mb3JtYXQsIG1pMnNfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X2NocywgdXNiX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2JfdHhfY2hzLCB1c2JfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl9yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGV4dF9kaXNwX3J4X2Zvcm1hdCwgZXh0X2Rpc3BfYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X3NhbXBsZV9yYXRlLCB1c2Jfc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl90eF9zYW1wbGVfcmF0ZSwgdXNiX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZSwKLQkJCQlleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X2NocywgdGRtX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfZm9ybWF0LCB0ZG1fYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3R4X3NhbXBsZV9yYXRlLCB0ZG1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9jaHMsIHRkbV9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X2Zvcm1hdCwgdGRtX2JpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV9yeF9zYW1wbGVfcmF0ZSwgdGRtX3NhbXBsZV9yYXRlX3RleHQpOwotCi1zdGF0aWMgc3RydWN0IGFmZV9jbGtfc2V0IG1pMnNfY2xrW01JMlNfTUFYXSA9IHsKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfUFJJX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfVEVSX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9NSTJTX0lCSVQsCi0JCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbWkyc19tY2xrW01JMlNfTUFYXSA9IHsKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfTUNMS18zLAotCQlRNkFGRV9MUEFTU19PU1JfQ0xLXzlfUDYwMF9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0sCi0JewotCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKLQkJUTZBRkVfTFBBU1NfQ0xLX0lEX01DTEtfNCwKLQkJUTZBRkVfTFBBU1NfT1NSX0NMS185X1A2MDBfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9NQ0xLXzEsCi0JCVE2QUZFX0xQQVNTX09TUl9DTEtfOV9QNjAwX01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfTUNMS18yLAotCQlRNkFGRV9MUEFTU19PU1JfQ0xLXzlfUDYwMF9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWkyc19jb25mIG1pMnNfaW50Zl9jb25mW01JMlNfTUFYXTsKLQotc3RhdGljIGludCBwcm94eV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiBwcm94eV9yeCBjaGFubmVscyA9ICVkXG4iLAotCQkgX19mdW5jX18sIHByb3h5X3J4X2NmZy5jaGFubmVscyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwcm94eV9yeF9jZmcuY2hhbm5lbHMgLSAyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJveHlfcnhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByb3h5X3J4X2NmZy5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICsgMjsKLQlwcl9kZWJ1ZygiJXM6IHByb3h5X3J4IGNoYW5uZWxzID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgcHJveHlfcnhfY2ZnLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQotewotCWludCBzYW1wbGVfcmF0ZSA9IDA7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlOwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGludCBzYW1wbGVfcmF0ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGVfdmFsID0gMDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA3OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKLX0KLQotc3RhdGljIGludCB0ZG1fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgIHN0cnVjdCB0ZG1fcG9ydCAqcG9ydCkKLXsKLQlpZiAocG9ydCkgewotCQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSSIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+bW9kZSA9IFRETV9QUkk7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQyIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+bW9kZSA9IFRETV9TRUM7Ci0JCX0gZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlQiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPm1vZGUgPSBURE1fVEVSVDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVCIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+bW9kZSA9IFRETV9RVUFUOwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgbW9kZSBpbjogJXMiLAotCQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMCIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkgICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzAiLAotCQkgICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMSIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzEiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMiIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzIiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMjsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfMyIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzMiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fMzsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNCIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzQiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNDsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNSIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzUiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNiIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzYiLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNjsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUlhfNyIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSB8fAotCQkJICAgc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRYXzciLAotCQkJICAgc2l6ZW9mKGtjb250cm9sLT5pZC5uYW1lKSkpIHsKLQkJCXBvcnQtPmNoYW5uZWwgPSBURE1fNzsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWwgaW46ICVzIiwKLQkJCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKLQkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9Ci0JCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB0ZG1fZ2V0X3NhbXBsZV9yYXRlX3ZhbCgKLQkJCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlKTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV90eF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSA9Ci0JCQl0ZG1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX2dldF9mb3JtYXQoaW50IHZhbHVlKQotewotCWludCBmb3JtYXQgPSAwOwotCi0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMDoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGZvcm1hdDsKLX0KLQotc3RhdGljIGludCB0ZG1fZ2V0X2Zvcm1hdF92YWwoaW50IGZvcm1hdCkKLXsKLQlpbnQgdmFsdWUgPSAwOwotCi0Jc3dpdGNoIChmb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQl2YWx1ZSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXZhbHVlID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJdmFsdWUgPSAyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2YWx1ZSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19nZXRfZm9ybWF0KGludCB2YWx1ZSkKLXsKLQlpbnQgZm9ybWF0ID0gMDsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDA6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZm9ybWF0OwotfQotCi1zdGF0aWMgaW50IG1pMnNfZ2V0X2Zvcm1hdF92YWx1ZShpbnQgZm9ybWF0KQotewotCWludCB2YWx1ZSA9IDA7Ci0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdmFsdWUgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdmFsdWUgPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl2YWx1ZSA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCB0ZG1fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9mb3JtYXRfdmFsKAotCQkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQpOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQgPQotCQkJdGRtX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfZm9ybWF0X3ZhbCgKLQkJCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0KTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0ID0KLQkJCXRkbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyA9Ci0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDE7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDEsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzID0KLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDEpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGU7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZTsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0KLQlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZV92YWwgPSAwOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX0FVWF9QQ00iLAotCQkgICAgc2l6ZW9mKCJQUklNX0FVWF9QQ00iKSkpCi0JCWlkeCA9IFBSSU1fQVVYX1BDTTsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX0FVWF9QQ00iLAotCQkJIHNpemVvZigiU0VDX0FVWF9QQ00iKSkpCi0JCWlkeCA9IFNFQ19BVVhfUENNOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX0FVWF9QQ00iLAotCQkJIHNpemVvZigiVEVSVF9BVVhfUENNIikpKQotCQlpZHggPSBURVJUX0FVWF9QQ007Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfQVVYX1BDTSIsCi0JCQkgc2l6ZW9mKCJRVUFUX0FVWF9QQ00iKSkpCi0JCWlkeCA9IFFVQVRfQVVYX1BDTTsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgcG9ydDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJaWR4ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCWF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQotCQlhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkgICAgIGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBhdXhfcGNtX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JICAgICBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZV92YWwoYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgYXV4X3BjbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCi17Ci0JaW50IGlkeDsKLQotCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9NSTJTX1JYIiwKLQkgICAgc2l6ZW9mKCJQUklNX01JMlNfUlgiKSkpCi0JCWlkeCA9IFBSSU1fTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX01JMlNfUlgiLAotCQkgc2l6ZW9mKCJTRUNfTUkyU19SWCIpKSkKLQkJaWR4ID0gU0VDX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfTUkyU19SWCIsCi0JCSBzaXplb2YoIlRFUlRfTUkyU19SWCIpKSkKLQkJaWR4ID0gVEVSVF9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX01JMlNfUlgiLAotCQkgc2l6ZW9mKCJRVUFUX01JMlNfUlgiKSkpCi0JCWlkeCA9IFFVQVRfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJTV9NSTJTX1RYIiwKLQkJIHNpemVvZigiUFJJTV9NSTJTX1RYIikpKQotCQlpZHggPSBQUklNX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNFQ19NSTJTX1RYIiwKLQkJIHNpemVvZigiU0VDX01JMlNfVFgiKSkpCi0JCWlkeCA9IFNFQ19NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJURVJUX01JMlNfVFgiLAotCQkgc2l6ZW9mKCJURVJUX01JMlNfVFgiKSkpCi0JCWlkeCA9IFRFUlRfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9NSTJTX1RYIiwKLQkJIHNpemVvZigiUVVBVF9NSTJTX1RYIikpKQotCQlpZHggPSBRVUFUX01JMlM7Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWw6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCWlkeCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludCBtaTJzX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0KLQlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAyOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOwotfQotCi1zdGF0aWMgaW50IG1pMnNfZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGU7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlOwotfQotCi1zdGF0aWMgaW50IG1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCW1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQotCQltaTJzX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKG1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCW1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQotCQltaTJzX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGVfdmFsKG1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIG1pMnNfdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1pMnNfdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPQotCQltaTJzX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF0gX3R4X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgIGlkeCwgbWkyc190eF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQkgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc190eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQltaTJzX2dldF9mb3JtYXRfdmFsdWUobWkyc190eF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCW1pMnNfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9Ci0JCW1pMnNfZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXSBfcnhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSAgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfZ2V0X2Zvcm1hdF92YWx1ZShtaTJzX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQlpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHVzYl9yeF9jZmcuY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3J4X2NmZy5jaGFubmVscyAtIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1c2JfcnhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOwotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl9yeF9jZmcuY2hhbm5lbHMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0KLQlzd2l0Y2ggKHVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA5OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA4OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzIyUDA1S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xMVAwMjVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOwotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgOToKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVzYl9yeF9jZmcuYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVzYl9yeF9jZmcuYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMzoKLQkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb19yeF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdXNiX3J4X2NmZy5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdXNiX3R4X2NmZy5jaGFubmVscyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB1c2JfdHhfY2ZnLmNoYW5uZWxzIC0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVzYl90eF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDE7Ci0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgdXNiX3R4X2NmZy5jaGFubmVscyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbDsKLQotCXN3aXRjaCAodXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDY7Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOwotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgOToKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzIyUDA1S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBjb250cm9sIHZhbHVlID0gJWxkLCB1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGUgPSAlZFxuIiwKLQkJX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVzYl90eF9jZmcuYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVzYl90eF9jZmcuYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgcmMgPSAwOwotCi0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMzoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXVzYl90eF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdXNiX3R4X2NmZy5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJEaXNwbGF5IFBvcnQgUlgiLAotCQkJIHNpemVvZigiRGlzcGxheSBQb3J0IFJYIikpKQotCQlpZHggPSBEUF9SWF9JRFg7Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIEJFOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQlpZHggPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlzd2l0Y2ggKGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmZvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAxOgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3BfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzIC0gMjsKLQotCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmNoID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMgPQotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAyOwotCi0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uY2ggPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXN3aXRjaCAoZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAyOwotCQlicmVhazsKLQotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7Ci0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDI6Ci0JCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIGV4dF9kaXNwX3J4WyVkXS5zYW1wbGVfcmF0ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCBpZHgsCi0JCSBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9jb21tb25fc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJQUk9YWV9SWCBDaGFubmVscyIsIHByb3h5X3J4X2NocywKLQkJCXByb3h5X3J4X2NoX2dldCwgcHJveHlfcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgcHJpbV9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgc2VjX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgdGVydF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX0FVWF9QQ01fUlggU2FtcGxlUmF0ZSIsIHF1YXRfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBwcmltX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBzZWNfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCB0ZXJ0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfQVVYX1BDTV9UWCBTYW1wbGVSYXRlIiwgcXVhdF9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfUlggU2FtcGxlUmF0ZSIsIHByaW1fbWkyc19yeF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfUlggU2FtcGxlUmF0ZSIsIHNlY19taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfUlggU2FtcGxlUmF0ZSIsIHRlcnRfbWkyc19yeF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1JYIFNhbXBsZVJhdGUiLCBxdWF0X21pMnNfcnhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19UWCBTYW1wbGVSYXRlIiwgcHJpbV9taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBTYW1wbGVSYXRlIiwgc2VjX21pMnNfdHhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19UWCBTYW1wbGVSYXRlIiwgdGVydF9taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggU2FtcGxlUmF0ZSIsIHF1YXRfbWkyc190eF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIEZvcm1hdCIsIHByaW1fbWkyc19yeF9mb3JtYXQsCi0JCQltaTJzX3J4X2Zvcm1hdF9nZXQsCi0JCQltaTJzX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfUlggRm9ybWF0Iiwgc2VjX21pMnNfcnhfZm9ybWF0LAotCQkJbWkyc19yeF9mb3JtYXRfZ2V0LAotCQkJbWkyc19yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19SWCBGb3JtYXQiLCB0ZXJ0X21pMnNfcnhfZm9ybWF0LAotCQkJbWkyc19yeF9mb3JtYXRfZ2V0LAotCQkJbWkyc19yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBGb3JtYXQiLCBxdWF0X21pMnNfcnhfZm9ybWF0LAotCQkJbWkyc19yeF9mb3JtYXRfZ2V0LAotCQkJbWkyc19yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19UWCBGb3JtYXQiLCBwcmltX21pMnNfdHhfZm9ybWF0LAotCQkJbWkyc190eF9mb3JtYXRfZ2V0LAotCQkJbWkyc190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1RYIEZvcm1hdCIsIHNlY19taTJzX3R4X2Zvcm1hdCwKLQkJCW1pMnNfdHhfZm9ybWF0X2dldCwKLQkJCW1pMnNfdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggRm9ybWF0IiwgdGVydF9taTJzX3R4X2Zvcm1hdCwKLQkJCW1pMnNfdHhfZm9ybWF0X2dldCwKLQkJCW1pMnNfdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggRm9ybWF0IiwgcXVhdF9taTJzX3R4X2Zvcm1hdCwKLQkJCW1pMnNfdHhfZm9ybWF0X2dldCwKLQkJCW1pMnNfdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfUlggQ2hhbm5lbHMiLCBwcmltX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1RYIENoYW5uZWxzIiwgcHJpbV9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIENoYW5uZWxzIiwgc2VjX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfVFggQ2hhbm5lbHMiLCBzZWNfbWkyc190eF9jaHMsCi0JCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfUlggQ2hhbm5lbHMiLCB0ZXJ0X21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1RYIENoYW5uZWxzIiwgdGVydF9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBDaGFubmVscyIsIHF1YXRfbWkyc19yeF9jaHMsCi0JCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggQ2hhbm5lbHMiLCBxdWF0X21pMnNfdHhfY2hzLAotCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIENoYW5uZWxzIiwgdXNiX3J4X2NocywKLQkJCXVzYl9hdWRpb19yeF9jaF9nZXQsIHVzYl9hdWRpb19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIENoYW5uZWxzIiwgdXNiX3R4X2NocywKLQkJCXVzYl9hdWRpb190eF9jaF9nZXQsIHVzYl9hdWRpb190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIENoYW5uZWxzIiwgZXh0X2Rpc3BfcnhfY2hzLAotCQkJZXh0X2Rpc3BfcnhfY2hfZ2V0LCBleHRfZGlzcF9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIEZvcm1hdCIsIHVzYl9yeF9mb3JtYXQsCi0JCQl1c2JfYXVkaW9fcnhfZm9ybWF0X2dldCwgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIEZvcm1hdCIsIHVzYl90eF9mb3JtYXQsCi0JCQl1c2JfYXVkaW9fdHhfZm9ybWF0X2dldCwgdXNiX2F1ZGlvX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIEJpdCBGb3JtYXQiLCBleHRfZGlzcF9yeF9mb3JtYXQsCi0JCQlleHRfZGlzcF9yeF9mb3JtYXRfZ2V0LCBleHRfZGlzcF9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19SWCBTYW1wbGVSYXRlIiwgdXNiX3J4X3NhbXBsZV9yYXRlLAotCQkJdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIFNhbXBsZVJhdGUiLCB1c2JfdHhfc2FtcGxlX3JhdGUsCi0JCQl1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggU2FtcGxlUmF0ZSIsIGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlLAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCi0JCQl0ZG1fdHhfZm9ybWF0X2dldCwKLQkJCXRkbV90eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAotCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCi0JCQl0ZG1fdHhfY2hfZ2V0LAotCQkJdGRtX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCi0JCQl0ZG1fcnhfZm9ybWF0X2dldCwKLQkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKLQkJCXRkbV90eF9jaF9nZXQsCi0JCQl0ZG1fdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAotCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotfTsKLQotLyoqCi0gKiBtc21fY29tbW9uX3NuZF9jb250cm9sc19zaXplIC0gdG8gcmV0dXJuIGNvbnRyb2xzIHNpemUKLSAqCi0gKiBSZXR1cm46IHJldHVybnMgc2l6ZSBvZiBjb21tb24gY29udHJvbHMgYXJyYXkKLSAqLwotaW50IG1zbV9jb21tb25fc25kX2NvbnRyb2xzX3NpemUodm9pZCkKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShtc21fY29tbW9uX3NuZF9jb250cm9scyk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9jb21tb25fc25kX2NvbnRyb2xzX3NpemUpOwotCi12b2lkIG1zbV9zZXRfY29kZWNfcmVnX2RvbmUoYm9vbCBkb25lKQotewotCWNvZGVjX3JlZ19kb25lID0gZG9uZTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NldF9jb2RlY19yZWdfZG9uZSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHBhcmFtX2lzX21hc2soaW50IHApCi17Ci0JcmV0dXJuIChwID49IFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLKSAmJgotCQkJKHAgPD0gU05EUlZfUENNX0hXX1BBUkFNX0xBU1RfTUFTSyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9tYXNrICpwYXJhbV90b19tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwKLQkJCQkJICAgICBpbnQgbikKLXsKLQlyZXR1cm4gJihwLT5tYXNrc1tuIC0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdKTsKLX0KLQotc3RhdGljIHZvaWQgcGFyYW1fc2V0X21hc2soc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBpbnQgbiwgdW5zaWduZWQgaW50IGJpdCkKLXsKLQlpZiAoYml0ID49IFNORFJWX01BU0tfTUFYKQotCQlyZXR1cm47Ci0JaWYgKHBhcmFtX2lzX21hc2sobikpIHsKLQkJc3RydWN0IHNuZF9tYXNrICptID0gcGFyYW1fdG9fbWFzayhwLCBuKTsKLQotCQltLT5iaXRzWzBdID0gMDsKLQkJbS0+Yml0c1sxXSA9IDA7Ci0JCW0tPmJpdHNbYml0ID4+IDVdIHw9ICgxIDw8IChiaXQgJiAzMSkpOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fZXh0X2Rpc3BfZ2V0X2lkeF9mcm9tX2JlaWQoaW50MzJfdCBpZCkKLXsKLQlpbnQgaWR4OwotCi0Jc3dpdGNoIChpZCkgewotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWDoKLQkJaWR4ID0gRFBfUlhfSURYOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbmNvcnJlY3QgZXh0X2Rpc3AgaWQgJWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0JCWlkeCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLS8qKgotICogbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAgLSB1cGRhdGVzIHNldHRpbmdzIG9mIEFMU0EgQkUgaHcgcGFyYW1zLgotICoKLSAqIEBydGQ6IHJ1bnRpbWUgZGFpbGluayBpbnN0YW5jZQotICogQHBhcmFtczogSFcgcGFyYW1zIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgotICoKLSAqIFJldHVybnMgMC4KLSAqLwotaW50IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQlpbnQgcmMgPSAwOwotCWludCBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkLCByYXRlID0gJWRcbiIsCi0JCSAgX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0KLQlzd2l0Y2ggKGRhaV9saW5rLT5pZCkgewotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1VTQl9SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHVzYl9yeF9jZmcuc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gdXNiX3J4X2NmZy5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9VU0JfVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHVzYl90eF9jZmcuY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYOgotCQlpZHggPSBtc21fZXh0X2Rpc3BfZ2V0X2lkeF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKLQkJaWYgKGlkeCA8IDApIHsKLQkJCXByX2VycigiJXM6IEluY29ycmVjdCBleHQgZGlzcCBpZHggJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlkeCk7Ci0JCQlyYyA9IGlkeDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHByb3h5X3J4X2NmZy5jaGFubmVsczsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCSAgIHRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCSAgIHRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCSAgIHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCSAgIHRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJICAgdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMDoKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCSAgIHRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQkgICB0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJICAgdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbUFJJTV9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbUFJJTV9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tQUklNX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tQUklNX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tTRUNfQVVYX1BDTV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1NFQ19BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbU0VDX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tTRUNfQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tURVJUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tURVJUX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbVEVSVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbVEVSVF9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1FVQVRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1FVQVRfQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fVFg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tRVUFUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tRVUFUX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1JYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tQUklNX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tQUklNX01JMlNdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIG1pMnNfdHhfY2ZnW1BSSU1fTUkyU10uYml0X2Zvcm1hdCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1NFQ19NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc19yeF9jZmdbU0VDX01JMlNdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgbWkyc19yeF9jZmdbU0VDX01JMlNdLmJpdF9mb3JtYXQpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIG1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5iaXRfZm9ybWF0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgbWkyc19yeF9jZmdbVEVSVF9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3R4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgbWkyc190eF9jZmdbVEVSVF9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfUlg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfcnhfY2ZnW1FVQVRfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfcnhfY2ZnW1FVQVRfTUkyU10uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICBtaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmJpdF9mb3JtYXQpOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUVVBVF9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIG1pMnNfdHhfY2ZnW1FVQVRfTUkyU10uYml0X2Zvcm1hdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXApOwotCi0vKioKLSAqIG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwIC0gc3RhcnR1cCBvcHMgb2YgYXV4cGNtLgotICoKLSAqIEBzdWJzdHJlYW06IFBDTSBzdHJlYW0gcG9pbnRlciBvZiBhc3NvY2lhdGVkIGJhY2tlbmQgZGFpbGluawotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZXJyb3IuCi0gKi8KLWludCBtc21fYXV4X3BjbV9zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZCwgZGFpIG5hbWUgJXMsIGRhaSBJRCAlZFxuIiwKLQkJX19mdW5jX18sIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0sCi0JCXJ0ZC0+Y3B1X2RhaS0+bmFtZSwgcnRkLT5jcHVfZGFpLT5pZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2F1eF9wY21fc25kX3N0YXJ0dXApOwotCi0vKioKLSAqIG1zbV9hdXhfcGNtX3NuZF9zaHV0ZG93biAtIHNodXRkb3duIG9wcyBvZiBhdXhwY20uCi0gKgotICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBwb2ludGVyIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rCi0gKi8KLXZvaWQgbXNtX2F1eF9wY21fc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsCi0JCSIlczogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkLCBkYWkgbmFtZSAlcywgZGFpIElEICVkXG4iLAotCQlfX2Z1bmNfXywKLQkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSwKLQkJcnRkLT5jcHVfZGFpLT5uYW1lLCBydGQtPmNwdV9kYWktPmlkKTsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2F1eF9wY21fc25kX3NodXRkb3duKTsKLQotc3RhdGljIGludCBtc21fZ2V0X3BvcnRfaWQoaW50IGlkKQotewotCWludCBhZmVfcG9ydF9pZDsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKLQkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0JCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gYWZlX3BvcnRfaWQ7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKHUzMiBiaXRfZm9ybWF0KQotewotCXUzMiBiaXRfcGVyX3NhbXBsZTsKLQotCXN3aXRjaCAoYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJYml0X3Blcl9zYW1wbGUgPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQliaXRfcGVyX3NhbXBsZSA9IDE2OwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYml0X3Blcl9zYW1wbGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9taTJzX2Nsa192YWwoaW50IGRhaV9pZCwgaW50IHN0cmVhbSkKLXsKLQl1MzIgYml0X3Blcl9zYW1wbGU7Ci0KLQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJYml0X3Blcl9zYW1wbGUgPQotCQkgICAgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKG1pMnNfcnhfY2ZnW2RhaV9pZF0uYml0X2Zvcm1hdCk7Ci0JCW1pMnNfY2xrW2RhaV9pZF0uY2xrX2ZyZXFfaW5faHogPQotCQkgICAgbWkyc19yeF9jZmdbZGFpX2lkXS5zYW1wbGVfcmF0ZSAqIDIgKiBiaXRfcGVyX3NhbXBsZTsKLQl9IGVsc2UgewotCQliaXRfcGVyX3NhbXBsZSA9Ci0JCSAgICBnZXRfbWkyc19iaXRzX3Blcl9zYW1wbGUobWkyc190eF9jZmdbZGFpX2lkXS5iaXRfZm9ybWF0KTsKLQkJbWkyc19jbGtbZGFpX2lkXS5jbGtfZnJlcV9pbl9oeiA9Ci0JCSAgICBtaTJzX3R4X2NmZ1tkYWlfaWRdLnNhbXBsZV9yYXRlICogMiAqIGJpdF9wZXJfc2FtcGxlOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fbWkyc19zZXRfc2NsayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcG9ydF9pZCA9IDA7Ci0JaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7Ci0KLQlwb3J0X2lkID0gbXNtX2dldF9wb3J0X2lkKHJ0ZC0+ZGFpX2xpbmstPmlkKTsKLQlpZiAocG9ydF9pZCA8IDApIHsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzOiBJbnZhbGlkIHBvcnRfaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gcG9ydF9pZDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChlbmFibGUpIHsKLQkJdXBkYXRlX21pMnNfY2xrX3ZhbChpbmRleCwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IGNsb2NrIHJhdGUgJXVsXG4iLCBfX2Z1bmNfXywKLQkJCW1pMnNfY2xrW2luZGV4XS5jbGtfZnJlcV9pbl9oeik7Ci0JfQotCi0JbWkyc19jbGtbaW5kZXhdLmVuYWJsZSA9IGVuYWJsZTsKLQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHBvcnRfaWQsCi0JCQkJICAgICAmbWkyc19jbGtbaW5kZXhdKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJIiVzOiBhZmUgbHBhc3MgY2xvY2sgZmFpbGVkIGZvciBwb3J0IDB4JXggLCBlcnI6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcG9ydF9pZCwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG1zbV9taTJzX3NuZF9zdGFydHVwIC0gc3RhcnR1cCBvcHMgb2YgbWkycy4KLSAqCi0gKiBAc3Vic3RyZWFtOiBQQ00gc3RyZWFtIHBvaW50ZXIgb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIG9uIGVycm9yLgotICovCi1pbnQgbXNtX21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcG9ydF9pZCA9IG1zbV9nZXRfcG9ydF9pZChydGQtPmRhaV9saW5rLT5pZCk7Ci0JaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7Ci0JdW5zaWduZWQgaW50IGZtdCA9IFNORF9TT0NfREFJRk1UX0NCU19DRlM7Ci0KLQlkZXZfZGJnKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkiJXM6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZCwgZGFpIG5hbWUgJXMsIGRhaSBJRCAlZFxuIiwKLQkJX19mdW5jX18sIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0sCi0JCWNwdV9kYWktPm5hbWUsIGNwdV9kYWktPmlkKTsKLQotCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgewotCQlyZXQgPSAtRUlOVkFMOwotCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJIiVzOiBDUFUgREFJIGlkICglZCkgb3V0IG9mIHJhbmdlXG4iLAotCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKLQkJZ290byBkb25lOwotCX0KLQkvKgotCSAqIE11eHRleCBwcm90ZWN0aW9uIGluIGNhc2UgdGhlIHNhbWUgTUkyUwotCSAqIGludGVyZmFjZSB1c2luZyBmb3IgYm90aCBUWCBhbmQgUlggIHNvCi0JICogdGhhdCB0aGUgc2FtZSBjbG9jayB3b24ndCBiZSBlbmFibGUgdHdpY2UuCi0JICovCi0JbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCWlmICgrK21pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDEpIHsKLQkJLyogQ2hlY2sgaWYgbXNtIG5lZWRzIHRvIHByb3ZpZGUgdGhlIGNsb2NrIHRvIHRoZSBpbnRlcmZhY2UgKi8KLQkJaWYgKCFtaTJzX2ludGZfY29uZltpbmRleF0ubXNtX2lzX21pMnNfbWFzdGVyKSB7Ci0JCQltaTJzX2Nsa1tpbmRleF0uY2xrX2lkID0gbWkyc19lYml0X2Nsa1tpbmRleF07Ci0JCQlmbXQgPSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOwotCQl9Ci0JCXJldCA9IG1zbV9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCB0byBlbmFibGUgTUkyUyBjbG9jaywgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBjbGVhbl91cDsKLQkJfQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIGZtdCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlczogc2V0IGZtdCBjcHUgZGFpIGZhaWxlZCBmb3IgTUkyUyAoJWQpLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4LCByZXQpOwotCQkJZ290byBjbGtfb2ZmOwotCQl9Ci0JCWlmIChtaTJzX2ludGZfY29uZltpbmRleF0ubXNtX2lzX2V4dF9tY2xrKSB7Ci0JCQltaTJzX21jbGtbaW5kZXhdLmVuYWJsZSA9IDE7Ci0JCQlwcl9kZWJ1ZygiJXM6IEVuYWJsaW5nIG1jbGssIGNsa19mcmVxX2luX2h6ID0gJXVcbiIsCi0JCQkJX19mdW5jX18sIG1pMnNfbWNsa1tpbmRleF0uY2xrX2ZyZXFfaW5faHopOwotCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAotCQkJCQkJICAgICAmbWkyc19tY2xrW2luZGV4XSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IGFmZSBscGFzcyBtY2xrIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCQlnb3RvIGNsa19vZmY7Ci0JCQl9Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7Ci0JcmV0dXJuIDA7Ci1jbGtfb2ZmOgotCWlmIChyZXQgPCAwKQotCQltc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKLWNsZWFuX3VwOgotCWlmIChyZXQgPCAwKQotCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudC0tOwotCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotZG9uZToKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChtc21fbWkyc19zbmRfc3RhcnR1cCk7Ci0KLS8qKgotICogbXNtX21pMnNfc25kX3NodXRkb3duIC0gc2h1dGRvd24gb3BzIG9mIG1pMnMuCi0gKgotICogQHN1YnN0cmVhbTogUENNIHN0cmVhbSBwb2ludGVyIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rCi0gKi8KLXZvaWQgbXNtX21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3J0X2lkID0gbXNtX2dldF9wb3J0X2lkKHJ0ZC0+ZGFpX2xpbmstPmlkKTsKLQlpbnQgaW5kZXggPSBydGQtPmNwdV9kYWktPmlkOwotCi0JcHJfZGVidWcoIiVzKCk6IHN1YnN0cmVhbSA9ICVzICBzdHJlYW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQlpZiAoaW5kZXggPCBQUklNX01JMlMgfHwgaW5kZXggPiBRVUFUX01JMlMpIHsKLQkJcHJfZXJyKCIlczppbnZhbGlkIE1JMlMgREFJKCVkKVxuIiwgX19mdW5jX18sIGluZGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCW11dGV4X2xvY2soJm1pMnNfaW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLQlpZiAoLS1taTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAwKSB7Ci0JCXJldCA9IG1zbV9taTJzX3NldF9zY2xrKHN1YnN0cmVhbSwgZmFsc2UpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczpjbG9jayBkaXNhYmxlIGZhaWxlZCBmb3IgTUkyUyAoJWQpOyByZXQ9JWRcbiIsCi0JCQkJX19mdW5jX18sIGluZGV4LCByZXQpOwotCQkJbWkyc19pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQrKzsKLQkJfQotCQlpZiAobWkyc19pbnRmX2NvbmZbaW5kZXhdLm1zbV9pc19leHRfbWNsaykgewotCQkJbWkyc19tY2xrW2luZGV4XS5lbmFibGUgPSAwOwotCQkJcHJfZGVidWcoIiVzOiBEaXNhYmxpbmcgbWNsaywgY2xrX2ZyZXFfaW5faHogPSAldVxuIiwKLQkJCQkgX19mdW5jX18sIG1pMnNfbWNsa1tpbmRleF0uY2xrX2ZyZXFfaW5faHopOwotCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192Mihwb3J0X2lkLAotCQkJCQkJICAgICAmbWkyc19tY2xrW2luZGV4XSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IG1jbGsgZGlzYWJsZSBmYWlsZWQgZm9yIE1DTEsgKCVkKTsgcmV0PSVkXG4iLAotCQkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZtaTJzX2ludGZfY29uZltpbmRleF0ubG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9taTJzX3NuZF9zaHV0ZG93bik7Ci0KLS8qIFZhbGlkYXRlIHdoZXRoZXIgVVMgRVUgc3dpdGNoIGlzIHByZXNlbnQgb3Igbm90ICovCi1zdGF0aWMgaW50IG1zbV9wcmVwYXJlX3VzX2V1cm8oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9Ci0JCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgewotCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiB1c19ldXJvIGdwaW8gcmVxdWVzdCAlZCIsIF9fZnVuY19fLAotCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+dXNfZXVyb19ncGlvLCAiVEFTSEFfQ09ERUNfVVNfRVVSTyIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNvZGVjIFVTL0VVUk8gZ3BpbyAlZCBlcnJvciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3BpbywgcmV0KTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIG1zbV9zd2FwX2duZF9taWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGFjdGl2ZSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0KLQkJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0JaW50IHZhbHVlID0gMDsKLQotCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvX3ApIHsKLQkJdmFsdWUgPSBtc21fY2RjX3BpbmN0cmxfZ2V0X3N0YXRlKHBkYXRhLT51c19ldXJvX2dwaW9fcCk7Ci0JCWlmICh2YWx1ZSkKLQkJCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCi0JCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKLQkJZWxzZQotCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCi0JCQkJCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKTsKLQl9IGVsc2UgaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgewotCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c19ldXJvX2dwaW8pOwotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+dXNfZXVyb19ncGlvLCAhdmFsdWUpOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHN3YXAgc2VsZWN0IHN3aXRjaCAlZCB0byAlZFxuIiwgX19mdW5jX18sIHZhbHVlLCAhdmFsdWUpOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IG1zbV9wb3B1bGF0ZV9kYWlfbGlua19jb21wb25lbnRfb2Zfbm9kZSgKLQkJc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCi0JCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0JaW50IGksIGluZGV4LCByZXQgPSAwOwotCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjYXJkLT5kZXY7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwaGFuZGxlOwotCi0JaWYgKCFjZGV2KSB7Ci0JCXByX2VycigiJXM6IFNvdW5kIGNhcmQgZGV2aWNlIG1lbW9yeSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fbGlua3M7IGkrKykgewotCQlpZiAoZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSAmJiBkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHBvcHVsYXRlIHBsYXRmb3JtX29mX25vZGUgZm9yIHNuZCBjYXJkIGRhaSBsaW5rcyAqLwotCQlpZiAoZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSAmJgotCQkJCSFkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlKSB7Ci0JCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAotCQkJCQkiYXNvYy1wbGF0Zm9ybS1uYW1lcyIsCi0JCQkJCWRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCXByX2VycigiJXM6IE5vIG1hdGNoIGZvdW5kIGZvciBwbGF0Zm9ybSBuYW1lOiAlc1xuIiwKLQkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOwotCQkJCXJldCA9IGluZGV4OwotCQkJCWdvdG8gY3B1X2RhaTsKLQkJCX0KLQkJCXBoYW5kbGUgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsCi0JCQkJCSJhc29jLXBsYXRmb3JtIiwKLQkJCQkJaW5kZXgpOwotCQkJaWYgKCFwaGFuZGxlKSB7Ci0JCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBwbGF0Zm9ybSAlcywgaW5kZXggJWQgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSwKLQkJCQkJCWluZGV4KTsKLQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSA9IHBoYW5kbGU7Ci0JCQlkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lID0gTlVMTDsKLQkJfQotY3B1X2RhaToKLQkJLyogcG9wdWxhdGUgY3B1X29mX25vZGUgZm9yIHNuZCBjYXJkIGRhaSBsaW5rcyAqLwotCQlpZiAoZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lICYmICFkYWlfbGlua1tpXS5jcHVfb2Zfbm9kZSkgewotCQkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcoY2Rldi0+b2Zfbm9kZSwKLQkJCQkJImFzb2MtY3B1LW5hbWVzIiwKLQkJCQkJZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lKTsKLQkJCWlmIChpbmRleCA8IDApCi0JCQkJZ290byBjb2RlY19kYWk7Ci0JCQlwaGFuZGxlID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLCAiYXNvYy1jcHUiLAotCQkJCQlpbmRleCk7Ci0JCQlpZiAoIXBoYW5kbGUpIHsKLQkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNwdSBkYWkgJXMgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXywgZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lKTsKLQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGFpX2xpbmtbaV0uY3B1X29mX25vZGUgPSBwaGFuZGxlOwotCQkJZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lID0gTlVMTDsKLQkJfQotY29kZWNfZGFpOgotCQkvKiBwb3B1bGF0ZSBjb2RlY19vZl9ub2RlIGZvciBzbmQgY2FyZCBkYWkgbGlua3MgKi8KLQkJaWYgKGRhaV9saW5rW2ldLmNvZGVjX25hbWUgJiYgIWRhaV9saW5rW2ldLmNvZGVjX29mX25vZGUpIHsKLQkJCWluZGV4ID0gb2ZfcHJvcGVydHlfbWF0Y2hfc3RyaW5nKGNkZXYtPm9mX25vZGUsCi0JCQkJCSJhc29jLWNvZGVjLW5hbWVzIiwKLQkJCQkJZGFpX2xpbmtbaV0uY29kZWNfbmFtZSk7Ci0JCQlpZiAoaW5kZXggPCAwKQotCQkJCWNvbnRpbnVlOwotCQkJcGhhbmRsZSA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY29kZWMiLAotCQkJCQlpbmRleCk7Ci0JCQlpZiAoIXBoYW5kbGUpIHsKLQkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNvZGVjIGRhaSAlcyBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKLQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGFpX2xpbmtbaV0uY29kZWNfb2Zfbm9kZSA9IHBoYW5kbGU7Ci0JCQlkYWlfbGlua1tpXS5jb2RlY19uYW1lID0gTlVMTDsKLQkJfQotCQlpZiAocGRhdGEtPnNuZF9jYXJkX3ZhbCA9PSBJTlRfU05EX0NBUkQpIHsKLQkJCWlmICgoZGFpX2xpbmtbaV0uaWQgPT0KLQkJCQkJTVNNX0JBQ0tFTkRfREFJX0lOVDBfTUkyU19SWCkgfHwKLQkJCSAgICAoZGFpX2xpbmtbaV0uaWQgPT0KLQkJCQkJTVNNX0JBQ0tFTkRfREFJX0lOVDFfTUkyU19SWCkgfHwKLQkJCSAgICAoZGFpX2xpbmtbaV0uaWQgPT0KLQkJCQkJTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCkgfHwKLQkJCSAgICAoZGFpX2xpbmtbaV0uaWQgPT0KLQkJCQkJTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWCkpIHsKLQkJCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAotCQkJCQkJCSJhc29jLWNvZGVjLW5hbWVzIiwKLQkJCQkJCQlNU01fSU5UX0RJR0lUQUxfQ09ERUMpOwotCQkJCXBoYW5kbGUgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsCi0JCQkJCQkJICAgImFzb2MtY29kZWMiLAotCQkJCQkJCSAgIGluZGV4KTsKLQkJCQlkYWlfbGlua1tpXS5jb2RlY3NbRElHX0NEQ10ub2Zfbm9kZSA9IHBoYW5kbGU7Ci0JCQkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcoY2Rldi0+b2Zfbm9kZSwKLQkJCQkJCQkiYXNvYy1jb2RlYy1uYW1lcyIsCi0JCQkJCQkJUE1JQ19JTlRfQU5BTE9HX0NPREVDKTsKLQkJCQlwaGFuZGxlID0gb2ZfcGFyc2VfcGhhbmRsZShjZGV2LT5vZl9ub2RlLAotCQkJCQkJCSAgICJhc29jLWNvZGVjIiwKLQkJCQkJCQkgICBpbmRleCk7Ci0JCQkJZGFpX2xpbmtbaV0uY29kZWNzW0FOQV9DRENdLm9mX25vZGUgPSBwaGFuZGxlOwotCQkJfQotCQl9Ci0JfQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3dzYTg4MXhfaW5pdChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKLXsKLQl1OCBzcGtsZWZ0X3BvcnRzW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MTAwLCAxMDEsIDEwMiwgMTA2fTsKLQl1OCBzcGtyaWdodF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMywgMTA0LCAxMDUsIDEwN307Ci0JdW5zaWduZWQgaW50IGNoX3JhdGVbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsyNDAwLCA2MDAsIDMwMCwgMTIwMH07Ci0JdW5zaWduZWQgaW50IGNoX21hc2tbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsweDEsIDB4RiwgMHgzLCAweDN9OwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfY29tcG9uZW50X3RvX2NvZGVjKGNvbXBvbmVudCk7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCi0JaWYgKCFjb2RlYykgewotCQlwcl9lcnIoIiVzIGNvZGVjIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JMZWZ0IikpIHsKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHNldHRpbmcgbGVmdCBjaCBtYXAgdG8gY29kZWMgJXNcbiIsCi0JCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7Ci0JCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrbGVmdF9wb3J0c1swXSwKLQkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAotCQkJCSZjaF9yYXRlWzBdKTsKLQkJaWYgKGRhcG0tPmNvbXBvbmVudCkgewotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBJTiIpOwotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBTUEtSIik7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JSaWdodCIpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIHJpZ2h0IGNoIG1hcCB0byBjb2RlYyAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQkJd3NhODgxeF9zZXRfY2hhbm5lbF9tYXAoY29kZWMsICZzcGtyaWdodF9wb3J0c1swXSwKLQkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAotCQkJCSZjaF9yYXRlWzBdKTsKLQkJaWYgKGRhcG0tPmNvbXBvbmVudCkgewotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyUmlnaHQgSU4iKTsKLQkJCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU3BrclJpZ2h0IFNQS1IiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiB3cm9uZyBjb2RlYyBuYW1lICVzXG4iLCBfX2Z1bmNfXywKLQkJCQljb2RlYy0+Y29tcG9uZW50Lm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvbXBvbmVudC0+Y2FyZCk7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19yb290KQotCQl3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LAotCQkJCQkJICAgICAgY29kZWMpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgbXNtX2luaXRfd3NhX2RldihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICp3c2Ffb2Zfbm9kZTsKLQl1MzIgd3NhX21heF9kZXZzOwotCXUzMiB3c2FfZGV2X2NudDsKLQljaGFyICpkZXZfbmFtZV9zdHIgPSBOVUxMOwotCXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKLQljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOwotCWludCBmb3VuZCA9IDA7Ci0JaW50IGk7Ci0JaW50IHJldDsKLQotCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sd3NhLW1heC1kZXZzIiwgJndzYV9tYXhfZGV2cyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXM6IHdzYS1tYXgtZGV2cyBwcm9wZXJ0eSBtaXNzaW5nIGluIERUICVzLCByZXQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCBwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lLCByZXQpOwotCQlnb3RvIGVycl9kdDsKLQl9Ci0JaWYgKHdzYV9tYXhfZGV2cyA9PSAwKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsCi0JCQkiJXM6IE1heCBXU0EgZGV2aWNlcyBpcyAwIGZvciB0aGlzIHRhcmdldD9cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2R0OwotCQkJCX0KLQotCS8qIEdldCBjb3VudCBvZiBXU0EgZGV2aWNlIHBoYW5kbGVzIGZvciB0aGlzIHBsYXRmb3JtICovCi0Jd3NhX2Rldl9jbnQgPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCSJxY29tLHdzYS1kZXZzIiwgTlVMTCk7Ci0JaWYgKHdzYV9kZXZfY250ID09IC1FTk9FTlQpIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIiVzOiBObyB3c2EgZGV2aWNlIGRlZmluZWQgaW4gRFQuXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycl9kdDsKLQl9IGVsc2UgaWYgKHdzYV9kZXZfY250IDw9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBFcnJvciByZWFkaW5nIHdzYSBkZXZpY2UgZnJvbSBEVC4gd3NhX2Rldl9jbnQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfZGV2X2NudCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2R0OwotCX0KLQotCS8qCi0JICogRXhwZWN0IHRvdGFsIHBoYW5kbGVzIGNvdW50IHRvIGJlIE5PVCBsZXNzIHRoYW4gbWF4aW11bSBwb3NzaWJsZQotCSAqIFdTQSBjb3VudC4gSG93ZXZlciwgaWYgaXQgaXMgbGVzcywgdGhlbiBhc3NpZ24gc2FtZSB2YWx1ZSB0bwotCSAqIG1heCBjb3VudCBhcyB3ZWxsLgotCSAqLwotCWlmICh3c2FfZGV2X2NudCA8IHdzYV9tYXhfZGV2cykgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXM6IHdzYV9tYXhfZGV2cyA9ICVkIGNhbm5vdCBleGNlZWQgd3NhX2Rldl9jbnQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIHdzYV9kZXZfY250KTsKLQkJd3NhX21heF9kZXZzID0gd3NhX2Rldl9jbnQ7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHByZWZpeCBzdHJpbmcgcGFzc2VkIGZvciBlYWNoIFdTQSBkZXZpY2UgKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sd3NhLWF1eC1kZXYtcHJlZml4Iik7Ci0JaWYgKHJldCAhPSB3c2FfZGV2X2NudCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IGV4cGVjdGluZyAlZCB3c2EgcHJlZml4LiBEZWZpbmVkIG9ubHkgJWQgaW4gRFRcbiIsCi0JCQlfX2Z1bmNfXywgd3NhX2Rldl9jbnQsIHJldCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX2R0OwotCX0KLQotCS8qCi0JICogQWxsb2MgbWVtIHRvIHN0b3JlIHBoYW5kbGUgYW5kIGluZGV4IGluZm8gb2YgV1NBIGRldmljZSwgaWYgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUKLQkgKi8KLQl3c2E4ODF4X2Rldl9pbmZvID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHdzYV9tYXhfZGV2cywKLQkJCQkJc2l6ZW9mKHN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyksCi0JCQkJCUdGUF9LRVJORUwpOwotCWlmICghd3NhODgxeF9kZXZfaW5mbykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9tZW07Ci0JfQotCi0JLyoKLQkgKiBzZWFyY2ggYW5kIGNoZWNrIHdoZXRoZXIgYWxsIFdTQSBkZXZpY2VzIGFyZSBhbHJlYWR5Ci0JICogcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZSBvciBub3QuIElmIGZvdW5kIGEgbm9kZSwgc3RvcmUKLQkgKiB0aGUgbm9kZSBhbmQgdGhlIGluZGV4IGluIGEgbG9jYWwgYXJyYXkgb2Ygc3RydWN0IGZvciBsYXRlcgotCSAqIHVzZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgd3NhX2Rldl9jbnQ7IGkrKykgewotCQl3c2Ffb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSAgICAgICAicWNvbSx3c2EtZGV2cyIsIGkpOwotCQlpZiAodW5saWtlbHkoIXdzYV9vZl9ub2RlKSkgewotCQkJLyogd2Ugc2hvdWxkIG5vdCBiZSBoZXJlICovCi0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiB3c2EgZGV2IG5vZGUgaXMgbm90IHByZXNlbnRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyX2Rldl9ub2RlOwotCQl9Ci0JCWlmIChzb2NfZmluZF9jb21wb25lbnQod3NhX29mX25vZGUsIE5VTEwpKSB7Ci0JCQkvKiBXU0EgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgKi8KLQkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLm9mX25vZGUgPSB3c2Ffb2Zfbm9kZTsKLQkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLmluZGV4ID0gaTsKLQkJCWZvdW5kKys7Ci0JCQlpZiAoZm91bmQgPT0gd3NhX21heF9kZXZzKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGZvdW5kIDwgd3NhX21heF9kZXZzKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogZmFpbGVkIHRvIGZpbmQgJWQgY29tcG9uZW50cy4gRm91bmQgb25seSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIGZvdW5kKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCWRldl9pbmZvKCZwZGV2LT5kZXYsCi0JCSIlczogZm91bmQgJWQgd3NhODgxeCBkZXZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmVcbiIsCi0JCV9fZnVuY19fLCBmb3VuZCk7Ci0KLQljYXJkLT5udW1fYXV4X2RldnMgPSB3c2FfbWF4X2RldnM7Ci0JY2FyZC0+bnVtX2NvbmZpZ3MgPSB3c2FfbWF4X2RldnM7Ci0KLQkvKiBBbGxvYyBhcnJheSBvZiBBVVggZGV2cyBzdHJ1Y3QgKi8KLQltc21fYXV4X2RldiA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjYXJkLT5udW1fYXV4X2RldnMsCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2F1eF9kZXYpLAotCQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghbXNtX2F1eF9kZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfYXV4ZGV2X21lbTsKLQl9Ci0KLQkvKiBBbGxvYyBhcnJheSBvZiBjb2RlYyBjb25mIHN0cnVjdCAqLwotCW1zbV9jb2RlY19jb25mID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNhcmQtPm51bV9hdXhfZGV2cywKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21fY29kZWNfY29uZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9jb2RlY19jb25mOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fYXV4X2RldnM7IGkrKykgewotCQlkZXZfbmFtZV9zdHIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgREVWX05BTUVfU1RSX0xFTiwKLQkJCQkJICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWRldl9uYW1lX3N0cikgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2Rldl9zdHI7Ci0JCX0KLQotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCSAgICAicWNvbSx3c2EtYXV4LWRldi1wcmVmaXgiLAotCQkJCQkJICAgIHdzYTg4MXhfZGV2X2luZm9baV0uaW5kZXgsCi0JCQkJCQkgICAgd3NhX2F1eGRldl9uYW1lX3ByZWZpeCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiJXM6IGZhaWxlZCB0byByZWFkIHdzYSBhdXggZGV2IHByZWZpeCwgcmV0ID0gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnJfZHRfcHJvcDsKLQkJfQotCi0JCXNucHJpbnRmKGRldl9uYW1lX3N0ciwgc3RybGVuKCJ3c2E4ODF4LiVkIiksICJ3c2E4ODF4LiVkIiwgaSk7Ci0JCW1zbV9hdXhfZGV2W2ldLm5hbWUgPSBkZXZfbmFtZV9zdHI7Ci0JCW1zbV9hdXhfZGV2W2ldLmNvZGVjX25hbWUgPSBOVUxMOwotCQltc21fYXV4X2RldltpXS5jb2RlY19vZl9ub2RlID0KLQkJCXdzYTg4MXhfZGV2X2luZm9baV0ub2Zfbm9kZTsKLQkJbXNtX2F1eF9kZXZbaV0uaW5pdCA9IG1zbV93c2E4ODF4X2luaXQ7Ci0JCW1zbV9jb2RlY19jb25mW2ldLmRldl9uYW1lID0gTlVMTDsKLQkJbXNtX2NvZGVjX2NvbmZbaV0ubmFtZV9wcmVmaXggPSB3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzBdOwotCQltc21fY29kZWNfY29uZltpXS5vZl9ub2RlID0gd3NhODgxeF9kZXZfaW5mb1tpXS5vZl9ub2RlOwotCX0KLQljYXJkLT5jb2RlY19jb25mID0gbXNtX2NvZGVjX2NvbmY7Ci0JY2FyZC0+YXV4X2RldiA9IG1zbV9hdXhfZGV2OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9kdF9wcm9wOgotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgZGV2X25hbWVfc3RyKTsKLWVycl9kZXZfc3RyOgotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbXNtX2NvZGVjX2NvbmYpOwotZXJyX2NvZGVjX2NvbmY6Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBtc21fYXV4X2Rldik7Ci1lcnJfYXV4ZGV2X21lbToKLWVycl9kZXZfbm9kZToKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdzYTg4MXhfZGV2X2luZm8pOwotZXJyX21lbToKLWVycl9kdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtc21fZnJlZV9hdXhkZXZfbWVtKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpOwotCi0JaWYgKGNhcmQtPm51bV9hdXhfZGV2cyA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9hdXhfZGV2czsgaSsrKSB7Ci0JCQlrZnJlZShtc21fYXV4X2RldltpXS5jb2RlY19uYW1lKTsKLQkJCWtmcmVlKG1zbV9jb2RlY19jb25mW2ldLmRldl9uYW1lKTsKLQkJCWtmcmVlKG1zbV9jb2RlY19jb25mW2ldLm5hbWVfcHJlZml4KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgaTJzX2F1eHBjbV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGNvdW50OwotCXUzMiBtaTJzX21hc3Rlcl9zbGF2ZVtNSTJTX01BWF07Ci0JdTMyIG1pMnNfZXh0X21jbGtbTUkyU19NQVhdOwotCWludCByZXQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgewotCQltdXRleF9pbml0KCZtaTJzX2ludGZfY29uZltjb3VudF0ubG9jayk7Ci0JCW1pMnNfaW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJICJxY29tLG1zbS1taTJzLW1hc3RlciIsCi0JCQkJCSBtaTJzX21hc3Rlcl9zbGF2ZSwgTUkyU19NQVgpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IG5vIHFjb20sbXNtLW1pMnMtbWFzdGVyIGluIERUIG5vZGVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgTUkyU19NQVg7IGNvdW50KyspIHsKLQkJCW1pMnNfaW50Zl9jb25mW2NvdW50XS5tc21faXNfbWkyc19tYXN0ZXIgPQotCQkJCW1pMnNfbWFzdGVyX3NsYXZlW2NvdW50XTsKLQkJfQotCX0KLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkgInFjb20sbXNtLW1pMnMtZXh0LW1jbGsiLAotCQkJCQkgbWkyc19leHRfbWNsaywgTUkyU19NQVgpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6IG5vIHFjb20sbXNtLW1pMnMtZXh0LW1jbGsgaW4gRFQgbm9kZVxuIiwKLQkJCV9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykKLQkJCW1pMnNfaW50Zl9jb25mW2NvdW50XS5tc21faXNfZXh0X21jbGsgPQotCQkJCW1pMnNfZXh0X21jbGtbY291bnRdOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RtNjYwX2Fzb2NfbWFjaGluZV9vZl9tYXRjaFtdICA9IHsKLQl7IC5jb21wYXRpYmxlID0gInFjb20sc2RtNjYwLWFzb2Mtc25kIiwKLQkgIC5kYXRhID0gImludGVybmFsX2NvZGVjIn0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHNkbTY2MC1hc29jLXNuZC10YXNoYSIsCi0JICAuZGF0YSA9ICJ0YXNoYV9jb2RlYyJ9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzZG02NjAtYXNvYy1zbmQtdGF2aWwiLAotCSAgLmRhdGEgPSAidGF2aWxfY29kZWMifSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20sc2RtNjcwLWFzb2Mtc25kIiwKLQkgIC5kYXRhID0gImludGVybmFsX2NvZGVjIn0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHNkbTY3MC1hc29jLXNuZC10YXNoYSIsCi0JICAuZGF0YSA9ICJ0YXNoYV9jb2RlYyJ9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzZG02NzAtYXNvYy1zbmQtdGF2aWwiLAotCSAgLmRhdGEgPSAidGF2aWxfY29kZWMifSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2Fzb2NfbWFjaGluZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQljb25zdCBjaGFyICptY2xrID0gInFjb20sbXNtLW1jbGstZnJlcSI7Ci0JaW50IHJldCA9IC1FSU5WQUwsIGlkOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEpLAotCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1zbV9zZXRfY29kZWNfcmVnX2RvbmUoZmFsc2UpOwotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShzZG02NjBfYXNvY19tYWNoaW5lX29mX21hdGNoLAotCQkJICAgICAgcGRldi0+ZGV2Lm9mX25vZGUpOwotCWlmICghbWF0Y2gpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsIG1jbGssICZpZCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIG1jbGspOwotCQlpZCA9IERFRkFVTFRfTUNMS19SQVRFOwotCX0KLQlwZGF0YS0+bWNsa19mcmVxID0gaWQ7Ci0KLQlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhc2hhX2NvZGVjIikgfHwKLQkgICAgIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhdmlsX2NvZGVjIikpIHsKLQkJaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJ0YXNoYV9jb2RlYyIpKQotCQkJcGRhdGEtPnNuZF9jYXJkX3ZhbCA9IEVYVF9TTkRfQ0FSRF9UQVNIQTsKLQkJZWxzZQotCQkJcGRhdGEtPnNuZF9jYXJkX3ZhbCA9IEVYVF9TTkRfQ0FSRF9UQVZJTDsKLQkJcmV0ID0gbXNtX2V4dF9jZGNfaW5pdChwZGV2LCBwZGF0YSwgJmNhcmQsICZtYmhjX2NmZyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobWF0Y2gtPmRhdGEsICJpbnRlcm5hbF9jb2RlYyIpKSB7Ci0JCXBkYXRhLT5zbmRfY2FyZF92YWwgPSBJTlRfU05EX0NBUkQ7Ci0JCXJldCA9IG1zbV9pbnRfY2RjX2luaXQocGRldiwgcGRhdGEsICZjYXJkLCAmbWJoY19jZmcpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBOb3QgYSBtYXRjaGluZyBEVCBzb3VuZCBub2RlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIWNhcmQpCi0JCWdvdG8gZXJyOwotCi0JaWYgKHBkYXRhLT5zbmRfY2FyZF92YWwgPT0gSU5UX1NORF9DQVJEKSB7Ci0JCS8qcmVhZGluZyB0aGUgZ3BpbyBjb25maWd1cmF0aW9ucyBmcm9tIGR0c2kgZmlsZSovCi0JCXBkYXRhLT5wZG1fZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sY2RjLXBkbS1ncGlvcyIsIDApOwotCQlwZGF0YS0+Y29tcF9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkicWNvbSxjZGMtY29tcC1ncGlvcyIsIDApOwotCQlwZGF0YS0+ZG1pY19ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkicWNvbSxjZGMtZG1pYy1ncGlvcyIsIDApOwotCQlwZGF0YS0+ZXh0X3Nwa19ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkicWNvbSxjZGMtZXh0LXNway1ncGlvcyIsIDApOwotCX0KLQotCS8qCi0JICogUGFyc2UgVVMtRXVybyBncGlvIGluZm8gZnJvbSBEVC4gUmVwb3J0IG5vIGVycm9yIGlmIHVzLWV1cm8KLQkgKiBlbnRyeSBpcyBub3QgZm91bmQgaW4gRFQgZmlsZSBhcyBzb21lIHRhcmdldHMgZG8gbm90IHN1cHBvcnQKLQkgKiBVUy1FdXJvIGRldGVjdGlvbgotCSAqLwotCXBkYXRhLT51c19ldXJvX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgMCk7Ci0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT51c19ldXJvX2dwaW8pKQotCQlwZGF0YS0+dXNfZXVyb19ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgMCk7Ci0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT51c19ldXJvX2dwaW8pICYmICghcGRhdGEtPnVzX2V1cm9fZ3Bpb19wKSkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm9wZXJ0eSAlcyBub3QgZGV0ZWN0ZWQgaW4gbm9kZSAlcyIsCi0JCQkicWNvbSx1cy1ldXJvLWdwaW9zIiwgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgZGV0ZWN0ZWQiLAotCQkJInFjb20sdXMtZXVyby1ncGlvcyIpOwotCQltYmhjX2NmZy5zd2FwX2duZF9taWMgPSBtc21fc3dhcF9nbmRfbWljOwotCX0KLQotCXJldCA9IG1zbV9wcmVwYXJlX3VzX2V1cm8oY2FyZCk7Ci0JaWYgKHJldCkKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAibXNtX3ByZXBhcmVfdXNfZXVybyBmYWlsZWQgKCVkKVxuIiwKLQkJCXJldCk7Ci0KLQlpMnNfYXV4cGNtX2luaXQocGRldik7Ci0KLQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY2FyZCwgInFjb20sYXVkaW8tcm91dGluZyIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gbXNtX3BvcHVsYXRlX2RhaV9saW5rX2NvbXBvbmVudF9vZl9ub2RlKHBkYXRhLCBjYXJkKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmICghb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSx3c2EtZGlzYWJsZSIpKSB7Ci0JCXJldCA9IG1zbV9pbml0X3dzYV9kZXYocGRldiwgY2FyZCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKLQlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKLQkJaWYgKGNvZGVjX3JlZ19kb25lKSB7Ci0JCQkvKgotCQkJICogcmV0dXJuIGZhaWx1cmUgYXMgRUlOVkFMIHNpbmNlIG90aGVyIGNvZGVjCi0JCQkgKiByZWdpc3RlcmVkIHNvdW5kIGNhcmQgc3VjY2Vzc2Z1bGx5LgotCQkJICogVGhpcyBhdm9pZHMgYW55IGZ1cnRoZXIgcHJvYmUgY2FsbHMuCi0JCQkgKi8KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0KLQkJZ290byBlcnI7Ci0JfSBlbHNlIGlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChwZGF0YS0+c25kX2NhcmRfdmFsICE9IElOVF9TTkRfQ0FSRCkKLQkJbXNtX2V4dF9yZWdpc3Rlcl9hdWRpb19ub3RpZmllcihwZGV2KTsKLQotCXJldHVybiAwOwotZXJyOgotCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvID4gMCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBmcmVlIHVzX2V1cm8gZ3BpbyAlZFxuIiwKLQkJCV9fZnVuY19fLCBwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQkJcGRhdGEtPnVzX2V1cm9fZ3BpbyA9IDA7Ci0JfQotCWlmIChwZGF0YS0+aHBoX2VuMV9ncGlvID4gMCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcyBmcmVlIGhwaF9lbjFfZ3BpbyAlZFxuIiwKLQkJCV9fZnVuY19fLCBwZGF0YS0+aHBoX2VuMV9ncGlvKTsKLQkJZ3Bpb19mcmVlKHBkYXRhLT5ocGhfZW4xX2dwaW8pOwotCQlwZGF0YS0+aHBoX2VuMV9ncGlvID0gMDsKLQl9Ci0JaWYgKHBkYXRhLT5ocGhfZW4wX2dwaW8gPiAwKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGZyZWUgaHBoX2VuMF9ncGlvICVkXG4iLAotCQkJX19mdW5jX18sIHBkYXRhLT5ocGhfZW4wX2dwaW8pOwotCQlncGlvX2ZyZWUocGRhdGEtPmhwaF9lbjBfZ3Bpbyk7Ci0JCXBkYXRhLT5ocGhfZW4wX2dwaW8gPSAwOwotCX0KLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHBkYXRhKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX21hY2hpbmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCi0JaWYgKHBkYXRhLT5zbmRfY2FyZF92YWwgPT0gSU5UX1NORF9DQVJEKQotCQltdXRleF9kZXN0cm95KCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0KLQltc21fZnJlZV9hdXhkZXZfbWVtKHBkZXYpOwotCWdwaW9fZnJlZShwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQlncGlvX2ZyZWUocGRhdGEtPmhwaF9lbjFfZ3Bpbyk7Ci0JZ3Bpb19mcmVlKHBkYXRhLT5ocGhfZW4wX2dwaW8pOwotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZG02NjBfYXNvY19tYWNoaW5lX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IERSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBzZG02NjBfYXNvY19tYWNoaW5lX29mX21hdGNoLAotCX0sCi0JLnByb2JlID0gbXNtX2Fzb2NfbWFjaGluZV9wcm9iZSwKLQkucmVtb3ZlID0gbXNtX2Fzb2NfbWFjaGluZV9yZW1vdmUsCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZG02NjBfYXNvY19tYWNoaW5lX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQUxTQSBTb0MgbXNtIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2RtNjYwX2Fzb2NfbWFjaGluZV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1jb21tb24uaCBiL3NvdW5kL3NvYy9tc20vc2RtNjYwLWNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc4N2FlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vc2RtNjYwLWNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCi0gKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NU01fQ09NTU9OCi0jZGVmaW5lIF9fTVNNX0NPTU1PTgotCi0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkLW1iaGMtdjIuaCIKLQotI2RlZmluZSBTQU1QTElOR19SQVRFXzhLSFogICAgICA4MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haIDExMDI1Ci0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTZLSFogICAgIDE2MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFogIDIyMDUwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzJLSFogICAgIDMyMDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfNDRQMUtIWiAgIDQ0MTAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfNDhLSFogICAgIDQ4MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfODhQMktIWiAgIDg4MjAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfOTZLSFogICAgIDk2MDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFogIDE3NjQwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzE5MktIWiAgICAxOTIwMDAKLSNkZWZpbmUgU0FNUExJTkdfUkFURV8zNTJQOEtIWiAgMzUyODAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzg0S0haICAgIDM4NDAwMAotCi0jZGVmaW5lIFRETV9DSEFOTkVMX01BWCA4Ci0jZGVmaW5lIFRETV9TTE9UX09GRlNFVF9NQVggOAotCi1lbnVtIHsKLQlURE1fMCA9IDAsCi0JVERNXzEsCi0JVERNXzIsCi0JVERNXzMsCi0JVERNXzQsCi0JVERNXzUsCi0JVERNXzYsCi0JVERNXzcsCi0JVERNX1BPUlRfTUFYLAotfTsKLQotZW51bSB7Ci0JVERNX1BSSSA9IDAsCi0JVERNX1NFQywKLQlURE1fVEVSVCwKLQlURE1fUVVBVCwKLQlURE1fSU5URVJGQUNFX01BWCwKLX07Ci0KLXN0cnVjdCB0ZG1fcG9ydCB7Ci0JdTMyIG1vZGU7Ci0JdTMyIGNoYW5uZWw7Ci19OwotCi1lbnVtIHsKLQlESUdfQ0RDLAotCUFOQV9DREMsCi0JQ09ERUNTX01BWCwKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fY29tbW9uX3NuZF9jb250cm9sc1tdOwotZXh0ZXJuIGJvb2wgY29kZWNfcmVnX2RvbmU7Ci1zdHJ1Y3Qgc2RtNjYwX2NvZGVjIHsKLQl2b2lkKiAoKmdldF9hZmVfY29uZmlnX2ZuKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgZW51bSBhZmVfY29uZmlnX3R5cGUgY29uZmlnX3R5cGUpOwotfTsKLQotZW51bSB7Ci0JSU5UX1NORF9DQVJELAotCUVYVF9TTkRfQ0FSRF9UQVNIQSwKLQlFWFRfU05EX0NBUkRfVEFWSUwsCi19OwotCi1zdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhIHsKLQlpbnQgdXNfZXVyb19ncGlvOyAvKiB1c2VkIGJ5IGdwaW8gZHJpdmVyIEFQSSAqLwotCWludCBocGhfZW4xX2dwaW87Ci0JaW50IGhwaF9lbjBfZ3BpbzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnVzX2V1cm9fZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICpocGhfZW4xX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaHBoX2VuMF9ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBkbV9ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbXBfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICpkbWljX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXh0X3Nwa19ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IHNkbTY2MF9jb2RlYyBzZG02NjBfY29kZWNfZm47Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpjb2RlY19yb290OwotCWludCBzcGtfZXh0X3BhX2dwaW87Ci0JaW50IG1jbGtfZnJlcTsKLQlib29sIG5hdGl2ZV9jbGtfc2V0OwotCWludCBsYl9tb2RlOwotCWludCBzbmRfY2FyZF92YWw7Ci0JdTggbWljYmlhczFfY2FwX21vZGU7Ci0JdTggbWljYmlhczJfY2FwX21vZGU7Ci0JYXRvbWljX3QgaW50X21jbGswX3JzY19yZWY7Ci0JYXRvbWljX3QgaW50X21jbGswX2VuYWJsZWQ7Ci0Jc3RydWN0IG11dGV4IGNkY19pbnRfbWNsazBfbXV0ZXg7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkaXNhYmxlX2ludF9tY2xrMF93b3JrOwotCXN0cnVjdCBhZmVfY2xrX3NldCBkaWdpdGFsX2NkY19jb3JlX2NsazsKLX07Ci0KLWludCBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwotaW50IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKLXZvaWQgbXNtX2F1eF9wY21fc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKLWludCBtc21fbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7Ci12b2lkIG1zbV9taTJzX3NuZF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7Ci1pbnQgbXNtX2NvbW1vbl9zbmRfY29udHJvbHNfc2l6ZSh2b2lkKTsKLXZvaWQgbXNtX3NldF9jb2RlY19yZWdfZG9uZShib29sIGRvbmUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1leHQtZGFpLWxpbmtzLmMgYi9zb3VuZC9zb2MvbXNtL3NkbTY2MC1leHQtZGFpLWxpbmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTBmMzcuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9zZG02NjAtZXh0LWRhaS1saW5rcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0NiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbWZkL3djZDl4eHgvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgInFkc3A2djIvbXNtLXBjbS1yb3V0aW5nLXYyLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3djZDkzMzUuaCIKLSNpbmNsdWRlICJzZG02NjAtY29tbW9uLmgiCi0jaW5jbHVkZSAic2RtNjYwLWV4dGVybmFsLmgiCi0KLSNkZWZpbmUgREVWX05BTUVfU1RSX0xFTiAgICAgICAgICAgIDMyCi0jZGVmaW5lIF9fQ0hJUFNFVF9fICJTRE02NjAgIgotI2RlZmluZSBNU01fREFJTElOS19OQU1FKG5hbWUpIChfX0NISVBTRVRfXyNuYW1lKQotCi0jZGVmaW5lIFdDTl9DRENfU0xJTV9SWF9DSF9NQVggMgotI2RlZmluZSBXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYIDMKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX21zbV9jYXJkX3RhdmlsID0gewotCS5uYW1lID0gInNkbTY3MC10YXZpbC1zbmQtY2FyZCIsCi0JLmxhdGVfcHJvYmUgPSBtc21fc25kX2NhcmRfdGF2aWxfbGF0ZV9wcm9iZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfY2FyZF9tc21fY2FyZF90YXNoYSA9IHsKLQkubmFtZSA9ICJzZG02NzAtdGFzaGEtc25kLWNhcmQiLAotCS5sYXRlX3Byb2JlID0gbXNtX3NuZF9jYXJkX3Rhc2hhX2xhdGVfcHJvYmUsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9leHRfc2xpbWJ1c19iZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV9zbmRfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fZXh0X2NwZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV9zbmRfY3BlX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fZXh0X3NsaW1idXNfMl9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9taTJzX2JlX29wcyA9IHsKLQkuc3RhcnR1cCA9IG1zbV9taTJzX3NuZF9zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9taTJzX3NuZF9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2F1eF9wY21fYmVfb3BzID0gewotCS5zdGFydHVwID0gbXNtX2F1eF9wY21fc25kX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gbXNtX2F1eF9wY21fc25kX3NodXRkb3duLAotfTsKLQotc3RhdGljIGludCBtc21fd2NuX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQl1bnNpZ25lZCBpbnQgcnhfY2hbV0NOX0NEQ19TTElNX1JYX0NIX01BWF0gPSB7MTU3LCAxNTh9OwotCXVuc2lnbmVkIGludCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXSAgPSB7MTU5LCAxNjAsIDE2MX07Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQotCXJldHVybiBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoKSwKLQkJCQkJICAgdHhfY2gsIEFSUkFZX1NJWkUocnhfY2gpLCByeF9jaCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3djbl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCXUzMiByeF9jaFtXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYXSwgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF07Ci0JdTMyIHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7Ci0JaW50IHJldDsKLQotCWRldl9kYmcocnRkLT5kZXYsICIlczogJXNfdHhfZGFpX2lkXyVkXG4iLCBfX2Z1bmNfXywKLQkJIGNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCk7Ci0JcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkgJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBnZXQgQlRGTSBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCWRldl9kYmcocnRkLT5kZXYsICIlczogdHhfY2hfY250KCVkKSBpZCAlZFxuIiwKLQkJX19mdW5jX18sIHR4X2NoX2NudCwgZGFpX2xpbmstPmlkKTsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAotCQkJCQkgIHR4X2NoX2NudCwgdHhfY2gsIHJ4X2NoX2NudCwgcnhfY2gpOwotCWlmIChyZXQpCi0JCWRldl9lcnIocnRkLT5kZXYsICIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3djbl9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV93Y25faHdfcGFyYW1zLAotfTsKLQotLypURE0gZGVmYXVsdCBvZmZzZXQgY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBURE1fUlhfMCBhbmQgVERNX1RYXzAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGRtX3Nsb3Rfb2Zmc2V0W1RETV9QT1JUX01BWF1bVERNX1NMT1RfT0ZGU0VUX01BWF0gPSB7Ci0JezAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOH0sLyogVFhfMCB8IFJYXzAgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMSB8IFJYXzEgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMiB8IFJYXzIgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfMyB8IFJYXzMgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNCB8IFJYXzQgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNSB8IFJYXzUgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNiB8IFJYXzYgKi8KLQl7QUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRH0sLyogVFhfNyB8IFJYXzcgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdGRtX3BhcmFtX3NldF9zbG90X21hc2sodTE2IHBvcnRfaWQsIGludCBzbG90X3dpZHRoLAotCQkJCQkgICAgaW50IHNsb3RzKQotewotCXVuc2lnbmVkIGludCBzbG90X21hc2sgPSAwOwotCWludCBpLCBqOwotCXVuc2lnbmVkIGludCAqc2xvdF9vZmZzZXQ7Ci0KLQlmb3IgKGkgPSBURE1fMDsgaSA8IFRETV9QT1JUX01BWDsgaSsrKSB7Ci0JCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W2ldOwotCi0JCWZvciAoaiA9IDA7IGogPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBqKyspIHsKLQkJCWlmIChzbG90X29mZnNldFtqXSAhPSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEKQotCQkJCXNsb3RfbWFzayB8PQotCQkJCSgxIDw8ICgoc2xvdF9vZmZzZXRbal0gKiA4KSAvIHNsb3Rfd2lkdGgpKTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBzbG90X21hc2s7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3RkbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2hhbm5lbHMsIHNsb3Rfd2lkdGgsIHNsb3RzOwotCXVuc2lnbmVkIGludCBzbG90X21hc2s7Ci0JdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKLQlpbnQgb2Zmc2V0X2NoYW5uZWxzID0gMDsKLQlpbnQgaTsKLQotCXByX2RlYnVnKCIlczogZGFpIGlkID0gMHgleFxuIiwgX19mdW5jX18sIGNwdV9kYWktPmlkKTsKLQotCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0Jc3dpdGNoIChjaGFubmVscykgewotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNDoKLQljYXNlIDU6Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQljYXNlIDg6Ci0JCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCS8qCi0JCSAqIHVwIHRvIDggY2hhbm5lbHMgSFcgY29uZmlnIHNob3VsZAotCQkgKiB1c2UgMzIgYml0IHNsb3Qgd2lkdGggZm9yIG1heCBzdXBwb3J0IG9mCi0JCSAqIHN0cmVhbSBiaXQgd2lkdGguIChzbG90X3dpZHRoID4gYml0X3dpZHRoKQotCQkgKi8KLQkJCXNsb3Rfd2lkdGggPSAzMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBmb3JtYXQgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXNsb3RzID0gODsKLQkJc2xvdF9tYXNrID0gdGRtX3BhcmFtX3NldF9zbG90X21hc2soY3B1X2RhaS0+aWQsCi0JCQkJCQkgICAgc2xvdF93aWR0aCwKLQkJCQkJCSAgICBzbG90cyk7Ci0JCWlmICghc2xvdF9tYXNrKSB7Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHNsb3RfbWFzayAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBzbG90X21hc2spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwYXJhbSBjaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0aW5nIFRETV9SWF8wIGFuZCBURE1fVFhfMCAqLwotCXN3aXRjaCAoY3B1X2RhaS0+aWQpIHsKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fVFg6Ci0JCXNsb3Rfb2Zmc2V0ID0gdGRtX3Nsb3Rfb2Zmc2V0W1RETV8wXTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogZGFpIGlkIDB4JXggbm90IHN1cHBvcnRlZFxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBURE1fU0xPVF9PRkZTRVRfTUFYOyBpKyspIHsKLQkJaWYgKHNsb3Rfb2Zmc2V0W2ldICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCi0JCQlvZmZzZXRfY2hhbm5lbHMrKzsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKG9mZnNldF9jaGFubmVscyA9PSAwKSB7Ci0JCXByX2VycigiJXM6IHNsb3Qgb2Zmc2V0IG5vdCBzdXBwb3J0ZWQsIG9mZnNldF9jaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBvZmZzZXRfY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY2hhbm5lbHMgPiBvZmZzZXRfY2hhbm5lbHMpIHsKLQkJcHJfZXJyKCIlczogY2hhbm5lbHMgJWQgZXhjZWVkIG9mZnNldF9jaGFubmVscyAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGFubmVscywgb2Zmc2V0X2NoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIDAsIHNsb3RfbWFzaywKLQkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIDAsIE5VTEwsCi0JCQkJCQkgIGNoYW5uZWxzLCBzbG90X29mZnNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjcHVfZGFpLCBzbG90X21hc2ssIDAsCi0JCQkJCSAgICAgICBzbG90cywgc2xvdF93aWR0aCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IHRkbSBzbG90LCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCi0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCBjaGFubmVscywKLQkJCQkJCSAgc2xvdF9vZmZzZXQsIDAsIE5VTEwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjaGFubmVsIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fdGRtX2JlX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gbXNtX3RkbV9zbmRfaHdfcGFyYW1zCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2V4dF90YXNoYV9mZV9kYWlbXSA9IHsKLQkvKiB0YXNoYV92aWZlZWRiYWNrIGZvciBzcGVha2VyIHByb3RlY3Rpb24gKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdmlmZWVkYmFjayIsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogVWx0cmFzb3VuZCBSWCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfcngyIiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfMl9iZV9vcHMsCi0JfSwKLQkvKiBVbHRyYXNvdW5kIFRYIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfdHgyIiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzLAotCX0sCi0JLyogQ1BFIExTTSBkaXJlY3QgZGFpLWxpbmsgKi8KLQl7Ci0JCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJDUEUgTGlzdGVuIEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktc2xpbSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtIiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9tYWQxIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkub3BzID0gJm1zbV9leHRfY3BlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU182IEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNiBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzZfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JLyogQ1BFIExTTSBFQyBQUCBkaXJlY3QgZGFpLWxpbmsgKi8KLQl7Ci0JCS5uYW1lID0gIkNQRSBMaXN0ZW4gc2VydmljZSBFQ1BQIiwKLQkJLnN0cmVhbV9uYW1lID0gIkNQRSBMaXN0ZW4gQXVkaW8gU2VydmljZSBFQ1BQIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJDUEVfTFNNX05PSE9TVCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1jcGUtbHNtLjMiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX2NwZSIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfdGF2aWxfZmVfZGFpW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkzIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3ZpZmVlZGJhY2siLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIFVsdHJhc291bmQgUlggREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gIlNMSU1CVVNfMiBIb3N0bGVzcyBQbGF5YmFjayIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MiIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzLAotCX0sCi0JLyogVWx0cmFzb3VuZCBUWCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MiIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzXzJfYmVfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2V4dF90YXNoYV9iZV9kYWlbXSA9IHsKLQkvKiBCYWNrZW5kIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21peF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18xX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czEgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg2IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18zX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkwIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGFzaGFfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGFzaGFfbWl4X3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2V4dF9zbGltYnVzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzRfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXNoYV9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXNoYV9taXhfcngxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIE1BRCBCRSAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX21hZDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNl9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM2IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhc2hhX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhc2hhX3J4NCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfdGF2aWxfYmVfZGFpW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg0IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcngxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQkJLmluaXQgPSAmbXNtX2F1ZHJ4X2luaXQsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF90eDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzFfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18yX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czIgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcngyIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzMyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfcngxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9leHRfc2xpbWJ1c19iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIE1BRCBCRSAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzVfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX21hZDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNl9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM2IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4NCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fZXh0X3NsaW1idXNfYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfY29tbW9uX2ZlX2RhaVtdID0gewotCS8qIEZyb250RW5kIERBSSBMaW5rcyAqLwotCXsvKiBodzp4LDAgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3AuMCIsCi0JCS5keW5hbWljID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMQotCX0sCi0Jey8qIGh3OngsMSAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTWVkaWEyKSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWEyIiwKLQkJLmNwdV9kYWlfbmFtZSAgID0gIk11bHRpTWVkaWEyIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTIsCi0JfSwKLQl7LyogaHc6eCwyICovCi0JCS5uYW1lID0gIlZvaWNlTU1vZGUxIiwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUxIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLAotCX0sCi0Jey8qIGh3OngsMyAqLwotCQkubmFtZSA9ICJNU00gVm9JUCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb0lQIiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJWb0lQIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS12b2lwLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lQLAotCX0sCi0Jey8qIGh3OngsNCAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMKSwKLQkJLnN0cmVhbV9uYW1lID0gIlVMTCIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTMiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3AuMiIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEzLAotCX0sCi0JLyogSG9zdGxlc3MgUENNIHB1cnBvc2UgKi8KLQl7LyogaHc6eCw1ICovCi0JCS5uYW1lID0gIlNMSU1CVVNfMCBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzAgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMwX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUJPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiBUaGlzIGRhaSBsaW5rIGhhcyBNSTJTIHN1cHBvcnQgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCw2ICovCi0JCS5uYW1lID0gIk1TTSBBRkUtUENNIFJYIiwKLQkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBSWCIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQxIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWFmZSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7LyogaHc6eCw3ICovCi0JCS5uYW1lID0gIk1TTSBBRkUtUENNIFRYIiwKLQkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBUWCIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQwIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWFmZSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7LyogaHc6eCw4ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczEpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MxIiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhNCIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19IV19QQVJBTVMsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LAotCX0sCi0Jey8qIGh3OngsOSovCi0JCS5uYW1lID0gIkFVWFBDTSBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJBVVhQQ00gSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lICAgPSAiQVVYUENNX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCwxMCAqLwotCQkubmFtZSA9ICJTTElNQlVTXzEgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTMV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDExICovCi0JCS5uYW1lID0gIlNMSU1CVVNfMyBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTTElNQlVTXzMgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVMzX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsIC8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMTIgKi8KLQkJLm5hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNCBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzRfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwgLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCwxMyAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTG93TGF0ZW5jeSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSIsCi0JCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhNSIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4xIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKLQl9LAotCS8qIExTTSBGRSAqLwotCXsvKiBodzp4LDE0ICovCi0JCS5uYW1lID0gIkxpc3RlbiAxIEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9MU00xLAotCX0sCi0Jey8qIGh3OngsMTUgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczIiLAotCQkuY3B1X2RhaV9uYW1lICAgPSAiTXVsdGlNZWRpYTciLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCi0JfSwKLQl7LyogaHc6eCwxNiAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTXVsdGlNZWRpYTEwKSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExMCIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEwIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAotCX0sCi0Jey8qIGh3OngsMTcgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTF9OT0lSUSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNTV9OT0lSUSIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTgiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwKLQl9LAotCXsvKiBodzp4LDE4ICovCi0JCS5uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAotCQkuc3RyZWFtX25hbWUgPSAiSERNSV9SWF9IT1NUTEVTUyIsCi0JCS5jcHVfZGFpX25hbWUJPSAiSERNSV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDE5ICovCi0JCS5uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAotCX0sCi0Jey8qIGh3OngsMjAgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU00yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCi0JfSwKLQl7LyogaHc6eCwyMSAqLwotCQkubmFtZSA9ICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMywKLQl9LAotCXsvKiBodzp4LDIyICovCi0JCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9MU000LAotCX0sCi0Jey8qIGh3OngsMjMgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNSBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU001IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCi0JfSwKLQl7LyogaHc6eCwyNCAqLwotCQkubmFtZSA9ICJMaXN0ZW4gNiBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNgotCX0sCi0Jey8qIGh3OngsMjUgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU003IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCi0JfSwKLQl7LyogaHc6eCwyNiAqLwotCQkubmFtZSA9ICJMaXN0ZW4gOCBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNOCwKLQl9LAotCXsvKiBodzp4LDI3ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTkpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkiLAotCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWE5IiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwKLQl9LAotCXsvKiBodzp4LDI4ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczQpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M0IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTEiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwKLQl9LAotCXsvKiBodzp4LDI5ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczUpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTIiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwKLQl9LAotCXsvKiBodzp4LDMwICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczYpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M2IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTMiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywKLQl9LAotCXsvKiBodzp4LDMxICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczcpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M3IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTQiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwKLQl9LAotCXsvKiBodzp4LDMyICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczgpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTUiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwKLQl9LAotCXsvKiBodzp4LDMzICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTExfTk9JUlFfMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJNTV9OT0lSUV8yIiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTYiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsCi0JfSwKLQl7LyogaHc6eCwzNCAqLwotCQkubmFtZSA9ICJTTElNQlVTXzggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMzUgKi8KLQkJLm5hbWUgPSAiU0xJTUJVUzcgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzcgSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVM3X0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDM2ICovCi0JCS5uYW1lID0gIlNETTY2MCBIRlAgVFgiLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTYiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE2IiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tbG9vcGJhY2siLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfY29tbW9uX2JlX2RhaVtdID0gewotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBJbmNhbGwgUmVjb3JkIFVwbGluayBCQUNLIEVORCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9JTkNBTExfUkVDT1JEX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgVXBsaW5rIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgICAgID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBJbmNhbGwgUmVjb3JkIERvd25saW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBEb3dubGluayBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfSU5DQUxMX1JFQ09SRF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBJbmNhbGwgTXVzaWMgMiBCQUNLIEVORCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9WT0lDRTJfUExBWUJBQ0tfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZTIgRmFyZW5kIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1VTQl9BVURJT19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjg2NzIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9VU0JfQVVESU9fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjg2NzMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVVNCX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9UWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODY1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fVFhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19URE1fUlhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg4MCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9UWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9URE1fUlhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk2IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9URE1fVFhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4OTciLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9URE1fVFhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fbWkyc19iZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfTUkyU19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfTUkyU19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlRlcnRpYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX01JMlNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IE1JMlMgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2F1eHBjbV9iZV9kYWlfbGlua3NbXSA9IHsKLQkvKiBQcmltYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCS8qIFNlY29uZGFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX0FVWFBDTV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBUZXJ0aWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0IEFVWCBQQ00gQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBRdWF0ZXJuYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCi0JCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKLQkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KLQkJICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3djbl9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk5IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAotCQkuY29kZWNfZGFpX25hbWUgPSAiYnRmbV9idF9zY29fc2xpbV90eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV93Y25fb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfOF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM4IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2NDAxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAotCQkuY29kZWNfZGFpX25hbWUgPSAiYnRmbV9mbV9zbGltX3R4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pbml0ID0gJm1zbV93Y25faW5pdCwKLQkJLm9wcyA9ICZtc21fd2NuX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV4dF9kaXNwX2JlX2RhaV9saW5rW10gPSB7Ci0JLyogRElTUCBQT1JUIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0RJU1BMQVlfUE9SVCwKLQkJLnN0cmVhbV9uYW1lID0gIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kcC4yNDYwOCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1leHQtZGlzcC1hdWRpby1jb2RlYy1yeCIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc21fZHBfYXVkaW9fY29kZWNfcnhfZGFpIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9leHRfdGFzaGFfZGFpX2xpbmtzWwotQVJSQVlfU0laRShtc21fZXh0X2NvbW1vbl9mZV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX2V4dF90YXNoYV9mZV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX2V4dF9jb21tb25fYmVfZGFpKSArCi1BUlJBWV9TSVpFKG1zbV9leHRfdGFzaGFfYmVfZGFpKSArCi1BUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcykgKwotQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcykgKwotQVJSQVlfU0laRShtc21fd2NuX2JlX2RhaV9saW5rcykgKwotQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluayldOwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2V4dF90YXZpbF9kYWlfbGlua3NbCi1BUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2ZlX2RhaSkgKwotQVJSQVlfU0laRShtc21fZXh0X3RhdmlsX2ZlX2RhaSkgKwotQVJSQVlfU0laRShtc21fZXh0X2NvbW1vbl9iZV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX2V4dF90YXZpbF9iZV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCi1BUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSArCi1BUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKSArCi1BUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKV07Ci0KLS8qKgotICogcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3MgLSBwcmVwYXJlcyBkYWlsaW5rIGFycmF5IGFuZCBpbml0aWFsaXplcyBjYXJkLgotICoKLSAqIEBkZXY6IGRldmljZSBoYW5kbGUKLSAqCi0gKiBSZXR1cm5zIGNhcmQgb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCi0gKi8KLXN0cnVjdCBzbmRfc29jX2NhcmQgKnBvcHVsYXRlX3NuZF9jYXJkX2RhaWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCWludCBzbmRfY2FyZF92YWwpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbXNtX2V4dF9kYWlfbGlua3MgPSBOVUxMOwotCWludCByZXQsIGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQ7Ci0JZW51bSBjb2RlY192YXJpYW50IGNvZGVjX3ZlciA9IDA7Ci0KLQlpZiAoc25kX2NhcmRfdmFsID09IEVYVF9TTkRfQ0FSRF9UQVNIQSkgewotCQljYXJkID0gJnNuZF9zb2NfY2FyZF9tc21fY2FyZF90YXNoYTsKLQl9IGVsc2UgaWYgKHNuZF9jYXJkX3ZhbCA9PSBFWFRfU05EX0NBUkRfVEFWSUwpIHsKLQkJY2FyZCA9ICZzbmRfc29jX2NhcmRfbXNtX2NhcmRfdGF2aWw7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYsICIlczogZmFpbGluZyBhcyBubyBtYXRjaGluZyBjYXJkIG5hbWVcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNhcmQtPmRldiA9IGRldjsKLQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAicWNvbSxtb2RlbCIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICIlczogcGFyc2UgY2FyZCBuYW1lIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmIChzdHJuc3RyKGNhcmQtPm5hbWUsICJ0YXNoYSIsIHN0cmxlbihjYXJkLT5uYW1lKSkpIHsKLQkJY29kZWNfdmVyID0gdGFzaGFfY29kZWNfdmVyKCk7Ci0JCWlmIChjb2RlY192ZXIgPT0gV0NEOTMyNikKLQkJCWNhcmQtPm5hbWUgPSAic2RtNjYwLXRhc2hhbGl0ZS1zbmQtY2FyZCI7Ci0KLQkJbGVuMSA9IEFSUkFZX1NJWkUobXNtX2V4dF9jb21tb25fZmVfZGFpKTsKLQkJbGVuMiA9IGxlbjEgKyBBUlJBWV9TSVpFKG1zbV9leHRfdGFzaGFfZmVfZGFpKTsKLQkJbGVuMyA9IGxlbjIgKyBBUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2JlX2RhaSk7Ci0JCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcywgbXNtX2V4dF9jb21tb25fZmVfZGFpLAotCQkgICAgICAgc2l6ZW9mKG1zbV9leHRfY29tbW9uX2ZlX2RhaSkpOwotCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW4xLAotCQkgICAgICAgbXNtX2V4dF90YXNoYV9mZV9kYWksIHNpemVvZihtc21fZXh0X3Rhc2hhX2ZlX2RhaSkpOwotCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW4yLAotCQkgICAgICAgbXNtX2V4dF9jb21tb25fYmVfZGFpLCBzaXplb2YobXNtX2V4dF9jb21tb25fYmVfZGFpKSk7Ci0JCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcyArIGxlbjMsCi0JCSAgICAgICBtc21fZXh0X3Rhc2hhX2JlX2RhaSwgc2l6ZW9mKG1zbV9leHRfdGFzaGFfYmVfZGFpKSk7Ci0JCWxlbjQgPSBsZW4zICsgQVJSQVlfU0laRShtc21fZXh0X3Rhc2hhX2JlX2RhaSk7Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLG1pMnMtYXVkaW8taW50ZiIpKSB7Ci0JCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW40LAotCQkJICAgICAgIG1zbV9taTJzX2JlX2RhaV9saW5rcywKLQkJCSAgICAgICBzaXplb2YobXNtX21pMnNfYmVfZGFpX2xpbmtzKSk7Ci0JCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7Ci0JCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW40LAotCQkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAotCQkJICAgICAgIHNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOwotCQkJbGVuNCArPSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgInFjb20sd2NuLWJ0Zm0iKSkgewotCQkJZGV2X2RiZyhkZXYsICIlcygpOiBXQ04gQlRGTSBzdXBwb3J0IHByZXNlbnRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fZXh0X3Rhc2hhX2RhaV9saW5rcyArIGxlbjQsCi0JCQkJICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCi0JCQkJICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7Ci0JCQlsZW40ICs9IEFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpOwotCQl9Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4IikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogZXh0IGRpc3AgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQltZW1jcHkobXNtX2V4dF90YXNoYV9kYWlfbGlua3MgKyBsZW40LAotCQkJCWV4dF9kaXNwX2JlX2RhaV9saW5rLAotCQkJCXNpemVvZihleHRfZGlzcF9iZV9kYWlfbGluaykpOwotCQkJbGVuNCArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKLQkJfQotCQltc21fZXh0X2RhaV9saW5rcyA9IG1zbV9leHRfdGFzaGFfZGFpX2xpbmtzOwotCX0gZWxzZSBpZiAoc3RybnN0cihjYXJkLT5uYW1lLCAidGF2aWwiLCBzdHJsZW4oY2FyZC0+bmFtZSkpKSB7Ci0JCWxlbjEgPSBBUlJBWV9TSVpFKG1zbV9leHRfY29tbW9uX2ZlX2RhaSk7Ci0JCWxlbjIgPSBsZW4xICsgQVJSQVlfU0laRShtc21fZXh0X3RhdmlsX2ZlX2RhaSk7Ci0JCWxlbjMgPSBsZW4yICsgQVJSQVlfU0laRShtc21fZXh0X2NvbW1vbl9iZV9kYWkpOwotCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MsIG1zbV9leHRfY29tbW9uX2ZlX2RhaSwKLQkJICAgICAgIHNpemVvZihtc21fZXh0X2NvbW1vbl9mZV9kYWkpKTsKLQkJbWVtY3B5KG1zbV9leHRfdGF2aWxfZGFpX2xpbmtzICsgbGVuMSwKLQkJICAgICAgIG1zbV9leHRfdGF2aWxfZmVfZGFpLCBzaXplb2YobXNtX2V4dF90YXZpbF9mZV9kYWkpKTsKLQkJbWVtY3B5KG1zbV9leHRfdGF2aWxfZGFpX2xpbmtzICsgbGVuMiwKLQkJICAgICAgIG1zbV9leHRfY29tbW9uX2JlX2RhaSwgc2l6ZW9mKG1zbV9leHRfY29tbW9uX2JlX2RhaSkpOwotCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW4zLAotCQkgICAgICAgbXNtX2V4dF90YXZpbF9iZV9kYWksIHNpemVvZihtc21fZXh0X3RhdmlsX2JlX2RhaSkpOwotCQlsZW40ID0gbGVuMyArIEFSUkFZX1NJWkUobXNtX2V4dF90YXZpbF9iZV9kYWkpOwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxtaTJzLWF1ZGlvLWludGYiKSkgewotCQkJbWVtY3B5KG1zbV9leHRfdGF2aWxfZGFpX2xpbmtzICsgbGVuNCwKLQkJCSAgICAgICBtc21fbWkyc19iZV9kYWlfbGlua3MsCi0JCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOwotCQkJbGVuNCArPSBBUlJBWV9TSVpFKG1zbV9taTJzX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCi0JCQkJCSAgInFjb20sYXV4cGNtLWF1ZGlvLWludGYiKSkgewotCQkJbWVtY3B5KG1zbV9leHRfdGF2aWxfZGFpX2xpbmtzICsgbGVuNCwKLQkJCSAgICAgICBtc21fYXV4cGNtX2JlX2RhaV9saW5rcywKLQkJCSAgICAgICBzaXplb2YobXNtX2F1eHBjbV9iZV9kYWlfbGlua3MpKTsKLQkJCWxlbjQgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLHdjbi1idGZtIikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQltZW1jcHkobXNtX2V4dF90YXZpbF9kYWlfbGlua3MgKyBsZW40LAotCQkJCSAgIG1zbV93Y25fYmVfZGFpX2xpbmtzLAotCQkJCSAgIHNpemVvZihtc21fd2NuX2JlX2RhaV9saW5rcykpOwotCQkJbGVuNCArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxleHQtZGlzcC1hdWRpby1yeCIpKSB7Ci0JCQlkZXZfZGJnKGRldiwgIiVzKCk6IGV4dCBkaXNwIGF1ZGlvIHN1cHBvcnQgcHJlc2VudFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJbWVtY3B5KG1zbV9leHRfdGF2aWxfZGFpX2xpbmtzICsgbGVuNCwKLQkJCQlleHRfZGlzcF9iZV9kYWlfbGluaywKLQkJCQlzaXplb2YoZXh0X2Rpc3BfYmVfZGFpX2xpbmspKTsKLQkJCWxlbjQgKz0gQVJSQVlfU0laRShleHRfZGlzcF9iZV9kYWlfbGluayk7Ci0JCX0KLQkJbXNtX2V4dF9kYWlfbGlua3MgPSBtc21fZXh0X3RhdmlsX2RhaV9saW5rczsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsaW5nIGFzIG5vIG1hdGNoaW5nIGNhcmQgbmFtZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNhcmQtPmRhaV9saW5rID0gbXNtX2V4dF9kYWlfbGlua3M7Ci0JY2FyZC0+bnVtX2xpbmtzID0gbGVuNDsKLQotCXJldHVybiBjYXJkOwotfQotRVhQT1JUX1NZTUJPTChwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1leHRlcm5hbC5jIGIvc291bmQvc29jL21zbS9zZG02NjAtZXh0ZXJuYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmOWU1OC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1leHRlcm5hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3E2Y29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaD4KLSNpbmNsdWRlICJxZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oIgotI2luY2x1ZGUgInNkbTY2MC1jb21tb24uaCIKLSNpbmNsdWRlICJzZG02NjAtZXh0ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTMzNS5oIgotI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LW1iaGMuaCIKLQotI2RlZmluZSBTRE02NjBfU1BLX09OICAgICAxCi0jZGVmaW5lIFNETTY2MF9TUEtfT0ZGICAgIDAKLQotI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX0JVVFRPTlMgICAgOAotI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyAgICAgNQotI2RlZmluZSBDT0RFQ19FWFRfQ0xLX1JBVEUgICAgICAgICAgOTYwMDAwMAotI2RlZmluZSBBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMgMzAwMAotCi0jZGVmaW5lIFdTQTg4MTBfTkFNRV8xICJ3c2E4ODF4LjIwMTcwMjExIgotI2RlZmluZSBXU0E4ODEwX05BTUVfMiAid3NhODgxeC4yMDE3MDIxMiIKLQotc3RhdGljIGludCBtc21fZXh0X3Nwa19jb250cm9sID0gMTsKLXN0YXRpYyBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICp3Y2RfbWJoY19jZmdfcHRyOwotCi1zdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyB7Ci0Jdm9pZCogKCpnZXRfYWZlX2NvbmZpZ19mbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKLQl2b2lkICgqbWJoY19oc19kZXRlY3RfZXhpdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyBtc21fY29kZWNfZm47Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc3BkZXY7Ci0KLXN0YXRpYyBib29sIGlzX2luaXRpYWxfYm9vdDsKLQotc3RhdGljIHZvaWQgKmRlZl9leHRfbWJoY19jYWwodm9pZCk7Ci0KLWVudW0gewotCVNMSU1fUlhfMCA9IDAsCi0JU0xJTV9SWF8xLAotCVNMSU1fUlhfMiwKLQlTTElNX1JYXzMsCi0JU0xJTV9SWF80LAotCVNMSU1fUlhfNSwKLQlTTElNX1JYXzYsCi0JU0xJTV9SWF83LAotCVNMSU1fUlhfTUFYLAotfTsKLQotZW51bSB7Ci0JU0xJTV9UWF8wID0gMCwKLQlTTElNX1RYXzEsCi0JU0xJTV9UWF8yLAotCVNMSU1fVFhfMywKLQlTTElNX1RYXzQsCi0JU0xJTV9UWF81LAotCVNMSU1fVFhfNiwKLQlTTElNX1RYXzcsCi0JU0xJTV9UWF84LAotCVNMSU1fVFhfTUFYLAotfTsKLQotc3RydWN0IGRldl9jb25maWcgewotCXUzMiBzYW1wbGVfcmF0ZTsKLQl1MzIgYml0X2Zvcm1hdDsKLQl1MzIgY2hhbm5lbHM7Ci19OwotCi0vKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2Ygc2xpbWJ1cyBjaGFubmVscyAqLwotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fcnhfY2ZnW10gPSB7Ci0JW1NMSU1fUlhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fdHhfY2ZnW10gPSB7Ci0JW1NMSU1fVFhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2ggPSAyOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fcnhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xpbV90eF9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCQkiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLAotCQkJCQkJIkVpZ2h0In07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmlfZmVlZF9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28ifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICpiaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMjRfM0xFIiwKLQkJCQkJICAiUzMyX0xFIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqc2xpbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCi0JCQkJCSJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKLQkJCQkJIktIWl84OFAyIiwgIktIWl85NiIsICJLSFpfMTc2UDQiLAotCQkJCQkiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNwa19mdW5jdGlvbl90ZXh0W10gPSB7Ik9mZiIsICJPbiJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmJ0X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwgIktIWl80OCJ9OwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNwa19mdW5jX2VuLCBzcGtfZnVuY3Rpb25fdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMl9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF90eF9jaHMsIHNsaW1fdHhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMV90eF9jaHMsIHNsaW1fdHhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHZpX2ZlZWRfdHhfY2hzLCB2aV9mZWVkX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzZfcnhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMl9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYnRfc2FtcGxlX3JhdGUsIGJ0X3NhbXBsZV9yYXRlX3RleHQpOwotCi1zdGF0aWMgaW50IHNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0KLQlzd2l0Y2ggKHNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAyOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xOTJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zNTJQOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM4NEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOwotfQotCi1zdGF0aWMgaW50IHNsaW1fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGUgPSAwOwotCi0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDc6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOwotCQlicmVhazsKLQljYXNlIDk6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxMDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlOwotfQotCi1zdGF0aWMgaW50IHNsaW1fZ2V0X2JpdF9mb3JtYXRfdmFsKGludCBiaXRfZm9ybWF0KQotewotCWludCB2YWwgPSAwOwotCi0Jc3dpdGNoIChiaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJdmFsID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCXZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9nZXRfYml0X2Zvcm1hdChpbnQgdmFsKQotewotCWludCBiaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0KLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgMDoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGJpdF9mbXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCi17Ci0JaW50IHBvcnRfaWQgPSAwOwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzBfUlgiLCBzaXplb2YoIlNMSU1fMF9SWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fUlhfMDsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8yX1JYIiwgc2l6ZW9mKCJTTElNXzJfUlgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1JYXzI7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fNV9SWCIsIHNpemVvZigiU0xJTV81X1JYIikpKQotCQlwb3J0X2lkID0gU0xJTV9SWF81OwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzZfUlgiLCBzaXplb2YoIlNMSU1fNl9SWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fUlhfNjsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8wX1RYIiwgc2l6ZW9mKCJTTElNXzBfVFgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1RYXzA7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMV9UWCIsIHNpemVvZigiU0xJTV8xX1RYIikpKQotCQlwb3J0X2lkID0gU0xJTV9UWF8xOwotCWVsc2UgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjaGFubmVsOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcG9ydF9pZDsKLX0KLQotc3RhdGljIGludCBtc21fYnRfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JLyoKLQkgKiBTbGltYnVzXzdfUngvVHggc2FtcGxlIHJhdGUgdmFsdWVzIHNob3VsZCBhbHdheXMgYmUgaW4gc3luYyAoc2FtZSkKLQkgKiB3aGVuIHVzZWQgZm9yIEJUX1NDTyB1c2UgY2FzZS4gUmV0dXJuIGVpdGhlciBSeCBvciBUeCBzYW1wbGUgcmF0ZQotCSAqIHZhbHVlLgotCSAqLwotCXN3aXRjaCAoc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZSA9ICVkIiwgX19mdW5jX18sCi0JCSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAxOgotCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCXNsaW1fdHhfY2ZnW1NMSU1fVFhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJc2xpbV9yeF9jZmdbU0xJTV9SWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGVzOiBzbGltN19yeCA9ICVkLCBzbGltN190eCA9ICVkLCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sCi0JCSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlLAotCQkgc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCXNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0Jc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9Ci0JCXNsaW1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgc2FtcGxlX3JhdGUgPSAwOwotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNhbXBsZV9yYXRlID0gc2xpbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JaWYgKHNhbXBsZV9yYXRlID09IFNBTVBMSU5HX1JBVEVfNDRQMUtIWikgewotCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZDogZm9yIFR4IHBhdGhcbiIsCi0JCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9iaXRfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQkJc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0Jc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0ID0KLQkJc2xpbV9nZXRfYml0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCQlzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fdHhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQotCQlzbGltX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV90eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV92aV9mZWVkX3R4X2NoIC0gMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCW1zbV92aV9mZWVkX3R4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOwotCi0JcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgbXNtX3ZpX2ZlZWRfdHhfY2gpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCAqZGVmX2V4dF9tYmhjX2NhbCh2b2lkKQotewotCXZvaWQgKndjZF9tYmhjX2NhbDsKLQlzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7Ci0JdTE2ICpidG5faGlnaDsKLQotCXdjZF9tYmhjX2NhbCA9IGt6YWxsb2MoV0NEX01CSENfQ0FMX1NJWkUoV0NEX01CSENfREVGX0JVVFRPTlMsCi0JCQkJV0NEOVhYWF9NQkhDX0RFRl9STE9BRFMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdjZF9tYmhjX2NhbCkKLQkJcmV0dXJuIE5VTEw7Ci0KLSNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9QTFVHX1RZUEVfUFRSKHdjZF9tYmhjX2NhbCktPlgpID0gKFkpKQotCVModl9oc19tYXgsIDE2MDApOwotI3VuZGVmIFMKLSNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih3Y2RfbWJoY19jYWwpLT5YKSA9IChZKSkKLQlTKG51bV9idG4sIFdDRF9NQkhDX0RFRl9CVVRUT05TKTsKLSN1bmRlZiBTCi0KLQlidG5fY2ZnID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKHdjZF9tYmhjX2NhbCk7Ci0JYnRuX2hpZ2ggPSAoKHZvaWQgKikmYnRuX2NmZy0+X3ZfYnRuX2xvdykgKwotCQkoc2l6ZW9mKGJ0bl9jZmctPl92X2J0bl9sb3dbMF0pICogYnRuX2NmZy0+bnVtX2J0bik7Ci0KLQlidG5faGlnaFswXSA9IDc1OwotCWJ0bl9oaWdoWzFdID0gMTUwOwotCWJ0bl9oaWdoWzJdID0gMjM3OwotCWJ0bl9oaWdoWzNdID0gNTAwOwotCWJ0bl9oaWdoWzRdID0gNTAwOwotCWJ0bl9oaWdoWzVdID0gNTAwOwotCWJ0bl9oaWdoWzZdID0gNTAwOwotCWJ0bl9oaWdoWzddID0gNTAwOwotCi0JcmV0dXJuIHdjZF9tYmhjX2NhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcGFyYW1faXNfbWFzayhpbnQgcCkKLXsKLQlyZXR1cm4gKHAgPj0gU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0spICYmCi0JCShwIDw9IFNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfbWFzayAqcGFyYW1fdG9fbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsIGludCBuKQotewotCXJldHVybiAmKHAtPm1hc2tzW24gLSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10pOwotfQotCi0KLXN0YXRpYyB2b2lkIG1zbV9leHRfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCi0JcHJfZGVidWcoIiVzOiBtc21fZXh0X3Nwa19jb250cm9sID0gJWQiLCBfX2Z1bmNfXywgbXNtX2V4dF9zcGtfY29udHJvbCk7Ci0JaWYgKG1zbV9leHRfc3BrX2NvbnRyb2wgPT0gU0RNNjYwX1NQS19PTikgewotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8xIGFtcCIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8zIGFtcCIpOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZW91dF8xIGFtcCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMyBhbXAiKTsKLQl9Ci0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9nZXRfc3BrKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JcHJfZGVidWcoIiVzOiBtc21fZXh0X3Nwa19jb250cm9sID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgbXNtX2V4dF9zcGtfY29udHJvbCk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBtc21fZXh0X3Nwa19jb250cm9sOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9leHRfc2V0X3NwayhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JcHJfZGVidWcoIiVzKClcbiIsIF9fZnVuY19fKTsKLQlpZiAobXNtX2V4dF9zcGtfY29udHJvbCA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJcmV0dXJuIDA7Ci0KLQltc21fZXh0X3Nwa19jb250cm9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07Ci0JbXNtX2V4dF9jb250cm9sKGNvZGVjKTsKLQlyZXR1cm4gMTsKLX0KLQotCi1pbnQgbXNtX2V4dF9lbmFibGVfY29kZWNfbWNsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBlbmFibGUsCi0JCQkgICAgICBib29sIGRhcG0pCi17Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlczogZW5hYmxlID0gJWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOwotCi0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWMtPmRldiksICJ0YXNoYV9jb2RlYyIpKQotCQlyZXQgPSB0YXNoYV9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSwgZGFwbSk7Ci0JZWxzZSBpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlYy0+ZGV2KSwgInRhdmlsX2NvZGVjIikpCi0JCXJldCA9IHRhdmlsX2NkY19tY2xrX2VuYWJsZShjb2RlYywgZW5hYmxlKTsKLQllbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtc21fc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJTcGVha2VyIEZ1bmN0aW9uIiwgc3BrX2Z1bmNfZW4sIG1zbV9leHRfZ2V0X3NwaywKLQkJCW1zbV9leHRfc2V0X3NwayksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfUlggQ2hhbm5lbHMiLCBzbGltXzBfcnhfY2hzLAotCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIENoYW5uZWxzIiwgc2xpbV8yX3J4X2NocywKLQkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBDaGFubmVscyIsIHNsaW1fMF90eF9jaHMsCi0JCQltc21fc2xpbV90eF9jaF9nZXQsIG1zbV9zbGltX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzFfVFggQ2hhbm5lbHMiLCBzbGltXzFfdHhfY2hzLAotCQkJbXNtX3NsaW1fdHhfY2hfZ2V0LCBtc21fc2xpbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIENoYW5uZWxzIiwgc2xpbV81X3J4X2NocywKLQkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBDaGFubmVscyIsIHNsaW1fNl9yeF9jaHMsCi0JCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJWSV9GRUVEX1RYIENoYW5uZWxzIiwgdmlfZmVlZF90eF9jaHMsCi0JCQltc21fdmlfZmVlZF90eF9jaF9nZXQsIG1zbV92aV9mZWVkX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfUlggRm9ybWF0Iiwgc2xpbV8wX3J4X2Zvcm1hdCwKLQkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIEZvcm1hdCIsIHNsaW1fNV9yeF9mb3JtYXQsCi0JCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBGb3JtYXQiLCBzbGltXzZfcnhfZm9ybWF0LAotCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfVFggRm9ybWF0Iiwgc2xpbV8wX3R4X2Zvcm1hdCwKLQkJCXNsaW1fdHhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fdHhfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIFNhbXBsZVJhdGUiLCBzbGltXzBfcnhfc2FtcGxlX3JhdGUsCi0JCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8yX1JYIFNhbXBsZVJhdGUiLCBzbGltXzJfcnhfc2FtcGxlX3JhdGUsCi0JCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1RYIFNhbXBsZVJhdGUiLCBzbGltXzBfdHhfc2FtcGxlX3JhdGUsCi0JCQlzbGltX3R4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIFNhbXBsZVJhdGUiLCBzbGltXzVfcnhfc2FtcGxlX3JhdGUsCi0JCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV82X1JYIFNhbXBsZVJhdGUiLCBzbGltXzZfcnhfc2FtcGxlX3JhdGUsCi0JCQlzbGltX3J4X3NhbXBsZV9yYXRlX2dldCwgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiQlQgU2FtcGxlUmF0ZSIsIGJ0X3NhbXBsZV9yYXRlLAotCQkJbXNtX2J0X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1zbV9idF9zYW1wbGVfcmF0ZV9wdXQpLAotfTsKLQotc3RhdGljIGludCBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGludDMyX3QgaWQpCi17Ci0JaW50IGNoX2lkID0gMDsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8wOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8xOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8yOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF8zOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF80OwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzZfUlg6Ci0JCWNoX2lkID0gU0xJTV9SWF82OwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFg6Ci0JCWNoX2lkID0gU0xJTV9UWF8wOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6Ci0JCWNoX2lkID0gU0xJTV9UWF8zOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljaF9pZCA9IFNMSU1fUlhfMDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGNoX2lkOwotfQotCi1zdGF0aWMgdm9pZCBwYXJhbV9zZXRfbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsIGludCBuLCB1bnNpZ25lZCBpbnQgYml0KQotewotCWlmIChiaXQgPj0gU05EUlZfTUFTS19NQVgpCi0JCXJldHVybjsKLQlpZiAocGFyYW1faXNfbWFzayhuKSkgewotCQlzdHJ1Y3Qgc25kX21hc2sgKm0gPSBwYXJhbV90b19tYXNrKHAsIG4pOwotCi0JCW0tPmJpdHNbMF0gPSAwOwotCQltLT5iaXRzWzFdID0gMDsKLQkJbS0+Yml0c1tiaXQgPj4gNV0gfD0gKDEgPDwgKGJpdCAmIDMxKSk7Ci0JfQotfQotCi0vKioKLSAqIG1zbV9leHRfYmVfaHdfcGFyYW1zX2ZpeHVwIC0gdXBkYXRlcyBzZXR0aW5ncyBvZiBBTFNBIEJFIGh3IHBhcmFtcy4KLSAqCi0gKiBAcnRkOiBydW50aW1lIGRhaWxpbmsgaW5zdGFuY2UKLSAqIEBwYXJhbXM6IEhXIHBhcmFtcyBvZiBhc3NvY2lhdGVkIGJhY2tlbmQgZGFpbGluay4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciByYyBvbiBmYWlsdXJlLgotICovCi1pbnQgbXNtX2V4dF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQlpbnQgcmMgPSAwOwotCWludCBpZHg7Ci0Jdm9pZCAqY29uZmlnID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCi0JcHJfZGVidWcoIiVzOiBmb3JtYXQgPSAlZCwgcmF0ZSA9ICVkXG4iLAotCQkgIF9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcyksIHBhcmFtc19yYXRlKHBhcmFtcykpOwotCi0Jc3dpdGNoIChkYWlfbGluay0+aWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWDoKLQkJaWR4ID0gbXNtX3NsaW1fZ2V0X2NoX2Zyb21fYmVpZChkYWlfbGluay0+aWQpOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJc2xpbV9yeF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3J4X2NmZ1tpZHhdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfVFg6Ci0JCWlkeCA9IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fdHhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbaWR4XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlzbGltX3R4X2NmZ1sxXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbMV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEUpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gbXNtX3ZpX2ZlZWRfdHhfY2g7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJc2xpbV9yeF9jZmdbNV0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAxOwotCi0JCWNvbmZpZyA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQkJQUZFX1NMSU1CVVNfU0xBVkVfUE9SVF9DT05GSUcpOwotCQlpZiAoY29uZmlnKSB7Ci0JCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHLAotCQkJCQkgICAgY29uZmlnLCBTTElNQlVTXzVfVFgpOwotCQkJaWYgKHJjKQotCQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBwb3J0IGNvbmZpZyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfOF9UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbU0xJTV9UWF84XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJc2xpbV90eF9jZmdbU0xJTV9UWF84XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTChtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cCk7Ci0KLS8qKgotICogbXNtX3NuZF9od19wYXJhbXMgLSBodyBwYXJhbXMgb3BzIG9mIGJhY2tlbmQgZGFpbGluay4KLSAqCi0gKiBAc3Vic3RyZWFtOiBQQ00gc3RyZWFtIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgotICogQHBhcmFtczogSFcgcGFyYW1zIG9mIGFzc29jaWF0ZWQgYmFja2VuZCBkYWlsaW5rLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIHJldCBvbiBmYWlsdXJlLgotICovCi1pbnQgbXNtX3NuZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCi0JaW50IHJldCA9IDA7Ci0JdTMyIHJ4X2NoW1NMSU1fTUFYX1JYX1BPUlRTXSwgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOwotCXUzMiByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOwotCXUzMiB1c2VyX3NldF90eF9jaCA9IDA7Ci0JdTMyIHJ4X2NoX2NvdW50OwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgpIHsKLQkJCXByX2RlYnVnKCIlczogcnhfNV9jaD0lZFxuIiwgX19mdW5jX18sCi0JCQkJICBzbGltX3J4X2NmZ1s1XS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzVdLmNoYW5uZWxzOwotCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzJfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSBzbGltX3J4X2NmZ1syXS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzJdLmNoYW5uZWxzOwotCQl9IGVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzZfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHMpOwotCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s2XS5jaGFubmVsczsKLQkJfSBlbHNlIHsKLQkJCXByX2RlYnVnKCIlczogcnhfMF9jaD0lZFxuIiwgX19mdW5jX18sCi0JCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscyk7Ci0JCQlyeF9jaF9jb3VudCA9IHNsaW1fcnhfY2ZnWzBdLmNoYW5uZWxzOwotCQl9Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCQkJICByeF9jaF9jb3VudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlczogJXNfdHhfZGFpX2lkXyVkX2NoPSVkXG4iLCBfX2Z1bmNfXywKLQkJCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIHVzZXJfc2V0X3R4X2NoKTsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyX2NoX21hcDsKLQkJfQotCQkvKiBGb3IgPGNvZGVjPl90eDEgY2FzZSAqLwotCQlpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzBfVFgpCi0JCQl1c2VyX3NldF90eF9jaCA9IHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzOwotCQkvKiBGb3IgPGNvZGVjPl90eDMgY2FzZSAqLwotCQllbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWCkKLQkJCXVzZXJfc2V0X3R4X2NoID0gc2xpbV90eF9jZmdbMV0uY2hhbm5lbHM7Ci0JCWVsc2UgaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYKQotCQkJdXNlcl9zZXRfdHhfY2ggPSBtc21fdmlfZmVlZF90eF9jaDsKLQkJZWxzZQotCQkJdXNlcl9zZXRfdHhfY2ggPSB0eF9jaF9jbnQ7Ci0KLQkJcHJfZGVidWcoIiVzOiBtc21fc2xpbV8wX3R4X2NoKCVkKSB1c2VyX3NldF90eF9jaCglZCkgdHhfY2hfY250KCVkKSwgaWQgKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywgIHNsaW1fdHhfY2ZnWzBdLmNoYW5uZWxzLCB1c2VyX3NldF90eF9jaCwKLQkJCSB0eF9jaF9jbnQsIGRhaV9saW5rLT5pZCk7Ci0KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJCQkgIHVzZXJfc2V0X3R4X2NoLCB0eF9jaCwgMCwgMCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0KLWVycl9jaF9tYXA6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZF9od19wYXJhbXMpOwotCi0vKioKLSAqIG1zbV9leHRfc2xpbWJ1c18yX2h3X3BhcmFtcyAtIGh3IHBhcmFtcyBvcHMgb2Ygc2xpbWJ1c18yIEJFLgotICoKLSAqIEBzdWJzdHJlYW06IFBDTSBzdHJlYW0gb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsuCi0gKiBAcGFyYW1zOiBIVyBwYXJhbXMgb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgcmV0IG9uIGZhaWx1cmUuCi0gKi8KLWludCBtc21fZXh0X3NsaW1idXNfMl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGludCByeF9jaFtTTElNX01BWF9SWF9QT1JUU10sIHR4X2NoW1NMSU1fTUFYX1RYX1BPUlRTXTsKLQl1bnNpZ25lZCBpbnQgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX3R4X2NoID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX3J4X2NoID0gMDsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCW51bV9yeF9jaCA9ICBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQkJcHJfZGVidWcoIiVzOiAlcyByeF9kYWlfaWQgPSAlZCAgbnVtX2NoID0gJWRcbiIsIF9fZnVuY19fLAotCQkJY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkLCBudW1fcnhfY2gpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgMCwKLQkJCQludW1fcnhfY2gsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZSB7Ci0JCW51bV90eF9jaCA9ICBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQkJcHJfZGVidWcoIiVzOiAlcyAgdHhfZGFpX2lkID0gJWQgIG51bV9jaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgbnVtX3R4X2NoKTsKLQkJcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJbnVtX3R4X2NoLCB0eF9jaCwgMCwgMCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX2V4dF9zbGltYnVzXzJfaHdfcGFyYW1zKTsKLQotLyoqCi0gKiBtc21fc25kX2NwZV9od19wYXJhbXMgLSBodyBwYXJhbXMgb3BzIG9mIENQRSBiYWNrZW5kLgotICoKLSAqIEBzdWJzdHJlYW06IFBDTSBzdHJlYW0gb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsuCi0gKiBAcGFyYW1zOiBIVyBwYXJhbXMgb2YgYXNzb2NpYXRlZCBiYWNrZW5kIGRhaWxpbmsuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgcmV0IG9uIGZhaWx1cmUuCi0gKi8KLWludCBtc21fc25kX2NwZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCWludCByZXQgPSAwOwotCXUzMiB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107Ci0JdTMyIHR4X2NoX2NudCA9IDA7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gIT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgc3RyZWFtIHR5cGUgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3Vic3RyZWFtLT5zdHJlYW0pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6ICVzX3R4X2RhaV9pZF8lZFxuIiwgX19mdW5jX18sCi0JCSBjb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQpOwotCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCi0JCQkJICZ0eF9jaF9jbnQsIHR4X2NoLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHR4X2NoX2NudCglZCkgaWQgJWRcbiIsCi0JCSBfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJCSAgdHhfY2hfY250LCB0eF9jaCwgMCwgMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGVuZDsKLQl9Ci1lbmQ6Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0wobXNtX3NuZF9jcGVfaHdfcGFyYW1zKTsKLQotc3RhdGljIGludCBtc21fYWZlX3NldF9jb25maWcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCWludCByYzsKLQl2b2lkICpjb25maWdfZGF0YTsKLQotCXByX2RlYnVnKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCWlmICghbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBjb2RlYyBnZXQgYWZlIGNvbmZpZyBub3QgaW5pdCdlZFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQlBRkVfQ0RDX1JFR0lTVEVSU19DT05GSUcpOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRywgY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY29kZWMgcmVnaXN0ZXJzIGNvbmZpZyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRyk7Ci0JaWYgKGNvbmZpZ19kYXRhKSB7Ci0JCXJjID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUl9QQUdFX0NPTkZJRywgY29uZmlnX2RhdGEsCi0JCQkJICAgIDApOwotCQlpZiAocmMpCi0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGNkYyByZWdpc3RlciBwYWdlIGNvbmZpZ1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JfQotCi0JY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCi0JCQlBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9TTElNQlVTX1NMQVZFX0NPTkZJRywgY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgc2xpbWJ1cyBzbGF2ZSBjb25maWcgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCUFGRV9BQU5DX1ZFUlNJT04pOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9BQU5DX1ZFUlNJT04sIGNvbmZpZ19kYXRhLCAwKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFBTkMgdmVyc2lvbiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJCUFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX0NMSVBfUkVHSVNURVJTX0NPTkZJRywKLQkJCQkJY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgY2xpcCByZWdpc3RlcnMgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJQUZFX0NMSVBfQkFOS19TRUwpOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyYyA9IGFmZV9zZXRfY29uZmlnKEFGRV9DTElQX0JBTktfU0VMLAotCQkJCWNvbmZpZ19kYXRhLCAwKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBiYW5rIHNlbGVjdGlvbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JfQotCi0JY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCi0JCQlBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHLCBjb25maWdfZGF0YSwKLQkJCQkwKTsKLQkJaWYgKHJjKQotCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBjZGMgcmVnaXN0ZXIgcGFnZSBjb25maWdcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FmZV9jbGVhcl9jb25maWcodm9pZCkKLXsKLQlhZmVfY2xlYXJfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7Ci0JYWZlX2NsZWFyX2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOwotfQotCi1zdGF0aWMgaW50IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCBhZHNwX3JlYWR5ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0JdGltZW91dCA9IGppZmZpZXMgKwotCQltc2Vjc190b19qaWZmaWVzKEFEU1BfU1RBVEVfUkVBRFlfVElNRU9VVF9NUyk7Ci0KLQlkbyB7Ci0JCWlmIChxNmNvcmVfaXNfYWRzcF9yZWFkeSgpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IEFEU1AgQXVkaW8gaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKLQkJCWFkc3BfcmVhZHkgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyoKLQkJICogQURTUCB3aWxsIGJlIGNvbWluZyB1cCBhZnRlciBzdWJzeXN0ZW0gcmVzdGFydCBhbmQKLQkJICogaXQgbWlnaHQgbm90IGJlIGZ1bGx5IHVwIHdoZW4gdGhlIGNvbnRyb2wgcmVhY2hlcwotCQkgKiBoZXJlLiBTbywgd2FpdCBmb3IgNTBtc2VjIGJlZm9yZSBjaGVja2luZyBBRFNQIHN0YXRlCi0JCSAqLwotCQltc2xlZXAoNTApOwotCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOwotCi0JaWYgKCFhZHNwX3JlYWR5KSB7Ci0JCXByX2VycigiJXM6IHRpbWVkIG91dCB3YWl0aW5nIGZvciBBRFNQIEF1ZGlvXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gZXJyX2ZhaWw7Ci0JfQotCi0JcmV0ID0gbXNtX2FmZV9zZXRfY29uZmlnKGNvZGVjKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBjb25maWcuIGVyciAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtNjYwX25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCQkgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKnB0cikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmJlX2RsX25hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlg7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlcnZpY2Ugb3Bjb2RlIDB4JWx4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046Ci0JCS8qCi0JCSAqIFVzZSBmbGFnIHRvIGlnbm9yZSBpbml0aWFsIGJvb3Qgbm90aWZpY2F0aW9ucwotCQkgKiBPbiBpbml0aWFsIGJvb3QgbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGlzCi0JCSAqIGNhbGxlZCBvbiBpbml0LiBUaGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyCi0JCSAqIGFuZCBzZXQgdGhlIGNvbmZpZyBhZ2FpbiBvbiBpbml0aWFsIGJvb3QuCi0JCSAqLwotCQlpZiAoaXNfaW5pdGlhbF9ib290KQotCQkJYnJlYWs7Ci0JCW1zbV9hZmVfY2xlYXJfY29uZmlnKCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKLQkJaWYgKGlzX2luaXRpYWxfYm9vdCkgewotCQkJaXNfaW5pdGlhbF9ib290ID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIXNwZGV2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwZGV2KTsKLQkJcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7Ci0JCWlmICghcnRkKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAotCQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJY29kZWMgPSBydGQtPmNvZGVjOwotCi0JCXJldCA9IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhjb2RlYyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyBmYWlsZWQgcmV0ID0gJWQhXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLWRvbmU6Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXJ2aWNlX25iID0gewotCS5ub3RpZmllcl9jYWxsICA9IHNkbTY2MF9ub3RpZmllcl9zZXJ2aWNlX2NiLAotCS5wcmlvcml0eSA9IC1JTlRfTUFYLAotfTsKLQotc3RhdGljIGludCBtc21fY29uZmlnX2hwaF9lbjBfZ3BpbyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgaGlnaCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCWludCB2YWw7Ci0KLQlpZiAoIWNhcmQpCi0JCXJldHVybiAwOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0JaWYgKCFwZGF0YSB8fCAhZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMF9ncGlvKSkKLQkJcmV0dXJuIDA7Ci0KLQl2YWwgPSBncGlvX2dldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+aHBoX2VuMF9ncGlvKTsKLQlpZiAoKCEhdmFsKSA9PSBoaWdoKQotCQlyZXR1cm4gMDsKLQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+aHBoX2VuMF9ncGlvLCAoaW50KWhpZ2gpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIGludCBlbmFibGUsIGJvb2wgZGFwbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGFzaGFfY29kZWMiKSkKLQkJcmV0ID0gdGFzaGFfY2RjX21jbGtfdHhfZW5hYmxlKGNvZGVjLCBlbmFibGUsIGRhcG0pOwotCWVsc2UgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogdW5rbm93biBjb2RlYyB0byBlbmFibGUgZXh0IGNsa1xuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fZXh0X21jbGtfdHhfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCi0JcHJfZGVidWcoIiVzOiBldmVudCA9ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6Ci0JCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfdHhfY2xrKGNvZGVjLCAxLCB0cnVlKTsKLQljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKLQkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDAsIHRydWUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZXh0X21jbGtfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQotCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlyZXR1cm4gbXNtX2V4dF9lbmFibGVfY29kZWNfbWNsayhjb2RlYywgMSwgdHJ1ZSk7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldHVybiBtc21fZXh0X2VuYWJsZV9jb2RlY19tY2xrKGNvZGVjLCAwLCB0cnVlKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9wcmVwYXJlX2hpZmkoc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMV9ncGlvKSkgewotCQlwcl9kZWJ1ZygiJXM6IGhwaF9lbjFfZ3BpbyByZXF1ZXN0ICVkXG4iLCBfX2Z1bmNfXywKLQkJCXBkYXRhLT5ocGhfZW4xX2dwaW8pOwotCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmhwaF9lbjFfZ3BpbywgImhwaF9lbjFfZ3BpbyIpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBocGhfZW4xX2dwaW8gcmVxdWVzdCBmYWlsZWQsIHJldDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4wX2dwaW8pKSB7Ci0JCXByX2RlYnVnKCIlczogaHBoX2VuMF9ncGlvIHJlcXVlc3QgJWRcbiIsIF9fZnVuY19fLAotCQkJcGRhdGEtPmhwaF9lbjBfZ3Bpbyk7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+aHBoX2VuMF9ncGlvLCAiaHBoX2VuMF9ncGlvIik7Ci0JCWlmIChyZXQpCi0JCQlwcl9lcnIoIiVzOiBocGhfZW4wX2dwaW8gcmVxdWVzdCBmYWlsZWQsIHJldDolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQl9Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX2RhcG1fd2lkZ2V0c1tdID0gewotCi0JU05EX1NPQ19EQVBNX1NVUFBMWV9TKCJNQ0xLIiwgLTEsICBTTkRfU09DX05PUE0sIDAsIDAsCi0JbXNtX2V4dF9tY2xrX2V2ZW50LCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZX1MoIk1DTEsgVFgiLCAtMSwgIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltc21fZXh0X21jbGtfdHhfZXZlbnQsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQotCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMSBhbXAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJMaW5lb3V0XzMgYW1wIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8yIGFtcCIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfNCBhbXAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIYW5kc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiU2Vjb25kYXJ5IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFOQ1JpZ2h0IEhlYWRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiQU5DTGVmdCBIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM0IiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiQW5hbG9nIE1pYzYiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJBbmFsb2cgTWljNyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFuYWxvZyBNaWM4IiwgTlVMTCksCi0KLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzEiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzIiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzQiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzUiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzYiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZF9hdWRpb19wYXRoc190YXNoYVtdID0gewotCXsiTUlDIEJJQVMxIiwgTlVMTCwgIk1DTEsgVFgifSwKLQl7Ik1JQyBCSUFTMiIsIE5VTEwsICJNQ0xLIFRYIn0sCi0JeyJNSUMgQklBUzMiLCBOVUxMLCAiTUNMSyBUWCJ9LAotCXsiTUlDIEJJQVM0IiwgTlVMTCwgIk1DTEsgVFgifSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZF9hdWRpb19wYXRoc1tdID0gewotCXsiTUlDIEJJQVMxIiwgTlVMTCwgIk1DTEsifSwKLQl7Ik1JQyBCSUFTMiIsIE5VTEwsICJNQ0xLIn0sCi0JeyJNSUMgQklBUzMiLCBOVUxMLCAiTUNMSyJ9LAotCXsiTUlDIEJJQVM0IiwgTlVMTCwgIk1DTEsifSwKLX07Ci0KLWludCBtc21fc25kX2NhcmRfdGFzaGFfbGF0ZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCWNvbnN0IGNoYXIgKmJlX2RsX25hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlg7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICptYmhjX2NhbGlicmF0aW9uOwotCi0JcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7Ci0JaWYgKCFydGQpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsCi0JCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAotCQkJX19mdW5jX18sIGJlX2RsX25hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wY21fcnVudGltZTsKLQl9Ci0KLQltYmhjX2NhbGlicmF0aW9uID0gZGVmX2V4dF9tYmhjX2NhbCgpOwotCWlmICghbWJoY19jYWxpYnJhdGlvbikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9tYmhjX2NhbDsKLQl9Ci0Jd2NkX21iaGNfY2ZnX3B0ci0+Y2FsaWJyYXRpb24gPSBtYmhjX2NhbGlicmF0aW9uOwotCXJldCA9IHRhc2hhX21iaGNfaHNfZGV0ZWN0KHJ0ZC0+Y29kZWMsIHdjZF9tYmhjX2NmZ19wdHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICIlczogbWJoYyBocyBkZXRlY3QgZmFpbGVkLCBlcnI6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfaHNfZGV0ZWN0OwotCX0KLQlyZXR1cm4gMDsKLQotZXJyX2hzX2RldGVjdDoKLQlrZnJlZShtYmhjX2NhbGlicmF0aW9uKTsKLWVycl9tYmhjX2NhbDoKLWVycl9wY21fcnVudGltZToKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgbXNtX3NuZF9jYXJkX3RhdmlsX2xhdGVfcHJvYmUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQljb25zdCBjaGFyICpiZV9kbF9uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqbWJoY19jYWxpYnJhdGlvbjsKLQotCXJ0ZCA9IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKGNhcmQsIGJlX2RsX25hbWUpOwotCWlmICghcnRkKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJIiVzOiBzbmRfc29jX2dldF9wY21fcnVudGltZSBmb3IgJXMgZmFpbGVkIVxuIiwKLQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JbWJoY19jYWxpYnJhdGlvbiA9IGRlZl9leHRfbWJoY19jYWwoKTsKLQlpZiAoIW1iaGNfY2FsaWJyYXRpb24pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQotCXdjZF9tYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uID0gbWJoY19jYWxpYnJhdGlvbjsKLQlyZXQgPSB0YXZpbF9tYmhjX2hzX2RldGVjdChydGQtPmNvZGVjLCB3Y2RfbWJoY19jZmdfcHRyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXM6IG1iaGMgaHMgZGV0ZWN0IGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2ZyZWVfbWJoY19jYWw7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9tYmhjX2NhbDoKLQlrZnJlZShtYmhjX2NhbGlicmF0aW9uKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG1zbV9hdWRyeF9pbml0IC0gQXVkaW8gaW5pdCBmdW5jdGlvbiBvZiBzb3VuZCBjYXJkIGluc3RhbnRpYXRlLgotICoKLSAqIEBydGQ6IHJ1bnRpbWUgZGFpbGluayBpbnN0YW5jZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIHJldCBvbiBmYWlsdXJlLgotICovCi1pbnQgbXNtX2F1ZHJ4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlpbnQgcmV0OwotCXZvaWQgKmNvbmZpZ19kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqYXV4X2NvbXA7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQotCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCi0JLyogQ29kZWMgU0xJTUJVUyBjb25maWd1cmF0aW9uCi0JICogUlgxLCBSWDIsIFJYMywgUlg0LCBSWDUsIFJYNiwgUlg3LCBSWDgsIFJYOSwgUlgxMCwgUlgxMSwgUlgxMiwgUlgxMwotCSAqIFRYMSwgVFgyLCBUWDMsIFRYNCwgVFg1LCBUWDYsIFRYNywgVFg4LCBUWDksIFRYMTAsIFRYMTEsIFRYMTIsIFRYMTMKLQkgKiBUWDE0LCBUWDE1LCBUWDE2Ci0JICovCi0JdW5zaWduZWQgaW50IHJ4X2NoW1RBU0hBX1JYX01BWF0gPSB7MTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLAotCQkJCQkgICAgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1Nn07Ci0JdW5zaWduZWQgaW50IHR4X2NoW1RBU0hBX1RYX01BWF0gID0gezEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsCi0JCQkJCSAgICAgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwKLQkJCQkJICAgICAxNDAsIDE0MSwgMTQyLCAxNDN9OwotCi0JLyogVGF2aWwgQ29kZWMgU0xJTUJVUyBjb25maWd1cmF0aW9uCi0JICogUlgxLCBSWDIsIFJYMywgUlg0LCBSWDUsIFJYNiwgUlg3LCBSWDgKLQkgKiBUWDEsIFRYMiwgVFgzLCBUWDQsIFRYNSwgVFg2LCBUWDcsIFRYOCwgVFg5LCBUWDEwLCBUWDExLCBUWDEyLCBUWDEzCi0JICogVFgxNCwgVFgxNSwgVFgxNgotCSAqLwotCXVuc2lnbmVkIGludCByeF9jaF90YXZpbFtXQ0Q5MzRYX1JYX01BWF0gPSB7MTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsCi0JCQkJCSAgICAxNDksIDE1MCwgMTUxfTsKLQl1bnNpZ25lZCBpbnQgdHhfY2hfdGF2aWxbV0NEOTM0WF9UWF9NQVhdID0gezEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLAotCQkJCQkgICAgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwKLQkJCQkJICAgIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzfTsKLQotCXByX2RlYnVnKCIlczogZGV2X25hbWUlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGNwdV9kYWktPmRldikpOwotCi0JcnRkLT5wbWRvd25fdGltZSA9IDA7Ci0KLQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3NuZF9jb250cm9scywKLQkJCQkJIEFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFkZF9jb2RlY19jb250cm9scyBmYWlsZWQ6ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIG1zbV9jb21tb25fc25kX2NvbnRyb2xzLAotCQkJCQkgbXNtX2NvbW1vbl9zbmRfY29udHJvbHNfc2l6ZSgpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZGRfY29tbW9uX3NuZF9jb250cm9scyBmYWlsZWQ6ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLCBtc21fZGFwbV93aWRnZXRzLAotCQkJQVJSQVlfU0laRShtc21fZGFwbV93aWRnZXRzKSk7Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2RfYXVkaW9fcGF0aHNfdGFzaGEsCi0JCQkJCUFSUkFZX1NJWkUod2NkX2F1ZGlvX3BhdGhzX3Rhc2hhKSk7Ci0JZWxzZQotCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2RfYXVkaW9fcGF0aHMsCi0JCQkJCUFSUkFZX1NJWkUod2NkX2F1ZGlvX3BhdGhzKSk7Ci0KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF8xIGFtcCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJMaW5lb3V0XzMgYW1wIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW4oZGFwbSwgIkxpbmVvdXRfMiBhbXAiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiTGluZW91dF80IGFtcCIpOwotCi0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURJTlBVVCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTUFEX0NQRV9JTlBVVCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTZWNvbmRhcnkgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMaW5lb3V0XzEgYW1wIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMaW5lb3V0XzMgYW1wIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMaW5lb3V0XzIgYW1wIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMaW5lb3V0XzQgYW1wIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkNSaWdodCBIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DTGVmdCBIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMwIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzEiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMzIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljNSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFuYWxvZyBNaWM2Iik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBbmFsb2cgTWljNyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzgiKTsKLQotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRUFSIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUMxIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUM0Iik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDNSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzAiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMxIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUM0Iik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDNSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEVBUiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMSBPVVQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzIgT1VUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhMIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIUEhSIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUY0IFZJIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJWSUlOUFVUIik7Ci0KLQlpZiAoIXN0cmNtcChkZXZfbmFtZShjb2RlY19kYWktPmRldiksICJ0YXNoYV9jb2RlYyIpKSB7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDMiKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUNCIpOwotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBIUEhMIik7Ci0JCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSFIiKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgTElORU9VVDEiKTsKLQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkMgTElORU9VVDIiKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfT1VUMSIpOwotCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfT1VUMiIpOwotCX0KLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQlzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLCBBUlJBWV9TSVpFKHR4X2NoX3RhdmlsKSwKLQkJCQkJdHhfY2hfdGF2aWwsIEFSUkFZX1NJWkUocnhfY2hfdGF2aWwpLAotCQkJCQlyeF9jaF90YXZpbCk7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCi0JCQkJCXR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwKLQkJCQkJcnhfY2gpOwotCX0KLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjX2RhaS0+ZGV2KSwgInRhdmlsX2NvZGVjIikpIHsKLQkJbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuID0gdGF2aWxfZ2V0X2FmZV9jb25maWc7Ci0JfSBlbHNlIHsKLQkJbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuID0gdGFzaGFfZ2V0X2FmZV9jb25maWc7Ci0JCW1zbV9jb2RlY19mbi5tYmhjX2hzX2RldGVjdF9leGl0ID0gdGFzaGFfbWJoY19oc19kZXRlY3RfZXhpdDsKLQl9Ci0KLQlyZXQgPSBtc21fYWRzcF9wb3dlcl91cF9jb25maWcoY29kZWMpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBBRkUgY29uZmlnICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnJfYWZlX2NmZzsKLQl9Ci0KLQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQkJCSAgICAgQUZFX0FBTkNfVkVSU0lPTik7Ci0JaWYgKGNvbmZpZ19kYXRhKSB7Ci0JCXJldCA9IGFmZV9zZXRfY29uZmlnKEFGRV9BQU5DX1ZFUlNJT04sIGNvbmZpZ19kYXRhLCAwKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBhYW5jIHZlcnNpb24gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycl9hZmVfY2ZnOwotCQl9Ci0JfQotCi0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGFzaGFfY29kZWMiKSkgewotCQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQkJCUFGRV9DRENfQ0xJUF9SRUdJU1RFUlNfQ09ORklHKTsKLQkJaWYgKGNvbmZpZ19kYXRhKSB7Ci0JCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX0NMSVBfUkVHSVNURVJTX0NPTkZJRywKLQkJCQkJCSBjb25maWdfZGF0YSwgMCk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCBjbGlwIHJlZ2lzdGVycyAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQkJZ290byBlcnJfYWZlX2NmZzsKLQkJCX0KLQkJfQotCQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCQlBRkVfQ0xJUF9CQU5LX1NFTCk7Ci0JCWlmIChjb25maWdfZGF0YSkgewotCQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0NMSVBfQkFOS19TRUwsIGNvbmZpZ19kYXRhLCAwKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IEFGRSBiYW5rIHNlbGVjdGlvbiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQkJZ290byBlcnJfYWZlX2NmZzsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2VuZCBzcGVha2VyIGNvbmZpZ3VyYXRpb24gb25seSBmb3IgV1NBODgxMC4KLQkgKiBEZWZhbHV0IGNvbmZpZ3VyYXRpb24gaXMgZm9yIFdTQTg4MTUuCi0JICovCi0JcHJfZGVidWcoIiVzOiBOdW1iZXIgb2YgYXV4IGRldmljZXM6ICVkXG4iLAotCQlfX2Z1bmNfXywgcnRkLT5jYXJkLT5udW1fYXV4X2RldnMpOwotCi0JaWYgKCFzdHJjbXAoZGV2X25hbWUoY29kZWNfZGFpLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQlpZiAocnRkLT5jYXJkLT5udW1fYXV4X2RldnMgJiYKLQkJICAgICFsaXN0X2VtcHR5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QpKSB7Ci0JCQlhdXhfY29tcCA9IGxpc3RfZmlyc3RfZW50cnkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCwKLQkJCQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQsIGxpc3RfYXV4KTsKLQkJCWlmICghc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMSkgfHwKLQkJCSAgICAhc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMikpIHsKLQkJCQl0YXZpbF9zZXRfc3Brcl9tb2RlKHJ0ZC0+Y29kZWMsIFNQS1JfTU9ERV8xKTsKLQkJCQl0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldChydGQtPmNvZGVjLAotCQkJCQkJCVJYX0dBSU5fT0ZGU0VUX00xUDVfREIpOwotCQkJfQotCQl9Ci0JCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCQllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY2FyZC0+bW9kdWxlLCAiY29kZWNzIiwKLQkJCQkJCSBjYXJkLT5wcm9jX3Jvb3QpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IENhbm5vdCBjcmVhdGUgY29kZWNzIG1vZHVsZSBlbnRyeVxuIiwKLQkJCQkgX19mdW5jX18pOwotCQkJZ290byBkb25lOwotCQl9Ci0JCXBkYXRhLT5jb2RlY19yb290ID0gZW50cnk7Ci0JCXRhdmlsX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LCBjb2RlYyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHJ0ZC0+Y2FyZC0+bnVtX2F1eF9kZXZzICYmCi0JCSAgICAhbGlzdF9lbXB0eSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0KSkgewotCQkJYXV4X2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QsCi0JCQkJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50LCBsaXN0X2F1eCk7Ci0JCQlpZiAoIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8Ci0JCQkgICAgIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzIpKSB7Ci0JCQkJdGFzaGFfc2V0X3Nwa3JfbW9kZShydGQtPmNvZGVjLCBTUEtSX01PREVfMSk7Ci0JCQkJdGFzaGFfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQocnRkLT5jb2RlYywKLQkJCQkJCQlSWF9HQUlOX09GRlNFVF9NMVA1X0RCKTsKLQkJCX0KLQkJfQotCQljYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQkJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfc3ViZGlyKGNhcmQtPm1vZHVsZSwgImNvZGVjcyIsCi0JCQkJCQkgY2FyZC0+cHJvY19yb290KTsKLQkJaWYgKCFlbnRyeSkgewotCQkJcHJfZGVidWcoIiVzOiBDYW5ub3QgY3JlYXRlIGNvZGVjcyBtb2R1bGUgZW50cnlcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlwZGF0YS0+Y29kZWNfcm9vdCA9IGVudHJ5OwotCQl0YXNoYV9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShwZGF0YS0+Y29kZWNfcm9vdCwgY29kZWMpOwotCQl0YXNoYV9tYmhjX3pkZXRfZ3Bpb19jdHJsKG1zbV9jb25maWdfaHBoX2VuMF9ncGlvLCBydGQtPmNvZGVjKTsKLQl9Ci1kb25lOgotCW1zbV9zZXRfY29kZWNfcmVnX2RvbmUodHJ1ZSk7Ci0JcmV0dXJuIDA7Ci0KLWVycl9hZmVfY2ZnOgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9hdWRyeF9pbml0KTsKLQotLyoqCi0gKiBtc21fZXh0X3JlZ2lzdGVyX2F1ZGlvX25vdGlmaWVyIC0gcmVnaXN0ZXIgU1NSIG5vdGlmaWVyLgotICovCi12b2lkIG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0OwotCi0JaXNfaW5pdGlhbF9ib290ID0gdHJ1ZTsKLQlzcGRldiA9IHBkZXY7Ci0JcmV0ID0gYXVkaW9fbm90aWZpZXJfcmVnaXN0ZXIoInNkbTY2MCIsIEFVRElPX05PVElGSUVSX0FEU1BfRE9NQUlOLAotCQkJCSAgICAgICZzZXJ2aWNlX25iKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogQXVkaW8gbm90aWZpZXIgcmVnaXN0ZXIgZmFpbGVkIHJldCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIpOwotCi0vKioKLSAqIG1zbV9leHRfY2RjX2luaXQgLSBleHRlcm5hbCBjb2RlYyBtYWNoaW5lIHNwZWNpZmljIGluaXQuCi0gKgotICogQHBkZXY6IHBsYXRmb3JtIGRldmljZSBoYW5kbGUKLSAqIEBwZGF0YTogcHJpdmF0ZSBkYXRhIG9mIG1hY2hpbmUgZHJpdmVyCi0gKiBAY2FyZDogc291bmQgY2FyZCBwb2ludGVyIHJlZmVyZW5jZQotICogQG1iaGNfY2ZnOiBNQkhDIGNvbmZpZyByZWZlcmVuY2UKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciByZXQgb24gZmFpbHVyZS4KLSAqLwotaW50IG1zbV9leHRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKLQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKLQkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICp3Y2RfbWJoY19jZmdfcHRyMSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXdjZF9tYmhjX2NmZ19wdHIgPSB3Y2RfbWJoY19jZmdfcHRyMTsKLQlwZGV2LT5pZCA9IDA7Ci0Jd2NkX21iaGNfY2ZnX3B0ci0+bW9pc3R1cmVfZW4gPSB0cnVlOwotCXdjZF9tYmhjX2NmZ19wdHItPm1iaGNfbWljYmlhcyA9IE1JQ19CSUFTXzI7Ci0Jd2NkX21iaGNfY2ZnX3B0ci0+YW5jX21pY2JpYXMgPSBNSUNfQklBU18yOwotCXdjZF9tYmhjX2NmZ19wdHItPmVuYWJsZV9hbmNfbWljX2RldGVjdCA9IGZhbHNlOwotCi0JKmNhcmQgPSBwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcygmcGRldi0+ZGV2LCBwZGF0YS0+c25kX2NhcmRfdmFsKTsKLQlpZiAoISgqY2FyZCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENhcmQgdW5pbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRVBST0JFX0RFRkVSOwotCQlnb3RvIGVycjsKLQl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgKmNhcmQpOwotCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgqY2FyZCwgcGRhdGEpOwotCXBkYXRhLT5ocGhfZW4xX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMV9ncGlvKSkKLQkJcGRhdGEtPmhwaF9lbjFfZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20saHBoLWVuMS1ncGlvIiwgMCk7Ci0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ocGhfZW4xX2dwaW8pICYmICghcGRhdGEtPmhwaF9lbjFfZ3Bpb19wKSkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwcm9wZXJ0eSAlcyBub3QgZGV0ZWN0ZWQgaW4gbm9kZSAlcyIsCi0JCQkicWNvbSxocGgtZW4xLWdwaW8iLCBwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQl9Ci0KLQlwZGF0YS0+aHBoX2VuMF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkicWNvbSxocGgtZW4wLWdwaW8iLCAwKTsKLQlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEtPmhwaF9lbjBfZ3BpbykpCi0JCXBkYXRhLT5ocGhfZW4wX2dwaW9fcCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+aHBoX2VuMF9ncGlvKSAmJiAoIXBkYXRhLT5ocGhfZW4wX2dwaW9fcCkpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJInFjb20saHBoLWVuMC1ncGlvIiwgcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JfQotCi0JcmV0ID0gbXNtX2V4dF9wcmVwYXJlX2hpZmkocGRhdGEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAibXNtX2V4dF9wcmVwYXJlX2hpZmkgZmFpbGVkICglZClcbiIsCi0JCQlyZXQpOwotCQlyZXQgPSAwOwotCX0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChtc21fZXh0X2NkY19pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tc20vc2RtNjYwLWV4dGVybmFsLmggYi9zb3VuZC9zb2MvbXNtL3NkbTY2MC1leHRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQ4YzAxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9tc20vc2RtNjYwLWV4dGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fU0RNNjYwX0VYVEVSTkFMCi0jZGVmaW5lIF9fU0RNNjYwX0VYVEVSTkFMCi0KLWludCBtc21fc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJICAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwotaW50IG1zbV9leHRfc2xpbWJ1c18yX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgbXNtX2J0c2NvX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgbXNtX3Byb3h5X3J4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgbXNtX3Byb3h5X3R4X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci1pbnQgbXNtX2F1ZHJ4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7Ci1pbnQgbXNtX3NuZF9jcGVfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7Ci1zdHJ1Y3Qgc25kX3NvY19jYXJkICpwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQlpbnQgc25kX2NhcmRfdmFsKTsKLWludCBtc21fZXh0X2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJICAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKLWludCBtc21fc25kX2NhcmRfdGF2aWxfbGF0ZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKTsKLWludCBtc21fc25kX2NhcmRfdGFzaGFfbGF0ZV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKTsKLSNpZmRlZiBDT05GSUdfU05EX1NPQ19FWFRfQ09ERUMKLWludCBtc21fZXh0X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiwgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqLAotCQkgICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKiosIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKik7Ci12b2lkIG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0jZWxzZQotaW5saW5lIGludCBtc21fZXh0X2NkY19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCi0JCQkgICAgc3RydWN0IHNuZF9zb2NfY2FyZCAqKmNhcmQsCi0JCQkgICAgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyAqd2NkX21iaGNfY2ZnX3B0cjEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWlubGluZSB2b2lkIG1zbV9leHRfcmVnaXN0ZXJfYXVkaW9fbm90aWZpZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1pbnRlcm5hbC5jIGIvc291bmQvc29jL21zbS9zZG02NjAtaW50ZXJuYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlNzMwOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3NkbTY2MC1pbnRlcm5hbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1NyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSAicWRzcDZ2Mi9tc20tcGNtLXJvdXRpbmctdjIuaCIKLSNpbmNsdWRlICJzZG02NjAtY29tbW9uLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3NkbTY2MF9jZGMvbXNtLWRpZ2l0YWwtY2RjLmgiCi0jaW5jbHVkZSAiLi4vY29kZWNzL3NkbTY2MF9jZGMvbXNtLWFuYWxvZy1jZGMuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3MvbXNtX3Nkdy9tc21fc2R3LmgiCi0KLSNkZWZpbmUgX19DSElQU0VUX18gIlNETTY2MCAiCi0jZGVmaW5lIE1TTV9EQUlMSU5LX05BTUUobmFtZSkgKF9fQ0hJUFNFVF9fI25hbWUpCi0KLSNkZWZpbmUgREVGQVVMVF9NQ0xLX1JBVEUgOTYwMDAwMAotI2RlZmluZSBOQVRJVkVfTUNMS19SQVRFIDExMjg5NjAwCi0KLSNkZWZpbmUgV0NEX01CSENfREVGX1JMT0FEUyA1Ci0KLSNkZWZpbmUgV0NOX0NEQ19TTElNX1JYX0NIX01BWCAyCi0jZGVmaW5lIFdDTl9DRENfU0xJTV9UWF9DSF9NQVggMwotCi0jZGVmaW5lIFdTQTg4MTBfTkFNRV8xICJ3c2E4ODF4LjIwMTcwMjExIgotI2RlZmluZSBXU0E4ODEwX05BTUVfMiAid3NhODgxeC4yMDE3MDIxMiIKLQotZW51bSB7Ci0JSU5UMF9NSTJTID0gMCwKLQlJTlQxX01JMlMsCi0JSU5UMl9NSTJTLAotCUlOVDNfTUkyUywKLQlJTlQ0X01JMlMsCi0JSU5UNV9NSTJTLAotCUlOVDZfTUkyUywKLQlJTlRfTUkyU19NQVgsCi19OwotCi1lbnVtIHsKLQlCVF9TTElNNywKLQlGTV9TTElNOCwKLQlTTElNX01BWCwKLX07Ci0KLS8qVERNIGRlZmF1bHQgb2Zmc2V0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRkbV9zbG90X29mZnNldFtURE1fUE9SVF9NQVhdW1RETV9TTE9UX09GRlNFVF9NQVhdID0gewotCXswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjh9LC8qIFRYXzAgfCBSWF8wICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzEgfCBSWF8xICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzIgfCBSWF8yICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzMgfCBSWF8zICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzQgfCBSWF80ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzUgfCBSWF81ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzYgfCBSWF82ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzcgfCBSWF83ICovCi19OwotCi1zdGF0aWMgc3RydWN0IGFmZV9jbGtfc2V0IGludF9taTJzX2Nsa1tJTlRfTUkyU19NQVhdID0gewotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9JTlQwX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UMV9NSTJTX0lCSVQsCi0JCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0sCi0JewotCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKLQkJUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDJfTUkyU19JQklULAotCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9JTlQzX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLQl7Ci0JCUFGRV9BUElfVkVSU0lPTl9JMlNfQ09ORklHLAotCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UNF9NSTJTX0lCSVQsCi0JCVE2QUZFX0xQQVNTX0lCSVRfQ0xLXzFfUDUzNl9NSFosCi0JCVE2QUZFX0xQQVNTX0NMS19BVFRSSUJVVEVfQ09VUExFX05PLAotCQlRNkFGRV9MUEFTU19DTEtfUk9PVF9ERUZBVUxULAotCQkwLAotCX0sCi0JewotCQlBRkVfQVBJX1ZFUlNJT05fSTJTX0NPTkZJRywKLQkJUTZBRkVfTFBBU1NfQ0xLX0lEX0lOVDVfTUkyU19JQklULAotCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9JTlQ2X01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfSwKLX07Ci0KLXN0cnVjdCBkZXZfY29uZmlnIHsKLQl1MzIgc2FtcGxlX3JhdGU7Ci0JdTMyIGJpdF9mb3JtYXQ7Ci0JdTMyIGNoYW5uZWxzOwotfTsKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBpbnRfbWkyc19jZmdbXSA9IHsKLQlbSU5UMF9NSTJTXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi0JW0lOVDFfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtJTlQyX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW0lOVDNfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtJTlQ0X01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbSU5UNV9NSTJTXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi0JW0lOVDZfTUkyU10gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi19OwotCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgYnRfZm1fY2ZnW10gPSB7Ci0JW0JUX1NMSU03XSA9IHtTQU1QTElOR19SQVRFXzhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbRk1fU0xJTThdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBjaGFyIGNvbnN0ICppbnRfbWkyc19yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKLQkJCQkJICAgIktIWl8zMiIsICJLSFpfNDRQMSIsICJLSFpfNDgiLAotCQkJCQkgICAiS0haXzk2IiwgIktIWl8xOTIifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbnRfbWkyc19jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28ifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpbnRfbWkyc190eF9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLAotCQkJCQkJIlRocmVlIiwgIkZvdXIifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICpiaXRfZm9ybWF0X3RleHRbXSA9IHsiUzE2X0xFIiwgIlMyNF9MRSIsICJTMjRfM0xFIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9vcGJhY2tfbWNsa190ZXh0W10gPSB7IkRJU0FCTEUiLCAiRU5BQkxFIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqYnRfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTYiLCAiS0haXzQ4In07Ci0KLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50MF9taTJzX3J4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQwX21pMnNfcnhfY2hzLCBpbnRfbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50MF9taTJzX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50Ml9taTJzX3R4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQyX21pMnNfdHhfY2hzLCBpbnRfbWkyc190eF9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50Ml9taTJzX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50M19taTJzX3R4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQzX21pMnNfdHhfY2hzLCBpbnRfbWkyc190eF9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50M19taTJzX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NF9taTJzX3J4X3NhbXBsZV9yYXRlLCBpbnRfbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChpbnQ0X21pMnNfcnhfY2hzLCBpbnRfbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NF9taTJzX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woaW50NV9taTJzX3R4X2NocywgaW50X21pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGxvb3BiYWNrX21jbGtfZW4sIGxvb3BiYWNrX21jbGtfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGJ0X3NhbXBsZV9yYXRlLCBidF9zYW1wbGVfcmF0ZV90ZXh0KTsKLQotc3RhdGljIGludCBtc21fZG1pY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7Ci1zdGF0aWMgaW50IG1zbV9pbnRfZW5hYmxlX2RpZ19jZGNfY2xrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGVuYWJsZSwKLQkJCQkgICAgICBib29sIGRhcG0pOwotc3RhdGljIGludCBtc21faW50X21jbGswX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJICAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCk7Ci1zdGF0aWMgaW50IG1zbV9pbnRfbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7Ci1zdGF0aWMgdm9pZCBtc21faW50X21pMnNfc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKLQotc3RhdGljIHN0cnVjdCB3Y2RfbWJoY19jb25maWcgKm1iaGNfY2ZnX3B0cjsKLXN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmNvZGVjX3Jvb3Q7Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X2JpdF9mb3JtYXRfdmFsKGludCBiaXRfZm9ybWF0KQotewotCWludCB2YWwgPSAwOwotCi0Jc3dpdGNoIChiaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCXZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X2JpdF9mb3JtYXQoaW50IHZhbCkKLXsKLQlpbnQgYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCi0Jc3dpdGNoICh2YWwpIHsKLQljYXNlIDA6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGJpdF9mbXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBwb3J0X2lkID0gMDsKLQotCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiSU5UMF9NSTJTIiwgc2l6ZW9mKCJJTlQwX01JMlMiKSkpCi0JCXBvcnRfaWQgPSBJTlQwX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIklOVDJfTUkyUyIsIHNpemVvZigiSU5UMl9NSTJTIikpKQotCQlwb3J0X2lkID0gSU5UMl9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJJTlQzX01JMlMiLCBzaXplb2YoIklOVDNfTUkyUyIpKSkKLQkJcG9ydF9pZCA9IElOVDNfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiSU5UNF9NSTJTIiwgc2l6ZW9mKCJJTlQ0X01JMlMiKSkpCi0JCXBvcnRfaWQgPSBJTlQ0X01JMlM7Ci0JZWxzZSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNoYW5uZWw6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBwb3J0X2lkOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBpbnRfbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJaW50X21pMnNfZ2V0X2JpdF9mb3JtYXRfdmFsKGludF9taTJzX2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOwotCi0JcHJfZGVidWcoIiVzOiBpbnRfbWkyc1slZF1fYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgaW50X21pMnNfY2ZnW2NoX251bV0uYml0X2Zvcm1hdCwKLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCWludF9taTJzX2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQotCQlpbnRfbWkyc19nZXRfYml0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaW50X21pMnNbJWRdX3J4X2JpdF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBjaF9udW0sIGludF9taTJzX2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwYXJhbV9pc19tYXNrKGludCBwKQotewotCXJldHVybiAocCA+PSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSykgJiYKLQkJCShwIDw9IFNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfbWFzayAqcGFyYW1fdG9fbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsCi0JCQkJCSAgICAgaW50IG4pCi17Ci0JcmV0dXJuICYocC0+bWFza3NbbiAtIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcmFtX3NldF9tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwgaW50IG4sIHVuc2lnbmVkIGludCBiaXQpCi17Ci0JaWYgKGJpdCA+PSBTTkRSVl9NQVNLX01BWCkKLQkJcmV0dXJuOwotCWlmIChwYXJhbV9pc19tYXNrKG4pKSB7Ci0JCXN0cnVjdCBzbmRfbWFzayAqbSA9IHBhcmFtX3RvX21hc2socCwgbik7Ci0KLQkJbS0+Yml0c1swXSA9IDA7Ci0JCW0tPmJpdHNbMV0gPSAwOwotCQltLT5iaXRzW2JpdCA+PiA1XSB8PSAoMSA8PCAoYml0ICYgMzEpKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGU7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80NFAxS0haOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGludF9taTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCWludF9taTJzX2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJaW50X21pMnNfZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGludF9taTJzX2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpbnRfbWkyc19zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBpbnRfbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJaW50X21pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnRfbWkyc19jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBpbnRfbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IGludF9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBpbnRfbWkyc19jZmdbaWR4XS5jaGFubmVscyk7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGludF9taTJzX2NmZ1tpZHhdLmNoYW5uZWxzIC0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBpbnRfbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlpbnRfbWkyc19jZmdbaWR4XS5jaGFubmVscyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOwotCXByX2RlYnVnKCIlczogaW50X21pMnNfWyVkXV9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGludF9taTJzX2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbXNtX2ludF9kYXBtX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fU1VQUExZX1MoIklOVF9NQ0xLMCIsIC0xLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JbXNtX2ludF9tY2xrMF9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIYW5kc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiU2Vjb25kYXJ5IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljMSIsIG1zbV9kbWljX2V2ZW50KSwKLQlTTkRfU09DX0RBUE1fTUlDKCJEaWdpdGFsIE1pYzIiLCBtc21fZG1pY19ldmVudCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMzIiwgbXNtX2RtaWNfZXZlbnQpLAotCVNORF9TT0NfREFQTV9NSUMoIkRpZ2l0YWwgTWljNCIsIG1zbV9kbWljX2V2ZW50KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2NvbmZpZ19ocGhfY29tcGFuZGVyX2dwaW8oYm9vbCBlbmFibGUsCi0JCQkJCSBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlczogJXMgSFBIIENvbXBhbmRlclxuIiwgX19mdW5jX18sCi0JCWVuYWJsZSA/ICJFbmFibGUiIDogIkRpc2FibGUiKTsKLQotCWlmIChlbmFibGUpIHsKLQkJcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPmNvbXBfZ3Bpb19wKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGFjdGl2YXRlZCAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgImNvbXBfZ3BpbyIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShwZGF0YS0+Y29tcF9ncGlvX3ApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBncGlvIHNldCBjYW5ub3QgYmUgZGUtYWN0aXZhdGVkICVzXG4iLAotCQkJCV9fZnVuY19fLCAiY29tcF9ncGlvIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpc19leHRfc3BrX2dwaW9fc3VwcG9ydChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCSAgIHN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhKQotewotCWNvbnN0IGNoYXIgKnNwa19leHRfcGEgPSAicWNvbSxtc20tc3BrLWV4dC1wYSI7Ci0KLQlwcl9kZWJ1ZygiJXM6RW50ZXJcbiIsIF9fZnVuY19fKTsKLQotCXBkYXRhLT5zcGtfZXh0X3BhX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQlzcGtfZXh0X3BhLCAwKTsKLQotCWlmIChwZGF0YS0+c3BrX2V4dF9wYV9ncGlvIDwgMCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwgX19mdW5jX18sIHNwa19leHRfcGEpOwotCX0gZWxzZSB7Ci0JCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+c3BrX2V4dF9wYV9ncGlvKSkgewotCQkJcHJfZXJyKCIlczogSW52YWxpZCBleHRlcm5hbCBzcGVha2VyIGdwaW86ICVkIiwKLQkJCQlfX2Z1bmNfXywgcGRhdGEtPnNwa19leHRfcGFfZ3Bpbyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbmFibGVfc3BrX2V4dF9wYShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQlpbnQgcmV0OwotCi0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5zcGtfZXh0X3BhX2dwaW8pKSB7Ci0JCXByX2VycigiJXM6IEludmFsaWQgZ3BpbzogJWRcbiIsIF9fZnVuY19fLAotCQkJcGRhdGEtPnNwa19leHRfcGFfZ3Bpbyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6ICVzIGV4dGVybmFsIHNwZWFrZXIgUEFcbiIsIF9fZnVuY19fLAotCQllbmFibGUgPyAiRW5hYmxlIiA6ICJEaXNhYmxlIik7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXJldCA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKAotCQkJCQkJcGRhdGEtPmV4dF9zcGtfZ3Bpb19wKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGRlLWFjdGl2YXRlZCAlc1xuIiwKLQkJCQkJX19mdW5jX18sICJleHRfc3BrX2dwaW8iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnNwa19leHRfcGFfZ3BpbywgZW5hYmxlKTsKLQl9IGVsc2UgewotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+c3BrX2V4dF9wYV9ncGlvLCBlbmFibGUpOwotCQlyZXQgPSBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKAotCQkJCQkJcGRhdGEtPmV4dF9zcGtfZ3Bpb19wKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZ3BpbyBzZXQgY2Fubm90IGJlIGRlLWFjdGl2YXRlZCAlc1xuIiwKLQkJCQkJX19mdW5jX18sICJleHRfc3BrX2dwaW8iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X2lkeF9mcm9tX2JlaWQoaW50MzJfdCBpZCkKLXsKLQlpbnQgaWR4ID0gMDsKLQotCXN3aXRjaCAoaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQwX01JMlNfUlg6Ci0JCWlkeCA9IElOVDBfTUkyUzsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYOgotCQlpZHggPSBJTlQyX01JMlM7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDNfTUkyU19UWDoKLQkJaWR4ID0gSU5UM19NSTJTOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQ0X01JMlNfUlg6Ci0JCWlkeCA9IElOVDRfTUkyUzsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNV9NSTJTX1RYOgotCQlpZHggPSBJTlQ1X01JMlM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlkeCA9IElOVDBfTUkyUzsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludCBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0KLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCXByX2RlYnVnKCIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7Ci0JY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnRkLT5kYWlfbGluazsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0JaW50IGlkeDsKLQotCXByX2RlYnVnKCIlczogZm9ybWF0ID0gJWQsIHJhdGUgPSAlZFxuIiwKLQkJICBfX2Z1bmNfXywgcGFyYW1zX2Zvcm1hdChwYXJhbXMpLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQotCXN3aXRjaCAoZGFpX2xpbmstPmlkKSB7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9JTlQzX01JMlNfVFg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX0lOVDVfTUkyU19UWDoKLQkJaWR4ID0gaW50X21pMnNfZ2V0X2lkeF9mcm9tX2JlaWQoZGFpX2xpbmstPmlkKTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWludF9taTJzX2NmZ1tpZHhdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgaW50X21pMnNfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYnRmbV9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCXN3aXRjaCAoZGFpX2xpbmstPmlkKSB7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCWJ0X2ZtX2NmZ1tCVF9TTElNN10uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IGJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWJ0X2ZtX2NmZ1tCVF9TTElNN10uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYOgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBidF9mbV9jZmdbRk1fU0xJTThdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlidF9mbV9jZmdbRk1fU0xJTThdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KLQkJKGludF9taTJzX2NmZ1tJTlQ1X01JMlNdLmNoYW5uZWxzLzIgLSAxKTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnRfbWkyc19jZmdbSU5UNV9NSTJTXS5jaGFubmVscyA9Ci0JCXJvdW5kdXBfcG93X29mX3R3byh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDIpOwotCi0JcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVkXG4iLAotCQkgX19mdW5jX18sIGludF9taTJzX2NmZ1tJTlQ1X01JMlNdLmNoYW5uZWxzKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21faW50X2VuYWJsZV9kaWdfY2RjX2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgaW50IGVuYWJsZSwgYm9vbCBkYXBtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQlpbnQgY2xrX2ZyZXFfaW5faHo7Ci0JYm9vbCBpbnRfbWNsazBfZnJlcV9jaGcgPSBmYWxzZTsKLQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvZGVjLT5jb21wb25lbnQuY2FyZCk7Ci0JcHJfZGVidWcoIiVzOiBlbmFibGUgJWQgbWNsayByZWYgY291bnRlciAlZFxuIiwKLQkJICAgX19mdW5jX18sIGVuYWJsZSwKLQkJICAgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikpOwotCWlmIChlbmFibGUpIHsKLQkJaWYgKGludF9taTJzX2NmZ1tJTlQwX01JMlNdLnNhbXBsZV9yYXRlID09Ci0JCQkJU0FNUExJTkdfUkFURV80NFAxS0haKSB7Ci0JCQljbGtfZnJlcV9pbl9oeiA9IE5BVElWRV9NQ0xLX1JBVEU7Ci0JCQlwZGF0YS0+bmF0aXZlX2Nsa19zZXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJY2xrX2ZyZXFfaW5faHogPSBwZGF0YS0+bWNsa19mcmVxOwotCQkJcGRhdGEtPm5hdGl2ZV9jbGtfc2V0ID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAocGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmNsa19mcmVxX2luX2h6Ci0JCQkJIT0gY2xrX2ZyZXFfaW5faHopCi0JCQlpbnRfbWNsazBfZnJlcV9jaGcgPSB0cnVlOwotCQlpZiAoIWF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpIHx8Ci0JCQkJaW50X21jbGswX2ZyZXFfY2hnKSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoCi0JCQkJCSZwZGF0YS0+ZGlzYWJsZV9pbnRfbWNsazBfd29yayk7Ci0JCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkgPT0gZmFsc2UgfHwKLQkJCQlpbnRfbWNsazBfZnJlcV9jaGcpIHsKLQkJCQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkpIHsKLQkJCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDA7Ci0JCQkJCWFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCi0JCQkJCQlBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCi0JCQkJCQkmcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrKTsKLQkJCQl9Ci0JCQkJcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmNsa19mcmVxX2luX2h6ID0KLQkJCQkJCQljbGtfZnJlcV9pbl9oejsKLQkJCQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuZW5hYmxlID0gMTsKLQkJCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJCQlBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCi0JCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOwotCQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBlbmFibGUgQ0NMS1xuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJCW11dGV4X3VubG9jaygKLQkJCQkJCSZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCQkJCXJldHVybiByZXQ7Ci0JCQkJfQotCQkJCXByX2RlYnVnKCJlbmFibGVkIGRpZ2l0YWwgY29kZWMgY29yZSBjbGtcbiIpOwotCQkJCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgdHJ1ZSk7Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJfQotCQlhdG9taWNfaW5jKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpOwotCX0gZWxzZSB7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGRhdGEtPmRpc2FibGVfaW50X21jbGswX3dvcmspOwotCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSA9PSB0cnVlKSB7Ci0JCQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuZW5hYmxlID0gMDsKLQkJCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCi0JCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAotCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGRpc2FibGUgQ0NMS1xuIiwKLQkJCQkJCV9fZnVuY19fKTsKLQkJCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgZmFsc2UpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxvb3BiYWNrX21jbGtfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlwcl9kZWJ1ZygiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsb29wYmFja19tY2xrX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKLQlwcl9kZWJ1ZygiJXM6IG1jbGtfcnNjX3JlZiAlZCBlbmFibGUgJWxkXG4iLAotCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpLAotCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDE6Ci0JCXJldCA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHBkYXRhLT5wZG1fZ3Bpb19wKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSB0aGUgcHJpIGdwaW9zOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7Ci0JCQlicmVhazsKLQkJfQotCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCWlmICgoIWF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpKSAmJgotCQkJCSghYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkpKSB7Ci0JCQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuZW5hYmxlID0gMTsKLQkJCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIoCi0JCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAotCQkJCSZwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGspOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIHRoZSBNQ0xLOiAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCW11dGV4X3VubG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOwotCQkJCXJldCA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUoCi0JCQkJCQkJcGRhdGEtPnBkbV9ncGlvX3ApOwotCQkJCWlmIChyZXQpCi0JCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBkaXNhYmxlIHRoZSBwcmkgZ3Bpb3M6ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkLCB0cnVlKTsKLQkJfQotCQltdXRleF91bmxvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQkJYXRvbWljX2luYygmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKTsKLQkJbXNtX2FubGdfY2RjX21jbGtfZW5hYmxlKGNvZGVjLCAxLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgPD0gMCkKLQkJCWJyZWFrOwotCQltc21fYW5sZ19jZGNfbWNsa19lbmFibGUoY29kZWMsIDAsIHRydWUpOwotCQltdXRleF9sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCWlmICgoIWF0b21pY19kZWNfcmV0dXJuKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpKSAmJgotCQkJCShhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkKSkpIHsKLQkJCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5lbmFibGUgPSAwOwotCQkJcmV0ID0gYWZlX3NldF9scGFzc19jbG9ja192MigKLQkJCQlBRkVfUE9SVF9JRF9JTlQwX01JMlNfUlgsCi0JCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBkaXNhYmxlIHRoZSBDQ0xLOiAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCByZXQpOwotCQkJCW11dGV4X3VubG9jaygmcGRhdGEtPmNkY19pbnRfbWNsazBfbXV0ZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYXRvbWljX3NldCgmcGRhdGEtPmludF9tY2xrMF9lbmFibGVkLCBmYWxzZSk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci0JCXJldCA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUocGRhdGEtPnBkbV9ncGlvX3ApOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGRpc2FibGUgdGhlIHByaSBncGlvczogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBVbmV4cGVjdGVkIGlucHV0IHZhbHVlXG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQkvKgotCSAqIFNsaW1idXNfN19SeC9UeCBzYW1wbGUgcmF0ZSB2YWx1ZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBzeW5jIChzYW1lKQotCSAqIHdoZW4gdXNlZCBmb3IgQlRfU0NPIHVzZSBjYXNlLiBSZXR1cm4gZWl0aGVyIFJ4IG9yIFR4IHNhbXBsZSByYXRlCi0JICogdmFsdWUuCi0JICovCi0Jc3dpdGNoIChidF9mbV9jZmdbQlRfU0xJTTddLnNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQlkZWZhdWx0OgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHNhbXBsZSByYXRlID0gJWQiLCBfX2Z1bmNfXywKLQkJIGJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDE6Ci0JCWJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWJ0X2ZtX2NmZ1tCVF9TTElNN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJYnRfZm1fY2ZnW0JUX1NMSU03XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogc2FtcGxlIHJhdGVzOiBzbGltN19yeCA9ICVkLCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sCi0JCSBidF9mbV9jZmdbQlRfU0xJTTddLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1zbV9zbmRfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIklOVDBfTUkyU19SWCBGb3JtYXQiLCBpbnQwX21pMnNfcnhfZm9ybWF0LAotCQkgICAgIGludF9taTJzX2JpdF9mb3JtYXRfZ2V0LCBpbnRfbWkyc19iaXRfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJJTlQyX01JMlNfVFggRm9ybWF0IiwgaW50Ml9taTJzX3R4X2Zvcm1hdCwKLQkJICAgICBpbnRfbWkyc19iaXRfZm9ybWF0X2dldCwgaW50X21pMnNfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiSU5UM19NSTJTX1RYIEZvcm1hdCIsIGludDNfbWkyc190eF9mb3JtYXQsCi0JCSAgICAgaW50X21pMnNfYml0X2Zvcm1hdF9nZXQsIGludF9taTJzX2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDBfTUkyU19SWCBTYW1wbGVSYXRlIiwgaW50MF9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfZ2V0LAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDJfTUkyU19UWCBTYW1wbGVSYXRlIiwgaW50Ml9taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfZ2V0LAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDNfTUkyU19UWCBTYW1wbGVSYXRlIiwgaW50M19taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfZ2V0LAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDBfTUkyU19SWCBDaGFubmVscyIsIGludDBfbWkyc19yeF9jaHMsCi0JCQlpbnRfbWkyc19jaF9nZXQsIGludF9taTJzX2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJJTlQyX01JMlNfVFggQ2hhbm5lbHMiLCBpbnQyX21pMnNfdHhfY2hzLAotCQkJaW50X21pMnNfY2hfZ2V0LCBpbnRfbWkyc19jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiSU5UM19NSTJTX1RYIENoYW5uZWxzIiwgaW50M19taTJzX3R4X2NocywKLQkJCWludF9taTJzX2NoX2dldCwgaW50X21pMnNfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkxvb3BiYWNrIE1DTEsiLCBsb29wYmFja19tY2xrX2VuLAotCQkgICAgIGxvb3BiYWNrX21jbGtfZ2V0LCBsb29wYmFja19tY2xrX3B1dCksCi0JU09DX0VOVU1fRVhUKCJCVCBTYW1wbGVSYXRlIiwgYnRfc2FtcGxlX3JhdGUsCi0JCQltc21fYnRfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbXNtX2J0X3NhbXBsZV9yYXRlX3B1dCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3Nkd19jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiSU5UNF9NSTJTX1JYIEZvcm1hdCIsIGludDRfbWkyc19yeF9mb3JtYXQsCi0JCSAgICAgaW50X21pMnNfYml0X2Zvcm1hdF9nZXQsIGludF9taTJzX2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDRfTUkyU19SWCBTYW1wbGVSYXRlIiwgaW50NF9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfZ2V0LAotCQkJaW50X21pMnNfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIklOVDRfTUkyU19SWCBDaGFubmVscyIsIGludDRfbWkyc19yeF9jaHMsCi0JCQlpbnRfbWkyc19jaF9nZXQsIGludF9taTJzX2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJWSV9GRUVEX1RYIENoYW5uZWxzIiwgaW50NV9taTJzX3R4X2NocywKLQkJICAgICBtc21fdmlfZmVlZF90eF9jaF9nZXQsIG1zbV92aV9mZWVkX3R4X2NoX3B1dCksCi19OwotCi1zdGF0aWMgaW50IG1zbV9kbWljX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JaW50IHJldCA9IDA7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPmRtaWNfZ3Bpb19wKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBhY3RpdmF0ZWQgJXNkIiwKLQkJCQkJX19mdW5jX18sICJkbWljX2dwaW8iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldCA9IG1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUocGRhdGEtPmRtaWNfZ3Bpb19wKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBkZS1hY3RpdmF0ZWQgJXNkIiwKLQkJCQkJX19mdW5jX18sICJkbWljX2dwaW8iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogaW52YWxpZCBEQVBNIGV2ZW50ICVkXG4iLCBfX2Z1bmNfXywgZXZlbnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2ludF9tY2xrMF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0JaW50IHJldCA9IDA7Ci0KLQlwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjb2RlYy0+Y29tcG9uZW50LmNhcmQpOwotCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXByX2RlYnVnKCIlczogbWNsa19yZXNfcmVmID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikpOwotCQlyZXQgPSBtc21fY2RjX3BpbmN0cmxfc2VsZWN0X3NsZWVwX3N0YXRlKHBkYXRhLT5wZG1fZ3Bpb19wKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBkZS1hY3RpdmF0ZWQgJXNkIiwKLQkJCQkJX19mdW5jX18sICJpbnRfcGRtIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSA9PSAwKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGRpc2FibGluZyBNQ0xLXG4iLCBfX2Z1bmNfXyk7Ci0JCQkvKiBkaXNhYmxlIHRoZSBjb2RlYyBtY2xrIGNvbmZpZyovCi0JCQltc21fYW5sZ19jZGNfbWNsa19lbmFibGUoY29kZWMsIDAsIHRydWUpOwotCQkJbXNtX2ludF9lbmFibGVfZGlnX2NkY19jbGsoY29kZWMsIDAsIHRydWUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgREFQTSBldmVudCAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX2dldF9wb3J0X2lkKGludCBpZCkKLXsKLQlpbnQgYWZlX3BvcnRfaWQ7Ci0KLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDBfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UMl9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDJfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDRfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfSU5UNV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX0lOVDVfTUkyU19UWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBpZDogJWRcbiIsIF9fZnVuY19fLCBpZCk7Ci0JCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gYWZlX3BvcnRfaWQ7Ci19Ci0KLXN0YXRpYyBpbnQgaW50X21pMnNfZ2V0X2luZGV4KGludCBwb3J0X2lkKQotewotCWludCBpbmRleDsKLQotCXN3aXRjaCAocG9ydF9pZCkgewotCWNhc2UgQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYOgotCQlpbmRleCA9IElOVDBfTUkyUzsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQyX01JMlNfVFg6Ci0JCWluZGV4ID0gSU5UMl9NSTJTOwotCQlicmVhazsKLQljYXNlIEFGRV9QT1JUX0lEX0lOVDNfTUkyU19UWDoKLQkJaW5kZXggPSBJTlQzX01JMlM7Ci0JCWJyZWFrOwotCWNhc2UgQUZFX1BPUlRfSURfSU5UNF9NSTJTX1JYOgotCQlpbmRleCA9IElOVDRfTUkyUzsKLQkJYnJlYWs7Ci0JY2FzZSBBRkVfUE9SVF9JRF9JTlQ1X01JMlNfVFg6Ci0JCWluZGV4ID0gSU5UNV9NSTJTOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBJbnZhbGlkIHBvcnRfaWQ6ICVkXG4iLCBfX2Z1bmNfXywgcG9ydF9pZCk7Ci0JCWluZGV4ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0X2ludF9taTJzX2JpdHNfcGVyX3NhbXBsZSh1MzIgYml0X2Zvcm1hdCkKLXsKLQl1MzIgYml0X3Blcl9zYW1wbGU7Ci0KLQlzd2l0Y2ggKGJpdF9mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQliaXRfcGVyX3NhbXBsZSA9IDMyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCWJpdF9wZXJfc2FtcGxlID0gMTY7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBiaXRfcGVyX3NhbXBsZTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2ludF9taTJzX2Nsa192YWwoaW50IGlkeCwgaW50IHN0cmVhbSkKLXsKLQl1MzIgYml0X3Blcl9zYW1wbGU7Ci0KLQliaXRfcGVyX3NhbXBsZSA9Ci0JICAgIGdldF9pbnRfbWkyc19iaXRzX3Blcl9zYW1wbGUoaW50X21pMnNfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0JaW50X21pMnNfY2xrW2lkeF0uY2xrX2ZyZXFfaW5faHogPQotCSAgICAoaW50X21pMnNfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgKiAyICogYml0X3Blcl9zYW1wbGUpOwotfQotCi1zdGF0aWMgaW50IGludF9taTJzX3NldF9zY2xrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcnRfaWQgPSAwOwotCWludCBpbmRleDsKLQotCXBvcnRfaWQgPSBpbnRfbWkyc19nZXRfcG9ydF9pZChydGQtPmRhaV9saW5rLT5pZCk7Ci0JaWYgKHBvcnRfaWQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICIlczogSW52YWxpZCBwb3J0X2lkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IHBvcnRfaWQ7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaW5kZXggPSBpbnRfbWkyc19nZXRfaW5kZXgocG9ydF9pZCk7Ci0JaWYgKGluZGV4IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LCAiJXM6IEludmFsaWQgcG9ydF9pZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSBwb3J0X2lkOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChlbmFibGUpIHsKLQkJdXBkYXRlX2ludF9taTJzX2Nsa192YWwoaW5kZXgsIHN1YnN0cmVhbS0+c3RyZWFtKTsKLQkJZGV2X2RiZyhydGQtPmNhcmQtPmRldiwgIiVzOiBjbG9jayByYXRlICV1bFxuIiwgX19mdW5jX18sCi0JCQlpbnRfbWkyc19jbGtbaW5kZXhdLmNsa19mcmVxX2luX2h6KTsKLQl9Ci0KLQlpbnRfbWkyc19jbGtbaW5kZXhdLmVuYWJsZSA9IGVuYWJsZTsKLQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKHBvcnRfaWQsCi0JCQkJICAgICAmaW50X21pMnNfY2xrW2luZGV4XSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogYWZlIGxwYXNzIGNsb2NrIGZhaWxlZCBmb3IgcG9ydCAweCV4ICwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHBvcnRfaWQsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fc2R3X21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0KLQlyZXQgPSBpbnRfbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIHRydWUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byBlbmFibGUgc2NsayAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogc2V0IGZtdCBjcHUgZGFpIGZhaWxlZDsgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9zZHdfbWkyc19zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldDsKLQotCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0KLQlyZXQgPSBpbnRfbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczpjbG9jayBkaXNhYmxlIGZhaWxlZDsgcmV0PSVkXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotfQotCi1zdGF0aWMgaW50IG1zbV9pbnRfbWkyc19zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpc1tBTkFfQ0RDXS0+Y29kZWM7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBOVUxMOwotCi0JcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY29kZWMtPmNvbXBvbmVudC5jYXJkKTsKLQlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCi0JcmV0ID0gaW50X21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCB0cnVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIHNjbGsgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9ICBtc21faW50X2VuYWJsZV9kaWdfY2RjX2Nsayhjb2RlYywgMSwgdHJ1ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJmYWlsZWQgdG8gZW5hYmxlIG1jbGtcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkvKiBFbmFibGUgdGhlIGNvZGVjIG1jbGsgY29uZmlnICovCi0JcmV0ID0gbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPnBkbV9ncGlvX3ApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGdwaW8gc2V0IGNhbm5vdCBiZSBhY3RpdmF0ZWQgJXNcbiIsCi0JCQkJX19mdW5jX18sICJpbnRfcGRtIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCW1zbV9hbmxnX2NkY19tY2xrX2VuYWJsZShjb2RlYywgMSwgdHJ1ZSk7Ci0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChjcHVfZGFpLCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczogc2V0IGZtdCBjcHUgZGFpIGZhaWxlZDsgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pbnRfbWkyc19zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQotCXByX2RlYnVnKCIlcygpOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJc3Vic3RyZWFtLT5uYW1lLCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0KLQlyZXQgPSBpbnRfbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcHJfZXJyKCIlczpjbG9jayBkaXNhYmxlIGZhaWxlZDsgcmV0PSVkXG4iLCBfX2Z1bmNfXywKLQkJCQlyZXQpOwotCWlmIChhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSA+IDApIHsKLQkJYXRvbWljX2RlYygmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKTsKLQkJcHJfZGVidWcoIiVzOiBkZWNyZW1lbnRpbmcgbWNsa19yZXNfcmVmICVkXG4iLAotCQkJIF9fZnVuY19fLAotCQkJIGF0b21pY19yZWFkKCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkICpkZWZfbXNtX2ludF93Y2RfbWJoY19jYWwodm9pZCkKLXsKLQl2b2lkICptc21faW50X3djZF9jYWw7Ci0Jc3RydWN0IHdjZF9tYmhjX2J0bl9kZXRlY3RfY2ZnICpidG5fY2ZnOwotCXUxNiAqYnRuX2xvdywgKmJ0bl9oaWdoOwotCi0JbXNtX2ludF93Y2RfY2FsID0ga3phbGxvYyhXQ0RfTUJIQ19DQUxfU0laRShXQ0RfTUJIQ19ERUZfQlVUVE9OUywKLQkJCQlXQ0RfTUJIQ19ERUZfUkxPQURTKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21faW50X3djZF9jYWwpCi0JCXJldHVybiBOVUxMOwotCi0jZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfUExVR19UWVBFX1BUUihtc21faW50X3djZF9jYWwpLT5YKSA9IChZKSkKLQlTKHZfaHNfbWF4LCAxNTAwKTsKLSN1bmRlZiBTCi0jZGVmaW5lIFMoWCwgWSkgKChXQ0RfTUJIQ19DQUxfQlROX0RFVF9QVFIobXNtX2ludF93Y2RfY2FsKS0+WCkgPSAoWSkpCi0JUyhudW1fYnRuLCBXQ0RfTUJIQ19ERUZfQlVUVE9OUyk7Ci0jdW5kZWYgUwotCi0KLQlidG5fY2ZnID0gV0NEX01CSENfQ0FMX0JUTl9ERVRfUFRSKG1zbV9pbnRfd2NkX2NhbCk7Ci0JYnRuX2xvdyA9IGJ0bl9jZmctPl92X2J0bl9sb3c7Ci0JYnRuX2hpZ2ggPSAoKHZvaWQgKikmYnRuX2NmZy0+X3ZfYnRuX2xvdykgKwotCQkoc2l6ZW9mKGJ0bl9jZmctPl92X2J0bl9sb3dbMF0pICogYnRuX2NmZy0+bnVtX2J0bik7Ci0KLQkvKgotCSAqIEluIFNXIHdlIGFyZSBtYWludGFpbmluZyB0d28gc2V0cyBvZiB0aHJlc2hvbGQgcmVnaXN0ZXIKLQkgKiBvbmUgZm9yIGN1cnJlbnQgc291cmNlIGFuZCBhbm90aGVyIGZvciBNaWNiaWFzLgotCSAqIGFsbCBidG5fbG93IGNvcnJlc3BvbmRzIHRvIHRocmVzaG9sZCBmb3IgY3VycmVudCBzb3VyY2UKLQkgKiBhbGwgYnRfaGlnaCBjb3JyZXNwb25kcyB0byB0aHJlc2hvbGQgZm9yIE1pY2JpYXMKLQkgKiBCZWxvdyB0aHJlc2hvbGRzIGFyZSBiYXNlZCBvbiBmb2xsb3dpbmcgcmVzaXN0YW5jZXMKLQkgKiAwLTcwICAgID09IEJ1dHRvbiAwCi0JICogMTEwLTE4MCA9PSBCdXR0b24gMQotCSAqIDIxMC0yOTAgPT0gQnV0dG9uIDIKLQkgKiAzNjAtNjgwID09IEJ1dHRvbiAzCi0JICovCi0JYnRuX2xvd1swXSA9IDc1OwotCWJ0bl9oaWdoWzBdID0gNzU7Ci0JYnRuX2xvd1sxXSA9IDE1MDsKLQlidG5faGlnaFsxXSA9IDE1MDsKLQlidG5fbG93WzJdID0gMjI1OwotCWJ0bl9oaWdoWzJdID0gMjI1OwotCWJ0bl9sb3dbM10gPSA0NTA7Ci0JYnRuX2hpZ2hbM10gPSA0NTA7Ci0JYnRuX2xvd1s0XSA9IDUwMDsKLQlidG5faGlnaFs0XSA9IDUwMDsKLQotCXJldHVybiBtc21faW50X3djZF9jYWw7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZHJ4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqZGlnX2NkYyA9IHJ0ZC0+Y29kZWNfZGFpc1tESUdfQ0RDXS0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmFuYV9jZGMgPSBydGQtPmNvZGVjX2RhaXNbQU5BX0NEQ10tPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oYW5hX2NkYyk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCWludCByZXQgPSAtRU5PTUVNOwotCi0JcHJfZGVidWcoIiVzKCksZGV2X25hbWUlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGNwdV9kYWktPmRldikpOwotCi0JcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoYW5hX2NkYywgbXNtX3NuZF9jb250cm9scywKLQkJCQkgICBBUlJBWV9TSVpFKG1zbV9zbmRfY29udHJvbHMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZGRfY29kZWNfY29udHJvbHMgZmFpbGVkOiAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhhbmFfY2RjLCBtc21fY29tbW9uX3NuZF9jb250cm9scywKLQkJCQkgICBtc21fY29tbW9uX3NuZF9jb250cm9sc19zaXplKCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiJXM6IGFkZCBjb21tb24gc25kIGNvbnRyb2xzIGZhaWxlZDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1zbV9pbnRfZGFwbV93aWRnZXRzLAotCQkJCSAgQVJSQVlfU0laRShtc21faW50X2RhcG1fd2lkZ2V0cykpOwotCi0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJIYW5kc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGVhZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNlY29uZGFyeSBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMyIik7Ci0KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkVBUiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSEVBRFBIT05FIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUEtfT1VUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTUlDMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU1JQzIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFNSUMzIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRE1JQzIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRNSUMzIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJETUlDNCIpOwotCi0Jc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7Ci0KLQltc21fYW5sZ19jZGNfc3BrX2V4dF9wYV9jYihlbmFibGVfc3BrX2V4dF9wYSwgYW5hX2NkYyk7Ci0JbXNtX2RpZ19jZGNfaHBoX2NvbXBfY2IobXNtX2NvbmZpZ19ocGhfY29tcGFuZGVyX2dwaW8sIGRpZ19jZGMpOwotCi0JY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7Ci0JaWYgKCFjb2RlY19yb290KQotCQljb2RlY19yb290ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjYXJkLT5tb2R1bGUsICJjb2RlY3MiLAotCQkJCQkJICAgICAgY2FyZC0+cHJvY19yb290KTsKLQlpZiAoIWNvZGVjX3Jvb3QpIHsKLQkJcHJfZGVidWcoIiVzOiBDYW5ub3QgY3JlYXRlIGNvZGVjcyBtb2R1bGUgZW50cnlcbiIsCi0JCQkgX19mdW5jX18pOwotCQlnb3RvIGRvbmU7Ci0JfQotCXBkYXRhLT5jb2RlY19yb290ID0gY29kZWNfcm9vdDsKLQltc21fZGlnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KGNvZGVjX3Jvb3QsIGRpZ19jZGMpOwotCW1zbV9hbmxnX2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KGNvZGVjX3Jvb3QsIGFuYV9jZGMpOwotZG9uZToKLQltc21fc2V0X2NvZGVjX3JlZ19kb25lKHRydWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zZHdfYXVkcnhfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkJCXNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICphdXhfY29tcDsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0KLQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3Nkd19jb250cm9scywKLQkJCUFSUkFZX1NJWkUobXNtX3Nkd19jb250cm9scykpOwotCi0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxX1NEVyBQbGF5YmFjayIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklmZWVkX1NEVyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiU1BLMSBPVVQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzIgT1VUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBSUYxX1NEVyBWSSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklJTlBVVF9TRFciKTsKLQotCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOwotCi0JLyoKLQkgKiBTZW5kIHNwZWFrZXIgY29uZmlndXJhdGlvbiBvbmx5IGZvciBXU0E4ODEwLgotCSAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBmb3IgV1NBODgxNS4KLQkgKi8KLQlwcl9kZWJ1ZygiJXM6IE51bWJlciBvZiBhdXggZGV2aWNlczogJWRcbiIsCi0JCSBfX2Z1bmNfXywgcnRkLT5jYXJkLT5udW1fYXV4X2RldnMpOwotCWlmIChydGQtPmNhcmQtPm51bV9hdXhfZGV2cyAmJgotCQkhbGlzdF9lbXB0eSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0KSkgewotCQlhdXhfY29tcCA9IGxpc3RfZmlyc3RfZW50cnkoJnJ0ZC0+Y2FyZC0+YXV4X2NvbXBfbGlzdCwKLQkJCQkJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50LCBsaXN0X2F1eCk7Ci0JCWlmICghc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMSkgfHwKLQkJCSFzdHJjbXAoYXV4X2NvbXAtPm5hbWUsIFdTQTg4MTBfTkFNRV8yKSkgewotCQkJbXNtX3Nkd19zZXRfc3Brcl9tb2RlKHJ0ZC0+Y29kZWMsIFNQS1JfTU9ERV8xKTsKLQkJCW1zbV9zZHdfc2V0X3Nwa3JfZ2Fpbl9vZmZzZXQocnRkLT5jb2RlYywKLQkJCQkJCSAgIFJYX0dBSU5fT0ZGU0VUX00xUDVfREIpOwotCQl9Ci0JfQotCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWlmICghY29kZWNfcm9vdCkKLQkJY29kZWNfcm9vdCA9IHNuZF9pbmZvX2NyZWF0ZV9zdWJkaXIoY2FyZC0+bW9kdWxlLCAiY29kZWNzIiwKLQkJCQkJCSAgICAgIGNhcmQtPnByb2Nfcm9vdCk7Ci0JaWYgKCFjb2RlY19yb290KSB7Ci0JCXByX2RlYnVnKCIlczogQ2Fubm90IGNyZWF0ZSBjb2RlY3MgbW9kdWxlIGVudHJ5XG4iLAotCQkJIF9fZnVuY19fKTsKLQkJZ290byBkb25lOwotCX0KLQlwZGF0YS0+Y29kZWNfcm9vdCA9IGNvZGVjX3Jvb3Q7Ci0JbXNtX3Nkd19jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShjb2RlY19yb290LCBjb2RlYyk7Ci1kb25lOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV93Y25faW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXVuc2lnbmVkIGludCByeF9jaFtXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYXSA9IHsxNTcsIDE1OH07Ci0JdW5zaWduZWQgaW50IHR4X2NoW1dDTl9DRENfU0xJTV9UWF9DSF9NQVhdICA9IHsxNTksIDE2MCwgMTYxfTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCi0JcmV0dXJuIHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjb2RlY19kYWksIEFSUkFZX1NJWkUodHhfY2gpLAotCQkJCQkgICB0eF9jaCwgQVJSQVlfU0laRShyeF9jaCksIHJ4X2NoKTsKLX0KLQotc3RhdGljIGludCBtc21fd2NuX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7Ci0JdTMyIHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdLCB0eF9jaFtXQ05fQ0RDX1NMSU1fVFhfQ0hfTUFYXTsKLQl1MzIgcnhfY2hfY250ID0gMCwgdHhfY2hfY250ID0gMDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhydGQtPmRldiwgIiVzOiAlc190eF9kYWlfaWRfJWRcbiIsIF9fZnVuY19fLAotCQkgY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkKTsKLQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCSAmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihydGQtPmRldiwKLQkJCSIlczogZmFpbGVkIHRvIGdldCBCVEZNIGNvZGVjIGNoYW4gbWFwXG4sIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZGV2X2RiZyhydGQtPmRldiwgIiVzOiB0eF9jaF9jbnQoJWQpIGlkICVkXG4iLAotCQlfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJCSAgdHhfY2hfY250LCB0eF9jaCwgcnhfY2hfY250LCByeF9jaCk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayh1MTYgcG9ydF9pZCwgaW50IHNsb3Rfd2lkdGgsCi0JCQkJCSAgICBpbnQgc2xvdHMpCi17Ci0JdW5zaWduZWQgaW50IHNsb3RfbWFzayA9IDA7Ci0JaW50IGksIGo7Ci0JdW5zaWduZWQgaW50ICpzbG90X29mZnNldDsKLQotCWZvciAoaSA9IFRETV8wOyBpIDwgVERNX1BPUlRfTUFYOyBpKyspIHsKLQkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbaV07Ci0KLQkJZm9yIChqID0gMDsgaiA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGorKykgewotCQkJaWYgKHNsb3Rfb2Zmc2V0W2pdICE9IEFGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUQpCi0JCQkJc2xvdF9tYXNrIHw9Ci0JCQkJKDEgPDwgKChzbG90X29mZnNldFtqXSAqIDgpIC8gc2xvdF93aWR0aCkpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHNsb3RfbWFzazsKLX0KLQotc3RhdGljIGludCBtc21fdGRtX3NuZF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCWludCByZXQgPSAwOwotCWludCBjaGFubmVscywgc2xvdF93aWR0aCwgc2xvdHM7Ci0JdW5zaWduZWQgaW50IHNsb3RfbWFzazsKLQl1bnNpZ25lZCBpbnQgKnNsb3Rfb2Zmc2V0OwotCWludCBvZmZzZXRfY2hhbm5lbHMgPSAwOwotCWludCBpOwotCi0JcHJfZGVidWcoIiVzOiBkYWkgaWQgPSAweCV4XG4iLCBfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOwotCi0JY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKLQlzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQljYXNlIDM6Ci0JY2FzZSA0OgotCWNhc2UgNToKLQljYXNlIDY6Ci0JY2FzZSA3OgotCWNhc2UgODoKLQkJc3dpdGNoIChwYXJhbXNfZm9ybWF0KHBhcmFtcykpIHsKLQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJLyoKLQkJICogdXAgdG8gOCBjaGFubmVscyBIVyBjb25maWcgc2hvdWxkCi0JCSAqIHVzZSAzMiBiaXQgc2xvdCB3aWR0aCBmb3IgbWF4IHN1cHBvcnQgb2YKLQkJICogc3RyZWFtIGJpdCB3aWR0aC4gKHNsb3Rfd2lkdGggPiBiaXRfd2lkdGgpCi0JCSAqLwotCQkJc2xvdF93aWR0aCA9IDMyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGZvcm1hdCAweCV4XG4iLAotCQkJCV9fZnVuY19fLCBwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc2xvdHMgPSA4OwotCQlzbG90X21hc2sgPSB0ZG1fcGFyYW1fc2V0X3Nsb3RfbWFzayhjcHVfZGFpLT5pZCwKLQkJCQkJCSAgICBzbG90X3dpZHRoLAotCQkJCQkJICAgIHNsb3RzKTsKLQkJaWYgKCFzbG90X21hc2spIHsKLQkJCXByX2VycigiJXM6IGludmFsaWQgc2xvdF9tYXNrIDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHNsb3RfbWFzayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHBhcmFtIGNoYW5uZWxzICVkXG4iLAotCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCi0Jc3dpdGNoIChjcHVfZGFpLT5pZCkgewotCWNhc2UgQUZFX1BPUlRfSURfUFJJTUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfVEVSVElBUllfVERNX1JYOgotCWNhc2UgQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fVFg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9UWDoKLQkJc2xvdF9vZmZzZXQgPSB0ZG1fc2xvdF9vZmZzZXRbVERNXzBdOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBkYWkgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFRETV9TTE9UX09GRlNFVF9NQVg7IGkrKykgewotCQlpZiAoc2xvdF9vZmZzZXRbaV0gIT0gQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRCkKLQkJCW9mZnNldF9jaGFubmVscysrOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAob2Zmc2V0X2NoYW5uZWxzID09IDApIHsKLQkJcHJfZXJyKCIlczogc2xvdCBvZmZzZXQgbm90IHN1cHBvcnRlZCwgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAotCQkJX19mdW5jX18sIG9mZnNldF9jaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjaGFubmVscyA+IG9mZnNldF9jaGFubmVscykgewotCQlwcl9lcnIoIiVzOiBjaGFubmVscyAlZCBleGNlZWQgb2Zmc2V0X2NoYW5uZWxzICVkXG4iLAotCQkJX19mdW5jX18sIGNoYW5uZWxzLCBvZmZzZXRfY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMCwgc2xvdF9tYXNrLAotCQkJCQkgICAgICAgc2xvdHMsIHNsb3Rfd2lkdGgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgTlVMTCwKLQkJCQkJCSAgY2hhbm5lbHMsIHNsb3Rfb2Zmc2V0KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2hhbm5lbCBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGNwdV9kYWksIHNsb3RfbWFzaywgMCwKLQkJCQkJICAgICAgIHNsb3RzLCBzbG90X3dpZHRoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgdGRtIHNsb3QsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZW5kOwotCQl9Ci0KLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksIGNoYW5uZWxzLAotCQkJCQkJICBzbG90X29mZnNldCwgMCwgTlVMTCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLWVuZDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0JY29uc3QgY2hhciAqYmVfZGxfbmFtZSA9IExQQVNTX0JFX0lOVDBfTUkyU19SWDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqYW5hX2NkYzsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCWludCByZXQgPSAwOwotCi0JcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7Ci0JaWYgKCFydGQpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsCi0JCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAotCQkJX19mdW5jX18sIGJlX2RsX25hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhbmFfY2RjID0gcnRkLT5jb2RlY19kYWlzW0FOQV9DRENdLT5jb2RlYzsKLQltYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uID0gZGVmX21zbV9pbnRfd2NkX21iaGNfY2FsKCk7Ci0JaWYgKCFtYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IG1zbV9hbmxnX2NkY19oc19kZXRlY3QoYW5hX2NkYywgbWJoY19jZmdfcHRyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJIiVzOiBtc21fYW5sZ19jZGNfaHNfZGV0ZWN0IGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlrZnJlZShtYmhjX2NmZ19wdHItPmNhbGlicmF0aW9uKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV90ZG1fYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fdGRtX3NuZF9od19wYXJhbXMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3djbl9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV93Y25faHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fbWkyc19iZV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBtc21fbWkyc19zbmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBtc21fbWkyc19zbmRfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9hdXhfcGNtX2JlX29wcyA9IHsKLQkuc3RhcnR1cCA9IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9hdXhfcGNtX3NuZF9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2ludF9taTJzX2JlX29wcyA9IHsKLQkuc3RhcnR1cCA9IG1zbV9pbnRfbWkyc19zbmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBtc21faW50X21pMnNfc25kX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fc2R3X21pMnNfYmVfb3BzID0gewotCS5zdGFydHVwID0gbXNtX3Nkd19taTJzX3NuZF9zdGFydHVwLAotCS5zaHV0ZG93biA9IG1zbV9zZHdfbWkyc19zbmRfc2h1dGRvd24sCi19OwotCi1zdHJ1Y3Qgc25kX3NvY19kYWlfbGlua19jb21wb25lbnQgZGxjX3J4MVtdID0gewotCXsKLQkJLm9mX25vZGUgPSBOVUxMLAotCQkuZGFpX25hbWUgPSAibXNtX2RpZ19jZGNfZGFpX3J4MSIsCi0JfSwKLQl7Ci0JCS5vZl9ub2RlID0gTlVMTCwKLQkJLmRhaV9uYW1lICA9ICJtc21fYW5sZ19jZGNfaTJzX3J4MSIsCi0JfSwKLX07Ci0KLXN0cnVjdCBzbmRfc29jX2RhaV9saW5rX2NvbXBvbmVudCBkbGNfdHgxW10gPSB7Ci0JewotCQkub2Zfbm9kZSA9IE5VTEwsCi0JCS5kYWlfbmFtZSA9ICJtc21fZGlnX2NkY19kYWlfdHgxIiwKLQl9LAotCXsKLQkJLm9mX25vZGUgPSBOVUxMLAotCQkuZGFpX25hbWUgID0gIm1zbV9hbmxnX2NkY19pMnNfdHgxIiwKLQl9LAotfTsKLQotc3RydWN0IHNuZF9zb2NfZGFpX2xpbmtfY29tcG9uZW50IGRsY190eDJbXSA9IHsKLQl7Ci0JCS5vZl9ub2RlID0gTlVMTCwKLQkJLmRhaV9uYW1lID0gIm1zbV9kaWdfY2RjX2RhaV90eDIiLAotCX0sCi0JewotCQkub2Zfbm9kZSA9IE5VTEwsCi0JCS5kYWlfbmFtZSAgPSAibXNtX2FubGdfY2RjX2kyc190eDIiLAotCX0sCi19OwotCi0vKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tLT4gQ1BVICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2ludF9kYWlbXSA9IHsKLQkvKiBGcm9udEVuZCBEQUkgTGlua3MgKi8KLQl7LyogaHc6eCwwICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTEpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWExIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAotCQkuZHluYW1pYyA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKLQl9LAotCXsvKiBodzp4LDEgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKE1lZGlhMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMiIsCi0JCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhMiIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUEyLAotCX0sCi0Jey8qIGh3OngsMiAqLwotCQkubmFtZSA9ICJWb2ljZU1Nb2RlMSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9WT0lDRU1NT0RFMSwKLQl9LAotCXsvKiBodzp4LDMgKi8KLQkJLm5hbWUgPSAiTVNNIFZvSVAiLAotCQkuc3RyZWFtX25hbWUgPSAiVm9JUCIsCi0JCS5jcHVfZGFpX25hbWUJPSAiVm9JUCIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tdm9pcC1kc3AiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JUCwKLQl9LAotCXsvKiBodzp4LDQgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTCksCi0JCS5zdHJlYW1fbmFtZSA9ICJVTEwiLAotCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWEzIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjIiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMywKLQl9LAotCS8qIEhvc3RsZXNzIFBDTSBwdXJwb3NlICovCi0Jey8qIGh3OngsNSAqLwotCQkubmFtZSA9ICJJTlQ0IE1JMlNfUlggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiSU5UNCBNSTJTX1JYIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJJTlQ0X01JMlNfUlhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZQk9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLyogVGhpcyBkYWlubGluayBoYXMgTUkyUyBzdXBwb3J0ICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsNiAqLwotCQkubmFtZSA9ICJNU00gQUZFLVBDTSBSWCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgUlgiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MSIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi0Jey8qIGh3OngsNyAqLwotCQkubmFtZSA9ICJNU00gQUZFLVBDTSBUWCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUtUFJPWFkgVFgiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI0MCIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1hZmUiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0Jey8qIGh3OngsOCAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MxKSwKLQkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMSIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTQiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNCwKLQl9LAotCXsvKiBodzp4LDkqLwotCQkubmFtZSA9ICJBVVhQQ00gSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSAgID0gIkFVWFBDTV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMTAgKi8KLQkJLm5hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMSBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzFfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwgLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCwxMSAqLwotCQkubmFtZSA9ICJJTlQzIE1JMlNfVFggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiSU5UMyBNSTJTX1RYIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJJTlQzX01JMlNfVFhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMTIgKi8KLQkJLm5hbWUgPSAiU0xJTUJVU183IEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfNyBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzdfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwgLyogZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCwxMyAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTG93TGF0ZW5jeSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSIsCi0JCS5jcHVfZGFpX25hbWUgICA9ICJNdWx0aU1lZGlhNSIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWRzcC4xIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNSwKLQl9LAotCS8qIExTTSBGRSAqLwotCXsvKiBodzp4LDE0ICovCi0JCS5uYW1lID0gIkxpc3RlbiAxIEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDEgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9MU00xLAotCX0sCi0Jey8qIGh3OngsMTUgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczIiLAotCQkuY3B1X2RhaV9uYW1lICAgPSAiTXVsdGlNZWRpYTciLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCi0JfSwKLQl7LyogaHc6eCwxNiAqLwotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTXVsdGlNZWRpYTEwKSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWExMCIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTEwIiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAotCX0sCi0Jey8qIGh3OngsMTcgKi8KLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKFVMTF9OT0lSUSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNTV9OT0lSUSIsCi0JCS5jcHVfZGFpX25hbWUJPSAiTXVsdGlNZWRpYTgiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOCwKLQl9LAotCXsvKiBodzp4LDE4ICovCi0JCS5uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAotCQkuc3RyZWFtX25hbWUgPSAiSERNSV9SWF9IT1NUTEVTUyIsCi0JCS5jcHVfZGFpX25hbWUJPSAiSERNSV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDE5ICovCi0JCS5uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlTU1vZGUyIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tdm9pY2UiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUyLAotCX0sCi0Jey8qIGh3OngsMjAgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gMiBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU00yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCi0JfSwKLQl7LyogaHc6eCwyMSAqLwotCQkubmFtZSA9ICJMaXN0ZW4gMyBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNMywKLQl9LAotCXsvKiBodzp4LDIyICovCi0JCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9MU000LAotCX0sCi0Jey8qIGh3OngsMjMgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNSBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU001IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCi0JfSwKLQl7LyogaHc6eCwyNCAqLwotCQkubmFtZSA9ICJMaXN0ZW4gNiBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNNgotCX0sCi0Jey8qIGh3OngsMjUgKi8KLQkJLm5hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMaXN0ZW4gNyBBdWRpbyBTZXJ2aWNlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMU003IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWxzbS1jbGllbnQiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCi0JfSwKLQl7LyogaHc6eCwyNiAqLwotCQkubmFtZSA9ICJMaXN0ZW4gOCBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTgiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCB9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTFNNOCwKLQl9LAotCXsvKiBodzp4LDI3ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTkpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkiLAotCQkuY3B1X2RhaV9uYW1lCT0gIk11bHRpTWVkaWE5IiwKLQkJLnBsYXRmb3JtX25hbWUgID0gIm1zbS1wY20tZHNwLjAiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBOSwKLQl9LAotCXsvKiBodzp4LDI4ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczQpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M0IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTEiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMSwKLQl9LAotCXsvKiBodzp4LDI5ICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczUpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTIiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMiwKLQl9LAotCXsvKiBodzp4LDMwICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczYpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M2IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTMiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExMywKLQl9LAotCXsvKiBodzp4LDMxICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczcpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M3IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTQiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNCwKLQl9LAotCXsvKiBodzp4LDMyICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczgpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTUiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNSwKLQl9LAotCXsvKiBodzp4LDMzICovCi0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTExfTk9JUlFfMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJNTV9OT0lSUV8yIiwKLQkJLmNwdV9kYWlfbmFtZQk9ICJNdWx0aU1lZGlhMTYiLAotCQkucGxhdGZvcm1fbmFtZSAgPSAibXNtLXBjbS1kc3Atbm9pcnEiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpIGxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTYsCi0JfSwKLQl7LyogaHc6eCwzNCAqLwotCQkubmFtZSA9ICJTTElNQlVTXzggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMzUgKi8KLQkJLm5hbWUgPSAiUHJpbWFyeSBNSTJTX1JYIEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyU19SWCBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiUFJJX01JMlNfUlhfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZQk9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJIC8qIHRoaXMgZGFpbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLyogVGhpcyBkYWlubGluayBoYXMgTUkyUyBzdXBwb3J0ICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0Jey8qIGh3OngsMzYgKi8KLQkJLm5hbWUgPSAiU2Vjb25kYXJ5IE1JMlNfUlggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlNfUlggSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNFQ19NSTJTX1JYX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUJPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS8qIFRoaXMgZGFpbmxpbmsgaGFzIE1JMlMgc3VwcG9ydCAqLwotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDM3ICovCi0JCS5uYW1lID0gIlRlcnRpYXJ5IE1JMlNfUlggSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyU19SWCBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVEVSVF9NSTJTX1JYX0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUJPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS8qIFRoaXMgZGFpbmxpbmsgaGFzIE1JMlMgc3VwcG9ydCAqLwotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsvKiBodzp4LDM4ICovCi0JCS5uYW1lID0gIklOVDAgTUkyU19SWCBIb3N0bGVzcyIsCi0JCS5zdHJlYW1fbmFtZSA9ICJJTlQwIE1JMlNfUlggSG9zdGxlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gIklOVDBfTUkyU19SWF9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lCT0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkvKiBUaGlzIGRhaW5saW5rIGhhcyBNSTJTIHN1cHBvcnQgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLQl7LyogaHc6eCwzOSAqLwotCQkubmFtZSA9ICJTRE02NjAgSEZQIFRYIiwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE2IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNiIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWxvb3BiYWNrIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTYsCi0JfSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9pbnRfd3NhX2RhaVtdID0gewotCXsvKiBodzp4LDQwICovCi0JCS5uYW1lID0gTFBBU1NfQkVfSU5UNV9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiSU5UNV9taTJzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuY29kZWNfbmFtZSA9ICJtc21fc2R3X2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbV9zZHdfdmlmZWVkYmFjayIsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTlQ1X01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBpbnRfbWkyc19iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3Nkd19taTJzX2JlX29wcywKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2ludF9iZV9kYWlbXSA9IHsKLQkvKiBCYWNrZW5kIEkyUyBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5UMF9NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiSU5UMCBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuNyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY3MgPSBkbGNfcngxLAotCQkubnVtX2NvZGVjcyA9IENPREVDU19NQVgsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSB8Ci0JCQlBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UMF9NSTJTX1JYLAotCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGludF9taTJzX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21faW50X21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0lOVDNfTUkyU19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIklOVDMgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMTAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNzID0gZGxjX3R4MSwKLQkJLm51bV9jb2RlY3MgPSBDT0RFQ1NfTUFYLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5hc3luY19vcHMgPSBBU1lOQ19EUENNX1NORF9TT0NfUFJFUEFSRSB8Ci0JCQlBU1lOQ19EUENNX1NORF9TT0NfSFdfUEFSQU1TLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UM19NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gaW50X21pMnNfYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9pbnRfbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5UMl9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiSU5UMiBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy45IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjcyA9IGRsY190eDIsCi0JCS5udW1fY29kZWNzID0gQ09ERUNTX01BWCwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUgfAotCQkJQVNZTkNfRFBDTV9TTkRfU09DX0hXX1BBUkFNUywKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOVDJfTUkyU19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGludF9taTJzX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21faW50X21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjIyNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQUZFX1BDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIEluY2FsbCBSZWNvcmQgVXBsaW5rIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0lOQ0FMTF9SRUNPUkRfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZSBVcGxpbmsgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSAgICAgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIFJlY29yZCBEb3dubGluayBCQUNLIEVORCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9JTkNBTExfUkVDT1JEX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRG93bmxpbmsgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSAgICAgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lICAgICA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIEluY2FsbCBNdXNpYyAyIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlMiBGYXJlbmQgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcwIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgICAgID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9VU0JfQVVESU9fUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJVU0IgQXVkaW8gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjcyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9VU0JfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1BSSV9URE1fUlhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1BSSV9URE1fVFhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgVERNMCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19URE1fVFhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBURE0wIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODgxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fVFhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg5NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY5MTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVF9URE1fVFhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX21pMnNfYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX01JMlNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1BSSV9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX01JMlNfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVElBUllfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2NvbW1vbl9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfTUkyU19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzW10gPSB7Ci0JLyogUHJpbWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FVWFBDTV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfQVVYUENNX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4xIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBTZWNvbmRhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2VjIEFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JLyogVGVydGlhcnkgQVVYIFBDTSBCYWNrZW5kIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX0FVWFBDTV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVEVSVF9BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fY29tbW9uX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JLyogUXVhdGVybmFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0IEFVWCBQQ00gQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1hdXhwY20uNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93Y25fYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfN19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM3IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLyogQlQgY29kZWMgZHJpdmVyIGRldGVybWluZXMgY2FwYWJpbGl0aWVzIGJhc2VkIG9uCi0JCSAqIGRhaSBuYW1lLCBidCBjb2RlY2RhaSBuYW1lIHNob3VsZCBhbHdheXMgY29udGFpbnMKLQkJICogc3VwcG9ydGVkIHVzZWNhc2UgaW5mb3JtYXRpb24KLQkJICovCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2J0X3Njb19hMmRwX3NsaW1fcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU183X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2J0Zm1fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV93Y25fb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzdfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fYnRfc2NvX3NsaW1fdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYnRmbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3djbl9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU184X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czggQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTY0MDEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJidGZtc2xpbV9zbGF2ZSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJidGZtX2ZtX3NsaW1fdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYnRmbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pbml0ID0gJm1zbV93Y25faW5pdCwKLQkJLm9wcyA9ICZtc21fd2NuX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV93c2FfYmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IExQQVNTX0JFX0lOVDRfTUkyU19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIklOVDQgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjExIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtX3Nkd19jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc21fc2R3X2kyc19yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfSU5UNF9NSTJTX1JYLAotCQkuaW5pdCA9ICZtc21fc2R3X2F1ZHJ4X2luaXQsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBpbnRfbWkyc19iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3Nkd19taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV4dF9kaXNwX2JlX2RhaV9saW5rW10gPSB7Ci0JLyogRElTUCBQT1JUIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0RJU1BMQVlfUE9SVCwKLQkJLnN0cmVhbV9uYW1lID0gIkRpc3BsYXkgUG9ydCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kcC4yNDYwOCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1leHQtZGlzcC1hdWRpby1jb2RlYy1yeCIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc21fZHBfYXVkaW9fY29kZWNfcnhfZGFpIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0RJU1BMQVlfUE9SVF9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9jb21tb25fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9pbnRfZGFpX2xpbmtzWwotQVJSQVlfU0laRShtc21faW50X2RhaSkgKwotQVJSQVlfU0laRShtc21faW50X3dzYV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX2ludF9iZV9kYWkpICsKLUFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKSArCi1BUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSsKLUFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpICsKLUFSUkFZX1NJWkUobXNtX3dzYV9iZV9kYWlfbGlua3MpICsKLUFSUkFZX1NJWkUoZXh0X2Rpc3BfYmVfZGFpX2xpbmspXTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc2RtNjYwX2NhcmQgPSB7Ci0JLyogc25kX3NvY19jYXJkX3NkbTY2MCAqLwotCS5uYW1lCQk9ICJzZG02NjAtc25kLWNhcmQiLAotCS5kYWlfbGluawk9IG1zbV9pbnRfZGFpLAotCS5udW1fbGlua3MJPSBBUlJBWV9TSVpFKG1zbV9pbnRfZGFpKSwKLQkubGF0ZV9wcm9iZQk9IG1zbV9zbmRfY2FyZF9sYXRlX3Byb2JlLAotfTsKLQotc3RhdGljIHZvaWQgbXNtX2Rpc2FibGVfaW50X21jbGswKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcms7Ci0JaW50IHJldCA9IDA7Ci0KLQlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKLQlwZGF0YSA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSwKLQkJCWRpc2FibGVfaW50X21jbGswX3dvcmspOwotCW11dGV4X2xvY2soJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQlwcl9kZWJ1ZygiJXM6IG1jbGtfZW5hYmxlZCAlZCBtY2xrX3JzY19yZWYgJWRcbiIsIF9fZnVuY19fLAotCQkJYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCksCi0JCQlhdG9taWNfcmVhZCgmcGRhdGEtPmludF9tY2xrMF9yc2NfcmVmKSk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCkgPT0gdHJ1ZQotCQkJJiYgYXRvbWljX3JlYWQoJnBkYXRhLT5pbnRfbWNsazBfcnNjX3JlZikgPT0gMCkgewotCQlwcl9kZWJ1ZygiRGlzYWJsZSB0aGUgbWNsa1xuIik7Ci0JCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5lbmFibGUgPSAwOwotCQlyZXQgPSBhZmVfc2V0X2xwYXNzX2Nsb2NrX3YyKAotCQkJQUZFX1BPUlRfSURfSU5UMF9NSTJTX1JYLAotCQkJJnBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsayk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcHJfZXJyKCIlcyBmYWlsZWQgdG8gZGlzYWJsZSB0aGUgQ0NMS1xuIiwgX19mdW5jX18pOwotCQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX2VuYWJsZWQsIGZhbHNlKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwZGF0YS0+Y2RjX2ludF9tY2xrMF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pbnRfZHRfcGFyc2VfY2FwX2luZm8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSkKLXsKLQljb25zdCBjaGFyICpleHQxX2NhcCA9ICJxY29tLG1zbS1taWNiaWFzMS1leHQtY2FwIjsKLQljb25zdCBjaGFyICpleHQyX2NhcCA9ICJxY29tLG1zbS1taWNiaWFzMi1leHQtY2FwIjsKLQotCXBkYXRhLT5taWNiaWFzMV9jYXBfbW9kZSA9Ci0JCShvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsIGV4dDFfY2FwKSA/Ci0JCSBNSUNCSUFTX0VYVF9CWVBfQ0FQIDogTUlDQklBU19OT19FWFRfQllQX0NBUCk7Ci0KLQlwZGF0YS0+bWljYmlhczJfY2FwX21vZGUgPQotCQkob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCBleHQyX2NhcCkgPwotCQkgTUlDQklBU19FWFRfQllQX0NBUCA6IE1JQ0JJQVNfTk9fRVhUX0JZUF9DQVApOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCAqbXNtX2ludF9wb3B1bGF0ZV9zbmRjYXJkX2RhaWxpbmtzKAotCQkJCQkJc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc2RtNjYwX2NhcmQ7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaWxpbms7Ci0JaW50IGxlbjE7Ci0KLQljYXJkLT5uYW1lID0gZGV2X25hbWUoZGV2KTsKLQlsZW4xID0gQVJSQVlfU0laRShtc21faW50X2RhaSk7Ci0JbWVtY3B5KG1zbV9pbnRfZGFpX2xpbmtzLCBtc21faW50X2RhaSwgc2l6ZW9mKG1zbV9pbnRfZGFpKSk7Ci0JZGFpbGluayA9IG1zbV9pbnRfZGFpX2xpbmtzOwotCWlmICghb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkgICJxY29tLHdzYS1kaXNhYmxlIikpIHsKLQkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAotCQkgICAgICAgbXNtX2ludF93c2FfZGFpLAotCQkgICAgICAgc2l6ZW9mKG1zbV9pbnRfd3NhX2RhaSkpOwotCQlsZW4xICs9IEFSUkFZX1NJWkUobXNtX2ludF93c2FfZGFpKTsKLQl9Ci0JbWVtY3B5KGRhaWxpbmsgKyBsZW4xLCBtc21faW50X2JlX2RhaSwgc2l6ZW9mKG1zbV9pbnRfYmVfZGFpKSk7Ci0JbGVuMSArPSBBUlJBWV9TSVpFKG1zbV9pbnRfYmVfZGFpKTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCSAgInFjb20sbWkycy1hdWRpby1pbnRmIikpIHsKLQkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAotCQkgICAgICAgbXNtX21pMnNfYmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOwotCQlsZW4xICs9IEFSUkFZX1NJWkUobXNtX21pMnNfYmVfZGFpX2xpbmtzKTsKLQl9Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsCi0JCQkJICAicWNvbSxhdXhwY20tYXVkaW8taW50ZiIpKSB7Ci0JCW1lbWNweShkYWlsaW5rICsgbGVuMSwKLQkJICAgICAgIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKSk7Ci0JCWxlbjEgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7Ci0JfQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSx3Y24tYnRmbSIpKSB7Ci0JCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAotCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3djbl9iZV9kYWlfbGlua3MpKTsKLQkJbGVuMSArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKLQl9Ci0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSx3c2EtZGlzYWJsZSIpKSB7Ci0JCW1lbWNweShkYWlsaW5rICsgbGVuMSwKLQkJICAgICAgIG1zbV93c2FfYmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV93c2FfYmVfZGFpX2xpbmtzKSk7Ci0JCWxlbjEgKz0gQVJSQVlfU0laRShtc21fd3NhX2JlX2RhaV9saW5rcyk7Ci0JfQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLCAicWNvbSxleHQtZGlzcC1hdWRpby1yeCIpKSB7Ci0JCWRldl9kYmcoZGV2LCAiJXMoKTogZXh0IGRpc3AgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJbWVtY3B5KGRhaWxpbmsgKyBsZW4xLAotCQkJZXh0X2Rpc3BfYmVfZGFpX2xpbmssCi0JCQlzaXplb2YoZXh0X2Rpc3BfYmVfZGFpX2xpbmspKTsKLQkJbGVuMSArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKLQl9Ci0JY2FyZC0+ZGFpX2xpbmsgPSBkYWlsaW5rOwotCWNhcmQtPm51bV9saW5rcyA9IGxlbjE7Ci0JcmV0dXJuIGNhcmQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2ludGVybmFsX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgICAgc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEsCi0JCQkgICAgIHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0JY29uc3QgY2hhciAqdHlwZSA9IE5VTEw7Ci0JY29uc3QgY2hhciAqaHNfbWljYmlhc190eXBlID0gInFjb20sbXNtLWhzLW1pY2JpYXMtdHlwZSI7Ci0JaW50IHJldDsKLQotCXJldCA9IGlzX2V4dF9zcGtfZ3Bpb19zdXBwb3J0KHBkZXYsIHBkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJIiVzOiBkb2Vzbid0IHN1cHBvcnQgZXh0ZXJuYWwgc3BlYWtlciBwYVxuIiwKLQkJCV9fZnVuY19fKTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCSAgICAgIGhzX21pY2JpYXNfdHlwZSwgJnR5cGUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IG1pc3NpbmcgJXMgaW4gZHQgbm9kZVxuIiwKLQkJCV9fZnVuY19fLCBoc19taWNiaWFzX3R5cGUpOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKCFzdHJjbXAodHlwZSwgImV4dGVybmFsIikpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSGVhZHNldCBpcyB1c2luZyBleHRlcm5hbCBtaWNiaWFzXG4iKTsKLQkJbWJoY19jZmdfcHRyLT5oc19leHRfbWljYmlhcyA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSGVhZHNldCBpcyB1c2luZyBpbnRlcm5hbCBtaWNiaWFzXG4iKTsKLQkJbWJoY19jZmdfcHRyLT5oc19leHRfbWljYmlhcyA9IGZhbHNlOwotCX0KLQotCS8qIGluaXRpYWxpemUgdGhlIGludF9tY2xrMCAqLwotCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5jbGtfc2V0X21pbm9yX3ZlcnNpb24gPQotCQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUc7Ci0JcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmNsa19pZCA9Ci0JCQlRNkFGRV9MUEFTU19DTEtfSURfSU5UX01DTEtfMDsKLQlwZGF0YS0+ZGlnaXRhbF9jZGNfY29yZV9jbGsuY2xrX2ZyZXFfaW5faHogPSBwZGF0YS0+bWNsa19mcmVxOwotCXBkYXRhLT5kaWdpdGFsX2NkY19jb3JlX2Nsay5jbGtfYXR0cmkgPQotCQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk87Ci0JcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmNsa19yb290ID0KLQkJCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQ7Ci0JcGRhdGEtPmRpZ2l0YWxfY2RjX2NvcmVfY2xrLmVuYWJsZSA9IDE7Ci0KLQkvKiBJbml0aWFsaXplIGxvb3BiYWNrIG1vZGUgdG8gZmFsc2UgKi8KLQlwZGF0YS0+bGJfbW9kZSA9IGZhbHNlOwotCi0JbXNtX2ludF9kdF9wYXJzZV9jYXBfaW5mbyhwZGV2LCBwZGF0YSk7Ci0KLQljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOwotCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShjYXJkLCBwZGF0YSk7Ci0JcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoY2FyZCwgInFjb20sbW9kZWwiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQkvKiBpbml0aWFsaXplIHRpbWVyICovCi0JSU5JVF9ERUxBWUVEX1dPUksoJnBkYXRhLT5kaXNhYmxlX2ludF9tY2xrMF93b3JrLAotCQkJICBtc21fZGlzYWJsZV9pbnRfbWNsazApOwotCW11dGV4X2luaXQoJnBkYXRhLT5jZGNfaW50X21jbGswX211dGV4KTsKLQlhdG9taWNfc2V0KCZwZGF0YS0+aW50X21jbGswX3JzY19yZWYsIDApOwotCWF0b21pY19zZXQoJnBkYXRhLT5pbnRfbWNsazBfZW5hYmxlZCwgZmFsc2UpOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBkZWZhdWx0IGNvZGVjIGNvbmZpZ3VyZWRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogbXNtX2ludF9jZGNfaW5pdCAtIGludGVybmFsIGNvZGVjIG1hY2hpbmUgc3BlY2lmaWMgaW5pdC4KLSAqCi0gKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIGhhbmRsZQotICogQHBkYXRhOiBwcml2YXRlIGRhdGEgb2YgbWFjaGluZSBkcml2ZXIKLSAqIEBjYXJkOiBzb3VuZCBjYXJkIHBvaW50ZXIgcmVmZXJlbmNlCi0gKiBAbWJoY19jZmc6IE1CSEMgY29uZmlnIHJlZmVyZW5jZQotICoKLSAqIFJldHVybnMgMC4KLSAqLwotaW50IG1zbV9pbnRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKLQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKLQkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKLXsKLQltYmhjX2NmZ19wdHIgPSBtYmhjX2NmZzsKLQotCSpjYXJkID0gbXNtX2ludF9wb3B1bGF0ZV9zbmRjYXJkX2RhaWxpbmtzKCZwZGV2LT5kZXYpOwotCW1zbV9pbnRlcm5hbF9pbml0KHBkZXYsIHBkYXRhLCAqY2FyZCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1zbV9pbnRfY2RjX2luaXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL21zbS9zZG02NjAtaW50ZXJuYWwuaCBiL3NvdW5kL3NvYy9tc20vc2RtNjYwLWludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzYyYjguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL21zbS9zZG02NjAtaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAotICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fU0RNNjYwX0lOVEVSTkFMCi0jZGVmaW5lIF9fU0RNNjYwX0lOVEVSTkFMCi0KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotI2lmZGVmIENPTkZJR19TTkRfU09DX0lOVF9DT0RFQwotaW50IG1zbV9pbnRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKLQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKLQkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZyk7Ci0jZWxzZQotaW50IG1zbV9pbnRfY2RjX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJICAgICBzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSwKLQkJICAgICBzdHJ1Y3Qgc25kX3NvY19jYXJkICoqY2FyZCwKLQkJICAgICBzdHJ1Y3Qgd2NkX21iaGNfY29uZmlnICptYmhjX2NmZykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXNtL3NkbTg0NS5jIGIvc291bmQvc29jL21zbS9zZG04NDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5MjYxNi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvbXNtL3NkbTg0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKLSAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tc20tY2RjLXBpbmN0cmwuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSA8c291bmQvcTZhZmUtdjIuaD4KLSNpbmNsdWRlIDxzb3VuZC9xNmNvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvaW5mby5oPgotI2luY2x1ZGUgPGRldmljZV9ldmVudC5oPgotI2luY2x1ZGUgPGxpbnV4L3Fkc3A2djIvYXVkaW9fbm90aWZpZXIuaD4KLSNpbmNsdWRlICJxZHNwNnYyL21zbS1wY20tcm91dGluZy12Mi5oIgotI2luY2x1ZGUgIi4uL2NvZGVjcy93Y2Q5MzR4L3djZDkzNHguaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd2NkOTM0eC93Y2Q5MzR4LW1iaGMuaCIKLSNpbmNsdWRlICIuLi9jb2RlY3Mvd3NhODgxeC5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJzZG04NDUtYXNvYy1zbmQiCi0KLSNkZWZpbmUgX19DSElQU0VUX18gIlNETTg0NSAiCi0jZGVmaW5lIE1TTV9EQUlMSU5LX05BTUUobmFtZSkgKF9fQ0hJUFNFVF9fI25hbWUpCi0KLSNkZWZpbmUgU0FNUExJTkdfUkFURV84S0haICAgICAgODAwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWiAxMTAyNQotI2RlZmluZSBTQU1QTElOR19SQVRFXzE2S0haICAgICAxNjAwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzIyUDA1S0haICAyMjA1MAotI2RlZmluZSBTQU1QTElOR19SQVRFXzMyS0haICAgICAzMjAwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzQ0UDFLSFogICA0NDEwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzQ4S0haICAgICA0ODAwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzg4UDJLSFogICA4ODIwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzk2S0haICAgICA5NjAwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzE3NlA0S0haICAxNzY0MDAKLSNkZWZpbmUgU0FNUExJTkdfUkFURV8xOTJLSFogICAgMTkyMDAwCi0jZGVmaW5lIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFogIDM1MjgwMAotI2RlZmluZSBTQU1QTElOR19SQVRFXzM4NEtIWiAgICAzODQwMDAKLQotI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX0JVVFRPTlMgICAgOAotI2RlZmluZSBXQ0Q5WFhYX01CSENfREVGX1JMT0FEUyAgICAgNQotI2RlZmluZSBDT0RFQ19FWFRfQ0xLX1JBVEUgICAgICAgICAgOTYwMDAwMAotI2RlZmluZSBBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMgMzAwMAotI2RlZmluZSBERVZfTkFNRV9TVFJfTEVOICAgICAgICAgICAgMzIKLQotI2RlZmluZSBXU0E4ODEwX05BTUVfMSAid3NhODgxeC4yMDE3MDIxMSIKLSNkZWZpbmUgV1NBODgxMF9OQU1FXzIgIndzYTg4MXguMjAxNzAyMTIiCi0KLSNkZWZpbmUgV0NOX0NEQ19TTElNX1JYX0NIX01BWCAyCi0jZGVmaW5lIFdDTl9DRENfU0xJTV9UWF9DSF9NQVggMwotCi0jZGVmaW5lIFRETV9DSEFOTkVMX01BWCA4Ci0jZGVmaW5lIFRETV9TTE9UX09GRlNFVF9NQVggOAotCi0jZGVmaW5lIE1TTV9ISUZJX09OIDEKLQotZW51bSB7Ci0JU0xJTV9SWF8wID0gMCwKLQlTTElNX1JYXzEsCi0JU0xJTV9SWF8yLAotCVNMSU1fUlhfMywKLQlTTElNX1JYXzQsCi0JU0xJTV9SWF81LAotCVNMSU1fUlhfNiwKLQlTTElNX1JYXzcsCi0JU0xJTV9SWF9NQVgsCi19OwotCi1lbnVtIHsKLQlTTElNX1RYXzAgPSAwLAotCVNMSU1fVFhfMSwKLQlTTElNX1RYXzIsCi0JU0xJTV9UWF8zLAotCVNMSU1fVFhfNCwKLQlTTElNX1RYXzUsCi0JU0xJTV9UWF82LAotCVNMSU1fVFhfNywKLQlTTElNX1RYXzgsCi0JU0xJTV9UWF9NQVgsCi19OwotCi1lbnVtIHsKLQlQUklNX01JMlMgPSAwLAotCVNFQ19NSTJTLAotCVRFUlRfTUkyUywKLQlRVUFUX01JMlMsCi0JTUkyU19NQVgsCi19OwotCi1lbnVtIHsKLQlQUklNX0FVWF9QQ00gPSAwLAotCVNFQ19BVVhfUENNLAotCVRFUlRfQVVYX1BDTSwKLQlRVUFUX0FVWF9QQ00sCi0JQVVYX1BDTV9NQVgsCi19OwotCi1lbnVtIHsKLQlQQ01fSTJTX1NFTF9QUklNID0gMCwKLQlQQ01fSTJTX1NFTF9TRUMsCi0JUENNX0kyU19TRUxfVEVSVCwKLQlQQ01fSTJTX1NFTF9RVUFULAotCVBDTV9JMlNfU0VMX01BWCwKLX07Ci0KLXN0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgewotCXN0cnVjdCBtdXRleCBsb2NrOwotCXZvaWQgKnBjbV9pMnNfc2VsX3Z0X2FkZHI7Ci19OwotCi1zdHJ1Y3QgbWkyc19jb25mIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQl1MzIgcmVmX2NudDsKLQl1MzIgbXNtX2lzX21pMnNfbWFzdGVyOwotfTsKLQotc3RhdGljIHUzMiBtaTJzX2ViaXRfY2xrW01JMlNfTUFYXSA9IHsKLQlRNkFGRV9MUEFTU19DTEtfSURfUFJJX01JMlNfRUJJVCwKLQlRNkFGRV9MUEFTU19DTEtfSURfU0VDX01JMlNfRUJJVCwKLQlRNkFGRV9MUEFTU19DTEtfSURfVEVSX01JMlNfRUJJVCwKLQlRNkFGRV9MUEFTU19DTEtfSURfUVVBRF9NSTJTX0VCSVQKLX07Ci0KLXN0cnVjdCBhdXhwY21fY29uZiB7Ci0Jc3RydWN0IG11dGV4IGxvY2s7Ci0JdTMyIHJlZl9jbnQ7Ci19OwotCi1zdHJ1Y3QgZGV2X2NvbmZpZyB7Ci0JdTMyIHNhbXBsZV9yYXRlOwotCXUzMiBiaXRfZm9ybWF0OwotCXUzMiBjaGFubmVsczsKLX07Ci0KLWVudW0gewotCURQX1JYX0lEWCA9IDAsCi0JRVhUX0RJU1BfUlhfSURYX01BWCwKLX07Ci0KLXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwotCXUzMiBpbmRleDsKLX07Ci0KLWVudW0gcGluY3RybF9waW5fc3RhdGUgewotCVNUQVRFX0RJU0FCTEUgPSAwLCAvKiBBbGwgcGlucyBhcmUgaW4gc2xlZXAgc3RhdGUgKi8KLQlTVEFURV9NSTJTX0FDVElWRSwgIC8qIElTMiA9IGFjdGl2ZSwgVERNID0gc2xlZXAgKi8KLQlTVEFURV9URE1fQUNUSVZFLCAgLyogSVMyID0gc2xlZXAsIFRETSA9IGFjdGl2ZSAqLwotfTsKLQotc3RydWN0IG1zbV9waW5jdHJsX2luZm8gewotCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICptaTJzX2Rpc2FibGU7Ci0Jc3RydWN0IHBpbmN0cmxfc3RhdGUgKnRkbV9kaXNhYmxlOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICptaTJzX2FjdGl2ZTsKLQlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqdGRtX2FjdGl2ZTsKLQllbnVtIHBpbmN0cmxfcGluX3N0YXRlIGN1cnJfc3RhdGU7Ci19OwotCi1zdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhIHsKLQl1MzIgbWNsa19mcmVxOwotCWludCB1c19ldXJvX2dwaW87IC8qIHVzZWQgYnkgZ3BpbyBkcml2ZXIgQVBJICovCi0JaW50IHVzYmNfZW4yX2dwaW87IC8qIHVzZWQgYnkgZ3BpbyBkcml2ZXIgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICp1c19ldXJvX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLwotCXN0cnVjdCBwaW5jdHJsICp1c2JjX2VuMl9ncGlvX3A7IC8qIHVzZWQgYnkgcGluY3RybCBBUEkgKi8KLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmhwaF9lbjFfZ3Bpb19wOyAvKiB1c2VkIGJ5IHBpbmN0cmwgQVBJICovCi0Jc3RydWN0IGRldmljZV9ub2RlICpocGhfZW4wX2dwaW9fcDsgLyogdXNlZCBieSBwaW5jdHJsIEFQSSAqLwotCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqY29kZWNfcm9vdDsKLQlzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyBwaW5jdHJsX2luZm87Ci19OwotCi1zdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyB7Ci0Jdm9pZCogKCpnZXRfYWZlX2NvbmZpZ19mbikoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSAgIGVudW0gYWZlX2NvbmZpZ190eXBlIGNvbmZpZ190eXBlKTsKLQl2b2lkICgqbWJoY19oc19kZXRlY3RfZXhpdCkoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBwaW5fc3RhdGVzW10gPSB7InNsZWVwIiwgImkycy1hY3RpdmUiLAotCQkJCQkgInRkbS1hY3RpdmUifTsKLQotZW51bSB7Ci0JVERNXzAgPSAwLAotCVRETV8xLAotCVRETV8yLAotCVRETV8zLAotCVRETV80LAotCVRETV81LAotCVRETV82LAotCVRETV83LAotCVRETV9QT1JUX01BWCwKLX07Ci0KLWVudW0gewotCVRETV9QUkkgPSAwLAotCVRETV9TRUMsCi0JVERNX1RFUlQsCi0JVERNX1FVQVQsCi0JVERNX0lOVEVSRkFDRV9NQVgsCi19OwotCi1zdHJ1Y3QgdGRtX3BvcnQgewotCXUzMiBtb2RlOwotCXUzMiBjaGFubmVsOwotfTsKLQotLyogVERNIGRlZmF1bHQgY29uZmlnICovCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgdGRtX3J4X2NmZ1tURE1fSU5URVJGQUNFX01BWF1bVERNX1BPUlRfTUFYXSA9IHsKLQl7IC8qIFBSSSBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCi0JfSwKLQl7IC8qIFNFQyBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF83ICovCi0JfSwKLQl7IC8qIFRFUlQgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNyAqLwotCX0sCi0JeyAvKiBRVUFUIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogUlhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBSWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFJYXzcgKi8KLQl9Ci19OwotCi0vKiBURE0gZGVmYXVsdCBjb25maWcgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB0ZG1fdHhfY2ZnW1RETV9JTlRFUkZBQ0VfTUFYXVtURE1fUE9SVF9NQVhdID0gewotCXsgLyogUFJJIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KLQl9LAotCXsgLyogU0VDIFRETSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8wICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzEgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8zICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzQgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF82ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzcgKi8KLQl9LAotCXsgLyogVEVSVCBURE0gKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8xICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzIgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMyAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF80ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzUgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNiAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF83ICovCi0JfSwKLQl7IC8qIFFVQVQgVERNICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzAgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfMSAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF8yICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzMgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNCAqLwotCQl7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LCAvKiBUWF81ICovCi0JCXtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sIC8qIFRYXzYgKi8KLQkJe1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwgLyogVFhfNyAqLwotCX0KLX07Ci0KLS8qVERNIGRlZmF1bHQgb2Zmc2V0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRpbmcgVERNX1JYXzAgYW5kIFRETV9UWF8wICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHRkbV9zbG90X29mZnNldFtURE1fUE9SVF9NQVhdW1RETV9TTE9UX09GRlNFVF9NQVhdID0gewotCXswLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjh9LC8qIFRYXzAgfCBSWF8wICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzEgfCBSWF8xICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzIgfCBSWF8yICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzMgfCBSWF8zICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzQgfCBSWF80ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzUgfCBSWF81ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzYgfCBSWF82ICovCi0Je0FGRV9TTE9UX01BUFBJTkdfT0ZGU0VUX0lOVkFMSUR9LC8qIFRYXzcgfCBSWF83ICovCi19OwotCi0vKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2Ygc2xpbWJ1cyBjaGFubmVscyAqLwotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fcnhfY2ZnW10gPSB7Ci0JW1NMSU1fUlhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9SWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fUlhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1JYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHNsaW1fdHhfY2ZnW10gPSB7Ci0JW1NMSU1fVFhfMF0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzFdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF8yXSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfM10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzRdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0xJTV9UWF81XSA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NMSU1fVFhfNl0gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzddID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTTElNX1RYXzhdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIGV4dGVybmFsIGRpc3BsYXkgQkUgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBleHRfZGlzcF9yeF9jZmdbXSA9IHsKLQlbRFBfUlhfSURYXSA9ICAge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyB1c2JfcnhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIHVzYl90eF9jZmcgPSB7Ci0JLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWiwKLQkuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLAotCS5jaGFubmVscyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldl9jb25maWcgcHJveHlfcnhfY2ZnID0gewotCS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFosCi0JLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwKLQkuY2hhbm5lbHMgPSAyLAotfTsKLQotLyogRGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIE1JMlMgY2hhbm5lbHMgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3J4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMn0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDJ9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBtaTJzX3R4X2NmZ1tdID0gewotCVtQUklNX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLQlbU0VDX01JMlNdICA9IHtTQU1QTElOR19SQVRFXzQ4S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfTUkyU10gPSB7U0FNUExJTkdfUkFURV80OEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX01JMlNdID0ge1NBTVBMSU5HX1JBVEVfNDhLSFosIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFLCAxfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2X2NvbmZpZyBhdXhfcGNtX3J4X2NmZ1tdID0gewotCVtQUklNX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtTRUNfQVVYX1BDTV0gID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtURVJUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotCVtRVUFUX0FVWF9QQ01dID0ge1NBTVBMSU5HX1JBVEVfOEtIWiwgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsIDF9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZfY29uZmlnIGF1eF9wY21fdHhfY2ZnW10gPSB7Ci0JW1BSSU1fQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1NFQ19BVVhfUENNXSAgPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1RFUlRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi0JW1FVQVRfQVVYX1BDTV0gPSB7U0FNUExJTkdfUkFURV84S0haLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSwgMX0sCi19OwotCi1zdGF0aWMgaW50IG1zbV92aV9mZWVkX3R4X2NoID0gMjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGltX3J4X2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsaW1fdHhfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIiwgIlRocmVlIiwgIkZvdXIiLAotCQkJCQkJIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwKLQkJCQkJCSJFaWdodCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZpX2ZlZWRfY2hfdGV4dFtdID0geyJPbmUiLCAiVHdvIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqYml0X2Zvcm1hdF90ZXh0W10gPSB7IlMxNl9MRSIsICJTMjRfTEUiLCAiUzI0XzNMRSIsCi0JCQkJCSAgIlMzMl9MRSJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmV4dF9kaXNwX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIn07Ci1zdGF0aWMgY2hhciBjb25zdCAqc2xpbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsCi0JCQkJCSJLSFpfMzIiLCAiS0haXzQ0UDEiLCAiS0haXzQ4IiwKLQkJCQkJIktIWl84OFAyIiwgIktIWl85NiIsICJLSFpfMTc2UDQiLAotCQkJCQkiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmJ0X3NhbXBsZV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwgIktIWl80OCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVzYl9jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCi0JCQkJCSAgICJFaWdodCJ9Owotc3RhdGljIGNoYXIgY29uc3QgKmNoX3RleHRbXSA9IHsiVHdvIiwgIlRocmVlIiwgIkZvdXIiLCAiRml2ZSIsCi0JCQkJCSJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICp1c2Jfc2FtcGxlX3JhdGVfdGV4dFtdID0geyJLSFpfOCIsICJLSFpfMTFQMDI1IiwKLQkJCQkJIktIWl8xNiIsICJLSFpfMjJQMDUiLAotCQkJCQkiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJCSJLSFpfODhQMiIsICJLSFpfOTYiLCAiS0haXzE3NlA0IiwKLQkJCQkJIktIWl8xOTIiLCAiS0haXzM1MlA4IiwgIktIWl8zODQifTsKLXN0YXRpYyBjaGFyIGNvbnN0ICpleHRfZGlzcF9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl80OCIsICJLSFpfOTYiLAotCQkJCQkJIktIWl8xOTIiLCAiS0haXzMyIiwgIktIWl80NFAxIiwKLQkJCQkJCSJLSFpfODhQMiIsICJLSFpfMTc2UDQiCX07Ci1zdGF0aWMgY2hhciBjb25zdCAqdGRtX2NoX3RleHRbXSA9IHsiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwKLQkJCQkgICAgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwgIkVpZ2h0In07Ci1zdGF0aWMgY2hhciBjb25zdCAqdGRtX2JpdF9mb3JtYXRfdGV4dFtdID0geyJTMTZfTEUiLCAiUzI0X0xFIiwgIlMzMl9MRSJ9Owotc3RhdGljIGNoYXIgY29uc3QgKnRkbV9zYW1wbGVfcmF0ZV90ZXh0W10gPSB7IktIWl84IiwgIktIWl8xNiIsICJLSFpfMzIiLAotCQkJCQkgICAgICJLSFpfNDRQMSIsICJLSFpfNDgiLCAiS0haXzk2IiwKLQkJCQkJICAgICAiS0haXzE5MiIsICJLSFpfMzUyUDgiLCAiS0haXzM4NCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGF1eHBjbV9yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2In07Ci1zdGF0aWMgY2hhciBjb25zdCAqbWkyc19yYXRlX3RleHRbXSA9IHsiS0haXzgiLCAiS0haXzE2IiwKLQkJCQkgICAgICAiS0haXzMyIiwgIktIWl80NFAxIiwgIktIWl80OCIsCi0JCQkJICAgICAgIktIWl85NiIsICJLSFpfMTkyIn07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWkyc19jaF90ZXh0W10gPSB7Ik9uZSIsICJUd28iLCAiVGhyZWUiLCAiRm91ciIsCi0JCQkJCSAgICJGaXZlIiwgIlNpeCIsICJTZXZlbiIsCi0JCQkJCSAgICJFaWdodCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhpZmlfdGV4dFtdID0geyJPZmYiLCAiT24ifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBxb3NfdGV4dFtdID0geyJEaXNhYmxlIiwgIkVuYWJsZSJ9OwotCi1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMl9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMF90eF9jaHMsIHNsaW1fdHhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMV90eF9jaHMsIHNsaW1fdHhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNV9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9jaHMsIHNsaW1fcnhfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHVzYl9yeF9jaHMsIHVzYl9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3R4X2NocywgdXNiX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh2aV9mZWVkX3R4X2NocywgdmlfZmVlZF9jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3BfcnhfY2hzLCBjaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJveHlfcnhfY2hzLCBjaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV81X3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV82X3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3R4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woZXh0X2Rpc3BfcnhfZm9ybWF0LCBleHRfZGlzcF9iaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzBfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fMl9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2xpbV8wX3R4X3NhbXBsZV9yYXRlLCBzbGltX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzbGltXzVfcnhfc2FtcGxlX3JhdGUsIHNsaW1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNsaW1fNl9yeF9zYW1wbGVfcmF0ZSwgc2xpbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYnRfc2FtcGxlX3JhdGUsIGJ0X3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh1c2Jfcnhfc2FtcGxlX3JhdGUsIHVzYl9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodXNiX3R4X3NhbXBsZV9yYXRlLCB1c2Jfc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlLAotCQkJCWV4dF9kaXNwX3NhbXBsZV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfY2hzLCB0ZG1fY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHRkbV90eF9mb3JtYXQsIHRkbV9iaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fdHhfc2FtcGxlX3JhdGUsIHRkbV9zYW1wbGVfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X2NocywgdGRtX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZG1fcnhfZm9ybWF0LCB0ZG1fYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGRtX3J4X3NhbXBsZV9yYXRlLCB0ZG1fc2FtcGxlX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHByaW1fYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwgYXV4cGNtX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocHJpbV9hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLCBhdXhwY21fcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTCh0ZXJ0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChxdWF0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsIGF1eHBjbV9yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfcnhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3J4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc19yeF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woc2VjX21pMnNfdHhfc2FtcGxlX3JhdGUsIG1pMnNfcmF0ZV90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3R4X3NhbXBsZV9yYXRlLCBtaTJzX3JhdGVfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHF1YXRfbWkyc190eF9zYW1wbGVfcmF0ZSwgbWkyc19yYXRlX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfcnhfY2hzLCBtaTJzX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChwcmltX21pMnNfdHhfY2hzLCBtaTJzX2NoX3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChzZWNfbWkyc19yeF9jaHMsIG1pMnNfY2hfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHNlY19taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodGVydF9taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3J4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wocXVhdF9taTJzX3R4X2NocywgbWkyc19jaF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wobWkyc19yeF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKG1pMnNfdHhfZm9ybWF0LCBiaXRfZm9ybWF0X3RleHQpOwotc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9FWFRfREVDTChhdXhfcGNtX3J4X2Zvcm1hdCwgYml0X2Zvcm1hdF90ZXh0KTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0woYXV4X3BjbV90eF9mb3JtYXQsIGJpdF9mb3JtYXRfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKGhpZmlfZnVuY3Rpb24sIGhpZmlfdGV4dCk7Ci1zdGF0aWMgU09DX0VOVU1fU0lOR0xFX0VYVF9ERUNMKHFvc192b3RlLCBxb3NfdGV4dCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzcGRldjsKLXN0YXRpYyBpbnQgbXNtX2hpZmlfY29udHJvbDsKLXN0YXRpYyBpbnQgcW9zX3ZvdGVfc3RhdHVzOwotCi1zdGF0aWMgYm9vbCBpc19pbml0aWFsX2Jvb3Q7Ci1zdGF0aWMgYm9vbCBjb2RlY19yZWdfZG9uZTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2ICptc21fYXV4X2RldjsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mICptc21fY29kZWNfY29uZjsKLXN0YXRpYyBzdHJ1Y3QgbXNtX2Fzb2Nfd2NkOTN4eF9jb2RlYyBtc21fY29kZWNfZm47Ci0KLXN0YXRpYyB2b2lkICpkZWZfdGF2aWxfbWJoY19jYWwodm9pZCk7Ci1zdGF0aWMgaW50IG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF9jbGsoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCQlpbnQgZW5hYmxlLCBib29sIGRhcG0pOwotc3RhdGljIGludCBtc21fd3NhODgxeF9pbml0KHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KTsKLQotLyoKLSAqIE5lZWQgdG8gcmVwb3J0IExJTkVJTgotICogaWYgUi9MIGNoYW5uZWwgaW1wZWRhbmNlIGlzIGxhcmdlciB0aGFuIDVLIG9obQotICovCi1zdGF0aWMgc3RydWN0IHdjZF9tYmhjX2NvbmZpZyB3Y2RfbWJoY19jZmcgPSB7Ci0JLnJlYWRfZndfYmluID0gZmFsc2UsCi0JLmNhbGlicmF0aW9uID0gTlVMTCwKLQkuZGV0ZWN0X2V4dG5fY2FibGUgPSB0cnVlLAotCS5tb25vX3N0ZXJvX2RldGVjdGlvbiA9IGZhbHNlLAotCS5zd2FwX2duZF9taWMgPSBOVUxMLAotCS5oc19leHRfbWljYmlhcyA9IHRydWUsCi0JLmtleV9jb2RlWzBdID0gS0VZX01FRElBLAotCS5rZXlfY29kZVsxXSA9IEtFWV9WT0lDRUNPTU1BTkQsCi0JLmtleV9jb2RlWzJdID0gS0VZX1ZPTFVNRVVQLAotCS5rZXlfY29kZVszXSA9IEtFWV9WT0xVTUVET1dOLAotCS5rZXlfY29kZVs0XSA9IDAsCi0JLmtleV9jb2RlWzVdID0gMCwKLQkua2V5X2NvZGVbNl0gPSAwLAotCS5rZXlfY29kZVs3XSA9IDAsCi0JLmxpbmVpbl90aCA9IDUwMDAsCi0JLm1vaXN0dXJlX2VuID0gdHJ1ZSwKLQkubWJoY19taWNiaWFzID0gTUlDX0JJQVNfMiwKLQkuYW5jX21pY2JpYXMgPSBNSUNfQklBU18yLAotCS5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHdjZF9hdWRpb19wYXRoc1tdID0gewotCXsiTUlDIEJJQVMxIiwgTlVMTCwgIk1DTEsgVFgifSwKLQl7Ik1JQyBCSUFTMiIsIE5VTEwsICJNQ0xLIFRYIn0sCi0JeyJNSUMgQklBUzMiLCBOVUxMLCAiTUNMSyBUWCJ9LAotCXsiTUlDIEJJQVM0IiwgTlVMTCwgIk1DTEsgVFgifSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWZlX2Nsa19zZXQgbWkyc19jbGtbTUkyU19NQVhdID0gewotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9QUklfTUkyU19JQklULAotCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9TRUNfTUkyU19JQklULAotCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9URVJfTUkyU19JQklULAotCQlRNkFGRV9MUEFTU19JQklUX0NMS18xX1A1MzZfTUhaLAotCQlRNkFGRV9MUEFTU19DTEtfQVRUUklCVVRFX0NPVVBMRV9OTywKLQkJUTZBRkVfTFBBU1NfQ0xLX1JPT1RfREVGQVVMVCwKLQkJMCwKLQl9LAotCXsKLQkJQUZFX0FQSV9WRVJTSU9OX0kyU19DT05GSUcsCi0JCVE2QUZFX0xQQVNTX0NMS19JRF9RVUFEX01JMlNfSUJJVCwKLQkJUTZBRkVfTFBBU1NfSUJJVF9DTEtfMV9QNTM2X01IWiwKLQkJUTZBRkVfTFBBU1NfQ0xLX0FUVFJJQlVURV9DT1VQTEVfTk8sCi0JCVE2QUZFX0xQQVNTX0NMS19ST09UX0RFRkFVTFQsCi0JCTAsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtaTJzX2F1eF9wY21fY29tbW9uX2NvbmYgbWkyc19hdXhwY21fY29uZltQQ01fSTJTX1NFTF9NQVhdOwotc3RhdGljIHN0cnVjdCBtaTJzX2NvbmYgbWkyc19pbnRmX2NvbmZbTUkyU19NQVhdOwotc3RhdGljIHN0cnVjdCBhdXhwY21fY29uZiBhdXhwY21faW50Zl9jb25mW0FVWF9QQ01fTUFYXTsKLQotc3RhdGljIGludCBzbGltX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQotewotCWludCBzYW1wbGVfcmF0ZV92YWwgPSAwOwotCi0Jc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAwOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzg4UDJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE3NlA0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA3OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA4OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDEwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHNhbXBsZV9yYXRlX3ZhbDsKLX0KLQotc3RhdGljIGludCBzbGltX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCi17Ci0JaW50IHNhbXBsZV9yYXRlID0gMDsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDA6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84OFAyS0haOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZTsKLX0KLQotc3RhdGljIGludCBzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChpbnQgYml0X2Zvcm1hdCkKLXsKLQlpbnQgdmFsID0gMDsKLQotCXN3aXRjaCAoYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JCXZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQl2YWwgPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl2YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCXZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW50IHNsaW1fZ2V0X2JpdF9mb3JtYXQoaW50IHZhbCkKLXsKLQlpbnQgYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCi0Jc3dpdGNoICh2YWwpIHsKLQljYXNlIDA6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJYml0X2ZtdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQliaXRfZm10ID0gU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJpdF9mbXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBiaXRfZm10OwotfQotCi1zdGF0aWMgaW50IHNsaW1fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBwb3J0X2lkID0gMDsKLQotCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV8wX1JYIiwgc2l6ZW9mKCJTTElNXzBfUlgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1JYXzA7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMl9SWCIsIHNpemVvZigiU0xJTV8yX1JYIikpKQotCQlwb3J0X2lkID0gU0xJTV9SWF8yOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzVfUlgiLCBzaXplb2YoIlNMSU1fNV9SWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fUlhfNTsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0xJTV82X1JYIiwgc2l6ZW9mKCJTTElNXzZfUlgiKSkpCi0JCXBvcnRfaWQgPSBTTElNX1JYXzY7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlNMSU1fMF9UWCIsIHNpemVvZigiU0xJTV8wX1RYIikpKQotCQlwb3J0X2lkID0gU0xJTV9UWF8wOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTTElNXzFfVFgiLCBzaXplb2YoIlNMSU1fMV9UWCIpKSkKLQkJcG9ydF9pZCA9IFNMSU1fVFhfMTsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHBvcnRfaWQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCXNsaW1fZ2V0X3NhbXBsZV9yYXRlX3ZhbChzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0Jc2xpbV9yeF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9Ci0JCXNsaW1fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJc2xpbV9nZXRfc2FtcGxlX3JhdGVfdmFsKHNsaW1fdHhfY2ZnW2NoX251bV0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgc2FtcGxlX3JhdGUgPSAwOwotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNhbXBsZV9yYXRlID0gc2xpbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JaWYgKHNhbXBsZV9yYXRlID09IFNBTVBMSU5HX1JBVEVfNDRQMUtIWikgewotCQlwcl9lcnIoIiVzOiBVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZDogZm9yIFR4IHBhdGhcbiIsCi0JCQlfX2Z1bmNfXywgc2FtcGxlX3JhdGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCB2YWx1ZSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGNoX251bSwgc2xpbV90eF9jZmdbY2hfbnVtXS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2xpbV9yeF9iaXRfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQkJc2xpbV9nZXRfYml0X2Zvcm1hdF92YWwoc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0Jc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0ID0KLQkJc2xpbV9nZXRfYml0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogc2xpbVslZF1fcnhfYml0X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIGNoX251bSwgc2xpbV9yeF9jZmdbY2hfbnVtXS5iaXRfZm9ybWF0LAotCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbGltX3R4X2JpdF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGNoX251bSA9IHNsaW1fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChjaF9udW0gPCAwKQotCQlyZXR1cm4gY2hfbnVtOwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCQlzbGltX2dldF9iaXRfZm9ybWF0X3ZhbChzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQpOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNsaW1fdHhfYml0X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgY2hfbnVtID0gc2xpbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGNoX251bSA8IDApCi0JCXJldHVybiBjaF9udW07Ci0KLQlzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQgPQotCQlzbGltX2dldF9iaXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBzbGltWyVkXV90eF9iaXRfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywgY2hfbnVtLCBzbGltX3R4X2NmZ1tjaF9udW1dLmJpdF9mb3JtYXQsCi0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV9yeF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fcnhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgY2hfbnVtLCBzbGltX3J4X2NmZ1tjaF9udW1dLmNoYW5uZWxzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXByX2RlYnVnKCIlczogbXNtX3NsaW1fWyVkXV90eF9jaCAgPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBzbGltX3R4X2NmZ1tjaF9udW1dLmNoYW5uZWxzIC0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBjaF9udW0gPSBzbGltX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoY2hfbnVtIDwgMCkKLQkJcmV0dXJuIGNoX251bTsKLQotCXNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV9zbGltX1slZF1fdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sCi0JCSBjaF9udW0sIHNsaW1fdHhfY2ZnW2NoX251bV0uY2hhbm5lbHMpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1zbV92aV9mZWVkX3R4X2NoIC0gMTsKLQlwcl9kZWJ1ZygiJXM6IG1zbV92aV9mZWVkX3R4X2NoID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fdmlfZmVlZF90eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCW1zbV92aV9mZWVkX3R4X2NoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOwotCi0JcHJfZGVidWcoIiVzOiBtc21fdmlfZmVlZF90eF9jaCA9ICVkXG4iLCBfX2Z1bmNfXywgbXNtX3ZpX2ZlZWRfdHhfY2gpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1zbV9idF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQkvKgotCSAqIFNsaW1idXNfN19SeC9UeCBzYW1wbGUgcmF0ZSB2YWx1ZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBzeW5jIChzYW1lKQotCSAqIHdoZW4gdXNlZCBmb3IgQlRfU0NPIHVzZSBjYXNlLiBSZXR1cm4gZWl0aGVyIFJ4IG9yIFR4IHNhbXBsZSByYXRlCi0JICogdmFsdWUuCi0JICovCi0Jc3dpdGNoIChzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlKSB7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQlkZWZhdWx0OgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JCWJyZWFrOwotCX0KLQlwcl9kZWJ1ZygiJXM6IHNhbXBsZSByYXRlID0gJWQiLCBfX2Z1bmNfXywKLQkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2J0X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDE6Ci0JCXNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiBzYW1wbGUgcmF0ZXM6IHNsaW03X3J4ID0gJWQsIHNsaW03X3R4ID0gJWQsIHZhbHVlID0gJWRcbiIsCi0JCSBfX2Z1bmNfXywKLQkJIHNsaW1fcnhfY2ZnW1NMSU1fUlhfN10uc2FtcGxlX3JhdGUsCi0JCSBzbGltX3R4X2NmZ1tTTElNX1RYXzddLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHVzYl9yeF9jZmcuY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3J4X2NmZy5jaGFubmVscyAtIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1c2JfcnhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOwotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl9yeF9jZmcuY2hhbm5lbHMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0KLQlzd2l0Y2ggKHVzYl9yeF9jZmcuc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTA7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA4OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBzYW1wbGVfcmF0ZV92YWw7Ci0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGUgPSAlZFxuIiwgX19mdW5jX18sCi0JCSB1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fcnhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAxMjoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzg0S0haOwotCQlicmVhazsKLQljYXNlIDExOgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zNTJQOEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxMDoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOwotCQlicmVhazsKLQljYXNlIDk6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE3NlA0S0haOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDc6Ci0JCXVzYl9yeF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8yMlAwNUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl1c2JfcnhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xMVAwMjVLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQotCXByX2RlYnVnKCIlczogY29udHJvbCB2YWx1ZSA9ICVsZCwgdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlID0gJWRcbiIsCi0JCV9fZnVuY19fLCB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSwKLQkJdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1c2JfcnhfY2ZnLmJpdF9mb3JtYXQpIHsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfM0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3J4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCB1c2JfcnhfY2ZnLmJpdF9mb3JtYXQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDM6Ci0JCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl1c2JfcnhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWRlZmF1bHQ6Ci0JCXVzYl9yeF9jZmcuYml0X2Zvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQl9Ci0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fcnhfZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIHVzYl9yeF9jZmcuYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB1c2JfYXVkaW9fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHVzYl90eF9jZmcuY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdXNiX3R4X2NmZy5jaGFubmVscyAtIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1c2JfdHhfY2ZnLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gKyAxOwotCi0JcHJfZGVidWcoIiVzOiB1c2JfYXVkaW9fdHhfY2ggPSAlZFxuIiwgX19mdW5jX18sIHVzYl90eF9jZmcuY2hhbm5lbHMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBzYW1wbGVfcmF0ZV92YWw7Ci0KLQlzd2l0Y2ggKHVzYl90eF9jZmcuc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzg0S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzM1MlA4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTA7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA4OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzMyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA0OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8xNktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzExUDAyNUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDY7Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOwotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3dpdGNoICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCWNhc2UgMTI6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM4NEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE5MktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNzZQNEtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQl1c2JfdHhfY2ZnLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84OFAyS0haOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMjJQMDVLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdXNiX3R4X2NmZy5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTFQMDI1S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIHVzYl9hdWRpb190eF9zYW1wbGVfcmF0ZSA9ICVkXG4iLAotCQlfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0sCi0JCXVzYl90eF9jZmcuc2FtcGxlX3JhdGUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN3aXRjaCAodXNiX3R4X2NmZy5iaXRfZm9ybWF0KSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAzOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JZGVmYXVsdDoKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHVzYl9hdWRpb190eF9mb3JtYXQgPSAlZCwgdWNvbnRyb2wgdmFsdWUgPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdXNiX3R4X2NmZy5iaXRfZm9ybWF0LAotCQkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9hdWRpb190eF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCByYyA9IDA7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSAzOgotCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdXNiX3R4X2NmZy5iaXRfZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQl1c2JfdHhfY2ZnLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogdXNiX2F1ZGlvX3R4X2Zvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCB1c2JfdHhfY2ZnLmJpdF9mb3JtYXQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBpZHg7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIkRpc3BsYXkgUG9ydCBSWCIsCi0JCSAgICBzaXplb2YoIkRpc3BsYXkgUG9ydCBSWCIpKSkgewotCQlpZHggPSBEUF9SWF9JRFg7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgQkU6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCWlkeCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXN3aXRjaCAoZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCWRlZmF1bHQ6Ci0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uZm9ybWF0ID0gJWQsIHVjb250cm9sIHZhbHVlID0gJWxkXG4iLAotCQkgX19mdW5jX18sIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGV4dF9kaXNwX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDE6Ci0JCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWRlZmF1bHQ6Ci0JCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JfQotCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLmZvcm1hdCA9ICVkLCB1Y29udHJvbCB2YWx1ZSA9ICVsZFxuIiwKLQkJIF9fZnVuY19fLCBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMgLSAyOwotCi0JcHJfZGVidWcoIiVzOiBleHRfZGlzcF9yeFslZF0uY2ggPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGV4dF9kaXNwX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVscyA9Ci0JCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDI7Ci0KLQlwcl9kZWJ1ZygiJXM6IGV4dF9kaXNwX3J4WyVkXS5jaCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uY2hhbm5lbHMpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbDsKLQlpbnQgaWR4ID0gZXh0X2Rpc3BfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0Jc3dpdGNoIChleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV8xNzZQNEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfODhQMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfNDRQMUtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCi0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNBTVBMSU5HX1JBVEVfOTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTQU1QTElOR19SQVRFXzQ4S0haOgotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gc2FtcGxlX3JhdGVfdmFsOwotCXByX2RlYnVnKCIlczogZXh0X2Rpc3BfcnhbJWRdLnNhbXBsZV9yYXRlID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBleHRfZGlzcF9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBleHRfZGlzcF9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JY2FzZSA2OgotCQlleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTc2UDRLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzg4UDJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzMyS0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJZXh0X2Rpc3BfcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IGNvbnRyb2wgdmFsdWUgPSAlbGQsIGV4dF9kaXNwX3J4WyVkXS5zYW1wbGVfcmF0ZSA9ICVkXG4iLAotCQkgX19mdW5jX18sIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLCBpZHgsCi0JCSBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJveHlfcnhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlczogcHJveHlfcnggY2hhbm5lbHMgPSAlZFxuIiwKLQkJIF9fZnVuY19fLCBwcm94eV9yeF9jZmcuY2hhbm5lbHMpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJveHlfcnhfY2ZnLmNoYW5uZWxzIC0gMjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByb3h5X3J4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlwcm94eV9yeF9jZmcuY2hhbm5lbHMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSArIDI7Ci0JcHJfZGVidWcoIiVzOiBwcm94eV9yeCBjaGFubmVscyA9ICVkXG4iLAotCQkgX19mdW5jX18sIHByb3h5X3J4X2NmZy5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCB0ZG1fZ2V0X3NhbXBsZV9yYXRlKGludCB2YWx1ZSkKLXsKLQlpbnQgc2FtcGxlX3JhdGUgPSAwOwotCi0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zMktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDRQMUtIWjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzk2S0haOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xOTJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzM1MlA4S0haOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8zODRLSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZTsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZShpbnQgdmFsdWUpCi17Ci0JaW50IHNhbXBsZV9yYXRlOwotCi0Jc3dpdGNoICh2YWx1ZSkgewotCWNhc2UgMToKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzE2S0haOwotCQlicmVhazsKLQljYXNlIDA6Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzhLSFo7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX2dldF9zYW1wbGVfcmF0ZV92YWwoaW50IHNhbXBsZV9yYXRlKQotewotCWludCBzYW1wbGVfcmF0ZV92YWwgPSAwOwotCi0Jc3dpdGNoIChzYW1wbGVfcmF0ZSkgewotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAwOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zMktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzQ0UDFLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80OEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzk2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA1OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTkyS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSA2OwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzUyUDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDc7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV8zODRLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMTZLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV84S0haOgotCWRlZmF1bHQ6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGVfdmFsOwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfcG9ydF9pZHgoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgc3RydWN0IHRkbV9wb3J0ICpwb3J0KQotewotCWlmIChwb3J0KSB7Ci0JCWlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUFJJIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5tb2RlID0gVERNX1BSSTsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5tb2RlID0gVERNX1NFQzsKLQkJfSBlbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVCIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+bW9kZSA9IFRETV9URVJUOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpKSB7Ci0JCQlwb3J0LT5tb2RlID0gVERNX1FVQVQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBtb2RlIGluOiAlcyIsCi0JCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8wIiwKLQkJICAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCSAgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMCIsCi0JCSAgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8wOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8xIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMSIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8xOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8yIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMiIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8yOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF8zIiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfMyIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV8zOwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF80IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNCIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV80OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF81IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNSIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV81OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF82IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNiIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV82OwotCQl9IGVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJSWF83IiwKLQkJCSAgIHNpemVvZihrY29udHJvbC0+aWQubmFtZSkpIHx8Ci0JCQkgICBzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVFhfNyIsCi0JCQkgICBzaXplb2Yoa2NvbnRyb2wtPmlkLm5hbWUpKSkgewotCQkJcG9ydC0+Y2hhbm5lbCA9IFRETV83OwotCQl9IGVsc2UgewotCQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbCBpbjogJXMiLAotCQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKAotCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUpOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlID0KLQkJCXRkbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfc2FtcGxlX3JhdGVfdmFsKAotCQkJdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUpOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uc2FtcGxlX3JhdGUsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLnNhbXBsZV9yYXRlID0KLQkJCXRkbV9nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5zYW1wbGVfcmF0ZSwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fZ2V0X2Zvcm1hdChpbnQgdmFsdWUpCi17Ci0JaW50IGZvcm1hdCA9IDA7Ci0KLQlzd2l0Y2ggKHZhbHVlKSB7Ci0JY2FzZSAwOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZm9ybWF0OwotfQotCi1zdGF0aWMgaW50IHRkbV9nZXRfZm9ybWF0X3ZhbChpbnQgZm9ybWF0KQotewotCWludCB2YWx1ZSA9IDA7Ci0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdmFsdWUgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl2YWx1ZSA9IDI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCB0ZG1fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gdGRtX2dldF9mb3JtYXRfdmFsKAotCQkJCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQpOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQgPQotCQkJdGRtX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fcnhfYml0X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmJpdF9mb3JtYXQsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHRkbV9nZXRfZm9ybWF0X3ZhbCgKLQkJCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0KTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV90eF9iaXRfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uYml0X2Zvcm1hdCwKLQkJCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0ID0KLQkJCXRkbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X2JpdF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5iaXRfZm9ybWF0LAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQkJdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3J4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3J4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMgLSAxLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRkbV9yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHRkbV9wb3J0IHBvcnQ7Ci0JaW50IHJldCA9IHRkbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wsICZwb3J0KTsKLQotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY29udHJvbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQl9IGVsc2UgewotCQl0ZG1fcnhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyA9Ci0JCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICsgMTsKLQotCQlwcl9kZWJ1ZygiJXM6IHRkbV9yeF9jaCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkJIHRkbV9yeF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzLAotCQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZG1fdHhfY2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCB0ZG1fcG9ydCBwb3J0OwotCWludCByZXQgPSB0ZG1fZ2V0X3BvcnRfaWR4KGtjb250cm9sLCAmcG9ydCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHVuc3VwcG9ydGVkIGNvbnRyb2w6ICVzIiwKLQkJCV9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7Ci0JfSBlbHNlIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCQl0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDE7Ci0KLQkJcHJfZGVidWcoIiVzOiB0ZG1fdHhfY2ggPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSB0ZG1fdHhfY2ZnW3BvcnQubW9kZV1bcG9ydC5jaGFubmVsXS5jaGFubmVscyAtIDEsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGRtX3R4X2NoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgdGRtX3BvcnQgcG9ydDsKLQlpbnQgcmV0ID0gdGRtX2dldF9wb3J0X2lkeChrY29udHJvbCwgJnBvcnQpOwotCi0JaWYgKHJldCkgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBjb250cm9sOiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCX0gZWxzZSB7Ci0JCXRkbV90eF9jZmdbcG9ydC5tb2RlXVtwb3J0LmNoYW5uZWxdLmNoYW5uZWxzID0KLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gKyAxOwotCi0JCXByX2RlYnVnKCIlczogdGRtX3R4X2NoID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCQkgdGRtX3R4X2NmZ1twb3J0Lm1vZGVdW3BvcnQuY2hhbm5lbF0uY2hhbm5lbHMsCi0JCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDEpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fZ2V0X3BvcnRfaWR4KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKQotewotCWludCBpZHg7Ci0KLQlpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlBSSU1fQVVYX1BDTSIsCi0JCSAgICBzaXplb2YoIlBSSU1fQVVYX1BDTSIpKSkKLQkJaWR4ID0gUFJJTV9BVVhfUENNOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfQVVYX1BDTSIsCi0JCQkgc2l6ZW9mKCJTRUNfQVVYX1BDTSIpKSkKLQkJaWR4ID0gU0VDX0FVWF9QQ007Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfQVVYX1BDTSIsCi0JCQkgc2l6ZW9mKCJURVJUX0FVWF9QQ00iKSkpCi0JCWlkeCA9IFRFUlRfQVVYX1BDTTsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiUVVBVF9BVVhfUENNIiwKLQkJCSBzaXplb2YoIlFVQVRfQVVYX1BDTSIpKSkKLQkJaWR4ID0gUVVBVF9BVVhfUENNOwotCWVsc2UgewotCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBwb3J0OiAlcyIsCi0JCQlfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOwotCQlpZHggPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQgYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JYXV4X3BjbV9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSA9Ci0JCWF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCSAgICAgYXV4X3BjbV9nZXRfc2FtcGxlX3JhdGVfdmFsKGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X3NhbXBsZV9yYXRlID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSBpZHgsIGF1eF9wY21fcnhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUsCi0JCSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCWF1eF9wY21fdHhfY2ZnW2lkeF0uc2FtcGxlX3JhdGUgPQotCQlhdXhfcGNtX2dldF9zYW1wbGVfcmF0ZSh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkgICAgIGF1eF9wY21fZ2V0X3NhbXBsZV9yYXRlX3ZhbChhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBhdXhfcGNtX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX2dldF9wb3J0X2lkeChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX01JMlNfUlgiLAotCSAgICBzaXplb2YoIlBSSU1fTUkyU19SWCIpKSkKLQkJaWR4ID0gUFJJTV9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJTRUNfTUkyU19SWCIsCi0JCSBzaXplb2YoIlNFQ19NSTJTX1JYIikpKQotCQlpZHggPSBTRUNfTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiVEVSVF9NSTJTX1JYIiwKLQkJIHNpemVvZigiVEVSVF9NSTJTX1JYIikpKQotCQlpZHggPSBURVJUX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlFVQVRfTUkyU19SWCIsCi0JCSBzaXplb2YoIlFVQVRfTUkyU19SWCIpKSkKLQkJaWR4ID0gUVVBVF9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJQUklNX01JMlNfVFgiLAotCQkgc2l6ZW9mKCJQUklNX01JMlNfVFgiKSkpCi0JCWlkeCA9IFBSSU1fTUkyUzsKLQllbHNlIGlmIChzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiU0VDX01JMlNfVFgiLAotCQkgc2l6ZW9mKCJTRUNfTUkyU19UWCIpKSkKLQkJaWR4ID0gU0VDX01JMlM7Ci0JZWxzZSBpZiAoc3RybnN0cihrY29udHJvbC0+aWQubmFtZSwgIlRFUlRfTUkyU19UWCIsCi0JCSBzaXplb2YoIlRFUlRfTUkyU19UWCIpKSkKLQkJaWR4ID0gVEVSVF9NSTJTOwotCWVsc2UgaWYgKHN0cm5zdHIoa2NvbnRyb2wtPmlkLm5hbWUsICJRVUFUX01JMlNfVFgiLAotCQkgc2l6ZW9mKCJRVUFUX01JMlNfVFgiKSkpCi0JCWlkeCA9IFFVQVRfTUkyUzsKLQllbHNlIHsKLQkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgY2hhbm5lbDogJXMiLAotCQkJX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKLQkJaWR4ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50IG1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChpbnQgc2FtcGxlX3JhdGUpCi17Ci0JaW50IHNhbXBsZV9yYXRlX3ZhbDsKLQotCXN3aXRjaCAoc2FtcGxlX3JhdGUpIHsKLQljYXNlIFNBTVBMSU5HX1JBVEVfOEtIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE2S0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfMzJLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV80NFAxS0haOgotCQlzYW1wbGVfcmF0ZV92YWwgPSAzOwotCQlicmVhazsKLQljYXNlIFNBTVBMSU5HX1JBVEVfNDhLSFo6Ci0JCXNhbXBsZV9yYXRlX3ZhbCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0FNUExJTkdfUkFURV85NktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSBTQU1QTElOR19SQVRFXzE5MktIWjoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2FtcGxlX3JhdGVfdmFsID0gNDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzYW1wbGVfcmF0ZV92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19nZXRfc2FtcGxlX3JhdGUoaW50IHZhbHVlKQotewotCWludCBzYW1wbGVfcmF0ZTsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDA6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV84S0haOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV8xNktIWjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMzJLSFo7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ0UDFLSFo7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJc2FtcGxlX3JhdGUgPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXNhbXBsZV9yYXRlID0gU0FNUExJTkdfUkFURV85NktIWjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfMTkyS0haOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzYW1wbGVfcmF0ZSA9IFNBTVBMSU5HX1JBVEVfNDhLSFo7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc2FtcGxlX3JhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19hdXhwY21fZ2V0X2Zvcm1hdChpbnQgdmFsdWUpCi17Ci0JaW50IGZvcm1hdDsKLQotCXN3aXRjaCAodmFsdWUpIHsKLQljYXNlIDA6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZvcm1hdCA9IFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlmb3JtYXQgPSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZm9ybWF0ID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZm9ybWF0OwotfQotCi1zdGF0aWMgaW50IG1pMnNfYXV4cGNtX2dldF9mb3JtYXRfdmFsdWUoaW50IGZvcm1hdCkKLXsKLQlpbnQgdmFsdWU7Ci0KLQlzd2l0Y2ggKGZvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJdmFsdWUgPSAxOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0XzNMRToKLQkJdmFsdWUgPSAyOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQl2YWx1ZSA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBtaTJzX3J4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtaTJzX3R4X3NhbXBsZV9yYXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlID0KLQkJbWkyc19nZXRfc2FtcGxlX3JhdGUodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfc2FtcGxlX3JhdGUgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZSwKLQkJIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfZ2V0X3NhbXBsZV9yYXRlX3ZhbChtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9zYW1wbGVfcmF0ZSA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlLAotCQkgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fcnhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3J4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3J4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc19yeF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQlwcl9kZWJ1ZygiJXM6IG1zbV9taTJzX1slZF1fdHhfY2ggID0gJWRcbiIsIF9fZnVuY19fLAotCQkgaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzKTsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyAtIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc190eF9jaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmNoYW5uZWxzID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSArIDE7Ci0JcHJfZGVidWcoIiVzOiBtc21fbWkyc19bJWRdX3R4X2NoICA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIGlkeCwgbWkyc190eF9jZmdbaWR4XS5jaGFubmVscyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtc21fbWkyc19yeF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBtaTJzX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQltaTJzX2F1eHBjbV9nZXRfZm9ybWF0X3ZhbHVlKG1pMnNfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCWlkeCwgbWkyc19yeF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9taTJzX3J4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JbWkyc19yeF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0KLQkJbWkyc19hdXhwY21fZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV9yeF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJICBpZHgsIG1pMnNfcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9taTJzX3R4X2Zvcm1hdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IG1pMnNfZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9Ci0JCW1pMnNfYXV4cGNtX2dldF9mb3JtYXRfdmFsdWUobWkyc190eF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJaWR4LCBtaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX21pMnNfdHhfZm9ybWF0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gbWkyc19nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQltaTJzX3R4X2NmZ1tpZHhdLmJpdF9mb3JtYXQgPQotCQltaTJzX2F1eHBjbV9nZXRfZm9ybWF0KHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3R4X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQkgIGlkeCwgbWkyc190eF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQkgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1eF9wY21fcnhfZm9ybWF0X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlpbnQgaWR4ID0gYXV4X3BjbV9nZXRfcG9ydF9pZHgoa2NvbnRyb2wpOwotCi0JaWYgKGlkeCA8IDApCi0JCXJldHVybiBpZHg7Ci0KLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KLQkJbWkyc19hdXhwY21fZ2V0X2Zvcm1hdF92YWx1ZShhdXhfcGNtX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCi0JcHJfZGVidWcoIiVzOiBpZHhbJWRdX3J4X2Zvcm1hdCA9ICVkLCBpdGVtID0gJWRcbiIsIF9fZnVuY19fLAotCQlpZHgsIGF1eF9wY21fcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYXV4X3BjbV9yeF9mb3JtYXRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCWF1eF9wY21fcnhfY2ZnW2lkeF0uYml0X2Zvcm1hdCA9Ci0JCW1pMnNfYXV4cGNtX2dldF9mb3JtYXQodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fcnhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCSAgaWR4LCBhdXhfcGNtX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQsCi0JCSAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fYXV4X3BjbV90eF9mb3JtYXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCWludCBpZHggPSBhdXhfcGNtX2dldF9wb3J0X2lkeChrY29udHJvbCk7Ci0KLQlpZiAoaWR4IDwgMCkKLQkJcmV0dXJuIGlkeDsKLQotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQotCQltaTJzX2F1eHBjbV9nZXRfZm9ybWF0X3ZhbHVlKGF1eF9wY21fdHhfY2ZnW2lkeF0uYml0X2Zvcm1hdCk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGlkeFslZF1fdHhfZm9ybWF0ID0gJWQsIGl0ZW0gPSAlZFxuIiwgX19mdW5jX18sCi0JCWlkeCwgYXV4X3BjbV90eF9jZmdbaWR4XS5iaXRfZm9ybWF0LAotCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9hdXhfcGNtX3R4X2Zvcm1hdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JaW50IGlkeCA9IGF1eF9wY21fZ2V0X3BvcnRfaWR4KGtjb250cm9sKTsKLQotCWlmIChpZHggPCAwKQotCQlyZXR1cm4gaWR4OwotCi0JYXV4X3BjbV90eF9jZmdbaWR4XS5iaXRfZm9ybWF0ID0KLQkJbWkyc19hdXhwY21fZ2V0X2Zvcm1hdCh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXByX2RlYnVnKCIlczogaWR4WyVkXV90eF9mb3JtYXQgPSAlZCwgaXRlbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJICBpZHgsIGF1eF9wY21fdHhfY2ZnW2lkeF0uYml0X2Zvcm1hdCwKLQkJICB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9oaWZpX2N0cmwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQotCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQotCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sCi0JCSBtc21faGlmaV9jb250cm9sKTsKLQotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5ocGhfZW4xX2dwaW9fcCkgewotCQlwcl9lcnIoIiVzOiBocGhfZW4xX2dwaW8gaXMgaW52YWxpZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKG1zbV9oaWZpX2NvbnRyb2wgPT0gTVNNX0hJRklfT04pIHsKLQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUocGRhdGEtPmhwaF9lbjFfZ3Bpb19wKTsKLQkJLyogNW1zZWMgZGVsYXkgbmVlZGVkIGFzIHBlciBIVyByZXF1aXJlbWVudCAqLwotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNTAxMCk7Ci0JfSBlbHNlIHsKLQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZShwZGF0YS0+aHBoX2VuMV9ncGlvX3ApOwotCX0KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9oaWZpX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkXG4iLAotCQkgX19mdW5jX18sIG1zbV9oaWZpX2NvbnRyb2wpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbXNtX2hpZmlfY29udHJvbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9oaWZpX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCi0JcHJfZGVidWcoIiVzKCkgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAlbGRcbiIsCi0JCSBfX2Z1bmNfXywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCi0JbXNtX2hpZmlfY29udHJvbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCW1zbV9oaWZpX2N0cmwoY29kZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzMzIgbXNtX3Fvc192YWx1ZShzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCXMzMiB1c2VjczsKLQotCWlmICghcnVudGltZS0+cmF0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiB0YWtlIDc1JSBvZiBwZXJpb2QgdGltZSBhcyB0aGUgZGVhZGxpbmUgKi8KLQl1c2VjcyA9ICg3NTAwMDAgLyBydW50aW1lLT5yYXRlKSAqIHJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCXVzZWNzICs9ICgoNzUwMDAwICUgcnVudGltZS0+cmF0ZSkgKiBydW50aW1lLT5wZXJpb2Rfc2l6ZSkgLwotCQkgcnVudGltZS0+cmF0ZTsKLQotCXJldHVybiB1c2VjczsKLX0KLQotc3RhdGljIGludCBtc21fcW9zX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcW9zX3ZvdGVfc3RhdHVzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3Fvc19jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQljb25zdCBjaGFyICpiZV9uYW1lID0gTVNNX0RBSUxJTktfTkFNRShMb3dMYXRlbmN5KTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwotCXMzMiB1c2VjczsKLQotCXJ0ZCA9IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKGNhcmQsIGJlX25hbWUpOwotCWlmICghcnRkKSB7Ci0JCXByX2VycigiJXM6IGZhaWwgdG8gZ2V0IHBjbSBydW50aW1lIGZvciAlc1xuIiwKLQkJCV9fZnVuY19fLCBiZV9uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Vic3RyZWFtID0gcnRkLT5wY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwotCWlmICghc3Vic3RyZWFtKSB7Ci0JCXByX2VycigiJXM6IHN1YnN0cmVhbSBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXFvc192b3RlX3N0YXR1cyA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JaWYgKHFvc192b3RlX3N0YXR1cykgewotCQlpZiAocG1fcW9zX3JlcXVlc3RfYWN0aXZlKCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSkpCi0JCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJnN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxKTsKLQkJaWYgKCFzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKLQkJCXByX2VycigiJXM6IHJ1bnRpbWUgaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJdXNlY3MgPSBtc21fcW9zX3ZhbHVlKHN1YnN0cmVhbS0+cnVudGltZSk7Ci0JCWlmICh1c2VjcyA+PSAwKQotCQkJcG1fcW9zX2FkZF9yZXF1ZXN0KCZzdWJzdHJlYW0tPmxhdGVuY3lfcG1fcW9zX3JlcSwKLQkJCQkJUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwgdXNlY3MpOwotCX0gZWxzZSB7Ci0JCWlmIChwbV9xb3NfcmVxdWVzdF9hY3RpdmUoJnN1YnN0cmVhbS0+bGF0ZW5jeV9wbV9xb3NfcmVxKSkKLQkJCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmc3Vic3RyZWFtLT5sYXRlbmN5X3BtX3Fvc19yZXEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXNtX3NuZF9jb250cm9sc1tdID0gewotCVNPQ19FTlVNX0VYVCgiU0xJTV8wX1JYIENoYW5uZWxzIiwgc2xpbV8wX3J4X2NocywKLQkJCW1zbV9zbGltX3J4X2NoX2dldCwgbXNtX3NsaW1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBDaGFubmVscyIsIHNsaW1fMl9yeF9jaHMsCi0JCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfVFggQ2hhbm5lbHMiLCBzbGltXzBfdHhfY2hzLAotCQkJbXNtX3NsaW1fdHhfY2hfZ2V0LCBtc21fc2xpbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV8xX1RYIENoYW5uZWxzIiwgc2xpbV8xX3R4X2NocywKLQkJCW1zbV9zbGltX3R4X2NoX2dldCwgbXNtX3NsaW1fdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBDaGFubmVscyIsIHNsaW1fNV9yeF9jaHMsCi0JCQltc21fc2xpbV9yeF9jaF9nZXQsIG1zbV9zbGltX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzZfUlggQ2hhbm5lbHMiLCBzbGltXzZfcnhfY2hzLAotCQkJbXNtX3NsaW1fcnhfY2hfZ2V0LCBtc21fc2xpbV9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVklfRkVFRF9UWCBDaGFubmVscyIsIHZpX2ZlZWRfdHhfY2hzLAotCQkJbXNtX3ZpX2ZlZWRfdHhfY2hfZ2V0LCBtc21fdmlfZmVlZF90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIENoYW5uZWxzIiwgdXNiX3J4X2NocywKLQkJCXVzYl9hdWRpb19yeF9jaF9nZXQsIHVzYl9hdWRpb19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIENoYW5uZWxzIiwgdXNiX3R4X2NocywKLQkJCXVzYl9hdWRpb190eF9jaF9nZXQsIHVzYl9hdWRpb190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIENoYW5uZWxzIiwgZXh0X2Rpc3BfcnhfY2hzLAotCQkJZXh0X2Rpc3BfcnhfY2hfZ2V0LCBleHRfZGlzcF9yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJPWFlfUlggQ2hhbm5lbHMiLCBwcm94eV9yeF9jaHMsCi0JCQlwcm94eV9yeF9jaF9nZXQsIHByb3h5X3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfUlggRm9ybWF0Iiwgc2xpbV8wX3J4X2Zvcm1hdCwKLQkJCXNsaW1fcnhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fcnhfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0xJTV81X1JYIEZvcm1hdCIsIHNsaW1fNV9yeF9mb3JtYXQsCi0JCQlzbGltX3J4X2JpdF9mb3JtYXRfZ2V0LCBzbGltX3J4X2JpdF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBGb3JtYXQiLCBzbGltXzZfcnhfZm9ybWF0LAotCQkJc2xpbV9yeF9iaXRfZm9ybWF0X2dldCwgc2xpbV9yeF9iaXRfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTTElNXzBfVFggRm9ybWF0Iiwgc2xpbV8wX3R4X2Zvcm1hdCwKLQkJCXNsaW1fdHhfYml0X2Zvcm1hdF9nZXQsIHNsaW1fdHhfYml0X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1JYIEZvcm1hdCIsIHVzYl9yeF9mb3JtYXQsCi0JCQl1c2JfYXVkaW9fcnhfZm9ybWF0X2dldCwgdXNiX2F1ZGlvX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIEZvcm1hdCIsIHVzYl90eF9mb3JtYXQsCi0JCQl1c2JfYXVkaW9fdHhfZm9ybWF0X2dldCwgdXNiX2F1ZGlvX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiRGlzcGxheSBQb3J0IFJYIEJpdCBGb3JtYXQiLCBleHRfZGlzcF9yeF9mb3JtYXQsCi0JCQlleHRfZGlzcF9yeF9mb3JtYXRfZ2V0LCBleHRfZGlzcF9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMF9SWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMl9SWCBTYW1wbGVSYXRlIiwgc2xpbV8yX3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fMF9UWCBTYW1wbGVSYXRlIiwgc2xpbV8wX3R4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV90eF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNV9SWCBTYW1wbGVSYXRlIiwgc2xpbV81X3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNMSU1fNl9SWCBTYW1wbGVSYXRlIiwgc2xpbV82X3J4X3NhbXBsZV9yYXRlLAotCQkJc2xpbV9yeF9zYW1wbGVfcmF0ZV9nZXQsIHNsaW1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkJUIFNhbXBsZVJhdGUiLCBidF9zYW1wbGVfcmF0ZSwKLQkJCW1zbV9idF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltc21fYnRfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlVTQl9BVURJT19SWCBTYW1wbGVSYXRlIiwgdXNiX3J4X3NhbXBsZV9yYXRlLAotCQkJdXNiX2F1ZGlvX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXVzYl9hdWRpb19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVVNCX0FVRElPX1RYIFNhbXBsZVJhdGUiLCB1c2JfdHhfc2FtcGxlX3JhdGUsCi0JCQl1c2JfYXVkaW9fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdXNiX2F1ZGlvX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJEaXNwbGF5IFBvcnQgUlggU2FtcGxlUmF0ZSIsIGV4dF9kaXNwX3J4X3NhbXBsZV9yYXRlLAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJZXh0X2Rpc3Bfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBTYW1wbGVSYXRlIiwgdGRtX3J4X3NhbXBsZV9yYXRlLAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJX1RETV9UWF8wIEZvcm1hdCIsIHRkbV90eF9mb3JtYXQsCi0JCQl0ZG1fdHhfZm9ybWF0X2dldCwKLQkJCXRkbV90eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSV9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fUlhfMCBGb3JtYXQiLCB0ZG1fcnhfZm9ybWF0LAotCQkJdGRtX3J4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19URE1fVFhfMCBDaGFubmVscyIsIHRkbV90eF9jaHMsCi0JCQl0ZG1fdHhfY2hfZ2V0LAotCQkJdGRtX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIFNhbXBsZVJhdGUiLCB0ZG1fcnhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIFNhbXBsZVJhdGUiLCB0ZG1fdHhfc2FtcGxlX3JhdGUsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJdGRtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9SWF8wIEZvcm1hdCIsIHRkbV9yeF9mb3JtYXQsCi0JCQl0ZG1fcnhfZm9ybWF0X2dldCwKLQkJCXRkbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfVERNX1RYXzAgRm9ybWF0IiwgdGRtX3R4X2Zvcm1hdCwKLQkJCXRkbV90eF9mb3JtYXRfZ2V0LAotCQkJdGRtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9URE1fUlhfMCBDaGFubmVscyIsIHRkbV9yeF9jaHMsCi0JCQl0ZG1fcnhfY2hfZ2V0LAotCQkJdGRtX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX1RETV9UWF8wIENoYW5uZWxzIiwgdGRtX3R4X2NocywKLQkJCXRkbV90eF9jaF9nZXQsCi0JCQl0ZG1fdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgU2FtcGxlUmF0ZSIsIHRkbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgU2FtcGxlUmF0ZSIsIHRkbV90eF9zYW1wbGVfcmF0ZSwKLQkJCXRkbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQl0ZG1fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1JYXzAgRm9ybWF0IiwgdGRtX3J4X2Zvcm1hdCwKLQkJCXRkbV9yeF9mb3JtYXRfZ2V0LAotCQkJdGRtX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9URE1fVFhfMCBGb3JtYXQiLCB0ZG1fdHhfZm9ybWF0LAotCQkJdGRtX3R4X2Zvcm1hdF9nZXQsCi0JCQl0ZG1fdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX1RETV9SWF8wIENoYW5uZWxzIiwgdGRtX3J4X2NocywKLQkJCXRkbV9yeF9jaF9nZXQsCi0JCQl0ZG1fcnhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfVERNX1RYXzAgQ2hhbm5lbHMiLCB0ZG1fdHhfY2hzLAotCQkJdGRtX3R4X2NoX2dldCwKLQkJCXRkbV90eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBwcmltX2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCBzZWNfYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9BVVhfUENNX1JYIFNhbXBsZVJhdGUiLCB0ZXJ0X2F1eF9wY21fcnhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfQVVYX1BDTV9SWCBTYW1wbGVSYXRlIiwgcXVhdF9hdXhfcGNtX3J4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV9yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHByaW1fYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHNlY19hdXhfcGNtX3R4X3NhbXBsZV9yYXRlLAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX0FVWF9QQ01fVFggU2FtcGxlUmF0ZSIsIHRlcnRfYXV4X3BjbV90eF9zYW1wbGVfcmF0ZSwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJYXV4X3BjbV90eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9BVVhfUENNX1RYIFNhbXBsZVJhdGUiLCBxdWF0X2F1eF9wY21fdHhfc2FtcGxlX3JhdGUsCi0JCQlhdXhfcGNtX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCWF1eF9wY21fdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fTUkyU19SWCBTYW1wbGVSYXRlIiwgcHJpbV9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfTUkyU19SWCBTYW1wbGVSYXRlIiwgc2VjX21pMnNfcnhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfTUkyU19SWCBTYW1wbGVSYXRlIiwgdGVydF9taTJzX3J4X3NhbXBsZV9yYXRlLAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3J4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfUlggU2FtcGxlUmF0ZSIsIHF1YXRfbWkyc19yeF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfcnhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc19yeF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1RYIFNhbXBsZVJhdGUiLCBwcmltX21pMnNfdHhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1RYIFNhbXBsZVJhdGUiLCBzZWNfbWkyc190eF9zYW1wbGVfcmF0ZSwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfZ2V0LAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1RYIFNhbXBsZVJhdGUiLCB0ZXJ0X21pMnNfdHhfc2FtcGxlX3JhdGUsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX2dldCwKLQkJCW1pMnNfdHhfc2FtcGxlX3JhdGVfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19UWCBTYW1wbGVSYXRlIiwgcXVhdF9taTJzX3R4X3NhbXBsZV9yYXRlLAotCQkJbWkyc190eF9zYW1wbGVfcmF0ZV9nZXQsCi0JCQltaTJzX3R4X3NhbXBsZV9yYXRlX3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfUlggQ2hhbm5lbHMiLCBwcmltX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1RYIENoYW5uZWxzIiwgcHJpbV9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIENoYW5uZWxzIiwgc2VjX21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX01JMlNfVFggQ2hhbm5lbHMiLCBzZWNfbWkyc190eF9jaHMsCi0JCQltc21fbWkyc190eF9jaF9nZXQsIG1zbV9taTJzX3R4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfUlggQ2hhbm5lbHMiLCB0ZXJ0X21pMnNfcnhfY2hzLAotCQkJbXNtX21pMnNfcnhfY2hfZ2V0LCBtc21fbWkyc19yeF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1RYIENoYW5uZWxzIiwgdGVydF9taTJzX3R4X2NocywKLQkJCW1zbV9taTJzX3R4X2NoX2dldCwgbXNtX21pMnNfdHhfY2hfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBDaGFubmVscyIsIHF1YXRfbWkyc19yeF9jaHMsCi0JCQltc21fbWkyc19yeF9jaF9nZXQsIG1zbV9taTJzX3J4X2NoX3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX01JMlNfVFggQ2hhbm5lbHMiLCBxdWF0X21pMnNfdHhfY2hzLAotCQkJbXNtX21pMnNfdHhfY2hfZ2V0LCBtc21fbWkyc190eF9jaF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUFJJTV9NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX01JMlNfVFggRm9ybWF0IiwgbWkyc190eF9mb3JtYXQsCi0JCQltc21fbWkyc190eF9mb3JtYXRfZ2V0LCBtc21fbWkyc190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJTRUNfTUkyU19UWCBGb3JtYXQiLCBtaTJzX3R4X2Zvcm1hdCwKLQkJCW1zbV9taTJzX3R4X2Zvcm1hdF9nZXQsIG1zbV9taTJzX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiVEVSVF9NSTJTX1JYIEZvcm1hdCIsIG1pMnNfcnhfZm9ybWF0LAotCQkJbXNtX21pMnNfcnhfZm9ybWF0X2dldCwgbXNtX21pMnNfcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX01JMlNfVFggRm9ybWF0IiwgbWkyc190eF9mb3JtYXQsCi0JCQltc21fbWkyc190eF9mb3JtYXRfZ2V0LCBtc21fbWkyc190eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlFVQVRfTUkyU19SWCBGb3JtYXQiLCBtaTJzX3J4X2Zvcm1hdCwKLQkJCW1zbV9taTJzX3J4X2Zvcm1hdF9nZXQsIG1zbV9taTJzX3J4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9NSTJTX1RYIEZvcm1hdCIsIG1pMnNfdHhfZm9ybWF0LAotCQkJbXNtX21pMnNfdHhfZm9ybWF0X2dldCwgbXNtX21pMnNfdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJQUklNX0FVWF9QQ01fUlggRm9ybWF0IiwgYXV4X3BjbV9yeF9mb3JtYXQsCi0JCQltc21fYXV4X3BjbV9yeF9mb3JtYXRfZ2V0LCBtc21fYXV4X3BjbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlBSSU1fQVVYX1BDTV9UWCBGb3JtYXQiLCBhdXhfcGNtX3R4X2Zvcm1hdCwKLQkJCW1zbV9hdXhfcGNtX3R4X2Zvcm1hdF9nZXQsIG1zbV9hdXhfcGNtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiU0VDX0FVWF9QQ01fUlggRm9ybWF0IiwgYXV4X3BjbV9yeF9mb3JtYXQsCi0JCQltc21fYXV4X3BjbV9yeF9mb3JtYXRfZ2V0LCBtc21fYXV4X3BjbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlNFQ19BVVhfUENNX1RYIEZvcm1hdCIsIGF1eF9wY21fdHhfZm9ybWF0LAotCQkJbXNtX2F1eF9wY21fdHhfZm9ybWF0X2dldCwgbXNtX2F1eF9wY21fdHhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJURVJUX0FVWF9QQ01fUlggRm9ybWF0IiwgYXV4X3BjbV9yeF9mb3JtYXQsCi0JCQltc21fYXV4X3BjbV9yeF9mb3JtYXRfZ2V0LCBtc21fYXV4X3BjbV9yeF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIlRFUlRfQVVYX1BDTV9UWCBGb3JtYXQiLCBhdXhfcGNtX3R4X2Zvcm1hdCwKLQkJCW1zbV9hdXhfcGNtX3R4X2Zvcm1hdF9nZXQsIG1zbV9hdXhfcGNtX3R4X2Zvcm1hdF9wdXQpLAotCVNPQ19FTlVNX0VYVCgiUVVBVF9BVVhfUENNX1JYIEZvcm1hdCIsIGF1eF9wY21fcnhfZm9ybWF0LAotCQkJbXNtX2F1eF9wY21fcnhfZm9ybWF0X2dldCwgbXNtX2F1eF9wY21fcnhfZm9ybWF0X3B1dCksCi0JU09DX0VOVU1fRVhUKCJRVUFUX0FVWF9QQ01fVFggRm9ybWF0IiwgYXV4X3BjbV90eF9mb3JtYXQsCi0JCQltc21fYXV4X3BjbV90eF9mb3JtYXRfZ2V0LCBtc21fYXV4X3BjbV90eF9mb3JtYXRfcHV0KSwKLQlTT0NfRU5VTV9FWFQoIkhpRmkgRnVuY3Rpb24iLCBoaWZpX2Z1bmN0aW9uLCBtc21faGlmaV9nZXQsCi0JCQltc21faGlmaV9wdXQpLAotCVNPQ19FTlVNX0VYVCgiTXVsdGlNZWRpYTVfUlggUU9TIFZvdGUiLCBxb3Nfdm90ZSwgbXNtX3Fvc19jdGxfZ2V0LAotCQkJbXNtX3Fvc19jdGxfcHV0KSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCWludCBlbmFibGUsIGJvb2wgZGFwbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQlyZXQgPSB0YXZpbF9jZGNfbWNsa19lbmFibGUoY29kZWMsIGVuYWJsZSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIGV4dCBjbGtcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCi0JCQkJCSAgIGludCBlbmFibGUsIGJvb2wgZGFwbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghc3RyY21wKGRldl9uYW1lKGNvZGVjLT5kZXYpLCAidGF2aWxfY29kZWMiKSkgewotCQlyZXQgPSB0YXZpbF9jZGNfbWNsa190eF9lbmFibGUoY29kZWMsIGVuYWJsZSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHVua25vd24gY29kZWMgdG8gZW5hYmxlIFRYIGV4dCBjbGtcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fbWNsa190eF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGV2ZW50ID0gJWRcbiIsIF9fZnVuY19fLCBldmVudCk7Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKLQkJcmV0dXJuIG1zbV9zbmRfZW5hYmxlX2NvZGVjX2V4dF90eF9jbGsoY29kZWMsIDEsIHRydWUpOwotCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgotCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X3R4X2Nsayhjb2RlYywgMCwgdHJ1ZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9tY2xrX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAotCQkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKLQotCXByX2RlYnVnKCIlczogZXZlbnQgPSAlZFxuIiwgX19mdW5jX18sIGV2ZW50KTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgotCQlyZXR1cm4gbXNtX3NuZF9lbmFibGVfY29kZWNfZXh0X2Nsayhjb2RlYywgMSwgdHJ1ZSk7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6Ci0JCXJldHVybiBtc21fc25kX2VuYWJsZV9jb2RlY19leHRfY2xrKGNvZGVjLCAwLCB0cnVlKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2hpZmlfY3RybF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPQotCQkJCXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQotCXByX2RlYnVnKCIlczogbXNtX2hpZmlfY29udHJvbCA9ICVkIiwgX19mdW5jX18sIG1zbV9oaWZpX2NvbnRyb2wpOwotCi0JaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmhwaF9lbjBfZ3Bpb19wKSB7Ci0JCXByX2VycigiJXM6IGhwaF9lbjBfZ3BpbyBpcyBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChtc21faGlmaV9jb250cm9sICE9IE1TTV9ISUZJX09OKSB7Ci0JCXByX2RlYnVnKCIlczogSGlGaSBtaXhlciBjb250cm9sIGlzIG5vdCBzZXRcbiIsCi0JCQkgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6Ci0JCW1zbV9jZGNfcGluY3RybF9zZWxlY3RfYWN0aXZlX3N0YXRlKHBkYXRhLT5ocGhfZW4wX2dwaW9fcCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6Ci0JCW1zbV9jZGNfcGluY3RybF9zZWxlY3Rfc2xlZXBfc3RhdGUocGRhdGEtPmhwaF9lbjBfZ3Bpb19wKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtc21fZGFwbV93aWRnZXRzW10gPSB7Ci0KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJNQ0xLIiwgIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgICBtc21fbWNsa19ldmVudCwKLQkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCi0KLQlTTkRfU09DX0RBUE1fU1VQUExZKCJNQ0xLIFRYIiwgIFNORF9TT0NfTk9QTSwgMCwgMCwKLQltc21fbWNsa190eF9ldmVudCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotCi0JU05EX1NPQ19EQVBNX1NQSygiTGluZW91dF8xIGFtcCIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIkxpbmVvdXRfMiBhbXAiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJoaWZpIGFtcCIsIG1zbV9oaWZpX2N0cmxfZXZlbnQpLAotCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJBTkNSaWdodCBIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkFOQ0xlZnQgSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJBbmFsb2cgTWljNSIsIE5VTEwpLAotCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMwIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMxIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMyIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMzIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWM0IiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWM1IiwgTlVMTCksCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBwYXJhbV9pc19tYXNrKGludCBwKQotewotCXJldHVybiAocCA+PSBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTSykgJiYKLQkJCShwIDw9IFNORFJWX1BDTV9IV19QQVJBTV9MQVNUX01BU0spOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfbWFzayAqcGFyYW1fdG9fbWFzayhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnAsCi0JCQkJCSAgICAgaW50IG4pCi17Ci0JcmV0dXJuICYocC0+bWFza3NbbiAtIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcmFtX3NldF9tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcCwgaW50IG4sCi0JCQkgICB1bnNpZ25lZCBpbnQgYml0KQotewotCWlmIChiaXQgPj0gU05EUlZfTUFTS19NQVgpCi0JCXJldHVybjsKLQlpZiAocGFyYW1faXNfbWFzayhuKSkgewotCQlzdHJ1Y3Qgc25kX21hc2sgKm0gPSBwYXJhbV90b19tYXNrKHAsIG4pOwotCi0JCW0tPmJpdHNbMF0gPSAwOwotCQltLT5iaXRzWzFdID0gMDsKLQkJbS0+Yml0c1tiaXQgPj4gNV0gfD0gKDEgPDwgKGJpdCAmIDMxKSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9zbGltX2dldF9jaF9mcm9tX2JlaWQoaW50MzJfdCBiZV9pZCkKLXsKLQlpbnQgY2hfaWQgPSAwOwotCi0Jc3dpdGNoIChiZV9pZCkgewotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzA7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzE7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzI7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzM7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzQ7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWDoKLQkJY2hfaWQgPSBTTElNX1JYXzY7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWDoKLQkJY2hfaWQgPSBTTElNX1RYXzA7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWDoKLQkJY2hfaWQgPSBTTElNX1RYXzM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWNoX2lkID0gU0xJTV9SWF8wOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gY2hfaWQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2V4dF9kaXNwX2dldF9pZHhfZnJvbV9iZWlkKGludDMyX3QgYmVfaWQpCi17Ci0JaW50IGlkeDsKLQotCXN3aXRjaCAoYmVfaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlg6Ci0JCWlkeCA9IERQX1JYX0lEWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW5jb3JyZWN0IGV4dF9kaXNwIEJFIGlkICVkXG4iLCBfX2Z1bmNfXywgYmVfaWQpOwotCQlpZHggPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50IG1zbV9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOwotCWludCByYyA9IDA7Ci0JaW50IGlkeDsKLQl2b2lkICpjb25maWcgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IE5VTEw7Ci0KLQlwcl9kZWJ1ZygiJXM6IGZvcm1hdCA9ICVkLCByYXRlID0gJWRcbiIsCi0JCSAgX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSwgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0KLQlzd2l0Y2ggKGRhaV9saW5rLT5pZCkgewotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18yX1JYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19SWDoKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlg6Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYOgotCQlpZHggPSBtc21fc2xpbV9nZXRfY2hfZnJvbV9iZWlkKGRhaV9saW5rLT5pZCk7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlzbGltX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3J4X2NmZ1tpZHhdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHNsaW1fcnhfY2ZnW2lkeF0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYOgotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfM19UWDoKLQkJaWR4ID0gbXNtX3NsaW1fZ2V0X2NoX2Zyb21fYmVpZChkYWlfbGluay0+aWQpOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJc2xpbV90eF9jZmdbaWR4XS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3R4X2NmZ1tpZHhdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMV9UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXNsaW1fdHhfY2ZnWzFdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3R4X2NmZ1sxXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBzbGltX3R4X2NmZ1sxXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRSk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfOEtIWjsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBtc21fdmlfZmVlZF90eF9jaDsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlzbGltX3J4X2NmZ1s1XS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV9yeF9jZmdbNV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gc2xpbV9yeF9jZmdbNV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1RYOgotCQljb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IFNBTVBMSU5HX1JBVEVfMTZLSFo7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMTsKLQotCQljb25maWcgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCi0JCQkJCUFGRV9TTElNQlVTX1NMQVZFX1BPUlRfQ09ORklHKTsKLQkJaWYgKGNvbmZpZykgewotCQkJcmMgPSBhZmVfc2V0X2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9QT1JUX0NPTkZJRywKLQkJCQkJICAgIGNvbmZpZywgU0xJTUJVU181X1RYKTsKLQkJCWlmIChyYykKLQkJCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IHNsaW1idXMgc2xhdmUgcG9ydCBjb25maWcgJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBzbGltX3J4X2NmZ1tTTElNX1JYXzddLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlzbGltX3J4X2NmZ1tTTElNX1JYXzddLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfN19UWDoKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gc2xpbV90eF9jZmdbU0xJTV9UWF83XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJc2xpbV90eF9jZmdbU0xJTV9UWF83XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzhfVFg6Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHNsaW1fdHhfY2ZnW1NMSU1fVFhfOF0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCXNsaW1fdHhfY2ZnW1NMSU1fVFhfOF0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVVNCX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkJdXNiX3J4X2NmZy5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdXNiX3J4X2NmZy5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSB1c2JfcnhfY2ZnLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1VTQl9UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCXVzYl90eF9jZmcuYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHVzYl90eF9jZmcuc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gdXNiX3R4X2NmZy5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9ESVNQTEFZX1BPUlRfUlg6Ci0JCWlkeCA9IG1zbV9leHRfZGlzcF9nZXRfaWR4X2Zyb21fYmVpZChkYWlfbGluay0+aWQpOwotCQlpZiAoaWR4IDwgMCkgewotCQkJcHJfZXJyKCIlczogSW5jb3JyZWN0IGV4dCBkaXNwIGlkeCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaWR4KTsKLQkJCXJjID0gaWR4OwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJCWV4dF9kaXNwX3J4X2NmZ1tpZHhdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBleHRfZGlzcF9yeF9jZmdbaWR4XS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSBleHRfZGlzcF9yeF9jZmdbaWR4XS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9BRkVfUENNX1JYOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IHByb3h5X3J4X2NmZy5jaGFubmVsczsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gU0FNUExJTkdfUkFURV80OEtIWjsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1BSSV1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9QUkldW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfVERNX1RYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV90eF9jZmdbVERNX1BSSV1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9QUkldW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNfVERNX1RYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV90eF9jZmdbVERNX1NFQ11bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9TRUNdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX1RETV9SWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgdGRtX3J4X2NmZ1tURE1fVEVSVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9URVJUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfVEVSVF9URE1fVFhfMDoKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV90eF9jZmdbVERNX1RFUlRdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gdGRtX3R4X2NmZ1tURE1fVEVSVF1bVERNXzBdLnNhbXBsZV9yYXRlOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfVERNX1JYXzA6Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uY2hhbm5lbHM7Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCSAgICAgICB0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wOgotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQkJdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmNoYW5uZWxzOwotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQkgICAgICAgdGRtX3R4X2NmZ1tURE1fUVVBVF1bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fdHhfY2ZnW1RETV9RVUFUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQlhdXhfcGNtX3J4X2NmZ1tQUklNX0FVWF9QQ01dLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbUFJJTV9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbUFJJTV9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9BVVhQQ01fVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCWF1eF9wY21fdHhfY2ZnW1BSSU1fQVVYX1BDTV0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tQUklNX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3R4X2NmZ1tQUklNX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fUlg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCWF1eF9wY21fcnhfY2ZnW1NFQ19BVVhfUENNXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fcnhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1NFQ19BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbU0VDX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQlhdXhfcGNtX3J4X2NmZ1tURVJUX0FVWF9QQ01dLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV9yeF9jZmdbVEVSVF9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJYXV4X3BjbV90eF9jZmdbVEVSVF9BVVhfUENNXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCWF1eF9wY21fdHhfY2ZnW1RFUlRfQVVYX1BDTV0uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVF9BVVhQQ01fUlg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCWF1eF9wY21fcnhfY2ZnW1FVQVRfQVVYX1BDTV0uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQlhdXhfcGNtX3J4X2NmZ1tRVUFUX0FVWF9QQ01dLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQlhdXhfcGNtX3R4X2NmZ1tRVUFUX0FVWF9QQ01dLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJYXV4X3BjbV90eF9jZmdbUVVBVF9BVVhfUENNXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc19yeF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUFJJTV9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUFJJTV9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc19yeF9jZmdbU0VDX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfcnhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbU0VDX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3R4X2NmZ1tTRUNfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfdHhfY2ZnW1NFQ19NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tURVJUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tURVJUX01JMlNdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6Ci0JCXBhcmFtX3NldF9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKLQkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uYml0X2Zvcm1hdCk7Ci0JCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IG1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uc2FtcGxlX3JhdGU7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCW1pMnNfdHhfY2ZnW1RFUlRfTUkyU10uY2hhbm5lbHM7Ci0JCWJyZWFrOwotCi0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgotCQlwYXJhbV9zZXRfbWFzayhwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCi0JCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBtaTJzX3J4X2NmZ1tRVUFUX01JMlNdLnNhbXBsZV9yYXRlOwotCQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9Ci0JCQltaTJzX3J4X2NmZ1tRVUFUX01JMlNdLmNoYW5uZWxzOwotCQlicmVhazsKLQotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1FVQVRFUk5BUllfTUkyU19UWDoKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gbWkyc190eF9jZmdbUVVBVF9NSTJTXS5zYW1wbGVfcmF0ZTsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJbWkyc190eF9jZmdbUVVBVF9NSTJTXS5jaGFubmVsczsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSBTQU1QTElOR19SQVRFXzQ4S0haOwotCQlicmVhazsKLQl9Ci0KLWRvbmU6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgYm9vbCBtc21fdXNiY19zd2FwX2duZF9taWMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBib29sIGFjdGl2ZSkKLXsKLQlpbnQgdmFsdWUgPSAwOwotCWJvb2wgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBwaW5jdHJsX3N0YXRlICplbjJfcGluY3RybF9hY3RpdmU7Ci0Jc3RydWN0IHBpbmN0cmxfc3RhdGUgKmVuMl9waW5jdHJsX3NsZWVwOwotCi0JaWYgKCFwZGF0YS0+dXNiY19lbjJfZ3Bpb19wKSB7Ci0JCWlmIChhY3RpdmUpIHsKLQkJCS8qIGlmIGFjdGl2ZSBhbmQgdXNiY19lbjJfZ3BpbyB1bmRlZmluZWQsIGdldCBwaW4gKi8KLQkJCXBkYXRhLT51c2JjX2VuMl9ncGlvX3AgPSBkZXZtX3BpbmN0cmxfZ2V0KGNhcmQtPmRldik7Ci0JCQlpZiAoSVNfRVJSX09SX05VTEwocGRhdGEtPnVzYmNfZW4yX2dwaW9fcCkpIHsKLQkJCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkJIiVzOiBDYW4ndCBnZXQgRU4yIGdwaW8gcGluY3RybDolbGRcbiIsCi0JCQkJCV9fZnVuY19fLAotCQkJCQlQVFJfRVJSKHBkYXRhLT51c2JjX2VuMl9ncGlvX3ApKTsKLQkJCQlwZGF0YS0+dXNiY19lbjJfZ3Bpb19wID0gTlVMTDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJLyogaWYgbm90IGFjdGl2ZSBhbmQgdXNiY19lbjJfZ3BpbyB1bmRlZmluZWQsIHJldHVybiAqLwotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXBkYXRhLT51c2JjX2VuMl9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8oY2FyZC0+ZGV2LT5vZl9ub2RlLAotCQkJCSAgICAicWNvbSx1c2JjLWFuYWxvZy1lbjItZ3BpbyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNiY19lbjJfZ3BpbykpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICIlcywgcHJvcGVydHkgJXMgbm90IGluIG5vZGUgJXMiLAotCQkJX19mdW5jX18sICJxY29tLHVzYmMtYW5hbG9nLWVuMi1ncGlvIiwKLQkJCWNhcmQtPmRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWVuMl9waW5jdHJsX2FjdGl2ZSA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKAotCQkJCQlwZGF0YS0+dXNiY19lbjJfZ3Bpb19wLCAiYXVkX2FjdGl2ZSIpOwotCWlmIChJU19FUlJfT1JfTlVMTChlbjJfcGluY3RybF9hY3RpdmUpKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJIiVzOiBDYW5ub3QgZ2V0IGF1ZF9hY3RpdmUgcGluY3RybCBzdGF0ZTolbGRcbiIsCi0JCQlfX2Z1bmNfXywgUFRSX0VSUihlbjJfcGluY3RybF9hY3RpdmUpKTsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gZXJyX2xvb2t1cF9zdGF0ZTsKLQl9Ci0KLQllbjJfcGluY3RybF9zbGVlcCA9IHBpbmN0cmxfbG9va3VwX3N0YXRlKAotCQkJCQlwZGF0YS0+dXNiY19lbjJfZ3Bpb19wLCAiYXVkX3NsZWVwIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGVuMl9waW5jdHJsX3NsZWVwKSkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCSIlczogQ2Fubm90IGdldCBhdWRfc2xlZXAgcGluY3RybCBzdGF0ZTolbGRcbiIsCi0JCQlfX2Z1bmNfXywgUFRSX0VSUihlbjJfcGluY3RybF9zbGVlcCkpOwotCQlyZXQgPSBmYWxzZTsKLQkJZ290byBlcnJfbG9va3VwX3N0YXRlOwotCX0KLQotCS8qIGlmIGFjdGl2ZSBhbmQgdXNiY19lbjJfZ3Bpb19wIGRlZmluZWQsIHN3YXAgdXNpbmcgdXNiY19lbjJfZ3Bpb19wICovCi0JaWYgKGFjdGl2ZSkgewotCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKLQkJaWYgKHBkYXRhLT51c2JjX2VuMl9ncGlvX3ApIHsKLQkJCXZhbHVlID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnVzYmNfZW4yX2dwaW8pOwotCQkJaWYgKHZhbHVlKQotCQkJCXBpbmN0cmxfc2VsZWN0X3N0YXRlKHBkYXRhLT51c2JjX2VuMl9ncGlvX3AsCi0JCQkJCQkJZW4yX3BpbmN0cmxfc2xlZXApOwotCQkJZWxzZQotCQkJCXBpbmN0cmxfc2VsZWN0X3N0YXRlKHBkYXRhLT51c2JjX2VuMl9ncGlvX3AsCi0JCQkJCQkJZW4yX3BpbmN0cmxfYWN0aXZlKTsKLQkJfSBlbHNlIGlmIChwZGF0YS0+dXNiY19lbjJfZ3BpbyA+PSAwKSB7Ci0JCQl2YWx1ZSA9IGdwaW9fZ2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c2JjX2VuMl9ncGlvKTsKLQkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHBkYXRhLT51c2JjX2VuMl9ncGlvLCAhdmFsdWUpOwotCQl9Ci0JCXByX2RlYnVnKCIlczogc3dhcCBzZWxlY3Qgc3dpdGNoICVkIHRvICVkXG4iLCBfX2Z1bmNfXywKLQkJCXZhbHVlLCAhdmFsdWUpOwotCQlyZXQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCS8qIGlmIG5vdCBhY3RpdmUsIHJlbGVhc2UgdXNiY19lbjJfZ3Bpb19wIHBpbiAqLwotCQlwaW5jdHJsX3NlbGVjdF9zdGF0ZShwZGF0YS0+dXNiY19lbjJfZ3Bpb19wLAotCQkJCQllbjJfcGluY3RybF9zbGVlcCk7Ci0JfQotCi1lcnJfbG9va3VwX3N0YXRlOgotCWRldm1fcGluY3RybF9wdXQocGRhdGEtPnVzYmNfZW4yX2dwaW9fcCk7Ci0JcGRhdGEtPnVzYmNfZW4yX2dwaW9fcCA9IE5VTEw7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGJvb2wgbXNtX3N3YXBfZ25kX21pYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGJvb2wgYWN0aXZlKQotewotCWludCB2YWx1ZSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGNvZGVjLT5jb21wb25lbnQuY2FyZDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQotCWlmICghcGRhdGEpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmICghd2NkX21iaGNfY2ZnLmVuYWJsZV91c2JjX2FuYWxvZykgewotCQkvKiBpZiB1c2JjIGlzIG5vdCBkZWZpbmVkLCBzd2FwIHVzaW5nIHVzX2V1cm9fZ3Bpb19wICovCi0JCWlmIChwZGF0YS0+dXNfZXVyb19ncGlvX3ApIHsKLQkJCXZhbHVlID0gbXNtX2NkY19waW5jdHJsX2dldF9zdGF0ZSgKLQkJCQkJCXBkYXRhLT51c19ldXJvX2dwaW9fcCk7Ci0JCQlpZiAodmFsdWUpCi0JCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9zbGVlcF9zdGF0ZSgKLQkJCQkJCXBkYXRhLT51c19ldXJvX2dwaW9fcCk7Ci0JCQllbHNlCi0JCQkJbXNtX2NkY19waW5jdHJsX3NlbGVjdF9hY3RpdmVfc3RhdGUoCi0JCQkJCQlwZGF0YS0+dXNfZXVyb19ncGlvX3ApOwotCQl9IGVsc2UgaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgewotCQkJdmFsdWUgPSBncGlvX2dldF92YWx1ZV9jYW5zbGVlcCgKLQkJCQkJCXBkYXRhLT51c19ldXJvX2dwaW8pOwotCQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAoCi0JCQkJCXBkYXRhLT51c19ldXJvX2dwaW8sICF2YWx1ZSk7Ci0JCX0KLQkJcHJfZGVidWcoIiVzOiBzd2FwIHNlbGVjdCBzd2l0Y2ggJWQgdG8gJWRcbiIsIF9fZnVuY19fLAotCQkJIHZhbHVlLCAhdmFsdWUpOwotCQlyZXQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCS8qIGlmIHVzYmMgaXMgZGVmaW5lZCwgc3dhcCB1c2luZyB1c2JjX2VuMiAqLwotCQlyZXQgPSBtc21fdXNiY19zd2FwX2duZF9taWMoY29kZWMsIGFjdGl2ZSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2FmZV9zZXRfY29uZmlnKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgcmV0ID0gMDsKLQl2b2lkICpjb25maWdfZGF0YSA9IE5VTEw7Ci0KLQlpZiAoIW1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbikgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICIlczogY29kZWMgZ2V0IGFmZSBjb25maWcgbm90IGluaXQnZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0NEQ19SRUdJU1RFUlNfQ09ORklHLCBjb25maWdfZGF0YSwgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byBzZXQgY29kZWMgcmVnaXN0ZXJzIGNvbmZpZyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQljb25maWdfZGF0YSA9IG1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbihjb2RlYywKLQkJCUFGRV9DRENfUkVHSVNURVJfUEFHRV9DT05GSUcpOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfQ0RDX1JFR0lTVEVSX1BBR0VfQ09ORklHLCBjb25maWdfZGF0YSwKLQkJCQkgICAgMCk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIiVzOiBGYWlsZWQgdG8gc2V0IGNkYyByZWdpc3RlciBwYWdlIGNvbmZpZ1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JfQotCi0JY29uZmlnX2RhdGEgPSBtc21fY29kZWNfZm4uZ2V0X2FmZV9jb25maWdfZm4oY29kZWMsCi0JCQlBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOwotCWlmIChjb25maWdfZGF0YSkgewotCQlyZXQgPSBhZmVfc2V0X2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcsIGNvbmZpZ19kYXRhLCAwKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSIlczogRmFpbGVkIHRvIHNldCBzbGltYnVzIHNsYXZlIGNvbmZpZyAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2FmZV9jbGVhcl9jb25maWcodm9pZCkKLXsKLQlhZmVfY2xlYXJfY29uZmlnKEFGRV9DRENfUkVHSVNURVJTX0NPTkZJRyk7Ci0JYWZlX2NsZWFyX2NvbmZpZyhBRkVfU0xJTUJVU19TTEFWRV9DT05GSUcpOwotfQotCi1zdGF0aWMgaW50IG1zbV9hZHNwX3Bvd2VyX3VwX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCBhZHNwX3JlYWR5ID0gMDsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsKLQkJbXNlY3NfdG9famlmZmllcyhBRFNQX1NUQVRFX1JFQURZX1RJTUVPVVRfTVMpOwotCi0JZG8gewotCQlpZiAocTZjb3JlX2lzX2Fkc3BfcmVhZHkoKSkgewotCQkJcHJfZGVidWcoIiVzOiBBRFNQIEF1ZGlvIGlzIHJlYWR5XG4iLCBfX2Z1bmNfXyk7Ci0JCQlhZHNwX3JlYWR5ID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qCi0JCSAqIEFEU1Agd2lsbCBiZSBjb21pbmcgdXAgYWZ0ZXIgc3Vic3lzdGVtIHJlc3RhcnQgYW5kCi0JCSAqIGl0IG1pZ2h0IG5vdCBiZSBmdWxseSB1cCB3aGVuIHRoZSBjb250cm9sIHJlYWNoZXMKLQkJICogaGVyZS4gU28sIHdhaXQgZm9yIDUwbXNlYyBiZWZvcmUgY2hlY2tpbmcgQURTUCBzdGF0ZQotCQkgKi8KLQkJbXNsZWVwKDUwKTsKLQl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKLQotCWlmICghYWRzcF9yZWFkeSkgewotCQlwcl9lcnIoIiVzOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgQURTUCBBdWRpb1xuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBtc21fYWZlX3NldF9jb25maWcoY29kZWMpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGNvbmZpZy4gZXJyICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtODQ1X25vdGlmaWVyX3NlcnZpY2VfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJCQkgdW5zaWduZWQgbG9uZyBvcGNvZGUsIHZvaWQgKnB0cikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCWNvbnN0IGNoYXIgKmJlX2RsX25hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfUlg7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlcnZpY2Ugb3Bjb2RlIDB4JWx4XG4iLCBfX2Z1bmNfXywgb3Bjb2RlKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBVURJT19OT1RJRklFUl9TRVJWSUNFX0RPV046Ci0JCS8qCi0JCSAqIFVzZSBmbGFnIHRvIGlnbm9yZSBpbml0aWFsIGJvb3Qgbm90aWZpY2F0aW9ucwotCQkgKiBPbiBpbml0aWFsIGJvb3QgbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGlzCi0JCSAqIGNhbGxlZCBvbiBpbml0LiBUaGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyCi0JCSAqIGFuZCBzZXQgdGhlIGNvbmZpZyBhZ2FpbiBvbiBpbml0aWFsIGJvb3QuCi0JCSAqLwotCQlpZiAoaXNfaW5pdGlhbF9ib290KQotCQkJYnJlYWs7Ci0JCW1zbV9hZmVfY2xlYXJfY29uZmlnKCk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESU9fTk9USUZJRVJfU0VSVklDRV9VUDoKLQkJaWYgKGlzX2luaXRpYWxfYm9vdCkgewotCQkJaXNfaW5pdGlhbF9ib290ID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIXNwZGV2KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHNwZGV2KTsKLQkJcnRkID0gc25kX3NvY19nZXRfcGNtX3J1bnRpbWUoY2FyZCwgYmVfZGxfbmFtZSk7Ci0JCWlmICghcnRkKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lIGZvciAlcyBmYWlsZWQhXG4iLAotCQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQljb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQkJcmV0ID0gbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnKGNvZGVjKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJCSIlczogbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnIGZhaWxlZCByZXQgPSAlZCFcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci1lcnI6Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXJ2aWNlX25iID0gewotCS5ub3RpZmllcl9jYWxsICA9IHNkbTg0NV9ub3RpZmllcl9zZXJ2aWNlX2NiLAotCS5wcmlvcml0eSA9IC1JTlRfTUFYLAotfTsKLQotc3RhdGljIGludCBtc21fYXVkcnhfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWludCByZXQgPSAwOwotCXZvaWQgKmNvbmZpZ19kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICphdXhfY29tcDsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9Ci0JCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7Ci0KLQkvKiBDb2RlYyBTTElNQlVTIGNvbmZpZ3VyYXRpb24KLQkgKiBSWDEsIFJYMiwgUlgzLCBSWDQsIFJYNSwgUlg2LCBSWDcsIFJYOAotCSAqIFRYMSwgVFgyLCBUWDMsIFRYNCwgVFg1LCBUWDYsIFRYNywgVFg4LCBUWDksIFRYMTAsIFRYMTEsIFRYMTIsIFRYMTMKLQkgKiBUWDE0LCBUWDE1LCBUWDE2Ci0JICovCi0JdW5zaWduZWQgaW50IHJ4X2NoW1dDRDkzNFhfUlhfTUFYXSA9IHsxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LAotCQkJCQkgICAgICAxNTAsIDE1MX07Ci0JdW5zaWduZWQgaW50IHR4X2NoW1dDRDkzNFhfVFhfTUFYXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAotCQkJCQkgICAgICAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LAotCQkJCQkgICAgICAxNDAsIDE0MSwgMTQyLCAxNDN9OwotCi0JcHJfaW5mbygiJXM6IGRldl9uYW1lJXNcbiIsIF9fZnVuY19fLCBkZXZfbmFtZShjcHVfZGFpLT5kZXYpKTsKLQotCXJ0ZC0+cG1kb3duX3RpbWUgPSAwOwotCi0JcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIG1zbV9zbmRfY29udHJvbHMsCi0JCQkJCSBBUlJBWV9TSVpFKG1zbV9zbmRfY29udHJvbHMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIiVzOiBhZGRfY29kZWNfY29udHJvbHMgZmFpbGVkLCBlcnIgJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1zbV9kYXBtX3dpZGdldHMsCi0JCQkJQVJSQVlfU0laRShtc21fZGFwbV93aWRnZXRzKSk7Ci0KLQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCB3Y2RfYXVkaW9fcGF0aHMsCi0JCQkJQVJSQVlfU0laRSh3Y2RfYXVkaW9fcGF0aHMpKTsKLQotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSGFuZHNldCBNaWMiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkhlYWRzZXQgTWljIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJBTkNSaWdodCBIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DTGVmdCBIZWFkc2V0IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMwIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzEiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRGlnaXRhbCBNaWMzIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJEaWdpdGFsIE1pYzQiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkRpZ2l0YWwgTWljNSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQW5hbG9nIE1pYzUiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRElOUFVUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURfQ1BFX0lOUFVUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJNQURfQ1BFX09VVDEiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIk1BRF9DUEVfT1VUMiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiRUFSIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJMSU5FT1VUMSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiTElORU9VVDIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBFQVIiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNQSzEgT1VUIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTUEsyIE9VVCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBITCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiSFBIUiIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQUlGNCBWSSIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiVklJTlBVVCIpOwotCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZChkYXBtLCAiQU5DIEhQSEwiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIkFOQyBIUEhSIik7Ci0KLQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKLQotCXNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjb2RlY19kYWksIEFSUkFZX1NJWkUodHhfY2gpLAotCQkJCSAgICB0eF9jaCwgQVJSQVlfU0laRShyeF9jaCksIHJ4X2NoKTsKLQotCW1zbV9jb2RlY19mbi5nZXRfYWZlX2NvbmZpZ19mbiA9IHRhdmlsX2dldF9hZmVfY29uZmlnOwotCi0JcmV0ID0gbXNtX2Fkc3BfcG93ZXJfdXBfY29uZmlnKGNvZGVjKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgQUZFIGNvbmZpZyAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWNvbmZpZ19kYXRhID0gbXNtX2NvZGVjX2ZuLmdldF9hZmVfY29uZmlnX2ZuKGNvZGVjLAotCQkJCQkJICAgICBBRkVfQUFOQ19WRVJTSU9OKTsKLQlpZiAoY29uZmlnX2RhdGEpIHsKLQkJcmV0ID0gYWZlX3NldF9jb25maWcoQUZFX0FBTkNfVkVSU0lPTiwgY29uZmlnX2RhdGEsIDApOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0IGFhbmMgdmVyc2lvbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZW5kIHNwZWFrZXIgY29uZmlndXJhdGlvbiBvbmx5IGZvciBXU0E4ODEwLgotCSAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBmb3IgV1NBODgxNS4KLQkgKi8KLQlwcl9kZWJ1ZygiJXM6IE51bWJlciBvZiBhdXggZGV2aWNlczogJWRcbiIsCi0JCV9fZnVuY19fLCBydGQtPmNhcmQtPm51bV9hdXhfZGV2cyk7Ci0JaWYgKHJ0ZC0+Y2FyZC0+bnVtX2F1eF9kZXZzICYmCi0JICAgICFsaXN0X2VtcHR5KCZydGQtPmNhcmQtPmF1eF9jb21wX2xpc3QpKSB7Ci0JCWF1eF9jb21wID0gbGlzdF9maXJzdF9lbnRyeSgmcnRkLT5jYXJkLT5hdXhfY29tcF9saXN0LAotCQkJCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCwgbGlzdF9hdXgpOwotCQlpZiAoIXN0cmNtcChhdXhfY29tcC0+bmFtZSwgV1NBODgxMF9OQU1FXzEpIHx8Ci0JCSAgICAhc3RyY21wKGF1eF9jb21wLT5uYW1lLCBXU0E4ODEwX05BTUVfMikpIHsKLQkJCXRhdmlsX3NldF9zcGtyX21vZGUocnRkLT5jb2RlYywgV0NEOTM0WF9TUEtSX01PREVfMSk7Ci0JCQl0YXZpbF9zZXRfc3Brcl9nYWluX29mZnNldChydGQtPmNvZGVjLAotCQkJCQlXQ0Q5MzRYX1JYX0dBSU5fT0ZGU0VUX00xUDVfREIpOwotCQl9Ci0JfQotCWNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX3N1YmRpcihjYXJkLT5tb2R1bGUsICJjb2RlY3MiLAotCQkJCSAgICAgICBjYXJkLT5wcm9jX3Jvb3QpOwotCWlmICghZW50cnkpIHsKLQkJcHJfZGVidWcoIiVzOiBDYW5ub3QgY3JlYXRlIGNvZGVjcyBtb2R1bGUgZW50cnlcbiIsCi0JCQkgX19mdW5jX18pOwotCQlwZGF0YS0+Y29kZWNfcm9vdCA9IE5VTEw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JcGRhdGEtPmNvZGVjX3Jvb3QgPSBlbnRyeTsKLQl0YXZpbF9jb2RlY19pbmZvX2NyZWF0ZV9jb2RlY19lbnRyeShwZGF0YS0+Y29kZWNfcm9vdCwgY29kZWMpOwotCi1kb25lOgotCWNvZGVjX3JlZ19kb25lID0gdHJ1ZTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3djbl9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0JdW5zaWduZWQgaW50IHJ4X2NoW1dDTl9DRENfU0xJTV9SWF9DSF9NQVhdID0gezE1NywgMTU4fTsKLQl1bnNpZ25lZCBpbnQgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF0gID0gezE1OSwgMTYwLCAxNjF9OwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0KLQlyZXR1cm4gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwgQVJSQVlfU0laRSh0eF9jaCksCi0JCQkJCSAgIHR4X2NoLCBBUlJBWV9TSVpFKHJ4X2NoKSwgcnhfY2gpOwotfQotCi1zdGF0aWMgdm9pZCAqZGVmX3RhdmlsX21iaGNfY2FsKHZvaWQpCi17Ci0Jdm9pZCAqdGF2aWxfd2NkX2NhbDsKLQlzdHJ1Y3Qgd2NkX21iaGNfYnRuX2RldGVjdF9jZmcgKmJ0bl9jZmc7Ci0JdTE2ICpidG5faGlnaDsKLQotCXRhdmlsX3djZF9jYWwgPSBremFsbG9jKFdDRF9NQkhDX0NBTF9TSVpFKFdDRF9NQkhDX0RFRl9CVVRUT05TLAotCQkJCVdDRDlYWFhfTUJIQ19ERUZfUkxPQURTKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0YXZpbF93Y2RfY2FsKQotCQlyZXR1cm4gTlVMTDsKLQotI2RlZmluZSBTKFgsIFkpICgoV0NEX01CSENfQ0FMX1BMVUdfVFlQRV9QVFIodGF2aWxfd2NkX2NhbCktPlgpID0gKFkpKQotCVModl9oc19tYXgsIDE2MDApOwotI3VuZGVmIFMKLSNkZWZpbmUgUyhYLCBZKSAoKFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXZpbF93Y2RfY2FsKS0+WCkgPSAoWSkpCi0JUyhudW1fYnRuLCBXQ0RfTUJIQ19ERUZfQlVUVE9OUyk7Ci0jdW5kZWYgUwotCi0JYnRuX2NmZyA9IFdDRF9NQkhDX0NBTF9CVE5fREVUX1BUUih0YXZpbF93Y2RfY2FsKTsKLQlidG5faGlnaCA9ICgodm9pZCAqKSZidG5fY2ZnLT5fdl9idG5fbG93KSArCi0JCShzaXplb2YoYnRuX2NmZy0+X3ZfYnRuX2xvd1swXSkgKiBidG5fY2ZnLT5udW1fYnRuKTsKLQotCWJ0bl9oaWdoWzBdID0gNzU7Ci0JYnRuX2hpZ2hbMV0gPSAxNTA7Ci0JYnRuX2hpZ2hbMl0gPSAyMzc7Ci0JYnRuX2hpZ2hbM10gPSA1MDA7Ci0JYnRuX2hpZ2hbNF0gPSA1MDA7Ci0JYnRuX2hpZ2hbNV0gPSA1MDA7Ci0JYnRuX2hpZ2hbNl0gPSA1MDA7Ci0JYnRuX2hpZ2hbN10gPSA1MDA7Ci0KLQlyZXR1cm4gdGF2aWxfd2NkX2NhbDsKLX0KLQotc3RhdGljIGludCBtc21fc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJ0ZC0+ZGFpX2xpbms7Ci0KLQlpbnQgcmV0ID0gMDsKLQl1MzIgcnhfY2hbU0xJTV9NQVhfUlhfUE9SVFNdLCB0eF9jaFtTTElNX01BWF9UWF9QT1JUU107Ci0JdTMyIHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7Ci0JdTMyIHVzZXJfc2V0X3R4X2NoID0gMDsKLQl1MzIgcnhfY2hfY291bnQ7Ci0KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCQkmdHhfY2hfY250LCB0eF9jaCwgJnJ4X2NoX2NudCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBjb2RlYyBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU181X1JYKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzVfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgc2xpbV9yeF9jZmdbNV0uY2hhbm5lbHMpOwotCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1s1XS5jaGFubmVsczsKLQkJfSBlbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMl9SWCkgewotCQkJcHJfZGVidWcoIiVzOiByeF8yX2NoPSVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgc2xpbV9yeF9jZmdbMl0uY2hhbm5lbHMpOwotCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1syXS5jaGFubmVsczsKLQkJfSBlbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNl9SWCkgewotCQkJcHJfZGVidWcoIiVzOiByeF82X2NoPSVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHNsaW1fcnhfY2ZnWzZdLmNoYW5uZWxzKTsKLQkJCXJ4X2NoX2NvdW50ID0gc2xpbV9yeF9jZmdbNl0uY2hhbm5lbHM7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IHJ4XzBfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgc2xpbV9yeF9jZmdbMF0uY2hhbm5lbHMpOwotCQkJcnhfY2hfY291bnQgPSBzbGltX3J4X2NmZ1swXS5jaGFubmVsczsKLQkJfQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgMCwgMCwKLQkJCQkJCSAgcnhfY2hfY291bnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0gZWxzZSB7Ci0KLQkJcHJfZGVidWcoIiVzOiAlc190eF9kYWlfaWRfJWRfY2g9JWRcbiIsIF9fZnVuY19fLAotCQkJIGNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCwgdXNlcl9zZXRfdHhfY2gpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCQkgJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXBcbiwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJLyogRm9yIDxjb2RlYz5fdHgxIGNhc2UgKi8KLQkJaWYgKGRhaV9saW5rLT5pZCA9PSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYKQotCQkJdXNlcl9zZXRfdHhfY2ggPSBzbGltX3R4X2NmZ1swXS5jaGFubmVsczsKLQkJLyogRm9yIDxjb2RlYz5fdHgzIGNhc2UgKi8KLQkJZWxzZSBpZiAoZGFpX2xpbmstPmlkID09IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfVFgpCi0JCQl1c2VyX3NldF90eF9jaCA9IHNsaW1fdHhfY2ZnWzFdLmNoYW5uZWxzOwotCQllbHNlIGlmIChkYWlfbGluay0+aWQgPT0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNF9UWCkKLQkJCXVzZXJfc2V0X3R4X2NoID0gbXNtX3ZpX2ZlZWRfdHhfY2g7Ci0JCWVsc2UKLQkJCXVzZXJfc2V0X3R4X2NoID0gdHhfY2hfY250OwotCi0JCXByX2RlYnVnKCIlczogbXNtX3NsaW1fMF90eF9jaCglZCkgdXNlcl9zZXRfdHhfY2goJWQpIHR4X2NoX2NudCglZCksIEJFIGlkICglZClcbiIsCi0JCQkgX19mdW5jX18sICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywgdXNlcl9zZXRfdHhfY2gsCi0JCQkgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOwotCi0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAotCQkJCQkJICB1c2VyX3NldF90eF9jaCwgdHhfY2gsIDAsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JfQotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fc2xpbWJ1c18yX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0JdW5zaWduZWQgaW50IHJ4X2NoW1NMSU1fTUFYX1JYX1BPUlRTXSwgdHhfY2hbU0xJTV9NQVhfVFhfUE9SVFNdOwotCXVuc2lnbmVkIGludCByeF9jaF9jbnQgPSAwLCB0eF9jaF9jbnQgPSAwOwotCXVuc2lnbmVkIGludCBudW1fdHhfY2ggPSAwOwotCXVuc2lnbmVkIGludCBudW1fcnhfY2ggPSAwOwotCWludCByZXQgPSAwOwotCi0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJbnVtX3J4X2NoID0gIHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCQlwcl9kZWJ1ZygiJXM6ICVzIHJ4X2RhaV9pZCA9ICVkICBudW1fY2ggPSAlZFxuIiwgX19mdW5jX18sCi0JCQljb2RlY19kYWktPm5hbWUsIGNvZGVjX2RhaS0+aWQsIG51bV9yeF9jaCk7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX2dldF9jaGFubmVsX21hcChjb2RlY19kYWksCi0JCQkJJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgY29kZWMgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCW51bV9yeF9jaCwgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjcHUgY2hhbiBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlIHsKLQkJbnVtX3R4X2NoID0gIHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCQlwcl9kZWJ1ZygiJXM6ICVzICB0eF9kYWlfaWQgPSAlZCAgbnVtX2NoID0gJWRcbiIsIF9fZnVuY19fLAotCQkJY29kZWNfZGFpLT5uYW1lLCBjb2RlY19kYWktPmlkLCBudW1fdHhfY2gpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9nZXRfY2hhbm5lbF9tYXAoY29kZWNfZGFpLAotCQkJCSZ0eF9jaF9jbnQsIHR4X2NoLCAmcnhfY2hfY250LCByeF9jaCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IGNvZGVjIGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKLQkJCQludW1fdHhfY2gsIHR4X2NoLCAwLCAwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX3djbl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBydGQtPmRhaV9saW5rOwotCXUzMiByeF9jaFtXQ05fQ0RDX1NMSU1fUlhfQ0hfTUFYXSwgdHhfY2hbV0NOX0NEQ19TTElNX1RYX0NIX01BWF07Ci0JdTMyIHJ4X2NoX2NudCA9IDAsIHR4X2NoX2NudCA9IDA7Ci0JaW50IHJldDsKLQotCWRldl9kYmcocnRkLT5kZXYsICIlczogJXNfdHhfZGFpX2lkXyVkXG4iLCBfX2Z1bmNfXywKLQkJIGNvZGVjX2RhaS0+bmFtZSwgY29kZWNfZGFpLT5pZCk7Ci0JcmV0ID0gc25kX3NvY19kYWlfZ2V0X2NoYW5uZWxfbWFwKGNvZGVjX2RhaSwKLQkJCQkgJnR4X2NoX2NudCwgdHhfY2gsICZyeF9jaF9jbnQsIHJ4X2NoKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byBnZXQgQlRGTSBjb2RlYyBjaGFuIG1hcFxuLCBlcnI6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JZGV2X2RiZyhydGQtPmRldiwgIiVzOiB0eF9jaF9jbnQoJWQpIEJFIGlkICVkXG4iLAotCQlfX2Z1bmNfXywgdHhfY2hfY250LCBkYWlfbGluay0+aWQpOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X2NoYW5uZWxfbWFwKGNwdV9kYWksCi0JCQkJCSAgdHhfY2hfY250LCB0eF9jaCwgcnhfY2hfY250LCByeF9jaCk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihydGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gc2V0IGNwdSBjaGFuIG1hcCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9hdXhfcGNtX3NuZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0JaW50IGluZGV4ID0gY3B1X2RhaS0+aWQgLSAxOwotCi0JZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKLQkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCi0JCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7Ci0KLQlpZiAoaW5kZXggPCBQUklNX0FVWF9QQ00gfHwgaW5kZXggPiBRVUFUX0FVWF9QQ00pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCW11dGV4X2xvY2soJmF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCWlmICgrK2F1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQgPT0gMSkgewotCQlpZiAobWkyc19hdXhwY21fY29uZltpbmRleF0ucGNtX2kyc19zZWxfdnRfYWRkciAhPSBOVUxMKSB7Ci0JCQltdXRleF9sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKLQkJCWlvd3JpdGUzMigxLAotCQkJCW1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIpOwotCQkJbXV0ZXhfdW5sb2NrKCZtaTJzX2F1eHBjbV9jb25mW2luZGV4XS5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCi0JCQkJIiVzIGxwYWlmX3RlcnRfbXV4c2VsX3ZpcnRfYWRkciBpcyBOVUxMXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0KLQl9Ci0JaWYgKHJldCA8IDApCi0JCWF1eHBjbV9pbnRmX2NvbmZbaW5kZXhdLnJlZl9jbnQtLTsKLQotCW11dGV4X3VubG9jaygmYXV4cGNtX2ludGZfY29uZltpbmRleF0ubG9jayk7Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBtc21fYXV4X3BjbV9zbmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCWludCBpbmRleCA9IHJ0ZC0+Y3B1X2RhaS0+aWQgLSAxOwotCi0JZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKLQkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCi0JCV9fZnVuY19fLAotCQlzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQlydGQtPmNwdV9kYWktPm5hbWUsIHJ0ZC0+Y3B1X2RhaS0+aWQpOwotCi0JaWYgKGluZGV4IDwgUFJJTV9BVVhfUENNIHx8IGluZGV4ID4gUVVBVF9BVVhfUENNKSB7Ci0JCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCi0JCQkiJXM6IENQVSBEQUkgaWQgKCVkKSBvdXQgb2YgcmFuZ2VcbiIsCi0JCQlfX2Z1bmNfXywgcnRkLT5jcHVfZGFpLT5pZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltdXRleF9sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLQlpZiAoLS1hdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKLQkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgewotCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCQlpb3dyaXRlMzIoMCwKLQkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKLQkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlcyBscGFpZl90ZXJ0X211eHNlbF92aXJ0X2FkZHIgaXMgTlVMTFxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlhdXhwY21faW50Zl9jb25mW2luZGV4XS5yZWZfY250Kys7Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhdXhwY21faW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLX0KLQotc3RhdGljIGludCBtc21fZ2V0X3BvcnRfaWQoaW50IGJlX2lkKQotewotCWludCBhZmVfcG9ydF9pZDsKLQotCXN3aXRjaCAoYmVfaWQpIHsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWDoKLQkJYWZlX3BvcnRfaWQgPSBBRkVfUE9SVF9JRF9QUklNQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1BSSV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1BSSU1BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfU0VDT05EQVJZX01JMlNfUlg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfU0VDT05EQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1NFQ09OREFSWV9NSTJTX1RYOwotCQlicmVhazsKLQljYXNlIE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1RFUlRJQVJZX01JMlNfUlg7Ci0JCWJyZWFrOwotCWNhc2UgTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfVFg6Ci0JCWFmZV9wb3J0X2lkID0gQUZFX1BPUlRfSURfVEVSVElBUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19SWDsKLQkJYnJlYWs7Ci0JY2FzZSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1RYOgotCQlhZmVfcG9ydF9pZCA9IEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfTUkyU19UWDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJfZXJyKCIlczogSW52YWxpZCBCRSBpZDogJWRcbiIsIF9fZnVuY19fLCBiZV9pZCk7Ci0JCWFmZV9wb3J0X2lkID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gYWZlX3BvcnRfaWQ7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKHUzMiBiaXRfZm9ybWF0KQotewotCXUzMiBiaXRfcGVyX3NhbXBsZTsKLQotCXN3aXRjaCAoYml0X2Zvcm1hdCkgewotCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJYml0X3Blcl9zYW1wbGUgPSAzMjsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQlkZWZhdWx0OgotCQliaXRfcGVyX3NhbXBsZSA9IDE2OwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYml0X3Blcl9zYW1wbGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9taTJzX2Nsa192YWwoaW50IGRhaV9pZCwgaW50IHN0cmVhbSkKLXsKLQl1MzIgYml0X3Blcl9zYW1wbGU7Ci0KLQlpZiAoc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJYml0X3Blcl9zYW1wbGUgPQotCQkgICAgZ2V0X21pMnNfYml0c19wZXJfc2FtcGxlKG1pMnNfcnhfY2ZnW2RhaV9pZF0uYml0X2Zvcm1hdCk7Ci0JCW1pMnNfY2xrW2RhaV9pZF0uY2xrX2ZyZXFfaW5faHogPQotCQkgICAgbWkyc19yeF9jZmdbZGFpX2lkXS5zYW1wbGVfcmF0ZSAqIDIgKiBiaXRfcGVyX3NhbXBsZTsKLQl9IGVsc2UgewotCQliaXRfcGVyX3NhbXBsZSA9Ci0JCSAgICBnZXRfbWkyc19iaXRzX3Blcl9zYW1wbGUobWkyc190eF9jZmdbZGFpX2lkXS5iaXRfZm9ybWF0KTsKLQkJbWkyc19jbGtbZGFpX2lkXS5jbGtfZnJlcV9pbl9oeiA9Ci0JCSAgICBtaTJzX3R4X2NmZ1tkYWlfaWRdLnNhbXBsZV9yYXRlICogMiAqIGJpdF9wZXJfc2FtcGxlOwotCX0KLX0KLQotc3RhdGljIGludCBtc21fbWkyc19zZXRfc2NsayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcG9ydF9pZCA9IDA7Ci0JaW50IGluZGV4ID0gY3B1X2RhaS0+aWQ7Ci0KLQlwb3J0X2lkID0gbXNtX2dldF9wb3J0X2lkKHJ0ZC0+ZGFpX2xpbmstPmlkKTsKLQlpZiAocG9ydF9pZCA8IDApIHsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzOiBJbnZhbGlkIHBvcnRfaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gcG9ydF9pZDsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGVuYWJsZSkgewotCQl1cGRhdGVfbWkyc19jbGtfdmFsKGluZGV4LCBzdWJzdHJlYW0tPnN0cmVhbSk7Ci0JCWRldl9kYmcocnRkLT5jYXJkLT5kZXYsICIlczogY2xvY2sgcmF0ZSAldWxcbiIsIF9fZnVuY19fLAotCQkJbWkyc19jbGtbaW5kZXhdLmNsa19mcmVxX2luX2h6KTsKLQl9Ci0KLQltaTJzX2Nsa1tpbmRleF0uZW5hYmxlID0gZW5hYmxlOwotCXJldCA9IGFmZV9zZXRfbHBhc3NfY2xvY2tfdjIocG9ydF9pZCwKLQkJCQkgICAgICZtaTJzX2Nsa1tpbmRleF0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsCi0JCQkiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQgZm9yIHBvcnQgMHgleCAsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCBwb3J0X2lkLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9zZXRfcGluY3RybChzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyAqcGluY3RybF9pbmZvLAotCQkJCWVudW0gcGluY3RybF9waW5fc3RhdGUgbmV3X3N0YXRlKQotewotCWludCByZXQgPSAwOwotCWludCBjdXJyX3N0YXRlID0gMDsKLQotCWlmIChwaW5jdHJsX2luZm8gPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBwaW5jdHJsX2luZm8gaXMgTlVMTFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAocGluY3RybF9pbmZvLT5waW5jdHJsID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogcGluY3RybF9pbmZvLT5waW5jdHJsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JY3Vycl9zdGF0ZSA9IHBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZTsKLQlwaW5jdHJsX2luZm8tPmN1cnJfc3RhdGUgPSBuZXdfc3RhdGU7Ci0JcHJfZGVidWcoIiVzOiBjdXJyX3N0YXRlID0gJXMgbmV3X3N0YXRlID0gJXNcbiIsIF9fZnVuY19fLAotCQkgcGluX3N0YXRlc1tjdXJyX3N0YXRlXSwgcGluX3N0YXRlc1twaW5jdHJsX2luZm8tPmN1cnJfc3RhdGVdKTsKLQotCWlmIChjdXJyX3N0YXRlID09IHBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZSkgewotCQlwcl9kZWJ1ZygiJXM6IEFscmVhZHkgaW4gc2FtZSBzdGF0ZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAoY3Vycl9zdGF0ZSAhPSBTVEFURV9ESVNBQkxFICYmCi0JCXBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZSAhPSBTVEFURV9ESVNBQkxFKSB7Ci0JCXByX2RlYnVnKCIlczogc3RhdGUgYWxyZWFkeSBhY3RpdmUgY2Fubm90IHN3aXRjaFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzd2l0Y2ggKHBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZSkgewotCWNhc2UgU1RBVEVfTUkyU19BQ1RJVkU6Ci0JCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBpbmN0cmxfaW5mby0+cGluY3RybCwKLQkJCQkJcGluY3RybF9pbmZvLT5taTJzX2FjdGl2ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiJXM6IE1JMlMgc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfVERNX0FDVElWRToKLQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocGluY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQlwaW5jdHJsX2luZm8tPnRkbV9hY3RpdmUpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiBURE0gc3RhdGUgc2VsZWN0IGZhaWxlZCB3aXRoICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfRElTQUJMRToKLQkJaWYgKGN1cnJfc3RhdGUgPT0gU1RBVEVfTUkyU19BQ1RJVkUpIHsKLQkJCXJldCA9IHBpbmN0cmxfc2VsZWN0X3N0YXRlKHBpbmN0cmxfaW5mby0+cGluY3RybCwKLQkJCQkJcGluY3RybF9pbmZvLT5taTJzX2Rpc2FibGUpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gcGluY3RybF9zZWxlY3Rfc3RhdGUocGluY3RybF9pbmZvLT5waW5jdHJsLAotCQkJCQlwaW5jdHJsX2luZm8tPnRkbV9kaXNhYmxlKTsKLQkJfQotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoIiVzOiAgc3RhdGUgZGlzYWJsZSBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBUTE1NIHBpbiBzdGF0ZSBpcyBpbnZhbGlkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9yZWxlYXNlX3BpbmN0cmwoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc3RydWN0IG1zbV9waW5jdHJsX2luZm8gKnBpbmN0cmxfaW5mbyA9ICZwZGF0YS0+cGluY3RybF9pbmZvOwotCi0JaWYgKHBpbmN0cmxfaW5mby0+cGluY3RybCkgewotCQlkZXZtX3BpbmN0cmxfcHV0KHBpbmN0cmxfaW5mby0+cGluY3RybCk7Ci0JCXBpbmN0cmxfaW5mby0+cGluY3RybCA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9nZXRfcGluY3RybChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQlzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyAqcGluY3RybF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKLQlpbnQgcmV0OwotCi0JcGluY3RybF9pbmZvID0gJnBkYXRhLT5waW5jdHJsX2luZm87Ci0KLQlpZiAocGluY3RybF9pbmZvID09IE5VTEwpIHsKLQkJcHJfZXJyKCIlczogcGluY3RybF9pbmZvIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoJnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKHBpbmN0cmwpKSB7Ci0JCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgcGluY3RybCBoYW5kbGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXBpbmN0cmxfaW5mby0+cGluY3RybCA9IHBpbmN0cmw7Ci0KLQkvKiBnZXQgYWxsIHRoZSBzdGF0ZXMgaGFuZGxlcyBmcm9tIERldmljZSBUcmVlICovCi0JcGluY3RybF9pbmZvLT5taTJzX2Rpc2FibGUgPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShwaW5jdHJsLAotCQkJCQkJInF1YXQtbWkycy1zbGVlcCIpOwotCWlmIChJU19FUlIocGluY3RybF9pbmZvLT5taTJzX2Rpc2FibGUpKSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBnZXQgbWkyc19kaXNhYmxlIHBpbnN0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQlwaW5jdHJsX2luZm8tPm1pMnNfYWN0aXZlID0gcGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybCwKLQkJCQkJCSJxdWF0LW1pMnMtYWN0aXZlIik7Ci0JaWYgKElTX0VSUihwaW5jdHJsX2luZm8tPm1pMnNfYWN0aXZlKSkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IG1pMnNfYWN0aXZlIHBpbnN0YXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQlwaW5jdHJsX2luZm8tPnRkbV9kaXNhYmxlID0gcGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybCwKLQkJCQkJCSJxdWF0LXRkbS1zbGVlcCIpOwotCWlmIChJU19FUlIocGluY3RybF9pbmZvLT50ZG1fZGlzYWJsZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCB0ZG1fZGlzYWJsZSBwaW5zdGF0ZVxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0JcGluY3RybF9pbmZvLT50ZG1fYWN0aXZlID0gcGluY3RybF9sb29rdXBfc3RhdGUocGluY3RybCwKLQkJCQkJCSJxdWF0LXRkbS1hY3RpdmUiKTsKLQlpZiAoSVNfRVJSKHBpbmN0cmxfaW5mby0+dGRtX2FjdGl2ZSkpIHsKLQkJcHJfZXJyKCIlczogY291bGQgbm90IGdldCB0ZG1fYWN0aXZlIHBpbnN0YXRlXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9Ci0JLyogUmVzZXQgdGhlIFRMTU0gcGlucyB0byBhIGRlZmF1bHQgc3RhdGUgKi8KLQlyZXQgPSBwaW5jdHJsX3NlbGVjdF9zdGF0ZShwaW5jdHJsX2luZm8tPnBpbmN0cmwsCi0JCQkJCXBpbmN0cmxfaW5mby0+bWkyc19kaXNhYmxlKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCIlczogRGlzYWJsZSBUTE1NIHBpbnMgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnI7Ci0JfQotCXBpbmN0cmxfaW5mby0+Y3Vycl9zdGF0ZSA9IFNUQVRFX0RJU0FCTEU7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCWRldm1fcGluY3RybF9wdXQocGluY3RybCk7Ci0JcGluY3RybF9pbmZvLT5waW5jdHJsID0gTlVMTDsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBtc21fdGRtX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0KLQlpZiAoY3B1X2RhaS0+aWQgPT0gQUZFX1BPUlRfSURfUVVBVEVSTkFSWV9URE1fUlgpIHsKLQkJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPQotCQkJCXRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5iaXRfZm9ybWF0KTsKLQkJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9RVUFUXVtURE1fMF0uc2FtcGxlX3JhdGU7Ci0JfSBlbHNlIGlmIChjcHVfZGFpLT5pZCA9PSBBRkVfUE9SVF9JRF9TRUNPTkRBUllfVERNX1JYKSB7Ci0JCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0KLQkJCQl0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5jaGFubmVsczsKLQkJcGFyYW1fc2V0X21hc2socGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAotCQkJICAgICAgIHRkbV9yeF9jZmdbVERNX1NFQ11bVERNXzBdLmJpdF9mb3JtYXQpOwotCQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSB0ZG1fcnhfY2ZnW1RETV9TRUNdW1RETV8wXS5zYW1wbGVfcmF0ZTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIiVzOiBkYWkgaWQgMHgleCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJX19mdW5jX18sIGNwdV9kYWktPmlkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBkYWkgaWQgPSAweCV4IGNoYW5uZWxzID0gJWQgcmF0ZSA9ICVkIGZvcm1hdCA9IDB4JXhcbiIsCi0JCV9fZnVuY19fLCBjcHVfZGFpLT5pZCwgY2hhbm5lbHMtPm1heCwgcmF0ZS0+bWF4LAotCQlwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtODQ1X3RkbV9zbmRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2hhbm5lbHMsIHNsb3Rfd2lkdGgsIHNsb3RzOwotCXVuc2lnbmVkIGludCBzbG90X21hc2s7Ci0JdW5zaWduZWQgaW50IHNsb3Rfb2Zmc2V0WzhdID0gezAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOH07Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhaSBpZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0KLQlzbG90cyA9IHRkbV9yeF9jZmdbVERNX1FVQVRdW1RETV8wXS5jaGFubmVsczsKLQkvKjIgc2xvdCBjb25maWcgLSBiaXRzIDAgYW5kIDEgc2V0IGZvciB0aGUgZmlyc3QgdHdvIHNsb3RzICovCi0Jc2xvdF9tYXNrID0gMHgwMDAwRkZGRiA+PiAoMTYtc2xvdHMpOwotCXNsb3Rfd2lkdGggPSAzMjsKLQljaGFubmVscyA9IHNsb3RzOwotCi0JcHJfZGVidWcoIiVzOiBzbG90X3dpZHRoICVkIHNsb3RzICVkXG4iLCBfX2Z1bmNfXywgc2xvdF93aWR0aCwgc2xvdHMpOwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXByX2RlYnVnKCIlczogc2xvdF93aWR0aCAlZFxuIiwgX19mdW5jX18sIHNsb3Rfd2lkdGgpOwotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgMCwgc2xvdF9tYXNrLAotCQkJc2xvdHMsIHNsb3Rfd2lkdGgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlbmQ7Ci0JCX0KLQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwKLQkJCTAsIE5VTEwsIGNoYW5uZWxzLCBzbG90X29mZnNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IGNoYW5uZWwgbWFwLCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgdXNlIGNhc2UsIGVycjolZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotZW5kOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2RtODQ1X3RkbV9zbmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZDsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQlzdHJ1Y3QgbXNtX3BpbmN0cmxfaW5mbyAqcGluY3RybF9pbmZvID0gJnBkYXRhLT5waW5jdHJsX2luZm87Ci0KLQlyZXQgPSBtc21fc2V0X3BpbmN0cmwocGluY3RybF9pbmZvLCBTVEFURV9URE1fQUNUSVZFKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIiVzOiBNSTJTIFRMTU0gcGluY3RybCBzZXQgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNkbTg0NV90ZG1fc25kX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8gPSAmcGRhdGEtPnBpbmN0cmxfaW5mbzsKLQotCXJldCA9IG1zbV9zZXRfcGluY3RybChwaW5jdHJsX2luZm8sIFNUQVRFX0RJU0FCTEUpOwotCWlmIChyZXQpCi0JCXByX2VycigiJXM6IE1JMlMgVExNTSBwaW5jdHJsIHNldCBmYWlsZWQgd2l0aCAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgc2RtODQ1X3RkbV9iZV9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IHNkbTg0NV90ZG1fc25kX2h3X3BhcmFtcywKLQkuc3RhcnR1cCA9IHNkbTg0NV90ZG1fc25kX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gc2RtODQ1X3RkbV9zbmRfc2h1dGRvd24KLX07Ci0KLXN0YXRpYyBpbnQgbXNtX21pMnNfc25kX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlpbnQgaW5kZXggPSBjcHVfZGFpLT5pZDsKLQl1bnNpZ25lZCBpbnQgZm10ID0gU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCXN0cnVjdCBtc21fcGluY3RybF9pbmZvICpwaW5jdHJsX2luZm8gPSAmcGRhdGEtPnBpbmN0cmxfaW5mbzsKLQlpbnQgcmV0X3BpbmN0cmwgPSAwOwotCi0JZGV2X2RiZyhydGQtPmNhcmQtPmRldiwKLQkJIiVzOiBzdWJzdHJlYW0gPSAlcyAgc3RyZWFtID0gJWQsIGRhaSBuYW1lICVzLCBkYWkgSUQgJWRcbiIsCi0JCV9fZnVuY19fLCBzdWJzdHJlYW0tPm5hbWUsIHN1YnN0cmVhbS0+c3RyZWFtLAotCQljcHVfZGFpLT5uYW1lLCBjcHVfZGFpLT5pZCk7Ci0KLQlpZiAoaW5kZXggPCBQUklNX01JMlMgfHwgaW5kZXggPiBRVUFUX01JMlMpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCSIlczogQ1BVIERBSSBpZCAoJWQpIG91dCBvZiByYW5nZVxuIiwKLQkJCV9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoaW5kZXggPT0gUVVBVF9NSTJTKSB7Ci0JCXJldF9waW5jdHJsID0gbXNtX3NldF9waW5jdHJsKHBpbmN0cmxfaW5mbywgU1RBVEVfTUkyU19BQ1RJVkUpOwotCQlpZiAocmV0X3BpbmN0cmwpCi0JCQlwcl9lcnIoIiVzOiBNSTJTIFRMTU0gcGluY3RybCBzZXQgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldF9waW5jdHJsKTsKLQl9Ci0JLyoKLQkgKiBNdXh0ZXggcHJvdGVjdGlvbiBpbiBjYXNlIHRoZSBzYW1lIE1JMlMKLQkgKiBpbnRlcmZhY2UgdXNpbmcgZm9yIGJvdGggVFggYW5kIFJYICBzbwotCSAqIHRoYXQgdGhlIHNhbWUgY2xvY2sgd29uJ3QgYmUgZW5hYmxlIHR3aWNlLgotCSAqLwotCW11dGV4X2xvY2soJm1pMnNfaW50Zl9jb25mW2luZGV4XS5sb2NrKTsKLQlpZiAoKyttaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCA9PSAxKSB7Ci0JCS8qIENoZWNrIGlmIG1zbSBuZWVkcyB0byBwcm92aWRlIHRoZSBjbG9jayB0byB0aGUgaW50ZXJmYWNlICovCi0JCWlmICghbWkyc19pbnRmX2NvbmZbaW5kZXhdLm1zbV9pc19taTJzX21hc3RlcikgewotCQkJbWkyc19jbGtbaW5kZXhdLmNsa19pZCA9IG1pMnNfZWJpdF9jbGtbaW5kZXhdOwotCQkJZm10ID0gU05EX1NPQ19EQUlGTVRfQ0JNX0NGTTsKLQkJfQotCQlyZXQgPSBtc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIHRydWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihydGQtPmNhcmQtPmRldiwKLQkJCQkiJXM6IGFmZSBscGFzcyBjbG9jayBmYWlsZWQgdG8gZW5hYmxlIE1JMlMgY2xvY2ssIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gY2xlYW5fdXA7Ci0JCX0KLQkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbaW5kZXhdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0gTlVMTCkgewotCQkJbXV0ZXhfbG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCQlpb3dyaXRlMzIoMCwKLQkJCQltaTJzX2F1eHBjbV9jb25mW2luZGV4XS5wY21faTJzX3NlbF92dF9hZGRyKTsKLQkJCW11dGV4X3VubG9jaygmbWkyc19hdXhwY21fY29uZltpbmRleF0ubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LAotCQkJCSIlcyBscGFpZl9tdXhzZWxfdmlydF9hZGRyIGlzIE5VTEwgZm9yIGRhaSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gY2xrX29mZjsKLQkJfQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIGZtdCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBzZXQgZm10IGNwdSBkYWkgZmFpbGVkIGZvciBNSTJTICglZCksIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7Ci0JCQlnb3RvIGNsa19vZmY7Ci0JCX0KLQl9Ci1jbGtfb2ZmOgotCWlmIChyZXQgPCAwKQotCQltc21fbWkyc19zZXRfc2NsayhzdWJzdHJlYW0sIGZhbHNlKTsKLWNsZWFuX3VwOgotCWlmIChyZXQgPCAwKQotCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudC0tOwotCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9taTJzX3NuZF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlpbnQgaW5kZXggPSBydGQtPmNwdV9kYWktPmlkOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQ7Ci0Jc3RydWN0IG1zbV9hc29jX21hY2hfZGF0YSAqcGRhdGEgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc3RydWN0IG1zbV9waW5jdHJsX2luZm8gKnBpbmN0cmxfaW5mbyA9ICZwZGF0YS0+cGluY3RybF9pbmZvOwotCWludCByZXRfcGluY3RybCA9IDA7Ci0KLQlwcl9kZWJ1ZygiJXMoKTogc3Vic3RyZWFtID0gJXMgIHN0cmVhbSA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJIHN1YnN0cmVhbS0+bmFtZSwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCWlmIChpbmRleCA8IFBSSU1fTUkyUyB8fCBpbmRleCA+IFFVQVRfTUkyUykgewotCQlwcl9lcnIoIiVzOmludmFsaWQgTUkyUyBEQUkoJWQpXG4iLCBfX2Z1bmNfXywgaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCi0JbXV0ZXhfbG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCWlmICgtLW1pMnNfaW50Zl9jb25mW2luZGV4XS5yZWZfY250ID09IDApIHsKLQkJcmV0ID0gbXNtX21pMnNfc2V0X3NjbGsoc3Vic3RyZWFtLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOmNsb2NrIGRpc2FibGUgZmFpbGVkIGZvciBNSTJTICglZCk7IHJldD0lZFxuIiwKLQkJCQlfX2Z1bmNfXywgaW5kZXgsIHJldCk7Ci0JCQltaTJzX2ludGZfY29uZltpbmRleF0ucmVmX2NudCsrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmbWkyc19pbnRmX2NvbmZbaW5kZXhdLmxvY2spOwotCi0JaWYgKGluZGV4ID09IFFVQVRfTUkyUykgewotCQlyZXRfcGluY3RybCA9IG1zbV9zZXRfcGluY3RybChwaW5jdHJsX2luZm8sIFNUQVRFX0RJU0FCTEUpOwotCQlpZiAocmV0X3BpbmN0cmwpCi0JCQlwcl9lcnIoIiVzOiBNSTJTIFRMTU0gcGluY3RybCBzZXQgZmFpbGVkIHdpdGggJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldF9waW5jdHJsKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX21pMnNfYmVfb3BzID0gewotCS5zdGFydHVwID0gbXNtX21pMnNfc25kX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gbXNtX21pMnNfc25kX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fYXV4X3BjbV9iZV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBtc21fYXV4X3BjbV9zbmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBtc21fYXV4X3BjbV9zbmRfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRkbV9wYXJhbV9zZXRfc2xvdF9tYXNrKHUxNiBwb3J0X2lkLCBpbnQgc2xvdF93aWR0aCwKLQkJCQkJICAgIGludCBzbG90cykKLXsKLQl1bnNpZ25lZCBpbnQgc2xvdF9tYXNrID0gMDsKLQlpbnQgaSwgajsKLQl1bnNpZ25lZCBpbnQgKnNsb3Rfb2Zmc2V0OwotCi0JZm9yIChpID0gVERNXzA7IGkgPCBURE1fUE9SVF9NQVg7IGkrKykgewotCQlzbG90X29mZnNldCA9IHRkbV9zbG90X29mZnNldFtpXTsKLQotCQlmb3IgKGogPSAwOyBqIDwgVERNX1NMT1RfT0ZGU0VUX01BWDsgaisrKSB7Ci0JCQlpZiAoc2xvdF9vZmZzZXRbal0gIT0gQUZFX1NMT1RfTUFQUElOR19PRkZTRVRfSU5WQUxJRCkKLQkJCQlzbG90X21hc2sgfD0KLQkJCQkoMSA8PCAoKHNsb3Rfb2Zmc2V0W2pdICogOCkgLyBzbG90X3dpZHRoKSk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc2xvdF9tYXNrOwotfQotCi1zdGF0aWMgaW50IG1zbV90ZG1fc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGNoYW5uZWxzLCBzbG90X3dpZHRoLCBzbG90czsKLQl1bnNpZ25lZCBpbnQgc2xvdF9tYXNrOwotCXVuc2lnbmVkIGludCAqc2xvdF9vZmZzZXQ7Ci0JaW50IG9mZnNldF9jaGFubmVscyA9IDA7Ci0JaW50IGk7Ci0KLQlwcl9kZWJ1ZygiJXM6IGRhaSBpZCA9IDB4JXhcbiIsIF9fZnVuY19fLCBjcHVfZGFpLT5pZCk7Ci0KLQljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCXN3aXRjaCAoY2hhbm5lbHMpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCWNhc2UgNjoKLQljYXNlIDc6Ci0JY2FzZSA4OgotCQlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewotCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgotCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgotCQkvKgotCQkgKiBVcCB0byA4IGNoYW5uZWxzIEhXIGNvbmZpZyBzaG91bGQKLQkJICogdXNlIDMyIGJpdCBzbG90IHdpZHRoIGZvciBtYXggc3VwcG9ydCBvZgotCQkgKiBzdHJlYW0gYml0IHdpZHRoLiAoc2xvdF93aWR0aCA+IGJpdF93aWR0aCkKLQkJICovCi0JCQlzbG90X3dpZHRoID0gMzI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gZm9ybWF0IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzbG90cyA9IDg7Ci0JCXNsb3RfbWFzayA9IHRkbV9wYXJhbV9zZXRfc2xvdF9tYXNrKGNwdV9kYWktPmlkLAotCQkJCQkJICAgIHNsb3Rfd2lkdGgsCi0JCQkJCQkgICAgc2xvdHMpOwotCQlpZiAoIXNsb3RfbWFzaykgewotCQkJcHJfZXJyKCIlczogaW52YWxpZCBzbG90X21hc2sgMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywgc2xvdF9tYXNrKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgcGFyYW0gY2hhbm5lbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogY3VycmVudGx5IG9ubHkgc3VwcG9ydGluZyBURE1fUlhfMCBhbmQgVERNX1RYXzAgKi8KLQlzd2l0Y2ggKGNwdV9kYWktPmlkKSB7Ci0JY2FzZSBBRkVfUE9SVF9JRF9QUklNQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1NFQ09OREFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9URVJUSUFSWV9URE1fUlg6Ci0JY2FzZSBBRkVfUE9SVF9JRF9RVUFURVJOQVJZX1RETV9SWDoKLQljYXNlIEFGRV9QT1JUX0lEX1BSSU1BUllfVERNX1RYOgotCWNhc2UgQUZFX1BPUlRfSURfU0VDT05EQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1RFUlRJQVJZX1RETV9UWDoKLQljYXNlIEFGRV9QT1JUX0lEX1FVQVRFUk5BUllfVERNX1RYOgotCQlzbG90X29mZnNldCA9IHRkbV9zbG90X29mZnNldFtURE1fMF07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGRhaSBpZCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQlfX2Z1bmNfXywgY3B1X2RhaS0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVERNX1NMT1RfT0ZGU0VUX01BWDsgaSsrKSB7Ci0JCWlmIChzbG90X29mZnNldFtpXSAhPSBBRkVfU0xPVF9NQVBQSU5HX09GRlNFVF9JTlZBTElEKQotCQkJb2Zmc2V0X2NoYW5uZWxzKys7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQotCWlmIChvZmZzZXRfY2hhbm5lbHMgPT0gMCkgewotCQlwcl9lcnIoIiVzOiBzbG90IG9mZnNldCBub3Qgc3VwcG9ydGVkLCBvZmZzZXRfY2hhbm5lbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgb2Zmc2V0X2NoYW5uZWxzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGNoYW5uZWxzID4gb2Zmc2V0X2NoYW5uZWxzKSB7Ci0JCXByX2VycigiJXM6IGNoYW5uZWxzICVkIGV4Y2VlZCBvZmZzZXRfY2hhbm5lbHMgJWRcbiIsCi0JCQlfX2Z1bmNfXywgY2hhbm5lbHMsIG9mZnNldF9jaGFubmVscyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjcHVfZGFpLCAwLCBzbG90X21hc2ssCi0JCQkJCSAgICAgICBzbG90cywgc2xvdF93aWR0aCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gc2V0IHRkbSBzbG90LCBlcnI6JWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCBOVUxMLAotCQkJCQkJICBjaGFubmVscywgc2xvdF9vZmZzZXQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCBjaGFubmVsIG1hcCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY3B1X2RhaSwgc2xvdF9tYXNrLCAwLAotCQkJCQkgICAgICAgc2xvdHMsIHNsb3Rfd2lkdGgpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHNldCB0ZG0gc2xvdCwgZXJyOiVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJZ290byBlcnI7Ci0JCX0KLQotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2hhbm5lbF9tYXAoY3B1X2RhaSwgY2hhbm5lbHMsCi0JCQkJCQkgIHNsb3Rfb2Zmc2V0LCAwLCBOVUxMKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCB0byBzZXQgY2hhbm5lbCBtYXAsIGVycjolZFxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX2JlX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gbXNtX3NuZF9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIG1zbV9zbGltYnVzXzJfYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fc2xpbWJ1c18yX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3djbl9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IG1zbV93Y25faHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBtc21fdGRtX2JlX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gbXNtX3RkbV9zbmRfaHdfcGFyYW1zCi19OwotCi0vKiBEaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tLT4gQ1BVICovCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX2NvbW1vbl9kYWlfbGlua3NbXSA9IHsKLQkvKiBGcm9udEVuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTEpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWExIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19QUkVQQVJFLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTIpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTIiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWEyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiVm9pY2VNTW9kZTEiLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2VNTW9kZTEiLAotCQkuY3B1X2RhaV9uYW1lID0gIlZvaWNlTU1vZGUxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS12b2ljZSIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSUNFTU1PREUxLAotCX0sCi0JewotCQkubmFtZSA9ICJNU00gVm9JUCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb0lQIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWb0lQIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXZvaXAtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX1ZPSVAsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTEwpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTMiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWEzIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMiIsCi0JCS5keW5hbWljID0gMSwKLQkJLmFzeW5jX29wcyA9IEFTWU5DX0RQQ01fU05EX1NPQ19QUkVQQVJFLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTMsCi0JfSwKLQkvKiBIb3N0bGVzcyBQQ00gcHVycG9zZSAqLwotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU18wIEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVNfMCBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiU0xJTUJVUzBfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkgLyogdGhpcyBkYWlsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTVNNIEFGRS1QQ00gUlgiLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFLVBST1hZIFJYIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yNDEiLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1hZmUiLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1TTSBBRkUtUENNIFRYIiwKLQkJLnN0cmVhbV9uYW1lID0gIkFGRS1QUk9YWSBUWCIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjQwIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5wbGF0Zm9ybV9uYW1lICA9ICJtc20tcGNtLWFmZSIsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQ29tcHJlc3MxKSwKLQkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX0hXX1BBUkFNUywKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE0LAotCX0sCi0JewotCQkubmFtZSA9ICJBVVhQQ00gSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiQVVYUENNIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJBVVhQQ01fSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzEgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18xIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTMV9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzMgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18zIEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTM19IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzQgSG9zdGxlc3MiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU180IEhvc3RsZXNzIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTTElNQlVTNF9IT1NUTEVTUyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCSAvKiB0aGlzIGRhaWxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoTG93TGF0ZW5jeSksCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhNSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4xIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUE1LAotCX0sCi0JewotCQkubmFtZSA9ICJMaXN0ZW4gMSBBdWRpbyBTZXJ2aWNlIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxpc3RlbiAxIEF1ZGlvIFNlcnZpY2UiLAotCQkuY3B1X2RhaV9uYW1lID0gIkxTTTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tbHNtLWNsaWVudCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0geyBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgICBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUIH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9MU00xLAotCX0sCi0JLyogTXVsdGlwbGUgVHVubmVsIGluc3RhbmNlcyAqLwotCXsKLQkJLm5hbWUgPSBNU01fREFJTElOS19OQU1FKENvbXByZXNzMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzczIiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLWNvbXByZXNzLWRzcCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTcsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNdWx0aU1lZGlhMTApLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTEwIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4xIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEwLAotCX0sCi0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoVUxMX05PSVJRKSwKLQkJLnN0cmVhbV9uYW1lID0gIk1NX05PSVJRIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhOCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tZHNwLW5vaXJxIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCSAvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTgsCi0JfSwKLQkvKiBIRE1JIEhvc3RsZXNzICovCi0JewotCQkubmFtZSA9ICJIRE1JX1JYX0hPU1RMRVNTIiwKLQkJLnN0cmVhbV9uYW1lID0gIkhETUlfUlhfSE9TVExFU1MiLAotCQkuY3B1X2RhaV9uYW1lID0gIkhETUlfSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCX0sCi0JewotCQkubmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5zdHJlYW1fbmFtZSA9ICJWb2ljZU1Nb2RlMiIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVm9pY2VNTW9kZTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXZvaWNlIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfVk9JQ0VNTU9ERTIsCi0JfSwKLQkvKiBMU00gRkUgKi8KLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiAyIEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDIgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiAzIEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDMgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiA0IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDQgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTQsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiA1IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDUgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTUsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiA2IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDYgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTYsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiA3IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDcgQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNNyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTcsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIkxpc3RlbiA4IEF1ZGlvIFNlcnZpY2UiLAotCQkuc3RyZWFtX25hbWUgPSAiTGlzdGVuIDggQXVkaW8gU2VydmljZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTFNNOCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1sc20tY2xpZW50IiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7IFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkJIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QgfSwKLQkJLm5vX2hvc3RfbW9kZSA9IFNORF9TT0NfREFJX0xJTktfTk9fSE9TVCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX0xTTTgsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShNZWRpYTkpLAotCQkuc3RyZWFtX25hbWUgPSAiTXVsdGlNZWRpYTkiLAotCQkuY3B1X2RhaV9uYW1lID0gIk11bHRpTWVkaWE5IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1kc3AuMCIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTksCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczQpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M0IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczUpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M1IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTIsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczYpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M2IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTMsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczcpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M3IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTQsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShDb21wcmVzczgpLAotCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3M4IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tY29tcHJlc3MtZHNwIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJIC8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBMTUsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTVNNX0RBSUxJTktfTkFNRShVTExfTk9JUlFfMiksCi0JCS5zdHJlYW1fbmFtZSA9ICJNTV9OT0lSUV8yIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhMTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC1ub2lycSIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKLQkJCSBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkgLyogdGhpcyBkYWlubGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWQgPSBNU01fRlJPTlRFTkRfREFJX01VTFRJTUVESUExNiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU184IEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIlNMSU1CVVM4X0hPU1RMRVNTIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQkgICAgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9mZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU180X1RYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czQgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTMiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdmlmZWVkYmFjayIsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQkvKiBVbHRyYXNvdW5kIFJYIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9ICJTTElNQlVTXzIgSG9zdGxlc3MgUGxheWJhY2siLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20taG9zdGxlc3MiLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDIiLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkub3BzID0gJm1zbV9zbGltYnVzXzJfYmVfb3BzLAotCX0sCi0JLyogVWx0cmFzb3VuZCBUWCBEQUkgTGluayAqLwotCXsKLQkJLm5hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuc3RyZWFtX25hbWUgPSAiU0xJTUJVU18yIEhvc3RsZXNzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg5IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1ob3N0bGVzcyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3R4MiIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5ub19ob3N0X21vZGUgPSBTTkRfU09DX0RBSV9MSU5LX05PX0hPU1QsCi0JCS5vcHMgPSAmbXNtX3NsaW1idXNfMl9iZV9vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX21pc2NfZmVfZGFpX2xpbmtzW10gPSB7Ci0JewotCQkubmFtZSA9IE1TTV9EQUlMSU5LX05BTUUoQVNNIExvb3BiYWNrKSwKLQkJLnN0cmVhbV9uYW1lID0gIk11bHRpTWVkaWE2IiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJNdWx0aU1lZGlhNiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tbG9vcGJhY2siLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlkID0gTVNNX0ZST05URU5EX0RBSV9NVUxUSU1FRElBNiwKLQl9LAotCXsKLQkJLm5hbWUgPSAiVVNCIEF1ZGlvIEhvc3RsZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlVTQiBBdWRpbyBIb3N0bGVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiVVNCQVVESU9fSE9TVExFU1MiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWhvc3RsZXNzIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULAotCQkJICAgIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkubm9faG9zdF9tb2RlID0gU05EX1NPQ19EQUlfTElOS19OT19IT1NULAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fY29tbW9uX2JlX2RhaV9saW5rc1tdID0gewotCS8qIEJhY2tlbmQgQUZFIERBSSBMaW5rcyAqLwotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BRkVfUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiQUZFIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yMjQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkvKiB0aGlzIGRhaW5saW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FGRV9QQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBRkUgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMjI1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FGRV9QQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIFJlY29yZCBVcGxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIFVwbGluayBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9JTkNBTExfUkVDT1JEX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIEluY2FsbCBSZWNvcmQgRG93bmxpbmsgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfSU5DQUxMX1JFQ09SRF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlZvaWNlIERvd25saW5rIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjMyNzcxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0lOQ0FMTF9SRUNPUkRfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIEJBQ0sgRU5EIERBSSBMaW5rICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1ZPSUNFX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgRmFyZW5kIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4zMjc3MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVk9JQ0VfUExBWUJBQ0tfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogSW5jYWxsIE11c2ljIDIgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVk9JQ0UyX1BMQVlCQUNLX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UyIEZhcmVuZCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMzI3NzAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1ZPSUNFMl9QTEFZQkFDS19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4yODY3MiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfVVNCX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVVNCX0FVRElPX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVVNCIEF1ZGlvIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjI4NjczIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1VTQl9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiUHJpbWFyeSBURE0wIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjg2NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9QUklfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4NjUiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUFJJX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWNvbmRhcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19URE1fUlhfMCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX1RETV9UWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IFRETTAgQ2FwdHVyZSIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4ODEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0VDX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX1RETV9SWF8wLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgVERNMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi10ZG0uMzY4OTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1JYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfVERNX1RYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJUZXJ0aWFyeSBURE0wIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2ODk3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfVERNX1RYXzAsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV90ZG1fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfVERNX1JYXzAsCi0JCS5zdHJlYW1fbmFtZSA9ICJRdWF0ZXJuYXJ5IFRETTAgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtdGRtLjM2OTEyIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9SWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX3RkbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmc2RtODQ1X3RkbV9iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9URE1fVFhfMCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgVERNMCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LXRkbS4zNjkxMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX1RETV9UWF8wLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fdGRtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV90YXZpbF9iZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDEiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1JYLAotCQkuaW5pdCA9ICZtc21fYXVkcnhfaW5pdCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18wX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4NiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzFfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMxIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg3IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgzIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18xX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfMl9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMyIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM4OCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MiIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzJfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfM19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXMzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2MzkxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfdHgxIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU18zX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNF9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM0IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzRfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5NCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3J4MyIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzVfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9iZV9vcHMsCi0JCS8qIGRhaSBsaW5rIGhhcyBwbGF5YmFjayBzdXBwb3J0ICovCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JLyogTUFEIEJFICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfNV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM1IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAidGF2aWxfY29kZWMiLAotCQkuY29kZWNfZGFpX25hbWUgPSAidGF2aWxfbWFkMSIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfNV9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzZfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNiBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzOTYiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJ0YXZpbF9jb2RlYyIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJ0YXZpbF9yeDQiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU182X1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCS8qIFNsaW1idXMgVkkgUmVjb3JkaW5nICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfVFhfVkksCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNCBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5MyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gInRhdmlsX2NvZGVjIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInRhdmlsX3ZpZmVlZGJhY2siLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU180X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3djbl9iZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU183X1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1czcgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzk4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAotCQkvKiBCVCBjb2RlYyBkcml2ZXIgZGV0ZXJtaW5lcyBjYXBhYmlsaXRpZXMgYmFzZWQgb24KLQkJICogZGFpIG5hbWUsIGJ0IGNvZGVjZGFpIG5hbWUgc2hvdWxkIGFsd2F5cyBjb250YWlucwotCQkgKiBzdXBwb3J0ZWQgdXNlY2FzZSBpbmZvcm1hdGlvbgotCQkgKi8KLQkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fYnRfc2NvX2EyZHBfc2xpbV9yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV93Y25fb3BzLAotCQkvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzdfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzNyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRldi4xNjM5OSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gImJ0Zm1zbGltX3NsYXZlIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gImJ0Zm1fYnRfc2NvX3NsaW1fdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TTElNQlVTXzdfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV93Y25fb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NMSU1CVVNfOF9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNsaW1idXM4IENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2NDAxIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAiYnRmbXNsaW1fc2xhdmUiLAotCQkuY29kZWNfZGFpX25hbWUgPSAiYnRmbV9mbV9zbGltX3R4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfU0xJTUJVU184X1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmluaXQgPSAmbXNtX3djbl9pbml0LAotCQkub3BzID0gJm1zbV93Y25fb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgZXh0X2Rpc3BfYmVfZGFpX2xpbmtbXSA9IHsKLQkvKiBESVNQIFBPUlQgQkFDSyBFTkQgREFJIExpbmsgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfRElTUExBWV9QT1JULAotCQkuc3RyZWFtX25hbWUgPSAiRGlzcGxheSBQb3J0IFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWRwLjI0NjA4IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLWV4dC1kaXNwLWF1ZGlvLWNvZGVjLXJ4IiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbV9kcF9hdWRpb19jb2RlY19yeF9kYWkiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfRElTUExBWV9QT1JUX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBtc21fbWkyc19iZV9kYWlfbGlua3NbXSA9IHsKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUFJJX01JMlNfUlgsCi0JCS5zdHJlYW1fbmFtZSA9ICJQcmltYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4wIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9QUklfTUkyU19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlByaW1hcnkgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9QUklfTUkyU19UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2Vjb25kYXJ5IE1JMlMgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNPTkRBUllfTUkyU19SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5vcHMgPSAmbXNtX21pMnNfYmVfb3BzLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TRUNfTUkyU19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlY29uZGFyeSBNSTJTIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtbWkycy4xIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ09OREFSWV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1taTJzLjIiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRJQVJZX01JMlNfUlgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfVEVSVF9NSTJTX1RYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydGlhcnkgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUSUFSWV9NSTJTX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfUVVBVF9NSTJTX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdGVybmFyeSBNSTJTIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItcngiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfUVVBVEVSTkFSWV9NSTJTX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLm9wcyA9ICZtc21fbWkyc19iZV9vcHMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfTUkyU19UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXRlcm5hcnkgTUkyUyBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LW1pMnMuMyIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gIm1zbS1wY20tcm91dGluZyIsCi0JCS5jb2RlY19uYW1lID0gIm1zbS1zdHViLWNvZGVjLjEiLAotCQkuY29kZWNfZGFpX25hbWUgPSAibXNtLXN0dWItdHgiLAotCQkubm9fcGNtID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFURVJOQVJZX01JMlNfVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkub3BzID0gJm1zbV9taTJzX2JlX29wcywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzW10gPSB7Ci0JLyogUHJpbWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX0FVWFBDTV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIkFVWCBQQ00gUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJBVVggUENNIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtYXV4cGNtLjEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXR4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkuaWQgPSBNU01fQkFDS0VORF9EQUlfQVVYUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JLyogU2Vjb25kYXJ5IEFVWCBQQ00gQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0VDX0FVWFBDTV9SWCwKLQkJLnN0cmVhbV9uYW1lID0gIlNlYyBBVVggUENNIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9TRUNfQVVYUENNX1JYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1NFQ19BVVhQQ01fVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTZWMgQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4yIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NFQ19BVVhQQ01fVFgsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBtc21fYmVfaHdfcGFyYW1zX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKLQkJLm9wcyA9ICZtc21fYXV4X3BjbV9iZV9vcHMsCi0JfSwKLQkvKiBUZXJ0aWFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1RFUlRfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiVGVydCBBVVggUENNIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9URVJUX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9URVJUX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlRlcnQgQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS4zIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1RFUlRfQVVYUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi0JLyogUXVhdGVybmFyeSBBVVggUENNIEJhY2tlbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9IExQQVNTX0JFX1FVQVRfQVVYUENNX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiUXVhdCBBVVggUENNIFBsYXliYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi1yeCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5pZCA9IE1TTV9CQUNLRU5EX0RBSV9RVUFUX0FVWFBDTV9SWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9hdXhfcGNtX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9RVUFUX0FVWFBDTV9UWCwKLQkJLnN0cmVhbV9uYW1lID0gIlF1YXQgQVVYIFBDTSBDYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtc20tZGFpLXE2LWF1eHBjbS40IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1FVQVRfQVVYUENNX1RYLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gbXNtX2JlX2h3X3BhcmFtc19maXh1cCwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5vcHMgPSAmbXNtX2F1eF9wY21fYmVfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3RhdmlsX3NuZF9jYXJkX2RhaV9saW5rc1sKLQkJCSBBUlJBWV9TSVpFKG1zbV9jb21tb25fZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fdGF2aWxfZmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fY29tbW9uX21pc2NfZmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fY29tbW9uX2JlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX3RhdmlsX2JlX2RhaV9saW5rcykgKwotCQkJIEFSUkFZX1NJWkUobXNtX3djbl9iZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKSArCi0JCQkgQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpICsKLQkJCSBBUlJBWV9TSVpFKG1zbV9hdXhwY21fYmVfZGFpX2xpbmtzKV07Ci0KLXN0YXRpYyBpbnQgbXNtX3NuZF9jYXJkX3RhdmlsX2xhdGVfcHJvYmUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQljb25zdCBjaGFyICpiZV9kbF9uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqbWJoY19jYWxpYnJhdGlvbjsKLQotCXJ0ZCA9IHNuZF9zb2NfZ2V0X3BjbV9ydW50aW1lKGNhcmQsIGJlX2RsX25hbWUpOwotCWlmICghcnRkKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LAotCQkJIiVzOiBzbmRfc29jX2dldF9wY21fcnVudGltZSBmb3IgJXMgZmFpbGVkIVxuIiwKLQkJCV9fZnVuY19fLCBiZV9kbF9uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JbWJoY19jYWxpYnJhdGlvbiA9IGRlZl90YXZpbF9tYmhjX2NhbCgpOwotCWlmICghbWJoY19jYWxpYnJhdGlvbikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0Jd2NkX21iaGNfY2ZnLmNhbGlicmF0aW9uID0gbWJoY19jYWxpYnJhdGlvbjsKLQlyZXQgPSB0YXZpbF9tYmhjX2hzX2RldGVjdChydGQtPmNvZGVjLCAmd2NkX21iaGNfY2ZnKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXM6IG1iaGMgaHMgZGV0ZWN0IGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7Ci0JCWdvdG8gZXJyX2ZyZWVfbWJoY19jYWw7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9tYmhjX2NhbDoKLQlrZnJlZShtYmhjX2NhbGlicmF0aW9uKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfY2FyZF90YXZpbF9tc20gPSB7Ci0JLm5hbWUJCT0gInNkbTg0NS10YXZpbC1zbmQtY2FyZCIsCi0JLmxhdGVfcHJvYmUJPSBtc21fc25kX2NhcmRfdGF2aWxfbGF0ZV9wcm9iZSwKLX07Ci0KLXN0YXRpYyBpbnQgbXNtX3BvcHVsYXRlX2RhaV9saW5rX2NvbXBvbmVudF9vZl9ub2RlKAotCQkJCQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCWludCBpLCBpbmRleCwgcmV0ID0gMDsKLQlzdHJ1Y3QgZGV2aWNlICpjZGV2ID0gY2FyZC0+ZGV2OwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlpZiAoIWNkZXYpIHsKLQkJcHJfZXJyKCIlczogU291bmQgY2FyZCBkZXZpY2UgbWVtb3J5IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7Ci0JCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9vZl9ub2RlICYmIGRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKQotCQkJY29udGludWU7Ci0KLQkJLyogcG9wdWxhdGUgcGxhdGZvcm1fb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCi0JCWlmIChkYWlfbGlua1tpXS5wbGF0Zm9ybV9uYW1lICYmCi0JCSAgICAhZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSkgewotCQkJaW5kZXggPSBvZl9wcm9wZXJ0eV9tYXRjaF9zdHJpbmcoY2Rldi0+b2Zfbm9kZSwKLQkJCQkJCSJhc29jLXBsYXRmb3JtLW5hbWVzIiwKLQkJCQkJCWRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCXByX2VycigiJXM6IE5vIG1hdGNoIGZvdW5kIGZvciBwbGF0Zm9ybSBuYW1lOiAlc1xuIiwKLQkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUpOwotCQkJCXJldCA9IGluZGV4OwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsICJhc29jLXBsYXRmb3JtIiwKLQkJCQkJICAgICAgaW5kZXgpOwotCQkJaWYgKCFucCkgewotCQkJCXByX2VycigiJXM6IHJldHJpZXZpbmcgcGhhbmRsZSBmb3IgcGxhdGZvcm0gJXMsIGluZGV4ICVkIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIGRhaV9saW5rW2ldLnBsYXRmb3JtX25hbWUsCi0JCQkJCWluZGV4KTsKLQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fb2Zfbm9kZSA9IG5wOwotCQkJZGFpX2xpbmtbaV0ucGxhdGZvcm1fbmFtZSA9IE5VTEw7Ci0JCX0KLQotCQkvKiBwb3B1bGF0ZSBjcHVfb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCi0JCWlmIChkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgJiYgIWRhaV9saW5rW2ldLmNwdV9vZl9ub2RlKSB7Ci0JCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAotCQkJCQkJICJhc29jLWNwdS1uYW1lcyIsCi0JCQkJCQkgZGFpX2xpbmtbaV0uY3B1X2RhaV9uYW1lKTsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGNkZXYtPm9mX25vZGUsICJhc29jLWNwdSIsCi0JCQkJCQlpbmRleCk7Ci0JCQkJaWYgKCFucCkgewotCQkJCQlwcl9lcnIoIiVzOiByZXRyaWV2aW5nIHBoYW5kbGUgZm9yIGNwdSBkYWkgJXMgZmFpbGVkXG4iLAotCQkJCQkJX19mdW5jX18sCi0JCQkJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUpOwotCQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCQlnb3RvIGVycjsKLQkJCQl9Ci0JCQkJZGFpX2xpbmtbaV0uY3B1X29mX25vZGUgPSBucDsKLQkJCQlkYWlfbGlua1tpXS5jcHVfZGFpX25hbWUgPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkJLyogcG9wdWxhdGUgY29kZWNfb2Zfbm9kZSBmb3Igc25kIGNhcmQgZGFpIGxpbmtzICovCi0JCWlmIChkYWlfbGlua1tpXS5jb2RlY19uYW1lICYmICFkYWlfbGlua1tpXS5jb2RlY19vZl9ub2RlKSB7Ci0JCQlpbmRleCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhjZGV2LT5vZl9ub2RlLAotCQkJCQkJICJhc29jLWNvZGVjLW5hbWVzIiwKLQkJCQkJCSBkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKLQkJCWlmIChpbmRleCA8IDApCi0JCQkJY29udGludWU7Ci0JCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoY2Rldi0+b2Zfbm9kZSwgImFzb2MtY29kZWMiLAotCQkJCQkgICAgICBpbmRleCk7Ci0JCQlpZiAoIW5wKSB7Ci0JCQkJcHJfZXJyKCIlczogcmV0cmlldmluZyBwaGFuZGxlIGZvciBjb2RlYyAlcyBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCBkYWlfbGlua1tpXS5jb2RlY19uYW1lKTsKLQkJCQlyZXQgPSAtRU5PREVWOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJZGFpX2xpbmtbaV0uY29kZWNfb2Zfbm9kZSA9IG5wOwotCQkJZGFpX2xpbmtbaV0uY29kZWNfbmFtZSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1zbV9wcmVwYXJlX3VzX2V1cm8oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9Ci0JCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPj0gMCkgewotCQlkZXZfZGJnKGNhcmQtPmRldiwgIiVzOiB1c19ldXJvIGdwaW8gcmVxdWVzdCAlZCIsIF9fZnVuY19fLAotCQkJcGRhdGEtPnVzX2V1cm9fZ3Bpbyk7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+dXNfZXVyb19ncGlvLCAiVEFWSUxfQ09ERUNfVVNfRVVSTyIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwKLQkJCQkiJXM6IEZhaWxlZCB0byByZXF1ZXN0IGNvZGVjIFVTL0VVUk8gZ3BpbyAlZCBlcnJvciAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgcGRhdGEtPnVzX2V1cm9fZ3BpbywgcmV0KTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2F1ZHJ4X3N0dWJfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7Ci0KLQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbXNtX3NuZF9jb250cm9scywKLQkJCQkJIEFSUkFZX1NJWkUobXNtX3NuZF9jb250cm9scykpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCSIlczogYWRkX2NvZGVjX2NvbnRyb2xzIGZhaWxlZCwgZXJyID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sIG1zbV9kYXBtX3dpZGdldHMsCi0JCQkJICBBUlJBWV9TSVpFKG1zbV9kYXBtX3dpZGdldHMpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9zbmRfc3R1Yl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0KLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgcnhfY2hbXSA9IHsxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsCi0JCQkJMTUxfTsKLQl1bnNpZ25lZCBpbnQgdHhfY2hbXSA9IHsxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLAotCQkJCTEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksCi0JCQkJMTQwLCAxNDEsIDE0MiwgMTQzfTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLCAwLCAwLAotCQkJCQkJICBzbGltX3J4X2NmZ1swXS5jaGFubmVscywKLQkJCQkJCSAgcnhfY2gpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IFJYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0gZWxzZSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jaGFubmVsX21hcChjcHVfZGFpLAotCQkJCQkJICBzbGltX3R4X2NmZ1swXS5jaGFubmVscywKLQkJCQkJCSAgdHhfY2gsIDAsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX2VycigiJXM6IFRYIGZhaWxlZCB0byBzZXQgY3B1IGNoYW4gbWFwIGVycm9yICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgbXNtX3N0dWJfYmVfb3BzID0gewotCS5od19wYXJhbXMgPSBtc21fc25kX3N0dWJfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2ZlX2RhaV9saW5rc1tdID0gewotCi0JLyogRnJvbnRFbmQgREFJIExpbmtzICovCi0JewotCQkubmFtZSA9ICJNU01TVFVCIE1lZGlhMSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJNdWx0aU1lZGlhMSIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTXVsdGlNZWRpYTEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLWRzcC4wIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuYXN5bmNfb3BzID0gQVNZTkNfRFBDTV9TTkRfU09DX1BSRVBBUkUsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCi0JCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS8qIHRoaXMgZGFpbmxpbmsgaGFzIHBsYXliYWNrIHN1cHBvcnQgKi8KLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5pZCA9IE1TTV9GUk9OVEVORF9EQUlfTVVMVElNRURJQTEKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1zbV9zdHViX2JlX2RhaV9saW5rc1tdID0gewotCi0JLyogQmFja2VuZCBEQUkgTGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gTFBBU1NfQkVfU0xJTUJVU18wX1JYLAotCQkuc3RyZWFtX25hbWUgPSAiU2xpbWJ1cyBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAibXNtLWRhaS1xNi1kZXYuMTYzODQiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJtc20tcGNtLXJvdXRpbmciLAotCQkuY29kZWNfbmFtZSA9ICJtc20tc3R1Yi1jb2RlYy4xIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIm1zbS1zdHViLXJ4IiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9SWCwKLQkJLmluaXQgPSAmbXNtX2F1ZHJ4X3N0dWJfaW5pdCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLCAvKiBkYWkgbGluayBoYXMgcGxheWJhY2sgc3VwcG9ydCAqLwotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkub3BzID0gJm1zbV9zdHViX2JlX29wcywKLQl9LAotCXsKLQkJLm5hbWUgPSBMUEFTU19CRV9TTElNQlVTXzBfVFgsCi0JCS5zdHJlYW1fbmFtZSA9ICJTbGltYnVzIENhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIm1zbS1kYWktcTYtZGV2LjE2Mzg1IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAibXNtLXBjbS1yb3V0aW5nIiwKLQkJLmNvZGVjX25hbWUgPSAibXNtLXN0dWItY29kZWMuMSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJtc20tc3R1Yi10eCIsCi0JCS5ub19wY20gPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQkJLmlkID0gTVNNX0JBQ0tFTkRfREFJX1NMSU1CVVNfMF9UWCwKLQkJLmJlX2h3X3BhcmFtc19maXh1cCA9IG1zbV9iZV9od19wYXJhbXNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5vcHMgPSAmbXNtX3N0dWJfYmVfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbXNtX3N0dWJfZGFpX2xpbmtzWwotCQkJIEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKSArCi0JCQkgQVJSQVlfU0laRShtc21fc3R1Yl9iZV9kYWlfbGlua3MpXTsKLQotc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfc3R1Yl9tc20gPSB7Ci0JLm5hbWUJCT0gInNkbTg0NS1zdHViLXNuZC1jYXJkIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkbTg0NV9hc29jX21hY2hpbmVfb2ZfbWF0Y2hbXSAgPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHNkbTg0NS1hc29jLXNuZC10YXZpbCIsCi0JICAuZGF0YSA9ICJ0YXZpbF9jb2RlYyJ9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzZG04NDUtYXNvYy1zbmQtc3R1YiIsCi0JICAuZGF0YSA9ICJzdHViX2NvZGVjIn0sCi0Je30sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCAqcG9wdWxhdGVfc25kX2NhcmRfZGFpbGlua3Moc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlsaW5rOwotCWludCBsZW5fMSwgbGVuXzIsIGxlbl8zLCBsZW5fNDsKLQlpbnQgdG90YWxfbGlua3M7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUoc2RtODQ1X2Fzb2NfbWFjaGluZV9vZl9tYXRjaCwgZGV2LT5vZl9ub2RlKTsKLQlpZiAoIW1hdGNoKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IE5vIERUIG1hdGNoIGZvdW5kIGZvciBzb3VuZCBjYXJkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoIXN0cmNtcChtYXRjaC0+ZGF0YSwgInRhdmlsX2NvZGVjIikpIHsKLQkJY2FyZCA9ICZzbmRfc29jX2NhcmRfdGF2aWxfbXNtOwotCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX2NvbW1vbl9kYWlfbGlua3MpOwotCQlsZW5fMiA9IGxlbl8xICsgQVJSQVlfU0laRShtc21fdGF2aWxfZmVfZGFpX2xpbmtzKTsKLQkJbGVuXzMgPSBsZW5fMiArIEFSUkFZX1NJWkUobXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcyk7Ci0JCWxlbl80ID0gbGVuXzMgKyBBUlJBWV9TSVpFKG1zbV9jb21tb25fYmVfZGFpX2xpbmtzKTsKLQkJdG90YWxfbGlua3MgPSBsZW5fNCArIEFSUkFZX1NJWkUobXNtX3RhdmlsX2JlX2RhaV9saW5rcyk7Ci0JCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzLAotCQkgICAgICAgbXNtX2NvbW1vbl9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX2NvbW1vbl9kYWlfbGlua3MpKTsKLQkJbWVtY3B5KG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3MgKyBsZW5fMSwKLQkJICAgICAgIG1zbV90YXZpbF9mZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3RhdmlsX2ZlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3RhdmlsX3NuZF9jYXJkX2RhaV9saW5rcyArIGxlbl8yLAotCQkgICAgICAgbXNtX2NvbW1vbl9taXNjX2ZlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fY29tbW9uX21pc2NfZmVfZGFpX2xpbmtzKSk7Ci0JCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgbGVuXzMsCi0JCSAgICAgICBtc21fY29tbW9uX2JlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fY29tbW9uX2JlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3RhdmlsX3NuZF9jYXJkX2RhaV9saW5rcyArIGxlbl80LAotCQkgICAgICAgbXNtX3RhdmlsX2JlX2RhaV9saW5rcywKLQkJICAgICAgIHNpemVvZihtc21fdGF2aWxfYmVfZGFpX2xpbmtzKSk7Ci0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsICJxY29tLHdjbi1idGZtIikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogV0NOIEJURk0gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQkgICAgICAgbXNtX3djbl9iZV9kYWlfbGlua3MsCi0JCQkgICAgICAgc2l6ZW9mKG1zbV93Y25fYmVfZGFpX2xpbmtzKSk7Ci0JCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKG1zbV93Y25fYmVfZGFpX2xpbmtzKTsKLQkJfQotCi0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLGV4dC1kaXNwLWF1ZGlvLXJ4IikpIHsKLQkJCWRldl9kYmcoZGV2LCAiJXMoKTogZXh0IGRpc3AgYXVkaW8gc3VwcG9ydCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQkgICAgICAgZXh0X2Rpc3BfYmVfZGFpX2xpbmssCi0JCQkgICAgICAgc2l6ZW9mKGV4dF9kaXNwX2JlX2RhaV9saW5rKSk7Ci0JCQl0b3RhbF9saW5rcyArPSBBUlJBWV9TSVpFKGV4dF9kaXNwX2JlX2RhaV9saW5rKTsKLQkJfQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKLQkJCQkJICAicWNvbSxtaTJzLWF1ZGlvLWludGYiKSkgewotCQkJbWVtY3B5KG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3MgKyB0b3RhbF9saW5rcywKLQkJCSAgICAgICBtc21fbWkyc19iZV9kYWlfbGlua3MsCi0JCQkgICAgICAgc2l6ZW9mKG1zbV9taTJzX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fbWkyc19iZV9kYWlfbGlua3MpOwotCQl9Ci0JCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAotCQkJCQkgICJxY29tLGF1eHBjbS1hdWRpby1pbnRmIikpIHsKLQkJCW1lbWNweShtc21fdGF2aWxfc25kX2NhcmRfZGFpX2xpbmtzICsgdG90YWxfbGlua3MsCi0JCQltc21fYXV4cGNtX2JlX2RhaV9saW5rcywKLQkJCXNpemVvZihtc21fYXV4cGNtX2JlX2RhaV9saW5rcykpOwotCQkJdG90YWxfbGlua3MgKz0gQVJSQVlfU0laRShtc21fYXV4cGNtX2JlX2RhaV9saW5rcyk7Ci0JCX0KLQkJZGFpbGluayA9IG1zbV90YXZpbF9zbmRfY2FyZF9kYWlfbGlua3M7Ci0JfSBlbHNlIGlmICghc3RyY21wKG1hdGNoLT5kYXRhLCAic3R1Yl9jb2RlYyIpKSB7Ci0JCWNhcmQgPSAmc25kX3NvY19jYXJkX3N0dWJfbXNtOwotCQlsZW5fMSA9IEFSUkFZX1NJWkUobXNtX3N0dWJfZmVfZGFpX2xpbmtzKTsKLQkJbGVuXzIgPSBsZW5fMSArIEFSUkFZX1NJWkUobXNtX3N0dWJfYmVfZGFpX2xpbmtzKTsKLQotCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzLAotCQkgICAgICAgbXNtX3N0dWJfZmVfZGFpX2xpbmtzLAotCQkgICAgICAgc2l6ZW9mKG1zbV9zdHViX2ZlX2RhaV9saW5rcykpOwotCQltZW1jcHkobXNtX3N0dWJfZGFpX2xpbmtzICsgbGVuXzEsCi0JCSAgICAgICBtc21fc3R1Yl9iZV9kYWlfbGlua3MsCi0JCSAgICAgICBzaXplb2YobXNtX3N0dWJfYmVfZGFpX2xpbmtzKSk7Ci0KLQkJZGFpbGluayA9IG1zbV9zdHViX2RhaV9saW5rczsKLQkJdG90YWxfbGlua3MgPSBsZW5fMjsKLQl9Ci0KLQlpZiAoY2FyZCkgewotCQljYXJkLT5kYWlfbGluayA9IGRhaWxpbms7Ci0JCWNhcmQtPm51bV9saW5rcyA9IHRvdGFsX2xpbmtzOwotCX0KLQotCXJldHVybiBjYXJkOwotfQotCi1zdGF0aWMgaW50IG1zbV93c2E4ODF4X2luaXQoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQpCi17Ci0JdTggc3BrbGVmdF9wb3J0c1tXU0E4ODFYX01BWF9TV1JfUE9SVFNdID0gezEwMCwgMTAxLCAxMDIsIDEwNn07Ci0JdTggc3BrcmlnaHRfcG9ydHNbV1NBODgxWF9NQVhfU1dSX1BPUlRTXSA9IHsxMDMsIDEwNCwgMTA1LCAxMDd9OwotCXVuc2lnbmVkIGludCBjaF9yYXRlW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MjQwMCwgNjAwLCAzMDAsIDEyMDB9OwotCXVuc2lnbmVkIGludCBjaF9tYXNrW1dTQTg4MVhfTUFYX1NXUl9QT1JUU10gPSB7MHgxLCAweEYsIDB4MywgMHgzfTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2NvbXBvbmVudF90b19jb2RlYyhjb21wb25lbnQpOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghY29kZWMpIHsKLQkJcHJfZXJyKCIlcyBjb2RlYyBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKLQotCWlmICghc3RyY21wKGNvbXBvbmVudC0+bmFtZV9wcmVmaXgsICJTcGtyTGVmdCIpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIGxlZnQgY2ggbWFwIHRvIGNvZGVjICVzXG4iLAotCQkJX19mdW5jX18sIGNvZGVjLT5jb21wb25lbnQubmFtZSk7Ci0JCXdzYTg4MXhfc2V0X2NoYW5uZWxfbWFwKGNvZGVjLCAmc3BrbGVmdF9wb3J0c1swXSwKLQkJCQlXU0E4ODFYX01BWF9TV1JfUE9SVFMsICZjaF9tYXNrWzBdLAotCQkJCSZjaF9yYXRlWzBdKTsKLQkJaWYgKGRhcG0tPmNvbXBvbmVudCkgewotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBJTiIpOwotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyTGVmdCBTUEtSIik7Ci0JCX0KLQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tcG9uZW50LT5uYW1lX3ByZWZpeCwgIlNwa3JSaWdodCIpKSB7Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBzZXR0aW5nIHJpZ2h0IGNoIG1hcCB0byBjb2RlYyAlc1xuIiwKLQkJCV9fZnVuY19fLCBjb2RlYy0+Y29tcG9uZW50Lm5hbWUpOwotCQl3c2E4ODF4X3NldF9jaGFubmVsX21hcChjb2RlYywgJnNwa3JpZ2h0X3BvcnRzWzBdLAotCQkJCVdTQTg4MVhfTUFYX1NXUl9QT1JUUywgJmNoX21hc2tbMF0sCi0JCQkJJmNoX3JhdGVbMF0pOwotCQlpZiAoZGFwbS0+Y29tcG9uZW50KSB7Ci0JCQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoZGFwbSwgIlNwa3JSaWdodCBJTiIpOwotCQkJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKGRhcG0sICJTcGtyUmlnaHQgU1BLUiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiJXM6IHdyb25nIGNvZGVjIG5hbWUgJXNcbiIsIF9fZnVuY19fLAotCQkJY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCXBkYXRhID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNvbXBvbmVudC0+Y2FyZCk7Ci0JaWYgKHBkYXRhICYmIHBkYXRhLT5jb2RlY19yb290KQotCQl3c2E4ODF4X2NvZGVjX2luZm9fY3JlYXRlX2NvZGVjX2VudHJ5KHBkYXRhLT5jb2RlY19yb290LAotCQkJCQkJICAgICAgY29kZWMpOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21faW5pdF93c2FfZGV2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKndzYV9vZl9ub2RlOwotCXUzMiB3c2FfbWF4X2RldnM7Ci0JdTMyIHdzYV9kZXZfY250OwotCWludCBpOwotCXN0cnVjdCBtc21fd3NhODgxeF9kZXZfaW5mbyAqd3NhODgxeF9kZXZfaW5mbzsKLQljb25zdCBjaGFyICp3c2FfYXV4ZGV2X25hbWVfcHJlZml4WzFdOwotCWNoYXIgKmRldl9uYW1lX3N0ciA9IE5VTEw7Ci0JaW50IGZvdW5kID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIEdldCBtYXhpbXVtIFdTQSBkZXZpY2UgY291bnQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkgICAicWNvbSx3c2EtbWF4LWRldnMiLCAmd3NhX21heF9kZXZzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsCi0JCQkgIiVzOiB3c2EtbWF4LWRldnMgcHJvcGVydHkgbWlzc2luZyBpbiBEVCAlcywgcmV0ID0gJWRcbiIsCi0JCQkgX19mdW5jX18sIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUsIHJldCk7Ci0JCWNhcmQtPm51bV9hdXhfZGV2cyA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAod3NhX21heF9kZXZzID09IDApIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKLQkJCSAiJXM6IE1heCBXU0EgZGV2aWNlcyBpcyAwIGZvciB0aGlzIHRhcmdldD9cbiIsCi0JCQkgX19mdW5jX18pOwotCQljYXJkLT5udW1fYXV4X2RldnMgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBHZXQgY291bnQgb2YgV1NBIGRldmljZSBwaGFuZGxlcyBmb3IgdGhpcyBwbGF0Zm9ybSAqLwotCXdzYV9kZXZfY250ID0gb2ZfY291bnRfcGhhbmRsZV93aXRoX2FyZ3MocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkgInFjb20sd3NhLWRldnMiLCBOVUxMKTsKLQlpZiAod3NhX2Rldl9jbnQgPT0gLUVOT0VOVCkgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiJXM6IE5vIHdzYSBkZXZpY2UgZGVmaW5lZCBpbiBEVC5cbiIsCi0JCQkgX19mdW5jX18pOwotCQlnb3RvIGVycjsKLQl9IGVsc2UgaWYgKHdzYV9kZXZfY250IDw9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIiVzOiBFcnJvciByZWFkaW5nIHdzYSBkZXZpY2UgZnJvbSBEVC4gd3NhX2Rldl9jbnQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfZGV2X2NudCk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qCi0JICogRXhwZWN0IHRvdGFsIHBoYW5kbGVzIGNvdW50IHRvIGJlIE5PVCBsZXNzIHRoYW4gbWF4aW11bSBwb3NzaWJsZQotCSAqIFdTQSBjb3VudC4gSG93ZXZlciwgaWYgaXQgaXMgbGVzcywgdGhlbiBhc3NpZ24gc2FtZSB2YWx1ZSB0bwotCSAqIG1heCBjb3VudCBhcyB3ZWxsLgotCSAqLwotCWlmICh3c2FfZGV2X2NudCA8IHdzYV9tYXhfZGV2cykgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsCi0JCQkiJXM6IHdzYV9tYXhfZGV2cyA9ICVkIGNhbm5vdCBleGNlZWQgd3NhX2Rldl9jbnQgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIHdzYV9kZXZfY250KTsKLQkJd3NhX21heF9kZXZzID0gd3NhX2Rldl9jbnQ7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHByZWZpeCBzdHJpbmcgcGFzc2VkIGZvciBlYWNoIFdTQSBkZXZpY2UgKi8KLQlyZXQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkicWNvbSx3c2EtYXV4LWRldi1wcmVmaXgiKTsKLQlpZiAocmV0ICE9IHdzYV9kZXZfY250KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSIlczogZXhwZWN0aW5nICVkIHdzYSBwcmVmaXguIERlZmluZWQgb25seSAlZCBpbiBEVFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfZGV2X2NudCwgcmV0KTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyoKLQkgKiBBbGxvYyBtZW0gdG8gc3RvcmUgcGhhbmRsZSBhbmQgaW5kZXggaW5mbyBvZiBXU0EgZGV2aWNlLCBpZiBhbHJlYWR5Ci0JICogcmVnaXN0ZXJlZCB3aXRoIEFMU0EgY29yZQotCSAqLwotCXdzYTg4MXhfZGV2X2luZm8gPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgd3NhX21heF9kZXZzLAotCQkJCQlzaXplb2Yoc3RydWN0IG1zbV93c2E4ODF4X2Rldl9pbmZvKSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3c2E4ODF4X2Rldl9pbmZvKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qCi0JICogc2VhcmNoIGFuZCBjaGVjayB3aGV0aGVyIGFsbCBXU0EgZGV2aWNlcyBhcmUgYWxyZWFkeQotCSAqIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgb3Igbm90LiBJZiBmb3VuZCBhIG5vZGUsIHN0b3JlCi0JICogdGhlIG5vZGUgYW5kIHRoZSBpbmRleCBpbiBhIGxvY2FsIGFycmF5IG9mIHN0cnVjdCBmb3IgbGF0ZXIKLQkgKiB1c2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHdzYV9kZXZfY250OyBpKyspIHsKLQkJd3NhX29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkgICAgInFjb20sd3NhLWRldnMiLCBpKTsKLQkJaWYgKHVubGlrZWx5KCF3c2Ffb2Zfbm9kZSkpIHsKLQkJCS8qIHdlIHNob3VsZCBub3QgYmUgaGVyZSAqLwotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCSIlczogd3NhIGRldiBub2RlIGlzIG5vdCBwcmVzZW50XG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl9mcmVlX2Rldl9pbmZvOwotCQl9Ci0JCWlmIChzb2NfZmluZF9jb21wb25lbnQod3NhX29mX25vZGUsIE5VTEwpKSB7Ci0JCQkvKiBXU0EgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmUgKi8KLQkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLm9mX25vZGUgPSB3c2Ffb2Zfbm9kZTsKLQkJCXdzYTg4MXhfZGV2X2luZm9bZm91bmRdLmluZGV4ID0gaTsKLQkJCWZvdW5kKys7Ci0JCQlpZiAoZm91bmQgPT0gd3NhX21heF9kZXZzKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGZvdW5kIDwgd3NhX21heF9kZXZzKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwKLQkJCSIlczogZmFpbGVkIHRvIGZpbmQgJWQgY29tcG9uZW50cy4gRm91bmQgb25seSAlZFxuIiwKLQkJCV9fZnVuY19fLCB3c2FfbWF4X2RldnMsIGZvdW5kKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCWRldl9pbmZvKCZwZGV2LT5kZXYsCi0JCSIlczogZm91bmQgJWQgd3NhODgxeCBkZXZpY2VzIHJlZ2lzdGVyZWQgd2l0aCBBTFNBIGNvcmVcbiIsCi0JCV9fZnVuY19fLCBmb3VuZCk7Ci0KLQljYXJkLT5udW1fYXV4X2RldnMgPSB3c2FfbWF4X2RldnM7Ci0JY2FyZC0+bnVtX2NvbmZpZ3MgPSB3c2FfbWF4X2RldnM7Ci0KLQkvKiBBbGxvYyBhcnJheSBvZiBBVVggZGV2cyBzdHJ1Y3QgKi8KLQltc21fYXV4X2RldiA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjYXJkLT5udW1fYXV4X2RldnMsCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX3NvY19hdXhfZGV2KSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc21fYXV4X2RldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX2Rldl9pbmZvOwotCX0KLQotCS8qIEFsbG9jIGFycmF5IG9mIGNvZGVjIGNvbmYgc3RydWN0ICovCi0JbXNtX2NvZGVjX2NvbmYgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgY2FyZC0+bnVtX2F1eF9kZXZzLAotCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mKSwKLQkJCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zbV9jb2RlY19jb25mKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfYXV4X2RldjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX2F1eF9kZXZzOyBpKyspIHsKLQkJZGV2X25hbWVfc3RyID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIERFVl9OQU1FX1NUUl9MRU4sCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFkZXZfbmFtZV9zdHIpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9mcmVlX2NkY19jb25mOwotCQl9Ci0KLQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkgICAgInFjb20sd3NhLWF1eC1kZXYtcHJlZml4IiwKLQkJCQkJCSAgICB3c2E4ODF4X2Rldl9pbmZvW2ldLmluZGV4LAotCQkJCQkJICAgIHdzYV9hdXhkZXZfbmFtZV9wcmVmaXgpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIiVzOiBmYWlsZWQgdG8gcmVhZCB3c2EgYXV4IGRldiBwcmVmaXgsIHJldCA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyX2ZyZWVfZGV2X25hbWVfc3RyOwotCQl9Ci0KLQkJc25wcmludGYoZGV2X25hbWVfc3RyLCBzdHJsZW4oIndzYTg4MXguJWQiKSwgIndzYTg4MXguJWQiLCBpKTsKLQkJbXNtX2F1eF9kZXZbaV0ubmFtZSA9IGRldl9uYW1lX3N0cjsKLQkJbXNtX2F1eF9kZXZbaV0uY29kZWNfbmFtZSA9IE5VTEw7Ci0JCW1zbV9hdXhfZGV2W2ldLmNvZGVjX29mX25vZGUgPQotCQkJCQl3c2E4ODF4X2Rldl9pbmZvW2ldLm9mX25vZGU7Ci0JCW1zbV9hdXhfZGV2W2ldLmluaXQgPSBtc21fd3NhODgxeF9pbml0OwotCQltc21fY29kZWNfY29uZltpXS5kZXZfbmFtZSA9IE5VTEw7Ci0JCW1zbV9jb2RlY19jb25mW2ldLm5hbWVfcHJlZml4ID0gd3NhX2F1eGRldl9uYW1lX3ByZWZpeFswXTsKLQkJbXNtX2NvZGVjX2NvbmZbaV0ub2Zfbm9kZSA9Ci0JCQkJd3NhODgxeF9kZXZfaW5mb1tpXS5vZl9ub2RlOwotCX0KLQljYXJkLT5jb2RlY19jb25mID0gbXNtX2NvZGVjX2NvbmY7Ci0JY2FyZC0+YXV4X2RldiA9IG1zbV9hdXhfZGV2OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2Rldl9uYW1lX3N0cjoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGRldl9uYW1lX3N0cik7Ci1lcnJfZnJlZV9jZGNfY29uZjoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG1zbV9jb2RlY19jb25mKTsKLWVycl9mcmVlX2F1eF9kZXY6Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBtc21fYXV4X2Rldik7Ci1lcnJfZnJlZV9kZXZfaW5mbzoKLQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHdzYTg4MXhfZGV2X2luZm8pOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9pMnNfYXV4cGNtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm11eHNlbDsKLQlpbnQgY291bnQ7Ci0JdTMyIG1pMnNfbWFzdGVyX3NsYXZlW01JMlNfTUFYXTsKLQlpbnQgcmV0OwotCWNoYXIgKnN0cltQQ01fSTJTX1NFTF9NQVhdID0gewotCQkibHBhaWZfcHJpX21vZGVfbXV4c2VsIiwKLQkJImxwYWlmX3NlY19tb2RlX211eHNlbCIsCi0JCSJscGFpZl90ZXJ0X21vZGVfbXV4c2VsIiwKLQkJImxwYWlmX3F1YXRfbW9kZV9tdXhzZWwiCi0JfTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1JMlNfTUFYOyBjb3VudCsrKSB7Ci0JCW11dGV4X2luaXQoJm1pMnNfaW50Zl9jb25mW2NvdW50XS5sb2NrKTsKLQkJbWkyc19pbnRmX2NvbmZbY291bnRdLnJlZl9jbnQgPSAwOwotCX0KLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFVWF9QQ01fTUFYOyBjb3VudCsrKSB7Ci0JCW11dGV4X2luaXQoJmF1eHBjbV9pbnRmX2NvbmZbY291bnRdLmxvY2spOwotCQlhdXhwY21faW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKLQl9Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspIHsKLQkJbXV0ZXhfaW5pdCgmbWkyc19hdXhwY21fY29uZltjb3VudF0ubG9jayk7Ci0JCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgPSBOVUxMOwotCX0KLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFBDTV9JMlNfU0VMX01BWDsgY291bnQrKykgewotCQltdXhzZWwgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAotCQkJCQkJICAgICAgc3RyW2NvdW50XSk7Ci0JCWlmIChtdXhzZWwpIHsKLQkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIKLQkJCQk9IGlvcmVtYXAobXV4c2VsLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtdXhzZWwpKTsKLQkJfQotCX0KLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJInFjb20sbXNtLW1pMnMtbWFzdGVyIiwKLQkJCW1pMnNfbWFzdGVyX3NsYXZlLCBNSTJTX01BWCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogbm8gcWNvbSxtc20tbWkycy1tYXN0ZXIgaW4gRFQgbm9kZVxuIiwKLQkJCV9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgewotCQkJbWkyc19pbnRmX2NvbmZbY291bnRdLm1zbV9pc19taTJzX21hc3RlciA9Ci0JCQkJbWkyc19tYXN0ZXJfc2xhdmVbY291bnRdOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtc21faTJzX2F1eHBjbV9kZWluaXQodm9pZCkKLXsKLQlpbnQgY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBQQ01fSTJTX1NFTF9NQVg7IGNvdW50KyspIHsKLQkJaWYgKG1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgIT0KLQkJICAgIE5VTEwpIHsKLQkJCWlvdW5tYXAoCi0JCQltaTJzX2F1eHBjbV9jb25mW2NvdW50XS5wY21faTJzX3NlbF92dF9hZGRyKTsKLQkJCW1pMnNfYXV4cGNtX2NvbmZbY291bnRdLnBjbV9pMnNfc2VsX3Z0X2FkZHIgPSBOVUxMOwotCQl9Ci0JCW11dGV4X2Rlc3Ryb3koJm1pMnNfYXV4cGNtX2NvbmZbY291bnRdLmxvY2spOwotCX0KLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFVWF9QQ01fTUFYOyBjb3VudCsrKSB7Ci0JCW11dGV4X2Rlc3Ryb3koJmF1eHBjbV9pbnRmX2NvbmZbY291bnRdLmxvY2spOwotCQlhdXhwY21faW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKLQl9Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNSTJTX01BWDsgY291bnQrKykgewotCQltdXRleF9kZXN0cm95KCZtaTJzX2ludGZfY29uZltjb3VudF0ubG9jayk7Ci0JCW1pMnNfaW50Zl9jb25mW2NvdW50XS5yZWZfY250ID0gMDsKLQkJbWkyc19pbnRmX2NvbmZbY291bnRdLm1zbV9pc19taTJzX21hc3RlciA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1zbV9hc29jX21hY2hpbmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwotCXN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEgKnBkYXRhOwotCWNvbnN0IGNoYXIgKm1iaGNfYXVkaW9famFja190eXBlID0gTlVMTDsKLQljaGFyICptY2xrX2ZyZXFfcHJvcF9uYW1lOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCWludCByZXQ7Ci0JY29uc3QgY2hhciAqdXNiX2NfZHQgPSAicWNvbSxtc20tbWJoYy11c2JjLWF1ZGlvLXN1cHBvcnRlZCI7Ci0KLQlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIHN1cHBsaWVkIGZyb20gZGV2aWNlIHRyZWVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJc2l6ZW9mKHN0cnVjdCBtc21fYXNvY19tYWNoX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNhcmQgPSBwb3B1bGF0ZV9zbmRfY2FyZF9kYWlsaW5rcygmcGRldi0+ZGV2KTsKLQlpZiAoIWNhcmQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IENhcmQgdW5pbml0aWFsaXplZFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycjsKLQl9Ci0JY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgcGRhdGEpOwotCi0JcmV0ID0gc25kX3NvY19vZl9wYXJzZV9jYXJkX25hbWUoY2FyZCwgInFjb20sbW9kZWwiKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNlIGNhcmQgbmFtZSBmYWlsZWQsIGVycjolZFxuIiwKLQkJCXJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZyhjYXJkLCAicWNvbSxhdWRpby1yb3V0aW5nIik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwYXJzZSBhdWRpbyByb3V0aW5nIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHNkbTg0NV9hc29jX21hY2hpbmVfb2ZfbWF0Y2gsCi0JCQlwZGV2LT5kZXYub2Zfbm9kZSk7Ci0JaWYgKCFtYXRjaCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbm8gbWF0Y2hlZCBjb2RlYyBpcyBmb3VuZC5cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCW1jbGtfZnJlcV9wcm9wX25hbWUgPSAicWNvbSx0YXZpbC1tY2xrLWNsay1mcmVxIjsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJbWNsa19mcmVxX3Byb3BfbmFtZSwgJnBkYXRhLT5tY2xrX2ZyZXEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkxvb2tpbmcgdXAgJXMgcHJvcGVydHkgaW4gbm9kZSAlcyBmYWlsZWQsIGVyciVkXG4iLAotCQkJbWNsa19mcmVxX3Byb3BfbmFtZSwKLQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChwZGF0YS0+bWNsa19mcmVxICE9IENPREVDX0VYVF9DTEtfUkFURSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBtY2xrIGZyZXEgJXVcbiIsCi0JCQlwZGF0YS0+bWNsa19mcmVxKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gbXNtX3BvcHVsYXRlX2RhaV9saW5rX2NvbXBvbmVudF9vZl9ub2RlKGNhcmQpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKLQkJZ290byBlcnI7Ci0JfQotCXJldCA9IG1zbV9pbml0X3dzYV9kZXYocGRldiwgY2FyZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKLQlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpIHsKLQkJaWYgKGNvZGVjX3JlZ19kb25lKQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfSBlbHNlIGlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAoJWQpXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnI7Ci0JfQotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTb3VuZCBjYXJkICVzIHJlZ2lzdGVyZWRcbiIsIGNhcmQtPm5hbWUpOwotCXNwZGV2ID0gcGRldjsKLQotCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gYWRkIGNoaWxkIG5vZGVzLCByZXQ9JWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQl9IGVsc2UgewotCQlwZGF0YS0+aHBoX2VuMV9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsIDApOwotCQlpZiAoIXBkYXRhLT5ocGhfZW4xX2dwaW9fcCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJCSJxY29tLGhwaC1lbjEtZ3BpbyIsCi0JCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCX0KLQotCQlwZGF0YS0+aHBoX2VuMF9ncGlvX3AgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsIDApOwotCQlpZiAoIXBkYXRhLT5ocGhfZW4wX2dwaW9fcCkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJCSJxY29tLGhwaC1lbjAtZ3BpbyIsCi0JCQkJcGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwZGV2LT5kZXYub2Zfbm9kZSwKLQkJInFjb20sbWJoYy1hdWRpby1qYWNrLXR5cGUiLCAmbWJoY19hdWRpb19qYWNrX3R5cGUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiTG9va2luZyB1cCAlcyBwcm9wZXJ0eSBpbiBub2RlICVzIGZhaWxlZCIsCi0JCQkicWNvbSxtYmhjLWF1ZGlvLWphY2stdHlwZSIsCi0JCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiSmFjayB0eXBlIHByb3BlcnRpZXMgc2V0IHRvIGRlZmF1bHQiKTsKLQl9IGVsc2UgewotCQlpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjQtcG9sZS1qYWNrIikpIHsKLQkJCXdjZF9tYmhjX2NmZy5lbmFibGVfYW5jX21pY19kZXRlY3QgPSBmYWxzZTsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwgIlRoaXMgaGFyZHdhcmUgaGFzIDQgcG9sZSBqYWNrIik7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChtYmhjX2F1ZGlvX2phY2tfdHlwZSwgIjUtcG9sZS1qYWNrIikpIHsKLQkJCXdjZF9tYmhjX2NmZy5lbmFibGVfYW5jX21pY19kZXRlY3QgPSB0cnVlOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVGhpcyBoYXJkd2FyZSBoYXMgNSBwb2xlIGphY2siKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKG1iaGNfYXVkaW9famFja190eXBlLCAiNi1wb2xlLWphY2siKSkgewotCQkJd2NkX21iaGNfY2ZnLmVuYWJsZV9hbmNfbWljX2RldGVjdCA9IHRydWU7Ci0JCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJUaGlzIGhhcmR3YXJlIGhhcyA2IHBvbGUgamFjayIpOwotCQl9IGVsc2UgewotCQkJd2NkX21iaGNfY2ZnLmVuYWJsZV9hbmNfbWljX2RldGVjdCA9IGZhbHNlOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiVW5rbm93biB2YWx1ZSwgc2V0IHRvIGRlZmF1bHQiKTsKLQkJfQotCX0KLQkvKgotCSAqIFBhcnNlIFVTLUV1cm8gZ3BpbyBpbmZvIGZyb20gRFQuIFJlcG9ydCBubyBlcnJvciBpZiB1cy1ldXJvCi0JICogZW50cnkgaXMgbm90IGZvdW5kIGluIERUIGZpbGUgYXMgc29tZSB0YXJnZXRzIGRvIG5vdCBzdXBwb3J0Ci0JICogVVMtRXVybyBkZXRlY3Rpb24KLQkgKi8KLQlwZGF0YS0+dXNfZXVyb19ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSkKLQkJcGRhdGEtPnVzX2V1cm9fZ3Bpb19wID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIDApOwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+dXNfZXVyb19ncGlvKSAmJiAoIXBkYXRhLT51c19ldXJvX2dwaW9fcCkpIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvcGVydHkgJXMgbm90IGRldGVjdGVkIGluIG5vZGUgJXMiLAotCQkJInFjb20sdXMtZXVyby1ncGlvcyIsIHBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGRldGVjdGVkIiwKLQkJCSJxY29tLHVzLWV1cm8tZ3Bpb3MiKTsKLQkJd2NkX21iaGNfY2ZnLnN3YXBfZ25kX21pYyA9IG1zbV9zd2FwX2duZF9taWM7Ci0JfQotCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsIHVzYl9jX2R0LCBOVUxMKSkKLQkJd2NkX21iaGNfY2ZnLnN3YXBfZ25kX21pYyA9IG1zbV9zd2FwX2duZF9taWM7Ci0KLQlyZXQgPSBtc21fcHJlcGFyZV91c19ldXJvKGNhcmQpOwotCWlmIChyZXQpCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIm1zbV9wcmVwYXJlX3VzX2V1cm8gZmFpbGVkICglZClcbiIsCi0JCQlyZXQpOwotCi0JLyogUGFyc2UgcGluY3RybCBpbmZvIGZyb20gZGV2aWNldHJlZSAqLwotCXJldCA9IG1zbV9nZXRfcGluY3RybChwZGV2KTsKLQlpZiAoIXJldCkgewotCQlwcl9kZWJ1ZygiJXM6IHBpbmN0cmwgcGFyc2luZyBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZygmcGRldi0+ZGV2LAotCQkJIiVzOiBQYXJzaW5nIHBpbmN0cmwgZmFpbGVkIHdpdGggJWQuIENhbm5vdCB1c2UgUG9ydHNcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gMDsKLQl9Ci0KLQltc21faTJzX2F1eHBjbV9pbml0KHBkZXYpOwotCi0JaXNfaW5pdGlhbF9ib290ID0gdHJ1ZTsKLQlyZXQgPSBhdWRpb19ub3RpZmllcl9yZWdpc3Rlcigic2RtODQ1IiwgQVVESU9fTk9USUZJRVJfQURTUF9ET01BSU4sCi0JCQkJICAgICAgJnNlcnZpY2VfbmIpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoIiVzOiBBdWRpbyBub3RpZmllciByZWdpc3RlciBmYWlsZWQgcmV0ID0gJWRcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiAwOwotZXJyOgotCW1zbV9yZWxlYXNlX3BpbmN0cmwocGRldik7Ci0JZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBwZGF0YSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtc21fYXNvY19tYWNoaW5lX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXNtX2Fzb2NfbWFjaF9kYXRhICpwZGF0YSA9Ci0JCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCi0JaWYgKHBkYXRhLT51c19ldXJvX2dwaW8gPiAwKSB7Ci0JCWdwaW9fZnJlZShwZGF0YS0+dXNfZXVyb19ncGlvKTsKLQkJcGRhdGEtPnVzX2V1cm9fZ3BpbyA9IDA7Ci0JfQotCW1zbV9pMnNfYXV4cGNtX2RlaW5pdCgpOwotCi0JbXNtX3JlbGVhc2VfcGluY3RybChwZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKLQlhdWRpb19ub3RpZmllcl9kZXJlZ2lzdGVyKCJzZG04NDUiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RtODQ1X2Fzb2NfbWFjaGluZV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBEUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5wbSA9ICZzbmRfc29jX3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlID0gc2RtODQ1X2Fzb2NfbWFjaGluZV9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IG1zbV9hc29jX21hY2hpbmVfcHJvYmUsCi0JLnJlbW92ZSA9IG1zbV9hc29jX21hY2hpbmVfcmVtb3ZlLAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2RtODQ1X2Fzb2NfbWFjaGluZV9kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIG1zbSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkbTg0NV9hc29jX21hY2hpbmVfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1wY20uYyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKaW5kZXggYmU2MjkwZC4uYmQ4ZjM0YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0yMTIsNiArMjEyLDcgQEAKIAkJCXByX2RlYnVnKCIlcyBEb24ndCBjbG9zZSBCRVxuIiwgX19mdW5jX18pOwogCQkJY29udGludWU7CiAJCX0KKwogCQlzbmRfc29jX2RhcG1fc3RyZWFtX2V2ZW50KGJlLCBkaXIsIGV2ZW50KTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9lbmRwb2ludC5jIGIvc291bmQvdXNiL2VuZHBvaW50LmMKaW5kZXggNzBlMTQ3Ny4uNmJkNDI0YiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2VuZHBvaW50LmMKKysrIGIvc291bmQvdXNiL2VuZHBvaW50LmMKQEAgLTM4NCw2ICszODQsOSBAQAogCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmZXAtPmNoaXAtPnNodXRkb3duKSkpCiAJCWdvdG8gZXhpdF9jbGVhcjsKIAorCWlmICh1bmxpa2VseSghdGVzdF9iaXQoRVBfRkxBR19SVU5OSU5HLCAmZXAtPmZsYWdzKSkpCisJCWdvdG8gZXhpdF9jbGVhcjsKKwogCWlmICh1c2JfcGlwZW91dChlcC0+cGlwZSkpIHsKIAkJcmV0aXJlX291dGJvdW5kX3VyYihlcCwgY3R4KTsKIAkJLyogY2FuIGJlIHN0b3BwZWQgZHVyaW5nIHJldGlyZSBjYWxsYmFjayAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyLmMgYi9zb3VuZC91c2IvbWl4ZXIuYwppbmRleCA5ZTc4NjFhLi42YzNkNjJmIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXIuYworKysgYi9zb3VuZC91c2IvbWl4ZXIuYwpAQCAtNTU0LDYgKzU1NCw4IEBACiAKIAlpZiAoc2l6ZSA8IHNpemVvZihzY2FsZSkpCiAJCXJldHVybiAtRU5PTUVNOworCWlmIChjdmFsLT5taW5fbXV0ZSkKKwkJc2NhbGVbMF0gPSBTTkRSVl9DVExfVExWVF9EQl9NSU5NQVhfTVVURTsKIAlzY2FsZVsyXSA9IGN2YWwtPmRCbWluOwogCXNjYWxlWzNdID0gY3ZhbC0+ZEJtYXg7CiAJaWYgKGNvcHlfdG9fdXNlcihfdGx2LCBzY2FsZSwgc2l6ZW9mKHNjYWxlKSkpCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuaCBiL3NvdW5kL3VzYi9taXhlci5oCmluZGV4IDM0MTdlZjMuLjJiNGIwNjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5oCisrKyBiL3NvdW5kL3VzYi9taXhlci5oCkBAIC02NCw2ICs2NCw3IEBACiAJaW50IGNhY2hlZDsKIAlpbnQgY2FjaGVfdmFsW01BWF9DSEFOTkVMU107CiAJdTggaW5pdGlhbGl6ZWQ7CisJdTggbWluX211dGU7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCmluZGV4IDA0OTkxYjAuLjVkMmZjNWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYworKysgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKQEAgLTE4NzMsNiArMTg3MywxMiBAQAogCQlpZiAodW5pdGlkID09IDcgJiYgY3ZhbC0+Y29udHJvbCA9PSBVQUNfRlVfVk9MVU1FKQogCQkJc25kX2RyYWdvbmZseV9xdWlya19kYl9zY2FsZShtaXhlciwgY3ZhbCwga2N0bCk7CiAJCWJyZWFrOworCS8qIGxvd2VzdCBwbGF5YmFjayB2YWx1ZSBpcyBtdXRlZCBvbiBDLU1lZGlhIGRldmljZXMgKi8KKwljYXNlIFVTQl9JRCgweDBkOGMsIDB4MDAwYyk6CisJY2FzZSBVU0JfSUQoMHgwZDhjLCAweDAwMTQpOgorCQlpZiAoc3Ryc3RyKGtjdGwtPmlkLm5hbWUsICJQbGF5YmFjayIpKQorCQkJY3ZhbC0+bWluX211dGUgPSAxOworCQlicmVhazsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9wY20uYyBiL3NvdW5kL3VzYi9wY20uYwppbmRleCA4Mjc5MDA5Li5kZDgxNTc0IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmMKKysrIGIvc291bmQvdXNiL3BjbS5jCkBAIC0zOSw2ICszOSw4IEBACiAjZGVmaW5lIFNVQlNUUkVBTV9GTEFHX0RBVEFfRVBfU1RBUlRFRAkwCiAjZGVmaW5lIFNVQlNUUkVBTV9GTEFHX1NZTkNfRVBfU1RBUlRFRAkxCiAKKyNkZWZpbmUgTUFYX1NFVEFMVF9USU1FT1VUX01TIDEwMDAKKwogLyogcmV0dXJuIHRoZSBlc3RpbWF0ZWQgZGVsYXkgYmFzZWQgb24gVVNCIGZyYW1lIGNvdW50ZXJzICovCiBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfdXNiX3BjbV9kZWxheShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCiAJCQkJICAgIHVuc2lnbmVkIGludCByYXRlKQpAQCAtNTA4LDcgKzUxMCw4IEBACiAKIAkvKiBjbG9zZSB0aGUgb2xkIGludGVyZmFjZSAqLwogCWlmIChzdWJzLT5pbnRlcmZhY2UgPj0gMCAmJiBzdWJzLT5pbnRlcmZhY2UgIT0gZm10LT5pZmFjZSkgewotCQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShzdWJzLT5kZXYsIHN1YnMtPmludGVyZmFjZSwgMCk7CisJCWVyciA9IHVzYl9zZXRfaW50ZXJmYWNlX3RpbWVvdXQoc3Vicy0+ZGV2LCBzdWJzLT5pbnRlcmZhY2UsIDAsCisJCQlNQVhfU0VUQUxUX1RJTUVPVVRfTVMpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZGV2X2VycigmZGV2LT5kZXYsCiAJCQkJIiVkOiVkOiByZXR1cm4gdG8gc2V0dGluZyAwIGZhaWxlZCAoJWQpXG4iLApAQCAtNTI3LDcgKzUzMCw4IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAKLQkJZXJyID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LCBmbXQtPmlmYWNlLCBmbXQtPmFsdHNldHRpbmcpOworCQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZV90aW1lb3V0KGRldiwgZm10LT5pZmFjZSwKKwkJCQlmbXQtPmFsdHNldHRpbmcsIE1BWF9TRVRBTFRfVElNRU9VVF9NUyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlkZXZfZXJyKCZkZXYtPmRldiwKIAkJCQkiJWQ6JWQ6IHVzYl9zZXRfaW50ZXJmYWNlIGZhaWxlZCAoJWQpXG4iLApAQCAtNTc0LDcgKzU3OCw4IEBACiAKIAlpZiAoIWVuYWJsZSkgewogCQlpZiAoc3Vicy0+aW50ZXJmYWNlID49IDApIHsKLQkJCXVzYl9zZXRfaW50ZXJmYWNlKHN1YnMtPmRldiwgc3Vicy0+aW50ZXJmYWNlLCAwKTsKKwkJCXVzYl9zZXRfaW50ZXJmYWNlX3RpbWVvdXQoc3Vicy0+ZGV2LCBzdWJzLT5pbnRlcmZhY2UsIDAsCisJCQkJTUFYX1NFVEFMVF9USU1FT1VUX01TKTsKIAkJCXN1YnMtPmFsdHNldF9pZHggPSAwOwogCQkJc3Vicy0+aW50ZXJmYWNlID0gLTE7CiAJCQlzdWJzLT5jdXJfYXVkaW9mbXQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3F1aXJrcy5jIGIvc291bmQvdXNiL3F1aXJrcy5jCmluZGV4IGViNGI5ZjcuLjI4NmVmYzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9xdWlya3MuYworKysgYi9zb3VuZC91c2IvcXVpcmtzLmMKQEAgLTExNDIsNiArMTE0Miw3IEBACiAJY2FzZSBVU0JfSUQoMHgwNTU2LCAweDAwMTQpOiAvKiBQaG9lbml4IEF1ZGlvIFRNWDMyMFZDICovCiAJY2FzZSBVU0JfSUQoMHgwNUEzLCAweDk0MjApOiAvKiBFTFAgSEQgVVNCIENhbWVyYSAqLwogCWNhc2UgVVNCX0lEKDB4MDc0RCwgMHgzNTUzKTogLyogT3V0bGF3IFJSMjE1MCAoTWljcm9uYXMgVUFDMzU1M0IpICovCisJY2FzZSBVU0JfSUQoMHgxMzk1LCAweDc0MGEpOiAvKiBTZW5uaGVpc2VyIERFQ1QgKi8KIAljYXNlIFVTQl9JRCgweDE5MDEsIDB4MDE5MSk6IC8qIEdFIEI4NTBWMyBDUDIxMTQgYXVkaW8gaW50ZXJmYWNlICovCiAJY2FzZSBVU0JfSUQoMHgxZGU3LCAweDAwMTMpOiAvKiBQaG9lbml4IEF1ZGlvIE1UMjAyZXhlICovCiAJY2FzZSBVU0JfSUQoMHgxZGU3LCAweDAwMTQpOiAvKiBQaG9lbml4IEF1ZGlvIFRNWDMyMCAqLwpAQCAtMTMwOCwxMCArMTMwOSwxMyBAQAogCSAgICAmJiAocmVxdWVzdHR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9DTEFTUykKIAkJbWRlbGF5KDIwKTsKIAotCS8qIFpvb20gUjE2LzI0IG5lZWRzIGEgdGlueSBkZWxheSBoZXJlLCBvdGhlcndpc2UgcmVxdWVzdHMgbGlrZQotCSAqIGdldC9zZXQgZnJlcXVlbmN5IHJldHVybiBhcyBmYWlsZWQgZGVzcGl0ZSBhY3R1YWxseSBzdWNjZWVkaW5nLgorCS8qIFpvb20gUjE2LzI0LCBMb2dpdGVjaCBINjUwZSwgSmFicmEgNTUwYSBuZWVkcyBhIHRpbnkgZGVsYXkgaGVyZSwKKwkgKiBvdGhlcndpc2UgcmVxdWVzdHMgbGlrZSBnZXQvc2V0IGZyZXF1ZW5jeSByZXR1cm4gYXMgZmFpbGVkIGRlc3BpdGUKKwkgKiBhY3R1YWxseSBzdWNjZWVkaW5nLgogCSAqLwotCWlmIChjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MTY4NiwgMHgwMGRkKSAmJgorCWlmICgoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDE2ODYsIDB4MDBkZCkgfHwKKwkgICAgIGNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNDZkLCAweDBhNDYpIHx8CisJICAgICBjaGlwLT51c2JfaWQgPT0gVVNCX0lEKDB4MGIwZSwgMHgwMzQ5KSkgJiYKIAkgICAgKHJlcXVlc3R0eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MpCiAJCW1kZWxheSgxKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JfYXVkaW9fcW1pX3N2Yy5jIGIvc291bmQvdXNiL3VzYl9hdWRpb19xbWlfc3ZjLmMKaW5kZXggODAxNTA4Yy4uZWJjMDgxZiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYl9hdWRpb19xbWlfc3ZjLmMKKysrIGIvc291bmQvdXNiL3VzYl9hdWRpb19xbWlfc3ZjLmMKQEAgLTQ1LDggKzQ1LDcgQEAKIC8qICBldmVudCByaW5nIGlvdmEgYmFzZSBhZGRyZXNzICovCiAjZGVmaW5lIElPVkFfQkFTRSAweDEwMDAKIAotI2RlZmluZSBJT1ZBX0RDQkFfQkFTRSAweDIwMDAKLSNkZWZpbmUgSU9WQV9YRkVSX1JJTkdfQkFTRSAoSU9WQV9EQ0JBX0JBU0UgKyBQQUdFX1NJWkUgKiAoU05EUlZfQ0FSRFMgKyAxKSkKKyNkZWZpbmUgSU9WQV9YRkVSX1JJTkdfQkFTRSAoSU9WQV9CQVNFICsgUEFHRV9TSVpFICogKFNORFJWX0NBUkRTICsgMSkpCiAjZGVmaW5lIElPVkFfWEZFUl9CVUZfQkFTRSAoSU9WQV9YRkVSX1JJTkdfQkFTRSArIFBBR0VfU0laRSAqIFNORFJWX0NBUkRTICogMzIpCiAjZGVmaW5lIElPVkFfWEZFUl9SSU5HX01BWCAoSU9WQV9YRkVSX0JVRl9CQVNFIC0gUEFHRV9TSVpFKQogI2RlZmluZSBJT1ZBX1hGRVJfQlVGX01BWCAoMHhmZmZmZjAwMCAtIFBBR0VfU0laRSkKQEAgLTgzLDggKzgyLDYgQEAKIAl1bnNpZ25lZCBpbnQgY2FyZF9udW07CiAJYXRvbWljX3QgaW5fdXNlOwogCXN0cnVjdCBrcmVmIGtyZWY7Ci0JdW5zaWduZWQgbG9uZyBkY2JhX2lvdmE7Ci0Jc2l6ZV90IGRjYmFfc2l6ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkaXNjb25uZWN0X3dxOwogCiAJLyogaW50ZXJmYWNlIHNwZWNpZmljICovCkBAIC0xMDEsOSArOTgsNiBAQAogCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbjsKIAogCS8qIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBhdmFpbGFibGUgaW92YSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZGNiYV9saXN0OwotCXNpemVfdCBkY2JhX2lvdmFfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGN1cnJfZGNiYV9pb3ZhOwogCXN0cnVjdCBsaXN0X2hlYWQgeGZlcl9yaW5nX2xpc3Q7CiAJc2l6ZV90IHhmZXJfcmluZ19pb3ZhX3NpemU7CiAJdW5zaWduZWQgbG9uZyBjdXJyX3hmZXJfcmluZ19pb3ZhOwpAQCAtMTUwLDcgKzE0NCw2IEBACiAKIGVudW0gbWVtX3R5cGUgewogCU1FTV9FVkVOVF9SSU5HLAotCU1FTV9EQ0JBLAogCU1FTV9YRkVSX1JJTkcsCiAJTUVNX1hGRVJfQlVGLAogfTsKQEAgLTE3Niw2ICsxNjksMjQgQEAKIAlVU0JfUU1JX1BDTV9GT1JNQVRfVTMyX0JFLAogfTsKIAorc3RhdGljIGVudW0gdXNiX2F1ZGlvX2RldmljZV9zcGVlZF9lbnVtX3YwMQorZ2V0X3NwZWVkX2luZm8oZW51bSB1c2JfZGV2aWNlX3NwZWVkIHVkZXZfc3BlZWQpCit7CisJc3dpdGNoICh1ZGV2X3NwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQlyZXR1cm4gVVNCX0FVRElPX0RFVklDRV9TUEVFRF9MT1dfVjAxOworCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCXJldHVybiBVU0JfQVVESU9fREVWSUNFX1NQRUVEX0ZVTExfVjAxOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCXJldHVybiBVU0JfQVVESU9fREVWSUNFX1NQRUVEX0hJR0hfVjAxOworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQlyZXR1cm4gVVNCX0FVRElPX0RFVklDRV9TUEVFRF9TVVBFUl9WMDE7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCIlczogdWRldiBzcGVlZCAlZFxuIiwgX19mdW5jX18sIHVkZXZfc3BlZWQpOworCQlyZXR1cm4gVVNCX0FVRElPX0RFVklDRV9TUEVFRF9JTlZBTElEX1YwMTsKKwl9Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHVhdWRpb19nZXRfaW92YSh1bnNpZ25lZCBsb25nICpjdXJyX2lvdmEsCiAJc2l6ZV90ICpjdXJyX2lvdmFfc2l6ZSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc2l6ZV90IHNpemUpCiB7CkBAIC0yNzUsMTAgKzI4Niw2IEBACiAJCWlmICh1YXVkaW9fcWRldi0+ZXJfcGh5c19hZGRyID09IHBhKQogCQkJbWFwID0gZmFsc2U7CiAJCWJyZWFrOwotCWNhc2UgTUVNX0RDQkE6Ci0JCXZhID0gdWF1ZGlvX2dldF9pb3ZhKCZ1YXVkaW9fcWRldi0+Y3Vycl9kY2JhX2lvdmEsCi0JCSZ1YXVkaW9fcWRldi0+ZGNiYV9pb3ZhX3NpemUsICZ1YXVkaW9fcWRldi0+ZGNiYV9saXN0LCBzaXplKTsKLQkJYnJlYWs7CiAJY2FzZSBNRU1fWEZFUl9SSU5HOgogCQl2YSA9IHVhdWRpb19nZXRfaW92YSgmdWF1ZGlvX3FkZXYtPmN1cnJfeGZlcl9yaW5nX2lvdmEsCiAJCSZ1YXVkaW9fcWRldi0+eGZlcl9yaW5nX2lvdmFfc2l6ZSwgJnVhdWRpb19xZGV2LT54ZmVyX3JpbmdfbGlzdCwKQEAgLTM2MywxMCArMzcwLDcgQEAKIAkJZWxzZQogCQkJdW5tYXAgPSBmYWxzZTsKIAkJYnJlYWs7Ci0JY2FzZSBNRU1fRENCQToKLQkJdWF1ZGlvX3B1dF9pb3ZhKHZhLCBzaXplLCAmdWF1ZGlvX3FkZXYtPmRjYmFfbGlzdCwKLQkJJnVhdWRpb19xZGV2LT5kY2JhX2lvdmFfc2l6ZSk7Ci0JCWJyZWFrOworCiAJY2FzZSBNRU1fWEZFUl9SSU5HOgogCQl1YXVkaW9fcHV0X2lvdmEodmEsIHNpemUsICZ1YXVkaW9fcWRldi0+eGZlcl9yaW5nX2xpc3QsCiAJCSZ1YXVkaW9fcWRldi0+eGZlcl9yaW5nX2lvdmFfc2l6ZSk7CkBAIC00MDcsMTAgKzQxMSwxMiBAQAogCWludCBwcm90b2NvbCwgY2FyZF9udW0sIHBjbV9kZXZfbnVtOwogCXZvaWQgKmhkcl9wdHI7CiAJdTggKnhmZXJfYnVmOwotCXUzMiBsZW4sIG11bHQsIHJlbWFpbmRlciwgeGZlcl9idWZfbGVuOwotCXVuc2lnbmVkIGxvbmcgdmEsIHRyX2RhdGFfdmEgPSAwLCB0cl9zeW5jX3ZhID0gMCwgZGNiYV92YSA9IDAsCi0JeGZlcl9idWZfdmEgPSAwOwotCXBoeXNfYWRkcl90IHhoY2lfcGEsIHhmZXJfYnVmX3BhOworCXUzMiBsZW4sIG11bHQsIHJlbWFpbmRlciwgeGZlcl9idWZfbGVuLCBzZ19sZW4sIGksIHRvdGFsX2xlbiA9IDA7CisJdW5zaWduZWQgbG9uZyB2YSwgdmFfc2csIHRyX2RhdGFfdmEgPSAwLCB0cl9zeW5jX3ZhID0gMDsKKwlwaHlzX2FkZHJfdCB4aGNpX3BhLCB4ZmVyX2J1Zl9wYSwgdHJfZGF0YV9wYSA9IDAsIHRyX3N5bmNfcGEgPSAwOworCWRtYV9hZGRyX3QgZG1hOworCXN0cnVjdCBzZ190YWJsZSBzZ3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAogCWlmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHN1YnMtPmRldiwgc3Vicy0+aW50ZXJmYWNlKTsKIAlpZiAoIWlmYWNlKSB7CkBAIC01MjQsMTMgKzUzMCwxMyBAQAogCW1lbWNweSgmcmVzcC0+c3RkX2FzX2RhdGFfZXBfZGVzYywgJmVwLT5kZXNjLCBzaXplb2YoZXAtPmRlc2MpKTsKIAlyZXNwLT5zdGRfYXNfZGF0YV9lcF9kZXNjX3ZhbGlkID0gMTsKIAotCXhoY2lfcGEgPSB1c2JfZ2V0X3hmZXJfcmluZ19kbWFfYWRkcihzdWJzLT5kZXYsIGVwKTsKLQlpZiAoIXhoY2lfcGEpIHsKKwl0cl9kYXRhX3BhID0gdXNiX2dldF94ZmVyX3JpbmdfcGh5c19hZGRyKHN1YnMtPmRldiwgZXAsICZkbWEpOworCWlmICghdHJfZGF0YV9wYSkgewogCQlwcl9lcnIoIiVzOmZhaWxlZCB0byBnZXQgZGF0YSBlcCByaW5nIGRtYSBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gZXJyOwogCX0KIAotCXJlc3AtPnhoY2lfbWVtX2luZm8udHJfZGF0YS5wYSA9IHhoY2lfcGE7CisJcmVzcC0+eGhjaV9tZW1faW5mby50cl9kYXRhLnBhID0gZG1hOwogCiAJaWYgKHN1YnMtPnN5bmNfZW5kcG9pbnQpIHsKIAkJZXAgPSB1c2JfcGlwZV9lbmRwb2ludChzdWJzLT5kZXYsIHN1YnMtPnN5bmNfZW5kcG9pbnQtPnBpcGUpOwpAQCAtNTQxLDE5ICs1NDcsMjYgQEAKIAkJbWVtY3B5KCZyZXNwLT5zdGRfYXNfc3luY19lcF9kZXNjLCAmZXAtPmRlc2MsIHNpemVvZihlcC0+ZGVzYykpOwogCQlyZXNwLT5zdGRfYXNfc3luY19lcF9kZXNjX3ZhbGlkID0gMTsKIAotCQl4aGNpX3BhID0gdXNiX2dldF94ZmVyX3JpbmdfZG1hX2FkZHIoc3Vicy0+ZGV2LCBlcCk7Ci0JCWlmICgheGhjaV9wYSkgeworCQl0cl9zeW5jX3BhID0gdXNiX2dldF94ZmVyX3JpbmdfcGh5c19hZGRyKHN1YnMtPmRldiwgZXAsICZkbWEpOworCQlpZiAoIXRyX3N5bmNfcGEpIHsKIAkJCXByX2VycigiJXM6ZmFpbGVkIHRvIGdldCBzeW5jIGVwIHJpbmcgZG1hIGFkZHJlc3NcbiIsCiAJCQkJX19mdW5jX18pOwogCQkJZ290byBlcnI7CiAJCX0KLQkJcmVzcC0+eGhjaV9tZW1faW5mby50cl9zeW5jLnBhID0geGhjaV9wYTsKKwkJcmVzcC0+eGhjaV9tZW1faW5mby50cl9zeW5jLnBhID0gZG1hOwogCX0KIAogc2tpcF9zeW5jX2VwOgogCXJlc3AtPmludGVycnVwdGVyX251bSA9IHVhdWRpb19xZGV2LT5pbnRyX251bTsKIAlyZXNwLT5pbnRlcnJ1cHRlcl9udW1fdmFsaWQgPSAxOwogCisJcmV0ID0gdXNiX2dldF9jb250cm9sbGVyX2lkKHN1YnMtPmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJcmVzcC0+Y29udHJvbGxlcl9udW0gPSAgcmV0OworCXJlc3AtPmNvbnRyb2xsZXJfbnVtX3ZhbGlkID0gMTsKKwogCS8qICBtYXAgeGhjaSBkYXRhIHN0cnVjdHVyZXMgUEEgbWVtb3J5IHRvIGlvdmEgKi8KIAogCS8qIGV2ZW50IHJpbmcgKi8KQEAgLTU2Myw4ICs1NzYsOCBAQAogCQkJcmV0KTsKIAkJZ290byBlcnI7CiAJfQotCXhoY2lfcGEgPSB1c2JfZ2V0X3NlY19ldmVudF9yaW5nX2RtYV9hZGRyKHN1YnMtPmRldiwKLQkJCXJlc3AtPmludGVycnVwdGVyX251bSk7CisJeGhjaV9wYSA9IHVzYl9nZXRfc2VjX2V2ZW50X3JpbmdfcGh5c19hZGRyKHN1YnMtPmRldiwKKwkJCXJlc3AtPmludGVycnVwdGVyX251bSwgJmRtYSk7CiAJaWYgKCF4aGNpX3BhKSB7CiAJCXByX2VycigiJXM6IGZhaWxlZCB0byBnZXQgc2VjIGV2ZW50IHJpbmcgZG1hIGFkZHJlc3NcbiIsCiAJCV9fZnVuY19fKTsKQEAgLTU3NywzNyArNTkwLDIwIEBACiAKIAlyZXNwLT54aGNpX21lbV9pbmZvLmV2dF9yaW5nLnZhID0gUFJFUEVORF9TSURfVE9fSU9WQSh2YSwKIAkJCQkJCXVhdWRpb19xZGV2LT5zaWQpOwotCXJlc3AtPnhoY2lfbWVtX2luZm8uZXZ0X3JpbmcucGEgPSB4aGNpX3BhOworCXJlc3AtPnhoY2lfbWVtX2luZm8uZXZ0X3JpbmcucGEgPSBkbWE7CiAJcmVzcC0+eGhjaV9tZW1faW5mby5ldnRfcmluZy5zaXplID0gUEFHRV9TSVpFOwogCXVhdWRpb19xZGV2LT5lcl9waHlzX2FkZHIgPSB4aGNpX3BhOwogCi0JLyogZGNiYSAqLwotCXhoY2lfcGEgPSB1c2JfZ2V0X2RjYmFfZG1hX2FkZHIoc3Vicy0+ZGV2KTsKLQlpZiAoIXhoY2lfcGEpIHsKLQkJcHJfZXJyKCIlczpmYWlsZWQgdG8gZ2V0IGRjYmEgZG1hIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKKwlyZXNwLT5zcGVlZF9pbmZvID0gZ2V0X3NwZWVkX2luZm8oc3Vicy0+ZGV2LT5zcGVlZCk7CisJaWYgKHJlc3AtPnNwZWVkX2luZm8gPT0gVVNCX0FVRElPX0RFVklDRV9TUEVFRF9JTlZBTElEX1YwMSkKIAkJZ290byB1bm1hcF9lcjsKLQl9CiAKLQlpZiAoIXVhZGV2W2NhcmRfbnVtXS5kY2JhX2lvdmEpIHsgLyogbWFwcHBlZCBwZXIgdXNiIGRldmljZSAqLwotCQl2YSA9IHVhdWRpb19pb21tdV9tYXAoTUVNX0RDQkEsIHhoY2lfcGEsIFBBR0VfU0laRSk7Ci0JCWlmICghdmEpCi0JCQlnb3RvIHVubWFwX2VyOwotCi0JCXVhZGV2W2NhcmRfbnVtXS5kY2JhX2lvdmEgPSB2YTsKLQkJdWFkZXZbY2FyZF9udW1dLmRjYmFfc2l6ZSA9IFBBR0VfU0laRTsKLQl9Ci0KLQlkY2JhX3ZhID0gdWFkZXZbY2FyZF9udW1dLmRjYmFfaW92YTsKLQlyZXNwLT54aGNpX21lbV9pbmZvLmRjYmEudmEgPSBQUkVQRU5EX1NJRF9UT19JT1ZBKGRjYmFfdmEsCi0JCQkJCQl1YXVkaW9fcWRldi0+c2lkKTsKLQlyZXNwLT54aGNpX21lbV9pbmZvLmRjYmEucGEgPSB4aGNpX3BhOwotCXJlc3AtPnhoY2lfbWVtX2luZm8uZGNiYS5zaXplID0gUEFHRV9TSVpFOworCXJlc3AtPnNwZWVkX2luZm9fdmFsaWQgPSAxOwogCiAJLyogZGF0YSB0cmFuc2ZlciByaW5nICovCi0JeGhjaV9wYSA9IHJlc3AtPnhoY2lfbWVtX2luZm8udHJfZGF0YS5wYTsKLQl2YSA9IHVhdWRpb19pb21tdV9tYXAoTUVNX1hGRVJfUklORywgeGhjaV9wYSwgUEFHRV9TSVpFKTsKKwl2YSA9IHVhdWRpb19pb21tdV9tYXAoTUVNX1hGRVJfUklORywgdHJfZGF0YV9wYSwgUEFHRV9TSVpFKTsKIAlpZiAoIXZhKQotCQlnb3RvIHVubWFwX2RjYmE7CisJCWdvdG8gdW5tYXBfZXI7CiAKIAl0cl9kYXRhX3ZhID0gdmE7CiAJcmVzcC0+eGhjaV9tZW1faW5mby50cl9kYXRhLnZhID0gUFJFUEVORF9TSURfVE9fSU9WQSh2YSwKQEAgLTYxOSw3ICs2MTUsNyBAQAogCQlnb3RvIHNraXBfc3luYzsKIAogCXhoY2lfcGEgPSByZXNwLT54aGNpX21lbV9pbmZvLnRyX3N5bmMucGE7Ci0JdmEgPSB1YXVkaW9faW9tbXVfbWFwKE1FTV9YRkVSX1JJTkcsIHhoY2lfcGEsIFBBR0VfU0laRSk7CisJdmEgPSB1YXVkaW9faW9tbXVfbWFwKE1FTV9YRkVSX1JJTkcsIHRyX3N5bmNfcGEsIFBBR0VfU0laRSk7CiAJaWYgKCF2YSkKIAkJZ290byB1bm1hcF9kYXRhOwogCkBAIC02NDgsMTkgKzY0NCwzMyBAQAogCWlmICgheGZlcl9idWYpCiAJCWdvdG8gdW5tYXBfc3luYzsKIAorCWRtYV9nZXRfc2d0YWJsZShzdWJzLT5kZXYtPmJ1cy0+c3lzZGV2LCAmc2d0LCB4ZmVyX2J1ZiwgeGZlcl9idWZfcGEsCisJCQlsZW4pOworCisJdmEgPSAwOworCWZvcl9lYWNoX3NnKHNndC5zZ2wsIHNnLCBzZ3QubmVudHMsIGkpIHsKKwkJc2dfbGVuID0gUEFHRV9BTElHTihzZy0+b2Zmc2V0ICsgc2ctPmxlbmd0aCk7CisJCXZhX3NnID0gdWF1ZGlvX2lvbW11X21hcChNRU1fWEZFUl9CVUYsCisJCQlwYWdlX3RvX3BoeXMoc2dfcGFnZShzZykpLCBzZ19sZW4pOworCQlpZiAoIXZhX3NnKQorCQkJZ290byB1bm1hcF94ZmVyX2J1ZjsKKworCQlpZiAoIXZhKQorCQkJdmEgPSB2YV9zZzsKKworCQl0b3RhbF9sZW4gKz0gc2dfbGVuOworCX0KKwogCXJlc3AtPnhoY2lfbWVtX2luZm8ueGZlcl9idWZmLnBhID0geGZlcl9idWZfcGE7CiAJcmVzcC0+eGhjaV9tZW1faW5mby54ZmVyX2J1ZmYuc2l6ZSA9IGxlbjsKIAotCXZhID0gdWF1ZGlvX2lvbW11X21hcChNRU1fWEZFUl9CVUYsIHhmZXJfYnVmX3BhLCBsZW4pOwotCWlmICghdmEpCi0JCWdvdG8gdW5tYXBfc3luYzsKLQotCXhmZXJfYnVmX3ZhID0gdmE7CiAJcmVzcC0+eGhjaV9tZW1faW5mby54ZmVyX2J1ZmYudmEgPSBQUkVQRU5EX1NJRF9UT19JT1ZBKHZhLAogCQkJCQkJdWF1ZGlvX3FkZXYtPnNpZCk7CiAKIAlyZXNwLT54aGNpX21lbV9pbmZvX3ZhbGlkID0gMTsKIAorCXNnX2ZyZWVfdGFibGUoJnNndCk7CisKIAlpZiAoIWF0b21pY19yZWFkKCZ1YWRldltjYXJkX251bV0uaW5fdXNlKSkgewogCQlrcmVmX2luaXQoJnVhZGV2W2NhcmRfbnVtXS5rcmVmKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmdWFkZXZbY2FyZF9udW1dLmRpc2Nvbm5lY3Rfd3EpOwpAQCAtNjg2LDcgKzY5Niw3IEBACiAJdWFkZXZbY2FyZF9udW1dLmluZm9baW5mb19pZHhdLmRhdGFfeGZlcl9yaW5nX3NpemUgPSBQQUdFX1NJWkU7CiAJdWFkZXZbY2FyZF9udW1dLmluZm9baW5mb19pZHhdLnN5bmNfeGZlcl9yaW5nX3ZhID0gdHJfc3luY192YTsKIAl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0uc3luY194ZmVyX3Jpbmdfc2l6ZSA9IFBBR0VfU0laRTsKLQl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0ueGZlcl9idWZfdmEgPSB4ZmVyX2J1Zl92YTsKKwl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0ueGZlcl9idWZfdmEgPSB2YTsKIAl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0ueGZlcl9idWZfcGEgPSB4ZmVyX2J1Zl9wYTsKIAl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0ueGZlcl9idWZfc2l6ZSA9IGxlbjsKIAl1YWRldltjYXJkX251bV0uaW5mb1tpbmZvX2lkeF0ueGZlcl9idWYgPSB4ZmVyX2J1ZjsKQEAgLTcwMSwxNCArNzExLDEzIEBACiAJcmV0dXJuIDA7CiAKIHVubWFwX3hmZXJfYnVmOgotCXVhdWRpb19pb21tdV91bm1hcChNRU1fWEZFUl9CVUYsIHhmZXJfYnVmX3ZhLCBsZW4pOworCWlmICh2YSkKKwkJdWF1ZGlvX2lvbW11X3VubWFwKE1FTV9YRkVSX0JVRiwgdmEsIHRvdGFsX2xlbik7CiB1bm1hcF9zeW5jOgogCXVzYl9mcmVlX2NvaGVyZW50KHN1YnMtPmRldiwgbGVuLCB4ZmVyX2J1ZiwgeGZlcl9idWZfcGEpOwogCXVhdWRpb19pb21tdV91bm1hcChNRU1fWEZFUl9SSU5HLCB0cl9zeW5jX3ZhLCBQQUdFX1NJWkUpOwogdW5tYXBfZGF0YToKIAl1YXVkaW9faW9tbXVfdW5tYXAoTUVNX1hGRVJfUklORywgdHJfZGF0YV92YSwgUEFHRV9TSVpFKTsKLXVubWFwX2RjYmE6Ci0JdWF1ZGlvX2lvbW11X3VubWFwKE1FTV9EQ0JBLCBkY2JhX3ZhLCBQQUdFX1NJWkUpOwogdW5tYXBfZXI6CiAJdWF1ZGlvX2lvbW11X3VubWFwKE1FTV9FVkVOVF9SSU5HLCBJT1ZBX0JBU0UsIFBBR0VfU0laRSk7CiBlcnI6CkBAIC03NTQsMTEgKzc2Myw2IEBACiAJCQlkZXYtPmluZm9baWZfaWR4XS5pbnRmX251bSwgZGV2LT5jYXJkX251bSk7CiAJfQogCi0JLyogaW9tbXVfdW5tYXAgZGNiYSBpb3ZhIGZvciBhIHVzYiBkZXZpY2UgKi8KLQl1YXVkaW9faW9tbXVfdW5tYXAoTUVNX0RDQkEsIGRldi0+ZGNiYV9pb3ZhLCBkZXYtPmRjYmFfc2l6ZSk7Ci0KLQlkZXYtPmRjYmFfaW92YSA9IDA7Ci0JZGV2LT5kY2JhX3NpemUgPSAwOwogCWRldi0+bnVtX2ludGYgPSAwOwogCiAJLyogZnJlZSBpbnRlcmZhY2UgaW5mbyAqLwpAQCAtMTIyOCwxMSArMTIzMiw3IEBACiAJCWdvdG8gZnJlZV9kb21haW47CiAJfQogCi0JLyogaW5pdGlhbGl6ZSBkY2JhLCB4ZmVyIHJpbmcgYW5kIHhmZXIgYnVmIGlvdmEgbGlzdCAqLwotCUlOSVRfTElTVF9IRUFEKCZ1YXVkaW9fcWRldi0+ZGNiYV9saXN0KTsKLQl1YXVkaW9fcWRldi0+Y3Vycl9kY2JhX2lvdmEgPSBJT1ZBX0RDQkFfQkFTRTsKLQl1YXVkaW9fcWRldi0+ZGNiYV9pb3ZhX3NpemUgPSBTTkRSVl9DQVJEUyAqIFBBR0VfU0laRTsKLQorCS8qIGluaXRpYWxpemUgeGZlciByaW5nIGFuZCB4ZmVyIGJ1ZiBpb3ZhIGxpc3QgKi8KIAlJTklUX0xJU1RfSEVBRCgmdWF1ZGlvX3FkZXYtPnhmZXJfcmluZ19saXN0KTsKIAl1YXVkaW9fcWRldi0+Y3Vycl94ZmVyX3JpbmdfaW92YSA9IElPVkFfWEZFUl9SSU5HX0JBU0U7CiAJdWF1ZGlvX3FkZXYtPnhmZXJfcmluZ19pb3ZhX3NpemUgPQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYl9hdWRpb19xbWlfdjAxLmMgYi9zb3VuZC91c2IvdXNiX2F1ZGlvX3FtaV92MDEuYwppbmRleCBmZWY3NTA1Li5hOTM2NjVjIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiX2F1ZGlvX3FtaV92MDEuYworKysgYi9zb3VuZC91c2IvdXNiX2F1ZGlvX3FtaV92MDEuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgLyogQ29weXJpZ2h0IChjKSAyMDE3LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCkBAIC02MzMsNiArNjMzLDQ2IEBACiAJCQkJCWludGVycnVwdGVyX251bSksCiAJfSwKIAl7CisJCS5kYXRhX3R5cGUgICAgICA9IFFNSV9PUFRfRkxBRywKKwkJLmVsZW1fbGVuICAgICAgID0gMSwKKwkJLmVsZW1fc2l6ZSAgICAgID0gc2l6ZW9mKHVpbnQ4X3QpLAorCQkuaXNfYXJyYXkgICAgICAgPSBOT19BUlJBWSwKKwkJLnRsdl90eXBlICAgICAgID0gMHgxQywKKwkJLm9mZnNldCAgICAgICAgID0gb2Zmc2V0b2YoCisJCQkJCXN0cnVjdCBxbWlfdWF1ZGlvX3N0cmVhbV9yZXNwX21zZ192MDEsCisJCQkJCXNwZWVkX2luZm9fdmFsaWQpLAorCX0sCisJeworCQkuZGF0YV90eXBlICAgICAgPSBRTUlfU0lHTkVEXzRfQllURV9FTlVNLAorCQkuZWxlbV9sZW4gICAgICAgPSAxLAorCQkuZWxlbV9zaXplICAgICAgPSBzaXplb2YoZW51bSB1c2JfYXVkaW9fZGV2aWNlX3NwZWVkX2VudW1fdjAxKSwKKwkJLmlzX2FycmF5ICAgICAgID0gTk9fQVJSQVksCisJCS50bHZfdHlwZSAgICAgICA9IDB4MUMsCisJCS5vZmZzZXQgICAgICAgICA9IG9mZnNldG9mKAorCQkJCQlzdHJ1Y3QgcW1pX3VhdWRpb19zdHJlYW1fcmVzcF9tc2dfdjAxLAorCQkJCQlzcGVlZF9pbmZvKSwKKwl9LAorCXsKKwkJLmRhdGFfdHlwZSAgICAgID0gUU1JX09QVF9GTEFHLAorCQkuZWxlbV9sZW4gICAgICAgPSAxLAorCQkuZWxlbV9zaXplICAgICAgPSBzaXplb2YodWludDhfdCksCisJCS5pc19hcnJheSAgICAgICA9IE5PX0FSUkFZLAorCQkudGx2X3R5cGUgICAgICAgPSAweDFELAorCQkub2Zmc2V0ICAgICAgICAgPSBvZmZzZXRvZigKKwkJCQkJc3RydWN0IHFtaV91YXVkaW9fc3RyZWFtX3Jlc3BfbXNnX3YwMSwKKwkJCQkJY29udHJvbGxlcl9udW1fdmFsaWQpLAorCX0sCisJeworCQkuZGF0YV90eXBlICAgICAgPSBRTUlfVU5TSUdORURfMV9CWVRFLAorCQkuZWxlbV9sZW4gICAgICAgPSAxLAorCQkuZWxlbV9zaXplICAgICAgPSBzaXplb2YodWludDhfdCksCisJCS5pc19hcnJheSAgICAgICA9IE5PX0FSUkFZLAorCQkudGx2X3R5cGUgICAgICAgPSAweDFELAorCQkub2Zmc2V0ICAgICAgICAgPSBvZmZzZXRvZigKKwkJCQkJc3RydWN0IHFtaV91YXVkaW9fc3RyZWFtX3Jlc3BfbXNnX3YwMSwKKwkJCQkJY29udHJvbGxlcl9udW0pLAorCX0sCisJewogCQkuZGF0YV90eXBlICAgICAgPSBRTUlfRU9USSwKIAkJLmlzX2FycmF5ICAgICAgID0gTk9fQVJSQVksCiAJCS5pc19hcnJheSAgICAgICA9IFFNSV9DT01NT05fVExWX1RZUEUsCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNiX2F1ZGlvX3FtaV92MDEuaCBiL3NvdW5kL3VzYi91c2JfYXVkaW9fcW1pX3YwMS5oCmluZGV4IDgzYTk2NmMuLjk5MDA3NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JfYXVkaW9fcW1pX3YwMS5oCisrKyBiL3NvdW5kL3VzYi91c2JfYXVkaW9fcW1pX3YwMS5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAvKiBDb3B5cmlnaHQgKGMpIDIwMTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTc3LDYgKzc3LDE2IEBACiAJVVNCX0FVRElPX0RFVklDRV9JTkRJQ0FUSU9OX0VOVU1fTUFYX1ZBTF9WMDEgPSBJTlRfTUFYLAogfTsKIAorZW51bSB1c2JfYXVkaW9fZGV2aWNlX3NwZWVkX2VudW1fdjAxIHsKKwlVU0JfQVVESU9fREVWSUNFX1NQRUVEX0VOVU1fTUlOX1ZBTF9WMDEgPSBJTlRfTUlOLAorCVVTQl9BVURJT19ERVZJQ0VfU1BFRURfSU5WQUxJRF9WMDEgPSAwLAorCVVTQl9BVURJT19ERVZJQ0VfU1BFRURfTE9XX1YwMSA9IDEsCisJVVNCX0FVRElPX0RFVklDRV9TUEVFRF9GVUxMX1YwMSA9IDIsCisJVVNCX0FVRElPX0RFVklDRV9TUEVFRF9ISUdIX1YwMSA9IDMsCisJVVNCX0FVRElPX0RFVklDRV9TUEVFRF9TVVBFUl9WMDEgPSA0LAorCVVTQl9BVURJT19ERVZJQ0VfU1BFRURfRU5VTV9NQVhfVkFMX1YwMSA9IElOVF9NQVgsCit9OworCiBzdHJ1Y3QgcW1pX3VhdWRpb19zdHJlYW1fcmVxX21zZ192MDEgewogCXVpbnQ4X3QgZW5hYmxlOwogCXVpbnQzMl90IHVzYl90b2tlbjsKQEAgLTExOCw4ICsxMjgsMTIgQEAKIAlzdHJ1Y3QgYXBwc19tZW1faW5mb192MDEgeGhjaV9tZW1faW5mbzsKIAl1aW50OF90IGludGVycnVwdGVyX251bV92YWxpZDsKIAl1aW50OF90IGludGVycnVwdGVyX251bTsKKwl1aW50OF90IHNwZWVkX2luZm9fdmFsaWQ7CisJZW51bSB1c2JfYXVkaW9fZGV2aWNlX3NwZWVkX2VudW1fdjAxIHNwZWVkX2luZm87CisJdWludDhfdCBjb250cm9sbGVyX251bV92YWxpZDsKKwl1aW50OF90IGNvbnRyb2xsZXJfbnVtOwogfTsKLSNkZWZpbmUgUU1JX1VBVURJT19TVFJFQU1fUkVTUF9NU0dfVjAxX01BWF9NU0dfTEVOIDE5MQorI2RlZmluZSBRTUlfVUFVRElPX1NUUkVBTV9SRVNQX01TR19WMDFfTUFYX01TR19MRU4gMjAyCiBleHRlcm4gc3RydWN0IGVsZW1faW5mbyBxbWlfdWF1ZGlvX3N0cmVhbV9yZXNwX21zZ192MDFfZWlbXTsKIAogc3RydWN0IHFtaV91YXVkaW9fc3RyZWFtX2luZF9tc2dfdjAxIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3BsdWdpbl9zY2hlZF9zd2l0Y2guYyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3BsdWdpbl9zY2hlZF9zd2l0Y2guYwppbmRleCBmMWNlNjAwLi5lYzMwYzJmIDEwMDY0NAotLS0gYS90b29scy9saWIvdHJhY2VldmVudC9wbHVnaW5fc2NoZWRfc3dpdGNoLmMKKysrIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQvcGx1Z2luX3NjaGVkX3N3aXRjaC5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAl0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGxkICIsIHZhbCk7CiAKIAlpZiAocGV2ZW50X2dldF9maWVsZF92YWwocywgZXZlbnQsICJwcmV2X3ByaW8iLCByZWNvcmQsICZ2YWwsIDApID09IDApCi0JCXRyYWNlX3NlcV9wcmludGYocywgIlslbGxkXSAiLCB2YWwpOworCQl0cmFjZV9zZXFfcHJpbnRmKHMsICJbJWRdICIsIChpbnQpIHZhbCk7CiAKIAlpZiAocGV2ZW50X2dldF9maWVsZF92YWwocywgIGV2ZW50LCAicHJldl9zdGF0ZSIsIHJlY29yZCwgJnZhbCwgMCkgPT0gMCkKIAkJd3JpdGVfc3RhdGUocywgdmFsKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogCXRyYWNlX3NlcV9wcmludGYocywgIiVsbGQiLCB2YWwpOwogCiAJaWYgKHBldmVudF9nZXRfZmllbGRfdmFsKHMsIGV2ZW50LCAibmV4dF9wcmlvIiwgcmVjb3JkLCAmdmFsLCAwKSA9PSAwKQotCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIgWyVsbGRdIiwgdmFsKTsKKwkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiIFslZF0iLCAoaW50KSB2YWwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYgYi90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKaW5kZXggOTgyZDY0My4uZWY1MmQxZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgpAQCAtNzI5LDkgKzcyOSw5IEBACiAJCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICckKERFU1RESVJfU1EpJChwZXJmZXhlY19pbnN0ZGlyX1NRKS90ZXN0cy9hdHRyJzsgXAogCQkkKElOU1RBTEwpIHRlc3RzL2F0dHIvKiAnJChERVNURElSX1NRKSQocGVyZmV4ZWNfaW5zdGRpcl9TUSkvdGVzdHMvYXR0cicKIAotaW5zdGFsbC1iaW46IGluc3RhbGwtdG9vbHMgaW5zdGFsbC10ZXN0cworaW5zdGFsbC1iaW46IGluc3RhbGwtdG9vbHMgaW5zdGFsbC10ZXN0cyBpbnN0YWxsLXRyYWNlZXZlbnQtcGx1Z2lucwogCi1pbnN0YWxsOiBpbnN0YWxsLWJpbiB0cnktaW5zdGFsbC1tYW4gaW5zdGFsbC10cmFjZWV2ZW50LXBsdWdpbnMKK2luc3RhbGw6IGluc3RhbGwtYmluIHRyeS1pbnN0YWxsLW1hbgogCiBpbnN0YWxsLXB5dGhvbl9leHQ6CiAJJChQWVRIT05fV09SRCkgdXRpbC9zZXR1cC5weSAtLXF1aWV0IGluc3RhbGwgLS1yb290PScvJChERVNURElSX1NRKScKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKaW5kZXggN2VhMTNmNC4uNmE2ZjQ0ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiAJLyogQSBmaWxlIHBhdGggLS0gdGhpcyBpcyBhbiBvZmZsaW5lIG1vZHVsZSAqLwogCWlmIChtb2R1bGUgJiYgc3RyY2hyKG1vZHVsZSwgJy8nKSkKLQkJcmV0dXJuIG1hY2hpbmVfX2ZpbmRuZXdfbW9kdWxlX21hcChob3N0X21hY2hpbmUsIDAsIG1vZHVsZSk7CisJCXJldHVybiBkc29fX25ld19tYXAobW9kdWxlKTsKIAogCWlmICghbW9kdWxlKQogCQltb2R1bGUgPSAia2VybmVsIjsKQEAgLTE3Myw2ICsxNzMsNyBAQAogCQlpZiAoc3RybmNtcChwb3MtPmRzby0+c2hvcnRfbmFtZSArIDEsIG1vZHVsZSwKIAkJCSAgICBwb3MtPmRzby0+c2hvcnRfbmFtZV9sZW4gLSAyKSA9PSAwICYmCiAJCSAgICBtb2R1bGVbcG9zLT5kc28tPnNob3J0X25hbWVfbGVuIC0gMl0gPT0gJ1wwJykgeworCQkJbWFwX19nZXQocG9zKTsKIAkJCXJldHVybiBwb3M7CiAJCX0KIAl9CkBAIC0xODgsMTUgKzE4OSw2IEBACiAJCXJldHVybiBrZXJuZWxfZ2V0X21vZHVsZV9tYXAodGFyZ2V0KTsKIH0KIAotc3RhdGljIHZvaWQgcHV0X3RhcmdldF9tYXAoc3RydWN0IG1hcCAqbWFwLCBib29sIHVzZXIpCi17Ci0JaWYgKG1hcCAmJiB1c2VyKSB7Ci0JCS8qIE9ubHkgdGhlIHVzZXIgbWFwIG5lZWRzIHRvIGJlIHJlbGVhc2VkICovCi0JCW1hcF9fcHV0KG1hcCk7Ci0JfQotfQotCi0KIHN0YXRpYyBpbnQgY29udmVydF9leGVjX3RvX2dyb3VwKGNvbnN0IGNoYXIgKmV4ZWMsIGNoYXIgKipyZXN1bHQpCiB7CiAJY2hhciAqcHRyMSwgKnB0cjIsICpleGVjX2NvcHk7CkBAIC0yNjgsMjEgKzI2MCw2IEBACiB9CiAKIC8qCi0gKiBOT1RFOgotICogJy5nbnUubGlua29uY2UudGhpc19tb2R1bGUnIHNlY3Rpb24gb2Yga2VybmVsIG1vZHVsZSBlbGYgZGlyZWN0bHkKLSAqIG1hcHMgdG8gJ3N0cnVjdCBtb2R1bGUnIGZyb20gbGludXgvbW9kdWxlLmguIFRoaXMgc2VjdGlvbiBjb250YWlucwotICogYWN0dWFsIG1vZHVsZSBuYW1lIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBrZXJuZWwgYWZ0ZXIgbG9hZGluZyBpdC4KLSAqIEJ1dCwgd2UgY2Fubm90IHVzZSAnc3RydWN0IG1vZHVsZScgaGVyZSBzaW5jZSBsaW51eC9tb2R1bGUuaCBpcyBub3QKLSAqIGV4cG9zZWQgdG8gdXNlci1zcGFjZS4gT2Zmc2V0IG9mICduYW1lJyBoYXMgcmVtYWluZWQgc2FtZSBmcm9tIGxvbmcKLSAqIHRpbWUsIHNvIGhhcmRjb2RpbmcgaXQgaGVyZS4KLSAqLwotI2lmZGVmIF9fTFA2NF9fCi0jZGVmaW5lIE1PRF9OQU1FX09GRlNFVCAyNAotI2Vsc2UKLSNkZWZpbmUgTU9EX05BTUVfT0ZGU0VUIDEyCi0jZW5kaWYKLQotLyoKICAqIEBtb2R1bGUgY2FuIGJlIG1vZHVsZSBuYW1lIG9mIG1vZHVsZSBmaWxlIHBhdGguIEluIGNhc2Ugb2YgcGF0aCwKICAqIGluc3BlY3QgZWxmIGFuZCBmaW5kIG91dCB3aGF0IGlzIGFjdHVhbCBtb2R1bGUgbmFtZS4KICAqIENhbGxlciBoYXMgdG8gZnJlZSBtb2RfbmFtZSBhZnRlciB1c2luZyBpdC4KQEAgLTI5Niw2ICsyNzMsNyBAQAogCUVsZl9EYXRhICpkYXRhOwogCUVsZl9TY24gKnNlYzsKIAljaGFyICptb2RfbmFtZSA9IE5VTEw7CisJaW50IG5hbWVfb2Zmc2V0OwogCiAJZmQgPSBvcGVuKG1vZHVsZSwgT19SRE9OTFkpOwogCWlmIChmZCA8IDApCkBAIC0zMTcsNyArMjk1LDIxIEBACiAJaWYgKCFkYXRhIHx8ICFkYXRhLT5kX2J1ZikKIAkJZ290byByZXRfZXJyOwogCi0JbW9kX25hbWUgPSBzdHJkdXAoKGNoYXIgKilkYXRhLT5kX2J1ZiArIE1PRF9OQU1FX09GRlNFVCk7CisJLyoKKwkgKiBOT1RFOgorCSAqICcuZ251LmxpbmtvbmNlLnRoaXNfbW9kdWxlJyBzZWN0aW9uIG9mIGtlcm5lbCBtb2R1bGUgZWxmIGRpcmVjdGx5CisJICogbWFwcyB0byAnc3RydWN0IG1vZHVsZScgZnJvbSBsaW51eC9tb2R1bGUuaC4gVGhpcyBzZWN0aW9uIGNvbnRhaW5zCisJICogYWN0dWFsIG1vZHVsZSBuYW1lIHdoaWNoIHdpbGwgYmUgdXNlZCBieSBrZXJuZWwgYWZ0ZXIgbG9hZGluZyBpdC4KKwkgKiBCdXQsIHdlIGNhbm5vdCB1c2UgJ3N0cnVjdCBtb2R1bGUnIGhlcmUgc2luY2UgbGludXgvbW9kdWxlLmggaXMgbm90CisJICogZXhwb3NlZCB0byB1c2VyLXNwYWNlLiBPZmZzZXQgb2YgJ25hbWUnIGhhcyByZW1haW5lZCBzYW1lIGZyb20gbG9uZworCSAqIHRpbWUsIHNvIGhhcmRjb2RpbmcgaXQgaGVyZS4KKwkgKi8KKwlpZiAoZWhkci5lX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzMyKQorCQluYW1lX29mZnNldCA9IDEyOworCWVsc2UJLyogZXhwZWN0IEVMRkNMQVNTNjQgYnkgZGVmYXVsdCAqLworCQluYW1lX29mZnNldCA9IDI0OworCisJbW9kX25hbWUgPSBzdHJkdXAoKGNoYXIgKilkYXRhLT5kX2J1ZiArIG5hbWVfb2Zmc2V0KTsKIAogcmV0X2VycjoKIAllbGZfZW5kKGVsZik7CkBAIC00MTIsNyArNDA0LDcgQEAKIAl9CiAKIG91dDoKLQlwdXRfdGFyZ2V0X21hcChtYXAsIHVwcm9iZXMpOworCW1hcF9fcHV0KG1hcCk7CiAJcmV0dXJuIHJldDsKIAogfQpAQCAtMjk0NCw3ICsyOTM2LDcgQEAKIAl9CiAKIG91dDoKLQlwdXRfdGFyZ2V0X21hcChtYXAsIHBldi0+dXByb2Jlcyk7CisJbWFwX19wdXQobWFwKTsKIAlmcmVlKHN5bXMpOwogCXJldHVybiByZXQ7CiAKQEAgLTM0MzcsMTAgKzM0MjksNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogR2V0IGEgc3ltYm9sIG1hcCAqLwotCWlmICh1c2VyKQotCQltYXAgPSBkc29fX25ld19tYXAodGFyZ2V0KTsKLQllbHNlCi0JCW1hcCA9IGtlcm5lbF9nZXRfbW9kdWxlX21hcCh0YXJnZXQpOworCW1hcCA9IGdldF90YXJnZXRfbWFwKHRhcmdldCwgdXNlcik7CiAJaWYgKCFtYXApIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IGEgbWFwIGZvciAlc1xuIiwgKHRhcmdldCkgPyA6ICJrZXJuZWwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNDcyLDkgKzM0NjEsNyBAQAogICAgICAgICB9CiAKIGVuZDoKLQlpZiAodXNlcikgewotCQltYXBfX3B1dChtYXApOwotCX0KKwltYXBfX3B1dChtYXApOwogCWV4aXRfcHJvYmVfc3ltYm9sX21hcHMoKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYwppbmRleCA5OTQwMGIwLi5hZGJjNmMwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKQEAgLTUzNyw2ICs1MzcsMTIgQEAKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWludCBuID0gbmFtZXN6ICsgZGVzY3N6OworCisJCQlpZiAobiA+IChpbnQpc2l6ZW9mKGJmKSkgeworCQkJCW4gPSBzaXplb2YoYmYpOworCQkJCXByX2RlYnVnKCIlczogdHJ1bmNhdGluZyByZWFkaW5nIG9mIGJ1aWxkIGlkIGluIHN5c2ZzIGZpbGUgJXM6IG5fbmFtZXN6PSV1LCBuX2Rlc2Nzej0ldS5cbiIsCisJCQkJCSBfX2Z1bmNfXywgZmlsZW5hbWUsIG5oZHIubl9uYW1lc3osIG5oZHIubl9kZXNjc3opOworCQkJfQogCQkJaWYgKHJlYWQoZmQsIGJmLCBuKSAhPSBuKQogCQkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9udGIvbnRiX3Rlc3Quc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9udGIvbnRiX3Rlc3Quc2gKaW5kZXggYTY3NmQzZS4uYjNjNDhmYyAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnRiL250Yl90ZXN0LnNoCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL250Yi9udGJfdGVzdC5zaApAQCAtMzA1LDcgKzMwNSw3IEBACiAJZWNobyAiUnVubmluZyByZW1vdGUgcGVyZiB0ZXN0ICRXSVRIIERNQSIKIAl3cml0ZV9maWxlICIiICRSRU1PVEVfUEVSRi9ydW4KIAllY2hvIC1uICIgICIKLQlyZWFkX2ZpbGUgJExPQ0FMX1BFUkYvcnVuCisJcmVhZF9maWxlICRSRU1PVEVfUEVSRi9ydW4KIAllY2hvICIgIFBhc3NlZCIKIAogCV9tb2Rwcm9iZSAtciBudGJfcGVyZgpAQCAtMzI2LDYgKzMyNiwxMCBAQAogCWxpbmtfdGVzdCAkTE9DQUxfVE9PTCAkUkVNT1RFX1RPT0wKIAlsaW5rX3Rlc3QgJFJFTU9URV9UT09MICRMT0NBTF9UT09MCiAKKwkjRW5zdXJlIHRoZSBsaW5rIGlzIHVwIG9uIGJvdGggc2lkZXMgYmVmb3JlIGNvbnRpbnVpbmcKKwl3cml0ZV9maWxlIFkgJExPQ0FMX1RPT0wvbGlua19ldmVudAorCXdyaXRlX2ZpbGUgWSAkUkVNT1RFX1RPT0wvbGlua19ldmVudAorCiAJZm9yIFBFRVJfVFJBTlMgaW4gJChscyAkTE9DQUxfVE9PTC9wZWVyX3RyYW5zKik7IGRvCiAJCVBUPSQoYmFzZW5hbWUgJFBFRVJfVFJBTlMpCiAJCXdyaXRlX2ZpbGUgJE1XX1NJWkUgJExPQ0FMX1RPT0wvJFBUCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvZnNnc2Jhc2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9mc2dzYmFzZS5jCmluZGV4IDViMmI0YjMuLjliNDYxMGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9mc2dzYmFzZS5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9mc2dzYmFzZS5jCkBAIC0yODUsOSArMjg1LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzZXRfZ3NfYW5kX3N3aXRjaF90byh1bnNpZ25lZCBsb25nIGxvY2FsLCB1bnNpZ25lZCBsb25nIHJlbW90ZSkKK3N0YXRpYyB2b2lkIHNldF9nc19hbmRfc3dpdGNoX3RvKHVuc2lnbmVkIGxvbmcgbG9jYWwsCisJCQkJIHVuc2lnbmVkIHNob3J0IGZvcmNlX3NlbCwKKwkJCQkgdW5zaWduZWQgbG9uZyByZW1vdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBiYXNlOworCXVuc2lnbmVkIHNob3J0IHNlbF9wcmVfc2NoZWQsIHNlbF9wb3N0X3NjaGVkOwogCiAJYm9vbCBoYXJkX3plcm8gPSBmYWxzZTsKIAlpZiAobG9jYWwgPT0gSEFSRF9aRVJPKSB7CkBAIC0yOTcsNiArMzAwLDggQEAKIAogCXByaW50ZigiW1JVTl1cdEFSQ0hfU0VUX0dTKDB4JWx4KSVzLCB0aGVuIHNjaGVkdWxlIHRvIDB4JWx4XG4iLAogCSAgICAgICBsb2NhbCwgaGFyZF96ZXJvID8gIiBhbmQgY2xlYXIgZ3MiIDogIiIsIHJlbW90ZSk7CisJaWYgKGZvcmNlX3NlbCkKKwkJcHJpbnRmKCJcdEJlZm9yZSBzY2hlZHVsZSwgc2V0IHNlbGVjdG9yIHRvIDB4JWh4XG4iLCBmb3JjZV9zZWwpOwogCWlmIChzeXNjYWxsKFNZU19hcmNoX3ByY3RsLCBBUkNIX1NFVF9HUywgbG9jYWwpICE9IDApCiAJCWVycigxLCAiQVJDSF9TRVRfR1MiKTsKIAlpZiAoaGFyZF96ZXJvKQpAQCAtMzA3LDE4ICszMTIsMzUgQEAKIAkJcHJpbnRmKCJbRkFJTF1cdEdTQkFTRSB3YXNuJ3Qgc2V0IGFzIGV4cGVjdGVkXG4iKTsKIAl9CiAKKwlpZiAoZm9yY2Vfc2VsKSB7CisJCWFzbSB2b2xhdGlsZSAoIm1vdiAlMCwgJSVncyIgOiA6ICJybSIgKGZvcmNlX3NlbCkpOworCQlzZWxfcHJlX3NjaGVkID0gZm9yY2Vfc2VsOworCQlsb2NhbCA9IHJlYWRfYmFzZShHUyk7CisKKwkJLyoKKwkJICogU2lnbmFsIGRlbGl2ZXJ5IHNlZW1zIHRvIG1lc3MgdXAgd2VpcmQgc2VsZWN0b3JzLiAgUHV0IGl0CisJCSAqIGJhY2suCisJCSAqLworCQlhc20gdm9sYXRpbGUgKCJtb3YgJTAsICUlZ3MiIDogOiAicm0iIChmb3JjZV9zZWwpKTsKKwl9IGVsc2UgeworCQlhc20gdm9sYXRpbGUgKCJtb3YgJSVncywgJTAiIDogIj1ybSIgKHNlbF9wcmVfc2NoZWQpKTsKKwl9CisKIAlyZW1vdGVfYmFzZSA9IHJlbW90ZTsKIAlmdHggPSAxOwogCXN5c2NhbGwoU1lTX2Z1dGV4LCAmZnR4LCBGVVRFWF9XQUtFLCAwLCBOVUxMLCBOVUxMLCAwKTsKIAl3aGlsZSAoZnR4ICE9IDApCiAJCXN5c2NhbGwoU1lTX2Z1dGV4LCAmZnR4LCBGVVRFWF9XQUlULCAxLCBOVUxMLCBOVUxMLCAwKTsKIAorCWFzbSB2b2xhdGlsZSAoIm1vdiAlJWdzLCAlMCIgOiAiPXJtIiAoc2VsX3Bvc3Rfc2NoZWQpKTsKIAliYXNlID0gcmVhZF9iYXNlKEdTKTsKLQlpZiAoYmFzZSA9PSBsb2NhbCkgewotCQlwcmludGYoIltPS11cdEdTQkFTRSByZW1haW5lZCAweCVseFxuIiwgbG9jYWwpOworCWlmIChiYXNlID09IGxvY2FsICYmIHNlbF9wcmVfc2NoZWQgPT0gc2VsX3Bvc3Rfc2NoZWQpIHsKKwkJcHJpbnRmKCJbT0tdXHRHUy9CQVNFIHJlbWFpbmVkIDB4JWh4LzB4JWx4XG4iLAorCQkgICAgICAgc2VsX3ByZV9zY2hlZCwgbG9jYWwpOwogCX0gZWxzZSB7CiAJCW5lcnJzKys7Ci0JCXByaW50ZigiW0ZBSUxdXHRHU0JBU0UgY2hhbmdlZCB0byAweCVseFxuIiwgYmFzZSk7CisJCXByaW50ZigiW0ZBSUxdXHRHUy9CQVNFIGNoYW5nZWQgZnJvbSAweCVoeC8weCVseCB0byAweCVoeC8weCVseFxuIiwKKwkJICAgICAgIHNlbF9wcmVfc2NoZWQsIGxvY2FsLCBzZWxfcG9zdF9zY2hlZCwgYmFzZSk7CiAJfQogfQogCkBAIC0zODEsOCArNDAzLDE1IEBACiAKIAlmb3IgKGludCBsb2NhbCA9IDA7IGxvY2FsIDwgNDsgbG9jYWwrKykgewogCQlmb3IgKGludCByZW1vdGUgPSAwOyByZW1vdGUgPCA0OyByZW1vdGUrKykgewotCQkJc2V0X2dzX2FuZF9zd2l0Y2hfdG8oYmFzZXNfd2l0aF9oYXJkX3plcm9bbG9jYWxdLAotCQkJCQkgICAgIGJhc2VzX3dpdGhfaGFyZF96ZXJvW3JlbW90ZV0pOworCQkJZm9yICh1bnNpZ25lZCBzaG9ydCBzID0gMDsgcyA8IDU7IHMrKykgeworCQkJCXVuc2lnbmVkIHNob3J0IHNlbCA9IHM7CisJCQkJaWYgKHMgPT0gNCkKKwkJCQkJYXNtICgibW92ICUlc3MsICUwIiA6ICI9cm0iIChzZWwpKTsKKwkJCQlzZXRfZ3NfYW5kX3N3aXRjaF90bygKKwkJCQkJYmFzZXNfd2l0aF9oYXJkX3plcm9bbG9jYWxdLAorCQkJCQlzZWwsCisJCQkJCWJhc2VzX3dpdGhfaGFyZF96ZXJvW3JlbW90ZV0pOworCQkJfQogCQl9CiAJfQogCg==